diff --git a/COPYRIGHT b/COPYRIGHT index d13e662330d2..24e9a70fe728 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -4,7 +4,7 @@ The compilation of software known as FreeBSD is distributed under the following terms: -Copyright (c) 1992-2009 The FreeBSD Project. All rights reserved. +Copyright (c) 1992-2010 The FreeBSD Project. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/MAINTAINERS b/MAINTAINERS index e84a3b4ff46e..316d226856ae 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -48,7 +48,6 @@ iostat(8) ken Pre-commit review requested. cd(4) ken Pre-commit review requested. pass(4) ken Pre-commit review requested. ch(4) ken Pre-commit review requested. -isp(4) mjacob Pre-commit review requested. em(4) jfv Pre-commit review requested. tdfx(4) cokane Just keep me informed of changes, try not to break it. sendmail gshapiro Pre-commit review requested. @@ -124,6 +123,14 @@ usr.bin/bluetooth emax Pre-commit review preferred. usr.sbin/bluetooth emax Pre-commit review preferred. gnu/usr.bin/send-pr bugmaster Pre-commit review requested. ncurses rafan Heads-up appreciated, try not to break it. +*env(3) secteam Due to the problematic security history of this + code, please have patches reviewed by secteam. +share/zoneinfo edwin Heads-up appreciated, since our data is coming + from a third party source. +usr.sbin/zic edwin Heads-up appreciated, since this code is + maintained by a third party source. +lib/libc/stdtime edwin Heads-up appreciated, since parts of this code + is maintained by a third party source. Following are the entries from the Makefiles, and a few other sources. Please remove stale entries from both their origin, and this file. diff --git a/Makefile b/Makefile index ebaeb6d49c68..bd267162386a 100644 --- a/Makefile +++ b/Makefile @@ -278,7 +278,7 @@ tinderbox: # with a reasonable chance of success, regardless of how old your # existing system is. # -.if make(universe) || make(tinderbox) +.if make(universe) || make(universe_kernels) || make(tinderbox) TARGETS?=amd64 arm i386 ia64 mips pc98 powerpc sparc64 sun4v .if defined(DOING_TINDERBOX) @@ -297,10 +297,6 @@ universe_prologue: rm -f ${FAILFILE} .endif .for target in ${TARGETS} -KERNCONFS!= cd ${.CURDIR}/sys/${target}/conf && \ - find [A-Z0-9]*[A-Z0-9] -type f -maxdepth 0 \ - ! -name DEFAULTS ! -name LINT -KERNCONFS:= ${KERNCONFS:S/^NOTES$/LINT/} universe: universe_${target} .ORDER: universe_prologue universe_${target} universe_epilogue universe_${target}: @@ -320,16 +316,26 @@ universe_${target}: (echo "${target} 'make LINT' failed," \ "check _.${target}.makeLINT for details"| ${MAKEFAIL})) .endif + @cd ${.CURDIR} && ${MAKE} ${.MAKEFLAGS} TARGET=${target} \ + universe_kernels + @echo ">> ${target} completed on `LC_ALL=C date`" +.endfor +universe_kernels: universe_kernconfs +.if !defined(TARGET) +TARGET!= uname -m +.endif +KERNCONFS!= cd ${.CURDIR}/sys/${TARGET}/conf && \ + find [A-Z0-9]*[A-Z0-9] -type f -maxdepth 0 \ + ! -name DEFAULTS ! -name NOTES +universe_kernconfs: .for kernel in ${KERNCONFS} @(cd ${.CURDIR} && env __MAKE_CONF=/dev/null \ ${MAKE} ${JFLAG} buildkernel \ - TARGET=${target} \ + TARGET=${TARGET} \ KERNCONF=${kernel} \ - > _.${target}.${kernel} 2>&1 || \ - (echo "${target} ${kernel} kernel failed," \ - "check _.${target}.${kernel} for details"| ${MAKEFAIL})) -.endfor - @echo ">> ${target} completed on `LC_ALL=C date`" + > _.${TARGET}.${kernel} 2>&1 || \ + (echo "${TARGET} ${kernel} kernel failed," \ + "check _.${TARGET}.${kernel} for details"| ${MAKEFAIL})) .endfor universe: universe_epilogue universe_epilogue: diff --git a/Makefile.inc1 b/Makefile.inc1 index 49537bb3818e..fe163ab45250 100644 --- a/Makefile.inc1 +++ b/Makefile.inc1 @@ -5,10 +5,11 @@ # -DNO_CLEANDIR run ${MAKE} clean, instead of ${MAKE} cleandir # -DNO_CLEAN do not clean at all # -DNO_SHARE do not go into share subdir -# -DKERNFAST define NO_KERNELCONFIG, NO_KERNELCLEAN and NO_KERNELDEPEND +# -DKERNFAST define NO_KERNEL{CONFIG,CLEAN,DEPEND,OBJ} # -DNO_KERNELCONFIG do not run config in ${MAKE} buildkernel # -DNO_KERNELCLEAN do not run ${MAKE} clean in ${MAKE} buildkernel # -DNO_KERNELDEPEND do not run ${MAKE} depend in ${MAKE} buildkernel +# -DNO_KERNELOBJ do not run ${MAKE} obj in ${MAKE} buildkernel # -DNO_PORTSUPDATE do not update ports in ${MAKE} update # -DNO_DOCUPDATE do not update doc in ${MAKE} update # -DNO_CTF do not run the DTrace CTF conversion tools on built objects @@ -272,7 +273,7 @@ LIB32CPUFLAGS= -march=i686 -mmmx -msse -msse2 LIB32CPUFLAGS= -march=${TARGET_CPUTYPE} .endif LIB32FLAGS= -m32 ${LIB32CPUFLAGS} -mfancy-math-387 -DCOMPAT_32BIT \ - -iprefix ${LIB32TMP}/usr/ \ + -isystem ${LIB32TMP}/usr/include/ \ -L${LIB32TMP}/usr/lib32 \ -B${LIB32TMP}/usr/lib32 @@ -599,11 +600,14 @@ installcheck_UGID: .if ${MK_INFO} != "no" _install-info= install-info .endif +.if ${MK_ZONEINFO} != "no" +_zoneinfo= zic tzsetup +.endif ITOOLS= [ awk cap_mkdb cat chflags chmod chown \ date echo egrep find grep ${_install-info} \ ln lockf make mkdir mtree mv pwd_mkdb rm sed sh sysctl \ - test true uname wc zic + test true uname wc ${_zoneinfo} # # distributeworld @@ -691,6 +695,7 @@ distrib-dirs distribution: NO_KERNELCLEAN= t NO_KERNELCONFIG= t NO_KERNELDEPEND= t +NO_KERNELOBJ= t # Shortcut for KERNCONF=Blah -DKERNFAST is now KERNFAST=Blah .if !defined(KERNCONF) && ${KERNFAST} != "1" KERNCONF=${KERNFAST} @@ -760,11 +765,13 @@ buildkernel: @echo "--------------------------------------------------------------" cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} ${CLEANDIR} .endif +.if !defined(NO_KERNELOBJ) @echo @echo "--------------------------------------------------------------" @echo ">>> stage 2.2: rebuilding the object tree" @echo "--------------------------------------------------------------" cd ${KRNLOBJDIR}/${_kernel}; ${KMAKE} obj +.endif @echo @echo "--------------------------------------------------------------" @echo ">>> stage 2.3: build tools" @@ -929,6 +936,15 @@ _ar= usr.bin/ar _mklocale= usr.bin/mklocale .endif +.if ${BOOTSTRAPPING} < 900002 +_sed= usr.bin/sed +.endif + +.if ${BOOTSTRAPPING} < 900006 +_lex= usr.bin/lex +_yacc= usr.bin/yacc +.endif + .if ${BOOTSTRAPPING} < 700018 _gensnmptree= usr.sbin/bsnmpd/gensnmptree .endif @@ -954,6 +970,9 @@ bootstrap-tools: usr.bin/makewhatis \ ${_mklocale} \ usr.bin/rpcgen \ + ${_sed} \ + ${_lex} \ + ${_yacc} \ usr.bin/xinstall \ ${_gensnmptree} \ usr.sbin/config \ @@ -1033,7 +1052,6 @@ cross-tools: .for _tool in \ gnu/usr.bin/binutils \ gnu/usr.bin/cc \ - usr.bin/sed \ usr.bin/xlint/lint1 usr.bin/xlint/lint2 usr.bin/xlint/xlint \ ${_btxld} \ ${_crunchide} \ @@ -1087,19 +1105,19 @@ _startup_libs+= lib/libc gnu/lib/libgcc__L: lib/libc__L -_prebuild_libs= ${_kerberos5_lib_libasn1} ${_kerberos5_lib_libkrb5} \ - ${_kerberos5_lib_libhx509} ${_kerberos5_lib_libroken} \ - ${_kerberos5_lib_libheimntlm} ${_kerberos5_lib_libgssapi_krb5} \ - lib/libbz2 lib/libcom_err lib/libcrypt lib/libelf \ +_prebuild_libs= ${_kerberos5_lib_libasn1} ${_kerberos5_lib_libheimntlm} \ + ${_kerberos5_lib_libhx509} ${_kerberos5_lib_libkrb5} \ + ${_kerberos5_lib_libroken} \ + lib/libbz2 lib/libcom_err lib/libcrypt \ lib/libexpat \ - ${_lib_cddl} ${_lib_libgssapi} ${_lib_libipx} \ + ${_lib_libgssapi} ${_lib_libipx} \ lib/libkiconv lib/libkvm lib/libmd \ lib/ncurses/ncurses lib/ncurses/ncursesw \ lib/libopie lib/libpam ${_lib_libthr} \ - lib/libradius lib/libsbuf lib/libtacplus lib/libutil \ - ${_lib_libypclnt} lib/libz lib/msun \ + lib/libradius lib/libsbuf lib/libtacplus \ + lib/libutil ${_lib_libypclnt} lib/libz lib/msun \ ${_secure_lib_libcrypto} ${_secure_lib_libssh} \ - ${_secure_lib_libssl} lib/libdwarf lib/libproc + ${_secure_lib_libssl} .if ${MK_LIBTHR} != "no" _lib_libthr= lib/libthr @@ -1121,18 +1139,20 @@ lib/libradius__L secure/lib/libssl__L: secure/lib/libcrypto__L .if ${MK_OPENSSH} != "no" _secure_lib_libssh= secure/lib/libssh secure/lib/libssh__L: lib/libz__L secure/lib/libcrypto__L lib/libcrypt__L -.if ${MK_KERBEROS} != "no" -kerberos5/lib/libgssapi_krb5__L: kerberos5/lib/libkrb5__L \ +.if ${MK_KERBEROS_SUPPORT} != "no" +secure/lib/libssh__L: lib/libgssapi__L kerberos5/lib/libkrb5__L \ kerberos5/lib/libhx509__L kerberos5/lib/libasn1__L lib/libcom_err__L \ - lib/libmd__L kerberos5/lib/libroken__L secure/lib/libcrypto__L \ - lib/libcrypt__L -secure/lib/libssh__L: lib/libgssapi__L kerberos5/lib/libgssapi_krb5__L + lib/libmd__L kerberos5/lib/libroken__L .endif .endif .endif _secure_lib= secure/lib .endif +.if ${MK_GSSAPI} != "no" +_lib_libgssapi= lib/libgssapi +.endif + .if ${MK_IPX} != "no" _lib_libipx= lib/libipx .endif @@ -1144,8 +1164,6 @@ _kerberos5_lib_libkrb5= kerberos5/lib/libkrb5 _kerberos5_lib_libhx509= kerberos5/lib/libhx509 _kerberos5_lib_libroken= kerberos5/lib/libroken _kerberos5_lib_libheimntlm= kerberos5/lib/libheimntlm -_kerberos5_lib_libgssapi_krb5= kerberos5/lib/libgssapi_krb5 -_lib_libgssapi= lib/libgssapi .endif .if ${MK_NIS} != "no" @@ -1248,7 +1266,7 @@ delete-old-files: fi; \ done # Remove catpages without corresponding manpages. - @3<&0; \ + @exec 3<&0; \ find ${DESTDIR}/usr/share/man/cat* ! -type d | \ sed -ep -e's:${DESTDIR}/usr/share/man/cat:${DESTDIR}/usr/share/man/man:' | \ while read catpage; do \ diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 5cfd75e1fcea..ff811b7bf6da 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -14,6 +14,89 @@ # The file is partitioned: OLD_FILES first, then OLD_LIBS and OLD_DIRS last. # +# 20100227: [ia64] removed and +.if ${TARGET_ARCH} == "ia64" +OLD_FILES+=usr/include/machine/sapicreg.h +OLD_FILES+=usr/include/machine/sapicvar.h +.endif +# 20100208: man pages moved +.if ${TARGET_ARCH} == "i386" +OLD_FILES+=usr/share/man/man4/i386/alpm.4.gz +OLD_FILES+=usr/share/man/man4/i386/amdpm.4.gz +OLD_FILES+=usr/share/man/man4/i386/mcd.4.gz +OLD_FILES+=usr/share/man/man4/i386/padlock.4.gz +OLD_FILES+=usr/share/man/man4/i386/pcf.4.gz +OLD_FILES+=usr/share/man/man4/i386/scd.4.gz +OLD_FILES+=usr/share/man/man4/i386/viapm.4.gz +.endif +# 20100122: move BSDL bc/dc USD documents to /usr/share/doc/usd +OLD_FILES+=usr/share/doc/papers/bc.ascii.gz +OLD_FILES+=usr/share/doc/papers/dc.ascii.gz +# 20100120: replacing GNU bc/dc with BSDL versions +OLD_FILES+=usr/share/examples/bc/ckbook.b +OLD_FILES+=usr/share/examples/bc/pi.b +OLD_FILES+=usr/share/examples/bc/primes.b +OLD_FILES+=usr/share/examples/bc/twins.b +OLD_FILES+=usr/share/info/dc.info.gz +OLD_DIRS+=usr/share/examples/bc +# 20100114: removal of ttyslot(3) +OLD_FILES+=usr/share/man/man3/ttyslot.3.gz +# 20100113: remove utmp.h, replace it by utmpx.h +OLD_FILES+=usr/share/man/man3/login.3.gz +OLD_FILES+=usr/share/man/man3/logout.3.gz +OLD_FILES+=usr/share/man/man3/logwtmp.3.gz +OLD_FILES+=usr/share/man/man3/ulog_endutxent.3.gz +OLD_FILES+=usr/share/man/man3/ulog_getutxent.3.gz +OLD_FILES+=usr/share/man/man3/ulog_getutxline.3.gz +OLD_FILES+=usr/share/man/man3/ulog_getutxuser.3.gz +OLD_FILES+=usr/share/man/man3/ulog_pututxline.3.gz +OLD_FILES+=usr/share/man/man3/ulog_setutxent.3.gz +OLD_FILES+=usr/share/man/man3/ulog_setutxfile.3.gz +OLD_FILES+=usr/share/man/man5/lastlog.5.gz +OLD_FILES+=usr/share/man/man5/utmp.5.gz +OLD_FILES+=usr/share/man/man5/wtmp.5.gz +OLD_LIBS+=lib/libutil.so.8 +# 20100105: new userland semaphore implementation +OLD_FILES+=usr/include/sys/semaphore.h +# 20100103: ntptrace(8) removed +OLD_FILES+=usr/sbin/ntptrace +OLD_FILES+=usr/share/man/man8/ntptrace.8.gz +# 20091229: remove no longer relevant examples +OLD_FILES+=usr/share/examples/pppd/auth-down.sample +OLD_FILES+=usr/share/examples/pppd/auth-up.sample +OLD_FILES+=usr/share/examples/pppd/chap-secrets.sample +OLD_FILES+=usr/share/examples/pppd/chat.sh.sample +OLD_FILES+=usr/share/examples/pppd/ip-down.sample +OLD_FILES+=usr/share/examples/pppd/ip-up.sample +OLD_FILES+=usr/share/examples/pppd/options.sample +OLD_FILES+=usr/share/examples/pppd/pap-secrets.sample +OLD_FILES+=usr/share/examples/pppd/ppp.deny.sample +OLD_FILES+=usr/share/examples/pppd/ppp.shells.sample +OLD_DIRS+=usr/share/examples/pppd +OLD_FILES+=usr/share/examples/slattach/unit-command.sh +OLD_DIRS+=usr/share/examples/slattach +OLD_FILES+=usr/share/examples/sliplogin/slip.hosts +OLD_FILES+=usr/share/examples/sliplogin/slip.login +OLD_FILES+=usr/share/examples/sliplogin/slip.logout +OLD_FILES+=usr/share/examples/sliplogin/slip.slparms +OLD_DIRS+=usr/share/examples/sliplogin +OLD_FILES+=usr/share/examples/startslip/sldown.sh +OLD_FILES+=usr/share/examples/startslip/slip.sh +OLD_FILES+=usr/share/examples/startslip/slup.sh +OLD_DIRS+=usr/share/examples/startslip +# 20091202: unify rc.firewall and rc.firewall6. +OLD_FILES+=etc/rc.d/ip6fw +OLD_FILES+=etc/rc.firewall6 +OLD_FILES+=usr/share/examples/etc/rc.firewall6 +# 20091117: removal of rc.early(8) link +OLD_FILES+=usr/share/man/man8/rc.early.8.gz +# 20091117: usr/share/zoneinfo/GMT link removed +OLD_FILES+=usr/share/zoneinfo/GMT +# 20091027: pselect.3 implemented as syscall +OLD_FILES+=usr/share/man/man3/pselect.3.gz +# 20091005: fusword.9 and susword.9 removed +OLD_FILES+=usr/share/man/man9/fusword.9.gz +OLD_FILES+=usr/share/man/man9/susword.9.gz # 20090909: vesa and dpms promoted to be i386/amd64 common OLD_FILES+=usr/include/machine/pc/vesa.h OLD_FILES+=usr/share/man/man4/i386/dpms.4.gz @@ -26,6 +109,49 @@ OLD_FILES+=usr/share/man/man8/lukemftpd.8.gz OLD_FILES+=etc/mtree/BSD.local.dist OLD_FILES+=etc/mtree/BSD.x11.dist OLD_FILES+=etc/mtree/BSD.x11-4.dist +# 20090812: net80211 documentation overhaul +OLD_FILES+=usr/share/man/man9/ieee80211_add_rates.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_add_xrates.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_alloc_node.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_attach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_begin_scan.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_cfgget.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_cfgset.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_chan2ieee.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_chan2mode.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_create_ibss.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_crypto_attach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_crypto_detach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_decap.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_dump_pkt.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_dup_bss.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_encap.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_end_scan.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_find_node.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_fix_rate.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_free_allnodes.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_ieee2mhz.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_ioctl.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_lookup_node.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_media2rate.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_media_change.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_media_init.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_media_status.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_mhz2ieee.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_next_scan.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_node_attach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_node_detach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_node_lateattach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_print_essid.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_proto_attach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_proto_detach.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_rate2media.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_recv_mgmt.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_send_mgmt.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_setmode.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_timeout_nodes.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_watchdog.9.gz +OLD_FILES+=usr/share/man/man9/ieee80211_wep_crypt.9.gz # 20090801: vimage.h removed in favour of vnet.h OLD_FILES+=usr/include/sys/vimage.h # 20090719: library version bump for 8.0 @@ -503,6 +629,8 @@ OLD_FILES+=usr/include/dev/usb/usb_quirks.h OLD_FILES+=usr/include/dev/usb/usbcdc.h OLD_FILES+=usr/include/dev/usb/usbdivar.h OLD_FILES+=usr/include/dev/usb/uxb360gp_rdesc.h +OLD_FILES+=usr/sbin/usbdevs +OLD_FILES+=usr/share/man/man8/usbdevs.8.gz # 20090203: removal of pccard header files OLD_FILES+=usr/include/pccard/cardinfo.h OLD_FILES+=usr/include/pccard/cis.h @@ -2162,7 +2290,7 @@ OLD_FILES+=usr/lib/libpam_ssh.a OLD_FILES+=usr/lib/libpam_ssh_p.a OLD_FILES+=usr/bin/help OLD_FILES+=usr/bin/sccs -.if ${TARGET_ARCH} != "arm" && ${TARGET_ARCH} != "i386" && ${TARGET_ARCH} != "powerpc" +.if ${TARGET_ARCH} != "amd64" && ${TARGET_ARCH} != "arm" && ${TARGET_ARCH} != "i386" && ${TARGET_ARCH} != "powerpc" OLD_FILES+=usr/bin/gdbserver .endif OLD_FILES+=usr/bin/ssh-keysign diff --git a/UPDATING b/UPDATING index 16a9185956cf..fe27b4f87954 100644 --- a/UPDATING +++ b/UPDATING @@ -22,6 +22,75 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW: machines to maximize performance. (To disable malloc debugging, run ln -s aj /etc/malloc.conf.) +20100113: + The utmp user accounting database has been replaced with utmpx, + the user accounting interface standardized by POSIX. + Unfortunately the semantics of utmp and utmpx don't match, + making it practically impossible to support both interfaces. + The user accounting database is used by tools like finger(1), + last(1), talk(1), w(1) and ac(8). + + All applications in the base system use utmpx. This means only + local binaries (e.g. from the ports tree) may still use these + utmp database files. These applications must be rebuilt to make + use of utmpx. + + After the system has been upgraded, it is safe to remove the old + log files (/var/run/utmp, /var/log/lastlog and /var/log/wtmp*), + assuming their contents is of no importance anymore. Old wtmp + databases can only be used by last(1) and ac(8) after they have + been converted to the new format using wtmpcvt(1). + +20100108: + Introduce the kernel thread "deadlock resolver" (which can be enabled + via the DEADLKRES option, see NOTES for more details) and the + sleepq_type() function for sleepqueues. + +20091202: + The rc.firewall and rc.firewall6 were unified, and + rc.firewall6 and rc.d/ip6fw were removed. + According to the removal of rc.d/ip6fw, ipv6_firewall_* rc + variables are obsoleted. Instead, the following new rc + variables are added to rc.d/ipfw: + + firewall_client_net_ipv6, firewall_simple_iif_ipv6, + firewall_simple_inet_ipv6, firewall_simple_oif_ipv6, + firewall_simple_onet_ipv6, firewall_trusted_ipv6 + + The meanings correspond to the relevant IPv4 variables. + +20091113: + The default terminal emulation for syscons(4) has been changed + from cons25 to xterm on all platforms except pc98. This means + that the /etc/ttys file needs to be updated to ensure correct + operation of applications on the console. + + The terminal emulation style can be toggled per window by using + vidcontrol(1)'s -T flag. The TEKEN_CONS25 kernel configuration + options can be used to change the compile-time default back to + cons25. + + To prevent graphical artifacts, make sure the TERM environment + variable is set to match the terminal emulation that is being + performed by syscons(4). + +20091109: + The layout of the structure ieee80211req_scan_result has changed. + Applications that require wireless scan results (e.g. ifconfig(8)) + from net80211 need to be recompiled. + + Applications such as wpa_supplicant(8) may require a full world + build without using NO_CLEAN in order to get synchronized with the + new structure. + +20091025: + The iwn(4) driver has been updated to support the 5000 and 5150 series. + There's one kernel module for each firmware. Adding "device iwnfw" + to the kernel configuration file means including all three firmware + images inside the kernel. If you want to include just the one for + your wireless card, use the the devices iwn4965fw, iwn5000fw or + iwn5150fw. + 20090926: The rc.d/network_ipv6, IPv6 configuration script has been integrated into rc.d/netif. The changes are the following: @@ -116,7 +185,7 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW: 20090712: Padding has been added to struct tcpcb, sackhint and tcpstat in to facilitate future MFCs and bug fixes whilst - maintainig the ABI. However, this change breaks the ABI, so bump + maintaining the ABI. However, this change breaks the ABI, so bump __FreeBSD_version to 800102. User space tools that rely on the size of any of these structs (e.g. sockstat) need to be recompiled. @@ -529,6 +598,11 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW: # Map old usb library to new one for usb2 stack libusb-0.1.so.8 libusb20.so.1 +20090209: + All USB ethernet devices now attach as interfaces under the name ueN + (eg. ue0). This is to provide a predictable name as vendors often + change usb chipsets in a product without notice. + 20090203: The ichsmb(4) driver has been changed to require SMBus slave addresses be left-justified (xxxxxxx0b) rather than right-justified. @@ -624,6 +698,15 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.x IS SLOW: userland (libpmc(3)) and the kernel module (hwpmc(4)) in sync. +20081009: + atapci kernel module now includes only generic PCI ATA + driver. AHCI driver moved to ataahci kernel module. + All vendor-specific code moved into separate kernel modules: + ataacard, ataacerlabs, ataadaptec, ataamd, ataati, atacenatek, + atacypress, atacyrix, atahighpoint, ataintel, ataite, atajmicron, + atamarvell, atamicron, atanational, atanetcell, atanvidia, + atapromise, ataserverworks, atasiliconimage, atasis, atavia + 20080820: The TTY subsystem of the kernel has been replaced by a new implementation, which provides better scalability and an @@ -836,7 +919,7 @@ COMMON ITEMS: ------------- Avoid using make -j when upgrading. While generally safe, there are sometimes problems using -j to upgrade. If your upgrade fails with - -j, please try again wtihout -j. From time to time in the past there + -j, please try again without -j. From time to time in the past there have been problems using -j with buildworld and/or installworld. This is especially true when upgrading between "distant" versions (eg one that cross a major release boundary or several minor releases, or when diff --git a/bin/Makefile b/bin/Makefile index 7491be9fc462..3114e670097f 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -27,6 +27,7 @@ SUBDIR= cat \ pax \ pkill \ ps \ + pwait \ pwd \ ${_rcp} \ realpath \ diff --git a/bin/cat/Makefile b/bin/cat/Makefile index 689dd4d28d08..672a4eeeeff5 100644 --- a/bin/cat/Makefile +++ b/bin/cat/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= cat -WARNS?= 6 .include diff --git a/bin/cp/cp.1 b/bin/cp/cp.1 index 7329b64aca50..fc5a9f73ad65 100644 --- a/bin/cp/cp.1 +++ b/bin/cp/cp.1 @@ -32,7 +32,7 @@ .\" @(#)cp.1 8.3 (Berkeley) 4/18/94 .\" $FreeBSD$ .\" -.Dd October 27, 2006 +.Dd January 17, 2010 .Dt CP 1 .Os .Sh NAME @@ -45,7 +45,7 @@ .Op Fl H | Fl L | Fl P .Oc .Op Fl f | i | n -.Op Fl alpv +.Op Fl alpvx .Ar source_file target_file .Nm .Oo @@ -53,7 +53,7 @@ .Op Fl H | Fl L | Fl P .Oc .Op Fl f | i | n -.Op Fl alpv +.Op Fl alpvx .Ar source_file ... target_directory .Sh DESCRIPTION In the first synopsis form, the @@ -183,6 +183,8 @@ permissions. Cause .Nm to be verbose, showing files as they are copied. +.It Fl x +File system mount points are not traversed. .El .Pp For each destination file that already exists, its contents are diff --git a/bin/cp/cp.c b/bin/cp/cp.c index feba50faae93..0ae57eba590e 100644 --- a/bin/cp/cp.c +++ b/bin/cp/cp.c @@ -101,8 +101,9 @@ main(int argc, char *argv[]) int Hflag, Lflag, Pflag, ch, fts_options, r, have_trailing_slash; char *target; + fts_options = FTS_NOCHDIR | FTS_PHYSICAL; Hflag = Lflag = Pflag = 0; - while ((ch = getopt(argc, argv, "HLPRafilnprv")) != -1) + while ((ch = getopt(argc, argv, "HLPRafilnprvx")) != -1) switch (ch) { case 'H': Hflag = 1; @@ -150,6 +151,9 @@ main(int argc, char *argv[]) case 'v': vflag = 1; break; + case 'x': + fts_options |= FTS_XDEV; + break; default: usage(); break; @@ -160,7 +164,6 @@ main(int argc, char *argv[]) if (argc < 2) usage(); - fts_options = FTS_NOCHDIR | FTS_PHYSICAL; if (Rflag && rflag) errx(1, "the -R and -r options may not be specified together"); if (rflag) diff --git a/bin/cp/utils.c b/bin/cp/utils.c index 63eba422f3da..b075eac46d04 100644 --- a/bin/cp/utils.c +++ b/bin/cp/utils.c @@ -518,8 +518,8 @@ usage(void) { (void)fprintf(stderr, "%s\n%s\n", -"usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpv] source_file target_file", -" cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpv] source_file ... " +"usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file", +" cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... " "target_directory"); exit(EX_USAGE); } diff --git a/bin/csh/config.h b/bin/csh/config.h index 0971ffa3faa1..60b229d46901 100644 --- a/bin/csh/config.h +++ b/bin/csh/config.h @@ -54,7 +54,7 @@ #define HAVE_GETPWENT 1 /* Define to 1 if you have the `getutent' function. */ -/* #undef HAVE_GETUTENT */ +#define HAVE_GETUTENT 1 /* Define if you have the iconv() function. */ /* #undef HAVE_ICONV */ @@ -130,10 +130,10 @@ #define HAVE_STRUCT_UTMP_UT_HOST 1 /* Define to 1 if `ut_tv' is member of `struct utmp'. */ -/* #undef HAVE_STRUCT_UTMP_UT_TV */ +#define HAVE_STRUCT_UTMP_UT_TV 1 /* Define to 1 if `ut_user' is member of `struct utmp'. */ -/* #undef HAVE_STRUCT_UTMP_UT_USER */ +#define HAVE_STRUCT_UTMP_UT_USER 1 /* Define to 1 if `ut_xtime' is member of `struct utmp'. */ /* #undef HAVE_STRUCT_UTMP_UT_XTIME */ @@ -159,10 +159,10 @@ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the header file. */ -/* #undef HAVE_UTMPX_H */ +#define HAVE_UTMPX_H 1 /* Define to 1 if you have the header file. */ -#define HAVE_UTMP_H 1 +/* #undef HAVE_UTMP_H */ /* Define to 1 if you have the header file. */ #define HAVE_WCHAR_H 1 diff --git a/bin/csh/config_p.h b/bin/csh/config_p.h index 8c29053e3176..72e304200130 100644 --- a/bin/csh/config_p.h +++ b/bin/csh/config_p.h @@ -85,6 +85,7 @@ /* Use LC_MESSAGES locale category to open the message catalog */ #define MCLoadBySet NL_CAT_LOCALE #define BUFSIZE 8192 +#define UTMPX_FILE "/var/run/utx.active" #endif #if defined(__bsdi__) diff --git a/bin/csh/iconv_stub.c b/bin/csh/iconv_stub.c index 6bbbbb02a01a..d1a9e475d87e 100644 --- a/bin/csh/iconv_stub.c +++ b/bin/csh/iconv_stub.c @@ -61,9 +61,20 @@ dl_iconv_open(const char *tocode, const char *fromcode) if (iconvlib == NULL) return (iconv_t)-1; iconv_open = (iconv_open_t *)dlfunc(iconvlib, ICONV_OPEN); + if (iconv_open == NULL) + goto dlfunc_err; dl_iconv = (dl_iconv_t *)dlfunc(iconvlib, ICONV_ENGINE); + if (dl_iconv == NULL) + goto dlfunc_err; dl_iconv_close = (dl_iconv_close_t *)dlfunc(iconvlib, ICONV_CLOSE); + if (dl_iconv_close == NULL) + goto dlfunc_err; } return iconv_open(tocode, fromcode); + +dlfunc_err: + dlclose(iconvlib); + iconvlib = NULL; + return (iconv_t)-1; } diff --git a/bin/date/Makefile b/bin/date/Makefile index 8a1dc8579330..4f5c3fea3a58 100644 --- a/bin/date/Makefile +++ b/bin/date/Makefile @@ -3,7 +3,5 @@ PROG= date SRCS= date.c netdate.c vary.c -DPADD= ${LIBUTIL} -LDADD= -lutil .include diff --git a/bin/date/date.1 b/bin/date/date.1 index b57f4ab11215..496f197ccf5c 100644 --- a/bin/date/date.1 +++ b/bin/date/date.1 @@ -299,7 +299,7 @@ for more information. .El .Sh FILES .Bl -tag -width /var/log/messages -compact -.It Pa /var/log/wtmp +.It Pa /var/log/utx.log record of date resets and time changes .It Pa /var/log/messages record of the user setting the time @@ -406,9 +406,9 @@ fails. .Sh SEE ALSO .Xr locale 1 , .Xr gettimeofday 2 , +.Xr getutxent 3 , .Xr strftime 3 , .Xr strptime 3 , -.Xr utmp 5 , .Xr timed 8 .Rs .%T "TSP: The Time Synchronization Protocol for UNIX 4.3BSD" diff --git a/bin/date/date.c b/bin/date/date.c index 578229eb4308..1e9f281bc8a7 100644 --- a/bin/date/date.c +++ b/bin/date/date.c @@ -48,12 +48,12 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include #include #include +#include #include "extern.h" #include "vary.h" @@ -181,6 +181,7 @@ main(int argc, char *argv[]) static void setthetime(const char *fmt, const char *p, int jflag, int nflag) { + struct utmpx utx; struct tm *lt; struct timeval tv; const char *dot, *t; @@ -271,12 +272,16 @@ setthetime(const char *fmt, const char *p, int jflag, int nflag) if (!jflag) { /* set the time */ if (nflag || netsettime(tval)) { - logwtmp("|", "date", ""); + utx.ut_type = OLD_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); tv.tv_sec = tval; tv.tv_usec = 0; if (settimeofday(&tv, (struct timezone *)NULL)) err(1, "settimeofday (timeval)"); - logwtmp("{", "date", ""); + utx.ut_type = NEW_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); } if ((p = getlogin()) == NULL) diff --git a/bin/getfacl/getfacl.1 b/bin/getfacl/getfacl.1 index 58202299f656..e787349336b2 100644 --- a/bin/getfacl/getfacl.1 +++ b/bin/getfacl/getfacl.1 @@ -30,7 +30,7 @@ .\" Developed by the TrustedBSD Project. .\" Support for POSIX.1e access control lists. .\" -.Dd September 04, 2009 +.Dd September 4, 2009 .Dt GETFACL 1 .Os .Sh NAME diff --git a/bin/kenv/kenv.c b/bin/kenv/kenv.c index dc86ba8200a9..6c59b2cdce92 100644 --- a/bin/kenv/kenv.c +++ b/bin/kenv/kenv.c @@ -118,7 +118,7 @@ main(int argc, char **argv) } static int -kdumpenv() +kdumpenv(void) { char *buf, *cp; int buflen, envlen; diff --git a/bin/kill/kill.c b/bin/kill/kill.c index bb9982e33b51..8ee1d85d398f 100644 --- a/bin/kill/kill.c +++ b/bin/kill/kill.c @@ -108,7 +108,7 @@ main(int argc, char *argv[]) numsig = strtol(*argv, &ep, 10); if (!**argv || *ep) errx(1, "illegal signal number: %s", *argv); - if (numsig < 0 || numsig >= sys_nsig) + if (numsig < 0) nosig(*argv); } else nosig(*argv); diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 644bc96eb5fe..e482e2252f04 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -113,6 +113,7 @@ static int f_listdir; /* list actual directory, not contents */ static int f_listdot; /* list files beginning with . */ static int f_noautodot; /* do not automatically enable -A for root */ int f_longform; /* long listing format */ +static int f_nofollow; /* don't follow symbolic link arguments */ int f_nonprint; /* show unprintables as ? */ static int f_nosort; /* don't sort output */ int f_notabs; /* don't use tab-separated multi-col output */ @@ -234,6 +235,7 @@ main(int argc, char *argv[]) break; case 'H': fts_options |= FTS_COMFOLLOW; + f_nofollow = 0; break; case 'G': setenv("CLICOLOR", "", 1); @@ -241,11 +243,13 @@ main(int argc, char *argv[]) case 'L': fts_options &= ~FTS_PHYSICAL; fts_options |= FTS_LOGICAL; + f_nofollow = 0; break; case 'P': fts_options &= ~FTS_COMFOLLOW; fts_options &= ~FTS_LOGICAL; fts_options |= FTS_PHYSICAL; + f_nofollow = 1; break; case 'R': f_recursive = 1; @@ -396,10 +400,10 @@ main(int argc, char *argv[]) fts_options |= FTS_NOSTAT; /* - * If not -F, -d or -l options, follow any symbolic links listed on + * If not -F, -P, -d or -l options, follow any symbolic links listed on * the command line. */ - if (!f_longform && !f_listdir && !f_type) + if (!f_nofollow && !f_longform && !f_listdir && (!f_type || f_slash)) fts_options |= FTS_COMFOLLOW; /* @@ -508,7 +512,7 @@ traverse(int argc, char *argv[], int options) break; case FTS_DNR: case FTS_ERR: - warnx("%s: %s", p->fts_name, strerror(p->fts_errno)); + warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); rval = 1; break; case FTS_D: @@ -559,7 +563,8 @@ display(const FTSENT *p, FTSENT *list, int options) long maxblock; u_long btotal, labelstrlen, maxinode, maxlen, maxnlink; u_long maxlabelstr; - int bcfile, maxflags; + u_int devstrlen; + int maxflags; gid_t maxgroup; uid_t maxuser; size_t flen, ulen, glen; @@ -651,7 +656,7 @@ display(const FTSENT *p, FTSENT *list, int options) MAKENINES(maxsize); free(jinitmax); } - bcfile = 0; + devstrlen = 0; flags = NULL; for (cur = list, entries = 0; cur; cur = cur->fts_link) { if (cur->fts_info == FTS_ERR || cur->fts_info == FTS_NS) { @@ -791,9 +796,15 @@ label_out: np->group = &np->data[ulen + 1]; (void)strcpy(np->group, group); - if (S_ISCHR(sp->st_mode) || - S_ISBLK(sp->st_mode)) - bcfile = 1; + if ((S_ISCHR(sp->st_mode) || + S_ISBLK(sp->st_mode)) && + devstrlen < DEVSTR_HEX_LEN) { + if (minor(sp->st_rdev) > 255 || + minor(sp->st_rdev) < 0) + devstrlen = DEVSTR_HEX_LEN; + else + devstrlen = DEVSTR_LEN; + } if (f_flags) { np->flags = &np->data[ulen + glen + 2]; @@ -825,7 +836,6 @@ label_out: d.entries = entries; d.maxlen = maxlen; if (needstats) { - d.bcfile = bcfile; d.btotal = btotal; (void)snprintf(buf, sizeof(buf), "%lu", maxblock); d.s_block = strlen(buf); @@ -836,8 +846,14 @@ label_out: d.s_inode = strlen(buf); (void)snprintf(buf, sizeof(buf), "%lu", maxnlink); d.s_nlink = strlen(buf); - (void)snprintf(buf, sizeof(buf), "%ju", maxsize); - d.s_size = strlen(buf); + if (f_humanval) + d.s_size = HUMANVALSTR_LEN; + else { + (void)snprintf(buf, sizeof(buf), "%ju", maxsize); + d.s_size = strlen(buf); + } + if (d.s_size < devstrlen) + d.s_size = devstrlen; d.s_user = maxuser; } printfcn(&d); diff --git a/bin/ls/ls.h b/bin/ls/ls.h index f01e3519be12..a74abf0c9e5b 100644 --- a/bin/ls/ls.h +++ b/bin/ls/ls.h @@ -35,6 +35,10 @@ #define NO_PRINT 1 +#define HUMANVALSTR_LEN 5 +#define DEVSTR_LEN 8 +#define DEVSTR_HEX_LEN 15 + extern long blocksize; /* block size units */ extern int f_accesstime; /* use time of last access */ @@ -62,7 +66,6 @@ extern int f_color; /* add type in color for non-regular files */ typedef struct { FTSENT *list; u_long btotal; - int bcfile; int entries; int maxlen; u_int s_block; diff --git a/bin/ls/print.c b/bin/ls/print.c index 3b80d93aefec..3f2033c404db 100644 --- a/bin/ls/print.c +++ b/bin/ls/print.c @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include "extern.h" static int printaname(const FTSENT *, u_long, u_long); +static void printdev(size_t, dev_t); static void printlink(const FTSENT *); static void printtime(time_t); static int printtype(u_int); @@ -165,16 +166,7 @@ printlong(const DISPLAY *dp) if (f_label) (void)printf("%-*s ", dp->s_label, np->label); if (S_ISCHR(sp->st_mode) || S_ISBLK(sp->st_mode)) - if (minor(sp->st_rdev) > 255 || minor(sp->st_rdev) < 0) - (void)printf("%3d, 0x%08x ", - major(sp->st_rdev), - (u_int)minor(sp->st_rdev)); - else - (void)printf("%3d, %3d ", - major(sp->st_rdev), minor(sp->st_rdev)); - else if (dp->bcfile) - (void)printf("%*s%*jd ", - 8 - dp->s_size, "", dp->s_size, sp->st_size); + printdev(dp->s_size, sp->st_rdev); else printsize(dp->s_size, sp->st_size); if (f_accesstime) @@ -353,6 +345,24 @@ printaname(const FTSENT *p, u_long inodefield, u_long sizefield) return (chcnt); } +/* + * Print device special file major and minor numbers. + */ +static void +printdev(size_t width, dev_t dev) +{ + char buf[DEVSTR_HEX_LEN + 1]; + + if (minor(dev) > 255 || minor(dev) < 0) + (void)snprintf(buf, sizeof(buf), "%3d, 0x%08x", + major(dev), (u_int)minor(dev)); + else + (void)snprintf(buf, sizeof(buf), "%3d, %3d", + major(dev), minor(dev)); + + (void)printf("%*s ", (u_int)width, buf); +} + static void printtime(time_t ftime) { @@ -592,11 +602,15 @@ printsize(size_t width, off_t bytes) { if (f_humanval) { - char buf[5]; + /* + * Reserve one space before the size and allocate room for + * the trailing '\0'. + */ + char buf[HUMANVALSTR_LEN - 1 + 1]; humanize_number(buf, sizeof(buf), (int64_t)bytes, "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); - (void)printf("%5s ", buf); + (void)printf("%*s ", (u_int)width, buf); } else (void)printf("%*jd ", (u_int)width, bytes); } diff --git a/bin/pax/Makefile b/bin/pax/Makefile index de76e6cf0754..f142bfcc05a2 100644 --- a/bin/pax/Makefile +++ b/bin/pax/Makefile @@ -33,8 +33,4 @@ SRCS= ar_io.c ar_subs.c buf_subs.c cache.c cpio.c file_subs.c ftree.c \ #MAN= pax.1 tar.1 cpio.1 #LINKS= ${BINDIR}/pax ${BINDIR}/tar ${BINDIR}/pax ${BINDIR}/cpio -.if ${MACHINE_ARCH} == "arm" -WARNS?= 3 -.endif - .include diff --git a/bin/pax/cpio.h b/bin/pax/cpio.h index 2f4c37cb688a..1cac0d71918d 100644 --- a/bin/pax/cpio.h +++ b/bin/pax/cpio.h @@ -67,7 +67,7 @@ typedef struct { char c_mtime[11]; /* modification time */ char c_namesize[6]; /* length of pathname */ char c_filesize[11]; /* length of file in bytes */ -} HD_CPIO; +} HD_CPIO __aligned(1); #define MAGIC 070707 /* transportable archive id */ @@ -98,7 +98,7 @@ typedef struct { u_char h_namesize[2]; u_char h_filesize_1[2]; u_char h_filesize_2[2]; -} HD_BCPIO; +} HD_BCPIO __aligned(1); #ifdef _PAX_ /* @@ -136,7 +136,7 @@ typedef struct { char c_rmin[8]; /* special file minor # */ char c_namesize[8]; /* length of pathname */ char c_chksum[8]; /* 0 OR CRC of bytes of FILE data */ -} HD_VCPIO; +} HD_VCPIO __aligned(1); #define VMAGIC 070701 /* sVr4 new portable archive id */ #define VCMAGIC 070702 /* sVr4 new portable archive id CRC */ diff --git a/bin/pax/ftree.c b/bin/pax/ftree.c index f402c568ddfa..1fb06ac74c3a 100644 --- a/bin/pax/ftree.c +++ b/bin/pax/ftree.c @@ -219,7 +219,7 @@ ftree_sel(ARCHD *arcn) */ void -ftree_notsel() +ftree_notsel(void) { if (ftent != NULL) (void)fts_set(ftsp, ftent, FTS_SKIP); diff --git a/bin/pax/gen_subs.c b/bin/pax/gen_subs.c index ce2041985a1d..708e8af5ba29 100644 --- a/bin/pax/gen_subs.c +++ b/bin/pax/gen_subs.c @@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -66,10 +65,6 @@ __FBSDID("$FreeBSD$"); #define OLDFRMTM "%b %e %Y" #define CURFRMTD "%e %b %H:%M" #define OLDFRMTD "%e %b %Y" -#ifndef UT_NAMESIZE -#define UT_NAMESIZE 8 -#endif -#define UT_GRPSIZE 6 static int d_first = -1; @@ -116,9 +111,8 @@ ls_list(ARCHD *arcn, time_t now, FILE *fp) */ if (strftime(f_date,DATELEN,timefrmt,localtime(&(sbp->st_mtime))) == 0) f_date[0] = '\0'; - (void)fprintf(fp, "%s%2u %-*s %-*s ", f_mode, sbp->st_nlink, - UT_NAMESIZE, name_uid(sbp->st_uid, 1), UT_GRPSIZE, - name_gid(sbp->st_gid, 1)); + (void)fprintf(fp, "%s%2u %-12s %-12s ", f_mode, sbp->st_nlink, + name_uid(sbp->st_uid, 1), name_gid(sbp->st_gid, 1)); /* * print device id's for devices, or sizes for other nodes diff --git a/bin/pax/sel_subs.c b/bin/pax/sel_subs.c index 87fba2ff0082..bd5c560afc53 100644 --- a/bin/pax/sel_subs.c +++ b/bin/pax/sel_subs.c @@ -396,6 +396,7 @@ trng_add(char *str) default: paxwarn(1, "Bad option %c with time range %s", *flgpt, str); + free(pt); goto out; } ++flgpt; diff --git a/bin/pax/tar.h b/bin/pax/tar.h index 856e26c8336a..df36360adfc6 100644 --- a/bin/pax/tar.h +++ b/bin/pax/tar.h @@ -96,7 +96,7 @@ typedef struct { char chksum[CHK_LEN]; /* checksum */ char linkflag; /* norm, hard, or sym. */ char linkname[TNMSZ]; /* linked to name */ -} HD_TAR; +} HD_TAR __aligned(1); #ifdef _PAX_ /* @@ -142,4 +142,4 @@ typedef struct { char devmajor[8]; /* major device number */ char devminor[8]; /* minor device number */ char prefix[TPFSZ]; /* linked to name */ -} HD_USTAR; +} HD_USTAR __aligned(1); diff --git a/bin/pkill/Makefile b/bin/pkill/Makefile index 3437c0db0a17..e98ed2c4e522 100644 --- a/bin/pkill/Makefile +++ b/bin/pkill/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= pkill -WARNS?= 5 DPADD= ${LIBKVM} LDADD= -lkvm diff --git a/bin/pkill/pkill.1 b/bin/pkill/pkill.1 index 1db38f042fde..0c666e5d09ed 100644 --- a/bin/pkill/pkill.1 +++ b/bin/pkill/pkill.1 @@ -16,13 +16,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,7 +29,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd May 16, 2009 +.Dd February 11, 2010 .Dt PKILL 1 .Os .Sh NAME @@ -44,7 +37,7 @@ .Nd find or signal processes by name .Sh SYNOPSIS .Nm pgrep -.Op Fl LSafilnovx +.Op Fl LSafilnoqvx .Op Fl F Ar pidfile .Op Fl G Ar gid .Op Fl M Ar core @@ -175,6 +168,8 @@ command. Select only the newest (most recently started) of the matching processes. .It Fl o Select only the oldest (least recently started) of the matching processes. +.It Fl q +Do not write anything to standard output. .It Fl s Ar sid Restrict matches to processes with a session ID in the comma-separated list diff --git a/bin/pkill/pkill.c b/bin/pkill/pkill.c index b4b96b880f46..7876b87e1de3 100644 --- a/bin/pkill/pkill.c +++ b/bin/pkill/pkill.c @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -49,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -110,17 +104,18 @@ static int matchargs; static int fullmatch; static int kthreads; static int cflags = REG_EXTENDED; +static int quiet; static kvm_t *kd; static pid_t mypid; -static struct listhead euidlist = SLIST_HEAD_INITIALIZER(list); -static struct listhead ruidlist = SLIST_HEAD_INITIALIZER(list); -static struct listhead rgidlist = SLIST_HEAD_INITIALIZER(list); -static struct listhead pgrplist = SLIST_HEAD_INITIALIZER(list); -static struct listhead ppidlist = SLIST_HEAD_INITIALIZER(list); -static struct listhead tdevlist = SLIST_HEAD_INITIALIZER(list); -static struct listhead sidlist = SLIST_HEAD_INITIALIZER(list); -static struct listhead jidlist = SLIST_HEAD_INITIALIZER(list); +static struct listhead euidlist = SLIST_HEAD_INITIALIZER(euidlist); +static struct listhead ruidlist = SLIST_HEAD_INITIALIZER(ruidlist); +static struct listhead rgidlist = SLIST_HEAD_INITIALIZER(rgidlist); +static struct listhead pgrplist = SLIST_HEAD_INITIALIZER(pgrplist); +static struct listhead ppidlist = SLIST_HEAD_INITIALIZER(ppidlist); +static struct listhead tdevlist = SLIST_HEAD_INITIALIZER(tdevlist); +static struct listhead sidlist = SLIST_HEAD_INITIALIZER(sidlist); +static struct listhead jidlist = SLIST_HEAD_INITIALIZER(jidlist); static void usage(void) __attribute__((__noreturn__)); static int killact(const struct kinfo_proc *); @@ -180,9 +175,11 @@ main(int argc, char **argv) debug_opt = 0; pidfile = NULL; pidfilelock = 0; - execf = coref = _PATH_DEVNULL; + quiet = 0; + execf = NULL; + coref = _PATH_DEVNULL; - while ((ch = getopt(argc, argv, "DF:G:ILM:N:P:SU:ad:fg:ij:lnos:t:u:vx")) != -1) + while ((ch = getopt(argc, argv, "DF:G:ILM:N:P:SU:ad:fg:ij:lnoqs:t:u:vx")) != -1) switch (ch) { case 'D': debug_opt++; @@ -257,6 +254,11 @@ main(int argc, char **argv) oldest = 1; criteria = 1; break; + case 'q': + if (!pgrep) + usage(); + quiet = 1; + break; case 's': makelist(&sidlist, LT_SID, optarg); criteria = 1; @@ -548,7 +550,7 @@ usage(void) const char *ustr; if (pgrep) - ustr = "[-LSfilnovx] [-d delim]"; + ustr = "[-LSfilnoqvx] [-d delim]"; else ustr = "[-signal] [-ILfinovx]"; @@ -566,6 +568,10 @@ show_process(const struct kinfo_proc *kp) { char **argv; + if (quiet) { + assert(pgrep); + return; + } if ((longfmt || !pgrep) && matchargs && (argv = kvm_getargv(kd, kp, 0)) != NULL) { printf("%d ", (int)kp->ki_pid); @@ -622,7 +628,8 @@ grepact(const struct kinfo_proc *kp) { show_process(kp); - printf("%s", delim); + if (!quiet) + printf("%s", delim); return (1); } @@ -671,8 +678,19 @@ makelist(struct listhead *head, enum listtype type, char *src) li->li_number = -1; /* any jail */ break; case LT_TTY: - usage(); - /* NOTREACHED */ + if (li->li_number < 0) + errx(STATUS_BADUSAGE, + "Negative /dev/pts tty `%s'", sp); + snprintf(buf, sizeof(buf), _PATH_DEV "pts/%s", + sp); + if (stat(buf, &st) != -1) + goto foundtty; + if (errno == ENOENT) + errx(STATUS_BADUSAGE, "No such tty: `" + _PATH_DEV "pts/%s'", sp); + err(STATUS_ERROR, "Cannot access `" + _PATH_DEV "pts/%s'", sp); + break; default: break; } diff --git a/bin/ps/keyword.c b/bin/ps/keyword.c index ade8123a0daa..4524d9956665 100644 --- a/bin/ps/keyword.c +++ b/bin/ps/keyword.c @@ -70,7 +70,7 @@ static int vcmp(const void *, const void *); /* PLEASE KEEP THE TABLE BELOW SORTED ALPHABETICALLY!!! */ static VAR var[] = { - {"%cpu", "%CPU", NULL, 0, pcpu, NULL, 4, 0, CHAR, NULL, 0}, + {"%cpu", "%CPU", NULL, 0, pcpu, NULL, 5, 0, CHAR, NULL, 0}, {"%mem", "%MEM", NULL, 0, pmem, NULL, 4, 0, CHAR, NULL, 0}, {"acflag", "ACFLG", NULL, 0, kvar, NULL, 3, KOFF(ki_acflag), USHORT, "x", 0}, @@ -159,7 +159,7 @@ static VAR var[] = { UINT, UIDFMT, 0}, {"rgroup", "RGROUP", NULL, LJUST|DSIZ, rgroupname, s_rgroupname, USERLEN, 0, CHAR, NULL, 0}, - {"rss", "RSS", NULL, 0, kvar, NULL, 5, KOFF(ki_rssize), PGTOK, "ld", 0}, + {"rss", "RSS", NULL, 0, kvar, NULL, 6, KOFF(ki_rssize), PGTOK, "ld", 0}, {"rtprio", "RTPRIO", NULL, 0, priorityr, NULL, 7, KOFF(ki_pri), CHAR, NULL, 0}, {"ruid", "RUID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_ruid), @@ -207,7 +207,7 @@ static VAR var[] = { NULL, 0}, {"usrpri", "", "upr", 0, NULL, NULL, 0, 0, CHAR, NULL, 0}, {"vsize", "", "vsz", 0, NULL, NULL, 0, 0, CHAR, NULL, 0}, - {"vsz", "VSZ", NULL, 0, vsize, NULL, 5, 0, CHAR, NULL, 0}, + {"vsz", "VSZ", NULL, 0, vsize, NULL, 6, 0, CHAR, NULL, 0}, {"wchan", "WCHAN", NULL, LJUST, wchan, NULL, 6, 0, CHAR, NULL, 0}, {"xstat", "XSTAT", NULL, 0, kvar, NULL, 4, KOFF(ki_xstat), USHORT, "x", 0}, @@ -330,6 +330,7 @@ findvar(char *p, int user, char **header) errx(1, "malloc failed"); snprintf(realfmt, rflen, "%s=%s", v->alias, hp); parsefmt(realfmt, user); + free(realfmt); } return ((VAR *)NULL); } diff --git a/bin/ps/ps.c b/bin/ps/ps.c index 904a430c1af5..0667db9b5c40 100644 --- a/bin/ps/ps.c +++ b/bin/ps/ps.c @@ -212,7 +212,8 @@ main(int argc, char *argv[]) init_list(&sesslist, addelem_pid, sizeof(pid_t), "session id"); init_list(&ttylist, addelem_tty, sizeof(dev_t), "tty"); init_list(&uidlist, addelem_uid, sizeof(uid_t), "user"); - memf = nlistf = _PATH_DEVNULL; + memf = _PATH_DEVNULL; + nlistf = NULL; while ((ch = getopt(argc, argv, PS_ARGS)) != -1) switch (ch) { case 'A': diff --git a/bin/pwait/Makefile b/bin/pwait/Makefile new file mode 100644 index 000000000000..cdf322e27a8f --- /dev/null +++ b/bin/pwait/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +PROG= pwait + +.include diff --git a/bin/pwait/pwait.1 b/bin/pwait/pwait.1 new file mode 100644 index 000000000000..132d83c98ceb --- /dev/null +++ b/bin/pwait/pwait.1 @@ -0,0 +1,78 @@ +.\" +.\" Copyright (c) 2004-2009, Jilles Tjoelker +.\" 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 COPYRIGHT HOLDERS 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 +.\" COPYRIGHT OWNER 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$ +.\" +.Dd November 1, 2009 +.Os +.Dt PWAIT 1 +.Sh NAME +.Nm pwait +.Nd wait for processes to terminate +.Sh SYNOPSIS +.Nm +.Op Fl v +.Ar pid +\&... +.Sh DESCRIPTION +The +.Nm +utility will wait until each of the given processes has terminated. +.Pp +The following option is available: +.Bl -tag -width indent +.It Fl v +Print the exit status when each process terminates. +.El +.Sh DIAGNOSTICS +.Pp +The +.Nm +utility returns 0 on success, and >0 if an error occurs. +.Pp +Invalid pids elicit a warning message but are otherwise ignored. +.Sh SEE ALSO +.Xr kill 1 , +.Xr pkill 1 , +.Xr ps 1 , +.Xr wait 1 , +.Xr kqueue 2 +.Sh NOTES +.Nm +is not a substitute for the +.Xr wait 1 +builtin +as it will not clean up any zombies or state in the parent process. +.Sh HISTORY +A +.Nm +command first appeared in SunOS 5.8. diff --git a/bin/pwait/pwait.c b/bin/pwait/pwait.c new file mode 100644 index 000000000000..26cf1bd8970d --- /dev/null +++ b/bin/pwait/pwait.c @@ -0,0 +1,145 @@ +/*- + * Copyright (c) 2004-2009, Jilles Tjoelker + * 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 COPYRIGHT HOLDERS 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 + * COPYRIGHT OWNER 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void +usage(void) +{ + + fprintf(stderr, "usage: pwait [-v] pid ...\n"); + exit(EX_USAGE); +} + +/* + * pwait - wait for processes to terminate + */ +int +main(int argc, char *argv[]) +{ + int kq; + struct kevent *e; + int verbose = 0; + int opt, nleft, n, i, duplicate, status; + long pid; + char *s, *end; + + while ((opt = getopt(argc, argv, "v")) != -1) { + switch (opt) { + case 'v': + verbose = 1; + break; + default: + usage(); + /* NOTREACHED */ + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) + usage(); + + kq = kqueue(); + if (kq == -1) + err(1, "kqueue"); + + e = malloc(argc * sizeof(struct kevent)); + if (e == NULL) + err(1, "malloc"); + nleft = 0; + for (n = 0; n < argc; n++) { + s = argv[n]; + if (!strncmp(s, "/proc/", 6)) /* Undocumented Solaris compat */ + s += 6; + errno = 0; + pid = strtol(s, &end, 10); + if (pid < 0 || *end != '\0' || errno != 0) { + warnx("%s: bad process id", s); + continue; + } + duplicate = 0; + for (i = 0; i < nleft; i++) + if (e[i].ident == (uintptr_t)pid) + duplicate = 1; + if (!duplicate) { + EV_SET(e + nleft, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, + 0, NULL); + if (kevent(kq, e + nleft, 1, NULL, 0, NULL) == -1) + warn("%ld", pid); + else + nleft++; + } + } + + while (nleft > 0) { + n = kevent(kq, NULL, 0, e, nleft, NULL); + if (n == -1) + err(1, "kevent"); + if (verbose) + for (i = 0; i < n; i++) { + status = e[i].data; + if (WIFEXITED(status)) + printf("%ld: exited with status %d.\n", + (long)e[i].ident, + WEXITSTATUS(status)); + else if (WIFSIGNALED(status)) + printf("%ld: killed by signal %d.\n", + (long)e[i].ident, + WTERMSIG(status)); + else + printf("%ld: terminated.\n", + (long)e[i].ident); + } + nleft -= n; + } + + return 0; +} diff --git a/bin/rmail/Makefile b/bin/rmail/Makefile index bf65d1c1a507..ad788a4745a8 100644 --- a/bin/rmail/Makefile +++ b/bin/rmail/Makefile @@ -11,7 +11,7 @@ PROG= rmail SRCS= rmail.c MAN= rmail.8 -WARNS?= 0 +WARNS?= 2 CFLAGS+=-I${SENDMAIL_DIR}/include -I. LIBSMDIR= ${.OBJDIR}/../../lib/libsm diff --git a/bin/setfacl/merge.c b/bin/setfacl/merge.c index 495e66c45a24..0a42eecb74c3 100644 --- a/bin/setfacl/merge.c +++ b/bin/setfacl/merge.c @@ -100,11 +100,10 @@ merge_acl(acl_t acl, acl_t *prev_acl, const char *filename) acl_get_brand_np(acl, &acl_brand); acl_get_brand_np(*prev_acl, &prev_acl_brand); - if (acl_brand != prev_acl_brand) { + if (branding_mismatch(acl_brand, prev_acl_brand)) { warnx("%s: branding mismatch; existing ACL is %s, " "entry to be merged is %s", filename, - prev_acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e", - acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e"); + brand_name(prev_acl_brand), brand_name(acl_brand)); return (-1); } @@ -252,9 +251,10 @@ add_acl(acl_t acl, uint entry_number, acl_t *prev_acl, const char *filename) return (-1); } - if (acl_brand != ACL_BRAND_NFS4) { + if (branding_mismatch(acl_brand, ACL_BRAND_NFS4)) { warnx("%s: branding mismatch; existing ACL is NFSv4, " - "entry to be added is POSIX.1e", filename); + "entry to be added is %s", filename, + brand_name(acl_brand)); return (-1); } diff --git a/bin/setfacl/remove.c b/bin/setfacl/remove.c index 6cd82b36d9e0..e6feef9beada 100644 --- a/bin/setfacl/remove.c +++ b/bin/setfacl/remove.c @@ -53,11 +53,10 @@ remove_acl(acl_t acl, acl_t *prev_acl, const char *filename) acl_get_brand_np(acl, &acl_brand); acl_get_brand_np(*prev_acl, &prev_acl_brand); - if (acl_brand != prev_acl_brand) { + if (branding_mismatch(acl_brand, prev_acl_brand)) { warnx("%s: branding mismatch; existing ACL is %s, " "entry to be removed is %s", filename, - prev_acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e", - acl_brand == ACL_BRAND_NFS4 ? "NFSv4" : "POSIX.1e"); + brand_name(prev_acl_brand), brand_name(acl_brand)); return (-1); } diff --git a/bin/setfacl/setfacl.h b/bin/setfacl/setfacl.h index 7c11b3a14f7c..290ac5b4d1d1 100644 --- a/bin/setfacl/setfacl.h +++ b/bin/setfacl/setfacl.h @@ -71,6 +71,8 @@ void remove_ext(acl_t *prev_acl, const char *filename); int set_acl_mask(acl_t *prev_acl, const char *filename); /* util.c */ void *zmalloc(size_t size); +const char *brand_name(int brand); +int branding_mismatch(int brand1, int brand2); uint have_mask; uint need_mask; diff --git a/bin/setfacl/util.c b/bin/setfacl/util.c index 46b9abb6ff6b..a7fb6a61bc55 100644 --- a/bin/setfacl/util.c +++ b/bin/setfacl/util.c @@ -43,3 +43,26 @@ zmalloc(size_t size) err(1, "calloc() failed"); return (ptr); } + +const char * +brand_name(int brand) +{ + switch (brand) { + case ACL_BRAND_NFS4: + return "NFSv4"; + case ACL_BRAND_POSIX: + return "POSIX.1e"; + default: + return "unknown"; + } +} + +int +branding_mismatch(int brand1, int brand2) +{ + if (brand1 == ACL_BRAND_UNKNOWN || brand2 == ACL_BRAND_UNKNOWN) + return (0); + if (brand1 != brand2) + return (1); + return (0); +} diff --git a/bin/sh/alias.c b/bin/sh/alias.c index 2edfe95eb459..00b7fa7e53e6 100644 --- a/bin/sh/alias.c +++ b/bin/sh/alias.c @@ -52,13 +52,13 @@ __FBSDID("$FreeBSD$"); STATIC struct alias *atab[ATABSIZE]; STATIC int aliases; -STATIC void setalias(char *, char *); +STATIC void setalias(const char *, const char *); STATIC int unalias(const char *); STATIC struct alias **hashalias(const char *); STATIC void -setalias(char *name, char *val) +setalias(const char *name, const char *val) { struct alias *ap, **app; @@ -176,7 +176,7 @@ rmaliases(void) } struct alias * -lookupalias(char *name, int check) +lookupalias(const char *name, int check) { struct alias *ap = *hashalias(name); diff --git a/bin/sh/alias.h b/bin/sh/alias.h index a6bd23d79caf..d8f03081544e 100644 --- a/bin/sh/alias.h +++ b/bin/sh/alias.h @@ -42,7 +42,7 @@ struct alias { int flag; }; -struct alias *lookupalias(char *, int); +struct alias *lookupalias(const char *, int); int aliascmd(int, char **); int unaliascmd(int, char **); void rmaliases(void); diff --git a/bin/sh/arith.h b/bin/sh/arith.h index 41bc76fa2c7e..6a143a4c2eb1 100644 --- a/bin/sh/arith.h +++ b/bin/sh/arith.h @@ -34,8 +34,8 @@ #define DIGITS(var) (3 + (2 + CHAR_BIT * sizeof((var))) / 3) -extern char *arith_buf, *arith_startbuf; +extern const char *arith_buf, *arith_startbuf; -arith_t arith(char *); +arith_t arith(const char *); void arith_lex_reset(void); int expcmd(int, char **); diff --git a/bin/sh/arith.y b/bin/sh/arith.y index 542fc445a8a7..5db16336b22c 100644 --- a/bin/sh/arith.y +++ b/bin/sh/arith.y @@ -85,9 +85,9 @@ expr: ARITH_LPAREN expr ARITH_RPAREN { $$ = $2; } | expr ARITH_OR expr - { $$ = $1 ? $1 : $3 ? $3 : 0; } | + { $$ = $1 || $3; } | expr ARITH_AND expr - { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; } | + { $$ = $1 && $3; } | expr ARITH_BOR expr { $$ = $1 | $3; } | expr ARITH_BXOR expr @@ -265,7 +265,7 @@ expr: #define YYPARSE_PARAM_TYPE arith_t * #define YYPARSE_PARAM result -char *arith_buf, *arith_startbuf; +const char *arith_buf, *arith_startbuf; int yylex(void); int yyparse(YYPARSE_PARAM_TYPE); @@ -284,7 +284,7 @@ arith_assign(char *name, arith_t value) } arith_t -arith(char *s) +arith(const char *s) { arith_t result; @@ -299,7 +299,7 @@ arith(char *s) } static void -yyerror(char *s) +yyerror(const char *s) { yyerrok; @@ -314,7 +314,7 @@ yyerror(char *s) int expcmd(int argc, char **argv) { - char *p; + const char *p; char *concat; char **ap; arith_t i; @@ -354,7 +354,7 @@ main(int argc, char *argv[]) printf("%d\n", exp(argv[1])); } -error(char *s) +error(const char *s) { fprintf(stderr, "exp: %s\n", s); exit(1); diff --git a/bin/sh/arith_lex.l b/bin/sh/arith_lex.l index f0ed3d586177..f0d9cb34c412 100644 --- a/bin/sh/arith_lex.l +++ b/bin/sh/arith_lex.l @@ -51,6 +51,13 @@ __FBSDID("$FreeBSD$"); int yylex(void); +struct varname +{ + struct varname *next; + char name[1]; +}; +static struct varname *varnames; + #undef YY_INPUT #define YY_INPUT(buf,result,max) \ result = (*buf = *arith_buf++) ? 1 : YY_NULL; @@ -80,11 +87,14 @@ int yylex(void); * If variable doesn't exist, we should initialize * it to zero. */ - char *temp; + struct varname *temp; if (lookupvar(yytext) == NULL) setvarsafe(yytext, "0", 0); - temp = (char *)ckmalloc(strlen(yytext) + 1); - yylval.s_value = strcpy(temp, yytext); + temp = ckmalloc(sizeof(struct varname) + + strlen(yytext)); + temp->next = varnames; + varnames = temp; + yylval.s_value = strcpy(temp->name, yytext); return ARITH_VAR; } @@ -130,5 +140,15 @@ int yylex(void); void arith_lex_reset(void) { + struct varname *name, *next; + YY_NEW_FILE; + + name = varnames; + while (name != NULL) { + next = name->next; + ckfree(name); + name = next; + } + varnames = NULL; } diff --git a/bin/sh/cd.c b/bin/sh/cd.c index 4abe91eb0b12..40801ba2c97f 100644 --- a/bin/sh/cd.c +++ b/bin/sh/cd.c @@ -70,7 +70,7 @@ STATIC int docd(char *, int, int); STATIC char *getcomponent(void); STATIC char *findcwd(char *); STATIC void updatepwd(char *); -STATIC char *getpwd2(char *, size_t); +STATIC char *getpwd2(void); STATIC char *curdir = NULL; /* current working directory */ STATIC char *prevdir; /* previous working directory */ @@ -79,8 +79,8 @@ STATIC char *cdcomppath; int cdcmd(int argc, char **argv) { - char *dest; - char *path; + const char *dest; + const char *path; char *p; struct stat statb; int ch, phys, print = 0; @@ -263,10 +263,8 @@ findcwd(char *dir) * any more because we traversed a symbolic link or something * we couldn't stat(). */ - if (dir == NULL || curdir == NULL) { - p = stalloc(PATH_MAX); - return getpwd2(p, PATH_MAX); - } + if (dir == NULL || curdir == NULL) + return getpwd2(); cdcomppath = stalloc(strlen(dir) + 1); scopy(dir, cdcomppath); STARTSTACKSTR(new); @@ -313,7 +311,7 @@ updatepwd(char *dir) int pwdcmd(int argc, char **argv) { - char buf[PATH_MAX]; + char *p; int ch, phys; optreset = 1; optind = 1; opterr = 0; /* initialize getopt */ @@ -341,9 +339,9 @@ pwdcmd(int argc, char **argv) out1str(curdir); out1c('\n'); } else { - if (getcwd(buf, sizeof(buf)) == NULL) + if ((p = getpwd2()) == NULL) error(".: %s", strerror(errno)); - out1str(buf); + out1str(p); out1c('\n'); } @@ -356,36 +354,45 @@ pwdcmd(int argc, char **argv) char * getpwd(void) { - char buf[PATH_MAX]; char *p; if (curdir) return curdir; - p = getpwd2(buf, sizeof(buf)); + p = getpwd2(); if (p != NULL) curdir = savestr(p); return curdir; } +#define MAXPWD 256 + /* * Return the current directory. */ STATIC char * -getpwd2(char *buf, size_t size) +getpwd2(void) { - if (getcwd(buf, size) == NULL) { - char *pwd = getenv("PWD"); - struct stat stdot, stpwd; + struct stat stdot, stpwd; + char *pwd; + int i; - if (pwd && *pwd == '/' && stat(".", &stdot) != -1 && - stat(pwd, &stpwd) != -1 && - stdot.st_dev == stpwd.st_dev && - stdot.st_ino == stpwd.st_ino) { + for (i = MAXPWD;; i *= 2) { + pwd = stalloc(i); + if (getcwd(pwd, i) != NULL) return pwd; - } - return NULL; + stunalloc(pwd); + if (errno != ERANGE) + break; } - return buf; + + pwd = getenv("PWD"); + if (pwd && *pwd == '/' && stat(".", &stdot) != -1 && + stat(pwd, &stpwd) != -1 && + stdot.st_dev == stpwd.st_dev && + stdot.st_ino == stpwd.st_ino) { + return pwd; + } + return NULL; } diff --git a/bin/sh/error.c b/bin/sh/error.c index 0c981a3eff92..1f981f061ae6 100644 --- a/bin/sh/error.c +++ b/bin/sh/error.c @@ -67,17 +67,21 @@ volatile sig_atomic_t intpending; char *commandname; -static void exverror(int, const char *, va_list) __printf0like(2, 0); +static void exverror(int, const char *, va_list) __printf0like(2, 0) __dead2; /* * Called to raise an exception. Since C doesn't include exceptions, we * just do a longjmp to the exception handler. The type of exception is * stored in the global variable "exception". + * + * Interrupts are disabled; they should be reenabled when the exception is + * caught. */ void exraise(int e) { + INTOFF; if (handler == NULL) abort(); exception = e; @@ -138,8 +142,15 @@ onint(void) static void exverror(int cond, const char *msg, va_list ap) { - CLEAR_PENDING_INT; - INTOFF; + /* + * An interrupt trumps an error. Certain places catch error + * exceptions or transform them to a plain nonzero exit code + * in child processes, and if an error exception can be handled, + * an interrupt can be handled as well. + * + * exraise() will disable interrupts for the exception handler. + */ + FORCEINTON; #ifdef DEBUG if (msg) @@ -149,8 +160,8 @@ exverror(int cond, const char *msg, va_list ap) #endif if (msg) { if (commandname) - outfmt(&errout, "%s: ", commandname); - doformat(&errout, msg, ap); + outfmt(out2, "%s: ", commandname); + doformat(out2, msg, ap); out2c('\n'); } flushall(); diff --git a/bin/sh/error.h b/bin/sh/error.h index 4611821644dd..8b64fe6813d8 100644 --- a/bin/sh/error.h +++ b/bin/sh/error.h @@ -72,14 +72,16 @@ extern volatile sig_atomic_t intpending; #define INTOFF suppressint++ #define INTON { if (--suppressint == 0 && intpending) onint(); } +#define is_int_on() suppressint +#define SETINTON(s) suppressint = (s) #define FORCEINTON {suppressint = 0; if (intpending) onint();} #define CLEAR_PENDING_INT intpending = 0 #define int_pending() intpending -void exraise(int); +void exraise(int) __dead2; void onint(void); -void error(const char *, ...) __printf0like(1, 2); -void exerror(int, const char *, ...) __printf0like(2, 3); +void error(const char *, ...) __printf0like(1, 2) __dead2; +void exerror(int, const char *, ...) __printf0like(2, 3) __dead2; /* diff --git a/bin/sh/eval.c b/bin/sh/eval.c index 7978b84f051e..30e05b8b6435 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -74,7 +74,7 @@ __FBSDID("$FreeBSD$"); #endif -MKINIT int evalskip; /* set if we are skipping commands */ +int evalskip; /* set if we are skipping commands */ STATIC int skipcount; /* number of levels to skip */ MKINIT int loopnest; /* current loop nesting level */ int funcnest; /* depth of function calls */ @@ -407,8 +407,7 @@ evalsubshell(union node *n, int flags) flags &=~ EV_TESTED; redirect(n->nredir.redirect, 0); evaltree(n->nredir.n, flags | EV_EXIT); /* never returns */ - } - if (! backgnd) { + } else if (! backgnd) { INTOFF; exitstatus = waitforjob(jp, (int *)NULL); INTON; @@ -593,6 +592,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) char *savecmdname; struct shparam saveparam; struct localvar *savelocalvars; + struct parsefile *savetopfile; volatile int e; char *lastarg; int realstatus; @@ -646,7 +646,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) out2str(ps4val()); for (sp = varlist.list ; sp ; sp = sp->next) { if (sep != 0) - outc(' ', &errout); + out2c(' '); p = sp->text; while (*p != '=' && *p != '\0') out2c(*p++); @@ -658,7 +658,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) } for (sp = arglist.list ; sp ; sp = sp->next) { if (sep != 0) - outc(' ', &errout); + out2c(' '); /* Disambiguate command looking like assignment. */ if (sp == arglist.list && strchr(sp->text, '=') != NULL && @@ -670,7 +670,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) out2qstr(sp->text); sep = ' '; } - outc('\n', &errout); + out2c('\n'); flushout(&errout); } @@ -713,12 +713,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) do_clearcmdentry = 1; } - find_command(argv[0], &cmdentry, 1, path); - if (cmdentry.cmdtype == CMDUNKNOWN) { /* command not found */ - exitstatus = 127; - flushout(&errout); - return; - } + find_command(argv[0], &cmdentry, 0, path); /* implement the bltin builtin here */ if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == BLTINCMD) { for (;;) { @@ -727,10 +722,10 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) break; if ((cmdentry.u.index = find_builtin(*argv, &cmdentry.special)) < 0) { - outfmt(&errout, "%s: not found\n", *argv); - exitstatus = 127; - flushout(&errout); - return; + cmdentry.u.index = BLTINCMD; + argv--; + argc++; + break; } if (cmdentry.u.index != BLTINCMD) break; @@ -740,7 +735,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) /* Fork off a child process if necessary. */ if (cmd->ncmd.backgnd - || (cmdentry.cmdtype == CMDNORMAL + || ((cmdentry.cmdtype == CMDNORMAL || cmdentry.cmdtype == CMDUNKNOWN) && ((flags & EV_EXIT) == 0 || have_traps())) || ((flags & EV_BACKCMD) != 0 && (cmdentry.cmdtype != CMDBUILTIN @@ -786,7 +781,6 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) savelocalvars = localvars; localvars = NULL; reffunc(cmdentry.u.func); - INTON; savehandler = handler; if (setjmp(jmploc.loc)) { if (exception == EXSHELLPROC) @@ -798,19 +792,20 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) unreffunc(cmdentry.u.func); poplocalvars(); localvars = savelocalvars; + funcnest--; handler = savehandler; longjmp(handler->loc, 1); } handler = &jmploc; + funcnest++; + INTON; for (sp = varlist.list ; sp ; sp = sp->next) mklocal(sp->text); - funcnest++; exitstatus = oexitstatus; if (flags & EV_TESTED) evaltree(getfuncnode(cmdentry.u.func), EV_TESTED); else evaltree(getfuncnode(cmdentry.u.func), 0); - funcnest--; INTOFF; unreffunc(cmdentry.u.func); poplocalvars(); @@ -818,6 +813,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) freeparam(&shellparam); shellparam = saveparam; handler = savehandler; + funcnest--; popredir(); INTON; if (evalskip == SKIPFUNC) { @@ -836,8 +832,10 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) memout.nextc = memout.buf; memout.bufsize = 64; mode |= REDIR_BACKQ; + cmdentry.special = 0; } savecmdname = commandname; + savetopfile = getcurrentfile(); cmdenviron = varlist.list; e = -1; savehandler = handler; @@ -852,7 +850,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) listsetvar(cmdenviron); commandname = argv[0]; argptr = argv + 1; - optptr = NULL; /* initialize nextopt */ + nextopt_optptr = NULL; /* initialize nextopt */ builtin_flags = flags; exitstatus = (*builtinfunc[cmdentry.u.index])(argc, argv); flushall(); @@ -868,24 +866,25 @@ cmddone: } } handler = savehandler; - if (e != -1) { - if ((e != EXERROR && e != EXEXEC) - || cmdentry.special) - exraise(e); - FORCEINTON; - } - if (cmdentry.u.index != EXECCMD) - popredir(); if (flags == EV_BACKCMD) { backcmd->buf = memout.buf; backcmd->nleft = memout.nextc - memout.buf; memout.buf = NULL; } + if (e != -1) { + if ((e != EXERROR && e != EXEXEC) + || cmdentry.special) + exraise(e); + popfilesupto(savetopfile); + if (flags != EV_BACKCMD) + FORCEINTON; + } + if (cmdentry.u.index != EXECCMD) + popredir(); } else { #ifdef DEBUG trputs("normal command: "); trargs(argv); #endif - clearredir(); redirect(cmd->ncmd.redirect, 0); for (sp = varlist.list ; sp ; sp = sp->next) setvareq(sp->text, VEXPORT|VSTACK); @@ -946,12 +945,17 @@ prehash(union node *n) */ /* - * No command given, or a bltin command with no arguments. + * No command given, a bltin command with no arguments, or a bltin command + * with an invalid name. */ int -bltincmd(int argc __unused, char **argv __unused) +bltincmd(int argc, char **argv) { + if (argc > 1) { + out2fmt_flush("%s: not found\n", argv[1]); + return 127; + } /* * Preserve exitstatus of a previous possible redirection * as POSIX mandates @@ -1026,7 +1030,7 @@ commandcmd(int argc, char **argv) if (cmd != -1) { if (argc != 1) error("wrong number of arguments"); - return typecmd_impl(2, argv - 1, cmd); + return typecmd_impl(2, argv - 1, cmd, path); } if (argc != 0) { old = handler; diff --git a/bin/sh/eval.h b/bin/sh/eval.h index c82585ea888f..bf987828d0cb 100644 --- a/bin/sh/eval.h +++ b/bin/sh/eval.h @@ -35,6 +35,7 @@ extern char *commandname; /* currently executing command */ extern int exitstatus; /* exit status of last command */ +extern int oexitstatus; /* saved exit status */ extern struct strlist *cmdenviron; /* environment for builtin command */ diff --git a/bin/sh/exec.c b/bin/sh/exec.c index 810782166a9f..a28ab0364a50 100644 --- a/bin/sh/exec.c +++ b/bin/sh/exec.c @@ -98,7 +98,7 @@ int exerrno = 0; /* Last exec error */ STATIC void tryexec(char *, char **, char **); STATIC void printentry(struct tblentry *, int); -STATIC struct tblentry *cmdlookup(char *, int); +STATIC struct tblentry *cmdlookup(const char *, int); STATIC void delete_cmd_entry(void); @@ -109,7 +109,7 @@ STATIC void delete_cmd_entry(void); */ void -shellexec(char **argv, char **envp, char *path, int index) +shellexec(char **argv, char **envp, const char *path, int idx) { char *cmdname; int e; @@ -120,7 +120,7 @@ shellexec(char **argv, char **envp, char *path, int index) } else { e = ENOENT; while ((cmdname = padvance(&path, argv[0])) != NULL) { - if (--index < 0 && pathopt == NULL) { + if (--idx < 0 && pathopt == NULL) { tryexec(cmdname, argv, envp); if (errno != ENOENT && errno != ENOTDIR) e = errno; @@ -175,13 +175,13 @@ tryexec(char *cmd, char **argv, char **envp) * NULL. */ -char *pathopt; +const char *pathopt; char * -padvance(char **path, char *name) +padvance(const char **path, const char *name) { - char *p, *q; - char *start; + const char *p, *start; + char *q; int len; if (*path == NULL) @@ -255,7 +255,7 @@ hashcmd(int argc __unused, char **argv __unused) if (cmdp != NULL) printentry(cmdp, verbose); else - outfmt(&errout, "%s: not found\n", name); + outfmt(out2, "%s: not found\n", name); } flushall(); } @@ -268,17 +268,17 @@ hashcmd(int argc __unused, char **argv __unused) STATIC void printentry(struct tblentry *cmdp, int verbose) { - int index; - char *path; + int idx; + const char *path; char *name; if (cmdp->cmdtype == CMDNORMAL) { - index = cmdp->param.index; + idx = cmdp->param.index; path = pathval(); do { name = padvance(&path, cmdp->cmdname); stunalloc(name); - } while (--index >= 0); + } while (--idx >= 0); out1str(name); } else if (cmdp->cmdtype == CMDBUILTIN) { out1fmt("builtin %s", cmdp->cmdname); @@ -310,10 +310,11 @@ printentry(struct tblentry *cmdp, int verbose) */ void -find_command(char *name, struct cmdentry *entry, int printerr, char *path) +find_command(const char *name, struct cmdentry *entry, int printerr, + const char *path) { struct tblentry *cmdp; - int index; + int idx; int prev; char *fullname; struct stat statb; @@ -353,11 +354,11 @@ find_command(char *name, struct cmdentry *entry, int printerr, char *path) } e = ENOENT; - index = -1; + idx = -1; loop: while ((fullname = padvance(&path, name)) != NULL) { stunalloc(fullname); - index++; + idx++; if (pathopt) { if (prefix("builtin", pathopt)) { if ((i = find_builtin(name, &spec)) < 0) @@ -376,8 +377,8 @@ loop: } } /* if rehash, don't redo absolute path names */ - if (fullname[0] == '/' && index <= prev) { - if (index < prev) + if (fullname[0] == '/' && idx <= prev) { + if (idx < prev) goto loop; TRACE(("searchexec \"%s\": no change\n", name)); goto success; @@ -414,7 +415,7 @@ loop: INTOFF; cmdp = cmdlookup(name, 1); cmdp->cmdtype = CMDNORMAL; - cmdp->param.index = index; + cmdp->param.index = idx; INTON; goto success; } @@ -429,6 +430,7 @@ loop: outfmt(out2, "%s: %s\n", name, strerror(e)); } entry->cmdtype = CMDUNKNOWN; + entry->u.index = 0; return; success: @@ -445,7 +447,7 @@ success: */ int -find_builtin(char *name, int *special) +find_builtin(const char *name, int *special) { const struct builtincmd *bp; @@ -492,18 +494,18 @@ void changepath(const char *newval) { const char *old, *new; - int index; + int idx; int firstchange; int bltin; old = pathval(); new = newval; firstchange = 9999; /* assume no change */ - index = 0; + idx = 0; bltin = -1; for (;;) { if (*old != *new) { - firstchange = index; + firstchange = idx; if ((*old == '\0' && *new == ':') || (*old == ':' && *new == '\0')) firstchange++; @@ -512,9 +514,9 @@ changepath(const char *newval) if (*new == '\0') break; if (*new == '%' && bltin < 0 && prefix("builtin", new + 1)) - bltin = index; + bltin = idx; if (*new == ':') { - index++; + idx++; } new++, old++; } @@ -607,10 +609,10 @@ STATIC struct tblentry **lastcmdentry; STATIC struct tblentry * -cmdlookup(char *name, int add) +cmdlookup(const char *name, int add) { int hashval; - char *p; + const char *p; struct tblentry *cmdp; struct tblentry **pp; @@ -663,7 +665,7 @@ delete_cmd_entry(void) */ void -addcmdentry(char *name, struct cmdentry *entry) +addcmdentry(const char *name, struct cmdentry *entry) { struct tblentry *cmdp; @@ -683,7 +685,7 @@ addcmdentry(char *name, struct cmdentry *entry) */ void -defun(char *name, union node *func) +defun(const char *name, union node *func) { struct cmdentry entry; @@ -700,7 +702,7 @@ defun(char *name, union node *func) */ int -unsetfunc(char *name) +unsetfunc(const char *name) { struct tblentry *cmdp; @@ -718,19 +720,21 @@ unsetfunc(char *name) */ int -typecmd_impl(int argc, char **argv, int cmd) +typecmd_impl(int argc, char **argv, int cmd, const char *path) { struct cmdentry entry; struct tblentry *cmdp; - char **pp; + const char *const *pp; struct alias *ap; int i; - int error = 0; - extern char *const parsekwd[]; + int error1 = 0; + + if (path != pathval()) + clearcmdentry(0); for (i = 1; i < argc; i++) { /* First look at the keywords */ - for (pp = (char **)parsekwd; *pp; pp++) + for (pp = parsekwd; *pp; pp++) if (**pp == *argv[i] && equal(*pp, argv[i])) break; @@ -760,16 +764,17 @@ typecmd_impl(int argc, char **argv, int cmd) } else { /* Finally use brute force */ - find_command(argv[i], &entry, 0, pathval()); + find_command(argv[i], &entry, 0, path); } switch (entry.cmdtype) { case CMDNORMAL: { if (strchr(argv[i], '/') == NULL) { - char *path = pathval(), *name; + const char *path2 = path; + char *name; int j = entry.u.index; do { - name = padvance(&path, argv[i]); + name = padvance(&path2, argv[i]); stunalloc(name); } while (--j >= 0); if (cmd == TYPECMD_SMALLV) @@ -790,7 +795,7 @@ typecmd_impl(int argc, char **argv, int cmd) if (cmd != TYPECMD_SMALLV) outfmt(out2, "%s: %s\n", argv[i], strerror(errno)); - error |= 127; + error1 |= 127; } } break; @@ -815,11 +820,15 @@ typecmd_impl(int argc, char **argv, int cmd) default: if (cmd != TYPECMD_SMALLV) outfmt(out2, "%s: not found\n", argv[i]); - error |= 127; + error1 |= 127; break; } } - return error; + + if (path != pathval()) + clearcmdentry(0); + + return error1; } /* @@ -829,5 +838,5 @@ typecmd_impl(int argc, char **argv, int cmd) int typecmd(int argc, char **argv) { - return typecmd_impl(argc, argv, TYPECMD_TYPE); + return typecmd_impl(argc, argv, TYPECMD_TYPE, bltinlookup("PATH", 1)); } diff --git a/bin/sh/exec.h b/bin/sh/exec.h index e3b9acdd84d7..32bf13168342 100644 --- a/bin/sh/exec.h +++ b/bin/sh/exec.h @@ -57,20 +57,20 @@ struct cmdentry { }; -extern char *pathopt; /* set by padvance */ +extern const char *pathopt; /* set by padvance */ extern int exerrno; /* last exec error */ -void shellexec(char **, char **, char *, int); -char *padvance(char **, char *); +void shellexec(char **, char **, const char *, int) __dead2; +char *padvance(const char **, const char *); int hashcmd(int, char **); -void find_command(char *, struct cmdentry *, int, char *); -int find_builtin(char *, int *); +void find_command(const char *, struct cmdentry *, int, const char *); +int find_builtin(const char *, int *); void hashcd(void); void changepath(const char *); void deletefuncs(void); -void addcmdentry(char *, struct cmdentry *); -void defun(char *, union node *); -int unsetfunc(char *); -int typecmd_impl(int, char **, int); +void addcmdentry(const char *, struct cmdentry *); +void defun(const char *, union node *); +int unsetfunc(const char *); +int typecmd_impl(int, char **, int, const char *); int typecmd(int, char **); void clearcmdentry(int); diff --git a/bin/sh/expand.c b/bin/sh/expand.c index 700fa0a9f910..876cde163f60 100644 --- a/bin/sh/expand.c +++ b/bin/sh/expand.c @@ -107,7 +107,7 @@ STATIC void expmeta(char *, char *); STATIC void addfname(char *); STATIC struct strlist *expsort(struct strlist *); STATIC struct strlist *msort(struct strlist *, int); -STATIC int pmatch(char *, char *, int); +STATIC int pmatch(const char *, const char *, int); STATIC char *cvtnum(int, char *); STATIC int collate_range_cmp(int, int); @@ -271,8 +271,13 @@ exptilde(char *p, int flag) while ((c = *p) != '\0') { switch(c) { - case CTLESC: - return (startp); + case CTLESC: /* This means CTL* are always considered quoted. */ + case CTLVAR: + case CTLENDVAR: + case CTLBACKQ: + case CTLBACKQ | CTLQUOTE: + case CTLARI: + case CTLENDARI: case CTLQUOTEMARK: return (startp); case ':': @@ -521,7 +526,7 @@ subevalvar(char *p, char *str, int strloc, int subtype, int startloc, case VSQUESTION: if (*p != CTLENDVAR) { - outfmt(&errout, "%s\n", startp); + outfmt(out2, "%s\n", startp); error((char *)NULL); } error("%.*s: parameter %snot set", (int)(p - str - 1), @@ -657,7 +662,7 @@ again: /* jump here after setting a variable with ${var=text} */ } varlen = 0; startloc = expdest - stackblock(); - if (!set && uflag) { + if (!set && uflag && *var != '@' && *var != '*') { switch (subtype) { case VSNORMAL: case VSTRIMLEFT: @@ -850,7 +855,6 @@ varvalue(char *name, int quoted, int subtype, int flag) int num; char *p; int i; - extern int oexitstatus; char sep; char **ap; char const *syntax; @@ -974,7 +978,7 @@ ifsbreakup(char *string, struct arglist *arglist) char *start; char *p; char *q; - char *ifs; + const char *ifs; const char *ifsspc; int had_param_ch = 0; @@ -1338,7 +1342,7 @@ msort(struct strlist *list, int len) */ int -patmatch(char *pattern, char *string, int squoted) +patmatch(const char *pattern, const char *string, int squoted) { #ifdef notdef if (pattern[0] == '!' && pattern[1] == '!') @@ -1350,9 +1354,9 @@ patmatch(char *pattern, char *string, int squoted) STATIC int -pmatch(char *pattern, char *string, int squoted) +pmatch(const char *pattern, const char *string, int squoted) { - char *p, *q; + const char *p, *q; char c; p = pattern; @@ -1400,7 +1404,7 @@ pmatch(char *pattern, char *string, int squoted) } while (*q++ != '\0'); return 0; case '[': { - char *endp; + const char *endp; int invert, found; char chr; @@ -1504,7 +1508,7 @@ rmescapes(char *str) */ int -casematch(union node *pattern, char *val) +casematch(union node *pattern, const char *val) { struct stackmark smark; int result; diff --git a/bin/sh/expand.h b/bin/sh/expand.h index 2b895193d57a..a3e079a206ac 100644 --- a/bin/sh/expand.h +++ b/bin/sh/expand.h @@ -58,7 +58,7 @@ union node; void expandhere(union node *, int); void expandarg(union node *, struct arglist *, int); void expari(int); -int patmatch(char *, char *, int); +int patmatch(const char *, const char *, int); void rmescapes(char *); -int casematch(union node *, char *); +int casematch(union node *, const char *); int wordexpcmd(int, char **); diff --git a/bin/sh/histedit.c b/bin/sh/histedit.c index 32b0448d2b3a..cdde09ac8e57 100644 --- a/bin/sh/histedit.c +++ b/bin/sh/histedit.c @@ -92,7 +92,7 @@ histedit(void) if (hist != NULL) sethistsize(histsizeval()); else - out2str("sh: can't initialize history\n"); + out2fmt_flush("sh: can't initialize history\n"); } if (editing && !el && isatty(0)) { /* && isatty(2) ??? */ /* @@ -114,7 +114,7 @@ histedit(void) el_set(el, EL_PROMPT, getprompt); } else { bad: - out2str("sh: can't initialize editing\n"); + out2fmt_flush("sh: can't initialize editing\n"); } INTON; } else if (!editing && el) { @@ -164,19 +164,19 @@ int histcmd(int argc, char **argv) { int ch; - char *editor = NULL; + const char *editor = NULL; HistEvent he; int lflg = 0, nflg = 0, rflg = 0, sflg = 0; int i, retval; - char *firststr, *laststr; + const char *firststr, *laststr; int first, last, direction; - char *pat = NULL, *repl; + char *pat = NULL, *repl = NULL; static int active = 0; struct jmploc jmploc; struct jmploc *savehandler; char editfilestr[PATH_MAX]; char *volatile editfile; - FILE *efp; + FILE *efp = NULL; int oldhistnum; if (hist == NULL) @@ -336,6 +336,7 @@ histcmd(int argc, char **argv) if (sflg) { if (displayhist) { out2str(s); + flushout(out2); } evalstring(s, 0); if (displayhist && hist) { @@ -405,7 +406,7 @@ fc_replace(const char *s, char *p, char *r) } int -not_fcnumber(char *s) +not_fcnumber(const char *s) { if (s == NULL) return (0); @@ -415,10 +416,10 @@ not_fcnumber(char *s) } int -str_to_event(char *str, int last) +str_to_event(const char *str, int last) { HistEvent he; - char *s = str; + const char *s = str; int relative = 0; int i, retval; diff --git a/bin/sh/input.c b/bin/sh/input.c index f709b8c0218b..c801e62dd37a 100644 --- a/bin/sh/input.c +++ b/bin/sh/input.c @@ -93,7 +93,7 @@ struct parsefile { int plinno = 1; /* input line number */ -MKINIT int parsenleft; /* copy of parsefile->nleft */ +int parsenleft; /* copy of parsefile->nleft */ MKINIT int parselleft; /* copy of parsefile->lleft */ char *parsenextc; /* copy of parsefile->nextc */ MKINIT struct parsefile basepf; /* top level input file */ @@ -111,9 +111,9 @@ static int preadfd(void); INCLUDE "input.h" INCLUDE "error.h" -INIT { - extern char basebuf[]; +MKINIT char basebuf[]; +INIT { basepf.nextc = basepf.buf = basebuf; } @@ -215,7 +215,7 @@ retry: if (flags >= 0 && flags & O_NONBLOCK) { flags &=~ O_NONBLOCK; if (fcntl(0, F_SETFL, flags) >= 0) { - out2str("sh: turning off NDELAY mode\n"); + out2fmt_flush("sh: turning off NDELAY mode\n"); goto retry; } } @@ -359,7 +359,7 @@ pushstring(char *s, int len, void *ap) struct strpush *sp; INTOFF; -/*dprintf("*** calling pushstring: %s, %d\n", s, len);*/ +/*out2fmt_flush("*** calling pushstring: %s, %d\n", s, len);*/ if (parsefile->strpush) { sp = ckmalloc(sizeof (struct strpush)); sp->prev = parsefile->strpush; @@ -386,7 +386,7 @@ popstring(void) parsenextc = sp->prevstring; parsenleft = sp->prevnleft; parselleft = sp->prevlleft; -/*dprintf("*** calling popstring: restoring to '%s'\n", parsenextc);*/ +/*out2fmt_flush("*** calling popstring: restoring to '%s'\n", parsenextc);*/ if (sp->ap) sp->ap->flag &= ~ALIASINUSE; parsefile->strpush = sp->prev; @@ -401,7 +401,7 @@ popstring(void) */ void -setinputfile(char *fname, int push) +setinputfile(const char *fname, int push) { int fd; int fd2; @@ -508,6 +508,32 @@ popfile(void) } +/* + * Return current file (to go back to it later using popfilesupto()). + */ + +struct parsefile * +getcurrentfile(void) +{ + return parsefile; +} + + +/* + * Pop files until the given file is on top again. Useful for regular + * builtins that read shell commands from files or strings. + * If the given file is not an active file, an error is raised. + */ + +void +popfilesupto(struct parsefile *file) +{ + while (parsefile != file && parsefile != &basepf) + popfile(); + if (parsefile != file) + error("popfilesupto() misused"); +} + /* * Return to top level. */ diff --git a/bin/sh/input.h b/bin/sh/input.h index 4d57b3bf0518..abbb2ce5fc59 100644 --- a/bin/sh/input.h +++ b/bin/sh/input.h @@ -45,6 +45,8 @@ extern int parsenleft; /* number of characters left in input buffer */ extern char *parsenextc; /* next character in input buffer */ extern int init_editline; /* 0 == not setup, 1 == OK, -1 == failed */ +struct parsefile; + char *pfgets(char *, int); int pgetc(void); int preadbuffer(void); @@ -52,10 +54,12 @@ int preadateof(void); void pungetc(void); void pushstring(char *, int, void *); void popstring(void); -void setinputfile(char *, int); +void setinputfile(const char *, int); void setinputfd(int, int); void setinputstring(char *, int); void popfile(void); +struct parsefile *getcurrentfile(void); +void popfilesupto(struct parsefile *); void popallfiles(void); void closescript(void); diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index be9acab565a4..6ba951cd9292 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -92,7 +92,7 @@ STATIC struct job *getjob(char *); STATIC pid_t dowait(int, struct job *); STATIC pid_t waitproc(int, int *); STATIC void cmdtxt(union node *); -STATIC void cmdputs(char *); +STATIC void cmdputs(const char *); #if JOBS STATIC void setcurjob(struct job *); STATIC void deljob(struct job *); @@ -146,7 +146,7 @@ setjobctl(int on) do { /* while we are in the background */ initialpgrp = tcgetpgrp(ttyfd); if (initialpgrp < 0) { -out: out2str("sh: can't access tty; job control turned off\n"); +out: out2fmt_flush("sh: can't access tty; job control turned off\n"); mflag = 0; return; } @@ -757,6 +757,7 @@ forkshell(struct job *jp, union node *n, int mode) TRACE(("Child shell %d\n", (int)getpid())); wasroot = rootshell; rootshell = 0; + handler = &main_handler; closescript(); INTON; clear_traps(); @@ -1046,7 +1047,7 @@ stoppedjobs(void) if (jp->used == 0) continue; if (jp->state == JOBSTOPPED) { - out2str("You have stopped jobs.\n"); + out2fmt_flush("You have stopped jobs.\n"); job_warning = 2; return (1); } @@ -1082,7 +1083,7 @@ cmdtxt(union node *n) { union node *np; struct nodelist *lp; - char *p; + const char *p; int i; char s[2]; @@ -1211,9 +1212,10 @@ redir: STATIC void -cmdputs(char *s) +cmdputs(const char *s) { - char *p, *q; + const char *p; + char *q; char c; int subtype = 0; diff --git a/bin/sh/mail.c b/bin/sh/mail.c index fe03a730bce2..0ba7be530f40 100644 --- a/bin/sh/mail.c +++ b/bin/sh/mail.c @@ -72,7 +72,7 @@ void chkmail(int silent) { int i; - char *mpath; + const char *mpath; char *p; char *q; struct stackmark smark; diff --git a/bin/sh/main.c b/bin/sh/main.c index 85a6d20ee457..50a88132ab37 100644 --- a/bin/sh/main.c +++ b/bin/sh/main.c @@ -75,8 +75,9 @@ __FBSDID("$FreeBSD$"); int rootpid; int rootshell; +struct jmploc main_handler; -STATIC void read_profile(char *); +STATIC void read_profile(const char *); STATIC char *find_dot_file(char *); /* @@ -90,14 +91,13 @@ STATIC char *find_dot_file(char *); int main(int argc, char *argv[]) { - struct jmploc jmploc; struct stackmark smark; volatile int state; char *shinit; (void) setlocale(LC_ALL, ""); state = 0; - if (setjmp(jmploc.loc)) { + if (setjmp(main_handler.loc)) { /* * When a shell procedure is executed, we raise the * exception EXSHELLPROC to clean up before executing @@ -143,7 +143,7 @@ main(int argc, char *argv[]) else goto state4; } - handler = &jmploc; + handler = &main_handler; #ifdef DEBUG opentrace(); trputs("Shell args: "); trargs(argv); @@ -154,9 +154,11 @@ main(int argc, char *argv[]) setstackmark(&smark); procargs(argc, argv); if (getpwd() == NULL && iflag) - out2str("sh: cannot determine working directory\n"); + out2fmt_flush("sh: cannot determine working directory\n"); if (getpwd() != NULL) setvar ("PWD", getpwd(), VEXPORT); + if (iflag) + chkmail(1); if (argv[0] && argv[0][0] == '-') { state = 1; read_profile("/etc/profile"); @@ -223,7 +225,7 @@ cmdloop(int top) if (!stoppedjobs()) { if (!Iflag) break; - out2str("\nUse \"exit\" to leave shell.\n"); + out2fmt_flush("\nUse \"exit\" to leave shell.\n"); } numeof++; } else if (n != NULL && nflag == 0) { @@ -248,7 +250,7 @@ cmdloop(int top) */ STATIC void -read_profile(char *name) +read_profile(const char *name) { int fd; @@ -269,7 +271,7 @@ read_profile(char *name) */ void -readcmdfile(char *name) +readcmdfile(const char *name) { int fd; @@ -296,7 +298,7 @@ find_dot_file(char *basename) { static char localname[FILENAME_MAX+1]; char *fullname; - char *path = pathval(); + const char *path = pathval(); struct stat statb; /* don't try this for absolute or relative paths */ @@ -315,7 +317,6 @@ find_dot_file(char *basename) int dotcmd(int argc, char **argv) { - struct strlist *sp; char *fullname; if (argc < 2) @@ -323,9 +324,6 @@ dotcmd(int argc, char **argv) exitstatus = 0; - for (sp = cmdenviron; sp ; sp = sp->next) - setvareq(savestr(sp->text), VSTRFIXED|VTEXTFIXED); - fullname = find_dot_file(argv[1]); setinputfile(fullname, 1); commandname = fullname; @@ -338,8 +336,6 @@ dotcmd(int argc, char **argv) int exitcmd(int argc, char **argv) { - extern int oexitstatus; - if (stoppedjobs()) return 0; if (argc > 1) diff --git a/bin/sh/main.h b/bin/sh/main.h index 7f8c3940b602..c5e8bfd38405 100644 --- a/bin/sh/main.h +++ b/bin/sh/main.h @@ -35,8 +35,9 @@ extern int rootpid; /* pid of main shell */ extern int rootshell; /* true if we aren't a child of the main shell */ +extern struct jmploc main_handler; /* top level exception handler */ -void readcmdfile(char *); +void readcmdfile(const char *); void cmdloop(int); int dotcmd(int, char **); int exitcmd(int, char **); diff --git a/bin/sh/memalloc.c b/bin/sh/memalloc.c index fa03632f6861..9d5332ffa745 100644 --- a/bin/sh/memalloc.c +++ b/bin/sh/memalloc.c @@ -95,7 +95,7 @@ ckfree(pointer p) */ char * -savestr(char *s) +savestr(const char *s) { char *p; diff --git a/bin/sh/memalloc.h b/bin/sh/memalloc.h index 4652e5411593..187d4c855afb 100644 --- a/bin/sh/memalloc.h +++ b/bin/sh/memalloc.h @@ -51,7 +51,7 @@ extern int herefd; pointer ckmalloc(size_t); pointer ckrealloc(pointer, int); void ckfree(pointer); -char *savestr(char *); +char *savestr(const char *); pointer stalloc(int); void stunalloc(pointer); void setstackmark(struct stackmark *); diff --git a/bin/sh/miscbltin.c b/bin/sh/miscbltin.c index a663c7535a55..cc525b8ccbd1 100644 --- a/bin/sh/miscbltin.c +++ b/bin/sh/miscbltin.c @@ -93,7 +93,7 @@ readcmd(int argc __unused, char **argv __unused) char c; int rflag; char *prompt; - char *ifs; + const char *ifs; char *p; int startword; int status; @@ -254,7 +254,7 @@ readcmd(int argc __unused, char **argv __unused) int -umaskcmd(int argc __unused, char **argv) +umaskcmd(int argc __unused, char **argv __unused) { char *ap; int mask; diff --git a/bin/sh/mkbuiltins b/bin/sh/mkbuiltins index 7b77649de415..b78729ac9ea1 100755 --- a/bin/sh/mkbuiltins +++ b/bin/sh/mkbuiltins @@ -88,7 +88,7 @@ tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ < $temp | awk '{ printf "#define %s %d\n", $1, NR-1}' echo ' struct builtincmd { - char *name; + const char *name; int code; int special; }; diff --git a/bin/sh/mkinit.c b/bin/sh/mkinit.c index 022eed4eafc4..89385ffb740c 100644 --- a/bin/sh/mkinit.c +++ b/bin/sh/mkinit.c @@ -102,9 +102,9 @@ struct block { */ struct event { - char *name; /* name of event (e.g. INIT) */ - char *routine; /* name of routine called on event */ - char *comment; /* comment describing routine */ + const char *name; /* name of event (e.g. INIT) */ + const char *routine; /* name of routine called on event */ + const char *comment; /* comment describing routine */ struct text code; /* code for handling event */ }; @@ -140,7 +140,7 @@ struct event event[] = { }; -char *curfile; /* current file */ +const char *curfile; /* current file */ int linno; /* current line */ char *header_files[200]; /* list of header files */ struct text defines; /* #define statements */ @@ -148,20 +148,20 @@ struct text decls; /* declarations */ int amiddecls; /* for formatting */ -void readfile(char *); -int match(char *, char *); -int gooddefine(char *); -void doevent(struct event *, FILE *, char *); +void readfile(const char *); +int match(const char *, const char *); +int gooddefine(const char *); +void doevent(struct event *, FILE *, const char *); void doinclude(char *); void dodecl(char *, FILE *); void output(void); -void addstr(char *, struct text *); +void addstr(const char *, struct text *); void addchar(int, struct text *); void writetext(struct text *, FILE *); -FILE *ckfopen(char *, char *); +FILE *ckfopen(const char *, const char *); void *ckmalloc(size_t); -char *savestr(char *); -void error(char *); +char *savestr(const char *); +void error(const char *); #define equal(s1, s2) (strcmp(s1, s2) == 0) @@ -170,9 +170,9 @@ main(int argc __unused, char *argv[]) { char **ap; - header_files[0] = "\"shell.h\""; - header_files[1] = "\"mystring.h\""; - header_files[2] = "\"init.h\""; + header_files[0] = savestr("\"shell.h\""); + header_files[1] = savestr("\"mystring.h\""); + header_files[2] = savestr("\"init.h\""); for (ap = argv + 1 ; *ap ; ap++) readfile(*ap); output(); @@ -186,7 +186,7 @@ main(int argc __unused, char *argv[]) */ void -readfile(char *fname) +readfile(const char *fname) { FILE *fp; char line[1024]; @@ -230,9 +230,9 @@ readfile(char *fname) int -match(char *name, char *line) +match(const char *name, const char *line) { - char *p, *q; + const char *p, *q; p = name, q = line; while (*p) { @@ -246,9 +246,9 @@ match(char *name, char *line) int -gooddefine(char *line) +gooddefine(const char *line) { - char *p; + const char *p; if (! match("#define", line)) return 0; /* not a define */ @@ -269,11 +269,11 @@ gooddefine(char *line) void -doevent(struct event *ep, FILE *fp, char *fname) +doevent(struct event *ep, FILE *fp, const char *fname) { char line[1024]; int indent; - char *p; + const char *p; sprintf(line, "\n /* from %s: */\n", fname); addstr(line, &ep->code); @@ -407,7 +407,7 @@ output(void) */ void -addstr(char *s, struct text *text) +addstr(const char *s, struct text *text) { while (*s) { if (--text->nleft < 0) @@ -452,7 +452,7 @@ writetext(struct text *text, FILE *fp) } FILE * -ckfopen(char *file, char *mode) +ckfopen(const char *file, const char *mode) { FILE *fp; @@ -474,7 +474,7 @@ ckmalloc(size_t nbytes) } char * -savestr(char *s) +savestr(const char *s) { char *p; @@ -484,7 +484,7 @@ savestr(char *s) } void -error(char *msg) +error(const char *msg) { if (curfile != NULL) fprintf(stderr, "%s:%d: ", curfile, linno); diff --git a/bin/sh/mksyntax.c b/bin/sh/mksyntax.c index f8fad0d6db53..28a018b21629 100644 --- a/bin/sh/mksyntax.c +++ b/bin/sh/mksyntax.c @@ -55,8 +55,8 @@ __FBSDID("$FreeBSD$"); struct synclass { - char *name; - char *comment; + const char *name; + const char *comment; }; /* Syntax classes */ @@ -101,16 +101,16 @@ static char writer[] = "\ static FILE *cfile; static FILE *hfile; -static char *syntax[513]; +static const char *syntax[513]; static int base; static int size; /* number of values which a char variable can have */ static int nbits; /* number of bits in a character */ static int digit_contig;/* true if digits are contiguous */ -static void filltable(char *); +static void filltable(const char *); static void init(void); -static void add(char *, char *); -static void print(char *); +static void add(const char *, const char *); +static void print(const char *); static void output_type_macros(void); static void digit_convert(void); @@ -259,7 +259,7 @@ main(int argc __unused, char **argv __unused) */ static void -filltable(char *dftval) +filltable(const char *dftval) { int i; @@ -293,7 +293,7 @@ init(void) */ static void -add(char *p, char *type) +add(const char *p, const char *type) { while (*p) syntax[*p++ + base] = type; @@ -306,7 +306,7 @@ add(char *p, char *type) */ static void -print(char *name) +print(const char *name) { int i; int col; @@ -338,7 +338,7 @@ print(char *name) * contiguous, we can test for them quickly. */ -static char *macro[] = { +static const char *macro[] = { "#define is_digit(c)\t((is_type+SYNBASE)[c] & ISDIGIT)", "#define is_eof(c)\t((c) == PEOF)", "#define is_alpha(c)\t(((c) < CTLESC || (c) > CTLQUOTEMARK) && isalpha((unsigned char) (c)))", @@ -351,7 +351,7 @@ static char *macro[] = { static void output_type_macros(void) { - char **pp; + const char **pp; if (digit_contig) macro[0] = "#define is_digit(c)\t((unsigned int)((c) - '0') <= 9)"; diff --git a/bin/sh/myhistedit.h b/bin/sh/myhistedit.h index 5d96587cdba2..f4fa37407285 100644 --- a/bin/sh/myhistedit.h +++ b/bin/sh/myhistedit.h @@ -39,7 +39,7 @@ extern int displayhist; void histedit(void); void sethistsize(const char *); int histcmd(int, char **); -int not_fcnumber(char *); -int str_to_event(char *, int); +int not_fcnumber(const char *); +int str_to_event(const char *, int); int bindcmd(int, char **); diff --git a/bin/sh/mystring.c b/bin/sh/mystring.c index 6eaacb35dc9b..53d703d55b59 100644 --- a/bin/sh/mystring.c +++ b/bin/sh/mystring.c @@ -108,7 +108,7 @@ int number(const char *s) { if (! is_number(s)) - error("Illegal number: %s", (char *)s); + error("Illegal number: %s", s); return atoi(s); } diff --git a/bin/sh/options.c b/bin/sh/options.c index fea95ca28c68..bde96aa7fb5a 100644 --- a/bin/sh/options.c +++ b/bin/sh/options.c @@ -64,7 +64,7 @@ char *arg0; /* value of $0 */ struct shparam shellparam; /* current positional parameters */ char **argptr; /* argument list for builtin commands */ char *shoptarg; /* set by nextopt (like getopt) */ -char *optptr; /* used by nextopt */ +char *nextopt_optptr; /* used by nextopt */ char *minusc; /* argument to -c option */ @@ -554,12 +554,13 @@ out: */ int -nextopt(char *optstring) +nextopt(const char *optstring) { - char *p, *q; + char *p; + const char *q; char c; - if ((p = optptr) == NULL || *p == '\0') { + if ((p = nextopt_optptr) == NULL || *p == '\0') { p = *argptr; if (p == NULL || *p != '-' || *++p == '\0') return '\0'; @@ -580,6 +581,6 @@ nextopt(char *optstring) shoptarg = p; p = NULL; } - optptr = p; + nextopt_optptr = p; return c; } diff --git a/bin/sh/options.h b/bin/sh/options.h index 3b827d16016d..5004549a2926 100644 --- a/bin/sh/options.h +++ b/bin/sh/options.h @@ -102,7 +102,7 @@ extern char *arg0; /* $0 */ extern struct shparam shellparam; /* $@ */ extern char **argptr; /* argument list for builtin commands */ extern char *shoptarg; /* set by nextopt */ -extern char *optptr; /* used by nextopt */ +extern char *nextopt_optptr; /* used by nextopt */ void procargs(int, char **); void optschanged(void); @@ -111,5 +111,5 @@ void freeparam(struct shparam *); int shiftcmd(int, char **); int setcmd(int, char **); int getoptscmd(int, char **); -int nextopt(char *); +int nextopt(const char *); void getoptsreset(const char *); diff --git a/bin/sh/output.c b/bin/sh/output.c index 0d55fdfcb28e..fd03e23fc170 100644 --- a/bin/sh/output.c +++ b/bin/sh/output.c @@ -71,7 +71,7 @@ __FBSDID("$FreeBSD$"); static int doformat_wr(void *, const char *, int); struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0}; -struct output errout = {NULL, 0, NULL, 100, 2, 0}; +struct output errout = {NULL, 0, NULL, 256, 2, 0}; struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0}; struct output *out1 = &output; struct output *out2 = &errout; @@ -124,8 +124,6 @@ outstr(const char *p, struct output *file) { while (*p) outc(*p++, file); - if (file == out2) - flushout(file); } /* Like outstr(), but quote for re-input into the shell. */ @@ -255,7 +253,7 @@ out1fmt(const char *fmt, ...) } void -dprintf(const char *fmt, ...) +out2fmt_flush(const char *fmt, ...) { va_list ap; @@ -316,7 +314,7 @@ doformat(struct output *dest, const char *f, va_list ap) */ int -xwrite(int fd, char *buf, int nbytes) +xwrite(int fd, const char *buf, int nbytes) { int ntry; int i; diff --git a/bin/sh/output.h b/bin/sh/output.h index bafd8687b159..345fe531c400 100644 --- a/bin/sh/output.h +++ b/bin/sh/output.h @@ -46,13 +46,13 @@ struct output { short flags; }; -extern struct output output; -extern struct output errout; +extern struct output output; /* to fd 1 */ +extern struct output errout; /* to fd 2 */ extern struct output memout; -extern struct output *out1; -extern struct output *out2; +extern struct output *out1; /* &memout if backquote, otherwise &output */ +extern struct output *out2; /* &memout if backquote with 2>&1, otherwise + &errout */ -void open_mem(char *, int, struct output *); void out1str(const char *); void out1qstr(const char *); void out2str(const char *); @@ -65,10 +65,10 @@ void flushout(struct output *); void freestdout(void); void outfmt(struct output *, const char *, ...) __printflike(2, 3); void out1fmt(const char *, ...) __printflike(1, 2); -void dprintf(const char *, ...) __printflike(1, 2); +void out2fmt_flush(const char *, ...) __printflike(1, 2); void fmtstr(char *, int, const char *, ...) __printflike(3, 4); void doformat(struct output *, const char *, va_list) __printflike(2, 0); -int xwrite(int, char *, int); +int xwrite(int, const char *, int); #define outc(c, file) (--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c))) #define out1c(c) outc(c, out1); diff --git a/bin/sh/parser.c b/bin/sh/parser.c index 54a80a715d06..d8903c9d808c 100644 --- a/bin/sh/parser.c +++ b/bin/sh/parser.c @@ -82,7 +82,6 @@ struct heredoc { STATIC struct heredoc *heredoclist; /* list of here documents to read */ -STATIC int parsebackquote; /* nonzero if we are inside backquotes */ STATIC int doprompt; /* if set, prompt the user */ STATIC int needprompt; /* true if interactive and at start of line */ STATIC int lasttoken; /* last token read */ @@ -114,7 +113,7 @@ STATIC int xxreadtoken(void); STATIC int readtoken1(int, char const *, char *, int); STATIC int noexpand(char *); STATIC void synexpect(int); -STATIC void synerror(char *); +STATIC void synerror(const char *); STATIC void setprompt(int); @@ -365,7 +364,9 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : "")); n1 = (union node *)stalloc(sizeof (struct nfor)); n1->type = NFOR; n1->nfor.var = wordtext; - if (readtoken() == TWORD && ! quoteflag && equal(wordtext, "in")) { + while (readtoken() == TNL) + ; + if (lasttoken == TWORD && ! quoteflag && equal(wordtext, "in")) { app = ≈ while (readtoken() == TWORD) { n2 = (union node *)stalloc(sizeof (struct narg)); @@ -1043,7 +1044,7 @@ readtoken1(int firstc, char const *syntax, char *eofmark, int striptabs) endword: if (syntax == ARISYNTAX) synerror("Missing '))'"); - if (syntax != BASESYNTAX && ! parsebackquote && eofmark == NULL) + if (syntax != BASESYNTAX && eofmark == NULL) synerror("Unterminated quoted string"); if (varnest != 0) { startlinno = plinno; @@ -1303,24 +1304,31 @@ parsesub: { parsebackq: { struct nodelist **nlpp; - int savepbq; union node *n; char *volatile str; struct jmploc jmploc; struct jmploc *const savehandler = handler; int savelen; int saveprompt; + const int bq_startlinno = plinno; + char *volatile ostr = NULL; + struct parsefile *const savetopfile = getcurrentfile(); - savepbq = parsebackquote; + str = NULL; if (setjmp(jmploc.loc)) { + popfilesupto(savetopfile); if (str) ckfree(str); - parsebackquote = 0; + if (ostr) + ckfree(ostr); handler = savehandler; + if (exception == EXERROR) { + startlinno = bq_startlinno; + synerror("Error in command substitution"); + } longjmp(handler->loc, 1); } INTOFF; - str = NULL; savelen = out - stackblock(); if (savelen > 0) { str = ckmalloc(savelen); @@ -1332,13 +1340,12 @@ parsebackq: { /* We must read until the closing backquote, giving special treatment to some slashes, and then push the string and reread it as input, interpreting it normally. */ - char *out; + char *oout; int c; - int savelen; - char *str; + int olen; - STARTSTACKSTR(out); + STARTSTACKSTR(oout); for (;;) { if (needprompt) { setprompt(2); @@ -1365,7 +1372,7 @@ parsebackq: { } if (c != '\\' && c != '`' && c != '$' && (!dblquote || c != '"')) - STPUTC('\\', out); + STPUTC('\\', oout); break; case '\n': @@ -1381,23 +1388,22 @@ parsebackq: { default: break; } - STPUTC(c, out); + STPUTC(c, oout); } done: - STPUTC('\0', out); - savelen = out - stackblock(); - if (savelen > 0) { - str = ckmalloc(savelen); - memcpy(str, stackblock(), savelen); - setinputstring(str, 1); - } + STPUTC('\0', oout); + olen = oout - stackblock(); + INTOFF; + ostr = ckmalloc(olen); + memcpy(ostr, stackblock(), olen); + setinputstring(ostr, 1); + INTON; } nlpp = &bqlist; while (*nlpp) nlpp = &(*nlpp)->next; *nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist)); (*nlpp)->next = NULL; - parsebackquote = oldstyle; if (oldstyle) { saveprompt = doprompt; @@ -1433,7 +1439,12 @@ done: str = NULL; INTON; } - parsebackquote = savepbq; + if (ostr) { + INTOFF; + ckfree(ostr); + ostr = NULL; + INTON; + } handler = savehandler; if (arinest || dblquote) USTPUTC(CTLBACKQ | CTLQUOTE, out); @@ -1509,9 +1520,9 @@ noexpand(char *text) */ int -goodname(char *name) +goodname(const char *name) { - char *p; + const char *p; p = name; if (! is_name(*p)) @@ -1546,11 +1557,11 @@ synexpect(int token) STATIC void -synerror(char *msg) +synerror(const char *msg) { if (commandname) - outfmt(&errout, "%s: %d: ", commandname, startlinno); - outfmt(&errout, "Syntax error: %s\n", msg); + outfmt(out2, "%s: %d: ", commandname, startlinno); + outfmt(out2, "Syntax error: %s\n", msg); error((char *)NULL); } @@ -1562,7 +1573,10 @@ setprompt(int which) #ifndef NO_HISTORY if (!el) #endif + { out2str(getprompt(NULL)); + flushout(out2); + } } /* @@ -1575,13 +1589,14 @@ getprompt(void *unused __unused) static char ps[PROMPTLEN]; char *fmt; int i, j, trim; + static char internal_error[] = ""; /* * Select prompt format. */ switch (whichprompt) { case 0: - fmt = ""; + fmt = nullstr; break; case 1: fmt = ps1val(); @@ -1590,7 +1605,7 @@ getprompt(void *unused __unused) fmt = ps2val(); break; default: - return ""; + return internal_error; } /* @@ -1626,7 +1641,7 @@ getprompt(void *unused __unused) case 'w': ps[i] = '\0'; getcwd(&ps[i], PROMPTLEN - i); - if (*fmt == 'W') { + if (*fmt == 'W' && ps[i + 1] != '\0') { /* Final path component only. */ trim = 1; for (j = i; ps[j] != '\0'; j++) diff --git a/bin/sh/parser.h b/bin/sh/parser.h index 40dd8bda2405..453711f43079 100644 --- a/bin/sh/parser.h +++ b/bin/sh/parser.h @@ -73,9 +73,10 @@ extern int tokpushback; #define NEOF ((union node *)&tokpushback) extern int whichprompt; /* 1 == PS1, 2 == PS2 */ +extern const char *const parsekwd[]; union node *parsecmd(int); void fixredir(union node *, const char *, int); -int goodname(char *); +int goodname(const char *); char *getprompt(void *); diff --git a/bin/sh/redir.c b/bin/sh/redir.c index 695e1507255c..2239b9f2e14b 100644 --- a/bin/sh/redir.c +++ b/bin/sh/redir.c @@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$"); #define EMPTY -2 /* marks an unused slot in redirtab */ +#define CLOSED -1 /* fd was not open before redir */ #define PIPESIZE 4096 /* amount of buffering in a pipe */ @@ -101,7 +102,6 @@ redirect(union node *redir, int flags) struct redirtab *sv = NULL; int i; int fd; - int try; char memory[10]; /* file descriptors to write to memory */ for (i = 10 ; --i >= 0 ; ) @@ -116,38 +116,30 @@ redirect(union node *redir, int flags) } for (n = redir ; n ; n = n->nfile.next) { fd = n->nfile.fd; - try = 0; if ((n->nfile.type == NTOFD || n->nfile.type == NFROMFD) && n->ndup.dupfd == fd) continue; /* redirect from/to same file descriptor */ if ((flags & REDIR_PUSH) && sv->renamed[fd] == EMPTY) { INTOFF; -again: if ((i = fcntl(fd, F_DUPFD, 10)) == -1) { switch (errno) { case EBADF: - if (!try) { - openredirect(n, memory); - try++; - goto again; - } - /* FALLTHROUGH*/ + i = CLOSED; + break; default: INTON; error("%d: %s", fd, strerror(errno)); break; } - } - if (!try) { - sv->renamed[fd] = i; - } + } else + (void)fcntl(i, F_SETFD, FD_CLOEXEC); + sv->renamed[fd] = i; INTON; } if (fd == 0) fd0_redirected++; - if (!try) - openredirect(n, memory); + openredirect(n, memory); } if (memory[1]) out1 = &memout; @@ -166,8 +158,11 @@ openredirect(union node *redir, char memory[10]) /* * We suppress interrupts so that we won't leave open file - * descriptors around. This may not be such a good idea because - * an open of a device or a fifo can block indefinitely. + * descriptors around. Because the signal handler remains + * installed and we do not use system call restart, interrupts + * will still abort blocking opens such as fifos (they will fail + * with EINTR). There is, however, a race condition if an interrupt + * arrives after INTOFF and before open blocks. */ INTOFF; memory[fd] = 0; diff --git a/bin/sh/sh.1 b/bin/sh/sh.1 index 2739dccdd8e7..8ec119545cae 100644 --- a/bin/sh/sh.1 +++ b/bin/sh/sh.1 @@ -32,7 +32,7 @@ .\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95 .\" $FreeBSD$ .\" -.Dd May 31, 2009 +.Dd December 31, 2009 .Dt SH 1 .Os .Sh NAME @@ -296,7 +296,10 @@ sh -T -c "trap 'exit 1' 2 ; some-blocking-program" .Ed .It Fl u Li nounset Write a message to standard error when attempting -to expand a variable that is not set, and if the +to expand a variable, a positional parameter or +the special parameter +.Va \&! +that is not set, and if the shell is not interactive, exit immediately. .It Fl V Li vi Enable the built-in @@ -862,7 +865,7 @@ command is: If .Ic in and the following words are omitted, -.Ic in Li $@ +.Ic in Li \&"$@\&" is used instead. The words are expanded, and then the list is executed repeatedly with the variable set to each word in turn. @@ -1077,7 +1080,7 @@ and is .Dq Li "def ghi" , then -.Dq Li $@ +.Li \&"$@\&" expands to the two arguments: .Bd -literal -offset indent @@ -1227,6 +1230,9 @@ In all cases, the final value of .Ar parameter is substituted. +Quoting inside +.Ar word +does not prevent field splitting or pathname expansion. Only variables, not positional parameters or special parameters, can be assigned in this way. @@ -2131,7 +2137,7 @@ and not found. For aliases the alias expansion is printed; for commands and tracked aliases the complete pathname of the command is printed. -.It Ic ulimit Oo Fl HSabcdflmnpstuv Oc Op Ar limit +.It Ic ulimit Oo Fl HSabcdflmnpstuvw Oc Op Ar limit Set or display resource limits (see .Xr getrlimit 2 ) . If @@ -2195,6 +2201,9 @@ The maximal amount of CPU time to be used by each process, in seconds. The maximal number of simultaneous processes for this user ID. .It Fl v Ar virtualmem The maximal virtual size of a process, in kilobytes. +.It Fl w Ar swapuse +The maximum amount of swap space reserved or used for this user ID, +in kilobytes. .El .It Ic umask Oo Fl S Oc Op Ar mask Set the file creation mask (see diff --git a/bin/sh/show.c b/bin/sh/show.c index baae549c4295..f11cfce29833 100644 --- a/bin/sh/show.c +++ b/bin/sh/show.c @@ -307,7 +307,7 @@ sh_trace(const char *fmt, ...) void -trputs(char *s) +trputs(const char *s) { if (tracefile == NULL) return; diff --git a/bin/sh/show.h b/bin/sh/show.h index 83f84afcc8af..4528fb19a41c 100644 --- a/bin/sh/show.h +++ b/bin/sh/show.h @@ -35,6 +35,6 @@ void showtree(union node *); void sh_trace(const char *, ...) __printflike(1, 2); void trargs(char **); void trputc(int); -void trputs(char *); +void trputs(const char *); void opentrace(void); #endif diff --git a/bin/sh/trap.c b/bin/sh/trap.c index a0cd0ba14cdd..3a6803b9d90f 100644 --- a/bin/sh/trap.c +++ b/bin/sh/trap.c @@ -149,6 +149,7 @@ trapcmd(int argc, char **argv) { char *action; int signo; + int errors = 0; if (argc <= 1) { for (signo = 0 ; signo < sys_nsig ; signo++) { @@ -183,8 +184,10 @@ trapcmd(int argc, char **argv) } } while (*argv) { - if ((signo = sigstring_to_signum(*argv)) == -1) - error("bad signal %s", *argv); + if ((signo = sigstring_to_signum(*argv)) == -1) { + out2fmt_flush("trap: bad signal %s\n", *argv); + errors = 1; + } INTOFF; if (action) action = savestr(action); @@ -196,7 +199,7 @@ trapcmd(int argc, char **argv) INTON; argv++; } - return 0; + return errors; } @@ -244,7 +247,8 @@ void setsignal(int signo) { int action; - sig_t sig, sigact = SIG_DFL; + sig_t sigact = SIG_DFL; + struct sigaction sa; char *t; if ((t = trap[signo]) == NULL) @@ -320,9 +324,10 @@ setsignal(int signo) case S_IGN: sigact = SIG_IGN; break; } *t = action; - sig = signal(signo, sigact); - if (sig != SIG_ERR && action == S_CATCH) - siginterrupt(signo, 1); + sa.sa_handler = sigact; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigaction(signo, &sa, NULL); } diff --git a/bin/sh/trap.h b/bin/sh/trap.h index 672ad08d481f..8cc05da54dee 100644 --- a/bin/sh/trap.h +++ b/bin/sh/trap.h @@ -45,4 +45,4 @@ void ignoresig(int); void onsig(int); void dotrap(void); void setinteractive(int); -void exitshell(int); +void exitshell(int) __dead2; diff --git a/bin/sh/var.c b/bin/sh/var.c index 2c1caf148000..d46e2c3e4649 100644 --- a/bin/sh/var.c +++ b/bin/sh/var.c @@ -73,7 +73,7 @@ __FBSDID("$FreeBSD$"); struct varinit { struct var *var; int flags; - char *text; + const char *text; void (*func)(const char *); }; @@ -94,27 +94,27 @@ STATIC struct var voptind; STATIC const struct varinit varinit[] = { #ifndef NO_HISTORY - { &vhistsize, VSTRFIXED|VTEXTFIXED|VUNSET, "HISTSIZE=", + { &vhistsize, VUNSET, "HISTSIZE=", sethistsize }, #endif - { &vifs, VSTRFIXED|VTEXTFIXED, "IFS= \t\n", + { &vifs, 0, "IFS= \t\n", NULL }, - { &vmail, VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL=", + { &vmail, VUNSET, "MAIL=", NULL }, - { &vmpath, VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH=", + { &vmpath, VUNSET, "MAILPATH=", NULL }, - { &vpath, VSTRFIXED|VTEXTFIXED, "PATH=" _PATH_DEFPATH, + { &vpath, 0, "PATH=" _PATH_DEFPATH, changepath }, - { &vppid, VSTRFIXED|VTEXTFIXED|VUNSET, "PPID=", + { &vppid, VUNSET, "PPID=", NULL }, /* * vps1 depends on uid */ - { &vps2, VSTRFIXED|VTEXTFIXED, "PS2=> ", + { &vps2, 0, "PS2=> ", NULL }, - { &vps4, VSTRFIXED|VTEXTFIXED, "PS4=+ ", + { &vps4, 0, "PS4=+ ", NULL }, - { &voptind, VSTRFIXED|VTEXTFIXED, "OPTIND=1", + { &voptind, 0, "OPTIND=1", getoptsreset }, { NULL, 0, NULL, NULL } @@ -122,9 +122,9 @@ STATIC const struct varinit varinit[] = { STATIC struct var *vartab[VTABSIZE]; -STATIC struct var **hashvar(char *); -STATIC int varequal(char *, char *); -STATIC int localevar(char *); +STATIC struct var **hashvar(const char *); +STATIC int varequal(const char *, const char *); +STATIC int localevar(const char *); /* * Initialize the variable symbol tables and import the environment. @@ -132,9 +132,9 @@ STATIC int localevar(char *); #ifdef mkinit INCLUDE "var.h" +MKINIT char **environ; INIT { char **envp; - extern char **environ; initvar(); for (envp = environ ; *envp ; envp++) { @@ -164,8 +164,8 @@ initvar(void) vpp = hashvar(ip->text); vp->next = *vpp; *vpp = vp; - vp->text = ip->text; - vp->flags = ip->flags; + vp->text = __DECONST(char *, ip->text); + vp->flags = ip->flags | VSTRFIXED | VTEXTFIXED; vp->func = ip->func; } } @@ -176,7 +176,7 @@ initvar(void) vpp = hashvar("PS1="); vps1.next = *vpp; *vpp = &vps1; - vps1.text = geteuid() ? "PS1=$ " : "PS1=# "; + vps1.text = __DECONST(char *, geteuid() ? "PS1=$ " : "PS1=# "); vps1.flags = VSTRFIXED|VTEXTFIXED; } if ((vppid.flags & VEXPORT) == 0) { @@ -190,12 +190,14 @@ initvar(void) */ int -setvarsafe(char *name, char *val, int flags) +setvarsafe(const char *name, const char *val, int flags) { struct jmploc jmploc; struct jmploc *const savehandler = handler; int err = 0; + int inton; + inton = is_int_on(); if (setjmp(jmploc.loc)) err = 1; else { @@ -203,6 +205,7 @@ setvarsafe(char *name, char *val, int flags) setvar(name, val, flags); } handler = savehandler; + SETINTON(inton); return err; } @@ -212,9 +215,9 @@ setvarsafe(char *name, char *val, int flags) */ void -setvar(char *name, char *val, int flags) +setvar(const char *name, const char *val, int flags) { - char *p, *q; + const char *p; int len; int namelen; char *nameeq; @@ -242,25 +245,24 @@ setvar(char *name, char *val, int flags) } else { len += strlen(val); } - p = nameeq = ckmalloc(len); - q = name; - while (--namelen >= 0) - *p++ = *q++; - *p++ = '='; - *p = '\0'; + nameeq = ckmalloc(len); + memcpy(nameeq, name, namelen); + nameeq[namelen] = '='; if (val) - scopy(val, p); + scopy(val, nameeq + namelen + 1); + else + nameeq[namelen + 1] = '\0'; setvareq(nameeq, flags); } STATIC int -localevar(char *s) +localevar(const char *s) { - static char *lnames[7] = { + static const char *lnames[7] = { "ALL", "COLLATE", "CTYPE", "MONETARY", "NUMERIC", "TIME", NULL }; - char **ss; + const char **ss; if (*s != 'L') return 0; @@ -280,7 +282,7 @@ localevar(char *s) * pointer into environ where the string should not be manipulated. */ static void -change_env(char *s, int set) +change_env(const char *s, int set) { char *eqp; char *ss; @@ -335,8 +337,13 @@ setvareq(char *s, int flags) /* * We could roll this to a function, to handle it as * a regular variable function callback, but why bother? + * + * Note: this assumes iflag is not set to 1 initially. + * As part of init(), this is called before arguments + * are looked at. */ - if (vp == &vmpath || (vp == &vmail && ! mpathset())) + if ((vp == &vmpath || (vp == &vmail && ! mpathset())) && + iflag == 1) chkmail(1); if ((vp->flags & VEXPORT) && localevar(s)) { change_env(s, 1); @@ -386,7 +393,7 @@ listsetvar(struct strlist *list) */ char * -lookupvar(char *name) +lookupvar(const char *name) { struct var *v; @@ -409,7 +416,7 @@ lookupvar(char *name) */ char * -bltinlookup(char *name, int doall) +bltinlookup(const char *name, int doall) { struct strlist *sp; struct var *v; @@ -467,9 +474,9 @@ environment(void) * VSTACK set since these are currently allocated on the stack. */ -#ifdef mkinit MKINIT void shprocvar(void); +#ifdef mkinit SHELLPROC { shprocvar(); } @@ -604,7 +611,6 @@ exportcmd(int argc, char **argv) if (values && argc != 0) error("-p requires no arguments"); - listsetvar(cmdenviron); if (argc != 0) { while ((name = *argv++) != NULL) { if ((p = strchr(name, '=')) != NULL) { @@ -794,7 +800,7 @@ unsetcmd(int argc __unused, char **argv __unused) */ int -unsetvar(char *s) +unsetvar(const char *s) { struct var **vpp; struct var *vp; @@ -834,7 +840,7 @@ unsetvar(char *s) */ STATIC struct var ** -hashvar(char *p) +hashvar(const char *p) { unsigned int hashval; @@ -853,7 +859,7 @@ hashvar(char *p) */ STATIC int -varequal(char *p, char *q) +varequal(const char *p, const char *q) { while (*p == *q++) { if (*p++ == '=') diff --git a/bin/sh/var.h b/bin/sh/var.h index c1f994b8cb8d..9c792c846ca7 100644 --- a/bin/sh/var.h +++ b/bin/sh/var.h @@ -101,14 +101,13 @@ extern struct var vhistsize; #define mpathset() ((vmpath.flags & VUNSET) == 0) void initvar(void); -void setvar(char *, char *, int); +void setvar(const char *, const char *, int); void setvareq(char *, int); struct strlist; void listsetvar(struct strlist *); -char *lookupvar(char *); -char *bltinlookup(char *, int); +char *lookupvar(const char *); +char *bltinlookup(const char *, int); char **environment(void); -void shprocvar(void); int showvarscmd(int, char **); int exportcmd(int, char **); int localcmd(int, char **); @@ -116,5 +115,5 @@ void mklocal(char *); void poplocalvars(void); int setvarcmd(int, char **); int unsetcmd(int, char **); -int unsetvar(char *); -int setvarsafe(char *, char *, int); +int unsetvar(const char *); +int setvarsafe(const char *, const char *, int); diff --git a/bin/uuidgen/Makefile b/bin/uuidgen/Makefile index 370241d3ebdd..0b27d20e9805 100644 --- a/bin/uuidgen/Makefile +++ b/bin/uuidgen/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= uuidgen -WARNS?= 6 .include diff --git a/cddl/contrib/opensolaris/cmd/zdb/zdb_il.c b/cddl/contrib/opensolaris/cmd/zdb/zdb_il.c index 02d35a050332..cc08ef514858 100644 --- a/cddl/contrib/opensolaris/cmd/zdb/zdb_il.c +++ b/cddl/contrib/opensolaris/cmd/zdb/zdb_il.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Print intent log header and statistics. */ @@ -345,8 +343,10 @@ dump_intent_log(zilog_t *zilog) if (zh->zh_log.blk_birth == 0 || verbose < 2) return; - (void) printf("\n ZIL header: claim_txg %llu, seq %llu\n", - (u_longlong_t)zh->zh_claim_txg, (u_longlong_t)zh->zh_replay_seq); + (void) printf("\n ZIL header: claim_txg %llu, claim_seq %llu", + (u_longlong_t)zh->zh_claim_txg, (u_longlong_t)zh->zh_claim_seq); + (void) printf(" replay_seq %llu, flags 0x%llx\n", + (u_longlong_t)zh->zh_replay_seq, (u_longlong_t)zh->zh_flags); if (verbose >= 4) print_log_bp(&zh->zh_log, "\n\tfirst block: "); diff --git a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c index 6f5f92ebc4e7..d6bc6e129af1 100644 --- a/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c +++ b/cddl/contrib/opensolaris/cmd/zfs/zfs_main.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -2457,7 +2457,7 @@ zfs_do_receive(int argc, char **argv) bzero(&flags, sizeof (recvflags_t)); /* check options */ - while ((c = getopt(argc, argv, ":dnvF")) != -1) { + while ((c = getopt(argc, argv, ":dnuvF")) != -1) { switch (c) { case 'd': flags.isprefix = B_TRUE; @@ -2465,6 +2465,9 @@ zfs_do_receive(int argc, char **argv) case 'n': flags.dryrun = B_TRUE; break; + case 'u': + flags.nomount = B_TRUE; + break; case 'v': flags.verbose = B_TRUE; break; diff --git a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c index 2388df9ac99c..297037178a99 100644 --- a/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c +++ b/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c @@ -3488,6 +3488,8 @@ zpool_do_upgrade(int argc, char **argv) (void) printf(gettext(" 11 Improved scrub performance\n")); (void) printf(gettext(" 12 Snapshot properties\n")); (void) printf(gettext(" 13 snapused property\n")); + (void) printf(gettext(" 14 passthrough-x aclinherit " + "support\n")); (void) printf(gettext("For more information on a particular " "version, including supported releases, see:\n\n")); (void) printf("http://www.opensolaris.org/os/community/zfs/" diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h index 4e8efb4e73a2..9a13bbbf5422 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs.h @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -457,6 +457,9 @@ typedef struct recvflags { /* byteswap flag is used internally; callers need not specify */ int byteswap : 1; + + /* do not mount file systems as they are extracted (private) */ + int nomount : 1; } recvflags_t; extern int zfs_receive(libzfs_handle_t *, const char *, recvflags_t, diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c index 58ce6c8fa205..f3b132f1fc85 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c @@ -1790,11 +1790,14 @@ zfs_prop_set(zfs_handle_t *zhp, const char *propname, const char *propval) /* We don't support those properties on FreeBSD. */ switch (prop) { - case ZFS_PROP_SHAREISCSI: case ZFS_PROP_DEVICES: - case ZFS_PROP_ACLMODE: - case ZFS_PROP_ACLINHERIT: + case ZFS_PROP_ZONED: + case ZFS_PROP_SHAREISCSI: case ZFS_PROP_ISCSIOPTIONS: + case ZFS_PROP_XATTR: + case ZFS_PROP_VSCAN: + case ZFS_PROP_NBMAND: + case ZFS_PROP_SHARESMB: (void) snprintf(errbuf, sizeof (errbuf), "property '%s' not supported on FreeBSD", propname); ret = zfs_error(hdl, EZFS_PERM, errbuf); diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c index 5ee17fb85086..3516f6d60bdf 100644 --- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c +++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_sendrecv.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -2080,7 +2080,7 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, recvflags_t flags, err = zfs_receive_impl(hdl, tosnap, flags, infd, stream_avl, &top_zfs); - if (err == 0 && top_zfs) { + if (err == 0 && !flags.nomount && top_zfs) { zfs_handle_t *zhp; prop_changelist_t *clp; diff --git a/cddl/usr.bin/ctfconvert/Makefile b/cddl/usr.bin/ctfconvert/Makefile index 57a08dd04c6d..aea32c73e04d 100644 --- a/cddl/usr.bin/ctfconvert/Makefile +++ b/cddl/usr.bin/ctfconvert/Makefile @@ -40,7 +40,8 @@ CFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris \ -I${OPENSOLARIS_USR_DISTDIR}/tools/ctf/cvt \ -I${OPENSOLARIS_SYS_DISTDIR}/uts/common -LDADD+= -lctf -ldwarf -lelf -lz -lthr +DPADD= ${LIBCTF} ${LIBDWARF} ${LIBELF} ${LIBZ} ${LIBPTHREAD} +LDADD= -lctf -ldwarf -lelf -lz -lpthread .PATH: ${.CURDIR} .PATH: ${OPENSOLARIS_USR_DISTDIR}/tools/ctf/common diff --git a/cddl/usr.bin/ctfdump/Makefile b/cddl/usr.bin/ctfdump/Makefile index 9a65c15efd31..700b070d0c40 100644 --- a/cddl/usr.bin/ctfdump/Makefile +++ b/cddl/usr.bin/ctfdump/Makefile @@ -19,9 +19,8 @@ CFLAGS+= -I${OPENSOLARIS_USR_DISTDIR} \ -I${OPENSOLARIS_USR_DISTDIR}/tools/ctf/common \ -I${OPENSOLARIS_SYS_DISTDIR}/uts/common -LDFLAGS+= -pthread - -LDADD+= -lelf -lz +DPADD= ${LIBPTHREAD} ${LIBELF} ${LIBZ} +LDADD= -lpthread -lelf -lz .PATH: ${OPENSOLARIS_USR_DISTDIR}/tools/ctf/common .PATH: ${OPENSOLARIS_USR_DISTDIR}/tools/ctf/dump diff --git a/cddl/usr.bin/ctfmerge/Makefile b/cddl/usr.bin/ctfmerge/Makefile index 051fa0b434d3..7c96d366e8bf 100644 --- a/cddl/usr.bin/ctfmerge/Makefile +++ b/cddl/usr.bin/ctfmerge/Makefile @@ -37,7 +37,8 @@ CFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris \ -I${OPENSOLARIS_USR_DISTDIR}/tools/ctf/cvt \ -I${OPENSOLARIS_SYS_DISTDIR}/uts/common -LDADD+= -lctf -ldwarf -lelf -lz -lthr +DPADD= ${LIBCTF} ${LIBDWARF} ${LIBELF} ${LIBZ} ${LIBPTHREAD} +LDADD= -lctf -ldwarf -lelf -lz -lpthread .PATH: ${OPENSOLARIS_USR_DISTDIR}/tools/ctf/common .PATH: ${OPENSOLARIS_USR_DISTDIR}/tools/ctf/cvt diff --git a/cddl/usr.bin/zinject/Makefile b/cddl/usr.bin/zinject/Makefile index c8693fe9c73c..82505a875f65 100644 --- a/cddl/usr.bin/zinject/Makefile +++ b/cddl/usr.bin/zinject/Makefile @@ -19,7 +19,7 @@ CFLAGS+= -I${.CURDIR}/../../contrib/opensolaris/head CFLAGS+= -I${.CURDIR}/../../lib/libumem DPADD= ${LIBAVL} ${LIBGEOM} ${LIBM} ${LIBNVPAIR} ${LIBUMEM} ${LIBUUTIL} \ - ${LIBZFS} ${LIBZPOOL} ${LIBUUTIL} + ${LIBZFS} ${LIBZPOOL} LDADD= -lavl -lgeom -lm -lnvpair -lumem -luutil -lzfs -lzpool .include diff --git a/cddl/usr.sbin/dtrace/Makefile b/cddl/usr.sbin/dtrace/Makefile index 44116fcbc4ef..56e88153bdbc 100644 --- a/cddl/usr.sbin/dtrace/Makefile +++ b/cddl/usr.sbin/dtrace/Makefile @@ -24,14 +24,7 @@ CFLAGS+= -I${.CURDIR}/../../../sys/cddl/compat/opensolaris \ #CFLAGS+= -DNEED_ERRLOC #YFLAGS+= -d -LDFLAGS+= -pthread \ - -L${.OBJDIR}/../../lib/libdtrace \ - -L${.OBJDIR}/../../lib/libproc \ - -L${.OBJDIR}/../../lib/libctf \ - -L${.OBJDIR}/../../../lib/libelf - -LDADD+= -ldtrace -ly -ll -lproc -lctf -lelf -lz - -DPADD+= ${LIBDTRACE} ${LIBCTF} ${LIBELF} ${LIBPTHREAD} ${LIBL} ${LIBY} ${LIBZ} +DPADD= ${LIBPTHREAD} ${LIBDTRACE} ${LIBY} ${LIBL} ${LIBPROC} ${LIBCTF} ${LIBELF} ${LIBZ} +LDADD= -lpthread -ldtrace -ly -ll -lproc -lctf -lelf -lz .include diff --git a/cddl/usr.sbin/lockstat/Makefile b/cddl/usr.sbin/lockstat/Makefile index 9c135f91263f..4fbddef3fbf1 100644 --- a/cddl/usr.sbin/lockstat/Makefile +++ b/cddl/usr.sbin/lockstat/Makefile @@ -25,15 +25,8 @@ CFLAGS+= -DNEED_ERRLOC -g #YFLAGS+= -d -LDFLAGS+= -pthread \ - -L${.OBJDIR}/../../lib/libdtrace \ - -L${.OBJDIR}/../../lib/libproc \ - -L${.OBJDIR}/../../lib/libctf \ - -L${.OBJDIR}/../../../lib/libelf - -LDADD+= -ldtrace -ly -ll -lproc -lctf -lelf -lz -lrt - -#DPADD+= ${LIBDTRACE} ${LIBPTHREAD} ${LIBL} ${LIBY} ${LIBZ} +DPADD= ${LIBPTHREAD} ${LIBDTRACE} ${LIBY} ${LIBL} ${LIBPROC} ${LIBCTF} ${LIBELF} ${LIBZ} ${LIBRT} +LDADD= -lpthread -ldtrace -ly -ll -lproc -lctf -lelf -lz -lrt NO_MAN= diff --git a/contrib/bc/AUTHORS b/contrib/bc/AUTHORS deleted file mode 100644 index b665a635b0d1..000000000000 --- a/contrib/bc/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -Phil Nelson wrote bc, including the number.c -source in the "lib" directory. - -Ken Pizzini wrote dc. diff --git a/contrib/bc/ChangeLog b/contrib/bc/ChangeLog deleted file mode 100644 index f2770798a11b..000000000000 --- a/contrib/bc/ChangeLog +++ /dev/null @@ -1,1043 +0,0 @@ -Wed Sep 27 17:19:48 2000 Phil Nelson - - * doc/bc.texi: Added new file. Mainly translated from bc.1 - by Brian Youmans. - doc/bc.1: Minor changes made as part of reviewing bc.texi. - -Wed Sep 20 11:45:00 2000 Phil Nelson - - * bc/bc.y: Added a comment on the meanings of lvals. - -Wed Sep 13 11:40:24 2000 Phil Nelson - - * bc/main.c: add --interactive to long options. - bc/bc.1: add -i/--interactive to doc. - MANY: Update FSF address and Phil's e-mail. - -Tue Sep 12 13:58:16 2000 Phil Nelson - - * NEWS: update for recent changes. - bc/bc.y: remove required parens around return expression. - doc/bc.1: update for recent changes. - -Fri Sep 8 10:20:01 2000 Phil Nelson - - * bc/Makefile.am, dc/Makefile.am, lib/Makefile.am: - Compile with unsigned characters. - bc/main.c: Add --help option. - bc/scan.l: Print illegal, non-printable characters in octal. - -Fri Sep 8 09:36:54 2000 Phil Nelson - - * bc/bc.y: Allow more newlines in function definitions. - bc/proto.h: Don't prototype main. - -Fri Sep 1 16:09:50 2000 Phil Nelson - - * bc/bc.y: Spelling correction - bc/execute.c: Correct expressions for multi-byte names. - bc/load.c: Add parens for correct casting. - doc/bc.1: Typos. - Above fixes pointed out by kwzh@gnu.org (Karl Heuer). - -Tue Aug 29 23:03:30 PDT 2000 Phil Nelson - - * lib/testmul.c: #ifdef out a declaration matching #ifdef out - code. - -Mon Jul 31 07:01:42 2000 Ken Pizzini - - * dc/numeric.c: use of the "n" command can cause a number to be printed - without a trailing newline, which would cause the column counter to - fail to be reset and result in inappropriately wrapped numeric outputs. - Fixed by always clearing the column counter before outputting each number. - - * dc/stack.c: if a stack is used without ever using the correspondingly - named register, it is perfectly legitimate for the register to be - uninitialized; added an "else if" to handle this case without aborting. - - * dc/eval.c: updated the comment explaining the restrictions - on the | command to better reflect reality. - - * doc/dc.texi: update the FSF office address in the copyright notice - -Thu Jul 13 18:13:00 2000 Phil Nelson - - * README: note --with-libedit configure parameter. - -Tue Jun 20 22:52:10 2000 Phil Nelson - - * bc/bcdefs.h: Include to quiet warnings. - - * configure.in: make --with-readline and --with-libedit work correctly. - - * Makefile.am: use $(MAKE) instead of directly calling make. - - * lib/testmul.c: Update to use bc_ on all number.c routines. - -Sat Jun 10 22:44:29 2000 Phil Nelson - - * bc/Makefile.am: Add scan.c to maintainer-clean target. - - * acconfig.h configure.in stamp-h.in bc/Makefile.am bc/execute.c - bc/fix-libmath_h bc/global.c bc/load.c bc/main.c bc/storage.c: - Remove long string for libmath. Clean up for compiler errors. - - * dc/numeric.c: Correct parameter name. - -Wed May 10 15:51:16 2000 Phil Nelson - - * {bc,doc,dc,lib}/Makefile.am: Add Makefile.in to maintainer-clean. - - * bootstrap.sh: Added script to run the auto* tools. - - * Imported all into CVS tree. - -Sun 2000-05-07 Phil Nelson - - * bc/Makefile.am, dc/Makefile.am, lib/Makefile.am: Add -Wall to CFLAGS. - - * bc/{execute.c,proto.h,storage.c,util.c}, dc/numeric.c: Changes for - -Wall and for name changes in lib/number.c. (Added bc_ to several - routine. Updated copyright notice.) - - * h/number.h, lib/number.c: Now comes from bcmath library which is - distributed in a different place. - -Wed Mar 29 17:47:34 2000 Phil Nelson - - * bc/{bc.y,bcdefs.h,global.h,main.c,proto.h,scan.l,storage.c}: - Added BSD libedit support. Generic support for both where possible. - Fixed bugs in readline support noticed during libedit addition. - Works with NetBSD-1.4.1 libedit. - * doc/bc.1: Documented libedit addition. - -Wed Mar 29 10:20:18 2000 Phil Nelson - - * FAQ: Added this file. - * Makfile.am: Added FAQ to distribution - -Tue Mar 28 13:52:35 2000 Phil Nelson - - * lib/number.c, h/number.h: Moved definitions so - number.c/number.h is a stand-alone "library". - Changed definition of out_num to not reference a global. - * lib/testmul.c: updated #includes for number.h changes. - * h/{bcdefs.h,const.h,global.h,proto.h} moved to - bc where they really belong. - * bc/execute.c: Changed calls to out_num for correctness. - * dc/numeric.c: Changed calls to out_num for correctness, - include only number.h now and not all the other junk. - * configure.in, acconfig.h: Start of support for BSD libedit, - added --with-pkg for NetBSD /usr/pkg tree. - -Tue Mar 28 11:20:00 2000 Phil Nelson - - * Test/{exp.b,fact.b,jn.b,mul.b,raise.b}: Tweeks on the tests - run to do more computation and test the recursive multiply. - * bc/scan.l: Removed a printf('\r') that was unneeded. - -Mon Mar 27 14:00:00 2000 Phil Nelson - - * NEWS: Updated for 1.06. - * lib/number.c, h/number.h: Fixed bugs in recursive multiply. - Changed these files to be under the LGPL. - * Tests/jn.b: Added more tests. - * lib/Makefile.am: Only generate a timed version of number.o if - requested. - * README: Updated with information on how to generate a timed - version of number.o. - * h/version.h: Updated copyright and version number for dc. - -Thu Mar 16 14:01:45 2000 Phil Nelson - - * doc/bc.1, doc/dc.1, doc/dc.texi: Changed bug reporting address - to bug-bc@gnu.org to update with what we hope will be reality. - -Tue Feb 8 08:54:19 2000 Phil Nelson - - * doc/bc.1, bc/util.c: Removed "multiply digits" - limit due to new recursive algorithm that doesn't - have those limits. - -Tue Feb 8 08:47:05 2000 Phil Nelson - - * lib/Makefile.am, lib/testmul.c, lib/number.c, Makefile.am: - Finally got a resonable version of the program - to test the crossover between non-recursive and - recursive multiply algorithms. Added to distribution - and build process. Does increase build time by - about 10 minutes. - -Wed Oct 6 13:28:59 1999 Phil Nelson - - * lib/Makefile.am: Added rules to allow DEFSADD definitions. - -Sat Oct 2 19:59:51 1999 Phil Nelson - - * bc/libmath.b: Correctly do the cosine accuracy. - -Fri Oct 1 12:41:51 1999 Phil Nelson - - * lib/number.c: Increase accuracy of computing raise. - Also turn off use of recursive multiply routines - until furthur testing. - * bc/libmath.b: Increase accuracy of cosine. - * bc/Makefile.am: Remove -lfl from items to make. - -Wed Jul 28 10:29:28 1999 Phil Nelson - - * bc/scan.l: rl_len from char to int. (From FreeBSD - bug tracking system and Nick Hibma ) - -Tue Jun 22 08:00:28 1999 Phil Nelson - - * lib/number.c: Rewrote bc_multiply to use a faster - algorithm. Old code not removed yet. - -Mon Jun 21 03:08:02 1999 Phil Nelson - - * h/version.h: Updated version number to 1.06. - bc/bc.y: Corrected bug in for statement, not popping. - bc/execute.c: Improved stack dump/instruction tracing. - -Tue Jun 15 22:30:42 1999 Phil Nelson - - * configure.in: Updated bc version to 1.06. - -Tue Jun 15 22:27:44 1999 Phil Nelson - - * h/bcdefs.h, h/const.h, bc/execute.c, bc/load.c, bc/storage.c, - bc/util.c: Removed segmented function storaged. Now - dynamically expands (by doubling, starting at 1024 bytes) - to allow arbitrary sized functions. - -Thu Jun 10 22:33:44 1999 Phil Nelson - - * bc/libmath.b: change scaling in computation of j(n,x) so - it correctly computes the value. - -Wed Jun 10 10:10:10 1998 Release of bc-1.05a. - -Fri Apr 17 10:40:59 1998 Phil Nelson - - * bc/main.c: Enable readline only if interactive. - -Thu Apr 16 16:49:22 1998 Phil Nelson - - * bc/configure.in: Tweeking of AM_PROG_LEX and associated - special case goo for solaris. - -Sat Mar 28 21:43:18 1998 Phil Nelson - - * bc/Makefile.am: Added "YFLAGS = -d" to get bc.h to build properly. - -Mon Mar 9 12:54:42 PST 1998 Ken Pizzini - - * doc/dc.texi, doc/dc.1: correct some documentation bugs. - -Sun Mar 8 23:56:24 PST 1998 Ken Pizzini - - * dc/numeric.c: eliminate superfluous variable from dc_dump_num(); - annotate unused parameters in dc_add() and dc_sub(). - - * h/version.h: change dc version number to 1.2 for release. - -Sun Mar 8 21:13:50 1998 Phil Nelson - - * bc/main.c: Applied patch from Ken Pizzini to force line - mode buffering on stdout. - -Tue Jan 6 09:15:04 PST 1998 Ken Pizzini - - * h/version.h: dc is now up to version 1.1.5. - - * dc/eval.c, dc/numeric.c, doc/dc.texi, doc/dc.1: once again - changed the behavior of the 'P' command with a numeric argument - to make it more general. It now dumps out the *whole* number - (or rather, the whole of its positive integer portion) as a - byte stream. (For small values this is still the same as 'aP'.) - - * dc/dc-proto.h, dc/dc.h, dc/eval.c, dc/misc.c, dc/numeric.c, - dc/stack.c, dc/string.c: Changed most uses of dc_boolean to - either dc_discard or dc_newline, and instances of DC_TRUE and - DC_FALSE to appropriate instances of DC_TOSS, DC_KEEP, DC_NONL, - or DC_WITHNL so that the code self-documents a little better. - -Sun Jan 4 15:39:46 PST 1998 Ken Pizzini - - * dc/eval.c, doc/dc.texi, doc/dc.1: Changed the functionality - of the 'P' command, and added the 'n' command. Due to - a quirk of the implementation of traditional dc, some - people have come to expect that the 'P' command on a - numeric argument in the range of 1 to 99 should output - the corresponding character, despite the fact that this - usage can have very weird results for numbers outside - that range. This functionality is why the 'a' command - was introduced last March, but people really want it to - "just work" without needing to use the 'a' command. - Bowing to this demand, the 'P' command now does the - equivalent of "aP" if the argument is numeric, and the - 'n' command has been added to support the previous - functionality of the 'P' command. - - * dc/misc.c, dc/eval.c, dc/stack.c, dc/dc-proto.h: - Changed prototype for dc_print(). It now additionally - takes two flags, newline_p and discard_p, which it - passes through to dc_out_num() and dc_out_str() as - needed. - - * h/version.h: dc is now up to version 1.1.4. - -Sat Sep 27 13:48:53 1997 Ken Pizzini - - * h/version.h: dc is now up to version 1.1.3. - - * dc/stack.c, dc/array.c, dc/dc-proto.h, doc/dc.texi, doc/dc.1: - It has come to my attention that, though undocumented, - traditional dc stacked its arrays in parallel with the - stacking of simple registers. I have now duplicated - this functionality. - - * dc/dc.c, configure.in: line-buffer dc's output if setvbuf() - is supported. This was requested to simplify using dc as - an inferior process under emacs. - -Fri Sep 26 19:56:15 1997 Ken Pizzini - - * dc/dc.c: fixed bug reporting address for --help. - - * doc/dc.1, doc/dc.texi: corrected documentation of the maximum - admissible input base. - - * doc/dc.texi: corrected sample code equivalence for the | command. - - * lib/number.c: added a warning for non-zero scale in the base - for bc_raisemod(). - -Fri Sep 26 18:15:31 1997 Ken Pizzini - - * dc/eval.c, doc/dc.1, doc/dc.texi: added !=, !<, and !> commands. - - * dc/eval.c: eliminated double-free in 'a' command. - - * dc/dc.c: changed placment of check for filename "-" so that - "-f -" will work. - - * h/version.h: updated dc version to 1.1.2. - -Thu Sep 18 17:41:10 1997 Ken Pizzini - - * dc/eval.c: fixed off-by-one error for Q and q commands. - - * dc/dc.c: added missing f: to third argument of getopt(). - - * h/version.h: updated dc version to 1.1.1. - -Thu May 22 08:24:08 1997 Phil Nelson - - * lib/number.c(bc_sqrt): Fixed a bug that computed 0 for sqrt - of most numbers less than .000001. - -Thu May 1 10:41:38 1997 Phil Nelson - - * Test/timetest: change path to bc executable. - -Wed Apr 30 12:00:00 1997 Phil Nelson - - * Froze bc-1.04, started new directory for bc-1.05. - Fixes to bc-1.04 will be distributed as bc-1.05. - -Mon Apr 21 14:57:14 1997 Phil Nelson - - * bc/scan.l: Changed rules for single line comment to work - with lex as well as flex. Also, do not include \n in the - comment. - - * doc/bc.1: Clarified the single line comment and that \n - is processed outside of the comment. - -Sun Apr 20 22:21:30 1997 Phil Nelson - - * bc/scan.l: Added rules for a single line comment starting - with the # character. - - * doc/bc.1: Documented the single line comment. - - * bc/Makefile.am: Added DISTCLEANFILES for proper clean up. - -Sat Apr 19 22:08:05 1997 Phil Nelson - - * dc/Makefile.am: Removed file from distribution list. - - * h/version.h: Updated dc version to 1.1. - -Fri Apr 18 16:43:04 1997 Phil Nelson - - * lib/number.c (bc_add, bc_sub) Added 1 to the length - of the memset call to make sure it zeroed all the - storage. - -Fri Apr 18 13:58:56 1997 Phil Nelson - - * configure.in: Tweeks to get things right. Not sure if things - changed much. Still working with autoconf/automake to do - the right thing. - -Wed Apr 16 16:49:17 1997 Phil Nelson - - * bc/main.c (main): Changed processing of BC_ENV_ARGS. - - * bc/main.c (parse_args): Removed "start" parameter. - -Tue Apr 15 13:21:28 1997 Phil Nelson - - * acconfig.h: Included support for PACKAGE and VERSION. - - * configure.in: More tweeks for automake support. - - * h/number.h: Improve definition of MIN and MAX. - - * doc/bc.1: Changed copyright, tweeked other text, added - e-mail address for bugs. - - * doc/dc.1: Added copyright and GPL license information, - Changed a few .SH formats. - -Fri Apr 11 16:14:42 1997 Phil Nelson - - * Makefile.am configure.in doc/Makefile.am lib/Makefile.am - bc/Makefile.am bc/bc.y dc/Makefile.am: Changes to accomodate - automake-1.1n (pre-release version of automake 1.2). - - * bc/bc.y bc/sbc.y: Changes to make sure tokens are numbered the - same in bc/bc.h and bc/sbc.h. - - * bc/scan.l: Changes for automake's naming convention. - - * NEWS: Fixed a typo. - -Thu Apr 10 14:42:55 1997 Phil Nelson - - * bc/{execute.c, global.c, libmath.b, load.c, main.c, sbc.y - scan.l, storage.c, util.c}: Changed copyright comment and - added 1997 to copyright years. - - * h/{bcdefs.h, const.h, global.h, number.h proto.h, version.h}: - Changed copyright comment and added 1997 to copyright years. - - * h/version.h: Changed bc version to 1.04. - - * lib/number.c: Changed copyright comment and added 1997 to - copyright years. - - * lib/vfprintf.c: Noted that this was only for minix. - - * NEWS, README: README is now comp.sources.reviewed readme only. - NEWS now lists changes from version to version. - -Thu Apr 10 13:41:56 1997 Phil Nelson - - * Makefile.am: Removed FIXME stuff. - -Thu Apr 8 13:39:53 1997 Phil Nelson - - * bc/Makefile.am: Remove files that should not be distributed. - -Mon Apr 7 17:14:28 1997 Phil Nelson - - * Makefile.am: Removed Misc directory from distribution. - -Mon Apr 7 16:16:01 1997 Phil Nelson - - * bc/sbc.y: Corrected use of nextarg(). - -Tue Mar 25 19:32:28 1997 Ken Pizzini - - * dc/eval.c, dc/misc.c, dc/stack.c, dc/string.c, - dc/dc.h, dc/dc-proto.h, dc/dc.c, dc/numeric.c, - doc/dc.texi: updated years in copyright - notices. - - * dc/dc.1: updated last-revision date. - -Tue Mar 25 16:35:46 1997 Ken Pizzini - - * lib/number.c: give a run-time warning in bc_raisemod() - if the modulus does not appear to be an integer. - - * doc/dc.texi, doc/dc.1: documented a warning against - the use of the new | command in conjunction with a - non-integral modulus. - -Tue Mar 25 15:36:04 1997 Ken Pizzini - - * dc/string.c: dc_out_str() updated to use fwrite() - instead of printf(), to allow for the existence of - a NUL character in the string. - -Tue Mar 25 13:42:51 1997 Ken Pizzini - - * doc/dc.texi, doc/dc.1: added documentation for new | command. - -Tue Mar 25 13:19:55 1997 Ken Pizzini - - * dc/dc-proto.h: added prototype for dc_triop(). - -Tue Mar 25 12:00:38 1997 Ken Pizzini - - * lib/number.c: add bc_modexp() modular-exponentiation function. - - * h/proto.h: add prototypes for bc_modexp() and bc_divmod(). - -Tue Mar 25 09:07:13 1997 Ken Pizzini - - * doc/dc.texi, doc/dc.1: updated documentation with the - new command-line options. - - * doc/dc.texi, doc/dc.1: updated documentation with the - new '~', 'r', and 'a' commands. - - * dc/dc.c: added bug reporting information to --version text. - -Mon Mar 24 19:37:30 1997 Ken Pizzini - - * lib/number.c: added new "bc_divmod" function. - - * dc/numeric.c: added new "dc_divrem" glue function to bc_divmod. - - * dc/stack.c: added new "dc_binop2" function. - - * dc/dc-proto.h: added new prototypes for dc_divrem() and dc_binop2(). - - * dc/eval.c, dc/numeric.c: add new '~' command which - returns both the quotient and remainder from division. - -Mon Mar 24 18:13:42 1997 Ken Pizzini - - * dc/eval.c: Add new 'r' (reverse top two stack elements) command. - -Mon Mar 24 17:47:02 1997 Ken Pizzini - - * dc/misc.c: split out the main() related functions into - a seperate dc/dc.c file. - - * dc/Makefile.am: updated to reflect this split. - -Sat Mar 1 04:57:54 1997 Ken Pizzini - - * dc/misc.c: added "--file" option. - -Sat Mar 1 02:13:06 1997 Ken Pizzini - - * dc/eval.c: fixed bug of an excess increment in - dc_evalstr()'s DC_COMMENT case. (Probably would - never show up in practice, but did violate the - letter of the C Standard.) - - * renamed dc/number.c to dc/numeric.c, to avoid - confusion with lib/number.c. - -Thu Feb 27 19:45:45 1997 Ken Pizzini - - * dc/string.c, dc/dc.h: changed implementation of dc_str - type from a void * to a type which is only completed - in dc/string.c. No functional change, just prettier code. - -Thu Feb 27 18:25:19 1997 Ken Pizzini - - * Cleaned up Makefile.am files. - -Thu Feb 6 00:41:02 1997 Ken Pizzini - - * Noticed pre-autoconf vestages (NO_XXX configuration options); - fixed to refer to autoconf HAVE_XXX definitions. - - * The definition of BC_XXX values in h/const.h might - conflict with values of the same name from ; - fixed to override without spewing warnings. - - * Added check for ptrdiff_t to configure.in; removed - special ptrdiff_t definition from dc/string.c . - -Wed Feb 5 22:28:37 1997 Ken Pizzini - - * Only compile (guts of) lib/vfprintf.c if system does - not have its own version. - -Wed Feb 5 22:26:16 1997 Ken Pizzini - - * Changed dc/misc.c source to use standard GNU option - parsing routine (instead of special-case code). - - * Added "-e" option to dc. - - * Bumped dc version number to 1.0.4. - -Wed Feb 5 22:08:06 1997 Ken Pizzini - - * rearranged source layout (added subdirectory structure); - removed "dc-" prefix from dc C source in its new home. - - * merged bc's "version.h" and dc's "dc-version.h" files - into h/version.h; patched dc/misc.c to refer to new - DC_VERSION macro name. - - * Tweaked configure.in in anticipation of using automake. - -Wed Jul 24 16:27:20 1996 Phil Nelson - - * number.c (out_num): Move free of t_num to proper place. - -Mon Jun 3 00:31:10 1996 Phil Nelson - - * number.c: (bc_sqrt, is_near_zero) Was hanging in an infinite - loop on sqrt(.9999). Rewrote to take difference. New routine - is_near_zero to check for one digit off. - -Thu Feb 22 12:14:38 1996 Phil Nelson - - * dc-eval.c (dc_func): Added the 'a' (number to ascii character) - command. - -Thu Feb 22 11:55:15 1996 Phil Nelson - - * dc-eval.c: (Changes from Ken) Changes dealing with stdin_lookahead - and peekc. - - * dc-misc.c: (Changes from Ken) Changes in option processing. - - * dc-version.c: (Change from Ken) Version is 1.0.2. - -Mon Oct 9 15:40:06 1995 Phil Nelson - - * execute.c (execute): Add a pop to 'W' and 'P' codes. Otherwise, - the stack continues to grow. - - * number.c (out_num): Free all bc_nums used. - -Thu Jun 29 00:35:57 1995 Phil Nelson - - * bc.1: Added information about long options and use of the - readline library. - -Wed Jun 28 21:03:45 1995 Phil Nelson - - * scan.l: rl_input: detect EOF. - -Wed Jun 28 19:03:51 1995 Phil Nelson - - * Makefile.in: fbc target, changed $(LEXLIB) => $(LIBS) - -Wed Jun 28 01:33:07 1995 Phil Nelson - - * acconfig.h, bc.y, scan.l, storage.c, util.c, configure.in: - Improved readline support with a new pseudo variable "history" - that controls the number of history lines available. - Also removed "optional" history. - -Wed Jun 28 01:03:52 1995 Phil Nelson - - * getopt.h, getopt.c, getopt1.c: Imported from glibc-1.09 - to allow long option processing. - - * main.c (parse_args): Make it use long arguments. - - * global.h: Change option flag variables from "char" to "int" - to allow long_arguments easy access to the variables. - - * Makefile.in: Add getopt.h, getopt.c, and getopt1.c in the - proper places in the Makefile. - -Fri Jun 23 12:00:16 1995 Phil Nelson - - * scan.l, main.c (main), acconfig.h, configure.in: - Added support for readline input on stdin. - -Thu Jun 22 20:08:57 1995 Phil Nelson - - * bc.1: Change documentation on POSIX array parameter support. - -Fri Apr 7 12:29:28 1995 Phil Nelson - - * main.c (parse_args): change "char ch" to "int optch" with - related changes. - -Thu Mar 23 04:11:00 1995 Phil Nelson - - * bc.1: Update documentation to include new -q - option and the environment variables. - -Thu Mar 23 03:30:38 1995 Phil Nelson - - * bcdefs.h, global.h, main.c, util.c, bc.y: Reworked - argument processing to allow for getting arguments - from the environment and the command line. Added - a new mechanism to access file names for opening - and for error messages. Also added a "quiet" - option to turn off the welcome banner. - -Thu Mar 23 03:12:11 1995 Phil Nelson - - * util.c: Corrected a comment. - -Tue Mar 21 13:36:24 1995 Phil Nelson - - * bc.y: Added "opt_newline" to allow more newlines - in non-POSIX mode. - -Tue Mar 21 09:38:28 1995 Phil Nelson - - * execute.c, main.c, util.c: Add support for user - defined line length, "correct POSIX line length", - no breaking of strings in std_only mode. This - included adding a new function "out_schar" to - util.c. Also removed "if (interactive)" before - all fflushes. - -Tue Mar 21 09:12:16 1995 Phil Nelson - - * global.h: Added new variable "line_size". Cleaned up - some definitions by adding comments. - -Mon Mar 20 23:33:01 1995 Phil Nelson - - * proto.h: Define getopt only if no unistd.h file. - -Mon Mar 20 23:23:34 1995 Phil Nelson - - * number.c, proto.h, execute.c, storage.c, dc-number.c: - Changes to bc_add and bc_sub parameters to allow for - different scale results than were possible. This is - for correct implementation of modulo. All calls were - updated. - -Mon Mar 20 19:26:06 1995 Phil Nelson - - * sbc.y: Removed second parameter on calls to arg_str to match - real function. - -Tue Feb 28 14:30:18 1995 Phil Nelson - - * Makefile.in: Change realclean to maintainer-clean. Added warning. - -Mon Feb 27 17:08:24 1995 Phil Nelson - - * number.c: Change output to conform with POSIX standard for zero - only when the -s flag is given. Otherwise it does the tradational - thing. - - * dc-misc.c: Add the "std_only" flag, always set to zero. This is - needed due to the above change. - -Tue Nov 29 15:18:20 1994 Phil Nelson - - * bc.1: Remove the "then" keyword in the if statement documentation. - -Mon Nov 28 16:50:25 1994 Phil Nelson - - * bc.1: Fixed a font change error. - - * Makefile.in: Added missing \ in two targets. - -Tue Nov 22 11:09:08 1994 Phil Nelson - - * bc.1: clarified ibase and math routines. - -Thu Nov 3 14:09:31 1994 Phil Nelson (phil@cs.wwu.edu) - - * Makefile.in: added targets uninstall, installdirs and modified - other targets to get makes in a directory other than srcdir to - work. - - * configure.in: added shell commands to get configure to work - correctly in directories other than srcdir. - -Wed Nov 2 10:18:19 1994 Phil Nelson (phil@cs.wwu.edu) - - * bc.1 bc.y bcdefs.h const.h execute.c global.c global.h load.c - main.c number.c number.h proto.h sbc.y scan.l storage.c util.c: - updated copyright to 1994. - - * version.h: updated version number and copyright date. - - * Makefile.in, configure.in, Install: updated for use with - autoconf-2.0 and install-sh. Changed target install a bit. - - * install-sh: Included this file from the autoconf-2.0 - distribution to have configure run without errors. - - * README: updated to version 1.03. - -Mon Oct 31 10:26:28 1994 Phil Nelson (phil@cs.wwu.edu) - - * Added Ken Pizzini's dc implementation that uses bc numeric - routines. The following files have been added: - dc-Concerns dc-array.c dc-eval.c dc-misc.c dc-number.c - dc-proto.h dc-regdef.h dc-stack.c dc-string.c dc-version.h - dc.1 dc.h dc.texinfo - - * dc-array.c: Added a conditional include of stdlib.h to get - size_t defined on my SunOS 4.1.3 system. - - * configure.in: Added support for dc. - - * Makefile.in: Added support for dc. Added rule to make - config.h.in. - -Sun Aug 7 15:09:19 1994 Phil Nelson (phil@cs.wwu.edu) - - * configure.in, Makefile.in, acconfig.h: Add support for autoconf. - Removed old Makefile. - -Wed Jul 20 22:46:32 1994 Phil Nelson (phil@cs.wwu.edu) - - * bc.y: change definition of next_label in function definition. - Previous value of 0 caused break to not work. It is now 1. - -Fri Apr 8 14:16:37 1994 Phil Nelson (phil@cs.wwu.edu) - - * Makefile: Change the distribution to include libmath.h.dist - which is a copy of libmath.h that has the compiled libmath.b. - -Sun Feb 13 01:08:14 1994 Phil Nelson (phil@cs.wwu.edu) - - * execute.c: Change the string quote characters to be more like - C. \a => alert (bell) \b => backspace and added \q => ". - - * bc.1: Updated information on above changes. - -Wed Oct 27 23:34:40 1993 Phil Nelson (phil@cs.wwu.edu) - - * Makefile: Changed compress to gzip. Changed the - comment and definition of the DOT_IS_LAST compile option. - - * scan.l: Changed DOT_IS_LAST to NO_DOT_LAST and changed - the test so "." is the last variable is standard. - -Wed May 19 15:15:12 1993 Phil Nelson (phil at cs.wwu.edu) - - * number.c: Fixed output of negative numbers in bases other than - base 10. - -Wed Apr 21 11:56:31 1993 Phil Nelson (phil at cs.wwu.edu) - - * bc.1: Changed Steve Sommars e-mail address. - -Wed Apr 14 12:13:39 1993 Phil Nelson (phil at cs.wwu.edu) - - * sbc.y: removed leading , on first line. - -Wed Mar 31 16:12:39 1993 Phil Nelson (phil at cs.wwu.edu) - - * bc.1: Updated segment number for function bodies. - -Thu Mar 11 15:34:34 1993 Phil Nelson (phil at cs.wwu.edu) - - * Makefile: added version.h to bc.o's dependency list. - -Mon Mar 1 14:00:46 1993 Phil Nelson (phil at cs.wwu.edu) - - * util.c: (nextarg) changed parameter "val" to be an int. - -Tue Feb 16 10:06:45 1993 Phil Nelson (phil at cs.wwu.edu) - - * util.c: (call_str, arg_str) added a function call_str that - correctly produces the string of argmuent types for a function - call. arg_str produced them in the reverse order. This - eliminated the need for the "comma" argument to arg_str, which - was removed. - - * bc.y: changed the calls to arg_str to have only one parameter - in the function definition rule and replaced the call to arg_str - with call_str in the function call rule. - -Tue Nov 24 17:38:40 1992 Phil Nelson (phil at cs.wwu.edu) - - * Makefile: Added LEXLIB definitions for use with lex. - -Thu Oct 22 13:43:16 1992 Phil Nelson (phil at cs.wwu.edu) - - * number.c (bc_raise): Rearranged and added code to speed up - the computation by not doing unneeded multiplications. - -Wed Sep 30 10:43:52 1992 Phil Nelson (phil at cs.wwu.edu) - - * global.h: Fixed documentation. - -Tue Sep 29 15:27:50 1992 Phil Nelson (phil at cs.wwu.edu) - - * storage.c (process_params): Changed processing of more arguments - than in a function definition to just a return. - - * Makefile: Made changes to make it more in conformance with the - GNU coding standards. - -Tue Jul 7 21:09:07 1992 Phil Nelson (phil at cs.wwu.edu) - - * (const.h, bc.y, util.c) Added code so that when the math - library is loaded, redefinition of any math library function - will not cause the other functions to quit working correctly. - Before this change, redefining a(x) would cause s(x) and c(x) - to quit working and redefining s(x) would cause c(x) to quit - working. - -Wed Jul 1 14:35:29 1992 Phil Nelson (phil at cs.wwu.edu) - - * (libmath.b) Changed the calculation of scale for computing - e(x) and l(x). This provides a little more accuracy in the - last digit at the expense of a little speed. - - * (Test/checklib.b) Changed tests to be parameterized and test - more values. - -Thu Jun 25 09:22:59 1992 Phil Nelson (phil at cs.wwu.edu) - - * (configure) changed the script from looking in the - include directory for a .h file to asking cc (gcc) to - find the .h file. This will allow better detection - of include files available to the C compiler. - -Wed Jun 24 22:11:37 1992 Phil Nelson (phil at cs.wwu.edu) - - * (bc.y) Added a warning for the "last" variable. - - * (scan.l) Added code to allow for a single dot (.) to be the - same as the variable "last". This is not a "standard" feature, - but is provided for those who want it. - - * (Install) Documented the new define for dot (.). - - * (bc.1) Documented the use of dot (.) for "last". - - * (Makefile) Added an easy method for adding extra defines for - use during the compile. Set DOT_IS_LAST as a standard - extra define. - - * (number.c) Changed the code for sqrt for better speed. - -Mon Jun 22 21:47:05 1992 Phil Nelson (phil at cs.wwu.edu) - - * Changed the name of math.h to libmath.h to avoid conflict - with /usr/include/math.h. Changed all references to math.h - to libmath.h in all files. - - * (configure) Changed the test for long strings accepted by - cc to not include libmath.h and thus not need to distribute - a file that is generated by the system. - - * (Makefile) Changed PREFIX, BINDIR, LIBDIR, and MANDIR to - lower case. - -Tue Mar 3 10:16:07 1992 Phil Nelson (phil at cs.wwu.edu) - - * (main.c) Added missing } at line 140. - - * (version.h) Changed date of version 1.02 to March 3, 1992. - -Mon Feb 3 16:07:57 1992 Phil Nelson (phil at cs.wwu.edu) - - * (version.h) Updated version number and date. - - * (bc.1) Added a new "VERSION" section. - -Wed Jan 29 14:13:55 1992 Phil Nelson (phil at cs.wwu.edu) - - * (execute.c) Removed the setjmp and longjmp calls that may have - caused some problems with interrupted programs. - -Thu Jan 16 17:08:16 1992 Phil Nelson (phil at cs.wwu.edu) - - * (Makefile) Changed install to install the manual. - -Wed Jan 8 13:23:42 1992 Phil Nelson (phil at cs.wwu.edu) - - * Change all copyright notices to include 1992. - - * (load.c) Added termination to "load_code" to ignore code - after an error has been found. - - * (scan.l) Changed the check for NUL characters in STRING tokens - (before the close quote) to work correctly. Also added code to - report illegal characters in a more readable output format. - - * (bc.1) Added the exclusion of NUL characters from strings in - the "differences" section and updated date of last change. - - * (const.h) Changed BC_MAX_SEGS to 16. - -Mon Jan 6 14:20:02 1992 Phil Nelson (phil at cs.wwu.edu) - - * (number.c) Changed the out_num routine to use a correct field - size for bases greater than 16. e.g. For base 1000, each - "digit" is a three digit number. - - * (Makefile) Added the "8" flag to get an 8 bit scanner. - - * (scan.l) Changed "char *" to "unsigned char *" to match the - declaration of yytext for the 8 bit scanner. Also added code - to detect the null character in strings and generate an error. - -Sat Jan 4 20:32:20 1992 Phil Nelson (phil at cs.wwu.edu) - - * (const.h) Changed BC_BASE_MAX to INT_MAX to allow more bases! - -Mon Dec 30 21:47:28 1991 Phil Nelson (phil at cs.wwu.edu) - - * (main.c) Fixed the bug that loaded the math library before - every file. - - * (bc.y) Removed some type declarations that duplicated token - definitions so it could be run through bison. - - * (load.c) Added a check for maximum code size. - - * (Makefile) Added a prefix for LIBDIR and BINDIR so it can be - changed easily. - -Mon Nov 25 13:11:17 1991 Phil Nelson (phil at cs.wwu.edu) - - * Changed version number in version.h to 1.01 with current date. - - * Changed LIBFILE definition in Makefile. - - * Added a recursive function example to bc.1. - -Sun Nov 24 21:24:01 1991 Phil Nelson (phil at cs.wwu.edu) - - * Changed the Makefile to make sure configure is run first. - Added the $(CC) the configure call. Moved some defines - toward the front of the Makefile to make sure they are - read by installers. Also added SUBDIRS variable and updated - the GNU distribution to include the subdirectories. Included - math.h in the distribution for use by configure. Included - ChangeLog in the distribution. - - * Split the README into README and Install. Changed Install - to have current information. Documented the STRINGS_H define. - Updated the version number in README. - - * Added a check for in configure. - -Fri Nov 22 15:06:32 1991 Phil Nelson (phil at cs.wwu.edu) - - * Changed configure to check for varargs.h first. Also, added - checks to see if long strings (math.h) are accepted by the - C compiler. Also added parameters to configure. - - * Deleted #include from proto.h. Also made only - ANSI C compilers include . - - * Changed the Makefile to have the install bin directory be - /usr/local/bin and the install lib directory be /usr/local/lib. - - * Changed some files in the Test directory to eliminate the - = form that some older bcs don't like. - - * Made some small corrections in bc.1. - -Tue Oct 29 10:06:32 1991 Phil Nelson (phil at cs.wwu.edu) - - * Called current version 1.00. - - * Submitted GNU bc-1.00 to comp.sources.reviewed diff --git a/contrib/bc/Examples/ckbook.b b/contrib/bc/Examples/ckbook.b deleted file mode 100644 index 5815ea02075c..000000000000 --- a/contrib/bc/Examples/ckbook.b +++ /dev/null @@ -1,16 +0,0 @@ -scale=2 -print "\nCheck book program!\n" -print " Remember, deposits are negative transactions.\n" -print " Exit by a 0 transaction.\n\n" - -print "Initial balance? "; bal = read() -bal /= 1 -print "\n" -while (1) { - "current balance = "; bal - "transaction? "; trans = read() - if (trans == 0) break; - bal -= trans - bal /= 1 -} -quit diff --git a/contrib/bc/Examples/pi.b b/contrib/bc/Examples/pi.b deleted file mode 100644 index 0d840cf795ee..000000000000 --- a/contrib/bc/Examples/pi.b +++ /dev/null @@ -1,53 +0,0 @@ -/* - This is a program to determine the distribution of digits in the - fraction part of PI. It will look at the first scale digits. - - The results are left in the global variable digits. - digits[0] is the number of 0's in PI. - - This program requires the math library. -*/ - -define pi () { - auto ix, pi, save_scale, work; - - save_scale = scale; - scale += 5; - print "\n\nCalculating PI to ",scale," digits. Please wait . . ."; - pi = 4*a(1); - scale -= 5; - work = pi; - - print "\nCounting digits. . ."; - for (ix = 0; ix < 10; ix++) digits[ix] = 0; - - /* Extract the One's digit from pi. */ - scale = 0; - one_digit = work / 1; - - for (ix = save_scale; ix > 0; ix--) { - - /* Remove the One's digit and multiply by 10. */ - scale = ix; - work = (work - one_digit) / 1 * 10; - - /* Extract the One's digit. */ - scale = 0; - one_digit = work / 1; - - digits[one_digit] += 1; - } - - /* Restore the scale. */ - scale = save_scale; - - /* Report. */ - print "\n\n" - print "PI to ", scale, " digits is:\n", pi/1, "\n\n" - print "The frequency of the digits are:\n" - for (ix = 0; ix < 10; ix++) { - print " ", ix, " - ", digits[ix], " times\n" - } - - print "\n\n" -} diff --git a/contrib/bc/Examples/primes.b b/contrib/bc/Examples/primes.b deleted file mode 100644 index 2b52ca7e3f8e..000000000000 --- a/contrib/bc/Examples/primes.b +++ /dev/null @@ -1,32 +0,0 @@ - -/* An example that finds all primes between 2 and limit. */ - -define primes (limit) { - auto num, p, root, i - - prime[1] = 2; - prime[2] = 3; - num = 2; - if (limit >= 2) print "prime 1 = 2\n" - if (limit >= 3) print "prime 2 = 3\n"; - scale = 0; - - for ( p=5; p <= limit; p += 2) { - root = sqrt(p); - isprime = 1; - for ( i = 1; i < num && prime[i] <= root; i++ ) { - if ( p % prime[i] == 0 ) { - isprime = 0; - break; - } - } - if (isprime) { - num += 1; - prime [num] = p; - print "prime ", num, " = ", p, "\n" - } - } -} - - -print "\ntyping 'primes (10)' will print all primes less than 10.\n" diff --git a/contrib/bc/Examples/twins.b b/contrib/bc/Examples/twins.b deleted file mode 100644 index de910a793125..000000000000 --- a/contrib/bc/Examples/twins.b +++ /dev/null @@ -1,40 +0,0 @@ - -/* An example that finds all primes between 2 and limit. */ - -define primes (limit) { - auto num, p, root, i - - prime[1] = 2; - prime[2] = 3; - num = 2; - scale = 0; - - for ( p=5; p <= limit; p += 2) { - root = sqrt(p); - isprime = 1; - for ( i = 1; i < num && prime[i] <= root; i++ ) { - if ( p % prime[i] == 0 ) { - isprime = 0; - break; - } - } - if (isprime) { - num += 1; - prime [num] = p; - } - } -} - - -print "\ntyping 'twins (10)' will print all twin primes less than 10.\n" - -define twins (limit) { - auto i; - - i = primes(limit+2); - - for (i=1; prime[i] > 0; i++) { - if ((prime[i]+2) == prime[i+1]) \ - print "twins are ", prime[i], " and ", prime[i+1], "\n" - } -} diff --git a/contrib/bc/FAQ b/contrib/bc/FAQ deleted file mode 100644 index 32dd051d7810..000000000000 --- a/contrib/bc/FAQ +++ /dev/null @@ -1,17 +0,0 @@ -Because of frequent questions ....... here is the BC FAQ - - -1) Why does BC have its own arbitrary precision number routines - (found in lib/number.c) rather than using GMP? - -GMP has "integers" (no digits after a decimal), "rational numbers" -(stored as 2 integers) and "floats". None of these will correctly -represent a POSIX BC number. Floats are the closest, but will not -behave correctly for many computations. For example, BC numbers have -a "scale" that represent the number of digits to represent after the -decimal point. The multiplying two of these numbers requires one to -calculate an exact number of digits after the decimal point regardless -of the number of digits in the integer part. GMP floats have a -"fixed, but arbitrary" mantissa and so multiplying two floats will end -up dropping digits BC must calculate. - diff --git a/contrib/bc/FREEBSD-upgrade b/contrib/bc/FREEBSD-upgrade deleted file mode 100644 index 0174d7bbbe92..000000000000 --- a/contrib/bc/FREEBSD-upgrade +++ /dev/null @@ -1,14 +0,0 @@ -$FreeBSD$ - -bc 1.0.5a - originals can be found at: ftp://prep.ai.mit.edu/pub/gnu/ - removed no subdirectories - removed bc/scan.c bc/bc.c bc/bc.h doc/texinfo.tex doc/dc.info - removed */getopt* - obrien@FreeBSD.ORG - - Imported with the commands: - - tar xvzf bc-1.0.5a.tar.gz - cd bc-1.0.5 - cvs import src/contrib/bc BC bc_1_0_5a diff --git a/contrib/bc/INSTALL b/contrib/bc/INSTALL deleted file mode 100644 index 3b50ea95726f..000000000000 --- a/contrib/bc/INSTALL +++ /dev/null @@ -1,176 +0,0 @@ -Basic Installation -================== - - These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes a while. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. - diff --git a/contrib/bc/Makefile.am b/contrib/bc/Makefile.am deleted file mode 100644 index 6703d74cf994..000000000000 --- a/contrib/bc/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = lib bc dc doc - -MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in \ - $(distdir).tar.gz h/number.h - -dist-hook: - mkdir $(distdir)/h $(distdir)/Examples $(distdir)/Test - cp -p $(srcdir)/h/*.h $(distdir)/h - cp -p $(srcdir)/Examples/*.b $(distdir)/Examples - cp -p $(srcdir)/Test/*.b $(srcdir)/Test/*.bc $(distdir)/Test - cp -p $(srcdir)/Test/signum $(srcdir)/Test/timetest $(distdir)/Test - cp -p $(srcdir)/lib/testmul.c $(distdir)/lib - cp -p $(srcdir)/FAQ $(distdir) - -timetest: - (cd lib; $(MAKE) specialnumber) diff --git a/contrib/bc/Makefile.in b/contrib/bc/Makefile.in deleted file mode 100644 index b57eae58408b..000000000000 --- a/contrib/bc/Makefile.in +++ /dev/null @@ -1,368 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = . - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -SUBDIRS = lib bc dc doc - -MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in $(distdir).tar.gz h/number.h - -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -DIST_COMMON = README ./stamp-h.in AUTHORS COPYING COPYING.LIB ChangeLog \ -INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.h.in \ -configure configure.in install-sh missing mkinstalldirs - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -all: all-redirect -.SUFFIXES: -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(ACLOCAL_M4): configure.in - cd $(srcdir) && $(ACLOCAL) - -config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck -$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) - cd $(srcdir) && $(AUTOCONF) - -config.h: stamp-h - @if test ! -f $@; then \ - rm -f stamp-h; \ - $(MAKE) stamp-h; \ - else :; fi -stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=config.h \ - $(SHELL) ./config.status - @echo timestamp > stamp-h 2> /dev/null -$(srcdir)/config.h.in: $(srcdir)/stamp-h.in - @if test ! -f $@; then \ - rm -f $(srcdir)/stamp-h.in; \ - $(MAKE) $(srcdir)/stamp-h.in; \ - else :; fi -$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h - cd $(top_srcdir) && $(AUTOHEADER) - @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null - -mostlyclean-hdr: - -clean-hdr: - -distclean-hdr: - -rm -f config.h - -maintainer-clean-hdr: - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. - -@SET_MAKE@ - -all-recursive install-data-recursive install-exec-recursive \ -installdirs-recursive install-recursive uninstall-recursive \ -check-recursive installcheck-recursive info-recursive dvi-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ - rev="$$subdir $$rev"; \ - test "$$subdir" = "." && dot_seen=yes; \ - done; \ - test "$$dot_seen" = "no" && rev=". $$rev"; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - -rm -rf $(distdir) - GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz - mkdir $(distdir)/=build - mkdir $(distdir)/=inst - dc_install_base=`cd $(distdir)/=inst && pwd`; \ - cd $(distdir)/=build \ - && ../configure --srcdir=.. --prefix=$$dc_install_base \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) dist - -rm -rf $(distdir) - @banner="$(distdir).tar.gz is ready for distribution"; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes" -dist: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -dist-all: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -distdir: $(DISTFILES) - -rm -rf $(distdir) - mkdir $(distdir) - -chmod 777 $(distdir) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - for subdir in $(SUBDIRS); do \ - if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ - || exit 1; \ - chmod 777 $(distdir)/$$subdir; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook -info-am: -info: info-recursive -dvi-am: -dvi: dvi-recursive -check-am: all-am -check: check-recursive -installcheck-am: -installcheck: installcheck-recursive -all-recursive-am: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -install-exec-am: -install-exec: install-exec-recursive - -install-data-am: -install-data: install-data-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-recursive -uninstall-am: -uninstall: uninstall-recursive -all-am: Makefile config.h -all-redirect: all-recursive-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: installdirs-recursive -installdirs-am: - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-recursive - -clean-am: clean-hdr clean-tags clean-generic mostlyclean-am - -clean: clean-recursive - -distclean-am: distclean-hdr distclean-tags distclean-generic clean-am - -distclean: distclean-recursive - -rm -f config.status - -maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-recursive - -rm -f config.status - -.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ -install-data-recursive uninstall-data-recursive install-exec-recursive \ -uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ -all-recursive check-recursive installcheck-recursive info-recursive \ -dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ -maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ -distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ -dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ -install-exec-am install-exec install-data-am install-data install-am \ -install uninstall-am uninstall all-redirect all-am all installdirs-am \ -installdirs mostlyclean-generic distclean-generic clean-generic \ -maintainer-clean-generic clean mostlyclean distclean maintainer-clean - - -dist-hook: - mkdir $(distdir)/h $(distdir)/Examples $(distdir)/Test - cp -p $(srcdir)/h/*.h $(distdir)/h - cp -p $(srcdir)/Examples/*.b $(distdir)/Examples - cp -p $(srcdir)/Test/*.b $(srcdir)/Test/*.bc $(distdir)/Test - cp -p $(srcdir)/Test/signum $(srcdir)/Test/timetest $(distdir)/Test - cp -p $(srcdir)/lib/testmul.c $(distdir)/lib - cp -p $(srcdir)/FAQ $(distdir) - -timetest: - (cd lib; $(MAKE) specialnumber) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/NEWS b/contrib/bc/NEWS deleted file mode 100644 index fc02a0d5a7b9..000000000000 --- a/contrib/bc/NEWS +++ /dev/null @@ -1,68 +0,0 @@ -This is GNU bc version 1.06. (And dc version 1.2) - -Changes in dc from 1.2 to 1.3: - Minor bug fixes. - New multiply algorithm of bc. - -Changes in bc from 1.05 to 1.06: - New multiply algoirthm and many other changes in lib/number.c - Function size now done dynamically. - Function syntax in non-posix mode allows newlines in more places. - Bug fixes: - improved computation of j(n,x). - enables readline only if interactive. - for statment bug fixed. - use int instead of char for readline char counts. - improved cosine accuracy. - -Changes in dc from 1.1 to 1.2: - added !< != !> commands - arrays now stack - output is now line buffered, provided setvbuf() is available - fixed known bugs in 'q', 'Q', 'a' commands, '-f' command-line option, - and documentation - changed the 'P' command's behavior on a numeric argument: - due to popular demand it now does the equivalent of 'aP' - (for small values) - added new 'n' command to do what the old 'P' command did - -Changes in bc from 1.04 to 1.05: - Solaris makes work better. - bug fixes - stdout now always does line buffering. - sqrt bug fixed for small numbers. - readline (if support is compiled in) is enabled only for - interactive executions of bc. - - -This is GNU bc version 1.04. (And dc version 1.1) - -Changes from 1.03 - - reorganization of source tree - use of automake - - new commands for dc (|, ~, r, a) - new command line options for dc - - fixed infinite loop in sqrt in bc - fixed an I/O bug in bc - made bc conform to POSIX for array parameters - added long option support for bc - new commandline options for bc (-q) - added support for readline to bc (use configure --with-readline) - command line argumens can now be taken from an environment variable - - -Changes from 1.02 - - minor bug fixes in bc. - - addition of Ken Pizzini's dc program that uses the GNU bc - arbitrary precision arithmetic routines. - -Changes from 1.01 - - minor bug fixes. - - diff --git a/contrib/bc/README b/contrib/bc/README deleted file mode 100644 index 2813fb8eb239..000000000000 --- a/contrib/bc/README +++ /dev/null @@ -1,86 +0,0 @@ -GNU bc version 1.06: - -Extra configuration options: - - --with-readline tells bc to use the readline package that allows - for editing input lines when run interactive. - - --with-editline tells bc to use the BSD editline package that - allows for editing input lines when run interactive. - -Extra make steps: - - The simple make compiles a version of bc with fixed parameters - for the recursive multiplication algorithm. The fixed parameter - is the number of digits where a sequential algorithm is used - instead of the recursive algorithm. It is set to a value that - is known good on a couple of machines. (Sparc Ultra 10, Pentium - II, 450.) I'm calling this point the crossover point. - - To make a version of bc with a custom crossover point for your - machine, do the following steps: - - make timetest - make - - The timetest step takes a minimum of 10 minutes to complete. - - --------- Original comp.sources.reviewed README -------- - -Program: GNU bc -Author: Philip A. Nelson -E-mail: phil@cs.wwu.edu -OS: UNIX (BSD, System V, MINIX, POSIX) -Copying: GNU GPL version 2 -Copyright holder: Free Software Foundation, Inc. -Version: bc version 1.01 -Required: vsprintf and vfprintf routines. -Machines: It has been compiled and run on the following environments: - BSD4.3 (VAX 11) - MINIX 1.5 (IBM PC, both K&R and ANSI compilers) - MINIX 1.5 (pc532) - SUN-OS 4.1 (SUN 3 and SUN 4) - SVR3V5 (Motorola 68K) - SVR3.2 (3B2) - SVR4.0.2 (a 386 box) - ULTRIX 4.1 (DEC 5000) - UTS (Amdahl) - -bc is an arbitrary precision numeric processing language. Syntax is -similar to C, but differs in many substantial areas. It supports -interactive execution of statements. bc is a utility included in the -POSIX P1003.2/D11 draft standard. - -This version was written to be a POSIX compliant bc processor with -several extensions to the draft standard. Option flags are available -to cause warning or rejection of the extensions to the POSIX standard. -For those who want only POSIX bc with no extensions, a grammar is -provided for exactly the language described in the POSIX document. -The grammar (sbc.y) comes from the POSIX document. The Makefile -contains rules to make sbc. (for Standard BC) - -Since the POSIX document does not specify how bc must be implemented, -this version does not use the historical method of having bc be a -compiler for the dc calculator. This version has a single executable -that both compiles the language and runs the a resulting "byte code". -The "byte code" is NOT the dc language. - -Also, included in the initial distribution is the library file -vfprintf.c for MINIX systems. My minix 1.5 did not have this file. -Also, you should verify that vsprintf.c works correctly on your -system. - -The extensions add some features I think are missing. The major -changes and additions for bc are (a) names are allowed to be full -identifiers ([a-z][a-z0-9_]*), (b) addition of the &&, ||, and ! -operators, (c) allowing comparison and boolean operations in any -expression, (d) addition of an else clause to the if statement, (e) -addition of a new standard function "read()" that reads a number from -the standard input under program control, (f) passing of arrays as -parameters by variable, (g) addition of the "halt" statement that is -an executable statement unlike the quit (i.e. "if (1 == 0) quit" will -halt bc but "if (1 == 0) halt" will not halt bc.), and (h) the -addition of the special variable "last" that is assigned the value of -each print as the number is printed. ------------------------------------------------------------------------ diff --git a/contrib/bc/Test/BUG.bc b/contrib/bc/Test/BUG.bc deleted file mode 100644 index 254eefe68f59..000000000000 --- a/contrib/bc/Test/BUG.bc +++ /dev/null @@ -1,40 +0,0 @@ -/* <--- bug.bc ---><--- bug.bc ---><--- bug.bc ---><--- bug.bc ---> */ - -/* - * See the file "signum" for a description and reference for this - * program. - * - * THIS BUG IS *NOT* IN GNU BC!!! - * - */ - -obase=16 -ibase=16 -x=1A8F5C99605AE52 /* dividend */ -y=BB0B404 /* divisor */ -q=245A07AD /* (correct) quotient */ -r=147EB9E /* (correct) remainder */ -"Base 16 -" -"x = "; x /* output numbers just to be sure... */ -"y = "; y -"quo = "; q -"rem = "; r -"x/y = "; x/y /* watch this result! */ -"x%y = "; x%y /* watch this result! */ -"y*q+r= "; y*q+r /* check quotient & remainder */ -/* - * Do the same thing in base 10: - */ -" -Base 10 -" -ibase=A -obase=10 -"x = "; x /* output numbers just to be sure... */ -"y = "; y -"q = "; q -"r = "; r -"x/y = "; x/y /* watch this result! */ -"x%y = "; x%y /* watch this result! */ -"y*q+r= "; y*q+r /* check quotient & remainder */ diff --git a/contrib/bc/Test/array.b b/contrib/bc/Test/array.b deleted file mode 100644 index a0341ec7d748..000000000000 --- a/contrib/bc/Test/array.b +++ /dev/null @@ -1,14 +0,0 @@ -"This tests arrays! -" -define p(x,y) { - auto i; - for (i=x; i= t) { - "Bad Scales. Try again. -"; return; - } - - for (i = x; i < y; i += d) { - scale = s; - u = f(i); - scale = t; - v = f(i); - scale = s; - w = v / 1; - b += 1; - if (u != w) { - c += 1; -" -Failed: -" - " index = "; i; - " val1 = "; u; - " val2 = "; v; -" -" - } - } - -" -Total tests: "; b; -" -Total failures: "; c; -" -Percent failed: "; scale = 2; c*100/b; - -} - -/* - b = begining scale value, - l = limit scale value, - i = increment scale value. - - if b is set to a non-zero value before this file is executed, - b, l and i are not reset. -*/ - -if (b == 0) { b = 10; l = 61; i = 10; } - -" -Checking e(x)" -define f(x) { - return (e(x)) -} -for (s=10; ss. - the result from scale t is divided by 1 at scale s and the - results are compared. If they are different, the function is - said to have failed. It will then print out the value of i - (called index) and the two original values val1 (scale s) and - val2 (scale t) */ - -define t (x,y,d,s,t) { - auto u, v, w, i, b, c; - - if (s >= t) { - "Bad Scales. Try again. -"; return; - } - - for (i = x; i < y; i += d) { - scale = s; - u = f(i); - scale = t; - v = f(i); - scale = s; - w = v / 1; - b += 1; - if (u != w) { - c += 1; -" -Failed: -" - " index = "; i; - " val1 = "; u; - " val2 = "; v; -" -" - } - } - -" -Total tests: "; b; -" -Total failures: "; c; -" -Percent failed: "; scale = 2; c*100/b; - -} diff --git a/contrib/bc/Test/timetest b/contrib/bc/Test/timetest deleted file mode 100755 index 1a4d0ea1c367..000000000000 --- a/contrib/bc/Test/timetest +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# -# Time the functions. -# -SYSBC=/usr/bin/bc -if [ x$BC = x ] ; then - BC=../bc/bc -fi -for file in exp.b ln.b sine.b atan.b jn.b mul.b div.b raise.b sqrt.b -do -for prog in $BC $SYSBC $OTHERBC -do -echo Timing $file with $prog -time $prog -l $file -done -done diff --git a/contrib/bc/acconfig.h b/contrib/bc/acconfig.h deleted file mode 100644 index ff17f82fe7bb..000000000000 --- a/contrib/bc/acconfig.h +++ /dev/null @@ -1,24 +0,0 @@ -/* PACKAGE name */ -#undef PACKAGE - -/* Package VERSION number */ -#undef VERSION - -/* VERSION number for DC target*/ -#undef DC_VERSION - -/* COPYRIGHT notice for DC target */ -#undef DC_COPYRIGHT - -/* COPYRIGHT notice for BC target */ -#undef BC_COPYRIGHT - -/* Define to use the readline library. */ -#undef READLINE - -/* Define to use the BSD libedit library. */ -#undef LIBEDIT - -/* Define to `size_t' if and don't define. */ -#undef ptrdiff_t - diff --git a/contrib/bc/aclocal.m4 b/contrib/bc/aclocal.m4 deleted file mode 100644 index 102dc3e37f3c..000000000000 --- a/contrib/bc/aclocal.m4 +++ /dev/null @@ -1,136 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.4 - -dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - -dnl Usage: -dnl AM_INIT_AUTOMAKE(package,version, [no-define]) - -AC_DEFUN(AM_INIT_AUTOMAKE, -[AC_REQUIRE([AC_PROG_INSTALL]) -PACKAGE=[$1] -AC_SUBST(PACKAGE) -VERSION=[$2] -AC_SUBST(VERSION) -dnl test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi -ifelse([$3],, -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) -AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) -AC_REQUIRE([AM_SANITY_CHECK]) -AC_REQUIRE([AC_ARG_PROGRAM]) -dnl FIXME This is truly gross. -missing_dir=`cd $ac_aux_dir && pwd` -AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) -AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) -AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) -AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) -AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) -AC_REQUIRE([AC_PROG_MAKE_SET])]) - -# -# Check to make sure that the build environment is sane. -# - -AC_DEFUN(AM_SANITY_CHECK, -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "[$]*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "[$]*" != "X $srcdir/configure conftestfile" \ - && test "[$]*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "[$]2" = conftestfile - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -rm -f conftest* -AC_MSG_RESULT(yes)]) - -dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) -dnl The program must properly implement --version. -AC_DEFUN(AM_MISSING_PROG, -[AC_MSG_CHECKING(for working $2) -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if ($2 --version) < /dev/null > /dev/null 2>&1; then - $1=$2 - AC_MSG_RESULT(found) -else - $1="$3/missing $2" - AC_MSG_RESULT(missing) -fi -AC_SUBST($1)]) - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - -AC_DEFUN(AM_CONFIG_HEADER, -[AC_PREREQ([2.12]) -AC_CONFIG_HEADER([$1]) -dnl When config.status generates a header, we must update the stamp-h file. -dnl This file resides in the same directory as the config header -dnl that is generated. We must strip everything past the first ":", -dnl and everything past the last "/". -AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl -ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, -<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, -<>; do - case " <<$>>CONFIG_HEADERS " in - *" <<$>>am_file "*<<)>> - echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx - ;; - esac - am_indx=`expr "<<$>>am_indx" + 1` -done<<>>dnl>>) -changequote([,]))]) - - -dnl AM_PROG_LEX -dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT -AC_DEFUN(AM_PROG_LEX, -[missing_dir=ifelse([$1],,`cd $ac_aux_dir && pwd`,$1) -AC_CHECK_PROGS(LEX, flex lex, "$missing_dir/missing flex") -AC_PROG_LEX -AC_DECL_YYTEXT]) - diff --git a/contrib/bc/bc/Makefile.am b/contrib/bc/bc/Makefile.am deleted file mode 100644 index 91873394c885..000000000000 --- a/contrib/bc/bc/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -## Process this file with automake to produce Makefile.in -bin_PROGRAMS = bc - -bc_SOURCES = main.c bc.y scan.l execute.c load.c storage.c util.c global.c - -EXTRA_DIST = bc.h bcdefs.h const.h fix-libmath_h global.h libmath.b proto.h \ - sbc.y -noinst_HEADERS = libmath.h - -DISTCLEANFILES = sbc sbc.c sbc.h - -MAINTAINERCLEANFILES = Makefile.in libmath.h bc.c bc.h scan.c - -INCLUDES = -I$(srcdir) -I$(srcdir)/../h -LIBBC = ../lib/libbc.a -LIBL = @LEXLIB@ -LDADD = $(LIBBC) $(LIBL) @READLINELIB@ - -YFLAGS = -d - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -$(PROGRAMS): $(LIBBC) - -scan.o: bc.h -global.o: libmath.h - -libmath.h: libmath.b - echo '{0}' > libmath.h - $(MAKE) fbc - ./fbc -c $(srcdir)/libmath.b libmath.h - $(srcdir)/fix-libmath_h - rm -f ./fbc - -fbcOBJ = main.o bc.o scan.o execute.o global.o load.o storage.o util.o -fbc: $(fbcOBJ) - $(LINK) $(fbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) - -sbcOBJ = main.o sbc.o scan.o execute.o global.o load.o storage.o util.o -sbc.o: sbc.c -sbc: $(sbcOBJ) - $(LINK) $(sbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) diff --git a/contrib/bc/bc/Makefile.in b/contrib/bc/bc/Makefile.in deleted file mode 100644 index 18ebce0d7ea9..000000000000 --- a/contrib/bc/bc/Makefile.in +++ /dev/null @@ -1,345 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -bin_PROGRAMS = bc - -bc_SOURCES = main.c bc.y scan.l execute.c load.c storage.c util.c global.c - -EXTRA_DIST = bc.h bcdefs.h const.h fix-libmath_h global.h libmath.b proto.h sbc.y - -noinst_HEADERS = libmath.h - -DISTCLEANFILES = sbc sbc.c sbc.h - -MAINTAINERCLEANFILES = Makefile.in libmath.h bc.c bc.h scan.c - -INCLUDES = -I$(srcdir) -I$(srcdir)/../h -LIBBC = ../lib/libbc.a -LIBL = @LEXLIB@ -LDADD = $(LIBBC) $(LIBL) @READLINELIB@ - -YFLAGS = -d - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -fbcOBJ = main.o bc.o scan.o execute.o global.o load.o storage.o util.o - -sbcOBJ = main.o sbc.o scan.o execute.o global.o load.o storage.o util.o -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(bin_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I.. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -bc_OBJECTS = main.o bc.o scan.o execute.o load.o storage.o util.o \ -global.o -bc_LDADD = $(LDADD) -bc_DEPENDENCIES = ../lib/libbc.a -bc_LDFLAGS = -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LEXLIB = @LEXLIB@ -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -HEADERS = $(noinst_HEADERS) - -DIST_COMMON = Makefile.am Makefile.in bc.c scan.c - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(bc_SOURCES) -OBJECTS = $(bc_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .l .o .s .y -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps bc/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-binPROGRAMS: - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -distclean-binPROGRAMS: - -maintainer-clean-binPROGRAMS: - -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - list='$(bin_PROGRAMS)'; for p in $$list; do \ - rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -bc: $(bc_OBJECTS) $(bc_DEPENDENCIES) - @rm -f bc - $(LINK) $(bc_LDFLAGS) $(bc_OBJECTS) $(bc_LDADD) $(LIBS) -.l.c: - $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@ -.y.c: - $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c - if test -f y.tab.h; then \ - if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \ - else :; fi -bc.h: bc.c - - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = bc - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done -bc.o: bc.c bcdefs.h ../config.h const.h ../h/number.h global.h proto.h -execute.o: execute.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h -global.o: global.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - libmath.h -load.o: load.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h -main.o: main.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h ../h/getopt.h -scan.o: scan.c bcdefs.h ../config.h const.h ../h/number.h bc.h global.h \ - proto.h -storage.o: storage.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h -util.o: util.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h - -info-am: -info: info-am -dvi-am: -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: install-binPROGRAMS -install-exec: install-exec-am - -install-data-am: -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: uninstall-binPROGRAMS -uninstall: uninstall-am -all-am: Makefile $(PROGRAMS) $(HEADERS) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - $(mkinstalldirs) $(DESTDIR)$(bindir) - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - -test -z "scanlbchbcc$(MAINTAINERCLEANFILES)" || rm -f scanl bch bcc $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ - mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \ - mostlyclean-am - -clean: clean-am - -distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ - distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-binPROGRAMS \ - maintainer-clean-compile maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ -maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile tags mostlyclean-tags distclean-tags \ -clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ -check-am installcheck-am installcheck install-exec-am install-exec \ -install-data-am install-data install-am install uninstall-am uninstall \ -all-redirect all-am all installdirs mostlyclean-generic \ -distclean-generic clean-generic maintainer-clean-generic clean \ -mostlyclean distclean maintainer-clean - - -$(PROGRAMS): $(LIBBC) - -scan.o: bc.h -global.o: libmath.h - -libmath.h: libmath.b - echo '{0}' > libmath.h - $(MAKE) fbc - ./fbc -c $(srcdir)/libmath.b libmath.h - $(srcdir)/fix-libmath_h - rm -f ./fbc -fbc: $(fbcOBJ) - $(LINK) $(fbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) -sbc.o: sbc.c -sbc: $(sbcOBJ) - $(LINK) $(sbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/bc/bc.y b/contrib/bc/bc/bc.y deleted file mode 100644 index 403e326fc174..000000000000 --- a/contrib/bc/bc/bc.y +++ /dev/null @@ -1,654 +0,0 @@ -%{ -/* bc.y: The grammar for a POSIX compatable bc processor with some - extensions to the language. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to: - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "global.h" -#include "proto.h" -%} - -%start program - -%union { - char *s_value; - char c_value; - int i_value; - arg_list *a_value; - } - -/* Extensions over POSIX bc. - a) NAME was LETTER. This grammar allows longer names. - Single letter names will still work. - b) Relational_expression allowed only one comparison. - This grammar has added boolean expressions with - && (and) || (or) and ! (not) and allowed all of them in - full expressions. - c) Added an else to the if. - d) Call by variable array parameters - e) read() procedure that reads a number under program control from stdin. - f) halt statement that halts the the program under program control. It - is an executed statement. - g) continue statement for for loops. - h) optional expressions in the for loop. - i) print statement to print multiple numbers per line. - j) warranty statement to print an extended warranty notice. - j) limits statement to print the processor's limits. -*/ - -%token ENDOFLINE AND OR NOT -%token STRING NAME NUMBER -/* '-', '+' are tokens themselves */ -/* '=', '+=', '-=', '*=', '/=', '%=', '^=' */ -%token ASSIGN_OP -/* '==', '<=', '>=', '!=', '<', '>' */ -%token REL_OP -/* '++', '--' */ -%token INCR_DECR -/* 'define', 'break', 'quit', 'length' */ -%token Define Break Quit Length -/* 'return', 'for', 'if', 'while', 'sqrt', 'else' */ -%token Return For If While Sqrt Else -/* 'scale', 'ibase', 'obase', 'auto', 'read' */ -%token Scale Ibase Obase Auto Read -/* 'warranty', 'halt', 'last', 'continue', 'print', 'limits' */ -%token Warranty, Halt, Last, Continue, Print, Limits -/* 'history' */ -%token UNARY_MINUS HistoryVar - -/* Types of all other things. */ -%type expression return_expression named_expression opt_expression -%type '+' '-' '*' '/' '%' -%type opt_parameter_list opt_auto_define_list define_list -%type opt_argument_list argument_list -%type program input_item semicolon_list statement_list -%type statement function statement_or_error required_eol - -/* precedence */ -%left OR -%left AND -%nonassoc NOT -%left REL_OP -%right ASSIGN_OP -%left '+' '-' -%left '*' '/' '%' -%right '^' -%nonassoc UNARY_MINUS -%nonassoc INCR_DECR - -%% -program : /* empty */ - { - $$ = 0; - if (interactive && !quiet) - { - show_bc_version (); - welcome (); - } - } - | program input_item - ; -input_item : semicolon_list ENDOFLINE - { run_code (); } - | function - { run_code (); } - | error ENDOFLINE - { - yyerrok; - init_gen (); - } - ; -opt_newline : /* empty */ - | ENDOFLINE - { warn ("newline not allowed"); } - ; -semicolon_list : /* empty */ - { $$ = 0; } - | statement_or_error - | semicolon_list ';' statement_or_error - | semicolon_list ';' - ; -statement_list : /* empty */ - { $$ = 0; } - | statement_or_error - | statement_list ENDOFLINE - | statement_list ENDOFLINE statement_or_error - | statement_list ';' - | statement_list ';' statement - ; -statement_or_error : statement - | error statement - { $$ = $2; } - ; -statement : Warranty - { warranty (""); } - | Limits - { limits (); } - | expression - { - if ($1 & 2) - warn ("comparison in expression"); - if ($1 & 1) - generate ("W"); - else - generate ("p"); - } - | STRING - { - $$ = 0; - generate ("w"); - generate ($1); - free ($1); - } - | Break - { - if (break_label == 0) - yyerror ("Break outside a for/while"); - else - { - sprintf (genstr, "J%1d:", break_label); - generate (genstr); - } - } - | Continue - { - warn ("Continue statement"); - if (continue_label == 0) - yyerror ("Continue outside a for"); - else - { - sprintf (genstr, "J%1d:", continue_label); - generate (genstr); - } - } - | Quit - { exit (0); } - | Halt - { generate ("h"); } - | Return return_expression - { generate ("R"); } - | For - { - $1 = break_label; - break_label = next_label++; - } - '(' opt_expression ';' - { - if ($4 & 2) - warn ("Comparison in first for expression"); - if ($4 >= 0) - generate ("p"); - $4 = next_label++; - sprintf (genstr, "N%1d:", $4); - generate (genstr); - } - opt_expression ';' - { - if ($7 < 0) generate ("1"); - $7 = next_label++; - sprintf (genstr, "B%1d:J%1d:", $7, break_label); - generate (genstr); - $$ = continue_label; - continue_label = next_label++; - sprintf (genstr, "N%1d:", continue_label); - generate (genstr); - } - opt_expression ')' - { - if ($10 & 2 ) - warn ("Comparison in third for expression"); - if ($10 & 16) - sprintf (genstr, "J%1d:N%1d:", $4, $7); - else - sprintf (genstr, "pJ%1d:N%1d:", $4, $7); - generate (genstr); - } - opt_newline statement - { - sprintf (genstr, "J%1d:N%1d:", - continue_label, break_label); - generate (genstr); - break_label = $1; - continue_label = $9; - } - | If '(' expression ')' - { - $3 = if_label; - if_label = next_label++; - sprintf (genstr, "Z%1d:", if_label); - generate (genstr); - } - opt_newline statement opt_else - { - sprintf (genstr, "N%1d:", if_label); - generate (genstr); - if_label = $3; - } - | While - { - $1 = next_label++; - sprintf (genstr, "N%1d:", $1); - generate (genstr); - } - '(' expression - { - $4 = break_label; - break_label = next_label++; - sprintf (genstr, "Z%1d:", break_label); - generate (genstr); - } - ')' opt_newline statement - { - sprintf (genstr, "J%1d:N%1d:", $1, break_label); - generate (genstr); - break_label = $4; - } - | '{' statement_list '}' - { $$ = 0; } - | Print - { warn ("print statement"); } - print_list - ; -print_list : print_element - | print_element ',' print_list - ; -print_element : STRING - { - generate ("O"); - generate ($1); - free ($1); - } - | expression - { generate ("P"); } - ; -opt_else : /* nothing */ - | Else - { - warn ("else clause in if statement"); - $1 = next_label++; - sprintf (genstr, "J%d:N%1d:", $1, if_label); - generate (genstr); - if_label = $1; - } - opt_newline statement -function : Define NAME '(' opt_parameter_list ')' opt_newline - '{' required_eol opt_auto_define_list - { - /* Check auto list against parameter list? */ - check_params ($4,$9); - sprintf (genstr, "F%d,%s.%s[", - lookup($2,FUNCTDEF), - arg_str ($4), arg_str ($9)); - generate (genstr); - free_args ($4); - free_args ($9); - $1 = next_label; - next_label = 1; - } - statement_list /* ENDOFLINE */ '}' - { - generate ("0R]"); - next_label = $1; - } - ; -opt_parameter_list : /* empty */ - { $$ = NULL; } - | define_list - ; -opt_auto_define_list : /* empty */ - { $$ = NULL; } - | Auto define_list ENDOFLINE - { $$ = $2; } - | Auto define_list ';' - { $$ = $2; } - ; -define_list : NAME - { $$ = nextarg (NULL, lookup ($1,SIMPLE), FALSE);} - | NAME '[' ']' - { $$ = nextarg (NULL, lookup ($1,ARRAY), FALSE); } - | '*' NAME '[' ']' - { $$ = nextarg (NULL, lookup ($2,ARRAY), TRUE); } - | define_list ',' NAME - { $$ = nextarg ($1, lookup ($3,SIMPLE), FALSE); } - | define_list ',' NAME '[' ']' - { $$ = nextarg ($1, lookup ($3,ARRAY), FALSE); } - | define_list ',' '*' NAME '[' ']' - { $$ = nextarg ($1, lookup ($4,ARRAY), TRUE); } - ; -opt_argument_list : /* empty */ - { $$ = NULL; } - | argument_list - ; -argument_list : expression - { - if ($1 & 2) warn ("comparison in argument"); - $$ = nextarg (NULL,0,FALSE); - } - | NAME '[' ']' - { - sprintf (genstr, "K%d:", -lookup ($1,ARRAY)); - generate (genstr); - $$ = nextarg (NULL,1,FALSE); - } - | argument_list ',' expression - { - if ($3 & 2) warn ("comparison in argument"); - $$ = nextarg ($1,0,FALSE); - } - | argument_list ',' NAME '[' ']' - { - sprintf (genstr, "K%d:", -lookup ($3,ARRAY)); - generate (genstr); - $$ = nextarg ($1,1,FALSE); - } - ; - -/* Expression lval meanings! (Bits mean something!) - * 0 => Top op is assignment. - * 1 => Top op is not assignment. - * 2 => Comparison is somewhere in expression. - * 4 => Expression is in parenthesis. - * 16 => Empty optional expression. - */ - -opt_expression : /* empty */ - { - $$ = 16; - warn ("Missing expression in for statement"); - } - | expression - ; -return_expression : /* empty */ - { - $$ = 0; - generate ("0"); - } - | expression - { - if ($1 & 2) - warn ("comparison in return expresion"); - if (!($1 & 4)) - warn ("return expression requires parenthesis"); - } - ; -expression : named_expression ASSIGN_OP - { - if ($2 != '=') - { - if ($1 < 0) - sprintf (genstr, "DL%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - } - expression - { - if ($4 & 2) warn("comparison in assignment"); - if ($2 != '=') - { - sprintf (genstr, "%c", $2); - generate (genstr); - } - if ($1 < 0) - sprintf (genstr, "S%d:", -$1); - else - sprintf (genstr, "s%d:", $1); - generate (genstr); - $$ = 0; - } - ; - | expression AND - { - warn("&& operator"); - $2 = next_label++; - sprintf (genstr, "DZ%d:p", $2); - generate (genstr); - } - expression - { - sprintf (genstr, "DZ%d:p1N%d:", $2, $2); - generate (genstr); - $$ = ($1 | $4) & ~4; - } - | expression OR - { - warn("|| operator"); - $2 = next_label++; - sprintf (genstr, "B%d:", $2); - generate (genstr); - } - expression - { - int tmplab; - tmplab = next_label++; - sprintf (genstr, "B%d:0J%d:N%d:1N%d:", - $2, tmplab, $2, tmplab); - generate (genstr); - $$ = ($1 | $4) & ~4; - } - | NOT expression - { - $$ = $2 & ~4; - warn("! operator"); - generate ("!"); - } - | expression REL_OP expression - { - $$ = 3; - switch (*($2)) - { - case '=': - generate ("="); - break; - - case '!': - generate ("#"); - break; - - case '<': - if ($2[1] == '=') - generate ("{"); - else - generate ("<"); - break; - - case '>': - if ($2[1] == '=') - generate ("}"); - else - generate (">"); - break; - } - } - | expression '+' expression - { - generate ("+"); - $$ = ($1 | $3) & ~4; - } - | expression '-' expression - { - generate ("-"); - $$ = ($1 | $3) & ~4; - } - | expression '*' expression - { - generate ("*"); - $$ = ($1 | $3) & ~4; - } - | expression '/' expression - { - generate ("/"); - $$ = ($1 | $3) & ~4; - } - | expression '%' expression - { - generate ("%"); - $$ = ($1 | $3) & ~4; - } - | expression '^' expression - { - generate ("^"); - $$ = ($1 | $3) & ~4; - } - | '-' expression %prec UNARY_MINUS - { - generate ("n"); - $$ = $2 & ~4; - } - | named_expression - { - $$ = 1; - if ($1 < 0) - sprintf (genstr, "L%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - | NUMBER - { - int len = strlen($1); - $$ = 1; - if (len == 1 && *$1 == '0') - generate ("0"); - else if (len == 1 && *$1 == '1') - generate ("1"); - else - { - generate ("K"); - generate ($1); - generate (":"); - } - free ($1); - } - | '(' expression ')' - { $$ = $2 | 5; } - | NAME '(' opt_argument_list ')' - { - $$ = 1; - if ($3 != NULL) - { - sprintf (genstr, "C%d,%s:", - lookup ($1,FUNCT), - call_str ($3)); - free_args ($3); - } - else - { - sprintf (genstr, "C%d:", lookup ($1,FUNCT)); - } - generate (genstr); - } - | INCR_DECR named_expression - { - $$ = 1; - if ($2 < 0) - { - if ($1 == '+') - sprintf (genstr, "DA%d:L%d:", -$2, -$2); - else - sprintf (genstr, "DM%d:L%d:", -$2, -$2); - } - else - { - if ($1 == '+') - sprintf (genstr, "i%d:l%d:", $2, $2); - else - sprintf (genstr, "d%d:l%d:", $2, $2); - } - generate (genstr); - } - | named_expression INCR_DECR - { - $$ = 1; - if ($1 < 0) - { - sprintf (genstr, "DL%d:x", -$1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "A%d:", -$1); - else - sprintf (genstr, "M%d:", -$1); - } - else - { - sprintf (genstr, "l%d:", $1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "i%d:", $1); - else - sprintf (genstr, "d%d:", $1); - } - generate (genstr); - } - | Length '(' expression ')' - { generate ("cL"); $$ = 1;} - | Sqrt '(' expression ')' - { generate ("cR"); $$ = 1;} - | Scale '(' expression ')' - { generate ("cS"); $$ = 1;} - | Read '(' ')' - { - warn ("read function"); - generate ("cI"); $$ = 1; - } - ; -named_expression : NAME - { $$ = lookup($1,SIMPLE); } - | NAME '[' expression ']' - { - if ($3 > 1) warn("comparison in subscript"); - $$ = lookup($1,ARRAY); - } - | Ibase - { $$ = 0; } - | Obase - { $$ = 1; } - | Scale - { $$ = 2; } - | HistoryVar - { $$ = 3; - warn ("History variable"); - } - | Last - { $$ = 4; - warn ("Last variable"); - } - ; - - -required_eol : { warn ("End of line required"); } - | ENDOFLINE - | required_eol ENDOFLINE - { warn ("Too many end of lines"); } - ; - -%% - diff --git a/contrib/bc/bc/bcdefs.h b/contrib/bc/bc/bcdefs.h deleted file mode 100644 index 260cd1238469..000000000000 --- a/contrib/bc/bc/bcdefs.h +++ /dev/null @@ -1,188 +0,0 @@ -/* bcdefs.h: The single file to include all constants and type definitions. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -/* Include the configuration file. */ -#include "config.h" - -/* Standard includes for all files. */ -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include -#else -#include -#endif -#ifdef HAVE_LIMITS_H -#include -#endif - -#if defined(LIBEDIT) -#include -#endif - -#if defined(READLINE) -#include -#include -#endif - -/* Include the other definitions. */ -#include "const.h" -#include "number.h" - -/* These definitions define all the structures used in - code and data storage. This includes the representation of - labels. The "guiding" principle is to make structures that - take a minimum of space when unused but can be built to contain - the full structures. */ - -/* Labels are first. Labels are generated sequentially in functions - and full code. They just "point" to a single bye in the code. The - "address" is the byte number. The byte number is used to get an - actual character pointer. */ - -typedef struct bc_label_group - { - long l_adrs [ BC_LABEL_GROUP ]; - struct bc_label_group *l_next; - } bc_label_group; - -/* Argument list. Recorded in the function so arguments can - be checked at call time. */ - -typedef struct arg_list - { - int av_name; - int arg_is_var; /* Extension ... variable parameters. */ - struct arg_list *next; - } arg_list; - -/* Each function has its own code segments and labels. There can be - no jumps between functions so labels are unique to a function. */ - -typedef struct - { - char f_defined; /* Is this function defined yet. */ - char *f_body; - int f_body_size; /* Size of body. Power of 2. */ - int f_code_size; - bc_label_group *f_label; - arg_list *f_params; - arg_list *f_autos; - } bc_function; - -/* Code addresses. */ -typedef struct { - int pc_func; - int pc_addr; - } program_counter; - - -/* Variables are "pushable" (auto) and thus we need a stack mechanism. - This is built into the variable record. */ - -typedef struct bc_var - { - bc_num v_value; - struct bc_var *v_next; - } bc_var; - - -/* bc arrays can also be "auto" variables and thus need the same - kind of stacking mechanisms. */ - -typedef struct bc_array_node - { - union - { - bc_num n_num [NODE_SIZE]; - struct bc_array_node *n_down [NODE_SIZE]; - } n_items; - } bc_array_node; - -typedef struct bc_array - { - bc_array_node *a_tree; - short a_depth; - } bc_array; - -typedef struct bc_var_array - { - bc_array *a_value; - char a_param; - struct bc_var_array *a_next; - } bc_var_array; - - -/* For the stacks, execution and function, we need records to allow - for arbitrary size. */ - -typedef struct estack_rec { - bc_num s_num; - struct estack_rec *s_next; -} estack_rec; - -typedef struct fstack_rec { - int s_val; - struct fstack_rec *s_next; -} fstack_rec; - - -/* The following are for the name tree. */ - -typedef struct id_rec { - char *id; /* The program name. */ - /* A name == 0 => nothing assigned yet. */ - int a_name; /* The array variable name (number). */ - int f_name; /* The function name (number). */ - int v_name; /* The variable name (number). */ - short balance; /* For the balanced tree. */ - struct id_rec *left, *right; /* Tree pointers. */ -} id_rec; - - -/* A list of files to process. */ - -typedef struct file_node { - char *name; - struct file_node *next; -} file_node; - -/* Macro Definitions */ - -#if defined(LIBEDIT) -#define HISTORY_SIZE(n) history(hist, &histev, H_SETSIZE, n) -#define UNLIMIT_HISTORY history(hist, &histev, H_SETSIZE, INT_MAX) -#endif - -#if defined(READLINE) -#define HISTORY_SIZE(n) stifle_history(n) -#define UNLIMIT_HISTORY unstifle_history() -#endif diff --git a/contrib/bc/bc/const.h b/contrib/bc/bc/const.h deleted file mode 100644 index 1a7c5b82b046..000000000000 --- a/contrib/bc/bc/const.h +++ /dev/null @@ -1,98 +0,0 @@ -/* const.h: Constants for bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - - -/* Define INT_MAX and LONG_MAX if not defined. Assuming 32 bits... */ - -#ifndef INT_MAX -#define INT_MAX 0x7FFFFFFF -#endif -#ifndef LONG_MAX -#define LONG_MAX 0x7FFFFFFF -#endif - - -/* Define constants in some reasonable size. The next 4 constants are - POSIX constants. */ - -#ifdef BC_BASE_MAX - /* on a POSIX.2 system may have defined these. Override. */ -# undef BC_BASE_MAX -# undef BC_SCALE_MAX -# undef BC_STRING_MAX -# undef BC_DIM_MAX -#endif - -#define BC_BASE_MAX INT_MAX -#define BC_SCALE_MAX INT_MAX -#define BC_STRING_MAX INT_MAX - - -/* Definitions for arrays. */ - -#define BC_DIM_MAX 65535 /* this should be NODE_SIZE^NODE_DEPTH-1 */ - -#define NODE_SIZE 16 /* Must be a power of 2. */ -#define NODE_MASK 0xf /* Must be NODE_SIZE-1. */ -#define NODE_SHIFT 4 /* Number of 1 bits in NODE_MASK. */ -#define NODE_DEPTH 4 - - -/* Other BC limits defined but not part of POSIX. */ - -#define BC_LABEL_GROUP 64 -#define BC_LABEL_LOG 6 -#define BC_START_SIZE 1024 /* Initial code body size. */ - -/* Maximum number of variables, arrays and functions and the - allocation increment for the dynamic arrays. */ - -#define MAX_STORE 32767 -#define STORE_INCR 32 - -/* Other interesting constants. */ - -#define FALSE 0 -#define TRUE 1 - -/* for use with lookup (). */ -#define SIMPLE 0 -#define ARRAY 1 -#define FUNCT 2 -#define FUNCTDEF 3 - -#define EXTERN extern -#ifdef __STDC__ -#define CONST const -#define VOID void -#else -#define CONST -#define VOID -#endif diff --git a/contrib/bc/bc/execute.c b/contrib/bc/bc/execute.c deleted file mode 100644 index d2864d113719..000000000000 --- a/contrib/bc/bc/execute.c +++ /dev/null @@ -1,788 +0,0 @@ -/* execute.c - run a bc program. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include -#include "global.h" -#include "proto.h" - - -/* The SIGINT interrupt handling routine. */ - -int had_sigint; - -void -stop_execution (sig) - int sig; -{ - had_sigint = TRUE; - printf ("\n"); - rt_error ("interrupted execution"); -} - - -/* Get the current byte and advance the PC counter. */ - -unsigned char -byte (pc) - program_counter *pc; -{ - return (functions[pc->pc_func].f_body[pc->pc_addr++]); -} - - -/* The routine that actually runs the machine. */ - -void -execute () -{ - int label_num, l_gp, l_off; - bc_label_group *gp; - - char inst, ch; - int new_func; - int var_name; - - int const_base; - - bc_num temp_num; - arg_list *auto_list; - - /* Initialize this run... */ - pc.pc_func = 0; - pc.pc_addr = 0; - runtime_error = FALSE; - bc_init_num (&temp_num); - - /* Set up the interrupt mechanism for an interactive session. */ - if (interactive) - { - signal (SIGINT, stop_execution); - had_sigint = FALSE; - } - - while (pc.pc_addr < functions[pc.pc_func].f_code_size && !runtime_error) - { - inst = byte(&pc); - -#if DEBUG > 3 - { /* Print out address and the stack before each instruction.*/ - int depth; estack_rec *temp = ex_stack; - - printf ("func=%d addr=%d inst=%c\n",pc.pc_func, pc.pc_addr, inst); - if (temp == NULL) printf ("empty stack.\n", inst); - else - { - depth = 1; - while (temp != NULL) - { - printf (" %d = ", depth); - bc_out_num (temp->s_num, 10, out_char, std_only); - depth++; - temp = temp->s_next; - } - out_char ('\n'); - } - } -#endif - - switch ( inst ) - { - - case 'A' : /* increment array variable (Add one). */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - incr_array (var_name); - break; - - case 'B' : /* Branch to a label if TOS != 0. Remove value on TOS. */ - case 'Z' : /* Branch to a label if TOS == 0. Remove value on TOS. */ - c_code = !bc_is_zero (ex_stack->s_num); - pop (); - case 'J' : /* Jump to a label. */ - label_num = byte(&pc); /* Low order bits first. */ - label_num += byte(&pc) << 8; - if (inst == 'J' || (inst == 'B' && c_code) - || (inst == 'Z' && !c_code)) { - gp = functions[pc.pc_func].f_label; - l_gp = label_num >> BC_LABEL_LOG; - l_off = label_num % BC_LABEL_GROUP; - while (l_gp-- > 0) gp = gp->l_next; - pc.pc_addr = gp->l_adrs[l_off]; - } - break; - - case 'C' : /* Call a function. */ - /* Get the function number. */ - new_func = byte(&pc); - if ((new_func & 0x80) != 0) - new_func = ((new_func & 0x7f) << 8) + byte(&pc); - - /* Check to make sure it is defined. */ - if (!functions[new_func].f_defined) - { - rt_error ("Function %s not defined.", f_names[new_func]); - break; - } - - /* Check and push parameters. */ - process_params (&pc, new_func); - - /* Push auto variables. */ - for (auto_list = functions[new_func].f_autos; - auto_list != NULL; - auto_list = auto_list->next) - auto_var (auto_list->av_name); - - /* Push pc and ibase. */ - fpush (pc.pc_func); - fpush (pc.pc_addr); - fpush (i_base); - - /* Reset pc to start of function. */ - pc.pc_func = new_func; - pc.pc_addr = 0; - break; - - case 'D' : /* Duplicate top of stack */ - push_copy (ex_stack->s_num); - break; - - case 'K' : /* Push a constant */ - /* Get the input base and convert it to a bc number. */ - if (pc.pc_func == 0) - const_base = i_base; - else - const_base = fn_stack->s_val; - if (const_base == 10) - push_b10_const (&pc); - else - push_constant (prog_char, const_base); - break; - - case 'L' : /* load array variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - load_array (var_name); - break; - - case 'M' : /* decrement array variable (Minus!) */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - decr_array (var_name); - break; - - case 'O' : /* Write a string to the output with processing. */ - while ((ch = byte(&pc)) != '"') - if (ch != '\\') - out_schar (ch); - else - { - ch = byte(&pc); - if (ch == '"') break; - switch (ch) - { - case 'a': out_schar (007); break; - case 'b': out_schar ('\b'); break; - case 'f': out_schar ('\f'); break; - case 'n': out_schar ('\n'); break; - case 'q': out_schar ('"'); break; - case 'r': out_schar ('\r'); break; - case 't': out_schar ('\t'); break; - case '\\': out_schar ('\\'); break; - default: break; - } - } - fflush (stdout); - break; - - case 'R' : /* Return from function */ - if (pc.pc_func != 0) - { - /* "Pop" autos and parameters. */ - pop_vars(functions[pc.pc_func].f_autos); - pop_vars(functions[pc.pc_func].f_params); - /* reset the pc. */ - fpop (); - pc.pc_addr = fpop (); - pc.pc_func = fpop (); - } - else - rt_error ("Return from main program."); - break; - - case 'S' : /* store array variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f ) << 8) + byte(&pc); - store_array (var_name); - break; - - case 'T' : /* Test tos for zero */ - c_code = bc_is_zero (ex_stack->s_num); - assign (c_code); - break; - - case 'W' : /* Write the value on the top of the stack. */ - case 'P' : /* Write the value on the top of the stack. No newline. */ - bc_out_num (ex_stack->s_num, o_base, out_char, std_only); - if (inst == 'W') out_char ('\n'); - store_var (4); /* Special variable "last". */ - fflush (stdout); - pop (); - break; - - case 'c' : /* Call special function. */ - new_func = byte(&pc); - - switch (new_func) - { - case 'L': /* Length function. */ - /* For the number 0.xxxx, 0 is not significant. */ - if (ex_stack->s_num->n_len == 1 && - ex_stack->s_num->n_scale != 0 && - ex_stack->s_num->n_value[0] == 0 ) - bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_scale); - else - bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_len - + ex_stack->s_num->n_scale); - break; - - case 'S': /* Scale function. */ - bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_scale); - break; - - case 'R': /* Square Root function. */ - if (!bc_sqrt (&ex_stack->s_num, scale)) - rt_error ("Square root of a negative number"); - break; - - case 'I': /* Read function. */ - push_constant (input_char, i_base); - break; - } - break; - - case 'd' : /* Decrement number */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - decr_var (var_name); - break; - - case 'h' : /* Halt the machine. */ - exit (0); - - case 'i' : /* increment number */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - incr_var (var_name); - break; - - case 'l' : /* load variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - load_var (var_name); - break; - - case 'n' : /* Negate top of stack. */ - bc_sub (_zero_, ex_stack->s_num, &ex_stack->s_num, 0); - break; - - case 'p' : /* Pop the execution stack. */ - pop (); - break; - - case 's' : /* store variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - store_var (var_name); - break; - - case 'w' : /* Write a string to the output. */ - while ((ch = byte(&pc)) != '"') out_schar (ch); - fflush (stdout); - break; - - case 'x' : /* Exchange Top of Stack with the one under the tos. */ - if (check_stack(2)) { - bc_num temp = ex_stack->s_num; - ex_stack->s_num = ex_stack->s_next->s_num; - ex_stack->s_next->s_num = temp; - } - break; - - case '0' : /* Load Constant 0. */ - push_copy (_zero_); - break; - - case '1' : /* Load Constant 0. */ - push_copy (_one_); - break; - - case '!' : /* Negate the boolean value on top of the stack. */ - c_code = bc_is_zero (ex_stack->s_num); - assign (c_code); - break; - - case '&' : /* compare greater than */ - if (check_stack(2)) - { - c_code = !bc_is_zero (ex_stack->s_next->s_num) - && !bc_is_zero (ex_stack->s_num); - pop (); - assign (c_code); - } - break; - - case '|' : /* compare greater than */ - if (check_stack(2)) - { - c_code = !bc_is_zero (ex_stack->s_next->s_num) - || !bc_is_zero (ex_stack->s_num); - pop (); - assign (c_code); - } - break; - - case '+' : /* add */ - if (check_stack(2)) - { - bc_add (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, 0); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '-' : /* subtract */ - if (check_stack(2)) - { - bc_sub (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, 0); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '*' : /* multiply */ - if (check_stack(2)) - { - bc_multiply (ex_stack->s_next->s_num, ex_stack->s_num, - &temp_num, scale); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '/' : /* divide */ - if (check_stack(2)) - { - if (bc_divide (ex_stack->s_next->s_num, - ex_stack->s_num, &temp_num, scale) == 0) - { - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - else - rt_error ("Divide by zero"); - } - break; - - case '%' : /* remainder */ - if (check_stack(2)) - { - if (bc_is_zero (ex_stack->s_num)) - rt_error ("Modulo by zero"); - else - { - bc_modulo (ex_stack->s_next->s_num, - ex_stack->s_num, &temp_num, scale); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - } - break; - - case '^' : /* raise */ - if (check_stack(2)) - { - bc_raise (ex_stack->s_next->s_num, - ex_stack->s_num, &temp_num, scale); - if (bc_is_zero (ex_stack->s_next->s_num) && bc_is_neg (ex_stack->s_num)) - rt_error ("divide by zero"); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '=' : /* compare equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) == 0; - pop (); - assign (c_code); - } - break; - - case '#' : /* compare not equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) != 0; - pop (); - assign (c_code); - } - break; - - case '<' : /* compare less than */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) == -1; - pop (); - assign (c_code); - } - break; - - case '{' : /* compare less than or equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) <= 0; - pop (); - assign (c_code); - } - break; - - case '>' : /* compare greater than */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) == 1; - pop (); - assign (c_code); - } - break; - - case '}' : /* compare greater than or equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) >= 0; - pop (); - assign (c_code); - } - break; - - default : /* error! */ - rt_error ("bad instruction: inst=%c", inst); - } - } - - /* Clean up the function stack and pop all autos/parameters. */ - while (pc.pc_func != 0) - { - pop_vars(functions[pc.pc_func].f_autos); - pop_vars(functions[pc.pc_func].f_params); - fpop (); - pc.pc_addr = fpop (); - pc.pc_func = fpop (); - } - - /* Clean up the execution stack. */ - while (ex_stack != NULL) pop(); - - /* Clean up the interrupt stuff. */ - if (interactive) - { - signal (SIGINT, use_quit); - if (had_sigint) - printf ("Interruption completed.\n"); - } -} - - -/* Prog_char gets another byte from the program. It is used for - conversion of text constants in the code to numbers. */ - -char -prog_char () -{ - return byte(&pc); -} - - -/* Read a character from the standard input. This function is used - by the "read" function. */ - -char -input_char () -{ - char in_ch; - - /* Get a character from the standard input for the read function. */ - in_ch = getchar(); - - /* Check for a \ quoted newline. */ - if (in_ch == '\\') - { - in_ch = getchar(); - if (in_ch == '\n') - in_ch = getchar(); - } - - /* Classify and preprocess the input character. */ - if (isdigit((int)in_ch)) - return (in_ch - '0'); - if (in_ch >= 'A' && in_ch <= 'F') - return (in_ch + 10 - 'A'); - if (in_ch >= 'a' && in_ch <= 'f') - return (in_ch + 10 - 'a'); - if (in_ch == '.' || in_ch == '+' || in_ch == '-') - return (in_ch); - if (in_ch <= ' ') - return (' '); - - return (':'); -} - - -/* Push_constant converts a sequence of input characters as returned - by IN_CHAR into a number. The number is pushed onto the execution - stack. The number is converted as a number in base CONV_BASE. */ - -void -push_constant (in_char, conv_base) - char (*in_char)(VOID); - int conv_base; -{ - int digits; - bc_num build, temp, result, mult, divisor; - char in_ch, first_ch; - char negative; - - /* Initialize all bc numbers */ - bc_init_num (&temp); - bc_init_num (&result); - bc_init_num (&mult); - build = bc_copy_num (_zero_); - negative = FALSE; - - /* The conversion base. */ - bc_int2num (&mult, conv_base); - - /* Get things ready. */ - in_ch = in_char(); - while (in_ch == ' ') - in_ch = in_char(); - - if (in_ch == '+') - in_ch = in_char(); - else - if (in_ch == '-') - { - negative = TRUE; - in_ch = in_char(); - } - - /* Check for the special case of a single digit. */ - if (in_ch < 16) - { - first_ch = in_ch; - in_ch = in_char(); - if (in_ch < 16 && first_ch >= conv_base) - first_ch = conv_base - 1; - bc_int2num (&build, (int) first_ch); - } - - /* Convert the integer part. */ - while (in_ch < 16) - { - if (in_ch < 16 && in_ch >= conv_base) in_ch = conv_base-1; - bc_multiply (build, mult, &result, 0); - bc_int2num (&temp, (int) in_ch); - bc_add (result, temp, &build, 0); - in_ch = in_char(); - } - if (in_ch == '.') - { - in_ch = in_char(); - if (in_ch >= conv_base) in_ch = conv_base-1; - bc_free_num (&result); - bc_free_num (&temp); - divisor = bc_copy_num (_one_); - result = bc_copy_num (_zero_); - digits = 0; - while (in_ch < 16) - { - bc_multiply (result, mult, &result, 0); - bc_int2num (&temp, (int) in_ch); - bc_add (result, temp, &result, 0); - bc_multiply (divisor, mult, &divisor, 0); - digits++; - in_ch = in_char(); - if (in_ch < 16 && in_ch >= conv_base) in_ch = conv_base-1; - } - bc_divide (result, divisor, &result, digits); - bc_add (build, result, &build, 0); - } - - /* Final work. */ - if (negative) - bc_sub (_zero_, build, &build, 0); - - push_num (build); - bc_free_num (&temp); - bc_free_num (&result); - bc_free_num (&mult); -} - - -/* When converting base 10 constants from the program, we use this - more efficient way to convert them to numbers. PC tells where - the constant starts and is expected to be advanced to after - the constant. */ - -void -push_b10_const (pc) - program_counter *pc; -{ - bc_num build; - program_counter look_pc; - int kdigits, kscale; - char inchar; - char *ptr; - - /* Count the digits and get things ready. */ - look_pc = *pc; - kdigits = 0; - kscale = 0; - inchar = byte (&look_pc); - while (inchar != '.' && inchar != ':') - { - kdigits++; - inchar = byte(&look_pc); - } - if (inchar == '.' ) - { - inchar = byte(&look_pc); - while (inchar != ':') - { - kscale++; - inchar = byte(&look_pc); - } - } - - /* Get the first character again and move the pc. */ - inchar = byte(pc); - - /* Secial cases of 0, 1, and A-F single inputs. */ - if (kdigits == 1 && kscale == 0) - { - if (inchar == 0) - { - push_copy (_zero_); - inchar = byte(pc); - return; - } - if (inchar == 1) { - push_copy (_one_); - inchar = byte(pc); - return; - } - if (inchar > 9) - { - bc_init_num (&build); - bc_int2num (&build, inchar); - push_num (build); - inchar = byte(pc); - return; - } - } - - /* Build the new number. */ - if (kdigits == 0) - { - build = bc_new_num (1,kscale); - ptr = build->n_value; - *ptr++ = 0; - } - else - { - build = bc_new_num (kdigits,kscale); - ptr = build->n_value; - } - - while (inchar != ':') - { - if (inchar != '.') - { - if (inchar > 9) - *ptr++ = 9; - else - *ptr++ = inchar; - } - inchar = byte(pc); - } - push_num (build); -} - - -/* Put the correct value on the stack for C_CODE. Frees TOS num. */ - -void -assign (c_code) - char c_code; -{ - bc_free_num (&ex_stack->s_num); - if (c_code) - ex_stack->s_num = bc_copy_num (_one_); - else - ex_stack->s_num = bc_copy_num (_zero_); -} - diff --git a/contrib/bc/bc/fix-libmath_h b/contrib/bc/bc/fix-libmath_h deleted file mode 100755 index f973a8c43984..000000000000 --- a/contrib/bc/bc/fix-libmath_h +++ /dev/null @@ -1,9 +0,0 @@ -ed libmath.h < 1) { - f += 1; - x /= 2; - scale += 1; - } - - /* Initialize the variables. */ - scale = n; - v = 1+x - a = x - d = 1 - - for (i=2; 1; i++) { - e = (a *= x) / (d *= i) - if (e == 0) { - if (f>0) while (f--) v = v*v; - scale = z - if (m) return (1/v); - return (v/1); - } - v += e - } -} - -/* Natural log. Uses the fact that ln(x^2) = 2*ln(x) - The series used is: - ln(x) = 2(a+a^3/3+a^5/5+...) where a=(x-1)/(x+1) -*/ - -define l(x) { - auto e, f, i, m, n, v, z - - /* return something for the special case. */ - if (x <= 0) return ((1 - 10^scale)/1) - - /* Precondition x to make .5 < x < 2.0. */ - z = scale; - scale = 6 + scale; - f = 2; - i=0 - while (x >= 2) { /* for large numbers */ - f *= 2; - x = sqrt(x); - } - while (x <= .5) { /* for small numbers */ - f *= 2; - x = sqrt(x); - } - - /* Set up the loop. */ - v = n = (x-1)/(x+1) - m = n*n - - /* Sum the series. */ - for (i=3; 1; i+=2) { - e = (n *= m) / i - if (e == 0) { - v = f*v - scale = z - return (v/1) - } - v += e - } -} - -/* Sin(x) uses the standard series: - sin(x) = x - x^3/3! + x^5/5! - x^7/7! ... */ - -define s(x) { - auto e, i, m, n, s, v, z - - /* precondition x. */ - z = scale - scale = 1.1*z + 2; - v = a(1) - if (x < 0) { - m = 1; - x = -x; - } - scale = 0 - n = (x / v + 2 )/4 - x = x - 4*n*v - if (n%2) x = -x - - /* Do the loop. */ - scale = z + 2; - v = e = x - s = -x*x - for (i=3; 1; i+=2) { - e *= s/(i*(i-1)) - if (e == 0) { - scale = z - if (m) return (-v/1); - return (v/1); - } - v += e - } -} - -/* Cosine : cos(x) = sin(x+pi/2) */ -define c(x) { - auto v, z; - z = scale; - scale = scale*1.2; - v = s(x+a(1)*2); - scale = z; - return (v/1); -} - -/* Arctan: Using the formula: - atan(x) = atan(c) + atan((x-c)/(1+xc)) for a small c (.2 here) - For under .2, use the series: - atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... */ - -define a(x) { - auto a, e, f, i, m, n, s, v, z - - /* a is the value of a(.2) if it is needed. */ - /* f is the value to multiply by a in the return. */ - /* e is the value of the current term in the series. */ - /* v is the accumulated value of the series. */ - /* m is 1 or -1 depending on x (-x -> -1). results are divided by m. */ - /* i is the denominator value for series element. */ - /* n is the numerator value for the series element. */ - /* s is -x*x. */ - /* z is the saved user's scale. */ - - /* Negative x? */ - m = 1; - if (x<0) { - m = -1; - x = -x; - } - - /* Special case and for fast answers */ - if (x==1) { - if (scale <= 25) return (.7853981633974483096156608/m) - if (scale <= 40) return (.7853981633974483096156608458198757210492/m) - if (scale <= 60) \ - return (.785398163397448309615660845819875721049292349843776455243736/m) - } - if (x==.2) { - if (scale <= 25) return (.1973955598498807583700497/m) - if (scale <= 40) return (.1973955598498807583700497651947902934475/m) - if (scale <= 60) \ - return (.197395559849880758370049765194790293447585103787852101517688/m) - } - - - /* Save the scale. */ - z = scale; - - /* Note: a and f are known to be zero due to being auto vars. */ - /* Calculate atan of a known number. */ - if (x > .2) { - scale = z+5; - a = a(.2); - } - - /* Precondition x. */ - scale = z+3; - while (x > .2) { - f += 1; - x = (x-.2) / (1+x*.2); - } - - /* Initialize the series. */ - v = n = x; - s = -x*x; - - /* Calculate the series. */ - for (i=3; 1; i+=2) { - e = (n *= s) / i; - if (e == 0) { - scale = z; - return ((f*a+v)/m); - } - v += e - } -} - - -/* Bessel function of integer order. Uses the following: - j(-n,x) = (-1)^n*j(n,x) - j(n,x) = x^n/(2^n*n!) * (1 - x^2/(2^2*1!*(n+1)) + x^4/(2^4*2!*(n+1)*(n+2)) - - x^6/(2^6*3!*(n+1)*(n+2)*(n+3)) .... ) -*/ -define j(n,x) { - auto a, b, d, e, f, i, m, s, v, z - - /* Make n an integer and check for negative n. */ - z = scale; - scale = 0; - n = n/1; - if (n<0) { - n = -n; - if (n%2 == 1) m = 1; - } - - /* save ibase */ - b = ibase; - ibase = A; - - /* Compute the factor of x^n/(2^n*n!) */ - f = 1; - for (i=2; i<=n; i++) f = f*i; - scale = 1.5*z; - f = x^n / 2^n / f; - - /* Initialize the loop .*/ - v = e = 1; - s = -x*x/4 - scale = 1.5*z + length(f) - scale(f); - - /* The Loop.... */ - for (i=1; 1; i++) { - e = e * s / i / (n+i); - if (e == 0) { - ibase = b; - scale = z - if (m) return (-f*v/1); - return (f*v/1); - } - v += e; - } -} diff --git a/contrib/bc/bc/libmath.h b/contrib/bc/bc/libmath.h deleted file mode 100644 index bf48f4b690ac..000000000000 --- a/contrib/bc/bc/libmath.h +++ /dev/null @@ -1,40 +0,0 @@ -{"@iK20:s2:p@r", -"@iF1,5.6,7,8,9,10,11,12,13,14[l5:0Z3:l9:1+s9:pl5:K2:", -"/s5:pl2:1+s2:pJ2:N3:l12:s2:p1l5:+s13:pl5:s6:p1s7:pK2:s10:pN5:", -"1B6:J4:N7:l10:i10:pJ5:N6:l6:l5:*s6:l7:l10:*s7:/s8:pl8:0=Z8:l9:", -"0>Z9:N10:l9:d9:Z11:l13:l13:*s13:pJ10:N11:N9:l14:s2:pl11:Z12:1", -"l13:/RN12:l13:1/RN8:l13:l8:+s13:pJ7:N4:0R]@r", -"@iF2,5.8,9,10,11,12,13,14[l5:0{Z1:1K10:l2:^-1/RN1:l2:s14:pK6:", -"l2:+s2:pK2:s9:p0s10:pN2:l5:K2:}Z3:l9:K2:*s9:pl5:cRs5:pJ2:N3:N4:", -"l5:K.5:{Z5:l9:K2:*s9:pl5:cRs5:pJ4:N5:l5:1-l5:1+/s12:s13:pl12:", -"l12:*s11:pK3:s10:pN7:1B8:J6:N9:l10:K2:+s10:pJ7:N8:l12:l11:*s12:", -"l10:/s8:pl8:0=Z10:l9:l13:*s13:pl14:s2:pl13:1/RN10:l13:l8:+s13:", -"pJ9:N6:0R]@r", -"@iF3,5.8,10,11,12,15,13,14[l2:s14:pK1.1:l14:*K2:+s2:p1C4,0:s13:", -"pl5:0Z10:l14:K5:+s2:pK.2:C4,0:s6:pN10:", -"l14:K3:+s2:pN11:l5:K.2:>Z12:l9:1+s9:pl5:K.2:-1l5:K.2:*+/s5:pJ11:N12:", -"l5:s12:s13:pl5:nl5:*s15:pK3:s10:pN14:1B15:J13:N16:l10:K2:+s10:", -"pJ14:N15:l12:l15:*s12:l10:/s8:pl8:0=Z17:l14:s2:pl9:l6:*l13:+l11:", -"/RN17:l13:l8:+s13:pJ16:N13:0R]@r", -"@iF6,12,5.6,16,7,8,9,10,11,15,13,14[l2:s14:p0s2:pl12:1/s12:pl12:", -"0= f->f_body_size) - { - f->f_body_size *= 2; - new_body = (char *) bc_malloc (f->f_body_size); - memcpy(new_body, f->f_body, f->f_body_size/2); - free (f->f_body); - f->f_body = new_body; - } - - /* Store the byte. */ - f->f_body[pc] = byte; - f->f_code_size++; -} - - -/* Define a label LAB to be the current program counter. */ - -void -def_label (lab) - long lab; -{ - bc_label_group *temp; - int group, offset, func; - - /* Get things ready. */ - group = lab >> BC_LABEL_LOG; - offset = lab % BC_LABEL_GROUP; - func = load_adr.pc_func; - - /* Make sure there is at least one label group. */ - if (functions[func].f_label == NULL) - { - functions[func].f_label = - (bc_label_group *) bc_malloc (sizeof(bc_label_group)); - functions[func].f_label->l_next = NULL; - } - - /* Add the label group. */ - temp = functions[func].f_label; - while (group > 0) - { - if (temp->l_next == NULL) - { - temp->l_next = (bc_label_group *) bc_malloc (sizeof(bc_label_group)); - temp->l_next->l_next = NULL; - } - temp = temp->l_next; - group --; - } - - /* Define it! */ - temp->l_adrs [offset] = load_adr.pc_addr; -} - -/* Several instructions have integers in the code. They - are all known to be legal longs. So, no error code - is added. STR is the pointer to the load string and - must be moved to the last non-digit character. */ - -long -long_val (str) - char **str; -{ int val = 0; - char neg = FALSE; - - if (**str == '-') - { - neg = TRUE; - (*str)++; - } - while (isdigit((int)(**str))) - val = val*10 + *(*str)++ - '0'; - - if (neg) - return -val; - else - return val; -} - - -/* load_code loads the CODE into the machine. */ - -void -load_code (code) - char *code; -{ - char *str; - long ap_name; /* auto or parameter name. */ - long label_no; - long vaf_name; /* variable, array or function number. */ - long func; - static program_counter save_adr; - - /* Initialize. */ - str = code; - - /* Scan the code. */ - while (*str != 0) - { - /* If there was an error, don't continue. */ - if (had_error) return; - - if (load_str) - { - if (*str == '"') load_str = FALSE; - addbyte (*str++); - } - else - if (load_const) - { - if (*str == '\n') - str++; - else - { - if (*str == ':') - { - load_const = FALSE; - addbyte (*str++); - } - else - if (*str == '.') - addbyte (*str++); - else - if (*str >= 'A') - addbyte (*str++ + 10 - 'A'); - else - addbyte (*str++ - '0'); - } - } - else - { - switch (*str) - { - - case '"': /* Starts a string. */ - load_str = TRUE; - break; - - case 'N': /* A label */ - str++; - label_no = long_val (&str); - def_label (label_no); - break; - - case 'B': /* Branch to label. */ - case 'J': /* Jump to label. */ - case 'Z': /* Branch Zero to label. */ - addbyte(*str++); - label_no = long_val (&str); - if (label_no > 65535L) - { /* Better message? */ - fprintf (stderr,"Program too big.\n"); - exit(1); - } - addbyte ( (char) (label_no & 0xFF)); - addbyte ( (char) (label_no >> 8)); - break; - - case 'F': /* A function, get the name and initialize it. */ - str++; - func = long_val (&str); - clear_func (func); -#if DEBUG > 2 - printf ("Loading function number %d\n", func); -#endif - /* get the parameters */ - while (*str++ != '.') - { - if (*str == '.') - { - str++; - break; - } - if (*str == '*') - { - str++; - ap_name = long_val (&str); -#if DEBUG > 2 - printf ("var parameter number %d\n", ap_name); -#endif - functions[(int)func].f_params = - nextarg (functions[(int)func].f_params, ap_name, - TRUE); - } - else - { - ap_name = long_val (&str); -#if DEBUG > 2 - printf ("parameter number %d\n", ap_name); -#endif - functions[(int)func].f_params = - nextarg (functions[(int)func].f_params, ap_name, - FALSE); - } - } - - /* get the auto vars */ - while (*str != '[') - { - if (*str == ',') str++; - ap_name = long_val (&str); -#if DEBUG > 2 - printf ("auto number %d\n", ap_name); -#endif - functions[(int)func].f_autos = - nextarg (functions[(int)func].f_autos, ap_name, FALSE); - } - save_adr = load_adr; - load_adr.pc_func = func; - load_adr.pc_addr = 0; - break; - - case ']': /* A function end */ - functions[load_adr.pc_func].f_defined = TRUE; - load_adr = save_adr; - break; - - case 'C': /* Call a function. */ - addbyte (*str++); - func = long_val (&str); - if (func < 128) - addbyte ( (char) func); - else - { - addbyte (((func >> 8) & 0xff) | 0x80); - addbyte (func & 0xff); - } - if (*str == ',') str++; - while (*str != ':') - addbyte (*str++); - addbyte (':'); - break; - - case 'c': /* Call a special function. */ - addbyte (*str++); - addbyte (*str); - break; - - case 'K': /* A constant.... may have an "F" in it. */ - addbyte (*str); - load_const = TRUE; - break; - - case 'd': /* Decrement. */ - case 'i': /* Increment. */ - case 'l': /* Load. */ - case 's': /* Store. */ - case 'A': /* Array Increment */ - case 'M': /* Array Decrement */ - case 'L': /* Array Load */ - case 'S': /* Array Store */ - addbyte (*str++); - vaf_name = long_val (&str); - if (vaf_name < 128) - addbyte (vaf_name); - else - { - addbyte (((vaf_name >> 8) & 0xff) | 0x80); - addbyte (vaf_name & 0xff); - } - break; - - case '@': /* A command! */ - switch (*(++str)) - { - case 'i': - init_load (); - break; - case 'r': - execute (); - break; - } - break; - - case '\n': /* Ignore the newlines */ - break; - - default: /* Anything else */ - addbyte (*str); - } - str++; - } - } -} diff --git a/contrib/bc/bc/main.c b/contrib/bc/bc/main.c deleted file mode 100644 index 8ac2981ad719..000000000000 --- a/contrib/bc/bc/main.c +++ /dev/null @@ -1,358 +0,0 @@ -/* main.c: The main program for bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -$FreeBSD$ - -*************************************************************************/ - -#include "bcdefs.h" -#include -#include "global.h" -#include "proto.h" -#include "getopt.h" - - -/* Variables for processing multiple files. */ -static char first_file; - -/* Points to the last node in the file name list for easy adding. */ -static file_node *last = NULL; - -/* long option support */ -static struct option long_options[] = -{ - {"compile", 0, &compile_only, TRUE}, - {"help", 0, 0, 'h'}, - {"interactive", 0, 0, 'i'}, - {"mathlib", 0, &use_math, TRUE}, - {"quiet", 0, &quiet, TRUE}, - {"standard", 0, &std_only, TRUE}, - {"version", 0, 0, 'v'}, - {"warn", 0, &warn_not_std, TRUE}, - - {0, 0, 0, 0} -}; - - -void -usage (char *progname) -{ - printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname, - " -h --help print this usage and exit\n", - " -i --interactive force interactive mode\n", - " -l --mathlib use the predefined math routines\n", - " -q --quiet don't print initial banner\n", - " -s --standard non-standard bc constructs are errors\n", - " -w --warn warn about non-standard bc constructs\n", - " -v --version print version information and exit\n"); -} - - -void -parse_args (argc, argv) - int argc; - char **argv; -{ - int optch; - int long_index; - file_node *temp; - - /* Force getopt to initialize. Depends on GNU getopt. */ - optind = 0; - - /* Parse the command line */ - while (1) - { - optch = getopt_long (argc, argv, "chilqswv", long_options, &long_index); - - if (optch == EOF) /* End of arguments. */ - break; - - switch (optch) - { - case 'c': /* compile only */ - compile_only = TRUE; - break; - - case 'h': /* help */ - usage(argv[0]); - exit (0); - break; - - case 'i': /* force interactive */ - interactive = TRUE; - break; - - case 'l': /* math lib */ - use_math = TRUE; - break; - - case 'q': /* quiet mode */ - quiet = TRUE; - break; - - case 's': /* Non standard features give errors. */ - std_only = TRUE; - break; - - case 'v': /* Print the version. */ - show_bc_version (); - exit (0); - break; - - case 'w': /* Non standard features give warnings. */ - warn_not_std = TRUE; - break; - - case 0: - /* long options */ - break; - - default: - usage(argv[0]); - exit (1); - } - } - - /* Add file names to a list of files to process. */ - while (optind < argc) - { - temp = (file_node *) bc_malloc(sizeof(file_node)); - temp->name = argv[optind]; - temp->next = NULL; - if (last == NULL) - file_names = temp; - else - last->next = temp; - last = temp; - optind++; - } -} - -/* The main program for bc. */ -int -main (argc, argv) - int argc; - char *argv[]; -{ - char *env_value; - char *env_argv[30]; - int env_argc; - - /* Initialize many variables. */ - compile_only = FALSE; - use_math = FALSE; - warn_not_std = FALSE; - std_only = FALSE; - if (isatty(0) && isatty(1)) - interactive = TRUE; - else - interactive = FALSE; - quiet = FALSE; - file_names = NULL; - -#ifdef HAVE_SETVBUF - /* attempt to simplify interaction with applications such as emacs */ - (void) setvbuf(stdout, NULL, _IOLBF, 0); -#endif - - /* Environment arguments. */ - env_value = getenv ("BC_ENV_ARGS"); - if (env_value != NULL) - { - env_argc = 1; - env_argv[0] = "BC_ENV_ARGS"; - while (*env_value != 0) - { - if (*env_value != ' ') - { - env_argv[env_argc++] = env_value; - while (*env_value != ' ' && *env_value != 0) - env_value++; - if (*env_value != 0) - { - *env_value = 0; - env_value++; - } - } - else - env_value++; - } - parse_args (env_argc, env_argv); - } - - /* Command line arguments. */ - parse_args (argc, argv); - - /* Other environment processing. */ - if (getenv ("POSIXLY_CORRECT") != NULL) - std_only = TRUE; - - env_value = getenv ("BC_LINE_LENGTH"); - if (env_value != NULL) - { - line_size = atoi (env_value); - if (line_size < 2) - line_size = 70; - } - else - line_size = 70; - - /* Initialize the machine. */ - init_storage(); - init_load(); - - /* Set up interrupts to print a message. */ - if (interactive) - signal (SIGINT, use_quit); - - /* Initialize the front end. */ - init_tree(); - init_gen (); - is_std_in = FALSE; - first_file = TRUE; - if (!open_new_file ()) - exit (1); - -#if defined(LIBEDIT) - if (interactive) { - /* Enable libedit support. */ - edit = el_init ("bc", stdin, stdout, stderr); - hist = history_init(); - el_set (edit, EL_EDITOR, "emacs"); - el_set (edit, EL_HIST, history, hist); - el_set (edit, EL_PROMPT, null_prompt); - el_source (edit, NULL); - history (hist, &histev, H_SETSIZE, INT_MAX); - } -#endif - -#if defined(READLINE) - if (interactive) { - /* Readline support. Set both application name and input file. */ - rl_readline_name = "bc"; - rl_instream = stdin; - using_history (); - } -#endif - - /* Do the parse. */ - yyparse (); - - /* End the compile only output with a newline. */ - if (compile_only) - printf ("\n"); - - exit (0); -} - - -/* This is the function that opens all the files. - It returns TRUE if the file was opened, otherwise - it returns FALSE. */ - -int -open_new_file () -{ - FILE *new_file; - file_node *temp; - - /* Set the line number. */ - line_no = 1; - - /* Check to see if we are done. */ - if (is_std_in) return (FALSE); - - /* Open the other files. */ - if (use_math && first_file) - { - /* Load the code from a precompiled version of the math libarary. */ - extern char *libmath[]; - char **mstr; - char tmp; - /* These MUST be in the order of first mention of each function. - That is why "a" comes before "c" even though "a" is defined after - after "c". "a" is used in "s"! */ - tmp = lookup ("e", FUNCT); - tmp = lookup ("l", FUNCT); - tmp = lookup ("s", FUNCT); - tmp = lookup ("a", FUNCT); - tmp = lookup ("c", FUNCT); - tmp = lookup ("j", FUNCT); - mstr = libmath; - while (*mstr) { - load_code (*mstr); - mstr++; - } - } - - /* One of the argv values. */ - if (file_names != NULL) - { - new_file = fopen (file_names->name, "r"); - if (new_file != NULL) - { - new_yy_file (new_file); - temp = file_names; - file_name = temp->name; - file_names = temp->next; - free (temp); - return TRUE; - } - fprintf (stderr, "File %s is unavailable.\n", file_names->name); - exit (1); - } - - /* If we fall through to here, we should return stdin. */ - new_yy_file (stdin); - is_std_in = TRUE; - return TRUE; -} - - -/* Set yyin to the new file. */ - -void -new_yy_file (file) - FILE *file; -{ - if (!first_file) fclose (yyin); - yyin = file; - first_file = FALSE; -} - - -/* Message to use quit. */ - -void -use_quit (sig) - int sig; -{ - printf ("\n(interrupt) use quit to exit.\n"); - signal (SIGINT, use_quit); -} diff --git a/contrib/bc/bc/proto.h b/contrib/bc/bc/proto.h deleted file mode 100644 index 1e7311fc8461..000000000000 --- a/contrib/bc/bc/proto.h +++ /dev/null @@ -1,148 +0,0 @@ -/* proto.h: Prototype function definitions for "external" functions. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -/* For the pc version using k&r ACK. (minix1.5 and earlier.) */ -#ifdef SHORTNAMES -#define init_numbers i_numbers -#define push_constant push__constant -#define load_const in_load_const -#define yy_get_next_buffer yyget_next_buffer -#define yy_init_buffer yyinit_buffer -#define yy_last_accepting_state yylast_accepting_state -#define arglist1 arg1list -#endif - -/* Include the standard library header files. */ -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_STDLIB_H -#include -#endif - -/* Define the _PROTOTYPE macro if it is needed. */ - -#ifndef _PROTOTYPE -#ifdef __STDC__ -#define _PROTOTYPE(func, args) func args -#else -#define _PROTOTYPE(func, args) func() -#endif -#endif - -/* From execute.c */ -_PROTOTYPE(void stop_execution, (int)); -_PROTOTYPE(unsigned char byte, (program_counter *pc)); -_PROTOTYPE(void execute, (void)); -_PROTOTYPE(char prog_char, (void)); -_PROTOTYPE(char input_char, (void)); -_PROTOTYPE(void push_constant, (char (*in_char)(void), int conv_base)); -_PROTOTYPE(void push_b10_const, (program_counter *pc)); -_PROTOTYPE(void assign, (int c_code)); - -/* From util.c */ -_PROTOTYPE(char *strcopyof, (char *str)); -_PROTOTYPE(arg_list *nextarg, (arg_list *args, int val, int is_var)); -_PROTOTYPE(char *arg_str, (arg_list *args)); -_PROTOTYPE(char *call_str, (arg_list *args)); -_PROTOTYPE(void free_args, (arg_list *args)); -_PROTOTYPE(void check_params, (arg_list *params, arg_list *autos)); -_PROTOTYPE(void init_gen, (void)); -_PROTOTYPE(void generate, (char *str)); -_PROTOTYPE(void run_code, (void)); -_PROTOTYPE(void out_char, (int ch)); -_PROTOTYPE(void out_schar, (int ch)); -_PROTOTYPE(id_rec *find_id, (id_rec *tree, char *id)); -_PROTOTYPE(int insert_id_rec, (id_rec **root, id_rec *new_id)); -_PROTOTYPE(void init_tree, (void)); -_PROTOTYPE(int lookup, (char *name, int namekind)); -_PROTOTYPE(char *bc_malloc, (int)); -_PROTOTYPE(void out_of_memory, (void)); -_PROTOTYPE(void welcome, (void)); -_PROTOTYPE(void warranty, (char *)); -_PROTOTYPE(void show_bc_version, (void)); -_PROTOTYPE(void limits, (void)); -_PROTOTYPE(void yyerror, (char *str ,...)); -_PROTOTYPE(void warn, (char *mesg ,...)); -_PROTOTYPE(void rt_error, (char *mesg ,...)); -_PROTOTYPE(void rt_warn, (char *mesg ,...)); - -/* From load.c */ -_PROTOTYPE(void init_load, (void)); -_PROTOTYPE(void addbyte, (int byte)); -_PROTOTYPE(void def_label, (long lab)); -_PROTOTYPE(long long_val, (char **str)); -_PROTOTYPE(void load_code, (char *code)); - -/* From main.c */ -_PROTOTYPE(int open_new_file, (void)); -_PROTOTYPE(void new_yy_file, (FILE *file)); -_PROTOTYPE(void use_quit, (int)); - -/* From storage.c */ -_PROTOTYPE(void init_storage, (void)); -_PROTOTYPE(void more_functions, (void)); -_PROTOTYPE(void more_variables, (void)); -_PROTOTYPE(void more_arrays, (void)); -_PROTOTYPE(void clear_func, (int func )); -_PROTOTYPE(int fpop, (void)); -_PROTOTYPE(void fpush, (int val )); -_PROTOTYPE(void pop, (void)); -_PROTOTYPE(void push_copy, (bc_num num )); -_PROTOTYPE(void push_num, (bc_num num )); -_PROTOTYPE(char check_stack, (int depth )); -_PROTOTYPE(bc_var *get_var, (int var_name )); -_PROTOTYPE(bc_num *get_array_num, (int var_index, long index )); -_PROTOTYPE(void store_var, (int var_name )); -_PROTOTYPE(void store_array, (int var_name )); -_PROTOTYPE(void load_var, (int var_name )); -_PROTOTYPE(void load_array, (int var_name )); -_PROTOTYPE(void decr_var, (int var_name )); -_PROTOTYPE(void decr_array, (int var_name )); -_PROTOTYPE(void incr_var, (int var_name )); -_PROTOTYPE(void incr_array, (int var_name )); -_PROTOTYPE(void auto_var, (int name )); -_PROTOTYPE(void free_a_tree, (bc_array_node *root, int depth )); -_PROTOTYPE(void pop_vars, (arg_list *list )); -_PROTOTYPE(void process_params, (program_counter *pc, int func )); - -/* For the scanner and parser.... */ -_PROTOTYPE(int yyparse, (void)); -_PROTOTYPE(int yylex, (void)); - -#if defined(LIBEDIT) -/* The *?*&^ prompt function */ -_PROTOTYPE(char *null_prompt, (EditLine *)); -#endif - -/* Other things... */ -#ifndef HAVE_UNISTD_H -_PROTOTYPE (int getopt, (int, char *[], CONST char *)); -#endif diff --git a/contrib/bc/bc/sbc.y b/contrib/bc/bc/sbc.y deleted file mode 100644 index b1ff1d143af4..000000000000 --- a/contrib/bc/bc/sbc.y +++ /dev/null @@ -1,448 +0,0 @@ -%{ -/* sbc.y: A POSIX bc processor written for minix with no extensions. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "global.h" /* To get the global variables. */ -#include "proto.h" -%} - -%start program - -%union { - char *s_value; - char c_value; - int i_value; - arg_list *a_value; - } - -%token ENDOFLINE AND OR NOT -%token STRING NAME NUMBER -/* '-', '+' are tokens themselves */ -%token ASSIGN_OP -/* '=', '+=', '-=', '*=', '/=', '%=', '^=' */ -%token REL_OP -/* '==', '<=', '>=', '!=', '<', '>' */ -%token INCR_DECR -/* '++', '--' */ -%token Define Break Quit Length -/* 'define', 'break', 'quit', 'length' */ -%token Return For If While Sqrt Else -/* 'return', 'for', 'if', 'while', 'sqrt', 'else' */ -%token Scale Ibase Obase Auto Read -/* 'scale', 'ibase', 'obase', 'auto', 'read' */ -%token Warranty, Halt, Last, Continue, Print, Limits -/* 'warranty', 'halt', 'last', 'continue', 'print', 'limits' */ - -/* The types of all other non-terminals. */ -%type expression named_expression return_expression -%type opt_parameter_list parameter_list opt_auto_define_list -%type define_list opt_argument_list argument_list -%type program input_item semicolon_list statement_list -%type statement_or_error statement function relational_expression - -/* precedence */ -%nonassoc REL_OP -%right ASSIGN_OP -%left '+' '-' -%left '*' '/' '%' -%right '^' -%nonassoc UNARY_MINUS -%nonassoc INCR_DECR - -%% -program : /* empty */ - { - $$ = 0; - std_only = TRUE; - if (interactive) - { - printf ("s%s\n", BC_VERSION); - welcome(); - } - } - | program input_item - ; -input_item : semicolon_list ENDOFLINE - { run_code(); } - | function - { run_code(); } - | error ENDOFLINE - { - yyerrok; - init_gen() ; - } - ; -semicolon_list : /* empty */ - { $$ = 0; } - | statement_or_error - | semicolon_list ';' statement_or_error - | semicolon_list ';' - ; -statement_list : /* empty */ - { $$ = 0; } - | statement - | statement_list ENDOFLINE - | statement_list ENDOFLINE statement - | statement_list ';' - | statement_list ';' statement - ; -statement_or_error : statement - | error statement - { $$ = $2; } - ; -statement : Warranty - { warranty("s"); } - | expression - { - if ($1 & 1) - generate ("W"); - else - generate ("p"); - } - | STRING - { - $$ = 0; - generate ("w"); - generate ($1); - free ($1); - } - | Break - { - if (break_label == 0) - yyerror ("Break outside a for/while"); - else - { - sprintf (genstr, "J%1d:", break_label); - generate (genstr); - } - } - | Quit - { exit(0); } - | Return - { generate ("0R"); } - | Return '(' return_expression ')' - { generate ("R"); } - | For - { - $1 = break_label; - break_label = next_label++; - } - '(' expression ';' - { - $4 = next_label++; - sprintf (genstr, "pN%1d:", $4); - generate (genstr); - } - relational_expression ';' - { - $7 = next_label++; - sprintf (genstr, "B%1d:J%1d:", $7, break_label); - generate (genstr); - $$ = next_label++; - sprintf (genstr, "N%1d:", $$); - generate (genstr); - } - expression ')' - { - sprintf (genstr, "pJ%1d:N%1d:", $4, $7); - generate (genstr); - } - statement - { - sprintf (genstr, "J%1d:N%1d:", $9, - break_label); - generate (genstr); - break_label = $1; - } - | If '(' relational_expression ')' - { - $3 = next_label++; - sprintf (genstr, "Z%1d:", $3); - generate (genstr); - } - statement - { - sprintf (genstr, "N%1d:", $3); - generate (genstr); - } - | While - { - $1 = next_label++; - sprintf (genstr, "N%1d:", $1); - generate (genstr); - } - '(' relational_expression - { - $4 = break_label; - break_label = next_label++; - sprintf (genstr, "Z%1d:", break_label); - generate (genstr); - } - ')' statement - { - sprintf (genstr, "J%1d:N%1d:", $1, break_label); - generate (genstr); - break_label = $4; - } - | '{' statement_list '}' - { $$ = 0; } - ; -function : Define NAME '(' opt_parameter_list ')' '{' - ENDOFLINE opt_auto_define_list - { - check_params ($4,$8); - sprintf (genstr, "F%d,%s.%s[", lookup($2,FUNCT), - arg_str ($4), arg_str ($8)); - generate (genstr); - free_args ($4); - free_args ($8); - $1 = next_label; - next_label = 0; - } - statement_list ENDOFLINE '}' - { - generate ("0R]"); - next_label = $1; - } - ; -opt_parameter_list : /* empty */ - { $$ = NULL; } - | parameter_list - ; -parameter_list : NAME - { $$ = nextarg (NULL, lookup($1,SIMPLE), FALSE); } - | define_list ',' NAME - { $$ = nextarg ($1, lookup($3,SIMPLE), FALSE); } - ; -opt_auto_define_list : /* empty */ - { $$ = NULL; } - | Auto define_list ENDOFLINE - { $$ = $2; } - | Auto define_list ';' - { $$ = $2; } - ; -define_list : NAME - { $$ = nextarg (NULL, lookup($1,SIMPLE), FALSE); } - | NAME '[' ']' - { $$ = nextarg (NULL, lookup($1,ARRAY), FALSE); } - | define_list ',' NAME - { $$ = nextarg ($1, lookup($3,SIMPLE), FALSE); } - | define_list ',' NAME '[' ']' - { $$ = nextarg ($1, lookup($3,ARRAY), FALSE); } - ; -opt_argument_list : /* empty */ - { $$ = NULL; } - | argument_list - ; -argument_list : expression - { $$ = nextarg (NULL,0, FALSE); } - | argument_list ',' expression - { $$ = nextarg ($1,0, FALSE); } - ; -relational_expression : expression - { $$ = 0; } - | expression REL_OP expression - { - $$ = 0; - switch (*($2)) - { - case '=': - generate ("="); - break; - case '!': - generate ("#"); - break; - case '<': - if ($2[1] == '=') - generate ("{"); - else - generate ("<"); - break; - case '>': - if ($2[1] == '=') - generate ("}"); - else - generate (">"); - break; - } - } - ; -return_expression : /* empty */ - { - $$ = 0; - generate ("0"); - } - | expression - ; -expression : named_expression ASSIGN_OP - { - if ($2 != '=') - { - if ($1 < 0) - sprintf (genstr, "DL%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - } - expression - { - $$ = 0; - if ($2 != '=') - { - sprintf (genstr, "%c", $2); - generate (genstr); - } - if ($1 < 0) - sprintf (genstr, "S%d:", -$1); - else - sprintf (genstr, "s%d:", $1); - generate (genstr); - } - | expression '+' expression - { generate ("+"); } - | expression '-' expression - { generate ("-"); } - | expression '*' expression - { generate ("*"); } - | expression '/' expression - { generate ("/"); } - | expression '%' expression - { generate ("%"); } - | expression '^' expression - { generate ("^"); } - | '-' expression %prec UNARY_MINUS - { generate ("n"); $$ = 1;} - | named_expression - { - $$ = 1; - if ($1 < 0) - sprintf (genstr, "L%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - | NUMBER - { - int len = strlen($1); - $$ = 1; - if (len == 1 && *$1 == '0') - generate ("0"); - else - { - if (len == 1 && *$1 == '1') - generate ("1"); - else - { - generate ("K"); - generate ($1); - generate (":"); - } - free ($1); - } - } - | '(' expression ')' - { $$ = 1; } - | NAME '(' opt_argument_list ')' - { - $$ = 1; - if ($3 != NULL) - { - sprintf (genstr, "C%d,%s:", lookup($1,FUNCT), - arg_str ($3)); - free_args ($3); - } - else - sprintf (genstr, "C%d:", lookup($1,FUNCT)); - generate (genstr); - } - | INCR_DECR named_expression - { - $$ = 1; - if ($2 < 0) - { - if ($1 == '+') - sprintf (genstr, "DA%d:L%d:", -$2, -$2); - else - sprintf (genstr, "DM%d:L%d:", -$2, -$2); - } - else - { - if ($1 == '+') - sprintf (genstr, "i%d:l%d:", $2, $2); - else - sprintf (genstr, "d%d:l%d:", $2, $2); - } - generate (genstr); - } - | named_expression INCR_DECR - { - $$ = 1; - if ($1 < 0) - { - sprintf (genstr, "DL%d:x", -$1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "A%d:", -$1); - else - sprintf (genstr, "M%d:", -$1); - } - else - { - sprintf (genstr, "l%d:", $1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "i%d:", $1); - else - sprintf (genstr, "d%d:", $1); - } - generate (genstr); - } - | Length '(' expression ')' - { generate ("cL"); $$ = 1;} - | Sqrt '(' expression ')' - { generate ("cR"); $$ = 1;} - | Scale '(' expression ')' - { generate ("cS"); $$ = 1;} - ; -named_expression : NAME - { $$ = lookup($1,SIMPLE); } - | NAME '[' expression ']' - { $$ = lookup($1,ARRAY); } - | Ibase - { $$ = 0; } - | Obase - { $$ = 1; } - | Scale - { $$ = 2; } - ; - -%% diff --git a/contrib/bc/bc/scan.l b/contrib/bc/bc/scan.l deleted file mode 100644 index 8910c66f4c8a..000000000000 --- a/contrib/bc/bc/scan.l +++ /dev/null @@ -1,374 +0,0 @@ -%{ -/* $FreeBSD$ */ -/* scan.l: the (f)lex description file for the scanner. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "bc.h" -#include "global.h" -#include "proto.h" -#include - -/* Using flex, we can ask for a smaller input buffer. With lex, this - does nothing! */ - -#ifdef SMALL_BUF -#undef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 512 -#endif - -/* Force . as last for now. */ -#define DOT_IS_LAST - -/* We want to define our own yywrap. */ -#undef yywrap -_PROTOTYPE(int yywrap, (void)); - -#if defined(LIBEDIT) -/* Support for the BSD libedit with history for - nicer input on the interactive part of input. */ - -#include - -/* Have input call the following function. */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - bcel_input((char *)buf, &result, max_size) - -/* Variables to help interface editline with bc. */ -static const char *bcel_line = (char *)NULL; -static int bcel_len = 0; - - -/* Required to get rid of that ugly ? default prompt! */ -char * -null_prompt (EditLine *el) -{ - return ""; -} - - -/* bcel_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as - stdin, use editline. Otherwise, just read it. -*/ - -static void -bcel_input (buf, result, max) - char *buf; - int *result; - int max; -{ - if (!edit || yyin != stdin) - { - while ( (*result = read( fileno(yyin), buf, max )) < 0 ) - if (errno != EINTR) - { - yyerror( "read() in flex scanner failed" ); - exit (1); - } - return; - } - - /* Do we need a new string? */ - if (bcel_len == 0) - { - bcel_line = el_gets(edit, &bcel_len); - if (bcel_line == NULL) { - /* end of file */ - *result = 0; - bcel_len = 0; - return; - } - if (bcel_len != 0) - history (hist, &histev, H_ENTER, bcel_line); - fflush (stdout); - } - - if (bcel_len <= max) - { - strncpy (buf, bcel_line, bcel_len); - *result = bcel_len; - bcel_len = 0; - } - else - { - strncpy (buf, bcel_line, max); - *result = max; - bcel_line += max; - bcel_len -= max; - } -} -#endif - -#ifdef READLINE -/* Support for the readline and history libraries. This allows - nicer input on the interactive part of input. */ - -/* Have input call the following function. */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - rl_input((char *)buf, &result, max_size) - -/* Variables to help interface readline with bc. */ -static char *rl_line = (char *)NULL; -static char *rl_start = (char *)NULL; -static int rl_len = 0; - -/* Definitions for readline access. */ -extern FILE *rl_instream; - -/* rl_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as - rl_instream (stdin), use readline. Otherwise, just read it. -*/ - -static void -rl_input (buf, result, max) - char *buf; - int *result; - int max; -{ - if (yyin != rl_instream) - { - while ( (*result = read( fileno(yyin), buf, max )) < 0 ) - if (errno != EINTR) - { - yyerror( "read() in flex scanner failed" ); - exit (1); - } - return; - } - - /* Do we need a new string? */ - if (rl_len == 0) - { - if (rl_start) - free(rl_start); - rl_start = readline (""); - if (rl_start == NULL) { - /* end of file */ - *result = 0; - rl_len = 0; - return; - } - rl_line = rl_start; - rl_len = strlen (rl_line)+1; - if (rl_len != 1) - add_history (rl_line); - rl_line[rl_len-1] = '\n'; - fflush (stdout); - } - - if (rl_len <= max) - { - strncpy (buf, rl_line, rl_len); - *result = rl_len; - rl_len = 0; - } - else - { - strncpy (buf, rl_line, max); - *result = max; - rl_line += max; - rl_len -= max; - } -} -#endif - -#if !defined(READLINE) && !defined(LIBEDIT) - -/* MINIX returns from read with < 0 if SIGINT is encountered. - In flex, we can redefine YY_INPUT to the following. In lex, this - does nothing! */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - while ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ - if (errno != EINTR) \ - YY_FATAL_ERROR( "read() in flex scanner failed" ); -#endif - -%} -DIGIT [0-9A-F] -LETTER [a-z] -%s slcomment -%% -"#" { - if (!std_only) - BEGIN(slcomment); - else - yyerror ("illegal character: #"); - } -[^\n]* { BEGIN(INITIAL); } -"\n" { line_no++; BEGIN(INITIAL); return(ENDOFLINE); } -define return(Define); -break return(Break); -quit return(Quit); -length return(Length); -return return(Return); -for return(For); -if return(If); -while return(While); -sqrt return(Sqrt); -scale return(Scale); -ibase return(Ibase); -obase return(Obase); -auto return(Auto); -else return(Else); -read return(Read); -halt return(Halt); -last return(Last); -history { -#if defined(READLINE) || defined(LIBEDIT) - return(HistoryVar); -#else - yylval.s_value = strcopyof(yytext); return(NAME); -#endif - } - -warranty return(Warranty); -continue return(Continue); -print return(Print); -limits return(Limits); -"." { -#ifdef DOT_IS_LAST - return(Last); -#else - yyerror ("illegal character: %s",yytext); -#endif - } -"+"|"-"|";"|"("|")"|"{"|"}"|"["|"]"|","|"^" { yylval.c_value = yytext[0]; - return((int)yytext[0]); } -&& { return(AND); } -\|\| { return(OR); } -"!" { return(NOT); } -"*"|"/"|"%" { yylval.c_value = yytext[0]; return((int)yytext[0]); } -"="|\+=|-=|\*=|\/=|%=|\^= { yylval.c_value = yytext[0]; return(ASSIGN_OP); } -=\+|=-|=\*|=\/|=%|=\^ { -#ifdef OLD_EQ_OP - char warn_save; - warn_save = warn_not_std; - warn_not_std = TRUE; - warn ("Old fashioned ="); - warn_not_std = warn_save; - yylval.c_value = yytext[1]; -#else - yylval.c_value = '='; - yyless (1); -#endif - return(ASSIGN_OP); - } -==|\<=|\>=|\!=|"<"|">" { yylval.s_value = strcopyof(yytext); return(REL_OP); } -\+\+|-- { yylval.c_value = yytext[0]; return(INCR_DECR); } -"\n" { line_no++; return(ENDOFLINE); } -\\\n { line_no++; /* ignore a "quoted" newline */ } -[ \t]+ { /* ignore spaces and tabs */ } -"/*" { - int c; - - for (;;) - { - while ( ((c=input()) != '*') && (c != EOF)) - /* eat it */ - if (c == '\n') line_no++; - if (c == '*') - { - while ( (c=input()) == '*') /* eat it*/; - if (c == '/') break; /* at end of comment */ - if (c == '\n') line_no++; - } - if (c == EOF) - { - fprintf (stderr,"EOF encountered in a comment.\n"); - break; - } - } - } -[a-z][a-z0-9_]* { yylval.s_value = strcopyof(yytext); return(NAME); } -\"[^\"]*\" { - unsigned char *look; - int count = 0; - yylval.s_value = strcopyof(yytext); - for (look = yytext; *look != 0; look++) - { - if (*look == '\n') line_no++; - if (*look == '"') count++; - } - if (count != 2) yyerror ("NUL character in string."); - return(STRING); - } -{DIGIT}({DIGIT}|\\\n)*("."({DIGIT}|\\\n)*)?|"."(\\\n)*{DIGIT}({DIGIT}|\\\n)* { - unsigned char *src, *dst; - int len; - /* remove a trailing decimal point. */ - len = strlen(yytext); - if (yytext[len-1] == '.') - yytext[len-1] = 0; - /* remove leading zeros. */ - src = yytext; - dst = yytext; - while (*src == '0') src++; - if (*src == 0) src--; - /* Copy strings removing the newlines. */ - while (*src != 0) - { - if (*src == '\\') - { - src++; src++; - line_no++; - } - else - *dst++ = *src++; - } - *dst = 0; - yylval.s_value = strcopyof(yytext); - return(NUMBER); - } -. { - if (yytext[0] < ' ') - yyerror ("illegal character: ^%c",yytext[0] + '@'); - else - if (yytext[0] > '~') - yyerror ("illegal character: \\%03o", (int) yytext[0]); - else - yyerror ("illegal character: %s",yytext); - } -%% - - - -/* This is the way to get multiple files input into lex. */ - -int -yywrap() -{ - if (!open_new_file ()) return (1); /* EOF on standard in. */ - return (0); /* We have more input. */ -} diff --git a/contrib/bc/bc/storage.c b/contrib/bc/bc/storage.c deleted file mode 100644 index 10ebf5cdc650..000000000000 --- a/contrib/bc/bc/storage.c +++ /dev/null @@ -1,1067 +0,0 @@ -/* storage.c: Code and data storage manipulations. This includes labels. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "global.h" -#include "proto.h" - - -/* Initialize the storage at the beginning of the run. */ - -void -init_storage () -{ - - /* Functions: we start with none and ask for more. */ - f_count = 0; - more_functions (); - f_names[0] = "(main)"; - - /* Variables. */ - v_count = 0; - more_variables (); - - /* Arrays. */ - a_count = 0; - more_arrays (); - - /* Other things... */ - ex_stack = NULL; - fn_stack = NULL; - i_base = 10; - o_base = 10; - scale = 0; -#if defined(READLINE) || defined(LIBEDIT) - n_history = -1; -#endif - c_code = FALSE; - bc_init_numbers(); -} - -/* Three functions for increasing the number of functions, variables, or - arrays that are needed. This adds another 32 of the requested object. */ - -void -more_functions (VOID) -{ - int old_count; - int indx; - bc_function *old_f; - bc_function *f; - char **old_names; - - /* Save old information. */ - old_count = f_count; - old_f = functions; - old_names = f_names; - - /* Add a fixed amount and allocate new space. */ - f_count += STORE_INCR; - functions = (bc_function *) bc_malloc (f_count*sizeof (bc_function)); - f_names = (char **) bc_malloc (f_count*sizeof (char *)); - - /* Copy old ones. */ - for (indx = 0; indx < old_count; indx++) - { - functions[indx] = old_f[indx]; - f_names[indx] = old_names[indx]; - } - - /* Initialize the new ones. */ - for (; indx < f_count; indx++) - { - f = &functions[indx]; - f->f_defined = FALSE; - f->f_body = (char *) bc_malloc (BC_START_SIZE); - f->f_body_size = BC_START_SIZE; - f->f_code_size = 0; - f->f_label = NULL; - f->f_autos = NULL; - f->f_params = NULL; - } - - /* Free the old elements. */ - if (old_count != 0) - { - free (old_f); - free (old_names); - } -} - -void -more_variables () -{ - int indx; - int old_count; - bc_var **old_var; - char **old_names; - - /* Save the old values. */ - old_count = v_count; - old_var = variables; - old_names = v_names; - - /* Increment by a fixed amount and allocate. */ - v_count += STORE_INCR; - variables = (bc_var **) bc_malloc (v_count*sizeof(bc_var *)); - v_names = (char **) bc_malloc (v_count*sizeof(char *)); - - /* Copy the old variables. */ - for (indx = 3; indx < old_count; indx++) - variables[indx] = old_var[indx]; - - /* Initialize the new elements. */ - for (; indx < v_count; indx++) - variables[indx] = NULL; - - /* Free the old elements. */ - if (old_count != 0) - { - free (old_var); - free (old_names); - } -} - -void -more_arrays () -{ - int indx; - int old_count; - bc_var_array **old_ary; - char **old_names; - - /* Save the old values. */ - old_count = a_count; - old_ary = arrays; - old_names = a_names; - - /* Increment by a fixed amount and allocate. */ - a_count += STORE_INCR; - arrays = (bc_var_array **) bc_malloc (a_count*sizeof(bc_var_array *)); - a_names = (char **) bc_malloc (a_count*sizeof(char *)); - - /* Copy the old arrays. */ - for (indx = 1; indx < old_count; indx++) - arrays[indx] = old_ary[indx]; - - - /* Initialize the new elements. */ - for (; indx < v_count; indx++) - arrays[indx] = NULL; - - /* Free the old elements. */ - if (old_count != 0) - { - free (old_ary); - free (old_names); - } -} - - -/* clear_func clears out function FUNC and makes it ready to redefine. */ - -void -clear_func (func) - int func; -{ - bc_function *f; - bc_label_group *lg; - - /* Set the pointer to the function. */ - f = &functions[func]; - f->f_defined = FALSE; - /* XXX restore f_body to initial size??? */ - f->f_code_size = 0; - if (f->f_autos != NULL) - { - free_args (f->f_autos); - f->f_autos = NULL; - } - if (f->f_params != NULL) - { - free_args (f->f_params); - f->f_params = NULL; - } - while (f->f_label != NULL) - { - lg = f->f_label->l_next; - free (f->f_label); - f->f_label = lg; - } -} - - -/* Pop the function execution stack and return the top. */ - -int -fpop() -{ - fstack_rec *temp; - int retval; - - if (fn_stack != NULL) - { - temp = fn_stack; - fn_stack = temp->s_next; - retval = temp->s_val; - free (temp); - } - else - { - retval = 0; - rt_error ("function stack underflow, contact maintainer."); - } - return (retval); -} - - -/* Push VAL on to the function stack. */ - -void -fpush (val) - int val; -{ - fstack_rec *temp; - - temp = (fstack_rec *) bc_malloc (sizeof (fstack_rec)); - temp->s_next = fn_stack; - temp->s_val = val; - fn_stack = temp; -} - - -/* Pop and discard the top element of the regular execution stack. */ - -void -pop () -{ - estack_rec *temp; - - if (ex_stack != NULL) - { - temp = ex_stack; - ex_stack = temp->s_next; - bc_free_num (&temp->s_num); - free (temp); - } -} - - -/* Push a copy of NUM on to the regular execution stack. */ - -void -push_copy (num) - bc_num num; -{ - estack_rec *temp; - - temp = (estack_rec *) bc_malloc (sizeof (estack_rec)); - temp->s_num = bc_copy_num (num); - temp->s_next = ex_stack; - ex_stack = temp; -} - - -/* Push NUM on to the regular execution stack. Do NOT push a copy. */ - -void -push_num (num) - bc_num num; -{ - estack_rec *temp; - - temp = (estack_rec *) bc_malloc (sizeof (estack_rec)); - temp->s_num = num; - temp->s_next = ex_stack; - ex_stack = temp; -} - - -/* Make sure the ex_stack has at least DEPTH elements on it. - Return TRUE if it has at least DEPTH elements, otherwise - return FALSE. */ - -char -check_stack (depth) - int depth; -{ - estack_rec *temp; - - temp = ex_stack; - while ((temp != NULL) && (depth > 0)) - { - temp = temp->s_next; - depth--; - } - if (depth > 0) - { - rt_error ("Stack error."); - return FALSE; - } - return TRUE; -} - - -/* The following routines manipulate simple variables and - array variables. */ - -/* get_var returns a pointer to the variable VAR_NAME. If one does not - exist, one is created. */ - -bc_var * -get_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - var_ptr = variables[var_name]; - if (var_ptr == NULL) - { - var_ptr = variables[var_name] = (bc_var *) bc_malloc (sizeof (bc_var)); - bc_init_num (&var_ptr->v_value); - } - return var_ptr; -} - - -/* get_array_num returns the address of the bc_num in the array - structure. If more structure is requried to get to the index, - this routine does the work to create that structure. VAR_INDEX - is a zero based index into the arrays storage array. INDEX is - the index into the bc array. */ - -bc_num * -get_array_num (var_index, index) - int var_index; - long index; -{ - bc_var_array *ary_ptr; - bc_array *a_var; - bc_array_node *temp; - int log, ix, ix1; - int sub [NODE_DEPTH]; - - /* Get the array entry. */ - ary_ptr = arrays[var_index]; - if (ary_ptr == NULL) - { - ary_ptr = arrays[var_index] = - (bc_var_array *) bc_malloc (sizeof (bc_var_array)); - ary_ptr->a_value = NULL; - ary_ptr->a_next = NULL; - ary_ptr->a_param = FALSE; - } - - a_var = ary_ptr->a_value; - if (a_var == NULL) { - a_var = ary_ptr->a_value = (bc_array *) bc_malloc (sizeof (bc_array)); - a_var->a_tree = NULL; - a_var->a_depth = 0; - } - - /* Get the index variable. */ - sub[0] = index & NODE_MASK; - ix = index >> NODE_SHIFT; - log = 1; - while (ix > 0 || log < a_var->a_depth) - { - sub[log] = ix & NODE_MASK; - ix >>= NODE_SHIFT; - log++; - } - - /* Build any tree that is necessary. */ - while (log > a_var->a_depth) - { - temp = (bc_array_node *) bc_malloc (sizeof(bc_array_node)); - if (a_var->a_depth != 0) - { - temp->n_items.n_down[0] = a_var->a_tree; - for (ix=1; ix < NODE_SIZE; ix++) - temp->n_items.n_down[ix] = NULL; - } - else - { - for (ix=0; ix < NODE_SIZE; ix++) - temp->n_items.n_num[ix] = bc_copy_num(_zero_); - } - a_var->a_tree = temp; - a_var->a_depth++; - } - - /* Find the indexed variable. */ - temp = a_var->a_tree; - while ( log-- > 1) - { - ix1 = sub[log]; - if (temp->n_items.n_down[ix1] == NULL) - { - temp->n_items.n_down[ix1] = - (bc_array_node *) bc_malloc (sizeof(bc_array_node)); - temp = temp->n_items.n_down[ix1]; - if (log > 1) - for (ix=0; ix < NODE_SIZE; ix++) - temp->n_items.n_down[ix] = NULL; - else - for (ix=0; ix < NODE_SIZE; ix++) - temp->n_items.n_num[ix] = bc_copy_num(_zero_); - } - else - temp = temp->n_items.n_down[ix1]; - } - - /* Return the address of the indexed variable. */ - return &(temp->n_items.n_num[sub[0]]); -} - - -/* Store the top of the execution stack into VAR_NAME. - This includes the special variables ibase, obase, and scale. */ - -void -store_var (var_name) - int var_name; -{ - bc_var *var_ptr; - long temp; - char toobig; - - if (var_name > 3) - { - /* It is a simple variable. */ - var_ptr = get_var (var_name); - if (var_ptr != NULL) - { - bc_free_num(&var_ptr->v_value); - var_ptr->v_value = bc_copy_num (ex_stack->s_num); - } - } - else - { - /* It is a special variable... */ - toobig = FALSE; - temp = 0; - if (bc_is_neg (ex_stack->s_num)) - { - switch (var_name) - { - case 0: - rt_warn ("negative ibase, set to 2"); - temp = 2; - break; - case 1: - rt_warn ("negative obase, set to 2"); - temp = 2; - break; - case 2: - rt_warn ("negative scale, set to 0"); - temp = 0; - break; -#if defined(READLINE) || defined(LIBEDIT) - case 3: - temp = -1; - break; -#endif - } - } - else - { - temp = bc_num2long (ex_stack->s_num); - if (!bc_is_zero (ex_stack->s_num) && temp == 0) - toobig = TRUE; - } - switch (var_name) - { - case 0: - if (temp < 2 && !toobig) - { - i_base = 2; - rt_warn ("ibase too small, set to 2"); - } - else - if (temp > 16 || toobig) - { - i_base = 16; - rt_warn ("ibase too large, set to 16"); - } - else - i_base = (int) temp; - break; - - case 1: - if (temp < 2 && !toobig) - { - o_base = 2; - rt_warn ("obase too small, set to 2"); - } - else - if (temp > BC_BASE_MAX || toobig) - { - o_base = BC_BASE_MAX; - rt_warn ("obase too large, set to %d", BC_BASE_MAX); - } - else - o_base = (int) temp; - break; - - case 2: - /* WARNING: The following if statement may generate a compiler - warning if INT_MAX == LONG_MAX. This is NOT a problem. */ - if (temp > BC_SCALE_MAX || toobig ) - { - scale = BC_SCALE_MAX; - rt_warn ("scale too large, set to %d", BC_SCALE_MAX); - } - else - scale = (int) temp; - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: - if (toobig) - { - temp = -1; - rt_warn ("history too large, set to unlimited"); - UNLIMIT_HISTORY; - } - else - { - n_history = temp; - if (temp < 0) - UNLIMIT_HISTORY; - else - HISTORY_SIZE(n_history); - } -#endif - } - } -} - - -/* Store the top of the execution stack into array VAR_NAME. - VAR_NAME is the name of an array, and the next to the top - of stack for the index into the array. */ - -void -store_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - if (!check_stack(2)) return; - index = bc_num2long (ex_stack->s_next->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero(ex_stack->s_next->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - bc_free_num (num_ptr); - *num_ptr = bc_copy_num (ex_stack->s_num); - bc_free_num (&ex_stack->s_next->s_num); - ex_stack->s_next->s_num = ex_stack->s_num; - bc_init_num (&ex_stack->s_num); - pop(); - } - } -} - - -/* Load a copy of VAR_NAME on to the execution stack. This includes - the special variables ibase, obase and scale. */ - -void -load_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - switch (var_name) - { - - case 0: - /* Special variable ibase. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, i_base); - break; - - case 1: - /* Special variable obase. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, o_base); - break; - - case 2: - /* Special variable scale. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, scale); - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: - /* Special variable history. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, n_history); - break; -#endif - - default: - /* It is a simple variable. */ - var_ptr = variables[var_name]; - if (var_ptr != NULL) - push_copy (var_ptr->v_value); - else - push_copy (_zero_); - } -} - - -/* Load a copy of VAR_NAME on to the execution stack. This includes - the special variables ibase, obase and scale. */ - -void -load_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - if (!check_stack(1)) return; - index = bc_num2long (ex_stack->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero(ex_stack->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - pop(); - push_copy (*num_ptr); - } - } -} - - -/* Decrement VAR_NAME by one. This includes the special variables - ibase, obase, and scale. */ - -void -decr_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - switch (var_name) - { - - case 0: /* ibase */ - if (i_base > 2) - i_base--; - else - rt_warn ("ibase too small in --"); - break; - - case 1: /* obase */ - if (o_base > 2) - o_base--; - else - rt_warn ("obase too small in --"); - break; - - case 2: /* scale */ - if (scale > 0) - scale--; - else - rt_warn ("scale can not be negative in -- "); - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: /* history */ - n_history--; - if (n_history >= 0) - HISTORY_SIZE(n_history); - else - { - n_history = -1; - rt_warn ("history is negative, set to unlimited"); - UNLIMIT_HISTORY; - } -#endif - - default: /* It is a simple variable. */ - var_ptr = get_var (var_name); - if (var_ptr != NULL) - bc_sub (var_ptr->v_value,_one_,&var_ptr->v_value, 0); - } -} - - -/* Decrement VAR_NAME by one. VAR_NAME is an array, and the top of - the execution stack is the index and it is popped off the stack. */ - -void -decr_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - /* It is an array variable. */ - if (!check_stack (1)) return; - index = bc_num2long (ex_stack->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero (ex_stack->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - pop (); - bc_sub (*num_ptr, _one_, num_ptr, 0); - } - } -} - - -/* Increment VAR_NAME by one. This includes the special variables - ibase, obase, and scale. */ - -void -incr_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - switch (var_name) - { - - case 0: /* ibase */ - if (i_base < 16) - i_base++; - else - rt_warn ("ibase too big in ++"); - break; - - case 1: /* obase */ - if (o_base < BC_BASE_MAX) - o_base++; - else - rt_warn ("obase too big in ++"); - break; - - case 2: - if (scale < BC_SCALE_MAX) - scale++; - else - rt_warn ("Scale too big in ++"); - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: /* history */ - n_history++; - if (n_history > 0) - HISTORY_SIZE(n_history); - else - { - n_history = -1; - rt_warn ("history set to unlimited"); - UNLIMIT_HISTORY; - } -#endif - - default: /* It is a simple variable. */ - var_ptr = get_var (var_name); - if (var_ptr != NULL) - bc_add (var_ptr->v_value, _one_, &var_ptr->v_value, 0); - - } -} - - -/* Increment VAR_NAME by one. VAR_NAME is an array and top of - execution stack is the index and is popped off the stack. */ - -void -incr_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - if (!check_stack (1)) return; - index = bc_num2long (ex_stack->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero (ex_stack->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - pop (); - bc_add (*num_ptr, _one_, num_ptr, 0); - } - } -} - - -/* Routines for processing autos variables and parameters. */ - -/* NAME is an auto variable that needs to be pushed on its stack. */ - -void -auto_var (name) - int name; -{ - bc_var *v_temp; - bc_var_array *a_temp; - int ix; - - if (name > 0) - { - /* A simple variable. */ - ix = name; - v_temp = (bc_var *) bc_malloc (sizeof (bc_var)); - v_temp->v_next = variables[ix]; - bc_init_num (&v_temp->v_value); - variables[ix] = v_temp; - } - else - { - /* An array variable. */ - ix = -name; - a_temp = (bc_var_array *) bc_malloc (sizeof (bc_var_array)); - a_temp->a_next = arrays[ix]; - a_temp->a_value = NULL; - a_temp->a_param = FALSE; - arrays[ix] = a_temp; - } -} - - -/* Free_a_tree frees everything associated with an array variable tree. - This is used when popping an array variable off its auto stack. */ - -void -free_a_tree ( root, depth ) - bc_array_node *root; - int depth; -{ - int ix; - - if (root != NULL) - { - if (depth > 1) - for (ix = 0; ix < NODE_SIZE; ix++) - free_a_tree (root->n_items.n_down[ix], depth-1); - else - for (ix = 0; ix < NODE_SIZE; ix++) - bc_free_num ( &(root->n_items.n_num[ix])); - free (root); - } -} - - -/* LIST is an NULL terminated list of varible names that need to be - popped off their auto stacks. */ - -void -pop_vars (list) - arg_list *list; -{ - bc_var *v_temp; - bc_var_array *a_temp; - int ix; - - while (list != NULL) - { - ix = list->av_name; - if (ix > 0) - { - /* A simple variable. */ - v_temp = variables[ix]; - if (v_temp != NULL) - { - variables[ix] = v_temp->v_next; - bc_free_num (&v_temp->v_value); - free (v_temp); - } - } - else - { - /* An array variable. */ - ix = -ix; - a_temp = arrays[ix]; - if (a_temp != NULL) - { - arrays[ix] = a_temp->a_next; - if (!a_temp->a_param && a_temp->a_value != NULL) - { - free_a_tree (a_temp->a_value->a_tree, - a_temp->a_value->a_depth); - free (a_temp->a_value); - } - free (a_temp); - } - } - list = list->next; - } -} - -/* COPY_NODE: Copies an array node for a call by value parameter. */ -bc_array_node * -copy_tree (ary_node, depth) - bc_array_node *ary_node; - int depth; -{ - bc_array_node *res = (bc_array_node *) bc_malloc (sizeof(bc_array_node)); - int i; - - if (depth > 1) - for (i=0; in_items.n_down[i] != NULL) - res->n_items.n_down[i] = - copy_tree (ary_node->n_items.n_down[i], depth - 1); - else - res->n_items.n_down[i] = NULL; - else - for (i=0; in_items.n_num[i] != NULL) - res->n_items.n_num[i] = bc_copy_num (ary_node->n_items.n_num[i]); - else - res->n_items.n_num[i] = NULL; - return res; -} - -/* COPY_ARRAY: Copies an array for a call by value array parameter. - ARY is the pointer to the bc_array structure. */ - -bc_array * -copy_array (ary) - bc_array *ary; -{ - bc_array *res = (bc_array *) bc_malloc (sizeof(bc_array)); - res->a_depth = ary->a_depth; - res->a_tree = copy_tree (ary->a_tree, ary->a_depth); - return (res); -} - - -/* A call is being made to FUNC. The call types are at PC. Process - the parameters by doing an auto on the parameter variable and then - store the value at the new variable or put a pointer the the array - variable. */ - -void -process_params (pc, func) - program_counter *pc; - int func; -{ - char ch; - arg_list *params; - int ix, ix1; - bc_var *v_temp; - bc_var_array *a_src, *a_dest; - bc_num *n_temp; - - /* Get the parameter names from the function. */ - params = functions[func].f_params; - - while ((ch = byte(pc)) != ':') - { - if (params != NULL) - { - if ((ch == '0') && params->av_name > 0) - { - /* A simple variable. */ - ix = params->av_name; - v_temp = (bc_var *) bc_malloc (sizeof(bc_var)); - v_temp->v_next = variables[ix]; - v_temp->v_value = ex_stack->s_num; - bc_init_num (&ex_stack->s_num); - variables[ix] = v_temp; - } - else - if ((ch == '1') && (params->av_name < 0)) - { - /* The variables is an array variable. */ - - /* Compute source index and make sure some structure exists. */ - ix = (int) bc_num2long (ex_stack->s_num); - n_temp = get_array_num (ix, 0); - - /* Push a new array and Compute Destination index */ - auto_var (params->av_name); - ix1 = -params->av_name; - - /* Set up the correct pointers in the structure. */ - if (ix == ix1) - a_src = arrays[ix]->a_next; - else - a_src = arrays[ix]; - a_dest = arrays[ix1]; - if (params->arg_is_var) - { - a_dest->a_param = TRUE; - a_dest->a_value = a_src->a_value; - } - else - { - a_dest->a_param = FALSE; - a_dest->a_value = copy_array (a_src->a_value); - } - } - else - { - if (params->av_name < 0) - rt_error ("Parameter type mismatch parameter %s.", - a_names[-params->av_name]); - else - rt_error ("Parameter type mismatch, parameter %s.", - v_names[params->av_name]); - params++; - } - pop (); - } - else - { - rt_error ("Parameter number mismatch"); - return; - } - params = params->next; - } - if (params != NULL) - rt_error ("Parameter number mismatch"); -} diff --git a/contrib/bc/bc/util.c b/contrib/bc/bc/util.c deleted file mode 100644 index c305c2e3754b..000000000000 --- a/contrib/bc/bc/util.c +++ /dev/null @@ -1,873 +0,0 @@ -/* util.c: Utility routines for bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - - -#include "bcdefs.h" -#ifndef VARARGS -#include -#else -#include -#endif -#include "global.h" -#include "proto.h" - - -/* strcopyof mallocs new memory and copies a string to to the new - memory. */ - -char * -strcopyof (str) - char *str; -{ - char *temp; - - temp = (char *) bc_malloc (strlen (str)+1); - return (strcpy (temp,str)); -} - - -/* nextarg adds another value to the list of arguments. */ - -arg_list * -nextarg (args, val, is_var) - arg_list *args; - int val; - int is_var; -{ arg_list *temp; - - temp = (arg_list *) bc_malloc (sizeof (arg_list)); - temp->av_name = val; - temp->arg_is_var = is_var; - temp->next = args; - - return (temp); -} - - -/* For generate, we must produce a string in the form - "val,val,...,val". We also need a couple of static variables - for retaining old generated strings. It also uses a recursive - function that builds the string. */ - -static char *arglist1 = NULL, *arglist2 = NULL; - - -/* make_arg_str does the actual construction of the argument string. - ARGS is the pointer to the list and LEN is the maximum number of - characters needed. 1 char is the minimum needed. - */ - -_PROTOTYPE (static char *make_arg_str, (arg_list *args, int len)); - -static char * -make_arg_str (args, len) - arg_list *args; - int len; -{ - char *temp; - char sval[20]; - - /* Recursive call. */ - if (args != NULL) - temp = make_arg_str (args->next, len+12); - else - { - temp = (char *) bc_malloc (len); - *temp = 0; - return temp; - } - - /* Add the current number to the end of the string. */ - if (args->arg_is_var) - if (len != 1) - sprintf (sval, "*%d,", args->av_name); - else - sprintf (sval, "*%d", args->av_name); - else - if (len != 1) - sprintf (sval, "%d,", args->av_name); - else - sprintf (sval, "%d", args->av_name); - temp = strcat (temp, sval); - return (temp); -} - -char * -arg_str (args) - arg_list *args; -{ - if (arglist2 != NULL) - free (arglist2); - arglist2 = arglist1; - arglist1 = make_arg_str (args, 1); - return (arglist1); -} - -char * -call_str (args) - arg_list *args; -{ - arg_list *temp; - int arg_count; - int ix; - - if (arglist2 != NULL) - free (arglist2); - arglist2 = arglist1; - - /* Count the number of args and add the 0's and 1's. */ - for (temp = args, arg_count = 0; temp != NULL; temp = temp->next) - arg_count++; - arglist1 = (char *) bc_malloc(arg_count+1); - for (temp = args, ix=0; temp != NULL; temp = temp->next) - arglist1[ix++] = ( temp->av_name ? '1' : '0'); - arglist1[ix] = 0; - - return (arglist1); -} - -/* free_args frees an argument list ARGS. */ - -void -free_args (args) - arg_list *args; -{ - arg_list *temp; - - temp = args; - while (temp != NULL) - { - args = args->next; - free (temp); - temp = args; - } -} - - -/* Check for valid parameter (PARAMS) and auto (AUTOS) lists. - There must be no duplicates any where. Also, this is where - warnings are generated for array parameters. */ - -void -check_params ( params, autos ) - arg_list *params, *autos; -{ - arg_list *tmp1, *tmp2; - - /* Check for duplicate parameters. */ - if (params != NULL) - { - tmp1 = params; - while (tmp1 != NULL) - { - tmp2 = tmp1->next; - while (tmp2 != NULL) - { - if (tmp2->av_name == tmp1->av_name) - yyerror ("duplicate parameter names"); - tmp2 = tmp2->next; - } - if (tmp1->arg_is_var) - warn ("Variable array parameter"); - tmp1 = tmp1->next; - } - } - - /* Check for duplicate autos. */ - if (autos != NULL) - { - tmp1 = autos; - while (tmp1 != NULL) - { - tmp2 = tmp1->next; - while (tmp2 != NULL) - { - if (tmp2->av_name == tmp1->av_name) - yyerror ("duplicate auto variable names"); - tmp2 = tmp2->next; - } - if (tmp1->arg_is_var) - yyerror ("* not allowed here"); - tmp1 = tmp1->next; - } - } - - /* Check for duplicate between parameters and autos. */ - if ((params != NULL) && (autos != NULL)) - { - tmp1 = params; - while (tmp1 != NULL) - { - tmp2 = autos; - while (tmp2 != NULL) - { - if (tmp2->av_name == tmp1->av_name) - yyerror ("variable in both parameter and auto lists"); - tmp2 = tmp2->next; - } - tmp1 = tmp1->next; - } - } -} - - -/* Initialize the code generator the parser. */ - -void -init_gen () -{ - /* Get things ready. */ - break_label = 0; - continue_label = 0; - next_label = 1; - out_count = 2; - if (compile_only) - printf ("@i"); - else - init_load (); - had_error = FALSE; - did_gen = FALSE; -} - - -/* generate code STR for the machine. */ - -void -generate (str) - char *str; -{ - did_gen = TRUE; - if (compile_only) - { - printf ("%s",str); - out_count += strlen(str); - if (out_count > 60) - { - printf ("\n"); - out_count = 0; - } - } - else - load_code (str); -} - - -/* Execute the current code as loaded. */ - -void -run_code() -{ - /* If no compile errors run the current code. */ - if (!had_error && did_gen) - { - if (compile_only) - { - printf ("@r\n"); - out_count = 0; - } - else - execute (); - } - - /* Reinitialize the code generation and machine. */ - if (did_gen) - init_gen(); - else - had_error = FALSE; -} - - -/* Output routines: Write a character CH to the standard output. - It keeps track of the number of characters output and may - break the output with a "\". Always used for numbers. */ - -void -out_char (ch) - int ch; -{ - if (ch == '\n') - { - out_col = 0; - putchar ('\n'); - } - else - { - out_col++; - if (out_col == line_size-1) - { - putchar ('\\'); - putchar ('\n'); - out_col = 1; - } - putchar (ch); - } -} - -/* Output routines: Write a character CH to the standard output. - It keeps track of the number of characters output and may - break the output with a "\". This one is for strings. - In POSIX bc, strings are not broken across lines. */ - -void -out_schar (ch) - int ch; -{ - if (ch == '\n') - { - out_col = 0; - putchar ('\n'); - } - else - { - if (!std_only) - { - out_col++; - if (out_col == line_size-1) - { - putchar ('\\'); - putchar ('\n'); - out_col = 1; - } - } - putchar (ch); - } -} - - -/* The following are "Symbol Table" routines for the parser. */ - -/* find_id returns a pointer to node in TREE that has the correct - ID. If there is no node in TREE with ID, NULL is returned. */ - -id_rec * -find_id (tree, id) - id_rec *tree; - char *id; -{ - int cmp_result; - - /* Check for an empty tree. */ - if (tree == NULL) - return NULL; - - /* Recursively search the tree. */ - cmp_result = strcmp (id, tree->id); - if (cmp_result == 0) - return tree; /* This is the item. */ - else if (cmp_result < 0) - return find_id (tree->left, id); - else - return find_id (tree->right, id); -} - - -/* insert_id_rec inserts a NEW_ID rec into the tree whose ROOT is - provided. insert_id_rec returns TRUE if the tree height from - ROOT down is increased otherwise it returns FALSE. This is a - recursive balanced binary tree insertion algorithm. */ - -int insert_id_rec (root, new_id) - id_rec **root; - id_rec *new_id; -{ - id_rec *A, *B; - - /* If root is NULL, this where it is to be inserted. */ - if (*root == NULL) - { - *root = new_id; - new_id->left = NULL; - new_id->right = NULL; - new_id->balance = 0; - return (TRUE); - } - - /* We need to search for a leaf. */ - if (strcmp (new_id->id, (*root)->id) < 0) - { - /* Insert it on the left. */ - if (insert_id_rec (&((*root)->left), new_id)) - { - /* The height increased. */ - (*root)->balance --; - - switch ((*root)->balance) - { - case 0: /* no height increase. */ - return (FALSE); - case -1: /* height increase. */ - return (FALSE); - case -2: /* we need to do a rebalancing act. */ - A = *root; - B = (*root)->left; - if (B->balance <= 0) - { - /* Single Rotate. */ - A->left = B->right; - B->right = A; - *root = B; - A->balance = 0; - B->balance = 0; - } - else - { - /* Double Rotate. */ - *root = B->right; - B->right = (*root)->left; - A->left = (*root)->right; - (*root)->left = B; - (*root)->right = A; - switch ((*root)->balance) - { - case -1: - A->balance = 1; - B->balance = 0; - break; - case 0: - A->balance = 0; - B->balance = 0; - break; - case 1: - A->balance = 0; - B->balance = -1; - break; - } - (*root)->balance = 0; - } - } - } - } - else - { - /* Insert it on the right. */ - if (insert_id_rec (&((*root)->right), new_id)) - { - /* The height increased. */ - (*root)->balance ++; - switch ((*root)->balance) - { - case 0: /* no height increase. */ - return (FALSE); - case 1: /* height increase. */ - return (FALSE); - case 2: /* we need to do a rebalancing act. */ - A = *root; - B = (*root)->right; - if (B->balance >= 0) - { - /* Single Rotate. */ - A->right = B->left; - B->left = A; - *root = B; - A->balance = 0; - B->balance = 0; - } - else - { - /* Double Rotate. */ - *root = B->left; - B->left = (*root)->right; - A->right = (*root)->left; - (*root)->left = A; - (*root)->right = B; - switch ((*root)->balance) - { - case -1: - A->balance = 0; - B->balance = 1; - break; - case 0: - A->balance = 0; - B->balance = 0; - break; - case 1: - A->balance = -1; - B->balance = 0; - break; - } - (*root)->balance = 0; - } - } - } - } - - /* If we fall through to here, the tree did not grow in height. */ - return (FALSE); -} - - -/* Initialize variables for the symbol table tree. */ - -void -init_tree() -{ - name_tree = NULL; - next_array = 1; - next_func = 1; - /* 0 => ibase, 1 => obase, 2 => scale, 3 => history, 4 => last. */ - next_var = 5; -} - - -/* Lookup routines for symbol table names. */ - -int -lookup (name, namekind) - char *name; - int namekind; -{ - id_rec *id; - - /* Warn about non-standard name. */ - if (strlen(name) != 1) - warn ("multiple letter name - %s", name); - - /* Look for the id. */ - id = find_id (name_tree, name); - if (id == NULL) - { - /* We need to make a new item. */ - id = (id_rec *) bc_malloc (sizeof (id_rec)); - id->id = strcopyof (name); - id->a_name = 0; - id->f_name = 0; - id->v_name = 0; - insert_id_rec (&name_tree, id); - } - - /* Return the correct value. */ - switch (namekind) - { - - case ARRAY: - /* ARRAY variable numbers are returned as negative numbers. */ - if (id->a_name != 0) - { - free (name); - return (-id->a_name); - } - id->a_name = next_array++; - a_names[id->a_name] = name; - if (id->a_name < MAX_STORE) - { - if (id->a_name >= a_count) - more_arrays (); - return (-id->a_name); - } - yyerror ("Too many array variables"); - exit (1); - - case FUNCT: - case FUNCTDEF: - if (id->f_name != 0) - { - free(name); - /* Check to see if we are redefining a math lib function. */ - if (use_math && namekind == FUNCTDEF && id->f_name <= 6) - id->f_name = next_func++; - return (id->f_name); - } - id->f_name = next_func++; - f_names[id->f_name] = name; - if (id->f_name < MAX_STORE) - { - if (id->f_name >= f_count) - more_functions (); - return (id->f_name); - } - yyerror ("Too many functions"); - exit (1); - - case SIMPLE: - if (id->v_name != 0) - { - free(name); - return (id->v_name); - } - id->v_name = next_var++; - v_names[id->v_name - 1] = name; - if (id->v_name <= MAX_STORE) - { - if (id->v_name >= v_count) - more_variables (); - return (id->v_name); - } - yyerror ("Too many variables"); - exit (1); - } - - yyerror ("End of util.c/lookup() reached. Please report this bug."); - exit (1); - /* not reached */ -} - - -/* Print the welcome banner. */ - -void -welcome() -{ - printf ("This is free software with ABSOLUTELY NO WARRANTY.\n"); - printf ("For details type `warranty'. \n"); -} - -/* Print out the version information. */ -void -show_bc_version() -{ - printf("%s %s\n%s\n", PACKAGE, VERSION, BC_COPYRIGHT); -} - - -/* Print out the warranty information. */ - -void -warranty(prefix) - char *prefix; -{ - printf ("\n%s", prefix); - show_bc_version (); - printf ("\n" -" This program is free software; you can redistribute it and/or modify\n" -" it under the terms of the GNU General Public License as published by\n" -" the Free Software Foundation; either version 2 of the License , or\n" -" (at your option) any later version.\n\n" -" This program is distributed in the hope that it will be useful,\n" -" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" -" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" -" GNU General Public License for more details.\n\n" -" You should have received a copy of the GNU General Public License\n" -" along with this program. If not, write to\n\n" -" The Free Software Foundation, Inc.\n" -" 59 Temple Place, Suite 330\n" -" Boston, MA 02111, USA.\n\n"); -} - -/* Print out the limits of this program. */ - -void -limits() -{ - printf ("BC_BASE_MAX = %d\n", BC_BASE_MAX); - printf ("BC_DIM_MAX = %ld\n", (long) BC_DIM_MAX); - printf ("BC_SCALE_MAX = %d\n", BC_SCALE_MAX); - printf ("BC_STRING_MAX = %d\n", BC_STRING_MAX); - printf ("MAX Exponent = %ld\n", (long) LONG_MAX); - printf ("Number of vars = %ld\n", (long) MAX_STORE); -#ifdef OLD_EQ_OP - printf ("Old assignment operatiors are valid. (=-, =+, ...)\n"); -#endif -} - -/* bc_malloc will check the return value so all other places do not - have to do it! SIZE is the number of bytes to allocate. */ - -char * -bc_malloc (size) - int size; -{ - char *ptr; - - ptr = (char *) malloc (size); - if (ptr == NULL) - out_of_memory (); - - return ptr; -} - - -/* The following routines are error routines for various problems. */ - -/* Malloc could not get enought memory. */ - -void -out_of_memory() -{ - fprintf (stderr, "Fatal error: Out of memory for malloc.\n"); - exit (1); -} - - - -/* The standard yyerror routine. Built with variable number of argumnets. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -yyerror (char *str, ...) -#else -void -yyerror (str) - char *str; -#endif -#else -void -yyerror (str, va_alist) - char *str; -#endif -{ - char *name; - va_list args; - -#ifndef VARARGS - va_start (args, str); -#else - va_start (args); -#endif - if (is_std_in) - name = "(standard_in)"; - else - name = file_name; - fprintf (stderr,"%s %d: ",name,line_no); - vfprintf (stderr, str, args); - fprintf (stderr, "\n"); - had_error = TRUE; - va_end (args); -} - - -/* The routine to produce warnings about non-standard features - found during parsing. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -warn (char *mesg, ...) -#else -void -warn (mesg) - char *mesg; -#endif -#else -void -warn (mesg, va_alist) - char *mesg; -#endif -{ - char *name; - va_list args; - -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - if (std_only) - { - if (is_std_in) - name = "(standard_in)"; - else - name = file_name; - fprintf (stderr,"%s %d: ",name,line_no); - vfprintf (stderr, mesg, args); - fprintf (stderr, "\n"); - had_error = TRUE; - } - else - if (warn_not_std) - { - if (is_std_in) - name = "(standard_in)"; - else - name = file_name; - fprintf (stderr,"%s %d: (Warning) ",name,line_no); - vfprintf (stderr, mesg, args); - fprintf (stderr, "\n"); - } - va_end (args); -} - -/* Runtime error will print a message and stop the machine. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_error (char *mesg, ...) -#else -void -rt_error (mesg) - char *mesg; -#endif -#else -void -rt_error (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime error (func=%s, adr=%d): ", - f_names[pc.pc_func], pc.pc_addr); -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - - fprintf (stderr, "\n"); - runtime_error = TRUE; -} - - -/* A runtime warning tells of some action taken by the processor that - may change the program execution but was not enough of a problem - to stop the execution. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_warn (char *mesg, ...) -#else -void -rt_warn (mesg) - char *mesg; -#endif -#else -void -rt_warn (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime warning (func=%s, adr=%d): ", - f_names[pc.pc_func], pc.pc_addr); -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - - fprintf (stderr, "\n"); -} diff --git a/contrib/bc/config.h.in b/contrib/bc/config.h.in deleted file mode 100644 index ebb9e340c4b3..000000000000 --- a/contrib/bc/config.h.in +++ /dev/null @@ -1,81 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define if you don't have vprintf but do have _doprnt. */ -#undef HAVE_DOPRNT - -/* Define if you have the vprintf function. */ -#undef HAVE_VPRINTF - -/* Define if on MINIX. */ -#undef _MINIX - -/* Define if the system does not provide POSIX.1 features except - with this defined. */ -#undef _POSIX_1_SOURCE - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if lex declares yytext as a char * by default, not a char[]. */ -#undef YYTEXT_POINTER - -/* VERSION number for DC target*/ -#undef DC_VERSION - -/* COPYRIGHT notice for DC target */ -#undef DC_COPYRIGHT - -/* COPYRIGHT notice for BC target */ -#undef BC_COPYRIGHT - -/* Define to use the readline library. */ -#undef READLINE - -/* Define to use the BSD libedit library. */ -#undef LIBEDIT - -/* Define to `size_t' if and don't define. */ -#undef ptrdiff_t - -/* Define if you have the isgraph function. */ -#undef HAVE_ISGRAPH - -/* Define if you have the setvbuf function. */ -#undef HAVE_SETVBUF - -/* Define if you have the header file. */ -#undef HAVE_LIB_H - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the header file. */ -#undef HAVE_STDARG_H - -/* Define if you have the header file. */ -#undef HAVE_STDDEF_H - -/* Define if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the header file. */ -#undef HAVE_STRING_H - -/* Define if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Name of package */ -#undef PACKAGE - -/* Version number of package */ -#undef VERSION - diff --git a/contrib/bc/configure b/contrib/bc/configure deleted file mode 100755 index e5fc7d90cd4d..000000000000 --- a/contrib/bc/configure +++ /dev/null @@ -1,2656 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-pkg use software installed in /usr/pkg tree" -ac_help="$ac_help - --with-libedit support fancy BSD command input -editing" -ac_help="$ac_help - --with-readline support fancy command input editing" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=doc/bc.1 - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:563: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:616: checking whether build environment is sane" >&5 -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "$*" != "X $srcdir/configure conftestfile" \ - && test "$*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { echo "configure: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" 1>&2; exit 1; } - fi - - test "$2" = conftestfile - ) -then - # Ok. - : -else - { echo "configure: error: newly created file is older than distributed files! -Check your system clock" 1>&2; exit 1; } -fi -rm -f conftest* -echo "$ac_t""yes" 1>&6 -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:673: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -PACKAGE="bc" - -VERSION="1.06" - -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } -fi -cat >> confdefs.h <> confdefs.h <&6 -echo "configure:719: checking for working aclocal" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (aclocal --version) < /dev/null > /dev/null 2>&1; then - ACLOCAL=aclocal - echo "$ac_t""found" 1>&6 -else - ACLOCAL="$missing_dir/missing aclocal" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:732: checking for working autoconf" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoconf --version) < /dev/null > /dev/null 2>&1; then - AUTOCONF=autoconf - echo "$ac_t""found" 1>&6 -else - AUTOCONF="$missing_dir/missing autoconf" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:745: checking for working automake" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (automake --version) < /dev/null > /dev/null 2>&1; then - AUTOMAKE=automake - echo "$ac_t""found" 1>&6 -else - AUTOMAKE="$missing_dir/missing automake" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:758: checking for working autoheader" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoheader --version) < /dev/null > /dev/null 2>&1; then - AUTOHEADER=autoheader - echo "$ac_t""found" 1>&6 -else - AUTOHEADER="$missing_dir/missing autoheader" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:771: checking for working makeinfo" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (makeinfo --version) < /dev/null > /dev/null 2>&1; then - MAKEINFO=makeinfo - echo "$ac_t""found" 1>&6 -else - MAKEINFO="$missing_dir/missing makeinfo" - echo "$ac_t""missing" 1>&6 -fi - - - - - - -cat >> confdefs.h <<\EOF -#define DC_VERSION "1.3" -EOF - -cat >> confdefs.h <> confdefs.h <&6 -echo "configure:804: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:834: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:885: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:917: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 928 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:959: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:964: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:992: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1024: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1045: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1062: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1079: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 -echo "configure:1105: checking for minix/config.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1115: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - MINIX=yes -else - echo "$ac_t""no" 1>&6 -MINIX= -fi - -if test "$MINIX" = yes; then - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - cat >> confdefs.h <<\EOF -#define _POSIX_1_SOURCE 2 -EOF - - cat >> confdefs.h <<\EOF -#define _MINIX 1 -EOF - -fi - - -missing_dir=`cd $ac_aux_dir && pwd` -for ac_prog in flex lex -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1159: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LEX="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -LEX="$ac_cv_prog_LEX" -if test -n "$LEX"; then - echo "$ac_t""$LEX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$LEX" && break -done -test -n "$LEX" || LEX=""$missing_dir/missing flex"" - -# Extract the first word of "flex", so it can be a program name with args. -set dummy flex; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1192: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LEX="flex" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex" -fi -fi -LEX="$ac_cv_prog_LEX" -if test -n "$LEX"; then - echo "$ac_t""$LEX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$LEXLIB" -then - case "$LEX" in - flex*) ac_lib=fl ;; - *) ac_lib=l ;; - esac - echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:1226: checking for yywrap in -l$ac_lib" >&5 -ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-l$ac_lib $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LEXLIB="-l$ac_lib" -else - echo "$ac_t""no" 1>&6 -fi - -fi - -echo $ac_n "checking lex output file root""... $ac_c" 1>&6 -echo "configure:1268: checking lex output file root" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # The minimal lex program is just a single line: %%. But some broken lexes -# (Solaris, I think it was) want two %% lines, so accommodate them. -echo '%% -%%' | $LEX -if test -f lex.yy.c; then - ac_cv_prog_lex_root=lex.yy -elif test -f lexyy.c; then - ac_cv_prog_lex_root=lexyy -else - { echo "configure: error: cannot find output from $LEX; giving up" 1>&2; exit 1; } -fi -fi - -echo "$ac_t""$ac_cv_prog_lex_root" 1>&6 -LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root - -echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6 -echo "configure:1289: checking whether yytext is a pointer" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # POSIX says lex can declare yytext either as a pointer or an array; the -# default is implementation-dependent. Figure out which it is, since -# not all implementations provide the %pointer and %array declarations. -ac_cv_prog_lex_yytext_pointer=no -echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c -ac_save_LIBS="$LIBS" -LIBS="$LIBS $LEXLIB" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_prog_lex_yytext_pointer=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -LIBS="$ac_save_LIBS" -rm -f "${LEX_OUTPUT_ROOT}.c" - -fi - -echo "$ac_t""$ac_cv_prog_lex_yytext_pointer" 1>&6 -if test $ac_cv_prog_lex_yytext_pointer = yes; then - cat >> confdefs.h <<\EOF -#define YYTEXT_POINTER 1 -EOF - -fi - -for ac_prog in 'bison -y' byacc -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1334: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_YACC="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -YACC="$ac_cv_prog_YACC" -if test -n "$YACC"; then - echo "$ac_t""$YACC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$YACC" && break -done -test -n "$YACC" || YACC="yacc" - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1376: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1431: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:1459: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -for ac_hdr in stdarg.h stddef.h stdlib.h string.h limits.h unistd.h lib.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1490: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1500: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:1527: checking for working const" >&5 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if { (eval echo configure:1581: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_const=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:1602: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1615: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:1682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:1706: checking for size_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_size_t=yes -else - rm -rf conftest* - ac_cv_type_size_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_size_t" 1>&6 -if test $ac_cv_type_size_t = no; then - cat >> confdefs.h <<\EOF -#define size_t unsigned -EOF - -fi - -echo $ac_n "checking for ptrdiff_t""... $ac_c" 1>&6 -echo "configure:1739: checking for ptrdiff_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_ptrdiff_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])ptrdiff_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_ptrdiff_t=yes -else - rm -rf conftest* - ac_cv_type_ptrdiff_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_ptrdiff_t" 1>&6 -if test $ac_cv_type_ptrdiff_t = no; then - cat >> confdefs.h <<\EOF -#define ptrdiff_t size_t -EOF - -fi - - -echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:1773: checking for vprintf" >&5 -if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char vprintf(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_vprintf) || defined (__stub___vprintf) -choke me -#else -vprintf(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1801: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_vprintf=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_vprintf=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_VPRINTF 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -if test "$ac_cv_func_vprintf" != yes; then -echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:1825: checking for _doprnt" >&5 -if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char _doprnt(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub__doprnt) || defined (__stub____doprnt) -choke me -#else -_doprnt(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1853: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func__doprnt=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func__doprnt=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_DOPRNT 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -fi - -for ac_func in isgraph setvbuf -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1880: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1908: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - - -# Check whether --with-pkg or --without-pkg was given. -if test "${with_pkg+set}" = set; then - withval="$with_pkg" - - CPPFLAGS="$CPPFLAGS -I/usr/pkg/include" - LDFLAGS="$LDFLAGS -L/usr/pkg/lib" - echo Using /usr/pkg/include and /usr/pkg/lib - -fi - - -bcle=n -# Check whether --with-libedit or --without-libedit was given. -if test "${with_libedit+set}" = set; then - withval="$with_libedit" - - echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:1950: checking for tgetent in -ltermcap" >&5 -ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ltermcap $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - TERMLIB=-ltermcap -else - echo "$ac_t""no" 1>&6 -fi - - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - echo $ac_n "checking for el_gets in -ledit""... $ac_c" 1>&6 -echo "configure:1992: checking for el_gets in -ledit" >&5 -ac_lib_var=`echo edit'_'el_gets | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ledit $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_safe=`echo "histedit.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for histedit.h""... $ac_c" 1>&6 -echo "configure:2028: checking for histedit.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2038: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - READLINELIB="-ledit $TERMLIB";bcle=y -else - echo "$ac_t""no" 1>&6 -fi - -else - echo "$ac_t""no" 1>&6 -READLINELIB="" -fi - - if test "$bcle" = "y"; then - echo Using the libedit library. - cat >> confdefs.h <<\EOF -#define LIBEDIT 1 -EOF - - fi - LDFLAGS=$LDSAVE - -fi - - -bcrl=n -# Check whether --with-readline or --without-readline was given. -if test "${with_readline+set}" = set; then - withval="$with_readline" - - echo $ac_n "checking for tparm in -lncurses""... $ac_c" 1>&6 -echo "configure:2082: checking for tparm in -lncurses" >&5 -ac_lib_var=`echo ncurses'_'tparm | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lncurses $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - TERMLIB=-lncurses -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:2120: checking for tgetent in -ltermcap" >&5 -ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ltermcap $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - TERMLIB=-ltermcap -else - echo "$ac_t""no" 1>&6 -fi - -fi - - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - echo $ac_n "checking for readline in -lreadline""... $ac_c" 1>&6 -echo "configure:2164: checking for readline in -lreadline" >&5 -ac_lib_var=`echo readline'_'readline | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lreadline $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_safe=`echo "readline/readline.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for readline/readline.h""... $ac_c" 1>&6 -echo "configure:2200: checking for readline/readline.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2210: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - READLINELIB="-lreadline $TERMLIB";bcrl=y -else - echo "$ac_t""no" 1>&6 -fi - -else - echo "$ac_t""no" 1>&6 -READLINELIB="" -fi - - if test "$bcrl" = "y" ; then - echo Using the readline library. - cat >> confdefs.h <<\EOF -#define READLINE 1 -EOF - - fi - LDFLAGS=$LDSAVE - -fi - - -if test "$LEX" = "flex" ; then - LEX="flex -I8" -else - if test "$bcrl" = "y" ; then - echo "configure: warning: readline works only with flex." 1>&2 - fi -fi - -if test "$bcrl" = "y" -a "$bcle" = "y" ; then - { echo "configure: error: Can not use both readline and libedit. Aborting." 1>&2; exit 1; } -fi - -if test "$LEX" = "lex" -a `uname -s` = "SunOS" ; then - LEXLIB="" - echo "SunOS using lex does not have a -ll." -fi - - -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile bc/Makefile dc/Makefile doc/Makefile lib/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@PACKAGE@%$PACKAGE%g -s%@VERSION@%$VERSION%g -s%@ACLOCAL@%$ACLOCAL%g -s%@AUTOCONF@%$AUTOCONF%g -s%@AUTOMAKE@%$AUTOMAKE%g -s%@AUTOHEADER@%$AUTOHEADER%g -s%@MAKEINFO@%$MAKEINFO%g -s%@SET_MAKE@%$SET_MAKE%g -s%@CC@%$CC%g -s%@CPP@%$CPP%g -s%@LEX@%$LEX%g -s%@LEXLIB@%$LEXLIB%g -s%@LEX_OUTPUT_ROOT@%$LEX_OUTPUT_ROOT%g -s%@YACC@%$YACC%g -s%@RANLIB@%$RANLIB%g -s%@READLINELIB@%$READLINELIB%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/contrib/bc/configure.in b/contrib/bc/configure.in deleted file mode 100644 index 5f982d3c3bc5..000000000000 --- a/contrib/bc/configure.in +++ /dev/null @@ -1,89 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(doc/bc.1) -AM_INIT_AUTOMAKE("bc", "1.06") -AM_CONFIG_HEADER(config.h) - -AC_DEFINE(DC_VERSION,"1.3") -AC_DEFINE_UNQUOTED(BC_COPYRIGHT, dnl - ["Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc."]) -AC_DEFINE_UNQUOTED(DC_COPYRIGHT, dnl - ["Copyright 1994, 1997, 1998, 2000 Free Software Foundation, Inc."]) - -AC_PROG_CC -AC_MINIX -dnl AC_ISC_POSIX - -AM_PROG_LEX -AC_PROG_YACC -AC_PROG_INSTALL -AC_PROG_RANLIB -AC_PROG_MAKE_SET - -AC_CHECK_HEADERS(stdarg.h stddef.h stdlib.h string.h limits.h unistd.h lib.h) -AC_C_CONST -AC_TYPE_SIZE_T -AC_CHECK_TYPE(ptrdiff_t, size_t) - -AC_FUNC_VPRINTF -AC_CHECK_FUNCS(isgraph setvbuf) - -AC_ARG_WITH(pkg,[ --with-pkg use software installed in /usr/pkg tree], [ - CPPFLAGS="$CPPFLAGS -I/usr/pkg/include" - LDFLAGS="$LDFLAGS -L/usr/pkg/lib" - echo Using /usr/pkg/include and /usr/pkg/lib -]) - -bcle=n -AC_ARG_WITH(libedit,[ --with-libedit support fancy BSD command input -editing], [ - AC_CHECK_LIB(termcap,tgetent,TERMLIB=-ltermcap) - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - AC_CHECK_LIB(edit,el_gets, - [AC_CHECK_HEADER(histedit.h, - READLINELIB="-ledit $TERMLIB";bcle=y)], - READLINELIB="") - if test "$bcle" = "y"; then - echo Using the libedit library. - AC_DEFINE(LIBEDIT,1) - fi - LDFLAGS=$LDSAVE -]) - -bcrl=n -AC_ARG_WITH(readline,[ --with-readline support fancy command input editing], [ - AC_CHECK_LIB(ncurses,tparm,TERMLIB=-lncurses, - AC_CHECK_LIB(termcap,tgetent,TERMLIB=-ltermcap)) - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - AC_CHECK_LIB(readline,readline, - [AC_CHECK_HEADER(readline/readline.h, - READLINELIB="-lreadline $TERMLIB";bcrl=y)], - READLINELIB="") - if test "$bcrl" = "y" ; then - echo Using the readline library. - AC_DEFINE(READLINE,1) - fi - LDFLAGS=$LDSAVE -]) - -if test "$LEX" = "flex" ; then - LEX="flex -I8" -else - if test "$bcrl" = "y" ; then - AC_MSG_WARN(readline works only with flex.) - fi -fi - -if test "$bcrl" = "y" -a "$bcle" = "y" ; then - AC_MSG_ERROR(Can not use both readline and libedit. Aborting.) -fi - -if test "$LEX" = "lex" -a `uname -s` = "SunOS" ; then - LEXLIB="" - echo "SunOS using lex does not have a -ll." -fi - -AC_SUBST(READLINELIB) -AC_ARG_PROGRAM -AC_OUTPUT(Makefile bc/Makefile dc/Makefile doc/Makefile lib/Makefile) diff --git a/contrib/bc/dc/Makefile.am b/contrib/bc/dc/Makefile.am deleted file mode 100644 index 99164ba74374..000000000000 --- a/contrib/bc/dc/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -## Process this file with automake to produce Makefile.in -bin_PROGRAMS = dc - -dc_SOURCES = dc.c misc.c eval.c stack.c array.c numeric.c string.c -noinst_HEADERS = dc.h dc-proto.h dc-regdef.h - -INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../h -LDADD = ../lib/libbc.a - -MAINTAINERCLEANFILES = Makefile.in - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -$(PROGRAMS): $(LDADD) diff --git a/contrib/bc/dc/Makefile.in b/contrib/bc/dc/Makefile.in deleted file mode 100644 index 0772dd62b866..000000000000 --- a/contrib/bc/dc/Makefile.in +++ /dev/null @@ -1,296 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -bin_PROGRAMS = dc - -dc_SOURCES = dc.c misc.c eval.c stack.c array.c numeric.c string.c -noinst_HEADERS = dc.h dc-proto.h dc-regdef.h - -INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../h -LDADD = ../lib/libbc.a - -MAINTAINERCLEANFILES = Makefile.in - -CFLAGS = @CFLAGS@ -Wall -funsigned-char -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(bin_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I.. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -dc_OBJECTS = dc.o misc.o eval.o stack.o array.o numeric.o string.o -dc_LDADD = $(LDADD) -dc_DEPENDENCIES = ../lib/libbc.a -dc_LDFLAGS = -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -HEADERS = $(noinst_HEADERS) - -DIST_COMMON = Makefile.am Makefile.in - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(dc_SOURCES) -OBJECTS = $(dc_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .o .s -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps dc/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-binPROGRAMS: - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -distclean-binPROGRAMS: - -maintainer-clean-binPROGRAMS: - -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - list='$(bin_PROGRAMS)'; for p in $$list; do \ - rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -dc: $(dc_OBJECTS) $(dc_DEPENDENCIES) - @rm -f dc - $(LINK) $(dc_LDFLAGS) $(dc_OBJECTS) $(dc_LDADD) $(LIBS) - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = dc - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done -array.o: array.c ../config.h dc.h dc-proto.h dc-regdef.h -dc.o: dc.c ../config.h ../h/getopt.h dc.h dc-proto.h -eval.o: eval.c ../config.h dc.h dc-proto.h -misc.o: misc.c ../config.h ../h/getopt.h dc.h dc-proto.h -numeric.o: numeric.c ../config.h ../h/number.h dc.h dc-proto.h -stack.o: stack.c ../config.h dc.h dc-proto.h dc-regdef.h -string.o: string.c ../config.h dc.h dc-proto.h - -info-am: -info: info-am -dvi-am: -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: install-binPROGRAMS -install-exec: install-exec-am - -install-data-am: -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: uninstall-binPROGRAMS -uninstall: uninstall-am -all-am: Makefile $(PROGRAMS) $(HEADERS) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - $(mkinstalldirs) $(DESTDIR)$(bindir) - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ - mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \ - mostlyclean-am - -clean: clean-am - -distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ - distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-binPROGRAMS \ - maintainer-clean-compile maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ -maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile tags mostlyclean-tags distclean-tags \ -clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ -check-am installcheck-am installcheck install-exec-am install-exec \ -install-data-am install-data install-am install uninstall-am uninstall \ -all-redirect all-am all installdirs mostlyclean-generic \ -distclean-generic clean-generic maintainer-clean-generic clean \ -mostlyclean distclean maintainer-clean - - -$(PROGRAMS): $(LDADD) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/dc/array.c b/contrib/bc/dc/array.c deleted file mode 100644 index d97f716c5de3..000000000000 --- a/contrib/bc/dc/array.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * implement arrays for dc - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This module is the only one that knows what arrays look like. */ - -#include "config.h" - -#include /* "dc-proto.h" wants this */ -#ifdef HAVE_STDLIB_H -/* get size_t definition from "almost ANSI" compiling environments. */ -#include -#endif -#include "dc.h" -#include "dc-proto.h" -#include "dc-regdef.h" - -/* what's most useful: quick access or sparse arrays? */ -/* I'll go with sparse arrays for now */ -struct dc_array { - int Index; - dc_data value; - struct dc_array *next; -}; - - -/* initialize the arrays */ -void -dc_array_init DC_DECLVOID() -{ -} - -/* store value into array_id[Index] */ -void -dc_array_set DC_DECLARG((array_id, Index, value)) - int array_id DC_DECLSEP - int Index DC_DECLSEP - dc_data value DC_DECLEND -{ - struct dc_array *cur; - struct dc_array *prev=NULL; - struct dc_array *newentry; - - cur = dc_get_stacked_array(array_id); - while (cur && cur->Index < Index){ - prev = cur; - cur = cur->next; - } - if (cur && cur->Index == Index){ - if (cur->value.dc_type == DC_NUMBER) - dc_free_num(&cur->value.v.number); - else if (cur->value.dc_type == DC_STRING) - dc_free_str(&cur->value.v.string); - else - dc_garbage(" in array", array_id); - cur->value = value; - }else{ - newentry = dc_malloc(sizeof *newentry); - newentry->Index = Index; - newentry->value = value; - newentry->next = cur; - if (prev) - prev->next = newentry; - else - dc_set_stacked_array(array_id, newentry); - } -} - -/* retrieve a dup of a value from array_id[Index] */ -/* A zero value is returned if the specified value is unintialized. */ -dc_data -dc_array_get DC_DECLARG((array_id, Index)) - int array_id DC_DECLSEP - int Index DC_DECLEND -{ - struct dc_array *cur; - - for (cur=dc_get_stacked_array(array_id); cur; cur=cur->next) - if (cur->Index == Index) - return dc_dup(cur->value); - return dc_int2data(0); -} - -/* free an array chain */ -void -dc_array_free DC_DECLARG((a_head)) - struct dc_array *a_head DC_DECLEND -{ - struct dc_array *cur; - struct dc_array *next; - - for (cur=a_head; cur; cur=next) { - next = cur->next; - if (cur->value.dc_type == DC_NUMBER) - dc_free_num(&cur->value.v.number); - else if (cur->value.dc_type == DC_STRING) - dc_free_str(&cur->value.v.string); - else - dc_garbage("in stack", -1); - free(cur); - } -} diff --git a/contrib/bc/dc/dc-proto.h b/contrib/bc/dc/dc-proto.h deleted file mode 100644 index f0ac28bfaf6a..000000000000 --- a/contrib/bc/dc/dc-proto.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * prototypes of all externally visible dc functions - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -extern const char *dc_str2charp DC_PROTO((dc_str)); -extern const char *dc_system DC_PROTO((const char *)); -extern void *dc_malloc DC_PROTO((size_t)); -extern struct dc_array *dc_get_stacked_array DC_PROTO((int)); - -extern void dc_array_set DC_PROTO((int, int, dc_data)); -extern void dc_array_free DC_PROTO((struct dc_array *)); -extern void dc_array_init DC_PROTO((void)); -extern void dc_binop DC_PROTO((int (*)(dc_num, dc_num, int, dc_num *), int)); -extern void dc_binop2 DC_PROTO((int (*)(dc_num, dc_num, int, - dc_num *, dc_num *), int)); -extern void dc_triop DC_PROTO((int (*)(dc_num, dc_num, dc_num, int, - dc_num *), int)); -extern void dc_clear_stack DC_PROTO((void)); -extern void dc_dump_num(dc_num, dc_discard); -extern void dc_free_num DC_PROTO((dc_num *)); -extern void dc_free_str DC_PROTO((dc_str *)); -extern void dc_garbage DC_PROTO((const char *, int)); -extern void dc_math_init DC_PROTO((void)); -extern void dc_memfail DC_PROTO((void)); -extern void dc_out_num DC_PROTO((dc_num, int, dc_newline, dc_discard)); -extern void dc_out_str DC_PROTO((dc_str, dc_newline, dc_discard)); -extern void dc_print DC_PROTO((dc_data, int, dc_newline, dc_discard)); -extern void dc_printall DC_PROTO((int)); -extern void dc_push DC_PROTO((dc_data)); -extern void dc_register_init DC_PROTO((void)); -extern void dc_register_push DC_PROTO((int, dc_data)); -extern void dc_register_set DC_PROTO((int, dc_data)); -extern void dc_set_stacked_array DC_PROTO((int, struct dc_array *)); -extern void dc_show_id DC_PROTO((FILE *, int, const char *)); -extern void dc_string_init DC_PROTO((void)); - -extern int dc_cmpop DC_PROTO((void)); -extern int dc_compare DC_PROTO((dc_num, dc_num)); -extern int dc_evalfile DC_PROTO((FILE *)); -extern int dc_evalstr DC_PROTO((dc_data)); -extern int dc_num2int DC_PROTO((dc_num, dc_discard)); -extern int dc_numlen DC_PROTO((dc_num)); -extern int dc_pop DC_PROTO((dc_data *)); -extern int dc_register_get DC_PROTO((int, dc_data *)); -extern int dc_register_pop DC_PROTO((int, dc_data *)); -extern int dc_tell_length DC_PROTO((dc_data, dc_discard)); -extern int dc_tell_scale DC_PROTO((dc_num, dc_discard)); -extern int dc_tell_stackdepth DC_PROTO((void)); -extern int dc_top_of_stack DC_PROTO((dc_data *)); - -extern size_t dc_strlen DC_PROTO((dc_str)); - -extern dc_data dc_array_get DC_PROTO((int, int)); -extern dc_data dc_dup DC_PROTO((dc_data)); -extern dc_data dc_dup_num DC_PROTO((dc_num)); -extern dc_data dc_dup_str DC_PROTO((dc_str)); -extern dc_data dc_getnum DC_PROTO((int (*)(void), int, int *)); -extern dc_data dc_int2data DC_PROTO((int)); -extern dc_data dc_makestring DC_PROTO((const char *, size_t)); -extern dc_data dc_readstring DC_PROTO((FILE *, int , int)); - -extern int dc_add DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_div DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_divrem DC_PROTO((dc_num, dc_num, int, dc_num *, dc_num *)); -extern int dc_exp DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_modexp DC_PROTO((dc_num, dc_num, dc_num, int, dc_num *)); -extern int dc_mul DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_rem DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_sub DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_sqrt DC_PROTO((dc_num, int, dc_num *)); diff --git a/contrib/bc/dc/dc-regdef.h b/contrib/bc/dc/dc-regdef.h deleted file mode 100644 index 540268c196b5..000000000000 --- a/contrib/bc/dc/dc-regdef.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * definitions for dc's "register" declarations - * - * Copyright (C) 1994 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -#ifdef HAVE_LIMITS_H -# include /* UCHAR_MAX */ -#endif - -/* determine how many register stacks there are */ -#ifndef DC_REGCOUNT -# ifndef UCHAR_MAX -# define DC_REGCOUNT 256 -# else -# define DC_REGCOUNT (UCHAR_MAX+1) -# endif -#endif /* not DC_REGCOUNT */ - -/* efficiency hack for masking arbritrary integers to 0..(DC_REGCOUNT-1) */ -#if (DC_REGCOUNT & (DC_REGCOUNT-1)) == 0 /* DC_REGCOUNT is power of 2 */ -# define regmap(r) ((r) & (DC_REGCOUNT-1)) -#else -# define regmap(r) ((r) % DC_REGCOUNT) -#endif diff --git a/contrib/bc/dc/dc.c b/contrib/bc/dc/dc.c deleted file mode 100644 index a72644ce878b..000000000000 --- a/contrib/bc/dc/dc.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * implement the "dc" Desk Calculator language. - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* Written with strong hiding of implementation details - * in their own specialized modules. - */ -/* This module contains the argument processing/main functions. - */ - -#include "config.h" - -#include -#ifdef HAVE_STDLIB_H -# include -#endif -#ifdef HAVE_STRING_H -# include -#else -# ifdef HAVE_STRINGS_H -# include -# endif -#endif -#include -#include "dc.h" -#include "dc-proto.h" - -#ifndef EXIT_SUCCESS /* C89 */ -# define EXIT_SUCCESS 0 -#endif -#ifndef EXIT_FAILURE /* C89 */ -# define EXIT_FAILURE 1 -#endif - -const char *progname; /* basename of program invocation */ - -static void -bug_report_info DC_DECLVOID() -{ - printf("Email bug reports to: bug-dc@gnu.org .\n"); -} - -static void -show_version DC_DECLVOID() -{ - printf("dc (GNU %s %s) %s\n", PACKAGE, VERSION, DC_VERSION); - printf("\n%s\n\ -This is free software; see the source for copying conditions. There is NO\n\ -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\ -to the extent permitted by law.\n", DC_COPYRIGHT); -} - -/* your generic usage function */ -static void -usage DC_DECLARG((f)) - FILE *f DC_DECLEND -{ - fprintf(f, "\ -Usage: %s [OPTION] [file ...]\n\ - -e, --expression=EXPR evaluate expression\n\ - -f, --file=FILE evaluate contents of file\n\ - -h, --help display this help and exit\n\ - -V, --version output version information and exit\n\ -\n\ -", progname); - bug_report_info(); -} - -/* returns a pointer to one past the last occurance of c in s, - * or s if c does not occur in s. - */ -static char * -r1bindex DC_DECLARG((s, c)) - char *s DC_DECLSEP - int c DC_DECLEND -{ - char *p = strrchr(s, c); - - if (!p) - return s; - return p + 1; -} - -static void -try_file(const char *filename) -{ - FILE *input; - - if (strcmp(filename, "-") == 0) { - input = stdin; - } else if ( !(input=fopen(filename, "r")) ) { - fprintf(stderr, "Could not open file "); - perror(filename); - exit(EXIT_FAILURE); - } - if (dc_evalfile(input)) - exit(EXIT_FAILURE); - if (input != stdin) - fclose(input); -} - - -int -main DC_DECLARG((argc, argv)) - int argc DC_DECLSEP - char **argv DC_DECLEND -{ - static struct option const long_opts[] = { - {"expression", required_argument, NULL, 'e'}, - {"file", required_argument, NULL, 'f'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'V'}, - {NULL, 0, NULL, 0} - }; - int did_eval = 0; - int c; - - progname = r1bindex(*argv, '/'); -#ifdef HAVE_SETVBUF - /* attempt to simplify interaction with applications such as emacs */ - (void) setvbuf(stdout, NULL, _IOLBF, 0); -#endif - dc_math_init(); - dc_string_init(); - dc_register_init(); - dc_array_init(); - - while ((c = getopt_long(argc, argv, "hVe:f:", long_opts, (int *)0)) != EOF) { - switch (c) { - case 'e': - { dc_data string = dc_makestring(optarg, strlen(optarg)); - if (dc_evalstr(string)) - return EXIT_SUCCESS; - dc_free_str(&string.v.string); - did_eval = 1; - } - break; - case 'f': - try_file(optarg); - did_eval = 1; - break; - case 'h': - usage(stdout); - return EXIT_SUCCESS; - case 'V': - show_version(); - return EXIT_SUCCESS; - default: - usage(stderr); - return EXIT_FAILURE; - } - } - - for (; optind < argc; ++optind) { - try_file(argv[optind]); - did_eval = 1; - } - if (!did_eval) { - /* if no -e commands and no command files, then eval stdin */ - if (dc_evalfile(stdin)) - return EXIT_FAILURE; - } - return EXIT_SUCCESS; -} diff --git a/contrib/bc/dc/dc.h b/contrib/bc/dc/dc.h deleted file mode 100644 index 3300f44426e8..000000000000 --- a/contrib/bc/dc/dc.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Header file for dc routines - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -#ifndef DC_DEFS_H -#define DC_DEFS_H - -/* 'I' is a command, and bases 17 and 18 are quite - * unusual, so we limit ourselves to bases 2 to 16 - */ -#define DC_IBASE_MAX 16 - -#define DC_SUCCESS 0 -#define DC_DOMAIN_ERROR 1 -#define DC_FAIL 2 /* generic failure */ - - -#ifndef __STDC__ -# define DC_PROTO(x) () -# define DC_DECLVOID() () -# define DC_DECLARG(arglist) arglist -# define DC_DECLSEP ; -# define DC_DECLEND ; -#else /* __STDC__ */ -# define DC_PROTO(x) x -# define DC_DECLVOID() (void) -# define DC_DECLARG(arglist) ( -# define DC_DECLSEP , -# define DC_DECLEND ) -#endif /* __STDC__ */ - - -typedef enum {DC_TOSS, DC_KEEP} dc_discard; -typedef enum {DC_NONL, DC_WITHNL} dc_newline; - - -/* type discriminant for dc_data */ -typedef enum {DC_UNINITIALIZED, DC_NUMBER, DC_STRING} dc_value_type; - -/* only numeric.c knows what dc_num's *really* look like */ -typedef struct dc_number *dc_num; - -/* only string.c knows what dc_str's *really* look like */ -typedef struct dc_string *dc_str; - - -/* except for the two implementation-specific modules, all - * dc functions only know of this one generic type of object - */ -typedef struct { - dc_value_type dc_type; /* discriminant for union */ - union { - dc_num number; - dc_str string; - } v; -} dc_data; - - -/* This is dc's only global variable: */ -extern const char *progname; /* basename of program invocation */ - -#endif /* not DC_DEFS_H */ diff --git a/contrib/bc/dc/eval.c b/contrib/bc/dc/eval.c deleted file mode 100644 index 21592d932ae6..000000000000 --- a/contrib/bc/dc/eval.c +++ /dev/null @@ -1,682 +0,0 @@ -/* - * evaluate the dc language, from a FILE* or a string - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This is the only module which knows about the dc input language */ - -#include "config.h" - -#include -#ifdef HAVE_STRING_H -# include /* memchr */ -#else -# ifdef HAVE_MEMORY_H -# include /* memchr, maybe */ -# else -# ifdef HAVE_STRINGS_H -# include /* memchr, maybe */ -# endif -#endif -#endif -#include "dc.h" -#include "dc-proto.h" - -typedef enum {DC_FALSE, DC_TRUE} dc_boolean; - -typedef enum { - DC_OKAY = DC_SUCCESS, /* no further intervention needed for this command */ - DC_EATONE, /* caller needs to eat the lookahead char */ - DC_QUIT, /* quit out of unwind_depth levels of evaluation */ - - /* with the following return values, the caller does not have to - * fret about stdin_lookahead's value - */ - DC_INT, /* caller needs to parse a dc_num from input stream */ - DC_STR, /* caller needs to parse a dc_str from input stream */ - DC_SYSTEM, /* caller needs to run a system() on next input line */ - DC_COMMENT, /* caller needs to skip to the next input line */ - DC_NEGCMP, /* caller needs to re-call dc_func() with `negcmp' set */ - - DC_EOF_ERROR /* unexpected end of input; abort current eval */ -} dc_status; - -static int dc_ibase=10; /* input base, 2 <= dc_ibase <= DC_IBASE_MAX */ -static int dc_obase=10; /* output base, 2 <= dc_obase */ -static int dc_scale=0; /* scale (see user documentaton) */ - -/* for Quitting evaluations */ -static int unwind_depth=0; - -/* if true, active Quit will not exit program */ -static dc_boolean unwind_noexit=DC_FALSE; - -/* - * Used to synchronize lookahead on stdin for '?' command. - * If set to EOF then lookahead is used up. - */ -static int stdin_lookahead=EOF; - - -/* input_fil and input_str are passed as arguments to dc_getnum */ - -/* used by the input_* functions: */ -static FILE *input_fil_fp; -static const char *input_str_string; - -/* Since we have a need for two characters of pushback, and - * ungetc() only guarantees one, we place the second pushback here - */ -static int input_pushback; - -/* passed as an argument to dc_getnum */ -static int -input_fil DC_DECLVOID() -{ - if (input_pushback != EOF){ - int c = input_pushback; - input_pushback = EOF; - return c; - } - return getc(input_fil_fp); -} - -/* passed as an argument to dc_getnum */ -static int -input_str DC_DECLVOID() -{ - if (!*input_str_string) - return EOF; - return *input_str_string++; -} - - - -/* takes a string and evals it; frees the string when done */ -/* Wrapper around dc_evalstr to avoid duplicating the free call - * at all possible return points. - */ -static int -dc_eval_and_free_str DC_DECLARG((string)) - dc_data string DC_DECLEND -{ - dc_status status; - - status = dc_evalstr(string); - if (string.dc_type == DC_STRING) - dc_free_str(&string.v.string); - return status; -} - - -/* dc_func does the grunt work of figuring out what each input - * character means; used by both dc_evalstr and dc_evalfile - * - * c -> the "current" input character under consideration - * peekc -> the lookahead input character - * negcmp -> negate comparison test (for <,=,> commands) - */ -static dc_status -dc_func DC_DECLARG((c, peekc, negcmp)) - int c DC_DECLSEP - int peekc DC_DECLSEP - int negcmp DC_DECLEND -{ - /* we occasionally need these for temporary data */ - /* Despite the GNU coding standards, it is much easier - * to have these declared once here, since this function - * is just one big switch statement. - */ - dc_data datum; - int tmpint; - - switch (c){ - case '_': case '.': - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - case '8': case '9': case 'A': case 'B': - case 'C': case 'D': case 'E': case 'F': - return DC_INT; - case ' ': - case '\t': - case '\n': - /* standard command separators */ - break; - - case '+': /* add top two stack elements */ - dc_binop(dc_add, dc_scale); - break; - case '-': /* subtract top two stack elements */ - dc_binop(dc_sub, dc_scale); - break; - case '*': /* multiply top two stack elements */ - dc_binop(dc_mul, dc_scale); - break; - case '/': /* divide top two stack elements */ - dc_binop(dc_div, dc_scale); - break; - case '%': - /* take the remainder from division of the top two stack elements */ - dc_binop(dc_rem, dc_scale); - break; - case '~': - /* Do division on the top two stack elements. Return the - * quotient as next-to-top of stack and the remainder as - * top-of-stack. - */ - dc_binop2(dc_divrem, dc_scale); - break; - case '|': - /* Consider the top three elements of the stack as (base, exp, mod), - * where mod is top-of-stack, exp is next-to-top, and base is - * second-from-top. Mod must be non-zero, exp must be non-negative, - * and all three must be integers. Push the result of raising - * base to the exp power, reduced modulo mod. If we had base in - * register b, exp in register e, and mod in register m then this - * is conceptually equivalent to "lble^lm%", but it is implemented - * in a more efficient manner, and can handle arbritrarily large - * values for exp. - */ - dc_triop(dc_modexp, dc_scale); - break; - case '^': /* exponientiation of the top two stack elements */ - dc_binop(dc_exp, dc_scale); - break; - case '<': - /* eval register named by peekc if - * less-than holds for top two stack elements - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if ( (dc_cmpop() < 0) == !negcmp ) - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - return DC_EATONE; - case '=': - /* eval register named by peekc if - * equal-to holds for top two stack elements - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if ( (dc_cmpop() == 0) == !negcmp ) - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - return DC_EATONE; - case '>': - /* eval register named by peekc if - * greater-than holds for top two stack elements - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if ( (dc_cmpop() > 0) == !negcmp ) - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - return DC_EATONE; - case '?': /* read a line from standard-input and eval it */ - if (stdin_lookahead != EOF){ - ungetc(stdin_lookahead, stdin); - stdin_lookahead = EOF; - } - if (dc_eval_and_free_str(dc_readstring(stdin, '\n', '\n')) == DC_QUIT) - return DC_QUIT; - return DC_OKAY; - case '[': /* read to balancing ']' into a dc_str */ - return DC_STR; - case '!': /* read to newline and call system() on resulting string */ - if (peekc == '<' || peekc == '=' || peekc == '>') - return DC_NEGCMP; - return DC_SYSTEM; - case '#': /* comment; skip remainder of current line */ - return DC_COMMENT; - - case 'a': /* Convert top of stack to an ascii character. */ - if (dc_pop(&datum) == DC_SUCCESS){ - char tmps; - if (datum.dc_type == DC_NUMBER){ - tmps = (char) dc_num2int(datum.v.number, DC_TOSS); - }else if (datum.dc_type == DC_STRING){ - tmps = *dc_str2charp(datum.v.string); - dc_free_str(&datum.v.string); - }else{ - dc_garbage("at top of stack", -1); - } - dc_push(dc_makestring(&tmps, 1)); - } - break; - case 'c': /* clear whole stack */ - dc_clear_stack(); - break; - case 'd': /* duplicate the datum on the top of stack */ - if (dc_top_of_stack(&datum) == DC_SUCCESS) - dc_push(dc_dup(datum)); - break; - case 'f': /* print list of all stack items */ - dc_printall(dc_obase); - break; - case 'i': /* set input base to value on top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if ( ! (2 <= tmpint && tmpint <= DC_IBASE_MAX) ) - fprintf(stderr, - "%s: input base must be a number \ -between 2 and %d (inclusive)\n", - progname, DC_IBASE_MAX); - else - dc_ibase = tmpint; - } - break; - case 'k': /* set scale to value on top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = -1; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if ( ! (tmpint >= 0) ) - fprintf(stderr, - "%s: scale must be a nonnegative number\n", - progname); - else - dc_scale = tmpint; - } - break; - case 'l': /* "load" -- push value on top of register stack named - * by peekc onto top of evaluation stack; does not - * modify the register stack - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - dc_push(datum); - return DC_EATONE; - case 'n': /* print the value popped off of top-of-stack; - * do not add a trailing newline - */ - if (dc_pop(&datum) == DC_SUCCESS) - dc_print(datum, dc_obase, DC_NONL, DC_TOSS); - break; - case 'o': /* set output base to value on top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if ( ! (tmpint > 1) ) - fprintf(stderr, - "%s: output base must be a number greater than 1\n", - progname); - else - dc_obase = tmpint; - } - break; - case 'p': /* print the datum on the top of stack, - * with a trailing newline - */ - if (dc_top_of_stack(&datum) == DC_SUCCESS) - dc_print(datum, dc_obase, DC_WITHNL, DC_KEEP); - break; - case 'q': /* quit two levels of evaluation, posibly exiting program */ - unwind_depth = 1; /* the return below is the first level of returns */ - unwind_noexit = DC_FALSE; - return DC_QUIT; - case 'r': /* rotate (swap) the top two elements on the stack - */ - if (dc_pop(&datum) == DC_SUCCESS) { - dc_data datum2; - int two_status; - two_status = dc_pop(&datum2); - dc_push(datum); - if (two_status == DC_SUCCESS) - dc_push(datum2); - } - break; - case 's': /* "store" -- replace top of register stack named - * by peekc with the value popped from the top - * of the evaluation stack - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS) - dc_register_set(peekc, datum); - return DC_EATONE; - case 'v': /* replace top of stack with its square root */ - if (dc_pop(&datum) == DC_SUCCESS){ - dc_num tmpnum; - if (datum.dc_type != DC_NUMBER){ - fprintf(stderr, - "%s: square root of nonnumeric attempted\n", - progname); - }else if (dc_sqrt(datum.v.number, dc_scale, &tmpnum) == DC_SUCCESS){ - dc_free_num(&datum.v.number); - datum.v.number = tmpnum; - dc_push(datum); - } - } - break; - case 'x': /* eval the datum popped from top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - if (datum.dc_type == DC_STRING){ - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - }else if (datum.dc_type == DC_NUMBER){ - dc_push(datum); - }else{ - dc_garbage("at top of stack", -1); - } - } - break; - case 'z': /* push the current stack depth onto the top of stack */ - dc_push(dc_int2data(dc_tell_stackdepth())); - break; - - case 'I': /* push the current input base onto the stack */ - dc_push(dc_int2data(dc_ibase)); - break; - case 'K': /* push the current scale onto the stack */ - dc_push(dc_int2data(dc_scale)); - break; - case 'L': /* pop a value off of register stack named by peekc - * and push it onto the evaluation stack - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_register_pop(peekc, &datum) == DC_SUCCESS) - dc_push(datum); - return DC_EATONE; - case 'O': /* push the current output base onto the stack */ - dc_push(dc_int2data(dc_obase)); - break; - case 'P': - /* Pop the value off the top of a stack. If it is - * a number, dump out the integer portion of its - * absolute value as a "base UCHAR_MAX+1" byte stream; - * if it is a string, just print it. - * In either case, do not append a trailing newline. - */ - if (dc_pop(&datum) == DC_SUCCESS){ - if (datum.dc_type == DC_NUMBER) - dc_dump_num(datum.v.number, DC_TOSS); - else if (datum.dc_type == DC_STRING) - dc_out_str(datum.v.string, DC_NONL, DC_TOSS); - else - dc_garbage("at top of stack", -1); - } - break; - case 'Q': /* quit out of top-of-stack nested evals; - * pops value from stack; - * does not exit program (stops short if necessary) - */ - if (dc_pop(&datum) == DC_SUCCESS){ - unwind_depth = 0; - unwind_noexit = DC_TRUE; - if (datum.dc_type == DC_NUMBER) - unwind_depth = dc_num2int(datum.v.number, DC_TOSS); - if (unwind_depth-- > 0) - return DC_QUIT; - unwind_depth = 0; /* paranoia */ - fprintf(stderr, - "%s: Q command requires a number >= 1\n", - progname); - } - break; -#if 0 - case 'R': /* pop a value off of the evaluation stack,; - * rotate the top - remaining stack elements that many - * places forward (negative numbers mean rotate - * backward). - */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - dc_stack_rotate(tmpint); - } - break; -#endif - case 'S': /* pop a value off of the evaluation stack - * and push it onto the register stack named by peekc - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS) - dc_register_push(peekc, datum); - return DC_EATONE; - case 'X': /* replace the number on top-of-stack with its scale factor */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_tell_scale(datum.v.number, DC_TOSS); - dc_push(dc_int2data(tmpint)); - } - break; - case 'Z': /* replace the datum on the top-of-stack with its length */ - if (dc_pop(&datum) == DC_SUCCESS) - dc_push(dc_int2data(dc_tell_length(datum, DC_TOSS))); - break; - - case ':': /* store into array */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = -1; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if (dc_pop(&datum) == DC_SUCCESS){ - if (tmpint < 0) - fprintf(stderr, - "%s: array index must be a nonnegative integer\n", - progname); - else - dc_array_set(peekc, tmpint, datum); - } - } - return DC_EATONE; - case ';': /* retreive from array */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = -1; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if (tmpint < 0) - fprintf(stderr, - "%s: array index must be a nonnegative integer\n", - progname); - else - dc_push(dc_array_get(peekc, tmpint)); - } - return DC_EATONE; - - default: /* What did that user mean? */ - fprintf(stderr, "%s: ", progname); - dc_show_id(stdout, c, " unimplemented\n"); - break; - } - return DC_OKAY; -} - - -/* takes a string and evals it */ -int -dc_evalstr DC_DECLARG((string)) - dc_data string DC_DECLEND -{ - const char *s; - const char *end; - const char *p; - size_t len; - int c; - int peekc; - int count; - int negcmp; - int next_negcmp = 0; - - if (string.dc_type != DC_STRING){ - fprintf(stderr, - "%s: eval called with non-string argument\n", - progname); - return DC_OKAY; - } - s = dc_str2charp(string.v.string); - end = s + dc_strlen(string.v.string); - while (s < end){ - c = *(const unsigned char *)s++; - peekc = EOF; - if (s < end) - peekc = *(const unsigned char *)s; - negcmp = next_negcmp; - next_negcmp = 0; - switch (dc_func(c, peekc, negcmp)){ - case DC_OKAY: - break; - case DC_EATONE: - if (peekc != EOF) - ++s; - break; - case DC_QUIT: - if (unwind_depth > 0){ - --unwind_depth; - return DC_QUIT; - } - return DC_OKAY; - - case DC_INT: - input_str_string = s - 1; - dc_push(dc_getnum(input_str, dc_ibase, &peekc)); - s = input_str_string; - if (peekc != EOF) - --s; - break; - case DC_STR: - count = 1; - for (p=s; p0; ++p) - if (*p == ']') - --count; - else if (*p == '[') - ++count; - len = p - s; - dc_push(dc_makestring(s, len-1)); - s = p; - break; - case DC_SYSTEM: - s = dc_system(s); - case DC_COMMENT: - s = memchr(s, '\n', (size_t)(end-s)); - if (!s) - s = end; - else - ++s; - break; - case DC_NEGCMP: - next_negcmp = 1; - break; - - case DC_EOF_ERROR: - fprintf(stderr, "%s: unexpected EOS\n", progname); - return DC_OKAY; - } - } - return DC_OKAY; -} - - -/* This is the main function of the whole DC program. - * Reads the file described by fp, calls dc_func to do - * the dirty work, and takes care of dc_func's shortcomings. - */ -int -dc_evalfile DC_DECLARG((fp)) - FILE *fp DC_DECLEND -{ - int c; - int peekc; - int negcmp; - int next_negcmp = 0; - dc_data datum; - - stdin_lookahead = EOF; - for (c=getc(fp); c!=EOF; c=peekc){ - peekc = getc(fp); - /* - * The following if() is the only place where ``stdin_lookahead'' - * might be set to other than EOF: - */ - if (fp == stdin) - stdin_lookahead = peekc; - negcmp = next_negcmp; - next_negcmp = 0; - switch (dc_func(c, peekc, negcmp)){ - case DC_OKAY: - if (stdin_lookahead != peekc && fp == stdin) - peekc = getc(fp); - break; - case DC_EATONE: - peekc = getc(fp); - break; - case DC_QUIT: - if (unwind_noexit != DC_TRUE) - return DC_SUCCESS; - fprintf(stderr, - "%s: Q command argument exceeded string execution depth\n", - progname); - if (stdin_lookahead != peekc && fp == stdin) - peekc = getc(fp); - break; - - case DC_INT: - input_fil_fp = fp; - input_pushback = c; - ungetc(peekc, fp); - dc_push(dc_getnum(input_fil, dc_ibase, &peekc)); - break; - case DC_STR: - ungetc(peekc, fp); - datum = dc_readstring(fp, '[', ']'); - dc_push(datum); - peekc = getc(fp); - break; - case DC_SYSTEM: - ungetc(peekc, fp); - datum = dc_readstring(stdin, '\n', '\n'); - (void)dc_system(dc_str2charp(datum.v.string)); - dc_free_str(&datum.v.string); - peekc = getc(fp); - break; - case DC_COMMENT: - while (peekc!=EOF && peekc!='\n') - peekc = getc(fp); - if (peekc != EOF) - peekc = getc(fp); - break; - case DC_NEGCMP: - next_negcmp = 1; - break; - - case DC_EOF_ERROR: - fprintf(stderr, "%s: unexpected EOF\n", progname); - return DC_FAIL; - } - } - return DC_SUCCESS; -} diff --git a/contrib/bc/dc/misc.c b/contrib/bc/dc/misc.c deleted file mode 100644 index fa94de12de54..000000000000 --- a/contrib/bc/dc/misc.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * misc. functions for the "dc" Desk Calculator language. - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This module contains miscelaneous functions that have no - * special knowledge of any private data structures. - * They could all be moved to their own separate modules, but - * are agglomerated here for convenience. - */ - -#include "config.h" - -#include -#ifdef HAVE_STDLIB_H -# include -#endif -#ifdef HAVE_STRING_H -# include -#else -# ifdef HAVE_STRINGS_H -# include -# endif -#endif -#include -#ifndef isgraph -# ifndef HAVE_ISGRAPH -# define isgraph isprint -# endif -#endif -#include -#include "dc.h" -#include "dc-proto.h" - -#ifndef EXIT_FAILURE /* C89 */ -# define EXIT_FAILURE 1 -#endif - - -/* print an "out of memory" diagnostic and exit program */ -void -dc_memfail DC_DECLVOID() -{ - fprintf(stderr, "%s: out of memory\n", progname); - exit(EXIT_FAILURE); -} - -/* malloc or die */ -void * -dc_malloc DC_DECLARG((len)) - size_t len DC_DECLEND -{ - void *result = malloc(len); - - if (!result) - dc_memfail(); - return result; -} - - -/* print the id in a human-understandable form - * fp is the output stream to place the output on - * id is the name of the register (or command) to be printed - * suffix is a modifier (such as "stack") to be printed - */ -void -dc_show_id DC_DECLARG((fp, id, suffix)) - FILE *fp DC_DECLSEP - int id DC_DECLSEP - const char *suffix DC_DECLEND -{ - if (isgraph(id)) - fprintf(fp, "'%c' (%#o)%s", id, id, suffix); - else - fprintf(fp, "%#o%s", id, suffix); -} - - -/* report that corrupt data has been detected; - * use the msg and regid (if nonnegative) to give information - * about where the garbage was found, - * - * will abort() so that a debugger might be used to help find - * the bug - */ -/* If this routine is called, then there is a bug in the code; - * i.e. it is _not_ a data or user error - */ -void -dc_garbage DC_DECLARG((msg, regid)) - const char *msg DC_DECLSEP - int regid DC_DECLEND -{ - if (regid < 0) { - fprintf(stderr, "%s: garbage %s\n", progname, msg); - } else { - fprintf(stderr, "%s:%s register ", progname, msg); - dc_show_id(stderr, regid, " is garbage\n"); - } - abort(); -} - - -/* call system() with the passed string; - * if the string contains a newline, terminate the string - * there before calling system. - * Return a pointer to the first unused character in the string - * (i.e. past the '\n' if there was one, to the '\0' otherwise). - */ -const char * -dc_system DC_DECLARG((s)) - const char *s DC_DECLEND -{ - const char *p; - char *tmpstr; - size_t len; - - p = strchr(s, '\n'); - if (p) { - len = p - s; - tmpstr = dc_malloc(len + 1); - strncpy(tmpstr, s, len); - tmpstr[len] = '\0'; - system(tmpstr); - free(tmpstr); - return p + 1; - } - system(s); - return s + strlen(s); -} - - -/* print out the indicated value */ -void -dc_print DC_DECLARG((value, obase, newline_p, discard_p)) - dc_data value DC_DECLSEP - int obase DC_DECLSEP - dc_newline newline_p DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - if (value.dc_type == DC_NUMBER) { - dc_out_num(value.v.number, obase, newline_p, discard_p); - } else if (value.dc_type == DC_STRING) { - dc_out_str(value.v.string, newline_p, discard_p); - } else { - dc_garbage("in data being printed", -1); - } -} - -/* return a duplicate of the passed value, regardless of type */ -dc_data -dc_dup DC_DECLARG((value)) - dc_data value DC_DECLEND -{ - if (value.dc_type!=DC_NUMBER && value.dc_type!=DC_STRING) - dc_garbage("in value being duplicated", -1); - if (value.dc_type == DC_NUMBER) - return dc_dup_num(value.v.number); - /*else*/ - return dc_dup_str(value.v.string); -} diff --git a/contrib/bc/dc/numeric.c b/contrib/bc/dc/numeric.c deleted file mode 100644 index 6086be544f5a..000000000000 --- a/contrib/bc/dc/numeric.c +++ /dev/null @@ -1,600 +0,0 @@ -/* - * interface dc to the bc numeric routines - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This should be the only module that knows the internals of type dc_num */ -/* In this particular implementation we just slather out some glue and - * make use of bc's numeric routines. - */ - -#include "config.h" - -#include -#include -#ifdef HAVE_LIMITS_H -# include -#else -# define UCHAR_MAX ((unsigned char)~0) -#endif -#include -#include "number.h" -#include "dc.h" -#include "dc-proto.h" - -#ifdef __GNUC__ -# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__-0 >= 7) -# define ATTRIB(x) __attribute__(x) -# endif -#endif -#ifndef ATTRIB -# define ATTRIB(x) -#endif - -/* Forward prototype */ -static void out_char (int); - -/* there is no POSIX standard for dc, so we'll take the GNU definitions */ -int std_only = FALSE; - -/* convert an opaque dc_num into a real bc_num */ -#define CastNum(x) ((bc_num)(x)) - -/* add two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_add DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale ATTRIB((unused)) DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_add(CastNum(a), CastNum(b), (bc_num *)result, 0); - return DC_SUCCESS; -} - -/* subtract two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_sub DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale ATTRIB((unused)) DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_sub(CastNum(a), CastNum(b), (bc_num *)result, 0); - return DC_SUCCESS; -} - -/* multiply two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_mul DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_multiply(CastNum(a), CastNum(b), (bc_num *)result, kscale); - return DC_SUCCESS; -} - -/* divide two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_div DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - if (bc_divide(CastNum(a), CastNum(b), (bc_num *)result, kscale)){ - fprintf(stderr, "%s: divide by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -/* divide two dc_nums, place quotient into *quotient and remainder - * into *remainder; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_divrem DC_DECLARG((a, b, kscale, quotient, remainder)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *quotient DC_DECLSEP - dc_num *remainder DC_DECLEND -{ - bc_init_num((bc_num *)quotient); - bc_init_num((bc_num *)remainder); - if (bc_divmod(CastNum(a), CastNum(b), - (bc_num *)quotient, (bc_num *)remainder, kscale)){ - fprintf(stderr, "%s: divide by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -/* place the reminder of dividing a by b into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_rem DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - if (bc_modulo(CastNum(a), CastNum(b), (bc_num *)result, kscale)){ - fprintf(stderr, "%s: remainder by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -int -dc_modexp DC_DECLARG((base, expo, mod, kscale, result)) - dc_num base DC_DECLSEP - dc_num expo DC_DECLSEP - dc_num mod DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - if (bc_raisemod(CastNum(base), CastNum(expo), CastNum(mod), - (bc_num *)result, kscale)){ - if (bc_is_zero(CastNum(mod))) - fprintf(stderr, "%s: remainder by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -/* place the result of exponentiationg a by b into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_exp DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_raise(CastNum(a), CastNum(b), (bc_num *)result, kscale); - return DC_SUCCESS; -} - -/* take the square root of the value, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_sqrt DC_DECLARG((value, kscale, result)) - dc_num value DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_num tmp; - - tmp = bc_copy_num(CastNum(value)); - if (!bc_sqrt(&tmp, kscale)){ - fprintf(stderr, "%s: square root of negative number\n", progname); - bc_free_num(&tmp); - return DC_DOMAIN_ERROR; - } - *((bc_num *)result) = tmp; - return DC_SUCCESS; -} - -/* compare dc_nums a and b; - * return a negative value if a < b; - * return a positive value if a > b; - * return zero value if a == b - */ -int -dc_compare DC_DECLARG((a, b)) - dc_num a DC_DECLSEP - dc_num b DC_DECLEND -{ - return bc_compare(CastNum(a), CastNum(b)); -} - -/* attempt to convert a dc_num to its corresponding int value - * If discard_p is DC_TOSS then deallocate the value after use. - */ -int -dc_num2int DC_DECLARG((value, discard_p)) - dc_num value DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - long result; - - result = bc_num2long(CastNum(value)); - if (discard_p == DC_TOSS) - dc_free_num(&value); - return (int)result; -} - -/* convert a C integer value into a dc_num */ -/* For convenience of the caller, package the dc_num - * into a dc_data result. - */ -dc_data -dc_int2data DC_DECLARG((value)) - int value DC_DECLEND -{ - dc_data result; - - bc_init_num((bc_num *)&result.v.number); - bc_int2num((bc_num *)&result.v.number, value); - result.dc_type = DC_NUMBER; - return result; -} - -/* get a dc_num from some input stream; - * input is a function which knows how to read the desired input stream - * ibase is the input base (2<=ibase<=DC_IBASE_MAX) - * *readahead will be set to the readahead character consumed while - * looking for the end-of-number - */ -/* For convenience of the caller, package the dc_num - * into a dc_data result. - */ -dc_data -dc_getnum DC_DECLARG((input, ibase, readahead)) - int (*input) DC_PROTO((void)) DC_DECLSEP - int ibase DC_DECLSEP - int *readahead DC_DECLEND -{ - bc_num base; - bc_num result; - bc_num build; - bc_num tmp; - bc_num divisor; - dc_data full_result; - int negative = 0; - int digit; - int decimal; - int c; - - bc_init_num(&tmp); - bc_init_num(&build); - bc_init_num(&base); - result = bc_copy_num(_zero_); - bc_int2num(&base, ibase); - c = (*input)(); - while (isspace(c)) - c = (*input)(); - if (c == '_' || c == '-'){ - negative = c; - c = (*input)(); - }else if (c == '+'){ - c = (*input)(); - } - while (isspace(c)) - c = (*input)(); - for (;;){ - if (isdigit(c)) - digit = c - '0'; - else if ('A' <= c && c <= 'F') - digit = 10 + c - 'A'; - else - break; - c = (*input)(); - bc_int2num(&tmp, digit); - bc_multiply(result, base, &result, 0); - bc_add(result, tmp, &result, 0); - } - if (c == '.'){ - bc_free_num(&build); - bc_free_num(&tmp); - divisor = bc_copy_num(_one_); - build = bc_copy_num(_zero_); - decimal = 0; - for (;;){ - c = (*input)(); - if (isdigit(c)) - digit = c - '0'; - else if ('A' <= c && c <= 'F') - digit = 10 + c - 'A'; - else - break; - bc_int2num(&tmp, digit); - bc_multiply(build, base, &build, 0); - bc_add(build, tmp, &build, 0); - bc_multiply(divisor, base, &divisor, 0); - ++decimal; - } - bc_divide(build, divisor, &build, decimal); - bc_add(result, build, &result, 0); - } - /* Final work. */ - if (negative) - bc_sub(_zero_, result, &result, 0); - - bc_free_num(&tmp); - bc_free_num(&build); - bc_free_num(&base); - if (readahead) - *readahead = c; - full_result.v.number = (dc_num)result; - full_result.dc_type = DC_NUMBER; - return full_result; -} - - -/* return the "length" of the number */ -int -dc_numlen DC_DECLARG((value)) - dc_num value DC_DECLEND -{ - bc_num num = CastNum(value); - - /* is this right??? */ - return num->n_len + num->n_scale - (*num->n_value == '\0'); -} - -/* return the scale factor of the passed dc_num - * If discard_p is DC_TOSS then deallocate the value after use. - */ -int -dc_tell_scale DC_DECLARG((value, discard_p)) - dc_num value DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - int kscale; - - kscale = CastNum(value)->n_scale; - if (discard_p == DC_TOSS) - dc_free_num(&value); - return kscale; -} - - -/* initialize the math subsystem */ -void -dc_math_init DC_DECLVOID() -{ - bc_init_numbers(); -} - -/* print out a dc_num in output base obase to stdout; - * if newline_p is DC_WITHNL, terminate output with a '\n'; - * if discard_p is DC_TOSS then deallocate the value after use - */ -void -dc_out_num DC_DECLARG((value, obase, newline_p, discard_p)) - dc_num value DC_DECLSEP - int obase DC_DECLSEP - dc_newline newline_p DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - out_char('\0'); /* clear the column counter */ - bc_out_num(CastNum(value), obase, out_char, 0); - if (newline_p == DC_WITHNL) - putchar ('\n'); - if (discard_p == DC_TOSS) - dc_free_num(&value); -} - -/* dump out the absolute value of the integer part of a - * dc_num as a byte stream, without any line wrapping; - * if discard_p is DC_TOSS then deallocate the value after use - */ -void -dc_dump_num DC_DECLARG((dcvalue, discard_p)) - dc_num dcvalue DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - struct digit_stack { int digit; struct digit_stack *link;}; - struct digit_stack *top_of_stack = NULL; - struct digit_stack *cur; - struct digit_stack *next; - bc_num value; - bc_num obase; - bc_num digit; - - bc_init_num(&value); - bc_init_num(&obase); - bc_init_num(&digit); - - /* we only handle the integer portion: */ - bc_divide(CastNum(dcvalue), _one_, &value, 0); - /* we only handle the absolute value: */ - value->n_sign = PLUS; - /* we're done with the dcvalue parameter: */ - if (discard_p == DC_TOSS) - dc_free_num(&dcvalue); - - bc_int2num(&obase, 1+UCHAR_MAX); - do { - (void) bc_divmod(value, obase, &value, &digit, 0); - cur = dc_malloc(sizeof *cur); - cur->digit = (int)bc_num2long(digit); - cur->link = top_of_stack; - top_of_stack = cur; - } while (!bc_is_zero(value)); - - for (cur=top_of_stack; cur; cur=next) { - putchar(cur->digit); - next = cur->link; - free(cur); - } - - bc_free_num(&digit); - bc_free_num(&obase); - bc_free_num(&value); -} - -/* deallocate an instance of a dc_num */ -void -dc_free_num DC_DECLARG((value)) - dc_num *value DC_DECLEND -{ - bc_free_num((bc_num *)value); -} - -/* return a duplicate of the number in the passed value */ -/* The mismatched data types forces the caller to deal with - * bad dc_type'd dc_data values, and makes it more convenient - * for the caller to not have to do the grunge work of setting - * up a dc_type result. - */ -dc_data -dc_dup_num DC_DECLARG((value)) - dc_num value DC_DECLEND -{ - dc_data result; - - ++CastNum(value)->n_refs; - result.v.number = value; - result.dc_type = DC_NUMBER; - return result; -} - - - -/*---------------------------------------------------------------------------\ -| The rest of this file consists of stubs for bc routines called by numeric.c| -| so as to minimize the amount of bc code needed to build dc. | -| The bulk of the code was just lifted straight out of the bc source. | -\---------------------------------------------------------------------------*/ - -#ifdef HAVE_STDLIB_H -# include -#endif - -#ifdef HAVE_STDARG_H -# include -#else -# include -#endif - - -int out_col = 0; - -/* Output routines: Write a character CH to the standard output. - It keeps track of the number of characters output and may - break the output with a "\". */ - -static void -out_char (ch) - int ch; -{ - - if (ch == '\0') - { - out_col = 0; - } - else - { - out_col++; - if (out_col == 70) - { - putchar ('\\'); - putchar ('\n'); - out_col = 1; - } - putchar (ch); - } -} - -/* Malloc could not get enough memory. */ - -void -out_of_memory() -{ - dc_memfail(); -} - -/* Runtime error will print a message and stop the machine. */ - -#ifdef HAVE_STDARG_H -#ifdef __STDC__ -void -rt_error (char *mesg, ...) -#else -void -rt_error (mesg) - char *mesg; -#endif -#else -void -rt_error (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime error: "); -#ifdef HAVE_STDARG_H - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - fprintf (stderr, "\n"); -} - - -/* A runtime warning tells of some action taken by the processor that - may change the program execution but was not enough of a problem - to stop the execution. */ - -#ifdef HAVE_STDARG_H -#ifdef __STDC__ -void -rt_warn (char *mesg, ...) -#else -void -rt_warn (mesg) - char *mesg; -#endif -#else -void -rt_warn (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime warning: "); -#ifdef HAVE_STDARG_H - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - fprintf (stderr, "\n"); -} diff --git a/contrib/bc/dc/stack.c b/contrib/bc/dc/stack.c deleted file mode 100644 index 1d8a9bf73133..000000000000 --- a/contrib/bc/dc/stack.c +++ /dev/null @@ -1,494 +0,0 @@ -/* - * implement stack functions for dc - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This module is the only one that knows what stacks (both the - * regular evaluation stack and the named register stacks) - * look like. - */ - -#include "config.h" - -#include -#ifdef HAVE_STDLIB_H -# include -#endif -#include "dc.h" -#include "dc-proto.h" -#include "dc-regdef.h" - -/* an oft-used error message: */ -#define Empty_Stack fprintf(stderr, "%s: stack empty\n", progname) - - -/* simple linked-list implementaion suffices: */ -struct dc_list { - dc_data value; - struct dc_array *array; /* opaque */ - struct dc_list *link; -}; -typedef struct dc_list dc_list; - -/* the anonymous evaluation stack */ -static dc_list *dc_stack=NULL; - -/* the named register stacks */ -static dc_list *dc_register[DC_REGCOUNT]; - - -/* allocate a new dc_list item */ -static dc_list * -dc_alloc DC_DECLVOID() -{ - dc_list *result; - - result = dc_malloc(sizeof *result); - result->value.dc_type = DC_UNINITIALIZED; - result->array = NULL; - result->link = NULL; - return result; -} - - -/* check that there are two numbers on top of the stack, - * then call op with the popped numbers. Construct a dc_data - * value from the dc_num returned by op and push it - * on the stack. - * If the op call doesn't return DC_SUCCESS, then leave the stack - * unmodified. - */ -void -dc_binop DC_DECLARG((op, kscale)) - int (*op)DC_PROTO((dc_num, dc_num, int, dc_num *)) DC_DECLSEP - int kscale DC_DECLEND -{ - dc_data a; - dc_data b; - dc_data r; - - if (!dc_stack || !dc_stack->link){ - Empty_Stack; - return; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return; - } - (void)dc_pop(&b); - (void)dc_pop(&a); - if ((*op)(a.v.number, b.v.number, kscale, &r.v.number) == DC_SUCCESS){ - r.dc_type = DC_NUMBER; - dc_push(r); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - }else{ - /* op failed; restore the stack */ - dc_push(a); - dc_push(b); - } -} - -/* check that there are two numbers on top of the stack, - * then call op with the popped numbers. Construct two dc_data - * values from the dc_num's returned by op and push them - * on the stack. - * If the op call doesn't return DC_SUCCESS, then leave the stack - * unmodified. - */ -void -dc_binop2 DC_DECLARG((op, kscale)) - int (*op)DC_PROTO((dc_num, dc_num, int, dc_num *, dc_num *)) DC_DECLSEP - int kscale DC_DECLEND -{ - dc_data a; - dc_data b; - dc_data r1; - dc_data r2; - - if (!dc_stack || !dc_stack->link){ - Empty_Stack; - return; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return; - } - (void)dc_pop(&b); - (void)dc_pop(&a); - if ((*op)(a.v.number, b.v.number, kscale, - &r1.v.number, &r2.v.number) == DC_SUCCESS){ - r1.dc_type = DC_NUMBER; - dc_push(r1); - r2.dc_type = DC_NUMBER; - dc_push(r2); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - }else{ - /* op failed; restore the stack */ - dc_push(a); - dc_push(b); - } -} - -/* check that there are two numbers on top of the stack, - * then call dc_compare with the popped numbers. - * Return negative, zero, or positive based on the ordering - * of the two numbers. - */ -int -dc_cmpop DC_DECLVOID() -{ - int result; - dc_data a; - dc_data b; - - if (!dc_stack || !dc_stack->link){ - Empty_Stack; - return 0; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return 0; - } - (void)dc_pop(&b); - (void)dc_pop(&a); - result = dc_compare(b.v.number, a.v.number); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - return result; -} - -/* check that there are three numbers on top of the stack, - * then call op with the popped numbers. Construct a dc_data - * value from the dc_num returned by op and push it - * on the stack. - * If the op call doesn't return DC_SUCCESS, then leave the stack - * unmodified. - */ -void -dc_triop DC_DECLARG((op, kscale)) - int (*op)DC_PROTO((dc_num, dc_num, dc_num, int, dc_num *)) DC_DECLSEP - int kscale DC_DECLEND -{ - dc_data a; - dc_data b; - dc_data c; - dc_data r; - - if (!dc_stack || !dc_stack->link || !dc_stack->link->link){ - Empty_Stack; - return; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER - || dc_stack->link->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return; - } - (void)dc_pop(&c); - (void)dc_pop(&b); - (void)dc_pop(&a); - if ((*op)(a.v.number, b.v.number, c.v.number, - kscale, &r.v.number) == DC_SUCCESS){ - r.dc_type = DC_NUMBER; - dc_push(r); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - dc_free_num(&c.v.number); - }else{ - /* op failed; restore the stack */ - dc_push(a); - dc_push(b); - dc_push(c); - } -} - - -/* initialize the register stacks to their initial values */ -void -dc_register_init DC_DECLVOID() -{ - int i; - - for (i=0; ilink; - if (n->value.dc_type == DC_NUMBER) - dc_free_num(&n->value.v.number); - else if (n->value.dc_type == DC_STRING) - dc_free_str(&n->value.v.string); - else - dc_garbage("in stack", -1); - dc_array_free(n->array); - free(n); - } - dc_stack = NULL; -} - -/* push a value onto the evaluation stack */ -void -dc_push DC_DECLARG((value)) - dc_data value DC_DECLEND -{ - dc_list *n = dc_alloc(); - - if (value.dc_type!=DC_NUMBER && value.dc_type!=DC_STRING) - dc_garbage("in data being pushed", -1); - n->value = value; - n->link = dc_stack; - dc_stack = n; -} - -/* push a value onto the named register stack */ -void -dc_register_push DC_DECLARG((stackid, value)) - int stackid DC_DECLSEP - dc_data value DC_DECLEND -{ - dc_list *n = dc_alloc(); - - stackid = regmap(stackid); - n->value = value; - n->link = dc_register[stackid]; - dc_register[stackid] = n; -} - -/* set *result to the value on the top of the evaluation stack */ -/* The caller is responsible for duplicating the value if it - * is to be maintained as anything more than a transient identity. - * - * DC_FAIL is returned if the stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_top_of_stack DC_DECLARG((result)) - dc_data *result DC_DECLEND -{ - if (!dc_stack){ - Empty_Stack; - return DC_FAIL; - } - if (dc_stack->value.dc_type!=DC_NUMBER - && dc_stack->value.dc_type!=DC_STRING) - dc_garbage("at top of stack", -1); - *result = dc_stack->value; - return DC_SUCCESS; -} - -/* set *result to a dup of the value on the top of the named register stack */ -/* - * DC_FAIL is returned if the named stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_register_get DC_DECLARG((regid, result)) - int regid DC_DECLSEP - dc_data *result DC_DECLEND -{ - dc_list *r; - - regid = regmap(regid); - r = dc_register[regid]; - if ( ! r ){ - fprintf(stderr, "%s: register ", progname); - dc_show_id(stderr, regid, " is empty\n"); - return DC_FAIL; - } - *result = dc_dup(r->value); - return DC_SUCCESS; -} - -/* set the top of the named register stack to the indicated value */ -/* If the named stack is empty, craft a stack entry to enter the - * value into. - */ -void -dc_register_set DC_DECLARG((regid, value)) - int regid DC_DECLSEP - dc_data value DC_DECLEND -{ - dc_list *r; - - regid = regmap(regid); - r = dc_register[regid]; - if ( ! r ) - dc_register[regid] = dc_alloc(); - else if (r->value.dc_type == DC_NUMBER) - dc_free_num(&r->value.v.number); - else if (r->value.dc_type == DC_STRING) - dc_free_str(&r->value.v.string); - else if (r->value.dc_type == DC_UNINITIALIZED) - ; - else - dc_garbage("", regid); - dc_register[regid]->value = value; -} - -/* pop from the evaluation stack - * - * DC_FAIL is returned if the stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_pop DC_DECLARG((result)) - dc_data *result DC_DECLEND -{ - dc_list *r; - - r = dc_stack; - if (!r){ - Empty_Stack; - return DC_FAIL; - } - if (r->value.dc_type!=DC_NUMBER && r->value.dc_type!=DC_STRING) - dc_garbage("at top of stack", -1); - *result = r->value; - dc_stack = r->link; - dc_array_free(r->array); - free(r); - return DC_SUCCESS; -} - -/* pop from the named register stack - * - * DC_FAIL is returned if the named stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_register_pop DC_DECLARG((stackid, result)) - int stackid DC_DECLSEP - dc_data *result DC_DECLEND -{ - dc_list *r; - - stackid = regmap(stackid); - r = dc_register[stackid]; - if (!r){ - fprintf(stderr, "%s: stack register ", progname); - dc_show_id(stderr, stackid, " is empty\n"); - return DC_FAIL; - } - if (r->value.dc_type!=DC_NUMBER && r->value.dc_type!=DC_STRING) - dc_garbage(" stack", stackid); - *result = r->value; - dc_register[stackid] = r->link; - dc_array_free(r->array); - free(r); - return DC_SUCCESS; -} - - -/* tell how many entries are currently on the evaluation stack */ -int -dc_tell_stackdepth DC_DECLVOID() -{ - dc_list *n; - int depth=0; - - for (n=dc_stack; n; n=n->link) - ++depth; - return depth; -} - - -/* return the length of the indicated data value; - * if discard_p is DC_TOSS, the deallocate the value when done - * - * The definition of a datum's length is deligated to the - * appropriate module. - */ -int -dc_tell_length DC_DECLARG((value, discard_p)) - dc_data value DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - int length; - - if (value.dc_type == DC_NUMBER){ - length = dc_numlen(value.v.number); - if (discard_p == DC_TOSS) - dc_free_num(&value.v.number); - } else if (value.dc_type == DC_STRING) { - length = dc_strlen(value.v.string); - if (discard_p == DC_TOSS) - dc_free_str(&value.v.string); - } else { - dc_garbage("in tell_length", -1); - /*NOTREACHED*/ - length = 0; /*just to suppress spurious compiler warnings*/ - } - return length; -} - - - -/* print out all of the values on the evaluation stack */ -void -dc_printall DC_DECLARG((obase)) - int obase DC_DECLEND -{ - dc_list *n; - - for (n=dc_stack; n; n=n->link) - dc_print(n->value, obase, DC_WITHNL, DC_KEEP); -} - - - - -/* get the current array head for the named array */ -struct dc_array * -dc_get_stacked_array DC_DECLARG((array_id)) - int array_id DC_DECLEND -{ - dc_list *r = dc_register[regmap(array_id)]; - return r ? r->array : NULL; -} - -/* set the current array head for the named array */ -void -dc_set_stacked_array DC_DECLARG((array_id, new_head)) - int array_id DC_DECLSEP - struct dc_array *new_head DC_DECLEND -{ - dc_list *r; - - array_id = regmap(array_id); - r = dc_register[array_id]; - if ( ! r ) - r = dc_register[array_id] = dc_alloc(); - r->array = new_head; -} diff --git a/contrib/bc/dc/string.c b/contrib/bc/dc/string.c deleted file mode 100644 index a7f79a47efa7..000000000000 --- a/contrib/bc/dc/string.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * implement string functions for dc - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This should be the only module that knows the internals of type dc_string */ - -#include "config.h" - -#include -#ifdef HAVE_STDDEF_H -# include /* ptrdiff_t */ -#else -# define ptrdiff_t size_t -#endif -#ifdef HAVE_STDLIB_H -# include -#endif -#ifdef HAVE_STRING_H -# include /* memcpy */ -#else -# ifdef HAVE_MEMORY_H -# include /* memcpy, maybe */ -# else -# ifdef HAVE_STRINGS_H -# include /* memcpy, maybe */ -# endif -# endif -#endif -#include "dc.h" -#include "dc-proto.h" - -/* here is the completion of the dc_string type: */ -struct dc_string { - char *s_ptr; /* pointer to base of string */ - size_t s_len; /* length of counted string */ - int s_refs; /* reference count to cut down on memory use by duplicates */ -}; - - -/* return a duplicate of the string in the passed value */ -/* The mismatched data types forces the caller to deal with - * bad dc_type'd dc_data values, and makes it more convenient - * for the caller to not have to do the grunge work of setting - * up a dc_type result. - */ -dc_data -dc_dup_str DC_DECLARG((value)) - dc_str value DC_DECLEND -{ - dc_data result; - - ++value->s_refs; - result.v.string = value; - result.dc_type = DC_STRING; - return result; -} - -/* free an instance of a dc_str value */ -void -dc_free_str DC_DECLARG((value)) - dc_str *value DC_DECLEND -{ - struct dc_string *string = *value; - - if (--string->s_refs < 1){ - free(string->s_ptr); - free(string); - } -} - -/* Output a dc_str value. - * Add a trailing newline if "newline" is set. - * Free the value after use if discard_flag is set. - */ -void -dc_out_str DC_DECLARG((value, newline, discard_flag)) - dc_str value DC_DECLSEP - dc_newline newline DC_DECLSEP - dc_discard discard_flag DC_DECLEND -{ - fwrite(value->s_ptr, value->s_len, sizeof *value->s_ptr, stdout); - if (newline == DC_WITHNL) - putchar('\n'); - if (discard_flag == DC_TOSS) - dc_free_str(&value); -} - -/* make a copy of a string (base s, length len) - * into a dc_str value; return a dc_data result - * with this value - */ -dc_data -dc_makestring DC_DECLARG((s, len)) - const char *s DC_DECLSEP - size_t len DC_DECLEND -{ - dc_data result; - struct dc_string *string; - - string = dc_malloc(sizeof *string); - string->s_ptr = dc_malloc(len+1); - memcpy(string->s_ptr, s, len); - string->s_ptr[len] = '\0'; /* nul terminated for those who need it */ - string->s_len = len; - string->s_refs = 1; - result.v.string = string; - result.dc_type = DC_STRING; - return result; -} - -/* read a dc_str value from FILE *fp; - * if ldelim == rdelim, then read until a ldelim char or EOF is reached; - * if ldelim != rdelim, then read until a matching rdelim for the - * (already eaten) first ldelim is read. - * Return a dc_data result with the dc_str value as its contents. - */ -dc_data -dc_readstring DC_DECLARG((fp, ldelim, rdelim)) - FILE *fp DC_DECLSEP - int ldelim DC_DECLSEP - int rdelim DC_DECLEND -{ - static char *line_buf = NULL; /* a buffer to build the string in */ - static size_t buflen = 0; /* the current size of line_buf */ - int depth=1; - int c; - char *p; - const char *end; - - if (!line_buf){ - /* initial buflen should be large enough to handle most cases */ - buflen = 2016; - line_buf = dc_malloc(buflen); - } - p = line_buf; - end = line_buf + buflen; - for (;;){ - c = getc(fp); - if (c == EOF) - break; - else if (c == rdelim && --depth < 1) - break; - else if (c == ldelim) - ++depth; - if (p >= end){ - ptrdiff_t offset = p - line_buf; - /* buflen increment should be big enough - * to avoid execessive reallocs: - */ - buflen += 2048; - line_buf = realloc(line_buf, buflen); - if (!line_buf) - dc_memfail(); - p = line_buf + offset; - end = line_buf + buflen; - } - *p++ = c; - } - return dc_makestring(line_buf, (size_t)(p-line_buf)); -} - -/* return the base pointer of the dc_str value; - * This function is needed because no one else knows what dc_str - * looks like. - */ -const char * -dc_str2charp DC_DECLARG((value)) - dc_str value DC_DECLEND -{ - return value->s_ptr; -} - -/* return the length of the dc_str value; - * This function is needed because no one else knows what dc_str - * looks like, and strlen(dc_str2charp(value)) won't work - * if there's an embedded '\0'. - */ -size_t -dc_strlen DC_DECLARG((value)) - dc_str value DC_DECLEND -{ - return value->s_len; -} - - -/* initialize the strings subsystem */ -void -dc_string_init DC_DECLVOID() -{ - /* nothing to do for this implementation */ -} diff --git a/contrib/bc/doc/Makefile.am b/contrib/bc/doc/Makefile.am deleted file mode 100644 index a729cee7a521..000000000000 --- a/contrib/bc/doc/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -## Process this file with automake to produce Makefile.in - -info_TEXINFOS = bc.texi dc.texi -MAKEINFO = makeinfo --no-split - -MAINTAINERCLEANFILES = Makefile.in - -# FIXME: remove this when automake has been fixed to include these -# files automatically -EXTRA_DIST = bc.1 dc.1 - -man_MANS = bc.1 dc.1 diff --git a/contrib/bc/doc/Makefile.in b/contrib/bc/doc/Makefile.in deleted file mode 100644 index 840d007c8b04..000000000000 --- a/contrib/bc/doc/Makefile.in +++ /dev/null @@ -1,355 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -info_TEXINFOS = bc.texi dc.texi -MAKEINFO = makeinfo --no-split - -MAINTAINERCLEANFILES = Makefile.in - -# FIXME: remove this when automake has been fixed to include these -# files automatically -EXTRA_DIST = bc.1 dc.1 - -man_MANS = bc.1 dc.1 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -TEXI2DVI = texi2dvi -INFO_DEPS = bc.info dc.info -DVIS = bc.dvi dc.dvi -TEXINFOS = bc.texi dc.texi -man1dir = $(mandir)/man1 -MANS = $(man_MANS) - -NROFF = nroff -DIST_COMMON = Makefile.am Makefile.in texinfo.tex - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -all: all-redirect -.SUFFIXES: -.SUFFIXES: .dvi .info .ps .texi .texinfo .txi -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -bc.info: bc.texi -bc.dvi: bc.texi - - -dc.info: dc.texi -dc.dvi: dc.texi - - -DVIPS = dvips - -.texi.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texi.dvi: - TEXINPUTS=.:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.texi: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo.dvi: - TEXINPUTS=.:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.txi.dvi: - TEXINPUTS=.:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` -.dvi.ps: - $(DVIPS) $< -o $@ - -install-info-am: $(INFO_DEPS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(infodir) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - d=$(srcdir); \ - for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ - if test -f $$d/$$ifile; then \ - echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \ - $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \ - else : ; fi; \ - done; \ - done - @$(POST_INSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\ - install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\ - done; \ - else : ; fi - -uninstall-info: - $(PRE_UNINSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - ii=yes; \ - else ii=; fi; \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - test -z "$ii" \ - || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \ - done - @$(NORMAL_UNINSTALL) - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \ - done - -dist-info: $(INFO_DEPS) - list='$(INFO_DEPS)'; \ - for base in $$list; do \ - d=$(srcdir); \ - for file in `cd $$d && eval echo $$base*`; do \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file; \ - done; \ - done - -mostlyclean-aminfo: - -rm -f bc.aux bc.cp bc.cps bc.dvi bc.fn bc.fns bc.ky bc.kys bc.ps \ - bc.log bc.pg bc.toc bc.tp bc.tps bc.vr bc.vrs bc.op bc.tr \ - bc.cv bc.cn dc.aux dc.cp dc.cps dc.dvi dc.fn dc.fns dc.ky \ - dc.kys dc.ps dc.log dc.pg dc.toc dc.tp dc.tps dc.vr dc.vrs \ - dc.op dc.tr dc.cv dc.cn - -clean-aminfo: - -distclean-aminfo: - -maintainer-clean-aminfo: - cd $(srcdir) && for i in $(INFO_DEPS); do \ - rm -f $$i; \ - if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \ - rm -f $$i-[0-9]*; \ - fi; \ - done - -install-man1: - $(mkinstalldirs) $(DESTDIR)$(man1dir) - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ - $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ - done - -uninstall-man1: - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ - rm -f $(DESTDIR)$(man1dir)/$$inst; \ - done -install-man: $(MANS) - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-man1 -uninstall-man: - @$(NORMAL_UNINSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 -tags: TAGS -TAGS: - - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = doc - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info -info-am: $(INFO_DEPS) -info: info-am -dvi-am: $(DVIS) -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: -install-exec: install-exec-am - -install-data-am: install-info-am install-man -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: uninstall-info uninstall-man -uninstall: uninstall-am -all-am: Makefile $(INFO_DEPS) $(MANS) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - $(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(mandir)/man1 - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-aminfo mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-aminfo clean-generic mostlyclean-am - -clean: clean-am - -distclean-am: distclean-aminfo distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-aminfo maintainer-clean-generic \ - distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: install-info-am uninstall-info mostlyclean-aminfo \ -distclean-aminfo clean-aminfo maintainer-clean-aminfo install-man1 \ -uninstall-man1 install-man uninstall-man tags distdir info-am info \ -dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ -install-exec install-data-am install-data install-am install \ -uninstall-am uninstall all-redirect all-am all installdirs \ -mostlyclean-generic distclean-generic clean-generic \ -maintainer-clean-generic clean mostlyclean distclean maintainer-clean - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/doc/bc.1 b/contrib/bc/doc/bc.1 deleted file mode 100644 index bb19594421f2..000000000000 --- a/contrib/bc/doc/bc.1 +++ /dev/null @@ -1,793 +0,0 @@ -.\" -.\" bc.1 - the *roff document processor source for the bc manual -.\" -.\" This file is part of GNU bc. -.\" Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. -.\" -.\" This program is free software; you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation; either version 2 of the License , or -.\" (at your option) any later version. -.\" -.\" This program is distributed in the hope that it will be useful, -.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.\" GNU General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program; see the file COPYING. If not, write to: -.\" The Free Software Foundation, Inc. -.\" 59 Temple Place, Suite 330 -.\" Boston, MA 02111 USA -.\" -.\" You may contact the author by: -.\" e-mail: philnelson@acm.org -.\" us-mail: Philip A. Nelson -.\" Computer Science Department, 9062 -.\" Western Washington University -.\" Bellingham, WA 98226-9062 -.\" -.\" $FreeBSD$ -.\" -.TH bc 1 .\" "Command Manual" v1.06 "Sept 12, 2000" -.SH NAME -bc - An arbitrary precision calculator language -.SH SYNTAX -\fBbc\fR [ \fB-hlwsqv\fR ] [long-options] [ \fI file ...\fR ] -.SH VERSION -This man page documents GNU bc version 1.06. -.SH DESCRIPTION -\fBbc\fR is a language that supports arbitrary precision numbers -with interactive execution of statements. There are some similarities -in the syntax to the C programming language. -A standard math library is available by command line option. -If requested, the math library is defined before processing any files. -\fBbc\fR starts by processing code from all the files listed -on the command line in the order listed. After all files have been -processed, \fBbc\fR reads from the standard input. All code is -executed as it is read. (If a file contains a command to halt the -processor, \fBbc\fR will never read from the standard input.) -.PP -This version of \fBbc\fR contains several extensions beyond -traditional \fBbc\fR implementations and the POSIX draft standard. -Command line options can cause these extensions to print a warning -or to be rejected. This -document describes the language accepted by this processor. -Extensions will be identified as such. -.SS OPTIONS -.IP "-h, --help" -Print the usage and exit. -.IP "-i, --interactive" -Force interactive mode. -.IP "-l, --mathlib" -Define the standard math library. -.IP "-w, --warn" -Give warnings for extensions to POSIX \fBbc\fR. -.IP "-s, --standard" -Process exactly the POSIX \fBbc\fR language. -.IP "-q, --quiet" -Do not print the normal GNU bc welcome. -.IP "-v, --version" -Print the version number and copyright and quit. -.SS NUMBERS -The most basic element in \fBbc\fR is the number. Numbers are -arbitrary precision numbers. This precision is both in the integer -part and the fractional part. All numbers are represented internally -in decimal and all computation is done in decimal. (This version -truncates results from divide and multiply operations.) There are two -attributes of numbers, the length and the scale. The length is the -total number of significant decimal digits in a number and the scale -is the total number of decimal digits after the decimal point. For -example: -.nf -.RS - .000001 has a length of 6 and scale of 6. - 1935.000 has a length of 7 and a scale of 3. -.RE -.fi -.SS VARIABLES -Numbers are stored in two types of variables, simple variables and -arrays. Both simple variables and array variables are named. Names -begin with a letter followed by any number of letters, digits and -underscores. All letters must be lower case. (Full alpha-numeric -names are an extension. In POSIX \fBbc\fR all names are a single -lower case letter.) The type of variable is clear by the context -because all array variable names will be followed by brackets ([]). -.PP -There are four special variables, \fBscale, ibase, obase,\fR and -\fBlast\fR. \fBscale\fR defines how some operations use digits after the -decimal point. The default value of \fBscale\fR is 0. \fBibase\fR -and \fBobase\fR define the conversion base for input and output -numbers. The default for both input and output is base 10. -\fBlast\fR (an extension) is a variable that has the value of the last -printed number. These will be discussed in further detail where -appropriate. All of these variables may have values assigned to them -as well as used in expressions. -.SS COMMENTS -Comments in \fBbc\fR start with the characters \fB/*\fR and end with -the characters \fB*/\fR. Comments may start anywhere and appear as a -single space in the input. (This causes comments to delimit other -input items. For example, a comment can not be found in the middle of -a variable name.) Comments include any newlines (end of line) between -the start and the end of the comment. -.PP -To support the use of scripts for \fBbc\fR, a single line comment has been -added as an extension. A single line comment starts at a \fB#\fR -character and continues to the next end of the line. The end of line -character is not part of the comment and is processed normally. -.SS EXPRESSIONS -The numbers are manipulated by expressions and statements. Since -the language was designed to be interactive, statements and expressions -are executed as soon as possible. There is no "main" program. Instead, -code is executed as it is encountered. (Functions, discussed in -detail later, are defined when encountered.) -.PP -A simple expression is just a constant. \fBbc\fR converts constants -into internal decimal numbers using the current input base, specified -by the variable \fBibase\fR. (There is an exception in functions.) -The legal values of \fBibase\fR are 2 through 16. Assigning a -value outside this range to \fBibase\fR will result in a value of 2 -or 16. Input numbers may contain the characters 0-9 and A-F. (Note: -They must be capitals. Lower case letters are variable names.) -Single digit numbers always have the value of the digit regardless of -the value of \fBibase\fR. (i.e. A = 10.) For multi-digit numbers, -\fBbc\fR changes all input digits greater or equal to ibase to the -value of \fBibase\fR-1. This makes the number \fBFFF\fR always be -the largest 3 digit number of the input base. -.PP -Full expressions are similar to many other high level languages. -Since there is only one kind of number, there are no rules for mixing -types. Instead, there are rules on the scale of expressions. Every -expression has a scale. This is derived from the scale of original -numbers, the operation performed and in many cases, the value of the -variable \fBscale\fR. Legal values of the variable \fBscale\fR are -0 to the maximum number representable by a C integer. -.PP -In the following descriptions of legal expressions, "expr" refers to a -complete expression and "var" refers to a simple or an array variable. -A simple variable is just a -.RS -\fIname\fR -.RE -and an array variable is specified as -.RS -\fIname\fR[\fIexpr\fR] -.RE -Unless specifically -mentioned the scale of the result is the maximum scale of the -expressions involved. -.IP "- expr" -The result is the negation of the expression. -.IP "++ var" -The variable is incremented by one and the new value is the result of -the expression. -.IP "-- var" -The variable -is decremented by one and the new value is the result of the -expression. -.IP "var ++" - The result of the expression is the value of -the variable and then the variable is incremented by one. -.IP "var --" -The result of the expression is the value of the variable and then -the variable is decremented by one. -.IP "expr + expr" -The result of the expression is the sum of the two expressions. -.IP "expr - expr" -The result of the expression is the difference of the two expressions. -.IP "expr * expr" -The result of the expression is the product of the two expressions. -.IP "expr / expr" -The result of the expression is the quotient of the two expressions. -The scale of the result is the value of the variable \fBscale\fR. -.IP "expr % expr" -The result of the expression is the "remainder" and it is computed in the -following way. To compute a%b, first a/b is computed to \fBscale\fR -digits. That result is used to compute a-(a/b)*b to the scale of the -maximum of \fBscale\fR+scale(b) and scale(a). If \fBscale\fR is set -to zero and both expressions are integers this expression is the -integer remainder function. -.IP "expr ^ expr" -The result of the expression is the value of the first raised to the -second. The second expression must be an integer. (If the second -expression is not an integer, a warning is generated and the -expression is truncated to get an integer value.) The scale of the -result is \fBscale\fR if the exponent is negative. If the exponent -is positive the scale of the result is the minimum of the scale of the -first expression times the value of the exponent and the maximum of -\fBscale\fR and the scale of the first expression. (e.g. scale(a^b) -= min(scale(a)*b, max( \fBscale,\fR scale(a))).) It should be noted -that expr^0 will always return the value of 1. -.IP "( expr )" -This alters the standard precedence to force the evaluation of the -expression. -.IP "var = expr" -The variable is assigned the value of the expression. -.IP "var = expr" -This is equivalent to "var = var expr" with the exception that -the "var" part is evaluated only once. This can make a difference if -"var" is an array. -.PP - Relational expressions are a special kind of expression -that always evaluate to 0 or 1, 0 if the relation is false and 1 if -the relation is true. These may appear in any legal expression. -(POSIX bc requires that relational expressions are used only in if, -while, and for statements and that only one relational test may be -done in them.) The relational operators are -.IP "expr1 < expr2" -The result is 1 if expr1 is strictly less than expr2. -.IP "expr1 <= expr2" -The result is 1 if expr1 is less than or equal to expr2. -.IP "expr1 > expr2" -The result is 1 if expr1 is strictly greater than expr2. -.IP "expr1 >= expr2" -The result is 1 if expr1 is greater than or equal to expr2. -.IP "expr1 == expr2" -The result is 1 if expr1 is equal to expr2. -.IP "expr1 != expr2" -The result is 1 if expr1 is not equal to expr2. -.PP -Boolean operations are also legal. (POSIX \fBbc\fR does NOT have -boolean operations). The result of all boolean operations are 0 and 1 -(for false and true) as in relational expressions. The boolean -operators are: -.IP "!expr" -The result is 1 if expr is 0. -.IP "expr && expr" -The result is 1 if both expressions are non-zero. -.IP "expr || expr" -The result is 1 if either expression is non-zero. -.PP -The expression precedence is as follows: (lowest to highest) -.nf -.RS -|| operator, left associative -&& operator, left associative -! operator, nonassociative -Relational operators, left associative -Assignment operator, right associative -+ and - operators, left associative -*, / and % operators, left associative -^ operator, right associative -unary - operator, nonassociative -++ and -- operators, nonassociative -.RE -.fi -.PP -This precedence was chosen so that POSIX compliant \fBbc\fR programs -will run correctly. This will cause the use of the relational and -logical operators to have some unusual behavior when used with -assignment expressions. Consider the expression: -.RS -a = 3 < 5 -.RE -.PP -Most C programmers would assume this would assign the result of "3 < -5" (the value 1) to the variable "a". What this does in \fBbc\fR is -assign the value 3 to the variable "a" and then compare 3 to 5. It is -best to use parenthesis when using relational and logical operators -with the assignment operators. -.PP -There are a few more special expressions that are provided in \fBbc\fR. -These have to do with user defined functions and standard -functions. They all appear as "\fIname\fB(\fIparameters\fB)\fR". -See the section on functions for user defined functions. The standard -functions are: -.IP "length ( expression )" -The value of the length function is the number of significant digits in the -expression. -.IP "read ( )" -The read function (an extension) will read a number from the standard -input, regardless of where the function occurs. Beware, this can -cause problems with the mixing of data and program in the standard input. -The best use for this function is in a previously written program that -needs input from the user, but never allows program code to be input -from the user. The value of the read function is the number read from -the standard input using the current value of the variable -\fBibase\fR for the conversion base. -.IP "scale ( expression )" -The value of the scale function is the number of digits after the decimal -point in the expression. -.IP "sqrt ( expression )" -The value of the sqrt function is the square root of the expression. If -the expression is negative, a run time error is generated. -.SS STATEMENTS -Statements (as in most algebraic languages) provide the sequencing of -expression evaluation. In \fBbc\fR statements are executed "as soon -as possible." Execution happens when a newline in encountered and -there is one or more complete statements. Due to this immediate -execution, newlines are very important in \fBbc\fR. In fact, both a -semicolon and a newline are used as statement separators. An -improperly placed newline will cause a syntax error. Because newlines -are statement separators, it is possible to hide a newline by using -the backslash character. The sequence "\e", where is the -newline appears to \fBbc\fR as whitespace instead of a newline. A -statement list is a series of statements separated by semicolons and -newlines. The following is a list of \fBbc\fR statements and what -they do: (Things enclosed in brackets ([]) are optional parts of the -statement.) -.IP "expression" -This statement does one of two things. If the expression starts with -" ...", it is considered to be an assignment -statement. If the expression is not an assignment statement, the -expression is evaluated and printed to the output. After the number -is printed, a newline is printed. For example, "a=1" is an assignment -statement and "(a=1)" is an expression that has an embedded -assignment. All numbers that are printed are printed in the base -specified by the variable \fBobase\fR. The legal values for \fB -obase\fR are 2 through BC_BASE_MAX. (See the section LIMITS.) For -bases 2 through 16, the usual method of writing numbers is used. For -bases greater than 16, \fBbc\fR uses a multi-character digit method -of printing the numbers where each higher base digit is printed as a -base 10 number. The multi-character digits are separated by spaces. -Each digit contains the number of characters required to represent the -base ten value of "obase-1". Since numbers are of arbitrary -precision, some numbers may not be printable on a single output line. -These long numbers will be split across lines using the "\e" as the -last character on a line. The maximum number of characters printed -per line is 70. Due to the interactive nature of \fBbc\fR, printing -a number causes the side effect of assigning the printed value to the -special variable \fBlast\fR. This allows the user to recover the -last value printed without having to retype the expression that -printed the number. Assigning to \fBlast\fR is legal and will -overwrite the last printed value with the assigned value. The newly -assigned value will remain until the next number is printed or another -value is assigned to \fBlast\fR. (Some installations may allow the -use of a single period (.) which is not part of a number as a short -hand notation for for \fBlast\fR.) -.IP "string" -The string is printed to the output. Strings start with a double quote -character and contain all characters until the next double quote character. -All characters are take literally, including any newline. No newline -character is printed after the string. -.IP "\fBprint\fR list" -The print statement (an extension) provides another method of output. -The "list" is a list of strings and expressions separated by commas. -Each string or expression is printed in the order of the list. No -terminating newline is printed. Expressions are evaluated and their -value is printed and assigned to the variable \fBlast\fR. Strings -in the print statement are printed to the output and may contain -special characters. Special characters start with the backslash -character (\e). The special characters recognized by \fBbc\fR are -"a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), -"r" (carriage return), "q" (double quote), "t" (tab), and "\e" (backslash). -Any other character following the backslash will be ignored. -.IP "{ statement_list }" -This is the compound statement. It allows multiple statements to be -grouped together for execution. -.IP "\fBif\fR ( expression ) statement1 [\fBelse\fR statement2]" -The if statement evaluates the expression and executes statement1 or -statement2 depending on the value of the expression. If the expression -is non-zero, statement1 is executed. If statement2 is present and -the value of the expression is 0, then statement2 is executed. (The -else clause is an extension.) -.IP "\fBwhile\fR ( expression ) statement" -The while statement will execute the statement while the expression -is non-zero. It evaluates the expression before each execution of -the statement. Termination of the loop is caused by a zero -expression value or the execution of a break statement. -.IP "\fBfor\fR ( [expression1] ; [expression2] ; [expression3] ) statement" -The for statement controls repeated execution of the statement. -Expression1 is evaluated before the loop. Expression2 is evaluated -before each execution of the statement. If it is non-zero, the statement -is evaluated. If it is zero, the loop is terminated. After each -execution of the statement, expression3 is evaluated before the reevaluation -of expression2. If expression1 or expression3 are missing, nothing is -evaluated at the point they would be evaluated. -If expression2 is missing, it is the same as substituting -the value 1 for expression2. (The optional expressions are an -extension. POSIX \fBbc\fR requires all three expressions.) -The following is equivalent code for the for statement: -.nf -.RS -expression1; -while (expression2) { - statement; - expression3; -} -.RE -.fi -.IP "\fBbreak\fR" -This statement causes a forced exit of the most recent enclosing while -statement or for statement. -.IP "\fBcontinue\fR" -The continue statement (an extension) causes the most recent enclosing -for statement to start the next iteration. -.IP "\fBhalt\fR" -The halt statement (an extension) is an executed statement that causes -the \fBbc\fR processor to quit only when it is executed. For example, -"if (0 == 1) halt" will not cause \fBbc\fR to terminate because the halt is -not executed. -.IP "\fBreturn\fR" -Return the value 0 from a function. (See the section on functions.) -.IP "\fBreturn\fR ( expression )" -Return the value of the expression from a function. (See the section on -functions.) As an extension, the parenthesis are not required. -.SS PSEUDO STATEMENTS -These statements are not statements in the traditional sense. They are -not executed statements. Their function is performed at "compile" time. -.IP "\fBlimits\fR" -Print the local limits enforced by the local version of \fBbc\fR. This -is an extension. -.IP "\fBquit\fR" -When the quit statement is read, the \fBbc\fR processor -is terminated, regardless of where the quit statement is found. For -example, "if (0 == 1) quit" will cause \fBbc\fR to terminate. -.IP "\fBwarranty\fR" -Print a longer warranty notice. This is an extension. -.SS FUNCTIONS -Functions provide a method of defining a computation that can be executed -later. Functions in -.B bc -always compute a value and return it to the caller. Function definitions -are "dynamic" in the sense that a function is undefined until a definition -is encountered in the input. That definition is then used until another -definition function for the same name is encountered. The new definition -then replaces the older definition. A function is defined as follows: -.nf -.RS -\fBdefine \fIname \fB( \fIparameters \fB) { \fInewline -\fI auto_list statement_list \fB}\fR -.RE -.fi -A function call is just an expression of the form -"\fIname\fB(\fIparameters\fB)\fR". -.PP -Parameters are numbers or arrays (an extension). In the function definition, -zero or more parameters are defined by listing their names separated by -commas. Numbers are only call by value parameters. Arrays are only -call by variable. Arrays are specified in the parameter definition by -the notation "\fIname\fB[]\fR". In the function call, actual parameters -are full expressions for number parameters. The same notation is used -for passing arrays as for defining array parameters. The named array is -passed by variable to the function. Since function definitions are dynamic, -parameter numbers and types are checked when a function is called. Any -mismatch in number or types of parameters will cause a runtime error. -A runtime error will also occur for the call to an undefined function. -.PP -The \fIauto_list\fR is an optional list of variables that are for -"local" use. The syntax of the auto list (if present) is "\fBauto -\fIname\fR, ... ;". (The semicolon is optional.) Each \fIname\fR is -the name of an auto variable. Arrays may be specified by using the -same notation as used in parameters. These variables have their -values pushed onto a stack at the start of the function. The -variables are then initialized to zero and used throughout the -execution of the function. At function exit, these variables are -popped so that the original value (at the time of the function call) -of these variables are restored. The parameters are really auto -variables that are initialized to a value provided in the function -call. Auto variables are different than traditional local variables -because if function A calls function B, B may access function -A's auto variables by just using the same name, unless function B has -called them auto variables. Due to the fact that auto variables and -parameters are pushed onto a stack, \fBbc\fR supports recursive functions. -.PP -The function body is a list of \fBbc\fR statements. Again, statements -are separated by semicolons or newlines. Return statements cause the -termination of a function and the return of a value. There are two -versions of the return statement. The first form, "\fBreturn\fR", returns -the value 0 to the calling expression. The second form, -"\fBreturn ( \fIexpression \fB)\fR", computes the value of the expression -and returns that value to the calling expression. There is an implied -"\fBreturn (0)\fR" at the end of every function. This allows a function -to terminate and return 0 without an explicit return statement. -.PP -Functions also change the usage of the variable \fBibase\fR. All -constants in the function body will be converted using the value of -\fBibase\fR at the time of the function call. Changes of \fBibase\fR -will be ignored during the execution of the function except for the -standard function \fBread\fR, which will always use the current value -of \fBibase\fR for conversion of numbers. -.PP -As an extension, the format of the definition has been slightly relaxed. -The standard requires the opening brace be on the same line as the -\fBdefine\fR keyword and all other parts must be on following lines. -This version of \fBbc\fR will allow any number of newlines before and -after the opening brace of the function. For example, the following -definitions are legal. -.nf -.RS -\f(CW -define d (n) { return (2*n); } -define d (n) - { return (2*n); } -\fR -.RE -.fi -.SS MATH LIBRARY -If \fBbc\fR is invoked with the \fB-l\fR option, a math library is preloaded -and the default scale is set to 20. The math functions will calculate their -results to the scale set at the time of their call. -The math library defines the following functions: -.IP "s (\fIx\fR)" -The sine of x, x is in radians. -.IP "c (\fIx\fR)" -The cosine of x, x is in radians. -.IP "a (\fIx\fR)" -The arctangent of x, arctangent returns radians. -.IP "l (\fIx\fR)" -The natural logarithm of x. -.IP "e (\fIx\fR)" -The exponential function of raising e to the value x. -.IP "j (\fIn,x\fR)" -The bessel function of integer order n of x. -.SS EXAMPLES -In /bin/sh, the following will assign the value of "pi" to the shell -variable \fBpi\fR. -.RS -\f(CW -pi=$(echo "scale=10; 4*a(1)" | bc -l) -\fR -.RE -.PP -The following is the definition of the exponential function used in the -math library. This function is written in POSIX \fBbc\fR. -.nf -.RS -\f(CW -scale = 20 - -/* Uses the fact that e^x = (e^(x/2))^2 - When x is small enough, we use the series: - e^x = 1 + x + x^2/2! + x^3/3! + ... -*/ - -define e(x) { - auto a, d, e, f, i, m, v, z - - /* Check the sign of x. */ - if (x<0) { - m = 1 - x = -x - } - - /* Precondition x. */ - z = scale; - scale = 4 + z + .44*x; - while (x > 1) { - f += 1; - x /= 2; - } - - /* Initialize the variables. */ - v = 1+x - a = x - d = 1 - - for (i=2; 1; i++) { - e = (a *= x) / (d *= i) - if (e == 0) { - if (f>0) while (f--) v = v*v; - scale = z - if (m) return (1/v); - return (v/1); - } - v += e - } -} -\fR -.RE -.fi -.PP -The following is code that uses the extended features of \fBbc\fR to -implement a simple program for calculating checkbook balances. This -program is best kept in a file so that it can be used many times -without having to retype it at every use. -.nf -.RS -\f(CW -scale=2 -print "\enCheck book program!\en" -print " Remember, deposits are negative transactions.\en" -print " Exit by a 0 transaction.\en\en" - -print "Initial balance? "; bal = read() -bal /= 1 -print "\en" -while (1) { - "current balance = "; bal - "transaction? "; trans = read() - if (trans == 0) break; - bal -= trans - bal /= 1 -} -quit -\fR -.RE -.fi -.PP -The following is the definition of the recursive factorial function. -.nf -.RS -\f(CW -define f (x) { - if (x <= 1) return (1); - return (f(x-1) * x); -} -\fR -.RE -.fi -.SS READLINE AND LIBEDIT OPTIONS -GNU \fBbc\fR can be compiled (via a configure option) to use the GNU -\fBreadline\fR input editor library or the BSD \fBlibedit\fR library. -This allows the user to do editing of lines before sending them -to \fBbc\fR. It also allows for a history of previous lines typed. -When this option is selected, \fBbc\fR has one more special variable. -This special variable, \fBhistory\fR is the number of lines of history -retained. For \fBreadline\fR, a value of -1 means that an unlimited -number of history lines are retained. Setting the value of -\fBhistory\fR to a positive number restricts the number of history -lines to the number given. The value of 0 disables the history -feature. The default value is 100. For more information, read the -user manuals for the GNU \fBreadline\fR, \fBhistory\fR and BSD \fBlibedit\fR -libraries. One can not enable both \fBreadline\fR and \fBlibedit\fR -at the same time. -.SS DIFFERENCES -This version of -.B bc -was implemented from the POSIX P1003.2/D11 draft and contains -several differences and extensions relative to the draft and -traditional implementations. -It is not implemented in the traditional way using -.I dc(1). -This version is a single process which parses and runs a byte code -translation of the program. There is an "undocumented" option (-c) -that causes the program to output the byte code to -the standard output instead of running it. It was mainly used for -debugging the parser and preparing the math library. -.PP -A major source of differences is -extensions, where a feature is extended to add more functionality and -additions, where new features are added. -The following is the list of differences and extensions. -.IP "LANG environment" -This version does not conform to the POSIX standard in the processing -of the LANG environment variable and all environment variables starting -with LC_. -.IP names -Traditional and POSIX -.B bc -have single letter names for functions, variables and arrays. They have -been extended to be multi-character names that start with a letter and -may contain letters, numbers and the underscore character. -.IP Strings -Strings are not allowed to contain NUL characters. POSIX says all characters -must be included in strings. -.IP last -POSIX \fBbc\fR does not have a \fBlast\fR variable. Some implementations -of \fBbc\fR use the period (.) in a similar way. -.IP comparisons -POSIX \fBbc\fR allows comparisons only in the if statement, the while -statement, and the second expression of the for statement. Also, only -one relational operation is allowed in each of those statements. -.IP "if statement, else clause" -POSIX \fBbc\fR does not have an else clause. -.IP "for statement" -POSIX \fBbc\fR requires all expressions to be present in the for statement. -.IP "&&, ||, !" -POSIX \fBbc\fR does not have the logical operators. -.IP "read function" -POSIX \fBbc\fR does not have a read function. -.IP "print statement" -POSIX \fBbc\fR does not have a print statement . -.IP "continue statement" -POSIX \fBbc\fR does not have a continue statement. -.IP "return statement" -POSIX \fBbc\fR requires parentheses around the return expression. -.IP "array parameters" -POSIX \fBbc\fR does not (currently) support array parameters in full. -The POSIX grammar allows for arrays in function definitions, but does -not provide a method to specify an array as an actual parameter. (This -is most likely an oversight in the grammar.) Traditional implementations -of \fBbc\fR have only call by value array parameters. -.IP "function format" -POSIX \fBbc\fR requires the opening brace on the same line as the -\fBdefine\fR key word and the \fBauto\fR statement on the next line. -.IP "=+, =-, =*, =/, =%, =^" -POSIX \fBbc\fR does not require these "old style" assignment operators to -be defined. This version may allow these "old style" assignments. Use -the limits statement to see if the installed version supports them. If -it does support the "old style" assignment operators, the statement -"a =- 1" will decrement \fBa\fR by 1 instead of setting \fBa\fR to the -value -1. -.IP "spaces in numbers" -Other implementations of \fBbc\fR allow spaces in numbers. For example, -"x=1 3" would assign the value 13 to the variable x. The same statement -would cause a syntax error in this version of \fBbc\fR. -.IP "errors and execution" -This implementation varies from other implementations in terms of what -code will be executed when syntax and other errors are found in the -program. If a syntax error is found in a function definition, error -recovery tries to find the beginning of a statement and continue to -parse the function. Once a syntax error is found in the function, the -function will not be callable and becomes undefined. -Syntax errors in the interactive execution code will invalidate the -current execution block. The execution block is terminated by an -end of line that appears after a complete sequence of statements. -For example, -.nf -.RS -a = 1 -b = 2 -.RE -.fi -has two execution blocks and -.nf -.RS -{ a = 1 - b = 2 } -.RE -.fi -has one execution block. Any runtime error will terminate the execution -of the current execution block. A runtime warning will not terminate the -current execution block. -.IP "Interrupts" -During an interactive session, the SIGINT signal (usually generated by -the control-C character from the terminal) will cause execution of the -current execution block to be interrupted. It will display a "runtime" -error indicating which function was interrupted. After all runtime -structures have been cleaned up, a message will be printed to notify the -user that \fBbc\fR is ready for more input. All previously defined functions -remain defined and the value of all non-auto variables are the value at -the point of interruption. All auto variables and function parameters -are removed during the -clean up process. During a non-interactive -session, the SIGINT signal will terminate the entire run of \fBbc\fR. -.SS LIMITS -The following are the limits currently in place for this -.B bc -processor. Some of them may have been changed by an installation. -Use the limits statement to see the actual values. -.IP BC_BASE_MAX -The maximum output base is currently set at 999. The maximum input base -is 16. -.IP BC_DIM_MAX -This is currently an arbitrary limit of 65535 as distributed. Your -installation may be different. -.IP BC_SCALE_MAX -The number of digits after the decimal point is limited to INT_MAX digits. -Also, the number of digits before the decimal point is limited to INT_MAX -digits. -.IP BC_STRING_MAX -The limit on the number of characters in a string is INT_MAX characters. -.IP exponent -The value of the exponent in the raise operation (^) is limited to LONG_MAX. -.IP "variable names" -The current limit on the number of unique names is 32767 for each of -simple variables, arrays and functions. -.SH ENVIRONMENT -The following environment variables are processed by \fBbc\fR: -.IP "POSIXLY_CORRECT" -This is the same as the \fB-s\fR option. -.IP "BC_ENV_ARGS" -This is another mechanism to get arguments to \fBbc\fR. The -format is the same as the command line arguments. These arguments -are processed first, so any files listed in the environment arguments -are processed before any command line argument files. This allows -the user to set up "standard" options and files to be processed -at every invocation of \fBbc\fR. The files in the environment -variables would typically contain function definitions for functions -the user wants defined every time \fBbc\fR is run. -.IP "BC_LINE_LENGTH" -This should be an integer specifying the number of characters in an -output line for numbers. This includes the backslash and newline characters -for long numbers. -.SH DIAGNOSTICS -If any file on the command line can not be opened, \fBbc\fR will report -that the file is unavailable and terminate. Also, there are compile -and run time diagnostics that should be self-explanatory. -.SH BUGS -Error recovery is not very good yet. -.PP -Email bug reports to -.BR bug-bc@gnu.org . -Be sure to include the word ``bc'' somewhere in the ``Subject:'' field. -.SH AUTHOR -.nf -Philip A. Nelson -philnelson@acm.org -.fi -.SH ACKNOWLEDGEMENTS -The author would like to thank Steve Sommars (Steve.Sommars@att.com) for -his extensive help in testing the implementation. Many great suggestions -were given. This is a much better product due to his involvement. diff --git a/contrib/bc/doc/bc.texi b/contrib/bc/doc/bc.texi deleted file mode 100644 index a7cb9f667644..000000000000 --- a/contrib/bc/doc/bc.texi +++ /dev/null @@ -1,1014 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename bc.info -@settitle bc Command Manual -@c %**end of header - -@c This file has the new style title page commands. -@c Run `makeinfo' rather than `texinfo-format-buffer'. - -@smallbook - -@c tex -@c \overfullrule=0pt -@c end tex - -@titlepage -@title @command{bc} -@subtitle an arbitrary precision calculator language -@subtitle version 1.06 - -@author Philip A. Nelson -@page - -This manual documents @command{bc}, an arbitrary precision calculator language. - -This manual is part of GNU @command{bc}.@* -@sp4 -Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@iftex -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). -@end iftex - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. - -You may contact the author by: -e-mail: @email{phil@@cs.wwu.edu}@* -us-mail: Philip A. Nelson@* -Computer Science Department, 9062@* -Western Washington University@* -Bellingham, WA 98226-9062 - -@end titlepage - -@node Top, Introduction, (dir), (dir) - -@menu -* Introduction:: -* Basic Elements:: -* Expressions:: -* Statements:: -* Functions:: -* Examples:: -* Readline and Libedit Options:: -* GNU @command{bc} and Other Implementations:: -* Limits:: -* Environment Variables:: -@end menu - -@node Introduction, Basic Elements, Top, Top -@chapter Introduction -@menu -* Description:: -* Command Line Options:: -@end menu - -@node Description, Command Line Options, Introduction, Introduction -@section Description - -@command{bc} [ -hlwsqv ] [long-options] [ @var{ file ...} ] - -@command{bc} is a language that supports arbitrary precision numbers -with interactive execution of statements. There are some similarities -in the syntax to the C programming language. -A standard math library is available by command line option. -If requested, the math library is defined before processing any files. -@command{bc} starts by processing code from all the files listed -on the command line in the order listed. After all files have been -processed, @command{bc} reads from the standard input. All code is -executed as it is read. (If a file contains a command to halt the -processor, @command{bc} will never read from the standard input.) - -This version of @command{bc} contains several extensions beyond -traditional @command{bc} implementations and the POSIX draft standard. -Command line options can cause these extensions to print a warning or to -be rejected. This document describes the language accepted by this -processor. Extensions will be identified as such. - -The author would like to thank Steve Sommars -(@email{Steve.Sommars@@att.com}) for his extensive help in testing the -implementation. Many great suggestions were given. This is a much -better product due to his involvement. - -Email bug reports to @email{bug-bc@@gnu.org}. Be sure to include -the word ``bc'' somewhere in the ``Subject:'' field. - -@node Command Line Options, Numbers, Description, Introduction -@section Command Line Options - -@command{bc} takes the following options from the command line: -@table @code - -@item -h, --help -Print the usage and exit. - -@item -l, --mathlib -Define the standard math library. - -@item -w, --warn -Give warnings for extensions to POSIX @command{bc}. - -@item -s, --standard -Process exactly the POSIX @command{bc} language. - -@item -q, --quiet -Do not print the normal GNU @command{bc} welcome. - -@item -v, --version -Print the version number and copyright and quit. - -@end table - - -@node Basic Elements, Expressions, Introduction, Top -@chapter Basic Elements -@menu -* Numbers:: -* Variables:: -* Comments:: -@end menu - -@node Numbers, Variables, Command Line Options, Basic Elements -@section Numbers - -The most basic element in @command{bc} is the number. Numbers are -arbitrary precision numbers. This precision is both in the integer part -and the fractional part. All numbers are represented internally in -decimal and all computation is done in decimal. (This version truncates -results from divide and multiply operations.) There are two attributes -of numbers, the length and the scale. The length is the total number of -significant decimal digits in a number and the scale is the total number -of decimal digits after the decimal point. For example, .000001 has a -length of 6 and scale of 6, while 1935.000 has a length of 7 and a scale -of 3. - -@node Variables, Comments, Numbers, Basic Elements -@section Variables - -Numbers are stored in two types of variables, simple variables and -arrays. Both simple variables and array variables are named. Names -begin with a letter followed by any number of letters, digits and -underscores. All letters must be lower case. (Full alphanumeric -names are an extension. In POSIX @command{bc} all names are a single -lower case letter.) The type of variable is clear by the context -because all array variable names will be followed by brackets ( [ ] ). - -There are four special variables, @var{scale}, @var{ibase}, @var{obase}, and -@var{last}. @var{scale} defines how some operations use digits after the -decimal point. The default value of @var{scale} is 0. @var{ibase} -and @var{obase} define the conversion base for input and output -numbers. The default for both input and output is base 10. -@var{last} (an extension) is a variable that has the value of the last -printed number. These will be discussed in further detail where -appropriate. All of these variables may have values assigned to them -as well as used in expressions. - -@node Comments, , Variables, Basic Elements -@section Comments - -Comments in @command{bc} start with the characters @code{/*} and end with -the characters @code{*/}. Comments may start anywhere and appear as a -single space in the input. (This causes comments to delimit other -input items. For example, a comment can not be found in the middle of -a variable name.) Comments include any newlines (end of line) between -the start and the end of the comment. - -To support the use of scripts for @command{bc}, a single line comment has been -added as an extension. A single line comment starts at a @code{#} -character and continues to the next end of the line. The end of line -character is not part of the comment and is processed normally. - -@node Expressions, Statements, Basic Elements, Top -@chapter Expressions - -@menu -* About Expressions and Special Variables:: -* Basic Expressions:: -* Relational Expressions:: -* Boolean Expressions:: -* Precedence:: -* Special Expressions:: -@end menu - -@node About Expressions and Special Variables, Basic Expressions, Expressions, Expressions -@section About Expressions and Special Variables - -The numbers are manipulated by expressions and statements. Since -the language was designed to be interactive, statements and expressions -are executed as soon as possible. There is no main program. Instead, -code is executed as it is encountered. (Functions, discussed in -detail later, are defined when encountered.) - -A simple expression is just a constant. @command{bc} converts constants -into internal decimal numbers using the current input base, specified by -the variable @var{ibase}. (There is an exception in functions.) The -legal values of @var{ibase} are 2 through 16. Assigning a value outside -this range to @var{ibase} will result in a value of 2 or 16. Input -numbers may contain the characters 0-9 and A-F. (Note: They must be -capitals. Lower case letters are variable names.) Single digit numbers -always have the value of the digit regardless of the value of -@var{ibase}. (i.e. A = 10.) For multi-digit numbers, @command{bc} -changes all input digits greater or equal to @var{ibase} to the value of -@var{ibase}-1. This makes the number @code{FFF} always be the largest -3 digit number of the input base. - -Full expressions are similar to many other high level languages. -Since there is only one kind of number, there are no rules for mixing -types. Instead, there are rules on the scale of expressions. Every -expression has a scale. This is derived from the scale of original -numbers, the operation performed and in many cases, the value of the -variable @var{scale}. Legal values of the variable @var{scale} are -0 to the maximum number representable by a C integer. - -@node Basic Expressions, Relational Expressions, About Expressions and Special Variables, Expressions -@section Basic Expressions - -In the following descriptions of legal expressions, "expr" refers to a -complete expression and "@var{var}" refers to a simple or an array variable. -A simple variable is just a - -@var{name} - -and an array variable is specified as - -@var{name}[@var{expr}] - -Unless specifically mentioned the scale of the result is the maximum -scale of the expressions involved. - -@table @code -@item - expr -The result is the negation of the expression. - -@item ++ @var{var} -The variable is incremented by one and the new value is the result of -the expression. - -@item -- @var{var} -The variable -is decremented by one and the new value is the result of the -expression. - -@item @var{var} ++ - The result of the expression is the value of -the variable and then the variable is incremented by one. - -@item @var{var} -- -The result of the expression is the value of the variable and then -the variable is decremented by one. - -@item expr + expr -The result of the expression is the sum of the two expressions. - -@item expr - expr -The result of the expression is the difference of the two expressions. - -@item expr * expr -The result of the expression is the product of the two expressions. - -@item expr / expr -The result of the expression is the quotient of the two expressions. -The scale of the result is the value of the variable @code{scale} - -@item expr % expr -The result of the expression is the "remainder" and it is computed in the -following way. To compute a%b, first a/b is computed to @var{scale} -digits. That result is used to compute a-(a/b)*b to the scale of the -maximum of @var{scale}+scale(b) and scale(a). If @var{scale} is set -to zero and both expressions are integers this expression is the -integer remainder function. - -@item expr ^ expr -The result of the expression is the value of the first raised to the -second. The second expression must be an integer. (If the second -expression is not an integer, a warning is generated and the -expression is truncated to get an integer value.) The scale of the -result is @var{scale} if the exponent is negative. If the exponent -is positive the scale of the result is the minimum of the scale of the -first expression times the value of the exponent and the maximum of -@var{scale} and the scale of the first expression. (e.g. scale(a^b) -= min(scale(a)*b, max(@var{scale}, scale(a))).) It should be noted -that expr^0 will always return the value of 1. - -@item ( expr ) -This alters the standard precedence to force the evaluation of the -expression. - -@item @var{var} = expr -The variable is assigned the value of the expression. - -@item @var{var} = expr -This is equivalent to "@var{var} = @var{var} expr" with the -exception that the "@var{var}" part is evaluated only once. This can -make a difference if "@var{var}" is an array. -@end table - -@node Relational Expressions, Boolean Expressions, Basic Expressions, Expressions -@section Relational Expressions - -Relational expressions are a special kind of expression that always -evaluate to 0 or 1, 0 if the relation is false and 1 if the relation is -true. These may appear in any legal expression. (POSIX @command{bc} -requires that relational expressions are used only in @code{if}, -@code{while}, and @code{for} statements and that only one relational -test may be done in them.) The relational operators are - -@table @code -@item expr1 < expr2 -The result is 1 if expr1 is strictly less than expr2. - -@item expr1 <= expr2 -The result is 1 if expr1 is less than or equal to expr2. - -@item expr1 > expr2 -The result is 1 if expr1 is strictly greater than expr2. - -@item expr1 >= expr2 -The result is 1 if expr1 is greater than or equal to expr2. - -@item expr1 == expr2 -The result is 1 if expr1 is equal to expr2. - -@item expr1 != expr2 -The result is 1 if expr1 is not equal to expr2. -@end table - -@node Boolean Expressions, Precedence, Relational Expressions, Expressions -@section Boolean Expressions - -Boolean operations are also legal. (POSIX @command{bc} does NOT have -boolean operations). The result of all boolean operations are 0 and 1 -(for false and true) as in relational expressions. The boolean -operators are: - -@table @code -@item !expr -The result is 1 if expr is 0. - -@item expr && expr -The result is 1 if both expressions are non-zero. - -@item expr || expr -The result is 1 if either expression is non-zero. -@end table - -@node Precedence, Special Expressions, Boolean Expressions, Expressions -@section Precedence - -The expression precedence is as follows: (lowest to highest) - -@example -|| operator, left associative -&& operator, left associative -! operator, nonassociative -Relational operators, left associative -Assignment operator, right associative -+ and - operators, left associative -*, / and % operators, left associative -^ operator, right associative -unary - operator, nonassociative -++ and -- operators, nonassociative -@end example - -This precedence was chosen so that POSIX compliant @command{bc} programs -will run correctly. This will cause the use of the relational and -logical operators to have some unusual behavior when used with -assignment expressions. Consider the expression: - -@example -a = 3 < 5 -@end example - -Most C programmers would assume this would assign the result of "3 < -5" (the value 1) to the variable "a". What this does in @command{bc} is -assign the value 3 to the variable "a" and then compare 3 to 5. It is -best to use parentheses when using relational and logical operators -with the assignment operators. - -@node Special Expressions, , Precedence, Expressions -@section Special Expressions - -There are a few more special expressions that are provided in -@command{bc}. These have to do with user-defined functions and standard -functions. They all appear as -"@var{name}@code{(}@var{parameters}@code{)}". @xref{Functions}, for -user-defined functions. The standard functions are: - -@table @code -@item length ( expression ) -The value of the length function is the number of significant digits in the -expression. - -@item read ( ) -The @code{read} function (an extension) will read a number from the -standard input, regardless of where the function occurs. Beware, this -can cause problems with the mixing of data and program in the standard -input. The best use for this function is in a previously written -program that needs input from the user, but never allows program code to -be input from the user. The value of the @code{read} function is the -number read from the standard input using the current value of the -variable @var{ibase} for the conversion base. - -@item scale ( expression ) -The value of the @code{scale} function is the number of digits after the -decimal point in the expression. - -@item sqrt ( expression ) -The value of the @code{sqrt} function is the square root of the -expression. If the expression is negative, a run time error is -generated. -@end table - -@node Statements, Functions, Expressions, Top -@chapter Statements - -@menu -* Pseudo Statements:: -@end menu - -Statements (as in most algebraic languages) provide the sequencing of -expression evaluation. In @command{bc} statements are executed "as soon -as possible." Execution happens when a newline in encountered and there -is one or more complete statements. Due to this immediate execution, -newlines are very important in @command{bc}. In fact, both a semicolon -and a newline are used as statement separators. An improperly placed -newline will cause a syntax error. Because newlines are statement -separators, it is possible to hide a newline by using the backslash -character. The sequence "\", where is the newline appears to -@command{bc} as whitespace instead of a newline. A statement list is a -series of statements separated by semicolons and newlines. The -following is a list of @command{bc} statements and what they do: (Things -enclosed in brackets ( [ ] ) are optional parts of the statement.) - -@table @var -@item expression -This statement does one of two things. If the expression starts with -" ...", it is considered to be an assignment -statement. If the expression is not an assignment statement, the -expression is evaluated and printed to the output. After the number is -printed, a newline is printed. For example, "a=1" is an assignment -statement and "(a=1)" is an expression that has an embedded assignment. -All numbers that are printed are printed in the base specified by the -variable @var{obase}. The legal values for @var{obase} are 2 through -BC_BASE_MAX (@pxref{Environment Variables}). For bases 2 through 16, -the usual method of writing numbers is used. For bases greater than 16, -@command{bc} uses a multi-character digit method of printing the numbers -where each higher base digit is printed as a base 10 number. The -multi-character digits are separated by spaces. Each digit contains the -number of characters required to represent the base ten value of -"@var{obase} -1". Since numbers are of arbitrary precision, some -numbers may not be printable on a single output line. These long -numbers will be split across lines using the "\" as the last character -on a line. The maximum number of characters printed per line is 70. -Due to the interactive nature of @command{bc}, printing a number causes -the side effect of assigning the printed value to the special variable -@var{last}. This allows the user to recover the last value printed -without having to retype the expression that printed the number. -Assigning to @var{last} is legal and will overwrite the last printed -value with the assigned value. The newly assigned value will remain -until the next number is printed or another value is assigned to -@var{last}. (Some installations may allow the use of a single period -(.) which is not part of a number as a short hand notation for for -@var{last}.) - -@item string -The string is printed to the output. Strings start with a double quote -character and contain all characters until the next double quote character. -All characters are taken literally, including any newline. No newline -character is printed after the string. - -@item @code{print} @var{list} -The @code{print} statement (an extension) provides another method of -output. The @var{list} is a list of strings and expressions separated by -commas. Each string or expression is printed in the order of the list. -No terminating newline is printed. Expressions are evaluated and their -value is printed and assigned to the variable @code{last}. Strings in -the print statement are printed to the output and may contain special -characters. Special characters start with the backslash character (\e). -The special characters recognized by @command{bc} are "a" (alert or -bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage -return), "q" (double quote), "t" (tab), and "\e" (backslash). Any other -character following the backslash will be ignored. - -@item @{ statement_list @} -This is the compound statement. It allows multiple statements to be -grouped together for execution. - -@item @code{if} ( expression ) statement1 [@code{else} statement2] -The if statement evaluates the expression and executes statement1 or -statement2 depending on the value of the expression. If the expression -is non-zero, statement1 is executed. If statement2 is present and -the value of the expression is 0, then statement2 is executed. (The -@code{else} clause is an extension.) - -@item @code{while} ( expression ) statement -The while statement will execute the statement while the expression -is non-zero. It evaluates the expression before each execution of -the statement. Termination of the loop is caused by a zero -expression value or the execution of a @code{break} statement. - -@item @code{for} ( [expression1] ; [expression2] ; [expression3] ) statement -The @code{for} statement controls repeated execution of the statement. -@var{Expression1} is evaluated before the loop. @var{Expression2} is -evaluated before each execution of the statement. If it is non-zero, -the statement is evaluated. If it is zero, the loop is terminated. -After each execution of the statement, @var{expression3} is evaluated -before the reevaluation of expression2. If @var{expression1} or -@var{expression3} are missing, nothing is evaluated at the point they -would be evaluated. If @var{expression2} is missing, it is the same as -substituting the value 1 for @var{expression2}. (The optional -expressions are an extension. POSIX @command{bc} requires all three -expressions.) The following is equivalent code for the @code{for} -statement: - -@example -expression1; -while (expression2) @{ - statement; - expression3; -@} -@end example - -@item @code{break} -This statement causes a forced exit of the most recent enclosing @code{while} -statement or @code{for} statement. - -@item @code{continue} -The @code{continue} statement (an extension) causes the most recent enclosing -@code{for} statement to start the next iteration. - -@item @code{halt} -The @code{halt} statement (an extension) is an executed statement that -causes the @command{bc} processor to quit only when it is executed. For -example, "if (0 == 1) halt" will not cause @command{bc} to terminate -because the @code{halt} is not executed. - -@item @code{return} -Return the value 0 from a function. (@xref{Functions}.) - -@item @code{return} ( expression ) -Return the value of the expression from a function. (@xref{Functions}.) -As an extension, the parenthesis are not required. -@end table - -@node Pseudo Statements, , Statements, Statements -@section Pseudo Statements - -These statements are not statements in the traditional sense. They are -not executed statements. Their function is performed at "compile" time. - -@table @code -@item limits -Print the local limits enforced by the local version of @command{bc}. This -is an extension. - -@item quit -When the @code{quit} statement is read, the @command{bc} processor -is terminated, regardless of where the @code{quit} statement is found. For -example, "if (0 == 1) quit" will cause @command{bc} to terminate. - -@item warranty -Print a longer warranty notice. This is an extension. -@end table - -@node Functions, Examples, Statements, Top -@chapter Functions - -@menu -* Math Library Functions:: -@end menu - -Functions provide a method of defining a computation that can be -executed later. Functions in @command{bc} always compute a value and -return it to the caller. Function definitions are "dynamic" in the -sense that a function is undefined until a definition is encountered in -the input. That definition is then used until another definition -function for the same name is encountered. The new definition then -replaces the older definition. A function is defined as follows: - -@example -@code{define} @var{name} @code{(} @var{parameters} @code{)} @code{@{} @var{newline} - @var{auto_list statement_list} @code{@}} -@end example - -A function call is just an expression of the form -"@code{name} @code{(}@var{parameters}@code{)}". - -Parameters are numbers or arrays (an extension). In the function definition, -zero or more parameters are defined by listing their names separated by -commas. Numbers are only call by value parameters. Arrays are only -call by variable. Arrays are specified in the parameter definition by -the notation "@var{name}@code{[ ]}". In the function call, actual parameters -are full expressions for number parameters. The same notation is used -for passing arrays as for defining array parameters. The named array is -passed by variable to the function. Since function definitions are dynamic, -parameter numbers and types are checked when a function is called. Any -mismatch in number or types of parameters will cause a runtime error. -A runtime error will also occur for the call to an undefined function. - -The @var{auto_list} is an optional list of variables that are for -"local" use. The syntax of the auto list (if present) is "@code{auto} -@var{name}, ... ;". (The semicolon is optional.) Each @var{name} is -the name of an auto variable. Arrays may be specified by using the -same notation as used in parameters. These variables have their -values pushed onto a stack at the start of the function. The -variables are then initialized to zero and used throughout the -execution of the function. At function exit, these variables are -popped so that the original value (at the time of the function call) -of these variables are restored. The parameters are really auto -variables that are initialized to a value provided in the function -call. -Auto variables are different than traditional local variables -because if function A calls function B, B may access function -A's auto variables by just using the same name, unless function B has -called them auto variables. Due to the fact that auto variables and -parameters are pushed onto a stack, @command{bc} supports recursive functions. - -The function body is a list of @command{bc} statements. Again, statements -are separated by semicolons or newlines. Return statements cause the -termination of a function and the return of a value. There are two -versions of the return statement. The first form, "@code{return}", returns -the value 0 to the calling expression. The second form, -"@code{return} ( @var{expression} )", computes the value of the expression -and returns that value to the calling expression. There is an implied -"@code{return} (0)" at the end of every function. This allows a function -to terminate and return 0 without an explicit @code{return} statement. - -Functions also change the usage of the variable @var{ibase}. All -constants in the function body will be converted using the value of -@var{ibase} at the time of the function call. Changes of @var{ibase} -will be ignored during the execution of the function except for the -standard function @code{read}, which will always use the current value -of @var{ibase} for conversion of numbers. - -As an extension, the format of the definition has been slightly relaxed. -The standard requires the opening brace be on the same line as the -@code{define} keyword and all other parts must be on following lines. -This version of @command{bc} will allow any number of newlines before and -after the opening brace of the function. For example, the following -definitions are legal. - -@example - define d (n) @{ return (2*n); @} - define d (n) - @{ return (2*n); @} -@end example - - -@node Math Library Functions, , Functions, Functions -@section Math Library Functions - -If @command{bc} is invoked with the @code{-l} option, a math library is -preloaded and the default @var{scale} is set to 20. The math functions will -calculate their results to the scale set at the time of their call. The -math library defines the following functions: - -@table @code -@item s (@var{x}) -The sine of @var{x}, @var{x} is in radians. - -@item c (@var{x}) -The cosine of @var{x}, @var{x} is in radians. - -@item a (@var{x}) -The arctangent of @var{x}, arctangent returns radians. - -@item l (@var{x}) -The natural logarithm of @var{x}. - -@item @var{e} (@var{x}) -The exponential function of raising @var{e} to the value @var{x}. - -@item @var{j} (@var{n,x}) -The bessel function of integer order @var{n} of @var{x}. -@end table - -@node Examples, Readline and Libedit Options, Functions, Top -@chapter Examples - -In /bin/sh, the following will assign the value of "pi" to the shell -variable @var{pi}. -@example - -pi=$(echo "scale=10; 4*a(1)" | bc -l) - -@end example - -The following is the definition of the exponential function used in the -math library. This function is written in POSIX @command{bc}. - -@example - -scale = 20 - -/* Uses the fact that e^x = (e^(x/2))^2 - When x is small enough, we use the series: - e^x = 1 + x + x^2/2! + x^3/3! + ... -*/ - -define e(x) @{ - auto a, d, e, f, i, m, v, z - - /* Check the sign of x. */ - if (x<0) @{ - m = 1 - x = -x - @} - - /* Precondition x. */ - z = scale; - scale = 4 + z + .44*x; - while (x > 1) @{ - f += 1; - x /= 2; - @} - - /* Initialize the variables. */ - v = 1+x - a = x - d = 1 - - for (i=2; 1; i++) @{ - e = (a *= x) / (d *= i) - if (e == 0) @{ - if (f>0) while (f--) v = v*v; - scale = z - if (m) return (1/v); - return (v/1); - @} - v += e - @} -@} - -@end example - -The following is code that uses the extended features of @command{bc} to -implement a simple program for calculating checkbook balances. This -program is best kept in a file so that it can be used many times -without having to retype it at every use. - -@example - -scale=2 -print "\nCheck book program\n!" -print " Remember, deposits are negative transactions.\n" -print " Exit by a 0 transaction.\n\n" - -print "Initial balance? "; bal = read() -bal /= 1 -print "\n" -while (1) @{ - "current balance = "; bal - "transaction? "; trans = read() - if (trans == 0) break; - bal -= trans - bal /= 1 -@} -quit - -@end example - - -The following is the definition of the recursive factorial function. - -@example - -define f (x) @{ - if (x <= 1) return (1); - return (f(x-1) * x); -@} - -@end example - -@node Readline and Libedit Options, GNU @command{bc} and Other Implementations, Examples, Top -@chapter Readline and Libedit Options - -GNU @command{bc} can be compiled (via a configure option) to use the GNU -@command{readline} input editor library or the BSD @command{libedit} -library. This allows the user to do -more editing of lines before sending them to @command{bc}. It also -allows for a history of previous lines typed. When this option is -selected, @command{bc} has one more special variable. This special -variable, @var{history} is the number of lines of history retained. A -value of -1 means that an unlimited number of history lines are -retained. This is the default value. Setting the value of -@var{history} to a positive number restricts the number of history lines -to the number given. The value of 0 disables the history feature. For -more information, read the user manuals for the GNU @command{readline}, -@command{history} and BSD @command{libedit} libraries. One can not -enable both @command{readline} and @command{libedit} at the same time. - -@node GNU @command{bc} and Other Implementations, Limits, Readline and Libedit Options, Top -@chapter GNU @command{bc} and Other Implementations - -This version of @command{bc} was implemented from the POSIX P1003.2/D11 -draft and contains several differences and extensions relative to the -draft and traditional implementations. It is not implemented in the -traditional way using @command{dc}. This version is a single process -which parses and runs a byte code translation of the program. There is -an "undocumented" option (-c) that causes the program to output the byte -code to the standard output instead of running it. It was mainly used -for debugging the parser and preparing the math library. - -A major source of differences is extensions, where a feature is extended -to add more functionality and additions, where new features are added. -The following is the list of differences and extensions. - -@table @var - -@item LANG environment -This version does not conform to the POSIX standard in the processing -of the LANG environment variable and all environment variables starting -with LC_. - -@item names -Traditional and POSIX @command{bc} -have single letter names for functions, variables and arrays. They have -been extended to be multi-character names that start with a letter and -may contain letters, numbers and the underscore character. - -@item Strings -Strings are not allowed to contain NUL characters. POSIX says all characters -must be included in strings. - -@item last -POSIX @command{bc} does not have a \fBlast variable. Some implementations -of @command{bc} use the period (.) in a similar way. - -@item comparisons -POSIX @command{bc} allows comparisons only in the @code{if} statement, -the @code{while} statement, and the second expression of the @code{for} -statement. Also, only one relational operation is allowed in each of -those statements. - -@item if statement, else clause -POSIX @command{bc} does not have an @code{else} clause. - -@item for statement -POSIX @command{bc} requires all expressions to be present in the -@code{for} statement. - -@item &&, ||, ! -POSIX @command{bc} does not have the logical operators. - -@item read function -POSIX @command{bc} does not have a @code{read} function. - -@item print statement -POSIX @command{bc} does not have a @code{print} statement. - -@item continue statement -POSIX @command{bc} does not have a continue statement. - -@item array parameters -POSIX @command{bc} does not (currently) support array parameters in full. -The POSIX grammar allows for arrays in function definitions, but does -not provide a method to specify an array as an actual parameter. (This -is most likely an oversight in the grammar.) Traditional implementations -of @command{bc} have only call by value array parameters. - -@item function format -POSIX @command{bc} requires the opening brace on the same line as the -@code{define} key word and the @code{auto} statement on the next line. - -@item =+, =-, =*, =/, =%, =^ -POSIX @command{bc} does not require these "old style" assignment -operators to be defined. This version may allow these "old style" -assignments. Use the @code{limits} statement to see if the installed -version supports them. If it does support the "old style" assignment -operators, the statement "a =- 1" will decrement @code{a} by 1 instead -of setting @code{a} to the value -1. - -@item spaces in numbers -Other implementations of @command{bc} allow spaces in numbers. For example, -"x=1 3" would assign the value 13 to the variable x. The same statement -would cause a syntax error in this version of @command{bc}. - -@item errors and execution -This implementation varies from other implementations in terms of what -code will be executed when syntax and other errors are found in the -program. If a syntax error is found in a function definition, error -recovery tries to find the beginning of a statement and continue to -parse the function. Once a syntax error is found in the function, the -function will not be callable and becomes undefined. -Syntax errors in the interactive execution code will invalidate the -current execution block. The execution block is terminated by an -end of line that appears after a complete sequence of statements. -For example, - -@example -a = 1 -b = 2 -@end example - -has two execution blocks and - -@example -@{ a = 1 - b = 2 @} -@end example - -has one execution block. Any runtime error will terminate the execution -of the current execution block. A runtime warning will not terminate the -current execution block. - -@item Interrupts -During an interactive session, the SIGINT signal (usually generated by -the control-C character from the terminal) will cause execution of the -current execution block to be interrupted. It will display a "runtime" -error indicating which function was interrupted. After all runtime -structures have been cleaned up, a message will be printed to notify the -user that @command{bc} is ready for more input. All previously defined -functions remain defined and the value of all non-auto variables are the -value at the point of interruption. All auto variables and function -parameters are removed during the clean up process. During a -non-interactive session, the SIGINT signal will terminate the entire run -of @command{bc}. -@end table - -@node Limits, Environment Variables, GNU @command{bc} and Other Implementations, Top -@chapter Limits - -The following are the limits currently in place for this @command{bc} -processor. Some of them may have been changed by an installation. Use -the @code{limits} statement to see the actual values. - -@table @code - -@item BC_BASE_MAX -The maximum output base is currently set at 999. The maximum input base -is 16. - -@item BC_DIM_MAX -This is currently an arbitrary limit of 65535 as distributed. Your -installation may be different. - -@item BC_SCALE_MAX -The number of digits after the decimal point is limited to INT_MAX digits. -Also, the number of digits before the decimal point is limited to INT_MAX -digits. - -@item BC_STRING_MAX -The limit on the number of characters in a string is INT_MAX characters. - -@item exponent -The value of the exponent in the raise operation (^) is limited to LONG_MAX. - -@item multiply -The multiply routine may yield incorrect results if a number -has more than LONG_MAX / 90 total digits. For 32 bit longs, this number is -23,860,929 digits. - -@item variable names -The current limit on the number of unique names is 32767 for each of -simple variables, arrays and functions. -@end table - -@node Environment Variables, , Limits, Top -@chapter Environment Variables - -The following environment variables are processed by @command{bc}: - -@table @code - - -@item POSIXLY_CORRECT -This is the same as the -s option (@pxref{Command Line Options}). - -@item BC_ENV_ARGS -This is another mechanism to get arguments to @command{bc}. The format -is the same as the command line arguments. These arguments are -processed first, so any files listed in the environent arguments are -processed before any command line argument files. This allows the user -to set up "standard" options and files to be processed at every -invocation of @command{bc}. The files in the environment variables -would typically contain function definitions for functions the user -wants defined every time @command{bc} is run. - -@item BC_LINE_LENGTH -This should be an integer specifing the number of characters in an -output line for numbers. This includes the backslash and newline -characters for long numbers. -@end table - -@contents -@bye - - diff --git a/contrib/bc/doc/dc.1 b/contrib/bc/doc/dc.1 deleted file mode 100644 index adaf5d0cc058..000000000000 --- a/contrib/bc/doc/dc.1 +++ /dev/null @@ -1,490 +0,0 @@ -.\" -.\" dc.1 - the *roff document processor source for the dc manual -.\" -.\" This file is part of GNU dc. -.\" Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. -.\" -.\" This program is free software; you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation; either version 2 of the License , or -.\" (at your option) any later version. -.\" -.\" This program is distributed in the hope that it will be useful, -.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.\" GNU General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program; see the file COPYING. If not, write to: -.\" The Free Software Foundation, Inc. -.\" 59 Temple Place, Suite 330 -.\" Boston, MA 02111 USA -.\" -.\" $FreeBSD$ -.\" -.TH DC 1 "1997-03-25" "GNU Project" -.ds dc \fIdc\fP -.ds Dc \fIDc\fP -.SH NAME -dc \- an arbitrary precision calculator -.SH SYNOPSIS -dc [-V] [--version] [-h] [--help] - [-e scriptexpression] [--expression=scriptexpression] - [-f scriptfile] [--file=scriptfile] - [file ...] -.SH DESCRIPTION -.PP -\*(Dc is a reverse-polish desk calculator which supports -unlimited precision arithmetic. -It also allows you to define and call macros. -Normally \*(dc reads from the standard input; -if any command arguments are given to it, they are filenames, -and \*(dc reads and executes the contents of the files before reading -from standard input. -All normal output is to standard output; -all error output is to standard error. -.PP -A reverse-polish calculator stores numbers on a stack. -Entering a number pushes it on the stack. -Arithmetic operations pop arguments off the stack and push the results. -.PP -To enter a number in -.IR dc , -type the digits with an optional decimal point. -Exponential notation is not supported. -To enter a negative number, -begin the number with ``_''. -``-'' cannot be used for this, -as it is a binary operator for subtraction instead. -To enter two numbers in succession, -separate them with spaces or newlines. -These have no meaning as commands. -.SH OPTIONS -\*(Dc may be invoked with the following command-line options: -.TP -.B -V -.TP -.B --version -Print out the version of \*(dc that is being run and a copyright notice, -then exit. -.TP -.B -h -.TP -.B --help -Print a usage message briefly summarizing these command-line options -and the bug-reporting address, -then exit. -.TP -.B -e \fIscript\fP -.TP -.BI --expression= script -Add the commands in -.I script -to the set of commands to be run while processing the input. -.TP -.B -f \fIscript-file\fP -.TP -.BI --file= script-file -Add the commands contained in the file -.I script-file -to the set of commands to be run while processing the input. -.PP -If any command-line parameters remain after processing the above, -these parameters are interpreted as the names of input files to -be processed. -A file name of -.B - -refers to the standard input stream. -The standard input will processed if no file names are specified. -.PD -.SH -Printing Commands -.TP -.B p -Prints the value on the top of the stack, -without altering the stack. -A newline is printed after the value. -.TP -.B n -Prints the value on the top of the stack, popping it off, -and does not print a newline after. -.TP -.B P -Pops off the value on top of the stack. -If it it a string, it is simply printed without a trailing newline. -Otherwise it is a number, and the integer portion of its absolute -value is printed out as a "base (UCHAR_MAX+1)" byte stream. -Assuming that (UCHAR_MAX+1) is 256 -(as it is on most machines with 8-bit bytes), -the sequence \fBKSK 0k1/ [_1*]sx d0>x [256~aPd0 r -Pops two values off the stack and compares them -assuming they are numbers, -executing the contents of register -.I r -as a macro if the original top-of-stack -is greater. -Thus, -.B 1 2>a -will invoke register -.BR a 's -contents and -.B 2 1>a -will not. -.TP -.BI !> r -Similar but invokes the macro if the original top-of-stack is -not greater than (less than or equal to) what was the second-to-top. -.TP -.BI < r -Similar but invokes the macro if the original top-of-stack is less. -.TP -.BI !< r -Similar but invokes the macro if the original top-of-stack is -not less than (greater than or equal to) what was the second-to-top. -.TP -.BI = r -Similar but invokes the macro if the two numbers popped are equal. -.TP -.BI != r -Similar but invokes the macro if the two numbers popped are not equal. -.ig -This can also be validly used to compare two strings for equality. -.. -.TP -.B ? -Reads a line from the terminal and executes it. -This command allows a macro to request input from the user. -.TP -.B q -exits from a macro and also from the macro which invoked it. -If called from the top level, -or from a macro which was called directly from the top level, -the -.B q -command will cause \*(dc to exit. -.TP -.B Q -Pops a value off the stack and uses it as a count -of levels of macro execution to be exited. -Thus, -.B 3Q -exits three levels. -The -.B Q -command will never cause \*(dc to exit. -.SH -Status Inquiry -.TP -.B Z -Pops a value off the stack, -calculates the number of digits it has -(or number of characters, if it is a string) -and pushes that number. -.TP -.B X -Pops a value off the stack, -calculates the number of fraction digits it has, -and pushes that number. -For a string, -the value pushed is -.\" -1. -0. -.TP -.B z -Pushes the current stack depth: -the number of objects on the stack before the execution of the -.B z -command. -.SH -Miscellaneous -.TP -.B ! -Will run the rest of the line as a system command. -Note that parsing of the !<, !=, and !> commands take precedence, -so if you want to run a command starting with <, =, or > you will -need to add a space after the !. -.TP -.B # -Will interpret the rest of the line as a comment. -.TP -.BI : r -Will pop the top two values off of the stack. -The old second-to-top value will be stored in the array -.IR r , -indexed by the old top-of-stack value. -.TP -.BI ; r -Pops the top-of-stack and uses it as an index into -the array -.IR r . -The selected value is then pushed onto the stack. -.P -Note that each stacked instance of a register has its own -array associated with it. -Thus \fB1 0:a 0Sa 2 0:a La 0;ap\fP will print 1, -because the 2 was stored in an instance of 0:a that -was later popped. -.SH -BUGS -.PP -Email bug reports to -.BR bug-dc@gnu.org . diff --git a/contrib/bc/doc/dc.texi b/contrib/bc/doc/dc.texi deleted file mode 100644 index 0a4d97396ad8..000000000000 --- a/contrib/bc/doc/dc.texi +++ /dev/null @@ -1,526 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename dc.info -@settitle dc, an arbitrary precision calculator -@c %**end of header - -@c This file has the new style title page commands. -@c Run `makeinfo' rather than `texinfo-format-buffer'. - -@c smallbook - -@c tex -@c \overfullrule=0pt -@c end tex - -@c Combine indices. -@synindex cp fn -@syncodeindex vr fn -@syncodeindex ky fn -@syncodeindex pg fn -@syncodeindex tp fn - -@ifinfo -@direntry -* dc: (dc). Arbritrary precision RPN ``Desktop Calculator''. -@end direntry -This file documents @sc{dc}, an arbitrary precision calculator. - -Published by the Free Software Foundation, Inc. -59 Temple Place, Suite 330 -Boston, MA 02111 USA - -Copyright (C) 1984, 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end ifinfo - -@setchapternewpage off - -@titlepage -@title dc, an arbitrary precision calculator - -@author by Ken Pizzini -@author original manual by Richard Stallman -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1994, 1997, 1998 Free Software Foundation, Inc. - -@sp 2 -Published by the Free Software Foundation, @* -59 Temple Place, Suite 330 @* -Boston, MA 02111 USA - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. - -@end titlepage -@page - -@node Top, Introduction, (dir), (dir) - -@menu -* Introduction:: Introduction -* Invocation:: Invocation -* Printing Commands:: Printing Commands -* Arithmetic:: Arithmetic -* Stack Control:: Stack Control -* Registers:: Registers -* Parameters:: Parameters -* Strings:: Strings -* Status Inquiry:: Status Inquiry -* Miscellaneous:: Other commands -* Reporting bugs:: Reporting bugs -@end menu - -@node Introduction, Invocation, Top, Top -@comment node-name, next, previous, up -@chapter Introduction - -@sc{dc} is a reverse-polish desk calculator -which supports unlimited precision arithmetic. -It also allows you to define and call macros. -Normally @sc{dc} reads from the standard input; -if any command arguments are given to it, they are filenames, -and @sc{dc} reads and executes the contents of the files -instead of reading from standard input. -All normal output is to standard output; -all error messages are written to standard error. - -To exit, use @samp{q}. -@kbd{C-c} does not exit; -it is used to abort macros that are looping, etc. -(Currently this is not true; @kbd{C-c} does exit.) - -A reverse-polish calculator stores numbers on a stack. -Entering a number pushes it on the stack. -Arithmetic operations pop arguments off the stack and push the results. - -To enter a number in @sc{dc}, type the digits, -with an optional decimal point. -Exponential notation is not supported. -To enter a negative number, begin the number with @samp{_}. -@samp{-} cannot be used for this, as it is a binary operator -for subtraction instead. -To enter two numbers in succession, -separate them with spaces or newlines. -These have no meaning as commands. - -@node Invocation, Printing Commands, Introduction, Top -@chapter Invocation - -@sc{dc} may be invoked with the following command-line options: -@table @samp - -@item -e @var{expr} -@item --expression=@var{expr} -Evaluate @var{expr} as @sc{dc} commands. - -@item -f @var{file} -@item --file=@var{file} -Read and evaluate @sc{dc} commands from @var{file}. - -@item -h -@item --help -Print a usage message summarizing the command-line options, then exit. - -@item -V -@item --version -Print the version information for this program, then exit. -@end table - -If any command-line parameters remain after processing the options, -these parameters are interpreted as additional @var{file}s whose -contents are read and evaluated. -A file name of @code{-} refers to the standard input stream. -If no @code{-e} option was specified, and no files were specified, -then the standard input will be read for commands to evaluate. - -@node Printing Commands, Arithmetic, Invocation, Top -@chapter Printing Commands - -@table @samp -@item p -Prints the value on the top of the stack, -without altering the stack. -A newline is printed after the value. - -@item n -Prints the value on the top of the stack, popping it off, -and does not print a newline after. -(This command is a GNU extension.) - -@item P -Pops off the value on top of the stack. -If it it a string, it is simply printed without a trailing newline. -Otherwise it is a number, and the integer portion of its absolute -value is printed out as a "base (UCHAR_MAX+1)" byte stream. -Assuming that (UCHAR_MAX+1) is 256 -(as it is on most machines with 8-bit bytes), -the sequence -@code{KSK 0k1/ [_1*]sx d0>x [256~aPd0@var{r} -Pops two values off the stack and compares them -assuming they are numbers, -executing the contents of register @var{r} as a macro -if the original top-of-stack is greater. -Thus, @samp{1 2>a} will invoke register @samp{a}'s contents -and @samp{2 1>a} will not. - -@item !>@var{r} -Similar but invokes the macro if the original top-of-stack is not greater -(is less than or equal to) what was the second-to-top. - -@item <@var{r} -Similar but invokes the macro if the original top-of-stack is less. - -@item !<@var{r} -Similar but invokes the macro if the original top-of-stack is not less -(is greater than or equal to) what was the second-to-top. - -@item =@var{r} -Similar but invokes the macro if the two numbers popped are equal. -@c This can also be validly used to compare two strings for equality. - -@item !=@var{r} -Similar but invokes the macro if the two numbers popped are not equal. -@c This can also be validly used to compare two strings for equality. - -@item ? -Reads a line from the terminal and executes it. -This command allows a macro to request input from the user. - -@item q -During the execution of a macro, -this command exits from the macro and also from the macro which invoked it. -If called from the top level, -or from a macro which was called directly from the top level, -the @samp{q} command will cause @sc{dc} to exit. - -@item Q -Pops a value off the stack and uses it as a count -of levels of macro execution to be exited. -Thus, @samp{3Q} exits three levels. -@end table - -@node Status Inquiry, Miscellaneous, Strings, Top -@chapter Status Inquiry - -@table @samp -@item Z -Pops a value off the stack, -calculates the number of digits it has -(or number of characters, if it is a string) -and pushes that number. - -@item X -Pops a value off the stack, -calculates the number of fraction digits it has, -and pushes that number. -For a string, the value pushed is -@c -1. -0. - -@item z -Pushes the current stack depth: -the number of objects on the stack -before the execution of the @samp{z} command. -@end table - -@node Miscellaneous, Reporting bugs, Status Inquiry, Top -@chapter Miscellaneous - -@table @samp -@item ! -Will run the rest of the line as a system command. -Note that parsing of the !<, !=, and !> commands take precidence, -so if you want to run a command starting with <, =, or > you will -need to add a space after the !. - -@item # -Will interpret the rest of the line as a comment. -(This command is a GNU extension.) - -@item :@var{r} -Will pop the top two values off of the stack. -The old second-to-top value will be stored in the array @var{r}, -indexed by the old top-of-stack value. - -@item ;@var{r} -Pops the top-of-stack and uses it as an index into -the array @var{r}. -The selected value is then pushed onto the stack. -@end table - -Note that each stacked instance of a register has its own -array associated with it. -Thus @samp{1 @var{0:a} 0S@var{a} 2 @var{0:a} L@var{a} @var{0;a}p} -will print 1, because the 2 was stored in an instance of @var{0:a} -that was later popped. - -@node Reporting bugs, , Miscellaneous, Top -@chapter Reporting bugs - -Email bug reports to @email{bug-dc@@gnu.org}. -@contents -@bye diff --git a/contrib/bc/h/number.h b/contrib/bc/h/number.h deleted file mode 100644 index 8d781208b786..000000000000 --- a/contrib/bc/h/number.h +++ /dev/null @@ -1,153 +0,0 @@ -/* number.h: Arbitrary precision numbers header file. */ -/* - Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to: - - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111-1307 USA. - - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#ifndef _NUMBER_H_ -#define _NUMBER_H_ - -typedef enum {PLUS, MINUS} sign; - -typedef struct bc_struct *bc_num; - -typedef struct bc_struct - { - sign n_sign; - int n_len; /* The number of digits before the decimal point. */ - int n_scale; /* The number of digits after the decimal point. */ - int n_refs; /* The number of pointers to this number. */ - bc_num n_next; /* Linked list for available list. */ - char *n_ptr; /* The pointer to the actual storage. - If NULL, n_value points to the inside of - another number (bc_multiply...) and should - not be "freed." */ - char *n_value; /* The number. Not zero char terminated. - May not point to the same place as n_ptr as - in the case of leading zeros generated. */ - } bc_struct; - - -/* The base used in storing the numbers in n_value above. - Currently this MUST be 10. */ - -#define BASE 10 - -/* Some useful macros and constants. */ - -#define CH_VAL(c) (c - '0') -#define BCD_CHAR(d) (d + '0') - -#ifdef MIN -#undef MIN -#undef MAX -#endif -#define MAX(a,b) ((a)>(b)?(a):(b)) -#define MIN(a,b) ((a)>(b)?(b):(a)) -#define ODD(a) ((a)&1) - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -#ifndef LONG_MAX -#define LONG_MAX 0x7ffffff -#endif - - -/* Global numbers. */ -extern bc_num _zero_; -extern bc_num _one_; -extern bc_num _two_; - - -/* Function Prototypes */ - -/* Define the _PROTOTYPE macro if it is needed. */ - -#ifndef _PROTOTYPE -#ifdef __STDC__ -#define _PROTOTYPE(func, args) func args -#else -#define _PROTOTYPE(func, args) func() -#endif -#endif - -_PROTOTYPE(void bc_init_numbers, (void)); - -_PROTOTYPE(bc_num bc_new_num, (int length, int scale)); - -_PROTOTYPE(void bc_free_num, (bc_num *num)); - -_PROTOTYPE(bc_num bc_copy_num, (bc_num num)); - -_PROTOTYPE(void bc_init_num, (bc_num *num)); - -_PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale)); - -_PROTOTYPE(char *bc_num2str, (bc_num num)); - -_PROTOTYPE(void bc_int2num, (bc_num *num, int val)); - -_PROTOTYPE(long bc_num2long, (bc_num num)); - -_PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2)); - -_PROTOTYPE(char bc_is_zero, (bc_num num)); - -_PROTOTYPE(char bc_is_near_zero, (bc_num num, int scale)); - -_PROTOTYPE(char bc_is_neg, (bc_num num)); - -_PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); - -_PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); - -_PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale)); - -_PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale)); - -_PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result, - int scale)); - -_PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot, - bc_num *rem, int scale)); - -_PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod, - bc_num *result, int scale)); - -_PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result, - int scale)); - -_PROTOTYPE(int bc_sqrt, (bc_num *num, int scale)); - -_PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int), - int leading_zero)); - -#endif diff --git a/contrib/bc/install-sh b/contrib/bc/install-sh deleted file mode 100755 index ab74c882e923..000000000000 --- a/contrib/bc/install-sh +++ /dev/null @@ -1,238 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -tranformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/contrib/bc/lib/Makefile.am b/contrib/bc/lib/Makefile.am deleted file mode 100644 index 6f74b4dfee1f..000000000000 --- a/contrib/bc/lib/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -## Process this file with automake to produce Makefile.in -noinst_LIBRARIES = libbc.a - -INCLUDES = -I. -I.. -I$(srcdir)/../h - -libbc_a_SOURCES = getopt.c getopt1.c vfprintf.c number.c - -DEFS = @DEFS@ $(DEFSADD) - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -MAINTAINERCLEANFILES = Makefile.in number.c - -newnumber.o: number.c muldigits.h - $(CC) $(CFLAGS) $(INCLUDES) -c -DMULDIGITS -o newnumber.o $(srcdir)/number.c - -muldigits.h: testmul - @echo "The following may take up to 10 minutes." - testmul > muldigits.h - -testmul: testmul.o number.o - $(CC) $(CFLAGS) -o testmul testmul.o number.o - -specialnumber: newnumber.o - cp newnumber.o number.o - diff --git a/contrib/bc/lib/Makefile.in b/contrib/bc/lib/Makefile.in deleted file mode 100644 index 5ffa5938657f..000000000000 --- a/contrib/bc/lib/Makefile.in +++ /dev/null @@ -1,283 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -noinst_LIBRARIES = libbc.a - -INCLUDES = -I. -I.. -I$(srcdir)/../h - -libbc_a_SOURCES = getopt.c getopt1.c vfprintf.c number.c - -DEFS = @DEFS@ $(DEFSADD) - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -MAINTAINERCLEANFILES = Makefile.in number.c -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) - -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -libbc_a_LIBADD = -libbc_a_OBJECTS = getopt.o getopt1.o vfprintf.o number.o -AR = ar -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -DIST_COMMON = Makefile.am Makefile.in - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(libbc_a_SOURCES) -OBJECTS = $(libbc_a_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .o .s -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps lib/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-noinstLIBRARIES: - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) - -distclean-noinstLIBRARIES: - -maintainer-clean-noinstLIBRARIES: - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -libbc.a: $(libbc_a_OBJECTS) $(libbc_a_DEPENDENCIES) - -rm -f libbc.a - $(AR) cru libbc.a $(libbc_a_OBJECTS) $(libbc_a_LIBADD) - $(RANLIB) libbc.a - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = lib - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done -getopt.o: getopt.c ../config.h ../h/getopt.h -getopt1.o: getopt1.c ../config.h ../h/getopt.h -number.o: number.c ../config.h ../h/number.h -vfprintf.o: vfprintf.c ../config.h - -info-am: -info: info-am -dvi-am: -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: -install-exec: install-exec-am - -install-data-am: -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: -uninstall: uninstall-am -all-am: Makefile $(LIBRARIES) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ - mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ - mostlyclean-am - -clean: clean-am - -distclean-am: distclean-noinstLIBRARIES distclean-compile \ - distclean-tags distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ - maintainer-clean-compile maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ -clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile tags mostlyclean-tags distclean-tags \ -clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ -check-am installcheck-am installcheck install-exec-am install-exec \ -install-data-am install-data install-am install uninstall-am uninstall \ -all-redirect all-am all installdirs mostlyclean-generic \ -distclean-generic clean-generic maintainer-clean-generic clean \ -mostlyclean distclean maintainer-clean - - -newnumber.o: number.c muldigits.h - $(CC) $(CFLAGS) $(INCLUDES) -c -DMULDIGITS -o newnumber.o $(srcdir)/number.c - -muldigits.h: testmul - @echo "The following may take up to 10 minutes." - testmul > muldigits.h - -testmul: testmul.o number.o - $(CC) $(CFLAGS) -o testmul testmul.o number.o - -specialnumber: newnumber.o - cp newnumber.o number.o - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/lib/number.c b/contrib/bc/lib/number.c deleted file mode 100644 index 1f913d5350d6..000000000000 --- a/contrib/bc/lib/number.c +++ /dev/null @@ -1,1793 +0,0 @@ -/* number.c: Implements arbitrary precision numbers. */ -/* - Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to: - - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111-1307 USA. - - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include -#include -#include -#include -#include -#include /* Prototypes needed for external utility routines. */ - -#define bc_rt_warn rt_warn -#define bc_rt_error rt_error -#define bc_out_of_memory out_of_memory - -_PROTOTYPE(void rt_warn, (char *mesg ,...)); -_PROTOTYPE(void rt_error, (char *mesg ,...)); -_PROTOTYPE(void out_of_memory, (void)); - -/* Storage used for special numbers. */ -bc_num _zero_; -bc_num _one_; -bc_num _two_; - -static bc_num _bc_Free_list = NULL; - -/* new_num allocates a number and sets fields to known values. */ - -bc_num -bc_new_num (length, scale) - int length, scale; -{ - bc_num temp; - - if (_bc_Free_list != NULL) { - temp = _bc_Free_list; - _bc_Free_list = temp->n_next; - } else { - temp = (bc_num) malloc (sizeof(bc_struct)); - if (temp == NULL) bc_out_of_memory (); - } - temp->n_sign = PLUS; - temp->n_len = length; - temp->n_scale = scale; - temp->n_refs = 1; - temp->n_ptr = (char *) malloc (length+scale); - if (temp->n_ptr == NULL) bc_out_of_memory(); - temp->n_value = temp->n_ptr; - memset (temp->n_ptr, 0, length+scale); - return temp; -} - -/* "Frees" a bc_num NUM. Actually decreases reference count and only - frees the storage if reference count is zero. */ - -void -bc_free_num (num) - bc_num *num; -{ - if (*num == NULL) return; - (*num)->n_refs--; - if ((*num)->n_refs == 0) { - if ((*num)->n_ptr) - free ((*num)->n_ptr); - (*num)->n_next = _bc_Free_list; - _bc_Free_list = *num; - } - *num = NULL; -} - - -/* Intitialize the number package! */ - -void -bc_init_numbers () -{ - _zero_ = bc_new_num (1,0); - _one_ = bc_new_num (1,0); - _one_->n_value[0] = 1; - _two_ = bc_new_num (1,0); - _two_->n_value[0] = 2; -} - - -/* Make a copy of a number! Just increments the reference count! */ - -bc_num -bc_copy_num (num) - bc_num num; -{ - num->n_refs++; - return num; -} - - -/* Initialize a number NUM by making it a copy of zero. */ - -void -bc_init_num (num) - bc_num *num; -{ - *num = bc_copy_num (_zero_); -} - -/* For many things, we may have leading zeros in a number NUM. - _bc_rm_leading_zeros just moves the data "value" pointer to the - correct place and adjusts the length. */ - -static void -_bc_rm_leading_zeros (num) - bc_num num; -{ - /* We can move n_value to point to the first non zero digit! */ - while (*num->n_value == 0 && num->n_len > 1) { - num->n_value++; - num->n_len--; - } -} - - -/* Compare two bc numbers. Return value is 0 if equal, -1 if N1 is less - than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just - compare the magnitudes. */ - -static int -_bc_do_compare (n1, n2, use_sign, ignore_last) - bc_num n1, n2; - int use_sign; - int ignore_last; -{ - char *n1ptr, *n2ptr; - int count; - - /* First, compare signs. */ - if (use_sign && n1->n_sign != n2->n_sign) - { - if (n1->n_sign == PLUS) - return (1); /* Positive N1 > Negative N2 */ - else - return (-1); /* Negative N1 < Positive N1 */ - } - - /* Now compare the magnitude. */ - if (n1->n_len != n2->n_len) - { - if (n1->n_len > n2->n_len) - { - /* Magnitude of n1 > n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (1); - else - return (-1); - } - else - { - /* Magnitude of n1 < n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (-1); - else - return (1); - } - } - - /* If we get here, they have the same number of integer digits. - check the integer part and the equal length part of the fraction. */ - count = n1->n_len + MIN (n1->n_scale, n2->n_scale); - n1ptr = n1->n_value; - n2ptr = n2->n_value; - - while ((count > 0) && (*n1ptr == *n2ptr)) - { - n1ptr++; - n2ptr++; - count--; - } - if (ignore_last && count == 1 && n1->n_scale == n2->n_scale) - return (0); - if (count != 0) - { - if (*n1ptr > *n2ptr) - { - /* Magnitude of n1 > n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (1); - else - return (-1); - } - else - { - /* Magnitude of n1 < n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (-1); - else - return (1); - } - } - - /* They are equal up to the last part of the equal part of the fraction. */ - if (n1->n_scale != n2->n_scale) - { - if (n1->n_scale > n2->n_scale) - { - for (count = n1->n_scale-n2->n_scale; count>0; count--) - if (*n1ptr++ != 0) - { - /* Magnitude of n1 > n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (1); - else - return (-1); - } - } - else - { - for (count = n2->n_scale-n1->n_scale; count>0; count--) - if (*n2ptr++ != 0) - { - /* Magnitude of n1 < n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (-1); - else - return (1); - } - } - } - - /* They must be equal! */ - return (0); -} - - -/* This is the "user callable" routine to compare numbers N1 and N2. */ - -int -bc_compare (n1, n2) - bc_num n1, n2; -{ - return _bc_do_compare (n1, n2, TRUE, FALSE); -} - -/* In some places we need to check if the number is negative. */ - -char -bc_is_neg (num) - bc_num num; -{ - return num->n_sign == MINUS; -} - -/* In some places we need to check if the number NUM is zero. */ - -char -bc_is_zero (num) - bc_num num; -{ - int count; - char *nptr; - - /* Quick check. */ - if (num == _zero_) return TRUE; - - /* Initialize */ - count = num->n_len + num->n_scale; - nptr = num->n_value; - - /* The check */ - while ((count > 0) && (*nptr++ == 0)) count--; - - if (count != 0) - return FALSE; - else - return TRUE; -} - -/* In some places we need to check if the number NUM is almost zero. - Specifically, all but the last digit is 0 and the last digit is 1. - Last digit is defined by scale. */ - -char -bc_is_near_zero (num, scale) - bc_num num; - int scale; -{ - int count; - char *nptr; - - /* Error checking */ - if (scale > num->n_scale) - scale = num->n_scale; - - /* Initialize */ - count = num->n_len + scale; - nptr = num->n_value; - - /* The check */ - while ((count > 0) && (*nptr++ == 0)) count--; - - if (count != 0 && (count != 1 || *--nptr != 1)) - return FALSE; - else - return TRUE; -} - - -/* Perform addition: N1 is added to N2 and the value is - returned. The signs of N1 and N2 are ignored. - SCALE_MIN is to set the minimum scale of the result. */ - -static bc_num -_bc_do_add (n1, n2, scale_min) - bc_num n1, n2; - int scale_min; -{ - bc_num sum; - int sum_scale, sum_digits; - char *n1ptr, *n2ptr, *sumptr; - int carry, n1bytes, n2bytes; - int count; - - /* Prepare sum. */ - sum_scale = MAX (n1->n_scale, n2->n_scale); - sum_digits = MAX (n1->n_len, n2->n_len) + 1; - sum = bc_new_num (sum_digits, MAX(sum_scale, scale_min)); - - /* Zero extra digits made by scale_min. */ - if (scale_min > sum_scale) - { - sumptr = (char *) (sum->n_value + sum_scale + sum_digits); - for (count = scale_min - sum_scale; count > 0; count--) - *sumptr++ = 0; - } - - /* Start with the fraction part. Initialize the pointers. */ - n1bytes = n1->n_scale; - n2bytes = n2->n_scale; - n1ptr = (char *) (n1->n_value + n1->n_len + n1bytes - 1); - n2ptr = (char *) (n2->n_value + n2->n_len + n2bytes - 1); - sumptr = (char *) (sum->n_value + sum_scale + sum_digits - 1); - - /* Add the fraction part. First copy the longer fraction.*/ - if (n1bytes != n2bytes) - { - if (n1bytes > n2bytes) - while (n1bytes>n2bytes) - { *sumptr-- = *n1ptr--; n1bytes--;} - else - while (n2bytes>n1bytes) - { *sumptr-- = *n2ptr--; n2bytes--;} - } - - /* Now add the remaining fraction part and equal size integer parts. */ - n1bytes += n1->n_len; - n2bytes += n2->n_len; - carry = 0; - while ((n1bytes > 0) && (n2bytes > 0)) - { - *sumptr = *n1ptr-- + *n2ptr-- + carry; - if (*sumptr > (BASE-1)) - { - carry = 1; - *sumptr -= BASE; - } - else - carry = 0; - sumptr--; - n1bytes--; - n2bytes--; - } - - /* Now add carry the longer integer part. */ - if (n1bytes == 0) - { n1bytes = n2bytes; n1ptr = n2ptr; } - while (n1bytes-- > 0) - { - *sumptr = *n1ptr-- + carry; - if (*sumptr > (BASE-1)) - { - carry = 1; - *sumptr -= BASE; - } - else - carry = 0; - sumptr--; - } - - /* Set final carry. */ - if (carry == 1) - *sumptr += 1; - - /* Adjust sum and return. */ - _bc_rm_leading_zeros (sum); - return sum; -} - - -/* Perform subtraction: N2 is subtracted from N1 and the value is - returned. The signs of N1 and N2 are ignored. Also, N1 is - assumed to be larger than N2. SCALE_MIN is the minimum scale - of the result. */ - -static bc_num -_bc_do_sub (n1, n2, scale_min) - bc_num n1, n2; - int scale_min; -{ - bc_num diff; - int diff_scale, diff_len; - int min_scale, min_len; - char *n1ptr, *n2ptr, *diffptr; - int borrow, count, val; - - /* Allocate temporary storage. */ - diff_len = MAX (n1->n_len, n2->n_len); - diff_scale = MAX (n1->n_scale, n2->n_scale); - min_len = MIN (n1->n_len, n2->n_len); - min_scale = MIN (n1->n_scale, n2->n_scale); - diff = bc_new_num (diff_len, MAX(diff_scale, scale_min)); - - /* Zero extra digits made by scale_min. */ - if (scale_min > diff_scale) - { - diffptr = (char *) (diff->n_value + diff_len + diff_scale); - for (count = scale_min - diff_scale; count > 0; count--) - *diffptr++ = 0; - } - - /* Initialize the subtract. */ - n1ptr = (char *) (n1->n_value + n1->n_len + n1->n_scale -1); - n2ptr = (char *) (n2->n_value + n2->n_len + n2->n_scale -1); - diffptr = (char *) (diff->n_value + diff_len + diff_scale -1); - - /* Subtract the numbers. */ - borrow = 0; - - /* Take care of the longer scaled number. */ - if (n1->n_scale != min_scale) - { - /* n1 has the longer scale */ - for (count = n1->n_scale - min_scale; count > 0; count--) - *diffptr-- = *n1ptr--; - } - else - { - /* n2 has the longer scale */ - for (count = n2->n_scale - min_scale; count > 0; count--) - { - val = - *n2ptr-- - borrow; - if (val < 0) - { - val += BASE; - borrow = 1; - } - else - borrow = 0; - *diffptr-- = val; - } - } - - /* Now do the equal length scale and integer parts. */ - - for (count = 0; count < min_len + min_scale; count++) - { - val = *n1ptr-- - *n2ptr-- - borrow; - if (val < 0) - { - val += BASE; - borrow = 1; - } - else - borrow = 0; - *diffptr-- = val; - } - - /* If n1 has more digits then n2, we now do that subtract. */ - if (diff_len != min_len) - { - for (count = diff_len - min_len; count > 0; count--) - { - val = *n1ptr-- - borrow; - if (val < 0) - { - val += BASE; - borrow = 1; - } - else - borrow = 0; - *diffptr-- = val; - } - } - - /* Clean up and return. */ - _bc_rm_leading_zeros (diff); - return diff; -} - - -/* Here is the full subtract routine that takes care of negative numbers. - N2 is subtracted from N1 and the result placed in RESULT. SCALE_MIN - is the minimum scale for the result. */ - -void -bc_sub (n1, n2, result, scale_min) - bc_num n1, n2, *result; - int scale_min; -{ - bc_num diff = NULL; - int cmp_res; - int res_scale; - - if (n1->n_sign != n2->n_sign) - { - diff = _bc_do_add (n1, n2, scale_min); - diff->n_sign = n1->n_sign; - } - else - { - /* subtraction must be done. */ - /* Compare magnitudes. */ - cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); - switch (cmp_res) - { - case -1: - /* n1 is less than n2, subtract n1 from n2. */ - diff = _bc_do_sub (n2, n1, scale_min); - diff->n_sign = (n2->n_sign == PLUS ? MINUS : PLUS); - break; - case 0: - /* They are equal! return zero! */ - res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); - diff = bc_new_num (1, res_scale); - memset (diff->n_value, 0, res_scale+1); - break; - case 1: - /* n2 is less than n1, subtract n2 from n1. */ - diff = _bc_do_sub (n1, n2, scale_min); - diff->n_sign = n1->n_sign; - break; - } - } - - /* Clean up and return. */ - bc_free_num (result); - *result = diff; -} - - -/* Here is the full add routine that takes care of negative numbers. - N1 is added to N2 and the result placed into RESULT. SCALE_MIN - is the minimum scale for the result. */ - -void -bc_add (n1, n2, result, scale_min) - bc_num n1, n2, *result; - int scale_min; -{ - bc_num sum = NULL; - int cmp_res; - int res_scale; - - if (n1->n_sign == n2->n_sign) - { - sum = _bc_do_add (n1, n2, scale_min); - sum->n_sign = n1->n_sign; - } - else - { - /* subtraction must be done. */ - cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); /* Compare magnitudes. */ - switch (cmp_res) - { - case -1: - /* n1 is less than n2, subtract n1 from n2. */ - sum = _bc_do_sub (n2, n1, scale_min); - sum->n_sign = n2->n_sign; - break; - case 0: - /* They are equal! return zero with the correct scale! */ - res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); - sum = bc_new_num (1, res_scale); - memset (sum->n_value, 0, res_scale+1); - break; - case 1: - /* n2 is less than n1, subtract n2 from n1. */ - sum = _bc_do_sub (n1, n2, scale_min); - sum->n_sign = n1->n_sign; - } - } - - /* Clean up and return. */ - bc_free_num (result); - *result = sum; -} - -/* Recursive vs non-recursive multiply crossover ranges. */ -#if defined(MULDIGITS) -#include "muldigits.h" -#else -#define MUL_BASE_DIGITS 80 -#endif - -int mul_base_digits = MUL_BASE_DIGITS; -#define MUL_SMALL_DIGITS mul_base_digits/4 - -/* Multiply utility routines */ - -static bc_num -new_sub_num (length, scale, value) - int length, scale; - char *value; -{ - bc_num temp; - - if (_bc_Free_list != NULL) { - temp = _bc_Free_list; - _bc_Free_list = temp->n_next; - } else { - temp = (bc_num) malloc (sizeof(bc_struct)); - if (temp == NULL) bc_out_of_memory (); - } - temp->n_sign = PLUS; - temp->n_len = length; - temp->n_scale = scale; - temp->n_refs = 1; - temp->n_ptr = NULL; - temp->n_value = value; - return temp; -} - -static void -_bc_simp_mul (bc_num n1, int n1len, bc_num n2, int n2len, bc_num *prod, - int full_scale) -{ - char *n1ptr, *n2ptr, *pvptr; - char *n1end, *n2end; /* To the end of n1 and n2. */ - int indx, sum, prodlen; - - prodlen = n1len+n2len+1; - - *prod = bc_new_num (prodlen, 0); - - n1end = (char *) (n1->n_value + n1len - 1); - n2end = (char *) (n2->n_value + n2len - 1); - pvptr = (char *) ((*prod)->n_value + prodlen - 1); - sum = 0; - - /* Here is the loop... */ - for (indx = 0; indx < prodlen-1; indx++) - { - n1ptr = (char *) (n1end - MAX(0, indx-n2len+1)); - n2ptr = (char *) (n2end - MIN(indx, n2len-1)); - while ((n1ptr >= n1->n_value) && (n2ptr <= n2end)) - sum += *n1ptr-- * *n2ptr++; - *pvptr-- = sum % BASE; - sum = sum / BASE; - } - *pvptr = sum; -} - - -/* A special adder/subtractor for the recursive divide and conquer - multiply algorithm. Note: if sub is called, accum must - be larger that what is being subtracted. Also, accum and val - must have n_scale = 0. (e.g. they must look like integers. *) */ -static void -_bc_shift_addsub (bc_num accum, bc_num val, int shift, int sub) -{ - signed char *accp, *valp; - int count, carry; - - count = val->n_len; - if (val->n_value[0] == 0) - count--; - assert (accum->n_len+accum->n_scale >= shift+count); - - /* Set up pointers and others */ - accp = (signed char *)(accum->n_value + - accum->n_len + accum->n_scale - shift - 1); - valp = (signed char *)(val->n_value + val->n_len - 1); - carry = 0; - - if (sub) { - /* Subtraction, carry is really borrow. */ - while (count--) { - *accp -= *valp-- + carry; - if (*accp < 0) { - carry = 1; - *accp-- += BASE; - } else { - carry = 0; - accp--; - } - } - while (carry) { - *accp -= carry; - if (*accp < 0) - *accp-- += BASE; - else - carry = 0; - } - } else { - /* Addition */ - while (count--) { - *accp += *valp-- + carry; - if (*accp > (BASE-1)) { - carry = 1; - *accp-- -= BASE; - } else { - carry = 0; - accp--; - } - } - while (carry) { - *accp += carry; - if (*accp > (BASE-1)) - *accp-- -= BASE; - else - carry = 0; - } - } -} - -/* Recursive divide and conquer multiply algorithm. - Based on - Let u = u0 + u1*(b^n) - Let v = v0 + v1*(b^n) - Then uv = (B^2n+B^n)*u1*v1 + B^n*(u1-u0)*(v0-v1) + (B^n+1)*u0*v0 - - B is the base of storage, number of digits in u1,u0 close to equal. -*/ -static void -_bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, - int full_scale) -{ - bc_num u0, u1, v0, v1; - int u0len, v0len; - bc_num m1, m2, m3, d1, d2; - int n, prodlen, m1zero; - int d1len, d2len; - - /* Base case? */ - if ((ulen+vlen) < mul_base_digits - || ulen < MUL_SMALL_DIGITS - || vlen < MUL_SMALL_DIGITS ) { - _bc_simp_mul (u, ulen, v, vlen, prod, full_scale); - return; - } - - /* Calculate n -- the u and v split point in digits. */ - n = (MAX(ulen, vlen)+1) / 2; - - /* Split u and v. */ - if (ulen < n) { - u1 = bc_copy_num (_zero_); - u0 = new_sub_num (ulen,0, u->n_value); - } else { - u1 = new_sub_num (ulen-n, 0, u->n_value); - u0 = new_sub_num (n, 0, u->n_value+ulen-n); - } - if (vlen < n) { - v1 = bc_copy_num (_zero_); - v0 = new_sub_num (vlen,0, v->n_value); - } else { - v1 = new_sub_num (vlen-n, 0, v->n_value); - v0 = new_sub_num (n, 0, v->n_value+vlen-n); - } - _bc_rm_leading_zeros (u1); - _bc_rm_leading_zeros (u0); - u0len = u0->n_len; - _bc_rm_leading_zeros (v1); - _bc_rm_leading_zeros (v0); - v0len = v0->n_len; - - m1zero = bc_is_zero(u1) || bc_is_zero(v1); - - /* Calculate sub results ... */ - - bc_init_num(&d1); - bc_init_num(&d2); - bc_sub (u1, u0, &d1, 0); - d1len = d1->n_len; - bc_sub (v0, v1, &d2, 0); - d2len = d2->n_len; - - - /* Do recursive multiplies and shifted adds. */ - if (m1zero) - m1 = bc_copy_num (_zero_); - else - _bc_rec_mul (u1, u1->n_len, v1, v1->n_len, &m1, 0); - - if (bc_is_zero(d1) || bc_is_zero(d2)) - m2 = bc_copy_num (_zero_); - else - _bc_rec_mul (d1, d1len, d2, d2len, &m2, 0); - - if (bc_is_zero(u0) || bc_is_zero(v0)) - m3 = bc_copy_num (_zero_); - else - _bc_rec_mul (u0, u0->n_len, v0, v0->n_len, &m3, 0); - - /* Initialize product */ - prodlen = ulen+vlen+1; - *prod = bc_new_num(prodlen, 0); - - if (!m1zero) { - _bc_shift_addsub (*prod, m1, 2*n, 0); - _bc_shift_addsub (*prod, m1, n, 0); - } - _bc_shift_addsub (*prod, m3, n, 0); - _bc_shift_addsub (*prod, m3, 0, 0); - _bc_shift_addsub (*prod, m2, n, d1->n_sign != d2->n_sign); - - /* Now clean up! */ - bc_free_num (&u1); - bc_free_num (&u0); - bc_free_num (&v1); - bc_free_num (&m1); - bc_free_num (&v0); - bc_free_num (&m2); - bc_free_num (&m3); - bc_free_num (&d1); - bc_free_num (&d2); -} - -/* The multiply routine. N2 times N1 is put int PROD with the scale of - the result being MIN(N2 scale+N1 scale, MAX (SCALE, N2 scale, N1 scale)). - */ - -void -bc_multiply (n1, n2, prod, scale) - bc_num n1, n2, *prod; - int scale; -{ - bc_num pval; - int len1, len2; - int full_scale, prod_scale; - - /* Initialize things. */ - len1 = n1->n_len + n1->n_scale; - len2 = n2->n_len + n2->n_scale; - full_scale = n1->n_scale + n2->n_scale; - prod_scale = MIN(full_scale,MAX(scale,MAX(n1->n_scale,n2->n_scale))); - - /* Do the multiply */ - _bc_rec_mul (n1, len1, n2, len2, &pval, full_scale); - - /* Assign to prod and clean up the number. */ - pval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); - pval->n_value = pval->n_ptr; - pval->n_len = len2 + len1 + 1 - full_scale; - pval->n_scale = prod_scale; - _bc_rm_leading_zeros (pval); - if (bc_is_zero (pval)) - pval->n_sign = PLUS; - bc_free_num (prod); - *prod = pval; -} - -/* Some utility routines for the divide: First a one digit multiply. - NUM (with SIZE digits) is multiplied by DIGIT and the result is - placed into RESULT. It is written so that NUM and RESULT can be - the same pointers. */ - -static void -_one_mult (num, size, digit, result) - unsigned char *num; - int size, digit; - unsigned char *result; -{ - int carry, value; - unsigned char *nptr, *rptr; - - if (digit == 0) - memset (result, 0, size); - else - { - if (digit == 1) - memcpy (result, num, size); - else - { - /* Initialize */ - nptr = (unsigned char *) (num+size-1); - rptr = (unsigned char *) (result+size-1); - carry = 0; - - while (size-- > 0) - { - value = *nptr-- * digit + carry; - *rptr-- = value % BASE; - carry = value / BASE; - } - - if (carry != 0) *rptr = carry; - } - } -} - - -/* The full division routine. This computes N1 / N2. It returns - 0 if the division is ok and the result is in QUOT. The number of - digits after the decimal point is SCALE. It returns -1 if division - by zero is tried. The algorithm is found in Knuth Vol 2. p237. */ - -int -bc_divide (n1, n2, quot, scale) - bc_num n1, n2, *quot; - int scale; -{ - bc_num qval; - unsigned char *num1, *num2; - unsigned char *ptr1, *ptr2, *n2ptr, *qptr; - int scale1, val; - unsigned int len1, len2, scale2, qdigits, extra, count; - unsigned int qdig, qguess, borrow, carry; - unsigned char *mval; - char zero; - unsigned int norm; - - /* Test for divide by zero. */ - if (bc_is_zero (n2)) return -1; - - /* Test for divide by 1. If it is we must truncate. */ - if (n2->n_scale == 0) - { - if (n2->n_len == 1 && *n2->n_value == 1) - { - qval = bc_new_num (n1->n_len, scale); - qval->n_sign = (n1->n_sign == n2->n_sign ? PLUS : MINUS); - memset (&qval->n_value[n1->n_len],0,scale); - memcpy (qval->n_value, n1->n_value, - n1->n_len + MIN(n1->n_scale,scale)); - bc_free_num (quot); - *quot = qval; - } - } - - /* Set up the divide. Move the decimal point on n1 by n2's scale. - Remember, zeros on the end of num2 are wasted effort for dividing. */ - scale2 = n2->n_scale; - n2ptr = (unsigned char *) n2->n_value+n2->n_len+scale2-1; - while ((scale2 > 0) && (*n2ptr-- == 0)) scale2--; - - len1 = n1->n_len + scale2; - scale1 = n1->n_scale - scale2; - if (scale1 < scale) - extra = scale - scale1; - else - extra = 0; - num1 = (unsigned char *) malloc (n1->n_len+n1->n_scale+extra+2); - if (num1 == NULL) bc_out_of_memory(); - memset (num1, 0, n1->n_len+n1->n_scale+extra+2); - memcpy (num1+1, n1->n_value, n1->n_len+n1->n_scale); - - len2 = n2->n_len + scale2; - num2 = (unsigned char *) malloc (len2+1); - if (num2 == NULL) bc_out_of_memory(); - memcpy (num2, n2->n_value, len2); - *(num2+len2) = 0; - n2ptr = num2; - while (*n2ptr == 0) - { - n2ptr++; - len2--; - } - - /* Calculate the number of quotient digits. */ - if (len2 > len1+scale) - { - qdigits = scale+1; - zero = TRUE; - } - else - { - zero = FALSE; - if (len2>len1) - qdigits = scale+1; /* One for the zero integer part. */ - else - qdigits = len1-len2+scale+1; - } - - /* Allocate and zero the storage for the quotient. */ - qval = bc_new_num (qdigits-scale,scale); - memset (qval->n_value, 0, qdigits); - - /* Allocate storage for the temporary storage mval. */ - mval = (unsigned char *) malloc (len2+1); - if (mval == NULL) bc_out_of_memory (); - - /* Now for the full divide algorithm. */ - if (!zero) - { - /* Normalize */ - norm = 10 / ((int)*n2ptr + 1); - if (norm != 1) - { - _one_mult (num1, len1+scale1+extra+1, norm, num1); - _one_mult (n2ptr, len2, norm, n2ptr); - } - - /* Initialize divide loop. */ - qdig = 0; - if (len2 > len1) - qptr = (unsigned char *) qval->n_value+len2-len1; - else - qptr = (unsigned char *) qval->n_value; - - /* Loop */ - while (qdig <= len1+scale-len2) - { - /* Calculate the quotient digit guess. */ - if (*n2ptr == num1[qdig]) - qguess = 9; - else - qguess = (num1[qdig]*10 + num1[qdig+1]) / *n2ptr; - - /* Test qguess. */ - if (n2ptr[1]*qguess > - (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 - + num1[qdig+2]) - { - qguess--; - /* And again. */ - if (n2ptr[1]*qguess > - (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 - + num1[qdig+2]) - qguess--; - } - - /* Multiply and subtract. */ - borrow = 0; - if (qguess != 0) - { - *mval = 0; - _one_mult (n2ptr, len2, qguess, mval+1); - ptr1 = (unsigned char *) num1+qdig+len2; - ptr2 = (unsigned char *) mval+len2; - for (count = 0; count < len2+1; count++) - { - val = (int) *ptr1 - (int) *ptr2-- - borrow; - if (val < 0) - { - val += 10; - borrow = 1; - } - else - borrow = 0; - *ptr1-- = val; - } - } - - /* Test for negative result. */ - if (borrow == 1) - { - qguess--; - ptr1 = (unsigned char *) num1+qdig+len2; - ptr2 = (unsigned char *) n2ptr+len2-1; - carry = 0; - for (count = 0; count < len2; count++) - { - val = (int) *ptr1 + (int) *ptr2-- + carry; - if (val > 9) - { - val -= 10; - carry = 1; - } - else - carry = 0; - *ptr1-- = val; - } - if (carry == 1) *ptr1 = (*ptr1 + 1) % 10; - } - - /* We now know the quotient digit. */ - *qptr++ = qguess; - qdig++; - } - } - - /* Clean up and return the number. */ - qval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); - if (bc_is_zero (qval)) qval->n_sign = PLUS; - _bc_rm_leading_zeros (qval); - bc_free_num (quot); - *quot = qval; - - /* Clean up temporary storage. */ - free (mval); - free (num1); - free (num2); - - return 0; /* Everything is OK. */ -} - - -/* Division *and* modulo for numbers. This computes both NUM1 / NUM2 and - NUM1 % NUM2 and puts the results in QUOT and REM, except that if QUOT - is NULL then that store will be omitted. - */ - -int -bc_divmod (num1, num2, quot, rem, scale) - bc_num num1, num2, *quot, *rem; - int scale; -{ - bc_num quotient = NULL; - bc_num temp; - int rscale; - - /* Check for correct numbers. */ - if (bc_is_zero (num2)) return -1; - - /* Calculate final scale. */ - rscale = MAX (num1->n_scale, num2->n_scale+scale); - bc_init_num(&temp); - - /* Calculate it. */ - bc_divide (num1, num2, &temp, scale); - if (quot) - quotient = bc_copy_num (temp); - bc_multiply (temp, num2, &temp, rscale); - bc_sub (num1, temp, rem, rscale); - bc_free_num (&temp); - - if (quot) - { - bc_free_num (quot); - *quot = quotient; - } - - return 0; /* Everything is OK. */ -} - - -/* Modulo for numbers. This computes NUM1 % NUM2 and puts the - result in RESULT. */ - -int -bc_modulo (num1, num2, result, scale) - bc_num num1, num2, *result; - int scale; -{ - return bc_divmod (num1, num2, NULL, result, scale); -} - -/* Raise BASE to the EXPO power, reduced modulo MOD. The result is - placed in RESULT. If a EXPO is not an integer, - only the integer part is used. */ - -int -bc_raisemod (base, expo, mod, result, scale) - bc_num base, expo, mod, *result; - int scale; -{ - bc_num power, exponent, parity, temp; - int rscale; - - /* Check for correct numbers. */ - if (bc_is_zero(mod)) return -1; - if (bc_is_neg(expo)) return -1; - - /* Set initial values. */ - power = bc_copy_num (base); - exponent = bc_copy_num (expo); - temp = bc_copy_num (_one_); - bc_init_num(&parity); - - /* Check the base for scale digits. */ - if (base->n_scale != 0) - bc_rt_warn ("non-zero scale in base"); - - /* Check the exponent for scale digits. */ - if (exponent->n_scale != 0) - { - bc_rt_warn ("non-zero scale in exponent"); - bc_divide (exponent, _one_, &exponent, 0); /*truncate */ - } - - /* Check the modulus for scale digits. */ - if (mod->n_scale != 0) - bc_rt_warn ("non-zero scale in modulus"); - - /* Do the calculation. */ - rscale = MAX(scale, base->n_scale); - while ( !bc_is_zero(exponent) ) - { - (void) bc_divmod (exponent, _two_, &exponent, &parity, 0); - if ( !bc_is_zero(parity) ) - { - bc_multiply (temp, power, &temp, rscale); - (void) bc_modulo (temp, mod, &temp, scale); - } - - bc_multiply (power, power, &power, rscale); - (void) bc_modulo (power, mod, &power, scale); - } - - /* Assign the value. */ - bc_free_num (&power); - bc_free_num (&exponent); - bc_free_num (result); - *result = temp; - return 0; /* Everything is OK. */ -} - -/* Raise NUM1 to the NUM2 power. The result is placed in RESULT. - Maximum exponent is LONG_MAX. If a NUM2 is not an integer, - only the integer part is used. */ - -void -bc_raise (num1, num2, result, scale) - bc_num num1, num2, *result; - int scale; -{ - bc_num temp, power; - long exponent; - int rscale; - int pwrscale; - int calcscale; - char neg; - - /* Check the exponent for scale digits and convert to a long. */ - if (num2->n_scale != 0) - bc_rt_warn ("non-zero scale in exponent"); - exponent = bc_num2long (num2); - if (exponent == 0 && (num2->n_len > 1 || num2->n_value[0] != 0)) - bc_rt_error ("exponent too large in raise"); - - /* Special case if exponent is a zero. */ - if (exponent == 0) - { - bc_free_num (result); - *result = bc_copy_num (_one_); - return; - } - - /* Other initializations. */ - if (exponent < 0) - { - neg = TRUE; - exponent = -exponent; - rscale = scale; - } - else - { - neg = FALSE; - rscale = MIN (num1->n_scale*exponent, MAX(scale, num1->n_scale)); - } - - /* Set initial value of temp. */ - power = bc_copy_num (num1); - pwrscale = num1->n_scale; - while ((exponent & 1) == 0) - { - pwrscale = 2*pwrscale; - bc_multiply (power, power, &power, pwrscale); - exponent = exponent >> 1; - } - temp = bc_copy_num (power); - calcscale = pwrscale; - exponent = exponent >> 1; - - /* Do the calculation. */ - while (exponent > 0) - { - pwrscale = 2*pwrscale; - bc_multiply (power, power, &power, pwrscale); - if ((exponent & 1) == 1) { - calcscale = pwrscale + calcscale; - bc_multiply (temp, power, &temp, calcscale); - } - exponent = exponent >> 1; - } - - /* Assign the value. */ - if (neg) - { - bc_divide (_one_, temp, result, rscale); - bc_free_num (&temp); - } - else - { - bc_free_num (result); - *result = temp; - if ((*result)->n_scale > rscale) - (*result)->n_scale = rscale; - } - bc_free_num (&power); -} - -/* Take the square root NUM and return it in NUM with SCALE digits - after the decimal place. */ - -int -bc_sqrt (num, scale) - bc_num *num; - int scale; -{ - int rscale, cmp_res, done; - int cscale; - bc_num guess, guess1, point5, diff; - - /* Initial checks. */ - cmp_res = bc_compare (*num, _zero_); - if (cmp_res < 0) - return 0; /* error */ - else - { - if (cmp_res == 0) - { - bc_free_num (num); - *num = bc_copy_num (_zero_); - return 1; - } - } - cmp_res = bc_compare (*num, _one_); - if (cmp_res == 0) - { - bc_free_num (num); - *num = bc_copy_num (_one_); - return 1; - } - - /* Initialize the variables. */ - rscale = MAX (scale, (*num)->n_scale); - bc_init_num(&guess); - bc_init_num(&guess1); - bc_init_num(&diff); - point5 = bc_new_num (1,1); - point5->n_value[1] = 5; - - - /* Calculate the initial guess. */ - if (cmp_res < 0) - { - /* The number is between 0 and 1. Guess should start at 1. */ - guess = bc_copy_num (_one_); - cscale = (*num)->n_scale; - } - else - { - /* The number is greater than 1. Guess should start at 10^(exp/2). */ - bc_int2num (&guess,10); - - bc_int2num (&guess1,(*num)->n_len); - bc_multiply (guess1, point5, &guess1, 0); - guess1->n_scale = 0; - bc_raise (guess, guess1, &guess, 0); - bc_free_num (&guess1); - cscale = 3; - } - - /* Find the square root using Newton's algorithm. */ - done = FALSE; - while (!done) - { - bc_free_num (&guess1); - guess1 = bc_copy_num (guess); - bc_divide (*num, guess, &guess, cscale); - bc_add (guess, guess1, &guess, 0); - bc_multiply (guess, point5, &guess, cscale); - bc_sub (guess, guess1, &diff, cscale+1); - if (bc_is_near_zero (diff, cscale)) - { - if (cscale < rscale+1) - cscale = MIN (cscale*3, rscale+1); - else - done = TRUE; - } - } - - /* Assign the number and clean up. */ - bc_free_num (num); - bc_divide (guess,_one_,num,rscale); - bc_free_num (&guess); - bc_free_num (&guess1); - bc_free_num (&point5); - bc_free_num (&diff); - return 1; -} - - -/* The following routines provide output for bcd numbers package - using the rules of POSIX bc for output. */ - -/* This structure is used for saving digits in the conversion process. */ -typedef struct stk_rec { - long digit; - struct stk_rec *next; -} stk_rec; - -/* The reference string for digits. */ -static char ref_str[] = "0123456789ABCDEF"; - - -/* A special output routine for "multi-character digits." Exactly - SIZE characters must be output for the value VAL. If SPACE is - non-zero, we must output one space before the number. OUT_CHAR - is the actual routine for writing the characters. */ - -void -bc_out_long (val, size, space, out_char) - long val; - int size, space; -#ifdef __STDC__ - void (*out_char)(int); -#else - void (*out_char)(); -#endif -{ - char digits[40]; - int len, ix; - - if (space) (*out_char) (' '); - sprintf (digits, "%ld", val); - len = strlen (digits); - while (size > len) - { - (*out_char) ('0'); - size--; - } - for (ix=0; ix < len; ix++) - (*out_char) (digits[ix]); -} - -/* Output of a bcd number. NUM is written in base O_BASE using OUT_CHAR - as the routine to do the actual output of the characters. */ - -void -bc_out_num (num, o_base, out_char, leading_zero) - bc_num num; - int o_base; -#ifdef __STDC__ - void (*out_char)(int); -#else - void (*out_char)(); -#endif - int leading_zero; -{ - char *nptr; - int index, fdigit, pre_space; - stk_rec *digits, *temp; - bc_num int_part, frac_part, base, cur_dig, t_num, max_o_digit; - - /* The negative sign if needed. */ - if (num->n_sign == MINUS) (*out_char) ('-'); - - /* Output the number. */ - if (bc_is_zero (num)) - (*out_char) ('0'); - else - if (o_base == 10) - { - /* The number is in base 10, do it the fast way. */ - nptr = num->n_value; - if (num->n_len > 1 || *nptr != 0) - for (index=num->n_len; index>0; index--) - (*out_char) (BCD_CHAR(*nptr++)); - else - nptr++; - - if (leading_zero && bc_is_zero (num)) - (*out_char) ('0'); - - /* Now the fraction. */ - if (num->n_scale > 0) - { - (*out_char) ('.'); - for (index=0; indexn_scale; index++) - (*out_char) (BCD_CHAR(*nptr++)); - } - } - else - { - /* special case ... */ - if (leading_zero && bc_is_zero (num)) - (*out_char) ('0'); - - /* The number is some other base. */ - digits = NULL; - bc_init_num (&int_part); - bc_divide (num, _one_, &int_part, 0); - bc_init_num (&frac_part); - bc_init_num (&cur_dig); - bc_init_num (&base); - bc_sub (num, int_part, &frac_part, 0); - /* Make the INT_PART and FRAC_PART positive. */ - int_part->n_sign = PLUS; - frac_part->n_sign = PLUS; - bc_int2num (&base, o_base); - bc_init_num (&max_o_digit); - bc_int2num (&max_o_digit, o_base-1); - - - /* Get the digits of the integer part and push them on a stack. */ - while (!bc_is_zero (int_part)) - { - bc_modulo (int_part, base, &cur_dig, 0); - temp = (stk_rec *) malloc (sizeof(stk_rec)); - if (temp == NULL) bc_out_of_memory(); - temp->digit = bc_num2long (cur_dig); - temp->next = digits; - digits = temp; - bc_divide (int_part, base, &int_part, 0); - } - - /* Print the digits on the stack. */ - if (digits != NULL) - { - /* Output the digits. */ - while (digits != NULL) - { - temp = digits; - digits = digits->next; - if (o_base <= 16) - (*out_char) (ref_str[ (int) temp->digit]); - else - bc_out_long (temp->digit, max_o_digit->n_len, 1, out_char); - free (temp); - } - } - - /* Get and print the digits of the fraction part. */ - if (num->n_scale > 0) - { - (*out_char) ('.'); - pre_space = 0; - t_num = bc_copy_num (_one_); - while (t_num->n_len <= num->n_scale) { - bc_multiply (frac_part, base, &frac_part, num->n_scale); - fdigit = bc_num2long (frac_part); - bc_int2num (&int_part, fdigit); - bc_sub (frac_part, int_part, &frac_part, 0); - if (o_base <= 16) - (*out_char) (ref_str[fdigit]); - else { - bc_out_long (fdigit, max_o_digit->n_len, pre_space, out_char); - pre_space = 1; - } - bc_multiply (t_num, base, &t_num, 0); - } - bc_free_num (&t_num); - } - - /* Clean up. */ - bc_free_num (&int_part); - bc_free_num (&frac_part); - bc_free_num (&base); - bc_free_num (&cur_dig); - bc_free_num (&max_o_digit); - } -} -/* Convert a number NUM to a long. The function returns only the integer - part of the number. For numbers that are too large to represent as - a long, this function returns a zero. This can be detected by checking - the NUM for zero after having a zero returned. */ - -long -bc_num2long (num) - bc_num num; -{ - long val; - char *nptr; - int index; - - /* Extract the int value, ignore the fraction. */ - val = 0; - nptr = num->n_value; - for (index=num->n_len; (index>0) && (val<=(LONG_MAX/BASE)); index--) - val = val*BASE + *nptr++; - - /* Check for overflow. If overflow, return zero. */ - if (index>0) val = 0; - if (val < 0) val = 0; - - /* Return the value. */ - if (num->n_sign == PLUS) - return (val); - else - return (-val); -} - - -/* Convert an integer VAL to a bc number NUM. */ - -void -bc_int2num (num, val) - bc_num *num; - int val; -{ - char buffer[30]; - char *bptr, *vptr; - int ix = 1; - char neg = 0; - - /* Sign. */ - if (val < 0) - { - neg = 1; - val = -val; - } - - /* Get things going. */ - bptr = buffer; - *bptr++ = val % BASE; - val = val / BASE; - - /* Extract remaining digits. */ - while (val != 0) - { - *bptr++ = val % BASE; - val = val / BASE; - ix++; /* Count the digits. */ - } - - /* Make the number. */ - bc_free_num (num); - *num = bc_new_num (ix, 0); - if (neg) (*num)->n_sign = MINUS; - - /* Assign the digits. */ - vptr = (*num)->n_value; - while (ix-- > 0) - *vptr++ = *--bptr; -} - -/* Convert a numbers to a string. Base 10 only.*/ - -char -*num2str (num) - bc_num num; -{ - char *str, *sptr; - char *nptr; - int index, signch; - - /* Allocate the string memory. */ - signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */ - if (num->n_scale > 0) - str = (char *) malloc (num->n_len + num->n_scale + 2 + signch); - else - str = (char *) malloc (num->n_len + 1 + signch); - if (str == NULL) bc_out_of_memory(); - - /* The negative sign if needed. */ - sptr = str; - if (signch) *sptr++ = '-'; - - /* Load the whole number. */ - nptr = num->n_value; - for (index=num->n_len; index>0; index--) - *sptr++ = BCD_CHAR(*nptr++); - - /* Now the fraction. */ - if (num->n_scale > 0) - { - *sptr++ = '.'; - for (index=0; indexn_scale; index++) - *sptr++ = BCD_CHAR(*nptr++); - } - - /* Terminate the string and return it! */ - *sptr = '\0'; - return (str); -} -/* Convert strings to bc numbers. Base 10 only.*/ - -void -bc_str2num (num, str, scale) - bc_num *num; - char *str; - int scale; -{ - int digits, strscale; - char *ptr, *nptr; - char zero_int; - - /* Prepare num. */ - bc_free_num (num); - - /* Check for valid number and count digits. */ - ptr = str; - digits = 0; - strscale = 0; - zero_int = FALSE; - if ( (*ptr == '+') || (*ptr == '-')) ptr++; /* Sign */ - while (*ptr == '0') ptr++; /* Skip leading zeros. */ - while (isdigit((int)*ptr)) ptr++, digits++; /* digits */ - if (*ptr == '.') ptr++; /* decimal point */ - while (isdigit((int)*ptr)) ptr++, strscale++; /* digits */ - if ((*ptr != '\0') || (digits+strscale == 0)) - { - *num = bc_copy_num (_zero_); - return; - } - - /* Adjust numbers and allocate storage and initialize fields. */ - strscale = MIN(strscale, scale); - if (digits == 0) - { - zero_int = TRUE; - digits = 1; - } - *num = bc_new_num (digits, strscale); - - /* Build the whole number. */ - ptr = str; - if (*ptr == '-') - { - (*num)->n_sign = MINUS; - ptr++; - } - else - { - (*num)->n_sign = PLUS; - if (*ptr == '+') ptr++; - } - while (*ptr == '0') ptr++; /* Skip leading zeros. */ - nptr = (*num)->n_value; - if (zero_int) - { - *nptr++ = 0; - digits = 0; - } - for (;digits > 0; digits--) - *nptr++ = CH_VAL(*ptr++); - - - /* Build the fractional part. */ - if (strscale > 0) - { - ptr++; /* skip the decimal point! */ - for (;strscale > 0; strscale--) - *nptr++ = CH_VAL(*ptr++); - } -} - -/* pn prints the number NUM in base 10. */ - -static void -out_char (int c) -{ - putchar(c); -} - - -void -pn (num) - bc_num num; -{ - bc_out_num (num, 10, out_char, 0); - out_char ('\n'); -} - - -/* pv prints a character array as if it was a string of bcd digits. */ -void -pv (name, num, len) - char *name; - unsigned char *num; - int len; -{ - int i; - printf ("%s=", name); - for (i=0; i -#include -#include "number.h" -#ifndef VARARGS -#include -#else -#include -#endif - -/* from number.c ... */ -extern int mul_base_digits; -/* extern int mul_small_digits; */ -extern bc_num _one_; - -/* global variables */ -int test_n = 1000; -int test_time = 30 * CLOCKS_PER_SEC; /* 30 seconds */ - -/* Other things for number.c. */ -int std_only; - -void -out_of_memory() -{ - fprintf (stderr, "Fatal error: Out of memory for malloc.\n"); - exit (1); -} - -/* Runtime error will print a message and stop the machine. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_error (char *mesg, ...) -#else -void -rt_error (mesg) - char *mesg; -#endif -#else -void -rt_error (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - char error_mesg [255]; - -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vsprintf (error_mesg, mesg, args); - va_end (args); - - fprintf (stderr, "Runtime error: %s\n", error_mesg); -} - -/* A runtime warning tells of some action taken by the processor that - may change the program execution but was not enough of a problem - to stop the execution. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_warn (char *mesg, ...) -#else -void -rt_warn (mesg) - char *mesg; -#endif -#else -void -rt_warn (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - char error_mesg [255]; - -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vsprintf (error_mesg, mesg, args); - va_end (args); - - fprintf (stderr, "Runtime warning: %s\n", error_mesg); -} - -void -out_char (int ch) -{ - putchar (ch); -} - -/* Time stuff !!! */ - -int -timeit ( bc_num a, bc_num b, int *n) -{ - clock_t first; - int i, res; - bc_num c; - - bc_init_num (&c); - first = clock(); - *n = 0; - do { - for (i=0; i 1) - if (strcmp (argv[1], "-d") == 0) - debug = 1; - - bc_init_numbers(); - bc_init_num (&ten); - bc_init_num (&num); - bc_init_num (&expo); - bc_init_num (&big); - bc_int2num (&ten, 10); - - if (debug) - fprintf (stderr, "Timings are for %d multiplies\n" - "Minimum time is %d seconds\n", test_n, - test_time/CLOCKS_PER_SEC); - - /* Two of the same size */ - min = 10; - max = 500; - - if (debug) - fprintf (stderr, "Testing numbers of the same length.\n"); - - while (min < max) { - mid = (min+max)/2; - if (debug) fprintf (stderr,"Checking %d...\n", mid); - - bc_int2num (&expo, mid); - bc_raise (ten, expo, &num, 0); - bc_sub (num, _one_, &num, 0); - - mul_base_digits = 2*mid+1; - t1 = timeit (num, num, &n1); - permul1 = (float)t1/(float)n1; - - mul_base_digits = 2*mid-1; - t2 = timeit (num, num, &n2); - permul2 = (float)t2/(float)n2; - - if (permul1 < permul2) - min = mid+1; - else - max = mid-1; - - if (debug) { - fprintf (stderr, "n1 = %d :: n2 = %d\n", n1, n2); - fprintf (stderr, "p1 = %f :: p2 = %f\n", permul1, permul2); - } - } - - if (debug) - fprintf (stderr, "Base digits crossover at %d digits\n", min); - printf ("#define MUL_BASE_DIGITS %d\n", 2*min); - - -#if 0 - mul_base_digits = min; - - /* Small one times a big one. */ - - smallsize = min/2; - bc_int2num (&expo, smallsize); - bc_raise (ten, expo, &big, 0); - bc_sub (num, _one_, &big, 0); - - min = min / 2; - max = 500; - - if (debug) - fprintf (stderr, "Testing numbers of the different length.\n"); - - while (min < max) { - mid = (min+max)/2; - if (debug) fprintf (stderr, "Checking %d...\n", mid); - - bc_int2num (&expo, mid-smallsize); - bc_raise (ten, expo, &num, 0); - bc_sub (num, _one_, &num, 0); - - mul_small_digits = mid+1; - t1 = timeit (big, num, &n1); - permul1 = (float)t1/(float)n1; - - mul_small_digits = mid-1; - t2 = timeit (big, num, &n2); - permul2 = (float)t2/(float)n2; - - if (permul1 < permul2) - min = mid+1; - else - max = mid-1; - - if (debug) { - fprintf (stderr, "n1 = %d :: n2 = %d\n", n1, n2); - fprintf (stderr, "p1 = %f :: p2 = %f\n", permul1, permul2); - } - } - - if (debug) - fprintf (stderr, "Non equal digits crossover at %d total digits\n", min); - printf ("#define MUL_SMALL_DIGITS = %d\n", min); - -#endif - - return 0; -} diff --git a/contrib/bc/lib/vfprintf.c b/contrib/bc/lib/vfprintf.c deleted file mode 100644 index ad53d0c37a9b..000000000000 --- a/contrib/bc/lib/vfprintf.c +++ /dev/null @@ -1,31 +0,0 @@ -/* vfprintf.c -- this was provided for minix. It may not - work on any other system. */ - -#include "config.h" -#ifndef HAVE_VPRINTF -#ifndef HAVE_DOPRINT - #error need vfprintf() or doprint() -#else - -#ifdef HAVE_LIB_H -#include -#endif -#ifdef HAVE_STDARG_H -#include -#endif -#ifdef HAVE_STDIO_H -#include -#endif - -int vfprintf(file, format, argp) -FILE *file; -_CONST char *format; -va_list argp; -{ - _doprintf(file, format, argp); - if (testflag(file, PERPRINTF)) fflush(file); - return 0; -} - -#endif /* HAVE_DOPRINT */ -#endif /* !HAVE_VFPRINTF */ diff --git a/contrib/bc/missing b/contrib/bc/missing deleted file mode 100755 index e4b838ca924d..000000000000 --- a/contrib/bc/missing +++ /dev/null @@ -1,134 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. -# Copyright (C) 1996, 1997 Free Software Foundation, Inc. -# Franc,ois Pinard , 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -case "$1" in - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison touch file \`y.tab.c' - makeinfo touch the output file - yacc touch file \`y.tab.c'" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing - GNU libit 0.0" - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - - aclocal) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`acinclude.m4' or \`configure.in'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`configure.in'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`acconfig.h' or \`configure.in'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - touch config.h.in - ;; - - automake) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print \ - | sed 's/^\(.*\).am$/touch \1.in/' \ - | sh - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - your modified any \`.y' file. For being effective, your - modifications might require the \`Bison' package. Grab it from - any GNU archive site." - touch y.tab.c - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` - fi - touch $file - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequirements for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 diff --git a/contrib/bc/mkinstalldirs b/contrib/bc/mkinstalldirs deleted file mode 100755 index cc8783edce30..000000000000 --- a/contrib/bc/mkinstalldirs +++ /dev/null @@ -1,36 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman -# Created: 1993-05-16 -# Last modified: 1994-03-25 -# Public domain - -errstatus=0 - -for file in ${1+"$@"} ; do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d in ${1+"$@"} ; do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" 1>&2 - mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$? - fi - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/contrib/bc/stamp-h.in b/contrib/bc/stamp-h.in deleted file mode 100644 index 9788f70238c9..000000000000 --- a/contrib/bc/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/contrib/bind9/CHANGES b/contrib/bind9/CHANGES index 1f2c35a14113..0e9c9a6b4986 100644 --- a/contrib/bind9/CHANGES +++ b/contrib/bind9/CHANGES @@ -1,3 +1,21 @@ + --- 9.6.1-P3 released --- + +2831. [security] Do not attempt to validate or cache + out-of-bailiwick data returned with a secure + answer; it must be re-fetched from its original + source and validated in that context. [RT #20819] + +2828. [security] Cached CNAME or DNAME RR could be returned to clients + without DNSSEC validation. [RT #20737] + +2827. [security] Bogus NXDOMAIN could be cached as if valid. [RT #20712] + + --- 9.6.1-P2 released --- + +2772. [security] When validating, track whether pending data was from + the additional section or not and only return it if + validates as secure. [RT #20438] + --- 9.6.1-P1 released --- 2640. [security] A specially crafted update packet will cause named diff --git a/contrib/bind9/FAQ b/contrib/bind9/FAQ index 2846b31fe091..b256ed8b10a3 100644 --- a/contrib/bind9/FAQ +++ b/contrib/bind9/FAQ @@ -153,24 +153,29 @@ A: BIND 9.3 and later: Use TSIG to select the appropriate view. Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { - match-clients { !key external; 10.0.1/24; }; + match-clients { !key external; // reject message ment for the + // external view. + 10.0.1/24; }; // accept from these addresses. ... }; view "external" { match-clients { key external; any; }; - server 10.0.1.2 { keys external; }; + server 10.0.1.2 { keys external; }; // tag messages from the + // external view to the + // other servers for the + // view. recursion no; ... }; Slave 10.0.1.2: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; @@ -220,13 +225,13 @@ A: You choose one view to be master and the second a slave and transfer Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; key "mykey" { - algorithm hmac-md5; - secret "yyyyyyyy"; + algorithm hmac-sha256; + secret "yyyyyyyyyyyyyyyyyyyyyyyy"; }; view "internal" { @@ -239,7 +244,7 @@ A: You choose one view to be master and the second a slave and transfer type master; file "internal/example.db"; allow-update { key mykey; }; - notify-also { 10.0.1.1; }; + also-notify { 10.0.1.1; }; }; }; @@ -249,7 +254,7 @@ A: You choose one view to be master and the second a slave and transfer type slave; file "external/example.db"; masters { 10.0.1.1; }; - transfer-source { 10.0.1.1; }; + transfer-source 10.0.1.1; // allow-update-forwarding { any; }; // allow-notify { ... }; }; diff --git a/contrib/bind9/FAQ.xml b/contrib/bind9/FAQ.xml index 95346f7d052a..65e8efc53a27 100644 --- a/contrib/bind9/FAQ.xml +++ b/contrib/bind9/FAQ.xml @@ -17,7 +17,7 @@ - PERFORMANCE OF THIS SOFTWARE. --> - +
Frequently Asked Questions about BIND 9 @@ -319,24 +319,29 @@ Slave: 10.0.1.3 (internal), 10.0.1.4 (external, IP alias) Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { - match-clients { !key external; 10.0.1/24; }; + match-clients { !key external; // reject message ment for the + // external view. + 10.0.1/24; }; // accept from these addresses. ... }; view "external" { match-clients { key external; any; }; - server 10.0.1.2 { keys external; }; + server 10.0.1.2 { keys external; }; // tag messages from the + // external view to the + // other servers for the + // view. recursion no; ... }; Slave 10.0.1.2: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; view "internal" { match-clients { !key external; 10.0.1/24; }; @@ -424,13 +429,13 @@ named-checkzone example.com tmp Master 10.0.1.1: key "external" { - algorithm hmac-md5; - secret "xxxxxxxx"; + algorithm hmac-sha256; + secret "xxxxxxxxxxxxxxxxxxxxxxxx"; }; key "mykey" { - algorithm hmac-md5; - secret "yyyyyyyy"; + algorithm hmac-sha256; + secret "yyyyyyyyyyyyyyyyyyyyyyyy"; }; view "internal" { @@ -443,7 +448,7 @@ Master 10.0.1.1: type master; file "internal/example.db"; allow-update { key mykey; }; - notify-also { 10.0.1.1; }; + also-notify { 10.0.1.1; }; }; }; @@ -453,7 +458,7 @@ Master 10.0.1.1: type slave; file "external/example.db"; masters { 10.0.1.1; }; - transfer-source { 10.0.1.1; }; + transfer-source 10.0.1.1; // allow-update-forwarding { any; }; // allow-notify { ... }; }; diff --git a/contrib/bind9/bin/dig/dighost.c b/contrib/bind9/bin/dig/dighost.c index 470261cb2da7..73264e6c2ce9 100644 --- a/contrib/bind9/bin/dig/dighost.c +++ b/contrib/bind9/bin/dig/dighost.c @@ -2604,10 +2604,12 @@ connect_done(isc_task_t *task, isc_event_t *event) { if (sevent->result == ISC_R_CANCELED) { debug("in cancel handler"); - isc_socket_detach(&query->sock); - sockcount--; - INSIST(sockcount >= 0); - debug("sockcount=%d", sockcount); + if (query->sock != NULL) { + isc_socket_detach(&query->sock); + sockcount--; + INSIST(sockcount >= 0); + debug("sockcount=%d", sockcount); + } query->waiting_connect = ISC_FALSE; isc_event_free(&event); l = query->lookup; diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.8 b/contrib/bind9/bin/dnssec/dnssec-signzone.8 index 84e613f721b0..1e779271c346 100644 --- a/contrib/bind9/bin/dnssec/dnssec-signzone.8 +++ b/contrib/bind9/bin/dnssec/dnssec-signzone.8 @@ -13,163 +13,287 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.\" $Id: dnssec-signzone.8,v 1.47.44.4 2009/06/09 01:47:19 each Exp $ +.\" $Id: dnssec-signzone.8,v 1.47.44.4.8.1 2009/12/31 23:17:46 tbox Exp $ .\" .hy 0 .ad l -.\"Generated by db2man.xsl. Don't modify this, modify the source. -.de Sh \" Subsection -.br -.if t .Sp -.ne 5 -.PP -\fB\\$1\fR -.PP -.. -.de Sp \" Vertical space (when we can't use .PP) -.if t .sp .5v -.if n .sp -.. -.de Ip \" List item -.br -.ie \\n(.$>=3 .ne \\$3 -.el .ne 3 -.IP "\\$1" \\$2 -.. -.TH "DNSSEC-SIGNZONE" 8 "June 08, 2009" "" "" -.SH NAME -dnssec-signzone \- DNSSEC zone signing tool +.\" Title: dnssec\-signzone +.\" Author: +.\" Generator: DocBook XSL Stylesheets v1.71.1 +.\" Date: June 08, 2009 +.\" Manual: BIND9 +.\" Source: BIND9 +.\" +.TH "DNSSEC\-SIGNZONE" "8" "June 08, 2009" "BIND9" "BIND9" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +dnssec\-signzone \- DNSSEC zone signing tool .SH "SYNOPSIS" .HP 16 -\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fIclass\fR\fR] [\fB\-d\ \fIdirectory\fR\fR] [\fB\-e\ \fIend\-time\fR\fR] [\fB\-f\ \fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fIkey\fR\fR] [\fB\-l\ \fIdomain\fR\fR] [\fB\-i\ \fIinterval\fR\fR] [\fB\-I\ \fIinput\-format\fR\fR] [\fB\-j\ \fIjitter\fR\fR] [\fB\-N\ \fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fIorigin\fR\fR] [\fB\-O\ \fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-r\ \fIrandomdev\fR\fR] [\fB\-s\ \fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fIsalt\fR\fR] [\fB\-H\ \fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...] +\fBdnssec\-signzone\fR [\fB\-a\fR] [\fB\-c\ \fR\fB\fIclass\fR\fR] [\fB\-d\ \fR\fB\fIdirectory\fR\fR] [\fB\-e\ \fR\fB\fIend\-time\fR\fR] [\fB\-f\ \fR\fB\fIoutput\-file\fR\fR] [\fB\-g\fR] [\fB\-h\fR] [\fB\-k\ \fR\fB\fIkey\fR\fR] [\fB\-l\ \fR\fB\fIdomain\fR\fR] [\fB\-i\ \fR\fB\fIinterval\fR\fR] [\fB\-I\ \fR\fB\fIinput\-format\fR\fR] [\fB\-j\ \fR\fB\fIjitter\fR\fR] [\fB\-N\ \fR\fB\fIsoa\-serial\-format\fR\fR] [\fB\-o\ \fR\fB\fIorigin\fR\fR] [\fB\-O\ \fR\fB\fIoutput\-format\fR\fR] [\fB\-p\fR] [\fB\-r\ \fR\fB\fIrandomdev\fR\fR] [\fB\-s\ \fR\fB\fIstart\-time\fR\fR] [\fB\-t\fR] [\fB\-v\ \fR\fB\fIlevel\fR\fR] [\fB\-z\fR] [\fB\-3\ \fR\fB\fIsalt\fR\fR] [\fB\-H\ \fR\fB\fIiterations\fR\fR] [\fB\-A\fR] {zonefile} [key...] .SH "DESCRIPTION" .PP -\fBdnssec\-signzone\fR signs a zone\&. It generates NSEC and RRSIG records and produces a signed version of the zone\&. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a \fIkeyset\fR file for each child zone\&. +\fBdnssec\-signzone\fR +signs a zone. It generates NSEC and RRSIG records and produces a signed version of the zone. The security status of delegations from the signed zone (that is, whether the child zones are secure or not) is determined by the presence or absence of a +\fIkeyset\fR +file for each child zone. .SH "OPTIONS" -.TP +.PP \-a -Verify all generated signatures\&. -.TP -\-c \fIclass\fR -Specifies the DNS class of the zone\&. -.TP -\-k \fIkey\fR -Treat specified key as a key signing key ignoring any key flags\&. This option may be specified multiple times\&. -.TP -\-l \fIdomain\fR -Generate a DLV set in addition to the key (DNSKEY) and DS sets\&. The domain is appended to the name of the records\&. -.TP -\-d \fIdirectory\fR -Look for \fIkeyset\fR files in \fBdirectory\fR as the directory -.TP -\-g -Generate DS records for child zones from keyset files\&. Existing DS records will be removed\&. -.TP -\-s \fIstart\-time\fR -Specify the date and time when the generated RRSIG records become valid\&. This can be either an absolute or relative time\&. An absolute start time is indicated by a number in YYYYMMDDHHMMSS notation; 20000530144500 denotes 14:45:00 UTC on May 30th, 2000\&. A relative start time is indicated by +N, which is N seconds from the current time\&. If no \fBstart\-time\fR is specified, the current time minus 1 hour (to allow for clock skew) is used\&. -.TP -\-e \fIend\-time\fR -Specify the date and time when the generated RRSIG records expire\&. As with \fBstart\-time\fR, an absolute time is indicated in YYYYMMDDHHMMSS notation\&. A time relative to the start time is indicated with +N, which is N seconds from the start time\&. A time relative to the current time is indicated with now+N\&. If no \fBend\-time\fR is specified, 30 days from the start time is used as a default\&. -.TP -\-f \fIoutput\-file\fR -The name of the output file containing the signed zone\&. The default is to append \fI\&.signed\fR to the input filename\&. -.TP -\-h -Prints a short summary of the options and arguments to \fBdnssec\-signzone\fR\&. -.TP -\-i \fIinterval\fR -When a previously\-signed zone is passed as input, records may be resigned\&. The \fBinterval\fR option specifies the cycle interval as an offset from the current time (in seconds)\&. If a RRSIG record expires after the cycle interval, it is retained\&. Otherwise, it is considered to be expiring soon, and it will be replaced\&. -The default cycle interval is one quarter of the difference between the signature end and start times\&. So if neither \fBend\-time\fR or \fBstart\-time\fR are specified, \fBdnssec\-signzone\fR generates signatures that are valid for 30 days, with a cycle interval of 7\&.5 days\&. Therefore, if any existing RRSIG records are due to expire in less than 7\&.5 days, they would be replaced\&. -.TP -\-I \fIinput\-format\fR -The format of the input zone file\&. Possible formats are \fB"text"\fR (default) and \fB"raw"\fR\&. This option is primarily intended to be used for dynamic signed zones so that the dumped zone file in a non\-text format containing updates can be signed directly\&. The use of this option does not make much sense for non\-dynamic zones\&. -.TP -\-j \fIjitter\fR -When signing a zone with a fixed signature lifetime, all RRSIG records issued at the time of signing expires simultaneously\&. If the zone is incrementally signed, i\&.e\&. a previously\-signed zone is passed as input to the signer, all expired signatures have to be regenerated at about the same time\&. The \fBjitter\fR option specifies a jitter window that will be used to randomize the signature expire time, thus spreading incremental signature regeneration over time\&. -Signature lifetime jitter also to some extent benefits validators and servers by spreading out cache expiration, i\&.e\&. if large numbers of RRSIGs don't expire at the same time from all caches there will be less congestion than if all validators need to refetch at mostly the same time\&. -.TP -\-n \fIncpus\fR -Specifies the number of threads to use\&. By default, one thread is started for each detected CPU\&. -.TP -\-N \fIsoa\-serial\-format\fR -The SOA serial number format of the signed zone\&. Possible formats are \fB"keep"\fR (default), \fB"increment"\fR and \fB"unixtime"\fR\&. -.RS -.TP -\fB"keep"\fR -Do not modify the SOA serial number\&. -.TP -\fB"increment"\fR -Increment the SOA serial number using RFC 1982 arithmetics\&. -.TP -\fB"unixtime"\fR -Set the SOA serial number to the number of seconds since epoch\&. +.RS 4 +Verify all generated signatures. .RE -.IP -.TP +.PP +\-c \fIclass\fR +.RS 4 +Specifies the DNS class of the zone. +.RE +.PP +\-k \fIkey\fR +.RS 4 +Treat specified key as a key signing key ignoring any key flags. This option may be specified multiple times. +.RE +.PP +\-l \fIdomain\fR +.RS 4 +Generate a DLV set in addition to the key (DNSKEY) and DS sets. The domain is appended to the name of the records. +.RE +.PP +\-d \fIdirectory\fR +.RS 4 +Look for +\fIkeyset\fR +files in +\fBdirectory\fR +as the directory +.RE +.PP +\-g +.RS 4 +Generate DS records for child zones from keyset files. Existing DS records will be removed. +.RE +.PP +\-s \fIstart\-time\fR +.RS 4 +Specify the date and time when the generated RRSIG records become valid. This can be either an absolute or relative time. An absolute start time is indicated by a number in YYYYMMDDHHMMSS notation; 20000530144500 denotes 14:45:00 UTC on May 30th, 2000. A relative start time is indicated by +N, which is N seconds from the current time. If no +\fBstart\-time\fR +is specified, the current time minus 1 hour (to allow for clock skew) is used. +.RE +.PP +\-e \fIend\-time\fR +.RS 4 +Specify the date and time when the generated RRSIG records expire. As with +\fBstart\-time\fR, an absolute time is indicated in YYYYMMDDHHMMSS notation. A time relative to the start time is indicated with +N, which is N seconds from the start time. A time relative to the current time is indicated with now+N. If no +\fBend\-time\fR +is specified, 30 days from the start time is used as a default. +.RE +.PP +\-f \fIoutput\-file\fR +.RS 4 +The name of the output file containing the signed zone. The default is to append +\fI.signed\fR +to the input filename. +.RE +.PP +\-h +.RS 4 +Prints a short summary of the options and arguments to +\fBdnssec\-signzone\fR. +.RE +.PP +\-i \fIinterval\fR +.RS 4 +When a previously\-signed zone is passed as input, records may be resigned. The +\fBinterval\fR +option specifies the cycle interval as an offset from the current time (in seconds). If a RRSIG record expires after the cycle interval, it is retained. Otherwise, it is considered to be expiring soon, and it will be replaced. +.sp +The default cycle interval is one quarter of the difference between the signature end and start times. So if neither +\fBend\-time\fR +or +\fBstart\-time\fR +are specified, +\fBdnssec\-signzone\fR +generates signatures that are valid for 30 days, with a cycle interval of 7.5 days. Therefore, if any existing RRSIG records are due to expire in less than 7.5 days, they would be replaced. +.RE +.PP +\-I \fIinput\-format\fR +.RS 4 +The format of the input zone file. Possible formats are +\fB"text"\fR +(default) and +\fB"raw"\fR. This option is primarily intended to be used for dynamic signed zones so that the dumped zone file in a non\-text format containing updates can be signed directly. The use of this option does not make much sense for non\-dynamic zones. +.RE +.PP +\-j \fIjitter\fR +.RS 4 +When signing a zone with a fixed signature lifetime, all RRSIG records issued at the time of signing expires simultaneously. If the zone is incrementally signed, i.e. a previously\-signed zone is passed as input to the signer, all expired signatures have to be regenerated at about the same time. The +\fBjitter\fR +option specifies a jitter window that will be used to randomize the signature expire time, thus spreading incremental signature regeneration over time. +.sp +Signature lifetime jitter also to some extent benefits validators and servers by spreading out cache expiration, i.e. if large numbers of RRSIGs don't expire at the same time from all caches there will be less congestion than if all validators need to refetch at mostly the same time. +.RE +.PP +\-n \fIncpus\fR +.RS 4 +Specifies the number of threads to use. By default, one thread is started for each detected CPU. +.RE +.PP +\-N \fIsoa\-serial\-format\fR +.RS 4 +The SOA serial number format of the signed zone. Possible formats are +\fB"keep"\fR +(default), +\fB"increment"\fR +and +\fB"unixtime"\fR. +.RS 4 +.PP +\fB"keep"\fR +.RS 4 +Do not modify the SOA serial number. +.RE +.PP +\fB"increment"\fR +.RS 4 +Increment the SOA serial number using RFC 1982 arithmetics. +.RE +.PP +\fB"unixtime"\fR +.RS 4 +Set the SOA serial number to the number of seconds since epoch. +.RE +.RE +.RE +.PP \-o \fIorigin\fR -The zone origin\&. If not specified, the name of the zone file is assumed to be the origin\&. -.TP +.RS 4 +The zone origin. If not specified, the name of the zone file is assumed to be the origin. +.RE +.PP \-O \fIoutput\-format\fR -The format of the output file containing the signed zone\&. Possible formats are \fB"text"\fR (default) and \fB"raw"\fR\&. -.TP +.RS 4 +The format of the output file containing the signed zone. Possible formats are +\fB"text"\fR +(default) and +\fB"raw"\fR. +.RE +.PP \-p -Use pseudo\-random data when signing the zone\&. This is faster, but less secure, than using real random data\&. This option may be useful when signing large zones or when the entropy source is limited\&. -.TP +.RS 4 +Use pseudo\-random data when signing the zone. This is faster, but less secure, than using real random data. This option may be useful when signing large zones or when the entropy source is limited. +.RE +.PP \-r \fIrandomdev\fR -Specifies the source of randomness\&. If the operating system does not provide a \fI/dev/random\fR or equivalent device, the default source of randomness is keyboard input\&. \fIrandomdev\fR specifies the name of a character device or file containing random data to be used instead of the default\&. The special value \fIkeyboard\fR indicates that keyboard input should be used\&. -.TP +.RS 4 +Specifies the source of randomness. If the operating system does not provide a +\fI/dev/random\fR +or equivalent device, the default source of randomness is keyboard input. +\fIrandomdev\fR +specifies the name of a character device or file containing random data to be used instead of the default. The special value +\fIkeyboard\fR +indicates that keyboard input should be used. +.RE +.PP \-t -Print statistics at completion\&. -.TP +.RS 4 +Print statistics at completion. +.RE +.PP \-v \fIlevel\fR -Sets the debugging level\&. -.TP +.RS 4 +Sets the debugging level. +.RE +.PP \-z -Ignore KSK flag on key when determining what to sign\&. -.TP +.RS 4 +Ignore KSK flag on key when determining what to sign. +.RE +.PP \-3 \fIsalt\fR -Generate a NSEC3 chain with the given hex encoded salt\&. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain\&. -.TP +.RS 4 +Generate a NSEC3 chain with the given hex encoded salt. A dash (\fIsalt\fR) can be used to indicate that no salt is to be used when generating the NSEC3 chain. +.RE +.PP \-H \fIiterations\fR -When generating a NSEC3 chain use this many interations\&. The default is 100\&. -.TP +.RS 4 +When generating a NSEC3 chain use this many interations. The default is 100. +.RE +.PP \-A -When generating a NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations\&. -.TP +.RS 4 +When generating a NSEC3 chain set the OPTOUT flag on all NSEC3 records and do not generate NSEC3 records for insecure delegations. +.RE +.PP zonefile -The file containing the zone to be signed\&. -.TP +.RS 4 +The file containing the zone to be signed. +.RE +.PP key -Specify which keys should be used to sign the zone\&. If no keys are specified, then the zone will be examined for DNSKEY records at the zone apex\&. If these are found and there are matching private keys, in the current directory, then these will be used for signing\&. +.RS 4 +Specify which keys should be used to sign the zone. If no keys are specified, then the zone will be examined for DNSKEY records at the zone apex. If these are found and there are matching private keys, in the current directory, then these will be used for signing. +.RE .SH "EXAMPLE" .PP -The following command signs the \fBexample\&.com\fR zone with the DSA key generated by \fBdnssec\-keygen\fR (Kexample\&.com\&.+003+17247)\&. The zone's keys must be in the master file (\fIdb\&.example\&.com\fR)\&. This invocation looks for \fIkeyset\fR files, in the current directory, so that DS records can be generated from them (\fB\-g\fR)\&. +The following command signs the +\fBexample.com\fR +zone with the DSA key generated by +\fBdnssec\-keygen\fR +(Kexample.com.+003+17247). The zone's keys must be in the master file (\fIdb.example.com\fR). This invocation looks for +\fIkeyset\fR +files, in the current directory, so that DS records can be generated from them (\fB\-g\fR). +.sp +.RS 4 .nf -% dnssec\-signzone \-g \-o example\&.com db\&.example\&.com \\ -Kexample\&.com\&.+003+17247 -db\&.example\&.com\&.signed +% dnssec\-signzone \-g \-o example.com db.example.com \\ +Kexample.com.+003+17247 +db.example.com.signed % .fi +.RE .PP -In the above example, \fBdnssec\-signzone\fR creates the file \fIdb\&.example\&.com\&.signed\fR\&. This file should be referenced in a zone statement in a \fInamed\&.conf\fR file\&. +In the above example, +\fBdnssec\-signzone\fR +creates the file +\fIdb.example.com.signed\fR. This file should be referenced in a zone statement in a +\fInamed.conf\fR +file. .PP -This example re\-signs a previously signed zone with default parameters\&. The private keys are assumed to be in the current directory\&. +This example re\-signs a previously signed zone with default parameters. The private keys are assumed to be in the current directory. +.sp +.RS 4 .nf -% cp db\&.example\&.com\&.signed db\&.example\&.com -% dnssec\-signzone \-o example\&.com db\&.example\&.com -db\&.example\&.com\&.signed +% cp db.example.com.signed db.example.com +% dnssec\-signzone \-o example.com db.example.com +db.example.com.signed % .fi +.RE .SH "KNOWN BUGS" .PP - \fBdnssec\-signzone\fR was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys needed to produce a fully\-signed zone\&. This permits a zone administrator, for example, to sign a zone with one key on one machine, move the resulting partially\-signed zone to a second machine, and sign it again with a second key\&. +\fBdnssec\-signzone\fR +was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys needed to produce a fully\-signed zone. This permits a zone administrator, for example, to sign a zone with one key on one machine, move the resulting partially\-signed zone to a second machine, and sign it again with a second key. .PP -An unfortunate side\-effect of this flexibility is that \fBdnssec\-signzone\fR does not check to make sure it's signing a zone with any valid keys at all\&. An attempt to sign a zone without any keys will appear to succeed, producing a "signed" zone with no signatures\&. There is no warning issued when a zone is not fully signed\&. +An unfortunate side\-effect of this flexibility is that +\fBdnssec\-signzone\fR +does not check to make sure it's signing a zone with any valid keys at all. An attempt to sign a zone without any keys will appear to succeed, producing a "signed" zone with no signatures. There is no warning issued when a zone is not fully signed. .PP -This will be corrected in a future release\&. In the meantime, ISC recommends examining the output of \fBdnssec\-signzone\fR to confirm that the zone is properly signed by all keys before using it\&. +This will be corrected in a future release. In the meantime, ISC recommends examining the output of +\fBdnssec\-signzone\fR +to confirm that the zone is properly signed by all keys before using it. .SH "SEE ALSO" .PP -\fBdnssec\-keygen\fR(8), BIND 9 Administrator Reference Manual, RFC 4033\&. +\fBdnssec\-keygen\fR(8), +BIND 9 Administrator Reference Manual, +RFC 4033. .SH "AUTHOR" .PP -Internet Systems Consortium +Internet Systems Consortium +.SH "COPYRIGHT" +Copyright \(co 2004\-2009 Internet Systems Consortium, Inc. ("ISC") +.br +Copyright \(co 2000\-2003 Internet Software Consortium. +.br diff --git a/contrib/bind9/bin/dnssec/dnssec-signzone.html b/contrib/bind9/bin/dnssec/dnssec-signzone.html index 5eb8626e6431..652d5c4355f2 100644 --- a/contrib/bind9/bin/dnssec/dnssec-signzone.html +++ b/contrib/bind9/bin/dnssec/dnssec-signzone.html @@ -14,12 +14,12 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + dnssec-signzone - +
@@ -32,7 +32,7 @@

dnssec-signzone [-a] [-c class] [-d directory] [-e end-time] [-f output-file] [-g] [-h] [-k key] [-l domain] [-i interval] [-I input-format] [-j jitter] [-N soa-serial-format] [-o origin] [-O output-format] [-p] [-r randomdev] [-s start-time] [-t] [-v level] [-z] [-3 salt] [-H iterations] [-A] {zonefile} [key...]

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -43,7 +43,7 @@

-

OPTIONS

+

OPTIONS

-a

@@ -258,7 +258,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -287,7 +287,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -312,14 +312,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/bin/named/query.c b/contrib/bind9/bin/named/query.c index ffd9b3554a76..a56d2e646f7f 100644 --- a/contrib/bind9/bin/named/query.c +++ b/contrib/bind9/bin/named/query.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: query.c,v 1.313.20.7 2009/03/13 01:38:51 marka Exp $ */ +/* $Id: query.c,v 1.313.20.7.12.4 2009/12/31 22:53:03 each Exp $ */ /*! \file */ @@ -116,6 +116,8 @@ #define DNS_GETDB_NOLOG 0x02U #define DNS_GETDB_PARTIAL 0x04U +#define PENDINGOK(x) (((x) & DNS_DBFIND_PENDINGOK) != 0) + typedef struct client_additionalctx { ns_client_t *client; dns_rdataset_t *rdataset; @@ -1158,7 +1160,8 @@ query_addadditional(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { goto cleanup; } result = dns_db_find(db, name, version, type, - client->query.dboptions | DNS_DBFIND_GLUEOK, + client->query.dboptions | + DNS_DBFIND_GLUEOK | DNS_DBFIND_ADDITIONALOK, client->now, &node, fname, rdataset, sigrdataset); if (result == DNS_R_GLUE && @@ -1643,7 +1646,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { goto try_glue; result = dns_db_find(db, name, version, type, - client->query.dboptions | DNS_DBFIND_GLUEOK, + client->query.dboptions | + DNS_DBFIND_GLUEOK | DNS_DBFIND_ADDITIONALOK, client->now, &node, fname, NULL, NULL); if (result == ISC_R_SUCCESS) goto found; @@ -1761,8 +1765,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { */ if (result == ISC_R_SUCCESS && additionaltype == dns_rdatasetadditional_fromcache && - (rdataset->trust == dns_trust_pending || - rdataset->trust == dns_trust_glue) && + (DNS_TRUST_PENDING(rdataset->trust) || + DNS_TRUST_GLUE(rdataset->trust)) && !validate(client, db, fname, rdataset, sigrdataset)) { dns_rdataset_disassociate(rdataset); if (dns_rdataset_isassociated(sigrdataset)) @@ -1801,8 +1805,8 @@ query_addadditional2(void *arg, dns_name_t *name, dns_rdatatype_t qtype) { */ if (result == ISC_R_SUCCESS && additionaltype == dns_rdatasetadditional_fromcache && - (rdataset->trust == dns_trust_pending || - rdataset->trust == dns_trust_glue) && + (DNS_TRUST_PENDING(rdataset->trust) || + DNS_TRUST_GLUE(rdataset->trust)) && !validate(client, db, fname, rdataset, sigrdataset)) { dns_rdataset_disassociate(rdataset); if (dns_rdataset_isassociated(sigrdataset)) @@ -2601,14 +2605,14 @@ query_addbestns(ns_client_t *client) { /* * Attempt to validate RRsets that are pending or that are glue. */ - if ((rdataset->trust == dns_trust_pending || - (sigrdataset != NULL && sigrdataset->trust == dns_trust_pending)) + if ((DNS_TRUST_PENDING(rdataset->trust) || + (sigrdataset != NULL && DNS_TRUST_PENDING(sigrdataset->trust))) && !validate(client, db, fname, rdataset, sigrdataset) && - (client->query.dboptions & DNS_DBFIND_PENDINGOK) == 0) + !PENDINGOK(client->query.dboptions)) goto cleanup; - if ((rdataset->trust == dns_trust_glue || - (sigrdataset != NULL && sigrdataset->trust == dns_trust_glue)) && + if ((DNS_TRUST_GLUE(rdataset->trust) || + (sigrdataset != NULL && DNS_TRUST_GLUE(sigrdataset->trust))) && !validate(client, db, fname, rdataset, sigrdataset) && SECURE(client) && WANTDNSSEC(client)) goto cleanup; diff --git a/contrib/bind9/doc/arm/Bv9ARM.pdf b/contrib/bind9/doc/arm/Bv9ARM.pdf index b56a05d52962..fbb664f8b275 100644 --- a/contrib/bind9/doc/arm/Bv9ARM.pdf +++ b/contrib/bind9/doc/arm/Bv9ARM.pdf @@ -480,596 +480,608 @@ endobj (6.2.10.2 The category Phrase) endobj 325 0 obj -<< /S /GoTo /D (subsection.6.2.11) >> +<< /S /GoTo /D (subsubsection.6.2.10.3) >> endobj 328 0 obj -(6.2.11 lwres Statement Grammar) +(6.2.10.3 The query-errors Category) endobj 329 0 obj -<< /S /GoTo /D (subsection.6.2.12) >> +<< /S /GoTo /D (subsection.6.2.11) >> endobj 332 0 obj -(6.2.12 lwres Statement Definition and Usage) +(6.2.11 lwres Statement Grammar) endobj 333 0 obj -<< /S /GoTo /D (subsection.6.2.13) >> +<< /S /GoTo /D (subsection.6.2.12) >> endobj 336 0 obj -(6.2.13 masters Statement Grammar) +(6.2.12 lwres Statement Definition and Usage) endobj 337 0 obj -<< /S /GoTo /D (subsection.6.2.14) >> +<< /S /GoTo /D (subsection.6.2.13) >> endobj 340 0 obj -(6.2.14 masters Statement Definition and Usage) +(6.2.13 masters Statement Grammar) endobj 341 0 obj -<< /S /GoTo /D (subsection.6.2.15) >> +<< /S /GoTo /D (subsection.6.2.14) >> endobj 344 0 obj -(6.2.15 options Statement Grammar) +(6.2.14 masters Statement Definition and Usage) endobj 345 0 obj -<< /S /GoTo /D (subsection.6.2.16) >> +<< /S /GoTo /D (subsection.6.2.15) >> endobj 348 0 obj -(6.2.16 options Statement Definition and Usage) +(6.2.15 options Statement Grammar) endobj 349 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.1) >> +<< /S /GoTo /D (subsection.6.2.16) >> endobj 352 0 obj -(6.2.16.1 Boolean Options) +(6.2.16 options Statement Definition and Usage) endobj 353 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.2) >> +<< /S /GoTo /D (subsubsection.6.2.16.1) >> endobj 356 0 obj -(6.2.16.2 Forwarding) +(6.2.16.1 Boolean Options) endobj 357 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.3) >> +<< /S /GoTo /D (subsubsection.6.2.16.2) >> endobj 360 0 obj -(6.2.16.3 Dual-stack Servers) +(6.2.16.2 Forwarding) endobj 361 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.4) >> +<< /S /GoTo /D (subsubsection.6.2.16.3) >> endobj 364 0 obj -(6.2.16.4 Access Control) +(6.2.16.3 Dual-stack Servers) endobj 365 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.5) >> +<< /S /GoTo /D (subsubsection.6.2.16.4) >> endobj 368 0 obj -(6.2.16.5 Interfaces) +(6.2.16.4 Access Control) endobj 369 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.6) >> +<< /S /GoTo /D (subsubsection.6.2.16.5) >> endobj 372 0 obj -(6.2.16.6 Query Address) +(6.2.16.5 Interfaces) endobj 373 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.7) >> +<< /S /GoTo /D (subsubsection.6.2.16.6) >> endobj 376 0 obj -(6.2.16.7 Zone Transfers) +(6.2.16.6 Query Address) endobj 377 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.8) >> +<< /S /GoTo /D (subsubsection.6.2.16.7) >> endobj 380 0 obj -(6.2.16.8 UDP Port Lists) +(6.2.16.7 Zone Transfers) endobj 381 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.9) >> +<< /S /GoTo /D (subsubsection.6.2.16.8) >> endobj 384 0 obj -(6.2.16.9 Operating System Resource Limits) +(6.2.16.8 UDP Port Lists) endobj 385 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.10) >> +<< /S /GoTo /D (subsubsection.6.2.16.9) >> endobj 388 0 obj -(6.2.16.10 Server Resource Limits) +(6.2.16.9 Operating System Resource Limits) endobj 389 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.11) >> +<< /S /GoTo /D (subsubsection.6.2.16.10) >> endobj 392 0 obj -(6.2.16.11 Periodic Task Intervals) +(6.2.16.10 Server Resource Limits) endobj 393 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.12) >> +<< /S /GoTo /D (subsubsection.6.2.16.11) >> endobj 396 0 obj -(6.2.16.12 Topology) +(6.2.16.11 Periodic Task Intervals) endobj 397 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.13) >> +<< /S /GoTo /D (subsubsection.6.2.16.12) >> endobj 400 0 obj -(6.2.16.13 The sortlist Statement) +(6.2.16.12 Topology) endobj 401 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.14) >> +<< /S /GoTo /D (subsubsection.6.2.16.13) >> endobj 404 0 obj -(6.2.16.14 RRset Ordering) +(6.2.16.13 The sortlist Statement) endobj 405 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.15) >> +<< /S /GoTo /D (subsubsection.6.2.16.14) >> endobj 408 0 obj -(6.2.16.15 Tuning) +(6.2.16.14 RRset Ordering) endobj 409 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.16) >> +<< /S /GoTo /D (subsubsection.6.2.16.15) >> endobj 412 0 obj -(6.2.16.16 Built-in server information zones) +(6.2.16.15 Tuning) endobj 413 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.17) >> +<< /S /GoTo /D (subsubsection.6.2.16.16) >> endobj 416 0 obj -(6.2.16.17 Built-in Empty Zones) +(6.2.16.16 Built-in server information zones) endobj 417 0 obj -<< /S /GoTo /D (subsubsection.6.2.16.18) >> +<< /S /GoTo /D (subsubsection.6.2.16.17) >> endobj 420 0 obj -(6.2.16.18 Additional Section Caching) +(6.2.16.17 Built-in Empty Zones) endobj 421 0 obj -<< /S /GoTo /D (subsection.6.2.17) >> +<< /S /GoTo /D (subsubsection.6.2.16.18) >> endobj 424 0 obj -(6.2.17 statistics-channels Statement Grammar) +(6.2.16.18 Additional Section Caching) endobj 425 0 obj -<< /S /GoTo /D (subsection.6.2.18) >> +<< /S /GoTo /D (subsection.6.2.17) >> endobj 428 0 obj -(6.2.18 statistics-channels Statement Definition and Usage) +(6.2.17 server Statement Grammar) endobj 429 0 obj -<< /S /GoTo /D (subsection.6.2.19) >> +<< /S /GoTo /D (subsection.6.2.18) >> endobj 432 0 obj -(6.2.19 server Statement Grammar) +(6.2.18 server Statement Definition and Usage) endobj 433 0 obj -<< /S /GoTo /D (subsection.6.2.20) >> +<< /S /GoTo /D (subsection.6.2.19) >> endobj 436 0 obj -(6.2.20 server Statement Definition and Usage) +(6.2.19 statistics-channels Statement Grammar) endobj 437 0 obj -<< /S /GoTo /D (subsection.6.2.21) >> +<< /S /GoTo /D (subsection.6.2.20) >> endobj 440 0 obj -(6.2.21 trusted-keys Statement Grammar) +(6.2.20 statistics-channels Statement Definition and Usage) endobj 441 0 obj -<< /S /GoTo /D (subsection.6.2.22) >> +<< /S /GoTo /D (subsection.6.2.21) >> endobj 444 0 obj -(6.2.22 trusted-keys Statement Definition and Usage) +(6.2.21 trusted-keys Statement Grammar) endobj 445 0 obj -<< /S /GoTo /D (subsection.6.2.23) >> +<< /S /GoTo /D (subsection.6.2.22) >> endobj 448 0 obj -(6.2.23 view Statement Grammar) +(6.2.22 trusted-keys Statement Definition and Usage) endobj 449 0 obj -<< /S /GoTo /D (subsection.6.2.24) >> +<< /S /GoTo /D (subsection.6.2.23) >> endobj 452 0 obj -(6.2.24 view Statement Definition and Usage) +(6.2.23 view Statement Grammar) endobj 453 0 obj -<< /S /GoTo /D (subsection.6.2.25) >> +<< /S /GoTo /D (subsection.6.2.24) >> endobj 456 0 obj -(6.2.25 zone Statement Grammar) +(6.2.24 view Statement Definition and Usage) endobj 457 0 obj -<< /S /GoTo /D (subsection.6.2.26) >> +<< /S /GoTo /D (subsection.6.2.25) >> endobj 460 0 obj -(6.2.26 zone Statement Definition and Usage) +(6.2.25 zone Statement Grammar) endobj 461 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.1) >> +<< /S /GoTo /D (subsection.6.2.26) >> endobj 464 0 obj -(6.2.26.1 Zone Types) +(6.2.26 zone Statement Definition and Usage) endobj 465 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.2) >> +<< /S /GoTo /D (subsubsection.6.2.26.1) >> endobj 468 0 obj -(6.2.26.2 Class) +(6.2.26.1 Zone Types) endobj 469 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.3) >> +<< /S /GoTo /D (subsubsection.6.2.26.2) >> endobj 472 0 obj -(6.2.26.3 Zone Options) +(6.2.26.2 Class) endobj 473 0 obj -<< /S /GoTo /D (subsubsection.6.2.26.4) >> +<< /S /GoTo /D (subsubsection.6.2.26.3) >> endobj 476 0 obj -(6.2.26.4 Dynamic Update Policies) +(6.2.26.3 Zone Options) endobj 477 0 obj -<< /S /GoTo /D (section.6.3) >> +<< /S /GoTo /D (subsubsection.6.2.26.4) >> endobj 480 0 obj -(6.3 Zone File) +(6.2.26.4 Dynamic Update Policies) endobj 481 0 obj -<< /S /GoTo /D (subsection.6.3.1) >> +<< /S /GoTo /D (section.6.3) >> endobj 484 0 obj -(6.3.1 Types of Resource Records and When to Use Them) +(6.3 Zone File) endobj 485 0 obj -<< /S /GoTo /D (subsubsection.6.3.1.1) >> +<< /S /GoTo /D (subsection.6.3.1) >> endobj 488 0 obj -(6.3.1.1 Resource Records) +(6.3.1 Types of Resource Records and When to Use Them) endobj 489 0 obj -<< /S /GoTo /D (subsubsection.6.3.1.2) >> +<< /S /GoTo /D (subsubsection.6.3.1.1) >> endobj 492 0 obj -(6.3.1.2 Textual expression of RRs) +(6.3.1.1 Resource Records) endobj 493 0 obj -<< /S /GoTo /D (subsection.6.3.2) >> +<< /S /GoTo /D (subsubsection.6.3.1.2) >> endobj 496 0 obj -(6.3.2 Discussion of MX Records) +(6.3.1.2 Textual expression of RRs) endobj 497 0 obj -<< /S /GoTo /D (subsection.6.3.3) >> +<< /S /GoTo /D (subsection.6.3.2) >> endobj 500 0 obj -(6.3.3 Setting TTLs) +(6.3.2 Discussion of MX Records) endobj 501 0 obj -<< /S /GoTo /D (subsection.6.3.4) >> +<< /S /GoTo /D (subsection.6.3.3) >> endobj 504 0 obj -(6.3.4 Inverse Mapping in IPv4) +(6.3.3 Setting TTLs) endobj 505 0 obj -<< /S /GoTo /D (subsection.6.3.5) >> +<< /S /GoTo /D (subsection.6.3.4) >> endobj 508 0 obj -(6.3.5 Other Zone File Directives) +(6.3.4 Inverse Mapping in IPv4) endobj 509 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.1) >> +<< /S /GoTo /D (subsection.6.3.5) >> endobj 512 0 obj -(6.3.5.1 The \044ORIGIN Directive) +(6.3.5 Other Zone File Directives) endobj 513 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.2) >> +<< /S /GoTo /D (subsubsection.6.3.5.1) >> endobj 516 0 obj -(6.3.5.2 The \044INCLUDE Directive) +(6.3.5.1 The \044ORIGIN Directive) endobj 517 0 obj -<< /S /GoTo /D (subsubsection.6.3.5.3) >> +<< /S /GoTo /D (subsubsection.6.3.5.2) >> endobj 520 0 obj -(6.3.5.3 The \044TTL Directive) +(6.3.5.2 The \044INCLUDE Directive) endobj 521 0 obj -<< /S /GoTo /D (subsection.6.3.6) >> +<< /S /GoTo /D (subsubsection.6.3.5.3) >> endobj 524 0 obj -(6.3.6 BIND Master File Extension: the \044GENERATE Directive) +(6.3.5.3 The \044TTL Directive) endobj 525 0 obj -<< /S /GoTo /D (subsection.6.3.7) >> +<< /S /GoTo /D (subsection.6.3.6) >> endobj 528 0 obj -(6.3.7 Additional File Formats) +(6.3.6 BIND Master File Extension: the \044GENERATE Directive) endobj 529 0 obj -<< /S /GoTo /D (section.6.4) >> +<< /S /GoTo /D (subsection.6.3.7) >> endobj 532 0 obj -(6.4 BIND9 Statistics) +(6.3.7 Additional File Formats) endobj 533 0 obj -<< /S /GoTo /D (subsubsection.6.4.0.1) >> +<< /S /GoTo /D (section.6.4) >> endobj 536 0 obj -(6.4.0.1 The Statistics File) +(6.4 BIND9 Statistics) endobj 537 0 obj -<< /S /GoTo /D (subsection.6.4.1) >> +<< /S /GoTo /D (subsubsection.6.4.0.1) >> endobj 540 0 obj -(6.4.1 Statistics Counters) +(6.4.0.1 The Statistics File) endobj 541 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.1) >> +<< /S /GoTo /D (subsection.6.4.1) >> endobj 544 0 obj -(6.4.1.1 Name Server Statistics Counters) +(6.4.1 Statistics Counters) endobj 545 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.2) >> +<< /S /GoTo /D (subsubsection.6.4.1.1) >> endobj 548 0 obj -(6.4.1.2 Zone Maintenance Statistics Counters) +(6.4.1.1 Name Server Statistics Counters) endobj 549 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.3) >> +<< /S /GoTo /D (subsubsection.6.4.1.2) >> endobj 552 0 obj -(6.4.1.3 Resolver Statistics Counters) +(6.4.1.2 Zone Maintenance Statistics Counters) endobj 553 0 obj -<< /S /GoTo /D (subsubsection.6.4.1.4) >> +<< /S /GoTo /D (subsubsection.6.4.1.3) >> endobj 556 0 obj -(6.4.1.4 Compatibility with BIND 8 Counters) +(6.4.1.3 Resolver Statistics Counters) endobj 557 0 obj -<< /S /GoTo /D (chapter.7) >> +<< /S /GoTo /D (subsubsection.6.4.1.4) >> endobj 560 0 obj -(7 BIND 9 Security Considerations) +(6.4.1.4 Socket I/O Statistics Counters) endobj 561 0 obj -<< /S /GoTo /D (section.7.1) >> +<< /S /GoTo /D (subsubsection.6.4.1.5) >> endobj 564 0 obj -(7.1 Access Control Lists) +(6.4.1.5 Compatibility with BIND 8 Counters) endobj 565 0 obj -<< /S /GoTo /D (section.7.2) >> +<< /S /GoTo /D (chapter.7) >> endobj 568 0 obj -(7.2 Chroot and Setuid) +(7 BIND 9 Security Considerations) endobj 569 0 obj -<< /S /GoTo /D (subsection.7.2.1) >> +<< /S /GoTo /D (section.7.1) >> endobj 572 0 obj -(7.2.1 The chroot Environment) +(7.1 Access Control Lists) endobj 573 0 obj -<< /S /GoTo /D (subsection.7.2.2) >> +<< /S /GoTo /D (section.7.2) >> endobj 576 0 obj -(7.2.2 Using the setuid Function) +(7.2 Chroot and Setuid) endobj 577 0 obj -<< /S /GoTo /D (section.7.3) >> +<< /S /GoTo /D (subsection.7.2.1) >> endobj 580 0 obj -(7.3 Dynamic Update Security) +(7.2.1 The chroot Environment) endobj 581 0 obj -<< /S /GoTo /D (chapter.8) >> +<< /S /GoTo /D (subsection.7.2.2) >> endobj 584 0 obj -(8 Troubleshooting) +(7.2.2 Using the setuid Function) endobj 585 0 obj -<< /S /GoTo /D (section.8.1) >> +<< /S /GoTo /D (section.7.3) >> endobj 588 0 obj -(8.1 Common Problems) +(7.3 Dynamic Update Security) endobj 589 0 obj -<< /S /GoTo /D (subsection.8.1.1) >> +<< /S /GoTo /D (chapter.8) >> endobj 592 0 obj -(8.1.1 It's not working; how can I figure out what's wrong?) +(8 Troubleshooting) endobj 593 0 obj -<< /S /GoTo /D (section.8.2) >> +<< /S /GoTo /D (section.8.1) >> endobj 596 0 obj -(8.2 Incrementing and Changing the Serial Number) +(8.1 Common Problems) endobj 597 0 obj -<< /S /GoTo /D (section.8.3) >> +<< /S /GoTo /D (subsection.8.1.1) >> endobj 600 0 obj -(8.3 Where Can I Get Help?) +(8.1.1 It's not working; how can I figure out what's wrong?) endobj 601 0 obj -<< /S /GoTo /D (appendix.A) >> +<< /S /GoTo /D (section.8.2) >> endobj 604 0 obj -(A Appendices) +(8.2 Incrementing and Changing the Serial Number) endobj 605 0 obj -<< /S /GoTo /D (section.A.1) >> +<< /S /GoTo /D (section.8.3) >> endobj 608 0 obj -(A.1 Acknowledgments) +(8.3 Where Can I Get Help?) endobj 609 0 obj -<< /S /GoTo /D (subsection.A.1.1) >> +<< /S /GoTo /D (appendix.A) >> endobj 612 0 obj -(A.1.1 A Brief History of the DNS and BIND) +(A Appendices) endobj 613 0 obj -<< /S /GoTo /D (section.A.2) >> +<< /S /GoTo /D (section.A.1) >> endobj 616 0 obj -(A.2 General DNS Reference Information) +(A.1 Acknowledgments) endobj 617 0 obj -<< /S /GoTo /D (subsection.A.2.1) >> +<< /S /GoTo /D (subsection.A.1.1) >> endobj 620 0 obj -(A.2.1 IPv6 addresses \(AAAA\)) +(A.1.1 A Brief History of the DNS and BIND) endobj 621 0 obj -<< /S /GoTo /D (section.A.3) >> +<< /S /GoTo /D (section.A.2) >> endobj 624 0 obj -(A.3 Bibliography \(and Suggested Reading\)) +(A.2 General DNS Reference Information) endobj 625 0 obj -<< /S /GoTo /D (subsection.A.3.1) >> +<< /S /GoTo /D (subsection.A.2.1) >> endobj 628 0 obj -(A.3.1 Request for Comments \(RFCs\)) +(A.2.1 IPv6 addresses \(AAAA\)) endobj 629 0 obj -<< /S /GoTo /D (subsection.A.3.2) >> +<< /S /GoTo /D (section.A.3) >> endobj 632 0 obj -(A.3.2 Internet Drafts) +(A.3 Bibliography \(and Suggested Reading\)) endobj 633 0 obj -<< /S /GoTo /D (subsection.A.3.3) >> +<< /S /GoTo /D (subsection.A.3.1) >> endobj 636 0 obj -(A.3.3 Other Documents About BIND) +(A.3.1 Request for Comments \(RFCs\)) endobj 637 0 obj -<< /S /GoTo /D (appendix.B) >> +<< /S /GoTo /D (subsection.A.3.2) >> endobj 640 0 obj -(B Manual pages) +(A.3.2 Internet Drafts) endobj 641 0 obj -<< /S /GoTo /D (section.B.1) >> +<< /S /GoTo /D (subsection.A.3.3) >> endobj 644 0 obj -(B.1 dig) +(A.3.3 Other Documents About BIND) endobj 645 0 obj -<< /S /GoTo /D (section.B.2) >> +<< /S /GoTo /D (appendix.B) >> endobj 648 0 obj -(B.2 host) +(B Manual pages) endobj 649 0 obj -<< /S /GoTo /D (section.B.3) >> +<< /S /GoTo /D (section.B.1) >> endobj 652 0 obj -(B.3 dnssec-dsfromkey) +(B.1 dig) endobj 653 0 obj -<< /S /GoTo /D (section.B.4) >> +<< /S /GoTo /D (section.B.2) >> endobj 656 0 obj -(B.4 dnssec-keyfromlabel) +(B.2 host) endobj 657 0 obj -<< /S /GoTo /D (section.B.5) >> +<< /S /GoTo /D (section.B.3) >> endobj 660 0 obj -(B.5 dnssec-keygen) +(B.3 dnssec-dsfromkey) endobj 661 0 obj -<< /S /GoTo /D (section.B.6) >> +<< /S /GoTo /D (section.B.4) >> endobj 664 0 obj -(B.6 dnssec-signzone) +(B.4 dnssec-keyfromlabel) endobj 665 0 obj -<< /S /GoTo /D (section.B.7) >> +<< /S /GoTo /D (section.B.5) >> endobj 668 0 obj -(B.7 named-checkconf) +(B.5 dnssec-keygen) endobj 669 0 obj -<< /S /GoTo /D (section.B.8) >> +<< /S /GoTo /D (section.B.6) >> endobj 672 0 obj -(B.8 named-checkzone) +(B.6 dnssec-signzone) endobj 673 0 obj -<< /S /GoTo /D (section.B.9) >> +<< /S /GoTo /D (section.B.7) >> endobj 676 0 obj -(B.9 named) +(B.7 named-checkconf) endobj 677 0 obj -<< /S /GoTo /D (section.B.10) >> +<< /S /GoTo /D (section.B.8) >> endobj 680 0 obj -(B.10 nsupdate) +(B.8 named-checkzone) endobj 681 0 obj -<< /S /GoTo /D (section.B.11) >> +<< /S /GoTo /D (section.B.9) >> endobj 684 0 obj -(B.11 rndc) +(B.9 named) endobj 685 0 obj -<< /S /GoTo /D (section.B.12) >> +<< /S /GoTo /D (section.B.10) >> endobj 688 0 obj -(B.12 rndc.conf) +(B.10 nsupdate) endobj 689 0 obj -<< /S /GoTo /D (section.B.13) >> +<< /S /GoTo /D (section.B.11) >> endobj 692 0 obj -(B.13 rndc-confgen) +(B.11 rndc) endobj 693 0 obj -<< /S /GoTo /D [694 0 R /FitH ] >> +<< /S /GoTo /D (section.B.12) >> endobj -697 0 obj << +696 0 obj +(B.12 rndc.conf) +endobj +697 0 obj +<< /S /GoTo /D (section.B.13) >> +endobj +700 0 obj +(B.13 rndc-confgen) +endobj +701 0 obj +<< /S /GoTo /D [702 0 R /FitH ] >> +endobj +705 0 obj << /Length 236 /Filter /FlateDecode >> stream xÚÁJA †ïó9¶‡M'™d2s´T¥‚Beoâai·Rp·t­ïïÔÕ*êArÉÿ‘ü /A}È–ՓºsžŠvíèƒ ¨B)þP+!ÃlQ¡bJÕÂwìNì1úÈP©)&>áóÚÍ®˜€-A½bEM¦pæêÍÃd¾¼[L+V?ÉcºØt»~÷ršã~[÷í¶Ú~ÝNë a¤(±ø˘’å÷9·MÿÚ<ŸwYŸÝQ DËr;yƒ|ê~üÁÁýhÌ–ÁbïVV_§æŒlåP}&ûÿsßC+WDendstream endobj -694 0 obj << +702 0 obj << /Type /Page -/Contents 697 0 R -/Resources 696 0 R +/Contents 705 0 R +/Resources 704 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R +/Parent 711 0 R >> endobj -695 0 obj << +703 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./isc-logo.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 704 0 R +/PTEX.InfoDict 712 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 255.00000000 149.00000000] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << -/R15 705 0 R -/R9 706 0 R -/R11 707 0 R -/R13 708 0 R +/R15 713 0 R +/R9 714 0 R +/R11 715 0 R +/R13 716 0 R >>/ExtGState << -/R17 709 0 R -/R8 710 0 R ->>/Font << /R19 711 0 R >> +/R17 717 0 R +/R8 718 0 R +>>/Font << /R19 719 0 R >> >> -/Length 712 0 R +/Length 720 0 R /Filter /FlateDecode >> stream @@ -1085,7 +1097,7 @@ x FÑÞIca­Ç0Ú) ¹A¿+ÇÀº ¸|-Tuùa>‚s:½¯•~K“ÒÞV׋„OÒAŠI… ɪÁr2Q“°Ø¨Á>.zÎCN’¦{Õ«'^5Mã»Åûæ¡æÔÊý¹U1z6õßvãpF)ÂÏåìÊ›C£i#]bÝLkS#ˆQÁŽv–¨Ô­«•ÇcHŸ$¬Áê³DI­ÌÑptÅ73*_åª'ŽÚ¿¢ÚòQŒ×è Œ‚,É*Ñ+ôÚ™%vŽ&u߉ xœÉ-¾kz˜ Ï‡Ú Q´Pë3ÈZ§q¢Æ0¯ˆwMÍ?©=õ*_Ç£RïѪëƬ¡”’¢g!SeRâÅéz·ÝŠFLÚŸv ÏÆ狼eÇNdæÌdï"gK2cëÉ—GoOá8GëÏϦ:B Àht[~Ðåõ—×SÒÜ£uˆQk·%È´ÔÛ†ëiATÆÌp[OU‡Ç(zßQã³* *Ñûø®á¾FÅÍ„Ï'µV‡¾;1aŠÑüËŒÜr$¿Íâ9Ë8ˆü ý‚TóþÏÍ÷_oôô¢ññCÙõ"ú*~uÊqæþéïÛ{Ç"ß~±Úú"ú…bùz+·£]OZ,SÏ¥._^·§_\^þ†56g‡3^®Ç5Z©®©¹Uý¶õòÇí÷O¿½<Ó#rYëé»Ë^~¹ÁÇ<ц®5%¥Ü~ÿñsõ\êídŽ3¼4ü~èé[iþÂÈg óžµ|¥Ïà5³m“XSô7…ÿúáò¬ä>!»Î“O÷hKYð¿þîÇ Ó3/¡úôÃgë¾4EO=öï¦üì“­‡v5”ùÜþû‚ék”ùôñR”Ì¡ÌlöÅ·ß_DÍη„Rf.{úÏåYӎͧÿ^ž©í5¬?ývýüeûMüó?Ò ƒendstream endobj -704 0 obj +712 0 obj << /Producer (AFPL Ghostscript 8.51) /CreationDate (D:20050606145621) @@ -1095,46 +1107,46 @@ endobj /Author (Douglas E. Appelt) >> endobj -705 0 obj -[/Separation/PANTONE#201805#20C/DeviceCMYK 713 0 R] +713 0 obj +[/Separation/PANTONE#201805#20C/DeviceCMYK 721 0 R] endobj -706 0 obj -[/Separation/PANTONE#207506#20C/DeviceCMYK 714 0 R] +714 0 obj +[/Separation/PANTONE#207506#20C/DeviceCMYK 722 0 R] endobj -707 0 obj -[/Separation/PANTONE#20301#20C/DeviceCMYK 715 0 R] +715 0 obj +[/Separation/PANTONE#20301#20C/DeviceCMYK 723 0 R] endobj -708 0 obj -[/Separation/PANTONE#20871#20C/DeviceCMYK 716 0 R] +716 0 obj +[/Separation/PANTONE#20871#20C/DeviceCMYK 724 0 R] endobj -709 0 obj +717 0 obj << /Type /ExtGState /SA true >> endobj -710 0 obj +718 0 obj << /Type /ExtGState /OPM 1 >> endobj -711 0 obj +719 0 obj << /BaseFont /NVXWCK#2BTrajanPro-Bold -/FontDescriptor 717 0 R +/FontDescriptor 725 0 R /Type /Font /FirstChar 67 /LastChar 136 /Widths [ 800 0 0 0 0 0 452 0 0 0 0 0 0 0 0 0 582 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 841 633 576 686 590 540 923 827 407 760] -/Encoding 718 0 R +/Encoding 726 0 R /Subtype /Type1 >> endobj -712 0 obj +720 0 obj 2362 endobj -713 0 obj +721 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1145,7 +1157,7 @@ endobj stream xœ«N)-P0PÈ-ÍQH­HÎPsõ, QE¸zFÆ`^-=1°endstream endobj -714 0 obj +722 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1156,7 +1168,7 @@ endobj stream xœ«N)-P0PÈ-ÍQH­HÎPsõ LÑE ‘D Êk8/«endstream endobj -715 0 obj +723 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1167,7 +1179,7 @@ endobj stream xœ«N)-P0TÈ-ÍQH­HÎPq ôLLÑD\=C 0¯=D³endstream endobj -716 0 obj +724 0 obj << /Filter /FlateDecode /FunctionType 4 @@ -1178,7 +1190,7 @@ endobj stream xœ«N)-P0Ð365³TÈ-ÍQH­HÎP€Š™X ‹™›#Ä ô -,ŒÀüZ&‹ˆendstream endobj -717 0 obj +725 0 obj << /Type /FontDescriptor /FontName /NVXWCK#2BTrajanPro-Bold @@ -1191,17 +1203,17 @@ endobj /StemV 138 /MissingWidth 500 /CharSet (/Msmall/C/Ysmall/Nsmall/Osmall/Esmall/Rsmall/S/Ssmall/I/Tsmall/Ismall/Usmall) -/FontFile3 719 0 R +/FontFile3 727 0 R >> endobj -718 0 obj +726 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 127/Nsmall/Tsmall/Esmall/Rsmall/Ysmall/Ssmall/Msmall/Osmall/Ismall/Usmall] >> endobj -719 0 obj +727 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -1224,44 +1236,40 @@ x ȼLçÇ<;— *X³«¥×ÛGâ_Y1ETïƒ4ˆÒ-U…_>´üØ¢æ}õï÷v¼ §ádù#¹rÛŸå¥@ÔÁ\5l…hð<8Ús·’?h¹†!-¶‚*JŠ»,\G/Wé9OW—×µ.Ÿ—­€&¨[”ÄIÁÚ´Ó½7ýáÐäKý¡«¨ðúš.cxQn<¼À°üÖëgöõÁúhíY8³¶+oî^÷ë°‹>9p¯“°¥!ÑÚÙ®ŠðK´¢†#©óRÄlxŽJ”ب¬Ò–àá•{ϳwÿaû’ožÇ£ëHõÅâH9”ç/.~å÷Ë »O·Øèv61Bá5*È<6ÞÍ,‡bh‘˜¶ž\Î]Çé#¹#ØÔÍ1Oúñ°Ï¤5oÂ]цÆß4}h˜î0$å,6ü¼”A,¯?/å;Rôcy6Ò½UJ¿§Y½X^é¶ÙÉŸ‡‹º–2¸K|o½Ø”/Ȩ/ƒ( Â2Ð#žNMKðrˆ rœÛf9ËyZ¸Ú}$«Ö õ–©)  h`iÎGàAç÷´€H+Šˆ…Õ&*áX$žèìVŽhª”—›¾÷‡A1Ý£¤œÏ0‰÷—Hi éƒw~I(Áö2;à]¸L ™x4[¡OÜ,¾®ÆûÂQQ°”FdQ“ƒ¢¬„%\î¢Åâ:Ó;ÈÑ”ÌEb1ž’¡ˆÿ§=$¸¥?Iš¿CÐõ3¾C=VÐ'>·¯ôÌÒ+Ü~8 ç#;úÁ_£×á*qň+ô 8®‚ãÆpêŒ_YR”¾d%a ç¡H\eÄõãDf£Ñ¨­ŽR[kφG¸ù/WT®ò•A5”H¥ÛVoo8hnû)¼ÞÃDn…ñëqÌzfåhý&þcQbµXÇß‚çLŽúõ;{²Ðñðué¿ÊÛÙ†-©[SÄ-Û¼ÔyubÜñhüm´œ4^Ë™ ääšLÿQ‹¡endstream endobj -698 0 obj << -/D [694 0 R /XYZ 85.0394 794.5015 null] +706 0 obj << +/D [702 0 R /XYZ 85.0394 794.5015 null] >> endobj -699 0 obj << -/D [694 0 R /XYZ 85.0394 769.5949 null] +707 0 obj << +/D [702 0 R /XYZ 85.0394 769.5949 null] >> endobj -696 0 obj << -/Font << /F21 702 0 R >> -/XObject << /Im1 695 0 R >> +704 0 obj << +/Font << /F21 710 0 R >> +/XObject << /Im1 703 0 R >> /ProcSet [ /PDF /Text ] >> endobj -722 0 obj << -/Length 999 +730 0 obj << +/Length 1001 /Filter /FlateDecode >> stream -xÚµV]“¢:}÷Wð¨UC6|å‘AT¶\ÀÚÚÝGq†ªQ¼‚;5ÿþ6$Qï¼lÝò!ô±ûôI'„h~D3-dqÊ5›ÈÄÄÔÖ»Ö^À7‰ÁšŽãNëügðó7Ö6ú:«ï0ÁˆpNµÝÀ02 ÆÔÊÛ |;‡ºðª€×Ùtƒ˜È´¨¡éÌ@°»DÝ ·e3GÓm“#‹QÖ ³Á— ˜q‹ZZ¶Õ88M“hgT¶ù9ôÊÃDZxy­G¿³¯š‰‘yK cX7Ž/b\DÒ)²-n·š(Ü/PN@{I EP0DlAcãa¤S7¦Ù™VgÚé+Ø×ùqŸ×b–~Tu¾«ÄÄ+÷Uy¬‹ÓîAa×h¤3‚‰Qj©× 0% ¿Ÿ•#Œ‚Ì–¥Ùàæ§2ŸÑú%üVgÂlØ`›wQÿKhú -;IgÒÎdwÕ-·õûê8"Î0¿–]ëgaÄ©åh6eÀŒÏäS`ý}«že"ŽÒÅlÊYäÇ]QUE¹œêRŒ§*—õ¬AÞ!d(ç»rSl{+«ýF›¢ªÅó©–Ö¯…ì¦ê¦ømyTÿþÆát<”•t¿õ«°®Y)ORÌm.q Ùu8øŒ€„ nš´-í5ùžeü—ã -6d#IZgù§ØäÅvU+KF_=—òNÑeít_ÖÅ:¿ª¿«÷p%k~8ä+YT!ý«··¶Âؤæ$\V¹‹¼j›sÄŒæR"6âŒÚ-$›ù²ÍâIö4âtè&r%HŸHâïÁØ‹YsrÝT!š™°Ýh¬=aŒÁ -Ý`.Án -CfIÜ( |é| -²™°ê&cq$á¢e¤_RÖ¨ h6Sï¼p9¢éUò`¾UË=&ñDŒs?ñfàÙÆÐ}  ûÑÚ°³7[±#-»IE~š"ÅAŒ‘äë÷!ž <ë)½%õ0pCiOâDe•éÓ…ïnø 4N|¯å¨nÛèf B´ @029ç}=½8JýoK AeLwîNÏr\çïyŸfn“(Kc¨-Q˜.Ãvõ¬þ$‰ç²¶8ítnXa÷âÕ/S_•'·{ÐçM b§Š‡œôewÕèeAõwÊη'SäOÃ`êGžßÏ·‘ÛËÂ@Ô!¤¿å¢!“³¡àx™^攑Ý$HÏZÄˬO%¾¢ Ô"ÿ‚rw4ÎgêmmsøáÐqá'Ðä„g#å×£¤îc(ãIœ¨ª²|ºð½À ”ljïµÕÓ6ºY‚mŒLÎyßO/ŽRÿÛˆAR™Ó»Ó³×õ{»O3·)”¥1hKԦ˰]=»?Iâ¹Ô§Ï +Œà¹xuÆËÔWòDúö ú| )ÁìôAñð¡‘“¾í®½,ˆ£þé‚ì,q{6Eþ4 ¦~äùýJq›¹}Xˆ:„ô\4d2b6Ž—éeM™ÙM‚ôìE¼ÌúTâ+Ú@-ò/(wWã|WÁ ÞÑ6—>z&.üšgîvz&ŸÝš›7‰úc&j¾’î~Œ©zý1¦«jºa#æ8ôþ›ˆ:ðƲٙTû^½!}N™Eï0ÿŸûh~endstream endobj -721 0 obj << +729 0 obj << /Type /Page -/Contents 722 0 R -/Resources 720 0 R +/Contents 730 0 R +/Resources 728 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R +/Parent 711 0 R >> endobj -723 0 obj << -/D [721 0 R /XYZ 56.6929 794.5015 null] +731 0 obj << +/D [729 0 R /XYZ 56.6929 794.5015 null] >> endobj -720 0 obj << -/Font << /F23 726 0 R /F14 729 0 R >> +728 0 obj << +/Font << /F23 734 0 R /F14 737 0 R >> /ProcSet [ /PDF /Text ] >> endobj -732 0 obj << +740 0 obj << /Length 2891 /Filter /FlateDecode >> @@ -1281,1389 +1289,1394 @@ W M…­æ:h¾nêãô¨ýèá·oðÐkƒh—#öùlk…lMfR,`5("qP,Þ„b‰Ðø˜Ž~]í»=Ãמ,Åzž%húg°º ÁîGÓäm2ƒÅREŽ7XD‚ ˆ \@pÁ,tûµDÀ'/œÕ½ÊýØø@Á_™'Hûd !E–•B*Åéö®ÒŒ‘@aaëêdz¿µÍ:ê°uõÕ¶HA‰©”!;2¬3ÁX$1Ò5–$LCK¢[ÎÂéÌù›ödŽ÷ÇršgľڀŠL% Ù¤a½ Ò"AP‡…r=|Ê?SRxÐRèWywqqvê:ûñÌ7ƒÊ'*SƒVZâï<Ž`¨ðwæ2ciìÈÛÕ÷ Ε[~©‘&Å3çë™SÿÀóøóp%ðö?ž­®Bendstream endobj -731 0 obj << +739 0 obj << /Type /Page -/Contents 732 0 R -/Resources 730 0 R +/Contents 740 0 R +/Resources 738 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R ] +/Parent 711 0 R +/Annots [ 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R ] >> endobj -735 0 obj << +743 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 688.709 539.579 697.2967] /Subtype /Link /A << /S /GoTo /D (chapter.1) >> >> endobj -736 0 obj << +744 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 676.5858 539.579 685.4425] /Subtype /Link /A << /S /GoTo /D (section.1.1) >> >> endobj -737 0 obj << +745 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 664.4876 539.579 673.3442] /Subtype /Link /A << /S /GoTo /D (section.1.2) >> >> endobj -738 0 obj << +746 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 652.3894 539.579 661.246] /Subtype /Link /A << /S /GoTo /D (section.1.3) >> >> endobj -739 0 obj << +747 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 640.1914 539.579 649.1477] /Subtype /Link /A << /S /GoTo /D (section.1.4) >> >> endobj -740 0 obj << +748 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 628.0932 539.579 637.0495] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.1) >> >> endobj -741 0 obj << +749 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 615.995 539.579 624.9512] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.2) >> >> endobj -742 0 obj << +750 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 603.8967 539.579 612.853] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.3) >> >> endobj -743 0 obj << +751 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 591.7985 539.579 600.7547] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.4) >> >> endobj -744 0 obj << +752 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 579.7002 539.579 588.6565] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.1) >> >> endobj -745 0 obj << +753 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 567.6019 539.579 576.5582] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.2) >> >> endobj -746 0 obj << +754 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.6051 555.5037 539.579 564.46] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.4.3) >> >> endobj -747 0 obj << +755 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 543.4055 539.579 552.5112] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.5) >> >> endobj -748 0 obj << +756 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 531.3072 539.579 540.413] /Subtype /Link /A << /S /GoTo /D (subsubsection.1.4.5.1) >> >> endobj -749 0 obj << +757 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 519.209 539.579 528.3147] /Subtype /Link /A << /S /GoTo /D (subsection.1.4.6) >> >> endobj -750 0 obj << +758 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 496.7003 539.579 505.4125] /Subtype /Link /A << /S /GoTo /D (chapter.2) >> >> endobj -751 0 obj << +759 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 484.5772 539.579 493.5832] /Subtype /Link /A << /S /GoTo /D (section.2.1) >> >> endobj -752 0 obj << +760 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 472.4789 539.579 481.485] /Subtype /Link /A << /S /GoTo /D (section.2.2) >> >> endobj -753 0 obj << +761 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 460.3806 539.579 469.3867] /Subtype /Link /A << /S /GoTo /D (section.2.3) >> >> endobj -754 0 obj << +762 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 448.2824 539.579 457.2885] /Subtype /Link /A << /S /GoTo /D (section.2.4) >> >> endobj -755 0 obj << +763 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 436.1841 539.579 445.1902] /Subtype /Link /A << /S /GoTo /D (section.2.5) >> >> endobj -756 0 obj << +764 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 413.4314 539.579 422.288] /Subtype /Link /A << /S /GoTo /D (chapter.3) >> >> endobj -757 0 obj << +765 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 401.353 539.579 410.4588] /Subtype /Link /A << /S /GoTo /D (section.3.1) >> >> endobj -758 0 obj << +766 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 389.2548 539.579 398.3605] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.1) >> >> endobj -759 0 obj << +767 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 377.1565 539.579 386.2623] /Subtype /Link /A << /S /GoTo /D (subsection.3.1.2) >> >> endobj -760 0 obj << +768 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 365.1579 539.579 374.164] /Subtype /Link /A << /S /GoTo /D (section.3.2) >> >> endobj -761 0 obj << +769 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 353.0597 539.579 362.0658] /Subtype /Link /A << /S /GoTo /D (section.3.3) >> >> endobj -762 0 obj << +770 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 340.9614 539.579 349.9675] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.1) >> >> endobj -763 0 obj << +771 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 328.7635 539.579 337.8693] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.1) >> >> endobj -764 0 obj << +772 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 316.6653 539.579 325.771] /Subtype /Link /A << /S /GoTo /D (subsubsection.3.3.1.2) >> >> endobj -765 0 obj << +773 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 304.567 539.579 313.6728] /Subtype /Link /A << /S /GoTo /D (subsection.3.3.2) >> >> endobj -766 0 obj << +774 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 281.9139 539.579 290.7706] /Subtype /Link /A << /S /GoTo /D (chapter.4) >> >> endobj -767 0 obj << +775 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 269.8356 539.579 278.9413] /Subtype /Link /A << /S /GoTo /D (section.4.1) >> >> endobj -768 0 obj << +776 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 257.7373 539.579 266.8431] /Subtype /Link /A << /S /GoTo /D (section.4.2) >> >> endobj -769 0 obj << +777 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 245.6391 539.579 254.7448] /Subtype /Link /A << /S /GoTo /D (subsection.4.2.1) >> >> endobj -770 0 obj << +778 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 233.5408 539.579 242.4971] /Subtype /Link /A << /S /GoTo /D (section.4.3) >> >> endobj -771 0 obj << +779 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 221.4426 539.579 230.3988] /Subtype /Link /A << /S /GoTo /D (section.4.4) >> >> endobj -772 0 obj << +780 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 209.3443 539.579 218.3006] /Subtype /Link /A << /S /GoTo /D (subsection.4.4.1) >> >> endobj -773 0 obj << +781 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 197.2461 539.579 206.2023] /Subtype /Link /A << /S /GoTo /D (section.4.5) >> >> endobj -774 0 obj << +782 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 185.1478 539.579 194.1041] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.1) >> >> endobj -775 0 obj << +783 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 173.0496 539.579 182.0058] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.1) >> >> endobj -776 0 obj << +784 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 161.051 539.579 170.0571] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.5.1.2) >> >> endobj -777 0 obj << +785 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 148.9527 539.579 157.9588] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.2) >> >> endobj -778 0 obj << +786 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 136.8545 539.579 145.8606] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.3) >> >> endobj -779 0 obj << +787 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 124.7562 539.579 133.7623] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.4) >> >> endobj -780 0 obj << +788 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 112.5583 539.579 121.5146] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.5) >> >> endobj -781 0 obj << +789 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 100.4601 539.579 109.4163] /Subtype /Link /A << /S /GoTo /D (subsection.4.5.6) >> >> endobj -782 0 obj << +790 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 88.3618 539.579 97.3181] /Subtype /Link /A << /S /GoTo /D (section.4.6) >> >> endobj -783 0 obj << +791 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 76.2636 539.579 85.2199] /Subtype /Link /A << /S /GoTo /D (section.4.7) >> >> endobj -784 0 obj << +792 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [527.6238 64.1653 539.579 73.1216] /Subtype /Link /A << /S /GoTo /D (section.4.8) >> >> endobj -733 0 obj << -/D [731 0 R /XYZ 85.0394 794.5015 null] +741 0 obj << +/D [739 0 R /XYZ 85.0394 794.5015 null] >> endobj -734 0 obj << -/D [731 0 R /XYZ 85.0394 711.9273 null] +742 0 obj << +/D [739 0 R /XYZ 85.0394 711.9273 null] >> endobj -730 0 obj << -/Font << /F21 702 0 R /F23 726 0 R >> +738 0 obj << +/Font << /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -787 0 obj << -/Length 3167 +795 0 obj << +/Length 3159 /Filter /FlateDecode >> stream -xÚí[wÛ6Çßý)ôh?‹ûå1מvw“4q_¶ÛVfJ¢W’›Í~úEZàÈØ­ÓØR{Z;1‡3žÿO ’lBý¿l¢4ÑŽ»‰q’(ÊÔd¶<£“kÿ³ïÎXÌ44…G=¿<ûËka&Ž8ÍõäòãD*E¸ÚÌj-›\^ý|þâí›ËWo.?\ürùÃÙ«ËxVè™QÑžò_g?ÿB'W>€Î(ΪÉgÿJ˜s|²<“J%…³8ûpöcÖëz5«Ç3N~ïñ`ã- Z°ñŒÓa™ÚóšýL1KŒéWuo³©y=s‹W‹zY¯¶~¢˜9Ö~e”ÒâO0Ä>YP2Œ“L/¨÷0i¥š©UÀe¼Qù{µ} -EyÓ¢¢ ?õ´wP é,Fb¨@¹G%† -êqM¤`r¢<4†I›`Ùá"Úõ/«mõï‹©pê´´zPb*KA†(©Prq  àÞ(–m ð”—u[‡VóT…ªÕUè{«ëvuþ[˜éUö˜¥b€!ÆTAˆq2q`  Þûº¢ %Zy<®²/Û™F¿ŠÚÊšÓ¨¢ÒYŒ -0ÄPra¨dâÀPA½§áBY¢™3 –S]ù_A ©,b @©0P2q`  Þ(ReSsãA9Õ•}B–Š†P!ÇÈÄ1€zý­mÑ¡°ðûõ·ß­«å²jWŒ8µ·wp -Æb¸@Å0\2q`¸ ÞÃ4„s¢¸ •¥­+ÞýÁˆµTzíQÕlÑ3‚áŒÛþ˜Ûj[§iL¤Ëp{êc΋y†OPS¡ÆyÊÄñ„z<ùÃ¥'þ8.eÖ±§7 õ©-¦&ÙaÐá0föƒÀÁ\÷ÄHg‰Ô±âDDfÖ¬¶ëf±Ép#¡LðòîICcèÄ—² x"ôäâ@ðÁ½~¬Ÿûr—*˜|0~î1…Vü1à2ÊIÈe1'Àãj%Æ·5æâÀ8A½NŒl7`GLÔALæ«ÙâöªÎQ¢‰qìÐdÇ2~Tóäábx’ÆÐCg?ŒÌuGûš¤ušÓè‡"çðøòµ¯çÿÁ›5b*‹†#P*1¾%6F ê=`¢(tRæ &¿Õ_rS__‚œ!ìiÕ7漘'`ˆñ5ÅxÊÄñ„z< KM£Ž}œ8Š>½N*¤¶˜šd‡A„ØÙCsˆážÃ2î 2‹æúºÝI–)TÆyNZÏQò¨vÆ£ 1v „<™80zPï&ýáN§¥@úPüÜc¢óçì²úÃîËbN€!Æ ÔJŒïïÎÅq‚zW™$å„Sã)íõHÛo[Þ‡FSßUË0ë}ªV«:·êç9©”î{÷i]m< ZðãšÕ„ôà 1x |<™80xPïá<,´Sí -àñÉu³ÎÍt$%Úš;ðHjªBÅô– xòI: -O.Ü{_¡„±„I *Ôá«U‹Ïë:·ÐÇ}}Š°ŒMo¸ÒG|Ý3¦»%`ˆ¡å”ã[ðrq`(¡ÞJZ{z8(aüAP:<Ó‘Ì=¡Ñ'¤µ`ˆ!eÃÉÄ!ƒzÈ(I¨eý•{ÌýUÌe1'Àãj…q’‰ãõ8í„vW‡/U57­Ô›üëÏvðR;®©MÈq1?Àãjˆñ“‰ãõøa†8«AÒÅÏ}.XÉG]B.‹9†'P+9¾q"Æ ê=µâT§$¨H:¬ã,!IÅC ãÛ{rq` ÞFM‡ã;Ñ››fÑ\û†ÁszÀIžÃbB€!FÈ@#„L!¨÷DˆfD9,¢'äÛ7~æ¸ðsÆÜ•.I(gnÿJ—°ê8nŽÉ-Fbè ÄŽc. Ô{BG:¢$ÖÙ¡óþý¦î;Š·Ý…Ž:¼äât›UÊ\1Àãb Ìøâe.Œ Ô{âB¢†}S±æÐóÛþYËúhŒSKŸÎbV’† - !e? Ìuâ„+"ÍEw <¿/¶Óðš“ èWæ«»×ÄÿiVíZ¸1îQY(Öb²<¾&™‹“õž4f‚Hy§19_-o¶_Ò;³Ú«ßÐÔÃö !IÅC ã›brq` Þ”Éô€Ûðìêj·Õ©Z„kݳô¹~QÍ>í -…Óú iÝg£Xêd‡) s=¾Ðœ ÓsÝŽ+Á=H‡oÖßø†À7óÙfÚßÀ–Û.çû\©ì¡'ƒøIÉ##ÆØI,eØ!l $ß • au^MeˆP ök°q;ñÝŸˆÂèûªúd¿®*Ùao«‚R o¸Û{Wæ:<õ_ÁAKpøNú~ΗYV ¾„èƒ7Òsó”‰ñw²ìò\þF–`†¾%ih·±Ü`øß)w^òìkHüŒ8¥øÿÿÂàô^cÙÞXfGödqK‰kßÅ%ü°"úû1‘ZvÈÿ 9†Sendstream +xÚí[wÛ¸Çßý)ôh?Åýò˜ûɶM²±÷¥Û}`dÆÖ‰$z%9©ûé Š8´À‘ÐÆili÷ìÚ‰9œñüÂ`@d#êÿe#¥‰vÜŒ“DQ¦F“ù ]ùŸ½9aí1ãpÐõüâä/¯…9â4×£‹Ï#©ájs2K¨µltqùûé‹÷ï.^½»8?ûãâ—“Wñ¬Ð3£¢>åŸ'¿ÿAG—>€_N(ΪÑ7ÿJ˜s|4?‘J%…3;9?ù5žütcšüM%\hžøU¸¿JýCÅFF9¢…ÿIý‹Hb ;3Néé›rQ.‹õtqu6択þµ¼[­æ§äl¬üï‹tî»ì¾ÔÔgÝÝåsK›åÕ¨ùæ#T+Ø¡á¶ZÛç¯õâz+Ž ~*ŒÔ{`E¢)Õ‘Þ²r>½ZDPÖ×eóÍ?ª…ÿÎP}$%&d5›`ˆUÈIăzÄE”¶.#Zb^T‹Rʯn—‘›órùµ\Öc ‡ŠÊ #!ÙŒCŒ¨7ÃŒ$âÀA½æ‡íË#÷UMÞBâ<"ÔóðöÃWÝ’q{sS-×ͦ‹æëó·ï^6ßyÇÙãd~@!ÇÙC ¨!·Ã%âÀB½‡A†1?ÏQ¡,¹8…yvy¹Ï«jæ§ÃÙ |ûe $âÞ:ï&kn8kàtX¶¶¼¦*©ÖŠ0Él“­Í8XWÒ˜¯áô´?þ´,–w¾œJù”Kæ !}ÙŸ$`ˆ}’ <‰806Pï‘ %c”·lð–·‹®u+RT¼,Êyå']Ψƒ›U ’’™M +0ÄHba¤$âÀHÙòžs%–ºSÝŽ¹[Cm×Áëiµä|.—åbRg.œ|ïñ`ã- Z°áŒÓa™ÚòšüL1KŒiWuo“©y= s‹W³r^.Ö~¢˜9Ô~eÒìO0Ä>YP2Œ“D/¨÷0i¥š©UÀe¸Qù{±ž\‡¢¼ªQц{Ú{¨„tf£ 1T \‚£’ˆCõθ&R09Räí`Ùà"êõ»Åºø×ÙX8u\ZÝ”˜Ê\P !JO*”T(¸÷ˉ¶‚Px Ê˲®C‹iW…ŠÅeè{‹«zuþg˜éÿˆUö˜¥l€!ÆTAˆaq`  ÞÛº¢ %Zy<®²Ïë™F»ŠÚŽʚ㨢Ò™ +0ÄPra¨$âÀPA½wÃ…²D3g:XŽuå¿%¤2`ˆ¥Â@IÄ‚zï@‘š(Û57”c]Ùf d)›`ˆ1Ur˜D¨÷Ðß*Q + ߯¿}³,æó¢^=2âØÞÞÃ%d4`ˆáÃpIÄá‚zÓΉâ2T–º®x÷÷l#ÖRéÔG“Y{LoR„3nÛcÎןì¦1‘.Ãí±Ž9Ïæ b?{Ltþ?»¬¾[Ãr™Í 0Ä8Zaœ$âÀ8A½Ç«L’r©q€”úz¤m·-oC£©ïªe˜õN®‹Å¢L­úùAN*¥Ûã>\/‹•gA ~X³šÞlx€!”O ߊƒõáÎÃb@;UŸ ?\UËÔLGR¢­¹¤ö *TLo.<Ч'Ÿ¤ƒð¤â@àÁ½wðK˜”°FÕ·§î ÏŸ·åòn\.—Õ2µø§,q҆ſ4/´Ô r2™Í 0Ä8JÉáýu©80NPïíLÆ÷ê„1êÓî«š³oË2Å÷ó˜8¨ Mƒ¹Ò|}<¦;%`ˆ¡åÄPJÄ¡„z()I¨e¼C‰?J»gÄ’¹'T¥BZ³‘†2P69¼ +† ê= #9¡Ò©™ÝW4çÅj]&kRÝGI§wöáú°f9!ÇÙüCŒ¨!ÆO"ŒÔ{àGÔsØ]ɇâgŸ>Ü=æ><æ2›`ˆqµÂ8IÄq‚zœ0CœÕ 4í¾¤YÝÔR¯Ò¦¬w¹ó’&;¬©MÈq6?Àãjˆñ“ˆãõø¡Š8%AÒÅÏ>6壮G!—ÙœCŒ¨•¾°™Šãõ»nîqœ[@JXï{^U³²hE}ßÒ1VÂðUɘ®\ !CO9¼~—Š÷ÞÁ`ýˆà`G¤ÃúÝëjù­hžÄ³y<¤üxûÉ=6Bö²Ù†P5\PRq`l Þ;6´#VÁÖG‡å¹—·Ål¼Z“/÷ž'~¾[Û~È R• 0Ä@€R` $âÀ@@½w (C,7½Š!žM&ñ–ùõFÌz¼¨fuÑ8Þß%. `ˆa…Á°HÄazï°Š§ÄB5X¼]øösáÙ8kÊŽ·¹¦ñ ÌÆbx@ÔðFîT¨÷!ˆÑ½Ž„è_ë+7íƒÿàƒ7„1G*bÞ²©†PŒŠD¨÷Ž +ΈýîÃ4T4O+®¡¸8sôtY,VŸ7“ +eØ‹˜¸l,€!†F oBIÅazï° ŽÊzµÄ6XüöòCCŇøÚö‰Øg'åò™M +0ÄPéé5ü@¥T,¨÷Ž&ˆ”÷:ÝÐòüv:[ÃëpV _™.>o^_wHü»ZÔkáƸG¹s&f![c`ˆiÜËòðšd*LcÔ{§1eD2ݓؤ$~5¿Yßu¯V«/nüDKPÛ‚´9Ê ³Ãô‡ + oˆI©¹Žâ[G„•¢'¾mÄvy¹ÙäTÌÂUîI÷‰~QL®7uÂiýtdÙÈ•Ø!2÷r=¼Äœ‘u^PeˆP|Âw?ΡÎõŒè÷Rsó”' +ƒo¼jý«Î{ß”yÝÕvØÛ®0×Ὂšû@øìó,¼§Ðs¶ùÌwK0CßÜÒi…¼+k+‚-Dâ»~ÇÜyi“/,ñÿ1â”âÿû«…»7 ËúÖ";°=‹[J\ýÖ.á篢½s¹%fsˆü?ìÑTÿendstream endobj -786 0 obj << +794 0 obj << /Type /Page -/Contents 787 0 R -/Resources 785 0 R +/Contents 795 0 R +/Resources 793 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R ] +/Parent 711 0 R +/Annots [ 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R ] >> endobj -792 0 obj << +800 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 758.4766 511.2325 767.4329] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.1) >> >> endobj -793 0 obj << +801 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 746.445 511.2325 755.4012] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.2) >> >> endobj -794 0 obj << +802 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 734.5129 511.2325 743.3696] /Subtype /Link /A << /S /GoTo /D (subsection.4.8.3) >> >> endobj -795 0 obj << +803 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 722.3816 511.2325 731.3379] /Subtype /Link /A << /S /GoTo /D (section.4.9) >> >> endobj -796 0 obj << +804 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 710.3499 511.2325 719.3062] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.1) >> >> endobj -797 0 obj << +805 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 698.3182 511.2325 707.2745] /Subtype /Link /A << /S /GoTo /D (subsection.4.9.2) >> >> endobj -798 0 obj << +806 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 675.998 511.2325 684.7301] /Subtype /Link /A << /S /GoTo /D (chapter.5) >> >> endobj -799 0 obj << +807 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 663.9862 511.2325 672.9425] /Subtype /Link /A << /S /GoTo /D (section.5.1) >> >> endobj -800 0 obj << +808 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 651.9545 511.2325 660.9108] /Subtype /Link /A << /S /GoTo /D (section.5.2) >> >> endobj -801 0 obj << +809 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 629.6343 511.2325 638.4909] /Subtype /Link /A << /S /GoTo /D (chapter.6) >> >> endobj -802 0 obj << +810 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 617.6225 511.2325 626.7282] /Subtype /Link /A << /S /GoTo /D (section.6.1) >> >> endobj -803 0 obj << +811 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 605.5908 511.2325 614.5471] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.1) >> >> endobj -804 0 obj << +812 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 593.5591 511.2325 602.5154] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.1) >> >> endobj -805 0 obj << +813 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 581.5275 511.2325 590.4837] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.1.2) >> >> endobj -806 0 obj << +814 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 569.4958 511.2325 578.4521] /Subtype /Link /A << /S /GoTo /D (subsection.6.1.2) >> >> endobj -807 0 obj << +815 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 557.4641 511.2325 566.4204] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.1) >> >> endobj -808 0 obj << +816 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 545.4324 511.2325 554.5382] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.1.2.2) >> >> endobj -809 0 obj << +817 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 533.4007 511.2325 542.5065] /Subtype /Link /A << /S /GoTo /D (section.6.2) >> >> endobj -810 0 obj << +818 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 521.3691 511.2325 530.3254] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.1) >> >> endobj -811 0 obj << +819 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 509.3374 511.2325 518.2937] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.2) >> >> endobj -812 0 obj << +820 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 497.3057 511.2325 506.262] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.3) >> >> endobj -813 0 obj << +821 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 485.274 511.2325 494.2303] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.4) >> >> endobj -814 0 obj << +822 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 473.2424 511.2325 482.1986] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.5) >> >> endobj -815 0 obj << +823 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 461.2107 511.2325 470.167] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.6) >> >> endobj -816 0 obj << +824 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 449.179 511.2325 458.1353] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.7) >> >> endobj -817 0 obj << +825 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 437.1473 511.2325 446.1036] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.8) >> >> endobj -818 0 obj << +826 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 425.1157 511.2325 434.0719] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.9) >> >> endobj -819 0 obj << +827 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 413.084 511.2325 422.0403] /Subtype /Link /A << /S /GoTo /D (subsection.6.2.10) >> >> endobj -820 0 obj << +828 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 401.0523 511.2325 410.0086] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.1) >> >> endobj -821 0 obj << +829 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 389.0206 511.2325 398.1264] /Subtype /Link /A << /S /GoTo /D (subsubsection.6.2.10.2) >> >> endobj -822 0 obj << +830 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [499.2773 377.0886 511.2325 386.0947] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.11) >> ->> endobj -823 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 365.0569 511.2325 374.063] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.12) >> ->> endobj -824 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 353.0252 511.2325 362.0313] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.13) >> ->> endobj -825 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 340.9936 511.2325 349.9997] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.14) >> ->> endobj -826 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 328.9619 511.2325 337.968] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.15) >> ->> endobj -827 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 316.8305 511.2325 325.9363] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.16) >> ->> endobj -828 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 304.8985 511.2325 313.9046] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.1) >> ->> endobj -829 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 292.7672 511.2325 301.7235] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.2) >> ->> endobj -830 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 280.7355 511.2325 289.6918] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.3) >> +/A << /S /GoTo /D (subsubsection.6.2.10.3) >> >> endobj 831 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 268.7038 511.2325 277.6601] +/Rect [499.2773 365.0569 511.2325 374.063] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.4) >> +/A << /S /GoTo /D (subsection.6.2.11) >> >> endobj 832 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 256.6722 511.2325 265.7779] +/Rect [499.2773 352.9256 511.2325 362.0313] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.5) >> +/A << /S /GoTo /D (subsection.6.2.12) >> >> endobj 833 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 244.6405 511.2325 253.7462] +/Rect [499.2773 340.8939 511.2325 349.9997] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.6) >> +/A << /S /GoTo /D (subsection.6.2.13) >> >> endobj 834 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 232.6088 511.2325 241.5651] +/Rect [499.2773 328.8622 511.2325 337.968] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.7) >> +/A << /S /GoTo /D (subsection.6.2.14) >> >> endobj 835 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 220.5771 511.2325 229.5334] +/Rect [499.2773 316.8305 511.2325 325.9363] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.8) >> +/A << /S /GoTo /D (subsection.6.2.15) >> >> endobj 836 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 208.5455 511.2325 217.5017] +/Rect [499.2773 304.7989 511.2325 313.9046] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.9) >> +/A << /S /GoTo /D (subsection.6.2.16) >> >> endobj 837 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 196.5138 511.2325 205.4701] +/Rect [499.2773 292.7672 511.2325 301.873] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.10) >> +/A << /S /GoTo /D (subsubsection.6.2.16.1) >> >> endobj 838 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 184.4821 511.2325 193.4384] +/Rect [499.2773 280.7355 511.2325 289.6918] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.11) >> +/A << /S /GoTo /D (subsubsection.6.2.16.2) >> >> endobj 839 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 172.4504 511.2325 181.4067] +/Rect [499.2773 268.7038 511.2325 277.6601] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.12) >> +/A << /S /GoTo /D (subsubsection.6.2.16.3) >> >> endobj 840 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 160.4187 511.2325 169.5245] +/Rect [499.2773 256.6722 511.2325 265.6285] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.13) >> +/A << /S /GoTo /D (subsubsection.6.2.16.4) >> >> endobj 841 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 148.3871 511.2325 157.3433] +/Rect [499.2773 244.6405 511.2325 253.5968] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.14) >> +/A << /S /GoTo /D (subsubsection.6.2.16.5) >> >> endobj 842 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 136.3554 511.2325 145.3117] +/Rect [499.2773 232.6088 511.2325 241.5651] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.15) >> +/A << /S /GoTo /D (subsubsection.6.2.16.6) >> >> endobj 843 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 124.3237 511.2325 133.4295] +/Rect [499.2773 220.5771 511.2325 229.5334] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.16) >> +/A << /S /GoTo /D (subsubsection.6.2.16.7) >> >> endobj 844 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 112.292 511.2325 121.2483] +/Rect [499.2773 208.5455 511.2325 217.5017] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.17) >> +/A << /S /GoTo /D (subsubsection.6.2.16.8) >> >> endobj 845 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 100.2604 511.2325 109.2166] +/Rect [499.2773 196.5138 511.2325 205.4701] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.16.18) >> +/A << /S /GoTo /D (subsubsection.6.2.16.9) >> >> endobj 846 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 88.2287 511.2325 97.185] +/Rect [499.2773 184.4821 511.2325 193.4384] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.17) >> +/A << /S /GoTo /D (subsubsection.6.2.16.10) >> >> endobj 847 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 76.197 511.2325 85.1533] +/Rect [499.2773 172.4504 511.2325 181.5562] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.18) >> +/A << /S /GoTo /D (subsubsection.6.2.16.11) >> >> endobj 848 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [499.2773 64.1653 511.2325 73.1216] +/Rect [499.2773 160.4187 511.2325 169.5245] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.19) >> +/A << /S /GoTo /D (subsubsection.6.2.16.12) >> >> endobj -788 0 obj << -/D [786 0 R /XYZ 56.6929 794.5015 null] +849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [499.2773 148.3871 511.2325 157.3433] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.2.16.13) >> >> endobj -785 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R >> -/ProcSet [ /PDF /Text ] +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [499.2773 136.3554 511.2325 145.3117] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.2.16.14) >> >> endobj 851 0 obj << -/Length 3445 -/Filter /FlateDecode ->> -stream -xÚí[SGÇßùzHÕ½}¿ì>laÀ){1©lm’YƒÊH"º@¼Ÿ~{4ÓÝG¨ç@oÖáW -æÌ9:ÿßœ¾Îˆõ¨ÿÇzV*œì'‰¢Lõã-Ú;óï½Ùbí1»á ]xÔ«Ó­¿¾¦çˆÓ\÷N?ƒsYB­e½ÓáÏÛûïOO?îüzúÃÖái<)t̨¨ÏøÛÖÏ¿ÒÞÐûÿa‹á¬ê]û_(aÎñÞxK*A”"üåbëãÖ?ã Á»+ÓÜQÂe¹É|.À'aœëŒN9¢…¯þ(špÂiýAüá .±–Jï£>l^Í®ªY{<«ðqk­ÛÃ>.ú‹j\M;»\ÑíƒêJùd´M'Í_ú“aóâÇyÿ¬ÚÙµŽn“]Eïå‡t®Èà†ÜŠ[¢9e)£úÌÎzÍ‹¨X°Û…†›Šmž¥˜Ýˆ#‹ãõžx‘†(Eyâ…ÝÊËb¶œ/ªáî—êëáøc¨ÜFLÈi11À#fM3×ML&ŒÔ{"F("µÄðoJÌíu†+ñÈJJHa1 ÀdM"L ¨÷DXÍ âV@®FÕu .ý2ê–R¢„x0¥äÿY_îSHw1LÀƒiMN¦LL¨÷cDP `’ߦ۫Œvúñ±Ó MHk14ÀƒfM6šL4¨÷vηJ …R·2óŸé¤Ê3C3· kŸrå¹…¥íR”€BÔÒ°N2A ¡®FÖ&Eú›Pt{å1Š=æªMj1,Ñ c% fD7*`¤ ~™’ÄãzÚ(B•‘P!Ìq¼„ÿ®‰X‰yºã‡Ã_/«¹Ï|à–{("!…Å`C (G& Ô{DsâüˆÂ@ö/ús„ ü1!ñÍ9¹ —Ðb\€!† ÌÈn\2q`¸ Þ.ŠúHXˆ‹¸YOÞ_Ö-F)#Q·¹b.€!ÆTƨn.2q`\ ÞÞÀ2¶Æ…l¸8ø:éGƒ¶ßp9ô]Œæõ‡éÅh0ª[©Ô“•=$¦Xv`ˆÉoL·ì™80ÙQï¾ê¬=ÿ+1ÜwÕ}!`t­¼]øWJ¹Gß‚<èŽk¡˜1`ˆ1e6ÝCæ\c¨÷4Öa’hi"duÿ•qºÖm­Y›~n~žTóér¶Ãìö  -LWÎo c~:¯Ú‘Íb6¡S|^ýLj‡7I3R¬70Äô†ÇôÎÄézOM åDiô^).n—Ö -ö,{!aÅ8C (†C& Ô{ÄA9J¤àÀ[|àÛÕï‹eÿ¢¡¡úýrC5ŸÇ)‹XNVcýT˜§R - !BÁš–wR‹¡÷e,‘”% -xÛŒæƒeFîwÿÊy¯òß÷ÌzÌa1!À#j„’‰#õžÑ æT$D´„|¬‹Ñä¬mÕOß®8/ýËr~B†‹ù†?PAÛ=–‹ãõžøñ &ñ#[~Ž&WÕ,ô -ßõ//#L£¶æ}¸òs+^†"1‹ÅŒCŒ¨ÆH&ŒÔ{bDrÂü±‘Õ2ò~q^Ín~W )£¦[2XŒ®êáŠì9·C!‹ÅŒCŒ¨’íž!ÍÅ1‚zOýUA 50‡/~H™Y§Óþx&ÃÜwïOŽÞg–ê¤ñeŒóö¸5¤vvbOuÏZLh1.Àà -†á’‰Ãõžpa†8ÇÀ…—àrt¼ÿöǃÃÜÖ5E¨]¼pñôêJHe1(ÀJ…’‰õž@¡Š8ê (¢ßóÍ­ÿkb¥ë€ÄÜÏ´üýu^BŠ‹†@PB  L@¨÷Øy‘N<é¶óòêèø ônç‹ÐI½—ÃßÕ¤aÿÍ÷\Ý^dqcF{PUØÄöÝ›ÃãÓ½z†æ4W´ ” -™OÿIãô.bªJA€†kRØ\¸÷‚eÄH•@0-{Ãáj¯O˜NK¼žÎÆý…ï¹j£_91ÅxC (ÕÝxdâÀð@½‡5=©ÑZ„m­²]Ó«‹„k`¨w‰æ‹Ñ Þ/Ä_–ïþ0N!ãÅ8C '¨(†S& 'Ô{ì·He¼‹<º6Ú *gùsœf‹ +Æb8@Al÷Ž\¨÷ÔøHE|# a1÷&ûÓåÄ÷EêU=êžyýè$¥Íe1(Éã(…a²F æ:Õ !ˆd&AKÆqjFskh¶~$x$·Zá6Å -';LafLáÍ 0…1×IaΈÔ8í‘&PßõG^ÆI2¨nÓÙ—–‡>?r±˜ÀS¦Ôvß­›‹Óõž¥ŽpÅ¡ ìÚ¸¸Ãµj5Bµ9ä£Xm`ˆ© ó©‰SõÕÎf¨jËVíýéøÒ+üit1Z|m$¾-Λ)áÖúÆ·4Ü\»š†ÈÌP"â *ö&3Z<´ÎA1e¥@@Cˆ5Il÷.\›ÞYæ1ÂH¢™m–þëéº6¯ŽÕ`9‹TìO'óÑ°šõ›Íây §öÜ-_À`3âÍóÖ!»îÛ·àé°isØáäªYN˜Nš{Y…ϧ vr2_Ì0ĸ‚Êb\eâÀ¸B½'®êÛM\…ý¡?Îãv­üº•Ñþ ŒÅNu•5J «©¯—“AsW´4Ï¡±í„*¤½*`ˆAeÅ ÊÄA…zÍ+“„S˜ -w7uÞÏ–º·Fé—)Ë<0!§ÅÀC ¨L& ˜ ï¹QwŒhÕ>ƶ£ ÓÆØölºütQÍÏ}ûU×£®ôÄ3Üu° ÁÎZd®{ÁžIǦ×ÜõÃ#Ê´OZ±q°³?ÃnýM;íS3®óR¾ŒmŠ/©˜æÒK -"—ÔšŒ;™80†Pï±a纞$â¡Ø_våâ œûçýÉÙZ/,Â.–ãåøS=ù,´{Ýø6IÅÚG3Lú$¦üF˜ðˆß¨»Dðö(6ö³~ª·Ô§‹tÿÆeü¦j/Úï«‹KJùÒ\Ü  íb„€!TÃ(Ò†÷lŒÓzb³¤¹ç 7çÛ{——Õd8TÝsÌÑìÎÝ.`€u»`8®{…žËÁ†×ìåD½w'ÚÔ ¦1> ƒ/“éõE5<« i½ÚÆÝKg«üê É-¾z€!võ@ñ0b2q`ä Þcg‹9M4kïàÜkz[®¾„šJûj6ªÚÛk¿ÍÓÙ×õ{ncó{püñF;ݬiÊž -1Y¥(@C…51rq (àÞCaVÅ] 7EäM5©f¡_E>©>·-uܨq4ù¼Ú1¼š"Óîy­9Å܃ 10 6®{é?ê=ÕÉ”í˜{Í ~]#Ž>\éö¢ÃS³Y~ñº=ÿŸÿÉêE{ó²ë7汘`ˆQuÂ(ÉÄQ‚zåCS"´ -ˆ¦|¼}ºMÏfýË󯉋ØF|\žUõÃØCYéýÈ®AFpþLŠGÈ\1ÀÃ*ƒa‘‰ÃõžŠ‡ô#{ÛÞk¹×<Ë©.'ÕoK/}#¼o:ÂVˆqÛY ¬œ¼ÞŸ7@XÁŸG3¦¬`ˆ%Á€ÈÄzO@M| Þ¶&õþ®IâÌúŸk œã/ÃŒA´°&eõ®Ì´v»Ð0ÇÌÍóת1ڽ̒ ƒuŸ á’0ÖÞG¹×<ꥆ<…á`:X‚Ú±÷)Îñ6#ÅžzùR…\£ 1 ( -™@06Üçæ{eDiÓÌY¾ª[±ý®?‰»ìŸå¦}BìÁú¶iŸ˜`›ö¹yÞ&'ÝO)çÃr±á6×粎H«ÚT¬Vᶇ£³'U6Ám\-AŽÒëØ!—#,ê;pf ‘T´˜ñ³óiÝySæ…³?³VŽRÌ’BšQäûß6BÀ¾(qŸ+¬ˆà¡’‰¶’Mæój°;œnfÇ_*?ˆöûMAß Ms):É AHÈEžF~3„ tâ—QîrG¬µ¹ÆÒÿψSͽíì»/Ó7tÖ\²]ß)&¨ó‘SÙ«¿yL4׈B6Ó®‘ÿî£A{endstream -endobj -850 0 obj << -/Type /Page -/Contents 851 0 R -/Resources 849 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R ] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [499.2773 124.3237 511.2325 133.4295] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.2.16.15) >> +>> endobj +852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [499.2773 112.292 511.2325 121.2483] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.2.16.16) >> >> endobj 853 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 758.4766 539.579 767.4329] +/Rect [499.2773 100.2604 511.2325 109.2166] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.20) >> +/A << /S /GoTo /D (subsubsection.6.2.16.17) >> >> endobj 854 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 746.3946 539.579 755.3509] +/Rect [499.2773 88.2287 511.2325 97.185] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.21) >> +/A << /S /GoTo /D (subsubsection.6.2.16.18) >> >> endobj 855 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 734.3125 539.579 743.2688] +/Rect [499.2773 76.197 511.2325 85.1533] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.22) >> +/A << /S /GoTo /D (subsection.6.2.17) >> >> endobj 856 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 722.2305 539.579 731.1868] +/Rect [499.2773 64.1653 511.2325 73.1216] /Subtype /Link -/A << /S /GoTo /D (subsection.6.2.23) >> +/A << /S /GoTo /D (subsection.6.2.18) >> >> endobj -857 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 710.1484 539.579 719.1047] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.24) >> +796 0 obj << +/D [794 0 R /XYZ 56.6929 794.5015 null] >> endobj -858 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 698.1661 539.579 707.1721] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.25) >> +793 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 859 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 685.9843 539.579 694.9406] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.2.26) >> ->> endobj -860 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 673.9023 539.579 682.8586] -/Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.26.1) >> +/Length 3451 +/Filter /FlateDecode +>> +stream +xÚíKSGÇï| +ŽX8P®gWÕîa’qXH 8¼±¶£™tˆéÁóËŸ~«§»ªr˜êj½2°# †ÎÎœüÿ:ëÝ°mêþeÛF*¬ÜÖVE™ÚŽ·èö…ûÝ›-Ö]³ç/ÚƒW½:ßúöµÐÛ–Ø‚ÛçÁ½ ¡Æ°íóÑÏ;ïNÎNÎÏv=ÿ~ëè<Ü:fT4wümëç_éöÈùÿ~‹aÚ¾uÿC ³–o·¤DI!üO®¶Î¶þn~»4M}% Q†ëÄ'á|Æ91V»è”%…p¿k>JA¸sÜ|w9— FŒ¡Òùh.›Íój6¯†³½á堮˫Yg#V“%•±Í™³)Çe=ßÝãŠî¼™ÆãÁtwOr½Cv÷¥øEZ{¿+ïH¬¸!§,fqM“éÅvûÍ)TÉÛíAÃu•Öï¿TÉ®ÅáUOÅ1‚zŒHM”¢<0Âé_ÁÈaù ¥¼®æÕ¤n2¨Gí7?Î¥Å> ½,øle³ 1VÔ@XHı€z,'Ya l# óéb6/G{ŸÊÏ)”!–›bC¡0’>|¡È­÷$Æç4›`ˆ5Ó´Ÿ˜D1¨÷H D˜‚Ebø%fsÙàJVJ‰âÑ”’ÿg}¹'L>ÝÙ0C &('S" &Ô{€©°ÖÐ<É/ÂÒæ"SØâëC§ŸÕ\d€B ÔL³^`A ¼ ®#.F&#-j#-Lê2M ÕVoª<Æ<å’³‰¢6ÙÙ3Œ¡(¤æý­E€„øi7ÌWÚF„Š/‚Ðæ‚£{:THk6,ÀÃʦe?0‰80dPïLI¢µûmQpbÝà@C˜â81ÿÓ°±”õ|×n?_—3—+ùÈ;,PK| +³† P" D ¨÷ˆ¢®¼á- Wƒ™CBPþ5!ñÅ9Ù„‹Oh6.Àà +¦U?.‰80\Pïg`[ÁEÜ­'ï®›¶£A‡¿”‘ ›Ï\6Àã*£‹~.q`\ Þ#ŽÍ]—p![.?׃q5ìz×#×Ùh¿?¹ª†UÓêH¥ž¬ì>1Ù²CLv˜xmúeOÄÉŽzwk„Ø.˜¹JíUw…€Ñ•Jðººj&Ï•ýê[GÝ…õ2d3 1Ơ̦ž%Æê=Ž{('ªP²¦ÿÊ8]é¶6¬M>¶_OËÙd1ÝefgXúŸ 'ËŒfw4?]–Ýg>ñCß)¾,Çn¨£Å㛤 ÉÖbzÃŒcz'âÀôF½‡¦DYJ¤EÔ{©¸Ø,­ì9ö,BÂrq€†+‚ 8¤â@pÀ½G´!’2ˆïpp€ï”¿Ïƒ«–†ò÷ë% ål&/BY8]ŽeŠ§Ú„ãÙ8C '¨(†S" 'Ô{ì·HE\úrÕ††ˆÚ+ù¶ý›2Rq jãÞ£ÚÍ+'ŒjËNí³ÉðSÙ%9þöÝ&Ñ‹¿x)ö ©íó‘­60ÄÔ†ùÆÔNÄ©zjëf²¦]·å—X +9¾vÒ~¨®ªùçVÛÛj~ÙNø»ÒÔ®“HýQêå¤Sb>R&™5XÄcëöáS– 0Ä€€’Øþ“Œ©80 Ö¼³ÄKiœðD*Ù.Ô7“GteÑO”ÃÅ4Pq0©gÕ¨œÚ£½yó·vÜ/_À`=âõû.óÕ¿7ÞËÓš×ÔTŠp× Í»³‚ËŽl3•²?–³PëùrêsÒ͹ýàÊäòwòe^%ÿ©ó Ï~ê€!öÔAA1Šq`4¡ÞMÍÉ,K=M©W[¸¡¶e’uåóàr:™ÌEVHB]?½»¬Ù ˜Î·D(-üÑr¾¨F©[×9”¦»ì™oòÿ_ˆõ¢f 1b!4¶¿L*ŒXÔ{˜òLNM@6nÝO.!)æ¸4ž¹a/¾n¬Ø<-íeGõM»x4©Û3Ì¢ϧ örå3ŸÍ0ĸ‚Êb\%âÀ¸B½G®¨C‰"påwÿ8 ›óÒ«”ºpw`¾ôÍzË%š†µó׋zØž†—ú94¶½Pù´gC 1¨ ¬T‰80¨Pï¾yuåÌUé™ògÙzO/Æî­VÅË4u˜Ó\` !ÌŠf0©8`Ö½§FA¼h´ÜT—ƒ ó]ÆØÎt²øpUÎ.]óÕ”£Þìt7¸ïP\Œt`X¶±Ü ËÄ]—É'G)Ò½„É„AÎÁd<ög2Þ·í³ËɸÄKù2¦É”Ú$g?HÁ {Œ¢€1k`à ~C3Î¥ ‚w¯F1ÝRÏrËýüoÝø¸žtS‰·“é'÷0ý£ý¿ËÉmûÍpà÷à·_šW×\´G»:=Yø;\Âmo»ãÅ?]ùfæµ±!'ÙJCLk˜sLíD˜Þ¨÷P)š®»T^pÞÕŠãzØ*ÖtàC.Ò=¸Ô+ý:¿ +XùJ'‹ñ‡fAö tÞCš²†PŒD¨÷À³„ÝûKLègýÔ ˆOíÁçú_Rø®¼ºv­”/ÍƽPòÙÎF b(A51”q`(­yOõÀ˜-HÁº#©û®’s¾³}]Ö£jXöÏ1³ûv¼ ÒóZ Çö/ÀÂÛ!9X÷šzœ˜‘DqÛå iAµvY~ª'·Wåè¢)©ÍÚ*·/®ì§'$7÷é†ÈÓ³"FL"ŒÔ{è~1͉”ÝyËý¶ûe›G¨­´¯¦UÙ¦þ®šÍ'ÓÏ«'¬CC|xrv§Ånׂ +Êž +>YÙ(C (†B" Ô{("%¢PžÞ‘7e]N}+ˆ|Z~ìZê°-ç¸þ¸Ü¾œ"+ì3YsÄ5P:æî¾`tv{Ð0ÆÝû7Ú0Ú¿öŸ +#u‹„týtÓ¦Üo§ð›"qüþ¦èžúÑÈ¿tÿŠç×£Ûwÿ¸¯¬Yµ×Ïx“·—Ñç1`ˆauB1I‚a‚ºDÄU1O‰h È«êÃU5¹˜®/?G0B+q¶¸¸(›—ïûÂ2¹Q^ËŒàü™”Ÿ¹l.€!ÆTå"Æê>–. cÝ™Éýöå]Mù8-[8í[å]ëáwCŒ»þª‡åôõÁ¬%ÂþÄ;^1Ÿ²l"€!F”%"Fê>Á¸½éHï”fWí‡ù‡ÓÁdžkùËå>Ðø¬fC 1h jŒö/µ¤Á AÝhšvFuç%÷Ûwû4Ì€×nN† P;ö?„yßv0¢Ø3)>U¹ ;„(†A" +„‚5ß©Ù­‰¤-€¯šæ@ì¼ÔáÕo׃‹Ô”Ovg»iÂÇç"^žšîY½g›‰þÃÜñ^ØŸ¹ã0ù²UEoWi^-›QawFÕÅ“ª‘_Á1½NýNܧ,š!P#k=„5ÂÂrÜã–$÷§7ÿe,<~îïFÆ¿nÙ¼¬ÆôýÁ.A­‹œ6‰Is¯æƒ*dKîò"ùû\,Œendstream +endobj +858 0 obj << +/Type /Page +/Contents 859 0 R +/Resources 857 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 711 0 R +/Annots [ 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R ] >> endobj 861 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 661.9199 539.579 670.926] +/Rect [527.6238 758.4766 539.579 767.4329] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.26.2) >> +/A << /S /GoTo /D (subsection.6.2.19) >> >> endobj 862 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 649.7382 539.579 658.6945] +/Rect [527.6238 746.3946 539.579 755.3509] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.26.3) >> +/A << /S /GoTo /D (subsection.6.2.20) >> >> endobj 863 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 637.7558 539.579 646.6124] +/Rect [527.6238 734.3125 539.579 743.2688] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.2.26.4) >> +/A << /S /GoTo /D (subsection.6.2.21) >> >> endobj 864 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 625.5741 539.579 634.5304] +/Rect [527.6238 722.2305 539.579 731.1868] /Subtype /Link -/A << /S /GoTo /D (section.6.3) >> +/A << /S /GoTo /D (subsection.6.2.22) >> >> endobj 865 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 613.4921 539.579 622.4483] +/Rect [527.6238 710.1484 539.579 719.1047] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.1) >> +/A << /S /GoTo /D (subsection.6.2.23) >> >> endobj 866 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 601.41 539.579 610.3663] +/Rect [527.6238 698.1661 539.579 707.1721] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.3.1.1) >> +/A << /S /GoTo /D (subsection.6.2.24) >> >> endobj 867 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 589.328 539.579 598.2842] +/Rect [527.6238 686.084 539.579 694.9406] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.3.1.2) >> +/A << /S /GoTo /D (subsection.6.2.25) >> >> endobj 868 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 577.2459 539.579 586.2022] +/Rect [527.6238 674.002 539.579 683.008] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.2) >> +/A << /S /GoTo /D (subsection.6.2.26) >> >> endobj 869 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 565.1639 539.579 574.1201] +/Rect [527.6238 661.9199 539.579 670.926] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.3) >> +/A << /S /GoTo /D (subsubsection.6.2.26.1) >> >> endobj 870 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 553.0818 539.579 562.0381] +/Rect [527.6238 649.7382 539.579 658.6945] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.4) >> +/A << /S /GoTo /D (subsubsection.6.2.26.2) >> >> endobj 871 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 540.9998 539.579 550.1055] +/Rect [527.6238 637.6562 539.579 646.6124] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.5) >> +/A << /S /GoTo /D (subsubsection.6.2.26.3) >> >> endobj 872 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 528.9177 539.579 538.0235] +/Rect [527.6238 625.5741 539.579 634.5304] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.3.5.1) >> +/A << /S /GoTo /D (subsubsection.6.2.26.4) >> >> endobj 873 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 516.8357 539.579 525.9414] +/Rect [527.6238 613.4921 539.579 622.4483] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.3.5.2) >> +/A << /S /GoTo /D (section.6.3) >> >> endobj 874 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 504.7536 539.579 513.8594] +/Rect [527.6238 601.41 539.579 610.3663] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.3.5.3) >> +/A << /S /GoTo /D (subsection.6.3.1) >> >> endobj 875 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 492.6716 539.579 501.6279] +/Rect [527.6238 589.328 539.579 598.2842] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.6) >> +/A << /S /GoTo /D (subsubsection.6.3.1.1) >> >> endobj 876 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 480.5895 539.579 489.5458] +/Rect [527.6238 577.2459 539.579 586.2022] /Subtype /Link -/A << /S /GoTo /D (subsection.6.3.7) >> +/A << /S /GoTo /D (subsubsection.6.3.1.2) >> >> endobj 877 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 468.5075 539.579 477.4638] +/Rect [527.6238 565.1639 539.579 574.1201] /Subtype /Link -/A << /S /GoTo /D (section.6.4) >> +/A << /S /GoTo /D (subsection.6.3.2) >> >> endobj 878 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 456.4254 539.579 465.3817] +/Rect [527.6238 553.0818 539.579 562.1876] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.4.0.1) >> +/A << /S /GoTo /D (subsection.6.3.3) >> >> endobj 879 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 444.3434 539.579 453.2997] +/Rect [527.6238 540.9998 539.579 550.1055] /Subtype /Link -/A << /S /GoTo /D (subsection.6.4.1) >> +/A << /S /GoTo /D (subsection.6.3.4) >> >> endobj 880 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 432.2613 539.579 441.2176] +/Rect [527.6238 528.9177 539.579 537.874] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.4.1.1) >> +/A << /S /GoTo /D (subsection.6.3.5) >> >> endobj 881 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 420.1793 539.579 429.1356] +/Rect [527.6238 516.8357 539.579 525.792] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.4.1.2) >> +/A << /S /GoTo /D (subsubsection.6.3.5.1) >> >> endobj 882 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 408.0972 539.579 417.0535] +/Rect [527.6238 504.7536 539.579 513.7099] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.4.1.3) >> +/A << /S /GoTo /D (subsubsection.6.3.5.2) >> +>> endobj +883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 492.6716 539.579 501.6279] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.6.3.5.3) >> +>> endobj +884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 480.5895 539.579 489.5458] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.3.6) >> +>> endobj +885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [527.6238 468.5075 539.579 477.4638] +/Subtype /Link +/A << /S /GoTo /D (subsection.6.3.7) >> >> endobj 886 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 396.0152 539.579 404.9715] +/Rect [527.6238 456.4254 539.579 465.3817] /Subtype /Link -/A << /S /GoTo /D (subsubsection.6.4.1.4) >> +/A << /S /GoTo /D (section.6.4) >> >> endobj 887 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 373.4431 539.579 382.2997] +/Rect [527.6238 444.3434 539.579 453.2997] /Subtype /Link -/A << /S /GoTo /D (chapter.7) >> +/A << /S /GoTo /D (subsubsection.6.4.0.1) >> >> endobj 888 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 361.3809 539.579 370.4867] +/Rect [527.6238 432.2613 539.579 441.2176] /Subtype /Link -/A << /S /GoTo /D (section.7.1) >> +/A << /S /GoTo /D (subsection.6.4.1) >> >> endobj 889 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 349.2989 539.579 358.2551] +/Rect [527.6238 420.1793 539.579 429.1356] /Subtype /Link -/A << /S /GoTo /D (section.7.2) >> +/A << /S /GoTo /D (subsubsection.6.4.1.1) >> >> endobj 890 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 337.2168 539.579 346.1731] +/Rect [527.6238 408.0972 539.579 417.0535] /Subtype /Link -/A << /S /GoTo /D (subsection.7.2.1) >> +/A << /S /GoTo /D (subsubsection.6.4.1.2) >> >> endobj 891 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 325.1348 539.579 334.091] +/Rect [527.6238 396.0152 539.579 404.9715] /Subtype /Link -/A << /S /GoTo /D (subsection.7.2.2) >> +/A << /S /GoTo /D (subsubsection.6.4.1.3) >> >> endobj 892 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 313.0527 539.579 322.009] +/Rect [527.6238 383.9331 539.579 392.8894] /Subtype /Link -/A << /S /GoTo /D (section.7.3) >> ->> endobj -893 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 290.4806 539.579 299.2128] -/Subtype /Link -/A << /S /GoTo /D (chapter.8) >> ->> endobj -894 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 278.4184 539.579 287.3747] -/Subtype /Link -/A << /S /GoTo /D (section.8.1) >> ->> endobj -895 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 266.3364 539.579 275.2927] -/Subtype /Link -/A << /S /GoTo /D (subsection.8.1.1) >> +/A << /S /GoTo /D (subsubsection.6.4.1.4) >> >> endobj 896 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 254.2544 539.579 263.2106] +/Rect [527.6238 371.8511 539.579 380.9568] /Subtype /Link -/A << /S /GoTo /D (section.8.2) >> +/A << /S /GoTo /D (subsubsection.6.4.1.5) >> >> endobj 897 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 242.1723 539.579 251.1286] +/Rect [527.6238 349.279 539.579 358.0111] /Subtype /Link -/A << /S /GoTo /D (section.8.3) >> +/A << /S /GoTo /D (chapter.7) >> >> endobj 898 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 219.6002 539.579 228.3323] +/Rect [527.6238 337.2168 539.579 346.1731] /Subtype /Link -/A << /S /GoTo /D (appendix.A) >> +/A << /S /GoTo /D (section.7.1) >> >> endobj 899 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 207.538 539.579 216.4943] +/Rect [527.6238 325.1348 539.579 334.2405] /Subtype /Link -/A << /S /GoTo /D (section.A.1) >> +/A << /S /GoTo /D (section.7.2) >> >> endobj 900 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 195.456 539.579 204.4123] +/Rect [527.6238 313.0527 539.579 322.1585] /Subtype /Link -/A << /S /GoTo /D (subsection.A.1.1) >> +/A << /S /GoTo /D (subsection.7.2.1) >> >> endobj 901 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 183.3739 539.579 192.3302] +/Rect [527.6238 300.9707 539.579 310.0764] /Subtype /Link -/A << /S /GoTo /D (section.A.2) >> +/A << /S /GoTo /D (subsection.7.2.2) >> >> endobj 902 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 171.2919 539.579 180.2482] +/Rect [527.6238 288.8886 539.579 297.9944] /Subtype /Link -/A << /S /GoTo /D (subsection.A.2.1) >> +/A << /S /GoTo /D (section.7.3) >> >> endobj 903 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 159.2098 539.579 168.1661] +/Rect [527.6238 266.3165 539.579 275.0487] /Subtype /Link -/A << /S /GoTo /D (section.A.3) >> +/A << /S /GoTo /D (chapter.8) >> >> endobj 904 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [527.6238 147.1278 539.579 156.0841] +/Rect [527.6238 254.2544 539.579 263.2106] /Subtype /Link -/A << /S /GoTo /D (subsection.A.3.1) >> +/A << /S /GoTo /D (section.8.1) >> >> endobj 905 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 135.0457 539.579 144.1515] +/Rect [527.6238 242.1723 539.579 251.1286] /Subtype /Link -/A << /S /GoTo /D (subsection.A.3.2) >> +/A << /S /GoTo /D (subsection.8.1.1) >> >> endobj 906 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 122.9637 539.579 132.0694] +/Rect [527.6238 230.0903 539.579 239.0465] /Subtype /Link -/A << /S /GoTo /D (subsection.A.3.3) >> +/A << /S /GoTo /D (section.8.2) >> >> endobj 907 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 100.3916 539.579 109.2482] +/Rect [527.6238 218.0082 539.579 226.9645] /Subtype /Link -/A << /S /GoTo /D (appendix.B) >> +/A << /S /GoTo /D (section.8.3) >> >> endobj 908 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 88.3294 539.579 97.4352] +/Rect [527.6238 195.4361 539.579 204.1683] /Subtype /Link -/A << /S /GoTo /D (section.B.1) >> +/A << /S /GoTo /D (appendix.A) >> >> endobj 909 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 76.2474 539.579 85.3531] +/Rect [527.6238 183.3739 539.579 192.3302] /Subtype /Link -/A << /S /GoTo /D (section.B.2) >> +/A << /S /GoTo /D (section.A.1) >> >> endobj 910 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [522.6425 64.1653 539.579 73.2711] +/Rect [527.6238 171.2919 539.579 180.2482] /Subtype /Link -/A << /S /GoTo /D (section.B.3) >> +/A << /S /GoTo /D (subsection.A.1.1) >> >> endobj -852 0 obj << -/D [850 0 R /XYZ 85.0394 794.5015 null] +911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.6425 159.2098 539.579 168.3156] +/Subtype /Link +/A << /S /GoTo /D (section.A.2) >> >> endobj -849 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.6425 147.1278 539.579 156.2335] +/Subtype /Link +/A << /S /GoTo /D (subsection.A.2.1) >> >> endobj 913 0 obj << -/Length 762 -/Filter /FlateDecode ->> -stream -xÚíÙKOÜ0à{~…»‡L=~Ï• -*q jÉ q »a[Á†–mUµ¿¾NˆƒaWá!$X¡aã±ÇžO–qÿƒL0$ˆYR 9j¶Xœ­ü½ömÊШŒ[íUÅ»iaXuÎ”Ö t×™î²jy2{ÿñ¨Ú?ªŽç§Õa±_ ½Æ##—m—?Š“SΖ>ƒ$§Ùoÿ$l](-A+)Ã7—Åqñiè0ºÛ…&g‚„4"1!£©X#ON“¿ð·Ú™ìš—$i¶l6›zQ^ÔίçèfWë˳/õå¼tœf0/5ç¯å—¢'˜Ñ½Ê+òNÈ/ê°º[¥º^±›‹ÏQñ†¸2Ü.Þvÿmõq‹`ÐJ$g';ü`GY0ÖboGß·³ª¿¾J¿21/§)¬÷dMQ`NS\OD9®)‘HNSvøA“Ô`R¯ÉÜÑ´ù¶jþ^5uëIî =RXêÉ¢À¤¸”ˆzR"‘¤ìð$!ÁãzHöRs¶®—åâk½¸X\5çóÒh±ô`Aa' Šs‚â"ºqA‰Dr‚²Ã‚Á!š^ÛÔoEz·=\PXãÉ‚¢Àœ ¸†ˆ4.(‘HNPvø ÈÓFõ‚(äÑô–ŽDÏGë?†Lf„Ý©1 -1*,•HFX~øA˜³@Ãr¿¨-±Í¯ï˳Ÿ~wÒVíx='¯P€É¼¢À¯¸À(Ô8¯D"9^Ùá^V)žíü£eÇëºY.üº·¾½€·P‘ÉÞ¢Àœ·¸â(Æ\©DrÞ²ÃÞŒ"žþ°ÛMß(ŒÚ -„ª¢mÔR„î(ßµ¼Ó«Áö”gû–;£Oê0Tj²Ã(0ç0–€büà–J$ç0;üàP àR‡‡G”·û^ÙbëÞiI”»=îiQ…eŸŒ* -Ì¡ŠËŠrüEi*‘-TËøÒ Ã…M½‹÷ÒÿæÿöÊ‚tN¤§+²’˜ÔÐöÕNÖŒNµoeþwã¹endstream -endobj -912 0 obj << -/Type /Page -/Contents 913 0 R -/Resources 911 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 703 0 R -/Annots [ 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 926 0 R 927 0 R ] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.6425 135.0457 539.579 144.1515] +/Subtype /Link +/A << /S /GoTo /D (section.A.3) >> +>> endobj +914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [522.6425 122.9637 539.579 132.0694] +/Subtype /Link +/A << /S /GoTo /D (subsection.A.3.1) >> >> endobj 915 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 758.5763 511.2325 767.5824] +/Rect [522.6425 110.8816 539.579 119.9874] /Subtype /Link -/A << /S /GoTo /D (section.B.4) >> +/A << /S /GoTo /D (subsection.A.3.2) >> >> endobj 916 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 746.5215 511.2325 755.6272] +/Rect [522.6425 98.7996 539.579 107.9053] /Subtype /Link -/A << /S /GoTo /D (section.B.5) >> +/A << /S /GoTo /D (subsection.A.3.3) >> >> endobj 917 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 734.5663 511.2325 743.672] +/Rect [522.6425 76.2275 539.579 85.0841] /Subtype /Link -/A << /S /GoTo /D (section.B.6) >> +/A << /S /GoTo /D (appendix.B) >> >> endobj 918 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 722.6111 511.2325 731.7169] +/Rect [522.6425 64.1653 539.579 73.2711] /Subtype /Link -/A << /S /GoTo /D (section.B.7) >> +/A << /S /GoTo /D (section.B.1) >> >> endobj -919 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 710.656 511.2325 719.7617] -/Subtype /Link -/A << /S /GoTo /D (section.B.8) >> +860 0 obj << +/D [858 0 R /XYZ 85.0394 794.5015 null] >> endobj -920 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 698.8005 511.2325 707.8065] -/Subtype /Link -/A << /S /GoTo /D (section.B.9) >> +857 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 921 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 686.8453 511.2325 695.8514] -/Subtype /Link -/A << /S /GoTo /D (section.B.10) >> +/Length 844 +/Filter /FlateDecode +>> +stream +xÚíÙOOÛ0ð{>EŽí!žŸÿûÊ“80mô†8°&” Ún”iÚ>ýœ66¯ÔyR ì!”@ýìg¿ŸÒ8’‡(µaÆ _Z¯˜æ Ëù²àå"|ö©€®MU¸Õɬøp&mé™7”³ÛRiÍ„ÞvæwÊY}5ùøùbvz1»œ^Ï΋ÓYê \¶]þ,®®yY‡ΠΤwºüþà ¼å²PZ2­¤Œÿy(.‹/©Côé64;àLH#2SMÅ3Ò„ä´'á£v&'LL+/ýän½yšVÚŠ ÎÇÃö ¼?Zg/°(hùP‡Tƒê>.ÊÝÉWTïWáÀÃzö߀¨€r‰PÜÈá7e™±:nrÇ­^m6ͼª7·Sp“õò¾ù3­¤s£¦W3Š =˜ +¤áBˆ~F™D(Fäð‰‘ÔÌ +ð#µÇ(à‰Žn¾5ÓÊq?Ú`'®î`;(²ƒ« ûíd¡ìÃ';B2kŒëìè—vÍ*¬¯Òã÷Ú‘4Åõ¬ Ršp=t¿¦L"”&rø¤ €9Ói2{š6ß«¿ëUÓz’#¤·BŠK= +¤ áRØ~H™D(Häð’ñž9mTÉî ­n–M]Íïšùý|½ºVF‹QÐk¥5*‚öjzå!ÑÃ'AÎ2Ï!nåÜ îR¤ÇkÐëÅ5,R‚p AôßVç¡‘Ã'AV3¯LÜy$(ÜD{=îÿßÿŸj0X +¤„áƒPýÂ2‰PÂÈá“0#™÷ySœqÇãîo÷ìÙÔVæAµC´ZŠl{+¿m¹×«vÃi»–£Ñ£:Œ•ìR±Ä[&Ê!9|r(\À§ãæäóu¯j±mŸiIã5â²F…)T¸¬ ‰{µL"¨ÒëÃJ{ѾšT¹7ˆá˜×Z¼ý}åókUe™tNä§+gÞJ_JÍÚ¾ÚÉšÞ©vPæÿ¾ªË“endstream +endobj +920 0 obj << +/Type /Page +/Contents 921 0 R +/Resources 919 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 711 0 R +/Annots [ 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 936 0 R 937 0 R ] >> endobj -922 0 obj << +923 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 674.7905 511.2325 683.8962] +/Rect [494.296 758.4766 511.2325 767.5824] /Subtype /Link -/A << /S /GoTo /D (section.B.11) >> +/A << /S /GoTo /D (section.B.2) >> +>> endobj +924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 746.6211 511.2325 755.6272] +/Subtype /Link +/A << /S /GoTo /D (section.B.3) >> +>> endobj +925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 734.5663 511.2325 743.672] +/Subtype /Link +/A << /S /GoTo /D (section.B.4) >> >> endobj 926 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [494.296 662.8353 511.2325 671.941] +/Rect [494.296 722.6111 511.2325 731.7169] /Subtype /Link -/A << /S /GoTo /D (section.B.12) >> +/A << /S /GoTo /D (section.B.5) >> >> endobj 927 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 710.7556 511.2325 719.7617] +/Subtype /Link +/A << /S /GoTo /D (section.B.6) >> +>> endobj +928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 698.8005 511.2325 707.8065] +/Subtype /Link +/A << /S /GoTo /D (section.B.7) >> +>> endobj +929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 686.8453 511.2325 695.8514] +/Subtype /Link +/A << /S /GoTo /D (section.B.8) >> +>> endobj +930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 674.8901 511.2325 683.8962] +/Subtype /Link +/A << /S /GoTo /D (section.B.9) >> +>> endobj +931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 662.935 511.2325 671.941] +/Subtype /Link +/A << /S /GoTo /D (section.B.10) >> +>> endobj +932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] /Rect [494.296 650.8801 511.2325 659.9859] /Subtype /Link +/A << /S /GoTo /D (section.B.11) >> +>> endobj +936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 638.925 511.2325 648.0307] +/Subtype /Link +/A << /S /GoTo /D (section.B.12) >> +>> endobj +937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [494.296 626.9698 511.2325 636.0755] +/Subtype /Link /A << /S /GoTo /D (section.B.13) >> >> endobj -914 0 obj << -/D [912 0 R /XYZ 56.6929 794.5015 null] +922 0 obj << +/D [920 0 R /XYZ 56.6929 794.5015 null] >> endobj -911 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R >> +919 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -930 0 obj << -/Length 2197 +940 0 obj << +/Length 2175 /Filter /FlateDecode >> stream -xÚÝYÝã¶÷_áG-pfù)‘y¼»¦¸ ¸¢Ý òæA+qmádÉÑÇnœ¿¾C)˶|wé-РX`M†äpæ7¿ÚlMá­µ"T¹ÎŒ$Š2µ.ö+ºÞ»¿­XБJ%…€‡…·%4QšgëÍ|‘·«¿|ÏÙšS’¦\­ž¦½ÒL#¤Y?”?'ïvùa°Ý݆+š°»_~Ài’d:cn…-É Õ~‡fèÚr,†ªm‚ºXbRžFí 悹Nûagaiºi¶kì€OïÛ}^58þ˜ïƒÎý±ìÇÿ¦Š¾ÿxÌ ²¤h›¾ê‡_·Oø9Äõûc3ä¿ad[TOÇ Íö»XÅ6C5T(Í’êŽ% Ý$8£;cÄ(Å£Âa§‰;ˆà,ÉñqWÙ.ïî˜NŠ]Uä5J÷yÓ€›3™¼Ðh{ÓÝéd¬Ýæn‘±·%ÊŸÚ¥­í6ªfö‡]ÛU˜yDIûlƒ®?\Ø!oÂJa+Nò>;ó'ªö‡ÚîÁ¹ë†ƒ¡Ã.wáÊT’Ø×õåûüÐã(ºT¼ÏA4‹³›X–Þ¶ïmOÀ-ˆ*ª–ù£ZÕÇ•+° jœ ܳ‡ˆ[·~­v< ¢·›@ÒUãàQKñpR·ùcî­Š˜g’™ò€bI Obž!£”&÷E{°¸‚|¾o‹Ñyn9¸&ifÎ’&om÷ ‚êýiÎRƒÆtù)I¨O‡·>¾ùo§ˆõ¨‘ãG'J2‹&½í /£OüÓãö\•6¼ÏW« ÚGØ lÇ0sÖ+õp®Õ”8(0¶^Q† ÌfNÎ]8òMa|üÒvC5îñÙyüÃý»àp8÷ã\ÙChbð£oŸ†—™)49äŧ|ÐéN/rŒór_5®ùÐvDobô |Ž©ú…M#öÂ1=½ŒÚEÛ…¤;´M¦ûüüÌ)Húu‰ÀC"ü£ÛæMõû‘“M'“¿>3>8 -¥ŽrÜ\AÕ„ 78Y˜ÙdÍHÊ%¬áƒh±ùùla+°_¥™ê@0ˆF(ažsý®7 °t2ÏRN†, -ôœA)*ìaˆÔqf§†dJfKÖñ›Öñ  RyEÃBÛé kÑFdœ(&ø9˜Q÷×±ÂÁÄ S¬4MƒÙ Ï 0Bš1ÉsÞUíæÙæk¿d¹äÄjž°8ùÚ‚§D -}å7A,û+£c”ú…%%”Æ8yÿiU ¢¿^OI¢ LQ¦=úP -F”Qò܇‡àðYÔ

ÑÚШ€<øÈÌ; 3š0ןW±9ùºtKD8h¬o ՟⻩Üb’Âvƒ/µî¡=¸Ó/3B -½´HÙ5#¤‰ºÁFˆ%FH#U¥362(¨«ínx±î  ªˆàF.ÑDßÖÏغҥ¡5ɸm *Þ¹ À.ë2ø°¤òŠƒÝ„t)ø0dY$ƒS™Ì®“ Dyغ -+úF…ÓŸ°3±|;•>cÊCºÍ–âùÚfÛbJù©Pì&ÀD1"”¿³Œir܈rLLÊÂZô2﮽d2¢…WN‚©Ù’“àǦ 9kÃ~¶¡ï?¢þBTBoë‘ç -hÇqÕR®°„ë%KôMK¢á³´ýP>ÇG¸²ìÚÖçâMÎiªÏñ¶³õÁqØÚ_‘ĶV&myœ³žŒ|ÖB‚¸ -ä8'&éˆÉK{ h ,$_ÆœQ“SÛ”•«ü ‰—¦áöŒª/»ÀKÒ;2b²îhOcãJx=Ã%úú8­3sîY»ûƹE%ýèöqï?‹Ÿ"\Lèx¬ëªÝvùaw\ª~‚}‚’oa`a讀ì|‹ã ̬;ºlô]:‰©âˆX ý+OD0ˆ·7öw—L†p.õy2aÃýu¦&ôåÏŽvÛ&t•?öñfW5ßÖqbçž:Nÿø:köE¯ w šlmãÁ‡JÇF¯7®ŸÌÿÎYµúëÃôÕI¡UÔॠM¡¡+ö«_W?ÿB×劮XQ"ŒVëx „Ã×û•0¤JGI½º_ýó¿œí˜5 7-ÀyÖ -Ãêó¥6ñLæÒ‰j6}ugA˜°Œ„«‡‘á¶ã[§pS‰•ïÊm‚+zz=ßâÛ¬ž–ü‚ÙÚFérúÌìŸî8MnÂ¥Žõõ!”ëS¥^ñ’ÃÕƒBÖoÂÜÿœ8ð„øœ)θ 'DnŒ8}·)áäÚL‰l“»VXÂ=|عoBÝJ÷zÊk; xòã¿þþ5wm?Ì4×êXÝ.¾9¨H1ºAß_€Ã¿±/¶ÛŸ¿ -}ëmDÏNùmŽ›!úÒsàž%DÏ<÷}õ›ãØè÷¥*‡Ým𾚽"ðÆ@¿"RC¤Té—ÀË¡‚Gˆ §²¬ÒÅšw?ƒŸÙF¯Æˆ—ÆCU_ÂÏÜø€~òò÷m]Þ†Ò«™þ %¸SPÃÌ—D)´:°Åé[ ×–D6‡Ïh¶ÅkaèÒê4·ú -B·€ójæþYpÃÝ]KÝ‚ˆŒËùÏ~W?ÿqOÁ@¨0_k½øaüéo#q¿$.¢G@ -Nå:(¹(dWn¿6žVŠ»ýñG¬endstream +xÚÝYÝoã6÷_áGXëø%‘ìãî¶ÅÅî’¢½>(c kK®>’ºý 9C[ŠåÍö6ÀE€ˆ¤†äpæ7¿Ê|Éà/M–2iÕR[•fŒgËõ~Á–x÷ý‚“ŒÊdš))¡3óv•I“fFèåj¼ÈÛ»Å?¾|)Xšç"[Þ=œöʵI­TvyWþ’¼Û‡Þµ7+‘±„ßüz÷NS©6šûi ¶ÈRm™ >Ô}۔ú¯ššÄåÒ¦6y”Ö0ÔõÒw[K›ÜOsmízì½oöEUcûc±'™Ûc×»=¶ÿÃ2öþã-<¸Ðɺ©»ªë;|Ý<à³ëwǺ/~§Á†Æn]=ŸIÖ°ß³U\ÝW}…£:©nxRcÓO‚3úSqžÚ,Ñt)Xâ"O +ìn+×í 7Éz[­‹Žî‹º3k•¼iPÿ¦½1É°ó›ûE†Î•8þдØ(ÝÎmŠ¾ª7´ÏÐo›¶êAÍ#Ž4ŽdÃáh‡¢¦•h+F +žœˆ‡UûÃÎíÁEðëJ€¢ý¶ðîÒYR¬û¡ØíŽ8¾/¶¢)A$؆F~öË2XÂuëRPÂȼŠ¢eÑ(Vuqå +4¨joßñË`wÖj†Ž‚÷f|SHÚê~èÃ"Ùœ?ü¨ßü¾ZEÌs•J• B±b©È%bž§BÎKn×ÍÁá +<ð|߬o¹ù`&͵KÞºö85ØÓNBƒÅp€ñs°o?||OñoOëP¢ÀG'HM‘Œε"~4à*ÎðRÃþÞÑ<.Xl5ga‚¢È$*x–[8_p$Œ—Ñ&¡w@¿=V¥£÷`ùjͪ…öv0PÜ7MĘ B]KÕ%6ÖèÛ ¨È)£™'ãÎù¦C7¾~iÚ¾öØ÷ÿpûŽ ÞüØSv¤K,>ºæ¡©Â’C±þTl¨ƒF÷r‘ã ]”ûªöp-ú¦E 5Ð3ð9B¦êf6Ø£cz"´×MKAwhê’¦‡øüÌ)ÒüËAP ü³ÝuõÇÉ#gÎ*yd|8QNE|ô'K;šl §e<‡E¦ à3{)éÓ +†A8Bs]ÜÖá®—0F4•Ò`„LC‹ÖîÐGî˜('˜NY.ÔœvâEí BÖÀ^Q1òc3 a2ZI-RÃa‹ šQö·¡ÂF¤- |Щ¦®1|¡O$ˆieòX´U3ÐkòiLaÕýeÕ¦¤jŠóGϾMM¥åO]¼ÞUõW–¡ŒŽsÏegè>Q¬ƒ¿Ÿ܈Aâ–l\À‡BÇzï8;Qýo¼V‹oïNßolu …gêF)üǛ߿üÊ–å‚-X°TZ“-Ÿ ÃÀšP)îJB“e&Žì·‹ý³¢£Báª8ÁZÔŒèž.µŠgZqNÌðÓ©)šàC*XFAŽ¶Š®<¡|¢ëJÌ~f“‡s³oñuZŸ–|Am ¥£‚ÊgªöÏ7‚%WáÒõÇÝå!2‘§*ϲW<„Pf1ŸôiîÿNB¦\ü'Îg\…“€¢ÝZyþÀ)gá$5P +²MáÓŽ‚Ëx¿õŸC ®•’p¹gbçN"ùéß?¾AÉmÓõ#IàµPÏ|>Ø‘¢wI>Ü‚éž_»'‚€k÷ÓWT¾^Gôè”_g¸¢Ÿ[Ì3‡è‘徫~÷›ý>Ue¿½ÞWÓ÷/ÞèèWäB¡Êò—ÀËeʤˆëÏiX¥9ï0|?£^Ÿ+¯Ì,~ÆÊôsPh¾mvåu(½šêk(Y2ËíKHbpMÓ°Åùˆ/K" ýç@4Úâµ0ô\ë+4ÖúB×€ójêþUp#àŽÍ4‡Ú #µPãßþ.~‚ýíÔ7ÆÌþPÿƒÛZêNœE„”‚©% y/è ³ÇŸÏ+ÅÝþ üLtendstream endobj -929 0 obj << +939 0 obj << /Type /Page -/Contents 930 0 R -/Resources 928 0 R +/Contents 940 0 R +/Resources 938 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R +/Parent 951 0 R >> endobj -931 0 obj << -/D [929 0 R /XYZ 85.0394 794.5015 null] +941 0 obj << +/D [939 0 R /XYZ 85.0394 794.5015 null] >> endobj 6 0 obj << -/D [929 0 R /XYZ 85.0394 769.5949 null] +/D [939 0 R /XYZ 85.0394 769.5949 null] >> endobj -932 0 obj << -/D [929 0 R /XYZ 85.0394 582.8476 null] +942 0 obj << +/D [939 0 R /XYZ 85.0394 582.8476 null] >> endobj 10 0 obj << -/D [929 0 R /XYZ 85.0394 512.9824 null] +/D [939 0 R /XYZ 85.0394 512.9824 null] >> endobj -933 0 obj << -/D [929 0 R /XYZ 85.0394 474.7837 null] +943 0 obj << +/D [939 0 R /XYZ 85.0394 474.7837 null] >> endobj 14 0 obj << -/D [929 0 R /XYZ 85.0394 399.5462 null] ->> endobj -934 0 obj << -/D [929 0 R /XYZ 85.0394 363.8828 null] ->> endobj -18 0 obj << -/D [929 0 R /XYZ 85.0394 223.0066 null] ->> endobj -935 0 obj << -/D [929 0 R /XYZ 85.0394 190.9009 null] ->> endobj -936 0 obj << -/D [929 0 R /XYZ 85.0394 170.4169 null] ->> endobj -937 0 obj << -/D [929 0 R /XYZ 85.0394 158.4617 null] ->> endobj -928 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F48 940 0 R >> -/ProcSet [ /PDF /Text ] +/D [939 0 R /XYZ 85.0394 399.5462 null] >> endobj 944 0 obj << +/D [939 0 R /XYZ 85.0394 363.8828 null] +>> endobj +18 0 obj << +/D [939 0 R /XYZ 85.0394 223.0066 null] +>> endobj +945 0 obj << +/D [939 0 R /XYZ 85.0394 190.9009 null] +>> endobj +946 0 obj << +/D [939 0 R /XYZ 85.0394 170.4169 null] +>> endobj +947 0 obj << +/D [939 0 R /XYZ 85.0394 158.4617 null] +>> endobj +938 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F48 950 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +954 0 obj << /Length 3187 /Filter /FlateDecode >> @@ -2690,66 +2703,66 @@ W ½þ`J9ÿdÑÆÇVþ¢Ì!ûȨÀÌBÖ?e‘úñcΗ`ùX¹žŸš¦-zXæç-@fØ:\a½ã¶Gî7žÛù¨ß•=Éȧv)½»@2wl(kz+0h´zx6éqŸSS> u»žQ¶àðI¼þ˜CÍ-í‚f¡œoMoqÓâ›äÚµ|Éï…2VDÓWÜãÒ|ññþkÿ=êø_bP*˜4Õ/øÃ[Df@ ž!þêóy©òendstream endobj -943 0 obj << +953 0 obj << /Type /Page -/Contents 944 0 R -/Resources 942 0 R +/Contents 954 0 R +/Resources 952 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R -/Annots [ 951 0 R 952 0 R ] +/Parent 951 0 R +/Annots [ 961 0 R 962 0 R ] >> endobj -951 0 obj << +961 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [272.8897 207.1951 329.1084 219.2548] /Subtype /Link /A << /S /GoTo /D (types_of_resource_records_and_when_to_use_them) >> >> endobj -952 0 obj << +962 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [190.6691 179.6723 249.6573 189.0819] /Subtype /Link /A << /S /GoTo /D (rfcs) >> >> endobj -945 0 obj << -/D [943 0 R /XYZ 56.6929 794.5015 null] +955 0 obj << +/D [953 0 R /XYZ 56.6929 794.5015 null] >> endobj -946 0 obj << -/D [943 0 R /XYZ 56.6929 756.8229 null] +956 0 obj << +/D [953 0 R /XYZ 56.6929 756.8229 null] >> endobj -947 0 obj << -/D [943 0 R /XYZ 56.6929 744.8677 null] +957 0 obj << +/D [953 0 R /XYZ 56.6929 744.8677 null] >> endobj 22 0 obj << -/D [943 0 R /XYZ 56.6929 651.295 null] ->> endobj -948 0 obj << -/D [943 0 R /XYZ 56.6929 612.4036 null] ->> endobj -26 0 obj << -/D [943 0 R /XYZ 56.6929 555.4285 null] ->> endobj -949 0 obj << -/D [943 0 R /XYZ 56.6929 530.6703 null] ->> endobj -30 0 obj << -/D [943 0 R /XYZ 56.6929 416.0112 null] ->> endobj -950 0 obj << -/D [943 0 R /XYZ 56.6929 391.253 null] ->> endobj -34 0 obj << -/D [943 0 R /XYZ 56.6929 164.815 null] ->> endobj -953 0 obj << -/D [943 0 R /XYZ 56.6929 137.4068 null] ->> endobj -942 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F21 702 0 R >> -/ProcSet [ /PDF /Text ] +/D [953 0 R /XYZ 56.6929 651.295 null] >> endobj 958 0 obj << +/D [953 0 R /XYZ 56.6929 612.4036 null] +>> endobj +26 0 obj << +/D [953 0 R /XYZ 56.6929 555.4285 null] +>> endobj +959 0 obj << +/D [953 0 R /XYZ 56.6929 530.6703 null] +>> endobj +30 0 obj << +/D [953 0 R /XYZ 56.6929 416.0112 null] +>> endobj +960 0 obj << +/D [953 0 R /XYZ 56.6929 391.253 null] +>> endobj +34 0 obj << +/D [953 0 R /XYZ 56.6929 164.815 null] +>> endobj +963 0 obj << +/D [953 0 R /XYZ 56.6929 137.4068 null] +>> endobj +952 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +968 0 obj << /Length 3415 /Filter /FlateDecode >> @@ -2768,60 +2781,60 @@ J$ ?6`³> endobj -961 0 obj << +971 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 463.1122 539.579 475.1718] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj -962 0 obj << +972 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 451.8246 133.308 463.2167] /Subtype /Link /A << /S /GoTo /D (diagnostic_tools) >> >> endobj -959 0 obj << -/D [957 0 R /XYZ 85.0394 794.5015 null] +969 0 obj << +/D [967 0 R /XYZ 85.0394 794.5015 null] >> endobj 38 0 obj << -/D [957 0 R /XYZ 85.0394 570.5252 null] +/D [967 0 R /XYZ 85.0394 570.5252 null] >> endobj -960 0 obj << -/D [957 0 R /XYZ 85.0394 541.3751 null] +970 0 obj << +/D [967 0 R /XYZ 85.0394 541.3751 null] >> endobj 42 0 obj << -/D [957 0 R /XYZ 85.0394 434.1868 null] +/D [967 0 R /XYZ 85.0394 434.1868 null] >> endobj -963 0 obj << -/D [957 0 R /XYZ 85.0394 406.5769 null] +973 0 obj << +/D [967 0 R /XYZ 85.0394 406.5769 null] >> endobj 46 0 obj << -/D [957 0 R /XYZ 85.0394 301.1559 null] +/D [967 0 R /XYZ 85.0394 301.1559 null] >> endobj -964 0 obj << -/D [957 0 R /XYZ 85.0394 276.6843 null] +974 0 obj << +/D [967 0 R /XYZ 85.0394 276.6843 null] >> endobj 50 0 obj << -/D [957 0 R /XYZ 85.0394 200.1512 null] +/D [967 0 R /XYZ 85.0394 200.1512 null] >> endobj -965 0 obj << -/D [957 0 R /XYZ 85.0394 175.6796 null] +975 0 obj << +/D [967 0 R /XYZ 85.0394 175.6796 null] >> endobj -956 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F21 702 0 R >> +966 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -969 0 obj << +979 0 obj << /Length 2458 /Filter /FlateDecode >> @@ -2834,39 +2847,39 @@ Y K³ËZ! U¢|õ },ä-T\Èiù)¶†—™M¬)¢Ût‡KBaŒÂ´˜ŸS7`\&Ö^±¡‰&&Ú¡Ù’å^_ˆ¼=¢ µŽ¸Š©/@ð$.˜Á²n 0ãf—«{/Qc‡çöùŽ±Éñ¡ÚÖ=¯tñÍX>Ëî)z /{0„öG1Y C*5÷Hò|ÅjAÀùеa0ÂXë–KƯ,†•p=†”Fä9‰ñléÜî|uÚ$1Sû52Ñ”*?õVù8ijÞC@üû 3ß‚ü¹=á¬zÛ”SsÀÖ'¨‹«ƒNøÒÕæOwíi¸þáñé=|ë5ë~ÒÅÀªƒtk¨€ƒ6¼Ý ]´Né!)½=Á˜*5$ÐyúÿPŠrla±Ö¯æj§›íb5% îÖfÏX.]äü©pšwzc 4vÖ׳Ü]Õ°»“™2_$¡OæÖ#ç’_åpÚÐØ°ö4uîëÜzû.—H38Bn«‚'äô°…ïúýuoõÖV1J¹–cݽŒñ=Ãm}„R/"$•§Ž4÷•>‚tùª[«_Ð@âIŠý[†a{ÓШk/O \¯\iܽŒ‹µyîbm^`8O_Š­j˜=:9M®<uH&)!Íf¹² E ¤òïFÜÙ Ív¤Yžú*Ï]‚ÍŽb7KFY!ëö4¹é>a±¬z Ù\˜"T‘2»Œ·SCNE˜"¿ÄTz[Õ•=L A05h1„u”»œdkM9C€/¥x$ue¿r~EÇðyΟ¯Ž&áèBg Ú½.ßóh¦·\Q&ɧw%±»Üéu©®Œ¡™ÐÙ^ôÃo)Ó$TK …3¸U£©UPk\‘;cpËÜÓ…à8~*”©DGÊR³)=„ò6MÄU$ä¨U“—¿pf¥ÉÖ\:âç¥Z¾þ®Úé=YO½å¼zxã¿H_ø‡ÈÂ?!á˜èþïÿ]¦¿Ÿ¢4PY&—ÿRÁá("Ì”K©á çþš[Öÿ xK:óendstream endobj -968 0 obj << +978 0 obj << /Type /Page -/Contents 969 0 R -/Resources 967 0 R +/Contents 979 0 R +/Resources 977 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R +/Parent 951 0 R >> endobj -970 0 obj << -/D [968 0 R /XYZ 56.6929 794.5015 null] +980 0 obj << +/D [978 0 R /XYZ 56.6929 794.5015 null] >> endobj 54 0 obj << -/D [968 0 R /XYZ 56.6929 717.7272 null] +/D [978 0 R /XYZ 56.6929 717.7272 null] >> endobj -971 0 obj << -/D [968 0 R /XYZ 56.6929 690.4227 null] +981 0 obj << +/D [978 0 R /XYZ 56.6929 690.4227 null] >> endobj 58 0 obj << -/D [968 0 R /XYZ 56.6929 550.0786 null] +/D [978 0 R /XYZ 56.6929 550.0786 null] >> endobj -972 0 obj << -/D [968 0 R /XYZ 56.6929 525.2967 null] +982 0 obj << +/D [978 0 R /XYZ 56.6929 525.2967 null] >> endobj 62 0 obj << -/D [968 0 R /XYZ 56.6929 393.0502 null] +/D [978 0 R /XYZ 56.6929 393.0502 null] >> endobj -973 0 obj << -/D [968 0 R /XYZ 56.6929 363.1913 null] +983 0 obj << +/D [978 0 R /XYZ 56.6929 363.1913 null] >> endobj -967 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R >> +977 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -976 0 obj << +986 0 obj << /Length 2095 /Filter /FlateDecode >> @@ -2884,66 +2897,66 @@ D Õmíš™Q‘‚z â~ó ¯ fÙ"‡èâ9Lt¨ž¹£j¡ mK(ÈÏbµÌ¥X2¼É6õpT!h_¥^ÁO8,uU•a¸‡àk"¿°•6ª ÇsÓ÷Oã_IZ:ä[²ÑiÉ*Np’êZÀu ‰¡‰ñìK—!Gµ&¯!cÖ`þû$8‘ôbGÊ=6ü¡ºJ¬« z¸Äã5Âr‘> endobj -982 0 obj << +992 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [519.8432 268.1131 539.579 280.1727] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj -983 0 obj << +993 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.0431 256.1579 143.5361 268.2175] /Subtype /Link /A << /S /GoTo /D (acache) >> >> endobj -977 0 obj << -/D [975 0 R /XYZ 85.0394 794.5015 null] +987 0 obj << +/D [985 0 R /XYZ 85.0394 794.5015 null] >> endobj 66 0 obj << -/D [975 0 R /XYZ 85.0394 769.5949 null] ->> endobj -978 0 obj << -/D [975 0 R /XYZ 85.0394 574.3444 null] ->> endobj -70 0 obj << -/D [975 0 R /XYZ 85.0394 574.3444 null] ->> endobj -979 0 obj << -/D [975 0 R /XYZ 85.0394 540.5052 null] ->> endobj -74 0 obj << -/D [975 0 R /XYZ 85.0394 447.7637 null] ->> endobj -980 0 obj << -/D [975 0 R /XYZ 85.0394 410.3389 null] ->> endobj -78 0 obj << -/D [975 0 R /XYZ 85.0394 348.7624 null] ->> endobj -981 0 obj << -/D [975 0 R /XYZ 85.0394 311.223 null] ->> endobj -82 0 obj << -/D [975 0 R /XYZ 85.0394 189.9853 null] ->> endobj -984 0 obj << -/D [975 0 R /XYZ 85.0394 156.0037 null] ->> endobj -974 0 obj << -/Font << /F21 702 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] +/D [985 0 R /XYZ 85.0394 769.5949 null] >> endobj 988 0 obj << +/D [985 0 R /XYZ 85.0394 574.3444 null] +>> endobj +70 0 obj << +/D [985 0 R /XYZ 85.0394 574.3444 null] +>> endobj +989 0 obj << +/D [985 0 R /XYZ 85.0394 540.5052 null] +>> endobj +74 0 obj << +/D [985 0 R /XYZ 85.0394 447.7637 null] +>> endobj +990 0 obj << +/D [985 0 R /XYZ 85.0394 410.3389 null] +>> endobj +78 0 obj << +/D [985 0 R /XYZ 85.0394 348.7624 null] +>> endobj +991 0 obj << +/D [985 0 R /XYZ 85.0394 311.223 null] +>> endobj +82 0 obj << +/D [985 0 R /XYZ 85.0394 189.9853 null] +>> endobj +994 0 obj << +/D [985 0 R /XYZ 85.0394 156.0037 null] +>> endobj +984 0 obj << +/Font << /F21 710 0 R /F23 734 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +998 0 obj << /Length 605 /Filter /FlateDecode >> @@ -2952,77 +2965,80 @@ xÚ¥T 4‹$çÉ™‘•2' £JëØé}•ª±Ö¶Ìì¢öìJçÕ¥-ÙZ³ØÖ>ðAY³ìöwªv™÷ö»)ó?A‘ÿR¶Ph÷ÑÆÑ~»¥Ý…ÁeêsƒLÕù“éÛôÖwC’œ[yžTÝäºgGE8ìIƒ‹|7ðÒ¾omè[”—™~nlNÓímhë<ïRBHì640; ó}å*!²á ]ÖÑUA«ƒlÛ*kyÓÚ Ë54<ªàmgvd¦gíTúä,¥ì¢}Tã?9_¸ûÿcZ8^¾Klue…zR…]fù •Úµº~±®Û´î0lÒqÐÝPµS#HÓÖù]ךÃ@ÿ;ÆQ?+G†Ä¼îPÿ{$ÿ©0BLz˜¶éTÐH PGª—œÐÌÇÙýHý/š@endstream endobj -987 0 obj << +997 0 obj << /Type /Page -/Contents 988 0 R -/Resources 986 0 R +/Contents 998 0 R +/Resources 996 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 941 0 R +/Parent 951 0 R >> endobj -989 0 obj << -/D [987 0 R /XYZ 56.6929 794.5015 null] +999 0 obj << +/D [997 0 R /XYZ 56.6929 794.5015 null] >> endobj 86 0 obj << -/D [987 0 R /XYZ 56.6929 769.5949 null] +/D [997 0 R /XYZ 56.6929 769.5949 null] >> endobj -990 0 obj << -/D [987 0 R /XYZ 56.6929 744.7247 null] +1000 0 obj << +/D [997 0 R /XYZ 56.6929 744.7247 null] >> endobj -986 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R >> +996 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -993 0 obj << -/Length 1222 +1003 0 obj << +/Length 1215 /Filter /FlateDecode >> stream -xÚÍWIãD¾÷¯ˆúäH¸âZ¼©OÍ°‰Hs`8TìrbSeìrBƒæ¿ójs6sàÊÁµ¼ý}ïsŒW üðªHQBK¶ÊK†Ò§«êø”¬öp÷ýö2,¥(e”Âfá6NiÒ‚ä«øÚÈ×Û§Íw¯H‚²Œ¤«m3ûÊrP  °­Þx¯Å°ŽIšDtýÛöG§ÆP^äب%à"C¸¤Vþ'~Nø1œ‚â;%?$ ÙO×­’Þ ]•¨ÌHæ­d%yά™$(i¤íhV,EeUíñY¸Ã~Xã"R§¶îbTG5Nû½µ¨ÝEuÁGJŽî‚wJî½ÕVœò~‹]+…jŒÆB­_N£€ ´ŽfÑûuI¢Æ´M’&-ŒQ™¦Ä¦e"r± >*Éw¯Ø‰w“õëFùÒUbм•n£z_XBëVîG473DYF|9FYRbë—"¼Žq’@Wø±þîº2^ …­!ŠÉ<ÀÐlêÕ[áÕ∕ìÞÜÉÛMRƒ2W—íh…V]§Î­éˆÙŽ-T¸ó·ÕŒì¡ˆyòÞ£¡Z®ƒ=ß8+àÜÄkN¤×úó˜¥s0‡¦Ëv±óòU× -©Ç¥·†EòS€Š2Of=§&ü¡W.tÀLFXôÚyÉß'1´¦÷fÓ¸<Žn§&=Z|KÁµ½áDnãÖ [;ÑiteL-dçÞ^z@3Š Ñr0¡sSùØò¶Ð°´@EžQ/ëph‘@#†I¨„ƒÜkg+¡Û“€:cŒ£¯&L0À3LDc‚o`Â=æÕÔÕn¹ó"¦iâ$ü©ÏÍZ™Z}!W‰37µu£VDS' 0|‹Cš R&®}› ô ½=+·-n;N;)LùÍæìÏíxp+íµl)Ýrn¬Ù4ƒ:¢[ظbñª»ø»xøË=pIÎ -ÄP²!ìåö0¿>üô²J×­Ù¦‘ %*Š¼¼•«ÛZ  ÿVòy#tµ1ÃQïžs*ô^ mÌ梸”Û®®³ -©Þ†/F¶œWˆåçÁ¿líÝc° £?;7ÌÁÚ¹¶Ý:øëN©~Ç«Þ@]bôÕÂê ?¼”ÙŸJz ÏVd[}ćž?±àú­Ÿ#„WÕ°˜eÓvÁK§*ÞÔ¨¤÷ü²“Tºm|¡¥úrMøžÒ`^g¾'ïý‹çuÒ5ÀÔ™Ùþ—´oÉ—–è-ËÃè>²<8Á³2pÁ¢1‚3•ƒŒ>píNƒ?Û{³p…T™ý| „-KR”x+:BØ#†Ë›‚WÀè%Á9*))¼ëÍžô\Ç=Ïuü$îþ\¨tÚÕê8ÿMøLÌ:›$4 1Ë= -q/ÇV”ðç^Ƕġà2…¿@¡žKñÿ‹ubóÆ7Ü#ar/¼o°+ߨ £ØœWÕL ìõ…Áýñqùvå»`W¾Ý@˜UxÎ$U‹†O^re˜†ÑŽJûÓÌ©¿¦L¯ -/9ƒ¶‹Ôïè˜PTâ„ý'tüôívþÊ ß.4EæKhé;(ˆÄ÷txšd¨ e ™¼0½÷6R=ºû*Š™Üendstream +xÚÍW9ã6îçWSÉ@DóЉ©&“Iˆ-²)h™¶…•EE¢ìL‚ýïyä#e{¬Ý-¶HàB<Þñ½ë“Å~lQ¤„Š2YäeBRÊÒEu| ‹=ÜýøÀ¼L’ +’&BÀfæ6NEAÒ‚ç‹øÚÈ·ë‡Õœ-8%YÆÓÅz7ùÊrP °Þþ½dgT¿ŒyJ#±ücý3ª%$/rfÕ(¸È+…“ÿE +ÿ¦úSP|Ñí{Jù~쥩uë͈EIÊŒgÞJÆÍóÄ™ù©ÅœEæPvE£jÇg…Ï®_²"Ò§z«PjÐG5Œû½ŒÚⶺEàÊF·{o²6\íG0×Ô­òB;Ý0ªöËqPd‹œGï–%.>c›†1R¦)wÑX ˜‡WÉA·rÓøDd3:_ið‹JõFÖ-ntç²æÖƒ2¦n÷™jÁ"’Œû,&Œd´dί l3J¡òØ/oS1 +!ÁÏ|€¡ÉÔ³·"«àˆuÛ¼âÉ]ég«ÌSÛ\˜—õD–BØM£Ïµ­…Ý€vÉ¢Æß¾©Ú¾°OÙù&èúZš`´m&€7rƒ×ž´¯óç[Ud VÀB‰q±ñòUS«Ö s®[hÍV6 ˜¦‘Ñö™8Ï©…ßw¡CÏd<‰ž/ùç¨úÚÖÞnvÇwz4ƒkkk)¸v7›7¸ÞØ-ŠŽ¦Ñâ€ô†Ú^j 2A Ðb°Ð¥Í|l¼Î,-H‘gÂËbºÎƒFãœð„ñ l¹çÆeÂÔ'yfŒEß`OX0ØÀS›¨¿S•ŽJÍ—/b‹¦NÊŸúØœ•±6—²í™8K›[µ"%a·}((á%Åò­VPhíõYã"”Láv7­²é·›³?<×ÃWÆk¹Târ*¬Ýìz}$·mƒÉ’Usñwñð>XÉ Ë +’ºâÉÓía~}øñi®)±Z“M+ÁKRyy+·­{(†ú;ÉÇ•2ÕÊÇvóhØáwºÿàj`7Źخúê:ªê-ôxÙ|\˯½'~—{|ôÐ,ýàÏŽÀ X7×®ZÝhÝmdõÁØn{5øl1ù…›‹ìoÝz Ndë6¶úDö|übÂÍk7!„7T?å®n‚—FW²9èÁïñiS«M½ó‰nõ—s:Ã÷ tÌëÄ÷<ð½ñ<æ {˜:;Û_IûŽ¼YéˆÞ±<Œî=˃ +ž•á@ú 9ƒÆ +NT2æ ž®öv‰¿W™ü¼ç<™!Ž„¦$çðVDBT¹#†Ë›„WÀè÷)a9)/¼ç ¯õ\'=Ï5ò¤Þü7¸Pé¸Ùêãô7á˜T–R‘ÌížÜóØŠþŠkls +.Sø«ê¹”ý¿X'¶o|uÃ=-Lî…wà våã;d̛˪š¨!=ZŸÜOŸl_¯|É•o» +ω¤¶j'ÇÆÌ9‚4ŒýàF%Œ}ÌÄgcê®)ÓëŸÂKÆ ®Ô,u°7tÌ)Mþ:~ø~=}Ü„O‘û4÷ùDâ‹ ~û\w¼ )x™C6.&Þz›¾¤îÝý ?»˜endstream endobj -992 0 obj << +1002 0 obj << /Type /Page -/Contents 993 0 R -/Resources 991 0 R +/Contents 1003 0 R +/Resources 1001 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R +/Parent 1009 0 R >> endobj -994 0 obj << -/D [992 0 R /XYZ 85.0394 794.5015 null] +1004 0 obj << +/D [1002 0 R /XYZ 85.0394 794.5015 null] >> endobj 90 0 obj << -/D [992 0 R /XYZ 85.0394 769.5949 null] +/D [1002 0 R /XYZ 85.0394 769.5949 null] >> endobj -995 0 obj << -/D [992 0 R /XYZ 85.0394 575.896 null] +1005 0 obj << +/D [1002 0 R /XYZ 85.0394 575.896 null] >> endobj 94 0 obj << -/D [992 0 R /XYZ 85.0394 529.2011 null] +/D [1002 0 R /XYZ 85.0394 529.2011 null] >> endobj -996 0 obj << -/D [992 0 R /XYZ 85.0394 492.9468 null] +1006 0 obj << +/D [1002 0 R /XYZ 85.0394 492.9468 null] >> endobj 98 0 obj << -/D [992 0 R /XYZ 85.0394 492.9468 null] +/D [1002 0 R /XYZ 85.0394 492.9468 null] >> endobj -997 0 obj << -/D [992 0 R /XYZ 85.0394 466.0581 null] +1007 0 obj << +/D [1002 0 R /XYZ 85.0394 466.0581 null] >> endobj 102 0 obj << -/D [992 0 R /XYZ 85.0394 237.1121 null] +/D [1002 0 R /XYZ 85.0394 237.1121 null] >> endobj -998 0 obj << -/D [992 0 R /XYZ 85.0394 206.4074 null] +1008 0 obj << +/D [1002 0 R /XYZ 85.0394 206.4074 null] >> endobj -991 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1001 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1002 0 obj << +1012 0 obj << /Length 1860 /Filter /FlateDecode >> @@ -3038,185 +3054,187 @@ g:+ n9ê®ÐB©ªWúQEBŽ| ÌNuë`:ôkn‹}8ÔXÅÇtªëmý÷­¯ý=^¤8æñ Ç̃€×á<ÊÃ>%Åê+'Йú>êçòE@Û߈¶¿4E¢þhh!V²ŠúO@º¬bºMæ1áwÿ$‰%7BܲÌê½>ìsëD7c¸¦1êÿ0§‘ÌÁ¬‡^˜yö·èl™ê.$ ˆßf’È:®Ò¹ïXÀŽ2³—à‰+YÔÑ\÷¦ =n ˆi¬¢> endobj -1007 0 obj << +1017 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 190.8043 126.3509 202.8639] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1003 0 obj << -/D [1001 0 R /XYZ 56.6929 794.5015 null] +1013 0 obj << +/D [1011 0 R /XYZ 56.6929 794.5015 null] >> endobj 106 0 obj << -/D [1001 0 R /XYZ 56.6929 480.2651 null] ->> endobj -1004 0 obj << -/D [1001 0 R /XYZ 56.6929 441.7923 null] ->> endobj -1005 0 obj << -/D [1001 0 R /XYZ 56.6929 373.7178 null] ->> endobj -1006 0 obj << -/D [1001 0 R /XYZ 56.6929 361.7627 null] ->> endobj -110 0 obj << -/D [1001 0 R /XYZ 56.6929 167.4388 null] ->> endobj -1008 0 obj << -/D [1001 0 R /XYZ 56.6929 126.8733 null] ->> endobj -114 0 obj << -/D [1001 0 R /XYZ 56.6929 126.8733 null] ->> endobj -1009 0 obj << -/D [1001 0 R /XYZ 56.6929 98.4089 null] ->> endobj -1000 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1013 0 obj << -/Length 2705 -/Filter /FlateDecode ->> -stream -xÚÕZÝsÛ¸÷_¡—NåéÅA°O—Ë%×ÜÌ%×ÄiÒÌ”– ‰w©);Îôï À$EJÎø©ãàò·ËÅ~f3 -l¦SBE.gY.IJY:[ì®èl Ï~ºbž& DI—ꇛ«¿¾Ù,'¹âjv³ê`iBµf³›å§ùË¿¿øõæÕû넧t.Èu’*:ûâ—W¸ò¥éüŸâå»·¯ßüôñý‹ëLÎoÞ¼{{d4—ðæåwßýúêñ½ןo~¾zu¿¢û¥Œ -û \}úLgKøàŸ¯(¹Ng÷0¡„å9Ÿí®d*H*…+Û«Wÿˆ€§îÕ1Í¥B“TólDuœ©.͉\8ÕÙof„]'ŒR:ÿ±,ÖUÝ´å¿öæš16¯ëmc¿ðDήHγÜ!ÝlŒ'ê2e9¡)³²Zše¹b’äRhOóÝŠ$Z$Ø€€c(9*ã%á’Í‹j9Çaw¸–ž´j¶uýûq?‚)SÐ>Ë<áþpÍô¼^Š]ðBÏ ·bì$ŸÛ-®.êÝÎ2v“mYµNŽtUp èŽðÞÎþ8šÃCY­qV;ܘÃ94ÄJ8KÏ@ëvž1’§)êÀM[–++ÕÊp^VøÛ´[ƒC”õ±Ý[ƒP»¢%'6MaÁÑ”ÎÁ¸r6(éRM›`¤êE—g¯hÁÏó D#<{vAÁ¼”LûL­µ&œfóe½+œ†¨M¡ʺ‡kÜñ½S%ÌÿMS:fäR°6ñ VH 1Ë™·A¢µo7²›Ò¸] -Ü5XÛoMëéëUhü’7h7vfqçjþÆoŠÆÛR -’S¡ú¶ÔÞ×׉  DYšæo׉d|Þ”–)®—UkÅ¢-ïÌ#!Žœi ˆ%ΰçðš³oRÀ=“øEöÉmÑ.6C¨ûMͳ8¶¦ÁYÑ…³ßAûò£{I›Ât ÀŸmÙx«wÚ³Þa@ÛÅ'ˆì)+cÕ'¿Øž>¯÷Ö\ã,¦iÊÛàt+4¦Îp»að-<·S„TÇ5xƒTD0H‡#ÞÀ  •ÂxÌU¼@Šèbœú'£0–ê‘“ÕæǦX›I™„$"ÕêY2u0œLrT¦@\,Q`eŸ¾GWK»®&R¢UšzWÃè‰d=d¡·õdŸG€‚Qy¿ÆPq -$ÑR O#@)ɳLyg=Iû°7#Xœ³,ÕQ(üÊ1Ù ®{˜‹mÑ4# *%Y*äô/#¨\ÜV.]T4ñØŒ‘Lôô7K„t¿ïŸ’ËÊ-×ӌƕò§‹ò[ß2U{qË>Äkˆ9‘”C‚Ò‚Cñõ˜7ÀSÍ1D‹qÙô㊳T;¸/Côh‹ßÍ ؼ3’Xhw„úÞ›42 ,Ä%´¬Î¼cîƒþ:Í]ÝbýœØ­&CiqW”Û"Æ=àšaéó»~;*9U„çOËÏgØŒH!ƒÛODÜCøš¬jR0Õªš.ÕtU©ºUj—© y’*užk¤a+Qز¸Çwº g’Ÿ¯ 9¸3ñð…GÙºÊ4›Ýj†òšÍ¿š—œÕ—‹Hâ+^ I×ù,9ƒ€p -›Ai:ÿÁ/ͪ8n[»ùJ WufÝ6øÖ­iï©ðÑ‹"X¶e±¯^$ôLŠòkPÑÀÞØ"¥2Þ8‹åͺiL0ºÛPú–­·ÎÕ±ZX³,ü§[ó vtë-Ô|iMµ4ËàÖífàÌ'1À›údbO)'TÁN>#‰v1¦{¤º˜ØeÊ….é92u1¦{¤Š¦‰á=)^.·Õ¡¹¹¿ ?YŒå~¯eÈnS9çÐDSHòöbùP-ëv/6¥°½8‘øû™+âýë2^¹3ÐÇ=!ÉyÈ÷#·5Q9—ýÄ}0í¡4ÍÓ±wÅ]m‹õØçCÐË4âÉ8RcZ¯±¶ãšæ‘B,è+´o+ûeÏA3>÷ÿ5¹NgF{Zv•<³GMò|víRMg×H5<³éeX®¡ŸÍøyΑêk‰•iØÂIÞ§çEZçá¼ÈvÙ ÏöÓvúi‘fýÚ>Ä̓AUWIç©MÚ§³.=6ÊîÍí¶¾¼6~²ÐÓ¤Ê œz|'RfKDÈê®›…™?s‚‘whàqŽ=u–=Ú,ÕPKA¤êÖÈI['«2!÷[_M Žþ_ä“xvè:ŸÇ³„ÑTå½äÐ÷l£„‘3Jø5–ÄYÕî7®2Î)D \Á³§õÑ6¼MwÉC­¾Â¡=ÆDû…‰/ÅqâY‡3gÏ [W¹8w%îÒaŽ.škQÅÊØ2¦ü€fÝéÐsç½0Ý<ì"E‘ÿ“üÙ›Zçl]ðÆ@ÿ°¼„佂ÎQtÕiFBL§‘dfü h4¨0“sÜ®#ÐI<< §Ÿ0²Û_ŒGv„ -µ#÷‚+ÏÌ.¹cWø}ìzì¬'¬#[õBcå–jü½õO¬ ÖÖ•,¿r4êÓ’À°Á_T3 ·Ü>íl‹ëµ?Pgè£îLfq3où§{³(-²²ó» -#¿UÃ¥ìœôý©e0fÆOØGG÷ãÑê‹aº°¿®™´”úGGà32’ØMZ ÿ&ƒÃ`3GÕÚK!¤M4Ý×Û•[³)îÊÚIdÒ¹žß{¤¥—¡ª=-â9ØÅðEàð{»]ëÈ•™&™Œ%â¹J&•…>ËœlÌø5œÚo8Ó¢¡5Å’Œ€%L䶵U6‰%™ìÜor¿ùb¹++På¡ÀSï8±;{?\ëÙZx[<„B<ø­YÇk…}qhû×ñÌêiH£ÞÂOƒÊÀÇjm&3BµºPkw©¦kíHa™,6fñ;Xâê¤äV)š,?/@¤‘ ¿ß”@$æ}&µ˜ŠɈ˜lÍIÆs~z›ë[)ûj3Ø—æ¡j‹/Ã=9­œõÉxýì„!r(N¸Ri¼ ¤|;}éco{5eâ9Tcºª‹T«:Ơϱ¥Òsdê`LWu‘jl‡}q÷ÛÝ׳§/L1F­cœ9˜E[ãÍáð˜@ÅSö­—/«rk&ÀŠ5§ª{`0æ¼SuÞui¦×Ó ´õµ®Ì©ÛÂFI¦Ï±Ž4'¼ûº€,Âï2?ç°úÔaƒ€C‡•°qâI[„0Ú´áb+Þ¯œús<-‰ v·ÓÓ7°)œ=ë®3"œ¹}Eši7ô›-Rbÿ5h„!—kÏþ¤ÇÌSZóq#T¡çYÊ -ÏÒ¡äñ_•NEÿ…6_0endstream -endobj -1012 0 obj << -/Type /Page -/Contents 1013 0 R -/Resources 1011 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R +/D [1011 0 R /XYZ 56.6929 480.2651 null] >> endobj 1014 0 obj << -/D [1012 0 R /XYZ 85.0394 794.5015 null] +/D [1011 0 R /XYZ 56.6929 441.7923 null] >> endobj -118 0 obj << -/D [1012 0 R /XYZ 85.0394 769.5949 null] +1015 0 obj << +/D [1011 0 R /XYZ 56.6929 373.7178 null] >> endobj -966 0 obj << -/D [1012 0 R /XYZ 85.0394 749.3395 null] +1016 0 obj << +/D [1011 0 R /XYZ 56.6929 361.7627 null] >> endobj -122 0 obj << -/D [1012 0 R /XYZ 85.0394 221.8894 null] +110 0 obj << +/D [1011 0 R /XYZ 56.6929 167.4388 null] >> endobj 1018 0 obj << -/D [1012 0 R /XYZ 85.0394 197.4323 null] +/D [1011 0 R /XYZ 56.6929 126.8733 null] >> endobj -1011 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1021 0 obj << -/Length 3394 -/Filter /FlateDecode ->> -stream -xÚå[Ý“Û¶¿¿BoáÍX>‚lŸœÄN™Ú‰ïÒ´ãø'RwŒ%R©;Ë“?¾»ø")‚’'éL;é܃Àår±X,~Ø]àØ‚Â[È„$Ï*‹‰¤L.VÛ+º¸‡wß^1˳tLË!×W·W_¾j‘‘,áÉâv=•š¦lq[¼‹ä$Ðèõ󿿸^rI£›o¯¥Œþ?úùÍ÷/Þ>¿VqtûêÍë›ë¥¢Y}ý·çßß:ŽË2¾~óúå«oìå\¿¿ýîêÅ­Åp¤Œ -¯WïÞÓEþ¥rñ”°,ã‹íU,‘±Ž²¹º¹úÁ ¼ÕŸ†,KJ¤Œåb)b’Bÿ!.–L$Ú! -ôf)‡†ÌH"¸ðÆÙÀø)#2ËäÂs¡ñë|[ËÕC¹úð©©ËëeBiônYüòëã7ïÝÓ --õåK)Ò˜‚yCPÊj“·­auÉ3’¦*³\^^'$Œ^:Í¡Ûº€Ä1›—Ø]”XTûrÕ5ûc@¨ŒIÂ%;ú -³„sÊÔbÉɤä¿Wú‡‹*ÿL%­îëf_VXcFÒX8©¿„q¢[†§|_¤pA2tõÏ”²Î« hÅæ¦:=dý'äÔŸ -: -O‰¢iÃú,cÆ ';tÕ¦êp}-Ê«r×:H ¶"È×üm—ï»@W°ÿdIìvfVЈEòäT侜 -¡~&=Ÿ¡;Ðè顺fÑêÁ|üd‘À<国H‰¨n:«°™!M¯ê燔B5&Ò2óûÕ­¿zÈëºÜáÛ¦(Á¹xý«µñYŒù’D&cÐ;6\ûë4:„T -"¿T^ð7MáÔ~ªº‡æ`1¯-€6;\­ESûö©Bo4€Úî6ùq²‡6¿·ˆ¼-Ûþ!oÚêåý— ÔBr€VL%”³ô¤#CS$véˆçÂáÿ¨QIbÖ˜Àrùý* EÌgHžËOÛ™Dr‡ÑE–²±5‡SïÝÿ¾z,ë~’gç8Î(¼° -†\ósì¹Ì¯! yMò(=7É“´yvzþ˳C’,žµ¦çššód–4„J#{Þ@&[Ü -þäo›W˜{æ:†·9àïõˆuy¦Ä_pñÇe|œº]»=x4 ¤øÒ—AÿîcÏ8¬Î³õ\S‹ŽÝ ”aldÒ·½IÏN¶õ “HnOx·9d¢6œó A‰<¾à®3>á¸t¡k_–Ÿ\±üO‰˜HA ËÎÕsM­:ö ˆš!)äc³ÞÚ]‰Û»qtØyW¶æë -”¥ð§8Öù¶Z™ K™pLØ4©núW¦UYAº µ´¥AbqZŠ0Õ.ÌS3Þ¦k0Ò¤þ<52[Kói+<´Fù²ÀÊ‹!bÔq^ -)¼¶>äVRYT%›º‰ŒîJój›åð)È¥¾l­ËeXbñÐqjjl‡†½;â/C£AÎmíφ µM Õí ³I¾±µÊ­6?¶!A¾7LWóh‹4ú¥9ìë|c\¨†œugÛ#½Õ -€¿±\¶4DÇó`×÷’sóqW‡âƒ>ñÁ‡‡ÐÖöÎ;ûì*lzb°ççû™÷"|0Ö0ßæ]Wnwzn¸Ï³9=‘¹ûXµžªMp­z8sÑ¿…µOe=‹_°0ˆL“ô<~ ¹æñËsµò§yô#Ê -dÿWÀËŨg-ÚG²“†#Ù‘M_ÔùvÂ$í±‹'™ñH æ江wCî½^Z,I¢± ß×MÿÊP*+±ÌA™HIœÒ“SÉj€eÊc™rX¦ÆºÀ³Ç65Ä6¬ÑãØ4²·;dK=Fà¶D¬\ÁÂÃh„ÙPÈìðL ·yø ¨ÚÏBЦ¡’i+riTChâl°/C¿ÀC¾Ö`"† ͨƒ­‡Ü -À3¢MÙé¡J.£çî3®·ø±[ -ðVV4.&md#¦,C8à¦XÒoŒjxzšáwÓÒÚ¸è®tF7³XÁñKßbæjN?÷®3sï¸LîÓ×3G!˜Ö˜Ó ={®i×㚈IŒw†F}ûÊ€HÜ©e¨ÑoÿÐ6‘4úkpÝÐè†`(2w^šDEc¹KA<—«¶«êû^Æ°×ÖžPp󘡪4ÉL–Eby–â8Ž†ò?–†fb+­2qØŠß´æýÚÅA@¨© 57„õðcZ—ä‚“8ñ§4Ã’ÕÈò‚AúêÏŸžœ¾ §‡ÿÌn8@ÎÍãÆì úD¨õa{gL±’iŽ‰“k¶|Œ‚n{ÑЦ÷Žñ‰FþØTE{âùuYºú…Èò# © §ú|°)ô~·Ô »jë:œÔXÊØ©œ__”¼$j C®3ëËqéÚ~—wí´ÜÊ`/Wò|·žkÚïxq±\ xÔñO˜7ï«ÎÚÂoÙØÐãWíØêÞp§ Æz³ÆËbT° ÓkÞxž Çðë¡Ü7Í<8í¹§I×apõ}{ñ¨¹¿×™SFlÂê2ÀŒG?L^˜V¸‘j. é,‰ù`ËíÇåÇݦZUÝæhèEe誳"S—G@Á)4qo»ª´wB`Å”÷þîÚhô8?Üo™ýåÐY6"óÇ`öD59Àׯë›!öZJÆa©tg¿€L`ãOÂZ4Jc@:=p‹ ïÚÜè¢N`¥9Ñz[©8+þzÌúØk5ìEq’òÔ}ª=ÄFëBé}îd»@WÖ êX¶ >bþ|ÛÝ©™µ\œ%þ6¥=>Ë„`fb9˜AËɘǟc9™AÔ#‘çáÏÐTr¡†?ä:ŽK_É£¯éáó ˜Ú:¥éÆäï‡ûCèsqšú궛½EAÀ0î_ýó%^×gÃ3Áö¾íÌ›bçÂе2WO‚¯ÑEèú…Žÿ†œ¾FŠT{–¬ãYíƒÀ°Ü™wÚó°[çy`3÷FÀ/,ƒ½A·*Ûvî_ `Fñÿ³Mýuˆ?üoýcགྷ4;ªSX3!V)4?K¦W/)¬þ„Tÿ7ˆ²endstream -endobj -1020 0 obj << -/Type /Page -/Contents 1021 0 R -/Resources 1019 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R ->> endobj -1022 0 obj << -/D [1020 0 R /XYZ 56.6929 794.5015 null] +114 0 obj << +/D [1011 0 R /XYZ 56.6929 126.8733 null] >> endobj 1019 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F53 1017 0 R /F14 729 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F55 1025 0 R >> +/D [1011 0 R /XYZ 56.6929 98.4089 null] +>> endobj +1010 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1028 0 obj << -/Length 3881 +1023 0 obj << +/Length 2720 /Filter /FlateDecode >> stream -xÚ­ÙrÛ8òÝ_á·•«"' î>erÌxª63›xª™<Ð$eqC‘‘ŠÇ[ûñÛx ’\5[©q4ÐFßù5ƒüÚèˆÉT]'©Š4ãú:ß]±ë˜ûþŠ;˜µZO¡¾»»zýA&×i”Æ"¾¾ÛLö23†_ß¿¬Þþðæç»÷ŸnÖB³•ŒnÖ:f«oþúžF>Ô֫xˆ·?}üpûýß?½¹IÔêîö§7ë„¥ -V^^ûÓÏïÇuŸo¾Üýxõþn8Åô¤œI<ÂoW¿|a×øÇ+ÉÔèë'è°ˆ§©¸Þ])-#­¤ô#õÕç«¿ NfíÒç´4‘6" °NÈ ë¸ä‘‰¥¹NtÅæwUq³–±YU}÷7ܬÊþ°oʸÇzu·õ“Y]·O¾Ýзü½/÷MVc/]=Úõm^v¬oé[”¶«š’ºOÛÒ­o²]éhØfí’·»ÇÈ`8åšó(ÕZXŠ»¾}|¬š‡hÉ}ÎV%× #“0d×µž‚Yv)3eƒ¶ŠÇÍ÷6«{` -c«_Ö_Žˆe”(%/à¡Ž ˜ßWl¢DèŸáô ŠB®úm‰ ±êÊý·rOƒÕ¸Ye}Y?ßpÎWp…’ñÕ§2/›ž@òmÖ<”7|ÕQ—¥ß‘nïð°¥ân§Ê Íá±€}i¢uènÿõᓽ#¸6.næW•‘4 \¯š¶§F—}³7M+\ÑYp`—u=žÛ¿2&ê²{=ÉW÷·ü©ªkjÝ»EDu]û]7íþ‰P´ý† v©Göïöà$wÄæpx:à™Ò5 ËË#¼2Œ”é¼êï\E•Š þÍß69ÝÏŽtY¹uÌ#¹é;Íõ -2(²šG‰IùÌêóœ£:Ž’„©9êÿGÙ¾éÇù6;Ã7…ÄoêC·=©èçñŠ~„7¬è3ÄqùÆåY¾='R"†Fj.±fv†5j` šé€2ƒ cR§ÌhF` -V BÐ z¨cçÓàHtveÖ¸íý¦÷ýÈ¡¥å© ²¥Ga Í qÁ” FqÉ2Î’sŒ1m$1B   ÞžNc}Y*“HÈá–â0Ï‘«­5®éðØV–ÔÍëìЕݟƒ&=¡:K‚(\Ÿ”Ä=;/Ñàüøb¿^ -2ûj Hy2úl[[j€–«5rAœR.ñkl÷áànGlZ |tðN¹¯¼aŠå ùBÀ(dغwp`˜û,'¿][tBêÚ€e_ûÓÍTyÝVSffò‹¡\䩧‰NA3¡}«lJè -oœ{ŸZJ,Dõ`ÜÅË$ ì+3bq=Zyœz(kW ¢Ì º_­iÁ¾;@Õ»µÓkrI…Q6q¼('Ú•‰ž†Øµ±V‚o©ÉŽËÁcœð*i$UrdBÌRà¸4/Ô›$ÒBzÜcNãNA,ƒ†]NC-}É$î -IÅ!v!‡©ðnÛCí8ÂÚ@F+ª‰v¢ -š* xW½Èäq“ÚݤÞïC¹IÞ4H³çàön Ÿ åPEàÛãøn–}~[è-!:V¡¨î„‡/‰ä·*àŒÄ°£nF’sh«t–¾à2lr P`Ô€¨ -m^p·)÷èž÷ùXáò©‘CçHˆ’ˆ‰A'¨:äsšÒkó¨tuÛ»ÃvÏ`ö~÷¹2R-R Œ€Ñ\Dæ±ÚýˆDŸ*|%¸Á¹+Á¿Åd¼‹­!4cÐŒ¿‹ÒÅõ›>¹Ð$P:伕ˆùy -x¤âA¿üA7-þàÊFÛšl’$ãç°Ž„½ò‰­ŽRÃÞÀGc¬vëë„«‹ÀHF[¥fÑî2«UE{»¢—ÿaPº²/ŠõT×jÝ8®CVÛÝ˶‚LÖ²(ßâÍý…êYýö`)=]¿'aƒÅuõµ Er¿ -¡B5p<º\ÈúòMXëÀB&«Lü’è ØÕ˜ðÏóÖÃŽëé–Gy©€{;c’(•C´gÏ:+eÔõ¦è’\Õ)l•R´Â­KX%@@A+姖FÎ…«°U¬‡žÕí¬Æ.€T%¿ ©æÉœIê!ÉÃÔ¤ 9FG`8ÅhZÿÜV¾¸æÇ…Õi²¿3‘ -çâÕc¶ïl¼¦b¥A+Ëóò±wí晃Ø*M!…òI’Š—1£ryÎxæ ¨äè @(·žíçjË/ÑŒí.Ë×»B‡ïÈ!sp¢gÅåe¯q/k˜¾Ùßu RçQ&™ãÄ¿gî-$ëÊu¬üóFÞþoàw¡ŠíÄÕúðÖýÖW+ãœ4wL¼ÈE|Ç3—bM© -!Ù˜Owd©2&? ýi4 ã÷þ(Ù 'e‘ ¯}'TŽ–j¦ÈåÞ#-³g~ÈËü#»à®°^€ª”¾0» È⡺l=—àSÏ%¨r‰_ô\‚¹„ (²Ç–­#Șpá±› qÌ` #yAhg’1p¸v@fåÖ®aãlqò§“fÔ0u¾ -´VÀØ$ ÄÄá;çéĬņŸàl<Æñ')†íè°pp«l7ôhh›øÚ$4Ü5%®l9N¹ÐÔŽ´4pïÖPhŠ#®Ÿ¨é{"ꃤ÷D»¥«ÛÀáÐÆq €¯?ÿdi hÔ`/„]’¥é‚ãûÑäýÖ…Ú“÷Y˲Íó"]™`š‡âà Œ¾øþ6ç(Ë¢Ç#—eM8J•¦:âO¤Žðï pøïäñÿÙÂø×èááRºd1é°# -Í“%åÃß7“þ?(†endstream +xÚÕZÝsÛ¸÷_¡—NåéÅA°O—Ë%×ÜÌ%×ÄiÒÌ”– ‰w©);Îôï À$EJÎø©ãàrw¹Øf3 +l¦SBE.gY.IJY:[ì®èl Ï~ºbž& DI—ꇛ«¿¾Ù,'¹âjv³êðÒ„jÍf7ËOó—ñëÍ«÷× Oé\ë$UtþöÅ/¯påÛ]ÉTT +V¶W®þvžºWÇ,— +MRͳÓq6fº4'JpáLg¿™v0JéüDzXWuÓ– üÚ›kÆؼ®·ýRà':üè,áŠä<˧›ñD]¡,'4eVWK³,×#Œ˜$¹ÚÓ|7ÂE­A l@Á1.9*ã‘KÂ%›Õr„‡ÝáZzÒªÙÖõïÇýO™‚õYæ ÷‡k¦çõúPì`/ô¼p+ÆNòy±Ýâê¢Þí¬`7Ù–•ÁQëìèHWõ×€îï=àì£9<”ÕgU±óœs¸3‡†X g ãXÂÎ3Fò4åÁü¸iËreµZ™ÎË +›öakpˆÚÁ >¶ûc‹cPjW´äħ)ì šÒ98WÎÆ£×%]ªiŒT§èÊÌá-øy™hDfÏ/(¸—’i_¨õÖ„Ól¾¬w…³Õ`)´AYWøp;¾w¦„ù¿iJÇœ\JÞ&¾ÁËCžeƒÂÛ ÑÎú·ÙMmܮƒí·¦õôõ*2hü’wh7vnyçjþÆ3Þ÷¥4§Bõ}©½¯¯A¨²4Íß®Éø¼)­P\/«ÖŠE[Þ™GB9×K +œ7àÏá5çß.¥@x +&ñ‹ì“Û¢]l†¬î7eX4_ÌâØšgE—ýÚ×à \Ú–A7 +üÙ–÷zg=¬]lq‚œ=ee¬ù£óÛÓçõÞºKã¹Ç|`'‹…išò6Ý +i‡3Ün0 +NåãSÅ)#Ɉ–"0ú4Â(%y–)Oà¼'iöf„ç,KuT +¿rL7¨‚ëÏŶhš¦*%Y*ä€é_F¸rAr‹\º\ÑÅGØfŒd¢g¿Y"¤«øý€ü”\6n¹ž4n”?]ÔßÆ–©Ú‹[öy$_Cn̉¤ + @ àë±n@¤›cÈ!3ⲉye¤PPPMçç EF¤Á{ïËtÚâw3ȶ\ˆˆ !£wyLã‚HuÈŒ ‡¬çèÔå1 "UtM¬Iñr¹­ÍÍý](Éb¬ ˆ{-Cqœ*¡<‡3è°%o/¢jY·“üâ™62l/2œÀ ýÂùýë2¿rgàø„éY¾a e_•sÙ¯ûÓJÓ<÷«m±û|Hz™æC~2ŽÔ¾ëë;îÌ=‚?ÉòÈý"Àû6ÄÙG<ËøÜÿ×â:]týýiÕUòÌvªäùêÚ¥š®®‘jØòéUX®á8œñó’#ÕÑ ++Ó°…“²OÛMC»ÉÒž <ŽÛA8Ž‹4ëÁíCÜ<Tu•tžÚÒ©}9ëÒã9Û½¹ÝÖ÷AÖÆ/B:`™T9a‚óA‹À©”YˆU݆aæ[V0ò!çœã‘<Ë}ž9·…µâ¶v¥†w°\Êúèß³Þä‡þ•‡¬~ùª¨ÐþߎK®ø €‘i¯q€Å0Çð^;ügó·}³"¡7"к6¬€Ý–8rÁ“ ,ývlüÈW{Lf…bô‰9†8XˆÙÜøÕA°óÐå€ýëxÄcƒ¹‡ô'Q„È8ÔAö,Ñå1""ÕE!%)WÏêxtyL£ˆHÕ Q_;0B š0>u—‚HÕÅÈI['«2t û'gM þ_”“xq:ŸÇ«¤ÑTå½âÐl§„‘sJø5–ÄyÕî7ç²®`ëj}´ç妻äY­}…CÛEÿ…‰‡â8ñάCËÚ Ã#,ŒÎÄ]ºèˆã¢»FUDÆV0åtë¾ÂH‡!˜»è…éæa,RTù?ÉŸ}×ÕÒ¸`ë2o œ–—x#¹å^EB稺êFRLç 1¨Ìø¸Ñ`ÂLÎIdävä#ÁÓÐ<…‘UØþb>²#4¨¹\yavÉumá÷ñÔcg=eÙªÇ!¬ÜR¿·þ‰ ¡ Ú†’•WŽfÝàZ6ø‹f†Áã–Û§mq'Bíû1ð cÔµd`7sð–º7‹Òr6Cq~Waä÷A¢i¸Tƒ“þ|jŒ¹ñöÑÑýx´öbX.ì¯;LÚê çGGà+2’ØMZ ÿ&vÑa°Š•£jíÒ‚%(îëíÊ­Ùweí4²}x®ç÷žÓÒëPÕžbm‰jx8üÞó/@L™ŒñȤ²pÎò}÷¿ÅÓ@û = ­)–d´e&r{´U¶ˆ%™ì\r=úb¹++0å¡à©W¤x:{?Ü +Z,¼-¿5ëx+±/mÿ6#ö OCõ~šT.8†µ™ÌÕêÖîRMcíHa™,6fñ;xâêr«”&ËÏ+©F4èï7%‰y_…ɦSñD2¢æ€·æ$ã9?½ öG)ûj3Ø—æ¡j‹/Ã=9ÅÎûd¼½vÊ ='\©4^$R¾¾3²—Åš2ñÕå1ê"ÕETÇœs,TzŽNÓ¨.Rí°w¿Ý}=Û}aŠpjóÌÁ,Ú/‡mIOÙ·Þݬʭ™h<€kNU·a0¼Su>ti¦×Ó ¬õµ®ÌiØÂFI¦Ï‰Ž4'²û¶€*Âï +?°ú4`ƒ‚À•°qâI[„4Ú´áb+Þ³œÆsì–Ä»ÀËíé Ü”ΞuU9œ¹¼Ešé0ô›-Rbÿ³hD wsÏþ¦ÇÿëWZóq'T£çYPÊ*ÏÒ¡æñ?NUÿ£^mšendstream endobj -1027 0 obj << +1022 0 obj << /Type /Page -/Contents 1028 0 R -/Resources 1026 0 R +/Contents 1023 0 R +/Resources 1021 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R -/Annots [ 1030 0 R ] +/Parent 1009 0 R >> endobj +1024 0 obj << +/D [1022 0 R /XYZ 85.0394 794.5015 null] +>> endobj +118 0 obj << +/D [1022 0 R /XYZ 85.0394 769.5949 null] +>> endobj +976 0 obj << +/D [1022 0 R /XYZ 85.0394 749.3395 null] +>> endobj +122 0 obj << +/D [1022 0 R /XYZ 85.0394 221.8894 null] +>> endobj +1028 0 obj << +/D [1022 0 R /XYZ 85.0394 197.4323 null] +>> endobj +1021 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1031 0 obj << +/Length 3424 +/Filter /FlateDecode +>> +stream +xÚå[Ý“Û¶¿¿BoáÍX>H€lŸœÄN™Ú‰ïÒ´ãø'RwŒ)R©;Ë“?¾»øâ·äI:ÓN:÷@Z,‹Å» [Qøc«H™ðd¥’D”E«Íîá·o¯˜¥Y;¢uŸê«Û«/_ +µJH"¹\Ýn{¼bB㘭n³w ‚\¼~þ÷×kÑàæÅÛë( +þ]óý‹·Ï¯Uܾzóúæz­h_ÿíù÷·Žâ2¯ß¼~ùêÛ;>×ïo¿»zqëgÑŸ)£§ðëÕ»÷t•Á„¿»¢D$q´z‚ +%,IøjwF‚D¡®¥¼º¹úÁ3ìýª»Îi.Œ(‰¢0Z­EHbŽŠI’AyŽ…¹YÌ¡%D +.¼òCÖS~ÌH”$ÑÊS¡ò«t—gëÍC¾ùð©®ò뵤4x·Î~ùõñ›÷®¶AM}ù2=nLÁº¡DÈeS¦McˆCò„ıJ,•çWÏðÌ>r ëc»?¶3‡džc{‘cVòM[N3L£H±1Ó§¦°J¸¦L­ÖŒ‘$Šøïåþá¢È?Óˆ÷U}È ) {¤!#q(×_f˜q¢¤ +-ÁSz¨f¸pA4õÏä²M‹¤bKK'Yý '9µçŸf …ÇDÑ8ÊzºŸ)èÌþµB +½÷/±y7Ã&"‰RÒi®(s”N¡"1§ª/ÐzQŒÉ•¢QJÍŸ1–fÝ#Ò(ÇÙÜc‰z Wïö  ›jx&„±HßM(ö;MHpSìŠ2=ÀA$¢ µø7;Œ¥Ì©zËÏl‡þ8±[ð½´ÔÌ ý ƒ´|JOiËŽ»}cšÛ‡Ü´´Ç¦M]µyÕzÙLwSmöù¦ø™Ržg(ÂjÍiH¸¤ÌY5³VMy™›c-¼=í‹MZ–'ÓTT曚OVl¯Yló~ÌÐм­»´Eƒ&Kæ!¥ ñ%óè-›‡#BéU¶¨a2JÎŽèh¦#Ö‰*1ñV¯BÌ£]ÝÚºÞ=PbA–BseZq…4e]šÔñŒ 1˜ ý¦vó Ä)Ay<ü2ÃsoF¸?¤;ÓëW?5FšÖ Üœš6wÙ®¨Š¦=¤pò™&m>s#m@ ´FµÖú°XïsàRà„ ƒzk¾©ù­*‚&?<‚Ù€î^¨8l¬j“ª¯^½þÆ”Ÿͩ' ,8» 8ß©?-šã~_ÚÆÊS–¦ õ•]ZeÏÉíîdŠçŠRéàs^žuÈ8¡b¤°c[”E‹û t‘Üäûvf ¾¥I¿¦oÚôÐÎ çO"Cw2ôf•^$—c–‡|‘)¸úIäôù ÍOÅ5 6¦ó“ESKË­H‰ ª[+°Y!Ý^T Æ!…:«Lp¤£ÄŸW_4†ýæ!­ª¼4Ìwu–ƒq °úW[c³èóIÉ!è꣮ÃuçD +<¿8º`oŠÂ‰ýT´õÑ"bZY­÷¸7‹¦öק­Ñj³/ÓÓdMzoy—7]%mÚêíý— ÔBp€Z”ŒÊYü‘>‹)»pÄSáôÔ‚.ˆaÔ(a»ü~‘ú,–#$Oå—íL 1„³Î¾ø¶Åý\à" D‚bì:6d y³9ù˜ãþ"GÜJsÎÞÀMöüNù}ÈçÂîo”ÈÏvA-’ÎùŽ1á,aŸë…ža¤ýkKFy?·"Á‘Pèá(’ÄIwbÏ‚!“Þ? <Ä@Eçn¦…Ý‚ÆÃÂÖ|Í)ë7gQÝO¶§³ä(¢x–]°öŽÈ{îòP¼7&V¼{e­/ ¼³u—a{Ô ƒ#?/m7oEX1Ú0}Ó¶Íw{½6ÜÇÙœŽxnA?V¬§‡¢œ„G«Îœ÷oaíS^-âl Å2>_}ªeüòTF¬ôi½†ˆò‡Ùÿðr>êYvžìD¥óžì@§/ªôN¡Œ;ìâ21 ©©vënš;+„-– )5–áïUÝýdZ +˱ÌA™ˆIÓÑ­dÑÃ2å±L9,SCY î±Mõ± sô87l`íÙbØÁ¦ˆ•KX˜ÆÚfÖÕï;öHÚ²Æͤ•,BÄ”õ¸%ŽhÏ69<½Ìð-k@ZëÝå.Áèñf+8Þ)yÁ×éS-c…§Ò¢×m±=ý_Å»guÙ¡ÄD™ó(1ÐæÛ¼É]ãõ›ÛW/ÿ5ÈÑ6KaÐÙ؇cê[,<ÍéÖ¾Guf핉}º|æ #ËrzadO5z˜! ñÍÐ`lŸÒÝZÊ™ì4úãÊÆS€B×¹cÐn†"q÷¥2ÈjKUÛ†TA=ÿX4mQÝw<ú£6ö†€‚™‡|U¹ f’$(Ë“çq2-écnÚŒo¥±5’[±Oc~ß:?Új*Óšš†íðcš—ä‚“Pú[š~Êj yÁ |õ÷OON^ÓÃbhNMµ4gƒ¾Q€Ö긻3ƘÉ4×Ä2Äœ-¢ ;^4´é³cx£‘>ÖEÖŒ,¿Ês—²™4uîTÖ™>ï6½¼a[ìÜ€“kO»”Ëû‹r€y!·Ð§:³¿•Îí·iÛLÓ­ ÎrÖSMÇn.&Á‚ÿ„qó¡h­.ü‘e -~Ó µî7&0Ú[T>£‚]8˜úTËÊóT8‡_ùáTÖËàtväœ&CσÓ`ìÛë„õý½Žt˜2²`v4\ ÁxðÃäÓaƒ[mÀM:JbÞÙ²¶sþq_›¢-O¦=+ÌÝ´–eì⨌¡‰{ݹ};&¿÷o׳ÇõáþÈì‡ÌÝe! foTg èºëuý2Ä>K™1EX¹ ‰Óß O`ãoÂTJm@ß8Æúomt3¬%'°Ók},W\ÿ2-Äø¶nêÉöŸ”éTpƒA/£&èíECFùý´I¯û3ë5¸J3²mÞ}±’‰œ ‡’. +{DËöçˆÌÑ^ïý•üÄ*D4"QñÙÁ=Ñdôá R°×„ †¿Ñà »4]Ü{;…±*Á.ý€¯pôùA“ 9:¥!µ~{‚{ÎègzXïåc›§4Øøýxÿ`ºXœÆ>»†åú`Q°”;ÁWÿ|ù-°—€À +.ø¡i±"ƒ|çÌ´£²D9»W>kè:•Æâ•öÿ°³§ô9R¬Ø»dða¹}õ3~!Îð1€Ùæî•ÅÈU€øRŠÞ-?²=¡¿G¤°·ÔàÙçLS%ý¡/,gûbo“7ÍÒ¿2€áÿÌXõÏ/þð¿9tÿýïâxéjPaŽ +˜X¡p*LNŸz¢F$Ÿýßð3*endstream +endobj 1030 0 obj << +/Type /Page +/Contents 1031 0 R +/Resources 1029 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1009 0 R +>> endobj +1032 0 obj << +/D [1030 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1029 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F53 1027 0 R /F14 737 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F55 1035 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1038 0 obj << +/Length 3965 +/Filter /FlateDecode +>> +stream +xÚ­[ÝsÛ6÷_á·“g"Ÿ$x÷”¦IëÎ\ÚK|3mhŠ²x¡HW¤âúæþøÛÅIA’;½Éd‚ `±Øß.h~Íà¿6:a2W×Y®͸¾.·WìúÞ}wÅÍÒ-ÇTßÜ]½~/³ë<ÉS‘^ß­Gs™„ïïV?/Þ~ÿ槻wo–B³…Ln–:e‹oþúŽz>Á+­ÿðoüðþö»¿|s“©ÅÝín–ËŒ¼<öÇŸÞÆ}ºù|÷ÃÕ»»°‹ñN9“¸…_¯~þÌ®W°á®X"s£¯Ÿà%<ÏÅõöJi™h%¥ïi®>]ý-L8zk‡Æ$§¥I´YDtBŽDÇ%OL*Íu¦ó$•ðeW¯n–2U‹ºÇ_½ØÝp³¨†ý®­V TËÅÝÆ¿,š¦{êi@ÑR_õÛPíÚ¢¡ÞG;¾+«Þ‘ ‘­* ÛÖmEÝO›ªEé|Ä£d:áW°3d®-¶ÕÊ‘·"U’ +•:ªMáöPvÛÇÖ±C®—RæI–§×KΓ\ka‰û¡{|¬Û‡d~vœ)˜_e×O“1v ZŽÉ¬°• ›A8 TÄh3€H[ü¼|ü|Ä@*“L)yOuÌÀô´S“dBÏ8ø»Er1l*lˆE_í¾V;ꬷ ﺪæù†s¾Œ/>VeÕDRnŠö¡ºá‹žž·Åªò3ÒÙï6Ô±z†ó«KZfÿ¸‚yéEç–»ý×ûǔ›éQ¤‹À׋¶¨Ñ_«5­nqE{ÁŽmѸlÿ˜hªþ*W€,Šìï¬t½9`°Æßê·Ç¦.kwV_‹fFêÚ °—¤>&;-õ@e-­‹«,8¡ÌäüÂÊžêxå©DušdSÓ¥ÿ_egä¦3X8½(·Ù¹y*d~ÝìûÍIC?¿n0ô£uã†>Yø=.\½@peQnΩ”H¡‘›K¢‘§ +¢A1fPaL>róG æàÕl_`ÐS38•a(V¤3ã2|¨¿VÎ8-c¶u@PÞ*OžŠKò“–w "] ûþha~“Cr~aOu¼ðÌ‚xx;YùÛºl + Lx6l»[㯇¶,@[€Þ‡np¯†M1ø–ëj÷Û{ Ê` +šJ,þaÉÍ^·e³_ù§0ªn(ežÌ(´ &œÞÝ×íêõÛï#àoŠABLÁ .îÝ÷j¦ +«j]ì!›8^pR®™\ÉëÛ‘(2Sølj½KÖë°¢‡á¶Ûé…ã§# éow4kÙµˆ@ö4çêŒæBæ«ØÅ?&;£¹ž +w»«Êý®Gß~*;¿vHÀŽÖŽ'`“Å¿ÝogGÙÔ½“Sçdþë¾ÚÕU¬Ì$¹‡ò{«?3Ø6‰½šçÑ9y8 væP„Ht~ŒÉΊ§BŠÔ Ö]ëä®ýo·^vO§Î…N´Èý&¿ÖÕ'IⲦñª`‹F0Ÿ¹%ßÂä‰È¤>¿Å@u¼Å©yAŽ&´Ê§{|×÷ :„›ãïªîß~øôéÝ[jb}#ßш7ébÕö}U.+Z)æi4p&nc§_¤ØÃëvÀ¡¶ðdvä¤Z@§³ªê BBL«Zy®Z€}Ò3xKÝÖº¡YÂÞ‚û«¨¬ÜT•ËÞ†WØ‘º0c'<8} ´~ÛŽ^?Ùè ƒëpiø×zåFxŽähzÓÙ¹=Ûm¬:BE!ÆÕñá é+.¶B¥wÖ™Jâ¢×te °®C W”™0—€Ý:åܵ«2¦Á"1,õH2—r|Q»î#õ“%R4úºÊ׸Z³­#K yaê ëéº`ÉÕ¬bk\Bå!&Å&ó@÷H9¶Ôì{T²/Ü9@+Hl²aí9øÔe¯D)ż“îC³¶½>L>žMxÄ©òø€Žu·oW¯"‡‰Ò‡žåS :U—™ðLº +!ãÎ-b«éº/ÔªÛˆ$2•è”§GGú¥zŽ( Z–y—ý Ó 5'³©ÐU/‘b“ÊkMÿÜ£º¬ê]dþTìÔ¾ü÷Tô4ùªBY¶ÖÛصl‘Z䧠ñÍí‡o]=–ñ$Õ<›æý¾nP7ÐWá¬Â#:؇Vï¢ZÃAÚ© +à䌜ýƒP³ '§ÎSãâU[íÈb·­%ÁïîÆ,ömë ÞQÍO'êP?Åõ—(Ë›†ÁèeáNXpå­6"íË]}.2™äBÏ”Ž4f‚§‡Ã„\\‚1H´EÐËÝÃ55>Ž‘•§_ŽD çѼTñ(V™p¢b•,™2>á'ZɲT—¸8šÍ&"$¢„ÏŸÆhë½ñ\ô‡L)³Hþåq*¯‡+,!r[7Ån|ÿäc$öt±¢: µD+ÎÇÀú”GÖ9Ú— y)sá.`úV§>Z½k1&Ó÷;§-à%Oóùýè3–SñæB¤Ù‰hÉEÎøÄ­öñ‹26s”ÂHæ“ŸrÈMY–½tv¢w"Ï=bšMTÂ…K¹cs¥`hÊÁAfZ@ËA¡zt ùÃ;|V‡K%|ùD0ZEßw%Þ|ÑÙ¼4Ãäbâÿ(R™t +jL†‚ëéEDøK¤Ù¨ ½.¢bkS—¢Ògê<ðÛªhÝô~Ò{¿|rèiyîàPvtoeÚ„Œ…d„Kæ83äôˆ1-Œ0$tf±ÑÓÓyª/ke–N90‡yŽ\l¬sÍÃ}bUÑcÙû¾êÿu镇\DpyRSŒ@ì¼FCðã³ùND)Èð Ïy¦Nh7DžÃ¶ý¬ÝnˆM«’Ì(ÏBsp ð³9×’‹$Íæ÷©'å!ì=¹‡/CñÅ&òô³él…Z®DÉÝá"Éjår?Æ>>ì݉bM+ A„ŽÞ©#÷;L±ü½()ô ÃÖ½£Ç<%Å}x´µ*䮋xö¥ßÝÄ”—ý °š33Ñ_´å§':+zCÚ£XûÂÖÕë4w­5×X@õàÜÅË4 ü+3bv¾ë>£ÖÊ¸ðŽ°‰wƒ7€æšØ”:b’2ñž> endobj +1040 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [120.1376 318.9001 176.3563 328.1154] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1029 0 obj << -/D [1027 0 R /XYZ 85.0394 794.5015 null] +1039 0 obj << +/D [1037 0 R /XYZ 85.0394 794.5015 null] >> endobj -1026 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F55 1025 0 R /F21 702 0 R /F41 925 0 R >> +1036 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F41 935 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1034 0 obj << +1044 0 obj << /Length 1676 /Filter /FlateDecode >> @@ -3231,78 +3249,79 @@ x ¹#„@Ë1!ƒìTÛ•mÕLæªÔpßÔ8ÔBZ»Ï\Ðüp—ç6ºàS[êë¥eˆHh" •êƒi¸ 8”5!lK-ñX*+k°¨’ìö~ÀšVU”?$ì!E4 hÔtmuAë" M5À1óG„à°›äéća¦ïl^FƒhÓ C('骉²6Þd|u>ýÅÜÕv?,h×gá¹'ˆë”ZÔuJýº2;šè£{»LãL06ë(nç»ïœ| gu¼ÊnÌ]¹Ü±¶Õ"µú› ºì­‹òN;s'òYu©µùÿÔ¡¢HH!=%so£t9={qõf7FD…œy}ÏÉN倗ÛI Ñ•±å扆½3NoP;²ý,â`€ ñ dàg3»î¸’DPQî¡-€ù†õˆdŠ!róŸú_E0}L3`ՀЯ ˜{ÂÈã<;½xuÂ=•á=7‡!Ü÷óÁŽóÔ1e×HÓ?²æ0Æí¤ÿoŒAŸPRð¯`ŒRÄE@Ʀç³Ãëi|4ˆíy9 ±¾›ÿÄí¤ÿˆH8$„‘ fE±ýrï[%üSEBaðšÂ,Äà'Mì}µý€ºù® íIy€r€d`>b¦¤ui4¹÷y×}iµR=×ÿ„­gÚendstream endobj -1033 0 obj << +1043 0 obj << /Type /Page -/Contents 1034 0 R -/Resources 1032 0 R +/Contents 1044 0 R +/Resources 1042 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 999 0 R +/Parent 1009 0 R >> endobj -1035 0 obj << -/D [1033 0 R /XYZ 56.6929 794.5015 null] +1045 0 obj << +/D [1043 0 R /XYZ 56.6929 794.5015 null] >> endobj 126 0 obj << -/D [1033 0 R /XYZ 56.6929 424.8255 null] +/D [1043 0 R /XYZ 56.6929 424.8255 null] >> endobj -1036 0 obj << -/D [1033 0 R /XYZ 56.6929 397.5211 null] +1046 0 obj << +/D [1043 0 R /XYZ 56.6929 397.5211 null] >> endobj -1037 0 obj << -/D [1033 0 R /XYZ 56.6929 368.0037 null] +1047 0 obj << +/D [1043 0 R /XYZ 56.6929 368.0037 null] >> endobj -1038 0 obj << -/D [1033 0 R /XYZ 56.6929 356.0485 null] ->> endobj -1032 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F21 702 0 R >> -/ProcSet [ /PDF /Text ] +1048 0 obj << +/D [1043 0 R /XYZ 56.6929 356.0485 null] >> endobj 1042 0 obj << -/Length 2335 +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F21 710 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1052 0 obj << +/Length 2367 /Filter /FlateDecode >> stream -xÚ¥XKsÛF¾ëWð¶`•9™7€ä”õ#åœZK{ØJr „´#ÿúížžÁƒ„äT¥T%6æÑÓÓϯGl8ü‰MfW¹Þ¤¹f† ³)7|ós?݈°FÅŒV ->VfwFeÌd2ÝìæLþ}wóÝ;)6’3k¥ÙÜídzlš2#­ÜÜ•¿&¯Ýq¨NÛ4<ÑÛßï~¦mš¥Y*p‡#R&r؉~,?»¶¨JÚñæÃ-ï*7œOU?rš)‡xÖ0asã9h&¶;Á9O>tC½ -[Ô&g¹•6ìPœ¥:³~‡?E)›|øåîý»ÿ]÷ø›&Ž>UñèÚº?Ðçðè†0ß4Ý—>,r½¿,Ò}uú\ÂÄÐÑâ–$ -,ª:®mÜçêj[št{Ä£ª ^/†W‚åƾ¿vmõ/X(•IJ78k¹IÞ·4tÚŠ,©úc×ö 7üu£f'5 i™i‡ ï kujÁ¬ViX¶÷‡t‡È×ÿDÍ MWܦ:y…j"ÌüR7 QÅcU|Z -ÛWQzo¤ê!ܵWwá¾ @TÒNؤ×](‹ÎïB­…VÇßqª8ŸHií@øpmù*lÜÓ/X8Ž´õP»!ðq—' '×ö{ÒM™ƒW Š„wzO“CGÐWÝî»ÓÁ ^p÷Ýy yÅŒî,uú-3*8œK–½"–^ÕHx QV}qª“ÞKÊ5'‚H"žÞ>“jt¢nÆ¿nqùÍÛ»)e¥‚A(‘ &ŒÍ1%ÑäéaCÄÇY×ïæ(‡-ùŠ/Êr[“0–IH5b.DÓäü„’éË‚Ä\ªmÎ$å¡àlà:ÚçM±Éh Ck,—Ó:*uÅFpL¦µÊwMßíž5x“ÍUt“kã@ƃ£&¢ð/g\¿›o¸ÖÉ5ß…qðªÁ8é•HV‹…@W¦ k¾%Ä'ÁçØ,¹[u¨tPõßH¡©æ6,;R -º¢kèf>/ ûcUÔ¿q.¡Bú̦ ô¥ -Ù"³Õ!?}|÷š¨¯–]ªeô2ÒàV¸òŸ7¿þÎ7%èççÎTž™ÍøàX¡åæp£…dyntinnoþ3r„–)fHXçEû8ð -dܱdµ‹Òí”æp3µ°ÈxÙý&Çü’A̘’šböÃLÇÆj4gÿ²ÝY‘ÜÁ™¼½Ô ðÔDS¡ ÷Qºùs#×y®hÑŒöwtà¾{›7Üh3»Td¼›sö—,3Oš)ã©2È5†l„Ng¾–ä9VË­„‚´•‹Î|Ý -Èmø*\K+1 iè¾Z°Ë2 aI™ã´rB¼}UPIëUéiÜã’'Ú[Vû­‚bwn†°²¯Ú2 6{ÁȆ"ÆVód -Ž…6 0i“‹`¸CÕ÷. !øó|¥„ -?HZ_;µÔL-¸ªè·é\é/l„Hn1¶öOuû°"¯äY¹¼(cžOP"ha×µ 2|úaå¹b:S&0ðø†"X¥ŸŒZFpá΢¥)›Ho#ø…sžˆBý®ˆ+Ip+ò1Dތå\E”7*¹þ‘N¾ÕQzU‡ß™>/ëuWT à<”ÿYvÀü:ú9TÃcç}'{o$œ+KðYD% *W ûù¸®¬šjGiaAز Çøº1;.šè€Ú=}ÿD"€‡Š¤-‰'|ƒ'¬ô$úúÒåú@ KT·¿hõb|cYÜ—Õq‹FÜCS柱‚ÖWKfKt?¯¢«_ÔK)”]E壥À’s°” -ǪÖÝ7È?PQ~²-š3é ‡Ý<Á4ö(„A_¹;?ç@V±Ô¤0€×7ËDãš8íŽ]Sk°ÎZèÚÓ늆òJ‹ÊQQ^Ÿb!˜ÌØ\x°yÍ\bȨ˜Áû%¡ì§e‘ùÒeÐný5uX¥Gçy~¼}ÿÓ+šÿ[iå»0¤ˆ¼Làk™ws{h‘¼ÅrJHP·‚ö{tãµ`ƇŸ -ÐçÍÓôCÕV'wʼnü.·S:jùµ4¥ná%…Qð¹-ø7B0­g¥Ï ²[»¸Ù©þÞ?æIýÞõÑ/ã”cqÅ´¶¯Z|H¤g°‹Z]½úë>Y·¯tpVx|‰œZ¬êÐIK_"åø9–±?ºó©ekPó >À@p‚?úÇ03{ ”ÕÊŠ†)¢-•Z;¾2™Ñ0XNÀdª\~Óh~ØÐᵩ¤IªŒ6>ˆÙé…ÏîbÃ]°jË®Kf‰ÃYC[5îÜñ„J -%8 ܇ ’F¨É:@y¬Ú‹i<üä|±ô=êw¸O^«@"vÂk`?s!'ʧƒù“ÂM˜¨/b’’/ÂpzÞñXEÃáé&Oª¶ßlôòU:ÛÔÆšÊþh× -¾àæZÅZÖÍÀ -@ׂ!z6šMAb™^‹'ÙâkR>3,OΈÀZøŠlIO°›ó:Ù…Á;°Þ©.¡b_½µ8YÄ{Äl^Þ×­;=½ûÇîÜ”ã+í²¬Ue=ÄìqpíÙË=ÆùÚ£‰2L#¤Y{Kš:‰iÑÊ[‡â™nd… -ù³/‹+'þ¹ö|endstream +xÚ¥ËrãFîî¯Ðm©ªQ§Ÿl29eç‘š&µcïa+É&)›ŠTDj&ž¯_ ÑÝ$%Ú“ª”«,°o@l8ü‰MfW¹ÞØ\3Ã…Ù”‡¾y€½Ÿn„?£bF++»;£2f2i7»9’ßÝ|÷NŠä,M¥ÙÜí#­ÔZfd*7wÕ¯ÉëÇâ8Ö§íNžèíïw?Ó5Ílf^ã@Â2‘ÃM¼ðcõ¹èʺ¢o>Üð®.Æó©"¡™ÒHÄaH inÍÄv'8çɇ~löOþŠÚä,Oeêo(άÎRwÃQQ*M>ür÷þÝÿnüµIAŸ‡º|,ºf8ÐçøXŒ~¿mû/ƒ?T î±õés}òcO‡;âÈ£¨›p¶->×W×lÒïiI?Ô¸ +|>E–CòþÚwõ¿à T&©Š±`p–›ä}GK§­È’z8öÝPÓ +bÃß"Jv“)SÂf@q{é\‹S –jeý±½#Ò^÷$ƒ0=qkuò +2”„ß!9 ø¥i[‚ÊǺü´dv¨÷N 5£5J¯éý{A€(¤H-p ¦»ÑëB©„ZÇ߸UžO$´n¤… ?|]õÊ_ÜÓ/h8¬tÍØ£ÇS\ROE7ìI,ª2«ä ïz´n“COÐWÓíûÓ¡¸PÜ÷ç‘@4ä5x³Ôö[jT@œKé½"”NÔ8‰ PÕCyjŽÎJý‰5#O"PïžóItH¨Ÿáo:<~óön +YV0p2Á„Is I´yzØðqÃâùÝüÅ°…!_áE^nërb&eB „˜ –b˜œSx!˜¾ÌHˆ¥:Í™ä <äŒ LGoœ *¶"‰ÚÀ5ÔÆâ79­ƒPWtd2­µ~ÑýîYE5¥¹ +fr­ˆ p”D`þeåÄó»ù…k™\ã](Ÿê•c¯XÊ0[,ºR?ó-&.0! .ÆfÉݪùC¦ƒ„¨ÿFµš§þØ‘BèØ—}K/sq T8ë²ùs ÒE6©Ï +Hd‹ÈÖøøôñÝk ¿¦ìR,ÑÊ€IƒWáÉÞüú;ßT ŸŸo8Syf6_àƒc†–›Ã’å¹Ña¥½¹½ùOÄ!,S,õEÂ:.ºÇ—Ã%ª]àn§4‡—©…Fâc÷›ãK> kJjòÙ3›T»JCpfà€—ñ/Û]*’;ø/“·—’œZk*ÅÒ„;/Ýü¹Œëjü '»œ¸zMÍd‹§š‘~Û¾¨œd +!’[tÐýSÓ=¬IŠCÝËåE.tx¼&@»¾káÓ+¯ÈÓ™2+’( ( 5¸å" ”Åy¨×øÀ2#·ßR˜f™ÍBõçÌÂytíA¨ä&­Šï%d,ç*PˆZ@äÑ2’èÓ}5þw¦„ËJ!¹(àoDþY\ÂhrÈÜ;÷GÍe¨ ‘8´X³N'œ“ð*)­ow¤owÞ<&›’þÖžßî}â¥4—ì2üôs¨ÇÇëË“½SîU::+±T¤Û¢Dãwûá\U·õWé`IUmåɸŒ5#Ô°ï|ÿD,€Y‹¤«'|ƒ%¬tC¾èvI³hé«g‚úýE“‚&tÁ]BWŠ1Vüá0´ƒŽü „Ρ^"[öóüí»„‹L-…JWû¨)°†äì5¥|m€kuWÜ·ˆ?PPn³+Û3É —‹µò*¦±; +åt´»ós”*f ¥ +hq­æg™ˆ‘ƒ0íŽ}Û”keš2#m((ËÖ-Ç- +GùZöšJ +Îdb[ãÊÜkä]F…°?ŒÈ …L QЙ/Mæè_sõLA§¡‚Ïcì?ÕO»Ðô±Ù•§º‚Ûhi×|®pxî!t.å–C"M³9îª?M·&5ˆgBd ©¹ú@MÁï3b“LCýºh´†µ† +!ä\rê‚5ÙÚDÆÞQ}B’ +±ÌÐ.‰`—\?ô³æûîàhT¼pªËÇà6ÅHeÃ¥>x]³jßûy«ëoÚ£aÆNèª –¥FÿM‡Œ bÎf^>6eiéã.û –QT±Øƒ—ç0pù0äB›üÆ ÿ:¥Æóà/»YÀíÛ×°/hkßûA~P´SŠsûý»ˆäãÇÛ÷?½¢ýp•P¼óKŠÀ˾y÷¸·‡æÌi,§€yËK Å"> vŠóØã`£y>Ñ>m?Ô]}*®0‘Ýåé” @|-AÅÒtž†o†aln öu›Ö³ÔçÙ­½ ÌìÔ|õ“—yP¿/†`—aËMwŠr:;4Ž0iw‘K‚©×Á&oÖñY{c%†ã tj‚0«C/e˜Ê8iìþ|êBÄÔ>S`ó!8•?º1œ™Í ¥Áq^UÓ2ytJ©6ó-‹ÕT˜L™Ë]Šê‡ Ãèç\mRfLÃ(.f›pxö–Ô¿³¶´ð\RKXöÈüÚتrç†'TR+Þè`áÞo7Díüå±î.¶‘øÉ(ø @ÅRÒw”Þ(>9©ˆµ>Cæ™×,buN s“<ÁÖo4>IÁË÷íë(´¼ã±e,û¡Q–8ÖݧEz9O„žÚ¦!§²?ºµ„‡³ã<6…ÎL"Ìô,X¢Õl Ë4§žx s¬|¦Xžœ±l¡Öº¨¯H—4ü…²9·ü¢7êA{§¦‚Œ}Yî­ùÉÂßCÍæËËû¦+NO/”ŠÃcn«8^¦µºjÆ=Ewv|G?_×(Ã4–4kS¬©“˜­L±8$ˆt +DäÏÎ4W(þpu˜endstream endobj -1041 0 obj << +1051 0 obj << /Type /Page -/Contents 1042 0 R -/Resources 1040 0 R +/Contents 1052 0 R +/Resources 1050 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R -/Annots [ 1046 0 R 1047 0 R ] +/Parent 1066 0 R +/Annots [ 1056 0 R 1057 0 R ] >> endobj -1039 0 obj << +1049 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/usr/local/share/db2latex/xsl/figures/note.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 1057 0 R +/PTEX.InfoDict 1067 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 27.00000000 27.00000000] /Resources << /ProcSet [ /PDF ] /ExtGState << -/R4 1058 0 R +/R4 1068 0 R >>>> -/Length 1059 0 R +/Length 1069 0 R /Filter /FlateDecode >> stream @@ -3315,12 +3334,12 @@ q n*Œ1½÷¨¾x¥Æˆpîâ‹&XîÃœ§³±è\íD¤ßä0}#XŒûž˜‹¸À>#^V°¡|2Îi‰9ÊÎr)`˜¢Xh¡Ò& „hb—H°Œe"Ãêʱ„£~Ï“a³tŒºìZDß!#Z¶ÚÂk! e'jÝ=§ _tsÙ¬ûÍ&­Nå@‚i¬ˆ3t%kÐE„\H–YZxÿ/U¥Ç™åë—Φ@±¯iW H þrÓGçX5¾ûû8‡´ÕªOª«t–Ô³$Ây°‰—BÒ›ÀÄ5©/¨vp÷o`kA“ôr ±ñœÓ4N.4Žæ&F°ÑTÆG%V½ Î'ÌØR5¬BÔ‹`qUžv-UÍ=ëÆåQv2ë_ ”¿­qq‚~èr¯Ú5ÌJ¼ð˜°h»P¡õ‹kÜàéÚýªå>Ò¸D °o»Îi¸CrT]¿MJ¥ ÆÖ¹’°;¿ö‹ûóZ¼¬ å[Ç-œÁ¤ŸBx¿ýpü|üÈÂendstream endobj -1057 0 obj +1067 0 obj << /Producer (AFPL Ghostscript 6.50) >> endobj -1058 0 obj +1068 0 obj << /Type /ExtGState /Name /R4 @@ -3330,56 +3349,56 @@ endobj /SA true >> endobj -1059 0 obj +1069 0 obj 1049 endobj -1046 0 obj << +1056 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [470.3398 477.3512 539.579 489.4108] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj -1047 0 obj << +1057 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [316.7164 465.396 385.3363 477.4557] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj -1043 0 obj << -/D [1041 0 R /XYZ 85.0394 794.5015 null] +1053 0 obj << +/D [1051 0 R /XYZ 85.0394 794.5015 null] >> endobj 130 0 obj << -/D [1041 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1044 0 obj << -/D [1041 0 R /XYZ 85.0394 580.0302 null] ->> endobj -134 0 obj << -/D [1041 0 R /XYZ 85.0394 580.0302 null] ->> endobj -1045 0 obj << -/D [1041 0 R /XYZ 85.0394 539.9341 null] ->> endobj -138 0 obj << -/D [1041 0 R /XYZ 85.0394 315.9171 null] +/D [1051 0 R /XYZ 85.0394 769.5949 null] >> endobj 1054 0 obj << -/D [1041 0 R /XYZ 85.0394 282.0038 null] +/D [1051 0 R /XYZ 85.0394 580.0302 null] >> endobj -142 0 obj << -/D [1041 0 R /XYZ 85.0394 146.7217 null] +134 0 obj << +/D [1051 0 R /XYZ 85.0394 580.0302 null] >> endobj 1055 0 obj << -/D [1041 0 R /XYZ 85.0394 117.3479 null] +/D [1051 0 R /XYZ 85.0394 539.9341 null] >> endobj -1040 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> -/ProcSet [ /PDF /Text ] +138 0 obj << +/D [1051 0 R /XYZ 85.0394 315.9171 null] >> endobj 1064 0 obj << +/D [1051 0 R /XYZ 85.0394 282.0038 null] +>> endobj +142 0 obj << +/D [1051 0 R /XYZ 85.0394 146.7217 null] +>> endobj +1065 0 obj << +/D [1051 0 R /XYZ 85.0394 117.3479 null] +>> endobj +1050 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1074 0 obj << /Length 3348 /Filter /FlateDecode >> @@ -3401,54 +3420,54 @@ A ©mø¯(¡Ÿ¡AAÉM@rgJ'Ï¢«PÅ*s5M¦ õ@¬ðù T$±/ãx¬ÖÊ`¡ð+|*س«ñsröçÇI_I!Oç…DòV»·¹à ;“_q‘©¨´ž9k¢Vó2‹T…Kd'çiÏ(L5Ú&uU¿¥ÖÜdpÄ©)AìÇy‰M‘#¾ÿÈ5H% b“ Ü6è;q* ó§ñº«¾¸Ë8‹W‰=öÃO¿PÚ¾þ-ÿ.ˆî˜ÕšÃ0«QΩ\þzÄwþ맋@Ç‚ÎWlb?@~Hš²ôO"BúøŸ •¶`´—ÿûHNÿf+_¤i´\²‹TêÇ)ÂD!ߢà‚r÷Ÿ&—¤ÿbÈendstream endobj -1063 0 obj << +1073 0 obj << /Type /Page -/Contents 1064 0 R -/Resources 1062 0 R +/Contents 1074 0 R +/Resources 1072 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R -/Annots [ 1067 0 R 1068 0 R ] +/Parent 1066 0 R +/Annots [ 1077 0 R 1078 0 R ] >> endobj -1067 0 obj << +1077 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [464.1993 488.466 511.2325 500.5257] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1068 0 obj << +1078 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [55.6967 477.5271 105.4 488.5705] /Subtype /Link /A << /S /GoTo /D (proposed_standards) >> >> endobj -1065 0 obj << -/D [1063 0 R /XYZ 56.6929 794.5015 null] +1075 0 obj << +/D [1073 0 R /XYZ 56.6929 794.5015 null] >> endobj 146 0 obj << -/D [1063 0 R /XYZ 56.6929 556.0057 null] +/D [1073 0 R /XYZ 56.6929 556.0057 null] >> endobj -1066 0 obj << -/D [1063 0 R /XYZ 56.6929 521.4772 null] +1076 0 obj << +/D [1073 0 R /XYZ 56.6929 521.4772 null] >> endobj 150 0 obj << -/D [1063 0 R /XYZ 56.6929 361.9951 null] +/D [1073 0 R /XYZ 56.6929 361.9951 null] >> endobj -1069 0 obj << -/D [1063 0 R /XYZ 56.6929 325.2573 null] +1079 0 obj << +/D [1073 0 R /XYZ 56.6929 325.2573 null] >> endobj 154 0 obj << -/D [1063 0 R /XYZ 56.6929 133.2872 null] +/D [1073 0 R /XYZ 56.6929 133.2872 null] >> endobj -1070 0 obj << -/D [1063 0 R /XYZ 56.6929 104.8892 null] +1080 0 obj << +/D [1073 0 R /XYZ 56.6929 104.8892 null] >> endobj -1062 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F55 1025 0 R /F41 925 0 R /F48 940 0 R /F39 885 0 R >> +1072 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1074 0 obj << +1084 0 obj << /Length 3001 /Filter /FlateDecode >> @@ -3468,29 +3487,29 @@ I! “7 `©gŒN¡wbAÎÇü&ePÁ†¬¶ÿL„N|&‚šÒŒ†¸;ô3½ú ¥G=û/mýù©ÏlJ~59ÿÑ0†r_Å (ˆÊZá¢jA¤ãC1×Ξ?µƒ:>v”¹ÃX'Ãc¿…Ì‘.Mi# 'øËQ|¢$Q†™„«Ëe¾J­yBÙ¥ŸY“¼Ñ Ì?%Až2®­½ ÁêŒÔe ž;5’àøØi ÆÇþ/%x¡'(ÒÄ>£‚~J›PfÃ6ãIAJkYzIŽÐi1 ‹R¨ËŒ:wjÄ©ñ±Ó¬Š½éJ£Â1|öë?ãåg†Ç™Æ&÷Q>´ì2ž$£²®ÏOòÿTÆö¤ "•†*Î\ø%J uFF게ÎÉh|ì´Œâcÿÿ‚ ä•Pn»ÎK0‚:#ÁuY‚çN$8>vZ‚ñ±—­ $ZWÅ“¤h$ƒÜ.}’“gÇ“ÿRŠkáÄŒgÙtÒ ©Ù—jêä¤:êäÀ¤+3°–ñß[qú4´SlýµÎ`xðKÿpÂp´.šÕ¾\Ò3à¨eý€¿‚Rdþ¦n‹€*oÃ(žþÇ81E“¥eG£|$þbT† ¾ÇNo2æP`Žê,Z|¬ï÷ýOƒ¢Š£m¿¦(Æ*­AV+;øyXRð¤Íýû ~Œ”»ƒ_Ä/+÷1^dÄ[¬†Â­GÔ$œ ‰9²¯t‰‚1®è±²ØŒMÆõužFµûñ'š‚Zâï)HèùjK; šþË·S€MüÏ?“ú ¿˜á¢e"^ü÷A§B3p€>Õ!zßRX”»fñ¾^lŠ}q¦¢{‡àŽ¸Ÿ9è_1v:¿7 ½8!2øóÖð»$Ùût E«µrZøŠ'ÌÊ, D!éòHݺ_S“þCHá endstream endobj -1073 0 obj << +1083 0 obj << /Type /Page -/Contents 1074 0 R -/Resources 1072 0 R +/Contents 1084 0 R +/Resources 1082 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R -/Annots [ 1076 0 R ] +/Parent 1066 0 R +/Annots [ 1086 0 R ] >> endobj -1076 0 obj << +1086 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [417.8476 181.7231 466.5943 193.7827] /Subtype /Link /A << /S /GoTo /D (sample_configuration) >> >> endobj -1075 0 obj << -/D [1073 0 R /XYZ 85.0394 794.5015 null] +1085 0 obj << +/D [1083 0 R /XYZ 85.0394 794.5015 null] >> endobj -1072 0 obj << -/Font << /F37 791 0 R /F39 885 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R >> +1082 0 obj << +/Font << /F37 799 0 R /F39 895 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1079 0 obj << +1089 0 obj << /Length 853 /Filter /FlateDecode >> @@ -3498,21 +3517,21 @@ stream xÚÕWMsÚ0½ûWxr‚ƒ…¾üÕœhBÚf:™4¸½$9¸F$Ì›X& íô¿W²°‘ƒ€PÒÎt˜Y^½]½}+VȆâƒl×^ˆCÛ)p!rídjAûN¼û`¡¥S9ºÕûÈêßAèaÏŽÆV` ;]w(  +`gxùùSÔu° ;§îƒê“ýËhp¥ækÓþé·.B¨Ó¿8œjKäàlÐïú´}½ »·Ñ¹5ˆšHõÝ Hd˜Öõ-´GbSç$ \ûI<@€ÂÛS‹º¸”z&µ†Ö—P{[-5²ƒ ÀÄÃz(Òè ð €òÝx“Š€Ü„@r¡ëâjzœOq1ê:„)ì¹ÊHòéÑJjoÈÔTH¦ÎP…%}Ôn[þËŬµÆ,óI |4í­tlÚ¶¡4…zFGy-ÃbZׄpQÄåäQŽ}*j8ÛAiÊÓyÙdV*r…Y¶ê°‘§cÆ<@¦Eo¬9ƒîª°Œ9z•Fð¾áiüÈö“Hµd—Bxo=#=Jpmy äñM6P‹w¨kãð_f³Ié›—rãaÏ:>€é½ÿ£ÖŒÄ"#±Ô\.¯!R›xŨÿoä䟥¤w&z®U;&\ÑÕQÑÂJ›AÓÉ&SžâËÆGMÜ缬Žïv3ªº'5NòìB|÷N9kõ~/œÅIjda-°‡érƒ¢³“@ú¤Yl |s¤´àN ùLšó'ÀŽäÏ[Bì½eK¸]—q¶Ð]»PïØ8ž§Ûš?Óe„¸@Þ WØðxðEeuG£> A€›;HKôØ È2(ÉÆk‘×7šõЫendstream endobj -1078 0 obj << +1088 0 obj << /Type /Page -/Contents 1079 0 R -/Resources 1077 0 R +/Contents 1089 0 R +/Resources 1087 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R +/Parent 1066 0 R >> endobj -1080 0 obj << -/D [1078 0 R /XYZ 56.6929 794.5015 null] +1090 0 obj << +/D [1088 0 R /XYZ 56.6929 794.5015 null] >> endobj -1077 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> +1087 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1083 0 obj << +1093 0 obj << /Length 1946 /Filter /FlateDecode >> @@ -3527,159 +3546,153 @@ eS ^Ebêf›C“Áš‡Gô¯ÝàÀ7Õ?ú¦ú¦rSª+a~žÄä'¥|«ŽcexÆ ¥j3Œ–nˆîʾí88Í“¡¡=# ½}[}y´b&fqšŒ Æ¢ècç(»î»º„&œ:þ$þý€!BìøYãf2JE8<æ8‹án‰g8iZ¤Š°8pä”!í·§Î £g²z÷óõkç盀Nd3$ÒÒ:Œ‘ÌSoëÛÉÂhõ×ƽنÊC6ˆa Äj70ê*xc§mš_âç^Ýæ M>1:C‰õ¾î¹³S©:nJý5/ûò̃6ðEµ·n憥 R±Ày‡ßˆ*Q$ÔLC-ÈKúüE¦»a´NE\–Ã,Ô ç2,’ðq=c³>å—š–‹c9Èq@ãèôãiP§™¬j¡â8ðâ…>®Më¡Ô©SfC·üé¥b0ú»¿ÝoøÁ(÷žû%Î þ|6ó»™{®×ÿ÷¯t—Ÿ%ýút¬Î?ÀMòËsCjÎ,ÚCyO%?ÿœ÷­èÿ¢ „êendstream endobj -1082 0 obj << -/Type /Page -/Contents 1083 0 R -/Resources 1081 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R ->> endobj -1084 0 obj << -/D [1082 0 R /XYZ 85.0394 794.5015 null] ->> endobj -158 0 obj << -/D [1082 0 R /XYZ 85.0394 427.2881 null] ->> endobj -1085 0 obj << -/D [1082 0 R /XYZ 85.0394 390.6298 null] ->> endobj -162 0 obj << -/D [1082 0 R /XYZ 85.0394 229.0656 null] ->> endobj -1086 0 obj << -/D [1082 0 R /XYZ 85.0394 200.0179 null] ->> endobj -166 0 obj << -/D [1082 0 R /XYZ 85.0394 151.3455 null] ->> endobj -1087 0 obj << -/D [1082 0 R /XYZ 85.0394 127.291 null] ->> endobj -1081 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R /F48 940 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1090 0 obj << -/Length 2296 -/Filter /FlateDecode ->> -stream -xÚ¥YK“Û6¾Ï¯PåbªlÁx|Ä•Ãx¿Kÿõ¼iÙç/4㟗×?üàQ›טYùûf>cWÉ O„µØ7ìÉBABH‹¦~l/gßó#fÇ¡ÅRIbÈÛÑD„p4v‡#|¸'ÉLåÝCuûb<.äÑ0ýì”{·öüà3•º‰ÁEø –‚;`»lF¯O\_(ãÉI™¡‰ì=K€7EÝé“Ý>0ŒHiNÆÎáëºøSƒ¤0`#Hf!§Uæ®,Ŭj%Õ6 æ`s31³Kµm¶¶3ŠuVŠuž EWRª›ý _œë¥!ÖKª[«¶Mþ„zƒ¬3¨¨0ê¯éêkLHÂD„¡ýb¯öey8n£œŸ/õ‘—Áùíu{ºŠQSµçD×û´Ú?µL -C9¹‡h?ƒÆÃxÿ¥Í£òE¶‡ M”˜-¶²£ÓÁ­G Îóî!Ïkìt 6^˜Ùú EoCð kŸÄE•jWû¶Ãõçf´kJ³ÃÃÆ.F¤®±¢à×–UPLÍ6^<›Í»Åéã`²Hü¯8l+„¯ÒaDÄ,½Té0"ãÄr™¯8-Ħb&ˆ%Ûã8Žï×XübeMǨºYá­0DÈH$e:„fëUØé_©0˜MžÖ2©O^ýí/ø“‹†÷Çkkœš-y Qš47C[cÕObUÚë/2—Zh¡7`ºòý®5ãÚpð5Á*ÒÈËÀy -mÀ·lr3£n:ä‚€ë2ý Ô¬6Ûký€ ®Í0˜;gñ²{‚gQS£åäPzïÄS_t¥$‰¸\À‹Û‚ìºÔJ#È(8‰bÅ橆3좰_öyk,¥³y0£—ÚJáÑMƒ=Š²ÄÖÜ ;hÓ£ú[R»ÍG ž 'T~†â‰Ü=_>íªcÄÔÏ• @g"ý2¬pG¤¦Vó}N£øà…NÁn ”ƒûø4ÕïýzÆ\µÝ“„êtPCaÚa1áx_–ýtCBQû.x1ÔªQxñœ ÏÜí»VÎ[ïÍk &ºC[·%ÕÚ{6f°±ü¶“ÛîÛ‹Gõ°…D?@DR¦ìò12·ö¥¶÷º6^á‚H)£a\3ǞĦ$ߤ69÷£ Ü3Ô/-žŸX¨„ÿûã/XaLD’pÿo5꧊P½Š¡”àø2>ÜþòóXôÿL?øñendstream -endobj -1089 0 obj << -/Type /Page -/Contents 1090 0 R -/Resources 1088 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1056 0 R ->> endobj -1091 0 obj << -/D [1089 0 R /XYZ 56.6929 794.5015 null] ->> endobj -170 0 obj << -/D [1089 0 R /XYZ 56.6929 691.7741 null] ->> endobj 1092 0 obj << -/D [1089 0 R /XYZ 56.6929 668.7722 null] ->> endobj -174 0 obj << -/D [1089 0 R /XYZ 56.6929 579.8329 null] ->> endobj -1093 0 obj << -/D [1089 0 R /XYZ 56.6929 549.1878 null] ->> endobj -178 0 obj << -/D [1089 0 R /XYZ 56.6929 502.9124 null] +/Type /Page +/Contents 1093 0 R +/Resources 1091 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1066 0 R >> endobj 1094 0 obj << -/D [1089 0 R /XYZ 56.6929 474.9173 null] +/D [1092 0 R /XYZ 85.0394 794.5015 null] >> endobj -182 0 obj << -/D [1089 0 R /XYZ 56.6929 277.7919 null] +158 0 obj << +/D [1092 0 R /XYZ 85.0394 427.2881 null] >> endobj 1095 0 obj << -/D [1089 0 R /XYZ 56.6929 249.7968 null] +/D [1092 0 R /XYZ 85.0394 390.6298 null] >> endobj -1088 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F39 885 0 R >> +162 0 obj << +/D [1092 0 R /XYZ 85.0394 229.0656 null] +>> endobj +1096 0 obj << +/D [1092 0 R /XYZ 85.0394 200.0179 null] +>> endobj +166 0 obj << +/D [1092 0 R /XYZ 85.0394 151.3455 null] +>> endobj +1097 0 obj << +/D [1092 0 R /XYZ 85.0394 127.291 null] +>> endobj +1091 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1098 0 obj << -/Length 3185 +1100 0 obj << +/Length 2314 /Filter /FlateDecode >> stream -xÚ¥Ùrã6òÝ_¡·•«" ;O'™“¬GÙ­T&´[ÌH¤"Röx·öß·/ð2=NÕ–«L 4¾!½P𧩠”É¢E’EUÚ.6û3µ¸ƒ±oδÌYùI«á¬×볯ߚd‘YÆ‹õíW¨4Õ‹uñÛòòÛ‹Ÿ×W×ç«Ðªeœ¯l¬–oþy®µ^^¼¿¼zÃCoÞàÆÛ«‹ó$Z®¹¾BˆÊ`^IJrýýկ翯¿;»Zwô Ï •Aâþ<ûíwµ(à(ß©Àd©]<@G:ËÂÅþ,²&°‘1²;ûpöá`”–ÎñÄš4°i˜Ì0%Ô ­ƒÌÚpÄ›± qVö|¥•‚#}x÷ ý{÷È×yã -n^l6®i¸}YWí±Þáùa3`½Z¬Â(È"ú×ïÞ#[S½Ìw»ú—§áòÝÏ+Šã¹N—€×5ª -nóêÎÉü¶fØãosp›ò£R!ÑÊŠ..àFáp¸*Û²® bfzõ€^é@Ù$‘^¢rÅóàý¼0 ’Dg2ívS$i$ãžÜñqK˜$ô›ý1ƒn#‘áXÐܺã ¸òPgÑð¬"«€b›-VÀÔÓ¡È[7‡$6‰áÝÌÅ&A¬;ÒŠ’ïmÓ–÷®0Ö,×ÛYÛå6§Fæ*n¹Ï­« -º/˜@ -Pb7ƒDøøÉ=6~¸© 9háÖ ì¦¾w¼äI)ÀêÓ®ð;òX᪺uÅ,gtd:ñŒaëðÉKü¶nZ½Âÿa0/ß: 2—ˆË.*^å>çûÃÎq§¾åo.ƒ,TÂz‚ŒøÇ hÞ¸¿óΑžhV¤i’ $Õ#A}ÿÃ: 6F'!È«ÿ¾zFeˆå=ÝÒ.«|_n¸Ã»ÊÝ%|›o,êj'ü,…íVÊ' iZ9y.˜šò®òndyΟîz€ -?åcFs¡FwÊñÂ}Z4™ <QÒ,’T1Žâñ}ÿzž…ËúÄìóG‚ª3ƒ™ ¥ ³§v†}Ís¸w¨Üñö´›9Oˆb¡Y¿:Ô»ró8sž ˆñzÚ´0yï$M. ÀtÓðݗͦ®0"¹;sT$ܨžpë ·Âaá©T72ê>@óË–Ì+ô{¼´w!Èj«*Š—¹Ç¡éí%c`ÐÄw‘—x‚þšƒ-™Ë„ТüéÄÕøaiÁ¡´à€?3¶…å#‹ÁêÄÒ -!Ûè+h^ÅßSõ©ª*^…ž#|ฉRf3Âå® -J–Bè<"Ùf†ce»…YF JhÈñŒD;ïÄš»›ºp<­q­ ¨ùûúâ ¦HoÀâ |s^á·Ð#B·ã ´'4ŠWë¡Ó N"òöÔí¡b8(*ªQɲ¨ 3ÀH¡tŸïJtMÈçPüÂ'|†%Âg»HÇg‚ -a´¡ ‘chÀY•Œ8 ƒÂY•ggÔ™øYä3` ¸C,ŽbbRäQl YõŠ‰í ‹ûÕ=‹¡#'‰,Âʽ A@Д…ïÜò—Ï‹Ó1ò¢CÂ"Ê„­qöÔL…3Õ1Y+Ïd­˜Éº®x”Óþžt'Y*²àCCWX¬½ðj6ø¦®ßýxõ÷ȲŽvÃC dåD|ó„ΉyàkñANÀAÕ’@("„ífOx€vžÐð¸(Dmˆ³È|¸PI$)Ï)Kòê‘dÃiG×ã…t-x¢úíåâÿÖ ¨!f͈!ú½ ¹–Y+Žc5»Ihùþ§5ÚÛ‹_ÖßJ Øد¡>EU[n@ Ä6u"ÉâPÂÁKæ#ßø¢Æ$Åè& â$ãšÁ`–™$·6ò)2»Æˆöl¶yU6{†ÞÖG†½5ø —ïÆî\åÐKR¼„SÄ¡oó3À˜„>>h8Ý„Áö¡f(þ” *QÙ0DÄ+¦‹£(ö÷' $æ{¸¢†ò˜“¡lÌdðQ ”öéÇ3¼2*Ъ+ˆ4Fò¯·ÜÙbnl”2€p â.|…WÄ$èÈ ò†´ý\SÌ\K!æd‚óUL ^""©Üðx‹UŠÕ,•;¼>À<â -©}èM¶Z¾ÄØKʵúÖív{ÒFœâ>£LÜ9ObF‰Þx²úK¸OËNˆ;µ¬Êïeïœó$๔/G{¢¥¤]ù®ÝÖ§;¤Î  .± wæ–ÐåÀ—•ÒÌÑÃD·áh¿1 ƒÃ2Šñ Å?øù7\ k49»õÖÍe¿~EY—>¯ªVi_‡$)¼“„@©â:%°ÖŽÂ'.Úš>¢„øÜ»á6ãľ‹RËÙª;£‘<*Ì&‘õ3šBÊž@²÷âÙ#•Ø‘™’ô$›™tbd2¯©Ðbç‚O?.GßÌ31(‰EŠç9&EòÉØZSlòô|X–(Ž^<^¬Sÿ›¾ÕÔ¾º$Eœ®²ë=KávÎW¨FŒ 7äáË>Ì ôTòÝúr‡ò}YŸ_ê •”Wth‚8½å ó2ª ´6~Ñ¢&ÊFs"m,LúbM˜ &v)uˆ9@†îfW’öa›l)|»°ÏO'XU¬í5dJ~ê¢Ô_¢ßŒ -È„uÒÄÝIv'¬‰6 lOˆô'™ ú´4ô¸/½‹î"ƒ‘¾b¿Ó×W˜™~¦ûœo$Ú~Â~Én|ÀE¤v^)S¬Û¿æX? ãòõÉò_['ÑÀI -cýaÒ±ãIׯª‰ÏñNý)yQhTŒ—ÈKmjäÁ-Fà[Ÿ‰ÿ8aÛG&öRPÎ~©GáôáQàYpb)h ÈHî¬&{@’*âCbÚp̆¡¨}1Þ—$ð}î3eÍAà/A¤¶D‚´Óƹ´9õ±•bâ›÷>\]òÈh¥×­Ü׃qñ°à (èeÇF~0Pʢ뷗 ­± b½Œ…™ÑÁ\v9¦ÇdÝaíÃéfWn¾#pÏÖ`rí™”jà;L´âÝ9ˆx/Å!4j¬k;”~/wDí§ûÎø“6Ù -Î&ßÏ&ü Ù"tíM6t¯%Í+ï‹Ëûrçº(£ |p÷ÐvÏ6G Te÷Ó?ûÒ}÷ˆ1z–™­Š¢®@‚¥ŸH‚±}¤£}íÑHuÕDÃb U|1ÄnyŠTva’ä/FJ¥és{AwË_¦ÞDBý`#)µ•P÷–.}±?öXæÊfä_MøÔÕt­¯ÌÓº¤½mÝþ0Éówõ¦{/j¾öwã m3WÁuÙ[˜0]ÞÚØð,÷_—®F%àõåϲ¦•g­}3®QtࣼÉcéÚÓÚ¿¶u½ógy8xAëca19Ðʦq§)…ˆù3NŠÚ=á3©“I‚0Õ>N«šácùøQ) ”íòŒà¹Ÿào7fž¯T÷îôÿD¤ÿML”&MŸyƒŒ1HÃ,ñD!á¡RÞý–ä)éÿ±I9´endstream +xÚ¥ÛrÛ6öÝ_¡éK¨‰…àB`3}p'uw“ÍÖê¾4} $JbÊ‹"RvÝNÿ}pˆ´¡ØÙgB\Îý± …?6‘ I2žMÒ,&’29YÖgt²½wgÌÂÌÐlõj~öâ­H'ÉžLæë.E¨Rl2_ýÁ2 4š__½›Î8ã^ÿxñq~ù3L%¸xóŸ)c,ºøðúò n½ùpƒ·—Ó4Žæ¿ü|y=ýmþÓÙåÜÓ7äQ¡‰ûröëot²V~:£DdJNnaB Ë2>©Ïb)ˆŒ…p+ÕÙõÙ¿=ÂÁ®9” £„‹„„ÂEH(2#‰€--”ù¶¶@¿w8(;ýeQÙà¼wŸ(åU¡Y~ñ6fÄ™ œÅšñÛ¶ëÙLÿÏÉs&ÓçTÿ#»}y“÷öüˆ0¦$T: ƒX°èCÛoËfƒw¯Êý”©¨Xö•%óÐ#БŒžOg‚Òhqè À¥“O‘ dÀ/$ÓÖ@•AºÌ, +KÍý>_öŽžµ‘A[ã õ"½^Ì8o,,ˆÇŽòÎ~-SÛEé˜,–8ï¿04ciJ˜àqL‘˜‚ùxÆf HùŸù‹Kùúó»ì_ÏÛŽ}þBsþyuñöéÇÜÑ?ó ¹JN¸Nbßp'‹‰Á5õCyyùž–±7Ž%–I’‚ßNf"‡£©>ŒðéŒ/DïóæWˆî]Ñû¼/Û&,3.µ·D&Ò1I"„ûÆ!ôzYïŒÃÀZŽŸ=˜ˆ1!sìË,Þ"m׸º(û|ˆÇCw€uÎ: Ñn&£÷àç¸~qýúêÊ"6*íìÅHNnòª\w¤§ÜP¨ñùOTÒ¼ë5Z l÷NUÑlú-.–Ý€OÕ‡ª/wÕˆ7Yüè&z½Añ(K˜Y\‚tµÛí; =d@ +PĬ„ºvD’ª&ÀåHQ!;¬e¢`¶AÛ(VÄ#xÐEÕµšŒ”¦“4ú½ioz¯‚1Þs |÷SìZ¿Å°rØlæÌ'"É”õ ºF“˜*øhœzm÷ˆÝ†XV¹]Ûá…›}^[Zü:v-±Þ"`â,9x–‚1–í*ïó£GúãDrŸ²^¤]Ñ9âëvwçƒ÷økСóökИӖ¡¾¯ZctR;ò’d¢Ç]×اJÐN•]ÜµÆ a o†ÅnÙî +\3& _(<n^àØÐÁ[¤>> endobj 1101 0 obj << +/D [1099 0 R /XYZ 56.6929 794.5015 null] +>> endobj +170 0 obj << +/D [1099 0 R /XYZ 56.6929 691.7741 null] +>> endobj +1102 0 obj << +/D [1099 0 R /XYZ 56.6929 668.7722 null] +>> endobj +174 0 obj << +/D [1099 0 R /XYZ 56.6929 579.8329 null] +>> endobj +1103 0 obj << +/D [1099 0 R /XYZ 56.6929 549.1878 null] +>> endobj +178 0 obj << +/D [1099 0 R /XYZ 56.6929 502.9124 null] +>> endobj +1104 0 obj << +/D [1099 0 R /XYZ 56.6929 474.9173 null] +>> endobj +182 0 obj << +/D [1099 0 R /XYZ 56.6929 277.7919 null] +>> endobj +1105 0 obj << +/D [1099 0 R /XYZ 56.6929 249.7968 null] +>> endobj +1098 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1108 0 obj << +/Length 3203 +/Filter /FlateDecode +>> +stream +xÚ¥Ùrã6òÝ_¡·•«" ;OžO29&Y²[©$´[ÌH¤BRöx·öß·/ð©8U[®2€Ðh4ú¦ôBÁŸ^¤6P&‹IVi»Øì/Ôâ澺вfå­Æ«^¯/¾|g’Edq/Öw#\i ÒT/ÖÅ/Ë7__ý¸¾¾¹\…V-£àrecµ¼zûÏK­õòêÛë·<õöÃGî¼»¾ºL¢åú§›k„¨ ÖEA,;×ß^ÿ|ùÛú›‹ëuOßøZ$î‹_~S‹®òÍ… +L–ÚÅ# T ³,\ì/"kã!»‹ÿèŽfiëO¬I›†É SB½Ð:Ȭ '\±Y›ÐW`G`/WZ)¸ÒÇ÷_ñÕ¿uOÜy·®àîÕfãÚ–ûoêªkêÞN1#Ö«Å*Œ‚,Ò¡ýþ²5ÕË|·«q{.ßÿ(°¢h.uº¼®PUp§É«{'뻚a·ŽÛöà6å¯J…D,(+ž¸zów +‡ÓUÙ•u%H3Ó«GôšHÊ&)Žô•+^WÖ…i$:“ew3˜’ I#™ÿã蚧9,Y`’Ðöû xD¦;`A{çš<ðä¡Î¢?Á³Š¬Šm¶Xõ"K‡"ïÜFØ$„÷3›±îI+J~·MW>¸4ÂX³\oKdul—Ûœ:<˜«¸ç>w®*è½`=(@‰Ý áà'÷Ôúé¶&ä …['°ÛúÁñ–O$¥{¬»ÂŸÈs…«êγœÑA’éÄ3†­Ã'/ñÛºíô +ÿ‡Á¼|ë$È <"n»ªx—ûœï;ǃúŽÛ¼š9>EUN’‰¼_erZ©Šô×ùsèÞº¿3†hr[™ T:½Ì‚4M²çç®bPþÿpC|À΄yõßWg~„X„oïúÅS•ïË øT™!I€¶=‚yñ¦¦®vò¥°²ÛÊ…™ _m'ÈS[ÞWÁ­lϹé¨ðK~ ÃhÎdhzÕzA,\P-^Œ(iÈXŠGñTZ~¾ÌÂe}döù“¿AÕM™Á—Ì…Røcw†}Íkxt¨]swÜÍÜ'D!PȬ_ê]¹yš“74?Æ gÛÁâ½óÔ•Õ©¿‹4س(Œ`mÀ}çáÉæ~Á›‘«êׯÆØUÉxŽÉùˆ‚_‹ÂÅA„q=#)¶qBÒ3ŸÙ¯z‰gØ çóÈ»®"¥‚, íb¶4¢´÷¯±ø×릩›öe§É¶N'Ë=r~·¬îFÆEÇÞ^¤|èïaiÎ~F›¼âÅâe»Ž'È_âV÷àš|Ç×ðq ô0K—ïïx"?{Ž`kù”–E $ÈÃΪ®È§’õy#¹CVý1k€0Œ¾¾@@Fˆþï¯onxð«²ê®nöyÇãž~˜Ð z,w;îÝ +f>¥;6pÁ ¼ÝÈ,ë×@À p)Ü9‚+k@=(X‘}“û±SsͺZ 'S¡·¡]ú6“&`zih÷e»©+ŒgîMŽ*€„5n=ávD8l<¶‚êVfÝçh~Ù‘y…ñ€—Î.YíqUňBñÑ3ï86½ƒdŒ šØá>nO0áBØyBÇ㢵m!Î"ó xàA% ¥,<¦lÉ«'î §Ý€’]´à‰Ž—‡ÿ[;¢†˜5#†è÷NȵÌZq|«ù Ø„–~X£½½úiýµÄÁ€ýÚé#PTuåT±@l£P'‚,%\1¼d>Âññ/‰œ„ ݤAœd\q­2'©±|‚Í®1bÇc€=›m^•íž¡wuÃp ·ÿôò›Àܽ«zIŠ—p‰8ôm>òq³‘PÀÇÝ#'«0Ù=Ö ÅÀŸÒ[¥1*‡(£xÅôqÅþþ&ÄÜ`OÔRÞk2”™ü? +”Ò>ý8Ã+£­úbƒH3`$ÿz÷ă-fÖFy!§AÐ!îB+¼"ž A oÈ[ÒöKM1Kr-eX“ Ìv15hy‹dlˆ¤rãë-V)ÖÂ@V&ìðúëˆ+¤ö¡7Ùjù?`/)×êk·ÛíIý%p‰ûŒ2qï<‰5%¾xëÉ à>u,{A îÔ²+³sÌ“€ äQþ<ÚÃ-%íÊwݶ>Þ#ump Œmy0·…ZVJ3G7N݆£ lb8‡m㊰ù7< k49»õÖÍe¿~EYŸžWU‹^4JRø$ ;„c+Ä!tJ`;¬ +„O\(´5CD ñ¹wÃ!mƉ} "¤– ³UG#yT˜DÖg4/„”=dïÅ»G*±3%éIvbdÒ#“yM…;¼xlýu9úfž‰AI,ªP<Ï1)"OÆÞšb“ç÷ËÀ²Dqôâõbú÷g*©–ÓÖ¾Ê$Eœ¾.ì=Káv®“Ù #È yFø²s=•´[_îA~(ëcëË@½¡’òŠMÇ w“|a^¦C„ÖÆ/ZÔDÙhN¤eƒI-V”Ù`âR‡˜dnv%iöÉ–BÛ‡}~9Áª‚üÓhï !§ä' .Jý%úͤüLxQ' MÜåDapšhÓÀÆñ‰§ÊrýCSRuŒš¼–£ #é½áô¢) —«qÈKÕ…!½[Y­Y!G3ÔïC0‹Í '0þp¶ì¤–m¸lH8“Å>\M0¡ír´|LÞl02©@œU }aç3+­RùN¹‡z9åÎb-›ª)ñòê®#+¦0$Ã=ïľà +Ê-;1ØxÈkÊCN.—²ƒÂ9W‰;hYq  c>ú ÒŸe.èÓ +ÐÐf_zÝG}Åq¯¯¯0!3ÃJ÷9ßH´15ü„ý’Ýú8€‹HݼR¦X3¶!̱~Æ äë“忶N¢£ƆˤSÇ-’®1^U'>Ç;õçäEa Q1^"/µ©‘¯o=9$þÓ†Iì™ ØKA!8ûI¤…ËÇDã‘gÁ…¥ - #yp²›ì Iªˆ‰ ThÃ)Æ¢ö§ñ¾”ø£ ‘€ìsÏ”5G?‘&‰1ˆÄ†æÈÝ$¨Ó0‡º¡è o?|üxý†×NŽ"}Ë¥$Œ€IÍ¡eX.¨&_ q¢”M7ïä€Ð+{˜û ÍÍä–af0€{=£Ê _l¹w8ÞîÊÍ—` ،̿¿aš˜IÆÅï×åÿ٧к±ÒíäÙ9”ÄîÁ5h ø~FîgÎ¥üm¾÷_òª"»„n¾BˆþËIûÊûåò¡Ü¹>âèƒÜÃtý'œÆGUÙ•>&û2~ÿAcò‰f¶(Jo¸ VÊ|œè£F˜êF*­&^¨ú‹ávÇK¤Ê ‹$—1R6Èç º;n™z õ£ƒ¤„HÔVB<]ºôÕÄþ4`™{"ò‘¯NøÔ×w­¯ÒÓú¾ëÜþp’óïj–.þ&Y|éßÆÝfž‚kˆ3¯pÂtùîÆFxôés±v )âjR^¿ùQötò‰kßNëýEÀ %ðßÉg×µ§uøRØÕõΟåáàmˆ‹%‡…^vƒúðRˆ˜¿ãI{ |&2I¦ÚÇlU{ö/8eûœ#8÷ƒcüȨ̀,Õƒú¿l2üº&J“¦g¾‰Aö¤a–x¢È$ÚSÊû_¥<'ýôJ„endstream +endobj +1107 0 obj << +/Type /Page +/Contents 1108 0 R +/Resources 1106 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1115 0 R +/Annots [ 1111 0 R ] +>> endobj +1111 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [418.3461 611.3335 487.0181 623.3932] /Subtype /Link /A << /S /GoTo /D (dynamic_update_policies) >> >> endobj -1099 0 obj << -/D [1097 0 R /XYZ 85.0394 794.5015 null] +1109 0 obj << +/D [1107 0 R /XYZ 85.0394 794.5015 null] >> endobj 186 0 obj << -/D [1097 0 R /XYZ 85.0394 769.5949 null] +/D [1107 0 R /XYZ 85.0394 769.5949 null] >> endobj -1100 0 obj << -/D [1097 0 R /XYZ 85.0394 749.4437 null] +1110 0 obj << +/D [1107 0 R /XYZ 85.0394 749.4437 null] >> endobj 190 0 obj << -/D [1097 0 R /XYZ 85.0394 597.4103 null] +/D [1107 0 R /XYZ 85.0394 597.4103 null] >> endobj -1102 0 obj << -/D [1097 0 R /XYZ 85.0394 573.0707 null] +1112 0 obj << +/D [1107 0 R /XYZ 85.0394 573.0707 null] >> endobj 194 0 obj << -/D [1097 0 R /XYZ 85.0394 410.9267 null] +/D [1107 0 R /XYZ 85.0394 410.9267 null] >> endobj -1103 0 obj << -/D [1097 0 R /XYZ 85.0394 378.8211 null] +1113 0 obj << +/D [1107 0 R /XYZ 85.0394 378.8211 null] >> endobj 198 0 obj << -/D [1097 0 R /XYZ 85.0394 204.765 null] +/D [1107 0 R /XYZ 85.0394 204.765 null] >> endobj -1104 0 obj << -/D [1097 0 R /XYZ 85.0394 171.4256 null] +1114 0 obj << +/D [1107 0 R /XYZ 85.0394 171.4256 null] >> endobj -1096 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F14 729 0 R /F41 925 0 R >> +1106 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F14 737 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1109 0 obj << +1119 0 obj << /Length 3252 /Filter /FlateDecode >> @@ -3700,77 +3713,75 @@ R UˆÄuV¼¼Ô)e ç/> –|}Ä[¾¸»¿‡CÔMT4ÃðF‹Ó üIT¸ ;?ðËPñVUè‚èô7 øpiKìOD“"VØØŒ66ð8uRÈ(L0”lÙuÇ]‰¥¶â§s$ôuJAï¡þœ .ºj2˜dàJU>¨¡“Ï•ÝPK'ºÈO1ta  øŠ#~Õ Ä9ÖsåÖåqÛ³ºÊp0ºÈe©ó['‚|ËÅežÿ~(!ˆA§Ò`xË0zDúÜMç8kO&.βºóhB×íÄe¡þ”LGOéßã¬ÎV¸@8¨aÔ8~?{%ÚÕFªµ›ðËþ”sÁ4µÈOJÆÃN//çì„èð’q$Ϙ}¯\èžôv&ÉŒ® hΨY*“Ìæêì]ºmÖŸsewvèëÆ “ +â~Ú;Ä(>õw¥üÎÄŸoDÌvþç¿úœþÝ’QÖ¦§ñŒ“< ÂI˜)Üvš_pþtÉú‡B¬ðendstream endobj -1108 0 obj << +1118 0 obj << /Type /Page -/Contents 1109 0 R -/Resources 1107 0 R +/Contents 1119 0 R +/Resources 1117 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1110 0 obj << -/D [1108 0 R /XYZ 56.6929 794.5015 null] +1120 0 obj << +/D [1118 0 R /XYZ 56.6929 794.5015 null] >> endobj 202 0 obj << -/D [1108 0 R /XYZ 56.6929 769.5949 null] +/D [1118 0 R /XYZ 56.6929 769.5949 null] >> endobj -1111 0 obj << -/D [1108 0 R /XYZ 56.6929 748.4014 null] +1121 0 obj << +/D [1118 0 R /XYZ 56.6929 748.4014 null] >> endobj 206 0 obj << -/D [1108 0 R /XYZ 56.6929 549.4516 null] +/D [1118 0 R /XYZ 56.6929 549.4516 null] >> endobj -1112 0 obj << -/D [1108 0 R /XYZ 56.6929 521.7105 null] +1122 0 obj << +/D [1118 0 R /XYZ 56.6929 521.7105 null] >> endobj 210 0 obj << -/D [1108 0 R /XYZ 56.6929 231.5025 null] +/D [1118 0 R /XYZ 56.6929 231.5025 null] >> endobj -1113 0 obj << -/D [1108 0 R /XYZ 56.6929 201.1114 null] +1123 0 obj << +/D [1118 0 R /XYZ 56.6929 201.1114 null] >> endobj -1107 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F48 940 0 R >> +1117 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1116 0 obj << -/Length 2902 +1126 0 obj << +/Length 2922 /Filter /FlateDecode >> stream -xÚµYI“«F¾÷¯èx«§Ýˆ¢XÃ1mOûÚl @b‘-hbþûÔ´ÔÛá˜Ð¢2++óË­ -WýÀ«,0,TøWIá«῰¯6¢µ_@Æó‘3}‘­Ôš‹7@¥6j´š”ÔÍéà{«ö&ñU›µÐ P¢ur¶±Í[·ßÕÞKK-4|´°«wzùõwöÕDÆô^X*²ðzE/,…{õ_x2a>ã½Ì_¦…À*YZ†ŠeF9©”Á"(Œ9H`1ƒ8¶ŒØµƒ{XØ ´ >,“$F í…ù¯®ç!|d©¢{qHGÇè È•Ð<VF¢ƒ•ÆV’M&È3.æ~cYγâ'©7 tÏKŸ„™ÞåËBä žÕ±â|_¢ˆE7:Ç–‰ÍA°d|À 7rÄ)+qM Oð•Ä±2J&.H(àC(ºé»'‘ž„QL©W7q( 0òèsex^æ3Qüô[ë¸ožg)‡û7V`èëFt3#Œ¨nñ1 L7°K6¬Èȼï7/Ù -8?r*‰ÆO3F[ƒ|c=¡HBEb  +ÏP~ÂŽÒ†À‡(¬Î„c”Òá1t1¨„=ü² £Ìdº‚×b›Rò - d%šÏ8!ÊK–e+0À!aŸ# 3·¢‹•á‹äpÈnaŒå¨o -WÁJp©¨o=«ØüÁ'AÅd@ºOCë‹d9ãJ2¡ŽÂ\E?f1wŒ\=±Hœ#>ÊÏe¨Xx:[qÓ™]猸Š~ýtz5<Áÿ\b -r!ŸÇa–ÿO–?Úôe…"Ÿ]îŸãÌÛÂÝ_<šZ1ñ#HŒ¢ ºô8”Áÿ\dž—þpž‘d<Ž…^tÏ5°øEu%¾Z$Ié@L -QÐE”gáBæ·ˆP¢ÇrþIäDd³ÄæÉ…Ë[™HFŠ¸Ê$fú£"Xê 2¨ÈÚ´°â™Ð/ƒš¤tI„Yæ.Ý%» 2£pEÁøqS£HDŒÙÆ(ÙÃÒ%1’À‹Nf„]ÙÆ -#¡¾•±2%f| ŽÆÈ>ÛÛó0÷h‘B@‘)G÷&  €ÙÑ9Z´éx6‹é`‡ë3æ•+›#“Œžd’–Dxq¬f‹ý|IÆ„Œâ„òynp Ónð…ψÒcÚ‘~t\ƒ–çÜœ§Ð0¯å@ìÀÏ$zÃý1ÁÂJ´t4OP"#ÏŰѱ”À PI”eùO† *!PTz J$üÇNF¦ –´á×Ïâ†^LËòsÝH±AOëæ’Xļ¹è0@¥•à±¨2s|Ѷh)ZNa,g QvÒyˆnê¾Ç——óKËQ ¥‘„EÆ™õ§æ™×§²gÿjd£L¿F6ÞÄ´b#r·ŸÙIŸ~øÌ”ènf¿‡,Œž™ÇÍ`2Cãì£fÃ!Hö}ÒU <÷€K°RïŽðI¬åŸñS)f`E¡3$‡B4„ BÅÙÝ¥tŸUõ$+1cP>/ÔÍL,9"=¶abæ[4Grôsâ„‘› r{ɸ²4ÆT3¤SX¼“=dV`}‡¢ø-Ãʼnüä"B>+%­ôd2?×–tÍÚŽú€ú¾X±-z6 jDnìXÈÁ™Cã TÒ£kè}\þ£h2 |4òÂð@G¸w Ÿ“ôÄêN4¢q¸’y^xELT]’œbÅÑc:Ðéƒú"ú|ˆBTãŽg¤<²Ê ¯y}3*ùþh@3'$5—Ñ­ÀÍwÂzåãü0@d|ž¦°ç$&w€'©T[Ü{Ž®Á!¥n­g[i])ŠRB…Ú.²«“  ܤ ÏsøÕ¼¿Ý[U^˜÷ÏFÇ®š°·vÃä$Šv?4§û÷R‰nµ¶°¤³¢,ïê¡sònM綞N9öûT‘æ¦§Æ‰“fRM…Õ…à̦·¹Ñ-³ztºw~¿>mšÜnjÚ·­ÑTžÆ6fuÓu­t0ÝWmøí—âk -uïß rÚ$äH…Ãðœ¢ÏzõS\p¡+®I_ò/U¯Tðw6øWƒ!Ã(=£`Ýtÿˆz¯_¥"dR»¶j5ý63îÆv¶Ó¿´6u1l5Wï;ŠBë¨ûh 6zmæOœÖfCÕ0+~¹»ÁµâîìÖù$]6Õ{{£™­öh™¾÷6÷sÌzÚ1¹ÚûöÕÑæ@äΖïõµí¶,8ƪ1”ו·g[î -†Íï ßóV–¶7œ×°Ã¯†5cö~suŽštµÉů†ér&×—UgiÞÇ— ÌÄyCu¼ÎÞܵg5·I5cuÊ*5öŸy¼:íÿðîý¸ûæÁMÏPÈÝ $ð—ʾ„îZœ$<›É1øë2ÇtGµfs6©1£–úGq>sþT»öX;Ö'=¸ íûո͑~c%0òô´ ¦Óiª«†#ß¡¶XDïîÀi«Á¨}„p9hÝ{?ê-6ðnÛ)\^GªxØ„¢Á–9<‰ïëÓ6¹ŽoOrãÞ÷Ãꈮ8lW-=ô­ÁØÕÇæœ-ss:îŠu{_ß×óî­‡z·×ÞñCÞLÃ~×¹››tÊm×ÓhŸNË”àuÖkHú8ˆ‡éºß鬭مî<¹í»Ó•ožìq¯}z¿ s\›KÖòÜìuÏQ¢Fwø #ݾ &mî²R›ÕY0X½7¡ -µA™R§·îôœÚ¦) eqÙÏ'ñ¦×±š -]®£ËdcÅ›fwvqšÍ²ýnÞ¿lËR{š/¶œÃ=MF#n>RÄéì ï«nWv·EØ—zóß¿ä’i2Ð?è'ûò£Ðãj†aþÛ?&…:„eÿo°E2ýíS>ÿ@BêAYæ>ÿ(yú¬ˆ¿œ£s~®É é«æÅß.?ªþÛúÞendstream +xÚµYI“«8¾×¯¨x—qMua$±FǼ=ï;^»ç€6‹ x˜ÿ>Z€²ë1óº£c„”Je~¹ +ƒWÿÀ«"rŒr¾nÄ3ˆÉÂÀt»à@ÀKœ"ˆÙyÓ‚£€Hâ##a1kò4c|4ÈÖ†$Re‰Šú å'ì8l(|d€Ýêô¸€qŒnlx]*%¿l#(s©¬à5?f‹…ü@"‡x™Å3 E„ã’çùR- ˆKاˆ@AÙL­èlEEøb>ë 1Æ„ö¦Â",¢¾ñ¬üð› 'è>s­/œâ JJ•¤L E&`I?¤>wˆ\=±¨Ÿc:FÓ”o<ž¬8‰ÙÌ–íósB’‚èŠ~ù4~5<ÃÿR  +›PÈü0ÿ'Íuú@ŠÊ!I@Ï&÷OqjÀMnî/½Y1µ#Èœªâ¼ô8RÀÿ\âTA¸ÀÉŠ'LϺçšXòÆã¼_,¤xé@²b§‹ØBœº ßà…™ 1úƒÈIXg™Ï‚‹¤·"–œ$æ~•rLåÇI°Ð2âp +Pþ°=Xb%3¡_5 éÌ’3²Ì’º NN…yÂøñP#DêŒéÁ8ØÃÂ%s²(HFæ0‡mÑÁ*'㺕’rj|àŠÆ)=;ÛÏõx”Y4! ÊX•ƒKjP±ÃlÙKÚl<™Äl°%ù™P‘Ì•ÎÑŒIGO.6\î‚ôÜ'Ygçî c•ªíé´qg­üBžj>ƒJ*[0CÚ≠LØNÎîöÆ&I¯ª'iŠI ÀÑy¡n¦liwŠ—XÛFSÛâ9³d Ÿ'ŒÜ§ÛsJ•†1Y5C6EÄÈ*ÙCdÖWÈ“ïÁ2\È_AÎ=ä3S²LO'³¾¶ jV¶ÌPz¨ûRɶXo a$\ˆÜر(ÐÆâ„ñJ·ƒkè{Üþ£x2u|<òÂpÏF¤v`›Óð$ ÌœxÄ‚$“y^xÁ\TmœRÉÑc6Ðكن "ö|ðBœã',<ÖÊ`¯Y~’RªÙùxÀ"'¤9MPð­ÀÍN"re㬠<>»)"À)‰éà‰+“ÆÖ÷ž!DrpÈV7Ö³®,¯äI‹‚Êt—ò„‚GéÕIT1Ôí$R¯±ë)Aª(1E1%¾$éMãRæLx`”põŒºa}Y*P@¢Þ—0í½8•2»FIŸ)©ÀŽ¤abæ!{hÇ%Ö>>=ͧ†¯Pìϸnü¼©CrÞú+–®ïŸèõK`ÑFæŒÐO;iß­Œ0H‰œT˜Ìß³Øå‚$!"H2Sbziq“[¾L“€ƒ_o=×Ãìâs}¹pà7A’~Lܾ¾ü‹ž"Èœy|KÅ}Œ +x—é’Hn„$§r²€ØÂßéB&ÏÃÂ$$9“°íZ¬ü‰ôò ¶§|æË™Â"'B=;ö7îã E™ ÐÓã[u°.Ñ¢‚Ú¶ó^[š|4_ÞV~¸Iä¸ÑØv‘áM6M]»L;ר¹¿váú$µåѽsbG㻺ÌÓúñuCµ¯Â¬îÍJË[v͆p_µG¯vƒ³Qƒ3Õ_;{sv0Á<Ë­Š¹XJÏï{Á}…Šüø~ƒË›°÷ÃJ]ݧgÕÒý2ʨÕÜU{úT¶×ßË»Ív=ëžÝHkEPlöä©6žÝ«q_ Û,ųƒ›6kÅ AKm%:ݵT;~¿ú•ùzy×ÖÜ«”Aψìe¹Ûo4Ír¡Šîéü]8vj7óäZ­Óþ´B-aÙ¯“÷««C¦bОÎ~9¼-&JuQvæ}xŠTœÖ4ÇkmÑÕ]yV}“”C0ÔƼZáÿ‘ùû§Ñþo‘Æ”î̹Y†ÍÍ @*íËø¢eñYMÈ‘OÓk>*õúdTá íg~>Sá”Ûöpv¨Ž:hÚ÷‹qšýÊË ”ñqŒÇã +W¸ÄÂ/içóèÝí9M-4¨.ƽYûÞ:ó5ºÛö -.MÚ¯CÉà‹ žÄ÷Õq“œ Ç·Ç5¥v~y$Wê7Ë–žbÚœ¡ØÕ‡æ”/2ómØ–ªö(¾¼¯ÖæÝ[õõv§¹ú‚y »mçn®oc¸Y£Ým\$„Ыò^MÖ‡AÜ¿­º­ÖÊšœÙÉ£ë®=^úæÑvšÇ÷3n›¼TX°ïàj¯:ŽÕÚÛÀMâéöµ7jÂóR«—'Aoù^GšõŠ”[U«ãTÖu±'ªóón:Š×–U¯Ín‹Ut­­x]oOÎN½^t¾§ÝóƱ,­3󥆳¿ß’ÁNª4žì•]Ùm+î&wûBkþû׌3 öûÞ_Ü +=îæ8î¿ýÝ‚°«#TôçŸÓ_þ+æóß',Røù/ËSûJ>»ãKB& ù«äù6?Šþ¢Ó, endstream endobj -1115 0 obj << +1125 0 obj << /Type /Page -/Contents 1116 0 R -/Resources 1114 0 R +/Contents 1126 0 R +/Resources 1124 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1117 0 obj << -/D [1115 0 R /XYZ 85.0394 794.5015 null] +1127 0 obj << +/D [1125 0 R /XYZ 85.0394 794.5015 null] >> endobj 214 0 obj << -/D [1115 0 R /XYZ 85.0394 717.5894 null] +/D [1125 0 R /XYZ 85.0394 717.5894 null] >> endobj -1118 0 obj << -/D [1115 0 R /XYZ 85.0394 690.1986 null] +1128 0 obj << +/D [1125 0 R /XYZ 85.0394 690.1986 null] >> endobj -1114 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1124 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1121 0 obj << +1131 0 obj << /Length 2380 /Filter /FlateDecode >> @@ -3787,48 +3798,48 @@ w ¯7^5t\ç.<7SQK„S£Ýš£ˆ^GfˆŠ×/†qˆ€[èò::-vÞ¿÷ºÇo aàÍ>Ô)ø¹) ‰I˜ö 2±/.âF'~QÖN°vt¦yxJ2ŲÇ3àƒœÃ‡þÅyCO‡7ãƤþ#'!þ_BÆ?݃UqzD:QØÙï¨ÍüäIòà@á'*¿'ÒC}¤àùáì1»«¸«Î÷³>_±Ó$ÏDŠ÷ÜI5á¿ö.ª¸vv÷ŠÌ=ô!ļ"xß½t½†rZ¸¯p㺛Í,‚HHDÏØë ƒ±Oº ‹pt8³?ð¾ì¼Eµ«# StìÙ 9µØ¦.Ëú0øâPïK¿fý„¯b*r¹f1“"÷ôÕƒ©1Ľæ_a”²C¾¼@Í™JxèØ[çm`2‹#Õ'›‡o2耵_EQÎNöÀrh…ëIvâÉ)Ä Æßú…ìK` ¡5¯£ïíê=ÀÉHlŠåsÇ!¹õ|ÑÁ8øî/¿ ê˜)¬’f«xÝaõ¢z¥œ³’š÷ÿ‡x©úÿC|upendstream endobj -1120 0 obj << +1130 0 obj << /Type /Page -/Contents 1121 0 R -/Resources 1119 0 R +/Contents 1131 0 R +/Resources 1129 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R -/Annots [ 1124 0 R ] +/Parent 1115 0 R +/Annots [ 1134 0 R ] >> endobj -1124 0 obj << +1134 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [349.4919 384.4828 408.4801 395.2672] /Subtype /Link /A << /S /GoTo /D (ipv6addresses) >> >> endobj -1122 0 obj << -/D [1120 0 R /XYZ 56.6929 794.5015 null] +1132 0 obj << +/D [1130 0 R /XYZ 56.6929 794.5015 null] >> endobj 218 0 obj << -/D [1120 0 R /XYZ 56.6929 594.1106 null] +/D [1130 0 R /XYZ 56.6929 594.1106 null] >> endobj -1123 0 obj << -/D [1120 0 R /XYZ 56.6929 562.6395 null] +1133 0 obj << +/D [1130 0 R /XYZ 56.6929 562.6395 null] >> endobj 222 0 obj << -/D [1120 0 R /XYZ 56.6929 370.2937 null] +/D [1130 0 R /XYZ 56.6929 370.2937 null] >> endobj -1125 0 obj << -/D [1120 0 R /XYZ 56.6929 341.714 null] +1135 0 obj << +/D [1130 0 R /XYZ 56.6929 341.714 null] >> endobj 226 0 obj << -/D [1120 0 R /XYZ 56.6929 214.6004 null] +/D [1130 0 R /XYZ 56.6929 214.6004 null] >> endobj -1126 0 obj << -/D [1120 0 R /XYZ 56.6929 186.0207 null] +1136 0 obj << +/D [1130 0 R /XYZ 56.6929 186.0207 null] >> endobj -1119 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F62 1050 0 R /F21 702 0 R /F39 885 0 R >> -/XObject << /Im2 1039 0 R >> +1129 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F62 1060 0 R /F21 710 0 R /F39 895 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1130 0 obj << +1140 0 obj << /Length 1913 /Filter /FlateDecode >> @@ -3842,59 +3853,59 @@ M&P ïp,'èñ+)jä‘jåQúk ©ï¯‘ÙYºÝÕ¡Eâ¦Á§âÛð´â·I-§Ñ;ÀÍÍ$b®»Ö¬Ý‰ÜQµ㩺›{JýÐà4;,ÿ‰f`¨º ‡W$‚7€Úù«1[Ë/¥nÆÏX «Eš Q S£»»·ž;šWïP{“øÄDN)ój=u”ö¬ÊùßC;»òÕ]Û Ñ_;Œ`ÝÄF q…7ÉGb†N0bèKNôJ… $ȳÈBÏ"g¥O Øêåýµ G’^—=Ys{}ñJE½Ó6l`‘“TÈ‹«Ã}%­JüŠÆ‹ŸêIÙmS:_Óß Р*çóýÃì(š´ªŠúºWy÷ËÓü-1~!EŠß×¾6F‘íE†>5.NF¸áb¼¹]mþpùv¹ÿÐÆ}endstream endobj -1129 0 obj << +1139 0 obj << /Type /Page -/Contents 1130 0 R -/Resources 1128 0 R +/Contents 1140 0 R +/Resources 1138 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1131 0 obj << -/D [1129 0 R /XYZ 85.0394 794.5015 null] +1141 0 obj << +/D [1139 0 R /XYZ 85.0394 794.5015 null] >> endobj 230 0 obj << -/D [1129 0 R /XYZ 85.0394 769.5949 null] +/D [1139 0 R /XYZ 85.0394 769.5949 null] >> endobj -1132 0 obj << -/D [1129 0 R /XYZ 85.0394 576.7004 null] +1142 0 obj << +/D [1139 0 R /XYZ 85.0394 576.7004 null] >> endobj 234 0 obj << -/D [1129 0 R /XYZ 85.0394 576.7004 null] +/D [1139 0 R /XYZ 85.0394 576.7004 null] >> endobj -1133 0 obj << -/D [1129 0 R /XYZ 85.0394 544.8207 null] +1143 0 obj << +/D [1139 0 R /XYZ 85.0394 544.8207 null] >> endobj 238 0 obj << -/D [1129 0 R /XYZ 85.0394 403.9445 null] +/D [1139 0 R /XYZ 85.0394 403.9445 null] >> endobj -1134 0 obj << -/D [1129 0 R /XYZ 85.0394 368.2811 null] +1144 0 obj << +/D [1139 0 R /XYZ 85.0394 368.2811 null] >> endobj -1128 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1138 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1137 0 obj << +1147 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1136 0 obj << +1146 0 obj << /Type /Page -/Contents 1137 0 R -/Resources 1135 0 R +/Contents 1147 0 R +/Resources 1145 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1105 0 R +/Parent 1115 0 R >> endobj -1138 0 obj << -/D [1136 0 R /XYZ 56.6929 794.5015 null] +1148 0 obj << +/D [1146 0 R /XYZ 56.6929 794.5015 null] >> endobj -1135 0 obj << +1145 0 obj << /ProcSet [ /PDF ] >> endobj -1141 0 obj << +1151 0 obj << /Length 3113 /Filter /FlateDecode >> @@ -3915,47 +3926,47 @@ h4: ²>Ÿ2˜ÄáÎG9ü)¿²ÁrÔ™½ã7àã~€ª;'è¼UðB4²nÃÑ2–'ÁN;ú3Þ*ü?ÚªŠª•YZêð€rõ\¾ÄE^í…ºbYS¦iM5> endobj -1147 0 obj << +1157 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.2946 363.7923 412.5133 376.6291] /Subtype /Link /A << /S /GoTo /D (address_match_lists) >> >> endobj -1142 0 obj << -/D [1140 0 R /XYZ 85.0394 794.5015 null] +1152 0 obj << +/D [1150 0 R /XYZ 85.0394 794.5015 null] >> endobj 242 0 obj << -/D [1140 0 R /XYZ 85.0394 769.5949 null] +/D [1150 0 R /XYZ 85.0394 769.5949 null] >> endobj -1143 0 obj << -/D [1140 0 R /XYZ 85.0394 576.7004 null] +1153 0 obj << +/D [1150 0 R /XYZ 85.0394 576.7004 null] >> endobj 246 0 obj << -/D [1140 0 R /XYZ 85.0394 479.565 null] +/D [1150 0 R /XYZ 85.0394 479.565 null] >> endobj -1144 0 obj << -/D [1140 0 R /XYZ 85.0394 441.8891 null] +1154 0 obj << +/D [1150 0 R /XYZ 85.0394 441.8891 null] >> endobj -1145 0 obj << -/D [1140 0 R /XYZ 85.0394 424.9629 null] +1155 0 obj << +/D [1150 0 R /XYZ 85.0394 424.9629 null] >> endobj -1146 0 obj << -/D [1140 0 R /XYZ 85.0394 413.0077 null] +1156 0 obj << +/D [1150 0 R /XYZ 85.0394 413.0077 null] >> endobj -1139 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +1149 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1152 0 obj << +1162 0 obj << /Length 4061 /Filter /FlateDecode >> @@ -3980,102 +3991,106 @@ S žèͶKê-‰?˜^À¡E×°NžÄô;,)ÒJ”¯0¬•;ªå ëÉ3½&„–˺/ÐñÐè›»ç“_A½Îì±ê%”ÔTÚêÏk]ß­ëËAt•Û…e›(Cµ|LÌœÜnè?cX/J•–±È[Mì©ÂëJka5ó\Sî€[²Ä%ØùØê ŸÆkú2|¼uÀ(ƒovY m‰S»f?PÛûŠŒºüQ[·¨>Õ¡Ëãiß×onBË—Z1ycr®ÒíÇ™'¿ö„g 5;_{þgOå,- k€±3Á1kΆ_‰î}-ÊÅüuò<ÎÛ.β¶>¸eR°øý$~pË@œ)¥Ó···ëXîN§ßÆbsh~Ó`.g¿¸ŸâˉTmIeb?U…—þì‹Û•˜™ùC¸ìßþ¹^ÔKˆvÂýß{ŸV9’üOQø}@ Ÿb jLŒ˜æxqºñ¿IýÅã=þ\%öúoõ꾈CþuèÃcUJ‡w7žæU¿ú£äí'ÛÒagÐ;ð-JZœòEð½™3[BóÂÔÿ Æ+h:endstream endobj -1151 0 obj << +1161 0 obj << /Type /Page -/Contents 1152 0 R -/Resources 1150 0 R +/Contents 1162 0 R +/Resources 1160 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R +/Parent 1158 0 R >> endobj -1153 0 obj << -/D [1151 0 R /XYZ 56.6929 794.5015 null] +1163 0 obj << +/D [1161 0 R /XYZ 56.6929 794.5015 null] >> endobj 250 0 obj << -/D [1151 0 R /XYZ 56.6929 165.9801 null] ->> endobj -1149 0 obj << -/D [1151 0 R /XYZ 56.6929 136.242 null] ->> endobj -254 0 obj << -/D [1151 0 R /XYZ 56.6929 136.242 null] ->> endobj -1154 0 obj << -/D [1151 0 R /XYZ 56.6929 106.2766 null] ->> endobj -1150 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R /F48 940 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1157 0 obj << -/Length 3064 -/Filter /FlateDecode ->> -stream -xÚ­]sÛ6òÝ¿B{ˆÜX4A€y}J]§u§ur‰3w3M'¥%Øâ˜"U’²ãéÝ¿]ì"%Z¾´7z¸Xì.‹ý$&!üÄ$ƒPfj¢3Ä¡ˆ'óÕQ8¹…±ïãÌÒ¬õíÕÑék©'Y%Q2¹ºéÑJƒ0MÅäjñËôì‡Wo¯ÎßÏ¢8œ&Áñ,NÂé·—ß$£æìÍåë‹ï?¼{u¬ÕôêâÍ%ß¿>w~yvŸ@æ ¦ðÄ„×?Sïü§óŸÏ/¯ÞÿzõãÑù•_LÁ"”¸’ß~ù5œ,`Ý?…ÌÒxòa ²,š¬ŽT,ƒXIé åÑû£x‚½Q;uL±Lƒ8ôˆ•èiP„QéHLtœ‰Œ¤Uáy<ž%aˆOÅ‚úÿ¦&Ÿ—Ÿª|eÀ?xl±hLÛ~ZåÝ|ù©,ÚŽàÿ¡æc ÔÎéë¨/ÃLè “(«u‡:²2 æEÏDS¿3Ã0ªŠ®¨+Rw^-¨ó¡Ío “•=²á†AC±²ô^lÇ"‚|0OË©’º(©…FÓœ¾nŠUÞå#}nZ³ ^WS»0iVEexò|îÉÏ몳´ê’7uC{ Yo˜_kš{ÃõÚ49®°›“:›^-a#`e¸!‚,ŽI7=!iÙÖÔÛ‹)‹M‹ŠÚniFtž¦`Y ˜¥‡ë7Õ T»¯F%ƒ0‹5c¢Ö÷©‰,ˆµŒÓÖMg÷~Ÿ˜TA$SG¬íòάLÕÑzc\/ mJ‚Ó×ò ¨Õ¶+ºMçϫ̇»ñî¢îfN Uêt(üšÉ€æ9›Ôµq¦õHú†ÚnÉ#7uYÖEuû÷§Ny¢b8P:9ìÖúXöP -ÕÓRÝTöh¡¼C¡w™Âª`’Ò‡¹z¬}¶ƒÍ!ôU2dëtsñ–u3Ptluxñö^±Æ‡~Ÿ¸ã>ª¦HZÆé3jêaP“Ãz^M‡¸öÔ´Ëv\M}¶»jZ“’Ði}Þê©`¬ßN_P§ª;{ઠ-ø©LfϨª‡u@UëyUâÚSÕ.ÛqUõÙæ´tc¬Ê¾;aÓb‹Z¯7ì߯·‡pÄõ€ïQJ8ßsGsWŽ |X*wÝÎS3<1°9¨ñ>ÖÓ÷XÏjü ×­Æ÷ØŽj|ÀÖ»/ŠÛ}ÏæìvïX»èÝ­§ÜÙ™‡¢[Ú›(RAªUìbǼÛ›8ˆD”þÏ{£!qu`ozXöÆa=¿7‡¸ööf—íøÞôÙòi¨ DàÅ—ì…©æeݺ9γ\79¤ ÷@ûY˜$ƒH :}çÛÈ*%‡>èØÐ'#ã6'AÈû ½œšÒä ~ôa>ÏË|•sF&1ä6w4„¾î·¯^ Wó-ÎÖ`ˆlQnÓ/)Ý¢ ‡Úµ`=ˆ±±4´…Tue4H‹øxÁ@YÏórY·OT3—™Ø"T¦kñƒÀ>ÂöÜÞÔ!5Ñ ÙÏõ Õ Ùœ[;Îrm¬™¯»VÍع汛zãd*üL3–ê-L;oŠõ6ïÝËIðXÙŽ?;'d7ž"åVq‚æåÓè„ÉÅŽ\âür2…ÝÝ´ \å ³ƒç|‰#‘ÀPÑR¯}¬º|ÞsšÃÙÕ+˜ÖŠz“sB]m Y6,¤Ó¶¨æ£ªiÍ|Ó'ç ·Mýµf£îåíÊçí÷yY,rJ"Õ mG›¯7}Жߒ}ìÈ©AS£—Þƒm=Ôö$ iw–15·in*¦—`ĠǘŽÚ±ßZ,.8{ÀÓðŒ_ ƒ¶Þ uQ”lï*º%•%›[^hߘõ|ƒ{eM{ÇŽÈüsiP½)išÛÖvï€6ÂÁ°°êI£ÝÌF -Ƙ׫5ÅA¬®SÎòLj: ¤äDÐbø(ÙyD±hkžßåw†g®Kp”Ì¿Û„|M’ÖŸ¡ì Ö€2Ó7èÛ„Í×ìwW¬ ÞDÑô‡úÁÜ{Ó•2£³$£°'HKÓh¿o -ïUÖ2ï\A䱇I‘#äÚMkr`k÷?7ì:uó±ccuÆ篗†9›±®éd§ÆyHÐïɇ•î» -ûµéãi$m©Ú ™†M£s~†ìª±¾ÃF¸ýFȬMµh îЖƊj£ÏJPÑäÚX ˆmŽ çØ+ã1š„‘K‚Àˆv·¥4ÕP ·'ÃÚÈÅêÜéŒÊå]ûµ hÏ—ŠK™9lª™,8WçbNµcNÿz`Ë xá¼—†(<Ûf -è¶'’X!;òž¬rëŠ='æ/LU?6¦c$Š®T@ñ€áCe[¥OgÌUMß–þ õ½P=<ËC½ 3)CŽ€íXf«D&PÐpf‹kžA1WÜŒ•q%Šv·'#ô SÓq< Ö`tk‹Ñ;-ˆ#ÉŸ$H:ëNƒT©h¨ÛQ~€=y€_‰~šøý¾1ͨ6â@×/§5~?¥Ã Jãì9zz„Þ<Ÿ/ÇnSÄq"þŒˆ–丠Y -5p–}UðíU{¶½O/QHÓäËèÑÖ+( ´ñ0âmÖ6%¹µA¬ÄaN¡H£'¢6§ú7 ö–{v…7sZyÊ3ÉžbäÈ%A:‹¾†è}·¬Ë1iUô}^ŒÅ6 ¤Î ‰Rù Â•HËþï‹UQæ ~!„“b -cú+S¨µ" *P;gÉ¥íP¼Pc:g»ýÜ F(ºáð„¥ŒE%{!§qqœdÅ #¶¶PðŠ-Ħˆ!Ö”+¶~C½c’ª I¼»CQšÑ«x‘RFîÌŽó’‘ö²è½¼Àþ¨$ž~k؆­h7NB„a˜í–2Ÿ2–dæO›‚•/óû¢ö3'$8´ÝY©Ü¢¥ôPL3§¦Ý\·†q­¹á˜2e‚»ÔŠÊQ5Ôáô AET.¨)û¨Ý_÷s`í.40§¤¤)_¸çæŠiXÓ°–,}Ái.ž>ÝÃ÷Âõ¹<²u%çxÖ8_×õs¾Z—Ærɸ–ÙqRË KCçÀEò4Rß`ù£¦_A „üfÄVfžÂ@´tù¹ôµMQeÜÄ -¨4TGá7Øë@`:[ªyy[C}¿\Ñ'{Pyç„8ÖÿÁ¬²®ï6kÒKÛž\Ö±Šhß¡‰ZÉ»–+Êlú¡Ý°áóid™¿áüŠ°·ª„¸n $/:H3©z‡õ³õÎB³ÑG`,\‡^ƒD4doÄ¡ÅÓcë8è÷—šB|¬çw6¹î¡³b5Yç÷>¦‚4ÕÙŽ»»Ü]!ÔÛr„¸}MxâŠGÜ»e¼â<}û:+Ô ;÷ÚëÞzÏêÕ¶ÄyWIŸŸÞå§Cå^úáÀd|äÉÁGKäèÇU*÷³ŒÝö/{^˜œ1ÀäzÕ†vþ {R;Ó®éjÁ¾1?îP{÷ ‘¿N´zs| -£ÛMãîX“ÔšH‰2Ó«ã ð Jši¥†– ç¶ÉaMMK@ëopBÉØw”Ñ'ô¼Ú-íu Ó% ÛÒÚ8Ša`ÁâIàì„Û—/OÈ/ÕÍØ!k—¦,Oצñw–¸œý“…ö n¼ý3@6¾M(ñ´MœZ ø1s&­$YÛ×vÀi¿7peÃþWÁµ95´-ØóædGvEíNAˆ0#> endobj -1158 0 obj << -/D [1156 0 R /XYZ 85.0394 794.5015 null] ->> endobj -258 0 obj << -/D [1156 0 R /XYZ 85.0394 731.767 null] +/D [1161 0 R /XYZ 56.6929 165.9801 null] >> endobj 1159 0 obj << -/D [1156 0 R /XYZ 85.0394 703.7216 null] +/D [1161 0 R /XYZ 56.6929 136.242 null] >> endobj -262 0 obj << -/D [1156 0 R /XYZ 85.0394 229.6467 null] +254 0 obj << +/D [1161 0 R /XYZ 56.6929 136.242 null] +>> endobj +1164 0 obj << +/D [1161 0 R /XYZ 56.6929 106.2766 null] >> endobj 1160 0 obj << -/D [1156 0 R /XYZ 85.0394 201.8883 null] ->> endobj -266 0 obj << -/D [1156 0 R /XYZ 85.0394 144.1965 null] ->> endobj -1161 0 obj << -/D [1156 0 R /XYZ 85.0394 118.9605 null] ->> endobj -1155 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R /F14 729 0 R /F39 885 0 R >> +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1165 0 obj << -/Length 2262 +1167 0 obj << +/Length 3096 /Filter /FlateDecode >> stream -xÚ½koÜ6ò»…€~¸ÝÔ+“"õ`ûÉqlŸ‹KÚs¶8Ú'k¯P­´•´qÝ_3R¢lÙIϹ€ÅÇp8ï— þx'a¢"¤J†1ãqPìŽXp {—GܬÐʇz½>:¹i B•DI°þàáÊB–e'ÀX…‰ˆ„ F ÆØâþ™±¨.û²©‰Õ¼ÞÐàÇ.¿ÕÈ/`V¬"*É¥ÁwÖìvºî;:´Ëï-šý^ç­Cy·Õí’g M+ý6ïit·-{ÝíóB?ƒ t´ÑgÔZÑÔHÿí¡ÍGp¥Ò!’ŽÄò4T"ʈØU×ßWp•v” !]Ÿ·=mÜ•ý–û­…íïZ)¶y›½n;Ú8yEë?³˜uUÞma:Xãe„Š`šþ¯NhÅ`€Shy "D,h®q¶x­‹üÐé3ª8&¿JAp‚¥‹Ü 'Àã¾Ò½®ìæFWå$¾¡©¥‚%x¾sg‘Œ˜_òÅ€¾ÈkÜXp Èbë›áR,MšÚÝÓgß´¤+³ûÁíMxŠ OUY[«h¬!à øƒ±ÊÞª¾ÜWOt4ŸN5M4 ŽÕMO;7ЀB$N,.Ìõ°ªÏQœÇ8‹É8pùCSUÍ]YßÒ´´x¤óªÜ8ü¤A0 ZÊÁ=Fúædd]tGÞ¤GËo;ëY¯N¾!ï•|ê½¾Cœ˜;âP¥i;a*¹õ+³ánö6Ö[ä/Øá¾æzXÂ!ê¿9},Cáœå>FØõeUÑpÿãpÛçÀÔDX_‚;443¯‹¦muaÉÉû^ïöľh5Æ žb]0fq’Íc©ôÖ‰ú•€hŸ )§¬=&´nè[5õ-[K´câ~†šˆ È#韠æA*XEQr™A&ŠT˜e©"_ûúëÁÛ¤ò½ fÖHph-FdÁ8À8kyqç''ôõã¬AçB$M){™KÁ§êƒCÛ<¸G;84«ÉÎ~{ß­æ<¯,ò -ãab¢ Fd‘L\„EEplB#®Y"64Í ãäM×Ñ|Œ]8˧wtßÂ8‘Wam›´°MmUs;žã.LLˆœq·™€yLcÛqÕ…WN(jùÑƨ$F-MҚ͸.tÛØùlL¢PxÑV_iV<28´sÍßíÃÜŒ~ݵƒã»ƒwÌÇ4Óuíˆj·[{¶Ÿâ°ê øÌ…Ïĸ}«?–Í¡{ì¼3E™çï·ºª|D·qšØëÖîY*­Ü7 AÉèƒnGÏú”–á;¡ eA…J¿ša&¨i )¯» iææò¶¶T Õªïï3 ,OÁ‚µ«uMðwFgtþ`$ï¦%)Ä:WŠ’|f«?å™Ì_ëÜ¿õ/ó¯^às}˜ˆY˜BAùYB¥b9߈¡Y¦ŠÉ§qÑ9¸ìИ¢Þ( Kê©_C&D¡Hy‘†Îtþå9Hœ€Å‰S°òSM´¸6ÿ¡_MøâjG‹Ë‡¢‚KX -È#%€h‘!-Áo Å¥ÈæG¡˜…“«Þ4Àbàqé¯|̆KhUG;‡n Ò@KÆk"mìQì¯`´°Ès{ŸKœæ€iÐìvô½_F†¶¹Ã‹šC…>–&*`ã–Óô%m®†õ¥¸„ÅCÊÉ/qÇãO—õ<ÚbÚí5`º&X°×Œ]°aÛvWÔ„öz¶˜™u"™¨0ÊTX3ý–>«L|Ïx™_N)–\ù\†B&‘ÿúEä‚8qÏGöåãlîéà¢t…Ñe›ïvyûDªÍÂ$UÂy_nfß$`¤èóøi"¸Ø•I¢b²|š\rMìkáp9e%dºxÿN;8›‚ñ¨Åè Ê?ù¤!˜œ»\OR}<¾'àĦøضõ8Ò•ö íËb1-:"p/90FJ›ƒ@{.ª¦£¾ön fІW¦oMË‚ËžtfèǼŸ?xº©šâ×ibï7«Ññðöä*ÞÜÊ«ÎU -ºÝ•unÞK¦=·½ÊôLÚ_»rÂ!ˆÙTáoï{|"Ñ›oúg–† R—жIÆ?Ç—„_â «‰/ýo§¼Ì Øî¹óQ|p'8³e Tª ã©lþ!ò‰Èx·€ö9å”2ò¢šñNÎ2èHS›7ô¼i"i¢L¼„Qç;Ó’ÁÊÕ´”o6¤ƒÎ‚îò¾Ø…ávN‹aJ*[‹¬(:5ï=õvÕœ‘oªM¿ÕíÐOu#p -IZòÀ—ÇË$ŒºŒy’Ž}>Jwâ)¥1(SR™|Biʉ„îÚ6U÷š+*ëÝðÖ;Ș¶P&誛> ÞèA¾Vè7÷cqO×údrÅ°qÅT[oŠâ iQ‰pÄú²*ûû%ç|ñŒ=ñ¼LàÿGª8„*ŸW¡RL ´„˜}ØèOêÏÂu“hé½ÌÏJÌ#æK ì‹Gªjo¦øóCà˜Q#÷«¾ÿ¤´º½.J”ŽXÂÌ!ôæ5œÝPB0Š?¸C2‰mEá›À¡ .†‚ƽ‡ÙÍf5W¶å^tè†,µ~uù´®<9¼L°|+ ,ˆªÐ@$s?y±ÀQüâØÆúQ‚{fYä÷bžÃ§Y(3@"À&•zB>j;Ý/qÊ#ý¿ÚÕ.endstream +xÚ­ZÝsÛ6÷_¡Î=Dn,˜øà×õ)uÖÖÉ%ÎÜÍ4”–`‹cŠTHÊŽçîþ÷ÛÅ.(R¢å~Üèàb±X,v¿%'üä$ E S3‰S#Â@†“ùê(˜ÜBß÷G’yfžiÖçúöêèôµŽ'©H#M®nz²$‰œ\-~™žýðêíÕù»ã™ +ƒi$ŽgaL¿½¸üŽ()=ÎÞ\¾¾øþûWDZ™^]¼¹$ò»ó×çïÎ/ÏÎáDÃxÉžðúâ§sjÿtþóùåÕûã_¯~<:¿êÓ_° 4®äóÑ/¿“¬ûÇ£@è4 'ð™¦j²:2¡¡ÑÚSŠ£÷GÿèözÝÐ1†:a¢â Ù³  ”Hc%'q˜ŠH+íLxggQ`ãS¾ öè‘Í‹Oe¶²⿹o±¨mÓ|Zeí|ù©È›–èÿ¥ÇÇ ”hÓת¯ÃLÆ"Õ¨«s±r: å¥PÇ3ÀÐïìÇ PeÞæUIæÎÊ5>4Ù­e±º'6˜@7X(4NÞ+ÐíX&SÐÆÅzꔤ&jê¨jšÑ×u¾Êê¼x¤×McÔj+z.lkëU^Z<ŸwâçUÙ:YUA„›ª¦Æ=ˆ¬6<_cë{ËÕÚÖ®°ŸÓq:½ZÂFÀÊp-RŠ4 É6=%aÒ¢©¨µ9–SVQMó’žíÒŽØ— JizVJ¡™èž,Ô÷c ãÝIaU0Èćgí¸ö§lŽ  m¢á´Þ6oÙ6C‡.¨ƒ‹·÷†-V{öûȇû¨™T,b&Ϙ©ÇuÀLžëy3šµg¦ÝiÇÍÔŸv×Lk2&­/[;åÌõÛé j”Uëþ ©`>“êôSõ¸˜Ês=oªC³öLµ;í¸©úÓf´twÆ8“}w®Åµ \o9¿_?nƒp$õ@î1FúÜsG sWrX¢wÓÎSS8xB˜æ Åû\O[¼ãzÖâgÝZ|oÚQ‹¦íÒÛýÌæýv/¬ýéÍm¦ÜÙ™‡¼]Ú¥ŒHbú³c^ŒíM(”TÉïÞ›Î#†Qö¦Çu`o<×ó{shÖÞÞìN;¾7ýi9J 'ðâì…-çEÕø1>³\×@:÷ÀúiEx +e$EßùödÕš>h¸£O+Ðã6#E€Èû ­Œ…ÍpøÑ‹ý2/²UƈLã‘[ßQæºß¾zY c[GŒÖ ‹|Qoá—Ö~QÐBmHÚGð8ˆñádÄŽRV¥%ÒqxAGQͳbY5-4Š'שÜ2”¶mð…ÈœÂÎÜ«4‰A³Ÿ«-šÐœ_;ŽòϦfA¼l:3cãšûnª×)ïFÚ1¨·°Í¼Î×[Ü»‡I0¬\£‹Ñ rO'a«0B÷ê`tÄâB/.òy9šÂîn&®²…Ýáó¹Ä‹ˆ +o¨Õ<–m6oó9a4Ç}Õʧó¢ÞàŒXWySCE–;’i“—óQÓ4v¾©ó–Á9èí Ÿa§ŽÙ©{¸Ýt¸ý>+òEF Ò `;ú|µié…¶ü–ücGDFt5êðð|ë¡r‘€¢},#4w07‘ÓKpb°c“Žúq·µX\0zÀhx&/C»lÐxÈ vŽM—*Ú%•%›[^hß™Õ|ƒ{å\{Ç(üsiѼ Y·9¬íÞÂβ@pæIÔ.2‚žœ9æÕjÍ¡¸ Š³uÂ(L¨·@BI=†CÉ#‰ySñø6»³íH,ǽøN¬ñë ;OŒ_Ø2·ÝøÙX¸ PÌÛ*<«Lºzõ‘SVôîäŸP»SªÇç&E\¡ƒÔË·ÍŒ6R‘ñ(—<ƒÂ1¿+uÂÊ¡8î¶{_ Â8 Òjol=j¢DÉç„%ûÂÆc6„JÂäÏÈ›góåØ5e¢EFZ⸞iõvšþ1©pŽ”Í ¸ö¾¼È™$PKÚzeHËpxºnÖ~§+sÐÝB‘èáî“°ä^lóЭð0ÞúÐÑ×™*ÄÅxë]R¸[Vض&i¥[m0Q¤S‡›5dˆ`Á€AÓ]:#tÑô}¾Ê‹¬!¥ôÊ=qá‘D"Nõﹺ©…D“ÃÎWPS=@„ÖœÑ>4¹F‹¶—ÓH¬èÉ8 cF_¤ +/^,Ý "áfGä*Cða_ð€ž¼ Û ÍÏ ÙŽ]Ñ?U/¡=FÑÆñb1œ±°H71·eŽç< o¬¼à!«m)#´•,²´ÔèŽOš€žžëÕÙOé|-“Ý æÄ|bÙaã8@ØcŸž0¥:F”éš}Ⱦ%'ÝðA†–c%УK ø™äÔ «@òŠÅ!×KÝ{­Nû!•E]ÖFUêQ¸"S¡µRÌ—û™—<Y(‹Þ!Ø…Óo-û°Sí†OžÀˆ ÒÝ +ËY_¯ÉÌ›H×v™ÝçUäº`×vgá…­uw/Æ23z4›ëÆ2¯s7ìW&€º+-/½TK F­( +µbAm¨$FýþºÍcÏ‚P—àU¶ð_™xV(àM÷èê`¸Xw?Ëä¾ÍU›+w:ç|]yÖ/Ùj]X7KÊ%ÖN&Ó±iÒaX)”ЧÊ|ƒU™™~EUHýÍX~ë$ LAK—ªKo[P+©@"f…¥òßÁØ«Ÿ¥ÜJÍŠÛªC¬è•3¨T]rB—ÿ`TQUw›5éàž^.±JµŸÐäÀ,ÈÔ¥…n:ýÐŒW!2ˆà\ê.^¿"î­)gJ%[Á#0'IªM/X¿¸ì,cvzÎÂåñ5hD]=®¼„v© ¥ÕüÎÁð;6&O‚p>ñŸíŒH’8Ýñse‘ù›j[ÀÐl_Ó ÞÌøš¶cî]~ˆÎp|W¿éHH¶ó¡ý'è³jµ-ŠÞã ×—ç¿:óMãÿ€“ò-U'^GK¾¦z÷͘¹›þ”Á; +›1¸ÜC¯.‰}~©­mÖtãá>}?î +0{× ª»ŸŽb¯>´æøµ*P·›Ú_ýF‰s‘ïAt$§WÇ)?®ÃMPÐH§5<Ùqnë ÖT7DtùÌ}—CuB_}Û¥»¥€nºÛƒnwãÏÅÖ21guÈ¥€pvÂÏ—/O(/UõX5K[§k[wW©¸œÑú^·ÿQPB²ƒô}Âȧ}âÔiÀßXgRÄF“·}í:¼õ{Wî¸Â¿PøgFÚluîäz=wIÏ3œ€Cƒ»s²2=ú)CR¡B±Ôé)ÉýËz½|9vÅø·ÿt쬸ýáòâ_Ôr[íå•üß·óO|qÒ¡À?ÛŒ|ù º½úËÿéÙ~º‚’B'‰ÿ„¤!±'*½Rh-­w5ïþü³¯úÿÊì~Óendstream endobj -1164 0 obj << +1166 0 obj << /Type /Page -/Contents 1165 0 R -/Resources 1163 0 R +/Contents 1167 0 R +/Resources 1165 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R +/Parent 1158 0 R >> endobj -1162 0 obj << +1168 0 obj << +/D [1166 0 R /XYZ 85.0394 794.5015 null] +>> endobj +258 0 obj << +/D [1166 0 R /XYZ 85.0394 731.767 null] +>> endobj +1169 0 obj << +/D [1166 0 R /XYZ 85.0394 703.7216 null] +>> endobj +262 0 obj << +/D [1166 0 R /XYZ 85.0394 229.6467 null] +>> endobj +1170 0 obj << +/D [1166 0 R /XYZ 85.0394 201.8883 null] +>> endobj +266 0 obj << +/D [1166 0 R /XYZ 85.0394 144.1965 null] +>> endobj +1171 0 obj << +/D [1166 0 R /XYZ 85.0394 118.9605 null] +>> endobj +1165 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R /F14 737 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1175 0 obj << +/Length 2474 +/Filter /FlateDecode +>> +stream +xÚ½koã6ò{~…~8{»fH‘Ô£ý´»MÒ·Û^6ÅáÐ8ÅæÚBeÉ•äMÓ_3R¢åÑ&Wˆø‡óž±˜qø3³8‹²Y’)¦¹Ð³ÕîˆÏ6°wv$ÌÒ-C¨·—Gǧ2™e,‹£xvù)À•2ž¦bv¹þi³ˆ-Ÿ¿ûþÃéùÙo‰š_žÿa±Œ4ŸŸžÿó„FgoÞ¿s±XŠT‹ù»oßüpyrA[±ÃñöüÃ7´’Ñç¤'§''Þ,~¹üîèä²Kø^Á%>ä·£Ÿ~á³5<û»#Îd–êÙ5L8YÍvGJK¦•”~¥<úxô¯a°kNòOpÉ8š``$¦¨3ËH: +`a\áœÏ¿1?sUEWÔ=5¯Ö4ø±Í7ß Xe€•Ï–‘b™Êâ{Wïv¦êZ:´ËošýÞäGys½5ÍB¤sC+Ý6ïht½-:Óîó•yAái£Ï µU]!ý›C“/À•Ò0$‰ Ëd”±Ë¶»)á*)#8ì)—RÎÛ.o:Ú¸.º--v[Û]×´²ÚæM¾êLÓÒÆñ+Zÿ™kÞ–y»} sMè`M”e*‚„w¼:¦‹N¡æy$ˆ± ºêtþÖ¬òCkú— –iMv”ã$Oæ¹g4NàûÒt¦t›kS;àøš¦Ž +ãù֟韈dDðø…˜÷èWyEƒ+9l]Ý_ŠŒ¥I]ù»súìë†dew?ù½Ñ›"û¦²¨œVÔNðü‚Â8aïeWìK‡'Ú[’OÆ’F’¤ÀUuG;WГ'ç§özX5¿çÈÎ×8Ó¤¸ü©.Ëúº¨64-Þéç¼,Ö?IÐô€–¢7¾)ž€9S#Ù‘5™Aó›ÖYÖ«ã¯Èz•[ohÇöͲ$‰a‡%J’Y¿²þæ`ãr‹ï‹Áwø¯½΄pˆrÅoN÷ 6¥¹w¶]Q–4ÜßÁØß6ÂÙ?jĬ—x*šW«ºiÌÊ‘“wÙíû }Qk¬Ü÷tÉKuœN㨠։ú¥oŸJ¥ÆO»KhUÓ·¬« 8[G´ÄÍ5—G’?AÍ­P°Œ¢„ •B$Š2–¦IF¶öå—½µ©,´6˜9%Á¡Ó`‘ãý¬=øYœÓ7ô³w‘4¥èe/›ªm}ëãáP­F;ûíM»œ²¼b•—ècëeÐ#ËÄ`ý",z/‚cëqͱ¦i¾²F^·-Íß…3¼x|Gû5ŒcE~Ö¶ùg[WnPÖ›áÌàwab]䄹M8Ì×46ùj;¬z÷êÝ y­ÐÛX‘h´ÑÂ-ô–‚;o‰øÈ[>Å “v>Ï·,EdqoŒ¿»ö9¬ð×ö¦î^0¿¦™ùl*OT}ØlÝÙnŒÃ bÞ„ +ù ðjûÆ|.êC{×\'Ò°Àæ>nMY†V‡†â%±7ÛsVS8­¿©‚ÂÏ'Ó ¶ô˜Ýöºšë„°!…`*7Â-¥_L<&Èb )¯»+tböæbS9ªúü4´pò’’³ –Ç ÷ùB¯³Æg·ÖîÃÁü¼8³ÈÛq +ÞÍ'ŸÄŸ¿¢÷‰cÅß«öQxëߦõ_8Z˜†:»ÛÒ÷fYÚ&ÂÄ5^TJŒâZY?€ÅYNÓ?B»x 3ª=q „D]âNð"<]Tk°(}i·ó`T €­Œ`Á]3TºöÙ®‚¢B³3“ ˤ©8cQš¥3§¦Ùó5m ìTèY<Ï.ÇƤx¢Â‡PLª8 +;Q¬€4Ñ·ˆ\wãÝT{à´ðÉÏY“ïvysOpMYœdÒ_Væú0Êès·ýK\l‹Ö†M±q¾VL>œÆ®#@8†(¢’ùÇ[pÆù ‹GF¯PáÉ{ÁFqí£§w=ô p₺v¥;ŽLih×½A,¶ G¾[c¤´>XÔçUY·TÃÞd ƾ•gó÷¶,Áå€;ôc¤Ïoõ€®Êzõë8”·‡«å€èuß_òYmv ò²õ¹ivE•ÛžÈ¸®vWŒžh,\ú"ìh>øíÛÛÃÛ fýÕmûLÁ_òd&’Œ ®ã§Ø’ÌÀ–ðjdKíT# ûµ4ïøâ–1»'-…Ö§åt³2“L¦¬;á,‘ÄÛ|UN§à)‰ Œkê`ZGgÖ]B|¨ò­º`åüZÊ×kAë@wy·ÚZyáv 6‹ý®,I6ÙjEЉm5vT¾•S:Ú·Mënkš¾djï:`¬†ª{²ãy FQj'EOGéOÜ'3%Y¤¸xDf*fi'½µ6uÙ>Ar«ÒYEÛ·s{Ó²S¶ãîß•éùë˜~u3dótmH¦È8 >•jªõj‚8¨R²Xzâ]QÝÍB1@†{žÇðÿ§ ¥€¯²Gd(KA©Z^û°6ŠÐÁµ#ôߧ™ÐóRL{ygÅÈÓUüÓPiDLY¯ææQ†µ{³*A–g1·‡€kP’Wàvv}ÁÉ áu^bWÂ7?€žCñ»ê³ßør›õr*mŠ?‚4èÐö¡êòãùÙâ +8ñR~ŠÔˉ+…41VÑÃÒÊ bá1ý´Po6øþ?'/™@>as¹î} +ùAóÙº|X¼6óP¾Qa ¿} ç,,!ØAÁßÚļ¥Ÿ+LÄ™v2©÷² +Øð²¢zAËÒ@«–x£D3ži +(åuc&ad#ÊÝ8 2DZo3QŠp-øÁ8‘ȶ^1°é¢M#ð»4Î8Êb³í–×?´á©K«¸²Î]‚¾L¡†‘Ù­žþnøSó ú#ÍRÕØ2ù¨ìStÓÄý +ãyÒUà SÉSûã°ˆx6õË5Ÿ=Üžú;ùP"*pOi…í–€eIÊT +H¤fˆ 9"ÕÎ’ÿAÝA¤ÿC9 endstream +endobj +1174 0 obj << +/Type /Page +/Contents 1175 0 R +/Resources 1173 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1158 0 R +>> endobj +1172 0 obj << /Type /XObject /Subtype /Form /FormType 1 @@ -4095,3034 +4110,3137 @@ x 6\>RgÈbÏWÖ¹j[†› WŒÏ¢®{6;»²þFÃÇñ÷ø]š¨)Õ/Ô¬Mu;pk;Ì©Ëdh<åE–ñ¬AÏw³ð¬±±Nê¦ó¡Ä½t•‹ùD„™Â²]°Ä(‡;„ ·åŽ°Š­r²ÂÙÄLûˆ T¥Í¡誋ŠŽt’¹w_ =Î]ˆ‹=¦uSä÷—ä"ï±yl±‡µÃ-ËkHsŠöreOÚ³êvg›<7ºt,‡Ýe—;ãÒèЭ/I…B÷&ê(ýê³ö󻉨YÙ¹Ç,çkRÔšÚ'^ m" ^˜h±ÎW9AVªy­Â©/fýÆ"•œãûFy-Sng \Çdª¼˜©Æ¥†Í}B©•µŒÎ$âw1.¶&Øíþ²C¶O–ÃVç X×9g¹E{îÇ< •ãóP)!ÍZÜÅŸLÞª~ÑÔ'¯UâXLµüc“ÅXsЖõÚ¯½˜Ó’~òBL–§èªÆ¹O¦ºNZ_[Èü.øšŠû*]3QôçÇñ!Ö-žendstream endobj -1166 0 obj << -/D [1164 0 R /XYZ 56.6929 794.5015 null] +1176 0 obj << +/D [1174 0 R /XYZ 56.6929 794.5015 null] >> endobj 270 0 obj << -/D [1164 0 R /XYZ 56.6929 769.5949 null] ->> endobj -1167 0 obj << -/D [1164 0 R /XYZ 56.6929 749.9737 null] ->> endobj -274 0 obj << -/D [1164 0 R /XYZ 56.6929 246.2071 null] ->> endobj -1168 0 obj << -/D [1164 0 R /XYZ 56.6929 214.3631 null] ->> endobj -1169 0 obj << -/D [1164 0 R /XYZ 56.6929 155.5938 null] ->> endobj -1170 0 obj << -/D [1164 0 R /XYZ 56.6929 143.6386 null] ->> endobj -1163 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F62 1050 0 R >> -/XObject << /Im3 1162 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1173 0 obj << -/Length 2334 -/Filter /FlateDecode ->> -stream -xÚÍZÝsÛ6÷_¡·“;%Š/â£}r'çNâö÷)Ídh‰–x¡HŸHEuïú¿ß P”MYv­Îdü@`,»‹ÝýAf# -ldRB…•#m%I)KG“ÅÍ`ìÍ s’8)éÏúñêè»×B,±Š«ÑÕM—!Ô6ºš~Ÿþóä—«³Ëㄧt¬Èq’*:þñüâR,~N¾x}þæ×Ë“c-ÇWç?_ ùòìõÙåÙÅéÙqÂLÊ`=v,x}þö [o.OÞ½;¹<þxõÓÑÙUw–þyî ÿ9ú𑎦p쟎(Ö¤£5t(aÖòÑâH¦‚¤RˆH)Þý«cØõK‡ô'¹ œ[1JRJ$c»wÅ(ìš°Ò:9·7MK‰H…3‰”„Zº1 g=“0Έæ6éÔ%¸ð6)ëÙ¬¨fN70_ôçSC˜Ôn7±¹Í'Åo”ò¼­ -=^ϳ[í¾f³IC¤´ûµRÀÈR ×îøpEŠI“LæYUåå“® xz ÜPå(0Õb±ªŠI0”'Ev¾ç"³ûÎòÙd’7~P»Áð)¡œ‹=ñ?éæmçßî\˜µ§¯C™5Êðt–qÅn³ -E¤•û¬*)Ô²T…êÃߢýe^ºòe›!¡=¼xîÎtÏu1ÃÏ-VNIw{v5ÅcÊßœêeŠú{uÏG³/“)jå©Ä"d¹‚œ0M>çwÏKgNkÍدÇþ«‹÷ïÏN±í>¢Ðž¨‡Õ(;¨F07Çöh”)Â4ÅÜò¥È×ÏÖdpM¿Öòñ#ŠëIô5»"¥üloR¦’pJT_§üEŹµ(­'Í¡”¶¦û®[cðÚBºmU„YF¤VG¸&To#äHYPE · uª}÷ì"<5ˆQš¦`£½Â¯æù@Âc–€:¼°ú -MDÀàJ A^"í`ÑîÚ ‚°¡LÇtÐÕB±¸½‹á¾Œ­Éd‹¨j’oÂÿPâ d]j¾q.Í ÂàÒ€ )˽˜°ã„Qê@[‰üÞGÂSÉ2[,²×dÿ¼ÔÕÄJ†!Ø3PÈ)q•öþë‹Â˜Ã·ê…l:|Ö|ZdídþÉ£üîMÆkõçC$xŽJMw ¾ç@¯ðæ›,‹-4~uï »wÒÝ®ÄLt%·û@å+aï›Þ=Šjšb擽ôË}š»Åu]ì¡V]Ë•v~Z¾ J¬ ýz5ö:Å1§XàŠšñyØj†5´ŠØØð¾A¤°ØävY€ÜaZJ@Ü3Ül›µ¾ jÝ’É»6Ê”R/Só=Åèø$T¥þ©oTðÖMÜ@þ“Ó·M×=Ô8$8^ñ‹º…#êñ/QB(¯ GÙÆ aܘæŒjpÔŪ <®%Æì)’×E;ª¡µ„ÖúŽ ÀieŒ×¹CIø æ6*ÂÆ“(=J œâ§H"?ïÏ~pÐÙŽ«:Ü Ϊ™yÄÖ ‚·ãÚ›ÀKÌEÝ‹œë”e½Î§ƒú¾š‡I7µ›å"§ï:# °º^e›Õ÷÷c’h­ùHÀ-O|xpHª´~n:Z¡-"¡ÀÇ’ÅŠn¸ˆ`©#ÁBŒænÀk¬õ¤1 ½sÜ­ f^7ƒ°ÚÁ.ˆÿ}a^ZC¢Œÿ-:£nµµûtF!U•"Z.¼QZU?Mg=a¥³>EDq èÎXµGg*2*X|ìŸd¥;þ3§Ex§×||þˉ$L¢HR´‰¹q¡Ï 0 ÝUÞ®ëågìU›/o²‰ó ªíG%,Úyš;€m‹Ý¦ëëä¥Ï ÑtPpNŸ]âŠÝ¦,«”Ùçî\9ÈË6–«ò¶yºå˜•>°@CxŸG’+ƒpGЦ~d‰_4©ëÌåÈ7q|=/\.u¼e -3ô"8w? p&°xa|cv‚‹ïk_ŠÀ dÒà´iĪn±q‹•Âð–bVdøYû*- †uÓ¶YU¾Û£¸ L}¦ÿ)e^“Y;o°ï}ØÑ°|Z[>ï«.6>¯p¬Yùò‡£”@˜dMþíà3œ& -ŠÉ–ì6uÒÍÝ®Á:ð°è¼îÞDÙ¡dß.ØrÿKÐþí« ,Ù>•½Ü¡SnD_ÖERHp*F\ÚÞmxÙ Û\ÚçàÜÃÌÅÜ”§ ‘ jµ'â\f”å[ï=ô¯†àì%ï0È¿ûã›ÿs‘Ôy©–›_<—  ‹uà–×}ÀpÅZlù_évûÉ»—ïüY0A` ‰–÷ú& !ÓÞ€«úquØå¶^¶ïMçc¡®"'ŒS:7qàO,›£mÅÿ Ù¸ÂZ×Tvõ,´&šµG+„­etpþª*~'Íh` ¶ªÕâ:ê¬×Ulöɳe½º}H~Ö‰îEÉ¢Ý;ÊÐ?Sˆ”¸ÿ€ø×:Ú[9>õ-6ÿ…VÆðá—¡îf¡Ü™Dú  CRÃõ€èÿÚÄ6endstream -endobj -1172 0 obj << -/Type /Page -/Contents 1173 0 R -/Resources 1171 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R ->> endobj -1174 0 obj << -/D [1172 0 R /XYZ 85.0394 794.5015 null] ->> endobj -278 0 obj << -/D [1172 0 R /XYZ 85.0394 537.224 null] ->> endobj -1175 0 obj << -/D [1172 0 R /XYZ 85.0394 512.8844 null] ->> endobj -282 0 obj << -/D [1172 0 R /XYZ 85.0394 444.1158 null] ->> endobj -1176 0 obj << -/D [1172 0 R /XYZ 85.0394 414.002 null] +/D [1174 0 R /XYZ 56.6929 769.5949 null] >> endobj 1177 0 obj << -/D [1172 0 R /XYZ 85.0394 336.6639 null] +/D [1174 0 R /XYZ 56.6929 749.9737 null] +>> endobj +274 0 obj << +/D [1174 0 R /XYZ 56.6929 282.0726 null] >> endobj 1178 0 obj << -/D [1172 0 R /XYZ 85.0394 324.7088 null] ->> endobj -286 0 obj << -/D [1172 0 R /XYZ 85.0394 175.0326 null] +/D [1174 0 R /XYZ 56.6929 250.2286 null] >> endobj 1179 0 obj << -/D [1172 0 R /XYZ 85.0394 144.8676 null] ->> endobj -1171 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1182 0 obj << -/Length 4254 -/Filter /FlateDecode ->> -stream -xÚ­[Ýsã¶÷_¡·ê:C|ÀÝÓõ¾êLsIv’<ÐmqN"]‘ŠãÎôï.I ²œ¹? `±ØßîÂl–Û©"+,·3me¦r¦fËíE>»ƒ¾ÌY„A‹ñ¨¿]_|÷^è™ÍlÁ‹Ùõíh.“åÆ°Ùõê—y‘ñìÌÏßüøñýÕ‡Ÿ?½~¡åüúêÇ/\åó÷WÿxGo>½þá‡×Ÿ^,˜Qlþæﯺ~÷‰º -?Çß®>¾¥K“~z÷þݧwß¼{ñÛõ÷ï®ã^Æûe¹Àüçâ—ßòÙ -¶ýýEž kÔì>òŒYËgÛ ©D¦¤¡esñùâŸqÂQ¯ûi’,ϸ(x‚’¥¨lV.ÿ÷ -÷ðÝ{ÎfŒeV)ŽCs˜ÕdZæ&rYãò<Ÿ/ۦߵ›Ž8ñ¹/ûj[5=}¾­~ÍsÞÔ}Ý6ÔR6+zù¹+ï*¿–QK‰<Ë Ø.u½®"Aà ÛWZÃ`I8žM+€ï4®ˆ…¯ªå¦Ü½`f^õBû½`C»¡!ËuÙ4ÕÆw÷-µÞTôÜwÕŠzn©¥{ì`j+WÛº©»~Wöí®£þ0Ãt!œš¶9[y’§g‹È} ¼½¯`âa¡çí->û‘khÊmEM]µû½Ú¡tf¸Gþu¾o²(þlØv{VPm ßpka±ãƒ9ÈB.=ƒwÍj™8.2&´ñƒö}½©ûGšBt7~½e»Ý‚x¢ ß±Ep› ÉÌ”/Q˜ˆô~WW¿WÔÒ´ÍâíÇÏãîn¿é½˜Þ¶^&ýOˆ‹ð6æ".2ÉY&½Š¼nŒ`*3@°ßcÝT}‚ ^ ãc±çÁ£´á‡™×5–ôyýæ'úîÚå—ª§÷ ˆWÕÔÍ)}3É4t÷Õ²F „ÃL(‘,À:¨@òý¡ñÒfynĬà*“ÆÏ1_vhLÚx-⌋ñ”Î2M¥JÁ![͆•‘Âûv—b*œLnƒ)p*ò|hø­aâ$ ¤»­At¿ âŒgX •ÎXQè) ÊÕjw‚‚ù]\ÂÆ…˜?¬ëåš”GB¿Êåò,Kä•1Îœq’濯~ú]RK»‹-½9œ2u``$W'´ÌãZžd,çè ‡í1phBʯflœq1žò˜± ™aàã°§+2›ËÀY°»nÈÄ‹K ‘ƒ³eàÍö×ÄT&3 -ìúhÔ¯¹ÊKPà]Ý}wFvz¼¯è¹÷†ÍcdGOoÎÊÌêÍjI6|åÏs8«W$œiQA`Á5ÕÝ‹ós -§rnI’§ƒ–r¹¬î{òvÊ)ö–Í£o¸¥§# _Èþ¥£qD¤›g ©B* À¨–Ï[ê'ƒF¿¢UF“’z‡½z=ñ Ã2  ‚qôgð’#þH›i”>)­L˜ŒÂT‡ãÿZa .Æ3Ë*“ Œ€5ÃÂOɪÌrV¨3²ªAgý—/S.ʳ‘† Ž+²[bÞc»Ѳ6H4µÍæ‘ÞÅǬµ:Bó³A*£F6'$!‡Õ6í²ôË­Û®GêßÁÈöþ¦\~ñg=ˆ—…§RBÔóD&˜41Ë•f,A=àhP@¨ß¥o -%#ãSÓ€nZÁ‚ðÀHÝA Â#ÀJ•>·ÎDÃ˶ü£Þî·¿,÷;ÄXŒ1a A2—ÅÉà¹X¢§ó°“EGîóòpŒUb:A#ÂN–;ØNØÊ8úú•s™`ø+@ü`Ɉª“FTeVëb6åftsƒ?kZOÚM5P40*! _F³ÓÈ™å@˜ÂCUøzf\Œ§L@ ïŒóaå' çÂì ´™ ¨ˆŸøu0¦åGáhj{o~ë®Ûûþ†;p˜†®ã€I£ôêfzÁæþ·^œ/£¹yl{"¨Þ£F•›Mû²/( ÆÉ@±ÈópÀ_ªÇ.m9u!ƒªCP¸wÞ‰°`vÅ"NLÆ›±ËäJP£¸·DÐ0÷ØÁ= b-èàn[÷äãáó¦ôBË Íâìé Xƒ:Èpêh켡›Hpa3=Sœƒ ‚˜ù«%8̸O™`®!¾ˆÃÌmÙ,ªFwR|C"ÃŒgˆ”9ÿØyB$”šÉ „Ö¾QÀ!^¯k/ôäÁ&‹yWoï7þ¯~ -Z™£›f'‹7`e´\h}7hD]˜§Èå¾ -Ù”Çú– -šB„¾A¨‹"~³­Œúzôf\Œ§L¡ožÒ²aegxWi$bÀÅø]T—¹ñìi½ãJ+FgÏ-;£F!pÿf<ˆ3žá sìiÅÐy¦ €‚oGd˜ñ‘¢#vcLä)ŀЫˆÐsdÜÜ5-}¯‚_g¯%ì$§’cД<㾩ÿHÙnžiÁŠtJES*…O©hJ©èùϯþE«v[Ö µù=ͯ>¿¢CrAO’ nÄ}Ù¯©+LçǤÆáw.é¦Ázh&˜»]»¿O;|«clý4øh=ÿØöž;Îi:.m}Ëý¦ìÁ(o;bâýÏûæÇÏÔë)Âè, -Ü$:þÜnJ°³p¢ðâüv×y C q Ç°;•›?Ãëa¹A›ðãþ~S»f>w:d@úh¬Ë¾CǪö1CßîýݹM8öGDiƒ÷ºïªÍ-±‹“ÑÓÊ©l@£¼°óû]½-ðQîûu»«ÿ3Þv¾­P‘ënKYaJ€‡,ŸË§;´ê?¢ÎÇÓ?44‘t¡_ÂU€7öR‚nr°G_oÃŒ‹ñ” lÕ0mqس¡ †j€Õ)sÿ`â<3Jz¸¹Ü[ÈLXLò ]”`ø -c˜I€Û«˜¯æQ˜p1žñ˜Eü†oqÔI0á‚ß`¨œÍfþ®${”} Ííi™ÀìÅôÍ7Ûoœñ̆ÑlÛ¼°ÏØ1¡d ˜ 9å ¸É${B €dEû 7f<³aøÜhðˆ“ ŸR ¸OÅLG[æÄ™MdAKÏêj¹wN>FU'ø¢p7ð ^ô²À_•ñ¢ô¹ªNÕ~en2‡†¤¾ÝÝŒ^>¥ªÞãñÄ‘(ÚÆQ¸Õ_>U[òšÏ?RK‹ùÛšj}3¡:+Y:ûÛQ| TfJLh?ª3ÇQgH†#ÉášëæhUÀíŠqö\ŽÅñçÖ?š×ùuŠß‰;"¢ãœ•gøG¡ãx¶‘§×!n„£©D+å@^yÓî{ê9D”w·÷ñ ô†¬Æ >àG&§.¹NVh\æËžÉËæ™Ôâ ­Ä0гÇyD¦0˜0.,@LÓç ²7¶×½àK#åcï -G%fi±ëåK6J36¿jhHï2Ø·,»ê’ðsœ³Üt-{X»RŒ‘§À“²+”yÖ- !£/_ÃÀM„ØÇ¢šærŠ6F籓œßìý˪­\<‡bç›Ö¥+ÿÃ[™yŽaÏ$F*P‘’4eXÉ>+h !y=pàÞSíGÑ(W¾eí·1àZübYé¼´ûÕè*—Ã=ѳÄêA©Ã¡‰E¦Ü°‘9È<8ô?9’`E²Ø!L`àwUŸ´,Å8/‹¿¤¤ã÷*UEQ( QÞ ˆ‘»Å çxþ‚ÃîU¸öèü JÆK:]XµjèÍßù¶Ðy³¯7=ÚéŒ.ë„Š%ö-I>Kò¾y¼ ÝT›.ôAÒïi.Ch""{ðÔ.CÈÌ÷íf,k°†ˆ('_ îpcÀëù¢LU¥1m'ôÔÄ3ÄÕyq\9Hœ5 –µŸ#7Ŭ¾†íc¤ˆÕëÒ—½~ú’7e?,4uÕ¤ø /»²éÂÝ2c),„vJ¯ø Gú]þtáÍ\úRæk.N‚Ñ«Ú/K6ZœMqlш@åF­ê»º§ê$, oÜÚØ\ûj¦ñ¶:׃NcëP4-üò.ü0Žé×{ßä¨Ã&G¾ÅsÓ…Rž/äv0ãÎâ!¬pÕÓäÛò ‘…ûðæZƒ«›}`®Û®«o\žKx¨-4Uß±Á]1ˆ½ÁM’“„n(Ðnè1€œ‚„h0 öó„_jwAö rôŽª•ÂúbÐË9ã CÉUÜÀn¿Ëñ7ÚÝ¿Õ`x~eLš]ï”K·2•²w‘6 g^t-×Åxi§#Ò;àéÙ!½tcýKÔæ2‚0Šâ¾ I9$QŽM ÎðªÌŸ²-€ŸŒíò¶wAÕˆL §æ]¿†ðWä=CY¹n1l6G9$‚ñu³¬(‘Ú'-”„8TIþ, e†+K …³;Ì”óxá¹:T‰w«·ô¤je$ÈDÀ÷àï«ã¶÷ ÖNIpÔÞ]„¥¹oéI Â_jf/ˆUVd“BGn}¬,Ö+ Þ~³óˆÛ§†<ŠÁâ P” <ô¬ë»µ]ÝÑ+êqWرÂúº2Ý<â‹ù¿»Üû‘¡J/ÐÊwµNAI»;¿lÐ¥ü8ñ„Ag¼¨©è‚š -ð^:ˆó}×í¤K⥛Êé&6iÝjÁëv¿YQ#ZGO vblâ9µ ,];wŽ;éýË4ϬB¬…/{ç|ÚÐÒ·‘’MN–ª ©£U#X ìèWXÅïøÄÚ<¸£ç&®˜( æ™åÑm>î‹@7T Ÿù–(Céï8ÿ‡Tó¡²qï†ùÛ8"œºmëê!.çwù3ì[€+ W9pLí¯ 83ä‰óöî·Œ›÷—•™D=Ñ2J™@bÂUaÀšó7ºdÄ÷!»vI—ƒzÛ°ˆ¿P¦çMEé9ןk¤'µüÔZžPC=ÜÀŠR‹7~e¯òËÔB o]6>=E«ò&üÖ¹Ô@ø%€9‘½ñ,®f]ú[J£¤¼ -—ØèÒÒη=¬ýͬÁ4åÁ>cùßQÊ-ÆF­êÎS<^e-ñƒ`èe$ \/ 'ƪ)ÔÂ1‹¤Šg¤vº0Á/Sâ…Y Â&çdòäœþBÀ]2î‡Cáè_¥¤5“˜ŽA‡ÿ³ŠgÚ -Lò$UÄ„Qþaˆlö«*ù0v%p;Óü»KœQÕm½©Ðø¼:•ZÆJ…©¤d‰ÿê9e¦5& ø‰,«6„ "…»Ååá“ŽIÿ?hPU‡endstream -endobj -1181 0 obj << -/Type /Page -/Contents 1182 0 R -/Resources 1180 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1148 0 R -/Annots [ 1184 0 R 1185 0 R ] ->> endobj -1184 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 404.4849 256.3816 416.5446] -/Subtype /Link -/A << /S /GoTo /D (rndc) >> ->> endobj -1185 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [268.5158 404.4849 332.4306 416.5446] -/Subtype /Link -/A << /S /GoTo /D (admin_tools) >> ->> endobj -1183 0 obj << -/D [1181 0 R /XYZ 56.6929 794.5015 null] ->> endobj -290 0 obj << -/D [1181 0 R /XYZ 56.6929 724.3071 null] ->> endobj -1031 0 obj << -/D [1181 0 R /XYZ 56.6929 689.0661 null] ->> endobj -294 0 obj << -/D [1181 0 R /XYZ 56.6929 117.0915 null] ->> endobj -1186 0 obj << -/D [1181 0 R /XYZ 56.6929 87.6248 null] +/D [1174 0 R /XYZ 56.6929 191.4593 null] >> endobj 1180 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F14 729 0 R >> +/D [1174 0 R /XYZ 56.6929 179.5041 null] +>> endobj +1173 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R >> +/XObject << /Im3 1172 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1190 0 obj << -/Length 2372 +1183 0 obj << +/Length 2134 /Filter /FlateDecode >> stream -xÚµËrã6òî¯ÐQ® -<,Ÿ&ÛëìÆÙxœÓdjŠ&a‹>‘²W»É¿§)R¤,ﺶt`h4ºýB‹-(üØBKBE.TI™\¤å]<ÁÚõó8A‡ ±¾»?ûöJ¨ELâˆG‹ûÇ-M¨ÖlqŸ}^~üÛ‡Þ_Þ\ÒeDÎÑåw7·ßãLŒŸ?Ý^Ý\ÿr÷á\…Ëû›ŸnqúîòêòîòöãåyÀ´d°Ÿ{ -G6\Ýüã¡ë»?þøáîüËýg—÷½,CyVßÏ>¡‹ ÄþáŒk¹x%,Žù¢< ¥ 2¢›)Î>ýܬº­sú“B©¹šQ g ÆH,%iPÆ$\8 Z¡#P¥t™Wi±Í Šø©MZSšªÅá÷æWJy•·y]áLReüÒ$Oƪƒ£ X&Bp¼«ûU‡ÄH,&”Ó-NÇÁ”˜ˆH†^3`NHØÖ˜MÛà ]šµIs˵±ŒŠhiáÂ/&íöºÎ;r/+³9gzip[;Ë85‰ÀïãÜ3mª´ÞV­?7#–Î"!#\3½úk|M‘R¼…E˜ŒÔ ;Z-“4/r;gùÒ‘W¬$Y™WyÓno°X?âZZWVµOÛá"*»AŒ‡~×fSæm›WOäQî$ëWê ª@‚öt,:  )½lr¤!(r!(\w]œiW°ØàìöÅɪnq¦†C7 xz¨Ôò -Îq³æ_I¹.Ì70âùrD÷ú±Dà’Š Wzg±óëMþ ˆ8øÍìÎÙ²éxIüÞÄÛ”‹Žo´“>y(¼÷ÕU±CèÁQUTIé!0úg°ˆQ¤7ˆ¿Ã!`{àØ{OWÞÓ-‹s^~½IÊ2Ù µwfG BJ_ó áÿ8Ù¸ ± ~£KŠ§.mU"&Ø\ÑÅœ.“nL;E è"öŸG$•…½äú„äÿ¯øÆ)x?½»ÙÓ§„G*1! æ/3dÌz’&øiVÞœ2?­¹±ßåÄ´À£3p¶A஡ûO7×ýJ%mŒ9Ìg!U$âÀ¤ä Î0v 7O dž0 žÒµ‚2)jßr™l”òt<âf’{¬SÈq;æÐ4$“j*A4„”SÝáà 3®4¡ûF‡– ZmH~êÐÖ).&ÔöaÒ²PnŸA|UÒ%,Ÿ=“ö ~AÀ¡ –8åÇ¢‚<´?ØèHœÃ3(Š\ˆt¾åÆI¬µž…=Å`HÒ)kÌÔa UGæjñl΋¼›¢ßX“fàM WËߪú¥B0ið‹ -´k®„á‘«ÝNŽï‹Œ+Y]&¹ßïëE€¶UþûÖ¸ÂF¦ª6ÜaÉÍ£ñŒ±¥sM¾¼iq]€‡Žžum¬ÒÁããèóš£Â% -I»²È²3^J e|îédãFˆ4éC–@ cÓ=› :ävÆŸŠ³õ0jÁ¾ü©œX0áÞÜ©NENýX,ŒB\–!/Ç/“6]ùà¢G6“cK‘#Ëðr¬h½Þàvü2 <;êÒ¿’ô¡À°¾Jž ®=Sá\/ À^í*I;Ö€c±§ìEÕª·²Xí«ønìË¡™‹QÒ/Ÿtk[(+ѹõþ½pèܸ(NH™-!ùû}Û †g\;„Æjpðq׆ÊG²þ%j„=VÝöƒO„ñVCp1ת€G£ëV48×m0PºäíîÛd  -›ú -ÄíÔ® -UÕòî*óû¶ëum›"Ó·\‡àV”omU&iPfrF"xLiNU¬¦$%Q²¯%x¡°RRkqŠ”> Åy8C,²¸ýÃéÍ|q%&ÿ[bBÏrY3êËRï'ä€*”ô$ãGéu‘Ð?ÜÉ6èJÈ B´Š†C°µqSˆð ¬`³ta£Y¹f}£Â-x3B<á»Ó×k(Ò0ZÀ´Oîbi›Då¶D¤j[>¸ ®¢–û÷ÏWG6wñ Ö×8Œã -ÉÔ`Yû®Hì¼Ê3`߶nÀî y"3ÊŽ¡>f‚Zh éŒ¶#Jtµ¡íAn>µ"ÈcQŸ¡°wq²‹H³p•Ë{CVG0Rœ†,a[‚1Óûƒ1‹º4[+©å lYÍâÍÆlÔap µ¿ ¿îëüÁÝø­t˜6°“Õžp1wh«}¿Åm EßkûRÒ/$¾àLD!l5ëQÆ·6Åbß*ê§'oÑÿKc óxGcßc -êUÛž -û1ú†Á`𠶿ïài')"=æ…G_'í -wíÃùs¡¶h $48ÚÓê<ÖÂàg[y™»;𸠡/s©ßÓoò› 9n¸3˜•ËŸÚìPåþê{Ó»¹ÈÐíj3³ÙÌñõG'_Qìå¸òÁæ1¶ kw{E¥¶÷œ&ÅHIpj=VÛK²©zCèN¯a§é¦ìÙ>ÐŒdÉ«Çz´-3[OÈså;¨Ëê®?O‡"5>>n$è<¦ lF_õâîŒ7N¶ª¾8}÷Hi¬¸7SbSJmÞ¹Ã)*óõçxËÝNy"6ýÈ£Ë:ºNy'÷–nÇ6èÏý?)à™*fÛ§´—ñÝÿ]îÿØ…òQhÍç ‚FP\ƪcÊr.Ô!çýŸœSÖÿkɉáendstream +xÚÍYMsã6½ûWè¶òVˆàƒˆääx<§fœÄvN“©)Z¢$f(Ò+RV¼»ùïÛ$ʦ,;ÖTmù  4¯×´pøƒ4a\Ùx`lÌ.’Áh~ÄS{w$üœ(LŠº³~¸>úö­2ˬ–zp=éèJOS1¸žþxòËõÙåq$>Ôì8J4þp~ñ†$–~N¾x{þî·Ë“c¯Ï¾ ñåÙ۳˳‹Ó³ãH¤‰€õÒkرàíùû3j½»<ùðáäòøÓõOGg×ë³tÏ+¸Âƒüëèã'>ñ:âLÙ4¬ Ã™°VæGq¢X+$åÑÕѯk…Q·´¿X*&¥Uƒ(á,b÷®´‡]}VZ´s{ÓHˆ„©D¡Kâ˜qË7.‘¢ã!3Ò&“X¦•TÎ'ó¬ióEƒØÀ|ÕÏS&bƒûàÄqþ;ç²Ê›ãH™d˜áO<¬²y>&IÐä:eÑ´4cR/HTT£rÙuº4޴˯²òšš2»ËÑ"ØŽÇl’Hgÿë*'—®7ÃΨ̖MÞ°‡N¸a©ábÐæu`++Y"´DaÂ!ý'afÊå>ÿ©Â:HêÛ }†ÿFuÕ.ŽE:¬K„ͦÃiYßd%¶í°Éwù‚ä0]=].²Ö¹ '„}Ü ç)l4yÛÐø8Ÿd˲m¶ÝF÷Þ…:ªng¹o6mÖæó¼jŸr[C¹-„ÓóU†»Ý@K¹÷ÖžTíñpïušÇc<_´Þ×yä!wí!ìxaF?·¹s}´v3Èn²¦x +üÍ©^ÔW½2:™Àö€¯­ei¢cBÒS1j¢Ñ,«ª¼|Vúƒ,ã@Ä ˜h N˜Ï—U1ò.p¢ ÎõÚš~§yKl4Ê7hpöìÚ+cÁ¸3hOJ®M‹Öó¶®Ùæ\»½ÚÅëÿøJi#¡e÷Ý)mfcMÇoKxÆÑ—üþeÏ^HéЭ§þ›‹««³Sj£Â'í˜z¨‹ò5Õ@7x¬ö!ªÁÛ–ÓÛrWä«#é3Ž[kåð à:8qPàâ”űÝ÷(ëD›LÒ Où›ÀáÚ'@ëXs(Ð6luýÅ5V€®-úû÷VC„,6r™4Œ›mÚüˆ>+®Y*-X­X#;~Qê5Ð\ÉGÀ¯gyOÒ– Ö;¥¬§Ó¢šöxO¦4xšæ!êÕ¥ò÷nn¦à\˜ðʯ¹P ·÷á/Ck4ZUòÍ«ÞÇØÚ²5yž`HK¦-¼ðG!81,£”TœCŽJÒw òõÓ"›Ï3OWâîy9¾E‚ìhÒáëE½ÿ8RÞ‘-FŸÇ x?ϳv4û쪜=˜Lþ¯ïû6Ä9Úß=<Üs 7tóŠ y"F ßšlÚwwœtw(‰4„îÞ“|­ìC×Ãî1”@MSL‡‹]‰…?Íýü¦.‹õUl!½pÓ*ÿ P?qëõÐaJc,TËŠ§Ãs¿Õ”¨%´ŠÐØèžP¥0ß2ävQ@ÜS +.ò”Š™LeºíÖzâaݲɅ6ÙM´©ùŒ|x♑«ÿ7… + ÞãDjþÎ~rú¾_ÁÖ¥†aVIã6¾¨[8‚RÏ,à +TiJ¶ŒÁo Ž¡1ÿðb‚¥óeãuÜxIÈÙc¯ŠvÖÇãLÊ,_'ú !hãnr¬’Ð:Ú¨ð‚õdFàÇ$¢™¯fÄìóï±t¶Ãªö÷ÇB°ñÀ-°ÅŠH¬vZ;ñ: ±„·(˜â:eY¯òq/ÞxܤI³0sº.:©GÕͲ(Û¨¨¾{øÀ 3cŒ„, ùH‰ç½FPÕkc^úõ­ +vðƒ’/¦HÕÔN!¥àUPÌhésiuß4V}OÂ#ôxí³Òß—YÝôVÕÈ ýwy-…PLkÿ*˜ÅXÂ+µ3H)7ßU?ïz´ª~fc…Ù«á5f«;®öa¦°–žïŒ²OÿÜŒ‚ìŠ7ÚÈáù/w1‰è %‘ö¢MÆ ÝË“(ZAPåíª^|¡NQµùb’Áð êû¤Ô†¼ÓÜCÑ6ÂsH^[ðÏÝH%I Vìôœ4šÅ©Ýí ^a6®«ò¶y¾ë„]b†r1O"dA4D#äT7² _ò)Ž­ý…âI_Í +|Jq‚s ÊÈ5}ßqg:W(â.BnüÎè»âUí˜Ì % M×$¬ê–·Dî \Š±_‘ÑÏÊ‘hh´0è×sØf^T½—)¤d앺‡þO’”yJ¦í¬¡¾ b”£¨éƒZ[AïH—žW4Ö,û‘d%FY“Óû%È0 \r]•ìvu´ž»uC6µÃ¼›ðÖ'ØMoû6_Ë›oHö‡#AÄؾô±^‰Å©LU×Ö%æô½†fî¾µÝëðº+¶¹µ/)sO,Á<‘ þˆÁ NŸYæJöµ•Ò;ÅOø–H¡ŠN즦S¾rŸýé“ÿ ;v&žŒl´lê¹@·.ÑGšW¬¥2v/»ýìÂËuþK*„b‰‰12«Ä©ø§"¥$ý´Úïr[/ÚµîM瓯A‘ƒ#!9ï«6ià/bÍ!†¶Žä¾'5ø¿{P”ú] +c˜á©Þ¾‹PaŒm-ã½(.«âOÒ ê jA£VµœßäÎzU…fW<]ÔËÛÇâhŸiâ˃´¯tïûï«JXLáýððÁ^ZùÜÿÌnþm .Viºã«ÑúÚy£Ðr•<ÊR*eI*MéÿUÜU?endstream endobj -1189 0 obj << +1182 0 obj << /Type /Page -/Contents 1190 0 R -/Resources 1188 0 R +/Contents 1183 0 R +/Resources 1181 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R -/Annots [ 1195 0 R 1196 0 R 1197 0 R ] +/Parent 1158 0 R +>> endobj +1184 0 obj << +/D [1182 0 R /XYZ 85.0394 794.5015 null] +>> endobj +278 0 obj << +/D [1182 0 R /XYZ 85.0394 585.0446 null] +>> endobj +1185 0 obj << +/D [1182 0 R /XYZ 85.0394 560.705 null] +>> endobj +282 0 obj << +/D [1182 0 R /XYZ 85.0394 491.9365 null] +>> endobj +1186 0 obj << +/D [1182 0 R /XYZ 85.0394 461.8226 null] +>> endobj +1187 0 obj << +/D [1182 0 R /XYZ 85.0394 384.4846 null] +>> endobj +1188 0 obj << +/D [1182 0 R /XYZ 85.0394 372.5294 null] +>> endobj +286 0 obj << +/D [1182 0 R /XYZ 85.0394 206.4979 null] +>> endobj +1189 0 obj << +/D [1182 0 R /XYZ 85.0394 171.8379 null] +>> endobj +1181 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1192 0 obj << +/Length 4496 +/Filter /FlateDecode +>> +stream +xÚµ[_sÛ8’ϧÐÛ)W ó”Í$sÙÚÍÌ&žª½š™Z¢-V$Ò'Rñø>ýu£” Û[É•HP£Ñhtÿºæ |¡Ë¢tÂ-ŒS…f\/Öûlq }?½àaÌ*ZMGýõêÅ_ÞK³p…+E¹¸º™Ð²³–/®6¿-ËB/[¾ýùãû?ýúéÍK£–W~þør%4[¾ÿð÷wôöÓ§7ÿøÇ›O/WÜj¾|û_o~¹z÷‰ºÊ@ã¯>þH-Žˆ~z÷þݧwß¾{ùÇÕß^¼»Jk™®—3‰ ùŸ¿ýÁXöß^°B:«÷ðÁ +îœXì_(- ­¤Œ-»Ÿ_ü3œôúŸfåÇY!d)2|Áyá´3 jW”RÈ$ABaŒ-×];º]O«ü¬gL´ÍÐt-µTí†^~í«Ûe3ÊÉ–±ÅJ}&i³®¶qŸ °4m Æ1‰…sjŠ!©0®™“¥[nêõ®:¼ävY÷Ò„µ`C·£!ëmÕ¶õ.tµ^×ô<öõ†z®¨¥èaj«6û¦múáP Ý¡§þHa>’¦e.V%+@«Ìb•öïîj B2,Ͳ»Á§õ?ò mµ¯©©¯_ëj^3 ”_úf“âÏÆÕawuÑÒð —';ßÉp¯Tð¡Ý¬3› dÁ¥±aÐqhvÍð@ÔQ Äwæ[wû=(I` +ú½X¤p…TÜF¹r$e"Ö‡CS­©¥íÚÕ?O»ûãnjzCrØ ?!)ÂÛTŠ8=è$·…qÜøiß´Ip]Xà8,²ië!# ¯–‹©Þ¦ IÝðÃ.›ž+ú¼zû }÷ÝúK=Ðûô«n›ö–ÆT¡™ú»zÝà„ÝÌœ"UÂÑבå»SË$•+³rQ:VaÄsl“€Z›·L«Dq5%ÍÎD­4ì²3|œ9¼ë9¡ +^0m?#ÏßZ./Š@i0Êt÷»‰ Q|BJ›‚—¥™‹ ÚlD yXÅ+X¸”Ëûm³ÞÒéQЯ™²s«²®PVÖz{&,hZøþðËWE-Ý!µ”ôæ𧩠£„¾pÀŽqaÔEÁ +0òVXž“õäš®&ÏÅ +ºQXî.ŽzLª²pLE±‚ÕõCÔl¼"7Ê £¤òÿ3CÊVƒUŸŒúiVÁé=4ýxç$^èAðM =wÁ¬ySŒ²ïéIº £âFÙå}³Û¬É‚oÂfŽõià´@–s +F¨­×è\¼—ÓHÊ;%E~Zªõº¾È×i°·jBà ==[øB^ð?zGLz:#K5jOi ½tbÙQ?Y3úÍ2!J*×ÍóD¯'ÓÀQ\ 7ƒ†è#o”Õ梪ri ر„“kKðߪª‘àjJñ\U¹â`œ'~LWUÁx©ŸÐU6 yý:矂ip ZvCÂ{莠ZÎE ¦®Ý=Њø\´ÎRñ$6pTÜv4wÁÔÍT¸´€ŽÁwh&­¯óÍ*)®¦$3*ì±5„i²¹¯B¥ós†Ñ’ß‘ÉHñ &à¡:ϘD ’;gª¥u£w”°‰WÛ&è=E´ÊrÙ7û»]Øä¿ÄcÉÐQó‹%X°*™.4¿;´¢>ÊÓätˆÙ”‡øVZŒJ¾A©Ë’¼-`.¾Ý®%Š«)ÉüE©gö–w“Ç"|LXE½ó™› ž.x®üÁ(aï…ãO £º7$ŠOÈ@*Ð9~*ƒüÁ0¬Ð`Á÷c2R|ŠI# mÐnL™¼t0 ô*øœ7·mGß›è˜ÀÛ¥åÜ1½Éé1–öñØ6挷(Œ"Ù”Š™¦TÊR1”R1Ë_?~øulº}Õ´Ô:æWÌ<¿R†üŠ‰É3K.øwÕ°¥®H.Œ-éÇßù -Ë7^EŒ*a5ê4ýç‹-cÜWŽ,Z"Æò„hð‰»ð«œà…(eÜ3ôAyhnYʽÊÐÑ…)÷rßÖ¹ØDB,Ü£~̇á2Ž¹=tÇ»¼Çw&…'ÉQƒ“6Ëݤ㽦—Ò>´Üíª¬ò¾'‘!äÿ|lþL½# Àä ÂÍäÏÝ® 9; +/Þq÷}@Ð0Æ'z «ÓÌþ;²§~ÜÝí¿Ã<$OG†,hõéwèØ4!lºÃC Ð?µ/¾éˆ¤mðÞ }½»!qq8È ¤hôøég8*J·¼;4ûÊóÕqØv‡æSÊÛ-÷5ä¦ßSZ˜2à1Ëçꮆtæáß045‘u—°_ÆW„?„&˜AˆVªïWS’l×[Töll‚Á€uJ¦ä?˜¸ ŒŠž–‹ ƒ+‰ âR•óÎ œ…uV.„7`²¿YD‘ÞjBð\@܆oqÐE(áƒßh¥¼ÁPvù®"{–z‹ÆÜe…ÀìÃôÍ÷Zl"øøjÑb;Vº§—Ë_hU¦RfG.ùaÁ»?¢þÀ0*¡û~«_­`n xÂéj/é¾¼§S饧õF+â­%®¿£gýg½>z_“j|Q˜…/æPà/ȸ%ú\×—ê¹Êª‚iiq}Ôw¸]Ð˧\%{:žä!3•ì4 +—úÛ§zOnψåG*_¹ü±‚æ–ZßÎø‡NïAÖÞ´þqh]€u’3ÞÏjÇiÔ,ÖƒïÏM{6+àuÍ®ÄÒø§æ?£ëÝ9Åí$ˆù +ÀAç±`^©žCõçÔ&ÞÄx¶¦i¤T#{Õuw¨ôÁÝí1Äг ´õ¹š—&[˜ñ)/÷DF–ÊÈ“|ÇÏÍ+¡>ƒÈ5f3¦E€Hù™GŠô`ÿ zàçUz$í3±E@§ˆá&éTdëÒFþ¥²¦¥œ&d1`"ëÇ@ë@;¾Ö¹ŠFIúÁ3¨Ü 7çôK«×Qãî}¸cØItŒ·sú8kÝÒ[¸È…m±óúØì4ÔÝÒ‰ÅJì[“~Vä~YT¼ßT”.ÍIDù¸”!$‘I<¸k¯bÈ.Qìvªk0‡L‰¯P>·¸0õrUå +Ò˜¯“fnã9"jV깑OW°ÔIÄ®±¤ýÅ)Ç4õ Hì˜BD¬\W¡ä= +4”»)íá ©¯g…ox9Tmo•YGñ ´S^%œè +Û oöU(cn±Já$½i´dT Å/à +¡”›ï⦹mªLÂÄ馅¡‘e&T2m0ÖÌŒ‡[Çr |ìÁâW·ñ‡iÌ°=†&Ï6yîð…Lžž-¡˜¢TêéÂs£÷&-ø€ßW_ˆ-\G°×|-í{Ýõ}sí\2€mi¨òŽ þn‰Dô ~’¼$t‡MvKæD$͘9ƒM iüµKh8¶(Ñ[*TJî†ALç­/ ;zVlÃõô-6HDºsxß¾„¥FË ¬àÊž¤ö{‚å +ô­Ê%ë}ˆÍã䧆³ÆL9ÚŸåHð âPA»±t‹Å‡jó©@E¡I_Å쉳'ç¶E€çàÂÿ=ãâù©TÌ®nVMØt°kÁ÷ˆ}µ9A®!Íß´v»³äÙ¥ÏM»®)…:dM”‚@T+ñ,eÇËJ3…Ô=jb"Ývàþz•áýì=©P™ò#ò݇Ë* ¹ýèµ?%8êèïÀíz’„ð—–@Ú+’•“…ÁtÐLT§§Å…Ó‚W_`óæÃö¹å…†€£d4yÒE%)C=ÛævF×·ôãšz¼É•nzbCI™®óåò¿½Ã<†‘±B/ÑÌ÷×NIéºÛ0m?ä8b‘8)ŸÁÉÿ×ã <ásä £ %Æ$*“瓱^}ð.CFó/ó¸]NªèÐY '£ïº&’»G«±ÎÅâ(œ3¢üFÎÓurpóëXh·üÄÔ^¤–ÏaÇàÑ3v¬YÞTkt +ÐÖÏ® ˜é$5±HN‘³É^6 +»§tŸÀÄëjä`¦ä£L=tç’JÖɹ[¾?4C¸Â[ô«CÉ[·P«Ïüac~595_È3fù¡ ¶ÖVxá +]`‚ëYÚ‘aˆéÍ)ö¤Ã‚íw‡æ«w9øø‡n0²Nð-·3õÄCh– ý{ØÌ_üW£\! +’RæJ,…oþ§ÁIÊ`FP\¨©[( DS¸rYžqÿ»ðœõÿK]mendstream +endobj +1191 0 obj << +/Type /Page +/Contents 1192 0 R +/Resources 1190 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1158 0 R +/Annots [ 1194 0 R 1195 0 R ] +>> endobj +1194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [55.6967 480.2482 256.3816 492.3078] +/Subtype /Link +/A << /S /GoTo /D (rndc) >> >> endobj 1195 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [406.6264 524.1437 456.8481 536.2033] +/Rect [268.5158 480.2482 332.4306 492.3078] +/Subtype /Link +/A << /S /GoTo /D (admin_tools) >> +>> endobj +1193 0 obj << +/D [1191 0 R /XYZ 56.6929 794.5015 null] +>> endobj +290 0 obj << +/D [1191 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1041 0 obj << +/D [1191 0 R /XYZ 56.6929 749.0409 null] +>> endobj +294 0 obj << +/D [1191 0 R /XYZ 56.6929 209.5509 null] +>> endobj +1196 0 obj << +/D [1191 0 R /XYZ 56.6929 183.9497 null] +>> endobj +298 0 obj << +/D [1191 0 R /XYZ 56.6929 147.0778 null] +>> endobj +1197 0 obj << +/D [1191 0 R /XYZ 56.6929 116.7981 null] +>> endobj +1190 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F14 737 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1201 0 obj << +/Length 2349 +/Filter /FlateDecode +>> +stream +xÚµ]sÛ8îÝ¿ÂÊLÅòC¥ÉS·›ô²w›½K½OÝNG‘[³¶äµäd|·ûß$HY²ä:½Î’ €ÀlNáÇæ‰$T¤Ñ\¥‘”Éy¾™ÑùÖ>̘à =RØÇúa1{{+Ô<%iÌãùâ©G+!4IØ|Q| +ÞÿíÝ?7W!—4ˆÉU(cüpwÿ#ΤøyÿËýí݇_Þ]©(XÜýrÓ7·77÷ïo®B–Hû¹£pfÃíÝ?núððîçŸß=\}^ü4»Yt²ôåeTAþ˜}úLçˆýÓŒ‘&rþJXšòùfIAd$„ŸYÏ>ÎþÕì­Ú­Sú“"!2ájBœÍ#©”| A™’Xpa5h„V Jið»> xÛ¬Õ]µNÚ]¶Ùd;#íÛÛˆõ.…ÎCbšXb–@Œ”¾”Âÿ1ûæ\Ô¨$ìül½¬we»Ú fÓîÊjymñ©ÇÄ‹nt¾Óí-œ¤û×5ò:”HJJ¨¢¬“<¹ ùú7JyU¶e]áLVüÚdKíŽS*Qö”ÅJw¼‘8%qÄS@öj©ÌÕ£ŽŒ%2¦føiVpK, táÆ 5;v»¬˜xªwìÀ \B‹wúJÚh}jåU$æÀdÌa +” ö†‹»å‡žvøah_à1]#øG£ö G`ß#n¤$à½é€›‘“tX—xQ3<€"2àõÖ®œÞò\l£P”$ŒË¡5櫬ªôÍæŒNYÄà¶c5iJø%vØá},Ë)Í61`r8IAlóHz¤ÍçëçŸPòš$¨,Æ(Q±0ÊJH"hú Å È|Í_'ŽØ„¿pyV!Pçù~‡`æÖì]r*ƒ¶ÞâÌZ?Ûû2øO$ TWÆõ–û]æ4 “ffíjG¾¬š²psÙ„L‚J"¹òB=—úe* +ÀK¢¨<• +*žÊàïúÐà … ÆŠ€ECÄhaB—0œáä QÔ1wJÁ£rAãiDGo:ª€G_ˆ5$Äÿ5NáI€$N&‹ÖêªÀMc–£3”cJ»\I"˜Šspkí®^7RÀó™˜gæÔn¬6#0Rˆ røsb‘˜I5—qL"•$—ÜØã‡ý Ž4¢ûJW– ZÁ¬O~ìÌë#jÇÐhXØì÷jÚ ‡¯¤Ü‹™¹et%XÀ¡ J˜ q.*ÈSûsÚè@œCBÇsÁÓ©ô5'iÂMæcaG1쓴ʲÆ%‰RO6,–Å”97E)Þ“fàM WÁïUýR!˜5øEš5›¶ð8¨²¶;yP:¤ WŠz“•n¿ÁBh_•ìõú€#SU[> «ÂMƒcuMܵ8® À£§g\Û^Ÿ;dŒ£Ï×.QHêS¡FïžõnÊK!sc|"¸Û8†"ϺЀiÈØ`8’@ù½]enÆŠ³u?jÁ¾rÙNL’poé‚”W‘U?&ƒWÈKãð7Y›¯\pÑcóŠöc˺D–…¬$I¼Áí¸9d ²‚ܯ pN†õUö¬qíQë +ç:avÂ$6{4hMX;ÊNÔDuV–ªcæîÇ.¢Ã‹?& ¤[¾èÖ&9V»õ±F8uî\E)x¬Äªçû|Û û'\;„¦ªwðy×–!v’5F”u›–1ã­FàbÍVç島npÎoк”íám¶Í]b‰z5«BVÜÃ]nß~»­wm3Q¿…P1RFÙðÖV›,7…œ¢Y©ê‚Õ˜¤$5{K ª6A +J[¨åÅ%RÉ )Σ b±ÁÑ·òÅe|–˜üVb"™ä ì=îÒRç''ä€*’'ô$ãgéùHèŠ5F²}Ê/¨É0¬ô-ÆDsNƒÅUJ!n@XÁ<¾Ò„fe K¸jœ!ž8m·¤a´€i÷¸‹BS¹Ùo©Úom€…›QËcˆ.»’Õ’-mü‚õ-·Sq%ט‚–Ôz•ÀþóZ±@“%™Pv +ù1üÔBÄNh[1¢„Ï Ao¼Íg¢V ïXܽPد8 Y‚Å$†„9’ÀCwÄòôÂÁqÀ`^2eIw,>¡6úL¦ÃJ&²³ŒZñZS6h)Ø…Ú]ƒ[wI~ïbÜVÚ3°u©ž°wÐò {´Éñ‘cŒ)ÈVM›®/í'ÄèZ½ÁL×zܾ“ÂNRDz*×}›µ+Ü=Ñycýs!³h 48:Òòþjà?ñ³¯Ö妴—àpBŸ§ÔÑoÊë/\g8)—;µ94 Ê>üå)ËË5<ƒSmB¿«-ôn7Åן^¾õú(ÇuŸ6-ˆ6IX{8**‡!ÄÓõ@Ipj=TÛK¶«:Cð§×°Sû)s¶ 3YÊê©l+ôãÞr\¹>êr€z€ë/ó¾ˆ}º—iCó€³:qÚˆ—­ª¯/ß=R*îՔؘR[zw¸DeÚ¢þzÏC¹ýè’'²~›¯‡|=¸¬³ë„ïäÞPÀ­Ãþ­Îè+Bàÿ±%N…òïŽç`ò}â"emq¡zÍ9¬¹Ì,vÇ…)xL;Î@ÏÙ®ÔÆ&ÍÀä#«ÚNn[Œ‹f€Ýrá +oƒ‹wh¦\é¨"“HejäfªÙ'S9‰O}¼‹é›"R%'ÿhlW» k[óþ5u^‚Ü ö +ê}»Ý·¸¶Ñíª.š7Xkã›Ì­tÙö‚½2Ñkfdã‰Cy1U–»˜\Áºk ÚÕÎÌ·ùlŠà ,Ù±+pb®®òt­  e¥„JŸ1w.9QŒ@¡˜x•v’.)1 €^ëÜÙíª~AÀ\~½w9D¾mj7ÀÌÔ(±1–ìÓŒcŒž¡ rî?!‰ù·n¢ÍF;ßûî?ÿ˜B5&’äLû]ÐjµTy¦Œ’„:å¼û÷pÌúâØ\5endstream +endobj +1200 0 obj << +/Type /Page +/Contents 1201 0 R +/Resources 1199 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1210 0 R +/Annots [ 1205 0 R 1206 0 R 1207 0 R ] +>> endobj +1205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.6264 617.3695 456.8481 629.4292] /Subtype /Link /A << /S /GoTo /D (tsig) >> >> endobj -1196 0 obj << +1206 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [140.5805 512.856 196.7992 524.2481] +/Rect [140.5805 606.0819 196.7992 617.474] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1197 0 obj << +1207 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.6195 470.0794 159.8382 482.1391] +/Rect [103.6195 562.6731 159.8382 574.7328] /Subtype /Link /A << /S /GoTo /D (controls_statement_definition_and_usage) >> >> endobj -1191 0 obj << -/D [1189 0 R /XYZ 85.0394 794.5015 null] ->> endobj -298 0 obj << -/D [1189 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1192 0 obj << -/D [1189 0 R /XYZ 85.0394 749.3189 null] ->> endobj -302 0 obj << -/D [1189 0 R /XYZ 85.0394 679.8163 null] ->> endobj -1193 0 obj << -/D [1189 0 R /XYZ 85.0394 652.1211 null] ->> endobj -306 0 obj << -/D [1189 0 R /XYZ 85.0394 573.4726 null] ->> endobj -1194 0 obj << -/D [1189 0 R /XYZ 85.0394 542.9681 null] ->> endobj -310 0 obj << -/D [1189 0 R /XYZ 85.0394 335.1831 null] ->> endobj -1198 0 obj << -/D [1189 0 R /XYZ 85.0394 307.4879 null] ->> endobj -1188 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj 1202 0 obj << -/Length 3489 -/Filter /FlateDecode ->> -stream -xÚ­Z_“㶠ßO±“'ïÌYÿJê=]’½tÓæ’^6Óé$™ŒlË»êYÒÖ’ooÛéw/@€”ä¥ïÜöÆ"A -@ø²¸Lá'.Ml!‹Ë¬Ð‰I…¹\7éåŒ}{!xÎÒOZNg}u{ñåk•]Ia¥½¼ÝNxåIšçâòvóËÂ&2¹éâëÞ¼¾ùöç·¯®2½¸½ùáÍÕRštñúæÏ×Ôúöí«ï¿õöj)r#_ÿñÕ·×oiÈ2¯nÞ|C”‚'˜¾½~}ýöúÍ××W¿Ý~wq}t™ê+R…Šüãâ—ßÒË ¨ýÝEš¨"7—ÐIQò²¹ÐF%F+å)»‹Ÿ.þNFÝ«Qû‰4‘Êʈ¥¸")Œ‘3 š"±Jª`A‘‚UÒ4]캻»º½#-Ê¡jªv î7Õ¯i*Ûz¨»–(e»¡ÆÏ}yW¡-`E5Ù²ô†“ãò°Ôí½Ÿ$&“dš¤*30çx ž3S9hYž×Â)•-Ö]‹ÒÝöW"_T=RóEIƒõ¦¢Öûr_WÃuº-Í -J;âê×SgÛí©1ÜW4·-fÕWû÷Õý'“‹›¡h§ÀÖ*‹½¾/Û¶ÚEÔ[j‘%&ËÕå2l¼ðp¿/{XR*°wßwëôî±/Ýax8 4ÖTÃ}·é_`O£àMÉ#A#|…¶ ¨}Ò×h -ìí ·ã)õ•…y>“ÚØX¬ËÖ“*n­*:ôÕUD eè´>ÖŽ¯qïÄŒU$©QÞT è]·ŠØJ§‰Í½Iƒ…mGϾÚUköÛûùÝ¡§ÎzÖ¬¸ƒž€Ï¦êÑ“™Z’/Q¤Ú$N+8gI¦Aµ~¢€¹å󆧥Ðó1l†z}Ø•{êSÞ¢ö¶\×;ÄŽBˆÅÑëtvð…ùiƒå¦§ÍM ‡)fáFôMݯ™‹‹}áÍ@ Ñ!"¹’ŽD2na;v= -‡H¿nêˆ$'ÐØÎD¢âœP±ŸN°7÷8h+~©\¯«‡ÁA2_=-0îPMMFNÀ‘ºÂÆ<)„)øDÔí¶‹Åš<ÉEbMjÄ ro­³$SFÌ]ÃÁ?%²Ñß°ã-<ƒ'c§Œ!7a’\ûœ†•Á&v’Ó¤(” !²j+õ¯<Ô ¯nÒ¸äb<G´ƒ=®¹PœvóeÇòŽ[…=Þ*lzÓ×6ÉUnç QŸãCÛ ó7žiWë>¡a“àpc¼ˆ—µkìÔïb³ˆ•¤H2ëóÈ<^vŒšä@å -Ð]’Fâ$F˜ü]¡PÐ^"…<­˜Æ1¤vDtþ ýÙƒ «dê6q(/@¡‹€Îy y˜€£ŽæXq‚á¶! GóÓ¬Èjª²<±µÎ7´L-l¼ßaˆè!Òؘ­Uf‚­U†!¡ÖCOƒä˜8Ë‹ŽÓ܉É\ÄĘñ ¬,) VîÕ²¥Ññ€ÕE¤Ò_9aÕa‰Œó¼dX¿:[H4Zê¹­wd@À¬`#CÃc)l;‡'øM÷èâÎì蹪Ö]ã’€Õ\•Šfhpf…·ž·z.ÏžZc¤ãNϾ|ï®Êõ=¿ë¢”'ÅŽFw%›˜{`mªtA‰^;цêâ:·6Ñ©òŽÔ‹\7ˆÄZ;)Þ‰k€«ÖáùÈ4]ˆ<_¯Ôh•üTàԉΔdI\\r(”6þ"Gh‹°µ*×ï4>nŽtÛÑnx<'€vÉ4; -’˜ÈT&ya—~&[a‹Ë7há¶Àtú,[¼vQÈÕïc€©ÀF*í4Ö÷]G§Nòq’‹wUõàסµyB·ÛPc¢’·A*l¨Y˜áöôøè4À(Áý|¾ ¦H²,@QÜXñM—’ùâïùakUm»P®B¿fº+´àIþ«"`§m–†+ úçò@P™÷AÏ<ìK¬@ºÈJŠ†,²ŽŒ­I‰ ösf (Ôœ™Ïð.Ø~~^q¡4æçš 8…ÒâH¡ô´BPNÈ3-7×̤\œ{Îê!‹b§Ÿv¨s#>³ô駤Gü )åoW¸ýÖ¤¼ ¨#bµ£‚°S€óÎ}Ì!ËZ—‡¢ñ*$­ <² ° © ýqðЬ\m—'àéDà$Ý09 -0sÈèi.AëÆò9¤}kÂé e5ð¬=Lò×å’oŸG\d¹Ø-ÆRˆoÍÒĤG †o¹= -ˆÒ†–/º°µáúØpˆD ;&9^UÌÅúHáÈÕ‡uUmú£ëvS¯Y!˜„–Á{Y™-Þt4ÃglO3ÚqÁ®wP¾ðÕ(WÑ _ìË÷%ê~׬á¦`ÔgDÓ} qŸ_+@³Mu‰àóã´víø¶rJcòš4M;ð•Õ‹HÍa“ ¿é|*’ŠBûIGde2uÖ!‡86wº>úÁMdvAç35C…Ÿ±Êöw. ~ŸÑùKœJ -ü“Ål7·5Ú'}Á¯"´ú‚HcÀÀž¢í¶dÚ¼Œ~?Ú×í°¤jç=U}ô#Í›ª s—QqÏùw2Eš<\{ðõl$a@Z)ĉ+&9¹b’ók$0L’Óë#Ép2 -kî²Úc¯0¹¿C8_Pø;v! ¹(Éï3S|µŒ@x"BÉ_– IJ,Ç÷xc$†âÖ•Æ'Ëý н.ô' &O¾ÐjJæù‹ÛÔ.þÔvLå›p÷ûåôÈ|»4N* wվߦÇÕ×üÎ"‘"ü™vn»é‚£j3y.—¦¬wñ  ƒ¸'™xÿÛ”¨c9\"ós…)ùO s¶J'7Wæ 8Qv.ŸÝCÔ¾*ù¨BK%@¤3‹bñÂBV¤É$Bhï·‡Ãú!ÆE&6×ù§¸xаÞG7 <§æ\Qp¯ ä½ízÈCŸËi;<œ²s*Îe²ëÖå.VBKpA›ÊÿŠøßù˜)ù™äQŸ‰þLz™Ï$ñÁo²á¾ê$Ñ6ÜÝ:VÙ"-¥Ux·]ñ¿$bÿÝT&Á?\Fþi™†¯úÿ÷ÿ:Ç?½ê,Qy.Ç¿lÎäÏòDçÀ„…B-TþLrÿÐç¢ÿ¬@Ùendstream -endobj -1201 0 obj << -/Type /Page -/Contents 1202 0 R -/Resources 1200 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R +/D [1200 0 R /XYZ 85.0394 794.5015 null] +>> endobj +302 0 obj << +/D [1200 0 R /XYZ 85.0394 769.5949 null] >> endobj 1203 0 obj << -/D [1201 0 R /XYZ 56.6929 794.5015 null] +/D [1200 0 R /XYZ 85.0394 749.0225 null] >> endobj -314 0 obj << -/D [1201 0 R /XYZ 56.6929 769.5949 null] +306 0 obj << +/D [1200 0 R /XYZ 85.0394 668.2594 null] >> endobj 1204 0 obj << -/D [1201 0 R /XYZ 56.6929 749.2381 null] +/D [1200 0 R /XYZ 85.0394 636.8261 null] >> endobj -318 0 obj << -/D [1201 0 R /XYZ 56.6929 540.3599 null] ->> endobj -1205 0 obj << -/D [1201 0 R /XYZ 56.6929 517.4049 null] ->> endobj -1200 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +310 0 obj << +/D [1200 0 R /XYZ 85.0394 425.0299 null] >> endobj 1208 0 obj << -/Length 3336 +/D [1200 0 R /XYZ 85.0394 396.4061 null] +>> endobj +314 0 obj << +/D [1200 0 R /XYZ 85.0394 136.3155 null] +>> endobj +1209 0 obj << +/D [1200 0 R /XYZ 85.0394 104.8822 null] +>> endobj +1199 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F41 935 0 R /F23 734 0 R /F53 1027 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1213 0 obj << +/Length 3704 /Filter /FlateDecode >> stream -xÚ¥ZYoãF~÷¯0ò22`1}‘lÎ%A@K”DD"’²â]ä¿oUW5/·í Ã`_ì®ó«ª¦ä¥€?yiãHèÌ\¦™‰b!ãËÕáB\naîë Ék–~Ñr¼ê«»‹/?êô2‹²D%—w›Ñ^6ÖÊË»õO‹ß¼ÿçÝÍíÕRÅb‘DWË8‹¯>}þdôøðÃ矾þ÷íû«Ô,î>ýð™†oo>ÞÜÞ|þpsµ”6–ð¾âžyáã§ïn¨õõíûï¿{õËÝ·7w=/c~¥ÐÈÈï?ý".×Àö·"Ò™/ÏБÌ2uy¸0±Žb£µÙ_üxñ¯~ÃѬ{5$¿XÛ(¶* Péã,J4L¡«ºŽ2¹È÷{jlòU¹/»²hy¢¹’vQP§=uÓkêÖÕäe±¨E“weµååmWZ*ð°ø¦>£À€,9"K¥qC˜A‚à•}½åucòµŒ+ü²sééÝåÕzÏ䊶ͷžò¶¨˜¹®æç®lqëË¥i¤Ò¬NÊ(‹cåveÞQÉzQâ>±Y¬‹vÕ”÷Ži®èÙíŠ;RÆ‘Lc=a'ZÕÕ&Àh7U2嵇œw> 3­ÄâÓ†hx¬O4·Ë -Êi€dLíó®\íhöÔ:1À ¯{(šGšª÷ë~¨-k>´Þ¸YÊÄF6K§bzIG*U†ùévyGîRWûGjy²Ä¢;×Ô Ûž .?ÇSψ8‘Ò©7°¹ -ÈùYÄþe€,ž-¯’Í©ZuÀöuFå[%Ÿ¿Úç@(µýX[î@ÏG¹­jrŒuD2ã D¥tæ» sA:ö6R€"Ðê×–’× TÅ‹sÝüÆæ¹/ ‘ÚÈ€q½æVÊF©íMðMKÛÿ¬”96eÝ8 ÀÞ5M¬ŠcGm¯_ƒ2|¤±Ù0Xç¾­ièžIÚ×4Wnh„ÚŒ0YÃC«-IU&&ÊR«gØ5y¹Ýáé*#k'º‹Ÿ…P`ÀhW4¼lçhƒÖ©åýçj16’6MÿžÌÐS…^|?`á=Éê™âoq”Ÿû"o¹Yoh Z½è ƒW>{jnˇ‚yq@H¢J 0ë!MŽ,öží¹-öÅŠz›º\lÄTûwÔ!*úñ†ž;~Ñøýz"¡çˆäՌѣ³óZw1u„:#3² -lô‚ÃÎé -=¬6°t èþ÷´ölÉÞ„±,Â&ƒ§¾Œæq¤Ó>B îCû“4_Î5 ð¶.º¢9”óxv…-bÕ ¬>Rÿ˜·œ4 ^mLäG&3ÉmÃV¥˜K–M‰ÎyS Ë'Ù0¤Œ'ö¡Ìƒ+Š•6͘ „ˆÞZÉxfV´P#ßÄ ôME“)¾ÉrD¿iYmêŸÈÈêÞäê†)¸ðS®Šj¦l^&ÓHè=“¿&ƒ=ûªmeÚÚ)‚}rŒÅ„PØhKpÎ%.Ø='´HÔÆ̦XƒÅkèËnâòàLÆžÑ*?ëÒfm½"88¹“Ç -ˆY1Y^(14Qo¨Ï[(I©Ä+É91ìÊ –í¸Ê¹žùZjzrÉÆBl!þDIjfð¹>í94€U;räÓpPò4É|U@Tòa…t{Ç– ü?Ÿ)ÅYÏN·.š&d³Y$J{¨hAIl"ðú(sÊë’ÉuÉfÒS— ˆJA³a¶-šŒy 7üfÛwP”ZÓ"¤oøŽÎʘ$h LR:™-úgÕÕš,”I›P3€¢mÕ‚xh?SÎ -CDžU=yØv{òæÊ.NA=Žç-?é±á vË‘a_;Rº¾¦²®§€CÉœ -‡ÍÛáz²a¨Ùžš|Ùk|äبŸgM+8f -h Ì’kP—†Ã`ñH¯-xý˜è"À5o°œ)Æ)® ¨`¦¬;€½×ëÂU¯Š*1WCΈ#ƒ˜ðÇe_ßçhN6áèÍ´Ïã`”•,¶l&i0õ¹*Lý‡Ð­všˆ}µK&2O¥4q.!Ur —yÁt%σc ƒä ³A -“ÂtQ9k‹Ž µ()¿ÖŽz¤1ðŠ†1zÏUÉ -J8¼Ž½€Ò}™Dòî!ÝÚïo&)¡€û,dÚët%<úƒ¡êœIÞÔû}}F(³•ÓãXCøq‡=ô^öv@fdäsä† -[A£ÍPáo4ÕzÅÔäÁàjL”€EŒŠ°fá­^³ˆx¬ÙØöšE´Ë)9·¤Ô1ôMRe—â±åÁ2¶<|ñÔT#!DCå5!åý#¾( -ˆü‘1ƒ½¡¢Ö‘HŬ„´ãÑÀrЬDcT¼xO.‘MÇŽCšµ„Öþµ#\ÍüÝ‹µ„pvð®Îœ“Z–Ì÷uR`-¸%ð²(GÎc(b&,C½—{dëSwCh^Q¿7Q5'¥\\ÏjDFÿ·‡›!xJáI(W¿ºs~eÄ™ÿ:^•†M¹ÌžÌ65Ï4´zFF#yõH®<ÜÚq£G8¾vÂ14È'ÇKçt7©Ïx·œ‡ 'Ñ…Þ“ ë³ºGmÍds˜r|€]¥`ƒ]áÌ3©´""õ`´~@/W!ÐÒ‘”z~ï嶦²ÆšÂYÆ…sÑÚ뇽àa´«Yõx”š×z£‚ÛÝPôn2Mlýý£KŸ»¬x*† PJË¡þ¯º¥Ór@6²i_ î\bf$@±‹îF Pjð–ÑhüÏYan 9µtpÎñŒÛ˜žP l¹Üš«0îL_ ý êùãø¼x@ÔÙ$žÕ¡R9 TŠÿÂ7mŸ 0è\sX;u®(ÓNÁÀøB5ðG¾‚smY­ÂWÍ’æ%û«„ø»Ï”ÄØÒ‘\I¤^g±0„‚v!\‡-KeY_àvV°Ï¶nB÷ÆI¥I_úÆ$À˜ÂßOP4¹’S{¶4@¢:Å›]>ÍõÜM`Óì@ô^Ê—¿ð$㶳ö ÷=¢Œ†Œó#”k¨u°ˆ ÉAYÙ_)^¸?{K¥Ɉ¯®ûê©bÑ°8¼D €¥Tc¨‚ž‡h:è—rXÙË;F uÏ#Þ—&Kž)yb"­ú»1âñ™šWô `}Ä2§e"òÇé±t÷Ž-O¤C«´Ã=Ë× hôÚ}É{©³UHoY¹mæûsþØÒ¨S4Œ9r ^ê²)í­f)µ¦Ü‹2ew Ú¼¥«!tT Tʽ¹y“ÐvšœDtßóM1\¯Ç¤axºÜÎêU$|7Z›¸K@méEP5_:‰_Õ È/SÙ\3ÃǮ ¥RËXã}¶™e—‹û%DZA9ŽŒßŠø-6Ñ4²-ª¢É÷ K|‚¯å|¯™¤ÝúùÔín$¥DNðÆàÔÐð‘?~Ñe²Ó7Œ®†$4Q> n¢ýw hq\xbÿPf"{­6DDì+Hº’Á¤`“Ÿö€ÎF¶†4´þP4Aü& U—û&í†ù¼•Óp˜Š”_¶ûOYÃ×ÁÉ7bw0ûi€L±^SæR¹Fê>ÒÓd³½¤Æíè«~¿~9~áéWý§û"?+û%Ü龜Ԝ$Í‘ÒNHzòó‚~Õ+„<ÝŠ¯€ËHJ”y¡f`=þÊ÷µja¼Œ®êßÝk4ü/¿ä*¤@ÃfwnĽ„–3¼FGàÝ@6«Èý>ý·þ3Yªu ÞB=¡†>OLéâ/F£×BÔ¨ 5¹™KM.{04èö5‰ÐÉ:\¤lW.+<=Š÷¹ÍEšDF+¥J¢\eÊGmZbq 6ï¨f6П7û¢+Ã/u”&qf‘½qîÏ”úÝ¡§ñC[vSf¶M9åò¶e£µ[©|Ì q<Ì v £X»ð÷š?µ>WÁ|Û¼¹c ‡:$gávºÆãÁˆ‘ˆ,„†,hâõoÁ†IG¼4Æ…ÙŠ%ÓÛC×Ó\Õ,ëê$páÖw`bÅ°|Y¼i²ß=A»â©#xCY ·7:»¨¬Ëe_‚­¯°ny»ž3Æk2m­ Ÿ=?‘ÀÌ°Á¡¹äÉtÎz›¾ZêbOÿ)pÑx],«ºêŸn„³“×Éxð…©¹Ávcs³ HcŠ-£pCþVU·d,Öù%à ïzBˆ–dcàÊPˆ +ÄQwHœÊfuµE/@¢`Ìg‚v%ÈOFËá_í–[q3 €-ø¥b¹,w½MÊ`~ñt²Á €þëØÏøDgª.˜8fQ.tÎ&Q5ë6äl²(¹w6±¯H¿“$R¥ÅT5l¨D:èþ±žž^“ñOÊÝ„Ž²Äµ¦ØÂɦGy¹ ó‘eS‚¯/yç¾Úò &[}¼“àîà?Ü‚ÉiV_¶Lï *üǢ¡c1Yxb¢Le'9éÀxtûì š¶Ÿú¸Á¦Ñ4OÈØÈ+ÜÈaÜ£¿À!v¢Ãì,À&)¢Ô¸H2u¹FŽ©`~!`Ü¥uŽ²M{$fCž¨™L™]­ 3‚¹ —NáØê82´Ä$%ü±Ÿ#ÓÀ@¡¦È\4€w÷SƒÅâžKúÁ(ÎOŸ?”òBÎMOlRÖÑ=G 5‘A²ã—ÕªÀL‹ÏL}üõ˜CLùûMj =)°ÀJ‰Pý¨Àíä ¼SÝysˆó‡Æ¢ ?‚*)Irg.· | .«Î]ö“‡íÂV20¶žnC<XÒƒƒ9f!=öÓ®úW( CÜ7Ú[/­g奮k—åHß±ÂØ:ÊŒ ¼ùP qç,Žt|’ÖíC +qâ¥ÖœEnváhÅ5²f‰0NÌå`zQ2ã<…——e¹êN^¬šUµäÁ"ä 6ge:{×Ò +p<Žh§at’x=BÃýQ®¤9G~íÓ_î™|¬ºÞ÷Z}·`8ÏPwø}~­ØÁÉVg¢öÙü9óAð¼dFŸjVkª2¦¬ã↟ÔCÇiWö°Û¡î˜RQ½zì7Øu’Ò ‘ºB%â?±á‘“œÝÀ5x„¡Ð eÊ@–‘¦æåô@hh›óU&Ò|L•¶ë[TjåINq+ÀÕ\ð„18ÈÀiL³¦6+‚öŠÎ0‘ò‚D +ìJšS“E´cSUÞT±{ØÛëM¦¼†ÃxäÅÔ¸uP§_ Å8Ùu¬"e29åÑHGä€C A†ÞÖ5©‹ä†¯Äêa¹¯¼h?ð\]K[À£)4€ƒ +B+Áä úÁ\³RÉñ¥ +þ­x§àý‰ÂZ&õåO'®2—bÂðWä0š–vضã}WE_pµ P’Æfê68)³Ç'êUo³¢˜Š +ûÜð,Y M_ñ›]»åÙöÐÏÛõ|A\À¶Ä +«ê¶ô—(Ûw;~aÏø÷7 DWØÛÑÑBÊLkŠà/M·ÅÇj{Ø:FÎUŒº«“ÖÁ¢Ü*ß?>×Hpr\[‡vÚ²ûÒ §¼¥\šÖ¸ou‚#Pu˜(…ëEW*òÄ-òÙÑ©KV:UY98²©ÖuÁ{7‘C’MÏé«l¼Í*š_¹†øuç 9åxK<‘çºB&á¢/øUÌ®¾ Ðà2ðŸ¢ÉG2Þ¾^#í«¦ŸSÅŠëžÊ.xWGë¦7v~í;—œ£Y?Éïs*¦¸Á îÒvbPð ³o–fâ´›7øb¨omu|¶âO!ÁOòäE†Éò'Wkm ƹ‹Ãú66³?6í‘¡Ü·éø¿_…LÅ•@í¤¼=–û&ÜŒO °iÛ"’B8â@rûP· lÕ¤òR,Û¢ªÃ^!ñäžEâôoU€«Èf&2»”˜â±ÿ1é¬pe¥—â©wAþªè“š'øIæ:ïé@Èa‚[HóøS$éHˆÄéíá°Ü…°ÈÈdIö—6,÷AaæäR_J +Ê +\Þ‡ÔsÌ=’K1­ûÝ9>ÇâR$u»,êP-AM,ñ¿ãÑc<ò3Ñ£>žä3K&zL^Íú–ÕÙ|$1*£J/ i.Âþvé?–Hbìõ%êôÓ%ª„»oOo'|½ºÃn×î¹× f\ýËØ Æ+0ªÀp¹ ˜¶¢Ôì[êñŸÞl@¸Òùº}*¾gþ„Ü|‡= b¯j&o|W$ü]_àsã¾ãRq +aÖœ’þÖ2MÅÉn2¾ÜÐ3|ñêP¤ZMŽ-Ûfj¿â7bb‚3‡`¼£²õ ÐÀWû ÓâCI ‚>)ñqSÙk˜å›4ò:¾ñ‡)ÛafPÇŸj(̯Cße˜,Êòtêà?%#™zoÈ÷jöS +×$qdAlÇ·c”6|‚q†Å¿côqJ@Þ‰âõe(UÇXç¯ ×PRq‰È{4näÊŸ,NZ=5èÎQ=4\Rr¿kp¦Î/ìûH¡ü7îš7øÕ”þ«O•žÛý#«g]=³@¤ÂWÅ& +¿ë=~ͯÝ[G€ÿ^ ;j£i/_Ûay"Á’¸/lïžüQ'ÌÑWHÚ)õøsL=ôpèrÛ$Qžfê´á³/ª‡ î.sÒx¢¢«QŸ@àŒèk\¶±´ÁèРߨMS×,Yú“+Û¹Q³ïß#so‰27l\áŒP~ÖeÑñÐV¸ÊUÉ}ªaWÒ§0|¨>”|× }]¬t„Ÿ¾Žý×[ÿ÷—ÇÃgÙI©,“áŠ%êcH˜(äœÊžQî>Q~Nú`UðËendstream endobj -1207 0 obj << +1212 0 obj << /Type /Page -/Contents 1208 0 R -/Resources 1206 0 R +/Contents 1213 0 R +/Resources 1211 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R -/Annots [ 1210 0 R ] +/Parent 1210 0 R >> endobj -1210 0 obj << +1214 0 obj << +/D [1212 0 R /XYZ 56.6929 794.5015 null] +>> endobj +318 0 obj << +/D [1212 0 R /XYZ 56.6929 607.7662 null] +>> endobj +1215 0 obj << +/D [1212 0 R /XYZ 56.6929 584.6557 null] +>> endobj +1211 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1218 0 obj << +/Length 2891 +/Filter /FlateDecode +>> +stream +xÚ½ZÝoãÆ÷_aäådà´ÙOry÷tIíä‚äÒ:îS4EÉD)R!©SÔ"ÿ{gvv)RZÛ) +‡÷{çó73+‹kÿĵ5Œ«L_§™f† s]l¯øõæ¾¹~Í2,ZNW}õpõåJ¯3–%2¹~XOβŒ[+®V?/¾þöÃ_nïo–ÒðEÂn–&ዯ>~ú dôùúÇOw¿ùûý‡›T/>þø‰†ïoïnïo?}}{³ÖØ/ý Ïl¸ûøý-µ¾¹ÿðÃîo~yøîêöaäeʯà +ùíêç_øõ +ØþîŠ3•Ys}€g"ËäõöJÅŒV*ŒÔW?]ýmDÜÜÇæ~WÕÚWgùd ¡¹ þh “jNö<«=ú¿‹8Ü‚¡4ᄪøÕÝó«·Aœù·ãU*ÈÃø™¬+ 3¸è‹uÛ~ñ>°§z×y.°©ÞûR)vòï#&'c¶j”žæÛ]{ ÆÄlÔ(|šr™|=gØT~¦£Õ5äÍ‘Cµ-}ëÉ7F„ÃÜʯGƒ¼¸^8§C¸ICÆ»ñyÈé¦v ºî2«F„PVχ)ÇØU +6p²+œy&•–œ3ÎÓF«#zUÄ@K1!Ôèc9 GSYÄŒže\8w"Z}ãp<Œ­W=^%Oµž +n÷B1ºÉ<±%ô)ðs—bÈ¥”8ÕÿÍ°tZŽÈÁ2›‚­ÑÒ'—˜iP좻æ'(…ѶAGÔ*rV˜[AÎ@-œs†…CþÆL_(6¾Ü:W¡±Œë±ú/¨ßæÇé%x €¨%šÙĜձR +ÁD˜×žtÔ³IÀy9®<þ!€sŸáe`_þ=;»Ø#WÁn_5E4MIã"ýstˆ¨Ðûž «ý >k̼Â0RΔ1H™4nVB%,Uv®šÎÙ´Ý1BM’2‘ÚF}·Ô:aZò³ˆBàñÛ*&W/c^ïÍ  …¨NÍb¼ÍõÜ3`jNÓÞ{h“·:~ôÓduÔv¦žbÕ^#Ä(H7ï VCÍ„ƒLLJKfÅøž@r8{î˜É +n1•ß¼K§Æ‹†§Ìà â +‡„œâôÖ@Óᾧ•£°ãc´ýHð¾¥Î’gê]©2¦d¢g<>Sðò1ûkwXãôžˆü8¿uE-LDBK´í£¯”ßzÜL StÏ]ÔÙ*ä¶^¹jæõ!?ö4ê cŽÜÒ/u©” +V³”WSâEi²{íÞÑ»ºªÊäÑÜ‚I(;ÏL=ö|;>ý¸ =5.±…ûNÅ*þ4Y›¸ht¤EQÕv©Ä¼ª_&³s͸ôk¤ˆ&–G-ÂÇl=6Ò.ïÊÇ%„YN Ž0ï¸y•ƒMlʦìòd Qû7¹Ðëf9·z>o{˜H)Q‚|.Øw4L¥Ivú†Ñâ”&2d óC”·Elù paÿPf<{­0ä,ËÆò‘Þc0#Xçûz ÐÙÈÖ†>\Š&Ø£ùh»ø¶=Ð0˜è‘våÓ¦˜´ç/힟£QþÜ]õ87ç?‰‹5©¡21#¤)þ€C“Ýæš÷“_|ÆõËé†Ë_|.ÏE*‹ðôÅÝo^‚3yNÄe¦¸°3’.~zW½BÈåiTyE \ )‘ú…‚ÁëñWo_+¦Ëèþ=ؽBÃÿòK_‚”`ØÂÔθMh9§mt> dgµf8güaÄÿ3[*#E >A]PC¿MÌéò?M¶Å¨‘3jò°Ù×™¾æÁРÎøc, H„úy©OꨨÐÅy}朔Æ|œ +=áŸË˹àÇÕÓ×ùtÄ×vÿt>íè­:0tŸyØú©¬éñ˜nõz'_&: ÊW±2sTÛú‚á—®®ÖgÔ‡zfJ€{,+W/Co]³“Þ,×o> endobj +1220 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [173.6261 273.4719 242.2981 282.8815] +/Rect [173.6261 333.9221 242.2981 343.3317] /Subtype /Link /A << /S /GoTo /D (the_category_phrase) >> >> endobj -1209 0 obj << -/D [1207 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1206 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1214 0 obj << -/Length 2391 -/Filter /FlateDecode ->> -stream -xÚµ]sÛ6òÝ¿BÓ—H3B€ ^žÒÔιsIZŸûpÓv2´IœR¤Ž¤âª7ýïÝÅ.ø!ÓŽï27z °X,ö{œð“3‹8Ué,I#¡©g«ýE0ÛÂÚ» É8K´b}{{ñê*Lf©HcÏn7ZFÆÈÙíúçy,”X…`þö㇫ëw?ݼY$Ñüöúã‡ÅRé`~uýK½»yóþý››ÅR-çoÿþæ‡ÛËZŠ™Æ·×¾#HJŸGˆÞ\^]Þ\~x{¹øõöû‹ËÛN–¡¼2Q_üük0[ƒØß_"LžÝÃ$2MÕléPè( =¤¸øçÅÁÁªÛ:©?ÆjB‘œR`”ˆ8IH«]V–¶X,ã ˜¯í&;í§¦]Ûº&ØPÆ™ -E*ƒh¶”R¤Z+·—Ð^ƒF“0_½¢÷uÞÚ†ÆmE_¦ˆ¤O„hìg N„——› - †j@°* ^nl¹¦Ñ¡Î«ñ6âSjPc8æÓÓÉüæ]¾ÝYâf©ÂMu&ÚŸ¯=¯$yøPYå±(†*’‰HCeÆt åI‡ò´UÓxŽNí./·tm§6'’B&A<ÖXGf—3Ï×zu¥ÂG x©0&IÎíÎ2ÒÐmT "…=äÜï%¸`G³X¢«ä9Ž¯DjŒ™vû¥'¸Rt.=âMÊP„”Þ¡“wÇ털¡: ¥3f˜Äó]Öà ¥Z‚4»Ê3^>Ô iæÕÁÖèqiwYK;ò– ä¥ìõqe^;¶‡#ãßïléiø³l A°XB’yÑ 1í-¯‚¹T@Ø4D/ÀoY•X:òY(ƒùuëWê}V {8óñ‰cŒOüfôù%Tai¼‚vMjåXœ†õXf{»õ±œÐ8¤eLʘyɇîøˆ±ÜÄ\Uÿæ'ë܉cWmUŸRʹ í„A,¢$Aõ¸¨#»_U@K¥Ð])9àŒhdMU6/¸•M€kÄ - ~Q*šUF¡0©”,Áò8!¤·¡8BŽäªÚï]ÊÁI‘—î$ ^ÔæïLßcc׎7í8šàC§"cý<'*õÛYtpÚŠ5ÒÚ5³„®KŠM”PR%lÓRºÇi¾«ìÐÉØDJ.‘¾P³&èIìM;äÉ9£ ÿ¯8¾ÏÛÝT=ï‚û‘ˆ‚’¦LêSÂrûÜ€Š]äèÀ;CÀÑÝg -Î,- °Æ‚íª¶~"ñùì -ié“‹ql|,WÀ¸%ûú0 -- æAJ%G3„¯·âñ%̹ßf¢Šð‘i‘UF›ãyV´v!ç5Í8}Íc^´K—`q±ÖR¯›‚’è˱ÝÈI::ÖÖõ¾Zç›ÓYîöU£j»í²ö£ª¼l;è -r -›¯<oð:<|—}îêô0†g-)×송ã - /ºÝÙÑáÌØ»:kì#ýP$ÒHF¾òÁ¦ú‰™ï]Bp/Ø< -õ¼©hÁÉ‚¸N‘¡öATúškÄè¯2lqÔV´ÔXƾ÷¹0|°‹ÀЄøžî¶-Yü‚ŽVžSç*Uù¢%Òs.™R¦UFKz4n“œs †˜pÞ0‘j3ŠvÈ Õ鿳9'ŽSPIHÀ&¡ímÓd[Ë<çå”s[¦ÌÀä¡JA%˜xŽÑ‡j¶â´ v²ý•‘†@‡àó:¡EêsÖðp¬6­Í0À58j¡d98—µ‰°N›ÏÖ¨*2žoP„‘PõÙígSEußÅ!¦ÓQìò¤O³¾ŸÄ¦äo<w]½¬ƒ+¤¿¯•§Œùz t5œaϹ¤¼ÁpQ…1¦T<·¿gûCa. Í²í‹†šìD˜¬èØ€Èäš|Ë!w#‚!¼Ê–ÉxÔŒ¦T(ø4—3GGdEÃøþ°xþ›µ>ÖE=€^tîÁãTj!ÂEŸ¸§ÿ×"UP½_pYëão˜œ;›?i?óðR»?}òªø4Z˜| œ²ÁöÊ!}3ÜŽào^O‰8uåç«ëÄ+߯§ÙØëzó}áÉbB¾IÏ]v‚ƒ3þ’½zD·ÎªþÖÓ5{\* ¾é 2 Æi9jaÎSäwLôðR‹$ìosøªñ]èÚÂñ½yʳ@þDHlìa#[ý¾±õËÓ0Eð;IŸÎ 2¦íë) -O§‘«AV ¢¾¶ã„¡Ÿ³¼Èî -h¸2êbõ¡0¸؆†kÛ¬êÜõªŒUmF„¡?ìÙ•9`<Àu[]ÚuâÓ«²ÍòRL)è}Õ‰0Ñmí³“Ï(ì4ëµ]ýhs\ôð5” Ü¡m#¼ý)4`A -•R hôs n‰$HÎ^=ÿ·]žì¡VÇú h_´xèwœ¿?y¡` m¢ÇÞŸð -™Ìd‰ÀÈ/ti$ùHsÍi&}ÉŒÂA/ÄKÔû64miKÜ „VÞÕp‚½Õd_T5¸7–#×Àù}ßåF1†]êÀÓW¼­*q¶=ÖìšÄËüÔ]ÂÚrªyºM¤I¸}üu6Cï€ÖÑôo¶Ï'éw<êF‰8 “§Ý 5Ò©v: Gˆâyn S—ZV»%äz ®œ¿w7 é©ÀÖ ù ‡œ³\óèYÓ8“ad#î_UG|9e©þæ2ºTsÊÖë׎¾¡±Û> endobj -1215 0 obj << -/D [1213 0 R /XYZ 56.6929 794.5015 null] ->> endobj -322 0 obj << -/D [1213 0 R /XYZ 56.6929 496.5566 null] ->> endobj -1211 0 obj << -/D [1213 0 R /XYZ 56.6929 471.7746 null] +1219 0 obj << +/D [1217 0 R /XYZ 85.0394 794.5015 null] >> endobj 1216 0 obj << -/D [1213 0 R /XYZ 56.6929 154.8032 null] ->> endobj -1217 0 obj << -/D [1213 0 R /XYZ 56.6929 142.848 null] ->> endobj -1212 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1220 0 obj << -/Length 3046 -/Filter /FlateDecode ->> -stream -xÚÍZÝsÛ6÷_¡™{¨<­pø 2o®-çÜIìœí›¹»¶ŒYœP¤*RvÜ¿þv± D9´X_œ™ØX‹¯Åb÷· ‰‡1Š5ã*‰F6‰˜æBfË#>ºƒ¶·G"ðLZ¦I—ëçÛ£¿Ÿ+;JXb¤ÝÎ;cŌDZÝf¿ŽOÿqòávz}<‘š ;žhÃÇ?_\žQMBÅéÕåùÅÛ]ŸÛh|{quIÕ×Óóéõôòtz<±Ð_†žép~ñnJÔÛë“÷ïO®¿ýåhz»ÝKw¿‚+ÜÈG¿þÎGlû—#ÎTëÑ|p&’DŽ–G‘VLGJµ5ÅÑÍÑ?·vZ}×>ùE\0!µMTÌ"­ã秥)8LH!X¢õÓY'BYÉâ™hÃ8Û3‘¢s&"R,VJ¬N˜QRùC©Ýl³Î›G”tP «# ³ ãÉjµ>ñ¸ºO ’kZfDd®ÌÛÊjN¥çul\ÝÔì©è#½5FŽº+þ:)¨(f -T ä^S°QÄxÂõ`#ËŒµ¤í³ªüsy7(ØÓÀ¸Y§M^•$>¬)Ñ«t]çåÝ¡‡Ó˜¹ˆ¸³ö×±T,9xe¾²íñ¼ˆ%pÆ\‰XÁ¶¤H¼äÖ®®Š{·ñÙå Ø -®‚VB¯ Šú'4 v\of lŽÆiMlÍÂQñà ©ó{GmEU}Ú¬jj_9Ï1ÁÀ\A÷HæÕzéÂaµÇúÑ-Òb¾SfEîʦ á˜C[:[l¾L—A#j·Æmƒ½;pî~Ý!}Û«Åc&åàÍ‚qb!Œìçyz^žü«2ȬY§e =ƒ ýwdéé¼î¯™Ëï_­ÝÚ¿cãeð•&‰Dl’„ÅÚDû"®6Í7’qíÊì t»ë~]ñŠWo1%¢!§kbË.Èé–U“χ]îm+¿Ë«Û‹óÿìÙý¦šUÅáuVõ=릕Lédèú«Y™àX½½Þ‡=ÿØgr_Tº }-y ³öE°íñ¼<…d:VƒÊhÀÒ'œ¼è¦\¦Íl®jH¤ïA–éƒ , ·;mŠ¼cʨò!­©nS¦ÀxΊê2׸õ2/ÛêE fEZ×û.Tú ñ¼TœŒ+°*áèR©âa‘£ÏÆ:…Ž0´à°¾¬¨Âo5€v·'X^3aw÷¹{è”L(“&ˆ9¬ŒÇ'4>\öDr¬É>(üV¥c·Y.Óõ#}x eZÔR0Å݇ -PÛT¡\¸¾%kXNF‘¾ Ò2«¬nÙÒÆÝU0¿· ÇÜ.r’ùDX°ü±Uû²ßö™(¥üš•ŠÀÔ ÕÔþa®kRúl¡+Vù󂺺ÉÜÚÀ\JGç`Cææé¦CæaÀ¼Wêí•õ"Òωî‰ -[/7EÑ'ÁZŽÙ"-KwÈ–v.Õ×]ÔokK9gFƃ¶”GLŠ ¡¥kªõ§Á›øÈŠêõ¡Ê!{ÙYÌwìtƒPj@f:‘Lê$ØËUWc8æx³˜ÏHdÔ瀼º ùŽÁŽ¶†YEi:†Ixwä5ùV‰†p/ðåÝM¼š¬eÊÊè%c¶]ž•vĦ"=„ܵUD G°ùuîêA)᪚ 1¨—Û÷âg;áôEµ)²6|¥r민1f}Öúlu„n¢I×Íff?Ša0šÕ2lõ‰­·éqy –­¹~~ƒ - ¿2ð=ä`øýØÞÏ7 (NAĶç¦]€*Ò&8ú±{O _¸Oð±) W×} g+#wø={V'f#øªUH÷ÀØ D-ÒÆ aW¶^™³$Vñ'ˆDë²^±SÈùU‰kñ8жŽŽ{U­›0qÓv$HñC¨¾ø@ L³,äNBÞÉž¤ŽNÜXp¼ËnëòC·[üTH„5*c<„ |„=îËãÊn1FŒ/š¾},%ô“A(·Çˆþƒ¶ Ä5euüÀ癫sê™QÈX¥wa„4 U»ÞÉãšÿFs´J°àü ©d<¡ -jÐúm9 Ÿ\m3­šÛó3íôØ%¿+ýúŒösÞl0ã)æ¸z„ðp++©ÜÔ(ý(ò#LÞaNåٕ؃ÞLOéûê2Sßí¨(‘wg4ühÔ‰žµiNÍOnöi¢å5ÞÆŒæòÆ)Ýf šN/d`tÇ¢îm|2Sê ãEåð/þf¤Væ D’“¹{|Ó+¼‡æ>§ËUáجZÒ(—TžÀQ?ÞLû6ÙúÍšÔšT~1iéšç&Ф½®ë8¾Ò}Ó¤¯‚GJAÖÀdb-‰'Ëë†tÃ,0’j)Iˆʼ„³ µb¼JgŸœ·ÐDÁ— ׈mæ -èe•m -W÷*ʾ…îmw¯ºÚw£~0罧ٕÒwœÉUV1ðñCXZY¸„Æ–ÎJØúì¯äï½Úƒ·7o¿L‰½ìq¤»æׂ‚J³Ø¼è´ÚÏ‹(#¢! ¨Œfá[J>€Gú£ÁwþiAé$(|ÎVY„uhØj2~,óz¶ÿlå=6'/ ļ¬(Pú2”÷“ (”oô¬ºw[÷«Aù(éy©„ -¸i%Q€eü%ötE%yÍž Ú,ªz/|J1Iëzö‡(Mç4¾î„¿­Òph3¼2ôj‚qu…»óç9©Êb8V;Ûò#*Tcß©M2l|WÝÕÔ²‹)¬ -©C¤é½#Ê#_Oa–Nbæ¡rW}:tùﳫ÷'þµßŽ #˜öÉÁ¶‡ésKøMᢥ‡5óÅF}ÛŸá!Ã"zéQ¢´üƒ´mr KÏF,ŠxÊäåÞcxªpªðVR7›Dý¹}cÉdºsT´sö¯¥¢€™xÑmgU46Lk3¤¡2QLŜ̚—1ÉH¶k>ôᦣ~Ü´êÇu«~PÔ¨=õCîŠx=pÆŠU‘æ×?,#‘mz yüdÜäKWm0)¶\SîÕ7P ®jÞøù¡ -‡òuÛΤÓ{FÕ3t,Yâ‹ýèB !Ïù)€ "¤ Öªfæ©×;K žøH‹‡ô±&šfn6ë2ŒfÆçWד¾-¿Ÿ^ãO|$%¥Œ lYæ ²Té7•SìZ¨&ïŽCÌuî3Ȧö>æ++BT „XYÞº -j{$jçÅàÃo97erlª*£¨bbÀì\„δ’>ÐGŠ’¡“A£?MWÛ²¡éî\Ca˜Ÿ†ÊÝÑ™¸ÕG¨ž§yºVT;¶ª¼`LüŒ5$i>ÍÝ„÷iV•?„Ê°myo.áí æm‚YU*äXÒ[}ÌÒ’ -Ñúš¼6+Z| ¢$’ w;`]³>éþìÂEDeOT'®'L¢Žò¾¶óKªµAÕ¡ºUõYÿE%ùØN¾ ¢rÔm‹ &«é mÀò–wß´°GH£à5ප˷!]i·oOçÇEïVˆfœhk& ÌpŠØËÈÐu÷nßuˆ°älót»- -Þ$diö2ªs8E7YUuÞø_½ì°‘ϪÒ•ØZÌ&-Ыj©Û×A$)'§ó‘áÅ:$–pýVÔÖÐdi^í¾@þ÷:˜ôhÍ*}µi2 &Xn(I€Ú€ù&XŒéª ÒŸ×òiÌðàØ]žG9¨vCdûú|„'[mODÐö‰U||ŽR.Ìõ9¯|þØkQéà£Ý½AG"* %m¿m(iÛ@„mãqã% ¨coçÀ•/{g‡I½€cI=c± Ç î>-ò¬E€ð^f‘­ÍƇÄZ$~ æý(k«›Ý¨/ü"§µ¸ýñôÎK -§; ãëpÌí~ð9ô Rìc¹}ò Òÿ¯×v!Z²Hà -8³’~óñô‡§|4ñÿÕŸ¹î~YÀeq¾íeã¹a±L,K‹Î6OE«˜éXîØ:‹ÿ®æ¹÷endstream -endobj -1219 0 obj << -/Type /Page -/Contents 1220 0 R -/Resources 1218 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R ->> endobj -1221 0 obj << -/D [1219 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1218 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1224 0 obj << -/Length 1962 +/Length 2569 /Filter /FlateDecode >> stream -xÚÍ]sÛ6òÝ¿BôL…üÀõ)Mœœ;W·g»OnÆC‹°Å)?T’²›»Þ¿],@‘•(i:ž1‹Å.°_Ø…ø"„?¾ˆbk¡‰V, -y´XUgáâ æÞŸqG³ôDË1Õw·g¯ÞÉd¡™ŽE¼¸}ñJY˜¦|q›ß1ì8„Á›¯Þ]¾ÿùúõy¢‚Û˯Η" -ƒw—ÿº èýõë~x}}¾äiă7ÿ|ýÓíÅ5MÅŽÇw—Wo £és„éõÅ»‹ë‹«7çn¿?»¸Î2>/%ä·³»á"‡c2©Óhñƒq­Å¢:S‘d‘’Òcʳ›³ G³véœþ„ä,‰äb)KAü˜è8I™J¥mGšÅRÈAÛ‚/8g:ŠÄDÝB±˜GÑ nÎA…aåKk:RÈMŸõ¦2uïTÝfU•µ¨`+GF aŠiÅ•åw».ÿí׆€'ÇÚÇÝ,1å#¦œÃ™"wdJû:”-&ÓÄuÓõž5H&ž}U&g«¦~œ‘ &âØ“þ†¢4ÿ˜á¸)g<£ñ„i)’ÑΗ1(÷¿¸h!$ÓèGËÁ0@uGeÑõ¦^6µ_`?Åæ>Ëó–w›¦í<>Ðè[7ÿkc8ôÿ¾õCÜp8»Õç¼ì {Ôàü*>^Õ™¬]­'§Ë›*+jË`î Ǧ¿fÏuÞôÎõ¶z0ídÍrÖ2À×{ç(’€¿Š™N¸ÞÅøl ½5è=uÑóͬΠø¹ËžÌ)Á5,š¥‰âŸ‹È±à–‡Á"À÷qoOÛöœ§î±6r õKlŸMë¦úfeç¡•ã—9}ÊâiÝ¿üO'¦)³1$eÌÜBB¤Eá1ûùXiÁ”–‹( -Y ›i®}Zp=JŽž|9¦§Ü8VÎWÔÑY-É5”ŒX†|êdG®U1±¿ÏX¦‹H¢Þ“Ù4ïi–#¢Ã½ísBÑ ´I[hŽ>AÚ¤­TÙG,BÕ¶ì‹M9ë8aÊ%Ôç<'f©ˆÕ¾çt$gç:EýD"'æFš©¹Cæîˆþ¥èׄ΋G$}tG÷´úç1$z'Ó¤²±DÍÆ´}a:6D¾M¿é'F€‘!tÝ©‡¤{xr%Y"g"FFA·1«nƒEÆÖÕì7bl"¶çïˆ6²¾mcé0!wdOœë×™cÐÛ«qE Òë•Ùcì%Žƒ æIšsÝŽ ôÔq‡¸ã<È3S¡#Ü­›m™œ­Vfƒ yèþ¶5g›¢&¸|$DÝЗ®„ -GºSTþ †z<¢Ñ‚“O¼íà"žrvZ@N# €™›¦©Š¾·¢0¯NwŽ˜—¢, zpe Ô¸LìS3‡ÚÜ„qlj6m IÁ¿À× 9+;²·æL€)Üÿ\“ÊࡨóŽ@RB;‡À‘­¥à›Ñ§,Îy0ò ÄM#1Þð–q3a@—;Éñ’¨·W7à•Ðùô¨ XãûÑ™­ êN¦^Â:4º¶°NnpûÚ4ugˆ Û/iðàÈ Ét}{žÛYÊ…çêˆ:{K!TeumωqÙ.£OÝ´Uæ¸Óa Ò~ôKûÕÚf2áCp¦¢°ÒÂÞU!w¾ª_US_•Gï¼SJWãtn3HÓDCÚGȯ¨°±£©b°sƒÈ!ýQ<ª=ΠX·q·ƒ¬¦ÓR.mÁ3‡îÛâéÉIË÷B ùtp¥÷¦ð0 - çJ©™(P)5ÊÆrñœ•Þz®ÒÇÚàÇ’ÿ9ÑõLµ½Ôp3¼2ýêUkƒëX¡#+î€×ÈP—=íÝÝcÏEnÜ)3úÐ]‚PóH‘&c`”ˆ½|NE²OpëKl›Ù¼gØÁfcêܧ9«·!A–Y_<;:ØÓ -Ããð†ýŒÉ÷µ&ÕݳݛN5Ÿkߔ룩ÁO>ap¨ø$Éâˆä#öN£ïWYjZkñSW^¬@hçÎD2$Í—U%vó¶<Ûº¨¶0S±ëaN¨$u8ˆAÛ!&£áÔÎDŠNC³®¾W>E#4ÃêŽ Ìùu™b~§ÊP6¶lš_·B?˜ÇÆyãLfÁÀÄI︛¬w)}­yÔ¡Ù‘ jö -Ç]‡&]‡VePñµ'¼sL<9‚è8¶&¶ÚÓ£½¶kw±ò#È1¸§ GÌ_Ò»ßýj>À‡9Ÿ6ÑÐ&ïäYu‚šNleùñVÖsŸIÆPëïJ&T·~Y6/¢3Ž>«¦ªüN:ÓOŸ˜&ñ‰ÏW&ëŠò#ÁxϺY‡š'âÜoöNÛ•™Oœÿij—#÷µ¼ôGr>™î”9e7TåßñíÍïlÆP!ÿúç7¥ÿÚ÷7²H'ñô~{Ú6¥…€sƒ{(=¡"<á}kÝtý.øÑ'׋éûvÅË"ï‹ütyÑšUß´.7`"=õqòÈòË–O_×ЈËß±u?¾vîebŸÃgHÂ!ˆþô«ûî' …oÆé‘w ÷–.ý¦ð|êàm'â!ƒî@Ìlýÿ÷Ür»endstream +xÚµ]sÛ6òÝ¿BÓ—H3B€ žŸÜÄιsIz®ûpÓv24IœP¤Ê»êÍý÷ÛÅüiÙ½äÆ‹Åb¿4ŸyðÇg2da,âYLz\ÎÒÝ™7ÛÀÚû3nq–i9ÄúþöìÍ•Íb‡"œÝ®´ó”â³ÛÕ/ó ¶ +Þüí§W×ï¾¹XDÁüöúÓÇÅRHo~uýK½¿¹øðáâf±äJòùÛ¿_üx{yCK¡¥ñýõÇw‰éç ¢7—W—7—ß^.~»ýáìò¶»Ëð¾Üóñ"¿Ÿýò›7[Áµ8ó˜+9{€‰Çx‹Ùî,>“ï;H~öÓÙ?;‚ƒU³uR~ÜcÂÅ„>%@³Ð¾àÎñ@h)|s/0Ðt›…ÎËÐóæE›ÛÑ¿ .Xì 5[rÎb)Iˆt²à½yCøMY×4JŠC³ÍŠ Íj]4Â3y¡£) ÍŽÌ6³d_¸ŽQÈÁx]èÍܯ¿:^/fJE±Á¹Ýj‹4”ðX#Ï ¬ô:ióæXÁdí‡Á, q)ä9 +¥¦õ»t—CŠFw#Þ8÷™/Aè1y×n&®ë &}/²Wé”éGá|›Ô8ˆ@¨š õ^§Yb—÷Õ‚«y¹×Us H³MÚ‘5)‹ü0Â^µ©®íZÛì[‹ÿ°Õ…£áÎÒÕ½®Kð¦W5iQãcÍÓÅŒ¯åúyÇ!Zþeñ§¦£Áq}îͯ·Rí’ÙÃÙC•5ÚîC3¿ ýüêy"×4Na‡^‘G‹ŒƒÑX9ÉN¯XÕßJÅ3+ì¡[{ÄøÞÄ\Y}1“Uf®£Ó¦¬ Îùœ‘t|/dA¡xŒ×E†þU ´DÝ´…KhF4’º,ê× ÜjU€kÄ + ~"˜¸+|¦bÎí –íÄ%†Å2$Ór·KŠMò¬0'I°¢&+íñFuðÛÖzex“†£ >Lp +åËd‰Ø9l§ÑÁi©•H£W–%4]l$˜àâ(x$ëÔ4S\‰!SSn±Z*'BãiBFÆÿ6†©¬FÎ4Ô¼ÐùùúÝk‘,a ¢&A:P‡!x£ ]ÙÛIt¸,Ÿ +l m¨8úKìg–ûºIªÆªš·{+¾HŠ€‰Ï0F^7æ V ØUDæF*‘5ֲěD>ÐUV§‰YZÞÁP”˜_¯iíP¶4(´¶çiÂošì›–”Mô(eàÉ %«¼žÄ®­›!–œQ +òoýÇY³u9r˜ñ:ç~£ ¥ »°Ü¼Ô¡€bç9°È<ëÝ}¤°‘¥+1‚èŠD[|.ºøL’»à¢ ŸŠÔ:0n‰Ã> Œ\K‚zRa½™’ÂSÀ-íøN˹Ûj ‚’pki‘VF›Ãy’7zÁçÍløšm–7K`q±VR/›œ‚èë)½ÝµVtt¬IVÖ»r•­G±ÛU”Êͦ‹Úwu_fEÓASpÈMYe.ó$vë€×ááÛä¾;¨ÐcöŒ¶8Ô½XöAÅåA]t»Õ£Ã-c?n«¤ÖOÔC‹¸zÈ9Cüé'j¾3AÁýÅ@ç/çuI æ.ˆk‰(ðV¢Ô \M ‹ñ*Á2GMIKµ¶ØŽ#ã†vYÐ5Á¿ÇZ¦P”H#`t´pœS)‹W Áž1ɘ" ¬Z´¨G³e’1”%œÕ–H¹ùŠ5È5åé¿Ó'8ŽPAHÀ&¡ít]'myΊ©ûÙ²L¨Ê}ƒH0ð"½!Tl#ÄH ÍdùË €ôÀÇyB²ØŬáá +X­ ƒKpp”&BIsp®•&Â:i"VGŽ½.ó¼|èüÃéÈwí¤³®žÄ¢äoÜÆþ®ØŠt¤©1Â>ׇ”y>šna/iR.Ð]Daô)ÎõÉnŸk# (³t󪦅:9¦tè @¤rI¶e»ŠÁà^EcÉ8Ô„¦”(ìi&fŽŽHòÚâ»ÃÂù­÷öXãõXѱC©†8˜»@µ5ý¿±€ìýʦµÞÿ†Á¹ÓùIýE›ÚÝá³ÅçÑõ¸®q¼ÆòÊ }7ÜŽàïΧƒ„/#lÜ”ëòܵ®#òü¨Ò[]¯¾gx¸ßùT6<6Ù Ž xê§[ï¡nV]×Ó{6Uæ¶ÓD@ôÓbT‡†I똨á¹d‘ßwsøªñ˜]¨ÚüqßhÙ¡Ûqüþä.µäaÈ| ËPØCF3ûLÉP=S#Ä‹dà|Í”§õI3ðÕ]¢ê·¦iC[Â>M ´tƆ¬®&+£²Æ½!Îú:7ѹl‚žžÚme³M[YãD ¶óSÝ„ÖÅTù>4œ@F,àÐEüujCêQ¹Hìÿ’nÇÓ–åpøŒ%À­â˜Ó32½Dä/³›ø’n—ðV¹|þÁ´ܼTºkÛwÚÀe*HC OêÚh Ý!Є•ñå”iôí˨³¶qg˜€´[k÷¶M³–sB¹©}&Ž•|SårŤ˜§•ë̳½æ*i’»é>r¬Ü]Öö¥t±\² +:0M‘)](ƒŽ¸Ý„¥8-€6uUÐc.®Ü¦ÝÆp|Ô¿µ?êf”4þ, }di’v ?°tBÍù}+5»½œ¤Ûñ´š½I<£eîÑg*Vmiùœš/ööÝÿ>ɤ¸ÒEæ€&ßw9õ÷V×M}B¬=¿_'‚c©òo)UD(Ô3)2V jMúBãRɳB}{œsŽ¿R쓪îÚ¥NàV)x,>-ÞãßJ¼ÿ‡Øy,âO#ñª‰Ð£´SéºÌï»'û§ÅûîãO‹¥„‚”¬vµ(æ×øÝ7š×mºÅezF4W`_[þ½¦µ¼,¿´ûšÖ÷”&Ó –·®öt*ÅF7_=$Í3jÇŠI—:µ? +r¦[~Jçi~‚( ¨ù°ìJN~†öfÏF±—~ôîÿ# ˆ˜¯Ô WZµHAà +i¡ÈïÑ'y÷uÜb Xÿ/LN+8endstream endobj 1223 0 obj << /Type /Page /Contents 1224 0 R /Resources 1222 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1199 0 R -/Annots [ 1228 0 R 1229 0 R ] ->> endobj -1228 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [491.4967 546.2465 511.2325 558.3062] -/Subtype /Link -/A << /S /GoTo /D (lwresd) >> ->> endobj -1229 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 534.2914 89.457 546.351] -/Subtype /Link -/A << /S /GoTo /D (lwresd) >> +/Parent 1210 0 R >> endobj 1225 0 obj << /D [1223 0 R /XYZ 56.6929 794.5015 null] >> endobj -326 0 obj << -/D [1223 0 R /XYZ 56.6929 744.5408 null] +322 0 obj << +/D [1223 0 R /XYZ 56.6929 556.3324 null] +>> endobj +1221 0 obj << +/D [1223 0 R /XYZ 56.6929 531.5504 null] >> endobj 1226 0 obj << -/D [1223 0 R /XYZ 56.6929 717.3918 null] ->> endobj -330 0 obj << -/D [1223 0 R /XYZ 56.6929 594.9189 null] +/D [1223 0 R /XYZ 56.6929 214.5791 null] >> endobj 1227 0 obj << -/D [1223 0 R /XYZ 56.6929 564.805 null] ->> endobj -334 0 obj << -/D [1223 0 R /XYZ 56.6929 340.8686 null] ->> endobj -1230 0 obj << -/D [1223 0 R /XYZ 56.6929 316.529 null] ->> endobj -338 0 obj << -/D [1223 0 R /XYZ 56.6929 259.8095 null] ->> endobj -1231 0 obj << -/D [1223 0 R /XYZ 56.6929 229.6957 null] ->> endobj -342 0 obj << -/D [1223 0 R /XYZ 56.6929 197.042 null] ->> endobj -1232 0 obj << -/D [1223 0 R /XYZ 56.6929 169.8331 null] +/D [1223 0 R /XYZ 56.6929 202.6239 null] >> endobj 1222 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1230 0 obj << +/Length 2985 +/Filter /FlateDecode +>> +stream +xÚÍZÝsÛ¸÷_¡™>=W±ø"@æͱåÔ7;µÝ™¶w÷@‹°Í EêDÊ>ß_ßv!Q +e6M2“x&Xâc,»¿]ˆOüñIšÄLfjb2'Œ'“ùâˆM íݧ>ÓÐiÚïõööèoçÒL²8ÓBOnï{¼Ò˜¥)ŸÜ¿D§?ùp;»>žŠ„E:>ž&šEo/.Ï°&ÃâôêòüâÝ?¯OŽŠn/®.±úzv>»ž]žÎŽ§yÿþäúø·ÛŸŽf·›½ô÷Ë™tùýè—ßؤ€mÿtÄb™¥Éä>X̳LLG*‘q¢¤ 5ÕÑÍÑ?6 {­~èüã1‰œLe«$IO‹S0˜–HÎã,Iögri€“qg’蘹9Á{g•ŒS)“‰I²XK!ý¡üqoWÇ<¦eícdo ˆÆ$ÊÀD®ïšÚ¢H»U^·0²¥ÏGªoíê øyº¤FÏÞÎmùTÖñþ)(8£µ˜ôÿe‘*%hˆ†:|M+³Œ%c2V&ÖÆð]7ëî ¹µuñºx{ëþžÅ+EÌe"ÇÄ+a[‚g^buÓ•÷/£‚½ ò»¼º½8ÿ7ÒK0M×Ì›êááªÔ÷.<=S&Æ„'¤ÛVê¥2¯J[kå”Óܶ-¨Ê®¹Ç’Xô.ûïkÛví+òì-ôkÉŒš1ŸeOȃòԚŊ)5&OX[ʹö‚Z׋¼›?ÚbT¤ïA–ùƒ… œp·;§ÐŸD;S kÁ!u¾d,ÁtfJP¯çœx®ëü®²Ä¿Á²°]-Ê:TÃ¥~°kg#aÅDíÈ[`&é´} –Gª,º÷T•P^PJÔw]UCâá± ÂyÌëÚ¾b‰ûWòË®ù7µÄ˜+•YbÀ  ZâÚvÏÍêã¨Ý¸¤~hƒ—v•weS¿bmû‹ùŽ½—+¦²1c«ƒˆ‚‘±]p3F%vö†³œ£ÄpÌkâÚ®ã{–X»D¦é˜¸œí`|¶âš¶v¾^•Ý8b:Y‡'Q‡¥ ÿÇ\ë1Ô¯¹Ž¹aYÁæW%¸÷1)ß,íÜáW/·ç­uŸÝÇf]‘üï¨ÃÆYySÙì°Ô•‚ÝÏWÝz F_¥À gõ`εúèÂ_3àï´Š…æÁXÞ Ä¶Ìð )Áì{ÞÞɒDZ”"Ù]ª%À"Læ¸óÝtæ÷‰À>ÖuØihÂÄB‰´·À9°B81£‚_j–΂"ïÇÜðŠÖÖ ‹³T¦»À ÐùW[ Šà `äW¤[‹'À}†:<îe³êhâ. D<ñU_|ÀæECZjpwr`~ÇP—6àvw68|™i¼Å®ÅOåZ£ÔÚcLêÐtØyYZ‡»4.ö Ê…€Oöv Ü!úÜ&×εxðyfÛGX2–ùqȉUkñɯ,a?BD¥³JÚa£ÎáES¬À†Ä…›0ŽS¯ÐŒëƒæp~:Lµ_ŸNüœ7:š]Þ ­ Ñ°‚•ÕX®['}¥<‡qðî±<»ÂÒµÓ›Ù)~_}tq솫“ȶwvÏuà¸N)ûæF>ÚùÇMxwV¶î68—xá_×å:ÄxÇTÿ6²ýXÃDÍXä.*øñ˜ÿE‹Dê7ÇS.š»—7ƒÂ{~ŽíùbYÙxÞ,ËÅ%–'ð©ofC›ìOýæ Nj>oÒÚv‡&⤃®ï8¾Ð}S8¡T ÎÇò. +Ö`2“mÍëb‰f5îå.j9Z}ò;— óäÖËÁ‡„=EfB4ÜßQkÛ,,ÖÜçeµÆŽ‡aFs_ fg¯f?aF>1>vO!æ4^ªEÙ.]L=©#Þn)´AYÖp¨–GË|þÑzs-)ø•‚,!›Ä#Ћ¦XWèü÷oÛ†ánòêfÉ,·&ò¨Ãg¹Ò—ÉýÛ^'–Å`sÇйââ~輨açóñ“$G°Çoo.Þ}šÐüD°¯fˆûkþZ·D&qª“ϱ~aÄAÑJ#c°£–Šh3 y˜fŠÚ;n©~Î>•‘¾·îHã]K ù6Ë•E‹²7µC‚kŠÅTbèç¡v^4©îßšÄÁr¡Ý…ž7Ov€dÆ}~Æ•øTæ¨ ¸h5R€&ýötƒ%â–·Ö=6íÎSyõ¢ÂàüÉö6ÕÚmè°ÒôOãËNøÛ* Pš«±û(usÎɶÚÊ>øóœ6u5-Ÿmú;\.#?“| ´YôsóÐbËÖßüPù“EÊÇžrYV8‰9&$¥;ܽü×ÙÕû“ ÿò XÝŸ§F¦çHñvã“„Ðo£¾íOz†2?Áüð ¤mBÐ7.=£b¥X&½kw& pT1zéj»õRn^È + ! +Þ¹WT´wö_KE!žŸåýiÄAåBÄàÜFUTdâjŠ—ÁgL Âéã†ÍGŸL÷ôé , úu¤@íèŸëÝ`_»¸Še•—Ô×Å=ž(ÖvÐîxŸE]¹°€ýœ]……474` ¾ê¾óóC•cåë6ƒQ©w¬ªïÐ3e™í”öÎR¢ÎóS$(GA¸ÛÒ/s¯xã(Œá#¯žó—iœ¹[¯j⦣ó«ëéЖßÏ®Ýï„D5 +"ÇE :‹•~SP9Cщ¾i€jtïn0…ÍPgÿÙ´Þɱ4œ{ #Æ;ˆ´hꨒ¶ 2Lç\‚¢½q©3²«RR:Ç |ÊÃy^#™GÝQ“×f)A‹A”H"ä Û6’î[KÑ){&{©TÁLõ„˜¡Ûðµ5Ø_Tu¨%U‡ê êóá‹Šò1½”£Î¨› ¦mñ ayÃú‹ne²XTçÝz³|Cc³y4ÚŸß-z»Bg&À‹3£`f*|')ŠH×>Ù]ß"Éb=D`›VP¢l'©}§h§Ë¦-»òi'¹í[¯éJª .fWÕP>5U.ÐÏÆwybÌN25 ¹NxFo»`»f‰T‡KÌ;zluî…ʼnd{ï»íÚ=ݺ¬U0Êøò\h~5Ù}(Q—€ ]r Cx´î+2ÙOLàuyhQÙî2=h-ábtHúÄt"ãÉpW ïÊÔH»3ª%û¤eyÿ2hQmÔöÖ9ÚqB*§·­P²®ÄmAÛvÊâ®0–C¯r18;Lêœ +™òm4uOyU@Â7=¬»ná9…2£Ä„ÜP÷à m£Ùý ‘~ìõp4¾õq¯ã}Ìòe8h ­¶?žû5žc˜Ùû5Þÿ7*,„ë _¦‰†nøŒ~Å÷ɯù„à±ÉÂQu¿=Ȇ~óÇ&£ †ÿõ†ÛŸ_*Ë4íÁ;ƒé8™q8V¹çw§ Šïc"Ó8IŶ[oñÿÕ¾$§endstream +endobj +1229 0 obj << +/Type /Page +/Contents 1230 0 R +/Resources 1228 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1210 0 R +>> endobj +1231 0 obj << +/D [1229 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1228 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1234 0 obj << +/Length 3540 +/Filter /FlateDecode +>> +stream +xÚÍ[msÛ6þî_¡™ûpòŒ…øæ~r§çNãô·s3i¦CK°Í E*$Õ½¹ÿ~»X€%ÊRr¹»$âeñ²Ï>Ø`1áð_LˆEiNâT±‹p2_žðÉ=”ýp"l™«4ók}sò쥌')K£ šÜÜy²Æ“DLnï¦ Ø)HàÓ篯_^ýðË›‹ÓXMo®^_ŸÎ‚O_^ýtI©Þ\¼zuñæt&’PLŸÿíâç›Ë7TYß_]¿ œ”~ö}sùòòÍåõóËÓ÷7?ž\Þtsñç+¸Ä‰|TuÞfmþÉJhtýI[ÖqPÙ6ÐHÚÎ#Õ(äu +Ùf Ð鲇Ũ^ i¬6¯€áÿ°]ä%Œw C«Ê¡LÓ|]74ê.«©Š5V·ch²vP 𣞢o„÷Ž1t$cám¥K «îm…UõÁ¦òúói‚ÖýN·Èdh¥`Ì`Ó­£g¼5NTö ;?À”Fˆ¿h‡s‘HÇ9m¾„F¸¢Z·Ïšõ|“¥¦ïÕ2ËËsOúY­ï€²â<€dÓ¤Ïã³õcø=OÎP8È9ÏŠl©ÏùY Ó©kHÜf h°:gÙâ–²î`Dڃ䧬 Ôû§Ø)î¼”YÀ#cþuƒ@à±±.ʾõ·BY@C•yUÀA^þ@ãŠ3+"£ŒmvY„”G&Í ÷ú-©÷…•o° Õ@Oè¯øºÓ‚‡ÕQ"½)»^Jì?Œ“ƒ•ÌL1W¦Ì +Êõý,¤ cªÐ®a劬€]sÁj†º±©»^SÛö@CÞ˜2@±CGc>•ã·¡ò1ð£SGã½)Œûžq&“"a2£íû•ÒÚ©Ùº©Š À!D:F”ÊÛ±0»[dü8‰PÕèÄk  +>\cK‡µ%­ +俸~ûöò9åIä ÑÆITnÌ +%ÁòÇlÛ˜£Ød&-¦IcÁæA—”*+*î»±MAörÕÒ‡“·ÌC-ˆ¿®JjG›Z@íËnÄÖ¹Á*C–6’­4ÄÙl 0žóÀÃéŠ|ÛìÖDs«í&‰R3®U ìCY´ë5¶Üñ~,ªMI)ãËÀﺤrp-¡3#ø,t¶ ߪ ¥Iö“øŽ>r+Nr×µ1R6¦©NÓ°d¾ +Ìã6‘ál1§¬¬mÕ„›Ö`/÷)2AÐÈAÊ";QS]Î ˆ¢”o¢øm>®û¸¾oëlþA·-µÖÍô)ðd'ÀßÌÜê‹Â™I"-O&Ò¹Gv,ä ‘HG¯³±•ê8WÅnÖÆ ’>\F³J]øb¶°±øi!p‘*Ú².Ô‹›¬r{‡BoF¯È|!÷Ϫ´Ùvó0)= MQQ*½øsÀC¶‚(¾ó÷’7.®³4~(¥®Mç(zNùA–£|m{:èæÜYçzš³“ëÔ Ý§f½\fuþ§‹•òrK‚ϲ˜ÖÅöÁ¨€³H%Ñ1‡0Ö–#†§0_ØÌÄCàÞ1P;ÂlÒµŠêÉO %UwÆ3@m$`î"`v‹ržÖvÁ­`AÊ¥o§Ær½¼ušrZ´‡FT3÷Píræ<Ÿ…«LÈZß?¢°îÙË’î9fWÛpÈn+”ØÍc;€r¿öÝÁ +6îX +[5mï‚;˜£ke£¡Å°1E¿kzBàQ\(¢‰¯¥ÿLñca˜x¡ãדL#`¹DîrEœÀd ‹@¥ÎuBw}Ìo* ££Ð4œºƒQÖT[çIT¸¬ÚA<Ú¸ý¬µËéA’°€‡êR#wt…dºÁþÔÈÌäàð!¬qdGÌv‡6D‡!_UM“w´Í:¶ËÛ3Ǿ+?¿*Ç»7YtìcŠ«í¡(çbtdü/ºßað1:eIÚð}Îbîµ_Ùn¾& ã©PœHñ´ÝH€›ŒRò¥lp;zr¤ìSé1†ÓŸ(\{”Ep3ÑqJG*Ñ[oY‰qÀ’ N(1Žh($GÉúé# ”býn!ŸT¢•â¼ž¼œë/ÚQÝùRæ6/ßòŸÒ7ñoysŠ8KbpcFõ‡Œ*˜È¬'Léæ O‹Æ,,†ùò£tSl1áaSó¢ùÃæ¦"–p!¿xºØeiçã ÇáèþVoÏKç½~û8<îÍKDî»éN‡Ýn;¨HÇþZVÕ‡õjèËãkúW×~±°mÝ2ðé³F÷ÛâÅ‹ïqëü7í»m{”5píæ&`zÊ<˜}Ël¥–Š8ÚÃV)ã*‚É„ ¹¢°ŽMGà,‚šÇ؃‹K`¬f[ÝŸãÁér^­ËÖêo+Â8:ƒ=îi{’¥'ŠG_lO¯7îüÒyRóù¸ùo;ŸÃÊ[Ç?[!Äqß íòêù«ŸŸ¾¶Û{†§0ïé[ƼŒP…êÀ­8žíÕÚëÑ‹æ€qž¬KýÇÊ#Óí+zËMÞ˜@9Æ÷Ž q®Ýží)  ®º3¤m—}`½gwûxQO[€LS~]çÏÓÙ·ì\à?ðX Ó aa* [tá4²>",Š•[Ç—Y^¬­.†4gŽÑz¢{ŠL¼­q÷~xÔµødF‰Ï§Â=‡m°ó2J ÉÝ{ëüÐÆ°;çXMWУ‹Êͽ;°~È>uŒú¸Ç‹Øº?{ +¬ +¾e¨.OžùIÑKslïDÇ€§9i¤ö¢uxä‡tòùˆíN†·!‘9jk³b?ßí ê?;?Üoe¿epÁx +U!˜I¡ª½ +¥«„ÅBF0~¹dUû+ÞBoÝ8íªmèŠð+÷[pÇ E¾Ìw‚Ÿ=Wx8ο ó‘[7äF_,ÜI\÷"'[­tSm½à€E"dI†þ]ô {ùj@îþ.P‚@°/(fAÄ„ §Â½Ýy®U"L)&}¨4<¦¶F`¯ÂúWKî¢. +ûWK‘÷jɾ©„@ü§EÙr©wT£È›V—³ªt èíãêwãÔÒ+ÆUU·]>~¼§¯ïlù´aŒQÂfÿë;÷9bÓ¶ƒO¹Þô©ßqhÕè¬vÏCíìÈçø¢­Ý‰ì+>r̃å-UkuAÞ¾ßfìí¸=øG/#íÂ'½ëcÿ¶Æ{ShN‚q¡s+ì p^*عû#œÝ¡ÿgH[Pendstream +endobj +1233 0 obj << +/Type /Page +/Contents 1234 0 R +/Resources 1232 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1210 0 R +>> endobj 1235 0 obj << -/Length 1102 -/Filter /FlateDecode ->> -stream -xÚ½XKs£8¾ûWpŒbyjN™¬“ÍÔNf×ë9eS.„QYHŒ${ÿ}…» Ù§»— çÈ#§+¹-Õ/ÀÛ˜ƒG(ÐéöïUcÎRá8FÑ°Ú¦-Ïê¦\³Û ŸÒ°ûT* -¢ð‘ ÈÑRý A9h×JÂØ -¡æù\¿> endobj +326 0 obj << +/D [1233 0 R /XYZ 56.6929 769.5949 null] >> endobj 1236 0 obj << -/D [1234 0 R /XYZ 85.0394 794.5015 null] +/D [1233 0 R /XYZ 56.6929 749.9737 null] >> endobj -1233 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1240 0 obj << -/Length 1162 -/Filter /FlateDecode ->> -stream -xÚ½X]sâ6}çWø:#U–mMž²)I³ÓͶ,ûDƱEâÆX¬-ÈÒîþ÷ -l° Ø&Éð€-ù{t¯t%l ýó Å 7lnB†03¼Yºï¦ƒ³oÀö#Püêðóë5µ ¹E,c8-`996†þ¨kA{u¯>ß]ßÞ|\öl³;¼ý|ׄ¡îõíýôéfpùéÓå °Ãp÷ê÷Ë?‡ýAÚeenï~K[xú÷è Ýôï®ú½ñðc§?ÜùRô#ºvä[g4F†¯ÝþØAr‡ÏúAÌ91f“QÈLJ·-açKç¯`¡wcZ©FP‹Thâ‚€‚ÒP6ãТ„nõ€…P× Cù –HV‘zI¤íÿeݾ‹$™Ì\å=N QiûÏ‹ô¼B³CÎ)B߇®÷ô(Cñjˆ‹D€¥ þÌe¬ÊT×-§ñpÉù¥ üsZ¯‡—1´^Ïçõ×"2J_G9PúÌ'ùËøÕ¦n7¬væ}Gþ¶ñ -$r{Y$þÚ -ææd=Júöcƒ‡m)±™†…¶IÍ ê/iW6N¡CcáMÀ– ©MÌJýs‹ƒ<ÏÆÆ:ÿmÆéØ쥱Y>vQ· #œVÇV*j-%¨ MÇ4›³Ii˜š”[•4Ú Rg2Š‚ä G©á—Bg·ÕÑcjÆmH,Dh–2r¤úíÅz×è±NEOƒ©;=Eï#HÝè9Ø 6´&£o¦í+‘Ld<‰dÝÅkg_Ü¢Åì^Ä5ü=ˆ R"^ºái”‘™û¨Ø’©ˆ -fB !ª¡3%ŒÀÏ¥±¨E£„¡¼9ðÂ@DgC猖_øzUñžDsR6÷q,EýáKözðÀ Ó°±«DCúû@$-TËê °MÍ·“6•±.ö³^FèžÅníɦ;Zeíùb…k¸º.Ù„&m¨&mbkg;×¾FMl§Ò~ÅS£Â).‹ rÛ¶ªWÅÑAÑ6®\íd{JÙ¼z« h$kmÃ+r5Ûrå`ƪ4‡\OJK†ØFÖIKlˆM‡¼¸G¾(o“2’*˜®€/Bwµ]ª<ùI¥êÄÉj¥M^àW -ÆÎK›Bjr~ÌϺI“gà[ä7Ç8Ä>FTIÍÕÝ›ÏÚs↉)Ré<¨Y实b;ja!,€?kÁ÷i Bù’à_Ñ¢0ùGÏk¤7ØÜ|ý4Iæ«!—'uyqhyLîßUî9öÓ ÜµŒË¥…r½§sF÷BáFAôжÄ}n¬î…«”<ؘM]O´e %Pº> -¼¤-‚’s©ÃoUïöd|ql>tRäß6…*W­q"±¿­Í2´MËá$Žöî§fž¡GnŸ\}ÚP*lqÚˆ<×{¬i|Î'm«î)ƒë‹ßŠ_´;¬ž}¿œ_¾›z/s²»:&´puLlGÝ5HFjíŸi0ß^DRÿv2°endstream -endobj -1239 0 obj << -/Type /Page -/Contents 1240 0 R -/Resources 1238 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R ->> endobj -1241 0 obj << -/D [1239 0 R /XYZ 56.6929 794.5015 null] +1237 0 obj << +/D [1233 0 R /XYZ 56.6929 433.0023 null] >> endobj 1238 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> +/D [1233 0 R /XYZ 56.6929 421.0471 null] +>> endobj +330 0 obj << +/D [1233 0 R /XYZ 56.6929 173.1316 null] +>> endobj +1239 0 obj << +/D [1233 0 R /XYZ 56.6929 148.792 null] +>> endobj +1232 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1244 0 obj << -/Length 1750 -/Filter /FlateDecode ->> -stream -xÚ­XÝs›F×_¡·Ê3ÞÇÇôÉMíÔÆiuúfÜœ$&(v”6ÿ{wÙƒŒSYi<–»½ýüíÞ">gðÇç¡°™yó òlÁ¸˜Ç»›o`ïÕŒ«c²†\ß/gß^ºÁ<²#ßñçËõ@Vh³0äóeònñòÇó_–7g–#Ø·Ï,á³Å÷W×?ÐJD—o®/¯^ývs~x‹åÕ›kZ¾¹¸¼¸¹¸~yqfñPp8ï O¸¼úù‚¨W7ç¯_Ÿßœ½_þ4»Xö¾ ýåÌEGþš½{Ïæ ¸ýÓŒÙnŠù=¼0›G‘3ßÍ<áÚÂsÝn%›½ýÚ ì¶G§â'ÜСLÐãƒrÚ‘ó@D¶ï:nÁwg–ÏØ¢N7ÖÌÒ$Õ{+͵ªà¶òf·RÑßÑã=:Ú-ÎíHçPüÏÓ|cåE¢ê¯–‚O©›êxQü)Qz_ª“ìÙ¥¹U…™pŦVVúqmíU}[T·yq´ñeUܥɤŒ#´Wê¯FÕúÄÓºRR[qeÉÚªK«Shƒ§ÖÀ­¥Ó݉ÿ!­%ºÚ?KlÇsEŒ¬(‹J•–·ørÄ™@i¦E.3k];K6z{j>eÅ2Þ>'¹cŒÉ<‰ºK;„”RoosÙEçÈä¶V@¥~R]Ý~R·u©âg¤FÇ[k'ËR%8 X©»¦ñà—€3UU d“5Æš?˜`DÓãóÿF ×o®/ú#üm*Ék«IÊë_j/ÀxüÑqÞ ›AÖ2µ‘ˆ«È³=ítv}Œ³&1bÿ6Ò!©YZô~î´›fèFÕ>+6§7Ik¹Ê”%³MQ¥z»3ÉÊ4YÚ³|7rêpÙØþù˜ -$€ªM8µZŒ8S²½¦®Ú#ó.O*˜‘5q–ª\×V©*«ÍÍÉùdInÕŽu -)^”óCíiõQÿSÉ{,ª£-S»Æ™"Üñ¬®DÇã"×2ÖÇçÏ*rU%l:à?H¤u¤ž×i?©ª€¹Ìª iiZ‰bŽ½B,ǵ#œŒG¦AõÁæ·—Ÿ÷ËkT Ó¯ãù¢eÂéœû0ª3V”سjÆßj©ÕàG¯?¨?sòö†£¸¡ˆø­–et¹ƒÑT9í ´ª–[Õ4˜Ÿa|Ž"˜‘§³à±0ׇéÚ†¯纋Zá‰TSÒs“+¬¤Ü‚]àÓ[¬”9P«„¨Õžžø¡c¹Ü¦æØÂ4Ìx+ÊÊèi{=Q±¢Ìfóqf°©º¾¿øP -ÛMSIŠ.îáJ¦À_D‹«5-ê-TŠ¢q¸  ˜¬ÚañÿŽl$ #ûdG²Lºú ¢ÂUVĈ¼OqbB`¥5â%RCÛx\Hum@Ë|;Q8®„D­e“ÐݧYFT›.ÑNþ‰ýè‘ÙLÀ·+"ðœpúƒØ0YC®ö{n¶îc³çjJ+ëúïfp¿¬ºçšÐ=Ìw™¾?VŽuc¹ŽXÜÕ¸ÝèLj‘-”/вvµXÓSwgL—†nüÜŸç†5‡éD®ê"k´áÅ»&Ùñ¥CYq -‹„S“Q±cþì”C×£’s=(AùAå´$kz’/ȽS´Òºeȶ -‘zp=朷^EÜÄ9:ø "@ig)lÁÝGÄ®¨5Q݆ÌE£ËƬ“Su÷"˜²76•Îèãÿ ‹cð»jò‰*ƒ¦D¡kªŒî[ÒÒ6˜ s©I'ÝÐi»2È)¾‘°¼ÐDàÜ’¢7*zvBFÙÄ­M“²` -2г¦…¶sïŸp}׆û¨k"öTÚA×ç¿yAˆñàærñ#Èâ<~h–ë9‹u»Rìˆá~›¶MHsÈ$ö `ÛZ¥±uX"\&ðaÈŒ¼mÑd m®Ì¹¶+Â^_@£–ÓÓ­Šq›‡¾øV5àúB«ê¸Pëµ·žnWdÁaÞ—Õ÷\úGíJ@»b<ðû¶-n|0t¼I-‹E‹d’Æ´Ù”‰lÐm׆ZÅM¿qšÃêÔ(½œ=J,Ý®EÓ³–Í*ëôá´Bc˜¢ð WUzGæ8†ˆ‡6à„0€•á\MŽ…åzÑ"]_ز6&áÄ€¬zÛbÆéÌœó |øD¯ó‚î>ˆ8&8‚2Þž»¦ÖãûTvÃ\àÛ4t Ü\aão§Èaý ùÕ?Ñ>ü~í¶†Î4]œ!œ(èŒB¯=qhyÿ[îcÓÿÖ½ endstream -endobj -1243 0 obj << -/Type /Page -/Contents 1244 0 R -/Resources 1242 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R ->> endobj -1245 0 obj << -/D [1243 0 R /XYZ 85.0394 794.5015 null] ->> endobj -346 0 obj << -/D [1243 0 R /XYZ 85.0394 285.8176 null] ->> endobj -1246 0 obj << -/D [1243 0 R /XYZ 85.0394 252.9894 null] ->> endobj 1242 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1249 0 obj << -/Length 3961 +/Length 1976 /Filter /FlateDecode >> stream -xÚ½[_“Û8ŽïOÑo箋٤(ŠdíÓlÒ“ÍþÉÌ%ÞººÚÝÙVw«bKŽ%%éûô$Mɲ{î¦ê*•˜¢ ’·þˆ[U°ÂföVÛœ).ÔífÃoŸàÝûái–h™Rýqusÿ³Ô·–Ù"+nWÉX†qcÄíjûEÁ2v#ðÅÛ_>þüáýß?ýt§óÅêÃ/⋟?üõZï?ýô·¿ýôén)Œ‹·úé×ÕÃ'zUø1þøáã;ê±ôsaÐO??|zøøöáî_«?ß<¬â\Òù -.q"_oþñ/~»…iÿù†3iºýœ k³ÛýM®$S¹”¡gwóùæ?â€É[÷éœþre˜Êòâv)sf€ÿ¼–ÓB‘V–2“QË™˜Ór B-7å¾Ú.u]y¨—›#̺éërwæ -Tlsu]ŽH5#Hº¢È˜ÔÊŒ%Y¡5 -‹êØ G§a|Ú¸5Š‚¹¾ïuÿì[ÏõÆ7ûÓ÷NÔ~n‡Ý–Úå$0ÊÍÈõÀÜ;j“¯CÕõàKnÑ gZ2,áô×]Xb–Á7ï?^®>xOÝÞ úvÓîÀ´3ko‡# Þô;ÿqÛPË,þR×}ÓÑ;E?‰¬)¸ö$å·²Þ•ë— l¶#™ìTe8>¶=2[P üäv*¼8ëfSPáHàÕŒoˆ ô5cç¦lü€›¯CM쉪¦q‡§é÷Ûê±Èi`^@ñ{z«Bÿä<ÛUoè¡iûrŠsN§†=™Ü}Õoî¿׊ÁH}¹žTÅŠ\@…•*2½ø8,¥*@N‡ÌÐJt¡»} „ˆ›J-á{êúg–å^N“Ú½1,×¹ôl·Mw?3›L2+x´Ì¶í¾p?Ÿ‰ÖLsл٘ÅêÎf‹–$ƒA6-bZbˆM:Øð›pÍ +”ØêÐâ¢,gÏÂôöCç·Üu-µÖñú‹Pƒ1£§®B]Juê"ÕŒð#|qðüæ‘j†ûß„eÚ¨ ûÙ‰Yx\»<î`ÃÖEp僯 -±C„‰Žšdqô¹£Žî¹ô®NÏ„gØzªš -Ãå–¾p€y¾¸2 ¶¼ð+¶úËÃÍ,k¦™ÈÌÉWpüÿtò3–…†¨Æž¸ÙÕ€Aˆ°EŠ°s}9‘H –+n_È2® 퉪›ç²yr8ÁÁ==¿}ùBöHìbGÓz’˜ ák> -À¥®ŽZuô.P#Í#Uœˆ«„ öbñᑺ)TÌþ éGpÉ­ž(ȃaà-\dü¯ÒEÆg‚Gh|¯wžqyw`Eþa]Í€ŠÐS… «¦àÜk¡ÆáñÒ¬~Fç¬Àš€ÿ>ðÍØ߆BJ&è+¹]ü>~¯»Ê+Lêœi›ec¨ò)kP&¯Î+dqz5ò - p -ä0lÍëðKò,xÃk»'¥ ßÝA£ÈŽ¯ë.¡º¢»@å`|Ø.¨NpÁ”È_a©f¸•W°w´FìW!JwöŠóTÉKè’‰RÈ°!¬ip*Ýä»m uuÙù'Ú0„üŠŠhÕM×ïÌbØP ’m[Ï"|4_š@*ËŒ-&y˱Ùn¼g‚TÛõ|ö’©"K’Ë$>F£pI¯ÄíÔgGûu7—("¬«Ó Çé*CJ ôBÜæÒ2H¼íïN?âˆËtHg#餀arkOœƒA²Y…å‚™\Š¨°K®ì…Î_ÙL©®¸J rûÕ¾ëËr¿zÓ]òˆÈâ«RDª1F>S–ÞŽäð!‹'>ƒO®3Á> >“tŠ$ÌA9Ö½ /ІÉaäpí¡+Ÿüw§ ûqZϬ¡_H…{0ÝœSI‰]hº.¨a(U6vŒßgÏ\‚¯ÙÔœ™_•¹RÇ@šd»`0²(pGà•¸”R]6˜Håvíëí31–ÿÈë¬Ñ ëQïΠŠ1ëÕü‰ áª>¨œp59e9ªŽ6âmzŽãw7Uç;>¼ Ç:Xê̾p8æÆ­»,ø‰]\wÊt¾îhþÒØàú÷d_y†–œV@}pš{gô/ƒ…˜«„¥†‚&OËûB{ï‚*6Y=÷ì¢;üúÜZ.w.lz:ãiú粧Ö÷²ñ-ç:–¢ÿ¾«Ÿšr×%¯5?eÈQ¼QNè‚UÓ¸¬Bj¶t6:œYÚ,>Ó®’ÎdÌJ2X…xÀ”LÖ Û6³7|$òXÖæÅ}Bë ‚ ÄYt”ôø«³hœeXêÀÒ÷$bøh­Ã •OÃÒr´èh¥}媜̧ޮñB»]®`÷5TME ¿/e}š¿”DïÛoX>BøR‹mïß¹59fT9˵ (sAq™Jwœ)Y§üä’ydí|ƒg>üŸ(H'~— pŽ¤Ã×ê|»Ž¦òئõuHPcvQ5›]Köœ”Ûvˆö×Ð]ÄÎÌ&5ϯcgJu;#•³s<[úñR šqà~U‚H5#ÂxÓ”g´Ë@P TháÉZ…±¸#NíJ…€¦’ƒ'’ÓÑû¯C#ë*¾p¨­dWD-6“ƒ9èòÅiˆº\NK¸Èiÿn„“D×Þ6,·O5ýï…DWp(Ÿó"8ÿ)ÃK5¿?¨ôhõÿ%Ée×d‚¸ZÒ¼–àýËÅ+%WJuÅ´•K^M"qG}]„H5#Ãx·È@½ÅÅXJxž&ðä ›{ÅŽˆÆÐŽ1AÊòp€€ÖùIºè¾hé×\@>-¸¢­ÿuW~Ûhn«œ:Ÿá=Ê‚„˜Kóœ)³G ’Š²Vüˆüzœ¨8à¯èÕ)Q)ä[Ì ñ8C½$OIÖ!p¸ƒ¶"(L6Zð]‚^¢¹mœÖ*Þè( >H;Ö—Þ§ÚljǠì0¶U·9Öë$PLL6Ë$(ÂP†Hj¹+hèåñé–ŸãôËôƒsã=åÿ\mümw—,gPˆžIdÔײItæD‘ê59ÎF»Š -H - -u;RªËØ©\žÖÒ¡WÊTÆâÕ¥«LÑ Ó6r–[ÀëSfñ÷w¿Þ¯ÞþJNhA’?ìסˆà&ÁƒaG¤nk »¼ÝVõ7Je¹¿BŸ6ÛØûîãgú4½²ây˸_¼Á|ÍäÑðøa1) ’X¢ã *ȃ±òÈâ>žŽ·ÞN÷¦ô;v/ñâ”?Ç7~·/Ù9ÇSqÚùûÝ +Ï âQ‡oIŸøÎ9Q'¤Ms|?†`ܧ°i0 ;¶§C’è7í~?4þZQŒôcïÚµëÒ ª¿láÂê•› ÑûöD§£Ìå¶úVoÎÃb–3]hq•w$:g>Nø,Ó`/#]íàŒmãŸÛGúÜ%#<ø;_¨Yü]{Bª ]ÏËüe/*Ï2èx˜Vû+^‡c½/õÎwÓ?jûs}·4ŸÞú|Ï@^f&ßðÄÌØ» -(¼%9FG¿î”ĵÀ‘š®t˜ÚÑ)¨÷E@~<ÀC |[g;ئL»"¶òÄÿ ÅO‡Ž¨l¸DŠ”?° ‡ø˹«^.æ"•AP`Èu–m,wð!BZ=‚žãqŠ{ò·Àð#—\@á ÙàSº>j*¿…Eìk/Hø-ƒþ¢—”ýíã?®Ï.O—" +ƒ˜.£8 ~<¿øLœŒŸ~¹ørþõ×˧‰ +®Ï¹ öåÙ—³Ë³‹Og§KžFÖ §á•_Îÿ~FÔ×Ë?ÿüñòôöú§“³ë1–ýxy(1?NnnÃE aÿt2™¥Ñâ ^BƳL,êI))=§:¹:ùç¨pï«]:—¿H¦,JE2“@Åçe,–BÚþ÷ŒáÃÁœ³,ŠŠ†‹¥JXËÈ +ab¸€,…aTOî) WC>èZ7½~Ö¿…¡hÌ`Ú†8ySñkŸ¯´³$÷|C"b"ã‰5t½Ö£;;!ž±4Q/Êý—ªÀ"“ÂIõ;פàAÑ6èÛjÛò4@ÿ‘;€9K4ym©0èu÷¨;÷¹¥g^õž*œ¾ÜiÈéQ™ÕzxÒø?1œ™¶rÊFÅ€'ĘÁoa^i}¡H„,Å2ÅiÌT’p,&}ìV ".÷«ïå—û lõ'éy©Ót¥‹%zõ–KËð‘êÈ3@‰ý两¶ª#Fû@œ¼,]ü=ÉFáv Ü¦í†žê‰ß†uî kãäMÖ›B(ö÷[ ¾“5‡ÞBPÙ4qc÷q”¹®ÌH÷ëv[•DçE¡7¨‡Ná[ÝcÑñkÛ@¯*(Ýù1š–ž QƉîUþ>Þ“É' ^xÛëò@³ËjÚ«ð·±Q߶µk +§ëÔsä<™ª" +ÄŽb©vóØh.0aÜi"§íÖ)øÖäÛ#Ze±ÃУÑOs ¦Ðÿø%ÐD*ƒ{Ó”=‘” +¤v€À7>sz Ny°Ãò¦ˆ_x«¸(°n:;Þ²3õùâŠÜz?!S§…Øä…ÆÜÉ4ÀMBX@#´…¹&Âùµi›^“¼¯èåÞ‰Áé‡î4 ¶UÊ6…×ê„z»W!UçMcãľ쉗ӣi»:wÚ)`@ºg¿t(Öv’ ß‚”‰]!3aw¬;¬ª«jŠUxöR†n—…Ï¥~ÈaL“ e)¿ +»ÂöNFçûm49Žÿ}CÔj_³½væó†dtGƒ´­ÎDïn{4¥vQæô ©öÚLÆ (ülëÆ›nk1ÒXó°°/›nJ?ãlÞÆéXåƒytr¶«‰4nbo|Ûö +%ܧ½)ÛaöP‘°,ÍøLÖ#¾ˆ¢iÁOŽGo> endobj -1251 0 obj << +1245 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [222.5592 220.8351 286.2499 230.2447] +/Rect [519.8432 682.6714 539.579 694.731] /Subtype /Link -/A << /S /GoTo /D (statsfile) >> +/A << /S /GoTo /D (lwresd) >> >> endobj -1250 0 obj << -/D [1248 0 R /XYZ 56.6929 794.5015 null] +1246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [84.0431 670.7162 117.8035 682.7759] +/Subtype /Link +/A << /S /GoTo /D (lwresd) >> +>> endobj +1243 0 obj << +/D [1241 0 R /XYZ 85.0394 794.5015 null] +>> endobj +334 0 obj << +/D [1241 0 R /XYZ 85.0394 731.9325 null] +>> endobj +1244 0 obj << +/D [1241 0 R /XYZ 85.0394 701.4683 null] +>> endobj +338 0 obj << +/D [1241 0 R /XYZ 85.0394 475.6865 null] >> endobj 1247 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F39 885 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R >> +/D [1241 0 R /XYZ 85.0394 450.9966 null] +>> endobj +342 0 obj << +/D [1241 0 R /XYZ 85.0394 393.3855 null] +>> endobj +1248 0 obj << +/D [1241 0 R /XYZ 85.0394 362.9213 null] +>> endobj +346 0 obj << +/D [1241 0 R /XYZ 85.0394 329.3761 null] +>> endobj +1249 0 obj << +/D [1241 0 R /XYZ 85.0394 301.8169 null] +>> endobj +1240 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1255 0 obj << -/Length 3390 -/Filter /FlateDecode ->> -stream -xÚ¥]s£Fòݿ•—ÈU a`€¡ò䬽9'YûÎÖ^.•äK#‹ZŠ@v|W÷߯¿„äMÝn•fšéžþî©óþ«sûA”éó4Ó~¨ø|¶: Ο`íû3%0žòúPßMϾù¥ç™Ÿ%ar>]ôö2~`Œ:ŸÎ¼ÿÛåߧ×÷^“Ä¿ðâ$˜|ws{Å3?ÞßÝ~¸ùþÓýåEª'Ó›»[ž¾¿þp}}ûþúÂS&Vð}(;ùàÃÍO×<úþþòãÇËû‹ß§?œ]O»³ôÏ«‚òÇÙ¯¿çs8öge&>—ÀWYž¯Îtù±Ž"7Sž=œý£Û°·JŸŽñOÇÆCœ{‘öM{Œr9ðƒ¸æ¥qæ'Qu\Õ—ry½± »Ùع÷Tníþ¡UøY ÌyçüÔQǾ1‘Rp³¾›pÒ¬í¬ø-B;3™š´K‹KѤ,šÖά}][ýÄÁ%Ôžº„0­xö¥(Kž”ìªh»í¾Sf"‹5à“}ˆ4YT‚ÖÑ’Ïç…‡|BéøY”"”ŸÅqHÇi‹ºÊKV¥ÆÎð•_ê?s~ü±µ›W2ͺ® Z©`2%t°6·‹|[¶üR4ü¬j™hk~®y‹Ñ8*ÙZ¸#äÖíÝí5²Ç?PnÑ T%¾6ÙZ¶:¡d„,ÙÔuëÍmiŸrd‡WWå릥 éijN’ÐÒ0Ð3–gj@Äô" &Û #2 z*½šT¢3»²UËó(,„Û§š& ÙdúÓUÃàÈܶ^ótiŸm)Ÿ×«¼¨VIœÈ«9A/¬Iiä'*ÚÓ¤ו¿íÒIV´iÝW4ûç¬ÜÎEÒh-$a`š§2?ŒBfÁmÝ -HS¯dÄg ;[èkØŽ‚—¸àÊúO¢°¿…¡¾ºÆ¿ïd†?]dáäŸ{“Ÿð¯;Í|·ðñÓÃõ§8êtô›º¯\pžHùÊ:³¨O‚`ò:°N}é£êGulãèñÕÜ~õ­ Ëçn¸mºájÛØíʽþ÷[qc¨yqÌÒb“ ‹N›Z긭uPˆr^4ùci½¼|ª7 6«æÐÔߥ'Ip@#$ L-ý|ú†+¦D›hñœIÔwð¼ruûðpýž{äÒZÞÊ“4mY¿¼µc•¯ÈƒBÄÿ^Ó9ê⎺²Y—–UlÀSðJgȆãÌÜã1~ ø“¦Í[r$cf•—p;›¹ël©uî~U7bxÝÙfΔbìn³õº,p³c*¦#?Sɶ:¡`D,©k^Yן󦘦 I['ÑIôÐ!þv%Fi2 àç¥E_”¯í»jpúqÔ‰p„Þ}~‚Yg ¹æg€mè›™<çe1Ï[Ê6àU¼2Œr¡(/[»©rr³I6YÙvYÏe“ºÛC´SôÍÆ©%§½ˆ>‚íãÇë_pœHŽ0ãH5oŸD (8Å/„à†P: ˆÙ×[ëc)ö6Æ“â¼_ï+Žl< ;=C{D%×Îlu1Å®mÓŽˆ.Iü@œ¿Xt*ÉäŒ2:ŸÑÇXÕ›ÅJ˜ä]y,åèp˼á…Ò.Zž’=ô䳕sl«vsa&[ÌI#±Lµöƒ²ùaN(ð^^Í–ÌÓT š¹+¬]¯-å$ÉhF3èãÞç rÅñ–ç† -s %òÖÊêvÝG€y P!ÊTˆVÌ@ÝrfÍfÚ•RÒ?Eé>Nw:ûÕI·osDmSJEšbU”ù†r4ܾÞ3—\VÜ÷Çù4¯-çl#ÚܹjG•›÷à‹†9:(ùÊ·iºóÜ;ý9ê¼uN0Ž“Þ»uÜ}wP=£Z¡:>ZÆÛÍ¡‡hžé0=MF5BÇÀg°îÑñ€Nc&¦“ea7(g0lxòeYÌ–ŠÕ|ŽÊb²ç9Ù>qÄ9*ŽòÙÌ®[WÍ‹Ý4ü‚V‰O؉@“]ªÓ»ãû\M’ÆX…²ª#^pŒxq¬8vŽÇ=ÇJü AtDCÁ Úu¦97*ª'|‹& r“0 åSO踀pdç0ùè‰]”b¥ZqpƒT»cV/sÛl«¹ò‘8µï6d̺ºCÆØúêXçÉ:•o’Xÿ¥”%ÒX>óè熳¶x¶þ*Èì¤ì¬6J}¤, -laî â  ªù®®KëjÍ;)´Ž¸ªHC© Þ¨dz@Ç•"ÝضK¯úSÄtЗÒ~šÀùOá»R™Ÿj¨)ûØGà¢ø¯™z*±–(0.MØÏW! Ô©K?//Çö5~œ(òèq—®•ÝdL‘Õ’ÝþëêîãåÍm?Üq¯©í³K ]¤—¨‰)öæÙn:l’ã(?LM:´eö¿&CÕÛ‚-¿ÊˆK§ I%©¤Cú[°¾ëo#ö¸®À§&N¾ÜK}ë¸M±¸gÎÙ2¯ž,£\p¶¿âi/ÃÈ¡‰t'³Ék½•=v-à b89,ÜèÛyÌŸ ôN{Ñ£.ç]Þàš0‹öE¶“þcÁ:0—Ê°²ûIÄ.ÓØ5G¸† wÓU¥§ÔÕÌÑ\òY?UúJ²uÜÄ;(rtþ b¯WWžý³h«I(ÝÃ8;MC5BÄð¼ÔÔ‡TL—.g㎒ÔÛT -Ä -dì$PÈÒîÂ0jwÍC[IçVgK;ûÌ -oÑH¶vUsëWA‘vÈ+×Ë+Zj(FÄ ¾ƒÁ?ôúÀÈ4M‡üŒ—Bà­Ŭ°=,”jG½;±sÆL1Hþ9 ÛS°øø:âþÃÀø)yàÉv# PigºÔ-dB\jA¡:uDíœ,&TcNÖ‹¢ÈÃ0jظ³Õ¾Ö±Ë·UiQ ¯½UÿFÃU_+£![zš¿Ó¿zµêôµ,*;´?W dÞØ¡7=„Â{ø‚÷QíWYæëмQ™õ¡ŽkÅÍƼ„|_íÝ™Ÿuo5‚x(3P61«lpôåñc˜ -ºâ yA—EÐ$ëFNýÑ€Z¢¼à®;p®á)LGðÝ•8ýèàí -9W÷±Àn >XH•„ÙøÆmÍÓÈkŒ9sKŠF>6JüX§{ Bñ¢8FMüŒ)“ -â,vCh@µCœLãöiÙò‚ûaø"Ý]üR¤§¢³§ú`vy }A! -GÂJpS`ä ‰^¸DÍ+Ül^ÐöxˆÌªÚ±n˜ -"RT9‰½20EÅ<™»4C÷‰NÍ'篫àØH‡FIÛmø&ñ-ÄF剦v°Ôk„Q!OR,©&{R©Øò±žL)&™8A4¨>ßñkMqd]‚vPz; ;³_Ú|Ó>‚zzn§1çù&ÖÎ6ÄS…“e½¶‹-§¾ð:ßn$ø»ëc"H38'…yÈ1…vÀ¥ˆ1øÒl×r« Š˼3™wºw‘±»ÌsWÌ#íúž0¡ä²' îGõò­è‘&Bùx+ûf‚®ú¾"4^EtíÙ»¥œŽI‘àUn°ç*÷ðD¡ot抴.ÿÉŒdÔèJb1LQ± Ͻ8m8Ј!%6P7w•àsa_F( c_&îéÈè¡LÔåè$ ‘ ‘O‚ôàzéËÉÑê‚"/AÒò³~f_ 7!„)àïrúa#7}z*ëÇÎú¤C&­S~<¢Ä å!ÒWÊ* -‡Ò§ö°‘„ -âC`D~ÎÄÔÀ…Ç*oZ*Mø¡Uæªíþ]k\‹gù.>WÝv¾½›Þ|ø…Çl‚lm#0äÖí³CSæÏb©{þ [bFÜcôtž;CÿµÅò0JЋ§'¢69à@¸P,-Фq\mW”rvÞŽ|eÿk¢Œ‡HÊ=}ÂÙA‚×_:z -f‹ü¼Æ]fvåM§2‚¬_²÷¹Õ«³ÜÎ꺒©—VUÿ×3.yt­¡êjbçYäM¿@Þ€½,Ò |¥ÒoA8Ǭ†Í5 ³˜º,];šÚ«LùQÚ¥UÝ"F¬$ðU’¼é+¢8uU:1ïè~ *ÖÇ3Y×n‹}üýÙH>t•ÿûgn»ßêÔŒ ÇÓ(H „ÏRG®Ó}ÊãÈø± ÓÒÿ‚+Iendstream -endobj -1254 0 obj << -/Type /Page -/Contents 1255 0 R -/Resources 1253 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R ->> endobj -1256 0 obj << -/D [1254 0 R /XYZ 85.0394 794.5015 null] ->> endobj -350 0 obj << -/D [1254 0 R /XYZ 85.0394 396.2024 null] ->> endobj -1060 0 obj << -/D [1254 0 R /XYZ 85.0394 369.4308 null] ->> endobj 1253 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1259 0 obj << -/Length 3376 +/Length 1168 /Filter /FlateDecode >> stream -xÚÍ]sÛ6òÝ¿Bo•gB” ><¦©“sçâ\wnz½>Ðeñ*‘ªHÙñýúÛÅ)Rt.—™ËxÏš¨(H¶ñkz—$Y+¿"ÿ´+<µtNáÏË–Ë¢)ªpzE¿u^.‹òÁ1%V£.$}æo>Ü]¿ý•´˜vÞë¦f­¤RfE’:ä·E‰·&;_Teãð«ÈJîáN„ˆçÙb]äùÒ>Óï¡ö}ÿVš›4Ëê©Ädcµœ&¥Å¡EœôþœÿïówwïBßö}fÛ<¨*NäŸ@uø¼¦§å!'À+Y^<:-Á•¯ßÝ]ݾEžOšªüfËÊ‚A®‹å´Ýj–¤æ¤yš•Ï>húF«{ðmi€žöE“×hâ<Eò£¾Þm•j7]3”·&;y-§Šm;}Ô± -ܳðB¸®OK3­f]¬ójÖb¹F\\l–ÑbSäe3Høx"@ ¸œ& Å¡ Çl‚¹<ä©=ȪEª[çŒðSæ Ъ¼”פƵ–q|»Ûä[ ÚµµqÀ¯$›FC·Œý[‡ö|(«ÖUˆTQK¼·Ö‚ªhcæw—ô’O¦,æ‚Ÿ(õÖÍO`[³\澕š·9=ƒãÑ4Ž”m†6r3'ú¥ 8}z<Ñ¢¯ S™8™×»|5zŸäæ© -ß]¶Ï?L—2j;¬<(ovhÖQùiYm³bÌ@98‹í‰ÝŽ“ÄL&"°ÖöwûÇ[ˆ¥i0Ìýj‘ˆØD˜Hñ1aa¦.'MQ‚øUèßòlyÞ"cY£á/XdkÂ"–»÷ªn¢º ­nŠÅÐ"Ñ©`'d’€k„‚¾E‚å‚{ë“à2 Å;ÑÑ%ÁŠ‡$ J|}€ü#ÏwÞçrŠêðÛáÁ!­Ü›I\úHi/€Èl¿òoV\,†ã· -9Àî…A¶ ‹›L zçéÉ{‘¢Y{Wꤞ¿på 8{Û‰VLj=}Û]¬ó·Ýb!¥h+ üGÅ'j\G÷Y=Le Ž3}ŽkHä†}»UÖœP’+yÌ‘¦1q¬`FrZÃTÛ6„E"áóë†Ö;7Ž€ÏtqK¿u;”Xt†Kláq çì·En‰I'¨Äž2úiöYYƒ@lhIÝTþí*‡ª(':á(‘”ÕeÒ‘Fp].( ~¸¤ÿA¹ƒŒ1ÄsVíð³ú¼Çœ/}¡QÝÅšPã€ÕÏÙ=ÖHȨŒ™>6 ÛK¬°À‰yÿØÑxªÔNŒ„3Å•é¼ì§^Žný -:8ìʘ”tF¨ÎW[º÷u̴ΧjÈ+"¿ìh€Ò „è#×0i›O´”(G®áEsû‡·]—УþˆK9݉úºšH˜dü”(ºéKÑÎÖÃ×Jiš€Á^>ë–ÚP¤@:Wwâ"Nù«Š)ßÆéfÝNá½Ôô°Ú͵G£ð¬µ˜x©ßùݪÄbà¤(‡JÞJqâÏ\þ´p‰¸2tekü»‹[·eS ;p$ ª"zK?~xMÀ{çyèl–A±1%)ýzÇ<üº¾áñ¸šZæONfÅ'-êlSWÑÙO ÐßH>‚£èÃÎ}§,ÃkQ•xöâ æÏý†ùø·Ä æL …ˆ„/;D -É—fèsýÇÎCÒÿù§3†endstream +xÚ½XÛnã6}÷WèÑ.@V÷ ö)›:iÝlëzŸÒÀ %*&B‰Z’rìnößKYK‰ÝJŽ$J<3çpf8¦¡éêÏкh^`CG7-LFºö Þ]ŒêPÚ_}œ~¾²<-€kºÚŸÎÊWn…ññæö—r$(/G@gÓ«élz{9ÜÏ?¦ó†K›¯¡[‘o£»{]‹íO#ZïhOêA‡F˜Z2² :¶eÕ#tôçè°õv7õ ~†MË5h-}ºº‚òœº–ií¼›W×Ç(—+n"– ’–C[,Œ/Rö¡|¾/È*‹À0`à8f{z„¥,D–¼!ò ‚hžµï,“„¥‡çí¹1zÄ€|Ë1ß7c®ÀÍñ si.Vào–bQ0«\Fì©Ÿ‚+¤hBJp*ÅpOVLH $’DH¾$hS¾Hód‰y II‚(àXd,ø'’œJ’Q Â%§¤L’øe”Ïåo2JÂ:B«Á ‰¹ZBºíA”ã0çB…æpÿxš–î¹Í°1|z.TœG cŒ±"·¥úds°Dâ„€ßM9K@Dâsœ†õ2ý¥;úaÉKu;C‚¢5V3Œ>•!‡§hIñpÚÕô5¢$Bò¤U« (cH¨r¢]-%ÏUú 4\1Þ~Û<)–ˆ"¸X82 +CœIU3ÂqtBucü ñh¿¼å]‘%ÅŒ ²ùÊèŒy;ßËKdÙEQ¥ã]ƸlÆ‹‡ûò©2!¬íí.?úè“«2¥j]ø¨äæëÆ£¶¾ïÀL ŶÞa´×¥\­EQ¹þîyW£tàúq/d®U( À ¬’m#MWpG%M¸ÂJ•VõÝó;–Æ‘ºø·üì! +†´RˆÐÎyHÇG‚ì%#ã5£dó’Îmêÿ"ß¡QØdΔ+ç«:8‘Ûá©_³-wÐwä,øúým’%%éÃp•Švõ ´›…ª¹‡…X$H5… Jêºö£‡O%h« =/&¨w®Ó`c°!Rbþ/ïßèöpÉQ*âºM]ÝÙÜmpϯDž©ŽŸY‡T[t“^gpºB.s÷Q</RE• 3¥i¬¼Xšøkˆm*WXq6vKªú‰£çË¥¢Û_Û 2Pìý]W‹‘¡ë»fêÇÃ_{螯òÐ=çâk¼O½»=P§¯ê´gXºÆ¬"ó¾–ËÒ+XÎÃW[ñþŽdv«Ï¬úQ/€–é9 +z¶eïPê´ª­Mk ׃–gÚõßSlo1¯{a :žmT¶c¶½í¶nÏ•'¦38ÜÙV¢öRÂò íÛöpoŽZ,Nñßé â› ÷'©¶Zß7›s@Ójšž¯È)Ê©‚‚m¿ò¼>U|íú?ÌÕÌendstream endobj -1258 0 obj << +1252 0 obj << /Type /Page -/Contents 1259 0 R -/Resources 1257 0 R +/Contents 1253 0 R +/Resources 1251 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1237 0 R -/Annots [ 1263 0 R ] +/Parent 1250 0 R >> endobj -1263 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.2681 85.4256 203.5396 97.4853] -/Subtype /Link -/A << /S /GoTo /D (notify) >> +1254 0 obj << +/D [1252 0 R /XYZ 56.6929 794.5015 null] >> endobj -1260 0 obj << -/D [1258 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1261 0 obj << -/D [1258 0 R /XYZ 56.6929 679.1143 null] ->> endobj -1262 0 obj << -/D [1258 0 R /XYZ 56.6929 667.1591 null] +1251 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1257 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F48 940 0 R /F39 885 0 R >> +/Length 1152 +/Filter /FlateDecode +>> +stream +xÚµXÛrÛ6}×WðÑê P\^&OŽ+»Î4N«ªOªFÆ"r¢4ý÷‚I¤EY$DƒÜƒ³g±‹°…̶<õmËõmÈfV¸!ëÞ¼»áê°ûÔ¿z;ý|M]ˇ¾Ck¶ªayy¶fÑüâê×Ëßg“é†.8ÌAooï~)GüòçêÃÝõíÍ_Ó˱k_Ìn?Ü•ÃÓÉõd:¹»šŒö6ö¤B8ap}ûÛ¤|º™^¾9/fïF“ÙÞ—º¿ÑÜ‘Ï£ùY‘qûÝAê{ÌúbþAû>±Ö#›QÈlJw#ñèÏÑ{ÀÚÛ´M?F=È<â¶h㚀˜è9[.ó¡C -œƒÐE*•.ŸþF •O"]†¿ç¾Z>®º6eÄOÕ+è3†­Ú …KëÅ»x³ÏM¶}hSß1O +©Sû¼áj 2¹Q!ÎS–u¾Î2ˆ"Õ ì»8&§“#Â%#JŠÌÛ6FÃIJOÍm·‹õ½bBdħ;&¸Î$w—gY'%¨ mÏfýCw>D?jõ¿z6Å +ÊÉ€Tʸßòl)Õ2‘ ,ÔªrÓäO•äÉfý‘«vò „H4WAÜe|ZI¶â +h±æè<~BnôKhˆ(îFã D' Wt˜‚0<é “3F~™ª~âÌÃÊÄ#ï>}ƒ¸™\q¹, +4ï9Í^ð¾äsÕb‘ižäÞWô]ÐVR­ƒ£¬— æƒ/|_{ªp'ÛjüP¬p¶ÕtY±Ä0éåéÞvÀÚÚÛ¦Æפ·È;•Êmë ’HíãÊìú·­23è»®Ó^ç‡òZÕÚEku,w2Ü…gc{í°Ú'¨ÚèD!¡®ß¾ÕÅô’µ†ö +²äC‚k•µ…ëYi Á»Èy%ºÄ…ØöÈÉ=ò¤¼}6ÊDj±Ú‚ˆÇÁvWªB™DY ¥öÄ©:¥ãBêû”`ìeiãRHmß?Ïò|Ò2ð’û’¢ý?- ×àI<;Ç$ˆ3 J¤ràß=«ƒ«çØÎØ@ à ñu¥@,ïA&¾ñýÑ?&®‰Ù`æùÓ2KyØA(M{qlÙYî(ÐAOû†+ïš‚þ“g:?½„}ó É}·ÁþJäÚ#f« äCŒÚôG"̆ú e*ÍòkfKuT[š¦)|XæXµ¨ož#c’âðí‹ ”ʸRE»Þ¬B+FŽƒ<öíÓÔk‘%eïãSÞnä%ºÇ~Ô Ÿ*ù(¢VŒN‡7sìÉô@k­òÒ*d Kƒ£&©³…x|eøPÇEÀ¬îî m7•”Áüz±å^íïd^|‹y¸âµMËæydAIhí‚’"zÄww¤rGmö”ùþºó˜úÿ;HÏÌendstream +endobj +1256 0 obj << +/Type /Page +/Contents 1257 0 R +/Resources 1255 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1250 0 R +>> endobj +1258 0 obj << +/D [1256 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1255 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1261 0 obj << +/Length 2305 +/Filter /FlateDecode +>> +stream +xÚ¥]sÛ¸ñÝ¿Bo¥gB„?1yòåœÔמÓ:¾éC’I)’8¡H…ã(½ûïÝÅ‚)ÓŽâØ\.»‹ýÅüóE±H +¹ˆeÀB‡‹l{æ-Ö°öúŒ[·'rÇT¿Üž=åÇ Éd$¢ÅíjÄ+a^’ðÅmþΉ˜`çÀÁs^¾¹~uõú›‹ó8pn¯Þ\Ÿ»"ôœWWÿ¼$èõÍÅï¿_Üœ»< ¹óòïÿº½¼¡¥ÈòøåêúWÂHz<ÀôæòÕåÍåõËËó·¿]ÞgŸ—{>äóÙ»Þ"‡cÿvæ1_&áâ^<Æ¥‹íYú, |¿Ç”goÏþ=0­š­³öã~$f ð‘E°ŠCÉ"_øÆ€ïÎÝÈóœmQ¹ÒÍÞÕÅV®ê¶KÕü‚ðÀ ÕåœÉ0éןe±«MP±ûˆ/ó{øxOšç….ê*-ÝUSoÝ´ÓZÙ«öcÝ|¬ê“åóÊÒl£žÊ¬I«xäêK‘Y&»To>VioN‡F5Z¸mñÍnCèc»SÙ¸Fgw›îv*wáj[Õìÿ4j¥š˜¬ËÎjóÞ =‚.èñ§}ƒ¿ âúÍõå°…Ÿpv•W­Ûå»ÑÑ)žN Æ'nmêZƒ×JµN1ܺ*÷´Òëõ5+»Ü²ýŸåN-‹ÖFï_½”SÝü¹S;¬×Oµ¼hÓe©Ü´\×M¡7[ë\À´¨&š$/&‡:F[Ýÿ:%k(@U…*üÀ ø “¬TiUTk·¨´j¾¤åüžþ|Âde¡*ݺ;Õ¸Æ7§–³ûÉûTNGÇjÁ«\¼ªHçCîiõUÿÙ¤w˜T'óSÛÞ»-X¸W⇪mÏêJ§™>mÿŒøou¥Ú›ÙÀ?p$ÌF¾Zºv¤œï;­Ò-AÝŽžë²^bú#|8¼èŸ³TvC«r‚–{zâǼÝvÛ‘Àmj‰±)¦•cJ=A™"Ç„!ª-¦ŽÁšêG‘“â#v жë®Iɺ¸†˜RQ(«!õŽ'Ž¢¨¢!&f %,‘’ß²1€^rlÙgÀ[†àe’5.Ë:ûDà]R(ˆUÂ-ÁàZFÃ#¢Ð­Y/bI(å4ŸrµJ»ÒÝ]Q–wÁÝÅîÍ͜ŜG Ÿ,Jbÿ9—ˆÜ1•s'fëgðÊ(U4*Ó5”ß#É2fQ$Kî‰f$ýÀ=±â‰©hÌסsW7Ÿ µÑ (dâê'wP/ƒ­WôÔý[¢áöWˆú‹Ê’V0š¤Ë¶.;miqºÄ’‡.Åè˜×ý($E©õ'‡\÷¢i¨“ý€Î ÓOª"TÚÒ“ÎRß/=QM+Ú$ B‡ãq9çæH’[!E9È´W– ë°­[M1 Ï.ÔÞuv‰Õö/¡§ØšQâLnDG—³¦«fr îapñ6Ǩ٠+p‹)/qN„fÏé'ÂÔ$Hçè&̪Z€CK§Q9d³H<ò&. Ñ4Ë  mcìÙÂÔM ýïŒ!üȇ»¡×q6g&ã8²{F@Ûòã(œ† E\ÀÕòᬠ¦ÞÁݦ0%@»Iô!Oë`‹Z£±p¸aö3#€Mfùmê®Ìiqi÷™škCÍ4tL§ •ðC†Þw +Õ˜êáB5P¡ÔOjï>X¬8YKï‰f¤OŠ•°úSñÿÙ˜Ôæp׃yFM*Xžtò=¤G‘Ñb·ËSSv65 Z•uCoã4‚µÏ¨‘s¹wÏa€ºµD`3îºeÙËÃI…ÎC%GžjŠ/¤Žh@E@$‡ €…¥¥\Õ]…iåÒ)VD—º¬¬J8- ©Þ˜ˆ½zÀa§4£òž*{ º/Ü—ã¸åPª$4ã‰tšó|?9Œ.¾¯‡öQZÍÕ5)™ˆe` Û•¦Tx€M—ˆ2ýžô‘×B˜VOã°ÕÞ"Ÿ¨ïÊSZ=;J‹ dâ0#OMz¤· u—E\ðiÛQ}]7éÛL W&H’áãfâHì%Ç©Ó¼·j—6©žBü€…2”–t¤I1Í ž•R¹Ê_  +ÂÌ’»êªŒ>½z?ÞùÚ4N¢´ÕÙ‡P8½Ï§¹CÇdP¥„™'£ä;)1¢z$%z*Ó±˜¯Û6ÝnÖÀ©+]À•æ8=B0± ÂÇõ¨f™”õH@G† +9ÑÄT.=*ÒÆÂø–Q ê38ºˆš3‚ú°Ÿš³mME¿º"—ÌÔaÄÀÙ[‚HÈçNµÐÁÉiº0LøS§™ë·%VÀž×oߺ·o¯^Ú”®³ºÄÛ”ÎËC .íf{…ä?T³¤2^·´Òc¤+]…¹5\û’%}@4Ý:Éc“Í|O(ìõÇ<è,Gj`}nŠ*+vær Ö̸BR9˜‘ÙPå³Ï]Ñ·J¤ÒâÛ­÷Oî`í ¿¥ÓIÝñ½TøM©,÷Èä£çJgÏ?5Ë'.ç +*\˜ £¤‰Ø¹î%¸~õ—€F¶À×mf +Cˆu3 qþßê½Õ3™|…HX¾›Wíó™Óô_YìMÙX™Ù¤÷OÇ,ö’¾£`sšÄ¹=—©I3hÓ~²ØŽ®O} ?›)®A¢0îk«©êá7¢?ÞaH˶žp_gý.£þ˜4S`¼á ÓOÿfuøA›G’ˆùJ%bðXL¬Rx® º_¤í[÷Uÿ?ž> endobj +1262 0 obj << +/D [1260 0 R /XYZ 56.6929 794.5015 null] +>> endobj +350 0 obj << +/D [1260 0 R /XYZ 56.6929 418.3076 null] +>> endobj +1263 0 obj << +/D [1260 0 R /XYZ 56.6929 386.0953 null] +>> endobj +1259 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1266 0 obj << -/Length 3662 +/Length 3835 /Filter /FlateDecode >> stream -xÚ­ksÛ6ò»…¾=2x’àܧ4qrî\œ;ÇéMÛ4EÙœP¢"RQ}¿þv±Å—¤ôÚñŒ‚Ë}a±/ˆ/üñ…Ñ“©Z$©Š4ãz‘¯¯Øâ Þ}¸â&ô@aꇇ«×ïe²H£4ñâaÕÃe"f _<, ÞþãÍ¿nî¯C¡YGסŽYðÃíÝ;ZIixûéîý퇟îß\'*x¸ýtGË÷7ïoîoîÞÞ\‡Ühß ‡áÄïoÿyC³÷o>~|sýÛÃW7,}y9“(È׫_~c‹%ˆýã‹djôâ,âi*ë+¥e¤•”~¥ºú|õïaï­ýtNZšH‘Ì(PÈž9ƒ¹Š‰N£XÂ+Tàí -exý^™d™$‰;B¬³¦-va½©^t€4ÖQ¢¥r°¯®C)Ó`S·å¯Œ‰¢g!‚lwÍMPà,"»Ü›–ÖVõŽ–ˆ-þ·Þ nˆPólrÔ²ažxñû¶*ó²áR%‘,ù\zÞDÇ/ÚQ/BÉT ¨žó(ÕZX¬M±ûVì²Ï ~ŠÏU r-i¾oÊÍ“c’÷Å‘ t™hÇeV5uˆ<®æô®ÒHhå%-IÎNhIE‰ê 7õ 2ƒÕƒl¤jÂçNMø€jŠH+‚ÅQÂ(%d¬,ª‡çbFPÁ¢XpÕqtBDÉŒy®êm[Ö3ÁJ^h‚:¢ÙcAc³-rbw‰ :(Ý7í,+ìW$ÜëMn†¡#-¥ç¤i³¶Xƒà (%EGáð\æÏ4ͳÆñS¶4Ö`»rimí$7¡P2b*Y‰Žê7éiuÅ ìó˜E0 %âඥõ¾ZÒ”ÌZcUg1yÑ4Ùî…Ûš^·ûÝÆ}²Â_¹×Ï¥ãÈï —îméæÙ¾±vïš*ûV4rk4Äô@Ú|—5ÏÑij²ˆipúq2òD$q@aŠ!Ÿ‰$ÔÑ Ã¶›:Sç°/\3sž|5CpÜ”‰8ú³‡×€zRox/ ½ã¡;׶ÄMc¥¡Iþ\ä_pšZ›£—Ùº8z+X@ Ʊƒ¸ûLãý}S´ôuö”•›¦~þô†&ïÞ|¼‰Ü×õnU.@1D!†›œ$øÖ»O·ïÿCó5ßSAÖ¶`$9ºX!„$»„â&ÄL,4ý•iÖ­º¿ýp{Kœž3‡¼l‡Äšýv[“¹"þšèå5PæAf•„ôéè‚ÂCï7­ý€R@ÆxLìH Ê$ØWm¹†IË.ÄAb^›éàs½. hÐñB\z®Å7‚p+}iM-Ë€º*5ZàÑJv$;ÝÀÄë¿Ýðs¹\›¡,¢ò*1(>ºÓ§ý.ó^(B›%½¶È´ˆ¬¥Wäûpí¥ÞÓ’w;°vÈì>&Þ†’z`¹OÛn@4mYU´và09Û™cŸ,ÉÅ«Öű̢À…g¼†ç`¥­`}h{&0kÄ3qÒ?éT‚¹Ëø¼êCöO -µ+òý®AG;öM²tgIwP3´¾I -Èm؈ø‰,QŸõM(¥R˜^ÞÅ„³TX³NyðÎjž¿î |`J9,4mCP´âtà0ÁÞlžv). £Od5H©…p¸miÙ,.ÝH†/<’C½ûBÎKcVž˜¡}yæJš 4LZ&A¼æ`9À5ò“ʉÆ9ÇC/R›ÐÚ±=Ûðêná”Æäe')Ì—µµvxí?|PêlùBo¾lêÈ+Ǫs4\”<]›Ó£0Ž[—ÀsÖ_^A†“ ›-8Œ"¢Íz m‚e±ÊàÌÓCÙÌ&öI$uòLËÒyZGÄù#ΣhÛù„Ûp<ŽÒ¡ØõvA˜ùDYC„Ôõ—ý¶qÙç¢ðÁ§©gËHŽŒðiûªhóçð©ÚÏ!4*îí={„‚âtb"2Ê\ -B=¨3AÈCÙ3²Ê…d&l_¶Ÿ&É -?‘œ'ßAÍÐœop½Rèö‡C²ÄU vVÏ8‘êÞ˜éK¹sjR¯~òsˆÐ–-žJAÆéíÈ´#e#8Æ£óçµ— }šUµgúP¶ÏÄ åh6ü–üqÄU’O™í—ئxÓýæ­Ìúso|>s9:\Ìkf®N¡vï -3MÑ9Üñî»î’ÉÐéwô¾¤±­<3ßû‚ã—ð(f±>‹¾c€ËMýCT¡ç.”&Žt"Ò¾ÑušE!u •,”RðAJ'ÿ®§+NÝ´HËîä~ºc<ÀÜLTH¥Ðf¡‹ wÄ_~TšJ‚êÍ­´G-Ø…×·k±xWƒL‹¾XsØGmåŠÅ`ADÃ$2Ú‘XµKÅ_® -÷P®·•í£ßµUa–Nv_¥Ø‹å¢¯ß?·eÒÊ”ÉExì}þ9ƒ‚Ä+—pÀµðsîÈÇ PL0ÎzÇ -õ >#,—ᶮ«‰ ÈÐÊtÑG;õjJû äÁbä¨#g¼ëÈÐy§µÇ¦®Šv.²€Ò”ŽÍ°—8i¢gÕ!{iºZªÎ¡ds>q‡éí;·ÖË!ðP5'£–„íÑüRk§uf_<”ïê…؃ò®Ì›iÜJ#ÁŒ8Ï@5ÃÁ0naS:ÕCNP1ò;²Ü~ãšùê>Õ½bGwÅŽ‚Š½ª( B/¶Ív`Áey)&…4ºúGSÃp`ÿd¿©(­A4¾­šÛÆŽ]Ã2ÀúÄåj³à@'Žæ {²½[,h€œ ¿mÇÕ®Üþüþ~ø:£a›íÀˆ÷U¶#„àxàJx´7žæx—ÄñÚÑ¡õ]f0E8šÜB¹Ya“ýhju¯]9ã`Ï’ÔŸ°í®þV.6>\@Шxtïæz¢£ý…XU–Àr-‘É…ƒÕÁ‡ý¦f=Å;s¸¸1CÂ/ƒD·~boè\½ôhRÙ˜HcH4có½Zéà/14Á;ÑŠŠä$7Wèøy•x  Lpw7p®™Vê‚»éAq7j΂‡©68)åyêÔ ùá]"G'ߧßí~{¬±›|WöÎJ½š9‡P%1¡Ìÿs§gÌüÄ;ç¬ÌÃ_yŠ÷{Ï^Œo¯fŸ‡ºÄÆÛY[ãP.&Xµµ>Ôi[ë ¨/l¯!NØš‰¸†€t–z5C~hk2âŠÉÿ5¦6bljJ–ž65† —ÊyÎÔ<ü‰§x¿ÛÔâˆ'â¶wP—ؘ`;oj~žo Å#ÐCs@H®ÝYæTeMØl³¼˜8(­â³NâãvC¿€¥ƒ½Ä Ûº8§GÚ\;µ­\xÓfîÇ’lsÆýèÞ­²¼¬ÊÖÝ–C•UgKw;“Ð ,RM3* i»™È - ?ÝÝþìØ}Rm=wåánÑRt?û‚§§bƒw&d ®“Ë™ïh´¢ÁøîÓgš¬íÝšàÖ{Šƒô5vÉq渄٩ýç&Ssiÿå`ðÓ©ˆ™Dôöß‹³ôò¼v"èSl$ò¡®†½ÈÅnN´Bõ×ÊaÍV HÚ´ýÎjSªr3û«¾A«/Ï‹-ìô+Å°…£¹fcù´©ÝåøI/jÒHH.Ï{ÑÐi/êìÅØrY"?Y®võ:Ìöíó«î®nðÊ^fN -ƒq“‰³ìu@Sþ†EŒ€úkŸAß -JÕñw}Òví6äk¼ƒJÝE?¾y,ž³o¥­Sû«;f7‚€õ]^QÉh€®¶þòûTü= ö‡Jpwed]¾ÀNn‰6AP¶„ÓgûË#ûA§EzƒýD,^ci{; VuUÕ‡û[úÑ]Î9œwîgJ°]àËMú‰µÔþ.zf{Xw¡ó§~}ümºJ"iÌ™4ƈ4ñL¡$*sÞýN{ÊúÿR]òendstream +xÚµZÝsÛ¸÷_á·ÊÓˆ!‚Ó'_ìä|½8i¬›¶sw”HYœH¤"RvÜ¿¾»ØR”|Ó›&“\,±Àb?~ H\†ðW\¦:U]&YèPèËÅæ"¼|„¾‚y¦–iêsý0»xû^%—YÅ2¾œ-½±Ò LSq9+~¼ûñúóìöËÕTêpWS‡“îîoˆ’Ñãݧû÷w~ùr}•D“Ùݧ{"¹}ûåöþÝíÕT¤ZÀ÷’G8ñÁû»Ÿo©õáËõÇ×_®~Ÿýtq;skñ×+B… ùvñëïáeËþé" T–êËgx ‘eòrsièH)KY_<\üà èõšOÇôé4Ð2Š/§* +ÒÆÕr„´6MtÄJ*§e)Æ´l¹PËÝ×òeZ4›¼ª‡+‘ +„—þ¨G²-ÓˆlåÉQ%Âg«òjªt:á ˜v¾Ý^‰IYeA„®á§å®óMÙR³Yâ3™äë5ÚU¾»éÄ~ ËcÖDz.wyGÉä¹êV¸â’””°a «33üûí¿™Ë_ŽL!“Œ™ðÏUi—€ŸÀž¥I„QZA¦µ4Ü‹uUÖØeOhªßöeÛµHÑôé`N‰"¦¯L) Â$¶Lå÷Å*¯Ë7`Óa<©XÞ&¡F³#qŽP7ÌÒnËEµ|¡n£r¤e[9½~ØâYÒXñt~%„@½ÈLLî–DÞÒ-¬þ )H„!˜w÷Dûœ%,[f›áéºzÛœ™m¦ŽçÊX´æ%i)òU)bˆ(¬&»qòÂ+_·ù®Q³=G©Nx€¿ŽÈ€V¦,ÃÀ¿£Ál­¢ƒ%«>Á*wÏU[²–T"ÎŒ„§%ewB)Ö’Š]=-i :XKÐ:¡%J뻼†ZVåwjÕcF;¢¡0‚v¦Ïj\#ûß4¤ãlrWÓä7MÛÑÊy[¶oȳqùÇN4 "CõŒŽ—A¬…]I»jökФL3T<9&!¡-wO%8$•¿´D²A ùPúb–×CR^[c·›^릞–ß«¶3†‰Œí~~*›¬«¯%†^oA¿IEr¡ÁÏÀpâ, RG${É KÓt*ò.Ÿç­ý¬a8EÈZUÝv»«t²_P¡á1ülu¢™BK³xSvu±`·„Yóq°"u,½šÄK„Î Ê5Ñ°:lQ.óýºsf7‚ 1¦ˆÌb[Tn1Ü`¥RÀŽ€éu %ŸÉŸÆnÄ©?¤1‡ÞìT$‰šslÖƒQ…{)ávÊKT@ÙðJŒñ¹Îx‰åB‰›rÓvyP¯Z´§Ü%Ž ŠgÙùY8®‘iô&†â;²?ÎW¡ç0ø†ƒÏÎv[‡ñˆÂËq>vUgr ´aq˜6L{ßæüÝaÁ¥Õ¶Š8Az@¢ƒ„’QÀƒtÂgÈ€k$}D¥õÑÉ-eÙøõ´…¨d”õbÝP=è•E³wõ·=( =B GI¿B=®3!ÔrU.ö;¬OÒHcâó3p\#SèÅ `G ¦@éVk?Ýj¶jxvWbb9œÍjëZ2.´¢öú¿íñø|W•®#ï¨å‚è è^ënýB$®÷HAD2È–b#B¦}{ ]“}»ÙŒ7ùyíŠ +è(¶)øsÝFŸ êÄ?ü¿!Ý´ ÎÍ)d»Sß“†­b¸¬™=a“qˆÆ7È’ 69;S³¸Ú!„òDQ¶‹]5÷òÃÀ\¥†áC‘AI…Ž N¥ÎÝã%5¾x–ëø§þǦ{<.ÎÿV\5µ½hŽ(CªZØ? EoFGä¸^™Çñh烤8K_©@}®3aÃrxÖÐW/T`M¤Óø¼TÇ5"V NQS%VO.G‹tòËÍç·³wŸéÅÌZ€ñ÷›9[C@ã%RÄ‚-±šc1$±í–Õ“I^H2ˆ>­ G½¹ O_wÍ¢Y³¬]îN‹ˆÔ+Zãà‹ñÀò½<’°u§­0#)éÎð’I³µ–N, ¯5(ñb‘Óñ}7öðIŸwnŽ—ßtê÷7x‹…Áow©‘Ø^Ò'ö™+&"¨í<ͺÂ~Ücðê'R{^{¸±I~Ñl6ûºZÐa´Íòýð¸næ9 ª?iäRÇ`)â•Ôès6rÇu¸½œåSµ8NŒ°[B¨ø¼xÇ5"¿÷Ò Ì¢¬?Ý‹#Ú“[ð{³¤'D`2Åí P¿øœ3#Õ††b9ܘ~y&p;¬jé¹ÝU›|W­™\—eaGå+|³A·ïð¥€ÌÒÁ­s³Å[0fsÙ*ä¤Ý/Vè<`-=ÍM‰i;Õmn‚kKwŸì‘ðn/6ðe¿-Œa›±%3ÿŠŸÝQgìT†sË+{y?í´t7&X›&_c °A‡&ˆ O€"èÝ]©˜·çUe $Š:xmƒoþFrþÔ|’Eâ+žˆ}æv +(5ªBOžˆoûjG!l gdÉìÃPý/óŠ[™dbï–¼Sl¯p÷°wŽÅƒe-¿¯ò}Û™ªU%|$—ØÐaìÄ–!À{ˆ Þ¦®÷,iê¨( "<æãØŸ·ü«ƒ¨“Qd‘ïY¬ÐAE$‡ªù 3ÚWeVQÖÿQŠ¡PeTs›–»¢G=„™Í Ã’]b®üj‹;ƒe$a µ-b\†i]þÕÔnÐ,M:Z@¡÷bOF`Ø*Ëð,+Ž‡µYÕU6ð.šwéqO–ED¾nÄÈÞõ/âL»ËwÝ~ËѼ²y¤ÌŸ6‡»[ÍG¹8À~ÞâO›jœ˜Pè麞cîpÏ&Ÿëtp\éìÊe¹Û•Åô-ñ( „ˆ Óóò×ÈúY@)Dÿþ è8[]&s—½j²Æ_}ðo÷²å+`´ðkb ŸŽÈÉ5üacª=ͲWËjRnðܪ°Dï´a0]ä•@¤—ÈÃ\ò¢àx +a7ÈÔðh ÍÈZWëh[äö §4×ÎÚ-D¶’‹öÙ©Š¼@,Þ`g]Z¥“8d m™zC‡÷ŸîoQ=§ÍLšK“WNè}®3ff¹ŒÏ7M¿.ŸMÍõìÐØ(›“$=? Ç52ž±¥ +ÂH&úó˜]!jØaÈ—+*…p±½fcX”*ü€nrnŠ›ÐŸ¸!V<Èìç›–ØQÅ]³%òº|*×ü¹ù©NËÙ3åX_P²²÷8 ?B ìÉäø!ˆÌ­Mm}s+¿/Öû‚÷}&°IPÂÖ…‚øñ@å?`Uò‚;×ò;¸âѱÁœ{7yQö{¼XÝ<—‡ØaÏ Ÿ=8Mò9©ZË$jòÀØé0É‘dNReß}p9RxË‘ˆ¶‹ÐŠ°·¥Žœ^Am%gÃÞùxÓeè_Çèâ0Oªà£iR ä'œïÕÅý¿n>}¼¾»?­ïáÍSUØtÂqäÝýõÇÛᡨÚEóTö²Mi®ñÑøOJl¬ƒhü'ð÷åOÿöûðÃx>*Må‰s‚Ê™%vR¨Â(Î\+©LF¦þ_˜ Ìuendstream endobj 1265 0 obj << /Type /Page /Contents 1266 0 R /Resources 1264 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R -/Annots [ 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R ] +/Parent 1250 0 R +/Annots [ 1268 0 R ] >> endobj 1268 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [108.9497 292.4924 172.6404 301.7078] +/Rect [250.9056 343.4991 314.5963 352.9087] /Subtype /Link /A << /S /GoTo /D (statsfile) >> >> endobj -1269 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [293.8042 246.568 355.0043 258.6276] -/Subtype /Link -/A << /S /GoTo /D (server_statement_definition_and_usage) >> ->> endobj -1270 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [395.8905 246.568 444.6373 258.6276] -/Subtype /Link -/A << /S /GoTo /D (incremental_zone_transfers) >> ->> endobj -1271 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [309.3157 215.2488 370.5157 227.3084] -/Subtype /Link -/A << /S /GoTo /D (server_statement_definition_and_usage) >> ->> endobj -1272 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [305.9683 183.9296 367.1684 195.9892] -/Subtype /Link -/A << /S /GoTo /D (server_statement_definition_and_usage) >> ->> endobj 1267 0 obj << /D [1265 0 R /XYZ 85.0394 794.5015 null] >> endobj 1264 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F21 702 0 R /F62 1050 0 R /F39 885 0 R /F14 729 0 R >> -/XObject << /Im2 1039 0 R >> +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1272 0 obj << +/Length 3458 +/Filter /FlateDecode +>> +stream +xÚ¥]sÛ6òÝ¿Âs/•g" Aœ>¹±“K¯qîlçz¶´YœP¤*Rv|7÷ßo»€@‰R’¹ñŒ ,‹Åb±_<ð'ÏÓ,ÊŠ¸8Ï ¥B¦ç³Õ™8„±·g’q¦ibýxöý›$?/¢"‹³óûE@KGBky~?ÿm’EqtÄäõ‡›7ïÞ~¼½¼ÈÕäþ݇›‹iœŠÉ›w?_Sëííåû÷—·S©S9yý×Ë¿ß_ßÒPÆ4~|wsE‚>GˆÞ^¿¹¾½¾y}}ñÇýOg×÷~/á~¥Hp#žýö‡8ŸÃ¶:QRèôü:"’EŸ¯ÎTšD©J©ÏîÎþá £vê¨ü¤ˆâ$‹G'µŒÒ¢HÏ󴈲†P€ïÓ¶^âGNæ¦6e_µ Û¦~¡Ö¿ÛÆP«3›'³!ü²îÚÚÄÄd¶¬ê9áífW=;iZ”õsùÂÖm×U5Oé[Ç\o6« +(ØaïS)£"Mc»‘ç¥é—ÈVœ[⬘”M÷ì@³v…ì!x±¹zÒ®hfQ#Ü;¢ÑÞq„¸·°M8 ¼G‡!§ÅäîÃ% ßÜ1C #]ÝÜýíú×± X¦Ì¬µß9²šd“’ ØÉ'åÚ|&0³°ñYv5œAýUÙŸÍ#õhJ·n›Ž ÷˲§±YÛôeÕtn%_ÇJð®î¨_¹y„]öf>Ü)]ÚÑÒ„˜‚vp&)ñ,\h:á&ñäööîÝ[‚r…“½Ì°c[æs‰ºÃôz†v†«,ÍË®zôs,‚r9r¢¬ô‚Ô&‘•6¡´žÜ£!¨ÜöËvSõ/„Ù™ß>èØ;‚8t˲ÛÂûÖMbb¸ Ø›@̇tÌS57ÍÌ8$u¼Ó2uøíú 9©ìÜ”lTêL]UW8øB°vAß¼!’5MÖÂâX»fìxJÇ _o»6 ß:6ÚóÈSÒ‘”‚DrW­ªºÜXó¯”c›À±e–¸AȬl¨Qn*‡œôÌjm5\%p2s7ïw‘Š¦¥öÁU¶ôzú’žáäre`–$pÕ †UhÂG„ÃVs +HÛ"“?·fÃxýËzOxV¯°qyóë…”r²'s -“‰Ycuuÿ_ñ04¾(âÉ?=P[àÇ;üÏkZ—ÀØï?Þ]|-”%Ó½_Ú=J]uÌ“ƒ “#×Æ|^–ÛÕÒJáû7Jñ '"YJ‘F»Æ½ÁLˆÉ,9•G:ùžlÛ~ºƔ䀓ÌçY½GÁ~þ27ù›õ“on;ß\m;³]¹î°+OG—¦ÁA@'£\Ê ¾E¤e‘ ÀibQü%GX…KΫ®„@gZÖè–«nŸ©âHe"=̓Ça" %l\)©‡\\³(Û$“nmfÕïBÄÖñÁ/wׯi0`ØŽÙ¿VÑáÁÔíó—(â}Fýƒˆüý¶î«)N–FZ߃ÓY׆´l U™ERAÜ,Nˆs?Ö¸o7¥ë!NY™¦ç^†¦,}ûŒÒºÄÞ€xc±j;6~o3¶,ÞÒ?8bëu]±¹S2•çd7ú´’…XÇ•ÌcY©4ÄÓºm?•„*–¨(…>ÍÇaa b ä…”C~!C«bp:ý«‘ƒTiT $Ž²¼Œ"RqîŽqMþ#œŽÖ¡3‚ÆSYWó²·Ñ*tŸA/¨U2Ge 1HS’Í–“d휉´;¬œR+XXMáœf§‰‹ðm{$>M覤îV o×Ô ¿ŸO|Ì '½ÝX¸ +ù&¾‚HfC_ww³æíª¬˜Ðð.ÂtkGœ¦ÏtæƬMלä¨Bùûô'—C/³‚' ÇÊÕ.Eò+6ífUÖÔö¦ø<}¢¶´  ÔfÑÈÓød8‡Û6•è ¸+3ç‰N4‘è§äÞÎZ6³¥àEη:¨³²µAÖ±MyîꌖG:ÆwÈ%¡\‘ï&ØPaŽ-‰²5<º]‡Kgœ ˆœsœnøb6âÃY˜f„q +o ]‘T&0ç_â:ót»`³¹W[lcXÓQ&’Êö^òˆ›w\NóÖt66<ªÅ©î€DLÑ0¼%_Žœ)EÜ™ïþµà‰ÎaÍ/«Ù’šÈ.µ¬ ákMŽ”L‚ÂßÃnÍyàØi 'ß1_l8›S k/²Ž£"×ãÕ¥ØT›+ XŠ 3%HØuç‘ÒV1› ƒ£KS͸x×ç#“$ʵ”ŒÅñvE6l•³™Y£@r—‹w4`«Z¸ê„Ô¼„†÷ÂÜÑMÇ"‰À—9.Û±M³à7mõY‹EÖÖ"cBÈ2*’1Ädû’s›Œ#!ë§SŠ±(%…¡¹é ’»* ¢—ˆÊØ1“M´$­è(T\_AøÐÍïa4 ³mæ»fևǡ´?ú5 S4œ‡rM±0ëåÚnÆYé,Ußÿ¤î'Mà­„áæ,ÈÌKMe^@œAúƒ:)eê‹éN_L¥ú±mkSrvü³·#†/Ö2Šã$;møB¬ã†ÏcY±oûå´ù̇¶oðâ #1yzy5²þ0n•‘` 1y¢Š¯0zw“’XòMBýäØã0†tÛYˆËË1º:J3oDœw¯œŸuUt¦´§Å¨ž˜e®å23hžL3 Øë]ÙŸV£ÀI¤r½—F“M×jàn÷ ÷¸Ò –¢$ÍœBüÎ7Uc€¹(!ÄŽæöÄ.Á¾ç:;ނýà¤m¼¦R¨e†>³eÙ<Z2(AÿAK[F3aÿ¥Ý2 oœ ³íÈ„¡'¬‘| +H™”ØóH­«Í]ÙçÌÛEÿÌä^ˆVÁ ³äœ³1û‘É.|éýÀˆÔðUHëäÔõh€Ž5´øÂ=°NÜs‡eíA70>m›©ù\õ‡I*šÛBæÁc01¬ƒØz‰rÁ50,Á®Ù[a&OÎØ@ÅC»CM(¨Ý-5MÃ5WöeWòqx¶fÕR­QBòR~r‹3uƒ-=HZˆj#ü„Œ‡*Åï•'µ|­÷êá~(„JwOn¶m6ÀÖj•µêƒÔ`± —:­!Öq}ðXÖ™fª®¯f‡%10‚™*ŠÓË{¬‘õª'Q–€D ü‚O¾*ù)òƒ'k ºo¶ïŽ›Kž‚A‡=ÿBíE!0øð2F +é"s1À@S&7ÄÏ+wum°Wˆò7¥ØÈxgd«Q# !A¥q¬‡áÛ¸±U‘R>îÝ6µéX¾›®ÂÇ—©}·÷"2¬Aì4§íjåõµ®ü[†»šœl féžbª]Rw¸=pQnþbÿãÚ¯  Ù¬aˆuBû•1Ëû½eu ™ÈO/ëF– wXÈl‡.;ëÀ%ÂÖ·¥Jô¨‡$ WŒ»_X {#îh̾©áV½¬#Í~„Ë~²s½ž·Ö²ºÉŒ»taaÓ;aFÞ½s¤ Œ‚F‡37VË(} ¢Cf/t"Ó$MQ ?a¼¤c§¥G0hØ*M +)­¸}\ö4àæãû1~Å¢pÑç@|ôX5pçqCˆ<£á 런Ţ7Ž]Ùr›W–ü‚#›~,¯1Œ3ëí#±ÂDŠ/+1 [–/¿µ"Ä>ŒYt[Î’)>´Î` ×|¤{–ÌÃ(¾ÇHÐèZ‡KÑŠêUHØV½ ±´6¦iŸü`µrl/Ä—öîÇ\fié+ê¶vAl¤_XÕõJ¼4å¦õœ:Jc–7‰tªÜÝ`3O–íÚ,¶÷Bw¾Ý°çw5iË7f°Oëã!ÀdÞÝoä¤Û®×ìÏ;ãbîBCÌ'CýäwÆàñØ›PŸ´>'Aå­@ùÁãÞÑعcv5Î “Ìõׇæ\²‰ó’©$> Þ¦G²‡® ÿÖãŒä~%Ž´*\bì#ŸBs,æ€D\Ðï ð»ç¡5¹¶^#¬¤âÇÄ-òT™çNâ4’B§‚ŒnJ'>:·4BBøLäOV¯ø·Ì«s‡À>»CÜHOßö‰ Wib|?É0RõhÃï'¡=Öíƒ×ÿAý(ä*ÿŠóH2=<èØOç’4Âß»¸6áèÿþYÝî7‡*­ãq' ©m¤4a¦}¥£þýÝ!ëÿf ^‚endstream +endobj +1271 0 obj << +/Type /Page +/Contents 1272 0 R +/Resources 1270 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1250 0 R +>> endobj +1273 0 obj << +/D [1271 0 R /XYZ 56.6929 794.5015 null] +>> endobj +354 0 obj << +/D [1271 0 R /XYZ 56.6929 333.8409 null] +>> endobj +1070 0 obj << +/D [1271 0 R /XYZ 56.6929 308.7186 null] +>> endobj +1270 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F48 950 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1276 0 obj << +/Length 3312 +/Filter /FlateDecode +>> +stream +xÚÍ]sã¶ñÝ¿Bo•fŽ ñE—‹}u¦çkg:i’Z¢,6©ˆ”}î¯ï.° A‰’®éÍôÆãá +\»‹ýØ$?6Ñ*N„‘“ÌÈX%LM曫dòïÞ_1‰¼½ŸýöðýÕõCÇKÈ/K2òÇÕ/¿%“°ýýU £Õä~$13†O6WR‰XI!üÈúêÇ«º ƒ·öÓ1ù)¡c¥y6"@.²`™N2eâTÀ+àír ­¦íªpÀ¿ëŠ ²qÏÜ=6yÓ»éÍ,’Ìà‡ÕÁM±{ö˜/åzíG«…ƒê};˜ùîãÃíÍÏÞ͘ž싆pÚšpý<ý2ëü¹hp @c±QŠ[¦~MT²(–ù~ÝÈ`SS™LV–#e¦ÍªÞ¯‘ØêvW>=Yjñ‡’@ÀL™¯\í7u¾*æ¿»éÊêàkK™‘”­eª~.eõä†Ë–0÷Ûm½kG¹pbAœÎê;þ²‹!@‹Ù±Ú=Aúåò`iz<ÇB/«r]Ì2¯«ª˜·e]¹ß(*»(Œ= AÁP‚~Í¢u@½ô¸åMGÆ€gª°ê|åü†‡ zÐœóœhxìik×ëbAï^q Ðpj¸a±ÈKãŠUÝ¢^h l-M¡å —csÅBeÒ㬛::9Ÿ41W2#ÜØrq«H­A +Yl×½ñ”“à mÈJž9>X·¯0Rïܳi÷ýWoTd€ƒ9½"ì ÐNºæÌ«i>pÃOûuN_ýʹì)Ûo ¿vÏEÞˆA¸ ân‚hL—´æŠ49ͦ`Þ»²hÜ¿êjýê m±[Ö»ûDôBœÚ±‘-ãŒÇ~Ð>¬Š|×>y•x®g°âã­Ó2N¯ ŧmIÔºuJZ/_,J² \½vOôhh´Ý)ú^>TúPÓ×ÖĤݸ)+ë]¸ UžÐ(@£ sUÏhvôÕ=÷ ôÍÔ¡6gYÌSyÙ2 è,|™„&‹»ÍA¹nØ9n€7 UùSѼ]—†Ð®î”s +lD¹Î +, äkV/¨Æ™NÕ%)ì™`€‹*vÎJ¾fA2Ä—ñZ³Ì\ˆê'öYî+ äk¶H•d–^ôÿ‚Ç:¥ª²é?/¶³†ô¥äÖ·²þ 3Y (JÀIZÐS;ê­ üƒë‹¤'¨™>ßZ“¸´Ô¿©Û®ËÒg)}öÖ†‡Y{Ø ¦œx‰HËbÞží‚p(‘  öNyر^ÀÖê,Óa×bÐËñ(Í —ÖÀ›9Ñ»%¤(Ä:Ö\ßí°lc ÿ½ˆJ,9ŽÒ6&tÌR“_¼ÃY}˜ ³Tl¸ú-óQ³XË©ÆÒÃHØ-+ylTn©è‡·E…å½hÊÍ~·n«|O±êǦ^vßaø»»à˜´íë–ÞÞþðÓõý RÙŸgŒ1Ø€=jj¨@1Zâ ^ª +×ßÁ:¦ö5L0Ÿë¨‘uuzo“4fI’^ØÛëÌÞz,»·E;_EOë}q¼µ | +¹ÑÙµ;¬‘Å[+liÈ ®î:½<Õýb3ÇÑaS3N`˜ía@í)µð=Œ€A¨Ž’Y$TøBa÷Þ~3Ï÷Õ XƒZoYЫÓÔXÒÓ¼m‹Í¶ »MÚ­H½¦4‹µ0Cp´p£©`jê½æƒÑymŸØÀAìCãsQ.ª¿¼r}G€¨áм®šv7ÓÓýœ´Þxðí1ëÙp¶¼ÍÔt=eøa›ÅÆLó™[˜ºˆÇ:‡´WøÒµ„›rQ¸)Èæäsú ïó¾™`£“¡QC*Û“#ä&½à C¬ÓÓa¹-ûfaÓµ‰ê*jVûvQ¿T‡”pÍ\rsž”k„–A ³á€8$æîLGj‰ ÈEóMÑëÀ‹âSÙ6îÕb_¸1Ò°¢|vçðîÇÛ÷×÷Þ8bÒ½ªi¦EM+`˜ ±¬ª /Ó|¨yõJa“:°‡»²-šÃC *;éùc—” ÙÕÍgöäÐ=0§F²>Ë)ʉ… W$:–2»à”C¬3:æ±l‡..Ö‹h¾.‹ª=Jú DÆ‚³tX# ˜…"²+6$Î಴óÌ¿ä4XÎØ´EšÔÚž3Žo¶ëbDÛ~7ЗΠÂè-:N°(~Χªîü<Â"¯‡Ÿ<$Ôzú03 šN÷$Tñ Óòî¹¾{ßµ¶<«EAmÖ¢KÔÜop|#ÊÆQ.]š6²9*e¸LöˆŠÙã?'&4 Ÿ6ÛbnÏ$·/µo +oó]ÞÒ°Û—QëØ}e^ó}»ŠªO‹z“—cÁ•A‚}p 2N6ObÉ;»;w çcén9ç Y¦SlLXP!u²:Õ"“Rù^r ñ­È'’CÁJqÁñ‡X§²Ã²û^7mÔ´§5m9?6J f¤Syž€k„‚¡QÂV¤Y6$Áf@ŠÑѦŠùT —þR€ü½(¶äv³iÀƒEZÚSKüôÙ%¿"³Ã’ˆõGÐbh*Ÿlò9‘G’Ç gÙÁ™IÙ®ÈÛßùbià2ì@u”œÞm–Ätçw;À:³Û )E[iá?*?¹†vô˜7Ç92˜ºIåy2<Ò1†A@†¬èð©•ì3d€Ý˜è«˜‘ŒVÇ*KLÃ"ÁÙô¶uß[?Žå¹8%Mí¥e–[ÃÝU•a7¥ ÝSNPˆû‘»G»Ë«TüvG꺦sW¦8R$4ÂR"¨ªÍ£rúÀm5wñµÃ¦¬0øO—<à5‘žŽÁŠK #“–Gˆ+Ä ÷ð[I åîáiu„ÂjL¦)Û„_Û*}°(šýv9veâµÞû4Õk±¿âAÇWt cß>Õ}ßàˆ¿ArÔoþ¤mߌž¥§&‡â»Û^_)œÚŽœËAÞžïžL~Ø¥äË,c’ ~6Ä:my–µ¼²*7ù:ÚQÅqìi3 ‚òy:¬†85æƒ"n—#Â3sêô3ººÊüÅ¥|ÐèØÎ7&T:¨±‡BþV^Ö_ÓÂ/èŒAUç€ãÊðœ"Óå{:Ñ7Â~ÂëT¹]Õ”ãÌê»zL°aá(¸/ó…cãƉAa£…ŸÄ‘å†ýÝŠ²¯…»™RÄOÖÆÐÓ¬‹'Û±ª/˜þ¶Õ®àCY¹{cg‹ÒMþÚ…ºáux«Š.²äÕ¼Þ—êoo¹M ?s±\({‰’_ æ`P/úó„3f`1;eÍX(!Gs[AG: ÃÕy:¬ +̦i,2¡‡$ÐŽ™ Ÿ°‹&õ± +†JzE® íP¬®ånàè”ýZ,Ê_Œêð}'Eubp˜ïîÞ~¸vÆU’äXM…:vlp\8ê8Ÿ>—µëê¹a«QÜßå‚×täx[ ì,§9¬ t)¼¯CT/ù`¡|ý’¿6~Ž]éÊ0|STËšzJÍÁª=KÉ!/zºï2ÇǺ] Ó1­a(¸y‡Ú5m¯ ÙrNÑj‹—ÏšøÔÍ[¡b¼.;¢EÉäâ×çÞÊí¯,C‰(´>q/B$¸É> endobj 1277 0 obj << -/Length 3827 -/Filter /FlateDecode ->> -stream -xÚ¥]sÛ6òÝ¿Âo'ÏT,ðóÑIž;mšsœéÍ´} %Èâ…"U‘´âþúÛ/€¤D;—9ûAÀb,û ªËþÕeœI®óË4‚8Tñåjw^>ÂØJp–i9Æzsñý;“^æAžèäò~3Z+ Â,S—÷ëßI ƒ+X!\¼ýõý»Û?Ý]_¥Ñâþö×÷WK‡‹w·?ßpëÇ»ë_~¹¾»Zª,V‹·ÿ¼þpsÇC‰¬ñæöý Éùç…EïnÞÝÜݼ{sõçýO7÷þ,ãóªÐàAþºøýÏðr Çþé" LžÅ—Gè„Ês}¹»ˆbÄ‘1R]|¼ø—_p4JSgù§Â@›DÏ0P›3Äy_¦q$†¿mm}µ4J/šnË­fÿÝÖ¶›jÑ컲©[†‡+•-,wZÛ vƒÜøþ]”öT)Ò"­¸Û³miB˜VAhò\pþãvæE×vSôU0%{×ki0aõöðÌRÈ{°eýè°Û£ejeÚ†zÍNÆû%Òs¹T¹ -t -¿*ÈãX!ݶ9”]Ñ•O@ŒŽòźè -¤±`àßMm¸jê?ÂP?ö~C/k` Ó¡ÔÚÓ=à™¾;)Öë]T< ;Òœ0/<¼ã¾zfø±¬dKç §'C2«Š(Ì‘BüÍ}K|Cì À_vÒ@ÑOù“3+Z­eññüLðªXm-h]Ç‹Ûšam³“ѶìúBŽ§•­ÐÚNÏÃV ¯×¶-ÅCe£&4‹¶_mq\1Í4‹# :Bè ,À8ÀKk¼¾•=NóÄç4Žd?ð´UÇ”Ué&xMÁƒ ,QÊ¢|ï=BÅ̵UALM¦&ÙbW<3ìAÆ@\èÇp€íšu‰÷k¥ÿðÌ}Ý®ð’;7\% -d…}qèJÛÂ¥˜$Y\WmƒÒ v¯xjÊ5‹Fâ®0A‰d;@Œ†þŽ;s¹»LO…;SNÈ`Dä`íÞyì÷üË\ãáfo^0pÉŽ™(@Ø7m[‚0Ø~ÙÛº•!ºª324YÒÎÊ•Ó\¾¨¶©žDߎ[Ú[M_­E+Q°Žek½êÑïž5à©ä»HYÕ§j/Ê8štD`Õ‘¤w(Tà(àlÅnOò®CЋ B3´Š8(V›Eû¹åÖ†§¢¬0à—ó¯ˆuã¤q6nŸmÓvbØÕØf¤YžŠÑÞ4M +Ðös#ŸÓIL&øB6I-îB¬À}ÏiAÂ{‡'ú¿÷€oŒOìšÖÑ ­Qg*’ñÐI.TÈ¿»¢¬<éµífHW†ØAªgØÀ†eVJ±_!µÜqÎzjx¢œ¹—hИQ4!4HFgkìÝØè[?Ž¿Ñ$z¸aYòáqH¼$úИ}(By¢™†~–Y<•öØsèºëìnßáuÌ&]'¶`kw~è\(T©1¯K… ²Ô˜c‰/«àFeý]•›g‘×™] é¬éÁ®úCËá,2»iœ)\üTqyU³qK¾v€y)1 |¬¯‚ÌQ¤ ™—¦Së1¨O,æ -Uó(ñ†Å¡æH:;0Å£ób_cF”™J\:0ˆürshvK -°0ÌÕ/\†J•(g‹„’Æz¬±‘ÓBh0Ç"-õhd²['Hµ[Žõ2½9fÕäŒ"‰ƒ<ͦ\d}5 r®ùÜïQ…bˆÑP\Êâ‚-Wq19¡0Eä)qú‹é)ÅÄä ¦”ÁP)«÷­p~"EÌ>3B"¼Õ¢Éµ[N§æ´4Š‘†0{ìœÇÑ.£™`!ãד,(æ#±º~ÛÛYkÅy-9ö–Â`:•Ó"Òšù‘`‚1æƼ`DVG…ƒÄxky’0øì/‰…‚hH`°ÍvÚ8sb"E‘ -J[°E܇ßQìÅ€)ÅÑ”b‘á87ªFé Ë¡ýªU5/YÕ¥Ÿ?¹½-ƒq‡ u3B~ŽPL% æ÷skŒ %Gæk.ýh÷ {•LÒ®Ü%ñq9šÌ춌pwóîÓÇ›†³å£‰[—•e¢‡q.ŽqΘÕÏ“L îa'v¦eÂæ„÷CRèyOfilðdc‡øW?˜[ŠµšÃ‰ÉóYf?Tz„¤Êà¬Ø¨‚T©ä2RäB‘~¡8ÈHË1×ÕLqÕcqjÑ­¶Ë]±ßÛõs ‚å1 -ãf“ůÓá±f™¸ï4 $‚SJn7sµE*{¾ZY„X 7z”tšŒr r­œ›8]Ü~xŠäœ<€„‡&©DƒãŒÙ#X(B´â):#qD9k–åSá«Êí@¨ÐرŒ›P‹?A°ÛšlQÂQ)Š”†ƒÇc0ˆ ,²%Ñâ¦ûâ19WAÌfa ËvÌæº+wŽÐœM_ÍY<Ô”öN–7!ÈÏeÝáfû `×R=)aõè±9|æë gùÔçŸÏöPÛŠÛ¨>‚-¾Z¤Ò­' âÖýÛ2ÜÔ5WRÚÙ"›˜Å)-üºôö8€3ÝHb¤Å")©éÀ„ÕÊî¹=VV%Q‰éÁym³úL‰@]y5Æ;eQ£IÃUYâPÌçäÉ]ÎÂÉG’’,µÜÄèî±&q†çaIê$Zäcp¨(+®ø9-ˆŒõ={ÑT8h°'N!d/â3ÞˆGOûþ°oÜ:ó…\ˆÏWM€¬aý¢¹3: L˜™×ÍÝëesç±póò ûxöˆërƒ >àÜêÅ:ÓȼNŽÇš¡gb§â4ã8™ô›w廧sôÄúkO*Qî2R~3‰S1 `¦|HÀª)(œˆ©zˆÚ¹aßm,7? í -ÐiY‚õGQÀËN&1‚IEZÏò[—Tï"W½‹bbã?Zþ› WÐqw‚m±ÃQì,û°B´Xm‹úÑÊ«B6xõérve×9 -ÈPÃïR‰¶cú‹ìƒ"ÑòÄ¢]þD$¦µ³±HÌ&Ÿo0 DY¬ õcC½óU½ é‘ µÒmø÷A†Á¯¹Å‘#*HïúòŸrÅ#ôV„>Äø73T(1ÐØn…0ûDi9Ç…c¹¦Ô14 BŒ‹<Ìð¢bBÎ]èVzûᓬP dgw ¥lÐÇÜö;ç7Î÷‰œuá²F”äôHˆôJ…‚ïR¥X~IëЃ’ÖaÃkv¸ä ¹t¥ýõj)2Pò·¯lÇ¥€Ø zÓžâÈè‘3ÖþS5¦=)ƒŸ q!ÒÓcæÕÈÜÌh %¹,óðõoË)['Î/qÄåWBCŽeÍÉ0qXQሕàH0w¼ÞÁ½m“|Ïcú݆"Q>s&-.Oò¯çv·oÅ¡tµ&T®Ù?.6²x§l÷4'Ê@Õ'¾T©,ñÚÕ±º`&‰>Qó¯ 'N9ÏH°½WæÒpžJ4ÙÎlÇA¬ãÄ?õRœ/lL`ò$¹û™3D :u©»Ç™¸! t蟃Èç©{ÝN©Ê>yàOG…aèTöÉVÒ>nK~ƒO]œ~NÔŸužœ„ßÌØ4ÈR¹Ûwï¯CR2κ –»z²ÂGC/ó[¹N܆î‘nÊndI}ÝñøqÁ=õµ€=¦/TŒTJ¡)4*\ÜvÓbhÃì‘S‹ȇ3/FÑ*ÑR*}=Šc½E{,bìZ.ÖM‚f³¼º»ÇšÙ~4ƒ.mÒéþRËã«@‰–/&”X[hÈç ÐznzÆÙÊ7ŠÏ°¯\ÎÒNžâ8GM|Êè Ýð¸w’Ú1ȵ‘[|̉Ôi245Nô­>X¯¶`¬éC<Ÿ/€¥Ñ¡2ßVÑYJÅÔ5ïã>Êp•¬Ì=÷¤¹ã^æªWU}ËÂMèwüÉF(‚|@t‰¶ùÓX˜h=yqV$2S$8ñ_^8RѨ÷Ç#ç¶E+êrïêk¢^yf*J~Ôe¯>ö 1Œò¢~%ÑF}%I!½¬]‰D¢QZIåL»@²Tå¯îí‘Î7ŸêVd±Ñ“Ýoj‰!²lñÃûoÞbë´{pÍP@º Þt¼øT» ÎD³|þ{AßÆJý’›Ž$’—ÜŒ_²H㲜k;H׆û¥Ð¹nŠ·¼|‚32i|Z&r§±ácÜùÉŠ¢ Ê’o©V/}\j⿹ÝÐKçÿýáéðUn”&Ë^(×BDç‚E„($<Ï•B¾P='ý¿L+•endstream -endobj -1276 0 obj << -/Type /Page -/Contents 1277 0 R -/Resources 1275 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R +/D [1275 0 R /XYZ 85.0394 794.5015 null] >> endobj 1278 0 obj << -/D [1276 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1275 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F41 925 0 R /F21 702 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1281 0 obj << -/Length 3465 -/Filter /FlateDecode ->> -stream -xÚÅZÝsÛ6÷_áGy&B € ÁG×qrnÇ'»÷1m‰²5–IHÙqÿúÛÅ.(P‚äæÚ™‹g"p±Ä.€ß~§ üÉSkD¢‹ô4/RaiN§O'Éé=ô}<‘Ì3öLãëû»“ï>èü´E¦²Ó»y0–‰µòônöËèâoç7w—“³±2É(gc“%£ï¯®ß¥ Ÿ‹Ï×®>þ<9?ËÓÑÝÕçk"O.?\N.¯/.ÏÆÒ ï+áÀ ®~º¤ÖÇÉù§O瓳ßî~8¹¼ëçÎW&'òŸ“_~KNg0íN¡ kN_à!²(ÔéÓIj´0©Öž²<¹=ù{?`Ðë^­_j¬0*ÍNÇ:6ƒ1¢«œˆÄÀªsSˆL+ݯ²’±Uö\¸Ê³ºm«éø¹\.fe·hêÝyËÌ•åÅi8øž -=WDè óD¨´ÐC%.ëò˲:ƒIÊÑûëÛÛË jZ¹çÿÖåS5Ãý´ztÝtê¼3Y•$"Ë - êÓ¬H±‡ze¹0yV0w¹l–TU³–š“¾°¢mÕõnÀÔŽµ‚­3°2RÆ(7îkÕFd«D¤J§,Å Q þVó3iGójÚ-ž+˜³–Éèî;gÕ¼Ü,;zX´=¤*À¤üàqd. -P—yÄò^¹Ì„Íù®#ô\Áæ”ÓiµêÆÕ×Õb]ÍöphS‘)£«ÑsEôLÙü’,*rî4€5ÖräÔÀ¥U€ŒÚÅ}]v¢µÄôòPÕÔû\­ó×E}O=Š¡=|a Ém!öö[ˆÑ-ç PN2%Òµnb;É`ó;éÐr[uS AÒ=€ ×jVdXŽÊ ûU©0‚?DXVåsÅ/8«£æófYWk2Úð}šãjY¾ÒsÙuåô±=©,Ggj#*`: (Ï„óþϦZ¿.›û=©L$‰IŠí™öåVZ'¢°Y>|»ª¦€˜{š"6º‡jšT":(vOÛíC³YΨí,xÛ®\wÕ¬¥¦–_~| 9I:±£«yÄýi ë"¥GB¸";I5„ˆ0ÄèÀšŽE­ª39šŽñMpjÅ4ÍvÜÚâ×$QÕìGXU÷-jøÙ# úÙ“Çb7ÖUë§Eíáõåug€OUO™ÒÌwXOË®ºo@fde RYÝ»[TmõŠZ‹Ühõ–WÌ´âô¸Ž€Øs¡ÄéC5}ã®·{@†MËlñ†ðž+"}åÔŠ,OvÄß9G¡Ó¢wšw i›Ö¹E6}¤ðuëÅ´ãçâ kúP®Ëi‡¶€ôÅÀûð†üÊ$™G7/@ÜäÌö{S;'Ÿ{{ʃ¸„T—†¨µÊÉcÌËÅ2‘ŒH iƒˆcÇUW`pEî=Q»„ÈË– $+}¦öWhþR®ë˜ L*ß×Ü )ëö¥Z· ¾ r½³Žpë†àA·´ÏÀu1x8'&‰¨,•‚tÒO{Í0ùsWNx·£ÉiÑœq <¤ÙzHÈ^šut' -¡u‘‡òÍÁ½&¸V@啳3Aᙂ5±£3C•éÑÜ­&—Õ}¹$ÚCÓvlßØãÒŸ_ŽDž€‡`£àðå´Øð,6ðM>\¹0Šß¬™‘»ôÈ*ÉByð§f¶Ǭ’Þ0XÑ0Ѐ°«EdY¿&Qÿ¾[(xë ’ÕjI¾ŠVçqsÍÎÍKí¼мgDêœ~ÏßQ×9ü# -9] }ú©ì‘0±È¬]uÄÅÕ¾¸UC³©SÃm½Wy°RÞm«¢wÛØ$’eTaòž -rüïœH.ÄÃïõí;b¾ýÌ=´uÐÀ àïþR“¹ 8v7×òp²™øGt¸¹› q C÷rW*LÙzPÂ#  Þ&lâJPkQϘ­à„$îiÙq‡ÿåQKú¡‘¡Úhy€eÓàõ¦DOèXXít(¼¦'ÇyUÏ8C[pJwu=>ÿ~"Î'7g…rØrä›l—äL›»®®ïÐÌ¡RH+%„‰ã9TÈu8‡ê¹¶6öôu¿°B¹:.¹çŠˆÖMs› e_ l\”F{GLÖ‡¿C €Z•ë–ßhBÆy?“Kú¹ºáÇÙŒ3W!ÈÂèÐõkN¾u|1Ì’ ”7I¡¾5D‚´Ïnª‹\h›î” «¦m}éø\.7¾ÂôÎ<±!H­y#×È¡$S>n¡“ˆÄQZ&×ÿCl‹Wg0Áü Ün™ŽÀ–™¶¨}Y,gÓr½bR‘§¹9*¼gÚ—>ÌÎ -H›­ˆ§Ì_ét{DmOÛ¸ô}F‚ð;e¬C“bºÆ²SYçB;PxF½ÖIÊØäqIèüØû\ˆ¦ ·Uv¬~l`W p…ñë !¶!‚-Aù—òµåGÏB?l7d"ðìTñÝ©ƒÝ¦wíŠ-~75dP”»°¤¼‰C#œ1QžÊnú@uªS ªÔE÷ðDÐEcqÅ2Ñ)ùP<öÕY‚Ç8XMQe\È‘¶¯ ÓeËýõ¶NdŸJçP"ªã§ˆ©(Rm‡‰'†zVÔ‡[h:¬`ßÎ^C×+>µT"“ÆC0-ºKeÛ û”’~ÐkÁR´^(#D.SsÜ|C®ÃöÛsm xQwÕ=ìîë¾Can¤9®@ÏÑ`hÃOÒíP…›j «ëp• Çuˆ–-”3¢!¨µÕÓ±8å[êrÆ¿DØïA„ûÆ®8¶oIŸÄÕ…8Åe>vÝNÎŒýƒ·™VMÛ” -ÏEƒÈ§5¤Tù†šA´#VDð95©Â—.ó%<âQ”k¯;¶î—›ê€ŒèÕ×E˯®5$XÙttš½kÒ½5ÂQ]i3Z1›óŠÁ¯˜£îç›ÀÑÔËWê^ÔcÞV ‡…Ø;.ès»årNèÁ›{ùͦ7ó~˜<&’ÿnÚX°†8œHéã°;·;‰nÔ}ÏaaÄD™Àst)¯J"GxD£’ÈÞa'Ï?Q}‘àWšeóBÔ®Y1ãœ<9hm%‘Á¢$*X|1X‡ÜŠBêRÇK÷ÇZØ ¹#I¨× U=åz±·hZÇT@®bþÜB¾ýÁhx€$Ejå7xúƒîUR$hßGÝkÈuؽö\aV?žúÂeøÁ26M³ãò{®ˆƒ¹âq±2ÅPƒè™{!ŒJüñU$쌌 mr¼ƒý¹¯ŠÊŒ$L;Þ‘A¸<œì”íÕe°½eöYÜS°c¶°”°Åf _\Ÿº¼å£ 9¡5vçTë ”ü‡ ¤´È³>/ÿƒµÄ!PAÐÐ*}#幎€Êsm7¬]?E•9®@ÏÑ ‚*;Táª4”•ß‚*ØH¢*³Œª¬ð¨’GU®=ª€Hçqvˆ*xm„ sZ™õÐê» Z(±!ò´ŒÜÍßÿßÐJŒ0øÊqh\G å¹hAÍ‹‰ÿÞ·œ KÛì¸øž+"˜ ‚Wüy¨À?ù#b6ZQZÈßóAî—r^о£>>6ƒ–OÙÓÞ…ÑÏÇ‘9ÎÙ¥AþÛ$í(P·; -ÌѸCÙ«ÕEäÁÀ™óÆN†\‡w²çr)[µnÆu3n›rÜuËýÄÌ¿vU çŠh0ÜKp¹–Cx/¥ÏB» 9»j¹é°¦,ñ¾’ðûÂ}ÿ$w?s!ÉÙ(Þp¬@ð_E•œ²=ð€ww?…ýÇ à”ÛQ¨\ËíÃ+8  ¾Øý|ì§Ä‰S‹wavo.üNg®Í·'< -VW™¿&å‘f[èô à\G€ç¹"ÀOËéÃ~ŒÂãGq\ž+¢ÇðŠL - O.‡Šü$ä"¨‚³Y¸¤m‘†O!Òˆ w {˜Ýá é|AimØpÛmŽÂo{ Yí5Òý^;ⵌTÊa½@!2Ùoí¡k5ÐÒoí¾-„ÒRßü€éðÞ{&Wc­fPARÞ?~lcô¬ÌŽ‹ï™öåï^ÏË‹|¨{å?³ÜWx÷‡¯io§Ð=™Ü^}l‰8o–P€ñAWáNd€úó b¹ „ÝwçšÍy˦¸®r{9Ò‡§¿ª¥C_Ã_uÌèÇÛ)yþ5ItyODç> -³åz}ûã忉q2áΆ~ûë)Ô½˜ûw]j­Çꕺúë<@üÂ#ÓU ÅøE -/`µ£‚[>+³ý‰¬ÙÎAg#OÛ&k3î˜SG|ˆ‚Çm±‹ÜLˆ“ ù¥é¨õ² VÆ5-“ "f*Ñ`‘µø@7¸ûàtŒ˜§€Z[ý)ÏëÏߌÀ»´ì'ý­¸?}ew{Ÿ9ÅVÅ­H'P8áí -V -7rWs£­0VåÕÿ ƒ^'endstream -endobj -1280 0 obj << -/Type /Page -/Contents 1281 0 R -/Resources 1279 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R ->> endobj -1282 0 obj << -/D [1280 0 R /XYZ 85.0394 794.5015 null] +/D [1275 0 R /XYZ 85.0394 625.316 null] >> endobj 1279 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R >> +/D [1275 0 R /XYZ 85.0394 613.3608 null] +>> endobj +1274 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1285 0 obj << -/Length 3124 +1283 0 obj << +/Length 3798 /Filter /FlateDecode >> stream -xÚ¥ZKsã6¾ûWèªj„‚äq2ãÉ:µ™ÌzœÃV’MQ6k(Ò);Ú_¿ÝèÅ—ì­ÍL• 6@£Ñ¯AÉUÿå*²Â¦*]Å©Q(£U¾¿ -WÐ÷ã•džgÚ ¹~¸»úþ“ŽW©H­²«»Ý`®D„I"WwÛß+”Xà aðá—ÏŸn~üõöý:6ÁÝÍ/Ÿ×…Á§›^SëÇÛ÷?ÿüþv½‘I$ƒÿxÿåîú–º,ÏñÃÍçDIéqaÒÛëO׷ן?\¯ÿ¸ûéêú®ßËp¿2Ô¸‘?¯~û#\maÛ?]…B§I´z—PÈ4U«ý•‰´ˆŒÖžR]}½úW?á × ]ÒŸ‰)cA“J$¡ZV²±”À 2¦g%+¹¤dÏ…Jî§M—?mÅîP´ÓMK%EšÄj5œz&@ϵ H •…vbÇ"Ü­Ó08œÖ g×5ø„÷µLÉ=@.ê|,¨ñŸ¦.ˆïØ–õï>|¡F¹£¾_?2áÏcq(‹–^vYYMX©‚OÍhd8&!BÞ쟲®¼/«²;­¥”Á;舭t„'#´Ö°õ(Rn'Ûb—«Ž ©l‘qrF #­µ!ÿ©ð<#-‘0X˜e“h¡l š×J(cÎþ"áxA†¸¹—ì°EõÌ×W…ËHCGàÚ`ç¡Ò·¤×0…å¤Ç‘g5‘ïyȱ-¶Dqg‡,tjYÇuW4ñSÛ²+6/嶠Þ<˽ ¯±LÅ (ÏÅ¡Å“)[Èö˜³ p6‡l‡ÄßÃPåî”Âñù40XMTeý­¥¦“Z§AñWWê¬"jí jñªFâ4¸éˆJj€FVµ µîy+¦ìÏS5/Ô<›"Ž8/ÁòÓQ鼨¨#^%«O/9 -*Ê(6¿%W“çÇhêêD“Âq/œU÷Ø´yR¯3|ÙáêØxy,óGjº½aƒÙûŸ{:ía#;Âœ‡²¿~fþ¬ÞRcÛSv§ìñôYݾôÓ×üìx 3`1Ë›mh!~Gæõ>äºÀ{.Ôyìvºn -BEÑëëz¦…u‡Á’² -m2^÷î¬S4O]é\6•AO£ÓʾÈj0€Ý±¢œSË09ä@«Ê¶OH>„bÿÔõ†ë(xOôç¬:òŒÍŽ"ž*O[)À9ªîʬ0‹*IÒs‹ô‡>æ‡O w-F}`VÖ€€ÿ£IXÞ#6z»´”áð‰V}šðMu4Œf(,½(S‹L×R¶£I2fBc®¿ë<ÛìpX»ÅC{·Mˆ+‰ÎR'¢CUºkjQ|À^rJ꤆[v-¦ƒ—ÕN 2Np³t>JF"V½ê-œ±±š™œ‹£ OE^¢žŠ-žBªßÚ™'¶ð@ÌÓY|wÒÊ(ab£Æ'=>ž‹¾º £7°Ú€é²§{¦££]LAøe‚¿¶pÏ4_y>`¿&g.ýµ×/*Ü;¯W»ùB„l»e¨Öö< ±ÜôNi[d-©œ  ´m‹àÀ3šâ80Z™â€£Q´ÀÖïaÖ¼.®3oø@cëñy‡‘Rø³im#c‘Bªr¬Ótq“06`Ëm»šõõpd”BÔÆóÓã© ·Í>+¹ë>kKD8J3lèW#­)ïcÐx¨š{Ä+Ü;“sË£š¥,ëäµÚ!£C¹Ý:׆(æÄzFç °S7ô5;"BÂGT„¨ùßk »G¢“Z€±-:¢=9™F »(anß|y6c{Šõ2Ê€Þy®=ÈVÖ—‘±ND¡òõt9亜/{.‡ËúcÜ´ç£%N -©õë"x¦ÆU»þŒeeNm"Ö ^¾z¢+¨à9É¢ÈåìºX‹<àŽ…úûRÏpý%]C½™›Útº3syÎ*I“LÊ® 74 í6µÖ6:N\1õ/Êϵ1:*:‚eéq=ôyä…ýû£Û5P]‘ ” L™(Nê8íý¢zöÌë×ÃuJðWNÂКY¹oÑ”ü|Ìps&ŒÝæÂpQy53KO4$léÀYƒÌ°GÂʯ?±J°~‰âÄ°lÓ\Aè“~×  Ö?ô,8‘å¼—c]áù»2IÍ$²…8÷l8Íðë@?®âe¶û¢¨}âlñ¤¶¼0œÞñ¡©»CS½– ´›£diÏx -„¾¸€6¡è½çN¶çîPæÛ#ÐÝQS’.:Oæ ´AiêpúÌɹ  Îa=åÔvÅá˜õ×9v0 ¡C¤J#!±†};ôü›á€yØ›Ï;Æ ¥óè -¥­ɳþ™ë )|üWx1 -.à!qÑeeÕŽmøoä†>áŠÈÝÉg6v”Ña8#o»Ë• ¡õ©lÀt9“y&çÁXl<¢xÓ&µÊ^]ºgš¯=®ý!•­=.ý”ì¯Ý”r¹€©=$Bº“—j.áÉâ;†ÎÝ!•=ˆ¡2^$G[Aäc’³å/ý±ÀNýà¢ÊIáQ•Îè(Bµ«Ô$ºT“øÌ þŽ­=à3_ÓOŽ$MDÚßKLÏb¢B --µ/"öÙ‰fçKâ„ó<WDpxŽe›Ë !®…Æø‰Ü ·#‘0‘‰™ R „(vÜ5–êWàÄfñˆõ2NeŽA±¥ÕãåÇQèlÀ&ú(„nÖG! Ÿ£PB ÓÛoDhü]Iæ.a¡ëãç¯Ôå/Gƒæ!e{L7ÑË4-A% ­Få£yÔ -i(åØì‚€cÅ$¸PÏå‘(˜Ë¤o„*Yˆ* ûù½vcC‚Gcõ0\–E&¡ˆ•ÑÓH€#^×æyø7¬0-Â(™ÜãÝì&÷+ÿ¯ãò‡ºùG§±oºkd.rç` ‘"ÂoÛ³ub¢ÿå—ha’$Ë¿LKa5—ç¢q!ÌÅM?b<ÕÆK·Tëdz‚1ÅBÅ`æRBõ1 þ<8¯È"Öƒ“E¤!ÑÒyý‚Öƒ;ø«‚Ù/(‹‰Ô¬âH„Š~Ë°ús%!±¥©&žAÛíô¬Gøþf¯VØÏj¸%žw3˜ØmÉŽ| …Õ`’à'!þ¤ÂûïZBAíì …à´É³| oØN–âo6Ôð”ª5MB/|ÑÍ¥->ÏÐ i_Q È:ã„¿‚Ã\3«26¦ð+\nÏ4œ±MCð¥óPþžž¯Î}c!„½™ýí_Ðœ^dbpµäÂ7 P¬0XEjÀGšêºH]¬H˜k ú‡Z+Üendstream +xÚ­]sÛ6òÝ¿Bo•g"Ÿ8÷”&N΋sg»3½iû@S´Í‰,*"×÷ëo Pü’äN;™1A`¹»Xì71ãðOÌLÂ’T¦3›jf¸0³üéŒÏ`íÓ™0‹´èBýx{öö£²³”¥‰Lf·÷\ŽqçÄìvùëÿåêã姟¯ß[=¿½üru¾†Ï?^þë‚FŸ®ß}þüîú|!œó÷ÿ|÷ïÛ‹kZJŽ/¯>ÐLJH¯/>^\_\½¿8ÿýö§³‹Ûv/Ýý +®p#ßÎ~ýÏ–°íŸÎ8S©3³gxáL¤©œ=i£˜ÑJÅ™ÕÙÍÙZ„Uÿé”ü´qÌHÌJ3ô§¥,˜€¬IY¢¤j¥,Å””#Jy]5åýËp³N3•87ë"‘@dU‡¬K™‚£ï“½¼G’o?jלIcSÀŽ /EM0=lR0#Œ 0¿qÛÇâ|¡àˆ—Å}¶[50'ÞÀŒ³óW700éüêËíåÇÿØSQ×Ù ÷+Ùö\¸yÀPë†FÏÅ:ÐÄÿªu"z°RÛïÅ–&ˈn×äFrIJÛE>ÒŒêclÈX¬NÜüÖËØè—ƒ¥p`0j*ZnÛ%<š^VeÝK‚(ÃîZH<Úv¯00GDòÊ?—5¤œ¥Z¹þQ¢äÅ9Q:à…ÁSD·4nuÆå¸.ã\z–pf=øôæË;|¾z÷ù‚†þƒÕ2ª·1ól¾÷›‡g¶~é’«é¥Ýü€W×Cð¸3:ˆlUW‹½ƒzmL°ÄjƒzÃHPqi!Àö-›|Êœµ6à -ªõjŠ^b˜5JXJ½ûò‚Á½Ê®vH1÷ˆütИ#éöt`5 Æ@!õÏ„Nß×'âÅ›U™—Í— ÈNrû'¸Œ¼É–_J¾CXô™}…kãUd¿Ä÷xØ8ÞÕåúa★â JEyü˜u +NYG‡ËÐOñBÒpê«x,Èâ6Zé ›ž{)á{+%|A)í’ÆÍã:}Í¢­£ø]zX\‰e­î´,¢Ó–Éü²¡Ÿ«ÝjICÒjéœÇ\äèÒ·/ôŠÞ —›Ýv>¹Ç“¿Ëeà(ž —aµ ólW{½‡µz•}/ê¹WbºçÞòmV?²Qž’©LÏ}<áêη"Ð^Mµ¨«lêÁ‚‡TáíhL¼oi)³ÎØõI³u ˜TOº8ã<‰‰ÙÏ‹;Ü òÇ"ÿŠÃ”"˜_Ì l·Ž +&PyñÙB`¨Åçõu]4ôuö•ëºú`ˆ YøºÚ>e+ + Š³øIÈÜ$xÕ˜ûá8¤ôâÕ +ž´6JHIÙÎ0 `21ð·ó_®/?]^ap¦÷, /›>±z·ÙT¤©ˆ¿"zy”Å<óB’*Zí> ÓŽP¨ ´ÿ$•Câ[>-ÒtnPÙ Ãæf~S=àM é±z.¾D˜ÉèKo;4ô,êU ¬…¨¯~g{ÒI ¢lðÛ5?–KÈvú{`PÖáöÑ“>ì¶Yt@ÖRzƒË™EÈZ"·‡s/ÕŽÏpINß2”6ª‘íI¦»äý)DÝ”«M*LA}&NcŸ—b€jBË< +ê×z¦0ˆÑ~o]hoXˆ¢YôNFÙ +-Ž»§.ÔaÿÔBᦶE¾ÛÖèf”S¶\Úã”#ÐåžsâšI§û”ä‡ÆqsÔ9K•tŒ «|©ôj +ªñýÛ®ðq†”^ÀDÝÔ²~À›¶ X<Q*Ûd?y&•AJ DB,pÚkL.Ó´"’çjû5dËØ°ƒª"2WÒwÃ)Ñ—PždëúÙsÀuô“:lMF/SŸÊú…Þ¶·mXÚGZ®ƒÐbi„3íNa¼¬¼ªÃrpüðÁŠPgËZùº®ž\Vƒ£jNióИ‚¥ ܆dÞ³îô=$7Y°Þ€Ã(Ö-ùk{ôRÖ“)½eÊXñ +ݲä6yU5JpH\GÑ4ÓɶŒó¥m礛N’ …m b—1ÞÂ`C;ÿŽáŠÊ¨å…4j߬J€ðÎÔÌïý7Õ½=vá%™/³&› +žÓ´ZgøCMßäý„T¬!°èÁ¨Ã` ¿.ž»+?†p/ <«§”%óÑÅ€:xí-ò¦MØ9Í}ÛA\(¶¥/ðOæï=ÑHŸàã ú~Ä’ÃÑ,Å:&‚f‡"RX@€Y{e…·jSPp á¶ÞA +?µµ#Ú¬CÊrt=ªúºÛÔ¡»)Šzêj²ô€ìÈɨ‚÷E“?.V»©D;¦Eô¥ÙCÆžHG Ðá¼ÜçRq·h^6…'È–q‘¨£´[ 1ñžiKzj“õ›hŠÛPxøQ5á@(w“± F.’'‡}µ©¤—m‹ˆú'¥!8¢Æ”5¦ü§ÙªŠL?—Íc± Í$ë{Z Ú¦íIŸ»ÔÊ$ó¾<êÝmLYöÎÖðÎÖ@5"Ú*㽑Ú5ijfšKÈõÓô5 xåü}‚›nÀƒåY¨üy’ÆEßqÀ†ô… ZDîJ ¦°¥ÙQºV² ,ƒ¤RΔó1~¯Wiß.ó½p£Z›ýrÕÞüþÊùèfÂy[P2¥ dKÆß$Ì¾Í î€˜uÆ~¯{ø‰·—Orö¡‚ͺ› +ˆ]Ì~S‰ìY’b ìy¦Œd‰Lmª + ø˹äó"¼”O›•ïƒÜ>ÜÏÀ(½NRHoW¸í¼D’rpûÛ—¿¦Mq1çФ&ErÜ1BQŒ)yÜ3¶P(Qp‹r¹ØTÕjä9ä ÜšYíØ3F¨1u•ö,7Ú#K}0ñ¶CæNswuµ*š©˜bÓ&tG÷qÙê9{©ÛªÊ¡T ¯1g‡áå‡0×Éðz hÆ+i©è8z, Ã§b#o]0¨éʼ D—{”z 4&ßX†90³.ùES6ùg‹¦Xѧ¦Sà˜¶ÀÑP¥¯V”ù HܲOp`"$v)æô 5¡ö:áÀžÉn½¢LÑÄ.jî›9~SïW¨O|¬[¶Î%ƒže¸ÎÉèi~±÷u0s—Õe¸º{ wCHõþå@w”A«Dv:µÝö&ħDŒqÝk¦‰Î´c¦‹Ý` Ög‡Vì1ù+²#p¯»bbKÝrðâZšAïÓ·bg9¶b©‘¼0pà:Ö0ëeN_#Ñ)íÒŠéTên›ßÅ®5~t +(.wOš9=…QEk¡%býÍת É}ïĆÞÉ¡·äk¹H;ò#-¾‰Ê ^bºžJµéuÒ¦×SY‰T>q6'.gÛ4¡ ?qe>ÄÚ»š¥Ÿ5hÆÇ׳$/Sk{üŒýM„:ÁÆÛdfÖ:X8Ç,㸇í@q±ª |€Ç¶¤‘;N8 ÷b^šà͋覧ìþêÇíÜá—J¦D7ä%©õíå8µ,ÁºðwG–®@ð¹,ëìU_.ùxÝ_Îè±É¶ Ç»U¶%„àÄ<ðêo8mü}v|µþ§„,ô–!1\÷ýi¹¾ÇÖú^ÕªN‡rÂ5ȉÂ>7Ûê{¹ÜŸÕк,†-3¸f MÐáï  fÕà´ E†òDŸúÑC_tá'~o0Ä:aW’ 7äœKazìŒ4­…:ÁÅ['/ó=>š¿Z,-ü)ŽFxG‚ÑLÒraÀ=èRi¡Nð0ÆvÔÙ@ÏœÔ'Ú]¨ÃΦ…šRâ~ÿRv}”z 5A¾_ð‚6&P öè· +ÐìËë:ß–s©î' 1¿%õŸ2ÅdŸª Í"DBÓÛè1û‹ð'¶<ÆûZ Ô‚ Û=«I ŒP'Øc;®kJ2Ã!ÿ9®k¨#º¡¨ìo¦uC= ÐÇ©·Päûº¦™õÖÕ¥ÿ÷èÚpC]olÖ5ëÀ‰ÞFéZ„?±å1Þ×êšÂßð˜çÞB`cŒí¸®qPM—˜ºÖ:¢k +)6Û"k9UGY½¨7Y>þ±¡L! JÅq6Z¨ >zJ§43’›>#¡ Å>€ñs&ÃÏ8t¸…™Ð*€‘£‡/àù”}-ÂŒ×_Í÷•+N†Ë©†^ól»-éò_‹þ-¼caú›”šXè^¼†àÇyû3¢ ƒÐ,+Œö0õ#欉Nø¥òõ˜m³|nr ZãûÀ†nŽm²¿Ì®é—0õìo0誄®Íé•Î×}3Všì.ÜÞx’ÍþZÎ…Ÿ<ÀÚ}–—+ükøxUeËp5cé‚&©ºÆÕR´?Ld…?_]þØ}ªíiê¾#\¡iØHÑþÞ ÞŠ5^˜.„žLgáyuKO¿5x~ørCƒ'»C÷n~À£ +%óô =ï*ì“ã(p £Cç/,µ_yþë©ßLA–leçüãv–q?oÃÌ!6¬aʶåìkµ°¿“®þMûðj«±l†M†uñ¼*ד?çëuûrüñl±|/–ƒ 4Õo,ÖU¸g‡~ª¯ Íâ¡ ãmOþ/ÿŒÿ´eÊ9y8i§Td +åcø8 +p&±÷4fýÿK€ä?endstream endobj -1284 0 obj << +1282 0 obj << /Type /Page -/Contents 1285 0 R -/Resources 1283 0 R +/Contents 1283 0 R +/Resources 1281 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R -/Annots [ 1288 0 R 1291 0 R ] +/Parent 1280 0 R +/Annots [ 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R ] +>> endobj +1285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.2681 743.8714 203.5396 755.9311] +/Subtype /Link +/A << /S /GoTo /D (notify) >> +>> endobj +1286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [80.6033 237.2629 144.294 246.4782] +/Subtype /Link +/A << /S /GoTo /D (statsfile) >> +>> endobj +1287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [265.4578 191.3384 326.6578 203.3981] +/Subtype /Link +/A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj 1288 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [339.2005 483.6075 400.4005 495.5077] +/Rect [367.5441 191.3384 416.2908 203.3981] /Subtype /Link -/A << /S /GoTo /D (zone_statement_grammar) >> ->> endobj -1291 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [455.0966 291.3684 511.2325 303.428] -/Subtype /Link -/A << /S /GoTo /D (address_match_lists) >> ->> endobj -1286 0 obj << -/D [1284 0 R /XYZ 56.6929 794.5015 null] ->> endobj -354 0 obj << -/D [1284 0 R /XYZ 56.6929 712.783 null] ->> endobj -1287 0 obj << -/D [1284 0 R /XYZ 56.6929 687.8416 null] ->> endobj -358 0 obj << -/D [1284 0 R /XYZ 56.6929 470.2923 null] +/A << /S /GoTo /D (incremental_zone_transfers) >> >> endobj 1289 0 obj << -/D [1284 0 R /XYZ 56.6929 447.8217 null] ->> endobj -362 0 obj << -/D [1284 0 R /XYZ 56.6929 335.2388 null] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [280.9692 160.0192 342.1692 172.0789] +/Subtype /Link +/A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj 1290 0 obj << -/D [1284 0 R /XYZ 56.6929 312.9276 null] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.6219 128.7 338.8219 140.7596] +/Subtype /Link +/A << /S /GoTo /D (server_statement_definition_and_usage) >> >> endobj -1283 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F63 1053 0 R /F62 1050 0 R >> -/XObject << /Im2 1039 0 R >> +1284 0 obj << +/D [1282 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1281 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F62 1060 0 R /F39 895 0 R /F14 737 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1295 0 obj << -/Length 3121 +1294 0 obj << +/Length 3853 /Filter /FlateDecode >> stream -xÚµZKsã6¾ûWè¹jÈà ²ršd<‰SOÖñž’h‰¶X#‘Ž(ãÝÚÿ¾Ýh"(JždjÇU#°Ñ~|xðƒ?>+tÎd©f¶T¹f\Ï› 6{„ºï/¸çÉS6äúöîâë÷ÒÎʼ4ÂÌî}9+ ->»[þ:ÿ?ß]Ý^fB³¹É/3mØüÛë›wD)éç»7ﯿÿ×íÛK«æw×nˆ|{õþêöê滫ˌšC{á{8Ñàýõ?®¨ôýíÛŸ~z{{ùûÝWwq.Ãùr&q"\üú;›-aÚ?^°\–…ž=ÃËyYŠÙæBi™k%e ¬/~¹øgìpPëšNéOé"×B™Y¦A¶,§µÌr¦Ak™• SÁMÔ²àSZ\¨åj½îž³?öõö%ëÚñ¤¹Ö¹Z̆=¹&¸©2cR ~yªÍoŒ‰º‡ÅüyÕ,VT\w‹jE;¯–Ëí%/æußÆEÕR¡Z,꧕;ǵlÚjûB”w7¿P0Ë~×tm¦rÌïVïiS} 6¾Ÿ§®ÏP zÚ0XÎóRÃ4Qê¾¹_×o °¢3“ -Ú¶ý®j¾ë\’Ž©ˆŠnp(ü}»ß¦½äó]½m«uöP-šö1ЄÀ¿ßQaÙôƒ>w«z“vXÿé{s`©äa´õ®­û7T|nv«À¶†AûjÛ¬_ˆð±ížc+ -NÀÖ­k´{êé3Y°%Ù#ÊUæ–³S–82+rÅ-4CîM…’qÍúŽJ÷5ýöÑ –DhÐL¸tr‹ÁÏ´ÜwüoÐÉÄàBæVxXä]½©ÛªNpß¿Š† ÅEÕ{iœ=Áo÷©Þn›¥33øµX~2µ²+&B{v*•&ºä£ñLà-ÞÚWr‹É¹dâór  %¥ÏM)ÄEqÆGûu9 -tf's"·pû3ÅÕßO.âï%iKVŸ÷Ö!×io\&6•ZòJ£Šó2D® !äh‡+1<%R¤.+bj8R RG©k]jquþ ‰cw6¸+¢>À˜MÑ9 -V§;\0lÐgà³cÆæô¹Ùd$É—î„£9H+¿{=c®3æ¸æ°ZV»ã ‚¡åùÑ#×Äðé¾öDR‰tüÆ8BÆ÷±©1v»»‘É­ûýýƽ@ùÝK[mš1Ði Pi’àR7U¿«}‚z?î‚9@z…#R€z0SúÐä;—µƒ @9 äè±Á€ìf‰”P¾év5Qw«jÃQÐ=BÕ}EÁÐÐI “aå; …¹Pœ*¤£¯|«ëŸ§N v˜yÓöhϮ·½¾>²Á!1Y¥g:ÕÒ¸3ªÜ>ú£‡ÛÕDþlØàØjŽûuVS/𠌤±¹<’Æ°¼…M¤9²ÜÈõš °!“=g(YË#»ªYŸö]¯°ôÎúîë´ïF®±ïf Îsµ]¢¡Œ•ÁSSœ$rMH’(ƒéœ‹á´ŽÝØÈèÆP n ŃãGtcø ß‘7†òÁñù1>5h¶®>y-A¾BðÔ_gãrù&ZÐé1|“âÜ‚ªˆE¨ C L'¹uÑÁÕ ò‚D—q0²â@a°Ãe\$ÿ… Z[ô&,þw -ûÀ–¾,vxCÝ¢@5짼°)€Øz±}4wµt=â1Üšq¡S×Ó§ £ 7.8©‚””§z =m°d’•ó»ËRÌ;â©Ûê~íùâÐÊ =¿!æpœ7¡§öOZÈN7•yÞd^µ°a šýæ¤jeÜ.e`#d¿/t#ÙüSµÞÓ•ÇþôiUµ¢s ÐÆ -û×–Øâa`–i¢_‘£Fݦ7Õ+(/X åÞ÷{Ðç },º=^ãî:@÷u€`¨#ŠZŽâgàÊîªË ûçS××HÓ=0÷S£ÑÖ/ƒ¿ã4NÀcJ„+°.¬”tí`¹†ðw·«ûÓà@–%¸k¡Ý9“tZ~DþlØà8÷û9à@`-9xë°óã›øÀõŠ JA-“2•!‚ƒM7TùkPA¬¯œÑ ¹NC…Èuˆ¦ŸLÖ¿´`¾=eªt×Çr¡ÊWdˆ\B¤»> Ét*…¿·Ú_tRù¹rDƒ·Ë1&Ñ&_{EBÁ_óèy¿é: ¸…4Ø„®L±õü-üó|§úÅ#·´íü@èB²ãoB¨¶¹§MÖÕ}½î‘JßԷ߇‘seQΔsˆN¢8Rà¼÷s1^6d›êÊÏu4)kè Çñ/ë'¿û„ äÏHÙøp4 ú¸ø  -7øtµî uØ—=0FÛß6lz›ÇÖ›ùòð¶ÀGƒnS‡Q¶mŒJ|mðxfÃË$²Â¼rþ1ä:ã ëà Îpêíñ–·Ì…(Θ&†O7¼îU¦ã'HY P=RVÂ2Ò#RÆ´7üõëS»s$¸‡ Äâgçû:x…«\y®áAåÄ•˜Ö¹Á\C8&ŠtG?‰m T:ŽÓ!W™¼äe07(9˜ ¿éKYÒK Yž|É!aÏ/‘O¿ä(-çSo9#ÄGHexË¡˜T&o9NKƒw'˜Ò·~ªõÁv’[nÿŠúJØ¿è ¯ü?<ÞЈƒ -þÌâÄ‹9<ß‘“÷×,¾øâ×t‡§†ÊÒÍ4D`öø¥ B¡õ$вÈu!ì„èÿ¤â/ -endstream +xÚ¥Ërã6òî¯ðm媈!‚£3ñd'µ™ÌÎ8•­Jr %ÈâE*"ióõÛ/€¤L{vkíFh4ú ©ËþÕen£ØÉeV$‘•½Ü.âË{ûáB ÎÚ#­§XßÝ^|ûÖd—ET¤:½¼ÝMÖÊ£8ÏÕåíö·Õ›¿_¸½ùxµÖ6^¥ÑÕÚ¦ñê»wï¿gHÁŸ7?¿ûî‡_>^_eÉêöÝÏïüñæíÍÇ›÷on®Ö*· +ækYá… oßýã†[?|¼þé§ëWÜþxqsÎ2=¯Š äÏ‹ßþˆ/·pì/âȹ½|„N©¢Ð—‡‹ÄšÈ&ÆxH}ñéâŸaÁÉ(M]â_bóÈê$½\r¢s³Ìå8Š-pm%*Š3£—µZâ²ÇB.—ÛmÕWmSÖëÝ©=¬Ë¡ßÃŒ8Ú”›½;g‹Î³(Ö±¾œîýŒÂ€µ@¢™¨ űJç4Þî]ç®Ö@ûª="Ew6mÓŸ®T¾jk˜U¿´;·/ªö$“vü-ùÂÛSÕ—}õ@º!­F+ÖòÆ;=8X$Ññêqïl)X¦{t§ª¹ç?è¸ÎcU›=7'#yd[ö%ð8Iͪ=[=^íÚºnÃêoÞ_ÿtã÷ݱ±'’õä{ÆÀÛì˪颀Âc Æú•60J¯îÚ~Ï-â |{á¯Rþ¼$æ:ît®ì×ÿöm’O.Neq¤MŒŽ»=?i~» +°œßcó…Á¢[·+‡º˜’½á°Ü`ÂËO ©„¼;G\bl¼¢V¦íX02>¬åž élÎÀ©0¬uRÐý0C‘Æ’µ.·Íïq¬ï‡°!ŽW 0†ÆéPbñÁ3}s62•iÎŒ„@žÞñX?1ü±ªe;7 -,Žu]…Rˆß|5tÄ7ɾù…p”{˜+ "+:mdñéü\0Ù °¼‰µ«w úö £]Õ¥O«:¡µ[:ÏÐl]WÊ»ÚGMlVÝ€êfcUÒL#š„: 0ðÒ¯oãN‚Ó>ð9'ÇOººF6@‚ˆ ÏMûØÌ=É(¸Šáí„"ƒú$Ë3 ¦í¹Q…922* IŒØ3|r}¦‰írf(ˆÑ©ƒ –Wf¡p¦#“s˜M»$ I¤HXe[uèu:Þ@l¬>šãlà¦>¸ŽaÁ¾!… ¹p‚N­«feÄ™­€±¢)¹bCžF©^`Û–1^©Ä„qÔqÇûë%Ûããmc&ñ tÆxÐ ½kHR°GdccèÂ8~çÁ6Ø%·æ³ãøIô¢–½(By¢™a–Y=TîqãNÎ~Ý÷îpìñ„Ú²Q×)®Ø»Cz.*N¢Ì˜×…ÂDyìËc…ò.«—àHeãÛT»'×…] ééÉm†SÇ,²¸)ä€Üû\oyS³qK¾u€!›0 ºoÚ ÌÑ£™—…ãöX±VبÛ{ˆ?,O Ç +Ð9€õ+ïÝbâñé5n$y”«ÔgË 'Dºú…ÛPY¤RåÍc¹h²æØXO56ñZ fY¢%¶žŒÌvë©ñ˱^&¢— ȬšœT¤6*²|ÎFÖW“"ëÚÏÃuÈB˜†ò‚P–lqÄŠƒˆÉ9 €1.B çH©×_,[€QLMzJ© U²úÐ &RÐ’#$bLSSxý%¥ZRCŽ]DÒ(L#íi¼ó<”öIÍ ¿%B–ÄèûÝà–¬g¶ägØñ4åA­âÝ&6|âM¼ý$[}ª ‰;Ãô§E¢5ó#ÅcÊ LyÁ:œ NJ© Öò,s ù_j…‚dLa°ÍvÚxkbEJJ\°E܇ï$ôbÀœâdN±€Èn<·©Fé(/ ýªQ5/Õu˜?»½=Å‚6‡Cº!?Ç)(&“3|È:Ë-†…©’¸#U +Ÿ}tÇ–½J.‰WáÓx€„jÏì÷Œðñæí/Ÿn¾Ά&î}^–‹ÚBã’-kžf¹ÜÃAÌLÇ…ÍïÇ´0ðž¬ÒÔÞÉÆñÏa´¶jµ§3‹òÌa¬õI°“ѳڳx!a²Ø~¥ +<Åz¹ +°8³è7ûõ¡<Ýv) PÁ©ò¬ÖÇQš'Åët¬Bæ鈅4âš%ïvKÕE,.¦¯Ö!(ŒÎÆœÓä”ZgÍÙØlõîÃC"çä¤<4Ëä lsf`¡ÑŠçèŒÄ¤¬y^Ì…¯®:´±BcÇ2nb-þÁ~h²E‰'Å(RŽ `Á2°Ì–&«›ìKÀäT1!®ã°…» fsÝWOhÎn¨—, jF{§k‡›€äU3|áf÷àÐQE)eõèc{úÌ-ÖNò©ÏŸÏîÔ¸šÛ¨>‚-¾Z¤Ò] áÖí›2Ü6 ×Rë;Þ¼(Îháë³#ØãÎt'y‘‹¤¤ª6wäRôXY•%J¤çuíæ3%õV‹wÊ¢F“Æ«rÄ!ËçäÙ].ÂËGš‘,uÜÄàî¾!q†çaiæ%Zäcp¨¬j€ÖDŸ +öú–i&94Øg^ˆrd‹5Û‹uG½‹ÏVÇátlý:çÕ\åsêM;œ qؾhñ@Š"È¿bñ¦X/[¼€…›W_ØͳSÜV;ì€8pÏ Ÿ‚g¯“°è™™* (‰õœž_ƒ3ŸY>] /6_{VI +’(z8±™Ø°T!*`Ý–QX*!"¤qÜÇHŽïÖÊÍH‡ÔZ–`ÕÁÁI 𪗅 Aì`å‰Ö ¯Ž#NúS_5swATmžŒÐ‘˜ðt†*%&Û0fß0­—øðXm)ŒÍŠ#ÿŽð°bbyFÍx¶’ÈDЛ¿È +@îÐRÞmðÎÝpðžãù>‰·/\ÚHÒ‚Þ +ƒ«PôƒJª kÐ/éºQÒ;l½Ã—4ׯt¸`-…ʵë¹`ͨ)ôšÛb£éypòÜiõ¸õ\—i[ÊägH\ $™eD²9 jÈÁI! |&|NýËq*Ä&ŠóLñy–ÐP Â]Õpd2NWDüi…àH%°ðì_ă“¼/`†ÝÆZQ±p&-o>_ +ïèîplOå©ò%'T± A.:²„M§ì[ÿH'ú@E(¾W)0=ãµ/gõÑB2=×õ¯ gž¹È#ȳ}¹X*ÄE&Ae·°Ÿµ‘Õ6 >¤Ï6&2EšN\þB¥Bùçv‘ ÁCé8< +‘E.2ÿÌQ±}öÒŸMêÃЩ݃«¥-¿}Á¦„ëωZãc¢†ÞüòÿgÆfQži!Ú_¾ˆs“iò]²ØdžE”©pC/ó[G…Ný†þ©nÎnå©M¾Æn;}cðoþcIàˆY Õ$•Rh ŠWïúyI´eöÈ©Eä4/FÒ*V‘ +_¤§X/GÒ‹˜»Vë‘u³À91Qšçù뻬…íçOry”f±šï/Å 0<¡”jùé„c ù]´žÚqöòã Åg8Ö¾Ggéfrœª¦!s vn|â;ËðjG‚ÚÊ»-¾é$j®綉r_ ¾7{°Õô‹B-WHð‡“6Mþ‹Éø,¿`}"£ÂCV[·Ë¶'³úì9 +Èä*X–ÉSQ–y–gÞždøwªJ?a8Ü_ ÝÎÇŒÛt¿¸0¿!š> endobj -1297 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [213.0783 309.0057 261.825 319.7901] -/Subtype /Link -/A << /S /GoTo /D (dynamic_update_security) >> +1295 0 obj << +/D [1293 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1292 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1298 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [398.1622 184.6228 446.9089 196.6825] -/Subtype /Link -/A << /S /GoTo /D (dynamic_update_security) >> +/Length 3366 +/Filter /FlateDecode +>> +stream +xÚÅZÝsÛ6÷_áGy&B‰/|t§çN㤶{×™¶ŒDٜȤ*RqÜ¿þv± Š” )¹væâ™\,°‹ÅûJž'ð'Ïm*Ò\åçYn„M¤=Ÿ=%çÐ÷Ùdži`š¹¾¿?ûî­ÎÎs‘§*=¿_ ær"qNžßÏ›¤B‰ ˜!™¼~óöú‡_n//23¹¿~s1U6™¼½þéŠZ?Ü^¾{wy{1•ÎÊÉë]~¸¿º¥®”çøþúæ Qrz˜ôöêíÕíÕÍë«‹?î<»ºï×2\¯L4.äϳßþHÎç°ìÏ¡sgÏŸá%2ÏÕùÓ™±ZX£u ,ÏîÎ~î'ôú¡1ûë„U&=Ÿj#È[YŠLJ`Êl.R­toe%cV\håyݶålZÖÅÇe¹»f©á29ßsEäë|©¬pV«±W$yªœš¼¹¹»»zMív³Z5ëŽ^ªUÛYTF˜l’ø‰êâ©œ3ÛP¬NDž܈ à`’tòK½,Û–%•,¥kh¸qƒá©Ö暇¿”mD„ÌD®Uñ*¢«:ËO)ª…K”a®åcñ¹d ~V ~²Æó&pÔM‡SP”ª©”"·Vù¹¶¶„“‘½Ü?–Ô˜—‹b³d–ªB0·KÓ¯°„ë½{ˆ©™L2‰<ç×8®œ?Ëj^tUSïAZ§"WàˆŽªÐsEt-×€•XïH‰i­³ÒØhåßã¨ÑéW€eÕ6““›¦+#S°T–`íø™ÓLØ~âbÙ6¤l]–ó–š“>òýâŽ}Ü"È œSƤ<‚p%Fé * +B<~d–‹ é&‹rÖUŸKX³–߆`•Cx1ÿ€Ó £€;ŽßÓaø¦ÁÖ³Y¹ê¦å—Uµ¦Í!FªÌ¹£:ôLûJŒV›J¡R€íP‹K/wTN¼htÐɤ­ê¢Û­%¦çDz¦ÞÏåºZ¼TõulÁ/w"`!TûÍÃÞ~óð%ºyBˆ4MÒ±g«›Ø2C6'we×yÅÝcÕR«YÑyôT†ÛïJ@>ˆ°,½+ŽV0s–$ú´g7ήϛe]®9ê Ä’iVËâ…Þ‹®+fŸÚÃÔRhÈN€pÀu… üsS®_–Íîà<©uùqÁ)"x´G‰©IÔXòݪœ€`ý&AXuå^tN:4{ zûØl–sêðni]±îÊy?KÌÍ*N1OäéÓ. .ÃOŒØÕB\/b®Ö “¦zCCîL âµíýŒG#(‹Qœ–†˜r@à[ì¸Ïê÷$QåüUÀsY÷-jƒÙ¡ÁÈ3²»ìÊõSU{;¡}Ù™`ÅGµ¬gLi;,£‰gEW>4 3bH¢œîÝ:ªVE½/˜;à ñ„÷µÒbAê(ò‡\‡‘ßs¡ÄÙc9û4E0´{nWBgÔ á=WDú8†¬6z,þÞ»%mòÞ-iÞ1¤mZï„Ùc …w¨[W³Ž{¼C…®Ùc±.f¤SˆzQϩѾÔ]ñ…zqcý rÝ‹7OÔ†²iS3,!¨+cÆîø©hI¤N'Ð%…ˆÅ~×pDj°ú«¦n‘f%Ä÷9QžÔ<Ñ­uÙ=7ëO¾ºs!Ž¤Ã8’B¾åaF +ÌfŸiÎÑ)ålömt°6mñ€ðÎÀ“6øLMÞÂûØÎ(lSËeD‘ éGH«þjjŸ¸gá0eƒˆÔ*m*ÊØà²EµŒ?+L.‰¡†¹ãª+8myXÛ%¹XJf!#JÝ?¨ùs±®c‚À#ÑÜ )êö¹\· ¾NMnÕ}cð OÚ‚gä·<í›D«K…Ÿ yøšqså¾€N ¦“;⢙éH™[ÿ™R³ŽnE¥]ž Ýã9LšsM°äsP_KÇ®…§ +Œâ&Uª' oN /ˇbI´Ç¦íø€c÷HB€y¹ž‚O÷€''kÃËÀÚÀwûö5‘aŸxd͌ܥ'NIÊ“?5ój:>–ŠÍŠánªhhH ؉˜5ÛdÇ»ïÖ=P7ã->«Õ’œGfÈßfš½šçÚ»9 ׈Ô=/_Q×%ü# +y] ½û• UvI˜R¤NN®;â⪠nÕЬ†ñjø­*,ü¶ÊlP›Ä§ÖNnßÐÕþwI$àáys÷Šwï/¹õîWnÐ&bßí…µ“ÓËþz´³~=~Œ_ÊR\Ï…œÐ’ðÝ羧µŠøé÷xÃgöDñG†© ÓCƒ7›hjUõ¼Âìe˜‹Ž;“g-†¡Öiy‚eÓ|Ú¬XÂbĽ¡¯ÙÑ%‚uæÇ‚·žsºVq~w}3½|óæV\Þ~¸È•‡š'HwIþ¤s×õÍ=ú¥ƒ •Ñ)ä¹'ò©Óát*0mÏÛÓ—½:"‡3 Åæ1©g_긊0àû@‘¡Ø×(×®%„ÕÁÓ!Äç9D€–źåÍqÑOÄä‚×øu>çŒÆã_æánB#€æ \÷·%ãTÙ&"ß^j~u¨iïýR)>B¦Ýnv¶jÚ¶êËÎÏÅrS2º‚ODnH'Lgr(çÈÀÀ„"O!vÙLÿ!.Xk‘*s¢ör†lϵÅìsµœÏŠõþÝ‹J…¢ñ¨øÀ?2¾H#ùT(m¶7Ð4*”f eÆ`‡&ÅvhÔM=¥â·x ðz¶Î91 Nš”%.ŽçrÔä"sP¸ŽÕÏ ìŠ®0Ž=ûÃ6D²åsñ¾¿å×ÀB>8tFàÝ«ºÇݦw芗ÏM ”å>(©pÆ¡1\1QžŠnöHÕªW jÕª{|"è˜1ˆ™hCÎ?Ç„-Á«#X—iðZô—“¸´<ßCÐéÓæ~†’¶^^¤¡Jg"ÍÔñ;K#r£óq +SE½±ò¼Ç +4=V°og¯¡k„•b*‘J»“hÑ}JÛnØ©ô@·¦>||áˆ@Z¨Oßב㸶Ƿª»òv÷eÿüByžØãòSDþøü&B¹TøP®Á¶U :\gÈxšbN4Dµ¶Zz¯zK]þÜÃ3@û„p×ØKÇv” ‰ P}„ƒ'Ÿ Ù'kt„H]êÆ0ßK£ð&vø´V|ñ/‡‘ŽÞKjR•/}òKPÄ‘ÑÙ)+ÖAql=,7%Ø“¢üRµ<” ­±&Á⦣û¼Ýܪ?ˆ`ª-]Jær› Ûܨû &p4õò…º«zÊ{ +äa-…ö> úüVyÿ =h±Eßlºi³è§ÉÓD–°icbp"¥ÞgN½D?ë¾ÓpþË•8 ü$˜¶J"'xM£’ÈÞa'¯ºÃrø±\6ÏDíš3.ˆÀ‹ƒÖÖ(‰z¶FÁ£xØæNäRçcØé6Ùú#‘¿“„’RÖ3.ûãíCv4òû÷ yúËÔøI +ãäW8ù“¦ Z™©üë°gí¹†ÉütæË“½ÏªJ˜–pT~ÏQ`ìZ3a²ÜŒ5ˆ^¸çª$¤‹ï¿33Úf£kw8ü îÑ„Ç+:>§sÊçÕg¯ýɶì?Ò¸§`¯ì쨌p\ûùõÍ廫;¾ÍÁϿκø¡> E ¥E–*ýmuÄ!P%VXrT®#  +\Û kן¢ê¸üÀ‘Á”+pSÚ¸oì¢B*u ©4R€T¦¤€H÷qn )¶@й+ 2®únÂJlˆ¼‡++wóöÿ3®dª„KsWC®Ã¸ê¹¸‚bþ½/9NÈD©ãâ{®ˆüñ—-ñb¤Àh×M:YQBH…‡ÉFYŸá¤ }E}|O­ª›Þ1¬Ç“9ÈÙç@”†â¨ÛæhÐÑ)”rÒ}Kmqx'¡˜Ís}j'\Gv2pù|­\7Óº™¶M1íºå~B¯„5VW çŠh0ÞË ÂIšUཔ!í6PÜ@éçw¨Å¦{ÄZ²À_¥ ?0<ôor÷;’üÅ_%¼¿$Bø&ê©ä<í‘'¼¿ÿ‰(>’áãpÊê­ÈU&eõÃßà*Â…zµûñ8,‰³¦q³û+‰¿è†µùölGAŠ¥¬û'pçr¡´> endobj +1299 0 obj << +/D [1297 0 R /XYZ 56.6929 794.5015 null] >> endobj 1296 0 obj << -/D [1294 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1293 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F63 1053 0 R /F62 1050 0 R /F48 940 0 R >> -/XObject << /Im2 1039 0 R >> +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1302 0 obj << -/Length 2626 +/Length 3178 /Filter /FlateDecode >> stream -xÚ­]sÛ6òÝ¿B÷tòMˆà“É“›Ø=w7q}ssÓö–èHc‰tDÙ®çæþûíbIQŽ3éøAàb±X,öV jâR‘º˜d…N*7™­ää3Ìýx¤' HI뇫£×g&›¢Hu:¹ºéÐÊ…Ìs5¹šÿ6M…Ç@ANßýrqvþã¿.OŽ3;½:ÿåâ8ÑNNÏÎ>¥Ñ—'>œ\'*wjúîŸ'¯N/i*e?œ_¼'HA?ˆ^žž^ž^¼;=þãꧣӫx–îy•4x/G¿ý!'s8öOGR˜"w“GøB…ž¬¬3ÂYcduôëѧH°3ë—ŽÉϺ\8mÓIb¬Èaÿq)+‘)H™+Dj´‰RÖjLÊ ¥|½*g·‹fU Ï«¤NÁÖ]¢{[G¬‘½Mgo%Sa 7Øü×»j¶ü]J]µÇ‰ÑzZÒÏjÙniÔÜðÄ|¾9Vù´jÛ€»]”Û0ªhÐV›‡jCãÇåjE£ºa¼r6«îxüå¾Ú,©O»YóžLá¾õdÍtÛ€9hVU`„6I4ÜM‘Z†…sÚŸ 7x:VJMA’ÓOaGT³ÝŽøÀ½p88(‚è$8ò'ÁÁ5c3ê]SÏ«9Ójx¿«#Í«›ò~Å+—-òüúÌæÛ1&6“Ü)²^7uEX½;ÔF¨ù„$£«a‰ÉÁjó õµ­V&Z²J…û”RNÏëmµ¹)gU;²‰qf §)-¥CjºÜ-‚o}=§‰»f³miH³Û°,hŽYŽ~qû Qð£s-€¶.ŸìÅ €6ê+o~ß.ëÏaójD"V¡œS,4TìªNšzääIÄíéQs·]6õ˜´M*réò¶F¤¹eÄmyëõÞ(ýÒ%Ú‹‘^¢¯`èI™1Imº (“Ÿ¹f¨º ¶CGbø°\å“4ÍÁôí‹\§EžçãŽ3‰“.Iïtzü Î)“éngds]ng‹=&ÒÒýuLŠ_cÒ9!-ÜzIï¿n‚ h Ù^Rt&(;ŽH1ø¢kºâ&½ë/&tª]_çzÆæD`œH|ç·¼[š§0*^bBZäY0Ûm¹­ÖU½ "ô¤ÅÇ>Ãp‚àêÏr \¼1¤$‡TM™ùÖv’ÜæéljTd"K_ÿ{Oܹ¿ÁJ’Ž”6¶Gío -|³–ÉÁ×k•öhïûgéFjHOù …ªêòz…È «ër͠舊|!Œo þVrÓ0J¤pþ‘fúJ†KH¨ YÁá`”6a˜L ¤¬ФÅ6øò¡X×ål±¬ù–—5kmÅš ² †QÒl–ö¨šû¨›E3Í ûÍzØ·¨h½ñbzFœŽ›ú†™2,;ÿø`ƒx‚ ¡Ã&©Y†¥@WůFƒ&`ÈÔî6yHGŒY­2™"°`Yú¦ðŽ ˜È!Ä‹ãæ‰^Vö½ž :1r ËG‡ßÇÅòXM½»ëÒŠR…U,UÛ‘*@QÕ½`2Ðä,˃ª)öÀ³fM¹óK7ulÁí1@ðé@«HÂÿ^Tc¡{€ÅÞ ¬Ÿ‚í›~W_½xe6HŠd>-y"fD½3Èî¤-žÏTÆ É$Ixþîp)&]’ûáXe…ÈÀìv>˜3h%…VFýuLFŠ_ap„–ªè3y(gp¢ÈÒ&’‡íÞN?§„€hz±éAVœõLÝ‹JÙP;‚!€bÌ›ŠUƒ"€®1µŠ–Ü•ˆ¯\\¥…°«Û®+n›Ù­w¼&g«7^z3„Z¢MÓgßãÖU“M—L‹Y„ ŠˆY&vÃ.˜\sW£d„ðÙ>¸Ö4^”L§ª›ûÏÌ×ÉÇsƼ¿óÞ´dTç‚ ¤ñ!r9ý]:­lÎö‰0WJh)Õ›ùuþæÍk£ßŽïð’jÂH« #¹@ UŠ: -P¯–#Ö‚é)B¼æ!¸ ÛÌ m &ÑÍ>.· F ¦X‘ž_£Y¯çè8ÑÄN âjD Ä£*‹OÖk4Bˆ7 xC$ò,8¹dˆ¡PÓ¯ÎÜÑb´¯?iªw3Ú—D[öst*ÞÇ ¡d¾8òÙP5‹^]׎b³£«ãBO›Ð*¸­ž)Hbá4Vø[ Éï!?‚Mܯ¦¿ ;¡ß ¿>ŒYu°„ˤ{¹HµÎ÷ªEŽÌî•t64=m§éiU§ø YÚ]ChWÆ(–¥²´j+ÁÔ}½âT}˜4* ² y`2vHlÓÂÙnYŠŒvâ€Oö¬JkúVó¸ þ•ñÀw$µ§ eýÐÜz'é\Ž70ROêT˜<–?…Ud·lFÚ½8…›n÷91±Õf:­6Í­¶ÐˆÀ‘wKðÛ0F–±Wò‡Ù• ø áÉË;­þž±qc¬7,G;ð)wà?ù· -»ìùN<ê¶ vj:vŠ}bL›ë¿oiâ¶n¸¡áî ÷–éjÛ– “9ŸkšØŠ`d—4òʱ òÑŽvÈ +ŒŽ6ç)%ms¿™½o$½ŸËô©R®mLêú‚3äýaÀ—8Ô|@E#´÷>û‚I®ëAwS—Q€G„ÝÛbûr±7À8Ÿ5äõCïq–“°x—£íkÈÞsËfÜ%…>…ì=Kø+µ:k…ÌÍ~? ‹OO¹êx†}JP‘[çãc¬a=p†‘­;Ü,Û[‚ „4”Óïw=)DÝõr»%×IâÂÉ~€G4ß~L‡­Bà.cN^¦PÙGGw~qòþýå°qçÚ€à³Lè,UßÝ7ˆ“Åý`›[¡ÁïÆ}}rñŸ±¦Ë·éN¤Š´“@ ºUÏ4ãÇžÐøî=òž,'A'¿ûy}÷¿6Cï¯Ç¦u–ƒþf -ãìçؘ1©aýÿˆdM3endstream +xÚ¥ZÝsÛ8Ï_á·Ufj­ø¥Çn›ö²½íöœtnvv÷A¶e[YÊZrr¹¿þ¤%YNæî¦Ó’AºbÁ1KM©LÏ’L‡&f¶Ú_E³-Œ}¾Ì3wLó>×O÷W?~RÉ, ³XƳûMo­4ŒÒTÌî׿þöþÛýÍâz.MÄáõÜÄQðÓí×Dɨùðë×O·Ÿ¿/Þ_':¸¿ýõ+‘7Ÿn7_?Ü\ÏEjÌ—¼Â… Ÿnÿ~C½Ï‹÷¿üò~qýçýÏW7÷þ,ýóŠHáAþºúýÏh¶†cÿ|…*KÍì>¢Pd™œí¯´Q¡ÑJ9Juuwõ¿`oÔNÒŸ6ih¤Žgs¥Ã4†5&µ…‘­Í“…±’ÊkYŠ)-;.ÔòñqwÅ|µ+Vó‡öa|l›0±˜õ×>“ÀsMˆ z"ˆ$ +“,ÉðÏ]Qƒîe®EÛ¢.yWÖ[ ª(èv /w·Ÿ["nšªjž‰†r¢~ÿö‘.ö¦¿à_Ç¢íx­fÀß«#ñùßM]¼Ã!X• :fó8 +ÁˆÀŒ…3c¤•š¤ÊLðåî vtðG©|KĦ¦Ös}üz÷åæ7b\,x°¡v]tÅa_Ö —7·l©÷P¼ÐP»kŽÕšˆK^ùØku뱋‘V}¡=R4<Ë=í¤Ìé *­ÜÖ )iÍ€•½òà3?}ÄAÝtDõâbÁK.›nG½ç’zq×ë©9vL%(9¤ÞýŽwX›üXñ. +œkdñÎ(#)á¸xÊ—Â1 lR‡™V)ó„g~ÏΕD:Ô—üôä=®W<ÐqY;:¼Ì»ÕãüPlE»;s@ø ._ÀsMH08¬1¡HpEÁ,LR¢ )€AºË 5  ¢î±ƒ~B|ÇÖú ï?|£ÚŽ}ÿÈpÀC Ú·›¼¬à.c!ƒO`W–F¸ŽsR"¬šý#@À²¬ÊîåZ€[ª$¶"X§Ôp’8ÚñÉ$`¥i“P¡qüßZÄh•yªBƒ¶UšÔŒaŒð„œ(ŠðlÏùaÚ9ßüOÆa)ç¨Í(TÃI¨ó5©52 ¯iÁr¬òšÈKžBî{uÈB—f¿s®há-SÛpÿ¹\4ºÊWNˆ†wÈY¦â™g‡§âÐâE­ë㊅«9ä$†ÈÕf(¤70XuTeýÐR×J­² ø€`WD­ó}A=ÞÃw’·QI ÐÉ«¶¡Þ’'€B®E°î­nÙ ZP÷dŒ8é…vç]xÒ.çmÖ<Ý¢vvùS1… ë’ô±B>™ùjU´-õ­ 2eïÂmG-:Ô¤Žƒå±#†çÒ:šŸ’UÓq&@ᶠ_ò:à îŽç]¹ÚQ—‚Œq×å=ж  “aÍCÙg?1?¡¾AUcv«ìáòyÝ>ûåkn;žhmø"‚Cöþg²×¼ÏuÁ=ꉜv}†ÜR„&Ùë{®‰ xa ¤‹ƒ­)p«LÍcWZÇÍDàitÁ@Ùy 6°9V4b:s€„ð­*1kê/Hn„bÿØy[K þ¾'úS^yÅfC¸§ûúS1ž6chÝ”Øáe¦©ç/Ñèø#¨-‡ØÂÐÉ[ É[(€Vó±ãM3¦0‡-öˈo¬ ¤!¦l‰R&Ô#ë)äÑ"93¡=×?tŽÍ¶¿MKáÒÞM;r¥æ$uª ªŠ¨åÌÐ#ˆÀQòËÔœæúma¼¤¨6p]Zèàvêr¤0a"½Þ­õL\N&:ÖÌd]¥|,V%*©Xãdê­mbÔx}x9Én¯YjêD«¡Z†wsÑ×u¦Â4I^wõÓeOwL=GG£û:Ög âkû:žó}~®Àø!•l|çµk gCàe·ßˆ¯×œªµž§!ª„¯J&FéÚ>÷níS6Å0Ø™ ÀÒ(°÷Gd¢š÷ÝPÑ0çë´>=ºÍÞæ0S„îæ!3‚m.2ȲRb3) %Ø¡${ö°8ÔÔ¨¯íñT¸H®Ê¤Íl°y¤òe¾nöyÉC˼-ÛwTæ½Ó°Ö¤s/èl«f‰ žÉG˜Üò¬fÊÍ­¼±²©Ñ¡\¯­W€Yq€žSó”Cøµê†±fCD÷˜aÖüÛ5"î‘è¤`l‹Ž(ù¡+WGÌí7¸%.‚Beó&-m·áâ®îˆoèzh!W<Ðày^D°œsp?[r"5OÂÄDX\PµÓ,~t|I© c¹2oY€0˜!%c‡e½³p^á2”ªzç™bìå*NñÉÜ\¥‚ʾrÐàa;£Î¢çñžÞŸpîóçëZ§‡dÒ†tz“¡4c .¢Î’@ç¯HŽë 1ÎW»Xÿ(çD5Y)®€>ójÞvùêÎpÇ9ö›åP¢R\x`ŒhéÛ?4à×?øþÐö؉×XgAb•Ûd(Œ“Í¡£*@LðÜúë7ÇzM߸·%-«bÏ» ‡bËÅÖj—/]™‹­,ž‹g#¿¯¼V¬7£½­Lƒ»(í#‹íß~{ÒC{Jì4uwhª·£Ÿ¤%iO»,¾¸€>å=0ºäA¶çîP®:{F A~G]AºÔò´˜M¦õ ™¦‹Ñ'NÑÿ]²=å¥íŠ=&d`ÖwçÙƒNu¨U¦fZB%åÙƒçŸ÷'L„í³u‡ÙˆFŠ±<¢¼Ie2ç |=×R¸ 䱯—؆‹./«vhÂ;|뻄­!7/.´±Ÿ îÂÚxÛ].üDš`*¿Ìú\—ƒ™ç²>ŒµÀH”pÆÀGtš¼±»çšØ~øü §£ý‡% þñMJ˜zú èVfª}¸„–`ø&éßF8eÆçDâh+À?&Y/îñG!é©·N ª $ÞXiM1”ãßÎ0à¤.¾@‡O€Þò4WÙî%KÃÌ¿NŒïc¤Ä8 +•P†™÷ù ­Î¯Å)GAh{D°yËv.ƒP2Œ´v? X¹'ÞHL¨g‚€ÀE}É’~¾A쮕X_—I&’a-mì–®L´I|v‰'Å„L(‰3w|_‡âœ7JqœŒEÇT$1ôüžHÎ:ü #ô/Œ ¿1Øý¨±†D]Tš[oC$,ÌìññâLÅrh/£×¥~üÿä3@”GÊÚOAÇ?æÅ@Í·E{*19÷¦IûAœF™h]B&Š¾r†d„ðÆTŸër\'³§WË3›O…~}sÏ5±û…ð÷5ÀýÁöC:Ù0ä…ÐÍ< +ý„B)¥š–Ø>¡qo&9½føƒ1 ¹÷ÑI0™¡Ç¡hJ/£Ã˜4”"–}4 ÈëRÀ–Hˆ‰Ç¸æF ÁB´Ó‘JXKgo@„€òhÖ‡™F~§ÞDDÐîµ xÿ .Ë#R ÜZÑg¼®7бâ Xg +íxô»=µü¯¾Ë¿Øÿú4tOûžÌõîDZàêRäé×øË7þÿžÓwÒ øXz!SRQ¦2KœP¨5£.fgç¢ÿÓÅh|endstream endobj 1301 0 obj << /Type /Page /Contents 1302 0 R /Resources 1300 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1273 0 R ->> endobj -1303 0 obj << -/D [1301 0 R /XYZ 56.6929 794.5015 null] ->> endobj -366 0 obj << -/D [1301 0 R /XYZ 56.6929 725.2846 null] ->> endobj -1304 0 obj << -/D [1301 0 R /XYZ 56.6929 700.2184 null] ->> endobj -370 0 obj << -/D [1301 0 R /XYZ 56.6929 148.5316 null] +/Parent 1280 0 R +/Annots [ 1305 0 R 1308 0 R ] >> endobj 1305 0 obj << -/D [1301 0 R /XYZ 56.6929 118.3446 null] ->> endobj -1300 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F41 925 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1308 0 obj << -/Length 2999 -/Filter /FlateDecode ->> -stream -xÚ­ZÝsÛ¸÷_¡·Òˆ‡Olžr‰“úæ.ISg¦3w÷@I”͉D2"e'íôï.vA‘2e;I'3!´X,‹ýø°œ ø'gÎÆBgf–f&¶BÚÙr{&f×Ð÷æL2Ï<0͇\?_ýôZ§³,Ε̮ÖY.ÎÉÙÕê÷èåß_¼¿ºøp>WVDI|>·‰ˆ~¾|ûŠ(}^¾{ûúòÍÇ/ÎS]]¾{Kä¯/>\¼}yq>—ÎJ¯X‰¯/½ Ö›/~ûíŇó?¯~9»¸ê×2\¯òùì÷?ÅlËþåLÄ:svv?D,³LͶgÆêØ­esöϳô½~è”ý¬v±u*0 ÒS´YœhèB^®q À)œÐo\Ò‘£©wó ¥)§™fž²"E,²$c–¿NÈHaQ©d†z¦ÍÊ‚oÕÛ²ëŠÕ³ó¹–2Ê©s—W«zK ͹ŒP7ÿ£ÚoKXïÎ¥‹l<±˜/ëê!Ôõž~¯ˆ ä^ãù›rù‰º]´oXVÅ„»r³!Ò¢À…ÍæÆÅ™¶Él.eœY«üšöm°¦å¥Q‘/oˆôy_쾞KXxlttuÃ*4¼¬”ôúCXÑÂr¨`u7yG”¶)–%®*ÌVV¥˜Ø•ÚX»Ä°áAÉù­™ïWÍ'n'6ʉØhvõY‡íº|k‚n©7Ðý ð¼Ôêá|ɜͦDì²c³=  -ØY(cUÑJ¢* ©¢•Šê¦+ëªEÿÑYT|Ynö«²º¦N4Œã ÜqdFìD3î 3ZKg‚ƒç·u¹zÌ™€Ð2ÁòÓÖ‹ˆ$KÇb{{ATeJÛ`0ù¸Á ʤR!Êz«`£Àuwåm± ÞH3ñ¸¹Ìbi!ãprQ¹*Öù~Óµô«^ÓwÚPÎÄ©•!νÛÏÛz¿[ê&W„{Ð@ ¶©™všJ3rh26雓þFƒÌp’¹22Ö‰²cŒ´Ÿ'd¬V»¢õ–ŸIS)H‹sX…]ê3ß,ø÷ #dÖ™ÊbçÒlb”³4M†ƒžÓîÈTÇ/P“–¸¯žÑ±IÏcNigÒÎœÐδ;2?ØOÆÊ(-¡,ºì¡Êc¥“ß”˜ÀI%dÂ[T¬dš“ÏÓeúlël´¯éáÙT’K†IµÊ·ÅjB¸Ö±ÓIðo.# ~yS,?a3‰Ê5‘|ŽÂFÝ»¼ó¹ ûÛ¯mWl©‹ªZÍÉŒ Hà89Ü–+Ÿá´ÅZ¨µ £®wùvK)úʪ+ ¢îÖ9z6Rºš¾$Ý®„îâ6tÞpë=Û¿ð$œx,äWF¿(UC£hnŠ-Ôk(ì¢øÝððË kx=Û=ÖJ¯xåW(Æ*³¾ -€šßª˜oór“/6ÅÔ6e¡ibߦT93Þ&˜܇æ Íʲޅ,ZWT`°¿ß$`é ‚¾à<ÇÝK£¤ìîʶÀtìDT2ÏÄ|%¹*¬ÂQ “-QßUã¼<•ÒÄ8•Ý /Ÿ/þCDØ”Po©•X«ísjÿ÷ùxGätx}‡Ì£­ã´ñ¶î _nH¢mþ ýJ¤à(´ø˱k -w(îÐ^0­Ý¯‘ãxYUEÏÓ7T ®Y"y*òËý®ì@Í™èuAXaHìÐÕ˜¹üwúš¢ZñÜuEßÛ|WÖ{&6ù|ʧ!& ðj_¡Œ{ô 0wè¬ lPm$Óº—õv[xl -%¤Ûå ¡sSä-÷ËD;CMÞ+d@D%™¼(‰šQ‡^0åŽæ+"­—’ø=ái6mM-N'<„G†4†IÒó F + q ßÝKKÜ÷¯Ô¹`Q]]¡Ýæ>r€FU"öyHÍ~×ÔlJ3–—=ŽF9A·6/Ý” Ì­H!+AÚ+¼¦o[o™ œ¢×˜X|É· #lh%ŽpüÇ·—ÿÂWœ#[úÁ¨ZUÝQâ¹¾›Ä¼ÖÞØY%’t´öŠ ŒŸ¯»©÷a&ú!ÂôÍ®¼…<ç} 2*Æ(’ ´`?—hnð â[àòµø -"=âó FÄG8‚Úʱ³³@­ìÁµäWáéžr…åc» !eöÆ9º5@¸ÚÁñ·X…›€EG]¸§H ›Oòà‚ÑùðhXÞÁ>6ŒáŽ -í«€[ŸÑ•˃’Hâ ·dÁ]õfOFrJl‰ð˪Øäð¢(Ó¢8fìB aÅ<€¨r‹KÍ+æöù¾Çùw¸R¶ξf²ãñ¢¹èBzXæ ]œXÚ|]„dtH,eu” ¥ú}ã|3̾»º-É[+€FÝdâù?Üf<éÖÇAS«o¸Óè/}ž,õé×NCÂ;¾Ö˜X!÷c˜¯Né7d?…àÝ(ÝgýM½È"8øÇ1î4cÌÕ~IÈäÔVà}†„Ä *û˜C@­z3}'\ŸïÉléYÂ)&³fúR2ýÄèì´,'@7ȱ¨Ãc=ÔQg…¤Ïû¾Ê¦x‘(^*üƒÜf€%ôHl+sr{0BFWð¿Š.Ž 2ͤLc©éu}öy&ca2ÿ-Fm¿Ôƒ <á§Ë­š½ªaA³Áš‚àùP²_T¢F‡ª4©4œ,úÇÐ~xhz|â0þ„Bß¾Ô$£HÓÊG– j EDuá\JÆ%i¬tÿš¼ÌOÇz~FÊú\ (À 8žSëã«÷ÄÉ°]]ÂÎ=®ãW/ßã ÝÝ©@uÏ3z”X ’þ°xx¹0XN@: ¢ÓeSK}uå‹•£w¤x]p<}B’¼¹CÆù•'Àb7…]ñBÝŸ¢ü­ˆGn)ž|–IGÚ‘ûÜ‹S“¥q¢q}$¤?[Åÿbb~økŽ|k±ÄMÑGìÿÊ!/à³±s'*Š†üèT–δQǖíÿ …¹ªÿ˜5@_endstream -endobj -1307 0 obj << -/Type /Page -/Contents 1308 0 R -/Resources 1306 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R ->> endobj -1309 0 obj << -/D [1307 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1306 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1313 0 obj << -/Length 2984 -/Filter /FlateDecode ->> -stream -xÚÝZÝÛ6ß¿Âo•šå‡(‘i²ÉmqÝäwm´¶¼"KKÎvû×ß ‡”%[ò¦— ¬Fä3äü惔Ōߘé„%VÚYjc¦¹Ð³ÕîŠÏî¡ïÍ•ð<‹À´èsý¸¼úáµJg–ÙD&³å¦7—aÜ1[®‰&ÙfàÑË··¯oÞüóý‹yGË›··ó…ÔÒ辬ﲒšÊ¢i‰r†„Þ›wžã\˜’#O=‹‰ªl—ÕäûÏ„"é Oci¤Á°åš¼ò ·o—7¯ÿMô$d÷¹spˆ6ÒÆ:Ö·y•v™ªR\ÄðWoK­«úá‰(‚¤xåî9•Ð…hÍ×ßc¢7Þ‰\)P ¤èü¨7Ëq­ð‚û–¯‰#ŒÈûÎKºý0æ ¤úªvÏ5àr+ÈJ[ÔOZmóòÁ“ÎðÌ«æ¶UZáw{`åEî¹qínÔÖ³¡.¾ï±(K¢>ŠÕGç/nx…[ 3ßç~’ŠÆ³²ÝR£_¾Wõf3¶¬¬òQ­ïBõòlj?œ€<Í$Ry^¦„Dí¶6ó¾øœW¾É?³‰%ÒcVsÖ?—%áDb“¥Œ’;Àç÷8-Ô¢-Iô{‚jXý¾Xçô†û;¶TG±ØúI -½¸r™ßp{ª #§PæÕF½â_[·Vn‚J™ÐÊö7ÁñNo>TÝ<‰OU QLE ‰¶‘i$3R«®V‘ *° ò8 U¹àã4 >N·Ö¯ccV€+îVò ä Yà k9˜=8‹Û0o…Ú -¶t€ù»³h¯€ -Á é.¸ù ¶™.kYê4Ñ­óMv(=CÑœ$Ç|÷ÐúTçÕêW®yå_ˆïHãº1¬2Šlað‹élÈ¢1~&ö¸.dÃÀ…{µË~_„dŒæ]´Å._ÕYjÔP³›Ëzxž5pTëD¨¡7ÕT0îh‡ìT¿*2 -‚´‰UEçGè.ëêžNŸˆÂ¬ -[cX]õD#wEuhsßLHBê.ÈÉ÷»bA Jè*Ò!¦*ð½õ¡BHîD4H"·P©7díát`‹bwØÑËç¬<äÙ¥ñb³§Þ¬1W'/"IAYœè©{®€¤>×4’:®Q$ërIqÊ ÔP—5é¸FT¢I²Ô -3Ôåˆ&Ñ¡I Ñ$ I@£§âóÁé^߇XG­®ž²D‡,¡qÓ¡¨÷à‚w.áÁ%NÀ% ÇIù¿‚+™Â–8bëÿ-‘2-éBî´z\ ¸¦ƒT}hÏ£œÒ…—Ué¸Ft`+cqDj_™·‡Öƒ «ŸÅ±*í¦àµªð½øhå¸]´"*ÔR„)Guæí<‚éÊ2͹Ö!™h%ñ:ÄÒmÝ4¤ú\Ó긦£Õ(¤ XŽí3ªt\#º ÕaJñeŽR<@Jq>ˆW\ãÐ.^Ás$^Á@¯xÀuñŠ¶æˆ!ßãã'x¹Q~K<À–BF,˜ä¯³$œd?sÍÐ纰Àåªõ|_dåâÓ!ß?-öxás -,…ûyYÏ3"*•0« ¢(ð¡Ì>ãŽ)y<'KÕ…h~ëu±ÊJwð„>§-uuÁ -š{ã%~áéî1ÖÄ€~ã‹ 5ø°H²‹Ì ¬»;Ï›   qpµ%ðVíÞ!,–It­¶ÔÞ”ò@g 2zé}“¿“†®T°Jwœ®ì$Ò*ç‹4Ž¾ó³UyûXï?ÒË]V­‹u»eÃ6…Üå܉8!ừ:$µm@;-°@3/¬/@¤á3ðØÞ”ÍÉœV4»÷¸ÅÆ•Ÿwˆî!¥»ª€—Ædá0e¼¿7¹ØÈ‚S—O°e´áŒ:†ú¸¦)€Tä¸j!"—9Þ$´9fJ°„ïq>ÏýÕ²ƒ¸"Ž ìqí\„“ w˜M«ºZ3:Á.iex·§˜Ñúä@9Ö$Ÿ *xÄ‘)¦ÆîsM•Žëd{ ºžDaXòŒtÏ3"|Q¤bI e ýÍ#m§4‘Aó(5ŒDÃá<œOè~"4‰™Œãx HW Ì-Góãåg0?t8óCwuØäíÝ4>ÑŸß”ägqÈͧ”9ÂH)ˆ$xÛíî¡ÇÝFÂÓeMxB lZphJÑÈÝRe^ ü]öa‹_ôS¾)@¿¥‡ÿŒ -}FvPœØ­—Výõf,$ 4"¯÷p\ ǃÎ}UûRâkFîs ˜Öv×J_bZÁe20­?7ÞiRÜ“tÉ7wáz t9 w1†;ˆutK[8Y¥'žÛ]Ñ—‹Ÿ&ºP8¸%ÊšPÅÐýš^M÷cb7RÃ4lÉŸ‹iœš“ ™'Æ2‰éýb4é1M“ÀÔÿøãJ½M½ße絯Ô0N©‹tLç* ‹Îüh××¾Ä «û¥.¾®0 qçûÉJHys¸A5k¨;`~5+­ªù~,k©”‡¼z,@G˜`äB2ójqúIöÄ#˜áîË(.ª'?ߨ;hH2;øe(sðŽtˆßå8à` ãN¡ Cž"N0˜³èªOh©+?¨%ôxï1ÇbP§]™äjz®sw$­<;¹¥ãöú ÿ[®éÃßé¹@£˜žMüÖpƒ(×Ãð6i/(‡%þ´‰¦¡ÚP¹eaè¥^Ý~ L­®4ÀVkú¸ã¾âv­á [O}ë±5Ið=Ð?þBdX‹îîû![}ôº»ÏÍ Ñã&~Ò¥4ÃßX8)ï~¦ñÕ?÷:~†S¦Œ‘ãî.!&Æ&ñJártrá8ƒDŽ¨þ_r›Äÿendstream -endobj -1312 0 obj << -/Type /Page -/Contents 1313 0 R -/Resources 1311 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R ->> endobj -1314 0 obj << -/D [1312 0 R /XYZ 56.6929 794.5015 null] ->> endobj -374 0 obj << -/D [1312 0 R /XYZ 56.6929 573.6377 null] ->> endobj -1061 0 obj << -/D [1312 0 R /XYZ 56.6929 551.8981 null] ->> endobj -1311 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F21 702 0 R >> -/XObject << /Im2 1039 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1317 0 obj << -/Length 3275 -/Filter /FlateDecode ->> -stream -xÚÅ]sÛ6òÝ¿Bo'ÏD,¾?ÓÄé¹sMs©;7sm(‰²9•HU¤ìº¿¾»X€"%JN&¹¹ñŒ¹Àb±ßŸ0øã§3&½šX¯2͸ž,6Wlrcß]ñˆ3KH³>Ö·wWß¼“vâ3o„™Ü­zk¹Œ9Ç'wË_¦oþùúÃÝÍÇë™Ðlj²ë™6lúííû·ÔãéóæÇ÷ïn¿ûùãëk«¦w·?¾§î7ïn>Þ¼ss=ãNs˜/â -g&¼»ý× Aß}|ýï?^ÿv÷ýÕÍ]w–þy9“x?®~ùM–pìï¯X&½Ó“'h°Œ{/&›+¥e¦•”©g}õÓÕ¿»{£aêÿ´t™vÂŽ0PÈ9X™‰Õ>3†»kî¦ESï°(àxÜÆÞE¾Ë†:óøÝÖMSÎ×µ¬Ú:ŽÓgS4M~_dÈ €÷)ð"ƒ›ƒÓ„½7yõ<Ë«æ©Ø5»O¯{æÒGä2î¾!¢âîÅ -¿2&eQµ¯ WÈé|ßFâ⤺Z?Ôì·Ûz×KÜp2†eÎk1™qžy î5dÉYdÃ:oËÇÌO«â‰›uþXD°Ø=Â`w)l±x ~äÎ!Äptê1—ý‘«%‡1•ùLSg]=åñ6@F•óÓ»‡b„ÅÒûÌiåû,¦£v#ƒ£žg¿ô fZÇ…Võn“#W™ ®Â7_7xõLö¸øbCíÊE誛z»þs­5Èв~jh©*"~ÂA…Wá wY¬òýú@ÄÈéá:­|ñôü¥ÓÛŒYfãBc¬3m=í–Zát³È«ÓE-ÏT7e“?“-™ô­áÌ»r¹,ªØŽßœ>Û¸:1'NÍ›pÆÕöMYÝØŽJˆ&“:QWaØ#cÒõ7mÞ¸ÈìÄ䱌i°ÆÆËL)æÆM|Dšõ±ÈBñßaõYÛÌÊêxs×d·—wï°F¶H%ÀÊáöAúP­7ùŸåf¿¡FµßÌñ®Wô-«y½J ¿ê*ÎëèÍT#„yEÀ 0ª¶H…ê©¢“ -á@P!泯BˆzF…Hs€XkŽ\ÿæá“I-Zâ}Ñ´Mú. â‰÷¿:¾ÿrS¶>•ëõÐàÓš«}S,3òòwiÞÁÕA#jpØtLƒ%‰Ìsñ9*|F -µ7™R\–Â>Öy)ì°†R˜üXÕœ£6™uÞ\¦¢Ã!cpbÃ3k™ÒAæì ŒØHÂ( è -wÈÙÁœcƒd¡ž,†æEEQ±k1Odo0& °8ŽLV(!}žBøÜCZHËn궠6†ME µðñȾ/Tþ TþŒP ¥ ”âÉ/ˆ1›ykMÏ+HöI^¸åO¼ÂP,Ž'NÎÙAä„G Þ!*3ßm¢Ûà3@ãÉgp1â3`4ø ì"z~ðÂFŸeKxä°‡üt ½CoK½"¡wPÓ¿D K ¤ô.ñ”‡lxÊOe"¸XÝ‹‘t'(úpr~b¿9 ‡Ÿa*…Ÿ|&´~b×™ðSAN#<€‚ÁëåæöaGÌEÚV´Ûø3 ©£Uz¨Q_-ÒÕV·Æ¼`#{XldÂ:I"0%_§&R€-S/Ña½@×6óLÇÒ\³ÎE®-‹¶ØmJPÐL0O%&Á¦Hòi¾\ÆzCB#Ÿ(£ÑÄo´¹€ê -hR><*‚îÞ| Ô¸*mY“ ãEƒ3É8Rÿ&d¤ÚÑZð]m  À âq4Ùä@\œr°ÿÚÇìÊ%Çî†VVJ‡[H¡£òd0·_mv< lÓcЫp0vœ­zÌ´Þâáóuð*ÐŽkÛéÏo?Pæ㯨/±Áb?À7)‰»>P'„9»’È6‡=arªA¤õ–Ï`²Êï·KPÌÚ¥€C­¥ªÛáI’6R±Æ« -1còN µÂ…‰`}ðCÁ3Ápù-yÇõ:}É›˜DA/€öÍ>2KÅ {%$‰…®b·ÊqίB¨Åºnfc÷Q"r¨á¸vÌ> Æxq÷ì)à HB¤Í>­™o·E¾£Þ²Šû<ĵ†kK\û£•n2ÍMòÃÀœúiÖiþH1ÎfŠ‰d‹Iüh”©è‚eæ!—:rNR‚¾3«Ø˜T¥€LöHùP*¤™–+B¤¸KÆ¢t€Ï_”X𣠙©È´0–l7M‹ã~B2È…+á\2{‚u¡6él“)p †X‘Ý!à Éá„Žù?7ä¡cà±Çsj&üXR v„FbÑF’gFð™ DYï—ä¡; -•iñ¹áF»Ï$t(w–=•íCY]*R)›Y͛ÉOw -›¨­wcgˆ­NÄþŒ®Ã¬OìÖïïKçÀô èÝïw9)vbϺ8 R¹]1™Iãͧ<HÞ6Üøck2cÅ…µhƒµ"˜f —š%ê@…ÁÛ~Õ]òO•HëIOï{LÔâŒðºaHœþñzføôþ‹éÍ g`Q Žo"•ÉÓ!›ü1AR>Ä{l‡Ã˜:¾¹ÝˆÉÛŽ4éŸ*­<ë/ÎjØ|àˆŽYRÌŸê5šUêdCú©ÈtÆ ¤ê<EÄY—! -†že]D|ôu z8dD ;±§h[Ò=hµÆ^R*Ú,>Y{h¬®!ʉ†õÈ·Pd1ŒX\ 6ýÿ¡¥¢N„Py ™DÛ½kþ2Á4 br2;…äñS5Ⱦ§xˆÐ7ÏclZ!™¶©aé;Ì'±±ƒôŸRh`êlDҗ犾R|™žýŸ# -ÎA¼µ•—R‡uÁ)E,2ÄþýMNýRD!eà—FdViA¿$,ëû%lö^¯ 5¨8YNÙµM‰e1Ͷ¬óKû%æ2λ ø<Ž¨w*S\‰¡o -„û&0M‡ß_ ¶’Z(0ÊNXuü^{6J8&ŒëjÊ—|SŠZ¬Í„5/D6=¤ó2”NíÏåØïÝÀu_¢¤C:%e CDM93 åçð¢í’}p~ LÎõ…Éùž054\Ç°háÉISñF0qoâ’]” ý½"¶TÃq®_Äþz¬¾úb™0úJU={*Ö$E5œo®)½¥¶ƒ·Ö( -£;rÈá­ð©Ôð\Œ=W@ÀÂù•iË­ý_$ºTHØl󶜗ë²}Tžû)¡ÔþþoäÎY„|ñÏ ¿ÁT6ÛzæIÜ.(d‘‘(<§¶Ç”w¿G<%ýo -~_õendstream -endobj -1316 0 obj << -/Type /Page -/Contents 1317 0 R -/Resources 1315 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R ->> endobj -1318 0 obj << -/D [1316 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1315 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1321 0 obj << -/Length 3347 -/Filter /FlateDecode ->> -stream -xÚ¥ZÝsÛF÷_¡·Ò3»ß\^žÒÄɹÓ:9Ç}¸éõ–(›ITEʪ{sÿû ,EJ´L’s?@‹Åþ,%'þˉu©ËU>Ér“Z!íd¶:“;˜ûp&™f‰¦}ªŸnÎ~|¯³IžæN¹ÉÍ¢Ç˧Â{9¹™ÿž¸T¥çÀA$o?^½¿üðÛõ›óÌ$7—¯Î§ÊŠäýå/Ôúpýæ×_ß\ŸO¥·2yûÏ7Ÿn.®iÊ1Ÿ.¯ÞÑHN'˜^_¼¿¸¾¸z{qþÇÍÏg7ÝZúë•BãBþ<ûý1™Ã²>©Î½ì¡#R™çj²:3V§ÖhG–gŸÏþÕ1ì͆WÇìg¬O­2,©S-­·²L3)(32•ÞÉÎÊJŽY9R¡•×u[-§M½ÛÎÊã5K™¥÷ùžHD/H—J¦yžéÄÃ[º÷–ƒe[‡²z^¶åvU­Ëæ|ª…Iö÷Õì›6YÖ³bI£Èì\ú†©b>ý²i^Á´ŠõœHëM[Õëb¹|¤þoï>Ñ;›zÛ2ñ¾Z2ãÛ !¬Xè4³:ǵ§¹µ*(·kJäê|ÒÖôlÊ ÇeÉÕÇ›Ë÷ÿ¦ÑèQÜ• 8¦s:¹¹¯šèéÉ”»¦å©Í¦,¶Ô®Öij½/Y̲xˆÍrûP¸ô ›³¿ Úå©TÊ°=WEmFì®Ñï´bº¿ë5/݈,uƺáÒgËV*h0é–žAM­ÁÖ#z€ÆÏ{°½Ÿ’+Œèbó4Ë´eb’NµŒÆqM[´åª\·Ü-[ž@3* Á Eî"Ó¯pCg¼gêE\c<h à\¼dÇ:Ìhé4Cš{a¢ÑÈõÁ›¦*óI ;¶­æórÍýðÌ’‚º›28Å4ìl‡3U¹§Wn‹í“·ô¬Ö³ån^­ï¨[ŒØBe€hÖ¸¯·…ÈE¤îÙùï«ö¾âŒ[¬‘¥Ê€ç \(ºØ‘0eR‘åQ¬|d+eê.Œ1ÊÇ©,n÷- ÅÂû ,<ÃiÂƬ^ÿGu·Ûˆ 4ˆ#Kpº#|ô2µyn'ÎAÃå_´1Î0 -0ÖOò¢÷ðâf|cÈjµ›ZoRŸ»ìÌzÒÙ~1ñ°™WððTkŸ]õŒh‘ÁÒ"µº€_pá¯JN¢¥wi‘râ„I•09Šžü9Cgr°S êµÃZ6?^®Ôä] +šôÅŒ§}ÎaQN ¢ œXmôP&•™È‚ÊŸë%¢¨´ anž¨Ô¦’š Q2Ͳ*·42¯K¦‡ÃAf·ÙàA4à:F$žÁ=OçZ°Cã®÷ÏÂÍÛOtššzv®Dòÿ  R'>hK•Ïý¤¿Ëßç8<ÂåãL©É÷¹õTå©÷DL8ˆFiÿ| {cžÏc:ªÔš>¸“TF‹ÔJôYŸ¦2L4¢@L¤¶©×V5ø¥ú2†wöd˜Ò~%¸‚m•ŽÔ¯}BDÁ¤à” #VMOŽ›¡s ê5Ë=ÚËO`buH60Ái  ¦¬†íЗ뺬Ž”‡"„ „ ù}‚„‰Z¿TMÛD·VöŠ_…°=}0ÓÝ|3Åôj,íÈ2È âòOÕUœyIñPWó—x‚3#Í×ò ZºoÒrª4ÁÇÈîCüòæHßç¹{HwzñuSÎh{µ )<–æ…JÛ¤^Ðì«á\ÃYH³¹!JÀ6¥|t•óÎÁéší}ÑR‹’^¤ i -ŒPz‹­À3`!’¦ -fÔOÁ‘¢'c_ïè%ÄZèäsyR‡£1„l¦õ=hn{Çãº_5EòiþôŸp !¢œqØÍØÙOÀÄB$³«¾>#hÆDÏkÑÌdpT´"-ŠÛ:žùûz”¡Eµ,n—ܶÅ:ÒÔ銥9VB½,3å_Åj³,]0e;’°¨1#§¤q$% ->kún' ÓiÆÏDk‘ü—Ûb}WRS«Ìyj:kµ}Míÿ½‹Š#‡§ÏÖ‰×'",³ˆ‰8ÚŠn:¤bPuÖJ†‡CtŽpä¹8N‹ã‹°õj,c…¸ !;BÒºX•ó±Ì`¬™ŠËP'%„ - ú¡0è+GÉêpØGfiþI‹•ÑöHêU˜×9ü{E8¢À{Á%³á ‘å0¤z‰ü/ÀŒ%SÑ…  4¸Í Ú©oÀt¨¦‡^`ê3}#ôöØbý6UB -qNÅpdCîwýTƒ23Ûʼn'·ê)!biÒ¹M3»¯ë†Î!H è -£U8ï0:'ò -r•m؈ 1µ0–ß`ð‡V¨!áʤ°dÃ% >"ÇÐBL õïC!ŒcbŒ'îù³ÜÙš=Ö58.ó™Î,ÀMóšß[ôÏ“?wåöqˆTWï鈎¡7Ž!‡ -z ®ˆ€€ôÄ™nÍ¡óØ{Ë-øU?ÓG¢u³´÷õn9§—¨b€±»²ísu‡7 IÜæª4DoÂûÙÝùh«:¹0|O—B–7<Éb®¸+ª5^@I“\Õm ˜`¥b`~^6iÄÜQ±Ž6ŠeSù-OÑ+|( -ãëõzÉ’ÃVŒƒÀð.íEPÑw‡ë‰ì „˾#³ ·<´5õC5/ç1ÔsRp[̾ì‰Ã<†ýÕNàmµ¬ÚÇ#€¨¾©›¦º]òtSA^Ñ#]:±éjƒÍ¢»ÓÑ~"ŒÔ9×7%&!13ùüØ´åŠoîËXkS²ªF·ø¨(¹¹çüvxuÊ)oqdz!цDvU¬™>Š†6;|*ü>hÄz‰JQ>†‰î¬XÆÄù¡Xîâk‡,;Á‰*Oö÷%sä² 1Çú ä:UÒ>/5ÒœJí»qî.ÜPêMijćÄéï²C5Ê´b6¸ÒÙ­6 7\$”æ<½œQJâÕ¼{1,¦»|~z;$¤Fºö£Gõ̆Dª YÑOìH†aæYÁ‘hDðÑždÆÊ¡`2f.{› -´ÔÛ’‹ "“–«Ë)l·ñýîø^<ë2½…[ÊQ&T¬— ccô_‚¤¥„Ùœƒ©¦ªyb‰¿Ühù•>ïŠe—ÍÂG³ O'£jÆ3¨Že›È¢.Š ð•»x· ­$VÚÇŸ’à(oœc  ßm¹µ,CU#ûÃ2@çiHPÓ"ÆŠ:ï®>Þªf”yž|ÿ»§/û%§R˜&ê\Ъ1sT£vÛrÝ*mRïÅQÛéps„c=öÓ„Há8@ðÇË7œO@Ÿ4n‹˜“€[ØÚGj>ØLP^ñúª…édK1¨\‚2+©É—DšÍ ÔÛ¢jx2Ò¢¹íEsÏ+´bûÉ­ë’[GÓݺfú]j¡>4LJ0s‡þþÄOÄ´Mñw]#(%ºïîßýó±Ãoë ìÐÞ«q¼S$I˜°R¸Ö?ùAãTõÿ5µùÍendstream -endobj -1320 0 obj << -/Type /Page -/Contents 1321 0 R -/Resources 1319 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R -/Annots [ 1324 0 R 1326 0 R ] ->> endobj -1324 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [442.7768 483.7823 511.2325 495.8419] +/Rect [367.5469 435.097 428.747 446.9972] +/Subtype /Link +/A << /S /GoTo /D (zone_statement_grammar) >> +>> endobj +1308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [483.4431 226.9165 539.579 238.9762] +/Subtype /Link +/A << /S /GoTo /D (address_match_lists) >> +>> endobj +1303 0 obj << +/D [1301 0 R /XYZ 85.0394 794.5015 null] +>> endobj +358 0 obj << +/D [1301 0 R /XYZ 85.0394 671.5763 null] +>> endobj +1304 0 obj << +/D [1301 0 R /XYZ 85.0394 644.6731 null] +>> endobj +362 0 obj << +/D [1301 0 R /XYZ 85.0394 417.7762 null] +>> endobj +1306 0 obj << +/D [1301 0 R /XYZ 85.0394 393.3438 null] +>> endobj +366 0 obj << +/D [1301 0 R /XYZ 85.0394 274.0842 null] +>> endobj +1307 0 obj << +/D [1301 0 R /XYZ 85.0394 249.8112 null] +>> endobj +1300 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1312 0 obj << +/Length 3041 +/Filter /FlateDecode +>> +stream +xÚÕZKsã6¾ûWè¹j„à ¢æ4Éx§6NÖã=%9Ðm³F"QÇ»µÿ}»Ñ_¢d§&[µ›©ŠÁf£Ñh|ý%fþ‰™±ÌzégÎkf¸0³åæŒÏîáÝwg"ò,Ó¢ÏõÍÍÙ×”›yæ­´³›»ž¬Œñ,³›Õ/sË$; |þíOW.¿ûÇõ»s§ç7—?]/¤áó—» Ñw×ï~üñÝõùBdFÌ¿ýþÝÏ7×ôÊFß\^½'Š§?G„^_|¸¸¾¸úöâü·›Î.nÚ½ô÷+¸Âü~öËo|¶‚mÿpÆ™ò™™=ÁgÂ{9Ûœi£˜ÑJ%ÊúìãÙß[½·aê”ý´Ì˜UÖÍ@7¦¸¯YVeÁŠÙô²C0«­>.‹æq‡iÆPÔ"Ìxof ë3ÝáJ5‚yc$žnæ˜t1NÜÒé^¡}§gÆjŒ‚3£¤ÙÈñÓùŠù ü_ÎN#³ÌÃI€b‚eJâʳßg‚qí½"žÞ8l´3@ |}¹‘³÷5lgÖßQ”»è [²ª‡W!‹V°|\Ö…óõº>fþ´ø}_lŒ|þ¼XæËs<´_+{b2q¿etÙ¼"!ô°oŠv5ým‹ey÷LùrY4Íak…, CÅÆÖÓÖ3™ùlÖÛ—AÁ[^±èÀüe0]HϲÌAèšY¡³éø"”: ØGi!(&âKË•Ž‹ŽêyQWc ‰Híú’Öo¹&F;X.†|Ä£ü•sYàªlþôP.h¸®—ù‡nž¯VÛs‘Íá¤ã2¯h€xÜѸ\«²Ê·ÏDyõ‘DÀ.›]YW DCÅíüæ¡Œ’6ù§$´Œrëfæó¹Yæ%o&ÏmÊÛuñä@ܼƒ5JÃܪÙåÕ2Ñ‹J{²1 ÑÐ%.…`ïð·¬vçb^l«|½¸Ë—eußÒ‹-ÿí~GƒUÙôdÔ7CÅ;’6À“æ2hžVÀ8_WEó††Oåî¡Æð¡*Уòm¹~&§ª~jg‘oÁ (X… +“vOõöÓW =ŒÅ@×Ç#ê…ÝÉ#HÁ@£…‹qb“£fBô¦¦ÑmA›P+"”¡‚Þ‡j)P ÿl2±8Ä:'yb‚cÞ›¢Ú¡ñ¤ˆ+èº0\æMÔ' +þÖŸ‹í¶\ Áãmœ…X%-T?À$]%žçkì朵cÕ Mogqy´Ž€èÙôÍ«â.߯#_?„aÁ‡-ô xíûch$º˜buLsŸýÚæ %¾PÅæ׿°00‡k£ÿú /ùD`„Ãu²¿²ø/çýþqýŸg~í8sÐZœÎü-×8n±ÆÉ_s&uoÖdîL `¢ “ + 4Paú•)~âð¡nv‘šSdˆ¨6ÂB) +3H¼/vñmÕ<Û8ï.Ì«7ôƒ°YlˆŒÂ@wƒ¡6` +O™*b@wN qkÄqêÈ fÁvØVFRhÅASÄ(XMh!ì• ”ÙËý¶)§Ã½àx?ZŽ\ Gå]»n¨SÀB°òö©l&óx¿2ÎÚbbi}€áê5Kã@Í÷Õ=øpY(c êp­‡UW·o`0`÷ZX ~Õ¦ê ðÒš0(ÃdÛb H!W*á9Ë’+( ¦7å\û‹á–ѸÖ÷ŒÞ +aù6m"õWnø”ñŒ3•¤‡jª¬æ-ÌòŠžÑO¦å¥ôéÜ`A“ÊXLh¡! +J9Ä0*~0S”3é¥z!õ¸N„¢Ä5Š¦Zè›…—Ùi-Z® 5ñÈBÔumz [îÚzš…ÔŠðÃVÞR+ïîËÏ‘ÚP„ä.á+JR@N¡HzK5¼¤š ^j.ªÕ2fœ¶Ã#ûÓ…Å©5Yõ|P“½™@§„vÂ6Fçµd™k})¯VS`÷hXGlOIãÌk›ü(\•…Öî4\û\ÇáÚr‰Áæ»Óæ´-ׄæY1nÌH…aæ´mӌÔ9aØeN|h3§¥z ÿbçK#b {úI]·Š3Ãûû‡D(㫦ØBoƒWˆ€ekÍtZE›kÕã ¤¿*¡ñL»Am(¢›¸˜Lr,bœ¹üX¾†ÊW/Fë¥Z”²R(JçN'P(&„âòµ Jí“KSµcÆù¨‰ +¡+wIçx¯v,éè@!;L$œu2鵬$~4:™^‡þHKñ‚¿ö¸Nøk⚀ØTrÑàd"Ó§uh¹&”»ŽyïÝP‹¡ËÊ6¹(Ù&¤Ž’ ¾ É%¼‹÷\H»«tÉ]±´Õ<äd¤BSŽòI¨AâÄ |JÔ1œ^›OFš|i¯ŸNZ‚ãZ¯Íi8ô¹ŽÃ¡åêà°\å»Ãž»X¥ÿÉÕ[®‰åÕèjÉgÎ ×UÝ…'äü»‘ÚÆîðb72…3b³¿Ý„Ë%¿®òM¹$ºñ*m2Õ xM‰ÔMÞìŠ8Æë®&V 7 `!ÂÈcp€ª–BS„<¯ŠP4¥[Ƚ²Ç%9ì’Q}|Uï +¢îò]˘®ÞI„W·9CK·A‡‡(€ nyq«Ž¾Š³.ބƸÐápò²jÏá] {Mqˆ•Ì0‡©E‚½\¦Ãgz¹½×+×}Ô$þEÂjäÔË]™\É15ÖF*Ét‚úÂÛr½ ƒT:\ôœ¾„ Gvy¹>á»/5„Áw{\'|7q}wê<åÛe|4N`~T§i¹&4Q£;Y—õ·uèÆVµn ÃäÆ0ìÜZ7†òÕ¹1Œ;7ƇàÆ0èùToÚ:ÿýÕCÓ“ÉQøžÇ§@ßnÈá™ ¾“eðò¡Ž¬‘' ªé”p!:„7½¼Úɯ?è¬i!QêTËÿ ŠBÎc †ÿžª}sÐìÆ9oH|²)*T@G•¥HÄ*ª£yx{GŸ€â]tžeBš¡qÒö)ÈhHÆeN:##å±Ø‚¤ ,ïýüæÜËyMÿa&:úšÊ@Cµj¬êrø#›Äõ‚ +ZrÆõCÚÊ`S÷íýRy&ÁO— =¦ãUBbêâèg»hž+nC9jØï~¸t'h™5v{–eÐö5ˆ¿,p&~À¥ñSˆ¿›·‘ˆZ{-èLú‚eæͦ®C@â’_™DÙAamæïà¿ÈWGŠ¥¿xÕ6œ@ýža2ë.×) +ü*¥®Ê[Jl0eßë©ôL²Ýü6ý¶¢åÁ ™ùù÷PÛt1If]øÎÛ¸u³I·)4~*Z,9K×;U<ÆžBQ¼Åº› +Áà±s:€ÐŠ6uBh_V(u LŒšÞ*µºå}ñ½ê~5c@½)Ò*ÛªEüÅýT››n* ß¿M·ßŽ¿øWvÝOµ£Önºêwt $*…–4úÐy9 "Å¡êÿ6=Žendstream +endobj +1311 0 obj << +/Type /Page +/Contents 1312 0 R +/Resources 1310 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1280 0 R +/Annots [ 1314 0 R 1315 0 R ] +>> endobj +1314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.7318 238.2538 233.4785 249.0382] +/Subtype /Link +/A << /S /GoTo /D (dynamic_update_security) >> +>> endobj +1315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.8158 116.018 418.5625 128.0776] +/Subtype /Link +/A << /S /GoTo /D (dynamic_update_security) >> +>> endobj +1313 0 obj << +/D [1311 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1310 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F63 1063 0 R /F62 1060 0 R /F21 710 0 R /F48 950 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1319 0 obj << +/Length 2727 +/Filter /FlateDecode +>> +stream +xÚ­]sÛ6òÝ¿B÷tòL„@É“›³sî4iâúæÚ>Ði,“Ž(ÛõÝÜ¿]ì")Êq§=\,‹Å~Sj"á§&Î +©½™Þ+•Ìoää ̽?RŒ3‹H³.Ö—G¯Ït1ñÂçY>¹¼îÐrB:§&—‹_§ïþyòéòôâx–Y9ÍÅñÌærúÃùÇÄÓãÝÏÏÎßÿëâä¸0ÓËóŸ?øâôìôâôã»Óã™rVÁúŒ)XpvþÓ)Þ_œ|øprqüûåG§—é,Ýó*©ñ _~ý]Npì¤ÐÞÙÉ#¼H¡¼Ï&·GÆjaÖ²>úåès"Ø™ KÇäg¬63ùdf3ád6.d)¤¡Í +£DîýNÈ™rÄB!—ëuó8Ûnʺ½®6Ã3+ãE–¹I—ðÞöid{ÝÙ^Y#2éuÿ_îªùê7)³ª=ž™ÌN—«ù’†Ë¦Ýh>-7ÇÊM+‚ž«½lz¼Z=0ÖššGñtLë: 6·<¹d¬¶Ú<€@)Ša Þi4Û†FW=Û$œV5=‘é}U¦…2:cÂAû»’/”b¤v[n«ÛªÞ¾ÊF¥øp8/[äÇÈéjKµY-ðÊžá¦p"³.J¬¹Û®šºGíˆ/® UDñ©ˆÏË æ­•œž_“×Í–!¾"H¸r,ªëò~Íx«–gz´S  ‚¢Š=‡Áf™;dXéçm·‹uØvýj]Îo–ͺÚ3Û 5ò;G¤‘{f«p&lÝ3[eÓ’ëU»¥QsÍ‹™fÛFÜí²ÜÆQE6¾0~\¡\qî0™Ï«;½¯6«HjgËaO¦pß²:ܘƒfýPEvƒîep6Ÿ›¾åâOÇJ©)«Ôç¸#ÞõnGV¥–•ipPÑIzÚxÅØŒz×Ô‹`ÜA­x¿ËCúlMÇÀL! 6†ú°ÉcÈ"¤1÷6Ó"¤+ ÐèLh©L@Ũ©ra!ˆJ ¶Uo«Íu9¯Ú‘Md§7¼”áÑ£¤Eð¢¯4q×l¶- I#pv—EÀ1Ë1,n#4)¾t®Ðȧ8ˆ}O +÷íªþ7s_F[BoDBCÅ®êYSœ|–p{zDo4˜à}i£…Ó:bnË› øbMOÚ¤Dƒ16ˆ4Î/"©MÏ7*×yŒf º ¶C7E¡•›ä2…/õ‚œ'Þ97žñÌÅY—dp:=þ´q¢È@­EÊ-Ĥ!“d2×ß‘ÉHñ[L:0·Þc2xÀC&h’ ά/ÈFð’’ûƒ1»?‘bð=×tÃs(lfJÈ<è\ÏØb‹æêiÿ:.‹$á0ÄÍ!µ¤)Y7d>kwÈVbô…à®ÁLЇ(ˆ2:+Âi>€ó[Ý­GÍS +ù—˜$ÎEʶRºËŽ´øØgN\ýQÞ¯F iæ ‡‡ùvv@…äô¿ô€R½¥·ÿ½M'î¤=ƒ•$=AngzÔþ¦À7ka˜¼½Vyöˆ†ˆïˆE¾Èv«º¼Z£ +ÍšÀº¼ePòÃE¶Æ— +p©¹n%Q8ÿD3}Ã%$ÔÂs4¥MGFæ)ë4i±‰®|(ÕÛr¾\Õ|É!ÃE¥­X1AtÑ.ÊCŠÍÂh)‰r—qŽèiÚçÍŸVÓÈÀ3Ékº˜žMEŸã¦>dƒq&e°çŸLOô tØY.»È|ß2/ÇS~.ÉìvöØæ"‡ä²Wp™ÁUú‚l›NAtýÄÀe,KºNOGJ‰©†á£Ã +œc5 Þ®K+Ik ’ªéH ¨êA0hrQ¸¡ž7·”Z€0¿v3ǼNtx Ÿú¾/«±È=Ð=veýMÜò»”ƒxe1ȉ¤›–<‘¢ÞÎE°ñϧ ™„B¢­‘àõ+þR0Žg]Šû±Ø²Ð~·ñÁ„!ÓNXë¿'‘â·˜4JXãtŸÉC ƒ…2=w,nò¯Ý»é'” V/649”â&Šê4Q˜»pãÁ¸UÄëXêà†“…vEÁ&ÚÏGöJˆWÝÎÆÖ¢uª-N“—p¼Ùkŵ+ZÉ„I1:¹+ÈÁb†ï;Õ=g¡ò®£ »‡ëÜ/j^^HøBh£ÈO7ûïüç눴ð¹R"“R½Y\¹7o^ëìíøª‰ÂwÊ -m*'´äbTN (é(@ƒZŒ»Áü!Aó\Ѐm 憶“èiWÛ%#s¬ÈHϯÑlÐstœhb§† q5bÄ#”û,>åMÐh„o8ð†HäYprÅE ¦gÎÜÑb´¯?hªw3Ú—$[st*Þ'¡d¾8 + QõM׎b³£ËcŸM›Ø*¸©ž©HRå4V„[Ùï!?‚MÜoæ¿ ;¡BC3ê` WHûr‘ã×°aY£È‘™½šÎĦ§é4=êT$K%Y¦:F±,M’¥Qƒt ¦îë5çêüQáR÷x6vÒ[Ó­K‘ÑNùž‘@ bM_©SÓ(Þ ß©Ð9,ƾó‘Y[tv¦PøÐÜ×jÆ{Û'Ÿ¡ ÿì¡ Ï¥î7Ð0¼—1ö¡ð+Tá^Ä~l±ÆÅ®«0ö€  q¦¤e19& ìÊ]œHÈ3œPÒeýHÀßÆÚÐ26ûm·ÙŸs³ÿsø B±xWì=ßôG3ÒÑ%èŽKÐV…$½þû–&njü¸Öý}ÍŸØpMI¯PG·\¦è†´V§¶# ³¸¤¡ì¡víh3Þƒºdɼ¥YÛÜoæcŸRf ½_Øô¾‡å\IéÜög(ÐÀ€/p¨Ñ0 +|0hïC¢“ÜC…ÏmA¹"ì>ƒ!vh- vCâ§ÎšLls"Î*rïÒÁ±?> endobj +1320 0 obj << +/D [1318 0 R /XYZ 85.0394 794.5015 null] +>> endobj +370 0 obj << +/D [1318 0 R /XYZ 85.0394 658.768 null] +>> endobj +1321 0 obj << +/D [1318 0 R /XYZ 85.0394 636.4568 null] +>> endobj +374 0 obj << +/D [1318 0 R /XYZ 85.0394 119.9909 null] +>> endobj +1322 0 obj << +/D [1318 0 R /XYZ 85.0394 92.5589 null] +>> endobj +1317 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1326 0 obj << +/Length 3170 +/Filter /FlateDecode +>> +stream +xÚ­ZßsÛ¸~÷_¡·Ò‡ß›'_⤾é9©ëÌ´sw”DÙœH¤"RvÒNÿ÷îbŠ”)ÅI:™ ©ÅX,v¿ýZL8üc™Íd6I3Í f2_ŸñÉ´½=Ag•¦}­ŸoÏ~z£ÒIÆ2+íävÙË1Ü.~K,“ìFàÉ«w×o®Þ~¸¹8Our{õîú|* OÞ\ýí’ÞÞÞ\üúëÅÍùT8#’W½x{yCM6ŒñóÕõk’dô82èÍå›Ë›ËëW—çÜþrvyÛ­¥¿^Á.äÓÙoðÉ–ýËg*sfò?8Y&'ë3m3Z©(YýãìïÝ€½VßuÔ‚3©¬q c4³J*ïÀO»bûeÚÔ»í¼˜>X\tS½n©a6MÌ…úõ¦-ë +ü¥ÀWˠߟFkØÔóÅb[4ÍÈ°*eÚ ôÊfd¤Œ¥Ú˜ ñç1Ó×&Zö;7˜° ËJÉ.Œï&¤Og`š´÷yK’fSÌK\Uœ­¬¢J1–ÊÙ˜`äôAOw‹Í'Ç™VZõ²z·ëêýƒŽ¶¥ÞAO'´†ñÔ¨þ|vÜ&9sÙ¡ÛN˜~æR›CS”hŠ%S””Œ•%Åçùj·(«;jDÇø>ÞÁ nÄFtcÔq£‘ êVDÕ‡º\|͇Ôêü8î,p·Y:¶s$Uèý%¾î/H2!å T SŒÂ²Ûò¡XÅ`¤™B¿Öw§…ž‹b™ïVmC¿ê%=Çý8—Ó¼_ÜF̵€+Üt¤LªGÆ;Z,M‡Ád/•—â/ÔI÷'™23(àfˆ—맖ó~5 SÉLA(“Êìoûבu"3æ\šô2,KSÛïô’vG¤Ší£@Žzâ©yZ1œÄ§Y§OY§X§÷Ö¸üÑÉt@θJÓS•Ç'¾ — H{d$Z$“"͆Øóü1=Ø:“ìª:¼Ã8ÛÇÔ*_‹1†¥˜S6Æw¨"0üü¾˜ÄW›”KyˆÂ—zSlóÖC¶7_€P­©‰ŠZÀœÌŒ; ‹‡ráN,…JéØën›¯×„ˆÐVVmu»Ì1²QÒÖô¤$i·%4±ñ>¼xs eý§0I€†Ðà»Ñ/Bjx)6÷ÅÊ5ÔõIünxʯ14¼ÍK¥7¼êÈKöÐä`¯„³€ßª”òr•ÏVÅØ6e¡©5_ߦT:=Ü&˜‡æ ÍɼÞF­+ª/ØÞm¨tÁ_o^âî¥I £l˦@8v<)ƒÎÈ|%…*¬ÒQq ÷¸~¬†¸<iÔïIzy¼ø=ÂWå–Þ¬1ʼ¤÷ÿ¾îˆO¯ïó`+ø6®ëðhƒMÖùGŒ+žB Ðà/B“»}m‡÷Y5»%ªbÏË¢j¡èyùŠjÁ]‘"õ‹ùn[¶{žætrAMV˜[ µ \þ»ˆm›¢Z„¹ëŠžù¶¬wA¸É§c„œ, ª}…Ö"™í0&€¿£1õñ%ð¥ûr†ØŠòçT ½ÁKz6õ:H"£ó@òÑ…Åç|½ ̸AH~@Ø>\_ýS\ŒlèG`ðVÕ-½@>×£œ×ÁÚ»s扔•Ü¦ƒµWDaü|í}½‹3у§ßlËÀ9c€¨˜£(&Ò‚í¡¬ÀëŠ.ëüY:¯è I€¯ Â3>¿`d|Äsà ¨Œ{PI³c%ùUx¸'¬0áÔ®cJ™Ãs½öEŽ. ®¶pü-ñâhgÑRî) +è¢Æ‹¼x¥ Õ~üxÐ-oa7Ãñ±Û:O:€·¾ ‡0”DZËÀ"BS½ÚQ"Äž’Dþ²(Vy¼HBZ.(¶1‡°bîIT¹Æ¥æUÐöø ÏCüí®4xg_’ÑñpÑ¡è<ÌójxWÙäË"‚ÑXÊêRý¾¼éã…o®JŠÖ +¨Q;zùù¸ÍxÖ­ƒW%¿áN£»ôyö¨Ï¿Öp +ïðZcdÄÜÇiþˆ}}õg1x™ußvx–ÀÁŸqä ¸Óc.vsb&Ƕï3„í¾F`Uö9‡YõjüŽ»ïÉmaŽšLiv›pÿ +Âœd~0/ðÁO:›b[w% ÒìGêN(8k”>ÌO’€>wFp“DYU?†Ædzáù54ÏŠyNð +M´Ë»†›GFjM¾:‚áµ S-Å#£†6ª, ™Qz3à±ÈÏï+œõî(݇ƒL0 Þö¤ÃŸq$X4q?|ö8Ø3„CuGHײٳCTñ[‡ªôËÐ/§Ç&ßóÝ!òÃÞB ´8] +oSŒ|öµ¥Öžºˆšj­!\=}k÷¼ûË—ˆZwüÒZÙà©´9ÀL +ÄQì©5Àhp¼Ñ÷"lƒ¯©‚¥BØ œ™ËŽ|û$•é^çø‡Ï s<û“§Á^âÔìΓéÕ:2fSeúóßRFúj2]e!{„§ÌúÚwÂ'=­^‰Z]„t>Ù׃gŒdZ÷{Žú&j˜1ðŽI™†ÔÚñƒþ©eNhsÚ?}­ãþé´Fü³Û,ò¶ðwƒùÓÊàX`œ;mN§5bÏà+(@´¹ô½ŽŠ‹ƒðÏúKçÿ{ì[4€1”{«Uv|,êÇa¬ð{|Öîþ"Är–‚y}‡tx@(™Jq·¡ä #BÉï¡š±@Hèë°–`í‘ÜÂÿ2yò0&Oe:q)ãXÌ<ù4J¡³L‘Nïݯtï/øéj-'¯kXϤ·¤8î´7°_’•}ÆàXŠÇnÁ-heéž:BŠtßWà‡4´?˜Ð³«0vf +  +|Þ+1pJä •ƒs ä8vëdS&U÷4†˜Ÿ.ØA´%ËsÅýYÌàTNo^¿'ÍÀFdº> )·¯ðo.œŽ¶A¢ô-b†Fú3âþƒ…Æ*£CÝ!9Ý15ÔVW¾F9ú¼€o +çÀ³¡UGl ‘W¨˜ã"¿„ °ÆQV¼G÷‡'â [ŠÞM“N² w+x’¤ÚfLºÌM( Ä'¦°Á¿“˜îÿžè‡ÓNÖ>2n¼K×þK¨=(à×b7…þ¢cÚÁ Ê0 ÷Ãاu"üÉTÐê™þ?náÒ1endstream +endobj +1325 0 obj << +/Type /Page +/Contents 1326 0 R +/Resources 1324 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1323 0 R +>> endobj +1327 0 obj << +/D [1325 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1324 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1330 0 obj << +/Length 2839 +/Filter /FlateDecode +>> +stream +xÚÝZÝÛ6ß¿Âo•šå·ÈÇ4Ù䶸îæwm´¶¼bKŽ%goû×ß ‡’%¯ì$H€ŠÑˆÎ ‡¿ù ½bÂ៘8øòz’zÍ f²Ø^ñÉ|{s%"Ϭešõ¹~ž_ýôZ¥ϼ•v2_õd9Æ“ùò·äåß^¼_¿›Î¤á‰eÓ™±<ùùæöxz¼¼»}}óæŸï^LSÌoîniøÝõëëw×·/¯§3ጀù2J83áõÍ߯‰zóîů¿¾x7ýcþËÕõ¼[K½‚+\ÈÇ«ßþà“%,û—+Δwfò/œ ïåd{¥bF+ÕŽl®Þ_ý£Øû¦Žù¯ã™iǤ_¢VHæ½Ñãj9l†e6ÏŸ•Eó8ÈŠd;c(긽Özf¹O»í•j"óÆHÜ_ÏY*`[S¥Ç!ØÞ[tp`ôÌX-Opf”ÃÇÝtfE2‡ÿer}º R£?¬sÌ ‡Š''‚qí½"žVzô@øéf+'¯*XϤ·¤Vî¬'8¬ÈÊ`…LO58†sæœrÁà÷Õ&ÛàLRÔÓ™r<‘Ì0AdV.‰È#ϦÈ÷4²¬òÈ_V õa·«à³æI;’7MQ>ÀKê“fÇÑê°_D:[.÷y%­¦Š'UT0ùý‡{ßí +Ø[W‹©äÉü/oê)ÅNý¬}ʬ²j·Ø};jŸÆ[?™‘ÿ͘–– “~Y©`Ö +õ5+ 3ôÙø0À ¼4Ÿ‰+=sR™ï Œ°Î›ï!}ÉBÄxɬ֔ÔßçV™º$ÛÔ-ЪÞ,-`ÊÆ6û¬¬WSðÜ#Hgw$ò4·¯15LiÛÎÅx{._x¦\Y ÚŠÕÓe¡°ÂaGhÆùðèïð·æû‡G‡øô†b¤ +Ã0§µ+ÆÂ),K!eqΓÿTeNer>B$aƒò}ÝÃj+.¥p¦Ê­¬MÖYMÄ6_¬³²¨·ñ½(é¹Ûd!§ÙTøL“U¶(¦rf“59 ýL Lá•2-2‰ØÛ¢‰_«¨„R(²o«C«UœPeKÒÒ¬³f,wöt¢7¢ÉH¢|HÔOu“o¡ýPäy;ºª6›ê1dô0k×U¥e»Ýæ)J©èùgçøNó30:ÕÒˆ¶ =Ó’E¦YŸë<:®S´3ŠšSÝBi&½þŒòŽkDû L•g25'ê_å¿s.ËP,%¤|¤ÉæºÏ64´)ꆨ°“ðõæmd†â8.ÙÎoYÊl›ÓHï?ŒdÜyšK3ã &®ÀPçed¸½›ß¼þ7Ñ[Ð=ä!"  ßHŒ¼>v×y™ +ÕR\¤ñU4oM£‹j÷DaR´€åð9µð áš/Äbïb…v @LÑROÊq­ð‚~Ë—ÄÑÎèû!jº}? Êêdú¢ +Ï%*’¨ûŒIÖùfÉ`<ó²>tnÅqò6P°ò"ÜaíákdC[â·Çb³!êã¡X|À€¡é%º$?Ä9Áð„%f›f_hùl,¶ïB,f‰9ü*µÁ}’Z'Ж5Dm³'"îszÖ»|Q DÑ•8ðX :¤òl±Ž9²eÚGŸjÕÖ¬a|…záL[ü{€&!S yÕS"Š$«[|&e®jµ>~àvÉiRÈ=’7¬¤Á¨v>_e‡M˺¢A8Á€Ç¹OnVô¦=w„°p¾‘Æ~©#RÉE䥘GÉEM*ŠOy´­(i(Ñ õ*{«2DÕs]RCºì6¨Æò³…¸ÿ‘ÄQ3aG*@Õ¾XæäO% é„ :lÄ)œðxÛ›tõ@iÑsÔÀ1@O¦Œ§Vâ‘×Éä_kt‡Ò|Ô Î3Š¾‚ÎóÞ·àþÌ#4 ‹t4šª/M5¦UCË«ºFlDx ¨–“›U1€Ð×5?Éëät +0 AÒšh%ëÆsÓŒgP§ä—AQ2•ÊQvÌM@щˆû V¶UFºªô1*ñmnÁØ,2ãÆÀvj洞À±.Þð¥¨ë n€ÔÅ ‡fvà†|»kbk¨ßaCËØh´åi\6æ³EF…¤üâl÷¡ R¤—»>×ùî£ãBÓ·Ùgmóƒ[>kŠm>+Êg­H +'wiõeK:®S0t +N©ÚrSÞC×Nôº  ú¨SP]r(K:¶ÃçMU>С_ÇüI]`E)Ÿhæ¶(M‡#šUš0%ßo‹ís +öYá†Û\BT.O[Îc~6Ô;àSHND§²E„$r Ç£šv|(ö£Ø¶ôò)Ûò¡dé¢Úì©'Usu¢ñ2šxÊž/£©ÇuM-×(šŠåfMx³Ç±‹–t\#¦ Ñ$ ¹89´åˆ&Ñ¡I Ñ$I+:=wÁöêáØ +à(åºY¢C–0Áé¤ \¢k£D—8˜ë¥Ö¯/—=‡-qÄÖÿ ZÒÚ‹‹Ðês‡VÇu>QU‡æ¶  +j íÁES:®[†Ø‚º§ƒcîM—„þ=#ñ Ð;ÀÂk?UÉp¤P¶ +ÜÔíªˆSSê¶^b/Ô}«ª(E‰û¿h¶’RÂH÷Hõ¸.@ªå:Ÿ­F!mԃ˦t\#¶ !…W¸é‰1GH)ÞBJq>ÈW\ó”¯à9’¯`bÈW¼ÅÍ ùŠ‹a¾â-¼ +ùŠx—D€Y–B „ü5r–€øIuª/¬Ïu`Wèãó}‘mfùþi¶ÇK¶S`YΤ·æ² ׈ `AŠ’)tU#Þo²Oè5%×Ru)†w`fµ,áp¾‹éã6«›°”èÏ—tÊ…g¸>ZÆN,V4S#é.²¨°ËfÍÆ®mæS/t ýpEŠd¼lÁ±Î + ƒØ$´‰V÷NRŠö§Yàñ=‘õ‰Ì-’Õ=®ñиˆÑCáú'°´7DøRÓV¶' ä¦0¹Â æryæ¨--3Š?ý¼¦p8·F ç¸n!’PAUQ69ÖKØ‹ø%D>wnÈrL¼Eq´æWÏE<)âð®å«óEU.ƒtðô¸bîxÉ@Ím’ŸÏ,Z=g?siÜçºYZ®÷tD¤2Î1­\Òßq0H+:½Ã´Ò·àwHú¡Ò%wH©3ð°¸ s~Æþ¥V3‰?—ô±A +Ãê#ÀÈ0Ú!>Àìïâ°'܇íbb>¢9±Ð üÅé4yJ¹#’”‚t‚?5„û]øn`áÊ'0íሕúçW„!bËÅß…º|ˆ?+>p¸nÛú}dI¯‡ºûuéÜ£c\òuyªµ;qÈ™?•Q†áß®Œ4ï~ýþæ?£9þ¸ 9B¹s‡#Å-sÒ§­Qh¾IO-7 +<âd:búÿæÜ"endstream +endobj +1329 0 obj << +/Type /Page +/Contents 1330 0 R +/Resources 1328 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1323 0 R +>> endobj +1331 0 obj << +/D [1329 0 R /XYZ 85.0394 794.5015 null] +>> endobj +378 0 obj << +/D [1329 0 R /XYZ 85.0394 548.8286 null] +>> endobj +1071 0 obj << +/D [1329 0 R /XYZ 85.0394 526.2567 null] +>> endobj +1328 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1334 0 obj << +/Length 3252 +/Filter /FlateDecode +>> +stream +xÚµZÝsÛ6÷_¡·“g"_üÀcš8½t®i.uçf®í-Q6§©Š’÷¯¿ßbŠ”(Û™äÆ3ÆX‹Å~Cj"ñ§&I*R§Ý$sV$R%“ùúBNn1÷Ã… +8³ˆ4ëc}}ñÝ;“Mœp©N'×ËÞZ¹y®&׋ߦ©Ðâ+È雟?¼{ÿïŸ^_fvzýþç—3Èé»÷ÿºbè‡O¯úéõ§Ë™Ê5}óÏׯ¯>ñTÖøþý‡·<â¸9³è§«wWŸ®>¼¹ºüãúÇ‹«ëî,ýó*iè ]üö‡œ,pì/¤0.O&èH¡œÓ“õ…MŒH¬1qduñËÅ¿»{³þÓ1þÙ$‰¶)8™K3Y‰L)àdÆ4w`²VcLŽXÄäݶ¨Ûe¹½Tùt¶l¶ëbw|p¥|:ûËŸÑaPazT(#EšáD2þÛÔ%nÏ%A-wçEÍÀM˜oËzÇо­êÛðÑCÃÀ¢ZÒIÂ:T>XûŠŽvÄm2‘;Kç B@Ç <`ÆíÓž@†UQ‹z1²žÊE.qQŒ³.êÇ°^;²`šˆ<ÈÈ‚0pç:Š®\)á’Dû¹ë»rl3'´í:s—G{fJ$inãy7»ª©IôóiÕR›±å‚GâÌ»{`]´;làÑÚr{Ï0n%¦×UÐîªùczx£Ðâ.­9—Qt)yïNkdN¢žDÞ¨pgîËÀ„ªò28hü±J²éÛ¿ðȺlÛâ6ŒnèT4ÊBÔ6{ÌËþè¼ñí‚?‰¬ç¹ÅØ™4ôôÛJ†V%I@Þó?íEË;Ò÷Ì“j!ÕC9¥]«ìˆö–‹Ðnš¶­nVµªý¥Ò<7GbTµ€Ù~©ÔÃÈ+ãrv_3Qa÷ÒëñïRêy5~…Qm¦7û] .|ÔÔ«G†ÚýfÓlwå‚™¢S JÔ)7@6J6¬Š]u_ÒFºi]>ðd»*îËz‡Ý˜m± 3ûKÀ7ìThÄyœ$Ž`.Ÿr½`à0g… 6õCnžÊæç`+lÞgq¸žqcJ1Æ~Ø]™w¢Õé¥ÔÌU´Åª¥«—¦ÇU?Aü£6ˆ‘·¯Ôÿ©šû¡¦m–aè?—IZ4-/U æ'ªõõ¸‹rYìW"FNëÌRgŸ?½~îô™™Ìú&÷ØOŠ$s_lS­Sª£î‘c‰›’Û‡ÞV‹EY‡~h n6aùƒAŧEËæX2ÓÑGànTD4ìIdT¬°Ü Ž¤i€vWìÊ5®RœDøè°úÌmgU}uHø6ºÎ'wï°F¶DÊ +°'îï4{]|®Öû5wêýúÆ{ÀÍ’Ûª¾iö^Ñù›ý ^°â»w¤Iù°…€›€¹½Ì§ûºö7èšz¾ßÆ(6H)5¥PÕèh ÛZ¤ˆ“’Ý銑Éô¾XíK£ÚX5”ËÜØ(ìJŽC\;êÃÌ"~_³>—…—¹Aà"Mz¤$ñÃ&h”ë…DLq»)É®¸ßPk9Π°çžµâ¶¬çaÐ_} 4@º +ožéƒgÅŽÙ‡Èq·ÎŽ #7hQ§§Õá¸åAÁ<°jŠÅPi{SóbÅ`ûˆ°h}V’ Q¼ÒöiêcW kÈøf·C摬ا·ï°FöʉY–dC¼YåD¨AVKi4ƒ +QUˆ ž +:«Mx"à&`öUˆPϨkN.T–yN2üF«î{¼Ä_û²ÝµQ ¸-?Ïô„û_ßµæ@VNªÕjhòyÍ%…Ò‚ýuüîàíÐ ì7Ó`ƒ$Qº.²z‘ +Ÿ“B˜>™9óŒö°žÂˆ5”ÂèÉêö4‰Ì…µF=ME‡5BÆ0‰4Â"óÒÁVò ŒÔ‰Â¨wù;Tò`ΩòHPO}÷Ž£ ‹4t0Odoðý6MÏÖ\'KŽ•ˆ>ÇAš[„¢5ƒ¼ìºÙ•Ü§È‰¡àÒa¡ÉPkŽìúBåBåΕ¶ÐùTEó­Çl¶pY–ö¼‚‘/ò +à–;ñ +C±8Ž,œ\žb':ª÷A™¥Hòì(Àõ>Ï>CéŸYï30Ùõêà3t|«ã±w öSz‡Þ–*xB"ï0 ¦‰4Á—èIé]â)åPV^ÊD¸Ø¤é¹æè#7ƒ”Æ›Ð<}€úO9õà#£…”†Î iIͱŒlH­‹˜›»-3—h[ònã[ ÛÍEf“!—¾Y¨K5¹,Gzð¤ìc·‘ÖIAYù¼<5‘™Gö Ö3T(íH$^Dű0iY£Æ®¤CVV ÖtÌ!2jZ,¡âÑØ%š`3© &ؾ²@åã½eèúÍG Åu9§¢T¢8_ÁÞø¡FKOËrǵ¦œ5<Ì 3¡þÔ™ÿÄ…ôªWãYc ‡rUŒó!Oßöë-è‡b›ƒ|ò èª«&1 ¹bå +úaílúëÛaƒ‚혎q3$ÓìÒ#£¢‰ðj{`Œ¦~˜/¸ð}ÅEH l!΄šf¢c&ð‘‘¡¬ö vÎ.F…nC)G”:µÇÞ3Êb›ŶÕŸªRÙLd‰Œlö'>ÝN.ÕY¤¶ÙŽÕœZ§I$Îógt¤1Ž½Ãús˜áuÙL‰Þí~[ÄéëÏ«ò$ZÈ4’‰¡­ÜKÞâÒÓf>þ#“!lÈtz~-þNb­Æ/†KÍ"uävpC껫å$Ï„ÎàWa[„sŠâ>ô˜˜¤ÈˆÓ¿Mg ~¾œ¥jzÿzzòHš§È‡ba‘'™œü5Yç£=9€ýY<ðß½_ëÉÛ'šôžõWö‡‚ö£Ä•Æš R(¨áÄð—fEVUù*"H7Õ"ŠA.Ï(Ϊò10FMðÉÕy€ âȇ :a¤ÜíXõÐacM£¬S¼ >{t–—r‚]=r-eEÌ/µœþIÿÈШ´©šÞÈú·üu‚c ©“°ò‡é¯kdr"÷™›†O’ò™Úƒ¦‚g"Ÿy¿î°Î²Ù}zZ›œžÓÒI‡ÓÐ:b2¨> y1.Ò•wZÎÖÿJ4’#§¡ù™a8è<視¯¥©M("ý}RØ +5«¢{RãgzÀ('Ï ˆRÓ³)‘–”ègªÿ}¬'®.bq`²›½$-2ozó}’k„’áÝYa·¤¼&wœeDR¹­ aei¯LH“ƒw`ô)Ž¡–uèì¢1²ªZÿdæ±ê±DYAÓÒ,ÿRoœšøɲ¨Vm zôw²IeÝîí{FüŽofVäÎØñRóQ’ÉÓ¼%¡/wg½¤J¬0ÖfßÄKæT70î Œ]ü✗Ä2)ógœ¤²J(Ï·t’m.í·÷‘½…Ÿp‘Рiv‘ïýÛŠœ>’ÏiöÜYP)Lªàý$%õ”G^j$« Á4è MB†èÝ»õÎÎëVé\"a4ÜÞ„>å±T’“é‚ö®Ù¯.ÃÓkjÎ×Ë¢ ³0Ø z& +õ'JÓ3b4±HöÍ&D 8e—V³¦ÑÏs@#½h ÁÙóD$“`Ï,妬Ãà~ÓÔ±œ¶¤R·1ˆ ÷ï‹Í¾m‰á~즡ïùT:‹õ‡Œ0±¥l’:[$ÿœø£C‰?ñ‘h3ÏÇ=}ø: û„ôx›ÂÝ°tüçprûÕ¿Ð;ü|I HÓã>…BR›DÒ‰ÀZ|£I~êP%½AÐzÄÿ.:Xendstream +endobj +1333 0 obj << +/Type /Page +/Contents 1334 0 R +/Resources 1332 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1323 0 R +>> endobj +1335 0 obj << +/D [1333 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1332 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1338 0 obj << +/Length 3258 +/Filter /FlateDecode +>> +stream +xÚ¥Z_sÛ6÷§Ð[噈Å‚—§4urî´NÎQnÚ>ÐesB‘ªHYu:÷Ýo P¤Ùé$™1A`±X,v» ŠOüç«&35I3•hÆõd±¾`“{{Á=Í,͆T?Ì/¾'ÓI–dF˜É|5àef-ŸÌ—¿MßþûÍÇùÕíåLh65ÉåL6ýáúæGêÉèñöÃÍ»ë÷¿Þ¾¹LÕt~ýᆺo¯Þ]Ý^ݼ½ºœq«9̞Ù ﮾¢ÖûÛ7¿üòæöòùOWó~/Ãýr&q#^üö›,aÛ?]°DfVOöðžeb²¾PZ&ZIzª‹OÿéFÝÔ˜þ”¶‰ÊLfZ$™Ui\Ë,a´6KO47¶×²à1-*Ôr^u³n›×íªØ^r;µÍn»(fæXÜòÄdf2\äD”@EDáÖ$&MåX–75œ@ÊP¦b[ç]A¯½xî åCAn”OË•§zðäMíUÙvÅ’ÚeÛ9Rˆ`6ᜠ—?¯†#é­JWaÚ*/«Ö ^/#Ë(–蔥ž|×3$‚ÃeYbE +ÞÁy’i-ž;˜:‘,“žoÙ’ù¶E—œØ®7“e‰ÊXö¼ ©Î[QO6õŒàc3‚£7pôÏ +ÓSE¤Rö¦¬‹ók‹&`­7 +›L +û&ƒ“ji¸ñuºœ)¡§×+y,‹}ëYº9ža»)åïŒ gp0Ú=”žÙ²X廪ó³º&b!3ðš”AÛ[`ÝDúð`K ìo»/ÝnáèËŽžƒá-º" X’ŠL{FO°óÈZi¢¤ +4¿3ÍVN3zˆÃ–‹f½É»ò®¬Êî Hùy#ÔÀÖÀŸ7ÂÕ3F¨H_]¹z:gv +¼Åýüò=Õ ës  ­¤}A€#}™Hm¸×粓\—5djº(ØÔÓªYäõá‡òå’ì®m_A´ti³éʦΫê‰Þýñ#ÍÙ4ÛÎïËÊ3¾+…œ%h™Q¹‹æãžmáÖ1éôæÃüúÝ©w rä÷E nbŒœÎÕãÀ@NO¹k;?´Ùà<® ¸ìx:GuËTùchÛGtQˆÓßµ–&K¸ÊësÜocv,1ˆÊ€×_0@xN<ô‘Û-ª|‡%¥r@€O'¦” ëˆ †2Üxö ÿf?#SˆÈ¢³â^ð)ZËe&<(–k;@ªuQwþµèüª)âÌDYf‚"¾Â 2m_a¹³ h ‚œqi°’—aA[Ÿ  hd/w.ær‰mË岨ýû%ŸúfN_|œöh;AŒÅžtz—·Eaðe½¨v˲¾L#a=ŒÔÊ|½:XƉ Tü÷%yMÒÄ• +I¡4+$XÙÑbB%,Í‚h°óÈiòÄÓ)#ÊLj4}€ñÙÇ€Ú£þC€¹Æ¸t¿ÛæÔ‰=UqÑ2’ §SHŒÒìkr\i]Ênã9.ƒD3=ú,/šÇ€—o†cV³ Ü ê¨%ÀÜA¯zÔŸÝ@ª¬‚ 6u*º(8ÁDË?>„Â_1½:Ñ 0•BÛ‰,±\¹ýLþœ€ã©Ìå`lÔv»=hÁu|½“ØÓd¸­Ày6díöeÄ(äpô;@Š$µL9¡?5B)×SÞl*pjRd€Fáiª²ØRϲ)<=¸5ÚÝfƒ®¨Àx|OÑuÎÓðÅ#4eK ßF”÷ŸMW—’y“ƃzÃüíGò§¶Y\ +6ýŒÕ@¨+TÀ²4r2<èo³ie† u(¶¾Í²g’wœ¡Ggò¹lMš&Œ«겞êµbÕÁ¶†¼Oó™@a”é«@éfÇ2ü\~Ž!ž€dµ/¢+¨VÈó¼"øqQ +€MU÷ô±ÓµC~j›ºÓ^Õ«CÂéH¨¹á‰Ð{²1ù%›nHc9cŒ’&ä÷’&jý ud¬ZhPhfûªçQÍvËÍ S¬Xê‘bzh³~û‘êÐÞ†Ü$lÊåK<Á–ÔŸ_ËÓIiþ‘”3!³3Å,š»UGò>ÏÝBÊ“±ó\¥äŽW—À+uléi³¢8Wåó £“,cÇU2B›6€ÈüÉAÉášÝCÞQ‹_¤s© +ôPŠ‹-—€ÀÓA!’†rÏhtëƒ5Vaz/À )–LN?'ÕˆJÁè8äŠÈa™ƒ8ÜÞûˆq;¼ +ô³á„S?>åë‚D±ð¡„óö~(³d+Ò‘H'€ÒS½ HÀ4‰·e&Ú]ÿ¡Ùå)ùc^Vù]å_ƒ‚q¤/´]m뫦%j—³é»P’åëMUxˆÁÄíh…Uƒ©9¥Ž‘ÄÈ®Ú:¸»OÁv£Ž43Óc›×÷5¥H¥¦Ñ€7¯©ý¿×±Èñ ![˜Ä^Ÿ,¡±Û/1  %ŽŽ¢ß%BTŠ^ÃRpçuØE΄=ÜÅ~Â]ì_¹³hÖ±¼b¯°ý}T¯‹e¬ÃHc•¯Ga tK\Á•ZÂ_ã …£e8œ#ö;µ´ÿ‚ÄEó {$s…+ŒË þ½"0ò©ôPñÑ ’ù8®(šDöç°F“ªèÜÇ¢ 3Þ.jõ€ +Ieƒjâø Lm*Í?Ä_`âr3Á8á ìi {6äpxê§dRèCü?wÌPU±ô{³që,š¦%?„ÕÄBoéü:à@—da©ÁtE–Žl„ƊИZP”tø-WIÂÓKnËÊ—•Ðù„] 1ö¿w1ö9ˆQTÂŽ–;åîµ9`í.é¼t˜î,Ü´¯ý¼Õ@ðlúç®Ø>ÅpbO.¨ Dº’\qØ•ÓctW$'Žô{v/OƒYæhï†Ù>ÕíÞ ÐÞ7»jI“¨j€¾û¢r5‡™ÇŠ$nËÕh—¼·&¼xàýåÔ¢_ºèvH{÷†'iÌÑå÷yYãMWÓ›¦+4^"_mIynQ±éÜyÕ6D~ç‡hŠw +„Â0½©+¿²;Š8Œ/Õ^„µkŸ‰IÁÐ%Lú é»îqGÁÏ]k(‘X!Æ8ssØžâ5Ý@¶Ä·ÛøâÕ¾«—¹³cèr@ÏCŽ†= Û¶xí÷¡xó!× —=º¬¤£iËe± ¡Þ'wùâóž8,#ÕGP}Ó´myWùᶄ¼¢¯HútbÓýå?¹ö™p):2_t|ؘ„„ÌäÓSÛkÿ!³õ6•"ë2zÄG•ÉüÁ'¹ã;TŸ÷æ÷~ÔeÛÍ®óúÉÓ‡¥¡í ~ôqº)€@#$Ò +Eùf»‹¼ +Ùóc^í´C‡/Á‰*›î +ÏÑרˆ˃ë ZSme %ƒ‚IŸ F"(×ýµûò©L*‡!׺ókúÛqh•5è+÷/ ÎØ—‘ÈÕg©L·BÅ.‡ÑéXð&‡pÀ¶¯˜ð%욶êò#\½öÒÝ—÷ùÝSWD‹`ÉTbGÈTûCŒ¥Ò$åýçK:ÝÖ…k(Ùséµu)¸ôeôÇ@cÿU®wkzæûøºnvuY¼í?Cù[ñÌ2³Vp±=Zß+úrßÚ瞬 ÜJ%ÚÈt™QBÆåÙì‚«¹á<ÜXtù¶ëk¬Ç“ $-¶åæp3µ!H´ì¯{ÛòËIE)µ„ÄŠ~.íyúUW\ø›‚³\=ÇÙåéõ•ÔÎ'=,ªüصµHÞˆùOÖõÉ.2ÈÏ KG»x¦.îé#2ŽLã„ï¸.v¿0á'U:Þìs•¤9ýF zA†Sn(Câ\ºt¨ôÆ¥•®ðÚÇYA_‡Bï!ŠÀkåÐ>…NœIÐVØR£ kR.F+xˆ^k!Ðõ†š~jÝA€z“8˜XÈÄšú;„/ËýµsGý­ã…-äðt‘ éÌÙÍÙð§LO?ÔžÁÎ}CÅ­X¤ Ì©Rš +G|¡ÚÓR)„=eÛî²c{°^d;»Ú RŽ.ø Æ;?†‰g>ƒ'P¥¾ô<Ð<÷ ÜѸ8Õl‹6pÁÑijkö4'‹Žâ¢0ø›¥Ñªó€exwIÓ—¢G4ʲBþ5ºÎÙ­7çL$„º<½˜ ,³Ö¼„Õß>'ç~Ó%<þ+¢ÖYúæß{~ UZ+Î@8ÅŠ× …‚ëììmÝ©èÿ½°Ñ½endstream +endobj +1337 0 obj << +/Type /Page +/Contents 1338 0 R +/Resources 1336 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1323 0 R +/Annots [ 1341 0 R 1343 0 R ] +>> endobj +1341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [471.1233 402.3147 539.579 414.3744] /Subtype /Link /A << /S /GoTo /D (query_address) >> >> endobj -1326 0 obj << +1343 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [361.118 212.4953 409.8647 224.5549] +/Rect [389.4645 133.6118 438.2112 145.6714] /Subtype /Link /A << /S /GoTo /D (configuration_file_elements) >> >> endobj -1322 0 obj << -/D [1320 0 R /XYZ 56.6929 794.5015 null] ->> endobj -378 0 obj << -/D [1320 0 R /XYZ 56.6929 540.8756 null] ->> endobj -1323 0 obj << -/D [1320 0 R /XYZ 56.6929 517.8101 null] +1339 0 obj << +/D [1337 0 R /XYZ 85.0394 794.5015 null] >> endobj 382 0 obj << -/D [1320 0 R /XYZ 56.6929 293.4989 null] +/D [1337 0 R /XYZ 85.0394 458.5915 null] >> endobj -1325 0 obj << -/D [1320 0 R /XYZ 56.6929 267.9627 null] +1340 0 obj << +/D [1337 0 R /XYZ 85.0394 436.0118 null] >> endobj -1319 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F62 1050 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +386 0 obj << +/D [1337 0 R /XYZ 85.0394 213.7989 null] +>> endobj +1342 0 obj << +/D [1337 0 R /XYZ 85.0394 188.7485 null] +>> endobj +1336 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1329 0 obj << -/Length 3260 +1346 0 obj << +/Length 3419 /Filter /FlateDecode >> stream -xÚ¥]sÛ6òÝ¿BoGÏT<|$8÷”䜞;iÚsÜëC¯Ù¼P¤*RqÜ_ß]ì‚"eJnç&ãp±X ì÷Rr!àŸ\X '‹,Ob#¤Y”Û+±x€¹o¯$Ó,ÑrLõöþêïïu¶Èã¯òÛÕ/¿ŠÅŽýÝ•ˆunÍâ "–y®Û«ÄèØ$ZL}õéêߣYÿêÜýmccU6sJ.P -€“t‘™·8‘È£§ª{DÈF}K˜ºÚV=£áŠm{hÙn·uÛvÿL¸CçÖ„]=Ÿ¼Ú¹ý·Ç ý2CÚ# \$°+Gì*8L¦s<&2º-¾.Ë¢|tË®ú=ЗÁj™3yѬgÖ”n ÑL³wåaßU_ÜIKmul¥Ñ‹¥”qnŒòTe]¹¦ïfvÔ*ÖÆ&¼Z»ë«¶éH?ª¦ë]±Ž_(ˆˆ…Ýͤ‰³DËyƒ`¢å˜Šä)ç "P!ÿBÕ®;Ý”1¶‰Í.ox¿s]{Ø—ÌíT›9!K•ÇɎרUmÚºnŸªæ‡öè8p®s=5-J áú°B¸Gp¦ãÉ ºtýàá’iÁ^ºÃÖïV)x‚^¢M\³iùÅ5MWMïöMQƒù1¸tô“bêg…»/½Ò/š=k -þÍgð–Û³Ve2 ð9—­jLuÞªªSª¯êeÝ>,g-,•q¶p™j†‰…¥iœ¡ŠM¹¬PŒ¹fe@XEnÕµµëÝ?®—IšD”ÇÓEYº]ï…†£fÍÓ É3Ì x=@ùÒXB”ívâXUuÕþ4ÏyO‘•BdLÕTòÌëK‹Ò2ÖB#÷ÿÀ\@“ÎÆnˆ'²=z”xÝr(-XGÀê‚UjshJº' -¶ôå}çuIÙX*™¾¢K#ª º¨ÎòT¡’Ë T3,œª¤+vÊÃ'ç=Fâ/ ƒÃÆçÊC¤ 8H¨bÖi@:ÀFtîÅqt–Bì´éä84¹Xp7:Ø@ÿÊÁ^®Kcq#G :æS~ÀÅÇ&‡ôïâõT¯pñr5Ê­ŒÄÁŠèçGÇÜO>sƒ”V*§‰É§ÆSìvÞ:[ÌiQÕ³ Ðí\Yá>›FÈÓf«£®Ý2•ºã×Úzíºž‘û¢éŠ2䤀ñf2&8ÆÁSU3´âéâз[p ¥ÏOyy—mûÅ­ÿz—"‹iò?|é!„óVUw’Hu×´BRHPš‰3ã}þïmÔ«¢«º³^#g W¢/{1Õy¯1PáaÛ®_BÖÔW\t·ƒ}é8rPA­.31PÍp1qV¦PNظÅëImð iYÔ¶L4±#ÒŽÉ`:ÊóS® á‰g£Ùãiòö}E fTnrÅë~†`†2Nuô±íÉ„R`Ú ó[PµÝÕn ky#ù‹q ÃÖØE¸,ÑÕ‰ªiQ9*'ò„ò;SPË_da šáa Jy>eb.c—G!3v˜®û¢qí¡#*²j>Õmûù°ë&Iœœä{ì=È´0x eàmÉTçS÷±rElXIì€_å;ù'Bó1ìØí¼;ÔÝæÒ°“ÀŒ}Æ“(çØ—< ÄÚè­+ êEÀâ݃ÏSîhÞè*hrST{B¬ª~|*j!L¬¼·ÃÅÈë,igRjÁÁ3±Æ[Ö’>¢• ñçªnWϽë`U­Mx/‹¾õ!,±!Ô|“EZ ^X¤/:"ç»Y¹šÊ']ÚÊ;bÜ‹ÊvD¡q#fÅãµ+é^ ß(ò‡â«PÒ¨T›éU é‚Žõ¬*Æ…&e­g¬]§"6Ö¾’õ©Î[û@å%UîÎÚ¹†ߨìòæÕÌîÓÊ<ƒíOv'ûÈÓ‘™Ã`0s€½ÂóÄÌ3è2À÷ï~ddÛ4nÈAµ"A~¯Q£löQ³(3ìÐN­ý/¤©‚#&#SžÑB uµVÙk  |šçæÁ¨.>P‘¥ø{X/»¶üìf¤r‚{1—9¨fX˜zyƒÁÚNyðW -9Ô ñD’Ärx„!+,÷Õ®o÷!¸YàO@¯ù’§P$ûßаë×U‹°É"×—à2­H9ùò[;·fmŸ+GK®ªöþ&ÖúÔǹ¦=½Ü}¢ÑÆÆ"3r²=õ[;î‚¿`á„Ï€{Õ8ï3–ÄÒ×)¸Yº¯€9í¾Ê³°L{É#Îgf E)XWèäG}H°³Ë“®@hª§Šë(­‹¾ Èë<¹S´-œVq3!•@äU¦|ºä=¡9¾:„q€9Œû),9奨XS‘ûº«BóÇ;Öÿ"hó|Ç`EiŸ$õL"ê ›èÃÝO 4 Ÿ}Ñ»‡gš â> 9‰ ‡ |ª„Y²L-¹¯%Ä(jQ¨$zCdÁ½ 'zŠé¾ò-j¼7ïŠ]õlÜ÷ÓùòÊyl²'pOC{þÁç¿€¢ös»%jV2D‹`Ûø<@O¬Fž®ÚÓ÷÷x«£T|›JGoà|gù@ôÒg÷üÄ|²sµÓã^lÎd˜„`‚×ÔQo™N’Ë‘ù6T&9UGˆÒj¹ -=íCÓU u¬¥ónÏ ¢k_ÉË]þÝ7æ,*ƒ«|‹ÓóñL 5¡­xŸè(/6´öèŠ-Cc'‹ctÄøôð•Å²»|įŽëÂR¿Ñv»vσm;(‡ JÒŠž+úd©^÷oW…Kí ÂN½ éÙ3»¶«úŠª1M— Ê„ƒ!BPUIo†8Pß¿%à ùG·€*ß’“o -°bH${^ª%4¬æ¶!LAÃàuEõb±6©vuà²rOTÑŠÁ[žk°w}ÔšR+ßïÛè2êðá±=ùðæ¨Â?@¸ñ5èÇkÍLÿgƒ©2Ö‰yåsÕ˜ê|8¨B±Iùíʃ›ë,ÉLä—9¨fX8í,I¨ TsN´ &n–ÚßÕ®ôAÏi‡ ôØ `H45_+"5¿{»™ÝÖ¾q5ÁlC½:DT“ÄJ¤zjÎT˜¢Áð/z¯8R*ÁØÊ‘sýŒš¢Ø‰õ”‚Ú¸'W]óÜcûDÀ¶hž ò?S+iZ²`.(Ú"äÍÊZº¿5áªfNáÃé•”dö>E…!H@_âÔA*Øj3øœY¹á½]ÑQÄØ gˆÞ¾}÷ööí‡7ooþ¸ûáêíÝÀË”_)2òçÕïˆë °ýÕˆUnÍõ#4D,ó<¹Þ]i£b£• +=õÕÇ«'£~êÒùicc“èNWM’åS–q&% eiåj8åD.rÀÂSÞ}ÑU¹Svsg)\Ҕ䳅ÒÂÂj²0Üj¦œ/|÷ààÄsíŠ/ÕF±kMOp»Å¯ð[dT·kO÷a~çŸÝ!ÐâÑcçàâµJÆu6n[k¦]uÈð·ïôô€”~òÌsþhx‚Gœ1¤elµ’ŒçR°¿^©<‰3›&×+)ãÜ’kÏ‹‰ŠÃ´Ñ†Zuµ«zÛ†¾#_z¸ÖŠ{Ïœ6Ñû-õñaL'™¨è{·ÛßÀQuŒÕò@]·eÑó”)íŠ×v_J×ñ¬vXƒùŸÄóã·þÍÍJ‰,ì# KTÄL=VuMж¨jm£Ç‡ª| ^¾¸”wFýñÀPíŠÏLu ?²™FǦXס¥ïÞ¶íaGï>|gU%œÝ &þ>Ìó_Ü#Ÿçz¥Ò$j÷Ä¡ï@—èê'jƒØm5Â**§ ÏcÁ8xžøõçV5÷Ôò¬ytÖ€)j¸"^bC ¬ájŸÄÙ3¦HÔø˜ÀÀ7‰Ê£õ…LÁEûo•ECsÒ +ùãìCQu<ð[8₶ÝSÂFC¬¯yÃâǃ|#ч‚!¯/ +å²eü]áÅ÷óDc¬„1JLŠò¾pwOíERÖ¡¸U0¹'†%O¡dÎèE³Y )mœk­çàÊã¡«>»Û«b+šŸPYW®é»…U+c5S#ïÈV Üi±‰ŸyBv7`ùcm…ºì“¦Xç}Ò€…»ø—IíºÓu3!lþâºiaÝ)ÛVÀ Jçë’«PÙÄ%A£9îÖÞÖìža‡¾Ñ‡iƒUò$¼[°óŸyT¦!¨l¸52MÆCJy7ã&Fe•©X£ÿ¥Ë;6^ÚÝfáš z6«uîJD]ùKaÆë•,o‰ú¢ü´gdq +>óòÊiaå)“ Å©f¾4(Èóx«ÐŒÀþVáë7ɸÁÁ÷‹ãá~=1¥HCI1.4ÞjÑr¤!b+ŒýêHã¹9Xi0&M è>ÈršÑ³L!f„ X}œìýÖuíñPònD¡Y2 `e“4†ˆz¢*É£m Îý‘Ù‹,# uÁ"µ=6%ÇÆÞÏÒw’¢ž—%câÔf/øÜ)ÖY +Xç¸<#a^Ø@@ZØÀ© p^ó|tÞ^hdøì56(”DˆäW`ö€oœä›lDçž1£´e’È74x¸¿&àvÂ×€ÿcÏéc|Ù¸#vùt?Z¨89—OwÀzaÏ©QPâq³2VD¿=8Þ Yä3'Hñd"ãT›|n4‹ýÞëf‹Á, +z º½++¤áÃh쀻ÃxÙª¨kwŒåîtZ[o\×sç¡hº¢ Á(ôx%™¢;Ƨ—­y¸8öíŒBéíÿBnD¶e×~v›¯÷ßRdhóÿ!ò⥪î$Ž(ê®%h=8¤Ÿ43S²§LuõWÛ0æºèªî¼Í"6Öæ/ØŒ Ö›°™‡¶ëW4õUÝ­@aŸ™ -â,KíåM X »˜mâÌX9ßÆ{<žÔû™f‘EiË’‰$v„BÒÀ ¦“?儾Ȏ ÒD쇊f”gBçšé~WSNþ¡íI…RƒÇ4s ªvûÚ퀖W’¯ôÊ€øi0´otŠuþF¬y69Éçn|£B·0`-ìaîÒŽJÏ7±°Ëñ’¦; ×}ѸöØi53AHuÛ~:î»Y'gÑ[R-® +žôš¥ÊÎÍÇÚ=5nÃr¡ì*ŸÖæ„b6ìÔœØ3…G©òØæ2dá°/X’DŹzRuIôÚ•!€8yD„&çà£Ôaw4 3:‚ +ÜÕ:ÖU?åj(ºbXå¸F¦ +²ij…Î +œxÊJ’ÁÇîDPûSU·ë§ÞuXiS&ÌË¢ÏE} $¶Ôµ\]‘ƒQ‘>+…œ/wdDjI>+wÐRÞãZ”°c*7ö¬¹½q%kA58dŠ"I!áJÕ‰’£é‚Œõ,ì*¦y&Ŭg´=ɱlþBN>A:¯ëÉ_S¹?«ä@dÂåK+HÏ—žçäc3[û.Ôq'µÿtÔp€©èœžj8ô b ðÝ›_¸³m7„ ùPdkÆÙ¬f<–£)ûˆù3|~š+úWDiNI›Q‹PfqéêK…˜DgÃÁ^._úë­,R›U×–ŸÜ²ÏÍåõgaùSãž+©æëûã„Ði¸m-鶱/„îC0Xª}ß:êà +ß=Mó™¡HÈð¿¡f×oªa“E®/ÁRZ‘rÌå—vnà ª8~׎H®«{6ú&VêÔ´¹¦=Þ£kMž_còIR…]^T$ƽ$CŸ¯Fl‹Òu‹–,‰ó< v©)v‹±$&é‰ ‰i Q‰óäÛ曺D \Ɖʟ¦ 9¸`$³`ºÎkŠVC1®#Î>WGÔnwœ8HІDȹ6ù+óïÇþ¾å烠Èüyt\ù·~‡¨HñdŽ{ñ)Ó„­;tü<ÀµÓtZ;MÏTàD +9èàrLÎ*k6‰ÝÇ-¯ª Uâ48­³µZH¤À}§ZÎ%J&vÉÓ ŸÔä8˜2=5›z\Y›3Á…Ì1~I‚Yú/V¬éñÏ/é‹_´f0¾©õê#g•¸8ç4:Ü*M{"`Í{Ÿä]ÔQ5#wV@pŸd'º·=öGš;¾ßåq¢’|R‚¢âÜXZy(ºàtû¾fCî¶Hf þbž^ývcðtÓ>žÏ¥$h‰™¼l—§Xçíò€µü44³Ê Ä 2ù‹ëX ˜‰u‘Øt¾ªïj;­»Œe8à£1DÏ‘0îc$mé! .Ï„j/ôœV{¡ËsŠq_¦üýcŸA–RбP¡ÈG©ð¥•üÄœ U|~,Å/??â+mC_ÎúZ–@ä¸|‘J~èMÂÃ,†º©§Ñ>åRôà Rì=,9èeR”&‘û²¯B±Û{Ö‚"Èt½X›^S ™þU€Ñôþ +ío%`ÀÑà÷EïîŸh€Ê ÀÂŒ(23>ÈÂ4Rp‹-#áë¿ÛP]$ÑÑ+B vÆðOà+æ|º]àë~b@ó]Ñ Í^¬¹û¾–ÏO ;Ǻ¾†£^î}Ð ]Tñnw„Ír&Ãí"Ø6¾èÐ#K’Ç«DàîîG^j¼_SÑ+8_úÇQfˆ&}rO¼O¶²vþX2Ì‹¡ ô?Ž©£r6q2ýI ö†tˆƒ]*Y­CýØtÕ}CEr飌{w`‚h£Å2w—ÿC;ŽS’…_e¨ðs$Ô„ZFØû<Í¡ŒÉ†z"]±chjm±í_AŸ~YÌõˇ +nºq] UðŒî¸ß·nìÚA8lx›AH%ô]Ó«“¥"Ÿ¬’ÚøûU&Üô¢ÎíÛ®ê+J>”š½"B¼,Œ'?½¦.° °ûš”0ê“7 ©†¶g:í@%¦ž÷L· f°:ØE$öbJTíë°ÅÊ=R-ÎýdPv•Ûš,_aÜh2êðÒÙž> endobj -1332 0 obj << +1349 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [375.4723 524.316 432.5882 536.3756] +/Rect [347.1258 451.8816 404.2417 463.9413] /Subtype /Link /A << /S /GoTo /D (journal) >> >> endobj -1330 0 obj << -/D [1328 0 R /XYZ 85.0394 794.5015 null] ->> endobj -386 0 obj << -/D [1328 0 R /XYZ 85.0394 661.0164 null] ->> endobj -1331 0 obj << -/D [1328 0 R /XYZ 85.0394 635.6995 null] ->> endobj -1327 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F48 940 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1335 0 obj << -/Length 2714 -/Filter /FlateDecode ->> -stream -xÚ­]sÛ6òÝ¿B÷tÔLÄà‹_“'7uzî\œ«{jûKÄ E*"eÇ×¹ÿ~»X€%JéLn2Åb±Xì·ø„Á?>IÒ8-D1É -'Œ'“Åö†MÖ°öÓ w834 ±~˜ß¼ý ³I©H'óU@+YžóÉ|ù[”Æ"ž½ÿøðáþ§?ÞN3Íï?>Lg"aчûÞÑè§ÇÛ_~¹}œÎxžðèý?n?Íïi)u4~¸ø‘ }.}¼ûp÷x÷ðþnúÇüç›»y—ð¾œI¼È—›ßþ`“%\ûçË"O&/0a1/ -1ÙÞ¨DƉ’ÒCª›_oþÕ VíÖQùq ™Š ->&À¤ˆS)d/@žÆœƒ\cÑ'³/›e¹ ‹Î§œóH·Ÿiz_wfÿ¬«öìÞ<Î8O'™à1—B]à“f!Ö6=²¹¨Œ®Ëz=+ §p Oy~…k„ðÀes%ù‰ù¦l§3™‹¨ç‚fjVSžG+³èÊgS½°yj›ÊtSвŒ¥Ñ§=¢™ç²9´€…~3)žDÝÆЦ¨›=_šCµ¤!mÜ6ÏÍ|Ý•[¢<@Äj ˆ˜ó¸HaÙ&Œ¶9ØÁ÷&…ƒ.û]¶\ÙY³¥±ƒ…^ø¡¾^ñ°“WãY ¥ -óÅ÷:rÎc¦RîvlËúЙd”ÊÌY"XЧn^h°Õµ^›6dÌ^]€Þˆ‚û«“{Ø‚°ö¯„[ÂÔ4ÔŽ]ÞÞ,ÚfïÛ• Ý™eVmŸ–uí€Ë†Nϧ.”¥}q7õ@|y´ëmÊòìDãɾ™‰íuØð Ý™E¹zµ»Ð;«‰8jv]‰ÔU1o´Ã­úõÔÑ8î§W?pzw{ŸÌFƒÆîÑÆ—Ì?MT,ò,½nþ!Öeóï±ðþ£÷Ý“ÑÝû‡¨ 3y‡k„‰ý+3ž§C.æ(Åò^>ŠeÑKYU…gÁo üŸ¦vÈ[<׺^ZêÀŸ¶´†eaÚÁ}-Á¶zÿ5Áº±9)³XBXp´,uuØÚ pâ,É‹¡R½lLmÈÍd¹S)™¡søÑÇXÛ,.-ÍJªŽ&~wÊhØ3ìy4ºmjýT¹­@þ`Íƺ·BØ vúr/õë˜]üÎ Ü)GŠ,ñGÇè 3bÕ.é¯åö°ÅIJ‡Üš€DNs8ÇA´bR\ F÷+BlMG(È2xsÞÙšÀIp%T…ÁmÈ[Ymp†Ø:Stú€CÒ4k°‹Åáº%&y+%²ë–b]¶Ä y´Ê±Ò sÅ!¤Yr‡k„‰¡%Br£ò|Ƚ+xMo‰"=Ê  ]Ó¨óˆµé^šýgÂì/Ak¸}]ŠnB2¬Eæ,m\çá'ùYt“2·ìÛ %3Èë’l¨Ô½Yñ"µ -Š_4+ü ‰B,Øë7/2¯ßávÔoü’~ã(ÐÓo¤ú+V¿q€úä­~ƒ²µ$® ÜmhQn÷:yá#¥(¼[ :#Ñ“Á`ÑÔ¿3&Ö‡½v1¶ ¤rÖxá[5zi–À¶yt»êÌþ„òLKƘ×<¼çíɬKwj…©gcn‡¢·LÈbqðå1Þ:4©( ÅvÔæ¥rÃeÙ.šgã³6 ëÕ©¥9>ÍŽ2±çrIX -9w4Ž'UÕ¼xJO£#;yŽ¶”8tnÇB†Ç\üäIP[ÞK²éÑÐKµ]³£Ôg/>ßïMnOw>eyvþoMÎOxÑ”,_vz,Óo;½ëŠÓóXxí¶ƒëbjØ^­?Ò¼ø=Ö§õGš±6ô=H@ì¸gç>!Á•'‡]5ëµÕ–_Îß‹*LáýÕ…dð©LÎ|œÊ¥ËØ1K ‡HDvâñ|2›2tœyÿ΂¸ ·QuÜ·áëâvÂq ã6жqÛ&¹NÙ:—³7Ã49ìP³Ÿ$Ø3}±$E‘LTªb OþWÚho,‡87Úÿ“ñ8eir™íc@Ë ýŽ!©™ç²BC=Z„*Ø¿ -—< õ ”&u&Ù]~¥b&Š"ðúVåÝyàéÏÆq§ë‘s0)Ç,žöë%¥K3…ý³$SÃp¹7m;â,YÎp ÉdñWÔ[ÄÅUå¶g!ÅsåÎáæÙñTÀt·Øœv&IûÿÁžâ78äB²€ñ€I«™çɳ8“Â7Ó¨Y%3J±œ2v­ƒu~ ¿©í†Á´Å“­úar̵fIÆ£; ‚±  K³ -’ˆŠö’à‚©¼æ iw”nÛr]ÇŒ;RàK`êtͲ4–¶%ZÕCSÏj³v­8Á=y¤ >zNÁšæž$Ÿtë·ÙT\Ø´¿Üh×´%Õ¸`…P²OA¹*³´5IŸi æQ8åþHÊc‡e;VY땹Ûäå}G0t2rkyÏEÊüM³·µÍ€Jpuéº0S¿îŘšPJwŠÓŠàçm':‰n ~½,ú›Üå– ¥1g¼·è ²8„†o5è8‡;†Œ›Ã¬Íaߤp÷¥œ ç–WœòĨ—K×ÁrØî°ä‰ZÂ2P¤‘˽lJ”C˜~®{Šc®|©}1ôêSÉ@}%äš°¤Ð§å“×­KCbŽ„Ëk?øî‘ùª1uyC^Bña4æx|Ňa–B(ÿÓ^2¤º\³·ù»1™üC> ß -õnLåÿ$€ó–§ïh"‘’ý÷ëÜH‹çɱ/-„[š» L}8[nðØ‚ gôuýmkqØX5¾¦F ¬©ñ»„«A,vd± -Õ-ýt[D’ÄøX‹ŒÕ¥²JF™R \¶ÛÐ2± óua|û0щ Ø3ª¨KEe•4² ˆžM˪/ïñt§û°§t´2‚:Ñ€Êh¯ð«» ¹9þƼf_óõý/*μŠ:»;Wê£þÔNUÛ~ªR+Ï»`÷o9öƒ®Lbüv¤¦g}ÍôÝ?ö WY )¼o@åC…-=S6-gçM÷«ð9ëÿ‹aèendstream -endobj -1334 0 obj << -/Type /Page -/Contents 1335 0 R -/Resources 1333 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1310 0 R ->> endobj -1336 0 obj << -/D [1334 0 R /XYZ 56.6929 794.5015 null] +1347 0 obj << +/D [1345 0 R /XYZ 56.6929 794.5015 null] >> endobj 390 0 obj << -/D [1334 0 R /XYZ 56.6929 769.5949 null] +/D [1345 0 R /XYZ 56.6929 585.2486 null] >> endobj -1337 0 obj << -/D [1334 0 R /XYZ 56.6929 751.9325 null] +1348 0 obj << +/D [1345 0 R /XYZ 56.6929 561.0275 null] >> endobj -394 0 obj << -/D [1334 0 R /XYZ 56.6929 369.5823 null] ->> endobj -1338 0 obj << -/D [1334 0 R /XYZ 56.6929 344.1885 null] ->> endobj -1333 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F62 1050 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +1344 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1341 0 obj << -/Length 3169 +1352 0 obj << +/Length 2983 /Filter /FlateDecode >> stream -xÚ½]sÛFîÝ¿BoGÏDÌ~’ËéSš:­;­Ó:¾¹‡¶´DÛœJ¤#Rq2þ÷XjIÑqñŒ îb±X‹/J.üÉ…³©Ð…Yä…I­v±ÚžˆÅ-Ì}"g–1Ö·W'/ßè|Q¤E¦²ÅÕMDË¥Â9¹¸Zÿ–¼þáÕ/Wg—§KeE’¥§K›‰äÛó‹ïh¤ Çë·oοÿçå«ÓÜ$Wço/høòìÍÙåÙÅë³Ó¥tVÂzÅYðæü§3‚¾¿|õóϯ.Oÿ¸úñäìj8K|^)4äýÉoˆÅŽýã‰Huáìâ^D*‹B-¶'ÆêÔ­ÃÈæäÝɯÁhÖ/“߀œ¥ZXùEÛJ•…5óÛ -P†L3Eº˜§EëÐb0¬“:¨7+òÔæ¦Ô«ôBÊ´°V¡~ ‘æÔš[ :ÏH¿(aY¤63¥H­VÀ¹Çx{ºÌdrÿUr6ÕÐ4Ò³&S§î¼x¿©0E¡ '‚ýQ"ð/Ï·jñ] ZDg -t—a¤LE+UžŠÜàö.u…Ôžá«»Š•é@mùL}{ßnÚÛOŒÓ4ö“±½ï붓Ì]RwôlÚž¶÷›j[5}µæÆäûP‘N%f@I™Öbm=ÏÐÔl‘‹åÁˆŸgžc›’yf6%g\FfËÙÜË o¹ÌR©áÖ !¼>üîÚ]¿©»žÞÞõeï¥Y`  ×TkŒ”ƒF—J›dw*]Ru÷mÓù š¤™’^¿»xGïï÷ÕîÛòM®`m£í n÷›¾=Ž6h÷XFW­®;Zø»°âò²ƒ‡$¬›v·­›[š-ÿz <òpWáÈ]…|&lSõ¸xOc4Ë&›rËPWí>T;‚ê͆ç¥r³ùDo´m¿ß5ôÞ›ý°²¿«Ç³&ñ»æʆÖ§2iÖU_áÉA4ÊçvF#]ây®÷HOäÀuE@îìȼàÀÎZÍwq·>–íŽ OLÆŠTIp»Á¸Ø´«rC`S¢ŒD[W7=›¯ñΉ•ÝÌV ; ùÊíC…ðÅœ‰S€0.)ý= lGC+‡X㦦Îkžjw¼œ–1~»c·Ñûû쇚߅P·ä\ª5²'Šä_w“.‰ò bÃA žA¬Ë ‰?óÆ\  Ç…3‹äò亢ç}µC—胣ËIø.cZ.Ÿì6y]v¹eZ2á½EZA—¨0ÈÔ]Xêåã‚™¾ß׌˔©‘â]¼?õÆȪ7Iˆ\¤_H¿ô!Ä›]:) Ø3ÎKF>12’­!D;8 ¹;ÄØc§!Æ¢WõÎ_®«MûÀq©å•âÙq¦læ8И<SFÙ‚\ý$Á¹ËÐu^¨/É2 ÇpÎ=’c —1Éã$Cƒ¿´Yn;#›Û²_Ý1IÙ›úŠLŠO1iòÔ)!ÇL>¢J™§Ê ðfMÚ©!“ܱoêYcuOJ‡ÓÐȶ nߺûjU£=¯|œ'Ïëà,F»± ƒoÅK•ÉG‚-Z$§³òˆ{ŒqJª™H ´×­¿gP+ IE]]@9`ÀˆT–ežŠº}áÏDÝ)ÕqÔÍäuÕ±U‹ÔIó3s çóLL)Eñl(9+ÁZIúí=Ðé†d5býYEI05] %Êç]†ÔƒoÙî»@¿ïªÍ ‹@M;aèÃu®|¢§! Vï7õªîgØÉLjõóÞC:å”Г¹âÙs ¸ŒI_Léò´PJv~Ô{(4g‹¯Çä@ñ &D™£ÇL>æ=½.\TLÙIWmS‘²0Àþ¡% ¢2c%øQÊýýÆ"B -3V<ÜÕ+&íK(®y%Ù…JÎ!+’VAúm&¹Þ!JCäÔûý2[à2ÿdg‡||œ ¼zýTã äÏÏP‡WVÞÇ©60¬}"  Å«™ (Ÿ¥Î¿B¬`ŠË˜ä\¬0àA…=ìüx@ËA®Ò÷¯Çd ø“¹MUAjÄäc&i 晋Áí±ÆnèYyï‡÷~°÷ó –‘Þ áÓ8|®îªÕŸ¤^`Z˜4¢Œí붬›ÐNè]†¨ØÆ$í`…4à+ÿxEè¸oúšsº’¤ÖLà¦Ý7ëÙï­/%Àˆ81;Ú¨1;ˆàe¯`vù®d¤ëʇ€¤¿42ráH­¡'cÈé-†)Ê‹FHÛº©·ûíÜž5Æ;vo÷VŒ\À\P»€Q¬°žÒ9jÍ9¾lÜ´¨Û=EírH¹Kü¾ðûšz_ˆ…Ñ¡öõüÐáXUµçÚ¡®Ú–Þ†U>ÈÄ›MZhHìç®õA .]" ,2]*_*CSÌ:j™±]byÓSÕ…†'àV57…;4SIÅ$¹7Íèa†7£oý3§h0têù(ŽwwíCCà5У¬C+ä¨cª*´Œåm­N~ ð'† Ø‘aÂ[I¶0Mý[OÝPIs®ÉŽ«ml è`þ[¹NMÞ’qŠ“›ÉúDÆxh§úðD}dµS…P}ä3£ˆƒ´l1•–]ãCÁÃÒ¼º¡f¬v7¼{(–fPì”Aš"t!#<”g,Ì‚…9sšé]F‡Ø ±Þ¸®Gll—F7«±Ä^¾1rüI0δß3!’¿ì1‰¢ñ=@ú6Ð÷4$>培À /š»ˆº8ЋG¢D_ãÔ4Ïâcà,ÃSléy(ªà%ÎT‰‹G~„…:þ*p曑~w÷ì(~Š…Ÿ}œS|~Üú"LùbÉ)çøqÒ:•Ï°þorc\endstream +xÚ­]sÛ6òÝ¿B÷tòLÄà‹$8yrS§çNëä\ß½´}€%Èâ„"‘²£ëÜ¿],@¥t¦7”‹Åb±Xì'd>aðŸè4a²P“¼PIÊx:™¯¯Øäæ~¸âžfˆf1ÕwWo?È|R$E&²Éã2⥦5Ÿ<.~¾ÿÇͧÇÛ‡ë™HÙ4K®giƦßÝÝO˜‚>ï?Þ¸ûá_7×¹š>Þ}¼'ôÃí‡Û‡Ûû÷·×3®Së…çpfÁ‡»Ÿn úááæçŸo®üñêö±?K|^Î$äËÕ¯¿³ÉŽýãKd¡ÓÉ+ X‹BLÖW*•Iª¤ ˜êê—«ö £Y·tL*ÕI*T6™±H¹×2KX +Z›åŠã½–Ór B-wóͬ*ÛÎÖ³/;»³ÇÇæi‘𜓘÷‰=Õˆ2g ¼PWöz&U1%A&ifnda7Ý +®/cú@»°K³«:˜zAÀº¬ËõnMëÊ–Ò¯½[Ò¸ <>Ûmm+‚ÛÝfÓl»––" hô®Á2 GäI‘¦Â læs (u>ý1QuvëGB¨…éÌöšë©5‹="hª[9y2UÛ4oêΑ6•Ÿ[5¯¬M½'èñý§žº¶ó®lê6°4^Š×²ªz³iMú[®¬ÝaX8©=œ^p>m7fn |5eWÖÏ4X6[OЬý<![á4”fžl¿ncÚwG¸kèKZƒ»E>ý÷u!@;ÛÒde[Á¡j‚¤È6ô”•­»j?<ÝÍÖ”°s‚SGö?*)XÎ$U’ .=Fž%œC¤`ŒM?ÙmÙ,Ê9ƒÇkŽ’·ŸixWÃM¿ÀýDï‚™”h/Ùe?©ÎûiO…bÎ+kjPï¬ô"œ8j& ÂjyY„žjD†¡£æ‰ÒE6âÑ›°˜öRÐÈcí­a‰6úb«=!›§¶©lwͧî>gÙôÍKÙìZ B ¿¹ž)žzÏ„E-p'ŸÓ×fW-¤…ëæÅ“Ù¯›’p ï®9ÆÔìÈ$EÛì0wQ¥ðØ9Yð¢%ä’¼qM#€¹™Ђ\ûëâyš¥ +ÐóÙû:R²æ S÷+ tí:Ûb¬’¹Ot¸aAŸÚ 0˜gÛÆ‚¹£‹L¹àã¯AYÛ=Ñ–p5ƳêÝW¦\|÷Û•sÓ¹ÀA{Õî`šb,  í®A¦.Ö¥»q@7õ@}zºé}ÊÉìUØî‡Â$c±ê——Ë=ÅŸÑæj6Ö(.ze÷!lz/„åp§¡/'ôÂŒf»ßQJÁ–"Oր䉯œEã”ùJ…‘È3ÚœðÎ%4aAÖŠIq†wæÊ)$lmG$.Ñ‚A4»žLgbSñrª6È[ïŠÞô…:ì|¾û†'2–héeOŒ¨.xb Bq,¡Zºà‰2ɸº,B a˜‡¡(R9”nbfðC‘´ع« BF ¶Ýk³ýL”ýh«n‚Îå6!¤U¨Øœ&7žê“Ü&%Õð.eÉzŸ4+†VÐ{/2gŸøE¯Âï“€Ò)¡ƒys¨-½yÇËѼñKæPdÞ_oÞÈÍgœy#€æìyCxrù´×$Πâ]fñT=º€lƒ‰RÁŒcAtg@¹ÍÅónk|Šƒ%®ÝðÎwá[5f%ïL =½YºfdÀ å¡%c.˜nÞËödŸK¿“ï +ÇÎBÉ[¦ä°@·±-]<“Šò? )µPÛ×ʃ‹²7/6m×ÛSKc¼š b/储Jîyâ%ªªy œž<…oߎӅÖP¢A«MFéØÔ£#ÐLóèJÐZÞPDrÕÑ0Hµ]³!ˆvê‹—PnÄ禨gºP±¼øð÷L±wx5T+ŸyJˆ$Sâ1/¦:óz*êç–Ðþ ÑöËÎTø6’r_!±%ʾ ä|Õ4­õ, }j0qö@IïqˆÃœ½'ÔáÙ£_-|]è]Æñ©ˆ{‹%FÁ§%6D`üß‹Ã "¤€—Óc[/©GöãTYÜß,¨dš)Y@œ=/¶øÐ90f®›É?0xñEëv gÇSëæ\$Šƒ¿*—ÆL7_H¨X’i&þ†ßPA›”| ¡3ÌÓ[äy’Cì ÷àž«dNU–·E÷¼¸.Ìá7sïa0lñ•Éõý08”[³4çÓ[Zq`H³ +ꈊ֒›à„­‚á k¿•iÛò¹¶^¿TÁ6ÁôÖ5˳Š"=´”û¦žÕöÙ?Æ Ø#_ˆÑϤmhXòÉ´a™«Æ…«üË-¡6M[RKN ‚{÷T®¢/K×–ôŶ`„“Ond9,Û±8áœWj¿؃ÈÛŽpcåçt/EÆ"úU³¥ßZb.ÑÑ¥‡‘Xýu¯Öýš$¥ßÅ[E´Œî-.:Þþ zYô'¼//%öJcoÑ}‹~›¨Cl|Wƒ7çxÅP0å¾"ŠÃþ¼T¶áØÉú&þ¥ f±ðoXžÚ¦¼!Ñ£°Œ i¬‰]•¨‡¸]Æ|S‡~hªÉÈŒC3äŸaÉ ;¨`[çÆÌ< _Ú~ïGö«ÁÒå E ŇɘëDjÁ‡Ya–A&ÿÃZȤÀŸxGçì­~7¦“¿q(ä[¡Þ™ÃÄhÞòì $rrÐßù·û±iò´–ˆÅ;²-}N¦—8×qòð ÎèëŸÄtÝ8Ãw€eÚj¤À¶¿+ ¸È4m& °Ù5ýxKDš&ø(°Ó%Ù€R[%§…R)¶[Ñ4‰ €ýŠ¿)ÒëPbAtTÑcNE•T8ƒ˜NÔÐáãîÞöaMéytÿut¦Êš`ðo½ ¶IÎý}L%åèÏìl,ë/ÿñÁá/3éZ‹ñ>‹c-Š¼—Ê•¿üXöTê$Õ"þÔüendstream endobj -1340 0 obj << +1351 0 obj << /Type /Page -/Contents 1341 0 R -/Resources 1339 0 R +/Contents 1352 0 R +/Resources 1350 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R -/Annots [ 1344 0 R 1345 0 R ] +/Parent 1356 0 R >> endobj -1344 0 obj << +1353 0 obj << +/D [1351 0 R /XYZ 85.0394 794.5015 null] +>> endobj +394 0 obj << +/D [1351 0 R /XYZ 85.0394 688.9861 null] +>> endobj +1354 0 obj << +/D [1351 0 R /XYZ 85.0394 663.3646 null] +>> endobj +398 0 obj << +/D [1351 0 R /XYZ 85.0394 285.7302 null] +>> endobj +1355 0 obj << +/D [1351 0 R /XYZ 85.0394 261.2794 null] +>> endobj +1350 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F62 1060 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1359 0 obj << +/Length 3004 +/Filter /FlateDecode +>> +stream +xÚµ]oãFî=¿Âo§k­æK¡OÛm¶MÑfÛl÷ÐöA±åD¨-e-¹é¢è?rÈ‘F²¼É]¶ùâp8$‡_²X$ð'&Ó\æ‹,×±I„Y¬vgÉâÖ¾= ³ô@Ëê뛳×ïT¶Èã<•éâfà²qb­Xܬ‰ÒXÆç€!‰Þ¾¿zwùí¿¯ßœg:º¹|u¾”&‰Þ]þpA½o¯ßüøã›ëó¥°FDo¿{óÓÍÅ5-¥ŒãëË«oh&§æÒë‹w×Wo/λùþì⦿Kx_‘(¼Èdz_~Kk¸ö÷gI¬rk0Hb‘çr±;ÓFÅF+åg¶gÎ~î«në,ÿDK•ÊJ5Ç@“Ç©‚%dàÍ}IwZ—›â°íhÐ5Ͷ¹ûD£ªÅ{¾~§E€Mª8‰^,E'"5Û°/M’è/j¶ÍªØÞ7m÷U0®Ë®åñß_bcšƒ|sý<> +ç¹Ñó|L€9"N%ñfíKwýŽ1ªA_S©ã4“6d·qnŒD¥2V™H©Uq’jÇ +⤓‹I¡â3Jáâ=0ED7ð_FGú(“Lf‹TÙ8wlY|\ˆ8Ñ9ŒHÐwà&^_îäâ›®³näÑ.¼î> SƒÀáÙ œ­Mœ[`Ww£4Ô4P‰\¾P¯¢Ô:¶JxÀæ¡«šT.³¨r®­›Ž'vÛrWÖ]¹æ †ä7 ½<ž²K§y,mn¡¤^&|T3“§ ýáE¾L5Çú$3=ð_Š™çkl+“ä½ýi,˜µÞRÿœÛfßm«–ßó‡®è÷õóxáiÈ4P…Aéh.lT¶Mݺ’¤•‚†ß\} ñÇC¹ÿDÝ]ñ‰W°Ž‡ÙfC“;00Èqt@spÕhvÕ¸vÝÒÆ_“\_·Ð‚Ú4û]UßÑjñ¿àà•ûw +WnK¤3×þ˜²ÃƒÀ'h­˜°X;îµåþrOýÇj»åu ©Øn?шŽíûšÆ¡1à÷;»ûj¼ª#w:uýZQÓÆê\DõºìJ¼9ˆ“fù^@ÎÌÅð>·Ä—d@uIοٱz‰Øã­Ð~t,›=#žzp8BH†m{årèîÉ3”^_š›…Q`:ÀÒ ‚ÓâþŽmÓuàÐzøe¸áØ¡ãEr>”+¶#@Œúˆ&‹[€áG®µ‡zŠ’#lÌ~Ô"™§¬E@Ðj[õœò +»%mÂÕfÍpí}sØ®C¸b¿/ê»@†®ƒê„’_J ¶.ë2Ò€ÂÙQKó°¯@Z¯p6,EGëU릲èÐÒ³Â=õ'î¬×Lj[2>²Ó‚逎sêÔ­K”èèrSR[¯x³'ˆ °ìgŽÞ)ˆ»¾kKät_µœb@òÚF…{ŠÐ ÛÒÔÊ=#è¬ñPå/5{ÞNÛ¾Ù³åèÜ“vSõ¯I"ïȾ”k$/É£ÿÜ—Œº ̽ˆ5û1h=[=”í]¶'î~LSV7μmºÍ¢Û’Ú‡rVÑùG›ómʸl69tò¶h=pøz`ºÃ¿ZRA«(ÑÏT­ßêøc½š~l«UÕÍ“êXèç퇀t2…r, “Û¿Íã2Dyü6a%6™É†“Oa3HÁ~9"=ƧˆÌ“ØJ«ÆDž2 lLï +0n'Y5uIÂÂ'ºÇ†:%åªè-ÓÌPô‡€h:ö¨_1Éã}µbÔ.ÂÎ-ï$½ÑåO¤EÂHˆÁõ$Úü4øNÞßm39ns-Û;¤ãÏ È›·?P‡ì¹{A[`ÉxÙbú}¬‘Rb Ã<áÒ¤Á©RµRªÂ x¹»`ŒË圻0þëáàÓ. Ìm®2ûiôŸ¢Q§q.ÓtLä)Ô±ÊLÎü¦Øà lCméŒöœñÃ?×ÅTÒi! 0ŽÃvu_®~'éÑ dVI>±QÅ]QÕ¾¤Ð •† áÆ(mPBšpÙ¸Ã×  {¨»Šƒº‚‹¯;ºvÓêõlŒ÷ÞåJs"‚¥å˜p< +w09|_0Ðméè9zÊ5>–’òñfÉüÕ½sq$Á" !îq|¼‹—q+š™à—Í(9|Wسê˜0( Uµ«ºê’†ƒ! çt8͔ӠÇ3âþA +€‡¶ßÛP > ܼ?æäþz.I#áË|ZV’9¥Ðîš?&3ý¦Ûò®ªkJ $©ùh=DêÒ2]NaB—/Iï±-¨áZYˆü‘©ðÆü”:Ê÷õlöw¬³¡h,sÖF'ô18óÌ„|L/ô +;‘@ŒžéD=•C€“ƒTc¡ÒBàÌ|‚1.C”s9„Šmhz°Ï$,ji¾‘=Æ'ˆD¯ ”Pc"O'FKË ÇxÑIiÎ&`Ÿ¤zVdo ˜Föø-JøøÕi‡31p™2Ð +ƒ,«gMÆœl=!ö,Ú¶º«]¦Ÿ’•…f ·,¨ƒ“õzˆifdÄ[M-Cˆé;†% +ŒF@»ª®v‡ÝÜ™#ÆWïOoN[“ŒŒÀœ[oq‰R³–Ÿt6ÍRw‡QÙ bî¿2¼Â‡¢òB¡¨\Jß9Veå¨vH¨°¶£Q¿Ë¹™ð°I ‘ÁàW2êqÆàúTcÆÞ]ÙÍYœðæ-Õ…‡š×]°’<©ãaù¸/2≠µ}EÚÕ©¶¼ +†­à†%ïŒäþwW‚”ëªü³#¸»‚tPÕŒ†ZÖ˹[‰Ml䋺\ü´‘È1Ñ´±x-5-1EhªEÊz €Å¦£«õ5O€-+®;&v¨§z”’Qry0XQý +F§ý³ÕIš/‚â|{ß<ÖÔ½|w(‰µ Bi…!¿QÑϽbüD1:PLÔ°†)*á:ìNùÈ›3ò诫LæuzÁÅܘ«¹Øª¼!â‡)&£u¡†ñÑLåá:ßj¦¡Åóg†ü[&ŸrËŒžññ0·0²®i† ËûÓ5Ÿî³¥3%–= ­ ‡üŒ™™33gÔjú–Ñ Ö½A¬öüQ¿±±b¼`¬­†›|áOÆßö‡/Šôm‰¢¨1i3Ÿý¥û8ùú5­\¾Ãa$lº{Xê:–¸'î¯ãŸ›¸o¾»¸¢Þ¦Ú{b7wE)—orÊ7ñóMüc|S/ä›z6ßÔsù¦žâ›| ßäËø69@`Ædáu±Þà® 'W2|ç‡=9 ²jE×[¥S¿©R&Æß“ÍTÞ“þÇK/þÙÚð›,[{ê³y ±€„‰r¿h9újÐÿ¾í˜ôÿ]ýЬendstream +endobj +1358 0 obj << +/Type /Page +/Contents 1359 0 R +/Resources 1357 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1356 0 R +/Annots [ 1362 0 R 1363 0 R ] +>> endobj +1362 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [242.0197 602.0286 315.2448 614.0883] +/Rect [213.6732 532.1015 286.8984 544.1612] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1345 0 obj << +1363 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [238.0484 522.6184 311.8142 534.678] +/Rect [209.702 453.3093 283.4678 465.3689] /Subtype /Link /A << /S /GoTo /D (topology) >> >> endobj -1342 0 obj << -/D [1340 0 R /XYZ 85.0394 794.5015 null] +1360 0 obj << +/D [1358 0 R /XYZ 56.6929 794.5015 null] >> endobj -398 0 obj << -/D [1340 0 R /XYZ 85.0394 673.0194 null] +402 0 obj << +/D [1358 0 R /XYZ 56.6929 601.5665 null] >> endobj -1343 0 obj << -/D [1340 0 R /XYZ 85.0394 649.1998 null] +1361 0 obj << +/D [1358 0 R /XYZ 56.6929 578.6548 null] >> endobj -1339 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F21 702 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +1357 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1349 0 obj << -/Length 2450 +1366 0 obj << +/Length 2639 /Filter /FlateDecode >> stream -xÚÅÛrÛÆõ]_ñØ ×{Çnò¤8’«L"·4;Žãˆ„,N@‚&À(Š§ÿÞ³7`q¡$Wét<–‹³gÏý’`øG!‘ÔT'™æH`"’Õö 'ŸàÝÛ3âaæhC}¿<{}ɲD#-©L–·.…°R$Y®?¤Q4 8}óîúòêí?糌§Ë«w׳98½¼úé­Þ.Îþù|1›%Húæ¯ç[^,Ü+éq|uýƒÛÑîqéââòbqqýæböqùãÙŲå%æ—`fù|öá#NÖÀög1­Dr?0"ZÓd{ÆC‚3vʳ÷goFoíÑIùŒ(“tB€”M Ph$¼2¬š»â\)–ÞUuS›%M«ÛÊÝc½9̈J‹US>8€UµÛÁÏbívEs_~u?î7eé öîØm¸!_¯ÝN]µÛr7Ñ´¹Ë·SçÛ¢‡”ñJE½¯víÁ¦2Â Ì AZÚc”ôùX6~xš`µ«·¸)ܳ®À2Ø^_r ÌàÎfTYÜ°ÜÔp\bœ~±×K2Áx ÂåQV«¼4Bý.ú <Õþ÷¿¿›âàË£ÀóÁ…îŒ{ êPÏ£­§‰À€p±¨ /‰w‡5ˆj÷É#a}$”#Í ·HþyW}I‘ne³Ù—F†R¦Þ<*û\×$w»1Ds<ì¬ÍÀëÍνÉ=Æ|Wß[Ý™w{·ÍÜÆGs¬‹ÛcéöÀìlñŒé§c|Ø{ëir˜eZÝúÃw'HŸPɾÌW–j΀j{-çly“¶Æ ¶ÊÀV—ðn¬Â¢B*ÀoРye„?!y‘ÈÀ[lÝäM±-v»r_¶ë¬@HÇÞl¬?„åž-•­Œ¢í¹È”( Z¤¨Îú&n•¦“»Gd ð«'Þë„Dpú¾ððyYWnÕLËMe¹²~8ãS:”Ù7Ã0ͨDàÕ"Î -¦LÀt/Ÿ·XD¶…ŸÇÆvŒ×Ðñ¥Ó‹M5Î Ùˆ& ¡FiÖ£ië[¨§(a3” §RÆÁµä!¼eöåùnJôaÀå%ÚÚjL8Ü$•Ê¡(Ÿç$= -Ä)5òæá<ÆèX쑆1’Y&º‹­Ò÷ÅjÂ0(E‹àMŸÖ…q‘ŒúíÛª,«ûú[qA§‹~.ø°*óºv‰ÞEA%AüE-T,0Bʘ‘˜ä¦’a/–X‹q£´"ëG@5" `†ÈI¸"cHÌ='h>4ûb‚mˆlDÒ`'¨Çµ9b%ÿD®Ƨ¸€Æ_ÀuÜçZÀ’‡xþj]móÍnäؘ I˜øóo1>Á8ÃI ì5ŹFàuºÏy—='¸§ˆ?bÃta¢=²ŠŠãͤ&4d橼¯Ø­ÍŒ¤~iüyc¼´X;Êgvs`]Üæwü‘z2z)ðÆ,(èüú_Ó¡AjØ@#Nyâ4X4´/Ú»ìË“´é˜6u‚¶Œ!NÛ¤ömòqÚ¬qF¼!a2Ed¿Œé“Ò­„ž\ó#DÇ_(åS„c†Í#ê/dsàŒ²hB,p^7`&õ¯°&>™èÅ0Ëúæ± ´•Å§Ü×î¿åå±hƒôa‚8¥ƒ`OÛ$¤ÀL·å•/U¿-¬?PA€Ã ‰gø.ã -ePw÷½÷¿;1u¸LDw.¿ '†q305çYœH°D þÍ5…ì"2Á|~‡|9(4&ÖÒœ@½f€ã¨àdØ Àk[Oò`‘—ínÿa„¨ŸÀáÐ Nÿ¨vÅTEoN•ª›‹ qåN,˜— Û¨’”êî>Êpâ´þ@è”iò„þ -**œ[ò¤©¯ÔŸˆÅÞó­þnûºÚwÑ ‹d<}Dê;/Q'užï8û -”áÄi©C¯âOH]H¤2¨mø°*7«ÿ™Ô}æo逫ãn=w«›;ÖÅÐ9®|_è§a¦éµNL‡¶o‰ï7ÍÝ “41þËb—ß”ÅÜG¹íx}>0-é>ô«4Í›>)®š_UÛýƶ• ¼Ú”ÛÂä.fÛïß··RÈË»M³±¹‚áa¿ ¯m¿ÇkçC°¹Í›ÕÝ”XÚdibŠ3ö.¡öõÑ‚þÑÂ>q"£z™¡v¶ßÍ ÿ)‹HXÖ>gß%qC;jli¦Àm5Å CÒm1™(îûÚËÊÏüŠßóí¾ty|<Ì£P…B| _¢y^èñzš÷•©ººvOÛáØÕ¹{¸"̬^™‘ò” °àWn?ºËÅÆÉñ_åÜÙÏý„‘þÜo0²ƒnLgÚÁxË–2]åǺ3·‡xúÕ Vef +7B³<šÕùÉ)ŸlÇx^Hfi„d0ù™.ìÜå¿yT]QÙÓ…ƒe$nCN°©èŸ ŠLÚ'"wúxk¨µÈDŽŒ„É1šB˜Ð¬¯€¼¼Ïêþˆøtä}$ËÙ×y;Gƒé±Ÿéã?É­‘ó.ÇÓ¹q½Ì!©uì“IÉ´N×û}‘[Rºæâa‚·vþj…¤fƒà Õ ".\RnŠúîB¡Ñä”>ïà &[ ~²à6qˆM@¶ ¾ rû}‹P‰²,êÖÐÖô °. H€¸8u)Úxâ:0$ ¦ÿ¢I—𗦣R€g`âD0„t÷può9!s­™ŠÖ–×NvãõÕ–&?TÀQ1ÏcÌ–)Ic/Ufà÷g/´ãé -Œ™3ƒ7……YŠ²ÈMp2?Lž6OW˜•“â\wãaÙ›ïpcòR·F<ƒ#ÎgwËa‚£Œ´u4^7÷­«Âf­Õ,êã~o£é.ÜŽ­qLX™AýP¬C`3s)À “˜¦ ‘:½1ä=¸5tàéÂMè€færã1;€‰ó+÷éDû¯#:5å–ÁY†C.þꨎ‚Íf[Œ °ÅÌíƒï–G STйæï½Â.Sî£<+üêŠÇ¢ƒ¶BÝÂÑݸJ‚R‚*­’؃^æ”Æû…£ùŠ*éñˆÑ÷s–i5Ý 0ÍŽ¢÷qNøsËRô¸óÚ˜ -u Ú Æ¦>àäÉV󹟟;ž¸™():]”ùâ¢,KtDyøN=&ý?o>¤Uendstream +xÚÅ]sÛ¸ñÝ¿B“'¹sBðIÉ“/g§¾¹sZÇN'—Z¢mÎQ¢"Êqt™þ÷îb¤¨Ø©¯ÓñØÁÅbw±ß°˜pø“Ì0®¬ž¤V3Ã…™Ì—G|r ßÞ 3 @³êÇ«£—g*Xf™L®n"\ãY&&W‹Ó7=ùÛÕéåñL>MØñÌ$|úãùÅO4céñæÝÅÙùÛ\ž§zzuþ/OÏN/O/ÞœÏDf¬—Ãgç¿œÒèíåɯ¿ž\¼úùèôªå%æWp…Œ|:úð‘OÀöÏGœ)›™É¼p&¬•“å‘6Š­T˜©ŽÞý½E}uKÇägTÆL&Ój PðŒYmÓIj,K”TN‚ÿ~LLfR1‹$Ï„`Ö}|y°0)³Jfæê®™$Éô¦®ªú¡\ÝÒkñ%_®+ÿí¡¬*Ý–ŸýÜæXdÓ"oêU~஋»üsYoF?؆=ªzž{Dwu³¥Q¾ZtS ë=%m3ßV;š™×«¼ Ç7 “>­ŠíC½ù½=þ¦ç¸ƒI¦%b5é´)—e•ohr[û§#Îôˆ‡·úfð9_,ˆ–¦¡‰¦Þl o¹¢™ ¹ÉT3˾x*.‹f]¯š",+VÛ>Ÿî‹MYxoÜ&õ²Ï§£E)äˆC’#Žè”ʦ7ùgd'óÕŽÈ>[}ÑâL'Z÷ Ó¤IÌ~%6Æšž-øÒ²ÑR1ÂO Ä ¸3Õž}&éìa*§Ç@ ¢<ôâ5 Ö´ì&쟓5LÑNd’oi¦É—E+0¯yÿ á#°<¢}p0Ñ‘ò@ŒVõ–×=Q‡Š#3í™ûÀL°*ñ¨Χ_Ýö‰a©QºOÄW‚p‚B}½O÷~cp _¿ <l8p2ê58ÓT‘—B×,&4¸j//›ÂKâÝf¢¯3ê©$’„äŸw…ó +fº¼¯¶e뜼zÔî¹h$§Ùb{¿Y9Ïå*ø¾jÜÙá7ï—–ùŽ&®=šû¦¸¹¯hÎÙ.áÙRÙÊ ¬ÛÄuÁ2 1¯'r·Ü9xDÚo}<ñ\'$Á§ï ŸWMM£í¸Ü²B¸6AÁ÷…¦4ãReöÃ0ÉPF³$50$&9×íéÛævBƒË(=à³Þeý͇X‘ˆ÷à%éP\zE6¨†i™0¥LÖ£h/Mi¡!dRÂè<•%´‰îû¶“Õ˜ÜÌÅR/ÎVQcÂ…DP +À2IÓ§$l’Ù,ËÆÓµY‹q£$&{ÄI g­»Ý‘¯‹ùˆZHÉ47ÁîJš ù#ÔB?MIXóÊû[¥åi}˜WyÓÐF¦·Q ù~£ª'1-!ùþ4dáJiû|‰Œ³¥“X8áÂî6véFÛ‰ù\–ùH’ù°Ý­‹®Á­‰D= @1Ó‚H‚áñOcºÅøÓR¦,ÑÊ>ƒë¸Ïµ¡úÅ¢^æåjÏÓ€–ZcíŸÇx‹ñÆ•4Ðì1þbŒs˲,µ}λÐ9½d2Ë’Ø7ŒgèêQ=m0!²ÔsÌ… d¸˜¹šÌÛŠ›*ÅÔÑžK´ÒbñÌd>®ã‚Eq“CÔñKšQ÷U]’³?¹ø׸kH¬ºË—yâ ½ÞIë¢ÝË}Ú‹\ãëÑfEÖìû~£„º\PtÊRÄîî æù}S„žÛ.î~uÕ$® 8:9ØåKÚ6žQHˆÉ÷tñZ!W]ZÙ;i%(‹©ÛP„#lZu]»ÀûdÍ‘Ó£¹¿AjBÇ‘ŠÐ9†<9c\ÈAžœWù®é·ˆ;Þo9×ã: mç¨1½/Ƨ;úØÃpä‘’;G·çöSfm¡v×OnI&h{ƒöZà`½.rGKW_ìF˜kðp®”‡p‚éÀy‚Fm6©Ê¢a‡® …ÑLiý¤6”P![£æÜ™¢ÖÁÓ]rX1pÉÝý,&ç=×Öê¨4|¶ˆ0sÐäÛ.¢ƒ0 ñT„1£d8ˆwà.Äô +þÊééP0€S  ÌbOõÃäÓD0®­U§ÜÄËó¥œüT?“ˆ¥€w!v,A(‹›t)¶œ0M3XDÐ-Â9(³؃ǼG›¢*rtNø‚aŸ”~àÈ‚Fim»öpÒïkqÆeb[>†%¤ÇÇ’wý‹e '©hk먽Žû-êÂæ”ÍýzŽ« šq)º•cHŠEpl`pÄࢻÀ‹w¿k§×HÞŽÆPƒ#¬ÃÑu@1sVzÌ0²~NW'ÖߎØ)f[ˆ³ +‹ÈÿÚ(‚—m¹,ö p¹ÌÍÎ×Ëðçs´Ã,â½—×¥]êÁ“,ø©Ë‹[Òå3¼Tà ðìö“$›‚çCìçy‰¶o,èÌw$Iú ¥Y–X9Ö»ç“GË¿§þCCçM4öy2yà6"$TÊ0ÀEǘìÝ<´ÿúÀ"âÿžóN»endstream endobj -1348 0 obj << +1365 0 obj << /Type /Page -/Contents 1349 0 R -/Resources 1347 0 R +/Contents 1366 0 R +/Resources 1364 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R -/Annots [ 1351 0 R ] +/Parent 1356 0 R +/Annots [ 1368 0 R ] >> endobj -1351 0 obj << +1368 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [325.3322 596.1482 398.9856 608.2078] +/Rect [353.6787 530.3947 427.332 542.4544] /Subtype /Link /A << /S /GoTo /D (the_sortlist_statement) >> >> endobj -1350 0 obj << -/D [1348 0 R /XYZ 56.6929 794.5015 null] ->> endobj -402 0 obj << -/D [1348 0 R /XYZ 56.6929 666.7383 null] ->> endobj -1010 0 obj << -/D [1348 0 R /XYZ 56.6929 639.147 null] ->> endobj -1352 0 obj << -/D [1348 0 R /XYZ 56.6929 513.4583 null] ->> endobj -1353 0 obj << -/D [1348 0 R /XYZ 56.6929 501.5031 null] +1367 0 obj << +/D [1365 0 R /XYZ 85.0394 794.5015 null] >> endobj 406 0 obj << -/D [1348 0 R /XYZ 56.6929 101.3093 null] +/D [1365 0 R /XYZ 85.0394 600.9849 null] >> endobj -1354 0 obj << -/D [1348 0 R /XYZ 56.6929 74.6262 null] +1020 0 obj << +/D [1365 0 R /XYZ 85.0394 573.3935 null] >> endobj -1347 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> +1369 0 obj << +/D [1365 0 R /XYZ 85.0394 447.7048 null] +>> endobj +1370 0 obj << +/D [1365 0 R /XYZ 85.0394 435.7497 null] +>> endobj +1364 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1357 0 obj << -/Length 3401 +1373 0 obj << +/Length 3269 /Filter /FlateDecode >> stream -xÚ½]sã6î=¿Âoç̬´â—$>¦»Ù^zmö.Ioæ¦íƒb3‰fm)+Éɦ¿¾êÖ“v:sɃH$@Ðb‘À¿Xä&N”Õ‹ÌêØ$Â,VÛ“dqcߟƉR4Æúîæäý'•-llS™.nîFkåq’çbq³þeùáŸgÿ¾9¿:¤I–i|™4Y~wqù‘ –>>_~ºøþ竳ÓL/o.>_øêüÓùÕùå‡óÓHäFÀ|É+™ðéâÇsj}uöÓOgW§¿Ýüpr~Óïe¼_‘(ÜÈד_~KkØö'I¬lnÏÐIba­\lO´Q±ÑJÈæäúä?ý‚£Q?uN~Ú䱑:]DJÇy -kÌJ9‰R‹2cãTIÕKYŠ9),”ò¦Øº¨ë6ûÛ2‰µNÕb¼æåk†´‘ÒÄZfé”öµëZ¹–ËîÁaC-«ÝöÖ5¬ïèÛºU]­[Bèj®ŠÍ‘Ë‚Fp'aBó)«u¹*º²®àüU’/‚¯Ë¶¸Ý8^W+«S±¼g¬_“Ü<”Ì|A<{âT9´…Ô ÜÌåçFo<Ò‰‰½[c¤ÇmNE¾„]m·®Z»u ÔÐÉòÆo -´píîŠÝ¦£N ¯Çô¨„Í{úi’ÌÐÇó‘*àà®DBknËj×¹–H# ¨ÖÔèÛâ[¹Ým©óTlvî5v²,–VI&%òy~ÒX'bÄŽ:d'>0=ÖïL¤±•&{ÃFX¯AÀBF`£Qå5jÖ€%-­}~5ÃÀÄ ˆ@5åàæԂƒ(¤aíXïV(n©—•ëžëæ vMq‡ã¿&‰\Ñ8Œ•ÕŠæ­#È£kîêf[T+÷!–†z#Ú®¦‰-UîLæ‰1‹ª}vMÏØ@¤a3©QSõ>çž Ò‡æn4×Y0¶dÞÚ”ïl c ~xõ¶G͇z× †·o/2¶‰–ó`à«¢ªêŽ¨¸o+çÏÚË«xanP…½€E‚‚(Ôs¹Ù›¸eÔ–8øÍ {¬æ4_ÎVÓ7coÊ”ÀwÝñ®›bô¹g ê¼.¿wÔ%¥noY^wIc¬ã.©Ç -’>î‘4\*Z毓ï±fèO=ŒJ-¦ ðålÒp¤ãûÀ[0Ù4žÊÕÃdÎÈÍà8cÚßÞÐ$ϳ.«¢y!ªæcÝ–] ¦÷ä •Ž(R2÷fçuF×Y¾§2Ãý™kò0ð­+$š›å³s_„Ä2j¢’DZ¨åAý‡ÓïhöïÎó\t[¼PcUìZÆ,üFõëÎ5¥còÏ`ϵk*ê_C” ¢úï' IÏ.~|Gso­ˆ›L¦.9Q*_nê¶Ã–%‰¶¥Q n ´xëÖ%h3\]µþX±;owx`ˆ[0ôòš¾þRÁ{¿}Áßû3j‡†£¢I^ÀK½Ùy?=Ù Õ#IsåÚö¨™\Å©öu;c·³ËÛYYEM]wíalc%Àz^%ÝcÍÐV{Áš´ZL‰óÍ‘#Á²ì:Jü’ˆÈ—Z6ª–†º‡¢£–WsDþuWr$A£l¦9yº˵ݯPÍ÷¨Ö„rËF(5øš}#,V+÷>9þSÁm>–W’ƹÉ,_$ræª1±Í £ „Å `Bâd”MÌŸÉ×TîÓÏ|>_K0²‹'q|-š—ÀZܤûKE;ˆŸ€¤z¬5½A ÂÄ©„{Þ@à¬Ò„Äz9’†IA©¼Àb£úãói” -*£T.ÏD‹*8Ã…†Ë]ÊÔ'•‹¯ 'ÚZEX£¶ßí x±•‹5ìi1ÞVX9/í÷Íñ[ÌäÀÆ‘S»ôŠ–o7R#ºÍPÑ—³hÙƒ×6ƒÌRѱHÿÞ)©–´ëGCŠþ÷t(wƒh.Y¦^ @†Zƹ"u;îÍz,â•÷\Xåºì^"ïþ¡wpþ™‰³<—‹1CÏ°fø˜x6`7K!Èœ0rýèV%æ(þîËB@eƒw ÷nYx® Æ ¼ØÁMé}õŸ\E(/¯¯Ï?v^±¥ñb×Õ[Hd"rQYçR™©‹ZÁU÷·N—÷®r ‡Ð-ZþÒ‡W&·¥™wø®_ªb[®¨³{\Ã</Ø}Ù+ -Ÿ€JiÜ€¸P¨4Øܳy]N¡ÇÆOáp]ŠáVœ;pp“‚àxÇ‹hBõ«q’/ˆÿ å¾=òÝäË-o†þˆa¼œŠ¾~Ä]<™Ò¾u LÑ ÆgêõnƒñK"BPŠÍv¬”x¨Ÿ©±©«{jݺ»:°‚}Ïê µé¦¥﫧è÷I‹Ñ—†{ýÂ3UË‹;õ)Rà/š ÷ˆiÜ ´§ ò”¼éÉ&oÈ#òŽÅ{M 5â,_=ÀVp 1Þ&’®oO˜NÀ/3È'0 ƒ ÃÀlàÌÞPV_6zÃLø¡àŨǦiš÷/EEC}†ÅkXµy.û»éRf‰"}}^Œ - -±øMðFC踜Ù؈g›Ïçï:‹¥Èr¾¯Õ\ö.tl¥!ïÖ»/ŸJTWl£…ØŒO8Bm쇦Lxwߌ&ˆ÷’ú¸,ê£Q¼G€ yt|þÔ‹ÞH¡ã ‰°Ô‹+š–Ë#2ÊfSåõ•†4M†L¼¯5x¹åqfS5Š‡¥œšÊ -cI.õȾÔ#¹|$1ÿ­,ÉUxŸ>T$—”$§€ÐÀÓ¥ÖØä=jàbµk^uûDÃr@ }H(9Íè×6å¶ì«ŶÞUþÖ\XmêÕ®M|qÏXÜ“‘ìetX¦A÷oT¨» ö4Ì*LüC Ý‚H6ëÖcš’›@ÀÆmÇ°ÖAà ¶` å#UÒû„%ÔpýùŒ ƒÓ§>ñ,¬R -’©W(!$DfY6)'*É2T;áÄo7¡8ËáÞó%£Òýj¯¶ýT4e½ã¢žk³WŽŸ”.õ£¹)Ä£«¨7j@c¬ãÑ\Ž‘M:ªêµ;ÌQSÈ -r•¾ÎB5ÃÃÄß@¬Rm§LøHî!BP&Æ.BŒB:hûóâ—&Õº…³æéîÄL•7@ðן¤/ä뮨º°<|€€Âà`.±¹Ý»'½ïŠy¿“µCë¹ì&C•{¦‘ÿ:ÿß©ìÍCþÂŒ„4ÕŠ¾Þ)f«°"‹­’Ù±LµW#•ÆBgê 5a½¢Fk_‚cÑ¥<Á­g¯óÑcÍ02Ù³±Ì§| š„ -üœñÀ±ËC½áWŒ^› íµ ñûѽŸê}´8°D˜k@¯|¹Ë? •%R0j«Rj¯ö^èºðìÅÊçKÎárý*X¦ ^Õfõ‹ù~C¿x{­“7^ÏÆXÇõ«ÇÚׯîåѾŸYÈ…“ôuz¬&»Mu,29eaP-«)&Òpøåit®>Ò{¿¯°ȳJ-tPÖÐãôù! -Z|úÐâ虣+½üâ˜Ú(æÒûeQ ¬´*ÕFcQäX¡ú˜hØ(øððÎkŒ2s/«XYè fü^Ú£m¦Ä\o:ÈÉë`V¾0‹¦Ø:ŠµE¨xCà L„moë'Z„ChAGŸI -ÃXF¤ûY`Q~åA7Æ"êý"mw3E LOð¸º+²ÊÞ¨±^Q÷€ÕWŒÝ¸Ð‡‡wýcù,ØcwÍË!ndåøÃÞóÕ-ôX3{˜dåÒ¥åt7ô, -ÇÙuK¡;ršøá! èîË€%¢±Bߺ‡â©ô!šRKÊ*¼ÖÞoO£èe>ìH=È|Ýa¨Ð¼0–æˆð(š„Æ -ò½ûþç H¨êúɘåÆ+&´»¦¨Ú;~DJÌòçIb¹†O”×ĹXž¨[;JŠ,ófCÙ ¼h&ëÝÊ;¬„CŽ½ëž§÷Öœ$Z”Ãôö¥ŸD-Ääp&p$¼îÚe»)ž¯„å׳%|hA:]Ý´!céºTOÔÂg-O!`fÊfÀ‚\©=–ÛùºBªƒh3dP§ÊÂÖ#vx¬¦¯†Ç¡~ÿrâa¾*ОbgOõöP{}!x0È}ù¸Ò{'ÿk¡GrSž3Z´Ö=詤Ô̓ )¥–ËûM}ë“RŽð'F,\°v†³‡ŽÏâ¨Izp°ˆë³üÉS·»%2Õ2ykÙÛÇc¿hS&ÆŸ¡Í8™¤-þö¯Ý†Ÿê ²‘\ñVøî#m˜ò7žÚçr“Øä2›aýß9oendstream +xÚ½Ërã6òî¯Ðm骃'IϬ³‰g×v¶j+É–`‹5é!){œ¯OÝàC¢äì¦jí›@Ýhô›â ÿ|¡Ó$5Â,2£͸^,·glñsŸÎ8áÄ)c}wöî£Ì&1©Hw£½ò„å9_Ü­~‰ÒD$ç°‹Þ¾þxõé盋óLEwWŸ¯Ïc¡YôñêÇK„>Ý\üôÓÅÍyÌsÍ£÷¿øçÝå N¥´Ç÷W×pÄàãȦ7—/o.¯ß_žÿv÷ÃÙå]–ñy9“î _Ï~ù-VpìÎX"M®/ðÂnŒXlÏ”–‰VR†‘ÍÙíÙ¿ú G³~é¬ü8K„LÅŒŸ 6I*…ìÈÓ„k c,º;çÂD»ª¬Ç“Œót‘ ‘ˆLçG˜A¤xŒu‚—€åxÙ[wÝfŸ° 3&?M8 Í–#Â&åá|JøÖv-ܬQ·¶QµÛÞÛë|¶vYW«º—Å׈¨ÀwŒ° y›”Õª\]YW l’åÃñUÙ÷K»ºÝœèyDX¿2ÍîÖ%±OÍž,e0äàsýùŽÆçŽÓ Bjsž­…ÇmÎyÁ©¶[[­ì*jèrÐ(Ðõ•}(v›_}5¦Ï¥JLÔ~ÊØ }Á%¤"w*ÎpÏmYí:Û"i7PT+ºÀöøVnw[|y.6;{Š,K„‘žÏó“&Šñ;ò䘤9+7Ùi c·€Ë1+¯QsvÀ…å•ú4ýk†±¸?šª|ÊÁݹ…QMÚ±Ú-¸…Š*Û½ÔÍœìšâÁÍÿʘXâ<^Ì•Õ×­Å‘'Û<ÔͶ¨–ö;7bèraª7Ø¡íj\Øâ\eÁdž ³¨ÚÛ´ÉŒ Ä +î3ÕrªÞ‡âÜ“Aš')ïµÒ[™Ñ®µ+„¼‘óµò9($Œ!Ç­œqÓºÒ»€àÔ4´¶-Ñ9ð¥¬úù@+È#LªàyüÉݽ"×tVŒ„d°Yo°‡B‚XÂ?ñg„c´àƒpm I®²`ilÞÔ¤H”2ìàDWox®ë]3XÝç¹H Sâã|YTUÝ!ûmiý圑¼ŠWâÆ鯰„ˆÈœ`'ÚôRn6è#îÉÿ´ån}óJîª9Ï!r‚“·ÁÕøÌÈ•%p\´í¦˜>É|:¯Áé÷G\¿R¼áFX'üQÀ +’>îŽ@JƤò4ùk†þÔ¨³,2@‘Y§!¤ã` ƒ¡Á0/ër¹ž¬ù7Oטö¡@t;«²*šWqªùT·eWB0~¶!<¥ƒŠ¥È½ÙyQ¡eùžÊ Á3Wè^àYWŽh®£k¿à#–!è”Í V\F8‚ž[þ€«·žçG·Å+Ëb×fá +¨_w¶)-‘ïh¹­]Sáû-dà ªt¹îÅÕßáÚ{‹;ºC²©ËqœH™G›ºídP¢-Žâ¬Z¼µ«´gnnZ­v'owîÂnA£×·øôÅM<ú㻡 ø{wpH_ðò(…@šˆàÀ PT©7;ï¤'‡Á«zBi.mÛµ3­2ÈtÒ7âþë¸õXÞÎÊ*nêºklŒ1X Ös’t5C{bc•eSâ9rÇE°,3$À¯Ò=QDèK U‹Sݺèòj®ƒÈ¿îJJ#p–Ì4GO7`Ù¶ÛC ã5ªùÕQîÉ…J¤Ú7Âb¹´Oà““?•Ùæy¥I®³œ‰˜ 5"(NÎm ôi¦%±&y« ”¹¯oóù‚´6ƒM3#Žï…ëìE`X1Ý*ÜÅ +Bt®Ót¬5½!úBBåb¡ OÓ +ËŒ‘0t +Y—WŽ;¤SŸÏÁåCB§":¨”sˆ +P®.h"˸r¤_mwö‡‚ +yn$ÁJB…­œ¸±¾öZ–oŸ6Š" ån Â'µ2·­R“ˆjб<ÿÚI}jXöÐøk + “äyf¼±W’tfŠå ½áÌz,Ÿá•1Ä«rUv¯±÷þðvàØàv”âÙbLàб¬>&ŽM W^Nù¸}²ËÒ•'>òe!ȲÁ·Á ÷mYŸÂ°\ã-€äbqÒ{*|YÛ +Q>\ßÞ^¾ÇQ8xUÄç‹]Wo¡†‰ÑAe,JYOÔµ‹Þ*meJ áµhé‰Ú–"Þá¹z­Šm¹Ä—ÝÓ +6 ….¼î‹^`BË|!M +†m¼RádóHæuói¬0„^ÂᾘÁ-©.v@ãö¹‘2ÿö7Þü@z¬7x8Üê{Ž PòýöD‘ÉwZŒ‹ ýÃ|9}ýäNQÐb,b(æhˆ)˜Û$7òz·qÙ ã!%u`;VJ7°®_ØÔÕ#B÷ö¡¬¸wÏê+Âg¢é}µóý9q3|ât¯_.½Letõ€³¾@ +üÅsù2½‚¬Pê,$V‡:/¥Äaöž°öˆ#š?Lòw +Ìa•o8”à=|6ÃÐí©¢ü=ê,Dô£e)ÜLb{£,cÏäz¬pdÑqU¯ìay*!Õ”™8ÍB5ÃÃÔÝÈ„qHg'Lø4îÁ ‚‡ŒŒ=åsûûäÕø¼§µödK•7õÎÖ_£oÁÈ×]QuaoJõÁI‚Ò¸”'Šçfßç>Nšx¿£¥ôRvëÉTe_€ôñ—ÿ9çÜðq#ÿŇå©á¢o¿Îºp(ô¥È¨½ +1™dJ¥o¨Ðë„ +¬} +>uFtæ:¶â4=Ö #“3C0ô§œ zä>%ÐGŒ5%.ëzCß.z]Øë’k¿ï'ö~©÷L"¤;~Ì6 X¾Ïå?z -%Ô°S1Ò%¨Â¥Üû.×…]¤}¾×"ëÿSÃ2ÿ-‰÷*6§aÄ÷ÆÁftž¿QnŽ±ŽkXµ¯aÝë“=ôQP–(%NsÐcÍ°09­ÔPÁi=åaÐ-£0#Rpûå3ª¼Ü|ÀŸøÞ*y^rþÉhôOðNߟ¢ëˆrgÊ­TôŵQÆ¥ö¢.­RrèQkWñë=·õ¶€[V< Q:ÕZê¹/ªÔWéÔ»à™ÒÓâÊãÔçÚE:(Ñ«`X +OESl-¦Ú<4»@ν­ŸqÊ 9Þ<&õ;L»"ÆgîúñKÚ1Rï7i;ˆÍ˜€w…Çžñ„ç©~CáGX'>`õÍbûnt»Äá»þ#ùì°Çîš×CÜ0xP’ƒj§,U§ÐcÍœaR’§) +¤P“CÜáçPn•Ö-¾@Ý¡ÛÜà€øßpÀ‚þFÙ¾ÈÝ/öû½÷v]<—>E“2ò·,ÃWÚ‡àïÑd$~Ñ…¹R‰ßb )tßL^ KQÆx˜M°„rï±ÿÙ‚#ÔŒ uýbÈË‹rãà®)ªö¾1ýÜî|êËéUp.‡G²ÆŒŠ!CL™Ð*‡:@£BÉx‡â +wˆ÷»ÇÂ÷è½='Ö.0zÿÚ/B` É8\Üí;”„&j7Å3áõÞÜÖ«x®Tu_ZKW7m¨Tº.dÓ}ðÕÊsÈ”™²° FšI‘É€Àk»_QÍè1ëØ_þ±ÖðK6¨­ežùÒ)²> endobj -1359 0 obj << +1376 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [318.204 427.0782 366.911 439.1379] +/Rect [289.8576 392.4739 338.5646 404.5335] /Subtype /Link /A << /S /GoTo /D (dynamic_update) >> >> endobj -1358 0 obj << -/D [1356 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1355 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F62 1050 0 R >> -/XObject << /Im2 1039 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1362 0 obj << -/Length 3826 -/Filter /FlateDecode ->> -stream -xÚ¥ZQÛ8~Ÿ_‘Ç 0ñZ’mÙ¸ÃÝît·‡Ûv¯=°»žXI|uì4¶gšýõGŠ”b;Î ‡jJ¢%Š"?‘ŒÅ"„b'A’Él¡³(ˆC/Öû›p±…±oó¬ÓjÈõýÃÍwï”^dA–Èdñ°Ì•ašŠÅCñÛ2 dp 3„Ë·?¼{ÿ㯟ÞÜêhùðþã‡Û•ŒÃå»÷ÿ¸'êÇOo~þùͧەHc±|ûÓ›_î?ÑPÂs|ÿþÃÔ“ÑãʤŸîßݺÿðöþö‡¿ßÜ?ø½ ÷+B…ùzóÛᢀmÿý& T–Æ‹gh„È2¹ØßD± -âH)×SÝ|¾ù§Ÿp0j_ÕŸ©9£@© -LEgY¼Ðq$ -†PÝÎО>|CÄñV¤K³¡G»£Î¼.†£ÝñDͮܛ–ɆŸnÆö`Öåïa( ¿û”W½iƒ ¥‰@ ‘,´LÇÙ•MÓjÈE{sFâ¸p¦¨ÛU_Vmù§™®.d¤Zd//ï¹fÖêXÈ8Hc%Ç|6U’vÊI–yñdŽ]Ù’nôòþ‡Ÿiä×~¡®Ç~ƒÊÞ˜#µ­ô–¥¬™ãÔ¡>WJ…ËÝfr™WeA,¤kbËéШ It^z…YBÔïaò{ ¤Å*Š` àƒ+!‚,ŽÉãš¾kË'“¸×Éò˜×[î|.«Š¨GîiËÊÔ]u"Ö¼øOßv¦€å -ªåƒU Œf“÷UG¯YYˆtË °Ówú¶ÏyAÚhÞ65µ7Í‘%0]WÖ[»¯ÐmHÎXÇJ&¬šGͺ©WgÁ’Ä –°`þ•d¹5ÌCLj“Ôí³9NØyÛÒp·³B7ývGCÔþbjj£ѾžóªòoåÝÜf«fý…¼msÌ·{P»ó¾C¾þÂvhýù;« ï°íM˜íbôÚÙ’Â喵ݙ£ç«‰b# …^ñø$A("ñ²Ç¹®{¼çB5ìóo×^¤àµ/®î¹f–;¼ -ÂL%ãõÉáU‘Ã#"•û~O òv¤¬Æí¸iÛ|ËÌdŠHÕùIò+;ljîC$À§C-ä phäÑ"ˆ²hl2ƒ3Uîà"FåÑ!¢ƒ9²@·‚Ø ŒÜ3è Ù©óìoÀèü úÝ2¤°ïŒ\ÎÀÁB(Ç°m‚ ,ØÆÈhlUOïm#`¾znSTX)'^2Ìøg]˜X8ÈLÍfYŒ/O”¬MùÄ ã«3´¶‹M°Cê"!À˜p>N˜øzAΘ™Œö -°Åk¥B¿lC®ëÀæ¹ØÀaŽxø•Yïéᛊ©uô²žkFŠ¾E\Æ©‹ñÙ‡vh i‚9 H4¢Y>KãâóϦq¶®‡­¹Àj°¦t G{¡ÁãvAħÁ®<ÿ+»ºœ—P{Ý•ˆ(Q¨@_È“B¨ Q·žë5).f;XIDhˆÂxÔÁ£’eKf tËvÚ™oÝŒ-õ•a†BLw|=È$Q2ÆÑç]¹†ÐDEÂz(>é´#ÀÏ„À à!XÎâ.6È/œJ€?ç¨_ÜÜKïJ:}œ·¦g‰$Ûii(“*™JËä•ê@ f9ãŠz:”kÏ5Í·iA¡ç¥2ƒX<…Rš/GÓµí­©Í1çaè>1ÛÎÌ€ŽP*ˆx‰d/øÕºÙ@Ö;.·ÅˆuìöÙ4‚gª–šÎК£ÁªÏ;9B_NärØáœ{Ë1SQzÄD Õ]BìœBÒec]8Ç–Z];›8 -²,Ô¯ (Z©”™,þÃŒU“¦¸›Q] -²«¡æffýjt¦óDÓ6û’5Ô6{Ã}· ÖÊzgÖ_X6|«Ó¦¯nÅ’ÿ‘ß>˜#jÂYFVi" 0ËlìG¨h03`×ö ØŸfTèaè«*Tè²áà`l‚¤—ïyöCw庯ÀøAÊ9½fQ Îˆau°Bí¶s— „¹±Ê†¼-­S4´«ºé¨#?l¨GîLƒó[R±”Î'ŽùóÜVÃ@)=·SCïjØŠÊ&öº7|q̉é|:üyMyµº&d¹}e¯ Åa<’’&ÝC¬K‹?òrCØ€æsÙ툵ló=SVÑDVæÉTĘ·N`·Ê°èBÆh-$žýdyê -D!dÆYòºŸE"ö–ÐÔ¸ì¶?æt‰âô¤\{J©‹ô ®Îì)¾Ã&ešWÅ©ûô8q%º¬v…a20Z!·) híÒØ=K²ÎYðGÃöB˜NnÄ¢ÏcYg•^ÚݪÔÚ<„¡+¶1d8ŽGžJóL#yk•ƒöÖ€®²^W}AY‰tæ|b Ig"ÿ7…„°ƒÐ×𔶶Wò6æa@„‘cCºrcÉ(µ· Æé©BÌ“ÄÎå­JfçI¤¿ù•Š²žä—ögã~²¿+az·”Æ’è‹aúëz˜î¹¬3T%¨¶]¹ÿÚ›ãéŽdÂ4sv|*¥TY¥‰xYLÏ5#çX“Q%vŒ…³µl‚^ˆDÌ* ±ÌXv%åÐñ9×Ml°¾‡Á}¿Ç`•Æ©B £¾Ðºß?-J8q=Áf{«Ìåpý±¥,ºZ˜§‚Ó4}K=k¸„IuÔ&·"¯ODláíšHRª%ÏùŸù˜t¬…3¯¿Î t”:ùŠPx÷Gø]aî~9i -x›ø åo¯ÍÉ!Ä-å4`ŽO†ÁÃVS” '‹ .žÔqÖks°ÅG¼aP3\ÖvAÕƒÃ`zò¢(ÑOìñ&ÂY,Bu”¸ª2r_é1hÁ…L¬ T¢º¾æÕ¸”œ $øvÍ®wX!jçJ6®`òB,¸ÝšÂ— -¸wP -•îI}R„“ß.D~Yð)$;•Wœ »@¶;ˆù -¢iVIuíšg"ödz@¡½•Víy"‹Tð$["§‡³TAê3“ Qú!^¹Ë¿×‚—¯mª§ÙJ˜‹¨šÈ•¶÷W¹ãƒ]ÕvRÅE ¶æÛÚ¸XÅÕû¸¼xwž¾˜ÖþÀKú½/º8¥ì†õ<¬÷åç Šèö›Ö‘°Ç[>4µÃ‹dy¾péÈ¡‹Å€.çÔ?2åÏÎF* éF±ÊáÝ-(ŠÎNy…ãênÅ •Áapâl0ȳßÍm×€€•%ÂËgÅN{8ØgZ0¸±±Ä§ä Ãþé¥Í±ñÈÃUóÌé]A6ï†R@½ïlR ¸Ã`ÓÊg§ØçeÍ1æ´ðZ“‹³ÎºI@Jß]½/u œ!Ñ5†&ÚPÇŸ4McmÔÞnµ·üaéÛMPó{UI #–ºë‘¯D³¾²ötܨ»„Ðê¯`q<Í‚8I'0>p¹p½q]¨W\W¯€ÐO%‰_@¦å¿0 -¤òA>ê(’)) ´³†Èž#-YÏ–ç¬glº9jûž^ö«,ìzlzÔ’\ -¢÷óšXËý¡±E_Ë|š‹R…ˆ¡eÓƒLG“"³Á`Î4 —ÈBð‚&2¤†î‘Àßí -ƒpù}_VÝÊe>þ²¥V>¹°äŒ!GB-¤ÎÎzUéy2•Š%ÕD›§²°p‹£6`@jgªÃ¦¯ˆ±(ómÝʯip$vŒ~?Æ7rêw…]¶øžâÏ"nsØ"ù-¸Gé¡ -WØ¡5}Ѭºæ°²õ‡UÑà 0W&Q2HbíÐü±¬‹ùª¬ÔÂEÉV$¥¯•#àzð…Ÿ·?½ùøyfBˆ‰³ÔGÕ68ÇB3 ç88¿Û2æÕ¾Œ»ËQVU”Ëcs 1hQÞŽÃW~¯pŽ-€ˆ´zíç -ÿåÓÿÒ_/fýX!Ef­XªKÔˆT:g5˜ë).g¤/ ƒõuxò¢Ñ)*,Ö§É+Ç\©ð…@W‚…i)DÇ”ËF=†.5^ïx´-5ÚÞª ÓXí›»ÛEÊÔ¹[^A”wõ:‡•UèymÁ6K¹` „+ØfîC¥ÌÞÞ-“Ö{À©"flˆ }§¦'bclQ2KÝ«zYSº€]¼RQ¶ùc5šÙWÌ…Ò“:›+Ñ©$]öÖ…#÷A^I -+x¶ß=Xvª¸aÿÎ~¡0zÏ»ôÌùÃ'“¾5X×zX¹¢™O´h©¢¬í}ˆýyMOóíP•kOC˽æ@Ï5³„´9tšM‚šPˆÌAëùã¸5Ö;Ÿ)»ÀÒ'þWâÁW¨—ÃÓõhÇ1Y¥Çšzºh†Õó—×d–Ë%'?˜EJ«Ñ’N¤~mÛè\¯÷?¤]î4ÿ†Ù;~»Ì‰à‡ ðuÊÑÎ`N›×_ÞRCœ¦”ƒB–'¸rSjü¦Óÿ¢À©1®r:˜+¿‘)Æ>üûaÀTñ‹¿ýÊó5:ç(^ñò5,×A"ý•ŒQ]&9âü›vFŸÏà³s£üMIE-dØð‘ ÐÖu2WrBŠÏQG¸ †tÜ~«°9ñ×ÓK)„02Õ“£àuæKÛG»¨x V mì^ß­!ÖåªÆÌg,¾èp%ŠPhų^.Ü)ýß_ŸƒH*M¯ä ø©L”Â$,”£KÐàO‘/Eÿ/²Wendstream -endobj -1361 0 obj << -/Type /Page -/Contents 1362 0 R -/Resources 1360 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R -/Annots [ 1364 0 R 1369 0 R ] ->> endobj -1364 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [324.9335 578.0115 381.8296 590.0711] -/Subtype /Link -/A << /S /GoTo /D (zonefile_format) >> ->> endobj -1369 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 152.6674 116.59 164.7271] -/Subtype /Link -/A << /S /GoTo /D (view_statement_grammar) >> ->> endobj -1363 0 obj << -/D [1361 0 R /XYZ 56.6929 794.5015 null] +1374 0 obj << +/D [1372 0 R /XYZ 56.6929 794.5015 null] >> endobj 410 0 obj << -/D [1361 0 R /XYZ 56.6929 226.773 null] ->> endobj -1368 0 obj << -/D [1361 0 R /XYZ 56.6929 199.6254 null] ->> endobj -1360 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R /F11 1367 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1374 0 obj << -/Length 2801 -/Filter /FlateDecode ->> -stream -xÚ½ZÝoã6Ï_aôå Vù!ê£÷”Ý$=]ï^’;×íƒbËkaɵ䤾¿þf8¤D)²œEC`h4ÎÌoHÉQøŒÁŸÅÊg2 fQøŠq5[=]°Ùhûé‚™¹š»Rï.~¸•Ñ,ñ“P„³‡£+öYóÙÃú7ïý?®>=ÜÜ]Î…b^è_ÎUȼw‹å5qz¼ÿ¸¼]üô¯»«Ë(ð—ľ»¹½¹»Y¾¿¹œóXqè/Œ†n¿ÜõÓÝÕ‡Ww—¿?ü|qóÐbqñr&È¿ýÎfk€ýóóe«Ù ¼0Ÿ'‰˜=]Jú*ÒrŠ‹û‹¶ -VÝu,~Š}%‚p6W`5Œ‚ñ(3Ÿ)ˆÚ< -@— xeÁÇ¢l¥0ÊÛªnÊô)Âå"ñ%—3Wå+ÃVhÄ°t sø" –¶< ;ô[cÙu¶Îö†ÞV‡btäí/yìe»jßPÛsža²ý‘Èj3Ði‘þp¸‘1÷ƒ(L•ÿ1/×$ÞÃñ–¡‘}É›­1rÜݽ¨Ïeú0!Jœû‰R‚Ðÿú0¢™)•Qýý%ôUÞªHëzD±d~"`"2»Z>Þh”‘Š82R>©|Øæ5R¡·Î6é¡hjâ7•yb¼°¹dc8få=¥«m^:²yùe b{wã‰ÜT‚™ûAØÈмØT‡‡:ˆ¼GÇ 6ãŒ/Yc]ú̃'‰Í¡\5yU"@–˜¹vûü)ÕÓ_û]UgÔCÏ `Ö‡Õ–88qò¬&vnžlÌ×YÙä£ée›Û^ ¡°þðâ\?¾èÉZvôªmÂ3-«´nè…â‚æXLfQbÕÒ¢8Zùú|Ãàâë±:ì‰2.j‘„Þý.[‹(72]`n‰X¨Á'=eUf™=‘ô#Ì,Ôg×éc‘™±“‰ôYÀÂ>ð!^euMþBFÕ°áIÃDëö0ÇšD†Ü!ãÓÙΕ:íZ)ôÎÌAðpž¯_§<å ‹ió­Ôˆý~Òc¾‰ê;@3Ž¼Å5=ËhÓÒ6ÝŃtãÔËJ·e•åÏi`¥ôXÒÀuïh]è)ü™1a9¸†–÷‹k³Ž€CÉ“sŽÙG$‘Wí­f=è@a†ê¹É¸<áz¨yb†'2.¦PÅíd\\û÷7wÿ¾¹™‚Jùaª^ºEÅ'Òm›jÙ|÷¶,‹êNeYá$[– »,‹*(¬KBÈm“¶P¸¸IBȱIˆ¢ÂÆ$a?AêÜÍekxv© ßLjBRçkx¦ôp’Q¯Õ&#|i“‘Vlž]2"ù6á+%#¤ºd„g’Ñ [ö—%d–ètF -`õ³WI÷æäi”‰YgHt^FJL{)8L¦vïqÒ&Ñ1G˜·"i§mQP—Uz¨3“@c ‰!äýX >\ú‚ÑÞ#¸wÐ{–° '{C{Z×îœ@êšÚã;'vrwNfô4'ƒ±Dq?âq2—ׄðÀçck ‘±]b8ð#Z„€4Äí -9hàS"‚ÈÂrÄŠâÉŸÃ ,‚õÅà»C^4ó¼¤èæi׉ü®G,3\‡~D4>K©¤·ÅÀKxu¥9Àzlµã[FÚQä¿Z»æbüï?^?-²å==MV¯ôsm TeqÄ!ƒA -…¤ÚLIž^6˜­ÖšmÚ/iW9­”ÕþÉœ6àñ˜Ñ“ºV¿&NQ­¬˜"Ï‘kCIè¡çÐtY5}å5ä,¢ô,OÌ‘‹²ÉöeÖüÍè¡Um˜ …YN_8]{€(Eª‡>¸Õ­òVžÒ9gÉ õø«ŠvH‰±ÒqEJ½KW™é@qhû’Ú—¿^üpµXÒµÖ»ª¬©ƒ$XÐÑÑ٥ɀI»tßä«ùظ -^¸¦â^‹VU¤Z§#7 È Äh-| iv ?]¯Ãä-°6ä'z»»}O]`oŠM=Ú]›ò¤„íaŽF¬¨+êš—«â°ÎÆ`‘ÇR <–¼ç1´“ÇÀ_|z‰¥§ 1Ô† «›¢(Á—2[ãÒÁÊ°ÕĽ"/¿NéÌjÓŸÛ÷¢ÚÍÇ&ÞcºúJé¤ï2tÝc°ÑÔ¡üZV/å«ž~kïIÜË@B$f_A*mÌ6èžÝ8Èá°’žô _󑥇ÎUÔA§C`aÞ02ù®ÄÈþÌë¦&š†…ÑmEèÛJþl:â Ðì´‰M;Ë7ªý %®õSÛØ$qdÚ‹Ä:ƒcÚ>ÅíÊl`n\M0€¢lÄÊ€hLÄSzd]Ö7ˆ•‰žÔöNël0î)%{²Pš.E^7ýKÏÀ–™ yýã©S–x̃邚+¥/@:;*±tt¡×Ÿl‚Ã;  SM[m¥^›í¬ÐAØ7ËüÅr~u}}ç_Ý}ºL„wu -¹·ãXÊiä®Ôiä­ÔYä“V;ä¯ÌŽ"ï™åpyx3v¸©Xñ3Ø© ìVê<ö)«ö¡Ùqì®Y¡ –ÉÛñã-9“3ø© üVê<þ)«þ¡Ùqü®YácÑW¼¹/Žã3ø© üVê<þ)«þ¡Ùqü®Y¡°LÒýÞ}Ðgá™88Rq°Rçã0eÕ‰ÃÐìx\³Ìÿk‹Oáù˜1éËDœÙ1\©‰˜Y©ó1›²êÄlhvÅ!õ”–¦ÊÝÖ©/}…Ñë̵ NaÊËÍ>­›ýeìVÍ¡°ˆ;õ[x1µLS1$Rp"Þ•I¡Ïî’{XÄÅõIï¾">yìvÚ@tl÷ÔPuºÚçNyèÄKæúWfÙZO ÔQ3[ÆÚÕÑ®Jq!nӲ̊‘Oå¦|TT©é’¾¤†çä4·×©0BS[??u™€£Åx1~f¤þòÿ>9u¬È—q,Æ÷< {],’È:¥¿ç¨¡çJƾŠE4âúÿx``endstream -endobj -1373 0 obj << -/Type /Page -/Contents 1374 0 R -/Resources 1372 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R +/D [1372 0 R /XYZ 56.6929 769.5949 null] >> endobj 1375 0 obj << -/D [1373 0 R /XYZ 85.0394 794.5015 null] +/D [1372 0 R /XYZ 56.6929 749.8269 null] >> endobj -414 0 obj << -/D [1373 0 R /XYZ 85.0394 592.2428 null] ->> endobj -1376 0 obj << -/D [1373 0 R /XYZ 85.0394 565.4551 null] ->> endobj -1372 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R >> +1371 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F62 1060 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1379 0 obj << -/Length 3229 +/Length 3862 /Filter /FlateDecode >> stream -xÚ¥ZÝsÛ6÷_¡·£f"Ÿ$ñ˜6NëNëÜ9îô¡í-Qç$R);Î_ ì‚%ZI®“™\,‹Ýß~²˜qø'f&e©•v–YÍ f¶Ü]ñÙ#Ìýx%ˆg˜1×÷÷Wß½WÙÌ2›Êtv¿ŽdåŒç¹˜Ý¯þHR&Ù$ð䇷ïo~üíîí<ÓÉý͇ÛùBž¼¿ùåG?Þ½ýõ×·wó…ÈH~øéí¿ï¯ïp*%ßßܾCŠÅÇ+Bï®ß_ß]ßþp=ÿëþç«ëû~/ñ~Wn#_ýñŸ­`Û?_q¦lnfÏð™°VÎvWÚ(f´R²½úxõŸ^`4ë?²_ϳÐ9“d|ͲB2kž^–Ï9ÍôYøY4 _ŒE îMSÉ2Ž î•j&³ÆHç_˜U™Hg™RŒ;¸÷ÖØ3ZfR-ŸàÌ( Š{ŽóE*’{ø_&gî‘<“Ù,ÍsfEîžý=ŒkkòDc¿ÓÁžðÝÍNÎÞ5°ŸY´¥ w ö;JeXÀ)0e³Œg,7wt¿)CYžÊbëF6Ù‡²îÚ–‡ùBñäi.MRZ¤®ç@jÈÞmÊ–d|ž “4uIlí¦9nWȵªÚâa.y²%Þb»ÅA¹Ûw/Ⱦljc½*8„5œ-zò½¦y›gþXìçÆ»pŒ`*SÉû~#9.âd -shšnJ„¼)ËỪE&|f´7 ø«- ©j|†-ë`2¯Õh“‚…&€˜hö]ÕÔ8^5J|ÀÖi‘q&3cÇźn‹WûŠ®Ú9 ±é­ïj©å)xIAîÑÙpúJ&r8ÔpΓ·«Uå4*ZËePÎ2ÅrSÕQG„C$A -Ôù¡EUÚ$E$Ni ŽÄ¹É%ˆ+!'¨Ôõ–mƒ,K€5lí|"‡$#jÛ ÿù„. -V–åÄFò½½B5®RÕ]y µHœè$U»½w`óD[éúµÝ7uKSІ­1‹.ÐqRhÆ9ô-#ÏíŠzYbÛܬ]^í‹@±6O~ÇäsÎvŒ{o©7ŸûbIÞð3Ž³Å!…òìV£ðê»vÄ‚dfñËmšC·X»©&×·¡2£JƒØ×R摲0éŠ6þðâ[7(Ad.êö¹$êÝÃÁmÓ•a‘¢›€Dƒ1_‚„k ácÏ)LºE›M³ÂÔ®\nŠºjwÔ Á9ÌrטÆ~õÎ4£³?Uº¢^‹aÝPFm‹.D±7gÜ+½»ýˆƒA!WM©Ctãõ±öÎ p\Ô9V8Uf£È‹¡£ÀË«ÆþÙkççaÓ%Ž÷™=ŽÈ€z¿º÷?¹áå§e¹ïN>½»kËŽ¡v£<  îóWŽŒ#\©>‡8+‡²Éå¶y „ŸÈ’‡c‡˜VÕIH»´µ: iGÁ ·.ÂkŸyAb·}™ !ü©”›ä†Öò~n8ævÕò¸-À7ºOÇaö‹]ÞáŸ,šÃ -#8Á¬ÎáLÙ7eîÒ "¸žqDJ¿<9Jø©ÍQè+Ì¥T²ÁÇQB{'ðøê>"Oº¡o EàÒx¿³Á’Ð@ ¾+¶–:#ÝV ˆm„ŒY{›bw}®â:ŽÒLyƒx¬Ð¼ÝªÖ¹eTf`¦¡&_À¯#Ò3’>g*ŠÓÔLõ9(:wwë:1MÄŒKØãö.9r‡K8̸„MæZwLv% +b”"%†ñç‚ c‡M›´a ZÐoZAHØ#ö"aãDRi”¥ b‚­‰Ž +³ç™T \L°5É¢D€VNØø_§×ƒ,4ˆ5j3®wˆ¿»);ß1¢³g~BCÄ©ÒDMÎB“Çí55>Nè_8Õùºä36˜¤GI1îœ-TôyÙª¸8_í¤Xk#c…ÙL¡Ð'C“qjO¢s­Ç2ûµ_Ðeô•˜UÑ+ŽˆUÓBÑã®Ú`XSø…¿tÛ.'!0(y +¶#ØŽ} yàD ì¹@ùâá²xõ®¢ÛÇuúm)Å&éNGÛ89?¨†ðN§Ð~þ¤iâÒ“«DVŸÕÆ¥¬®k¿®I +Ú$Q’©d +c ñ¡iLágj(T‡þÖ6yš†á'&Û-ÅRküt?¬7íþòpÖq~„ÜDrìÚÁ3Ó«moiOÆfØõqç|DêÜÉá€7N­¦De%Ôô>‚Î"“ÇùT%¼a«T_º0°<é W‚Ö€Aâ”ÀŠu[”¶|µ ºØD:3ú¥È W¦*8þ'Z¶ÝW,¡®Ý[»÷‡`©lvvó…ù`Åw2mÌÐøúïøéƒ=¢$¼V`PB.=Qªf‰%Ê´,\AÌ©.›Ó‚E”I™½(A+F÷¹á{^ýP€«Ü 5è>0¹$Ö<Žô 0œÖ(ÜnÉJp^:Óv´OÙÒ©š¶§âp ìÕg±ºpT©$æiÞ$ŽÅãÒQE¤uºtRBé¦pçSÓÝÛÂUž <Å[0Ê› „û€¶»£/1)L”%qþ“±fÂ%-ºÇôÝm~ÇÛQºU¿#Žsôª+öÜr‚¦fmlM„Eçö»Œ+R¤‹NCL<+4T4[F(DL“'/›Y,MЄ¶Ám·Ã± ŠË“pC1°âòxÞî)¼‹]½³{Ž™iÐÏB wè©HFêÂÕDª²Lkˆws²)˜ñ;Ëú¤ Ëf±…àóX•¥ƒY®Üiuæt ~Æ¥S&8Ng\ÕÍÜ•ƒ2r0T5›z(1§áEîǤdOê¯ B]#üu¯6EÝ«øË—°œŽDœÎj)–Š#‘ "\œßªk2ÞäH×ITp|>Aq9Â,%8×?#‚þ]ˆÒc þGèøù(}Lu9JTÎê +DÛ­ý…ÿ>ØãÓ+â ÑÅù9—*ðy6ÕŸÓ(H;àž0ê ô"¡·J_TM@ÆU_¹š )/Žc¬Îï$0V¥y*ŸÃlx/fØßÙàƒ$…Îc5”R¸áØQç + {ˆy‹Æ¶Û˦ɦ¡Q4OÔØ£ 5I¢¡Kª%'F„ozÒPÆùû‚ö¥Qgv~G|õ;ðSsþ>[4°MB€òKk¦£’«È„à®åo–‘Ãb‘bð0ÏJ@›=8@bQ2¾D˜¯Jª„)@Q”e…FâîÖ±F‹Øë´%{Ù˜$äÑT6r;õ€2ÄWÊa°³õ=µú¡a&¹,nBv㞦W29x?¬I…¢®€¬IšY–Â{rý~ëv»ÅZ?WxôTY¯k¸¦0.«J1{)$…Å*Ø_ HÈ€ß2 |C³Ûµƒ‹¡M«iÈhh‡/±±'Í…ªkå8‘ lÏ 9”ƒ_RuhôãšM1'&ÂF¦xç¾øb™]w¿®­ìòË3Š,¤ÛÈ S­ÞßÓƒ¯ôf>*ÖÈÑ‘ æVKqŽ WÍâ_ +HÑ6³,àþsH>+±â`›ÃÞúÝ +¾ìŠR1O¥-j6 ‚/A.ðR£ ›ØVYb‡¶ñP•¬N¾ž4†˜òHããÓáê]”h5ß<»¥ØHÓÕëp_¸»ßñžŠÿ093u˜äÕ_-¾ ÂzBž3§±ÓVîvÎ0„c¶=‚`«Ó&#C×ࢸ㹺}䬲¤ —îÄÔg2¸—}8y(1w; rsn‰}Q5ÛÎŽ34墡‚`ŸH å±í¢S>¤FOÚ³û4šQ²nZ¦unß°XpÂÕ8<Ôè°@ÃÏÕå©0Õžž`š`g1Û™ùDCïè]Ãû?ã_ ÓNµ³À:›r#s `4믈WBÈ ¢Uàÿ¬Œ¥ˆ#Pè‘Œc•‘Œc•:ãÀHÆqª¼ê©l,cìúš–žNP8t×(lrõ‰ž/"­ö‡ÖÕ™ñÓRd,¥‡¤féèƒè¥`ÂÛ,÷qüÅ8UIˆ÷QÏÆ©cªËqj "8ë«û§uiëâéüÞ^®Ÿß=P-l?¹ÐØD9D„ÓýÉ+§‘ŽürÍ%ãT<ŨûÒ%j^úGkÃTÃi,À9$´¨¤“ðÙhŒ_ëu4CÞ† úAðvõ´|Ì ª p†4ž¹¯ƒKÑä’Q.’KÂ<*ðâ§Q„Ëäf a…X};Tu¿öMû\–Cé\Hh\Öº Hh)¾üLG¯Ð²ÓbøŽ‘Ê°íCUZ~3Ju0líl}¸j",«bÛ´ïšœpAoTǯËéÍ=Ž{xÂ!WïÏðMŒ?öˆGf7_4ú^Gƒï:tv(ÛußÖ®æ±.[Dÿ¥ÒŒVQbRäwUS.‚U*½µ9–`— %p :õ¡Å›^ü¼°"*¢y—`q È +¦ÓpfLæCùW{j9YQ»#‘AŠ8}ቷl)u$!»{áIøBpLn°g«N^(™;5Vú6t”ÇBMØY€ ¦z‹óÕFiðàŒ~GùØô¾ È’®¨2ª¾ì ËRl©\–‹u ùXчcížæ8Ü‚.ñxá©K,*‘E1(/ïþþÃ’;ÀHc¯¹ ó‡lœî!Hª„Óa  /òª?LzáþÁGÀÍd/A ÖÝC†Í €+?Ѧ%昪qÇ‹†~í×C]m\0 =ÿœ!Ì‘Kj¹V‰‰Ò,ŸE5Ï ¡”¹ŠOI¸Í.¤Ø>ª–  m¼üM¸öÜüߟŸ0N#eê«b‘€®ç©gÊyp3ç<|7|Îúÿé5£ +endstream endobj 1378 0 obj << /Type /Page /Contents 1379 0 R /Resources 1377 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1346 0 R ->> endobj -1380 0 obj << -/D [1378 0 R /XYZ 56.6929 794.5015 null] ->> endobj -418 0 obj << -/D [1378 0 R /XYZ 56.6929 489.6987 null] ->> endobj -985 0 obj << -/D [1378 0 R /XYZ 56.6929 463.7183 null] ->> endobj -1377 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F21 702 0 R >> -/XObject << /Im2 1039 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1383 0 obj << -/Length 2832 -/Filter /FlateDecode ->> -stream -xÚµ]sÛ6òÝ¿Bo'ß„(>I }JS'uçšæRwî!õdh -²9•H•¤œøîúßoø!ѱ]÷Fø^ì.ö›b -?¶ÐŠPaä"3’(ÊԢ؞ÐÅ5¬½9aaO7%ã]ß^œ|õZd CLÊÓÅÅzKª5[\¬>,_}ÿòÝÅÙûÓ„+ºLÉi¢Rºüöüíw8c°yõÓÛ×ço~yÿò4“Ë‹óŸÞâôû³×gïÏÞ¾:;M˜V ÎóឯÏÿq†½7ï_þøãË÷§—?œœ]ô´ŒéeT8B~?ùpI+ û‡J„Ñjñ ”0cøb{"• J -g6'?Ÿü³8ZõGçø'•&ŠËt‘(N4MÙ<—)¡ -¸–d’‘Ô(Ùs™³9.Ç]ŽËÛüs’yqc“¶ü·=¤š4Sl1}„@¿k1€¥0MP¸¸±§‰ ÂáRn÷[äÛz_uد×aƒÝÖÍöË -Û«»Î¶Øíjl÷m¸®›°¯hmskaÞþoáRÒ!S³ü×­†#À ༠ŒQaƈQ -…3bÇ•ôعv•w9ön®õ׺Þýæ”é¥uã6î*CoSnËî…ë«álDÙõ?•› öŠÍÃ-À2\u}ö-oíæ.©ã]y7àæ裑0î ó(¸l‰XñeU‡ û¹°veWÀ+Áäò¼Âé›Oxv78»Ýoºr·±8º-í§öî ²ñ•ùn·)‘/à.oò.ÐÀýóºùþàÀUîa†ÇfÔjwó©áK;E™só+»ÎEÅä«×r¬6 -Î8Àv Yú#nšJvFŒà:ì!aèODfí´,GJA™…"ŒKDÑY&–™¢”.Û.ïʶ+‹6)nòª²›1ûìÖVÑ7M¾ÝæÍ ¶À.‰‘™ðÐg¦pÓ<»ílÊ´¸£¬l‡½_©¢an÷1_­üA00c ÏƒdR(âïa ŽÃÓá–]Ýt=ìap6å›Mý)bœ0­C„ûã6 .,üŽ~Axõe\ 5â !禬Aµÿ㛹—žË  ‘Ëê'¾èwöWJyUve]áL^­°óK›_Û™ëŸz0£¹‘`’i‘ÁœÃæ°N9>ŒƒÂ›¯pßÕδw-Üý|µ-+@²É“ðT­ôÁ vu8‰v.¯màe^ ÓÅò ê8‡m>°­8Ö….«|zÁ²Ï ½‘qÒ‘êÀxo)Y:f•–Ug«UXóˆ°Ì3Áá¹…ý\^mìx`ìw¨n0²ž0:`´›Úù—¨»º¨7m¼5ô„Àë}·Çs–—Ã;ì;\)p>™šNu@Ç÷‡Æ]x‰«Þ -û‰5¶˜|:×裟wÂ>DÒÃP²N€R-—.Y©q-žÂ[F@Q -‚­3ÉÐèšhÖ}¢ìü±¸¦†è,»ß²¢O‘µdššŠgKk1ƒ<–VO@͆›¿,­ -žøiå2‹[¾þzÎKFŽ<—[¢ŒSWx"É*„ž!œÃüÊÁü¾8Ü£ét/ˮ竮Ü;ôb¤r˜ÕFÂѯœËªdn2¥&(©¼WI1Y–.F» †]Ušw6Ù¯vøñÍOUûíUdí#nwðž kòª]Û¦}ìi6w:Árêჺ² lødûoéê.Ì·ý6½ôK8ÿfïúï¾qæÈ…P#î_!„\ýãÉ|Jœ•+ì@i¹“Ç_E2CÏÔql=MEŽ>‡\Îàç>iCڣؗ_ñL\z8 š£j2ÂS¯ ‡pƨª?‡*§‚p‘™Y–‚å+×wc(¤|¢¹ûªžÇÐL!Í#°|˜ÃÛü?^r'®?KDÁ”5Sn†…ú>ü5CìÊ2÷òi_ó.ïù¨7¹l˜¬™óˆòÉ—My"\ñ0UröñÆ<éßîélÆýécNúâ;̾êsØ¢ž|Ù”-.…•F³Y¶@xָ˓]íªíöÓ?=Ÿ¸ÞćŒAÌý“÷÷—™?”ÐþýŸý/›á/H ˆÖ|þŸ)‚¦DC"‘òASvT˜€dV9í;Fý˜°Mendstream -endobj -1382 0 obj << -/Type /Page -/Contents 1383 0 R -/Resources 1381 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R ->> endobj -1384 0 obj << -/D [1382 0 R /XYZ 85.0394 794.5015 null] ->> endobj -422 0 obj << -/D [1382 0 R /XYZ 85.0394 690.4757 null] ->> endobj -1385 0 obj << -/D [1382 0 R /XYZ 85.0394 663.4801 null] ->> endobj -426 0 obj << -/D [1382 0 R /XYZ 85.0394 582.7428 null] ->> endobj -1386 0 obj << -/D [1382 0 R /XYZ 85.0394 552.623 null] ->> endobj -430 0 obj << -/D [1382 0 R /XYZ 85.0394 310.6261 null] ->> endobj -1387 0 obj << -/D [1382 0 R /XYZ 85.0394 286.2805 null] +/Parent 1356 0 R +/Annots [ 1381 0 R 1386 0 R ] >> endobj 1381 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R >> +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.2799 540.398 410.176 552.4577] +/Subtype /Link +/A << /S /GoTo /D (zonefile_format) >> +>> endobj +1386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [84.0431 109.336 144.9365 121.3956] +/Subtype /Link +/A << /S /GoTo /D (view_statement_grammar) >> +>> endobj +1380 0 obj << +/D [1378 0 R /XYZ 85.0394 794.5015 null] +>> endobj +414 0 obj << +/D [1378 0 R /XYZ 85.0394 184.8801 null] +>> endobj +1385 0 obj << +/D [1378 0 R /XYZ 85.0394 156.8765 null] +>> endobj +1377 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F11 1384 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1391 0 obj << -/Length 3884 +/Length 2882 /Filter /FlateDecode >> stream -xÚ¥Ërã6òî¯ðQ®1x$P9M2ž¬S›IvÆÙG%9P%s‡"‘²G©Úßntƒ/ÓcOR:hF£ß ¼ð“—&‰§ÜeêâÈi.×û q¹ƒ±ï.$ÏY†IËá¬on/¾z«ÓK¹D%—·Û. kååíæ—E©è -0ˆÅ·?¾{{óÝÏï__¥ñâöæÇwWKeÄâíÍ߯©õÝû×?üðúýÕRZ#ßþíõO·×ïi(aßܼ{CGO }ýöúýõ»o¯¯~»ýþâú¶;Ëð¼Rh<Èï¿ü&.7pìï/D¤5—БtN]î/b£#k åŇ‹t£~é,ÿ¤ˆ”NÔ c9` Q"Uj\”h¥=¹Z&B,~?åÇó¡>¶ËC]—Ë¢jóã}VÒ`uÚ¯òã×Ôù Ï|¹T:rRÄ—K)#gŒòÈþ÷5~õVÉ˼"—±‹L*’îÊ”€k€­mò#qõC›µù>¯Zê¾ÉBUE[ÔA²jCŸ›l—óVzpBØI%‘ˆeìwº½Ë;zúIÒF‰Z„ŸÃ<Æ¥€I)ÜOÐ&äbC´å u×wÙ1[ËŠ¦-Ö lkú_åôŸ5M½.͆úE{Ç#ôw¼’v‘ïëÖ/P‹*ÛóR&dU9½¸ÙŽVh)Òô‰Ö–ù•\T;ØÁßVl#mœ ·EºS ¡°òukóÍ+„˜E{—#˵òÀ”cVírjÖ[^åijhZ@µ®‘N¤e”j/~¬Ê3Rjìë¦ì¼&44 ª2;5¼";Ê"ç=ÿ.óÿ›2o˜ Ï*Æ"I»‚ÌÔ4?[QÑ4”Í¥)_9²­ëj;# Bij,OˆËRê(5 -ÙŒ2&“ÏI¡C…ŽŸ“BzŸÊ)LõbUÔ¨×ëÓ‘šѹAbÚú@2¿ÏKž¿MLu…×°;3V7"¤ä 5£/ª¦Ø0ælæXZšHí˜àû"˜Ó­8²óºC¡Ä¤Ždû ôKm]dE%ùémRÇÌ3)¹Íà8س‹ºÊ ì -€=ÉËìÕÅ"²©yÉÝ©X>Ú¾A%3¶ôš{µwuÃÛ£¤hM –`K§¤Yd-4Î<©>,é‚I‰¬tcU¨½½Ò„„Ïæ5´ØUu¯³q*ü øi4á¾[‚[c§gΨê9þ¤)˜NpVÏó'qVÍñG˔Ά›ŒÎ6ÝKÆ‘²±ú³{Íð¬Î†Á qSƒ]ó)ÇìÜäÛìT¶MÔ™¯ôÆzÆfq®OÔØ GßkïPOuœx`hû±,!¶Ñ¸âÿ®¸/ªµë¯_eÞ k3ä\âûìø±›Y´ôŸ1–U½;qó¡(Kj±¹÷Úh·§#ÈÝq΢b¨@ÆÌ( )˜S¯½Rxkç!Ìê@(q -vx;«R62 ×|?Dãì-Ê$ ³Šfxm©ƒiéÄSD&‚–ž˜n@©_bº•ˆâ¸ïñ¾“¸,>mçÏÀÁv N íÜ&oÑW.öé%€îrÏußñz¯S»(ë5Fbë¸êØ QÝ4 ú†ùû¬i“d¸g˜B×Ü`ÛmˆßÔÇ!AEÌH]$‰£k/ª5 )‰§G$‹?¼ÝÄV !B³õ´ ƒ©~Ç@zl$ìÐJKG†àevŸ#H ^²×Ò&$rqš²¹B4-ï9g•4„¿iÓ9Ÿ“/0&.îœï<=8™0°©Rnì‡z& ¯$¶«TQR3//žŒÊïÊCÝ4ŪÌ#ºÈvÓþ`ˆgö`J§ô‹øå2Ðg%‡솻õ(:PãÀÔÓs¼ŸRó!!l­«%çöKúú9AÂKT’ÎjSXÝRt:!+Íš§·óÁUj"#{¡Š‚»2:ès}à°U¿ Q@.Ørœÿ»²^¡6x˜_ÚPgjû‘Ñ0È{Ξ4X27IŸ26ªÙÈ‚Îú—'ƒÊØêà厤.OÛD®—‰.ܶŠ,›%eeo–py!ƒYBØH•ëÍÎ󧲔Jà\Vje]«†êM«fµ®5ÎŒ¹F6H¥ÉXŽÍbKÚ¶çA’f ÂÆ‚m&ç`ša^oQQ3mš™°´ú•í«!`,H+ŒÖÛž†Ë«Îi=m61¤°l¾!愘Èé'¡F -ŽuE/Ãëd:A†ÑÁ3ˆ¢#/¥/—Ö›¿ÅJ‹Ž'fÔ€¬ Œ òɘã#Þð0qçX§ Ñ1‹À²S[ï!é¤Ô3^lÉÔAk•ù ö} ("jÞÞqòºå€Ø§Ã^ýûd`QêëÐî¿]T¹g@h ǪS ¼yAÙ/zûb}GÍÁáíð„®;¡ã Æë(¤ÇÖ&l_·_C+憺ëÕv•áê¹P,Ö±8g>ë(—ݬ/š»úT"•„fåCvn¨ýP?¢æ$ LJ;œŽJ{G -’¸§Ì¹UQ¬µy±9S‚DäÚ¬¡4q§DÏk\êÜÈNò¹ -þ÷7íïþ@ÖGÝþ”ìÑ»y=@– :“Ž£H2šjÃíA£³Êäò:™‡VN†ÌjŽ·pÖªöU%€±Ñòm’hxëK3á$Åž7«y´“<èäåb[3–üS¶ÇÐ1ÐX0Ed€­îHäkœªJ/僲:ívçI}o}Ìš»b+µ®Ç+»8ZÀŒ‡Z||h1s&kb”ž©ËØX[œoªæ‰ÂBÜÉcÔûúRï:1‰í#zi9hˆèÖ%zÐæ8sßòÓCËËjúçMÒÅõ›wxÅÙËûý©£ç/ùr*£ÇBÆUGLÝ‚CyA#ÆÕƧsºÙôK&i$”Œ¿ ̘*Oî‹2°¤«Šá%-O›Ã²)þ˜« -I.±nâ1!@¯÷d¹8‰ æ-´~~óy´Äi»%é±l¬j *|u&¸/ˆïÈr‘Ò5ÞÒŸÜZ°nÉXUF)’tã;1ø畃ð¤,64–¾šF*‚’¹P AVç–ÄÔ-~F QÔ§–ê|8ØÞ æ20YVM ±(!TC7ç‰Øü÷ög˜e46’o–ê¢¿í²¾=•c”«)ÀÓ¢¹£A¬XôÑ<#ðl0c˜ʣð {´óÇš1q$$qWÎ$͘ºŽœa„¼‘Ž¿"Ø66oVËüÕÔ–õaÇÈ ±ÍÃê, ?PtƒCísª]„GXCCŒÁEíÐ+IŠv#D¾ -ÿeÆ4MgÍÛgŸ>«¦`®t—tB!uPS©ƒEçö©ØŸöØQ=Ô¬³8ž7þˆÖ“C+¨¥Ô±Åì¥ò•O7Ñ*´Š´4Ž´5íTM)Eª¦¿ü€T !¬jªuª†ƒ$/.äÐVñS@zUCèXÕ–ZHV.>$Š_ià?(Ž³¸ô‘$“ž~¬ê‡©È|¹dþyqceés9èÑÓÌSrÖµ¯Qè>¬ñ&r‹‡šÀ\¼²zX¼ÂÀ \v½9_¦Áù!Ø« hÆ¥¢aÞï>ÌV¢ŠLªL_Š‰¥¯ €Eb;²Ø ¥:.Ë‚™Õ‘L¥œóM}òµ<ãٚÁ&ºSwÅÿV&ÒÂt -\ù`sn=?ÖÅèg5´µÏa»==VtÄ|žÄÉâaÅŠ¸éqƒæŽ°”_åÌXªŸ? -Äë}Ù'TÝ“ô$‰Øñ—(#ZïòK¬ËãdZ¤Â+@P‘*zêc.™AÿTm€Ž¶®7 ?œ¿Gˆcü=ÄFŸFa3L?díú.”˜ø#ÙÀ蛲{,/b´Žÿ„[—Eä>qñâ?h -½¿…ÿÒˆ ÿb»=S‡Q_sö:CmïNÓ¯BÃ{:ldŒ$è&âàê³}ª8v×Ä*ÜE§©Àû%à…D.=íVÀ¼-DSo}qu&ùÅš˜ø²ÍR Û½2úB8ªW`ð<~]×*~â Öa´þvlD$øXTŠ'öK5hvÜíì›Ki×ñðˆŠ[x×Äqé$|b°Ê'IØ„ˆ‰õî xéˆÁnje‡:™v娔.@Êbï“ï4„Aiø€…æQ-ÓÉj}:öa!ŠjUŸ¼6A'Ô帮8òEÃMFüÇeã<ŠÞU)1㣌„sþ)L—ê¾x†=žØi5wàp'Ÿy ÃÄÀ³áìœÙ:˜äÎY‡G¿yÁRõõ’ŽæåÅyVÊÒ8R±çhQx}•‘pþõõÙ8l- -üú˜ŸŸÈÞHÔ4{!ûØ€(‚Ì}„`u÷´Â&Ó¯À”€{u  RËT½ä;09kíüW`ËãrˆÒâ59?˜p›$ýÎ^Y6sI¸ŠlMღ Û›Žø©z¸«Í„S& ´MÌš@~bòû0ãùÍZä+pk|GðY@Œ9è+~ŠÐžùÅÀNMQ0¾¾ýpóÝ«é­@š_¦¹È&HCÇÝ%5Þ>ª ³—ƒéÄïá)§8‘€y Ú¦àQÍ”©“(M3$äÑ7}ݤÏïÿs@Òî¡ô,Ú¬äOð9«æ -mÓqµÁ&cË•B6ÿ/F”zÞ­à÷Ío\´´j?¿ ¾=· >¸P–WšN‹!¸§q“= VvUÖžºr‡éJh†E þwy•é«;ìžbƒ é<,B &„# -€>ÏÁž´|ãp€œ1LjñD#”®H—‰N¯ç«ñ“—/t»¢ÊÚÎÎŽ“žçêu#óMÏ%¦7/8Ê[ðUWØUaluûdÈ,\Ìf\¯KˆüN;âbÁDbcwÌö{Hê|}nsr„Ø$ÏXm ùè¹±B’Y?4ÔöæûSÙ‡’§ NLµ4~éUÂ}îÓF™L¥ú+eþb»àj€Lâ(}ô…Õ  (™‹œ{rø3÷­°6ø¸1gD÷í_þŽ¸ÿÈ:†xÎZ5oOTjñY¢ü÷ºöåáƒãǤÿC_ý¢endstream +xÚ½]sã¶ñÝ¿B“—Ê3B| Ó'ßÙN•i|W[ídšä–è3çdR©sÜ_ß],@‚2Dú&ŽÇ`±Ø/‹Ý¥ø,‚?>‹–d"›éL±8âñlýtÍ>ÁÜgÜâ,ÒÂÇz·:ûîZêYƲD$³ÕƒG+eQšòÙjóËåæ8àà°ßÕMA+ÌÙ`sX?ÄÞB—¶E“àd¹)ª¼AŸK· +è *‘S‚â<‹ Ç'ºý‡ Ohóêe7- È.È.J‰-b¬ÛC¾Ý¾8üæd3þ†/õaO½Îq,D6åààl‰TÄGgœè ‡ûkèÉ‘LÇ©sïg3{'3É"éáîýOü]"4SÑ”¿ó±Nû» ¥³g$\”›WaGÂ2Îõ8w‡à>tyœ¥™r§S™êùò’ÚÖ:_‡}çëÒ#_—â¹+*f]”_ÈÌÊ©¹¡]…ÞGuiÎï¯Q$/ÐÍÝòÒ^"€ç䜣뙞×{GÙ츈˜ÈŽŸ;ënyÆÍ>óÌî3N¸[ôŸ1wtyÉî®nÿ1óëóÇ°‰É0äA§Bj3­¿&ä1äNF7OøÛ\lÒ»X$¹"D½Bhçp†ÌÅ­Bˆó@díD1¡²dèXŒãŽ¹jh{¿„#ë—°kœ5´95ž'Ì:O„ƒÎ¶í=áwž‡ä‰°×{"•Lx¢hx€†wÜŠ>펃CËÝ‘YsìxFA¡vÁ¤ö¤Ô±—Rp8LÝÃÒyРw$"ëŽívKKÖù¡9#H1Z©‡âHÇ2®Ü6'!Ss$NÙi«ü×ÀyCPû¾"ßWÙ2ü¾šEýûªUäbwÕÅî÷F ÈÐ24àk$¶2s—¨ ÝFÈL8‹yï€èFœˆÎ…סÒîV†èÁŸ2ù­þ¹ÌŸCĦÏ1¾…ÜýPnÛEYÑËuõ´k_¨ûoàÛÃñ&Ì¥M¼1›¸±œ?š-ˆÕ¼©Í¦è¾£Ž£‚¨#Ê uŸûpAð¼²ÄnAmÚePWÛÜ<Ø®D˜íj,Ãœðið€þˆ[û˜·VJzˆÑ=˜õþÉF'vÜÔ’o0ä7ÙÖk‡“äuÁS–x!WæùЯêvH¼7G=‘e6ÄDÀ²j‹}U´±tÈ8Ö©¡c‚h n \Gkðu\—˜j +)½¸LªNf€¯kzT¥¹i&œ„.^™f—¯ »€ìÐöÍßü|ù᧋å h¶ÙÕUC $©%•O³÷V2R &!ìò}[®¡}9ls“ðâóŠŽ”Ž;¡µ³tHÔÑ:p˜Ðé@x¾ÙXIZ=‘Ÿht{ýž–Às–Ú5f·û¹x.%d,” +À.¼X´mSÓÒ²Zo›"¤I,Å‘Ä’$†y’àË_™#H@O šÃ‹ÕQÄ€·ãSUlðê  eÒQâómY}£Y4vI{ÎçNb_z·½û|ý™<ÊP@#ú‘³¥½Cõ¹ªŸ«W+YÇ#…hMqß !ík„½¼mÑáÐÀ?h7\¦'“Ôá°ÄÐ]([ +ß]὆%µµešÍ Š?ʳJì›MAZv EùÅ.Ä- ³é܆ gÉc +»úLnk³@Ç:"N—vl +ˆëö9>[6ÆõMjí=ò5ÐY[%Zk윚¢÷ùVcè¹Ü¥Y7EÐø+·yëÞ8TvɶlÚaŠtÄËžƒ²ùþTEX¦œ ®ÔxÜÇ2É +¼z^XÅY"JýkOàS ô8¤ƒ£LÒk¦Ã" +¼åY™Fly³¸¸¼¼e·Ï31¿8©w"¨ü1®·‡5¢·ÃšÔ{Œi¯÷1Ó°Þ>S™Æ›5‡P h‰ Í=¬ÍÖ¤æcL{Í™†5÷™Š¿${»ö"aRB7®½‡5¢½ÃšÔ~Œi¯ý1Ó°ö>SÁðëŒx»öQÊ"™N(ß#èn‘&UáØk~Ä1¬¸ÇQ@bïÿ¿U‘fL«)øX§-ÐaM™`”igƒWLƒF0ØŸû[~L¦-ê*•é ‹yX#sX“cÚ[ì˜iØb>Sþÿ°X,ãdÂbÖˆÅÖ¤ÅƘö;f¶˜Ïô’]£¶oÓÜ|çúšîchî°&5cÚk~Ì4¬¹Ï4eW_£;äüq¢'â(kDw‡5©ûÓ^÷c¦aÝ}¦ÙWéÎ3ós"–ò±NëÞaMé>Ê´ÓýÓ î¦_§»r:›ˆ'|¬ÝÖ¤îcL{Ý™†u÷™¾;©;#Ų?Öú¹‰«gñ¸Ë7¸ê‹DoŠ¶Å:+L¶ÃmÉ_Êâ™z[ÈÌ·–€É²fò5Z¸ÛQWQ®i—6令o@ËFKªón£Hw‡j;$‚Œ!g{,öek(AžîÕ0`²Þa¢ØДI{¥©•t¦po˜«jnzñêă '@¬4›/–·1£tÅ™83JkFSó‰ç+Ü?˳ä}9V!Á<²Ó"˜^z²º ó[ê¿Ô—ÆVÜ£„W\äÃ. î­B(*dÙP…Ý?ò§Ý¶ø>ðy®“–£Jüþ!ýZÿ˜wAl“(šþ Õß!˪’ª™¿08œó¹ýd™%}qqX“Áêb^}rËaåî¸à§ûH÷œüÒæ°V’ÅóÇüKáU.»úVÖ!Çk _è³ó°R‡U\#vXžX$BšJ"Bv{,Ŭ Ù_Î`y·+ò½˜Ï К* vî ¾ûÄ,|P>Ðaï)¯l!»+ñÒZú6c06…Ï!v:óüWð©€{þôoâzw¯4“iz"´D¬Pæ£AòúS6œ<Èñ¢ÿ7Ú‘endstream endobj 1390 0 obj << /Type /Page /Contents 1391 0 R /Resources 1389 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R -/Annots [ 1393 0 R ] ->> endobj -1393 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [87.6538 116.0624 137.7628 128.122] -/Subtype /Link -/A << /S /GoTo /D (tsig) >> +/Parent 1356 0 R >> endobj 1392 0 obj << /D [1390 0 R /XYZ 56.6929 794.5015 null] >> endobj -434 0 obj << -/D [1390 0 R /XYZ 56.6929 718.7806 null] +418 0 obj << +/D [1390 0 R /XYZ 56.6929 551.4149 null] >> endobj -1274 0 obj << -/D [1390 0 R /XYZ 56.6929 687.5668 null] +1393 0 obj << +/D [1390 0 R /XYZ 56.6929 523.4719 null] >> endobj 1389 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1396 0 obj << -/Length 2509 +/Length 3167 /Filter /FlateDecode >> stream -xÚÅY_s㸠ϧð[™µJ‘")Í>ew“m®wÙk’{èäv2²ÍØšµ%Ÿ$ÇM;÷Ý ¤þØò:¹›NÇ")@à@G ~á(–I4ÒIHÊÑl}ÆF x÷ù,t4O4éR}¸?ûë•Ð£$HW£û§¯8`qŽîçã»øùþòö|Â%«à|"¸¾ùD+ =>~¹¹ºþüË폎Æ÷×_nhùöòêòöòæãåù$Œeû¹ãpdÃÕõ—4ú|{ñÓO·ç_ï8»¼otéê2Šüvöð•æ ög,I,G;˜° L>ZŸER2¯¬ÎîÎþÑ0ì¼µ[‡ì'EȘër1d@™JÀ+4àýÒ @vHÃ$9çÀiê2Í«'Sž‡ñxRÛræ÷tÙk‘'±Û“æóa¾" Õq¾“g5À:k*íYÏVé¶2\D$ÇÕÆ̲§œ¨q ÊØÕ럟#ZB9ü’r[à$,ÿ»È Žd«š]ßeõÒ­/ -щë¢v*S>9¸Û;X€wN$P¯ÎžÍêå< Ã1¸g¤ÅøŠ” q#}q¥Ï7:ä[äÀëðfx‡’±zÓ•Oš]={ÌP,Îái/éWƸ™(ßeël•–N-‹ìˆô´_û;ƒ•®Z–cW-Ü{D-.#‹Ë7{œíñ -}®Ht=^$*ù‹€ÐL8Ä­³ÖÜÔi¶ªÞ”TÆЀ¼sSÍÊlSgEN ÅÓP, @ ™·©–ÑÉ •Zü å¡ð¬³|#Ƥk.­TŒ(E/Ëň·Xkè'Ý ‡°vÈϿøñöC`U DR -ØÞé_ªS‚pCAç 181bH”úú†þò¢€;~¥ŠÃašŸÆ]q¾L­Å$;âJ¸ê(âÊW"®!&ôjÄ,’}¨!U€Pq ìÒ…f•ÉkEÄVzb)Clêä(Þ -xGÑ ¬,ÀV§íQ¦˜`ï1¼Õ2à Æk/Y¨{‹GÖ&À‹ˆØ¼LŒì¡TÈPÈuaºhq÷£žrªºÊ!0A]þ¦ù6“¡î.ðT…â ♉¿&ž8€žb™~Ûšòûá”0¦¾NÀPFI2Àð¨vZ4¹µ‰&¡YMB%®:ÐÌçsÍ(šðÝŠÝÒ‰&KÒ&˦ SGЩ_b+¹ª_„²šdV2¡]á²å'úIçm y¼`‘Ên±‹P^A8f˜©/Xäñ‚.*Œ”<}«Rõ:6uy:âQ Yœôéÿ@ñWË×{˜„{UákãÇ׸r ¬)…´ðJtäƒy“‡Ð1åI¹­j3Ÿ|3/q½«ÓÚ¬ g±'*Óõ:-‰ÔU‡ -¡½‰”+)ºœðþ½H› 4=ç¬ê2ËD–o×S¬©¿7îÒ¿·lYŸáÃ!ÝÛùÚÇC_¿’íÉNôûû!cƒ<¬8̲Fæ¯5ò'ƒ×˜gmqCù¿`öðÆú'jŽ¨m±zbr„’cUËÜ µÆX½Z m†é§›»»Ë4®Ìl[fõ ÍlpE]aWÃÂeVyfX -Om5€Ë‡U%Â@ÅÐ)GPã$úTUéé'Ý CÅÜ>ß~U ÂDA¼/d`™(é sد;¢ð¢jëâñ…·ç¤Å/Î’ý>Ìú#olšYóÂÓßšW°ñnirzAu 6Ûé*›Ñ¼¡Û¨Á ¥G^ä“t[/ 8/Eô§ej‡‘±?ï[^ìrÛ±Éñt넴ʽ`S·ÕzŠOÂÇ6ˆ)²Š)´PVn(@ZRo»XÒ¸Ò;h½m"ÚÏ0óÒ$ÃäJ+ñ0Í^´&ÙëíaT ³s|6)Éìó'mó*[ä¾’ÙC§/¹Më×øpFÇù2­hejð–piVäx gª¹ÛèèRšÖåy<¶áLsdè²—ÐÎ’®wÕÄ+­ûì€à‰ü†e:÷òœ‡c)?§«lÞÙœ;¢ YóÙäCZ·×íí½ï…]UQ¬0oÞÕ€6›ÚÁc0vg·m³GÈÕª!vvZ§4ÊMµÎ‹5øTÕ´Ü´×'î&˜d‹\í Ú”²Û…= *‡á0ú•IF0 “YQúR©Èç6§à2úI„!MWÝŽ õ[ºýFq -±c N|}í\”¸Ï €·;ɶJð4ÿ‚ãiH¤ Ú2_QËëÖ@ðÜ-SGÙñ|J‰\2Ñ{ùÜêIÝ^•¶]K:Å•}K ƒßç¬Aaà -£Æ:0¶ŽŽÆãW'Žc_ÎÛ’Ì5·Eeönmߧª¦ƒõþßk-¨üýòŸ¾TPP+¨¤o—ÛÛÊÔûÞßšô/Þß[rî2ïߣºåtÒ£E“2y½ÕB¥Š‘¸ -TÄQˆÔ´ºÞ®êl³24sé$Aõ°íÀ¼’¤³e³·‚‹v!’8—K|r²¬]€–‚—–ótmÞ‘­ñ£æ{ý`¦H¶o‰¤G¦º˜+·”®˜Ê–k;ŠqŸ$`ð!…Ü«"šÐm\Tƒ6ƒðÊÜÛIxΥŠl@ø»M:3^ž:úanv«Ì†‹àÊ÷¢û©p––e†•_/ëmé¬õWD»E^4¹¢ Í·Gº‘þ e±GÔæÚ®Ó—ý¦c•9ÜnüqµãÕq˜Y-ƒ#ÅòAG"\±üœ™ÝŸëDˆƒr¼Ñq¬‰… b%÷Üæ÷ªúÚíXöÒØ:­gËÉl•$MgcØ£t>ZŠÇ•EW\ÿýýЕ¨}Á÷­…ÿ³®P%&° -J³ áÒ¿˜ê±(óât·dÍSØOÒ®ùÁÞgHv·aþ±…ý=“A¿¾]ŠNyÀÿ°Mâ<ñ}¶=þã -Ê2Jªñ™ÒcSìLù´µ®ÇOPwA1µmcÖ%Z ôÿj*úW!%uý§ÿnÿ1t â˜7‚© æPô9¡lô$-«ÿ÷øPôÿLÎ8Èendstream +xÚ¥ZKsÛ8¾ûWè¶TUÄ€$Ž™‰3ã©]g×ñÖfæ@SÍZ‰TDÊŽç×o7ºÁ‡LÙÙM¥*Ä£4úù5d¹ðO.r eõ"³:6BšE¹»‹{˜ûùB2Í*­ÆT?Þ^üðQe Û4I·›Ñ^y,ò\.n׿G?ýòþŸ·—7ËUbD”ÆË•IEôãÕõ±ôùéÓõÇ«Ÿÿ}ó~™éèöêÓ5 ß\~¼¼¹¼þér¹’¹‘°>áÎ,øxõ÷Kjý|óþÿx³üóö׋ËÛþ.ãûJ¡ð"_.~ÿS,Öpí_/D¬lnOб´6Yì.´Q±ÑJ…‘íÅç‹õŽfýÒ9ù•Ç&O²&jN€ÆÆ©‚)`UoEÛ–yt,»ãa)óÈÁ3µîðè-u6Íu±sºªSãà\ÏßØœµÍ Þ¦j1v¥ïóNŒƦv±òÂ÷ÅŽ•Žm.Õ„kGó™ZÄ€³¯Rab•fÙäL¢é©PC^+ +†§’B Ôéb¼ï‹Ó{ª™ãÇyNjgÖØéùŸ÷®¬6`PJÙèɧl1C¾©ç½a«Øï]Áó¨rüz•cƒÂ<ØP¹G>z?ž*ÿåIŸC±Á¦Í¿Ð¬u€]m¼i¯”sˆnS ¯Éc1×´œXðF˜-Ýú]ŸŽê“Ä„ûÿÐý°ÅN­"­[¿LQ¬o“"#IþºQŒ©ÎEO5EÙÔ¢Vaã$yëøžjæü‰U'â”Þ*0‘U`À ùa ³Ø`,˜¶CÀ⨨O̧¼Y SƒYà$A+˜ì#žîÍBKÝ›˜’*ý=fñG’èÿûÿÌ@ÐT™}à FT¯˜A ÌÀßy…Q{ë^ØdbHÄúuzª&&¶Ë8ÏM6åâ’Nörð*AäˆÉ8 AZAQì_ìB¾øñ9ÀÍMqÜvƒôy¼ÃBºçyaëA4^ö˜ê¼°{*¼&_i5ý¥° ä)‘¾ÎCO5ÃÄTØTÚ)zÁ*¬ ÖÕcµ>z0ý _höòšä c#ù*<Æù"°ökU*‰š}5JÕÔÔ-‹šÜpZeÀ.”HS79©o Tû`]µs„ðO4°³"!A‘¦2CQ M™Æ2‡ÂS½_¯«8*ؾ>»²#±x-ʇª¾Aê°9` @ª@3¨J¨m§´†ÇÛád Û¹wêY¶ ‘”`Ûpµ—9T²I®·~ù / ä¬ ‰Èx¹g¨¦Sªºsf‹9¡‰®¡¡j·§úꑯÒ +Rm»oê–§‰m(Ž®Hq RB’Ÿh*ÏÒhn6\û÷±h6~£ s(;0^¹ć+JÖ†ŸAÊ–šìÎ tG'Ð'dnƒï9ˆÅ÷кUyìæp¼G¢Iƹc]C1 “˜ÆöC‡Ò 4p@ÄEÝ>9½¹‰©qÝt.Rt3&Þƒƒ˜·LB‘k™3™w?d˜y]8Ä +S;‡¥yÕî‰ |±éX¯^™fòØ÷¨×ÓŒXûÒdDÛ¢;} +èáÒ‡ëÏü8Ð3Ô—ðüp¬½„‡2j\¨™;2¤•‘çMG–× Ö~8ì¹óópé{Gm²ûÌžÚ=ìêõŠý?„îkéöÝÉÒ››Öu|w Øpù‹‚‘Ä;±+ÕÇsÑÊ ß¹móH?‘EwÇŽ&8¬ž¸4άթKã¹tðXXÜ¢‡Ý×ô&TÔÝöy)¥ô5©0ÑŸE‘Ý`‘ÛUåq[€nÆy ¸ƒ7x“G ŸcôÆvc–KÓ²kì…bµæþ±­º"ìc éÏ\½r­­ÃKŒ=¼7?ŒÁÐÚmÝ}B橧ª{ )O4£¤ûí‘ít=kWÞöô êúx‹Ãw]Q1 Û ²ôµÚwÔ™¨FúÜ‘ Âàð*†½IþÉ Ù(’ÁG“Ñg»nÈoršßæMrµ94»Õ¹¸#…ŽS­B.¢§ÁÓ´–Ä©´!6ÕÍÜ6&6&‡/eMàwpùµ÷°C[‘|l#P–Ç{!Yï [/³‚cP7›¹«!à¥6{3À*¨‡EHÍQ¬ñ…*Ȉ©HÌÔ †CP—iqBÚ1©joÃÀ™wÐIü ¯¯EWÌç'n)˜ácÕ[ê p[?‚³÷azNHR‰ØêD}CJ”HÆY¶dO„VÅ_ÒÕ—cÅa‰FwGŸ+±Õ èSôŸi†üÝoÊ rô'Þ}ÜïTÙV»êÄÉ{»5'z÷>ªÞbä½wÏáe`^ª‰‘PB«4(­øºbɶÕ_srÍ¥&ë%Bw:ɤV‡S#BÙ~@h0ÃT!³*ʾÐßU5ù§åš¢zDb1ÑØ0y”Áçöøe +‘LàŽÁÉoK!¿{XÍ9Isìf 4Î2•[©•÷¥ÖËŸË4ä¿ò¹ÜVåÜ>ylàL6FÂR €ï fÂ!zÆiBc’ðÅöâ$ïôä¶Ûé­Ç‡v®Cü¤QØ`”õÜïÉu>ÞXyR {Ü„¢OTôKóäñ%Az’ÛƆdƆ3ˆ4¿úèo‚aɉ5˜8z+m7ìé¸:4Œ&˜ ¯~ãCÉÕlÑ8·cŽFF¥N@‰UQK•ö…[ŠP«)„Â÷?¾jÀ–·nÜÿX–Îù8,§–¦±{zqYo]Ûò¡› ?ºÇaöM”w8À’UsXÓÏ'6«s¨){P†ïæ`ôð!Ó‰ƒ+™Q#SþÝ GÂm8zÇ«(B±(¥¢‡‰ùàH€w’ÊW\ĚĦÐ2 æ<µ6ìî€TÏ{¶ãp—Éõ1¯n½Éûuhù÷èªn©WЧÝäQYTwwä@|i=“cÈ^•³ð¥ºÃï]´Ž)Ñ”¿å`PèÖ…S¸úoþôPr˜±d<ë1žºVÀ0“Â=`zy+fáämØrÓl¡*í÷ ÏãÚãnW„òb³…×™g‚™ÄáZH•ýoáúì{o–ÅI–¾ñÜ;":ÿÚˆfAÎô–> endobj -1398 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [399.2874 719.9611 467.9594 732.0207] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> ->> endobj -1401 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [461.1985 450.514 510.2452 462.5737] -/Subtype /Link -/A << /S /GoTo /D (DNSSEC) >> +/Parent 1398 0 R >> endobj 1397 0 obj << /D [1395 0 R /XYZ 85.0394 794.5015 null] >> endobj -438 0 obj << -/D [1395 0 R /XYZ 85.0394 615.421 null] +422 0 obj << +/D [1395 0 R /XYZ 85.0394 453.4423 null] >> endobj -1399 0 obj << -/D [1395 0 R /XYZ 85.0394 585.8633 null] ->> endobj -442 0 obj << -/D [1395 0 R /XYZ 85.0394 502.9736 null] ->> endobj -1400 0 obj << -/D [1395 0 R /XYZ 85.0394 470.6064 null] ->> endobj -446 0 obj << -/D [1395 0 R /XYZ 85.0394 298.1533 null] ->> endobj -1371 0 obj << -/D [1395 0 R /XYZ 85.0394 271.5604 null] ->> endobj -450 0 obj << -/D [1395 0 R /XYZ 85.0394 137.8852 null] ->> endobj -1402 0 obj << -/D [1395 0 R /XYZ 85.0394 105.518 null] +995 0 obj << +/D [1395 0 R /XYZ 85.0394 426.3513 null] >> endobj 1394 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F21 710 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1405 0 obj << -/Length 2683 +1401 0 obj << +/Length 2863 /Filter /FlateDecode >> stream -xÚ­ZYsÛÈ~ׯ`ù%P• Ï…+~’½²W[±ÖÑ*IUv÷‡Ê$À%@ÉJjÿ{º§{pP EÇ*— =zúøúˆr&àŸœEqg*›%™ #!£Y±>³O°öþDòž¹ß4îzs}òêNfY˜Å*ž]/¼ÒP¤©œ]/~ âP…§ÀAo¾|wñþWg§‰ ®/~¾<«Hï.þvNÔû«³ήNç2dðödz×çW´37—?ÐLFL¯Îß__¾=?ýýú§“óëN—¡¾RhTä“_³¨ýÓ‰u–F³{ˆPf™š­OL¤ÃÈhígV'¿œü½c8Xu¯NÚOŠPéXMPé)FYkXBžçÅ-j{å`¯2p^„G঻ÒÞó¦!C…ÊÈ”75mÞÚµ­ÚÓ¹–*XØß„P•mp(ƒœf'GÕKZho-Müpù ÍTùÚ6›¼àùö6g–÷åjE[nx­±¶"êæatN³»il;>©X• ]¾6Yœ¡B3 Á1€OÊ0‹"åT¡àë4 Öy[Ü¢8Èñ‘‚§2@EpP.i­lySSﶧ2 P_|ä— 7o›†Þ±F;8›‘¢$”J¶1²À×÷`§Áµ°SΓ„qÄÀSa–¦é4ìæÇù¥ÃÔH> XR&îF)^dL³0Ñ2~F=ǧdÌT˜(aÆB®Ê¦ÂtÂŽˆí]/{ç8ñû—f"`ÀI,|,8 ÌaJ…Q”¥Sk&$Ð::ö«|×8´§A^-ˆpPCba›¶¬ò¶¬+š@¬¹­C¬áD‡5ÀšFÝɱ…BÅÉ,јUfÏ€5æ8²œÂ$~ÅýÉ_[Š‰P=£žãSBf24ÙXÄCPKB‘dr5ïG„Z,Â8ÕñP#¤@2…7@®ÌR3ÂÖÃ( .P&­ƒªn‰h6¶(1¯ÛÅK˜‰LpS·SõCj B¦r$äaÌÇP.ã,ñÈœO”$pL9>¡Z†¯€Ûa™ïV¬I[ÓÓñ)«Od@ˆ»Ð(­Æ±šcÙQ`ATY¬#ZÇÁEÕ­•‡8Böø„˜+>#{7r•`ŸÏ”ªP~“ú‡#­§C£…úªõdEßb½_Q]"ʽ¢«†•kóÏv⨹ÎÙ^#+~¶S§€ªqd<üîoKˆfðƒ 6ÎDõ]¹À€ˆu€àÂÚ·yU6k.ë-­SäÀŒ/ßH;?ÃbcW¶ðs~£ëF2€+cè Ïh+÷(ÈÈI:#uà"·L9rîµ$Yk‹Ý¶)ïì¼®VSè…œúŠᦒØÛG%ÌW ‘Ô"©DŽ•›#€ñé?vàv~qI6^3G Ž•Ç›[¢Ö«Û48ÖÅ ‹:ò÷À¸ZDÁµ+¡: -jwæÂny¸¤gW“F„^?…Õ'úPš$ÙoCâ[ò³)?UÎaàÔ–¦~S*Aʸ¾&º¾è±h‚MÔniêÕ‚ÀVõÊ8ÆE]µöKÛ©ê¬ ]¨…Ø‹zn(䶫£âfÖ]æ?lX%Þd `[ò“;db’ÆR:¤ŠX‘(ÿ®]ß=S×Æ£‚BƒÚ[§¤@£M¤¡ÀZ>)¢Œcóøâ€lÙÎpƒYPÔ¹#‹rfy³²´Ã¥YaXÆ«,t‡UaÀK™Ú6“Ð×±žFPÔ!Ýb®‚œD¦Ü”žïUæâ€'\pˆï-ùéÁ«¤._\Ž·ÁÂnmÌ÷²nùt_äb¾¸Ãª¹ý®z½s JÍH>œd!ïpŽEHr*oÊÞ?”ØŽ¸¸ô¹›t@.9E½Þ”+»˜{öðåÚÉìíÌá§?ÛYúóÞü°¦¸kð±8"3“Mõ‹À—Dõ &ÀjèÚO4B’‹œ"«©¡Vþ 'qÈy®ÿЇ/Qe’}·‰§úÅ][Ã>2Óon{i¹ S€èî2#±e&½pêâ2$â¬z˜lÕLÀËå  cÁÝ2KÓ c!çQÖÁã늜õQoheeïìŠæ°$6ÉÎÄ»-ÊÂU²4ÑçywS. ßR'aíÝÛ]w˜ -*±ðÜäÛ–(ú®‡(v†O‡ÈLú -õ’¾ÓR±Le ™(È@ÙQµCdÙÄ÷räÍm/P¾äâuð@ÌS‡µT -dQ1ûÚ¦¢l'ï¦.øY–|O à@Df—Øßm—¢&ì5®ú üJ8˜“¦¦` >&¿J‰ÐD™ü– T¢¯Pp ^Þ†…âG;´@éÍÂi[ct9êkÛ‡ FûM.óE.(‹å6z×ð½cÿ^÷fè­þ?=ÿ:ñm´Ö¡HÍžÚ”ìb@Þ ßì¿ ñ±t·Ë(#ìÕ+Úrí‚©æ¶Þ­Dó Iü;Š#sñýk½½|õï.ÏÂ1ÿæo¯þ~õú’–²Hãë‹wßÄÓ碗¯ß¼¾|ýî›×ç×Wß½¾êtê+¸BE~?{Íg+Pû»3Δwfö&œ ïålw¦bF+• Û³ŸÎþѬ†­SöÓÆ1#u6[(Í🶲`V@²Æ³LIÕYYŠ)+',´r¾Ì—·Åb¹-òª¬6‹²j‹Ã]¾=U_d–)cålÈã$Ö„(j Š°’)Jd¹º-ट7 Bq ñ‡r»¥Ñá\¸y±«ïV›oq¨ø<(AТjeÑ| j~“7ÅŠꊾyü~ù3màäÛM}(ÛÛݨÿlá9³Êÿ +Á¼12ˆY€l÷¸~b_™1ǵKd˜Ý•Å‡H'*(†,óý~[’]à>?ämÔARȼÛØ[Uâ!Lhƒf¦àBÎç^΃ì<æ€÷9& qÈ%ZŒr‰`J +s‰È~˜J8–y%]Äa].ë„Yƒ`ãÕc˜pÖt—²°pÑrÎ6äóŸZÐ}WTQ¶·‡|·Ë‚ÎR3o£k&Ð+÷¿æ«Õáý—ûC±.?n‹êšþ¬%óxóŽlöž0nêͱ¡á}ÑüZ~Ňӯès=eð¸y¨ïÊU±(?®/ !†4ÅïÇ¢i_Jc$G±ªšÏÙ»8®ö”¨:în’iŸ¡&Ö—‰ÐòªY‡æ³v/ î0ìø 7œFuU,áC¢øŸ$tuáM·EŒ™~Jéߊû&ùXø4P=À 8$ðþñÆØuôÑ?_®iSË¢×´ÜëIC$!¬‡x¶x 3«Eá_Ã’(‚°À{ÝßïëCÛEN®'äÃz™)Øô9wÙPÔ졨Þ2™…E‘ô©¨Ùl±¨’+&•õ“ÇI¿\ß?Ï X¢Z©3höyµ + +àIsŽd|Ú˜ýÉü?Äô‚I'í¤ Èc[Æ”.êÓÐŒi{(½”® žM¸Bb8é ×#~½.#f=8šJY¦Ö/f6¶‰r’™ÌèIÚ¤;»—›Jj¸Á¦|/ñœ<ÕÏ1‹y1³±Y4çL{7" v]Ó óž®·'÷×3ÒáxÿG£äW× ‰®ÕzŒÊb²”øó«©B8jË„†`é + ÷tômñ ç²*Û2ôÉ« ~nòM1Q•TFW·ÅD“)ËO­bà!-hp2ëSØ dãªÈ [¨\aº¼…Âu &+›¶\F`(_á{SÐ7ošzY™ÍcÍÌ© †OêÎÛ°êð|·F!C«í©¢ö´ß¹§­(ÓGÚ ¸˜Wà@.è §ú“dê}Ô÷ŲĽÅ*ôü¡A“+ +Üc›‚†¡ûQI¦†Ð©er¢,¡iàzþcÊy•Êxìê¦=á¼$27 ©mú:÷m‚JfÚäá»Ú†¼›§;‚6þÔ4­’³AËö°²†ÖÏÛÌÇ3Gû¯Ø²®Öîa ÿµÆd¬˜5Ð,°?0Æ~Ê =>Zé§ÜPáÛ–nhÕ|ZBÐSBæq—ië=A¶ô‡=BJu…ç°9BFñ@„l#BÉ—U…>QÎ'ÔRz£RgÚ°‰àÒÌ÷@+ô_¡—ŒgŽ[=>æÇùX‡Ö3unó² +ݧÃò˜ÀAStmöÄÙiΠŸ{ÎáI-°§ŽßÓ¨ÕupuÙ£¯'hM èÃŽ´$,J…÷©Þ/è„c}‚.'µ^]¥§“<=!`Œ–›ªî£V[N  Â] ÙYã¤7b@ƒ5ak!y:ó ûdÞÉ)û(aI7zèèvÊKh(Ä´ü_yMØã^3¸‰•Á¢ÔŸ\áñ-¡a]âD}0¡6óûúHƒUÙPz 3z˜Q: 6À0ûã<åBczÅ寮 ŽëcÜ“¯"ƒ¼ÍÑr™‡¦îð[‡Y¶ôÍ#•ØéãÞ—p¯»Hv}<€ß¦r* ñÕ†G'…„Ú~ò©Š‰cÊÄëÉrÌ@\Çó!'OQdYÂJï7#Jpo‹.ÿtî9~-ÆgYu’»= à#Í3r·„‚Nwî=zü˜¸)ʼn[ºÖ0Ï­ŠoK|zq  ·E°z˜Ð+¦uóm½ÄZ a})G­ÁÜPwÐIÃb8aÀßåM;@éœmú  ÙÛsH`*‘@ "c@ËÌшãz¡ZF'' òðlþGÈ›8JÍ.Î *REømDïM°‘³ól¬•žÀ·ù] ÉãžðFÔÐjp9mmLWñµ>ðœÊJÊq¸³Ó• ö”k@ù¨U‰œO§” ÖJyòËFo¼,ãó­•T„Â,øË*‡Š»´c_7My³-äE¼§ég+§ƒ¦žÎõó}/ Ÿoc=0xx +ÓzTÈqijûgõ¡’**‰ÈÕ"v Ú5™Ùñ5tbOL?–„/UGÁKŸï­ÿzƒÿN ôIÇ_˜C¶QzØQv?\Áò*.“¥︧—\í GWX~lëô1àÔ|êùšRŒnò Ð€ï+ ÁhxuÛ×u,ˆCC¿oNË!j~=ý$¬Ü¼*‚B°«ŽI¸ÍKêñ¶/ÃïUÊ•wC }§¡E?¬öQI£Ub_·_ÁH§ô KÝñ*7¨Êp÷T)¦T,Þ›ñE9õŸ +¢QMþï€>û¿<úÑ–)çäôOÍpŸaêSI¨ðÔäþ²-™Êä„èÿ¬O*endstream endobj -1404 0 obj << +1400 0 obj << /Type /Page -/Contents 1405 0 R -/Resources 1403 0 R +/Contents 1401 0 R +/Resources 1399 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R +/Parent 1398 0 R >> endobj -1406 0 obj << -/D [1404 0 R /XYZ 56.6929 794.5015 null] +1402 0 obj << +/D [1400 0 R /XYZ 56.6929 794.5015 null] +>> endobj +426 0 obj << +/D [1400 0 R /XYZ 56.6929 654.5469 null] >> endobj 1403 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> +/D [1400 0 R /XYZ 56.6929 627.5235 null] +>> endobj +430 0 obj << +/D [1400 0 R /XYZ 56.6929 355.4402 null] +>> endobj +1291 0 obj << +/D [1400 0 R /XYZ 56.6929 325.2926 null] +>> endobj +1399 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj +1406 0 obj << +/Length 3514 +/Filter /FlateDecode +>> +stream +xÚÅ]sã¶ñÝ¿Brç„â“ 'O—œïêLsI}N?&Édh‘–Ù£HE¤ìSÚü÷îbŠ¤¨“¥û†ÚOõö#0CEÑüö!'Øf·ÝÔÿ¨ïé¿…^à¬%zk‰X2 Û…¸Êf[?Y¾(>Ýoýè>eÆ2ma48­²)Œ 0„Ûü—]Þ´'f“Ä]–é®Éý¾ +ÿßÖô¿N?º Åó¢õ»¬›¦¸+ón Ÿ-”0 L‚%ÆH‡:+š”†ÆÊqÂ5vŽG±$àúŸoo¨•?浞¨%çwuû@°uÚ´ù–ÚÈ×hÊôÑãƒk¿Xí{w›M½mé£h_A#óûÚcÉ?¥ëÍ¥˜ OQ]y@ Ñ‹X6Ø`“oómCJ_øÿ»Ýjµ§&Q å6mr?À­ŽÀz»½Œç»Më;²´M©å·-Ïœ~à_Æ:jfmLÊz;­k ‹µˆ½´ó¬j&4Bjfu§¤ Þ"žg9ð|]TH¼)fl©ÓÉ¡e½LK‚O¨ýT”% HÛ6_oZ?­¦¿ˆ_½yÿÁÏpGز^¯wU±LÛ¢Z‘–i°ßب¡ ž +§ÀÒ0hl/S¾®[ÿíIg…6+¸·Yäx~Ÿîʶcðû"˸Ú³fŸO±Oh–h,Š„N¨Œ¹g…$9Ó²3IÒb—mMñk>±”‹üèzÓ52ÍZØ)ê’²‘íx  ïß|çG!Z×jÒ–:‹† i¬j Ð1ú¾ÛO‘ ’P‘ JU¥ë<› S¡VEÊò¢œàœ¶{”jG)9‘9‘¾0•H†Â4øûe"Á9õ?¦åÎ)«û£ÉÔa„$(©_2×<‰r·oI¿“ùÜð>Šz×6à›©³}(83˜xéò |Ê'c`ÉŒ•a(x 1Â*D€Ø ƒrä;‚ á„íKÅ„C‡N¼oêk,]¬,<‚>üw9ïvL}Ö=‡ápÓyŽjï75ˆD1Ó]V‘.?6´tÚÐr8»OÌçIMîGþb^T”#§³ˆ›ø3µP îÏ ÍâüV Ãð{q*¯Aug5ZÎsw¢¡B, °f<6´†ø»¥Á4 òŒÊÙ9@Ð+:êtçqíª èhë:óð=Á}¶ Äã?@böÉÃ(Їᛴ]>õÌ~ ƒ]c¾îÄE[±Ë/ðŸpb "If@ç£DÏÿ…ÎÔôбtg/4šM¾,î÷ôñôP,¨IöBmwŽÛaCñØH=’`—ˆÃEÐnÚäÙÖ +É¥ ²è¬x¿¼kðKÇâ[t³¦AÎÔ×÷«iÃÉ_¶˜•ŒÇRõ”¥ªnérC5ɳW“éÌ/þÀʽ…ˆÔ¢pZ¯gX¶Öƒs~Ê”e*éøß´)äRÀq~’/J8DåÎ÷î.¥#"FáKØö|¦’qß&-!Æ–?µRkW.°!þ‚Fµ[ß¹äƹ¬Úb\-wÛC<Š°¢º«wÎšàƒŽ‡º#Ëut‡Ùp‘ÿqÚ0óƒ¤rJú­ XUÕSþ\—ŒõH+N°G)’èþ‰=TÄA|xÖ{@º .¹;í«Í)Å’O*<Í‹WçI-³šIÝ^0Tº Æ“D<3•F~}Ì÷'ê †Gr\oÐöd  +Ä£† 锥*¦´Â"ãR£„`Eii ¡„˜à9¥FÉ’8Ž§ ‹ßâ€jˆÃ8,Z)Vuf2J É⃀²÷[9§¡½ÓЧj‡p¨ÄÊŒ¶>f/G¯:?«|’—Pº +ÿdÀØ¢S—F•I—>ñÐ⃥‚‚ŠùžT”TBŽŠ1šß~¸~÷j,!"£h¦#Á"¥cd unW3jÜôª¶ÝøEÂqÕö/’ñ!¤ÇNTsDMd˜j@ÌQá8 :GÁ—烠Õ}ÊGó6-)ZG°“þSXk‡e=ð\Vòù?<"ëŽðn†+ôÀ{njÕ~vbXÈözE’A°ÂüašƒM2ZÓ`B¹ªÒv×ÕYLWô3^Áà•Wùt0£Ï]Cl0¡Ž“P áàÀ!QÂ/h¹ÆfYg„ŠYP&‡€t);=Uyl‡J³Åª¨¨ä8ÌšžUa¸o~ÿ²+|”?ôàw]AbU…¾»}X/ Cþ`Åd²äðº„Èo·‚ NsO$6VÛt½†¬Ð}à™z§9@™èŒ×6Œ‹®ž¼6b…,µ~j¨íœ6Ö»²-6¥‚81ÍRÀÎ +kî{„»ô»Q'zC©çõzþb»ðõifc1Š¯{Eé¹èóΗVͤôS± &MË©² dŸJ&ñ¹{>ë4ÞÅc4bi‘ÝøÊF›C: µ¯ú"ôú»GM Ÿš8Pä§ôÓ>’e>ô8)9Š|rdè„ ¦'kÏ£"\‡\ž›~.pŸb œêVzèð £ï‡ÜU€'iƒ¾ü1/ƒþã<K š¹KŠí!C¼ú¯K§²Ã"G/ù¢›5TÂÔU„<á¿çÕ\}IÎ?@¼W¦Û^!T…‹)Íi¾ 2ÈÀãÈh¸-œ{b[Ò@Fi¤y±Æ)–ØÀŒgìç-‘n):EŽ*†t.6C¿›åmZ”Í«à<ó‘{Íòf¹-BÝÍ8ï5å´ VÃ{ä—©5ú¬‘«~‡‘J¡ê¢G༘Œ•a%Ti+ÏÄ@ÝøEÂqrŒwÑÝ¿ÂìI„O‘’’Ž"¡nÔ9BŽ°õ …x&UW(Ô缯€ƒÜi‘FÎ.+ÏûÝ.7`œ¦XÄ|¹Ç5ÁãF'=®y¦Çu-ô äz­e1×#S¢­`¶Û•(új|N­}^®†>Ćâ¬3C›œô· +úȺ­&ÇSýnO" Ž æžò·Ö0™tOÎ +Y1Þ•6ÑQîEin¦K#/%ø„×í_?¥áÎäöÙ›d?÷”×…x +øf^¦o¦»Ó]R&·âŸ\DŒ+!Ÿ™“«ˆÏä®_?kN çÑgÍ Ýå¯}„'wgUw¶vÖ¤BÍÆ•3£¼[ÎsëßP`IÅMéY“Ò·&埯`ÇЋ_bG¹™Š_TävRÐÅ© y€>5<„ñû`@˜Ãœ2 yÂ)tƒ… *{iXÌé€%ÂK»ÎKž—ª‰†:.v—‡zÓ<Ukÿ$ÑÿZó| 3 ×H<×~Ür +` Ç›Ó^-à4ÕÄwn&— Á1 i!1lÚbÙ,–iUå¥OÎ>*²îõ›Ï»Ü2zTk•ì±P˜9BÁJÿqBøÌãP£$Š~ E…ÅAlaÉÅÃ6?;Kpÿ%B1c5V3è¢ø“ï"¤½ªZàl¿ +½ò¸?ùA.ë /„ädŠ`†?¯ñäç²ÀÄÚuüæ§~P9BJid2ª"í‘16šçX3z)òÛS’åøC–D%¡DßP®8TÝË®ïÝ¥à±>ŽD}úU@ÜݨNQ3e‚Û·ÚN\ óÒßÓ{ÙFå +b`µ‡­âz #ýãªBøË 9oö ¬Aí4[¹M^Ü°ØÄj¨¥m^Å…2ǪW̦¨§×yع/¡TtáÒÿ‡ÞQ?î:ñÞT|m9ÚòNSþð[ÔÃC]m™Šã12Þ—Ç2±(§“ɘòîÑê1éÿ—ðl endstream +endobj +1405 0 obj << +/Type /Page +/Contents 1406 0 R +/Resources 1404 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1398 0 R +/Annots [ 1408 0 R 1409 0 R ] +>> endobj +1408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.0003 457.8291 166.1092 469.8888] +/Subtype /Link +/A << /S /GoTo /D (tsig) >> +>> endobj 1409 0 obj << -/Length 1124 -/Filter /FlateDecode ->> -stream -xÚÍXÛnã6}÷Wè1)@®¨»§lê¤Yt³­×}rƒ‘(‡nKÒqœzÿ½”(Ù’/Éq…aHâåðÌpf8C¤éò‡4φºé[šë[ÐÖ‘­É@×f²ïf€ª1 š£>Ž®MWó¡ïŽ6ŽXÔ=iãprvõÛåãáè¶~æÀs`;úÙÇÛ»_U‹¯W_î®ooþ]ž»ÖÙøöËj ¯‡£áÝÕð ÏFr¾Q!˜p}ûûP½ÝŒ.?¾ß? †ãµ,My‘n‚|Lîu-”bèÐô=[[È"ß7´d`Ù&´-Ó¬[âÁ×ÁŸkÀFo9uŸþlÓƒ¶g¸{h !èÛ¶ÑÒ íCÇ4ÌRƒ…І-5 ëúÙk–%àWIH**yNÌ -y?\[¨±-ºLº®«6D!8Ö4ÅIõ9 bÌù½úø·Ò ú…–Àš£˼š‘`.»(‡êõ µÊDÀqœ-À·9aËWµ‡!#œO,‚ÇiL¹Píß/Ôó¾iÀYzbXÁpÊ#ÂÞ»Gó<”»u2® -äYLƒ¶bUÏTõLÙ<®7BxßG<i&hÔ†§ù´à]aæëöâ£Z¡Z`rÄI³f×YÅÁ# ž@aÈ\5ü­Ûú³ta¯è,Í‘m¨µÒÄWˆÉËIá4ÌBÕ¶$|š±išu¦‚ÌË-€Î4BŠãyÞ|Ÿf¹ µu@ˆhmO\0šÎ~4±%ŠÅteLšüF³‚¼ˆË^ý'›³Ç]¹m./ š8}­’oSž“ ƒ4R„Åz# ²4^®"ʸè%E…Co9Ùÿè7­åéKÄÀæÇmi9;bYBɈIÒ ö¿7l{—„HrÐǶ¶öSz†üƒ-y:9Ú¶Œ$Îf ÓHçÉC}"t´¯ú4”&ŸÍÅû‘Mz!µ$k†ò-½¬Ôƒ¼äòÈ ¢Õ¨ÜæÝ™´Z -„$ÆÕ$N‚, y_‘žáþÑ2Ÿ?<‘定½÷4·Š—$ ›@s«á®«9.4]C&κ–i—0¿”]6ô]×Ñí›Èñ–¯+v¹&”sßäž&Mg—¦L;M¹zEÓ:@Ó:’¦ Q&¿{öªHA—™¬LhÀ=Ù8gÓPžŽå9Éžëá§ËHòŸJ‹ùOXG´žîÖD)žXÌYw¨ƒ„6™wO™â£}"C+#‘à± BG‡²÷ƒ”L„Ìûû@ ]}!Z,dp‘G#Èêª&Çⱬ¤:L%¬H­‹Ø„ˆß6y°U…)y¾¯Ë.Õm½·¸C[Åñ3¹x³`ÚS$œ¨¸;q öŒÆ¡‚TâÚ]O  -YÕOü©ÊVzO×þÜàç¬.÷]™6,îvö\êèë{›w_!mî×,™/xž±¹2÷8¦î@ÏðÝšT¡Pm3_ß5íRÿŽ@íendstream -endobj -1408 0 obj << -/Type /Page -/Contents 1409 0 R -/Resources 1407 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R ->> endobj -1410 0 obj << -/D [1408 0 R /XYZ 85.0394 794.5015 null] ->> endobj -454 0 obj << -/D [1408 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1292 0 obj << -/D [1408 0 R /XYZ 85.0394 748.6299 null] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.2874 346.5415 467.9594 358.6011] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1407 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] +/D [1405 0 R /XYZ 85.0394 794.5015 null] >> endobj -1413 0 obj << -/Length 1090 -/Filter /FlateDecode ->> -stream -xÚÝX[sâ6~çWø:#Å’ï³OÙ”¤Ùé²-¥O”a[NÔõm%± Yúß+_³1`C2³í0ŒeÉçÓwnÒ‘¦«Ò,Úö4Ç3¡¥#Kó㞮ݫ±›ª¾ë@ý«÷“Þŵáhôllk“°†åBÝu‘6 ¦}b8PzÿêÓèúöæÏñåÀ1û“ÛO£À–Þ¿¾ýuX¶nÆ—?^Ž¹ê_ýrùÛd8.‡ì -ãýíèç²Ç+{@ÇÃëáx8ºf“½ád£K]_¤¹"_zÓ™®Jí=žkiêE‡Èó°÷LË€–i램÷Gï÷ `m´m´Ò!6lÜ`@Õ èêÐÖ”cyÐ6°Qp:¶®÷ýê ‰©(;þÒ-ý‘ðd­Ø}’rªúP9ú®|Ìrý €ô, ×F¢EVoÏÓL²4i²ˆ–-!9Kî ¢º`L„¤<aÊc"·*Iú$Wœ§ B©öcæ‹S«€HÒ¥:ÚÝ^T=ÂiÈ©x(v—“÷¨S@ÐK&’/ÏåqÄ"’ ”{Þ©y¦<I±s)£ã0ÐCŲ[c¤ê§jŽõpÞ›Í6|æù¹«ŠH?"Blj¿bÍi‚•Ë¬’xPõè»&[ì+qÄ è=ÉÏhµB¡•åðùgÉ‹‹ò9J«Œ¼³ˆÆ4‘4€?€…\Ü2‰¢ô|YP¾Ü©Üó¥Š -1WÇPÿ¡Vµ·)¬k˜`}p~ØW9ì£×=ì¿Rìý0wÿÝSûÿøÚíxÙt±gX0¿k¸†SÿjÒ³/ý¶7¢¦ª¿\oîó°Q»ÏÃŽ MWT¤reü‚ùúvð%õõ~Lendstream -endobj -1412 0 obj << -/Type /Page -/Contents 1413 0 R -/Resources 1411 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1388 0 R +434 0 obj << +/D [1405 0 R /XYZ 85.0394 240.6473 null] >> endobj -1414 0 obj << -/D [1412 0 R /XYZ 56.6929 794.5015 null] +1410 0 obj << +/D [1405 0 R /XYZ 85.0394 213.5966 null] +>> endobj +438 0 obj << +/D [1405 0 R /XYZ 85.0394 126.6995 null] >> endobj 1411 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R >> +/D [1405 0 R /XYZ 85.0394 93.8745 null] +>> endobj +1404 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1417 0 obj << -/Length 2117 +1414 0 obj << +/Length 2970 /Filter /FlateDecode >> stream -xÚµYÝsÛ6÷_¡Gú&DðÉñ““Ú9w.nÏQ_êf<”Y¼£HAYQ¯ýß»ÀmÓ‰OÇX.‹Åîo ™M(ü±I¦¹œ¤¹$Š25™¯èäæ>1/¡x(õnzôö\¤“œä O&Óå@WFh–±Étq½ÿçéÏÓ³«ã˜+%ä8V Þ]\þ€œ‡÷?]ž_|øåêô8•Ñôâ§Kd_Ÿ]]¾?;ŽY¦¬ç^à Î/þu†Ô‡«ÓO¯Ž?O<:›ögž—Qaò¿£ëÏt²€cÿxD‰È35ÙÁ%,Ïùd}$• J -8Õѧ£÷ -³né˜ÿ”ȈÊx:â@Éd4#¹ÌÓIªr’.œ¯ã„Òh]|‰»¶¨ÍR·qW®u\Ö8So×3Ý"}‚Ãg{nØ[}o£i¶í\#ó7ªh¹‘7ÅbáµþáT°4'‚§ -4‘T -éýÃM)’§i2ðA ÃÅ×›¦í,77öãóˆ}3DÀ¢`'ûŠñ]245yljžždÐTõ„©êûLåT.Ò|Ô¥EÕÅ/rë@ÛßbkN8S깶~Óµœ3ÂRšü=(à<%Lf|[£ã'Ý»×æ¦ioêæ°ÿ½©ulº¢+MWÎÍÏΞEѳÂèç¦Þ½Ã¬Ë:nõ²Õfå*Äw•[g^¯ÄYÒµû©`íx©ŠûVl«®Œ×…颯$æ‚äÌ%ø@ÕŸ'aƒ0m¹6Ú‡¸ßÔE°ðz^ÆxþÑ=¦¶ÛoüŠeÓîŠvqòWx‘C5uµÿcY¶¦;dÃ3üáõèÖûÐæ>‡‰ù­Ü"„„ýÜðçs°­+} ÒÔ±=ÀË#ÂF#"_ö "ì<ù&:Þžs6éÙKk\à”£bÛ´p¨€Œzã°AùµB¯uÝáçú7Jy]Úm‘SÔ $~1Å­î÷9´ Ö&ûæwúµßizœƒŸ7Úzï9ï#€âo«rPUÔÈ.*ÓŒÝm†±×Ú Ç i7u#ìÚZ2ë#åøv/F@„¢w{ä-ô²€nå F?t£~AÜ.`zÌ%æùÌMY„×7Oy¤rܵ#º Ørå€ |<2¬œyÁùª¨oõ?°:Q¸Bb‡Àw¶ œÃÝrïzY!¥Å¾Êi¡±³Ü™^ö8³sÎ`;1²,çaàX:}C‚E‚ u²5ÊcNÛh·.î ¹’´ßÎ@Ë.p=‚¤‡ý½=-  –§PX9éá—§ƒå‡+æ¡-Îï‚%5G9p1@‡KEËÙ•Ý -©‡¦[ÞôÓŤà…oÍR4.–^-ê²^ymöœvtñq©¿x3šxp. ç°Ä½º&”ð7“šy‘\2]¿° -ܦ@õ†ØÅ°Æc 7Áªj©ÒŒº ‘i#Î^’‚ro[Õ@¦xÎ!9ì—·¨Þ P`,pèýÚ+„×]ÛÙúœ$Г…UË°jľ žS†÷B¯kÞ¬¡Ê,œíœA2–õ<v86Kç<»â£Ù=T-m-ÚnP{àêª\—£´†Zéoy{ýÈ<ªAqFæ΂IW9A`jwå¢[Y3]6A"ÔðÐ1€p…•êÖK`V›qÏ(j¿¡"‰4êÚ Ë%/pVÛÚgÙ"Ì,½ìªÙ°Íà è0Åj Jm\ûbg,´%Ö¾j:œÖLãu |sûC2 -üîvM\d+äBùwÕÍN™ùJ¯½´o¦xßø  -w_LÉs‘þ2¶b½©ô›Cw åºo=€6n—…*Ÿù}]ƒp¿ùQŒdðtð-‚þâö Ë‘n"ɈR]Gy»êp—MUÌu¸?tø¹…©øƒ‡’Ïd¨Ëp¹wx¿Ú¯²v…¨‡>#­(Ü1Á#ÖKNhÊUoýÛ¯ K T™Ä‹ïVÚß/5 Š¥<(ÑÆgbp‡u‡WzÿÜÿÙ: AuˆaOØöÜ]ƒDu ‰Ûù†¾]þ —ye¡Cì# siô± Ê€;Ü=‡ðiöÍk3†¨™^!~¤ˆ<¶[’TÍ®Ú#·\â¸o¶Hl¶JÁ!‘C13~¡‹¨¥ -¯ ªü^‹Ò—¿®M>âòwü™1ìß_÷&<ó¿0f”€Qc?ÓÓIðЫÿ)pø 4ÙÐÿñþr¿K§ ÉxžÂû›X]62©xäŒðß/50ý/—$Šendstream +xÚ­ËrÛ8òî¯Ðmè-‹K$LNy8Ïî$YÛsØJR)ˆ¢%V(R!©8Þ­ù÷m )ÑLùÀÐh4ý–Ù,‚?6KÒ0Õ\ϤŽÃ$bÉ,ÛœD³¬½9a„3÷Hó!Ö‹ë“¿¿r¦Còtv}3 ¥ÂH)6»^~Ò‡§@! +^¾{ûúâÍï—ÏOe\_¼{{:çI¼¾øç9Bo.ŸÿöÛóËÓ9S ^þòüýõù%.¥DãÅÅÛW8£ñsÑËó×ç—ço_žŸ~ºþõäüº¿Ëð¾,ö"_O>|ŠfK¸ö¯'Q(´Jf·0ˆB¦5ŸmNâD„I,„Ÿ)O®NþÕ¬º­“òcQÈEÊ'ÈÅ”¦–¬¯×E —biÐv¦Ë7yÕá°¨º¼ZÒZWÛ¯ 9Ž?F‘È¿‹2®Ýv[7Da³+»bëQ²z³ÙUEfº¢®pjÛœ2Ô]ÕeëO%‚ëO¼Ùu;‡–ŸÁçÁb×áJ†ósû ˆ9c¡Nîn…;ª®¼\™uå¡_®¯ß#d²,o[„ úÿùB¨$¸°gÉ”è}Ýv·6B¤8iü8AÁn½-Ê|‰£Û¢[#T‹ï›’?ƒ‘Rî¶p x/6x¯ÞU§"ËÙ;Ù÷)Ú®ÈZ¼ò¼_]=[›ªÊAžHp¨±yÌÙ€žo•¢”„é¢,qÊJhÛ9æa!ÿ–W„zCßWpk +OS”4eoZïˆ4>&Ì­ÓÜ2Æûœ:¡ç„5SÝ!6½߶ž çêÆ% €îC÷G@2+5~óõ¬±FzuáQ¨RÜò¼š>KBÅSEÂ*ª¼›(P1NHY]ux”e•kÿv PJ0ipxýò=ŽÛ:û’w—ðÀyUT+Ä14„‰v›g‡G9f™Ç)˜¿×—b{èD¬Ã(Rb&#ê(QOñO€©”šöNóžâ|H]Ï3‘À iÉö'[«8*ga¤%ÝÂùŠ§‹@Â^ÅĽ"ˆpÌRª¿N=ÅGD'2di*Ç"0Ëes„7Tk)B·ë"[“âÃzÅêÀòƒ;qÎGéÀ/Þ‹qlÀϤ9œOkÁçÅ<¹ÇR¸=—ñ½‚å<{ár–jðJI”þ°`{Šó!ÉcÁ‚v„ŠAÐëѬÙÇ^²õ ¢Ä£«2ˆŽDSʼ«EüÛ)ª$’³ÖÇ(‰ pS´_f(aôŽÚÔC^NNÄßî#€Ãòo¥¬Ç[fÆá/é=÷oõ â (‚H¡¯“Ù8 Ô…‹;Öy +pV5?tíÂ…G\u>ØMÜà×±eöîµù©Eg¥×µêÅÁË¡‡tÇÖûã<„P!˜¨{ÖÑõ´¢ë² Ä1º°Û¼ÙÞPCídP¹`Å%505÷ó( +%õ 6 > ¸šƒðä` "…lᇮ§8’œ¸Rc ÷h–Íé0=eœ’#žÆ“=ÅG˜ðúð1“6MYDBÒ½E@R'ÐÂ#3œPAÐÀ˜óÇ4P…1Sz¤¨Î€8å-”agSé,€|…TfÓ'½Ãc mãaCÎ.ô(æUƉRÅü@8¨¼Œ=¢^‚­Š}ME…¸» fOÆî¼äÆÝžQÄ÷ŒôÊ +*ÌE y‘â6Ùò(íÛ{òhEð\Í’ƒåüK~G×»ßúMc6ÓL$ ö)´mhGvL)Úÿu/f«ævàóå,ZµÛ,òæaxˆÿlJ?ãýÿtÝçC†Ÿ>Q)0ÅûϦ„¹ž«J¡zé…ÌŸ*äW¹Mÿªbÿ°¦"Kû½5«|B¼ôEŸTL˜2º>q1‘Ö5®’©FV,‘Aפƒá«·WWç/nól×ÝŽÐpëξa­'ÖfM±Àr-²íÉÃŒ¬CÅJÌ„„JÆ.áb³š!p9hÖöøóá†ãfí1]{Õ«Þ3q¨Ž¸Á«Oô˜ë… n®„v k¼ÞnµÆ Ц3„ò®Ò ¼È3LìÀ†2Á°û,|Ó›ö"°™áe,TO“#:[ãû߇ûüI;ˆÅ«Ê¶¹'.öÎ…xa-Û~Hèv¼¶í +;³È]Q!ҾߊDµ¤„gpØ5§*pcKzÀB’(jÙ]ØDÍM7&¹Æ³EðÖféùYbÁ7SËÁæŠ(RÛ6ö„WÞ?÷aIJ1´.¿åTÆ’§dàa¦³{ßØûH4ÝÓZ° kÂiw‹e½jÇY¡ œW²w^“ýlw˜9q€\kÊùiduCwÚÖÕ’J8éÔ¤¥¾•Øº¡ÅdOê©eúDŸ­¹oëî % ¾Ìó? 1äßmªî@D]Q{¨ÄŸ`ëP .Ãæ@ñ1&&TèÃ"ÎÝ6ÄiП°AY¨ƒ«bS”¦qé$¬¢_(@½tâôé@îqõdá@É£ûž·çü™«FGïeêXÄô|½ú{ +€âýãüß>WH!YHõX.——mÞ*ÿ^¤?yu'vèNä„ÃŽÊXG#ýp%}%ö©±4H„¦n¸Pƒ*f¿Iˆ¢‰¶×kŠÜõcp$&[÷{[›Š£‰hR9ÿkRpr\´]œ¶©ôÊZJ(ªùÁtö÷S³²ç‰8ýJS¦\ÙH¶Þ¸qLNŒûÀ ¡7q€o4ÈöÉÙ5×ËîDwÎç‚ì/ßÀüÕÖd¹ç§3 VùmY8s±;-#3 T?«‘»ìv÷c{}µÎnUÕ}¨z¿¾ÃG!yæ ´¤}Ø8[,<Ê×nK_.î¶þ8_TFî–á=Ù2–$É>[”-+òÛ?YŠ`2ŒR"õÙê“°°-–$9(²Ò´í§aÅrð® 3ÏÊé+÷¡.Òg‡ñÙõAÜüÏî§É/¨¾¡6ÙŸ 6è ;ZHÌæèÞ,þ]Þ~®›Ï¶ÝápÏ|RÀÈÿÔ?tºý/Œ‰l:êuå‡ÿÙcÿŸ0± …R|:-ç¶+¤€1e9—Ñçþ¿BŽYÿu´Éendstream endobj -1416 0 obj << +1413 0 obj << /Type /Page -/Contents 1417 0 R -/Resources 1415 0 R +/Contents 1414 0 R +/Resources 1412 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R +/Parent 1398 0 R +/Annots [ 1418 0 R ] >> endobj 1418 0 obj << -/D [1416 0 R /XYZ 85.0394 794.5015 null] ->> endobj -458 0 obj << -/D [1416 0 R /XYZ 85.0394 421.6574 null] ->> endobj -1419 0 obj << -/D [1416 0 R /XYZ 85.0394 391.5435 null] ->> endobj -462 0 obj << -/D [1416 0 R /XYZ 85.0394 391.5435 null] ->> endobj -1420 0 obj << -/D [1416 0 R /XYZ 85.0394 367.1321 null] ->> endobj -1421 0 obj << -/D [1416 0 R /XYZ 85.0394 367.1321 null] ->> endobj -1422 0 obj << -/D [1416 0 R /XYZ 85.0394 355.1769 null] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.8521 368.6685 481.8988 380.7281] +/Subtype /Link +/A << /S /GoTo /D (DNSSEC) >> >> endobj 1415 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F21 702 0 R /F23 726 0 R >> +/D [1413 0 R /XYZ 56.6929 794.5015 null] +>> endobj +442 0 obj << +/D [1413 0 R /XYZ 56.6929 543.7303 null] +>> endobj +1416 0 obj << +/D [1413 0 R /XYZ 56.6929 512.1243 null] +>> endobj +446 0 obj << +/D [1413 0 R /XYZ 56.6929 424.5706 null] +>> endobj +1417 0 obj << +/D [1413 0 R /XYZ 56.6929 390.1552 null] +>> endobj +450 0 obj << +/D [1413 0 R /XYZ 56.6929 210.2494 null] +>> endobj +1388 0 obj << +/D [1413 0 R /XYZ 56.6929 181.6082 null] +>> endobj +1412 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1421 0 obj << +/Length 2930 +/Filter /FlateDecode +>> +stream +xÚ­ZKsÛF¾ëW°rY¨Ê„ç…×ú$Û²£T¬de·j“ ph¢  JÖnå¿o÷td)—hÌ zº{¾~ %þä"B¡3³H2FBF‹b{"aîý‰ä5K¿h9^õúúäå;,²0‹U¼¸^x¥¡HS¹¸^ý¼ùöìÇëó«Ó¥ŠD‡§Ë(Áë‹Ë·4’ÑãÍ—ï.Þÿ|uvš˜àúâ‡K¾:w~u~ùæüt)ÓHÂ÷Š9<òÁ»‹ïωzuöáÃÙÕéo×ßœ_÷ºŒõ•B£"¿Ÿüò›X¬@íïND¨³4ZÜÁ‹e–©ÅöÄD:ŒŒÖ~¤:ùéä=ÃѬûtÎ~‘NÃ(UÉŒ•\HfQ¤&Œ²0ÖJ; ¢ÒÊ€„ÁmiïHÁŸº¼³[[wôúÖþ*„ªË®ljÉë?·ùG‹†€íôè¼Ä¦aï$rû\oü"9Z$³P© UÁ5nû‡œ” ã4MyQ;–,Ê–ž9=vÍݯ¾%ÁÚæÝ© ûS™–Æš5­ô(‰ %qÐmræYÙnʵηüuk÷·vÏ“u{×Óôx{ù¿ìþžÈU¹Æí×ÖI±DK£ÃL&ÙbÙŸ¨JUøQ’+»³õª¬?Ò«³:<ï6 Nmxæí'X°Õ™.ºéä.ßweq¨ò½g{h-èu³çåÛ]å,Úo×y‘F8f»ÃŽߕݦ9tN1Õa“߀F×Ðs +;3n¶‡ª+a?z#s¶aÏ) ceŒãtž›Èt=˜0-g£¥Ó:,Û_%žŽô‘B€àDˆuÎ8‚0hwyÁã¤îʪ¢%7<×Z[us?Ù§=Ü€%§;U Ò–&‹‚3F:i|„Z ¶K“`›wŵÀÄ_š‚wçÃðR®i®ìxQÛ' ø~ñ#¼Z‘‡´-}9aÝyÏ5“cˆ’P*mØÆÈ?? +ˆ:ß:^ÄIÊÔ¤Ï ‰*Ìœ»ÏÄeÏq9fé¢ÝD>&a”)3ìŒb:ÅŽ…¤„"ŒòÕ„ì9>!¤Q21òDȪl»9PÇa’Hüf=œŽ#Àkg¢} ï Î>)FQ–Îa¬‘@kH ±— ¨r'ˆà”²kH¬l ñ$§„6·t 6èÁ†/€ M£~çGÁ¦ChµˆãÓJüÀÆ—c–s`‹C6þÖâ05Iòõdì9>!£\›âéM„| k à·Ï˧RÓDZ HÕàœOcê·JæЕYj&€Ã-Ê‚ ”Ië n:"Ú-JŒìvõF"Ü4Ý\‘Zb=!'B>úJ¹8K<ôè39 Ž*È Ç'TËð™ñ'+»Î!1’&˜6ñéø`2u„£ B,Ž5¯\©“ÝÊb&Ñ:.ê~®¯Ü2ÎÊYNW|â\Q.8æ3§*äß$…Úö™ÖÓ¡ÑB}ÑzLc¢èÏX/ÅOT‰r¯hÕ²r]þi®Þ„2 6±â'{ß>RxFÆÃïnS‚?Ã9˜`çLÔÜ–+tˆX(Nlm±Éë²ÝÒ«+±pž<F|GÚ3L¶¶²…ó ]=’©Ž2†Þ䌖r•‚Œü–¤3R7,ÌÈxÉÜA.½v‡$ëïmqØ·å­]65”Ž3è…¶¡¯È_`Q{û¨D‚ 6&’«êDŽ•#€ñã!¨šÛŽ?\“·ÌÑû‚cåñ榨øê¶u~âNÎ{d\-"×›,•Ž‚Æí¹rE=¾®éÙÍö.Ї¦0ûdù¨m‰oÉ϶üX»ƒCíhèW¥¤Œ«ì` ¯ü€‹Ø@ÝØñ’¶©nn³zPÆ1.šº³Ÿ»^Ug-(éB-Ä‘Ð7P¯£û>cLR ˜Y÷‘ÿ œJ¼É|Ã%‚’Ÿ\ +P;°„d’ÆRN»‚7®rWÂô…<*(´kJœ’6f„‚³ÐO7›2ŽÍL³ lÙΰƒY×¹-‹bfyãZAQǬ +ãUºÇª0ÀK™ê6“2Xå]NL8˜qû!0ðEI9Ï®nÏÌÜ™¦Ô~αÇ}Á †Vö÷u^!}t¡CàGÓÃ1"^ý%w±Ü.ãE ]j—gûÚyín4_Ehï^0°£„ç^ØH–õ°pØ&ed¼ïy&3õ;TŠZ©¹‹퓨&hê®Q½áº9Q"mš¨§Ã@Ô`½îxŒ?§míkŸÊu ÜÝÎ9a–ywênãŒÔ)oÀÞÊ”.|àJЩÔ{%Œƒ‰’à_=³º,û[ð`^,‘%3w‡÷bt‘p¼®žÃé#ç Ÿé}ü Ç uý\àÊ ‹eüIf®& '=¸E½ +Î/(7’»â’œ—Hlò[;aA/NU^;©Gœ4üí¼ºËHC¿3Ü|Èçg”^ëW|É„3×ÃA™½ÚÕŒŽÚq…bW¶.x¬á{?äÚx®>Ìk¢vsF=Ë1…|P&pÔ©ÄJÃø0Bªÿ< ©C¸ÅXyÇ)°XÈ[Tæä€N8DO×–üôàUÒŒ§/.§Ë`â°µ+æ{Ùt¼»Or1w'n³zé?¿„Þ\ƒR@1’Ï;Yˆ;c’ÊÛr8 +|Ž¸¸ô±›t@.9E³Ý••]-ýðåÍæo%ù"¼ü³Ã­²™æÀ´3­±†3ψŒÆdsõ"ð%Q}@°íGzC’“œ"«©±Vª¿Þï«r®úð#ÊLr¨6qW?yèX]pª÷„Ì4ÅÎí(,d +Ü]f$¶Ì¤?º¸ ‰8«ïgK5BðÆr1hÆXÐ[fà-&Q·ojšpÖsD³£™ÊÞÚŠÆ0%ÉÞć=ßeá,Yšèþäyu[®+_R'aõí®:L¥XxâU=Qt±‡(v†OÇÈL† õ‚nj)Y¦E ™(ˆ@Ù³r‡È²¹ßX€7—½@ù”›Š^¾€ôbž¸è}œK… ÇA53°Ÿ¡l*Ên¶7ÐàgYòWr;úÈ3ûÀÞújC¸5c7ȹÐzè'hð–,~dcnš +èu}Â@|ÌÞJ‰ÐDÏù)lNUŸ) á׼ŷvlÒ›…×Æ,èzR×v÷;ôö'Š\æëD²\FZî;Žû蛡¶úÿôüûÌå0h­C‘š#µ)ØÅ€¼o|±ÿ ½ÿ×KGÐ]FÑa/_Ò’kç|Hµ›æP­ˆæž Iü%Åž7½Õ¶»köŸF©cäóÓ»2Å=¤ÝßËô üñÊ3PøC¡Ðé~Üóվ쇋'¯Ýß–¿ >r"¦ÍYi™/†<\woÛçË”óF ‚¢ãÁá@fN¼ O1ï{pÀ;ܱP~7HûÕ~uûѶòŸª U[70Tã:¨Œ$y-àÖ#£…­^Í1_—Õó¥—+\Ý|óŠ=wÊŸ>ýc~RŽ'ûã0Ǩ÷=ìóQÿaÀ·«Ü€Å]¶÷ž`Ù-ðÎÉqîöö¶lípîÒ G<Ë®ìÚýõ\?ð&™¨öô×ÍŸ?²Û—Eç­ô5áÏÕrª}é7TýÛøNê/»€ÊÂ4M²¯ãþ$z˜û7+þïËÌ?½ˆþÿZþò¿Ø ÿd’P§©þ{fR èÑT$,ê•ÈcÉûÿÅy(úÿÛ"›ˆendstream +endobj +1420 0 obj << +/Type /Page +/Contents 1421 0 R +/Resources 1419 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1398 0 R +>> endobj +1422 0 obj << +/D [1420 0 R /XYZ 85.0394 794.5015 null] +>> endobj +454 0 obj << +/D [1420 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1423 0 obj << +/D [1420 0 R /XYZ 85.0394 749.1193 null] +>> endobj +1419 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1426 0 obj << -/Length 3415 +/Length 1106 /Filter /FlateDecode >> stream -xÚ¥ÙrÛFò]_Á·@Uâx.\µOŠ#;J­å¬¬­Ýª$ ŠHH€!@ÉÌ×o_‚$'ërÉÓè¹zº{úš‰†f'*Ém>Is¯bmâÉl}¡'OÐ÷þÂȘi4ŽúöáâÍ;—Nr•'6™<,keJg™™<ÌŠeÕ%¬ £·ïÞݾÿ÷ýõe꣇Ûw—SëèÝí?ozýáÃõýåÔd±‰Þ~ýãÃÍ=w%²Æ··wß1&çæ•EïoÞÝÜßܽ½¹üåᇋ›‡þ,Ãóíð ¿_üô‹žÌáØ?\håò,ž¼À‡V&Ïíd}ác§bï\À¬.>]ü«_pÐKSÇøçm¦â$Èf¹Š÷¯ïË{hØW@›8¥ 0úxßifT’¤(íUž„âÍ@(Æj•ÃB“4ÎUâ¬#©´ÝîYóæ ƒ“L¥Þâö8èxéR PýÑÔ%ãªVúªuµ*¶ÜÝ5Œ,¤oU<—‡‰WæQùyVn:Ñ- ªŽn/M•›U5+ºRöhêÕiª¦Æ¨<Ž-‘×-augóèLž5ÔÎ[îlÜYðçºh»rË(>b«°ÅüxF¿~Yw¯}˜‡úè“è“ðñ”6‚äkaªÕ:ª›N°üÝvE=çsîØÛŽûĈøîîÓ?zÔžqƒÕûEeÑí†øvSΪŸµ¶³cZù†’ØàÎð>ñð’Uëͪ\Ãù‹®jj5vRâ°Å‡3;G³¢fÜcɈ][΃»!¦\êÔ eA/¨KG‹f˨§ÕN–aIûI‘U!†tÑ™¹JSêŽÑ"zè)ÃP~Þ”—&ª[ù&u€v]TÀ‡ª®ê'™Éx¾ˆ‹¦¸Ïv?Æk6r–ÔÑÆ0¹ìø›„ m]¬Ëе}FM¥Ñó9Ó߶¤V€‚Òý=¾ìI¢2›¥rq±¹š5õb䮃9HÁ&ÈPÐgç\ô°¬dý][< %€Â£L­ã©}rÌiRi÷4e -3'!’…@]¾0ä *>í¶¤T-ØçÌìgíC(ç¦Ým6ͶkGÅŒ{g Û‚HðK'‹#Ô²ŽˆÜK±¿4ÆàaS õV†ÊŽù7ãMd ¸n[Ôí¢Ü¶²Ób°~¯XÓ1a“¶Ù$› ¡™­vÄÄóõ»Ï,v.è«Yó±Æ€Ÿ-«•¨EÍR"#v5 ¦j„q,h—êh]t+RMóðü`2ˆ€jÔG„fèõj¼Î[™>kv«9ƒO%­vM¨—ª[†qõtŒÑºU6MøTÆtÔ–±,_„0ìdÞ"Xtšî àIó‘ñ‘ÀŽæ°àX!ÀiR”f»¤e³®>ãD°kàÄKÚÆ°?/º`‰{ѾZà'èRO¢{_¡ép´ò²U÷;·U–Z°Æ°µQ…zÀ>±çåÜô,³lf˜ù‡ GŒê%BË¢e€Å4B¢è§ö‡sŃ;OëΑNã¢bµâ~qq¾teËxæpäÐ!4BO±j›1©²g!O'oÉ› }_+öW÷ŠˆH>S¬û3ÅúìLæuÖ{GÙ;@”D~RgÁObŸ .¸á¥ùŽc+"Ÿ±;Ò!\Ñ! j›Õík?k„ºm]=UÏhAœ7èæΈKˆÛ¡'ôìK±Á¥ší(ìÃoòa8I£q»nÙl+ žË0†„9zÛÞ±ŸOÀóo CðqˆÀa -:%ŒaÿˆP¯øAç´l•aÊf[=KhSÊî¥ÙþÆ»v:.àúIÝ¿{kr“ñÇÀíÊ öÜI"ƒöT+†/éãƒ$éU aãtî¾Oˆ2ZUõ‰PÅvSŒøðÜ)ðÚF|8…VIÆsà -þ&9ñØB SnëbÅ£„¥40°4$gR²û›4Dz¦ÛÒ_\øà‹ëà“bS§™™Ï¼Ê—L†ùÌWæH^;Ä@³3¹&ÙßX´ŸòZâåR§|ÆIäHâElrñÄç6™,!~?^Ší|D–iªR £úÜËû<úÙZÏS$E@$êvðúqlñvz1øM×Úýdä`MÒlÄáêÊ£M9Ù°f3aM=m{jÁo]˹†|&9ŽEVúüìÖ©ô0’¢Ž²Þ€¢¯»ý¦[?Å×ÉÜ×ùë2•¤YÈmÉãêÀžN΂æã|}ˆ“íA.bv§§V¥yœžzéQ0zβL‚x÷M0Gû¹X¥ÖgÇçÁû4Â;¡úÛ®$öZV3´A­zZ„ŠÍ†"e4° £~ß•Ûª”ߘØdíñ-GkF<ÒiðÀÙA tïB|Üs·ŒK{Ïœ’¥!MI¢Û… š@l bäæ_áQYÚ‹Ÿx„“ÄÊ; g-9 £‹ƒíFl¼t؈ü†'5·åzÓí\U­ ZŒ -Ï$`Àžü­Êmò¯@ 1òª/@Ì%8’ñ`J\~|¤ÓËì|:8ù)®2/‘1¢ØÅzqû˜ô^q·c zXLƇ–vÖµÜsW„,w/©Ë2ö”’Ÿs晲Yâ…+͆Rıۜ¨¼çs¯ù'1ÄÅ»°Ù‚7Û7;^ -NÊØ>Zñ–¬úpóljüi•©WFögj}.Ézù‡ålYÔOG1% ,!Ь‚# “ûóiœoÁÜ Éǧ -5Æ\i«óžo½òʧùé™(.´ÞBökñÌ’>Ìï¬÷çn{Ñ‹lÛŽ=NîîDQi½±‰˜¼a‡,NŒôs5+y† ÅÕ˜&=î:®­°Ü"³e‰rL*7‰Äîõ õ6 e…§rhÒ±a ©R}lÃÆaÔ RYm±?'É2D?ý=äF_BžÔ€Sý;Q”Lx5ÜÑÐïs÷…:3\@±OJ,¯Ñ}±Îü@¬3Xt¨ºŠx\€ý¿eI4`¥PFC¼‰KHÛ—<)çÄŽCx\¨` ª$ÑG_!¨Mãþà -nr3}©á®ÀúÁ» ª¹¹¤.Ù çO’ˆ†[$œ*…&gjOçÐéGîKOf/´T—oêMI´nÚŽ!©8I©*‡“âáÆIÈ¿êSº©‹SöçØßp?VGþ°ûÅöXRÖJÊ=³UÑÊ Û»+ø8-œ`a±eÑâÌf½©Vå|JÎórQìV£Ivd$;2ƒã× 'Ò,*8qFï-RÇùÌå:‚`Nk†nïd•S7Ü>îªU7åî©…Tq:²ã«†cp'¿ê–ÌFæ ‚IìßX1ÌxÍpX“)¸W¨2èôr8Ì/3 -VåÕ‡§áùçÄ„89dUyoCØMÛ(´\JAˆ³Ê:MÈTe‚žÓí‰QÅNc§ ‹×‹mÑvÛKˆfý#ËŸ?¡ÅõD±¯Þ~üpÅ]w7ønyÅÕ¿÷ïÑ%)î»®ÃOݾp‘Ñ„,K…²z¸ÀÕ3lQÊ#ÆëÍ®Í8r+?ã+ÕÏ!k !>ø°¶Ho}f}ö¿g| ¡ Îú4ÅtìùŽ)/¨:orK~Úä.ºûïw?\ßÞ)F³dš7¥ ¡7šÃé ‚(eì#â -²8ªüL¼7¼Ú˜Xrï?Òð(.w©N‹‡«²„|G_«ç˜¿¨ÔpLì‚_¤b«#‚°ñ‚ˆûœQÄí8(‰Œ?èE3ñ°“Ž“Ø°éiûå°ex±¿ÎVÌÏáý‹ïò0'ÎããgùÿkR (P™ê ò³Ê%¨ðšöªoÓ ‚6ç&ø{ˆ}ÒÃÏ"Ž ò“ãS•¦&éaá?PP ·™œÉˆBhÜF´ð}¤drV¹oZ†Ù%#DµI8o—¿eÀ¢Y­š¾pš2ul nÈÝÒ5ÑäÎO»¬Â®|õГ³2úü:@f )¯ õ -p#fݩ̧!ßAÓ9^*5©Êµ ·TÐ,ÇBMå!4œhL=XZŸÛ“ò@Höà;|<Å$@÷ÞE÷ý³f+·¬;+tŠÕx.Zé[¿Š•&€ô v7så]œõb92€:Ü[–mÕ¼– æ.ÔDrøh^IK¯Â öOìá½¾B¹&ô<4“·ù¯·ßÈ’?rǯl–q)a?’p6ºíŽ 8ÿ1@»,®tg*ÏO“Ö#ÒPG‹GtqdÕŸ‹mÕ¯F…Ü·]¹n¹ßâååÒáO!vX£é2‚Þ2©r7>Çn†o¶T+—•9¢†9ølƒ-þ&bê‘0¿•û—ÁÏþÜ!|ÿiì@Æ)ÿ .Dú(µõ}ÝÔûõ‰Ê±.¨×~ëä¨6öË$øõï ?ƒç²ÌŒáQ4M! -Ϙú3ÊVÖ!>'ýÿÞüendstream +xÚÍXÛnã6}÷WèÑ)@®H‰º OÙÔI³èf[¯û”#Ñ»º-IÇqêþ{)QräKÉNÂ0$ ÉÃ3Ù!‡È²õYă^ˆCË]HlD¬(ØÖ\·] PÝ4@»×ÇÉàÃ¥ã[! =ìY“Y +€v kß=ˆá™F°‡_n.¯¯~ŸŸùîprýåæ `b/¯™·«ñùçÏçã3€‚†?Ÿÿ:M“Wc|¼¾ùÉHBóxt<ºG7£³»É§Áh²Ñ¥­/²R‘ïƒÛ;ÛŠµÚŸ6t€XKýaC†ØJ.q q§‘$ƒ¯ƒß6€­ÖjèAû!bÇà 袖C \Ë'!ôìTüûÇR 8!@†„àVã‡KŒ¬x¦'®¯çñÍ`¢ÍjÛöð9Ϙ±ÑWEKY¦jë š¦T¼-Zˆbà ‚WcM3šÖŸ·QB¥¼3U¬±ÃÒÌ5iãjUÔ#R*FA{[³[Óƒ&I¾ßL¬\#cÁ¤œ¦TEÓ„KeäÚ Õó®&ȳS`Ñ>¬4“3&Þ™í¢ˆõj½¨EžðhÛ°¦ejZ¦b‘4‹ !¼ëc ™ƒ,W|¶ Ï‹iÉ»Æ,r¡6òò£ž¡žàöˆ1šfî³5¢}¥#K#øÃ&ö’Šl=£Ü’'qDEld+&§¹˜fyg:¾µ³ž:2ôìèÓ?@JϨ@’|Þrl‘Þ7;BG”f<Ö.Ÿ/TW$ô*’âi/¤-NíT¾c—µy°§Bo\m MØ‚Ò½{Nb–ÐzdQžÅ²³Ú5‚ÊÌi*÷ßØjßL¯½÷ôûšÔ$b/)€n+\×ò|èøØÕ8Ðw·‚ù¡j"0ô}ÏjÉ_2Ç[±nØä;Ð!ÿfAÃÍ€@GÏ^Ó$¯Ð$GÒ Äö³<‚©O²úøÃ#ylàJ>4á±Þ«}R<6›CÏ+‘ô?Ó¡Ï?q“Ñz†[¥|Rµïõròî©•>Ò£}ªS«`3­ÀC•„ŽNŠÇ€ }&JŸûOäq„N.zË,RySÕT=T•T%ž™(ÖenJ%o»<Ø©ÂÚ¥cUÜÕÍ'wx§¸“ }do×vŠ„Ó«°ÿkÁˆß³`> endobj 1427 0 obj << /D [1425 0 R /XYZ 56.6929 794.5015 null] >> endobj -466 0 obj << -/D [1425 0 R /XYZ 56.6929 167.2075 null] +458 0 obj << +/D [1425 0 R /XYZ 56.6929 720.2271 null] >> endobj -1428 0 obj << -/D [1425 0 R /XYZ 56.6929 139.8789 null] +1309 0 obj << +/D [1425 0 R /XYZ 56.6929 692.8842 null] >> endobj 1424 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R >> +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1431 0 obj << -/Length 2969 +1430 0 obj << +/Length 1141 /Filter /FlateDecode >> stream -xÚµ[[sÛ6~÷¯Ð£'jYµÕºÚÚ[뮧ÈÛbã$í-´ÚŽ]¹Y-q±ç„/ÿ[íÝMÞæüP9 KgÏ:ß›ØCV„ -í¼¹/ìð4‡b]þ1í´BÇsÙ>Ú–Ñ O~ÅÉ 6ÂŒˆs¤úðÑ‚‚2Š˜T™C­·y6[ØPÖŠP”ʲŊIÄ” ´!Í®aŒ{/Á ‡¶¬öMD%Œ°–g’ Aù‰©ã@«!ÊŽ<™y2åÛmõ¼‚á/^ÆÊ 'ˆ+9£Ý£&ÔãFx†x¦Fú?ÅqDºÆ¦hÖuÙ…ÃvTáÕaʵ…±#ÕB!Í@³—û±£Œ0”ŽÚ›õ§…mÜ\öø—c¹ÖåõÑ9C‰L‚A¥ZÏÄÞ£æ ‰¤CÐI¶qH4ÉfØ6@%ØÖ£Žãô婨'È8ExZ¹GMhÉ&à.dÃ@ý[’Í;1æšDŠâÓ\ƒé‚GANrÍág<Žå¾žkÒ¼Ke–½GÍIKs kxå)9õ*Áµ5¦U @ -/Œ¤~š0  [®bÈõÿŒn*¦›óc¤\R$e&N34ÕB®¦×ãgœŽå¾šqK¤¥`éè{ÔŒ!±´$ã„!(3Œ¢N3ΣŽ#ÕÖù¾y€ÅT”à4¢T¥Õ÷  õßGkêK¾ ½)Ï2”IÐ}’oFxšâ[Ÿq:–ûú §’ -Ïß£æ ‰¤¥ù %aPÓ| |ëQÇ‘z:À -¹ˆÙ™KPÖîQêC¾A~cœ†úß’oG/Æl£HaÐ|šm\ a˜“lsø—c¹ß°v3´ÀY:ö5gH$-Í6äÄzŽmT‚m=Êh´#´:TÛr=±zSˆPÊÓê=jBH7f6Î24à£ßÎ56þ¹ýóHüXî[GB£'»ß´×¿u†”½vB Š°¾Â‘ÇcotÂ`Í7´4E«?ãZ,w’Vtê¥ °ôeé{ÔŒ!±´$­¸â¨Ó´¢NÓÊ£ÆÓ;üç¼Þ”ûOc;(†¸Áö1mˆGMX2tžbDºõÿÉg#‡Æ4' ­ÈÉÜÆ6W8 ¡ÇϸË}ýÊ œÍˆâéqð¨9C"iiB^`ŠÍ‘p€J°GÙ1kªSEK-Íg”{Ô„ö`Ȭ朗ÿ°ß¾@Ø©^îŠ|dyxÚÚërŠoàŒ^¿à?Yõ€å’²ßµvµ;˜Ã -lÛÔ Ñ>ö·ÿ®ö…ÉŠ˜-ï¬)ZÛö[+óõc¹/šþáÜÝ.·În›×…W•O”Ûh&—ª·ÿxÓ•Û „CFâ}QÏÖxo>Ü]_ýgª§¾¯Ç튦É?ÆçŸiXÿV¶Ïög6®çé`ÿ7 67ÞØÇb[6] Ó´÷ùÎõ6Eýµ¨‚?°À®˜jÍ÷#!‡ºÜå¶v`VÖú €¹ËAM ’<Á©óVg½ÐuØ>5¶•ï_lãúW×±ÙØqhš¢±Ï%QƒéJ¢1Å(,»¨ÈŽ9-˜Ñ,,ïK¦x®äò™WÕ­mírgÞ}1²åœ,Á,ºD[·5Ñ-€yæÂʈI*^e­ °¥Ïzk1²ÚªÔýÆõØSýL³¬±< RfEÒ°u›"¸c‚Š™ àõò?m{能 ‰aªœ¬ÊÌÉ@0)f<%HrÁ‡ 2;Àm#È5pm³©›·O÷¶ehÖ¸EÒÝñ¥è¬6½TÿÊ,v‡öÅ6Íl9™Ë™äˆc{:r:—Q§s¹GuùÇbýyefg¯RÊ”žQîQÚÃ# ‰ÉSú;›j8¤·n`.L¦ï©é&ž Xe{ûÚº\·îŽä<ÉkH×Ì°0Q&ïÈ ˜æeßæÙÎŽAæ¹¢nóÒiÞT;Ûæ6e5Π½Ï?’òQ®µù€,[š ºíž‚ Pû}ån˜tÝ5œ‡jßô¸AúßØž{&´³WÖEhì‹ö¹ª?wnÊRÌt'\|ÍëÒ°^W¤nIeeUSg@û“•öåP8 -_UõÄÔÊ2„a)Ö¿@¬ï“ç>Ò¢ƒu3#Z-†câÍ-‡çd<äåvjYoEMéô´élR¬÷5ÛüëԚŸ1ö†–ÚvªI¢œ-?5õ‰†,ÉÌÔ S¿G§þî¯hÞSØwjIÓš=jBu¸†ƒÝ©9 t¿ÍæaèÁø-+PÆÕé2/…!‚¨ÀÉÄfÁãgÜåžÚ,h ï2I4KÇÝ£f ‰¥%YF gÆgX6Df™GÇÖº›5líâƒo])Òú=j€0hÈÏJ…¼%׆~Ä D+•8X0»mLW“ ?ãt,÷ÕŒãØT5´LGߣf ‰¥¥' ¾˜ÐÆ P Æõ¨ãH•û¶øT—m¼E…‰‘ X4' ð¨ BÊ)óaˆ -MxKÊŽŒ9GÁ4Á9&aäXàkŠs=~ÆëXî7pŽ£ŒJ™¿GÍKKsÎ|eÂÔç¨çzÔq¨šò~;Që¾åàð -Lª÷¨ ý!ãâTëЀ·9¬Ü/0¤´Ö‰ãóé =M/8üŒÏ±Ü׿U5F”Òtì{ÐœcYI² Ü4­I² Q§ÉæQÝš´¨Í>vÕTùªm·q‚Ã0JD¥ ð¨ Bº¯’‘Є·¡Û„#cÂ)Äxâð¶œ*¸šÌo?ãt,÷øfÎ]OGß£æ ‰¤¥)T:G¹*A¹58βùásó9â\,!ÙŒ5aBÀ9‰‘ÔrdÃÛ¼T§<ô ³L&>€3å>94oî´ËágÜŽå¾þ­ -»1-2Ž¿GÍKK³Î|äÉ2iÖ P Öõ(£±­_Víú°ª‹‡ºh§ìÔeÚš°`œè,ø Þ&ÏMø1ÎsÉÄn•1¶ÁBoèB2Ï9üŒÏ±ÜoÈs°Ôð2Lß£æ ‰¤¥‡a᫲™|‡¨ãz”Ñh>Ÿ¾Ï›øÊá-Ûú¤fšPPj¤2X¬º»û®bÎû²&Ó]AÎvÙ‚%>ÚhïW¶÷Þ¡\Í”» -µ4mUÛ Ìq(÷Àî÷5EóÌñ‘‡ÊÒ¦¾à†64,,ã«Â›Í?þ¹xyvµJÐB¥­›¿°ý©í7ò…=M¢j™»›¹ýcJç¶ÕÅÏe[4‡|]¬6ŶܕîQ¹ìµ˜B=,)ÇpÔnë^ÎÈ–M±oË•;osv~ú-´t©Çêºa ¿³‡]=Úôu‡P¦Ñ<Ý7Å—'ûÛ=°ÒáüpqÈ›nŒ»àÓ“ùõAoF•6Çݾ/‚0q)huj«àÃ/Ižó—Ñ/Ö.WVãœyÔìKÌ'~Â2?ݘ˜]ðßüÿBäøón~lpr¹o -£Þ()Æ–ûŸ’Ħÿýì{endstream +xÚÍX[s£6~÷¯à1îŒ$!@³OÙÔÙf§›m]÷ÉÍxˆ„†Û"ygÝÿ^q1/¾@6ӎǃЧs¾óݦ«Òl +u Íb¤:¢ští^µ}¡ê°ù4¿z?_Kc™ØÔf~ˆºm#mæÍÏ.¹øm6™Ž¦ú™ Ç€šúÙû뛟ËV>.?ß\]øsz1¶Œ³Ùõ盲z:¹šL'7—“1@6Eª?®öt¸ºþuR–>L/>}º˜ŽogG“YíKÓ_¤“Ü‘/£ù­®yÊí#fSíI½è1†µhdP©AȦ&ý1ú½l´]»ø£Ä†ÔÆVjˆt2ƒYšE4 &ƒó10uýÌ Ãä ,SÏ‘øIöäd^ߗߪoI]ÀÈ(}´µÏ –êvü©­è©Rq„ñoÛ¸·º5æÃuŸÎy5©Âm Þ–Ñ\¸Çä‘k¼ #Lî"—ÑÏzeŠÌœX¨ð‚ÀSÉħáÃ@ÉR¾IQ“Ða ¡&5”ÍU:àÏi¸A[¥j@>uô +xo’*#¯£4ä%÷à!žQ'ÏÆkyF;< ¹¼;D^y£ñeɳÕ»Åh`‚ÍÁy,úööþã;ƒ®û8Ba~‰Öq{¦þÕد¾«Û^dj•¶m\_ÃaÒ¸†#º m̬Q¹ÏÙµ¼¾ÔûÞôh÷Lendstream endobj -1430 0 obj << +1429 0 obj << /Type /Page -/Contents 1431 0 R -/Resources 1429 0 R +/Contents 1430 0 R +/Resources 1428 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R -/Annots [ 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R ] +/Parent 1432 0 R >> endobj -1434 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [312.6233 667.7189 381.2953 679.7785] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +1431 0 obj << +/D [1429 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1428 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1435 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [310.4119 636.5559 379.0839 648.6156] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +/Length 2154 +/Filter /FlateDecode +>> +stream +xÚÕËrÛFò®¯àÚ2Ƙ^å“ìHŽRk%+3—UT*ŠH@€ €¢¹ñþûvOÏ€ Z²T9¤t@OOOwO¿‡â£þø(ŒX”Št§Š…GÓåI0º‡½'ÜÒøŽÈïS½Ÿ¼½ñ(ei$¢ÑxÞã•° Iøh<»ñ"&Ø)p¼?_]\~üõúì4VÞøòç«S_„wqùÏs‚>^Ÿ}útv}êó$äÞ‡Ï~Ÿ_ÓVdy¼¿¼ú0)}Ž0½>¿8¿>¿úp~z;þéä|ÜÝ¥_H¼ÈNnnƒÑ ®ýÓIÀdš„£ ,ÆÓTŒ–'*”,TR:Lqòùä_ÃÞ®9:h?0!#1`@Å{LÀ*SI!oNý(¼yUo²zF‹ß‚0¨Êbûuž×M +Nøwô¹Å[ƒhŸs–†¡à£ë†ÖÒÇîæ«»l6«-nUÕm‡ÇÅížƘ“g>ÿ{†øeÖ´ì£þÜ]sïØ]‘7öÀ×ïQøæ½%€ÛŽù¾Õnà>ß¾ ß¿É¿­³²™ëÚÏg…öó’vÊõr¢ëg{dQ›/_Ìhµžt÷ì=7m—÷ßb¿wáNǦZ×S½sQ¾R='|5,xœ2)â8±XÉÐ0ú‡Ù +YÇѨ‡ß¹â©#ý°@0 ‡Íp §ÿõU«šÆL@Þý5ªŠ@BîÇé ªYÑúßeÖ7ÔIÑU½T×” †ƒîÐõIÓ +Áƒè/2­ˆW‰4íºÑþQónusWÕweõŒ¬úoUj¿i³JO>m<;{fY›M²F?7õöKD^úµž×ºY˜ +ñâ:ó&ü±&m½}­¯c±.Úܧ¦ð´C|!YÊM‚÷.5Þ + mÊôöÎïweæ4¼™YÓtýÉD÷Ûv»Ò{öÝÓÍøoØÔ÷c[ú¤*}¼À÷{D zD¾Ö#âÀ#z¾{R—·‚:ôUƒÑ,»ÑV@äUŽfÏÏP+ôR—--п(sK˜¬œðk“ÝëNÎnD (–*.{r·’þÝIŸ¦`ç•n§Ü„³(ŠùHèÇÏs¡µ„i¸?å¾èÓ¢çÈ£òé\¬,èNì³òÝ|‘H¨X OÐœ£Ý`rð “”œi ZöÈcÅbž& ÉÆ ´+˜´Ñõ„ä”HR/£µ+:O«Õ– jND­cåž ÈMº=*ÈÓD 6yQ4ÑCyžM +ëó¶¢ïª>å‰W=ä3»‘­ÛEUçبªl6¦&à‚ô oÙa¼¨D±$’ѨoÝ×9 #ƒ§Ì0Qô]1`O‹(fI¨Ž†@ÌRÉùH€w£8IŒ›"{ÐCˆä6ÎÐ+±¥5 sUâå a2úëëU‘O3Ú§èö»0±L ¨*!Lˆ=Îwœ»b´zÐ ×f@[³X8mé-d^éiîÛj¦b¦¢Díj,AÚBìÙò*ׄXVtZ]þB»¦e ºiº“s{À]È(W,A»ÈZY!Θ€›BÝ +î6›¶Ž‰îÈ[¯ 챜6#—n"‘“Ò™XÊÀûä^˜H`mPú±&;VYIè¬hª! } ¦ÅvÓˆBͤÖ&»×,âQVJ€‡¼÷[ÂÍô<ƒYå yßÍ¢ö@æÌ.MÀÌôP‹Sž/Aݘ{Ô¼E,¼PÆ4ø’)°y‡¡"&pOW†“K8]d彞тª™)D@¶s,`'Û!#™¸›oÍ$+•ÂØ—*´J"Âuˆèyg¸gÆ ò¢Œ…ƒ!høõCl(# +ZC[m6¤ØJ›s~WÈCåÁðmL`6oÖF²a¿' +|y…"2ݵpeã´w|×bhì.yD¡f \¢Ã¤"b6y» èPuÄ?_~$Þ÷¨V¤Þåܲ%^˜á…å†÷įñIýÙ›Áă{¥»{uM†Òv&ÜšX’ 4™¶;X9F(@"xhºF_UU„òfH/™èqR“”°ºdŠÅì’WV€:6ߌ>];†ð¶«[¬ÏQ™;5w§\êØ‹€S_èxM«%T™™Ñ]pHƼœ:–¾ÕÜÏ€ô¬!tª£FëÑŒX]äË|°€–P+m—Çö£R¯Æ„0!7œšÊ `»Ég태ÞUå(\ wT©î-eõ çÌhpW‘d uÙÊ$/`ëÒfÙÌíÌ-í¢Z7 [CïŸÝ7QÓÕÊx°+vøÛ/–X|Ó´´qXÜVujÒ&°ÀŸ ‘ѺÝT~![Ê¿©n¸ÕLzi©í0%º±_Ú 0ý‚QJ^‘ôô—A·eËU¡ßì¦K(×ÝèÑ @“¸ÄUùÄÊ5Âþðr–ÀÃÁŽú‹‘Á ,¦‰Fä0nêÈï-IYÙT»þ¡Ý-S¡8x&ÙL†º ͽ¥þŠ«¼4… Œ>]F")ôÈàí•`A,ÂNû·ß¾@3¨2‘%ß,´í/9KŒ•Ú1à&`¼-- 4ƒgW¼H¿¯M Au"€7¬;ì¦" 8…Ämí@k“ýc6€ÂÐaøHL}ª³ +Âz‰CX6[Èæe3<µ,27üCðl jŠjSX8ŸÓw[­í;bm³ß–A@0yËVò¥+.ÈTqÏ‘Yn _[8%™Ì=öÀèî¯{ (‘àO‹à)˜\ ýç%èï¯þ?ÏîŸ`0`Ãì'º×Ç~Å S 0‘!C^è•X=ú/”û‡¥ê©þ&4Cendstream +endobj +1434 0 obj << +/Type /Page +/Contents 1435 0 R +/Resources 1433 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1432 0 R >> endobj 1436 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [340.2996 605.393 408.9716 617.4526] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +/D [1434 0 R /XYZ 56.6929 794.5015 null] +>> endobj +462 0 obj << +/D [1434 0 R /XYZ 56.6929 373.8367 null] >> endobj 1437 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [328.1051 574.23 396.7771 586.2897] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +/D [1434 0 R /XYZ 56.6929 343.7228 null] +>> endobj +466 0 obj << +/D [1434 0 R /XYZ 56.6929 343.7228 null] >> endobj 1438 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [320.3548 543.0671 389.0268 555.1267] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +/D [1434 0 R /XYZ 56.6929 319.3114 null] >> endobj 1439 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.1386 511.9042 427.8106 523.9638] -/Subtype /Link -/A << /S /GoTo /D (dynamic_update_policies) >> +/D [1434 0 R /XYZ 56.6929 319.3114 null] >> endobj 1440 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [429.9426 480.7412 498.6146 492.8008] -/Subtype /Link -/A << /S /GoTo /D (access_control) >> +/D [1434 0 R /XYZ 56.6929 307.3563 null] >> endobj -1441 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [286.0435 315.5214 354.7155 327.581] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> ->> endobj -1442 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [339.144 284.3584 407.816 296.4181] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +1433 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F21 710 0 R /F23 734 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1443 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [336.952 253.1955 405.624 265.2551] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> ->> endobj -1444 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [322.5463 222.0326 391.2183 234.0922] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/Length 3493 +/Filter /FlateDecode +>> +stream +xÚ¥ÙrãÆñ]_Á·@U"vN•'y-­åÊj­RI•íˆEØ$@ ´Ìק¯Aò‘­-í4z®žîž¾†z¢àŸžd>V6w“4w±WÚOfë 5y†¾ZÆLàépÔ7ïnm:Éã<1Éäq1X+‹U–éÉãüÇèýw×?<Þ<\NWQ_N}¢¢oîî¿eLÎÍûO÷·wþõp}™ºèñîÓ=£nnonîßß\Nuæ5Ì7²ÂnïþqÃЇ‡ë¯.~üþâæ±?Ëð¼ZY<Èo?þ¬&s8ö÷*¶yæ'¯ð¡bçf²¾pÞÆÞY0«‹ÏÿìôÒÔ1þ9“Å>É2Y{íÜÛûò +öÐ$6V}¼ïTk…ød2õÊÅy–ê^*N¤¢]›$#ûA³]Ò²ˆYW_ð +"Ø5pâ%ícXȈŸ]°Ä½è_-ðt©'ѽ¯Pt8ZyYªû@­ÂÛ*K-XcØÇš¨B=`Ÿ‡Øs€rnz–63ÌüÄ#FõŽ¡eÑ2Àb!QôS¹Ã¹üàÎÓºs¤SÛ¨X­¸_\œëcdÙ2ž…9yD#tÐS¬ÚfLªìYÈÓ‰Ç[òfCß׊ýU½""’ÏäU&¯ÎÎô{ÞQe½w½#D)Aä'Uü$öÉà‚¾QŠï8¶"ò»# ¶Yíоö³F¨+ÐÖ¥Ñsõ‚Áyƒnጸ„¸zBǾŒPªÙŽÂ>ü&†4·ë–Ͷ ᥠcH˜£·í–ý|ž·Àx‚ó!"‡Q€(è”0†ý#B½~àÓ°U†)›mõ"¡L)»×fû+ìÚéx¸€ë'Iôpû^ç:ãÛ•칓Dí©0V _ÒÇIÒ«@ÂÆéÜ}Ÿ~UO‘ˆ¸ØnŠžÛ¼¶N¡U’±À,ø‚¿I@Vü¶ȔۺXñ(a) ,MDÉ™”ìþÃfÇͱ¬é¶ô>øâz|@¬cñijæµ 4ƒlæ+S$§, €Ôgª­†Ä5Éþ¢ý”7ó.›ÚØeœDŽå]°øÄå2é,!^/^‹í|DŽi§ +Fõy—syô“1Ž§Hz€HÔ!ìà/ôáØâÍtb$ð›®.´'ºÉÈÁš¤ÕˆÃûÓ/”G›r,ªa­ &Âh=m—zjÀg]˹†LYŽEúüìÆÆéa$De¼E4ZwûM9¶~Šá®•¹oó×fq’f!¯%û‹«{:9 šŽóõ!F6¹ˆÉJ4œš8Í}zê¡G ÀÈ9Ë2YbÝwÁíg}œ—ŸïÒHø·Åggl»’¸kYÍÐþ8´Dèe*6Š’Ѹ6ŒúmWn«Râ{­=° Òÿ£Ž–Œx¤Òà}³ƒ¨Þ} ø´çn—ö^9%+Cš’Dw A5#,€¸ öÈÍ?Ãgi/~âANâcg­?ÎZò?KÛØwé0ù" MjnËõ¦Û3¸ªZ´žN4Ùÿ)ÂMœ›,ä^bäU_| +˜Kp$íÀ”ØüøH§—Ùºt qòQÝ:e3N¢bD±{uâò1á½âànÇ ’󰘌ï,Áë¬k¹ç4¦î^Ò–eì (ý9$>ç ̳Ød`®™+͆ÒñۜÄyÏç^ó1&N<ÄÄ»°Ù‚7Û7;^ NÈØ>ñ”¬úpóLªÝi…©7Fögj\.‰z÷‡ÑälYÔÏGñ$ *!Ȭ‚ “ûpóyœožÀÜ ÉùS…ãG+£òžo½r±KóÓ3QLhœÌË+ñÊ>ÌíŒsçn{Ñ‹lÛŽ=NînEQi½±‰˜¸a‡,NŒôK5+y† +ÅÕ˜&=í:®«°Ü"³¥‰ptª6‰ÄíõA õ6 e…çrhR^3†Ô©< ¶aã0ꩤ¶ØŸ‰“d"Ÿþ¿î ƒˆ¯ŒLáNªÁ¥þ•J&¼ê(àrû%f¸1¤§)qœF÷‡%æGâœÆzCÕUÄ:øàªìþ ¢i+52BM\BÚ¾ÚIé v½ãBcP#‰>ú +1Õh÷oÖo‹”è« w–¦ÞmPËçj6"¸Z7œ;íªU7åêí©…Tñ9²ãvcp#¿ê’¬FÑŸÓeÅ0ãM»aTk•½a6tÛ,O&3ËL¥ÂƒUùL•áixø9± Žžè¼· ì£MZ®¡ ÄžÙDeª%d§ƒ*AÏén„Äb'‹±Ç†ÅëŶh»í% ³þuå÷_~ÐÁâSBüL¯‹ÞúxÅ]÷7øryÅe¿OÐÅÜw]‡·º}åê¢é3Öeõp}«Ø¢”×# Ö›]7˜qØV~Áç5*œCÊÂA|é9`l‘Þú(Ìú´Ïø¢BœõágŠáçØ»S^PY^熜´ÎmtÿŸo?}¼¾»Í’EhÞ”2„hç2¢”±ˆCD¨Äâ¨ò ñ^ójc6`Él¼qü:À“øsÜ¥:­®Êbò }«£ÿ¤Nà ÐÞ¯HUVKq{ˆ½ñ[s¹Ë ‘Á… 8ÆËÏ8é8} ;žf¯GËY9³ ÅQ°kE0Tl̆FÊdŒ\|Kã$wô.ÎÛç ƒò~üt8LÆqH|¶.Rµ‹=áñ" Á0ØKsDÑÙK}?j„Ž£ˆûl5~C·Õ+øu†õ`«¿6øß/ÀŸûã_/ü_“@AœA²‹–U†œ<ç¨ÂÉ«$i+«ßløa†v´“Cñ÷þƒË¬Àò‘Û¹< ¤OŸä‡˜Rç|=ÿÖ2ÌÁ BTÀE€LLøûI,šÕªye㤨¤mÁ &dR>§] VaW6WjéÍ72úÜt@ +çF‡Â#ÐÆ™KCbˆnf¼ž¬Ó8W&¼ßQÕ· ÊÖÑTzXPsF6uà•@Ïý±= Y1œ`‡/̘-©Þ«¾ÖlÅ(ugÕ`1$/E+}ëâñ(ÃL™^¶T(Í}/æ‘#¨|`Ͳl«æ­”9·!†Éá/ *iééœÁþwáG †ëàAoh3ùÃÀèÂ×ǻǿɒ?pÇ/lÅq¹s¿$±&ºëŽ 8ÿÅD»,aÇÔgqž²{‘Ì4ÔÑâ Ãò€/Ŷj(®A…Ü·]¹n¹,Ÿäy×âïEvX<¤é2‚|©’\>Çn†o¶ô  +sîsðm [üáÈÔY-É`~-÷¯ƒßnüþ+ÈwŸÇnX ç³AôQ öuSï×'*Ǻ¿õ‹0KC=æàOXüÕ?;ü–®œÍ2ó† V3P…§Lý™±Yì3“Žÿ?EØ endstream +endobj +1442 0 obj << +/Type /Page +/Contents 1443 0 R +/Resources 1441 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1432 0 R +/Annots [ 1445 0 R ] >> endobj 1445 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [331.4327 190.8696 400.1047 202.9292] +/Rect [280.2146 205.1117 375.7455 217.8489] /Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/A << /S /GoTo /D (root_delegation_only) >> >> endobj -1446 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [361.2812 159.7067 429.9532 171.7663] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> ->> endobj -1447 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [330.3165 128.5437 398.9885 140.6034] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> ->> endobj -1432 0 obj << -/D [1430 0 R /XYZ 85.0394 794.5015 null] +1444 0 obj << +/D [1442 0 R /XYZ 85.0394 794.5015 null] >> endobj 470 0 obj << -/D [1430 0 R /XYZ 85.0394 726.6924 null] +/D [1442 0 R /XYZ 85.0394 162.5022 null] >> endobj -1433 0 obj << -/D [1430 0 R /XYZ 85.0394 700.1172 null] +1446 0 obj << +/D [1442 0 R /XYZ 85.0394 137.1661 null] >> endobj -1429 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R >> +1441 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1450 0 obj << -/Length 3050 +/Length 2962 /Filter /FlateDecode >> stream -xÚµZ[sÛ¶~÷¯Ðô¥òL…q{LS;ÇÓ¤Çq§iú@‹”Íš"uD*®óëÏâFñ -6§éd2†€Ø]àÛÅâ‚WüÃ+ÆWD­„Š‹0[m÷ÑêÚÞ\`‡ÙxЦ‹úîîâÛk*V -)Nøên×éK¢HJ¼ºK[sDÐ%ô­_¿{{}óæçÛW—"^ßݼ{{¹!,Z_ßüûÊ–ÞܾúñÇW·—,^¿þ׫Ÿî®nmw}|wóö{[£ìŸ™No¯®¯n¯Þ¾¾ºüý«»Ö–®½8¢Úÿ^üö{´JÁì."D•d«gø!¬Yí/bF‹)õ5ÅÅû‹ÿ´vZͧ“ã‡#D('Hhg%FL)¶L!N¡IàÝc6Åxf»äT4öG^k˾½Žeç{NÅ‘¡úïŽ÷ÍWÕ“B’R(‡úF÷GýÀBÏêëK¼®m¹Lšü£Ÿ—›}¶¯Ž/öçñËu–nî‹dû´iìO¯iÒ$÷IÁ¤ÑH€¹é/j¬Ê¼œªÑŠ®6ŠÀK¾Ú`ŒcĨØ$O™ÖĈy8í³²©‘ù$¬³±4ØwÍcv±4^LŠ“@)uf¶áPÕu~_d¶)ßÙÚ$Mó&¯Ê¤°õg]ukz„8ºÞ“®ú>ËJ[WäåS–ÚÚ¼l*[Û<:`á{MRÃd¼~_í³Öc¬õ—:Ù -gn+ôl»kÉËmqJµ<ýë9omÉÈ3ŸæusÌïOÚ"[e[(«2›èÒ`»wß¼¸Þ,õÐÈ›0ó— aíÓì· MeÉ'¢G‹Ò£‘æ0‰‡¡XÉÀó XšÛõ>Ç@‘žØ÷Y6ϬÞóÃy8«s­® J ˆ€KFå2)ø)Ès0ì}èÓ3Ð6V¶pÛ1µÅ/Ø:î×»=›¥Ã5æT‚˜.1‘á1oQKŠŒzÓŠÌÓ b¬<^ W —G™ÊŠì!ÑÖoª²xÊ É‚-jBƒ®Ñ0òˆ:PÁ†wÅ×¢ˆ&ºÌÖFS›EnÂ$üÐQEÿ}„cI™Úªº9ÝÛÒ'poˆ›8ë›kÍz/ L ¡åãKVOp ¤(‘çUCGvpÒ©æÍød£ Èz΋ÂQÔNó{óàc…"%å ÐÛx”4>%.öémþº–û˜h;Ö%ï¦ý µNürp^¬•›g¬Ò–ò–uP–y”6kWŸ“c:”«("„±°\šÛ‹b‘ˆË¾Üwf(eë}–”yù°;nÚÙz·<17kºé1©mUbÿXåõ¼¤ný‹a©¨³ŒÅ†¾ã8cDÄ}&â}kŽ ì@f¹¶2·É©Îœ¬VÅ¢ªž šZ½+Û¸KòŠ@Çô •ì $8¾Àè2vd…Ê¡qºÑº4>dMÓ~RV¶2)ëg»ŽëÄIðõóc^LF\Jê¬ï&Ǻ™“8úQx®N…“ŸEõìt²5euÜëôDWùá0¶U¶Î{p0ïʳt–ýŒ1 &4Ï}êP_î0¶F°>GÀìà4–Ü‹M`f,þ]Ñ?×&Š`a‡渂d꘧™«}tÍf[ªvøPT÷fœ¡®O¤Ã˜²qs÷¡‰GÑy¬©¨Ù6×sîu0 ûÓEÉV¦°AjL# -[A`ë CÉ0§€‘¢„·ñÙV%ˆì¼Ÿa–.dv,³4ïÖ´Í5H…>óÇ2´µ#§3$“-Me¯v˜ n`$&ˆ°X-P²ƒ -pÒ£LÂõçÎh³1éý0*sDUaé4!½ÇË#W¤/þ—KEÌʆa‘<–b†è»Ó%i4}õOé݋ýaF\·–É>³UšI&(!Z%.¹ÓØ¢z°-"ýQŽ°Ù"ö•)\¯fÖueúò­Sö›"c`Ó%(}jYBÀîææ×ë[d‹ngÉí–*òˆc† µ­°ìáž1¶²íj ‚Ä@®OÛfø5^W7:7áµ3Ïâ¼iºÁìi´€Ã!+óáçBb—u  ªòþ‡¼_¹Ú^€ý£,'#ÆúL5ðgŒÝ[̹œµdÖgb;±Æ»¨yŸiQ=Ÿiö‡ÎaD‡±1[P¢EMhÑéIÂj´¾cË"eZmÍ™€Ï«ÎFÍïeÏGGRŸKàh}Ó1ƒªù‘& ²—H.Œti2,rÄîy’:MÊõ  ¹½l1†ý‡Šûr_¹tCz'’¤sä$[úº¶?- ikø,MbþºÕ6ÍJ½‰˜ÛéHÜïÕ¬8úsߪ¹>'ÃtØðy±Pªï€s>Œ`LbïÁÓ^ -¹¨ÒçC/µQB¯R†2î(«»Ñ´mrïÏlü«7Ñ8ˆóØë°Oj—N ¨ób¯CàD_ -Öá5­ }5aƒðL½@·'œ¡2•1)‚F5OåeíüsãX³©óOãˆ;âˆ-(àA -ôw×EÆ¥§Á—9È™²c ^H$³G:&ø%z¶ŽtZü‚Ùã~gt¢‘NƳðø·¨%MF½Ït((dÄ ¤ë ¤ó(?Y&óÙenÅÊ÷Ùf<#ö¨L†õp˜ 5zÔƒ]ã˜öõørÔ›³fÕ!)Õëä,y„0Ã}“CôøóÇýÎQP UÒûI1 ÏB‹ZPdÜ[˜°óŽ÷]T€59gyZL2VX~YX“5¡JŸ… ¥§¡«Ë?ÄÂŽECRÄ#IæYÈbÄ1=£C,ôøóÇý~ 1"Šð<´¨EƽYH¤DB.„Áhžƒ46ªS3Ž‚°2`…ƒz´ ±"=r « 0µ«É?=»n…¹š§ €¢QÏæ=š“䣈Æ*¬G +ÒQõ5ù{äSÁè7M>¥¯RÚì|jf0`¸kqp ¶è°éÃ>?ƒxRí°ñoAa%F}…‰K5añó:¨õ<Ên6úŒl¸yŽõ…« ‹õ  ±½Gzÿ¥Ý¼+öËí¬üp†!Ãâ¶×汶­ÐWXºìnRà+m®©j?ÿ˜Íí69‹4W1€®ó‡2Ù¸³gˆ 1¾]9ï´ˆ½ÍÓ¿ûþýÕk[Ö}‰ÕÃAŸí#bÞ:¼ØÒùº”èk»$õßÙ[˜jo¥yýdY¶×lP©\[åØëVb ܽœ•IÎJO¼Dô. Åî{ûWxÝð`§k–¿B "øBÚ×ͳ׃üñö¦n`Úê&ߎŸÀF\r,‚Ò[ÐX|/Lê+ˆ¦]ñ7»‰GUJ¿õ’ÿד*ÿf˼5åóSª§,;ø_ÎÞÄ5ååN¿qÜ… -Kló8+¯Ï¯³Œ ©®lmí6)ÛçYæozÚ²Ô²¶µ2ŠpŸÝËˉ·/B?Çðéêyb:‡Ã”CATh¿H3 ,‡×r-ÉÚ¡9¿2@s½)C3¯á¿óß¿ýüüB>ˆJ9—à C©WJÛ*øØWÜkñ±êÿ×è"Rendstream +xÚµ[[sÛ6~÷¯Ð£ÿÞ®Qæ³õ€Q„õ·DŽ!¬é°ôsÏ¡Xëð®…rGiEÇh•*Ä!óÆcìPS†Ò¢´âŠ# `§UužV5œþ 8ã?gÕºØG…1‹âP#–x“ ŒBß­ÿO>84rL©:ŸÛ8¦ Âs:BB‡Ÿp?”ûêÜ`8Ô’4>5eH -NBÁt)eŠ„=T„„ÊŒY]ž«‚`û\Xú¢ÊjD»?äÚï÷Ûˆ:Mç»<ÛW6Ç­ù\ŒÑM‰~=ãlÙƒBSÈŽ•mñ$f0ÆßrÓ65h4OÝã¿Ë}®“"fóå“…Õyc@~ce¶z*öyݽœÙçÏÅÖÚmÒï*wª²‘zMâRQkáOwm¹ "1’˜wU=Sä½»_ÞÞüg¬§ ð¤;ÿìòºÎ>çÚëŸnÿV­¦ÏôhgÖ¶çx0µ››ioÌë±-궆©Ûûlg{ë¼ú–WVÁ',°­¦šW³ý@È¡*v™)@¶¶Ö{Ì]j*Dà N­Ð028ëÜ€®ÃöX›V¶1ÛßlÇzmÆ¡®óÚ¼çÕD5¦­‰†£°ë¢"9 ¼é1œÄ0‡ïjºŒ®äüÊšWVií2kÞc>°å’ÌÁƒ úüÓ‡)ÜêèæÀ¼sacÄ$¯²VPÄhÒYÛ‹‘ÑДݠî×¶Ç œêfšaá™÷’Ò’v„ÓXWÁ-TÈ«Ë&;n;èÆ<…Ä0VN†Õ:ÑWÞ¤˜ð"¼Ÿ ±Ü4¼\ŸM6Ð…óæøhZšfµÝ#-Ok¢µZ褺3ßšÓÔ³ål*g’#ŽÍõÈùTÞGOåÕVäŸòÕ—…žu¸I8¡Ü¡F´û›T LbõK“j8¤»m`6LºïX·O¬4=–}MU¬ûÄLò<É*H×-ô°äéÏZfB£~Ù7Ù_æiKýR^5YaÕ®Ëis“¯jkÍÞ%Iù Ñšä@–ÌõìܶoÁPû®´t®nÖüC¹¯;\/÷¯MÏÆÜíÌ'ã4öyó\V_Ú{7eø¥»O³>|˪°Z•­¤v;ed•c7@»k•æå[þÞ”ÕȼJ„aÖ­Æ÷ÑKŸr¢…µÓ"Ø)ú³bdÙÖEÒmö6Y±ÛÂ’˜’^.=o:›ë¾z›};>SØÜ3ÆÞÐrØÏŽÕ!)C”Ó“åçæ=lù&æ}™÷ê4ïw §)R«¸â4¢ØÌuyŸøšß¦ìÖ·¸À +”pu¾ÄK…^÷|Œ•@:ü„»¡ÜsÇœUwL×*¢aw¨ CBiQŽQ¥À(>Á±>ê<Çê4F°Í]¯àP7v©À1‰«ï@#ê‡W +LA—§ÿm¨¡á•B[G?¥1„#ˆçiôJÁâ'œ從oRÁY‚±xðjÊ@ZœoBWQ à[á[‡:T±oòÏUÑ„GS=-°ˆëï@#ú}ÂaDUÂ|Þ’pžCÆDpäÚ6Æ(ÁDy®F¯,~ÂëPîw0ž(ÂâÑw¨)CiqÆéûÈŒë¡"ŒëP§¡ª‹ÇíX N…SWïP#úýý3CX1áð–‹iÏá¥C*MÓÈ¥‚€˜ÏÓ襂ÅOøÊ}=ß‚”cïP†„Ò¢|#)G‰§µ>ê<ߪÝæ•>Á.ê2[4Í6Ìp ب5bÏ8‰„>û{&¼ ãFrNÁ±’‘HŽã0¨ð|æ8‹Ÿð:”û9#™4~‡š2$çLRIb‚s=T„sªw‘erÄ—úK@:ç$°À¡FLðHÇ)âlx›…uÌ“zDzDF.ëC)°²ïDôšËÀ'œ¤¾šrc”دDƒïPv„Òâ”Ó_îÔßi‰S®‡ŠP®CiMõ²hV‡E•oª¼~ +Ó\{½Nã8Ôˆ~šK ­ß„·Is#Ž ÓœD§¯ÇŽe9 +PØgö}ˆf9‹Ÿp:”û++l¹Pñè;Ô”!´8å0l}U2ñÍÞ>*B¹¥5ê/N?fup±&H08ÓGw Å~=D—ë¹ô5·÷ôm¡œwÕL–¶¥8ÓeJ•ød¡y^šÞG‹²¥Rn ÓR7eeJN0ÇÝ]<×ÛëÜUõ;§W6¥¾šõ$Œ}qÚDP¿¤Øæ0Ç0Øîân‚|É_žm•´PiJ¿ú/*óÝøÜ\"Q5ÏìÃÌüÑsÓjc€ç§¢ÉëC¶Êë|[ì +ûªœwZt}^pj=†ºh[ur¶¬ó}S,ì5›µÛóÓ}½"•6Q@ã4Pm7 ä殢­Dë¾öîI7êãc=šß ¤=+-Î}/>²ºãöø|Ô¿:èÌ(ãæØǹ_ +&6 ¢NMý»ÿý‘çìeð‹•Í”å0cž4»âò™_0ôO6F&ü·ÿÇ¿ 9ýl†ëßœ=uèr†!Ö(™„Éþ„$4ý—Qëendstream endobj 1449 0 obj << /Type /Page /Contents 1450 0 R /Resources 1448 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R -/Annots [ 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R ] ->> endobj -1452 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [231.137 681.3376 299.809 693.3972] -/Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/Parent 1432 0 R +/Annots [ 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R ] >> endobj 1453 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [324.1075 378.783 397.7608 390.8427] +/Rect [284.2769 667.7189 352.9489 679.7785] /Subtype /Link -/A << /S /GoTo /D (server_resource_limits) >> +/A << /S /GoTo /D (access_control) >> >> endobj 1454 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.1555 347.5161 427.8275 359.5757] +/Rect [282.0654 636.5559 350.7374 648.6156] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (access_control) >> >> endobj 1455 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [353.6164 316.2492 422.2884 328.3088] +/Rect [311.9531 605.393 380.6251 617.4526] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (access_control) >> >> endobj 1456 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [370.2338 284.9823 438.9058 297.0419] +/Rect [299.7586 574.23 368.4306 586.2897] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (access_control) >> >> endobj 1457 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [364.6948 253.7154 433.3668 265.775] +/Rect [292.0084 543.0671 360.6804 555.1267] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (access_control) >> >> endobj 1458 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [226.7331 222.4485 295.4051 234.5081] +/Rect [330.7921 511.9042 399.4641 523.9638] /Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/A << /S /GoTo /D (dynamic_update_policies) >> >> endobj 1459 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [283.1811 191.1815 356.8344 203.2412] +/Rect [401.5962 480.7412 470.2682 492.8008] /Subtype /Link -/A << /S /GoTo /D (tuning) >> +/A << /S /GoTo /D (access_control) >> >> endobj 1460 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [287.6042 159.9146 356.2762 171.9743] +/Rect [257.6971 315.5214 326.3691 327.581] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [310.7975 284.3584 379.4695 296.4181] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [308.6055 253.1955 377.2775 265.2551] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.1999 222.0326 362.8719 234.0922] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.0862 190.8696 371.7582 202.9292] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.9347 159.7067 401.6067 171.7663] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.97 128.5437 370.642 140.6034] /Subtype /Link /A << /S /GoTo /D (boolean_options) >> >> endobj 1451 0 obj << /D [1449 0 R /XYZ 56.6929 794.5015 null] >> endobj +474 0 obj << +/D [1449 0 R /XYZ 56.6929 726.6924 null] +>> endobj +1452 0 obj << +/D [1449 0 R /XYZ 56.6929 700.1172 null] +>> endobj 1448 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F48 940 0 R /F21 702 0 R /F41 925 0 R >> +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1463 0 obj << -/Length 2955 +1469 0 obj << +/Length 3111 /Filter /FlateDecode >> stream -xÚµ[Msã6½ûWè(WEX|¬=MϬS›IÖqjI‰²Y‘H‡¤<Ñþúm D$¨©8•J‰Ÿ¯»€njLVþ#+-f _©„#‰Xm7xõÏ>܇Ùt MõõãÍ?Þ3µJP"©\=î{¶4ÂZ“Õãî—õ7ÿz÷ããÝÃí† -¼–èv#$^}ÿñ[;’Øo~øøþþÃÏïn_?ÞÿðÑ?ܽ¿{¸ûøÍÝí†hAàûÔY˜ùÂûûßÙ«ï¾ÿþÝÃíoßÝÜ=z_úþÌŒ#Üüò^íÀíïn0b‰«ÏpƒIº:ÞpÁàŒu#‡›Ÿnþã öž¶_Š Êåj`"ŸŽ2FX@Ô6ŠÄ\uQ¦d*ÊÊD¹ÎŸ6¯é!ßåÍy“MVÁÝØw¢RZÓU‚€†GMð`=ø*™ˆ!‘Ÿ²ÌÆ¿yv»¬ÞVùK“—…(÷†ØÈ«D!L¹ -QwF†( -ö[y1ö˜iŠ(%jà±}X=­ìÅCÏw_ð=´k}ß^¼4R%1ædáñ,xÔ“Кa‚Ù;m)BÌÒLØCEØ¡ºŒÁÿE^ÞJž Iü5ñ%=ñ®Œæ×uæ¿1!<É'tèmLx~ÁïÐîAâãñ xÔ“ÐZTx.4Kd\x}Ô¼ðj^YÕ.é?÷¶ÒÙWåq³Ë÷檟¬ØNýz§ÐEéxÔŸa_!Çtȧ -“ -…I>Šy2¹³L Šœt;Õ’[ak µ†#l×}—¢­…Ã/Ä ´;P£q·ScØZÀ kÑdxÔ‘КÕãF -¾þ ü±l|fÒƦÆä(Lņ àLÌ&Oì‚^›8™g•VÔeä˜Ö ”äaâ`W†é:XZì&,¨O…ïëCú:U`1 -uŽ/è·Ïenxµ›gÚw'-œšnô5Í駃O›Ñ‘ü¿²pW‡ì5; ˆ"™]ß ÂÏéBµÒGEÖw‡2~üž!Öª¬ÎSÕqB1OïQó«ãC±0 ð6¥JàƸ:f<¢"Õ1EÐ7Ò§ÑêØá|íÎÔ)á‰kÞ½0½G-ѬÅO,N–ÄvE´æ@í=š|sY©C¥1$µÖÑ©=(œ{ 3®‘T˜ &›wcÆ*#\LæUF E1{è…~Lc÷vlsöÇPa) Mm,ä´@bl+*/ª’œ-üÔGÍ Ì£.§À¯ÓC¶Ù—ÕöÜàí;hˆBŸ%áQ,†ÝH Ã6 ñ6[ÚŒ3ãwïa%"’ªMHߘæ|ÁïÀê—üÎ åµXJ€G- ­yåUçHnŽ)ŽuŒáI%âPÙcŒ×ßž‹ô˜o­?¿ìÒÆeðÇòoóÉÚI¨TµuŒû7£\¶ÿf>êÓËKY5¦VàP}.ípz€ôi“¿fvà˜5Ï家7 öó©J‹&¿%ëâÉlyV4eUþôܸ±ÒNô’UF5vpçý‚›SëW݇ã™ñ¥_“™Å5ˆÛ²0Z|:ÙZggG?/JŸ*ºMш//óåç}æ öº/Õ†ÛR­û¥ÓšÚ¼˜ÜLžúZ(Ö•le»þœ;Ö‹úÅhŠ¯ó-!ÄêÆd“ºEbZD÷{öã´‹ RL\é`[„tuæöžjS2cµþ\V¿×öÒö5pQ§Çîiz¶©Ãä¦ôÇrýb½xÍË“{òšU58é̧‘$²—÷ýluå`OÂ^vêjã ‚ ŽÊt¿§¾Žy]ûß - >O½U“ç~¸·eû¹ó{àT´›«¼˜¨•‘WèrV4Jß\!è3“Q^(c뼶ŸEöÙ bŒv‹Fûaäj/ŒÜ׎¥o àÎ,Ÿ"Û@äó"shXUM‹)Öp ´>·m”¹º¬Wcß™´âÀ“a†ZÙÎ$œ²õ;@±®³¶ýà.ê2¢×§ƒí`„uFÍ‚È Ñl×. 4`óÉ. ŽXgéöy`à ç­Ê>èÔÕNXÙ绬È37vÑŽØw(×]¾æc8Øžlò`Œ-¬ú4_Êì½ÙÎ ží 5n.*û — Íb“7ÀbÇ _ßï-ÌÊ—mÔOaÖ̧¬nìC V§OîiîHš¶f9‰¶gn;å‰m7¯Ý.•7ÝzØN»®Ý¼Dýxüéþƒ[Uî ˜)pÛUN¬A3þÕh•¹œ‡ëÓ?né;óÛÔ-ÑO¾ÄiLR #¼‰uúà´&U¯[†›žàÌ€´+Lª¹…0„¥¯‘®XÙŠ“îHq 7¿Š¸¥;$pq8Ûác–šl¸?ì½Õªy`û€nlÙ0IÖÿ}Î -»>‰Òp¦µ'Éh pÍüŠŽÅõž%Ltèºð’g´%ÞTw>ÔðÀøš+¨"µ·—Ã=u% f•Ý™*{kÝÖs™¡ -wrõAH¤œæn²2ºjCÈ´ù3:\ø=ÇLÌ•š9(û÷µ$*™à¥h§ÅÖÙŸ©ÑymÇíê€a¿: xoÇR{ë6ƒöwóÒSÛÌÂÒÝÎùU[@îæ0¯”¬ž(ƒƒ-¡C=Ù/²×Ô„cæ‰rl²Éƒÿ±¿üGF—¿Àâ -1óÇ9ÓíÔ…š&ª#eœPÁ5PÖ#¡©š þ4A‘endstream +xÚµ[[sÛ6~÷¯Ðô¥òL… ®iêtÝÙ&]ÇÝ™¶´DÙl(R+Rq_¿Wñ +¶Ût2Àœs€ï\ƒW üÃ+ÉP’*ºŠ"–`¶Ú®’Õ#”}w…fãA›.ê›û«¯ß¤b¥â„¯î÷¶$J¤Ä«ûÝÏë×ÿxõãýÍÝõ†°dÍÑõ†ñdýÍíÛomŽ²?¯ß½}sûÝOw¯®]ßß¾{k³ïnÞÜÜݼ}}s½Á’a¨O\ 3ÞÜþóƦ¾»{õïÿþêæ>ØÒµ'©6ä¿W?ÿš¬v`ö÷W J•d«gøHVŠ¬W”¥ˆÑ4õ9åÕû«…;¥¦êTÿ±T"&‰˜è@’v:'¦|%˜B<…"Ý÷O9XDñz—ï³sÙڢі}ý†ÊN}NPŠBuÅ/NíÕ“B’R(‡úJ·—ú–Õ—×xÝØt•µÅG'¾¨6‡üPŸ^ìçéËu¾Û<”Ùö浟^ӬͲ&‡±J¦½$8X{9u«]m>–|µÁ)ƈQ±Í>ävP3#æñ|È«¶A¦JX‰ˆb¶·ÞµOù Ħtý1+ÏZ@š¦®bn ŽuÓen‹Š½ÍÍv»¢-ê*+mþEW]º;AGœ\kOÙG—ýç•Í+‹êC¾³¹EÕÖ6·}rÀ&?A}MVC`¼~_ò`@ÇØ&;Kgnz±Ý•Õ¶<ï´<ýõ\´O6e䙪EÓžŠ‡³¶Èæ@Ú&ªºÊ'šôØæ]ך¥yS‚ŽÎ¥@Xp<=hÓEYòã‰èPº7v âq(cŠ$.7 &÷¼ƒCh×íI~ŸçÃ.Í›í©8^z´Þ;ïêš¡JõÞuÑ 4Wå Ó ¿&ž *”è™h O+›¸ëð ÆŽÛµÆn/fé ‹9ÂC•R5˜Zèõ€ZPdÜšVdžaŒ#E_`Xa˜G™ÊËü1ÓÖoêª|QMc¥ŠË÷  ù=¢qðs‘ °ñ]ñõ/I’f:ÍÖF“›eaâ$|è°¢Ÿ ÂX`VílVÓžlêø7Ç ¥b}»w¥¹ÃC ãyƒ¤ +aŠ¹cãKÞL0 ¤R"/Ó†íà•SÍ›ñɆõ\”¥3¢lœæ6èAe…%å ÒÛ€”µ>e.øé m~] +|P´ ë”wÒþpZ~9:ÖÊMÎÁÝ·Û³¶ qpÈ‘BWÉæZŽ¸`K~ð›n…17Çíj­NuÝnJ8T\ô4Q4 &ôèLJakQ·dŠ#Jè‚[vQónPZâ¾>=g§Ý¨û FL`P’{”ƒµ[Oô;Û4eëCžUEõ¸?—n^ßÛ|7«3Çu]ô”56+³?VÍæ[6P˜a›ÖÌþÔ8ýxîÊ!‘p¿€ó£=¢I,°™UŽ•¹ÍÎMîd˺þ3Õ»¶…û¬(­…N1î»a¶oõ"ŠpÓ ô€Ncçâ94NÚ@…yÛ†*Um3³ªy¶Ë½Þ|ýüT”Ó]€àÖ:ˆ‰äÔ´S½`ÖÛ¾žëséägeY?;lNUŸzU§³|wÛj›çcö-œcR‘ïæ€D8lƒâÐAEÀ£: ûwè)E”‹Šö  Ñ=€È/Sí]Ù?5&þba»ƹ†uè©Øå.÷É%4£mªÞ[àcY?˜¾†¼>Mž”‘ °pM$ˆÞ˜Œæ˜o =î^³Df?Ýüd +ÞÇTJa%'Ž"ˆ2\Š@H 3›!…Ø€)žaaåf›Ži–ë9iÖ×€¬!?]ÖÞÕnPºN/-Í2sjåoû àëZ&.§e¡¥G™•êï{£ÍÆlFÑ™Bü‚]uT|@MÈïGgØC¤ë+ðïkE̲à +ãlˆŠ5$Ñ9v«SÒhëOC«ý‹ý0}®K«ìÛ,M¦N$N´2·.Öز~´%¿$,ù­>Ÿ`«Iì3RºV͸ëÌÝ (¶NÙ#l)]¨-‡H™„]C ØÞþçͲI°¶ãßÚeŠGˆh†Í°âž663´¶"ÁÂJ®ÏÛvXÁÚ¯³Œ3]ŠðÚYhqÞ:]`6…ZÀñ˜WŽþðù !Ô­-»,¢„ ΔÔÈ{—ËíuÀoU¹¸ð4b¬ãÔrÆØÙœßYKf‡R›AØ4F§‹šwœ€ê9N{8n\w݇ê&² D@MhÑë6(…Uå@à>6¹PRíê­9TñëÍõ‡—C;©vp²¾ DÜÍAÕ|Oc†8å 3géi2,rÄÀrŸÂ/*8 &$÷ƒSŠaª/ú•[{HïG’tŽídpª/ûiyàx XCiiV$æ×M»»¼Òû¹„¹Í¢ÄýVÍÌ£«ûRM÷9æ°È!0A(Õ÷Á97† .ö«24í¨Ð% +Ãövè¨6PèÙÊ°Ævwqz»Íü¹—ߤöwHT Ωoþ5z‘:y²¢.³¾Ž‚m)Ñ×›Ó”úÏ©Ì–!óRÄI"ÌÝô1ùÅ’(ï:jø°Í?Î9ªï%%õ}ÀDU¶e¬Z`#¨b^5ϸ€šõ¹‘NRD9ãqUjB—>ñz gO™¿‰z]“F×Í°îÃ\Í“O)Äg=³côóø…·ûÇ)«²4´ Æ¨­8 A4U $¼€"t ùP1IAŒ¸âq=h¬HŸ€úl_ô5ù›&Ý®=ÃاoÐB‡ Ö59Ê>?jõOp/A‹èxL\‡aKqâPGÊ¥ð×AE¨çQö0³Õ'b£}2ÝX—P‚û—ëB3’÷%®]ôqãÇùüå:ã(LöLŒ]®{ü‚±ãvÿÄå:ô'[êõ€ZPdÜZ”aXÁD;¿(Á: y~yÐexôõeö2uÔ¥R•FEÐXöð K‘„÷„N†]LHf¥z­<ÀÀI:úǘ‡Çíµ:K26^MR åÑn 5†mÅ)Æõ½žXb]T„dÕ¢¶Þ4u6¦ìfX"ãâjB~Ÿh6 ÷ø<붑Ù0að„àÕ¸~:¨z–F¹æð 6Ûýã! öö\ŸD;? –µç[Šaf]8\î€"ls -îx~øO̘P+ @c©ýseŠ¤T²'öV÷´ þXRò+ÊlÎP!'œØCú9s™EÕš“WýÅÜu$d»»0wKOí=9ÕÖ•ú²J§Ý… ÔÒ›¬Pýc~2´Ûì"Òܸº)«lãΗ)P'>ñ9_®®ˆ½·Ó¿ß¾}ÿþæµMë6ŒÎÄêá Ïö­1^lêr5Jô]¶óõìeK}°_»¢ù`£b߇©\YíØ«Ub Ü¿\”É.JO¼Øô~ Åîvû7uÝa‡k–¾B ²øž²š§¯ù#ìMÓ°5m±?,€M9ч1é4ßã1Ó³쩺òo÷ϸu*ÿ¯§gþm›yZkÒ—'gòüè_Æ9ƒ3WTT{ý"Ä‘2,³Í#¶¢¹¼b3‚¤~ª²}²¹Û¬ +ÏØÌïî|8æ;Kw‘L’Áƒî%åÄk¨ä~q™ÎápÉ¡e¡Æ.×ÀjxýXºæò¤Í½ˆOÒÏØ'ÆþÝÿòkùË% ¥RÎÜ]¦ G’(á•Ò¶ŠÑ~,<««þ?çme>endstream endobj -1462 0 obj << -/Type /Page -/Contents 1463 0 R -/Resources 1461 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R -/Annots [ 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R ] ->> endobj -1465 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [381.2254 737.5325 454.8788 749.5921] -/Subtype /Link -/A << /S /GoTo /D (tuning) >> ->> endobj -1466 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.4163 707.2832 436.0696 719.3428] -/Subtype /Link -/A << /S /GoTo /D (tuning) >> ->> endobj -1467 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.2465 677.0339 475.8998 689.0936] -/Subtype /Link -/A << /S /GoTo /D (tuning) >> ->> endobj 1468 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [348.0303 646.7846 421.6837 658.8443] -/Subtype /Link -/A << /S /GoTo /D (tuning) >> ->> endobj -1469 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [335.4973 616.5353 404.1693 628.595] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> ->> endobj -1470 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [363.1733 586.2861 431.8453 598.3457] -/Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/Type /Page +/Contents 1469 0 R +/Resources 1467 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1432 0 R +/Annots [ 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R ] >> endobj 1471 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [365.365 556.0368 434.037 568.0964] +/Rect [259.4835 683.3704 328.1555 695.4301] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (boolean_options) >> >> endobj 1472 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.041 525.7875 461.713 537.8471] +/Rect [172.152 623.0288 267.6829 634.8294] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (root_delegation_only) >> >> endobj 1473 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.9837 495.5382 471.6557 507.5979] +/Rect [352.4539 369.6354 426.1073 381.695] /Subtype /Link -/A << /S /GoTo /D (zone_transfers) >> +/A << /S /GoTo /D (server_resource_limits) >> >> endobj 1474 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [320.374 465.2889 389.046 477.3486] +/Rect [387.5019 339.3849 456.1739 351.4445] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1475 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [348.05 435.0397 416.722 447.0993] +/Rect [381.9629 309.1343 450.6349 321.194] /Subtype /Link /A << /S /GoTo /D (zone_transfers) >> >> endobj 1476 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [488.512 404.7904 561.5676 416.85] +/Rect [398.5803 278.8838 467.2523 290.9435] /Subtype /Link -/A << /S /GoTo /D (tuning) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1477 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.3443 374.5411 467.1586 386.6007] +/Rect [393.0412 248.6333 461.7132 260.693] /Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1478 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [321.49 332.3366 382.69 344.3963] +/Rect [255.0796 218.3828 323.7516 230.4425] /Subtype /Link -/A << /S /GoTo /D (options) >> +/A << /S /GoTo /D (boolean_options) >> >> endobj 1479 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [317.0267 302.0873 385.6987 314.147] +/Rect [311.5276 188.1323 385.1809 200.192] /Subtype /Link -/A << /S /GoTo /D (boolean_options) >> +/A << /S /GoTo /D (tuning) >> >> endobj 1480 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [356.8967 271.8381 430.5501 283.8977] +/Rect [315.9507 157.8818 384.6227 169.9414] /Subtype /Link -/A << /S /GoTo /D (tuning) >> +/A << /S /GoTo /D (boolean_options) >> >> endobj -1464 0 obj << -/D [1462 0 R /XYZ 85.0394 794.5015 null] +1470 0 obj << +/D [1468 0 R /XYZ 85.0394 794.5015 null] >> endobj -474 0 obj << -/D [1462 0 R /XYZ 85.0394 256.8016 null] ->> endobj -1106 0 obj << -/D [1462 0 R /XYZ 85.0394 231.4888 null] ->> endobj -1461 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R >> +1467 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F48 950 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1483 0 obj << -/Length 3014 +/Length 2952 /Filter /FlateDecode >> stream -xÚÍZ[sÛº~÷¯Ðœ'¹c!¸ìS}'õ¹8©ãN§““Z¢-6©ˆTœÌôÇw R LYJÎt|ä£,û—ÎTêÌè>8i*GËm3Z©¶eqòþäoè×ÔŸàL*+(ÕMʬ‚.Tàͼ¨iQm9¯¨’Q±>uãÍ"§Yþç²,š¢*©eQUŸê?£"^¼Ö"šŽ&2eÎ9?ÏÜðÓ‰å||¿Îʆªÿ¦b–—ߨT‚j46EÚËl™7ßVùö‹j¨À®šªI’ÞÂ[I’Ô‹r‘Mç »µÑÒàÃËUS½Zc™ dEÚVëâK±ÈïóТŒ¿-§ahFÅ2¯ëì>§¡ó,Œ«7Ó)tÜm‹o.k¦ó|ÖD9ƒ¯4œ«U¾Î‚²)ì,$K‘~AÅr™ÏŠ¬Éý.¥¥ø œ£µ@£_ËŒêY*eEåÝf s®iD¥´ëSáÆ9}ä_³eQæ3P–v|N­[=‡ÇpÙ®æyI5ZTê⾄{ë¡CM#‘N½v"°a˜/fgÔ×4 bÒõ']¿kPsQRc6V~¹³Œ6úŠf>À…àq -¢ jöˆÆÂ*Õ¶Þïmõ*Ÿžû,Ñr€˜jAÖÍ°TÉÄÏ}U!`E«q¨K¿KØF›ûySPeF½w՚Α‰Ï‘†9e€½_Ñt5©óÅÝÀ3‚))’@8ÌK2—˜–Ä6•ÞË,a2MU ë”¡EÒÊ[7 vê,^PÖd™­VEyO½/¨Xêî«WÜDª„)¢÷6oZ•È©³yËMÝD{¸³)P÷nŒ ÆwÛi M `9#¢-’ý‡–Œ>ŠÅlÚé¢=h³(¬—"!ÄøŒÆ5t ýãÒ›än§ëæýå›þüЀVž{#>p¬?å°>ÅÓñ¦ö8ƒZS‘XˆÌÐâ·‰V3°hToAš× 0.ÿðöû2*n~½ø'Õò¯ÓyVÞ‡¡Þ ã·ù©ûAð±#”Sš£›2°­çÙö`  y lÎöžr¥c à*Ë®»ÇVÇlÃð: ™»1~/°–Õ;ìÌFŠ×ݲ±¯ -¬6@c§´ðx”×èÀ[ýzDÙ xLŠ4jœ-êŠZ‘ã2¿¯š¢½Èð4æͼšQ¤ÂÚí7*ß¼?A|Ñçü C&Ç€€ìvQÔÁnJ0·aòèÐ)Ò[ÖÐÇî¥)¶[%R3þ5_ßæ^ûUM-pÓ—Ób•-èõ‰e7bº(`2Žûë}NÍY¼ Û9—€×Å]0_?Áb×™WäYµÌŠò§‹'xÂLj[C Š–© oylQuʼ£H.A«ŽÇÜ.±ZÂÎÖ ãØÖxs¨À¡ÔNï˜C44ÎîG÷"ªX ‘7€jºýW>mˆ®©¨ñÕÕûaVP¶ÊJ´¸žŒC‚ûûnïèÅ‚šÁÊ“d»Y–›ES¬ZÒ ™ݸtß êV¤LXp*×€Ÿ.„ÚUnÿÒ€ë¤ÉÚ»’ -ö·D°äxážr‰½ahq‚„^`e”IÔ1>qoØnBp°Wðfåêá>"¡´c OvÿݨVŒ¼ÃØ+ãÀ+T[ëÐg5é³,‘JviŽ¾!JÑ.{&™„Kô ;”p–"RãÅ×lÚL‚G¯gj™¡o„¿u<äJ°§»|ð£‹ãðƒ]•èàHAS;ùîUs›ûxM;9»³~"†®™)º!>¾¨vâ ¼FrJYòúÚîÇ·€„‰¥Õî€]¶LwWE¸ÄàÒi‘‚‚£mxÞÖ"ˆw®E‹ú¡h1j -™@‹ŒN^8}Ì´é3§ÉDÚ‹6÷ÑÆ«X qÔ:ˆbܲͨðM†P´õª»³PYïÐÙ3$œc\KóCmÍB2ÌYc¾ƒe;b?‚„e©Nôið•µV‡üŒ] WW‹C§¢„D§»›²ÈcÙyÝÊ’×ÞëÆJßëÆ–ØëViÒ%³Àä‚Úm²íRœ*#{¨c{¨ekµlKÀ”üØØ?¦i* Ì†B8ðB‹`3;ÁCÙWâ¥>Çh£Ÿž-[äx–툽xTJ1‡î?ŽžH¿ïñ#†Œ(b»Ÿ"µÛýÄž‡…&m8lÃnaSØOlìöÛ{‚yÙµc[[¤¤¦†Ô{l„?p¡%G„clVªvíÑÄ(¹çäÐ!àUOžPÈ[ù‹û² -JÁÒ5sȹáÛ?œzÏ« ^ƒ©*([;雩áºL¤Å½ 8.Ò¡ßËñQ{Ÿýë¼íO!lTÎÉáÞÁ†"€‰2øDKg?q~<ØþŽ¯%‹„ÿþÍendstream +xÚµ[Msã6½ûWè(WEX|ƒ¨=MϬS›IÖqjI‰²Y‘HG¤<Ñþúm D¨©8•šŸ¯Ñ@7$“†ÿÈBH$5Õ ¥9˜ˆÅzƒOðîà q˜UZ Q_?Þüã=S ´¤rñ¸ØÊÎ2²xÜü²”ˆ¢[°€—ßüðñýý‡ŸÞÝ*¾|¼ÿáãíŠ +¼|ÿï;{÷ááÝ÷ß¿{¸]‘Lå7ÿz÷ãã݃}%¯ï?~k[´½\0úp÷þîáîã7w·¿=~ws÷è}úK03ŽüqóËox±·¿»ÁˆéL,>ÃFDkºØßpÁàŒõ-»›Ÿnþã Þv?.2$(—0’ Éøô(¤â1ã×2%S£Ü£Ì(7åÓê5ß•›²=­Êª-ð4öp…8'j1ì ¢áQ<Ø€qh xüT6í³»ÙÍúP¾´e]Ù†zkxœÒ +aÊ50Hz3¢ ¢Ls÷©²;Ì`¸3%hà°}yxZØ›‡ë?ãzl×ú¾>{idO$"b̉S“éô ‘-CE’wº‚ÿ™i©gÄ7@%Ä×£úpÁ¿ª¬žVU „Ç`A`Š¦)xÔ‡@xœ! KDHâ¯)/(/reÔÁg^«ªca)IàmJu=~ÆïØî¨K¤¨ÔéxÔ “ØZRx2Ã0bZ¦…7D]žG£e®y{FÅŒ¨„{”é1ßµ«k–=K!"MÄ£&˜„ +äˆkš…TÞ¦ÂM84Ö @ kšÐ TM„gÏI :üŒ÷±Ý/Ð ‡r–ƒG͉­¥5h¶+Í茨„{T"dS ¡€¥‹k‘æâQdÂs– Š{œ…lþVN¯†Z›1¡D)`؆Dg”Øãg ¶{½äk +Ò´d$Çv¯¯A`«„…Š¥ÇÞ£fˆÄÖÒjƒÌ!ãbæ°eˆJ¨­GEš,@0Ê RLèA¢£oƒà¦÷ZsÔ"ˆJµh¾ÎµüŒÛ±Ýë5—)Ø5K¿G͉¬¥5庘;a€Šs Óݾ¬V‡b{(šçU[ììó?'›;t{8Åؾ1N™’Xò$ŠÓ$‰D¦TàA'X¢`ÍM XÓ‹‹C‡D’lÈ*¡-Oó‹¬Ê2L.â H¼¨I’aîAi‘­¤®˜‚̈Ë,-¬!ê²²<ª›ÒnmŠ³=ÔûզܚH{Šj=õ EXA ”¤ãQ|‚V#!dH¨S +¤ÚV)LòP)æÍäÒF0aôg$snÅ5™,QSVsxž¬)~f b»·½ãšBA> ²t00yk#cBGösàLÌ×8²%!èµ!ÙìU™¯òöyÓB.Ve讇åÕfÂÜT¨>¸Í.J¯º¢Êgòëçº4¼ºÅ3vM×úš—»üÓεçíhKþ_]¹»]ñZìŒ"¹8¿DØüŠ!=¿¨ÄüîQÆß‹ŒõUNS™±P<Ý{šè=ÌŒ)öÇ û·©É"'Æ™1”ƒŠd‰Ìª4ÙÄÐ…dfìð3>Çv/d)S?a\±ôÈ{Ô ØZz/ÁRê9©A ¥9P7C»¶\çi¨3)OvíAqß¡Î0bÊ aço#³± c•AÞÀ1¹¬²L#©¤z™YOûY½øc,2iÖÆä ÷˜4‡±¥¤¼¨9™€í$­¯!ê²À<ê¼üŠ1Ý«m}ØÊU^Q‹U’„GM°Þ1¢Ê†4ÞHkÓÎŒÝ dR‚$Ê/q I–_?ãyl÷K~âCÅ°%càQ3Lbk^|QÚÁ9„›„ÃáRÓJÄ!µÇ/¿=Uù¾\[~~Ùä­ âõ®\—“É!’qEm"ã~ûÉe÷ÛO¸4Ç——úКdCzô¹¶Íù"\åmùZ؆}Ñ>×›Æ>€FºëÓ!¯Úò–,«'Û°Þ•EÕ:”ÕÜʧçÖµÕ¶£—â`„c7Þ/x8v~5C8Ð1ž_†I™ÉQ\…¸®+#ǧ£Mv6¶õÓé,ö©¤ qæñwõç•íýÂædœ«…»\­Oã­©Õ‹‰ÍäÆ/ 5ñGbu7;Ö‹æÅh²¯Ó-!ÄêÆD“™ßÁPdˆj÷uöã´‡)&®ô¯KCú¬wÇM_nžG&½<þtÿÁÍ*÷L¸«*'æ iÿj4ËÜœÂùé_wôùuî¦è'Ÿä´&¨•ÞÄ<}pZ“jP-ÃÃ@p¦AÚ&Õ¥ …0„åù˸ù™­8éwWpƒñóN ˆ›º!1Ø«ÝÉ6ï‹ÜüÚp{ÜÙg«UóÂVÜØ6²a’,ÿû\Tv~•Á–&t¼„N¸9­ÂâzÏ4=ºi¼‡àmI§7Õï ¼0¾ja5@äöñ¼·ç.ƒƒÆâ`W¦ƒ}´ng—"C!öÅÏüFH¤œæn'²2ºê†eÃŒ†à˜s¥.ìˆýŽ{Z´Ò¼íõ Ø²ø37:ol»Ðìg‡om[nÝbðÏájb>QÛ\j]XX¾Ù8¿ (]æHÉê‰2ØØ4 õd?´+^s3þjó×?¹6üsÆþòÿ‹+IJìÂ(L žGÊ8¡²¸`„òŠI:AýÿD’‘Fendstream endobj 1482 0 obj << /Type /Page /Contents 1483 0 R /Resources 1481 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1423 0 R ->> endobj -1484 0 obj << -/D [1482 0 R /XYZ 56.6929 794.5015 null] +/Parent 1432 0 R +/Annots [ 1485 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R ] >> endobj 1485 0 obj << -/D [1482 0 R /XYZ 56.6929 512.9872 null] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [352.879 737.5325 426.5323 749.5921] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> >> endobj 1486 0 obj << -/D [1482 0 R /XYZ 56.6929 501.0321 null] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.0699 707.2832 407.7232 719.3428] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> >> endobj -1481 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R /F48 940 0 R /F62 1050 0 R >> -/XObject << /Im2 1039 0 R >> -/ProcSet [ /PDF /Text ] +1487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.9 677.0339 447.5533 689.0936] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> +>> endobj +1488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.6839 646.7846 393.3372 658.8443] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> >> endobj 1489 0 obj << -/Length 2789 -/Filter /FlateDecode ->> -stream -xÚÍZYsÛ8~÷¯à#U!8ûæq쌧f•¬¬©­ã!‹5©ˆ”ϯßn4@Q‡íÉ$S»•*l4€Fãë Š8üAªWY$YÄ4:X¬/xpcï/„ã{¦ñë»ÙÅÛ•Ëb³å`­”ñ4Á¬ø%¼úþòãìz:KÍØÆ:æáw·“wDɨ¹ú0¹¹}ÿÓôr”DáìöÄÈÓë›ëéõäêz4*ÒPn‰Ÿ?L®‰éæöÇëÑo³.®g½ÈÃc ®PÞO¿üƃN÷Ãg*Kuðœ‰,“Áú"ÒŠéH)O©.î.þÕ/8µSÏ©)â‚ ©U0±f åóûÒöu]¡2&¹ÖGû¹é”Ë”%™V½ò#1P¾ˆK•ÒA¢3+©¬ö㮉ƭ©–¨ ·7@ÝÏH8ˤB!󲪚Çœ! »•¡ΦÞf;ih~å\~vL ¶i8w¼»M‘w®?¢6¯]gvõ‘:‹¦6‹®lj”v Á2­¥ai7iÖ£±ŠR’BE^ -$Õ¦{l¶¿¹Ùñ™Y‹fK2·›¦.ÊúžÆo?>DÄãsBnV 8SZ„³UÙÎâ(¤V…eÝ™º0QQØæ¤?d˜Ü %ÄöÝäòŸ×44¶¦kg‚ä »É Ún±Å³a‡D|0ÛÖ:¢vlRD,Ñq$‚³HÄ韱)#¥€®³–r&1‹#þ%èö3ŽÀÝ‹7Ž•bI=n€j-Ë@J_öã,a"µÕÑd€jƒÀhœi%#‡ê£q wexâ$pQ¡`­Œ›ki­:øÆ£,SÄ5èÛãîÕ` oo×2x×À¡‚á¹üÊãáÒö\àö&(u &-¢ ‡Á5O¬Ð·º8e§(+ÓlMW.cO4´iÚ¶œ$+C ¶÷fyØ°Š…K’’9b§œƒ1¶#¡ÃìD*ei$eàî&ù÷ È⩆û޻ѯC£Là†x+BdJeö <.¸ ¦ ~}‰8'áÉQðøk³¼ "ΘJÜcpüàÐÓaÐ9 >ŠÇ Οä8g¸èÀ’Nc4èŠ ¼! ¸šÜà‹:‹ñfïu¬™éá:1`C <ê|mÎD3ˆ‰Žc‡©œK[ïÚŽzíÆ,Êå“€šå€>þ´Ë«ÒÎr“Šf—NTÜÑ"6gšA“€ö„eJ:ZaÝPÛ=m ú].Ãœœ%ÑÍçMU.Ê ¿­8´)ž_ÀL -0¶¥á®r×y·X7BŠ;ÜÆ|^˜MGäéôîöýêOî\çîÃeOº¾r ÕÍF’bçìx6Êxè¶I3%b$ NàžhU*Î!„-ªEùlìròl|hþþ¤0B'j·¡?)ÝQ³.ö$õæ\Œ{\•‹0©‡«@JŒkD³'R>µ(@(A™Çá¤éÜX·Ê;â~\·-•†y×™µ ˆö¸Î ?µ!Ja*ã—£ã‘0I¶EëFÛ¶Y”(‹Û²ìVnäÜM9……n‹¡Ö὇"ÝÊ,~÷X_Úä:&·*ÂÞç²íèÎúÀ èv;aÎÁDLE± Ÿ“S HJY!SPsÂϹ,º¬Ì~ê>òrt-,ND?• 7yˆDX¡Yº¤Ý´Ín»0þ d,üyk'é¿é²ÉÍO>—™­ÌúŒ/9 dKkÖ*•¼›‘mN‰àNã°"­Þ´i䘻T°yDí*}3ÂøôæŠÈP)Dn‘´‹m97-PZ©mK`G*ž‰9}ÒÁqå…ãž.9Ю¦S²›ú8tJàépo!°•P H+ÝØ®5ØD”%áµ!*I 6»9x·Ü&ÜvÄJ -:þÈ“°¼¼"zmi ÈX‰²ÊÜòsã* SwÞÙœ9HßåzS™50{|{?ÞÆ»Éëà±p`yÕ6~2º/<¹ìN ]•Ÿ¯=bÏCóU°]¢×Iûøƒ}ñ — uÐÒXîXšÂàݤ*¼¦‹sDê­òCv( hA{GÜ» Hµ¬Á5¬sw)½ÅA ”«Ê°Eÿ÷4ÆØ9<£jI¸Í¡c7ĹÍ#>ܜ؆¿É#Új6ù×Ú¤ývzƒž…0¬¹hÖÍúüþ­™¶ Ä/!–ý ÉÙÊœš³2Œ -ÊLRaæÀ º6²TÁ½®)*`[7ŽÐ–÷µ½LHŽdAl™Œ)ŽØIÏ}}Üšíƒåv-¯C -zª-ÖlöÚ¢^ÃÕ€ÖxùÁ,¶çΉê´ù9é«u$8 Ò÷àé0Š&Qh“˜$l›­ ƒ™ë]Õ•›ÊM·º’N'HؘíºìÈbá“" -·éÊuù‡CåÜmñ -[·YÏi>çh÷gc¿÷ûùŸ‹æûLp›ö™|;w̤NêÏûB¸ô/qÛvŒnãΘãúFEÇ" —à¢3fÜÞ» -o:Ì°=ÿx8á4Å>]Ï{çÞ=Ü;²@‰xRs Y<”¯Ã-Nš<×+’@ÁÏÀM‹CI\Ð9,õ4ŒsýgUÑó¿&ÀɺϪ":– ªa¦°ÄxQ=×+’œ®†’¸ -Š\&3ÈpJˆ™MÖCÕàå|˜ïx7Ù–A^æÂØ?ŽØ¿íI(õt’Æÿ«Rsàe¾ ~v3ž}°”:a±TÏÜHÿ`)cÁ$9…æ±öMn -‰dÇ õÑWîÓ„>£˜ºGç²õ)õ®.N_9 "NbH“‡Ò~öR±ìÅçç“%ýŒç•Š1hÓ¯(5ʘÔQF¾’ôÑ8Žb^¢ú²84õ¢¡ÆL‡"ÏËŽòjg¨ë¼10ìkÊÖy»4òX«Ñ¥Ð#kªÈó³c³9,i^¸© -¾N­û›Šð¨üKž¸üŒgoJ€¼i&_…¿ÔP§Eô¢9›ý¥3î@Ÿ€>˵C´á¸*Ñ*;ñÊN4€ŽWiÿàdOÌéSIwã@Â÷ì{kvÈW?_»º´.PQŽŠm ×U6ðG¾¼réØ6ÛroKû¸Ÿ»Ö8†¹£$AD²åι„aepR ÅdÓ†º”BÄuúÂÇ^T!v%~®èyž‡Uc¡Ø樴ˆ_·¦ÎülŽi·-|¾±l†N§ô¯Y«fW‡9IQ¶‹Üå§/ z—¯ƒàßê ³aY*_ó?"I˜–î½aQA¸˜;” P:p@ÙÞ¥½ÊŽŠ,Ëi€ï¦kME”e¾FÀA±ð¥‚+"Û.¯½ï9ŠéÃe_¸².¾•#ú;®L¥ŒãÎ+W¦‹…"G4}G?ÅâŸK|`ˆ#W-¦ò\qÔ"ïr0FH÷öœT.Rße©p¯nõl-EìáK‰y&x¬ ºFÜ-Äèa¥¯*l÷Âí Ôò­nïÿ惎vø3õ ¿üÑ,‹Ò—2È qŽåaj¼lðgÏþQÒ¿×Ø• ASå~  Çã3?(pB;.o“àÊÂçtíóY4¸œ(K³¿®ý}U!Y„åTr<Öé¹ÊƒÞ©|õÿ-Øÿÿ -pè*Må3u¥¿/(ª`-òfIvR7¬u*÷láÿ êê]endstream -endobj -1488 0 obj << -/Type /Page -/Contents 1489 0 R -/Resources 1487 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R -/Annots [ 1493 0 R 1494 0 R ] +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.1508 616.5353 375.8228 628.595] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> +>> endobj +1490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [334.8268 586.2861 403.4988 598.3457] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> +>> endobj +1491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [337.0185 556.0368 405.6905 568.0964] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> +>> endobj +1492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.6945 525.7875 433.3665 537.8471] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1493 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [341.1654 298.8688 414.8187 310.9284] +/Rect [374.6372 495.5382 443.3092 507.5979] /Subtype /Link -/A << /S /GoTo /D (the_sortlist_statement) >> +/A << /S /GoTo /D (zone_transfers) >> >> endobj 1494 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [434.6742 298.8688 508.3275 310.9284] +/Rect [292.0276 465.2889 360.6996 477.3486] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> +>> endobj +1495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [319.7036 435.0397 388.3756 447.0993] +/Subtype /Link +/A << /S /GoTo /D (zone_transfers) >> +>> endobj +1496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.1655 404.7904 533.2211 416.85] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> +>> endobj +1497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.9978 374.5411 438.8121 386.6007] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.1435 332.3366 354.3435 344.3963] +/Subtype /Link +/A << /S /GoTo /D (options) >> +>> endobj +1499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.6803 302.0873 357.3523 314.147] +/Subtype /Link +/A << /S /GoTo /D (boolean_options) >> +>> endobj +1500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.5503 271.8381 402.2036 283.8977] +/Subtype /Link +/A << /S /GoTo /D (tuning) >> +>> endobj +1484 0 obj << +/D [1482 0 R /XYZ 56.6929 794.5015 null] +>> endobj +478 0 obj << +/D [1482 0 R /XYZ 56.6929 256.8016 null] +>> endobj +1116 0 obj << +/D [1482 0 R /XYZ 56.6929 231.4888 null] +>> endobj +1481 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1503 0 obj << +/Length 3016 +/Filter /FlateDecode +>> +stream +xÚÍZ[sÛº~÷¯Ðœ'¹c!¸ìS}'õ¹8©ãN§““Z¢-6©ˆTœÌôÇw R¤LYJÎtP%¥b}êÇ›EF³ìÎe‘×yYPË¢,?UFE¼x­Eg9>šÈ„yïÃ:pÃO'–óñý:-jªþ›ŠYV|£ŒTË¡±ÎëØ^¤Ë¬þ¶Ê¶_Tû@vUTýHœôo8qI`å"Îwk;¢ÁGà«¢z¹ÆÒ!gyÛVëüK¾Èî³ +@¢Œ¿-¦qjJÅ2«ªô>£©ó4Ϋ6Ó)tÜm‹oq\ZOçÙ¬77²r_šGÊå*[§QÙ@öÄC„`‰12”/—Ù,Oë,,à%,à=ÉA–ÕÓ"VŠ’Ê»ÍÖ\ÓŒÈKÇ®O…gô‘}M—y‘Í@ZÚñ9µnõG@e+%4>̳‚j$Tªü¾€{òС¦™HF»8^û"°a˜-fgÔ×"hà€‘¶ßµý¾!@ÍyAétZqg)m.ô=äõ|€ +Á±C)²‚ªØ#šk«TÛrhx¿?¶U«lšê³xD‹ÁT‹L°vmÇ6×¾*°¢Ñ8ÔeØ%l£Íý¼É©2£Þ»rMçÈtÏ‘†ye€|hºšTÙânàÀÁ”.¦%™w¦bëRï%æ˜DÃH#Á:e_HAz@~«ÔN@uå‚‘U²LW«¼¸§ÞT¬hêîkPÜD*Ç”¶¿yÓ²@J­Í[nªº³‡;›ÒêÞñÑø`;éBÓw@±œÒ -’Ç–”>òÅlÚê¢9h³(¬—)"!ÄøŒæÕt ýãÒ[än§ëæýå›þúЀVž#>p¬?e ŸâÉxSœA­.‰-Dfl [ŠƒV3°hTo@šU50.ÿöûR*n~½ø'Õ²¯ÓyZÜÇ©Á ã·Ù©‡Ið±Ã”SZ£]2’­æéö` £YXŸí=åJw1€_¨<,ÛîYÝ%§WqðÜÎ {µ´Ú!w`5R¼nÅƾ2’ÚÀ(˜;%Á»³‚Fdlôe£âe4)Ò¨qº¨Jj‰GBŽ‹ì¾¬óæ"ÃÓ˜ÕórFuâ +k·ß¨|óþýñuFŸóœ™ÒÛE^E»)ÁÜÆÅ;‡N‘ÞÒš>v/M±Ý*‘˜ñ¯Ùú6 Ú/+j›¾˜æ«tAŸ¨O,ÛÓE‹!s<\ïsjN«èù®óŽÙ„ûh¾~a×™—äY¹Ló⧋'¸c&±¡EËDFÈ7Œ<¶¨:aÁQ$— QÇcê0ÎYÝ lm îÚš`Á]dÚk×Gow §{Õ¤òš‘7€jºýW6­i\]Rã««÷ä, l•hq=˜§D÷¡ë»y¼£ j+O^mWYnu¾j†FÍäèÆ  ûfP·"a‚ûxP¹üt!)·iÀuR§Í]½ìàN>oÒEïÆ'PÌxØ {íàNì]ó{X‡àÀq9j=—a\eã‚“ÅŠT~I`Œ‡¼~¯™”­îÇKIÅ hÐÙŒcTÃ4`'êa@áŠA@x4©´ÙüŽyÉÝÑL {+$šþ* Þ;‚yÝŽ;Š +÷|Á>­oÍ^_ì ¶'ÚI¦¥Ûñ –Õ>’ÇÈ™øöHwOÂ+f½•ÇÒCÆž æsÇ3÷”K Cƒ‹$ìÐ+£ŒSÇøĽ}`»i^¬6NêB}8ÔG$"”öÌq·“ˆøïf5Œ`äÄ^hZ±ÚX‡>©I+@Ì2'•lÓ}-jQ +˜ H&á}Â9Î$Dz¼øšNëIté•Sp¨–):Gñ[Ïc²{ÚÛ?Ú@?(ÒUNGO +ššÅwïšÛ,$hÛÉÛõ31tÏLÑ F¹hà=’QÎÂÛ×t?¾$,,­ö ³eº½+º‘K]Úð àˆu÷áy{‹(RÜû.ê‡ÂÅ@¬)dr.x0Ú¼rú ih¢›(Ýà^4Ù&bÅJŒ¬ Ö¢@tQ Æ Ù”ŠÀÑdF[¡¼;‹•õ=BÂ{ƵÔ?B½ùQR†ykÌwlf쇰,ÑN‚wYkuÈÕØEÐà~u›CÙ§lœÙuÙ”¥PËÖïV–ünl ~7Vú~7¶týn•¸6FÔnÝn¼K‘ªìDÝ5ˆZ6QË&´”ü82‚[ðwGÄDŒL‡‚8ðCóh4[ÆC9Tº¢>ÇÎF?<[<6Éñ$›{ñ¨”k.Þ€ÿ˜ßãJ Y3ßn¨HìvC±ç!¢®‰ˆmÜ.lŠŠí†b{B´/»†lkŒ”Ô”Æz1‚®4wDD&Àh%j× MŒ’{N b^uðä •<:yÀoùÏï‹2&y(W¢kæ‘r÷›p:!úž—:¾³UP6>vÒ°†²?v_@hÎŒñæ(ÅhÔü®b¬Ñ[Åô}]ˆ‚yïÁÓD‚G/än +u›2«6n¬Æ²¬jjÙT„À}‹wßbQ>D cZcQ‘RÌmÉñj÷-a». 𚌟W–`ÞÀºâRÍóF3" £)ØíŠ;áU‡vwЀ™Š—½²!1URõ66mVÐN +fÔ¸ÝÇ É¸oIOç ÐPÇ€—0Ä(Uû/ ª“»êîwb™ç7’9­È‘þÓà–›„q£Á0 NDzyòK›,GUgë¼úD|ý·ŒÆݦU¶ß2wMÞóÌèÿÔÙTƒ8~ÈÙÁ|‚O&]MÛ{“n“èË|‘®©Ð>°¡†%ÊË pà¶ÉÇìë4[Õ´@SªÉÖ=ŽK—wCá¬ð¨ÿïµtd¦-rb6™ÓÙÆJO@¥³ÿÇq‰~µæöT †O||®"Í3„Å»žÞ”-Vðc+àì£b%aw°h¬`­,ßâ¢Ô„ž!ÔLÄÕ·ãO€µ6ZÌ”îü(¤€[À$7ßC3Ny"Ú2L«> éãNÊEõ‘rŽw,úeÍ›[pÒ|ÜAlž§_2ªÝfäúA\‘±÷KžRåæå;ª„_à |F-ñ«{|¿þ ®Tjû`‹wô@³¤/rêÁËñ—(iÝ»|Ge:›Ñµ^UÔ!{² c¯£éóW¯®Ùùõ»ÓD†Ÿ7  *bŒqùÎv»âiµJ§Í“ýÐ{pêóxÐv½ƒCh•B3gà–àtzcÍ1Ù<)ÃËØ›—s–Y<:Ç£”f<ºN[ö&\J0äºûó£VµpV!¤7BŠ¤ï«@†Ã÷¼±=oÁ'ãø/Ç”D¸Ã#¨Ö‰ þÁèó(xýÁíç½zw«†Ððâr)G¯JjÔ•«¡<é’rëd,s‰Ð#á% ã:0}Yã/ÉÂã#”Á3,×YÈÅ 9Ä®UYUùí©äc´ÎØ‚ŲZ•dÞ—ñ÷ Òy:mX©äöV§Â<Îkå™×Àzwož¹ß€,0M¶¿I{¥ƒâ PÔøC¶äXN —¦“Í1€És‘ ýtŽšsøìêmÅá£ò^ÿü{:Ì-2.Ùݶö'}Í°óÿ*HÞendstream +endobj +1502 0 obj << +/Type /Page +/Contents 1503 0 R +/Resources 1501 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1507 0 R +>> endobj +1504 0 obj << +/D [1502 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1505 0 obj << +/D [1502 0 R /XYZ 85.0394 512.9872 null] +>> endobj +1506 0 obj << +/D [1502 0 R /XYZ 85.0394 501.0321 null] +>> endobj +1501 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F48 950 0 R /F62 1060 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1510 0 obj << +/Length 2779 +/Filter /FlateDecode +>> +stream +xÚÍZKsã6¾ûWðHU0x ±7ÇcOœÊzfe¥¶6-Â+©ˆ”=ίßn4@Q–lgâ¤vkª†`£6º¿~A‡"J5ÓFš(3 K¹H£Åê„Gw0÷ñDxži`šŽ¹¾™Ÿ¼¿PYd˜ÑRGóÛÑ^9ãy.¢yùS¬™bØÇ?~º:ŸLeÊã‹Ëïa$T’ÊøìÛÓÏóóMhÏúÍåÕ¢zœ}ºº¸üøÃìt’%ñüòÓ‘gçç³ó«³óÉ/óïNÎçƒÈãc ®PÞßN~ú…G%œî»ΔÉÓè^8ÆÈhu’¤Š¥‰RRŸ\ŸükØp4ë–SSÂ2UÑTè”e\Ëç¿Kßàð]?Ê0ÉÓôÉw§‚&à¿hªeÎ2“ªAù‰)_ˆ”%ye©aZIEÊïÛdÚÙúõóþ¨»gF*”9Oëº}˜ÀLÜ/- p5Ö›‰Ècû3çò‹gjñ™Ç7žw».‹ÞoéY4~0?ûLƒEÛØE_µ Ê_ž +ÁLšJ'­ûH»šLU’“* R ©±ýC»ù•È톈ϬZ´’¹[·MY5w4ùù>!†¢œ¢ô«:@¢JE<_V`M'1=U\5½mJ[õ€Ï‚ô‡ W×DB ñùáêôŸç45›u¶ïöW‚÷ä ·)Jú€Ü1âφñÞn:Oè‰bÙS7¹f‰à2ʇÎÿˆ#H™’\GäÌÀ¹þ5à+žb;ˆ7ÕJ±,ÓzÀ6@u0 €ÛHŒ(&Ò&c°*u:º¡:Õ 0rr–*™xTšL5Øþ—ñAŒF€?E<›§Ò¹tô[$OŒQÄ3»Ãî”àï/W2úБ¢ñ©hßéxcw&ˆ;÷“àÍI’FBOyæä½ì1þ)‡µ1²´íÆöÕàõHSë¶ëª›‰äqm‰‚øÀ' ½½=†iØÅ!%ËÉqÐÄÁ»‰HãØ$ˆ“æ‘7KövS#¨xžêhº  o¢ÌÀ<ÜÀŽ“rˆõoµ!˜œ}¸&ãÙ“´ñçV ÈÔ†© p=@,ÏÇéæ í€9AMš¦šs†›Žœè0;ƒ®˜@ 9À5A_4X€Œw»€ã<,ï£s–+òFS¬ì‘ä"Á±¹ð<˜6lí£ÙjÛõ4êÖvQÝ>zèq» OÛuåVùEe»**/*~Ñ!6šš”Aƒð!2f”ô>t |\ÄMKÏþqm1är'‰n¿¬ëjQõèXøîÄ¡âù¬¤Øs›Iok¿pUô‹¥õ3¤¸ýÏØ/ »î‰<›]_~|Gã«k?¸þt:ÎÏüFMI«‘¤Ø1?žO ýgrr ä@ÂŒ„Ñ üÄ#M ÊàƒŠsÈ^‹zKùg~;½ú><bhýî¤0C'j¿a8)ýQ³)w$õîXz{XV‹%0©‡†U %¦4¢¹©PU” ”À|Ìu|Õö~®_=q?,­ß‚¶Êã¢ïíÊ DgD ®Š2,m‰RÚÚ†íèx@$Œ@ý€Ï²ó³]×.*”Ųê—~春¼ÂŸdm‡¡Îã}€":ÝÒ.~ X¿uu láT„£/Uד͆ôô_›0ï‡?¦í2'Dz”A푇j +o@øJ1_WµÝ-Ý%]Xª8Ó™–2á‘;´·¾·]»Ý,lxËpÞÆKúo2Ö¨®ù!”1ó¥]‰% $“ˆ„¼Ày¥Jïv"bWN"¸sפÕ;‹>7¾ +lP»*Ý+a~vqFdè¿Ii»Å¦º±ÍPE™ºÚ•ÀŽT<1 z¥ƒãÎ Ï=9Яf3²_ú8 JéðÛBz`+¡<Vù¹mgKð‰Ädñ58µ%*I ÖÛˆn…«µÝŒ“žtd„#K,ÀóŠšè} - X%ʲ¸÷ÛßØ PUÚ¦ÁæÈA{W«umWÀðâøà®®Ù€€…=ÿ(ê® ‹1|áÉ`÷p劣ÆS ˆ=ÍWÁvŠQ'òŽ]ƃQ6ÖAGs…giK‹¶ÉU|N†óD-‹}vè hCg#BФ€Z5VEÀ»”!Šâ¤KÊ7døÄø÷8Æر<§FIøÃÀ}<Ç>žðñljmñ"¢›¡ÇºØ@áºEŸtï^o0r†=í +ªÙ°Aø~ga¥ë%ñ @ˆw ÉùÒš÷2Ì +:LR¡ñà…™Þö‹TñW…¡¿Ãb*gïm^¶Xª˜ŠÂÐìý´ŠÿⵂN|˜Ëc-!PË¢/À3žî8©I¤±kÅráï$ü¹æ ž”Jp„÷#áNä™Ì±²}bw£ë”¡—pÍÛ Æiå¯2ÞÿÍïmÿgéç~'pzå,5Iþòjf-÷«âÛç®"Ã-»GQf´IŽçÊÿ@WÆG~&P3„ö\Á%! Te¨çºç hˆ8‰ÉÍŸ×þî$@KɸNócMBLyóßìþž¹Êsy܃½ø«RÌr~ð§`L©ôŽm$ü>s †endstream +endobj +1509 0 obj << +/Type /Page +/Contents 1510 0 R +/Resources 1508 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1507 0 R +/Annots [ 1514 0 R 1515 0 R ] +>> endobj +1514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [312.8189 298.8688 386.4723 310.9284] +/Subtype /Link +/A << /S /GoTo /D (the_sortlist_statement) >> +>> endobj +1515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.3277 298.8688 479.981 310.9284] /Subtype /Link /A << /S /GoTo /D (rrset_ordering) >> >> endobj -1490 0 obj << -/D [1488 0 R /XYZ 85.0394 794.5015 null] ->> endobj -478 0 obj << -/D [1488 0 R /XYZ 85.0394 509.1791 null] ->> endobj -1491 0 obj << -/D [1488 0 R /XYZ 85.0394 477.0735 null] +1511 0 obj << +/D [1509 0 R /XYZ 56.6929 794.5015 null] >> endobj 482 0 obj << -/D [1488 0 R /XYZ 85.0394 477.0735 null] +/D [1509 0 R /XYZ 56.6929 509.1791 null] >> endobj -954 0 obj << -/D [1488 0 R /XYZ 85.0394 447.2177 null] +1512 0 obj << +/D [1509 0 R /XYZ 56.6929 477.0735 null] >> endobj 486 0 obj << -/D [1488 0 R /XYZ 85.0394 390.5598 null] +/D [1509 0 R /XYZ 56.6929 477.0735 null] >> endobj -1492 0 obj << -/D [1488 0 R /XYZ 85.0394 368.2486 null] +964 0 obj << +/D [1509 0 R /XYZ 56.6929 447.2177 null] >> endobj -1495 0 obj << -/D [1488 0 R /XYZ 85.0394 281.9323 null] +490 0 obj << +/D [1509 0 R /XYZ 56.6929 390.5598 null] >> endobj -1496 0 obj << -/D [1488 0 R /XYZ 85.0394 269.9771 null] +1513 0 obj << +/D [1509 0 R /XYZ 56.6929 368.2486 null] >> endobj -1497 0 obj << -/D [1488 0 R /XYZ 85.0394 89.8526 null] +1516 0 obj << +/D [1509 0 R /XYZ 56.6929 281.9323 null] >> endobj -1498 0 obj << -/D [1488 0 R /XYZ 85.0394 77.8974 null] +1517 0 obj << +/D [1509 0 R /XYZ 56.6929 269.9771 null] >> endobj -1487 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F62 1050 0 R /F53 1017 0 R /F21 702 0 R /F39 885 0 R >> -/XObject << /Im2 1039 0 R >> +1518 0 obj << +/D [1509 0 R /XYZ 56.6929 89.8526 null] +>> endobj +1519 0 obj << +/D [1509 0 R /XYZ 56.6929 77.8974 null] +>> endobj +1508 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F62 1060 0 R /F53 1027 0 R /F21 710 0 R /F39 895 0 R >> +/XObject << /Im2 1049 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1502 0 obj << +1522 0 obj << /Length 2893 /Filter /FlateDecode >> stream -xÚí[]oÛ:}ϯð£4\~‹Â>¥iÒúÞÖÉÚ)°»÷ÞÙV¡Žåµä¤Ù_¿3Ê–]ÛJÈö@9Q4uf8s8TE‡Ã_Ñ1–ÙD&8ÑÌpa:£û#Þ¹…{ŸDèsRw:iöúx}ô· w–Xi;×7±ãΉÎõøÈ2ÅŽaýû²w~|" .º_AJ}9½º>ïÓ º~ìö>‘&¡æì²wÑýü½zëèº{Ù#uÿüâ¼Þ;;?þëú·£óëå”›¯%¸Âùþçè¿xg o÷Ûg*q¦óœ‰$‘û#m3Z©Z39ýc9`ã®tLš &¤Q¥™ƒßÎÏ*íXÌã?Ë;'R±Dp½{,zŽÃXA¤'ÔÆP'‚'LÀ?`FeX,E²4£T 3 -a˜vq'6‚I F3žŸØX[l•TÑ]QV$¥ãñüX¸(+K4žL¢î”îTw ݵ£IZ–@Önæ%i©ÕQJ—Jž ó0v÷jËo€¥;±f‰1ÞI€Sü”•£y>ÌÆäù4øÈÅ ‰a›Ž¢MÌ´Hàm˜¼g´¨ÿ¯g'^0dý>»M?[ëZL'c¦ŒÒd:øs|¢µèƒ%0Öͦo‡Ï9»¾Æ¼^÷®+øÀ"Îó‚!ë'vÂg]Ì.T |ÐÂo[bV‚ëïOD×ÞñÞ( À 3lú5^ÎÒy•§“_ NrÃCÇrqƒ·þä\þµOLÇa¸éîOÇ9;ªò—!ت­_Ž LÓû =ÞeÔ/ŪG˜[EWÅÍÆk³GÎïâÄøÊíqJ3êÙ|€’@ÁƒíM±˜ŽKžDç?gÙ<¿Ï¦U: ª¦oBï<½%Åã]>º#†¸"i4É¡[x" ¼å°$ÆáÁ¼ºÛm†jÉjÐÔÏä‰:†mÐNÛ5A9”í4 (yü‚!ë'vÛNk¦íàvÛÎ@¾s‰ ,ð)¬!>ßÏf“tä×OG¿„@÷©‡ ä°~@*gÙˆ–ܘÞ.^‚%W!MÛxXÝN³!©‚¹G“¢øªDE‹ÙϢ̳ËdˆÙä‰zúõê½É_Mét²%?}¹VtQÏ b†[¸ßò]¹ªgÎzÌRÎÓðjƒLº¦¡ÌgRw$R[øvL÷Ó’îÑ/ÔQ -#d9kÓ!XˆñЋ -d1ï½}FB›wKHG{¼»á6¯sÅ7MFrf¤k‰LFYÆc"Soðûù¿ÀÜ*áÑ *ÍAúx‹A3[ 'ùˆäÙSHΈƒ7‚g¯ž*óÛi 7ü -)ÿ[LWñæd·«·„"®öl š(6ÔXÀv˜®…*!™°<„¢nY¥Y3”H‰‰îÒòŽ$\ئԣ¶!ª¼ ý½µ¬¡ƒ —O™¥ QFn±…„5»¾ÆxMT»›8(ÏÕNƒUz¿ñ´s=@Ÿ¯.Áxð˜ˤPn®ÛI1¬‰î¬(sÜöT‹Yéf¤¡FvVâ×˳=x6&úŽ©­¶œÅ°ÓjÁ3¶L&ÚyD¿t{—©pr“ÛŠ8` -ÂÙÕw¨Ò‹ -"`(y$áNJ—XÅ´‘¬(àŽwfèø -’Û|ÓwLr5$ §eÜbØ•Â^€\¼{58?óÉDÆJGW>B@j˵PtŸUwE*úB¤ˆh¯‘Êl«–ê{ˆTs_kÃ+´EˆK¯(k.÷«Â{N%$%Û¢‘tLÇšpé>õŽO 71’ÚL°bA¥&#©>h°ZO]åZ0Ãm @<7ª^÷ŠÜ¾¿ØÔ|ÓCä ÊÑ*Ž·¶…ˆi®™±ŠÂ™_8Ñ: SÊ/lê Ž²Ïàþ^#ƒã5eðÆSžy¡vzÆšè{YwÏ÷a=ÞæSŸŽhXݧ šžß -Iã#(u£@ƒ7æxD$•‹†‹jÛ®¢¬òIÈ}!2ƒX%Hƒîg,Gs,6·2rYõ1kevP%jÏ.¶i·ÃV”ºÞ•QLÛB•uÌ&Ž¨ãïÿê(”ØL•°þ}™ÍÕÌ ûs{¶[¿3¡:B]5pΛxY>Pëå è²Ï³V›.©øc4ÞòSA¥“\´_;ÈØÑR ˆKtá±…€¹LR&À¤Í§7…?)QkðBïëÒ(A!\lC×õ€¼ÝÆ´ßñÁžâ†A¤j‰¤JIæ”$x¿«›Düâê˜À°Q@$ò Iµ¯Ó¹z}Ä,K  ±HªzaéHåBoöä½p&7õU'¢‡t²"F¶Iñ藜㾪‡êaVã Çkp}SL°×8Ü}¢–& Ñá=ªBU$Hâ[bírÇ©Fâ™»¸$Ö^tß4ä¡Bë¬fÈÀhy ï•°KMlL¡µwzuÝÇâ®âQ€ÇŒ³–;Ï«§z;—OÁ–ø™Ë N-ùKD»QmN÷ '2-iAÕÆ…$í N¯ÔØùoS|­:«‹ùpšžÍòQõh´:™C 7 HwÒ͘ïùú!Ìû †ºYƒTÌŒ0-UmØ•1àû]¤ÖE×>¨xé¯)ÖI¢Ht¬L2IåBQuíÛg³æÖê™<`äh¾Ý;>Z ÙD·ù¸†þH YáüÌ…\ÍɵGÌ·KÚL—þshag¼ Dâ‹üþqŽ§¡¡ß]Z‘Ôï‡Gæ¤}™S4±–uúÐÿp2¨I©ÁÓ×”trÙKD>´=àVAûœF)*²ŸyYmŽ·%+aZ,ÑuïWôn õûÔVO3¿MB»úäÅF-)¼×ÒÐÔúIl;O öÂñ½EͦkêøvÉÖÙ—,Šú‰,¤eœ»–óe LIHäµ+0©ú¿ ¿;ÖréÂàJKSIü¢"ÎKRÜP­îË©I–$ïʃE¼&´av0»rÛ @w²éâ©oJK¨Ã€¼kÄÀȋ嫃vTÜÏTŠJ'ÞGb¤ê³lZbrÚ‚»Œ2,¼ŸH^¥*–¹ e2Š¬?‰ƒnõa:)Ó0 "À¨Ccå+ï'ÛÞv OíÉdÍöºEû¦åÁ%ãIË—RBÄÌÂo¬ÂÀÕq"£Óþé7 ÖÖáÀ†p`×à áÛ ë>^òVaƒŒ jiF鳈a xºÿ\èÖzý9Qíbþâv>ép.q.¡òô̈ßb鄯³ŠæœÅÒ:üŒY»õuÞi¥ìÏý~õ_ )çvPJ;pxŽ…¨;þËÇú‚3©¬¬{5¦þ?ʽ+fendstream -endobj -1501 0 obj << -/Type /Page -/Contents 1502 0 R -/Resources 1500 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R ->> endobj -1503 0 obj << -/D [1501 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1500 0 obj << -/Font << /F37 791 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1506 0 obj << -/Length 3252 -/Filter /FlateDecode ->> -stream -xÚÍÙrÛFò]_Á·€U"‚9€lžYŠ•8²–b6®Mò#kà dùë·{z†iÊZ®R±Šèé9Ñw÷€õ"ø±žŽÃH¤²§RÆ‹{“ÙIÔ»‡¾ŸN˜3ðƒÝQ?ŽN¾¿ª—†i“Þ讳–#­Yo”ÿœ¿=»] ûGAöq?^]¿!LJó÷×—W?ý6<ë+Œ®Þ_zxqy1¼¸>¿è˜1‡„[âßï¯/hÐåÕ»‹þ_£ŸO.F«#w_‹EÏûß“?þŠz9¼ÝÏ'Q(R÷¡…,Myov"cÆR™žÜžüsµ`§×NÝE&±ñXÁ’«$Þ¿-mÁ¶ŒÓP©Xoí -o­B+$}¤CÎ×”ç¢Cy&E¨…ˆ{ -ÖIô!é¯?Œ€V’‰à·ÆäýÔiPVøÔÁ›ëÛÛ‹sµ5=3Y.úLfúäGçå$kWd-AÃaCÀcÙeò §d˜Æ1žœ!ÀíAêÇÊ,`gA•Íp5Îé$€Éè11‹6#_b0ª5‹‡lJø¼v«Ô-æSÙ´Ûëá9¢Í|®+XPÄ œ3'`ýnØz´ï†ÐpHÏöinUU?§Fc*7á®^ø¥éi5Ø<)CY̦݃Ҿ ²”Üñ‘ø<A½(ïË -߱ĩ¨A{ϧÙÄO?ÑóÚ²Ó-³ƒ´Ì¸l`[Á¢ài&‹rl—%²{£Æ]žr‡Ûj%A¯T’ð^G¿NÀ…Ô¡cÑp¦Uõ‹%ýŒ½:“h -&Õ¥IÒ4Ôq"-nFC40" ΀PRóÚÊ 5PUð™9Ï-AõVòzf…aj„š9ðí0ûìR’—Ã,‚w?À¢îËA·y$_”GIÊHŠcÀ"‡Ës§àiÂý6í¨þ°D`Nç­_–9/«@" e*ñ&æàmA·‘.ÃË\U`gY[ÖHÅÿœ›ESW 5­ç€(ÇSCHkQ¹¤Gˆ!=BÓ¥Tpñ –Àyƒýì)g`Ÿ³é3cú³ÖTxͼb<Œµ8jì¸Æ …ŒÝpx{õ¸!°wÁy]¡¶Ž­Ý6yД÷UÖ.½DTžµ—EQÜ¥/vQÁ-}÷rHFB yçm^Šè`-uÿ§ågì%z¬’P1Í=’!gΨûB#Ô "X/[3h 2dË{ˆ¦¸ˆƒ1F'6X.À@ ¨›¶!b1„0&§‰ì¨ìÁøA¦tS!ÛÏŠ¼$ÆN0”Õå† ù`Œ&£ sZ/>º®MC9Ð^3ת§•^ù·èoy¶ƒúØ%ú×1òÛʆŒ ¬àÇ2Nà 2M,Y¬:Æ:M;ê¨x´ -×ÞÒEDy]D˜âI„¬ -"âU<¹ß™ùS°x+Æ„ÂƘØãÌ¢lP¨•8…¶`ÁxÙÒ€¦-§S³Äí’k`7¬úgGü±£»Yǧ‘GT*Ø©é°ã¥¤æÄC1K ÐáÇâ¡XðPjI„¼}†‰Ø«t¯ü3Š¸ ˆ[»Ð¦µaªõÄwôÌh%G˶©iŸúŒ±ÀºÝ #cJçÎùÃ!j÷]_±g•©€øæ˜!%Šx,Ë‘›KÔcÑÕcé í³‚ð­©r›|SOËÉÁ— Hœ…fÙ£aÕlâp_>§2"§)ë(ê1|½Ÿuš¼fÎ%);ì˜ E -“DPLt;ìÇqð/L¹ÅŠòƒqmM\¢ƒGc-@+ô¯\ùHl4fñPNlZhã:Ƶٯ6¿ÿrël!râhª¡4?À© ^q(e !;f÷$$N*Îîݾ½¼ÁÐbÍíT0¶ÖM'ÁcöDmÌݱYæžùr<-›‚º3­G¹Y…å6v}4Oß5„EK[HCîÍb¾(«ö¹:Çãæ²K¢—â¤?ìó—ô3ösRˆÇªá$dUZr²—#[ªL €õS˜O-ÄÅ¥µ}æÏ­]ö:Ýó}Ý;[Û¥BV}„Œ\†Z«ÄÛ #fÎv+æ±·[>å¤@0q& ‘΄!¸2a8›°ÓýBÞ,q9Š¹àìö×ÑMŸñ48¥¶ËVpD×Ü,çózÑzæ¾-›b f{YØ¡Í+v?Î QÙ±¢½Œ¢0UŠˆùÇ9Ä*šN©Ù{ -¨ÈÏ!Ehís ±—©(ÝÊËöF _W&é¾íK1e}Ûrìúç¨Hm]ßü³üA¸N¡€i膑ڼöùâúGD`Ðxª0™T@T½‡ïþnJ@BñØ@¦ïêé´~ÄÜèüý¥H;3 §Ô¶Ã)“i†,¦q;ð4äBãlP¿²¥MMnmbvZX§¥+Ï ðƒÔ¬Zë0õMË-!iý @FømY©„@k•J¾-G£oâñãa©cz.˜­#’®]]÷ Þ­8…×  Ê4¬³ÏKy®oPøà -´EË—D$ÃXèÔÝãmX¯ó"« Âé:C… ûÝ^CM±nëI=%ÌÄU¨Zkµ0@o©ã׫!¬„‚$€Y™Xª¢CåýaÖ ™ @¾8 ¨ÒÖâ(V‹Úóåb^7_GTA4-¸c!¼ ÿ®ÙU!/Ëi;X9JpÅfáÕ®[]&ñs·&¼OÉ.€´uh¯€­`QÈ.ÀZ L±Ö¸Ãˆ(*ÁÜØý2Ùaö+®ÅqÉBænäÈ$HG˜(—¾…X*a @o Ð)GÚji/y!áÚb€ZåzÔÈ̓™Ösª•hº¤UV&mæ ËWþƒE×½Rx2[ae/æ:¸Â´/º1ä^$co%Óë›j{#ÞÍ]¡ßç®Ð÷-ÊzéVjžšEÚÖÌœCÀã8kVöeȧYøÞ{WÍž{„Í «`×Ôô!Ü/_픀½–¨B` å3£ -Î õÅBñÁ¨‚¥ e9YGŒûAw õáÆuÞµ¦r¨Ù|ZNÊÖVsu°ÈÜ-7·1¼„Re/'°á‘Èàûš@l¹+q»¸ŸîvC.k·²ù”Á¶Æí9˪§]0йQɺ,ß -V•M)——öpµ¤ †ÆYc Ø"£D2| ƒåÄ—Ò›Õn~á¦vvÆ‹ûSúJÃ]Ë`RP*£cú.qðÖ°ä5ª:·‘¸dÒrdÇËÑ 0'¢[Éìw(\rKʆPë°LúÂ.Xƒød- Œ.Lf‹ŠÔGø X -Š<½Ãsù N/ÝN¼mZû ¶‰(0 ³E{<¿BÚ/ypš– ïrwX’ Ôy<Üð }ï…gî<Ù"¾ZÛl˜•1>Nõ¡íªowŒ;6DU4d>Å WÇÓƒ¸ H_à43“'°ðmEXù¯:Ô#Œ-´OsjXuR¶îdG—37|ZÎÊ–Öó¨]_M»cAŒýþÚ“Ì»e>š¹[¥¬6všd“?'I ~þ´ëYËk[Tî3*¡@‰çsÔÄY_‚(wîãÁP:‚è.èøï׺>·x6mÜRH‰œàN±xí/Š wì7&êzÞ9VŽ ,˜c¼ôgG‰Üå²ì*©´GÃìäräqÄ·Ô± -u¸ÁË4{8÷)>Wkd9Ø9P0ƒÖV¥Î:àÔz,ÌÊý®—žn€r7q-%æ +¿åt§Ah€ø¨šá©‚¬H 06ôtÁ¤f®¸É<ð¬ülü„ Òφ.©·X¤¨ðøLÇ­WÛàbì¢S„ûÅ:Î02Ç)ÈÛÒ¸‘V#áé“™]ï67 ˜T¨4Ëû{ӸȄ´Ÿ Ó¸(B\ÔË© |Æ®›î \:K¾‹;'„ß,<¹UˆÝ)`))„ÇÞ´‡T»rs3z€µ¯îwÚ6RXžºS!½[Ø9¦&èÛ¤ö›¥NøbÑ4_Òå+ v¢³¦.Îë,ãÓéL;€­²Z™r¼_BT¾\8ïM¬ÜÁ!Z÷t+\Ã`Ôg>íj|±hœM>ºa.ª+½åFfû¼å!›.¿¨tlÚpÚ<Ü÷I¯À*“`»¾ÀzG“ûç~ï»þæYªPh½ç^bùS!õ4Û>;ä¹a¬¹ÚuøÿV!Ó•endstream -endobj -1505 0 obj << -/Type /Page -/Contents 1506 0 R -/Resources 1504 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R ->> endobj -1507 0 obj << -/D [1505 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1508 0 obj << -/D [1505 0 R /XYZ 85.0394 337.2163 null] ->> endobj -1509 0 obj << -/D [1505 0 R /XYZ 85.0394 325.2611 null] ->> endobj -1504 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1512 0 obj << -/Length 2929 -/Filter /FlateDecode ->> -stream -xÚÍ]sã6î=¿ÂÎL¢?ôÁ{Ûf“6^Ú˦7;×íƒlѱneɵädýï @™väì^»w×ÉL’  ‚“þÄ$I£ÔH3ÉŒŽ’X$“ùê,ž<ÂØ·g‚q.=ÒeˆõÍÃÙ_nT61‘Ie:yX´ò(Îs1y(™¦‘ŠÎB<ýçw×ç—2‰§7·?$”Näôê»7?=\ßÓ@ʨßÜÞ½¥CŸ«ïnn¿ýùþÍy¦§·?ÞQ÷ýõÍõýõÝÕõù¯ߟ]? ,‡Û±B~;ûå×xRÂî¾?‹#eòdò 8ÆÈÉêL'*J´R¾§>{wö÷`0ꦎŠIÄ‘T©‘“TcrJL”*B9=,-ì ö^}APÕàWL{?tÿ–öÿÞPWgç}Õ6ÔhŒwßÑ̪£Žy±ÙT¶¤FÁ¼Ê¼]ͪ¦ðTÄ@{7;^¦ßTÍ£ŸØ0¥²]žÉ¦XÙ.B=€0.…ˆL’È`gI€°C'°Øœ‹|Ê8 jü¶µM_ï¨oÛ9Öf¾¤Ôë¶jz»é¦Þ¾¥o Ûð’$Ì„…‰Hž›·wï» (˜W*"0_I°Ö8ŽAòBˆ©ýÔo‹š¨ØOëí:^Â*HHD\—:2ZhGœôdd h¼¦Orp»7‚¶ƒb^´›A4ê­:ÖÅü£íyÇ|‡QØ>áÓBmßÎÛúâüRÅŠ c|m;Øu½{•IÇƈ ,«Ç¥›šš©mæmIÆh<ÿY<}^Ú†úº¾%ºŒSqA4šÒÙÍ“Ó4ô¶üeŽÚGàœ€GQi6½mh -Ÿ%àâS±Z×ΡÅBxªÊãEïo®h&¸}q¸72‘…&ë]m¬VU ²s ´J÷]=B‚íûpü®Š®·Œÿ!Ž¥ã ϘmwÇóHN¥=XJL»eûìe–æ-¨¨é™Z~ÁA>:M|hBÕ)õTô`R&ÓUÛÁV$,M,L`)ðÁõݹ¤;/R[ꪫÆ:‚zZÔý²Ý>.iy­š­wI0 Q;ƒ…@m-½YÍËn‘:0ZèB¿”EFÉ<ô¸ -4WlzÉ÷)o&Ê­Œœ>VOd-Á(l“ìodæý}DÀ-DÇSTÓ™}¬&ù\õË ë¢ùˆâåô|4ÆW®˜DÑuÛXȈ‰zÏ8³GN°£³¸V2ÓЕ È|ÚŸªvÛy/ð rK ×Õ±go½m¼/ž×ÛÒ;õEËΚ°‹²˜UuÕÕÜM[×í³S6žm2rH(pèÑ™túÌýu…öz€úððÃwíÖ–ñßþy Âdš‹£™nÏ\푆‰HŒ 8äGW]µM5ïÆ4TZ<÷Í£gí“;©÷ÆbgN †@ÌaÎö#™êxÑr³â !\ÊÖ%îC r÷÷ÎÄ¡·Ô]<µ•ç -2…Ç-ªæ ?Æ'ÙuËŒxÚ†Ò^¸îEâš{{FYuÿÂdUŽ›Ãâ­w+Û/B»F€v,†­„dˆÔêçbÇ00Ö£PbÍÎðnïB®Oî Ì—ÔÀSQo?wÚUÕ÷à  è³ò)Å™Æò—õPë»Ã“ -. )ã(7)ì%O£,ÉéÒðR"oÞò8-Ž`¥¯*ñUå‘Á]K¤Ÿ5˜LGy¬èâ|h˜«ƒÙ€¯Ê ÊH摉€%yZ2ÁšbKI Ð* -',%•Q®ùî:$¯È  þ'–Î"§êsÖ‘ 0¤!ë$y¡m§ ™K°àŸøШ$R‰Ÿ3 GAeù¡iøó¡N ! ÿ•„°¯¡ý?BÈ`CÚ˜ ¸Š(΋y/ŠzàN"pž(gÑy¦åëE=•›}Çå[J*ç´•Ô”4`Dzxâ!LâÝÐaª…CCª…çe5_*\»Êe8àn(Ò]qP¤—³ª§®f»š¹âÀ wirÀší‚Ij(ÍáÖW^/äeɉXw” ¹[OÿÀÕº))äéö§4¨ÂpXÉÃJ@q”R)IûráÆö/H¾’ý&|»:ÈüöYsÓUŸ†­ù´®èÈÞs{´oϸ-æËãÛ3ñtª:zÁ}G$_KH­}‘LB•*¥'J¦ ´,û²f~×3ÿ£\ÒïéR‰$‚kkrÊùã¨I&JäQ’ -€ïßG?\½‹þvûÀ)¥4Ýè0o‚C–‚_Ã8€Z¿tpàM Öþ£.Ð|åð¸„XgêTБ°2Ä3œ@Ññê»Pbº—öJ-ãÓ2 –ûJ2ùOÂÂ×·Z‘H0,(eF˜/ ¨æIj^ pf£X˜”QÕ½î~ø4»w”ô´px2 ù¬˜þÈSÜÒ<•Œ~qÊ}±Ó-«r±°¾¬:Ø׺W”!X,@,Iå⥑^Sü[ÊÛª›oG^N0T:ßjçí¦<õŠ’E™âSþÆáä´´Ý|SÍ\„ò—ДÙ{]ì§Gž3<5ÐXÕP¢  ããÃÜÊrÕH)G©wÎ5µÎñ!X¾álŠê#A}®2%œ”«´õÕ|ëÞ\»²®v£øÕN‰Ã-¸©³v‹êR±§âË1áH ÿ®Ї8‰9Ýp$™ ÿ„å¥ ªŽÍˆ4Ln zÚÅh¥ ¶, õi»Vøò`2Α ¿«\Ù S/;êv½L`‰»œð„ô±æ„MäÛ…ÿòÄÝÚÙô¬‹jCDB¹Ú*Gæ}°%‘ £bÊ”( UF¶Jê¯íSᎊvµµí -¥¦.BçÁK´9ÅÀ‘Ö) ðjÓU´òM­T .m‚ïÒÖk&³ëz»ê˜ ÙÒŠžp1zUÐTr1Á{~•÷Î*ÜÔ>mï§25”&ØÀ‘ñSçPTjxÈ©WQªGeКJ[ƒâ;§bóƯåÔø+D±å ª«["Ô­AEv^¹ -7¯à”©¸þ’=Fò\Òg½©ZWJ¥Î¦ô£c¥{o0:ãÜÙEOâúZ: ÷ÙÑxïÃ×\R>Ý€´ÛUí«ØÁú9x&ì}¸[»ç/}ïfö’sFÇùàÃ×mSòCÆðTžë) ñz`°Ük!4‹GŠ„9žÜšqApÇ*æy^Ë_O²±Ÿ˜FMŒ<:LJCÓ¼-âéOƒ áÒSGèe;f“äŽÁ©Ñ=SJF¼£®bÖµõ¶·ÔZÙ¢¡’<à|2£nàÔ£‚’æدI|à­Ñ /­~Q·qÄâŸdèâû@*p8HÅ{·¾S+àññ:ñ•Dø«œ‘ŸãÄ“ÏæØ_úãŸý ° ”ç'JCNÈL¡"òE7þ•aýßû -õendstream -endobj -1511 0 obj << -/Type /Page -/Contents 1512 0 R -/Resources 1510 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R ->> endobj -1513 0 obj << -/D [1511 0 R /XYZ 56.6929 794.5015 null] ->> endobj -490 0 obj << -/D [1511 0 R /XYZ 56.6929 729.6823 null] ->> endobj -1514 0 obj << -/D [1511 0 R /XYZ 56.6929 704.98 null] ->> endobj -1515 0 obj << -/D [1511 0 R /XYZ 56.6929 519.4358 null] ->> endobj -1516 0 obj << -/D [1511 0 R /XYZ 56.6929 507.4807 null] ->> endobj -1517 0 obj << -/D [1511 0 R /XYZ 56.6929 339.3113 null] ->> endobj -1518 0 obj << -/D [1511 0 R /XYZ 56.6929 327.3562 null] ->> endobj -494 0 obj << -/D [1511 0 R /XYZ 56.6929 227.5589 null] ->> endobj -1519 0 obj << -/D [1511 0 R /XYZ 56.6929 200.4217 null] ->> endobj -1510 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F41 925 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1522 0 obj << -/Length 2732 -/Filter /FlateDecode ->> -stream -xÚÍZKsÛ8¾ûWè0ºj„Å“çæÉ8YOMœ¬¢­Jm&Z¢-ÖJ¤V¤âdýv£%Kv²Ijb6¯F?¾¤FþÕÈ;!MnGYn…“Êf«39ºƒ¶gŠyÆ‘i<äúuzö·ç&å"Ou:šÞÆòBz¯FÓù»äÙß/^O/'çcíd’Šó±KeòëÕõoDÉ©xöêúùÕ‹N.Î3›L¯^]yrùürryýìò|¬Œu0<Ä¿^]_Óó«?.ÏßO?»œöKnKIƒëýÏÙ»÷r4‡Ýý~&…ɽÝÇ*ÏõhufÎ)˳7gÿè´†®ÇÄäŒÎë순´9&'—‹Ô@Ê©.V%l-Õ:™.Êó±q6™7«¢ª©ŽíT»«>”L¬Z*»ØcUÌUÍ]Cåý¢š-0VKn­–\»‰Ó–K˜bs®|RÎyMWŠ<l6!¤ÍP¸…Õ¶e®½íj`’yÊL‹âOSÔÈ<[êâR›R"wN¾¢m›YUtåœN¹˜ÏiEmKúš5¡d¦?¥“Tz(/àÈŠ´ÎXã®/^²U2T·DÑÓ’é3L -åMÓ-°–Åqâ ú`‹8[ÝW¨|ùö3OÎû4×p)YRñˆå&´cÈ„i£Â)‘u“òè\åÁ²º«›êX'WuÛ•®ÈHÉ+ò9k vy8Èž •»Q ´åY¨¾.gWä[Á^ç*‰‚ò#Š´uSÕÝ`ª½­’BÞ|"å D :Pl ÀR~,VëeùË¡{Ê3!5Œ›fZdÆëÏòO:.SÙ¾úÿzÅu ¶xrÔOÂX\=ö‡Ç=ÓTŠÌ›Þ÷Y5pàŒ…•ÊŒÒÔ -“‚[@±œÄ¬Y¡¿1Ö&WŒ– ¹àû“·ü¡äù8“ì¿Ä^·;Âr½ –óuDQªÌèï"3ëD\h‹1*¥N «¬ Bc åA±C…¥c‚tôgŠ‡fÎpù˜Tø Ìë ùX)¬ËÍ ùè¡|ÄM1û÷v-šÍÝ#ÒÌûKBl®2÷”ÉiÀ'Ò’ç~h@c³gwGJ%ð_–Ñ`öXFJ£DžtK*œçó^FfÁð!éÓBLÿ­„´ƒ¢Eìƒ^Z7‘™ícâØØH0$Ès­wæql xPÀæ)<¼$¨0”†b­"pzP]W®ÖÉá“"ùáY;9Aj#j=0„#”È;,C¡ÃQs‚˃ê'FEóÚkî‚Ø5ÀÜFÍ;dRnÂ"Ó¾‡bc“)áS¥öqJÀ›ˆfË*@NB÷¼4mAîlV–(:9¬“'ä–‚: —ÈmçC‰M ål”3–c”‡>–àΪ×yè PT‰Ô§6ê„‚ Ã`hHÀ’oÊ®«ê;m:ý£=²€8èŸ j†îSBoiÒU«rÜ5cÜ6QHFYxi2™P€årN”,Z‡O£Ç7UÇM!ïHâ)£Ì5ç,%£ËÀElëªk‡3§igM=oÑD¤ßO™&ëMµ*6ÕòЖó“@55¼‚¶Y¹¶Dº_PŠbp“Ì6ƒ”±¤êdÒb°žÅ$*Uæe;ÛT7%´hlÂ@­ˆƒÄqyª›r0Ñ<Òn›]6d’ B(ÛE³]ö<Ç2ŽyÕÎ -¶ -Ì0Œ’ñPerÛ,—Í}¯Ý‚æàÖîÓºl÷í¶‡ºØ¯>f[Ê€àÔ–lAØ”-Ö܃Šÿ6u“O©ÁØC€R ~.³#ëRa³ÏÂú&7"“™ù2}¼×ë[ðcZ~ ˜‰=bP¿§±•^¤NðæJ+fÆ, Lðwdƒo^AØ´àJâÁÙdY´ÁˆÌÐØ ËÚF“4ÔUóͺ8B]ÞÛ2é«AÐaALÓEì†ÖQ–»l© 5õ-u¤l{6ÅZî\ÒD§ê8eãŒîÍõÕºƒ›]ŒãEÒÐÏ_¿ýíÕË‹«ëx1ᢱ®›º-ÛczK«]‘®}j¶â˜í÷–°*>V«-s£¯‹²‰Ña'.9×î:ÄP¹iw×+f‹~ˆ˜Atš‚Æ âë” ÕÙHïÁ˜òK†Œ=Nê­ñVdÞžP[ ˜ÎsVÿSpV{Ã7t‹‰y?ø%¾W ©bcÑQI—nÀÓ5k¢ û „8y¬‘¡f”÷ÐSî ¦@êƒT¼|jyÖÓZŽ{ ÇÂÃöæÁ)ÆŸã0×`éÿ3RºNendstream +xÚí[ÏSÛJ¾óWø(ªâÙù­Qí‰Hü^bX U»ûÞ;ȶUŒåµdû×o÷ôH–lAaª8l8¨Õš¾îéþ¦G=¢ç ã*ѽ8ÑÌpazã»Þ»gŸDhÓ¯õÛ­>^üíTŽ„%VÚÞÕuk,Ǹs¢w5ù#:þrt~urqØ—†G–öåÑÇÁðiºŸ OŸ¿_Æ:ºœ I}qrzrq2<>9ì ¥„TâßgÃjt:øzrø×Õo'W͔ۯ%¸Âùþçà¿xoo÷Ûg*q¦÷7œ‰$‘½»m3Z©Z3=¸<øG3`ë©ïúLš &¤Q½¾ÒÌYã?«´c1·ü,ïõ¥b‰àzûXÔÃXA¤jc(@0fÚÄhFeX,EÒ˜Qª–…VÌ)ez±LZ01Úñè°ocmñª¤Šn‹²")L‡ÂEYY¢id fô¤ºÍH é:ž¦eùd-àa^’–®:JéVÉþ(cΟø 0u/Ö,1_J  ý?eåx‘² ùE> NtzL`bئ§hp•ØZÙkƒò: Ñ¤ +@=;ñ‚!ë÷Ùn;øQ˜¯ë²Œ™2J“íàßa_k!Ñ{Kh¬ÛM ÞŸsv~­‰½îeWøIœ5æCÖ=¶âg]Ì.T~ÂàcdV‚óoGODWÞ¡ñÙ8 È2¼ +ôl¼§‹*O§¿ @þ䆇†åòýɹü jzÌ&a¸Ùö5Ï&9;®ò"DͪW¿ A˜¥wAz¸Í¨9ÞŠU‹0·ŠîŠëÖf +œ=>ʼnñ•ãã”æÔ²ý6%‚ ®×År6A,yüœg‹ü.›Ué4¨ÚÎ ­óЛœé­ÎÙ¶úë¾8½;4ÉCôè­Ñe7ak¿à¾‚ÉÄt“H&MÒÓyÌÓ?}9ÀIóÄE€~)Z–ˆÍu± Uîmtý˜ÏnHñp›oI„!ÎIOshz„Á€‡ãÅ$tÌ«Ûív¨jƒ¶~&[Ô1l‡¶¯Ê¾Œ§AÉã Y÷Øn<­™V´“Ûa<IÏ%‚2Á§°Š xýE6Ÿ¦c¿‚’8ª ÆøEò¤¸K=f ‡R9ÏÆ´è&¤ð†ñ,º +ÉÚFàv[í†Ô +&M‹â¨-çèe K}¹UtŸQÏâ‡O0Àæ]¹ªgÎÌR.ÒðjÃLš¦¡ÌgZ7$j[øë„ž§%=£_¨ã(ÆHuÖ¦C°/â¡!VÈbÞ}/ ]î-!#ípï–ß¼Îß4GÉ™‘®+6eyˆMÃËßOþöV .«"pdá‰7\æËÑ4“ü#{ ºsðApíU¯2¿™Õxïò¿ÅlqúÛ}½#qµcwІa¿™d¯ÖÆìp]|ÉÉ„å!]âÖUš5K‰$¬‘˜è6-oIÂu×”ZÔFD•7¢¶–8t0bÓË4FDø„Á((¬ö5ÖkòßMÅ^Ù®vh¬ÒÖÓÎAbô}>?ëA?]6y¡Üˆ]7ÓbTÓÝyQæ¸ý °^.縇Xq¨¡…µøõìx ­™¾c‚«-g1l¸º-“‰vÒ/ƒáé`*œÜd¸" ‚p|þª¹À²AK ‚XJJx’Ò-D1u$ë¥ +xâݾ‚ê¶_õS] yÂiwY¶§°% 'œ_žû„"c¥£s¤Š{ ¶åZ4ºËªÛ"Ä•@€!Ø@P ä×ÀHe¶ +Wú‚Õ—ÝðBÓ+*ÉšË]ÖjÁðžÓ ä‰DÉ΀$Ó±&`—Ÿ†‡}ÃMŒÔ6$¬]PÕÉHª¬ÝSS¹V,Ìp;(ÐϺ‡×½"Áï®;µ_u_yƒÚ´ŠcÆ­í¢cškf¬¢ˆæ—`´ÎÅ ™?OKÆQöiÜ?k¥q¼§4Þêåù +aÇg¬‰¾—uó|GVäM>ó)‰Æõýwº¡éùÑ„4>ˆR3Š4x«ë(Ç#©\4ZVOm.Ê*Ÿ†ü‚3H[‚t9øŒµiŽ•çNºQ6õ³VsU¢vìfÛ†Ûoyy¯+^Å„±]RYÇlâˆ@þþO B‰Ít ÀWÜ\MðÁ²?Ç°w»ñ9Ê(ÔåX½‰›:‚Z/ A“]®µÚ|IÅwX£õšï˜*-˜ä¢+þ*ØJÆŽ;Ð6XŠÀ^¢S.ÄÌ&J™c¼$m>».üÁ‰ZÚxo—.` +ábš®Çä­ð¶æýŽú7 ðë +¦JI$áû œÝ$âgÇ$†l"Ÿ’T{;Ý‘³×‡ÞØ¡)z€2„#©êa„¥Cn”C½Þ‘ûÂÝÌ×KœˆîÓé2ˆܦŃ_tŽûªGY´'·Áýu1ÅV“ðô‘®4YèFÇù¨ +õ ‘?n›G@¤‰gîæ’XxÑÉ|Û’ûŠ®o°ž!E­å]ìWÂv5±1E×áÑùÕz†„fÍ©Õ3‰ÀîÀÑ~½w|È y|Kwz¹N˜Ð@kÈ 'Ǿ6äjZ®=dþÚ0gºõŸÀ¶ÇKJ$¾Üï;Lr< ínÓŠ¤‹‹Ð5ì @ÚõÑIñ0CkY§ ù'ƒš”.x›’N6­Dä#Û=î´Ï™a”¢"!û™—ÕæxOd%,&â‘‹%ÆŽBëÝàîÞ ¤‹ ºVs¿SB"»úÆF­]-)¼ÛÒÐtõ“ê?u²@Dì…çd;‹›mßØ×Aì”­³/Yu­.,¤eœ»®Ãf LIÈäµ +°©ú¿¿;Ö²ñað¥ÆT¿¯熋’×T±»£»!¤L +M’‡×åÁ(^®a‚÷0Áò©I,€ñd³å]¶Hñ蔾gV¼à½#V^4oÚqq7_RI*z7‰‘®Ï³Y‰ê èýÀ`—Qá]EòúÛUÑ$0”É.²þLšÕgë¤LÃ0£­Õ¯¼«<õ¶M,€dµ#µÙëî›V—Œ']O 3 ?² +燉ŒŽ.Ž¾Á°¶ 6„»l xÍ°þã%o6( ª;‚LŸIl ÁÛýD·°ÞëŒjó7÷°ýIGÓp‹s ¨g†ýS¯0|Y4ç,–Öá·…ÌÚ'?\ç½NêþÜÏäWÿU²rn ³TÀLbܧáXˆº›hàWXÆɦUkêÿÈ:0çendstream endobj 1521 0 obj << /Type /Page /Contents 1522 0 R /Resources 1520 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R +/Parent 1507 0 R >> endobj 1523 0 obj << /D [1521 0 R /XYZ 85.0394 794.5015 null] >> endobj -1524 0 obj << -/D [1521 0 R /XYZ 85.0394 685.0919 null] ->> endobj -1525 0 obj << -/D [1521 0 R /XYZ 85.0394 673.1367 null] ->> endobj -498 0 obj << -/D [1521 0 R /XYZ 85.0394 537.6026 null] ->> endobj -1526 0 obj << -/D [1521 0 R /XYZ 85.0394 510.2982 null] ->> endobj -1527 0 obj << -/D [1521 0 R /XYZ 85.0394 468.8256 null] ->> endobj -1528 0 obj << -/D [1521 0 R /XYZ 85.0394 456.8705 null] ->> endobj -502 0 obj << -/D [1521 0 R /XYZ 85.0394 288.1559 null] ->> endobj -1529 0 obj << -/D [1521 0 R /XYZ 85.0394 258.1665 null] ->> endobj -1530 0 obj << -/D [1521 0 R /XYZ 85.0394 168.8733 null] ->> endobj -1531 0 obj << -/D [1521 0 R /XYZ 85.0394 156.9181 null] ->> endobj 1520 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R /F21 702 0 R >> +/Font << /F37 799 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1534 0 obj << -/Length 2208 +1526 0 obj << +/Length 3252 /Filter /FlateDecode >> stream -xÚ½ÛnÛ8ö=_¡‡}šÃ»¨ÁbLêt=Èe6õLÓéƒb3µ[J-9içë÷‡”¥DIºÛ΢@uBžû…f …,QšèœçI–K¢(SÉr{D“°÷戜iDšö±~Zýp*²$'¹æ:YÜôhBaÉbõ>ÕD P éɔ+šžÎÏbB*žžüóø—Åì -7t@ýi~ñWrüœ\^œÎßüzu<Édº˜_^àòÕìtv5»8™M>,~>š-:–ûb1*¿ŸŽÞ É -¤ûùˆ‘•ÜÔ°<çÉöH*A”"®lŽÞý«#ØÛõGÇÔÔáoDPžêZÆIž+9~-M¦F£Í3´ðZŒ'†¤VÔØãFtVä"aŒäJqgF͉ȘN2¥À´Íxá4ì1s¢´d‘Q¢Î=ÆådªYº€ÿyúÈ@“f%ŒP™çqz°õ ¿ðÃ|Ë“×5”ôdŠt§=Â^$Í{Ž þHp» DÓÜx~k‹2iÑCåÀ‡bQ¦¿]^Íß̃ì’R£¨x›²²Íd*rš–~[ ï;4ý\lo7¥Ø…­·UïðÛ]=a*½+Weõ—–uÕâñ6­Ÿ#\‚FÀh”'S4(¯®6_ŸÑôÎ3„ NÓ°¾ªñ[ÕmìÒ6M¼Oe<^ÜÞZ·&CAYäÅm.Û}±Axß­ZJê•}¸ À±}cW^Yçžõµu¸<3^v÷-«U¹,Ú¸º.Ú…¥žN‰¿;»)ÚònÂUú€fwvS6-0âá:ÿ±¬ÈC–:'Ü€'õcéÛÂÓ%•kˆÏCŠù¶äÑxI0‡ˆgýˆxZfÑÌt‰[(¥é%(h‡)÷÷º²!‹—›½.wv šE Y"F -õéPgâvSnLz^€ªwR&OOëÝÖ[V*Û²Ø8_q®ì”òÊÛÉïâÑ«Ó\€„¯*ª€³FRyÚì¯ûio«6R»¶¶BÈ~nmµ²+ç³à#ïÖŽ«ŸDo¹;ÚèD¸l»¹ pƒßå¦h¾loÝUÀ!ØM0´¬ýwÕ¡¬ç®ßî›@ì:¬ÔŽï¦ØÚ/¤Ò)˜ðBŽK#chíÀÕr³_…d -Žu0=àê™fcÙtà#.›rh+ïÕ)ð_ÃD$4¿89ûõõl„’‚ Êøê«Zä’a²Hs±8CEL¹†Â–S !IfT/ ±ˆºŒB áå8xû¥j‹Ï?Žð%QL«1¥©Ò2"çoUo‹²šVδ/׆p)£!ÞP@,‹—.ëíÖù䈥 Ì‚¼#ìOY® ® B’/äà2Ú¡±­÷+Ý•ÑÌÓ*¸.‹™ û£†ç¾N¹H˜5~‹ê ûêTªÒeÄá㸪$ Øpo'ÿ Ù…hf©#²kZôœ(Ê ú"éÂ]Ä$Æ0|}FuaÙ‘ƒ‹°]Bù*—e;U JNfò1aƒ˜ÑÀDô¿#‚ì#d$“Æ'ZÏ}” ±…¦>’úÇSRd,0‰TyôŒs¹ß¡ª1I!˜MvˆÐ§=¨/(jRö}À©»îÔŽŠNåÍ&p!7HóÍ­]ö|ä~ÛõX²ƒŽ€e¹~™ÙAØ^üûmWÊX.ÚaÙð­™Ïf×M½Ù·–ŒXÐDæP§Ðë -2õ¹™jH]{#ANÆÊÛ»wïÀû]’;¹8>wƒšøüx~1};»ú fµÑäÖ¿/ò •¶¼+6l`…ÇŠIAšh£»Êè20éwºàТ„8wv°¼Ft *¤Aš°øW×E¸ïvWº!ôáÑ‘|£ɺà®=†|#eô«ºZÚY7…jb`–zTß‘p”òã…­úÃJ±"O=ÃqµKðßãA,„s˜“¿~âŽ'žoÙû…1NšæßóAŒ©œH-Í÷ëS~úIŒ¹× -¤Ÿ e–‡ ZÚK9 na4#dÇEƒ·Ú{5Á…f]ï7+Ätý¹[ÛÙ¦­w6¬7~ÒtE5ò&''Z‚ÊìÛÂÆÀY{¾?†9(¡ü0J©Òk÷,µw¼Kík‚[téÂ}›[×âܯ->†¸ETÀ18tLžXÔÀŦ©Ãý!î"sÃÉ!¨Éõ@B…Wq‘)÷*.2÷\¼†”ŠøÝØÛ†³ _£ÜâÙð'l\ªší¶·+¤]ô?+ÿªvWÓÑ‘Ò©Ç=šÝìê-Bø“ásÌ+‹€ähÙ¢Ýïüá«Ã{›û:9ž~pëÇê·…ÿ_ùàÆ8Lš±þƒÛãJr -ÄdÿyA |‘¨°÷ÀgIÂ{³ +?”B8Lyr{òÏÕ‚^3u™dÀ|ÆCѨÈçqîß–¶`[ †‰Ç¡ÚÚuÀ‚Ägð¤”Ïùšò\t(ÏXèK÷bX&Ð…”¿þ4jJ&¼ßõR%^QáSyï®oo/Î ×Öôlôd¹è3åéòÑΊIÚj;.O[‚†Ã†€‡¢Í J+dA/–~†ÎÀƒÔ•^À0μ*ájœÓI“Òc¢mJ8¾Å`T«÷iIø¬¶«Ô-úKÑ´Ûëá9‚Í|­+XP„œ3#`ýnØz0ï†ÐpHÏöq®c/%ª~NFWvÂ]½pKÓÓj°y Ò…¢š‚Ü&Ò¼ ˆº”Üò‘ø<^½(¦E…ïŒXâÔÔ ½çe:q“Æô¼6ì´Ëì -3.ØV°À{§›É¢›e@‘ÌÞ¨P—瀇þ¶VÉ0ö%K@ÎÖÂømò-¤òØŠÞ€ ?9¨©O–t3öªL¤¤/˜ŒëL”$¾ +#iÈt3¢‰wt’Ò›×F©š‚Ï0wÈyºh ªïì°\Õ3#Ó“L#ÔÌ}hè€×ïô`—Þ¸æ¼úußýÛè¹Í"ù¢,Š_RaQú‰Œˆ*7ŸúƒÄÓ»1ÚPß**W±7KçsÐ1ÛëöAëŠD6çK€À'8A`qYfջѿߢÕ‰¼é¼ôËòæeÕGD¾LäÖ„ÜAT†,ÃÃî]U`gi[ÔH™˜{î9׋¦®jXRÏQŒKMHcNy,H‹CZ„v+Ž½‹/°ÎìçN1㜖ϴtŒ©C¼Zá-³Šq?T☥ã +ã²tÃáíÕOà‚ÀØyçu…Î×8u¶vØä^SL«´]:ˆ¨,mS . ‚°K^좃òîe „<@òÎ˼ÍÁTª(ü;ËÍØKó0Žü˜)~„æô9³}ر7BQ €õ²Õƒ6'+¶œB ÅEè101q‚°±yÝ´ †!„á>M8dF¥÷Ú Ò… +Ñ×~Ndñu‚Q”À€.ÓÙ Ã3xØÒzñÙvmZÉrz¹V<«•o þ–W;¨]š_W4d!?¢ŽaGId¨b”1TIÒQƘ«@á-MD”ÓD„)’D©C,¼Š$÷;2] +nE—=˜è{¬±@”‰gµ²§ÐÌ/[дEYÒ˜%žh‡X·aÕ?ƒ0à5×Í:2%ˆ<8¢ÁM‡/%4¯ +…,‚ ‡ …BÁá)‰Ž·Ï0ëq•æ7±PÌÖî³iM€j¼ð=SBYÑFDzÍAhÚÇ>cÌ3.wÃÂã˜ÂºòƒþppÚ}Õ7ìUe" ¶9bàCH…¼•aÈÍ%j±èj± ”×ö™‡ü@øVW™I‡¾©ËbòHðå2kd¡YtC(D¥A ÝŸ1L‹{mFCÐT¸ žµWû9×!É[f\gGì/¨‘E‚¡Ûa? ½aòÉÍøUDŒkcß"å=hcÞú\¡o5àÊ?b£Ñ‹ûbbªÐB×±¬Í~¥ùý—[k‘GsŒXñŒêà çR†±#FOB‡½Û÷—7•@”¹†Æ´©È{H©);"6‹[Ø3_ŽË¢É©;%Üz”•fc×gýø]CX4³ÕücªóEQµÏÕ8°•] +½#ÝaŸ¿¤›±Ÿ‘Bø<„ý0#!›R’“±™úd±Ã¨ŸpOi‰6"­Í3{nÁê°ÇéïÛ^ùu @BB6}˜Š\úJÅ‘3@EL˜7ŒVÈCg´|È‹IŽ`dí"­ýBpe¿p„³_§ûE¼Yâr&³aÙí¯£›>ã‰wJm›¦àˆ®"¸YÎçõ¢u¼}_4-„Lör°Cš7ìz„‰ðH^ŸÄ1Ñò1hco¨;Õeç}” Â"ÉV>¶7`ø¶âH÷e_Š'ëû•c68'â­ ›ÿo–;·)bà„¸~o^ô<¹ð ì„p¯ €¨jÛÝm”€L$à¡5&@ßÕeY?`ÎtþþR$™‘„S* Ûá”I™"‹iÜÆ<ñ¹ŽÐ8ί,iS“O›èöÕ*éÊíAœ 5«ÖxK@ݧe±%$­{Hÿ±-#+h¬¢CÙ×ër4xw'÷“ >¢æ‚™â!©ÚÕuáýЊñWx³š|@Á:Û¼”Ûz…zAYä‘DIÒ…J 1ÎßãýØ®ó<­ Áé:3…pûÃ^ðBðLö°nëI]fbëR­±Yš·ÔñëÕˆF>Aò À¬È@ÍàPE˜v¢C&¨t+Hª08ò•»¢ö|¹˜×ÆWàBM îXo·¿kvFÆË¢l+/ ~X/œÒu+ê€Àä½±¾VûSÿ”¬[‡ô1pì YX«é>Vw˜˜ù±`vì~‘ìðú Wà¸d>³7ðûE„Ãb›¾‡8*b ?ï5)CÒ*i.uÁÌoÑ?^%yÔÈô½.ë9•H]ÊÆF$MΠÍTþƒ•Ö½Bx"[a=/äÊ»Â|/¶1äN"c®!Óäë›isÞMZ¡ß%­ÐwŸ.ŠziWj›•ÙVϬ7À²â8mVö4܃Ó,\ïÔ–°ça²èß*Ó55=A÷‹W‡q/%_o%¤èý•|fHÁ$½X>R°„ùJˆhR°Aö‹ í½3V…Ûy×êÊ¢f󲘭©á*o‘Úkmnâw;¥ÊÜH`Ã!‘ÁÓZ@lÙ;p³¸›nw}.k»²þ’¶Úî9K«Ç],йQÉ ÚüÞV•–”ÅKs8‚ZÒM㌭lžRŠ¹= PÞrâ +èÍj;?·S;;ãMý)}•a¯‹¥7É)Q!}ƒ8xkXòŽU™0\2i8²ãåè˜ÑUdæ».¹!eC¨uL&]=`õ¡Ï¼/ÆØ@;ש©'â ¬5á‡+xf)(^´ðhô‹K4Φƒ8½°›Mð¶iÍg-Ø&ºÀ€ÔT@Ì ÝZD i>ÞÁ!h]R¼ÁÝaTH4PíñpÃwôþÙól$‹øvm³`VZ»8Õ…¶«¾Ý1îXaÑ–¹Ç_OAb¿& •ÓÌtJÌÀ’·‘âØ}É aL‰½Ì¨a4*6E'3º˜Ùáe1+ZBc ϼ~°}5íB¾1æ“#hOR;vl—ù¬çv•¢ÚØi’Nrü„$‚j”»cЮ;Ä-«M12¶_N‰ôx>GBœq'ˆ²Åð ÷šºÐD°aÇx¸ÖöÙÅÓ²±K!%2B‚ :źµ»!‚Þ±Û˜¨ëxxgY™[60oŽåñÂ%r—×2«$Ò ³_Ë‘ÃßË*TãoÑÌáì×Sø\­‘f`ê@ Às•XS76"è!×+¼^F8ºÊ^Áµ”˜ƒ®üžåN›ÐñQ ÃS7‘@`¬éiÃIÅle“yxàYñU» ¤Ÿ‰^g´HQáñ•Ž[¯¶!ÀFÙy1¦÷É:Ö62Ë)ÈÛBÛ‘F#áé²™]ï6× ›T«4ËéT768!í'H7vŠPcçõ²´±ÏØvSŒÃŸážMgÉ}që‡ðS…G» +ñ±;,%ñØÀvŸê_WvnJ0øÕt§m#…å‰=Ò»cr‚îM*·Yb%€'“ˆ¦Ù’n]á5±¡^g{˜NgÒ‘lÕÊ”ãÕ¢²åÂ:pbåѺ§[Æ£.ÿp‰WãŠEãtòÙ³]á,72Ûe.÷i¹|RéØ´á´¹¿ï#^U&Áv}sôŽ&÷ÏýÂwý•³Œ}¡Ôž;  ‰Õ©zŠ?9;Do\D|×áÿîÐMendstream endobj -1533 0 obj << +1525 0 obj << /Type /Page -/Contents 1534 0 R -/Resources 1532 0 R +/Contents 1526 0 R +/Resources 1524 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1499 0 R +/Parent 1507 0 R >> endobj -1535 0 obj << -/D [1533 0 R /XYZ 56.6929 794.5015 null] +1527 0 obj << +/D [1525 0 R /XYZ 56.6929 794.5015 null] >> endobj -506 0 obj << -/D [1533 0 R /XYZ 56.6929 663.594 null] +1528 0 obj << +/D [1525 0 R /XYZ 56.6929 337.2163 null] >> endobj -1536 0 obj << -/D [1533 0 R /XYZ 56.6929 640.0743 null] +1529 0 obj << +/D [1525 0 R /XYZ 56.6929 325.2611 null] >> endobj -510 0 obj << -/D [1533 0 R /XYZ 56.6929 573.5829 null] ->> endobj -1537 0 obj << -/D [1533 0 R /XYZ 56.6929 548.3076 null] ->> endobj -514 0 obj << -/D [1533 0 R /XYZ 56.6929 357.2459 null] ->> endobj -1538 0 obj << -/D [1533 0 R /XYZ 56.6929 330.4365 null] ->> endobj -518 0 obj << -/D [1533 0 R /XYZ 56.6929 105.6253 null] ->> endobj -1539 0 obj << -/D [1533 0 R /XYZ 56.6929 82.6167 null] +1524 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 1532 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F62 1050 0 R /F63 1053 0 R /F21 702 0 R /F53 1017 0 R /F11 1367 0 R /F41 925 0 R >> -/XObject << /Im2 1039 0 R >> +/Length 2932 +/Filter /FlateDecode +>> +stream +xÚÍ]sã¸í=¿ÂÎL¬Šúê[6›\ss—ÝfsÞÞƒlѱº²ä³äxýï  L;rv{—¶;™‰@AAÐbŸ¥QªL’LQ(¢ÑlyŽ¡ï‡3Á4G4ñ©Þ<œýåF%£,Èbæ¯4ÓTŒŠ_ÇW»|ÿp}>‘Q8ŽƒóI‡ã7·wo “ÑçêÝÝÍí¿Ü_ž'züpûîŽÐ÷×7×÷×wW×ç¡t$bÿ|wwMD7·?]ŸÿöðãÙõC/²¿,*”÷÷³_ G¬îdz0PY¶Ð‘er´<Ó‘ +"­”ÃTgÎþÞ3ôzíÐ!5E* ¢T&z’jHOQÄ +ºPO Ë…y—TÖøãÎuÝ¿%ýà¿KBµfÖ•MMfÎt÷-,[BÌòõº45rFò,³f9-ëÜq=Ä®wé˜iæÔø}cê®ÚnÓZÑ#¾Ÿ¤Ô«¦¬;³n&l×з…­yJRfÄÊD"'ÍÛ»V\0ŽðŒÂ+Áî‹' þ†!h^16_ºM^óeµ6mKÊ‹Ø™€˜«CæR™Ú2';eÒS4^ѧ=ØÕg‚–½až7ë%AÔ뼫|öÙt<ƒ• ¾}/,Ÿèi¢¦kfMuq>Q¡bCß\›V]í^ÒŠ1à‹òqa‡ÆÙØÔ³¦ gÌœüI8Þ.LM¸¶kˆ/Ó”ŒÏ郮CCZ³~²–lÃ_–¨©°ö „ 'ãÛš†ð^)¾äËUe}Z¬„§²8žôþæŠFBчk#ÉQi¤ÞU†ÁrYV ;Û@¯´ßEÞ!$ØŸ‡“àw™·aúOa(­\ØØæ ¶Ù#=æ`*1nÍÖMÊ"Í0QÝ17ôü‚‚~t[ýЀ²2 Ú)ïÀ?¤ŒÆ˦…¥H˜š‘·x½°Lò¿‘÷÷·Ü“ÇQ§æ±¬™å¶ìtVyýÕÆéxk Ï\2‹¼m7Kðu‘qjŽ‚`K{É ­ä¦~(ë‰y·?•Í¦uQ. à JK ³Õqdoæ©],žU›ÂõyÃÁš¨ó"Ÿ–UÙíl¬´ÜMSUÍÖ÷699¤ØôDzx¼e|U¢¿><ütÁ¨ÝÊ0½{ˆ›U Læ9?i׌ÀÕž¨ˆÌ‚M~4pY›eS—³vÈB…Á}_÷gô´y²›#vÑŽX™ƒþ æcöö#¹ÚxÞôz÷³’ !œÊT®C +xî%o?5¥“ +2…Ç šæ ?͆;ÅµÓ DZ†ÒN¹îUb›{FQ¶ÿÂ#Ùª?DÅKo-U²Ÿ„V­Ú› [é¹UÛ|Ç0Ö¡RBÍÁènï|©O® Ü—ÌÀS^m¾¶šeÙuý ÓgéRŠþdÊ[lÖC‡\×îTq}bã$~ÈÓý)¹±ÀŒ±.õÔ|šêç§ö3NÍQÏ©ÜÓw¿nh`èä.Fø¹n¶•)Í V`¹rfó¬^`/ß Óaø¤:Ò.kP7Ž”U~A­-[BÒ±NÔ®tôE~r홋³NHrÛü±±=¾§% ÷¥Q&pg’ò[n**ƒ8–ÑáMår‚xJ<) ƒnÄ!«I¿¨‰Î¢@€²Ý5Hû™¶PIFQ6Òp_L„Š­Mn?Ü×om«4ÿüñ|’¨DBúHÁÿq}w}ôdG +Õ™­Ò‘7õŸ[ ê <𿣟n‰H‡$uH gžNã ‰Rº4<×ÈåÇ^§ÕáÍôªú¯ªîZ"þªÃ$:HCEçC‡À\ÜbU’¡Žddˆ$OkÆ›ó;ö”|!ö* +'<%–AªùîÚ+&D/èÀãþë@' +cõ5ïˆÂ ÍdFÞáoHò|ßIA-29­oÂïxÓ¨(P‘_s [A%é¡k¸ý¡N+ÁcÿJJØ×ÐþGH`A:ËF*‚09,æ=+êýƒTf èŽè4Ñò增J³}Çæ[J*´•Ô”4 b‘?q&ñ¶ë0Õ®>ÕÂÆvQÎD +䶴ÙvØŠ´GìñdZv„ª7Ë©-<·—&[AªéΤúÒva}ååB^^œˆµG¹½õxù\­ë‚rANnߟàA†ÃJVò£”JIZ_Ÿ צ{Æò…ì7âÛÕAæ·ÏòXš¶üÒ/Í¥…tEGñ¶ÍѺà&Ÿ-ŽoÏ$Ó©èà÷\t(!5æy2)ã àˆ’äÛvXö‡vXö¿J&Ý¢&JÀ et*ü+Sþ•À*|FGàÇÁOW‚Ÿo8©„Lw:Ìœ`›ÅÙð$À?­ŸÁ‚'Aî?³×> ÷ +UêäÄ)#‰6 AH‹•Êø}Æ×…ïU…X89ÂÓJñ¦{%¥ü''Ãëû­H2ÈžðdP2H2‘}ãÉ kÅÙË'lÛ Y̱¨l_Ž@}ñšÙÇJz]8܉ „‡¾?ðW‚8“_œŠ`w‹rŽRÌ«¬ö5·ö!¥?/æ –( +RPâDCªâ½§¸×”·e;Û ¼àai£«™5ëâÔ;J$Šwù¥-ÃÉqaÚÙºœÚ3 g\DSÙ>î"žž xLÿØ@}eMç»ÐŸ3]Þ- £¨4¨Š)ØKØWÕZ+‡`õú£é\( òágkSÂZAÙZ[WÎ6öuÁ¶Kc«7Šßí”8\‚:m6h-:.® ` )á^VúF!'–% ក°ÀtAõ±)±†Á TQ»¬•Á’$?MÛÁ ß²„³$À·¥-|aò"ðícGhû¬!ìÛ™e•'¤cˆU'l¢œØÎÝ—îVÖ'³ÊË5!‰…²Õ!4ŽLyï+ÐK*A4 +êcljÒše`©dþÊ<åv§h[]Û,Qk:â¢! Þº ÍIö4ÖA(Ñš¶¦•+ij}dj@ØÄ ¾ S­˜Í®í̲e äKKz€ÀÉè]ASÑmÀïùÝÞÅ*QûÄ‚ŸJT_œPàGÎOȾ&¨Tÿ5¯¢d +¡u¦?Å—NÅî_Æ©ðG‘bÏAR[¹D¨]¡f¥­qó Ö˜ŠKáÏÅc"'%}Vë²±ÅTBÖ…ë*Þ;‡Ñ gÏöð$éçñÒ±¿Î–ú;Gè¿çA“xÆ}ê(»z=õ mK´yæ^u¦@ŸN„sS¼À&pZw_À‚;*pÍõð˜±TƧtóšl0ĶW•O]õ=£÷%ŠšcXº¶‚’‡Ï &PHJÇkÐv³¬\Û›?…(ÃŒ] ·swü¥Oݲ½æ‡‚Q/qÚÇðUSü”Ñ?–§zLJGº„*û^Íü‘ÂwnÅ4óœ ¸eå³Ï<®á¯cY›/Ì£"Amàî^h^¿áø}ïB8„ìÔyÑ ù$…cjtÓ”2'Þ*Ÿ¶Mµé µ–&¯©(4Ÿ¤L ’:ò^Q2;ŽkŸx+&tJÄk«›Ô.©øGÚó½gå ì¤ò½ßšèx{ø‰Šü]ÎÀrÂÑWsìoýùÏþ'PXJÓE€>%d¡Ðé³ÒJÿ;¡ç¢ÿ6³.ùendstream +endobj +1531 0 obj << +/Type /Page +/Contents 1532 0 R +/Resources 1530 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1507 0 R +>> endobj +1533 0 obj << +/D [1531 0 R /XYZ 85.0394 794.5015 null] +>> endobj +494 0 obj << +/D [1531 0 R /XYZ 85.0394 729.6823 null] +>> endobj +1534 0 obj << +/D [1531 0 R /XYZ 85.0394 704.98 null] +>> endobj +1535 0 obj << +/D [1531 0 R /XYZ 85.0394 519.4358 null] +>> endobj +1536 0 obj << +/D [1531 0 R /XYZ 85.0394 507.4807 null] +>> endobj +1537 0 obj << +/D [1531 0 R /XYZ 85.0394 339.3113 null] +>> endobj +1538 0 obj << +/D [1531 0 R /XYZ 85.0394 327.3562 null] +>> endobj +498 0 obj << +/D [1531 0 R /XYZ 85.0394 227.5589 null] +>> endobj +1539 0 obj << +/D [1531 0 R /XYZ 85.0394 200.4217 null] +>> endobj +1530 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1542 0 obj << -/Length 3049 +/Length 2721 /Filter /FlateDecode >> stream -xÚÝÉrÛ8öî¯Ð!¹ÊBc!¸ôÍí(O¥Œ­éêšt”HÛ¬¡HµHÅI¾~ÞøHìžt×T}„åo_@1áð/&±f\%Á$J¦¹Ð“ÕúŒO`îí™°kfnÑl¸ê§ÅÙoT4IXÊp²¸ÀŠc1Yd§W»ü°˜ßžÏ¤æÓÏtȧ?]ß¼¦‘„š«÷7o®ßþóöò< -¦‹ë÷74|;3¿ß\ÍÏgBZeAüëýÍœ½¹~7?ÿ´øûÙ|Ñ]yˆ–à -ïûûÙÇO|’v?ãL%±ž<ÁÎD’ÈÉú,Њé@)7RžÝý£8˜5[}dÒ*f:–‘‡NRùè¤*˜B:Ýå- “ðiû˜S'ËïÓ]iGçZO‹uî~%rZSÿ]ñÙŽþÆ5_,ÞA#hà¾ÞR§Ù-›ü÷]^YhÛsOóUmÚ¬¡Á§¢}¤Þ®Êòß8—UžÙóï { øô<:-‹Á öÄ4% 4\ß÷Èk€>3!X¢µ4ÈnÓê!'îñ™AÄ* "iàbUçÁF œPÁD,Q26`^ÁévÕ¾2dq [pQÑØ!J𳨬ˆ½¹¢ŽT<îÏìn{?™9x3¥™<4`QCK·âüsÚ´ùÖÊeQZç_Ú¼jŠºúñ|¦„c1L¼z;¿™ƒÐIVš_Û|Õ"OôeÀ’@$2_«6ýò£‡NpQ-ÂÀR`|ŠY­‡`CÅ8WÚ®ð¦|l<·Ð’Å\ÚÕ=ðS"ràÚ¶ôÀp\¤5Ÿè8¬„ ©C»nU¦ïF2aqÜ;„¢áƱˆöëÆâ·õâ»e¼ÁU½^£by %Æ÷ñi¦xÂT”8±ŽŽñk7”,Ò¡Ê·ÔÓ]cDz-ZNW¤‘i›ÓxJM“o‹Ün2z --­lêé¬rph&úcÚÚÍUù•zYqKîèÃï{³£^˜<]=Ú ùvÉÒnM+j Л´…£ÀøTæ°’gIæ?Ž+W`9ˆæ÷‰™´¨¹¹£ön~ûËüö›ÿzùó‡wó—2¢î+j®n.¶“¯÷Ø!FÎu ?§%¹Oø L~ÚÇ–íºcP³'ŒØ`%¢C‘R0¥Àó:baƒàP9¢€8D¶tñh´#ŒÉªb­*¶ue:yhŸjê@@ºnÐ`ôÚtÛΚ¶ÞØ][jûñ –Ú04ˆjzí@=ÚC0˜Û6­ONð ?R`hÑÎ_ Ý¯›àAùf¼¬¡T6¯ƒÜ·ùº^ÖeCS˜¶GvéÖ>éHUBYØ~š‹BºH»)²œÀ÷i]èH¸)Ó… †q&>‘r~‹±tÛ˜IõÑù¾t—£Õ’.•Åñ‡¼¥NJÍ+»¹¢¶ƒVïÚÍΨìýZïh´Ê)ÈR6ÈRÀìUºÉûÍþ„rAxƒjÈ]6°C@™˜;B³LWÿn –z¤­š ¶‚¤£ -ÓÞÊ—"°$.’G„€"9{``…F¢K™*2XpBÄF§a%ˆ@»|tÿ™p~ -Öˆ,ëô+Q£Þ`°˜–¥ýmÚ{åúÉðGöBƒ6% ‚½¨v]gZw~‰ O&*­}¤ì‡Ic”1ù0Ö÷Ùné– 3 $u¤ŒÉËÌSdí#uÑ{Œõ2mPl#Lôá’çbÚß3‰zUQIBÛÒ5²Q\€9Î¥öŠ•P8a¹÷’y 'pv¨ |xv(Mߘ¨ˆ’I×›2¿ð\)ÔL(­ŸÃ*x)V3É/ÔEæ3 Sê#@RiY.ã‹Fјå-ˆ &²’Ë©äتaÞÎ¥µ`xµÛ’h›fŒ’BN7[õfo‡õµT¾„‰Ô.Hi:ËWÅ:-iÌ8¯~î[N—˜yÃ¥4Ë\vÛ)/þ0™æN‰¥S¬£7ÕÏiQ¦KW#B}“R·÷u°½¿£¦Òª×LrÊ®¾ù*ŒÇ‘è•V\Ø+¬Ú´´ü‰À´óXŽùsäÈQí©ö•ç˜V‰ˆ&-¢Øíá#ˆr‡Î9(NX :…ùâµGAÐi3(ŠGá!"ìaüê ; ¼ä]¨g -Öx§ÝfCb°}F$LŽ§Œ·2 ºâ8þè=¡XøŒÏL€ú„(ªÏå‡âܯ­H«N6ŽZœ``q´´‰NpÄ -+E0ýl$§“QyàUuKtÙÔå®5êÛ'TÁHÉ}œFÉ®¨îj=œ"8]F{§§ÀÏ -5—øE½²Ábm«+®:Ž±¼7Ü6VYIµ×MÚË¢,Zqö'ót[F$`KiX'ópE,N’ηùœ›P ±Âš¶ÀÄá»4â¡*¾Q˜£Ñö¨²Ây_pC<Ù¯b®ã}ÑÙÒ»‰V¬õy5.çu"3vkëYIg0bÎ@TçV¹pF?÷RE"\Û¤`ÐiºS3w*¤}göd¤¹Ì‡ómÑ:g³±R€»rr4îK«•{Ù8§»2?úˆ6¾c*ã:qᦈ÷Y‰ŽÔé§ LSrX‚¢ æ&ï*äC)Ï ûX€‚N$Ïû׿¼äèÏ*•üânŒψ»Àçäà$“NÉ»vñ˜Vv¿£Hi07”r÷H¹ˆ\¹–ÛŠ¬\§­yØÑÊ“ÓoXüó˜ìîÀ`ª6sUöÞœ[ñÿ&¶Cyø³ÄV*–œüðá¤Ûq\lÁ5ˆ(ŒŸ[K‰X÷o­Ï‰íeK2¶±YƒI3”p©;ÌÐK#Ùw3ãbaá74Ógß0þaq{AÃæUà‚F_wýxzyá-äÁŸõÕeìÍÝ Î Hò}dÔfíuþ€Ï¶;ŽsNk&¥xο -ã;¹ýDbK¹ãc¯ä ³1Ðtï# ½dõ:u -AQœÉÄ®÷4ž^¯ò¦qjÔkHÔ¶æa™^ÚÜ—'¸0@ïûHÖs¡ÿÌçñ„!Ž€Þ³ `B‘ipß|w¤8~±˜üòÑ8<ýÙQÓçT[Ïýö$;9þùˆ<ü|ÄEÏ™}ï¦oXFì¶ÂÑ-“»ïböTŽB)tÛŽóû.j ÚÉHçí®oôîd+.ÕÇô>¥y2Ó$"HÜ â:I¢AŸØIoÞì]¤{®Ç߶ÚI¿ðc¤1Wï.ïîFÅŠC)v\‹ŽŸ—y¾+ã“gMÂK¿bë¿ä L­Hú%¥({)¤R¬ôÏ}îvxõÿA‹¬Àendstream +xÚÍZKsÛ8¾ûWè0ºj„Ń Á¹y2ά¦&vVÑVMm&Z¢-ÖJ¤V¤âdýv£$%ÓN²qjW`£ñjôãk@j"áOMl"’Lg“4‹…•ÊN–Û39¹ƒ¶_ÏóLÓtÈõóâìo/M:ÉD–èd²¸Œå„tNM«·Q"Œ8‡dô¯ë«Ëó©¶2z9ûjÊÄVG/þ~ñzq9§†„Yž]ýB”ŒŠ×W/g¿þs~qžÆÑbv}EäùåËËùåÕ‹Ëów‹ßÎ.Ý’‡ÛRÒàzÿsööœ¬`w¿Ia2g'÷ð!…Ê2=ÙžÅÖ(›³7gÿè´ú®£bRRh“è9i3&'›‰Ä@Ê©Ê·ì>Ñ:Z¬‹ó©±q´ª·yYQÛ©vW¾/˜X6T¶¡Ç6_®ËŠ?ÚšÊûu¹\?`,7ÜZn¸v¦-60Åþ\¹¨Xñšf-Š<lÄÀ6eœjØ>na{h˜ëh»˜d–0Ó:ÏÓä2O¦±u±‰›L•™µÚóåMS/˼-VtÔùjE+j"Ðײö%3ý)­¼ *Ð}yÿ€¬˜Aë”5êêâ«cÉ#VuK•æp‹ƒþ)¥^–EÕ +¿P LEf´ó |égH\”SÁÇ‚U:·á#ÕQyKD=-™>ý¤PÞÔíki', ª¶ˆ³U]…ÊWŒ1óäþ¼ç.%J±ØûVàcó?m‚?%²nRI¯ËéLØT¥ÇîèÿëÖ1ØÔ£+ ~Æâjèq<Ô4ìi +ÿ‹TÙ´óu±jÁ¶c"ÐÂHöu,'±¬·è^LG3ðèFK:(¨¸HÉói*ÙU‰£.'â³T8«² /Å}ýîPŽ*5ú›,IDšÈd\` #Ç°˜+JìT)jŸµ² +Àxzb#PÕ¢ P•1Ïé¨!Œ©?1(äÂiP2bTOpoñH±G¨ŠK»rMMª„K”>†^W"j-J- õÞœR7E³ËeQx@håP®V>"¶´Á€*ÄÖ;Ð1©i¡,è‡BBËh¡{8+ÁU§òÐ §‰ƒc‚¬@(%Ó.o4$JÀŒoŠ¶-«;m±ø½Y`H4²Xžû‚€Zµå¶˜¶õ·M’Q°\ÍçTz¹YÑ%„ÊáÓèéMÙr Å;’x€rǹIÁ@Òsчªl›áÌ @×e]­$ÑwS&Ñn_nó}¹ùÈ4Å(öö˜41¼‚¦ÞÀ¹6Dº_S*bp“̶„Ô° ê|Þ`ˆ‹ H Uª¬Šf¹/o +i]ßSeSû€Z ãòT7Å`¢U ÝÖ}Öc"/B(›u}Øt­³Ê ­¬õ‚ýÁ{‰X;ÃWp„‰ft +‰ïH¤Ø˜·TÒ­ð´õŽ(èw¨…=t‘Gƒî o—žuL…Ùi·ùaÓžø¼N!Š>òÏùÆõÀC}h\]w›²<¨)Ú'”b ï¯;Âo©¯û?©x¯i$»… );Þ¦&ºÌñ>UkKÚr„ +]ob-§‚„‡ß •äÍ´e@õÞ#ÂGYpÎç&á&iÛ¡›{ܹQ‡m/'{/'‡^Nò^Øc'÷^å0”ísiÀç§>ß"–ª w +*ò…©ï©Ò>™ú»´&ñtáoá3E®#óW·á‘Dª‡ÄUq®"¶qÏTƒL$Q5™±wDõán}Â¬è¬±× OU|ØmÊeéñÒ7«~¤„¼ 6qÖóãH +q‚TÕÚȱÌÒNçÒh<’0σä æä`V¡ê²z¾Êw»>ȱÏ^¿?1Ì Çd2¼¶¸¬Gׇ¶¬+jE·Ý®½÷Ž’d öºÏ«f“3´ôñ{Í^õè%ÃðÕ66à¤ìñ3 +ÑžÂ6,mETýHÝ0‘èÀÉF¾ÑœEYMýüi‰|¿ËGäb ˜‚ éj÷åRÊTŒK¢×‹9UŽ¯Ó1«HµŒ.Á!•>\9zU@VŠkžp²ß|4O¡a›¯Šã‘6 IÌé¶5=8M¦aÍGÑ°)ï*Šcy…Îé>ÏO ò4Y¾"ŽMqëy ¿8èh_Þ­[|Ëi—@¥2€Sz·«›²-ˆÜOäÃXÌ Zþ‘(¨X´¢à¡û\ÚÍ!ßø,{ïËv:† Û¢ò¯.˜Ù~rÉà ¿ Ò›‹vBýâ§ZȉzjÖ/lPà"…ƤÜÀ 4pÌ˺™@z¬»"{ô2§¯Y뻉FÒ\sâ=Ž8íîï1u‡÷] Ræ.½*¯.¤òŽ”¿ƒi|eYPóÃwÅâ._§%os"²×]p .†rPìóôÈÇ¢û77#Q£Ð•øSWJÕD[pþånÃh3P9±D"ú;¢,¨TüdBÂ|ëœ9·}šîùI+` “ߧc“ð{×0ø…•Õ¨FäðvpKöŽ/£¼ÍÿôX&­0“¶:þ 3ég»î¨J´ˆ³TßN3U˜J;CÍ?\Ïg¿âE´UFFÇÆÐùðQ@6œëë–ß²o +…?! ˆŠ<ÂùÔ¥ +”IþÍÛVnëú釰N0ý”Ï%—ï¨B¦¥ôÄ÷8PÕJ¤Àî)>š,û9‹œ|ò¨?÷Ç3ýˆ`uÆ9=Ž‹;ü PdzvñƒŸö„_Ù0×`éÿ‹³ endstream endobj 1541 0 obj << /Type /Page /Contents 1542 0 R /Resources 1540 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R +/Parent 1507 0 R >> endobj 1543 0 obj << -/D [1541 0 R /XYZ 85.0394 794.5015 null] ->> endobj -522 0 obj << -/D [1541 0 R /XYZ 85.0394 713.4234 null] +/D [1541 0 R /XYZ 56.6929 794.5015 null] >> endobj 1544 0 obj << -/D [1541 0 R /XYZ 85.0394 686.2623 null] +/D [1541 0 R /XYZ 56.6929 703.0246 null] >> endobj 1545 0 obj << -/D [1541 0 R /XYZ 85.0394 478.4096 null] +/D [1541 0 R /XYZ 56.6929 691.0694 null] +>> endobj +502 0 obj << +/D [1541 0 R /XYZ 56.6929 555.5354 null] >> endobj 1546 0 obj << -/D [1541 0 R /XYZ 85.0394 466.4545 null] +/D [1541 0 R /XYZ 56.6929 528.2309 null] >> endobj -1540 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F53 1017 0 R /F41 925 0 R /F14 729 0 R >> -/ProcSet [ /PDF /Text ] +1547 0 obj << +/D [1541 0 R /XYZ 56.6929 486.7584 null] +>> endobj +1548 0 obj << +/D [1541 0 R /XYZ 56.6929 474.8032 null] +>> endobj +506 0 obj << +/D [1541 0 R /XYZ 56.6929 306.0886 null] +>> endobj +1549 0 obj << +/D [1541 0 R /XYZ 56.6929 276.0992 null] >> endobj 1550 0 obj << -/Length 3201 +/D [1541 0 R /XYZ 56.6929 186.806 null] +>> endobj +1551 0 obj << +/D [1541 0 R /XYZ 56.6929 174.8508 null] +>> endobj +1540 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F21 710 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1554 0 obj << +/Length 2210 /Filter /FlateDecode >> stream -xÚÝZKsÛ8¾ûWè¶rÕˆ‹ ‚Ç<œYOÕ&3Ž÷²³s %ØbE"5"eGóë· € DÉÉćTÊ%³ñn4¾n4Ðà|’©D¢˜äEšdŒg“ùú‚M ìç îêÌ|¥Y\ëõíÅ?ßÉ|R$…jr{õ¥¦5ŸÜ.~Ÿª$M.¡6}}ýþmq9›~¼½ÌÓé+üw{ýñöúÍÇËYQh1}ó¯W¿Þ^ÝP-5¤×ü͇÷ï®þÏëàÃ{ʾ¹zwusõþÍÕå·¿\\݆ Ä“äL"÷^üþ›,`®¿\°D:›¯Ý˜y…ö­Q–Rɲ„Mm|îD³.[P*Z Y¯¯âÔ"Lû6Í0ÉiÀ§¥©GFR0Ñ,¬ÚH×VŠç½hXݼÈ.á—x2“¶1-ô;°zXg$Êûή^æm²ÕÒmY·÷>¿q_Ë75ÚlVû Ó ª¾ÊnfÆ´žÓV+$a‚¥~4–öº ´Õݾ’·ŽH-º6fÑ H%BºYØ¥—(q—27̶u‰õÎSV_Y†byDÞ’ÊBB©!Ò±Óë«ãÇu±Û½Nà €\e_§›…æòX7A^­¬uÏA sÓ¶$+HAyí²Ù­D?à¼2EF ÒÎXçv†DѪØM@ÃÒWóå RN˜¯Ìr}4q‡“;‡'”­lÆܨÑ–9c^¬˜»ï«)¦7ˆ‰¯”$—ÙP’ÑeUlgBëDgààûjÕÁÌ–(x~boQ"Ñ…äÏ9`úä¡ã}îZÓö½[¢6ÝS³ýD‰»}ç²òä¬SI; K<6ÕÂõAÞÞ|Yu&ìô³…Ù˜zÚOuÈ'°µWÕC=£ùkp¦…<ØqÖ¶‘HÅ´mèÛ-K—Sù/ªd*­_„éõ΂(ôÉo”/ß4m[ÝÈÒô ïTÖÇHíŽë·ÛÔm·©Ûná Âs%UÝV ãy4ÄR ðpìƒÝr›ë¶{°íkÐ,¥9ÖJD­ -ò_!˜)Q^IYÎ¥… oÐ0×ú°Øp0`[’Œóg£Xz„èÔú×0Ⱥüd¼ôòÆÌ»rþi·qó¹ïù±AÏáÀc—K«Ö©‚ÈγtÌ EýA0(µÓõ 6~Lý‡§[ mp8#§×µ$Øž‚»£„;¥p:SRû3ª;jÅgTlß‚“qêx¥•tZs^µâö„ªÒ`&:øµ”»jì> -(WÌiûÞm~UÓ‚‘VNY±$xÌ ãzk HÎÎÚ6„ù¾œûBò©”EúÖåYI*ô5;×ù·Ê„»ø^EĨõó”=LA‰ŽO9Ê”®êùj·ðuí4RkÞìjØ?;âUÞ\õd¹ãx4ëÀ×I*hÊ ¹!áZLnmÊÔû~·ò' £Ã‘;ÕÃïΖT;^* ÐÒá¸j¸Ñ¸®XpÔå¹ÞKgl¨0¸OͶúË÷08T—ûfµjž‚ûþ8öCN×àv$W‘«I*³D@|ÑõOr¦†·#«‘ç5 -vê³×3ÔŽAWŽô-†]ÍüŒf)¬zŠNQ¸y‰•XAkÃÄÁz1!¹»)ƒ„vcþÜ™–nXb™I–'™ƒðmL‡.ŸáZrthx6d› ”Óz·¾³HÍɈc^ÕÏ Roߤb‚§› -Bã1¢/¦$¯ŽM?üúæÃÛ«c1 s*ø ŠÁ"É&³þŽíA¥Ô°[æ"{•L$9OÅ*Û™meNƒ2à¥@yžé”1×”2—”H[Ͼ=(1õ§›’MØ= ¼ í7ÛoÌi0¾œ¾0‚‰Ö*ûšù'Á˜±¤`ú0Ê\')Ëè2ùî{h¾ŒÑßÆsƳL0¸¶`L`DÁh¿aJàŒXdÁˆÄ1Ec&”#Q­=e"®ól¥¡ìþʳÇÚ¬Üåe2ù;Òoø ž0 ÉX¾˜¾3X¦/ KØO(ï3°„Ó„–˜òÿo¸Ÿµ6ÃÔe=7_ŽÍhÀÃæÙIôØŒg1À¦`Sy>¸ËB¦ÊÃÝŠ¢¸™á3’G³ÁøžŠÜiçݲ=uÙÝžAô‹Éîv8„RplQÏ Z2É„¤óñß¿Äñ/åsœç;€xÀx âT¥ˆS•y‹µÝJ038;{êñ³x+`ãR9§›ÃÜÝaR†w.0uì\Ì|Ð4ŒjÇßô1^Nâß ôS°F‚}Íöä[œ„>8–«g õEV‚Þ€Óé ÐÛ×îNâ¦5gn$âA¾ïûgï±sNþ6€/øÛ<'òÜ,½¡Bmi¬DŽ4æ`ÄvÓ´£@­ºê«eON3 ÷=”˜K1T,±÷w¶ìøgPEë™c j\;¦^mׄ{;©)Ôˆ_Ò/ æ´$Hb`ä®lá :˹ˆ}ô1¿è+´éÅÖðûÐ&%rž?i¢Šbðbêèå”Àc›–ø¦%ÐiqwþáOAlL’”_a¬UÀN~×ÚÛnæîÜáçüuÈ þ:Òñ+sa%øΛÕÊ’˜¿Çž—ÍSMäÆ÷áƒÔÂ]¿áC¡Ì…élÓhØeéÆ ¥å®[6[|*5ž0î’§>T‰lÌÚsq °ÒJù·t™Œñ„.D\(ö¤cíÎ’þ¹ÁÞŒõêèPŒ€2€þ·Æ pp­ÝoƒXZöÏ‹x.¾#¨º%e‚ˆªƒÇ~A€°êd ­N»è,…¼8xuíúnt›—6œ:¸9?èÑy„ñ+(8 u!N}ïŸ5„æ¾Ü­ºuw§ÍT¸•ðýJɇ/ËŒðÔPFwˆŠ@Ò{°ª öÈ(ØÓúÈñ …ŽA*¦jWRµ¾7´o²Y•”ÇÝ3Ia'ÿ&í¹øöÄJJiˆrQE¢ŠD^Ü`-ØÇVã}Pÿœ‡'ýDfý»¨Cƒ,‹>°_c͇Ý6„Ý´{„ƒV™»TǪ‹þ` ¶¥¯{ÞÖtÆž1¦jåŒjÅ7™Jã±Â7"šžvi1T Èž/˺6+*t/i4?%‚4ÃÇŠc¸nÆ”UgIž µ1.h¯iÑ-[ƒµÐ„, •CF¤§£çuP÷îÖ˜SoqU–H¬ƒe§¢íĈ›±—ÇQõÓ¯d]o -wù—Äìä!+œ[ñ¥1/G›Q¨tž…£¾¬%´ŽÈ €]ÅÄ#c²ð:ø›*÷Ds¨µç>츎)d^«#Îý‹æcÖÿQ(Tendstream +xÚ½koÛÈñ»…>ôƒD{û$—EQÀçÈ©~\]S\.hiHG¤ìä~}gvv)Ò¦í´IŠáhwvvÞµqø'FÖ0®2=J3Í f´ÜñÑGØ{s$Î4"M»X?/Ž~:Ué(cY"“Ñâ¦CË2n­-VïÇ'ÿ8þu1»šL¥áã„M¦&áãŸç¯i%£ÏÉåÅéüÍoWÇ“TóË Z¾šÎ®f'³ÉT(m$PÄï—3B:ŸÍ&¿Í-Ë]±WÈ泥÷øhÒýręʬÝÃÎD–ÉÑöHÅŒV*®lŽÞý³%ØÙõG‡ÔÔâ[Lq#¾êZ!Y–=|-å+fû -:ÇVã‰>©ƒ€”´ªµ¢T#!XfŒD3fœ¥Ž§Æ€i2ãjØcfÌ$Z ¢àÌ( œ{ŒËÉ4ãü/Çì4µÖR¸Ç*‰7>ã:Ëát`/êA~á§ùVŽ^W Ш#S¤;íö"%²ã˜B¦Œ§®Wœ%<³žáÅÚ‘P‰êàJ`Ĉ(Ô_.¯æoæAøM­™5< x›¢tõdª2>.Jú6@Þn¢øøs¾½ÝD”|¶np«ÚÑÛ]5f|W¬Šò#--«²¡ãM Z=G¸ë‚Õ8h„,JÖ«ÊÍÀ|ü‡”)AHBòqX_Uô-«&néê:Þ€§"Ïoo®)!HPyÁÍe³Ï7ïëü£Cq \µæ^Ù‡ÛHÛ×nåà‘uéY_;Ä•©õ²ã·(WÅ2oâê:o"–:: 'júîÜ&oŠ»‰4ã4Û³›¢n€WAøEÉ:´ÎR–(ðœn0}[|b&0Y’¦‡ómÙ£òše¿ yÑ ùˆ—èBZP|`®5 Îùø´£tû{Uºx‹M€^;·Í’†4#…û|˜¤êvSiíø<Uï¤l6>­v[oQX½ÏkŠ²hŠ|ƒ¾‚?WîÎeéíäwéèÕé -@Æ7åeÀY©l\ï¯k÷iïÊ&R»v®$È}n\¹r+ôYð‘wkäjÀ'É[@îV„ž6Z.šÚmn\Ów¹Éë‚/»[¼³ ø $»‰†–•ÿ®Zô€õÜõÛ}ˆ]‡•*0Ðò]ç[×á…µBZ¦•P^Èaâ`ibŒ¬¸Znö«LÁ±:‰W«§‰ʦ=Ál*¡¯ ¼W¤À­P‘Ðüâäì·×³J‚(•J¤¯r5@Rj¦”M#ÍÅâŒ1• T¶ŒC)ÍRk:ñÀDˆˆEÔeª/ÇÁÛ/e“þë_Ê0#’ÁdzJK™R¼UµÍ‹rZ¢i_žX&µŽ†x?@M±4êmYm·è“–‚: >ð> °?Y¤Â>ˆüI¿d|Cêh‡Ú5Þ¯DtWDCXŽËàº"f~€î Š<^ú:…‘0+úæåöå'¨Tf‘ãaUR\¸7§“†ì'B4‹1ÙÕ yN¥W}‰tŽ M1 _ŸQq#,#9¸1Û”¯bY4CQ% ä¤6rÑ‹™˜ˆþñ7BÐ]„”¥ÚÚ€€¢uܧG :[èê#©¿0Õ#ņ“i“E¿¡è1—ûi¡’‚Ù¦‡}Úƒº‚’&u×PÝU«vRtp*o6¥€€HL?Í×·nÙñ‘CúmÖCÉ.ɘH³äef{a›{ñ?î·m (b¹húe÷f>›]×Õfß86`Q a:ƒ>…^WY©ËÍ4Ôå¨7bäl¨¼½{÷¼“ÜÉÅñ9Î^àóãùÅôíìê_0Ì &·î}‘g¨´Å]¾ie+<æùÁY¸žÍþ}|þëÙŒ\ž3b:°’ô9é#>¶ ßHµèdpù(ƒÇjòÃRx¯\õ².ÌX‘À hH´ðÅ^í°m œ¢M›¿½ÌCäÀ›¥Iÿ—zJR8ÎÉ´ßQ\QT±-S)Ì<èýŽ´Cá ÆÝÆ x‹W5ZÛ¯R™°möÈà >¼àj^ðûþ†q—z™À^Qú´1À—ßΛ¸Yâ·ÁÚÁ“ñüf¨çŠq+Õ‹fâ @•uSïf$ª7ÇÐ,}¢?m™í¤‘ŽÊc^»/šõ`+ª6S}mFƒÞ{H—±†T°w¡'«°Þµ{Л>_D +ÖÇQþ¿ã) +SfhòTšB—ÂmßG))h-ãarW½@g=&ýNÛ¢Z€çÎí–×ÈŽ%…ÔD¿Ðê:÷Ýî +BÈ7‰`iüϵÇo´Ž~U•K×#‹ShÂ,Ì’}ê:R~¼pewXÉWì©w8)¡£Æÿ=^Ä2Ť„9ùë'îxâ©ñˆÌÞ/¼ˆIŽh‰üž/bÂdL'Ú~ÿ'±.ågÞÄ>GèP!ý­Ó,ŒÐÚòNΩi‹Â™ G8>pµólB õºÚoV„‰ :®í\ÝT;Vó?jâF^<Ê)%YbQõ?6na£ç­çïÉ ÓÔPq˜ µ6ãk|—Ú#ï:ñE1_à·.¨wA¸* ç~íè5IT?b6@tÊžXÔÀù¦®Âý!ð"sýÑ!¨ › e»¹J ¾›«TÇýš¯!§„?~½m8»ðE +—Ć?áâRY7d·½[í< çôYùgµ»"Ÿ>‰¨|5»ÙU[‚è=&¥÷˜Wæ i¹¼Ùïü#á«Ãƒ~QŽ§_ܺÁúmñÿ#_Ü„„‘"¢ûâöøO%¬Y¦»ï êQwºXœý¸Î‰?îý€w«³öeÁÝäûM3mšÍÿùea¨”€ø7–?Àð6góŸ{vÄ>ÂZÙ­ Ý. %¡ý +L!ãÖ<äÜ( ÅO¦¬ÿ…ŸžÊendstream endobj -1549 0 obj << +1553 0 obj << /Type /Page -/Contents 1550 0 R -/Resources 1548 0 R +/Contents 1554 0 R +/Resources 1552 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R -/Annots [ 1555 0 R ] +/Parent 1560 0 R >> endobj 1555 0 obj << +/D [1553 0 R /XYZ 85.0394 794.5015 null] +>> endobj +510 0 obj << +/D [1553 0 R /XYZ 85.0394 663.594 null] +>> endobj +1556 0 obj << +/D [1553 0 R /XYZ 85.0394 640.0743 null] +>> endobj +514 0 obj << +/D [1553 0 R /XYZ 85.0394 573.5829 null] +>> endobj +1557 0 obj << +/D [1553 0 R /XYZ 85.0394 548.3076 null] +>> endobj +518 0 obj << +/D [1553 0 R /XYZ 85.0394 357.2459 null] +>> endobj +1558 0 obj << +/D [1553 0 R /XYZ 85.0394 330.4365 null] +>> endobj +522 0 obj << +/D [1553 0 R /XYZ 85.0394 105.6253 null] +>> endobj +1559 0 obj << +/D [1553 0 R /XYZ 85.0394 82.6167 null] +>> endobj +1552 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F21 710 0 R /F53 1027 0 R /F11 1384 0 R /F41 935 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1563 0 obj << +/Length 3050 +/Filter /FlateDecode +>> +stream +xÚÝÉrÛ8öî¯ð!ºÊbAöÍí(O¥Œ­éêšt”HÛ¬¡HµHÅq¾~ÞøÈ➤jªÆ>Âò€·/ ;àŸª8ŒSžžêT†*bêtµ>‰Nïaîí ³kfnÑl¼ê—ÅÉOo„>MÃ4æñéân+ £$a§‹üc‡"<Qð¯÷×ó³WQðæêô˜Š—»ø°˜ßÐDl—þruýšFRj.ß_¿¹zûÏ›‹3-ƒÅÕûk¾™¿™ß̯/çgŸ?™/ú+Ñb‘ÀûþyòñStšv?‰B‘&êô~D!KS~º>‘J„J +áFª“Û“ôG³f«—L, +¹ˆ¹‡N\øè¤Ò00…tº-:À)‚î¡ N^Üe»ÊŽ.Δ +Êuá~¥3ÆÂT)nÝfõ}A,ŒfœI-KM#-\¬Îá<Ø”c#Ê!¦‚'Ì+8ݮӗÇa"ƒ‘YT¶vŒü,k+Bo.©ÃE” gö·½;9x3¡BÆ¢¸—ë„8ŠÆâúkÖvÅÖJyYYç_º¢n˦þùl&˜c1L¼z;¿žƒPIV7^—ÛbÕ!OŸ#ès¦’I™§ºË¾üì¡\T±XY +LO1«Õl,Â(Ò®ñ¦zh=·PþB üe@ å0ô#ÀõKQ°+œ7ˆÆX”‚ÕÃHÅ/ E*Bé½Pñ¿Ûå®™ð"‰•:|Ú,Ûu;¦ f% Ø`a4ŠCÇ ”I ¡­ãDË‘÷®ZÈŽ.ŒfÄ YTì EŶ©MG“gD£ëƒ×eÛnÖvÍÆîÚR;ŒÿÔ&Dc(‚+êÁ‚‘ܶí|2‚§`ì™’òB‹6þmCxÝ*6Óe-à)yOhF¼*.ªŠ(¨Mé’¢E fuî¦èõ®µ0—…OÌ7M[b¨÷L&¥ʳx3bà÷ÉJD¸ Ü Örpù`ö[ çœ0HùŽ +‡xˆ³Ôàî-}b†ÎÊùµ¶ç#75Æ8Vgk7x··êypƒÓÏ6‹È=C»´‹†*÷š¤‹c&ƒ¶¬ï«Â·(B~»X܃t)jâbaLâò¦ª²­ƒ{_SFg~=­—MÕÒLØÐÃcß&Z{g3e…îéé§9‹ͶÝ0! }J‡?¨¿©²D&$áøÊ$› +µ‰ë´SV­‡ÀÎ ƒÝ¨×©ÒX¿7êŒv½¢_&‚CkvÝf‡ÚÇ<5;š® òÀ|gáÀd&Ì·›ýÉä8xðr†Ç‘‹³w-†§xGl–Ùêß-„Q´Ò²ÑVõ8v”¯}Ù(sÀÑœÈ4(ÂûÐ 2PÍút©ö c€É#B69 Ë,Rƒ~ùè®3"yT`,nÁ:{"j4Œ³ª²¿ +A{ÒÜ<šøGŸHxФ¤Rî´ë&/ѸCÜKy|(1wôö2S&Õ–Æ&cÞaŒ7þÜÒ/'Hj-Œ)ªÜSæÝuÑŽ{lõ2kQl5&ùpÉ3 ÷LõHUÒ„¶£k仕Á Zà\æa/Ó©ÄÌ Ë—ä©`ñÈFTÅ]G—[PIk"࠲ѼƒUÙþ3Ks `RžLiÌ1‚Í%? )2 SÇ$ÜühAÖúLWÁÅÆ„ + ½;$ãnÁÀøç†{Ï‘EŸ>y §pvÜWî_ "ÒÁc²€(Å—l½©ŠsÏ•b2ÑÛ΃XÉ—b5ãѹ8Ï}& …8‚Á„OZ–spÑ©dzÊòDsXñ€GØŠqÊqkoaxµÛ’h›ÜfŒGûËx°_áàô;¬·¥Ò%LdvAFÓy±*×YEcƼs_ ºÄÌ-eyîÛ^yñ‡‰ËT䔘+`Íݸ) |ÎÊ*[ºb9ê›”ºCù¶wTTVõšÉ(Œy_ZÈ}Ň0J4”–Û+¬º¬²üÑ`Ú±45áÏ#'e§ÆWš •è ŸÖ$€7¡)ÚÃå7œ9pP’†Rô +óÅk¤ìµÅ£ð0~÷]Ân ºáv› ‰Á +ô‘0é0ÞÊ,è ãøcð„bé3>3êkPTŸËÿ+G~m…Zô²qÐâÈ‘ÅQÜæ9‡‚9Á°þ¥¾ËI•N*ƒ¯n:êd˶©vQß!Ÿ’%÷qÅS‡+óxpÒp:×{§gÀÏ:ïƒFà§Öƒ"Ý6Q›UÆ1š÷ÜÆ* ®°ìºÉºrYVeg"i_0p²È¶UiD†±Š†%2ŸgZ‡Išö¾Íçܘ1°Âڮļá»Dâ¾.¿R˜£ŒÑö¬óÒy_pCQº_À\Æû¢ ²ew­XëójZÉë Dfìpæ8ÎȾ3ËRÇ_¡à³M¹’`nRuäAaš8ÞnÀÈ«€2(m*h:庘uͬ¢W31ÞCFÃWõÍéç^šhƒ£ª0Kª¶?2wG’)ÚwcFn…ËÂñö¡Ø–óm6Ϙª8*'øè5Þ—Õ+÷œq–»ª8øt6»CO)2ŒTꌌ…÷uB¥åñ|\w£ †¦èËâcù.JûB€"N$/†'¿¤DèGÕH~¼ íÇhਠ³$T‰<Ê¡c’®\¦„ÝoÆ(@ÍEÆ="δ+òÁr[Ç‚•ë¬3O90ØA +äà}ŪŸÇX÷wÛ ­´¡—+­ôæ¨Ø²ÿ7± Ä[.ö±Ïžt;Š-ø¦ãä¨Ø²„‡š%jx]ý–Ø^t$c›,˜ìB0—±Ã ½-â})3ž&~K3£ú”>,nÎiؼœÓè뾟çÞ +üY÷[[®^ßaÛˆ ßGãQEÖ^ç/¸j»ã Û” +9gÇÝ*S =‹›Â?Ä“f'‡ÅAZ èÞG6bÉ›uæT"7“}]íé:q»Ymë¨-לmÍ;2=¬¹/Ž°`„Ü÷Ñk`ÁðYÏÿâñmA‚‘×LÊ 2 +îû¢gßq ÙW"L 9hÿÌ(Iðóe+ê…ß2‚X§‡?á‡?Éíó6}³2a·Žáë˜Â}³§oD¡€dÛnšÓ÷P qNN +ow}¥§&[ pé=¦ôÅÅ t’53Nœh0Ü'qÒ[´{é_ç§1·­pîÅa=—ï.no'ŠçR츶?'ó|G~Ó¼ô«µáË=iêCÜ/)½@ÙK!•’øÙÍÝçmϯþ<õª÷endstream +endobj +1562 0 obj << +/Type /Page +/Contents 1563 0 R +/Resources 1561 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1560 0 R +>> endobj +1564 0 obj << +/D [1562 0 R /XYZ 56.6929 794.5015 null] +>> endobj +526 0 obj << +/D [1562 0 R /XYZ 56.6929 713.4234 null] +>> endobj +1565 0 obj << +/D [1562 0 R /XYZ 56.6929 686.2623 null] +>> endobj +1566 0 obj << +/D [1562 0 R /XYZ 56.6929 478.4096 null] +>> endobj +1567 0 obj << +/D [1562 0 R /XYZ 56.6929 466.4545 null] +>> endobj +1561 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R /F41 935 0 R /F14 737 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1570 0 obj << +/Length 3287 +/Filter /FlateDecode +>> +stream +xÚÝZÝsÛ6÷_¡·“g*_ÁÇ4qz¾™‹[Ç÷r½>Ðls"‘ªHÙuÿúÛÅ(QrÒø!“Ñhˆo,¿],°Ë' ~|bòŒÉRMŠRe9ãùd¾:c“{¨ûùŒû6³Ðh–¶úéæìÇ÷²˜”Y©…žÜÜ%c™ŒÃ'7‹ß¦oÿùæ—›‹ëó™ÈÙTgç³\³éO—ÞQIIŸ·WÞ_þüŸë7ç…šÞ\^} âë‹÷×Þ^œÏÊÒ诒|ß7ØÉ÷üxsùöãùï7ÿ:»¸‰ HÉ™Dêÿ8ûíw6YÀZÿuÆ2Yš|ò–ñ²“Õ™Êe–+)CÉòìãÙ¯qÀ¤ÖucZ.M–QŒpMð çY™çbÀ¶¼Ì´Ò±Mg2+Îgœ16}³XÔ}Ý6Õ’ü¾^ZŸj7«ªïp½0ªLö‚MfBe¥âÊ wٜϤdÓÊE¹¾õßK‰®¯šEµ9çfºðUöÏ~‹cæÎM÷dò°‡X\úÎÛõºÝ5Ã1«ÛzY÷ÏÃݶò“´ú.¶«õ°Ý_mã‡ùcbiÝRqq‘°¸—#òi sn(I”v™Oo€Ç"Åo3¦´€áp”Mõ4ÂGÁ3^pß„F¥ꎾóí†ÓôËg*ª«zYÝâ&¹¬oYy2«d;w´zR/÷†¯ès[7Õæ9mï1ã@Ÿà… !™#‚Öô進º¹'À$‚÷ŽuÓÛMÄÖ¢ê+JuýæÜL·ó~Kãøúšrs\-ç|ú•;ÖcÅí3PnUm>'|Y½"šÚÇHƒ &–mµØ•Ö+›Å­.²R +ãVö¡"J|ÁÏzS¯cDɧÝ< ¢,6"aŠ@DiD ~ûqp2SŠ§ÁÁ2#K½‡7xG_ûçÚžóé¼· ?[Kß[OŽm즊ÕwÄŸ-ÈÓept1„P1Âp9 ·€˜¸D‘.Q”™Tyî©oª•]Ìæíj ÚÅMr¸^˜Dk¡|h»u‘¯ig„rDÃœ·¨KžCÖíK·þ{·×eñ DÔsÊ ˆ-ýº§"ÇTl¾í[àt=¯–€,/*c¬(‡r0Wj ËY}GévåÁ d¢\C:”uk;¯‘Å¡72Sjy„™pH ŽxYUHíÐl'°{ü4"Ì„>íµÉi§ی̤a¥¹Òé¶ -a«xa|+T¬~]¤—!öx2“Ž16l_ªÃk‰ê®wÛ—ìÄtS5Ý](oý×ÑMÖëåsjÕÐd»=c»=/訂Œ@ÁT˜©ðBÚ ï®QP˜ŽbéÆÚEGI€*ɦۅÛÚy…G”qI(óÓl:ŸYmCÊ ,Ë‘-€»!™…„RKIOÎN`==~ˆç±ÓëžÀ(ô +g‰à@8A‚Þ,z/€!sÛuÄ+ÈAeÝC»].(}ëÊ5i-È{m]¸RŠvŶ¾ž? †!é„õʼ0 ÷8¹õxBÞÆæÌÏšœq›sØŠ¥Ï»fc‚)Á bâ 9Ée>ä¤Gô}U7Û™0&39XÀø¾Yö°òûdÙ-;~cám5ÿ´]ûõÜíèqQÎáÂã¶kë΋‚(2Îs5f†¢ü ˜ö„ÚËúž„G?&þÃÛ‰«ŠŠ6Zœ‰Õë”ZuW`ïháoGŠeBKã/[Ê_µÒk%öïÀÊ8v½2™.Jº­y³ZswŸÕiP=ü;*]¶î… +ä+–t»Ñ]yÝІ‘Ö^X±&šÌ ëGë,pέÚu„ƒù®š‡J2ª´CúÆ—9Nj46{?ø*„Ê#§_eB¨3ô´»LAI¯9Æ”¯›ùr»mÝ4ÒjÞn8?{¢U–A]@êÉÆ‹Çál΀¯ç<40T@|Äï=²¸•­ï»í2\nGþZ¿¿[Rët«@+㺋àFåBø`?`ÂQ“ç&AøŽ;cSÅ À|ºo7õ_at€Á¾¸ÜµËeûÍ/0Èq2ºö^GÊÜL”Ì3Yrýy¯#<+˜>Žü­N(8¨O¾ÎP?Cùdè1jæ4S°ç +M¢øî28åE&%hYº‹ Éý; ¨«È²kûÇÖvô¾’rL«JÎËI:Ã×ч|j©àÎ`ÌjÂOQN›íêÖÁ´ ŽeõnI{÷á#U6ýú\jŽa±™tlzõËÛ«wøTi®_‘É +=™íؾLJ'e!ò0ÉDVp%F0ùëÖnj{’é¯ÉÓDGH¦D;HÊBFHbÚðÝAsø¹Œ;¾0á`7€#aýÚ?%÷Ïk{Š¯Ç…oŠ°Fç_²¢Ðãs–•Ì¼EY˜L±œž‘¯¶ý}ûùPL&ø:’(ž$:@q@´ƒ¢b2€ƒn– GCÁ»ôcwmx>˜WΕ?ðÚìè/&i\Éû#qBjâ {Wm—ýÈÉãöÕd¥R:Øa\©^`f?¬Qà O-Õ¡g‘R©óQzG#6uŽF™8w•!jaàE U‰éUãkê.Œï§]ÖˊʸA‘äò ‘{ºãž§´ñNPïÑÑ£MéA´¶rA%Øk<¨$×YÁcxÎn!³]PÞN]po¹ *i°åýv]¾Æ€!„uî}:è¼÷žG èèëc+ÛÞº ôç;>c„wÈcü(ó7kŒO2WhÄP4 xþP5]R¥â2ü lŒ•‡,ðÃŒ +hÍ¢:éc}Àˆ¡Mwd ö +°‚v =àžIb;¡š‘µÇâÀužIá;Õlî'”¸ zßµ>~ ø6îÐ&?kxp&íÓ‡†PºL98ˆb›“óïät ³†,4*Æ­ÌÈbLúW‡Çïx‡ŠÐqÄæ g­' +‰7Å¡aâãèIÿ?äßGendstream +endobj +1569 0 obj << +/Type /Page +/Contents 1570 0 R +/Resources 1568 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1560 0 R +/Annots [ 1575 0 R ] +>> endobj +1575 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [55.6967 62.1828 116.8967 73.5749] +/Rect [84.0431 62.1828 145.2431 73.5749] /Subtype /Link /A << /S /GoTo /D (statschannels) >> >> endobj -1551 0 obj << -/D [1549 0 R /XYZ 56.6929 794.5015 null] ->> endobj -526 0 obj << -/D [1549 0 R /XYZ 56.6929 769.5949 null] ->> endobj -1370 0 obj << -/D [1549 0 R /XYZ 56.6929 752.4085 null] +1571 0 obj << +/D [1569 0 R /XYZ 85.0394 794.5015 null] >> endobj 530 0 obj << -/D [1549 0 R /XYZ 56.6929 542.1781 null] +/D [1569 0 R /XYZ 85.0394 769.5949 null] >> endobj -1552 0 obj << -/D [1549 0 R /XYZ 56.6929 510.0725 null] ->> endobj -1553 0 obj << -/D [1549 0 R /XYZ 56.6929 447.7453 null] ->> endobj -1554 0 obj << -/D [1549 0 R /XYZ 56.6929 435.7902 null] ->> endobj -1548 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1558 0 obj << -/Length 2647 -/Filter /FlateDecode ->> -stream -xÚÍZÍwÛ8¿ç¯ðQ~­¹üDqöÔ¦I'=¤­ãîÎÛéd[‰5+KKvšýë (YvìÊù˜÷ü|‚ ð¢EÃOô¢€qeüž6> ¸z“ùïÝAßÇ3áx5Ó Íõ~töK¥{†™P†½ÑmKVÄx‰Þhú»wþë»/£‹a î…¬?Bºþ@CóÏ×—W¿ ßõµï®>_yxqy1¼¸>¿èŒ‰$Œ÷[ÜØ›r#oFWç7ý?FŸÎ.Fm#W¨ý_g¿ÿÁ{S°õÓgÊDAï^8ÆÈÞüÌ |¥jJvvsöµØêµC÷¨ˆ‘Ô{P“bja¡’Ê¢††ÂÌýàœ{£YâL­â*-«tRÒûeš%h,ˆT-‘¼7>3¾ð­°fx•ü¨¨u[,ç±k—;B§«ù‚Zãä.Íõ>­fÔŠé‘¥yò¶nþ7ùÅé!¶õš%#«Ç›7oö›ñ¡™±aùÎn´‚P2¾±ßL¯7f*®½|5'Kj§9>#o/û"ò’¼š%eRºN÷Œé@äSâ›Ò¨oyúcPV™“\¥ó¸æ 0\IáÍ“¸\‘`7"v"ËdRäÓú%Í'N§8_ÅËboÑ*k‡`&¤µCÍ2„Þe‘eÅ}šß(>øof}¦ŒŸZh>cb)ÇQÜÒsË»Àæ·E_xèþ´ÈѾôîgéd¶-oWÉ]±Lÿ‡–áÀØuL“r²LÇ–ŒóŽ‹uÂȸ‹¤lYD9ÀÀÉþ¦ "öëx^/’d¹F÷ï‹4àîŒ#kÅ@ -ÝÒ[„ø³Q%uYxበ-—¨±T^Ò Þ*Nsr¼Wv -½í +t•WVYè\ÇÙÊñÝZÇ[Œkü@Ô´žò*Îè…²ì‹%T",(;i ˆÆ&N³$Z¼ŽÓ,gŽÅ©Uº¡—5Û˜b}V}!„‡†kÑ°“P¥À>‹× Ñb"Ô†@ qÇ@’‰–QËYqŸ-ÍkéÉ>Cw“ØwÎeqY³>Ê2Ú.ñaOBKh¡H«h˜vkI÷³¤V{‹£I@@L t -¹' Ó,oAäªVfk ,Ð|KfDËÆFÔëQ¥6™ÉÈSÙÏ—ò]JÝ•˜7<‡2³è5ÙTÀ„àº)gu1Û㼞ãê˜RW TgF¤T»ˆ´^¹šÏcL\ÔµåeÕV;Ð+ÒiO‚4C„…õm±ÏáB‚€²ÐRG.bº'25«ZSÒëí¾¤H<]r[Í‹Õ¨^¶šçÔccGðšU@²mV ¤gÀ`Jôòa>.2bÎm"Ä–ÕFˆÚF Ôé¶J`‘obZ:vRº™šÀÆZ†V¥¼–yÄ24¶Ú¸RƒËòüd’”¥MlÐ fP#vÝ¿ŽF_ˆ²% z&³8Ï“ 3’Šê-ñ–éÝÌ¡g¹ldXñõ.]'NJÁ@ëJ—”ÒlzÒÒ Ûä8„Îf=ÝMè´E¸ã¬,ˆRg.ìÌwDm™ˆ W×xUÙ)ÂÖÐÔñN‹Éj™Äé°(Ê2gÔéÊ) (3Äe_ØÍ‹iŠNœST (g`cœT¶a› žÆã4ƒ|+À…ñÞM§)¶¹ 8!]ÛµÍyü@ B‚dÒ³µœ¦DIÝôd¶(øqɽÏÇïóÕYh9^8G]û®™P>í¾-¦q•P¤†Rº@éF÷ÃCÏÓ‰ÛèZ/„·¥ú©Â+Œ`Qgia&´ÑnIã‡@ü i@y7ïòò˜<@ƒ€e’W‡sJô.à`aWÝ‘bRúaÁÈžÀ–«/™ˆÉQß`´E^=¢~Ot£ìÉâjF² P-˜ ߊçOþäðûéÇ‚([zž,–AÀ´ÔÕ]†)áËMpy48åæ(Ð iwÒeZËŽ‚.|ÍT`DƒË±ÇÕ>>¯v ÙÒòµ“¢§}©¯GìG*‡ DײVó¹¢ò »Ì›•½,í†òk½ŸTÆÔiq•ÙDéswgkì_„ðQ’ØÛUæÈyyßÜ ã‡Û}¸…‘ó$¦²ö袔î_Õæk­jîCét€ƒ.ýÑGÑß{”wýùb8ü<¤—vþv\ ÿÞ»Ë,‰í5y =»ĆÓÚ¡72"ŽÜâîµ#Ú?_ÍIvÜ!yĸ¤·<è…Aù…ÍæJ0 ;x|.ê{ûbUn}),·ùZÿŒ<ñ­hzYtþ}©J¾1aGî4 "%ëxÇÃéQÛ¨¯ÏOu¼Óçwwúø°ÛŽõCè¶T?ÕÏ^Z‰Ttäe°Pº›a@÷ºˆ¾ ýÞÍuüš`7Ÿž‰zˤ—¢1Á¡ TÈBùûþË{.9ö¿À›GcŒ¢Ö·È6ªŠ‡°áð€I^ÑD¤Ãáþ4ì¸ZªÿHIÝSendstream -endobj -1557 0 obj << -/Type /Page -/Contents 1558 0 R -/Resources 1556 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R ->> endobj -1559 0 obj << -/D [1557 0 R /XYZ 85.0394 794.5015 null] +1387 0 obj << +/D [1569 0 R /XYZ 85.0394 752.4085 null] >> endobj 534 0 obj << -/D [1557 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1252 0 obj << -/D [1557 0 R /XYZ 85.0394 752.4444 null] ->> endobj -538 0 obj << -/D [1557 0 R /XYZ 85.0394 549.5629 null] ->> endobj -1560 0 obj << -/D [1557 0 R /XYZ 85.0394 524.9842 null] ->> endobj -542 0 obj << -/D [1557 0 R /XYZ 85.0394 417.5407 null] ->> endobj -1561 0 obj << -/D [1557 0 R /XYZ 85.0394 395.2295 null] ->> endobj -1562 0 obj << -/D [1557 0 R /XYZ 85.0394 395.2295 null] ->> endobj -1563 0 obj << -/D [1557 0 R /XYZ 85.0394 383.2743 null] ->> endobj -1556 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1566 0 obj << -/Length 2456 -/Filter /FlateDecode ->> -stream -xÚÍ[[sâ8~ϯàÑ©´º_Ó¹Ì25tf«kfç`gâ©Û$ýõ{dÉF€ÁÐSTWµ…Ðåè;ß¹è8†¤'$’†šž2 LDoòt‚{Áw?Ÿ?¦_ꇣ>NþuÅTÏ #©ì4ÂZ“Þ(þ#’ˆ£SXGŸ×æ´OŽnG§ŠGgö¿Ñàv48¿=í£itþï³/£Ë¡%ƒ‰®ÇO?¿¹¾üüÛÐ/psíº‡—W—ÃËëóËÓ?G¿œ\Žš„‡$˜YéŸOþø÷b8ë/'1£Eï>`DŒ¡½§.œ±ºçñäöäk³`ðm5µ 4Î5`ÈôFœÍ»º0ìê›”!cå\Þ´/ RŒÁ‚Šs„ ^¨’@ RÃ!ê)ad”Ujøš¿ “û$Ïǘ‚)DÕpاκϒõŒœÁQÚEXEQbjÊ\Ïó")÷` ¥j…1¶Ç2Æ>¯o.‡Ã›áÒ0 CQÏ|MËךfîË1j#‹c1ë̪:-—ªg+—{ÄìJNúéÆc2†¸d•KveËû\æ’í.Ù®~%vŸ5e{ñ[|7Ùjü1\«QÝ}ÉzÆ&®I&(ÞN6i ÒBòšl·à÷ÁsüçêTˆèlð+`¡±Œn¯Æé>>˸Â@è©h#lËÃ&6 ~ÝŒtxˆá² -59$Ôš#F¸ê€Z+d0iBÁÕÍð3X¢…D*@ø,èPûµ·ˆ|(`C匱RBÔÆœu«2\’Æa~»¸ù|6€„„TÈÂç}Â-a«á–øp ßÔk#÷чVh­9@; `[ˆmw‡1¬eã ãìi »® ) §šüc¡5TÂñ†VI!+fºËÝ Š0j‘ŽMæ0V_”Eë×øëždy}H'žãyáÃ*-W"Ém0r™{Î’ü>ËŸB¶Õ‚,Æqº"3QVŒ«Å8v‹A÷1¦ÓØ÷U»Ö.%Ä+)¡Ò5oaÜ:oÝÊïämžc•¸”€ù?GÜ€‡ŠÓÎ+%öY²ž±‰¸|‘’].P& -7±ãb>{L'ãÒ*›2 ¡cÞBL­yk›kl£æªmË2yš¹ÐbÇdî¹`«Ÿs7/]#N‹~o&™OÆìR²‰ñÔ=“ïiQ¦Ó¿Ü§ç¹½¹O. µ­J8Û(ÆO¾5øâŠcOÞ⧶gY^þÂ1^­þfÓY .ª>MaAÿuù6KÜ·ckJöÛÉã¸(|ߣÛf¿¹ïî’JlÛt”Íúm†;Á’lNUÛœj³9åð­žíV^_J©¼"ãFÿ-f©äÚÕË® æãÒa#¶Wçe´i|­?f(?Ôö@Z£Ýn|B¢†79òEžÍfÀåÝÍM(¿w ow¶YQÛ6j»³m0£%‹±}Öbì3ù”j5²"}±žMçOw• C»R™Ñ¥ÙÞ àÔ“žÏ`¼¨¶áü̯L¯…àµiY[ª-ÈòÜ[PÓ§qôê溋ù]‘ÀÞÓòñÍõ8ƒ®Þråd²ÍŠ¼—br£ môoT$§c½fC²²¡ê¹d-Ϊ ¹€{*]ø#6ÐóPFtø$k‚°’™‡›œ$'Ô·¸PÎó¤Ûˆn@•ô¢öáLÊ辚îÔoý« 3D3¤g†ØTØf(Éßô~£týfäJŒûÑÙLó¡ÒðÃW¸4ˆP";È ÀR°vÐ}»Ï‡ÉóE6Ý Cë,Šæºû?;É•+sÈqï]÷q’=Í“Òûv<¤ê𥅃â)"Rv” 9\Ñ”`Î'ÿ6‹!1¤à.Ó¨Ö*„=Ž ^ÇþÖ± Ë@Ê#Æ. ”ŽTÛ¾2€C™%,‹Ù;Á\TV÷@3óˆÑd Q!Iš¶ðÊ© -à$w«&^¼Az‘NvóÚGßëmE4õxˈqÀUº P¸Ôj­dèn®³Í=œåB´#f$6ˆqÑ•ˆŠ £ %5‡ê3L‘”zaJÌ,ÝB¨Bõ¶/Éýâöíé.{„› 74ºHŠIžÎJ_G ‘³©'ÆÎ^ìñ1¹-B k}À˜¶€‚HMÉ&¶ÕPÀDÀ.½ÎÊôþíf^¾ð#•àu!lðUT›Â,[ô®J‘LK´½P¬Ã¢wP"Y«…ë<ë@OSˆ/ܬ 'wAO¾ ½@¬cFOBò‰é@OÁÚ¨½ÁôCÔóõµ$}iÉ - Ò³ H8¹îÀP@ta\.cøîˆáB¸cæ!§HÚ…!‡0« 0&wC8…üÝ•v7ÂèÒª-03Ž rO¦dŽ¹8‘ «7gû˜âÏáßZt8Ä@²c¶e¢‘Ñ´+SŠ„4$pS~€dÇÌ@¬¦ª+Œ$a.Ÿ}»“ç½(h笕ä¶p ×ÃW½wT´# £‘Z-Á·÷†/”ë˜áÓ ZÒtÀ§á^ˆ!µ­@yû{ÃÈuÄÞ(WZÒ†‰X¸æKðíþýá ä:fö ƒ(–Ñ—HŠ”aÍ«ÛùÄþD'~¿¯½ÊÙôN¢°+&ñVDQQ®„w *0ÒL×€n(V¾Í µË”NƃæÝ«f?¢äŽ -1àÙº™ TíR7«^ê+¸ec¶½n¦9¢2øÙ A̗͆I‘=¾ÔšØµRÖÔ〠Ì]WeĽNnîú›šÅ¯Œ@íL‡…¶ô3_L¬¥²§ÕzMvȃ(“´Møÿml ºendstream -endobj -1565 0 obj << -/Type /Page -/Contents 1566 0 R -/Resources 1564 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R ->> endobj -1567 0 obj << -/D [1565 0 R /XYZ 56.6929 794.5015 null] ->> endobj -546 0 obj << -/D [1565 0 R /XYZ 56.6929 352.0981 null] ->> endobj -1568 0 obj << -/D [1565 0 R /XYZ 56.6929 326.9775 null] ->> endobj -1569 0 obj << -/D [1565 0 R /XYZ 56.6929 326.9775 null] ->> endobj -1570 0 obj << -/D [1565 0 R /XYZ 56.6929 315.0223 null] ->> endobj -550 0 obj << -/D [1565 0 R /XYZ 56.6929 102.2008 null] ->> endobj -1571 0 obj << -/D [1565 0 R /XYZ 56.6929 77.0802 null] +/D [1569 0 R /XYZ 85.0394 542.1781 null] >> endobj 1572 0 obj << -/D [1565 0 R /XYZ 56.6929 77.0802 null] ->> endobj -1564 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1575 0 obj << -/Length 2081 -/Filter /FlateDecode ->> -stream -xÚÍšÝoâHÀßóWðÒÒ×ßÙfYí$àV+íµ€lå¿¿j·mÚl¸äNh¤ 6U]å_WWUÓ& ÿHG „™áe8˜ˆÎly…;ßá»/W¤é—BýPêçéÕ¿†Lu 2’ÊÎô)K#¬5éLçvo~¹þ6Œ{}*pW¢^_HÜýytwëïÿçæþn8úòïñuOñîttçoÃÁxpw3èõÑôy0B¡;™:¥Bs2ÝLzO½L«’`æ¼ÿqõç߸3‡gýõ -#f´è¼ÂFÄÚY^qÁàŒ•wW“«‡jÀàÛ\õ4Î5°¢ªÓgi cœb–3Ä%­[ý¯”J?p§O2B4Ø÷z†*>–õ¡úüBp…¤Rd&ˆ“$$é(A• . -&oËÇdÑëKnh>wº˜»â>£œvom:ÛÄë,NVû3(C„3Ñ mìa5,aÈÏçÃR”˜Š%‡ø0ƒŽÏÃÖnÞ^8Ķ²;¾ÎPe*ÑB -çJ£oNÃaüê±MýEjW:0pîs’ÏHRRê€T!&ʳÊóÎ]lÂךÙg€æ,Æ6]'«ÔºâXªîx|NnzDw‹!ÒðÖÌÆ/vÞ€3põRqJc’·àĆ9«Ó”çÑ”¤zz©«[j… &¬™¦4q­LNæîÛû¯×#è -ã¢;†ëvœ;¥3ø¾]l4* —¤…ŸŒå0h~ö„è^~ƒ šwÇÃ(^´ƒtÚ Ú®ÏrÚg œ½X ’!cpK½–R!¡”¯×Ãûñ׬é>Ïãq8ØlÚ9VJgà \»X|‚B{-T >!¤Ô§ÇûìÙn€Y²q‘H4ú§ÌÕ<>»É&›óÒcàêŦGîþâ–Ú-Á>D¤¯ÝƒÛ» >m-;Ñ¿°Àþ#»ÞçÍ|‚1¶Eñi xx±AI5"T´”lÉRÄCü§Ë(›=CDûv»>¡fï´>V·w/)‘ˆ(L[ƒ”€öØÑ™ö,îÍv5‹2;o§9íGLwKRõ_v5ÇQ"Úª9VHcâ«ùoÑÒöú -»¼™nåê5¸¹]Øï‘ÛbŸG2ðòRI -C¦¥Œ #æRmzæR_Žr þ„=ãÃ.[ztÙn㸶›§d³l:y± 5¨bÞRÐ…fHâ ú—ÅÖ-äA·dŠñîdò–žõÆÝÄÿæóbÁTŸÜ¸%âxõ’üÓØ;ÑÛsHˆqÓRâ…‚A˜¤{€åÙ€å眿XÀB‚*o©þBÀ½âgê €Ok¤N Ü]cÕ5pøb¡rŽ83-õ_p0z?jO¦*?‘jàñ¥¶û°GG\ó–ú/˜DXa_ÿÏ»ªhqev¹ÎÚ©BÏ?Üxf/Ñ"žç @Á×Òˆ1pñbƒ“b$¨n+þ”#B„¨a¼ÿçcÓílfí¼‘`àÝg¤ rVo[j&)I¢ÛŠ¡ˆHÌjïì÷s *nj@ÌÿÂýUÞ¾X7^¹~*Ö}ghw¬åÓwÛ„÷1Zÿ»†%[zÖR´¸ÖÐ@ÖðŸ–Z›B¸-‘†®}VüîŽNÿÿ‡¢6†m -VìV±Vá \†%ÒÔIsÁ”ê#%°Áwo’å¸?Æ‹8+v¯qöìg6%ÁìQ…\tûÉËÌý‡©F° e!Tœ©Þ$ÛUf7éèè3¿„çÈpâϾ&iæÎ`i7ÍÀ»4‹g©»&ÝY9Vþmör¯Öe/½@üD ë¿ŒW‡\…,“ðˆï(tÁTRº{7\T3µH“ÂÕízlò Ž%0sô £¦0ZHŸ“×Ue¡ ï¸!.´‚é]*pDÉK±ÙΓÁÝ_*dyÙ /VIV¶ß ½ÍüÇd÷kçnòaóiÈwóI5@¡¾^ÛhSvò¥¸M÷Ú?tl ¢[B§qø/Ó…Ž/J*ße_çãŸÜ™ìxß2Ôb„Ýn¼Ñv%uÀz-ãIp’*]7?õÏϸ îvÅ…Gèî†q—vmS{(¸`+/dµúŽ—K»à‚1ç‰-\(¬ -hs“uဋ¯òËšÇó#G: Ú M°h9—€©†˜+¥ò˜»þcø>Úˆ„y³ÙJê€ÝZ´A -eœ¨ºáésœÖm±Ëõ ½bšÆy®Ü[¤þÃh5K–n–ò«‡ú{ 3GaRM‘¡T6à ¥ŽÃ¬¤r˜£‡w(1ä>,e³ÑJê€ÕJ ÈÝaoÍìç¢Û[›f§²Ч0®ZXR ,K©œåý:Kß&„’pMg“ÙJê€ÝMÀ€½n¸…fUB‚üç.òŸ„þRuNJ0eݲûfgµŠ”ÁÑ·¢®ƒ_­ßÍõ_ÓMZ¨¬ÑÌŸZêºZÿOÃÔR S[Jùsrˆ¹¿NŒä¼Ùj%uÀìþ:1\¨ºÝ#3 ‹j lËõÂ.-ÈÌ*¾)1¿‹ƒ7»èØ{•L ÷2ä'ÃÖ]Ò©ï\îÞBåÐIjM#ªšõ©¼™÷;èœ5U\ÿðçœendstream -endobj -1574 0 obj << -/Type /Page -/Contents 1575 0 R -/Resources 1573 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1547 0 R ->> endobj -1576 0 obj << -/D [1574 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1577 0 obj << -/D [1574 0 R /XYZ 85.0394 769.5949 null] ->> endobj -554 0 obj << -/D [1574 0 R /XYZ 85.0394 439.3709 null] ->> endobj -1581 0 obj << -/D [1574 0 R /XYZ 85.0394 411.7795 null] +/D [1569 0 R /XYZ 85.0394 510.0725 null] >> endobj 1573 0 obj << -/Font << /F37 791 0 R /F39 885 0 R /F21 702 0 R /F23 726 0 R /F65 1580 0 R >> +/D [1569 0 R /XYZ 85.0394 447.7453 null] +>> endobj +1574 0 obj << +/D [1569 0 R /XYZ 85.0394 435.7902 null] +>> endobj +1568 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1584 0 obj << -/Length 69 +1578 0 obj << +/Length 2644 /Filter /FlateDecode >> stream -xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream +xÚÍZKsÛH¾ûWèHU¢Þ~ðÕ³§Ä±3ÎÁIdewj's $Úâ,EjDJŽ÷×/Ðè¦(Y +åÇT©\e5A4ø€úAÑãð'zAÈB-u/Ò> ¸z“ùïÝÁ»gÂò Ó Íõ~töKõ4Ó¡ {£Û–¬˜ñ8½Ñôw/d>ëƒºþ ûpïfÔ|ïþ]ÝŒ®Îoú­céÿúîËèbH\a«#Ql÷óÏ×—W¿ ­€Ï×D^\^ /®Ï/úŒ>]ŒÚF +®Pû¿Î~ÿƒ÷¦`ë§3ΔŽƒÞ=ÔÍB%UƒŒÜι7š¥·:©³ªÎ&=_fyŠÆ‚HÕÉ{é3í ßkº×éšZ·åržØvµ#tºš/¨5Nï²ÂRï³zF­„~ò¬HߺæÓ_¬b[1­dlôxóæÍ~3>4#6,ßyÀu¤ ”´¯áAì7“ÄG3¼b5§KjgþÆÞ"YöEì¥E=K«´²/íoB?D1%¾)õúVd?Uý[Éu6Ok¾Ã•Þ%Å*Y>³x‹V;ÓA BGœ!Cè]–y^ÞgÅ€âƒÿfÆgJð©…6àoB,Uj9Ê[úÝò.0dø¾ª¹,оôîgÙd¶-o’Ôé]¹Ìþ‡–aÇľ˜¦Õd™ Ç—딑q HÙ²ˆr€ƒýMAEì×ÉÜM’t¹F÷ï‹4àîŒ#cÅ@Š¨¥·=ðg¢*zeà…_T¸B¥òÒ¦#ðÖIVãà¹63PDÛÞ0BWEm”…—ë$_Y¾[ãxƒ1pˆš¹Ñq"¯’œÈ!‹Á¾XBõÑ9!‚²C–‚hlâ0K¢%ë$Ë“qnY¬Z•ízéØÆëë¬~è !<4< ; µQ +ì³d-!‚³0´‰[’L´¢¬‰ZÍÊû‚hYᤧû ÝMbß9—9Ä¥c}”'d¼Õ^ÚćoRšº@£EZMÝ";÷t?KÚ[MbfeSÈ=ÙfxK"×N™­>0?‹-™1MQ{¬G•þÙdvj¤? Oå?ŸBÈw)£®Ä¼á9”™E¯ÑÈŒ &šræŠÙîç.xŽ«cJIœ€ËŒH©1v+jW+Loós—¥´­ÚñjúšxE:-4¦‰°0î-×à<œ AÐ\@šíÈEL÷DƸFbí”%ÕÞîË‹Ä# ×¥·õ¼¬P êå«yAoLøîXäÛfB†K§D¯æã2'æÂäBlm„p6ÅeX9E¾keÙIHeGjbßÐL4*Næ3QSÁ¡jƒ3Rýd’V•ÉmðÌ Fb_ÿ:}!Ê–$x3™%E‘昔TìV5Ú[fw3‹žá2ÁaÄÇ»lZM( ­+cRV3*’¶Û&Í!t&ñEMÝ„—¦nw’W%Q\ò—Ŏ¨-Óà™Ò1á¯j3DØêšYÞi9YÍ!™XeUeãü^ÚŠ +ªqÙvóršá€ë(Jاµ)HئH¦É8Ë!åãdðC¡½wÓi†M:NÈØfúAsž>gÓû)H¶t:îZCðˆ åÓâÛbšÔ)Ek(à ”n|?<É<›Ø…¯‘ñB€[ªŸ.ÀB hÕ±Ã:`¬² ñ¸’ònÞÕ1Ù€:Y«´¨Cg•:ñ® +&bŤôÄ‘Ù•-WÞC—£¾Æˆ‹=×£‚Ot£ì #F,Œe¤‘`2Ô~)îJù“Cð§‡`¶ô> endobj -1585 0 obj << -/D [1583 0 R /XYZ 56.6929 794.5015 null] +1579 0 obj << +/D [1577 0 R /XYZ 56.6929 794.5015 null] +>> endobj +538 0 obj << +/D [1577 0 R /XYZ 56.6929 769.5949 null] +>> endobj +1269 0 obj << +/D [1577 0 R /XYZ 56.6929 752.4444 null] +>> endobj +542 0 obj << +/D [1577 0 R /XYZ 56.6929 549.5629 null] +>> endobj +1580 0 obj << +/D [1577 0 R /XYZ 56.6929 524.9842 null] +>> endobj +546 0 obj << +/D [1577 0 R /XYZ 56.6929 417.5407 null] +>> endobj +1581 0 obj << +/D [1577 0 R /XYZ 56.6929 395.2295 null] >> endobj 1582 0 obj << -/ProcSet [ /PDF ] +/D [1577 0 R /XYZ 56.6929 395.2295 null] >> endobj -1588 0 obj << -/Length 1324 +1583 0 obj << +/D [1577 0 R /XYZ 56.6929 383.2743 null] +>> endobj +1576 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1586 0 obj << +/Length 2860 /Filter /FlateDecode >> stream -xÚ•WKoã6¾çW99@D‹¤DIÍi7ÛmS,Š¢ëžº=Ð2m ‘EUdÝbÿ{9R¶lÁÛÀ08¿΋…æGgiLBžE³$‹HÒx–ïoÂÙÖ¬ýtCLsGœ›ÉÄjó”Ä)KfÁ)ÈûåÍâ#£3!X<[n]"Iå,-×Îw²îTs°8œ'w-ÁmI҄¶ШHHœ±Ìnxÿôë”Îpø¬ò¾)ºÎuÕkÕÈ®0Ô€G#Â#ÁžˆI,¸…3¦Ü4 Ãù»&Œpu CkÙt…¦ÄB•.ˆ5ºûEU2ÚZk›z.šöÌ@¬UUÈr6°©È•{~Пá>p[»ÎT®Ó-·²¨ÚîA¸wúvܼ@‚ aÌõ~¯+ð‚=Oë·•ß®õÆf¦Õ†‘$c‹°eÊÜŸÅŸ§ÿZá(1 :LƇ‰ý-Ò¥gsv¾žÇü,ò"¦}£˜ò½Ð‘0S+–EÙ .)2Ń»Æã!¿ J' £7æEnš¾w±ÉýÜD\ÜU]B°]ŽøaãDÞ`é\ íÒ¦[¿_©æ;qñú|Xìð•ØßÑ¡ƒ:Æ·I¿ê¤'!öË#9B&º`³‹Ò©•Þô«&?aÞpÕ¨ã»ãqÈò«6yÈàÌ9ײé]9U·®±S¥·W\íÞ,‡ÚíÛËÖ\Û“m -ŽÛýâþá-ñÕa|ìkç›üÌYˆ2K›éœòá=4v{Ix ¬°7L ÉsaMc¸ ½ÁF¿ÇÙ 2܇0é«ïر2H`í¤[[)U¡*Cæ©Fç-´L`¯‹6˜,»•)tü›—Ã×¥ÿf„W¢ùúþô"ÁQ?>GÐP˜î”%4fô\Ûð){©î?‰Bá_endstream +xÚÍ[[SÛH~çWøÑTŽ}¿ì[`ÖS3f+µ3ó l4k[F’C˜_¿§/’Û¶Œ0xS.Ôêë鯿sk ÒÃðGzZ Ì ï)ÑÀDôƳÜû +m?ÐgPwĽ>Üœüã‚©žAFRÙ»¹‹æÒkMz7“ßûÿõþÓÍùèt@îKt:÷? /Ï|ñW—ß~½?U¼3¼ºôÕ£ó‹óÑùåÇóÓ1šÂxÍÆ^ßØAaäõÍðãõéŸ7?Ÿœß4ˆ7I0³Ò?œüþ'îM`¯?Ÿ`ÄŒ½GxÁˆC{³.œ±ºfzr}ò¹™0juCÛ@ã\VTõ#NÈîUý +V Eʱr®/:0`…CàaƒW‡@It0’ô”0H2ÊÜ!|.žFé]ZÉÔbCX4„h’>Øw^¦E––§Æy¿8%ºŸ–Ëi•N|M6[¤®&™—iaÏÁ’aý›û,L3΋0Ó"ŸOJ+¬6 !¨[¶ÊýqV÷i1ÞUˆk)‚ˆÅîÍ0‰¨`2tçËy2¹™ó;ÿ\xQ¾eù²ô5ßÒ¢Ìòy¹Þ/b)Ú¤”` ÎD/>·/ç a S˜@°×}¦¬Gì` ÖˆÒ.ÂÀŠSæò{Q”iµ_(U|±5–/öyyu>]ÖºÊzäcVÝûÒ<÷ÏIR%¨*žWÄlóÊUZ&¹g+“yÄìL^úùÎm s%È&“ìÌ–!ö¹Î$[L²U'ö€5ƒ£â{“øjª­Žñm´X1­FõåSÖ#Ú™&MTý<Õ¤1H Ékª]ƒ«ñï‹S!úËþõE’íc¯,|üƒÇ?ë&`˜±ÞbøËnœãM¼ •M Éá€Ö1ÂUÐZ!ƒIã.®F¿‚Z@¤|ÏA{…o˜ûX#‘«7¥ü`¾UJðÕ˜³X•@†KÒ˜Ê/gW¿¾BÐB®ð¾›%lÓÍ’àf¡¥žù×àR¡´eúì(0}m®µÝJÄ°–œä³VÝN5ùa.5>„cu©’B$Ìt—¡"O¡VAØxé`±§EYtñ8ù¼'Uï³ñ} @²,=_˜;cW(ÓÂ:!_™ûç"-îòbs­d.žÑŽzÌôs×sâ&ãØOÕ`Lç“PçV­+} ˆ7A¥kÖB¿mÖú™_ÉÚ"ÞÇ&mû˜ÿ8ÚF”8”† ^)±Ï”õˆvÚ‚ÓEJv™7À˜(Üx³åbš“Ê5e¢?‚Š}X ¾´f­-:ÎØBÍT[Nª*-¼S±}rÿ\q5Œ¹]V¾0ÉÊAkÆyÁìT¢ˆdîŸé÷¬¬²ùWÿö°´½úOþÍÇž¶ä„³…2™…ÒðS˜h2 Ô-ßµ­¼È‹êǸ›ýɱ¦?[¨wnËvçöÍ`+V;mr²´–@°pýAƒuµ›NÊ|îÒï‹)Äg>ìfuº,èN? i®¤¦ÖÌi;.‹Ÿz µM«A3n ‹eË¥ Aš’Úϒ.1;2ÔÔIx¾¨¼æs0]`ËÔ_£ƒ=†ÚIZŽ‹lQ'ÖT"%¬^­E .²¢0,¹Í—Õ¦¹`ŒCFrpÈD¤d.mðÅמ/Œ¢¼¦ÿ °­¼Ûó>‹x,'ÂH5㶯ë^-‚¬ã­Ù¬ %¢àÈ -¯`+èÛ§í@g`!7õe—‰âA¸ðãò†ØľÍfoº~07ÀC\㎌C¤kL{²,Òn7pGg ©u ¤ìß¹áþ¸m| d@¿íøF¸øw\ÆOòÚ¶Üí”nÐô܈Ñ8cîˆ9þu*Ø–l»ïÇl Pa …î_æUúOØ–²òfe{TØ&¤ï#£zÅü[6©M€§O¾µñš·Éø¿‰Ï…|Ó8Ÿ-’*»Í¦­XV=ùlÜÛh——ûìlóÆЦcõ.mª„)l¦˜%Ói˜!ñY^{0ûær­´5úýZÔ.B©zÓ¥+—.‡RR¶ù °@½šHï—Õ½KXÿj9Vž(ÖuÐ×îˆA’*± +OvÎ"uRr3ýKl¨/Dÿ1_N×<¦eî+ï$_—Í«PWyó&Dll`P žm‰ý»«7°yŒv%†ëYmiÅ"ÜHe‹ó¼ò…ÛÔ?] ϙÜAòA²áÆ:M«BåÜw[ɸõ8«lœî¶w±-9”½;ô…0“ ê/>wÛ;05ˆâïI¾Ü£ôá,Ÿ§/ {ÁÌ•Í]äßvÿ©Hæå'?¼Z¦• év¢Iz¬·¾ŒÃî;R&`CBJ‡Ïo‹ äm€ÒÅã ’ß;¾èuè Á ÖfðY‹â9ÉK×qwÇlø‚ _ñ\¼ÈÕO]{ Éy´XR°(ÂÈ,)x .iàø²ŸwΞ ãËƹel„b¨€ùžÅ3’õh5œ0¤0ïø­–…¨!$Âóeö²Ì=,d$ÛÑò¤¸éˆ¯Áé"Æ„‰ùøZ2–/$_$ر‚Ga³ÊðgM CLc÷!™|*Ò"}x ‚ÞPþ•Žw.GpómHˆžkß”•Yc V)Îî3ˆ÷w¨3X}ÔùIŒ±6pí‹¢W ªÅ DZN)89ؘýU$º=غE€ˆiêzÛoƒôŽ8¢þXŠB¶/¤ÖîÔì‡WàOcÜÿOfý +éF•Î“ù8T\W•·†CýXç gBÀ·q¡`¬¦êEe1®a›Šíaû¨Z|@5j6åï¼]i3k÷ë i°?$iðHÚ«ÒõÓì6‡œÒeÚ?ó×]UøikíÎNHIàD¼ÈÛ·1¬õÿ êG¤i§Û + dÆP°X@JŸÝ=]-«o¼Å¤Ž”àuþ9üÙ Ëlr\[”2Wh7|‘\‡…>E‘DwÁ§®ù|ò%ðÉWÁÉuÌìs—RvÁ')¸F#ø†ó7‘/üâ‘fßZ‚Š‘xÇŒ"‡€SÞ…¢ÀPÐë ¾…‚/ÑK'ŽD& jßõëû +D¦‘G¡Ø~q¶âBxÿCñN }põ ‘„Ç $…4|RýÁª‚w½z¿¯;!¾ð×a#ÑŽAèÁ´èôÉ„#£¨ˆÜG_… íØ ¢1ˆÃä]øaHÀ3û+õ/£Qú°혭û¸ç48’ëˆÑÓÊ~ZÝå“ ‹Ò5ðöaßÞàEb1xJ Aq—+V‘£_A¼á¾ØERq0-ä´¢ËK…ˆÿ 1|ñö/ë÷#E¥»ËAÄþûOË÷¸×ÉÊ—þ#Ôê_à cµ´˜Ð\=@|aç²pi³}O£‘дé‰þ?¥w¤‹endstream endobj -1587 0 obj << +1585 0 obj << /Type /Page -/Contents 1588 0 R -/Resources 1586 0 R +/Contents 1586 0 R +/Resources 1584 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R +/Parent 1560 0 R +/Annots [ 1588 0 R ] +>> endobj +1588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.4761 480.8577 413.3061 492.9174] +/Subtype /Link +/A << /S /GoTo /D (clients-per-query) >> +>> endobj +1587 0 obj << +/D [1585 0 R /XYZ 85.0394 794.5015 null] +>> endobj +550 0 obj << +/D [1585 0 R /XYZ 85.0394 244.5016 null] >> endobj 1589 0 obj << -/D [1587 0 R /XYZ 85.0394 794.5015 null] ->> endobj -558 0 obj << -/D [1587 0 R /XYZ 85.0394 769.5949 null] +/D [1585 0 R /XYZ 85.0394 219.381 null] >> endobj 1590 0 obj << -/D [1587 0 R /XYZ 85.0394 573.0962 null] ->> endobj -562 0 obj << -/D [1587 0 R /XYZ 85.0394 573.0962 null] +/D [1585 0 R /XYZ 85.0394 219.381 null] >> endobj 1591 0 obj << -/D [1587 0 R /XYZ 85.0394 542.127 null] +/D [1585 0 R /XYZ 85.0394 207.4258 null] >> endobj -1586 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F39 885 0 R /F41 925 0 R >> +1584 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1595 0 obj << -/Length 3437 +/Length 3080 /Filter /FlateDecode >> stream -xÚ¥Zm£Fþ>¿ÂßÎ#1ý4Ñé¤É¾\&íæv=º‹’|ÀÀØÜbpãüú«êªÆ`3™•¢ÕMÑTWw½=UXÌ|ø'fAè…±ŒgQ¬½ÀÁ,ÝÝø³ <ûçà9 7i1œõíêfù^E³Ø‹CÎVO^Æó³Uöó<ò¤wûëêûåû0Ì•¾HìqΛï>}ü¸¢Y#ŽÚxZÉÓî?¼âzR Ís>¿[=>¼`%¥UØ/yÿãêݧۅ |ñöèÏ¿}€,%¦Ëçwo?=¬~¢»7?|~xûîÓým¤ç«¸ÃunÞ­ú“ž¦ðÓo7?ÿêÏ28Ôïo|OÅ&˜áÆ÷DËÙîFÊ ´RŽRÞ|¾ùwÏpðÔ¾:©áà „rB=pÂê b/TðÏá}ÝÐæv0fžÓ]Q=ÕÍ.銺"‚»në# ºš®‡–_¹óC;~´·ë.O;"œê¯ÖæÍsÞà9Þ9³é¶9ko¨d%…™ØiïþñóP^ÌÙjFÕ‘gb_ðÜ${.Úº9û¤û†ÞbðÆB…p&QÍ`&"ˆûêß/õjOkÍ"-<éˆôAO¿ÌÜè_gݸÃ7¬jôpý+¾¸úS·ÿf¹„¿^rhӼ鼺ÙÀx¹?¬—LZºÝ-ïX€ûs0¢Øó}íeU{)¾V`d‘/Gò¿f Ò‹1Óæ¹è9¾²A0a8Öx¼Á¬¾–0ž_ð…Å÷³®W©õš.û61ÚSÇZølÞwxI¡‹^· áûàüÛ¦®ÙŽ“*ãøw‡"›0A¶¨†˜ é#z æþ‹£ Eëõ¼èˆZ´4o_·m±.s¢Zjsk懊hª€Z0ïdÂm¤ˆ<ÔyBº%‡œ’Y…^Gnr^=4½ÚåUGküâþ¡-ª æ|UO]ø¡gtÜS{pø&üSëO†~ÌÓŸUŠaÇN¶‹®Oøj(ö´/5ø¨ðâ  üÒîó´x:Y™”RV&Èù/RjZmd‰‘ï¹@²è&rìiŠåcY×{ sE`æ«-* J“ŠžoórO£bDZï9'B{j»|GóÛ<=4Ew¢'k¾îË$åMHÖ®åļ“ó¦Z0¿uý;ïèdŒ„à(#w0ÒÊ}Üé–ÌôX”%ÊbWtç@kY²K6n\W.<±­6=â8ŸÖn›»¢Í3›æÑò‡!ô¾ªa!|QÛ\ñt@I´˜?åIwèSŽöÉŽáÉv áÊbÞR2‚ûú‰f°ÅŠ¤Ý¦€¬‹Òž±¥Ötíh¸L–ä;Ç8a6 ߪ}S<e¾!±»œ1lˆÏí{ÂÚ$GÁÖv )ÁÈÚ0öÎü-Çk“£ûŒ†®V¨„?ÿÏm,]În›MÞ²vi«¹*ª±u¡‹Óöpg.‘ó^ŽÛÜÍj{Ó¾.£Òƒ0#_ŸòqáÉH:6нǾ |”2áØx¾Ë([ãÕº\óߓݾä‡`‹;–ñ¦,*&£æ-¥Nø»°-˜O2µ/x Öê+ö±Ó/{æÝC­<_úŽßò9i–U²›ŒÃ \i"7õ?œ÷{s;b[¾^ `^`Œ{½_òš”€%ã‹0Ѿ” ³G>¤Lâ3€{l%Ò— ¥´A)~o¤Éå¡m–e&år]T¼õEy|Â^:º^‘˜õrÛ«Ï„`S®Êœ©W.°¥ƒ”ýÓ§²ét€… -Êú`ZFs‚ÄîXËpþT7DŸ²˜@§âUƒ;P}n¼J²È—;ÖÍ¢p”ÝçMy¢gEå$¡ IÓé¡LXÒŒ¸ð¶À§`€ê7À®s7±X‰é!ƒU‚3å…Ap‘~_2b@?ÆDñ b¡!GkhÃI GUŽÆ€#kÜp£¤ÁªŽÈçáþêÀì[Û„GE•–‡,oy2äS·¥¬ -÷ìúÀWlÇK’?yh{zþžÓíÜíeä7ÈìoTãàZae㳩 HÏE~ÄØ];OÛ”¡;°^¶Ü‰ÚNA¶ ]ÀŨ8@cOm_d :ˆ)w ¼Ð„1.IÓúPqàxr2RËÙJD¢ÅE²z¬x›€ŽE·%$‘'MYþ±8¦åSÑl*@EKº£¡u‹XNû‚eyrü@Qð^ƒø±pòW“GÀœ¨O'¬h@ ŠÅå Z d`.3ÉuDSqßÛ.醒Wuãà<¢]`¹ ÛáE*Ú&¶PÂÓøºIšÂœAÈb#1>! 7h·G¢8O@\›ùwõ14LQ|ŸWÁ˜oŸé[Hð -²Smã3b¿£B‡ôÔ]r¢Ù|ŽÆ‚Ë2.­rÂÜ÷æSmÚK/—&B„K¸Ë,^þ‘7õBP^÷m±©£•é!«|…Úeˆ Ä(ý35dVÖ›ú.ÒÎÀÅÕʸXÜcžy—:èŠÝ”›…nê6ìM°)å‰(4=0p%üãÍr]cá¿çÒóÏqý±)êfèFr ¸¹¾¸v©Ø÷ †_ãR±s<*Pl„PÜnƒõ¦ùGPLHyh('’3(*ô]=t}©$,Lp[J·IµÉÝFPK‡ø˜·-WL¶Ä]8)uMC<Ðfëª~8A8ÂHéËLÑüi¶åé¶>NiGI/–¡ºÚ×e.®÷>ÙkÿŒf À~–N¢ çÁEÆ=‰A;”3ì¸ï9¨¼)p -q åÜdîç7EG…ÐT/YÁ©éX_ÕLp1`´Én1„˜ ×yÑ{>ðâ¡{ã¢ñ×¶Û -õë çŽýÁdsn—+p»É»¼ÛÖ‹Á4(Ð8ûàèPÊçgí춦)îÁX¸¢+I#p¿*—‘)0Ó-ŽßâéØBI¿>0½XyÒ¶ñ5ƒ6Ö`±#_¶5ŸxÝõ¢&ŽÅÓHøˆ´8:çeìùRÖ)¼¨+Oʾ¢™E?}¢6‡el#ÉvL膄…Áød`­Ð¥-“gžÚÀŽìH½å ~Dn‰Ã#•w\„ ¸ö!oh7ö˘g‘v ÔcÍ”á§ÔÓ¦0#pZìls -ä¤ëP·=\3µí«ÁÀ¹y ¦¡ž9—‚Ýõ{Œ§ú¯+z¸GzDßZ&Xñnø}Û,ð3`;Ãô€9€Ï6å_:ÔôÉa¢Ö9/zÆžÉ~ð¥Ê¢ÜÎ}37=ð Å0tæ‰O<ö'Ê·æÓZ qèKZˆÝâ0íç4 ³¾íßmlèçb?·Mnˉ To t³fîisÚwõ¦Iö[×kÀÇÉ$¨°ýÐåÌhÍkìò¤š>[4A™ÔÇm’²c„øµiSõ_)Zš„ÅÄêóÃ?ù N[‘ÇÃÚl¨_Š©qèiÝ—f¯ÇÔXônÞ;,,ãò*.Žé‚¨6ý‘@ Ѿä'Tà‹à¸b¾C§$1×-ÂÂ6†hyù]u¶\ãê£A¦q?öÈmŽÉ[þ^ù»ÕˆÙaüÇ:΋ܷäH1žÇsòs`ŽH扖շ‰/¤% €¨:Q) uTõ * ÑÆ°Ñ«(YÎ{ ·Ë€ÉcaÙªpŸMàCÍ ›øÿFÕŒ0íˆ0Þ˜;èfMhK¯lŠ0%+8LÄY!º§«6xm)±¤¯=#b“NÁYÄy¶xª§bRDE’ɬšˆólñ*9š#„h¸Ã2{¹)ˆÔü0Ô:Õ\Ð#Z@-ÑXK˜ mßîDµÏ `"o“¯ËOÙb„Cyé¥m…fÕ.¸äË8Ÿ­’Ç"ÉÒW~™‚8°¦ðÝoq£Z¨¿!f¸Mç„$%þ•}\Ç«¯Oâ˜Òz8¹zžìpÌ:«NVþâúŽ@ Á7¬’¸öµqZíÌBvL9øQey„à ¨”6€P ¡>€¹ÖBð|Šö)!3‚9]‚®î1KóµJRm†ww‡(¡SžD6Íâä©#Zµx¶œž0œ¦A¨¶=xRE˜rO}žú­x¬ž®‰+”Ûq³PåaÆùÔôæ—‹Û÷ï®!BªáÜ÷ÚÚÁ·ÓUIe ÉFõ há\V‘j&¨…~¾)5|wý#(¦²rx·%?}%Ž†q0«2}¤³' ©VD[Þã5$£\[º¯nïÞ_‚ee©“W—«U?’Í  X;a«†Š×pÓ¸*‚ ¸o‹‡x¨e+ÔFÆ >ßÂr˜0^•f«ƒÜdÈê k¤„«^<¥"BYÆ//n&t?ƒÆ®¿QE)üamôµ­2×UÚcËà £™¢eº'z+Å>z¿OòeTÌ@)‚Ø}±~Ü#|·£ÞÂC~OØØ!{´Bö Ê$݇ð鈅¯Öé,*ây?žÓ‘CÌì°ñF\ŽOX[!‹tT÷vêˆtÂö£e<Šî³¼îEÖ@èæñ"þaá}–—§‹% XOD—Î%Œ«òö]` æÌ~:òcë5=xE[L>Æ«ûlµÜeÈäéš»„LÒ=PZE 8ŠòwŸ²U±† hŽ©Í}¾®×E³:HeEä/gYZøè¿ØoÀù±ð +— ÑþzÄV|¥†â‘ö¸SiÑÜèßI6û²_¼¿ +":ÀGÙ0Iýoö§IúoÚÚs þÇÜÉám¹@ ͳl¹Ìª¡ž^”ûu»pÑ_yis·ðŠoäþY’û'‘¿ :øöìÞ?h¸ :§ñ³¿÷¬úFÔ˜fjý©tg‘,“¢t|þ¾þýR¾hœ£_–„är‡~3÷6eø[]¡PK«ž°"…!FsÖê׋¾dgëâ OXø1»p 8:áÂ9TÐ}Ki’ÃŒRíCÈ÷‹u|Cˆ‹cÂ9œL¾æ­éÞL*]Ï+[©7ní'“ô)û²3´ÌŸ0ÄŒBEí£Õˆ™ R¸ëƒ!ÖÇ…Ø3â% „š»`ʈuZ¿Ôáý¢Ë¾º»s³Aµå÷„1µênÙSV +€ÉI&_ªíÞ¨ê#¢p|¸ ƒîÁÕâ¬ö¡ýç²°ŒïŠ"^>î¨.n&“ËsÚS´HæA"y";ô,žx%)4‡Ú[ö„|¡5¡‚± o¿¼ ÃíG>Z !‡JŠîê[1jCÙSö€Qj”ÛÀð&þ|ŒFº M•“b{Z–èO±oMR,)ƒn€ö¸+ãí‚@¸·áõ·ª1×DAu¾{PÓJoÌÀ~>v—÷zÔ–·£ùjˆr‡­¬ÔC¶AÈ™gÉû<ôâŒúPõqõµÜï™NÓtÚ²9¦”ΰ€*¬ˆ>•eVn©¯ }©¾NçU(­ª+(r‰+Òw#aàŸú—W‹ÓHåÞS©6ëI—Æ_F =·¡„\â9Q1Û-"BBòã»äñ,ÁJÙ\†ÅCŒŠßU»9/ëQ|~¿ªžKdjxúqH†T *ëÚ5šò}~$¾C”ôµ xBŽ1µ!C¨“¨Š’B_ÀˆJÙ>ÇŽ8¨…µÝˆÆ ÅqHòµþî€4¤8M7äu€,áu¬ž†o:„„JÚJ¹]F%¼QÆšbŸŒ?Ì󦈼_DÈf@é–&Hj·K‹ ƒ †OÚšbŸ´NG©ÛwÙ!®…šL›Mq½­HÞt½K¥5€råNhw<Š=H óÈ•Ù é@chí6’ÜÛ8˜€d› PÞ‡ðaº^~ÂíKȺJ¯†mÍ$¼y~ÈòØ?}¡Õ‹cxó).žã8íòyÕiÔíà*b[²\ŸtG·¢8Iv ZJÓôBÑï'ã>F¸4n>V†‚ÏMñ¸F=%t¶Xç/UÁC@RŸÎ»Ð eïv ”–@ܳ7€†uæíXS‡$»ü #š¡7¯»mS@ý¤ÿ|%ý2Y,’<žAÄÂÕ\Aåð +—fñY˜œ#šJ³ z}AMÓÔ+ª.×ÜŸâ4©¢4T ‹(/<®–bvÆ6ÓrŸIX1̲õbŽ×ÒÓƒ6oãUªãªC”wâ+ oÃN¾ ¥Kˆéò¶·ã[Q‡$»ðÓÀZÓ­ %ÿè2dIl“QB,¡à \Ý@H–q”Vþ•Aý n¼Ë¿Â46þ¸Ï¡-8âijÿŠí›þ6þC^-|»ß?À“&Õ/ =t3³{=¥E;(¸9ç RîíQ­¡8I¾ž n Ù±í{·uàbv­M›Îc[%–o,[ÚZhÿÏŽ~ž3íï!˜|ŒnFõ|tÀ”"F™ð£Y}t0©¶²°þ¼þö¶ÿÛƒ³GÑ$Û5ÇI³3V‘Ë< ‡÷³š\yµÛo­[ŸûÛÇxU‘è_ãüÜäµÅ†t:’aÐè:òþtñAvH‚'¼¡” +btüWš1´u¥Ôàõpª%«!«·‘Wå¡0vÓáLÏ»Ù6PvЇŽ»Ù6„«:†Cg}U½ÕŸÒäÏ.ª )Ú†P`?Hàäð"[FIꉗxwå1¶‹WÏ娎ºH@¢ldð¦jwÙ¿ 7w˼^y2ýM[7 Èóµ/ +çÆXÔp™Í׋2ëÁ‡ë²öæJ×A ï³Å"{ö[ÝØ^.Q”¼²pŠþT5yá¿:¤†É¶Æmúß—dðK-k7úïîÔ•ã!ßãUÌÏ=בç6 ®ò&+üóh±ð[c.G·á ú> endobj -1600 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [63.4454 738.9144 452.088 749.0762] -/Subtype/Link/A<> +/Parent 1560 0 R >> endobj 1596 0 obj << /D [1594 0 R /XYZ 56.6929 794.5015 null] >> endobj -566 0 obj << -/D [1594 0 R /XYZ 56.6929 723.0302 null] +554 0 obj << +/D [1594 0 R /XYZ 56.6929 698.798 null] +>> endobj +1597 0 obj << +/D [1594 0 R /XYZ 56.6929 673.6774 null] +>> endobj +1598 0 obj << +/D [1594 0 R /XYZ 56.6929 673.6774 null] +>> endobj +1599 0 obj << +/D [1594 0 R /XYZ 56.6929 661.7222 null] +>> endobj +558 0 obj << +/D [1594 0 R /XYZ 56.6929 173.6899 null] +>> endobj +1600 0 obj << +/D [1594 0 R /XYZ 56.6929 148.5693 null] >> endobj 1601 0 obj << -/D [1594 0 R /XYZ 56.6929 689.3491 null] ->> endobj -570 0 obj << -/D [1594 0 R /XYZ 56.6929 552.677 null] +/D [1594 0 R /XYZ 56.6929 92.1409 null] >> endobj 1602 0 obj << -/D [1594 0 R /XYZ 56.6929 525.9649 null] ->> endobj -574 0 obj << -/D [1594 0 R /XYZ 56.6929 411.5673 null] ->> endobj -1603 0 obj << -/D [1594 0 R /XYZ 56.6929 383.9327 null] ->> endobj -578 0 obj << -/D [1594 0 R /XYZ 56.6929 225.6356 null] ->> endobj -1299 0 obj << -/D [1594 0 R /XYZ 56.6929 193.4614 null] +/D [1594 0 R /XYZ 56.6929 80.1857 null] >> endobj 1593 0 obj << -/Font << /F37 791 0 R /F69 1599 0 R /F23 726 0 R /F39 885 0 R /F11 1367 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R /F48 940 0 R /F62 1050 0 R /F63 1053 0 R >> -/XObject << /Im2 1039 0 R >> +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F11 1384 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1606 0 obj << -/Length 533 +1605 0 obj << +/Length 2016 /Filter /FlateDecode >> stream -xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6Úýõµ3·¶ôTEóÆoÞ|x€"b~ Ž “1JeŒ9¡•[ µ9ûêQÇ Ï¤ð–u—{Ÿ¿°I,“(AùË–ÀDŠòêÉÍóé"#Nü!Oˆ—Í&à‘ðXNÇ‹,4þ1[f“éb¤±Ÿga,ˆ0ñÌ)Lg£ïÙøó P§Ôžó{oš_¹m–f»øí==T™žï=‚™ ˜J¡­s†yÌØÙÓxKïçEðæô:4<Îæ"J¦±¡éq‰fŽìô–z«lO‰ßÕ½êÀ,7ZwÎÝkûäþ/¥và)šŒê­-¶uið[xØUE¯*8˜ØyžE_€U· ã`wXUz[€×H¶.²RZ!—{Sô7üÐŽÛôRŠ%çÑ©'ÂTÊä)…Ú{2è]·ÊÜ,#‰Ÿoê˜Çâ- ”úŸ Œ‰I§Àßë]بWÕ\cÁ*uÛ›|u»vx_÷v溵¹å¬Â¥rÚÂÏæî ªö¾ê:å8úe¨ÁÝaÕÔ%ìÝQ­Àp#¶ý¬Ní_Õ¾Ð*å­î]HÓè#˜îâÀÍ9Ε‹ÿµÛŒc»›hþ®îÿÞûë!6¯¤ÑðJ›ëÄ"’é¹(;/É>V~yAþ.ýÐîÌendstream +xÚÍZ[oÛ¸~÷¯Ð£ ±¼_€ÅÚ4ÙÍÛKâv±gYm„ãH^KnпC‘’)[¶šÆ1Š‘H gÈ™o†3¤I„áDZ Ì ”áH`"¢ôa‚£Ïðíç ñ4qK‡Toæ“WWLEIe4ÿðÒkM¢ùâ¯éÅ/¯?Ì/of1x*Ñ,Oß\¿{ëzŒ{\¼wuýóï7¯gŠOç×ïß¹î›Ë«Ë›Ëw—³ØMa<8ø±·s;ȼ__ÜÎþžÿ:¹œw I0³³ÿgò×ß8ZÀZ`ÄŒÑ#40"ÆÐèaÂC‚3Öö,'·“Ãàk3tHiD¨`QÌ8Òx|ƒXÆ5RX‹£˜d„8ÂËÃÀË¿¶#ú¬bÂâBY£r…¤RdkT•p†4c"R‚ *ÁàÖª·_îÊå,–ÜÐéÛ¬J×ùªÎËbWóT¯¤¤Q(äy·*b¯(¦ ™£æÜcÙŽ8¬  €ùêN„ ê‚;Ñèâ'»èWW4¤THq­€»%˜ÿùáÒÑô¸Q¸äÌý÷í Þ¯²ÂÓ°€¨ 5žè¶LÿŸÕ8†&ÓFd ûŽ§Õ&M³ªú´Y.¿Î!Sð#ŽÙt~ŸWŽ"-7E­ÝÐܳ(ÊÚ½$«Õ2­ü…VdšÜ-3ç‰uéŸ÷ÙÀjEBRâgzõö1©Óû’9“íŠê¯« †U`¯ça`Vü”°’Æ -$ƒV=7¬®’|9 +-K´Yψžf†Í´üO‚œåÅg×Y9Zxiíáe‰:xY¢Üshàe¿þ ð +ív*x¹Å‘SFp©2˜°xICÀÇœ^˲ʞ¶À¼©²8b”`µ§ÚJ^`[•J Ã%3Š2H0ªÎi”7y±øŸ·Æ±>oŸwÀ¢ñyÛè|þ É]üÈ&“༛1“I…„RgÝý/Ê¢x¦ÉR`‘¥õ¬¨ãG¶D~Ì„³šHRÐÜ™­6j± o—²ð˪6½¼ºo’71˜¼´Y ŒSÙŒ ¨_„xËvÄa›‰ˆÂtÌfðÞvÖ„è5èzU‡¯ Æ_ŒM“†Iãj¶;/Òò¡k¥Á]ÛqøgvwÞ¸›ù$ð&‹š‘©ËÓ¡Ýö»<0—Hµ9|hr&èΙˆàá߸õüþöÃÀš)·u_«ž¤X 1ÒÀ‡'_1ÅQ(û ´Yر@ åy|QP £1 DX!‰Çq}ðroP°®“×Z©q[¦Â§m™ªl´ul³xÐÕª,UWšî¯„ÃZic‹f)Ãë q"Z­ma\â6ÀT!°A—ÉÛƒÔ¦IÜ™BAh`úS¸/Y)F‚ê±Ä\À0úœ½ÉÒ/OE(Å¡Ó¡¶Ï-Íò/™ûØ*5¼Íšñér³È|+Ûr@ª«”÷*dÀØ}±©ˆ}&îá#æ©m|u ÚÉÂ;„îüÓl1”²Ü}uN +÷¼¾øíƒÏnÛ©ºæl(Éç#g0¡íOD·Çößw ÿ¼c|" b +°S…°êßìÝ#0,‘¦FE17 aA¶^ÐCe{ÉÁô1æœÀ^˜$`kÆC¥ñ°«ßå˼ööyÌk¿ßIºÌÌ¢g/ÊôC¸ŸK¶ISÁåÝJà¦~£îJ@Ûú¸ÉÖy*W V&TSœè1¨Ž(³¥j”yýqO•¢Ÿ­îŽ +í¨¤öT‰Aåöf¤'ö´ª¼ñ'<ߦKj`Ûfîò°.CªÃºì¨]¾_ÕÕ>0JÂ&÷ÇÄvTr{Ú´µ÷h³ÛD‚ø×\4ŽFÔSB‚iw®lWlÚÛƒðÚç­å*8¢Ý³µÍ„ו²Z&é~F»Èþtd@Ã8=ÿÖ_¨l³c F­Ä.¹ô“jtDvgYhšª©ÿ aKendstream endobj -1605 0 obj << -/Type /Page -/Contents 1606 0 R -/Resources 1604 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R ->> endobj -1607 0 obj << -/D [1605 0 R /XYZ 85.0394 794.5015 null] ->> endobj 1604 0 obj << -/Font << /F37 791 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] +/Type /Page +/Contents 1605 0 R +/Resources 1603 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1611 0 R +>> endobj +1606 0 obj << +/D [1604 0 R /XYZ 85.0394 794.5015 null] +>> endobj +562 0 obj << +/D [1604 0 R /XYZ 85.0394 477.8665 null] >> endobj 1610 0 obj << +/D [1604 0 R /XYZ 85.0394 450.2752 null] +>> endobj +1603 0 obj << +/Font << /F37 799 0 R /F39 895 0 R /F11 1384 0 R /F21 710 0 R /F23 734 0 R /F65 1609 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1614 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1609 0 obj << +1613 0 obj << /Type /Page -/Contents 1610 0 R -/Resources 1608 0 R +/Contents 1614 0 R +/Resources 1612 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R +/Parent 1611 0 R >> endobj -1611 0 obj << -/D [1609 0 R /XYZ 56.6929 794.5015 null] +1615 0 obj << +/D [1613 0 R /XYZ 56.6929 794.5015 null] >> endobj -1608 0 obj << +1612 0 obj << /ProcSet [ /PDF ] >> endobj -1614 0 obj << +1618 0 obj << +/Length 1321 +/Filter /FlateDecode +>> +stream +xÚ•WKÛ6¾ï¯0öä"ZEJêž’MÓnEãžšh™¶…•EUlÜ"ÿ½)[¶àÔ0 ‡Ão†ó"Eg¡ùÑYÊIȲx–d1á!å³|ζfí§;êdbÎ3“‰Õ€³”ð4JfÁ)È»åÝâCDgQH„ˆøl¹t‰$!”Eél¹þsþ´“u§š‡ âá}lÍHqQZQå&ë5N=Ö^vùÉòˆÒíd‡Ìƒî‘Èe…D«ÜR_£°¬ÖȨŠü¥’{§j£Gô]jCß*8/œR’qÙÕàÏ£Œ@ÈhddAD–¥~ *ݛÄ˸ qœ$NøÍ\LR.F`÷ª™Äâ&¤ÑíP®&Ð’D)Ͼ7 ^©×Ó€&5R*n²oÀ›¶1&Ûxü?!W¥Ì_vºTH±Œèmq°ÄP™‰©q—ÔJt¬Ú)ãKUŒ“˜Š£*[RªË âùå€f$a1ÖømQm¤0Ui*)k…£mÎÑiwò‹BêsF•m(‚ÎsãG:?–"ðô\ ç¯;·ÛVŽÕá{êprX1@µªÝIl"ØüµèvºïLÙw¦—íÕÅgw¸†2Öµ[œY*×€©]¿UH¹êRop|þ Ç“¦¡Z2h·.Å>û -³yÑâ(1T,; U”‘hˆÔVëµÛ²Vr*‡(I³„:qCë°Î8‰%™k?<„òQ{k|ï44 +ÅÎOÀ9z<‚f¦›î‹Î¦^nf—›-½:`Ò™Ú¤"¦ãø˜0ÂÍ­eÓ>˜ Uº Öèî/ªêÑÖZÛÔsÑ´gb­ªB–ã°ME®|Üyø^ÂëÀní:S¹N·ÜÊ¢j»óÔ9uÉ(ÚX@?+ßÎA¸ðXîê«Ü×¥Û´Ó¯HØ’Ž¨kÕ”în•uíIˆî˜1½¸Z±X˜p…pCwH@ À†ÀhP€ +[#y¿ÒÛ¾­T×Þ#o: ^‹²DjUêüÉß?<ÑŒ¦8ik™O^]Þ+©¡¦j”uæúáÓ·+àæ\c®÷{]ìyZ¿­¨üv­763­6Œ$[„-Sæþ,þ¼8ý× +ljiÐa2>DHìo‘>¢(=›GçëpÌÅ^Ä´obS~¢:’ÈÔŠeÑè—Š™âÑ] c‹ñß%# ãó"7Mß»Øä~n".îª.!Ø.G|€°q"o°t®†viӭ߯Tó¸x}>,vøJìïèÐAãÛ¤_uïÑ“ûå‘!“F]°£‹Ò©•Þô«&?an¸jÔñÝqŠ8dùU›@§>?½Hp”ÁoÏÑ#4¦;e‰;×6|É^ªûaáŸendstream +endobj +1617 0 obj << +/Type /Page +/Contents 1618 0 R +/Resources 1616 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1611 0 R +>> endobj +1619 0 obj << +/D [1617 0 R /XYZ 85.0394 794.5015 null] +>> endobj +566 0 obj << +/D [1617 0 R /XYZ 85.0394 769.5949 null] +>> endobj +1620 0 obj << +/D [1617 0 R /XYZ 85.0394 573.0962 null] +>> endobj +570 0 obj << +/D [1617 0 R /XYZ 85.0394 573.0962 null] +>> endobj +1621 0 obj << +/D [1617 0 R /XYZ 85.0394 542.127 null] +>> endobj +1616 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1624 0 obj << +/Length 3449 +/Filter /FlateDecode +>> +stream +xÚ¥ZmoÛFþî_¡o'Å}á[q8ÀMœÖm‘ôwEÛIK¼P¤BRvÕ_3;³+R¢ëEÑh9»œÝ×g†3þ³ ôÂD&³(Ñ^à‹`–í®üÙæ¾»¼fa-†«¾]]-ß©h–xI(ÃÙêqÀ+öü8³Uþë<ò¤wýûê‡å»0¬•¾HìqÍ›ï?~ø°¢U#Ž:ö´ˆ%/»}ÿvŠSèI%4¯ùt·z¸;ÁJ8”V¡ÛòöçÕÝÇë… |8ã5ÜÑŸ{;JB?ŸîÞ<|¼_ýBOo>¼ÿtÿöîãíu¤ç«{xÂ}®îVNRCi +_¡˜¾\ýú»?ËA¨?\ùžJâ`ö ¾'’DÎvW:P^ •²”êêÓÕ¿ÃÁ¬yuR; „rB= á õ‰*˜B9¼kZºÜ"žôTÖM»Kû²©‰`·Í3 ú†~¿rûæ§n<µ7›¾Èz"›ïÖíSÑ¢o,ÙôÛ‚µ7T²’‹âÄjïöáÓP^ÌÙjFÕ‘'¾àµiþTvM{$öiÿ ½!Äà… +A&QÍ`&"ˆóê?ÏõjOkÍ"-<éˆôA³ŸgvôãI7ö…Åð £=Üÿ‚/îþØï¿Y.á_/=tYÑö^Ón`¼ÜÖK&-íí–·?-Àˆý9Qâù¾öòº;?¾V`d‘/GçÍ@¥—Äq*¼$(¿tû"+æLJGæL0ˆç¿I©i·‘%FÂÒ‡E?q boaøÖÍžâ!r‡ð8qu±qÅüfî¦í{Iâ2äžÐ—óÕ•¬³´¦ý¶Eµ§Q¹ãXúÄ—ëŽ]_ìh²+²C[öGzZižJ3'²Éϟ’LÁw=8Jde*Ý•;0òuó9D?oËlËòªhT•»²?En3ÈÓ]º±ã¦¶)å‘g”hŠGÖØ{îÊ®È n@WÆäÛºðEm’ÏãO¢Åü±HûƒËaÚ'Ç€ :Øû€„;‹yGÙ ž›GZÁ^s$m/„t]VFȆÚЯóÈá6yZì,ã”Ù¤ü|¨÷mùTVņ,ÃÜn y¸ËfÂ|%D$¢`ó=Ð’`d¾˜LëO†ã¥ jÒÎ Ð×À •ðçÿ¹N¤Ýa³):Ö.]µ&ßG5v62ÞÌ"ƒÖZNaWuŽÁtðQùFÄ£à1åC“‘´¨o {ƒðQ*ÇÆó}a D‰Äè¿ÁoñGºÛW< ¶¸3qª²f2jÞPš”çØ·€mÉ|Ò©{)‰V_q¯$H¬~Ù o&jåùÒ·ü–Oi»|)Þ€reÙ¥àÍJ…sw7{#¶åÉ ı:j(¥pšœa/ò!Ÿ~d+‘¾dl¦ã6ã÷Fš\ºvY5YZ-»uYóÝ!’úèæø1¡§ß ! ê)e«Â7•­[çþ•lÙÜa‚ää8 0QA8âLCKH!Æþr¼²–¡É"†>e2!ÀX)Ä«† \¶½HÛÈeÛ=7íg¢p˜Ýmu¤¹²¶'¡iÛ—Ù¡Jù¤9q(o 4.Áå.À¾s3²˜Iì@ˆQ‚µå…Ap–Ð_²bÀSq%ƒ…–I¬*(§QVÂQ] 1àÈX7&Ì¢§ÁSjʉðB`æ­mÊ£²ÎªC^pj. qû-çÕxWqÇn¼%9”IïzþŽóÝÜÞeä8ÈìU“`iÎÆgržÊâƒó”ˆAu$¾&„Ò‹‚ÈÎ’÷#Ôäc˜'„Hd»7å6üæû²*}ÀÍtÏÁC¡ +pžUŒHæå†~Óü‡®?Ûï)­Eçv#Pb\ ƒ±x}uv|.£Kç‰àš2´ëe˨¤ËÐF\ ‹6ñÔIhû2_ ¦Ü1ðÂ8< ri–5‡šÇ£-¹Á:Ïâ0ˆÑâ,[=Ô|MÏe¿%(Q¤mU2@¦c©h6 ¢%ÝÐÐ8‡,Ç} Ѳ:Z~ ¨‰‚AÃñaÏ_OFk"—OXш€!Œ+«´ÈàU|¬ sAקýðäuÓZ|St ,à!`ÇAx–‹¶)…-õ¦;÷‚q±)DØŒ»Ì‹§åŸEÛLAåE‰k´M…°LYµà+ÐÎCL!Féט©!³ªÙ¼ÐÉ‘~tB.¶úžÆšðó,úŒàA_î¦Ü4Vè¦ÒÕ`€lJy" +c  lSàa g¹°1øÇŒßq1ûW¸þÜ–M;t#9FÜ\`\ºTâ{ +ïq©Ä:U(&B(nàÁ~Óü#¨&¤<´Ô€Éú6ˆzW+ 앲mZo +K7ÔÐ!>]Ç%“i®q×ä%.ÊleÚìl$"Œ”>Ïí_Va](϶Íó”v”ôª‹ûpafãºóI§ýœµ6÷YÚm(¨X.sîr ¬œaÇÔAéMi©M(§¶µ[ß–=UBSÝiRÓ‰ ¾ª=-@ `´Éþ1„˜ ×yÑ{>ðâ¡}㬕è>2HÓ¿…vП%€…°ZÁÉd(Iåï: B ¦åÊ•ˆ‡‰ù +þ•ó»‹¾®ôüHFPƒqHˆƒ°õìËLx¾NE‹csד ay¿“³· Üh6¸”e¼r6—‚Ø3pâÐJûÇ°M,cºSÓ¤-…6QˆÂ¦ŽoL’½ˆ£Í ˜ lù csïè¬U.ö %53ŠP3w¢F}ê0¸uh¬ÏþÑÓ€púÖó÷¼sìRP¨ë“KšßvôÑHÅyNq–{{S*3 +-û<í ÛþæÎã« ð[ðJ(n8(®„œç–?RÌÇiÆŸºms¨r¯ùUÐ8(»â¦‰ÚZ€«šš©0ã 'ÀŒS˜ñ—óàT0WWÇ©ݳl‰âºFÏ󆟷TM½›æÖiGU¢øžh[J©ùýÏDHóœ0jÇ/QÑ¥ìJ=ß6T6)¤Å¨˜V—‘änØ¿øUé–jêÕ½°õ⤬…^ÖSç@P™^ <Tü×”Ãÿ ºé¶ñ‹ßÀ£Äâ-€íÍó‚U=Y£Æ±‹cr 9æ¹ +¸aŽä]Ño›œÁ4(Ð8Ý'Mpt(å‹ÓÍꮡ%vb¬ ÜññÔ'W!T.#S`>±3Z?¼EéØBÉ>>ˆÝ±Š´+M!Ð'Økc Bàü¶ê–xÓ»£¦–Åãèðiq|è‚·1ò¥>lL¦ð¢fT¢<)4|E3 ·|¢6‡mL#ÉtLè ƒ±d`¬'觫Ò'^ê¾ `ÇŠv¤ÀÞŠ?KwD€á3•w\„ ¸º‚tó­M‰Ó‘v)Ôcí”ágÔÔ¦0#pZlms +ä´ïQ·9M®™Ú¹j0°n¨ih†gÖe`n}Cc‡ñ”û¼¢‡w¤)úØ2ÁŠoÃï›fA€»©† —ìÈ|¶)ÿÜ ¦OµÎiÓöL÷ƒoUåöö£¸é(†¡3O|ã1” |c>Á@‡¾´ƒØ!Ó~A‹0ë›þÝÆä·;ø…érN¡œ5ÐÚ¹gíqß7›6Ýom¯§Óœ ÆöC_0£5ï±+ÒzZ¶h‚2{¨»4cÇñsÓ¦vŸ):Z„ÅÄêÓýwü—­Èãa²4&ê—bjzZ»Òìõ˜šçæÎaa›WqsLD5éç#ÚçâHƒ|WÌwè”tÌÀv‹°°M Zž©°-[çØúhiìŸ&ÇŸº­Àà@ŒåSçBØ®€³IlàLT}ÐH¨lCÄ´Ø7U™§[Aä>Ñ:iGàÁúTñå/—ZPi)5õG ¾«iþö pÀ<ŠŒ³=öt LøPx³D_œÜþ5ÑåÑÿk$§/endstream +endobj +1623 0 obj << +/Type /Page +/Contents 1624 0 R +/Resources 1622 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1611 0 R +/Annots [ 1629 0 R ] +>> endobj +1629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [63.4454 738.9144 452.088 749.0762] +/Subtype/Link/A<> +>> endobj +1625 0 obj << +/D [1623 0 R /XYZ 56.6929 794.5015 null] +>> endobj +574 0 obj << +/D [1623 0 R /XYZ 56.6929 723.0302 null] +>> endobj +1630 0 obj << +/D [1623 0 R /XYZ 56.6929 689.3491 null] +>> endobj +578 0 obj << +/D [1623 0 R /XYZ 56.6929 552.677 null] +>> endobj +1631 0 obj << +/D [1623 0 R /XYZ 56.6929 525.9649 null] +>> endobj +582 0 obj << +/D [1623 0 R /XYZ 56.6929 411.5673 null] +>> endobj +1632 0 obj << +/D [1623 0 R /XYZ 56.6929 383.9327 null] +>> endobj +586 0 obj << +/D [1623 0 R /XYZ 56.6929 225.6356 null] +>> endobj +1316 0 obj << +/D [1623 0 R /XYZ 56.6929 193.4614 null] +>> endobj +1622 0 obj << +/Font << /F37 799 0 R /F69 1628 0 R /F23 734 0 R /F39 895 0 R /F11 1384 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R /F48 950 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1635 0 obj << +/Length 533 +/Filter /FlateDecode +>> +stream +xÚ¥TM›0½ó+|©¸6Æ`³IÚ²RÓ4a«ÕxT‚Ó@6Úýõµ3·¶ôTEóÆoÞ|x€"b~ Ž “1JeŒ9¡•[ µ9ûêQÇ Ï¤ð–u—{Ÿ¿°I,“(AùË–ÀDŠòêÉÍóé"#Nü!Oˆ—Í&à‘ðXNÇ‹,4þ1[f“éb¤±Ÿga,ˆ0ñÌ)Lg£ïÙøó P§Ôžó{oš_¹m–f»øí==T™žï=‚™ ˜J¡­s†yÌØÙÓxKïçEðæô:4<Îæ"J¦±¡éq‰fŽìô–z«lO‰ßÕ½êÀ,7ZwÎÝkûäþ/¥và)šŒê­-¶uið[xØUE¯*8˜ØyžE_€U· ã`wXUz[€×H¶.²RZ!—{Sô7üÐŽÛôRŠ%çÑ©'ÂTÊä)…Ú{2è]·ÊÜ,#‰Ÿoê˜Çâ- ”úŸ Œ‰I§Àßë]بWÕ\cÁ*uÛ›|u»vx_÷v溵¹å¬Â¥rÚÂÏæî ªö¾ê:å8úe¨ÁÝaÕÔ%ìÝQ­Àp#¶ý¬Ní_Õ¾Ð*å­î]HÓè#˜îâÀÍ9Ε‹ÿµÛŒc»›hþ®îÿÞûë!6¯¤ÑðJ›ëÄ"’é¹(;/É?V~yAþ.ýÑFÎendstream +endobj +1634 0 obj << +/Type /Page +/Contents 1635 0 R +/Resources 1633 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1611 0 R +>> endobj +1636 0 obj << +/D [1634 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1633 0 obj << +/Font << /F37 799 0 R /F23 734 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1639 0 obj << +/Length 69 +/Filter /FlateDecode +>> +stream +xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream +endobj +1638 0 obj << +/Type /Page +/Contents 1639 0 R +/Resources 1637 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1611 0 R +>> endobj +1640 0 obj << +/D [1638 0 R /XYZ 56.6929 794.5015 null] +>> endobj +1637 0 obj << +/ProcSet [ /PDF ] +>> endobj +1643 0 obj << /Length 1964 /Filter /FlateDecode >> @@ -7135,86 +7253,86 @@ i ­è×ØÚ:‰óÎÐÃBYn?z·XdÌqâd¾©Üä¤ÚNí:ørðï»QÕaáƒL·CÕMucVìâªV.Wª4 Û8Hü»Uoy)”@»Zìo+B)ˆ×­©ôD9ƒ©;B.ÊõTyåvÂ)Î6™îZds§¡ÁÓÏMí­µ°r=¶öä&vÓž®é^/yr€¡¶¯ÓP;«y Â1{9B€FãŸà{ËוÂM>p\×-ž‘7>å èWˆÌ¨WKÐÆ 5m"û¿À¥–€ã6WUŸÔž9ZØוå,¶VHbžþ‹'¯´=Í\¦pÀŸ'8TÃ[WyÌ#‰6Éyè5µÒÇî:4 ßál 3,•ßbÏ[œ+ªë/WF".ƒ›ËÊ?@”€/jŒu“1Ô¢+l',{_¼2ãâ•sä®ÏñÛªÊ ¿&–Bú–åç !G˜ ¥Ìrcø-Š¼ûãËü “¤%œ¡i±Iæ² —â~ÚøÑŸ/¯6³Âv¡ámÒ¥ß;»è½‡CÀê/aïoãã<,EQ^Çsór4 ÝÅpµö;[ÃïVÎy7G)JΑOü©5­¿|hW°hpk·IQ„"é5¶ÏÍŽûª‡]Ù)C™‹_Ú‘Âõ%KÄQXDñ¯oʬ±]ªÜïʽe×SX{üâññ|>‡¼+¾,}w¸ÉÀUßÄx³Q³Ô}\Wù¸·ö߶ -ߣ«ª]qöü´Þíâ³äZÄ^d{‘¡Éep …E\æÞ†RÊ[oóûæ½»ÿ¡êŒêendstream +ߣ«ª]qöü´Þíâ³äZÄ^d{‘¡Éep …E\æÞ†Ræ·Þæ÷Í{wÿ¢BŒìendstream endobj -1613 0 obj << +1642 0 obj << /Type /Page -/Contents 1614 0 R -/Resources 1612 0 R +/Contents 1643 0 R +/Resources 1641 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R -/Annots [ 1621 0 R 1622 0 R ] +/Parent 1652 0 R +/Annots [ 1650 0 R 1651 0 R ] >> endobj -1621 0 obj << +1650 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [348.3486 128.9523 463.9152 141.0119] /Subtype/Link/A<> >> endobj -1622 0 obj << +1651 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [147.3629 116.9971 364.5484 129.0567] /Subtype/Link/A<> >> endobj -1615 0 obj << -/D [1613 0 R /XYZ 85.0394 794.5015 null] ->> endobj -582 0 obj << -/D [1613 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1616 0 obj << -/D [1613 0 R /XYZ 85.0394 576.7004 null] ->> endobj -586 0 obj << -/D [1613 0 R /XYZ 85.0394 576.7004 null] ->> endobj -1617 0 obj << -/D [1613 0 R /XYZ 85.0394 548.3785 null] +1644 0 obj << +/D [1642 0 R /XYZ 85.0394 794.5015 null] >> endobj 590 0 obj << -/D [1613 0 R /XYZ 85.0394 548.3785 null] +/D [1642 0 R /XYZ 85.0394 769.5949 null] >> endobj -1618 0 obj << -/D [1613 0 R /XYZ 85.0394 518.5228 null] +1645 0 obj << +/D [1642 0 R /XYZ 85.0394 576.7004 null] >> endobj 594 0 obj << -/D [1613 0 R /XYZ 85.0394 460.6968 null] +/D [1642 0 R /XYZ 85.0394 576.7004 null] >> endobj -1619 0 obj << -/D [1613 0 R /XYZ 85.0394 425.0333 null] +1646 0 obj << +/D [1642 0 R /XYZ 85.0394 548.3785 null] >> endobj 598 0 obj << -/D [1613 0 R /XYZ 85.0394 260.2468 null] +/D [1642 0 R /XYZ 85.0394 548.3785 null] >> endobj -1620 0 obj << -/D [1613 0 R /XYZ 85.0394 224.698 null] +1647 0 obj << +/D [1642 0 R /XYZ 85.0394 518.5228 null] >> endobj -1612 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F11 1367 0 R /F41 925 0 R >> +602 0 obj << +/D [1642 0 R /XYZ 85.0394 460.6968 null] +>> endobj +1648 0 obj << +/D [1642 0 R /XYZ 85.0394 425.0333 null] +>> endobj +606 0 obj << +/D [1642 0 R /XYZ 85.0394 260.2468 null] +>> endobj +1649 0 obj << +/D [1642 0 R /XYZ 85.0394 224.698 null] +>> endobj +1641 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F11 1384 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1625 0 obj << +1655 0 obj << /Length 69 /Filter /FlateDecode >> stream xÚ3T0BCS3=3K#KsK=SCS…ä\.…t œ;—!T‰©±ž©‰±1ƒEV.­knj©g`fA‚!ÂVŒendstream endobj -1624 0 obj << +1654 0 obj << /Type /Page -/Contents 1625 0 R -/Resources 1623 0 R +/Contents 1655 0 R +/Resources 1653 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1592 0 R +/Parent 1652 0 R >> endobj -1626 0 obj << -/D [1624 0 R /XYZ 56.6929 794.5015 null] +1656 0 obj << +/D [1654 0 R /XYZ 56.6929 794.5015 null] >> endobj -1623 0 obj << +1653 0 obj << /ProcSet [ /PDF ] >> endobj -1629 0 obj << +1659 0 obj << /Length 2543 /Filter /FlateDecode >> @@ -7227,116 +7345,113 @@ R ’ r”OœBç=Á 1j"«¢ºÑpQɧUäzý"GöÄÙ G,ØÝfS6ä ÐBdz˜€z²Ó„Q™DÏ B0q¶Ah3>£Œ7«®sÙØ£FfÁ'‘«RuJãÆÕùö‘]ôçÛ/¨N‡ÝVM)gQø|$¶Ì­} 8Épat*ÌÒ¹Ã^‰©€ck ˜Ö…/ ‘úf8ùtTù‘w)Ë¥áZ½RÜ0†Oå:»^•˜Ã&Ù:v3*LO„Y‰ÅèÖt4™\a¼°[`\ÃÈÈö®ž„Ž—ÌÉAM´Ěû«„Ä„ €É,Ö£ÄvFø[vAé÷Aô´QêÜéüY4²³Álˆ†±ˆC¶ýB=ù¸!‚nÌÊw‰P‰ü¨jiˆ¯ÔàbºHêØ슆 Â÷ZÁµêμûž¶ºž–Ï܈RvµïY×ÛæÕ¨äjµ¤½¬s«I˜ŒéT×wìDDåïÛÍêv{K‹<õ0Ø>Þá0(î9±Þs@ܘe·ž«„D±é Ønu»ÁƒÖÄqE?cÔq,¦…îÀ³ÆúE£ÁĘŽAÄ)ôkÙ>ËRži6”šQÑÇÑ í%"Û2R¡q¼µ2$Q†£5ÄÞÞ3Xßñ±bɾ¾Ûºù~­(z‚Hׇ î †FX³Á¿,0x,ã&þ,<^ NÖÀY_Ö# ÆÃkfÝOUÿÕ‰[¸‘{Y›åj_¼ˆ1î𥑈6Hy ÿ/óŽ#窀Š ã”U#7Cã@Q²€.ÿ¾ô™Ñ„K ÷yIJ­¥¥tG6µí a)\§ë€Ö&tÅŒ‚þ[år Òéú@Øèªé)ŽL½"Ÿûæ¢@ù<ópBµÙ>~æÜpËBtG‰ãÉYxEìÅbè á¥…9`°8#Û–8Ϲ6aù/3!(¬ÝˆUÐâ£:J¼TœpŠq«ëÄLM³ÿ@ÏM •($Ñì]€B‰±c€2i ?P‡nþmD4“Ç v;)*¼Q¾Ý3,$¶×`(‡æJý× éz`ê„Þw§Y1J†|%\‹B¡kùüEÙi¸U³“eÉJ}“/Ë…ü¦¯KÑX%=›4øªQÕ‘¢®óñg¯,•Ä²áŽg k ¥TŸ%#.Q=( ‚ש©ö¦7F ŸgàÑ[¦Ã–è@±¸ˆ$ŸægH@Ä%²ZI(Ž":ž( 6SaUŸiQc¢õFêƆEiX*×5ÔÏ]OÕ-ãÖXXE p³Í‚¥¢o¹‡›MÔºõÁùˆ4òK®øbðج–S€¼V(Ø&ˆ0ð[P£ ÄNg[iÝÑÒF´åêNuЧ—%KÞ©gI«w}o }U¯K­yHÝ2Ž"ÛüÁ×ý ÆŠýô3À‹¬ÉC–Påú‘?{°GÉÏæ#Sð¹c"ˆ£oë¥yó–þ®‚¸åé·žøqsˆ™Ìy™Àfá:ã¤m,ßû¶¿š°f¬…´íº¥®ÙÀoçÁâgþe5ñÐ7þùçìÀשŸ%ÃF¨g–¼=mü‹Áßû j=¢Xendstream +®o¬ƒñ+ñ'E\2}8Ç’;i %Ò‡ï&ª°Wõ\~jÀaÛÍ{³˜¢GË!zeoA_^†NmÞxš^Xð”Ð;’ù‚Ïr{z8Ø'"Hóȃ…×UØNÑô©|hÑçò+Å™X‡¬Yzœï_wEî”b8Iù‹Oï×WHÎÄšæÝǧñ#þði>ÀoçÁâgþe5ñÐ7þùçìÀשŸ%ÃF¨g–½=mü‹Áßû j•¢Zendstream endobj -1628 0 obj << +1658 0 obj << /Type /Page -/Contents 1629 0 R -/Resources 1627 0 R +/Contents 1659 0 R +/Resources 1657 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R +/Parent 1652 0 R >> endobj -1630 0 obj << -/D [1628 0 R /XYZ 85.0394 794.5015 null] ->> endobj -602 0 obj << -/D [1628 0 R /XYZ 85.0394 769.5949 null] ->> endobj -1631 0 obj << -/D [1628 0 R /XYZ 85.0394 573.5449 null] ->> endobj -606 0 obj << -/D [1628 0 R /XYZ 85.0394 573.5449 null] ->> endobj -1632 0 obj << -/D [1628 0 R /XYZ 85.0394 539.0037 null] +1660 0 obj << +/D [1658 0 R /XYZ 85.0394 794.5015 null] >> endobj 610 0 obj << -/D [1628 0 R /XYZ 85.0394 539.0037 null] +/D [1658 0 R /XYZ 85.0394 769.5949 null] >> endobj -1633 0 obj << -/D [1628 0 R /XYZ 85.0394 510.2426 null] +1661 0 obj << +/D [1658 0 R /XYZ 85.0394 573.5449 null] >> endobj -1627 0 obj << -/Font << /F21 702 0 R /F23 726 0 R >> +614 0 obj << +/D [1658 0 R /XYZ 85.0394 573.5449 null] +>> endobj +1662 0 obj << +/D [1658 0 R /XYZ 85.0394 539.0037 null] +>> endobj +618 0 obj << +/D [1658 0 R /XYZ 85.0394 539.0037 null] +>> endobj +1663 0 obj << +/D [1658 0 R /XYZ 85.0394 510.2426 null] +>> endobj +1657 0 obj << +/Font << /F21 710 0 R /F23 734 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1637 0 obj << -/Length 2893 +1666 0 obj << +/Length 2810 /Filter /FlateDecode >> stream -xÚ­ksã¸í{~…¿Õ™‰IÔ3ÛéL.›ls×Ë¥‰;íÌíÍ”–h[]Yò‰r²¹__€õ°•½›i“&Ê›¹ðïÍÂȉR?Åià„®βݙ;ÛîÓ™Ç4 K´R}·<»¼ñ,uÒÈfËõ€Wâ¸IâÍ–ùÏókÇw΃;ÿtûpûtý·ó…ºóÏ4xº½»}º}¸¹¥éýÃÝOO?^ŸÇÁ|yÿÓÃù"‰Óp~ýøxûðñþ_Ds ]×BonŸÏY~v»ì$žÊsŠûëÙÏ¿¸³÷ý™ëˆ4 g¯0q/MýÙî,…BXHyö|ö÷Žák–NjÉs_Dþ„š|1¥¦0u"(TÓw÷át~2Q.ê -'é<%Ø«Ô4hνd®J%µÊ‰¢¨ó¬ö­Ú­TCSßu]"UN ‚yH‚ïäêfÈõµ)ZE¸zMˆJɦ|ãeeÉ õ^e-3³”í–—ª\~ 4 -hfáyN†¾9fùVT²"ŸFÒÐg[Ø>k$ŒÓ­%ya4P’~¯$œø#Ìùp -"‡Ï®ëgýFÐ\í‰s&[ÔÂŒjp`‹1ãÄ.}Qe½ß©ª%€Ý)«+]ðq‰§µU«*YejRueêd9ø]ËcmzÂê ½7À$Ç÷ÓdþPÓ\æyÑV–4 j¶ÐŒ¨+Eœ-«wvXŽæ=ª‰%dÅ\ ¡a»•Ö5ƒ´Êà_o ö`2bö²Í¶JÃà>¨u|4Ì_ëæ ¡Ì!æsE¸}­u±*ÁÛ:—o4\½y+ôLX7z[ì c,€د1z…IV7ûº‘¨j} ˜oÕË‘r(üµ…½²ZÓyYp)㨠¢–Qfsø­;rªúÀ˜¢Ê‹—"?È’!Å›y#ˆ7S`× t’Tؘ{¾ð Ì?©Š1Š¹j­Ê1·væx=ok`Ã[Ç DÚtÙß?¾D|‡ó¼#*–÷³º×ð¿ó†@`éÇNà‰Ð°d6IlØ}1«$áè ïùÉbU´„«WµÅ¹gî:ø'AÉå€ïa³–YÇȘ Z…ÃÈ(9Hãùë¶È¶o~]½½'¤º` ¤ˆ„w ‰ã:¸¹•Í€TßH(ýæÀù„x^:bÞ÷ÇCÙ¾«ÆÔ bOü?$$õ®Æ^<öÁ^nð¢ -æíœH¸>ø8þzduÖ+ž™ ‰èMY¯0† Ð:„™ ¼‰(5Dòâ=@¶«‡›}´ÁãBnÑŠw|º»!&ñÅÔeúìûÁ'ãL'Ž© ‡â àÎläࢩìÒG¯ÃÍq Iôo£´œ²<Ô‰PÓlÏÍ@ÔÁUæÄG» y¿Nxø¸ë=ãÝ=}ÊSK¨+Š˜5†þsºC:¡'¼£ªÜ¦ÂCìDPÚó’έþÐv±püPص”ï8AâÇcË,)?§½Er¤@@Žh T -$Œ©!cš JÓ©ÍüÉü°×Ê•Ü Ù™E AL&ÚûçÇsjÛ sîOM–c©6ÛòÍ$;³ -v!¨/rÍ[×½® ÞLh܇l›„´¦5õÃD œ$ŒlH„r«å&Âçݳ5º?¾·hdµÁk+ §/-UçI0> -è¾ÏÝG$”uf,Õ­DC¡Æüx¾;˜t -(–"—ÜYi4¹B™º¦qfèY'ÉíŽÑ–\z ¬nÌ\³&ÊKŸ ‰•v(Äð1“‘㣓Æ|ÒØŠž«Ëˆp}µ6eè£[SWöj›ŸMñ¢Âú`K@®Ö j]¼©VP%Ûc4ºãê#‘œ*Õ-õNB'V½S“ÖÂxl˜gr/WXÖà= #’qcYaç 8êò®• õ•Ëö0î$3£–F®ÁØÑ‚𪕲€¦)¨Ùˆ1|L7eX¥s*-qPC+a©÷Ö> XúØö±°ž  WÓgÀÀ´ëð{SJ­¹ô‡©©í>ÖØ"à© g0Áhrsÿñ ÃÈó1‘¦ß,°Õd0\>M„4Ê‘Qƒ+KŽ\”c.¬ŠhÙdEÛ¤Ašäèe<à‹uÝ«²ä~É°?Òì¿A{É ”Ôøø¾ÿˆ8"UÐ%1t\éÁî`ªŒ˜ ‰HÒ¿˜Þtè£}VÕÐ_àrÉhÓ±#}à'nLsD¯€“‡¶Æº$ë) kL蘌‘¦Ö¹aTìö¥ÚYu›ºÊ£²Ýbf`’–5ýv¢àdб¦œ)à·7En¡vÛ\­%””4é-„¼×ô[)¸ìZ6oçÈõX˜Ì¯'ûÓ·}‘ÙeÜÎJ©]±ÙrUQÖ57°eñE]u-ã "‰„“aë_ßu½«|•\ùð›^I×…õ¾Wk•xWþJø)mÑñ™*ÛÒã@ ;L/ʨY'²zÝššbb™Û—¢ÏÞ’9” Cfb‚ ã\sÂ]¨ ÏvHÆïV¼×V¾("+ª¬ÛÀ8«KsÕaˆWýßWW¢K =ÉIøô¥;^4@%(SÚÂdà†¸¿ÑʸSî”bÙH^šÉÉÇ!4F{\Zf6ç¬8€´} âç13êêʪ«Hó›!¾}°ü\ñœ­¨7Üoßú؉õ|Ø *¬(OJæpþÁÆä³H`7é^EžÄ)Û-t/`7õÄàÚýÇHžÇ~ , KÌëì`9B»EœLçsyÛÖà&Ñð\´Md½•ÌÙ|4o.hÔ¿4~^Wè­QâX†½lx7ã/Ñ»ÏbŠ„rS ƒ^E8©È@´ÂŒLcÓ’Ã/ܽmE! §UÝš&7!'\×JÌæ(ÎËñ.iU¾XvÝép’›ž¢2‰¦Ø;ðšÉ½W3ÜðÛjÕ“jº˜¼ý¿ÉY2„endstream +xÚ­koã¸ñ{~…¿ÕbEõ̲»É6w½\š¸hÛ*K´­®,ùD9Ùܯï g¨‡­ì-Ð&L‡Ãyq”˜¹ð/fA脉—Ì¢ÄwW³lwæÎ6°öéL0ÎÂ"-†Xï—g—·2š%Nzál¹Њ7ŽÅl™ÿ2¿v<ç(¸óO7÷7×;_x;ÿxÿDƒÇ›Û›Ç›û74½»¿ýùñ§ëóÈŸ/ï~¾?_ÄQ̯nî?Þý‹p®‘ ëZ臛§ó_—?œÝ,;Ž‡R W"»¿ýò«;ËA¸Î\G&q0{‰ëˆ$ñf»3?NàKi!åÙÓÙß;‚ƒU³uRKÂu<zjò䔚‚Ä %,¡šÞßÝé¼xþ¬]ÔN’yB°—TÓ 9ñ\•*Õ*'Œ¢¢•'µoÕn¥šz®ëBZå*˜FJð]úŸºR}iŠVÑZ½¦…J¥MùÊÛÊ’ ê½ÊZ&f1Û-o=T¹2ôhÐÌB' ψY¾Õ†¬ÈÃ(5øÙŽÏÚ1ãØÝžë¸Q4Ôì`išùðã[AaÉ*šŸ0ùìº^V€$¯´%W{BÊÒVåàVR¸óûš÷çyÑÂ)iIó\=«²ÞïTÕÀ(©Ô•=¥:–­·¦atB%Æo¡ )˜’þü¥n¾Ð’a~wi®hm_k]¬JEð¶ÎÓW®^ ¬½íÖÞ{Z1vÆ8¯1IV7ûºIQIúAáˆä„Ôma]Y³™q)c«uÝ´º3žù­;ò­úÀ+E•ÏE~HKmôWMÌ„ïHî!Ü58Õo%£ó…€«1ÿ¤*–cŒÔZ5ªÊØœw0±3òõÄ­†¸”N쉸‹t‚Éß=<‡5 £b†?»{ ð+˜æ06 ™!x&‚¢“‰#CÆ(ŒIÅñÀ¿a]xñbU´´RäàŹ0þÎDеñ4À-ªV5ë4ë›Á‚VFã02GJ#Ôhþ²-²-U¾A$Ëä‡LåöZ;qÊ ¤õ(G¤_8§(‹65Qæ:KË”ÜfwÈJ¥Zš±´NðÚ&Ñ|¹í„t8i·4³Ó×½(âH‡èCý^‘ed2°Œ?Ë 2ÿªÈRÝN˜P +'’^‹8Ó1d2 VAå,dÃF1¾&«¥/æÄD=HßíMòn‚ËØsd,=>üºz}‹I xþ€IJÃ$ž6f!ÆuðpËš¨¾SúŒÀù{")½ˆÏýéP¶oª1qü®ÁÿCR¯ï:A$¢±~{¾Á‹üПÿµs"ézàãø+ Êê¬)V<3Q—7e½Â‚@ëf2ð&ÂÔÙVíŸqkx´]=<¬è£ Š+|‚O|¼ý@82ˆ£‹©ËôÙóüOÌÆ™ŽS0 ÙAÀ­9ÈÁMÙ¥^‡!•ã  a×m”N§ õÔ:>›s3àtp“ À)­ûuÂ1ÀÅ]oèožé9P¶YD}XQðÀ¬1tŸÓÂÀ „G'Øê"­¦¢Cä„Pòò–Ϋ¾ë¸H:^ í^J÷ ßó?†›24Ì’ÒsÒëOÆGúƒÅ‘þ „*˜WjH˜&Dà +eéÄ&þx~Øk +ä*Ý É™M ALÜ»§‡s%ß9õ'&Ç1W›mùjRÙõ{”¹æ£ëž…‰BœÑŸP¸¹6) ,kʇ‰0â;qÚ€¨¡ÀäÚÚãÒUØÒÕßZ4iµÁK+!£/-VçH0> +çÑD”’-Ê:3–êv¢¡Pc^4ßL2…%æâVº³Ühò„ò4c­ô¤ˆRÊ]€Ñ–\ŠV7fžYæ¥ÇˆDJ;`XÌxäøñHÒˆ%,ëñ±ú¸ˆ0×kSìèÒØú7¥ŸMñ¬Â½³ ×j´.Þ T+(’m|ik»sPÛ` JÛ­âb¼Ý¦Õ{—BƒR)=UŽ“Ò‚hl˜gé>]aMƒ×,9DF]„e-+à¨îû–+8©¾rÑDcfÔÒh@Õ¿3zr‚ÞµRÐ4…‰HàÐNv&¦hñçTWâ †î.…}¦ÚYù°ÀÜG¶ƒˆ¤ud½˜.¦‰…ßeª5þ05…ÝÇz—Zj]4ƒ “w1Š\0húÃ|[Júó‡åã”$¤QŒ<9m» ÀDX+вI‰Nɘƒ—q€/ÖSt¯ZÈ‘ûAÃîH³ÿm!o€~½×ßt…¤ º2{Ž«@ØL…‘ú·ã£D£ú{VÕPŸïr¹Ëè{††>PKŒÀiŒZ•ÓZzhk¬I²rÆTCgl‘$Ö·aTìö¥ÚYm›šJ£²Ýb^`”–5ýv¬àdЮ&œ'à·7En¡öØ\­S('iÒi¯é·RpÕuÚ¼ž àk± ž_O…"èŠÌÖ'ãVnTFíŠÍ–KŠ²®¹{-‹/êªkåH½¢”¶öõ\W\å«øʃßä*u]Qã{µV±¸òVÒ›Hh‹ŽÎDÉ–Gaè‹ðµÆ8QF:¡ÕëÖÄÓ³2XÈܽ]†ÔÏ¡2bø;÷ßú‚ÞJtMël†xü–ÃgmÓgEhE••*>zˆÂƒ¶ÐéO¾m»Î´ë]4k~EŠÍÁ;4%¤NŠÂËëy Œ³º4†xÑÿ}uõ'ºÒÐþ˜„„/?º£ET‚2e-L^ˆç­Œ›äN)–LÊ[3ªÅBc´ÇeefΊÃÇžøL*47ÂŒºš²êªÑcßü¾‡É/ïA¶¢Þ4é~ûÚÄŽ­§ÃUaYyTiò^/¾ý""»‘Gqʶ +kûèõ¡Þa€<Ž@«£¿ïqäiìØ@:ļΖ"´ZtÀɶ¡?|F0·m ~B}×Eã„Ö]ÉÞ¡M7€éæ‚Fý+¬ïÁí +½5ºÂ5æaŸ6|šq˜ÐëA¤S‘ônhaЫg#ˆV˜ilÚqø…Ë·­(„á´ª[Óà2àdƒûÚ“9òŸóv¼LZ•Ï–\'NrÓQT&1À;Þ3Y¶÷j†+~Sm vRM“—ç V¸_hvK%OÆ1e¼»YÞrîMlk‘ă,ómúOm?‹çŸ¸ÙÓ"Ñú„ôÂ@•ÒâwÖÞÊz…±rp3 ûöû\p©z»|à;Ù^Mdûu»¿º¼|yyA8….•.‹ja¬t‰­¾qý`èúÂOàZ…¶þ +Ä“N"\‹ä´_ùaEŒóŠÈ¶Å>þtâ¾%AlZv&>}ë å/3;ú±ÿîÑíX ·˜ïþðàSÊ#u UßwÈk/ùó‘ÿ8ŽŽø;úÓaò4RÆ)5äé/SyW01bŒ‰®ôÒ=<žÚ ¢¡'ñf ßµ8…¶ˆê½W¶-±O,Ý"x‹õbšé‰oi©í'ç´°OªC—íèýR­Fþ{¤²~¶¡éáÄBßñ}zÒqEðÇ^d7,†;Nè„®©ÚÞ‰T»vêfsÙ¬³ßñÜÈI\yÌÕ‘ïtX§¬ŒqJí-߉œÈ£áÏqz7!Ø$MÓ’3Ðo}ᔃŸ%'äp»Äü?ýì?s2Ž½é›^À 13…@î?aÝ~'=åý¿xÇðBendstream endobj -1636 0 obj << +1665 0 obj << /Type /Page -/Contents 1637 0 R -/Resources 1635 0 R +/Contents 1666 0 R +/Resources 1664 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R -/Annots [ 1641 0 R 1642 0 R ] +/Parent 1652 0 R +/Annots [ 1670 0 R 1671 0 R ] >> endobj -1641 0 obj << +1670 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [253.7995 146.8976 417.685 158.9572] +/Rect [253.7995 149.3637 417.685 161.4234] /Subtype/Link/A<> >> endobj -1642 0 obj << +1671 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [63.4454 108.9117 208.8999 119.0735] +/Rect [63.4454 110.455 208.8999 120.6168] /Subtype/Link/A<> >> endobj -1638 0 obj << -/D [1636 0 R /XYZ 56.6929 794.5015 null] ->> endobj -614 0 obj << -/D [1636 0 R /XYZ 56.6929 652.1213 null] ->> endobj -1639 0 obj << -/D [1636 0 R /XYZ 56.6929 614.8935 null] ->> endobj -618 0 obj << -/D [1636 0 R /XYZ 56.6929 614.8935 null] ->> endobj -1127 0 obj << -/D [1636 0 R /XYZ 56.6929 584.5024 null] +1667 0 obj << +/D [1665 0 R /XYZ 56.6929 794.5015 null] >> endobj 622 0 obj << -/D [1636 0 R /XYZ 56.6929 289.5256 null] +/D [1665 0 R /XYZ 56.6929 662.0717 null] >> endobj -1640 0 obj << -/D [1636 0 R /XYZ 56.6929 251.3901 null] +1668 0 obj << +/D [1665 0 R /XYZ 56.6929 624.1661 null] >> endobj 626 0 obj << -/D [1636 0 R /XYZ 56.6929 251.3901 null] +/D [1665 0 R /XYZ 56.6929 624.1661 null] >> endobj -955 0 obj << -/D [1636 0 R /XYZ 56.6929 222.7156 null] +1137 0 obj << +/D [1665 0 R /XYZ 56.6929 593.0972 null] >> endobj -1643 0 obj << -/D [1636 0 R /XYZ 56.6929 53.7852 null] +630 0 obj << +/D [1665 0 R /XYZ 56.6929 294.2701 null] >> endobj -1644 0 obj << -/D [1636 0 R /XYZ 56.6929 53.7852 null] +1669 0 obj << +/D [1665 0 R /XYZ 56.6929 255.4568 null] >> endobj -1635 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F39 885 0 R /F53 1017 0 R /F11 1367 0 R /F41 925 0 R >> +634 0 obj << +/D [1665 0 R /XYZ 56.6929 255.4568 null] +>> endobj +965 0 obj << +/D [1665 0 R /XYZ 56.6929 226.1045 null] +>> endobj +1672 0 obj << +/D [1665 0 R /XYZ 56.6929 53.5688 null] +>> endobj +1673 0 obj << +/D [1665 0 R /XYZ 56.6929 53.5688 null] +>> endobj +1664 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F39 895 0 R /F53 1027 0 R /F11 1384 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1647 0 obj << -/Length 2824 +1676 0 obj << +/Length 2825 /Filter /FlateDecode >> stream @@ -7350,374 +7465,381 @@ xÚµZ]{ ´ ¸ ¤ƒùÈ ’Tï*ÓªA<—Ǻ·ÃÐû"Âa‡˜%(ŒÏ´’–Û µ9Te>#ôá¶6Ø6Ay2¾b$´ÌHÜ)³|Þ‰zA 4lY3ª#Óò`ï§6c¿ŒI0‚¶Æ¾[g;µú,{Ù•oúùFÿÍ+”Ÿë¯’ù Ø.…‚1¦‘•ß‹WñÈÌvìï&}•/\ u˜sê 8˜$Ðk“3©-å¡ZKY\{h½ÐÙ}lÛ6ø´Üïå®+Ö›­ßÁä\²Z*)#ý&ÇÍ:±¦‚ñwù·á£s£˜cû‰†Íçƒb‘÷Ç}ªO]žkÓçÁj%¬¼SƒS5ø´‰3zÝÏÞs–äWœ¹Ïw;sâû}&ÁDÂ(ò[„%ä6-Ô~P‘xN|¸­9ô‡­ÁF^d‡\•<ÛkÒlIdu¾ª2!³ðôtÖÅ:Úsq\û½I$Ø‚?Sÿ[Bn…k¡6ãû>ûòᶠ-ï+ÜF6Þuþ}^=gÛô5Õ Œ@õµ®­Ñ LKç„ }RÛˆÈBFo_#y5Y«YÈ°ƒŽAóañEXûDó*å!¯¶yJIŒ/…—(™»¼Øg¹vB½fgÉ>ÜprªÅ'¸ª LnÿË_úZ;‡1¢Iâ8L£A„ÂcýRâWpÞsóIðé«ÿ+Ab«endstream +ï+ÜF6Þuþ}^=gÛô5Õ Œ@õµ®­Ñ LKç„ }RÛˆÈBFo_#y5Y«YÈ°ƒŽAóañEXûDó*å!¯¶yJIŒ/…—(™»¼Øg¹vB½fgÉ>ÜprªÅ'¸ª LnÿË_úZ;‡1¢Iâ8L£Ð|Rʱ~)ñ+ppò!²ù&øôÝÿ ‡ÿb¿endstream endobj -1646 0 obj << -/Type /Page -/Contents 1647 0 R -/Resources 1645 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R ->> endobj -1648 0 obj << -/D [1646 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1649 0 obj << -/D [1646 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1650 0 obj << -/D [1646 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1651 0 obj << -/D [1646 0 R /XYZ 85.0394 752.3015 null] ->> endobj -1652 0 obj << -/D [1646 0 R /XYZ 85.0394 746.3107 null] ->> endobj -1653 0 obj << -/D [1646 0 R /XYZ 85.0394 731.5461 null] ->> endobj -1654 0 obj << -/D [1646 0 R /XYZ 85.0394 728.1497 null] ->> endobj -1655 0 obj << -/D [1646 0 R /XYZ 85.0394 713.3851 null] ->> endobj -1656 0 obj << -/D [1646 0 R /XYZ 85.0394 709.9887 null] ->> endobj -1657 0 obj << -/D [1646 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1071 0 obj << -/D [1646 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1658 0 obj << -/D [1646 0 R /XYZ 85.0394 651.9592 null] ->> endobj -1659 0 obj << -/D [1646 0 R /XYZ 85.0394 648.8377 null] ->> endobj -1660 0 obj << -/D [1646 0 R /XYZ 85.0394 634.0731 null] ->> endobj -1661 0 obj << -/D [1646 0 R /XYZ 85.0394 630.6767 null] ->> endobj -1662 0 obj << -/D [1646 0 R /XYZ 85.0394 615.9121 null] ->> endobj -1663 0 obj << -/D [1646 0 R /XYZ 85.0394 612.5156 null] ->> endobj -1664 0 obj << -/D [1646 0 R /XYZ 85.0394 585.7959 null] ->> endobj -1665 0 obj << -/D [1646 0 R /XYZ 85.0394 582.3994 null] ->> endobj -1666 0 obj << -/D [1646 0 R /XYZ 85.0394 567.6349 null] ->> endobj -1667 0 obj << -/D [1646 0 R /XYZ 85.0394 564.2384 null] ->> endobj -1668 0 obj << -/D [1646 0 R /XYZ 85.0394 549.5337 null] ->> endobj -1669 0 obj << -/D [1646 0 R /XYZ 85.0394 546.0774 null] ->> endobj -1670 0 obj << -/D [1646 0 R /XYZ 85.0394 531.3128 null] ->> endobj -1671 0 obj << -/D [1646 0 R /XYZ 85.0394 527.9163 null] ->> endobj -1672 0 obj << -/D [1646 0 R /XYZ 85.0394 513.1518 null] ->> endobj -1673 0 obj << -/D [1646 0 R /XYZ 85.0394 509.7553 null] ->> endobj -1674 0 obj << -/D [1646 0 R /XYZ 85.0394 483.0356 null] ->> endobj 1675 0 obj << -/D [1646 0 R /XYZ 85.0394 479.6391 null] ->> endobj -1676 0 obj << -/D [1646 0 R /XYZ 85.0394 464.8745 null] +/Type /Page +/Contents 1676 0 R +/Resources 1674 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1652 0 R >> endobj 1677 0 obj << -/D [1646 0 R /XYZ 85.0394 461.4781 null] +/D [1675 0 R /XYZ 85.0394 794.5015 null] >> endobj 1678 0 obj << -/D [1646 0 R /XYZ 85.0394 446.7135 null] +/D [1675 0 R /XYZ 85.0394 752.3015 null] >> endobj 1679 0 obj << -/D [1646 0 R /XYZ 85.0394 443.3171 null] +/D [1675 0 R /XYZ 85.0394 752.3015 null] >> endobj 1680 0 obj << -/D [1646 0 R /XYZ 85.0394 428.5525 null] +/D [1675 0 R /XYZ 85.0394 752.3015 null] >> endobj 1681 0 obj << -/D [1646 0 R /XYZ 85.0394 425.156 null] +/D [1675 0 R /XYZ 85.0394 746.3107 null] >> endobj 1682 0 obj << -/D [1646 0 R /XYZ 85.0394 355.0758 null] +/D [1675 0 R /XYZ 85.0394 731.5461 null] >> endobj 1683 0 obj << -/D [1646 0 R /XYZ 85.0394 355.0758 null] +/D [1675 0 R /XYZ 85.0394 728.1497 null] >> endobj 1684 0 obj << -/D [1646 0 R /XYZ 85.0394 355.0758 null] +/D [1675 0 R /XYZ 85.0394 713.3851 null] >> endobj 1685 0 obj << -/D [1646 0 R /XYZ 85.0394 352.0499 null] +/D [1675 0 R /XYZ 85.0394 709.9887 null] >> endobj 1686 0 obj << -/D [1646 0 R /XYZ 85.0394 337.3452 null] +/D [1675 0 R /XYZ 85.0394 651.9592 null] +>> endobj +1081 0 obj << +/D [1675 0 R /XYZ 85.0394 651.9592 null] >> endobj 1687 0 obj << -/D [1646 0 R /XYZ 85.0394 333.8889 null] +/D [1675 0 R /XYZ 85.0394 651.9592 null] >> endobj 1688 0 obj << -/D [1646 0 R /XYZ 85.0394 309.8192 null] +/D [1675 0 R /XYZ 85.0394 648.8377 null] >> endobj 1689 0 obj << -/D [1646 0 R /XYZ 85.0394 303.7727 null] +/D [1675 0 R /XYZ 85.0394 634.0731 null] >> endobj 1690 0 obj << -/D [1646 0 R /XYZ 85.0394 278.3282 null] +/D [1675 0 R /XYZ 85.0394 630.6767 null] >> endobj 1691 0 obj << -/D [1646 0 R /XYZ 85.0394 273.6565 null] +/D [1675 0 R /XYZ 85.0394 615.9121 null] >> endobj 1692 0 obj << -/D [1646 0 R /XYZ 85.0394 246.9367 null] +/D [1675 0 R /XYZ 85.0394 612.5156 null] >> endobj 1693 0 obj << -/D [1646 0 R /XYZ 85.0394 243.5403 null] +/D [1675 0 R /XYZ 85.0394 585.7959 null] >> endobj 1694 0 obj << -/D [1646 0 R /XYZ 85.0394 173.5556 null] +/D [1675 0 R /XYZ 85.0394 582.3994 null] >> endobj 1695 0 obj << -/D [1646 0 R /XYZ 85.0394 173.5556 null] +/D [1675 0 R /XYZ 85.0394 567.6349 null] >> endobj 1696 0 obj << -/D [1646 0 R /XYZ 85.0394 173.5556 null] +/D [1675 0 R /XYZ 85.0394 564.2384 null] >> endobj 1697 0 obj << -/D [1646 0 R /XYZ 85.0394 170.4341 null] +/D [1675 0 R /XYZ 85.0394 549.5337 null] >> endobj 1698 0 obj << -/D [1646 0 R /XYZ 85.0394 144.9896 null] +/D [1675 0 R /XYZ 85.0394 546.0774 null] >> endobj 1699 0 obj << -/D [1646 0 R /XYZ 85.0394 140.3179 null] +/D [1675 0 R /XYZ 85.0394 531.3128 null] >> endobj 1700 0 obj << -/D [1646 0 R /XYZ 85.0394 113.5982 null] +/D [1675 0 R /XYZ 85.0394 527.9163 null] >> endobj 1701 0 obj << -/D [1646 0 R /XYZ 85.0394 110.2017 null] +/D [1675 0 R /XYZ 85.0394 513.1518 null] >> endobj 1702 0 obj << -/D [1646 0 R /XYZ 85.0394 95.4372 null] +/D [1675 0 R /XYZ 85.0394 509.7553 null] >> endobj 1703 0 obj << -/D [1646 0 R /XYZ 85.0394 92.0407 null] +/D [1675 0 R /XYZ 85.0394 483.0356 null] >> endobj -1645 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +1704 0 obj << +/D [1675 0 R /XYZ 85.0394 479.6391 null] +>> endobj +1705 0 obj << +/D [1675 0 R /XYZ 85.0394 464.8745 null] >> endobj 1706 0 obj << +/D [1675 0 R /XYZ 85.0394 461.4781 null] +>> endobj +1707 0 obj << +/D [1675 0 R /XYZ 85.0394 446.7135 null] +>> endobj +1708 0 obj << +/D [1675 0 R /XYZ 85.0394 443.3171 null] +>> endobj +1709 0 obj << +/D [1675 0 R /XYZ 85.0394 428.5525 null] +>> endobj +1710 0 obj << +/D [1675 0 R /XYZ 85.0394 425.156 null] +>> endobj +1711 0 obj << +/D [1675 0 R /XYZ 85.0394 355.0758 null] +>> endobj +1712 0 obj << +/D [1675 0 R /XYZ 85.0394 355.0758 null] +>> endobj +1713 0 obj << +/D [1675 0 R /XYZ 85.0394 355.0758 null] +>> endobj +1714 0 obj << +/D [1675 0 R /XYZ 85.0394 352.0499 null] +>> endobj +1715 0 obj << +/D [1675 0 R /XYZ 85.0394 337.3452 null] +>> endobj +1716 0 obj << +/D [1675 0 R /XYZ 85.0394 333.8889 null] +>> endobj +1717 0 obj << +/D [1675 0 R /XYZ 85.0394 309.8192 null] +>> endobj +1718 0 obj << +/D [1675 0 R /XYZ 85.0394 303.7727 null] +>> endobj +1719 0 obj << +/D [1675 0 R /XYZ 85.0394 278.3282 null] +>> endobj +1720 0 obj << +/D [1675 0 R /XYZ 85.0394 273.6565 null] +>> endobj +1721 0 obj << +/D [1675 0 R /XYZ 85.0394 246.9367 null] +>> endobj +1722 0 obj << +/D [1675 0 R /XYZ 85.0394 243.5403 null] +>> endobj +1723 0 obj << +/D [1675 0 R /XYZ 85.0394 173.5556 null] +>> endobj +1724 0 obj << +/D [1675 0 R /XYZ 85.0394 173.5556 null] +>> endobj +1725 0 obj << +/D [1675 0 R /XYZ 85.0394 173.5556 null] +>> endobj +1726 0 obj << +/D [1675 0 R /XYZ 85.0394 170.4341 null] +>> endobj +1727 0 obj << +/D [1675 0 R /XYZ 85.0394 144.9896 null] +>> endobj +1728 0 obj << +/D [1675 0 R /XYZ 85.0394 140.3179 null] +>> endobj +1729 0 obj << +/D [1675 0 R /XYZ 85.0394 113.5982 null] +>> endobj +1730 0 obj << +/D [1675 0 R /XYZ 85.0394 110.2017 null] +>> endobj +1731 0 obj << +/D [1675 0 R /XYZ 85.0394 95.4372 null] +>> endobj +1732 0 obj << +/D [1675 0 R /XYZ 85.0394 92.0407 null] +>> endobj +1674 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1735 0 obj << /Length 2889 /Filter /FlateDecode >> stream -xÚµšKsÛ8Çïþ:JU1>´¥ØJlÅ+ÙÙ™Êä@KtÌ2E:"•Äß~ă E‚™ÝÚòÁÐÄ_ÂÝ@7I&þÈÄõÒpâ‡r1q'Ûýž|ƒ¾«3"mΕѹiuqöÇ{æOBzÔ›Ü?c™Üï¾L#ÄÐ FÀÓ‹åÅÍòÓÕ:º»þkvN]<ý»8ZÍŇÍÃÕÕbs¿׋h¾\] ™û^ˆ§ÑÝÝb5_þ)ú#>*Ö­—‹Íìëý‡³Å½þÚæO#˜ñïüýìËW<ÙÁ/üp† wò>`DÂNögŽËë0¦Z²³ÍÙ¿ô€Fo}kïTŒ(óhÏ\Q2!…®K[“å†Èc”Õ“µNÊâxØ&r -’mq؉ëûÌÀÛkRþJFï;@ÃJ|)ÖPYñïôeýþ’€}í*Ja:\ß.­­NµYhhê#—úmíUò~>aÓùj#.ÖkÙü1ÍÓ*-òzN:?…`¦•yð%ø@ïà.Š§—èý,¤S$ÆXüH3LŸãCUéìŠêÿtzïã—¢”½kÙûeû8Ïå q¾Íw3BC5øm±}‰_“êÂÝðý`&ÔW:Ë@øǧmU<Â÷¨)âÃhˆ°†(ðœ¦Õ0am¥ ûØ&l•nŸh÷ni °ðÓW›èN-{îLÛz1ƒ¶ú¡ì/ø Òü›ø 0ñÑdïe‘%YË{ºœa>è3âp0¬,”•æø66iƒCW»Ÿƒ©ñµìOo“Ü .½éSqm‹_¯5¤,ÅdBçM±¹ë ‹eÆ{ÝàMSÙQ='âb^ìãTv®â½lݼ•U²ïÁÊ0A.¢ VFÀ{å`ñ´”mÏAÇç™ëNÓ_i"=Ns®/Œv?ó)z×YK¹*æéö%ÍË"—âüÞôºð†×…ÛžÃÆüÓ°²¬ e¥ÖÅ.µ¬ ›´±.ºÚýëÂÔ†uÁˆ+Ü”§Ž¿¼¡^übóšlÓ§·zeðÏ5rnÙ,Þ\ÊüéCžrP¢±³ÍBËr—äUÊÏUÉ¡MGò™ŠåЦc9Ó±œYc9C~à23–‡bæƒÅyšdb‹¡ñ©ø-om¡†=*Ëàk)ÖÇ<Ñ ýaÐ.EÌÙhÃÊZYiДa h›´º«ÝÚÔþ˜È5¾øµ}Žóor"æI–|SÛq'‘Û:\žÜzµé;Y.$2¬}°RG§¨jí‘ݳ“…£Èq¼1 -†•…‚²Ò`¯·P°IºÚýLíù&?ýã⯲s¬Ø,¯dSšwç]ù?ý -?â7?Òù1Щsàží’9(ô½6¡¹$´ˆË*‹_ÙÌjGß½Sçbá÷ÏšX8LŒÀÌ6 + 1eeó-ÄlÒ±®v?1S{½‰þ¸»°³øŠó‰,ú. çøÀ ǨVªÊª¡êXÎ1ViƒjW»Ÿª©=Oªxûœìþ›QdïF¢Ì.cŽûÞ*¤‘!ñFИVÃh´•Fã–€UºAs¢Ý‹¦¥]m|U§ Dä92˜–F€wH'óyJ¦Ï ÊWýi) ¢U‚]›5¯Ì|ò9ÇG$ð&D_ja £:Д„\£$t# eªb­°•]<?f„µHÞ'‡Y0m²IŠñp‰–y.Â4 #+À°²¬e¥W@H\Ë -°I+ «Ý¿Lí{Ôqî‹5eÇaÓèX=ö[½‰®»"ååÑÇ¡®¢»ûµðOÞ_3æ}í¬“wÉä¤?Èz®Óð†hÁSÃú.•®‘Wä‘ÊïlEÕMò -ñC§)vŽ ¶á‘#occa(lAFˆ%¼ZD ~mÕ~z*?èn®£s"`Èl„Ê£.¥”[ˆ™¼À•(ÔU½¥Fõ–èê-i2\l—ðÀŒ˜cˆˆ¿´uæåE\#þò‚tü&™ª1ZP"¦}Ô Ç‘…£4j@RKÝΦkì÷£4„£&]ÉøZ?¤üÑ`'¿¿IËJ¦ž"öâv1Ž7܉üðô+)‡²w7JcðìLÚ[ªz!¯*¶Ï'5+0ˆ8ˆ‘ÐÌ0¦Œ407´”lº °®p/0SXÔP8þª’¼¬ŸTÂŒEMþ—Ç××âP £åhü‘JQ6‡F¯¯2ㄽÐØêN7HÜqÿ\ìE¾À[/eëõ1_eëg]0‡®ešÇy%»D - ͪ§ÕÚÁ´8¦e™öÕ€0&Ì‹· !6¬,Œ••ÙRM°J”»Úý˜Mík˜´L?gTÎö¿äÅϼë´7ß“.×rí²·üC㇌¤ó]Ë*~*›ÌñtûcêL뽈KV0£ü LHû9­®lé:–~p0ÀòYÈqðH6­†™k«æÍL†™[¥æ'Ú½Ì[Úz>ù¶ØÀ_%ÕÏâðÒä0ݺà'˜¾Ão@Æ¢Ø ,aö³ù¡õÖX¯‡4SÉK0œ¼7D«˜VJʪ¡dÛ/­Ò¥®v?%S{|?¦bÛ'¹ÚõÙ<ò⟮ ½až«¹{ÍÒ­QHoʺ2r÷¹¥É“Ó)œ_â]2P.·Aaðcg¤^gZY (+ Å m®c“6 tµû¡˜Úãéý¦:·•“Igæg=[cè"ÏgN{ò?Hç¸À“þϯíUq± 8¼P2ڮ嗪+ñŸ|uõ‚ïéwÿ–¡OYendstream +xÚµšMsÛ8†ïþ:JU1†øy¤-ÅVb+^ÉÎÎT&Z‚c–)Ò©$þ÷Û >R$˜Ù­-LM¼tÝ$ž8ð‡'žüˆD“ r‘ç`o²ÝŸ9“oÐwu†¥Í¹2:7­.îÏþxOƒI„"Ÿø“û'c¬9aˆ'÷»/ÓQ4ƒœéÅòâfùéjß]ÿ5;'ž3ýÛñœx56WW‹ÍýB~\/âùru&xvø‘3ïî«ùòOÑóQÝz¹Ø̾Þ8[Üë¯mþ4ìPþ¿Ÿ}ùêLvð ?œ9ˆF¡7ù „£ˆLög®G‘çRªZ²³ÍÙ¿ô€Fo}kïTaê“ž¹"x‚1Š<´&Ë‹O ­'kÍÊâxØ29l[vâú~3ðöÊÊÁ_I1 +<ahX‰/Eû*+þ¾¬ß_bÒ¯]eLL‡Ø¥µÕ©6 mLä‘ ­½b?áçc:¯6âb½– ìoÇ!yZ¥E^ÏIç§`Ç…i¥>| >Ð;¸‹8ÓKô~‘)c,~°Ã ‡ÓçäPÕxz#»âú?™Þ&ûä¥(eïZö>dÙ>És9h’ïDóÝ “H ~[l_’WVR¸¾Ì„úJçbÿø´­ŠGø5eXt"ìG +}w„°i5LX[iÂã¶J7„O´{ ·´Xøé«M|§–=w¦í½˜A;ˆ‚ÈÀ öHü¿HiþM|˜øh²÷²ÈX–%òž.w˜Cú# + e¥9„ƒMÚàÐÕîç`jÇ|-Ó[–€;Á¥?}*¢mñ뵦ÁÊRL&tÞÛ„»ž°Xæ`¼× þ4•Õ3óbŸ¤²s•ìeë歬ؾ+u0òxm°R Þ+K~¤¥lk|:>ÏX’§,CˆX ·HÅoyk 5ìQY_K±>æLƒ†A{Ñ ¢#  + he¥AêX@Û¤ Ð]í~ЦöG&×øâ×ö9ɿɉ˜³Œ}SÛq'‘Û:\žÜzµé;Y…$2´}°RG§¸jí‘ݳ“…%Èuý1 +†•…‚²Ò`¯·P°IºÚýLíù&?ýã⯲s¬Ø,¯dSšwç]ù?ý +?â7?Òù1Щsàží’º( +ü6¡¹$´HÊ*K^˜l¦µ£ïÞ©s±ðûgM,&†af0 †•…˜²2ˆb6iƒXW»Ÿ˜©½ÞÄÜÎ=ØYEXž(E_q@ü¿Ø&ÁFQã‚Z}ƒ¤Æ¯G¨ù +\'4v¹@`ã£Ø\ÇÄÆ?5ØÄaFÔÊ'­0ÝÐA>Lº¦i5 S[0-»Uºy¢Ý ³¥½©ŠC½KáˆN/ÙAlapød%osk†¼¯fÈCÞ(ò+Å[Œ0$aH;†ü~Îßkºžã)†Â¦^aüâ“4¾:îöG8ÔÊùŴ‰´ÿÄs]8Ç4 #° + leeÀŽ,°mÒì®v?lS›ÃNÄ>ŠsÁÙô©>µœ_³º2#zas,E*[dè ÐéС7[‹8K¡7”¡7jñ÷[¡×Ç'>,ú. çøÐƨVªÊª¡êZÎ1ViƒjW»Ÿª©=gU²}f»ÿfcÙ»QèÁ³K©ëýŸ·J +id„ý4¦Õ0m¥Ñ¡¥`•nÐœh÷¢ii×G›@ÕéBQ€…yŽ §¥QàÒÉž’é3¨òÕ`ZÊ€h• E×fÍ+3Ÿ‡|Î ¼ 1…ZȨ4%!Ï( ÝHÃE™ªX«leÅÆX-’÷ìñ0 §M6Ig¸DK}9$Ä#+À°²¬e¥W@„=Ë +°I+ «Ý¿Lí{Ôu]î‹5e×¥ÓøX=ö[½‰®»"ååÑÇ¡®â»ûµðOÞ_3æ}í¬“wÉä¤?ÈúžÛð†hÁSÃú.•®‘Wä‘ÊïlEÕ {…ø¡Ó;G +ÛðÈ‘·±±06Š ÅØ^-¢¿¶j?½F•t7×ñ90d6BäQ—Â-D‹L^àJj±ªÞ£z‹uõ7®G¶Ëx8›c°ˆ¿¤uæåE\#þò‚tò&™ª1ZP"¦}Ä Ç‘…£4j@KÝΦkì÷£4„ã&]ÉøZ?$üÑ`'¿¿IËJ¦ž"ö:íbo¸ùáé+‡²w7Jcðì··T#ôB^UlŸOj4V`qÅ‘˜a4 Li`^d) Øt`]á^`¦°¨¡†p"üU±¼¬ŸTÂ숚*ü/¯¯Å¡FË;ÑøƒJQ6‡F¿¯2`äø‘±ºÄ›n¸ãþ¹Ø‹|·^ÊÖëc +¾šÈÖϺ`]Ë4OòJv‰šU N«µƒiqLË2í«ÿa:L˜o©3†Ø°²0VVdK5Á*mPîj÷c6µ¯aÒ2ýœQ9ÛCþ’?ó®Ó<Ül|Oº\˵ËÞòFnu<0–Îwu,«ä©l2ÇÓíªg0­÷ .XÁ”ðƒ< +ŒÛÏiueK×±ôƒƒæÏBŽãŒÄaÓj˜¹¶jÞLpð0s«tÃüD»—yK[ÏÇ"ß»ø+Vý,/MÓ­ ~‚é;üd'DÄñCK˜ýl~h½u Äë!ÍTò'/Ø‹PˆÇª¦•…’²j(ÙöK«´A©«ÝOÉÔ^³ïÇTìq{–«íPo‘Í#/þéºÐ湚»×,Ý…ô¦¬+#wŸ[<¹ÂùÅ!Ù±r¹ +…º#õ:ÓÊEYi(^ds›´¥«ÝÅÔOï7ÕḭD˜d™7žmôl‘‡ü€ºíÉÿ ãóa ±~ãcðÆÓÊ‚AYé´ŽbË®e•60tµû1˜Ú—YR–™> +.Wçñ|¾FñZD—øw¦~TЙìkUUIw9SAèJ6î$Í«z꾅щlÍ£ü~dÃÏu1dwGÛ›VdÊJ# ‰å4i•6uµû‘™ÚËøBm¼DÁ¶Ï9„§L½Î´ç1NîC݇MyúýȺ‡ лéz~ÐÛ–±DÇÊŽ§^I§‚ö;•“~f8ö–…a4LK5eb©TÛtV]á^T¦°Žqn¨bœñ7ƒ´ºsnÔ©b‚å2^Åâêr…tÇÉÐû¼¤é“ÖÓ?±N©áv3¥†f#¥æÒè¢.lå¹x òüßµ·eYšìÕ‹Z¤uö×ÎÚyÍnð i©³xˆ¿OÛ3ùŽ>“þϯíUñÑ08¼2ڮ嗪+ñ9ùêêßÓïþ–ùO[endstream endobj -1705 0 obj << -/Type /Page -/Contents 1706 0 R -/Resources 1704 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R ->> endobj -1707 0 obj << -/D [1705 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1708 0 obj << -/D [1705 0 R /XYZ 56.6929 748.5056 null] ->> endobj -1709 0 obj << -/D [1705 0 R /XYZ 56.6929 748.5056 null] ->> endobj -1710 0 obj << -/D [1705 0 R /XYZ 56.6929 748.5056 null] ->> endobj -1711 0 obj << -/D [1705 0 R /XYZ 56.6929 743.7078 null] ->> endobj -1712 0 obj << -/D [1705 0 R /XYZ 56.6929 719.6381 null] ->> endobj -1713 0 obj << -/D [1705 0 R /XYZ 56.6929 711.8197 null] ->> endobj -1714 0 obj << -/D [1705 0 R /XYZ 56.6929 697.0552 null] ->> endobj -1715 0 obj << -/D [1705 0 R /XYZ 56.6929 691.8868 null] ->> endobj -1716 0 obj << -/D [1705 0 R /XYZ 56.6929 665.1671 null] ->> endobj -1717 0 obj << -/D [1705 0 R /XYZ 56.6929 659.9987 null] ->> endobj -1718 0 obj << -/D [1705 0 R /XYZ 56.6929 635.929 null] ->> endobj -1719 0 obj << -/D [1705 0 R /XYZ 56.6929 628.1106 null] ->> endobj -1720 0 obj << -/D [1705 0 R /XYZ 56.6929 601.3909 null] ->> endobj -1721 0 obj << -/D [1705 0 R /XYZ 56.6929 596.2225 null] ->> endobj -1722 0 obj << -/D [1705 0 R /XYZ 56.6929 569.5028 null] ->> endobj -1723 0 obj << -/D [1705 0 R /XYZ 56.6929 564.3344 null] ->> endobj -1724 0 obj << -/D [1705 0 R /XYZ 56.6929 549.6297 null] ->> endobj -1725 0 obj << -/D [1705 0 R /XYZ 56.6929 544.4015 null] ->> endobj -1726 0 obj << -/D [1705 0 R /XYZ 56.6929 529.6968 null] ->> endobj -1727 0 obj << -/D [1705 0 R /XYZ 56.6929 524.4686 null] ->> endobj -1728 0 obj << -/D [1705 0 R /XYZ 56.6929 500.3989 null] ->> endobj -1729 0 obj << -/D [1705 0 R /XYZ 56.6929 492.5805 null] ->> endobj -1730 0 obj << -/D [1705 0 R /XYZ 56.6929 467.136 null] ->> endobj -1731 0 obj << -/D [1705 0 R /XYZ 56.6929 460.6924 null] ->> endobj -1732 0 obj << -/D [1705 0 R /XYZ 56.6929 436.6227 null] ->> endobj -1733 0 obj << -/D [1705 0 R /XYZ 56.6929 428.8043 null] ->> endobj 1734 0 obj << -/D [1705 0 R /XYZ 56.6929 414.0996 null] ->> endobj -1735 0 obj << -/D [1705 0 R /XYZ 56.6929 408.8714 null] +/Type /Page +/Contents 1735 0 R +/Resources 1733 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1652 0 R >> endobj 1736 0 obj << -/D [1705 0 R /XYZ 56.6929 382.1516 null] +/D [1734 0 R /XYZ 56.6929 794.5015 null] >> endobj 1737 0 obj << -/D [1705 0 R /XYZ 56.6929 376.9833 null] +/D [1734 0 R /XYZ 56.6929 748.5056 null] >> endobj 1738 0 obj << -/D [1705 0 R /XYZ 56.6929 350.2636 null] +/D [1734 0 R /XYZ 56.6929 748.5056 null] >> endobj 1739 0 obj << -/D [1705 0 R /XYZ 56.6929 345.0952 null] +/D [1734 0 R /XYZ 56.6929 748.5056 null] >> endobj 1740 0 obj << -/D [1705 0 R /XYZ 56.6929 321.0255 null] +/D [1734 0 R /XYZ 56.6929 743.7078 null] >> endobj 1741 0 obj << -/D [1705 0 R /XYZ 56.6929 313.2071 null] +/D [1734 0 R /XYZ 56.6929 719.6381 null] >> endobj 1742 0 obj << -/D [1705 0 R /XYZ 56.6929 298.5024 null] +/D [1734 0 R /XYZ 56.6929 711.8197 null] >> endobj 1743 0 obj << -/D [1705 0 R /XYZ 56.6929 293.2742 null] +/D [1734 0 R /XYZ 56.6929 697.0552 null] >> endobj 1744 0 obj << -/D [1705 0 R /XYZ 56.6929 267.8297 null] +/D [1734 0 R /XYZ 56.6929 691.8868 null] >> endobj 1745 0 obj << -/D [1705 0 R /XYZ 56.6929 261.3861 null] +/D [1734 0 R /XYZ 56.6929 665.1671 null] >> endobj 1746 0 obj << -/D [1705 0 R /XYZ 56.6929 199.468 null] +/D [1734 0 R /XYZ 56.6929 659.9987 null] >> endobj 1747 0 obj << -/D [1705 0 R /XYZ 56.6929 199.468 null] +/D [1734 0 R /XYZ 56.6929 635.929 null] >> endobj 1748 0 obj << -/D [1705 0 R /XYZ 56.6929 199.468 null] +/D [1734 0 R /XYZ 56.6929 628.1106 null] >> endobj 1749 0 obj << -/D [1705 0 R /XYZ 56.6929 191.7053 null] +/D [1734 0 R /XYZ 56.6929 601.3909 null] >> endobj 1750 0 obj << -/D [1705 0 R /XYZ 56.6929 176.9408 null] +/D [1734 0 R /XYZ 56.6929 596.2225 null] >> endobj 1751 0 obj << -/D [1705 0 R /XYZ 56.6929 171.7724 null] +/D [1734 0 R /XYZ 56.6929 569.5028 null] >> endobj 1752 0 obj << -/D [1705 0 R /XYZ 56.6929 157.0677 null] +/D [1734 0 R /XYZ 56.6929 564.3344 null] >> endobj 1753 0 obj << -/D [1705 0 R /XYZ 56.6929 151.8395 null] +/D [1734 0 R /XYZ 56.6929 549.6297 null] >> endobj 1754 0 obj << -/D [1705 0 R /XYZ 56.6929 137.1348 null] +/D [1734 0 R /XYZ 56.6929 544.4015 null] >> endobj 1755 0 obj << -/D [1705 0 R /XYZ 56.6929 131.9066 null] +/D [1734 0 R /XYZ 56.6929 529.6968 null] >> endobj 1756 0 obj << -/D [1705 0 R /XYZ 56.6929 117.2018 null] +/D [1734 0 R /XYZ 56.6929 524.4686 null] >> endobj 1757 0 obj << -/D [1705 0 R /XYZ 56.6929 111.9736 null] +/D [1734 0 R /XYZ 56.6929 500.3989 null] >> endobj 1758 0 obj << -/D [1705 0 R /XYZ 56.6929 97.2091 null] +/D [1734 0 R /XYZ 56.6929 492.5805 null] >> endobj 1759 0 obj << -/D [1705 0 R /XYZ 56.6929 92.0407 null] +/D [1734 0 R /XYZ 56.6929 467.136 null] >> endobj -1704 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +1760 0 obj << +/D [1734 0 R /XYZ 56.6929 460.6924 null] +>> endobj +1761 0 obj << +/D [1734 0 R /XYZ 56.6929 436.6227 null] >> endobj 1762 0 obj << +/D [1734 0 R /XYZ 56.6929 428.8043 null] +>> endobj +1763 0 obj << +/D [1734 0 R /XYZ 56.6929 414.0996 null] +>> endobj +1764 0 obj << +/D [1734 0 R /XYZ 56.6929 408.8714 null] +>> endobj +1765 0 obj << +/D [1734 0 R /XYZ 56.6929 382.1516 null] +>> endobj +1766 0 obj << +/D [1734 0 R /XYZ 56.6929 376.9833 null] +>> endobj +1767 0 obj << +/D [1734 0 R /XYZ 56.6929 350.2636 null] +>> endobj +1768 0 obj << +/D [1734 0 R /XYZ 56.6929 345.0952 null] +>> endobj +1769 0 obj << +/D [1734 0 R /XYZ 56.6929 321.0255 null] +>> endobj +1770 0 obj << +/D [1734 0 R /XYZ 56.6929 313.2071 null] +>> endobj +1771 0 obj << +/D [1734 0 R /XYZ 56.6929 298.5024 null] +>> endobj +1772 0 obj << +/D [1734 0 R /XYZ 56.6929 293.2742 null] +>> endobj +1773 0 obj << +/D [1734 0 R /XYZ 56.6929 267.8297 null] +>> endobj +1774 0 obj << +/D [1734 0 R /XYZ 56.6929 261.3861 null] +>> endobj +1775 0 obj << +/D [1734 0 R /XYZ 56.6929 199.468 null] +>> endobj +1776 0 obj << +/D [1734 0 R /XYZ 56.6929 199.468 null] +>> endobj +1777 0 obj << +/D [1734 0 R /XYZ 56.6929 199.468 null] +>> endobj +1778 0 obj << +/D [1734 0 R /XYZ 56.6929 191.7053 null] +>> endobj +1779 0 obj << +/D [1734 0 R /XYZ 56.6929 176.9408 null] +>> endobj +1780 0 obj << +/D [1734 0 R /XYZ 56.6929 171.7724 null] +>> endobj +1781 0 obj << +/D [1734 0 R /XYZ 56.6929 157.0677 null] +>> endobj +1782 0 obj << +/D [1734 0 R /XYZ 56.6929 151.8395 null] +>> endobj +1783 0 obj << +/D [1734 0 R /XYZ 56.6929 137.1348 null] +>> endobj +1784 0 obj << +/D [1734 0 R /XYZ 56.6929 131.9066 null] +>> endobj +1785 0 obj << +/D [1734 0 R /XYZ 56.6929 117.2018 null] +>> endobj +1786 0 obj << +/D [1734 0 R /XYZ 56.6929 111.9736 null] +>> endobj +1787 0 obj << +/D [1734 0 R /XYZ 56.6929 97.2091 null] +>> endobj +1788 0 obj << +/D [1734 0 R /XYZ 56.6929 92.0407 null] +>> endobj +1733 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1791 0 obj << /Length 2542 /Filter /FlateDecode >> @@ -7727,173 +7849,173 @@ xÚ¥Z[w ÇÄ¡V"l·Jäë‘¢š7&vᨒ׷„°FœEÄmÊm™E]â'B‰™`µ¸÷ÕHëÖ&&s-?¦! }™fðŠÊ S“}„Õ×iya] ½r°.…é$HÙ…kp>¶Pn ü@ÄHB;I ¡]Ktº8ól«ËGXáÝÄjù°P-Ã0MÀL(6ƒ‹º 'wiÞ@‰Úh¢¾ÀG°5Ø|=¤E»KžùóHž5Ì\‡€¶¨–ç¥fºÙ¾i¾íU…ôN‰!¸›RÆ•”A9vPî‚68b[H7Á9£ÂÅØ|šÒ„»>»i*°µÇ×€%Á /ŒxéÊÅÚØÏ÷Fâ(ßWæÃEtšDœ@Æ6}8@aÇ8¿Á¸¸WK8ßù¢W7é~§Åö5‚ð &ÐA]Ê榔p-eî(ƒÐágØã„÷ÀŸNÅm¹c<€Ó¨ó™^C‰U·„óó`Ê ‘gDDvXýZdüR±(’>¬Ž%PØ×q#êâ,«%7æ-y¨^ôB0WD¡õˈ…§JøŸrö³:û ¸ÊY'ˆŒ¨2”¨‚æËÓF @¨µ> ‡ÐÈ¿P˜R3RRº›‚ÐaF.hÃŒ†Ø32Á¿Ö­uˆ]Vçê(•:_ÝübU”¥ÜàÓ\ÄÞ¢zÉšªí‡Än¥ œ¼œKðˆ zløÓô´Eé˜éÛ EðÂñ…v”r¡¤4$pt‘Nhƒˆ!¶…\g„P×üPÔnppSŽiñ£Gkñž½y#$¾Äæt‡$dúÉWþ-gd¦vÕ×îÁw~áì”ù«¼@?½Ü„þ¯~ùÑEy¹Ns˜-b+Ÿ~D½(¼”.L);ŸZªã“:ŠG'tÇçö8Ÿ=ð…ž¾³¢‹Þ)—’UÁÀùTõÇg9µcºrÖ(£úÿ¬·é¶ÝM ¼ƒ ¼tBZ¤.éQäèá\¸)` 'òšA7FØÖ¨™-b¸"2ú]¨JÑŽ¼¡ Ý—àyõ`è×’5J%^ƒúû“¤¨sÆщ7àØN¡^€‚ ¥€)å JIi¦ 7;˜rAT ±-\™àKþåW²­›$œ.Nͨ¼ŒóÎÄ’ˆƒüH¹ùI4}çsñvõM42¼ùàç¼+KëFÞo·›u=êTt„) ºC(ù>Š»ïÚñ7ßµ„ž©«{ˆôíDB—-Ô…/{¦”ƒH%¥‰LËå\БCl ‘&¸®éVOÅxê¨Ò¢îŠ¼³/÷üÓjžlü›òž:Gkêå©Òžª”«­ÞëÊÙ6ìØ¥0Xfâ{1Oý™øãK]æ¬a4°´Ã1gˆýªó½ý^1ã+êyˆ±Ø&GÁXܶ`JÙmAK]”#):¡;[8÷…¸°?œÞvC8k£'ü¿gå¾JoहXùì(0Cß‹)MÌá(žÞxâ»T|dy.wÚ/&>tËÛ·Sþ“«)ÿ”³¬)˜þîH°äö–RšŽ]Ydd¥£ð{ó˜ÿ¡…×РînJ9(VRºî #G£ì„6(b[(6Á¯³B§­Ïé S=sv–iG{ -9±ôIŒ»©Òï¯bF²SÁà´?Õæ!±ò¡‘n !; J¨û$9úhnÇÁxœY8YŒ!à4¼ªÅœ7%ÿo6×°(£2ùP.ì÷ba¯¾ëÇÊ+à.kVœ¸¥7álE‘9ôˆAWܧ«»­Ì›òž[ݨϧÌøƧSþ3ŸŸxYAFméÿÿ ˘OF‰m3Ù…«‡j»#tö{1ýÓ­ógÿ/’#÷ðendstream +9±ôIŒ»©Òï¯bF²SÁà´?Õæ!±ò¡‘n !; J¨û$9úhnÇÁxœY8YŒ!à4¼ªÅœ7%ÿo6×°(£2ùP.ì÷ba¯¾ëÇÊ+à.kVœ¸¥7álE‘9ôˆAWܧ«»­Ì›òž[ݨϧÌøƧSþ3ŸŸxYAFméÿÿ ˘OF‰m3Ù…«‡j»#D†®ºuþìÿ’{÷òendstream endobj -1761 0 obj << -/Type /Page -/Contents 1762 0 R -/Resources 1760 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1634 0 R ->> endobj -1763 0 obj << -/D [1761 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1764 0 obj << -/D [1761 0 R /XYZ 85.0394 748.4854 null] ->> endobj -1765 0 obj << -/D [1761 0 R /XYZ 85.0394 748.4854 null] ->> endobj -1766 0 obj << -/D [1761 0 R /XYZ 85.0394 748.4854 null] ->> endobj -1767 0 obj << -/D [1761 0 R /XYZ 85.0394 743.3452 null] ->> endobj -1768 0 obj << -/D [1761 0 R /XYZ 85.0394 728.6405 null] ->> endobj -1769 0 obj << -/D [1761 0 R /XYZ 85.0394 723.1655 null] ->> endobj -1770 0 obj << -/D [1761 0 R /XYZ 85.0394 708.4607 null] ->> endobj -1771 0 obj << -/D [1761 0 R /XYZ 85.0394 702.9857 null] ->> endobj -1772 0 obj << -/D [1761 0 R /XYZ 85.0394 688.2211 null] ->> endobj -1773 0 obj << -/D [1761 0 R /XYZ 85.0394 682.8059 null] ->> endobj -1774 0 obj << -/D [1761 0 R /XYZ 85.0394 668.0414 null] ->> endobj -1775 0 obj << -/D [1761 0 R /XYZ 85.0394 662.6262 null] ->> endobj -1776 0 obj << -/D [1761 0 R /XYZ 85.0394 599.7666 null] ->> endobj -1777 0 obj << -/D [1761 0 R /XYZ 85.0394 599.7666 null] ->> endobj -1778 0 obj << -/D [1761 0 R /XYZ 85.0394 599.7666 null] ->> endobj -1779 0 obj << -/D [1761 0 R /XYZ 85.0394 591.7571 null] ->> endobj -1780 0 obj << -/D [1761 0 R /XYZ 85.0394 565.0374 null] ->> endobj -1781 0 obj << -/D [1761 0 R /XYZ 85.0394 559.6222 null] ->> endobj -1782 0 obj << -/D [1761 0 R /XYZ 85.0394 534.1777 null] ->> endobj -1783 0 obj << -/D [1761 0 R /XYZ 85.0394 527.4872 null] ->> endobj -1784 0 obj << -/D [1761 0 R /XYZ 85.0394 502.0427 null] ->> endobj -1785 0 obj << -/D [1761 0 R /XYZ 85.0394 495.3523 null] ->> endobj -1786 0 obj << -/D [1761 0 R /XYZ 85.0394 420.5376 null] ->> endobj -1787 0 obj << -/D [1761 0 R /XYZ 85.0394 420.5376 null] ->> endobj -1788 0 obj << -/D [1761 0 R /XYZ 85.0394 420.5376 null] ->> endobj -1789 0 obj << -/D [1761 0 R /XYZ 85.0394 412.5281 null] ->> endobj 1790 0 obj << -/D [1761 0 R /XYZ 85.0394 388.4584 null] ->> endobj -1791 0 obj << -/D [1761 0 R /XYZ 85.0394 380.3932 null] +/Type /Page +/Contents 1791 0 R +/Resources 1789 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1843 0 R >> endobj 1792 0 obj << -/D [1761 0 R /XYZ 85.0394 365.6884 null] +/D [1790 0 R /XYZ 85.0394 794.5015 null] >> endobj 1793 0 obj << -/D [1761 0 R /XYZ 85.0394 360.2134 null] +/D [1790 0 R /XYZ 85.0394 748.4854 null] >> endobj 1794 0 obj << -/D [1761 0 R /XYZ 85.0394 345.4488 null] +/D [1790 0 R /XYZ 85.0394 748.4854 null] >> endobj 1795 0 obj << -/D [1761 0 R /XYZ 85.0394 340.0336 null] +/D [1790 0 R /XYZ 85.0394 748.4854 null] >> endobj 1796 0 obj << -/D [1761 0 R /XYZ 85.0394 325.269 null] +/D [1790 0 R /XYZ 85.0394 743.3452 null] >> endobj 1797 0 obj << -/D [1761 0 R /XYZ 85.0394 319.8539 null] +/D [1790 0 R /XYZ 85.0394 728.6405 null] >> endobj 1798 0 obj << -/D [1761 0 R /XYZ 85.0394 295.7842 null] +/D [1790 0 R /XYZ 85.0394 723.1655 null] >> endobj 1799 0 obj << -/D [1761 0 R /XYZ 85.0394 287.7189 null] +/D [1790 0 R /XYZ 85.0394 708.4607 null] >> endobj 1800 0 obj << -/D [1761 0 R /XYZ 85.0394 272.9543 null] +/D [1790 0 R /XYZ 85.0394 702.9857 null] >> endobj 1801 0 obj << -/D [1761 0 R /XYZ 85.0394 267.5392 null] +/D [1790 0 R /XYZ 85.0394 688.2211 null] >> endobj 1802 0 obj << -/D [1761 0 R /XYZ 85.0394 252.7746 null] +/D [1790 0 R /XYZ 85.0394 682.8059 null] >> endobj 1803 0 obj << -/D [1761 0 R /XYZ 85.0394 247.3594 null] +/D [1790 0 R /XYZ 85.0394 668.0414 null] >> endobj 1804 0 obj << -/D [1761 0 R /XYZ 85.0394 223.2897 null] +/D [1790 0 R /XYZ 85.0394 662.6262 null] >> endobj 1805 0 obj << -/D [1761 0 R /XYZ 85.0394 215.2245 null] +/D [1790 0 R /XYZ 85.0394 599.7666 null] >> endobj 1806 0 obj << -/D [1761 0 R /XYZ 85.0394 149.4956 null] +/D [1790 0 R /XYZ 85.0394 599.7666 null] >> endobj 1807 0 obj << -/D [1761 0 R /XYZ 85.0394 149.4956 null] +/D [1790 0 R /XYZ 85.0394 599.7666 null] >> endobj 1808 0 obj << -/D [1761 0 R /XYZ 85.0394 149.4956 null] +/D [1790 0 R /XYZ 85.0394 591.7571 null] >> endobj 1809 0 obj << -/D [1761 0 R /XYZ 85.0394 144.3554 null] +/D [1790 0 R /XYZ 85.0394 565.0374 null] >> endobj 1810 0 obj << -/D [1761 0 R /XYZ 85.0394 120.2857 null] +/D [1790 0 R /XYZ 85.0394 559.6222 null] >> endobj 1811 0 obj << -/D [1761 0 R /XYZ 85.0394 112.2205 null] +/D [1790 0 R /XYZ 85.0394 534.1777 null] >> endobj 1812 0 obj << -/D [1761 0 R /XYZ 85.0394 97.4559 null] +/D [1790 0 R /XYZ 85.0394 527.4872 null] >> endobj 1813 0 obj << -/D [1761 0 R /XYZ 85.0394 92.0407 null] +/D [1790 0 R /XYZ 85.0394 502.0427 null] >> endobj -1760 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] +1814 0 obj << +/D [1790 0 R /XYZ 85.0394 495.3523 null] +>> endobj +1815 0 obj << +/D [1790 0 R /XYZ 85.0394 420.5376 null] >> endobj 1816 0 obj << +/D [1790 0 R /XYZ 85.0394 420.5376 null] +>> endobj +1817 0 obj << +/D [1790 0 R /XYZ 85.0394 420.5376 null] +>> endobj +1818 0 obj << +/D [1790 0 R /XYZ 85.0394 412.5281 null] +>> endobj +1819 0 obj << +/D [1790 0 R /XYZ 85.0394 388.4584 null] +>> endobj +1820 0 obj << +/D [1790 0 R /XYZ 85.0394 380.3932 null] +>> endobj +1821 0 obj << +/D [1790 0 R /XYZ 85.0394 365.6884 null] +>> endobj +1822 0 obj << +/D [1790 0 R /XYZ 85.0394 360.2134 null] +>> endobj +1823 0 obj << +/D [1790 0 R /XYZ 85.0394 345.4488 null] +>> endobj +1824 0 obj << +/D [1790 0 R /XYZ 85.0394 340.0336 null] +>> endobj +1825 0 obj << +/D [1790 0 R /XYZ 85.0394 325.269 null] +>> endobj +1826 0 obj << +/D [1790 0 R /XYZ 85.0394 319.8539 null] +>> endobj +1827 0 obj << +/D [1790 0 R /XYZ 85.0394 295.7842 null] +>> endobj +1828 0 obj << +/D [1790 0 R /XYZ 85.0394 287.7189 null] +>> endobj +1829 0 obj << +/D [1790 0 R /XYZ 85.0394 272.9543 null] +>> endobj +1830 0 obj << +/D [1790 0 R /XYZ 85.0394 267.5392 null] +>> endobj +1831 0 obj << +/D [1790 0 R /XYZ 85.0394 252.7746 null] +>> endobj +1832 0 obj << +/D [1790 0 R /XYZ 85.0394 247.3594 null] +>> endobj +1833 0 obj << +/D [1790 0 R /XYZ 85.0394 223.2897 null] +>> endobj +1834 0 obj << +/D [1790 0 R /XYZ 85.0394 215.2245 null] +>> endobj +1835 0 obj << +/D [1790 0 R /XYZ 85.0394 149.4956 null] +>> endobj +1836 0 obj << +/D [1790 0 R /XYZ 85.0394 149.4956 null] +>> endobj +1837 0 obj << +/D [1790 0 R /XYZ 85.0394 149.4956 null] +>> endobj +1838 0 obj << +/D [1790 0 R /XYZ 85.0394 144.3554 null] +>> endobj +1839 0 obj << +/D [1790 0 R /XYZ 85.0394 120.2857 null] +>> endobj +1840 0 obj << +/D [1790 0 R /XYZ 85.0394 112.2205 null] +>> endobj +1841 0 obj << +/D [1790 0 R /XYZ 85.0394 97.4559 null] +>> endobj +1842 0 obj << +/D [1790 0 R /XYZ 85.0394 92.0407 null] +>> endobj +1789 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1846 0 obj << /Length 2121 /Filter /FlateDecode >> @@ -7906,119 +8028,119 @@ Z9 aÜo汆ÆÙ3¨¢sõd¥Ë*^ÉÛXxùÎR~ȬتýÁŠüˆ9w›m&U¿Øé½cïU¢Àâ,pò¢2ª‹ö6°L@ÎU\¿²q8.€6býN}×I?âL¥°Ž ®üHU®‹}fFµVÕx•øý}_à»*ê¬cIj†\m­17ÂÞÔ©ÏpÐƺû<3ú$)6“.|¶qžjéŒ:¯ü≀Æ2-“,N7:‡ê‰¸jH ññBçç®:s%võrá‹(+$-K¢èp uüa„ÄøÉÒ7YÂò°§O+|Ëô'66E^­ /œ÷z‰?Ö)\6;6jVìÙ+†ÎRZ/ÙÉT[?뙉Wà BRSOÄú1£ì ô<(AD]­Xx©°óZìM¬¸¾{˜åºP¬ú\J"VßCÞäN¹Qï3;¡Ô»pý²©Î“ ì‚™8 -ÓÙ„õç‘A­Ç> endobj -1817 0 obj << -/D [1815 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1818 0 obj << -/D [1815 0 R /XYZ 56.6929 749.4437 null] ->> endobj -1819 0 obj << -/D [1815 0 R /XYZ 56.6929 749.4437 null] ->> endobj -1820 0 obj << -/D [1815 0 R /XYZ 56.6929 749.4437 null] ->> endobj -1821 0 obj << -/D [1815 0 R /XYZ 56.6929 746.6461 null] ->> endobj -1822 0 obj << -/D [1815 0 R /XYZ 56.6929 722.5763 null] ->> endobj -1823 0 obj << -/D [1815 0 R /XYZ 56.6929 716.7581 null] ->> endobj -1824 0 obj << -/D [1815 0 R /XYZ 56.6929 701.9936 null] ->> endobj -1825 0 obj << -/D [1815 0 R /XYZ 56.6929 698.8254 null] ->> endobj -1826 0 obj << -/D [1815 0 R /XYZ 56.6929 684.1207 null] ->> endobj -1827 0 obj << -/D [1815 0 R /XYZ 56.6929 680.8926 null] ->> endobj -1828 0 obj << -/D [1815 0 R /XYZ 56.6929 656.8229 null] ->> endobj -1829 0 obj << -/D [1815 0 R /XYZ 56.6929 651.0047 null] ->> endobj -1830 0 obj << -/D [1815 0 R /XYZ 56.6929 636.3 null] ->> endobj -1831 0 obj << -/D [1815 0 R /XYZ 56.6929 633.072 null] ->> endobj -1832 0 obj << -/D [1815 0 R /XYZ 56.6929 609.0023 null] ->> endobj -1833 0 obj << -/D [1815 0 R /XYZ 56.6929 603.184 null] ->> endobj -1834 0 obj << -/D [1815 0 R /XYZ 56.6929 579.1143 null] ->> endobj -1835 0 obj << -/D [1815 0 R /XYZ 56.6929 573.2961 null] ->> endobj -1836 0 obj << -/D [1815 0 R /XYZ 56.6929 558.5914 null] ->> endobj -1837 0 obj << -/D [1815 0 R /XYZ 56.6929 555.3634 null] ->> endobj -1838 0 obj << -/D [1815 0 R /XYZ 56.6929 540.5988 null] ->> endobj -1839 0 obj << -/D [1815 0 R /XYZ 56.6929 537.4306 null] ->> endobj -1840 0 obj << -/D [1815 0 R /XYZ 56.6929 510.7109 null] ->> endobj -1841 0 obj << -/D [1815 0 R /XYZ 56.6929 507.5427 null] ->> endobj -630 0 obj << -/D [1815 0 R /XYZ 56.6929 477.5928 null] ->> endobj -1842 0 obj << -/D [1815 0 R /XYZ 56.6929 453.2532 null] ->> endobj -634 0 obj << -/D [1815 0 R /XYZ 56.6929 369.7201 null] ->> endobj -1843 0 obj << -/D [1815 0 R /XYZ 56.6929 345.3805 null] ->> endobj -1844 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] ->> endobj 1845 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] ->> endobj -1846 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] +/Type /Page +/Contents 1846 0 R +/Resources 1844 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1843 0 R >> endobj 1847 0 obj << -/D [1815 0 R /XYZ 56.6929 310.6805 null] +/D [1845 0 R /XYZ 56.6929 794.5015 null] >> endobj -1814 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F39 885 0 R /F14 729 0 R >> -/ProcSet [ /PDF /Text ] +1848 0 obj << +/D [1845 0 R /XYZ 56.6929 749.4437 null] +>> endobj +1849 0 obj << +/D [1845 0 R /XYZ 56.6929 749.4437 null] >> endobj 1850 0 obj << +/D [1845 0 R /XYZ 56.6929 749.4437 null] +>> endobj +1851 0 obj << +/D [1845 0 R /XYZ 56.6929 746.6461 null] +>> endobj +1852 0 obj << +/D [1845 0 R /XYZ 56.6929 722.5763 null] +>> endobj +1853 0 obj << +/D [1845 0 R /XYZ 56.6929 716.7581 null] +>> endobj +1854 0 obj << +/D [1845 0 R /XYZ 56.6929 701.9936 null] +>> endobj +1855 0 obj << +/D [1845 0 R /XYZ 56.6929 698.8254 null] +>> endobj +1856 0 obj << +/D [1845 0 R /XYZ 56.6929 684.1207 null] +>> endobj +1857 0 obj << +/D [1845 0 R /XYZ 56.6929 680.8926 null] +>> endobj +1858 0 obj << +/D [1845 0 R /XYZ 56.6929 656.8229 null] +>> endobj +1859 0 obj << +/D [1845 0 R /XYZ 56.6929 651.0047 null] +>> endobj +1860 0 obj << +/D [1845 0 R /XYZ 56.6929 636.3 null] +>> endobj +1861 0 obj << +/D [1845 0 R /XYZ 56.6929 633.072 null] +>> endobj +1862 0 obj << +/D [1845 0 R /XYZ 56.6929 609.0023 null] +>> endobj +1863 0 obj << +/D [1845 0 R /XYZ 56.6929 603.184 null] +>> endobj +1864 0 obj << +/D [1845 0 R /XYZ 56.6929 579.1143 null] +>> endobj +1865 0 obj << +/D [1845 0 R /XYZ 56.6929 573.2961 null] +>> endobj +1866 0 obj << +/D [1845 0 R /XYZ 56.6929 558.5914 null] +>> endobj +1867 0 obj << +/D [1845 0 R /XYZ 56.6929 555.3634 null] +>> endobj +1868 0 obj << +/D [1845 0 R /XYZ 56.6929 540.5988 null] +>> endobj +1869 0 obj << +/D [1845 0 R /XYZ 56.6929 537.4306 null] +>> endobj +1870 0 obj << +/D [1845 0 R /XYZ 56.6929 510.7109 null] +>> endobj +1871 0 obj << +/D [1845 0 R /XYZ 56.6929 507.5427 null] +>> endobj +638 0 obj << +/D [1845 0 R /XYZ 56.6929 477.5928 null] +>> endobj +1872 0 obj << +/D [1845 0 R /XYZ 56.6929 453.2532 null] +>> endobj +642 0 obj << +/D [1845 0 R /XYZ 56.6929 369.7201 null] +>> endobj +1873 0 obj << +/D [1845 0 R /XYZ 56.6929 345.3805 null] +>> endobj +1874 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1875 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1876 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1877 0 obj << +/D [1845 0 R /XYZ 56.6929 310.6805 null] +>> endobj +1844 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F14 737 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1880 0 obj << /Length 1945 /Filter /FlateDecode >> @@ -8029,45 +8151,45 @@ O3i_ ! ˆ(ñ7|Ùl‹²†B ù¼¬WÍn[ôeƒ•Ï×»‘Í›Öí€U¦ŽÖ š~ã\¹ŸåcåˆÜ7ME+€a{·#¤5€×kâ¤Zë>¦=‰ÒwÇnÅÓùmOT8åꈷy‡ŽºŒü™ê°*"ÖKH,£][‡@î7ŽÈEÝ=Ãq‘Zôa›—5ðиßïj·¤å©²=#-DZ q;2.ááȈ3t€Ò-Ae³OM×Ç‚ª–·•²ò˶¬Ë1ïú]Ñ7^x ï;7á l>Tœ .ݲ1Û÷ ö¤äîµÛ4 ŠnùQŒ––auÛÑÒ£[(…_nVô-û°½„ kþ ,d`…â|Oáþöè¢gZ¥h«ìÁ| ƒ›ýwß·ûýGðùg¸›ÝËv=´ C‡BDúnŠ'¶`WàG«}½À˜(ªá<¸ÍzÂà ³‰1éï\³\«XûXÌΚeyn@Çœ¥iJÿ¦ê7Í~½™8Jè8•ºvµ2eàÁÀUJÎkŒñª:àÌ›{Iôç²ßmÑl·`ý¤*kGkëýÖÕ}‡Wg$\.qU×צè‰æE¿Ûf ü=ãšR7€ÕB¹»ýB(bŠ%%}r¡h©ëCŽ8†(ÎŽ™JVÎç;C´Gˆ½ »=(½;Ф DïÀxÆØ$õÔ$ä½ ··¨X7$̉ˆnw˜‘ßêùóÆÕ4Âtò²È§9Âêp‘ÉfÚ«Lfc@¤OØð]—O®Fõšÿ³®ÊïŽè®ØU¥˜`úEÑÁiJÙMZ3{{÷ž8ò€ºm!øA÷âxR³šŒ x‰¡¾X—Lj¢7ƒw6ÏdµDãÓ*züÛ}Õ—måN£»GòcX,»nïB”Ÿø…âÀ.7€Á ³áÆN‚lF)A‘ïK¥B1”phµ$Š?(¾°© J׺E‰N¸ y,{*Œ›TCV|i@ÉsïyÍ€^5繬ª XŠ2 —Ô«‚QÕ%jUvä–¨e=á‹Â&¤ˆêk×/^à ª©žb*Ëàá$@º‘¿/šz5!÷¸Ñ‘82ÿ¿(Fd ¿éɵ1&ŒÎH>ÀŽc\|a“ŽIëë ³É®Z_Èll}@ ^ñ}Ûßè!0\E᥮þ#:ötM0!ßmzì)¢¡,<ƒyfÇ–ò}“ÍBà§ðëºÐ Õ;(P;ØZêG¨;ZZºUÖÑ: -7Ñ[¤ʘÐ×ìbyíòTSþ*¤Ñ›þüïŸ?}øÏkx»Åb¦˜Í¬ü:5¿ßDU)ÇŸªŸ µƒ8Èa€\Ô¢7…r$sÍ´gõȇ½á'®ƒ“¶…ü¹ŒYÍu\¼œcN‘‚³N¦{ß`Bɺ½£/uµ0x÷‘¾ô{ƒo™1§tDm ¦«¢¥I¨í0ê¯ÂõMK`•{rÑè•ý!`zfó%5YH§Î-œ1ñ³¼eL–ÅBç£ëMÓÙ+5´‚çžy1W±»M—ª¢T£ªÊ!Å¢´¼:Ë/ ðw¿F“™C]ôª^®×"‡¤aÉ~\”,†Ïpî‰4êHi0Fë)šP´ƒ4ʧۻ˜@`eè¡¡„*œžõÐÈøîcäw H¨©Ômá/„íàÍ]tì¦}²÷/açïðãó˜áϲ“íÀ’yèÙÑo#\Ó/U€:q~ÜðïËóþ Ðažƒendstream +7Ñ[¤ʘÐ×ìbyíòTSþ*¤Ñ›þüïŸ?}øÏkx»Åb¦˜Í¬ü:5¿ßDU)ÇŸªŸ µƒ8Èa€\Ô¢7…r$sÍ´gõȇ½á'®ƒ“¶…ü¹ŒYÍu\¼œcN‘‚³N¦{ß`Bɺ½£/uµ0x÷‘¾ô{ƒo™1§tDm ¦«¢¥I¨í0ê¯ÂõMK`•{rÑè•ý!`zfó%5YH§Î-œ1ñ³¼eL–ÅBç£ëMÓÙ+5´‚çžy1W±»M—ª¢T£ªÊ!Å¢´¼:Ë/ ðw¿F“™C]ôª^®×"‡¤aÉ~\”,†Ïpî‰4êHi0Fë)šP´ƒ4ʧۻ˜@`eè¡¡„*œžõÐÈøîcäw H¨©Ômá/„íàÍ]tì¦}²÷/açïðãó˜áϲ“íÀ’yèÙÑo#\Ó/UÜœ7üÀûò¼ÿйž…endstream endobj -1849 0 obj << +1879 0 obj << /Type /Page -/Contents 1850 0 R -/Resources 1848 0 R +/Contents 1880 0 R +/Resources 1878 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1843 0 R >> endobj -1851 0 obj << -/D [1849 0 R /XYZ 85.0394 794.5015 null] +1881 0 obj << +/D [1879 0 R /XYZ 85.0394 794.5015 null] >> endobj -638 0 obj << -/D [1849 0 R /XYZ 85.0394 769.5949 null] +646 0 obj << +/D [1879 0 R /XYZ 85.0394 769.5949 null] >> endobj -1852 0 obj << -/D [1849 0 R /XYZ 85.0394 573.0107 null] +1882 0 obj << +/D [1879 0 R /XYZ 85.0394 573.0107 null] >> endobj -642 0 obj << -/D [1849 0 R /XYZ 85.0394 573.0107 null] +650 0 obj << +/D [1879 0 R /XYZ 85.0394 573.0107 null] >> endobj -1853 0 obj << -/D [1849 0 R /XYZ 85.0394 538.4209 null] +1883 0 obj << +/D [1879 0 R /XYZ 85.0394 538.4209 null] >> endobj -1854 0 obj << -/D [1849 0 R /XYZ 85.0394 504.6118 null] +1884 0 obj << +/D [1879 0 R /XYZ 85.0394 504.6118 null] >> endobj -1855 0 obj << -/D [1849 0 R /XYZ 85.0394 432.7569 null] +1885 0 obj << +/D [1879 0 R /XYZ 85.0394 432.7569 null] >> endobj -1856 0 obj << -/D [1849 0 R /XYZ 85.0394 303.3232 null] +1886 0 obj << +/D [1879 0 R /XYZ 85.0394 303.3232 null] >> endobj -1848 0 obj << -/Font << /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R >> +1878 0 obj << +/Font << /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1860 0 obj << -/Length 3824 +1889 0 obj << +/Length 3825 /Filter /FlateDecode >> stream @@ -8086,124 +8208,138 @@ h £L¨¸Â›2Ž¤Šà˜ÊjŽŠåû]>ê|“(ÑÆô®³av½Ò»^q¬$C“¡Ç|qYðw)Ð÷þæ Wr–ÇëçbÙ–Ÿ‹ÿx…f&@Ã2Ô \ÙZ6Ýmž _•˜¡ áÁKa¸t…'z ù²ªr±ØðPý–‰¿¬>åý¿È¦endstream +/ÉpÚQœÀ¬*VË9pcÐ-Zq4õM´ÂRˆû2G„/%þçï¥_ƒk)k'¾ñ‰ $†´™)‡:Dzú-Y}ÊûXȨendstream endobj -1859 0 obj << +1888 0 obj << /Type /Page -/Contents 1860 0 R -/Resources 1858 0 R +/Contents 1889 0 R +/Resources 1887 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1843 0 R >> endobj -1861 0 obj << -/D [1859 0 R /XYZ 56.6929 794.5015 null] +1890 0 obj << +/D [1888 0 R /XYZ 56.6929 794.5015 null] >> endobj -1862 0 obj << -/D [1859 0 R /XYZ 56.6929 752.1413 null] +1891 0 obj << +/D [1888 0 R /XYZ 56.6929 752.1413 null] >> endobj -1863 0 obj << -/D [1859 0 R /XYZ 56.6929 501.191 null] +1892 0 obj << +/D [1888 0 R /XYZ 56.6929 501.191 null] >> endobj -1858 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F53 1017 0 R /F11 1367 0 R >> +1887 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F53 1027 0 R /F11 1384 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1866 0 obj << -/Length 2981 +1895 0 obj << +/Length 3111 /Filter /FlateDecode >> stream -xÚ­Zmsã¶þî_¡o•' ’èL>øΗŒ;éʼn}Ót.þ@‹”űD:"eWÿ¾»X|IwÚÎÍœ@`‰]’-k¯?Ë›ü°/Jûèð€—j€ÏìíL\Pž®´¬ßÈy°å“1p¬Ê&Ͼ·§¼[V0ÇÁRº«­ï€F±Ï«c3x“€h̲à±np@žŠ¼¼M:Û¥±ésJ[·¬I|0Ânã: ˜N·qp0òh¥Sz„sÿVåvû‰³ù:Ï&ÞxÙíäuñdÕal9ÀÀ‡ ‰絿;¸Žcç0:B­xÒµ°&mDnYÄû,BCm°< É>a &£F-ï-7™„£€ëdÊ`ì #'¡½„Ø&t¹#©$5Z$Δ՘¯àÞBçÞL´¹Ëü ¶™ÞêÛò´$ß½†¯Æ -c §‘]×/HDëágp YÆqÞÇ%­i?µåkº;¢Ë\ðÏ;%ìÜÏ9uS&ƒ ÇkÇÓq€YÀ©c„ùDÛôuøâ¦:ìÇÈã N´K ¾£ud?ÛFàLD%QèC€SLzéœØûW²Ì[Ÿ‹Ç’¶þ¯g©2 ˜‚4\É8C%£¹½Zu¥Lf+“‘ÌÖK™U~+«‡fý2TÌP9bïhöRçªÌ‹á`ðî¯x¬þ[†[.!ªêŒåZ÷ŸniÌæÕÐe ¥ÔßÁTÌôS*l1mw²|“BL!™ÇQà9Æ'ôZ(b(Gj©ñõúÖR ×jp¢å.¯ÝΕô{õû¿YŸl}÷ïq>ÓjlÝ/ Ô­W/ìT.p@sÖÖ‹§ôcà0#UYRTéOL¹Þ˜„²ŽEïШ#5C#'åiôº>c&0I¨æ{©sÍq`ää=ÕÄ"éYÄ,‹¤g‘ô,bŽE’÷XÄ‹d—E -ªŽû-q6`¦4®ÒˆÊ&ýµëmU/ÿ” >í´aHâAÈ´+ñ -ë4eÈÅ…êS¯“áÙ@¾q|{L×Ïoi¸ Iö/P=»¢9]rÎÑM Îèp Äa(_×ø¿Ë C¨3¡âÐÓ·0jÖÇ¢Á±I¾ĮE¨çùÖ•šæ›—òhBô¨ùç b&óʽԹöAù­ Ñ—¼¯þ5»¬–—Pe•®ö„¢™3#Ob:lÎð>ß$ç <œþ4£qŠ²ÄÌÆ_Fe¬‘AóPã.âÀÇu[‡n„;Ñ™ ’:K)$a2 Ã~!˜f挎3.DBR'Ãæ·´#5³¥NÊliVíÓ¢üóiW^÷ö&Ï[à¥ÎMèï+ØAðî™p‡ ˆ\ª:'xЋÓÚ‰Tô ~¸Iq³ûïÁæíl›Ö5â!Bɨ–®ˆì.|`-DÍ$dq{!4£«˜¿ØmõK¾ö™·°V¥#ÅåJ@Mª åé'%][ûÕtÈHGþÊĦªMa²«ˆÔJ‚ ®Tÿ7뇼®v¯Seµ†]Á<¡]hb+E\ÀCT ¯¿3¼³3ÖE®!D“{‡Ñ>V¼½SýÛ‡$€ZÀÙûêXoG̳ W<»óñ¼{®ž§ròLe@Ú0œ?S]©é3奼›lW1ê&g•·nòLû¸›ì©7¡]’ Íã(4c…flÙšC÷vhGq$Ë‘Ö%Õ‡ÌÖ‡£oÚw¸ÍÂà×2šæéÓ‡Gi 1ÚÊÝËZÊÚo°ótn&è ‰d¼-6ò²Æ“­={ѸòtÒ;Ðæy6îŸ\ýo¢À4Ë8žx©ÞaYGj†eNªeÙ¶z›`Z,ƒ˜‰w ðRç .¼4 F{&ÜRÜ" ˆm]°lX{è¥ÒC°qþ>ÓÔ“ ª}Ænn§&!Èù$'ßéJMCì¥<Ä°Á£Q#c&çµ{©sõ}|#ÄŠÇ}ý×¹»œHÛz¥¡.ì±ÀÖ}€OeUžöm29âq#HýÃPw“äqyˆUp©Å;w¤f vR^wšVåî4é+g•·¾òLû¸¯ì©‡Ü£\Üaj¦mnî/+;µ¢¦“Rü)èBÈ7T”¼]Gj:'Õn³KŸ¦¡›SÞn¨}º®ú«ÿ˜n‘†Eú þÁŽtE J Õ½á/ÞâH¾»»RÓ z©ÖºlÔYå-¨gÚÇAí©§\X)[V+é.g^‡>På»ÐuuMãü—8ÊÒ&¥¯€(ðXØILrª”›Bö¼ŠBi/p`„&Wî] uç\OÙìN4¶54Ò™RÇ·©»|Bµ÷œø`ˆ`¾’ã §W³a6ª" ƒP^ˆ>çÑp¼|<ÚaZ4R[~SoEÌÝqOŒV×™×Øë#cX=ÿ=îìRovy“— Osj(âïøÔ®Ô ‡”çðúÏ)ïpx¨}‚Ã]õ†ÃÀ›@ƒ2‚„[c‹<(4>]Ó/rx½Í×Ï” @OVÔXxdöc6ô˜Í†ñÃÝYz4–LØ$êÜù™ž°}Ë0Æ©ª -Sz¸þrw÷ùµ_Ó]‘¥m!Rmzù qy’ -:¢K§Y&t„¦‰à„Zì&¯ç´¶·ƒCµã—ƒ]½×ô­p*-´Ÿ¡ôÓÏWwwî*6/;à|zèemVä?†LÀ -ÁD„ïÜ™´2Ó Z™öB±Í>ƒUÊ á@˜­^f¨vðGŽ_¤ºzÿ;Lïïþ?!ê*à_üŒ¬ùðÿóµ6%ñ¯<’‰*˜ „ÐÜ…0q¦†¦û?A:·ýßh @endstream +xÚ­ZmoÛ8þž_áoç k•õÆöCÚtYì¶Ù‹ÛC›Š¥ÄBlÉkÉÉùßß gH½Xrw‡5E9ÃáÃg†däLÀ?9KBO(Ìbx¡álµ½³'hûùB²Ì +-ºR–ïRñL{:ò£Ùò±3Vâ‰$‘³eöm~u{ûéóõÍŸ— ?óÞå"bþÛÕç¯W¿RÝí¥öçW?ºƒÏ(>I‹ÄüúæçËûå/Ÿ–Θ®ÁR(´ä¯‹o÷b–Ý¿\Oé$œ½Â‡ð¤Öþl{„Ê ¥lÍæâîâw7`§Õts@¨/Lüxľó@¨½HAzàczhŠª¼\(ÏëuuØdT~Èé·IŸsn~]ÛÒ¡.Ê'n_çè…÷?²£K&—$" QËâH2={$Ø#•d‘j×Úa·‡MS,u¾gûŽu“okúHëÖSxÎXˆæ«´ìÏᥨ‹‡ %Ú2[€·½D«JÒÓaè3Ìh~¬æÕ¡Ù,óÇý¥LæÕ–Zvõw^†ÿ$‹îI F6ßnŒzo6«éc]ÔMµ?’èw!üM@R‰˜ÿÃøeدX\Þ¼Œ,¬4Å*%aëkѬ٥]·+í{J|öiV<ù=ð4±Ì8 nm.ÓmN +DìáX=ÿÀZ¼àrø!öIÑAa2/jªùëï‹<£2ϳšÚ›ŠªžËêÕöͩɬÖ¤%÷K7OÕæ·å¾¬E;-9y zQEó›’Z?Ü|¾þÁ*)ê¾YUæ<ˆ$8§G„°£•~)2V!æéŽ+wû"mò¯K!Š ]z¾›eÿúéË0œÿ“ ùr»¼ùòùndžàt@¨å9”ÆžôeÌf´ë’ã4% ’yyØ>¥´´q‹šÄÅ"¬6Ìu€<à`ämÃoÐòÀÒ)}¶­Œr^~Âl¾Ê³‰»Í¯‹'V‡¡edÿ¼$J,i¿Û·žŽcK +œF¾ÖF2éZX“6‚‹dÉ>ŠÐPŽ•Jú^DA=ÉMFM8_26E[ç)B±bà l9R ­%TÀ2!ãŽdÓh•X"(«1®P@&¾e7l`ì2B¾6ó°-OK¢v¨5x5V˜5ñ¼¾ I¬ç?ã_$`œ”ý ’Ö´žàµùKº9 e)©ŒaXçH +7ÅsNÕ”È`ÁâÛqwìa0'Ð1ºùH ëôeØñ±ÚoÇÀ##/N´Í +ÞÑ<²m#îL”%‘ï"€ULziŸp† ¼ GaÁ{—9òï'™²ðDYx†(Ba4µg¡EWÊ$¶A2’Ø:)3Ëoeu߬vCÅR”#ñ†f'uªz€¼6†èþŠ;AÁì¿e¸ääBUC5°ÜSiùñ–Ú8­†*ãZʬ±fb¦ž2 °E$4¯dùc +1…drDû¿µPÄ@ŽÔRáëõ-C ×Ã¥;”›¼¶+WÒïÕŸ?ýÁœÌÜ}ãj,g²Æ–~¡¡nY½à¡là€â*­™ÅSú1î0-UYRTéL©ÞŒ ©RúoÀ¨#uFVÊÁèeu‚"ø8ñÃóŠÔ©æŠ$  RòžjBQàP$ECQàP$,ŠÙC‘°( +º( +áб\F`6À0¥¡J#v,›ô_Tn˜mÃ^ú$p.pùgw£ C’ô|¡í ¯`Ò |é…R…S™wÎüÑâí!]=¿¦mà2 Ùîà8ôPlŠæx)¥DšRRÐæ@‰ï¾¼¬ð›@†PF6Bž9¤·0jV‡¢Á¶I¼±ïIçñÖ•šÆ›“rÞ„èQíó̅‹µŸœWî¤NµNß!äùì«¿AÍ6«€ý%²J{ô„33mfALb*8gØç›ä\à†‡ÝŸfÔNQ¶“˜qütŠ52cék\Eløp¤jf8¤i)¢3$u ) _?‘ƒtÓMÓÌ|Ññ …p¬òÃ8|cI;Rg–ÔJ™%ͪmZ”?b>mO×½u…Á£DÄç-pR§&ô×lˆ x÷L¸Ã„NE6U€B“{U„iHmE*únR\ì~?X¼ —i^# áKHFu`Ï݉¬ +ù"nï"”t³ãd[½ËW.ó6 lU:r¶\(¥½Rž>½tmí¦/ˆtänL8Um +“]Erü<@ÊžÔßçÍêý>¯«ÍËÔ©Zê`žÐN4á“"NÜC÷S ¯¿2²³2L‘+ÑDïÐÚ÷•l¯ãÂþåCâÁYÀÚûu¬Ö#f‚Y+žÜŠ¹ñ¼»¯žÀOåäžRqä~øÆžêJMï)'åh²Å(MžUÞÒä‰öqšì©7¡)É„fˆqš±†B3–øÌ¡{+Š ´¢Ø’åë’·‚χ£=¹ä, ~Ñ4N¶Ø< +[ˆéPíµ,C–Ïx£+?gHl!Ûæ@üQÖxä³g/÷\:tÒ;r çy÷öüo¢À4ÊTà…A½²ŽÔ”Y©eëêuiqàÅB½a€“:µ`pá¥àƒ°oÂ-Å-r¡­ë,k÷½Tzèlœ»Î4çIˆƒ]Ænn§¦],/òã7<Ü +q0 9ÿÂêŽFÅà‹à¬j't¢»ïÚHzq(ãžòëÜ^K¤íI¥¡*¬a—Ö}×˪±™Êª+Þöå™Ïë:çËJ?†S=i}¾”÷ùÔ´ØkxSÎH +gˆ¯nGªïÜëÃ]51ŸVÍ›%”^ÒM‘1aúô,‹’0ÂÁ%ŠX¿ZñÝ)…"´¨"Ñ“çÉï_0[”ÌwÕæ’ñÕ±;«¤{-ÌM€P°~?Jj*Ê OóÚv1·½]q è\Ž÷f=1Ù¤;Y0®3ߤõì[!ZR¿Ö¡ÐypÖ{ òËí_×_¾.©bŸ–Oø†(3[Áƒñlé‹'«ÝsÔíÒ=ë1^Ô’½…®U¯imGì,æÈTìmŠËJœ—&)ïM%û<Åt¥¦)ÆI9ŠY§˜³Ê[Š9Ñ>N1=õ†b`crª–Ø5M$S –ÈÛPøxM¿H1«u¾z¦­5YQã‰0ã?2€Ã2X0a²;Je@>± 6õYÆOü¶—{ÈÇ¡ª3¬2Ì5éãúóÝݧ½åv'Äê±—XÒÅÐ$àdìo¥–¡i X¡›É{ÛsZÛkÛ¡Úñ[Û®ÞkzÄÊ×ù÷~é|üõêîÎÞ‘çeçeÔåíN¶ÏU“n…X¯ü7žUZ™i§²L{ÓÛÀbŸ¸r—D`Îhu2Cµƒ?NÑ°ý¢°«÷¿óérùëÿÉ£öäzø—X#sî#þç?øjÿœ-À¿¾I&^ ð £”–Ö(t“ñÐt÷§a§¶ÿR+¯^endstream endobj -1865 0 obj << +1894 0 obj << /Type /Page -/Contents 1866 0 R -/Resources 1864 0 R +/Contents 1895 0 R +/Resources 1893 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1843 0 R >> endobj -1867 0 obj << -/D [1865 0 R /XYZ 85.0394 794.5015 null] +1896 0 obj << +/D [1894 0 R /XYZ 85.0394 794.5015 null] >> endobj -1868 0 obj << -/D [1865 0 R /XYZ 85.0394 674.4719 null] +1897 0 obj << +/D [1894 0 R /XYZ 85.0394 679.319 null] >> endobj -1864 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F48 940 0 R /F53 1017 0 R >> +1893 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F48 950 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1871 0 obj << -/Length 2837 +1900 0 obj << +/Length 2838 /Filter /FlateDecode >> stream -xÚ¥Z[oܺ~÷¯ØGITÞ%èC‚¤9hOÝ-øA^Ѷ­´Yic8¿¾Ã«HÝö´Å>ˆ"GœáÌ7’‹w~xÇE* -R첂¥a¾Û®ÐîÆ~¹Â–æ#zR½»½úÓ_i¶+ÒB±»}æÊS”çxw[}IÞ¥8½†Pòþã/×oˆàˆ$oon>üöþã¿á# „’¿¿ýíóÛ¿™¾›ëÈ~ùðéúîö׫·^˜P`Œ¨’äûÕ—;´«@î_¯PJ‹œïžá¥¸(ÈîpÅ8M9£Ôõ4WŸ®þé' Fõ§K -`6òú Íq2<éIz9 ×8©ÛGóÞ=D8ùý½y~E®qžèEÔ]kè+Ùצ» -lhïëÁ4êvÂîûYž^®1Æ €"C,¹}ªûéG¶D3Ý¿(•iäˆg  œ–¨VVɇòÜ ¯“äù©Þ?ÄŠ"9ȲíÕ‡  (Ð+2Î@«úóúÑÒDJÌÒ‚ˆÂÒ´ÝéP6Í‹™·—m¥$Dúø!ͨZ`-{X€*ù=PЫ•)¢ò€ýëØbT¤˜d|·9MgŒräá8Øi‡Î<¿"DÚÊ "MùÔê0ùÃvµåA:N?äÉNó`ñ߬æýã­¶îØégå¨ÊÁŒÊRG†ˆ±Yš*u´åE Ñ 円ZÚ:~)Ió<£ðPmà×Qyüz/ŒÀ Á‚‰<ßæí©æÌcœ2(bîQþ(Àú ˆÉ…09£pp‚F%ùXZhÁ±žÌȃ¶Mwˆ>Ær]7˜n ½"„^á ÔžÏHh¤ñΗsÄc+:X)䞪 ÁT- -@ãâ]0ƒ±î½±½&Óè‰wç<ÐE0…lõ KžLQ– ¹ìÉ>ÊoÒ:`=È“wÓÜå»t¡Fà8^»ö|B­{ô]£¿%ÌêF¬¡e=Qz•A·QEÉÇÁ >×P44yy蚦{™<ÈÓ©lz;<Ú<ÓÀæ@d-­Ò8ƒÔÿÔ={A\¤ñŽi*OÈîÏÎwG§C+ôï1<—ý˜‰ì`†«£Èë•:”Vüž ‘f$Û~R­û½§ò~¿?T3¯GP«cz³§š³ŽáÙ…lÂ{ôz¥0aCMŽ§ºLІn‚au_=(„”yßw‡ƒl78™¬;dz¬€®~xñs{*Q,ÇÇÙ)R¥þviÇ3ìhTjÑ®ÃZÙ¤´ô¶_+kFH=•0÷ÒiåñØÔªÔGE¶ÐUý£2¸- á©êÐxo™ùˆ³:IŽ.$›jtŽÊƒœð4¬&›MÞc²™1_N6÷ãÍ? V“VÝRížLqþŒ%^½2ÒY¬]çÞZËÇãHÝF r÷c éç°j ¦¶«y†·-R­[ÂSyK8§X-[7ÙeëŒÿrÙ ðéI‡vpÀ/:ÿ‚óUéhuð†®ïLŸ ïÐøxcÆʪ²Aµ7ºšS#G/3Ñùp/On‚ÒÍz6MÌœ½ÌŽ0K³œ.n“(gkÛ$žr&üÎÆÃ|º³m»=’«ÔaZãáis< Pœ||0½f>ÝT1-#´ýÎï†Ô‹iC„éU.À†×b“r:‚9dkÔ®–×-ä,-hÆãôØk»EHﻳæ¶wÈMc\Á cÕr¦Ñ±ïa:ábz=Žî[-ûšvÛ5O½9½HCª OrTc"5±·_÷¤-ö'Mù¯xR(@XCGZ·5’£,ÑÔ­ìãå¿6Ùó ƒN!ëö€Ê@ˆ_°G@µaG5æØrö«9f“÷˜cfÌ—sLÄݦcšûäMçäª=øºG½hµB#¨{ýƒyªUÔýPïû?«Ó¦BT?íä〓)A¡q(+ùZmFñH××?¥g°¾§ñ0N|l^&^Ü[swí&:î%T/µÛæþ‘”ÔCãÒWDE–2F.äÆjAžÊ#èûiÊ·ÈSN/°µ4s®“ª˜Bõ [àˆíͨ‘/•Õ’ŽÉ^]wëúr[zâš=8¡µÒ»¸ú{½>™û8æ¾qºFi–b¨ò·-1mÂvPLyÏZdÝâ=Ö)óå¸rwæPŠ6‡«Lü>E™Cq'áEÕo½Ü/f'Cuh(µ®¡i_ažÒÒúÂÚÚÂm‡ó©5…?+´Ó­+ÿu¹¯a³_¶Ê(´¯‚@™W t!Ó†TëpðTc™ßup$A·™{ª9÷Ih·$°m‹Ø¿ÓéÜCm¶½ÛØDZu ¹œ[{‹ñÇÓn”çë Ö -”]H¹!Õ†aÕh{Ö;ßM0”Ò¬ÀÛü=Õ\€Ø6PfSX,ÁhælÃœmXdæOŠQ2Š¬_GóИ‡ó°%ó Ìš‡…æaÖ<Ìš‡E§ËÛæ`E1»°ë©6Ìã¨FóTU­VW6sûu×’m à©æÄöI)Íc ógáÌ#"ódÎ<" DÖï£}˜°öÆ>bÉ>…³í#¬}„µOæí£ƒ©(Ҍ擊hÃh¸ )b]@´n2G4Z¬iVç¶ØŽgsS¾ËGs!ãOÒÆW¶íYÚ¦’go¾"DËÇõ* uF.\¼…T*rTæê°>È¿Ü®Ti›l]•6ãº\¥ElAC?.ï«ey§ÏáÝ\í@£4—íi·t% -®’ñÌÜß.äPŸøÛPðƒ®­ú8‘äF&+¶ˆ' 7øû·­Ö\ëy9-é° 0(Žd0‰ÝdYpØK¹SQ—°2»{›±=C¯Êì˜õâ3´ \פUìSnçö-Áu ?C]C-.Ô?7.¤ÊjµŽÊ^xײŸÃvôì-ÎkOY¯øvÈÛB×Ýt©†?†±×mzÔéè:ûÔª†Æç÷7¦áî‡"2ncúæÀ!œ¦Æ|éá¹%¨Û~e5‘Ï üEpLÕ#X®ÎË\ 6ë9¿È×Ý‹Õöâ ¶f^ßÁ¥ß|]¼”ßÏe—g?¥9¸šn¸À¬RÃ\Ý@µí6áfªsëÏÀôevÀ ¯b:ËR’‰ Ûå€hã/H–Hú$€Þb;âyÊwÎ!c‹fê8ð¨Qh›3ìѬšyÚÍ”93ÁÓÐ1{L›¾%LCš±b[$+f…t+öæ”'$5Ç>ŸÕ¡OS[:uO@iÎ -Óš8³tüÌÕÿoœ'xL:´Uœnþëvßœ«éᢾŠsPÿ~µòÇ;à«þ-·€´sÎõÿ)oüË!Ë cædO$ã)|,œPJ‰¹ã ”PH»sÙÿn þ¥endstream +xÚ¥Z[oܺ~÷¯ØGITÞDQú éAÚS÷ÄA $~W´-D+mVÚίïð*R·=m±¢Èg8óÍ…äâ‚Þe<å)vyÁÒ ál·?\¡Ý#Œýr…-ÍGô&¤zw{õ§¿Ò|W¤'|wûÌ%R$ÞÝV_’w)N¯a”¼ÿøËõÂ3D’·77~{ÿñßðž! „’¿¿ýíóÛ¿™¾›ëÈ~ùðéúîö׫·^˜P`Œ¨’äûÕ—;´«@î_¯PJ ‘ížá¥¸(ÈîpÅ2šfŒR×Ó\}ºú§Ÿ0ÕŸ.)€e"Íã  +š”“e5á4Ljr†SR0êÕÄÄ’š•RÓ«/mww’ûó©—Ó%c"RFhðÅwO5gOhÀSš2”‘˜ÿ­Òw÷øØÈë7TàdxÒ ’ôr®qR·æ½{ˆpòû{óüŠ2tºÆ"Ñ‹¨»ÖÐW²¯MwØÐÞ׃iÔí„Ý÷³<½\cŒEŽXrûT÷Ólˆf>ºQ*Ó(ËA8-2X¢ZY%Ês3¼RL’ç§zÿ+Šä ˶W‚‚p  @/Ï3Z՟ז&Rbž„–¦íN‡²i^̼½l+%! :ÐÇiFÕkÙÃêTÉï²€^­L•ç¡;”C½7³ª¡ªîËûFVf¥³”#)Zêó“lû(}j©³Pj–Ïyf¥~Õö½,O Žùú£D·¾î´00Ü«éÕp*÷ra&*RšqbÉŒyµˆÝq€u÷æ¥4š2/ç^VéÌï­sq‘§¨@bÛCªuôTÞC•D.H8 ¾MöžjÎâ‚E +¸±ÿÒÖ£8ëiˆCË(É´]Àþõl1*RLòl·‚¦3F9 òpì´Cgž_"m呦€|êNõ˜üa»Úò @§òd§y°øo VE–"ˆN1Vv­27+’}×eÝêã°« Õº—~´éºoàºû|4ÏRÉ«ÁIŽMùbzý<ŸþñÖ [wìô³rTå`Fe©#CÄØ,ÍŒ?•:Z€ò¢…èrCC-m¿”¤Bäô~ª ü:*_ï…x!X0.Ä6oO5gCˆà”AsòGÖALÎ(¸É…ƒ4*ÙÈÇÒBŽåðdF´mºCô7–ëºÁt[è!ô += ö|FBƒ Gp>‘¡,¶¢ƒ•Bîù¨ +LÕ¢4n!ÞÅŒuïý‹í5™FL¼;‹@Á²Õ3,y2Ey +$ä²'û t(¿Ië€õ OÞM…Ë7vé$ƒ!ÃñÚµçjÝ£ïý-aV0bõ-ë‰jÔ« ºÊ(J>f𹆢¡iÌËC×4ÝsÈäAžNeÓÛáÑæ@à™6"ki•Æ¤þ§îÙ â"wLSyBvv¾;²<Z¡‘à¹ìÇLd»0„XE^¯Ô¡Ô°â÷çiNßöûjÝï=•÷ûý¡šy=‚ZÓ œ=Õœu 7È.¬`Þ£×+…q‹Âir<Õí`‚6t« 3¨ûêA!¤lÌû¾;d;¸ÁÉdÝy8žÝ`tõËŸÛS)xèˆb9.8ÈN‘*õ·K»,ÇŽF¥í:  •OJKoûµ²f„ÔSés/]‘VM­JpTd ]Õ?*#³%!<µBï-3qÖ@G  èB² ©6@ç¨<èÀ OÃj²Ùä=&›óådq¿1Þü°`5iÕ-ÕîÉôçÏYâÕ+#ÅÚuî­µð¤)ÿO +kèH+ã¶&Pr”%šº•}¢ü×&{þ¯aÐ)dÝPðeìPmØÃQ9¶œýjŽÙä=æ˜óåq·é˜ +ŸÜ¡éœ\µ_÷¨­Vhu¢0OµŠºê}ÿgušÃT‚ê§|p2%(4e%_«Í(éúú§ô Ö÷4ƉÍËÄ‹{kî®ÝDǽ„ê¥vÛÜ?’2ƒzh\ú*‚(ÏSÆÈ…ÜR­#ÈSy}?Mù"Í趖fÎuRS¨ža ±½5ò¥²ZÒ1Ù«ën]_nëQO\³'´VzW¯×'sÇÜ7N×(ÍS Uþ¶%F¢ CX¢Ñ*ƒ)ïY‹¬[¼ÇÀ:e¾WCîΪBÑæp•‰ß§(sp2î$¼¨ú­—ûñÅìd¨. ¥Ö54íá+ÌSZZ_8B[[‚»íïp>µ¦ðg…vºõbå¿.Wá5löã‹ÃV…öU0(ó +„.dÚjžÊãa,Ó⻎Äé6sO5ç> íà–¶mû÷a:{¨Í¶wÛ€H«.!—Ó`ko1þxÚò|½aÎRŽò )7¤Ú0Œ£ cÏzç» †Ršx›¿§š ÛÊlÊ‹%mÃœm˜³ ‹lÃüI1JF‘õëhZó0c¶d”[ó°Ð<Ìš‡Yó°ètyÛ<¬(fvÝ!Õ†yÕhžªªÕêÊfn®îZòm<Õ\‚Ø> )¥"– 0wæáÎ<<2OîÌÓ@dý>Ú‡qknì×ìS8ûðÐ>ÜÚ‡[ûäÞ>:˜ò"Í©˜TDFÃI¿ë¢u“9¢ÑbM³z8·Åv<››ò]>š ’6Ƹ²mßÈÒ6•<óxó!Z>®Wi˜«0ráâ-¤ÚP‘£2W‡õAþåv¥JÛd몴×å*-b Òøqy_5@(Ë;}Öïæj¥y¸l¯H»¥+Qp•<ËÝÁýí¡€úÄ߆‚tmÕÇAˆ„ 72Y°EI@Ç ·ØŽxžò]†sÈØ¢™úæN(¥ ŒÄÜqPJ(¤Ý¹ìÿnøþ§endstream endobj -1870 0 obj << +1899 0 obj << /Type /Page -/Contents 1871 0 R -/Resources 1869 0 R +/Contents 1900 0 R +/Resources 1898 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1843 0 R >> endobj -1872 0 obj << -/D [1870 0 R /XYZ 56.6929 794.5015 null] +1901 0 obj << +/D [1899 0 R /XYZ 56.6929 794.5015 null] >> endobj -1869 0 obj << -/Font << /F37 791 0 R /F48 940 0 R /F23 726 0 R /F21 702 0 R /F53 1017 0 R >> +1898 0 obj << +/Font << /F37 799 0 R /F48 950 0 R /F23 734 0 R /F21 710 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1875 0 obj << -/Length 3266 +1904 0 obj << +/Length 3265 /Filter /FlateDecode >> stream -xÚ­ZÝsÛ6÷_¡™¾ÐÓŠÁ'?òàÔnÎmš¤µÓ»›¶”HÙœR¤*’NÝ¿þv±DŠ”Üi/™„¸À.¿]ì.Å þòE¢C&SµˆSjÆõb½½`‹x÷ö‚[š¥#Z©ÞÜ_¼úFÆ‹4L#-î7ƒµ’% _Üç?W?Þ¼¿¾ýÏåRh¼ /—š±àû«÷Ÿ®ÞÑØÇËTWooî i&€ˆ#YÄ‚ëÛ·—¿Þ{qsï… -Ì™DI~¿øùW¶ÈAîo/X(ÓD/>C‡…ýqà z#ƦÝôu^äsn ß‘a8ÛÏ›Ï֦᣹»} z gc¹p:`aï|AfWø“nœ†zÖ!Akõ­µÇŒxêÔú½/öÏv!;qeiÉ­ž²5ŽWb¤_°µÕ[sTÆÖŠ¼n_114…C}ž±§šr> -_пÉdÌú QnŒ6gl‰×U€µeSÛ÷ =½sãè+w^engú£Kh/&´¶ €ÑwÖHÏÊBÁ œÿiÿ¿ó?¾tjºàà˺Á#›q àõ¤%ݺ‚û¨=ºéHÛÂD‰6Z h7zˆ:Ž@šHžâê4=•Ù×Ïuóë‚°²*ëb‚Ç( cð­çù{ª©c<Æ °(Kðq_bÜ£Dbõ´nÌ3oi°*+¨eô‰»W؈ç'`ø€ÏŒ ÚUÓÚ™f§K³UÓ‡èd›YîJaë±ßfõ’PÌ;rßÄ7˳U… 1Áðã7¼âHÓ¥€ã>ÄÅ:Vbû;»u*²õ# Ž÷DchŽH•Q/6b,Ü ¢J¦~ÙM¶†ÓĘH¶°¶=ÜcG½°Zdtù ã.14P„â˺(èaÆx*© \+»þ´sÕ`Ð $7/`z@uÓŽÊcz“•Õ4;„ÐQÆÑyÖžjÊû(Ž‘ï¤cÞט$)HEšŽ:©,zÍ«âû®-öO&oT6m€çsÓ½ÅAa¢L|“ÑãîæÇK­ƒŸ¾¹ŒUpuû.¤á{·ü!©‚EL&¥lî6#–Kž€ÔˆE! ì+–Ç=‰jîÜÇÁj"ßyW‡î¬ƒªFK³®ºíúÕ£b·øª€,¹ôÃîNBGANÅ‹ÏCgHu:žÊCgU@.²×ÐMkÌä xª©GÖb{=᪃Äu‡ÁpDžBDàFÊvWeÏvÐ(HtètˆÆhFm¸ÜRÏVÄw2Re:¿"7ø± _xü`§l­„]&zŒ w•P™0ÏK ÏÀÞÉu ùi{úHeŠˆ½j ©Î©£òG -Ww[¬'Ç©d""9ÏÜSM¹š8V|ÌþÇ‚ψCÖ þÝÍ×Ôž\^œÒjólM1ÀŒ<»+aÇ@àxÁßÙ¥ú ÓìúüÏ©7#O£Ãìïçd¡3WÜZrT»™dñYž—„.Þ¶1áhêé2Ä(ä?™ÂE“0qCªÓ@ðTmù°~ÌÚ™HG„1¬q–»#šr²ÉX¤rÌþkÃv) ¾p‡&æ¯uÖõÞ4O°.‚v —7âÇVZzW¯i˜V`!n»++ch>ŒÁÖòz¦ ¬ªTªÑN_* ‹0M’d¾ ¼ô+¾ §´b¬–»Û·_ÿëêîæ4@éÂï<Tgðਠº}E§åoÅóë/àÏIÔ‰Èo'£GÆçÊÎì[GcP1S•*Ô©/¦}94#ù±”Ÿ&‡òÔRÀ²7&lE€éïnþëJžp,I*ç‚æC`k. ØÆ8s®£ì\À•0Ò } 1Z”&fá[ô2© nø·Ö+5Ÿ dS¬IË—Y—ù¹’gTMó1ØÌ–u i¹ÏMÅo±þÍq"Ô,v³ÀSΖª(Næ—WMbÜ'¯Æi§®´ò¯ÉßØG‚ÇpIÌWí¯vWõl†üp©¿íÞÊL|ðÀ[iæ¼´f½•ˆÑ•ªt!ÊøO½•_q9\rj®\KÌe|àü—¼•èó„½ðÅkHuÚ[y*{uÍΔÒ&qL‘Sç¹{ª)û£ë‹‡±æñ˜ÿ¿˜Kajû™Íyz¸ÊàÅñUÆÝUFí]±Ç€:M‡ -mq›R™g)„NÓc8Ák®›AÒÅt<ÆìßÃÇJœ´Ð x•þsŒ¹—Ã%g0†f­„>pþk1H”¾8©Î`ÌQyŒáG½“‰óYÖ‡ÄyÂ{6qñ¾­×UŸ» ²>.™¯ž6ÀÔ›û‹Wߨd–±,–ñì~ÝÕ2ž¦bv¿ú9ºúøñæýõí.çÒðè »œΣï¯ÞºzGk/3]½½¹ƒil¸ `1®oß^þzÿíÅÍ}`¦Ï°à +9ùýâç_ùl|{Á™ÊR3û ÎD–ÉÙæBÅŒVʯTw?„½·vë”´I™‘:žÍ8Q™˜gÜÀ±ç‰æ,‰¥bÒ锘<ŠéËzÕtíëëãã +%Ys1ëãQPcÒRõH •°T‹#ÚwEw9W*‰ºÇ‚õ~³(v8Ž£fMkÈŸË݆ÇüÉíèzæÛmq)¢|GӲƽúÆô¹NÜ•J\ƒ·àb•7`<&âç$&oZ«’Dµt’"†ÇÈd"VñßU.6òäÎ]Ɖf<ÙyŸÚ‡:íS”õ©‹ýº-ÿ,^¿yU­AäpÅgi¨1ñ¡WÕK²Ø ©[¯*½5ãàÓõG€¶ùƒ[&Qük«ëhèÀ1Žâ(_=»®lI¬“@Ûë÷wÜ¡ŸòŒ2N0{ey3q;ÑTâÏ]Ñ2ty‚¼™e3ÿ£Üì74A‹!ó†éÄdC;Ù”µƒM2{„–†=ðÙ=–nep^˜,&±1ʸuk¢0àô °vKzZ=_ +!"d9K¢Ÿ0…@wë©î;ôäÒ)v9ÈOXZ0¶ãf_¯ŠÕ”ØoÉ0¼í¯šÏΦ!àÑÞí®ÝãKð!_¸taç}Aî0üI§¡™sH0ZæûÖÙcN¼uý¾/vÏ‘Û¸p°äVOÙšÀ›l­uÆÖ<”µµbU·¯¿šŒ¨¡9O8@)¥/èßT:$}*Q®­4RoliUµeS»÷ =ƒSq¬êk_åÊí W—ö´&|ˆLã€ÑwÎHÏòBÉ(8ÿ¡¦ýÿîÿ86˜Œ“ùäà˺Á+›p àõ”!ܲ‚xÔE:’Ŧ°Y¢Ë–† ºƒžTD“ÄÀM¬Î+bê´"({®Ÿëæ× $aeUÖÅHã”%à[ÏÓPc†ú˜@5ÀãlÈÁÇ]‰y–©“Ó²±ÏUK‹Uù[A#+OÜ}¸ÂA2½Ó|æôÑ.šÖí´'Û£Ú9d'›ÜQ§T +GûM^ÏIëbà9æGî›èæ«|Q!". Þ`þ†A!‰ \).Nбj¨ØPq¾uG‡¥"_>ÒâðL´†æˆP9M1°aáY Õ* h×ùn`Ùnw¹ÇŽz Êê Sðéç]²o - –õYÐÄ-ˆ„i¥= „•íþ´s5`Ð)7/ètêŒN{¨ Ó뼬ÆÕ!¤Ž*‰Ï“PcÚGyŒ‚|'Ò¾Æ"IC)Òt4èÐñ(í´×¾*þpïÚb÷dëFíÊx>7{‚wzPØ,ßäô¸»ùñÒ˜è§o.]ݾc´|ïÑŠ*@b+)íj· ¶|ñ –-JYà\‰:Nì‰UsKTV›ùN»:tgÅP©j´4çªÛn¿èƒcVì‘/ +¨’KÐ~8ÝIÕÑPSqÍ“óªÓ‡:­:*¨Î¢€Zd ®¡)d¬ W/0 ÆY‹-ìÍ…« +×-&Ã1y +ƒ)Ûm•?»E+l@!Ñ¡Ó!+iXuérK3Y±èÅd„Ê+t~ÅÊêóXø"èNÊÖyAHÙUj†:áC©U*›æ.a¸˜\·PŸ¶§¯TÅLÆü…T«uæJ=T¸RÝm±]§áP‰Èô<ñ5¦>¼NHk’D‹!ù H>Z¼#U3ü»›¯i< +^‚Êjûlm3À®<û—+áĪÀ1Âß¹¥Ûú 7üúü/hŽ‘Qdña÷‡÷S¼Ðkn-=êÝŒªø|µ*;H]‚mcÁÑÔãˆÒKÄ(å?¡*ƒ@“ry^úP§!@EhˇåcÞNd:’%€ã,u4¦>T¨&™©!ù¯-Ù¹„üÂ_š”X¿>Ôy·¦)±y‚}´KÞ¨?®ãÐÒk ½v`SX‰¸Í¶¬¬¡…4Gó뉆°N%Ó™Òƒ“¾Ô–,KÓtº!<_‹†[X9ËÝíÛ¯ÿuuwsZ@è1ªßy}èAÑeõ¡Ûí±é4ÿ­x~ýüéDtªÎ³ Æ< µ",VYp©*hŒn4Â?XÓî2öÔ/Ã9ðï6£GÆçÂíÜ·ÆjÅD Tif²ÐLû²oGüc+?Kí©¹´76mE ÓßÝü×·<áZÒLM%͇ÄÖ 8Æ°ó®£ì|À·0Óe!‰…-ÎR‹øÖ6MŒ‹CIµA¨«¯&2ÙD0¡âø¥L6NC¿ÇU™@£jšßˆÈz²¥h&uh)Ú®_OÍü›"&%“™O›ÁYNv«%Sæô"Ò ¬R +~pÛ‰‹Èý’<Ž+rTª@$=qauî¾ïÙô]øá2²ïzþÊn|^qÏ_îýŒ&ý•LЙêl¦¸`BÙ?öWã¼rl°œK"Tr ü—ü•å)á›Wê´¿ +P!~uÍÖ6ÓF™L ¹×穨1ù£&XbD2¤ÿoÔ˹´ÝýÜU";3xqÌ„f4Þ;L i’Óv8Ðܵ…m!•«¼³­p0Ù±:Ág¯PAÙÅÍ‘Îþ=Øë›–&eUãë˜Ç8Ð1°j£¥9Pþk:&à({¡tîCÑ1t ?ë,Ï’>”Î#Ú“¥ó€öm½¬ö+ŸVÖÇ-2ûÝÓ¥˜‡Zôöº_HÚTÛ©E:|«ÐãÈ'óP ‚­A·R0ˆÕàÑŸS§êûOï°*½¿ýøî†ÐüðéæÇÛ›» ï ^QÆL‰ôðÅSB‘ýæö=2¬³(£…r³­ì—¿ÜeÍÚ~-­‰¥x±ÿ"2µÚýv ElK”Zêû’$€Šm…m+Ç +¤´&† Ô´HÑ°»EtQ÷ GX_”Ži¬\4ÁB(KÅQø§ó)®¨ÁµçÏrdק¿÷¡÷5܇ÔùÔ§3¡Y–d^6‹¼Ã¬I`p)"<%N›-r~IM„Ë_¸ýn Ý£mâR ®/sÇý¢8p_•ö‹4¬’‡Áu›¸XŒŸki0@4H@"fþ@@À«ÊÚ¯\ÚcYm½5¬Fl0á¥(å¿åÀh IbV1µÇßÀà ÷IÑ™ø +‰ +O½ ©¡ð°w_® ™¡ûÆ܆åÜñS‚%>•«½-• DZ¯<Ë…ã˜tÎ5kq¥}3ùƒÆ«¢]îÊ…ûü4bºÐGÅj¾hž +üm „ wÓ’ÓïlEŽ3{ï¿Ÿ=÷¤«YqÐvÀFî³V„ wƒ¯íÝààp‡‡Hï·,Ɔ¶/ÜsÉÂmÞoÝ>«fÒ_o^MumûŸ3ž·Å‘Ž,«¼=Ö{ºi +ßלãl›}µfl¹Wõþ”Ö#oz¬W¤wU³ ‹OÈ$¤û¹ >ƒ&Äž/«­Yè_á&Ï™û +>œ¹_¨ØE›­;¬`ÁÕ’Ôß· íðh¼1Û¢Û6Ãl­ŽëÓ· °?Ûí¶¦Q¶¿ïz¸«‚^‘RÀôK;ƒÕý¶rëä…¤UT¡é:ÝoÛMOJø¢§{0#•äò$‹pÜù©_Š)¨ÒÕä‡Bä?þÙá7r2üò>™'€÷d +?æ˜B± ž³n06¦2™àýÌMÀxendstream endobj -1874 0 obj << +1903 0 obj << /Type /Page -/Contents 1875 0 R -/Resources 1873 0 R +/Contents 1904 0 R +/Resources 1902 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1907 0 R >> endobj -1876 0 obj << -/D [1874 0 R /XYZ 85.0394 794.5015 null] +1905 0 obj << +/D [1903 0 R /XYZ 85.0394 794.5015 null] >> endobj -1877 0 obj << -/D [1874 0 R /XYZ 85.0394 179.5067 null] +1906 0 obj << +/D [1903 0 R /XYZ 85.0394 179.5067 null] >> endobj -1873 0 obj << -/Font << /F37 791 0 R /F48 940 0 R /F23 726 0 R /F53 1017 0 R /F41 925 0 R /F21 702 0 R >> +1902 0 obj << +/Font << /F37 799 0 R /F48 950 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R /F21 710 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1880 0 obj << +1910 0 obj << /Length 1912 /Filter /FlateDecode >> @@ -8215,83 +8351,87 @@ xÚ¥X[sÛº~ׯ  aWš½ Ná¸Æ~<ö¹$ø¥?'q•è`á?í4Nû*mUx‡S`ÎH†o;¯ïæ³÷Ÿn†ÈÇ'TÊ–¤TùšcØʵ2üj@xM sŸ Sîû¼½<‹¹ÅÓanö†YÈó§ÌI—(u€B`b*©#¶mwB^Ëë£BÛòøÀ}5ãùK ÙF¬šDÞ¶¬ÏP- HeˆTËã8¶¹½û„ï»Óº½G¯WªI¯*Uëâ•À _¶iÇ0ˆìŠ¿üû·ÏÜü犀U:d=Üx~sƒÞÏ>Í?_ä÷•®ôÌpè;ü£áŠÌ£ž0+ëZ¥Óïjÿ¢ÊÞ¤Ý@Ä}è¨Ád‡Ý—Ûð”õ‡J‚ˆ„~·n\*Á³·kìý×ó‹nAεgßeý£×gH÷új´ÆÎÚ¾‘νÍ:ûÀtØÇ^ÙÝ ä¼› ®m0ÁOx8ûvŽáásϩɸ‹ -nþó{×mEÑÖý¦¿mò"oöçÓ1›ïK½©á|ÑŽ`$Œà1FPQ@å1ðy€‘Ü7—Óð·0šÁ©ìi8å˜îË[ôæ¢yb>N“YQVõb÷úÔŠÒ¡BS˜'l/Ó´HêzðUB,-ÚEÂû…Â'Qà· Xfº9«/Œ~¹¬p»~VƒÏÅ€p.Ù±Ææ¢Æf¿üú!H̨<Ö÷÷‹úvIÞœÕ':}ø ‹‡à­ Â0>N×»´,’—¡]$‘at‚‚ìzëaíbeX <ûnÞ™]™J»£ñS{ûd(M‘ñáÏe<ô ü9h2N2˜Þ~};µý¿p"5endstream +nþó{×mEÑÖý¦¿mò"oöçÓ1›ïK½©á|ÑŽ`$Œà1FPQ@å1ðy€‘Ü7—Óð·0šÁ©ìi8å˜îË[ôæ¢yb>N“YQVõb÷úÔŠÒ¡BS˜'l/Ó´HêzðUB,-ÚEÂû…Â'Qà· Xfº9«/Œ~¹¬p»~VƒÏÅ€p.Ù±Ææ¢Æf¿üú!H̨<Ö÷÷‹úvIÞœÕ':}ø ‹‡à­ Â0>N×»´,’—¡]$‘at‚‚ìzëaíbeX <ûnÞ™]™J»£ñS{ûd(M‘ñáÏe<ô ü9h2N2FOLo¿¾Úþ_nê".endstream endobj -1879 0 obj << +1909 0 obj << /Type /Page -/Contents 1880 0 R -/Resources 1878 0 R +/Contents 1910 0 R +/Resources 1908 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1857 0 R +/Parent 1907 0 R >> endobj -1881 0 obj << -/D [1879 0 R /XYZ 56.6929 794.5015 null] +1911 0 obj << +/D [1909 0 R /XYZ 56.6929 794.5015 null] >> endobj -1882 0 obj << -/D [1879 0 R /XYZ 56.6929 581.7741 null] +1912 0 obj << +/D [1909 0 R /XYZ 56.6929 581.7741 null] >> endobj -1883 0 obj << -/D [1879 0 R /XYZ 56.6929 460.6765 null] +1913 0 obj << +/D [1909 0 R /XYZ 56.6929 460.6765 null] >> endobj -1884 0 obj << -/D [1879 0 R /XYZ 56.6929 366.7195 null] +1914 0 obj << +/D [1909 0 R /XYZ 56.6929 366.7195 null] >> endobj -1885 0 obj << -/D [1879 0 R /XYZ 56.6929 293.4426 null] +1915 0 obj << +/D [1909 0 R /XYZ 56.6929 293.4426 null] >> endobj -646 0 obj << -/D [1879 0 R /XYZ 56.6929 247.3727 null] +654 0 obj << +/D [1909 0 R /XYZ 56.6929 247.3727 null] >> endobj -1886 0 obj << -/D [1879 0 R /XYZ 56.6929 211.2315 null] +1916 0 obj << +/D [1909 0 R /XYZ 56.6929 211.2315 null] >> endobj -1887 0 obj << -/D [1879 0 R /XYZ 56.6929 172.539 null] +1917 0 obj << +/D [1909 0 R /XYZ 56.6929 172.539 null] >> endobj -1888 0 obj << -/D [1879 0 R /XYZ 56.6929 96.3402 null] +1918 0 obj << +/D [1909 0 R /XYZ 56.6929 96.3402 null] >> endobj -1878 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R /F39 885 0 R >> +1908 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1891 0 obj << -/Length 4197 +1921 0 obj << +/Length 4192 /Filter /FlateDecode >> stream -xÚÍ[[s㸱~÷¯ðÛ‘«F\\xOU¼3³'Yïdìœl*›Z¢,ÖJ¤F¤ìx}ú¢¨ÕlååÌ<j‚@£Ñýõ°¾Vð__»$R6¯³<Ž¥“ëÅöJ]?ûﯴô™ûNóa¯o¯¾ùÎf×y”§&½~\ Ær‘rN_?.ÿ9»ýôéãý‡»Ÿnæ&Q³o£›y¢Ôì‡Ûû¿Ýþ…iŸnr3»ýþãþL v2Ø-U³?þøðxó¯Ç?]}| Ü 9ÖÊ"+_®þù/u½Æÿt¥"›»äú~¨Hç¹¹Þ^ʼn’ØZOÙ\=\ý5 8xKŸNI ±.JœÉ&D`ôµÖQž$æHI¥ÖX’Á‡ï?ß}z¼ûñWCßôbS×s“EF©Œ:¯›¶“^vÐËèÈÆ:cŸª½™ÃJf?Új»Û”Øv³CWmªî_¬š=7våÚÛª~æßiš_»ämr;»ëx?~ ß›ŒvhË%·º†Ÿ‹¦~)÷òQ]lËöøýÝ'ás¹Üßh7+ÛºÀâ`ɼžy,«¨a|“ºÙKµ(¥UîÛ¸³©ý}]ÖL­~4êóa[Ö]Ë$\1=w]ÕÔí° ™Íž«—²~7± }‘Š“X„|n# ìpâwb·¯ÂÔ?Úuƒ"¡æa»-öo*›F™GÆ<Sv‹oöeÛl^"@äÕÿ°Æ4ÖV>ˆØ,¬5‘udŽ^>®Ë‰)¡‡N3/¥y11‡Ž£8Àø³J¸xè!Hɪd¥å—CõRlH9HFGב¯ò‚›`(«Â’æ/92 ³hÁ‰NÕ™H[m.˜²Ž\’ù <÷ÛâÚ'ª´ám'}nïÿq£Ðü¦À˜iœ»cÜf×gµ=#8…„ðD„ñ~J æ™ŽGÂÀ!Éá‰þ}Ê/‚¤•±æ"ªÅ.Ö#T³³@|»ë„ùŸf¶¬ÚݦxëWD‡o¹Áæ½hè¹îØììצ.'`Ì€à@Ž Îyº Ö’ùµ¬h†f+¬zžEÆ`õ -Æ„µ#£·OkâYqèÀÝW]ÑATÁ$>IoÕHfþ¡!À -\ Fºàc×ò5Î_3¬õãÅÇã1z¢»øY)S{†È‹Ð,òFzØo,T\ :†3qé!Ú ]5o.+XÍx ~°¯Á‘<øŽùbZOMœÕÔjBÕý D¸ €¬e¸À7lpH)˜@á-6Ðònôì‘Dá¹Øm;¥BZEn7O>èv¬Cyä\ÀBÜÀÄÀr+áŠ"œæ©ä'ÇÍC†ƒÃÚ˶j–ÂàÞƒIä´ƒï×EÓÖ¥lsGMq‡Í‹rH ŽA4ÄE~ãB˜1ÌcóÝ=?Èïê®ÜÃ̈æ£Íf|ú?‚°rÿÔ´4<ćnwè¸ÍCBä]Öå¾ß–¡ªN„P^$IP‘óÀ›Іƒ$;‡Ž6JÁ_x­[N»ŠD§^ëöSš SÚ$½ào`}âoz  *D¼×²Àók#" ) üX`6ð“â% ¾JóQþC¢›‰³Ùº@42±%$ÙmÇ`÷R-i€ÂÖŒŠÅ/¯E€[|ÉÉ@퉳IvPs« §;®|©šCË£ 6U`m°†wL™Þ›Äà­R{a?b"œ J˜·}­ºÅš—Ë©Åm¦.‚Pæ$È: —ô†UM1 -ûgÕ8ZÇÊR»+F9¡¾D -¾:Ê…‘ -þŸëP˜Ý#å¸Å£K'%.&Ò.cãîSÝÝ?ò_ ¡š–|ÞÇ_¿G‰³Ù±vU’v|þî½v`L¿åŠ½ÿõÙÄÁ -rrû™«¥¿CòFE*f9¿Ÿ¹l–œÄ\±ÅD £šØÇ“@ªÛ'J©HЖMß‚[ ± "ún>É >­EðI‡<ã|oCŽ©q¼N¦jø÷“L ép þŽ·|ÉïŠ'È”EÞ¹öRŸ -*o@ïÇ.Äï È|ðw>£m’ÄÌÐâØáÐ2vPŸ’5 -›-¤ %—Eh¸Éh)8ùììž Áø’p‹Z«ò•áÞ‰¶`«rp@ 2e4q|leø’ÉI³R÷³0îÒtoÆ1RÁ³-y‰‘fïçã)|¶7J†ØÖ§K2ã‚ŽŸã¸¨ê¦Ø®pegK;`þËÒ&ñ9Å°ƒ&|ƒéÉž²›Ùß>`…-ö¾¡ÛWe˱3Cù<6hÑ’ÂÀOÎx ÁfÎk]ÔÏloFtÉÓÑ‹É!â×}%çó„JN¢—S±Y¤MˆÀª&K˜& éCU/«(¾,vݼŠs ÝÆÙÿ¶¨ßø´¤«¶“Ñ„·Î9{±^bœMê%8(Ë~WzT)˜ìKH8­ Ân)†[7Bz.¥!Ï«Ç=°ËØ:ñ7øÝÓ<žã ªN&DàÑNËPw«©BrÒÏô1Îo‚Ã=Ö‘Ñ*êò¹èměү¼”æÝÈôóƒÒÚ1ó@Ꭽw°ÚÛŒðsd3÷M=Ë=@vó"þëËáÓ]1ë-À;Z²”®/•Í™Ø=O£,s^µçû3Úº'ÎÍ|¡”'¨„Þ…ƒqnž„Þyøü ?CÔÍ”Á"}Ne iÑqzâÛ*øS£´Œa”š=¡F¡žòû¤tP_hòÀDâA~æ.\m’/JWè\)öI LŠò0Ù¶,+…0'L)–¤P’W!0.«öߧËàŒ.M@8™;vR÷T[$6ú(ü øž¾b³y™Ìw`™&¶ñ×ä;=ðÏc§ÏÅ€Y¤t@¤s:¦úêiP à•SÜ) K3ºøòyi Ì FŽƒn«mµ™RBã©„˜±"W£ø¸”ä'òä*¨ÊSX(ƒ)OF*J5Ð,Gý`ãÈð(ûÔŒ;ÊV ?(Ž°NÍÊïÐSûo‰ixöªQúdÛã^Ýšj'£KhìÕU$Ú±… ¼î™ë¾ØŒ²‚†ÌYûS¤Éäà[”‰rOw3Î#•¦—7ÓjÙÊ¡pT`s¸G;ì…¯E¤£ö\†˜)P•ÇsJêâ %åÊMF¹<)q -îï½ðTÛËß:æ™Õ)I!Mããm «çµøcq,„‰Fêp¢—Ål…¹Ÿ*ç ŠPŠCaaÝ«àÏ}©;È9‡(O8mÇ÷¬_UP"<‚ïÞÉÁ¨EÎøô5•“b_‚‘*ïíOß}îÏëü©íegR{mT¤mª/ßÎHÃôd-V$QÖ&óÙ4ä&A֟Αd²kö”ÉdæÜé@,”Ãæéÿã5¦>¶1xY*PìPõ+ÿ=[Ä.:vÓbp&=9u’>:'‡#Æ1~"…ÍÛìy ¬"ímWNÅþ:K#•…*(°N^uÉœö(÷Pœä‹SÉ7æÆ×ÇžëêWæð„‰ÿE4ÏfïïoøøŽÉXd$Lâ¢Q,üðã-u4³‡»ï¥õç|þK?õ PÞ@î‡x¢óÉNÚáX1þ(ÙIM(}½lò<Trwêuû˜a[4 íSËSÂ_±“c†Ý¾‚”J„‘Û(NM>­}¸õ´¥ó²òo…4ÈQA:±¸×r“ÓxxÇÍgXG•&× ñÃOÜgTìÄny>{:È°Tqù¹ã -GV÷æþþŒžŸO8ä+0€¹uF{d—[y¤“Þç’6•SÄÔgÖ_ñ˜Ûdb}6‘²ö«V“æ¢ð #¹Xn3}âÍGœ| ãZHc\¥NG÷t€KÏ6_Í^À²é«tžñ)ìñÝÀᵬ©[w`ÐÜ"éÁs"ž¬ -Ķ+öq*º9PÂ_Ÿ@_ÏS™þXØ 0,Q¡:?0y! ÆYÖËpæ¿'_lüùþfÓ¼Ž¿ë+]I 7+ÿá0ÇX¢Œž¥Ê=—tåðmlœ¤™;{Ì5 -SqEZ ?_ ‚+W)°QðCj&Lð“b¹ÚL„¦î•6|Vg1fÊáy-ÓLgN‰‰²4ä8ó¿Ÿ9aqý ËäÁ"ޟʳpPózn˜ôCèÐT`Úÿ&Y”¤yòõ¬`‚åž;êK5øÇ`ð_{Ž5‘w¯L®üz2ªødy ÄÞÓˆcB®Ú‚íÕdwI’O— ÑX8ûªQÇìl#ØDEµš[.~zÛR¿.ªQ¿0ÖÙ0L[Êk¾ßAcø7Ⱦp/—¸¬=[M"[÷[J2c%x¹þÈ]ô.'•( ;ËE:M/c¥1#°ÄÁËZÍŠëØ dÞ2]êƒÛ’«)B >ÿîMU®Ä:£‡NbôЃÁñÐÔ(øxƒX‰|ã¹Ì$šKic7sA¨6NŸKÿf5Q?ƒk¹?!÷(ÊÿiýmÀWÛÃVnÈÒð*•‡aÔ­g?=@rÝõ7/Îü „Å3;õ *üQÂý÷ýŸÄHÑ™þOŽŒ[A˜dsí™B k•YIqÊû'Á endstream +xÚÍ;]sã6’ïþ~;¹jÄàƒ$À«ºgf’õîÆ™{osµÙZ‚,V$R#Rö:¿þºÑ ¢¨Ñ¤öåì4› Ðhô7 y-à_^Û,ºH¯M‘&™Ùõb{%®ŸáÝW’ûÌC§ù°×÷Wßý Íu‘¹Ê¯Wƒ±l"¬•×ËÌn?}úxÿáî—›¹ÊÄìûäfž 1ûéöþo·%ܧ›BÍnüø€¹ÂN +»åbö§Ÿoþùøç«‘š!ÅRh$åËÕ?þ)®—@øŸ¯D¢ ›]¿ÂƒHdQ¨ëíUšé$Kµ˜ÍÕÃÕÇoý§SÈ´M2«Ì ”¼–2)²Lñ +’\+íyðáãÃûÏwŸï~¾ÇÕøoz¶‰ë¹2‰ÂøÎë¦í¸—ôR2Ñ©…Îاjoæ°’YIM[mw‡°ºjSuoôbÕì ع=ÀÛª~¦ç÷lšæ·Ã®~«BÏî:$Œ_Ã7åfãZ·$¨k¨]4õ‹ÛóGu¹uíñû»OLçr¹¿‘væÚºÀâ`É´žyä,«¬a|•ÛÙKµp ¹}[u:׳¿¯]Mغ¡¶ô£>¶®îZBáŠ}»ëª¦n‡ýüfö\½¸úÝÄF€ô%"ÍRfò¹P°ÃY؉ݾŠS—Ô´ëYâÁÃv[îßhÞfEÈ*ô_4ð–Lü0¨4RŽölªÚ‘–Œ—Š(Ï.x­ Q›écá’E’.Ü£©5ÁÂE6.%Ŭ[;–Ͷ¬óRÒüºìŠ4Ôç‰{ l¡Ä |Øy3^ı(kÊM;ú® Óv[ΗnQîîÓKJ"E¯üÆ÷_/šMSÏ™·´¼#Y[ºMµ­:¤OËÎʆ¿ŒÖ3\;¾y]W‹5u_”­› iT’ªâ¢eRn¿V› ùôFÓ,ݪƒYb¥ƒï×eÓÖŽ·ˆ¨ó »Ãæà…bã†c qÑcظfŒ ¶ùîžZ4äwuçö03ZóÑf“}úoÂÜþ©iýðºÝ¡#˜†„ÈÛÕn_²o3(ª!„YEä¼á-”Ö†ƒÌœ³Ž:ÉÁ_©[N»ŠLæAêöS’ Sê,¿ào`yâoz ($´×¼@ókÃ,‹) < 4Ð ü${ _äÅ(‚!Ñͤf¶.Ñ©Ô‚zÞnGÆî¥Zú i3v*¿½–ÑÜâ;HNv`Ôž(›$5×rº£áÜKÕZmSÚkxG˜éíÐY +Þ*×ö#•1‰¬„yÛת[¬i °œšÝfneN‚ü§ÃósIìË…$O§¤$%ðßT¸º|Ú„`í¥WÁ +Àû%%d™5ÇZóWoëĦÛféò’më6nAª¢¼ªøöL,Ît;¤óÍ4ÙJæDZßÑ`º<`HÛ©`(‡à·H/êd®là]L\pÜ’ï¹iû²nW> +VAC‡S»,Q•È/¸vR¤½Yök»)ÀòdäÓA@lžçÇ’Bþ Ô’iȧö$;hš½1 ö¼@) þéñ3a(ªÔãä' "ѲÞ~w dW=ònE-èßSå½:>̯§4É 0ªüBX®²˜ßøç,E>l#}²6ɱväžX¶=kÐ’M¸‚3~†ËzŪ¦…ýÓb­ce©Ý¹E…QN¬/ù@_åˆà‚= Ã§:f÷ˆ9®DÑèœÄq‰‹~—¸û”'w÷ô*!¾¦ÅŸ÷ñÇïIfµ9–®ŠÓŽÏ?¼—”ék®8øßM‚AAJn?Sµôp^‰DQ-ç÷Ó!—6ÙIÌ•jLÄ0ªIC< ¨ú°}ò)5 }@¸eÓwóÁ-àÈyúŸxÖŽ"ø,Icžq>€×±ÅÔ8^ÇS5ôüÄSC:Ü‚¿£-_Ò»ò 2åCç#ïB®O‘W ÷cöø>ø€»ŸùmÇÌ qìphÉvø>Ž€š…` )ƒ£²ˆn2ÏÏ ìn,ýá<ÿÙ@o]aJIMµ¢)}u‚(.šéL'¢±cv0Åʲ£²!h}póéÙ=‚ñ¥·[Z¹W2÷–¥¡>ÈÁ1ÈäÑØñ‘–áKBo8ÍBLÝÏBv×OçÍ›²d© mÍÁÒìÃ|4EÈöFÉéútIf\Ð subÝአ./àlitÀâQÀ¿YÚÁd8U§ö4@¡ +ß`z²§GÒb5ûÛ¬°¥Á7tûʵ„`=S>¿‚fƒÍ) Tõ²Z€àób×Í+3±ÐmœýoËúNKºj;-Axk­Õë%Êêü¨^‚ƒïw.X•’С„„Ó²ÅA³ëXqë†QÏŽy^ƒÝ½Lµeƒß mZ°çøÂW§",ˆÖNòPw«©B²î9²ç7ÁâžëȨµ{.{ ªô;-¥y7R½Hü ´vL< ˜¹cG¬ :ÃôéÌ}SÏYsݼ°ÿúr¸Át—D ŽG”,¹ëKÅJs&v/òÄD{¾?#ý§¡{fíì!Ji‚ŠÉé]8(çÌã»`> įuf°ÈS)HZdšŸ8ĶŠþT Éc(!fOè†å­žû$d_é`"ñ‡ ßØËWÇä˧+þ\) I L‹ò0ÙÖ•‘”’‰c¢D8ËT,É‹»ê…ü÷é2(£Ë3`Ž±ÇNƒëžÂF"Ð@áÁÇ'ІŠÍæe2ßeªT§ß’ïô†žZy.4‰Ñ"“1ÑWO£­”âNºÜ€¡K/Ÿ—¦È jä8è¶ÚV æ‰JžÄŒ•w5‚ŽK=ÿ˜ŸTfp0……2ˆŠl$¢¾j +”RƒGÙ§Š hÜQÒbxðq„¶bæþµCO¾õDCÛ‹†  ‘m{uk_8Cc;¨®"úÐüûQBë n¹îËÍ(+hèÈÌÛ@ãþi29øþô„MàTrP](yÙo±ÎhÉC¤< ÀÅ8pýˆeN ”¦ç¤t´êëBÓÙ¬µr,¦8Õ.ÅìÀ'b >ñ¼ß“X|9TQŒð¾{LJ:¤>vÆ6TUNÊý}†ë¼·¿üð¹?± ó¸¶kÿHª»hbŠ6O§w1ÏäIuÏP¤ékØ“öF$Rç—Täqz¯/k’ÈkeB> (¾K`úó9@zžìš½ÏeŒúŠ¤ + bóüÿñóÝ(¼.•Ov,Ž†•ÿ‘­ÎR»3 +«ò“3XË $´t<¢,YPÄ:L¾€@*âÞvn*ú—&O„‰uPÆ:yÙÅXªtÅrÆh1™|#jB…ì¹®~' +OˆøO´çföþþö§ïUA²$‹@d4Š†~¾õÕìáîG†þò‘N€ý£œ¡òÈþОˆ,Ü}²ŠÒvh#)*&[®J¦¯˜Mžè‚h@öaó‹R&MÌñÈlùYü>µ4uÉô•;>hØí+Hª˜…NÒ\ÓÒg o)¤\Š<•±½§‚aÙ¦CG¬ïµÔ2yÀy–b ïè•÷Ó/ÔŽê<ꓯêB_1ç +ì`WAŠ3õÕóõ41ÒžþÀ˜¯%Ì7ÏüÌÁ¶óMŒ‚® N“:ç“ÄÄÅU@¶]¹ç¸SøûUÉôõiôõ<‡LŒB²c™ˆ5ú àlèAA]½Œ‡bá;pôå&œòo6Íëø»¾Þ‰ä ³ +ÓqŒ'\ò̵î9'Ýȇÿ’J§YnìÙãdªTèÔ—Xj¨}-½%Ð|¡’®œxãÄM5ghêŽ,Ó†Nì4&Ä„9<¯yšéü)S‰ÉÓxÀö÷3ç,¶?g™<^Ä[T…‰Ã¼žft†ìÏîA¦0D¬Y^|m'NX§gOür N2ÿÆ[q#Q¤-›“«p’ž +?B£ ‚Ø{Úè€äN-(_í/ËŠéêS¦!$ë¯U~˨dÊôlÃæÉ×Öj‚ fö&4(' úuùRõ ™;‡i¿¦k~ŒðÉgêù.—Ögë¡Y¢Sm¿&%˜E%™µ£"}x•s(`Îß겉Ìss9ÛSâø®*îV¨6+*gS8`‚jÚ> endobj -1892 0 obj << -/D [1890 0 R /XYZ 85.0394 794.5015 null] +1922 0 obj << +/D [1920 0 R /XYZ 85.0394 794.5015 null] >> endobj -1893 0 obj << -/D [1890 0 R /XYZ 85.0394 751.6872 null] +1923 0 obj << +/D [1920 0 R /XYZ 85.0394 751.6872 null] >> endobj -1889 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F53 1017 0 R /F41 925 0 R >> +1919 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1897 0 obj << +1926 0 obj << /Length 1971 /Filter /FlateDecode >> @@ -8304,50 +8444,50 @@ xÚ½XKs ]uI7¢Ý(ñ¬¢û-ìxM’o}À&à £áàý&ËÕ«ñÅ.XšˆoÏÄ•ø:­×ã —•kqÒÝðaÿ÷( ÖsC¶ºÎ“ºþþÊHß4˜Ø{ý£’„9ßE!´à°! Å †0JHvëÍ|ùáqñ°ZÜßyüé<ÐtA‚#(0ÇJËcs8¶œŠrË h4¹Q¹Ú:`‰e¶-ZVc š7KË8A×ÝšŽí`­Œ–‘® ÏJO_>>:†O»®£V¯el0ýxûÁXÄ…ÙkÃ8p»Ðóaȱ´@ßR˜Á½i›=+ ˜!íT}v¼Šœ÷m.ÿÇ°mI˜]!¯÷n_ËüíàëÝN«½B’ó%#(IÄõ%’gÉ~ED0Œ!–ƒ%?»;óò³€˜ar~Á†ƒÕPa=™oË n1{wïäø¤§6É1oήéew×µ—ß²Ù]®Y¤'åQ—*o€Êgáo$ §u%N«M}5×–<%àbIoúKÿ_Rðj€b ºqD®Ç§§ôzxœR‡ë|póƒÓNò®Ûê8óŒÍ¤¨ã5×:¥K߆´ BúŸ™¾oK€²µŽ\ŸLÐb~ -{AÈf†¬ë‰ç$?Úa¹ñ‚>dICß/ÿKÝåð|T‹ý¸kàeXoЕV»E[QIw%†—uâT²®ÇuÖh¢×þ¿…#RÿéêÉîÀô‡ÿÛ=ýƈ Aý5‚žƒ±uJÇ„|Ùö_àKßÿ üî¡Uendstream +{AÈf†¬ë‰ç$?Úa¹ñ‚>dICß/ÿKÝåð|T‹ý¸kàeXoЕV»E[QIw%†—uâT²®ÇuÖh¢×þ¿…#RÿéêÉîÀô‡ÿÛ=ýƈ Aý5‚žƒ±uJÇ„zÙö_àKßÿ ýF¡Wendstream endobj -1896 0 obj << +1925 0 obj << /Type /Page -/Contents 1897 0 R -/Resources 1895 0 R +/Contents 1926 0 R +/Resources 1924 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1907 0 R >> endobj -1898 0 obj << -/D [1896 0 R /XYZ 56.6929 794.5015 null] +1927 0 obj << +/D [1925 0 R /XYZ 56.6929 794.5015 null] >> endobj -1899 0 obj << -/D [1896 0 R /XYZ 56.6929 684.0716 null] +1928 0 obj << +/D [1925 0 R /XYZ 56.6929 684.0716 null] >> endobj -1900 0 obj << -/D [1896 0 R /XYZ 56.6929 572.8605 null] +1929 0 obj << +/D [1925 0 R /XYZ 56.6929 572.8605 null] >> endobj -1901 0 obj << -/D [1896 0 R /XYZ 56.6929 509.4701 null] +1930 0 obj << +/D [1925 0 R /XYZ 56.6929 509.4701 null] >> endobj -650 0 obj << -/D [1896 0 R /XYZ 56.6929 470.2699 null] +658 0 obj << +/D [1925 0 R /XYZ 56.6929 470.2699 null] >> endobj -1902 0 obj << -/D [1896 0 R /XYZ 56.6929 433.5878 null] +1931 0 obj << +/D [1925 0 R /XYZ 56.6929 433.5878 null] >> endobj -1903 0 obj << -/D [1896 0 R /XYZ 56.6929 401.47 null] +1932 0 obj << +/D [1925 0 R /XYZ 56.6929 401.47 null] >> endobj -1904 0 obj << -/D [1896 0 R /XYZ 56.6929 335.1577 null] +1933 0 obj << +/D [1925 0 R /XYZ 56.6929 335.1577 null] >> endobj -1905 0 obj << -/D [1896 0 R /XYZ 56.6929 244.1508 null] +1934 0 obj << +/D [1925 0 R /XYZ 56.6929 244.1508 null] >> endobj -1906 0 obj << -/D [1896 0 R /XYZ 56.6929 168.8052 null] +1935 0 obj << +/D [1925 0 R /XYZ 56.6929 168.8052 null] >> endobj -1895 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F39 885 0 R /F53 1017 0 R /F55 1025 0 R >> +1924 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1909 0 obj << +1938 0 obj << /Length 1658 /Filter /FlateDecode >> @@ -8363,47 +8503,47 @@ a ¦×ã)]»Ž‘VÊÀí,1ͨ1)À«»h·uB¶q¸»+°#Ii«€Îâ!©÷ÏqlXz¼”âmŒš¡Ñ+ëþ•c¨ÄÍ>‹ìÑI$.ž”òVLK¿rS¤æ­Sø¨Šl¾çý–Ý_Yµ®Ðq¢˜ŒÇvG|5ùtü”ÝÙ{ÚJmÃÿ”…n¼®õÂèÑH¹fÞ(òE3º¼9·J"']fœ*È;ïNϵŠ™;æuRl’¼«#B+¥»ôèB£€">1î.άF&…êÎ"ÊùÏê¸ÀÑQuÝYÉ'1‰Úiž¾ÿtw> endobj -1910 0 obj << -/D [1908 0 R /XYZ 85.0394 794.5015 null] +1939 0 obj << +/D [1937 0 R /XYZ 85.0394 794.5015 null] >> endobj -1911 0 obj << -/D [1908 0 R /XYZ 85.0394 575.4191 null] +1940 0 obj << +/D [1937 0 R /XYZ 85.0394 575.4191 null] >> endobj -1912 0 obj << -/D [1908 0 R /XYZ 85.0394 427.1073 null] +1941 0 obj << +/D [1937 0 R /XYZ 85.0394 427.1073 null] >> endobj -1913 0 obj << -/D [1908 0 R /XYZ 85.0394 329.3834 null] +1942 0 obj << +/D [1937 0 R /XYZ 85.0394 329.3834 null] >> endobj -1914 0 obj << -/D [1908 0 R /XYZ 85.0394 262.8864 null] +1943 0 obj << +/D [1937 0 R /XYZ 85.0394 262.8864 null] >> endobj -1915 0 obj << -/D [1908 0 R /XYZ 85.0394 196.3893 null] +1944 0 obj << +/D [1937 0 R /XYZ 85.0394 196.3893 null] >> endobj -654 0 obj << -/D [1908 0 R /XYZ 85.0394 155.0304 null] +662 0 obj << +/D [1937 0 R /XYZ 85.0394 155.0304 null] >> endobj -1916 0 obj << -/D [1908 0 R /XYZ 85.0394 117.4002 null] +1945 0 obj << +/D [1937 0 R /XYZ 85.0394 117.4002 null] >> endobj -1917 0 obj << -/D [1908 0 R /XYZ 85.0394 84.3344 null] +1946 0 obj << +/D [1937 0 R /XYZ 85.0394 84.3344 null] >> endobj -1907 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F39 885 0 R >> +1936 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F55 1035 0 R /F23 734 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1920 0 obj << +1949 0 obj << /Length 2406 /Filter /FlateDecode >> @@ -8417,32 +8557,32 @@ H :ÍS½--ú){É=6]´põ9ØíncUm…2hÔ¬N±,˜o±HÉÖæx¤¦{7¶±ß~ƒEΚø ‰ ðœ6ƒ>ê¸t(c‹`&U‰P{wjÏÀN•œËbyW5 õsÂ|±&¹)†ìåLw|­ÄÌÖºÏ1öÑ»I¼hå¥]eb{¹‹yHÊ7)­õXØp¯—W¦*‚žÃ-«â¯ HX†Ž˜€<”(ßé¿L¾ì²ø—ÜZ“biÍ>`Ô%¼ài13‘H‘8–g’{uÂDʘÈÓ>Ke¼õ K °ì«?f„­Ígù°)*Wtf¶ }ª7­ínW«lóæS]éT¯Û¢®š½›-ÆååV—Ù®4«¯ ª›S,wº9`ÔMŸåçJ¦ÌÝÐo$Ýó{Ä€ÃÚÅ((«9š}ßïØÕú¡¥h°TÔ’TØâ[tì;gÝ÷J¸ÂE”f;›åPynNØ1HAV=ÖW?¦·ïÇŸôXïph|0Èì E¸[¦QØy&1¾wkí*gõªoõÊZ½ò$ »!Ý“6D.ò›wÝ:’ÙcQí›?›ma¾jÍá[ÎY›iá…}™Öc†iÀ¤»lº£-탴yeÞ'ì»=jî*!LÐ3@=Ðqcw cë/á˜-¢8Úÿ»Â+[c’ò„Ÿ”Êa¥òo.œ¤4•žX“Dzyþ¸].»¢ÎHEŽýG*$Ñl¤¢Ýüÿýÿéîßâ(_JŽd#K‹•Jï1~¨gûOë¡ìÉŒI2endstream +ÝPWrAÁêJ.˜»·ÆÝuÝ4Åci)u˜;=Ø>9š}ßïØÕú¡¥h°TÔ’TØâ[tì;gÝ÷J¸ÂE”f;›åPynNØ1HAV=ÖW?¦·ïÇŸôXïph|0Èì E¸[¦QØy&1¾wkí*gõªoõÊZ½ò$ »!Ý“6D.ò›wÝ:’ÙcQí›?›ma¾jÍá[ÎY›iá…}™Öc†iÀ¤»lº£-탴yeÞ'ì»=jî*!LÐ3@=Ðqcw cë/á˜-¢8Úÿ»Â+[c’ò„Ÿ”Êa¥òo.œ¤4•žX“Dzyþ¸].»¢ÎHEŽýG*$Ñl¤¢Ýüÿýÿéîßâ(_JŽd#K‹•Jï±èPÏöŸÖCÙÿÉäI4endstream endobj -1919 0 obj << +1948 0 obj << /Type /Page -/Contents 1920 0 R -/Resources 1918 0 R +/Contents 1949 0 R +/Resources 1947 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1907 0 R >> endobj -1921 0 obj << -/D [1919 0 R /XYZ 56.6929 794.5015 null] +1950 0 obj << +/D [1948 0 R /XYZ 56.6929 794.5015 null] >> endobj -1922 0 obj << -/D [1919 0 R /XYZ 56.6929 748.122 null] +1951 0 obj << +/D [1948 0 R /XYZ 56.6929 748.122 null] >> endobj -1923 0 obj << -/D [1919 0 R /XYZ 56.6929 665.5133 null] +1952 0 obj << +/D [1948 0 R /XYZ 56.6929 665.5133 null] >> endobj -1924 0 obj << -/D [1919 0 R /XYZ 56.6929 579.9397 null] +1953 0 obj << +/D [1948 0 R /XYZ 56.6929 579.9397 null] >> endobj -1918 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F53 1017 0 R /F23 726 0 R /F55 1025 0 R >> +1947 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F41 935 0 R /F53 1027 0 R /F23 734 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1927 0 obj << +1956 0 obj << /Length 2100 /Filter /FlateDecode >> @@ -8452,50 +8592,50 @@ xÚ­Y_ çíŠËK¾—9IC.I ʾ‚=Ò—GÉ qìúžkx(–µª_ÔtZu «^^!êòêPÛurq6of• èº*UìÒ˜ÂÁäõ‘£eYI;[V1\r' =Ãm²WÙ-9Šn‚Èl=´“ûm^×"ŽpÕ©_Á¼4ôkŽ³‰=ˆÑÇÙç›EêÕ`åB›ŠT¥„ùXçëR9Qç³fKÓnd$p~©C…wSU4Ó$HÍc´Üæe0•5‡aêI®¤Ñ³\H3õ)+™VI ¸Ê#wè>‰pû?½¿7#NS?F!1ûûìãÿv&–(C a¤ï Sê³ A >OM×!F_矟nzÂ#d“})m%<{«!Š-ŒÞƒ·Wû&?l›2DU3`Ø°ñÔ’ÐBwˆ1îû–Ê>"®I§ì.È8‹ù¹‡ÚlE‰™®ó$ýÛâ½­¨šª*~ nÞÊjWC,ŸÔ;14 òKSu†ÄWãõV`†]ç¥+ÔZ*ö1˜5´Õ'ï9&(&Â%#ö-׺>.|ñqƒ¾¶96¯ó?}˜Í$"ìèÂò"+aITyÓ¼í|¼ £ORáÄzf…»XY]û2IŠ„p;~3F{e;Zy8Cù™ð¶¨YÙÚÇšu0Ž³‰aHm„“\×7å·~ xè±Tm{Oˆ\sw ±‡2®Ú.å«_ø·Ö2­o2…ü Ë5”·\­åÙxx†T©o*ºîŃßïúgÒ2~½)l!_eñƒîW‘î°Hy‚YŠÆ“ÙýÓã—ùã穧=¹’À=`§ˆGiÔw9ÓbÙfdoJDQ…®gªüÑYºýî*xËìò¥TÅOiÚ5¨yš¼ ÈIÜ®(—'ß Ý1u×Cyðؘ)UâêàrÒ÷2+êªMÓ&€úäÞçPÛo®ÃÂÁ|öøáØ·)V¾\g‹c˜AÁ“5VíºUîz¨§.¶êb§Öe”jŸõÏÎÚz›/DŠ"JèõœÒ!rW›ç)Åi”véƒ÷ÒJDÊ}Ù£×û³ÅQr]´–è\¶^bÐ(!xO¸™, QVfÌvo0XìßvMµÞg»î)aªs)ý‰Ð=|àÁ+Ô$8Ø·jå P@ì”ÆÄŸ+û½F ²µ¨³=ÔÙþÅJ¦[+=X™ Ÿf£Ocn›j( D”Ò¾÷*¯*åUæžVûªÐKg#íj) Ƴ‘¾ÇeÁâ‘ö?ê)GÁƒñƒy*Öã|¥ÜVw7föAÅ6+Ãr·ãçÑ}â»4-'q]š °éÁ]•fG0€†+s$ª-ë¼É_/ß|ª+{Ïà6Fþç_Ž÷]1¨è\ìõ¯’0°4%N(¥1!ôTôö7„sÙÿ(l7wendstream +QƈSg·¯šjá‚Às‚ñé>{Oˆ\sw ±‡2®Ú.å«_ø·Ö2­o2…ü Ë5”·\­åÙxx†T©o*ºîŃßïúgÒ2~½)l!_eñƒîW‘î°Hy‚YŠÆ“ÙýÓã—ùã穧=¹’À=`§ˆGiÔw9ÓbÙfdoJDQ…®gªüÑYºýî*xËìò¥TÅOiÚ5¨yš¼ ÈIÜ®(—'ß Ý1u×Cyðؘ)UâêàrÒ÷2+êªMÓ&€úäÞçPÛo®ÃÂÁ|öøáØ·)V¾\g‹c˜AÁ“5VíºUîz¨§.¶êb§Öe”jŸõÏÎÚz›/DŠ"JèõœÒ!rW›ç)Åi”véƒ÷ÒJDÊ}Ù£×û³ÅQr]´–è\¶^bÐ(!xO¸™, QVfÌvo0XìßvMµÞg»î)aªs)ý‰Ð=|àÁ+Ô$8Ø·jå P@ì”ÆÄŸ+û½F ²µ¨³=ÔÙþÅJ¦[+=X™ Ÿf£Ocn›j( D”Ò¾÷*¯*åUæžVûªÐKg#íj) Ƴ‘¾ÇeÁâ‘ö?ê)GÁƒñƒy*Öã|¥ÜVw7föAÅ6+Ãr·ãçÑ}â»4-'q]š °éÁ]•fG0€†+s$ª-ë¼É_/ß|ª+{Ïà6Fþç_Ž÷]1¨è\ìõ¯’0°4%N(¥1!üTôö7„sÙÿ(Ä7yendstream endobj -1926 0 obj << +1955 0 obj << /Type /Page -/Contents 1927 0 R -/Resources 1925 0 R +/Contents 1956 0 R +/Resources 1954 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1966 0 R >> endobj -1928 0 obj << -/D [1926 0 R /XYZ 85.0394 794.5015 null] +1957 0 obj << +/D [1955 0 R /XYZ 85.0394 794.5015 null] >> endobj -1929 0 obj << -/D [1926 0 R /XYZ 85.0394 752.0811 null] +1958 0 obj << +/D [1955 0 R /XYZ 85.0394 752.0811 null] >> endobj -1930 0 obj << -/D [1926 0 R /XYZ 85.0394 529.0618 null] +1959 0 obj << +/D [1955 0 R /XYZ 85.0394 529.0618 null] >> endobj -1931 0 obj << -/D [1926 0 R /XYZ 85.0394 453.6936 null] +1960 0 obj << +/D [1955 0 R /XYZ 85.0394 453.6936 null] >> endobj -658 0 obj << -/D [1926 0 R /XYZ 85.0394 414.4777 null] +666 0 obj << +/D [1955 0 R /XYZ 85.0394 414.4777 null] >> endobj -1932 0 obj << -/D [1926 0 R /XYZ 85.0394 377.7886 null] +1961 0 obj << +/D [1955 0 R /XYZ 85.0394 377.7886 null] >> endobj -1933 0 obj << -/D [1926 0 R /XYZ 85.0394 345.6639 null] +1962 0 obj << +/D [1955 0 R /XYZ 85.0394 345.6639 null] >> endobj -1934 0 obj << -/D [1926 0 R /XYZ 85.0394 279.329 null] +1963 0 obj << +/D [1955 0 R /XYZ 85.0394 279.329 null] >> endobj -1935 0 obj << -/D [1926 0 R /XYZ 85.0394 194.9705 null] +1964 0 obj << +/D [1955 0 R /XYZ 85.0394 194.9705 null] >> endobj -1936 0 obj << -/D [1926 0 R /XYZ 85.0394 119.6023 null] +1965 0 obj << +/D [1955 0 R /XYZ 85.0394 119.6023 null] >> endobj -1925 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R /F39 885 0 R /F53 1017 0 R /F55 1025 0 R >> +1954 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1939 0 obj << +1969 0 obj << /Length 2835 /Filter /FlateDecode >> @@ -8510,24 +8650,24 @@ xÚ¥Z_s LJ$ä—«ªiòå l¬i €M*™ÚÜéüÙè?Ž¦œ ÌÁ|;{0#üús9æ7x,¿/èP¤ç.›õ>)pX™£±½›-;«;¡T^(€{ÌyÍÆ(nw±øÝíë¶^ÖåÙâwD¬¾ô=–k°ðuƒ[Û¼)z+:™øƒÂ˜)*`õ¤©.<8=€¸rŸ±$Yœ§Šáƒ!|v/fÂyÇÐŒ`àXXº*ÈçYâ‡`!¥ÉžéáLîD3ø0Ñ ÚP7Ì–kPìÚr æžÈ€ kÃ'~uÅ›U€ÄÛF÷\OwGhuy­Ùc™©%©°5]w °KZF[<*ÿ ?šÃr™CÕº±ÝŠä’õ:¨ûµ(cÁûKYçį·«üõ4£€š%‰’qá:Ô€t¾Ë€ËؗΈeöå“A¥UÌa˜'T†Ù¤nQÚ*7UWKÌIú•€Üõ¹‰&ôg¸Å©Umù˜MO“}¿+Zž ¼ô„`¥\ ëò7 ¬kÔiDiêŸ< 9p €°0±wú$Ü_‡lÕ˜¡ö _,ss„Ò¾«Þ/ôO=<¥få¨Ç‹¦sïç:³µ°™©v¬‚Ž7BÆÇX:dGÛ%¢tÒ{÷ðO5²gš72ÂóÄÔšåK¶Ï–­ $€C r­&XÒ˜[Èk<)ÜÌ­²–ˆêGÝ>wJ·`¤¨À(²•/ÊxvEÏ8 ›=˜Mf%~`¤=Õ¥þùAòî‰Na5üDrn-¬pÞ9ð^l»b×9G“ïésì2|¼pž–GŸx"Çœs>âÆÄ›æâÃQÓîójÓ¾œÞ˜øh}D¬s"—ÿ«Ü5"Ž\ÁŽBýÍ: ûF&3b/NF?ݸh÷÷žØþÞ3H¥ F6ÝEÉÜ‹>ÁLí.µëóй:Ó -2å{Ùò°'Ž­ýð%#ƒ©èyq•ëW9Åî°‡2·†Ó¥ZpŸž·¨Y,.S>{ýîIJØ×ùžÀæ±[·–dö\”EûîÏf˜¯Z£|â ‘\ r*Ï`Ì0H¶ºª®§í<³çÕrÿ¾£0©Éžÿ \-¼Ðȯh2¶þzña§Ì_ó“"BA©+ ¨“ÊbN¥òŸÓTÍJzbaáÅ«üù°ÙtocFªàÜßž@¦ ÿ`d@*6±‡óÿ]Jÿ÷7Q¾t®‰ `ql…ÒûƒÛâôœé/XNeÿïN¥Qendstream +2å{Ùò°'Ž­ýð%#ƒ©èyq•ëW9Åî°‡2·†Ó¥ZpŸž·¨Y,.S>{ýîIJØ×ùžÀæ±[·–dö\”EûîÏf˜¯Z£|â ‘\ r*Ï`Ì0H¶ºª®§í<³çÕrÿ¾£0©Éžÿ \-¼Ðȯh2¶þzña§Ì_ó“"BA©+ ¨“ÊbN¥òŸÓTÍJzbaáÅ«üù°ÙtocFªàÜßž@¦ ÿ`d@*6±‡óÿ]Jÿ÷7Q¾t®‰ `ql…ÒûƒÃ:=gú –SÙÿ殮Sendstream endobj -1938 0 obj << +1968 0 obj << /Type /Page -/Contents 1939 0 R -/Resources 1937 0 R +/Contents 1969 0 R +/Resources 1967 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1894 0 R +/Parent 1966 0 R >> endobj -1940 0 obj << -/D [1938 0 R /XYZ 56.6929 794.5015 null] +1970 0 obj << +/D [1968 0 R /XYZ 56.6929 794.5015 null] >> endobj -1937 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F55 1025 0 R /F41 925 0 R >> +1967 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1943 0 obj << -/Length 2184 +1973 0 obj << +/Length 2183 /Filter /FlateDecode >> stream @@ -8541,47 +8681,47 @@ Zì¬ ¶Äm-n˜\A¥9îh„Ÿi=(ä=Ì]%ò~ÐÙ`{>µÕròiþy8XCTÙc¡«¹®ÝB—WkB*»l’9¥®nfö‹„´ÓuVdà‘IízÞ¯êAÛKë”·I±ƒšäsÎyð§ @'Ú:þõݵáÓ¼ôð‹ 8j üev"bÿ;»è˜8=dç70• ‰ˆÄ~òmñáó×aÃÞ@»¾-”Mó— Z'Û»^C«Qnël·Þ‹…ÊqWP"h[¥Я‡²€!—¹Šë(œÞmˆg0Lô¨&à\±×ç쨆±Y™¯xf½®©ÛTW—e>\ ç/E¹©²êx”„Ð#’ SǘžIRGwÈ´5½Ã-t”L4ѽgq:eº¸¥òž^׉ïArçVKs2v8‹HÑý˜—'•/é… »œÔrL='Á™ËЯC¯^n_¹¬ú o¼@WˆÑv#–yƒ3ôIí¯³1=qŽ_uþ5«Ai -…asœ r¬Ê$€q5Kò~m t œˆ“)¹ÃœðøW¬öÙ‹0£Ž'6çʽÇ=ĉ§mÚÕÖ#ë0¶ÐÔëT=õÄ7f'€WÀ×ɶî‹p PÜ6 -׺]=õ*íøç0Qå¯ÏrÞÙÞKH(fòhNûPÀ"I°C©JòÚû„&¢Çò> Çe­‡R˜6«×4±+]šäfö!!„îú>Å‚\ý;”§Vá¶>þß?wí¿éBV¡Bì¿ó~.m¾ïCb•ÒÇ#„«Þþ0vªû<¥ø¾endstream +…asœ r¬Ê$€q5Kò~m t œˆ“)¹ÃœðøW¬öÙ‹0£Ž'6çʽÇ=ĉ§mÚÕÖ#ë0¶ÐÔëT=õÄ7f'€WÀ×ɶî‹p PÜ6 -׺]=õ*íøç0Qå¯ÏrÞÙÞKH(fòhNûPÀ"I°C©JòÚû„&¢Çò> Çe­‡R˜6«×4±+]šäfö!!„îú>Å‚\ý;”§Vá¶>þß?wí¿éBV¡Bì¿ó~.m¾ïCb•ÒÇ#§tÛÆNuÿ/<ýøÀendstream endobj -1942 0 obj << +1972 0 obj << /Type /Page -/Contents 1943 0 R -/Resources 1941 0 R +/Contents 1973 0 R +/Resources 1971 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R +/Parent 1966 0 R >> endobj -1944 0 obj << -/D [1942 0 R /XYZ 85.0394 794.5015 null] +1974 0 obj << +/D [1972 0 R /XYZ 85.0394 794.5015 null] >> endobj -1945 0 obj << -/D [1942 0 R /XYZ 85.0394 752.3199 null] +1975 0 obj << +/D [1972 0 R /XYZ 85.0394 752.3199 null] >> endobj -1946 0 obj << -/D [1942 0 R /XYZ 85.0394 504.8188 null] +1976 0 obj << +/D [1972 0 R /XYZ 85.0394 504.8188 null] >> endobj -1947 0 obj << -/D [1942 0 R /XYZ 85.0394 359.3246 null] +1977 0 obj << +/D [1972 0 R /XYZ 85.0394 359.3246 null] >> endobj -1948 0 obj << -/D [1942 0 R /XYZ 85.0394 298.3625 null] +1978 0 obj << +/D [1972 0 R /XYZ 85.0394 298.3625 null] >> endobj -662 0 obj << -/D [1942 0 R /XYZ 85.0394 260.8495 null] +670 0 obj << +/D [1972 0 R /XYZ 85.0394 260.8495 null] >> endobj -1949 0 obj << -/D [1942 0 R /XYZ 85.0394 224.9084 null] +1979 0 obj << +/D [1972 0 R /XYZ 85.0394 224.9084 null] >> endobj -1950 0 obj << -/D [1942 0 R /XYZ 85.0394 193.5316 null] +1980 0 obj << +/D [1972 0 R /XYZ 85.0394 193.5316 null] >> endobj -1951 0 obj << -/D [1942 0 R /XYZ 85.0394 129.6476 null] +1981 0 obj << +/D [1972 0 R /XYZ 85.0394 129.6476 null] >> endobj -1941 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F14 729 0 R /F48 940 0 R /F39 885 0 R /F53 1017 0 R >> +1971 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F14 737 0 R /F48 950 0 R /F39 895 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1955 0 obj << +1984 0 obj << /Length 3093 /Filter /FlateDecode >> @@ -8597,29 +8737,29 @@ ZDh ˜}ˆ|gW­ï³PÁ 6“ÝaQyœ½e0¯¦­0Œ{5èyÞcçûR6Å‘%pš¦\´rÉ”kz>0UÏ%]«À[SוßÌùÐ0U±´§ïXž×ù‚[¿4‹mb÷ LBuÔeéTÂ÷Úöo !°Õëè”(@|Á°†³m·iIÖÀ§õ_"þP´/9Y{ð}‹@5*t]eˆÃýEþXw5}h.Wt\ñ}Ä¡ûX»LšÏ(ÐDlŒ •Üäm(rà²ÏmhͼûŒŸÌG-í(˜&ÀDjäçÇyüÀ®C¾|ó‰» ÷÷yË­´jÔJï™Õ)]á0á^`XŸ"ëS´Y#BsÀœp‚{¤K`§E€BOÜÅ;½ÿöÏ´¥§†C&Pò2ÿI —û[I‡ø Ó‰;/N~¦çÂwWti—¾mw᣻¿öÏuÑt·Ï9ÃèxͲ „Ï%ÀK½ ÷®G}u*'ƒJU å×É”ÜC:ž‘’OÈ7ç mŸÂæ ù YÈ°ÒÎb) ®<Å\‡tȵL"˲{÷¡–fú06\hÛ}¡Í¥'ÎQZF ¡¾~6чºiÊ*À oÖpѼ·‚ƒê*Áï£Ý÷ èÓÚâÏŸ.§@jÝý -æ1¬t+ä)…Ú|èÚØUhÓ#²Í_ŽÑÀV$Sã2>â~ä¯|oëì>Í;Ø󶄚´\¿2œÑ]óoÔ?'dðN=#ŽÈÙa°|…â¾\ÐËþg4vÿ#×¼ÿ–Ɔ†–ï6Ï´"‰B›úa—¶1þk¨D÷K’ÿûG_ûŸ·šYväû©J!a83S(dp¹Co埇òþ_0¥Åendstream +æ1¬t+ä)…Ú|èÚØUhÓ#²Í_ŽÑÀV$Sã2>â~ä¯|oëì>Í;Ø󶄚´\¿2œÑ]óoÔ?'dðN=#ŽÈÙa°|…â¾\ÐËþg4vÿ#×¼ÿ–Ɔ†–ï6Ï´"‰B›úa—¶1þk¨D÷K’ÿûG_ûŸ·šYväû©J!a83S(dÐÅ¡·òÏÃyÿ/0w¥Çendstream endobj -1954 0 obj << +1983 0 obj << /Type /Page -/Contents 1955 0 R -/Resources 1953 0 R +/Contents 1984 0 R +/Resources 1982 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R +/Parent 1966 0 R >> endobj -1956 0 obj << -/D [1954 0 R /XYZ 56.6929 794.5015 null] +1985 0 obj << +/D [1983 0 R /XYZ 56.6929 794.5015 null] >> endobj -1957 0 obj << -/D [1954 0 R /XYZ 56.6929 752.112 null] +1986 0 obj << +/D [1983 0 R /XYZ 56.6929 752.112 null] >> endobj -1958 0 obj << -/D [1954 0 R /XYZ 56.6929 665.106 null] +1987 0 obj << +/D [1983 0 R /XYZ 56.6929 665.106 null] >> endobj -1953 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F55 1025 0 R >> +1982 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj -1961 0 obj << +1990 0 obj << /Length 2978 /Filter /FlateDecode >> @@ -8633,718 +8773,739 @@ xÚ¥ZK 5‚']R‚ðy¸/þ¶L]ÒèwÖ72žÜåÉ`B[êõv2RE\„Qþ{6RõQÓ‘ªC™HUç 2êY},Ë겺!$bžµ5›Ÿ„$PÔKå3÷ài Y£aÆäÃŒ Þ¾÷8—NùwC]tÉžÓD{9{wå¤lÉŒg*úý0Ñtyl7‡ãkB2å üDÎ믚Ö_‡2úûx-Ó€Šêí‰,ƒ'$ÂØYþh„?O‡Ð çHú Ê„u)„L8%Ž‰«¶¡ALRÛ)ö:ï–Æ]!©ãÒlÛ´#†þsÚq^µ¡¡3iG‚i7¤^¯'·Р7>žuXÛÍ”†x“³ç©5’óTL¥}Áù‰#q%“í£fìË¡Œ}†Kê(Œ¢èÊ’4²dwêw¡Kþ‚7¡ÀHphŠS^/éÆIïgmFÏææiÝu’É:€êÑH‚ šrBÛ²P›¬i»k¦Hò`eŒT˜"µ½L°ªL±ËOÄÛ²…Š]ÎB%ι+‘c_$°¾+I,S"‘çËcì³jPAmN`þ;z¥]# wI(¼ @™‹bê1—Éðt]¥$Ȩ®?Ø5›š6¼¶Ó”ÍØýĮܗPqMš¢HÁåkyÅÕõQӦءŒ)Gï¡ãÂë‰:/ž.SÙ4ÃÅué•Ùdv¾e;Ýks®BÅ• EV ùxY+9wVVy¹¶ßàè~Ï&k¾éŽØ$†¥m}Úå~²…{žv;ôètâ;äÙíôP3nÇ¡ŒÛ¹Hš4ã$Šæ—t ‘%½‡±R‰¿ä§cé*º¦…óß`!æ_h®ëýaW`à˜”Oñ­ó飦%Ò¡ŒDž®Ö »â©ØÝ[ŠŠ½YÎ:ÔkÃ{K¡bŸ5¨ÚšAfž«ÓãcWíΦe¦¤ÎúJÕGÍÈÌ¡ŒÌ¾]X‘ ¥„ÌnvIYÒ³¢NœVþ’«ºÿeå§ûŸº*GfVîÚ#5l¢`>lï¾¥›.g}® Â$dZ–‚Á`WjÖ>jF–ed)Çì…Iª]&Ðd»ËZ‡CÞ-ÁPfëP#œyæ'¢0Lù¬½·o—  \ÇÁÝý»7’(ð¯ H¥OÒH4¦Š¤Çò©¨ˆ¶-¾R£¨ÖuŽ¾¸-pÞÿBÝyÖØY°±rñ ˆ4†¤&M‚–xóÁ¢s-Ã-¿™åve·Dq)hHqþÝ&B…ªùÁGÓÎr*g9ȇWgKkZÉ7I÷YÐYdwÈ­ˆgDOÿK"çó+’8ƒfþ#aAÆ"ÿy­ -‡”™>ê]~ÍQi¨…³¬u KÞü«,Ð#“±Çܯ“âËÆ…×Éß Ù©hŸU/.Rwû&]n×W.g,œúGähÑxFÎΈþï+ÿ—%¡LÓ‰ ¹8\ÍS(?Γ!ëÝÿš.yÿgH,endstream +‡”™>ê]~ÍQi¨…³¬u KÞü«,Ð#“±Çܯ“âËÆ…×Éß Ù©hŸU/.Rwû&]n×W.g,œúGähÑxFÎΈþï+ÿ—%¡LÓ‰ ¹8\ÍS(?ðCÖ»ÿ5]òþ?gvH.endstream endobj -1960 0 obj << -/Type /Page -/Contents 1961 0 R -/Resources 1959 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R ->> endobj -1962 0 obj << -/D [1960 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1959 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F21 702 0 R /F55 1025 0 R /F41 925 0 R /F53 1017 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1965 0 obj << -/Length 1813 -/Filter /FlateDecode ->> -stream -xÚ¥XKsÛ6¾ëWðÒ©4 Q¼ˆÇQ±•ÄMb»‘2M'É–(‹Dº&åDùõ]EŠˆ“iG.ÁÅ>>ì "†‰„¦:’š£“$ZîF8º…o/FÄñÄž)îr=[Œ~{Îd¤‘TD‹uG–BX)-VÆÏD€Ç—Ó7³óøìåììÕÙÕåóIL¤`|<½¾ž]ž_¼ŸÄ4ÁÀÌßL/ßM_۵뉦ãé‹Ù|òiñûh¶h ëO03Vý3úð G+ðá÷FL«$ú/­i´ñ„¡„3æW¶£ùèV`çk³5OJ(QÌ8R ? A’`’‰F‚QÖBFI2Ïe ‹§§Ž -‰¤ ,ê -¨ôL•¬£RR$9=•n²b3ªÇ·Y‘ݧu^ÜÚ÷Ô>.ç³3fÉå&Ís•Õ–¨7™%®®¢ÆWïöý#Æ,u¢J·+ÝnBïÍ®lY6ÏUå‹•%V¥}eݳ23@E -©DF1!H' müq’Mô $›Å5¼6D^TÙroyìÊ*Ûf·@YThpîT%ˆb¢pô®GŽÞs»¿•EÑmvªZS$„Ô«öLÕÝÐ ÛS½Ø8œþ†^–E §ÝDƒy¯=“1Ô-•öyãÞ«ü¶ÈVß…N(Ž$êqèº\߇®å2öΧ:%C ãèôL½´Qˆ*r¢s~—-óõbüe“/7–[*KU›r¿]YºAžû*s+ v† 0s+Çd†ZÈ5¾XÛ¥¢<•ž¶k„cÌáe«§°"›ÓjÄʾXgnnÒÐÙeÒp ò$²¯é./s™ÏH¿óËù«Ù_vq˜_&skûÑêem¼˜OwÙWãæÖ1[=*ÇwôÖ×å¾pªSOo—åÈßvi½ÜØX…·»ûüÁ—ÜwË øÔ€“Ȇj`eµ+¹s±.ïBÈøi»å¸¹rÛ¬„pÇÝ­:æ¼ÁÎ&IšØn[G1åHcÁ1âФ‹gï§o®_Ï܆n`‚kT"*Y'‹]ÛmùÅ‚!HäÝÎbߌúÊ’ÆíF&W™ú ÅÐqwÛ €B!¦„çõƉzc•×Þ¨óùÔ&YÂò•å¼9´t¬€ˆ ¬†UQAÍŽAl؃5(Q\÷Ïü#Nð«Ž'è ´¦'DR.á”D[ü@@ãǯ¦) ÖNÈøà^vûª¶,7Žµé†Ê%™YØ¥U QÚоšc‚C»ëc:˜òîÝ ÇñV %¨cïÙžWM´Çœ˜c@I¼x(—Mgsx2Þ–åçÊ’&2‡†icUâq7Iý~hÓPA¹l 2›ôbB[l¸ CôÒ‹qN/³µ*ýÖ´¶ÔùÜ>‡Ã‚œ:Uͱ€àNh5.6ÜQÀ…QH.Ü–;;¬‚•;ßýQõB‘*Ä)#ÎÕø6t}ïÿ7– ó§YÜÿ¿ÿ›;þ É¡ß(EÃ÷t*›…7Ê8ãÃðïŒ(ƒpÚþ/?×>3endstream -endobj -1964 0 obj << -/Type /Page -/Contents 1965 0 R -/Resources 1963 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R ->> endobj -1966 0 obj << -/D [1964 0 R /XYZ 56.6929 794.5015 null] ->> endobj -1967 0 obj << -/D [1964 0 R /XYZ 56.6929 612.518 null] ->> endobj -1968 0 obj << -/D [1964 0 R /XYZ 56.6929 335.1485 null] ->> endobj -1969 0 obj << -/D [1964 0 R /XYZ 56.6929 267.4555 null] ->> endobj -666 0 obj << -/D [1964 0 R /XYZ 56.6929 225.2657 null] ->> endobj -1970 0 obj << -/D [1964 0 R /XYZ 56.6929 190.8284 null] ->> endobj -1971 0 obj << -/D [1964 0 R /XYZ 56.6929 153.8399 null] ->> endobj -1972 0 obj << -/D [1964 0 R /XYZ 56.6929 83.2251 null] ->> endobj -1963 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F48 940 0 R /F41 925 0 R /F39 885 0 R /F53 1017 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1975 0 obj << -/Length 1710 -/Filter /FlateDecode ->> -stream -xÚíYßsÛ6 ~÷_áGû®bùC”ÈG7qÛt“Åκ[ÚÕ–µ–”JrÒô¯(’²$Ëö’f»ín—»„¢!ü|cÒÇðCú‚#̤Û÷¥‹8&¼?{¸ Ÿ½é#ãX!§.õjÖ{ùšù}‰¤G½þlYÓ%‚ôg‹«Áèü|<9>ù}èPŽ¯ÐÐáNG“ËÑ{½w>”t0z3žâ{”€PbLF§ãcçèíøè—?Î&ãá§Ù»ÞxV9Vwž`¦¼úÖ»ú„û 8ûFL -Þ¿‡Œˆ”´÷\Îw³;«Þ´÷k¥°öiùjœ Äõ;Р¤O’œÓ\"QVÂq<ž]œœÏNÎ&ê4å;qß¡.’¾ï•ÂI‡ g~οÎÓdi^`uÈ)ò)—ò¥d®Q-nB½È’"øþB?|^z‘¤E[.Œƒ¤ˆæ¹M—úo`^P¾è%øòcz½Î‚"J½©vV!ªU±^:ŒêL'ÆY Ât+¦a¹ãyq*dwB!§.eC°•”²ëÜ´MB]×=`Ò -u˜¬DJäRÞ2yžEIîu\[ä×qdîÄ ~ -´F‘GÐ<Ìs¨/pQAÄ‘ë)¬l s©ëÈ”e6ƒµ©½ÏRÍ£8ZÙÊìÎ+Ìl—µ¼3·¸ÄÈw…·?·êR»s«’*sën«òÒ;`Ò -u˜lTž€Xú-“]•wfyE[–åÔ§Û| Mª{&AËÇ&¶×Y?¦¸¡ó!Áá¿Ú¿*ÑÿÑ>c‚îµge¶íµ°gDò†½ó0[¦YÜÈÌ"ÌM4Vi°hõ™ÕJ/â /ÂL¯¤Ih™®-zQÒQõªsà‰Z¬ÐŽ0AGö¡-ÑÝ`IÊøHÔ¤ö„ÂJ•±ø² ‚<ßu÷›´B&ÑðÇÕ&?Ü„Éú(¹nFál)J³‹b(¢ªt¾¤ë, VM&ŠŠ*§ó"ß &†ø| ¡×¥ö€i¥ÔÉ´ß*Þ[ †)‰¹ßv%Õa¼Ñ‘¨„,g´i}VbÃü2áÔJ茆 llLði7@+÷>ÛÅ(Š†Á'K½«g6ËoÃy¤ÞjXsM @d.ƒõªÈ]Ý‘¹0ã˜ä󗛆3L.B¨]o?; -‰2$ vë…´5ý¹@ÌÄ·Ã_)x1ž]^LtÚü6`£÷—ãéóOÄ: ÈÚÜ2ð†€M·,‚b7¹ˆ43<Ì4‘gFì>´\=-ÂfÛ[+ŠÇF%dAvå§ã±~yô~zÖqÆ.P>bŽü"/j=^#¥‹»ú¸ÔÇd=³]ÅòĆñÕÉäX+‘ÆE%Pܾ©!æ‹pi@Hæ‡Ó Y7l»K<¨çy{³„Á—¢‘&£ËÙÛ³‹Ãœ$Ð0’Ðtúý#6¡:J“<ÍŠho¬B¹»5z\lžÔÁ‘€;(Æ[è••ÂÌEž ÒÄN‡kù„óvÂ*EÍà¤ñm´ -KúE©¿áãú½ÊL.Á*ZDE5×ÒŠÈm` ,`À)ªý"MW]€ãVÊ=$émåm -…†”çhpt":gz§Ww¼ŸÚë*Jvu»¨½’ê@oèx›+gñÉ®nªÕ—jõ­ZÝU«¹¹Õ4¸ ÒRJb†ù*Èó®¹BúvV¨4.;4 :¯UÓOPt1pC¬Òøúù4–Dî¹ÛM"¿r¢.,J·PÄé"ìB¢Aö•ß_ú½Wkë‹Nß–§Ïì_òÌúÒÃq6óMû®ë#A±ßÖ™wèt˜¡´0m&D^<¬Â¿ž÷ÓgŽNqP_ëßPÊ,('m¥÷‡Òãjõ¡C½Ç‘Ï™û ³Ùèªñ ‰le@=«;¯ -~:;×4ì&g+Tãæzk³ó8™«KœàOãä£gÎ͆ã&|Ä]ÏoÖåcUGÏ|ø;­ÿwi˜ u?' añ?kîdÍòi?Zâ‚c¨¯u:WCñO{´ùž Ò A»ÿÀ°úƒ$Ö)u(BdÛõê{¦mßÿÅl”–endstream -endobj -1974 0 obj << -/Type /Page -/Contents 1975 0 R -/Resources 1973 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R ->> endobj -1976 0 obj << -/D [1974 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1977 0 obj << -/D [1974 0 R /XYZ 85.0394 752.397 null] ->> endobj -1978 0 obj << -/D [1974 0 R /XYZ 85.0394 692.2263 null] ->> endobj -1979 0 obj << -/D [1974 0 R /XYZ 85.0394 446.6274 null] ->> endobj -1980 0 obj << -/D [1974 0 R /XYZ 85.0394 386.4567 null] ->> endobj -1981 0 obj << -/D [1974 0 R /XYZ 85.0394 326.2861 null] ->> endobj -670 0 obj << -/D [1974 0 R /XYZ 85.0394 289.3231 null] ->> endobj -1982 0 obj << -/D [1974 0 R /XYZ 85.0394 257.1813 null] ->> endobj -1983 0 obj << -/D [1974 0 R /XYZ 85.0394 222.4882 null] ->> endobj -1984 0 obj << -/D [1974 0 R /XYZ 85.0394 159.3957 null] ->> endobj -1973 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F55 1025 0 R /F41 925 0 R /F39 885 0 R /F53 1017 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1987 0 obj << -/Length 2836 -/Filter /FlateDecode ->> -stream -xÚÍZ[wÛ¸~÷¯Ð£|N„Å•½‰³Í¶q¼·ÝÓÍ>ÐmsC‘ŽHÅq}gpáE¼HÞí9m|NDC`ðÍ7ÀÌlAá-TD"ÃÍ"6’(ÊÔb½=£‹{èûáŒy™UZu¥¾¿9ûî­ˆ†˜ˆG‹›»ÎXšP­Ùâfóëò{¢É9Œ@—Wï/߬^ÿåòõ_ÿõáêò|Å∳åÅõõåÕ›w¿œ¯¸¢ ”.ß_\ýýâo®íúÜðåÅ—Ï»ùñìò¦Q¬«<£µúröëot±5üxF‰0Z-žà†f _lϤDI!BK~öñì§fÀN¯}t F Aƒ³cÄ(Å{p(C"Á……ãÍåÇ×?¿»¾y÷á -WcŸi¤ X0‰©PV¸H¶éfµ~Hןÿ]©@tÐ’HKxå­d… ‰eýâ…\VÏE|sI±qYQ§÷»¬~víåïw½v2Ûð‰Rž§`–zW»ÆÇtwW‰@[×Ôê!—I5²N!4aVBÛuŽ¬n%9{˜x±r¸:JmÊ×rùôî*/“MVÜã[†vËÕ%ãË›‡¬r}Ûäs:¦‹xÆtW¥cÐÇÜ/¿¯Ò»}îæpÜ…}¼ÑÊ£ -íU¿†Ûå™^úÎuY`ÿý -ç>D”Hɸ›nç†ïü·î -ŒZº«ÄýÞ"tY¥»¯éî<–K2N;¦‰T¬G»rû˜åéÄê"œEÌ¯Þ ÓdÛ,OìêÙ”N¥$Ñ\šÓQ†ES®¼ü+Y/o÷µ›/«ÝTIþ”<{6ûí£¿tÔ„þ=Etë´¨ƒ@éŸ÷ê?¦ë»€‰%øaö -T] ª¼ñ:è][ânq ž,úKR#ãxy±ÙduVIž?Ÿ3ÆpY‚»;Èãcž!=ìPõ.[×`;Ûe¡ryú5Í+×|ûì~7é]²Ïk£5Šuê:,ø¢cWHû>UîëGDU0ðª,ÏÝÕmê~Ýw•Tþ·ð¿ëzŸxi‡2^5Ð0ç™áiÐsH .€KJª#› Ä8oœ”=&øòŸvÀ¡·I±·€Ú»¾ ¡vOY•"6ÂQÃûWD¸Ô¼oh3ºNÀ¯·ûªöV‡Þ$4Ýz_K¼°³\¿­~(«à’]û6=†Rd…óJ‚H-ÃÆö’ý.A¹ñÞæèY@ŽGõ""Z*c‡ù`Ï«áñËpÇŒ -œ”Á&=~Z:™UG(œ•ÃÈ!ᤫÍá|`)jâùù‚Ìp¾.J1#4Öýù.‹ä6÷¶Ù¤·ûû{ØbÉäš%±q1ÇÌ¢;R3«RvÙ“Ëž›²]÷`ÊÑ…w§¼†Ã¤n¹g/öUrˆºßn“ݳ'ráÙš~Ëêit8PZDGÐéHÍ ¤,:_&Ñ™›²Eg0å(:Ý)Úg©Gg[n<&«wµnºÊÂïê“èH SÆGü¥#4M²Ð|@£0xšŸ/È çëC‰´?ßk ƨš}Æ•SûÄë×Ðè%ñ–0"D6d*ïwÉö%Ä„¨ø˜Ûv¥fÀRýßè "xlæ§ B#Sv×ið‹þ”î쳇Püv¢xÚÇxíBÍds ü{¹ßxÛ“È[. ­êjTn‹Žy{WjÔ eA];(Õ#¤_,D ë<©ªCÅ œ]ŒËyłЈb¢7,㎞fñð¾{>Ñ)3 c Ì£]¾ó}EYO„Ÿ8—ï®ðoˆ*„°§›IK@ÒJb™yKt¥¦-ÑHYKd#–<¸ -™ÝÔ‚Ý"æÚÌ«„FÔê%naŽßSëÚe¢«„´´¬êº‚»õѨì%»Øá²S µY^—U•Ùs%q•“J|N6‰ÅD¢&$Ýh%Hýrk­á¶ÅqÇ4®Ÿ¨¢>H‡Köjdx) ÕFŒ¾B-ÁÇ'f‰ †‹bÖ¤IÃaæa2êǹ8\^®“)í! R’©™q%1šuµµÃS×)LP·î‘¡âîÈXtJON"ÕÔAˆ 홊û(êg·ï=Q­ -lV1?ݨæ°ê"$æY˜ •ÞÿâZÖ.ÅßTÝÆ;›Õ,¦¡Ø|ánË¿…cƒ8)¤Ò-¤5N"+VðÊ…v¤}½*ïVáD…=WÉx?÷ƒœ¤Æó·BJú=j%{s}hî)«•˜ÚÀÈí“M}ˆZœÚs©ƒ6>=dë‡n¿…Ìî«eHšVí9×,$íÎÕiöט^²“í¯Å¡ù¹懫?Ÿ+µü‡»r€›ðÑÒý^¸ŸÒ7{ qct8-àÆqGp@ 'h#øŸr ëÿ„<ŠôÉD€C)Ô_ÃNÀUÉdžÞ7ù·ZB"mGªú«‹üêì΀?¥ov¬âÚZVà]˜(DÉʲÂÓ!&"¦…®@àpCakÁØ—äUé®?€kïpuŸïý(Éfã”­¼ÐÐ+ ÑÒìö1¾lÕØ&5rÀõÚ2Š’Ž:«\5ä°¬u;Ѳ|s„ߊÄ2f/â7›å·³ø™Ú>Î ²¡"U•Û4°B«Ø”¶Ü$_ö™»ð§³Sì¿:6kÔM‹L­:®ÀÜ ­¤}7ö:É'©¤ñ c"I¸–òXÁ´d/_xÔD¾›¬ò•#!–þA¼áTÑy#­®z-ÚÓ¶6J×çÀÅ] $FߤzŒ,Í0®›ß¶`Ð'Ä_òmóÞÑ!­©³¯i·ñ>Ǽ_ž¼3yb¨ ¼Õ¬o”jàþ.öŸÈŸ˜åh¤æó§®ÔtþÔHÙüén4Š°Èävoc”.ù¼bAhD±~&”êk6žÉzm¦SÙ~)Ùn§m*ÕŽòÖéd -ÒI›2Ú¶N¿Õs¼eã¹T[yë¡Q]7ß%OSsÄÂÞM%F©‚)—1úU:R3T R–*oÇŠŒÙ8ãW1TéyÕ©Ýúl0QÃ1ØS®a‹ÐÒŸÑZ4lÁFd ¶ùNÙ¾YÒ¢}/¤{¯h€@W7o­œð4 F B0}v™™bj”A+ˆ‘¥éöâ‹—QɺÉ[8²Gü€C-¢?ñ^Ôzh8zý+òn‘iì매ðþžÞ!¬w°M{é}‘§¡„ªá…êø^¨N; -ÃÏŽùI+4ã&^ÈzÉçq/ÑF‰™Šî|FÏ+d†JõêQ1‘±é+ÊQ#U kÌ…t±Æ]¹°zœ=1èÁØa–©Ùò)³ŸæÁÉØÁûNh¸K²|â l@4ÐϨìùkj^0Ü\ÍKëîp† ÍW6 ¾8JZwkΈ±Íb‰¾+ÌŒHñ6#(¬A,atwŸxJvÅt0™h¸M¼Xï“]øØÆ!¼‰T×Ù}Qî&£!ˆÞhóͤsÆÄ›wΎдs!ëœÛ1ç”$Šš/?FSAX ÜœRAf¨Tÿð¢ÙÓª=»(Ã4n¼á®VGÇ2Rh¬Ê}¾q×ö{xÀš5õ¶rƒ‚©ïÅ×'¶ã!õ³5‘¾½ia,P¬dÔsIÀ¹¤Ëá4ÐLÿÔ™öSæ¡À&©šÏNªëþoyyXv§å$§Ã‹ X›}ÝF›oþô—‚í7‘2†Bóq"òXAð×^)Tœq:tGÿMáP÷ÿ–-–endstream -endobj -1986 0 obj << -/Type /Page -/Contents 1987 0 R -/Resources 1985 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1952 0 R ->> endobj -1988 0 obj << -/D [1986 0 R /XYZ 56.6929 794.5015 null] ->> endobj 1989 0 obj << -/D [1986 0 R /XYZ 56.6929 752.1653 null] ->> endobj -1990 0 obj << -/D [1986 0 R /XYZ 56.6929 611.3886 null] ->> endobj -1985 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F55 1025 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1993 0 obj << -/Length 2490 -/Filter /FlateDecode ->> -stream -xÚµZ[wÛ6~÷¯ÐÃ>PçT(®$ðèØJënìdm§íé周ˆ§éåe]ï¯ßÁ…)”ÛdOŽ†À`ðÍÌ7ˆÉ Ã?2“a¦ø,Q LÄlµ¿À³ÏðÛwÄé,:¥E_ëÍãÅ·oY2SHÅ4ž=nzsI„¥$³Çõ¯Ñå‡˻뛟ç *pôÍãèöòîãå;+û0W4ºünù0_$¦”¤V‹qtwy»¼^\}¿¼úç/ïï–ó߸X>zÃúÆÌ´Uÿ¾øõw<[Ã~¸Àˆ))fÏð‚QŠÎö\0$8cdwñpñ/?aïWóiÈ\H$(g Á‘"J†]†à‚E‚Aâ]FIÈe–vÙâVoôÛ·Bô4‰@I‚%Ì®Uöå:;ö¡%‹YÉüVÀ2Ö_*”`¢†¦]m³Õóã,Ê7ö™ên¶¯ÕœÈ([•æ¹îË6YUÛ÷¦ì}Ê¢+}ÌÈNó¡¬ëüÓ.³¿èmºoR;‰õÌÀ‡TRÄ™Œk~£”oÒ|§ŸN»¿/*‡#vÊßæ‹a‰èÍöœVÅÈl,F€ØN ¼Î6i»k`HœÝÅ:°Æ‚%qœ08‚”Ô¯–.Ê*!†ig=: ‡ºX ° Ÿf_kš^Ë@³A“ ©›„&F’‹i»:¥€]C` -$i|dØÃS¶Ê7/Q‹ž·Y3'Ñ6«ìû݃}±Yk!êmÙîÖVáSfe+ óÌ 5Zb–YF¾4ÛÌ-ØÓˆÓõÚ¾ÖuVkXcуµÖp°î€D¼”˜Ÿ"d -Ý R\œâÑfÚ ìüt!ASŒºŠtŸ­«rÿ”ï²ÿ–EXEAÀQ*ËPID•T¯Œ#8J%ÔW0\ŸÜˆÙüˆiÏ;ÄÎQ€‰E?|•ÈÅB©3‘ÙÓšˆÌNËDfŽLƓΨ œ¨öÒItrŽ(Nø´q^+`Ý >¹BDÊdhÞOó„GUÞèÄÎHdNF8*Ûæ©m¬´q{àýݪÉ„ÒÀŽæ äœøX@ÌD7›À”¢D€ÏN ; Dtù=¯CsA'¾\,BÑ‚hB:hCÎ(ìfŸ;o`[AT7ÅÔWN€wÜF·ymµ­³M(ñ×S4eõ29qŒ¸Ää/‡¼: oœh›Î û 4n§d¼Z‡°e¤s|ݼìebXH9i–W:µkkŒ‘c20ìPu¤ÒG …-FVnŽ~[·û'SX@hƒ@~Øî28iN•­P¾l¹èæ«­æ Jt¸‰¤OƒÚÝh¡Pˆ{tB\ÌJÁ¬c$ÕçZU¶K›ü?cyQg„Å}à‡¦@²4…î#÷qkÂAFÚl7*«}Úر…¿„âY;IÝæMj¹¢Õµƒ'ã¢rõ7/>[YÚ6%Ì”¯ÒÝîÅŠ>¹gê&ËžÒ*mÜdõªÊŸLè%"z_XaÓX6šZèàn ¶ÙÙ‚Ó¾A:eìH‡õ‘•vE¢.¨÷eG!´tÛB/¬$]w{´•jðY³mk—;Z€ÌÁ¤óŽ²uÞ8G·kl,u™åm0Eàáá¼¢ºrKL}žÓ&ÒDEë2s£¢Ôå<‘Ñ*mëÌÊÒâŲÞí&[5N»-ônœ»uô8‘¨ÄGŒVeÑdEc8—Š£›Æ-±«Ëž)€±Ã=–ŽnlS}T–¸<ºÏÒÂ8Q¿(°³AŠ˜Ë¸ætbmŸ~æ&û³MžØ”ºx:{öµÆÓ§×2ùóá‹Xû¤]žµŸÚdíúvPhÚIx¦öñp?"úѾœô”⨧SCßûžR zJáÉ·Ñè)c„ ýŠ=%ìõ=eèhS© o*áâÿÓTrÉ"#× -ž}­qxz-Ï&O ‘Ô³u^AbФ愺•‹›6Îk¬€: -Å¡. Ì»ÚÚ‚¢c˜af©\ !㠽ǜRóY¿3šÌ¤ÛÔMŸ«]»Îì Ld±¯«Gí ÑÝWNRŸæŸ[(ayé~µ¬ÂŽ}‡ª_z2[Û„¨A<&Cä¤õ0ßUs iÙŽ?¹Ä˜ÚGïó]Zíœtå}fÈŽNº€Œc 0¨Ä¹ ‹¾Ö¶:-ƒ­çPêÓ×…ç±åÑ0eœ× -X7Ä`ÆCëV[}À@‡øª€ãJúPI„)§=P™9 ¨ôhHB´Ä‚CŸJ­pgاu“U}%;þÇÍÝÕ»×KûvL‡!Hs2>ªªÏeõ‡NÄ»¦_l\q,ÊêaßϬvŽ;èIŠ€Ë(†Ã¥¾ß²°ƒðØ„¼¦P’ˆ³M S)y®«ékƒÓkp^/ Í®áð“KvJ%ˆÃаd¸ä50(ë=Ç›`Ô²ó©õsZ”…¦Ë}R3zŒéî9}qcÀÔÚõTû T1ÆØß¾r?ª·@LUOkâ¨:-sT?}Ùü¤a‡;ùSË‚wòÓ|ªI¯¾ú4÷žúÅp"x®ÍR‰ë -@Ç»€8ßç…>cói¾[¯ÜíƒæÐ —ÑÝ´–j ,îLƒf˜+ ¾†E¥Ã -§.ÒyÇðj{áï¦oæ†Íé‡æ^­¿cå–íég[¬6¦/LØ7ÓJ¿«­¥ðzâÝç²Ê›íÞ¾j–uÿöʾ̸æZæîVèc áënru Œ’I}1E0ÿ 7¡ñhc>z]©s™òWU¯ä|ül=ixe –®Úìì¦Ôú9¯GÜÓ™;pÏÃri?¾|÷ð>°ÇStöögÜzJ¢ÞÏf>¦™üßØܨ݀™ÝòD¹Ï>¡ 9,ÒUü77w×v>åvµ†“×M¥¯®­è^7÷ƧÅʹõ6-Z¨C§Ë“X"ǃ[Æ¿2! kø÷{ùññû÷÷ç=zS@,2‡‡ É{wöWeQ—U“·û±?P€¤®ÿª ”Ø›øżpø3 (8LJŽn†uP¤3Joó±é‚Ièhi°ýî“;!endstream -endobj -1992 0 obj << /Type /Page -/Contents 1993 0 R -/Resources 1991 0 R +/Contents 1990 0 R +/Resources 1988 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1998 0 R ->> endobj -1994 0 obj << -/D [1992 0 R /XYZ 85.0394 794.5015 null] ->> endobj -1995 0 obj << -/D [1992 0 R /XYZ 85.0394 225.6507 null] ->> endobj -1996 0 obj << -/D [1992 0 R /XYZ 85.0394 155.4035 null] ->> endobj -1997 0 obj << -/D [1992 0 R /XYZ 85.0394 85.1564 null] +/Parent 1966 0 R >> endobj 1991 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F41 925 0 R /F39 885 0 R >> +/D [1989 0 R /XYZ 85.0394 794.5015 null] +>> endobj +1988 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R /F53 1027 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2001 0 obj << -/Length 2597 +1994 0 obj << +/Length 2340 /Filter /FlateDecode >> stream -xÚÝËnÛHòî¯0‡‘«Ã~²X,ØN ÁÄ㉒h‰’ˆH¤F$g¿~«_M)ÀÎ^69°Ô,VUW×»'üÇ.PDMbÅ0Ÿ,vÑd ïÞ]`‡3óH³6֛NjWoi\~yüåâö±§-2Ž¨–寋O_¢É$ÿå"BTI>ù?"„•"“ÝãqF©_Ù^<\üÞl½5ŸU€#D¨ <Á Q/ÛJà -¯„ËŽ`‡y²K—zG@vF9Šá;ƒr/ô:У-Q(æ±Õ¦ýÜèç3!±…æy•ò´²¿–Å.Ér kt •éá9=8 0FŠsâ8ÐqÁ¤áðð=/öeVöµN1Š¥ AA‹–0ÈM8èqD…(ÖÎÚ$ŒXQƒÕÚ· ~š±/ ´°[ãmÝa‡s{McQä«l=[e[§è[gÁ)s¸ Ýe€.›œ;ÔeúT¯gÛô9Ýþ8ÙU­h`¥8 ûÏWÛdàAb±Ä}y€ÞŒJ‚0àË À7?-öu¢¬”±êSÞŸUʾ8T!z) ´Q6ÐC€rW…?í’—YY,¾†äŸ‹c.ûô«ó‡˜ÒEU¾‡ˆ2$¨·>K´.½Çõ‹ˆNŸ¿˜¨0£°]‰á4ÝY¿ÿ4ûWƒù`  ¢.ñ–ž,6阡[ùB S‰˜Œânh¸¹}¸þ0¿œÿv×|ÕTEXµ#Õ0 Q0VyŸ„83ƒ8MìãÆÅ. ›€h ‡ïe•î,ü9âÑÍÝ<°]p-fÓ+Xˆ£é>Ó3¯Š•}VGèÍüîÆBÊ>–YY²§ºÊ -Çuu¸ÄrZ8nó‡kd¡·ÅÁ»Â`¤î´Ün:Þ”å«â°K,Q|ýÓ¢ØÁ•ËnéÃÛëÒBÓèU2&ù²YãÈg,‘‚¶lRÃGÏÅW›'äô[VmŠº²o#üºÞ¥yU^NóQ w>£§3Ž¼}˶[Kßê&q¬Ý~ÄÈURo ‡?GYׇFErªW‚æŠã1ÚÄŒWiµxe¤B:žD“ -TB} ¸²çÄ ùDœôª-­Öðw dyVeÉÖ¥Ó¤JúG°³IÝ™®´ahà¯:=di‰~ Çþf|hXظÉ BˆÑZÌgÑ6–¯C†Y´ÁÒ|g¬ÏR0¤–§Yz¤ËNœ0¦¸Ëòcéì{~ÿ̼7l¢!g:-f«ž‡lŠÒÕ3;fYî–3ç#‹dŸr•PÎm]%ò”úÒÄ=ŸÊb[WnuŸTmv£Ñ…( $’ÓÑ¥5],]–¡è‚‘Tœ†ûæntÑóhÜOÊ×`ìFˆØ°ÒðÁŒK”;H ,“tWä?—΂VÄ…æ Œ-0f`Q…ÇÆd¼—_f<žÞèOÖÆêD‡d¡N3lÚ‘@¥Ž¡“W‚ž¯Ô!ûxù”Î\AŒ9Š`¹g…~\Ôt9æxôSáSxRö’´W•.Œ­ªl½påuéŠâ BsM;S궱N Ç2¸9B.äö“,=R€eÏ!¥€R¢ÃòCÝoó|0´úè½\9¯í×¾¹Ðn†RÝwb=Ís“¼Â÷Œ™fÿNu <®W¹"&gŠÇ6Ö ½z,£×õ@¯q¦Î°ôH–m½B¯ÇiÔcù7éµéÞÂÂÛóÖYì¶ðNÈžÞ+!¡‹<ÎwÊj™!ŸëŒF C‰ ‡x¦¶kcRƒeiŠ¾Ð• ¦z£Ä¶\Š#"$>-—G -ÈÕ Š”’L±®`PµDÓú`f-tjg.lº‹6ùÖê2Y§\âƂœJ“u©o -€È½ÏóÕ½³?’〦_;BA¢ˆf>§y -®ÎÔ3”Ŭ!câõù£T )˳Æt–N ¡a´ˆd½©ÑŸŠnhºžn’ët=»Eõò#•ªŽ`›Ô§Ø¡=›r_xo¬Šžÿήû†©Ã¬€VKð?µÓ\ùhö´öC>3OpÖ¦84bu ±<2Öûzû~  ¤ˆüwJè)žQ -DpwE¼¹}óñÝŸðϧç6]—‹Cö䯑²<Ôã2ª…ó6õ¬\¼/E›ŽÖ4磋ϥú6Ö‰hç±L´ËÏÖšÍýF'ÜI !ÈiÁŠ)8Œ_긇™í„ô‹äkjW’ås’W6 Â ÓÁÂs]k¶ß:¤ëû¥»~;Slèwå>]dº™I—¡a1Å:6Ò• Ð-ƒ1ÚëyÜÔ"v¥£¿ -s? 6 -åÎÎ{ôòÆy½{2‰ŸÙÝh\-¿]Ù»à’æ•]°)€Åñ Ì7Å‘rk¬Ixê@YÜùÊ®dŽhæ¸Õ¹›=1æª3ou¸í]´#\³‹ÖÔJï™]‘™Ï϶ü¹[2ݱµ¾›Áãn—£Þi\Aø?íŒ-¤q_ôHÆ÷g]Ñß v<‘ ¦äi¡<ÎP¨Î}i Þ§ºBýzbZß½Ÿ9ÞZöî‘™Ž±dp·y"úä7_õÊ÷ŽGõû¨æ’ä8â4Ì ÄéèaB¦Ÿ¹topÆÒᘓ,CbF¡c<ÁÌ£ ˜õ†rÐ|â6³?ôõÝ!óc _jØÕƒFuURÁQf‹òD‰®›qÁȱB×W_°*¡œÍŸú’UhìÏM Ó#ØwÔ\õü׊rüS¦ïáäÈHƒÄ`ß -`'”Þ&dhîV†²ÿŠfendstream +xÚ¥]sÛ6òÝ¿B/RÓ%>J¬¦nÛ9ÓÞ5} %ÊâD"U“râûõ·‹(’¢Ïuôp±Ø/ì >‰àÇ'±f:éĤŠÅ'ËÝY4¹ƒµ·gÜá„)ìb½¾9ûùi&)KµÐ“›u‡V¢$á“›ÕŸÁk¦Ù(DÁùåb1..Þ^þçêr> yb¸ f××óËó‹?¦¡ˆ#@ä( +>Ì.?ÍÞìzšŠ`öv¾˜þuóÛÙü¦¬+<$Jõ÷ÙŸE“èðÛYÄdšÄ“¯ð1ž¦b²;S±d±’ÒC¶g‹³µ;«vë˜1Tœ°X(= ¥b ð7g†s@2qÊ´²5™àc&óXh²p6TTf4—“.±–i„¥ì°4‚ÓËß7y9 ¥Hƒ»¼Ìﳦ(ïè;£áŽNÒt¹É +‡\ç MšMN“«ë›)O‚«O7ôý9ŠdæHUnW¶Ýž½Ç]ù²²ãªvˆåŠ&«ŠÆ²jzRæh¨IÂ’ØLBÎYÇÂêã(£÷œPFà>í¤(ë|y ‚¬òm~¨Êš8œ;UÃ5SI¤¾sô¬gŽÞc¡Üÿ­ÊL&¶ùu*˜Ö&}žµGaÝuÔ0­Àq{¬o6ÎŽ¿/«²Ó¶Þ€ßGBA¨¢ñÖ}×Å]™¯ž4Nb&ÈÏš®‹õ´éZ,”ÿKþ8äi$“Qôži„g/lXäž‹}¾,Ö ¸ÖÁ×M±ÜÐd©iVoªÃvEsk!uî Övˆ6sCBC.”q\¬ TVCêYë¸H…ÁÃËW¯bìiY²¦OÖ‰[`:¹0ŒÀÜ â(ÿ–íŠÒŠ+}Ô@øA*7ÿ7Oã #·¡Eâ+[Á¥}þ ‹)FÙ£vxG¾®¥cù àvQŽø°¶Ëšå†|¾ö÷ŃOQ_-´à+Ÿž Ù€h–K…S±©î§œóàU»å¸¹vÛY;Ꮋ›uð¼AN$Ö·[áÖ“P(–FB¦P…Pâù³×ïçnC×1A5¡¡u£X+àµÝV_É:†@ÞíȆ°†ìkš¢Ú–¦J:49ÔAë¨õ‚ý6g@dD0™hëL%š 1o¼Pç‹M0XíÄ'òaÞ>¶&éH£Á"Iš:«²†œ Ø<"OÒ°8Q©?sjD>Gqô®£ û JÓOÜe`‰ƒKž’ý€€ÕãG¬C‰i§eBq +ò¦¡†Þ×98F)E]¡]}¿±°Ï\ª±ü÷DŒ¡öÉ2ªî}Dî„ÍM¤Ÿ¶(ý\˃ì¶z€Ðr_ŽÏ«»§)ãÙ +nEÝ@)…‚k”-ÏQìšY@mÓ¶íé½XÎ|–âˆ9ú¦ eÃDÝ¡…À­p謰ÁÏíýZ±êÁí c] NÈãi…­ÞÀJ cF à`•m”Ôg‡ýóˆ£;M1+¸ØÏî2Ÿ |¢j³tKæ¨g›†¹`fÛ™$8”`éæPÚì%•~«<ÌרèÒ a¡WábcO!øò’+n‹mÑ<Ò¢_²~?ÒÜ;ç/¯² ãZ´U¹Ê}z¦†ËM¾üâxVÚe_r‚Ôí³ ~à¤Í®•PÃ8p·&Ììî]Ê%ÈÒv©|¤Eì-[˜+R4Y¼ÆÛ-¾:‚,Ö怓5P?÷nÙJ#³]&@ŸwuhìœèRh÷û<»§u <æN‡å2§+¼Ž:ÑíÞ` 9œ¯Šgó2A‰@ç }؇=kœÙm‰”Kä±&Ul¿Ç@ +½÷Ï?¸X¨wûm:2?ÒhÆbßf¦“Ç¢a³HùIrÑZOPk#´þ¾ºÚö@ö¢ÁÍѽ¸ï9¶yVÛü—ÛŒâ +ÝL`²Ë³²)v6‘ X_¼énÅ t^®œHô.✱¥!p‚=ùÀ­g½îúe¬‹0ß…@Áîë~盬yòyηžÎ‘ ×÷mïúËüã…o‘°åYWÝ÷Q_çl¾Á ™{•~1ŸÓžÙûÅÕw_1zW|¼Š%x‘r™vo[œ©Hz½¾¸<'6©ãÖ+^ô±ÛIèCV²íX?¯lyµ#?&>Mpßðüå Q™ä=ÅÁ¿cÞ^FŸÒ˜%©Øoöéæ׫ß5ÜE Ío™;wX<ÖÇÜ9¾©Ê +IqØ=õ7ŠŒþ÷1òHµþã¿XŽ&)¸2$‰n&f°Y{¡P9.¢ÓWåˆ ©ÅˆìÿÅhØ^endstream endobj -2000 0 obj << +1993 0 obj << /Type /Page -/Contents 2001 0 R -/Resources 1999 0 R +/Contents 1994 0 R +/Resources 1992 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1998 0 R +/Parent 1966 0 R >> endobj -2002 0 obj << -/D [2000 0 R /XYZ 56.6929 794.5015 null] +1995 0 obj << +/D [1993 0 R /XYZ 56.6929 794.5015 null] >> endobj -674 0 obj << -/D [2000 0 R /XYZ 56.6929 769.5949 null] +1996 0 obj << +/D [1993 0 R /XYZ 56.6929 614.1369 null] >> endobj -2003 0 obj << -/D [2000 0 R /XYZ 56.6929 747.9385 null] +1997 0 obj << +/D [1993 0 R /XYZ 56.6929 339.2217 null] >> endobj -2004 0 obj << -/D [2000 0 R /XYZ 56.6929 712.2038 null] ->> endobj -2005 0 obj << -/D [2000 0 R /XYZ 56.6929 645.6981 null] ->> endobj -2006 0 obj << -/D [2000 0 R /XYZ 56.6929 561.1687 null] ->> endobj -2007 0 obj << -/D [2000 0 R /XYZ 56.6929 455.008 null] +1998 0 obj << +/D [1993 0 R /XYZ 56.6929 150.6999 null] >> endobj 1999 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F41 925 0 R /F53 1017 0 R /F55 1025 0 R >> +/D [1993 0 R /XYZ 56.6929 84.3474 null] +>> endobj +1992 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F48 950 0 R /F41 935 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2010 0 obj << -/Length 2569 +2002 0 obj << +/Length 1439 /Filter /FlateDecode >> stream -xÚÅZ_oÜ6÷§p•®Êÿ"qOÎ%¸hÝ\ãÞÐöAÞ¥m%Zi»’âäÛß ‡Òjwåu{N°Èáp8ÎüfÈ Oüã‰Õ“N%¹S™f\'ËõKî`ìõ<‹i1åzq}öÝ?ež¸Ìa’ëÛ‰,›1kyr½ú5½xóæÕÕËËÿž/„fé‹ì|¡K¼¸úå⢽9w"½xýê-t•’˜²–^]üøêåùï×ߟ½ºÕ™ªÌ™D]þ8ûõw–¬@óïÏX&ÕÉtXÆÉúLi™i%å@©ÎÞžýk8 SçL „ÍŒ49´l&8ÈøËJ aç—e`Ï<3ÆœØÍc +6‡û¢œÁ1(“,Œ=¹HÈ„óÌi-ð„8×™*Or)3†48¡+4pàt™6ŠF–i)GŽŸÎ†§×ðW¤¯eJ¡mb`·Ž[\:ù#áSÎIbš´ÃVw&„ï.×"yÙÀ†’éžÁ‹‰ä°)#&^Ç5ìÏ2›ä  -”F•¯ïËÝ+O›MW65µ‰fÒuQÖÕ§8~ÇêÎo}ÛQ¯kèûâòê%ÍqDXùsÉÒçB§¾j6~—)ê5Ö2|¢I7žˆ[¿nιŽóVhC<ÿñh@ãf ¬¹M—÷E}çWÔ)kúô¹í»~멽õ•/ZR³Ã3Q.Go•ÉÄžç`ÒÝA´-vAò<÷_—á ØÜC‰yäaà¦èJfœvç×|xF.´çâ-ùµÖSgá™uZF¿þÛºø¸h›åûöÈ©µÉrÎL2]øH»‘kF?9]Õp0wû -^TUócoº°Knsu¬‹5ùËL`eÕ°rW–ö­ }a€¬0«U&%ØeÎ -Ë‘ cVäò]{äoüÀ\J~päÒe*‡xþóÎ;Ny UÎ3f{5ÔtNÿ™ÃGžé,Df¹Èøsø{°òrl‹ôõ£ˆ©…ÉÀD„L §Áä´ýdÊS9}3u®ÀNN1ÓÙfB»½oújEígðíëÚ/}Û€Yì€z‹À` :Ý}ä W\…Þºx‡Ze¦EF¡-‚i€³…b -ÔñãÀ,`Â<)%¬„jK)Fµ‘º$­±9Aìšq8rúú¶¯ˆrã—E"d {@j»ñËò7Æ„"iSUÇGÌÇYa¹‹}•©Zz x­¸L«r]vé¸+¤G¶^y²Xõ©¬ïh´ýÔv~M o.3¢^žó´£&š$®³õñ`⊭ïâR˜g ûpvRÌD% ±"E_uDX65Úã®ßžs GýqÍ×R›,q”ÝxØÓ)ήFéí2:Ŧk¶q6fÔíèP Æ0ùŽ‹x~l ¹€Ã.·M½öuGœÁ?`ð}’ðCMdM$·ýfƒN©X'Œkì<ðÖ¸b¿¾Á# JÜÎ3à$ªñÿ^F§ÎÿªéÂ1@ÁPµ ¶0TŠŽhñÐapÙõ¸%l<—kZ–S°Og ô&zsQaqäЧ*»®š ¢p¬õ|@©(RõÐòÔØ3…S 1Nç‰2OÀK³—sH|2Ï“Ú.Iù”G&(Æ<á ÅnõhÖQ£Á…°=u! -½…`yf•ÍÜ'øW(¦F¸ÂB«k‡Š«ódÆàSH꟪²¦Yå™™ê+×YJi°Ùôþ0Wg\¡Îêfê,—q({ãA®Ê­_‚Ý?%B•Ã (‡¦ËWY׌v{>¦$yÈò{êýã@2Zƒ H˜ù‚Ê2'场k@ÁÇZ:p·ä+ vC«`R – -¡#,×kº@§*ë@†Ø sîzªö[ IžÞôQÏÛ„ñ(ƒÚÅ -¥÷æJ`W3舅ß ‹áþÃbÄ1¾ïºð ûˆ×ë¥ßtÔ·V—ît@j3“›à.– ©†ätSÖ«S© -j½ËåtoÒøÙ×mE*ì]¨-½Žc#<>Ь&ÞÓ¸EÜÑæð©Óþ÷À¦ßböV2§÷’áF H”þR9\¯¯‹ÎÃõ—3–Ð(Hoô@„“×¾¨£Ôxé–æ±Ç@T0{ºÄe‚ï•8$s|ZÁ< nÊn¡á²ÂÞãq -GÏ.Ç^ eâN=íµÒ -;)PäP(aÏR•Ô¦A‘‰Œ[b@ÅVˆî:œe¤Ïp .Qn±ÙzI;wŸ ªÓ£_9°ÜÍònM¡>c˜8èÁ®lú–˜Ö‹Ô&3œP‡šëÊ¡8¢îqаøèÃâ ô·¾+ÊP^ !Ÿ{ÃáûNH¥'‹9™åÎ ÿñBi -âÏL _¹Tr •öt¥40…úph¨­3<™ˆ:Znà9^o4Îf6Ï÷×ûÙcÂ?‹ ×ä~ÛŽ×ã:>ªa;þž~÷±ìŽÎ6̓I‹Ÿ° 4v<'~¹"ž`–™Åd ù©Å–£ÅöÊBȘ̺ébÿ§Mnú²ŠMB½ð|ñ´Õân¬””³;aÉgÏþY÷ßTcżU$Ã_õB»p!•×Pj+ò9íÿ Ï'endstream +xÚ­X[sÚ8~çWð3EÕÝò#Mh›nK²ìîL›Dp×—®mÒ¦¿~,ÉØ`Èdv§3Yþ¬sôï\bøG†J ÌB> BŽ&b¸JxøïÞ ˆÃLuRµŒÓ8‰ŠäÉ÷Ï™Oà:—Oj‹©1 fÏj«:­­Ukëñ(ó D†ò“Ôc²“y +b˜ì˼G]”MÙòUμ=®Ç0@ÖcéòÒzìbûPDéK’› ˆ<1¹ìÐB €GÕøÕÆ=oÒƒzL€‘PtMÞèb“iGŸ•.]L’DM}ËwE%ÝzW²ËªÇ<\\Œ#J9“áäææbv>ýÞb Ä8ü8™ÝM®ÝÜÍXÓpru1]|],Zµºª̬N>ÅA -'ø0ˆi%‚gxÁˆhMƒÍˆ †g¬™Yæ£ß[†Õzë\($(— -CŒ*6 A1!@s‚HÌh %C€5T°è»=èÙ¥JÀ0VZwK²L–&Zeksˆ ¡1¢´ê -î©×R èǺRE”i¹¯àu‘¤Î4iR%n´ÚŽ‰ -‹W½Ë$ÆHÆØêò$ˆ“²9e–W…ã^=7¨w»a±:XKÍ*Ù­+÷ò”™gë7è EÐdŒ5b’ÿ”×0Uû³ö (ÆH1}œ•Û†•ú ûŒ¢F·H2QÁºV!i!¨…IõbE©@‡eÖ<…䤶°‰iìñœŒ#IÃÛúÿ$œ¶c^õ’HChœYѸV&ø0Єn–¨;®ÿŠI=q6ݰༀ3ÝczÆQ—s}LI»ÎG’ ¸KÉ‘$®±xÈÊqÄDUVän¼îÊʽå…|3î¹+Mj3‹‚#û¥–K¾~ñ£•_É+³5Ž— ­ ÚÙ·ÓÙ¹i÷H͘Ÿ©ͺx4ÛÒh½¡µ¨›ä6TbnKþâ^¬^ö¹5›bL„çâ)‹­{.’ü¾™Ìr÷LÜcµ«vÛ–ÉÚ$¥±|zÞÎ¥FTit=ê—|”óI Ù6zM’¿?ûnO¨TÝdÙqû&[ -ͬ?°àùôj6¹ž$°†¹¨ §A*C—¨vU–7am—XWzevŸ'ëÒ-–Ånmm@½[ÙÉo~§u+7ª<—E^9k·Çe'XÉ“)ÍöÉlóºv ƒ„SÅ}¤nót9p"JH6™ôUµ¾FÖ‹ËÊ$iÏ#šÊ$˜•|O–¯.ÕñòÕRyƒ¼¿»9«c„5!§Å6Db÷ª¦Ç”ï˽,jà—¾øºTÏA|6«W5œMlOr*#†ô¯Pu¨N@ÕPy¨¦³…-Soœ20±¸¸ýØ+êò¼ŠùiMZªUöà¶%Dã¾.;_:Óâ9? XŠCÐ…¸ÐħfÓ½l‹qziò4Ëï½ò¿ -b¶ž  =+½Ö¢gžh—§æ Æ47ÎÕs$&‘Š†ï>Í.§Ww·‹ùbúiöã´aÕW¢ÁœV]$ÚØNX1Ž0‘´é|ŠÜjz¿sÙªf¡YÛ*…¹+I0W…,‹ÍãÚ|w«•ŸLM¹Üfßš=y3[%ÙÚ-œÖPñxŒmÙ·”ŽYeº\_qÂyøèÒWäì =nl»[Òž²ÔøhÊ:ŽRêEÇçâ’0|W@-µvIºÉò¬¬ŽÂ[õÖ¬¼îyÇ“|—¬À%RÙf±É†ƒÖ‡L ±Þó‚ËéõÀeÂÇ1cÅ®õQ_\ „zCdEž™jyV» 7Xõ\"h6â“Ò[¢žøƒð&ˆ1µ'~1Ø#÷ÒN:‡<š ™m›û>ª5T5BOÉöl»ËJ«Ç,=T„bh"ק5i©úªìWT,a’íë2 —Œ¥)Ë(K{hõ|pÈœñ=ß›_\xï¿žˆ™ƒìs{ùnC¸ß² àp·â²ÉCoÚû:#ž ËŽÿ·ìÄO°³P—,#¸Æ-ÿ²¡ð ¬àô—ÿ)rs¸l;£Ã¹õ³/8é 3Ôˆn¥¨ˆ0(‰\$ºÿ%cµD]¯™Ü-Þºý™®.¹ñ;pã å»"/‹m•í6¯b9b\6e’CSE9m¿Ù€e1Æa^îášošË ƒ¤î:ï€{D% Môgumlö»xÖÔÎ_À8ÙÒ¿Ì澜wh¡E_gÕ˱¯>µ"ƒ__p è/zýòÅ¡WRêÈwè…l–Röà„ò~ň2@¼¯û¿C¤•endstream -endobj -2013 0 obj << -/Type /Page -/Contents 2014 0 R -/Resources 2012 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 1998 0 R +2009 0 obj << +/D [2001 0 R /XYZ 85.0394 227.6801 null] +>> endobj +2010 0 obj << +/D [2001 0 R /XYZ 85.0394 156.5137 null] +>> endobj +2011 0 obj << +/D [2001 0 R /XYZ 85.0394 85.3474 null] +>> endobj +2000 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R /F39 895 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 2015 0 obj << -/D [2013 0 R /XYZ 56.6929 794.5015 null] +/Length 2415 +/Filter /FlateDecode +>> +stream +xÚíZ[wÛÆ~ׯà#tŽ±ÁÞw[I•V²©O?@(Á™­°¿¾³7ARŽÕ6µÎ1»ÃÙ™ofç²$ž%ð‡g\ ¡‰žIÍO0ŸÍ—'ÉìÖ~<Áž&DqŸêûÛ“ï~ r¦‘DÌn=^ +%JáÙmö>ú)t +’èêìòüMüú/ç¯ÿúÏ·Wç§1–‚àèìúúüêÍŻӘðÈ8I¢Ë³«¿ŸýÍÍ]Ÿjýx~súáö§“óÛN°¾ð8¡FªÏ'ï?$³ tøé$AT+>{‚—a­ÉlyÂ8EœQfÊ“›“Ÿ;†½UûÑI0p‚d ‚g˜!Ê`±׈(I xVé2ÏâùC>ÿô¯ºÊn°AL’B1K|$f8ÓÎ@E’:Ñ–jÄè•ÍÏÖËÇ¢Ìívú7B¤õæ’„”~ü%-‹¬h7îÍ2-ª{÷V¯ül]}ÉWm7ßÖuéÅ0Òœ/'åˆ +&­œ7›ª~lŠflEŠ‘T‚΄!öf£ŽA{ÂÁ.{L‚$Æb÷YX‹0<áŸÕz§±Û¼³aôÐ>v£ÏÝèK7š;xßRD(¤56r›½æeÚ4Žl ÑH)©=UÇq1ÁDW‚sOº¨WË´à8$ë8þðr»Æ KÄÀßgqgvX|SXP¤qÂ<ƒeåSHX":–ûÓQ¹¿ŽßòÛø±1¿Ë–¯zaùêãv‡(QuáfÀ“I¤H"Æ<› ž1• 8!Á!\hÚM™?ßïo^Xûö(¿¬Xåó¶^m&˜r†áxÌôé?ÁôM7úu‚½àHrÊþ&²ë‚‘¤7HÐÃSÛ÷€©ð̆³.ð7„ç>‹ýá¹£ê…ç~è?–A¢„+þœ°¬Æ6zýÂgý¿åcª$”6BŽŒþ•¬‹>šöÀ^½°|/ˆåó1WÈ0ý–8üÿ¸ÙÅMû64Í°Ö)áµ´Ö¼oÎo^ÿrq}{ñöªûÔ°ç‰Èd!?Qù+†‘]9i(SƒÓ¨}°<‹šMÕ¦¿»É´ÊÜdQµùýÊ—õ4ª~Ý­†N€úNZ0 +ÙEë&ó• ;Y\ÌÔV¥Í„ž”*„ àZ='´‹!£ô(Feun˜+==ä••uš¹þC95”SDg˜D·EãÖ–é§|J$,¹IJª/Ò1è%Ñጬ›|±.ݾ ÛÁ ×-ÁÎU˜w¨zîrCUä¡™2ë÷±ËÍr3ƒ²zÁzµm¶ò¥Qk7J·-Ÿ5ù +:´SÉ"4ív:ôDÉ=)vW{ÍÁ"œ;.lS,‹2µÚcè'¶‚óªÓÏG”NHˆ¦•U*º[·n¿¢u[¥åSºñ2dëå£:ׄõ½mUÛ¼jAí?ïÅÌçv¨r4££xYË€«Æ4á]—Lл¹Ô½FZ—V3JeÐPu•–åæclÔ¢X[m,“ÇDz0îaYµ«bÞ‚íì’…Ê-”ù—¼lÜôÝÆ=³|‘®ËÖð#ÆÕ\ë÷©ÂåØn­ßQ™}ãl¼%+ÑòÈ–hbË>Tj~©F[žWé]¸úÊò»õý=Z´Ws …¨yXñ-ѽ=‘Uûa¯ÚöÛj=ÞoRéÞ~×LÚ­ïÙÁºI®—Ëtå/}‘DùïE»½EB(9 LŸj?2•…æó>hnÙa³»å8ƒ-^¹GÇVŠvoAW a©®|Tßö\Ó#èô¨ ¨,:_vÐá¦~:²e šØr€N‚8MF[NùTMm\i¹/ªAGÕM"¾¦ê¢š†ºãÑNõý*]~•{Ð@svÄ=ªTÖw @%RÞ2Ml9h[üépK—m*êJà¾1¦oõ]Á™f#âõzU™tnó‘·\pq€´i›½ b-†°rÔ>Õ~P;* j¸±áÇAP¢í\ØôÓ) =ÆAÁÑ„`t°( ©JvcRøb3Ñ ³ãü5L7…“è¯Uu»S¼ê¾›aWæo‰&T“ól¿))䑼ԧ:`Š@eMQL˜BC+Ç娙4tJJ+Mˆ5è; ë2×(±®]C +¸2èNë¦ÍYp¯¾(eƒž×,¸&ÕÔ‘JG×uÓ6ñJ£Dã¨RßšMd2¨Ö¡‡5V‚°´ÖÚ[†Rý-ቯÕaˆ_M°g %JÓ÷ØH ‡|Ï.J9!q×-í²…–Z <þ‚Æ°+ëyºOzh†8Ãü_ÕîKkÙW›’ ®‰ÝB#ÊeŸsÝ''A‚KÖõ¶Âǯ ù‹a“{ÙÝúÑÍГçµs€péA™i·L`\éò›qn4w~Öô'¶¹ZÓšé3÷Z¯ü+ü›b⨌+ÝAwã(Š*Ï]2´œÖm\/âî[å˜-ñèKhMZ“€ã’>HíAÉfa¢ÆæÞgpeJ¦¶>Ú~™ìCÚå»~bêád&ŸŠùCÝBæ¾i½S¼Mt"ÁÀîŒðçÙß|?ÛÕÇí¯Æwo”¨`~ÝürÊyô÷²ëD|À|´vÏ3÷¨ý´÷&ŽGÏ€bëðâ|ÀpÚñ…¤Ða øŸú@֟ĈêÙŽIIî\ÆH@¸€n²Ìï»6œGÐOÛç„¢|¨ðÚÙÈ`µŸv^±ËÄÍm½Â¼õ€¡LæÖ+¼;HDeÂG·B‹àJÐÏŒ}ƒij¯„ÍZZ6µuçÆþÀè¾\{.i–9aO´{*`ÒÞ§Yöc$ÚŠ±L[ãnÕÞ¦8¶ö(MžíûM5×ñ“ PÒ]|óï…¶¿Œb€§R{M"9„{¡ Ö˜ÝzÎÿ²hWöÉ #ùendstream +endobj +2014 0 obj << +/Type /Page +/Contents 2015 0 R +/Resources 2013 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2012 0 R >> endobj 2016 0 obj << -/D [2013 0 R /XYZ 56.6929 586.3808 null] ->> endobj -2017 0 obj << -/D [2013 0 R /XYZ 56.6929 444.5078 null] ->> endobj -2018 0 obj << -/D [2013 0 R /XYZ 56.6929 369.9671 null] ->> endobj -2019 0 obj << -/D [2013 0 R /XYZ 56.6929 265.0122 null] ->> endobj -2020 0 obj << -/D [2013 0 R /XYZ 56.6929 190.4715 null] +/D [2014 0 R /XYZ 56.6929 794.5015 null] >> endobj 678 0 obj << -/D [2013 0 R /XYZ 56.6929 151.8306 null] +/D [2014 0 R /XYZ 56.6929 769.5949 null] +>> endobj +2017 0 obj << +/D [2014 0 R /XYZ 56.6929 748.2469 null] +>> endobj +2018 0 obj << +/D [2014 0 R /XYZ 56.6929 713.4785 null] +>> endobj +2019 0 obj << +/D [2014 0 R /XYZ 56.6929 650.1391 null] +>> endobj +2020 0 obj << +/D [2014 0 R /XYZ 56.6929 514.9018 null] >> endobj 2021 0 obj << -/D [2013 0 R /XYZ 56.6929 115.5088 null] +/D [2014 0 R /XYZ 56.6929 376.6996 null] >> endobj -2022 0 obj << -/D [2013 0 R /XYZ 56.6929 83.5219 null] ->> endobj -2012 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F53 1017 0 R /F62 1050 0 R /F39 885 0 R /F48 940 0 R >> -/XObject << /Im3 1162 0 R >> +2013 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R >> /ProcSet [ /PDF /Text ] >> endobj +2024 0 obj << +/Length 3046 +/Filter /FlateDecode +>> +stream +xÚÝZK—Û¶ÞϯТ Í9Š',ñ8uOÜxÒä4É‚#QO(r"Rž¸¿¾O‚IkoÚ™…@ð¸¸øî ÿd¡ÂLó…Ô LÄb½¿Â‹÷ðî›+âiVh•R}}õ×WL.4ÒÍ÷Ûd,…°Rdq¿ùeùâíÛÛ»—¯¾^Q—_£ë•ÀxùæÅÝ/¾s}o¯5]¾øæöÝõŠÈŒ R†,ÃË»on_®nþv{ó÷}w{ýÛý·W·÷‘±”y‚™áê«_~Ë ¬áÛ+Œ˜Vbñ­ébÅC‚3zª«wWÿˆ&oí§cÂL!¡¨‘e‰4†6ÏRh”1xe¤ñðÑ­¹Û®±Þ•ÕVË¥Ùf‰0ŠUriæ7#üJ)¯šu^™†§N§edBuSWÃDÅú÷ÖµïÞ¹ßÃ5QËbÝØßù´+×»ôý¶8x¦÷[Ö«7µ_À®i»:ßþë&ÐîòεÚfoWµX¢‘” th!-µ,ºIþ8–®±q_½¯Ž~‚âϲíÚ¯N‡-#»E}"SËNqøø¤¥'ÌÑ»¦Y²Lb`N!F¥°ÌMl €s,“-Ù«jÕ–UY¿ŸØ™Œ#ª8÷åõfd`Qül¯/¬ÍD`gS¶ùCedÁØÒhh*tG4@ïñs¹Û×Û€8Oeë?pÂ5‚pEÞŽ,¤‡a“¹›L"šXÕ ¬.‰† É?I ¨§v k‹uW~(@%!K·á+Eç˜?wß)IY¨8SD¸"ÃMiÏÔßì:3läßf™BÒ`fÔ*{¢UJåì±Ê‘Ê°³Ú:Ž…H(ÁN)&<ÃÛæ°];aŒ0 ÆOñyÎ"Õk 2™–CÞÞÁ6•ÛSCéùqFf{ò²7G¿bL«ÂÔ·Mkð?Áï@ÀúÈsŽ8(wWüÙÍ"WbhoŠm~¬:h?Õ(œÁ+H-h2Ë!ššD"B"”¦Ñb<&êZª´*‹–W#hõf\² p¡ˆ +PÃYÖ"ÕoC¸H&H ™‹paŠ;D0Å"\L§‹éó/¡ãØ=;×éãú(MGa\²Ñ#¨´uÄÓb„"ƈ~‚@W˜"“²S"hÅ$ì)&lèOŸ%¡dõäxíE H+–yRãT7+k¯¬¶­€ LƒuŒ;xßM¬_Ýx=^çǶJâ¾Ø±nÁR{êc f3xpÿáæ¸l'mÀº©»¢î¦ÍªÐ8Ì V5!šV“@dµä÷q-QZ-Ù{·2Њ‘âb–©@sÎÔ@?¨@ʼM¹z[ lGö—ÃJ M½™ÝÝ• Ÿ&à#ÁY’`ˆBð]>•ÝδhÐ2’j“ëØæeu 1†é0â0Š†ù@ÑÜ‹Ö 7c¨%GJ*‘Fa0Ãç+ŽÄVôT[z}‹^bÌZƒFC<1Ô…fÿXVÅ„6h¥ªWkòÕXl¨V*YÁS~¨§ŠLgçvâ“ù¾¨Ã"áz·ÞH&Ò (ß×Ía2"‚SvÉ ±ÍèõL¨fô3PYÝ)(GYÆÕ¬‚2”Èäf‹T#œ •|—zÈZïÄ01) ¾Í]¾ùÙužåj¦³Ý5G“ØöCá>°Û[øN“²Y¿-·þÅ®ð³Å¨ß>l6>Vn °Ÿ+ž Tpªéò9…2®õP¡¦õ•¤áïyê +Ðâ‚÷ÎdÄ|w"ìóTçyAù4€ó‹yIÏ<¡šx ²3pùž8G’b1ÏX¤álp†€fÀÚA% ˆ3AøÍÍ8<žöm‹Cëž-œÃ§lycêCÈ “ ÞÂÙœ1©SÙ§ ’Í 2C¡Šg"2CY¬Òœ}†ïé cÉÎóë/a{y¦‘8›‡fJ5 ÍHe¡YVp4ËWŒŽÎù ŒõÙ&cÖò^“¥5¾æÙÊ)”1¯!xð5‘h|mͤñ„…¯ä›g|ÏJ.§Æ—a‘¦°,ßÁ—c%X§²Ó +Ì º%Ò\|àâKEú,»ÐÿÿQ‡‚ÄòBrŸRÍhf ²šÙ\NîaG”δ“sD±äóÌEªîúÉMñSÉ!{?]K¾<”1ìŒø,1Ü'ñ̆9v <]-$AJÆ`º†“‰¹» >æèAÐåëíÈ´Dh~yHA ÍŽCÙŽvœDw±ÓDe, t¶Îmû¤á*ò¦«íŠyôœÐÒñ ¹·¸¡.}ÜF!‹Ë´C±7CtÍáãœædâ +“OVy} ÞÌ`S+³ðN©¦á©¬`Û1xcD ²o»Õˆç5›Ír©FX–®0"“!o½ïQÚ24öìØ>[èLߙ‡u/Ðé ЊEONµóàÄœÓ㵎r.›&¬Öé™ÆtÙ“ÇXè< 63ÚÆ #!uqŠ*7Eù‰‰Œí±åKöœB¨eR­4ñ¸·u¦–†mß +E@h;%PàB[ßÓËΔxZ×x´"jÖà…íÁ‰éË]#•ë¼2çi¦ëÁÿæ~°â1?ä¬]ÊG«€R,¿¯]g´G+ñ´)Y„öЈÜ“‘ëéWE–Aµ÷MÌâ wwe^¹ž|ÖèüÕà³nwl½9dzy ¼,6eçAüª±åÔÛ—ñâ!—gøXÈæÑÚÙ²¡Ô¡l-W6”*– ¥öeCh ˆÐˆÐ.ý‡¡l(ƒFɨEÐêˆ+¦³åëÎOQµMŠ;3òÌv/–5wù‡Óªæ¾Èkw gª˜§ÇÁ•žs”§SSFž6¡8CZ^*ÿ§T3&4PYúî³b÷Y¾bì~Î×hì>`,$•Â×5à7w?ï~¸bùO÷p–YŠ“Ìh¬'í¿™¥d–"†à–v&³ÌLmõ f–T°çg–òÐÉÔÒ0>Z2ÂÅùy—`a÷dŠ Ñ48‘Åf7z xéÃ`L\s½B4—16ËY$:gm€OH)4—”òv³s®Äh/Ãz5‡ßýå}iæø1¨~ì%k©¤X컪¤VßÒ³Û¯¶uOí3”ÏzÍ/o/¨ñžUÛ»™-ªß÷U×3Ä‚Ÿeõ›ªqà놞ï^½PR›pÏ‚HF¢ÚÝU;4f`ÝTž..oÈ/Ý9X€H/‹Í¦½Çf”ºvoëjÜ»ní³´ScÚW<©(K‹/4a¢Bë¶í¸²=í–WÐã϶©hþ}Ýß ÛîmÑìµz«Êº¯›kzéox[ªH¯MÖ`êOíiE¨',ßTä œ!Âöˆ Ô±.n´M_ÔÍ£iõXÀN {l?Mï["¿õ7>!ïT÷½Žê‘?xCâý+@d´²P{jn3|Ù7%ˆ‚m–NñF¼ØPÇ]]ÌhˆÌÀ«HcXð?§!I¤bá´·å= zœýøâœZ,›Ô^oJj7-c¿bÄ‘ß®è „c2,•Ž£,1YÈâ7Vdˆz s|´û0KARt½f^£ÄQË“g^»:ÁçÙE_„R°â‘MÛõs¼ºD™ÕI>Ãì¡w¤bØÉL…ÖÀTxaTI9´NõpÌRÞÃcÕÃ{ÒÇÖ‹ÌÄOâ°Q¹s%7ÅcƒÀçŠßQayîèÐ2Y®nFJš‰C%FÅéâÝ `±­b ’ÓôÔm)ŽÏBßðšmÑõ(`Ø !‚·†ÐÑS.êÀÖh<¬‰‚6aèjñæíé›—Ô´ó¬(Á„ö*@C94ÓCöâçÓ§ª4ŠÉL,ƒMíÔpYΰG¢Jçh[ˆ Zd„óS|r^<`½Ñ‘ÉÓìIœ×:@W;k<vÍ{”ÕjÍÛµ%²3‰s¦7vÞ’±¹zsO¿+ÖÖ ˜«v·-gò¾²~ÀN¼aéÏ…GŒ'áϼ)ï¼±eM/Æ6x[”ÕD¹‰Èí¦vúÏL«jrcÐ3rcã•ì‚“Ð¥ñAèòlŽÇqÇ>îr<¦ూœåIÚ f V4Ó ÝõÞÅÕ¸™3®–Ý×ä“ ûØ(ÎPC¬+>/ÅÌYšÂÆ^dzŽ4$âI.0žìŠ5‹MF¢¾nŠ~Ï&–ú¬;dž5P𤰠[ÖtÁ³ØÁ¬I®sÖ~lø(ξ`gA1‡ ùÙ °'./^ÿ0ŽÌ¹31Ô×?Üò((ÏzW¯* KklX˜Å ½0Îüšìÿ›€dþäáMƒÖ‰¶ SÒ·aéÕœ­³ç]J89mCz$s w¨¿ GwÃ*YÒ0&rö½§qR]šIœ€ Ó“ÌN|~jÚû†Ø* ¥"}J £áNöìa¥ã$B'õ¶…¶X¼Øï÷¦ô¤”‹g0 ô`¼´‘Ir -;†ÌáÕˆán³Þ=°~ã{±¹nwàÁ·ø/®ËØ鶴­GÃçoN_,ßœ%dqS¯o£äÂvóÀTj@ÛsÉÅÏͺ¢[8ÉnNŽ=fh-Ó±ÓNƒ­pÌ¢ýˆö3ž ¦vmmGGƒ÷õfCcME+5ù|è©€}ã «éªMe£ºÔåœLõí®&/‘Ži9#¾˜ic÷"¡Mê{H¡ ãSõÀsÀhPkd@ȧÁ´ª@Âã(ÑŽ¤d`ñÊê(L©›®/€ÄÏÐT$ u_¬6­âmœÚAž¡öÕöìæ˜rϯ&5Á§KÏ´š·ÎYå:sÒÿ¼ê×ÏQàËBæ«eÉa;“òô®¥MØÝj>Áfìµ×Û¦ Ñêºvͼ–ÉÎi˜œ„$¢Ð 5QŽÅƒP4­oùX{0Aæ _pŒŠ×çœL—%æŽl”çgÂŒ54‰"ÜAvݬ¢w{X!Sµ€ü%t‘ÖZ#ÁiÎ׋=#£àd;˜ÛýjcsÐP+/Øi-G{½+noÈXHúÑcªEKs(‘U½‡N{2 v„Îl™¸-ãÅvo“gèZñ´®o½uÇ6†~Þ輪ÿ¡þ©/ÂÁaîŒhÿé³f+O‘Ù¨ýI±Ø4ÃÅ’Hö$ïDHeëÂC›ºqbQÎ(„aà²'+¦ÝF§ã0h‚7E"ŠS‘AÑ—ôØ—÷º¡p0Œê<Ší.T{˜O8dì ×îæ">˜¥®¸éJ¯ŸƒâÒE‰µVrœ: Û‘qAÅ…Á<à8º7FÐÄâºj\ú¢¤«O>bÇ£ÐF¯èl@h•F‰N'éëÔöCŽ<ªýá‹­ýAç*y¤*¨b ieuUì7=SЇ-çÐQ‹“Ì›8BÔêèeð»ð²Ý÷T;›±Õë Ø¢;›s§rñËI*g-bzH28¸ùgG&ö¼&ÔžÍâH ¥ÔÏë[Ç2ÈH -[|Lž§"•ÊÐE¤Aª6^Få¹Ë¼#Q*ž» Ñ -÷6˜Áh«íx6@€’+¾‚wr9ñQè_´RN¨mŒ´«ŽC²žå΂üô‚ÿ;úV&iôí_TVÿ;_y7OL™æ‘ ½EY&Êp ›BžöKJôÎÔî@ºP8c1à7¦\¨ì±Š2™Æs(2Ò$Êtœ†Ðgw>µ…xJG`ÉÓè twƒQ•»ÌYŠ -+E˜™‰xñ Eh™< ×2‘‘^Ù¹4ÑÓ¤aÚâì %)–ÖâH‡Ž'Ko€JZëå“Êš±µåI¨±æîU"-=;íØ êö^k¸¦ù”ðFc‹6€«OçÝ¥Jrt!ac()‡j[(™Û8mF%ämJ9 ßóxè›ê«¢«LLUµËÀ{t‚uO±Þx{‚:ü{o3|®ÿ9͘±˜ ëÞ­’+=5˜ÑŠ -ìPÖݺÝïŠk+,1Ö˜¹­]{7‡&p SL^–Mkb*ÑÃàºÝn)Ñ€¾MÝpÚšg`6ÀÊ…Ï‚¿Þo)V)Elð\oª#|•-úêÞ–]•+»Âø¶x ÑÕ‰´¾ -šwuWÛ¤g ˆØvßßÚ!˜9²å0rÛaÄ*9bÅ©»1ŒÌ†šðJ¶í^Øz12µ½ß±ï+ÆÍåì£nØÂÈo8ðën GüªúžH¼?äCµN]ØGÄÒ9[:lQ2—»›Ç˜¯ §»­Öõ•[@IP=°tî„50=1Ú1zÄè0ˆ±¼6‹× k˜–Èz˜Ä)ˆúÓâ5‰£ðû³sjX‚ÚhÔ¦ŸjtÛ¨•¨ý|g•F·eH³¡¤”"`>ÎõYH¼õ†5´ -1B’ö¬×àTÍÄÔ‘Þ°ôøå“ R•û‰\[ÂÉÈOê¼|ÁË8VNjé¾ÜŠ‰> " -\J*¹›×==­Ã6kà22¹ÖOâ¬ÖF¬ èá9[S­)_çk-åY–N -¡^ØI‘Gw„¨\A °rWÒTL²ÂÍ“‹~Íw“Ö¾¶îB-Á˯3KÊ×}–ý³$ÌÔS³@@íæÚ¸ÂÝÿ¨·û-÷Ö[î.xÅ`>ÌD° cífõÀJj­ª«áöÞkžj«¼(ª)[ŸK‡ÅKù¹f¡…Œ“ž~Gn³mJkÇ Tøµ"g3ù$ÀqíçèþœõÀLoÓøËœ¯`G†AH÷óìBÄSvˆÄ±C8v@i148$°ŽP`¥ãRl"*µáĘp8©£§và…T–þŠzÿdJÙ`.vv;\Wã -D_xîÉ}þ{6÷¹ß=ùmÆ×yÍ~»ªv¡ú-¼îد›¾JQTª|H·›çL’ˆi1Cá8cœ™7# ß%‡¡‘!†6@#™q™À°ÎC§æY–)ð>f -~ÓÐw4’¿91#[âwsŠh|õÒØò±S™LéIòúÕ–Ff¾†0÷±˜„P¿OœýX, 4ä”änBÕ(x訣àþàëÅB¡x—|«Õü”H˜¸{}œi/¼ù²=t}µ¥¶«*š¨ \E®Vf&× 3ôI!®p²óŽýœP›9½É"!39úØãW` ¤ÿÊ3”»ÚÞ- …uÛëÄ–DÁúŠ& D᚟a­ÚÂ×ja&Äx³…›UÅÍϱs©ó> endobj -2026 0 obj << -/D [2024 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2027 0 obj << -/D [2024 0 R /XYZ 85.0394 749.1471 null] +2022 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F21 710 0 R /F55 1035 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 2028 0 obj << -/D [2024 0 R /XYZ 85.0394 677.0612 null] ->> endobj -2023 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F53 1017 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2031 0 obj << -/Length 3132 +/Length 2003 /Filter /FlateDecode >> stream -xÚÅ]sã¶ñÝ¿Bo•gÎ >I oÎÄÉ\§ç\Ͼig’{ $êÌž$*"uç×w € EÉ—¤ÓŽgLp±X,ö{Añƒ?>Óy–[ag…U™f\Ï–Û+6ûs?\qsnR¬o¯¾ù^3›Ù\ä³ÇuBËdÌ>{\ý4ÿ6ã,»l~ÿðþíw·×…š?Þ]ß¡d>¿}ûöîþ»×ÿ‚wÍ0›¿¹½ûw‚½½¶b~ûÃÝÃõ‡Ç¿]Ý=F¶RÖ9“ÈÓ/W?}`³œàoW,“ÖèÙxa·V̶WJËL+)dsõpõH0™uK'E§2²rJÚf¹„)”ÅãSgbjÞî«e]nðEÏ?—›c…‡ûæ{ÅE‘‰V2·öSõ¼hÊÊ{)›](XïVõ²ìª–¶êžÊŽöñ®¹™¯h®Þí~²}jŽ^x.mµ…«óº%ÄfßÕÍŽ¶å3é¹~fLTŽÏÙ Eƹ-`Ä3«µp,n›®Þo*RpWo«6óçⳈ¸†ÝH8¦•Æ-{}ÿöý#­ùþÇwonÑ0ãº^° ¶eF[·l×÷+È”äT&„.¼äœhªr…'…Q ×nªÙ ’(t¦-÷Öõ¦Ú•ÛjZIÖª Íæ@„ۮܭz„]AêÜà®\>tÙl·€éQ<ƒp®ý¦®<Ô)ðk¹ì6¨nXtSï*¯’Ì…ó òÒf ; -w×BÏ8ˆƒúÝ[z#vÝŸ¯ñ$ºÚÖ»ºíeWöëöÇþiQ¹Ž 3„7ÝSuh‰@BMÌ«ghì•æÙÂ×f~\¢ñµî lhSŽÎç{¢Gÿ9Ömíˆp6_>UËO-a¡°ðÙ=…Éf×U».L¯GÓ¿ á --î©j+šN)¶U)­jbÓÓ(;Bg#´Ó¡_>u*`DäÒ›fÛÝ`‰JÍ•‡.²Ÿ–Pfš½{ô`À ÄêÆ¿‚’ZZßxXí—–‹d@sÑäÝŒ¼ $ø BÓ3ãûöØz2 ±­:¿×š&âàÀdˆ°,BX­ÇA§•#n=ßðìz¶Çå²r1KI;ï–z”/õfC£Å€Ú¿«eç<ÈzÖl8,* &§ giL¨t]Ö›,NXH5 `âîsu·•EÞÛ~Q O“@¾%â´3UxþV]sÄ¡9Ë‚‰m=  S\{J.¾ Îo4Ýø MéžCôìÜXŸ‘ͦù2yîè¨îÊÅÆ,îò•cÂZBv1>;i'è j›õš¼áFI.Jˆ¥>„ N|Qû ÷ªÈ5p àNXî¶nÛz÷LÀ˜Ô{àl!Œ@0¼%ÈbSî>Ñ0ä㣵¡7;ÓódN³"“*Ï}f6§j¡2¥l¨|@÷H/KHöíˆÛr¹Šr™DQ®‚ÀpXîhAå_&V4 “Fœå4¹;‚.ž æ;GØêÖv*¹Ë=. Î‡#bÈÒ1Çs®Ïãx&È¢¢'z(¥BV~òs§iwIE3Ìõu«£OèíKzG1äÖíš~ÊC¼Ÿã¸£;Äà¸" IŽÆ>/¸º«­?îb)y6L@iüÜ…f)Öù0±B&¤íq"ù 4¼¹3—YH, 8ŒP µQj®áŽYúj -¹î-_úÒ‘›´7×`«ÁLÈ5€â;-$‡òD„ž#ÄØ (Y‘„ íSPîRÐm›Á›žv­BuÔccŒÆI;44—[ U})²€Î¹ˆÝÔå»C+cÙé 6(;`fßÑ˪‚jeë»9Z+;¨ºÀ[â4ôŒ±Æ‹²¥ÌÒ5_Jʇ'OÇ¥T?MIñŒéQN÷×|ç\‡ËŒ©^pë‚ë,¸6eHªnxÖyDa/s±&Ø8qfÅç>®´<[¹8þ2º­{íË”IsåRfÖê`¯tÄSkÁ¼W˜|PO~}•®n'™€V\ë`Œ¯ï'8úžxFùÂ@‚—:¿¬üë¼ò#–»è6¡YÅ ²öDñ r5ã—H ÏÊ ‘Ѐƒ^í¡ÅÄA/h„Ö[vnÏ»ÍÆÔbľ5½vMð~=äæäëIuò©góŒêÓûîLÈÓ ?1 7@r¹©ÊÙ#ù’ËBŸ>®êAçM@B1*Å vŠuÁ–ÿ†uzm³<ÐÕ÷0ØŒ[ö+k‚—¡w(¨ùˆ™a5,äPŠmÃ’jÒëão¢Œ¿ç‚çãÃën°2¡8Ý߆õ÷vCk ÈÆKVÀK/˜ñi   ÁB¾/ëäÖëF1 –ÏFUÖãäÍ!ñå…é˜Ú ÈY#‡÷†¾ú‚Föi4^ŸyåF-n`©^¹=é £Ïu9ñ=}Y«ØIßL²‹×œñ‚§9L¹˜<†Ê›O5Fœ‹¬-½:éûäSé_âÓ‘šC2k;¹‚˜[9iPãï6¯|ƒ©Yf¬(&>¢¦ -í ¿}œ×¾/),Aý Öý¬SÏ>Úª;Õ?Ý:¹šïCÏð‰Y`^gyq™Ùˆ5Áíø]3ävhÐô…)ýEäS_¦#4¹ÛXüò,é;Ñó F¿9é7-^…ˆÄ1>Tâœ×~5u墠qä*çCùº¢½ÜM±†™ PþŽØ£“f˜º‹ ª*+”ÊÿPSÑlkhACC½€{¢ÛÕ;èFwñ—É+Ð?n/\ºâo‘ŠüHλC@: ‡Ò ÈÖ9H§¬}A‚ôœÒnÅúo’½_(üçË-u‹Ú».EWÀ9ç -8xÁú¾øï¹ÿߺ‚É ä„"Öÿ^DûÄÉ30YýÿwŒp¿¡3üÅà„µ±XFþé&ö?ÀTømölr/ EÄÞž)<;ù©OûŸ0žòþ -¦ˆæendstream +xÚÝYßoÛ8~÷_a`Î"–¿E>¦Mº—E›æbgw¶Š-ÛBmÉkII»ýER–dÚ)p¸—C€h$ g†Ã3e2ÆðGÆB"©©Çš#‰Ï·#<^Á»_GÄéD^)êj½Þ¼gñX#-©Ï–[ +a¥Èx¶ø<Ú™5ã9ÄcPB±¼˜'ÛtÍ×éüÛßEžº¬3@qš™8þþ‚¨IZÕû¼´Þ’Ü^ÓïYe¥²JªÚ½-–öJì%s·é¾±SìÚKjíÚ»EZ¥ó*]xNÀÎdµN÷/Y™¢vvìD>܈I˜‚›åôæƾú0ý˜c()_°À +þ‘K;´“©y‘/;¯{LwìN#J»¤=¼çÒ€™¸mÊ…OqÈ GZæÞÞÞ][{ÚÍj±Íò¬¬öIUìí£‡téršÏ]Z?&ylî‰TˆJ)ùp^™H¢}bE£{õ8û÷§‡sµø¼Í«tŸ§!Óe•nÝÚ¿+ò²ØWY½=ø…5ä’:;œ"ðûÍ~ŒÝr˜F… ÄcˆÍ¨ÜÁ‹iÄ5g‡%¶|¡4¶R?ÊE±M²ü°øÝéþ2H`îG^ìʬVFP¬ -œ)$)‘¡j@ n*Ìz‡KŠ Œº&šJÁI Z¶ZyKÈàçˆõ’l¥¹šèâ‚Ä þÙ*Zf—èž[i–q§ÛÚ]ì²))„S]¤Oõ*Ú¤ÏéæçÍ.[iÕJÛ€+-äÄ_n’UÀå#E†>ò€½ˆ)€%“°ZÀ˜_滺 YÖH©X-ï^MʶFÈCšà£l”­4 Xî§ð—mò=*‹ù·P¼Ð[âX¨¡ýêõEÌöP»‹ýQ8Gé­_5Z—~Ç —‹Ê£œ>mªìES°`5ÝY¶ð9ú½Õüp ØõHO ÞŸºÍÑÁ¨jØ{\á¸_5¯o¦ïnïg·Ÿî~²C +°rì÷$Ô™jæ$±—kW»ŒÜÄF²u×ʦ]ßMM³\a‹94 ˆÅx²KzÍ+ÓÅÍ:¯l2’¶—…é>ÙS]e…óº´Þy»¾CVzo:”¶…ëùvµÜlz‹•åËb¿M¬Ñ¦÷»kˆ`—¾.»GÐl˶۲ËVä—>aš1ò„˜uŠmüc6~4ð\|³}BM^²j]Ô•}“4Á¯êmšWåe`‰ˆ3ñùUfc¢—l³±ömnçÚÍWC\&õÆÅuø ÆtUïÛ©‰y„+‰1⬭oÒjþ¦‰ +™z"~À/%S]V-š4î—½n´&Ã?Ý˳*K6®&U2\‚ À&ukºôÔå¯:Ýgi‰~¢Ç~jöÐ1w ’ª4¡â|íjy¾}ÜE[-ã7âC—Þj¢Î»ôJ—½: b ¶çò±tø¾½æ~7l\¢¡gæ}†ÝîuQ:>³…b–åîqæöÈ<Ù%O›´ÏÖÁ…D¡‚ P«ØWp›…!™4¹íf¥PÔˆ‰ØÓÙHž4ã÷EÒ=lë +xl;õïóM]fÏö8D[R«WPÐÑ:ƒ¯u<ˆ‚s.(8rDA×eòþÿƒs„)D}]­Ó(hµšÀ=cÝÀÍažˆ0aî†GE2ŽõùøZ­@€½|±I¡i?Bšc¦C1˜Tê§bQ*áYQb¸†Žh~܈Ì[׈9ˡΛö`´6ÑîšÚekD"€ªS+˜pº×Ä^vEYfOA&AFc¦ü½” "qË㋃‡ Ô]- +X€Í˜‡6—¡U +áX’ã¥?ƒc…(ç¾r•@ç6Ž‰<¥ýÏYÉSYlêÊ=Ý%ÕÚÀîtuÁ1J¿R]:Zgª‹×jªË"T]RZ°ð¹¹_]Ì—8¸Ÿ¯Õ +د.P±áI/Àió¹D»…4Â"I·Eþ¯ÒÝ™è¬hCŒ¾lÏ \ ¦É©ÏôôYö2ñäÚ Y5¨o"Ú's³éŒÃö8`êNòZ²×™:ôc_/ŸÒÈb"†ÇúÏEí)§¹ƒýTøž”ƒ&íSeˆ±M•%ÑsG¯KGŠC„|0úJs;蜟Ói ·<¢7 Š-tõ3μʑ³Á6TšSÇÙC=<Úùhs0x¹ti]Ùe­ýÂœj3”š³&1_ðÜ×»ÂÒk ™ýšc/:õÝß|Md,4=ÜžEþëß¿ypsPT4œ*ÙÒ » L®åÇ0p¿Çþ\¹$-endstream endobj -2030 0 obj << +2027 0 obj << /Type /Page -/Contents 2031 0 R -/Resources 2029 0 R +/Contents 2028 0 R +/Resources 2026 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 1998 0 R ->> endobj -2032 0 obj << -/D [2030 0 R /XYZ 56.6929 794.5015 null] ->> endobj -2033 0 obj << -/D [2030 0 R /XYZ 56.6929 699.775 null] +/Parent 2012 0 R >> endobj 2029 0 obj << -/Font << /F37 791 0 R /F23 726 0 R /F41 925 0 R /F21 702 0 R /F53 1017 0 R >> -/ProcSet [ /PDF /Text ] +/D [2027 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2030 0 obj << +/D [2027 0 R /XYZ 56.6929 752.1483 null] +>> endobj +2031 0 obj << +/D [2027 0 R /XYZ 56.6929 689.4255 null] +>> endobj +2032 0 obj << +/D [2027 0 R /XYZ 56.6929 626.7027 null] +>> endobj +682 0 obj << +/D [2027 0 R /XYZ 56.6929 587.9664 null] +>> endobj +2033 0 obj << +/D [2027 0 R /XYZ 56.6929 555.0457 null] +>> endobj +2034 0 obj << +/D [2027 0 R /XYZ 56.6929 519.5738 null] +>> endobj +2035 0 obj << +/D [2027 0 R /XYZ 56.6929 453.9292 null] >> endobj 2036 0 obj << -/Length 2472 +/D [2027 0 R /XYZ 56.6929 370.2609 null] +>> endobj +2037 0 obj << +/D [2027 0 R /XYZ 56.6929 265.1402 null] +>> endobj +2026 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F41 935 0 R /F53 1027 0 R /F55 1035 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2040 0 obj << +/Length 2882 /Filter /FlateDecode >> stream -xÚ­YQoã8~ï¯p—­dI¶ür@v¦3˜½™¢×f=ÌöÁMÔÆÇÎÄNÓÞ¯?J”Ûq’ÝÛCZ¦h’"©”ÂFþØHIBy*FI*ˆ¤LŽë+:z†¹OWÌñL=Ó´Íõóüê§<¥$£x4jÉR„*ÅFóå·ñìööúæÃçß&ÓHÒñÏd2•”Ž¿În~}AÚí$ƳO×÷𠣆/¦ã›û_o?Ì&‰ϯ'ó_®®çÁ¬¶éŒrcÓ«ot´„ürE O•íá…–¦Ñh}%$'Rpî)ÅÕýÕ¿‚ÀÖ¬ýtÈB*"#¦R’XñtØa”P ˜&\Å’88,bCó\Æa›­Þêèš·×í¶Ö ¾,«u–—Ó2[k$|[Y]?àKó¶qäeÖd„¾»¢4&‚K6jÛtdyà0·Lç”Áâžíó•6jú(Û¼x›¥ (0<ÆXëa²”Bʾáà8@ªûƬu(Ñ™Õ"Ѷ^†ÛÈ ØÂ,Q7òŸŸ†Ð²^]Øê1‰÷[}xs²”°øb鳂¼­¦XEœ¹ÊV½äK½|gH²¥C3iÁáf?gÇÎx4ÞçEÓ¶uõ¢—Ä@¡°@`§ò²ÑÛÒb,¼¬²™.!ºˆn ‡ô®‰ }ɇœ+aH…º€]< ÖK/+×ջͦÈÑhFO WJIDi(ÒM1ä~JDÔu¿1ü¹DÏ¡÷ͺJ¿&ÇâÂa¦Š¢Úû%C‘ÄÔÐ €Öc^äÍÛ„‚ŸÆh§¤H.ÀÊé ª8¦>¨dËå D1^ùûÉ8ò¬íéØø~7'Ru¬Ÿ-MÒò› x”zor ßÍt7ß‘¶Ï›Žl©0ƒz£ùï”Fƒ 1hÈ?Ÿ1,!)½ê»Á¢ ›š™cBiÎgz| I¸Lø$é´›'³Mʘ¨(:Ÿm-¦ÓÙæ™°{®ö}Œš™s*ӱΎ˜ <†S[[釼ÞÙ›Ù‘Iìú,v[L‡²AÂZ×uö¬ÍVVv&´y‰ -³™ÅÏ A'Îö#‹0Àmæ¨íôBB^.ôA*"ƒ8½2¹á‘M—ËÓ±c¦è^@ŠÓ™Ø9&ìÆ1麱ƒ½Ë”8«20ëìÆöu -³m¥÷ ÔA)úÛ`f'p@p (ðÙ=MP^²"𛣊¥›Ú…6è‡Ç"+¿ã°€ÓÍI'‹22J.ì6×i7.ÜÛõ’©ïi”XÅÉy½k@qÇ×QDâXu·öIÛÝ΀ÅÓ¾€¦IBµ¿à‹×_x.‹aúq÷|ì -{›ñój×€ÞnÚ)¢( uGñ|]æn[ú*î»n0ç2Æ5‹œ“$†ön -ý2Pn>ýYã|ø¨¹ †•¦•kµ^狪ðâ§"ì Ö u¯±èð´â Þ¸ÇÆ8M.t7Ʋëßf_o¿\ßTjê0áî/i, -Âñz½)ìzTë',’[¢ƒô^8™ˆLÿç `Y»FãX5X:½jW,Q…í>AÁ®ÖŽb7.Pò²ÖÛiè„#0 õø@· ¬‡k$«ÁÃ/S œ#Ùí_;ÈÂòC›a. î¨x|S59¢¸¹OÊ?r¤¼Üì\¡±g\ á•¡\|q•§Æ·ÌÉÙfÐ#úbäA -& HᨮúÊ3ä~Æ%î6vi´[Sl9sù–°í¤Y3 m­oüÞ IÌøÒî%}5Ôut®¬¡˜i×:M싧†.¹åv—ç‚u“Ú£$N•]Ñß&ÐIÒNÊõýdñ›±O3®ŠåªªÒ ·™˜u…±SÂl'mÐûaI*”z¡öÁ’‚„vÆb_„·oÛ³Ò^ˆq#Ú<ŽŸÓ½kfWk&·}Ôo/s”± KÇS¶4EÇ 6LEƒÎ0ýù6LÜŽvù×òU§Òc紇ɥ÷ÅÛÔNµsó`¤¡­|j;hfþ`ãŽoó¹û)âw*© æ+l×e TöMMÅoÙ_ñ@æÞòÅw³_:nü³i9$£Ÿ—ïof_¯]ÚUk}º¿š¥ós t€Âeîîô é¦ßÅ;ä0ðç‘ÃLW®Ç_éÅwÿE ’º™½ýRº -H8T¶ Hë<`ﱬ&wÔwŽƒ35è}“´\˜‹&`I;6ÂÎFs4‰„ªàª>àªñŒÚŠ•N¬r¿sXâÂ:*íi•ûÔÞŒ;e„É0f¸*{Ð]ÊZ ê°e¾'W¦ç®wιHpqÑ~¥»—¿!ÄÚ3š -*Y‰¶›qUÂÑŠç /›.E7ÁÐp=Oí½²)¨‘ÚNÀ·…½€T¶Z³4ß}|Ï(HD« 9CúÓð· K«õ'Ò²Ú}†·žP–m¨-­KV‘½c1³ù“³§-´îIÅWë6‚cƒWv§¡†Ö ä ,þQÛ0pæÒË$÷Ũnîï¯ßûÛ?œßD’K$ÚÍÇÝ’¬Auwz•½¸;Ä»»ûÏŸÞéÿ¼þ·`[; Þ…½H îžúÑ—Kb~©8ÐÐ$ÿå„?|‹„p¥¢S·W‚pž2o”q4‹’¾é’+"FŽmÿ/Ö°Ö·endstream +xÚÅZmÛ6þ¾¿ÂÀ}8-P+|§„;°I¶ÁÍ^®Ùâ +´ý •µ»jdɵ¤lr¿þf8¤,Ù²Ý"-š+Š‡óòÌ2_0øωŽ™LÕ¦*ÖŒëE¾¾`‹G{sÁ=Í2-ÇT/ï.^|-í"S#ÌâîaÄ+‰Y’ðÅÝêÇèêÝ»ëÛ×7?\.…fÑËør©‹Þ^Ý~õ-õ½»LEtõæú=¼*% ¥HfXt{õöúõåÏwß\\ß âŒEæL¢,¿^üø3[¬@òo.X,ÓD/žá…ÅÔ“­>fuG  +Í=×}Õ•›Ê½z÷}ë«žOP7µ›"/Á}D±òà3±z)3ƒtu¶.æPl)S%÷°æ¹tùP»Ã ૱ÀI»b».ëÂw?ùFݯï]úW´¤Eù©gãñ¥¨;ê Ä|g7§ÙqJô,wàíÍõ”žiéWëëÌå ¤¡šÔ0Ùàxcvm· xâ.¾òe‰/u ûU~F°;±‰Œce(cîÒ»]G–Æ ró™pQÇ@åÂqs67Ͷ;ŒF'JŸ–+ÍÈ5­? m +³'Ø·eÛõ®t_ûb[?äÛÏ‚€µb‹;ªóiðÆ[Ù–3î8°¦Þ±*2PÏíH$ׂ³À1›jkc©RqÚ¦cªã6¨œMÀ3±M@'— D3KNJ[ÃÍtÉÿ^ZmËÎ+%”‰Øöe¢Sc—u`Ö2oOÔî\i@±+Ý›~Îp2"ÇpO|¡øTv +çàW)ÔÁZGØ4ý-é^&îÐy$árÀî1'Ž‹4/ß 3öj‡ ÝRõº4cµø„þ z4¤"¦Rã6~;R6 H¤d±–"¤ø_. ‡r~iDt} `*…N +Š§”k·øâ×…[!•D5j»Ýî´à:^ܬÅâu{ZŒ·8/ǬݾŒ›ŽjiÂ@‚õ@g' +$5›®$ÛZ\&Zge]}öã~¬ì.ÚŽÞ¨NµÑË›Û×4'¥ŽUq)YôñR訨È~ä´À >Ó$h õþº¹äÚÏ[ÍåPΪOYýèŠ5xq'^xfôxè»~[P{[TE¥6p=pW…éW‚£ŒâË|L&ПÌ-ww_KdçSe"8€‡äf'!l röþ|•¸Î>-Û&ÿpX*jµ3‹ñ‡Ù)PÍÈ7É#†Ãy:𪪚ç™ ÔbwÒc%”‰*Qa'áXÕ‡³W¿™âã$¯iK92§ZدõE,ŒnA€ªèڣ𨘕J’?¹Lce…ú¾;L9ÂØ8µFHð&<0rŸ™fNkV„óÒ•ƒÆïÜß[–7C[DoŽB¦„Úsk=d29¥&Çí#)OAæ˜õ È”Jø4ÓdšÐnŸš¾ZQÛá<ûº.ò¢m3<šÚAï"ŸÃ1x¡òó2¬ð¶Î~A +@­²sÓ<#ÓÑÔáÙR1…W ÃÀ,bâáEbIbK)±±7'©±9‚ìšq8ò”¹²0Z?ôõÜyæ¢ÉÜ°wT½Qmªêýøú8Ë-÷i9™\)/âžµ‚£WU®K,jPnÀ]).]¯ +ÒXõÙÝáhûjÛ5\½»‰©÷æ’G5Q%~má ãWl‹Î/…IpF±ÏO¨'ÅŒ+âAu*väMúxìáèý^~@õµÔ&M`Ž–o<5q¢þCÊ·Ô¨éï‰0ãXñÆ™Œ¥ågO·<FZ$rñÆ¥†b>åBñ6f}¢xã†ÅÊ$ɤxxS3*Þ¬/Þ,™ï)=8Ë/}‡i6z.»'j¡CÍ|*é Âe?ƒå\x¸C ¡¾B8çP óüi 9¸´L;ö¨è†z³uÁE/ôP„Ò÷BèÉÂHC7Ù"Z5E[ÿ½£î¢†|–û[ñ¶ÈûQ ê.ÊkQÞ´~Xí?°¤cA ûiþÓ‚/ýf” Êl¸†¢½þÄ4ð‡Ï( ÀE+²Ÿ³¦ÕØ0jkºÀ|[Q ã† Ý èzðÅ[Z¤" ,«â±ð“ݱÑbjͳ íŠÂÊ#ÐÝD`˜D¿deu<#ŽcõËÂÿ¯MˆÖÆ ¨3÷h +'®ðœsì6|´ÞñËð¡fïÂÇR½/º¾tA/Žd@[0Þž„û7ÝxºŸý€%$¸MUt”ùà}³õ~æ—ÄJÝ¥¡ÖVÜù  l –_ÃS TíÄNºk,2;OKõ2ήÂ?.R“ƒU”JÓi¤N$ò×ë‡÷Á ¿øë›#°!ã|ñ|v?b‚<öØ_†·5 ¼P¸°ñ¾èZ&±N„‘ýÿ$Áendstream endobj -2035 0 obj << +2039 0 obj << /Type /Page -/Contents 2036 0 R -/Resources 2034 0 R +/Contents 2040 0 R +/Resources 2038 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R +/Parent 2012 0 R >> endobj -2037 0 obj << -/D [2035 0 R /XYZ 85.0394 794.5015 null] +2041 0 obj << +/D [2039 0 R /XYZ 85.0394 794.5015 null] >> endobj 2038 0 obj << -/D [2035 0 R /XYZ 85.0394 372.4169 null] ->> endobj -2034 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F23 726 0 R /F53 1017 0 R /F41 925 0 R >> +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F55 1035 0 R /F53 1027 0 R /F62 1060 0 R /F63 1063 0 R >> +/XObject << /Im2 1049 0 R /Im3 1172 0 R >> /ProcSet [ /PDF /Text ] >> endobj +2044 0 obj << +/Length 2113 +/Filter /FlateDecode +>> +stream +xÚµÛrÛ¸õÝ_Á·R3Œbúä4Ž«GI¥íÌî>Ð"dsV"µ"i;¿ç LJ”ÜmÚñŒœû 4‹(ü±(QDn"m$I(K¢åæ‚F°wsÁδCšö±Þ/..? +bWÑbÕ£•š¦,Zä?Çï‰! @ãùÕ§ë“)—R¨øêË—ëù‡Ù¿á=¡€(”ÆŸ®æß®n=ìËÄðøêæúëä×ÅO׋½8}‘(Ëï?ÿJ£$ÿé‚aÒ$z†J˜1<Ú\ÈDD +ÑAÖ_/þ±'ØÛuGÇL yJ”PV)á hülEê ‘Ž³¥Ñ”1EDš°ÓÄüA +ÄÂrdHlš2’“DSÅ Iæ{q‡ˆIŽNJ5á:å‘‚Pæhb‡hH¢$Cœ@9ó¡l¹a[TÒ8ˆ–•¹_Ô¶éNUS¯0µLÔP㥭AM¬;[WíniñMÇëbS4õBI™‰¿•+´Cǯ-³Æ®¿CÐø€tv)jxc³2Pm³¦[Ù q9AStž¶#fÁ줜”jÛUéiV%ˆà´ã¢ŽQÝiç å3Fiå ÷º“›øùÑ–#Q P2#ߎZ‘ò.¶‹@Ò3h19xW¥‡°ßä„–z ak0åÃû)ßÃG ˆ1ÓíÎ +¯¹a$¥œÝêHP6$Mu\%zÌ ‘áû©¨ÚÚ#ð мÈý²j<²©ÂÈxö¯ÇI@¼pèÞú÷m²¢ta‹V(Öq4СÅmq6c Ë@gÁä°ŠJeOMõ ø6Õ^è‘Ó×ÖöcMkŠÂ¥fAHÑ n*<±}3b#ÃË¥ÕÓ¡e”iTÔ'vIJCaÙOm°¼³P›?v¸Š‰‹'»«]òâKÙnî}´Q_¸pa_ŠæÈê pÒ”‰óöéc¶ÏËÙçŸGöÑD+Ø=˲Ca9°^®†,ÿKûÜ·Å:,}!¬ßý) Š”&Þˆ°>Ö vX΂/>;“¤_¸Aßæ'ŸËlùh§+¨‡Ò1m24>+ÞkD>1hºPd…QCo«,(Ϛ̯V» ƒz½ ¢Ä´ÒRŠ~ÀO;¥:-‹KßÀ«îtðÙê`/·«¬]‡8x*ì3NèGîëÑ„Â]A0ý?”µ†9Íü‰Šœ’!Ä10ôC²„†Å¸/ÿ’žæÝ`xåÆã;÷;wól¿æñÍ©±YÂjŒÔal¦Ä0¸"9¤þúÄØ,ÎŒÍ}ÊgÆf s eÆ! 7‰Dï‡\oÜ]7þÍwWX¸Ž O‰s¼Â¥ rØÚSÁ±Ç¯Va§„†j=-å›/@ßÏæüÊøGî[þ¼]W[¨6n†8h»¾”è4ÞdˆþÝ¿ \øÜÙëþžJÀÄyŸ8‡?tÀ¢ôÏÌ?VmÓîöDÖ6«­Ÿ/O5í~@ýPˆþZö 깑¼_+{QßK˜a¾L½¿ÎnæW·_Gj x/ÅPÂâ -Èa6wuªm`‚òô]†¡„Õ_0˜ëÊ '6ܬ«Ö5  +÷á$†•_¹:ÏeU6žÁÚŸñÅ vp +®íºÒ_ƒ¬ý>  kžv#ó®Ì—#qh~PÒ«hÇa×Íò“ÝKpFÔÉùîÕÇ:ݽöXÁ!ÿöå­Ñ„ÆγíFØšå„j¸ûø~¬œá—¡„¶ä`Ÿ]Ã:jÞ'-㓦‚"ôAéç´™N0Òl¾ÀþF,®ï>us¸ÆšTËs2ìqŽ„-b­ ûR<¶¡[æÕsyÞ0à M'ÁÉš)¸åØö ]ïûogèÚ–yQ>tƒÕ÷° lÂ8öšnȽ—­‹€Ô–¹ý…R^ZÞ‡u_ +"5øEüÛçùÇÙÍ·»+4÷böyþv­Xt÷ë™?š‘1RBB³RÝg +((êCëK ^ÙDŒµ»ÌI߇ÖT•_,«Ívm_ün€¹­—»â¾;SvP¸®ýí‰ øb¯GLO¬±}*ÛWA.OÖA°=ƒhyãFýŠtÚD’³ÐS¶»Üµ¥·R°Õ¶È¥à ƒ+ôY1öHGr )M`W‰ ㆠ+©ßö¦E~ÞN];„£µšîãô‡ÿ)ðúO© Xü„¦šƒu +e\»˜Â=ªÖ±ìÂkè±endstream +endobj +2043 0 obj << +/Type /Page +/Contents 2044 0 R +/Resources 2042 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2012 0 R +>> endobj +2045 0 obj << +/D [2043 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2046 0 obj << +/D [2043 0 R /XYZ 56.6929 374.0222 null] +>> endobj +2047 0 obj << +/D [2043 0 R /XYZ 56.6929 216.7302 null] +>> endobj +2048 0 obj << +/D [2043 0 R /XYZ 56.6929 132.6902 null] +>> endobj 2042 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F62 1060 0 R /F63 1063 0 R /F41 935 0 R /F21 710 0 R /F55 1035 0 R /F53 1027 0 R /F39 895 0 R /F48 950 0 R >> +/XObject << /Im2 1049 0 R /Im3 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2051 0 obj << +/Length 3048 +/Filter /FlateDecode +>> +stream +xÚ­ZÝsÛ6÷_¡·“§K|ûæÆnê¦q|‘3½»4”H[œH¤*Röùzýßo»à—áÄ7wãsñµX,v»$f!ü‰™‰‚P¥z–¤:ˆBÍÖ»“pvm¯O÷Y¸N‹a¯nN¾ûQ%³4HcÏnn¼L#f7ùÇùÙõõÅÕùåßN2 +ç?§‹( çoÏ®>œýBuק©œŸ½¾XBQjC'b¿8œ_-?\ŸŸ&z~sqúéæç“‹›N¬¡è"T(Óï'?…³VðóI¨ÔD³(„HS9ÛèH‘VÊÕlO–'íZíPŸ*"e‚ÈÈÄ£ )fBiÉ‘2¢4ˆ•TVË‹ ZóÙ/Ëw¸Ð`:Ð`8ƒVXL(m÷÷?¾:]ˆ4œÃòuF}w±Ž ÃÞßz¢ˆJp‡!;ýÿe½€ÝB†r^e»"_¬7Åúóº®n £ÐÀ?ñ´ù_uUL›U¾žÖm§ÂÌ‹&÷2 Ü4µ<]ÔB¨0Huåöþáòêœ6+å=ËweU6í!këU½/n š½ZTõ6«ŽÙÖ£›@Æ0 é#à.#£Yt* +tÂfsöáæ§wï=<'örYµÅ¡*Z’dùØ´Å®¡Â«ºjêC[wý¼:P:–ÌwKF-XÂÖ†à¨UsÜçY[à(ì¦t`D”ØnW ßg„2Q†„ê8X9~“2!êüö§\sájIÄ°ï±-·eûèST8VÐò±ª÷MÙL!"?Wà¬:MIísi’ËHí…¾0#€²Å…uw-<Ð×õ¯<M~\äŸuÞQwDü›>‹z\äµG#;‚)d xGvôq³ËÖßú\ :‹ï›b}°ÃF +%Ày;wt3|öÌ ÓÀ˜$åžÀù¶Ü–ZFwpÐ-©õ°\¨$ +¢Ð’}Œ‚C[îŠúؾœ÷Ñà ÁÄ`¹Ôõ˜ïŸç +Xœ$‘™r=¼„+¨õPͳ\Ó)×÷_åzȪ¼Þ厩âŒ}ÂôÞQ¸'¸ãŸ¼8¢´!¨¹ÉùÅòÕûËë›ËwWݨgÁdèùSd‡€«µfÙJ„îÚ9QmMßæ¸Ú•-ѽ» çî@|pî4éïÇ¢i™cÆßA(+Ǿ¬è H +çÌ胪a!ŠÃ=€4¤SÈ4™ßl(À§y#Ü϶Ûú'Ž‹ÔÔGKXˆïj×µý涫¦ù¡qŲ<·òi£t¡q»úÞ5ÜÚšzÇ#èƒqú?”ííØVïl\Ù>R©È˶¬î¨Ðnx€ªæ¨¯m V¸x—ÙÀðmñt»@ë¬b¢®Ú¬¬žtãc_X8.Hö˦òŽÇ¥vãø“ðÝ€‘Ö»Z§õ [äš:Líšþ,@%-Û–¨Ì͆…c•ƒ-X2w‰\mÆ–*îËÌã"Â@2'ºþ%‰©Cç¾5Ï™Ñçü§W×D±q ›½Í‰®j–~Å‚ã†ܸz¤/hŽõ°—#@÷¼r.bÕ‡ ·‘vÞS0U®y³ÑäˆÊ‡á™–ÉÃaVgàòÜ;k³±¬¸e[7­w³nÐjU”z¶»¯8Vò®Õï*XVr‡Îù°Íª¾ãÇ·v©O·X…äšX¿h‹c™:Øßd÷, j¿+.£Ëð\ÑpÞ„àRÄjìšèÆèºa fçbZö‹–Z€éT-U[•ãwÃMÈà/,HA Z¶0w9{uöö‚HÛÏÚt¨oGbH'Æ|È0—ïÎ^ìÔh'žtIåq‘ûntAábm iA;¡²Ï.ö>VAœ&æE[¯”éY‹ŸÈ»ä9òbu¼ãéê÷3Ò)++÷7÷ p®ƒÅÚb:±¹­»Œe–`ð+ +lÇ ›/\â$€=ƒæM‡·ìëÙ†wY^LÜ›ö±c²ß–x׊’"Ô "Ùp$Gáh…ÿ›Mq—ˆ.Î}›¬­»ŒÎm2­è™M–ã¼È¿´t¬Y p†êÂ\‰“9|µû}G19šìã¢o +ÒÜðËfÌ[;86b~ã¹$qZ4¤ÅS8CRÙdk6œp¢¼«²öÈ(Ku6¦#a1 +¾”»!eÑ ¾Ùv `M–2 Ñ¥r¶€©œeA1 =Q +7´éyOÜ,/_ûrO$Hô#¨®}Üs+¸ÏúP® +n°î—(›Q¥8jÃ`~¼ñJàùI¼¬5²V‘bÖÖ[¸V¦Jø–e§‡¤ìõr¹°K·%LnU,G³@µ%¶ P1à ¤ûˆ!„½EÒºL‚ÛÁÇ=:gÁì‹j}xthål{W âï¨x[sH$ÅbE@5ÿéíÙ«Ew>°¢vóíyd¥0ó‡M¹Æl ö‡›ÑIŠ6[†¯½*C$Ú..¿£+#¨¬a9";1™ß â?aÎk0v ß’Ù`z} +î‹Ko¨ò¡Ün©gU¹ÏBmaRÐZsìf4õüH-M±-l’h8‘A"ÛÃLÈö‡’¢Ö”ņ¾…•øºšŽÓgšuZT<ª BU”/³ +7Ngd*Z&óëƒ/Ñ(«¦Í@Ñ R6DzÍVxì4&E‚œ8Œút*a`[ì@‚†Êì.ÐmÅ \šj?¼K±îŠïŠvý])éñ•TBÒ]45ó&Ÿ…‰ À ªêSÈ$ ^ZOw¼‘j{$²¦©×´KX´Ì ¡ÑŒ÷[‡Àe«,Ë•e‰~—±HG‡ãËkî™ç í U`ª8è 2 U<Ù0…NŸ­’6DÌv”ÝøJ €dÄjhHue Ì4رRÚW[Þ€&ÂÂI}wÈö‚"ftƒ¯uÇ‚§¤ÏÓIã˜RªËä&Vë@8"Ïbwl8ß_1ø5mÝa½E0‡uôysñwê?mž¾|sà@˜;­ŸÁj5Í禇(âÙ(zQ’¥áîùòº`¶`$Hø,÷¸äøòN.î¿îfxŠ•éR*Øšp퉷qÉî›â°¢KþÚŸYëhTÙ¶ñ)`á¦e¹_»/Ð.d[”]®?Y¹J 0àÒÆGÿéGè$î/ <Ù§ ¢8qºwWÁ_ââÎP’ÎùJŠá9¦—ضŒR{×1HE ƒ‘k#náü®¨ÜY +zðu »2T<ÉÒ õ–‘!dDû}éIIÓÁ]$ì]$ݹ)MGç&;DßÛì¸m©òO¤lº9ơȸ¼[H[ ú@…ݱ¥»<¼ÿ\oÆîí @"æ¿žFÑœne’çÌÁÀÂE˜~q#5F"1ÚÈo½ž æª_v:J´£ÓQf/CwL‘ ÈDŒlÛçÆá0º¾ô=~à‹Ž”Ú÷61oô~€ÙQArQ7<#ˆä.ƒ•‘A*ä$u¿E#“Ψ%ZÛÎw[¯‚ؤQÞüìÿ ¾Q|ó]óÿ@x½÷+S` {DŠdls;é¦D¨Ç .*³¶°.4Nöò 57vv-#íÑeQ`”NÆþÓ‹‘ȃ¥ø¬”¸×( +RÊ€ïnmúb(\aÍžsðF<$Bó«Mö°Ío×"ÀÜ×p.‰ÔôyÚ›˜϶ &-´39;‹€rÛÙ'ݲ⫠+>ߌlä£ï'P¢ÛNûBçݾ³õQ_á2~áã· ®ôéEÅ kwµàiÈÅÎú{o'ÜT ’)R›ðy> endobj +2052 0 obj << +/D [2050 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2053 0 obj << +/D [2050 0 R /XYZ 85.0394 752.3578 null] +>> endobj +2054 0 obj << +/D [2050 0 R /XYZ 85.0394 679.8301 null] +>> endobj +686 0 obj << +/D [2050 0 R /XYZ 85.0394 642.5879 null] +>> endobj +2055 0 obj << +/D [2050 0 R /XYZ 85.0394 606.8804 null] +>> endobj +2056 0 obj << +/D [2050 0 R /XYZ 85.0394 575.5077 null] +>> endobj +2057 0 obj << +/D [2050 0 R /XYZ 85.0394 512.0134 null] +>> endobj +2058 0 obj << +/D [2050 0 R /XYZ 85.0394 442.4505 null] +>> endobj +2049 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F39 895 0 R /F23 734 0 R /F41 935 0 R /F53 1027 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2062 0 obj << +/Length 3460 +/Filter /FlateDecode +>> +stream +xÚ¥ZYsÜ6~ׯÐÛRUMIì›+^§ÖŽ×’+[›äCr,®‡ädȱ-ÿúíF7Àc8²][)‡`£G_”¸Œà?q©“01Ò\¦&u$ôeÑ\D—ïaîÅ…`žkÇt=åúñþâÙÏ*½4¡Idry¿¬•…Q–‰Ëûò÷àÇPDá,¯ïÞ½y~s•ÆÁýíÕµ”±J‚›7on_?ùox×0g¯n^¿»ù'ÑÞ\ܼ¸½»úóþ—‹Û{¬éÑE¤ðL]üþgtY ~¹ˆBe2}ù ^¢P#/›‹X«PÇJ9Êîâîâ_~Áɬýéª(à6R%rER­ÉB›0Q0…²è«âp%² ðž™ÞõÕÕµŠEÐmñÃC…×|ös,&‹e24iÀE®‰c¶Ð¡ŠSÁ,Ý~¨»–V¬{Ú¡¬û¢;ò÷UI›ªÈnÜ×Rû‡œŽXÒÄxäùrýq¿ßÕn­¼ç'M]Óä-ÏíêÖÞéòÌ$B"4ZK{VÚîý±©Ú" ꖞŮ‚IfÁP}F‘©H÷xœoòGšÝ\‰ ¢áǺ¯7»j¾½ºã°?ŵûv Íìû?"P&üO0ëaºF†7ÃWØ|èôòGI·W“×íÿP"ø¾á³±BA1³[ƒàað„¿õdåýCµÛ…žÕ€¢fõ~Õ$€#Ò&s6ñaÍ&âP©4e’–2A¾ë;m*zÂaðÔh~<Óï«¢ÞºÐãîå ”QÄ2ʇêq¶ŒÜù.Þu‘-ýü±Í›º éç¯ïø—û’8`Lvö×±ê‡Þ*; ^¶d9Jt221s>XéÂ|zK‚ñÂ’&×äeõAEfÒÉ|8T¢d™h€¶ÀDíîÊÙ/ šüsÝ¦Ö “sþÅþɲ€P8®tI£Mµí¼•Ã{ͬö¶Jù¦; lW‰½¢f_Ÿò&´ð¡gnÿõtmi£ˆ‚ÿT„I.Ø´srôÓ>á ¹Ö¨M‘P|>²0…4Ùé㸮¾x©H;}Œx¢2i–ö`™qt|É!ÿ¸–F³ä¢©ä©§§rË;IzKÔ/,*ŒÆ"wv;кŒ@ßð'?¬«Fë(Yª&‰œjλ‘ä˜P1€4:"fG´6©¦F%ìö@TÌeµïS­$.&ÛZÞÞ»¢ß͹"L²º`jSy§Éä2$?؈Ì8¾%=`%]{uvMY­E†B$f)j-'Ù_O„œéP á=‹ŠÞÉ,$ïÒB€µÎŸ’ a‚ 8÷€ÕCݾç…û¡jh\vnÎ-%ã{÷±.]„A+KEЊ|ÒPÆÎxžÁµŸÑÑVnŸ@¹-|Âè*Ð` ®ÀeU–ò±.lš¬œÝYª³øÉL(Xm‰i +Eü„yÓQ†Q'ä"Ø3È-.¤dÆþ˜O©óZ¦±s˜ëR¹ÂNùDIetd äô( œÍ‹Áz–r2 )+'5©â½³E)W¹‹Ó8/JENÊÉLæˬÁr~qGáSzY‡k!cnL—ÌAÇ5ßIÁ8Ÿ’³ʵ<Æ„™N]x€|ÙVd=mE¥î³P$ÌÕ-UʈôœÎ#yçäü¢…‹ cô‰9ÑñÏÊ0ëB¢Óšt"  z¿›€{úDÎ3nQ| +®iTjöòõ›w÷ô›Ÿ}ûê{F÷+ `„õDeÚ|C(¥öàc11/ñ¦"óÒ“>Â)~¥:ÔÆÙû¶WD3]U’1±šú/,Ù`|£NÜ®6»‰‚ÛÜf„謮ÙbYø€c{߬RðŸÁ,ö ÃØÔ±AfbÑ ±­))ýîZêà®CC*ïÞÓ›/B”&kD-ð©~@ØüÈ¿Ûû®·ñ ´æô¼åÐÓ“ÕdPÕ8Cc­èX°ð8¡MÃû¹o /Q•<çÚ.¾Õ}m ¯x¨Š=qÙÆ™p-1œPuÓÛÅô$Ü"F‹{¨lC ¦§+ö¶yF+•5“×°µ:²@‡ Ìît¾‚”%(6Ít'1S Ê—­Ù+öoÞ¾…õ¸‡$'V;þ\S¿ï˜VóOóMO‘æ&™X¢\ +£œ ø ©Ó;ã{sìy™ s4ÕÀ{miâLÏ ûI>ý7jÌYŒZä,†Ïm¨ÝÏþX•Å¬X™àý)³pz£ÍlµÿBeg=ÈðÑŒ»,¸Ø‚¡µóÙ亡áÌD+†ºÍëõà-ÿØFIÇ¢I¥éüÖ8 Ë÷¤Cœ¶¦ +Ï/ÕguOèÙør +¼vj^‰š¹Àó¥:]'™­ãšèÙIf8<ØEv;ìÖ¬hÛÆ)¤RÇz€ºÉ^TÍZˆ%1Œw—Ë»sc+õj›õ–ØÇR9o Ž‹M}pâCÈ:‚’ß«"×ÀŸt‡5½6ußSN‘ÍÏYÆ6#†7DÙìòö ]¼É­í½Ùš^–ß fÑNJª8qY¤íC†LËbßFa@g„€¥íW‚~qÚ¼(ŽªI5–ËÅêÙÅI˜²35»òØÎŒ(š¾Øâ¬å©±[Œ/¶[|¾é1/¾}eÈI¡ï⇧³õ •ö>” ¸u“»†Š§Âê5W’M•s¦ˆ ™&×ÙvÖäÿ~òåJ„)Ô+—Ré0ê̇&⹞0Ñg&±ò™É1‘š¹Wèo>Jâ÷}wþ\žG$i5Iúä<Óé‰æEØ\’ÍNtWQ†é`ŽX‹ƒÒi_¼cûÞ„ëf)ÌS;š¡ Ž‘¶ aïzš{IÈßt,|Kz”ÃJõÅFª]«0ÕÁoØ„£b×h̉j‹‡‚ŠÇIÛŽ¸}ÈÂW |ðœÔ€åZÇYÄYGþ»ÁSI©•ŒÜI)pÑ!,@Ãèè"¾ |F š¼üa'§ÏŒŒzŒ~Ü&Ø'Ư3`s »v›I‚W¯o^ÝRi`!Ö–@·ùŠÑ®ê +þÚ~ÿêݯ7Dœƒ.Mº B öË”Ñ.à&þ^HôætÍËMÃY„$ô“5¬L+]9eÝÜöG0Š'' åévø-4ê[Ì3‡±³ŽOÕ5“½Ë1ã Pê“î°ÞÛ„Kk À˜±É˜ÛÚšµ¿ +i>ƒ‚)‰³…ùOZj®Û< «Ë¯qc›aŠçN^ë:­æËSÍyJ…FÍÄÉÓX:å:¦ž /ºë +ßO,Ëõ@Î#i¬B$ñÓçñ\+R `ÐqšÎOÄh*ÓˆÐT¦b¢ýt&S±Ô>Îr*’º.Ðè’+(*ñ þ‹€À +0‰0‹•!TÁò¿Ñw Y«òûX’ÅÊk×N×ËP ¤"& ê«@šÉ0æ›`Tø㌢° £¨P±ó–æQ”ùõn¢¤™4òP߶DÅ¿@1w ×pÈöE´I¾ŽÆÄÍ.²‡³%Ç#Qì§×Èz8Y†gc?®àè4ì”/Ãܘ²Úõéá½½ w<"Æ‚ÄX0ARÛSLa?Çqí’E{‰3¾$û­¾1m3®¾~ßú$ò,Ld&”êkׄé> endobj +2063 0 obj << +/D [2061 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2064 0 obj << +/D [2061 0 R /XYZ 56.6929 420.5648 null] +>> endobj +2060 0 obj << +/Font << /F37 799 0 R /F23 734 0 R /F41 935 0 R /F21 710 0 R /F53 1027 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2067 0 obj << +/Length 2757 +/Filter /FlateDecode +>> +stream +xÚ½Z[oÛ¸~ϯðÛq€†Ë«H>fÑlÑE·èi¼ÀÝ<(¶’•%×’“fý^­»“ö`Q ¢¨19œËÇoȆd¡ÂLó…Ô LÄb½=Ë{øöîŒx™‹ tÑ–úuuöËoL.4Ò M«»ÖX +a¥Èbµù²¼üôéêãÛ÷_P—¿¢ó ñòË^~p}ŸÎ5]^¾»º†WÊYB¹/?^ÿùéíå¹äËÕÕùÍê÷³«UT«­:ÁÌèôíìË ^l`¿ŸaÄ´‹'xÁˆhMÛ3.œ±ÐSœ]Ÿý7Øúj:f +.”'‹ ÁãtÂ`a¸f:Ú‹’1{y!c®u‘Öµ³‹m–é6ë/œ„älÑ} BêÀZ:#!DÒQâz—­ó»g§Fó¹Æ&»KEÓRœÄ^¾¿s}ee4ýå7Ñ™€1¤uJ—g¥:j0Š˜“;©Ü[ 6zü1Í6oN*ãšy=ªC‚$¬Òÿþ㈄ -õ"hlÞ£+$NN¸½%5ã÷ eflšÂ/:[Wå¦8ìȹäóD©ºQˆS¥º:ýŽ…754Ž¦6½ùÖw7•{ù£íáË»jïºöçD-aö¹©»ò·þ÷éf“m ‚¨ËU˜ë1-Ùˆ©âHS­½{ʪÌF|Hø/ô”…u]dé~bU0Êâ‚1XÂЇwÉd$‰€ô—óaКŽ‚ dfüšù¤³iÂaŸ5CHøΩd†jt€"ATWë˜xÆyÊä]Ú¸Vj +Ãn“6á{ê\î…+÷¼õï«ë÷ï.êü¾Ì6þ§u^Þ‡GÝ àE•TÞ“`oø¼mÒ_ &ˆR"`—æ{³w çeŽ5ìK°Sx/» j4èx‡hD© +ŒÍÃiÅ´UÛmZnœ×ªÇl¿Ï7™G¥´ô~nA›ÿEÙC¸ÎxE^úîǿƱLc5«S*Õw+“”v´ê{•9¯ -4’J½ÐÎ%ÜŽîdË¿±À©‰OD| ›Xݸ.³ýÙÆX@±^@½qè–DJSÙE¿ê®‡P&Î@ 2í}%ȉÌnKÍø?H 3{¿¯³fèÛñž›£Âƒ°0ŒÎ+¥F´í†¤²\tÕíFe$l’Ð2ùnžC÷{ùnúB˜¶õ‰Ïÿ ½YŒ¤8Ð,@r°Ç º‘6U’z32Χ "¦´iÈMÚåe“íˬ1±K —u}ت:•˜!i¸Â|B´¤f"H ñ§‚`ضg•R#ÚöQ誻z0ã8lhíôà8¤‡ùž¶ÅÚÙqì=f‡ù©ÉóÍf„iœÈ¨e±/Êþ‚Œ ݺà_K …(çÌnµw¿ÅŠ¹ 1{‘/Jä_Hž`Ägó Ò–šN(õ³ âäÒ&Eh 8Õ âLœÐ¿ë¬lÒ&¯üÖÝíF8©êsÒÿøp$D!ØD7?ûyóßå$ê3EœšGý¶Ô4êG)3½;x +ÇÀEÛÐošâfÿ¿7€/~¸¹é/ƒQS8ãëˆR# édì¶X“ÞJÞZíë^¥ÿ’C‚úXô² Ôƃœ×E¸;+ƒ&”Ó®çGÙl±˜JõQÂØ)fD’“[Ÿˆ·I ÔG.ò«Ç|㘠- š ¼½°"³£Òp~ Ÿo;bÛêÑ\3ÌýÁ53ùêØ‘{‹Xe#]@¹Ò…œsòtj‚ÊiÌÕ;eåéP}ØíŠÜ) œq½4Fã¸I7Řù1â´k~£ø}é,yc<·Œ´Ò¹CØóãê),ÙݸÃ΀Öm^äÍó9ŸÆ€Y©“ÇOm©\ R}\I7› P‰÷4¯§”‰æb^ý(5¢ŸR&R¨î.7&t™t”eödb$êÍç~¥eúÜ¢iÙ Ã4NÔZh™bóqC$Ò,2Ö—>üß+­ <éÎɘ£Š…§'Jü¶ÔtÌE)G£«§ÁÝ6\Íì¬QjdÚîy=G,Ñ´;ïÛ¼Þé³ÉN™xnõaï‚¢l\Ç6«ëô>3i­d)P‹¼t` +_Ý]tõCg ‰ZÃþÈb4ŽHðÒ½1y¹ÎŽ£ºMÉ OoK*ÒPñ™®AÍ!¦úD Ú–šñ`räÜE_׃ÆæNmvÖ(52m׃x0ìŒy¯³rS÷¯Œ:îƒネûyÝ…eãšÇ´ˆòöæÎô›Ý̹YØãó¸-Òòëñ:jÚÔX¢ãSÉÒ’š1ury^?eû±\•Èùy£ÔÈÄcSŠ’Du'neKÛÜ^ŸpÁ8f "MÁqê¯DÚRÓ¶ˆRϲÛÃýÐ )àGóÓF©‘y»q§Â€Ú‰WçÀ;û²{kiÕ¹‡ˆAáBÉ„™)4â’¹ýQãmx›p#Ìí:­X«³m¾®Š0ü±Nò£ ujtdZ”ÅÛÝw`¨ãMü-ÏÕ_—|úpu=²C€$p|Š9Ç6 ¡àÞî +wÿMa=ÀjÜ é¶Óc{ÿf™SÃÃfXÖžw §æ©ã=Ѻ:7…»X§ËCùwåN†ÖÙ¾q}Î2ЈEŒUl„ÿ‚èñ`ÉÎ@˜( 5!íÕ„Þhmår˜cƒ;*Y~¬šÜa¹w$2ü%4òrwðÛ­z¡ËbÙ–×½øý§vo©gŸk [R))Â9´êª?yê¤ïÝ;»4<~5æ/âë‘0«#r¦‘èhþd!_»—6µ {bV÷@7âʶ´l?üCýcè¼¹ev4õ÷qL óGm#P€cJüôßÎÿFKà%jªÆÀF˜&A)cgà$}ÕSH(€ž¡îÿbÚÏendstream +endobj +2066 0 obj << +/Type /Page +/Contents 2067 0 R +/Resources 2065 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2059 0 R +>> endobj +2068 0 obj << +/D [2066 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2069 0 obj << +/D [2066 0 R /XYZ 85.0394 108.4894 null] +>> endobj +2065 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F53 1027 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2072 0 obj << +/Length 1863 +/Filter /FlateDecode +>> +stream +xÚíXK“Û6¾ëW¨*©2„ñà¼l•<3v&±g½–²•-Ç I,S¤,Pëߧ)RâHÉæšR•4ýBlLáÇÆAH˜Çã(öI@Y0N7#:^ÁØÛs<^Ãäu¹^/F¯Þˆh“8äáx±ì`IB¥dãEöiòš0F¦A'ïn§÷eìOf>Ü?Þ=üý€pP:y?{üuöi¦1ŸÌÞÞϧŸ?î­8]‘F–¯£OŸé8ÉQ"bŒŸ¡C ‹c>ÞŒü@À¢¡£ùè?-`gÔNT£„‹èÀgC:ð#Fêà‡©ÂîJ½ßfI­Ì†ÕÅÄAÀ-Ë¿Å1Øv¦ +Õ´«"[Wº&ê{²ÙŠ¤Õf}0öX’eNõ<Œ$CŸÒÔ~XÄ #ì‚ÄZ•™~õ†‹Ž€YPÐ*¨Ó0ÏÊÃÂ@›ÏnÊäD¥•ýfÚùd ];:¸[3à<ì ~2p?”°BæxÊÎJüd%jT†xÎëõf> s‚:Xk$tteû¹n­ˆ‚ÑÉb­ËÏ!áTHC[' „[?YrÀÆbáåwPg<ÓÕ€Sf¨wÖ0==1ÌŸwÍíNíÔWÇþ=«6I^º^ž~)“ê©ñ¯ºåÆ©_Þ>ÎÞß;·«6êÌtÿ¿—ú– …°WküÿºÏu^Û‘`bt›×yU"ãJÕ[u3×ìyµÚ} ®ð›®Uú¥™‘ÔÈsÇ6I·Sº‰Îݪ½m¤n‰³82¬ÕÒᘠ³+¶ƒ–µqÀ9¨}ã´ÂŸ<° îÉ3œŒ7Ѓ̎›rc[Ón´§t„e’ÚÂVÂLŒÙè ZY¥Z妪﹮Ýb +„Îðâ®$Ä`í¾¿M,ú”©ªßwÊE‚³ ´ž×ÊØY2·Aٺ଑MÊvÉ4)QvÓ®Êß)yÚ šÜâVR_TåÊÓu¾U®†Bg7ÝÀÍbX¤4ßhòñÍ-œ>QjCN€ú4„Í^׎V9«O¤™4c§o1„ÊšÚÒNó’]È8“Í—Nž.¨>AÅ®UÁ¶ÉW6Òp…ÎÆLÊ0蓲f̹—I‚:;õîq>¿¿Åv^â è†"@¢ > &EQ=#É +¤ûÃëä›BÊÇó‡·7-ú/÷ÿse†ÄÇvÁ“$&ïºLÃÆí.0ÕDDpŠ}óðn ²a$b,û~L„ˆâ*dòº\XˆÈB¤å2«¾RuújY¤ø!^.O`f_\– å:¡—]YfAØ—a¯›SÏêÝœ•™*ë|éεL-“}Q»“Ò%Ú$Ó—4Æ$‰ ®¼¢±×5\FÚ_ЖÌï2’8ŠBÀ¶ÙƱ]$ŸÄ’ Ç`·p‰õÓê +ùÑhóÇ Ÿé ögÅÙãQy‚#"à ¸&P#1ù¢§ÖàTÆ!e]4GËunžûp& ¾ý¾Až­¼ÐG§PeZÙ”i{ö܃ïOïg·Þû»{FNÛH1T]ÂSãq¥†¢ÉÆ•*m5ÕOC¾&¤$jª‹®ÖazÙӦ풣mwù7WšöœMpBEà_´GËtf¾«Aj¦,”=‹´žÆ⮧™^µÄïÑÓLÏzšiô<ÍžÜÀO;=/<&á:ÊEÜ?7æ÷÷è´³wóW´܆±È²›c‰ðç@OP{£Ó“~pì™Ò¢3‡i§ vsÌÐY»•›«uå\|ýëÛùõma¡óÉÎiÓb.Ì¡a˲¸¹øeû2Kʺpƒº®™l¹ßzÊ&϶µÚ&;¬b¡¥‡ú¦šÊ*WW9šÉAìªM¹[Úâè6Á@{¹²Ô½Æ„eV]–åwóª±ÈŸvÉÎe)W¬›²V7 í°­«Õ.Ù®óÔ¥À­Ñáz¢%°bƦ¹7¦ë¤\¹CÕnß`ïëý±ºo‚ЫùDøac5Ÿ?¢}ä§pÓÚ•YÚl +"=änê±ÍNg†IèÇ!& 3oµœG/Ô¸ª¬­˜U„}y}¸èc(ÊüPV[ëÓŒ" yËPŒ# ‰x +É! }1ûw.<9¦ã¾ÍMõ“÷„[ºj +‰bÙ¤Vs L•y@Ø™ˆóK¾$”`)dÿÜ §ÈýllŠÂ|å-óB À†‰áŸÂ~¹ + Áù¦ÉitŠ©¯b ÂDnrø âvÑ!t"ôp[íê`> endobj +2073 0 obj << +/D [2071 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2074 0 obj << +/D [2071 0 R /XYZ 56.6929 479.6712 null] +>> endobj +2075 0 obj << +/D [2071 0 R /XYZ 56.6929 343.3873 null] +>> endobj +2076 0 obj << +/D [2071 0 R /XYZ 56.6929 280.1555 null] +>> endobj +690 0 obj << +/D [2071 0 R /XYZ 56.6929 229.1103 null] +>> endobj +2077 0 obj << +/D [2071 0 R /XYZ 56.6929 196.0344 null] +>> endobj +2078 0 obj << +/D [2071 0 R /XYZ 56.6929 160.4072 null] +>> endobj +2079 0 obj << +/D [2071 0 R /XYZ 56.6929 94.2535 null] +>> endobj +2070 0 obj << +/Font << /F37 799 0 R /F41 935 0 R /F23 734 0 R /F21 710 0 R /F48 950 0 R /F14 737 0 R /F53 1027 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2082 0 obj << +/Length 3151 +/Filter /FlateDecode +>> +stream +xÚ­]sÛ6òÝ¿Bo•g"ßÓ$í¹Ó¤¹Ú½¹™^h‰²8¡HW¤ìó¿¿]| EÉéµã\,Åb¿WlAá-Œ"TX¹È¬$Š2µXï¯èâæ~¸bg‘V)ÖwwWß~/²…%Vs½¸Û&kBa‹»ÍoË·Ÿ?øôþæß×+®èò;r½R”.?¾ýôëÛŸ<ìóµåË·?|¸…Wi¬$ÆOÓå/ŸÞ¿»þýîÇ«w=9)ÉŒ +¤å«ß~§‹ Pþã%µx†J˜µ|±¿’J%…ˆêêöêŸý‚ɬûtŽJ¢ ÏfxÀÙèµJñ”%Zpá˜ðþÃí»_n>ßÝüü Oã¾øF+nˆÌwȇz³X"Áâœ(& `#Òº©»Ã53˦joT-»]áÍcqÈ»²©ÃëÖ?sÿ¨ó}Àk‹ÃSq¸ÎԘͭZÞtaâ+´Å¦HV>¥šK ìÒžyš™3<α+«²{‰‹æa»ç<ìóèôTnŠ‡”ñ U|wóé=î³”(EùbÕ3y‡+U‘·E §’Â,o¶3Ä+JŒä‘øsD˜Èð‰´Hzj¾8ú@jŸËnçÁuã!ëf¿ÏëVe]xpóˆ–hþ™;jŽû¢îÚ7×+AaùÎðx(ðü£Ý5‡0Ûa—ÃKXnë9’IÂÕ‘!^ý¼T€–Á¥>Â÷Žrx t¶þÍS ƒ=ÊË*¿¯Âë@ÿ»<XzrFÈA¿À`\â81ÑËø~¬ËuÞ¡$ +TÏo9BE¦ƒ<#(ȳ7ý(÷»wŸ=>(N]¬»òš-›˜.i_Ö›²~ð˜gÜçGØ©î› yÈ‘àEIËMùPvyåUª-ê¼;z±t)Åò¦ö˜žÙ€µ>¾W¸£eËç]¹Þù™c[œÜ?ÚAÜÛ½kÿÞùw4‡ø,ò¸DQ;Té,$¼LÁ ÊHSÃii—w»HQb£Zw :Ö·»Û›Vm÷R¹¥Ì”¶E t74ƒÕÀOöÇ¢íÂq¦ÇB¯³^è3¹ü¦M¿oA~ +¤Nø¶ªFMH÷wÐzñCmwKŽìÁz—O*ÿ²?¶ó>ZóhZî_‚Ið/ÅËÔƒs“Ë4[€s Ô2ö5>œkÐÏyðU¿â*]Ò»ç‘>€×°TÚaggÛå_êæ¹o& ˆÞR.ç¬:'b´R_eåð(–EÍuו{Sì½B?Rÿ‡Rþpì]9Ì!Ä[dËMч½w4Þ5ÏîçÝB]¾îpÐB D/@ †]ƒ€ûñ³wÔ8Ý+©×äpŒ±"G߀×îep_Ç*LQ2#“à $R +Â7n±Ÿ]Ät{RB„— +¬g™™YÒ*ÅŠñÚiÌÚcᾫ{O\gb&1VESÚ6ÇúXå›Í¡hÛ)… vלÚË$öX34Ž£(E4å|Lä¯mˆÊÔH¶(‘R«³TN–µFeÑ?8§Ç¢såî{Ïuá'p!o]¦7e€>a‰í k5„‰"!ÀI#Ç‚ôñXuåcŒ?ʺíòz]´i´æQþ»>²‰š›W•×ÔÝ®sþÝ·m0SóØ©Žß|~’“@:,’ð¡ ¼(|Ä3'£23ÄfT^–Ñ뼌öXNF×s2J!djȶåÃj[Vʼn€jF(—â2}=Ö #ÕšP +b4¢p^@1%Ð ó³$NÖÕàf2‘Nfƒ$1;c#m$ŽQjÀ²ú¼wfÅðù¦Øæ doüÆr\Q¸™ŒE*¿-ºõ·hÌ Ò;§F‚h£y@?/ RñŠ0$X„!b9aøòªÁ{ïÖ»"|”Ÿ¢‚7ïŠ}Èw­¯ó¤Ë‚¬¬üµk`?Sv|ëc³/Ì`ö…ñAÉiˆn¤W²ed¢t9£ +ËGnQ,ðàF}•`.)D¤½Ué2Oxó$Å(Ê$5!„bMË,Ö0¶k\ªgxHÀÓ(ÕPN˜œÈ°d«!Œ‡\­ÊAácà4‰qF•œô’ÐèLÁO@f#Å+,„¤@‹lPùiC“,†FS•d’hªÎ볌Ê+4ź ÏËéóã« 'Ú̱Ž¨.Ó‘fèé2‡ ’ë a·E=[±‹Q®«k¹(87µÜ‘õ¥›k|kšHíôà:‘p…W7²ß‚èEêúzôLÁ·}>¯wöz)C?Æ^¹ÞëÂõF,w½ÿšniÁpR4œ—¶ŒH3[Žx ³ÔØñ–ê¡z +šyßD¬š‡HFÎ2k Á$,w‘ )Öy&ôXŽ /ó2.›7S«aL‚cÎøˆ®¿T«éW<=Ä„4 ¨¢Üœê %F3~™q=Ö çÆUbg@wýÕ]žŽMôqØHÛ”nRuž›œB¼È„úû¸Ù¯8ÃÍ‘ŠCt’Q8ë ;O‚x¢¬ŽñöÖ«õ~€SÓ@oÚɬâD0›g€$Òù÷±¦_ñÖ˜eÂüyÖ„:(ü>ŠE¨ "C­£KGPhh58u ‘3cù¸ŠÜ†òœJ ãîÕ{5*o»÷î*¡k¦$Fq€±ñaòµLlµZî!¾ËÂŽOyUnzw­‚§Á®àz] o^ îÃ"„BXtzÙÂ*Â4çç/+YZ˜lÁˆ¯æ/_v¿â*]òô²ø:Í35ì|ö²!H\ý(ärQ…àé±X—(ñÅæÍ\‹­ÜW´å.ùh×Æe.(¤è1š/>±ôå6êjëøpù%bȇc¼~|úð’²!d¥£ˆ_]ëcÀ¥#ÜûÂ7Å` ŒÊÞ„6£€bÚ¿ñ ƒôù U¡*“˜_c~ÒØõ-Ú~ÂË©í[ÄÂyè:Ûg}6¿òÙ6öÓblCîoUÒ­Z±¦Õ\# u}q½üÔ¸™Ú¾imb·ÝÎØA˜íC\Ðå¥ÛfÒ6ÎzbsC•à!…G"š°” ñ¤I9iíœFg³Ádì +D1À†¥`Ôÿ0`R‡=yÛ&-Æbºî»ü)€Šº8äaãØíÑeÈXžÁÄŲ*X™¶%}«"=jª|ï>’± !]åâ±*ÜË»›@rV€¦-J˜¼™Ët˜ÂzæŸH߼‹ m!nõ€·›}Y—`®ó.ä—bxY¯Ãgóú,óL +v23 +çø ¢QÏœ’5ÊúÚËWekèžšc7ÓЋ‰?¥kí„™]Q=†Ö w%³Ý°Ñ`Á©‰MŸ?Ý|¼¹s?Â}ÃçÿýLržPDJ¥ò¥èF?‡è[ÓvçH?Ò¼x’ ™ÙDYËûß™ŸÆXü”˜ü4†1Û"ké˜M¤ÂµËŠÖÛPx&? p­x9 Ïç<ºH:؈¦ fF¶‰ÛqŒïÞ0s,è̔̕…øRéKž€¼B|lg)ó7„wa½Õ° ó÷#º0„¬ZÄ]/…v¼Ï“U€ã[Zq;ðêÔì0 ñ‡ ¶ØéHïï¶xlaá/-ªrP6J`ojcid]ႆöÙÜãÐ^Ì×"h¯ŽùGsÃ%ö ŸÏ§…”H€.¢ L°“x0þ¼î”öÿ…Á ‰endstream +endobj +2081 0 obj << +/Type /Page +/Contents 2082 0 R +/Resources 2080 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2059 0 R +>> endobj +2083 0 obj << +/D [2081 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2084 0 obj << +/D [2081 0 R /XYZ 85.0394 751.281 null] +>> endobj +2085 0 obj << +/D [2081 0 R /XYZ 85.0394 555.2948 null] +>> endobj +2086 0 obj << +/D [2081 0 R /XYZ 85.0394 126.1169 null] +>> endobj +2080 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F55 1035 0 R /F53 1027 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2089 0 obj << +/Length 2725 +/Filter /FlateDecode +>> +stream +xÚ¥Y_sÛF÷§ÐÌ=Tn£Íþç2÷ä8NëNãäbeæfš>Ðms*‘®HÚõ·?`±K‘§sãk‰±X?»3bf,³©LgIª™áÂÌVÛ>»ƒ¹ŸODàYD¦EŸëíòäõ{•ÌR–ZigËÛž,Ǹsb¶\ÿ>Ë„d§,}ýÞ¨³fÁ%,€\Ÿ¯Þ³óWï‰s V& K„JëÙ§OWï.ÿ{º†ƒøÓ…á|þáìêËÙoDûtšÊùÙÏ×(ìäbÙm¤¿YÁî⯓ßÿà³5ìù×ÎTêÌì 8i*gÛm3Z©HÙœ\Ÿü§Ø›õ¯NOp&••Ö“b&K‘ó™”Y%•ßíõÅmêì·ëdÙ7#ŸÁ,,n¬gß•ë[UåíWn¸â½Ž œ¸ËKœs½¹2ÛæëIâ¤(Ôc&¥}9É8ó’¿Þ^^½£Ó°“õ¶(‹ºÙeMµ#Òçü6ß +7ÏËUN¤YÙf›‰ 똴Öñ!¶†¦\hÑ BVY&´v:_–¿|üü²/Ë&ß•yCš\?×M¾­éá¼*ëj×ív¿®fJ[ähÁdêºÐ'.X¿Ç,N'IØ@ç²)‹È»P† Aº×¹b´‰” ¥Ì¤\5Dªt."ê«”É>Jh/~å\޵ॢ*‰ˆ”M>ið(1Ø;¥à}.«‡º¨Ç8T‚%ΪÄ$¥§p#@[i0ˆ¦A)AXôDxL L!Õq1ø~#|1ï.®Ï?_~Z^~¼:bñ)ðMY<°àÑâ`p¨˜7÷9&̳ÁÜžá ÕíaAB¨(n{¡4±¶äL'Žb•ØýÊO\.%Ÿu¾{XFÐjC“mSlŠæù‚0¸°BΗ÷´/ÞÓ\Ìï³@ÌP5°‡ôj3[tfµêb[l2\Lš9ä†S7oWMKI¨Y¹ÓÏe“ýM㦚ð‹ÐPcuØò>•M9&eIb\—MF™ùu“äó²©ÃÒ}= Gmª:÷ÊèyQõf—­òz¤)¤Èu +¨ÞÐëYI|Õf¨zÄõŠ&#Æ!´²b!ŸõËô˜E‹gôógþ<âcS¡[š€?ì^Ùh¨¨ï¡•´f)—"ðõ4R<ñ /+pŸø„&{Ìà AãÄ1¬fÜXd¯óÛ¬Ý4‹`CUœe‰6±¦hµ"hp[m6Õ“O$ðtóL¿”ÆaP†žÊ—0Lk>²}åS+¤ƒõšÜ\×DÀ÷ô²¿Ä$t*æ^ÝDû¼(UÌð0{_Õ žŠÍ†F7áÍ6$G˜»ÏË ·Â_>ª Œ£Ô»â1¾RŸ½ÚwmðPbê—cHöê÷TDÜ›6G)æéF~Äð<”jSÆ¥±c'Jö—öTïD™'!' ^qäGp@úÓ})£/³XƒE + бÜlj?©`"éºçéHèa¹NûÀXPpiè0ƒGÁ~p>ДÏ/QqëÐ߇‹C„3”Ú¯]¬'VWp¦2©é·J6?P÷ñX@T®ýNè;%-ËR‹$,\T‡ŒùŸÔ…Ú “JgMn’—Ìc¹Vc?ƒLRÖŸÛ¸Œï,y·Y³ºÆ1g…³(ï¦ +©eç‘ciDÁÉѸƒŒ[×B•¼~NÄ8¦ +.Ç#’]@²ëì¨4"%kÁÖo+M²=°D@Cºø!¬œžÈôÀI(X:cë1Ämý)›rl’¦xLÖ#hbç1a™DcE<À&·!ÁšA‚µ!Áš˜`íÜËõ£"°¢!‰2_EzE¯ø ä±Åmw[5AT€9Œ‚É|‚õÆpøÐ|Sü¦à±Ô‘ÝK^bÒAE$™±¼tð"lÁLäèJLÀöØâ{lI9ïhG4U E—v¿KÕ½£\¯¶q"è˜ÑŒ×4~°b€àqæú’Œá“Hâ<")á=$aŽ¢I:(ÁÈC ~”’¥„‡à`ò¹G*Äy +©q+Qµ»U¾ÀzŽµ|âžo Rñ¾™0 tiÌb=Àoz‘Å£ZÇH&¬¦Cl!ªC¹‚Îw¾òý#ÐÐ H ƒ Å·Ý@©ý |§ +ƒËOšæ¨A$’ ìW¹×Úäu€SÔmàôÀõÈ…~cÏ°ýåÙm³oʧœ£ñ&#/æeÇt§÷Uå©òJ¬_ÅÞ;vݱEî÷ÖôXÀ±³]ç¡ñι¡Ùa¼{R4¶vÝ£“‹í¥߇Í Â-Ãlá8ÒŒÎè¡ëP׆™Ã“(ãè&0…|…òʺɳðà-›x¿J„0ŒÑ1þô­æ™wÛp5r9œ„æ#°Q¾”`ÊìÏœFD1X¿¡j@ ÷—4@@»ûe„ïï”1-4ÿ2v·/–gX*:“ÆÈ¡Hì…»øþ®zÁs¦;TAá¾s|(»¹ÉO$*ò,G}ÒMøt<Õ»Ðñ!{®ÈS†T]úסºà+ýê‚,£1üÔ‘#•ÃYJËoŸ5ð[Jêï(4Çмó78öW‹Ðæs&H¡ƒáí³/H b-L,9H¥ä#t +è¦P¥p¿›8Gy ÔðÙÍS‰,±zÐñÚäÐØl9Ã2ÛÜU;ØÍvú]ÕÝ£í¾X_THEJI¼¤Ý=Ç>&öBýã‘ëôZ&ןŽ]@Jß3ùnNùvæßØ×éùªÝ…oYÍæ™&«’Frþˇ³óŇw&Ü“¥º/5º¦êm÷÷¨ÝÍ$ÇþÌ‚T<³ 5£Ç:_‘ ‘»”ã®Wè_táDè@XVç «‰ +Ö¬Ö¡ÑH²}Þθ?ÔS÷Á}_Ä˽VxùºŒxÜ/é/þBg㢎÷²ñæÝSƒ¸uÕúǵpÊ¢›úð -1~­ø¢Ä»@ÿ÷Gáýçr0åœÜïöoClT +-%”>Ôý€Û-Òendstream +endobj +2088 0 obj << +/Type /Page +/Contents 2089 0 R +/Resources 2087 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2059 0 R +>> endobj +2090 0 obj << +/D [2088 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2091 0 obj << +/D [2088 0 R /XYZ 56.6929 752.2635 null] +>> endobj +2092 0 obj << +/D [2088 0 R /XYZ 56.6929 690.7232 null] +>> endobj +694 0 obj << +/D [2088 0 R /XYZ 56.6929 652.8084 null] +>> endobj +2093 0 obj << +/D [2088 0 R /XYZ 56.6929 620.2916 null] +>> endobj +2094 0 obj << +/D [2088 0 R /XYZ 56.6929 585.1376 null] +>> endobj +2095 0 obj << +/D [2088 0 R /XYZ 56.6929 520.6753 null] +>> endobj +2096 0 obj << +/D [2088 0 R /XYZ 56.6929 462.0998 null] +>> endobj +2087 0 obj << +/Font << /F37 799 0 R /F53 1027 0 R /F21 710 0 R /F23 734 0 R /F39 895 0 R /F48 950 0 R /F41 935 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2099 0 obj << +/Length 1782 +/Filter /FlateDecode +>> +stream +xÚ¥XKsÔ8¾Ï¯˜ÊeZ,ô´¥¥8’@€„Ù-ŠÇÁ{2^ücCØå¿oK-{<ÁÙ„¢æ`©Õê—Ô­¯‡M)üØT+B…‘ÓØH¢(SÓY9¡Ó X{2až'ì˜Â!×£³ÉýCO 1¦gó,M¨Ölz–¾öNONöÞî†\ÑàÙ ¥ÁñÞÉŸ{/vºkx°÷äà L¹Œ#`bœì~<{vÿP‰|a ‰¥²fYɯOö“Ç/O-ëäଷwè£Âûyòþ#¦àÚ³ %Âh5]Äf Ÿ–©QRˆŽRLÞL^õ«nëXŒ”ÐDi‰‹± )C"KÖ•³E¶Üe:ÈvCAul&qЮk¤Î견+$®“«©m”‹¬Ê–Ië%´ ¿ûpév$»-6³ 8ÐÎ_˜#8ªé{/L*ÈOíôFCµ·ZíTÇúvÕ쎪۬i‡óÛtsé7õšé6W’¦Ë¬i²þÆ<¼¬—~¤„pøýç=q&EÃhÜêER\ÔKH&Ègi|Q&³°LÕ¨3ö¡ÈÐRìD‡Çó¿¥xÙ|“ÅÕ9—/2ž?9øfŠ9+Šg//¾íü‚>ª?ãAtWܱí¼OôiôèùÚ¼[¿]Ÿˆ¿Þ=_½zøðV_«\aŸzB!(²¹rß• a‚ä¼þ’!-ûêŽèÞH½„·'fLÑœ­ŒòLë¼(PîùªòɉD¨ùHEK$íï¼³Ês .¥% €exL(üLra ÊÂD +l/ð]v7Ð?ýŒ3¢bj¶OÂ_Oû"W=‚ÇX mYä'ûuZ8۲轰ä½*::Ü6ÈK¢hj‘ϸR®P4ëžl {!iöÀHå|r^m”ŒÔÅδX¿YoâØ+ábï,>±,ŽÀà߳أ2» –ûŪaðãkMÙ, ºjYZxÓá±m‘žWi>JÓ©qÇŽz|„Ffå*—ZxÜ:xz¼÷8<ÞW¾ÙeAŸ€ŽRyh–·~ëÆXœÏŠÊŽëªMòªÙ 1z=ü€‰ @,r›ßdÐ ß«¶l5+jD@0ËýƒÖ«|^Õ$Ò ƒË+b©1Ÿç#Ùª‰Ü?LVÈ„Ö#Á‡ÊIk¢e20  w¿ªJB3$n¯q_« â]Vñ +j$nªC $¶ó Xñ‰² ö‰ê,ÅC]¾ÍÖ—oÌp¬…í¦|T ¶@¶ ¬1ø(ªŠÂ§Gñˆ³¶ÎÓåÍ––Ù¨ï\#rs³AwNxæ?<²ÒÃúΩ!LCзL¿E.ÝæÞƒL‚om6à”"‘ܪüÄJƒÊ1ÔÔ¾!ÆJ5MB°s¸â+L«»<íÃÉZWHè‚"ã 4Z1xeì‚­‚ö»†$o³Ê‹­‡âcÛ#€|ì_Óîù„Ùogd½j]ŸàPµ­ùP¡²4¬µ_ c”ĦË_£®ßtJ$ïÓÁVŸ9†w<¶æ,뢋+\°Û3ö%t€ÕIb´êRÍëô¦c‹ [Œ¢ŽµïöÝeÇWF—ÐlAH|Ò®¡Ù‹Ùv)º5i6ôg²&"JëøöNM¢Yßçf 3‘öÏ­Èf‹qÚŽoþ-ëòW‚]Kd‰G³µíàä_ü û ™­4#ØÐFþòßC›ÿÇdL„Ö|üŸhÕÖeÁ„¸nzÿGÒ¶ÿ n 8endstream +endobj +2098 0 obj << +/Type /Page +/Contents 2099 0 R +/Resources 2097 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2102 0 R +>> endobj +2100 0 obj << +/D [2098 0 R /XYZ 85.0394 794.5015 null] +>> endobj +2101 0 obj << +/D [2098 0 R /XYZ 85.0394 668.3939 null] +>> endobj +2097 0 obj << +/Font << /F37 799 0 R /F53 1027 0 R /F23 734 0 R /F21 710 0 R /F41 935 0 R /F48 950 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2105 0 obj << +/Length 2487 +/Filter /FlateDecode +>> +stream +xÚ¥Y[oÛÆ~÷¯Ð£DÛ½_pžÜØÍqÑØ9¶sp€$2E[D%R)»î¯?³W‘ÒÊrQ×ËÑììÌì7ß,ÉÃ?2ICÍHŽ&bT¬Îðè Þ}:#Af…¦}©ŸïÏ~ú…©‘AFR9ºìéÒkMF÷óoãŸah*ðøöúâãôãÍõ/Ÿ.¯'Sb¸âãó/_.¯/®þ7™RA$1>¿þzþ›Ÿû21t|þéònòãþ׳ËûdVßt‚™µé³o?ðh;øõ #f´½ÀcèhuÆC‚3g–gwgÿI +{oÝO³® Q&iÆ”ŒAF:p†0H2Êœ3®Ï?_ú]Ý]ÞN`ûÿ…‡ûÛºåêÓ×Ûs»Ûû«›k»[ÐÉzþÅ#E˜3í”Ý/ÊÉ”9®g+7ã¶Ü<—?»Ú¶=„·ESǘ>m7¢ÇåÜ¿íÿœE¹î¼ä¦ž~~S—EW5uÄê¹—‰¿óÊŠæ©®þ +u‹°âïå«Ÿi×eQÙÅãªUm7h·ä}æ“ÅþÐ훓޾‰D†IÂVÆÚ†À¬ÇŒ‡Àé†($ízËò,HÍxÛVõ“]›Eó˜Ý\çÌo–­Ÿi»YW®Êºóz+Ìü:,b??jAJ%QHnnÌø®,÷ìh{fã¦Þ½Î¬þRŒGn ÖüÃŧ ¤(UÑÇÔý¢·E›x°E÷tƸ3xu}áGÆ?Î竪®Ún3뚟º-K÷º?û<«·³¥?F¹yÙͪe‹‚uƒ¡g1bͺ» 'ãü·»›ÓÉo³à;XÃäƒÿ¥›ÚH<•õþ»ì¸hæ¥'~Þ­ÁLß·J!¡`ì}ûÏß”mû~t'U‹MÓtój“³èHé’”nO*Ý]ȹ•JíÔeAŠP`Jzxø..ï>Þ^}é‘’ª ¢‡dˆbS* Ai‘L›‰“¾Ø [€M œ!… í‰ÌÒ`P±^ɦj|Õ…•ga5K©ì\8÷£YXz–l|.ëÊ—Y;½´À ö>‡_ZúdŸ/›ª›:\ "¦¹樣-ÔÈ#|€Á!pœõ=äHqªäÈkvœŽH€±´oã«Z»nê¹5!ãNðÆœf"Ì .UL{»ZF›Ašº‘\5¼õ$"Óz›³dM‰3š¾‡¬I +l)ÁÉë׺s‘·õÒp3ŒÏù.²Ë× Ð³±¥챡ç<$ >i`b3Ñãm˜{©º…ŸMáºEhD4WÁªé,ç ŒPDÛu8Üst«»uŒ&¶k?1˸Jid0!ýLʇAظï±l¯Þ'’ÕÿÜTó`Ã"l».Ë0åùá3À„Pj`Gð?> ö G¢I%â˜ìÛTÂÛhwB`p÷»RF÷S1h^vÍS ßØ/ÏóÖˆ3P0Ô³…Ÿ‡­n à3`)àú79J_*v¦‡$%Iíòª¿¤„·†è·—ŒB™%' † +ÊÞ`É €>Û®YÁñ)2á€#©—'›!Fi¯!ê à€c÷‹ªõË×b5‘°eL‘L>rKæ${×¹ +ÇêšïÚ¥ÃüSÙùÌUÀ/ 0û9[´¬h&"·¯­=‰/ ûB}ˆ–XqìÅV0E`Ыۉøâea)¬ùÎÈÍÅ—ÛjÙÙÆÊÿÙ©îŽg\à÷ Ó«{6€‡§8¥¤äDä)â$ß‘º{ÅÚô @î8SdvîkÂ6áXoºíÙJ@Ý}K¦À€~*å!Z1í×zˆVG t^f­0ÛŽÓÚ%+.YÝìãl»ìüE³ZyPêU].ý›4 glBÆ>8f‘3áp=ã—Ëæ%_åÎÈ8 M —+;Á²mm—,ƒO š1ªÄ^æUù€zÌ9?9†8pê^ä·˦ˆ·‹¦ øŠ.Œê&ÜXl7®ÝâlÜ”±—)aËMíz·ÛºÎû ¨>´iÕoU¾’+ ¨LÅdrQi½x¼‹þ.BÉv FîþqÀÄ ë~°@¡c' ?PZ»DX{îïÈÖÓ*Øîòz9+ÿ‚†[Ÿ­j¬#±åk¹8Gy ‰ç7@$FEýp,¨ö,<•m¼AØËŒòϪí<¹Üzél+°J%¿ž¢‘€bp–C +Q{¿döRèêÑ®ë‰Ç«Æ{×O–ËÙCc[ÿça瓵»QçµÄŽiî_<¼æÎ‡× Z‡~Ššã)ªULWUAÔÛüǶ +WË6&’Æ”€}ü9[­— ý½>çÑ^Ôêx÷ #«Ü>ÝM3<Ý=6Ò…ÆÆÁ(k8aü0WÃÇÞCÛÿk™·*endstream +endobj +2104 0 obj << +/Type /Page +/Contents 2105 0 R +/Resources 2103 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2102 0 R +>> endobj +2106 0 obj << +/D [2104 0 R /XYZ 56.6929 794.5015 null] +>> endobj +2107 0 obj << +/D [2104 0 R /XYZ 56.6929 752.3759 null] +>> endobj +2108 0 obj << +/D [2104 0 R /XYZ 56.6929 668.0781 null] +>> endobj +2109 0 obj << +/D [2104 0 R /XYZ 56.6929 607.6906 null] +>> endobj +698 0 obj << +/D [2104 0 R /XYZ 56.6929 570.577 null] +>> endobj +2110 0 obj << +/D [2104 0 R /XYZ 56.6929 534.8112 null] +>> endobj +2111 0 obj << +/D [2104 0 R /XYZ 56.6929 503.6098 null] +>> endobj +2112 0 obj << +/D [2104 0 R /XYZ 56.6929 440.3004 null] +>> endobj +2113 0 obj << +/D [2104 0 R /XYZ 56.6929 370.9227 null] +>> endobj +2114 0 obj << +/D [2104 0 R /XYZ 56.6929 274.6697 null] +>> endobj +2103 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F41 935 0 R /F39 895 0 R /F53 1027 0 R /F55 1035 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2117 0 obj << /Length 2188 /Filter /FlateDecode >> stream -xÚíY[oÛ:~ϯðÛ:85Ë»¨Ç´I»>Û¦Ù&],ÐöA±e[¨,ùXR‚üûrHY’e§Ày]o£ápøÍf -l¢4Ñ1'Q,‰¢LMÛ :YÃÚÇ æifhÖ¥z÷pñöƒˆ&1‰5ד‡U‡—!Ô6yX~Ÿ¾#Œ‘K`A§_o¯ß_θ4±œ^ÝÝÝÜ^Ïÿ cE((~¾ºývõ çî.c>½úxsùóáÏ‹›‡Vœ®ÈŒ -+Ë_ßÒÉ$ÿó‚5y†%,Žùd{!• J -fò‹û‹· ;«îÓQ0J¸Ð|DœMàˆ±R¼§-¸pJø0ÿ4rF"Æô$âŒhÅ͉}‘hÖ¥rÛJ3¦ú@ew}›Ö‹·û´*ó'²(‹ÕP¦8BŠó´TÇ"Àé"0Á”îËÐTéï³.±Í–iQg«-ÓUÒä5Šd›b¯J÷Oéþ”ÆtÌåQt^c]ªÓk©¬´ÿ²;¾ýÀd—ÄQ¤·%X!A“$±a¸#3á‚ÄŒJO´~ ùÃjóF’#û]qöI±,·#|„"F+õš@Abò+}Þ§†0®Øùëh©Žï£ÎX³–ý yLªt¦%‚"-å2+Ö8*WØþóóÕûÙçk…#+§ë,ö—ÌLÓ¤ø{ ˆ+ª*]Ì€p?¨¢þ‹:…5M‰y^ÁZ‡ê ÖÕÿ±vk»}ö÷v„7Á Jž¿’–êøNúx¡L›þ¥´xcqovdñfÛÞìÈáÍvzx³~á Þ†±cÆ „ . Ò‚t*k°BÝßÜ t¯>ÝñßuBáÔlFb°ùúá=“~ƒßÀHPF°Ñ©#§Ý5%:k<ìÍÁO/Û£¼yÕ®†ç¤ýó½ûöñþõc=lll€œàá~þÑö˜7vèd.á,›b™uôóH”ØÖ—lú\b¿JwÉÞbÎ~PÊó–+ÈK¤P°wØ[6MpaµJÿj))Î;¯ EÕì–ž!ƒ(ˆnËîºqÀ¶§k5§»¾@5æÙã>Ù{_µÉ1hÖUpk/»º\ï“Ý&[xG¸KAô $ñ7vˆmœá&)Ö>´ºã[ÞMÝ ^pŒý< ¨:·&‰:Üšä$â±j;@8…´m_,áP`ìdQŽä¶uPG“Hs<ºûÚ‰ðƒóèD&€Ç(‹Ú‰Yæ8ÑÔYžÕ/g1†ÒÞ¿宂Û8Üh12&’åø¢ƒ-@ÿl è²ÀÀFb@Ku8º~Ÿ=â)TWS˜B2lU6ûE:K–KHê*ïF»{A´ËBòŸób„sß'Ûì0[ÏVYžŽ°Õp¥JÈ!Û_¯²û<ÅSFÄp yV¯ò;<ÐHKœÉÂr?ñn~{í-L‰R”÷Ü÷áºÌt¾^QÈìxþ”Æ&(ãž‘žÊ_!’>gõ§‹2ÄCĆ›Ì³ÂÔrçâN»˜mâ¤]7[¨mèØ×ø¤€Eíélª5OŒÖ ìâb¤e·BD -tªƒBðõQaÃH³³æŠ/g5˜-yò”dyò˜§!ÄùÔ™L½³q[4è8>«r8kj+dSd H#`k)¯pÛs’ŠH{@Û©)m¿l{ 6ïï,§HuÙMY€Ö%àËó\KyPû¼ ^_¸Ä¡ç…ì!/@AN—Ù:« c)[IÈ3$¥˜Î ¤DmÕ¢Ù#EQã -H_À(ÃCû‡À–¯bXRÚõZ]HL§¢ZŽ°”ÄqëVu_‚1Õ”=”Å=åYä Wi3Žžú’|]îA…[`­…³6Û†ZÃîiä3ä|\iªÔÓ$ØT›¤ÍrÝ8õIcëm›&EZ8Ré\¤@LA'`¤,àÆ´Œ}þk—:Nªêç±hp69ŸUõKîX™¡ -ÜœËj…ŽÂ†æà6ìņ¤ºª=°ÒÒ{Ðë¨=¸ñTÝï«MÍ­üp«<ïmT¥àÂÏš{›q¶ÁfÐEêÓÎmSyÊÇà^çdžäð"1¬dUL”Ž#€O±¿û[Ž³.Ë‘ªWCUÀº%ó±E-Êç¢ÿZwp pylC6:Ù,Mÿž›³g‰Cžê gtÆèî•«¬l¶nÚ`k¾0s(¡˜.Ó:Ýo1ÔÀô¦|Æy\wŒêdQûÉ' †è<¸vËtÇþ3†j»ÜZ)š²?Fß’Cth_¢2`Mî Í×+ã/.g:ýriöÊÃñ(z2},]°îš÷üîIÒ˜ÒžIGŽä  ÿV0öû Ôm¶¹|ÚBþoÿvsømJÚû4ü„ß‹Dp[ó PVÍŒ›cÃò¿òËþ?ƒü¨Jendstream +xÚ¥Y[oÛ¸~ϯð£¬YÞE>¦m¶'‹6ÍiR`Ý}P,9*K^Inýõgx“%™¶ÏÁA€ˆ¢Fäpæ›ofd²ÀðGJ Ì4_¤š#‰X¬¶WxñÏ>]/³ B˱Ôû§«w¿²t¡‘–T.žÖ£µÂJ‘ÅSþGróðp{ÿñî÷ë%8y®—ãäËÍý÷›ÏnîáZÓäæÓíãõ’hžr"ÌÈIœ|»ÿøaùáëý¯Ÿnï¯ÿzúíêöiPk¬:ÁÌèô÷ÕáE'øí +#¦•X¼Â FDkºØ^qÁàŒ…™êêñêߣ§öÕ˜)¸PHP.KA‘Â4n/Œ°€ó/SNÔú`/Jbö +RÆ^ËÍüœp<Î9YŒ;Ú2E¶d£-µFœŠÙ–mY÷sFæ.ݦi{?Üo·Yûænšµ»ö›ÂOìú²©ÃËuîí5QÉË~[ ÷9×Ì”kD)Má F‘¶ÎWËUS¯_ŠÚK•—àʨFGxðVO AŠyÁ5#©3® RÖ5?œRBŒ$€Ì+õ£x«³m1W0…Ò4Uçu¤"Êí@8C©ÐdªÝã®X•bL kq|$Rn`U³#çÇ‘Œ1½e{˜¬ûr•ÏV „€Í—ŒªäiSú=¶û®w£g¿Pæ.?³ªÌÝ0o¶YY4°Ž[,Ý™96AZjñp•ël_yÂnÖð|ì"I‘P\Œ¡cÔ<† O‘¢X^‚”æ•a?Àf,u6ƒ”…Íî"lv&Ú昡™óÕ+Eôš † +°œ)6A Ó f°j æM03-’Õ&«ë¢rO¬¦vôº)l”±¸ÆÁ0Ïx=x†q¤Y¤ª²ë‹Ú«²nÚ  +l¾ò$cÔYÛ]›md[€×1ç#LDv“ñaS@tÊ•ÅE%ÇaJø–s4Ú+¸ï4˜¨BÄíy0¤Î€)HY0µ0i$"×l×euÌB’„Vê¼vƒTD½ ¦ä…ÉT¿)¦7|À„Hºfoý¶*Ü´! suÚ:™<ë37ë¼HE DT¿8‡P³,°TÓ–ÿX’'JÊ’;¿¦œÂËη ÆgŒÓ½ê@*)0•åNI’ºéÝÔΡíg™n"‹P! +*íð./~¾óçŠ$1•88˜ӬZü½/2wÝþ°D¹*~17þÐV¿† 2¶¨yh)®nçºè:wj¢¤É"Û•eÀ2Ÿ—®=]—õnߣÈ)•©Ž(™À ôŒœQHÄxìÑLLÇùÈg œ6[õ…±Ž†µ†—lÝÕ,Xù9àˆRŒE‰MfƒñMRÕÀ´³p¶@3F„ª®Øe/¸ßwEîfÊp‘ånÚÙ6”=Ö?Ö&rê³<·GÍ*'þÜ;R®<‡’Áx ƘŠHåË:7I9@´ßd½ÛuæCxf}èÎO¡—©b3Ôoš}勵gŸrÍÙOšºœ%´±ÔiB¤,¡u±ìˆeƒ…²v­»lìJ~*ví[älì‚•)ÑóØ Ä“®èඃ浶å”®gûO‹YF¡^Äú¿C>@ß ìàËv© °•ùñASúòÀ½ÓÏUðbÐK²ª §òsî @˜Ïʽ¦®Þf9èP=šJoöð ã¯Y…ÿ4¶É|¢*ç­`ZáRñ‹/£ìq=ÖPŠA»‹¥4jBM‚Ýg›Ûßo¾<|¾}Œœ»W8q­Õ“ùNÚx•ªªyØ”CÞdš\HèÔ$¡Ê}s\º‘G*Œj/5ÇÞ©°…†±â˾µ=Ø/nÖS¶ƒ•mº”PÖ`jØr £éñ¿¥Ä8xÞRK0,¡A+MÓd†™»tÙvWE) Æ&¸6;ÇûÅ縶;Øo"Øt­¯Zv ”å®Ãœ'?l¿pÞ1MJÛT]Œ5µ) ¹ØlY †DŽš†/h$EÖézˆ@ÿÖèÜ{‹=ûÃ8gšÐ0we’(%¦´“³†¡hû€ 0x1/´×óq‚8i_m(.xâ"r†Ä•j}:‘pÃÓ8{¼½uûÜ|~üz9ØÌêb(¿à ȘbôÀv$mW¤Mû ¢DÀÔû»ûþ#’W*ßBÿÚõK§’oÅÚVõʇæ~ÇKÓRÊIÞ=¢iƒ €ÙÄ.7ߟþõõÛeƒÜÕЎׅ§ÄGûÕÄóßè5š¶/÷ÛS?ÑÀ†æw•HVŃŠÿ÷Ï7‡Ÿ© ÊfJÑx~f˜ A)s8ÂÄ\uÁ òV€µcÝÿ* +zendstream endobj -2041 0 obj << +2116 0 obj << /Type /Page -/Contents 2042 0 R -/Resources 2040 0 R +/Contents 2117 0 R +/Resources 2115 0 R /MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R +/Parent 2102 0 R >> endobj -2043 0 obj << -/D [2041 0 R /XYZ 56.6929 794.5015 null] +2118 0 obj << +/D [2116 0 R /XYZ 85.0394 794.5015 null] >> endobj -2044 0 obj << -/D [2041 0 R /XYZ 56.6929 752.0628 null] +2119 0 obj << +/D [2116 0 R /XYZ 85.0394 400.4859 null] >> endobj -2045 0 obj << -/D [2041 0 R /XYZ 56.6929 615.2568 null] +2120 0 obj << +/D [2116 0 R /XYZ 85.0394 274.6805 null] >> endobj -2046 0 obj << -/D [2041 0 R /XYZ 56.6929 551.6561 null] +2121 0 obj << +/D [2116 0 R /XYZ 85.0394 214.6285 null] >> endobj -682 0 obj << -/D [2041 0 R /XYZ 56.6929 500.3546 null] ->> endobj -2047 0 obj << -/D [2041 0 R /XYZ 56.6929 467.1661 null] ->> endobj -2048 0 obj << -/D [2041 0 R /XYZ 56.6929 431.4263 null] ->> endobj -2049 0 obj << -/D [2041 0 R /XYZ 56.6929 364.9038 null] ->> endobj -2050 0 obj << -/D [2041 0 R /XYZ 56.6929 292.3128 null] ->> endobj -2051 0 obj << -/D [2041 0 R /XYZ 56.6929 107.6861 null] ->> endobj -2040 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F48 940 0 R /F23 726 0 R /F14 729 0 R /F41 925 0 R /F53 1017 0 R /F55 1025 0 R >> +2115 0 obj << +/Font << /F37 799 0 R /F21 710 0 R /F23 734 0 R /F55 1035 0 R /F41 935 0 R /F48 950 0 R /F39 895 0 R >> /ProcSet [ /PDF /Text ] >> endobj -2054 0 obj << -/Length 2477 -/Filter /FlateDecode ->> -stream -xÚ­Y[oÛ:~ϯðÛ:@Äò.ò1mÓ³9hÓnã.8=Š-ÇBm)kÉÉæßïŒHên»§SÃ9œë7›Qøc3£VÎb+‰¢LÍ–» :{„¹ß.˜ç‰SÔåz»¸xóAÄ3K¬æz¶XwÖ2„Ãf‹Õóë/_nîÞßþç2âŠÎß’ËHQ:ÿt}÷íú££}¹´|~ýÛÍ=´@”&þï3YÔ( Ôr›@À»q­Yøuš…Añ„J+ÝC× 8·n™Ç -ägTÈa(â6äû¦ÂÕ›4 cŸª`ôà)˜ªŽÇ34eµ9Ï®ñ¸êx~:[@ŸŠ}5ŠfðIë¤\iB®^,s…G»OÑqj«¶ùMT¸ßÅ»/nÄfn‰€Š<8ÄÐjšHòt[:;.ñööî½Ùx¼ëéòªN…·çr“äyºm…»ò¯CÕ;f^ƒ÷p+N›·Ëuܼ WmÞ·´8)$Γ[¦‰-{:¦“íoy“'ÁË!2Š‘Ûâñ1Ë+ArkvÆÇ»\'”¸j%¼Nû¸hsžG=g -sÌ{rk @àËdû5+Ž1 ÕýCd«q Zb4ã§×pMh®_Q%+Wý]¿ÕÆÓ>eã Áa½hS´IÕqmr -x‘ õë´Ù¬8¡Í^ˆ:‰)œuB#O”Õo¯]Xï -§v ºÔN&ó'‚Ùø¸j4‘Ð>È_§šfÅ3ªÚÚ2]5»Öm<øCp‹¼xñºÀú͵%I/YµiÕXu„ȱÙ{ø¦tHL©y²},öðÚÎ?ºj †,2«üsµ‡¤âÆ®æKDqÀ±r°@Õ°¨ rµšïß%~Ççd›­šr­|¥ËeŠµ9ÜÁ"¤,šºšQ„iÎ蘅ü  ÂP­ÿ¶±›£î’cc+¨ušÇªÝù¨±¤¯Dß3Nú(€§§t™¡Ç§«« ¸¤0Ëq}. èi¸äЮËîkPH±b?\cY›I‰û©ûKȇc4?þ:x o5•ö>byïðÒïCZ».¨ìÊyllPè u ƒtý ­Ý¢~n1¿êc~éÛ5òF3áüÔb$ž„ù -%Ñ(iYhºùÈuÛðb€­ïý­j¹[drí[%ȤçwEÝ#S$¢Æ/GíD„Ùâ:†*Éê a¦Ü$î¼+7ÛƱgMÌyNG÷-< -Qø¥4DÆN3¿š:ÌM‚Iߪà%;£ó[òÊMqØ®šÁ‰·.1q‰Âón’gOzLótŸøoƒ.}Çò)Îs'eÊ’øì(h8Œ!œq‡¬>ÔoÉp#!ë«‹§mZ¯ ñ~¢räÚô@è¨Ø¬­µ “¯S­Sx¡ùºÅ«°w:Íg YG¸^í²<ƒ|Tá _ÓµWf¾ô¯}JòèÌiA(ØipT·¿ßÈ'Îé²æòå§Ú5¬OÅÁÐyßãaà'î”Ø]†™Mº}r#_KH#Q#ô“4¤pj°4*•+´o?Ý.ê[ü·¸ý|w?qðhh„âìçÏão‘ºnùš_vnàϺЦMîH·1´Cf²SÖØÝO‹Ê,~ þs¨²mV½^2ÆæÁù!ÓZÃXßû!îðbѺ, -¿ËÃÞ{Pµ}u¤:ÃïKâ •'¸Œ[ñÒ«fБHaü@<¿bÔ]²®ú=Ù -Bo-ÚOA<ÞôËmDÀ¡¥ƒXܶ§ v`ð Ë Ôxjƒ¥ïëŸÛ¤˜:Û…ö!TOlrn¸#YnSo§ýe,瓱FûAvsãÞ½þxÿyâÔáUìøNUðùö'"œ€¬Žs¦3W#ÝIâäR°R‡¹IØ®?I˜†éÜ@ø“ )†‰Hm"}´sh­»mF K*ŠL¶¯Ìëo‹~þz^‹·y•îóqî_KÀ?Þªï‚@úÉ»v_lu0žd$|HÃ/ >ÞL— XŒŒ»wšÝïS½£ÀA-¡:v¨÷ëý8ñœìä²=, AeL膾s·NÒ\ ½œ,~žï¾æÅS™•Ãt¢!'Ž—ßDJ5ùá -’¬…VÆg¾4+ŒsGûÀ1´2õµK¶˜¼U¢Íÿö—èöS¼Œ‰0ä׿ö§àÊ‘ -À¸õdÂe@ŸcÙÿ9Īendstream +1592 0 obj +[702 0 R /Fit] endobj -2053 0 obj << -/Type /Page -/Contents 2054 0 R -/Resources 2052 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R ->> endobj -2055 0 obj << -/D [2053 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2056 0 obj << -/D [2053 0 R /XYZ 85.0394 409.4177 null] ->> endobj -2057 0 obj << -/D [2053 0 R /XYZ 85.0394 311.5951 null] ->> endobj -2058 0 obj << -/D [2053 0 R /XYZ 85.0394 250.1972 null] ->> endobj -686 0 obj << -/D [2053 0 R /XYZ 85.0394 212.3815 null] ->> endobj -2059 0 obj << -/D [2053 0 R /XYZ 85.0394 179.9082 null] ->> endobj -2060 0 obj << -/D [2053 0 R /XYZ 85.0394 144.7976 null] ->> endobj -2061 0 obj << -/D [2053 0 R /XYZ 85.0394 80.4778 null] ->> endobj -2052 0 obj << -/Font << /F37 791 0 R /F53 1017 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F41 925 0 R /F39 885 0 R /F48 940 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2064 0 obj << -/Length 2904 -/Filter /FlateDecode ->> -stream -xÚ¥]oÜFîÝ¿b{¨Üf'ó¡’''qz.š4׸@^ä]Ùª•Ü•Ö®q¸ÿ~䣕vå8ÅÁqF$‡ßäZ-$ü©…uÂå:_dy*¬Tv±ÚœÈÅ ì}¢øÌ2ZŽO½¹› g´ ·}wþùíÏŸ./~úH¢IÕH4r¹Oéð¶Y¯Äªm®é¨ËÛfBç2 -±êN—ƪ¤¿-q!øêßRê›Ý¶è«¶¡]„Ô|àºÝ2Ö1J§Âé-20C[K‘f†Ï¼|™ÛS~sññ‘Ë Ð›’]¹½/·ƒýöTù¤­is×WuÕ?ž*¥0§tryK÷’#ÎUr[0°@Ö@bR ™§v±„luÕ¦ª $¦mÒ)ŸìVý., Z4kÞ~lúâ/Z÷íŒ^T*…O]ÊWÆ­ŸTL.²Ìz>Šællò¹/úrS6}ǤÇ|”ͪn»20“&UCЫm±*»Nûr»©ÀÅïU¥ …ÓZG)·àA9 -~S-WmÝ6ÀOjÒäm]ì:Ä®Áµ"ž -*D@7â7nÃKݵ|lÀÊßÌ1•Ëˆp×튚­Ú bf¾úÇ:r‰àmä.wwwíð¾v½p)ÊvßR”¸^X”L^~K°o_N?Èèƒï¾›ùä%Áú–ž%Ší5=ëª)ç°ýÒT£ûÇWb;ã«}18¡'D?Ñ©O6»Õ-®r´ÿ» ÁýmÑÌPË­0~Àñ÷¬ÚÈœõ Ä¢{"-¶+€ö·¤RÞØ[Õ+ú¼hè\{‡!ª;8õ‚6£“ƒ=¤Æ©Ãà€BÒç鵈/èñGùxpNÌi¯4ãÿp{㢠"¿ÇRJS‘K­ø܈##³ñŠ -ï‰o(²û’wÈÑk¼zŠ— -ieÜëòºØÕý’%pÌŠw"KmÌÇD¨UÌÁu[×íCˆ$ðvõHOŠã°a;ÈÞ(+ÒTªihiCl…x°^“š»Žhâaƒþ5F¡S•v³4Fmbˆ‡ÝÛ¶ëiõPÕ5­®øËGGØ»-ÆÛâSNðszuÄzSÝÇ -ñ=°}³c $Æ~}è’#“ûš”ˆwKíŠÔ™ð™özDó<Æêr!µu‡JÔžï—•РD³…“³V¹*s‘Éù‹h%´Ló±c,ɸR ¾e±K™üséœK.qçQßÇÄ!Bgö´«õ uUÍí¸VryrGåÇ}V¹7`(•\” ú Ì\”ˆŒñ+ŸÜsr†³jÕ®´Ùsâq25‡zœÄ¬=ï"™P 8Ò$¼nŠ~uË zjÕÜÌ(êõ ‘§ÂˆÚÕú£ˆWO•)þ¼ŠvL/d\^FOöìÉ~ðdO©!Åd ö¶Ô!ÙÑèÐ.¾a:¬~#ÑÃIŠ@,(ÏSÅ„lŠ±Yö„k:……zzàšXzÌH&K1#ù¦t`í$À:°6X—¼aÕƒ¶´„$Ñ”«oé“`”2ÖØ ënÚžQ±›ÃŠEl†2N¤ÒO…|J>áSЀ-ÆõÄí¡ÝË¡±™dDÂÓËà^ä[°O )†} @{ß’{ßÒ:`Opj€‹!ì~«{EùQ&ÜE:óXÐNp®yÿÁŒˆ÷‘K=ëIºÅ9O‚~—=)“#OÂE6’ ®«àJðdWÊØ•2ÉÆÆb'žÈ@`ç9tR‡¥D»Û®Ê%æsÌåÇ7PÆBÓ¬¢ nfÄUšp˜&7OdyïæèX-”³Ópˆå!X5§+¨|“U¨†A !¡ìHWö •*,.>ݧ´G"o©?\ñáQiSvìN‘·iQ@§îÀs¡Þ¨c;Ó¬œ]÷û¢|N9©¯çⲇ>ݧû¬òÐ&Ö/bí«îX"kkz­ ïÜ­K.¼ îú-Ú{Ea§~h0¼X®QØ %¡!,FM¾Þµ]W]Õü›Î«9'À,‘%É|^†Ü›¡V{1W€ï•}&epu¥¿è6P?JH'ñ ¹G9ç…Öˆ,÷zTjê,ŠIǺNËw¯…•‡­Óf‡å¶v†b-I».e (4¬ð,èAm”›è?3„=Ã-¡ IÍe„R<ÃU³Û\»D\à8TovXâyvi€ 2œk™ÀÅõtnÀÓ¹¦W!Ý08û¢¤è$?ÌðZSU†OLÔUˆ:TuÇÓÈ@ÀquŇ8^!¾¦ëË‚_‚Äc¨D†5*&tß&9/‚Ú¦ÔHåÐ7¨T8ÅK ¢,þ(iE‹ù²¤ð0¥Ê=Q¡Và³sÂtPüëXÝ>›B¼¹DGS”X öýUùBáíдÌðX9!4ÊÔdI'ä$&ƒô¬ꤠ)Síx LöšG -¤)4CÊ.ãñgüdœ]ðÈXù7òÈ™]B/•ê/÷ZH™ûãE*Ñ4o„×a¶e¾ f‚j ¯C‚@% ,abÊA(\¡*Á°…,ñ€7óžâ!š°¢;.ú‡6¶‰"séADZɱ °Øò&šeQß´[¸Íf~Ž®”æhûÖó‹áPdŒÆ)íö1Ö¹°±G^Ÿ˜§gP2ù¡zjx!}(Ts&”3¯±®K“ÕnK–Ñôõ#m¶ ­tòÏgo—ÞYž“åª/£§’¢ìíöƒÔa€G;Ùpbß³ {„ôÚ•+â£'ða=Ô -ãAnpÅÈŠ®\º”  ÍvÍ…FF.;>;÷›n.°u‡{lV8|½Œþ¸'\ÙÀºêâ\6ŽÞ”Ñ­Û](!pý纬î©Yá0ÆÇ–aÿ’Ã:j|²ä¡xì¸j rS6å–ßqc4ðÐÈ7®¯ÃÔm?¦ó#„ñ¡æRvø‡8œ€;²›m±™1UÄø‘©NG4±ÅÀþ|§#åðS ¥(¯X·LS’>÷Rº'àBh»¡uÔï z¥j3ÛWÐSŸË½Ðrè -ñç°µrÎ÷µÐ^Æ"z$¦Ã?u MûÐ0{ÝMéEjÒˆjS}¨Ê D_°ˆ­ -¹©™“èW Cˇ*‡ò±è2šuãñÁìݨ ‡ýkºâ†vâ¥ÂLén׋™‹ig…ö—e™Â:ö”-•r8ë‰vw[݈ ®ÈDq7gÎw}œ9{!s=Ç0uÞU] >ÃÀ¦hâÿ -ªMÇñàsY$êó_Ï>|úñœcº8‚‡h? ÐzOÄŸnºƒÃ%Ôb{ñ~†•Eê-ý¢éÎd,è$öG{Ž<üÒ°tR&ÿ ’‰¸ç»k®•†óu»*jlÓ^Ï…ÐñࢃŒ†÷×ÜêÎQúï€ 2²å[E²nLõY¦åÌ?OY}eÓýøý9Ò:å"á¹-µàÿÌü#€Pÿßÿv°ÿ‡Œ4Æ{½ÿ‚iiqÚí"Sx%G¬ÇP8æý§vÝ7endstream +1447 0 obj +[702 0 R /Fit] endobj -2063 0 obj << -/Type /Page -/Contents 2064 0 R -/Resources 2062 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R ->> endobj -2065 0 obj << -/D [2063 0 R /XYZ 56.6929 794.5015 null] ->> endobj -2066 0 obj << -/D [2063 0 R /XYZ 56.6929 752.0756 null] ->> endobj -2067 0 obj << -/D [2063 0 R /XYZ 56.6929 252.6303 null] ->> endobj -2062 0 obj << -/Font << /F37 791 0 R /F53 1017 0 R /F21 702 0 R /F41 925 0 R /F23 726 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2070 0 obj << -/Length 1788 -/Filter /FlateDecode ->> -stream -xÚ¥XKsÓH¾ûW¸rY¹ š‡4ÒRLp‚8ŠâqP¤q¢E–‚%c»ÿ}{¦G²ìˆM(ÊÍô´zúùuËtèÁCŸx<C â{Ô&Ë7¼„³ãµWø<$~Èd/íø‚rFÂÀ£CéG$àŒgÄiºRU¥ª‘€~à#/“8¿*«·×åÊ®|îóG¸ü÷‘6èRJ"ßgÛ…k½¡+hÇCý¬nðÝ*^^çªÝþ0̽‚âü²\eõÕr’€õj'î2õ[ù]æJ%+…šzÎApt²ø[ðÓê»Èo.˜8*–O¾Gù‚æùóÓ?óïý6ÐûØP«ªþE ‚ûÀ„6àŒ?›†¯‚'/6Ñûͻ͌¿}ÿbýúñã{hýð⻽Ë}ˆ½ïÃÂ#ƒLÒ¬ÓÂÜäÔW -z+Œm@Ίí%;IFm’¡j€khk¤t’²Ð.׫¸ÎJýº MÉ2l q…šÃ1hn‹v…ÎׇÈ#:ªÖÞ4_Y4U³Ôq­–ª¨‘ži–¥j®1aÇ{¬‡z -fm‹‰° wè<;º'O}ÜÅùˆ:mŠÑYm_Ý*‹û$1Pz]uœ†Sn/¹ˆ+å7ªHÊ4+.qW.~¦ÐO -¾½:ˆÊËÊv&ðLËõ…‰¬¿¬Kpi……$…M=Õ’úB·X¡¨ãj‹83(fâvË„‚Ûw³ -ß\£zÜäWÑs£/ˆün|RîáH*©í%·h@“|·Þ€[”>Ð-ªÑƒÂ›zšÚÂ7V8"Aà®»­õ*vȹJtþ¥*”ˆ EŒdT¹Äõ~Ð(¨Ÿ(ò E±eW<,nŠ46ÁI›öÉ ƒ˜ïVd¹®¯×µ(b> ”J] ÷8„RȨ©‹Qû™îÁÚrÐèÓ#'"Ü— ÆœU™W}~…T½-c ¡fÛ¢\õÙ±)5 ÖéÏÂ0‚ aEo5ÉŽ]V׫L»Ä g! Ç’îBÑE³Ð_©šæ°PZõthxU""!eáÿU "ô°¼S*¹*qN;ø\”›Âοy¬Mþf‡`íf³ˆí4k¦¶Üüƒ=åh;bÝq¨PJsçl|2A»Ï'g#èÊoáaöú3czüæl¬½9ŸžÎú‹˜Äc‘u¼Éwئ̩ߢ§¦â¡WötÛúMR<5åÏ8IÔuœØ<4Õ‚4L -•e+RäiÞCaIyYdß­BX‰Àc XSªk•dúòæÖ¬èë‘vŒÙ/™€D<ˆîƒEÀIå-,â,j:§¼QcõiõuJgRÑÛ¬èU*ÓïSdðù¯ÑFD‘s®ÔžUÇÃÜ´½æ¸‡(‘\ȻĞO$ƒÍîÒÆ:ƒ¶Mý•<=ÅU„qºÌŠ¬ª¡°u5hÒ™Z(Œ{‘Ø×Nâbç[pÂiFÁD•ãsGiœOleŒ_žŸÞü: ôgA¨?ØîÜéûgM‘šO ¤›;xÔõ­Ô½Œ5 ø{ž¸m B¹A›=^q¹€ï7£w½3~3vzv·[¦€]«¢×ó› -Bm;Æ!$LNÙz¹½WÀ4Ñ€O_)àãȘ@?r©þ¸ÞŸ,Là ±„°˜¦Ñ§_1Èþ@²Ûó‰Ñç#|õlã†+Ù¶?Ptv–eþ³¿`@=Éõüaⵞýí¿g¶C Ix²öŸ—«¹.åm”Ò¦SN÷Uoÿȹ­û`&ã±endstream +1198 0 obj +[702 0 R /Fit] endobj -2069 0 obj << -/Type /Page -/Contents 2070 0 R -/Resources 2068 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R ->> endobj -2071 0 obj << -/D [2069 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2072 0 obj << -/D [2069 0 R /XYZ 85.0394 343.1761 null] ->> endobj -2073 0 obj << -/D [2069 0 R /XYZ 85.0394 255.6488 null] ->> endobj -2074 0 obj << -/D [2069 0 R /XYZ 85.0394 192.0319 null] ->> endobj -690 0 obj << -/D [2069 0 R /XYZ 85.0394 152.6743 null] ->> endobj -2075 0 obj << -/D [2069 0 R /XYZ 85.0394 115.923 null] ->> endobj -2076 0 obj << -/D [2069 0 R /XYZ 85.0394 83.7361 null] ->> endobj -2068 0 obj << -/Font << /F37 791 0 R /F41 925 0 R /F23 726 0 R /F21 702 0 R /F48 940 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2079 0 obj << -/Length 3192 -/Filter /FlateDecode ->> -stream -xÚ¥ZYoãF~÷¯Ð£ D=}اIf8Øxf3°@6´HÛÄH¢"Rvœ_¿Õ'5%?°Ý,U«¾:I²ÀðGB"i¨Y(ÑÀD,ÖÛ+¼x„{?]‘@³ŠD«!Õ÷wWï~dja‘T.î¼4ÂZ“Å]ùûò{Dºxùëí‡V?|ºýñ§·×+b¸âË÷Ÿ?¼ýpóßëˆãå/ïo{ÿo¿÷ùÚÐåûŸ>~¹þãîç«wI¬¡è3+ÓŸW¿ÿ%<ÁÏW1£ÅâþÁˆCÛ+.œ±¸³¹úrõŸÄpp×ý4« -‚e’ftAÉ‚d„ #eƒ$£Ì)ãËë®Ù·u;}FÒ’-c+ªsGP4 ÜŒ\H"A¬ ''9E*+ÕaW®Wëf÷ðXí®Wôÿûªø#®î­°ï~„“{6X8Û2øZ½¶õß•'Ç Òœ‘@—x®3<™@Z -ѳ|¨7ßÀò)­¾f˜K”`¼g¾+¶ßÀ|QÞ}sè2ü(CÆbsÂïá·bàG9@+ÁȧؕÍvF€-¥„ž²o/Š[”å¡jÛ·k »Èrýthš®¬99ÁCE‚Kbz¼ÈôØV9~”#:`çÆî·b„‚3kXh¤ŒðÁèÃÇ/?üzóùîæÓmúQÏ/VT"!Œ8u O=‚CÓ) ©EWµ´´YÂÏþ‡1}<Â^Ýìü¦ÝÙDŠ‡æp††È„“™£)F\EPAÈäT-oºprN»¯üTXúUŽ.’ŒÏÕ®®vá—Ŧ«;÷9ü²küõåPw++è‡*Ä4—cŒÖ»G 4rÙ=åP -±Æ¸°šž Yµf “â4âÙëËs/° áŽp;ëæp¸&zYµûfWZ2êMQa"RàÔîÐlÚÌÉÌ .U„½=-ÃÍ MíƒH†ЀV"Ÿ¶HlAí—¹ÞeÔ#Á㌎lm`*çô#)R4…“ûWÏõ ÄEÞ>œpÈ]ÜŒíó¾·ìæõš²ü~ÉAkzÎh¸ð Ãµ^ÃÞKÝ=ùÝdÞ±Z„FDs¤Z9µ`¤˜ˆ‚7ûàÀÝ x·Uç7Ž{¿QdT¥42˜!’òfÖîŠNì=,ÿç¦.ƒ Oá±wU¶¬{ΊA¨@B©‘Aÿð!zñ¨q—³&ŽÉTF(y¼Œv‘Q7D ê~¤1at -ÅÀyÓ5<øáª0” ¡kÄ0 1Ôƒé“ Ÿ§ÕX(@‡¸«•<_¥ ©bñtZ¥$ªWÃ#%GÆ}þÈH”9räY°TöFG~p‚ϱk¶à>ëŒ9À%µ‚€x>`3ÄhŠk“ä`8ı»§ºõÇ­}\‹ÙDú€-#D2xä‚doò ©pÌ®ÙpÉ™ßUÝ:\%qï^;w_ž@ìçlÒ†bE3cqûÚZ·Hõ×BRC€õØ^l#Ú}µ®­:¬»ÚxãåÉ–°võýÍ퇰oÞëMÂÿo¢º6dY‚ ÷ÀÓ†Wwm þž -¨)%%,O')ðÍäxV¬Í0äÜ™"Ó«¯ n}èŽ{d3 åàauI¥vM–`>p³X3Á¶Æn6ÍK>Ë35#7â¢%6Ñ\.íÉŽ;{dtÙŒQ%Æ:q90ƒÈÇœóK–cˆCM=°œÀ>éÀbÓ¬‹_>5mˆÏ!éÂj×øëÃñàµûç$„8Ù!nB”Q :„~ƽè¿w»¼Þ ÔÇ‚šÚú.²g>“+(P™Š`rVi=¹÷8*äÒø<Ú5Ùøó3¬‡Æ†®:þ¡¤µG„³KçºÍ~UÙ½+ï7Å:Õ_ðCŸÕ²ª¥Ž…-GXˉ+ÌÖL¤ú;ÿ £býnΨÖçXD4dTÕmç‹k; 2c/ó4l+J%½^*#!ˆ‘/Q¥¬àB~lqó`ÏõƒÄËmãµë7«MqßØÖÇÿ{ÚùÀ&„Ú~Õy.±c*ýûלqhpͨuBÔÌCT«—UÔËüç±ö‹ÒÚDÒ xŽ¿Ší~£P@±?Î?5èQíAëV–¹½ZÓÙ«E¨½B!š•Ü¸mºAõ͸^¾6GOÐ>5ÇM"v•wFvòÔ§’ËÝ©0©¸´Àk ÀzY³U² E# Î;/[¢Ê7¶2T’„ª±t_R¹eáΩPvá$r«æar ú(›Û=—Íí¢÷u×Ú™/TŽ¿mîs›U¼v/U(IàêÀ A¨]0Çâ_°Ô Ù€1:›@¬¯HÀÜu0;¡zÖÚ¶Ð`vÖÚCªyk'*gíuÎÚv°L2óÏ‘µ¡%Sª“³²%ªŒpck3[ÿM¤û-d×a¾ÊÇ è­˜Jv¶ñש4Kÿ Û¹Zþá5v¾©=u‹A‰Ôÿ2ÎÆ@C“õ†ˆ+¨†±JÓ³9ãS “üB;¤:cüHåÔôtÒÇJ„ºpd$Ê9Ê}PÓ)=9òó¡%v9ÜjýɬýòÅù! y˜Ô Þdít0á‚åã1ÕVΞùN)UoLZJoÆ.™† =7xõYÓ ©æM“¨œi¾¾% -ÇWÙ(|V¶> -Ÿ -—Â#éFQØV³ÁF24I°p¢¹•·ã€Æ×,v5 Ì‘ƒ­LOÜa7¶Gß‘ÈT|þò\lÜø –e³-ê]/:„ï"®¦Ñ8Ó¶ÚILj®tþ‘GSÁ ƒÆÌl»¹Ö>ûl(#Œ"0:ˆTóÁ,Q¹hÖ^ìrŸ!d»œ³²õ]ΩpÙ.g$ݸš¢”,o>û +œÁ(ÎeD¹s¢.‚‰Örš-w?ˆ‚óûa9Ńa9Åã\é~3Ÿ+)–ˆöm¹2¼Ã„$1}Å?[·MgÙÍþ¾X ]ÂHƒ®ÛVÙE£6ì<DóXŒDŠ]6±šZ£¯WÆ•=$`"ÍYÉÑ©h#$RŽ„}Õ?”-´ÛÆÄvÛ˜¹v[ Í´¸0¥£Jòi»mÂÇpíÛmãºFf_Í!Ü9‹uaß,srëF¥Ï%^êÍƳNßÀÔîܸ©ÛŠCˆneøæ­ïô-UYÛgó™gì_‡É’Í|Š¢!djEßô¢”³ä¨Ax`ëÓ sßÄ\C¨vƒhøß+k¿ž±4Qç%6ÉOÔ 7ÛDäC>óŸdØê ðŸœúÐ]`°[¯}OÞ”&‡*87õUöæŨU I5(šû“A×ʲ‚Ówÿø#ÍþcTn?EÒ3-4Ud¦2 -e‡øvÂ眧²ÿ¯îŒ—endstream -endobj -2078 0 obj << -/Type /Page -/Contents 2079 0 R -/Resources 2077 0 R -/MediaBox [0 0 595.2756 841.8898] -/Parent 2039 0 R ->> endobj -2080 0 obj << -/D [2078 0 R /XYZ 56.6929 794.5015 null] ->> endobj -2081 0 obj << -/D [2078 0 R /XYZ 56.6929 748.9271 null] ->> endobj -2082 0 obj << -/D [2078 0 R /XYZ 56.6929 674.5821 null] ->> endobj -2083 0 obj << -/D [2078 0 R /XYZ 56.6929 573.362 null] ->> endobj -2077 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F41 925 0 R /F53 1017 0 R /F23 726 0 R /F55 1025 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2086 0 obj << -/Length 965 -/Filter /FlateDecode ->> -stream -xÚ¥VMoÛ8½ûWè(+–ß"NâdS$N6v€mª-;ÂÊ”×’äßïP$]Ùa›CÀJ3o†oF$ †?’(0Ó<É5G‘,·#œlàÝ͈xL@Ùu±}ºfy¢‘–T&‹õÀ—BX)’,V_ÓÉããtvuûeœQÓ 4ÎÆéýdö<¹sÏÇš¦“›é|œÍs Â,Nâôivu™]>Ì®o¦³ñ÷ÅçÑtq¤5¤N0³œþ}ýŽ“dðy„ÓJ$¯°ÀˆhM“íˆ †g,<©GóÑ?G‡ƒ·ýÖX)¸PHP.“LP¤0× #, ÿ,çI­Ö‹’X½ÊÖ+;Ø{ì¶pÂ{äÂvzã)Õuó©)‡Ödš Î.â—R0aö8Pç]þðÙœRÁòJËx̶0‡¢ö©6ÆVqs€ƒýýåžîÇ*=/+5šIs†*8šiFó#à <­A1ãLÂl‹ -‡]ê¤ Ët·¯LçÌÂýk‹í®Ž)[Ä؉®m䘰%4ú¹®ûfåŒe³w¢hwYUf9 ˜ªHæÄêöMÝFâ1PmN¹Ú o`)<&Þ€‘"~Ú:p[+S˹óûá“q‡i[î*“ù¢ne:ì!š]쉔—kÄqnŠ-´Á¯ê«íˆ 'ñ¡rÖˆäZÿF:‘vç}6ŸN]œÉÝüáãf³Þ¿aüÀ0Hƾƒ}²tï”68NQ"hêâvvå¶jOjµ­LÕvÐK%Oåºt3Kßš÷®ý"/¢R†Y? >¾¾§u™> endobj -2087 0 obj << -/D [2085 0 R /XYZ 85.0394 794.5015 null] ->> endobj -2088 0 obj << -/D [2085 0 R /XYZ 85.0394 687.41 null] ->> endobj -2089 0 obj << -/D [2085 0 R /XYZ 85.0394 561.6045 null] ->> endobj -2090 0 obj << -/D [2085 0 R /XYZ 85.0394 501.5525 null] ->> endobj -2084 0 obj << -/Font << /F37 791 0 R /F21 702 0 R /F55 1025 0 R /F23 726 0 R /F41 925 0 R /F48 940 0 R /F39 885 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1187 0 obj -[694 0 R /Fit] -endobj -2092 0 obj << +2122 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj -1598 0 obj << +1627 0 obj << /Length1 1628 /Length2 8040 /Length3 532 @@ -9354,7 +9515,7 @@ endobj stream xÚíte\Ôí¶6Ò ˆtÃÐÝÝÝÝ¡Ä0 00Ì ÝÝÝÝ’‚R"‚´t ÒÈ‹>ïÞûüž³?³?½¿w¾Ìÿ^×Z׺î7¶‡Œ5Ü ¬‡¹rðpr‹ t´P(ÐWç…C­fL9g0ЇÉ]Á¢#°5@ ðòxDDD0rp'/gˆ­+€ù‘ƒ…ý_–ß.+¯ ‘.[€ññà …;9‚a®ÿã@=0àjØ@ `€œ–¶‰Š¦€YIÓ †P€¶›¨C@`˜ ˜`w@ÿ:@p˜5ä÷Õ\8¹d\@€‹y {‚ÀN¿!v€ØÙââòø €¸l0×ǸÂêfý[À£ÝþG“3üÑÃñ{$Ó†»¸º€œ!N®€Ç¬ÚòŠétµºþÎíy„p›GOk8Èí÷•þ`4¨+s¸‚=]粬!.NP ×cîG2'gÈn.˜í¿°œÁ¶@gk(ØÅå‘æ‘ûwuþuOÀ¹=ÐÉ êõ'þÇëŸ ®.`¨ '&ïcNëcn[ “ë÷¨¨Àlàî¿ìÖnNÿÀÜÁÎ -Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.SEM#¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 +Äü{fXE­á0¨ÀlƒÉ¥ w}L `þŸu™ó?×äÿ@‹ÿ# þ´÷×Ü¿÷è¿,ñÿvŸÿN­è…jÁ‚ÿxcê€ßÌs:B ^ÿÎýïžFà¿4þ;Wàc!d`¶Íàáäæù €¸(B<ÁÖÚWÀ}¬Ô»Ìì …ÀÀýSL7÷ß0};Èö»ôA`˜õßå?6éx.SU}9=¶ÿöªrèA§Ë‚GPè¯íÇ9pÕ÷rþo:# ¸õ?¿ùdeáž^7Ïãú=*áðû7¹ÿñüë¬tu†x^psr?Fr~ÿsÿÎýOÀìo4 0Üú÷äè¹aÖÃöOÃoäæìüØã?ûÿxýœÿŒ=ì a.ÌÁAb¡ö™9Y® Ä£ò/z{xÂœ*Þè—ÖÁ»2#×Dj,ïêÃ8›ÇEµyÍî;Ýoª²n öA™ºÓÁß‹(üèX>ã.3v±ms™W`gÅúϨ¯"› rn­êèš—ß¡RŽwð9£_²Ò¹Ð_8=óe4%v>oFÀk(Ù?`LÙ½¼`êú4ð±ûåÃ&9[~ƒ˜;26cLà«|r)Sƒj…×Íl(ßÛ b¬Å7ÎßÊçÏVð™h9Žù,¢I‚°RÊ• e®äß·RÆ%=²ìÙ êt›œ(†Ì%³LÇî)®Ž>1Ù¥‘„µ…^Ñ2¼éˆO£Ý %õ‰>•pjÕr{2–ÂwÍ<–g¬™-j—!3cäáakIè,AŒ$ÁLˆÇÆ‹J¯³nöùU»Ïm›Þ‰D3 @@ -9377,146 +9538,144 @@ $O t‡Í=žÝbóÆÃwî6ß"£“˵?”JËOP2RÐ oQo+†â1)©w†¦ÜèådîI½ÈZ¿VÍ­(e÷åû È"QÔüFØs(úF$'‘qL ®/¶!õÔ ¤HvkÖ‰Œh¼È‰¬ê؉á¶o?Ùa:Šÿ±qêcŒ° gã!_QÇ~ÏWê¡1üaœ¯UÝGmã§Yñmn%ìRãr9÷¬ß0qˆ5†/‚E…(êÚ“†,W‚˜$Ù½ï¶åçLxËÎÔ|ú奕£w†Z|ÂV€ãž÷,éOd ÞyŠGÝ ŽÎ¨Ý3lÍ4©¿Î\×T2Zª½Ag—.7Ù#ÏPæï™v¼eŦQLÞ»±Oþ¼Ô\’ ¬ÿĵJÅñ¾(š3Ç].Å*,MÎ>ÛBx(ÃSÃó|D³uû‚Þ¡ï†{:Ò‘Á¨2G9¡Cê{É•<|?ÒK áéá@F)Ø,êw÷ó?È ¸¢Ëa„Çh%Ù±o^Œñ{‹6™Ý @¥-«ä%Å~jÉwXjz1îi´·î¬%uÕ3^¿±g¸`d+ÎK[ŽDe—„]âò†YèÖýÇ?Ï>£³HjË,èkѸÍhÔ8Š” ™v_Å [ªJÖ®²9m=·âú?\‹k>¼à¬‡¤*³Ñ³ž,Y ê<‹ý¹uÓ Z/ZV$S·é#ƒmNOš¨5M@¿§rãÝ0Hõ7¬&7[àçŽAØñêOõƧÈêÚ5±pE6~d»Ž^.x¨T1¬µ¤$£Í7¿ÿ4òÆêüj§‹G1¬èípoóÌ3³QýÐZ:œNÍÆéç,0½‹Š‡Zg‹ðâ£à)‹Q©¯³‹X""œÛÆ0ÏÁ¾äBvFA‚)Y9(ÎYÖý…ì¬S…|¸Ôü¾“qbæÇN.LÔX§…_ï‚¿œ%%½¥åŒìé|°D>W²7}C–Í#—ZR¸­$º`bÛGο…a¿9gÝS%\”Á/œîñhC|?s§ Ø…šg¯ÎÙÈ)ª¬m}ÐvÖËk†Ÿ.bÉ&O üõí+uqfº`Îa‡„°£â,I§ã¯½/‘˜÷ÇÝ›Á¤'P6ߢH‚Ú?÷›½šÙ¹˜Žà9¦ŠmHr7:pMRYŸ#£ 'æW¥¿ðKCß|-¡mWÝ躖nᲶË0–«ÞÐ3äÛÙ=j’¸Ë-,n–³e±€¢üb½iÙ;‘˜Hâ°l<)žL.ßÐYÖÿ°Ú·)wL=(‚Œ£± L|)=å'ÀÆ-Å@²öò¾µ<ÃNrä³6îµEôʃ3±d¶kÓ»¬ÿ‹%ôµøü·(kD~ô(¬_yñ‡Í; ¯åä²fùOî{&*‰äyÒ¯9ÛB±T¨d>è.òY[a-³ZyÏ•px9ÝØÜ>穾„»*|,4°ç Žð=Ï añŽ©{ZwLVqžCÅo, H;ç_7Gg[åGx d½DŽ…*~ÂJSÛ/ *ûÎÔF‹µëújQ‹jw Ý]_-Òq;Œ,1t³õ2ߥÆíËòê{:Ö§Ùo$<×ð¬žôôJ©Àëóüλì„b›F=ÍçåcT”u;ÐuË›÷#³»Z1q“ÒYÖgHŠ^fiyv|‰¢,PkŠA±¢FH£s^…EËRôƇnQWEÛt%Ú·y3™{æÈŒõFbKã<%Æ)â"-L+{墒zS'“#é²ÊòZÃ+•÷U­Á׎#Ç©ÃCcæHŸ,êä;÷=íÏô .óYäg:¯jÔn¹¶Æô×êS:c¤¬UºW¹Þ/Ëf¹ŠšcO¥ÛøŒM¯lD‰Á¦9²ú:­ÈùÈßÛ˜ìÑËr6½õx§ç±2ú]úS¹‘ p7O¼,j1îöÐËÚ{ž$ªS7O–xYŽróæs÷â»ì(è˜Ýš‹ÏD‚@§­Y#žC²L%¯íáž›1A•Ã¸©3¾~M+ÖAîDí>¤¶¯cãµã-Nˆ¥”ûÚÔß ÄÖtzâ"¹tãØ'>(˜“”hSðÕœM]ˆÎÛ…0ìŽ ñâSPÓKD³—dOj nÌó®|KHtÞ‘Ñ+㢟S'÷@6„iõ“¨C,÷ág3B½žpÖáΡÄêφÖÑn‰Ü;ɦc“ _7T,Q1çTiHøBÕWL8­¡¾  ,œ²£.±ß u2†)¶=–Oš ¹ÿêÚ´­Ùê², Aq¨¿râ^T!1í¢ëç2)áN\§‹¬‚)æÄËR…Ëbž÷ž6Cb5ü´çêÞ›Ô;ð¶¹mH“üÅL¸^Ȭü¤Ý¸Ê {>«m@Ë›ðzéN‹›´×»ÔÌÃBÿ]¬—š@)õp[jÊâá…6붡²BSHQøר.öØ«N÷Ž`ðG¿§zŽ^n)?ìû±«892ÉÿxÈÌÄ÷Ù%¼­Ø3ÕÎZJðô]\ÿ^¸Äé„SXA㣅¸r}[(â0Ò@¥elöÉmi¶ö­EWÕ9úQѲ´ˆC¶Û¯µAñ=°g>MF{Q’= †*Ëk¨+™×Øõµk¤i@ïħÕW:x<›ó"Í}<=<²šC½Q¤4Æð÷i©UµSöA-ÒiMÛk×qnñÔÆèO“¦R<)D¾€÷/ÇT#î¡ÍM© Æ$ÖžåÔ3³Ð¿Á¢\ç{Uª÷Þ<UW=ˆ$®&<ƒªZ€0óØÒgÒR*¹ÉÒO¦1‘'£ùŽŠj*5wË-·‰ûùT j4ÝióÍu``òh߯µ“K…ݻʔÑk‡‡A›”ôÈÔDôìtk¯ö2ÅÛö÷ú—¨§$ÌöZ¥ï@Î^ùÝêõ^E~§”Üúí¨u4߉<*ôŽ±§¸KJßùy/žn•C*}…ÃåLgI£J·8jŽ[“Þ³ ”ØT7%JÈOïä,Á!ØžÈ+ÌÁ¯f—ÉȘs‡h`Úq¢O”1£<ƒ3(©dØOfBOŸ º'"p=Q£B¿âäpJ}ÝØü™ŸZ®¤!p{òëÈa}÷qÑ¥³äƒ£DKXôžòxÇ(žÏÑã ©¨“{ÏçÉšj¿dqX·ã·ŸP¦Üv£ä£Ï€³i¬¾AÕ;³@øyŠ*œoLœOœÕøë…ú¾›ºxOÛÝËc -@YšUʳªø;žBiäMÖð.•\rž;ùU´¾Rø'î…ç)眄š˜ …@ƒi/_ A®ÉéÙêr«0áFx<×Er;¾zÇ´UÏšøSÂö²Ù„.¥mô÷Œhâæ¨É2Ø’ç/{I;õŠjÑm÷¬ -*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿÐ$õ»endstream +*s"}Y ;Ò‰¢ú{YÌÝÇí]p¶Òݯ€Ž¶Xo³êÙ}U¹ôZø: hÁ‚)8f÷EµÔëÛDäµsüð¢ qTMŠ:ù‘ɸX!±l®ûÔ”Ëû ΄,ñº17ýbŸgûŸ&fܽ×Y'jeAt ]ôÛïwV^þ%ÑåµÛR¼”tμ‡Ël¥¿é˜¦j¹„‚øϸ3èm>YjŸÖCƒÕ¸ÄžÄÈÊjbÆn“ªŒUý©?ô‹ïðu«ÈÃWøìý#ë,M€¾ߥJBQlŽ‰âXè-ebtxÃ]€s<—ÿ¢:XÝQ…¸w¶²-N;N¾?Vl¤‘vG‰…,Å%ë9êçöË'bìη9|1.…±!]¹¶DšÏó=RԌݬ¤Iˆg‰=Åh_ìŸ5rÿ/˜ÿŸàÿ  tv…;0ÿFsõ·endstream endobj -1599 0 obj << +1628 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 67 /LastChar 85 -/Widths 2093 0 R -/BaseFont /ZIFUNW+URWPalladioL-Bold-Slant_167 -/FontDescriptor 1597 0 R +/Widths 2123 0 R +/BaseFont /ZJTCSQ+URWPalladioL-Bold-Slant_167 +/FontDescriptor 1626 0 R >> endobj -1597 0 obj << +1626 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /ZIFUNW+URWPalladioL-Bold-Slant_167 +/FontName /ZJTCSQ+URWPalladioL-Bold-Slant_167 /ItalicAngle -9 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/C/D/E/H/I/O/R/S/T/U) -/FontFile 1598 0 R +/FontFile 1627 0 R >> endobj -2093 0 obj +2123 0 obj [722 833 611 0 0 833 389 0 0 0 0 0 833 0 0 722 611 667 778 ] endobj -1579 0 obj << +1608 0 obj << /Length1 1630 /Length2 6133 /Length3 532 -/Length 6981 +/Length 6982 /Filter /FlateDecode >> stream -xÚíVuTÔí¶VA!¤†”ºQº¤»{€!f€J¤SJº !¤‘RBpé–NI%‰‹~÷;ßYß=ÝsþºëÎZ3ë÷îgïg?;~ïFZu-Ik¸%DCrpsr‰€t4õÔ--¬¡pe)¸£µ"ÒÂtñ¥]!H(&c„ˆ€ô Ö ˆˆ‡Ä-,, `Iý\¡¶vHó  û_–_. K¯?‘›HÔbºyp‡8 0ä Åÿ:P !í ¨#$­¦n ¨*b–WÕÉC`×›"ÔÝ,¡V e¨†€°€là® Ç? +8Ìú«4ç —$dB8C¬ 7aO+ˆó/ˆä qu‚"7Ï (dëjCÞô AaVŽnÖ¿ÜØmà¿9»Âo<œn°2u8‰°r…:#A7YÕeäþЉ´³@þÊ€ÞÀ ¸Í§5ÜÊíWI¿±ši…!@Hˆ'òW.KÈŠpv´ðºÉ}Cæì -ý-à …Ùþ¥€ä -±µpµv„ 747Ü¿ºóW ªÞÂÙÙÑëw4ü·×?4@‘ˆ£ '€›ç&§ò&·-ÿZE˜ ÄÍõ‡ÝÚÍùOÌâú»AÌ¿v†åF„…5æ貆ØÀªpäMJóÿnÊœÿ¹!ÿFüðd¼ÿÞpÿ>£z‰ÿÝ÷ùïÔrnŽŽªNßA ?ï2è×EúuÓ@­þGŒ…ÔÑë_EýÝSò‡Ô_dÇþà–„ÙÞÌ„C˜Sø+!õ„X«C‘Vv  Ç›ný¶ëÀ¬!®ŽPäfª¿ -âàæâú¦mµr€ýj?ÿfýwí7ƒú­¬£©¡¨,Éö¯o×ß¾ê7[€Ôör†€þ;‘ž -Üú‡_LRRpO7· ˆƒ÷F7— /H˜—ßç_dýMÄý×YÅé -õqqrqqƒn~ÿüþu2ù,Ì -nýko´0ë›Uû‡álåæêz3áßoÿMáž/=â ±LOÀ­DƒíS3ÒUä9=ý2F:¸1zBœ‹k´_çûWÀÛýRÃ…ËÌ/*C8kE®š¼Æ·/W•X×z;È·'Cöò¨|èYÞçÍ3½d[ ›ã§}Õ‹òÞS^À4àÒ][ê×Ð4-º¸|Ç늽ÊâOïžïOÊpâLàk•òöÕƒÂÚ[ÄUÛ_™6OOwõ}ìén?¼û~•’-û£¨;&>S¤¿K6åSCRÙò·ª·ãòŽXXðð+yÏ—×ro1XçFèÅR61žêDžeâ§Á ×^‰mùkT³ïT ¥ØÜ KCvá)µKö±éû¬l´¾úï.ú¹üA¢IὬ}‹xp—ÆÌ:…x÷dlt×VEæ¹®ëºB4ߢé:°h`M$z¯=Ä*óù ?7l &?QäÔ…ÚvÆ<=yÊÙûÃ㎣²=÷'ºçä ÄAŸßÊ}gw‡U¸'b%6—=\5Æ„¶O€X)Ô| 6*˜Ö}ØŒôDVs§Up ˆíbëÞ­×…+Ïo_MX`êÁWÉC.Âß6¼|í½ÏÊ)¥2ÉP0–b®G+kGõýZŠÿåÆ~+`çÑáËé#™~KˆjîβÍ5—‚ ÿ3zë5½ó-o'‰ŸžoJ| öñ Õê…k¯Hî÷’ô¿/üž“â«7Rîõî°F˧€NÚ´…”QOÆYÃÃöLNßÆe‡··Q&8LëÀ…cÙ Õˆ€éëèqo£F‚®ºqG’*¦²óà‚‹¥"ýbmÍHàv{(Ž?ªÍü-ë&wU¼m_A±FÀͼX[ÝuÞ80+l8]ò)áß½WMœ½RY.þä© Èóqº:Âo£ù¶ãí•MÑJôßY$‡‡Œ’`$íŠN î÷Þ×ó¨‡caíó )¹ óSçãa¼&ßi·õã¬P2ó§Ð„]¬ûãð#l3oñ{´„îªÌ ÁºqÙhiµGH‡:!F[ ŠcÙX±¯Á,þÙñ°“ŠÊP)½±×3 gwµy—Þ)¥åB¸*!œˆ—ÕëLwÑÔëe5íÕÄÆú¦d„’ÅÙ5jY®yr!Þ8RÖwòd€éî¨h:³ìç” Œ”´¹©¦úa!ǼÆêëÝSY·ÊhHçú—J§=\½ WšbN,8‘T‚Y³0©ÝZH;V$Ìëü›HÙñÙÞ¦eÊgTr>R‡>Ó£*X¿l WTh‚ˆsÝÍötº·)tÊ`D"ŒN€d÷¶kÅŸ×Ë)~>;ûHé¬\ýÉò%Œæuj Û²!>2M¤ |N¸»OŒÀ¸Å~Hª´+ˆ#Å"QÒ µl’9’kСA}S÷†né^W©]+žSüÁèû³,>VsIì)Í’©^ cFièr}Ú]ÜAƒŒ±9“"³ºÓÜö1x«ßiëÍ‚5ÃèÕp:¯©+Œ*‚_øˆ'û´”eÞW1qáÊã»NÞ`Ðß 'é »Îk+ñKÚ+ŸQÉ8¤¿'u l(-V;K!ªÆ¹áK‰IúäUW‹ÇtÎœ%6QK(ŒžJAÿÝëáæ…\™F{3dk*ƒA¸Äg5’òœA±ë¥ÙgwA•,Ï\÷3jT¢÷Åɪ™œüRÅy÷wF#«(Ùá²Zá”Y„FÞì¼\>LÉÈäAÝ ŸËi6ô¸ý•dèEͤ„ o€8qørŒ0m+êñûƒkŠ a6u÷} ÓÁÙ&Qûó©„rìî:?†:è -ù£ÜÛõŒÚGa¾Tµ ˵µ;¥¬W~òn+–lO­4 o¥ø!=ËMS¸âØ(kb¡,D ZÆ8T'p—.ø;2S•cf‘¦>dÇvË%·*­7 }Åçj£&ã—6Y”«Dd¥×VÑà›lh`2爙0#·êZ=4í%牵7h%Å Y$Zü¬ˆv±?‘©‡É=áមð;Ïcc„—÷:IêÖá°5ž’”ö×yÇUµD2>ÃÙ}ÐŽvk2š>2òQ× ›yôASLPkQ¡âZõ>×_À -ZŒvR¸pdÎ& QºÒàî¯E¦âx|E&ù'Ar0Ëèh" ’çÏvÙý½Ï»ÓçêßV¤0²iRÂyO„jßÌé&šH¹£(Âμ4™ -V1-S8`_3D ÝËúÅ7BëbØ r¨Ãt©aÊÓêغ0‰¼•5ï´ñïâ¨Î)9É@[gbL¦')Ä?Ê„ãÐ÷*éT“꟱Eê+ãIõ_â‚R§—«·>noߢiŒ!L½<©35¢$2MIÝs™ôäu¢¨bâ8 ûVÇÌšDT£ä¶"Q TFÉ…Cóuø9dcÝI¥Z’f@A -»<¶ÚL9’00#†ô}à…ê¬ëè¾>€à)†fbˆù†7sÑ¿×ÀÅ}ä׊³ÒgÍ¿?FІæNP˜ké÷2è´à2|Ö§™¥£[¶WDMåtè3?èù:28¢È;Xf1S§³EŠ$´×å0Ä0d—5ŤÐ4|ybæ)OÄ|˜léË@Èu±}µ\"üSÀd5ŒÃkùp ü3ʇ×Î -+˜^p€&9I‘òÝÂcJ-Ù.Eâ.ÂÄSL”„Ä`4œÚÁ¤7\N>frÖi¼ÝÏPüTì,1êÈ@^'èMuèï\ ékJj§^ æü12Ït¦ˆLVéøŠ>iÜ猆ž=ZƒÎÈVO(Îʾu™÷ѶÏÐÔfh=}̹öm{âý”2¶£ÆI±»põ-¾¹+ýZC—±­ËôKo¹‰nÞ”×|ßòË?mztÖ9ÖåçÄe/°¦Õ•äÂúö*~”2è½ÞQšKþ´$Ï*§ú·æøšÿ]íùu¢@ñÁâ°ÆÈzúçîߥnK~£ÒwRdˆµU -”kx±saóÝÒ÷ÁÜ÷Kk ]ö¾ô3 ·/*ÉmÌKgƒwõÇ–ˆýIô‰ù¤ŽòŒ¿Ù=a£ïe€üvû# }Llb9_ÚEƒˆÓFHRòæ›=ë­GýTùH:ñ9ˆe¬ù6PÃ%BÒ§4ž£Ò.n+¿ƒª°ÿ9ÌèÙïc‚4Ã_gÇÓ¶ú‰s+>傹»˜‡¬9,Épª½è!׉·ïhuF ÒiU2Æâ-A6L;iY­"Û ±+hô3…RÝOïi¦¹Í —Š‹ä©ˆÏHžn5÷ò”JDýÉ›³¯pôÝÞó4ÇÃøJ~t‰•|§›19äÚ¸N±)¸}> ˜5.¶5Œ¥¿þ“ <ö¨õëGš±×1{!•Å²ê3‚A-üMÉcÂ[ ×%Üû/¾¶°½9oØPO;fiv±}½•@ÃœJ#(G9j>2š?¤Æ ñ?~ªÑWåïBç¡ÛµO±B¥™Ÿ†ñúÃ&e“v”3†­ÉÞ&™<)ïÈxbý'.¼Ï\Ì_³Ÿ±‡Ý'0þààõªckêUPe¤cne„žÁVó“pÜ Ê½ö>ÄÐ -½c–î3Ó5¬´0ÏÚEdÊŒƒH(‘©,ðÉôä‚Nnád¥,_½ù°/ä -ecŽ¡ñ³b2•ßÃÄœ¯ît¸âËA".0mÕjÛ;÷$èÓ#Ó“]Q;Ò­vü‘‡¦ýO ¢Â{'ˆÈ‚1N ;$F_Õ~@Ü©Jw“+gfCš§¸Aëßå~üv»s=í,€–ƒÔÊ‚ü À† -ÈÃñôß[Ƥ7œàÀfIŸŠ¿iÍPŽêb FDt¨%Sc<ØCÞ±‰¤_¥}#툎~áß\°ÕÃjC¾35𮾌ŠãÖEf˜ä÷q}ÔUp¬$Ú¿•×çyD*û*ݷ÷î@òQŒÞ7¬â¢¾yçã,£êìª%É0®š¹î³È6¸½}ˆŸ^½÷s®Ã´ÔøÛܪ{‚€79»#¼¸ùߣf²sË©W½ørÄ(€Db^Ð*A|üÙÀø乪“ÐzÜÙ™N>uêתͲ, ¤Õè/‡üî¥IM€©*õO ÀgÆC”kìþ‡•Â—•ß×±GJ«€ŸVp+;çÔñG—ó±Ð¶"u¢»}e/—¤ÜbÎò7žÖ®Œ•0ð¥ëŠ[Fv7íXëÕ5Ì›ì¬É„Ac_ü¯ƒò{LEÊgL®ç'õÇlÒé'‹½6I Þž {Ÿ¯¬iëdºOIi옂-i©Š“b«U«B굦 HìK¹cÈŒƒ´úúipÏÈêµE[ªOâáÏx’"‹V)úÌZWïŸÖ‡ƒéüL¯Pã}<ÇY:{ˆÚ%~Ëõ( cΧçƒþCN…ˆ§tO&Žç„V™(7íuq›]©&Ä=5Þ¬£éÖZìržOÔ¯énuÏ)§†£9‚¨¢ß–Eä@Šz?»a`Yû äÄ Vnœþ˜`~i·R‘öÁc\Æ—ïî§%DJ^Ÿ£h˜Ö„ýΨڦ·.Jú«ùt…F^ÈòcXþ3OQ¡d϶0§,÷”Še&uùÙ¾ˆï‡OÄY˼zõ¹Wô,i9d•0nçvKîhQ"K•Q¾Zø@0M¨âÒ¤xÑRõ†‚›ÇŽ$J­´çwR0ˆ+Û6UÕ¾/שM”B®±XÆçÅÚ«'ªM]D›„]ÊQÈî]Ä-ucIg|ÇZÙdŽg>ÂŽï|ê™5È(ü…ëù®êè –ÄмÂNЕë4P“÷ÞÏîèÖ ‡8—‰$—ØBt¹úÑBCšÛöç™yxWûãz×±ÛýD0ϛȘÅñÅ„oJXOWi öì»×.çä_MàSgDd]ÞíR–}Áõ÷ã¶ÂŠ”È[¤«Ý†\~‘_ZÞ}ÕRë\à=cÆmï¢æŸH4Òn˜ ®/™Ë[ßlÏ¢œ\mÓŒ]Ë; 1ÐBVû \±–·´åµ‚µ¯ÊN*I"/ïm?áIÂÙNr©ä —ë?>}7›ùâžàÙZ˜æñ`kËG.¯–*O˃åé]®$£lì©VÌú‚§«/]´~è µW,=ÖÞDÞýQ C96­DñtÏeŘ'”V[ĶtûPðôÝûîú@ò$Æ.ƯúÅœï}ù½Ï *[7›#lUÊ[“|öÄcÃÅšgêDE2_¡ÃMÕ^}üÆkOÛŒäCã±åSPΟZc¯\ð̸™ð '-ÖÄ®1švÆeÐË“=û’Òk÷Óc½æÁ×í%ƒ‰á½: °C¹Ø\Ð`]“˘ˤ¦¸Xºr©·! îη¯Œ_‰_Tó¾ -Ÿó/°Kê¼-œ [—¿çÃq-øz~Ii‡³®>ëGGÈF¶Üšqˆ‹¢À¤^Ý µºÜzœòŽLy*Ø!$ëȯ²È¿Äøý9Àõ—x»Ë+Jé.Õ­”÷yKr¬àKñnD$ïÇÇûùSŽ¸+¹ºfS4æHõ¿ÞzyàÂ*/ç%Šâ׻͠ÏØõæãmº'7]ìå±ÅöK)ØÑÁ@£b…î\çÑÄÝÊ‚×[g“©»U©«ÅÖ¡’v'¯ÔíÌ¥ºiMD?3AqÑgœ‡ ÊŸ¼ίªóÑÓ3NoTšv [YAóOL®·´MHËJ°ý‡ãĬí«å Ä\]NG”¤;F¸<D†ŽR›æ.MÃ>ÂW5ßÏI“1øi^{Ñz·ö´·‰¾¯½bÅ=YV6S$øqr,påÑr·¦s<Ýþº•l+¢dÙôú~«ÉR1xøà`äÛÔ€²K[å.Nµ;ãUûŒ2ó¾jÂÓ’D€Ì»«™Ï5o~"Çý'…|¤0i"í.>_0'BT¦ž¹{Ñ`IíJÓ(`ÌW¾­ÇaKPÓŒSÃ$(L÷8k•·ýAcc·òd3–âm¸L>b@”©k?OÙ#ün*3oÄHóÉÐàCíúd“GW;¯y‡™¬.÷Ì¡@Ðñ}“à¤Ô-´ý^½R¸'EæòÑ¡wuº>ó<5{Ž´€KÃ7®Ì[NŠpÓèªÉš•Q•Ýk|}kÑçc(?72•­ã»9 -Òí¸FúïšyË«mn£°MWÑl‡ög2w™SçäSCþ¹A¡‰&Š²Èkª|3Ø`ê‡ÄcïÑ+Ó\ºŽ’3®óø‚ÿVŽ W$ÜÉÂÕð_0y§endstream +xÚíVuTÔí¶VA!¤†n†n”.IéΆ˜f(‘N)én$†FJ Á!¤[:%•$.úÝï|g}÷üuÏùë®;kͬ߻Ÿ½Ÿýìø½ki5´8¥¬á–y8 ÉÉÃÅ- +Òy¦§aáèha …«pJí•Ž HÀÈ(ã +±@Bá0Y $D¤±ÉB¬@¼¼ #Hîìå +µµC‚XnxXÙÙ9þ²ürYzý‰ÜD" ¶0Ó̓;Äîì!o(þ×ZiÙ@! u %5‹‚šHƒ¸Þ¡áf鵩@­ 0„dw9þqYÁaÖÐ_¥!¸n¸¤ Âb½ ƒxZAœA gˆ«¸yA [W ò¦H8 +³rt³þ%àÆnÿ-ÈÙ~ãátƒÝiÀH„•+Ô ºÉª!+ÿ‡N¤òWnôÁmn<­áVn¿JúÝÐÜ H ( BB<‘¿rYB@ÖP„³£…×Mî2gWèon(Ìö/ Wˆ­…«µ#¸¡¹áþÕ¿êýSõÎÎŽ^¿£á¿½þ¡ŠD@m¸<¼79­7¹m¡0ø׺(Álà î?ìÖnÎbî×ß bùµ3¬7",¬á0G/5ÄVƒ#oR‚XþwSæúÏ ù?0âÿÈ€ÿ#ãý÷†û÷ýÓKüï¾Ï§–wstT³p‚üýyÏ€T@¿.Я›jõ?b,œ Ž^ÿ*êïžz?¤þ"û;ö·Ìöf&œ"\"X¡y¨'ÄZŠ´²ÙX8Þtë·]f qu„ 7SýÝP'7÷ß0m;¨•ìWûþ€ 0ë¿k¿Ôoå`Y=ͧ +ìÿúvýí«q³Hm/gè¿é©Â­ÿqøÅ$- ÷ysòqƒ8ùnäðp ñDø|þEÖßD<U-®PO777èæ÷Ïï_'“¿ÑÈÁ¬àÖ¿öF i³¾Yµ~ÁVn®®7þýößþçù÷ÒC ž+ÀôÜJ,Ø>5# YEžÓÓ/kô¡ƒ£'ŸFûu¾¼Ý/5|Q¤Ìü¢2„«vPôªÉk|ÛùrU™m­·ƒÌ‘¹=²—GåCÏú>ŸhžéûZ Ø´?í«^”÷þ˜Ê¦¡ ·îÚR¿æ3Ó¢‹{ÀÁw|®Øû§¬þôîùþ¤ 'ξV)o_=h!¬½E\U°ý•)aóô„¹«ïcOwûáÝ÷«”ìÙ¯pÅÜ1ñ™"ý]²)Ÿê”Ê•¿U»—w„ÄêÄ‚‡_)x¾¼–‹ À:7ÒD/–²‹óP'òÆ€,? N¸vðIn+\£š}§Z(Åç^XrˆL©GXrŒMß—ìdc§ õÕwÑÏíK +ïeë[ă»4fÖ)Æ»'c£»¶*2‡Ìu•ÙÖ£™øM×E;k"±{åè!6ÙÏgø¹a1ù‰¢§.Ô¶3àéÉS®Þ?pUì!¸?Ñ='g€$NúüVž;»;l"=+±¹ájy4&ôøë´}‚ÄÊ¡æ °Q™Ä´îÃf¤'²š‹8­‚{@|[÷n½.\ex~ûjÂâSÿ ¾jrþ¶áåkï}6KiÕI†ú€±s=Z9;ªîÕÒ/7ö[;_NÉö[BÔrw–mF¨¹]žÒ[¯éÇhy;Iþô|“Pâ±_®Ô(\{Er¿—¤ÿ}á÷,˜4½‘JÿШw‡5Z!tÒ¦(¤Œ2x<κ¶grú>0.;¼½2qøÀaZ.Ë©EL_GHx5tÕ;’T1•\,ék?‹n·‡âø£ÚÌßÒ¸nòTÀÛö• +atÜÌ‹•±Õ]ç°ÊÁ†Ó%¿2þÝ{ÕÄÙ )•åŸ‰>§«#lð6šo;Þ^Ùû¡LÿUjIpÈ(F²Ó®èê~ï}=z8Ö>ß’»0?u>Ægòv[?Îú 3MØĺ??Â6ó–¸GK让Ƭ—–Q„tÈ¡f´µ 8™ûÌ⟠é?;©ª•Ò {=ÕtvWŸuéR^.„«È‹zY½Ît+@½^V×^Ml¬oJfE([œ]£–å›'â#å|'OF˜îˆŠÖ¡3ûÀ~.IZÀH)L›‡jªrÌg¬±Þ=•u«Œ†t®q©,xÚ3À-ØËpõL܉'òA€ªC0[&µ{C iÇŠ¤y)>û›çeLcÑ%/³FTU§€ÙÕô¨5« ð +½’•sJÜkŒ "êC 3ó®cUÉÙ4eHÎH~0+¾÷ìEÑOÁY^€ÝˆF›ÍŽTU§h§D´çéíçǽ8IÉ{éBDWžñ»ïÝR±FêÏVë®fûÆʦîíqßÇ´L…ŒJ®GЧzTÅ‚ë—âƒáJM î;£2þñN÷6…OŒHâÑ ìÞv­øózy¥Ïgg)Õ‚«?Y¾„ѼN-áf_6ÄG¦ ‘”Ï w÷‰·8I•w…p¤Y%K:¡–-@2GrMú 4¨oêÞPÀ-Ýë*õk¥sj€#}–ÕǪq.‰ã!Åp£Y2Õ tÌ( ]¡ÀC»ëƒ;hbЀ16gRtVwšÇ>oõ;#m½YÐá³0zuœÎkê +£Šà> ä>-e™÷CL\¸³Äù¯“7ôwÂI:HÁ®óÚÊüÄRö*gTréïI(J‹ÕÏÀÒˆª1!øRb’>¹`ÕÕâ13W@‰MÔïÒ335,Gƒ÷î Ã'V? 9ZŽfjW]èUªŠÛ¬[ßÑY@ÞCLAíŸjÙÙ*+òæÅõÁÉÏ5~šj}‰Ûy]ç¼cñvË‹ Bxi9]'±|¤“²w/±2X®‹‚8w^+ÐKºDœ~$ìl‚Ý‚I®J5`žV¯ipw/¢6’ +}ˆçã õF´£ögºts£ng]á„Ö|Õ`ˆksÕ8;¾Ï»´²?…&@È™!*¦54[«*/„“¶sÈo?87Æ…ÑS)ê¿{=ܼP‚+»Ñho†lMe$—ü¬NRž3(Þc½4ûô.¨’õ©ë~FZBô¾Y5““_ªßþÎhd%\N+œ2‹ÐèÛ—ˇ)™¼¢{ás9͆·ß¡’ ½¨™”qá 'N_Φíc%}#0~?3¸¦fSwß2œ]aµo1ŸJ(Ïá®óc¨ƒ~ P ʽ]HϨ}æKU«Ù0¼Q[»SÊvåg à¶"hÉþÄêYá­ÿ/¤g¹iŠWœeM¬”…¨AˇêžÒGªrÌ,ÒÔ‡Øn¹äV¥õ†¡¯ø]mÔÅbüÒ&‹’j´¥‚LsNù£97œ{xØ4()Ûó’:ÍÕJ QɉÓ4âQxŸ6êw´êú|©:T™$·Ü½Ê·ƒµ +Õý‘–”øц1öã9ã^Ìæ‰ÍDqfÍEK–º¨ÖÆ¢ñ—Šˆ™b+oŒÝ-.4‡u˱A—†„‡ÖŽñŽ\ß·ì$&ªH=ˆð~„v^f-ÔpžYÆSD“Ÿó=²AŠ5bµXî òàGzŸV·å|ñ¯¬ ôùÜäµqFÿ‚Ox·Fšk†dMÎV{žPzÛ`%õÅl˜m—eYqªÆXÿ»t›y_o‚*…»”ëü`8™dÈWLUeÛ|êæl UltŸÙ|¹»Dl3Ö£=ÍÒshí.‘È/œxK÷,,AãaÓ¬)ŠWtíB²J*=Ý{†!f»Rq„mÃoœ5¤pìhrßµïdé0æÀ&øyž•Š÷Ïï[P-qµÎ“ `ýB!aþa`Wf +pR°‚šL\(hG»µM™ŒüÔuÃf}ÐÔZE¨„V½Ïõ°"„£.™³ÉJ”®<¸{çk‘©‘IþIü€dLÔ2:šH“äùÓ]ïóîô¹…z¡·)ŒìÏ)á|'µoætM¤ˆÜQáŠg^Ï™ +V1-S¸`_3ÄÝËú%6BëbØ r¨Ãt©a*Óغ0ɼ•uï´ñï¨Î)y©@[gbL¦Ç)Ä?ÊDâÐ÷*éԒꟲGê«àI÷_â‚R§—«·>noߢiŒ!L½<©35¢$2MIÝw™ôäs¢¨bâ< ûVÇ–DT£ì¶"Y \FÉ…Cóuø9TcÝI¥zÒ³€‚*lõ™s$a`F éúÀ µ (X×Ñ | |ÁS +5ÌÄ÷ o榯‰‹ûȯg¥Ï.š%~2Œþ  Í“ 60×Ò3îeÐiÁeø¬O3KG·l¯„šÊé:ÐgyÐóud6pD‰+v°Ìb¦N f‹Mh¯Ëaˆ>.`È.kŠI¡iøòØ"ÌSˆå0ÙÒ—ûbûj¹D䧠Éj§×òáøg”ŸV0½ÐMr’å»fJ-¹.%â.ÂÄSL”2 „Ä`4œÚÁ¤7\N>frÖi¼ÝÏPúTì,9êÈ@^'äMuèï\ ékJj§^ æú12Ït¦„LVéøŠ>iÜ猆ž#Z“ƒÎÈVO8Îʾu™ïѶÏÐÔfh=}̹öm{âý”²¶£ÆI±»põ-þ¹+ýZC—±­ËôKoù‰n¾”×üßòË?mztÖ9ÖåçÄe/°¥Õ•äÂúö*}”6è½ÞQžKþ´¤À&¯ö·æøZà]íùu¢`ñÁâ°æÈzúçÃîߥoË~£ÒwRbˆµU”ox±saóÝÒ÷ÁÜ÷Kk ]ö¾Ì3I·/ªÉm,KgƒwõÇ–ˆýIô‰ù¥òŒ¿Ù=f£ïe€üv™ý‘‰>&6±\/í¢AÄé#$?)ùòÍžöÇÖ£~ª~$øÄ:Ö|¨é!åSš‚@ÏQi7KÜAUØÿœ fôì÷1Ašá¯s`„i[ýĹŸÎzÁÒ]ÌKÖ–d8Õ^ôûÄÛw´:£é´* cõ‰ ¦´¬V•ë…ŠÚ4ú™B©î'Œ÷4Ó\fKÇEòVÄg$O·Æš{yÊ %¢€þäÍÙW8únïy›ãaü%?:‰ÄK¾Ó͘ro\§Ø‰Ü>ÊßÇÆÒ_ÿÉ ž {Ôúõ£ Í؃k ‚˜½Êb9™¡ ¦ä1‘-kˆ2n„ý—_ÛÇØßœ7lh¤³6»Ø¾ÞJ aI¥’§5ÍRçƒø?Ñì«òw¡óÐíÚ§X¡‰z–Ÿ†ñúÃ&e“v”3†­ÉÞ&™)ƒÿÈxbý'.¼Ï\ ,P³Ÿ±‡Ý'8þààõªckêUPe¤cne„&žÁVóãpÜ Ê½ö>ÄÐ +½c–$îSÓ5¬´0ÏÚEdÊŒ0ƒh(‘©ðñôä‚Iµ±¾»Ú» :—2´Ä!<|^Þ‚X2›/¾5obÿd¬ë¥KºÃwƒø‰Õ˜ÞMG0C&ÊØjãž;áÔ+=ÃÜãÍEXr#à]Cg "}Yá¾.¶aýìY³ÆIˆ/^Y»}$oί8 lU†ø„=O'aFX²Åï9hRÔ¤[ÞÞ[ù~ˆ[ró—M~“j…<·ÑVG½‹Xî//¨šá‹ÉVà²hÑi·¢·æÉå6I?,·%F\œÖô™–@êõ~ø†Yý E>eUλGwü^‚}« 2ë$¶Íð‚ +ïcñ•ñZ×™b”[DÌÛ³>Â&Õ—ÂaY Kê{@”¹¸’QeUSæX6»ð¯CvòàªÇ£hœ½a¢ª§é›ßôóƒòêªÎ1‡(‡(-Ô±ßV”ÓyCC..& +®Æã +7/ƒ[\ÉcçtFqóÍÍhF4®¾¡õz»Bö¯ ÐØóÜE™Œ® #ôÃëÅš[È +ŽM®Aµì)ÅŽ¡ArjgWLØ;'·p +²RV¨Þ ˆ|Ør…²1ÇP‹øY1™ÊïabÉWw:ÜNñå$‘œ¶jµí{ôé‘éÉ®˜ ,éV;þÈCÓþÇQá½DdÁ'†RG£/º÷ê‚*8VŠí_ŠÀÊëó<"•{•îÛá[w õ(FïVqQß¼óq–Qõ vÕ’Tw͇\÷Yd›fÜÞ>ÄO¯Þû9÷aZjümµ=!À›œÝ>ÜüïQ3Ù¹åÔ«^ ü9â@"ñF/h•>þl`|ò\ÕIh=n‚ÜL'¿õkµf9VÒjt‹ƒS~÷Ò¤&ÀŒTú'§$à3ã!Ê5vÿÃJáËÊïëØ# ¥UÀO+8‹•sø€£ËùXh[‘Ñݾ²—KÒn1gy‡OjWÆJøÓu%,#»vlõꀖÍF¶d À±/þˆ×Aù=¦¢å3&×ó“úc6 éô“Å^›$oφ½ÏWÖ´u²Ý§¤Æ4vLA‹–´TÅI±ÕªBU! õZÓ¤ö¥<1dÆAZ}ý48Ì3r:AmÑ–“xø3ž¤È¢U +ƃ>³ÖÕ;À'uãá`:?Ó+Ôx`ïq–΢vIÀr= +ȘóiÀù ÿK1â Ýc‡É…ã9áU¦ÊM{]\¥fWª OÍ7ëhºµ»œçõkú‡[Ýs*©á(DŽêƒØ·eQyУ¢ÞÏnXÖ>9ñB•§?&X^`Ú­T¤}ðØ—ñ组ûÆi “R§×ç(¦5ác¿3ª¶é­‹’ùj>]¡ƒ‘²Ì ËÊë)&œìÙæ”åžR±Ì¤¡0Ûâýð±[ùW¯>óÑ{EO“–C6Q ãvn·äO0€%rTå«…„Ò„û(.MŠý!UoH!¸yH¢ÔJ{'Eƒ¸RñmS5íûòÚD)ä*‹eü^l½zbÚÔE$±IØ¥œ…ÞE¬ÑÂP7L¶Áw¬•M–x–#ìøÞÈ'žYƒŒ"_¸?‘ïªjy@ Í+ì”]¹N5yßéýÜèŽn rJp›Hñz‰/DW‘k-4¤¹m^‘‡gq·3ÿл¾ˆýØî((ŠyÞ|@n Àœ(–Œ/&|SÂvºJK°gß½v9§ðjŸ:#"ëòn—ŠÜ &¨¿>P´DÁ"]ý6¬àò‹Â‚ôòî«î”Zçï3~h{5?øt@ú¤‘vÃu}ÎRÞúf{åäj›fìZÞ‰²ÙOàŠ'°¾¥-¯ª…|U¹ÐüpRIyyoû1oBÎv’K ¹\ÇÌ|ún6óÅ=¡³µ°gǃ­-¹½Zª/¨lÝ4nlŽ°U-oMôÙ“ˆ o:œ©Í|y„7MT{õ ¯=i3RÇVHA9jQ¾rÁ3ãaÂ3œ´X_¿ÆdhÚ—E/Oö\ìKɬÝOõš_·— &†÷ê$ÀuæbsAƒytN.`.šâb™Ê¥܆€ð6é瘯l¾}êÈg|ëwRŠžhXŠs×L84ØGê} 1Y³mgzÑìÅÓŒ$»9ñNh‹Í”ŸâÕ÷ºXsm{Ôg"'H±¨ª®RU\O¹<Š>ÊlSñ" + ‰ôt.CB±|…—(z?п)|Æö…›‡8csa4«ªy=~U»+jð*Ì8Ó“«&ÐÐåÇw?´,IpöÛ7oå¡#½Ëõqw¾}eüJü¢šïUølœ]Rçm‘LغÂ=Îk¡·ÐóKJ;œuY8:B.²åžðŒC\„0&õê®X¨ÕåsÊ;2•©`‡¬#¿Ê"ÿÿátökä÷g\âiì.¯(å»T·RÞç-ɳ/%º‘|™÷ó§qWru?̦hΑê¼7ôòÀ…U^ÎK:%į v›AŸ7pè1ÌÇÛtOn4 +¹Ø+`‹ï—Rp 36‚FŊݹÎ%:b‰»•¯·0Î&SwjÒ V‹­C%#N^©Û™KuÓÏy,ÅEŸq&¨ãò8¿ªÊ{D LGÌ8½UTmÚ5leUÍ?6¹6ÞÒ6!-+ÁöŽ·¶¯T(wu9eQ–éáö:Jmš»4 û_}ö~N†ŒÁOkôÚ‹Ö»µ§½Mìð}íîɲư™qÀ“ë`Á+–»5ãéö×­d[%˦×÷[M–ŠÁÃ#ߦT\Ú*wqªÝ¯¢Øg”‰˜÷Õžà$²dß]Í|®yó9¾è?)ì#IiwñùŠ€%z :õÔÝ3°ˆKzW†Fc¾òm={‚ú³8uL‚ÂôwÌY«|í»U&›±”n{ÀeóbL=Xûy*áwSYø"FžN†j×'›<ºÚyÍ7Ì4`u¹§h‚Žï›Ô'¥o¡í×ðê•Ã=)2—½«ÓõYæ©9rd…Y¾qÏà`ÞrR‚›FWM†Ð¬Œz¬ì^ãë[‹=Cù¹‘©nßíÈQ”iÇ5ÒoÔôÈ[A}s…mºŠf?´?“½Ë’: Ÿ’òÏ +M0 V”µ@¦ØRšÁSÇ8${^™æÒu”œqÿ›ÀÿüŸ °r„X¸"áN®€ÿ'yžendstream endobj -1580 0 obj << +1609 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 66 /LastChar 78 -/Widths 2094 0 R -/BaseFont /URQILA+URWPalladioL-BoldItal -/FontDescriptor 1578 0 R +/Widths 2124 0 R +/BaseFont /DGWQKG+URWPalladioL-BoldItal +/FontDescriptor 1607 0 R >> endobj -1578 0 obj << +1607 0 obj << /Ascent 728 /CapHeight 669 /Descent -256 -/FontName /URQILA+URWPalladioL-BoldItal +/FontName /DGWQKG+URWPalladioL-BoldItal /ItalicAngle -9.9 /StemV 114 /XHeight 469 /FontBBox [-170 -300 1073 935] /Flags 4 /CharSet (/B/D/I/N) -/FontFile 1579 0 R +/FontFile 1608 0 R >> endobj -2094 0 obj +2124 0 obj [667 0 778 0 0 0 0 389 0 0 0 0 778 ] endobj -1366 0 obj << +1383 0 obj << /Length1 771 /Length2 1151 /Length3 532 -/Length 1711 +/Length 1713 /Filter /FlateDecode >> stream -xÚíRiTSבª¡¬2©¤j=,ŒiF !¡€D ¢a”Abî ¹%¹—^n )ƒˆ•TeYÄF—Œ¢¢TXUê€RK¬B 8‘VJXÖ"U«"àÔ ÖÕUúó½_o½sþœýíïìýïlš[„Œ!‚° p0† “#R©„Ãä™Í¦Ðh8,' ’°p/°R«Üe€Íò– y| - bizIQÀ#>Aâ‘Æ…R9¡‚5d …\ d˜ =ˆÔj°vâF:X §Ãx 1)€6À)JaMh’ J ðßÀ6ím*ÆÓIQÀcR&"! Uë+)¬pŒì“Zþ²¦ÖªÕárÍDùI§þ•—kµþ/¦IÓ0¤ãèTj üFœ†­fjVBÈÕˆB„¦¨aÀà,g²—¿Á‘ô`DC¡P¥\Oâ0 -MUBú7©ƒµZíù××N&#äJDêÓ`Àþ›=sþŽI“pDâÙL6›CÉýö”8¥™U`‚¦.Ï Èq\®§CDF<Å -Á:ëHÅ,&Šä@:“”N™øW/6`©áôô ô À¬”‰Ù#Ý›Àþý´€L—ÅXÆ .lÅ^î ø¤Aoc%Bz -Ã:XA1ßÀ>[>Þ{j[M®¸ªó¨-=}¾ñð–ös[O}˜C½>N×ðÆ#áþpÜêø1rÌ¡d8ì+¤äõQO‰²MY2ÖÖG“½ ½bŸlÆÅPBÒ´Kem­ïil¿k^hIkô|ð“ûÓ;çlëVÝãð+©Ã…ÓknÞxù87ucGŸÙîKÈ}°„’XvzÕ8ú×;EWÆï‡`U˜¹úÒÜ„}O_™©­·»SoÙ†2©Íu£ï‹YlºNÙßAáìO]hŽ-¬” gÎ÷º]nVïûºcýš›Â¤¿Ïè¢ ÜŒïvKòsJBc$Q#óŽV8)jæ©}Cª©Öp}ëºz¡ÀR¿&ß)µ¾“ë[ÌIkÜC[›<ö’öÇ¢ÓŸ$>ÞûìµÚò@‘åfåz|ZŒ§÷~ÿ Ï!z;›j{õ3“[œ\õÅ]BäÚk·ÂЦùÁ¿?»yT -b×ó\nùÌÝ̥܎iö–(]çùu“iw‚Xg%ˆ»ˆ~Ô_ùð·‹-†ýܤàÀøÞä3‘7=/Õ6œ¯ -r®-˜žhj -®ZÔ4ë˜ëæç<ßg¶ƒ(Á T;ͺuE÷Ug³xãc Ž ½t¿ðü±$ÊÔ8|ØkA®íàæy©;™÷#—fyÿns.¬6Yßé]{Âôýœ%{¡ÈlÆš½©ÇjÂj¶iô³öÔ?äØ”gŸ}"júNY†:°O—ÒÛhë/×>"Š"žW&3ñ8ÿ3-­(ŽZŽeepϬ^ÏóIHyÕíwxíÁê¬]<º¹|Áöõ¡]Ï€€š&þ´$÷õ–‘ž­£¸©=ÞŒÞ=j¼ý}"Ø|ö £ÖÝ7ö«Å~-Ժ󿌮XÃà:*#³Øê8ÏBëþqÔ\©©u¡A.–Kò³«Iêü­ä‰+jjN3l &h‡^ž¨*‰fåZzVœôr#VV -QÙbÉ)õR«i·§>.qµ<Å7¸Êo(ß ùߪˆX7R1î{§k\›ç|y¸°ãçÓˤJéëxÙžä¹ÊL½®sNfSWé<‡r] ÃcËéÕYŸs¿8ehÜd5—D@ßX«Ú·]s¾m¯álŽè¸ÏŽÄväÛ¼›S¸’Jý5,®Õí« -µôÙq13êýÓh×RqÉ+ë¸èºÁv버C\¡S£¢±Þ°ûBe±ýGÑê@¼42_Ñv+ióÊ!i]Ãñ]vÛ9UÙÅ]³ šgÌß±é'—GK2d_®ó;ÇÏψ>ÌëóŸõ­ûÂ"%åœ,WH¹+î Í~æÿÝ{Ð;¶A#‹Çœ1<·¨zO{—K†.wŠn¶î¦Õv©›ªK vKg×8­'ÄáPûeáUß]íÅí¼OÚƨKˆ¯âO.uùZŸ\Ä ê6< iY• ¡‡[° ûðÞF§6f^ž¨4 ëúÎaURCǵ²¼ŸÑ(Yu¼­jß,NT˯m¾P`3ãÞWâ>ý&¹š?0z^Ü’xµçó‘5;ø/̉,zbCN¬èæÍ1ox’q(¿ŠZÛÏþåÿþ' -(Ô°'0O¥ü ÛGŒŸendstream +xÚíRkTSW‘ª¡¬òRIÕzX%2yj   `, ‰¹7ä–ä^z¹¤D|PIU–EltÉST” +«Š@} Ô«0|‘VXŽƒT­Š€¯¹`]]¥?g~ÍšsþœýíïìýïlšG”Œ!‚°p(† “#ÁR©„Ãä™Í¦ÐhÁ8¬  Q°p¡Óî +Àæ y+„<>…‚±tŽ¤ª àLŸ$ñH ãˆR©‚PÃZ²†R¡2L‰À„ D X7y#¬ƒ3`<†˜@ˆ’áT¥°&5IPøoaH—þ.• ã¤(à5%“H‘†j ‚UÖŒì“Zþ²¦Õi4kÚÉòSNý%¯Ð"Ãï L›®#`H1ÆÑéÔXø­8) !:íô¬„Ph¥MÕÀ€ÁYÉd¯|‹#¡ˆ†¢B©*…&žÂaš®„ôoJ+V'yÿþµSÉ(‚цt°ÿ`OÅœ?bÒ$у6“ÍæDr¿;%Mk&F•„ ©€Ëó +W(ä‘9A!X`=©˜ÅD1‚¼Hgr€ +Ã)“ÿêÃ, œ‘1‰¾¸€•:9{¤{“Ø_Ÿ„éŒ\ÀàòÈV앾€Ïcçü‰¨Ôá8ŒSãCô.V!¤§0¬‡•ëMLé·õÓ}§·×䊫:ÙÓ3šlm?¿í”Ù9Üëçroü)þè7çmΟ"ÇJF"¿aA*^õ´(Ûb”±¶õ8[Ýèûe³*‡“g\.kký@{pÇ=ëâÁôFï‡?{>»›yÞ¾nõ}¿’:R8³æÖÍWOrÓ6uôY¾†<‡J(IegVï…åÿ¼[tuâAV…Y«/ÏOÜÿÌõµ•Úz§;í¶£Y`*“ÚÝ0û¿œÃ¦ëUýδÅÖ¸RA„L8{¡Ïuy¹Ø|èïaŽ hnŠ”þ:{ ‹.ð0¿ß-ÉÏ) •ÄŒ.8V᢬Y ñ«¦ÚÂõ­ë[´èÅ‚Áúµù.iõ\ÿbNzã^Úº”ñW´ß–ìœù4éÅ‹ÞçoLÔ–‡J£‡û‰±Þ¾3½¼‡éílªýµ/,ñ +õW÷Q`x¯Ã*S›öïýÙÍcR'¸‘çvóèžV.å¾p\»¯üoÒõÞß6Yö$Šõ6‚øKèÇý•þu©Åt€›œÐ›r6ú–÷åÚ† U!®µ3“,M¡¡UKšfc=Aó=\úÍu%Fõ.ëÅn}Ñõ¹lÞÄø¢ãBŸƒÝ/ý†~*‰±4ŽñY”k?´eAÚ.æƒèåFß_íÎGÖ¦:}kOZ~œ·lÍX»/íxMdÍv­á±`ÎÞc‚úG»òìsOEM?¨Êð"Pç¹éÙrzmÕÚÇ„SQÔ‹Ê&x¶¥ÅÑÁãÆLîÙO6ðüS_wYw¨Ú¸{ÓÃÇ·V.Ú±"tèïPÓÅŸ—ä¾Ù:Ú¦sp7µ'XÑ{ÇÌw~ìC[ÎrÖyúÇ}³4 …Zwác«Ö2¸Îªh#[ï]hÛ?Aƒš+µµn4Èmðr"ÕËên‘º~/yêŽZšÓMÛC ÚáW'«Jä¬ÜÁžU§|<ˆÕc•BT¶TrZ³ÜfÆ™cOJÜŸá›^ ç7”ï‚oWD­­˜ð¿Û5¡Ës½2RØñË™R•ôM‚loÊ|U–Aß9/«©«tS¹>˜áµõÌ'Æ/¹_65n¶™‡¯‘DAßÙªÛ·_w½.wÔr¶Ä +ôÜçGã:òíÞÏ)Œ R?CMKëÆôûëÂKûŽî¼”óa宗ܽT\òÚ6^^7Ôn[–x˜+tiT6Ö›ö\¬,vüX® ÆK£ó•m·“·D KëNìvØÁ9¤Î.îš[Ð> endobj -1365 0 obj << +1382 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /OICPNV+CMMI10 +/FontName /WVJXVA+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater) -/FontFile 1366 0 R +/FontFile 1383 0 R >> endobj -2096 0 obj +2126 0 obj [778 0 778 ] endobj -2095 0 obj << +2125 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] >> endobj -1052 0 obj << +1062 0 obj << /Length1 1608 /Length2 7939 /Length3 532 @@ -9527,7 +9686,7 @@ stream xÚívgPTݶ-HPPÉ™&çÐÉ™–œƒº–††î&K(HÎQÉH ’sÎ 9#$ˆ€øÐïžsn}ïüº÷üzõvÕ®ÚkιÆsŽ¹VmVF-]^Yª„p@óùž4`ö–Î(]°ƒ¯ÜEXYå‘P0†pP£¡O†P@jÅÄÄXòGw$ÌÆ àÐ×1ääææù—åwÀÒýžÛ(˜€íöà G8ÚCзÿãºP(m XÃàP€¼¦–1HCÀ¡¬¡P†:@‘`8@ËÙ³¨Á¬ (('ÀÀÿZ¬ØïÒP|·X²(€r„ZÁn·Aݬ Ž¿]<G(Ò†BÝ~`(€ 쀾í€9XÁ!¿ ÜÚ­9"·ö·¾[0- ²BÂÑ€Û¬Z -JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿‰ªš–¡÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† +JñDÛ‚Ñ¿s£`·nÂú6‚°rþ]Òß-Ì­ †9 h¨úw.K(C9ÂÁî·¹oÁ‘°?4œQ0›1à ¡6`$E¡nan±wç_uþ[õ`GG¸ûŸÝˆ?QÿäC£ pk> àmN+ômn˜ÿïA9X#@¿ìgÇø\ È? âø=3œ·$À„ÜZðk з)ÿ3•ùþs"ÿ$þü‘÷'îß5úo‡ø{žÿ­ä ‡k€ío௠p{àj€ßwÌÿ ¶‡ÁÝÿMôß ¡1üw 4ø¶ ²6·Rð üe„¡”`nPˆ me °Ão{ôÇ®ï"á0è­–ÚàŠˆüͧg ³²søÝôÇb\PÈß™ßÊó‡7¿ž†‘’‚÷ßoÓ?QZ·ª£õÜo‰ýWêÈ?¿1äänO^ ¨€WH@ôö° ĄżþM¾?@À­ÕÁh$Ì ðü¶hàŸÒÿëý×Êìo0ŠVÈï9ÑEƒ ·£õOÃo·•3y«èŸÓ~[ò?Ö† uƒZ|™BX‰¼LLIB—Qdt ( Ã?V1ñŸx£+w¿³^õ9’e‡Ð†ŠÚ¥ÍäÊu””7œœ¸äN­Ñ÷ˆ¨/ùŠõ.‹ú…'Ð)á0äPùÝÚ…ke ¸éÛR§ö ]8sô&sß±­|*åŸî#>cÕ¯‡‹úœ‚ œEëÑymeê÷AÆ€>8m„ 1œ4¬jõõr¦XÜâd8„²³¤¿V>M¼çÀ7ÁÜ&N\€*ÄJÒÜOµøï8•^Ýçôáö¼J%qõ‡ ‘®.µ&у;ìXBÒ0ÊÚcVKŸ0-SÛ·ߌG?óí·Eƒòñ(€(§¸Ëš’=´øô•ú+y\J6.æꔋ‚œÞ»ó^eúÞ‚·V„(õb*$Ã=AÁžéÌmEéïa9žoñ€Rý3™ÙÑS×!÷8ÎãÒ9‹ÅÕçÜrƒÅ£‘C™Äù\‹-ÕÕ²k±ò¡øáÃÍ8 @@ -9559,35 +9718,35 @@ QH; ‡á{__bçâ.°ßþºæó}<¯½kb¶Þý9\¥™àpDË\TL[\a·¿«NüÆW¨œµ>¿¥t®tÉQÀRD‚!$Dr£G¢1¸AÌý¾ ¥Y í–.ç#_©ØÉ#¬w¥Å¹ò«|Sþ?Z:è:”—fÆ×’¸ʵhúÏÈ×XaÛfÚœ¯Ú3™B¶“—£Ìü¤‡uቇôä·ÏÔϾʉltãp)’&ÿT+p•°e –íZ­M31I¡ÒÏL«êÈcýªG’«ô"Hx¾çS•ö$Û_Œ*[£n~OYgÚC¢ã® ø LóÃI8GU–¿Bã¡\‚–Ÿˆ{éõ´Sû›7M‹Š–…;ûÛ䃵h¹0GQœ&÷ <‹"œ_ý¼ÈAze‰ÀN2ÿPÜJ"u]©¶ÕLòs.}æQùü‰iõHö5¨ñ‹‚‘öqLðëƒýUj[’ =Á®…1Ñè²YÆHOŠåoq ’„!¿‡RÒ¯¸ð%ê«~u¯ ³¿0Š×·6î;>nE=m½aÔ\{\ÄcïQq”&T/bµ^þü‹}m“¹ò A’ü陈×O/ÍI>c×b%ÒÌ&ìýºªú· ¶mJ;û7žb{ª6eC‰Æô_è<@ÀbW’+Q'‘šäçÚU›‚ݧ/ˆ+ƒË°a*¦Ûåõú/5 JÔ†½ó'lï 0Kf›/Ð^‰ˆÖ½žO¼¡M [If§€ãC `æÔbï1}ÚU*÷i g#™HÓÄ+¸"î2X|F#êLq¶ÀØÙªþr#g <¤þdÑ _IÒõ.˜ê¢Ï\9¾§é-xÚÖ-9?›ìÐv_ wóý}¾éH`…Ñ'>Êß4¬>äŽT‹¬ÌÛúGäµGÔà…$Í ï‚7LI›u`žUJ2ì„΃79ç¯~f´lá­ÊΚìïW 5?|¸':U—.ûrJo ÇÓlÔË5áAÜçxE ³º×ا‰3Ç•ÚTñ#åKþtâ•.iKW@ö/É›ÔÑ÷ ûj&Q ¦Œ²È˜¥t°Èð§Äh-ؤ1íý b?e¾™F Š– ÉXrÙ/&Šjz©¨rAÁM°re.2Òe%ÉÍ£™6"5[¹(H4 :\mdb“™[i:ýP½2“¿Ýä÷ö0JÑ»pÕh¯QšQ¨ý±Qó_»Ã7;mþã«÷Aú^ÁÐ; Ó èvñ¡Õñ¥ã«*’Hóß¹,QëtT½}…ÁbWý€g”ùxÔ$Ó¬GÞ×™®'}¡uÞói õ´’D§ùõ; ¼xðÞÔ¡Æ°~. °öâ%ÅÅ4O”˜»ª¡ Þ»Bï­\ÿÆÈæ  -†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüì|*endstream +†ìvm…$t§³ÎLd?莑ˆ+í–«I&VñZ"-¿35MGöÊìä§7À Ñ4‰>ÅauA×W¯½r‚…`Hã×W{Ûw1Û®­¹E¥^["W¬%BŽ… >«íÜMÑ#nNCuy‹¼Hû %Tž,TÜþ0]4.ïdîžk0œPañœ„5ðY ÓëF–?ªU'?Õ‹«žäfü¸Š·Ö¤qCr®až1j,†º¿÷2Ó“=²õáÿ¶D4ÏØeÊÀ¿I Üóv¼vþ´b„dîÿ¼ø)xý)\+"oÜ´¦ÜD1å[|)h$úØûeGUeŸ?õ¾†Ó<åízznKB†Éd–¬ö…Àÿò!øÿÿOXÁ¡`$aFÚüðI)æendstream endobj -1053 0 obj << +1063 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 36 /LastChar 121 -/Widths 2097 0 R -/BaseFont /ZKLPWP+NimbusSanL-Bold -/FontDescriptor 1051 0 R +/Widths 2127 0 R +/BaseFont /TNXFDF+NimbusSanL-Bold +/FontDescriptor 1061 0 R >> endobj -1051 0 obj << +1061 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 -/FontName /ZKLPWP+NimbusSanL-Bold +/FontName /TNXFDF+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 /FontBBox [-173 -307 1003 949] /Flags 4 /CharSet (/dollar/hyphen/semicolon/C/D/E/F/G/I/L/N/O/R/T/U/Y/a/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/w/y) -/FontFile 1052 0 R +/FontFile 1062 0 R >> endobj -2097 0 obj +2127 0 obj [556 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 722 722 667 611 778 0 278 0 0 611 0 722 778 0 0 722 0 611 722 0 0 0 667 0 0 0 0 0 0 0 556 0 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 0 778 0 556 ] endobj -1049 0 obj << +1059 0 obj << /Length1 1166 /Length2 8309 /Length3 544 @@ -9600,7 +9759,7 @@ x r¶Cž! s{¦îâèhY¨ .Îæ (ÐòyeÿY(îàèá ¶²†é4Õ´é™þaçååšyü…%@P°øöyà ²spü£Ò3…4r~^´Å¹*–¦’`Øíé¬a0G>VVGKSÐsŒjÉÁXéŸ* ±w°ÿƒ øC3 °3Èü¹)Ö¿ëf qpƒxýGØ ±ø³% GVMØÉ$+ñ?ÉÏ!À¿bV ›ƒ—r‚ÜÍ­Yÿ(©ááúdÿ#l -±ðörtpZšÚAAÞ`KÐóà5uaÎ. o¯ÿø÷€h6‡Í@VÏÛð/öç0ÈòsES˜3بÏÆÂÆÆdûãÿÏ‘áó†Z8@ì<þ•®dj²Š*ȨÈ)2þ½÷f‰‰98–D2ê›-¯X 2n‚LñK€ú +±ðörtpZšÚAAÞ`KÐóà5uaÎ. o¯ÿø÷€h6‡Í@VÏÛð/öç0ÈòsES˜3بÏÆÂÆÆdûãÿÏ‘áó†Z8@ì<þ•®dj²ªi©+*Ê3þ½÷f‰‰98–D2ê›-¯X 2n‚LñK€ú ÝØ)[7q\ä딬Ÿâ}2Ç”¥Wº4BâÃ8êÁø¾d7z»{NÊ/IÈKsËQ•÷fèy eì|Tù^N ~“`³ IA“k¯¿¥•ÓC«?¸Æ-oÃ1™žéÃàö –ÀªOÌHt‹ßñ}n縳.i±¼«tÌå–ã4t\dêÍFÔÏZïÖEη2Úú`¿Lè-Š²FsŽ]Ä!JÞlø*@çìwÓ>ׇ&ª©æˆy²¥@¥]kU>=­rEÞ-çŠÇ™°V£¨ÙaQmL1!h²R%^×àj¸Öl;ÓÛì^R‹×5{/¶ ¸»ßËwU°s:NXµ‘÷ 8ÆßÆûOvj(øÏñTÔ¤\¥+Ö#2\…¿n5;ÿH¯i}¤ß®£Ñå~º9$m`Ƶ'4É)ù6b›•½.†eC[•+ÚËG}*”µ>A¼­dÏGæjøf¬%€Ê4ìªÉ$›Š ÛwÃPoÄd‰÷ú´ÊÈÓƒ8~Gžõ‘÷Èe¦_h‘Q¤Ç‹×g\<©‡3Ѿ¯òJ­’ûÁ«‘e‚gìº N¦bŽO+ÞÀ“îS­™c­Hœ4ÞCØKH÷²m:§dÔ’ÆC»t½€!…Âæ©.—IóÉ^!Øæ¾ÔD’ZÐZ¢˜ÝËMïQ•¦ùÜȇ®CÄTÄZÅ‚zŽz­‹Ä#EÄ7ÏLm}.éF?:ÃÓ¬v­Ä3*ŸH“¾˜sLfZžÓ$Vf‹B4®»%DÚ”6òÛì!Ó7ôRI¿S{ŽØ¸Õü ØKÒG;ë¢Od€V@Sp¾¿–_Û«°ÅníË5n̈XÛØ~ô¡ ½ÖRb…LKúÄ6!T²ªNËg¡å‹Åí„\æ |7AÏâO“fgYPg~ø¡õ´Æϳ譑!†Øç]äÆÀ @@ -9628,106 +9787,103 @@ s Ëȯúô$ šü=Z¤ïs£öjïM ­È"±óBc!¤d³£©Ëb”ű‰„g²@›€³y‹u[ñBQÊüñ‡2+QÉnÎÕ…lÍ É¬Ë½p¤+M)zÙ>û!Ÿ>ÅÏ ¢ï,Ý™Š£°ƒûüµ±ÒI‡c&”ü¼ün®'ñ°~ÅH¿ßýø ‡é+RúŸRû#Ì»’ŒŒ[È1Z‚«„äî<úüEþ„þ'¢DEPˆ¨½|”‘s¼j#U(»1é·–½,ÝÓ4Ešç×Ü WŸuÓ‚S{:D¦àæ }ª¯ÏB%Ö^‰$—Y –Œ8Ǹ %³šc&h˜!ç¹ÙG£ÀŽ–+([;3ˆý¡ŸA`´ž°ç£G°øªlV˜SÞRÿS”W~V'¦—,É*ZÊÿëH™­ >FþrRZ§³¹™ª$@!È¿Æf'%N¯Íqg'á4¤ÄÛeù+¡D‚A¿x0J1»ôÖ©Cøp:©¡Ý69‡Ñr;âš>ã|º‹Úˆ²;h“Ùé gÖÐŒíõÒ½Ó’iH)è¿iŸö&Iû RKÈÜ-‹Åx°VÅ Ec°ÖH·1ÁïX™hF¸íµnQtCç¬``*s¬Räxƃ<¬ˆI·$¿Ã“,Wp¨þ>VDI`×Ï!JØÁÁH¡aÆJC××J\ë(üÕ7“íÿòøÿÿO˜ÛLaö¦Î¶/gæàüÇgR€ÿ®äendstream +Å2ÑÈùðîì”í êzTóM¥ŸýØc¶ªáq_Ø™­¯cr¤&®tƒ9ëàWüéâõŒK(ÅðX02†å_-x¿ ¹”.?Ý7ÒpÒtÔÑ\»d»9›5Ð~錪ò$õjü2r‰7NNï²Ú°ŸD%DPüyýôG]4йˆñ%3¾j)þäÖ NŒ`¸ÝÅÁT„wÁ_¡@Ò€îz¡yæNVÈë9=-á9rEÔ”#Ï3p|JÉ–2ÿGõ¸E¯§sÞL]G˜¿c‰Š³ˆìš¹äf¡8RâDÊž Òy—gìn›01-ík*l)o ùˆÐÜ/Þ³¶U&¨1à#ö-©r\+çUIufÁ“$Ž¿?ãÉãÞ¢I}gu?rYREÝikoiï}ý"Öˆo’H†ã÷ÊÁ©ãš”©¡bD˜2¾pòV…;YfÑÿà×C®ƒñÕ{Š)BøÝîO|ßÃŽý}àãFU'~Çq-m%ÄÖ´½è$iÑü’¹9¢È`—k˜Ë£öeƾ-kØ‚.ñ>s¬Räxƃ<¬ˆI·$¿Ã“,Wp¨þ>VDI`×Ï!JØÁÁH¡aÆJC××J\ë(üÕ7“íÿòøÿÿO˜ÛLaö¦Î¶/gæàüÇgR€ÿDlendstream endobj -1050 0 obj << +1060 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 2 /LastChar 151 -/Widths 2098 0 R -/BaseFont /ALHPJM+NimbusSanL-Regu -/FontDescriptor 1048 0 R +/Widths 2128 0 R +/BaseFont /RVSMMK+NimbusSanL-Regu +/FontDescriptor 1058 0 R >> endobj -1048 0 obj << +1058 0 obj << /Ascent 712 /CapHeight 712 /Descent -213 -/FontName /ALHPJM+NimbusSanL-Regu +/FontName /RVSMMK+NimbusSanL-Regu /ItalicAngle 0 /StemV 85 /XHeight 523 /FontBBox [-174 -285 1001 953] /Flags 4 /CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/zero/one/two/three/five/eight/nine/semicolon/A/B/C/D/F/I/L/N/O/P/R/S/T/U/Y/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/endash/emdash) -/FontFile 1049 0 R +/FontFile 1059 0 R >> endobj -2098 0 obj +2128 0 obj [500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 333 333 0 0 278 333 278 0 556 556 556 556 0 556 0 0 556 556 0 278 0 0 0 0 0 667 667 722 722 0 611 0 0 278 0 0 556 0 722 778 667 0 722 667 611 722 0 0 0 667 0 0 0 0 0 0 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 556 1000 ] endobj -1024 0 obj << +1034 0 obj << /Length1 1624 /Length2 8579 /Length3 532 -/Length 9445 +/Length 9443 /Filter /FlateDecode >> stream -xÚíwePœë–.Npwkîî îNpo Fº¡iÜ‚ \Ü!Á îî4¸CȽï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}ÕLôÚ¯¸dl¡Ö E(ÎÅÇÍ+лX{¸k@!ê\²Pg[-kg0à Âdb’ƒ€p0"„ƒÄ† [€<ÈÀÏàÃdÈA]}``{8€U_׃ƒóŸ’?*kŸ O–î`{€ùéÁä uuAàOÿcÃW îØA9-mcM%«’¦>@ Á€Îm§Tlê`ÄÄ°ƒÂÎ6Pˆ-øOjîÜO\2î ÀÝd~2yÛ€\ÿ@œWÌìîþô »ìa@ü©p( ±qö°ýÀ“ÜúW@®0蓆ËöD¦ u‡»ÛÀÀ®pÀ“WmyÅ¿ã„;á|»ƒŸ`ÔîIÓjãñ'¥¿°'š'CÜp7ü/kÀìîê ôyòýDæ -ÿ†‡;bÿÏ80=fë rw¢yâþSæ ø/Ù]]}þ²†þ¥õŸ1€áî g;nL>þ'Ÿ6ð'ßö`&ÏŸaQØA|¼Ëm=\ÿy‚`ˆõÏÌ°=´…Bœ}¶ ;LM(üÉ%€õÖeî_“ÿ -þ·4øßÒÞÿ]sÿµGÿåÿoïó¿R+z8;k]žàï%xÚ2P€:àÏžüY4n ÿËèvöùo¬þUÑôw¤ÈþSŸÊ!±j ?7ïßb°»"Ød« †Û8ì€ÎOÕúK®±ÁœÁÐSWÿ*è“/ï¿`z`'ÈŸò ý ¶ÿûS£þŠœGAAOÍؘã¿Û­ij?Í\ÏÇø?n 5 ¶ÿyøÃ#+ õøq ó¸øED¢‚¼Q¾€ÿÆã_4|ÿ³ß]¶UÙwºHY:Ó@'ÔÏÙ¾¬2·‰pì„òX”àdÆùΨ¯£˜óìlŽèèZ|ø…F3Ö&{vzËüܳ0˜˜ñÆ7Ð&½þ I;~#amÑ÷Cæ”ýÛ–ÞÁ¯ý}ç¨_¶©8rß`0Ix¢à0Ç»åRI™èWøÅ0¾T&À2K‘cXöà ŒñC¤[ÔÉ¿&˜,£u®NKz½A„þßlH‹µc@™ê -qh<ë/=íq|ÜÞ>“f¾WV “Ž]m(;Íe J[<ÃaÃlœùb\¾¡ æúžè×}#-#ÈÉq©¾çeÏ[9Já¼ù¢_¸ØWaøáÖß -ié”ç-ÚX'ÕE1xãÕ^r%LSõ)çœ+眛 Ë -õÞÇÂ[&Zêy#ƒ0Xæ]&òCO#ÅÛ¤ø²¹2Eí úIlºgÌéÝ·akÃÎÇáòû¥Næ ´ÃöÚ™5ÍËÓV¾“/M,-±çDÇZÛ>Wk˜DCÏ7rRIÝŸ’¬ð1È‹diøÚ¿Sü€Ar%çÎ{*“AèÊôŽÙ.… ®mÏ«Í–ÐW®ýkD -ca¥ˆ:ÚŒás#ñ€îÀpolí›ò¾°ÍDŠNsíò2¸‚Ö#Œe -·&üÖ!Bë}àBA¨ÛÀΡXÐm|¢]æpvKºXKõ‹•‚Eí3MâɤáÝìdtÉa~´K_\ â4HÎý**iœ·É\Ìe:ŸHÄ6]«W•}]¿­ÑêS%S´w< Ü‹åîOìkkQ^¸ù‹Kû`ïJí¦¼W&MÕ½%)–›D6Bc<\ë¿ï’+8H„ -uŸ1Í‹K -|TúÁ.øó-x{dœñØZWäû¬eÙ—n¶R^v&ëgD& Ê&>2P&õ£±•_aG*Þëýï°`eNNAU{yßÅi\îÓÇê#‹0xðØï†×c¥•¾\ûõL$ü•ü¦ð·ÒæªØ,ªl'<]ÔLI½à†ž­Ñ¦°¥ú_Ûµtk2aÁŽ§ØÚC~4¶âµm1²¯I+ðí^a ¤Ft(†VP É Ç[è>C×ÿ:_!yà»uµ ÎVfVúôz–ÙÀOX¨{ëµW°{מQcVõª)ÝŠ…?÷dɱ8~EÎHo)3'ï÷*Ò]_™¾ÓÄÔ~Ÿ®vx¥ÞòÊ¡ÀØÕ&˜žØHHyÛbœ6ÅFÝM ÆèD,y5¨˜ ß~2‘{Yî ”±¥¥r¢­ãÉÕ>»8Ÿz“ –R…•RÒõÐò˜ç·ÇoÐÁÀTÊ]ÈÂD9îæìðêàkÎdߨ².pÔáò[ ¥`«Ë„‰ä9“2Cƒ‘i‡“žÆáWö.—6Æ™ÖE(}Ruã̱«˜10Ë _S0-ÏkH“¢JéG³ÂÌV³ßz/gѺÇ;Öö#ejö¨0Øt5¤^yE½mqÝ(X q(Ú2”*n#œ³tWtV¡èžã`Yõ±Á±º l/W¢Ù©kü:e·´\úö†K+=à7éë¥ý7§B´ÌYUÄØŒbTáœü"¡ o–ãú£ùwh rU ‡¾á%y›?qp©V«?e4¯Ue iPŽ—YFüF$Má…­s¥E>œŸ²G»ˆÏIÝ®6‰"t:Jí¿Sy“]Åá·IߠȼhåiÖ'«šÜÝ_Û¯Abí±šŒbuQç“:)õµÕÃR)Xß–j“rJ=Úð†6þÒË+ï«‹ jvð©´OÞ'”¥‰änÑ ›éí’Lp¤Xk²W:=KO$ÛÝó#VÅ­Ý Gèwua[¿ÍL5DIÊiÜ·Bj «½x[$K@"šà­ ’ìeÀ¸„^Y·5o`f^œñ2é…ÎXÐï•rN}þix—PÕÊ WõÀÍê݉ aä{âÕÃÄ¢%F'SÛI-ºàLÉž@«ò­Vê–¹Ö‹y+ƒM"º%ãÁÞ÷d¨Oª<ïË5F¸½‡·¨t'ù :rÕت}O¥nÌåðêsú|I5cd ô<™Çë,©ŽO¡ÏtûgM]O ááÓ÷ƒ™YÌzt/xßõk?ÖH¬¾·ç±SÅånÍT3‹št:°#ž'º -ýL?ë´êpUn¿TöùVnEÁê?Ø×_¾´pãúâ`(ý”b z@¾‡ínüºSw©õÙ,"ÃeçÝ4b‹x™-R†ÁÊÚî™â “”„üKKëšÄ¶´Ÿ­äü”Fõ.Ÿ1´c~¯U¹¯M]p¤)ûIoΰ2$Z`8+B5®Óµ³ÎJ}ô²?ä\ –³[¢›.ü ¤Æ°Yd¶SêZDh»¹áYºœü€~IÒG>\ {áxÊ/õÉ®[ávÅË/¡‡')Ù®oº«;ùqÄuj 4Ö„bùàgÈ•ÝçOñsÆJŠwí^ùÏõ £†þè©ÿj/(xý¬Úñõôó//]ÈÝÅüæOë~Ó×ʶ•àt`e/ûïè ãûcOû) …WU/“Ñ‚¯Í–Þ´Gù­ÙïÜwTîÏW.¼)ð—«{žÿE4%ŽxôÕ×ñO‰Ö¡ìѱüBú®^?² Ò7Ú‡6i–”“´šü»;ÈÂœ{Ô¯6-®dó7 -DŽãlÀŸ_¶—s@“Mú§„ây¬ödæº/ŠP‡}øe(x¿ÔR^¾ŠÎæ -5ËéZôO±N>%¨ˆ¹aâôOZ3)€å}íÖN¤§fQrÍ›d²~©d›Ã«°]µmä_—–õo‡öé´6š·§¯t`0ˆ'¬bXšz˜g­âA;Ìƺ‡:ÄŽ/0´ ³’YÍ“Ó^O¬œ.~èÿé“1 m«ð(¦Ìÿ#~+ÿÄ@è…†–1‡¬üþÖZš‡ÑÏMŽc…#ë,…põ «—½ ãQ›q„~ݶDwRÉ­±­ðç}ˆãêЀlqâÂmƒéN¡òºât»ÉÒy•qÝGŽó©6ƒïXd,7DýiF}/JáP*Z°ýƒ[ïÊñåx´NÞl¾d¯÷ÝêèïM‹Í¼:,ýdÅx#µÅøÇ—ÄæÂч7jèÜÛÓáöâ¡Ï˲¬¸x›·wê¾Â'_=Sz<Ï,NîË!É.öš«çY¢¬-j=-¨¦a”%m].'Û¦œ|ó+êçÞ Û!)Žoh\ð(~r£hc*o±q× q+fõ³ïóäÒå62†™·«ª vVij^×Lb‰—'ä¦ÜÌÖR8ˆ -à–¨ÞÏÙCãr±`Í1º'Þ3©$.GæEHÇçʚʗrhüúŸ·Òb¥éuž!&¨qΉ6öQnªÒ$:ZC}˜i%¹Ê­»ßàÅË]¡;J¤ü¥íÄáÈ¡¥æê?^0ß-±9,ƒÖ?¾oŠ¯*4ë™XÏ¢ÔVúåœó5Ë%`*fÝÓ áõ €¹Jx¬ŸÁ«|ÉÜ-MW¸Æ1–Máù*ȼRé¹!;vúŽËE”¨Km+F´ˆ´zç*ëئ‰å›«ŠÍ5¥êi¼Áa}4ÞU•Õü<4·ˆp2IÝb“I{Ù·¥ÙGL‡<‡¨)L™¼§6<{OÚ‰õJëù‡)=Ž`W Ti+Ô/ëy§Oul3`C¡Zª¬8Íçë)ƒz5f(mNnLe[C~‡HèÝ:«é3oî=vc"¾53b/Ba•Pâž‘Á©gtgºeغîõ`Έê;¶Õ$´T¨z‡Ró™Ú$F2æz__híÜže .#‡9Öžc蛫w¿YøIoÇÑÛ>;V;Íúå¥~$»Ï¨AÒIK(¢Û³@Õ0¦Ô£20¸Ê )$çÔ*í> Lª×5z(Ro,ÙõÝ#ÿ}àQàÉçÙÛy\1°Èöºc.FÚËcuÉÎÎý D­P”0Çj XS;ióé,¶hqPÞQ×I®y² Y%Ó&tÅú­;ôþþ ¹„ÙsQdÐ+-\yª×¹L&¯Ÿc݇)ùÈ69ëzTê|øÚÞo–ÖÕwÙY\9C -¹oú•ÿ™„WÀ ßóÇÓNV]UÅw¥Uf]F}å'Æ ~’Ò›Xœ#Ëçž¾cvB¯W/¤™iÐÂò:Èû°?¥Zï³ÚÜt!r¨±w(P¶¨^á ô Û}3e/¹N \J¡ñ¢ufý\˜‘ãLT(1 „™YÍdãºIé;o¤äú9oÒ>ÒçMªá8rCŒuÁÀ߉DL6¦ëÕŸ¦D¹í[v¿ 8½£ÉICxY'ž%¸)4ãl¤Ã!þ"2J)/E¼4²%º㉜Ɵ1gr P -×¢<Ð;’A m&%`»‹ý,]@QwÚÛ²R×jArÝ;Â9†¤q›~ c<Ÿ;–º¬#v·K÷ñI2`=Ìáä4 H™óÔ~÷ïAÀ–fZrëÆ)8UFžRÓT*¥¸¼ý  -b&c,±í™Ðò´6@ýMãÇlå‚¢Ý+§¤õþŠ´JX)Ò~Ú ®~_òŒ`|µ*ÊOw`à™]ÃtíÓ?³Ý…‰ÎZÖz¾xï¥ÝQøP&_DFáî?¸jÂÎóï¨Ùšø•À„¯çäHËlÅוäÀŸ/¢p«·ýj/ -¿¼I-*-]‚×X![0O²h¾µuí©±°njî¼Ùõˇix6·ÇüvàÁ~ó©O‘Àù‚˜lMT(Ûf™)Ea¡ -«f\‡Ð¦¡$ƒ±È=Ñ3{UvŽyo{VîÏë ù P`üñŒT¶Ve¤âZ­²<§EnÚâ)ÚQû´%¾ ¦¸7ïI¸tƒæ¹H)w)I¿¯r8Ú'‰uŠ‘VäaÊ^äZ¬Øy·ºÉ’ðô`ù³d^z¸)Æ6Â:F´lÙGNŒî;T“Aß<68açÛœ\Í„˜P&-‰*Tù–†‚û9n‰ƒMŠ.Ö _®¾˜ì»[tTç5u|e±ô(z¿‘1­ÄE¤m½9FGyü…Çݲýu %b«º&Ü“k®[“Jf—õvbè,úS0ëò£KvæOìÂT€l,Jc§wyÛezŠJ{ÍG¿+Ö¤²)¹¶Ú¯ã5ßõzÕ~^Ñ™,UËÜíj4¤fÒØÜÔ–Ÿ"^£Î|ÏvDÿpï2®ÀžDrng/ÿ¨F1}ël†±ùÝ/àíÀÈ/þ€%À!yjå—rG?v’ŠÁ÷ão¿1ÎÞVlJq§FÅã®|‰ú^òñ{¾°ì¤&>M†J|)§C'[¸@wÑ„¾»üë’N¨€‘ÇA,‰MÒ[PÊqu RÏëgì N™*>rˆÞÌþs“°Š¶ì×,¹v¸5½âz*¬Çsu€yÂ<·@t%'ºÎ)>þ÷k[1ÞyãçM–i‚Óµ»ùêÛ9ûÙhYéTŠDá]ô-$@auS¡s™ -wñÈ6úà ”mÕé²ÂþYTñ0¶ŠŠn˜ÄVûÄ*ª¾“z<ÓËåoœÈ-ÜÌ€9ð®Éü̸˭ojÊÁª&ÁU/ðޭ목;íNˆ"ç}%éÁ´ä}£‹>òΰLžž4^ùÂí°Ä`üÃ\½[s!ªÝÎLð.ó¦ŠÜlµ ò"±Úu -Ú匓$S¢’ 6CSûT ßé3çDIЩ49VTÑÞê_Eb:ÚÃæšúa,M[a¥1a=“Ûÿ³6]<·1Š\KŒŒjì…¹¯ònð /u Än锊ê&½7Sl x±*#Á ÆxpC‚yC[ >F=ÂT@Dæ©F ¨j`ŒT-Fbj ×t0ÿJ"Ã.c0@mY{PJ 5¤Ì'¶WŠô(æ -w:©ÿrŠ®­|¢©Â¸¦z$:S÷5ýe!Óné³úÇÈ‚®¥kîciqç`“&"Œ»ñ¯[’¿ +Þ^aæ’W~Þ¸‡ï¼¾L¥ [þ¼RB ¶¸¦ÓP?¸O/Kch™iÆìɶ69eý«Æñ0C¯zÚV»\€3ÓF6F’×PK(Â}<….õñG¢7uª–íöx?Q:¢/³«¡ÝUf7ù0ýÖgß´—-hyŽéT¤ÂpÕ äX´Ùð!Gf“$~°Úù‡A—ñÃ0¦é!Áy[—¬Ê™kØtó̸Ã[x-¬Vgûi æ_£,îiH0Ÿ9´>fDâ´¼µ¾éþ…¯P$ÞÏa$ùÁÌ È«×ÅØ¥p*7'ZtÐg;9N{9*Z—ê^‹Ã@jò£ -É]g¤ÌÒìÃ<¥)7‚Ñì¦aìnd0² ã‹ï»¡.{tm)«ÿÚ;ðÅû¥™¢ËÀOû&*‘8$nÎ ¢7ï A -/TÍ®vi6Ð9¸Í>4â|ßï½@G_C )$œôÀÁ¡S霿<+sK…¦–s5KÃóøêÄ寶Pþ}JýHgëeC÷ÁUf2‹ïU ¦(^9g­5Þ’‡®?¯¸ËÎïPrtAFžÕŸþzo…‡“Œ:¾æ$žýf¾ ÙéÝ›S”¦]¾‘õÉŒ·‡¶3­×žÂBR­Ì]þ -诮ñqÂmdàÔ`7nƒ¨RWºÓE[œ–™Ù6‘9¶?`ƒ=p®ç3Lã,oئDLß÷˜¯ÙTýŽ§Ý¯eW‘öîònQÆ—a)ähF%ö¤5ÙÍqXÒÜâDÍPá±S)ô|ÒÞôÔŽUYïÃÛ›ær¬f~0?rén#º«mH¼Ÿú„Âl#¦u¬…85ˆ#FìEeU§ ¼¹Ô_ k<ÿk¦°ÙbA%R7@"ÿÔ÷»Â2aë}ñó± Í„½![/©¬‡DpÙn/Éo ´=ý!"o×Ï¢ðœoâ}Nó’Ïúýk'´$ó ’;ŠTÅã8æWÌuTš+Èó1pT>×v€n -^õ,mÝ>µsªÇÍóQ™“™:…&ÚÞ0Å(ÛHj…`ÌðSòèí$¬=Ý3UÊõú”ûµ̒yæMŸ"¦*lÊKÓã)¯ý¼ð^lØb$vÖˆH 0癥l{< -ø_Ê'Œ.ÌGöª‹é–Q}é•.t(f2‰ûjéŲ¼[Õ -§m#dì^Àz#ÎHc3ŒÕA›Þ@4ýÆaù ÃM¸gGs´+l®ºhXÉ¿N5ÙbHË5toï<Ÿ¶¤UxÑ£(½¶§b^j -Ûó–ÊŠEVÛ*l‘(¯;Ä¢føqOóÊE½WÇçT(ÝkEfAó¼žýÂdù’†¸æ¦n®»Æ8ô¸©%ê XVŸP®Hè¥SûzëÈÑT5JÊ»khOiÅ©Sá[$#þÀ~yÖÓ àŠuq~»ty5ÈßZäë¸îE¡Í ƒ£ç<–õ?ž|¡ÿk7Iä¬óX‚Ö†¯¨Ãw¨JÀÆ!¶vŸ]@ŒÆ „˜ì¦{SL+SªÕT5ìÊnÂI’8˜$ØÛwk:P—zŸm”ñ¢7dTyïÍšVìL~åò0„­(ÕC‘¥H›â{*SniNƒ;о ¸î -rW²tˆjêÏéIœmyhžrñšxÓÍΔ{.2û˜Ö=2£&Gl þhÕuµÈ}«ƒË±GgYúô‚á1*ëlänȹ¹YEÒºOúʼÓ\/QÐ4Çê§ JLn%!ê‡-ÛêÑ–tzŒüâ!rÈ~¶Ç*¥ì”o‘‰šo6õÖÆe›DÈ7äð+÷&³áøÚsŽNvÊ0± -¼õ¥¦Ø[?°qI„Kõ⬟5~•)ž¢7StûŒ•_ÑባûŒÒOLû-ˆè•ÕóåÉú¹@¡dÉE’]_VJDù»ýõW……¿].²dt~ˆ˜ˆ ëM„í[z:ð1¼meãðÎW &If° ânË5èŒqJ ùHçq$?HÒàºN÷œ³ÄtÉÕ¶øhÎ=øi2Ó1\‡>ÆQºO€Iep3ó¡5_€lª§~—å6í×ðnþ4à ;h·M±VH½r4­ÊvV & ¯Ž¼ ml߇K€#×?xÇ”³îL3sÆ™¸Ö‹ô¥{Îcj+;ó÷ˆ™¢à#ÃZIü7£aÛG+ˆñøÝÔ›QEíÀ’¢#­ƒ™)­ìÕ¼`¤øÍíø´) ’J±4ŽL_$/Ö.,ÇÑYéácòwjÖlžvÉ[ÓáþhÉðþð‘æó|[×L.6y¾WLMèJÕ€¯ŒþØ;©>âÏ  ‘Y‰è4‚ïÓ+Å·®‚›m=Ø”°YXÓIp}å°ñ YÙ߉ŽqûN<Ëúæ=´ûÔg·>ÚܼŽq9ºT†¸ÃèGSyçm÷p0ðÞû[  ‡s‰³3 Éî%ø¥/ÝðúµnAi•wÖ,[é5SõˆcÜÕ°Öº×èÏÕÇFÍ,Œ;nòAï-´´€Ä߬ug¬À!ˆ <*’Ïã´ñ—Ü›£D•îÔO/ý-?*¹Ww×%sUc‚ö6a u¤´ƒ·¶ªVq«ù|4F;2¤¬«šßh1Î2éj˜ô÷8æºÚÀ¤¨Ä•½š:q‘— 8roBÎJìÞÉK<<æÓ?6tð4)=Oö¹nÝ úy33ç4ç«"s_ʯrXZœ´¿":¿y€Ø`eóúþèÇi™f*õÀdP[S Ú^D$24³ªSpÙçr«u +¯X£ð\½àá)™—Úùìû.¹ò‰¬vY·S‹È¸w´þÓÄœŸ£ãì/âìœb†Î#aÂ]ôG1ë-ñÒ8;iµ¡ø LÃ,c¥&]#¨£V¥¨wʈտ™f_ŒWi—²]Šã—â¬3—ÄGBßèòQB]Pö½!FUßs³Ó¨ú­™¼‘JÂÀFGí -†Þ[ÕñºòŽABjÙhaLMô\¸©·UÇ2lucJQ¹ô@!5@ç;*>ƒìïâ _\Hñà‹Ea{¢ê’7ÎV[ˆso'Ƈ.–¼{èãrœÇ<˜Ê¢©5û&/gý©~ò†…p´F7Û,‹™éÞ& ƒ–PvZœÆé<ÙX<Ç~ÚñDRx›±Î°mé¿,œÏxIÀBµüïgE/Hý£öÓçVB[1úüû¼×+,(ëÈj‘õ8¶DšÈ1éV%á*>ºÑÌÏ-ÉbW®V§…* ßcoÃÉ«Šx›B¶>GžÀ>­š-QFÜHÑÃâ•°8ð8—ÿTO¼VJ›Jfo!ŠËKÌ4,pB@<ɵŒhÛ*ô¬W¤ˆ¿™Ù³[¯6€œÚ§óªE:§…¼L¤åê•B¼¦aíe®7·víÀe™4U8Žm]èÝÜA±ÁYažr}‰Í#1ã™Ûµ*j”ÿ ÑŒáè+àu–L _#Ƶö»Ìñ˜S}­—qmm(›1öÑà kªuÊ}$ìL„_hH÷,½ÔtÚšw½álœADöâ‹Ctkôq¶ÁîV1)Òö" Ô»gFbØ_ p(xÿ—ÌÿOðÿ3ƒC]€0'Ìÿ_‚*-endstream +xÚíwePœë–.îîNCpwOpw‚{ 4ÖÐ4îî \Ü!h€`ÁÝ,÷$À½ï™3uîüš9¿nÝ®ê®ï]ÏZÏÒw}ÕŒtZ¯9¥m V ˆ Œ“—‹G  v¶òpW‡¸¨qÊ@œl4­œÀ€g@ƒ‘Q +ÂÀ9 $0Ùä@Ö>>¯¨¨(#@âêÛÙÃ,z:¬ììÿ”üQXùüy¶tÛ¹˜ž-·öìÀò?ë2׿¯Éÿ†ÿ[üoiïÿ®¹ÿÚ£ÿr‰ÿ·÷ù_©<œœ4€ÎÏð÷’Äþ|WØ^[ø +Y`Šù½'‡•”ò7;)uƒÉ5ð{yi¯ôlVÇtùŠ°ap™$=Ú¼| ¿Ã2¥ÔD$mCG75vܾU‘'Ÿ·^¨%Qëê>±Œ­v¤i¢œÆœ\DÅæ$Uyœrï…¹Š]îI“°pS{ÕZXÕkÝJ´ÎÈw\xTû ni¨ õà=7¶Yˆ}Mäo“ÊÊôA6'¨'qž1§?õýµuÞ†mŒ:‡Ë]”9š5ÒŒÚieÕ¶®ÎZúN¿‚ 4¶°ÀZ™hïøT£n q8ßÊM#ù}J¼ÆK/'œ­îküNáNñu”¬;Ïa¨t&+ã;&ÛTüøŽ}¯_ÙÎ/åP”Ì¥µbªhSúOMDC:C£ýquo*¶“Ȼʹ*ÊÕã Û ¯ò“»í6ãµXp— +C݆î°|Dƒn’l³Fs*™3DÛj^®.kmiM' +ýœêe#¥M ó£Yùìì"Fà4¨¬œÎq›Â邱Jë ß¡cùºj çÉ +¥!M"Uk×ӠѽDöþÄ®v¸é5¾›¿˜”ÖžÐvÆ{mÚDÍ[‚‚µYxë04Æõáû™¼ã¡x¨`ï㢘ÿGÅŸl¿Þ‚¿M2[韷(ÿ<Æ%ÏúSÒKÜÖxóŒÐTÕÌK +Ê¢z4²ô+êŠBÆ=ø ÖYäæVwv \,‘Äçí0~¬94¤6ƒ M<5îº+® äÙmf!à­4‡¿•2SÁbVa=áî¡bLïW7ÖrïŒ7‡­4üþVG»!\èpÊŽ¥5ÒäG­o#V×#KR‰gû³p(-¢K餒|D5Á\ UïËb¥Ä¡ïÎÕ*8G‰mT±%vžIßOH°w“3Ö+ؽgß°)»œjÝ„¯~ÍÜŸkºôØœ°&k¨;™¯—Öì$‚Å— £ + +ûäаQoâIÒîGžaWŸ¨•h‰ˆx=}«Ïí“|ûؼ‡Ðé6ÙF£¹VàjÁÓllyÛÃüù5N†¹á±£LtÝ“¡‰>åìÉ÷¾ƒŽ´OT ôNó˜yûõ²ëáô—p£KTóÓ+±Áz’ÈÜ™ ªÌ@¼Îâü/Œœê}í“Xñ$R¨ÅኾÝë;toK’Ö~ÕŠç7~g¨ nX,ÿ\¡Žˆ/νtD¨scÓÐý#íã‹™%¦”ƒ~¥@Úë+“wZï34ÃŽ®ÔÚ^Ûz:d3 +Žš(nÛ¬³&XÈ{‰TXíþ¯FeS¡Ûï#Ʋ¯*ì3w4•O£µ=9;ç—SCoES«1SK{^âÚó½q÷yô»è˸j’˜ƒè"'Ýœì_~ÉW²„凒¿yZÙŒ|^©ìÂ=¯ù•PIÞk^z¯ ~½±NoT2Ž^ªt‡}‹8”›Ô"bÇ +oaguÊ!ÛçÜ…ÒŒ9dëÉ’¿Õš[»Ó7õ§aNLÉH•.‹ð·ä“q#t|%öuþÄRÓ¹+Ænvê–‘¦žh}í½B׫üsóø‚Õ9*«¼ª¡M‹E“½h|íøiG½¡^¨!¥®_œÍeÜŠáâuç±ýïQÎ`Ÿñ‘Eôï þ©¦%³u£:GPb²Ü"â ž$•Ç…t“3=òáüŒ€-ÚYlAòv½YŽ¿ÛAòàò›œjv¿mºF­$ÎàeKOÓÞ|±•”.ÔèÁºAu–>Ëé(gEp‰ÃˆbP3P-,œYàm™Y‡ä£5OhÓoÝüŠú˜ V{Ÿ*»” +ð„pÞõ¨©îñ{ª•[•#ZòPxéÞ¾‘ +NÝ^8Ü «3ëæmVšRrnÓ%B#mÝÅÛ + i"á4O%qD?=ú%äʪ£u #ë⌇)H7tÎœno¤Œ]`æ«Ð/ƒ»Äêv.˜ŠNvÿn1W@XlˆW#³¦4õt N7•Èœkx"ò×:É[¦:/¦LVñè¶Ì;ß“ƒ‘ÉŠüÏ×èávÞ"RÝds¨ˆÕ?ãª<](t¡ÎGWŸ2Kk"Û ç)Ü^o|dH´}Š|f;?8ièxŠäÊ Žž¾ÎÊfÒ¥}ÉónPë±V|ý½˜(Ÿ2¾`¨hg®†IĸÛiˆ þ<ÑÀUðI ã¬Û²ÊU©óRÉçcXC¸%9‹ÿðÀ`IøÊÒFŒëËÑŒSòÈ!Ù>–»Ql†ÎJû-¢iD¦óî»Yø6±r„Lýµ½3…aFIq¹WVµIé¿ÚÉø( œ=>¡kÅä^ W°Y š,ý¤ B·ÞfIJUìY†ë¸¹á^¹œþ€zî’¬‡8z´$NúÒá”Væ“S¿ÆåŠ[PJK R´ÙÜ*rWsôcï"P‡kª ÅôÁË”-¿/˜á㈓ëÙ»ò_èCDýÙWþÝYXø ­Æ!vöÅçWÎdî¢~‹§õO´Fu2¥Ø]˜9úB«þ»:@ƒ„ÁøÓú$Š"¡uå£Ë”àkÓ•7Q~v£·ä” ”Šn +ýeë_|I'ýe²%É*”-:ŽOPÏÕë—|6DêFëÈ:Ý‚bšFãƒoi˜SŸÚÕ¶ù•LÁV¡ðáx{kð§WìãAøÁnË}é…Þ‹bäQ>irîåÏu×㯣 ‚9CMs{–=&SíFSNñ+cnç9ü“7Œ ¡ù_zµ’èh€Y?(8³X>× +°.àVجÛ4ñmJÉŒûwB´Û›Ì:3ÖºÐéÅ’ñ×Ñ-ÌŽ<̲×q!]¦½M#Ýò¢ÇèšEÙ),f)é±³Gk§ËùdIÙ(<Š*ñýLØ)8Ñ|©®iÄ.#w°³‘.Ìnøk›ýXþ‡¿U6ÿR¸Z¦å«~úɨíx>$Ž$w‰íqí°ð“j.¡9bDE߬õg»oÈêK2´ï¦Ë¡”’¤DõÙÏO$;ô¿c’2ßVª¦¼z(ƒA(iÀvnýkÇ—“ƒÑÚùó‰Ü<ÞwëãOÛæÛùõ˜z) + †ª¥ + cÎI­7ã*oTQ¹¾Í†Û‰…¾(϶jääiý¶[ÿ6ýMññ<«$e —8§Äk¡ág©’–ˆÕ¬€ªºa¶”U…¬L‡RÊÍï¨_û7¬G$Øö<¡ñÁãx)M"Mi<ÅDF='Dí¹ThßÉô=¤Ì]”:H闤߮«4~ØM\§®­˜Æ«HÌK½™¯#·áÇ)U%¸_°ƒÄçaB[ctN½çÒˆõ˜#dŸÛ+i(]Ê¢ðé}ÚI“¢ÓFƒOTåXi Ø9U¡Nr°4‚ø0ÑHpVXõ¾ÁMV¸Bv]ª +V¾%FŽ¬´~Tûù’én…ÕÞðd´ùñ}sBu‘ißÔf6…–âo§Ü/ÙÎ3Ô›n¼¦p±s¦J¡‰Az¯Š3sx”t¡Z‡8Vùë ³*ÅlX¨»ÎQ"Îõ4,èÑÂRj[È´,ÛÆwn®ÊÖ×*§ úG ѸWÕ–‹‹¼b‚éd5óyPL~bÞ@LøÀ†ú>Ãå¬PU~Æø­•ÁÙ{’nÌך/>Ìè²»¢#KY"÷yY-:¶ÔW²ÎU‚ h(³ã5^l¦vëÖš¢#©w8º1–ïŒø! öj¯g̽¹÷Ø‹‰øÚÊ€µ VAˆúƆgÐhÏtʱtÜÀÔ5w¬ëÉÊ(iµ.A„Ö%RÕiôŒÍz¿Ðº…}‹ZZv9úüT§¨Dã…,ïß ÅØg£ÙÍ…pBõ:—"aâ»7,ôdUÇÀ(®¸C·0`UÍüuƒÒ Îy”ìj–Å)”Ã8ÿ8õ–”3›FTÜ·Üü]ãúžc‚HTLã[?˜àä:AõUéC5¥´·$kl†2f-õ'»/`3_iªÞ‚Óe]ë¬G¢J“$áˆE㜦5¦q*=I³ý1„lï}¿èè×(ãËñ>¹Vž…¨ÛëwONÌ|$·“¨Ÿjçýr‹Ó¾ÞgÖ"h§'Óî›#«QèRêë_å…‘qh–õ&7è>«5•îùL=Ý°ã…p¸Èspïï>®é™çxÝ1• ìg‰²8çää}¤’/N\`ÑW¨­›¶n9‹+^–sÐq”m²(GTβŽ]±‡~í½¿=H¬`ô]ÛtËŠÖF´/SÈXÀaŠ>ú2ÍN:UÚ†¾tš¦÷ \bD–Ô»œ!„ÜŠ5ÿ.øDÌï_àùsŒñg7‹ŽŠ³Â;þ²jÓÃîŠÂv#z? ©mÌGŽ±Õ‡sOß [Á®Øõ )¦cj”°ü.²¬–4«ë›xvU¶.yŠ6•+\þ!Û¯&l¥×‰+©T ”îì_«ü³!²IJü1PS˹7I={¢­ÂÔGÂÂ'‚‚˜HJmú¦4=­ô‘Ÿ¨ý˜,‘´úe5ß_‘T )FÚÍšÂÔîKÑð'׫£üt††Ðlgëžÿ™í-Mu×±|Ôõ}À}/é‰4¶OÛvGâEš~…sð¨ïª=/¸£bmæSÄ.È’”Ûˆm)Ê‚?^FáÔ|ó«»(úü&­¸¬lVkùîØœišYã­kïX­¹Us»P÷Íž_TÝ› µ3æÉžëMË€¾Ó醈`Žõ*cªüR5fí¤6uci&C±{’g>׺ÞüÓî·yÙܱ]ârA¡À„ ¢9ÉÍ|ŠH…:%9]ò¼ôåS”³xb¶Þ<'áRçÂe\¹$ă¾Já(-â›äc툣ôýˆu˜q‹nõÓ¥áÁrg)Æ<ôÄt0ôoôp›èÑ2å9Ð{ïÇ|óYaÝosó4cBù5Å«‘åÚBèoðï¸Ä·É{X. ¼yz¢2ïnQ‘6Ôð”D3¢èüÆ&4“ƾévÉ28àËá-=î•l)àÛÕ4xažœ ½”Ò{,·S#`áÐ_Ù—s²~a¥d⚺½+:.3R•;k?ú]±$—ÏÈÖ²Ö}™¬ý®Û—¤úëŠÖxùGôÝA zcZm€õM]Å)ü5òÜ÷Ô÷ΓòlÉÄç¶vr_ kbPwÎæZßýÞýæ X\¥U}®pðc#®~?ùö+Ãümå¶$WZTÎÚç¨_᥿ÉLËbàQg*'”qØw³†óq•Nyá¹ËM°¬h‡òzÆ['¿¥×"ôÅ¢±-9f)ûÈÂy1ù»œ‡U†°–b}¼fγũíÓUf9^¨,ສg(+:ÒvÏÐóò½ß؉ñΟicÑ&p!ÉÖ3ÇH«Ä]˜ù" î¿ôR3§†_ã’J­¬iÖ}3ÃJ§<œh„ 3À_4°çeÐ%HD fª‚ª‡&HTcÄgvpL†£ñ®Ä3m3‡TWµ†%ùÓBÊ}âú%I~Ä\áÌ&^ÎÐvTL• "TÕÖ GgpèÄ2Ò]á;þÀ)C‹ {Œ,ìY¹¦7è9–s +ö7n&„B¹š.p{%ø*\¸ %ßÖ˜8e•^4íã9m®RÊgAW?­•â«.oh76 ÐÉPXd™2{²nLÏXý®u8ÊÔ­ÙB¡2‡Ö­bÏuNç7ÖsÏ J~ü™äM•¦ióíF¬‡0Þ—ÉÕ¿ÈöÎ2«—l”nç“oú«6”|‡Ç Jr!˜ÊbÊ|øˆ¶“q2XõüðóäQã콿À¢ ®ÉáÁcl×Ï—Ý~ΔêJ¢1¯ª"…‘Ê Z¸ÆÐÃü¹\ÌKðÀ$5wÅ¡¦á‡ZJ4‘¥*4› +IÅD³H?4“ÂÜœJ“ƒ•›¿$%èY}e‰ŠÕÉ$L(¯ÝyI 2Uü$4ðUðú3ÿpXé%DmßþAלÊ Cšv&¢J%­ ZŸ¬Úõ8…b¤CÁÜ„±÷'Ë*šÓ‚®Õéxô¨w |D$Ø•8Ò->IÝ3?Z‰ŽÉu;–ò(Ð]'üMÇUàJ"ôUøúÕAƒÆy¡¼¿1>ÝèPx,õ)òat{³Ü׆(ÿ¶f­()è­ßš§W²P<ðIˆþ^òÉÓØNiÉÇ«ß$x abzî¸8j_, Ùböa’è¨Ï`KÔ«Âu+«Û·kc·­¹| +IÌÐI íßòÓÇi€39!5ÄäáÃ^,$)¿Û˜p©P]¾ÃRÛéòfû&Ú_Àå„ÿ"r¥–VkDqO½`D’Õ3 ÷üà‡x|ÚR¶¸òÝ/0Å4oÈ@ݤýûÀçp»¶ ĉS켘=ÛY¸ÛÄkánšqt¢úþPoBÉ6rÊ.Ô«‹´òÕÇÂÛ^*6I7õ4·áJøÐD붩»ö¨m~Íb½®G¥!$ @ž¨KÌU*Y±ÂA§lnw1P‚™ÿ$­cV¡¿Û;ûŒ—lׯN„Ho6ÐÄ¥‰QDÕâsÉ¢”µE»È„Ó=ºƒKÞÆb9…~vÞhö%Êüžæ;ý¡(3»í ´ýMïo<ùb±AvC‰ö¤úÅ^ýÎFÎE3y¹Ñ"Ã>ßRâµV£¢u(ï5ÙÐõ%§?*ßuGJ¯ ÌÑ/R˜pÁéÎoÄí…¸ Gf~ö}7Òc‡ª%)o9çqâ_wǾ|¿ò2ëBdØ2ºg¬‰MÜíáÔ(rñ$ÿRÅôja«•ËôCîÉ÷ƒþûTÔ÷µT.EÓØØ´ÊÝ‹—gon)QTsï¯æ©¹¡_9ýuÁæJO§T´6^Ö´<‘¥§³ù6x_Ç`X‹àVpÔYá®xèøãûŠ9Ÿa?…’¡ +0s¯ÿò×}+4šlØõ%7éì‰é.d·AAŠfõ>DÆc,+ÁÒɸYw + I³4sýõ;`°¦Öǧ‰žCͨÃE…ªÊÕˆ@ Òöà¸ÊĺÈþíØûz1Ó$Þâ†uFØä}ŸÙ†uõSÍA›²”ww›ž4s{+2‘'¡ð^®ý2ú;ú3tŽ—R¾¯EstÛS+NyswJ,˜Ó¡j”môÁì‡soá]¥LcÒýL “µ¨æ]°&üÌ0”¾™E"ðJøÐp-¤þâ'´•Üz‡™PM¬eà©Ò"qç}É‹‰-.¸ý/Éì‡$íp™^/‰¯‰4}ƒ!Âo7Ï¢pn|NŽòSÎýë¦4%ò]$w(K&›°Í>®™i+·>V’åb`ȼ®TÜšyšú*§41êCãÒ‰Æsõò7Œ4ýa +Q6‘TòÁØá§dÑß’1÷uÎT(6R_m]Ô1Iä›5·DÌTÚ[W”e$']ûyá¾Ü²AOê®5 +)“âgÊ7Mýæñ(xâ)—8¾°Ù¯&ªSNù¹_ªÈ¾„Ñ8þ‹†óê^u;Œ\¤ƒ€¡w óµUXÌ(fMF#ÂìûÕÃL7¡¾]ñž°…šâQEÿz•óM×ÐQÜýóšÒv¡eôâ Ôº¾ÊEÉ,Ï[J[&i]»y’œÎ3³ªÁÇ}+gµ~mŸSÁ ¯-$é%ó¶ }Å+j¢Ú›ú…ÞZ£Ðã涨Ã`=ÙbÁWŽ›íc?fº¨RßEXAúÊ*O‹Þ"bóʱœf׬J +:¥*j@þVÂ_&u.Š¬çè<1­–øpåŠücÝ$<†³ÏãðÛ¿t!Þ!+·šFX;µ±÷Ñ›‚àbršïM0,M(×ÓT±ªzÙ ¦é‰ã¡`oßYÌÙ@qªÖq†‹þq¥mÜ7šqsU«£|6"”Í„Â +?í(M<¸¤8ôCî@Æàú+—»Ò•#d“P{—¤ù¶‡Ög¯ù©7½lŒyçÂóé½c!sª²DFà–=÷WË\·Ú8ìû´eÏ/nÃBÙî&¡ô˜››uÍûä/L»}Á â…Í ,~ ¤”vbÂAèªÐeE»ÏÐ/ÁEÑÏæX¹Œâ-¢aëͶîƤ´C³0Ù–,^Õþ”C,OkáÑßÑV *º[‰»¹Ò÷sç'¶±P™n¼ZÓ§€qé’:S·Ÿˆ˜QI •]žØ:h~ª¤Zoá@„¯-_¬N7,¬Š$J/’5i²S#*Þl¾.*zr¾È–Öþ)l,Œª;v`áiÏ-Dÿ¶•Ý»@%˜8…ÞB$ˆ«#O¿;Æ1‘ú#­Ç Ùa²:çu†ç‚†sž–ÿG3®áOpŒÓYáÚt1r¨Tü¼ÊÃÛYíÁ „BDùxµ»lûôY¿øÆw‹§™n¬XA{ +u‚jUãá(Õ6óü1ùõd…é†Øœ‚(øìyþÁ»&õgzYsNDu^$¯lÝsÓÚÙ¸¾GJÿ0¨“À{3†þíÇ|^/Õvyaq'°´¸ËPópnF3g=?!a;D+!}Æœ¸J[4=ËÁ‹¥Óa|_j´Ëˆìª«§mÊÎl¸?Êhl0|¬õ¼À†Ú5‹“UŽ÷5c3ê…b à ƒÖnœØ }Hdv*õ–ÀûŒ*±«àVVE,f–á b_Y,\þ#¶w"\¾ShÙ_½Gö¾’øì5D›™Õ3¬F·‚Êáwü¨«î¼mŽ†Þ{ ôq¬pt‡!ø¼„?dؾ@¾ ×/)®óÌ›æ(Æ2S9Ä_jnzÿZylØʌΰë&ôÞ\SËHôÕJgþ‡%>8”OIüi’&á’k{œ°Êêù% ·ã'L)ûúîºt¡zBÀκ),1³ž„føáÖFÅ2~½ ’—ÚpWš$€e]ã+ úYm-£Þ>ûBO˜™¨*³_C;>ò²[öMÈY©í;9ñ‡Ç\!ºÇÆ.îfÅ)>·À{?o&¦ÜV£D£K¹uŽB ó“Η’„ç7.Ö˜9<þ?Àñš&YŠ}PiäöTýŽ—)Ãô­,jäœvy\ª=B +ÁkVHÜW/¹¹Kefv?ù~‚I¬µÖ­êtKcuâŒ7´L-ø9è2Ìÿ&ÊÉ-¡ïþ!D°‡ú(jµ#Vo+¥ú1/±q”y¢Ì¸g yܲ ùN ¾æ‰ñpþÀhf%ǹD!a%Þ*kEty,ô/ÄéÀÛÅ°ú{^N:•ã Õ#£BiØðÇT§¼÷NM‚N“œC jJc38'NZ÷mõ±4ký„bWTÞ?PPÐ}ȈŒG/óTô›!|±,dGXSú&ÓÉr~áíÔäÈÅŠw]|Þ’Ó„cÅR4•ÆÀôå¼ÿo•oh{{t«õª¨©Îm²á1hi·Íq’Ö“•Ùsâ—-!w$¹·)ËëŽÎè«¢ÅÌWøÌ$Q« ~–tTÐëZ>µØèkOÐÜç©Ç®1#m"v©F6`Ûj ÆdXzˆ—Š‡+ûèD‹3½° [»Z{œ¬tùwNV]ÌÓ²ó,òÚ´nºBq#IMMPÄdÇûéTñK- «˜>“ÂÖFŸŸ”ePè’gÑq T6ìÙ @9y3·o»Y£ïrj—Á£è”ò*‰†³_þšš¥Ÿ©ÁÌÊ}¼ ‡yÚDþ8®}©{É+dQhÆõ·ø¶gN\Ïv¨ˆa¼)7Ü‘%8@l¶toúµÖ»¬É3í—ñHÛ]1vÑ£K•*õJÄlŒŸ©›€÷ÌýT´Zwýá¬A„vbCËø#´tñ6Áî–1©RvÂð!T{g†¢X_ô±íÉyþ—ŒÿOðÿµ…AœPGŒÿ_º*-endstream endobj -1025 0 obj << +1035 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 35 /LastChar 122 -/Widths 2099 0 R -/BaseFont /EETKYY+NimbusMonL-BoldObli -/FontDescriptor 1023 0 R +/Widths 2129 0 R +/BaseFont /JWHHZP+NimbusMonL-BoldObli +/FontDescriptor 1033 0 R >> endobj -1023 0 obj << +1033 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /EETKYY+NimbusMonL-BoldObli +/FontName /JWHHZP+NimbusMonL-BoldObli /ItalicAngle -12 /StemV 103 /XHeight 439 /FontBBox [-61 -278 840 871] /Flags 4 /CharSet (/numbersign/hyphen/period/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) -/FontFile 1024 0 R +/FontFile 1034 0 R >> endobj -2099 0 obj +2129 0 obj [600 0 0 0 0 0 0 0 0 0 600 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 ] endobj -1016 0 obj << +1026 0 obj << /Length1 1630 /Length2 10814 /Length3 532 @@ -9735,68 +9891,72 @@ endobj /Filter /FlateDecode >> stream -xÚíteT\ë–-w‚-Ü ®ÁÝ]A (\ -ww‡à…;AÁÝ!¸÷à—Ç9·»oûúWwÿzãÕ»ÆþÖ\k.™kÔä*êÌ¢fö&@){;03 +?@ dkââ¬ho§À¬´pQ6±Þ.djjq' 1do'a ò´f  )€ÀÆÇLJL ·wðpYX‚tšjÚôŒŒLÿ´üå0ñøwä-Òda y{qÚØ;ØíÀoÿí@u ¶ÌA6@€¸²Š®¬’4€NZI ´:ÛT\ÞZ1(€LvÎ@z€¹½À怩½è¯ÖœYÞ¸DÆg )è- èn -tø b8lAÎÎoï3ÀÂÉØü6°=dgjãböWovsû¿ rp²ó°}ÃÞÈTìÁΦN 0à-«Š„Ô?ê[ƒÿÊí zƒöæožfö¦.µô7öFó†‚AvÎ0ÐüW. À äì`cìñ–ûÌÁ ôw.Î ;‹VÀpZ;™ÙßhÞ¸ÿšÎ?ûü§îl<þŽ¶ÿÛë?j6æ,Èlìo9MÁo¹-@vÈÿZY;s{ë?ìf.ÿŽ¹þÝ_;CÿV„±™½À hŽüQÉü–@÷ßS™åOäÿ‰ÿWþ_‘÷&î¿jôŸ>âÿé÷ü¯ÔR.66Jƶo ðKðvËØÝ36ÆN€¿îGàÿfl ²ñø/ÿÕQøbÿï_aY°ñÛPDí,Þ„afcgaý‡ä,rš©€À¦–sc›·™ým×´3:Ù€ì€oÚþ=Ö· VÖÁ4,A¦Öv‰Àõhgö¯å¿Éõwñ5%Tµdÿ«öoO•·Mkx8ÿ–F[ÑÞì?ñˆ‰Ù»¼˜¹ÙÌì<N/›Ï‘ño¶žÁN wÀgVVV6ÀÛÿ¿?ÿ<ü ¤©½Ù_›£6¶3{[¶ÿ0ü›º89½iü÷÷ÿÖô¿Ÿÿ^{ ÐhŠ¼4oo*l•–™®ÅÏ“øÜÓÅ3âPÒ QTà_mßé—¾ÁWaôTÂÒ8ÁÿÒê1wäð¼#Ç°;Ô…gCÛùxšOìCIß]ð~¦‡q7ðã—´ôcíh¯³Y…uX=nV­ÝÍ1Uµ/'x’‰6'ij[zJתt_ÓÔú8ÜvÌF(¬Ú£cš¤ƒÛÚ¾áÁþÎ ¸î"Æœ8$jWX4š(Ç"a=Í -¯Æíwu»d±Ý‰¹ÜÆXæ§R÷)Áxãi³åyª¶š—ܾí9ÞYò<0”jûˆ/²­pÛ2 D¯"k<û¶¨ó¼ˆ­pΛlxEv'Ê%Ëž…¹`|R_•·–ñÿd{÷ç9óÙ¢Ü߶e@°-Q–äÿˆO$¯ê2Á³|ÀnåäÉ4¸Ø¢¶œ£íG>ÐK´®‹²üE{ÝsÔGµ÷Î~ï—¶Gí'Ä”›’V¬Éà‡$¾}¿6?dÊ—|ñÔ'Hr;ùMŒ]IJd÷d“ÂUu?¥¾q¬Àe¢zœUú… ~Æ¡dë/O *‘¶²læ ³,D/L§­„Ÿ5)¹;+În3†Ô¼Á¼ô× ÃXؘA¢(¦! rµšT ®çjm¿‚ˆ"ê:=8„é‰ÓvÅÒýÒ´ÉoèwÌ»ã¿ÛŽû«h»‚¬Î.zµŒ4Í$‚Ÿ!‹8s»wè«© }ÌT8-TCšP×í±¿Ò‡š…ß¾*hÔ>_˜A‚»êEžä>A£%»Y÷¾¼Ó‡— -bEh;m&¶2q@¤}Ï7 ëX£ÇuénÉ=µLiØ®Z#‹ ÒÃxLçÜȾÓ>•ƒàÑYô…Í ¤qk#è3‡ãMà¸ò“üLvq|ìD\0D¿Åv „|uw•­ K³KòÉôﺸ씪ÊÌ=½Ðz ¢˜A‘'¨÷GêîéÃä}-.ÍÒ!˜ 1†Akµ§„öŒÜ̆(;¿+ñ‘7ÕÖÊ(C²I|ÒAÿG÷CŒuŒrQÑV…=3åŠè’>·uŠ?œ5Trh¯©ŽòÒ^¢HNåç4 ’/Sîˆë‘~_Ë.ÿôa÷rû»õPã ôdìo0gùš²þ›D"îbHèœé–š”¢‘:æ]jx6Ϥ0õ!5½‹%CDAçK*Ë3W'Á¤='€.I5p4¬›#CF¢NóÕ`Âv'F.ÛB|Ê]ÞOŠá€íú #&ãøÆ6“¦P~…‡mŒo7±™›1Ϩ)b´S«ü²h*^‹ÅÇâçü¸ð1~çŠæÆß_ÒEàj¦cþسի9ôžÆP±&*Y £ xkâÇ¡r_u¦Ó«8¦Ca1è³M/FìÝHHºq˜ÜÂb¿Ïá[l×êkû¬úËƦ¡¶¯F$¹äÆÇ´vyW -†üdË‘È)ÜÑ˹ʱ„ƒ¡¼(«BuV•ÚèHbNÒnAÂé¨X^‰$2a€ÕóEч(¤hÉãcTsë5V»´"ËŒV÷o¿=ÍÊ~€íçÙ7¡èûÉ;ÊÝ/ÁP®}€ ƒ·õMDK°+Ãä²4'ø«<£¥sâáÙ9,ìú)t aúBD.ÈÊ?ÃîƒÑ $ÜjIàsT¦9õ¸zNÓõ% (ªÎ»é}ìsZ^N Û÷FÎ9PJ‡¦4k[«ç f4e«’ùN·C Ì«üj}B¨ª–^xÄ€(4ì—ß«qe Ë:m“®Æ ö¤¼êͶW=§µjØÊo„’Œ 3²8yj‰ê`nûÁâ'YÚTKM”‹ùÂÔì %Ù³¹Â]¢þãEš ®ßHœÑ"P/V,N~οPóÙ3ãþ™Ç ­ù¡cÈeü¤S¯ƒ´ -ýÏTa%ª£3»Ùª]`ÁQ êó}³x:HX¿U;úŒ hHØõKጬ‰•Y)f.¤«â£Þ„ÇG8îàôº¯a»p7åsÚBc£µÎ¥7apx X&_­ð¬)wMÔY„«9y™ÁŸe!Ë×÷*$“ §E¿jéŒ)f?ÂwJ×ÓŽRIßU±($ {û‹xÜ©ÎMYÈÅäJõÅc?—Þ^Ì:yðý¡_nA7üÕ©Ô–?Ài¤kðÉPHRòÎzçiÞY­Ýû+Öäˆ2…tzW3¦Ž­à:]q¨¢–½¾:µ;›ôšÿL±î\ì{¯1üÛüë]¥ôî•ÀJªÏªœûÄøø¾z$A)ŽöNÏÊþû>ϾЇÑu—ßR±Â ö’ºÛua{Ø°¨ï•›)wËÜ%ÒUùœ×“ǘy‰–wè–š7ô¹ÇÑöˆøoµÃî:5Nö˜~ø§•ûß¾ËPéä—b@3¢€iÓ,m ¥däg àø¤'®/}"Lø¡-”ÉP&kB;…}ü§D7×±0œ^þ +ú)[¾ž¤.ª×VYzd,Ò#áx]RÁÜõ]òe&`”2Ÿé3WÀâ•ZŽ°X…Eµ®ÙßWÌ¿vAJ|,„$={Kýë§Ò/Ð0Ñ4ͨÙEiÜ.äîOîþŸmÏ)¶9ÜÂOq?¸ ííë[ï]ÄtŽþF™]ðL7 -—ÑÅW%HkÂE©(ˆö6i°¶&b°Þ¨ïnwÓ÷߀MÙð#îVbjXèÿÞ«[k‹ÄA³±8Õ 7j/I$Êý¥í¼ž;‘zJFžÀÊÓÔµFÑÌ®mÆ"F̶ƒ°‰¢2­`Ÿ¨3pCQŽf©:ÇvlÔÁþZ[zCºåçš8ÓîŠu¤ì5í¶rÅŸßÛ¾25ùŠ †ÒVÔgó°Õ_Γæ@ÒïÅ™…Á)DWÐ6+Þ­ë ‡ñß¼©MüâÆaªƒi>_ªóCËLD CP]ÐúÂL½\=ö›ŠLE Ñ:Ç¡õ>_ç¾”ÕÓDÀ`h{#oÜ1§ÌT«®X²é¦ nh¿,ÿá2ž’ ‰ˆFÙ`TMN>ÜïO?èdÚg>|Y×ð²,"ë•ÊWBJ° ‰ëÊw ª7¹·DþAG—/Øi¬\¤C§õœ.óbƒAÆ.Iµ +ËÁúŸõ#¤½ü?PÝuØ¡™BŽTÜksmuçÛÇ¢,3ÔZ’ÌQ|7û³Û;eOŒF<¸7ƒWÜRgò Ó· pVÖÿÐÄ÷èæjnr–+zóX܆;$¾Ô%€ë›<«×³!ãq/:˜µõϼ¾†<…ö  ÝðáÌ´w4`›x©¢†1ÖñÉê^ah¤K¸$J^¿ö†[ÖÓ¯õîs ¼ëÿz†¢Ä?÷å~.õŽÇá[„P¬€Ûð»-kë‹ý‰ÕL°§™ªï 4ÁÚ‡þ Ir¾ëýéÝ´g3ì=jï©l¾\þd×Gpá"V‘tÏÀ¶5Øq\ Ýv¿r›âÝß {?ƒ™1¿"‰IRœ<-²*Þ]²=¹E7œA©B±:Ž#¼²ôäÃSPÇ­^1¦?˜"PPŽuáùíWý˜òiÕÒ‰¸’§‰_D³-ZV4áÐ%TLo bæñÛR_—žãö“øì«úá”ýcuW Ÿ¡Ï9 GÓZ¨Œh2Ù×’Þµ¨,©û)õ悃Lµâ·õ $Wjþ%ÚZ¯Ôfß¾«¦W¹êdî-î ±íynæÂÄ(è1ö2|N¥ô]kÃÅ%200*«›ºR„1¬/ÊðN÷ìóùû‹¨HfÅ¥KÂe«]ú,fY…b!Ã)ã¾ íÜà…F˜´ïú¾rùª‘œ4å*Ù÷îÝ`ÿ6[ítïhwýÞ¿}ù´¨Å0VÅ‹IE™B;§5 ÁÁ"MLýÝI'òÛlo©?œ¸Q Mù%K²Ñú—¦ŸŠ½¤†Â…¬–ŽŠ6tÙÌ ª‰ÃjºyUqjRì™IP?þ3i^p…úÊ*÷a]mVºúÔ†‰lHÑ!_ €è&c[Ï“â)¬;²ü´®ÅêüôÕÒ¤’ÞúÞž¢ùI1c¥3N¨œ£´ ’©JçâçESNÝ“Qˆ8jn'Z, €"¬ õϧwßÊ[…—~Œ»÷‡zÖíO‘ -rÍå…Œ†ê# Rßò,"lêþ¨¨T"‚è:‰¹'\â­CrÞ×z,Õ¸ §A:æ‹Ïg<¬>Ú'dPîÐÿ¡1ŸibT,­L”¡ïéd¢º6[*1½[)R«¢x úJ6Ž°ÉÊlÅß ùЇº¾“¾%ß6%€ÌZ€ÿ@ ×/Û:œŒœPœLö'½<Òpk\yOO6ÒÐÆÈÔ©B"ÑitÚ>€Bµ8o)vçùêµFÕ¬$¾üESúÀŸüY=ÁÂýŠŽëWÝÏ¿6nhϽ±ý;]¢f%(ÞŸèA¸Ž‡yÛ$o/Aûv sÙzOÖÆ’±È^d¡›_Û"Õ3ôܱS+­¸Œâz»ö­‡?5Šž:¡ô´Ä)lI_%Š¨ ªÂý»6}ê™;Ç]CË‹/—øMÊ›md>&ö3¾OÝÑzÙ¢²ÛbÒ¿'•?OäºÈ"`ùÌθrÌJâ˜ô튓yðYtè»;íAýºû);†1åO¯º2¶€ér´¥Ró˜”LÓ Á©^šv¤öŸ‡G/„ß_ú±Ø«'.‰ªÔM“k—K26é÷ÿôWSºÛ§¯÷ŸšN×V¦KÃã|³DZ£…C3¿åB”‰…³[ÏY *J“›Ûä—añüïM–͇»‡[R»³Ÿ"ýŽ‚fç¹8¬™^} µö:›QòbSpìØcø±gÊX?KÀð~íó‡6ÞOX¸:âZôÍ  -+Ë,¶öyL,Z&1ÝÍz*ÐßeÑIå²ONçÓ‡õ™Í#ùÝ1Éq…•-eÀh‡ÛQ$ßn:pEä®Àì]05‰°=5˜®‡¶­2P‰5eÃí+–an„UÐŒºÎ’x Ù?ò­ëue¢¯ÓÒ )Ý7º:n:<\6¶c¬ÅÎjt(âHe¸¹Tس`8œâß?0­•ÇÌщZžôOöŠ¿^üŠõ·="æ>ÖÝJ+u@ãW•DÞ,똒7•|›ðÝ쨾ýµ€€@Ò¾g[^VÙMÅÎÁ/kÍô)$œ4Â}ekñ{3ç~ÖOøA)D*v"ŸX{Rwª*S -aÉÁ_¹5wCs̲ÕûÖþŸjÆàùØ÷–¯ž™‘ÌJþ¯swQ⢃³F‘1b˜üÒ|ë FžøßIµç+x-Jï)#ÌÙªëÃn¾(ýpð»*tYÜÇÎ}Å›Ço¸Æ³jÞÒ±ko{!dhÖ- \˜`[Kþ)pLžXlø ÈÖQø~‚¸×Çl7¬S¹þ›¥*¼”>§Â.öÝìþñÃdi‘;`‰‚j#–•µß¯XB`ZdHnh“¿èI¤Ž$Ì‚Õvz!Œ^ !+NypÛÈŸVͧÁ`f–fU®äi l'Nªw!]ÅúŸÑ|È'Žb&‘$US —ŸÞF`'CŠ‡r(¾Kª‰;Æf+eZ´X‹+öÿ说oÙËøX9—í¸*¬^™FRЙÿ£ÑFï…ÅAUÂ͸)¡Q#>£0Æ*Ú¹:R…€à”%áee¨±¸ì¤|üi3bNdoÊåo3Ç\³RŒ†ø9`S? — ®ó·´ƒQEûõï©3ë-1F]ÚKé"Np÷#Ò~ ‰JIa†ôTA}Zê˜ ÷V¸ ƒnq7; v›™QC'C÷"¸®_o†™»NIÆgŸìø‘Y¿_µi´ÿgD>Øæ° âe©!EG² 'f«µÙ_—ï~r›þÊÂIöÉéS·y_!ºn×®æHQ–r5¡XÓh€šé©)Ñjw(üÜ}ÌðÏ4|Dp_CSàë€ÚÏ!œñ)— -Á?§†Ï9?³7mhÓÑzô±Tk¤Mˆ»’jÕ´¤Ò«ÑÞ™aä­"5šÑ´ïGZ‰CFp)6õçV{d0¥álƒ%8ç= -R §Ïò‘”-ý©¿+ÛU4¢.^1Q0¼[ç>ÙÙg¼9!‹/JÂ@¸N´eiÁ—23Âoæ+Ãçu#•!O°éÔ ìâY@—!WùAŽ…ó¢fÂŒpV[¾Á)?E ‰/Tc¹Þ]¬É0×aH¥RÜóªq¼¯)XßúdᎪC…Ð鑼gˆˆzéže¯¶-…¼ÏΩ?iž¡}Q'ÓÁfü Þ÷ž¬c6_|5µMZ@·1úf ñ9êês ª]ÜÔæBZ -®0QU?Åt v¤T1_¼Yp¯ÏÑn1×’äê'ŒWÔZB¾y¶¦}Âw’ ë°È‹G¤Î -f‡dúë‘|3ÝÖ¬9»pï°h1ûó¸í•½ÈW©”qn‘9¤pÙ²Q@ýDîã6Ó>ëo\,«m÷º·óSP¼ÕÆé‹cŠ˜/»f€¾-Ïxˆ®;SëP´JáŒU'â#VúÝ](ëeQb}–¡˜hïá\¢°»­ŸÓ¢aKY3Ê´R°ÝĦŽTWòã?É ç4ÙÚ¼~pÕôÉs;.“=@K?ò°ÞŸmG¢«Óg‘n1»€˜ótÆ[;ËæW{¼«ó¼¶¤êqáãï876} ÎÆEòY‚i›XëzPD}ÕÓq>ÌÖ=¨[ÓeÚÚÛ-DuoãáTç+ÄGQ½Ma.Ù¹êÜ×,r„U16W Ý¡UPÎQâ sªÞûÛT—ž´Þ>UtB%®Q?™†o\?‡c ©ãàò DíDÞÌÁ<¨‘‘å±cW'}¿ü%)yõ(¶Lz,£›Ú÷=Á‹º“Ûˆƒ„ªk_mÖø'\ÿg:óÈm§j³.”ŽÑ}½³‘šÞJAàȶ¨â>ÓÇBt^¿æt8Lyäån¨ðª~ÛÓœ„×RD"Ÿ"nN4U¨·áìDz./)6dÏXã¼;Îi8D• ÊV7yüöX¨å! v”kÝÛÓ¬ÙÛ’Æ9G -#ª5¶ãƒýŠŒ[ônjŸÛ\vù$/ãRÖyÕ\-¨üKŽà|B8x“AíÁ.O_JŸqD×=®_ž~:? ³7—2⊦Ý|jèÚ~e“hŒ¬Ò`2Æ`PzwL˜,Á”‚Ó­à¸=] {¸â>uD-‡UÙð›Ãí÷Qri|& -Ô>ÏíFŒòóGL2Õ×i#yûyNÕÓSáÄ.ì(¢ ê—´®u߃]bùž¹Tè²ÕV YŸ(uAyFìT½ª7?‰ã[×4¯#ã:ªÞš|1¥·cÿÂÄ=SŸ¶Q,hÛñðh]©¤ßûàzÑ÷ùÝQywÚë\ç£V}—À&}nJÎ_#2ž½+¢û%Ì°Ë=NIW™H9ถÃM”†òó?¹>HÛÀh[ÃdýÀ#þñøV¸°ÏjT̆Š½Úß'9Q£•ðD -ƒ¥=Ûe!sdê)‚.l4lóþE¿‹'@ÑN“Œ -žKXø4¼]íywbZâü™rœ¤ÂQ-<µÏ¬À¯´)"‡£]·ˆçÚ\¹çyy/Àbý‚ .G¢×.èßY÷®! É>a'c6CU¢y{nÞ#‹MÝ¢UüišB|!# V­}'­5®Ð±äNÆ ]túPÑ:/­ò¦X˜f9Žó¦žWv·Ô•©:N"õ³g²N î‡íæV¾–HYÈ.J°M¼FWÁqAéoÑxJ!&Wðˆâ­Tþ“$(®m Xïe{Ì××Ð8]/^¾g«Äo‰M·9}SO‹ý‹³n£zbÏ<3³ºÍö½9dÏDy6ÔDPM:Žð˜S“ wh…µ„cK´Äã‹{:Qö¦Ò-‘þh[N½œ;M7 !ìX¶lç -ûÆnÅOøÙ/šåvýÑ;Á¿Š(æÀêzÑÊ–>ì9¬Ç”°n÷ùv®Û·Y^+ùå+ÔÅKl—‰æÀ+gbïç6Å”E”vÕ8÷¸Ü¯¸.ÔF,ÜcjÇqx"3¦Ò™L•*×5FžÅVÝMçï©Év%¿ã´Þ'£N·ò6iM¯È-ËÅ8ò̉Xµ3<³ƒE´p“®Rºçègk,¹,1MwðM»¥&©v#(&aWgXñïs’ÓCˆoRlãB& ¬Wb_ÎíîŽNGW 6Øgåëg5ˆ¦:”'réÑü_³Ž§ËoÈtö¤¶egSÌUlåÓuD%ÝÐ=Ü~¯à0Úò•K èñ”ê ƒ\¼Úˆ½ À'&Ñ>—Ä÷VåTËïuXg2YèfôŽ ¿™€!m†×<^¢¼™=¹†\„¤žºŸ3>hÙà …ìwÈc>Ûºa/AØÛŒk1M,ø}GΨ|ÐÕ¿ÕSÞ=t@†šÆZ‰œà¾‡_ö}ô€–d0£¹¯”xP× òóvSF¢Mv˜Hv¶y@¼ ½„uØ1åÐØ,*Á×ÍE -® v'ö½Îln;mÿFN• +/Ÿ3Áô1êˆõí‰~4HFz>5#Ε{}mBl+ï Èà+S>îϵ ³3™ýžYZÍ?º°ü|(ø«8EÛN¼-Zr^’3©ÒÓ8 3ÅX£n Õ¤îc„Ô#gAGŒT3$kÿu‰mßêÃ0¦ô%BV¾®”ÍXKƒ²ÿ )¦|¶¼,–…WTгOð Dt&’vm‚¿[ñ²âñ‰hÿOr£æ§E·úÔ‘”˜l LkO$&¿Tƒc¶“Ùå€ýfSœªÝËX¿aП‘$ŽÒ(HÆ[®²—|þ§¸™¬b 5Q*ëkbC™%x=ÒqYŠ€¢y•#HÏGNJq¥RÚ‡o•C¡ -«÷îõç‡k¥¨9îx]R Éé !lŸàk<“™HÏÕ2Ú3'Ð_}Á±nwYíÖP¤z™$z¸ˆå¬uBZö˜ò,ïД‰ˆ6”E׋8'<óٔ᭦ó'îôÇÇ)§Óˆ%£‰[LgPÌùÃ[VëÁçµü÷=iˆçv¸#¨<¼‚¿ÏûN¶Ë9·©\qwqVb§E9¤»çóÆØ';†0€z!1q*L»_E³%)dª8„qb" Béãkë}™`_ölz?d(d𠺢¼ùŠú·nöM|Îëv N–È1@´é}Þ…gðvÉ–ßoµµRj¸Mk5"YŸ~bÐW¯ÔÛǦ¤}wQ1øA³x/ÆP/3Þ‘,¼#[¹3'Ì™^4ªýJw“çM›vŠ%Y37ÚZ-í!ÚZ„¯Nêý÷ÆA@U/#ÀJG4½øˆ®Lš„(Ûq¤—ZDÉŒf%)1[1$EβU?ç]ùÅÏ÷àº|/»çº86е"¿(8°™NWÎÿJÙf[ÙÉ(áåÊ=L 1û•œãBJ9 q•Cqƒì.¤Cj]ÃðÎ/b J:Hüäë0=—›g»W†0¡N¸ 4Òa,‰FˆÐtoÕ¬’«]G=ç#þ*½QÇÅ[àr4XÅ,[‹LŒÑÆÀ%D줫v‚SËBYtD\éLrg¡ÒsX?ìbW,%´ŸOZM3 Ý$Ë ÓÑïÜ„u“={Êãe†pæëaú<ž¬,®O1·—ŸbÍIÞÐÅPE¿p’·^¼à|ˆüÔµC?Ìçm£ù kòúšQ ½ U*<\£›Œj¶sP‘>N¯Ý(Ó ñjùz£¼uRX,Ã"É"˜z2Â[°À´3Žœ}ØÏ"/³Ö@~Ž!¶Q'–Mªý.¤äøx®9Í“xNKÚ¸ìì -ÏÆ^é(t{äg^Ì)¾^Äyoߊ“8E˜‰YjÚ é]ÁØ¥ÙDf’ø iÌÌR¥®Û·‘•¿#ëÊቛ¯½ð“_“9>~"iú -M)Ã9Âp:Ä'°ÂyFJv5„yfù¾ZF|šÿ˜Œû;àcêØBüß›©î¬ÃŽNÌtèÔd/O7ðŠëË–“Õ7ÑyD¿‹31ÓóÏ÷ÈJ¶b@=­Ö“4Õ -G‘áR웸5™UP®ÇÇ°H„×5Åã>½,TGè±8ñª4ô~È®š††,h»®ß z¿š l–,hËÐ%ˆÁC}ìÜbÒŽy’Ÿ&þÕöZïtï|çil¸#é¹–8!}BÌ’ñé{‘ˤFX.K·¿ìܦ|ºgÀM¤ûÆ¢•Ü=ÿ=²X_S`ìÿ<ì)ú¸Ô#»oøý–‹¿ˆ‰´ƒAF;ûû -Ûwôd¡Üw÷xgXøÉ\›ôi3“ŒIDί¹N%àŒ±éï\á>Ø°tmÖ$¼ãÅ,ñá…uÛæþCU˜Å6é*xsÈé4矾½–çëOf%,RKÁÖñ¦¤EÎL_2¾›Š‰iŸ¯œ±zÇÍÃÁs}~± à)Ë~ת0üÈ»€ñ¹R.Ä•!/`9ºz\h­õx–jÖ‘þ:9OñÉÉjð‰¬”ÔÌ°–˜Þè.h1ýdftX*ÿ7=™q FB1w)ÝúiC$ü9œsðàÒŽžQÔÄÚÂdÝ@BN~CªÝ©.ÉÊ¢^r’¹º¨JªÂ˜ †C4|¡" ‰j&m¤cYõ"¡ -#‡O/$v$R®cià¤Çâ÷Û¹6AçU‘©®¼n„ ¥Ä£Ïš‘mÛ«ðáäwãëuÃ&µ!¿®êÐ0š{©Ld"Ö½þ¤´4¡æmTu{5v÷­õýT_ekp¤¹¾r§Ð~ Q4ËÍRK2'¿ÊÀRŽõ‹l9Ù‚<£G{{©ÅVØeÞ=þ½ãøkæÈr by&?Ý!`@Ê‘Ъu iBškÿSéɾûmE@Ï4Y×^Y´ ~MÅǨp¸ägÃýö¥fÜtUAJgi/MüañD…+×»v­ø‚|ø¨.‡£0å÷]°k{r|xœ4Cäcüá5üº)µb2sàŠyÄjÌð%Ç)œ¯¹©ß81-?­ ‘#™ÄJ›áå#“DtC=ýHn¥?n^p ǧaÎ’òÆClÍOäË°¡·¯?xæÇñô, $Í 0ôfD ~xa*îD«­†S˜Å8×ü¼Ž/ÐÞQ]‘E „7d+À©'8Ôô«÷Õ™X²ü¾†IÓ:Ùÿ=Õ-¼°îŠ1tgþFHHÙ´.ʦ¤œGºßFúÄÇÜ=f¯h®N½]Ï©6»‘Cò°xVÍgŽÓ´¯*ʯÃÛ2†Ÿln»`Oêçl~’»×&PÑàoÇAóa|TtžòP—7ÿÂÖ›xS4ð‘Ìâ»[kSø˜¬O¡Ås§EÏSa$(’§œ¹¼m1¾>¨AAç¥ü‹#’ëµñاw“t“Í•…EYOU)-&5[ÍÕ” ÐYÙ>uï¯tH¸KJrãGÛà´ç«š4¥`Ê,c%ò¤üš½›õêó­‰îÖ­æda WÓæ'öj¹·„x!o“E¬{Ÿ×I„¨€>×ô¯R.ÁŸ_fnÇŽÜgJúvájï JPnÑ‚ûÇO⮊²]À¼^Aî^‡H_¾ö•ÑJr(•³¡ I[ Pȇy°ôQëG»ÉöQ  Ø}ê˜;AÊýì:ìº#=É“(þÊ|>ä®ö’ÚJ³òW³§‹„²ý:wR­äL -5«€ßbÑdûClC‚eÑ3›i“É_É>`"cGKó‚+îœÂ”SË%ëŽX½úð±Å­¾ç2]p ×9¢øõÛu“°WÙ8å{‘+cc"]•Á½[ˆ‹uÔ§Š®åëÜe\¾"Õ?M!©Ø‘5Yñ>>ƒg™. faSçõ"VY %¨öôÒPâÀ}ç_~[Š3šXh¬Xâ&4ã‡4ó ZòU‚õ(c˜äœMÈ>õ”D{Ê=ëÚ -B4½0üÂåZ8CÆzh¹Äõ ë­ÍÙ”™\ÛÑíÎ¥+ò—áE¢ì¹:BZ -ï!ÖdÙÌ>‡·‰—´ß•D¿l,¸Y‡þl½P ºñé:®DÁUÃñî+k#/™P¼|±ÔTa=Õ*¥­T^훳ø®Q¶t°HKZ®Åœ~`LgÊ`ømq%['=§!Y§ù“%–±y»¾nrI Kvß3g&r–÷é¹ÄÈ<j<~o™4iu¶ßL‚Ó´äÛðrœ..½¥×hÀ³È*ÂKÐh©Oañø.[ždZÏáƒçÆ"òŒ\#`"*äªFí¾a„tßÓÅ*YõaJFÏ*‹÷öýä(ŸÇ%hmdfRñ›„Æn[C ñŒSÄoÖÿáùÿü?A`j4vÛÛ;Y#ÿch»Žendstream +xÚíteT\ë–-w‚-Ü ®ÁÝ-h h…KáîîÜ¡p'H ¸;—àÜýqÎíîÛã¾þÕÝ¿Þx5Æ®±¿5ךKæÚ5¹Š:³¨©1PÊÎÌÌÆÂÊPÙ;;)ÚÙ*0«Í•­A€7€ ™šZÜhÙÙJü- )@h`g°ñññ!SÄíìÝAæ`†š=##Ó?-¹ŒÝÿy‹t™ÛhÞ^\€Övö6@[ðÅ;P€-€35 ®¬¢#«$  “VÒHmŽFÖç·VL +  ­`fç°þÇ`bgk +ú«5'–7.Q'€ÀÉhz º™íÿ‚˜ö@G“ÓÛ;ä0w4²¿ÍlÙšX;›þUÀ›ÝÌîï‚ìíÞÿ©{#{{k÷¿£íþöú@`' µ 2û[Nð[ns-òÇ¿–EÖÖÌÀÆú»©³ý¿c.@Ç¿D÷×Îпadjgkí0š!T²¿¥Ðý÷TfùßùAâÿÿWäýŸ‰û¯ý§øú=ÿ+µ”³µµ’‘ÍÛüã’¼Ý2vÀ_÷Œµ‘#௻ÆÁø…Ù€¬Ýÿ‹ÀuÔþ£ØãûWXlô6Q[ó7a˜ÙØYXÿa9IÜ€¦* °‰ÀÌÈúmfÛ5lMŽÖ [à›¶õ-ˆ•õ_°Ï +Û¿Dàú´5ý×òßäú»øêš +š’JŒÿÕ û·§ÊÛ&€?»Ûÿ–FKÑÎô?ñˆ‰Ù¹<™¹ÙÌì<N/›÷‘ño¶žÀŽ 7ÀVVV6ÀÛÿ¿?ÿ<éÿ ¤­‰é_›£6²5}[¶ÿ0ü›8;:¾iü÷÷ÿÖô¿Ÿÿ^{ Ð h‚¼8gg"d™š‘®ÁÏé•øÒÝÉÓl_\ÿ¹0߯ʮÃ75l¯Üð©:˜¥aœÿ¥Å}öÐþy[Žag°Ïš¶ãð$Ø›’¾+ÿý*M+ãNÀǯÅhiGZQž§3 +k°ºÜ¬š;£ªj_!Oð$ã­Žˆ§·ô~”.ù~8T7öè>&)u±¸m˜ PX5‡G4‰û·7´½Cý}çp]ÛDŒÙ±HÔ.°h4‘~ÙDºåžáŒ[ïjwÈbºr¸°ÌN¤î“ƒðÆüSgÊrUm4>_pû´e{eÊóÀ@’ªí!B¾^gYâ¶fˆ^FT{ônRçz[âœ5Zóì3ŠìŒ—*J–># +sÁx§¼*o.á_g}wýœñl^îkÝŠÔ'Ø’(Mô{Ä'’WuçÙ>`·pòdèŸoR[ÌÒö! íë&XôÕFZü¦½ê>ì%Ü}g·û[˽æb6J¸uq ÖDP»}"ßžo«/2åKžxÊ$©ü&Ú6|I²k¢QᲪÖÒß(Fà"A=PÎ2íܘ??ý@²å·‡•Hki–óº‚i¦¢'¦ãfü¯êäœíe'×ijÞ ^ú«úò!,lÌ@Q“àx¹ ªy—3µ€ÖßDáµîÂôÄ©;bi¾©õZä7ôÛf]q?Žlcß?‹}…U´YFVg½\BšÃfÁOAœ¾Ý=ðÑP†>b*˜ª¦ ‰¯írß[îEÍÀo]æ7hÍO#Á]ö aOp£Ñ’ݬyÝGÜéÁK² ´dÝŽ½6[ +Û#Ò¾ç‚u¨Öåºp³àž\¢4hS ©–Eéf< ¢sj`ß®›ÌFpï(üÊæú|k-è=‹ãEâï°ü‹üTvalÝ´X\0X¿Ù¦?˜|ew…­K£KòÉäÃïÚجäÊŠíŒ]Ý: %¢˜~¡¨ç7GÊÎÉÃÄ} .Íâº$ÉvŽÏÊ~{ÞÏ>ÐQµßS°Ââ¡v»Út`{æÙ°¨ï•›( wJÝ$ÒTùœÖ’F™yˆç·é›Öõ¸ÇÐv‰øoµBï:>ï2ýôK-ó»}—®ÒÁ//Ä€fHÓªQÒBÉÈÏâÏñIW]1NúX˜ðCk“L2 Ö¸V2ûØ/‰.®#G`1¼6ü~fÔ R–|Imd¬²ôðh„{üÑš¤‚™Ë»äË´ÿeÓ.ÿ…Kµla°. +‹jm“Ÿ˜=~ͼ”øh0IzÖ¦ú·O%_Ã% óa:¢hšP³ +S¹ÏÉÝÌŸÜü¾ØœQlq¸†=žà~pFÛÝÓ³0Ú=î,ùƒ272ï‘,n&£#:$Š¯JÚ0ˆ/ŠRžåe\ßoeEÄ`µ^×!Üæª-î¶ÿš¼îKÜ¥8ÈT?ß÷£G§Ö‰ƒf}a² nÄN’H”ûkëYwõ¤.<¥‡‰Kµ¢©mëŒy´˜M/a#EEjþ >Q fÀº¢Í.RU¶Í舽ݕ–ôºtó¯Uq¦SÜe«Ù+Ú-åòëhŸÛÞR5ùò` †’Ôg³Ð•ßNf@ÒEAÉD—ÐÖËå^-ùkõqß½¨}cÇ`ª‚h¾_¨óAËŒ‡ŽAPÐúBM<]Ü÷ MD Ñ:F¡u¿\å¼”ÖÑ„Ã`hy!¯ß1'O—©.[°é$¬k½,]sMʇG¡¬3ª&%ìõ¥íw0í1¼¬}ö´($ë‘ÊSBŠ· Žë̳§ª3¾·†DþIG—'Øa¤T¨M§ùƒœ.ã|AÆ6Q5¿3ËÞêŸÕ#¤­ì?@ÝeȾ‰BŽTÜscueûû%Ç‚,3Ôª?’ÌQ\û³ë;eŒŸ†<¸7ç—Ü×)Óyi›ú8Ëk×4$qEÝ:9œeŠîG<æ÷_àˆ/tàz'Nët­ÉxÜ +÷glü2®® O!ÝèCÖ½93ìôÙÆ_*©a …õD¼3»–èâ/ˆ’Ö®¼à–tõÊC¼z]îú¾¢(ñÏ~½ŸM¹ã±ÿ.#à:ônÓJÆê|ošAb%¬Äiªê3 M°úá]@’œïjoj'õÙ{˜D—ÚëF*‹/‡?Éå'Å!\˜ˆeÄ£Ýó5ئ;– ¤ÓÌî[f=O¼ótï«?=ê[("1AŠ“K£IÖOÅ»C¶+·àŠ3 U VkÍqˆWš–tpêþÌ1N«[„©Ë¦”cþpëY7ª|Rù³d<¶øiü7ÑL³¦%Mt1ÓÛ‚˜†ºĶÐÓ!E§ç¸ý$>ó*€€~0i÷ÄXÕÀÃg`ÈsFÃѸZ *%šHò± w),M,Ä~J¹9ç S-ÿc5 É•’w¶Ú#µÑ»ç¢áY¦:‘s‹{hh}ž>76 |Œ¹›U)y×R~L H€Ê좮!DG íM†2¸Ó9ýröþ<2‚Yqñ‚pÉr‡>Ÿ‹YV¡HHààCò˜O}÷x¡æŸm;>¯\>j$Ç9Jv=»7ØŒBW:ÜÚÛ\~ôm]<-h2ŒVòbÒGR&ÓÎjÎ@p°HRþtЉü1Á[ì #®W@S~õÇ’l°ú­á«b'ùÙáÜVS[E ºtz“ÕØ~%Mˆ¼²(51f–L›$°ÿ™Î¤/¨Ü}ù•{°¶&3M€}rÝX6¸ð€/@@t“±µûIñZ +ëŽ,/µs¡*/m¥$±¸§Þ˜¾§Û›§pnBÌHé”S*û0uœd²Â©èyÁ„Sçx"ŽšÓð§ÍïB½þôÁü{Y‹ð"ÂÏ1·¾Ú½IRA®ÙÜà‘=$Aê[ž„ÍŸþ媓D¸“§B1·ø ¼•"Höû÷Åj·Â¡Tˆû\ÑiÀ´G¿åG»xÿtÊí|ú?Ã4fÓmƒŒŠ% 2ôÝLTW¦‹Å&wË…j•¯?CÈÆ6X™-ù» "zQ׶Ó6å[g#Yóñäúd[†’°‘ã‹’È®óÐË" 6Ç”wue# ¬ MË%òG¦ìü) T sbw^˜¯ž«TMZ‰âK_5¤÷ýÈ¿“ÕÌß/ëâ¸|cÐùò{ý†VðÌSÛ¯Ã9rFòâý±6„ëhˆ·u^òö´g?›õ¡çxu) ìEºéµ5B=]× ;¥Â’Ë0¶§s7ÁjèSƒè‰#Jws¬Á¦ôE`"¨€:¾2̯sû6Œ¹cÌy!¤¬èb‘߸¬ÉZæc¼`ãû”mÍ—áM*ÛM&½{Rù³®óL–/ìœËG¬¤Á‰ß/é0™'_D¸ÑîWÛ­¹ð°cQþò¬-a ˜,EY(5JÉ4Nœè¦jEh]?L;x"üùÚ‡5Ï^Å8~AT©n2T³Tœ±¿A¿wÝWINîjK˜z¼Ú{jÈj9c¨(Mll‘_Œ‡Äñ›¿7^2êjNéÊzŠðë? œ™ãâ°bòY- 3cjåaŠ|Œ8í•»è‹p¹•2N¥€¨Z(Ó÷:c½JÈúMÈî¾vN›êè¥û}pÕ¿À kCn-,xŒ‰á¯Y®UÛ” ãç‘O(¥ÙýÎø'ó–CEƒºªëØeŠ ÿ€O¡•ÎýáÜ!ÄÕ³0ŽÿÙ™2"s¬o£w²;ÜëA¦{J(…5 ¡YlYÏšÈÚíi®Óâœûhå5ÄÊótZÉ“MÁ¡}—ágøN¬ cÝ ‘?ÃûÕ/Zy?aáj‹‡kÒ7}€*¨(5ߊßã1¶PhžÀt3íù¥@—I'•ÃB>1•GÚk:[„Pè{Ç$ÇZºô£ n[ý‘|¸aÏž³ ³{ÎÔ(ÂöTo°|кÂ@@%Ö˜·§X „¹=VA3ìB8Mä%dÿÀ·¦Û™~´FK3¨t_èl¿i'pw^ߊ¶÷?­Ö¦ˆ%•áæRaÏ„ápŒ{ÿÀ@´Z=GD'jqÜ7NØ#þjpþ;JxvVÔïÝô°˜ÛHhW ­Ô>oqd"y“¬CrîdÒm‚ÿÓú¶sÔ|I»î5lExYeW[{ßÌU“3¤à0Òp·åÍ…Mœ{áX¿à¤©Ø‰¼ƒaíHݨ*M(„%~çTßõÎ60CÈVî³Yû~©­ƒ?>æaßCX¾ydD`0+ù½ÎÞEŠ‹ÌFD‹ còKó­1zØãÿ Õš+çµP(¹§ 7c«¨ ½õÿž¯ôÓÞ÷²Àya];ço¿©ÿ +ϲiSÛz´­õ…¡I§ `~œm5é—ÀyyB‘Áƒ"[{ÁûqâoÓÐåºïªðRBøœ +;Øw3øGæüõù¤…Þì€E +ªõVÖ>ß"‰Ï“Br{´5ë¼â@u´@a¬Ö“saô| y\qÊýÛþÔ*¾Ï|ffi&Qå +žzÊ6âÄ:gÒ¬?yéM|â(¦‰RÕùr ði­æp2¤ˆp(â 1¤¸£œ¡æ1Rᨅ 59©ðÏ~J{ÖÜñÙôu³Y+ÂJàå)$Müà¹kMˆz,ª.hÚU ñ…1FÑÖÅ*§, /+CÅe+ÅàãïG›},{S&›1ê’™l8ÈÏ›òIø°°€¸¤•·©x€*Ú§wH™^kŽ6ìÔZ$Hq¼Æ!Ü Oý#$*%UˆÜGP õi±}&ÌKá6ºÙÍ(ô@€ØuzZ Ý^ˆà>ªR|­ fö*9 Ÿ}&R°ýgFÝ^å†áÞõ°(|õA~øo,"ÊŠöjes>@vôfK=²ŸßýÄý¥¹£ì“ã§.WòÞNBtÎáÂLå*B±Æ5“¢MÔ®øÙûè¡Cž)øð nßúB¦€×~µ_ƒ8c“Îãš(‚×'ÏÙ¿²6¬iÓкõ°T«¥‰;kÔ4¥ÒªÐÞ™bä® 5˜Ò´íEXŠC†q)6ôfWº‘d0¥àl‚$8ç< +Ì“ ¦Nó”-ü¨(Û–7 .\2Q0¼[ã>ÞÞc¼9&‹+LÄ@¸J°aiÆ—23Äoâ+Åçu%•!·îÐ èä™G—!WùIŽ‰ó¢fÌŒp V[ºÁ);A Ž+Pc¹ÚY¨N7ÓfH¡RÜõªv¸¯Î_ÛüdE…Ð鼦‰ˆzèže.7-„ê½NϨ?iœ¢}U'ÓÁ¦çÿ +Úóž¨e6[x5±IœG·6ünñ>ìlu ¬YØÐâBZ *7VU?Átr T1[¸™w¯ËÖj6Ó”äê#ŒSÔ\D¾y¶¢yÂw” k7ÏC¤Î‹ b‡døé’|7ÝÖè¯:9so³h2ûñ¸î–¾ÈUªû—rl’9å'sÙ°Q@ýBîå6Õ:íkX‹(­ió¼·õUðW¼ÕÂîcŠ˜-¹¤ƒ¾-Nyˆ®:RjQ4KàŒTÇc—ûÜœï¥&)ëdQb¼‘– ˜hïáœ#±»¬žS£`KXÓK5S°]Ħ~ WUðã?É g7ÚX¿~p™ÑðÎu=*•ÝGK;t·Ú›iC¢­Õc‘n6=‡˜ñtÄY9ÉæU¹¿«õ¸² êvæão?32y ÊÂEò^‚iYk»QD}ÔÓp>ÌÔ>¨[ÑeØØÙÎGuncáTçÊÅGP½L`.عjÝVͳ…U16–!]!•PN‘âñ³ª^{[T´^Þ•tBÅ.‘¿˜ç‡n\¾„a ªáàïëðõGn‡ ÜÌÂí?¨‘‘å²cýP'}¿ô51iå0¦Tz4½‹Úç=Á‹º£ë°½„ª&koMæ!ø\ß"g*ãÐu»r £6„ŽÑm­³šÞRAàÐ,H¶ëUõ@=ÒØೞTÄ2–‰ÆŽ÷ã3él~ éÅ»{ º;j•ÜvÓœ:Ý×I“ª]:³Í~ÿòYŒ“o4|l‘E½&$è0¼¾Mi4p˜òÈK]Pào½Ö§Y[5¯…ˆDEì¬h.«POýéµû’%.71&x—Ïèó+xgŒÓ`*”¥n*04üøý±@Ó]ì ײ»«Q½»;(s†'FTkhÃ…û53èÞT?>·:ïðI^Ä&¯ñª¹˜SùÂysð&Ú‚œŸÊ¿–<㈮¹_½<ýrz@go*aÄM½ù Uß¹õÊ&ÑQù™ÉS€AéÝa’S2N—‚ÃÖT¾ÎÁ²Ûä!µVEýn×?ÃDI%q(P{<·ëÑÊÏ1ÉT_§ åíæ8UON„·:°#‰©_R;×|öwˆåoxr¡9ÂÃ8smª¾F¶¦%ÄM‡(è99ÄòîúÄc˜†Å‘¼öJj¬ªÅ2¦<¤®nt [.K©Ã`-›]ì†ý0HýÍþ©.l7ƤSÄBîÆ\+õ;ŽÑ®Bs…ÈþöÕ¦ÙG•..vè»6ˆ_RÙ]¿Åâž¹AÿNh¼ãšc A4Ì×Ùrí¼Ülwƒ ]ÇL`©xNªe–eé;ø»¯çnðœB622ݧ1‡n7ú½+n¶ôHàû:/øå%5†}ÎœÐüÇ*cK[\µ)/0Zõ:Tx ×WÇ`G,96\=k°ß¼0 ô¸z{—Už I[ë‹p†¨`ûq … T¶dp½”z2¶º£H5³SÿæGPýŽÌ.\Œ¸p3àzW‘‡~Qh¥ÞNLè¾\‘YŸnÕ­^o…Œ)Èó”å~vûL·Îò‡*´Ž¦9u#ü=]KÝÅ7:l1ãž(oìÅc'ç1tB¨® ií<‹½n°ÖÚGT¼8 Z-á{#Ý_H7©2!j·´$PˆïBë*ÇÛ¿˜øÀ3¹ø Ûꦶ §Al(,8(ëC=»Òt(Ø‹®=8û~b¶ˆ†Ð¡~á§=\õvÉ' AG+‘¤¯Ûœ’Æ—߆%{R ;Ò毲íS~0²L…r”èã«3qû¹$¸^Ï„Ò4VÔRJ»Ã׶J™~rë/×a«)G²:Vê„ ò ÛªzVm|Ç·ªnZCÆuP½5þjBoËþ•‰{º.u½HÐ8¦ýáÑ»BI¯ïöÁå¼9ö˻ò®ÔŸV9N‡-z(~ÎzÜ”œ¿‡eÌ?‹÷¯¸™Ø?ÎÝS“íHþÀi¹OB*jám<ÕœZ–[’‹và™±lcxf‹hâ&^2$w +ÎÒOVYrX¢ïàwJŒSôm‡¯)&`WfXñï³’Ò‚‰oRâ­‘cƒ'ò­–c^ÎlïŽOF–õ×Ùgäëf>MÅ·+(çÑ£ø½fM•ÝiïJÍ+lÉÎ$›©Øȧi‹ Kº¢»»þYÆa´á+“Ðã)ÕÕ;{¶ +{郎£¼Ã/ô‰ï-˨–ÞëijNg°ÐMë"@þ0ƒ[ ®xžd/mý€p @{ m·bÊ3ö£±™W€¯>š‰øç_ìŒïyž"ÿÜßXvܺ†FŽ• -+›5Æô™6ì{ˆñéŽzÔOBz>1%Α}}mBl*î Èà+’?îÍ6 ±3™þ™^\É;<·ør ø»(YËV¼5,{n½@Ø`2Ÿ<Þ#‡æé6~p/Ø t+—¢44bOT§UŸPʲÁ%Ï™Ý×êmŠ¿¶kš¹ÒÍ»¿^Q6R|Vœ=¡ÒÝ03ÉX­®/Õ¨îmˆÔ-gNGŒT=(k÷m‘mÏòæôB"VžŽ”õhs>ƒ²ß€ ¦|–¼,–¹g,Tà³wÐ Dt:‚vmœ¿[ñ²ìþ‰hï:©AãÓ>ȼK}êPJL¶¦¥;“_ªÞ!Ëѯô¢ßn³1VÕöe¬W¿FèÇHKi(ã%WQŒK>÷K ÜDV¾ˆšƒ(•‡õ-¡•¡¯Ô¼a†¸$E@Q‡¼Â(‹gÏ#'%‹¸\¡íͷ¡P‰Õs÷úëC¶•Rä,wœ©¹äÔº1¶wЕ@®ñút„À—ª|­écho>àW{ÿ»Ì6+(RÝÇ ]\Ä2ÖZ!M; Ly–whÊDDëÊ¿£êDœâŸ€ylÊð–Syûwzcc”S©Ä’QÄÍ&Ó(füaÍ+uà³þ{ýîTÄ3[ÜaÔ +^Á?g½Ç[eœ[T.¸;8Ëñ1S¢ÒŠs¹£ìãíÃ.õy‡¸MnÕ\v¡.Tü©Ä%ñõdaÑÉ•%úh¡æÍ".‰„%{O÷0+íøHæ¢D!‹fäYvç׺X¿R+b-Ý°M&ã\ †Úç¾5 +7³”rÁ©£håIËC3L—ÏÝ| á`õ|,bÂd¨VŸŠFsbðdQãØ*Y„ÒË×Úó2ξäÑø~Ð@HÿtyYÓ%ô@웸xœ×­j)œL‘S b(€hãûÜs ­âMß?j«%ÔpVjÖD²Þ}Ä ož)?·ŽLH{ï"£ñgð>ž¢^¤?¼#™G¶|gF˜5¹ÒoPûæ*Ï›:åC²fn°±\ÜEÞ'µ1[™Ðý-î…ƒ€ª^J€•†h$>rþ]™4Q¶â@/;¸€’ÅJRlºl,HŠœi¢~Æ»ü›ŸïÁeé^v×eatÀ cI~ž¿o=•¦œ÷²U?¦¢)‚QÃ-Ò…{ˆbú'2)Û™”²ÿóe6Å ²›6©U5Ã;ßðþ4(é@ñ㬃´nž­ÂøZáNÐp»‘$!¢ã½e“JŽV-õ¬·xØ«ôz-o¾óá@%³hL 21F+—t"±£ŽÚ1N eá!q…cÉM¬¹J÷AÝ}²m‘”Ðn.~,r%UŸtg€|d4N[¯]rÖUöì!—q4Ì™§M†éýx¼¼°z4ÉÜVzv‚5+=rCMõÂ}@Þrþ‚ó!bàS_ä6ýŸ—µÆw¬‰«+FE€ô¼f‰ðPµNªéö~yÚ½VƒL½Ä«ÅcÈòæqA‘ ‹$‹@BÊñ0oþ<ÓörÖq@‹¼Ìj=ù†Øz­X©Ö»à⣣ÙVæTâYMi£ÒÓK¨×l´—틧¡{¥»¬ëe˜R™ÏJñ­j}Ú§ÝoìU¿ë à{™ä–\©†õ6Ü:ƒ·¬ct5I/« €,¸Eð=÷ Â8i¢+~[‰2ðL~¿%˽ΨEdµÄ3C}®éX…VÇÝ?àëV!CŽä‚à`D2Òé4Û%‘çÖ9¿×õH„)¥ð„ÁúO”P7tt1iU~½&=I¾òèÏF}=шû\XUêÅá[&¹î3=ûŠ†ž2¦8Š¼á"GĘ›À[pClC½ÆXÊÉÍÿQi¶Qk bºmj‹df$Àw =õ´åƒ‡”]·¨¼þÑØŸKƒ©ÄøÄ[¨žúÝðq*ø!y›%Å…øØLÏ?×-+Ù‚õ´RGÒX I†ÿI±`dìÚhZN¹Í"VÛ‡ûô2_®ËâÈ«Rßó!«r +2¯å²vƒêõj:¨¿Q<¯%C/õ±c“I+úI~ŠøwØc`µÝµýƒ§¡þŽ¤ûJâ˜ô ]8 SÆ/¸÷E.ƒa©4Íî¢gb‹òéž7î;‹f"pçìÏðB]u±¿‘ßó‡èãb·4îžiÀ[.þB&Òva­¬7*l?TГ„ræÝÜnàœ`á'r¬Ó¦Ló1&9¿å8ƒÓG§~p…QxcÃÒ=´Z‘ðŽ±Ä5ä‡Ø×n™ù VbY§©àùÏ"§Ñœ}úþZ–§75’¿@-[Ë›œ1=u˜Oÿa"&¦u¶|Êê;ÏõåÅÆŸ'?Hl4ëE\³Üà#ï<Æ— +¹`†\ÿ¥¨ª1¡Õ–£ªø«¤\Å'GË'²RSƒbzûÀ…´ãé‘!©¼?ôdFÕ±EÜ%üÝtk'õð‹äpNA‹Ûº†‘ã«óµýñÙyõ)¶'Þ¸$—( ºI‰fÞê¢*) +£ÖöQðŠ,$ªõ@˜Ôáö%Õóø*(lŒl>9h¼à˜áxJ¹öÅþãn ˆï§šxíWE¦º²Úa2”b÷^+BBF¶-c¬>À‡ ïç ›Ô„üR¸²ý³áìKE±®èÕ'¥Åq5/ÃÊÛËÑ»ï-ï'{+Z‚"Ìô”{9…Öñ›‰ò¥YnY’8ùUú³­^dËÈæõqàÝÝÚJÌ7C)[yðîñïÆ^3>@–cÉã1ùéóRŒ€Í}hH˸À ÒlÛu…ûÎ÷e]“$;eÑFøUo¡â_õ÷[±S}•ùÉ%=4qEãå.\ïÚ4ãòoðá#;íC•ßw®îÊñáq–Ó ’òS„Uóë$׈ÉÌ‚Ëç«0Ã&q¾å¤üPàÄ´ø´€D g+m„• OÑ v÷ù#¹r”üœ¿yÁ(›‚9MÌ ¶1;–/ņ޺úàËÓ=’8s(ÀÐgŽúá„©¨­¦ +NaãLïñ˾œ[{Uy<-Þ€-§Žà@÷ÎG{|Ñâ'ú*&MËDß×°‚ÚKÆí¹W!¡ÏN¤µ‘ÖÅe<Ò}øÖÐÇÞfnÑ»…³µêmºŽ5Y ’8&€ù³js¬†]ea^å(Þ¦14üŒ`pË{B/{ã“ÜŘÊgþ6<ÔÆGE§Iwuy³¯<¡= 7…ýÉ̸¶ä3…}€ÉüR4{Ò^ø<zN‚‚!y™ÃÛíÃáxVRο0,¹V‡}’Op7A7!ÐTÑQP˜ùT™ÜÞl,P½ÙTE™>>™åÝ°^ûþR›„»¸8'n¤-ìJk®²QC + ¦Ô"ZñwOòï™»ÏöP÷ê¨.ÐJî~&Ö>zm^B¦[s°'òYøš×Y­D˜¾ +¨ÿKuß!å"|ÐÙEÆVÌð}†ô¡¿ O'®ÖÎþ€å&-¸ùhì8ö²0ËüÀëèæy€ôõ«`o­$‡Rš´y?…|¨ç>K/µ^¸°«l/J¿í§öÙÄ¿Ñ׶ݶëÒ“<‰âïŒçî*O©ÍTK?5;º(›o³ÇUJN¤P3 +øÍæ6?ÅÖ%X<²˜6˜ü” èýÇÓ·55ιbÏ(L853ïáˆÕë¡›íÐêº/ÂÐ7q‹^¿_5 +r•ŽQ¾¹42"ÒQyܽ…8[E~*ï\ºÊYòÃå«&R½n<NÁŽ¨ÎŒóöÀ8mÈpf0 <«±Ìœ/Fµ{ —·î9ýöÝ„PœÒÄ@cÅÿ4¦; ™«×”¯ü¨K­ À$çdLÎð©»$?ÊCîYÇF¢á‰á&Ø,ØÏ<Ú#@Ë%® ]g‰hƦÌäÒ†F`{&(]ž·/iÇÕÜ\p±"Ëbö>¸M¸  ý¡$úu}ÞÕ*äW˹ÑwçQ +®ŽW_hi+yñ¸âÅ‹…† +ë‰f m…ÚÐJï¬ùÏ¥‹û ´¤ešÌiûFt& ß–³´Ó²ë“´›>Y`™å³{ëéÄ2 û“°dõ>sf gz s‘žI Ï¡¡Æá÷”êK“VeùÞÉÄ;NIN² -ÅêàÒ[xŽø?‹¬ !¼Ž”xí°åJ¦v> endobj -1015 0 obj << +1025 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /TMDQVH+NimbusMonL-ReguObli +/FontName /SVLVEN+NimbusMonL-ReguObli /ItalicAngle -12 /StemV 43 /XHeight 426 /FontBBox [-61 -237 774 811] /Flags 4 /CharSet (/quotedbl/numbersign/parenleft/parenright/plus/hyphen/period/four/six/colon/B/C/D/F/I/N/O/R/T/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 1016 0 R +/FontFile 1026 0 R >> endobj -2100 0 obj +2130 0 obj [600 600 0 0 0 0 600 600 0 600 0 600 600 0 0 0 0 0 600 0 600 0 0 0 600 0 0 0 0 0 0 0 600 600 600 0 600 0 0 600 0 0 0 0 600 600 0 0 600 0 600 0 0 0 0 0 0 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -939 0 obj << +949 0 obj << /Length1 1606 /Length2 17112 /Length3 532 @@ -9808,104 +9968,107 @@ xÚ¬ .†ÖF #['*€©#ÀúßÀÈÎÖØâŸÒœèÿb 9 Nö&F™¸™Øÿc¢Ø›8ÚX89ýýX8Ì lÿöÀÙ`akdíbüOõ¦vÿJÈÞÑÍ_Û_0;'g'#G {gÀߨ ¢bÿÎÓÙÜÀùŸØNÍ;Ó¿žÆvF.ÿ”ô/Û_˜¿Vg ['€³‰»ó?± MÆNöÖcÿ³w´øW.N¶fÿ•-ÀÑÄÌÀÑØÚÄÉé/Ì_ìºó_uþ·ê ìí­=þuÚî_^ÿ+ g'kSz&æ¿1œÿÆ6³°…aøgP$mMíLŒÿÖ»ØÿO›«‰ã¿DùÏÌPýMÂÀØÎÖÚ`lb à gçü7$€òÿŽeúÿ>’ÿ(þo!ø¿…Þÿ7rÿ“£ÿíÿ¿Þçÿ„s±¶–3°ù;ÿ^0€¿Æ øgÇüÿ| l,¬=þÞÿé¨fòï ÿO ’ÎÛ dkö— -FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ƒªšœœˆ<ÍnÓy)üeÝYÙÃþobÿ£Y;ãÿ%üƒ!,lçð¢ceÐ1spØ9™œL>ÿ‡hÿ‚aú/YÖÀÙÑ õ·dF¦þ?¾ÿ’tþ懭‘ñ?S¢äl`küw°þ—ⳑ‹£ã_>ÿu×ÿü?帉‰»‰ÌÚ²O°eú¯ ç:ÌÜ‘IQ­>&БûÒFå¢ÿ»^¿ôð]®JýÏÚú¦iîïv¥sû¯C)꣱> kŠÞT“ë|<ªþä-òNš£@ÝRøŒ µh¯›E™0MvFÕ£½IÅŸº%ŸøÓ,ŽP7/Tþ$®þh¤Ïö¾Fi qè]HM@(u…çäI§/ÏC¿GG†{ïÀûqirâ Éx\ÁàÉ£ürp4U*½"¨—Ž3Ç'­1/ÍzG$91Ø7™Ây¶*GÜ|®1ïOåñ•`GíGˆ\.­=û“æúüq†;÷šLÉ»‰î«;¿ÐÄ“n\¤ÎõðÖYNùÜóÒ1àL—ëFb$]#b²ûób€aOžcxwK÷ ‘„%&B™‚ºo"ä¾²’UÏìU(­Ñdù?ç ‘îj\I‘näQÒ÷í9~5\ýYsÈ 4Õ;¯>ꪅª®c`r *§Ž¾í1I>T -Ð÷ª-KCºæì¢]•ß@e›‡á±Í R©e7ãÝ8æ¥X¼Ý ú^¯bª¿fiWã¦Ç6hé("ôæ?ü…$ØVS̓÷â¹-Àõæ}DJš2½œœ$~T’D™ˆ‡…:Nq®ó#5ßì" 󧈼ˆÎQჶL–­Èµðc“Êç؉/WöýîŸX2ŸÈÈðxª©-“[¿F7žsWÆ{4B -pÇ€úâLV›‰¨ÛE°¼õ`K«Vá½Öž\ºÍªk:K?>1ÁÆy9ãd™5 @P2ƒ÷Í°]öþ6Í(9Ð`®¦ ~ Ì¢ß +¹9y´Æ¢]’ˆåþJ¿*ú¨ gÒöK“]?e’CÌ(m -D\ïN¤Ô´|˜Ǧ¡‹Uf¥—øŒÉïÀúÒáè -ûÙ £)¨Ž&‹"º–Qª86Æ…‡â9xV6jƒxlˆÊù†º’2–^ù -|Ò Ä;c g¯lt_´û•jP°– ¼ãT³mê=-ŽÙ - ËÖ /¨é?&§ Ã­¤oø -%Ñ]µÃ³V‹Éµ‡†#hižrX£2¾K±²Å?²©Ç‹t3V<«×üHl'}µ“œ7ÂnhJ권buKÉ)O^Œ Z5‰OßöÚÖ?ý<ÿs88z™l­; %ÔVæ ËŒõ”ððßEôÌH«íjÚ ~öÖ´Öb}ë­MùñÍê+GÝq’Yµ£[N¢+C1¸Ë¯öýµgî;ƒBµÖcæ4vP“"d×sžåxñ^ÚÁ9O^jŒŸ»e: £$‰µåf~)Z–Tz=a“2¨ÕæSÐÞ»V›áçp"êcýK¹Wåã»/Íx=‹ -RÚ8Ýw>SÓ¯S®A˜Ç©ó-×;%¾À˜úeiH—faP$÷Då€ãCã&¢A†C ѾB&eQ/MN¯µÊQg¿NÊèÑ8o©­?²ËˆR(iæŽO¿Œz‹~€èßöØ°ŸŸÊ€ù#!Î4uðÏU¤ KqŸV!rÉœt„Èä´n"/«åâPH<8±Ìà%!*áÂÇbhO‰†o‹›Cd¨· †Q>ÎN{©’ÑòíÀkÕÍ=ý.8}"Æî™Ux§ñ~Ê©jG¤SY¹Ÿc[kÑ‘pœr)h‹xŽ7ó—Š›Æ]BöTx¿0¬ÝcàÏ}0p²¢A17y,óUø‚‚¢·…ø¿K,ZS¥VÇìóK—Àd=ˆúÓ‡j €Ÿ;¢’Ÿ×¡ôã+J‘RPl3ï˜ùÆïy4¬Ôx_½´oõƒŠHÅÔ·vS_ü AåÒg˜Î_Ý„õ’~w?@’4ýQîï(á"[Eq¬ã si5׳¬ÄÈ—D|ÌŸ|çå¸K¬m@e½)ÿø’– -ß$TAÂrü—ÇDUËx,¬mCFË„vh”V¬èæÝod%·Ýͼc‹ò¡R´©kð97Aa¸ö<ër Ñ¿5{ßîRÖÀª—Öì6 °¿ÒÅŽð.Îe“ž¿|€³ÉŒÎ¤Àa;ó›c ø1憀^Ñå݈2ð#"ÎúÎøYkK?¤ãž4rIt\IIÛaë°†;ÒD™øÃW=ü÷œ÷YÅ+˜©rM‘!ˆÑ'ëâ§λ‡Þl è‡ÕŽ¿MZaÆ©wO/ˆ¤ÿä‘¿<y±Ç-û"å{a«Øçé¹WÑs<¨ðÀ%ìÝH(*ævØÃíý¢_õ¦fŽÏZ5X¥¥6­›Þj<ßó±/¹ç*£ÅJÏ“o“¾™ˆÒ¼¬¡µ6"£Í·@¼çÂKtÛF3c‰¬#«;¾HõOR¹éGA½qW/}gTHLŠ‡Ö-'¾ŸÔkí2„}ÆÅ6ðû {î56Ë!l<À-€èÇUq;=t}ÃY)¬8Ýø3yìáœ9oÙìF€s#MSþ‘»Ží®@§$Ùýû(§îºÑ¶±ý¯ë È>loD‚K{à[ì1_s©–¤ ÑLâ”Z|µÙÿ‡L§/:OMz}ÈÔïKHï~-ð_Åt¦¶Ÿ ë­‹­åÁüW“Ý$ýAƘ¹ß3¯œl×âr,ëâ€y¥&0•²jmÚqý[„ìÑL6Qb~´+¹PÄ-sÙø¿µ$ÈÑ*ªï ¥ ðÈOÓ…¦JûèY[éýSækŒ¹©[üm}ÿ˜Ð6L÷èO³[²ò½¼ƒëÆÐNOp:„ùHïä7CĬ“ü]½yî´¶ïïÃ>Õ“·aý'×M½®qê äîbà_w– ž]4ðÚÀˆ²öÒøÞó¬n +: § Ìô 8û›cÑJR[2£mXÅw‹}y7ˆ×ÅLeD$ç,?Yh{³ÛÆBÅΙki¿ŽøК¿ Ø1ò°ºŸ;eó‚T›n|˜)94µ9uæÐ¥x´ ƒã½R ->ç³]æoM%„£¬ÎG)³‘4°ký‡ïbZ~ø ¼`_[hã»8ë<¾4²}$.îÁ³ÖÄ‚(¥ªæu†&ÿaÜÀ™y£Û2¤³‹Ô»¹T+ªJÀҙçÍÁØØJJ,šëò¾v\TP‚Êü´iÚõ pÃsùâäFáã!ÌnT)^”"²À±R'ºƒÀ q)J‡4`¿s]¼ÉZGâï”œÒ Òœƒ(BÖqˆú(““v&ø­3UÏ‚Bþñè› ™Œb‹Zˆüù Ir2Ÿվ ¾îÄ›7ïX)c¼5&•‚OϺ÷•—2nµÏÄGýÓ¯?74¥Ü׳ Ž²Å­Tj(–Eãs‹ &‰Rð³ÐѵL‘ˆÁ3²pæuy6©Ì7k‰¨‘}¤TêÄoÊ"´wÂñls ò­Eâë2¦'jQ®,ßéàHˆ]í„äÛct? ÁÕÑÊ,Ga³ýý¥­Ý2^¤d0•NUx¤$"e`à%~7*ýþ¬Ø挭©Ÿˆ{cÃl³?hZFCH7U£*´Ü‹Ç‚Ìy|±°8ô.šÎXAÐufóË ".Ä-_Z “MÄâë뙤—¡¹Â‡Ý÷í[áÉ\DZQR÷¡ x“à¼K)Ý)‚pÊåDÃ’«¼m“­HÁ• <¨üˆ´Ÿ_Ä1ÉðkH/·)(_|ýû2ª,B³i‡Ðñ4V®ÌCøY¹5õB2Ey»…yö47£h¬Bù\=m‡r94ÚOäjùãwiºð_w ÎvMíð¬òüò[°4ê©—Tÿ³š™\Ó¯r»N1†c-8!âΤұtzžK,בZÅ5…ÍCÅg€„ »öˆÍÐJÎÑ=–|üËÊ,u‘,Yƒغù‹ÑîÇôBÞ¬ƒé\¦SM„ L¿ÐÛºp`i5U])ÖìUæt™PÚŸhlA¨6`¦ãqµ"~g2è2êþ6d`{#Cn³W!Ïw¦I¼Lwdk J)ýK‡"™¬ô&¶ºV0ÀfÓ¡?þr83)J‚$È4?$ àE•´Åì²›¯:Ÿ -Œ(iýŽà-º 7~õSLcüýkÅ!.0Yü:7— `hPêoˆÜä¦ójÂlƒG¥v‚j»8Ç«Á¨›ÕäÅÆ6nÂN'éú3ÑX®ÐH¨Ïü%›zl½ ýƒ©´T~Ú}ÂwlzŒ(D:ooV¯Ãúe@Xrݪ#ç‡ d4C:«G‚nxŠôÒ¤Xç©þƒê¢dÑ^øÎg’´k½›Ú}Áîí{åÅÄõW·F°;ª¬ë§Â×òh`7d H—”µNº’7G«5–-™¥Ïà 1‹†d ®\É(¸¬®&Á€%þg› R¤q[â’ÖÀ.Ê¡\ÔýÔG&ùƒÔä1Gô!ríØŽHÀÊÏôØD¾!eeÈ2¯ª ­òûôÅ![é@8Í1J©áRJËÁE·¤]wú³{D1Â_¤ Ó¿’²\ýz¯ö §D‚ßìñ¯Ìd$!ÉÝ–#/û$ÅVrþlAŒÕ„ž­·:@¬RÏhV‡ƒTW÷ði¼&ßVQžb‘¦°$Í?^ªøŠJj ¹vQÕ±:³´FRƒK«}ÏGL©ôÐ÷±ûûAÜ8€)dä±”Z®N¨æîuQÕw_ ºLã®páý±•¯ŽÄ—¢9Qök¼`EËih[úª•³Á5?M”õÝãõû ØÃ)’'¸Q·*ó4yΊìðüC[I&«Ýrx”/Ø`x0…oÝûsËÙsïsìêƒø—弫Œ诗´% \˜Ò„-qBÏÐá¹ †^ n u^CE ’¡ù‰ÝĶAµXþ¤@á¼ömÿÒ’JÀf)Ë‹MÞÈRÁëVSi•#w6VBÐù£®QŒßk¨£1#ð9‚ïq?ô¥VAØAÿו° ¶ì.Ü5.óQøw¿­'zÁ7°…#|ÝX#c½r"ëòUt™îÖÔRìáϳ—åd—ã0Â{)ÒuŒÉô˜t’’•û6°Aêõvƒz»§ö»`~LÑ%óÌ·«š™,"QW½^CDDûa.˜ª¨ƒµ ÜöBŒvUÛaÀvæƒ~ç÷%ƒ#™D@¬Êž±H •e—„7tà›¹¬6–O_pãÊÑŸÀ)ÏÐ÷#lžtñôË.jLt•¤ÍÊv)nè>¡á˜T‚nü%´öª•K]^sõ'lÙ²k2]¿÷þ5#Ä®j@o^'Å|³ÂÎp?èÅyIß»7ç ¶ÞJ\pA·F¾#Û÷jYó\a@D‚Y>›‘Sa? -)‡¿ ÕÖÏéÛNÄD]*¾ÔŸæ›õ· ­‡.kÙõ£a ü:ræ\e·ûá&ÈÉDŽ¿Œ™%_$$3}9šü• Š8$½¬€È¢þàÎg×™„¿ZuÎÚ8רË=~³a#›L]gŽyiðÎ+.ÐÇå‹6{™jšSksÀ›ø¥qéD¾ ~Èͯõ{Ó·Æm'¤v;?«A%qÐ7ú"úpM°!(ïx[„Ô]Ä,…u‹0~‘—Ý›°ùot…ÿ‘vm¸oŸÓÔ/˜àyÝSÝñ}Ó"‡ÍÿImñ@üñ¥Çýawú™¿9Zôèý öI„÷,`¯ImJ /¿!UÕ†[ƒÒni$%µÖwjÂíÏ÷•y†’Úª? ü¸Ôî¿¥8«?—ÇÍá4êµq5‡g7¶}E¹l“lRŒg{ ©Ò2±°Ÿ. nÇL^ªJéˆYç¹¾‡(Š©?fÔ2ciÛŒ<¦É¥¼""—@ƒ Èí•Ú!kŽ 5+V=ÑÅQA+žß͸ÒË;vƒô% ÎFº+s*)¼Xs9NÛß™üÑ¥˜L¦ºÿ[YÛyt¼ÿ²ô„ xÚ:tés®` [Öx³(³û¥šrvrÓ vÝW+—ºù.myÙï=Ÿ†Ì†Q54ÕxÑîÊa•Ÿ‚T`ò—`È „^3¥>5¥UºaÝH‚c™'x‚.löÓ°g™~»uFˆÄÈ8ˆò€ b ÿ.¸%Û »ðPâ*¡L;.w_÷<Ê/¸‚óŸ‡o£ ov£~8ù8‘ïV¶qãf -åÚ`qÈoa’:Üà}ÒË’àóI¡ Å¡H±`í ¾‹¢R¯u²Í3}›’«˜Œ(-ž ŒßDÇîwëôêé‚t­»Ìt«Ã¯W¹4#UâRwXPƯY“4ìg·FRß vßû<ÔxP>†uÂËe&+W-\O+NcÓÈ«¦ˆdÉÊç°Ÿuµ‚^¸Îö%oH¦£¾]ü¨G,ïjçís”'Ù#~3’âø‘JÝ’J¯E«N²A»‘_l ØÙ1U¶c3  ˆ¾G»m+–¦VÙû©|¬-íÛ`»õ¿lf³$Ú«ôŒóÌžÕÅ›±Ëšûvy7ÅtU¯Z¥lÂÙñÏ,¿ Nªä@Ëäþ‡¼%NRs¦P†[¼‰P?ß”ÛI¤eo Õ wö¹¥@´!è&/Ä8Ù×öÐŒëÝñ‡þî…l<œ%š.Ò™{A•£@lŸA µÆ? wR,»SQ,H›ÀuQÚå¯>¡UAﻵÔ/£²­™Ï&/Ö…JVíù9@(üˆõ›œÏt\ F;éœt­Ha|þ­ZÇ)Ýb®4¶H„¸îbtÜ©. -Dì2Çüߢ¿¢‚IÔnèEYÒÒÇe)ü²:V ùUš>иɚúq:…mɲ¶þUñNžY±B§Ýêƒ&³Ã¼]Rý*ÃŽûý=*n…ѽKv„hf0ó;!ØÅ .&f«RÚ„ Ï‹ë&e¤ãe}|“x$Ó½ââ;£kgž=çyÅg©Þ+a…¶’û.Î)†Ú`NËiߜʼnW«Uäç*i¼/W 6æø>±§“ t6ó –p2/ÉõÚzî„øÑ=h>±` -n5TÁšëÑ”’ÐX"GEÉ.4–ú&µ¼ ØØ…'Àú|€PÜLêar ¾0N1fo÷í¼Á¶Uå" ‹*0âù$]s¨>ÓΆ”'â¾ÞÑØèÝf6qì©)¡}mZ€šÍûIÄN§ -Îþ@PD # V{¿Ö%þVõ|3ùÈ”JE3)&Níð{_’ Ê m3™Î1 oåñ S“•/bì~O«¸8/*™Œ²éëíZφä(.Pÿ§žÏdÔö¤¾X<é§îrî9YJÛ)E抰z6Ø/v0 ¡ ªD °¾T㹋˜€7ýP“Ú¡ûµ¿^¶û°iDØF…ṳ̈9Ô\ðØDˆ“Ï%Ë;¥Ø—qëŒà2ß œNý.¶8bWÉI0Uy®ƒÎÈfPw³‘ Õ8ŒÌ" Çsäs -ZmØFÐÃʶÞïPhzI÷™ð€*qaBrÒ·Ø^ðƒMâÝàí-Õ¨ô¡À˜å®™ÂÞžÑÉö>u¼ ‰ŠÏãonŒ{óæâ<ŠéU¿˜f);›Íp±OË,¾†ª™ŸÔL~‡(ÂJšWQû¨ -`þ* ÎŒÔÀh0±ì$(]J+?!uR[LGÓOÁ ->DGÓyØ}—(l ø &‰åSß}fÄ †ù©»7«ôÖÞ •ŸÑ;!)îüP_©cEìì_Ï“Á’TYj¥àê§ïS({ çÑd -± éÇ¥µ¨ÿ‹0Ò±«ö¡`¢/³I Ph¦€ZhtDįcÅxBkô¹õ¾z힢Uˆ1áû-C^­î@\’ž¶Ê#f„†µ]òOÍÕ5 Ñôh‚˜CGÚc(hƼ<@žðŒe/ºˆ¾]úyèŸãgT —–B„W‹:ƒÅ‹"p+EŒŒûE|ë7p<*6~¾R—”{N f.]Æ&‡•è…MÀNsr'=d/UMzW¿¨8ûÎ=ªŽ´n¸ÚvDôÓM=×ArY8sœ‹ªf(ú²"’å®êvj×;¥ôŠË7/“æÖö¹]Ë\Ù”7Ùë•azgòá¶gÌ)RàÞ%H}!³¡i°Re<Ñ 7¡%ý¿¹a¢d:£gteµIˆ­¨*’ -‡–oü‘éO' °xd"뙂T¯·3z ^‡ø~LËÿ¡IÖBcP/giй.^ÿâ×úÔ¡/jƒX©ÛQÕ ­€ÒÆ-Ô¦4Ê{Ù·hïgZ¼'ªF§ó.²$2ÈÙB Æúž07êÅÌJFØ “|Àmv®å·Ìù´"Ëæn0jª8xB¯QÎïïˆþ”âÞþÐßÙ«À|˜­jiu›¡lQæ5ý%ßzÅŒãÎv¥ú…>GïÀ•Nv.óY‹=Šð ðô"¦k ¿E)û›™,$i{;vÓSë œ†œSW¿BPPúËj…+ýá{ÛÏáûg¬ššLœ/ -¹,6:üâƒ^ÔX'€å9U¿œ‹fkM6¼¿tî˜è^‚(Ò2g¡I›yÕ²˜RôÓ(.ãcÃÿBM¶SaÓv¨‚/uø¹!&jìdR¥ *ÿ!´BSJ‡ã !DË¢FT=B–žýÏm+›ä’…0Ñ¢­½ãmëIÆ}ÈATZS¾Ø ûú=óÀrèƒ!÷v§} ‚ü |8âìñ,¼ - ’¦ž~o8LÃć4»DÜ϶ÒlÊô‰'´:Y'ϵ:X–¹ȃKKÖr97…ü dé2 -{¡„Fuœ·3žÍÇoÕ‹Ü2C7§jy¸-Í@Šæ,dL//¢„KàôÌ°FYîÊ„³Ýþ9Å™êVþ©\ªGôZמL6ú3‹:—g›:‹¡RB£–†‘ž/Îç»v­KH©—Ôï[¾­mÁò¥®S%{ D4ÌuBÞ…ø,&ñ~‰‚F?Âì–\WöÉ¡r€ägµUê—ÚqqÜ6Mgy0#Ï•`¯Ô&Â~Œ[¢é°ŒnÒ#u"%`£–ŠžÏr­çgäeùÝy£ç#HZ@#‰F•Xý”ÚèíTÃl’Ä’2”XÇQ[ľN1’ÔD͸©ØÎbÜÙ{òdEÿÍžó¦˜ßTŸß¯£Y4v̪ߔcƒ>´ã¦´ŸÆ½;åø³U>.Y'²–¹.NŸöLM-©Í•åÂ߈¾x6·w\uÂTõ *ÁtÛ©X„ø6‡{AFi íDñËèŒ}âýì¬pK?N2%-MK2{%¾,æ)ÝPÍh5WtK¼˜/ä%‹(ü¦„¶â VÝ?Èþ¾uôÎEšwž]“¨Jb $Ùd+¦_wZ+MVÇ3”Fíh¹ÝG{>ôº0 ¬{ðÀ“ [^Ž O0~öãÊô`1õYû -*–÷oz ×PýÚúŽÇä–G”30¢ ò ¡€?Žê)^¿)’£Êw8:B-sìFDò±û¹Õ.¯ýaËmwñ¶ÀBUôz8sš3&¥JÎ|ñ$¡9ê -¿’ƒ½[žBš´¾™Kåd H*ž±yÈ"ýƒß ýzêXê>ªµÌWÕŽ“Ѥi$&N“yu°BIsŒŒÓoLª¸IòD·»ñŸ’ÆãÇ•ÑlèE)÷—¡OŠÌ:˜¶O-h/_cÂ:u* ý ‚(ÖÛõî9ç}y}F)ß×]>9]¾¬šæù%†­Ž8[pµŠ Úˆììˆ4eAäÙoÀÄÜ# Ò¹äY¼I©[ˆˆu÷Ìp•)ÁæDÚøõ l¡ù})¼ºjoÌa %h1•l­õíP”Eöd¡‹#ò!Œí±Y‡q4NaB¢#@÷3ÁÜ´*ìåFÖ‡ù–[>¼üózëþ2‰ØMÌDn…Þ ÜwKØ¢Y(i£X‹ßüƒd¤ú9ò ¯L,ÿì“^^ñëàö­ÂóY%)µ4ÙZ\ÔötôÕW¯ù­i ¢7,qK“ñâ”-Ç?ÑúE@•àë#¼‰&+ƒÄ0¸Ø¡¸04ºœ5Ö–›ÿë“WåÔ/¶fLƉèß‹›¥0³Å¡u±yØ°Ðu:¯Û{®[’ĸ2Ï}’ cu¶Þ÷²' )¦Z`‡`\… c¬—ÖÙ±{OÑØD°Çré ám;€¸LÐl} JÜ„Ž6 ‘nþ‹‚>°§nºxŽPc=‰6pÊè)L[‡+»†%ª}'¿P°aŽ‘45¨lG½>(ÅûE&-#Èkií·jEüÅ×Ö "ŸûmUó˜SvL „„§=ªA2Ÿ¶_5J¶Ôø¿ÒU‹‡_O·V°mîl= -æ7ÒÁÒq3‚`¦ t.Ó„c‰Nä•×wíÝZKGº¦Ô›.(ðÔà^æÕ—w[.,ÕZåŒ -cGM}!;4šÍCnœ®2'ÖÊïìù®? Œå¯@9ÖË'Ñ®æp]CÖ-C¼Dû]QPÓ-}yhÎëzqã©Ýcô‚®ËÚ+›ß™A;tocšn’Éæ¤-O‹ÛÃWÓ•ºžÛóÛž:]‚é#Â_fbÈ°g‘øÌÇ õPŠ€Ú†ÑPÅŽO£ªõdU “ï6dÍpŒ‹bçÆ©\¦©Þ÷Œ­;£&{"ÿÚé,–ŒO_»ÔÇÐ9V¼47M=ÍaÍ]:mÎïGAã›P.4”ªþ3€ãd—&•É–è*HfÅ„÷‚¼M:ÞÌk(g -4–·öÈZýjH sóG··»èV üY).üjcPÌ¥’»nÞÝtïw¼RÓTÔBÇA4MÚgw†çsI2½¾C®æÀɳ/™CŸÈ<€µƒòðð½·J'“8.}äjðg$Y[ì3úØ“ü=¸ ŒdÇäRŸ\4˜Y^ ßZóÖãD`LŒ³8äûX‡¸xã-·òú:Õ]PUˆo3‚¡©q¢ÎÈí¯¸âçü%­F~Ÿd¡Ü17br'ÓP¯Ú.~ÈFôêg´ªš’í2\x%ÃE…§é[#ùÍ[8‘çðÞÞª'Õª{±ôV2ZâvWùS×ve?sL¾d5׬¨sôßaJý.–óÌê0Í›øñ(#­FÎv}MD"]˜2?µfÕ_kÜ͇±MÞí'–‘nÇ[ gÞi×ê¨SÖ—¬€ðp:ªÌð/šEù3/ùkÑÍ Û1Æ•U -ŠéÑ:kÅÖ ›r}’õéŽVbbérªïHÎ7Õã³ßêí¥‹_©¼“×2[ëAõ°çô­JCRz!»‘<ùq3mÔ¢W[M0hÒ VÊíaL¦3zb¥ÿÐCNãú?O“lVŠšßÍÒ4Øë>Rj•·•ÛéD[÷87ž9(ÎÔ ëR„Ç?Jáf±;V¬32Ýy‚¢ÈÚ«òßü2ž°é: ;QU–8Ííx„µt¾n -vÚÑKâåÅíÍÓ¿½Í~¬?קS§ÎªôÉžµè6.¤K±“H?R‡yþnv8Âax9™:¯¼&ýµêo<çßb%ðórÿDí;Ú%§1M–UΗUÈÁXÒ6G«NJ"€Ùíì£â%Àì”w¶ðtý—_7×¾`!—ø§‰×o>v²|îÁÈç™±ÈBu:ºXXv9’nn*Ç÷ÝŽ#*%)½—-“u¸3ôž¶ú¯?N ` -;ÜÆŠF¸*Cb&Znf]C¡ÈN‹×6Á.þÂÑ, èW91£ðà«iK;m+úbTèSpïGsÊuÊkÏ&ALH^Ö™FV{ð$ ÝkúÝMbxáñå6ÿa˜ƒØÅYå›a¹5°þ¦J0Ëšëö“©¾é™ý¡ -Ó†©"S—Ïz_¥¬Sþ@Î lÀ£ì†D/®¨÷þ¹B­c0ˆb( º -ƒËsˆŸ.ÍÏxP£þþ\ næèJµõN*·ƒ7A—^…¯f£èïnò˜Øc#ï|<ÐŒ¹a=íÂèœL¹Çt}N9@œí2ò“º¬ð;ŒÔ’`Ÿš瘓gÛ–» “(kw“Hˆ«fz# ü«TU5aQW.;ì§øtÁTK!bñ6Û¨Ú±A2®Èü„è-£þ|âáŒMÍU5j2~áúˆ^]i‘åe-·¨^žÿWeoÙ~äèžÞÊ„×Cô®ïw= ý² {ì}Åï÷šNå)àÒ„½\Š*‹Jò|±WŽMí¡±Òøòo- kÈ“èZ±Õ6"Ù™þ\W7ϧGÂ}VÁc§Úª4ØXoM7ùwÂá›P«cþÕ’Ûl{lY B‰©Ù/šÌÝÖíü¾ì–­˜T¡ÁÜ?ï°êšš+‰¾Å’Ñs­êŠGô†äv5¶ÈÍÌ?ÈÖ§éBÄ<wsÕÆصŸ×ŒD¦¤9 ߥKòã_Ý»›’«á`Ž]} ‰µñnÃáhDÜÀÂ\É&*NNk…¤û0œ†»™¥ ›ýÔº˜Å9}­Q}lêœDª0ŸœÛj2wü“¯µJ÷‹¡œéÃvµvz¬,Æ}úè"öìijƒŠyñý›·î ’±¼cæOˆq¸Ìpãd:3ö¬Õ¹$c¿_W#ò4ºÑ1¬ç¥†Á z,8ÚÈÕD-æ h•’ö5Cº ͧáƒ_%wÒªu¿ â#¤Ç”g!]7¾ô/BŒ]eh©IKôŠ2¦WTŸuÊÊŒk84æÍ¥0Ç‚AÞÈ;b•1b°mÍH;í>nôÏ¢ÖR /#NìqHºà0gÚ…>tí°§Vûa¶ ˜/æöŸñü |¥sçYà¨q³Ý,ÙŽÆ™(®” ¿œ^õÏ‚~¢­Ö>ʧÐÃwHv«;ø´þâÎMÌÿ$ìe ™´´_ÚژтX–KµÆZåÀËÎ)\uñ–Ã2îvKËý XåEÛÒ7ÉG’”¡":1£ëV G½°â”ÀÑ&–Ê(è1ó›Û9‡?³3˜FÛRâåGcM-,‘kÖ!í¯±òÎuÈþ7æ;r…½VÌ+r“l«á¢ü” ³˜¿4{k{#í"øKMaëb³y÷ý©ÐØ l/W^ïo<9[<˜W(§H‚I§,âkíŒ{·)G<«ªfÉÝqIbÙÈKá«J-p_¶×&,xÖú~Ã!C‘FŠ‘Aã”Vh0–à¼ùMeœ·È¾„B‰?MÓQNqXA÷žŒ#´wøÏ4æm¼ðS"u^5^á1vÛv"®3P£ÂîƒÃ Âù^Ú&5ÄùïzFƒ@PD‹oŽ+'.ë²Üãa9…@4uÝlXÃÇ1ߟ¡X3Žª‡µ?c(µNn¢--0žà1ò†´Ñžácó—W¬¼ˆÉâL¦â™w ·9 -Ú…W¨•fI•M@ï±–KÉ­7‹û)Cc¢ïS`…,8'Îl[stÂ<¡\nc«¡T&8Ñew‹¹ƒã'}'ÅrW÷ ŸMì7#X1nfœ÷ ~¸ŒÓ2Û*¡U§ %›ˆÁÇ:èDMÂ|Ò.Ž«ªˆàc:š®)IËü*ŠÎ¿žê³Â:rê2:Ò©iWLÁÎ=¢wßÎÙàì­J5 d'XZ;UïÑ[ˆÉô+j£"dgO5!nYÙÚõmÒ/‡`ÈÛZ¦  Ã9LcZp)©Ê›ÓQ$7ÐâänX튌X,ðO“˜£Òâ'ؾe6\0˜`À2ÊâL— ÁøÁbÂrQu -ºâreA5n!Ñ…êì]Œ¨ÁºØ»‚õOWìõHƒ:Ô…—‡uÀÏk2Q:ú†Édf¬š¢ µ‡$EÏÐï8f±æ™€âNØÔ@Gœ¹}\=ñõ°¨öˆ¨‹¼_W/nÀÄbÛíÿ¸¯ß0^8U¤>¾û=O?°g›¾U̧[aý;óþÓSX¦ä”gÚLÁ´·¹‹.võ@/Ò&ÿ”i:dÏk0G£u¨ð“rÏBž7gO‚w üúàü•–”À‰KY&j øœ7¼r 2–á°WNÎxëh“õÒ¿Í7§LŽ„×VC@]ÒÖóºÁ*óë-Å ÃA;}üvñïiCU…—.úZl¬ õå?²ŠcHÕ¸´Ôu½ö!» »†ó±œW‚Ñ/ðó\Hvq•bf€úOÕy3¹;¾Ð¤ ² ÜŒ°š'ÿˆêIܯE|Ÿ¹ š­p:ÔC9èc!¦²VûCÕ7òÿ2]„2ø²âª³ç½ã,}Êø%(ê’r‡ɆfQþÏÈéª{ÃÅ3’u7õ(;†>Dî`…°éö'xN°?1jaóXDOÄOTÕYe¸S;&bïæ„Ÿ"=_ƒÕL+Æe)ëõP -gŽ}“ú£qÍòÛ¨ù›ÂN•¥•îÉ/­„¼Ÿ¿¨ÎwýéN­ъ”⃞êöÉ(ú˜i.ŽJÓY{Ê…ë߃ˆêo&ãX -Ë|åT¬N!{¶ L•„«a` K=ETBÔSEÐATMb§œ -Q‡Æ~ËJlQ‹Rü¶×ZB§©{g¯ ^x™‡¾m€ï¨LŽ1p%õïø×ké\¤~}ôO½Ü8Ûu·×çqÏÜV»ì*æGj¸ÙÛ9ýèOâ÷Žû’VuûtñCv.¯ÉÞ¯²”ì U=Ú·rèöI3 Í¢¹ØO7( S~ãÈ”‡ «ÒÛšt”š®`½öÈl/ÅY¦37›„Û¦š ;ŠôÑ à<‹ÆN–T‘Z.!`ßêã…”´I¼M%0,(`Y³¡mm¡ §&ymr¦-åɽ.§æo·œ¢ŒEŸ¼B91Œâƒ!ÈD4B\\ò.½ Ÿ†‡b.ô¾=ƒq™“s,|Ö?¼´~8£»»³­ -Ñÿž¶l ÷ö" •äjÓ`Zo…hbµÌ}åÏ0—ŸùoÎ*˯µŸÞµöñæ/~ úÕ'Kü@Tƒ¯k5{<‹i»ö—ROBz@-+µyÚª«1èûŒÂ·–µZë¿ÊnòEp7âPi«ú€pV¢;g.Oã­pÈTA3V.ÀÙòV…I’]UAÍÊ&¯æwú{¥,¿f -ý’OP\h{†!Ë/:9*ÁþNª‘À„y†Ý¢›¼~¸®<rÍ¥Ø.k¹áR\ÄKÀõ=™Ê³ô¤µéšàš)É  -Ìó¬¤^©êzX-Ta’•éÔUÚjLØ–‡ÁPϲ ‘ Ú €,j%‚‹Bè_|³yŒß]¶to7ɹ¿"Á¡ÒW¾7ÉÔ9NÙbdÌ÷Î2s—O‹D"—MêÓ†l›Ñc,Å=Æ/¿ÎWDk¿þ-ţø¬‰tF%ÿÐjwÕïS;ù^É£ ñšo?ñ -ÆQ'?ßœ†*×3;ùQhþà“R¿«A±FÌb<\gÜÝ@ƒ×oìfg,ÙS¿´íw*0=a{ æŽ!Ù5"OBŃð4ûbü[ïR«r‰2Ó'VìÖĵv\PjÐÝh «»Œd ­ªÌ'3çÜŸ¬ô£uªü”.ø¡×cšÎO -DSmÝ÷dU«TòȨr7)z¡mYÅÀX˜Ä5ê¦[Ø÷ËÅŸ"f ‰@êéqD„ç™Õ'~ñHA[€‹Vû¤“õ^C -ݓ׀-xú€°šNceŸ[å˥ߺŽ1½é˜Ê®aYÝ«ÀF5PYåaÉ|3ãä¡ïbøM@©Nyav.åh­nî×ņ®ô²¡RŠÅ—ȬŒWyŸ¦Þtƒ7×ÔÀOkB¬œC@ƒž©êo´dÏ “I¿ü“Z©þä}\žÅ’gÎBT…bM+5êõHzJžìfy®âq -C¸ÎÞ•¡‡›û/ìë aLãdU±Å,[g¯úWСÖX·V7~æQÈ¢%+ð?éצµ!ùUè³Êk5ãø&Z£Q‚É [äxŽ-b÷uP…#Ïñ¾†E@qIÀ$ä;®ŽVçæ$#ÜíkôëtJ€\¶p5žr„º‘¢€$|H{U¡øæòƒK]N}¬ò†Ÿ€E×D° -FÏ-¶ 6© †Â ߸ŒçânVä^… ]šMg\ÔKÇ·ä 9·/£‡õü7o¼¾¾Ð¼­ÎÉSö'ž”Q®¬þ´òB†‡Òe|°ià”¸[‹_Ý‘†6ùŒë.'¸cä½M½åÕr\S>‚K䃔t§C稶h5uREæ‹LU§­Òƒ˜Oôz VÇ‹;¬¤'áS™ÇOXñË€¿®›¦™;µWEƒeÔ #:0츜BøUª,ØÞèb -Òó…2pÈ^Ù†:0|&e¦Õ,?‚HFkJæU'ý!qÆYµwß³HžÿÔ«œ;…ª»ž–3ª[œé@—hžÏuãrnL‘;®ˆ=bªy7¥E>°áíîä=HøŠõzŒ³šâs|Ó߶ª`KA -Œõ_P-ç'„HS -Л¨'ÁÚæãy¿ˆ Re†êi[‘¯²2Ê2ýQ%™ÒZâû®žm-c¢‰LPe³o“=ÒÜi:èÑ'Ðr^ùÑ­ßÔ{?z$É&aM%*Æð®iÞ ïÚ‹š%4Üôí#6¼± -´!;h¾þGáÁj2Á|O¸D ‡?ûµ“îw¹´`ªÓ¢¿¸‚’cçÅò¢†‰‡Î·¤ÌaŸŒÄÆ툗62A»wÆÕ(†“Øs/A'viÙ.Ü]Á‰µ‚7*‹4¥'O ¢ °vŒ÷øF34§¡Æág¢O¿u¬.t¼“®rõ–s}/¸šä”ôÛºö˜#=ÕdrõÔVL­WVŒªÙÄKã‰éS.“ (Õ;ãh"’€}R>•lÏs¯ì³²Ô!¶‹lAËE:ßy&ôœh»Æ2©×Äë2+Ù®HѳÁŸ¨0An´ë‡Lš@°ƒy‡ß[q8^:ZËÄc hjð-¦B _¦–¨ñº€ÛJT§ûš5j9È«>Ú)¢Û»nSÑj=³ÕXër÷Hl_—rß:¯0)]F: ”Ùtë,,pQ£î÷s²•õÒœúåx.Þ!ª±…» šMdÙŽ%󌥢À>­×בtÍýh;ÑN}ÅO™~ìx[ôÒ[ ô)Ò`Ç™[z€Ð¥Ç;ÿµbä¸ ý· ZÛ±ýW=mVùD×®9, «Ÿ³e,ëKj}Ü üï J¼,®bðýÂò3Þ2¼ ­h=Á‰U,jï% -ìé×¾ Ä92¯kƒG`µÕÂKþ{|*Œ”)ÎêÒˆÁÄRéAîCêD´Ó®ïÒ‰svѬµ>cj -6müÍpHr£\Ik[xi×$¼šÉH$S<ÂÐ]­H;"þÏ] …h!ÎK Ùç wœÙƒaƒ!Wo§têQ‘21¸¦e}œDó—ýªM¢Ê&ëÅ"þçÍÜ1IpÅQè—{ØAÛ»kJ‡³÷4°6ŒíîO«Ö*“YŒÝ*³A"Õ±«Ì Õ r¤eKãùŒ©$a^Hœ›Œ×ý‰ÞFïNûé)•7µ»‹i?¦: ¤®ý§"×ñ—á -¦y¼5âéx Î?8€†,ÄÙ%š¼ø*%q$GÐ]È%\íðÀ¸¯±ÆLÆø¤z*­Ë"7›U0ž$¥¨ ×”€ïøq*櫸×\~ghL[ü ¢rñY{âkây9‘ä¹_­-¡„­“ߣ|ÒœZ¿€ë˜û.†zžÜbé>1aNÓßø–à—ÒK!5hI¾?K3²< áŸ,ÞÅÁ¸²Ü$j:=úzåmÈ_N4ƒ˜Fäûq -°’胱«T«þÃ5jíaƒ"¯‹¬Î×Эô'7kˆ]ú†A§òuSà‰epÀƒZ˜%ÆÅ…¹­Â¬¾=úð¤´~¸Pù*€üÕÝ+àŒVd˜¥ódqɈÎEX—dÓJHÁ+°:ƒÊ}Ð)#ôø@ײ!R»ÿ©€£ì–ù -;\ùˆ¹¥e7ÍHÖx³¡l½ [sÉHù[êƒáëXôËUNÑõ¢i X–Ø«c4ë7û\Aº0«<{ Evg]8xp[lZщ5õè¹r÷ûGâÈm*Nêê:Q+|‡gµ}ÁÞ\d„äO¾>hžDä¡GXnöº +b¸¬óÇ;½tÛÓÆŒ£6lÄ”Å>4ÌÑÑ0a=‡ˆ …˜Øà zb¸»6û€x{³IÝ)KÞí­[×î÷7ÑÙ€ ï²jP8b*æñÛGŒŠw4£V³ü2ÎŒfu3^üL9OOW3èPq½*z5la:ÏÆ> ?Òæ3zîÔL¢Ãùïú÷~¾­ÔŠŸ+qqj²„îÌoƒ¤ 2^›6Mäck~·H‡Ogi$q5|©/̾®¿îÁÛë3úï.7ÿ”,—síÃ[|EØ9 ®+Á -ÐQk|/Û9¾ÑxÜÜúÙP7˜ªl©¼å© 敱<ý6œÍ¶Â=Ÿù …3ñTI‡@TƒÌ07ƒI`5¼áô‡lcoƒ|áþü]¤ãÏ(^¡¥µºÈÕ6ÿCÞŒ Ú롾—lšÒÚ´ë÷aµ1Óþÿ×Îœÿ3¡¹—çÈÊ–#Ɔå‘yLî£æhm+÷U¹bó±'ñ˜#GÒ,Ga<ç,÷s¤„9a§¥|I@µ>¬Ó ‘ŸÂînÞñ ±mŒ¼?Áá¼ÃñqJ˜.áC{¸Ús oÐþƒ–B•(­dfá¹È|ÄÕñÂï„Ó84šÁç2ˆ¥(phëž7ÓŽd5ÈìDÀµ€ÛæIl]Bå'IÑ¥ôFÛ܊ꨤ!šFó…L`0\ÁàÛ˜‰¾Q¹u3!skA$TˆBØó“É°`¬ âŒéúŠƒŠ–%¹Î× Aä÷öoŽûŸ»­w‡¾ÙºïÁ° bCL?í<:Ú _Þi 8eT)ŠD¨á~ÑH½ØÏ7ceÐès6µ™Â$ï|ûŘ‘ùË âæIPÈkfåöVÔBÓ(ü -šþˆ/KnèEKØ(xÆÈìƒww¦\3¥kÔ!›ùÑÆlð›Qe8‚nÛh’8¯tãær|BUw•Q“)€gÏ£ŽWºè¥@Pñ„¥¾‡LZð7×(fÐlç9¬Œ bf r·Ñá·šPæ}p -øš*›íßyýá“ãûB/1;Aì2ÕÙ3ÕSs±‘woÃñÕ“VÝÝíßv¼¯å¹ÜÆ{¯’XcÇú9'*:ÞÒˆVÂ)BSzŠ)Xý_ƒÓŠÖpm{§z¼¸—±u±)ôc¹ÿÕ)€+H2Qi·'Âڱ׉×b@akÊE¿¢vÉÃBakR‡å:›ñ†‡Fˆ~¨êÈ’Ìm®g4šv~\œI©¸ -^ýì¶<[7Û-ú%çq´Å5mââËÊž¶t“Bdc;|WÝÚú7–xSyåÈ4ØÇÖv´¦×Åõ Q«´˜„2ã¹Rwr\Œ¨ÇÂCÀVD -­`Ú5øy÷»é@k"¢™5)Ï1·ØRù-DÒH Ö»¼ÍDdM†o3w»5Gv`LÐ2îä¯uÈoêb—r›[ˆv^Ð^P€ó]üQ¨‹ÔS^?¨Ïóè_û³£ 'C2T5ÍyÅ [<;ËÛÜ}‹hLé4mMmÖéҎ/À}"ÑçB0%’éVE~µb(e’ ”峕UòïiN“ýië€ëÜ„{X#Œ=dÓ[娽 ÿÆOƒHð”£Vê ªëvGJMGÚêåÄLX^9ymiZPpù˜B5«¬Âø#…sW+* ¨)¨OñD¾Ë_*Ïøy81¢ÎsY×/NI„8wÖ¦.¶v.rþ÷¥äïûˆÍžá¹ˆ“¤;éë7¤{®ÈEÕîÄìø‘VYƒÉïÌ|ÝWN`ÄþÅW‡Ù¾—›º‚ÔÂâsh™ËúÊIÆ(ˆxó^m¸ƒž²Ê+»O':QGrçÉ×æ[XFRž;j¸±·ùI•šà5A0 {Ab8A²T†’QmO@ i©Vél³¤Ó¸£CX;䆔¢$ŸaP÷ga†kq*Õ{²…nøglƒ’¼2GÞ Y•.ß“­õSlôŽß-%-½¯·e—ppÔW³8©×‘fÅ¡Ú=ΆþKbÿÿ‰À/$À'ê,öžä÷³endstream +FzÆ+-œÄ,ÜMŒ,œÌ¦Ö{ô/½Š­±‰£µ…­É_.ÿÕF#ãØ”Í-Œ¬lÿi:Û¿M&¶Æÿ™ù_zþ•7ÃQ9õ4ÿ¹Mÿå¥ð—ugeû¿‰ý:díŒÿ—ð†°°;À‹Ž•@ÇÌÁ `çdpr0ùü¢ý †é¿dYgG w€Öß’™þUøÿøþKÒù˜¶FvÆÿL‰’³­ñßÁú_ŠÌF.ŽŽùü×]ÿ[ðÿ”ÿ5â&&î&F0kËvF<Á–é¿2œë0sG&Eµú˜@GBìK•‹ +ükìzýÒÃw¹*õ?kC蛦¹¿Û=–Îí¿¥¨Æú0¬)zSM®óñ|H¨ú ·È;9hŽtKá3.Ô¢½nevÀ4ÙUö&ê–|BàOw²8BݼPù“¸ø£‘>Û#ø¥5Ä¡w!5¡Ôž_'¾}Û kZÿôóüwÎá\àèe"°µî€”PX™/,3"@<ÔSÂ{4ÂÑ3#­¶«i7.øÙ[ÓZ‹ ô­·6åÇ7«¯uÇeHfÕŽvl9‰® Åà.¿ÚCpôמ¹ï +ÕZŒ™ÓØANvŠ]Ïy–ãÅ{iGçý2ê-úA¢ÿ}ÛcÃ~~*æcd@Œ„8ÓÔÁ?W‘2,Åi|Z…È%sÒJ CÓº‰¼¬–‹C!ýñà Ä~0w‚—„L¨„ ‹¡=%¾,jl‘¡Þ‚Fø8;í¤JN DË·¯U7÷ôw¸àô‰¸gVáÆû)§ª!‘Neå~Žm­EGÂýqÊ¥ -â9þÝÌ_*nÿAv ÙSáýÀ°v€<÷ÁÀÉŠÅÜä±ÌWá ŠÞâÿ.±hMe”:X³Ï/=\“õ 8èOª~îTˆJ~^‡Ò¯(E>JA±Y|̼cæ¿çÑ°>Pã}õÒ¾Õ*"SßRØM}ñ7•KŸa:uÖKúÝý HÒô D¹¿£„‹lű"ŒƒÎ¥Õ\ÏR°#_ñ1ò—ã.±¶•õ¦üã7JZ*|“P9 {Èñ\U-ã±°¶ -Ú¡QZ±¢›w¿‘•Üv7óŽ-ʇJѦ®!ÀçÜ…áÚó¬Ë9€FÿýÖì=|»KYg¨^BX³Ø€ÀþJk8»8—MzþòÎ&38S‡uìTÌoŽ $àǘ^zE—w#ÊÀˆd8ë;ãg]¬M,ýt’Ž{ÒÈ%Ñq%%mw„­Ãî@Jeâ_õðßsÞg¯`¦RÈ5EB† nDŸ¬‹Ÿ"8ïnx³E4 V;þ6Qh\„§Þ=½X ’þ“Gþòüåŷ싔셭bŸ§ç\EÏñ Â—°w#¡<ª˜Ûa·÷‹~uÔ›š9>kÕ`•–ÚX´nz«að|ÏǾävœ«Œ+=L6¾Møf"Hó²†ÖÚü‰Œ6ßñž? + ,ÐmÍŒ%²Ž¬î|ø"Õ?YHå¦õÆ]½ô!P!1):X·œø~R¯µËöÛÀï/ìº×Ø,‡°ñ·¢WÅýí`ôÐõ g¥°âtãÏ䱇sæ¼e³Î4MùGî>8¶»’d÷ºëFÛÆö¿®3 û°½i.ío±Ç|Í¥Z’2D3yˆPPjñÕfGüf0¾è<5éõ!S¾/!u¾ûµÀÓš +Ø:|‚¬·.¶–ó_Mv“ôacæ~ϼr²]‹Ë±¬ˆóÄa©Öbß:g× ¯ïëb¥-±÷#ƒP!»‚ŒCîîœbL ÓÞ˘]÷]¯* dÏÕ §„n˜"}x3< `C X‰ì4áJrÛBHõ“ÁÊ„edÔI¿Ì | `Zþ©Å 9;LgÇp™or¬øæ•šÀTʪµiÇõo²G3iØD‰ùÑ®äB·ÌeãÿBÖ’ G«¨¾7”2À#?Mš*í£gm¥côG=èÞ[|T^Êh¸Õ>w~õO¿þÜДr_Ï68È·R©¡XVÏ-‚˜$JÁÏBG×2E"ÏÈš×å=Ú¤2߬ '¢Fö‘bP©¿)‹ÐÞ Ç³Í~Èo´‰¯Ëd˜ž¨D¹²|§ƒ#!vµ’oÑý$WG+³…Íö÷—¶vËx‘’ÁT:UYà‘’ˆ”y€—øÞ¨ôû³b›3¶¦~"î ³Íþ i !ÝT=ŒªÐr/ 2çñÅÂâлHh:cA×ušÍ/[L€ˆ¸?´4~i-pL6‹¯¯g’^†æ +v߶o…'siEI݇‚>TàM‚ ó.¥t§>À)— 7J®ò¶M¶"Wv,ð ò{ Ò~|oÄ$ï!½Ü¦ |ñõï˨²ͦBÇÓX¹2á{dåÖÔ ÈåuîæÙÓÜŒ¢± +åsõ´ÊåÐh?‘«åŒß¥éÂExÜ%8Û5µÃ³ÊóËoÁÒ¨§^RýÏjfrM¿Êí8ÅŽµxà„ˆ;“JÇÒéy.±\Gj×tP6;L` Ÿ6ìRØ#6C+9G÷`Xòñ/+?þ±ÔE²d n`ëæ/F»Ó y³¦s™N520üBoëÂ¥ÕTu¥X³W™ÓeBi¢±¡Ú€™nŒÆÕŠøÉ t¢Ë¨ûCØí ¹Í^„<ß™&ñ2Ý5’­*}¤ô/Šd²FЛØêZÁ?˜M‡þøËá̤( ’ Óü€þUÒ³Ën¾ê|*0¢¤ô;‚·èb€ÜøÕO1ñ÷¯‡¸ÀdñëxÜ\6€¡A©¼!r“›ÎWL¨ ³ •Ú ªí⯣nT“Û¸ ;¤ëÏDc¹B#e >ó—lê±õ2ô¦ÒPùi÷ ß±é1¢é¼½Y½ë—aÉu«Žœ.@’Ñ é¬ ºá)ÒK“b§úb¨‹’E{xaüá;ŸýIÒ®õnjgôO¸·ï•×_ÝÁ¬Ÿ +_Ë£Ý% }\RÖ:èJÞd­ÖX¶d–> /Ä,n’5¸r%£à²ºš–øŸmV$H‘Æql=ˆKZ»(‡ruP÷S™äR“Çчȵc;"+?Ócù†”•!kȼª6´ÊïÓ‡l¥ýá4Ç(A¦†K)-Ý’vÝéÏîÅ‘‚LÿJÊr ÷è½Úƒž ~g°Ç¿2c‘„$St[Ž¼ì“[É]ø³1Vz¶ÞZè±J=£YR]5Þç9ðš|[EyŠEšÂ:4ÿx©â+*©æ>ØyDUÇêhÌÒ>I .­ö=ý1ý¥Òc@ßÇîìq㦒ÇRj¹z8¡v˜»7ÖEUß}-Hè2¸Â…÷ÇvV:¼:_ŠæDÙ¯ñ‚-§¡mé«VÎ#PÔü4QÖw×ï7`§¸o¢JžàFݪ<^ÌÓä9+²Ãóm%™¬vËYàQ¾`ƒáÁ¾uïÏi,gϽϱ«â_–ó®2 ¿^Ò–L€pi`J¶Ä =C‡ç&zM,¸M,<Ôy 1H†æ'vÛÕbù“nx…óÚ·ýKK*›¥,/6y#?H¯[M¥UŽÜÙX AçºF1~¯¡ŽÆŒÀç¾ÇýЗZ]aý\WÂ2ز»p׸ÌGáÜý¶žèuvßÀŽðucŒõʉ¬ËWÑeºwXSH±‡?Ï^–“\ŽÃï¥H×y0&ÓcÒIJVîÛÀ©×Û ê ïžÚï‚ù1E—Ì3ß®jf²ˆD]õz I퇹`ª¢Ö6pÛ 1ÚaTm‡Û™úß— Žd±*{Æ",T–]BÞÐoæ²V4ÚX>}Á+G C¦2ží-L¤JËÄÂ~º0¸3y©*¥#fç^ø¢(¦þ˜QËŒ¥m0ò˜&C–òŠˆ\ ‚ ·sTj‡¬A:&Ô¬XõDGi¬x~7ãJ/oìØ Ò—48é®Ì¨¤ðbÍå8m{|gòG—b2m˜êVüoidmçÑñþËÒ6ài;è<ҤϹ‚%lYãÍ¢xÌî—jzÈÙÉuLƒÚu_­\êæ»´åe¿÷|2Du\Ô`ÐTãE»+‡U>| +RÉ_‚!'zÍ”FøÔ”Vé†u# Žežà º°ÙOLSÀžeúíÖEx!#ãp Ê^0ˆ1üS¸à–lƒîÂC‰«„2í¸Ü}Ýóx(¿à +ξ.¼ÙúáäãD¾[ÙvÄ›)LH”k€Å!C¼…eHêtrƒ÷I/K‚ Ì'…&‡"Å‚u´ƒø.BˆJ½ÖÉ6Ï<ômJ®b2¢´Û}ArL®'îz“$ær,ýíæ%¾Ù£ÔYª„ G…&ûÖÙ9s_CÆKàöÐÊÝQ"K+‚M=2èy_*ê‘®VrÇbæ“–©|.()$Yám¥¥ÎWîw‚45…[ +Ý÷B#?ƒôúT×ϧxß :ÉÜápø»ß­Ó«§ Òµî2Ó­óƒ׌Èð“- „Z°è–¿ + cHì›R¤»°C\qbl +pïswóH +kç„¡ºØ-y*ÄmkYÙ>â2š¸’Ë»§ +À§i°~†Ò°ŸÝI}ƒÚi|ïóPãAùÖ /—™¬\µpe<­8M#¯š"’%+ŸÃ~ÖÕ +zAâ:Û—p¼!™^ŒúvAò£b<±¼«·ÏQždWŒøÍHŠãD*uK*½­:ÉíF~±1`gÇTÙŽÍ€2 úí¶­XšZeï§òA°´´oƒíÖü²™Í’h¯Ò3Î3{VslÆ.kîÛåÝÓU½jh•² gÇ?³ü‚:©’-“ûò–8HMÌ™Bnñ&Bý@|Sn'‘–½%T7ÜÙç–ÑN„ ›¼ãd_ÛC3®wÇú»²ñp–tjºHgîUŽUP°}Ö7þ€ÜI±ìrLEm° m×Ei—¿ú„V½ïÖR¿ŒÊ¶fn<›¼X*Yµçç¡4ò; Öor>Óqí¤sÒµ"…ñù·j§t‹¹ÒØ"⺋Ñq§º(±ËóˆþŠ +& SºY e H;Hÿ—q¤ðËêXæWiú@ã&kêoÄé"´%ËÚúWÅ;yfÅ +v«šÌóvI]ô« ;î÷÷¨¸F÷.Ù¢™ÁTÌï„`/ ¸˜˜­Ji‚>S,®#˜”‘Ž—õñMâ‘lL÷Š‹ïŒ®zöœçŸ¥z¯„Ú^Hì»8§jƒ9Ux,§}s'^­V‘Ÿ«¤ñ¾`<@\-ؘãûÄvžN‚ðüìAåqy|ª“™Ç>$’ïÒÍÇH¬ðù·ÆHÄUÇMXá –&£‰.BÍÓTøÐÙ̃DXÂ5ʼ$×Chë¹âG÷ MøÄ‚)¸ÕPk®GSJBc‰%»ÐXê›XÔò‚bcžëóBq3©‡É%øÂ8Ř½Ý·óÛV•‹,,n¨Àˆç“tQÌ¡úL;Ržˆ?úzGc£Wt›qØı7¦¦„öµij6Cì';*8ûAŒ,XíüZ—ø[]ÔóÍä#S*Mͤ˜8µÃï}I‚(/´Íd:Ç€¾•[ăLMbT¾ˆý±û9<­þá⼨d2ʦ¯·Cj=’£¸@ýŸzv<“QÛ;úbñ¤ŸºË¹çd)m§™_h(ÂêÙ`¿ØÁ4t„0¨ ,ÀúR æ.bÞXôCMj‡î×ZüzÙîæaò3“æPgpÁc!Nn<—,ï”b^ÆM¬3‚Ëpü}ƒp:}|ô»DØâˆ]%'ÁTå¹:#›AÝÍF‚Vã0b0‹4pÏ‘Ï)hµaA+Ûz¿C¡è%mÜgªą ÉIßb{Á6‰wƒ´·T£Ò‡c–wºf +{{~D'ÛûÔ ð.$*>>¿¹1îmÌ›ÿ‰ó(¦Wýbš¥ìl6ÃÅ>-³øªd~R3ù +|hD +i^Dí£.(€ù«483R£ÁIJ“@¢t)­ü„ÔIm1iM?!+øM{äa÷]¢°A4àƒš$–O}÷™'ä§îÞ¬Ò[{/T|F¸óC}¥Œ±°sH|=OKRe©y”‚«Ÿ>¼O¡ì%œG“)Ä6<¦—rÔ¢þS,ÂHǮڇ‚‰¾Ì&%@¡™~j5¢ÐW¼Žã ­ÑçÖû:èµ{"ˆvfT!Æ„ï· yµºqIzÚ*˜mÖvÉ?5{T×0DÓ£ b9h¡ óòyÂ3–½è" +øvéç¡ŽŸQ-\~X^Y<.ê /ŠÀ­1F0îñ­ßÀñ¨<ØøùJ]Rî9˜¹t›V¢6[8ýÍÉô½T5é]ý¢âì;÷¨:ÒB¸ájÛÑO7õ\CÉeáÌq.ªš¡èËŠH–»ªÛ©]ïd”Ò+>,ܼ`LšoXGØçv-seSÞd¯W†éɇ۞ 0§H[x— ô…Ì>„^¤ÁvJ• ð@FƒÞ„–ôÿ憉’étŒBžÑ ”ýÕ&!¶¢ªH*Z"¼ñG¦?€Ââ‘Š¬g +R}¼nÜÎè-xâû1-ÿ;„&Y A½œ¥AçºxýˆK\ëS‡¾¨ b¥nGU/0´J·P›Ò(ïeߢ½œiñž¨Î»È’È g 1ë{"ÀÜ|¨G3+a/Lò·Ù¹–ß2çÓŠ,›»Á¨©âà ½F9¿¿#úSŠoxûCw|g¯óu`¶ªu¤MÔm†² D™×ô—|ë3Ž;Û•êú½W:Ùe¸Ìg-ö(ƒÀkЋ˜®5ü¥ìTlf²¤íiìØMO­3prN]ý +AAé/«®|ô‡ïm?‡ïŸý±jj2q¾4(æ²Øèð‹zQcaœ–çTýr.š­5Ùðþ~йc¢{ ¢HËœ…"$mæUËbJÑO£¸Œ ÿ 5ÙN…MÛ¡ +¾Ôáç†8˜¨±“EH•.¨ü‡ÐFM)ŽC‚†-‹QõYzö?·­l’KÂDŠ¶öŽ·­'÷!QiMùbƒìè÷ÌË¡k †ÜÛö +ò7ðሳÇW°tò>*4HN˜zú½á0 Ð\ìiüp?ØJ³)Ó'žÐêd<×ê`YæV .-Y#ÈåÜò/¥Ë(ì…ÕqÞÎx6¿ATK,rOÈ Ýœn¨åá¶4)š³m0½¼ˆ.Ó3Ãe¹+Îvûçg¨[ù§r©Ñk]x2ÙèÏ,Rè\žmê,†J ZFFx¾8ŸïÚu¶.!¥^R¿o}ø¶¶Ê—ºNy”ì1€XÑ0× yⳘÄû% +ý³[r]Ù'‡Ê’œÕV©_jÇÅqÛ4åÁŒ¢ð›ÚŠC.Xuÿ ûûÖÑ;exhhÞyvM¢*Š%`d#­˜~Ýi­4Y}ÏtRµ£åvíùÐèÂ0°îÁO.,ly9.<ÁøÙ+ÓƒÅÔgí+¨XÞ¿é^Côkë;“[QÎÀˆ2È7ü= „þ8ª§xuü¦HŽ(ßáèµÌ±mÈÇîçV»¼ös„-·ÝÅØ UÑ7êIàÌiΘ”*9óÅ“ „Rä¨+üJ^ôny +QhNÐúf.•“"©xÆbä!‹4ö|/8ôë©c©û¨Ö2_Uÿ9NF“¦‘˜8MæÕÁ +E$Í] 02vL¿1ý©â&ÉwxÝîÆ;|JWF³¡¥Ü_†>)27ê`Ú>µ ½| ëÔ©$@ôƒ +¢Xo× ¸çœ÷åõ¥|_wùät ø²jšç—¶:âlÁÕ*‚h#²°#Ò”‘g¿s$Hç’gñ&¥n!"ÖÝ3à T¦x›iã×/°…æ÷¥hüiXðꪽ1[„n” ÅT²µÖ·@Q Û’….nŒÈ‡0¶ÇfÆÑ8… ‰ŽÝÏsÓª°—yXæ[vlùðNðÏë­ûË$b71¹þy/pß-aÿEˆf¡¤b-~Kð’‘êçȃ¾>0°hü³OzyůƒÛ{´ +Ïg•¤ÔÒdkqQÛÓÑW_½æ·¦5ˆÞ°Ä-IL>Ä‹S¶?üD#èU‚¯ð&š¬\ Ãàb‡âÂÐèrÖX[nþ¯L^•S¿Øš1'¢/n–ÂÌò$µën/&glÑiø‡ÖÅæaCÀ^@×é4¾nï¹nIãÊ<÷I‚ŒÕÙzßËž€¤˜Zh‚q‚rŒ±^ZgÇî=D`ÁË¥ƒ†·ílâ2A³õ5(q:Ú0D~¸ø/ +úÀžºéâ9Bõ$ÚÀ +¢§0mA®ìR–¨öüBQÀ†9FJÐÔ ²õú ï™´Œ ¯¥µßªñ_['ˆ|zì·UÍcNiØ11žö¨É|Ú~iÔ(ÙRãÿJ T-~=ÝZÁBd´¹³õ(˜ßHK?ÄÍ‚™&Ð=¸LszŒ%:‘W^ßµwk-iéšRoº ÀSKd€{™W_Þm¹°Tk•3*TŒ5õ…ìÐh6¹qºÊœX+¿C²ç¸:ü€2–¿ýåX/ŸD»šÃu Y· ñíwEAM·ôå¡9ÿ®ëŧv[ŒÑ º.h¯l~gfíмiŒiºI&›“~l<´<},n_MWêznÏo{êt ¦™‰!ÞEâ37ÔC)jFC ;> ªÖ“UL¾Û5Ã1.Š§r™v¦zß3¶îŒš8 î‰ük§{°pX2>}íRCçXñÒ@Þ4õT4_d„5wé´9¿ 5ŽoB¹ÐPªúÏŽ“=^šT&[¢« ™ +Ü ò6éx3¯¡œ)ÐlXÞ:Ø#kõ«!1ÌÍÝÞîv¢[m4ðg¥¸ð«AA07–JîºywÓ½ßñzHM_PQ =#Ñ4hŸÝžÏ%Éôúz ¹F˜'Ͼd|"óÖÊÃÃ?öÞ*Là¸4vô‘«ÁŸ‘dm±Ï@êcOò÷à&Tp0’“K}rÑ`fUx~kÍ[q€11Îâïc +àà·ÜÊèëTwAU!¾Í†¦vÆIˆ:#·¿âŠŸ?ò—´ù}’A„rÇ܈ÉL{@½j»<ø!Ñ«ŸÑªjH¶Ëpá• ž¦oHä7oáDžGÀ{{«žT«îÅÒ[Éh‰{Ø]åO]Ø•ýÌ1ù"Õ\³¢Î}Ї)õ»XÎ3«Â4oâ#Ä£Œ´9Ûõ4‰taÊüÔšU­q7Æ6y·ŸXDºoœy§]C¨£zLyX_°ÂÃé¨2ÿhfåϼäo¬E7ƒnÇWvV)(¦Gè¬[ƒHlÊõIÖ§;Z‰‰¥Ë©¾7"M8ßTÏ~«·—.~¥òN^Ël­ÕÞӷ* Iée„ìFòäoÄÍ´]P‹^m5YÀ IƒZ)·O„1™Î艕þC9ëü(+3®áИ7—Âgry#ïˆUƈYÀ¶5 DP í´û¸Ñ?‹ZK '¼Œ8±Ç!é‚ÃœiúдÞZí‡Ù€b¾4šÛÆó3ð•Îg£ÆÍNt³d#8g¢¸R&ürzmÔ? ú‰¶ZûX(ŸBßv"Ù­~ìD ãÒú‹;71ÿw°—1dÒÒ~ikcFbY.Õh•/;§pÔÅ[˸ÛAp,-÷ƒ@b!4–mKß$iHR +„ŠèÄŒ®[1õŠSG›X*£ Ç|ÌonçþÌÎ`mKý‰—5µ°D®Y‡`´W¼ÆÊ;×!søߘïÈöZ1¯È O²­†‹òS6ÌbþÒìu¬í´‹à[,5a„y¬‹ÍæÝ÷§Bc/°½\ix½¿ñälñ`^¡œ" Z$6²ˆ¯µ3îMܦLñ¬ªš%KtÇ$]ˆe#/…¯*µÀ}ÙB\g˜°àYëû ‡ E)F^SZ¡ÁXRP€óæ7•q>Þ"û +%þ4MG9uÄbÝ{2ŽÐÞá?Ó˜·ñÂO‰t8ÔyÕx…ÇØmÛ‰¸Î@ +»3ç{i›TÔç¿ë bA!-¾9®œ¸ ¬Ër‡åÐÔu³a Ç|†bÍ8R¨ÖþŒ¡Ô:¹‰¶´Àx‚kÄÈÒF{†Í_^±ò"&‹3y˜fˆgÞÜæ(h^¡V˜%U +4½ÇZj,%·Þ,î§ ˆ¾O²àœ8[°mÍÑ ó„r¹yðUýF]O“/ñúó°6;^dï¾ ê'7zSí2¯N ,Ó$œ’*ÆÐru>‹ÔJ#*»"¦;ˆwá1Ô2nœ@f'=/M`AÕ÷ 9£ fqLwËÛ”Û.„­¶gReЛJZ^§í'~êúºÃÓ(ømawÇÃ2•ƒà.„¦n‡@¢.÷DVäý»±–dgÑõþ.ëßH±²9•P´G‘è&D1ÊnÕb"£B³¦˜ë*c°#•l'xýù¬†R™àD—Ý-掟TôË]]܃|6±ÿÝHŒ`Ÿ™qÞ7ø5â2NËl«„V.”l"Së [5 óI»8®ª"‚éhþ¹v¦$-?ò«<*:ÿzªÏ +ëÈ©ËèH§¦]1;ÿõˆVÜ}8gƒ³·*Õ€’`iíT¾Go!&Ó¯¨Š=Õ„¸eeWh×·I?¼‚!okuš‚6@ç0IhÁ¥¤*oNG‘Ü@‹“»aµ+2bü±À?MbŽJ‹Ÿ`û8”ÙpÁ`‚Ë(‹3]6ã‹]ËEÕ)pèŠ_È•Õ¸…DGª³w1¢ëbï:ÖS<]±×# êP^Ö}?¯ÉDéè&wv™±jŠ2Ô’=C¿ã˜Åš{dŠ;aWPqæöqQôÄ×âÚ#¢.ò~]½¸]‹m·ÿãnP¼~gÀxáT‘úøî÷<ýÀžmúV1Ÿn…õïÌûOOa™’Sži3ÓÞæ.ºØÕ½\H›üS¦é=¯ÁFÔ ÂOÊu< yÞœ= Þ ðëƒóWZRw&.e™¨1àsÜðÊ1ÈX†Ã^99kà­£MÖKÿND4ßœ29V^[ uI[ÏèN«Ì¯·ƒíôñÛÅ¿§ U^~¸Lèk±±‚Ô—ÿÈ*Ž!UãÒR×õÚ‡ì‚îÎÇr^ D¿ÀÏs!ÙÅUŠ™ê€jlp0Âjžü#ª7&q¿ñ}æ6h´Â9èPå „˜ÊZíUß ËþËtÊà ÈvŠ«Îž÷Ž³ô)ã” ¨HÊPJ$šEù?#§«î ;ÌXHÖÝÔ£ìú¹ƒ¦Ûœà9QÀþĨ…Íc=?QUg•áN혈½›~Šô| V3­—E¤¬×C)œ9öMêÆ5Ëo£æ;l +;U–Vº'¿P@´ò~þ¢:Üi<8ô_¤;µ^D+ +SŠzªÛ'_P èc¦¹8*Mgí)ÿ®O "z¨¿™Œc),ó•S±:…ìÙ‚0U®f„,õMP QOAQ5‰r*Dû-+±E-JñÛ^k z¤î¼.xáeú¶¾£29ÆÀ•hÔ¿ãC\¯¥s‘úõÑ?õrãl×Ý^ŸÇ=s[í²«˜©áfoçô£?=Šß;ò4]·ÓóUµkÁ”^ÚÖfÊÜúìKZ=lÔíÓÅÙ¹¼f${¿ÊvR²ƒVõPhÜÊ¡Û'Í$4‹æb?Ý 0dLù#S&¬JokÒQjº‚õÚ#³½g™ÎÜlZtn›j‚zì(nÐG7€#ð,;YREj¹†D€}«ÿ9RÒ&ñJ4•À° €e͆¶µ…‚œò„ K +\=c¹²E®¾98wyÖP—Vg••ÄÌÀ÷ æy©é“ÜŠÎf´ÜÄ0pѼ!€Ÿ„üú†z·®Jn%ËAÈÐ=Ð +âÚ?ÆCÏz| þ±rèou¤¥J¡ð9`º · 5àñ û˜ä9X´É™¶”'÷ºœš¿=ÞrŠ2}òzåÄ0Š„ Ñq9pÉ»ô2|Š¹Ðûö ÆeNαðYÿð6ÒúátŒîîF̶*Dÿ{ÚF°€ÜÛ‹,T’«Mƒi½¢‰UÔ2÷•?Ã\~æ¿9«,¿>Ö~z×ÚÇ›?¼ø1èW?œ,ñQ ¾®Õìñ,¦íÚ_J= 鵬Ôvæi«®Æ ï3 +ßZbÔj­ÿ*»5ÊÁÝtŠc@u¤A®èÂY‰îLœ@º<·Â!SÍX¹gË[&IvU5+{˜¼šßéüš)ôK>Aq¡í†,¿èä¨û;©Fæjt‹nòúá¸ZðpÈ5—b»¬=æ„7Jq/kÔ÷d*ÏÒ“Ö¦k‚k¦$ƒ*@2ϳ’z¥ªëaµP…IV¦SWi«1a[C=Ë.D‚j/²¨•. +¡ñÍæ1V|wØÒ½Ý$çþŠ‡J_ùÞ$Sç8e‹‘1wÜ;ËÌ]>-‰D\6©O²mF±÷[¼ü:_­ýúc´ã²&Ò•üC«Ý W +¼Oíäwx%2Äk¾ýÄS(GQœü|sª\ÏìTäG¡ùƒOJý®Å1‹ñpqw ^¿±›±DdOuüÒ¶?Ü©Àô„í˜;†d×xˆ< ÂÓì‹ño½K­Ê%ÊLœX±[×ÚqA©Aw£-¬î2’5´ª2ŸÌœs°ÒvÔ©BòSº ã†^i:?)Mµuß“U@t®~PÉ#£ÊݤHè…¶eCcacÔ¨›l=bßS,Š˜&©§ÇžgVŸøÅ#m.fXí“NÖ{ )tO^¶|àéÂj8”ñ@‘eX€IÑa.²~SfÈá ay_èŸNWú-¬Þ7ºÒu<õÃà”µ}™î¸I ÁTðg Ãg´œä¥~%>Ðoë÷°"« q96.9 ÓNüÿcSd÷¾d&"µ7‰GâxœÝ´EþïñDµÔÝÒ–Ó~í4íLÅ…oÅßìx2b ÊS:_…´Ý·¿‚] £Âih£uÄب‘³XKbâf¨üÚ½¼‚• X®O”­…ÿ5ÿ0¡Y8÷PÚ-ö¥¶÷ãtR× +DãäÈ¥1™ÈO¬=1ô'¦9ö‚ã²½m.6Ëš '{`ê¡8à^†ÎD(|s÷éz¡¹¯Gœ1nßNqø‰f*O‘[Ö\Lbî,‡–Íáó±up¹÷ž!º«hÆ8j"cÔóΨڢë¸Sô²—59Ø™ +*Ÿgj.[‹šœ²¶'iº`Ǿ‚+¤ª$›ì¨éƒ?Îy¤*ÓÌmx¾'˜|g'%ï\Äu,áºn–¿öÓfñQ‚[P0¶ãW~Ø0N(GC¦û|n•/—~ë:Æô¦c*»†eu¬:Õ@md•‡%óÍŒ“‡¾‹á7¥:å…Ù¹”£µº¹_ºÒˆJ)_"³ +3b\å}šzÓ JÜ\P?­ ±r jx¦ª¿Ñ’=‚N&ýòOj¥ú“÷qxKž9 iPŠ5­Ô¨×#é)y²k˜åñÀ…Ôi¾ ëk'ƒØ™{Ξ`Î숉 {é5züñ-à@¶–bo˜zP«uxÿâ/ëSôê„¢ k¸ÎCSx¤`ŠÇ]ÒdÛÎ’E[”kÏîéÉç[DÁ†8ºÒ’èû¸ŠÇ) á:{W†nî¿°¯ƒ†1eŒ“UÅw°l½ê{\A‡ZcÝZÝø™G!‹–¬Àü¤_›Ö†äW¡Ï*¯ÕŒã›hF &6l‘Gà}8¶ˆÝ×}@Ž<Ç_øÅ%“ï¸:Z›“Œp·¬Ñ¯Ó)rÙÂÕxÊ=BF@èFŠ’|ð!íQT…â›Ë.u9õ±Ê~r]Á*=o´Ø.ؤ‚jP +'|ã2žˆ»Y‘{‚vi6 pQó 9$¦û,ß’ƒäܾpŒnÔóß¼ñúføBó¶:'OÙŸxRF¹²úSÐÊ fH—ñÁjx¤Sân-~uGÚä3®»œàŽ‘?ö6õ–WËqMù.‘RÒ£Ú¢ÔÔI™/2U¶JC~ b>ÑëZ/î°’ž„OAf?aÅ H,Oþj¸nšfîÔ^ –QƒŽL èÀ°ãFp6 +áW©²`{£‹)H ÌÊÀ!{eêHÀð™”™V³ü"­)A˜Wô‡ÄgÕÞ}Ï"yþS¯rîªîzZΨnq¦]¢5z>×˹1Eî¸"öˆ=ªæÝ”>ùÀ†·»“÷ á+Öë1ÎjŠÏñLC~Û>ª‚-)0Ö?~AµœŸ"M)@o¢NœCh›çý>^ 6H•ªW¤mE¾ÊÊ(ËôG•LdbHk‰ï»z¶µŒ‰&2Ay”;!LöHs§é GŸ@ËyåG·~Sïýè‘$›„5•¨ÃG¸¦y'¼k/j–Ð@pÓ·Ø ðÆ*Іì ùú…«Éó=à1þì×nLº?ÜåÒ‚©N‹:üâ +JŽË‹&:ß’nd0‡}2·#^ÚÈíÞAW£Nb_̽Ø¥e»pw'Ö +Þ¨H,Ò”ž<1ˆ2,ÀÚ1BÞãÍÐœ†‡S\œ‰>ý~Ô±BºÐñNºÊÕ[Îõ½àBh’SÒoëÚcŽôT“ÉÕS?^X1µ^Y1ªfg/'¦gL¹L‚¢TïhŒ£‰HöIùT²=Ï ¼²ÏÊR‡Ø.²-é|ç™LÐs¢íˤ^¯Ë¬d»"EÏ¢Â4¹Ñ®2iÁæþ}oMÄáxéh-¢©Á·˜ +- |™Z¢Æënw(QîkÔ¨å ¯øh§HˆnïBºM}D«õÌVK`­ËÝ ±}]Ê}ë¼Â¤té\40PfÓ­³8<²ÀE ŒºßÏÉV>ÔKsê—ã¹x‡¨Æ^ì‚j6‘e;–Ì3–Šû´^_GÒ5÷£íD;õ?eú5²ãmÑKklÒ§Hƒgn]èB—ïü׊‘ã6ôß.hun?Æö_õ´Yå]»æ°0¬|Îr”±X¬g,©õq€ð¿/(ñ²¸ŠÁ÷ ËÏ~TxËò‚¶¢õ'V±¨½—(°§_û6çȼ® ÕV /ùïñ©0R¦8«K#K¥¹©ÑN»b¼ H'ÎÙE³ÖúŽ=¨)Ø´=ð7Ã!eÈr%­mái¤]“ðj&#‘LñCwµ"íˆø?w-¢…8/ ,d?œ3Ü9TpfR„ †\½Ò©GEÊÄàšz”õqMÌ_ö«6‰*›¬‹øŸ7sÇ$ÁG¡_îamï~¬)ÎÞÓÀÚ0¶»?­Z«Lf1v«|̉TÇ®27T 0$È‘–-ç3¦’„y!=lpn2^÷'z½;í§§LTÞÔî,¦ý˜ê4ºöŸŠ\Ç_†+˜æñÖDˆ§ã58ÿàZT²<g—hòâ«”ÄMHAw!—pµÃã¾Æ3ã“ê©´.‹|ÜllRTÁx’”¢,\S:¼ãÇe¨˜¯â^sù¡1mñ'ˆÊIÄg퉯‰çåD’ç~µ¶„R¶N~òIsjýB®cî[¸êyr‹¥g@øðhÝéGÔz.Ó]8ß½¨DN¨÷9ÔPÙ;ÐLtl=«ä‡Ûä…^íH”K)cÞ˜ôª)骙Sg qWY¹›òÁ—n«ëlte¯Ë•K~Ǿֶ«uVÔél“µûÄ„:MW`à [‚_J/9„Ô Q$ùþ,ÍÈò0„²xã^È6>r“¨Eèôèë•·!9Ñ b=’ïÇ)À^H¢Æ®R­úרµ‡ Š¼.²:_C·ÒŸÜ¬!véÊ×M'–Ája–k>ä¶ +³úöèÓÒúáBå«òWw¯€3Z‘a–ΓÅ%#8ae\’M+!¯<Àê *÷A§ŒÐã]ËF„Híþ§Ž²[æ+ìpå#æ"”–Ý4#Yã͆²5~ô‚lÍ%K åo©†¯c=Ð/W9E׋f¤1`Yb¯ŽÑ¬ßìwré¬òîÙqxœuáHàÁm!°q8hE'ÖÔ£çÊÝï‰#·5z¨8©«ëD­ðžÕô{s’?ùú y‘s„aq¸Ùë6¬ˆá²Îïôò¸Õ3ëÛÊ¥=áØÕOx#U®Ù÷…ÅÉÊP|×ð1;Ò…\j1+‰zùkakÛŒ“|£Ã öËa?ªåå]íÉ ?çúåûÐlO3Ž6bØ°SøÐ0GGÄõB €bbƒèMˆáîÚì_âíÍ&u§,y´·n!\»ßßDg2¼ËªAሩ˜Ço1v(ÞÑŒZÍòË83šÕÍxAð3å<=]Í C}ÄõªPèÕ°…é<û,üH›Ïè¹S3‰ç¿ëßûù¶ZP+~®ÄQĩɺ3¿ ’2ÈxmÚ4‘­ùÝ">¥‘xÄÕð¥b¼0ûºþºo¯Ïè¿»ÜüS²\εoñ a瀸®+@G­ñ½8lçøFãqsëgCÝ`ª² §ò–§&˜WÆòôÛp6Û +cô|æ'`ÎÄS%Q 2ÃÜ &aÔð†Ó²YŒ½ ò…ûów‘Ž?£x…–Öê"WÛüy36h?¬‡jø^²iJkӮ߇ÕÆLgøÿ_;sþÏ„\ä^ž#g([Ž–Gæ1¹š£µ­ÜWåŠÍÇžÄcŽI³…ñœ³ÜÏ‘æX„ñœ†ž³ /rMåýï·÷yß?à»sÿâY#é» NØ3íY¶À:U ®[‰‚‘¶BàkÝz™=iïÒA• áÓ>8â„ÒXò¨Dƒv–ŸxÃSê^c6GÑÃeï©z¬.£Yÿ¸O£Ø0^¬7“Seã¬ô ˆˆMî«>Ý…¸4g䯓Z}:ͬÈòjùÚqynýKs*)oŠ .¬Èøœ–ò%Õú°: L/D~ +»»yÇ&Ķ1òþ‡ókÄCÆ)aº„íájÏ1¼AøZ +U¢´’™…ç"óWÇ ¿NãÐhŸgÈ –6¢À¡yX¬{fÜL:’Õ ³kÔ6n›'±u •Ÿ$E—Ò9ls+ª; ’†hNÍ2Ápƒoc&úFåÖÍ„Ì­‘P! +aÏOB&Ã~€Y°R0ˆ3¦ë+*Z–ä:_7‘ßÛ¿ 8ò~Bî¶Þúfë¾Ã2ˆ 1ý´óèhc4|yC¤1à”eP¥(¡†ûuF#õ`?wÜ<Œ•Ag ÏÙÔf +“ü½óMìcFæ/.ˆ›'A!¯™•Û[Q M£ð+hú#¾,¹¡.a£à#_°FÜÝ™rÍ”®Q‡læ tD³ÁoF•}àº}l£Iâ¼Ò›Ëñ UÝU>DM¦ž=:^颗fTAÅ–ú2iÁWÜ\£˜!@³ç°2‚ˆ™1ÈÝF‡ßjB™÷Ám(Dàkªl¶çõ‡OŽï ½Æì±ËTgÏTOmÌÆ~DÞ½ ÇWÿM>Xuw·Ûuò¾–çrï½JbYëçœd¨è8lxK#Z §Mé)>¦`eô_| N+Zõíêñâ^ÆÖŦÐåþW§® ÉD¥ÝžkÇ^'Z\‹…­)ýþ‰Ú% …­I–ëlÆ!ú¡ª#K27¶¹žÑphÚùqq&¥â*xõ³ÛòÏ£|yìÏŽ‚œx ÉPÔ4ç7lUðì,W`üm_p÷-¢1u¦Ó´5µY§J;¾÷QˆDŸ Á”H¦[uúÕŠ¡”I‚R–ÏVVÉ?¾§9Mö§­®sîa@0ö]Lo•£ör$ü? "ÁPŽZ©7t>ªn¬Ú½CPŠM( 4 Xi«—3ayýåäµ¥iu@Áåc +Õ¬²ãÎ]­¨€¢¦ b<Åwù.©D<ãçáĈ:Ïe]¿8%âÜY›>¸ØÚ¹8Èùß—’¿ï#6{†ç"L’îX¤¯ßî¹"V»³ãGZe &¿3óu_9û_fû^nlê +R ‹Ï¡ev,;è+c$?  âÍ{µázÊ*¯ì>èD5É'_›oa9Iyî¨áÆFÜæk$Uj‚×À$ì‰áÉRJDµ=%¤¥Z¥³Í’fLãŽaíORŠ>’|„AÝŸ…®Å©Tï Ⱥ៱ JòÊx €dUº|O¶ÖO±Ñ;~·”´ô¾Þ–]ÂÁQs\Íâ¤^Gš‡Rh÷8ú/‰ýü'¿ŸH|x¨Od°Ø?µo÷¡endstream endobj -940 0 obj << +950 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 34 /LastChar 125 -/Widths 2101 0 R -/BaseFont /VWNNCO+NimbusMonL-Bold -/FontDescriptor 938 0 R +/Widths 2131 0 R +/BaseFont /EUDNXE+NimbusMonL-Bold +/FontDescriptor 948 0 R >> endobj -938 0 obj << +948 0 obj << /Ascent 624 /CapHeight 552 /Descent -126 -/FontName /VWNNCO+NimbusMonL-Bold +/FontName /EUDNXE+NimbusMonL-Bold /ItalicAngle 0 /StemV 101 /XHeight 439 /FontBBox [-43 -278 681 871] /Flags 4 /CharSet (/quotedbl/numbersign/plus/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/semicolon/equal/at/A/B/C/D/E/F/G/H/I/K/M/N/O/R/S/T/W/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) -/FontFile 939 0 R +/FontFile 949 0 R >> endobj -2101 0 obj +2131 0 obj [600 600 0 0 0 0 0 0 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 0 0 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 0 0 600 600 600 0 0 600 0 0 600 600 0 600 0 0 0 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -924 0 obj << +934 0 obj << /Length1 1612 /Length2 18760 /Length3 532 @@ -9914,239 +10077,226 @@ endobj >> stream xÚ¬·ctåßÖ&›£’Û¶mWœT²cÛ¶m§bÛ¶]±*¶­[ÿsºûíqnß/}ß{Œßšxæ3ç3×c“)ªÐ ÛþŠÛÚ8Ñ1Ñ3räÍ­:;ÊÙÚÈÒ)Mlpdd"@C's[QC' 7@h ˜™L\\\pd[;wsS3'¥š² íYþ ütÿŸž¿™Žæ¦6ò¿.@+[;k Ó_ˆÿëD àd˜˜[" -ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢ÎðC\S^X™æ?ßÔE)þÕÞIÕÝî/±ÿÑŠœ­ñÿ:üƒ!,lëð¤û{é˜Y8ì r21yÿªý †é¿Îr†Næní¿-32ý«ñÿñû¯“îÀˆÙÙÿ³+*N†6Æ×ëþq9;8üUõ_7þoÃÿóü¯EÝ€Fp«¿mx‚,Ò2Ój±r‡'Eµû{™À‡ƒíJTøUÛöø¦…ípU¼×Ó7Ns¶¹/Ú}ìKSŒöbZQô¤/óñ½I¨ú -P7É;8hôJÓÏ4¢<¯e·!´ØÕv'•”õŠß¡¾Ow°8À\=Qù‘¸ø¡“>Ú!ù¥ÖÇbt¢4‚|«-<=#O<~z¤ê¹ìÛǣɉ…%ãq@$ô³ÏÁÐR«ð §‚JoBÀ»i¿ú$ÔèöÔË##Å%°–}U4Í_³i—}O‚LoàM”slݯüy=?É+”8Í5—ûµîL&æˆÅÛ„?Ø;kI8“ ]O0üvMÙïæYk]MýÚ‡”»02£ÔYRïÚµOÆH7î\‰$ÒjçH桳,,c|/ͳ‰M|\ÔøÉ×Ñ;gYs&kœ«ëP›‰­HÚz‚qÒÄ^hØx#:0%;Øt­%?!IRt¦äÞáséÒG_æóÈùC¾*íž¡±D­³EvAõ)i´»¨ ¹Í o)([ŒÔ‡+!Œ4Ž óçBÖx¨ö×éÀQ†Û–Í·´Š“çALb¸Ù…B ß%5Vy>©•õ_C äåwÍO?Xjb¸ËRˆ¢kŠìßFÆW‘¦³Âxýùb1£ôB:^‘átlØèöÇóžˆ}† -ß´Ç-_†‘À=DMá¢y;3pîÜÇ£àí •"¢œÍ‰pGÄ/çk~ú’DÎv}û Î|è8|ÔpVx{DžØæÁù¬(™è“‹¿ònc‚"©jȦފòJøˆÚfœ ƒ¡J÷ôy¼5Œ³4©aÆGD‰–îQHA²;§Oý|ÍJÑs{+ø}Ÿ£ù-0  <¦L¾F{@ºK4@Ê84;/  y¥)ߢ•èöp9ãÁuaÔqLä z?‚Dô°°Tÿ ½ÒHt<êƒÑ`4×Úú -'ëZ;/€Ü –^dŸ”¹\ ô 0:ŸæëFVEò‘¥0\^ƒŽ å³Ý1wé¡•>Rh’`ÛêüÁT~Ø QaZ­d®ý:<_µ\Lä…5®£¿ºyÃRxy^Ù@I?ÂÄ0ï–~ÿà·à -U~-UÙ1`¿ôB}èÿ[à|ýÛ¢˜‘èþà éz]n¡·†ätœÍOîø -é+¦ÞâwªÉ"=ÖšTÂb.Ê;9§D¿KBr•ZDIé°É¬/$h-5…œë¼_àï_æE݈P`„‰ÆA/Xâ\¥$jœPSj9ìùîåIt·¹özîk^Çqô„êò´GËhžÖ=ëxõ\Se”ãÒx!÷©8aYf«qy·BýÞHÜö˜ãfM¯ocþÊù -eŸCN[hÀÌ"¯5sß¡¶s«ÒVÛBfžáœD(˜Ü¤胢&BˆóáÛ§Œ—=Ü9bª©s ß¨nZîÉÄõn^’¡ïg^í*ªüdïfº×D°>M*|™vži­}ç`1;s~ŸNÀê~m©Ó±‡„æ\£"éc ã9D^ŸÍ1ÿ˜,F»9ÿÙªø¥só=Ê>çR³¿N§EUÝ£¾ÊPäý60|õ‘³9& x¿«é:d=ˆ“ºª¯’!êö9šu96¯¬|öu½nX—n/:s€fHë¸ã~_±›PªƒÍ®Hò£}&Eåæ«ëO¸éT\“Ö¤ÍoMç9œÇ!©Góò eLOÉuA¬¡#_Ôáhr/Щ6ßïÜ:´ëÕÍ©Ï®$V‘ILJÓ]Mèž µÎⲇ  @¾áÓË9äøÇZ›¨6ŠŽ¯7Ï©"Öħ1Ê™‚b½ZôL’ADe2EV ]¼¤X*Aþ8€?¸AÝÈ‚ªºØHüéuyHã”Âs *þ¶¤ÐÏW8=IŠ0Å - œÉò;Fª¥)Ò—³ö­nEä ûÆÀ%g5HF¢´`Æ÷‘1ÌBTï7íVcUðíÏsÔ5#LðÆ}Ì Ó]Ô^žNkHp<¨‹7äÛ!”a¿Ö9âì-OhGô¢µÍæ<¶ªKt VèLUjŽÒ:Ø€ íÚ²"A9ƒýL§@•­ÕÜjF×/áóæX±a¤“á…sy鞆v_Íï[3‰Ó ‰°^¡Ê-à¬ßŒ!œÙl7¨¦ ÍÌÊdnS;Ó>„|d¹—.Ú¬fnßY“ã|ø5ýòbõ"éM¬¢øBÍØ-P_éÀ'´ -S4DB~Öõ‚iJìÞóex1tk/•m›ÙƒlÐÈÍ#ÿ}7©ñ´¸jL¤NB¬O+ϸ WEõ{ç$3W¨† ·°‰ñ6Szuß²]wTé‰2åº -r€Ð5™'­§øÌ·¶YPNøÌHý ú†C¦ÝÖïLS]Ý(…3¹p¬Ï–z«ôtNzTD¨7KŒ:®žh[µg¥Ñ¤ë­‰ ¿ø˜¹Ô¹¶âÂõA?Â}û Ž>uÝ'9*Ë25 ÄÜ£ýR¹'«3Ir¿'ãƒz‡&ù#uf9¯*¡ì@ Œ÷OÑĬyáw‚ÀÙÚÞœ«‚ó—o -s%Ú¸üf„ŸËcÉ£ç ©œ>V† x*sžlKÍ?–‰N£“í³Þ;TÙ6qoam~gfÞÃá¹b:èÅ `Âî ƒ3öæùfÛVÓT”75"úzEÒ²4Yj©sÊNõ Ñ?±Šèqu""¸RϹ·ÖÏð­f†¼ÀA'bϧð!KI4 @·Ã‡u&“w]!&$ià}ߊ½£ƒimói×Y +RÀCÔÂÙ—ð¤ü‡Ö†8ó1…œ)ÛC0H Éª­ÀP[¹@SÝ~w0æOÍ‘àÝÔ´#Þ%ì8MÖ™E -t.Û½«½DŒ/vÄ”õf&|aªŠ«-÷­c†ƒY¨}ÇEWùn¾ß¬úvtÿtšúgÓ±ÇFé…ÁI{>2›Ðø‡¨ÏÂØ#7nPe…cÄ\k¾Boq_„t˜V/|å|ªeE2óFm<Þƒòc):¥¢@y'¿v4œ¸}!™RkÃKnpÁÿ"}ÏHj/Æ*.@¶B™¡áì8³h¨ûÂò0:z$X(q»®%ù9ÞÃX*´ŒEŸ|ÆB¬-$MXÜ/ƒ°I,Ø iÀ~™3Ó &"sÐöb“–ZÁéÃÝog„F#º¡séc¡Êöïpð{Ž‡Lã³EÔ]¥™PÙu`Jvqíªi‘0ñ}ÅóEëg2!­Œ:¾~¤ÛS¶ïgãÞ¨e}èGóíÜ+¶býÂW¦âEñ%,ðÑ„ U |έR †÷Ó¸ ‚“7|Y0¦¡ÐŒ`c”h"ï¥]$¯ÙDøy–¢U”÷³*Ëö;•»°žˆž½X€Vºi<„#ÑÅÒ8ù³‰·5òNéK#Û”îËÏNï‘r®[nXôf$AO"Ý–¸SVµ¼7ê^Y´]VsBe÷ ´g¬KI^¹A5Çr &&# zK½q*Ø" ¥¸ÅS äVOlMš­åV:ìH™/*go¾ |¿Û^B´÷£sä™Í/‚¬¨+“`‡™Dì žº,Âe…9:Cf!3M¯ˆNïxnÀ>9ë·ÞxCaSB$È7{Od¤Ôt †ðˆÍŠcÅø»,Y™B‹áºoÛâUûà¸Í —¢§²Â‡W½`¢ñ"•oû›‹¶»í‹èoœSªÛ>¢UÍAÃo+«îÅ —6/¿es^“Y ?±Py2C™‹ -ÆŒEöÏ´óŸ{.Ô&fÓAÄVUþDØ×™ -´ÂØ÷þÞŒ4à…÷r Å› ‚$Œ¾£Q`ƒ-`¬×ðÇŽMéˆüyÀœJØ ò`’…hQý)*¡ $ˆY -5Ëñò­Àóv3.]”T'‘™×_ìÎ"ÀT'8±ìƒJÕ2,ί„q;§oék9ãñÙ^¼è½þ#±ª‘l VgÈDÝ/tHõÿ¨ÀQ—Œï±<=fYM[=€7 µ¡éPÅ°¯qdt³a³´Ÿ¸®‰ViÉ}Í~‰r¨È ºC`%ÐÔÖòü¤‘ ¨ä=ìíÈ€°ø‚x.«å_dÃñð,öͲ ôpù‚­NŸÛ®}§ˆTÎÒ¶iÒà_/á z¡±íRÒ*Ø Æ 3ýrI›½Z }z+§ðEU-8¬¿¢u6ìú xõ+ðsFúÐÎ3à"Áw}EýlMÚv…U=Iö1ä³Ò±çŠ:lú¡‰àâåŸm•ôònG&±O4 ŽÇ³rŽÏõ¬ß’Š@Î%R¿~W Ø)Ø×\„Ý=VÎáܨVbkcà6æŒ#°ÅóŽùI4MœÑb¸ï=pû{níÒË%ˆfcY¨¬×¿þécaöyqÌÝ1¯Æ ì—n7 -4?äÀYÜéV“yö2RS¨àÆ`{š,#JiHÂâ-ý»€ëbú@ùðsºÄÙÙÇ5NJ;Îið’s7?†™YJÂ’F4TïËý´äb„RêK,k"z’t&¼pwÛkßò1^šDFO²ÌÂ>1Ñk3V¾îÈNŽD{¶æDJ™¼oæà”1•±ææ¯\ÒeÖ/žôG};;’%Ú¨A{½Eì–6¿nn† ê¢Î,%*îp5¤=¾š£Íi -Yت^éιAÈ•Ë5í -Ñaµ+Ë“º±\‹0ïdÅ C´Ð²(Ó©Öצpy§’éÛ …oû x#z–ÓŽú­iÅ6„_´'Æõœ¦?óØ&¢6ºT&V@t½E ­B:3ç|¡7›Ãù)èq‘ y#釪sfWZâH«abzTÆcóY!ë>=ä€Ë„—ö†ÅŒÎF1-Ùòò}\Ò|3GŠXi -TpndØtº7ù)åç«sç/4ƒ8ôÃNE#.VØjÑ6sÇþ·Šª,o¿¢N(Þ-Ú›:ŽoLªḻ9ö8èš?&f¾>©¾*æËäIâ~‹zÅ}HôäX|]ˆ…–5Ö‰¤õö3›‰ø/(‰[ï ˜Vîb6ðÀ—ˆ¨ÔÆ¿<—ªîïáõÑc{R‡vº±£¹ôRåpõ«ý—T6xÍtd=úÈKgû% º`I)„ê6…xVdLñK±¯“þO{e§Ré÷ù+Poõ šZyßÝb*óë6§ï½$¬ôG u\>Ì~ó²=]ÞkÃOáGùÀâ¼’þ4SËÅuÖ¦Ç5´ŒšÈN›Q;|8x -ï‹i’6RNbl¨°› (¾/`Á%àÁ¶åæõ‹¹ÙpbO$s™Ø¶€ŒÑ¾ÖÛw@‘ÖD“Õ˜‚ÍN"­K  &.MæÊj©úŶžÔì¿(`\5ÛZ µ2kyD„ ¬Î[ï*¦à"þFp›aÿ Xf˜¸ÎTb»}-» ÎáÎB%½ 8ê  U‘6J‡(ê¢ØÀµ–…Fíªãʜ؂¯ÀX-ô£-Ýñø>‚q'«o"ty’ЄP.Hòöf;¦—囦 -èýJÇF@´ø¢umŒ¯Æ8|‚…$³(ßUH§k‹ÖÐÓà ÷¹eeÕmÖGJ•#𠜶k%ââ];$ÖJt ‡Ÿû?`ö„i¶Iq~?•°©Âá/üªÄÕÎk‰ÎX¬Êù˜³SÜÛ¶‚ÜHvòÅ¿¯ö—Slöèeî‹*bN¿ÿe¾¢\h¦µð®ŽRöã -oçë÷¤¸Ñ^u¯LÇåô¼ë‘¡—–‰È/º¸ïr£ìu_ -¹ÊGÜ.×÷ÂÌ?áw…_«DP×vÀÊîúðMEi‰Í;èÌjêL¾ÓÍç¸×l£ÖJáðœ4ݘ$í$©QøRdàdzFaÆ -±aÆ°ö¤ûÐq#Ê õ;–>u ßЂÑȲ¨ûÜ î(x­Ô>|»zsÇöMïÜÚ ¡<£²€*¬R¶nè«jt¤g6ö!;¢nÖDJ®Jí¯/i·2»K’HŽc1äÄ¢):ÙØ^Ãô¢šù…Íí>ŒôkÏ\@¡fË yñ6“é‘úGÔPÐ艋ª£5nôXþ8…ZvOç kŠV7ûüÒ6'wÊÅrÒVrô‘àÔóµOoü@ ”Ç}žìÃ3_k¥Wn~— q°ê€Â¡NmHN¢ö.U¿_¤dNß9h‰¼¤‹8 @Qpù7Y^©Æž7RØ‘{ǵºÒ´±Î—ÄA¦WM¹ ³xûû’×*îÞ¡Þxö\(ž§/2Ÿ@\ꩉãù>#ÞÐFÕ³« iøMŒ”™?E¥´bC3%ê5îæ{ÓeR„Z )o UE4´oÆ :[qt ˜O¹èðuÙÎJ’ÔàW-º¤–yÃ*¸Ü,ºq ï7ô/fÁC¬F¤œslÂïJc–R‰¬È3†›…ˆ¸î*\ª‘nu”Íooˆ[í)0"Ï„äÜòR‚zƒi"ÖbhÖ“ ÀI8ŠeC’µ¦ ½`ò6¬¬ÙÈØ—Éýüv¼ÏvB¡¹†5ÃÌé—|5˜,óë··'{Ÿ$ÿ0Ø vYR~=2·NDá…Ü… ´²ðAC£´ïK‰ t¾ú¤ÅÊ´Uäfsä)_©ËŸ÷º1Ó—ÃU»»bî¯41Ê„ kÄßF(Ä -AQé}lߧ‚>œ'Øoy=Û“õÀ!»šp£v SO`MÚ -ÂEdqðÏVŽ<[^/à•‚³mQB(ÉJ4åïPÓ%›ù5`¦—¼<áN]´ÍrªuÓD…8#¯U…ÑxšŒŸžþØë$@Ñrˆ ¥åpT_ç6þ3$$mýñmmòk ŠÊƒ!7gN?¥÷Ó -4“R¥VU»4¦^¡ËþõúB–üLJ#£·nγsl€tŸh‹P¢ÀB¯B¡1ÔÏ’‡’ÀmA8onTƒ¯üàŸœŸ™@©5Ý£ m>è|Ìãé$Œè8L¢äë×RõC™u´„î0a\*;­A° 0‰ì…ÀÏ?'ê=¤†CcÕ×ÇógEw{ñ§X<¬Ö«Î§¢¯‘Ö/¬+±]éÐf¾ë{Î"²Â.`W_‡—ú¸R2´  ¬ ÑßèûnȨ÷„W:È%¯Qý#?‡uÓÌá†8p¶ÄÖKê"“`t@ º^õÛ“TºXÔ+©eÝy,NÄ™‰âJcì³¾ýóiówh²i©1K½à#<í‹6uƵ(E -¬Ç¿Ñ¦‚¤E(#ÍËŽâ~qõ¥]ïãDí -zúÎ}™‹KŠcw|¤ªïhu•ëôSˆÆ¡ÐãË­„[ö:Ò-DqnFå†üô’êP>Âz^ʧÁÒÀ”¬Ì»›~–[T¸4عâXïîif%ŽE„óN˜¸þÒ:Í“dõ¡#d©ðº+†ðŠÊoFš{ÈY_5¡»$ž…Sr25Õ¼îà>Ó ë°+a“^r8Æz5³w ³„­JÚ%uàÏŠŒ²¥oŸP,ã¦8(+{(š\‚J)æ}kŒné?op¡Œ®_@U<º°4Êßo‰ÔYÞ<ìaÁ ŸMˆ§õcDÏSÆ)ÃêNiñZMEèG5­:—ÜüÂ.Ì{á¥Åu[R½Q0È›®iÔú#ÅU·@„ñ`lˆ-gb”Ŭ\ÏŽXIP'°(Gý³»`š˜º„€B@BÖ&íOrÒKn°ÉŽ‡{ûgÕ.V­„Ó á™ÔëuVO¹©’›¦ic{b¨þÈí‹5D«Í÷‘(L˜žkVADõ½mÕTŸÃb|kÊ"¯=^sfÉ̇ ø.Íþ¦úzƒ D?¼fd¥òCRØÇ”½²c+‡ò¼}ÌÉ? Ž²69>jí™e›W"àùï -.^7=º6Š2#0 Ÿ“8uGzƒ)?&¯~Ó&Î^ma€ÐÎÝØ”ÉUk‚Ï]ûl ’4Já–‘—ªÖã¾ß‚•è‹ˆzN“Uæ§z¡Ø„ðcÃÀ4¼âeºsÂiŽ˜›ÈÈu"ÂXÐ MòÂàwB²Iê­Ã>¬qø´d†É¼•§Ç. m"£ûˆëDÊ!‘‰oRêS´½)™FÚêaÜ.¹½<ÙBý 2ƶðÞ+ôBƒÐ­¡+-Õ›3ãò¡5ŠÚR" :zïEñ>©-Óæ° Îg‰lL8y$º›³Þ%µÙJÏX9?ænµ‡äFóà–®Œæ4GÕ'‡“ç@µ-–ýp5i~Ìoãø†Ž…·r–½Ý¢_« -)׆þ®ì¸}Ÿð‘„¨ÍŽà”ÿâMµ3ëîDþþF·X#›Vx„¥Šš9—ÅÁ¨¢S@§¾Õ§+Öf.;™•óÛtÆçÕÍ&…¸eýÁˆQ³ý Qi†•hOr{jY%ÙJw¯ÂT„—lFt{¸ö81÷(Â¥…ô¶äÃÊòûb2ÒJ8cá”ˈÒbÁÀm¼J&­Z‚A -Õ!R3|´î|ܽ$uà×­GY‚œ æ{Âx¡  ~.œú&[qæfôð†hZ³O D_‰Ã`z™7ÊMìòMA•WsÕ [ž„væsÅÜ!ƒØ^ZÉ»‘wïFÞVeGò‚\l¹ÑS\Ÿeæ"þÌDnÚ‘15Nôz{ƒ¸Yów0[° ukz?¡Þì%¥ -Ü0†Ç/OLj[É|Z«×Ûž<Òí°4ûº ·Dɇvk5A´oã ÌtAÔ” -çHBžO+Ú‚ÄîóÎ"«g,Ç}õS?3Ù³”“´§+Ôö·V¥+ÂÜÖ/'Ên³÷^ö/€Õ…Óÿ곕µ°€ùÙ?"0ÁAÉÃ\(à-ŸÍ¹À/¾7mù±y}ýÔm“ýmùkìµ4#±$ß” -¢0ÓžœÇ‹·z´RÒCfwMÎ-‡Ý ’օʹºwvE:…n6OAÆR . ½Ã Kæÿ>©´‹™Ü¾hiÓn#Ç*ëÈÎ^ª ‹{n„œƒ|Q‹évÝ 5¼ã›ènB uv%ò9{d|ÞQP>CöŽŠß$qˆÒÊšÙ8”Ç­š¥«­u#Õ¸)«Û×¼¡ëSœiQ¡zJõÏA*tµÓ¦¤§ 3;Ûtès-|b~0~B-Z)ñBšª©*·?ƒæ–+[L’0o!ìÆ»UÕ‹B"Œ¾ªÏ5jdÝi·©dVéc]Ð[æa÷Ú(i³ ¿=ב;†L íu߆+YÙÔ¯jÒðoAs-á÷!Þ;ýÈž8íöêš«Î~à 0 À„ -Œè†²}­°[^­ÄÊ"+4´Ÿê°»Ç[èë+SˆR·sQª‰’ŠYHX¿™ïC6ñé|W$­µÈ¹ê1±£×Kì¸ËG4ÄÓ:£å9d8—f‘%¬-Uo—@~<Í‚¿<ÀÂ/OY„рƈŸ²7 9ÿFL!Ë·$À#Í‘»%#“ÂÏ®À!¼d^ûÉßì#r8ç7Ôs¹ùáÃ@óî¤D((§vL¼ñgà³wKKf8Õ–u±M„ ,GìÀ±„#†áÎ7n $\*Âä2Þ Ví/@3*Û¯¦"üÔHÏ Ä»Tm’k7ìècƒÀ¶oÝ…æpxVåÓ{'ŸÀVÏQ@Lv¥ày«§ ç-{†Õ#c¾Ùy·Gö=…lL˜ÀL[×nЩ2oY4êðÌûÖË•÷>BX^M4UÓvŒ„l0gz -ó½ýÙ ÍËF£jkN°3½WäfÜÁ)8+í':º/¨%²+žG%$Åw·í=¾tÀÜ~ÆéÁúäi*¨ÐuÙ>lû2{†X’GVM"¹ï§¿äØÞóŠ-I¦./q*#Ú-ÍÌûS­n®Þ~¿5f58O&Ó=ƒSµ@·ŒVÓÃܧçOPkÓÿ hÙ)&ÒªîÏWfzv,Þ6ì,Ïp¸êÉã7­ ‡ixÔÆ­SÆ;Øc¹}¤ÛUŸV¼ðœxç.»wQ~ßÓJ3CÙNcYB»Ñƒ¤3Æ›õ?­ÔæuÅXŽÝʇÌ®þÈ}‹b×"¼ô)ÿÆ;Ñ€¤ˆÍ -Ú‚+m.'ª®ãæáLVò ÊacL-À³…KË+@±ù~àI mªÎw3$‰/pKx÷ÛNìv þB ͽ2ÛÏA‹É]`Kmâd¹êuW‡¶oŠ\ˆ©/QÙî„„!'Ìqzî¿æÞ`rŒjéÒÍd‹ß”¥ -¹•úÑÅ0v ñ>R0Þ{W8ý34®H‘ó£îH±±­ -—0oj+tóH*ßj<šÊ¡ÁYzdÍ¿f1hJãg<+ïa??Â…VMQ·IŠ´Ö`ÁÖK)²jâ‚·8óK×… -t‚i]ÕܹQ7•¬¶">ø'2cq’ÅuE}sÀ£e9L&„MrÐ`yOCÀ´ó'{›HPO˜ÒoÅø8ì»n·Šš¹Î1è˜(]zš¦ÊÜ÷ŒDÈQ–Í’>¸iŒYñvÃ×LT%ù+0&—¢1BµUkæÞê«–Ì«l -¶Û2g§yö$®ö*Îæøe"'WèÖ£“C N1.-ÖsÛòQí5rJ÷ÛYAQ&¢V1R7Œ¾'NI,Ÿ*˜å~Ƶ”›~÷Úrò9!ˆcV†aCPµO;;PÝÌå³(t>ƒ ¯ì~0Óâ&ý¥tdW)T?&ÔzISÆ—µ Ñéô9óóŒl|—T¶·ô¤+NÓÄn“4üÑ«#éÜ‘ñÑÄüÁÉ֕aã_.›+A¯@™øêSÈ3•'üp‡IøÐÌySzùO ‡´æìÍ®¼Ck;ë2O3Ô‰áy/sT²—»ŸŸhŸúĈäomg…Zˆ­‰fº9ðþÒnjĹ.&i&ß7AŸÀ’\aö(±V­J¸ãnÔœm> ØŸ) þêy…ñålkMO¸éX8VEdàŸs][» NÆoñ3F_ 4å`}†v,ïˆnd ‚ì’تLÚB+;1‹h²QÀú·î´¢f)²kß8OÒ# õ:‰É°*NøG0Úðž{Ï·¸Gâ3]ÒB]ÝãŸeõÊUút–Zä¡ÛQ*He'3u}š&ºaVÙ0nÂ_å · Ø5J泧Þ;R~&ôc5Æ¥:3…/ïì&Ó¢.AðáÁÎƸÃÄžR¿nÈ€¦ã~E2Kâèš”¾³klÌM"÷mkòù¶Bˆ)™öøï¿¿ÓIF{/õð·לuù[Š“‹ÜhV¥<õ!1QÏG)9ì(Å¥ ÒtM ËëqÌõþ¸]%tƒP]¦ûtàÆ&Ks:!lg‡€†)®7ì,èøÔ:Åaäæá·ãäQùÔò=•ÃýnÙ,×À­¼kZ^IºgàÁô.uQ³÷ },Œz“¸»•dA@{â^@±ÝƒžÅ&ýþ°Æ¹rVL*ç‹jïRf§ž¦|ú¦ØhwFjPÜ{tnã𠞸Â1LM‰ðg6þ>¬€ä¨è!³ßO’N·3PsÞvz¤' W›Bb×÷d•ª;ì;Ъ"j7Ž”‹98ô©å,³ÑÕ4ÛÕ-뀌éÂçË+[ã®fΠ´=5"ëO_Z§ÝQýJå÷# ;~Æ×:¦ùOuP2Ãþû9¿™Úã†ß°q¸D’!ˆñÛü"Np G“ó TI¹Düˆmu áê°q¤boówH/Xâ¼¹vbh™‚79}Øži• 0!5mù'p¸ªŒÍ-ÖЗXéçQdrîá•fè÷ëåÞ1ŸdÅ˛Σã…ê(?ÞOCüUd;â±ñ.&- ÆÍ á©UÃ&ÄlÈQ¶œFWü ÊîG˜ç;!:XV†à Ž«¦g.šÆÌ" ƒâÝ`”Âp¼](G¦•|ªf?„ËÄŒjݬ~h2w|¶A™¿îÇ숚ˆ‘u #S0g0XÌŠo æ< ~°fC1å¹TËI€I¯v8ì{0®BôÂPœŽì>@;QÐÃ'‡³ †êÉ2$¢b(ŸÜ~¦r Ž}žjÈê 6G\æ«ëVáÃðšOD©h#Œir ~7úsaóÊÀ?Ô³©§²ÆÍ9Õܯ» -%*RŠ 8$ ²Bí¦®ä[D¥ªÝ«ÔGÆ;üÑh<®^‰¨´ÑE—@$|ûÈ89O\2¾ãw3ÆRæò…iŠR)ÇäN(˜$ âBd ±ÈÔ: ¤cCœšÒÅãE…É<¬)2@5ø.½’ë"¼ë'óMÂÛçœÌ„8 -БQöw>}N·>¢Z[@ß HÀ—ÞäN—÷“$wŽp»X0õ•Äƒ<±´Áí¼sÎ*`<Ñú¶øAF‹/©=J^®üݯ‰TÿýŠCX k¯”¢vÈ´ªøƒßnÔ«Ó¨ ÉŽ:ÁCò®E~$œ-b™¶ëþto©ýB5÷ªF¶¬ïϾ¦´]çnÿ¾ãçz£û-&úiý½®€Q“²sxGûÑû¦I`¾|R$I‘õ\‹àX.áçëÑMdù ØGË7DÐÁ`lÈÒák‡)*¢mÁˆŠ‰£ä¾цëmhQ8ð™’¦;¦eP‰Ñ£EçòÎïZ¶úAI -¦£Ò턳`à*ùê™>÷)›td¾ñlË•]“î×=í -9l¿»YªjËŠÍa™°Tt÷W.™”Õ>/žú„ VݪdspÏ#¸îú§+^üƺ§h¥ÔS-b©\LÔåg› llª¦¢,#Un¥`ÙD2ïÑw^´îWƒ…jžÚòHƒ,ߣ4i´Ø$ƒšš4œ¤c„\œÐ9˜n³žK=F™•S'a&È6cS4 EV×#ž°Nšy’ QN¦]ˆ‚{4)gáŠÈZó±ñëÛ¢¸$¶§”tÖ©ç< K·fÐ2o„mê„‘iª:Ï”)Ðö¬ ×ø,m/@=ÉFËi‚tÖ²$Q."]å+&•²jjÄD™Þ}Û­n38e(Ö²õ²·™s,ÒõáÙĽëÃîñ¦Öà#” -, kÉ÷´éhÏ·.rLgâ×hž„—pZ??ÎË;@·aQÞ¦fÍ‘Á£˜ÁüÒ,_g+õÇDê–[ÖË`lƒÿmjC“½ µ‰¹ñ•«ßyÁÙUe°M ©P21=ÑAC6R²ãxÖ¢Ó»ÌiI˜µnþ¡twÙW|$Ø©Ýv;Œ4âcƒäy.,üôFÖm@Ë1›ÚÜÒS½V%¥ òN)®#ò÷~H}ç†/œ¶CDÞË>K†·Õ04 y\·ç¤Í¨ƒÎ¬VD©?qúÉ´K¿¸!˜Ù6t’m3ã˜B. -ÂJY†Z†ûš|ý4-¼©‡ôÄÖ/äNø&vL‰¸y)û÷oæéÆ¡s¨Fâ²JJ–à!`²K-TîÍ$\ \8fÇ®Ÿ™ºˆ¤]z‹9L9‘Ïÿö4ÆðÞ/Tþ&š¥ëÕŽÛîäHŒ7ýø1ô°’ë{ÇnŽrbÍ¤à„©7ëã!ÀÎ|#^ìñ›C§.Öçì1Ê"‰ >B÷‹=^Õäìb—bu/ÙÒXÄ‚™Oå§kY‚O)™:&Bç|i¿ôÚ¸rŽ:7q.8VJG±Ú–= -¼œggÍMÛR9éà½Ù»T¿Ø6žft»@ã.‡±v¸g8ËÃ7ÖÇËñˆùƒs‡@JE¢ ÌL‡²¾ì§£é-ø?ÝÉ8݇uÊ I·ï*"3 Ò÷ËVA¬¢Õ- ¡Z"ÞÆmU{/)tŽÎ›ð?KŸä~_†ÜÙš Ö¶lâ’¡n˲aþq+—ôú¨¤ë1æo/+žQTËq&ÕHdn„Ô¾u ˜Ñ­-ëMåÇ‘sÿÉÅ™[tœ¼¨øµŸÀÄíÞ®ßPx|òúËüá‘æ/¨-epsƒÛ;ʽQÊeŽÍYszgÏLf²Ê%—â -‡3¾•þ4¡´°Ç4s©Ó(œ#qp6ß ïȈLÞè¹xÌ9ÿ*Ͻ-+\NÆ"ìÊלý 4±ëè“B»5ýû/VQO‰Aüp ÈÄ@ˆtö·­ã*EÕV0µ¬7Vn¸¨bÍ[u?¹CöuJ4,Òk|_Ë­|Ïë2•`k”äÅhÅEdÔ<üÉgÁÛ{Ôrä5ø‹›o{Ÿ¬cy¯£ÓJ¥Ò/âðÉÞ28Ê8®9!úzÕP“¤¨x÷6`1©ÖÝ`¯îOzó€Xú8jvƒXq¢™°£»kÌí²¶¡‰2D¾ß•‰”uaôBAwõúà ‰¿ -€ÞŸ|æ`xFÎärãiwÍBÄt·Ñ9”kE‡-ñL¡•´]^`ƒ|ðv?B@ÕÚ,eç¼oì.9‚¿‡ú‚8ÛƒïûÝ -2h°Ø‹­ˆÓçBJ6 rD÷ öy@hÓ©A˜orÉbo»­]hdçb;é^ûxw^c»{$¯öw÷ª(:©]Bæ?0B¨Zt=qsŽ»_ý¾$UÎö×ÐíT! vMIöM»ªéKk¦øy"Óî“hŸQ¨¿tHg½Å#v³ Ë¢¹(^Ë×"F¸Cáß Úï~µÍO[ŸåÇ•ÖZ²Æ~!íg‚dö¯hÙ¿¿«ðÉ×_j¼ºÞÑñ¯EAåƒß€MŽ›_ô?¸M¼½Ñ¹t~ŒÜ+ì SVáu¤T…r©¡l®¥Uƒ0P;Þ‡™OØ~uLáÑwöÞ5gL›É+Êj/1ˆwv_›Æª¥µ[þ±žœh…{eóåa"ë‡u ™rÔc§®–㶭=üdxí†ã%û¡AUì÷È+×¼ Ô4ÞΔEÞ°•ÏØ„ç“ø¡´ûèâPz?¢†Ú mê"ìvbîdU‘Ö¾”ñzñj3¹¢¸j&ÁÄ~¶§‹»‘LͱZ -É5w½‚'☺²¡tg‚ÉGѺÐäQ`Æ9vÉlpúÿÖ§ÿ¢^ʆÁ.¸7%Ò` ã±¬Fœ}a<õŽÞµªž2Ȇ´h¶”RÒ`k‰ÉÓUúÞê¤/˜÷¢ú¹«É«¿ð\”)$q‘1)Ûÿ~3w¿,ᶉ:—ŠùÒ¬®ÊÊ€W6 Ù ƒé‡~ÕiЩ`’××»žÉ v ˜rGK/ÊBˆTJRÌZ[¡}ÙAöˆóÛ¡Ýå熫"ø`™Þ[þö‘±U1²ѵÀÈyþ¸ëhBØ…ÏÃÌQ)¼é‰e‹@Ÿª"´±³ÿ2ŸJÙÒe5> 9UV„ jTÔ׳4ašG}„Ç᧜5ÅHgQz>ÜØÕ"oÍ£i:,®Zƒ…[ªŸo[¿¢!cÝÛ)èu3oÁÜKÄÏ6W Þ¯"Ó  ”ÚðUAtE© ¿#Ibz£±'»PæÜä - !˜s¥8cs;ªÄj­ÌÜfºô#·Ãÿg:‘s2$Œ©ˆ×6'?^1„4=Wk¯^éßÈsê&Ù¸e;ìðìÐégªA¬½Ù¢vXþ]ïz¿Y¬ÍrôÞ= - Þ?”XÉÙTVà†Q¢›‚3=A(ÊŒ®?Ît??xnkà1›Ô›ÔÚ äŸA`ã×0滬²tôŠ¡Œ»*!ÂFë¾ÈÕÁ(»L lô-eFf×Å -§,Éù¾Nª„8’sŽ±©U WSi—³¶,keõ%ï"‚×cQ:Á`c„†3p› Ò£ïט vv„_Y†)„A(@n`'7)$P²tJíòkÓp? ¨OÝï°¸>ózäö o"DXÓº3Êlª‘ûÁ†êÙKß±6ÎÀš9ŒÌ9‘ 寧«Ÿ#Áâw©üljœ]rlXÀfñêjéÙÖ ˆ¹œqwLLCÖŽ¯ËAŒÍƒ•è­0|¦·Ý¢fZ/Ç -qH {ÃŽÆ¡I<Ü“QvÏÍ ‚TD†¶ßûu|s˜ÙöoÜœ¼ •ÁáÊË—1™­.·óüe|î÷œzzEÝ³Ý U1d•1°Æ½™Ä<‚Ǩ‹Ç/œapbÑþ?íÌ÷?à3ÎÙdds_ël_ûÎÞ;33gwÈæì’³ÇÙ„ì2Î(ópvÄÙ+ -eËè2R¼ÄûÛûyŸ?à ·Cžtж‰ä€¢rªØt°W¨ÂÃ^Ã>\\hŠþ…¸­£éÝ ÓùÞ©e‚ & -ŒÙí?ÄSËÜ·7 ¦Mwv½ r#aCp ÑÁ¤»Ê«Z²â™×?åYó›j‚foM¤Ž¾ïhWò÷%Ñq.4ƒ5ÍÞóŒ®:žªFï€uI|Òxóstóår}¤‘(º…íOëËD›ïö0C³Xò™Ï­mtý#¿#/OÙÉU5ƒ|¦ðžË%åOŸ8+‡!ðÕÈïÆÄ»Þpi¯ÏÊ*ÓK(’èÛ¾½ÙR„n9 ½i3Í“~i/]L‰ÙA•+®ƒ¬-ãÐúˆ¿”X£Ôëë"M3µ°hónf;ñˆYþÒ$qW½ÒG_¹jcR2š×»‹7¨Š}r ¼áègJ?%Lë9bBú<–ŽÌ&f·´È’Mµ½>ºç|lÙQs- -Ï7û1'»öoσAü¬¸²a«Í¡K-é¢äþ{." xÊDï ùÐæI~˹G=Ö±?‚§>Èyüñ°“NÐ%îIß×µ¿è4É^)Oïä¥ç¾®ÁÉ’F°³¥1ŽžzÓ€SÚóJîi¸g_ ~`ñ›1E!ûŽ±Ö]Óhcotí¿AàçUpö„ß*&"-š{~gò&ú{ …rO]ÉOœ…È”[‰„î£-•;J×VAЊü$JJX&Ê×"é 5 -¼ØñÆV¼_±  ’™c€AÆ -€~g´¦™L#ZeöܬðrFVU -¨ì¿öžÓpÇ£†äH¶Õ2Señϵt(å¶õOÖt†Ò[ \„¢73}ñƒça-ø{û9…Ô8‚Ãõa8K<ªä-™£UÍZˆjzìɲ¦Omuã–‹ -|BÖÝB|kæZÄ@ºÛt7B5úÿü¥/Òµ׃1šòò‚Æû±®¸—ÜQZÖ¿S^©Àþz?§â7*¬UÌ‘Ž´Á9a¸|ø2DyúQZg‰?D[á4m|‚B–*õ¹÷kîìDRºÚ0„¾ýç–É­wó~ýØÒPÇü>? -»ë~÷aœ¿nïOÝp}ê#Æ)f’’¦„?BË`„ú ~R(hà'Ùç¾óì ØÉ»žOÛšù.»ûe<™“1êÌÇÒïÒÂfÔÕóÏ“¤òÞ!°(íTLÈÃÖ¥råúDÌ|–ÐÅ8Gä|}¥|è+ÏTPDpƒˆíJN5ª,»sa}èàÝ!/ÿhEî:±‰–ÂÖuL¥èmzÍŒÈ%áØß+pJ^‚…®Ù†V§óÕ7ƒ° 3¡‘ áâ9zU¯Ì…‰ò;é–Ÿ·(Nâ°­|&=×ÝÉEr4GîÇ4ê˽/Vñùén :,'劘ʕc(x^µ@$ÛL‰†¸æVìP¤ýÄJÍÏD{¤>pV$QJ¬©ô=˜Ð9 Úp€Õâ«ùD¤å0ù_‡b>éRêVtÃÖ ÄMd~„Ýl{‚òsÉÞ! 5õµPÓÎ!ÓêÕ±·ÍˆoÅï$ø4÷µ£e!Ó†R©û,ÞΦbŽ†lŠ\›»ÆÈì\Ùú$Rk=›‹Tö° -Úð­,6äX€qÐ-}nJ®k^¨£ô@l€¼ÜI>Œ˜×TqÅOшتxín°úâ…õµ4JÌäÅV kw¨Š‘þI’€¥¤\°^0Vò˘íep«%"h* ê mQôB±Ýë“ÙÏXšEÿ¶Éµú0üöA•ÚªÏPbÑËöê6EL7‹:Æ6ÒpÑÁå»ý%Tñ4w bBY6Kn8¢slG›‡œ .ôˆdŸ*‹îí¡ï8‚ìu)+¸"xJmKM Û /û’oË3ÌkŒÐ‘ÜãƒÛ’ÍËïÌk‡;/°¿‚ë’àU¿n¦NÔí]…6sÍ£¹ÛÉi<9s„pÓ4ìЛ•E÷³¡{¨Î¸›Ñ(@£ìª–8¥C©·g{foU>Ñ™vù¨µ«IÈÜÞPœU›K)ʶZQýmk ·çƒe~cs3˨Œ°2è£ßÕ ¾ÄùNs´Añ,ù¡H¾…¼ÀÅt••å;: -œ•F“þ/Eň¢M—íîÒX =r‡K—+hö¦­y¢–éx>39+¥¸®¯k"½…Çl÷ÀJí„MÚÜ8ÁYËÜ&F¶”´Ñnýó'¶±_t¯…´²ÅÕÛ¥ ¼”žŸö8Gojü=ã6ÀçÞ}IP†C?äy¹l÷×MÜ 8ºSJ§Y´%$<-ãw¼S9ðJU&t ŽÞ[™#ÅÀ½5‘µc§O&QNðoMÂM/ …Ìþæ2¼`ÕE”n¼]QàѨPØÅA9TM;x¸á•3O‰­X»ãÞä»ÎúF_s„"oêoì9‘ö-Z%×/ÌÓÀ¨LÒ¬ŽÇçDrU‡¿ ¶Ï­š6ÞxÓÂï¯Å÷†½®w~¿Î~ÁX0nïýe´Ý&¤„’Wm»Š)Ôšë2ÒÄ`ÇŸ­B¢ž}dMÞ xì)㟂ñU‘dIÂçÍ Ê>`O‹5ö7ÕKõ 5ñŽ£ÓÔ‹Á}äIZ-™óDZ´[ŠkA,è3úI—ãq­«E2·:±AÚJÇ‚p9lrEèp¢V —2JÙçï£)m×·ÇѾ&\!H !Wuy§|õ ¸ýkI±3ÓËôì ünŠÐŠµ¼J§UÇ‘º;Ë÷Û\»#QÆ>‰E¼ßå îÜôÕ7;w“«)½VM.òHfÜ7$fÒzVÒþ ®:ëÍ©Û"Ä%yF#u»¶b1:î£Î¦Ð¦ºwI§âtß±.bïö:Áô|š·!/ä‘×…lEŒ];\PâéƒÀJ-†ùfï\gX?ÚÝbÊâ¼q#°È™JZcvr›”)\MUŠÿ½žØ«R#óÞ*{OÙ¥òó£SØÊ3«uS¥Ò+¦Ë?:ô$±ó4£º‹Õ±™o °Î³d q‰ÿ|¡âWV¬I¾ßxo¦Ì=ˆ4Šž%,²——Tí–]x-«GU}¡:¼@šëäãÕô´:+VfÀiIÆx†‡Ë2Ë–„\ü_¢øð?¸ùº»Áý\}(þGªßendstream +ŠšRòJ y5€Ðè`hPtþien57Ú8©&¶«F¶6Ææÿ´æHÿKÈ`p´™ÿMºíþqÑì€Ö掎¿æŽSC§¿3p²˜ÛY9ÿCà¯ÝÄö_„ìlÿFXÿõýS´utr4r0·sü­ª(*þožNf†NÿÔv4ÿëØšü4¶5rþ§¥ùþÂüõ:šÛ8œ€nNÿÔú ›;ÚYºÿ­ýÌÎÁü_4œÍmLÿ‹-Àhjè`lttü óûŸéüWŸ€ÿ­{C;;+÷eÛþ+êq0wrZ™ÐÃ11ÿ­iäô·¶©¹ Ã?‹"ecb `bü·ÝØÙîú\€ÿå?;Cõ—„¡±­•;ÀhÇ oëô·$€òÿNeúÿ>‘ÿ$þoø¿EÞÿâþ§FÿÛ%þÿ{ŸÿZÜÙÊJÞÐúïüûü}al²€Þ+C‡ÿW¸¡µ¹•ûÿ!á?5€ÿ&ùÿ#ådøwB6¦a¤gü·ÑÜQÜÜ h¬hîdd01´ú;©ÙÕlŒVæ6À¿Šþk˜:&FÆÿð©š™YÚü3z¶»€6ÆÿIþ¯Hÿ¢Î §©%£®IóŸoê¿¢ÿjï¤ên÷—ØÿhEÎÖøþÁ¶uxÒý½tÌ,ö¿9™˜¼ÿÕþÃô_g9C's7€öß–™þÕøÿøý×I÷?`ÄlŒlÿÙ'Cã¿ëõ¿ ÿ¸œþªú¯ÿ·áÿyþ×¢n@#¸Õ߶Fö¥©F{1­(zR€—ùøÞ$T}¨›ä4 z%ˆégQžW‹²ÛZìŒê»“JÊzÅïPߧ;X`®ž¨üH\ +üÐIí|ŒRëc1:QA¾Õžž‘'?=R Ž õÜ@öíãÑäÄÂ’ñ¸@ ’GúÙçà h©Ux†SA¥7!àÝ´_}jt{êå‘‘â’FX˾*šæ¯Ù´Ë¾'A¦· ð&Ê9H¶îWþÀ¼žŸŽäJœæšËýZw&sÄâmŸ +쿵$ œÉ„®'~»¦ìw 󬵮¦~íCÊ]™Qê,©wmÚ'c¤ w®Diµs$óÐY–1¾—f‡ÙÄ&>.jüäë賬9“5ÎÕu¨ÍÄV¤?m=Á8ib/4l¼˜’lºÖ’Ÿ$):Srïð¹ŒtéÇ#/sƒydŠü¡ _•vÏÐX¢ÖÙ"» ú”4Ú]Ô†Üf†·”-FêÕˆFG‚„ùs!kt> +j8+¼="HOló‰à|V”LôIŽÅ_y·1A‘T5dSoEy%|Dm3N†Á‡P¥{ú¼ÞÆÙˆ +šÔ0ã#¢DËFwˆ(¤ ÙÓ§~¾f%ž©Y·˜"<Ø™Él¶‹Ç¹ÿúä2Ý©²HˆîKöÿ¢Õê’2|Cu˜Äï4‡ÙbIYY`AýÝ«!ðc* w¡)óÊ~#†!åÌDŠ¹p¼šÖ™(bðÆ%łߪÇ4òsœ.劎^Ëú0ª†'> +dÇ$[ß4˜h3iï*#§†]Y·6_¡$l¥—\5Š´ +ÖƒGÒgÏt7êz \ÄØSÂèÑÝá Kz¬Å~»šF£¦s>y{­)ÕCóaÑýû²Ú7× Ý#ÓF¾o¯Q2v3äòÔן¼xÒ¾#x9s¬(ÃÇÊÒ÷öUX7Žqb‘ŠŒHö;QºÙö³ˆÊëí:²5p,sÍŠ˜VÚÜýXQý3j .jWô…¼¬[Ç2#oîä2’«²6¢£yé0O ÙÓËø8³)Kz¡l„ïzä^骟|‚gOH)àY îó¸¢e¾,Ùê›Ì,ðŒ‚þ²Êsźy&Ê⥄ñϤì*“@bKiyäúk@WÁ»¾/ÿë÷îÆ5 Ï##êáù@¹‡ŽRƒ;ÇË6ÈV|¶å9{<)¼ç QU+ó؉¬@"9ãå·¾9Ì-–†Æ¬»î³ØŽÈ³¼…„e†t Y.ž±áWËÔÀ;žš¹„PfÙWÐBNûŠX÷a|nÓd5ÕR©¡Ûo÷¿]fǧ_$¿å0[^ž‚IpƒVzrEÄsÜó^Á¤ÑÏJó„½Ë®Ïô—qŠž€3«Çþt¿ipôøɼïÆ/ÑøµÑ7d™§©M’°{<1†/ß{€"Ãg'”Dnnë«J0 VkÜ„},j6ä²6”ª ’nå'Ž`gâ[ö +õ Ò””d³3þˆA*ú<ì;»ãçëȈÏÞr‘U¦Ξƒ ¸R64yEIÝ#ب[@“4ÂS»Ð¯«±÷è(pÖg/ä/ÄX»ÐÖ@­Å»b¾äcŠÅIî n¿¿„îçç3Ã"çU=^ó»\XºwV¯”¡ûB:Ï‘ +[—ÒØ$ ´zEø}:µ`s(éHô‚Å+X—³÷¶*5Â^ÁmøÆÊ$¶ïÉéGH +>êò:Û†ç-àñwN‰ +3“7º]Ç }"}xt¿-i7Ÿè¹½‚• +üƉ¾ÏÑüІž@S&_#‰= ]Œ% ešPŠ†¼RŽ”oQÈJt{¸œñàº0ê8&ò½A"zXXª‰„^i$º@õÁh0škm}…“u­@îK/²OÊ\®zOóu#«"ùÈR.¯AÇ„ŠòÙôÐJ©4I°muþ`*?섨0­V2×~„/ŽZ.&òÂ×Ñ_ݼÇa)¼<¯l ‹¤ab˜wK¿ð[p…*¿–ªì˜F°_z¡>ôÿ-p¾þmQÌHtðFЇt½® ·Ð[Cr:Îæ'w|…ôSoñ;ÕdȇkM*a1eˆƒS¢ß%!¹J-¢¤tXäÖ’´–šBÎuÞ/ +p‡÷/ó¢nD(0ÂDã ,q®R5Î@¨)µŠ ö|÷ò¤ºÛ\{=÷5¯ãƒ8zB uyÚ£e4O랊u¼z.©2Êqi¼ûTœ°,³Õ¸¼[¡~o$n{Ìq³¦×·1åŠ|…²Ï!§-4`f‘ך¹ïPÛ¹Ui«í!3ÏpN"LnR‰ôAQ“!ÄùðíSÆŽËî1ÕÔ9PƒoHT7-÷dâz7/ÉÐ÷3¯vU~2‰áW3Ýk"XŸ&¾L;Ï´Ö¾s°˜9¿O'`u?‹¶Ôi„ØCBs®Q‘ô±…ñ"¯Ïæ˜L#ÈÝœÿì UüÒ¹ùeŸáS©Ù_§Ó¢ªîÑ _e(ò~ ¾áÚÈÙ¼ßÕt2ƒÄI]Õ× Éuûͺ›WV>{€º^7¬K·ƒ9@3¤uÜq¿¯ØŒM(ÕAfW$ùÑ>Ž¢róÕõ'Üt*®IkÒæ·&„óÎãÔ£yù„2¦§äº VБÇ/êÀp4¹‡èT›ïwnÚuŠêæÔgW«È$&¥é®&tÏ„ZgqÙÇCȇŒ† ßðéårüc­ŽMÔEÇ×çÔkâÓåLÁG1‹^­?z&É ¢2™"«….^R,• ÀÜ ndAU]l$þôº<¤q Já9 [Rèç+œ„$E˜b…†F΂dù#ÕÒéËYûV·"r†Š}cà’³$#QZ0 ãû‡H„f¡ª÷›v«±*øöç9ꞧÇ)$¥!€4%J)Æ«B¡(kèè^«£ Œ¢K"ôŒÖIQ§.¾É°UDBó€â¼HÛHzõV¢’éç5柑&xã>fé.j/O§Î5$8žÔÎÅ òíÊ°¿_ëqv–'´#zÑÚfs +[Õ%:P+t¦*5Gil@ÐvmY‘ ‚œÁ‰~¦S JÖjn5£ë—ðys¬Ø0ÒÉð¹¼tOC»¯‰æ÷­™ÄiÐDX¯ÐåpÖïÆÎl¶TS†ffe2·©iB>²ˆÜKmV3 ·ï¬I‰Àq>ü€~y ±z‘ô&VQ|!æ 쨯tàZ…)"¡ ?ëzÁ4%vïù2<€ºµ—ÊŠ¶ÍìA 6hä挑ÿ>„ŒÔxZÜ5&R'!Ö§•gÜ…«¢ú½s’+ÔCÐ[ØÄx›)½ºo +Ù¿®;ªôŠD™r]9@èšÌˆ“ÖS|æ[Û, ('|f¤~}Ã!Ónëw¦©®n”Š\8ÖgK½Uz:'=*"Ô›%FWHO´­Ú³ÒèÒõÖDÐ_|ÌÎ\ê\Û +qá‚ú a¾ýGŸºî“•e +™âîÑ~)Ü“U‚™$¹ß“ñA=‡C“ü‘:³œW•Pv Æû§hbÖ¼ð»AàlmoÎUÁùË7…¹í \~3È +ÂÏå±äÑs‰TNŸ +Ã<ˆ•9O¶¥fÈËDˆF§‹ÑÉöY廙l›¸·°6¿33ïáð\1ôb° a÷ Á{ó|³m«é*Ê›}½"é?Yš,µÔ¹‹ e§úPh‹ŽŸXEô¸º\©çÜ[ëgøV3C^à ±çSø¥$š ƒÛáÃ:“É»®’´ ð¾ˆïÅ^ƒÑÁ´‹¶ù´ë¬†)à!jáìKøGR~ŽCkCœùŒBΔí!$ÐdÕˆV`¨­\ ©n¿»Gó§æHðnê Úïvœ&ëÌŠ":—íÞÕ^"Æ;bÊz³N¾0UÅÕ–ûÖ1ÃÁ,Ծ㢫|7ßoV};º:Mý³éØc£ôÂà¤=™MhüCÔgaì‘7¨²Âˆ±b®5_¡·¸/ H:L« >r>Õ²"™y£6o„Aù±RQ ¼“_;N\¾L©µá%7¸àÀ‘¾g$µc [ž Ü80›=~Øü.¥T¿†ñ¥™^šW`/ž$8¢%S>ô”æý XÞ$'ñ.ά¡¥„2Éÿoƒã;At«!Äò‚´žÖ&\Åžã™dn£˜kjÓ¥³< -YRç˜oiæUìÚÆ‘ÌY Kî%?ê5TXrz¶ë[È/¨£=gU0‰Ü„€UShW´1ûºzcw™>ÔXê1§†S\»²3Š‘ÎBaʉ@,ŒëÂ?/ßu3u¤ð;…®MXÛ;Í0¾z“ƒE9–T¨ÕÖ[x,ÐÏsô1Æ÷Ìó–Q£×©VNcÌ…ËrÖs,¨ ³“eeµ‚l€N0j—;î~÷–ê2›ZoºäÆ JR¸¬ Ý.nìÿ¦ÏR(šF½qqIéì{7¸–lƒ%Jåíi6.’±ñNJ„µ­~d¢Jă÷^Oß«Ñ É s!¨kgw%¼¤ó_†©ë +??zÜ…¤Ÿ'PìE¶e6¹-Vƒú£ò>áÂPe†–½Í•Gèf5©{AuÔ¦JÑø^V¡ÌP +:Ù‰4GÌCe*Z­:?ß"íÖŠS$`ë¾*~=QîFf†£¾d5 ?Užaú9v¢÷"“T!KÈ õð;[ùÛCµÛ²Ñä$|É•ÿ#]±·,ÄgåÂc>t- ƒôÏ/c!Ö’&,î—AØ$l‹ˆ4`¿Ì™é„G ‘9h{±I K­àôáî·3ÂF£Ýйô±Peûw + 8ø=ÇC¦ñÙ"ê®ÒL¨ì:0%»¸vÕ´HƒŒ?˜ø¾âù¢õ3™VF _?Òí)Û÷³qoTŒ²>ô£‚ùvî[±~á+Ó ñ¢øøhÂ…ª>çV©Ã{‰iÜÁɾ,ÓPhF°1J4‘÷Ò.’×l"üˆæ ¿D9TäÝ!°hjky~ÒHTòövd@X|A¼ —Õò/²áxxûfÙ z¸|ÁV§Om×¾SD*gi[‹4i p¯—ðƒ½ÐØv )ilPcΙŒ€~9¤Í^-P>½•Sø¢ªÖ_Ñ:v}¼ú‰ ø9#}hçp‘à;‡¾¢~¶&í@»Âªž$ûòYéØsE6ýPÈ¿Dpñˆò϶J úy·#“Ø'PG ‡ãŒY9ÇçzÖïIE ç©_¿+Pììk.Âî+çpnT+ ±µÇ1*#Xd4-.¹.f(܌̠n{Sš©|ãPtw90¿Ì§­ã=tÜr•xÿ’Yñ©Õa…@.i¾™?#E¬4*872lºGÝ›ü”òóÕƒ¹óšAúa§¢+lµh ›¹cÿ[ÅU‚·_Q'ï–íMÇ7&U6æØ‹{tÍ3_ŸÔ_óerˆ$q¿E½â>$zr,¾.ÄBËëDÒ‰ú@û‡ÍDü”Ä­wPL+w1xàKDTjã_žKU÷‡Š¿÷ðN€úè±=©C; ]‹‰ØÑ\z©r¸úÕ~ÈK*¼Æf:²}䥳ý]°¤Bu›B<+2¦ø¥Ø×Iÿ§½²¿S©ôûü¨·zM­<ƒïˆn1•ùu›Ó÷^Vú#:.æ?¿yÙž®ïµá§ðƒ£|`q^ Iš©åâ:kÓãZFMd§Í‡ˆ¨><…÷Å4I)'16TØ͆Nß°`‹ð` [€r óz‡ÅÜl8±§ ’¹Ll[@Æh_ëí; Hk¢ÉjLÁf'‘Ö%З&så@µTýb[Ojöß 0®šm-Z‡µ<"ÂVç­wSp#H¸Í°ÿ,3L\g*±Ý¾–Ýçpg¡’^uІªH%a€ÃuQlàÎZK‡B£vHÕqe·lAW`¬úÑ–îxüFÁŽ¸“Õ7º¼Î IhB($y{³ÓËòMSô~¥ã # Z|Ѻ6Æ×c>ÁB’Y”ï‚*¤ÓµEkèið„ûܲ²ê6ë#¥ÊxNÛµqqŠ®k%:ЂÃÏý0{Â4Û¤8¿ŸJØTá‡ð~UâjçµDg,Vå|ÌÙ)îmÛ ÁÎ n$;ùâßÎWûË)6{ô2÷Å1§ßÿ2_Q.4ÓZxWG)ûqŠ·óGŠõ{RÜh¯ºÎW¦ãrzÞõÈÐKËDä]Üw¹Qöº¯G…\å# n—ë{aæÆŸð»Â¯U"¨k;`aEw}øŽ¦¢´Äætf µŒu &ßéæsÜk¶Qk¥pxNšnL’v’Ô(|)²FðcˆÇY£0c…‚Ø0cX{Ò}hƒ¸eÐúƒKŸ:†ohÁhdYÔ}îw¼Vj¾]½¹cû¦wní†PžQY@V)[7ôU5:Ò³ûÑ 7k"%W¥v3<ú[j¬ån–E¿kƒœm»ŠìŸ×—´[™Ý%I¤@DZrbÑll¯azQ?ÍüŽÂævFúµg. P³e†¼x€ÉôHý‚€#j(hôÄEÕÑ7z,œB-»§óÎ…5E«›}~i›“;e€b9i«À9úHðêùÚ§7~ Êã>OöᙯµÒ+7¿Ë„8Xu@HáÐG§6¤'Q{—ªß/R2§o´D^ÒEœ (¸ü,¯TcÏ©ÆìȽã‚Z]iÚXçKâ Ó«¦ŒÜ„Y¼ý}ÉkwïPï <{.ÏÓ™O .õÔ‚Äñ|Ÿoh£‹êÙÕ†4ü&Æ ÊÌŸ¢RÚ±¡™Hõš‰ wó½é2)B­…‹·†ª"Ú7cHЭŽ8º̧\tøºlg%Ijð«]R˼a\nÝ8†÷¿ú³à!V#RÎ96áw¥1K©DŠŒ?VäÃÍBD\w.UȇH·:Êæ·7Ä­‰ö‘gBrny)A½Á4k1H´?ëÉà$œNŲ!ÉZS†^0yVÖldlƒËä~~;Þ¿g;¡Ð\ÚaæôK¾L‚ùõÛÛ“½O’l»,© ¿™[§ +¢ðBîBZYø ¡QÚ÷¥Ä:_}ÒbeÚ*r³9ò”¯Ô¿åÏ{ݘéËáªÝ]1÷WšeÂ…5âo#”‰Nb… ¨ô>¶ïÓAÎì·¼žíÉzàá]M¸Q»„)ˆ'°&má"²‡8øg+Gž‹-¯ðJÁÙ¶(!‚d%šò÷F¨é’‹Íü0ÓK^žŒð §.Úf9Õºi"‚Bœ‘תÂh‚0æ£Þ·/Dž¿V™¹6j©Û̇‡o— +_0ß9ø™Ü®Á³@3&i ¯)BBD‚Òr8ª¯sÿ’¶þø¶6ù5EåÇÁ‡›3§ŸÒûišI©R«‹ª]S¯Ðeÿzý!KþãÑÑÛ7çÙ96@:áO´ˆE(Q`¡W¡ÐêgÉCIචœ7·@ªÁ×N~ðOÎÏL ÔšîÑ„6t>æ€ñtFt&QòŒõk©ú¡Ì: ZBw˜0.•Ö +X˜DöBà矉uƒRá±êëŒãù³"‹‡»½øS,VëUgÈÓÑ×Hë‡ Ö•Ø®ôh3ßõ½@gYa°«¯ÃK}\)ÚÖ„èoô}7dÔ{Â+ä’רþ‘ǟúiæpC8[bk%u‘I0: ]¯úíŽI*]¬NꌕԲî<'âÌ€Dq¥1öYßþù4ˆù;4Ù´Ô˜¥^ðžöE›:ãZ”¢‡ÖãßhSÁÒ"”‘æeGq ¿¸ú‚Ò®ˆ÷ñ"‰v=}ç¾ÌÅ%ű;>RÕw´ºÊuú)DãPèñåVÂ-{ i¢87£rC ~zIu(a=/åÓ`éÇ +`JVæ€ÝM?Ë-*\šFì\q¬w÷4³Ç"Ây'LÜi æI²úвTxÝCxEåÇ7#Í=䬯šÐ]ÏÂ)9™šj^wpŸiuØ•°I/9c½šÙ;ˆ†YÂV%íÇ’:ðgEFÙÒ·O(–qS”•=ŽM.A¥ó¾5Æ·ôŸ·¸PF×/ *ÝXåï·Dê,oö°`ÐO„&ÄÓú1¢ç)ã”au§4‚x­¦"ô£šVKnþ?af¿½ðÒâº-©Þ(äM×4jý€‘âª[ Âx06Ä–3± ÊbV®gG¬$¨ˆX”£þÙ]0ML]B@! !k“ö'9iH„%7ØdÇýý³ê«VÂiH€ð‹Lêõº «§ÜTÉMÓ´1=1TäöÅ¢ÕæûH&LÏ5« "ŒúÞ¶jªÏa1¾5e‘ׯŠ9³dfƒC|—fS}½Á¢^3²Ry€!©ìcÊ^Ù±•CyÞ>æäŸGY›µöLˆ²Í+ðüw…¯‰‡›]E™†ÏIœº#½Á”“W¿ig/€¶0@hçnlÊäª5Áç®ýF6PI¥pKˆÈKUëqßoÁÎJôƒED=§É*óS½PlBø±a` +^ñ2Ý9á4GÌMdHä:a,h&y að;!Ù$õÖaÖ8|Z2ÃdÞ‹J‰Óc—…6‘Ñ}Äu"åÈÄ7)õ)ÚÞ”L#mõ0n—Ü^žÇl¡~c[øïz¡AèÖЕ–êÍ™qùÐEm)PF½÷¢xŠÔ–ŒisØ€ç³D6 &œ<ÝÍYï’Úl¥ç¬œs·ÚCò£ypKWFsš£jƒ“ÃÉs ÈÚË~ +¸š4?æ·q|CÇÂ[9ËÞnÑŽ¯U…”kCWvܾOøHB ÔfGpÊñ¦Ú™uw"£Û¬‘M+<ÂREÍœËâ`Ôщ) SßêÓk3—ÌŒÊy‰m:ãs‚êf“Bܲþà ĨÙþ†¨4ÃJ´§ ¹=µ¬l%Ž»Wa*ÂÎK6#º=\{œ˜{áÒBz[òaey}1i%œ1ˆpÊeDNi±`à6^¥ +“V-Á …ê©>Zw>î^’:ðëÖ£,AÎó=a¼PP?N}“­8s3zxC4-áÙ'Ð@¢¯Äa0½ÌåŠ&vù& Ê«¹jÐ-OB;ó¹bîAl/­äÝÈ»÷ #o«²#yÁ?.¶Üè© ®Ï² +sf"7íȘ'z½½Aܬù;˜-Ø„º5½ŸPoö’RnÃã—§cÄ­d>­Õ‚ëmOévXš}Ý…["äC»Îµš Ú·ñfº ?jÊ…Šs$!ϧmAb÷yg‘Õ3–ã¾ú©Ÿ™ì‰YÊIÚÓjû[«Òaî ë—e·Ù{/ûÀjÂé‰õÙÊZXÀüì˜à äa.ð–Ïæ\àß›¶üؼ¾~ ê¶Éþ¶ü5öZ š‘X’oJQ˜iOÎãÅ[=Z)é!³»&ç–ÃîIëBå\Ý;»"B7›§ c)Œ—†Þa%ó‡ŸTÚÅLn_´´i·‘c•udg/U†Å=7 +BÎA>ȨÅt»î„ÞñMt7¡Š:»ùœ=2>ï((Ÿ!{GÅo’8DiåGÍlœ ÊãVÍÒUŒÖº‘jÜ”Õíë +ÞÐõ)δ¨ŠP=¥ŠúçÇ ºÚiÓNRŠÓ€„™m:ô¹¾@1??¡– ­”x!MÕT•ÛŸAsË•-&I˜·ö@ãݪƒêE!F_Õç5²î´ÛT² «ô±.è-ó°{m”´YÐßžëÈC&ÐöºoÕ¬ìêW5iø·Š ¹Ž–ðûï~dÏFœöN{uÍUg¿a`BFtCÙ¾VØ-¯Vâe*ï@ì @uòQµ ä8L°4§2Ir©¶Ð“†¤o§¿Ù §¥ëÁIÆtPÕ'ÆiÎâsëŽÉÇTЃF`Þ™0Úu­5hJ»½ Ù‡,KíÜкÔP¡f|éO7§Hf|dÑr^kç Žß¼¥'@>¢íð@‘…„—Ä”ÄÄJÄÞ¿Ý>3„Œµ¬èZˆ›Ù¡R^XÚ9ÈÍjÕy0”Nš¯s„gA‚îWˆ™[Uú £™2õÞzבl‡KØ6`ñ +î†Å×°æËùß'™+¹O?àªH‡q@…ÑQœÙ–l.vk -3Ô+¸Gç Q@CX <¢â*î>Ö‰?7ëÝSY±ƒ°±÷a~ü¨=j ºíd„¾‚þÔ‘"Ød±ÊUU;•ÞÆrÝJéŒ$AøZ©uëÎñ³‰W´Bšgûû±wæp'Øbû5莵Ë#—½ë ¿É¥M!¹q¼V@«ßÂ=¼8жœÃñ!r1†À`^6]ÈÊü«o†c\'7 V;:šb˜€™Sì +…eȤ½øÛ ]Ûq};—¼¿ý%W[J¨÷¡¼–Þè aÁþ[Ò-@^ŸFðGH¿ ìÏÈÜ°<·eÕ@wô¨‰Îy«(‘«xd;{”«‰U¸otÁªDÕL +˜ªˆÍ|Îóp—aÜ^§9Lî÷‹¥¨`=1OþLˆq‡p–*ÃsqÇwŸÚOuØÝã-ôõ•)D©Û¹(ÕDIÅ,$¬ßÌ÷!›xŠt¾+’V‚Zä\õ‰ØÑk‡¥ vÜå# âiÑò2œK³ÈÖ–ª·K ?žfÁ_ ž`á—À§,‡h@cÄÏÙ›‰„œ#¦å[àŒ‘æÈÝŒ‘IágWà^2/Œýäoö9œóê¹ÜüŒða yƒ?wR"”S;¦ÇG^ˆø3ðÙ»¥%3œj˺Ø&B–#vàXÂÃÇpçŽ7†.arï«ö •íWÓ~ j¤gb‹]ª6ɵvô±A` Û·ŽîB s8<«ò齓O`«ç( &»Rð¼ÕSÐó–=Ãê‘1ßì¼Û#ûžB6&L`¦­k7èT™7„,uxæ}ëåÊ{!,¯&šª‚i»FB6˜3=…ÎÀùÞþì…æe£Qµ5'ØŒ™Þ+ò@3îàœ•öÝÔÙÏ£’â»Ûö_:`n?ãô`}ò4 T躉l¶}™=aC,I‚#«&‘Ü÷Ó_rlïyÅ–$S—‡—8•í–æ æý©ŠV7Wo¿ßγœ'“éžÁ©Z [ÆN«éaîÓó'¨5ˆé´ìiU÷ç+3=;– ov –ç 8\ õäñ›V†Ã4¼@jãÖ)ãì±Ü>ÒíªO+^xN¼s—]Ž»(¿ïi¥™¡ì §±,¡ÝèAÒãÍúŸŽVjóºb,ÇnåCæWä¾E ±k‘ +^ú”ãh@RÄfíÁ•6—U +×qóp&+yPå°1¦àÙÂ¥å Xˆ|¿ð$6Uç»’ÄŽ¸%¼ûm'v»!†æ^™íç Åä.°¥6q2Œ\õº«CÛ7E.ÄÔ—¨lwBÂæ8=÷_so09Fµtéf²ÅoÊRaáÜJýèb;†xŸ)ォG œþW¤ÈùQw¤ØØV„K˜7µºy$•o5MåÐà,=²æ_³4¥ñ3ž•÷°Ÿ +áB«¦¨Û$EZk°`ë¥Y 5qÁ[œù¥ëÂF… :ÁƒN„´®jîܨ€›JV[‘ +ü™±8Ébº¢¾9àѲœ&Â&9 h°¼§!`Z„ù“½M$¨'Ì é·Ç ˆ‰b|ö]·[EÍ\çtHL”.=MSeî{F"ä(ËfIÜ +ˆ4ƬÆx»ák&ªˆü• “KѡڪƎ5soõUKæU6Û‹m™³Ó<{WûFgsü2‘“+tëÑɇ¡ˆ§Ç—–Fë¹mù¨ö9¥ûŒí¬ ( Q«¿˜?©Fߧ$‹OÌr?ãZJŠM¿{m9ùœÄ1+É°‡!¨Ú‚§¨næòY:ŸAÈ‹Wv¿ ˜iq“~ˆRŠ:²«ª j½¤©Gc„ËZÐètúœùyF6¾K*Û[HzÒ§ib·I þhŠÕ‘¿tîÈøhbþàáDëÊ0Žñ/—Í• W L|õ)ä™Ê~¸Ã$|hæ¼)½ü'CZHsöfW^È¡µ „u™§™êÄð‰¼—9*ÙËŒÝÏO´Oý bDòÎ7Ž¶³B ­DÖD3]‰xécFb\“4“ï› O`É@®0{”X«V%Üq7j·6Ç„ŒìÏõ¼Âør¶µ¦§@Üt,«"2ðÏǹ.Š­Ý§ã7‹ø£¯šr°>C;–wD72Ð AvIlU&m¡•˜E4Ù(`ý[wZQ3‡Ùµoœ'é†zDŒdØ'ü#mø Ͻç[Ü#ñ™‰.i¡®îñϲzåª}:K-òÐm(¤²“™º>ÍÝ0«l7á¯r†Ûì%óÙSï)?ú±ãR™Â—wv“iQ— øð`gcÜabO©_7d@ Óq¿" ™%qtÍGJ߃Ù56榑û¶5ù|[!Ä”L{ü÷ß_é$£½—zø[HŠëNκü-ÅÉEn4«Ržú˜‹¨ç£”v”bRŒiº& åõ8æz Ü®ºˆA¨.Ó}:pc“%„9¶³C@Ã×vt|jâ0òFóðÛqò¨|jùŠƒÊá~·l–‡kàVÞ5-¯$Ý3ð`z—º¨Ùû…>F½IÜÝJ² ? =q/ ØîAÏb“~Xc„\9+&•óEµ‡w)³SOS>}Sl´;#5(î=:·qøO\ᦦDø3ÖF@rTôÙoÈ'É@'áÛ¨9o;=Ò«M!±ë{2‡JÕöhU5ŒGÊÇÅúÔr–Ùèjšíê–uÀ@Ætáóå•­qW3gPÚž‘õ§/-‰Óî¨~%ŒŽòû‘„¿Fãk Óü§:(™aÿýœßL +íqÃoØ8\"ÉÄø‰m~'8 £Éùª¤\"~Ķº…puX‚8R±·ù;¤‡,qÞ\;1´L AÈ›œ>lϴʘƒš¶ü¸\UÆækèK¬ôó(29÷ðJ3ôûõrï˜O²âåMçÑñBu”蓼!þ*²‰ñØx“–ãfðÔƒªáFb6ä([N£+þe÷#Ìó,+CðÇUÓ3Mcf‘ÐAñn0Ja¸Þ.H”#ÓJ>U³ÂåbFµîV?4™;> +Û Ì_÷cvDMÄȺ„‘)˜3,fÅ·„@sž?X³¡˜ò\ªå$@Š$ÈW;ö=W!za(NGv È(èᇓÃY†CõdQ1”On?S9Ç>Oµ +dõ›#. +óÕu«ðaxÍ'¢T´Æ49¿} +„¹ƒ°yeàêÙÔSYãæœjî×]…)Å’ÀY¡vSWòÀ­¢ÒGÕîUê£ ãþh4× ¯DTÚè¢Ë ¾ŠŒ}dœœ'.ßñ»c)sùÂ4E©”€cr'L’q!2XdêFÒ±!NMi€âñ¢ÂdÖ |H—^ÉuÞõ“ù¦?aÈísNfBèÈ(û;Ÿ>§[Q-„- ï$àKor§ËûI’;G¸],˜úJâAžXÚ€àvÞ9g•0žh}[ü £Å‹—T€%/WHþî×Dªÿ~Å!¬„ŒµWJQ;dZUüÁˆo 7êU ‰iT†dGà!y×"?αLÛuº·Ô~¡šŒ{U#[Ö÷g_SÚ®s·ßñs=„Ñý}Ž´þ^W@ƒ¨IÙ9¼£ýè@‡}Ó$0_>)’¤Èz®Ep,—ðóõ覲üˆì£å"è`06déðµÃ•GѶ`DÅÄÑrß‹èGÃõ¶F´(øLIÓÓ2¨ÄhŒÑ¢syçw-[ý $SŠQévÂÙG0p•|õL ŸûŒM:2ßx¶åÊ®I÷ëžvH…¶ß]„,U5‰eÅæ°LX*º{Œ+—LÊjŸO}«nU²9¸ç\wýÓ/~cÝS4ƒRꩱT.&êò³Í66USQ–‘*·R°l"È÷è;/Z÷«ÁB5OmùǤA– +ÈïQš4Zl’€AÍMNÒ1B.NèL·YÏ¥£ÌÊ©“0d›±)š„¢«ëOØF'Í<I('Ó.DÁ=Œ”³‡pEd­ùØøõmQÜÛÓJ:ëÔs††¥[H3h™7Â6uaÂÈ4UgÊh {V†k|–¶ žd£å4A:kY’(‰®rŒ“JY55b¢L ï¾íV·œ2kÙzÙÛÌ9éúŒðlâÞõa÷xSkðJ–†µä{Út´çŽ[9¦3ñÇk4OÂK8­Ÿçå Û°¨oS3æÈàQÌà~i–¯³•úc"uË-ëe0¶Áÿ6µ¡ÉÞ†ÚÄÜøÊUƒÆï¼à쌪2ئ„T(™˜ž‚è ¡)ÙqìÔn»Fñ±Aò¼Œ +~z#ë6 å˜Mmné©^«ŠÒŽ†y§×ù{?¤¾ó ÃN[„!H-Èâ–‘Ôyúê³Ból«nsªYòU4Mö¤ ©0lÕÜ´~µÇê½æ`¾ü™ñd™ÿÍ%ºŒ(„ïñÃpY0çh^zÑl™dɄ˱½ú¸çðG0Q'[9R3…m4cA¸Ôá÷¹öîY+x‡}Ê)¹ÕV¹„çþìm‚›sÞi +chô„, 3 ‹ ï‘“#•ÃùG ÖÑŠ9$5à »l|ëQλM}ž¥’>‚ÈÔ!¦}™n¿°B=…_½' qŠ=ò¼²D½JQ:|4ù "V&71¢‡»Ê´XGŽÌ˜Û6¸XÉLjðD^«Pìˆ,0ª°>«ÇŒzK „Uê• Á;ð# zJí™ÛG ÃLtåk ­' , 2ýòô™ÏªÍÑk|Õ[~>'}A–ž­h¦M$™O¤{É™™aý|Fo¾á¦›\basmç­‚‹ÝjM߃½€—RÚ·Ž¤`W 5YC¶]Þœ}ËA… IñFÝi„—¤>4Å1 <ÏÜïQ»ÔäJ!¼@ïµ/g”ÆL…˦Xx2¹Z‰—L¤xó¨jZ‹¿•…< ËÍ(癵uèKvÝ%' ¹ä†¡&$XôÕÝevþŒÂ…--kZ"»À¤Kõ.C!5—ÔÖ² NɆ ÅŸ;DrR,çÖ‚ŒQŸ¥Hâ-A(wYœÐ% + ±(ø'E5 Í0Á{'­WÈÐÐlûù 4·Oÿæþk¨ÕÏÙ€œ“æ¬)Tlý¼SM¢ÌºtÙö:ʇOI[|¹,™á +¸} ³i¼<nU·ƒÊ'D†7Òz;%s}S°l<•’y°46Ê–TZ¹eÛ]DÕ\Y¹ñ}˜en|(xèn)<¸ËŒ¢G/Çê‚«þf$'„ƒ":èuë ìðx/’<€Â?‰CòSÁ064qcZŒz¸ÙÝü\! ;‰^ ¼·'PZÖ‰EvdŒ¢bòjGYþ=Ñh/«¹È´®ŸË $8éÈ'kê¼²à +%gsðùB§*÷Ä•TÝþô¶VÔ½~Þgÿ°s-Ãê¾ù¤‡I3ôÀâʨbŠÅ4ZŨǾdzçÏ—à Áç‰÷ø׳ŠX]"ïe‰¥?ÂÛjš…<®ÛsÒfÔAgV+¢ÔŸ8ýdÚ¥_ÜÌl:ɶ™q +L! … a¥,C-CŒ}M¾~šÞƒÔCzâë—ò '|;¦DÜ‹ Ž‹¼”ýû·NsŠŠô c‹Ð9T#qY%%ËGð 0Ù¥*÷f’® +.³ã׋ÏLH]DÒ.½Å¦œÈçûNcxï*ÿÍRŒõjHGmwr$Æ›~üzXÉõ½c7G9±fRpÂÔ›õñ`ç¾/ŽFöøÍ¡Sësöe‘Ä¡ûůjrv±K ±‚º‹—li¬@b Á̧òÓµ¬FÁ§”L¡s¾´_úm\9G›8+¥£XmK‰^γ³æ&„m©œtðÞì]ª_l„Š@O3º] q—ÃX;Ü3œåá› +kƒãåxÄüÁ‡¹C ¥"QPf¦CY_vŠÓÑô|‚ŸŽîdœîÃ: eФÛw‘éûe« VÑê–†P-o‰ ã¶*‚½—€:GçMøŸ¥ÀOr¿/CîlMk[6qÉŠP·eÙ0ÿ¸•Ëzý?TRÈõó·—Ï(ªå8“j$27BjߺÌèÖ–õ¦òãȹÿäâÌ-:N ^TüÚO`bŒvï ×o(<>yýeþðHó‚Tƒƒ2¸¹ÁíåÞ(å2Çæ¬9½³g¦F³Ù å’Ë?q…ÃNßJšPZØcš¹ÔiΑ88›ï…wäD&oô\<朕çÞ‡.'cve‰kÎþšØuôI¡]Èš‡þý+‡¨§Ä ~¸db D:{‹ÛÖq •¢j+˜ZÖ+·?ÜT±æ­ºŸÀÜÀ! +û:%é5¾¯åV¾çu™J°5Jòb´â"2jþä³àí=j¹ òüÅÍ·½OÖ±¼×Ñi¥Réqødoeל}½j(áIaRFT¼‡{°˜Të‰n°‹W÷'½y@,}H5»A¬8ÑLØÑ]ƒ5ævYÛÐD"ßïŽÊDʺ°z¡Ž »z}ð…ˆÇÄ_@ïO>s0<#gr¹ñ´»f!bºÛèÊ5ƒ¢Ã–x¦ÐJÚ./°A>x»! jm–²sÞ7vÁßC}AœíÁ÷}Žn4XìÅVÄés¡%›†¹¢{Pû< ´éÔ Ì7¹d±·ÝÖ.´?²s1‹t¯}¼;¯±Ý½’×Gû»{UÔ.!ó!T-ºž¸9Çݯ~_’*gûkèŽvª»¦$û¦ÝU‰ô¥5Sü¼‘i÷I´Ï(Ô_:$³^‹â»Ù…eÑ\ ¯eÈk#Ü¡ðï…Š íw¿ÆÚæ'È­ÏòãJk-Yc¿ö3A2ûW´ìßßUøäë/5^]ïèø×¢ òÁoÀ&ÇÀÍ/úŸNÜ&ÞÞè\:?Fîö…)«pÈ:RªB¹TŠP¶×ÒªA +¨ïÃÌ'l¿:¦ðè;{3¦Íäeµ—Ä;»¯McÕÒÚ-ÿXON´Â½²ùr0‘õC€ƒºÆ…L9ꉱSWËñÛÖþN2¼‹ÆvÃñ’ýÐ È*ö{ä•k^‡jogÊ"oØÊglÂóIüPÚ}tq(½Ÿ +QCm6õv;1w²ª‡Hk_Êx½xµ™\Q\5“`b?ÛÓE„ÝH¦æX­Ž…äš»^ÁqL]ÙPºÀ³A‚ä£h]hò(0ã»d68ýÀëÓQ/eÃ`Ü›i0ÐñXV£ξ0žzGïZUOdCZ4[J)é?°µDäé*}ï uÒÌ{QýÜÕ‚äÕ_x® +Ê’¸È˜”m€¿™»_–pÛD‹KÅ|iVWeeÀÀ«‰ „lÐÁôÿê4èT0Éëë]Ïd‹;PL¹£¥e!D*%)f­­Ð¾ì {ÄùíÐîòsÃÕ|0ŠLï-ûÈØÀªY‚èZ`ä<Üu´N!ìÆÂçaæ¨ÞôIJE OÕFÚØÙ‚™O¥ì鲟‹„œ*+aB5*êëˆYš0MŽŒ£>ÂãðSΚb¤³(=nìj‘·æÑ4W­ÁÂ-ÕÏ·­_ѱîíô‡Çº™·` î%âg›«ïW‘iІJmøª º¢Ô††ß‘$1½ÑØ“](snr…„L¹Rœ±¹UbµVfn3]ú‘ÛÀáˆÿ3È9ÆTÄk›“¯Bšž«µW¯ôoäˆ9u“lܲ‡vxvèô3Õ ÖÞlQ;, ÿ®w½ß,Öf9z ïï‹?ŽJ¬äl* +pË(ÑMÁ™ž eF×gº‡@‰<·5ð˜MêÍ jmòÏ °ñksŒ]VY:zÅPÆ]•a£¿u_d„‰ê`”]&6ú‚–2#³ëb…S–ä|_'UBÉ9ÇØÔ*+‹©´ËY[–µ²zŽ’w +Áë±(`°1BøÍéÑ÷kL»;B„/ˆ,à  G70“›(Y:¥ö +ùµi¸ŸÔ§îwX\Ÿy=rû„7"¬ˆiÝe6ÕÈý`Cõì¥oØ?g`ÍF朌‹ÀH‹†ò×ÓÕÏ‘`ñ» ‚ƒT~65Î.96,`³xõµôlë Ä\θ;&¦!kÇ×å ÆæÁJôV>ÓÛnQ3­‹c…8¤„½aGãÐ$îÉ(»çf†A*"CÛï}„:¾¹ Ìl{‹7nN^ÐÊ`„påƒå˘ÌV—Ûyþ2>÷{Ή =½"ž;ôl`¦GS=)ÅhhR:ê bÞ°ã}µ;íYÏHey~aN'¡¦o¦NQ»ð%`\ô?G°2™9×Á>ìSŠ¬7…¾»Ù6ò_qÛ§ÍȒΊŽ¤¦vغä.Ù#*Íõ¹²G-–à°Ã~3º½øÕNôdàÐH¬|ò€Ò>I6]ñs˜öüåÛ{ñ7cÌ a8d?‡ÉNV¦æWíûê^ÙŸ\W’é†;ˆwÒ`–v0zA…füA©‰õ§$=›Ò¥˜ÖÒGVöašMŒs*(±Ó8üì¹äô¶^d•àŒ1÷·»s®ÛCºDdq +I¢BŸîÙ¿¿²ÊXãÞLbÁcÔÅã‡Î0¸±hÿŸvæû +‡ðgl2²¹¯u¶¯}gï™™³;dsvÉÙãlBvg”y8;âì…²et)Þ?âýíý¼Ïð„Û!O:hÛDr@Q9Ul:Ø«Táa¯a ..4EÿBÜÖÑôŽŒn†éü +ïÔ2AÆìöâ©eîÛ›Ó¦;»ŠÞ¹‘°!¸„è`Ò]åU-YñÌëŸò¬ùM5ÁF³·&RGßw´+ùûè8šŒÁÈfïyFW OU£wÀº$¾¿@i¼ù9ºùr¹>ÒHÝÂö§õÆe¢Íw{˜¡Ù +,ùÌçÖ6ºþ‘ß‘—§ìä*ƒšA>SxÏå’ò§Oœ•Ãøjäwcâ]o¸‡´×ç?e•é%Iôm ßÞl)·œ?Þ4‹™æI¿´—.¦Äì Ê×AÖŒqh}Ä_J¬Qêõu‘¦ZX´y7³xÄ,i’¸«^飯\µ1) Ík„ÝÅ TÅ>¹Þðô3¥Ÿ¦õ1!}KGf³[ZdɦÚ^Ýs>¶ì¨¹…ç›ý˜“]û·çÁ ~V\Yƒ°ÕæÆÐ¥–tQrÿ=!ën¡¾5ó -b Ýmº¡ýŽþÒéÚŽëÁMyùAãýX W ÜKî(-ëß)¯Tà‰aß½ŸSñÖ*æHGÚàœ° \>|¢<ý(­³Ä¢­pš6>AÈ?!K•úÜû5wv")]mBßþsËäÖ»y¿ˆ~li¨c~Ÿ…Ýu¿û0Î_·÷§n¸>õã³@IIS¡å 0B}?)4ð“ìó ßùöìä]ϧmÍ|—Ýý2žÌÉuf ‹cHéwia3êêùçIRyïX”v*&äaëR¹r}"f>Kèbœ#òF¾¾R>ô•g*("¸AÄv%§U–ݹ°¾ tðî—´"wXÈD Kaë:¦Rô6½fFä’pìï8%/ÁB×lC«ÓùꉛAØ„‹ƒ™ÐȆpñ½ªWfÂDùtËÏÛƒ'qØV>“žÇëîä"9š#÷cõeŠÞ«øüt7–À“rELåÊ1<¯Z  ¡“gÌ^™7…fÖ¶†Î;xzÍ.—½°õ<µ@|˜¾÷º`ÜG¶ÁàÇ¡ÝQ‘ôÁö¥¿XmQ žh?ÝŠd„Zêภw–_ã÷ëÛ“ÌWsƒÚH ãØ´ðÕHPÎ#razoºÚ·¼§,ýÎ{=M¤LÅ;uD«&RVdz»Qò¿£Ài:ü:a‘Ѽr.<Ó!OÍÁãÏcL­ó*ó@ dbzâ2YÌóŒûäð<îº|¯t$âckÖvzÎÌfPW´ DSÄwÞqŸm¦DC\s+v¨ Ò~b¥æg¢=R8+’(%ÖTúL茜m8ÀjñÕ|"Òr˜ü¯C1Ÿt)u+ ºakPâ&2?Ân6ˆ=Aù¹ä?úZ¨içiõêØÛfÄ·âw|šûÚѲiC©ÔŒ€} +ogÓƒ1GC6E®Í]cdv®l}©µžÆÍE*û‚Xí øVr,À8è–>7%×5/ÔQz 6@^î$Æ +Ìkª¸â§hDlU¼v7X}ñÂúZ%fòb+†Î5ƒ;TÅHÿ$IÀÒR.X/+ùeÌö2¸Õ4•õ…6È(z¡ØîõÉìg,Í¢ÛäZ}~û JmÕg(±èe{u›"&Œ›Å?ci¸èàòÝþªxš» P1¡,›%7Ñ9¶£ÍCN„zD²O•EwŒöÐwAöº”\¼ ¥¶¥&†m—}É·åæ5FèHîñÁmÉæåwæµÃØ_ÁÆuIð*Š_7S§êö®B›¹æÑÜíä4žœ¹?B¸ivèÍÊ¢ûÙ‰Ð=ŠTgÜÍÎh QvUKœRŠ¡ÔÛ³=³·*ŸèÌ »ü ÔÚÕ$dno(Î*ˆÍ¥e[­¨þ¶5ÐÛóÁ2¿±¹™eTFXôÑïŽj_â|§Ç9Ú ÆxŽüP$ßB^àâG:ƒÊÊòÎJ£Iÿ—¢baDѦËvwi¬†¹Ã¥Ë•4{ÓÖÓ/mJûW2S‡êrÚS–V¸&•ˆàúZ(^S'2×ä‹’L3:5¨V}JC9ÜÖË”2Jî(>9c·aïj<Ü(ÎQC…6Ç­ X)sSl„öϲژÑ߬n +i¿5xÑ@>,Ïu> w?tiÓ¶0ûôIÏä#%(ù‰ö +©«ˆ|LO†D¨Å÷¦gîÑå¼Þ8vÉC÷I~®O–ÙÍ>mŒáõÞ¢‰‘}‚ +^hâŒð·¹ œ£“hZ™Í/øÅ_à7œÀ+P¸¸&&êåî$+Nȶp®Ô ~I(–»c¹ÚŸYªÓÅg¶%ø¥p%ö>­’H¾iL¿\ÚõÐß(¦µâ_«8Cƒ—R{‹ +Žµrð¦ëØíû‹0Ê{‡˜ÊQê¸2‰«Zœa‰ƒ†*7Äc¹äJî„I›ÏüìÒ]©æÁ 1=Š¡å©òñS€MX¡¥GMøªéþP¢‹:*½ÙOT9†ÜD¨*ÀzÞÃ*Úž“¬ÿ°Ë_hg +‚œ«ê9ŸjˆŠ"J7Þ®(ðhT(ìâ ª¦¼ÜðÊ™§Ä‹V¬áÝq +oò]ç }£¯9B‘7õ· öœH{È­’ëæi`T&éVÇãs"¹‡‡ªÃßÛçVMo¼iá÷׈â{C„^×;¿_g¿`,·÷þ2 Ún“ R ɫǶ]ÅjÍuib°ƒãÏV!QÏÆ>²¦aO<ö”ñOÁxƒªH²$áófe°§Åû›ê¥úКxÇÑiêÅà>ò$­–Ìy"-Ú-ŵ ôý‰¤Ëq ¸ŠÖˆÕ"™[Ø m¥cA¸¶¹"t8Q+PK¥ìó÷Ñ”¶ëÛãh_“ ®$+ƒº‡¼S¾ÎúÜþµ$áØ™éezv~7EhÅZÞ‚¥ÓªãHÝåûm®Ý‘(ãŸÄ"Þïòwnúê›»ÉÕ”^«¦y$3î3i=+iÿWuÈæÔmâ’<£Ⱥ][±÷QgShSÝ»¤SñºïX±wû@`z>ÍÛòÈëB¶"Æ®.(ñôAàN¥Ã|³w®3¬ín1eqÞ¸XäL%­1;¹MÊ®¦*Åÿ^OìU©‘yo•½§ìRùùÑ© lå™Õº©RéÓåú’ØyšQÝÅêØÌ·XçY2‹†¸Ä¾ŒPñ+«Ö$ßo¼7SæDEÏ–GÙËËGªvË.¼–Õ£ª¾PH^ ÍuòñjzZ+3àÆ´¤Nc<ÃÃe™åGKB.þ/Qü?øŸÜ|Ý]ƒà~.>ÿèß2endstream endobj -925 0 obj << +935 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 33 /LastChar 125 -/Widths 2102 0 R -/BaseFont /XFYNBR+NimbusMonL-Regu -/FontDescriptor 923 0 R +/Widths 2132 0 R +/BaseFont /MYZKVY+NimbusMonL-Regu +/FontDescriptor 933 0 R >> endobj -923 0 obj << +933 0 obj << /Ascent 625 /CapHeight 557 /Descent -147 -/FontName /XFYNBR+NimbusMonL-Regu +/FontName /MYZKVY+NimbusMonL-Regu /ItalicAngle 0 /StemV 41 /XHeight 426 /FontBBox [-12 -237 650 811] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) -/FontFile 924 0 R +/FontFile 934 0 R >> endobj -2102 0 obj +2132 0 obj [600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] endobj -884 0 obj << +894 0 obj << /Length1 1620 /Length2 20127 /Length3 532 -/Length 21036 +/Length 21035 /Filter /FlateDecode >> stream -xÚ¬ºct¤]·.Ûv*I§cul'[£b§bÛ¶mÛ¶­Ží¤cwý¼ï·÷>cŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&ùïòbšŠtÿû½ú/?Å¿úƒTÝí€ÿ?‰†œÉ.þa±sx2°p2X™Ùÿ»¿›Åûÿñ_D,ÿµ–39Z¸´™™™Y¿ÿãó_+ÝÿF#nklgòÏŽQÚšüÝdÿiø6vvtü«í¿Îýߦÿcý¯íºÖWìŒyƒ,Ó2ÓAu¸¹#SbÚ},#Áö¥ªE~5v½¾ia»Ü•µÁŒM3<¿ÛÝ—Ïí?¥iÆúp¬©zS€×ùDÞ4ýè[_;9鎘ôJ‘Ó/4¢:2Ü{ ÝHH— OÉë…ü5ÒÏ!‡Pð‡Z…xUó«Óö”ê&BÏØ>ŸŸÙ‡PvE‘Ŧ—µ‚ÏÕàO͘ƒá†€l¬„ÔÈW"æþx²À £ŽïIx%Q¼Kâ¦No¿­ùWcwúŸò‚ßÄÎ׊ü;L§V‘;fT° £Ö.ãG¶íúÌÓÎõ=®>ÕÎ7èX¬JÌ[ÃZUýùbªÜîA+_®›xF»Íc¨À( ¥ã©ƒv¸\Å$L Ò…õ)_,Ò ¡Ã4ŒR4r-Ø“©¾ˆ3ø‚2Ž‰Œ€$¿ d-ô~“„}¼Dä9&G9?á¬;Ô6®£ÛB‘œ´Xsÿó/w†ßöèWŸ.S?649ú0|‘ßãš@΀ƒëì˜ç3¾>9È%æú!.à—¼Áô/mH‚Þ¹U'g7¬«T¨y㨒Cº4œÖ)7%Š_0iôGàìáä}²›„ ƒåÔ›xêÙÄ6\/ÓÁ¹Ô¢ÑCnoãÐ5-Ûu. ê24|jþb'U//g7~u®›œ÷äkƒÓ—8•†n¤3€j}_R:âàÎ>)[kÛAP++Ïú;iw9¶»¼ª½ ·c¸A{÷¿Y‰ü j¿3à aÉ»ðSr°Ñœ¨t2ýV å -o(:¨Ñ_‚ä¤ñOFuØI)Q’¬¥®‰Í:T\+kÀ2ñ´Ò(ÏË2+­Ô»Ð]é¾çAM¾×Q­?A"tto¯$ÏÊAœÇÛwÎB¼ã¢ü1lþUxq¨eÝÒäöt¼d"$ÀÇŒ‡™M ,tEÃ2g§ö“0ACª•ƒÇ“IyàbLżê|cÔd€&ó­Ðƒ}7ÆÐJVóJfŒ!`/—ö©Ä~iCB2l´–¼â¸¡Å·Û‘ÜÁøÈÆ - )/úh½0HéZ=`|K›@?ôî3Ob¨cËLádÍíìÉQûcz‹þú7¾cèü¹$ Æ>2Í%—¹ß°%F ->@í£dJî'¾T¨WÝ– ’ÆÑë«úþ®@Zl—,P* ï™7o6x©bäÀ×ZëíùOרc ‰^à°HY¹ê¶]¼„qGÝx- $v·úyüJŠÑ‹lüwÝ„ze|5lÇ¢‰Û&^^Y†¯d¤å¸=眫Ø'ZðþžQ.,°#p¯ü°Éøù¨~j‡|i¯ÖÍ_)¢é<-ëqHb_Ò»S3‚4~«Ò/²Jú -ó»kœAUyÑ® D‰ˆ„’"µpVk_í+t·—$ïÒBhtçß’¼`ª-‘C†Èù}îÒôƒ¡OQN¢¾hÉlÙ‚¦X©ÍÉÃÚ-ðÝ󜚮Ӳå‰f]D–„]fp`ÝLWý£ÄÄEäÑOT¢ÿ«0ûž†zܾòïþ׬M -‘ו‡ošDƒŒ ¾”¹yÙÚ<1Þö÷Š3 -9à Ù÷:Å„Ÿ\ÉFlý¹ŽNÁçµ±½F¥1¢{1I#ù#gÐM!Å&Ð!ùf¸¸<:â‘[Ç‚êÞ—dx²UÃü9‰Åm³{¦¨F®Aº/b›ƒÞŸ&ŽiÊù0ÆÊ<É{ –3Á—)t;¾ -I…ÆÄ8á J’«2ðÚÁF–û†t÷+àK‘D:rtËSα£³ÒFX°Y¿ƒw0¢ºãÎo‰Õ"Ú-P¼L>Vš˜ñפ2 Ynîë|CVÞZsZú Ó†x9„ĶU&bNž\@š'üýlNÔÞû1ãWÎèjöE¡¬¨ÿI1©~´Ç)¨¥P#çP&¦B5ãrEò¬é&ÜìPÿgÖ©‘ŽrÏ3ä5ë(h“‹£66q¨ JÄ·­ ï|à·Ë Ç#·û:[‘úìƒîi0žì­ÎÚoœ*3ö8¡|SgrJ_ˆ·¬»TáZ‡%{ÍbË„pøTþÃiK¢`È$Ñò-ž— r38‘nü9jNÒúzzç÷˜ °î¸×ÃÈm‚t ßk–ßnŒ.ƒjÅâGr Ÿ¶~Ýòz^o -g}%ž¿<ÿš¦¢§y>ÕdsŸZˆ—ŸäØt‘ùB<*Cuù­ Xò4RWJY¾?Ôse4¿¦öÁGGøË=1nI6ö>â¶dxøÛzÀÛö§úø÷^`K­™u ÒZ¹$gMÍÍE®Ý§R‰³› |~Π;âIךÚCXFçÔ[ "9Û\(:Ô/œê4Ùè´G÷b^LG9DyÈ‚6ú+ìÖ?óÍv_æÜ@Úz¬ºy4r ²ÕEëæfNfS\ý(„w!Ð+`'èìõö½Ãºk0Ê1pI?ص€ÝK?lÜT›åœ¼lîSè’›šæC`-ëJœª{K'éͺ¯ÊÕ Çƒ„¶õÄ&]_\ãN*Ž²ýÈ˜Í ¶q™â?tâ‹>Ú»ª¿[h]ØÎDi‹Ø?•ƒ] q‚ŒêH¿(OßM Þýa›kP …Ìùj†§lL_Iª3e#9_zÇ…q»¢«¾I¤DKi‹KÂ|Áô-ïì¾æãEP+ëÂû; KOã%; EýkêÂJþþ‰ò{¢M; -%Všy¯Žç½wd`õ\¥Sd˜4¬Å¥øïhj-Ó)¢1Ù¯tê…hE‘¼Æ’§@c]ŒQº,ÃÙPJ±Zõjæ¨u¯žYuÉÔÅ›òÊqzú‘Ÿc¸×µ#Gr<’çâØP|Â~Rq‚a?–Ôà?ÌÕ…¢ò-›ðå&•ZëCnŽ‹¨H鬄™NN~g’±ÜLwgz̹{Q\CÂàkîËãMN®-Ø\ÝmbdDÀ!pŒ,*-eG¾v²M×<Ÿ»)¦Õî°ÚQ ¬Ìô²Åc¬ÇáÓ7/ZÓÀ¥¢–ôæ!ùOInWþþXÞ€8ä„áU„4ƒÜ42ôgYzY,lsûtˈSòî’üZQ”²8 !Êó@¨`úžnLnï¬?'@‰R§³ÓÔcz’jýzçÑGD”ÖlþhkUé.ÁôÅ0…{)ÿûŒ<Ë) ÔCçÆŒ¿v—f6„øzÒ˜êïUì³^¯È€žžs<Œ¨+ (œ× -?>Lîw\_¼__º‚+úˆ—Ï*×5²,Üâ~‡ -ËGBÐ×4$<]q…x\6_ÌI_ϱȸtÓ<< ±ã[ôV(“K—ê£hAÑLÿžƒ«±î«k”“Á™-H¼~„ÈëRtàÆ;ê¬ԧОSŸ«,Ä>x›ºQmMΠà¸ÀöH|’MÇD-2:s»ÁK¾jÍ)yu$–©Ó:ž•([mq!+GŒ™SÞz‚PùÒ†ÞjLñpö«Ys%²Ý¶p¬z.M[›t]Þ§ÀŽKxÀKPų½×ÕêL•ªçLý=à'd{ì-¥?Ö­#†‚­¢E^+#6#– ñ/–“õ­ñ¼ÍTñÖ<ínÀZ‰/”Ú8Y2ÓØ/gÓAÓ›øæ±,dx -v]šÑØ}a(ôÉ:eÝX!±«AÏ[–Ž×ÊÜ’ÀæƹƣÞ3a‘^£ãxR°šË\ì2ª<2€ÿŒÍmxÕîQžæ‘QáE‚žÈ¿¼=±HF,ÃØðªÊжÌ>Èü]¼¾Ø¨ÍqZ\Q0³“×-|/SS´æ;ª? [B«˜jÜë&BØ’ÆIRòu“$€„ƒƒj°i&ÝY³$——½å£-B’ -ç¨÷i ¼%0¸)xëõdïIG•&Ž¿œÃtɳ6†ž7|¸.&õ - -ΈŸçf™ÕÈPMC°3p§î¸eÚìq²áBÞæh‡~ò¨,þ¶¢Æ®¹ÿã -¥;Kƒ{jPÌCÛf¯¨“Ø£_:©Ãb*¬Ž–Ôº°AïhµûÞÈq‚F΃a¹¦Ô9›X´Öò€)t‘ÚQPAng©§âÏíÿ4»š†ü˜©>¹I¡Îúîá”JO¼AÌ°#­úEñÛÅŽÉ<æT»;×ý.Fíô«déÝj¸bÙ«k“ú§V«,þ|D—æ‘,4‡Ûj·vÝ–²ºyAñ—‘ùþP´›ç€8îf3A|æž{a­ --5ù\;³½2>V®±*T# +sê«®0V—0p ÒÀPô4¹7®“Þ¾Ê܃#›}Là®Ižß˜ä•¾9h_ê3ú 76¤Z&!‡Ÿ†‰Y‚Aý±Â;¥§!ûÅóë\š[S±eG»tö™€JË ¾qWp‡þ¬ÎˆN7ÝId¸1c[9H©èMu„hžä?ø³Ùo°‡T2­„Œåm¬ÔæZ5·}Oîͺ!bîÛÉ$<~éø::¥½½ž„2Ž €O1W© -@0‡cz´ëðcL"¸¶©ˆ1tQ mhž7OyÙK/=mŽ1Ü´iüŒÇŠ··ôŒÄŒ%¥”v= \lB­×9Ɔ½‰ü‘“WŽÄõÝ©s;Ú¾†øðýa_ 7,Z±jg[À6¾bV¤ÊY—qá=›TLÀTæù4¸©ŒZä¹xæÇ©D S7Aof„ûoŽ¦¹¶†d¬Å(?# Í”¡4÷Ú7©¯;˜Ác%$P„P|¹Ú“k½T˜dpR(áæÓþ; @UÂŽåo.P -·?å?«ì:º;rº¶;(œåÒHBÐUQ%Wy¯ÇûcEàÝÚóÌãÁÏbמgo@¦ð­q´ÔDÖèÈ' )øóÁ«ÄhåHø*²ï›#™·ZÏYHá( %Òïg!›µ ß¿ûW{|êõhñGÆq¡ÄL»»o–DTèd·ºãú±‚e6D²]}~Ç¢jé‰fÙ1HD,zÉDx¤[®'tC,ôC“2ßíÓ[+'aæ%¬vâ×òAµƒŒc;ÎC:e›sÓ’/ŠVÿ¸lÞ+ã,¬zïpÂ%¿ìg.#C‰ž4¥ì#,þà¦ÉÃý\¬Á—¤&‹öðcç[5—&b†ì~wcÖͳQy•†øÀWœ±k´Ô¨ÿ ³6QÃÁ»kÓÞW´ÌvŽËËf³í®Ào×>¥‹;ùk/E'’r×i'4hözUZj -S(xÚ#oÓÜõç ç‚͘©ØÔäs½6º~ï6?\$Ý“ Ûp¿øæ ´wÅ@¸º·ÑG´=/á1^ØûûWM€Õ}ýÐ駋–Ê{ÅóZˆÔ(sï[6ìÂO ‘züñÉ'ý1(¸MáCªš˜ãôº)–æD8ŸåÏ=’´ŽMæ2_Úû+ࢊ.hmËÞycÀ‹0w¯ƒ&¬í9r7µqB´!KRëhlo:®SZrEýñž:™%ÓF¤ûX¬ö@fÔ3™Ö`¶ÉbcгûË€yŠ|{¸ ¡ïì¹Fn§È…çA™kÙYÔëÚ½ |â­±ôÈìÓDáw E)³*j³sý«‹Û–]vŠSl|œ¦ÆEÔô5L‘–Ñ – :Z™ÜŠ2Mù…%–Ð`ß¿1¹¤²¿‡T@@jL¨Ph˘Ԩs*ô½§ Ëâå®è‚ -I³ÙêéÇ–T©-˜R§5߇›‡þÚ@ÂÇŒçoT§÷uf‘‚‚Ÿ£;?®IÖB,$ÊqªG¶vÚâ¯PIJ •£Æ»¨(¡àœ•SÕ`RHáRp·É/i¼™É6rƳ¬È»ÚôÊvökU;]äW¸é­ysV†$Z k›oÀëãõK„ö Î£ æe*|LÞ¹*p¼§}¸ò× }an²éÜ¥ºÏ¡öÚò´Ú7dîyˆg9ÏÅõð¤éFOdtã’ý‰,5FYrè¼c}í¤Ná§à:†KÐe fŸvE#Ÿ?Íю˪̘ í‘0S(Ó¿£ME J+dL©¬¼I­ð^>|$½g'IàŠ´?"týy0ïù4=:9W8ùÉÝ1ÕØ”D…—ÒšòÒ»³/Ã1ðý¥C¬£ù#öŽi÷é1Dr‘ ?ÇBì6R6VdÒkšÙâ” \šž¯ÀßgÐ>ç¼u]'6ªû©$c6!Çác¢Ä£Ü¢Ãvƒ -6AdQ›¹Í,>N)¥Ò©ðOã’ÛÍ·o}ŠÓ3U¢ªõ3“ÏŠC…}àp)Æó¿a™FK›ó+ •W1{‘¨íœiNŒZ?¿~Ô<îZÛ×Áˆô~ô}“IU?û -^ºö*ÕÊ;â˜<\éæjB† :æ‹ãk‡o™ùžËýtaA=« ÓÔ'ŸÔÐH•ÄN!z^“«ÿw¢ëKËÌ´«vߪý'ZÎØS³_-Ÿ!¡ÑÐ9†˜­yƒ±<`–ìÜkÚìƒ8˹‚®UF¡èýÒ¿äâôëO‹¦3xª©‡ì†°b$pãÀfN2rI[ ÷Ð`-IêѸ\\AIëÇz£AÅ ;²;»¬·Ó@sûÑ’Ðë"ø ,méG(;vø™Ùd×"|‘"¦ŠÄ`྅Óé‘«¬óõlýÖ!|t]Œjø0Š–¬¿Ö¾ª0Z )ˆM&çEî+É÷Éœ GÌ7kʱ—Ed`X]ŒÚE•ÀQd¸À'D5õüDU°p¯)+7sZz Ce´– -Ý)k=g< -ýÀ”å•LâàÛìàwD#XY«yû¸é ‰zp£^àž¡°óRÈÒˆþ‰B˜D²¼¾Ý_v|˜÷ÕìÆ”¡v’S|*B‰ã˜D#ÑŒ¹N7uˆ'ôx’ÎvïNEy-‡UI 9̽Ç|iýB[}¥­ Ó¨ÜE>T ”;pf4_·Ñ%ÙøN} T…—Äï÷uĘ¿”õ‰¦ûñ,Ri.ï -„y„ÑŠ<¦ªòÐYtÍþz`Õ4ŠMÇ>f·ÅH3¯ð(±…¼]¨!9‡çߤ–šà›cà -è°ƒXC#Ä1ž7róѧƒ†1÷‹þØ*:½Ý -¾¬üš"¨ùᶓ°P ¾¢®tþkºô¡ßs˜8ÁºÌÈ8õc°ã9­•Qæ3EåŠü±¹ÙΆq«¿tÔöÙËCCY^"fDzJ -ÛnÂ÷Ù'Î{ü®ÒÿŒŒ®AiD–Xg‰¸N8T£lõß Ý¼ùõšâq’Þ¸+U‹í7›™Z¨ Á©Þ¼{U ìôtœ&ñ6»=¹3gT’>Ë€ijév¦r‚Kºr‚ÞDƒœR7$ál^é•4mtn$êEÒÙeÜã8½¹ƒVã=R¶W…C8.Œ.'~Všë[²­:fÉHn‚™MÂû¯®2P8¼Ï`@¹G´=qHw¾•Ø[_û7*²C™r³ŸºkÞ²¬Ã1‚¤Á7ú>< -Ã2k}„‡Œ°±hd7,=½åÒp3{9 uN4Òœ°T—£b ؆F–i$ïó‹'p‘}¾Ÿt¥™´ð^ɨ"3±Ut¢¡zx²ØÆx4D K¬ZógÜ–z‘xC6‹]äÂØý9&yóï³t6?ðÌ"% -‘¼FøCAÌÑð}>€¶6‡¢ÓVÛþ\ý di B´«ÙQ¯è.Ç~Þ‚´ÈÌ=ìäm’6yS$ý-Ñ¥ª¶™)P‚´)keÅÃvM¡Gã¶Ëe·5%¬_ØYûMŠKÒ}ƒ†Œ8 îÕŸÃl5wìóµ Ô<öÅ·£„²3dz’œVÉ ÷ - žóø.Ñ°\éd¥(š˜>¯–LãPÊ  Ôš3,¿Ô16še¤³Û²˜BG»OåÔÏæ¦_ƵW‚®e oÎP×½'”@ç×Ò KLýº-/ÞJ[ýŒxw]öG8förˆVƒÉcvÄþh;Ìšé£è‡µŸõ!qîL¾Â mÕBÇïã@håR}ºûür†¢'rû⣖í5qq!Š¥¥¾Üt¿°wô¯µžQ8É@Œ‹«}Hë%‚Õ›E1TâìGäìï¢vF9Õ´½Öœþó«õ‚y¦¹ØÍYG$RXs³ ¢ÖÌÄxŒÕ}èÔ²®å†ˆ¶DR¢$GG0!°Ýº˜ÇêQàQv‡{ÎúlÀf×rh`>-¸O×HÿËtÈG¾è¤Â³8˜RG#zÛƒ–´N–˜0NGéìl%¡§¢Ë.læ¦äyð»R×|~e@!ŽŽÔGê`ª0棋«å=,–v_æyN¸À(:¶óÌ¥kÔ/˜´@ÚщÝ2Ï$4;ô™d1Sží±B;·šjü“ < Iiß\ÿ ê™™Î9£<È;ôÈypckÜl"ºÇdcß]ªPí’›öĪ®Ê™x³}YÚð²UöWÓÖ°Å÷ê êy´NpY¨Jý°ÐKöd¢_Ì|¶jUM‰Üßíùº=B78b5í9S]âh?7 ØD) ƒšƧ̗ÌÛgäX‚ǵx–!6YßÃÛ.R8WÐ^õØ!žÃüJ½:±³tñÀ{›lnZú|£€xÎÈ›Éú¾¹[ÄÇÍ U7NÑoÁ/¼\€ZëôJ(šøºa™Ùi¤•?€üa/J£ˆEÿýý"«€ev×!€Ã?ü‡¦1áå©Qá<>ÝZ¬|¥“hà]12fʸ™§ž(Cj‘ÃS¦™úêûW%W%N_ììÉÕÈiü‡Ÿg='tÖ¾Íö¤â„6ùWÊÕfKd2žÊ]'Á±†[–àÎGÂÑ%Zu$o[fìÀ(ÿ÷KŸml>H×ýá<ňe~Òußɯ,gVi®ÔŒ¼³¶FUjé‚YKò–eŸ¨?ŽD‡.^– åª$y6àj)¼¹è 'Ç"äMï{fÅ´cäì²Üz+¢1 -°YN0ÛæxôÞù¾•·Z1#‘pÐG)œïò±ž{+¿ÝªjwÒ±E©áš=P´Þ7±ÙÑ[7û¦“¸NYYÇU¸ydyÀ3yzdC|`×¾„CBݤ0âF½Æ&nœÐ~,‰ÄÖº ô"µðóo›Á·¶±zÚŠ7¡t<=›¯z`é†Fx¿¯!­„OL¥ó¼‰cä¹àåOsLÊ…©V-Ľaw^ß -¢ˆÉd)$± ¶Š¸[a# :‘ÁÜ.‹ÍÉü7LÓ„(èòGÚyö é안øžwbMŽÓüÇÞNËe?ZÎÂfRc¯PÌeš²ªéQÚ"äI8 -4Æg÷ÎüôL¬¾¾Ò?Âlœá6_±Â؈u‡ëî$àÝÌ;ÇDpBÝu¢Cbî›#13º;Ï -*‡Kò·¶‡;¼-’"+ܦ˳-ý<ÎÈt_üöYëÎ’áBÁ‚¡$üé©Ò.&>Ùe¸R¸¡3›Áÿ]u7üaÌõñ.R8‹zAµÓãvnXLûçpYTÓôª['ÒøUÒà=|¹üº*ÚÜOAŒ/–*CØ ¿?CÞêh67÷ Wáïx,V½ªŽ_RÆò^/H–}èÈ;‡¨=+mä káÕÊuS®ÉẇNbnN’²‹Y)êctž-yá¬JHw‡d`‹£Mó®úí}KÕ4¬«–!øWù…sYÚá•MS |•Ð§D Nß"æµdYDéÖáÄúÑ¥õÇ*1öEÒ.úMµü–r±ÀÒüØ -Á4õ5’KÄó}†#‘.§­¤‹R‹« -õS—¸­oïV‚•¦x{ì—?]Ž{øjA}øé{¶$õ†BÇÃh>/o†"U¹»ý´P‡SkwUçn0þ€8âàB¶ü¾F;u¶pL)#–àa–é†EI!ù+hâJXÓP%*;fÑðáCyê¬ã}ÝoÒ¼¿¡ɧR,çÇ?’˜Sl9Ò«W¶ä'j˜¸¬UÆ)šµæ•Ïˆ°gí®œÙ­cø•XÞ|‚qbÈ£!1{¼ùelÇgÅ™0Ù—^už…ÒÊç„D_ºö¡l*·ðd¾Flú`‹Í,¨X KTŒŠf­—;û²#q~hŸ7¡¤Y'ÕynÚsëÙ¤…Ϭâ¾Ü{äcÍ2–ô-ÙþŒÜ×’QîPt®ÄóðZs‡’„¼Å·Q·œêŬÇàâr´iÔhKEF<ýçn|Ñ ;ÃÎ*½½Æ¢¨O~TÍËiƒ„½• ñÑrQ˜šÂ\QxöórÅs]‰‡ÉK‰×Öt©RŒ{±þÄTq>°/í¯ èÀYˆ8~'}j+U¤5]¦tj7ѳø6²ÉOŒô%òœíüØe¡ ÿýkFÁÍÄI÷-IƒZÚ[fã犴Šˆï;£À»¹{ý£›¨æÜ 6pÂédʬ ÊL -}c6!„L¹âP’{ƒá;D¾dçqí¨ˆz`Ë2«f§µ­])ÊFDŠÜ›/˜[öÃð"§Ê^wHZÁ‘³"¯oD{¼_7züä5àb«;ýS@$ú¡W °²ZðDò¢òuÙÙ‡W{fMÞ2ó ¥I*,~…Ä©¹#xÖÖŠìz‰KkVßL™E›)¹‚¢ÞIXbÄSóùÈ»´[N[lº3íLX¬˜üçw^@dqór®©aœ€ÿˆÈ«^œ©úQÔëèŽ0¼KÔÎs?Å$#ÅEA‰i×&ɇݻÁ‘$Ò©ü¥Sy‡1;HèWuP)½N® ‚’¯W¹s×![PÛwÚä” ïÜiCéW.䦄NMb‹Õžçáâ—¢ VTOþNÂ^K_çÛ.€ m†uÅÎåÏ0úvaiÞAœ,g5YaØ‘â×Ái¡Þø\¥œÑÖž-©* -G%vA)ÁÃG¬³¤f‹o¥¿ñ`Ý­LF™óVõ‹ÔK‰óÔÝwø`ø?qŸàÁ¨Í tj@®ÈÎê3cçÈEÑØK×O»Õò:;?I ¡ ýÅ!˜t¿£dæ[)¹¨øLIÃ-…Í6mïÄ;ðëjoà'ø|Q¸>ElŠ§Ôþ"$+Ä/ÊÑótb/w6ŠäƒôÝ~pióÁ …§Î`ÕÊgŠ²g²:¡;÷Y2&Ô%ó -ž(—NÑÄåi¾%¦Še¿€Ù?ó‡ Ÿ›o†`ƒbîª0Ø– õÚ MR¾Ýmc,ÛtóÓÇ@6UÓ -Xá…<§õ0ØC"ôñŸjè(–ŸÚŠeÂÑ_{Ú#‹p7ƒLìÙ5`:ì¥~Áì4«¼„?ãL®Ý8Qó\‡,OÇ™ÒÀ;ŒmhT Î§µVÄ! ¿h¥¦ž;t*ê¿ôŸçq !·Ë,·*¤Z…ΟÐWŸ¼T‘*”„6C‰:(ç›ø9ÖɵQçQÈÔGæǦߑ_<Â9ç×YÛ­ÐÚºMîƒ3u"JL üüÒ¦Q#ÆV_©©…vYTóVKYðçæÄÞU™gÔ»ð¼ òù‘Ïz‘Z(ßC?¢1Ý=žâD®jŠR8€‘%öøg×Èži2v»n›„¸MM¢t QdÂ*l%–¿‡RS7ÌÖgj¿¤‚<ÿWßÊ}#ó9¼ˆ¯†eç^™êgÞÀ Ïõ#²z:Ý¢ -Ha\»¤ÿEH Ü„Ôçì¾f• %bA¯üIÃvÊ¥lPsw‰8º8Ö­æŽÚz1IÝûQgÜûØÍMw­©•—#ŠC$=ꤡ ºí=ŒjâwÔŸD*/ÜÒdêÅÎVÇ ,M¹·KÎ?ß´—GM‹-ø’S,‡rYŠãÙ§¢](?*¢/GØRèÌõݲOR毙(š:4 ú™æÒøxÝ`£BÎ ´;á0dˆåÍvøÈnç”j¶ÐŸôwoå*ra|&£p8`ƒ1ÕªJs‡!ùåækz‡Fíãeo—É1.ƒ&xªMC1b¤‚Ïæ·x±Z8~"xOkËÄ¢¯×¼lT²”XQ  Mo¸cRt¡Þ aY7_.äNéT±JëñM2AJéŸÃ=k§Í"Ž‘Zíë%a]¶•æsð¡|jËNèNÙ Ùcš|GXŽÈc|G¸[«‰5G¶,€/œR\n‹l_`m>üTO‰+©b0é³lG¾u8ÂfÓºÞC#ÏzÆ?/Ùel\‘´ˆW°‡Ý×ôøüº±Bì¯7z%ÀÀ·Ú(»w)ûV§â‚›î»vM†›»ó¨7Õ5K#;ù -ž‘õ÷¦ÝÔÆ.3±õƒ¤9ù]v\_17OnS{‡71¼ôtÝêÅËCgû!Ìõ’+Ì\\j·Äž¸,1Èßß62–e€Æ§¥ì¶£þ&kL¿ÜêWÎc½aàJÚQà&AY¸Úãt¼Å+«8•õàZõг…V|Òœ½ÅÆú¡/½99tsDõbÛ_ÇÜÛWp vµe>‡ÿö²fßé(!‡°~i0bkzì¾ÕIä­ÖÙ²¥©@ œæ‰R&ï…Ãi$|i ׶Π³ùòR¥ñ-f —ºŸ æžæœby,I꾟pXðØ©»›¦Æ)bF°¡K·b¬H‰ÌçubØJŽ%Yô¶yX}<¹ƒùÂ3éîe›i0Û~4f$­z6n/¾˜z¤ðvÀÓx$×ÂìÀˆæÑnmeõaàtçTŠEð­*>÷ËMÉCJÁ0Ýg¿WæWk¡0[(ÃL(”ÂÁÒ/;í:1J ÛÙÞ¯£ùþŽŠ'sÙìYœÑ$l“E! ÿŠ’úë}ÈѸ/áK#¨ÅA­Ž^Uë“Ø~L¿  Š‚±XYC§»¬þÄÜ¥¹¾a.áM\…ætrQ×üÀjq"Üm £ÏÖ¶î½-‡Tâ‚Û%JÅX›M³z¦¹7SÖ¨úf ï0´ô³V˜q7´2AÚ€úË»X®Õ’t•Ö3çfÚÌ3C’{Äc6 b€¸Pek8ÆÉ@G•«EWf¶rˆO»iuw‚xÜÒqÌÿ8ihø©à¬j›—UCÅH»Ê¹b?,£LrE =ƒ¹ôñ5Ý&*~ê%ÐÕc¾îÏòX¿,Û qBN)óYþÁµe¤*±~å`r|"ýç4[ØŒ¢¤¤€í·Ã|­íü·‚PžéÉ+Qu|¸ÃH:^R8MÿÅ›ª¾â,FU-°ràQ„³sœð §gVì5qï¢< êÎŽ -d9ÊÉ„™Ö´š1ìÏ¢ì¶1CZVXÉbןJÐA¹ÒKMöS–GõºwÑ×í‚cþ` È1aeÿñG©n¼õ÷Ñ™7çïŸÊœFŸînŸT‡êO÷6ήpMëgW7a=_ëŽ1T^¶Õo&Œ¦ßÓÔ‡\œ"ÚË •×)-E.eÃîi¨¨Ý·ŸsÿS„/ ü†š(Aæø+ÇŠI*ÎÓüúÆjÚˆšµmiäXý…EŸç¤9q/¥%p¯ëç As=ÜÙ}Ú•;Qlir®©ù“ ÿw-db&Ñ = ¡.b¸ÝÀ¹P¿¤àÅЭÑ#m„ɲ]¶ÇeÕù-÷uÆÇ9—ydrwÙxm£ ]Ô(IÇéÓÂQ„V‹I/öVxÞж[óVmyc~|´‹ÎññF-]£ÇõF$ô{Ç•þò"‡‹Èu*'¥æ/Tw)þñ/ ‰_bbèø†èh³H‚y5(Ô23^K~xɱVÊ+˜H©·1›)¿h¤GP~,”é;¸0ÇPÝîDÀ³Ø2y(ï³³RTkÂì¢þ•KÒíÛ/ Ôkz2,ƒÄUHH,[¤÷žÆ—ù­gÜBþîÕLM*g,ØG‰³Vî«LµÎ¸NÆ›þÜþ$î¯Di$uôìØ‚´)# 1%}>Ò-2¸ßL1­ø¿²s5ûvTëð$‡.2XPPù8ú¹ãsµïõîrRÎÁõ„¡Ï¸¨›â•þI=¹“ NOCÕ4rʷ鯲›lYõéjÀ‹¯>T1w=/&6‹ü9ìæ·äŽui]¹%3ÁÐ.{~Sé…*5s›3:Ô„Ù“ü*·ÂÖ5pFÍšm*sÚ»°©’aÅ:kïÃõb–^4M"s2Ë®EÑ8Õh¿]œ·R´Ɇ¥ŠÚh6lXq¦!JpAW©!lx’YŒ¡›=’ÍÓtúñPJ—ép —Ý@ÿÁ$]C2R7qlnOÊ—*k”(Ú…V¯{­²ÏRw#XLÀ#btJ—Ç-N‰zØÞ)VMÐS“Æ£<^É™¯ŒuK ¥¤‘îdçÖMø³[×ÐÁ÷ÛÞóÞkSÙèðËÄÚÎÍÞÕßßLØUÄ Ô:L}× ¤å°6a@/æ{н6X6ÿ]„Ë1_µ8.·$ñúëý2h¤ñ³O:þÉããhIU½”²·–2 Ÿð3”1®.øºò"îf/’’u.3éªZšœ˜­9µÀµ˜…”Û±†mùlË—‡Ï³'´8/Éu×µF±‹gKŽ‚Ç;`†øç:í·úGj¹ÃÊH‡õi¤ö@É÷²ÇÖiFèÅžo:Ë… õXWzŒ†˜g =çÇ$¥6¸i\üh¸Ôè¢ë9ÃËñüwÑ¿nÊm#p¯=7Ö8wK -†‚˜!Y5ª¬h›Âø IŸsëâÏç ùÕu8᱇¶QøFt“M$Ž×Óå“y'ž‘qŽ²ñÐEW fáx:„˜û;W7·H þ”ãWŽª—g=p.Ä"®¯·4š©øZKGœòÍ£¾O‡¯ wŽù¦Ú&þ¼­ÓØb½êÇý3ËÌ@1"†r=qoÃEó”ä×™v0™ºpݳ³Ë„ƒ"´Å¡‚’¶Éà#’¨¡Ü‹BÕÝkñ:FñHí ç絬¦æÐì âyPÞÛúóÐn#Z\›É72L‹Šã°-*CÌÚº§´á—µ'摃ì“Ùðú”ø>mã fË©¤7i0?˜ûû/‘ªªÚÜAñ‡®¸»¤ß3¶îew´°éÜÐ fL9QqØ]P ×·²¿èýöФ¤5BéÂKÖÔ( ÿRÂM«bd¦ñbÏJ®¿Ü>å#cãv“¯Š1‰«¹Ñrjºé×M —U;hKË’ºDÐWRIÔ®@$š@ì<‘ÍA´¨ÄDú&„IU©¦"ŸöÐ9~D”eùÖÔ ôTê¬ãœé(¤Çn.”.kðÿ´ ¥®ogï=ƒþ½»þsuFÝÏåþ¢‹·cËáäÖ„þ²÷‡ôŒÃ¢§gÖ™EBdeìºf|íö˜ Œ³Zw4Vçvž&Ê=®ÝÂ¥H‡,d|LÀâ3N‹'¹²7,šsL„Ô]øm³ n-@ܤ¬N&…¬$ÿÈûÃõKÐt|]Øl‡¢óJ>h– -’9„©²Íºi=ÿ¨nuþò©­'h¾N«˜4Õ 7<±–¹ûIíÓö†÷Õ=Î)iÇN{À$dQñãTË0¿‡h¹KÝçµÙÚÒ9äóÌèÍï@¢ËG¢ $éðfKvHÀÑ:ÓÝ&îûAoà `žŽ“DGO?Ìd¨ö3ìŒ Â̪i¢ì'Y"-°ö-¸™¸O-õÂ5¾4¡Ã­š6rMŸ4Éì’‰üË¢¸U9F4Ò±SÑU-ÚÆ -¡à£"Ð,‘gÏKîD~^ººÓÜÉ/Zn\Æ$ÿM­Œù–1ÄŒ)Á×BoÅ£E[âcQóh¨X*úêÊÒO>0”ëw+ÇœðaÚ¨F~¶zñyþþ{ ‡gS(êá9‡&IdÑX2)Fžb¡8ÚËp¤‹PX,Gæ(xõš2œS`º faje‰ªh.,w¤á«7 -cLÇý2 Ža®_š²HÎh2+ƒZj@¥üAnÆÝܧúœt`;æßgŒõµzê×îòx¤áï¹Ñ%–ž{æVp¨XU‘Ãí`ß Üv«%¸‰ø×îDß=pNÞßà`å7—Ò‡Rtó ž5•C{ -L­ysŽ>!qÓ±ôm«¢É‰Èåîãéoª#ÙÎÐ^?ï8–y_å¨õOÇ€«j;‚U㌠-¸Kþ­Óp’¹«³>ú±ägWüD³É÷?æKåÖôm#|žZ¡£ ¢Ieí "b0G`½t¢n¢J¯q¨ÜÜPé¢G08mÜ8Ùªç µÝ¯Ýã¤ßRf§2e±;$D/Æ&.mÈ—(Ân¹\çU"S#Ð!=7±æ -’Š±à÷+ÐáËú­qJ®lHsIw¹eòª zDëÞªÔ• NÚšO%ÒçÕñr‰½¯=W¸Ë„TF%:uÀ䀙2º,~u‘\ıáýú”oC}xù‘Žq"4{‰ -@ûÅ#\t£¼ó¿º™/K®Ÿ±UgR¯H€d~È -a«Ç|…Á|e¿g½¯ }ð”uT©ûa3s+³Ì¥•¿½ã1KÇ×1¼tþ~¸O`Ë’tyQ[ýÈ—M!›ªo®J¿¦½Á'‚K›ð⊿Sî|ÿ˜û\WAƒ#‰Å9Žê2]2Z³lp‰Fûû–†ÜûO¯†O &¤ ÜDpªV¦8ï…ñ™÷óìº è™zgØùÝg¢‚5¹’-É}P«†öž/£y+¢rC*î‹#&ï]:x"v˜rNµ4¥‹|ÓWíJû`føZ1mü-msFYîÐ:8[Ž–?[¯+v~ôðá²› ó&pÀs–K‘v£y¨¤}Üšÿˆ÷[â01%¸.cœY‰]j˜ª:Ç¿ùö:Qqæ!åµ¾©ÏÁÈégƒ¡¾{£6jÊÑõ({ö;¯`ôô«î½A$äÆä¥=ÿ7<‰†ÐZLLSXëFŠ}Db62×,èÿv;=›#˜‡Ãc(íˆFrEƒÎUA7Á¾ºñ°¤‘ïμ Ÿ³ËØ 0 - ·‘—Vh/†¸MƒD:•ÄÇNñü°†•:#Þþ>PLÇÒwïÿQ5GbÄñ Òû¦ªð@` Ìz(iVþÉOëµ6 ‘–`.¿ô#°Ý;Uº-AnGûnxf³lTÆíØHºcÍõ7<²q3)‘‘Ç~*Ún¥ ÑB«R‹Ï+K¥È›!®)w™øÄ•™þîêñþœCåaIyƒÎ³<–äxŸs²)¬•¢×®8zÅJäó £n©ÌsÌ™æEHœX-z/è=!s_å™B?Êóíwö;µŒ›ô7M»Õöî‚Œ“˜:¨’PGKÐ'¨MÖí éżAJN{QbÆu:V7^Ð(*mké«s櫬é)7,"[›CÓXåºñªÌq…»¡„GÂmb(GXT€,ùÅbo©ðp²‰Ï÷ÖnròΡÕ`‡ü'íÌI êÁ¤Ë­,,ÿ7üëlþ\K -³ãÆ Y§u ïèœÙ+èï°9¤- ˆíRUöMxöOþúíú¡ÅsC¨3‚Džú›„àyEà·£¸q ›—Rôd}ŽO± æé[ÞÄ™G`c·§;[‰^L–çÎ(Ön^v轈î½—’‚IA?‡Zdߦx¶ë‡0Þê5/„·ï0iñUE°—,¿"7ZE"Y÷­à ŒçÂëáÂBG¾8˜¯§µ#êÂ^ êa¹bÙø´­b÷VîæלuHmzæî -P̪è¥Ôqõ D·Š@ÞDzˆ‹òuçöÿäüfN?ag>-šŒÊM©a7šµjª)Ð¥0c1å˜Åêž&¶Á0®ï¸‚«n9¯ÀMæW )õêP&°C˜Ù‹÷¥J@eôOqðȾÿçx˜¡ù3ÜÏú\åušà$å·=„þ’»:0¥äí ¬ {]Û7°PPÎþm1ˆ’=pËvÑ18Zµ±ˆÀºrG»%±6.«ßÌ¢8Î8П«woZKÉ9'çêí#úG—ïj²X+§ÃšP8†»Œݸ¼0J…®D“-ýf¸=_U0óA­ú¤‰Lÿé-àK‘ú¥Ïã&zŽ^Lqêm²ù›_º´~æ9ö$ |òÔ«*9k+ôûÒ—eL€<•Ëu¼É]ý v¨Œº_rœ!¬ß§Ìèèn"X[,#ѬR;Ry\³¥»VXÀƒ±AA+w -©õŠÊ»üyž+¾û™%’I†2£mÞá­¥\÷¤uçó:µš¥WbÕ‘¹éˆ×h'¢IµCŒºÛ ¯uJ*ÓÉ<¸S!ÙÖdNPÂD)­çcÅkø2æòò›9b«Ë#¸ö••v² û›T“Z#¿FýŒcÄ̦ë»Éz,³ý‹ù¦Š{ªÖœÿV¦(Z‰šavQÖK>T«:œcn -JÎtŒa½µ~öB¿çn 8b¦”W»VŽn$èÍñ)4Üê¤÷VûËÌŒ;µ•èN ‰R£ËÐŪ§ýÿ×>Y¶5( QD‰!%ÝHîfà¨Ñ9º‘n i’"]Ò-Ý1ºKÝݵ÷þ‡÷Û}îùçÃyžã•”4|œ"ïñ`Ûý]_€ßÿ¼Ý²í\£$«:ê¯{¶F†Æ»lìÏ3¢?ÑL$G@Öóå×vmôãŠ#Žª×°tή4ËFIñê\é±¹†òã–ÊcLÏBÙðn¶²e™i¤ÿs;<¶ ¼ÿñÏ7JŸ¨ie/þ5÷“FàEZUuç!í¯îðœJMþ•³ŽôÓ }Ëß–~¸ -Âòé€z{JE‰FªM Û„u–æG0i ž³ÍÀ†^µYkúzþ'ôÍòH¬n“È([ÒKFR}ÿ^÷ôdk -±5b$ßì}Cd%#vﱓ*š°ßÉ ‘ú°»­¥8hñÀÜ_Œ»Ð7¥U½2f -b›oÒm÷ãÅY…½jãnQŒ˜fýÊm½­ªm&*þ8”Èç1|ñ˜a¬~– F‘«•¢ûÎòXQ;( _ÆSI0ü+p˜ý&á¸$BF -ý1ì_v#ZâÍ,µgªìVØ -*‹š@i‰úû¿ž8ëäCî3luRŽn£ÒsbX‰É ýÚNã0Lb£?yrK—Søƒ=ÕˆáÜá@Æ žÀlþ ¦Ã<˜'•AÅ87gñU˜ -Üxäø›Š•XGŠyº'üá9vµ,Õ½OÓà¬KÏýØIC`­” ¿¸9Âò§é¸ˆ ßcZ”Âh.RÕŒI8¬_$òfIKmÌXró–€àÇêŸ%Ŭg”ÆÂüˆßY'ºVR, ¨B~ ÐÔAQäϲ¯u£s¢€Ý_˜Œ\@øt-ò©Ÿ’>ö‡Q÷FÉÎUŽ«l$Ô.ËW(¦8*³Ÿ{>B7@ -7쑘ôy™Ù7º!„³¶ QèÌL}*Ÿ$‚WVÉÉ®š±Èñ×´//2ZA$¼§¥ªb;>~T6EÕ<Õ¿¿Vj3ps[‡Ú[ë #.JìñåY¯ª0ûì©'™„±ŸµQÖ8}Q¥ÞÒš½.HÒý¤ñ‘õ$=¨â¯oñöaZ]‹#6ž/¿¦Ðô¹e¸ÞZ‹ÇM{ªh= Hp¿œ¦-Õôš£åežÂúz‚€ÛÆ«ì(Onû÷söQY²æ‰Ï&¡I(Ja]U›-fø´Û[ˆÿÞóݦ6vº%š.[Íá§KpyJÖˆàêh2nösjJ,©VŽ&EͯU¨•x9øW+0éOžÜX‰3„\´å‚]:aFïz”* ^Ô¿Žààˆ¥A -‚¾¡ÉzŒ:s[­+ž:[´‚r 7À«_ó熈ÑFÂ2Õ:¨Ù˜-Aè -œÆâO­Œ,Eß÷;XM«âU†æüìeçÎ&¾¸cë2“.D£T«h8&Ëe7nV"ÎCøpÁ¨Ö# }&_ot-ç2ÃæXL¦ºŠðï"’‚Áf&ѭ탔w¤éʼŽE9Ãê¶Y|t\dà=_©Ÿiµª¯9ÅÝU5½<}âoCʬe±É·mQJ_”–õx-ºDïä»3¦Ÿëï"‚_ -{8þFÑÇæ–éì é–sEcø ôc/ ¥Xne­£ß Ip’XÌ,X§x©oÞC§C7}yñ8㟑KÓ•F<Ø—¶cÚùc§>É÷"ÊåæÔYxVì#³í³9y«bTjýé‰NÜáù„…ªjŽ\«WÍX!Ì[Ê뺧b'ÞŒÆ)<$1ôÊÚ[,ৠƒ@ŽWÃc3/—°WnY"¬Æ4áé[_Šüå–#xÎöf3I¹[V¦;ñ²è2f’a_ÏãX;q)ö&Öö4FØ…È÷Ÿ ˆMóK¶Ñõ‡ºé€‚œ»&nˆ°¤ý‹ëžÜ[}·R½™Ú¾Nò -=X¤9ƒ:Ø•ñÒ¤áiÁáß”×ëù pj2ã¬#C÷€ù=  Ë#; .§Yº°xB±}!ÝA®í×›< ûFÔ9OµX¥|½D;-^Èê-Èñ(õ8¶ºÞsžj‘ÿû_„1Ìo^}$å©ZR‚„ÒE! -†*Nñ(ßc“À“ -ÎQÓp/6è~E”ª:Ý?ªúÚ Oæ˜%3=/4X ýÄÐuƒä–ŠžØ¨ûáá]°ÄDóÏí¼ G‹Æ˜; sL‘yø‹laÚTKcøþÙÒ5Ìg+Ÿû{Dü±Í9­M9îŒu.ÍÁGBLK¬O%¹ŒÔLM…•“–`Ov’T EíûÐÖ[ï21Êsd©Jéšp•˜éø#ÃYÝEö‰¨õrnâ芻‰…ë°¬&âè݃é3N^Árÿœð•ó+fd-9¸U0Ód‘ ´U¥A}ù®º"äöÔÝ© -ê™ã2ú»‚îY$óµÉ•­ßª2^IÑPYm3ïÜÚ×Juý¼=ÕùÌ~9Äÿ 2©”pmPkDÉ Ç¥)DcX¨Ù콘ûk*+ÇMCÆ{Ù´~­Íµ)²è5¿¯ÅL|yÿ1ª5u‡Êëñ÷Òc9„ÍrU ¶óBDøò3TyÈ嘙 SzH1ß+`Îð¶+§`½°W5Ó㎎²ÁÑÃiÁ™,÷ò}cýö3!§ïÒƒŒ‘Pu aÛ›”Ë tòÍ|T\ÅL,pÈBHðì9çÑô)8H-úäjj*ê=êOŽ<™â:õY9­ªÓ=iƒ‚h¾!‡¶ïh­ðç¼×îöÎWc?|8na|qží+¬A}~é{âV+gê7L7,ðt>ÓSÉr¢$˜@ZýaQ»²L=4›Eb ”¶¼ú¨•ËÅ›å/Dj {h>UVÇêúÓ·×!JÞ£ëp‚FL¦DE8"¸FKËyŠRŠàïQ¶ÖÿcFö,nc$õCèÛn^ºËø}ÃÞ‰ÔÕÃìm{ebèÅß5|:¼ê6ÙÑÑçd®‡ÄŽæùƆ ^Ý+÷/Ø:!\Ø°meCkn+? äm –ùK'S| j&¹qýÉÆJ²¤µúže•xz2ÙÌBwÛÝ:‘C¤·¸:¥½`RÛˆë1ïN^‹r+Ú©:/cm1+Wã¤àûðó·ê÷$â{‘™à‰¾m©¡¯ÈlXCšyÆïÓ»,P°&Ä•–¤–6Aí³è¼XË4ì¢Ljn¢ ér:S#7v°£˜¬dd÷—“dZ«¼rQK¨ý>¯õ®lH}™‰Óüzôßa­ªëµjÈî`ê†÷Vš¬ŠÖôžÕŽopõÄh€— âc—mNá»’E…¡/—¯ñ­(À»¾£ÐgñKÂ¥K_}dÀç²çšøWNy´bJºœñýÎ^y{D¹¿ áöø ȯ×Íó WV?S¢6y‚ D\ë †µÆ†ûÿ -Œ†<\a/r¼ˆvÈxµfíÉCvP€ÕóuóföÈy§Åm4ÍÛÆajùlW¤JÕ4pñûZ¢Aÿ6Ñ®–B][¢µš×´B©®¦Ö{?q£Q4¢«]*ê f1 ¬Œ*w5#Ò”HðŠ¼ª¡–©ÖËCšŒñÌ®¾”ëÓj¯¼Ã'gE¸FŽ:í·²ˆ¯%u0Aü¼$°aXÂ/ ÷ߵƪÂú¬(ß™uklê..Úá¨etV‡rÓ*$ß;>wYp®Ûr¡£îdʈ†éñÇVéÃhKñ«¸óWCÞ.ïò$.¢oÂÞQ#»Å¹* q¦ûÀ6¸JÔ àÇæOŒù[ôÏQ7óeø^ðÏa:iÄçºb¢&ÙgAÑV£ç\tj†yçר™<£È„ì3tçV(ôßÌh©×OѬEf›½ éÝK•X?`Ãþ7ØokÓÈh_y,Ü÷í½?á¬{®Mpóßù‚z¯–ž§ûëeò eÌtÞøa‚s{ú(5J<iKfÙý6ZilX'Å¢ã6ÉñÃëÓÛ)'´Y¬¼ó4a ³Ô4ǸÔ;ÁñUÁÑu]h‡ÎlŽÑJqz$KЪ@ÊÛ3§Üo%ù˜CS÷.õ„ŠuáDâ°YkÊ5N-¸àî )¦uóñ×RÒŽ»—,â,Öò‘ù;²eõ'h=ö:©aCDcjÏç¾µg"ÁÌû'…@ä¡e;éL7FK@»,ƒýëdE’¹¿eÊu]þ¦&ãñ*çXê R\×|ç>¤}Ð8ûÅò´†ïZúI–-ÄŽwp­íô |Mª›…ÞTõèË¥{E-5uyЪ(Cˆ­ÞF‡ÒogçüÚ3‚Æ?Sh`Õæ²2­£=‚II¥ñ“ÆñÎhÆz[ùP.ÍgN#w£é_á£ãäbJýè ¦3eçø1Î?­úw–û’ ë zT4{… BfA]qpeóD=>ö$”z‹Ñ”H"s›eª+è–ÆŽµz lSvöñ©…ï–YöWñǘÛFÆÉð& ëB¼´söÓn>³•Æ¨»VjÔŒw¥¿·x¬ I’ERH· |MÄãzÅsz{o ß–ž›ŒD3e'lÁb=âßç95K7ÁœÃ'ç k+'ÂæxAS5#]¡~ Ú§¾wÅäoV¬1¿AÃÍÝ4šïOFG,j‹`Ý8ðE¡4™üøìi–¢L-C^+ÔÜF«Uݱǭ„ŽŠ(û89Aû[¡÷Ó­f)­Æa|é]l©ì™ùÀ`§ª¶p«B8Lúño@}þÐ’F³’Ùa8 -åUÔwUMõ»gÕ"&ÛQ=Q¿Á²p,æŽ ðrÎfœÝ‡Qã³éîtÜt6.§>ôÙêð97›“¡ÞnW‡•‚ø«Ñ¿}‹!®N‡éi…@lã -C•Á&ûA×"4ÂÌ]iÅ Î|,›ž(mÍ…pêÖ.‰ý³oRŽÕ] ¸kŽ¬¢PÖ¡ZÛZŒŽT2Ê©‚pC¯–dô.Rn®f™7£žØærðk®–-!OõŽž1t¿9~‚ó–‰æ·q¼mxYæó”9gK’}ÃÜÕè×å HéÏAf™\pCÊˬM‚._óBâÚjq À¶]qL÷‡ Âa¯¡n—ˆ›´¢('â¥&Cv­pñf–¿‡OFÙ2ö -# ð:øF(‰¥YäsäLèÆùxÂJßÓ%ÌgæÂîˆñe:‡¯#0®ÿëÊ»3¯‡óíLM¤\“wŒgßRkHäŽÅ_KØwÓªÂìni–ŠØ± ¨wŠlNþj sßÑ8vcŸóëœý£jÜk^s^×Zë5FQ’)ª0›Ø%ìlA ,ŒÌ<5e ECkkC ;Y)¡5௙’RÔh²°³3y@€Ðð퀅›› jgïîhafPÿå ¡££ÿ/Ë?.#÷ÿ@þF:Y˜Ù¾þ}pZÛÙÛmA)þ¯U€@È0µ°Dµ¤ä%Ô’òjI -ÐñoŠÎFÖÆY c ­`jç°þ÷`lgkbñOkNŒ¹„†'{ ±Åß0 ›1Ðþˆ`t´±prúû °p˜9Ú‚þÎd°°5¶v6ù§€¿vS»dïh÷×Ãæ/ö—LÑÎ ädìhaüͪ(&ñï:A憠r;Yü…v¦=MìŒÿié_Ø_š¿(ÈÐÂÖ ºþÉe˜X8Ù[ºÿÍý—ÌÞÑâ_e8;YØšýWôG ™¡£‰5ÐÉé/Í_î¦ó_}þ—î íí­Ýÿm÷/¯ÿ¬Áä´6eD`ùö7§1èon3 [¦¶Š”­©€…ùßvgûÿÀ\€Žÿõ?{†æo†&v¶Öî )“¼èoJõÿÊŒÿs"ÿHü?"ðÿˆ¼ÿoâþwþ—Cüÿzžÿ;µ„³µµ¼¡ ð_A€ÿ¸c²€. ãÿÍÝÐÆÂÚýÿðß=5€ÿ®RhælmèøßáÓ ÛšýU„›‘ýßV ' 7 ‰¢ÈØ`jhýwVÿ²«Ùš­-l5ý×8 ,ÌÌÿ S5·0¶²ýgøìÿ†€¶&ÿ½ü¿2ý«x&q5 UUIºÿý^ý—Ÿâ_ýAªîö@ÀÿŸDCÎÎä?ÿ°ˆˆØ¹<X8™ ¬ÌìÝ߃ÇÍÆâýÈø/"–ÿZË‚-ÜÚÌŒÌÌ,€¿ßÿñù¯•î£·5¶3ùgǨ€ mMþn²ÿ4ü;;:þÕö_çþoÓÿ±þ×vÝ€Æë+vƼA–i™é :ÜÜ‘)1í>È‘`ûÒFÕ¢¿»^ß´°]îJƒÚ`ƦžßíîËçöŸ‡Ò´Gc}8ÖT½)Àë|"o +šþô­¯œtGLz¥ÈéQž7K²;P?8˜Õö¦””õJ>`ˆg:Yánžiü(\ +ü°¾<Ù£ø§6Äbw¡5aÔž_|M<}~¢î½…î?$¤Ë‰…§äuBþéçC(øC­B¼ªùÕi{Ju ¡glŸÏÏìC(»ƒ¢ÈbÓËZÁçjð§fÌÁpC@¶VBjä+s^"ò“£œŸpÖj×Ñm¡HNZ¬¹Šù—;Ão{ô«OŠ—©š}¾ŽÈïqM gÀÁõ@‰Î +vÌó_ŸäsýðKÞ`zŒ—6$Aïܪ“³ÖUª Ô¼qTÉŒ!ÝNë”›Å/˜4ú#pöpò>ÙMBˆÁrêM<õlb®‚‡é‹à\jÑhŽ!··qèš–í:—… u>5±“ª——‡³›G¿:×MÎ{òεÁéKœJC·Ò@µ¾/)qpgŸ”­µí‚ ¨•Šgý´»Û]^ÕÞƒÛ1Ü ½û߬Dþµß™á…°ä]xŠ©9ØhNT:™~«„r…7Ôè¯Ar Òx‹'£º줔(IÖR×Äf*®•5`™xZi”çe™•Vê]è®tßó ¦@ßë¨ÖŸ :º·WH’gå Îãí;g¡ÎÞqQþ6ÿ*<È8Ô²nir{:^2‘@àcÆÃLˆ&º¢a™³SûI˜ ¡NÕÊÁãɤðÛeã‘[‹}­H}öA÷4OöÖgí +„7N•{œP¾©3¹¥Œ/Ä[Ö]ªp­Cƒ’½f±eB8|* ÿá´%Q0d’hyŽÏË9€œH7þ5'i}=½ó{LXwÜëaä6Aº„ï5Ëo7F—Aµbñ#¹‰…O[?ˆny= ¯7…³¾ÏÆ_žMSÑÓ<Ÿj²¹O-ÄËOrlºÈ|!•¡ÀºüV„, y©+¥, ßê¹2š_Sûà£#üåž ·${qÛF2<üm=àmûS}ü{/°¥ÖÌ:i­‚ƒ‹\’³¦ææŒ"×îS©ÄÙM>?gЀñ¤kMí!,£sê-Ð@‘œm.êÎ@ušltÚŽ£{±/¦£¢a?©8AŽ°KjðæêBQù–‹Mør“J­õ¡F7ÇET¤tVÂÌ''¿3ÉØn¦»3=æܽ‰(®!að5÷åñŠ&'×ì ®n612"à8F•–²£ _;Ù¦kžO„ÝÓjwX í¨FVfzÙâ1ÖãðÆé›­iàRQKzó€ü§$·+ ,o@rÂð*šAnú³,½,¶¹}ºeÄ)ywÉG~­(JYœ…Gåy T0}O7&·wŠÖŸ D©ÓÙé@ê±=Iµ~½sŽè#"Jk6ÿ´µªt‰`úb˜B½”ÿ}FžÎå”ê¡scÆ_»K3B|=iLõ÷*öY/È× d@OÏ9FÔ•Îk…&÷;®/Þ¯/]ÁH}ÄËg•ëYnq¿C…å#!èkšž®¸B<.›/æǤ¯çXd\ºiÐØñ-z+ŠÉ¥KHõQ´ h¦ÿFÏÀÁÕØ wˆÇÕµÊÉàŽÌ– $^?Bäu):pã uÖêShÏ©ÏUbŸ¼ƒMÝ(¶&gPð \`{$¾ɦc¢¹Ýà%_ µæ”¼:ËÔiÏ¿J”­¶¸•#HÆÌ)o=A¨|iÃHo5¦x8ûÕ¬¹Ùî?[8V=—¦­Mº.ïS`Ç¿%¼à%¨âÙÞëju¦JÕs¦þð²=ö–ÒkŒVH‹CÁVÑ"¯•›ˆøKŒÉúÖxÞfªxkžv7`­ÄJmœ,™iì‹—³é éM|ó‚X2<».Íhì¾0úd²n¬ØÕ ŽgÈ-KÇkenI`sã\ãQ +ï™°H¯Ñq<)XÍe.vUÀŒ‹Ææ6¼j÷(OóÈŠ¨ð"AÏ@ ä_ÞžX$#–alxUeh[fdþ.Þ_lÔæ8-®(˜ÙÉë¾—©)ZóÕŸÐ-Ž¡ÀULµ îu!lIã$)ùºI@ÂÁA5ØÀ4“î¬Y’ËËŒÞòQ€!I…ó +Ôû´Þܼõz2‹÷¤#‚JÇ_N‚aºäYCÏ>\z…„–gĈÏs³Ìjd¨¦!X¸ˆÓ wÜ2mö8Ùp!os´C?yTÿ@[Qc×Üÿq…ÒŽ¥Á=5(æΡm³× ÔIìÑ/Ôa1VGKj]Ø w´Ú}oä¿8A#çÁ°\SêœM,ZkyÀºHí(¨ ·³ÔŠSñçöš]MC~ÌTŸÜ¤Pg}÷p€‡€ J¥'Þ fØ‘Vý"‡øíbÇdsªÝë~£vz-t±~ŸU²ôn5\±ìÕµIýS«Uÿ >¢KóHšÃmµ[»nKYݼ øËÈ|(ÚÍs@w³™ >sϽ°V…–šü ®ÙÞÇ+×Xª‰‘†€9õUW«K8†?é `(zšŒÜ›×Io_eîÁ‘Í>&p×$ÏoLòŠJß´/õý…›R-“ÃOÃÄ,Á‰ þØFáÒÓýâùu.Í­Ž©X€²£ÝF:ûL@¥å߸‰+¸CVçD§›î$2ܘ±­¤‚Tô¦:‡4Oòü?ŒÙì7ØC *™VBÆò6Vjó­šÛ¾§ ÷fÝÆ1÷ídž ¿ô |ÒÞÞ@OBG À§˜«T ˜Ã1=Úuø1&\ÛTĉº(Ð64Ï›§¼ì¥—¿ž6ÇnÚ4~ÆcÅÛ[zFbÆ’RJ»žƒ.¶¡ÖkŽãÃÞDþÈÉ+GâzƒîÔ¹m_C|øþ0/–­Xµ³-`_1+Rå¬Ë¸ƒðžM*&`*ó|ÜTF-ò\<óãT¢Щ› 7³ Âý7GÓ\[C2Öb”Ÿ‘„fÊPš{í›ÔW‹Ìà±(B(¾\íɵ^*L²€N8)”póiÿ *aG„ò7(…ÛŸòŽUvÝ9ÝÛ” NŽri$!誨’«¼Ž×ãý±"ðníyæñàg±ë?ϳ· ÓøÖ8Zj"kô 䓆üùàÆUb´r¤ |Ù÷̓ÌÛ­ç,¤p†é÷ƒ³ÍÚ…ïßý«½ >õz´ø#㉸Pb¦ÝÝ7K"*t²[ÝqýXÁ2¢?Ù®Î>¿cQµôÄ +³ì$"½ƒd" <Ò-ד º!ú!áŒI™o‚öé­•“0óV;q„¿kù ÚAƱç!²‡Í¹iÉ—?E«\6ï•qV½w8á’Ž_ö3—‘¡DÏ RöpÓd‡á~.ÖàËR“Eû?ø¿±ó­šK1à +v¿»1 ëæƒÙ(ˆ¼JCü +à+N‰Ø5ÚNjÔÐY›€¨áàݵiï+Zf;ˆ?Çåe³ÙvWà·kŸÒÅüµ—¢I¹ë´“F4{½*-5 …)2x¤iÎ#§·5ž.‰©sV ñº^ñ¼ëÓýªÀ›`õVÙÅ¢UR¸¼ûpœ“åæ41$ûFÐ8ªŸ8 lV{v”ƒîÞw©³î~¯ìýý«&À꾃~èôÓEKå½ây­ Dj”¹÷-vá'†H=~€Œøä“þܦð!UMÌÆ‚qzÝKs"œÏòçžNIZÇ&s™/í}‡•‚ðQE´¶åï¼1àE˜»×AÖö¹›€Ú8!ZŒ%©u4¶7×)-¹¢þxÏ ÌŠi#Ò},V{ 3ê™Lk0Ûd±À1èÙýåÇN@ˆñ€ÖXzdöi¢ð»†¢”YµÇÙ¹þÕ‚ÅmË.»ÎÅ)6>NSã"jú¦HËèË­LnE™ƒ¦üÂKh°ï_ŽÆˆ\RÙßC* 5¦ T(´eLjÔ9úÞÓ…eñrWtA…¤ÙlõtŽcKª¿ÔL©ÓšïÃÍCm á‚cÆó7ªÓû:³HAÁÏÑ×$k!å8Õ#[;mñW¨$¥„ÊQã]T”PpÎÊ©j0)¤p)8H‹Ûä—4ÞÌd9ãYVä]mze;ûµª.ò+ÜôÖƼ9+C­…ŒµÍ7ÈÀaÀõñú%B{PçÑó²ŒG>¦ï\8ÞÓ>\ùë +¾07ÙtîRÝçP{myZí2÷<ijœçâzxÒô £'2ºñÉþD–£,9tÞ±¾vR§ðSpCŠ%è²³O»¢‘χæhÇeUfL†öH)”éßѦ"¥2¦TVÞ¤Vx/>’^Ž³Š$pEÚŸ ºþ<˜÷|š‡+œüäî˜jlJ¢ÂKiMù éÝÙ—áø~‰Ò!ÖQ‡ü{Ç´ûô"¹HПc!v©+2é5ÍlqJ®‚MÏWàï3hŸsÞ:®ÕýT‡1›ãð1QâÑ?nÑa»A› ²¨ÍÜf§”RéTø§qÉíæÛ·>Åé™*QÕŠú™Égš¾p¸ãù€ß°L£¥ÍùŒ„Ê«˜½HÔvN„4'F ­Ÿ_?jw­í€ë`Dz?ú¾É¤‡ªŸ}¯? ]{•jåqL®tsµN!CPóÅñ5ˆÃ·Ì|Ïå~º0È žÕ iê“Ojh¤Jb§ =¯ÉŒÕÿ;Ñõ¥efÚU»oÕŠþ-gì©Ù¯–Ï‚ƒ‡ÐhèCÌÖ¼Á‹Xž 0Kvî5möAœáÅ\AW*£PôŒ~é_rqúõ§EÓ<ÕÔCvCX± ¸q`3'¹¤­„{èF°–$õh\..‡ ¤õc½ÑŒ â†Ù]ÖÛi ¹ýhIèu ü–¶ô#”;üÌÎl²k¾HSEb0pßÂéôÈUÖùz¶ˆ~ë> +º.F5|EKÖ_kßU­†Ä&“ó"÷•€äûdÎ…#æ›5åØK"20¬.Fí¢Jà(2\࢚z~"‚*X¸×”•›¹-=‰Œ!‹2 ZK …‹3…~`ÊòJ&qðmvpˆ;¢¬¬Õ¼}ÜtЈD½N¸Q/pÏÐ@Øy)diDÿD¡L"Y ^ßî/;>Ìûjö‚cÊP;É)>¡ˆD‚qL¢‘hF‡\§›:ÄzPªÂK b÷{Ž:bÌ_ÊúDÓýx©4—wB<ÂhESUÈyè,ºf=°jŦc³Ûb¤€™×Nx”ØBÞ.Ô¿œÃóoRKŽNMðͱŒNpt ØA¬¡â ϹùèÓAØûE lÞn_V~M TÈüð +ÛIX¨_QW:ÿµ ]úÐÀï9Lœ`]fd„ú1ØñœÖʨó™¢r +EþØÜlgøÕ_:jûìe ‚¡¡¬¯ 3"=%…m7áûìç‚=~WéFF× 4"K¬³DÜ'ªÑ?¶úï…nÞüú +M q‚8IoÜ•ªÅö›ÍL-Ô…`€ToÞ½*Pvz:N“x ›ÝžÜ™3*IŸeÀ4µô +;S9Á%]9Ao¢ÁN©‡’p6/€ôJš6:7õ"élÈ2îqœÞ܃A«ñ)Û«Â!F—?+Íõ­ÙV³d$7ÁÌ&áýWW(Þg0 ÎÜ#Úž8¤;ßJì­¯ý‰Ù¡L¹ŒÙOÝ5 oYÖᘠ+AÒà}…a™5‚>ÂÃNFØX4²–€žÞri¸™½‹…:'é‹NÎXªËQ±lC#Ë4’w‰ùŸÈ>ßOºÒLZx¯dTH‘™‡Ø*:ÑP=@[›CQƒi«m®þ²´! +ÚÕìΨWtŠã ?oAZdævò6I›¼)’þ‰èRUÛÌ(Á@Ú”µ²âa»¦Ð£ñ Ûå²ÛšÖ/ì¬ý&Å%é¾ACF÷êÏa¶šƒ;öùZjûâÛQBÙ„ãljÎYIN«ä…{Ïy|—hX®t²RML‡WK&q¨aEPjÍ–_ê›Í2ÒÙmYL¡£Ý§ÎŒrêgsÓ¯NãÚ‹+A׃²„7g¨ëÞÊN óké…%¦~aÝ–o¥­~F¼».û#3{9D«Áä1;â´æ ÍôQôÃZÏú8w&_a†¶j¡ã÷q ´r©>Ý}~9ÃQ‡“¹ýñQËöš‚¸¸ÅÒRß +nº_Ø;úáW„ZÏ(œd ÆÅÕ>¤õ„‹ÁêÍ¢*qöŒ‚#röwQ;£œjÚÆ^kNÿyŠÕzÁ tjY×rCD[")Q’£#˜Øn]Ìcõ(ð(»CÈ=g}¶F`³k940Œܧk¤ÿe:ä#_tRáY L©£½N‡íAKZ' KLH§£tvH¶ÐSÑe6óSò<ø]©k>¿2 GÇNê#u0UóQŽÅÕòK»/ó<'\`ÛyæÒ5êLZ íèÄn™çšz‹ˆÆL²˜)ÏvŒX¡[M5þÉž„¤´‚o®HõÌLg‡œQäzä<¸±5î6Ýc²±ï.U¨vÉM{bUWåL¼Ù¾Î,mxÙ*û+‚ikX‚â{uõ<„NZ'8ƒ,T¥~ Xè%{2Ñ/f>[µª¦Dîïö|Ý¡±šöœ©.q´Ÿ›l¢”„AMãSæKæí3r,ÁãZ<Ë›¬ïám)œ+h¯zìÏa~¥^Ø‹Yºxà½M67­ +}¾Q@°ë_Â! ¡nÒ q£^c7Nh?–Dbk]z‘Zøù·Íà[ÛX=mÅ›P :žž‰ÍW½G°tC#<áß×V Â'¦ŠÒyÞÄ1ò\ðÎòˆ¿ƒˆ§9&åŒÂT«âÞ°;¯oQ +Äd²’Ø[EÜ­°¿ÈÇ`n—ÅædþǦiBŠFtù£¿ mŽ<{ töJD|Ï;±Æ&G‚iþco§Àå²-çaA3©±W(æ‚2MYÕô(mò¤ œFã³{gþz&V__éa6ÎÇp›¯ØalĺÃuwðnæc"8¡n‡:Ñ!1w‡Í‘˜Ý¿g•Ã ˆ%ù[ÛÃÞI‘nÓåÙ–~gdº/~û¬ugÉp¡`ÁPþôTiHŸì2\)ÜЙÍàÿ®ºþ0æ‡zx)œE½ Úéq;7,¦ýs¸ƒ,ª‡izÕ­éü*ið¾\~]•mî§Æ Æ K•!ì†ß!ou4›¿›û‹†«ðw<«^UG‰/)cy¯$Ë‹> täCÔž•6rеð‚jåº)×ä; æC'17'IÙŬõ1:Ï–¼pV%¤»Ã +2°ÅѦyWýö¾¥jÖÎŒUËü«üÂ@¹,íðÊ&©¾JèS"§oóZ²,¢tëpbýèÒúc•û"i}„¦Z~K¹ŠX`i~l…`šúI‹%âù>ÑH—ÓVÒE©ÆÅU …ú©KÜÖ·w+ÁJS¼=öËŸ.Ç=|µ >üô=ÛŒ +’ú C¡ãa4Ÿ—7C‘ªÜ݃~Z¨‹ˆÃ©µ»*‡‚s· @qp![~_£Œ¿:[8&‹”ŽËNp€0ËtÃ"¤ü4q%¬i¨•F³høð¡HÁ81äј=Þü2¶ã³âL˜lƒK¯:ÏÂiåsB¢/]ûP6•[x² _#6}°Åf T¬…%*FųÖËÇ}Ù‘8?´Ï›P Ò¬“ê<7í¹õìÒÂgVq_î½ò±fKú–lFîkÉ(w(:Wâyx­¹CIBÞâ‚Û¨[NõbÖcpq¹Ú4j´¥"#žþs7¾hÐag•Þ^c QÔ'?ªæå´AÂÞÊ…øh¹(LMa.‰(<ûù ¹â¹®ÄÃä%ÄkëºT)ƽØGbª8Ø—ö×tà,D¿“¿¾µ•*Òš.S:µ›èY|Ùä'Fz„yÎv~lˆ²Ð…ÿþ5£àfâ¤û–¤A-í-³ñsEZEÄ÷QàÝÜ=‹þ‹ÑMTsî›?8á‡t2eVe&…¾1›B¦\q(ɽAˆð"_²ó8ŽvTD=°e™U³ÓÚÖ®e#"EîÍÌ-ûax‘Se¯;ŠF$­àÈY‘×Ç7¢=HÞ¯½~òp±Õ¿þ) ’ýÐ+PXY-x"yQùºì€ìCˆ«=³&o™ù…ŠÒ¿$¿Bb‰ÔÜ“Q80ƒÁ˜jU¥9Ãüró5½C£öñ²·Ëä—A<Õ¦¡1RÁgó[¼X- ?¼§µebÑ×k^6*Ù J ¬(І¦7Ü1)ºPïNଛ/r§t ªX¥õø&™ ¥ƒÆôÏážµÓfÇH­öõŒ’°.ÛJó9øP>µe't§l†ƒì1M¾#,Çä1¾#Ü­ÕÄš#[ÀN).·E¶/°6~ª§ˆÄ•T1˜ôY¶#ß:a³áI]ï¡‘g=㟗ì26®HZÄ+ØÃîk +z|~ÝX!ö×½’F`à[m”Ý»”}«SqÁM÷]»&ÃÍÝùԛꚥ‘ü…@ÏHÈúû Ónê +c—™XúAÒœü.; ®¯˜›'·Œ©½C›ˆ^zºnõâ塳ýæzI‡•f®.µ[bO\–äïoË2@c„ÓRvÛQ“5¦_nuˆ+ç±Þ0p%í(p“ ,\íqºGÞâ•ÕœJÈzpˆF­zè€ÙB+>„ iÎÞbcýЗޜ:È3\0/¡4ÜcàˆýÚTÑýŒ§m q¢Òß\cÇ úb{OhD~éì#­Hýð&Åû˜éì¿Íäj…¾d›ÐTC ÿcä¢Be({fŸ9¢z±í¯ãîí+¸ƒ»ˆÚ2HŸÃ{Y³ït”CX¿4±5=vßê „$òVëlY„ÒT PNóD© “¿÷Âá4¾4k[ç†ÙÎ|y©RøŒ³„‚KÝOsOsN±< –$õ ßO8,xìÔÝMSc1#ØÐ¥[±V¤Dæó:1lž ÔzÔ,•é$âλ›¼ôá·µ©¤C}cç +RÐ%åØWÔ糖Î;ÇOÏØŒI“ëöL%Ç’,úÛ¼F¬>žÜÁ|á™ôaײÍ4˜m?3’V=·_L=Rx;`‚i<’kav`Ä óè·¶²ú0 +pºs*Å"øVŸûå¦ä!¥`˜nƒ³ß+ó+ŽµÐ˜-”a¦¿FJá`éˆöF%†m„lï×Ñ|GÅ“ˆ9€lö,Îh¶IŽ¢‡…ÿNEI ýõ>ähÜ—ð¥‡Ôâ VG¯ªuIl?¦_a‡EÁX¬¬¡Ó]VbîÒ\ß0—ð&®Bs:¹¨k~`µ8î¶ÈÑgk[÷Þ–C*qÁí%b,ˆÍ¦Y=S„Ü›)kT}3ÐwZúY+Ì¿¸‰Z™ m@}‹å],×jIºJëÇ™Œs³mæ™!É=â1P1@\¨²5ãd £ÊÕ¢+ 3[9DŒ§Ý´º;A‘þsš-lFQRÒÀöÛa¾Övþ[A(Ïô䕨:>Üa$/)œ¦ÿâMU_q£ªÀX9ð(ÂÙ9Nø†Ó3+öš¸wQžugGвeŽd‹@ÂLkZÍöç@QvÛ˜Š!-+¬d±ëO%è \é¥&û)Ë£zÝ»èëvÁ10 䘰²ÿø£T7ÞúûèÌ›ó÷Ï eN£Ow·OªCõ§{gW¸¦u‡3Ž«›°ž¯uÇ*/[ê7,›¸GÜ°”¿¤Z·R ®²¡Ï”ÊÇ‚À“É*ì5tõŠQ,öO^ÇHO‡^!VçnõYç†ã2?K0eXËk¦·zy*’"\ü®æj‰¸gFÓïiêC.Níe†Êë”–"—²a÷4TÔîÛϹÿ)ÂP~CMH” sü•cň$çi~}c5mDÍÚ64òÀG¬þ¢ÏsÒœ¸—Ò¸×õs† ¹žGîì¾íʨ ¶49×ÔüɆÿ»–21“膞„P1Ün`‡\¨_RðbèÖ‡èΑ6ÂdÙ.ÛNã²êü–û:ããœÀË<2¹»ì¼‹¶Q†.j”¤ãôiaŠ(«Ť{+ÚE +çøx£ƒ®Ñãz#ú€½ãJÿy‘ÃEäºF•“Róª»ÿø†D¯11tü@Ct´Y$Á¼šGj™¯%?¼äX+å•?L¤ÔÛ˜‡Í”_´Ò#(?Êô\˜ã@¨nw"àYl™À<”w„ÙY)ª5avQÿÊ%éömŒ—êÆ5=–AâŒ*$$–-Ò{OcŒËüŒÖ3n¡÷j¦&•3ì£Ç€ÄY+÷U&‡Zg\'ãMnÿ@÷W¢4’: zvlAÚ”‘…‡’>é„Üo¦˜Vü_Ù¹šÇ};*ˆux’ÆC,(¨ƒ|ýÜñ¹Ú÷zw¹)ç`‚‚zÂÐg\ÔMñJÿ¤žÜɆ'Ž§¡j9åÛôWÙM¶¬út5àÅWª˜»ž›Eþvó[rǺ4®€Ü’™`h—=¿©ÆôB•š¹ÍjÂìI~ •[ak‰¸‹ +£fÍ6•9í]ØTÉ°bµ÷áú1K/š&‘9€‡e×¢hœj4Šß.Î[)Z +dCŽREm46¬8Ó¥N¸ «Ô6<É,ÆÐÍÉÎæi:ýx(¥Ët8ÐËn ÿ`’®! ©›86·§FåK•5JíB«×½VYg©»,&à1:¥ËãŒ'„D=lï«&è©IãQ ¯€äÌWƺ¥„RÒŠHw²ˆsë&üÙ­kèàûmïyoµ©ltxebmHçfïêïo&Hì*âj¦Î¾kÒrX›0 — ó=è^›,›.Âå˜/Z—[’áXýõ~™?4ÒxÈÙ'€äñq ´¤ª^JÙ[K™†OøHÊW|Ý@yw³IÉ:—ˆ™ô U-MÎL áÖœZàZÌBÊíXÃ6‚|6å˃ÃçÙÚœ—äºëZ£ÇØų%GÁc‡0Cüs‰ö[}‹#µ\ˆae¤Ãú4R{ ä{ÙãaË4#ôbÏ7áÅÂ…z¬«@½‰ FC̳„…žóc’ÒNÜ4.~4\jtÑõœáåxþ;²![EâOB ÆwkäL•1Ó-M‰Ë㤶@fõ$²&©U"Ë*u A½ +¼ë0å ®ÏØ¿îZïܪc~[Q7µê4è©Hšñq‡Ôø°7ò=­³ž‰’ §™òÆú˜“duˆ?ÎÕ+r^9kæÖq槜a^NžbÁ:ÐÞ“ªC=>JÅЕd›dg‡¼]ÕúˆËz@øeaªCšs5z Q/FÐé­Dú÷8È«âX²D›íŽO@Ñ% U÷Méd>kZ|èdü%ÎÐ?,cYÎMw5ÊÃÃP|øTëZBŒåæxM~`Ô•ä×P +Ïoé†-Ë»ç² ¹ Y¶ñ­Î±‹èÞÛ°ëÙC¼aŸèß7嶸מ +뜻%CAÌ‚¬UV´‰Maü€¤Ï¹uñçó„áÜêÀ:œð؃CÛ(|#ºÉ& ÇëéòɼÏÈ8GÙx被 Š³p<BÌýÀ«›[¤Êñ+ÇÕ˳ž8b׈×[ÍT|­¥#NùæQߧCW;Gˆ|SmÿFÞÖil±^õãþ™ef C¹‡¸·á¢y JòëL;˜L]¸îÙÙeÂAÚbˆPAIÛdðIÔPîÅ¡êîµx£x¤ÀvóóZVSshö†ñ<(ïmýyh·-®Í䦊ŽEʼnqØ•!fmÝSÚ‡ðËZŒóÈAöÉlxýJ|Ÿ¶q³åT ÒŽ4˜Ìýý—HUUmnˆ øCWÜ]Òï[÷²;ZØtnh3¦œ¨8 ì.(Ðë[Ù_ô~{hRÒ¡tá%kj†)á¦U12Óx±g¥×_nŸò‘±q»ÉWŘÄÕÜh95Ýô릆‚˪¿´¥eI]"è+©$jW M vžÈæ ZTb"}¤ªTS ‘O{hŠ?"ʲ|kêz*uÖqÎtR‡c7J—‚5ø Z‚†R +×·³÷ŒAÿÞ]ÿ¹:#¥µI丙û@òñœPœ p9EñxŒ9"úˆçFëÒ1“ä2cÈÝVâârÌàOÜ>KÖ>uÒ»jì¡ír¡Ž#ú$ÝQoë <µ ƒº²#×_›Êÿ~†L²¸Q“Îxêœ-ñ9t­@i_Àš9™’»ÂuŸîçrÿ +ÑÅÛ±åprkBÙûCzÆaÑÓ3ëÌ"!²2ö]3¾v{ÌÆY­»G «Œs» Oå×náR¤C2¾&`ñNƒ§Eƒ“\ÙÍ9È&Bê.üŒ¶Ù· nRV'“BV’äýáú%h:¾.l¶CÑy%4KÉÂTÙfÝ4„T·:ùÔÖ4_'áULšj€žXËÜý¤öiû ÃÆûêç”´c§=`²¨øqªe˜ßC´Ü¥îóÚlméòùfôæw Ñå#ÑÇ’tx³%;$àh én÷ý ‰7pP0OÇI¢£§f2TûvÆafÕ4Qö“ ˆ,‘XûÜLܧ–zá_ÐáVM¹‡¦OšdvÉDþeQܪ#éØ©èªmc…PðQh–ȳç%w"?/]]‡iîä-7.ã ’ÿ¦VÆ|K‰bÆ”`ˆëF¡·bÈÑ¢-ñ1Œ¨y4T,}ueé'ÊÇõ»•ã Nø0mT#?[½ø<ÿ=†C³)õðœC“$²h,™#O±Píe8ÒE(,–# s¼zMÎ)0Ý‚³0µÀ²DU4–;ÒðÕ…1¦ãŠ~Ç0W€/MY$g´™•A-5 Òþ 7ãnîS}Ž@N:°óï3ÆúZ½Fõkwy<Òð‹÷ÜhŠKÏ=s+8T¬ªÈáö@°on»ÕÜDük w¢ïž@8'ïop°ò›KéC©ºyϚʡ½ +H¦Ö¼9Gž¸M‡ôº„þP¼¡ïÒ4Š›µ.¾êJøiˆG•Ä$ …hÎX÷lÕ-DÞßÍ›á/c;§Ü?‚Ë¥9‡l®Ñ{Ä­Æ»òni†n½$›B×:õÒ©~’Xvy x’9c…Y + w/¼ÞU·O§”~EÁÏAç8Q•|ðŒGÇ=gý9,?YÁ2Ë2L"ôÄEñK‡æPüÚ÷AÍí"I1„'{†§³ úº¿¯c¼NøŒß_lbéøûö— m„nĜɫí÷Zäo£‚³|t0ó>ú>S‹Â™ÔRú—°zaI¿ î%ÕA˜">© •N~ú‚×-† ®2-QVçh-‰úó ýÞpܹâÛ/–¹"5vÎf—GWnT66þ8éô^úÞu¾4+k‹O5Q]¬NÙ  ¡-ël_M¸k˜ÚûAú=é&;4³áhgVå°CºìÞÃ5ÉÕMå×\Æ»8Ô\¬è”&fO³úÇ;^‘RÒ.æ,S–¼÷ƒ`÷‰†¹¼3y°f?s&†ñÊ; WÙ,¼K#«©Ù¯®øbj[¸_VM2ë*BWMŠ¬3@¿1(Ÿ¸éŽ÷ÏÉXúŒ¶UÑäDär ÷ñÇtƒ7Õ‘l g h/‚Ÿw˼¯rÔú'‡cÀUµÁªqFÜŠ%ÿÖi8ÉÜÕYýXò³+~¢‹Ùäûó¥rkHú¶>O­ÐÑѤ²v†1˜#°^:á?Q7Q¥×8Tnn¨tÑ#œ6nœlÕó Úî×îŽq + Òo)³S™2áØ¢c—¶FäKa·\®ó*‡©‘@èž›XsIÅXðûh‰ðeýÖ8%W6¤¹¤‹»Ü²yÕŠ½¢uoUêJP'mͧésŠêø?¹ÄÆŽÞמ+Ü¿eB*£HH:`rÀL]¿ºH.âØð~}Êη¡>¼üHÇ8š½D ýâ.ºQÞùÎ_]Ì—%×Ïت3©W$@2?d…°Õã¾Â`¾²ß³Þ׆>xÊ:ªÔý°™9•YæÒÊßÞñ˜¥ãë^:?Ü'°‡eIº¼¨-„~ä˦MÕ7W¥_ÓÞàÁ¥MxqÅß)w¾€Ì}®+È Á‘ÄâGu™.­Y6¸D£‰ý}KCîý§WçRPn"8U+Sœ÷ÂøÌûyvÝôL½3ìüî3QÁš\É–ä>¨UHC{ϊѼ•€Q¹!÷Å“÷.¼?;L9§ZšÒE¾é«v¥Ž}03|­˜6þ–ˆ¶9£,whœ-ÇËŸ­×;?zøpÙÍ„y8àŽ9Ë¥H»ÑHîÍÄû-q˜˜\—1άÄ.5HLUcß|{¨8óŒòZßÔç`äô³ÁPß½Q5åŽèz”=ûŒW0zúU÷Þ r còRˆžÿžDCh-&¦)¬u#Å>"1™k–ôÿ »žÍÌÃá±N”vD#¹¢A窠›`_ÝxXÒÈwgÞ„ÏÙå 솋ÛÈK+´CܦA"Ê +âc§x~XÃJo(¦cé;‚÷ÿ¨š#1âŽøé}SUx °f=”4+ÿ䎧õZ›…HK0 +—€_úØî*Ý– ·£ý7<³Y6ªãvl¤ÎݱæŒú‹Ù¸™‡ÈÈc?m·Ò†h¡ˆÕ©Åç•¥RäÍ×”»L|âÊLwõø Ρò°¤¼AçYKr¼Ï¹ÙÖJÑkW½b%òyQ·ŠTæ9æ‹Ló"$N¬½ôž‡9ȯòL¡åùö;û¿ZÆMú›¦Ýj{wAÆILTI¨£%èÔ&ëö…ôâÞ %§½(1ã:«/h•¶µôÕ9óUÖô”‘­Í¡i¬rÝxUæ¸ÂÝPÂ#á61”#,*@Š –üb±·Tx8ÙÄç{ëG79yçÐê°ÀCþ“væ$Põ`Ò匀V–ƒÿþu6®%…Ùqc†¬Ó:†wtÎì•NôwØÒPÄv©*û&<û'ývýЊâ¹!ÔA"OýMBð¼"ðÛQܸ…ÍK) z²>Ç'áØóô-oâŠÌ#°±ÛÓ­ÀD/&Ësg k7/;ô^D÷‡ÞKÉÁ¤ ŸCH-²oS<ÛõCoõšÂÛw˜´øŒª"ØK–_Š­"H‘¬ûVpÆsáõpa¡£_Ì×SÈÚua¯õ°Ü±l|ÚV±{+ wókÎ:¤6= s÷(HfUôRê¸zP¢[E  ïcYÄEùºŽsûr~3§Ÿ°3ŸMÆ?å¦T‚°ÍZ5ÕèR˜±˜rL‰buO[ˆ`×w\ÁU·?‚‹œWà&ó+Дzu(“ Ø!ÌìÅûR% 2ú§8xdßÿó <ÌЃ|Šˆîç }®rw‚RÕ:Mp’òÛBÿÉ]˜RòöÖ„½®íX((gÿ¶Ä?ɸ‹e»¿è­ÚXÄ`]¹#ƒÝ’X—ÕofQg è¿ÏU„»7­‰¥äœ“sõö‘ ý£Ëw5Y¬•ÓaM(Ã]Fƒn\^¥BW¢É–Œ~3 +ܯ*ù V}ÒD¦ÿôð¥ÎÈ +}ˆÒçq=G/¦8õ6ÙüÍ/]Z?ó{P>yêU•œµú}éË2&@žÊå:Þä®þ;TÆ +݂Ư9ÎÖïSftt7,-–‘hV©©< ®ÙÒ]+,àŒA‡Ø  •;…ÔzEå]þ<Ïßý‹Ìɤ C™Ñ6ïðÖR®{ÒºsŽyZÍÒ+±êÈÜôÄk´ѤFÈZ‰!FÝmP€×:%•éd +Ü)„lk2'¨ á"€”Öó±âµ|syùͱÕe€\ûÊJ;YýMªI­‘_£ƒ~Æ1bfÓõÝd=–ÙþÅ|SÅ=UkΫ +S­‚DÍ0 »(ë%ªUÎ17%g:F‡°ÞZ?{¡ßs·1SÊ« „]« +G7ôæøÆnuÒ{«ýef‚‰@ÆÚJt'D©Ñeèb ÕÓþÿkŸ,ÛšŠ( ¢Ä’n¤Gw3pÔèÝH·„4 I‘.é–îÝ%HŒîîÚ{ÿÃûí>÷ü€óá<ÏñÊ@J>N‘÷x°íþ®/Àï^ÈnÙv®Q’U õ×=[#Cã]6öçÑŠŸ‚h& ’Œ# ëyƒòk»6úq +ÅGÕkX:gׂ še£¤xu®ôØ\CùqKå1¦g ¡lø 7[Ù²Ì4Òÿ¹[PÞÿøç¥ÏFÔ´²ÿšûI#pŒ"­ªºóöWwxN¥&ÿÊYGúéÆ„¾åoK?\aùt@½=¥¢D#UŠ&ÐmÂ΃:Kó#˜´ÏÙf`ÃN¯Ú¬5}=ÿúfy$V·‹Id”-é%#©¾¯{z²5…رF’oö¾!²’»÷ØIáMØïä†H}ØÝÖR´x`î/Æ]è›Òª^3±Í7é¶ûñâ¬Â^µñŠ +·(FLH³~å¶ÞÖ@Õ6Jäó¾xÌ0V?K£ÈÕJÑ}gy,‹¨†/ã©$þ¸Ì~“Æp\!#…þö/»-ñæ –Ú3Uv+l•EM ´Dýý_O‰uò!÷¶:) G‚·Ñ é91¬ÄdÐ~í@§q&±ÑŸ<¹¥ËŠ)üÁžjÄÆpîp ãO`6ÿÓaÌ€“Ê ‰bœ›³ƒø*Ln•OA‚+«ä¿dWÍXäøkÚ—­ ÞÎÓÒU±?*›¢jžêß_ ++µ¸¹­Cí­u†Æ…¥v‹øò¬WU˜}öÔ“LÂØÏÚ(kœ¾¨RoiÍ^$Hé~ÒøÈz’T ñ׿·xû0­®Åψ_ShúÜ2\o­EŠã¦=U´ž$¸_N Ó–jz͉Q +Žò2Oa}=AÀmãUv”'·ýÆû9û¨,Yó‹Äg“ˆÐ‰$¥°®ÇªÍ3|Zí-Ä +ïùnS;ÝŠM‚­fˆðÓ%¸<%kDpu47û95%–T +G“¢æ×*T‹J<Èü«˜t‡'On¬ÄÂ.ÚrÁ.0£€w=J/ê_GppÄÒ A߃Ðd=F¹­ÖO-ZÁ 9†àU‹¯ùsÃÄh #a™jÔì‚NÌ– tNcñ§VF¢ïÎ{Ȭ¦ˆUŠñŽ*Cs~ö²sg_ܱu™É¢QªÀU4“å²7+ç!|¸`Të‘…>“¯7º–s™as¬G&S]EHøáWIÁ`³ “èÖöAÊ;ÒteÞÇ¢œauÛ,>:.² +ðž¯ÔÏ´ZÕ׈‚œâ^ž>ñ·!eÖ²ØäÛ¶(¥/J‹@Ëz ¼–F]¢wò¿ÝÓÏõwÁ/…=£ÆhŒcsËtö„t˹¢Æ1|Pú1—ŠR,·²ÖÑï„$8É +,f¬S¼‚Ô·Nï¡Ó¡›¾¼xœñÏ‚È¥éJ#ìKÛ1íü±SŸä{årsê,<+ö‰ÙöÙœ¼U1*µþôD'î¿ð|ÂBÕF5Ç .‰Õ+‹f¬æ-åuÝÓ±oFã”’zeí­ðÓ„A Ç«á±™—KØ+·,V cšðôŽ­/EþrË‹î ×öëMƒ}#j€œ§Z¬R‰¾^¢/dõäx”z[]ï9OµÈŒý/Âæ7¯>’òT-)AB鈢C• §x”ï±IàI稂i¸t¿@€"JUîU}mÐ'sÌ’™ž,Ð~bèºAòFKEOlÔýðp€.Xb¢ùçöÞ†£EcÌ9¦È<üE¶0mª¥±|ÿléæ3‰•Ïý="þØæœÖ¦wÆ:—æˆà#!¦%Ö§’\Fj¦¦Â‡ÊIK°';Iª…¢ö}hë­w™å9²T¥tM¸JÌtü‘á,H‡î"ûDHÔz 97qtÅÝÄŒ‰ÂuØ VqtîÁô™?'¯`¹NøÊù3²–œGÜ*˜é²HÚªÒ ¾|W]ò {êîTõÌqý]A÷,’ùÚäÊÖoU¯¤h¨,Œ¶‰wnmƒk¥ºþ Þžê|f¿â‰™TJ8‡6¨Š5¢äÇ„ãÒ¢1,Ôlvˆ^Ìýµ•Žã¦!ã½ì Z¿ÖæÚYôšÎß×b&¾¼ÿÕ‰šºCåu‹Îø{é±Âf¹ªÛy¡ "|ùª<ärÌÌ„)=¤˜ï0gxÛS°^Ø«šéqGGÙàèá´àL–{ù¾±~û™ÓwéAÆH¨º…°íMÊe:ùf> *®b&¸Fd!$xöœóhú¤ýGr55õž?õ'GžLq ú¬ÀœÖÕéž´AA´F߃ƒCÛw ´VøsÞkw{竱>·0¾8ÏöÖ >¿ô=Hq«•3õ¦x:ˆé©d9QL ­þ°¨]Y¦šÍ"±J[^}ÔÊåâÍò"5=4Ÿ*«cuýiÛë‹%ïQˆu8aA#&S¢"\£¥å^u›ìèès² ×CbGó|cïî•ûl.lض²¡5·•Ÿò6Ëü¥“)>5“ܸþäc%Y ÒZ}ϲJ¼G=™ì f¡»ínÈ!Ò[\ŠÒ^H0©mÄõ˜Àw'¯E¹íTŠÀ—±¶À˜•«qRð}øù[õ{ñ½ÈLðƒD߶ÔÐWd6¬!Í<ã÷é](XâJKR +K› ÀöYt^¬evQ&57Ñ„t9Æ©‘;ØQLV2²ûËI2­U^¹¨%Ô~ŸŒ×ˆzW¶ ¤¾ÌÄi~=úï°VÕõZ5dw0uÃ{+M VÅkzÏjG‰7¸zb4@ˆKPñ±Ë6§ð]É"‡ÇÂЗË×øVà]ßQè³ø%áRˆ¥¯>2àsÙsÍ@ü+§hœýbyZÃ÷-ý$ËbÇ;¨´²* #Œ6^ÿ´Œ‹Ä*jj¾}5™üÊ­tÿg ›­ûá=)ìGõ™;RVÛÚ½wV*îM\ˆšhßn`ÇPÙºzÇ'I~©VŽ;&븙i—w âc3:™S‹åa¥40ÏZ: Moè¥Ø~ƒÐ#YcÑV„³IF^¸Övú¾&ÕÍBoªzôåÒ½¢šºˆ<è@Õ Ž!ÄVo£Cé·³s~íAãŸ)4°jsY™ÖÑÁ¤¤Òøɉ cxg4Hc=‰‚­|(—æ3§‘»Ñô¯ðÑqr1¥~tÓ™²süçŸVý;Ë}I†õ„=*š½Â!³ ®8¸²ù ¢Ÿ{J½ÅhJ$‘¹Í2ÕtKcÇZ=P¶)»ûøÔÂwË,û«øƒˆcÌm#ãdxÐu!^ Ú9ûi7ŸÙJcÔŒ]+µ jÆ»Ò_€[hI£YÉì0…òÇ*껪¦úݳj€í¨ž¨ß`Ù?8sGx9g3ÎîèñÙt÷:n:—SúluHx‹œ›ÍÉPo·«ÃJAüÕh€ß¾ÅW'ˆÃô´B ¶q…¡Jˆ`“ý kaæ®´bg>–MO”¶æB8uk—ÄþÙ7)Çê®Ü¿5GVQ(ë¿P­m-FG*åTA¸¡WK2z)· Ž×?3Ì›QOl +s¹xŽ5WË–§zGϺß?ÁyËÇDóÛ8Þ6<,óyÊœ³%ɾŠaîjôër¤ôç ³L.¸!åeÖ&A—¯y!qíµ¸`Û®8 &ƒûCá°ˆ×P·KÄMZQƒñˆR“!»V¸x3ËßÀÃ'£l{…x|#”ÄÒ,ò9r&tã|¼ a¥ïéæ3sawÄø² Ã××ÿuåÝ™×Ãùv¦&R®É;Ƴo©5$rÇâ¯%ì»iÕav·4Ë EìØÔ;E6'µ…¹ïh;ž7\oqkÙñ*¯u¾+ÍNcýàÿOÃõÿû‚ÿ +¹ƒ%ÔÕÝÙêjýákáüendstream endobj -885 0 obj << +895 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 2 /LastChar 151 -/Widths 2103 0 R -/BaseFont /NHNDXP+URWPalladioL-Ital -/FontDescriptor 883 0 R +/Widths 2133 0 R +/BaseFont /EUFTTG+URWPalladioL-Ital +/FontDescriptor 893 0 R >> endobj -883 0 obj << +893 0 obj << /Ascent 722 /CapHeight 693 /Descent -261 -/FontName /NHNDXP+URWPalladioL-Ital +/FontName /EUFTTG+URWPalladioL-Ital /ItalicAngle -9.5 /StemV 78 /XHeight 482 /FontBBox [-170 -305 1010 941] /Flags 4 /CharSet (/fi/fl/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) -/FontFile 884 0 R +/FontFile 894 0 R >> endobj -2103 0 obj +2133 0 obj [528 545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 0 0 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 0 0 0 0 0 0 722 611 667 778 611 556 722 778 333 0 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 0 0 0 0 0 0 444 463 407 500 389 278 500 500 278 0 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] endobj -790 0 obj << +798 0 obj << /Length1 1630 /Length2 15892 /Length3 532 @@ -10157,7 +10307,7 @@ stream xÚ¬¹cx¥]³-Ûv¯ØfǶm¯$+6:ìض“Žm;éØè°culãëç}ÏÞû\ûœ_çÛ¿Ö=kTªY£æ¼îûZ”¤ÊjŒ"æ¦@I{WFV&^€†ª–²‰­­‰9ÈAžQÕÁÎð×̉@I)æ 4q9Ø‹›¸yZ@s€8Ð ÀÆ`ýúõ+%@ÌÁÑËdiå  ùËAKOÏð_–\¦^ÿütYÚ¨þ>¸mí€ö®)þŸÕ€@€«`²Ä””ud¥4RŠ) =ÐÙÄ ìfj 2ȃ̀ö.@Z€…ƒ3Àöß €™ƒ½9蟭¹0ýåq˜\f ¿a@O3 ã?Àèlrqùû ¹,Mì]ÿöÀÕ²7³u3ÿ§€¿v ‡äèìð×Ãî/ö—LÙÁÅÕÅÌäè ø›UY\òßuºZ™¸þ“Ûô8Xüõ4w0sûgKÿÂþÒüE]M@ö.W §ë?¹Ls‹£­‰×ßÜÉAÿ*ÃÍdoù_0œ–&Îæ¶@—¿4¹ÿéÎíð¿íÞÄÑÑÖë_ÑÿòúÏ@®.@[ &V¶¿9Í\ÿæ¶Ù#0ÿ3*2öV–ÛÍÝÿs:ÿ«A4ÿÌ íß"LÌìm½æ@ fE׿)4ÿo*3ýωü? ñÿˆÀÿ#òþÿ÷¿kô¿âÿ¿çù¿SKºÙÚ*šØÿø; øç’±ÿ?¼Mì@¶^ÿ7ÿÿî©üw‘ÿWW“¿­±·ü+ãW&–¯ÿ@.’ O ¹2ÈÕÌ -`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYSWMSG•þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï +`abû·Wÿ²kØ›mAöÀ¿šþ«FV–ÿ†©[Ìlìÿi>ç¿! ½ù¯ÿ¯LÿªžYI\F[R”þÿ¸WÕlÿΗ+÷¿#”ÿN‚«º—#ð¿Òi)8˜ÿçâ>QQO€7#+€‘‡ýïdc|å`÷ý¿äþë­L\Až=&Ö¿¤ÿü²ü“û? ƒÿF#aoæ`þÏ쨹šØ›ÿ·ÿ4ü›¹9;ÿUù_7ÀßíÿÇú_ƒzÍV9˜ñ[§ge¸Öáæ OŠë ô±B‡8–6ªÔ8ôú§‡o­4~« ajšæýh÷Z:q|ß—¥;íñ¥îM^ù’Óö¢ÿ¦êä¦?d6,EÎ8ÕŠö¾\”ß‚ÒåbÑ<Ø™TQ5,yƒ!žîdw†»|¤ w/ À¢xpDñ3KkˆÃîBkèûqrJ•tüø@=462ü³÷ºŸ>7ž’Ï ™**À)—PHW£B¢ªU³m·WÛÔOrí]VÉ• $«ùqyĤ"õÂzŒf<0ëûë£Îðf}/Ÿí¤>bêFè,VØUd‹ÕƒæÔJlNÍo’©+¬OXÏ1Ï-¼§c-NÂ1ipÝ›í\AÖµ?ªª…¹{G.ž'Þ½µ$5õü^oDÌÒ’j8Á¬R/ë‰yÝ࣑<Ì`½^ úêì`uvdé,RHžê$žkK‚>&Y ¤ºÛ”OØ&â„o™kâÆœm§Ù WëÙÉ ¨œ/û«Ð[BÒó´`Ûtä¯äÍN¿GfáĈHªýmVéDÇÏ“Ÿ”Ä÷¦Y_kÉóÍ+èü1pÇÒ¨åÁ³ñÂjD•jÊ @@ -10219,35 +10369,35 @@ MI ¿n$rÝ XðD˜t ÎõÓ…”2§—n„sÞmOÆ„ ˆ;²ÃßshuåU9ñÖ&;y-sõP~K*ªÅz4rnp´}ª÷œõ)RB—+«å—>¢cI£Ž¹w× éhz€Ì\mm £MúHþ×<×|Ìï­&‰ Ÿw³s£Üë+\?VË´<=yò‹ØH»M'²ñÑ67Cøoí+A5x5½·x¯'_Ë c!vÜ~óÓ4¶bIpµP]ãH^ŒúÀnkLßYßÙ„æÀ,•‰)tCœrÀ‘ Çi†Ï±m$hýÈn.ÿ¶»öO¿ªWÂ[–{OFChÓ'žWùÆ*6L‡1±’g^H]u Ââa3ð¸g@—TÕL_1@d7¾ùÁ“†µ‹Œ:…‘XF.ÿ§Òfb1\ÄñSÙ£Ö®TÁIS ÒŽã{9.´ v´ôPš_$ ƒºÃ™.T€Áj”¤RÚ.zàÂiXÎ^;-”ûkwå0HMKyÃûSc-‘tkâôk'a.*bí Û¶4ŠdÇ&ž*qÉŸX‡ÒÝÓä"c°4 *+9‚3£ cáE¢Lg%ãŸïÁó§KíÚï©=ëg‡~Q)œu‘Še7@ô`­¥¡c˜„s2¬ìe/ï´Ã÷5ØI*·[ÔrHîD4;"«hntRÉ´c¬¥ŸýÝ„u å{ÿÁØ }hë …x;³°çlqf—š “d79˜R€2õ¨)iµ†–Gö»€ê&‚—ÜÞ¨CšùŸeVò]ÏÓ~„ð¡T}îY¸dë`XÕìéÎ<òe JË»1ÒXê¤QáÀ#÷gX¹;«ÜÉà{}¤* ½lÈ»€~.ž©kÜõVÅÇ®þÒ€§ú‘7ã$o—#€àkص <Éâ{ -¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,ÊæüfÔendstream +¯41¶{ºQµÚâl·Pãg;‹($@QQ~:ú4¥ /麞e„¼æª't“Ê>~œÍÆTÂ={š÷ÈcW ä­ë6Å͆ÇIjË‚¶{Al ¸¸ ²œís è¹”Lª £ÈàýÞùqœöÇ=*Y€þKTØ&§Ð9æ2ös³Ìü±×îªÊ›õäõ§=ìÌÉIx=ãç7åv[¿Céhw›«Ó(îl*ø®Ÿq ‰Ëb“ÛfÜèY àûYÚÿßRŸåÆ |)¶U-*ª[rᇻ……øw8me-PÍsóQîñúW™N‡vé¸î²”š{e³ã=öEëe>*­xQÿuò_­Rñ„çÒ˜ ¢þ«Iïç?d¯Y¹Æa½/Kz†Âc™›gZ6qæåØöì—3 p0, HÎIM,*ÉÏM,ÊæªlfŒendstream endobj -791 0 obj << +799 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 40 /LastChar 90 -/Widths 2104 0 R -/BaseFont /VZSVYR+URWPalladioL-Roma-Slant_167 -/FontDescriptor 789 0 R +/Widths 2134 0 R +/BaseFont /ODIXFB+URWPalladioL-Roma-Slant_167 +/FontDescriptor 797 0 R >> endobj -789 0 obj << +797 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /VZSVYR+URWPalladioL-Roma-Slant_167 +/FontName /ODIXFB+URWPalladioL-Roma-Slant_167 /ItalicAngle -9 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/parenleft/parenright/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/Y/Z) -/FontFile 790 0 R +/FontFile 798 0 R >> endobj -2104 0 obj +2134 0 obj [333 333 0 0 0 333 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 778 611 709 774 611 556 763 832 337 0 726 611 946 831 786 604 786 668 525 613 778 722 0 667 667 667 ] endobj -728 0 obj << +736 0 obj << /Length1 862 /Length2 1251 /Length3 532 @@ -10256,48 +10406,46 @@ endobj >> stream xÚíUkTgnõJÀ+Å€€¸ -æ2%X4-wDP¤2$H20I0@¹,P ‚A…ÊE ÒJi½ ”‹ÁŠ‚§F„‚Ü4 +æ2%X$-wTP¤2$H20I0@¹,P ‚A…ÊE ÒJi½ ”‹ÁŠ‚§F„‚Ü4 & X¹ê -ºè±KîþÚ³3æ}žç{¿gž÷;ç33ñð&8²‘ ØŠ ¤N®ÞA2É833'†ÄA2É833'†ÄràqçÖÉÚ¸¼ë;Y·î¹0=ð"ç4sÇA;hš}„ àD(Vž#Ž-wUÊ£úìùõîéMþÒ'Æ©¦)fÏZ½Ë¥3i±†Ñ¿ß ÓÄßIË(žùÊ] ×d̸6p[žt]IÊŒßÛhìbÔöКûrs›•›ì£`ò õª‹#µí!|~®S^«47—Å>/‡B jr÷<‰ -ÿ®~çœ>#†øEõ©ƒOKëåÚÝõz î®»½N™/ -µÜ:4Ò(®’+³²Zîñ1~xܦ£ûöÞÒ‡ñ‚÷t ¾ýÊ3 —á9¿ÒÈhcÍ~eV”žÂDV)äqNkÏf¦gx¸yú}¡w¸9/)À=à™ZÝ÷¼âirfÇØ–„1_u2óxë‹Á «)Ѹ·6ýbW©_Š¡y$|±ÁÁf¦@Ó±üÌzSä´ß`ø]ØßÅ-LÎæFM¥žýÍôEÜà“ßm, -!üm94¡ÜÜ—=7âjp¢ŒûLé^g_]flB쵧%õ„DàPYR»rÍü ëÀÎCûîSŒÃ㲎„™xh躗Ë.Ûk'$Ô\—-”…ÌîЉМV*¦…­FÔ=2À5½[wì™üPûR×ÈÉ?ª)–’Öokö³ïOWûlzyàYC?÷£ÐèÎú©_†çÍVS¹Ëúä—pïç7J¿üñ·¡ÒÉðõùWoʯʉ΄։Öþ›E¶TÅÑ“Êk•×Ç$ 7ìÍe$å-ŠOÂé,¶ižï…ÔË*‹GUM=uó)ƒ¢…0订êcú<Êyê<^a?YYêOÿÔ{߯qT1ç„ãó_N’^'v?רk••ù2ªR¦¦K´Z_oõÈjrÔ“ÍYY2(Õk$ûš @šÝî~Ã{8sç—Úµ¬÷U$FÛéx7:á,?ÔyòÓæݯ¸ùOiD§È‡‹øÄuþ÷T«TêSFaô{ò€Š1b]aÚù_Ýv*S’ç#¶ä]k¬Øu ÙìÝò€vlÃlÓËD Õ7™U¦«‹ûJ*ƶábuÁÀ$ñö²×p}Â(5ñiQBCG¸ÇÀ\—$§!7!ÇM~9Šœù¸)ökµÑ)Ç÷D_uo€£ŒÚjnÿ=Õáh׺™;wáÔúBÙ˜‹jU´fŸîNç²QÝÖ…Zöî–[£!CŽWµ$Aü6ÍŸd‡š@Â!ß¼tÍ› ‰ˆINzÀxwÁv}ÃuÙF{I¾?>¬iÿ˜ú`v«ç íøT6Ý1¿é0S x}Î䇯£Ž¨Fü׆þÜ×¢¯ª«;rª³+Ù7ÖÅt®]šrZ9µqg{7áø®l÷GÌ}Ÿ3\NkôÏɵV'•Ç²;Bêmиƒ’ž˜l/^·`m`onç=òøàþßà¢vuC¨@h(î_<þuendstream +Z$eñaÖâÔÄ‹ì2AHAXæðŸ 2ÃPˆóaΟaë7ðòÐßᶡï, `…Šøˆ»ÿ58‘F(vÁÎû´h4jÌ¿ Y……⥳‰Åÿ¶æð°‘Á°fáz»–}RH^urEìgçnÿIëE[¥ºW³Ù¯66ŸÇŽñ¡žõ2 —Ž+¯—ãCúŸ³ìOꢗ 2ÜÓ¿œ.ѽp%­¨Ü/+žÚDìñÁG&¦ÉÖ¼²2eÊÃœ*øZiHoBžùfÛöÞémqm:gÙ*Æ¡ssƒÝÚ-½OXšn¦õž×x>ràqçÖÉÚ¸¼ë;Y·î¹2=ñ"ç4sÇA;hš}„ àD(V^#Ž-wUÊ£úìùõéMþÒ'Æ©¦)fÏZ}Ê¥3i±†Ñ¿ß ÓÄßIË(žùÊC ×d̸6p[žt]IÊŒßÛhìjÔöКûrs›•»ì£`ò õª‹#µí!öÿ\¦¼Vin.‹}^…Ôäïyþ]ýιýøŒâÕ§>-­—kw×뺻îö:e¾(ÔrïÐH£¸I®ÌÊj¹ÇÇHøáq›ŽîÛ{KÆ ÞÓ1øö+¯€\†äüJ#£exðص0Š–©¬‹fdþå—ÌÕåkE%›D%ãÇéýGÁª]à}ÕxÆáœXæ$3M/7øjŒ#ÇÛUY6o”ÕéõÔœ‘ÉûtŒ5û•YQz +Y¥8Ç9­=›™žáàîå÷…FÜá漤€gjußóŠ§eÈ™c[Æ|ÕÉÌã­/'¬¦Dã>Úô‹]¥~)†æ‘ðÅ›™MÇò3ëUL’Ó~ƒáwa_·09›5•zö7ÓqƒL~·±(„ðc´åЄrÓ%{&nÄÍàD÷™Ò£Î¾ºÌØ„Øk7NKê ‰À9 ²¤våš'øÖ‡\îSŒÃ㲎„™xjèz”Ë.Ûk'$Ô\×-”…ÌîЉМV*¦…­FÔ=3À5½[wì™üPûR÷ÈÉ?ª)–’Öokö±ïOWïßô:óÀ³†~îG¡ÿÐõS¿ Ï›?2¬>¦òõÉ/áÞÏo”~/øãoC¥“áëó¯Þ”_• ­­ý7‹l©Š£&•×*¯InØ›ËHÊ[”ý §³Øþ¥y¾~P{D².«,U55öÔͧŠ »Šªéó(ç©óx…ýde©?ýS—_ã¨bÎ Çç¿œ$½Nì~®Q×*5*óeT¥LM—hµ¾Þê™Õ>ä1¨'›³²dPª×H\š @šÝî~Ã{8sç—Úµ¬÷U$FÛéx7:á,?ÔyòÓæݯ¸ùOiD§È‡‹øÄuþ÷T«TêSFaô{ò€Š1b]aÚù_Ýw*S’ç#¶ä]k¬Øu ÙìÓò€vlÃlÓËD Õ7™Už¦«‹ûJ*ƶábuÁÀ$ñö²·p}Â(5ñiQBCG¸çÀ\—$§!7!Ç]~9Šœù¸)ökµÑ)Ç÷D_uo€£ŒÚjnÿ=Õáh׺™;wáÔúBÙ˜«jU´fŸîNç²QÝÖ…Zöî–[£!CŽWµ$Aü6ÍŸd‡š@Â!ß¼tÍ› ‰ˆINzÀxwÁv}ÃuÙF{I¾?>¬iÿ˜ú`v«× íøT6Ý1¿é0S x}Î䇯£Ž¨Fü׆þÜ×¢¯ª«;rª³+Ù7ÖÕt®]šrZ9µqg{7áø®lGÌ}Ÿ3\OkôÏɵV'•Ç²;Bêmиƒ’ž˜lo^·`m`onç=òøàþßà¢vuC¨@h(î_EÍþ}endstream endobj -729 0 obj << +737 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2105 0 R +/Encoding 2135 0 R /FirstChar 13 /LastChar 110 -/Widths 2106 0 R -/BaseFont /CWTQLU+CMSY10 -/FontDescriptor 727 0 R +/Widths 2136 0 R +/BaseFont /QQRSYH+CMSY10 +/FontDescriptor 735 0 R >> endobj -727 0 obj << +735 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /CWTQLU+CMSY10 +/FontName /QQRSYH+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet/braceleft/braceright/bar/backslash) -/FontFile 728 0 R +/FontFile 736 0 R >> endobj -2106 0 obj +2136 0 obj [1000 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 0 0 278 0 0 0 500 ] endobj -2105 0 obj << +2135 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef 102/braceleft/braceright 104/.notdef 106/bar 107/.notdef 110/backslash 111/.notdef] >> endobj -725 0 obj << +733 0 obj << /Length1 1616 /Length2 25334 /Length3 532 @@ -10305,7 +10453,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNMMB^TŠêŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ +xÚ¬ºc”¤]°%\]î²,Û¶mÛvuÙ¶mÛ¶m£ËU]¶í¯ß÷Î;ëÎüšo~äZωˆ³cGìsb­'3Iä•hŒí MDílhhé9*ŠjòÖÖÆvÒ4Šv6€¿f(!' ;[a'N€š‰1@ØÄÀÈ`ààà€"ÙÙ»;X˜™;ÈÿbPPQQÿ—埀¡ûzþît´0³þ}p1±¶³·1±uú ñ½QÉÄàdn0µ°6ÉÉkHÈŠÈÅdUb&¶&ÖygCk #€´…‘‰­£ ÀÔÎ`ý €‘­±Å?¥9ÒþÅpíMŒ,þn3q32±ÿÇE °7q°±ptüû °p˜9Ø:ýí“ÀÂÖÈÚÙøí¦vÿ²w°ûaó×÷LÞÎÑÉÑÈÁÂÞ ð7«¼°èðt27pú'·£Å_7ÀÎôo¤±‘ó?%ýëû ó×ëd`aëp2qsú'—¡ ÀØÂÑÞÚÀýoî¿`öÿÒpv´°5û/Ô3ckGÇ¿0±ÿéÎÕ ø_ª7°··vÿw·Ý¿Qÿ“ƒ…“£‰µ)-ãßœFNs›YØBÑýsT$lMí ôÿa7v¶ÿOŸ‹‰Ã¿ "ÿçÌPü%a`lgkí061…¢“µsú›@þ§2íÿ;‘ÿHüÿDàÿ'òþÿ÷¿kô¿\âÿ¿÷ù¿C‹:[[Ëؘü» ðŸ3 øgÈØþoÑ6Öîÿ§øÿ©fò$ÿ0N[!`köWzZúÿ0Z8ŠZ¸™Ë[8™L ¬ÿöé_»Š­±‰ƒµ…­É_=ÿm%€†žþ¿ù”Í-Œ¬lÿi<˸Llÿ;÷¿ýËœNLITBYŒêŸ©ÿÆÉÿÕÞIÙÝþ/µÿQŠŒñÿ\üƒ"(hçð¤a`eÐ0²3ý½rŒ f&ïÿCÆþk-càä`áÐú[6=ÿÅÿÏ­tþŒˆ­‘ñ?§EÉÉÀÖøïûŸ†ÜFÎuý÷Îÿ-ú?×ÿu7#¨µßvF\A–i™éNuè¹#SÂZ} #Áö¥ÊE~5v½¾ia8*õ?jƒi›f8¿ÚÝ—Ïì?$)ÇúЬÉzSL®òq¼‰(ú ·H;Ù¨ètKaÓÏÕ¢<¯—¤w@5YéUw§uK>Àqg:™ ¯Ÿ)üˆ\ üPˆŸìá|ŒRbQ»š€ê ÏÎIOžŸÈ†ÆGG†{oÁú°©rb’p¹€Â’FúýÊÁæÓT©©jUmÛëÕb3ô]ÿ””s Îl~^õ­H¹²çŸÈôÿbاÑÙ®ï岞ÒæNHÙ ™C ½‰h1R^iC«ÙÂ{»AùÖˆqwÛÁxyÒWcÁ·ÿ¡y÷'‡—ÁOéTñ´šŸ­wôêuòÓsPMTUËçýNÀ(5±†ÅÄ ö¶‘ÛMüc,‚¨×]EI[™Y… ¸îˆ0^ ÆMÏm}™× Ë 3ž@óÉ ª0öGƺ°>KÛyE‡“åÜTh6þÁØŸøÐJ¢w¢§æ_[c ³öB8xÕ¾Vk”Ô‚—I¯¿ä„÷gÞk‰òŒ+(}‘²Å+åýdä„P9Œ,U•äD¡&w("Z·´U¾D£|yÛ)Õ‚þ0ŽÖ)¹` Á6l¬NÒµ½žŒÍ&²˜ W WâãÆ[.¸N5ÈõëZS† @@ -10399,35 +10547,35 @@ A ­u|Ðí8t^ˆš/€‹MÝp­_’<{*ñ>Jn ÐÅ—6¹s²R¯aÆ‹úr×€]9ä¯:²(`\‰áÉlA7¾ĦK”ž·†9z8nb64Ë¢jE¢$µ1V|·ZBËÐöX#Y»ͪföWßqYûlf/ö»­8Fj…›ë_X1¡ÁèínÕ (N1©þ¢CÑð´ýÆ9(AÄEêÞ–«ôáÃÉ€ÖÜÑf}_¢£J¾:¤ íéJ$<ÂBÿˆSUÅöìMø›Yr¤˜¾ÃÈ×`Qíå?›Ù±VƒÝŽˆ½¸ÂˆÚÖñhÃÙƒXÔ‡7Ó¶,Í!Á•FÿÁEè^F ¸¯xÀÁ¦ÿàB*·ÛvªR&¤N<•ê`¢µ+çN¼é¬ g¤£Ê¾2f~mû„m}…i¶xÄãæužÙÆœ»‚ÙüÂx\Ôt{™C Àåò ›ËøýÈ·'5' ªzqvipd×kµ»¶j©@ƒæ…:Íw¾?bøàôVs,%ãIP¡ÍSÃ…„A³ô‰ìDª`Ïûñ,{r˜¦fY—AÀ˜EÏ¡+LNä^õ,¸¬Y¼B™¡9ÛœÐç†dbTC4è¿JLWl©0Âkž ^¸ùT›Úò«¾¦ét«§^Þí§/‡3SÄ蚇dQœv(CÜ쇵È%#¾j0Æ7›5pEZ‡ì—,í¼éÀOÇéÃõ¤¯(CæýéZb4üÁP”™Γ{5Þ…k`åùÃJÙãpÔféAvs,µp̈Õ.¨±g¸Ño¡µ°±P9:Ý,'c|Ì1eÁh†M~‘fQÞúûdú9’LÈúôÖN0–"/Ó|8׃ҿ]‰/ óûÚûس˜z$©Ôü³[<~q÷é#ƒä2 'óP4I×¥ŸÐ?`b¬FH. ÷R}ÿÀ#] «iÀAñ7FÌÐ5øùq6O‰ Ç/êúWbõÑFåq-¢´ð §]xžök%˜Ã–td˜¯‘ŒÎ¼r¿?qEµÀ¡Glq_åOÎ1ŠL$HülÓ‚|²ëÅ›:vÐ Ø›¨†À<¬è2ëg8„7ë%j ÅL/ARWˆŠmõƒÑ ±)Cðî&œ£Ò(q14ŒED;ÌjdW åqêÒÚ8ß'‡õt˜{r›`üz$¸~ЗV-ðr#QcªžÉ¹=H­EÍëCóIîÁÕŒ–aYÅuz8UG²þºÝ¡HJP+dGR]¤IؘNd'×DóN'é[ºqÆIÒĵF,·;Å—d•”©7•‘W­_ˆF®kô­é¢á£tΘ ~­ yTjænUÀNöÂߥ6”éŸì¶\e>:3‚t{ù^÷p*kõ!1ñÖ3«/¥tŒëÖÈ|æeWç¯ÛQ#`IbýÍÃ$ŒPÍXÉSKUŽž¡’` ËAÅžþ›m­%N©ò’÷Y ¥Ê¡K_º`ÕsYGõ¾ìŸö¨,4ƒ“³›¯HC'Ÿû89cá[ã Û2?ÆN¼ ü±ù#°¥ª0ägã¶,Š¢œ¡. éj”¿ê?ÉxG# Ò+“Å.ă-†cå-Yo¢UÄVõñÈö15Ò»æ¾Ýc@@íéíAŸ LüUÜêÏÉ…ÜÔ¿©ÿÌZÏ‚ñåÎSUn9“mbµf[‘€Š±ÑT8D1¿4г#hqÙך½E9É{Ь¶uîœb…M'­?/ÖGÐÿéε%¨˜Gš±Ñ3 ?hßó¤¸þa¶„çŽØyžÓ€’^`´ý×Þz\‹÷¶v«áP{ÑÑ•Ih~×`5»æ0ïfM…ÂÛ -ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶û?s¹Kendstream +ä&oH[œ¯A•9fÜË•ÿ+J†'¡1ê’ëyC \<†æ›îyʇfäiX.²¢¦ ËÅoöøA…°•#ó3ÆÎÑ—ï;¦ûÁ_;râw‚›ìĽÅzi“Ã+Yxh­ÀêÐÃz5xu¾5)sþ³py}Mµ~à óÿ¸ÿüŸ˜Øš9ÿv°3r¶ûG‚¹7endstream endobj -726 0 obj << +734 0 obj << /Type /Font /Subtype /Type1 -/Encoding 2092 0 R +/Encoding 2122 0 R /FirstChar 2 /LastChar 216 -/Widths 2107 0 R -/BaseFont /WWIPFK+URWPalladioL-Roma -/FontDescriptor 724 0 R +/Widths 2137 0 R +/BaseFont /GSFITG+URWPalladioL-Roma +/FontDescriptor 732 0 R >> endobj -724 0 obj << +732 0 obj << /Ascent 715 /CapHeight 680 /Descent -282 -/FontName /WWIPFK+URWPalladioL-Roma +/FontName /GSFITG+URWPalladioL-Roma /ItalicAngle 0 /StemV 84 /XHeight 469 /FontBBox [-166 -283 1021 943] /Flags 4 /CharSet (/fi/fl/exclam/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/circumflex/quotedblright/endash/emdash/Oslash) -/FontFile 725 0 R +/FontFile 733 0 R >> endobj -2107 0 obj +2137 0 obj [605 608 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 500 500 840 0 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 0 606 0 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 0 333 0 0 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 500 0 500 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 ] endobj -701 0 obj << +709 0 obj << /Length1 1614 /Length2 24766 /Length3 532 @@ -10435,7 +10583,7 @@ endobj /Filter /FlateDecode >> stream -xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:MAaQiªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS +xÚ¬zSm]³eÙ¶]uʶmÛ¶mÛö)Û¶mÛæ)ó”«ëû¯:n÷S÷}Xkfæ92GÎ{G,RBy%c;CQ;[gZzNE5ykkc ;iA;kc‚3 )©£‰³…­°³ 'š‰1°‰##)½‡£…™¹3ùõYþ !0ôøÏÏN' 3[²ŸWk;{[çˆÿçJ&&Îæ&¦Ö&Brò²bäb²*b&¶&ŽÖò.†ÖFÒF&¶N&¦vŽÖÿ¶ 0²³5¶ø§4'Ú,''{#‹Ÿm&îF&öÿ¸¨ ìMm,œœ~Þ ,œÌ lzàlG`akdíbü»©Ý¿Ù;ÚýDØüø~Àä휜Œ-ì ~²Ê ‹þOgsçr;Yü¸ ìL"íŒ\þ)é_¾˜¯³…­³‰»ó?¹ MŒ-œì­ <~rÿ€Ù;Zü‹†‹“…­Ù1 &p413p4¶6qrúùÁþ§;ÿU'ÁÿV½½½µÇ¿vÛý+ê?9X8;™X›ÒB10þä4rþÉmfa E÷ϨHØšÚ0Ðÿ›ÝØÅþ?|®&Žÿjù?3CñCÂÀØÎÖÚƒÀØÄŠNÖÎù'%ùÿ›Ê´ÿs"ÿHü?"ðÿˆ¼ÿâþwþ·Cüÿ{žÿ;´¨‹µµ¬É¿6üÇC MðÏ%óØXX{üßÂÿ{¤šÉ¿qü¿¡H8ü4BÀÖìG zZú3Z8‰Z¸›Ë[8™˜Xÿté_v[cGk [“5ÿÕHzúÿæS6·0²²ý§í,ÿæ2±5þïÔúq:Me YuªÿóFýWœüòÎÊö?Ôþ½;ãÿ\üƒ"(hçNàEÃÀÂH@ÃDÏðsà~øp0±øü_2þ ˆá¿Ö2ÎŽîZ?eÿìü§øþk¥óß`DlìŒÿ™%g[ãŸñúOÃ?n#GÇUÿuâŠþõ¿ÝÄÄÝÄj}ÅΈ+Ø2ýw†szîÈ”°Ö@ðHˆ}i£rQ]¯_zøG¥þGmmÓ çW»ÇòûÏ#IÊã±>4ë_½©&×ù8>ÄýˆÛdlTÇtº¥°jÑ^7KÒ» š¬ôªÇûS Šº%`¸3LŽ7)ü‰] üQHžíá|ÒâP»šê ÿ\%ý}þ54>:2Ü{Ú„M•IÊå KåïƒÍ§©R!RÕDzÝžeÌ}øØ"œ³\ʤ!g?5íµ Îk“T $f}QìŒ}}œ7Ãë–aI­zQ£Ø`{1®ËÊ›¡9sõ‰ór5úË<#¤=ø…ˆ´±36…è4Ó+òŽÇ¾a‘Ïp:‰é"“|:[5P6“Ó#\2®˜Æíß»OÍß 6.â'¢ÿp$iÊíù2ŸÒ;LÛ–Oòá ±Fóyº)‘ùµ©ãà~ ¥ŸC¡ë­„aø ÅÑ«¨ÙûGæhg [&óâ<1—Xû²Âø{iª_“¸bf)¦Œ²§T˜ ÜÓ»GAe!ógF玦àUa!*ÚZ0Ÿðç/è a0¼€ž~£œ†äwÝo âïfŸJ³xÛw® ÞaÇL¿õ0 è^š `8¿Ú Ù4Ùç÷ Ï©4†V×"”]BÝ3pþà·½_) èIÞ\H$séåXŒ{Òb^Z,ÃÛ6ö©ÉÁ ¬–R2µCÇŠ‰t(£ˆOܲÓ7‚9òó`e€² ä@y%0júAÈëRÿ˜à˜~xƒ4wÖ5çíÂàÖ±åmÝÓ×â}=Ð’tRX[>͔ҞÐRÔ "çH³l/é•_r> endobj -700 0 obj << +708 0 obj << /Ascent 708 /CapHeight 672 /Descent -266 -/FontName /ZBDFML+URWPalladioL-Bold +/FontName /ZTEYNX+URWPalladioL-Bold /ItalicAngle 0 /StemV 123 /XHeight 471 /FontBBox [-152 -301 1000 935] /Flags 4 /CharSet (/fi/fl/exclam/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/quotedblright/emdash) -/FontFile 701 0 R +/FontFile 709 0 R >> endobj -2108 0 obj +2138 0 obj [611 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 500 889 0 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 0 0 0 444 747 778 667 722 833 611 556 833 833 389 0 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 0 333 0 0 0 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 1000 ] endobj -703 0 obj << +711 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [694 0 R 721 0 R 731 0 R 786 0 R 850 0 R 912 0 R] +/Parent 2139 0 R +/Kids [702 0 R 729 0 R 739 0 R 794 0 R 858 0 R 920 0 R] >> endobj -941 0 obj << +951 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [929 0 R 943 0 R 957 0 R 968 0 R 975 0 R 987 0 R] +/Parent 2139 0 R +/Kids [939 0 R 953 0 R 967 0 R 978 0 R 985 0 R 997 0 R] >> endobj -999 0 obj << +1009 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [992 0 R 1001 0 R 1012 0 R 1020 0 R 1027 0 R 1033 0 R] +/Parent 2139 0 R +/Kids [1002 0 R 1011 0 R 1022 0 R 1030 0 R 1037 0 R 1043 0 R] >> endobj -1056 0 obj << +1066 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [1041 0 R 1063 0 R 1073 0 R 1078 0 R 1082 0 R 1089 0 R] +/Parent 2139 0 R +/Kids [1051 0 R 1073 0 R 1083 0 R 1088 0 R 1092 0 R 1099 0 R] >> endobj -1105 0 obj << +1115 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [1097 0 R 1108 0 R 1115 0 R 1120 0 R 1129 0 R 1136 0 R] +/Parent 2139 0 R +/Kids [1107 0 R 1118 0 R 1125 0 R 1130 0 R 1139 0 R 1146 0 R] >> endobj -1148 0 obj << +1158 0 obj << /Type /Pages /Count 6 -/Parent 2109 0 R -/Kids [1140 0 R 1151 0 R 1156 0 R 1164 0 R 1172 0 R 1181 0 R] +/Parent 2139 0 R +/Kids [1150 0 R 1161 0 R 1166 0 R 1174 0 R 1182 0 R 1191 0 R] >> endobj -1199 0 obj << +1210 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1189 0 R 1201 0 R 1207 0 R 1213 0 R 1219 0 R 1223 0 R] +/Parent 2140 0 R +/Kids [1200 0 R 1212 0 R 1217 0 R 1223 0 R 1229 0 R 1233 0 R] >> endobj -1237 0 obj << +1250 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1234 0 R 1239 0 R 1243 0 R 1248 0 R 1254 0 R 1258 0 R] +/Parent 2140 0 R +/Kids [1241 0 R 1252 0 R 1256 0 R 1260 0 R 1265 0 R 1271 0 R] >> endobj -1273 0 obj << +1280 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1265 0 R 1276 0 R 1280 0 R 1284 0 R 1294 0 R 1301 0 R] +/Parent 2140 0 R +/Kids [1275 0 R 1282 0 R 1293 0 R 1297 0 R 1301 0 R 1311 0 R] >> endobj -1310 0 obj << +1323 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1307 0 R 1312 0 R 1316 0 R 1320 0 R 1328 0 R 1334 0 R] +/Parent 2140 0 R +/Kids [1318 0 R 1325 0 R 1329 0 R 1333 0 R 1337 0 R 1345 0 R] >> endobj -1346 0 obj << +1356 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1340 0 R 1348 0 R 1356 0 R 1361 0 R 1373 0 R 1378 0 R] +/Parent 2140 0 R +/Kids [1351 0 R 1358 0 R 1365 0 R 1372 0 R 1378 0 R 1390 0 R] >> endobj -1388 0 obj << +1398 0 obj << /Type /Pages /Count 6 -/Parent 2110 0 R -/Kids [1382 0 R 1390 0 R 1395 0 R 1404 0 R 1408 0 R 1412 0 R] +/Parent 2140 0 R +/Kids [1395 0 R 1400 0 R 1405 0 R 1413 0 R 1420 0 R 1425 0 R] >> endobj -1423 0 obj << +1432 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1416 0 R 1425 0 R 1430 0 R 1449 0 R 1462 0 R 1482 0 R] +/Parent 2141 0 R +/Kids [1429 0 R 1434 0 R 1442 0 R 1449 0 R 1468 0 R 1482 0 R] >> endobj -1499 0 obj << +1507 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1488 0 R 1501 0 R 1505 0 R 1511 0 R 1521 0 R 1533 0 R] +/Parent 2141 0 R +/Kids [1502 0 R 1509 0 R 1521 0 R 1525 0 R 1531 0 R 1541 0 R] >> endobj -1547 0 obj << +1560 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1541 0 R 1549 0 R 1557 0 R 1565 0 R 1574 0 R 1583 0 R] +/Parent 2141 0 R +/Kids [1553 0 R 1562 0 R 1569 0 R 1577 0 R 1585 0 R 1594 0 R] >> endobj -1592 0 obj << +1611 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1587 0 R 1594 0 R 1605 0 R 1609 0 R 1613 0 R 1624 0 R] +/Parent 2141 0 R +/Kids [1604 0 R 1613 0 R 1617 0 R 1623 0 R 1634 0 R 1638 0 R] >> endobj -1634 0 obj << +1652 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1628 0 R 1636 0 R 1646 0 R 1705 0 R 1761 0 R 1815 0 R] +/Parent 2141 0 R +/Kids [1642 0 R 1654 0 R 1658 0 R 1665 0 R 1675 0 R 1734 0 R] >> endobj -1857 0 obj << +1843 0 obj << /Type /Pages /Count 6 -/Parent 2111 0 R -/Kids [1849 0 R 1859 0 R 1865 0 R 1870 0 R 1874 0 R 1879 0 R] +/Parent 2141 0 R +/Kids [1790 0 R 1845 0 R 1879 0 R 1888 0 R 1894 0 R 1899 0 R] >> endobj -1894 0 obj << +1907 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [1890 0 R 1896 0 R 1908 0 R 1919 0 R 1926 0 R 1938 0 R] +/Parent 2142 0 R +/Kids [1903 0 R 1909 0 R 1920 0 R 1925 0 R 1937 0 R 1948 0 R] >> endobj -1952 0 obj << +1966 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [1942 0 R 1954 0 R 1960 0 R 1964 0 R 1974 0 R 1986 0 R] +/Parent 2142 0 R +/Kids [1955 0 R 1968 0 R 1972 0 R 1983 0 R 1989 0 R 1993 0 R] >> endobj -1998 0 obj << +2012 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [1992 0 R 2000 0 R 2009 0 R 2013 0 R 2024 0 R 2030 0 R] +/Parent 2142 0 R +/Kids [2001 0 R 2014 0 R 2023 0 R 2027 0 R 2039 0 R 2043 0 R] >> endobj -2039 0 obj << +2059 0 obj << /Type /Pages /Count 6 -/Parent 2112 0 R -/Kids [2035 0 R 2041 0 R 2053 0 R 2063 0 R 2069 0 R 2078 0 R] +/Parent 2142 0 R +/Kids [2050 0 R 2061 0 R 2066 0 R 2071 0 R 2081 0 R 2088 0 R] >> endobj -2091 0 obj << +2102 0 obj << /Type /Pages -/Count 1 -/Parent 2112 0 R -/Kids [2085 0 R] +/Count 3 +/Parent 2142 0 R +/Kids [2098 0 R 2104 0 R 2116 0 R] >> endobj -2109 0 obj << +2139 0 obj << /Type /Pages /Count 36 -/Parent 2113 0 R -/Kids [703 0 R 941 0 R 999 0 R 1056 0 R 1105 0 R 1148 0 R] +/Parent 2143 0 R +/Kids [711 0 R 951 0 R 1009 0 R 1066 0 R 1115 0 R 1158 0 R] >> endobj -2110 0 obj << +2140 0 obj << /Type /Pages /Count 36 -/Parent 2113 0 R -/Kids [1199 0 R 1237 0 R 1273 0 R 1310 0 R 1346 0 R 1388 0 R] +/Parent 2143 0 R +/Kids [1210 0 R 1250 0 R 1280 0 R 1323 0 R 1356 0 R 1398 0 R] >> endobj -2111 0 obj << +2141 0 obj << /Type /Pages /Count 36 -/Parent 2113 0 R -/Kids [1423 0 R 1499 0 R 1547 0 R 1592 0 R 1634 0 R 1857 0 R] +/Parent 2143 0 R +/Kids [1432 0 R 1507 0 R 1560 0 R 1611 0 R 1652 0 R 1843 0 R] >> endobj -2112 0 obj << +2142 0 obj << /Type /Pages -/Count 25 -/Parent 2113 0 R -/Kids [1894 0 R 1952 0 R 1998 0 R 2039 0 R 2091 0 R] +/Count 27 +/Parent 2143 0 R +/Kids [1907 0 R 1966 0 R 2012 0 R 2059 0 R 2102 0 R] >> endobj -2113 0 obj << +2143 0 obj << /Type /Pages -/Count 133 -/Kids [2109 0 R 2110 0 R 2111 0 R 2112 0 R] +/Count 135 +/Kids [2139 0 R 2140 0 R 2141 0 R 2142 0 R] >> endobj -2114 0 obj << +2144 0 obj << /Type /Outlines /First 7 0 R -/Last 639 0 R +/Last 647 0 R /Count 10 >> endobj +699 0 obj << +/Title 700 0 R +/A 697 0 R +/Parent 647 0 R +/Prev 695 0 R +>> endobj +695 0 obj << +/Title 696 0 R +/A 693 0 R +/Parent 647 0 R +/Prev 691 0 R +/Next 699 0 R +>> endobj 691 0 obj << /Title 692 0 R /A 689 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 687 0 R +/Next 695 0 R >> endobj 687 0 obj << /Title 688 0 R /A 685 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 683 0 R /Next 691 0 R >> endobj 683 0 obj << /Title 684 0 R /A 681 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 679 0 R /Next 687 0 R >> endobj 679 0 obj << /Title 680 0 R /A 677 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 675 0 R /Next 683 0 R >> endobj 675 0 obj << /Title 676 0 R /A 673 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 671 0 R /Next 679 0 R >> endobj 671 0 obj << /Title 672 0 R /A 669 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 667 0 R /Next 675 0 R >> endobj 667 0 obj << /Title 668 0 R /A 665 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 663 0 R /Next 671 0 R >> endobj 663 0 obj << /Title 664 0 R /A 661 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 659 0 R /Next 667 0 R >> endobj 659 0 obj << /Title 660 0 R /A 657 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 655 0 R /Next 663 0 R >> endobj 655 0 obj << /Title 656 0 R /A 653 0 R -/Parent 639 0 R +/Parent 647 0 R /Prev 651 0 R /Next 659 0 R >> endobj 651 0 obj << /Title 652 0 R /A 649 0 R -/Parent 639 0 R -/Prev 647 0 R +/Parent 647 0 R /Next 655 0 R >> endobj 647 0 obj << /Title 648 0 R /A 645 0 R -/Parent 639 0 R -/Prev 643 0 R -/Next 651 0 R +/Parent 2144 0 R +/Prev 611 0 R +/First 651 0 R +/Last 699 0 R +/Count -13 >> endobj 643 0 obj << /Title 644 0 R /A 641 0 R -/Parent 639 0 R -/Next 647 0 R +/Parent 631 0 R +/Prev 639 0 R >> endobj 639 0 obj << /Title 640 0 R /A 637 0 R -/Parent 2114 0 R -/Prev 603 0 R -/First 643 0 R -/Last 691 0 R -/Count -13 +/Parent 631 0 R +/Prev 635 0 R +/Next 643 0 R >> endobj 635 0 obj << /Title 636 0 R /A 633 0 R -/Parent 623 0 R -/Prev 631 0 R +/Parent 631 0 R +/Next 639 0 R >> endobj 631 0 obj << /Title 632 0 R /A 629 0 R -/Parent 623 0 R -/Prev 627 0 R -/Next 635 0 R +/Parent 611 0 R +/Prev 623 0 R +/First 635 0 R +/Last 643 0 R +/Count -3 >> endobj 627 0 obj << /Title 628 0 R /A 625 0 R /Parent 623 0 R -/Next 631 0 R >> endobj 623 0 obj << /Title 624 0 R /A 621 0 R -/Parent 603 0 R +/Parent 611 0 R /Prev 615 0 R +/Next 631 0 R /First 627 0 R -/Last 635 0 R -/Count -3 +/Last 627 0 R +/Count -1 >> endobj 619 0 obj << /Title 620 0 R @@ -10869,8 +11032,7 @@ endobj 615 0 obj << /Title 616 0 R /A 613 0 R -/Parent 603 0 R -/Prev 607 0 R +/Parent 611 0 R /Next 623 0 R /First 619 0 R /Last 619 0 R @@ -10879,75 +11041,77 @@ endobj 611 0 obj << /Title 612 0 R /A 609 0 R -/Parent 607 0 R +/Parent 2144 0 R +/Prev 591 0 R +/Next 647 0 R +/First 615 0 R +/Last 631 0 R +/Count -3 >> endobj 607 0 obj << /Title 608 0 R /A 605 0 R -/Parent 603 0 R -/Next 615 0 R -/First 611 0 R -/Last 611 0 R -/Count -1 +/Parent 591 0 R +/Prev 603 0 R >> endobj 603 0 obj << /Title 604 0 R /A 601 0 R -/Parent 2114 0 R -/Prev 583 0 R -/Next 639 0 R -/First 607 0 R -/Last 623 0 R -/Count -3 +/Parent 591 0 R +/Prev 595 0 R +/Next 607 0 R >> endobj 599 0 obj << /Title 600 0 R /A 597 0 R -/Parent 583 0 R -/Prev 595 0 R +/Parent 595 0 R >> endobj 595 0 obj << /Title 596 0 R /A 593 0 R -/Parent 583 0 R -/Prev 587 0 R -/Next 599 0 R +/Parent 591 0 R +/Next 603 0 R +/First 599 0 R +/Last 599 0 R +/Count -1 >> endobj 591 0 obj << /Title 592 0 R /A 589 0 R -/Parent 587 0 R +/Parent 2144 0 R +/Prev 567 0 R +/Next 611 0 R +/First 595 0 R +/Last 607 0 R +/Count -3 >> endobj 587 0 obj << /Title 588 0 R /A 585 0 R -/Parent 583 0 R -/Next 595 0 R -/First 591 0 R -/Last 591 0 R -/Count -1 +/Parent 567 0 R +/Prev 575 0 R >> endobj 583 0 obj << /Title 584 0 R /A 581 0 R -/Parent 2114 0 R -/Prev 559 0 R -/Next 603 0 R -/First 587 0 R -/Last 599 0 R -/Count -3 +/Parent 575 0 R +/Prev 579 0 R >> endobj 579 0 obj << /Title 580 0 R /A 577 0 R -/Parent 559 0 R -/Prev 567 0 R +/Parent 575 0 R +/Next 583 0 R >> endobj 575 0 obj << /Title 576 0 R /A 573 0 R /Parent 567 0 R /Prev 571 0 R +/Next 587 0 R +/First 579 0 R +/Last 583 0 R +/Count -2 >> endobj 571 0 obj << /Title 572 0 R @@ -10958,207 +11122,205 @@ endobj 567 0 obj << /Title 568 0 R /A 565 0 R -/Parent 559 0 R -/Prev 563 0 R -/Next 579 0 R +/Parent 2144 0 R +/Prev 243 0 R +/Next 591 0 R /First 571 0 R -/Last 575 0 R -/Count -2 +/Last 587 0 R +/Count -3 >> endobj 563 0 obj << /Title 564 0 R /A 561 0 R -/Parent 559 0 R -/Next 567 0 R +/Parent 543 0 R +/Prev 559 0 R >> endobj 559 0 obj << /Title 560 0 R /A 557 0 R -/Parent 2114 0 R -/Prev 243 0 R -/Next 583 0 R -/First 563 0 R -/Last 579 0 R -/Count -3 +/Parent 543 0 R +/Prev 555 0 R +/Next 563 0 R >> endobj 555 0 obj << /Title 556 0 R /A 553 0 R -/Parent 539 0 R +/Parent 543 0 R /Prev 551 0 R +/Next 559 0 R >> endobj 551 0 obj << /Title 552 0 R /A 549 0 R -/Parent 539 0 R +/Parent 543 0 R /Prev 547 0 R /Next 555 0 R >> endobj 547 0 obj << /Title 548 0 R /A 545 0 R -/Parent 539 0 R -/Prev 543 0 R +/Parent 543 0 R /Next 551 0 R >> endobj 543 0 obj << /Title 544 0 R /A 541 0 R -/Parent 539 0 R -/Next 547 0 R +/Parent 535 0 R +/Prev 539 0 R +/First 547 0 R +/Last 563 0 R +/Count -5 >> endobj 539 0 obj << /Title 540 0 R /A 537 0 R -/Parent 531 0 R -/Prev 535 0 R -/First 543 0 R -/Last 555 0 R -/Count -4 +/Parent 535 0 R +/Next 543 0 R >> endobj 535 0 obj << /Title 536 0 R /A 533 0 R -/Parent 531 0 R -/Next 539 0 R +/Parent 243 0 R +/Prev 483 0 R +/First 539 0 R +/Last 543 0 R +/Count -2 >> endobj 531 0 obj << /Title 532 0 R /A 529 0 R -/Parent 243 0 R -/Prev 479 0 R -/First 535 0 R -/Last 539 0 R -/Count -2 +/Parent 483 0 R +/Prev 527 0 R >> endobj 527 0 obj << /Title 528 0 R /A 525 0 R -/Parent 479 0 R -/Prev 523 0 R +/Parent 483 0 R +/Prev 511 0 R +/Next 531 0 R >> endobj 523 0 obj << /Title 524 0 R /A 521 0 R -/Parent 479 0 R -/Prev 507 0 R -/Next 527 0 R +/Parent 511 0 R +/Prev 519 0 R >> endobj 519 0 obj << /Title 520 0 R /A 517 0 R -/Parent 507 0 R +/Parent 511 0 R /Prev 515 0 R +/Next 523 0 R >> endobj 515 0 obj << /Title 516 0 R /A 513 0 R -/Parent 507 0 R -/Prev 511 0 R +/Parent 511 0 R /Next 519 0 R >> endobj 511 0 obj << /Title 512 0 R /A 509 0 R -/Parent 507 0 R -/Next 515 0 R +/Parent 483 0 R +/Prev 507 0 R +/Next 527 0 R +/First 515 0 R +/Last 523 0 R +/Count -3 >> endobj 507 0 obj << /Title 508 0 R /A 505 0 R -/Parent 479 0 R +/Parent 483 0 R /Prev 503 0 R -/Next 523 0 R -/First 511 0 R -/Last 519 0 R -/Count -3 +/Next 511 0 R >> endobj 503 0 obj << /Title 504 0 R /A 501 0 R -/Parent 479 0 R +/Parent 483 0 R /Prev 499 0 R /Next 507 0 R >> endobj 499 0 obj << /Title 500 0 R /A 497 0 R -/Parent 479 0 R -/Prev 495 0 R +/Parent 483 0 R +/Prev 487 0 R /Next 503 0 R >> endobj 495 0 obj << /Title 496 0 R /A 493 0 R -/Parent 479 0 R -/Prev 483 0 R -/Next 499 0 R +/Parent 487 0 R +/Prev 491 0 R >> endobj 491 0 obj << /Title 492 0 R /A 489 0 R -/Parent 483 0 R -/Prev 487 0 R +/Parent 487 0 R +/Next 495 0 R >> endobj 487 0 obj << /Title 488 0 R /A 485 0 R /Parent 483 0 R -/Next 491 0 R +/Next 499 0 R +/First 491 0 R +/Last 495 0 R +/Count -2 >> endobj 483 0 obj << /Title 484 0 R /A 481 0 R -/Parent 479 0 R -/Next 495 0 R +/Parent 243 0 R +/Prev 275 0 R +/Next 535 0 R /First 487 0 R -/Last 491 0 R -/Count -2 +/Last 531 0 R +/Count -7 >> endobj 479 0 obj << /Title 480 0 R /A 477 0 R -/Parent 243 0 R -/Prev 275 0 R -/Next 531 0 R -/First 483 0 R -/Last 527 0 R -/Count -7 +/Parent 463 0 R +/Prev 475 0 R >> endobj 475 0 obj << /Title 476 0 R /A 473 0 R -/Parent 459 0 R +/Parent 463 0 R /Prev 471 0 R +/Next 479 0 R >> endobj 471 0 obj << /Title 472 0 R /A 469 0 R -/Parent 459 0 R +/Parent 463 0 R /Prev 467 0 R /Next 475 0 R >> endobj 467 0 obj << /Title 468 0 R /A 465 0 R -/Parent 459 0 R -/Prev 463 0 R +/Parent 463 0 R /Next 471 0 R >> endobj 463 0 obj << /Title 464 0 R /A 461 0 R -/Parent 459 0 R -/Next 467 0 R +/Parent 275 0 R +/Prev 459 0 R +/First 467 0 R +/Last 479 0 R +/Count -4 >> endobj 459 0 obj << /Title 460 0 R /A 457 0 R /Parent 275 0 R /Prev 455 0 R -/First 463 0 R -/Last 475 0 R -/Count -4 +/Next 463 0 R >> endobj 455 0 obj << /Title 456 0 R @@ -11213,149 +11375,149 @@ endobj /Title 428 0 R /A 425 0 R /Parent 275 0 R -/Prev 423 0 R +/Prev 351 0 R /Next 431 0 R >> endobj 423 0 obj << /Title 424 0 R /A 421 0 R -/Parent 275 0 R -/Prev 347 0 R -/Next 427 0 R +/Parent 351 0 R +/Prev 419 0 R >> endobj 419 0 obj << /Title 420 0 R /A 417 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 415 0 R +/Next 423 0 R >> endobj 415 0 obj << /Title 416 0 R /A 413 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 411 0 R /Next 419 0 R >> endobj 411 0 obj << /Title 412 0 R /A 409 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 407 0 R /Next 415 0 R >> endobj 407 0 obj << /Title 408 0 R /A 405 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 403 0 R /Next 411 0 R >> endobj 403 0 obj << /Title 404 0 R /A 401 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 399 0 R /Next 407 0 R >> endobj 399 0 obj << /Title 400 0 R /A 397 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 395 0 R /Next 403 0 R >> endobj 395 0 obj << /Title 396 0 R /A 393 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 391 0 R /Next 399 0 R >> endobj 391 0 obj << /Title 392 0 R /A 389 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 387 0 R /Next 395 0 R >> endobj 387 0 obj << /Title 388 0 R /A 385 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 383 0 R /Next 391 0 R >> endobj 383 0 obj << /Title 384 0 R /A 381 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 379 0 R /Next 387 0 R >> endobj 379 0 obj << /Title 380 0 R /A 377 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 375 0 R /Next 383 0 R >> endobj 375 0 obj << /Title 376 0 R /A 373 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 371 0 R /Next 379 0 R >> endobj 371 0 obj << /Title 372 0 R /A 369 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 367 0 R /Next 375 0 R >> endobj 367 0 obj << /Title 368 0 R /A 365 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 363 0 R /Next 371 0 R >> endobj 363 0 obj << /Title 364 0 R /A 361 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 359 0 R /Next 367 0 R >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R -/Parent 347 0 R +/Parent 351 0 R /Prev 355 0 R /Next 363 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R -/Parent 347 0 R -/Prev 351 0 R +/Parent 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R -/Parent 347 0 R -/Next 355 0 R +/Parent 275 0 R +/Prev 347 0 R +/Next 427 0 R +/First 355 0 R +/Last 423 0 R +/Count -18 >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R /Parent 275 0 R /Prev 343 0 R -/Next 423 0 R -/First 351 0 R -/Last 419 0 R -/Count -18 +/Next 351 0 R >> endobj 343 0 obj << /Title 344 0 R @@ -11382,21 +11544,21 @@ endobj /Title 332 0 R /A 329 0 R /Parent 275 0 R -/Prev 327 0 R +/Prev 315 0 R /Next 335 0 R >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R -/Parent 275 0 R -/Prev 315 0 R -/Next 331 0 R +/Parent 315 0 R +/Prev 323 0 R >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R /Parent 315 0 R /Prev 319 0 R +/Next 327 0 R >> endobj 319 0 obj << /Title 320 0 R @@ -11409,10 +11571,10 @@ endobj /A 313 0 R /Parent 275 0 R /Prev 311 0 R -/Next 327 0 R +/Next 331 0 R /First 319 0 R -/Last 323 0 R -/Count -2 +/Last 327 0 R +/Count -3 >> endobj 311 0 obj << /Title 312 0 R @@ -11481,9 +11643,9 @@ endobj /A 273 0 R /Parent 243 0 R /Prev 247 0 R -/Next 479 0 R +/Next 483 0 R /First 279 0 R -/Last 459 0 R +/Last 463 0 R /Count -26 >> endobj 271 0 obj << @@ -11540,11 +11702,11 @@ endobj 243 0 obj << /Title 244 0 R /A 241 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 231 0 R -/Next 559 0 R +/Next 567 0 R /First 247 0 R -/Last 531 0 R +/Last 535 0 R /Count -4 >> endobj 239 0 obj << @@ -11562,7 +11724,7 @@ endobj 231 0 obj << /Title 232 0 R /A 229 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 131 0 R /Next 243 0 R /First 235 0 R @@ -11744,7 +11906,7 @@ endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 91 0 R /Next 231 0 R /First 135 0 R @@ -11818,7 +11980,7 @@ endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 67 0 R /Next 131 0 R /First 95 0 R @@ -11861,7 +12023,7 @@ endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Prev 7 0 R /Next 91 0 R /First 71 0 R @@ -11970,2164 +12132,2194 @@ endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 2114 0 R +/Parent 2144 0 R /Next 67 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj -2115 0 obj << -/Names [(Access_Control_Lists) 1591 0 R (Bv9ARM.ch01) 932 0 R (Bv9ARM.ch02) 978 0 R (Bv9ARM.ch03) 995 0 R (Bv9ARM.ch04) 1044 0 R (Bv9ARM.ch05) 1132 0 R (Bv9ARM.ch06) 1143 0 R (Bv9ARM.ch07) 1590 0 R (Bv9ARM.ch08) 1616 0 R (Bv9ARM.ch09) 1631 0 R (Bv9ARM.ch10) 1852 0 R (Configuration_File_Grammar) 1168 0 R (DNSSEC) 1111 0 R (Doc-Start) 699 0 R (Setting_TTLs) 1526 0 R (acache) 985 0 R (access_control) 1290 0 R (acl) 1176 0 R (address_match_lists) 1149 0 R (admin_tools) 1018 0 R (appendix.A) 602 0 R (appendix.B) 638 0 R (bibliography) 1640 0 R (boolean_options) 1060 0 R (builtin) 1368 0 R (chapter*.1) 734 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 558 0 R (chapter.8) 582 0 R (cite.RFC1033) 1767 0 R (cite.RFC1034) 1652 0 R (cite.RFC1035) 1654 0 R (cite.RFC1101) 1749 0 R (cite.RFC1123) 1751 0 R (cite.RFC1183) 1711 0 R (cite.RFC1464) 1789 0 R (cite.RFC1535) 1697 0 R (cite.RFC1536) 1699 0 R (cite.RFC1537) 1769 0 R (cite.RFC1591) 1753 0 R (cite.RFC1706) 1713 0 R (cite.RFC1712) 1809 0 R (cite.RFC1713) 1791 0 R (cite.RFC1794) 1793 0 R (cite.RFC1876) 1715 0 R (cite.RFC1912) 1771 0 R (cite.RFC1982) 1701 0 R (cite.RFC1995) 1659 0 R (cite.RFC1996) 1661 0 R (cite.RFC2010) 1773 0 R (cite.RFC2052) 1717 0 R (cite.RFC2065) 1821 0 R (cite.RFC2136) 1663 0 R (cite.RFC2137) 1823 0 R (cite.RFC2163) 1719 0 R (cite.RFC2168) 1721 0 R (cite.RFC2181) 1665 0 R (cite.RFC2219) 1775 0 R (cite.RFC2230) 1723 0 R (cite.RFC2240) 1795 0 R (cite.RFC2308) 1667 0 R (cite.RFC2317) 1755 0 R (cite.RFC2345) 1797 0 R (cite.RFC2352) 1799 0 R (cite.RFC2535) 1825 0 R (cite.RFC2536) 1725 0 R (cite.RFC2537) 1727 0 R (cite.RFC2538) 1729 0 R (cite.RFC2539) 1731 0 R (cite.RFC2540) 1733 0 R (cite.RFC2671) 1669 0 R (cite.RFC2672) 1671 0 R (cite.RFC2673) 1811 0 R (cite.RFC2782) 1735 0 R (cite.RFC2825) 1779 0 R (cite.RFC2826) 1757 0 R (cite.RFC2845) 1673 0 R (cite.RFC2874) 1813 0 R (cite.RFC2915) 1737 0 R (cite.RFC2929) 1759 0 R (cite.RFC2930) 1675 0 R (cite.RFC2931) 1677 0 R (cite.RFC3007) 1679 0 R (cite.RFC3008) 1827 0 R (cite.RFC3071) 1801 0 R (cite.RFC3090) 1829 0 R (cite.RFC3110) 1739 0 R (cite.RFC3123) 1741 0 R (cite.RFC3225) 1685 0 R (cite.RFC3258) 1803 0 R (cite.RFC3445) 1831 0 R (cite.RFC3490) 1781 0 R (cite.RFC3491) 1783 0 R (cite.RFC3492) 1785 0 R (cite.RFC3596) 1743 0 R (cite.RFC3597) 1745 0 R (cite.RFC3645) 1681 0 R (cite.RFC3655) 1833 0 R (cite.RFC3658) 1835 0 R (cite.RFC3755) 1837 0 R (cite.RFC3757) 1839 0 R (cite.RFC3833) 1687 0 R (cite.RFC3845) 1841 0 R (cite.RFC3901) 1805 0 R (cite.RFC4033) 1689 0 R (cite.RFC4034) 1691 0 R (cite.RFC4035) 1693 0 R (cite.RFC4074) 1703 0 R (cite.RFC974) 1656 0 R (cite.id2504427) 1846 0 R (configuration_file_elements) 1144 0 R (controls_statement_definition_and_usage) 1031 0 R (diagnostic_tools) 966 0 R (dynamic_update) 1054 0 R (dynamic_update_policies) 1106 0 R (dynamic_update_security) 1299 0 R (empty) 1376 0 R (historical_dns_information) 1633 0 R (id2464966) 933 0 R (id2466572) 934 0 R (id2467531) 935 0 R (id2467541) 936 0 R (id2467713) 948 0 R (id2467734) 949 0 R (id2467768) 950 0 R (id2467852) 953 0 R (id2467945) 946 0 R (id2470250) 960 0 R (id2470274) 963 0 R (id2470372) 964 0 R (id2470393) 965 0 R (id2470423) 971 0 R (id2470526) 972 0 R (id2470553) 973 0 R (id2470587) 979 0 R (id2470614) 980 0 R (id2470627) 981 0 R (id2470721) 984 0 R (id2470731) 990 0 R (id2470763) 997 0 R (id2470779) 998 0 R (id2470802) 1004 0 R (id2470819) 1005 0 R (id2471224) 1008 0 R (id2471229) 1009 0 R (id2473110) 1036 0 R (id2473122) 1037 0 R (id2473515) 1069 0 R (id2473533) 1070 0 R (id2473969) 1086 0 R (id2473986) 1087 0 R (id2474024) 1092 0 R (id2474042) 1093 0 R (id2474121) 1094 0 R (id2474161) 1095 0 R (id2474286) 1100 0 R (id2474331) 1102 0 R (id2474345) 1103 0 R (id2474462) 1104 0 R (id2474599) 1112 0 R (id2474678) 1113 0 R (id2474759) 1118 0 R (id2474902) 1123 0 R (id2475169) 1125 0 R (id2475190) 1126 0 R (id2475291) 1133 0 R (id2475438) 1145 0 R (id2476300) 1154 0 R (id2476328) 1159 0 R (id2476522) 1160 0 R (id2476537) 1161 0 R (id2476567) 1167 0 R (id2476718) 1169 0 R (id2477161) 1175 0 R (id2477272) 1177 0 R (id2477419) 1179 0 R (id2477780) 1186 0 R (id2477797) 1192 0 R (id2477889) 1193 0 R (id2477912) 1194 0 R (id2478003) 1198 0 R (id2478197) 1204 0 R (id2478249) 1205 0 R (id2478942) 1216 0 R (id2479645) 1226 0 R (id2479719) 1227 0 R (id2479783) 1230 0 R (id2479827) 1231 0 R (id2479842) 1232 0 R (id2482169) 1261 0 R (id2484043) 1287 0 R (id2484102) 1289 0 R (id2484598) 1304 0 R (id2485793) 1323 0 R (id2485852) 1325 0 R (id2486200) 1337 0 R (id2486839) 1352 0 R (id2488339) 1386 0 R (id2489091) 1399 0 R (id2489142) 1400 0 R (id2489292) 1402 0 R (id2490761) 1419 0 R (id2490769) 1420 0 R (id2490774) 1421 0 R (id2491188) 1428 0 R (id2491221) 1433 0 R (id2492840) 1485 0 R (id2493223) 1491 0 R (id2493309) 1492 0 R (id2493330) 1495 0 R (id2493498) 1497 0 R (id2494737) 1508 0 R (id2494865) 1514 0 R (id2495022) 1515 0 R (id2495385) 1517 0 R (id2495522) 1519 0 R (id2495544) 1524 0 R (id2496017) 1527 0 R (id2496141) 1529 0 R (id2496156) 1530 0 R (id2496268) 1536 0 R (id2496291) 1537 0 R (id2496420) 1538 0 R (id2496489) 1539 0 R (id2496525) 1544 0 R (id2496587) 1545 0 R (id2497018) 1553 0 R (id2497363) 1561 0 R (id2497368) 1562 0 R (id2499022) 1568 0 R (id2499029) 1569 0 R (id2499405) 1571 0 R (id2499411) 1572 0 R (id2500259) 1581 0 R (id2500446) 1601 0 R (id2500592) 1602 0 R (id2500651) 1603 0 R (id2500731) 1617 0 R (id2500737) 1618 0 R (id2500748) 1619 0 R (id2500765) 1620 0 R (id2500964) 1632 0 R (id2501136) 1639 0 R (id2501255) 1644 0 R (id2501257) 1650 0 R (id2501266) 1655 0 R (id2501289) 1651 0 R (id2501381) 1653 0 R (id2501417) 1664 0 R (id2501444) 1666 0 R (id2501469) 1658 0 R (id2501494) 1660 0 R (id2501517) 1662 0 R (id2501573) 1668 0 R (id2501600) 1670 0 R (id2501626) 1672 0 R (id2501688) 1674 0 R (id2501718) 1676 0 R (id2501748) 1678 0 R (id2501843) 1680 0 R (id2501917) 1683 0 R (id2501925) 1684 0 R (id2501952) 1686 0 R (id2501988) 1688 0 R (id2502053) 1690 0 R (id2502118) 1692 0 R (id2502183) 1695 0 R (id2502192) 1696 0 R (id2502217) 1698 0 R (id2502285) 1700 0 R (id2502321) 1702 0 R (id2502361) 1709 0 R (id2502366) 1710 0 R (id2502424) 1712 0 R (id2502461) 1720 0 R (id2502497) 1714 0 R (id2502551) 1716 0 R (id2502589) 1718 0 R (id2502615) 1722 0 R (id2502641) 1724 0 R (id2502667) 1726 0 R (id2502694) 1728 0 R (id2502733) 1730 0 R (id2502763) 1732 0 R (id2502793) 1734 0 R (id2502836) 1736 0 R (id2502869) 1738 0 R (id2502896) 1740 0 R (id2502919) 1742 0 R (id2502977) 1744 0 R (id2503001) 1747 0 R (id2503009) 1748 0 R (id2503034) 1750 0 R (id2503057) 1752 0 R (id2503080) 1754 0 R (id2503126) 1756 0 R (id2503149) 1758 0 R (id2503200) 1765 0 R (id2503207) 1766 0 R (id2503230) 1768 0 R (id2503257) 1770 0 R (id2503352) 1772 0 R (id2503388) 1774 0 R (id2503429) 1777 0 R (id2503434) 1778 0 R (id2503466) 1780 0 R (id2503512) 1782 0 R (id2503547) 1784 0 R (id2503574) 1787 0 R (id2503592) 1788 0 R (id2503614) 1790 0 R (id2503640) 1792 0 R (id2503666) 1794 0 R (id2503689) 1796 0 R (id2503735) 1798 0 R (id2503758) 1800 0 R (id2503785) 1802 0 R (id2503811) 1804 0 R (id2503848) 1807 0 R (id2503854) 1808 0 R (id2503912) 1810 0 R (id2503939) 1812 0 R (id2503975) 1819 0 R (id2503987) 1820 0 R (id2504026) 1822 0 R (id2504053) 1824 0 R (id2504083) 1826 0 R (id2504108) 1828 0 R (id2504135) 1830 0 R (id2504240) 1832 0 R (id2504276) 1834 0 R (id2504302) 1836 0 R (id2504329) 1838 0 R (id2504374) 1840 0 R (id2504416) 1843 0 R (id2504425) 1845 0 R (id2504427) 1847 0 R (incremental_zone_transfers) 1066 0 R (internet_drafts) 1842 0 R (ipv6addresses) 1127 0 R (journal) 1055 0 R (lwresd) 1134 0 R (man.dig) 1853 0 R (man.dnssec-dsfromkey) 1902 0 R (man.dnssec-keyfromlabel) 1916 0 R (man.dnssec-keygen) 1932 0 R (man.dnssec-signzone) 1949 0 R (man.host) 1886 0 R (man.named) 2003 0 R (man.named-checkconf) 1970 0 R (man.named-checkzone) 1982 0 R (man.nsupdate) 2021 0 R (man.rndc) 2047 0 R (man.rndc-confgen) 2075 0 R (man.rndc.conf) 2059 0 R (notify) 1045 0 R (options) 1246 0 R (page.1) 698 0 R (page.10) 970 0 R (page.100) 1707 0 R (page.101) 1763 0 R (page.102) 1817 0 R (page.103) 1851 0 R (page.104) 1861 0 R (page.105) 1867 0 R (page.106) 1872 0 R (page.107) 1876 0 R (page.108) 1881 0 R (page.109) 1892 0 R (page.11) 977 0 R (page.110) 1898 0 R (page.111) 1910 0 R (page.112) 1921 0 R (page.113) 1928 0 R (page.114) 1940 0 R (page.115) 1944 0 R (page.116) 1956 0 R (page.117) 1962 0 R (page.118) 1966 0 R (page.119) 1976 0 R (page.12) 989 0 R (page.120) 1988 0 R (page.121) 1994 0 R (page.122) 2002 0 R (page.123) 2011 0 R (page.124) 2015 0 R (page.125) 2026 0 R (page.126) 2032 0 R (page.127) 2037 0 R (page.128) 2043 0 R (page.129) 2055 0 R (page.13) 994 0 R (page.130) 2065 0 R (page.131) 2071 0 R (page.132) 2080 0 R (page.133) 2087 0 R (page.14) 1003 0 R (page.15) 1014 0 R (page.16) 1022 0 R (page.17) 1029 0 R (page.18) 1035 0 R (page.19) 1043 0 R (page.2) 723 0 R (page.20) 1065 0 R (page.21) 1075 0 R (page.22) 1080 0 R (page.23) 1084 0 R (page.24) 1091 0 R (page.25) 1099 0 R (page.26) 1110 0 R (page.27) 1117 0 R (page.28) 1122 0 R (page.29) 1131 0 R (page.3) 733 0 R (page.30) 1138 0 R (page.31) 1142 0 R (page.32) 1153 0 R (page.33) 1158 0 R (page.34) 1166 0 R (page.35) 1174 0 R (page.36) 1183 0 R (page.37) 1191 0 R (page.38) 1203 0 R (page.39) 1209 0 R (page.4) 788 0 R (page.40) 1215 0 R (page.41) 1221 0 R (page.42) 1225 0 R (page.43) 1236 0 R (page.44) 1241 0 R (page.45) 1245 0 R (page.46) 1250 0 R (page.47) 1256 0 R (page.48) 1260 0 R (page.49) 1267 0 R (page.5) 852 0 R (page.50) 1278 0 R (page.51) 1282 0 R (page.52) 1286 0 R (page.53) 1296 0 R (page.54) 1303 0 R (page.55) 1309 0 R (page.56) 1314 0 R (page.57) 1318 0 R (page.58) 1322 0 R (page.59) 1330 0 R (page.6) 914 0 R (page.60) 1336 0 R (page.61) 1342 0 R (page.62) 1350 0 R (page.63) 1358 0 R (page.64) 1363 0 R (page.65) 1375 0 R (page.66) 1380 0 R (page.67) 1384 0 R (page.68) 1392 0 R (page.69) 1397 0 R (page.7) 931 0 R (page.70) 1406 0 R (page.71) 1410 0 R (page.72) 1414 0 R (page.73) 1418 0 R (page.74) 1427 0 R (page.75) 1432 0 R (page.76) 1451 0 R (page.77) 1464 0 R (page.78) 1484 0 R (page.79) 1490 0 R (page.8) 945 0 R (page.80) 1503 0 R (page.81) 1507 0 R (page.82) 1513 0 R (page.83) 1523 0 R (page.84) 1535 0 R (page.85) 1543 0 R (page.86) 1551 0 R (page.87) 1559 0 R (page.88) 1567 0 R (page.89) 1576 0 R (page.9) 959 0 R (page.90) 1585 0 R (page.91) 1589 0 R (page.92) 1596 0 R (page.93) 1607 0 R (page.94) 1611 0 R (page.95) 1615 0 R (page.96) 1626 0 R (page.97) 1630 0 R (page.98) 1638 0 R (page.99) 1648 0 R (proposed_standards) 1071 0 R (query_address) 1305 0 R (rfcs) 955 0 R (rndc) 1187 0 R (rrset_ordering) 1010 0 R (sample_configuration) 996 0 R (section*.10) 1776 0 R (section*.100) 2058 0 R (section*.101) 2060 0 R (section*.102) 2061 0 R (section*.103) 2066 0 R (section*.104) 2067 0 R (section*.105) 2072 0 R (section*.106) 2073 0 R (section*.107) 2074 0 R (section*.108) 2076 0 R (section*.109) 2081 0 R (section*.11) 1786 0 R (section*.110) 2082 0 R (section*.111) 2083 0 R (section*.112) 2088 0 R (section*.113) 2089 0 R (section*.114) 2090 0 R (section*.12) 1806 0 R (section*.13) 1818 0 R (section*.14) 1844 0 R (section*.15) 1854 0 R (section*.16) 1855 0 R (section*.17) 1856 0 R (section*.18) 1862 0 R (section*.19) 1863 0 R (section*.2) 1643 0 R (section*.20) 1868 0 R (section*.21) 1877 0 R (section*.22) 1882 0 R (section*.23) 1883 0 R (section*.24) 1884 0 R (section*.25) 1885 0 R (section*.26) 1887 0 R (section*.27) 1888 0 R (section*.28) 1893 0 R (section*.29) 1899 0 R (section*.3) 1649 0 R (section*.30) 1900 0 R (section*.31) 1901 0 R (section*.32) 1903 0 R (section*.33) 1904 0 R (section*.34) 1905 0 R (section*.35) 1906 0 R (section*.36) 1911 0 R (section*.37) 1912 0 R (section*.38) 1913 0 R (section*.39) 1914 0 R (section*.4) 1657 0 R (section*.40) 1915 0 R (section*.41) 1917 0 R (section*.42) 1922 0 R (section*.43) 1923 0 R (section*.44) 1924 0 R (section*.45) 1929 0 R (section*.46) 1930 0 R (section*.47) 1931 0 R (section*.48) 1933 0 R (section*.49) 1934 0 R (section*.5) 1682 0 R (section*.50) 1935 0 R (section*.51) 1936 0 R (section*.52) 1945 0 R (section*.53) 1946 0 R (section*.54) 1947 0 R (section*.55) 1948 0 R (section*.56) 1950 0 R (section*.57) 1951 0 R (section*.58) 1957 0 R (section*.59) 1958 0 R (section*.6) 1694 0 R (section*.60) 1967 0 R (section*.61) 1968 0 R (section*.62) 1969 0 R (section*.63) 1971 0 R (section*.64) 1972 0 R (section*.65) 1977 0 R (section*.66) 1978 0 R (section*.67) 1979 0 R (section*.68) 1980 0 R (section*.69) 1981 0 R (section*.7) 1708 0 R (section*.70) 1983 0 R (section*.71) 1984 0 R (section*.72) 1989 0 R (section*.73) 1990 0 R (section*.74) 1995 0 R (section*.75) 1996 0 R (section*.76) 1997 0 R (section*.77) 2004 0 R (section*.78) 2005 0 R (section*.79) 2006 0 R (section*.8) 1746 0 R (section*.80) 2007 0 R (section*.81) 2016 0 R (section*.82) 2017 0 R (section*.83) 2018 0 R (section*.84) 2019 0 R (section*.85) 2020 0 R (section*.86) 2022 0 R (section*.87) 2027 0 R (section*.88) 2028 0 R (section*.89) 2033 0 R (section*.9) 1764 0 R (section*.90) 2038 0 R (section*.91) 2044 0 R (section*.92) 2045 0 R (section*.93) 2046 0 R (section*.94) 2048 0 R (section*.95) 2049 0 R (section*.96) 2050 0 R (section*.97) 2051 0 R (section*.98) 2056 0 R (section*.99) 2057 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 478 0 R (section.6.4) 530 0 R (section.7.1) 562 0 R (section.7.2) 566 0 R (section.7.3) 578 0 R (section.8.1) 586 0 R (section.8.2) 594 0 R (section.8.3) 598 0 R (section.A.1) 606 0 R (section.A.2) 614 0 R (section.A.3) 622 0 R (section.B.1) 642 0 R (section.B.10) 678 0 R (section.B.11) 682 0 R (section.B.12) 686 0 R (section.B.13) 690 0 R (section.B.2) 646 0 R (section.B.3) 650 0 R (section.B.4) 654 0 R (section.B.5) 658 0 R (section.B.6) 662 0 R (section.B.7) 666 0 R (section.B.8) 670 0 R (section.B.9) 674 0 R (server_resource_limits) 1331 0 R (server_statement_definition_and_usage) 1274 0 R (server_statement_grammar) 1387 0 R (statistics) 1552 0 R (statistics_counters) 1560 0 R (statschannels) 1385 0 R (statsfile) 1252 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 326 0 R (subsection.6.2.12) 330 0 R (subsection.6.2.13) 334 0 R (subsection.6.2.14) 338 0 R (subsection.6.2.15) 342 0 R (subsection.6.2.16) 346 0 R (subsection.6.2.17) 422 0 R (subsection.6.2.18) 426 0 R (subsection.6.2.19) 430 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 434 0 R (subsection.6.2.21) 438 0 R (subsection.6.2.22) 442 0 R (subsection.6.2.23) 446 0 R (subsection.6.2.24) 450 0 R (subsection.6.2.25) 454 0 R (subsection.6.2.26) 458 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 482 0 R (subsection.6.3.2) 494 0 R (subsection.6.3.3) 498 0 R (subsection.6.3.4) 502 0 R (subsection.6.3.5) 506 0 R (subsection.6.3.6) 522 0 R (subsection.6.3.7) 526 0 R (subsection.6.4.1) 538 0 R (subsection.7.2.1) 570 0 R (subsection.7.2.2) 574 0 R (subsection.8.1.1) 590 0 R (subsection.A.1.1) 610 0 R (subsection.A.2.1) 618 0 R (subsection.A.3.1) 626 0 R (subsection.A.3.2) 630 0 R (subsection.A.3.3) 634 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.16.1) 350 0 R (subsubsection.6.2.16.10) 386 0 R (subsubsection.6.2.16.11) 390 0 R (subsubsection.6.2.16.12) 394 0 R (subsubsection.6.2.16.13) 398 0 R (subsubsection.6.2.16.14) 402 0 R (subsubsection.6.2.16.15) 406 0 R (subsubsection.6.2.16.16) 410 0 R (subsubsection.6.2.16.17) 414 0 R (subsubsection.6.2.16.18) 418 0 R (subsubsection.6.2.16.2) 354 0 R (subsubsection.6.2.16.3) 358 0 R (subsubsection.6.2.16.4) 362 0 R (subsubsection.6.2.16.5) 366 0 R (subsubsection.6.2.16.6) 370 0 R (subsubsection.6.2.16.7) 374 0 R (subsubsection.6.2.16.8) 378 0 R (subsubsection.6.2.16.9) 382 0 R (subsubsection.6.2.26.1) 462 0 R (subsubsection.6.2.26.2) 466 0 R (subsubsection.6.2.26.3) 470 0 R (subsubsection.6.2.26.4) 474 0 R (subsubsection.6.3.1.1) 486 0 R (subsubsection.6.3.1.2) 490 0 R (subsubsection.6.3.5.1) 510 0 R (subsubsection.6.3.5.2) 514 0 R (subsubsection.6.3.5.3) 518 0 R (subsubsection.6.4.0.1) 534 0 R (subsubsection.6.4.1.1) 542 0 R (subsubsection.6.4.1.2) 546 0 R (subsubsection.6.4.1.3) 550 0 R (subsubsection.6.4.1.4) 554 0 R (table.1.1) 937 0 R (table.1.2) 947 0 R (table.3.1) 1006 0 R (table.3.2) 1038 0 R (table.6.1) 1146 0 R (table.6.10) 1498 0 R (table.6.11) 1509 0 R (table.6.12) 1516 0 R (table.6.13) 1518 0 R (table.6.14) 1525 0 R (table.6.15) 1528 0 R (table.6.16) 1531 0 R (table.6.17) 1546 0 R (table.6.18) 1554 0 R (table.6.19) 1563 0 R (table.6.2) 1170 0 R (table.6.20) 1570 0 R (table.6.21) 1577 0 R (table.6.3) 1178 0 R (table.6.4) 1217 0 R (table.6.5) 1262 0 R (table.6.6) 1353 0 R (table.6.7) 1422 0 R (table.6.8) 1486 0 R (table.6.9) 1496 0 R (the_category_phrase) 1211 0 R (the_sortlist_statement) 1343 0 R (topology) 1338 0 R (tsig) 1085 0 R (tuning) 1354 0 R (types_of_resource_records_and_when_to_use_them) 954 0 R (view_statement_grammar) 1371 0 R (zone_statement_grammar) 1292 0 R (zone_transfers) 1061 0 R (zonefile_format) 1370 0 R] +2145 0 obj << +/Names [(Access_Control_Lists) 1621 0 R (Bv9ARM.ch01) 942 0 R (Bv9ARM.ch02) 988 0 R (Bv9ARM.ch03) 1005 0 R (Bv9ARM.ch04) 1054 0 R (Bv9ARM.ch05) 1142 0 R (Bv9ARM.ch06) 1153 0 R (Bv9ARM.ch07) 1620 0 R (Bv9ARM.ch08) 1645 0 R (Bv9ARM.ch09) 1661 0 R (Bv9ARM.ch10) 1882 0 R (Configuration_File_Grammar) 1178 0 R (DNSSEC) 1121 0 R (Doc-Start) 707 0 R (Setting_TTLs) 1546 0 R (acache) 995 0 R (access_control) 1307 0 R (acl) 1186 0 R (address_match_lists) 1159 0 R (admin_tools) 1028 0 R (appendix.A) 610 0 R (appendix.B) 646 0 R (bibliography) 1669 0 R (boolean_options) 1070 0 R (builtin) 1385 0 R (chapter*.1) 742 0 R (chapter.1) 6 0 R (chapter.2) 66 0 R (chapter.3) 90 0 R (chapter.4) 130 0 R (chapter.5) 230 0 R (chapter.6) 242 0 R (chapter.7) 566 0 R (chapter.8) 590 0 R (cite.RFC1033) 1796 0 R (cite.RFC1034) 1681 0 R (cite.RFC1035) 1683 0 R (cite.RFC1101) 1778 0 R (cite.RFC1123) 1780 0 R (cite.RFC1183) 1740 0 R (cite.RFC1464) 1818 0 R (cite.RFC1535) 1726 0 R (cite.RFC1536) 1728 0 R (cite.RFC1537) 1798 0 R (cite.RFC1591) 1782 0 R (cite.RFC1706) 1742 0 R (cite.RFC1712) 1838 0 R (cite.RFC1713) 1820 0 R (cite.RFC1794) 1822 0 R (cite.RFC1876) 1744 0 R (cite.RFC1912) 1800 0 R (cite.RFC1982) 1730 0 R (cite.RFC1995) 1688 0 R (cite.RFC1996) 1690 0 R (cite.RFC2010) 1802 0 R (cite.RFC2052) 1746 0 R (cite.RFC2065) 1851 0 R (cite.RFC2136) 1692 0 R (cite.RFC2137) 1853 0 R (cite.RFC2163) 1748 0 R (cite.RFC2168) 1750 0 R (cite.RFC2181) 1694 0 R (cite.RFC2219) 1804 0 R (cite.RFC2230) 1752 0 R (cite.RFC2240) 1824 0 R (cite.RFC2308) 1696 0 R (cite.RFC2317) 1784 0 R (cite.RFC2345) 1826 0 R (cite.RFC2352) 1828 0 R (cite.RFC2535) 1855 0 R (cite.RFC2536) 1754 0 R (cite.RFC2537) 1756 0 R (cite.RFC2538) 1758 0 R (cite.RFC2539) 1760 0 R (cite.RFC2540) 1762 0 R (cite.RFC2671) 1698 0 R (cite.RFC2672) 1700 0 R (cite.RFC2673) 1840 0 R (cite.RFC2782) 1764 0 R (cite.RFC2825) 1808 0 R (cite.RFC2826) 1786 0 R (cite.RFC2845) 1702 0 R (cite.RFC2874) 1842 0 R (cite.RFC2915) 1766 0 R (cite.RFC2929) 1788 0 R (cite.RFC2930) 1704 0 R (cite.RFC2931) 1706 0 R (cite.RFC3007) 1708 0 R (cite.RFC3008) 1857 0 R (cite.RFC3071) 1830 0 R (cite.RFC3090) 1859 0 R (cite.RFC3110) 1768 0 R (cite.RFC3123) 1770 0 R (cite.RFC3225) 1714 0 R (cite.RFC3258) 1832 0 R (cite.RFC3445) 1861 0 R (cite.RFC3490) 1810 0 R (cite.RFC3491) 1812 0 R (cite.RFC3492) 1814 0 R (cite.RFC3596) 1772 0 R (cite.RFC3597) 1774 0 R (cite.RFC3645) 1710 0 R (cite.RFC3655) 1863 0 R (cite.RFC3658) 1865 0 R (cite.RFC3755) 1867 0 R (cite.RFC3757) 1869 0 R (cite.RFC3833) 1716 0 R (cite.RFC3845) 1871 0 R (cite.RFC3901) 1834 0 R (cite.RFC4033) 1718 0 R (cite.RFC4034) 1720 0 R (cite.RFC4035) 1722 0 R (cite.RFC4074) 1732 0 R (cite.RFC974) 1685 0 R (cite.id2505777) 1876 0 R (clients-per-query) 1592 0 R (configuration_file_elements) 1154 0 R (controls_statement_definition_and_usage) 1041 0 R (diagnostic_tools) 976 0 R (dynamic_update) 1064 0 R (dynamic_update_policies) 1116 0 R (dynamic_update_security) 1316 0 R (empty) 1393 0 R (historical_dns_information) 1663 0 R (id2466552) 943 0 R (id2466576) 944 0 R (id2467534) 945 0 R (id2467544) 946 0 R (id2467716) 958 0 R (id2467737) 959 0 R (id2467771) 960 0 R (id2467856) 963 0 R (id2467948) 956 0 R (id2470253) 970 0 R (id2470277) 973 0 R (id2470375) 974 0 R (id2470396) 975 0 R (id2470426) 981 0 R (id2470530) 982 0 R (id2470556) 983 0 R (id2470590) 989 0 R (id2470617) 990 0 R (id2470630) 991 0 R (id2470724) 994 0 R (id2470734) 1000 0 R (id2470766) 1007 0 R (id2470782) 1008 0 R (id2470805) 1014 0 R (id2470822) 1015 0 R (id2471227) 1018 0 R (id2471233) 1019 0 R (id2473009) 1046 0 R (id2473020) 1047 0 R (id2473420) 1079 0 R (id2473438) 1080 0 R (id2473942) 1096 0 R (id2473959) 1097 0 R (id2473997) 1102 0 R (id2474016) 1103 0 R (id2474026) 1104 0 R (id2474069) 1105 0 R (id2474263) 1110 0 R (id2474311) 1112 0 R (id2474325) 1113 0 R (id2474374) 1114 0 R (id2474510) 1122 0 R (id2474589) 1123 0 R (id2474670) 1128 0 R (id2474953) 1133 0 R (id2475083) 1135 0 R (id2475105) 1136 0 R (id2475138) 1143 0 R (id2475285) 1155 0 R (id2476147) 1164 0 R (id2476174) 1169 0 R (id2476380) 1170 0 R (id2476395) 1171 0 R (id2476425) 1177 0 R (id2476500) 1179 0 R (id2477079) 1185 0 R (id2477122) 1187 0 R (id2477269) 1189 0 R (id2477629) 1196 0 R (id2477646) 1197 0 R (id2477806) 1203 0 R (id2477830) 1204 0 R (id2477921) 1208 0 R (id2478115) 1209 0 R (id2478167) 1215 0 R (id2478997) 1226 0 R (id2479731) 1236 0 R (id2479859) 1237 0 R (id2480244) 1239 0 R (id2480317) 1244 0 R (id2480381) 1247 0 R (id2480425) 1248 0 R (id2480440) 1249 0 R (id2482851) 1278 0 R (id2484684) 1304 0 R (id2484743) 1306 0 R (id2485249) 1321 0 R (id2486520) 1340 0 R (id2486580) 1342 0 R (id2486934) 1354 0 R (id2487436) 1369 0 R (id2489703) 1411 0 R (id2489789) 1416 0 R (id2489841) 1417 0 R (id2489923) 1423 0 R (id2491460) 1437 0 R (id2491467) 1438 0 R (id2491473) 1439 0 R (id2491963) 1446 0 R (id2491996) 1452 0 R (id2493692) 1505 0 R (id2494007) 1512 0 R (id2494025) 1513 0 R (id2494045) 1516 0 R (id2494282) 1518 0 R (id2495452) 1528 0 R (id2495580) 1534 0 R (id2495602) 1535 0 R (id2495964) 1537 0 R (id2496101) 1539 0 R (id2496119) 1544 0 R (id2496660) 1547 0 R (id2496785) 1549 0 R (id2496800) 1550 0 R (id2496980) 1556 0 R (id2497002) 1557 0 R (id2497063) 1558 0 R (id2497132) 1559 0 R (id2497169) 1565 0 R (id2497299) 1566 0 R (id2497798) 1573 0 R (id2498301) 1581 0 R (id2498307) 1582 0 R (id2499706) 1589 0 R (id2499713) 1590 0 R (id2500089) 1597 0 R (id2500094) 1598 0 R (id2501108) 1600 0 R (id2501140) 1601 0 R (id2501549) 1610 0 R (id2501792) 1630 0 R (id2501941) 1631 0 R (id2502069) 1632 0 R (id2502149) 1646 0 R (id2502154) 1647 0 R (id2502166) 1648 0 R (id2502251) 1649 0 R (id2502313) 1662 0 R (id2502485) 1668 0 R (id2502741) 1673 0 R (id2502743) 1679 0 R (id2502752) 1684 0 R (id2502775) 1680 0 R (id2502798) 1682 0 R (id2502835) 1693 0 R (id2502861) 1695 0 R (id2502887) 1687 0 R (id2502912) 1689 0 R (id2502935) 1691 0 R (id2502990) 1697 0 R (id2503017) 1699 0 R (id2503044) 1701 0 R (id2503106) 1703 0 R (id2503136) 1705 0 R (id2503165) 1707 0 R (id2503192) 1709 0 R (id2503267) 1712 0 R (id2503274) 1713 0 R (id2503301) 1715 0 R (id2503337) 1717 0 R (id2503402) 1719 0 R (id2503467) 1721 0 R (id2503532) 1724 0 R (id2503541) 1725 0 R (id2503635) 1727 0 R (id2503703) 1729 0 R (id2503738) 1731 0 R (id2503779) 1738 0 R (id2503784) 1739 0 R (id2503842) 1741 0 R (id2503879) 1749 0 R (id2503914) 1743 0 R (id2503969) 1745 0 R (id2504007) 1747 0 R (id2504033) 1751 0 R (id2504058) 1753 0 R (id2504085) 1755 0 R (id2504112) 1757 0 R (id2504151) 1759 0 R (id2504181) 1761 0 R (id2504211) 1763 0 R (id2504253) 1765 0 R (id2504286) 1767 0 R (id2504313) 1769 0 R (id2504337) 1771 0 R (id2504394) 1773 0 R (id2504419) 1776 0 R (id2504426) 1777 0 R (id2504452) 1779 0 R (id2504474) 1781 0 R (id2504498) 1783 0 R (id2504612) 1785 0 R (id2504635) 1787 0 R (id2504685) 1794 0 R (id2504693) 1795 0 R (id2504716) 1797 0 R (id2504743) 1799 0 R (id2504770) 1801 0 R (id2504806) 1803 0 R (id2504846) 1806 0 R (id2504852) 1807 0 R (id2504884) 1809 0 R (id2504930) 1811 0 R (id2504965) 1813 0 R (id2504992) 1816 0 R (id2505010) 1817 0 R (id2505032) 1819 0 R (id2505058) 1821 0 R (id2505083) 1823 0 R (id2505107) 1825 0 R (id2505153) 1827 0 R (id2505176) 1829 0 R (id2505203) 1831 0 R (id2505228) 1833 0 R (id2505266) 1836 0 R (id2505272) 1837 0 R (id2505330) 1839 0 R (id2505356) 1841 0 R (id2505393) 1849 0 R (id2505404) 1850 0 R (id2505444) 1852 0 R (id2505470) 1854 0 R (id2505500) 1856 0 R (id2505526) 1858 0 R (id2505553) 1860 0 R (id2505589) 1862 0 R (id2505625) 1864 0 R (id2505652) 1866 0 R (id2505678) 1868 0 R (id2505723) 1870 0 R (id2505765) 1873 0 R (id2505774) 1875 0 R (id2505777) 1877 0 R (incremental_zone_transfers) 1076 0 R (internet_drafts) 1872 0 R (ipv6addresses) 1137 0 R (journal) 1065 0 R (lwresd) 1144 0 R (man.dig) 1883 0 R (man.dnssec-dsfromkey) 1931 0 R (man.dnssec-keyfromlabel) 1945 0 R (man.dnssec-keygen) 1961 0 R (man.dnssec-signzone) 1979 0 R (man.host) 1916 0 R (man.named) 2033 0 R (man.named-checkconf) 2004 0 R (man.named-checkzone) 2017 0 R (man.nsupdate) 2055 0 R (man.rndc) 2077 0 R (man.rndc-confgen) 2110 0 R (man.rndc.conf) 2093 0 R (notify) 1055 0 R (options) 1263 0 R (page.1) 706 0 R (page.10) 980 0 R (page.100) 1667 0 R (page.101) 1677 0 R (page.102) 1736 0 R (page.103) 1792 0 R (page.104) 1847 0 R (page.105) 1881 0 R (page.106) 1890 0 R (page.107) 1896 0 R (page.108) 1901 0 R (page.109) 1905 0 R (page.11) 987 0 R (page.110) 1911 0 R (page.111) 1922 0 R (page.112) 1927 0 R (page.113) 1939 0 R (page.114) 1950 0 R (page.115) 1957 0 R (page.116) 1970 0 R (page.117) 1974 0 R (page.118) 1985 0 R (page.119) 1991 0 R (page.12) 999 0 R (page.120) 1995 0 R (page.121) 2003 0 R (page.122) 2016 0 R (page.123) 2025 0 R (page.124) 2029 0 R (page.125) 2041 0 R (page.126) 2045 0 R (page.127) 2052 0 R (page.128) 2063 0 R (page.129) 2068 0 R (page.13) 1004 0 R (page.130) 2073 0 R (page.131) 2083 0 R (page.132) 2090 0 R (page.133) 2100 0 R (page.134) 2106 0 R (page.135) 2118 0 R (page.14) 1013 0 R (page.15) 1024 0 R (page.16) 1032 0 R (page.17) 1039 0 R (page.18) 1045 0 R (page.19) 1053 0 R (page.2) 731 0 R (page.20) 1075 0 R (page.21) 1085 0 R (page.22) 1090 0 R (page.23) 1094 0 R (page.24) 1101 0 R (page.25) 1109 0 R (page.26) 1120 0 R (page.27) 1127 0 R (page.28) 1132 0 R (page.29) 1141 0 R (page.3) 741 0 R (page.30) 1148 0 R (page.31) 1152 0 R (page.32) 1163 0 R (page.33) 1168 0 R (page.34) 1176 0 R (page.35) 1184 0 R (page.36) 1193 0 R (page.37) 1202 0 R (page.38) 1214 0 R (page.39) 1219 0 R (page.4) 796 0 R (page.40) 1225 0 R (page.41) 1231 0 R (page.42) 1235 0 R (page.43) 1243 0 R (page.44) 1254 0 R (page.45) 1258 0 R (page.46) 1262 0 R (page.47) 1267 0 R (page.48) 1273 0 R (page.49) 1277 0 R (page.5) 860 0 R (page.50) 1284 0 R (page.51) 1295 0 R (page.52) 1299 0 R (page.53) 1303 0 R (page.54) 1313 0 R (page.55) 1320 0 R (page.56) 1327 0 R (page.57) 1331 0 R (page.58) 1335 0 R (page.59) 1339 0 R (page.6) 922 0 R (page.60) 1347 0 R (page.61) 1353 0 R (page.62) 1360 0 R (page.63) 1367 0 R (page.64) 1374 0 R (page.65) 1380 0 R (page.66) 1392 0 R (page.67) 1397 0 R (page.68) 1402 0 R (page.69) 1407 0 R (page.7) 941 0 R (page.70) 1415 0 R (page.71) 1422 0 R (page.72) 1427 0 R (page.73) 1431 0 R (page.74) 1436 0 R (page.75) 1444 0 R (page.76) 1451 0 R (page.77) 1470 0 R (page.78) 1484 0 R (page.79) 1504 0 R (page.8) 955 0 R (page.80) 1511 0 R (page.81) 1523 0 R (page.82) 1527 0 R (page.83) 1533 0 R (page.84) 1543 0 R (page.85) 1555 0 R (page.86) 1564 0 R (page.87) 1571 0 R (page.88) 1579 0 R (page.89) 1587 0 R (page.9) 969 0 R (page.90) 1596 0 R (page.91) 1606 0 R (page.92) 1615 0 R (page.93) 1619 0 R (page.94) 1625 0 R (page.95) 1636 0 R (page.96) 1640 0 R (page.97) 1644 0 R (page.98) 1656 0 R (page.99) 1660 0 R (proposed_standards) 1081 0 R (query_address) 1322 0 R (rfcs) 965 0 R (rndc) 1198 0 R (root_delegation_only) 1447 0 R (rrset_ordering) 1020 0 R (sample_configuration) 1006 0 R (section*.10) 1805 0 R (section*.100) 2091 0 R (section*.101) 2092 0 R (section*.102) 2094 0 R (section*.103) 2095 0 R (section*.104) 2096 0 R (section*.105) 2101 0 R (section*.106) 2107 0 R (section*.107) 2108 0 R (section*.108) 2109 0 R (section*.109) 2111 0 R (section*.11) 1815 0 R (section*.110) 2112 0 R (section*.111) 2113 0 R (section*.112) 2114 0 R (section*.113) 2119 0 R (section*.114) 2120 0 R (section*.115) 2121 0 R (section*.12) 1835 0 R (section*.13) 1848 0 R (section*.14) 1874 0 R (section*.15) 1884 0 R (section*.16) 1885 0 R (section*.17) 1886 0 R (section*.18) 1891 0 R (section*.19) 1892 0 R (section*.2) 1672 0 R (section*.20) 1897 0 R (section*.21) 1906 0 R (section*.22) 1912 0 R (section*.23) 1913 0 R (section*.24) 1914 0 R (section*.25) 1915 0 R (section*.26) 1917 0 R (section*.27) 1918 0 R (section*.28) 1923 0 R (section*.29) 1928 0 R (section*.3) 1678 0 R (section*.30) 1929 0 R (section*.31) 1930 0 R (section*.32) 1932 0 R (section*.33) 1933 0 R (section*.34) 1934 0 R (section*.35) 1935 0 R (section*.36) 1940 0 R (section*.37) 1941 0 R (section*.38) 1942 0 R (section*.39) 1943 0 R (section*.4) 1686 0 R (section*.40) 1944 0 R (section*.41) 1946 0 R (section*.42) 1951 0 R (section*.43) 1952 0 R (section*.44) 1953 0 R (section*.45) 1958 0 R (section*.46) 1959 0 R (section*.47) 1960 0 R (section*.48) 1962 0 R (section*.49) 1963 0 R (section*.5) 1711 0 R (section*.50) 1964 0 R (section*.51) 1965 0 R (section*.52) 1975 0 R (section*.53) 1976 0 R (section*.54) 1977 0 R (section*.55) 1978 0 R (section*.56) 1980 0 R (section*.57) 1981 0 R (section*.58) 1986 0 R (section*.59) 1987 0 R (section*.6) 1723 0 R (section*.60) 1996 0 R (section*.61) 1997 0 R (section*.62) 1998 0 R (section*.63) 1999 0 R (section*.64) 2005 0 R (section*.65) 2006 0 R (section*.66) 2007 0 R (section*.67) 2008 0 R (section*.68) 2009 0 R (section*.69) 2010 0 R (section*.7) 1737 0 R (section*.70) 2011 0 R (section*.71) 2018 0 R (section*.72) 2019 0 R (section*.73) 2020 0 R (section*.74) 2021 0 R (section*.75) 2030 0 R (section*.76) 2031 0 R (section*.77) 2032 0 R (section*.78) 2034 0 R (section*.79) 2035 0 R (section*.8) 1775 0 R (section*.80) 2036 0 R (section*.81) 2037 0 R (section*.82) 2046 0 R (section*.83) 2047 0 R (section*.84) 2048 0 R (section*.85) 2053 0 R (section*.86) 2054 0 R (section*.87) 2056 0 R (section*.88) 2057 0 R (section*.89) 2058 0 R (section*.9) 1793 0 R (section*.90) 2064 0 R (section*.91) 2069 0 R (section*.92) 2074 0 R (section*.93) 2075 0 R (section*.94) 2076 0 R (section*.95) 2078 0 R (section*.96) 2079 0 R (section*.97) 2084 0 R (section*.98) 2085 0 R (section*.99) 2086 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.2.1) 70 0 R (section.2.2) 74 0 R (section.2.3) 78 0 R (section.2.4) 82 0 R (section.2.5) 86 0 R (section.3.1) 94 0 R (section.3.2) 106 0 R (section.3.3) 110 0 R (section.4.1) 134 0 R (section.4.2) 138 0 R (section.4.3) 146 0 R (section.4.4) 150 0 R (section.4.5) 158 0 R (section.4.6) 194 0 R (section.4.7) 198 0 R (section.4.8) 202 0 R (section.4.9) 218 0 R (section.5.1) 234 0 R (section.5.2) 238 0 R (section.6.1) 246 0 R (section.6.2) 274 0 R (section.6.3) 482 0 R (section.6.4) 534 0 R (section.7.1) 570 0 R (section.7.2) 574 0 R (section.7.3) 586 0 R (section.8.1) 594 0 R (section.8.2) 602 0 R (section.8.3) 606 0 R (section.A.1) 614 0 R (section.A.2) 622 0 R (section.A.3) 630 0 R (section.B.1) 650 0 R (section.B.10) 686 0 R (section.B.11) 690 0 R (section.B.12) 694 0 R (section.B.13) 698 0 R (section.B.2) 654 0 R (section.B.3) 658 0 R (section.B.4) 662 0 R (section.B.5) 666 0 R (section.B.6) 670 0 R (section.B.7) 674 0 R (section.B.8) 678 0 R (section.B.9) 682 0 R (server_resource_limits) 1348 0 R (server_statement_definition_and_usage) 1291 0 R (server_statement_grammar) 1403 0 R (statistics) 1572 0 R (statistics_counters) 1580 0 R (statschannels) 1410 0 R (statsfile) 1269 0 R (subsection.1.4.1) 26 0 R (subsection.1.4.2) 30 0 R (subsection.1.4.3) 34 0 R (subsection.1.4.4) 38 0 R (subsection.1.4.5) 54 0 R (subsection.1.4.6) 62 0 R (subsection.3.1.1) 98 0 R (subsection.3.1.2) 102 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 126 0 R (subsection.4.2.1) 142 0 R (subsection.4.4.1) 154 0 R (subsection.4.5.1) 162 0 R (subsection.4.5.2) 174 0 R (subsection.4.5.3) 178 0 R (subsection.4.5.4) 182 0 R (subsection.4.5.5) 186 0 R (subsection.4.5.6) 190 0 R (subsection.4.8.1) 206 0 R (subsection.4.8.2) 210 0 R (subsection.4.8.3) 214 0 R (subsection.4.9.1) 222 0 R (subsection.4.9.2) 226 0 R (subsection.6.1.1) 250 0 R (subsection.6.1.2) 262 0 R (subsection.6.2.1) 278 0 R (subsection.6.2.10) 314 0 R (subsection.6.2.11) 330 0 R (subsection.6.2.12) 334 0 R (subsection.6.2.13) 338 0 R (subsection.6.2.14) 342 0 R (subsection.6.2.15) 346 0 R (subsection.6.2.16) 350 0 R (subsection.6.2.17) 426 0 R (subsection.6.2.18) 430 0 R (subsection.6.2.19) 434 0 R (subsection.6.2.2) 282 0 R (subsection.6.2.20) 438 0 R (subsection.6.2.21) 442 0 R (subsection.6.2.22) 446 0 R (subsection.6.2.23) 450 0 R (subsection.6.2.24) 454 0 R (subsection.6.2.25) 458 0 R (subsection.6.2.26) 462 0 R (subsection.6.2.3) 286 0 R (subsection.6.2.4) 290 0 R (subsection.6.2.5) 294 0 R (subsection.6.2.6) 298 0 R (subsection.6.2.7) 302 0 R (subsection.6.2.8) 306 0 R (subsection.6.2.9) 310 0 R (subsection.6.3.1) 486 0 R (subsection.6.3.2) 498 0 R (subsection.6.3.3) 502 0 R (subsection.6.3.4) 506 0 R (subsection.6.3.5) 510 0 R (subsection.6.3.6) 526 0 R (subsection.6.3.7) 530 0 R (subsection.6.4.1) 542 0 R (subsection.7.2.1) 578 0 R (subsection.7.2.2) 582 0 R (subsection.8.1.1) 598 0 R (subsection.A.1.1) 618 0 R (subsection.A.2.1) 626 0 R (subsection.A.3.1) 634 0 R (subsection.A.3.2) 638 0 R (subsection.A.3.3) 642 0 R (subsubsection.1.4.4.1) 42 0 R (subsubsection.1.4.4.2) 46 0 R (subsubsection.1.4.4.3) 50 0 R (subsubsection.1.4.5.1) 58 0 R (subsubsection.3.3.1.1) 118 0 R (subsubsection.3.3.1.2) 122 0 R (subsubsection.4.5.1.1) 166 0 R (subsubsection.4.5.1.2) 170 0 R (subsubsection.6.1.1.1) 254 0 R (subsubsection.6.1.1.2) 258 0 R (subsubsection.6.1.2.1) 266 0 R (subsubsection.6.1.2.2) 270 0 R (subsubsection.6.2.10.1) 318 0 R (subsubsection.6.2.10.2) 322 0 R (subsubsection.6.2.10.3) 326 0 R (subsubsection.6.2.16.1) 354 0 R (subsubsection.6.2.16.10) 390 0 R (subsubsection.6.2.16.11) 394 0 R (subsubsection.6.2.16.12) 398 0 R (subsubsection.6.2.16.13) 402 0 R (subsubsection.6.2.16.14) 406 0 R (subsubsection.6.2.16.15) 410 0 R (subsubsection.6.2.16.16) 414 0 R (subsubsection.6.2.16.17) 418 0 R (subsubsection.6.2.16.18) 422 0 R (subsubsection.6.2.16.2) 358 0 R (subsubsection.6.2.16.3) 362 0 R (subsubsection.6.2.16.4) 366 0 R (subsubsection.6.2.16.5) 370 0 R (subsubsection.6.2.16.6) 374 0 R (subsubsection.6.2.16.7) 378 0 R (subsubsection.6.2.16.8) 382 0 R (subsubsection.6.2.16.9) 386 0 R (subsubsection.6.2.26.1) 466 0 R (subsubsection.6.2.26.2) 470 0 R (subsubsection.6.2.26.3) 474 0 R (subsubsection.6.2.26.4) 478 0 R (subsubsection.6.3.1.1) 490 0 R (subsubsection.6.3.1.2) 494 0 R (subsubsection.6.3.5.1) 514 0 R (subsubsection.6.3.5.2) 518 0 R (subsubsection.6.3.5.3) 522 0 R (subsubsection.6.4.0.1) 538 0 R (subsubsection.6.4.1.1) 546 0 R (subsubsection.6.4.1.2) 550 0 R (subsubsection.6.4.1.3) 554 0 R (subsubsection.6.4.1.4) 558 0 R (subsubsection.6.4.1.5) 562 0 R (table.1.1) 947 0 R (table.1.2) 957 0 R (table.3.1) 1016 0 R (table.3.2) 1048 0 R (table.6.1) 1156 0 R (table.6.10) 1517 0 R (table.6.11) 1519 0 R (table.6.12) 1529 0 R (table.6.13) 1536 0 R (table.6.14) 1538 0 R (table.6.15) 1545 0 R (table.6.16) 1548 0 R (table.6.17) 1551 0 R (table.6.18) 1567 0 R (table.6.19) 1574 0 R (table.6.2) 1180 0 R (table.6.20) 1583 0 R (table.6.21) 1591 0 R (table.6.22) 1599 0 R (table.6.23) 1602 0 R (table.6.3) 1188 0 R (table.6.4) 1227 0 R (table.6.5) 1238 0 R (table.6.6) 1279 0 R (table.6.7) 1370 0 R (table.6.8) 1440 0 R (table.6.9) 1506 0 R (the_category_phrase) 1221 0 R (the_sortlist_statement) 1361 0 R (topology) 1355 0 R (tsig) 1095 0 R (tuning) 1375 0 R (types_of_resource_records_and_when_to_use_them) 964 0 R (view_statement_grammar) 1388 0 R (zone_statement_grammar) 1309 0 R (zone_transfers) 1071 0 R (zonefile_format) 1387 0 R] /Limits [(Access_Control_Lists) (zonefile_format)] >> endobj -2116 0 obj << -/Kids [2115 0 R] +2146 0 obj << +/Kids [2145 0 R] >> endobj -2117 0 obj << -/Dests 2116 0 R +2147 0 obj << +/Dests 2146 0 R >> endobj -2118 0 obj << +2148 0 obj << /Type /Catalog -/Pages 2113 0 R -/Outlines 2114 0 R -/Names 2117 0 R +/Pages 2143 0 R +/Outlines 2144 0 R +/Names 2147 0 R /PageMode /UseOutlines -/OpenAction 693 0 R +/OpenAction 701 0 R >> endobj -2119 0 obj << +2149 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20081116011130Z) +/CreationDate (D:20091231231729Z) /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref -0 2120 +0 2150 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n -0000070820 00000 n -0000731720 00000 n +0000071459 00000 n +0000744619 00000 n 0000000054 00000 n 0000000086 00000 n -0000070944 00000 n -0000731648 00000 n +0000071583 00000 n +0000744547 00000 n 0000000133 00000 n 0000000173 00000 n -0000071069 00000 n -0000731562 00000 n +0000071708 00000 n +0000744461 00000 n 0000000221 00000 n 0000000273 00000 n -0000071194 00000 n -0000731476 00000 n +0000071833 00000 n +0000744375 00000 n 0000000321 00000 n 0000000377 00000 n -0000075519 00000 n -0000731366 00000 n +0000076158 00000 n +0000744265 00000 n 0000000425 00000 n 0000000478 00000 n -0000075643 00000 n -0000731292 00000 n +0000076282 00000 n +0000744191 00000 n 0000000531 00000 n 0000000572 00000 n -0000075768 00000 n -0000731205 00000 n +0000076407 00000 n +0000744104 00000 n 0000000625 00000 n 0000000674 00000 n -0000075892 00000 n -0000731118 00000 n +0000076531 00000 n +0000744017 00000 n 0000000727 00000 n 0000000757 00000 n -0000080171 00000 n -0000730994 00000 n +0000080810 00000 n +0000743893 00000 n 0000000810 00000 n 0000000861 00000 n -0000080296 00000 n -0000730920 00000 n +0000080935 00000 n +0000743819 00000 n 0000000919 00000 n 0000000964 00000 n -0000080421 00000 n -0000730833 00000 n +0000081060 00000 n +0000743732 00000 n 0000001022 00000 n 0000001062 00000 n -0000080546 00000 n -0000730759 00000 n +0000081185 00000 n +0000743658 00000 n 0000001120 00000 n 0000001162 00000 n -0000083518 00000 n -0000730635 00000 n +0000084157 00000 n +0000743534 00000 n 0000001215 00000 n 0000001260 00000 n -0000083643 00000 n -0000730574 00000 n +0000084282 00000 n +0000743473 00000 n 0000001318 00000 n 0000001355 00000 n -0000083768 00000 n -0000730500 00000 n +0000084407 00000 n +0000743399 00000 n 0000001408 00000 n 0000001463 00000 n -0000086696 00000 n -0000730375 00000 n +0000087335 00000 n +0000743274 00000 n 0000001509 00000 n 0000001556 00000 n -0000086821 00000 n -0000730301 00000 n +0000087460 00000 n +0000743200 00000 n 0000001604 00000 n 0000001648 00000 n -0000086946 00000 n -0000730214 00000 n +0000087585 00000 n +0000743113 00000 n 0000001696 00000 n 0000001735 00000 n -0000087071 00000 n -0000730127 00000 n +0000087710 00000 n +0000743026 00000 n 0000001783 00000 n 0000001825 00000 n -0000087195 00000 n -0000730040 00000 n +0000087834 00000 n +0000742939 00000 n 0000001873 00000 n 0000001936 00000 n -0000088275 00000 n -0000729966 00000 n +0000088914 00000 n +0000742865 00000 n 0000001984 00000 n 0000002034 00000 n -0000089985 00000 n -0000729838 00000 n +0000090625 00000 n +0000742737 00000 n 0000002080 00000 n 0000002126 00000 n -0000090109 00000 n -0000729725 00000 n +0000090752 00000 n +0000742624 00000 n 0000002174 00000 n 0000002218 00000 n -0000090234 00000 n -0000729649 00000 n +0000090880 00000 n +0000742548 00000 n 0000002271 00000 n 0000002323 00000 n -0000090359 00000 n -0000729572 00000 n +0000091008 00000 n +0000742471 00000 n 0000002377 00000 n 0000002436 00000 n -0000092896 00000 n -0000729481 00000 n +0000093550 00000 n +0000742380 00000 n 0000002485 00000 n 0000002523 00000 n -0000093155 00000 n -0000729364 00000 n +0000093809 00000 n +0000742263 00000 n 0000002572 00000 n 0000002618 00000 n -0000093284 00000 n -0000729246 00000 n +0000093938 00000 n +0000742145 00000 n 0000002672 00000 n 0000002739 00000 n -0000096500 00000 n -0000729167 00000 n +0000097170 00000 n +0000742066 00000 n 0000002798 00000 n 0000002842 00000 n -0000096628 00000 n -0000729088 00000 n +0000097298 00000 n +0000741987 00000 n 0000002901 00000 n 0000002949 00000 n -0000107160 00000 n -0000729009 00000 n +0000107947 00000 n +0000741908 00000 n 0000003003 00000 n 0000003036 00000 n -0000112147 00000 n -0000728877 00000 n +0000112966 00000 n +0000741776 00000 n 0000003083 00000 n 0000003126 00000 n -0000112276 00000 n -0000728798 00000 n +0000113095 00000 n +0000741697 00000 n 0000003175 00000 n 0000003205 00000 n -0000112405 00000 n -0000728666 00000 n +0000113224 00000 n +0000741565 00000 n 0000003254 00000 n 0000003292 00000 n -0000112534 00000 n -0000728601 00000 n +0000113353 00000 n +0000741500 00000 n 0000003346 00000 n 0000003388 00000 n -0000116796 00000 n -0000728508 00000 n +0000117615 00000 n +0000741407 00000 n 0000003437 00000 n 0000003496 00000 n -0000116925 00000 n -0000728376 00000 n +0000117744 00000 n +0000741275 00000 n 0000003545 00000 n 0000003578 00000 n -0000117054 00000 n -0000728311 00000 n +0000117873 00000 n +0000741210 00000 n 0000003632 00000 n 0000003681 00000 n -0000124364 00000 n -0000728179 00000 n +0000125183 00000 n +0000741078 00000 n 0000003730 00000 n 0000003758 00000 n -0000124493 00000 n -0000728061 00000 n +0000125312 00000 n +0000740960 00000 n 0000003812 00000 n 0000003881 00000 n -0000124622 00000 n -0000727982 00000 n +0000125441 00000 n +0000740881 00000 n 0000003940 00000 n 0000003988 00000 n -0000127456 00000 n -0000727903 00000 n +0000128293 00000 n +0000740802 00000 n 0000004047 00000 n 0000004092 00000 n -0000127585 00000 n -0000727810 00000 n +0000128422 00000 n +0000740709 00000 n 0000004146 00000 n 0000004214 00000 n -0000127714 00000 n -0000727717 00000 n +0000128551 00000 n +0000740616 00000 n 0000004268 00000 n 0000004338 00000 n -0000127843 00000 n -0000727624 00000 n +0000128680 00000 n +0000740523 00000 n 0000004392 00000 n 0000004455 00000 n -0000131746 00000 n -0000727531 00000 n +0000132601 00000 n +0000740430 00000 n 0000004509 00000 n 0000004564 00000 n -0000131875 00000 n -0000727452 00000 n +0000132730 00000 n +0000740351 00000 n 0000004618 00000 n 0000004650 00000 n -0000132004 00000 n -0000727359 00000 n +0000132859 00000 n +0000740258 00000 n 0000004699 00000 n 0000004727 00000 n -0000132133 00000 n -0000727266 00000 n +0000132988 00000 n +0000740165 00000 n 0000004776 00000 n 0000004808 00000 n -0000135910 00000 n -0000727134 00000 n +0000136765 00000 n +0000740033 00000 n 0000004857 00000 n 0000004887 00000 n -0000136039 00000 n -0000727055 00000 n +0000136894 00000 n +0000739954 00000 n 0000004941 00000 n 0000004982 00000 n -0000136168 00000 n -0000726962 00000 n +0000137023 00000 n +0000739861 00000 n 0000005036 00000 n 0000005078 00000 n -0000139609 00000 n -0000726883 00000 n +0000140484 00000 n +0000739782 00000 n 0000005132 00000 n 0000005177 00000 n -0000142684 00000 n -0000726765 00000 n +0000143559 00000 n +0000739664 00000 n 0000005226 00000 n 0000005272 00000 n -0000142813 00000 n -0000726686 00000 n +0000143688 00000 n +0000739585 00000 n 0000005326 00000 n 0000005386 00000 n -0000142941 00000 n -0000726607 00000 n +0000143816 00000 n +0000739506 00000 n 0000005440 00000 n 0000005509 00000 n -0000145423 00000 n -0000726474 00000 n +0000146298 00000 n +0000739373 00000 n 0000005556 00000 n 0000005609 00000 n -0000145552 00000 n -0000726395 00000 n +0000146427 00000 n +0000739294 00000 n 0000005658 00000 n 0000005714 00000 n -0000145681 00000 n -0000726316 00000 n +0000146556 00000 n +0000739215 00000 n 0000005763 00000 n 0000005812 00000 n -0000149865 00000 n -0000726183 00000 n +0000150740 00000 n +0000739082 00000 n 0000005859 00000 n 0000005911 00000 n -0000149994 00000 n -0000726065 00000 n +0000150869 00000 n +0000738964 00000 n 0000005960 00000 n 0000006011 00000 n -0000154684 00000 n -0000725947 00000 n +0000155559 00000 n +0000738846 00000 n 0000006065 00000 n 0000006110 00000 n -0000154812 00000 n -0000725868 00000 n +0000155687 00000 n +0000738767 00000 n 0000006169 00000 n 0000006203 00000 n -0000158401 00000 n -0000725789 00000 n +0000159308 00000 n +0000738688 00000 n 0000006262 00000 n 0000006310 00000 n -0000158529 00000 n -0000725671 00000 n +0000159436 00000 n +0000738570 00000 n 0000006364 00000 n 0000006404 00000 n -0000158658 00000 n -0000725592 00000 n +0000159565 00000 n +0000738491 00000 n 0000006463 00000 n 0000006497 00000 n -0000162385 00000 n -0000725513 00000 n +0000163504 00000 n +0000738412 00000 n 0000006556 00000 n 0000006604 00000 n -0000162514 00000 n -0000725380 00000 n +0000163633 00000 n +0000738279 00000 n 0000006653 00000 n 0000006703 00000 n -0000165534 00000 n -0000725301 00000 n +0000166453 00000 n +0000738200 00000 n 0000006757 00000 n 0000006804 00000 n -0000165662 00000 n -0000725208 00000 n +0000166581 00000 n +0000738107 00000 n 0000006858 00000 n 0000006918 00000 n -0000165920 00000 n -0000725115 00000 n +0000166840 00000 n +0000738014 00000 n 0000006972 00000 n 0000007024 00000 n -0000171027 00000 n -0000725022 00000 n +0000172189 00000 n +0000737921 00000 n 0000007078 00000 n 0000007143 00000 n -0000171156 00000 n -0000724929 00000 n +0000172318 00000 n +0000737828 00000 n 0000007197 00000 n 0000007248 00000 n -0000174630 00000 n -0000724836 00000 n +0000172447 00000 n +0000737735 00000 n 0000007302 00000 n 0000007366 00000 n -0000174759 00000 n -0000724743 00000 n +0000175899 00000 n +0000737642 00000 n 0000007420 00000 n 0000007467 00000 n -0000174888 00000 n -0000724650 00000 n +0000176028 00000 n +0000737549 00000 n 0000007521 00000 n 0000007581 00000 n -0000175017 00000 n -0000724557 00000 n +0000176157 00000 n +0000737456 00000 n 0000007635 00000 n 0000007686 00000 n -0000179033 00000 n -0000724425 00000 n +0000176286 00000 n +0000737324 00000 n 0000007741 00000 n 0000007806 00000 n -0000179162 00000 n -0000724346 00000 n +0000180517 00000 n +0000737245 00000 n 0000007866 00000 n 0000007913 00000 n -0000185987 00000 n -0000724267 00000 n +0000187075 00000 n +0000737152 00000 n 0000007973 00000 n 0000008021 00000 n -0000192355 00000 n -0000724174 00000 n -0000008076 00000 n -0000008126 00000 n -0000192484 00000 n -0000724081 00000 n -0000008181 00000 n -0000008244 00000 n -0000192612 00000 n -0000723988 00000 n -0000008299 00000 n -0000008351 00000 n -0000192740 00000 n -0000723895 00000 n -0000008406 00000 n -0000008471 00000 n -0000192869 00000 n -0000723802 00000 n -0000008526 00000 n -0000008578 00000 n -0000198137 00000 n -0000723669 00000 n -0000008633 00000 n -0000008698 00000 n -0000206589 00000 n -0000723590 00000 n -0000008758 00000 n -0000008802 00000 n -0000227810 00000 n -0000723497 00000 n -0000008862 00000 n -0000008901 00000 n -0000227938 00000 n -0000723404 00000 n -0000008961 00000 n -0000009008 00000 n -0000228067 00000 n -0000723311 00000 n -0000009068 00000 n -0000009111 00000 n -0000235196 00000 n -0000723218 00000 n -0000009171 00000 n -0000009210 00000 n -0000235325 00000 n -0000723125 00000 n -0000009270 00000 n -0000009312 00000 n -0000242275 00000 n -0000723032 00000 n -0000009372 00000 n -0000009415 00000 n -0000250260 00000 n -0000722939 00000 n -0000009475 00000 n -0000009518 00000 n -0000250389 00000 n -0000722846 00000 n -0000009578 00000 n -0000009639 00000 n -0000254380 00000 n -0000722753 00000 n -0000009700 00000 n -0000009752 00000 n -0000257620 00000 n -0000722660 00000 n -0000009813 00000 n +0000194627 00000 n +0000737073 00000 n +0000008081 00000 n +0000008135 00000 n +0000194886 00000 n +0000736980 00000 n +0000008190 00000 n +0000008240 00000 n +0000197709 00000 n +0000736887 00000 n +0000008295 00000 n +0000008358 00000 n +0000197838 00000 n +0000736794 00000 n +0000008413 00000 n +0000008465 00000 n +0000197967 00000 n +0000736701 00000 n +0000008520 00000 n +0000008585 00000 n +0000198096 00000 n +0000736608 00000 n +0000008640 00000 n +0000008692 00000 n +0000203976 00000 n +0000736475 00000 n +0000008747 00000 n +0000008812 00000 n +0000212370 00000 n +0000736396 00000 n +0000008872 00000 n +0000008916 00000 n +0000233628 00000 n +0000736303 00000 n +0000008976 00000 n +0000009015 00000 n +0000233757 00000 n +0000736210 00000 n +0000009075 00000 n +0000009122 00000 n +0000233886 00000 n +0000736117 00000 n +0000009182 00000 n +0000009225 00000 n +0000240979 00000 n +0000736024 00000 n +0000009285 00000 n +0000009324 00000 n +0000241107 00000 n +0000735931 00000 n +0000009384 00000 n +0000009426 00000 n +0000248082 00000 n +0000735838 00000 n +0000009486 00000 n +0000009529 00000 n +0000255955 00000 n +0000735745 00000 n +0000009589 00000 n +0000009632 00000 n +0000256084 00000 n +0000735652 00000 n +0000009692 00000 n +0000009753 00000 n +0000260235 00000 n +0000735559 00000 n +0000009814 00000 n 0000009866 00000 n -0000257749 00000 n -0000722567 00000 n +0000263744 00000 n +0000735466 00000 n 0000009927 00000 n -0000009965 00000 n -0000261821 00000 n -0000722474 00000 n -0000010026 00000 n -0000010078 00000 n -0000265032 00000 n -0000722381 00000 n -0000010139 00000 n -0000010183 00000 n -0000265290 00000 n -0000722288 00000 n -0000010244 00000 n -0000010280 00000 n -0000274081 00000 n -0000722195 00000 n -0000010341 00000 n -0000010404 00000 n -0000277408 00000 n -0000722102 00000 n -0000010465 00000 n -0000010515 00000 n -0000281163 00000 n -0000722023 00000 n -0000010576 00000 n -0000010632 00000 n -0000284537 00000 n -0000721930 00000 n -0000010687 00000 n -0000010751 00000 n -0000284666 00000 n -0000721837 00000 n -0000010806 00000 n -0000010883 00000 n -0000284794 00000 n -0000721744 00000 n -0000010938 00000 n -0000010989 00000 n -0000289362 00000 n -0000721651 00000 n -0000011044 00000 n -0000011108 00000 n -0000292729 00000 n -0000721558 00000 n -0000011163 00000 n -0000011220 00000 n -0000292857 00000 n -0000721465 00000 n -0000011275 00000 n -0000011345 00000 n -0000292986 00000 n -0000721372 00000 n -0000011400 00000 n -0000011449 00000 n -0000293115 00000 n -0000721279 00000 n -0000011504 00000 n -0000011566 00000 n -0000297818 00000 n -0000721186 00000 n -0000011621 00000 n -0000011670 00000 n -0000301909 00000 n -0000721068 00000 n -0000011725 00000 n -0000011787 00000 n -0000302038 00000 n -0000720989 00000 n -0000011847 00000 n -0000011886 00000 n -0000306096 00000 n -0000720896 00000 n -0000011946 00000 n -0000011980 00000 n -0000311992 00000 n -0000720803 00000 n -0000012040 00000 n -0000012081 00000 n -0000323134 00000 n -0000720724 00000 n -0000012141 00000 n -0000012193 00000 n -0000330383 00000 n -0000720592 00000 n -0000012242 00000 n -0000012275 00000 n -0000330512 00000 n -0000720474 00000 n -0000012329 00000 n -0000012401 00000 n -0000330640 00000 n -0000720395 00000 n -0000012460 00000 n -0000012504 00000 n -0000341427 00000 n -0000720316 00000 n -0000012563 00000 n -0000012616 00000 n -0000341814 00000 n -0000720223 00000 n -0000012670 00000 n -0000012720 00000 n -0000345189 00000 n -0000720130 00000 n -0000012774 00000 n -0000012812 00000 n -0000345448 00000 n -0000720037 00000 n -0000012866 00000 n -0000012915 00000 n -0000348312 00000 n -0000719905 00000 n -0000012969 00000 n -0000013021 00000 n -0000348440 00000 n -0000719826 00000 n -0000013080 00000 n -0000013132 00000 n -0000348569 00000 n -0000719733 00000 n -0000013191 00000 n -0000013244 00000 n -0000348698 00000 n -0000719654 00000 n -0000013303 00000 n -0000013352 00000 n -0000352344 00000 n -0000719561 00000 n -0000013406 00000 n -0000013486 00000 n -0000356394 00000 n -0000719482 00000 n -0000013540 00000 n -0000013589 00000 n -0000356523 00000 n -0000719364 00000 n -0000013638 00000 n -0000013678 00000 n -0000359826 00000 n -0000719285 00000 n -0000013737 00000 n -0000013784 00000 n -0000359955 00000 n -0000719167 00000 n -0000013838 00000 n -0000013883 00000 n -0000360084 00000 n -0000719088 00000 n -0000013942 00000 n -0000014001 00000 n -0000363183 00000 n -0000718995 00000 n -0000014060 00000 n -0000014124 00000 n -0000363442 00000 n -0000718902 00000 n -0000014183 00000 n -0000014239 00000 n -0000366164 00000 n -0000718823 00000 n -0000014298 00000 n -0000014360 00000 n -0000368398 00000 n -0000718690 00000 n -0000014407 00000 n -0000014459 00000 n -0000368527 00000 n -0000718611 00000 n -0000014508 00000 n -0000014552 00000 n -0000372713 00000 n -0000718479 00000 n -0000014601 00000 n -0000014642 00000 n -0000372842 00000 n -0000718400 00000 n -0000014696 00000 n -0000014744 00000 n -0000372970 00000 n -0000718321 00000 n -0000014798 00000 n -0000014849 00000 n -0000373099 00000 n -0000718242 00000 n -0000014898 00000 n -0000014945 00000 n -0000377366 00000 n -0000718109 00000 n -0000014992 00000 n +0000009980 00000 n +0000263873 00000 n +0000735373 00000 n +0000010041 00000 n +0000010079 00000 n +0000267780 00000 n +0000735280 00000 n +0000010140 00000 n +0000010192 00000 n +0000271179 00000 n +0000735187 00000 n +0000010253 00000 n +0000010297 00000 n +0000275345 00000 n +0000735094 00000 n +0000010358 00000 n +0000010394 00000 n +0000280135 00000 n +0000735001 00000 n +0000010455 00000 n +0000010518 00000 n +0000283544 00000 n +0000734908 00000 n +0000010579 00000 n +0000010629 00000 n +0000287237 00000 n +0000734829 00000 n +0000010690 00000 n +0000010746 00000 n +0000290642 00000 n +0000734736 00000 n +0000010801 00000 n +0000010852 00000 n +0000290771 00000 n +0000734643 00000 n +0000010907 00000 n +0000010971 00000 n +0000295142 00000 n +0000734550 00000 n +0000011026 00000 n +0000011090 00000 n +0000295271 00000 n +0000734457 00000 n +0000011145 00000 n +0000011222 00000 n +0000298928 00000 n +0000734364 00000 n +0000011277 00000 n +0000011334 00000 n +0000299057 00000 n +0000734271 00000 n +0000011389 00000 n +0000011459 00000 n +0000299186 00000 n +0000734178 00000 n +0000011514 00000 n +0000011563 00000 n +0000302629 00000 n +0000734085 00000 n +0000011618 00000 n +0000011680 00000 n +0000304248 00000 n +0000733992 00000 n +0000011735 00000 n +0000011784 00000 n +0000308427 00000 n +0000733874 00000 n +0000011839 00000 n +0000011901 00000 n +0000308556 00000 n +0000733795 00000 n +0000011961 00000 n +0000012000 00000 n +0000312881 00000 n +0000733702 00000 n +0000012060 00000 n +0000012094 00000 n +0000318771 00000 n +0000733609 00000 n +0000012154 00000 n +0000012195 00000 n +0000330157 00000 n +0000733530 00000 n +0000012255 00000 n +0000012307 00000 n +0000337397 00000 n +0000733398 00000 n +0000012356 00000 n +0000012389 00000 n +0000337526 00000 n +0000733280 00000 n +0000012443 00000 n +0000012515 00000 n +0000337654 00000 n +0000733201 00000 n +0000012574 00000 n +0000012618 00000 n +0000348444 00000 n +0000733122 00000 n +0000012677 00000 n +0000012730 00000 n +0000348831 00000 n +0000733029 00000 n +0000012784 00000 n +0000012834 00000 n +0000352195 00000 n +0000732936 00000 n +0000012888 00000 n +0000012926 00000 n +0000352454 00000 n +0000732843 00000 n +0000012980 00000 n +0000013029 00000 n +0000355319 00000 n +0000732711 00000 n +0000013083 00000 n +0000013135 00000 n +0000355447 00000 n +0000732632 00000 n +0000013194 00000 n +0000013246 00000 n +0000355576 00000 n +0000732539 00000 n +0000013305 00000 n +0000013358 00000 n +0000355705 00000 n +0000732460 00000 n +0000013417 00000 n +0000013466 00000 n +0000359352 00000 n +0000732367 00000 n +0000013520 00000 n +0000013600 00000 n +0000363488 00000 n +0000732288 00000 n +0000013654 00000 n +0000013703 00000 n +0000363617 00000 n +0000732170 00000 n +0000013752 00000 n +0000013792 00000 n +0000366917 00000 n +0000732091 00000 n +0000013851 00000 n +0000013898 00000 n +0000367046 00000 n +0000731973 00000 n +0000013952 00000 n +0000013997 00000 n +0000367175 00000 n +0000731894 00000 n +0000014056 00000 n +0000014115 00000 n +0000370864 00000 n +0000731801 00000 n +0000014174 00000 n +0000014238 00000 n +0000374585 00000 n +0000731708 00000 n +0000014297 00000 n +0000014353 00000 n +0000374843 00000 n +0000731615 00000 n +0000014412 00000 n +0000014470 00000 n +0000377514 00000 n +0000731536 00000 n +0000014529 00000 n +0000014591 00000 n +0000379759 00000 n +0000731403 00000 n +0000014638 00000 n +0000014690 00000 n +0000379888 00000 n +0000731324 00000 n +0000014739 00000 n +0000014783 00000 n +0000384086 00000 n +0000731192 00000 n +0000014832 00000 n +0000014873 00000 n +0000384215 00000 n +0000731113 00000 n +0000014927 00000 n +0000014975 00000 n +0000384343 00000 n +0000731034 00000 n 0000015029 00000 n -0000377495 00000 n -0000717991 00000 n -0000015078 00000 n -0000015117 00000 n -0000377624 00000 n -0000717926 00000 n -0000015171 00000 n -0000015249 00000 n -0000377753 00000 n -0000717833 00000 n -0000015298 00000 n -0000015365 00000 n -0000377882 00000 n -0000717754 00000 n -0000015414 00000 n -0000015459 00000 n -0000381321 00000 n -0000717621 00000 n -0000015507 00000 n -0000015539 00000 n -0000381450 00000 n -0000717503 00000 n -0000015588 00000 n -0000015627 00000 n -0000381579 00000 n -0000717438 00000 n -0000015681 00000 n -0000015742 00000 n -0000385344 00000 n -0000717306 00000 n -0000015791 00000 n -0000015848 00000 n -0000385473 00000 n -0000717241 00000 n -0000015902 00000 n -0000015951 00000 n -0000385602 00000 n -0000717123 00000 n -0000016000 00000 n -0000016062 00000 n -0000385731 00000 n -0000717044 00000 n -0000016116 00000 n -0000016171 00000 n -0000409752 00000 n -0000716951 00000 n -0000016225 00000 n -0000016266 00000 n -0000409881 00000 n -0000716872 00000 n -0000016320 00000 n -0000016372 00000 n -0000412612 00000 n -0000716752 00000 n -0000016420 00000 n -0000016454 00000 n -0000412741 00000 n -0000716673 00000 n -0000016503 00000 n -0000016530 00000 n -0000430434 00000 n -0000716580 00000 n -0000016579 00000 n -0000016607 00000 n -0000437928 00000 n -0000716487 00000 n -0000016656 00000 n -0000016696 00000 n -0000440723 00000 n -0000716394 00000 n -0000016745 00000 n -0000016788 00000 n -0000446647 00000 n -0000716301 00000 n -0000016837 00000 n -0000016874 00000 n -0000453150 00000 n -0000716208 00000 n -0000016923 00000 n -0000016962 00000 n -0000462862 00000 n -0000716115 00000 n -0000017011 00000 n -0000017050 00000 n -0000465578 00000 n -0000716022 00000 n -0000017099 00000 n -0000017138 00000 n -0000475305 00000 n -0000715929 00000 n -0000017187 00000 n -0000017216 00000 n -0000481121 00000 n -0000715836 00000 n -0000017266 00000 n -0000017299 00000 n -0000495077 00000 n -0000715743 00000 n -0000017349 00000 n -0000017378 00000 n -0000498576 00000 n -0000715650 00000 n -0000017428 00000 n -0000017462 00000 n -0000504687 00000 n -0000715571 00000 n -0000017512 00000 n -0000017549 00000 n -0000017918 00000 n -0000018040 00000 n -0000025869 00000 n -0000017602 00000 n -0000025743 00000 n -0000025806 00000 n -0000711071 00000 n -0000685128 00000 n -0000710897 00000 n -0000712096 00000 n -0000020903 00000 n -0000021120 00000 n -0000021189 00000 n -0000021258 00000 n -0000021326 00000 n -0000021394 00000 n -0000021443 00000 n -0000021490 00000 n -0000021823 00000 n -0000021845 00000 n -0000022013 00000 n -0000022178 00000 n -0000022347 00000 n -0000022526 00000 n -0000022835 00000 n -0000022995 00000 n -0000027233 00000 n -0000027048 00000 n -0000025969 00000 n -0000027170 00000 n -0000683907 00000 n -0000657386 00000 n -0000683733 00000 n -0000656701 00000 n -0000654557 00000 n -0000656537 00000 n -0000038940 00000 n -0000030289 00000 n -0000027318 00000 n -0000038814 00000 n -0000038877 00000 n -0000030823 00000 n -0000030977 00000 n -0000031134 00000 n -0000031291 00000 n -0000031447 00000 n -0000031604 00000 n -0000031766 00000 n -0000031927 00000 n -0000032088 00000 n -0000032250 00000 n -0000032417 00000 n -0000032584 00000 n -0000032749 00000 n -0000032911 00000 n -0000033077 00000 n -0000033238 00000 n -0000033393 00000 n -0000033550 00000 n -0000033706 00000 n -0000033863 00000 n -0000034020 00000 n -0000034177 00000 n -0000034331 00000 n -0000034487 00000 n -0000034649 00000 n -0000034811 00000 n -0000034967 00000 n -0000035124 00000 n -0000035286 00000 n -0000035453 00000 n -0000035619 00000 n -0000035780 00000 n -0000035935 00000 n -0000036092 00000 n -0000036249 00000 n -0000036411 00000 n -0000036568 00000 n -0000036725 00000 n -0000036887 00000 n -0000037044 00000 n -0000037206 00000 n -0000037373 00000 n -0000037539 00000 n -0000037701 00000 n -0000037863 00000 n -0000038025 00000 n -0000038187 00000 n -0000038349 00000 n -0000038504 00000 n -0000038659 00000 n -0000052318 00000 n -0000042272 00000 n -0000039025 00000 n -0000052255 00000 n -0000654006 00000 n -0000636925 00000 n -0000653822 00000 n -0000042862 00000 n -0000043025 00000 n -0000043187 00000 n -0000043350 00000 n -0000043508 00000 n -0000043671 00000 n -0000043834 00000 n -0000043989 00000 n -0000044147 00000 n -0000044305 00000 n -0000044461 00000 n -0000044619 00000 n -0000044782 00000 n -0000044950 00000 n -0000045118 00000 n -0000045281 00000 n -0000045449 00000 n -0000045617 00000 n -0000045775 00000 n -0000045938 00000 n -0000046101 00000 n -0000046263 00000 n -0000046425 00000 n -0000046588 00000 n -0000046750 00000 n -0000046912 00000 n -0000047075 00000 n -0000047238 00000 n -0000047401 00000 n -0000047570 00000 n -0000047739 00000 n -0000047903 00000 n -0000048066 00000 n -0000048230 00000 n -0000048394 00000 n -0000048557 00000 n -0000048721 00000 n -0000048890 00000 n -0000049059 00000 n -0000049228 00000 n -0000049397 00000 n -0000049566 00000 n -0000049735 00000 n -0000049904 00000 n -0000050073 00000 n -0000050242 00000 n -0000050412 00000 n -0000050582 00000 n -0000050752 00000 n -0000050922 00000 n -0000051092 00000 n -0000051262 00000 n -0000051432 00000 n -0000051601 00000 n -0000051771 00000 n -0000051932 00000 n -0000052093 00000 n -0000065459 00000 n -0000055941 00000 n -0000052416 00000 n -0000065396 00000 n -0000056515 00000 n -0000056678 00000 n -0000056841 00000 n -0000057004 00000 n -0000057167 00000 n -0000057330 00000 n -0000057493 00000 n -0000057656 00000 n -0000057824 00000 n -0000057991 00000 n -0000058159 00000 n -0000058327 00000 n -0000058484 00000 n -0000058646 00000 n -0000058811 00000 n -0000058977 00000 n -0000059139 00000 n -0000059301 00000 n -0000059463 00000 n -0000059625 00000 n -0000059792 00000 n -0000059959 00000 n -0000060126 00000 n -0000060288 00000 n -0000060450 00000 n -0000060607 00000 n -0000060774 00000 n -0000060936 00000 n -0000061103 00000 n -0000061270 00000 n -0000636036 00000 n -0000614704 00000 n -0000635862 00000 n -0000061437 00000 n -0000061604 00000 n -0000061759 00000 n -0000061916 00000 n -0000062073 00000 n -0000062235 00000 n -0000062396 00000 n -0000062552 00000 n -0000062707 00000 n -0000062864 00000 n -0000063026 00000 n -0000063183 00000 n -0000063340 00000 n -0000063496 00000 n -0000063652 00000 n -0000063813 00000 n -0000063970 00000 n -0000064132 00000 n -0000064289 00000 n -0000064451 00000 n -0000064613 00000 n -0000064775 00000 n -0000064931 00000 n -0000065086 00000 n -0000065241 00000 n -0000068260 00000 n -0000066412 00000 n -0000065570 00000 n -0000068197 00000 n -0000066626 00000 n -0000066783 00000 n -0000066940 00000 n -0000067096 00000 n -0000067253 00000 n -0000067409 00000 n -0000067566 00000 n -0000067724 00000 n -0000613738 00000 n -0000593771 00000 n -0000613565 00000 n -0000067882 00000 n -0000068039 00000 n -0000071445 00000 n -0000070635 00000 n -0000068358 00000 n -0000070757 00000 n -0000070881 00000 n -0000071006 00000 n -0000071131 00000 n -0000071256 00000 n -0000071319 00000 n -0000071382 00000 n -0000592977 00000 n -0000574660 00000 n -0000592804 00000 n -0000712214 00000 n -0000076016 00000 n -0000074836 00000 n -0000071569 00000 n -0000075330 00000 n -0000075393 00000 n -0000075456 00000 n -0000075580 00000 n -0000075705 00000 n -0000075830 00000 n -0000074986 00000 n -0000075179 00000 n -0000075953 00000 n -0000330576 00000 n -0000385795 00000 n -0000080671 00000 n -0000079635 00000 n -0000076140 00000 n -0000080108 00000 n -0000080233 00000 n -0000079785 00000 n -0000079947 00000 n -0000080358 00000 n -0000080483 00000 n -0000080608 00000 n -0000096564 00000 n -0000083893 00000 n -0000083333 00000 n -0000080795 00000 n -0000083455 00000 n -0000083580 00000 n -0000083705 00000 n -0000083830 00000 n -0000087320 00000 n -0000086179 00000 n -0000084004 00000 n -0000086633 00000 n -0000086758 00000 n -0000086883 00000 n -0000087008 00000 n -0000087133 00000 n -0000086329 00000 n -0000086481 00000 n -0000087257 00000 n -0000281227 00000 n -0000088400 00000 n -0000088090 00000 n -0000087405 00000 n -0000088212 00000 n -0000088337 00000 n -0000090485 00000 n -0000089800 00000 n -0000088498 00000 n -0000089922 00000 n -0000090047 00000 n -0000090171 00000 n -0000090296 00000 n -0000090422 00000 n -0000712332 00000 n -0000093412 00000 n -0000092524 00000 n -0000090583 00000 n -0000092831 00000 n -0000092960 00000 n -0000093025 00000 n -0000093090 00000 n -0000092670 00000 n -0000093219 00000 n -0000093348 00000 n -0000265096 00000 n -0000096757 00000 n -0000096310 00000 n -0000093524 00000 n -0000096435 00000 n -0000573985 00000 n -0000561996 00000 n -0000573806 00000 n -0000096692 00000 n -0000100548 00000 n -0000100358 00000 n -0000096883 00000 n -0000100483 00000 n -0000561455 00000 n -0000551709 00000 n -0000561276 00000 n -0000105074 00000 n -0000104676 00000 n -0000100714 00000 n -0000105009 00000 n -0000104822 00000 n -0000171091 00000 n -0000107419 00000 n -0000106970 00000 n -0000105213 00000 n -0000107095 00000 n -0000107224 00000 n -0000107289 00000 n -0000107354 00000 n -0000110116 00000 n -0000112663 00000 n -0000109960 00000 n -0000107544 00000 n -0000112082 00000 n -0000112211 00000 n -0000112340 00000 n -0000111759 00000 n -0000111921 00000 n -0000550839 00000 n -0000541419 00000 n -0000550665 00000 n -0000540855 00000 n -0000531769 00000 n -0000540680 00000 n -0000112469 00000 n -0000112598 00000 n -0000712455 00000 n -0000111588 00000 n -0000111646 00000 n -0000111736 00000 n -0000206653 00000 n -0000242339 00000 n -0000117183 00000 n -0000116248 00000 n -0000112819 00000 n -0000116731 00000 n -0000116860 00000 n -0000116404 00000 n -0000116569 00000 n -0000116989 00000 n -0000117118 00000 n -0000389821 00000 n -0000120797 00000 n -0000120417 00000 n -0000117335 00000 n -0000120732 00000 n -0000120564 00000 n -0000122047 00000 n -0000121856 00000 n -0000120922 00000 n -0000121982 00000 n -0000124750 00000 n -0000124173 00000 n -0000122146 00000 n -0000124299 00000 n -0000124428 00000 n -0000124557 00000 n -0000124686 00000 n -0000127972 00000 n -0000127265 00000 n -0000124888 00000 n -0000127391 00000 n -0000127520 00000 n -0000127649 00000 n -0000127778 00000 n -0000127907 00000 n -0000132261 00000 n -0000131363 00000 n -0000128097 00000 n -0000131681 00000 n -0000131810 00000 n -0000131510 00000 n -0000131939 00000 n -0000132068 00000 n -0000132196 00000 n -0000712580 00000 n -0000323198 00000 n -0000136297 00000 n -0000135719 00000 n -0000132386 00000 n -0000135845 00000 n -0000135974 00000 n -0000136103 00000 n -0000136232 00000 n -0000139738 00000 n -0000139418 00000 n -0000136435 00000 n -0000139544 00000 n -0000139673 00000 n -0000143070 00000 n -0000142311 00000 n -0000139850 00000 n -0000142619 00000 n -0000142748 00000 n -0000142458 00000 n -0000142877 00000 n -0000143005 00000 n -0000385537 00000 n -0000145810 00000 n -0000145232 00000 n -0000143238 00000 n -0000145358 00000 n -0000145487 00000 n -0000145616 00000 n -0000145745 00000 n -0000146250 00000 n -0000146059 00000 n -0000145909 00000 n -0000146185 00000 n -0000150252 00000 n -0000149486 00000 n -0000146292 00000 n -0000149800 00000 n -0000149929 00000 n -0000150057 00000 n -0000150122 00000 n -0000150187 00000 n -0000149633 00000 n -0000712705 00000 n -0000154748 00000 n -0000154940 00000 n -0000154493 00000 n -0000150351 00000 n -0000154619 00000 n -0000154875 00000 n -0000158787 00000 n -0000158210 00000 n -0000155065 00000 n -0000158336 00000 n -0000158464 00000 n -0000158593 00000 n -0000158722 00000 n -0000161394 00000 n -0000162773 00000 n -0000161268 00000 n -0000158925 00000 n -0000162320 00000 n -0000162449 00000 n -0000162578 00000 n -0000162643 00000 n -0000162708 00000 n -0000166049 00000 n -0000165343 00000 n -0000162928 00000 n -0000165469 00000 n -0000165597 00000 n -0000165726 00000 n -0000165790 00000 n -0000165855 00000 n -0000165984 00000 n -0000171284 00000 n -0000170496 00000 n -0000166161 00000 n -0000170962 00000 n -0000170652 00000 n -0000170803 00000 n -0000171220 00000 n -0000510397 00000 n -0000175146 00000 n -0000173875 00000 n -0000171422 00000 n -0000174565 00000 n -0000174694 00000 n -0000174823 00000 n -0000174952 00000 n -0000174040 00000 n -0000174192 00000 n -0000174378 00000 n -0000175081 00000 n -0000712830 00000 n -0000179291 00000 n -0000178842 00000 n -0000175272 00000 n -0000178968 00000 n -0000179097 00000 n -0000179226 00000 n -0000183212 00000 n -0000182833 00000 n -0000179416 00000 n -0000183147 00000 n -0000182980 00000 n -0000186051 00000 n -0000186245 00000 n -0000185796 00000 n -0000183324 00000 n -0000185922 00000 n -0000186116 00000 n -0000186181 00000 n -0000189675 00000 n -0000189484 00000 n -0000186357 00000 n -0000189610 00000 n -0000192997 00000 n -0000191830 00000 n -0000189787 00000 n -0000192290 00000 n -0000192419 00000 n -0000192548 00000 n -0000191986 00000 n -0000192140 00000 n -0000192676 00000 n -0000192804 00000 n -0000192932 00000 n -0000194483 00000 n -0000194292 00000 n -0000193109 00000 n -0000194418 00000 n -0000712955 00000 n -0000196016 00000 n -0000195825 00000 n -0000194582 00000 n -0000195951 00000 n -0000198266 00000 n -0000197946 00000 n -0000196115 00000 n -0000198072 00000 n -0000198201 00000 n -0000202789 00000 n -0000202420 00000 n -0000198378 00000 n -0000202724 00000 n -0000202567 00000 n -0000359890 00000 n -0000206718 00000 n -0000206398 00000 n -0000202927 00000 n -0000206524 00000 n -0000210794 00000 n -0000210300 00000 n -0000206843 00000 n -0000210599 00000 n -0000210664 00000 n -0000210729 00000 n -0000210447 00000 n -0000215794 00000 n -0000214662 00000 n -0000210919 00000 n -0000215729 00000 n -0000214845 00000 n -0000215002 00000 n -0000215186 00000 n -0000215359 00000 n -0000215544 00000 n -0000713080 00000 n -0000289426 00000 n -0000220074 00000 n -0000219883 00000 n -0000215975 00000 n -0000220009 00000 n -0000223936 00000 n -0000223745 00000 n -0000220199 00000 n -0000223871 00000 n -0000228196 00000 n -0000227253 00000 n -0000224048 00000 n -0000227745 00000 n -0000227873 00000 n -0000227409 00000 n -0000228002 00000 n -0000228131 00000 n -0000227579 00000 n -0000297882 00000 n -0000232129 00000 n -0000231567 00000 n -0000228365 00000 n -0000232064 00000 n -0000231723 00000 n -0000231893 00000 n -0000373163 00000 n -0000235454 00000 n -0000235005 00000 n -0000232298 00000 n -0000235131 00000 n -0000235260 00000 n -0000235389 00000 n -0000238850 00000 n -0000238659 00000 n -0000235579 00000 n -0000238785 00000 n -0000713205 00000 n -0000242404 00000 n -0000242084 00000 n -0000239019 00000 n -0000242210 00000 n -0000246107 00000 n -0000245916 00000 n -0000242560 00000 n -0000246042 00000 n -0000250518 00000 n -0000249704 00000 n -0000246276 00000 n -0000250195 00000 n -0000250324 00000 n -0000249860 00000 n -0000250453 00000 n -0000250021 00000 n -0000254509 00000 n -0000254014 00000 n -0000250673 00000 n -0000254315 00000 n -0000254444 00000 n -0000254161 00000 n -0000257878 00000 n -0000257429 00000 n -0000254634 00000 n -0000257555 00000 n -0000257684 00000 n -0000257813 00000 n -0000261950 00000 n -0000261283 00000 n -0000258033 00000 n -0000261756 00000 n -0000261885 00000 n -0000261439 00000 n -0000261601 00000 n -0000713330 00000 n -0000265418 00000 n -0000264650 00000 n -0000262119 00000 n -0000264967 00000 n -0000264797 00000 n -0000265160 00000 n -0000265225 00000 n -0000265354 00000 n -0000269455 00000 n -0000269083 00000 n -0000265601 00000 n -0000269390 00000 n -0000269230 00000 n -0000274209 00000 n -0000273530 00000 n -0000269623 00000 n -0000274016 00000 n -0000273686 00000 n -0000531414 00000 n -0000529417 00000 n -0000531249 00000 n -0000274144 00000 n -0000273849 00000 n -0000356458 00000 n -0000293050 00000 n -0000277537 00000 n -0000277217 00000 n -0000274335 00000 n -0000277343 00000 n -0000277472 00000 n -0000281291 00000 n -0000280972 00000 n -0000277662 00000 n -0000281098 00000 n -0000284923 00000 n -0000284346 00000 n -0000281433 00000 n -0000284472 00000 n -0000284601 00000 n -0000284730 00000 n -0000284858 00000 n -0000713455 00000 n -0000289491 00000 n -0000289000 00000 n -0000285035 00000 n -0000289297 00000 n -0000289147 00000 n -0000293243 00000 n -0000292193 00000 n -0000289603 00000 n -0000292664 00000 n -0000292349 00000 n -0000292792 00000 n -0000292921 00000 n -0000292511 00000 n -0000293179 00000 n -0000296310 00000 n -0000296119 00000 n -0000293355 00000 n -0000296245 00000 n -0000297947 00000 n -0000297627 00000 n -0000296422 00000 n -0000297753 00000 n -0000299421 00000 n -0000299230 00000 n -0000298059 00000 n -0000299356 00000 n -0000302297 00000 n -0000301718 00000 n -0000299520 00000 n -0000301844 00000 n -0000301973 00000 n -0000302102 00000 n -0000302167 00000 n -0000302232 00000 n -0000713580 00000 n -0000306225 00000 n -0000305905 00000 n -0000302409 00000 n -0000306031 00000 n -0000306160 00000 n -0000312121 00000 n -0000309387 00000 n -0000306337 00000 n -0000311927 00000 n -0000312056 00000 n -0000309651 00000 n -0000309813 00000 n -0000309975 00000 n -0000310136 00000 n -0000310296 00000 n -0000310458 00000 n -0000310629 00000 n -0000310791 00000 n -0000310953 00000 n -0000311114 00000 n -0000311275 00000 n -0000311438 00000 n -0000311601 00000 n -0000311764 00000 n -0000317105 00000 n -0000315364 00000 n -0000312233 00000 n -0000317040 00000 n -0000315583 00000 n -0000315744 00000 n -0000315913 00000 n -0000316075 00000 n -0000316237 00000 n -0000316399 00000 n -0000316560 00000 n -0000316723 00000 n -0000316877 00000 n -0000323263 00000 n -0000320266 00000 n -0000317230 00000 n -0000323069 00000 n -0000320548 00000 n -0000320702 00000 n -0000320856 00000 n -0000321010 00000 n -0000321164 00000 n -0000321325 00000 n -0000321487 00000 n -0000321647 00000 n -0000321807 00000 n -0000321969 00000 n -0000322129 00000 n -0000322288 00000 n -0000322439 00000 n -0000322602 00000 n -0000322753 00000 n -0000322915 00000 n -0000326791 00000 n -0000326470 00000 n -0000323375 00000 n -0000326596 00000 n -0000326661 00000 n -0000326726 00000 n -0000331027 00000 n -0000329830 00000 n -0000326960 00000 n -0000330318 00000 n -0000330447 00000 n -0000330704 00000 n -0000329986 00000 n -0000330156 00000 n -0000330769 00000 n -0000330834 00000 n -0000330899 00000 n -0000330963 00000 n -0000713705 00000 n -0000334374 00000 n -0000334183 00000 n -0000331209 00000 n -0000334309 00000 n -0000338114 00000 n -0000337793 00000 n -0000334460 00000 n -0000337919 00000 n -0000337984 00000 n -0000338049 00000 n -0000341943 00000 n -0000341236 00000 n -0000338226 00000 n -0000341362 00000 n -0000341491 00000 n -0000341554 00000 n -0000341619 00000 n -0000341684 00000 n -0000341749 00000 n -0000341878 00000 n -0000345707 00000 n -0000344868 00000 n -0000342055 00000 n -0000344994 00000 n -0000345059 00000 n -0000345124 00000 n -0000345253 00000 n -0000345318 00000 n -0000345383 00000 n -0000345512 00000 n -0000345577 00000 n -0000345642 00000 n -0000348826 00000 n -0000348121 00000 n -0000345832 00000 n -0000348247 00000 n -0000348375 00000 n -0000348504 00000 n -0000348633 00000 n -0000348762 00000 n -0000352603 00000 n -0000352153 00000 n -0000349023 00000 n -0000352279 00000 n -0000352408 00000 n -0000352473 00000 n -0000352538 00000 n -0000713830 00000 n -0000356782 00000 n -0000356024 00000 n -0000352742 00000 n -0000356329 00000 n -0000356587 00000 n -0000356652 00000 n -0000356717 00000 n -0000356171 00000 n -0000360343 00000 n -0000359635 00000 n -0000356907 00000 n -0000359761 00000 n -0000360019 00000 n -0000360148 00000 n -0000360213 00000 n -0000360278 00000 n -0000363634 00000 n -0000362992 00000 n -0000360455 00000 n +0000015080 00000 n +0000384472 00000 n +0000730955 00000 n +0000015129 00000 n +0000015176 00000 n +0000388739 00000 n +0000730822 00000 n +0000015223 00000 n +0000015260 00000 n +0000388868 00000 n +0000730704 00000 n +0000015309 00000 n +0000015348 00000 n +0000388997 00000 n +0000730639 00000 n +0000015402 00000 n +0000015480 00000 n +0000389126 00000 n +0000730546 00000 n +0000015529 00000 n +0000015596 00000 n +0000389255 00000 n +0000730467 00000 n +0000015645 00000 n +0000015690 00000 n +0000392694 00000 n +0000730334 00000 n +0000015738 00000 n +0000015770 00000 n +0000392823 00000 n +0000730216 00000 n +0000015819 00000 n +0000015858 00000 n +0000392952 00000 n +0000730151 00000 n +0000015912 00000 n +0000015973 00000 n +0000396633 00000 n +0000730019 00000 n +0000016022 00000 n +0000016079 00000 n +0000396762 00000 n +0000729954 00000 n +0000016133 00000 n +0000016182 00000 n +0000396891 00000 n +0000729836 00000 n +0000016231 00000 n +0000016293 00000 n +0000397020 00000 n +0000729757 00000 n +0000016347 00000 n +0000016402 00000 n +0000421042 00000 n +0000729664 00000 n +0000016456 00000 n +0000016497 00000 n +0000421171 00000 n +0000729585 00000 n +0000016551 00000 n +0000016603 00000 n +0000423902 00000 n +0000729465 00000 n +0000016651 00000 n +0000016685 00000 n +0000424031 00000 n +0000729386 00000 n +0000016734 00000 n +0000016761 00000 n +0000441854 00000 n +0000729293 00000 n +0000016810 00000 n +0000016838 00000 n +0000449343 00000 n +0000729200 00000 n +0000016887 00000 n +0000016927 00000 n +0000452138 00000 n +0000729107 00000 n +0000016976 00000 n +0000017019 00000 n +0000458062 00000 n +0000729014 00000 n +0000017068 00000 n +0000017105 00000 n +0000464564 00000 n +0000728921 00000 n +0000017154 00000 n +0000017193 00000 n +0000476717 00000 n +0000728828 00000 n +0000017242 00000 n +0000017281 00000 n +0000480140 00000 n +0000728735 00000 n +0000017330 00000 n +0000017369 00000 n +0000486583 00000 n +0000728642 00000 n +0000017418 00000 n +0000017447 00000 n +0000496757 00000 n +0000728549 00000 n +0000017497 00000 n +0000017530 00000 n +0000506693 00000 n +0000728456 00000 n +0000017580 00000 n +0000017609 00000 n +0000513987 00000 n +0000728363 00000 n +0000017659 00000 n +0000017693 00000 n +0000519675 00000 n +0000728284 00000 n +0000017743 00000 n +0000017780 00000 n +0000018149 00000 n +0000018271 00000 n +0000026100 00000 n +0000017833 00000 n +0000025974 00000 n +0000026037 00000 n +0000723763 00000 n +0000697820 00000 n +0000723589 00000 n +0000724788 00000 n +0000021134 00000 n +0000021351 00000 n +0000021420 00000 n +0000021489 00000 n +0000021557 00000 n +0000021625 00000 n +0000021674 00000 n +0000021721 00000 n +0000022054 00000 n +0000022076 00000 n +0000022244 00000 n +0000022409 00000 n +0000022578 00000 n +0000022757 00000 n +0000023066 00000 n +0000023226 00000 n +0000027466 00000 n +0000027281 00000 n +0000026200 00000 n +0000027403 00000 n +0000696599 00000 n +0000670078 00000 n +0000696425 00000 n +0000669393 00000 n +0000667249 00000 n +0000669229 00000 n +0000039173 00000 n +0000030522 00000 n +0000027551 00000 n +0000039047 00000 n +0000039110 00000 n +0000031056 00000 n +0000031210 00000 n +0000031367 00000 n +0000031524 00000 n +0000031680 00000 n +0000031837 00000 n +0000031999 00000 n +0000032160 00000 n +0000032321 00000 n +0000032483 00000 n +0000032650 00000 n +0000032817 00000 n +0000032982 00000 n +0000033144 00000 n +0000033310 00000 n +0000033471 00000 n +0000033626 00000 n +0000033783 00000 n +0000033939 00000 n +0000034096 00000 n +0000034253 00000 n +0000034410 00000 n +0000034564 00000 n +0000034720 00000 n +0000034882 00000 n +0000035044 00000 n +0000035200 00000 n +0000035357 00000 n +0000035519 00000 n +0000035686 00000 n +0000035852 00000 n +0000036013 00000 n +0000036168 00000 n +0000036325 00000 n +0000036482 00000 n +0000036644 00000 n +0000036801 00000 n +0000036958 00000 n +0000037120 00000 n +0000037277 00000 n +0000037439 00000 n +0000037606 00000 n +0000037772 00000 n +0000037934 00000 n +0000038096 00000 n +0000038258 00000 n +0000038420 00000 n +0000038582 00000 n +0000038737 00000 n +0000038892 00000 n +0000052547 00000 n +0000042497 00000 n +0000039258 00000 n +0000052484 00000 n +0000666698 00000 n +0000649617 00000 n +0000666514 00000 n +0000043087 00000 n +0000043250 00000 n +0000043412 00000 n +0000043575 00000 n +0000043733 00000 n +0000043896 00000 n +0000044059 00000 n +0000044214 00000 n +0000044372 00000 n +0000044530 00000 n +0000044686 00000 n +0000044844 00000 n +0000045007 00000 n +0000045175 00000 n +0000045343 00000 n +0000045506 00000 n +0000045674 00000 n +0000045842 00000 n +0000046000 00000 n +0000046163 00000 n +0000046326 00000 n +0000046488 00000 n +0000046650 00000 n +0000046813 00000 n +0000046975 00000 n +0000047137 00000 n +0000047300 00000 n +0000047463 00000 n +0000047626 00000 n +0000047795 00000 n +0000047964 00000 n +0000048133 00000 n +0000048296 00000 n +0000048460 00000 n +0000048624 00000 n +0000048787 00000 n +0000048951 00000 n +0000049115 00000 n +0000049283 00000 n +0000049452 00000 n +0000049621 00000 n +0000049790 00000 n +0000049959 00000 n +0000050128 00000 n +0000050297 00000 n +0000050466 00000 n +0000050635 00000 n +0000050805 00000 n +0000050975 00000 n +0000051145 00000 n +0000051315 00000 n +0000051485 00000 n +0000051655 00000 n +0000051824 00000 n +0000051994 00000 n +0000052161 00000 n +0000052322 00000 n +0000065709 00000 n +0000056176 00000 n +0000052645 00000 n +0000065646 00000 n +0000056750 00000 n +0000056913 00000 n +0000057076 00000 n +0000057239 00000 n +0000057402 00000 n +0000057565 00000 n +0000057728 00000 n +0000057890 00000 n +0000058051 00000 n +0000058218 00000 n +0000058386 00000 n +0000058554 00000 n +0000058722 00000 n +0000058879 00000 n +0000059039 00000 n +0000059205 00000 n +0000059372 00000 n +0000059534 00000 n +0000059696 00000 n +0000059858 00000 n +0000060019 00000 n +0000060185 00000 n +0000060352 00000 n +0000060519 00000 n +0000060681 00000 n +0000060843 00000 n +0000061000 00000 n +0000061167 00000 n +0000061329 00000 n +0000061496 00000 n +0000061663 00000 n +0000061830 00000 n +0000648728 00000 n +0000627397 00000 n +0000648554 00000 n +0000061997 00000 n +0000062164 00000 n +0000062318 00000 n +0000062475 00000 n +0000062632 00000 n +0000062794 00000 n +0000062956 00000 n +0000063113 00000 n +0000063268 00000 n +0000063425 00000 n +0000063587 00000 n +0000063744 00000 n +0000063901 00000 n +0000064057 00000 n +0000064214 00000 n +0000064376 00000 n +0000064533 00000 n +0000064695 00000 n +0000064852 00000 n +0000065014 00000 n +0000065176 00000 n +0000065337 00000 n +0000065491 00000 n +0000068921 00000 n +0000066744 00000 n +0000065820 00000 n +0000068858 00000 n +0000066974 00000 n +0000067131 00000 n +0000067288 00000 n +0000067444 00000 n +0000067601 00000 n +0000067758 00000 n +0000067915 00000 n +0000068072 00000 n +0000068229 00000 n +0000068385 00000 n +0000626431 00000 n +0000606464 00000 n +0000626258 00000 n +0000068543 00000 n +0000068700 00000 n +0000072084 00000 n +0000071274 00000 n +0000069019 00000 n +0000071396 00000 n +0000071520 00000 n +0000071645 00000 n +0000071770 00000 n +0000071895 00000 n +0000071958 00000 n +0000072021 00000 n +0000605670 00000 n +0000587353 00000 n +0000605497 00000 n +0000724906 00000 n +0000076655 00000 n +0000075475 00000 n +0000072208 00000 n +0000075969 00000 n +0000076032 00000 n +0000076095 00000 n +0000076219 00000 n +0000076344 00000 n +0000076469 00000 n +0000075625 00000 n +0000075818 00000 n +0000076592 00000 n +0000337590 00000 n +0000397084 00000 n +0000081310 00000 n +0000080274 00000 n +0000076779 00000 n +0000080747 00000 n +0000080872 00000 n +0000080424 00000 n +0000080586 00000 n +0000080997 00000 n +0000081122 00000 n +0000081247 00000 n +0000097234 00000 n +0000084532 00000 n +0000083972 00000 n +0000081434 00000 n +0000084094 00000 n +0000084219 00000 n +0000084344 00000 n +0000084469 00000 n +0000087959 00000 n +0000086818 00000 n +0000084643 00000 n +0000087272 00000 n +0000087397 00000 n +0000087522 00000 n +0000087647 00000 n +0000087772 00000 n +0000086968 00000 n +0000087120 00000 n +0000087896 00000 n +0000287301 00000 n +0000089040 00000 n +0000088729 00000 n +0000088044 00000 n +0000088851 00000 n +0000088976 00000 n +0000091137 00000 n +0000090434 00000 n +0000089138 00000 n +0000090560 00000 n +0000090688 00000 n +0000090815 00000 n +0000090943 00000 n +0000091072 00000 n +0000725024 00000 n +0000094066 00000 n +0000093177 00000 n +0000091236 00000 n +0000093485 00000 n +0000093614 00000 n +0000093679 00000 n +0000093744 00000 n +0000093324 00000 n +0000093873 00000 n +0000094002 00000 n +0000271243 00000 n +0000097427 00000 n +0000096979 00000 n +0000094178 00000 n +0000097105 00000 n +0000586678 00000 n +0000574689 00000 n +0000586499 00000 n +0000097362 00000 n +0000101249 00000 n +0000101058 00000 n +0000097553 00000 n +0000101184 00000 n +0000574148 00000 n +0000564404 00000 n +0000573969 00000 n +0000105860 00000 n +0000105461 00000 n +0000101415 00000 n +0000105795 00000 n +0000105608 00000 n +0000172253 00000 n +0000108206 00000 n +0000107756 00000 n +0000105999 00000 n +0000107882 00000 n +0000108011 00000 n +0000108076 00000 n +0000108141 00000 n +0000110935 00000 n +0000113482 00000 n +0000110779 00000 n +0000108331 00000 n +0000112901 00000 n +0000113030 00000 n +0000113159 00000 n +0000112578 00000 n +0000112740 00000 n +0000563534 00000 n +0000554114 00000 n +0000563360 00000 n +0000553550 00000 n +0000544464 00000 n +0000553375 00000 n +0000113288 00000 n +0000113417 00000 n +0000725149 00000 n +0000112407 00000 n +0000112465 00000 n +0000112555 00000 n +0000212434 00000 n +0000248146 00000 n +0000118002 00000 n +0000117067 00000 n +0000113638 00000 n +0000117550 00000 n +0000117679 00000 n +0000117223 00000 n +0000117388 00000 n +0000117808 00000 n +0000117937 00000 n +0000401111 00000 n +0000121616 00000 n +0000121236 00000 n +0000118154 00000 n +0000121551 00000 n +0000121383 00000 n +0000122866 00000 n +0000122675 00000 n +0000121741 00000 n +0000122801 00000 n +0000125569 00000 n +0000124992 00000 n +0000122965 00000 n +0000125118 00000 n +0000125247 00000 n +0000125376 00000 n +0000125505 00000 n +0000128809 00000 n +0000128102 00000 n +0000125707 00000 n +0000128228 00000 n +0000128357 00000 n +0000128486 00000 n +0000128615 00000 n +0000128744 00000 n +0000133116 00000 n +0000132218 00000 n +0000128934 00000 n +0000132536 00000 n +0000132665 00000 n +0000132365 00000 n +0000132794 00000 n +0000132923 00000 n +0000133051 00000 n +0000725274 00000 n +0000330221 00000 n +0000137152 00000 n +0000136574 00000 n +0000133241 00000 n +0000136700 00000 n +0000136829 00000 n +0000136958 00000 n +0000137087 00000 n +0000140613 00000 n +0000140293 00000 n +0000137290 00000 n +0000140419 00000 n +0000140548 00000 n +0000143945 00000 n +0000143186 00000 n +0000140725 00000 n +0000143494 00000 n +0000143623 00000 n +0000143333 00000 n +0000143752 00000 n +0000143880 00000 n +0000396826 00000 n +0000146685 00000 n +0000146107 00000 n +0000144113 00000 n +0000146233 00000 n +0000146362 00000 n +0000146491 00000 n +0000146620 00000 n +0000147125 00000 n +0000146934 00000 n +0000146784 00000 n +0000147060 00000 n +0000151127 00000 n +0000150361 00000 n +0000147167 00000 n +0000150675 00000 n +0000150804 00000 n +0000150932 00000 n +0000150997 00000 n +0000151062 00000 n +0000150508 00000 n +0000725399 00000 n +0000155623 00000 n +0000155815 00000 n +0000155368 00000 n +0000151226 00000 n +0000155494 00000 n +0000155750 00000 n +0000159694 00000 n +0000159117 00000 n +0000155940 00000 n +0000159243 00000 n +0000159371 00000 n +0000159500 00000 n +0000159629 00000 n +0000162513 00000 n +0000163892 00000 n +0000162387 00000 n +0000159832 00000 n +0000163439 00000 n +0000163568 00000 n +0000163697 00000 n +0000163762 00000 n +0000163827 00000 n +0000166969 00000 n +0000166262 00000 n +0000164047 00000 n +0000166388 00000 n +0000166517 00000 n +0000166645 00000 n +0000166710 00000 n +0000166775 00000 n +0000166904 00000 n +0000172576 00000 n +0000171658 00000 n +0000167081 00000 n +0000172124 00000 n +0000171814 00000 n +0000171965 00000 n +0000172382 00000 n +0000172511 00000 n +0000523089 00000 n +0000176415 00000 n +0000175144 00000 n +0000172714 00000 n +0000175834 00000 n +0000175963 00000 n +0000176092 00000 n +0000175309 00000 n +0000175461 00000 n +0000175647 00000 n +0000176221 00000 n +0000176350 00000 n +0000725524 00000 n +0000180646 00000 n +0000180326 00000 n +0000176541 00000 n +0000180452 00000 n +0000180581 00000 n +0000184122 00000 n +0000183743 00000 n +0000180771 00000 n +0000184057 00000 n +0000183890 00000 n +0000187139 00000 n +0000187334 00000 n +0000186884 00000 n +0000184234 00000 n +0000187010 00000 n +0000187204 00000 n +0000187269 00000 n +0000190703 00000 n +0000190512 00000 n +0000187446 00000 n +0000190638 00000 n +0000195014 00000 n +0000194436 00000 n +0000190815 00000 n +0000194562 00000 n +0000194691 00000 n +0000194756 00000 n +0000194821 00000 n +0000194950 00000 n +0000198225 00000 n +0000197183 00000 n +0000195126 00000 n +0000197644 00000 n +0000197773 00000 n +0000197339 00000 n +0000197491 00000 n +0000197902 00000 n +0000198031 00000 n +0000198160 00000 n +0000725649 00000 n +0000199777 00000 n +0000199586 00000 n +0000198337 00000 n +0000199712 00000 n +0000201300 00000 n +0000201109 00000 n +0000199876 00000 n +0000201235 00000 n +0000204105 00000 n +0000203785 00000 n +0000201399 00000 n +0000203911 00000 n +0000204040 00000 n +0000208528 00000 n +0000208159 00000 n +0000204243 00000 n +0000208463 00000 n +0000208306 00000 n +0000366981 00000 n +0000212499 00000 n +0000212179 00000 n +0000208640 00000 n +0000212305 00000 n +0000216337 00000 n +0000216017 00000 n +0000212624 00000 n +0000216143 00000 n +0000216208 00000 n +0000216272 00000 n +0000725774 00000 n +0000221633 00000 n +0000220341 00000 n +0000216462 00000 n +0000221568 00000 n +0000220533 00000 n +0000220687 00000 n +0000220842 00000 n +0000221027 00000 n +0000221201 00000 n +0000221386 00000 n +0000290835 00000 n +0000225939 00000 n +0000225748 00000 n +0000221814 00000 n +0000225874 00000 n +0000229702 00000 n +0000229511 00000 n +0000226064 00000 n +0000229637 00000 n +0000234015 00000 n +0000233073 00000 n +0000229814 00000 n +0000233563 00000 n +0000233692 00000 n +0000233229 00000 n +0000233821 00000 n +0000233950 00000 n +0000233397 00000 n +0000304312 00000 n +0000237811 00000 n +0000237249 00000 n +0000234127 00000 n +0000237746 00000 n +0000237405 00000 n +0000237576 00000 n +0000384536 00000 n +0000241235 00000 n +0000240788 00000 n +0000237980 00000 n +0000240914 00000 n +0000241042 00000 n +0000241171 00000 n +0000725899 00000 n +0000244802 00000 n +0000244611 00000 n +0000241360 00000 n +0000244737 00000 n +0000248211 00000 n +0000247891 00000 n +0000244971 00000 n +0000248017 00000 n +0000251891 00000 n +0000251700 00000 n +0000248367 00000 n +0000251826 00000 n +0000256213 00000 n +0000255399 00000 n +0000252060 00000 n +0000255890 00000 n +0000256019 00000 n +0000255555 00000 n +0000256148 00000 n +0000255715 00000 n +0000260364 00000 n +0000259868 00000 n +0000256368 00000 n +0000260170 00000 n +0000260299 00000 n +0000260015 00000 n +0000264002 00000 n +0000263553 00000 n +0000260489 00000 n +0000263679 00000 n +0000263808 00000 n +0000263937 00000 n +0000726024 00000 n +0000267909 00000 n +0000267242 00000 n +0000264157 00000 n +0000267715 00000 n +0000267844 00000 n +0000267398 00000 n +0000267560 00000 n +0000271438 00000 n +0000270798 00000 n +0000268078 00000 n +0000271114 00000 n +0000270945 00000 n +0000271308 00000 n +0000271373 00000 n +0000275474 00000 n +0000274971 00000 n +0000271621 00000 n +0000275280 00000 n +0000275409 00000 n +0000275118 00000 n +0000280264 00000 n +0000279585 00000 n +0000275642 00000 n +0000280070 00000 n +0000279741 00000 n +0000544109 00000 n +0000542110 00000 n +0000543944 00000 n +0000280199 00000 n +0000279902 00000 n +0000363552 00000 n +0000299250 00000 n +0000283673 00000 n +0000283353 00000 n +0000280390 00000 n +0000283479 00000 n +0000283608 00000 n +0000287365 00000 n +0000287046 00000 n +0000283798 00000 n +0000287172 00000 n +0000726149 00000 n +0000290900 00000 n +0000290451 00000 n +0000287507 00000 n +0000290577 00000 n +0000290706 00000 n +0000295399 00000 n +0000294607 00000 n +0000291012 00000 n +0000295077 00000 n +0000294763 00000 n +0000294915 00000 n +0000295206 00000 n +0000295335 00000 n +0000299315 00000 n +0000298562 00000 n +0000295511 00000 n +0000298863 00000 n +0000298992 00000 n +0000299121 00000 n +0000298709 00000 n +0000302758 00000 n +0000302438 00000 n +0000299427 00000 n +0000302564 00000 n +0000302693 00000 n +0000304377 00000 n +0000304057 00000 n +0000302870 00000 n +0000304183 00000 n +0000305902 00000 n +0000305711 00000 n +0000304489 00000 n +0000305837 00000 n +0000726274 00000 n +0000308815 00000 n +0000308236 00000 n +0000306001 00000 n +0000308362 00000 n +0000308491 00000 n +0000308620 00000 n +0000308685 00000 n +0000308750 00000 n +0000313010 00000 n +0000312501 00000 n +0000308927 00000 n +0000312816 00000 n +0000312648 00000 n +0000312945 00000 n +0000523056 00000 n +0000318900 00000 n +0000316165 00000 n +0000313122 00000 n +0000318706 00000 n +0000318835 00000 n +0000316429 00000 n +0000316591 00000 n +0000316753 00000 n +0000316914 00000 n +0000317074 00000 n +0000317236 00000 n +0000317407 00000 n +0000317569 00000 n +0000317731 00000 n +0000317894 00000 n +0000318057 00000 n +0000318220 00000 n +0000318383 00000 n +0000318546 00000 n +0000324121 00000 n +0000322204 00000 n +0000319012 00000 n +0000324056 00000 n +0000322432 00000 n +0000322595 00000 n +0000322762 00000 n +0000322931 00000 n +0000323093 00000 n +0000323254 00000 n +0000323416 00000 n +0000323577 00000 n +0000323740 00000 n +0000323893 00000 n +0000330286 00000 n +0000327279 00000 n +0000324246 00000 n +0000330092 00000 n +0000327561 00000 n +0000327714 00000 n +0000327868 00000 n +0000328019 00000 n +0000328173 00000 n +0000328334 00000 n +0000328496 00000 n +0000328658 00000 n +0000328820 00000 n +0000328982 00000 n +0000329144 00000 n +0000329306 00000 n +0000329458 00000 n +0000329621 00000 n +0000329776 00000 n +0000329938 00000 n +0000333816 00000 n +0000333495 00000 n +0000330398 00000 n +0000333621 00000 n +0000333686 00000 n +0000333751 00000 n +0000726399 00000 n +0000338041 00000 n +0000336845 00000 n +0000333985 00000 n +0000337332 00000 n +0000337461 00000 n +0000337718 00000 n +0000337001 00000 n +0000337171 00000 n +0000337783 00000 n +0000337848 00000 n +0000337913 00000 n +0000337977 00000 n +0000341388 00000 n +0000341197 00000 n +0000338223 00000 n +0000341323 00000 n +0000345128 00000 n +0000344807 00000 n +0000341474 00000 n +0000344933 00000 n +0000344998 00000 n +0000345063 00000 n +0000348960 00000 n +0000348253 00000 n +0000345240 00000 n +0000348379 00000 n +0000348508 00000 n +0000348571 00000 n +0000348636 00000 n +0000348701 00000 n +0000348766 00000 n +0000348895 00000 n +0000352712 00000 n +0000351874 00000 n +0000349072 00000 n +0000352000 00000 n +0000352065 00000 n +0000352130 00000 n +0000352259 00000 n +0000352324 00000 n +0000352389 00000 n +0000352518 00000 n +0000352583 00000 n +0000352647 00000 n +0000355833 00000 n +0000355128 00000 n +0000352837 00000 n +0000355254 00000 n +0000355382 00000 n +0000355511 00000 n +0000355640 00000 n +0000355769 00000 n +0000726524 00000 n +0000359611 00000 n +0000359161 00000 n +0000356030 00000 n +0000359287 00000 n +0000359416 00000 n +0000359481 00000 n +0000359546 00000 n +0000363876 00000 n 0000363118 00000 n -0000363247 00000 n -0000363312 00000 n -0000363377 00000 n -0000363506 00000 n -0000363570 00000 n -0000366293 00000 n -0000365908 00000 n +0000359750 00000 n +0000363423 00000 n +0000363681 00000 n 0000363746 00000 n -0000366034 00000 n -0000366099 00000 n -0000529136 00000 n -0000521853 00000 n -0000528956 00000 n -0000366228 00000 n -0000366760 00000 n -0000366569 00000 n -0000366419 00000 n -0000366695 00000 n -0000368655 00000 n -0000368207 00000 n -0000366802 00000 n -0000368333 00000 n -0000368462 00000 n -0000368591 00000 n -0000713955 00000 n -0000373228 00000 n -0000372285 00000 n -0000368767 00000 n -0000372648 00000 n -0000521532 00000 n -0000512319 00000 n -0000521346 00000 n -0000372432 00000 n -0000372777 00000 n -0000372905 00000 n -0000373034 00000 n -0000374270 00000 n -0000374079 00000 n -0000373465 00000 n -0000374205 00000 n -0000374697 00000 n -0000374506 00000 n -0000374356 00000 n -0000374632 00000 n -0000378010 00000 n -0000376784 00000 n -0000374739 00000 n -0000377301 00000 n -0000377430 00000 n -0000377559 00000 n -0000377688 00000 n -0000377817 00000 n -0000377946 00000 n -0000376940 00000 n -0000377112 00000 n -0000378464 00000 n -0000378273 00000 n -0000378123 00000 n -0000378399 00000 n -0000381708 00000 n -0000381130 00000 n -0000378506 00000 n -0000381256 00000 n -0000381385 00000 n -0000381514 00000 n -0000381643 00000 n -0000714080 00000 n -0000385987 00000 n -0000384768 00000 n -0000381794 00000 n -0000385279 00000 n -0000385408 00000 n -0000385666 00000 n -0000384924 00000 n -0000385103 00000 n -0000385859 00000 n -0000385923 00000 n -0000392873 00000 n -0000389045 00000 n -0000386140 00000 n -0000389171 00000 n -0000389236 00000 n -0000389301 00000 n -0000389366 00000 n -0000389431 00000 n +0000363811 00000 n +0000363265 00000 n +0000367434 00000 n +0000366726 00000 n +0000364001 00000 n +0000366852 00000 n +0000367110 00000 n +0000367239 00000 n +0000367304 00000 n +0000367369 00000 n +0000371121 00000 n +0000370487 00000 n +0000367546 00000 n +0000370799 00000 n +0000370634 00000 n +0000370928 00000 n +0000370992 00000 n +0000371056 00000 n +0000523023 00000 n +0000375100 00000 n +0000374394 00000 n +0000371233 00000 n +0000374520 00000 n +0000374648 00000 n +0000374713 00000 n +0000374778 00000 n +0000374907 00000 n +0000374972 00000 n +0000375036 00000 n +0000377643 00000 n +0000377323 00000 n +0000375226 00000 n +0000377449 00000 n +0000541829 00000 n +0000534545 00000 n +0000541649 00000 n +0000377578 00000 n +0000726649 00000 n +0000378124 00000 n +0000377933 00000 n +0000377783 00000 n +0000378059 00000 n +0000380016 00000 n +0000379568 00000 n +0000378166 00000 n +0000379694 00000 n +0000379823 00000 n +0000379952 00000 n +0000384601 00000 n +0000383658 00000 n +0000380128 00000 n +0000384021 00000 n +0000534224 00000 n +0000525011 00000 n +0000534038 00000 n +0000383805 00000 n +0000384150 00000 n +0000384278 00000 n +0000384407 00000 n +0000385643 00000 n +0000385452 00000 n +0000384838 00000 n +0000385578 00000 n +0000386070 00000 n +0000385879 00000 n +0000385729 00000 n +0000386005 00000 n +0000389383 00000 n +0000388157 00000 n +0000386112 00000 n +0000388674 00000 n +0000388803 00000 n +0000388932 00000 n +0000389061 00000 n +0000389190 00000 n +0000389319 00000 n +0000388313 00000 n +0000388485 00000 n +0000726774 00000 n +0000389837 00000 n +0000389646 00000 n 0000389496 00000 n -0000389561 00000 n -0000389626 00000 n -0000389691 00000 n -0000389756 00000 n -0000389886 00000 n -0000389951 00000 n -0000390016 00000 n -0000390081 00000 n -0000390146 00000 n -0000390211 00000 n -0000390276 00000 n -0000390341 00000 n -0000390406 00000 n -0000390471 00000 n -0000390536 00000 n -0000390601 00000 n -0000390666 00000 n -0000390731 00000 n -0000390796 00000 n -0000390861 00000 n -0000390926 00000 n -0000390991 00000 n -0000391056 00000 n -0000391121 00000 n -0000391186 00000 n -0000391251 00000 n -0000391316 00000 n -0000391381 00000 n -0000391445 00000 n -0000391510 00000 n -0000391575 00000 n -0000391640 00000 n -0000391705 00000 n -0000391770 00000 n -0000391835 00000 n -0000391900 00000 n -0000391965 00000 n -0000392030 00000 n -0000392095 00000 n -0000392160 00000 n -0000392225 00000 n -0000392290 00000 n -0000392355 00000 n -0000392420 00000 n -0000392485 00000 n -0000392550 00000 n -0000392615 00000 n -0000392680 00000 n -0000392745 00000 n -0000392809 00000 n -0000399519 00000 n -0000395955 00000 n -0000392985 00000 n -0000396081 00000 n -0000396146 00000 n -0000396211 00000 n -0000396276 00000 n -0000396341 00000 n -0000396406 00000 n -0000396471 00000 n -0000396536 00000 n -0000396601 00000 n -0000396666 00000 n -0000396731 00000 n -0000396796 00000 n -0000396860 00000 n -0000396925 00000 n -0000396990 00000 n -0000397055 00000 n -0000397120 00000 n -0000397185 00000 n -0000397250 00000 n -0000397315 00000 n -0000397380 00000 n -0000397445 00000 n -0000397510 00000 n -0000397575 00000 n -0000397639 00000 n -0000397704 00000 n -0000397769 00000 n -0000397834 00000 n -0000397899 00000 n -0000397964 00000 n -0000398029 00000 n -0000398094 00000 n -0000398159 00000 n -0000398224 00000 n -0000398289 00000 n -0000398354 00000 n -0000398419 00000 n -0000398484 00000 n -0000398549 00000 n -0000398614 00000 n -0000398678 00000 n -0000398742 00000 n -0000398806 00000 n -0000398871 00000 n -0000398936 00000 n -0000399001 00000 n -0000399066 00000 n -0000399131 00000 n -0000399196 00000 n -0000399261 00000 n -0000399326 00000 n -0000399391 00000 n -0000399455 00000 n -0000405692 00000 n -0000402254 00000 n -0000399631 00000 n -0000402380 00000 n -0000402445 00000 n -0000402510 00000 n -0000402575 00000 n -0000402640 00000 n -0000402705 00000 n -0000402770 00000 n -0000402835 00000 n -0000402900 00000 n -0000402965 00000 n -0000403030 00000 n -0000403095 00000 n -0000403160 00000 n -0000403225 00000 n -0000403290 00000 n -0000403355 00000 n -0000403420 00000 n -0000403485 00000 n -0000403550 00000 n -0000403615 00000 n -0000403680 00000 n -0000403745 00000 n -0000403810 00000 n -0000403875 00000 n -0000403940 00000 n -0000404005 00000 n -0000404070 00000 n -0000404135 00000 n -0000404200 00000 n -0000404265 00000 n -0000404330 00000 n -0000404395 00000 n -0000404460 00000 n -0000404525 00000 n -0000404589 00000 n -0000404654 00000 n -0000404719 00000 n -0000404784 00000 n -0000404849 00000 n -0000404914 00000 n -0000404979 00000 n -0000405044 00000 n -0000405109 00000 n -0000405174 00000 n -0000405239 00000 n -0000405304 00000 n -0000405369 00000 n -0000405434 00000 n -0000405499 00000 n -0000405564 00000 n -0000405628 00000 n -0000410270 00000 n -0000408006 00000 n -0000405804 00000 n -0000408132 00000 n -0000408197 00000 n -0000408262 00000 n -0000408327 00000 n -0000408392 00000 n -0000408457 00000 n -0000408522 00000 n -0000408587 00000 n -0000408652 00000 n -0000408717 00000 n -0000408782 00000 n -0000408847 00000 n -0000408912 00000 n -0000408977 00000 n -0000409039 00000 n -0000409103 00000 n -0000409168 00000 n -0000409232 00000 n -0000409297 00000 n -0000409362 00000 n -0000409427 00000 n -0000409492 00000 n -0000409557 00000 n -0000409622 00000 n -0000409687 00000 n -0000409816 00000 n -0000409945 00000 n -0000410010 00000 n -0000410075 00000 n -0000410140 00000 n -0000410205 00000 n -0000413065 00000 n -0000412421 00000 n -0000410395 00000 n -0000412547 00000 n -0000412676 00000 n -0000412805 00000 n -0000412870 00000 n -0000412935 00000 n -0000413000 00000 n -0000714205 00000 n -0000417403 00000 n -0000417083 00000 n -0000413178 00000 n -0000417209 00000 n -0000417274 00000 n -0000417339 00000 n -0000420874 00000 n -0000420618 00000 n -0000417556 00000 n -0000420744 00000 n -0000420809 00000 n -0000424122 00000 n -0000423931 00000 n -0000421013 00000 n -0000424057 00000 n -0000427851 00000 n -0000427595 00000 n -0000424248 00000 n -0000427721 00000 n -0000427786 00000 n -0000430691 00000 n -0000429983 00000 n -0000427990 00000 n -0000430109 00000 n -0000430174 00000 n -0000430239 00000 n -0000430304 00000 n -0000430369 00000 n -0000430498 00000 n -0000430563 00000 n -0000430627 00000 n -0000435364 00000 n -0000435108 00000 n -0000430830 00000 n -0000435234 00000 n -0000435299 00000 n -0000714330 00000 n -0000438315 00000 n -0000437542 00000 n -0000435490 00000 n -0000437668 00000 n -0000437733 00000 n -0000437798 00000 n -0000437863 00000 n -0000437992 00000 n -0000438057 00000 n -0000438120 00000 n -0000438185 00000 n -0000438250 00000 n -0000440916 00000 n -0000440207 00000 n -0000438468 00000 n -0000440333 00000 n -0000440398 00000 n -0000440463 00000 n -0000440528 00000 n -0000440593 00000 n -0000440658 00000 n -0000440787 00000 n -0000440852 00000 n -0000443940 00000 n -0000443555 00000 n -0000441068 00000 n -0000443681 00000 n -0000443746 00000 n -0000443810 00000 n -0000443875 00000 n -0000447035 00000 n -0000446261 00000 n -0000444080 00000 n -0000446387 00000 n -0000446452 00000 n -0000446517 00000 n -0000446582 00000 n -0000446711 00000 n -0000446776 00000 n -0000446841 00000 n +0000389772 00000 n +0000393081 00000 n +0000392503 00000 n +0000389879 00000 n +0000392629 00000 n +0000392758 00000 n +0000392887 00000 n +0000393016 00000 n +0000397276 00000 n +0000396058 00000 n +0000393167 00000 n +0000396568 00000 n +0000396697 00000 n +0000396955 00000 n +0000396214 00000 n +0000396393 00000 n +0000397148 00000 n +0000397212 00000 n +0000404163 00000 n +0000400335 00000 n +0000397429 00000 n +0000400461 00000 n +0000400526 00000 n +0000400591 00000 n +0000400656 00000 n +0000400721 00000 n +0000400786 00000 n +0000400851 00000 n +0000400916 00000 n +0000400981 00000 n +0000401046 00000 n +0000401176 00000 n +0000401241 00000 n +0000401306 00000 n +0000401371 00000 n +0000401436 00000 n +0000401501 00000 n +0000401566 00000 n +0000401631 00000 n +0000401696 00000 n +0000401761 00000 n +0000401826 00000 n +0000401891 00000 n +0000401956 00000 n +0000402021 00000 n +0000402086 00000 n +0000402151 00000 n +0000402216 00000 n +0000402281 00000 n +0000402346 00000 n +0000402411 00000 n +0000402476 00000 n +0000402541 00000 n +0000402606 00000 n +0000402671 00000 n +0000402735 00000 n +0000402800 00000 n +0000402865 00000 n +0000402930 00000 n +0000402995 00000 n +0000403060 00000 n +0000403125 00000 n +0000403190 00000 n +0000403255 00000 n +0000403320 00000 n +0000403385 00000 n +0000403450 00000 n +0000403515 00000 n +0000403580 00000 n +0000403645 00000 n +0000403710 00000 n +0000403775 00000 n +0000403840 00000 n +0000403905 00000 n +0000403970 00000 n +0000404035 00000 n +0000404099 00000 n +0000410809 00000 n +0000407245 00000 n +0000404275 00000 n +0000407371 00000 n +0000407436 00000 n +0000407501 00000 n +0000407566 00000 n +0000407631 00000 n +0000407696 00000 n +0000407761 00000 n +0000407826 00000 n +0000407891 00000 n +0000407956 00000 n +0000408021 00000 n +0000408086 00000 n +0000408150 00000 n +0000408215 00000 n +0000408280 00000 n +0000408345 00000 n +0000408410 00000 n +0000408475 00000 n +0000408540 00000 n +0000408605 00000 n +0000408670 00000 n +0000408735 00000 n +0000408800 00000 n +0000408865 00000 n +0000408929 00000 n +0000408994 00000 n +0000409059 00000 n +0000409124 00000 n +0000409189 00000 n +0000409254 00000 n +0000409319 00000 n +0000409384 00000 n +0000409449 00000 n +0000409514 00000 n +0000409579 00000 n +0000409644 00000 n +0000409709 00000 n +0000409774 00000 n +0000409839 00000 n +0000409904 00000 n +0000409968 00000 n +0000410032 00000 n +0000410096 00000 n +0000410161 00000 n +0000410226 00000 n +0000410291 00000 n +0000410356 00000 n +0000410421 00000 n +0000410486 00000 n +0000410551 00000 n +0000410616 00000 n +0000410681 00000 n +0000410745 00000 n +0000416982 00000 n +0000413544 00000 n +0000410921 00000 n +0000413670 00000 n +0000413735 00000 n +0000413800 00000 n +0000413865 00000 n +0000413930 00000 n +0000413995 00000 n +0000414060 00000 n +0000414125 00000 n +0000414190 00000 n +0000414255 00000 n +0000414320 00000 n +0000414385 00000 n +0000414450 00000 n +0000414515 00000 n +0000414580 00000 n +0000414645 00000 n +0000414710 00000 n +0000414775 00000 n +0000414840 00000 n +0000414905 00000 n +0000414970 00000 n +0000415035 00000 n +0000415100 00000 n +0000415165 00000 n +0000415230 00000 n +0000415295 00000 n +0000415360 00000 n +0000415425 00000 n +0000415490 00000 n +0000415555 00000 n +0000415620 00000 n +0000415685 00000 n +0000415750 00000 n +0000415815 00000 n +0000415879 00000 n +0000415944 00000 n +0000416009 00000 n +0000416074 00000 n +0000416139 00000 n +0000416204 00000 n +0000416269 00000 n +0000416334 00000 n +0000416399 00000 n +0000416464 00000 n +0000416529 00000 n +0000416594 00000 n +0000416659 00000 n +0000416724 00000 n +0000416789 00000 n +0000416854 00000 n +0000416918 00000 n +0000726899 00000 n +0000421560 00000 n +0000419296 00000 n +0000417094 00000 n +0000419422 00000 n +0000419487 00000 n +0000419552 00000 n +0000419617 00000 n +0000419682 00000 n +0000419747 00000 n +0000419812 00000 n +0000419877 00000 n +0000419942 00000 n +0000420007 00000 n +0000420072 00000 n +0000420137 00000 n +0000420202 00000 n +0000420267 00000 n +0000420329 00000 n +0000420393 00000 n +0000420458 00000 n +0000420522 00000 n +0000420587 00000 n +0000420652 00000 n +0000420717 00000 n +0000420782 00000 n +0000420847 00000 n +0000420912 00000 n +0000420977 00000 n +0000421106 00000 n +0000421235 00000 n +0000421300 00000 n +0000421365 00000 n +0000421430 00000 n +0000421495 00000 n +0000424355 00000 n +0000423711 00000 n +0000421685 00000 n +0000423837 00000 n +0000423966 00000 n +0000424095 00000 n +0000424160 00000 n +0000424225 00000 n +0000424290 00000 n +0000428694 00000 n +0000428374 00000 n +0000424468 00000 n +0000428500 00000 n +0000428565 00000 n +0000428630 00000 n +0000432294 00000 n +0000432039 00000 n +0000428847 00000 n +0000432165 00000 n +0000432230 00000 n +0000435543 00000 n +0000435352 00000 n +0000432433 00000 n +0000435478 00000 n +0000439271 00000 n +0000439015 00000 n +0000435669 00000 n +0000439141 00000 n +0000439206 00000 n +0000727024 00000 n +0000442111 00000 n +0000441403 00000 n +0000439410 00000 n +0000441529 00000 n +0000441594 00000 n +0000441659 00000 n +0000441724 00000 n +0000441789 00000 n +0000441918 00000 n +0000441983 00000 n +0000442047 00000 n +0000446779 00000 n +0000446523 00000 n +0000442250 00000 n +0000446649 00000 n +0000446714 00000 n +0000449730 00000 n +0000448957 00000 n 0000446905 00000 n -0000446970 00000 n -0000450308 00000 n -0000450117 00000 n -0000447201 00000 n -0000450243 00000 n -0000453409 00000 n -0000452699 00000 n -0000450434 00000 n -0000452825 00000 n -0000452890 00000 n -0000452955 00000 n -0000453020 00000 n -0000453085 00000 n -0000453214 00000 n -0000453279 00000 n -0000453344 00000 n -0000714455 00000 n -0000457067 00000 n -0000456748 00000 n -0000453574 00000 n -0000456874 00000 n -0000456939 00000 n -0000457003 00000 n -0000460443 00000 n -0000460252 00000 n -0000457193 00000 n -0000460378 00000 n -0000463120 00000 n -0000462477 00000 n -0000460583 00000 n -0000462603 00000 n -0000462668 00000 n -0000462732 00000 n -0000462797 00000 n -0000462926 00000 n -0000462991 00000 n -0000463056 00000 n -0000465837 00000 n -0000465063 00000 n -0000463272 00000 n -0000465189 00000 n -0000465254 00000 n -0000465318 00000 n -0000465383 00000 n -0000465448 00000 n -0000465513 00000 n -0000465642 00000 n -0000465707 00000 n -0000465772 00000 n -0000469228 00000 n -0000468907 00000 n -0000465990 00000 n -0000469033 00000 n -0000469098 00000 n -0000469163 00000 n -0000472297 00000 n -0000471912 00000 n -0000469341 00000 n -0000472038 00000 n -0000472103 00000 n -0000472168 00000 n -0000472233 00000 n -0000714580 00000 n -0000475693 00000 n -0000475114 00000 n -0000472436 00000 n -0000475240 00000 n -0000475369 00000 n -0000475434 00000 n -0000475499 00000 n -0000475564 00000 n -0000475629 00000 n -0000478674 00000 n -0000478483 00000 n -0000475833 00000 n -0000478609 00000 n -0000481314 00000 n -0000480605 00000 n -0000478885 00000 n -0000480731 00000 n -0000480796 00000 n -0000480861 00000 n -0000480926 00000 n -0000480991 00000 n -0000481056 00000 n -0000481185 00000 n -0000481250 00000 n -0000485767 00000 n -0000485446 00000 n -0000481510 00000 n -0000485572 00000 n -0000485637 00000 n -0000485702 00000 n -0000489361 00000 n -0000489106 00000 n -0000485893 00000 n -0000489232 00000 n -0000489297 00000 n -0000492296 00000 n -0000492040 00000 n -0000489487 00000 n -0000492166 00000 n -0000492231 00000 n -0000714705 00000 n -0000495466 00000 n -0000494691 00000 n -0000492422 00000 n -0000494817 00000 n -0000494882 00000 n -0000494947 00000 n -0000495012 00000 n -0000495141 00000 n -0000495206 00000 n -0000495271 00000 n -0000495336 00000 n -0000495401 00000 n -0000498834 00000 n -0000498190 00000 n -0000495632 00000 n -0000498316 00000 n -0000498381 00000 n -0000498446 00000 n -0000498511 00000 n -0000498640 00000 n -0000498705 00000 n -0000498770 00000 n -0000502306 00000 n -0000501985 00000 n -0000499000 00000 n -0000502111 00000 n -0000502176 00000 n -0000502241 00000 n -0000504879 00000 n -0000504301 00000 n -0000502432 00000 n -0000504427 00000 n -0000504492 00000 n -0000504557 00000 n -0000504622 00000 n -0000504751 00000 n -0000504815 00000 n -0000508675 00000 n -0000508290 00000 n -0000505017 00000 n -0000508416 00000 n -0000508481 00000 n -0000508546 00000 n -0000508611 00000 n -0000510245 00000 n -0000509861 00000 n -0000508815 00000 n -0000509987 00000 n -0000510052 00000 n -0000510115 00000 n -0000510180 00000 n -0000714830 00000 n -0000510430 00000 n -0000521774 00000 n -0000529362 00000 n -0000531661 00000 n -0000531630 00000 n -0000541154 00000 n -0000551267 00000 n -0000561743 00000 n -0000574367 00000 n -0000593432 00000 n -0000614319 00000 n -0000636463 00000 n -0000654358 00000 n -0000657188 00000 n -0000656958 00000 n -0000684495 00000 n -0000711606 00000 n -0000714910 00000 n -0000715033 00000 n -0000715159 00000 n -0000715285 00000 n -0000715402 00000 n -0000715494 00000 n -0000731830 00000 n -0000750703 00000 n -0000750744 00000 n -0000750784 00000 n -0000750918 00000 n +0000449083 00000 n +0000449148 00000 n +0000449213 00000 n +0000449278 00000 n +0000449407 00000 n +0000449472 00000 n +0000449535 00000 n +0000449600 00000 n +0000449665 00000 n +0000452331 00000 n +0000451622 00000 n +0000449883 00000 n +0000451748 00000 n +0000451813 00000 n +0000451878 00000 n +0000451943 00000 n +0000452008 00000 n +0000452073 00000 n +0000452202 00000 n +0000452267 00000 n +0000455355 00000 n +0000454970 00000 n +0000452483 00000 n +0000455096 00000 n +0000455161 00000 n +0000455225 00000 n +0000455290 00000 n +0000458450 00000 n +0000457676 00000 n +0000455495 00000 n +0000457802 00000 n +0000457867 00000 n +0000457932 00000 n +0000457997 00000 n +0000458126 00000 n +0000458191 00000 n +0000458256 00000 n +0000458320 00000 n +0000458385 00000 n +0000727149 00000 n +0000461723 00000 n +0000461532 00000 n +0000458616 00000 n +0000461658 00000 n +0000464823 00000 n +0000464113 00000 n +0000461849 00000 n +0000464239 00000 n +0000464304 00000 n +0000464369 00000 n +0000464434 00000 n +0000464499 00000 n +0000464628 00000 n +0000464693 00000 n +0000464758 00000 n +0000468481 00000 n +0000468162 00000 n +0000464988 00000 n +0000468288 00000 n +0000468353 00000 n +0000468417 00000 n +0000471857 00000 n +0000471666 00000 n +0000468607 00000 n +0000471792 00000 n +0000474868 00000 n +0000474418 00000 n +0000471997 00000 n +0000474544 00000 n +0000474609 00000 n +0000474674 00000 n +0000474739 00000 n +0000474804 00000 n +0000477300 00000 n +0000476526 00000 n +0000475006 00000 n +0000476652 00000 n +0000476781 00000 n +0000476846 00000 n +0000476911 00000 n +0000476976 00000 n +0000477041 00000 n +0000477106 00000 n +0000477171 00000 n +0000477236 00000 n +0000727274 00000 n +0000480529 00000 n +0000479949 00000 n +0000477453 00000 n +0000480075 00000 n +0000480204 00000 n +0000480269 00000 n +0000480334 00000 n +0000480399 00000 n +0000480464 00000 n +0000483987 00000 n +0000483796 00000 n +0000480669 00000 n +0000483922 00000 n +0000486972 00000 n +0000486197 00000 n +0000484113 00000 n +0000486323 00000 n +0000486388 00000 n +0000486453 00000 n +0000486518 00000 n +0000486647 00000 n +0000486712 00000 n +0000486777 00000 n +0000486842 00000 n +0000486907 00000 n +0000490279 00000 n +0000490088 00000 n +0000487125 00000 n +0000490214 00000 n +0000493070 00000 n +0000492684 00000 n +0000490490 00000 n +0000492810 00000 n +0000492875 00000 n +0000492940 00000 n +0000493005 00000 n +0000497081 00000 n +0000496436 00000 n +0000493307 00000 n +0000496562 00000 n +0000496627 00000 n +0000496692 00000 n +0000496821 00000 n +0000496886 00000 n +0000496951 00000 n +0000497016 00000 n +0000727399 00000 n +0000501017 00000 n +0000500761 00000 n +0000497220 00000 n +0000500887 00000 n +0000500952 00000 n +0000504237 00000 n +0000503981 00000 n +0000501143 00000 n +0000504107 00000 n +0000504172 00000 n +0000506951 00000 n +0000506307 00000 n +0000504363 00000 n +0000506433 00000 n +0000506498 00000 n +0000506563 00000 n +0000506628 00000 n +0000506757 00000 n +0000506822 00000 n +0000506887 00000 n +0000510720 00000 n +0000510335 00000 n +0000507103 00000 n +0000510461 00000 n +0000510526 00000 n +0000510590 00000 n +0000510655 00000 n +0000514311 00000 n +0000513666 00000 n +0000510860 00000 n +0000513792 00000 n +0000513857 00000 n +0000513922 00000 n +0000514051 00000 n +0000514116 00000 n +0000514181 00000 n +0000514246 00000 n +0000516582 00000 n +0000516326 00000 n +0000514463 00000 n +0000516452 00000 n +0000516517 00000 n +0000727524 00000 n +0000520063 00000 n +0000519289 00000 n +0000516721 00000 n +0000519415 00000 n +0000519480 00000 n +0000519545 00000 n +0000519610 00000 n +0000519738 00000 n +0000519803 00000 n +0000519868 00000 n +0000519933 00000 n +0000519998 00000 n +0000522871 00000 n +0000522485 00000 n +0000520216 00000 n +0000522611 00000 n +0000522676 00000 n +0000522741 00000 n +0000522806 00000 n +0000523122 00000 n +0000534466 00000 n +0000542055 00000 n +0000544356 00000 n +0000544325 00000 n +0000553849 00000 n +0000563962 00000 n +0000574436 00000 n +0000587060 00000 n +0000606125 00000 n +0000627012 00000 n +0000649155 00000 n +0000667050 00000 n +0000669880 00000 n +0000669650 00000 n +0000697187 00000 n +0000724298 00000 n +0000727622 00000 n +0000727746 00000 n +0000727872 00000 n +0000727998 00000 n +0000728115 00000 n +0000728207 00000 n +0000744729 00000 n +0000763926 00000 n +0000763967 00000 n +0000764007 00000 n +0000764141 00000 n trailer << -/Size 2120 -/Root 2118 0 R -/Info 2119 0 R -/ID [ ] +/Size 2150 +/Root 2148 0 R +/Info 2149 0 R +/ID [ ] >> startxref -751176 +764399 %%EOF diff --git a/contrib/bind9/doc/arm/man.dnssec-signzone.html b/contrib/bind9/doc/arm/man.dnssec-signzone.html index 9e4b00f563de..40c09764bd17 100644 --- a/contrib/bind9/doc/arm/man.dnssec-signzone.html +++ b/contrib/bind9/doc/arm/man.dnssec-signzone.html @@ -14,12 +14,12 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + dnssec-signzone - + @@ -50,7 +50,7 @@

-

DESCRIPTION

+

DESCRIPTION

dnssec-signzone signs a zone. It generates NSEC and RRSIG records and produces a signed version of the @@ -61,7 +61,7 @@

-

OPTIONS

+

OPTIONS

-a

@@ -276,7 +276,7 @@

-

EXAMPLE

+

EXAMPLE

The following command signs the example.com zone with the DSA key generated by dnssec-keygen @@ -305,7 +305,7 @@ db.example.com.signed %

-

KNOWN BUGS

+

KNOWN BUGS

dnssec-signzone was designed so that it could sign a zone partially, using only a subset of the DNSSEC keys @@ -330,14 +330,14 @@ db.example.com.signed

-

SEE ALSO

+

SEE ALSO

dnssec-keygen(8), BIND 9 Administrator Reference Manual, RFC 4033.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/doc/arm/man.named-checkconf.html b/contrib/bind9/doc/arm/man.named-checkconf.html index c6aeb32bc3a9..94c22f69c4f9 100644 --- a/contrib/bind9/doc/arm/man.named-checkconf.html +++ b/contrib/bind9/doc/arm/man.named-checkconf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,14 +50,14 @@

named-checkconf [-h] [-v] [-j] [-t directory] {filename} [-z]

-

DESCRIPTION

+

DESCRIPTION

named-checkconf checks the syntax, but not the semantics, of a named configuration file.

-

OPTIONS

+

OPTIONS

-h

@@ -92,21 +92,21 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkconf returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkzone(8), BIND 9 Administrator Reference Manual.

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/doc/arm/man.named-checkzone.html b/contrib/bind9/doc/arm/man.named-checkzone.html index 4cee97f3c6bb..b187a1a71124 100644 --- a/contrib/bind9/doc/arm/man.named-checkzone.html +++ b/contrib/bind9/doc/arm/man.named-checkzone.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -51,7 +51,7 @@

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-i mode] [-k mode] [-m mode] [-n mode] [-o filename] [-s style] [-t directory] [-w directory] [-D] [-W mode] {zonename} {filename}

-

DESCRIPTION

+

DESCRIPTION

named-checkzone checks the syntax and integrity of a zone file. It performs the same checks as named does when loading a @@ -71,7 +71,7 @@

-

OPTIONS

+

OPTIONS

-d

@@ -257,14 +257,14 @@

-

RETURN VALUES

+

RETURN VALUES

named-checkzone returns an exit status of 1 if errors were detected and 0 otherwise.

-

SEE ALSO

+

SEE ALSO

named(8), named-checkconf(8), RFC 1035, @@ -272,7 +272,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/doc/arm/man.named.html b/contrib/bind9/doc/arm/man.named.html index 3e3388776707..2a440ce4b105 100644 --- a/contrib/bind9/doc/arm/man.named.html +++ b/contrib/bind9/doc/arm/man.named.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

named [-4] [-6] [-c config-file] [-d debug-level] [-f] [-g] [-m flag] [-n #cpus] [-p port] [-s] [-S #max-socks] [-t directory] [-u user] [-v] [-V] [-x cache-file]

-

DESCRIPTION

+

DESCRIPTION

named is a Domain Name System (DNS) server, part of the BIND 9 distribution from ISC. For more @@ -65,7 +65,7 @@

-

OPTIONS

+

OPTIONS

-4

@@ -238,7 +238,7 @@

-

SIGNALS

+

SIGNALS

In routine operation, signals should not be used to control the nameserver; rndc should be used @@ -259,7 +259,7 @@

-

CONFIGURATION

+

CONFIGURATION

The named configuration file is too complex to describe in detail here. A complete description is provided @@ -268,7 +268,7 @@

-

FILES

+

FILES

/etc/named.conf

@@ -281,7 +281,7 @@

-

SEE ALSO

+

SEE ALSO

RFC 1033, RFC 1034, RFC 1035, @@ -294,7 +294,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/doc/arm/man.nsupdate.html b/contrib/bind9/doc/arm/man.nsupdate.html index a0ce8661aa5a..eb3b7bec285a 100644 --- a/contrib/bind9/doc/arm/man.nsupdate.html +++ b/contrib/bind9/doc/arm/man.nsupdate.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

nsupdate [-d] [-D] [[-g] | [-o] | [-y [hmac:]keyname:secret] | [-k keyfile]] [-t timeout] [-u udptimeout] [-r udpretries] [-R randomdev] [-v] [filename]

-

DESCRIPTION

+

DESCRIPTION

nsupdate is used to submit Dynamic DNS Update requests as defined in RFC2136 to a name server. @@ -187,7 +187,7 @@

-

INPUT FORMAT

+

INPUT FORMAT

nsupdate reads input from filename @@ -451,7 +451,7 @@

-

EXAMPLES

+

EXAMPLES

The examples below show how nsupdate @@ -505,7 +505,7 @@

-

FILES

+

FILES

/etc/resolv.conf

@@ -524,7 +524,7 @@

-

SEE ALSO

+

SEE ALSO

RFC2136, RFC3007, RFC2104, @@ -537,7 +537,7 @@

-

BUGS

+

BUGS

The TSIG key is redundantly stored in two separate files. This is a consequence of nsupdate using the DST library diff --git a/contrib/bind9/doc/arm/man.rndc-confgen.html b/contrib/bind9/doc/arm/man.rndc-confgen.html index 485e6f4b5b50..cb59c2ed7220 100644 --- a/contrib/bind9/doc/arm/man.rndc-confgen.html +++ b/contrib/bind9/doc/arm/man.rndc-confgen.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -48,7 +48,7 @@

rndc-confgen [-a] [-b keysize] [-c keyfile] [-h] [-k keyname] [-p port] [-r randomfile] [-s address] [-t chrootdir] [-u user]

-

DESCRIPTION

+

DESCRIPTION

rndc-confgen generates configuration files for rndc. It can be used as a @@ -64,7 +64,7 @@

-

OPTIONS

+

OPTIONS

-a
@@ -171,7 +171,7 @@
-

EXAMPLES

+

EXAMPLES

To allow rndc to be used with no manual configuration, run @@ -188,7 +188,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc.conf(5), named(8), @@ -196,7 +196,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/doc/arm/man.rndc.conf.html b/contrib/bind9/doc/arm/man.rndc.conf.html index b4c080126fa0..e8e86ba6b138 100644 --- a/contrib/bind9/doc/arm/man.rndc.conf.html +++ b/contrib/bind9/doc/arm/man.rndc.conf.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc.conf

-

DESCRIPTION

+

DESCRIPTION

rndc.conf is the configuration file for rndc, the BIND 9 name server control utility. This file has a similar structure and syntax to @@ -135,7 +135,7 @@

-

EXAMPLE

+

EXAMPLE

       options {
         default-server  localhost;
@@ -209,7 +209,7 @@
     

-

NAME SERVER CONFIGURATION

+

NAME SERVER CONFIGURATION

The name server must be configured to accept rndc connections and to recognize the key specified in the rndc.conf @@ -219,7 +219,7 @@

-

SEE ALSO

+

SEE ALSO

rndc(8), rndc-confgen(8), mmencode(1), @@ -227,7 +227,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/doc/arm/man.rndc.html b/contrib/bind9/doc/arm/man.rndc.html index ae38ad16d1d1..36843bc145bb 100644 --- a/contrib/bind9/doc/arm/man.rndc.html +++ b/contrib/bind9/doc/arm/man.rndc.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -50,7 +50,7 @@

rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}

-

DESCRIPTION

+

DESCRIPTION

rndc controls the operation of a name server. It supersedes the ndc utility @@ -79,7 +79,7 @@

-

OPTIONS

+

OPTIONS

-b source-address

@@ -151,7 +151,7 @@

-

LIMITATIONS

+

LIMITATIONS

rndc does not yet support all the commands of the BIND 8 ndc utility. @@ -165,7 +165,7 @@

-

SEE ALSO

+

SEE ALSO

rndc.conf(5), rndc-confgen(8), named(8), @@ -175,7 +175,7 @@

-

AUTHOR

+

AUTHOR

Internet Systems Consortium

diff --git a/contrib/bind9/lib/dns/api b/contrib/bind9/lib/dns/api index af155ca8f5f0..4bcf883246ce 100644 --- a/contrib/bind9/lib/dns/api +++ b/contrib/bind9/lib/dns/api @@ -1,3 +1,3 @@ -LIBINTERFACE = 52 +LIBINTERFACE = 53 LIBREVISION = 0 -LIBAGE = 2 +LIBAGE = 0 diff --git a/contrib/bind9/lib/dns/include/dns/db.h b/contrib/bind9/lib/dns/include/dns/db.h index 3b78208943b4..c75c774143f0 100644 --- a/contrib/bind9/lib/dns/include/dns/db.h +++ b/contrib/bind9/lib/dns/include/dns/db.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: db.h,v 1.93.50.3 2009/01/18 23:25:17 marka Exp $ */ +/* $Id: db.h,v 1.93.50.3.12.1 2009/12/31 21:44:37 each Exp $ */ #ifndef DNS_DB_H #define DNS_DB_H 1 @@ -205,14 +205,15 @@ struct dns_db { /*% * Options that can be specified for dns_db_find(). */ -#define DNS_DBFIND_GLUEOK 0x01 -#define DNS_DBFIND_VALIDATEGLUE 0x02 -#define DNS_DBFIND_NOWILD 0x04 -#define DNS_DBFIND_PENDINGOK 0x08 -#define DNS_DBFIND_NOEXACT 0x10 -#define DNS_DBFIND_FORCENSEC 0x20 -#define DNS_DBFIND_COVERINGNSEC 0x40 -#define DNS_DBFIND_FORCENSEC3 0x80 +#define DNS_DBFIND_GLUEOK 0x0001 +#define DNS_DBFIND_VALIDATEGLUE 0x0002 +#define DNS_DBFIND_NOWILD 0x0004 +#define DNS_DBFIND_PENDINGOK 0x0008 +#define DNS_DBFIND_NOEXACT 0x0010 +#define DNS_DBFIND_FORCENSEC 0x0020 +#define DNS_DBFIND_COVERINGNSEC 0x0040 +#define DNS_DBFIND_FORCENSEC3 0x0080 +#define DNS_DBFIND_ADDITIONALOK 0x0100 /*@}*/ /*@{*/ diff --git a/contrib/bind9/lib/dns/include/dns/ncache.h b/contrib/bind9/lib/dns/include/dns/ncache.h index a818fe63cce5..d61684df88c4 100644 --- a/contrib/bind9/lib/dns/include/dns/ncache.h +++ b/contrib/bind9/lib/dns/include/dns/ncache.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: ncache.h,v 1.25 2008/09/25 04:02:39 tbox Exp $ */ +/* $Id: ncache.h,v 1.25.142.1 2009/12/31 20:29:21 each Exp $ */ #ifndef DNS_NCACHE_H #define DNS_NCACHE_H 1 @@ -76,7 +76,7 @@ dns_ncache_addoptout(dns_message_t *message, dns_db_t *cache, * The 'covers' argument is the RR type whose nonexistence we are caching, * or dns_rdatatype_any when caching a NXDOMAIN response. * - * 'optout' indicates a DNS_RATASETATTR_OPTOUT should be set. + * 'optout' indicates a DNS_RDATASETATTR_OPTOUT should be set. * * Note: *\li If 'addedrdataset' is not NULL, then it will be attached to the added diff --git a/contrib/bind9/lib/dns/include/dns/types.h b/contrib/bind9/lib/dns/include/dns/types.h index e07a7965bffb..525dd8d48921 100644 --- a/contrib/bind9/lib/dns/include/dns/types.h +++ b/contrib/bind9/lib/dns/include/dns/types.h @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: types.h,v 1.130.50.3 2009/01/29 22:40:35 jinmei Exp $ */ +/* $Id: types.h,v 1.130.50.3.12.2 2009/12/31 20:29:21 each Exp $ */ #ifndef DNS_TYPES_H #define DNS_TYPES_H 1 @@ -258,40 +258,54 @@ enum { dns_trust_none = 0, #define dns_trust_none ((dns_trust_t)dns_trust_none) - /*% Subject to DNSSEC validation but has not yet been validated */ - dns_trust_pending = 1, -#define dns_trust_pending ((dns_trust_t)dns_trust_pending) + /*% + * Subject to DNSSEC validation but has not yet been validated + * dns_trust_pending_additional (from the additional section). + */ + dns_trust_pending_additional = 1, +#define dns_trust_pending_additional \ + ((dns_trust_t)dns_trust_pending_additional) + + dns_trust_pending_answer = 2, +#define dns_trust_pending_answer ((dns_trust_t)dns_trust_pending_answer) /*% Received in the additional section of a response. */ - dns_trust_additional = 2, + dns_trust_additional = 3, #define dns_trust_additional ((dns_trust_t)dns_trust_additional) /* Received in a referral response. */ - dns_trust_glue = 3, + dns_trust_glue = 4, #define dns_trust_glue ((dns_trust_t)dns_trust_glue) /* Answer from a non-authoritative server */ - dns_trust_answer = 4, + dns_trust_answer = 5, #define dns_trust_answer ((dns_trust_t)dns_trust_answer) /* Received in the authority section as part of an authoritative response */ - dns_trust_authauthority = 5, + dns_trust_authauthority = 6, #define dns_trust_authauthority ((dns_trust_t)dns_trust_authauthority) /* Answer from an authoritative server */ - dns_trust_authanswer = 6, + dns_trust_authanswer = 7, #define dns_trust_authanswer ((dns_trust_t)dns_trust_authanswer) /* Successfully DNSSEC validated */ - dns_trust_secure = 7, + dns_trust_secure = 8, #define dns_trust_secure ((dns_trust_t)dns_trust_secure) /* This server is authoritative */ - dns_trust_ultimate = 8 + dns_trust_ultimate = 9 #define dns_trust_ultimate ((dns_trust_t)dns_trust_ultimate) }; +#define DNS_TRUST_PENDING(x) ((x) == dns_trust_pending_answer || \ + (x) == dns_trust_pending_additional) +#define DNS_TRUST_ADDITIONAL(x) ((x) == dns_trust_additional || \ + (x) == dns_trust_pending_additional) +#define DNS_TRUST_GLUE(x) ((x) == dns_trust_glue) + + /*% * Name checking severities. */ diff --git a/contrib/bind9/lib/dns/masterdump.c b/contrib/bind9/lib/dns/masterdump.c index 5eac96ff2807..1dbb1e615e8b 100644 --- a/contrib/bind9/lib/dns/masterdump.c +++ b/contrib/bind9/lib/dns/masterdump.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: masterdump.c,v 1.94.50.2 2009/01/18 23:47:40 tbox Exp $ */ +/* $Id: masterdump.c,v 1.94.50.2.12.1 2009/11/18 23:58:04 marka Exp $ */ /*! \file */ @@ -775,7 +775,8 @@ dump_order_compare(const void *a, const void *b) { static const char *trustnames[] = { "none", - "pending", + "pending-additional", + "pending-answer", "additional", "glue", "answer", diff --git a/contrib/bind9/lib/dns/rbtdb.c b/contrib/bind9/lib/dns/rbtdb.c index 9741c157f784..d5b5b5c8194f 100644 --- a/contrib/bind9/lib/dns/rbtdb.c +++ b/contrib/bind9/lib/dns/rbtdb.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rbtdb.c,v 1.270.12.6 2009/05/06 23:34:30 jinmei Exp $ */ +/* $Id: rbtdb.c,v 1.270.12.6.10.2 2009/12/31 21:44:36 each Exp $ */ /*! \file */ @@ -4005,7 +4005,7 @@ cache_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { } if (dname_header != NULL && - (dname_header->trust != dns_trust_pending || + (!DNS_TRUST_PENDING(dname_header->trust) || (search->options & DNS_DBFIND_PENDINGOK) != 0)) { /* * We increment the reference count on node to ensure that @@ -4546,9 +4546,11 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, * If we didn't find what we were looking for... */ if (found == NULL || + (DNS_TRUST_ADDITIONAL(found->trust) && + ((options & DNS_DBFIND_ADDITIONALOK) == 0)) || (found->trust == dns_trust_glue && ((options & DNS_DBFIND_GLUEOK) == 0)) || - (found->trust == dns_trust_pending && + (DNS_TRUST_PENDING(found->trust) && ((options & DNS_DBFIND_PENDINGOK) == 0))) { /* * If there is an NS rdataset at this node, then this is the diff --git a/contrib/bind9/lib/dns/resolver.c b/contrib/bind9/lib/dns/resolver.c index a5d7c2500f8f..1b4f407c87fe 100644 --- a/contrib/bind9/lib/dns/resolver.c +++ b/contrib/bind9/lib/dns/resolver.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.384.14.14 2009/06/02 23:47:13 tbox Exp $ */ +/* $Id: resolver.c,v 1.384.14.14.8.2 2010/01/07 17:17:19 each Exp $ */ /*! \file */ @@ -4289,10 +4289,19 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo, rdataset->ttl = res->view->maxcachettl; /* - * If this rrset is in a secure domain, do DNSSEC validation - * for it, unless it is glue. + * If this RRset is in a secure domain, is in bailiwick, + * and is not glue, attempt DNSSEC validation. (We do not + * attempt to validate glue or out-of-bailiwick data--even + * though there might be some performance benefit to doing + * so--because it makes it simpler and safer to ensure that + * records from a secure domain are only cached if validated + * within the context of a query to the domain that owns + * them.) */ - if (secure_domain && rdataset->trust != dns_trust_glue) { + if (secure_domain && rdataset->trust != dns_trust_glue && + !EXTERNAL(rdataset)) { + dns_trust_t trust; + /* * RRSIGs are validated as part of validating the * type they cover. @@ -4330,11 +4339,17 @@ cache_name(fetchctx_t *fctx, dns_name_t *name, dns_adbaddrinfo_t *addrinfo, /* * Cache this rdataset/sigrdataset pair as - * pending data. + * pending data. Track whether it was additional + * or not. */ - rdataset->trust = dns_trust_pending; + if (rdataset->trust == dns_trust_additional) + trust = dns_trust_pending_additional; + else + trust = dns_trust_pending_answer; + + rdataset->trust = trust; if (sigrdataset != NULL) - sigrdataset->trust = dns_trust_pending; + sigrdataset->trust = trust; if (!need_validation || !ANSWER(rdataset)) { addedrdataset = ardataset; result = dns_db_addrdataset(fctx->cache, node, @@ -4682,7 +4697,7 @@ ncache_message(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo, for (trdataset = ISC_LIST_HEAD(tname->list); trdataset != NULL; trdataset = ISC_LIST_NEXT(trdataset, link)) - trdataset->trust = dns_trust_pending; + trdataset->trust = dns_trust_pending_answer; result = dns_message_nextname(fctx->rmessage, DNS_SECTION_AUTHORITY); } @@ -5440,9 +5455,7 @@ answer_response(fetchctx_t *fctx) { /* * This data is outside of * our query domain, and - * may only be cached if it - * comes from a secure zone - * and validates. + * may not be cached. */ rdataset->attributes |= DNS_RDATASETATTR_EXTERNAL; diff --git a/contrib/bind9/lib/dns/validator.c b/contrib/bind9/lib/dns/validator.c index c62b714162ba..ce49daf2eb10 100644 --- a/contrib/bind9/lib/dns/validator.c +++ b/contrib/bind9/lib/dns/validator.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: validator.c,v 1.164.12.9 2009/05/07 23:47:12 tbox Exp $ */ +/* $Id: validator.c,v 1.164.12.9.8.2 2009/12/31 20:29:21 each Exp $ */ #include @@ -1607,7 +1607,7 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { * We have an rrset for the given keyname. */ val->keyset = &val->frdataset; - if (val->frdataset.trust == dns_trust_pending && + if (DNS_TRUST_PENDING(val->frdataset.trust) && dns_rdataset_isassociated(&val->fsigrdataset)) { /* @@ -1622,7 +1622,7 @@ get_key(dns_validator_t *val, dns_rdata_rrsig_t *siginfo) { if (result != ISC_R_SUCCESS) return (result); return (DNS_R_WAIT); - } else if (val->frdataset.trust == dns_trust_pending) { + } else if (DNS_TRUST_PENDING(val->frdataset.trust)) { /* * Having a pending key with no signature means that * something is broken. @@ -2243,7 +2243,7 @@ validatezonekey(dns_validator_t *val) { * We have DS records. */ val->dsset = &val->frdataset; - if (val->frdataset.trust == dns_trust_pending && + if (DNS_TRUST_PENDING(val->frdataset.trust) && dns_rdataset_isassociated(&val->fsigrdataset)) { result = create_validator(val, @@ -2256,7 +2256,7 @@ validatezonekey(dns_validator_t *val) { if (result != ISC_R_SUCCESS) return (result); return (DNS_R_WAIT); - } else if (val->frdataset.trust == dns_trust_pending) { + } else if (DNS_TRUST_PENDING(val->frdataset.trust)) { /* * There should never be an unsigned DS. */ @@ -3242,20 +3242,20 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) if (val->havedlvsep) dns_name_copy(dns_fixedname_name(&val->dlvsep), secroot, NULL); else { + unsigned int labels; dns_name_copy(val->event->name, secroot, NULL); /* * If this is a response to a DS query, we need to look in * the parent zone for the trust anchor. */ - if (val->event->type == dns_rdatatype_ds && - dns_name_countlabels(secroot) > 1U) - dns_name_split(secroot, 1, NULL, secroot); + + labels = dns_name_countlabels(secroot); + if (val->event->type == dns_rdatatype_ds && labels > 1U) + dns_name_getlabelsequence(secroot, 1, labels - 1, + secroot); result = dns_keytable_finddeepestmatch(val->keytable, secroot, secroot); - if (result == ISC_R_NOTFOUND) { - validator_log(val, ISC_LOG_DEBUG(3), - "not beneath secure root"); if (val->mustbesecure) { validator_log(val, ISC_LOG_WARNING, "must be secure failure"); @@ -3337,7 +3337,7 @@ proveunsecure(dns_validator_t *val, isc_boolean_t have_ds, isc_boolean_t resume) * There is no DS. If this is a delegation, * we maybe done. */ - if (val->frdataset.trust == dns_trust_pending) { + if (DNS_TRUST_PENDING(val->frdataset.trust)) { result = create_fetch(val, tname, dns_rdatatype_ds, dsfetched2, diff --git a/contrib/bind9/lib/isc/ia64/include/isc/atomic.h b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h index 275741bee333..0fac76f3be21 100644 --- a/contrib/bind9/lib/isc/ia64/include/isc/atomic.h +++ b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h @@ -41,7 +41,7 @@ isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) { swapped = prev + val; __asm__ volatile( - "mov ar.ccv=%2;" + "mov ar.ccv=%2;;" "cmpxchg4.acq %0=%4,%3,ar.ccv" : "=r" (swapped), "=m" (*p) : "r" (prev), "r" (swapped), "m" (*p) @@ -84,7 +84,7 @@ isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) isc_int32_t ret; __asm__ volatile( - "mov ar.ccv=%2;" + "mov ar.ccv=%2;;" "cmpxchg4.acq %0=%4,%3,ar.ccv" : "=r" (ret), "=m" (*p) : "r" (cmpval), "r" (val), "m" (*p) diff --git a/contrib/bind9/lib/lwres/man/lwres.html b/contrib/bind9/lib/lwres/man/lwres.html index 70d7856f3729..986918a8cf7d 100644 --- a/contrib/bind9/lib/lwres/man/lwres.html +++ b/contrib/bind9/lib/lwres/man/lwres.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres — introduction to the lightweight resolver library

@@ -32,7 +32,7 @@
#include <lwres/lwres.h>
-

DESCRIPTION

+

DESCRIPTION

The BIND 9 lightweight resolver library is a simple, name service independent stub resolver library. It provides hostname-to-address @@ -47,7 +47,7 @@

-

OVERVIEW

+

OVERVIEW

The lwresd library implements multiple name service APIs. The standard @@ -101,7 +101,7 @@

-

CLIENT-SIDE LOW-LEVEL API CALL FLOW

+

CLIENT-SIDE LOW-LEVEL API CALL FLOW

When a client program wishes to make an lwres request using the native low-level API, it typically performs the following @@ -149,7 +149,7 @@

-

SERVER-SIDE LOW-LEVEL API CALL FLOW

+

SERVER-SIDE LOW-LEVEL API CALL FLOW

When implementing the server side of the lightweight resolver protocol using the lwres library, a sequence of actions like the @@ -191,7 +191,7 @@

-

SEE ALSO

+

SEE ALSO

lwres_gethostent(3), lwres_getipnode(3), diff --git a/contrib/bind9/lib/lwres/man/lwres_buffer.html b/contrib/bind9/lib/lwres/man/lwres_buffer.html index deb526248998..7ed5407c53aa 100644 --- a/contrib/bind9/lib/lwres/man/lwres_buffer.html +++ b/contrib/bind9/lib/lwres/man/lwres_buffer.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_buffer_init, lwres_buffer_invalidate, lwres_buffer_add, lwres_buffer_subtract, lwres_buffer_clear, lwres_buffer_first, lwres_buffer_forward, lwres_buffer_back, lwres_buffer_getuint8, lwres_buffer_putuint8, lwres_buffer_getuint16, lwres_buffer_putuint16, lwres_buffer_getuint32, lwres_buffer_putuint32, lwres_buffer_putmem, lwres_buffer_getmem — lightweight resolver buffer management

@@ -262,7 +262,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide bounds checked access to a region of memory where data is being read or written. diff --git a/contrib/bind9/lib/lwres/man/lwres_config.html b/contrib/bind9/lib/lwres/man/lwres_config.html index e27892b20201..050fd5de361c 100644 --- a/contrib/bind9/lib/lwres/man/lwres_config.html +++ b/contrib/bind9/lib/lwres/man/lwres_config.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_conf_init, lwres_conf_clear, lwres_conf_parse, lwres_conf_print, lwres_conf_get — lightweight resolver configuration

@@ -90,7 +90,7 @@ lwres_conf_t *
-

DESCRIPTION

+

DESCRIPTION

lwres_conf_init() creates an empty lwres_conf_t @@ -123,7 +123,7 @@ lwres_conf_t *

-

RETURN VALUES

+

RETURN VALUES

lwres_conf_parse() returns LWRES_R_SUCCESS if it successfully read and parsed @@ -142,13 +142,13 @@ lwres_conf_t *

-

SEE ALSO

+

SEE ALSO

stdio(3), resolver(5).

-

FILES

+

FILES

/etc/resolv.conf

diff --git a/contrib/bind9/lib/lwres/man/lwres_context.html b/contrib/bind9/lib/lwres/man/lwres_context.html index 18c3d38fb72f..d6fada9b918e 100644 --- a/contrib/bind9/lib/lwres/man/lwres_context.html +++ b/contrib/bind9/lib/lwres/man/lwres_context.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_context_create, lwres_context_destroy, lwres_context_nextserial, lwres_context_initserial, lwres_context_freemem, lwres_context_allocmem, lwres_context_sendrecv — lightweight resolver context management

@@ -172,7 +172,7 @@ void *
-

DESCRIPTION

+

DESCRIPTION

lwres_context_create() creates a lwres_context_t structure for use in lightweight resolver operations. It holds a socket and other @@ -258,7 +258,7 @@ void *

-

RETURN VALUES

+

RETURN VALUES

lwres_context_create() returns LWRES_R_NOMEMORY if memory for the struct lwres_context could not be allocated, @@ -283,7 +283,7 @@ void *

-

SEE ALSO

+

SEE ALSO

lwres_conf_init(3), malloc(3), diff --git a/contrib/bind9/lib/lwres/man/lwres_gabn.html b/contrib/bind9/lib/lwres/man/lwres_gabn.html index a51d2520e7a8..efb152a381d4 100644 --- a/contrib/bind9/lib/lwres/man/lwres_gabn.html +++ b/contrib/bind9/lib/lwres/man/lwres_gabn.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gabnrequest_render, lwres_gabnresponse_render, lwres_gabnrequest_parse, lwres_gabnresponse_parse, lwres_gabnresponse_free, lwres_gabnrequest_free — lightweight resolver getaddrbyname message handling

@@ -178,7 +178,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver name-to-address lookup request and @@ -278,7 +278,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getaddrbyname opcode functions lwres_gabnrequest_render(), @@ -316,7 +316,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html index c64beb13b23c..aeb0967e3e06 100644 --- a/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html +++ b/contrib/bind9/lib/lwres/man/lwres_gai_strerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gai_strerror — print suitable error string

@@ -42,7 +42,7 @@ char *
-

DESCRIPTION

+

DESCRIPTION

lwres_gai_strerror() returns an error message corresponding to an error code returned by getaddrinfo(). @@ -110,7 +110,7 @@ char *

-

SEE ALSO

+

SEE ALSO

strerror(3), lwres_getaddrinfo(3), diff --git a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html index d4dd956aa364..ec0083952a2b 100644 --- a/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html +++ b/contrib/bind9/lib/lwres/man/lwres_getaddrinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getaddrinfo, lwres_freeaddrinfo — socket address structure to host and service name

@@ -89,7 +89,7 @@ struct addrinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getaddrinfo() is used to get a list of IP addresses and port numbers for host hostname and service @@ -283,7 +283,7 @@ struct addrinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getaddrinfo() returns zero on success or one of the error codes listed in gai_strerror(3) @@ -294,7 +294,7 @@ struct addrinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3), lwres_getaddrinfo(3), diff --git a/contrib/bind9/lib/lwres/man/lwres_gethostent.html b/contrib/bind9/lib/lwres/man/lwres_gethostent.html index efeeaa238a50..9465440bd51a 100644 --- a/contrib/bind9/lib/lwres/man/lwres_gethostent.html +++ b/contrib/bind9/lib/lwres/man/lwres_gethostent.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_gethostbyname, lwres_gethostbyname2, lwres_gethostbyaddr, lwres_gethostent, lwres_sethostent, lwres_endhostent, lwres_gethostbyname_r, lwres_gethostbyaddr_r, lwres_gethostent_r, lwres_sethostent_r, lwres_endhostent_r — lightweight resolver get network host entry

@@ -228,7 +228,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions provide hostname-to-address and address-to-hostname lookups by means of the lightweight resolver. @@ -366,7 +366,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

The functions lwres_gethostbyname(), @@ -430,7 +430,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

gethostent(3), lwres_getipnode(3), @@ -439,7 +439,7 @@ struct hostent {

-

BUGS

+

BUGS

lwres_gethostbyname(), lwres_gethostbyname2(), lwres_gethostbyaddr() diff --git a/contrib/bind9/lib/lwres/man/lwres_getipnode.html b/contrib/bind9/lib/lwres/man/lwres_getipnode.html index 23fe50fdf5f4..c92c51cb2802 100644 --- a/contrib/bind9/lib/lwres/man/lwres_getipnode.html +++ b/contrib/bind9/lib/lwres/man/lwres_getipnode.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getipnodebyname, lwres_getipnodebyaddr, lwres_freehostent — lightweight resolver nodename / address translation API

@@ -98,7 +98,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These functions perform thread safe, protocol independent nodename-to-address and address-to-nodename @@ -217,7 +217,7 @@ struct hostent {

-

RETURN VALUES

+

RETURN VALUES

If an error occurs, lwres_getipnodebyname() @@ -261,7 +261,7 @@ struct hostent {

-

SEE ALSO

+

SEE ALSO

RFC2553, lwres(3), diff --git a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html index 53a70d96279a..7730131cfdac 100644 --- a/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html +++ b/contrib/bind9/lib/lwres/man/lwres_getnameinfo.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getnameinfo — lightweight resolver socket address structure to hostname and @@ -82,7 +82,7 @@ int

-

DESCRIPTION

+

DESCRIPTION

This function is equivalent to the getnameinfo(3) function defined in RFC2133. @@ -149,13 +149,13 @@ int

-

RETURN VALUES

+

RETURN VALUES

lwres_getnameinfo() returns 0 on success or a non-zero error code if an error occurs.

-

SEE ALSO

+

SEE ALSO

RFC2133, getservbyport(3), lwres(3), @@ -165,7 +165,7 @@ int

-

BUGS

+

BUGS

RFC2133 fails to define what the nonzero return values of getnameinfo(3) diff --git a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html index 8dc36a146e1b..15bfb82dc644 100644 --- a/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html +++ b/contrib/bind9/lib/lwres/man/lwres_getrrsetbyname.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_getrrsetbyname, lwres_freerrset — retrieve DNS records

@@ -102,7 +102,7 @@ struct rrsetinfo {

-

DESCRIPTION

+

DESCRIPTION

lwres_getrrsetbyname() gets a set of resource records associated with a hostname, class, @@ -150,7 +150,7 @@ struct rrsetinfo {

-

RETURN VALUES

+

RETURN VALUES

lwres_getrrsetbyname() returns zero on success, and one of the following error codes if an error occurred: @@ -184,7 +184,7 @@ struct rrsetinfo {

-

SEE ALSO

+

SEE ALSO

lwres(3).

diff --git a/contrib/bind9/lib/lwres/man/lwres_gnba.html b/contrib/bind9/lib/lwres/man/lwres_gnba.html index 88b18a8630e3..80c909ec212e 100644 --- a/contrib/bind9/lib/lwres/man/lwres_gnba.html +++ b/contrib/bind9/lib/lwres/man/lwres_gnba.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_gnbarequest_render, lwres_gnbaresponse_render, lwres_gnbarequest_parse, lwres_gnbaresponse_parse, lwres_gnbaresponse_free, lwres_gnbarequest_free — lightweight resolver getnamebyaddress message handling

@@ -183,7 +183,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver address-to-name lookup request and @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The getnamebyaddr opcode functions lwres_gnbarequest_render(), @@ -308,7 +308,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3).

diff --git a/contrib/bind9/lib/lwres/man/lwres_hstrerror.html b/contrib/bind9/lib/lwres/man/lwres_hstrerror.html index ef67d486f991..b166e3d7780d 100644 --- a/contrib/bind9/lib/lwres/man/lwres_hstrerror.html +++ b/contrib/bind9/lib/lwres/man/lwres_hstrerror.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_herror, lwres_hstrerror — lightweight resolver error message generation

@@ -50,7 +50,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_herror() prints the string s on stderr followed by the string generated by @@ -84,7 +84,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

The string Unknown resolver error is returned by lwres_hstrerror() @@ -94,7 +94,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

herror(3), lwres_hstrerror(3). diff --git a/contrib/bind9/lib/lwres/man/lwres_inetntop.html b/contrib/bind9/lib/lwres/man/lwres_inetntop.html index 1a911103e853..3522a1dc1912 100644 --- a/contrib/bind9/lib/lwres/man/lwres_inetntop.html +++ b/contrib/bind9/lib/lwres/man/lwres_inetntop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_net_ntop — lightweight resolver IP address presentation

@@ -62,7 +62,7 @@ const char *
-

DESCRIPTION

+

DESCRIPTION

lwres_net_ntop() converts an IP address of protocol family af — IPv4 or IPv6 — at @@ -80,7 +80,7 @@ const char *

-

RETURN VALUES

+

RETURN VALUES

If successful, the function returns dst: a pointer to a string containing the presentation format of the @@ -93,7 +93,7 @@ const char *

-

SEE ALSO

+

SEE ALSO

RFC1884, inet_ntop(3), errno(3). diff --git a/contrib/bind9/lib/lwres/man/lwres_noop.html b/contrib/bind9/lib/lwres/man/lwres_noop.html index aab581a5fe34..18a41fa0a542 100644 --- a/contrib/bind9/lib/lwres/man/lwres_noop.html +++ b/contrib/bind9/lib/lwres/man/lwres_noop.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_nooprequest_render, lwres_noopresponse_render, lwres_nooprequest_parse, lwres_noopresponse_parse, lwres_noopresponse_free, lwres_nooprequest_free — lightweight resolver no-op message handling

@@ -179,7 +179,7 @@ void
-

DESCRIPTION

+

DESCRIPTION

These are low-level routines for creating and parsing lightweight resolver no-op request and response messages. @@ -270,7 +270,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

The no-op opcode functions lwres_nooprequest_render(), @@ -309,7 +309,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_packet(3)

diff --git a/contrib/bind9/lib/lwres/man/lwres_packet.html b/contrib/bind9/lib/lwres/man/lwres_packet.html index b4cc1df5949b..11601e86b122 100644 --- a/contrib/bind9/lib/lwres/man/lwres_packet.html +++ b/contrib/bind9/lib/lwres/man/lwres_packet.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@
-
+

Name

lwres_lwpacket_renderheader, lwres_lwpacket_parseheader — lightweight resolver packet handling functions

@@ -66,7 +66,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

These functions rely on a struct lwres_lwpacket @@ -219,7 +219,7 @@ struct lwres_lwpacket {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_lwpacket_renderheader() and diff --git a/contrib/bind9/lib/lwres/man/lwres_resutil.html b/contrib/bind9/lib/lwres/man/lwres_resutil.html index 7bc3e6e3ef0d..e67ac0aa7968 100644 --- a/contrib/bind9/lib/lwres/man/lwres_resutil.html +++ b/contrib/bind9/lib/lwres/man/lwres_resutil.html @@ -14,7 +14,7 @@ - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. --> - + @@ -22,7 +22,7 @@

-
+

Name

lwres_string_parse, lwres_addr_parse, lwres_getaddrsbyname, lwres_getnamebyaddr — lightweight resolver utility functions

@@ -134,7 +134,7 @@ lwres_result_t
-

DESCRIPTION

+

DESCRIPTION

lwres_string_parse() retrieves a DNS-encoded string starting the current pointer of lightweight resolver buffer b: i.e. @@ -210,7 +210,7 @@ typedef struct {

-

RETURN VALUES

+

RETURN VALUES

Successful calls to lwres_string_parse() @@ -248,7 +248,7 @@ typedef struct {

-

SEE ALSO

+

SEE ALSO

lwres_buffer(3), lwres_gabn(3). diff --git a/contrib/bind9/version b/contrib/bind9/version index 3245f02d3fd8..c6fcc3fdeb66 100644 --- a/contrib/bind9/version +++ b/contrib/bind9/version @@ -1,4 +1,4 @@ -# $Id: version,v 1.43.12.5.8.1 2009/07/28 14:18:08 marka Exp $ +# $Id: version,v 1.43.12.5.8.3 2009/12/31 20:29:20 each Exp $ # # This file must follow /bin/sh rules. It is imported directly via # configure. @@ -7,4 +7,4 @@ MAJORVER=9 MINORVER=6 PATCHVER=1 RELEASETYPE=-P -RELEASEVER=1 +RELEASEVER=3 diff --git a/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt b/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt index 32cf7a633855..fa0dba37a2b9 100644 --- a/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt +++ b/contrib/bsnmp/snmp_mibII/BEGEMOT-MIB2-MIB.txt @@ -39,7 +39,7 @@ IMPORTS FROM BEGEMOT-IP-MIB; begemotMib2 MODULE-IDENTITY - LAST-UPDATED "200602130000Z" + LAST-UPDATED "200908030000Z" ORGANIZATION "German Aerospace Center" CONTACT-INFO " Hartmut Brandt @@ -54,6 +54,12 @@ begemotMib2 MODULE-IDENTITY E-mail: harti@freebsd.org" DESCRIPTION "The MIB for private mib2 stuff." + REVISION "200908030000Z" + DESCRIPTION + "Second edition adds begemotIfDataPoll object." + REVISION "200602130000Z" + DESCRIPTION + "Initial revision." ::= { begemotIp 1 } begemotIfMaxspeed OBJECT-TYPE @@ -87,4 +93,14 @@ begemotIfForcePoll OBJECT-TYPE bit rate in its MIB." ::= { begemotMib2 3 } +begemotIfDataPoll OBJECT-TYPE + SYNTAX TimeTicks + UNITS "deciseconds" + MAX-ACCESS read-write + STATUS current + DESCRIPTION + "The rate at which the mib2 module will poll interface data." + DEFVAL { 100 } + ::= { begemotMib2 4 } + END diff --git a/contrib/bsnmp/snmp_mibII/mibII.c b/contrib/bsnmp/snmp_mibII/mibII.c index cd4caacdd5eb..871469518448 100644 --- a/contrib/bsnmp/snmp_mibII/mibII.c +++ b/contrib/bsnmp/snmp_mibII/mibII.c @@ -117,6 +117,15 @@ u_int mibif_hc_update_interval; /* HC update timer handle */ static void *hc_update_timer; +/* Idle poll timer */ +static void *mibII_poll_timer; + +/* interfaces' data poll interval */ +u_int mibII_poll_ticks; + +/* Idle poll hook */ +static void mibII_idle(void *arg __unused); + /*****************************/ static const struct asn_oid oid_ifMIB = OIDX_ifMIB; @@ -410,6 +419,20 @@ mibif_reset_hc_timer(void) mibif_hc_update_interval = ticks; } +/** + * Restart the idle poll timer. + */ +void +mibif_restart_mibII_poll_timer(void) +{ + if (mibII_poll_timer != NULL) + timer_stop(mibII_poll_timer); + + if ((mibII_poll_timer = timer_start_repeat(mibII_poll_ticks * 10, + mibII_poll_ticks * 10, mibII_idle, NULL, module)) == NULL) + syslog(LOG_ERR, "timer_start(%u): %m", mibII_poll_ticks); +} + /* * Fetch new MIB data. */ @@ -1553,7 +1576,7 @@ get_cloners(void) * Idle function */ static void -mibII_idle(void) +mibII_idle(void *arg __unused) { struct mibifa *ifa; @@ -1608,6 +1631,10 @@ mibII_start(void) ipForward_reg = or_register(&oid_ipForward, "The MIB module for the display of CIDR multipath IP Routes.", module); + + mibII_poll_timer = NULL; + mibII_poll_ticks = MIBII_POLL_TICKS; + mibif_restart_mibII_poll_timer(); } /* @@ -1651,6 +1678,11 @@ mibII_init(struct lmodule *mod, int argc __unused, char *argv[] __unused) static int mibII_fini(void) { + if (mibII_poll_timer != NULL ) { + timer_stop(mibII_poll_timer); + mibII_poll_timer = NULL; + } + if (route_fd != NULL) fd_deselect(route_fd); if (route != -1) @@ -1690,7 +1722,7 @@ const struct snmp_module config = { "This module implements the interface and ip groups.", mibII_init, mibII_fini, - mibII_idle, /* idle */ + NULL, /* idle */ NULL, /* dump */ NULL, /* config */ mibII_start, diff --git a/contrib/bsnmp/snmp_mibII/mibII.h b/contrib/bsnmp/snmp_mibII/mibII.h index a21e023be5c6..0ebde9a9f9ec 100644 --- a/contrib/bsnmp/snmp_mibII/mibII.h +++ b/contrib/bsnmp/snmp_mibII/mibII.h @@ -211,6 +211,14 @@ extern u_int mibif_hc_update_interval; /* re-compute update interval */ void mibif_reset_hc_timer(void); +/* interfaces' data poll interval */ +extern u_int mibII_poll_ticks; + +/* restart the data poll timer */ +void mibif_restart_mibII_poll_timer(void); + +#define MIBII_POLL_TICKS 100 + /* get interfaces and interface addresses. */ void mib_fetch_interfaces(void); diff --git a/contrib/bsnmp/snmp_mibII/mibII_begemot.c b/contrib/bsnmp/snmp_mibII/mibII_begemot.c index 5841b8144139..b502e954778b 100644 --- a/contrib/bsnmp/snmp_mibII/mibII_begemot.c +++ b/contrib/bsnmp/snmp_mibII/mibII_begemot.c @@ -59,6 +59,11 @@ op_begemot_mibII(struct snmp_context *ctx __unused, struct snmp_value *value, ctx->scratch->int1 = mibif_force_hc_update_interval; mibif_force_hc_update_interval = value->v.uint32; return (SNMP_ERR_NOERROR); + + case LEAF_begemotIfDataPoll: + ctx->scratch->int1 = mibII_poll_ticks; + mibII_poll_ticks = value->v.uint32; + return (SNMP_ERR_NOERROR); } abort(); @@ -68,6 +73,10 @@ op_begemot_mibII(struct snmp_context *ctx __unused, struct snmp_value *value, case LEAF_begemotIfForcePoll: mibif_force_hc_update_interval = ctx->scratch->int1; return (SNMP_ERR_NOERROR); + + case LEAF_begemotIfDataPoll: + mibII_poll_ticks = ctx->scratch->int1; + return (SNMP_ERR_NOERROR); } abort(); @@ -78,6 +87,10 @@ op_begemot_mibII(struct snmp_context *ctx __unused, struct snmp_value *value, mibif_force_hc_update_interval = ctx->scratch->int1; mibif_reset_hc_timer(); return (SNMP_ERR_NOERROR); + + case LEAF_begemotIfDataPoll: + mibif_restart_mibII_poll_timer(); + return (SNMP_ERR_NOERROR); } abort(); } @@ -98,6 +111,10 @@ op_begemot_mibII(struct snmp_context *ctx __unused, struct snmp_value *value, case LEAF_begemotIfForcePoll: value->v.uint32 = mibif_force_hc_update_interval; return (SNMP_ERR_NOERROR); + + case LEAF_begemotIfDataPoll: + value->v.uint32 = mibII_poll_ticks; + return (SNMP_ERR_NOERROR); } abort(); } diff --git a/contrib/bsnmp/snmp_mibII/mibII_tree.def b/contrib/bsnmp/snmp_mibII/mibII_tree.def index 90fbb03ae212..d3775389933e 100644 --- a/contrib/bsnmp/snmp_mibII/mibII_tree.def +++ b/contrib/bsnmp/snmp_mibII/mibII_tree.def @@ -240,6 +240,7 @@ (1 begemotIfMaxspeed COUNTER64 op_begemot_mibII GET) (2 begemotIfPoll TIMETICKS op_begemot_mibII GET) (3 begemotIfForcePoll TIMETICKS op_begemot_mibII GET SET) + (4 begemotIfDataPoll TIMETICKS op_begemot_mibII GET SET) ) ) ) diff --git a/contrib/csup/GNUmakefile b/contrib/csup/GNUmakefile deleted file mode 100644 index 18fb0718f022..000000000000 --- a/contrib/csup/GNUmakefile +++ /dev/null @@ -1,64 +0,0 @@ -# A simple gmake Makefile, to be used on Linux and Darwin. It shouldn't -# be used elsewhere because it assumes that the target system doesn't -# support BSD extended file flags. -# -# $FreeBSD$ -# - -PREFIX?=/usr/local -OWNER?= 0 -GROUP?= 0 - -UNAME= $(shell uname -s) - -SRCS= attrstack.c config.c detailer.c diff.c fattr.c fixups.c fnmatch.c \ - globtree.c idcache.c keyword.c lex.rcs.c lister.c main.c misc.c mux.c \ - pathcomp.c parse.c proto.c rcsfile.c rcsparse.c rsyncfile.c status.c \ - stream.c threads.c token.c updater.c -OBJS= $(SRCS:.c=.o) - -WARNS= -Wall -W -Wno-unused-parameter -Wmissing-prototypes -Wpointer-arith \ - -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow \ - -Wcast-align -Wunused-parameter -Wchar-subscripts -Winline \ - -Wnested-externs -Wredundant-decls -Wno-format-y2k - -CFLAGS+= -g -O -pipe -DNDEBUG -I$(PREFIX)/include -ifeq ($(UNAME), Linux) - CFLAGS+= -D_XOPEN_SOURCE -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -endif -ifeq ($(UNAME), Darwin) - CFLAGS+= -DHAVE_FFLAGS -endif -CFLAGS+= $(WARNS) -LDFLAGS= -L$(PREFIX)/lib -lcrypto -lz -lpthread - -.PHONY: all clean install - -all: csup csup.1.gz - -csup: $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) - -config.c: parse.h - -token.c: token.l - -parse.c: parse.y - -parse.h: parse.c - -clean: - rm -f csup $(OBJS) parse.c parse.h token.c csup.1.gz - -%.o: %.c - $(CC) $(CFLAGS) -c -o $@ $< - -%.c: %.y - $(YACC) -d -o $@ $< - -csup.1.gz: csup.1 - gzip -cn $< > $@ - -install: csup csup.1.gz - install -s -o $(OWNER) -g $(GROUP) csup $(PREFIX)/bin - install -s -o $(OWNER) -g $(GROUP) csup.1.gz $(PREFIX)/share/man/man1 diff --git a/contrib/csup/Makefile b/contrib/csup/Makefile deleted file mode 100644 index d82a0f1774d3..000000000000 --- a/contrib/csup/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# $FreeBSD$ - -PREFIX?= /usr/local -BINDIR?= ${PREFIX}/bin -MANDIR?= ${PREFIX}/man/man - -UNAME!= /usr/bin/uname -s - -PROG= csup -SRCS= attrstack.c config.c detailer.c diff.c fattr.c fixups.c fnmatch.c \ - globtree.c idcache.c keyword.c lister.c main.c misc.c mux.c parse.y \ - pathcomp.c proto.c status.c stream.c threads.c token.l updater.c \ - rcsfile.c rcsparse.c lex.rcs.c rsyncfile.c - -CFLAGS+= -I. -I${.CURDIR} -g -pthread -DHAVE_FFLAGS -DNDEBUG -WARNS?= 1 - -# A bit of tweaking is needed to get this Makefile working -# with the bsd.prog.mk of all the *BSD OSes... -.if (${UNAME} == "NetBSD") -LDFLAGS+= -pthread -YHEADER= yes - -.elif (${UNAME} == "OpenBSD") -# I bet there's a better way to do this with the OpenBSD mk -# framework but well, this works and I got bored. -LDFLAGS+= -pthread -YFLAGS= -d -CLEANFILES+= parse.c parse.h y.tab.h - -config.c: parse.h - -token.l: parse.h - -y.tab.h: parse.c - -parse.h: y.tab.h - cp ${.ALLSRC} ${.TARGET} - -.endif - -DPADD= ${LIBCRYPTO} ${LIBZ} -LDADD= -lcrypto -lz - -.include diff --git a/contrib/dtc/Documentation/dtc-paper.bib b/contrib/dtc/Documentation/dtc-paper.bib new file mode 100644 index 000000000000..d01e2ff9e9a5 --- /dev/null +++ b/contrib/dtc/Documentation/dtc-paper.bib @@ -0,0 +1,43 @@ +@STRING{pub-IEEE = "IEEE Computer Society"} +@STRING{pub-IEEE:adr = "345 E. 47th St, New York, NY 10017, USA"} + +@BOOK{IEEE1275, + key = "IEEE1275", + title = "{IEEE} {S}tandard for {B}oot ({I}nitialization {C}onfiguration) {F}irmware: {C}ore {R}equirements and {P}ractices", + publisher = pub-IEEE, + address = pub-IEEE:adr, + series = "IEEE Std 1275-1994", + year = 1994, +} + +@BOOK{IEEE1275-pci, + key = "IEEE1275-pci", + title = "{PCI} {B}us {B}inding to: {IEEE} {S}td 1275-1994 {S}tandard for {B}oot ({I}nitialization {C}onfiguration) {F}irmware", + publisher = pub-IEEE, + address = pub-IEEE:adr, + note = "Revision 2.1", + year = 1998, +} + +@MISC{noof1, + author = "Benjamin Herrenschmidt", + title = "Booting the {L}inux/ppc kernel without {O}pen {F}irmware", + month = may, + year = 2005, + note = "v0.1, \url{http://ozlabs.org/pipermail/linuxppc64-dev/2005-May/004073.html}", +} + +@MISC{noof5, + author = "Benjamin Herrenschmidt", + title = "Booting the {L}inux/ppc kernel without {O}pen {F}irmware", + month = nov, + year = 2005, + note = "v0.5, \url{http://ozlabs.org/pipermail/linuxppc64-dev/2005-December/006994.html}", +} + +@MISC{dtcgit, + author = "David Gibson et al.", + title = "\dtc{}", + howpublished = "git tree", + note = "\url{http://ozlabs.org/~dgibson/dtc/dtc.git}", +} diff --git a/contrib/dtc/Documentation/dtc-paper.tex b/contrib/dtc/Documentation/dtc-paper.tex new file mode 100644 index 000000000000..4494226d86bd --- /dev/null +++ b/contrib/dtc/Documentation/dtc-paper.tex @@ -0,0 +1,597 @@ +\documentclass[a4paper,twocolumn]{article} + +\usepackage{abstract} +\usepackage{xspace} +\usepackage{amssymb} +\usepackage{latexsym} +\usepackage{tabularx} +\usepackage[T1]{fontenc} +\usepackage{calc} +\usepackage{listings} +\usepackage{color} +\usepackage{url} + +\title{Device trees everywhere} + +\author{David Gibson \texttt{<{dwg}{@}{au1.ibm.com}>}\\ + Benjamin Herrenschmidt \texttt{<{benh}{@}{kernel.crashing.org}>}\\ + \emph{OzLabs, IBM Linux Technology Center}} + +\newcommand{\R}{\textsuperscript{\textregistered}\xspace} +\newcommand{\tm}{\textsuperscript{\texttrademark}\xspace} +\newcommand{\tge}{$\geqslant$} +%\newcommand{\ditto}{\textquotedbl\xspace} + +\newcommand{\fixme}[1]{$\bigstar$\emph{\textbf{\large #1}}$\bigstar$\xspace} + +\newcommand{\ppc}{\mbox{PowerPC}\xspace} +\newcommand{\of}{Open Firmware\xspace} +\newcommand{\benh}{Ben Herrenschmidt\xspace} +\newcommand{\kexec}{\texttt{kexec()}\xspace} +\newcommand{\dtbeginnode}{\texttt{OF\_DT\_BEGIN\_NODE\xspace}} +\newcommand{\dtendnode}{\texttt{OF\_DT\_END\_NODE\xspace}} +\newcommand{\dtprop}{\texttt{OF\_DT\_PROP\xspace}} +\newcommand{\dtend}{\texttt{OF\_DT\_END\xspace}} +\newcommand{\dtc}{\texttt{dtc}\xspace} +\newcommand{\phandle}{\texttt{linux,phandle}\xspace} +\begin{document} + +\maketitle + +\begin{abstract} + We present a method for booting a \ppc{}\R Linux\R kernel on an + embedded machine. To do this, we supply the kernel with a compact + flattened-tree representation of the system's hardware based on the + device tree supplied by Open Firmware on IBM\R servers and Apple\R + Power Macintosh\R machines. + + The ``blob'' representing the device tree can be created using \dtc + --- the Device Tree Compiler --- that turns a simple text + representation of the tree into the compact representation used by + the kernel. The compiler can produce either a binary ``blob'' or an + assembler file ready to be built into a firmware or bootwrapper + image. + + This flattened-tree approach is now the only supported method of + booting a \texttt{ppc64} kernel without Open Firmware, and we plan + to make it the only supported method for all \texttt{powerpc} + kernels in the future. +\end{abstract} + +\section{Introduction} + +\subsection{OF and the device tree} + +Historically, ``everyday'' \ppc machines have booted with the help of +\of (OF), a firmware environment defined by IEEE1275 \cite{IEEE1275}. +Among other boot-time services, OF maintains a device tree that +describes all of the system's hardware devices and how they're +connected. During boot, before taking control of memory management, +the Linux kernel uses OF calls to scan the device tree and transfer it +to an internal representation that is used at run time to look up +various device information. + +The device tree consists of nodes representing devices or +buses\footnote{Well, mostly. There are a few special exceptions.}. +Each node contains \emph{properties}, name--value pairs that give +information about the device. The values are arbitrary byte strings, +and for some properties, they contain tables or other structured +information. + +\subsection{The bad old days} + +Embedded systems, by contrast, usually have a minimal firmware that +might supply a few vital system parameters (size of RAM and the like), +but nothing as detailed or complete as the OF device tree. This has +meant that the various 32-bit \ppc embedded ports have required a +variety of hacks spread across the kernel to deal with the lack of +device tree. These vary from specialised boot wrappers to parse +parameters (which are at least reasonably localised) to +CONFIG-dependent hacks in drivers to override normal probe logic with +hardcoded addresses for a particular board. As well as being ugly of +itself, such CONFIG-dependent hacks make it hard to build a single +kernel image that supports multiple embedded machines. + +Until relatively recently, the only 64-bit \ppc machines without OF +were legacy (pre-POWER5\R) iSeries\R machines. iSeries machines often +only have virtual IO devices, which makes it quite simple to work +around the lack of a device tree. Even so, the lack means the iSeries +boot sequence must be quite different from the pSeries or Macintosh, +which is not ideal. + +The device tree also presents a problem for implementing \kexec. When +the kernel boots, it takes over full control of the system from OF, +even re-using OF's memory. So, when \kexec comes to boot another +kernel, OF is no longer around for the second kernel to query. + +\section{The Flattened Tree} + +In May 2005 \benh implemented a new approach to handling the device +tree that addresses all these problems. When booting on OF systems, +the first thing the kernel runs is a small piece of code in +\texttt{prom\_init.c}, which executes in the context of OF. This code +walks the device tree using OF calls, and transcribes it into a +compact, flattened format. The resulting device tree ``blob'' is then +passed to the kernel proper, which eventually unflattens the tree into +its runtime form. This blob is the only data communicated between the +\texttt{prom\_init.c} bootstrap and the rest of the kernel. + +When OF isn't available, either because the machine doesn't have it at +all or because \kexec has been used, the kernel instead starts +directly from the entry point taking a flattened device tree. The +device tree blob must be passed in from outside, rather than generated +by part of the kernel from OF. For \kexec, the userland +\texttt{kexec} tools build the blob from the runtime device tree +before invoking the new kernel. For embedded systems the blob can +come either from the embedded bootloader, or from a specialised +version of the \texttt{zImage} wrapper for the system in question. + +\subsection{Properties of the flattened tree} + +The flattened tree format should be easy to handle, both for the +kernel that parses it and the bootloader that generates it. In +particular, the following properties are desirable: + +\begin{itemize} +\item \emph{relocatable}: the bootloader or kernel should be able to + move the blob around as a whole, without needing to parse or adjust + its internals. In practice that means we must not use pointers + within the blob. +\item \emph{insert and delete}: sometimes the bootloader might want to + make tweaks to the flattened tree, such as deleting or inserting a + node (or whole subtree). It should be possible to do this without + having to effectively regenerate the whole flattened tree. In + practice this means limiting the use of internal offsets in the blob + that need recalculation if a section is inserted or removed with + \texttt{memmove()}. +\item \emph{compact}: embedded systems are frequently short of + resources, particularly RAM and flash memory space. Thus, the tree + representation should be kept as small as conveniently possible. +\end{itemize} + +\subsection{Format of the device tree blob} +\label{sec:format} + +\begin{figure}[htb!] + \centering + \footnotesize + \begin{tabular}{r|c|l} + \multicolumn{1}{r}{\textbf{Offset}}& \multicolumn{1}{c}{\textbf{Contents}} \\\cline{2-2} + \texttt{0x00} & \texttt{0xd00dfeed} & magic number \\\cline{2-2} + \texttt{0x04} & \emph{totalsize} \\\cline{2-2} + \texttt{0x08} & \emph{off\_struct} & \\\cline{2-2} + \texttt{0x0C} & \emph{off\_strs} & \\\cline{2-2} + \texttt{0x10} & \emph{off\_rsvmap} & \\\cline{2-2} + \texttt{0x14} & \emph{version} \\\cline{2-2} + \texttt{0x18} & \emph{last\_comp\_ver} & \\\cline{2-2} + \texttt{0x1C} & \emph{boot\_cpu\_id} & \tge v2 only\\\cline{2-2} + \texttt{0x20} & \emph{size\_strs} & \tge v3 only\\\cline{2-2} + \multicolumn{1}{r}{\vdots} & \multicolumn{1}{c}{\vdots} & \\\cline{2-2} + \emph{off\_rsvmap} & \emph{address0} & memory reserve \\ + + \texttt{0x04} & ...& table \\\cline{2-2} + + \texttt{0x08} & \emph{len0} & \\ + + \texttt{0x0C} & ...& \\\cline{2-2} + \vdots & \multicolumn{1}{c|}{\vdots} & \\\cline{2-2} + & \texttt{0x00000000}- & end marker\\ + & \texttt{00000000} & \\\cline{2-2} + & \texttt{0x00000000}- & \\ + & \texttt{00000000} & \\\cline{2-2} + \multicolumn{1}{r}{\vdots} & \multicolumn{1}{c}{\vdots} & \\\cline{2-2} + \emph{off\_strs} & \texttt{'n' 'a' 'm' 'e'} & strings block \\ + + \texttt{0x04} & \texttt{~0~ 'm' 'o' 'd'} & \\ + + \texttt{0x08} & \texttt{'e' 'l' ~0~ \makebox[\widthof{~~~}]{\textrm{...}}} & \\ + \vdots & \multicolumn{1}{c|}{\vdots} & \\\cline{2-2} + \multicolumn{1}{r}{+ \emph{size\_strs}} \\ + \multicolumn{1}{r}{\vdots} & \multicolumn{1}{c}{\vdots} & \\\cline{2-2} + \emph{off\_struct} & \dtbeginnode & structure block \\\cline{2-2} + + \texttt{0x04} & \texttt{'/' ~0~ ~0~ ~0~} & root node\\\cline{2-2} + + \texttt{0x08} & \dtprop & \\\cline{2-2} + + \texttt{0x0C} & \texttt{0x00000005} & ``\texttt{model}''\\\cline{2-2} + + \texttt{0x10} & \texttt{0x00000008} & \\\cline{2-2} + + \texttt{0x14} & \texttt{'M' 'y' 'B' 'o'} & \\ + + \texttt{0x18} & \texttt{'a' 'r' 'd' ~0~} & \\\cline{2-2} + \vdots & \multicolumn{1}{c|}{\vdots} & \\\cline{2-2} + & \texttt{\dtendnode} \\\cline{2-2} + & \texttt{\dtend} \\\cline{2-2} + \multicolumn{1}{r}{\vdots} & \multicolumn{1}{c}{\vdots} & \\\cline{2-2} + \multicolumn{1}{r}{\emph{totalsize}} \\ + \end{tabular} + \caption{Device tree blob layout} + \label{fig:blob-layout} +\end{figure} + +The format for the blob we devised, was first described on the +\texttt{linuxppc64-dev} mailing list in \cite{noof1}. The format has +since evolved through various revisions, and the current version is +included as part of the \dtc (see \S\ref{sec:dtc}) git tree, +\cite{dtcgit}. + +Figure \ref{fig:blob-layout} shows the layout of the blob of data +containing the device tree. It has three sections of variable size: +the \emph{memory reserve table}, the \emph{structure block} and the +\emph{strings block}. A small header gives the blob's size and +version and the locations of the three sections, plus a handful of +vital parameters used during early boot. + +The memory reserve map section gives a list of regions of memory that +the kernel must not use\footnote{Usually such ranges contain some data +structure initialised by the firmware that must be preserved by the +kernel.}. The list is represented as a simple array of (address, +size) pairs of 64 bit values, terminated by a zero size entry. The +strings block is similarly simple, consisting of a number of +null-terminated strings appended together, which are referenced from +the structure block as described below. + +The structure block contains the device tree proper. Each node is +introduced with a 32-bit \dtbeginnode tag, followed by the node's name +as a null-terminated string, padded to a 32-bit boundary. Then +follows all of the properties of the node, each introduced with a +\dtprop tag, then all of the node's subnodes, each introduced with +their own \dtbeginnode tag. The node ends with an \dtendnode tag, and +after the \dtendnode for the root node is an \dtend tag, indicating +the end of the whole tree\footnote{This is redundant, but included for +ease of parsing.}. The structure block starts with the \dtbeginnode +introducing the description of the root node (named \texttt{/}). + +Each property, after the \dtprop, has a 32-bit value giving an offset +from the beginning of the strings block at which the property name is +stored. Because it's common for many nodes to have properties with +the same name, this approach can substantially reduce the total size +of the blob. The name offset is followed by the length of the +property value (as a 32-bit value) and then the data itself padded to +a 32-bit boundary. + +\subsection{Contents of the tree} +\label{sec:treecontents} + +Having seen how to represent the device tree structure as a flattened +blob, what actually goes into the tree? The short answer is ``the +same as an OF tree''. On OF systems, the flattened tree is +transcribed directly from the OF device tree, so for simplicity we +also use OF conventions for the tree on other systems. + +In many cases a flat tree can be simpler than a typical OF provided +device tree. The flattened tree need only provide those nodes and +properties that the kernel actually requires; the flattened tree +generally need not include devices that the kernel can probe itself. +For example, an OF device tree would normally include nodes for each +PCI device on the system. A flattened tree need only include nodes +for the PCI host bridges; the kernel will scan the buses thus +described to find the subsidiary devices. The device tree can include +nodes for devices where the kernel needs extra information, though: +for example, for ISA devices on a subsidiary PCI/ISA bridge, or for +devices with unusual interrupt routing. + +Where they exist, we follow the IEEE1275 bindings that specify how to +describe various buses in the device tree (for example, +\cite{IEEE1275-pci} describe how to represent PCI devices). The +standard has not been updated for a long time, however, and lacks +bindings for many modern buses and devices. In particular, embedded +specific devices such as the various System-on-Chip buses are not +covered. We intend to create new bindings for such buses, in keeping +with the general conventions of IEEE1275 (a simple such binding for a +System-on-Chip bus was included in \cite{noof5} a revision of +\cite{noof1}). + +One complication arises for representing ``phandles'' in the flattened +tree. In OF, each node in the tree has an associated phandle, a +32-bit integer that uniquely identifies the node\footnote{In practice +usually implemented as a pointer or offset within OF memory.}. This +handle is used by the various OF calls to query and traverse the tree. +Sometimes phandles are also used within the tree to refer to other +nodes in the tree. For example, devices that produce interrupts +generally have an \texttt{interrupt-parent} property giving the +phandle of the interrupt controller that handles interrupts from this +device. Parsing these and other interrupt related properties allows +the kernel to build a complete representation of the system's +interrupt tree, which can be quite different from the tree of bus +connections. + +In the flattened tree, a node's phandle is represented by a special +\phandle property. When the kernel generates a flattened tree from +OF, it adds a \phandle property to each node, containing the phandle +retrieved from OF. When the tree is generated without OF, however, +only nodes that are actually referred to by phandle need to have this +property. + +Another complication arises because nodes in an OF tree have two +names. First they have the ``unit name'', which is how the node is +referred to in an OF path. The unit name generally consists of a +device type followed by an \texttt{@} followed by a \emph{unit +address}. For example \texttt{/memory@0} is the full path of a memory +node at address 0, \texttt{/ht@0,f2000000/pci@1} is the path of a PCI +bus node, which is under a HyperTransport\tm bus node. The form of +the unit address is bus dependent, but is generally derived from the +node's \texttt{reg} property. In addition, nodes have a property, +\texttt{name}, whose value is usually equal to the first path of the +unit name. For example, the nodes in the previous example would have +\texttt{name} properties equal to \texttt{memory} and \texttt{pci}, +respectively. To save space in the blob, the current version of the +flattened tree format only requires the unit names to be present. +When the kernel unflattens the tree, it automatically generates a +\texttt{name} property from the node's path name. + +\section{The Device Tree Compiler} +\label{sec:dtc} + +\begin{figure}[htb!] + \centering + \begin{lstlisting}[frame=single,basicstyle=\footnotesize\ttfamily, + tabsize=3,numbers=left,xleftmargin=2em] +/memreserve/ 0x20000000-0x21FFFFFF; + +/ { + model = "MyBoard"; + compatible = "MyBoardFamily"; + #address-cells = <2>; + #size-cells = <2>; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + PowerPC,970@0 { + device_type = "cpu"; + reg = <0>; + clock-frequency = <5f5e1000>; + timebase-frequency = <1FCA055>; + linux,boot-cpu; + i-cache-size = <10000>; + d-cache-size = <8000>; + }; + }; + + memory@0 { + device_type = "memory"; + memreg: reg = <00000000 00000000 + 00000000 20000000>; + }; + + mpic@0x3fffdd08400 { + /* Interrupt controller */ + /* ... */ + }; + + pci@40000000000000 { + /* PCI host bridge */ + /* ... */ + }; + + chosen { + bootargs = "root=/dev/sda2"; + linux,platform = <00000600>; + interrupt-controller = + < &/mpic@0x3fffdd08400 >; + }; +}; +\end{lstlisting} + \caption{Example \dtc source} + \label{fig:dts} +\end{figure} + +As we've seen, the flattened device tree format provides a convenient +way of communicating device tree information to the kernel. It's +simple for the kernel to parse, and simple for bootloaders to +manipulate. On OF systems, it's easy to generate the flattened tree +by walking the OF maintained tree. However, for embedded systems, the +flattened tree must be generated from scratch. + +Embedded bootloaders are generally built for a particular board. So, +it's usually possible to build the device tree blob at compile time +and include it in the bootloader image. For minor revisions of the +board, the bootloader can contain code to make the necessary tweaks to +the tree before passing it to the booted kernel. + +The device trees for embedded boards are usually quite simple, and +it's possible to hand construct the necessary blob by hand, but doing +so is tedious. The ``device tree compiler'', \dtc{}\footnote{\dtc can +be obtained from \cite{dtcgit}.}, is designed to make creating device +tree blobs easier by converting a text representation of the tree +into the necessary blob. + +\subsection{Input and output formats} + +As well as the normal mode of compiling a device tree blob from text +source, \dtc can convert a device tree between a number of +representations. It can take its input in one of three different +formats: +\begin{itemize} +\item source, the normal case. The device tree is described in a text + form, described in \S\ref{sec:dts}. +\item blob (\texttt{dtb}), the flattened tree format described in + \S\ref{sec:format}. This mode is useful for checking a pre-existing + device tree blob. +\item filesystem (\texttt{fs}), input is a directory tree in the + layout of \texttt{/proc/device-tree} (roughly, a directory for each + node in the device tree, a file for each property). This is useful + for building a blob for the device tree in use by the currently + running kernel. +\end{itemize} + +In addition, \dtc can output the tree in one of three different +formats: +\begin{itemize} +\item blob (\texttt{dtb}), as in \S\ref{sec:format}. The most + straightforward use of \dtc is to compile from ``source'' to + ``blob'' format. +\item source (\texttt{dts}), as in \S\ref{sec:dts}. If used with blob + input, this allows \dtc to act as a ``decompiler''. +\item assembler source (\texttt{asm}). \dtc can produce an assembler + file, which will assemble into a \texttt{.o} file containing the + device tree blob, with symbols giving the beginning of the blob and + its various subsections. This can then be linked directly into a + bootloader or firmware image. +\end{itemize} + +For maximum applicability, \dtc can both read and write any of the +existing revisions of the blob format. When reading, \dtc takes the +version from the blob header, and when writing it takes a command line +option specifying the desired version. It automatically makes any +necessary adjustments to the tree that are necessary for the specified +version. For example, formats before 0x10 require each node to have +an explicit \texttt{name} property. When \dtc creates such a blob, it +will automatically generate \texttt{name} properties from the unit +names. + +\subsection{Source format} +\label{sec:dts} + +The ``source'' format for \dtc is a text description of the device +tree in a vaguely C-like form. Figure \ref{fig:dts} shows an +example. The file starts with \texttt{/memreserve/} directives, which +gives address ranges to add to the output blob's memory reserve table, +then the device tree proper is described. + +Nodes of the tree are introduced with the node name, followed by a +\texttt{\{} ... \texttt{\};} block containing the node's properties +and subnodes. Properties are given as just {\emph{name} \texttt{=} + \emph{value}\texttt{;}}. The property values can be given in any +of three forms: +\begin{itemize} +\item \emph{string} (for example, \texttt{"MyBoard"}). The property + value is the given string, including terminating NULL. C-style + escapes (\verb+\t+, \verb+\n+, \verb+\0+ and so forth) are allowed. +\item \emph{cells} (for example, \texttt{<0 8000 f0000000>}). The + property value is made up of a list of 32-bit ``cells'', each given + as a hex value. +\item \emph{bytestring} (for example, \texttt{[1234abcdef]}). The + property value is given as a hex bytestring. +\end{itemize} + +Cell properties can also contain \emph{references}. Instead of a hex +number, the source can give an ampersand (\texttt{\&}) followed by the +full path to some node in the tree. For example, in Figure +\ref{fig:dts}, the \texttt{/chosen} node has an +\texttt{interrupt-controller} property referring to the interrupt +controller described by the node \texttt{/mpic@0x3fffdd08400}. In the +output tree, the value of the referenced node's phandle is included in +the property. If that node doesn't have an explicit phandle property, +\dtc will automatically create a unique phandle for it. This approach +makes it easy to create interrupt trees without having to explicitly +assign and remember phandles for the various interrupt controller +nodes. + +The \dtc source can also include ``labels'', which are placed on a +particular node or property. For example, Figure \ref{fig:dts} has a +label ``\texttt{memreg}'' on the \texttt{reg} property of the node +\texttt{/memory@0}. When using assembler output, corresponding labels +in the output are generated, which will assemble into symbols +addressing the part of the blob with the node or property in question. +This is useful for the common case where an embedded board has an +essentially fixed device tree with a few variable properties, such as +the size of memory. The bootloader for such a board can have a device +tree linked in, including a symbol referring to the right place in the +blob to update the parameter with the correct value determined at +runtime. + +\subsection{Tree checking} + +Between reading in the device tree and writing it out in the new +format, \dtc performs a number of checks on the tree: +\begin{itemize} +\item \emph{syntactic structure}: \dtc checks that node and property + names contain only allowed characters and meet length restrictions. + It checks that a node does not have multiple properties or subnodes + with the same name. +\item \emph{semantic structure}: In some cases, \dtc checks that + properties whose contents are defined by convention have appropriate + values. For example, it checks that \texttt{reg} properties have a + length that makes sense given the address forms specified by the + \texttt{\#address-cells} and \texttt{\#size-cells} properties. It + checks that properties such as \texttt{interrupt-parent} contain a + valid phandle. +\item \emph{Linux requirements}: \dtc checks that the device tree + contains those nodes and properties that are required by the Linux + kernel to boot correctly. +\end{itemize} + +These checks are useful to catch simple problems with the device tree, +rather than having to debug the results on an embedded kernel. With +the blob input mode, it can also be used for diagnosing problems with +an existing blob. + +\section{Future Work} + +\subsection{Board ports} + +The flattened device tree has always been the only supported way to +boot a \texttt{ppc64} kernel on an embedded system. With the merge of +\texttt{ppc32} and \texttt{ppc64} code it has also become the only +supported way to boot any merged \texttt{powerpc} kernel, 32-bit or +64-bit. In fact, the old \texttt{ppc} architecture exists mainly just +to support the old ppc32 embedded ports that have not been migrated +to the flattened device tree approach. We plan to remove the +\texttt{ppc} architecture eventually, which will mean porting all the +various embedded boards to use the flattened device tree. + +\subsection{\dtc features} + +While it is already quite usable, there are a number of extra features +that \dtc could include to make creating device trees more convenient: +\begin{itemize} +\item \emph{better tree checking}: Although \dtc already performs a + number of checks on the device tree, they are rather haphazard. In + many cases \dtc will give up after detecting a minor error early and + won't pick up more interesting errors later on. There is a + \texttt{-f} parameter that forces \dtc to generate an output tree + even if there are errors. At present, this needs to be used more + often than one might hope, because \dtc is bad at deciding which + errors should really be fatal, and which rate mere warnings. +\item \emph{binary include}: Occasionally, it is useful for the device + tree to incorporate as a property a block of binary data for some + board-specific purpose. For example, many of Apple's device trees + incorporate bytecode drivers for certain platform devices. \dtc's + source format ought to allow this by letting a property's value be + read directly from a binary file. +\item \emph{macros}: it might be useful for \dtc to implement some + sort of macros so that a tree containing a number of similar devices + (for example, multiple identical ethernet controllers or PCI buses) + can be written more quickly. At present, this can be accomplished + in part by running the source file through CPP before compiling with + \dtc. It's not clear whether ``native'' support for macros would be + more useful. +\end{itemize} + +\bibliographystyle{amsplain} +\bibliography{dtc-paper} + +\section*{About the authors} + +David Gibson has been a member of the IBM Linux Technology Center, +working from Canberra, Australia, since 2001. Recently he has worked +on Linux hugepage support and performance counter support for ppc64, +as well as the device tree compiler. In the past, he has worked on +bringup for various ppc and ppc64 embedded systems, the orinoco +wireless driver, ramfs, and a userspace checkpointing system +(\texttt{esky}). + +Benjamin Herrenschmidt was a MacOS developer for about 10 years, but +ultimately saw the light and installed Linux on his Apple PowerPC +machine. After writing a bootloader, BootX, for it in 1998, he +started contributing to the PowerPC Linux port in various areas, +mostly around the support for Apple machines. He became official +PowerMac maintainer in 2001. In 2003, he joined the IBM Linux +Technology Center in Canberra, Australia, where he ported the 64 bit +PowerPC kernel to Apple G5 machines and the Maple embedded board, +among others things. He's a member of the ppc64 development ``team'' +and one of his current goals is to make the integration of embedded +platforms smoother and more maintainable than in the 32-bit PowerPC +kernel. + +\section*{Legal Statement} + +This work represents the view of the author and does not necessarily +represent the view of IBM. + +IBM, \ppc, \ppc Architecture, POWER5, pSeries and iSeries are +trademarks or registered trademarks of International Business Machines +Corporation in the United States and/or other countries. + +Apple and Power Macintosh are a registered trademarks of Apple +Computer Inc. in the United States, other countries, or both. + +Linux is a registered trademark of Linus Torvalds. + +Other company, product, and service names may be trademarks or service +marks of others. + +\end{document} diff --git a/contrib/dtc/Documentation/dts-format.txt b/contrib/dtc/Documentation/dts-format.txt new file mode 100644 index 000000000000..a655b8769d3b --- /dev/null +++ b/contrib/dtc/Documentation/dts-format.txt @@ -0,0 +1,110 @@ +Device Tree Source Format (version 1) +===================================== + +The Device Tree Source (DTS) format is a textual representation of a +device tree in a form that can be processed by dtc into a binary +device tree in the form expected by the kernel. The description below +is not a formal syntax definition of DTS, but describes the basic +constructs used to represent device trees. + +Node and property definitions +----------------------------- + +Device tree nodes are defined with a node name and unit address with +braces marking the start and end of the node definition. They may be +preceded by a label. + + [label:] node-name[@unit-address] { + [properties definitions] + [child nodes] + } + +Nodes may contain property definitions and/or child node +definitions. If both are present, properties must come before child +nodes. + +Property definitions are name value pairs in the form: + [label:] property-name = value; +except for properties with empty (zero length) value which have the +form: + [label:] property-name; + +Property values may be defined as an array of 32-bit integer cells, as +NUL-terminated strings, as bytestrings or a combination of these. + +* Arrays of cells are represented by angle brackets surrounding a + space separated list of C-style integers + + e.g. interrupts = <17 0xc>; + +* A 64-bit value is represented with two 32-bit cells. + + e.g. clock-frequency = <0x00000001 0x00000000>; + +* A NUL-terminated string value is represented using double quotes + (the property value is considered to include the terminating NUL + character). + + e.g. compatible = "simple-bus"; + +* A bytestring is enclosed in square brackets [] with each byte + represented by two hexadecimal digits. Spaces between each byte are + optional. + + e.g. local-mac-address = [00 00 12 34 56 78]; or equivalently + local-mac-address = [000012345678]; + +* Values may have several comma-separated components, which are + concatenated together. + e.g. compatible = "ns16550", "ns8250"; + example = <0xf00f0000 19>, "a strange property format"; + +* In a cell array a reference to another node will be expanded to that + node's phandle. References may by '&' followed by a node's label: + e.g. interrupt-parent = < &mpic >; + or they may be '&' followed by a node's full path in braces: + e.g. interrupt-parent = < &{/soc/interrupt-controller@40000} >; + +* Outside a cell array, a reference to another node will be expanded + to that node's full path. + e.g. ethernet0 = &EMAC0; + +* Labels may also appear before or after any component of a property + value, or between cells of a cell array, or between bytes of a + bytestring. + e.g. reg = reglabel: <0 sizelabel: 0x1000000>; + e.g. prop = [ab cd ef byte4: 00 ff fe]; + e.g. str = start: "string value" end: ; + + +File layout +----------- + +Version 1 DTS files have the overall layout: + /dts-v1/; + + [memory reservations] + + / { + [property definitions] + [child nodes] + }; + +* The "/dts-v1/;" must be present to identify the file as a version 1 + DTS (dts files without this tag will be treated by dtc as being in + the obsolete "version 0", which uses a different format for integers + amongst other small but incompatible changes). + +* Memory reservations define an entry for the device tree blob's + memory reservation table. They have the form: + e.g. /memreserve/

; + Where
and are 64-bit C-style integers. + +* The / { ... }; section defines the root node of the device tree. + +* C style (/* ... */) and C++ style (// ...) comments are supported. + + + + -- David Gibson + -- Yoder Stuart diff --git a/contrib/dtc/Documentation/manual.txt b/contrib/dtc/Documentation/manual.txt new file mode 100644 index 000000000000..f8a8a7b482e3 --- /dev/null +++ b/contrib/dtc/Documentation/manual.txt @@ -0,0 +1,652 @@ +Device Tree Compiler Manual +=========================== + +I - "dtc", the device tree compiler + 1) Obtaining Sources + 2) Description + 3) Command Line + 4) Source File + 4.1) Overview + 4.2) Properties + 4.3) Labels and References + +II - The DT block format + 1) Header + 2) Device tree generalities + 3) Device tree "structure" block + 4) Device tree "strings" block + + +III - libfdt + +IV - Utility Tools + 1) convert-dtsv0 -- Conversion to Version 1 + 1) ftdump + + +I - "dtc", the device tree compiler +=================================== + +1) Sources + +Source code for the Device Tree Compiler can be found at jdl.com. +The gitweb interface is: + + http://git.jdl.com/gitweb/ + +The repository is here: + + git://www.jdl.com/software/dtc.git + http://www.jdl.com/software/dtc.git + +Tarballs of the 1.0.0 and latest releases are here: + + http://www.jdl.com/software/dtc-v1.2.0.tgz + http://www.jdl.com/software/dtc-latest.tgz + + +2) Description + +The Device Tree Compiler, dtc, takes as input a device-tree in +a given format and outputs a device-tree in another format. +Typically, the input format is "dts", a human readable source +format, and creates a "dtb", or binary format as output. + +The currently supported Input Formats are: + + - "dtb": "blob" format. A flattened device-tree block with + header in one binary blob. + + - "dts": "source" format. A text file containing a "source" + for a device-tree. + + - "fs" format. A representation equivalent to the output of + /proc/device-tree where nodes are directories and + properties are files. + +The currently supported Output Formats are: + + - "dtb": "blob" format + + - "dts": "source" format + + - "asm": assembly language file. A file that can be sourced + by gas to generate a device-tree "blob". That file can + then simply be added to your Makefile. Additionally, the + assembly file exports some symbols that can be used. + + +3) Command Line + +The syntax of the dtc command line is: + + dtc [options] [] + +Options: + + + The name of the input source file. If no + or "-" is given, stdin is used. + + -b + Set the physical boot cpu. + + -f + Force. Try to produce output even if the input tree has errors. + + -h + Emit a brief usage and help message. + + -I + The source input format, as listed above. + + -o + The name of the generated output file. Use "-" for stdout. + + -O + The generated output format, as listed above. + + -q + Quiet: -q suppress warnings, -qq errors, -qqq all + + -R + Make space for reserve map entries + Relevant for dtb and asm output only. + + -S + Ensure the blob at least long, adding additional + space if needed. + + -v + Print DTC version and exit. + + -V + Generate output conforming to the given . + By default the most recent version is generated. + Relevant for dtb and asm output only. + + +The defines what version of the "blob" format will be +generated. Supported versions are 1, 2, 3, 16 and 17. The default is +always the most recent version and is likely the highest number. + +Additionally, dtc performs various sanity checks on the tree. + + +4) Device Tree Source file + +4.1) Overview + +Here is a very rough overview of the layout of a DTS source file: + + + sourcefile: list_of_memreserve devicetree + + memreserve: label 'memreserve' ADDR ADDR ';' + | label 'memreserve' ADDR '-' ADDR ';' + + devicetree: '/' nodedef + + nodedef: '{' list_of_property list_of_subnode '}' ';' + + property: label PROPNAME '=' propdata ';' + + propdata: STRING + | '<' list_of_cells '>' + | '[' list_of_bytes ']' + + subnode: label nodename nodedef + +That structure forms a hierarchical layout of nodes and properties +rooted at an initial node as: + + / { + } + +Both classic C style and C++ style comments are supported. + +Source files may be directly included using the syntax: + + /include/ "filename" + + +4.2) Properties + +Properties are named, possibly labeled, values. Each value +is one of: + + - A null-teminated C-like string, + - A numeric value fitting in 32 bits, + - A list of 32-bit values + - A byte sequence + +Here are some example property definitions: + + - A property containing a 0 terminated string + + property1 = "string_value"; + + - A property containing a numerical 32-bit hexadecimal value + + property2 = <1234abcd>; + + - A property containing 3 numerical 32-bit hexadecimal values + + property3 = <12345678 12345678 deadbeef>; + + - A property whose content is an arbitrary array of bytes + + property4 = [0a 0b 0c 0d de ea ad be ef]; + + +Node may contain sub-nodes to obtain a hierarchical structure. +For example: + + - A child node named "childnode" whose unit name is + "childnode at address". It it turn has a string property + called "childprop". + + childnode@addresss { + childprop = "hello\n"; + }; + + +By default, all numeric values are hexadecimal. Alternate bases +may be specified using a prefix "d#" for decimal, "b#" for binary, +and "o#" for octal. + +Strings support common escape sequences from C: "\n", "\t", "\r", +"\(octal value)", "\x(hex value)". + + +4.3) Labels and References + +Labels may be applied to nodes or properties. Labels appear +before a node name, and are referenced using an ampersand: &label. +Absolute node path names are also allowed in node references. + +In this exmaple, a node is labled "mpic" and then referenced: + + mpic: interrupt-controller@40000 { + ... + }; + + ethernet-phy@3 { + interrupt-parent = <&mpic>; + ... + }; + +And used in properties, lables may appear before or after any value: + + randomnode { + prop: string = data: "mystring\n" data_end: ; + ... + }; + + + +II - The DT block format +======================== + +This chapter defines the format of the flattened device-tree +passed to the kernel. The actual content of the device tree +are described in the kernel documentation in the file + + linux-2.6/Documentation/powerpc/booting-without-of.txt + +You can find example of code manipulating that format within +the kernel. For example, the file: + + including arch/powerpc/kernel/prom_init.c + +will generate a flattened device-tree from the Open Firmware +representation. Other utilities such as fs2dt, which is part of +the kexec tools, will generate one from a filesystem representation. +Some bootloaders such as U-Boot provide a bit more support by +using the libfdt code. + +For booting the kernel, the device tree block has to be in main memory. +It has to be accessible in both real mode and virtual mode with no +mapping other than main memory. If you are writing a simple flash +bootloader, it should copy the block to RAM before passing it to +the kernel. + + +1) Header +--------- + +The kernel is entered with r3 pointing to an area of memory that is +roughly described in include/asm-powerpc/prom.h by the structure +boot_param_header: + + struct boot_param_header { + u32 magic; /* magic word OF_DT_HEADER */ + u32 totalsize; /* total size of DT block */ + u32 off_dt_struct; /* offset to structure */ + u32 off_dt_strings; /* offset to strings */ + u32 off_mem_rsvmap; /* offset to memory reserve map */ + u32 version; /* format version */ + u32 last_comp_version; /* last compatible version */ + + /* version 2 fields below */ + u32 boot_cpuid_phys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + u32 size_dt_strings; /* size of the strings block */ + + /* version 17 fields below */ + u32 size_dt_struct; /* size of the DT structure block */ + }; + +Along with the constants: + + /* Definitions used by the flattened device tree */ + #define OF_DT_HEADER 0xd00dfeed /* 4: version, + 4: total size */ + #define OF_DT_BEGIN_NODE 0x1 /* Start node: full name + */ + #define OF_DT_END_NODE 0x2 /* End node */ + #define OF_DT_PROP 0x3 /* Property: name off, + size, content */ + #define OF_DT_END 0x9 + +All values in this header are in big endian format, the various +fields in this header are defined more precisely below. All "offset" +values are in bytes from the start of the header; that is from the +value of r3. + + - magic + + This is a magic value that "marks" the beginning of the + device-tree block header. It contains the value 0xd00dfeed and is + defined by the constant OF_DT_HEADER + + - totalsize + + This is the total size of the DT block including the header. The + "DT" block should enclose all data structures defined in this + chapter (who are pointed to by offsets in this header). That is, + the device-tree structure, strings, and the memory reserve map. + + - off_dt_struct + + This is an offset from the beginning of the header to the start + of the "structure" part the device tree. (see 2) device tree) + + - off_dt_strings + + This is an offset from the beginning of the header to the start + of the "strings" part of the device-tree + + - off_mem_rsvmap + + This is an offset from the beginning of the header to the start + of the reserved memory map. This map is a list of pairs of 64- + bit integers. Each pair is a physical address and a size. The + list is terminated by an entry of size 0. This map provides the + kernel with a list of physical memory areas that are "reserved" + and thus not to be used for memory allocations, especially during + early initialization. The kernel needs to allocate memory during + boot for things like un-flattening the device-tree, allocating an + MMU hash table, etc... Those allocations must be done in such a + way to avoid overriding critical things like, on Open Firmware + capable machines, the RTAS instance, or on some pSeries, the TCE + tables used for the iommu. Typically, the reserve map should + contain _at least_ this DT block itself (header,total_size). If + you are passing an initrd to the kernel, you should reserve it as + well. You do not need to reserve the kernel image itself. The map + should be 64-bit aligned. + + - version + + This is the version of this structure. Version 1 stops + here. Version 2 adds an additional field boot_cpuid_phys. + Version 3 adds the size of the strings block, allowing the kernel + to reallocate it easily at boot and free up the unused flattened + structure after expansion. Version 16 introduces a new more + "compact" format for the tree itself that is however not backward + compatible. Version 17 adds an additional field, size_dt_struct, + allowing it to be reallocated or moved more easily (this is + particularly useful for bootloaders which need to make + adjustments to a device tree based on probed information). You + should always generate a structure of the highest version defined + at the time of your implementation. Currently that is version 17, + unless you explicitly aim at being backward compatible. + + - last_comp_version + + Last compatible version. This indicates down to what version of + the DT block you are backward compatible. For example, version 2 + is backward compatible with version 1 (that is, a kernel build + for version 1 will be able to boot with a version 2 format). You + should put a 1 in this field if you generate a device tree of + version 1 to 3, or 16 if you generate a tree of version 16 or 17 + using the new unit name format. + + - boot_cpuid_phys + + This field only exist on version 2 headers. It indicate which + physical CPU ID is calling the kernel entry point. This is used, + among others, by kexec. If you are on an SMP system, this value + should match the content of the "reg" property of the CPU node in + the device-tree corresponding to the CPU calling the kernel entry + point (see further chapters for more informations on the required + device-tree contents) + + - size_dt_strings + + This field only exists on version 3 and later headers. It + gives the size of the "strings" section of the device tree (which + starts at the offset given by off_dt_strings). + + - size_dt_struct + + This field only exists on version 17 and later headers. It gives + the size of the "structure" section of the device tree (which + starts at the offset given by off_dt_struct). + +So the typical layout of a DT block (though the various parts don't +need to be in that order) looks like this (addresses go from top to +bottom): + + ------------------------------ + r3 -> | struct boot_param_header | + ------------------------------ + | (alignment gap) (*) | + ------------------------------ + | memory reserve map | + ------------------------------ + | (alignment gap) | + ------------------------------ + | | + | device-tree structure | + | | + ------------------------------ + | (alignment gap) | + ------------------------------ + | | + | device-tree strings | + | | + -----> ------------------------------ + | + | + --- (r3 + totalsize) + + (*) The alignment gaps are not necessarily present; their presence + and size are dependent on the various alignment requirements of + the individual data blocks. + + +2) Device tree generalities +--------------------------- + +This device-tree itself is separated in two different blocks, a +structure block and a strings block. Both need to be aligned to a 4 +byte boundary. + +First, let's quickly describe the device-tree concept before detailing +the storage format. This chapter does _not_ describe the detail of the +required types of nodes & properties for the kernel, this is done +later in chapter III. + +The device-tree layout is strongly inherited from the definition of +the Open Firmware IEEE 1275 device-tree. It's basically a tree of +nodes, each node having two or more named properties. A property can +have a value or not. + +It is a tree, so each node has one and only one parent except for the +root node who has no parent. + +A node has 2 names. The actual node name is generally contained in a +property of type "name" in the node property list whose value is a +zero terminated string and is mandatory for version 1 to 3 of the +format definition (as it is in Open Firmware). Version 16 makes it +optional as it can generate it from the unit name defined below. + +There is also a "unit name" that is used to differentiate nodes with +the same name at the same level, it is usually made of the node +names, the "@" sign, and a "unit address", which definition is +specific to the bus type the node sits on. + +The unit name doesn't exist as a property per-se but is included in +the device-tree structure. It is typically used to represent "path" in +the device-tree. More details about the actual format of these will be +below. + +The kernel powerpc generic code does not make any formal use of the +unit address (though some board support code may do) so the only real +requirement here for the unit address is to ensure uniqueness of +the node unit name at a given level of the tree. Nodes with no notion +of address and no possible sibling of the same name (like /memory or +/cpus) may omit the unit address in the context of this specification, +or use the "@0" default unit address. The unit name is used to define +a node "full path", which is the concatenation of all parent node +unit names separated with "/". + +The root node doesn't have a defined name, and isn't required to have +a name property either if you are using version 3 or earlier of the +format. It also has no unit address (no @ symbol followed by a unit +address). The root node unit name is thus an empty string. The full +path to the root node is "/". + +Every node which actually represents an actual device (that is, a node +which isn't only a virtual "container" for more nodes, like "/cpus" +is) is also required to have a "device_type" property indicating the +type of node . + +Finally, every node that can be referenced from a property in another +node is required to have a "linux,phandle" property. Real open +firmware implementations provide a unique "phandle" value for every +node that the "prom_init()" trampoline code turns into +"linux,phandle" properties. However, this is made optional if the +flattened device tree is used directly. An example of a node +referencing another node via "phandle" is when laying out the +interrupt tree which will be described in a further version of this +document. + +This "linux, phandle" property is a 32-bit value that uniquely +identifies a node. You are free to use whatever values or system of +values, internal pointers, or whatever to generate these, the only +requirement is that every node for which you provide that property has +a unique value for it. + +Here is an example of a simple device-tree. In this example, an "o" +designates a node followed by the node unit name. Properties are +presented with their name followed by their content. "content" +represents an ASCII string (zero terminated) value, while +represents a 32-bit hexadecimal value. The various nodes in this +example will be discussed in a later chapter. At this point, it is +only meant to give you a idea of what a device-tree looks like. I have +purposefully kept the "name" and "linux,phandle" properties which +aren't necessary in order to give you a better idea of what the tree +looks like in practice. + + / o device-tree + |- name = "device-tree" + |- model = "MyBoardName" + |- compatible = "MyBoardFamilyName" + |- #address-cells = <2> + |- #size-cells = <2> + |- linux,phandle = <0> + | + o cpus + | | - name = "cpus" + | | - linux,phandle = <1> + | | - #address-cells = <1> + | | - #size-cells = <0> + | | + | o PowerPC,970@0 + | |- name = "PowerPC,970" + | |- device_type = "cpu" + | |- reg = <0> + | |- clock-frequency = <5f5e1000> + | |- 64-bit + | |- linux,phandle = <2> + | + o memory@0 + | |- name = "memory" + | |- device_type = "memory" + | |- reg = <00000000 00000000 00000000 20000000> + | |- linux,phandle = <3> + | + o chosen + |- name = "chosen" + |- bootargs = "root=/dev/sda2" + |- linux,phandle = <4> + +This tree is almost a minimal tree. It pretty much contains the +minimal set of required nodes and properties to boot a linux kernel; +that is, some basic model informations at the root, the CPUs, and the +physical memory layout. It also includes misc information passed +through /chosen, like in this example, the platform type (mandatory) +and the kernel command line arguments (optional). + +The /cpus/PowerPC,970@0/64-bit property is an example of a +property without a value. All other properties have a value. The +significance of the #address-cells and #size-cells properties will be +explained in chapter IV which defines precisely the required nodes and +properties and their content. + + +3) Device tree "structure" block + +The structure of the device tree is a linearized tree structure. The +"OF_DT_BEGIN_NODE" token starts a new node, and the "OF_DT_END_NODE" +ends that node definition. Child nodes are simply defined before +"OF_DT_END_NODE" (that is nodes within the node). A 'token' is a 32 +bit value. The tree has to be "finished" with a OF_DT_END token + +Here's the basic structure of a single node: + + * token OF_DT_BEGIN_NODE (that is 0x00000001) + * for version 1 to 3, this is the node full path as a zero + terminated string, starting with "/". For version 16 and later, + this is the node unit name only (or an empty string for the + root node) + * [align gap to next 4 bytes boundary] + * for each property: + * token OF_DT_PROP (that is 0x00000003) + * 32-bit value of property value size in bytes (or 0 if no + value) + * 32-bit value of offset in string block of property name + * property value data if any + * [align gap to next 4 bytes boundary] + * [child nodes if any] + * token OF_DT_END_NODE (that is 0x00000002) + +So the node content can be summarized as a start token, a full path, +a list of properties, a list of child nodes, and an end token. Every +child node is a full node structure itself as defined above. + +NOTE: The above definition requires that all property definitions for +a particular node MUST precede any subnode definitions for that node. +Although the structure would not be ambiguous if properties and +subnodes were intermingled, the kernel parser requires that the +properties come first (up until at least 2.6.22). Any tools +manipulating a flattened tree must take care to preserve this +constraint. + +4) Device tree "strings" block + +In order to save space, property names, which are generally redundant, +are stored separately in the "strings" block. This block is simply the +whole bunch of zero terminated strings for all property names +concatenated together. The device-tree property definitions in the +structure block will contain offset values from the beginning of the +strings block. + + +III - libfdt +============ + +This library should be merged into dtc proper. +This library should likely be worked into U-Boot and the kernel. + + +IV - Utility Tools +================== + +1) convert-dtsv0 -- Conversion to Version 1 + +convert-dtsv0 is a small utility program which converts (DTS) +Device Tree Source from the obsolete version 0 to version 1. + +Version 1 DTS files are marked by line "/dts-v1/;" at the top of the file. + +The syntax of the convert-dtsv0 command line is: + + convert-dtsv0 [] + +Each file passed will be converted to the new /dts-v1/ version by creating +a new file with a "v1" appended the filename. + +Comments, empty lines, etc. are preserved. + + +2) ftdump -- Flat Tree dumping utility + +The ftdump program prints a readable version of a flat device tree file. + +The syntax of the ftdump command line is: + + ftdump diff --git a/contrib/dtc/GPL b/contrib/dtc/GPL new file mode 100644 index 000000000000..d60c31a97a54 --- /dev/null +++ b/contrib/dtc/GPL @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/contrib/dtc/Makefile b/contrib/dtc/Makefile new file mode 100644 index 000000000000..d7549b22c6b3 --- /dev/null +++ b/contrib/dtc/Makefile @@ -0,0 +1,245 @@ +# +# Device Tree Compiler +# + +# +# Version information will be constructed in this order: +# EXTRAVERSION might be "-rc", for example. +# LOCAL_VERSION is likely from command line. +# CONFIG_LOCALVERSION from some future config system. +# +VERSION = 1 +PATCHLEVEL = 2 +SUBLEVEL = 0 +EXTRAVERSION = +LOCAL_VERSION = +CONFIG_LOCALVERSION = + +CPPFLAGS = -I libfdt +CFLAGS = -Wall -g -Os -fPIC -Wpointer-arith -Wcast-qual + +BISON = bison +LEX = flex + +INSTALL = /usr/bin/install +DESTDIR = +PREFIX = $(HOME) +BINDIR = $(PREFIX)/bin +LIBDIR = $(PREFIX)/lib +INCLUDEDIR = $(PREFIX)/include + +HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \ + sed -e 's/\(cygwin\).*/cygwin/') + +ifeq ($(HOSTOS),darwin) +SHAREDLIB_EXT=dylib +SHAREDLIB_LINK_OPTIONS=-dynamiclib -Wl,-install_name -Wl, +else +SHAREDLIB_EXT=so +SHAREDLIB_LINK_OPTIONS=-shared -Wl,--version-script=$(LIBFDT_version) -Wl,-soname, +endif + +# +# Overall rules +# +ifdef V +VECHO = : +else +VECHO = echo " " +ARFLAGS = rc +.SILENT: +endif + +NODEPTARGETS = clean +ifeq ($(MAKECMDGOALS),) +DEPTARGETS = all +else +DEPTARGETS = $(filter-out $(NODEPTARGETS),$(MAKECMDGOALS)) +endif + +# +# Rules for versioning +# + +DTC_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) +VERSION_FILE = version_gen.h + +CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ + else if [ -x /bin/bash ]; then echo /bin/bash; \ + else echo sh; fi ; fi) + +nullstring := +space := $(nullstring) # end of line + +localver_config = $(subst $(space),, $(string) \ + $(patsubst "%",%,$(CONFIG_LOCALVERSION))) + +localver_cmd = $(subst $(space),, $(string) \ + $(patsubst "%",%,$(LOCALVERSION))) + +localver_scm = $(shell $(CONFIG_SHELL) ./scripts/setlocalversion) +localver_full = $(localver_config)$(localver_cmd)$(localver_scm) + +dtc_version = $(DTC_VERSION)$(localver_full) + +# Contents of the generated version file. +define filechk_version + (echo "#define DTC_VERSION \"DTC $(dtc_version)\""; ) +endef + +define filechk + set -e; \ + echo ' CHK $@'; \ + mkdir -p $(dir $@); \ + $(filechk_$(1)) < $< > $@.tmp; \ + if [ -r $@ ] && cmp -s $@ $@.tmp; then \ + rm -f $@.tmp; \ + else \ + echo ' UPD $@'; \ + mv -f $@.tmp $@; \ + fi; +endef + + +include Makefile.convert-dtsv0 +include Makefile.dtc +include Makefile.ftdump + +BIN += convert-dtsv0 +BIN += dtc +BIN += ftdump + + +all: $(BIN) libfdt + + +ifneq ($(DEPTARGETS),) +-include $(DTC_OBJS:%.o=%.d) +-include $(CONVERT_OBJS:%.o=%.d) +-include $(FTDUMP_OBJS:%.o=%.d) +endif + + + +# +# Rules for libfdt +# +LIBFDT_objdir = libfdt +LIBFDT_srcdir = libfdt +LIBFDT_archive = $(LIBFDT_objdir)/libfdt.a +LIBFDT_lib = $(LIBFDT_objdir)/libfdt.$(SHAREDLIB_EXT) +LIBFDT_include = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_INCLUDES)) +LIBFDT_version = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_VERSION)) + +include $(LIBFDT_srcdir)/Makefile.libfdt + +.PHONY: libfdt +libfdt: $(LIBFDT_archive) $(LIBFDT_lib) + +$(LIBFDT_archive): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS)) +$(LIBFDT_lib): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS)) + +libfdt_clean: + @$(VECHO) CLEAN "(libfdt)" + rm -f $(addprefix $(LIBFDT_objdir)/,$(STD_CLEANFILES)) + rm -f $(LIBFDT_objdir)/*.so + +ifneq ($(DEPTARGETS),) +-include $(LIBFDT_OBJS:%.o=$(LIBFDT_objdir)/%.d) +endif + +# This stops make from generating the lex and bison output during +# auto-dependency computation, but throwing them away as an +# intermediate target and building them again "for real" +.SECONDARY: $(DTC_GEN_SRCS) $(CONVERT_GEN_SRCS) + +install: all + @$(VECHO) INSTALL + $(INSTALL) -d $(DESTDIR)$(BINDIR) + $(INSTALL) $(BIN) $(DESTDIR)$(BINDIR) + $(INSTALL) -d $(DESTDIR)$(LIBDIR) + $(INSTALL) $(LIBFDT_lib) $(DESTDIR)$(LIBDIR) + $(INSTALL) -m 644 $(LIBFDT_archive) $(DESTDIR)$(LIBDIR) + $(INSTALL) -d $(DESTDIR)$(INCLUDEDIR) + $(INSTALL) -m 644 $(LIBFDT_include) $(DESTDIR)$(INCLUDEDIR) + +$(VERSION_FILE): Makefile FORCE + $(call filechk,version) + + +dtc: $(DTC_OBJS) + +convert-dtsv0: $(CONVERT_OBJS) + @$(VECHO) LD $@ + $(LINK.c) -o $@ $^ + +ftdump: $(FTDUMP_OBJS) + + +# +# Testsuite rules +# +TESTS_PREFIX=tests/ +include tests/Makefile.tests + +# +# Clean rules +# +STD_CLEANFILES = *~ *.o *.so *.d *.a *.i *.s core a.out vgcore.* \ + *.tab.[ch] *.lex.c *.output + +clean: libfdt_clean tests_clean + @$(VECHO) CLEAN + rm -f $(STD_CLEANFILES) + rm -f $(VERSION_FILE) + rm -f $(BIN) + +# +# Generic compile rules +# +%: %.o + @$(VECHO) LD $@ + $(LINK.c) -o $@ $^ + +%.o: %.c + @$(VECHO) CC $@ + $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< + +%.o: %.S + @$(VECHO) AS $@ + $(CC) $(CPPFLAGS) $(AFLAGS) -D__ASSEMBLY__ -o $@ -c $< + +%.d: %.c + @$(VECHO) DEP $< + $(CC) $(CPPFLAGS) -MM -MG -MT "$*.o $@" $< > $@ + +%.d: %.S + @$(VECHO) DEP $< + $(CC) $(CPPFLAGS) -MM -MG -MT "$*.o $@" $< > $@ + +%.i: %.c + @$(VECHO) CPP $@ + $(CC) $(CPPFLAGS) -E $< > $@ + +%.s: %.c + @$(VECHO) CC -S $@ + $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -S $< + +%.a: + @$(VECHO) AR $@ + $(AR) $(ARFLAGS) $@ $^ + +$(LIBFDT_lib): + @$(VECHO) LD $@ + $(CC) $(LDFLAGS) -fPIC $(SHAREDLIB_LINK_OPTIONS)$(notdir $@) -o $(LIBFDT_objdir)/libfdt-$(DTC_VERSION).$(SHAREDLIB_EXT) $^ + ln -sf libfdt-$(DTC_VERSION).$(SHAREDLIB_EXT) $(LIBFDT_objdir)/libfdt.$(SHAREDLIB_EXT) + +%.lex.c: %.l + @$(VECHO) LEX $@ + $(LEX) -o$@ $< + +%.tab.c %.tab.h %.output: %.y + @$(VECHO) BISON $@ + $(BISON) -d $< + +FORCE: diff --git a/contrib/dtc/Makefile.convert-dtsv0 b/contrib/dtc/Makefile.convert-dtsv0 new file mode 100644 index 000000000000..08ea40a03a71 --- /dev/null +++ b/contrib/dtc/Makefile.convert-dtsv0 @@ -0,0 +1,13 @@ +# +# This is not a complete Makefile of itself. +# Instead, it is designed to be easily embeddable +# into other systems of Makefiles. +# + +CONVERT_SRCS = \ + srcpos.c \ + util.c + +CONVERT_GEN_SRCS = convert-dtsv0-lexer.lex.c + +CONVERT_OBJS = $(CONVERT_SRCS:%.c=%.o) $(CONVERT_GEN_SRCS:%.c=%.o) diff --git a/contrib/dtc/Makefile.ftdump b/contrib/dtc/Makefile.ftdump new file mode 100644 index 000000000000..b70905ad10c9 --- /dev/null +++ b/contrib/dtc/Makefile.ftdump @@ -0,0 +1,12 @@ +# +# This is not a complete Makefile of itself. +# Instead, it is designed to be easily embeddable +# into other systems of Makefiles. +# + +FTDUMP_SRCS = \ + ftdump.c + +FTDUMP_GEN_SRCS = + +FTDUMP_OBJS = $(FTDUMP_SRCS:%.c=%.o) $(FTDUMP_GEN_SRCS:%.c=%.o) diff --git a/contrib/dtc/README.license b/contrib/dtc/README.license new file mode 100644 index 000000000000..d56c88f528a3 --- /dev/null +++ b/contrib/dtc/README.license @@ -0,0 +1,56 @@ +Licensing and contribution policy of dtc and libfdt +=================================================== + +This dtc package contains two pieces of software: dtc itself, and +libfdt which comprises the files in the libfdt/ subdirectory. These +two pieces of software, although closely related, are quite distinct. +dtc does not incoporate or rely on libfdt for its operation, nor vice +versa. It is important that these two pieces of software have +different license conditions. + +As the copyright banners in each source file attest, dtc is licensed +under the GNU GPL. The full text of the GPL can be found in the file +entitled 'GPL' which should be included in this package. dtc code, +therefore, may not be incorporated into works which do not have a GPL +compatible license. + +libfdt, however, is GPL/BSD dual-licensed. That is, it may be used +either under the terms of the GPL, or under the terms of the 2-clause +BSD license (aka the ISC license). The full terms of that license are +given in the copyright banners of each of the libfdt source files. +This is, in practice, equivalent to being BSD licensed, since the +terms of the BSD license are strictly more permissive than the GPL. + +I made the decision to license libfdt in this way because I want to +encourage widespread and correct usage of flattened device trees, +including by proprietary or otherwise GPL-incompatible firmware or +tools. Allowing libfdt to be used under the terms of the BSD license +makes that it easier for vendors or authors of such software to do so. + +This does mean that libfdt code could be "stolen" - say, included in a +proprietary fimware and extended without contributing those extensions +back to the libfdt mainline. While I hope that doesn't happen, I +believe the goal of allowing libfdt to be widely used is more +important than avoiding that. libfdt is quite small, and hardly +rocket science; so the incentive for such impolite behaviour is small, +and the inconvenience caused therby is not dire. + +Licenses such as the LGPL which would allow code to be used in non-GPL +software, but also require contributions to be returned were +considered. However, libfdt is designed to be used in firmwares and +other environments with unusual technical constraints. It's difficult +to anticipate all possible changes which might be needed to meld +libfdt into such environments and so difficult to suitably word a +license that puts the boundary between what is and isn't permitted in +the intended place. Again, I judged encouraging widespread use of +libfdt by keeping the license terms simple and familiar to be the more +important goal. + +**IMPORTANT** It's intended that all of libfdt as released remain +permissively licensed this way. Therefore only contributions which +are released under these terms can be merged into the libfdt mainline. + + +David Gibson +(principal original author of dtc and libfdt) +2 November 2007 diff --git a/contrib/dtc/TODO b/contrib/dtc/TODO new file mode 100644 index 000000000000..a3e71828c834 --- /dev/null +++ b/contrib/dtc/TODO @@ -0,0 +1,8 @@ +- Bugfixes: + * Proper handling of boot cpu information +- Generate mem reserve map + * linux,reserve-map property + * generating reserve entry for device tree itself + * generating reserve entries from tce, rtas etc. properties +- Expression support +- Macro system diff --git a/contrib/dtc/checks.c b/contrib/dtc/checks.c new file mode 100644 index 000000000000..031cc59fbf40 --- /dev/null +++ b/contrib/dtc/checks.c @@ -0,0 +1,611 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2007. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" + +#ifdef TRACE_CHECKS +#define TRACE(c, ...) \ + do { \ + fprintf(stderr, "=== %s: ", (c)->name); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + } while (0) +#else +#define TRACE(c, fmt, ...) do { } while (0) +#endif + +enum checklevel { + IGNORE = 0, + WARN = 1, + ERROR = 2, +}; + +enum checkstatus { + UNCHECKED = 0, + PREREQ, + PASSED, + FAILED, +}; + +struct check; + +typedef void (*tree_check_fn)(struct check *c, struct node *dt); +typedef void (*node_check_fn)(struct check *c, struct node *dt, struct node *node); +typedef void (*prop_check_fn)(struct check *c, struct node *dt, + struct node *node, struct property *prop); + +struct check { + const char *name; + tree_check_fn tree_fn; + node_check_fn node_fn; + prop_check_fn prop_fn; + void *data; + enum checklevel level; + enum checkstatus status; + int inprogress; + int num_prereqs; + struct check **prereq; +}; + +#define CHECK(nm, tfn, nfn, pfn, d, lvl, ...) \ + static struct check *nm##_prereqs[] = { __VA_ARGS__ }; \ + static struct check nm = { \ + .name = #nm, \ + .tree_fn = (tfn), \ + .node_fn = (nfn), \ + .prop_fn = (pfn), \ + .data = (d), \ + .level = (lvl), \ + .status = UNCHECKED, \ + .num_prereqs = ARRAY_SIZE(nm##_prereqs), \ + .prereq = nm##_prereqs, \ + }; + +#define TREE_CHECK(nm, d, lvl, ...) \ + CHECK(nm, check_##nm, NULL, NULL, d, lvl, __VA_ARGS__) +#define NODE_CHECK(nm, d, lvl, ...) \ + CHECK(nm, NULL, check_##nm, NULL, d, lvl, __VA_ARGS__) +#define PROP_CHECK(nm, d, lvl, ...) \ + CHECK(nm, NULL, NULL, check_##nm, d, lvl, __VA_ARGS__) +#define BATCH_CHECK(nm, lvl, ...) \ + CHECK(nm, NULL, NULL, NULL, NULL, lvl, __VA_ARGS__) + +#ifdef __GNUC__ +static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3))); +#endif +static inline void check_msg(struct check *c, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + if ((c->level < WARN) || (c->level <= quiet)) + return; /* Suppress message */ + + fprintf(stderr, "%s (%s): ", + (c->level == ERROR) ? "ERROR" : "Warning", c->name); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); +} + +#define FAIL(c, ...) \ + do { \ + TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \ + (c)->status = FAILED; \ + check_msg((c), __VA_ARGS__); \ + } while (0) + +static void check_nodes_props(struct check *c, struct node *dt, struct node *node) +{ + struct node *child; + struct property *prop; + + TRACE(c, "%s", node->fullpath); + if (c->node_fn) + c->node_fn(c, dt, node); + + if (c->prop_fn) + for_each_property(node, prop) { + TRACE(c, "%s\t'%s'", node->fullpath, prop->name); + c->prop_fn(c, dt, node, prop); + } + + for_each_child(node, child) + check_nodes_props(c, dt, child); +} + +static int run_check(struct check *c, struct node *dt) +{ + int error = 0; + int i; + + assert(!c->inprogress); + + if (c->status != UNCHECKED) + goto out; + + c->inprogress = 1; + + for (i = 0; i < c->num_prereqs; i++) { + struct check *prq = c->prereq[i]; + error |= run_check(prq, dt); + if (prq->status != PASSED) { + c->status = PREREQ; + check_msg(c, "Failed prerequisite '%s'", + c->prereq[i]->name); + } + } + + if (c->status != UNCHECKED) + goto out; + + if (c->node_fn || c->prop_fn) + check_nodes_props(c, dt, dt); + + if (c->tree_fn) + c->tree_fn(c, dt); + if (c->status == UNCHECKED) + c->status = PASSED; + + TRACE(c, "\tCompleted, status %d", c->status); + +out: + c->inprogress = 0; + if ((c->status != PASSED) && (c->level == ERROR)) + error = 1; + return error; +} + +/* + * Utility check functions + */ + +static void check_is_string(struct check *c, struct node *root, + struct node *node) +{ + struct property *prop; + char *propname = c->data; + + prop = get_property(node, propname); + if (!prop) + return; /* Not present, assumed ok */ + + if (!data_is_one_string(prop->val)) + FAIL(c, "\"%s\" property in %s is not a string", + propname, node->fullpath); +} +#define CHECK_IS_STRING(nm, propname, lvl) \ + CHECK(nm, NULL, check_is_string, NULL, (propname), (lvl)) + +static void check_is_cell(struct check *c, struct node *root, + struct node *node) +{ + struct property *prop; + char *propname = c->data; + + prop = get_property(node, propname); + if (!prop) + return; /* Not present, assumed ok */ + + if (prop->val.len != sizeof(cell_t)) + FAIL(c, "\"%s\" property in %s is not a single cell", + propname, node->fullpath); +} +#define CHECK_IS_CELL(nm, propname, lvl) \ + CHECK(nm, NULL, check_is_cell, NULL, (propname), (lvl)) + +/* + * Structural check functions + */ + +static void check_duplicate_node_names(struct check *c, struct node *dt, + struct node *node) +{ + struct node *child, *child2; + + for_each_child(node, child) + for (child2 = child->next_sibling; + child2; + child2 = child2->next_sibling) + if (streq(child->name, child2->name)) + FAIL(c, "Duplicate node name %s", + child->fullpath); +} +NODE_CHECK(duplicate_node_names, NULL, ERROR); + +static void check_duplicate_property_names(struct check *c, struct node *dt, + struct node *node) +{ + struct property *prop, *prop2; + + for_each_property(node, prop) + for (prop2 = prop->next; prop2; prop2 = prop2->next) + if (streq(prop->name, prop2->name)) + FAIL(c, "Duplicate property name %s in %s", + prop->name, node->fullpath); +} +NODE_CHECK(duplicate_property_names, NULL, ERROR); + +#define LOWERCASE "abcdefghijklmnopqrstuvwxyz" +#define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define DIGITS "0123456789" +#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" + +static void check_node_name_chars(struct check *c, struct node *dt, + struct node *node) +{ + int n = strspn(node->name, c->data); + + if (n < strlen(node->name)) + FAIL(c, "Bad character '%c' in node %s", + node->name[n], node->fullpath); +} +NODE_CHECK(node_name_chars, PROPNODECHARS "@", ERROR); + +static void check_node_name_format(struct check *c, struct node *dt, + struct node *node) +{ + if (strchr(get_unitname(node), '@')) + FAIL(c, "Node %s has multiple '@' characters in name", + node->fullpath); +} +NODE_CHECK(node_name_format, NULL, ERROR, &node_name_chars); + +static void check_property_name_chars(struct check *c, struct node *dt, + struct node *node, struct property *prop) +{ + int n = strspn(prop->name, c->data); + + if (n < strlen(prop->name)) + FAIL(c, "Bad character '%c' in property name \"%s\", node %s", + prop->name[n], prop->name, node->fullpath); +} +PROP_CHECK(property_name_chars, PROPNODECHARS, ERROR); + +static void check_explicit_phandles(struct check *c, struct node *root, + struct node *node, struct property *prop) +{ + struct marker *m; + struct node *other; + cell_t phandle; + + if (!streq(prop->name, "phandle") + && !streq(prop->name, "linux,phandle")) + return; + + if (prop->val.len != sizeof(cell_t)) { + FAIL(c, "%s has bad length (%d) %s property", + node->fullpath, prop->val.len, prop->name); + return; + } + + m = prop->val.markers; + for_each_marker_of_type(m, REF_PHANDLE) { + assert(m->offset == 0); + if (node != get_node_by_ref(root, m->ref)) + /* "Set this node's phandle equal to some + * other node's phandle". That's nonsensical + * by construction. */ { + FAIL(c, "%s in %s is a reference to another node", + prop->name, node->fullpath); + return; + } + /* But setting this node's phandle equal to its own + * phandle is allowed - that means allocate a unique + * phandle for this node, even if it's not otherwise + * referenced. The value will be filled in later, so + * no further checking for now. */ + return; + } + + phandle = propval_cell(prop); + + if ((phandle == 0) || (phandle == -1)) { + FAIL(c, "%s has bad value (0x%x) in %s property", + node->fullpath, phandle, prop->name); + return; + } + + if (node->phandle && (node->phandle != phandle)) + FAIL(c, "%s has %s property which replaces existing phandle information", + node->fullpath, prop->name); + + other = get_node_by_phandle(root, phandle); + if (other && (other != node)) { + FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)", + node->fullpath, phandle, other->fullpath); + return; + } + + node->phandle = phandle; +} +PROP_CHECK(explicit_phandles, NULL, ERROR); + +static void check_name_properties(struct check *c, struct node *root, + struct node *node) +{ + struct property **pp, *prop = NULL; + + for (pp = &node->proplist; *pp; pp = &((*pp)->next)) + if (streq((*pp)->name, "name")) { + prop = *pp; + break; + } + + if (!prop) + return; /* No name property, that's fine */ + + if ((prop->val.len != node->basenamelen+1) + || (memcmp(prop->val.val, node->name, node->basenamelen) != 0)) { + FAIL(c, "\"name\" property in %s is incorrect (\"%s\" instead" + " of base node name)", node->fullpath, prop->val.val); + } else { + /* The name property is correct, and therefore redundant. + * Delete it */ + *pp = prop->next; + free(prop->name); + data_free(prop->val); + free(prop); + } +} +CHECK_IS_STRING(name_is_string, "name", ERROR); +NODE_CHECK(name_properties, NULL, ERROR, &name_is_string); + +/* + * Reference fixup functions + */ + +static void fixup_phandle_references(struct check *c, struct node *dt, + struct node *node, struct property *prop) +{ + struct marker *m = prop->val.markers; + struct node *refnode; + cell_t phandle; + + for_each_marker_of_type(m, REF_PHANDLE) { + assert(m->offset + sizeof(cell_t) <= prop->val.len); + + refnode = get_node_by_ref(dt, m->ref); + if (! refnode) { + FAIL(c, "Reference to non-existent node or label \"%s\"\n", + m->ref); + continue; + } + + phandle = get_node_phandle(dt, refnode); + *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle); + } +} +CHECK(phandle_references, NULL, NULL, fixup_phandle_references, NULL, ERROR, + &duplicate_node_names, &explicit_phandles); + +static void fixup_path_references(struct check *c, struct node *dt, + struct node *node, struct property *prop) +{ + struct marker *m = prop->val.markers; + struct node *refnode; + char *path; + + for_each_marker_of_type(m, REF_PATH) { + assert(m->offset <= prop->val.len); + + refnode = get_node_by_ref(dt, m->ref); + if (!refnode) { + FAIL(c, "Reference to non-existent node or label \"%s\"\n", + m->ref); + continue; + } + + path = refnode->fullpath; + prop->val = data_insert_at_marker(prop->val, m, path, + strlen(path) + 1); + } +} +CHECK(path_references, NULL, NULL, fixup_path_references, NULL, ERROR, + &duplicate_node_names); + +/* + * Semantic checks + */ +CHECK_IS_CELL(address_cells_is_cell, "#address-cells", WARN); +CHECK_IS_CELL(size_cells_is_cell, "#size-cells", WARN); +CHECK_IS_CELL(interrupt_cells_is_cell, "#interrupt-cells", WARN); + +CHECK_IS_STRING(device_type_is_string, "device_type", WARN); +CHECK_IS_STRING(model_is_string, "model", WARN); +CHECK_IS_STRING(status_is_string, "status", WARN); + +static void fixup_addr_size_cells(struct check *c, struct node *dt, + struct node *node) +{ + struct property *prop; + + node->addr_cells = -1; + node->size_cells = -1; + + prop = get_property(node, "#address-cells"); + if (prop) + node->addr_cells = propval_cell(prop); + + prop = get_property(node, "#size-cells"); + if (prop) + node->size_cells = propval_cell(prop); +} +CHECK(addr_size_cells, NULL, fixup_addr_size_cells, NULL, NULL, WARN, + &address_cells_is_cell, &size_cells_is_cell); + +#define node_addr_cells(n) \ + (((n)->addr_cells == -1) ? 2 : (n)->addr_cells) +#define node_size_cells(n) \ + (((n)->size_cells == -1) ? 1 : (n)->size_cells) + +static void check_reg_format(struct check *c, struct node *dt, + struct node *node) +{ + struct property *prop; + int addr_cells, size_cells, entrylen; + + prop = get_property(node, "reg"); + if (!prop) + return; /* No "reg", that's fine */ + + if (!node->parent) { + FAIL(c, "Root node has a \"reg\" property"); + return; + } + + if (prop->val.len == 0) + FAIL(c, "\"reg\" property in %s is empty", node->fullpath); + + addr_cells = node_addr_cells(node->parent); + size_cells = node_size_cells(node->parent); + entrylen = (addr_cells + size_cells) * sizeof(cell_t); + + if ((prop->val.len % entrylen) != 0) + FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) " + "(#address-cells == %d, #size-cells == %d)", + node->fullpath, prop->val.len, addr_cells, size_cells); +} +NODE_CHECK(reg_format, NULL, WARN, &addr_size_cells); + +static void check_ranges_format(struct check *c, struct node *dt, + struct node *node) +{ + struct property *prop; + int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen; + + prop = get_property(node, "ranges"); + if (!prop) + return; + + if (!node->parent) { + FAIL(c, "Root node has a \"ranges\" property"); + return; + } + + p_addr_cells = node_addr_cells(node->parent); + p_size_cells = node_size_cells(node->parent); + c_addr_cells = node_addr_cells(node); + c_size_cells = node_size_cells(node); + entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t); + + if (prop->val.len == 0) { + if (p_addr_cells != c_addr_cells) + FAIL(c, "%s has empty \"ranges\" property but its " + "#address-cells (%d) differs from %s (%d)", + node->fullpath, c_addr_cells, node->parent->fullpath, + p_addr_cells); + if (p_size_cells != c_size_cells) + FAIL(c, "%s has empty \"ranges\" property but its " + "#size-cells (%d) differs from %s (%d)", + node->fullpath, c_size_cells, node->parent->fullpath, + p_size_cells); + } else if ((prop->val.len % entrylen) != 0) { + FAIL(c, "\"ranges\" property in %s has invalid length (%d bytes) " + "(parent #address-cells == %d, child #address-cells == %d, " + "#size-cells == %d)", node->fullpath, prop->val.len, + p_addr_cells, c_addr_cells, c_size_cells); + } +} +NODE_CHECK(ranges_format, NULL, WARN, &addr_size_cells); + +/* + * Style checks + */ +static void check_avoid_default_addr_size(struct check *c, struct node *dt, + struct node *node) +{ + struct property *reg, *ranges; + + if (!node->parent) + return; /* Ignore root node */ + + reg = get_property(node, "reg"); + ranges = get_property(node, "ranges"); + + if (!reg && !ranges) + return; + + if ((node->parent->addr_cells == -1)) + FAIL(c, "Relying on default #address-cells value for %s", + node->fullpath); + + if ((node->parent->size_cells == -1)) + FAIL(c, "Relying on default #size-cells value for %s", + node->fullpath); +} +NODE_CHECK(avoid_default_addr_size, NULL, WARN, &addr_size_cells); + +static void check_obsolete_chosen_interrupt_controller(struct check *c, + struct node *dt) +{ + struct node *chosen; + struct property *prop; + + chosen = get_node_by_path(dt, "/chosen"); + if (!chosen) + return; + + prop = get_property(chosen, "interrupt-controller"); + if (prop) + FAIL(c, "/chosen has obsolete \"interrupt-controller\" " + "property"); +} +TREE_CHECK(obsolete_chosen_interrupt_controller, NULL, WARN); + +static struct check *check_table[] = { + &duplicate_node_names, &duplicate_property_names, + &node_name_chars, &node_name_format, &property_name_chars, + &name_is_string, &name_properties, + &explicit_phandles, + &phandle_references, &path_references, + + &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell, + &device_type_is_string, &model_is_string, &status_is_string, + + &addr_size_cells, ®_format, &ranges_format, + + &avoid_default_addr_size, + &obsolete_chosen_interrupt_controller, +}; + +void process_checks(int force, struct boot_info *bi) +{ + struct node *dt = bi->dt; + int i; + int error = 0; + + for (i = 0; i < ARRAY_SIZE(check_table); i++) { + struct check *c = check_table[i]; + + if (c->level != IGNORE) + error = error || run_check(c, dt); + } + + if (error) { + if (!force) { + fprintf(stderr, "ERROR: Input tree has errors, aborting " + "(use -f to force output)\n"); + exit(2); + } else if (quiet < 3) { + fprintf(stderr, "Warning: Input tree has errors, " + "output forced\n"); + } + } +} diff --git a/contrib/dtc/convert-dtsv0-lexer.l b/contrib/dtc/convert-dtsv0-lexer.l new file mode 100644 index 000000000000..59137f1a798a --- /dev/null +++ b/contrib/dtc/convert-dtsv0-lexer.l @@ -0,0 +1,238 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005, 2008. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +%option noyywrap nounput noinput + +%x INCLUDE +%x BYTESTRING +%x PROPNODENAME + +PROPNODECHAR [a-zA-Z0-9,._+*#?@-] +PATHCHAR ({PROPNODECHAR}|[/]) +LABEL [a-zA-Z_][a-zA-Z0-9_]* +STRING \"([^\\"]|\\.)*\" +WS [[:space:]] +COMMENT "/*"([^*]|\*+[^*/])*\*+"/" +LINECOMMENT "//".*\n +GAP ({WS}|{COMMENT}|{LINECOMMENT})* + +%{ +#include +#include +#include + +#include +#include +#include + +#include "srcpos.h" +#include "util.h" + +static int v1_tagged; /* = 0 */ +static int cbase = 16; +static int saw_hyphen; /* = 0 */ +static unsigned long long last_val; +static char *last_name; /* = NULL */ + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +const struct { + const char *pattern; + int obase, width; +} guess_table[] = { + { "*-frequency", 10, 0 }, + { "num-*", 10, 0 }, + { "#*-cells", 10, 0 }, + { "*cache-line-size", 10, 0 }, + { "*cache-block-size", 10, 0 }, + { "*cache-size", 10, 0 }, + { "*cache-sets", 10, 0 }, + { "cell-index", 10, 0 }, + { "bank-width", 10, 0 }, + { "*-fifo-size", 10, 0 }, + { "*-frame-size", 10, 0 }, + { "*-channel", 10, 0 }, + { "current-speed", 10, 0 }, + { "phy-map", 16, 8 }, + { "dcr-reg", 16, 3 }, + { "reg", 16, 8 }, + { "ranges", 16, 8}, +}; +%} + +%% +<*>"/include/"{GAP}{STRING} ECHO; + +<*>\"([^\\"]|\\.)*\" ECHO; + +<*>"/dts-v1/" { + die("Input dts file is already version 1\n"); + } + +<*>"/memreserve/" { + if (!v1_tagged) { + fprintf(yyout, "/dts-v1/;\n\n"); + v1_tagged = 1; + } + + ECHO; + BEGIN(INITIAL); + } + +<*>{LABEL}: ECHO; + +[bodh]# { + if (*yytext == 'b') + cbase = 2; + else if (*yytext == 'o') + cbase = 8; + else if (*yytext == 'd') + cbase = 10; + else + cbase = 16; + } + +[0-9a-fA-F]+ { + unsigned long long val; + int obase = 16, width = 0; + int i; + + val = strtoull(yytext, NULL, cbase); + + if (saw_hyphen) + val = val - last_val + 1; + + if (last_name) { + for (i = 0; i < ARRAY_SIZE(guess_table); i++) + if (fnmatch(guess_table[i].pattern, + last_name, 0) == 0) { + obase = guess_table[i].obase; + width = guess_table[i].width; + } + } else { + obase = 16; + width = 16; + } + + if (cbase != 16) + obase = cbase; + + switch (obase) { + case 2: + case 16: + fprintf(yyout, "0x%0*llx", width, val); + break; + case 8: + fprintf(yyout, "0%0*llo", width, val); + break; + case 10: + fprintf(yyout, "%*llu", width, val); + break; + } + + cbase = 16; + last_val = val; + saw_hyphen = 0; + } + +\&{LABEL} ECHO; + +"&{/"{PATHCHAR}+\} ECHO; + +"&/"{PATHCHAR}+ fprintf(yyout, "&{/%s}", yytext + 2); + +[0-9a-fA-F]{2} ECHO; + +"]" { + ECHO; + BEGIN(INITIAL); + } + +{PROPNODECHAR}+ { + ECHO; + last_name = xstrdup(yytext); + BEGIN(INITIAL); + } + +<*>{GAP} ECHO; + +<*>- { /* Hack to convert old style memreserves */ + saw_hyphen = 1; + fprintf(yyout, " "); + } + +<*>. { + if (!v1_tagged) { + fprintf(yyout, "/dts-v1/;\n\n"); + v1_tagged = 1; + } + + ECHO; + if (yytext[0] == '[') { + BEGIN(BYTESTRING); + } + if ((yytext[0] == '{') + || (yytext[0] == ';')) { + BEGIN(PROPNODENAME); + } + } + +%% +static void usage(void) +{ + fprintf(stderr, "convert-dtsv0 ...\n"); + exit(3); +} + +static void convert_file(const char *fname) +{ + const char suffix[] = "v1"; + int len = strlen(fname); + char *newname; + + newname = xmalloc(len + sizeof(suffix)); + memcpy(newname, fname, len); + memcpy(newname + len, suffix, sizeof(suffix)); + + srcpos_file = dtc_open_file(fname, NULL); + yyin = srcpos_file->file; + + yyout = fopen(newname, "w"); + if (!yyout) + die("Couldn't open output file %s: %s\n", + newname, strerror(errno)); + + while(yylex()) + ; +} + +int main(int argc, char *argv[]) +{ + int i; + + if (argc < 2) + usage(); + + for (i = 1; i < argc; i++) { + fprintf(stderr, "Converting %s from dts v0 to dts v1\n", argv[i]); + convert_file(argv[i]); + } + + exit(0); +} diff --git a/contrib/dtc/data.c b/contrib/dtc/data.c new file mode 100644 index 000000000000..fe555e819bf8 --- /dev/null +++ b/contrib/dtc/data.c @@ -0,0 +1,321 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" + +void data_free(struct data d) +{ + struct marker *m, *nm; + + m = d.markers; + while (m) { + nm = m->next; + free(m->ref); + free(m); + m = nm; + } + + if (d.val) + free(d.val); +} + +struct data data_grow_for(struct data d, int xlen) +{ + struct data nd; + int newsize; + + if (xlen == 0) + return d; + + nd = d; + + newsize = xlen; + + while ((d.len + xlen) > newsize) + newsize *= 2; + + nd.val = xrealloc(d.val, newsize); + + return nd; +} + +struct data data_copy_mem(const char *mem, int len) +{ + struct data d; + + d = data_grow_for(empty_data, len); + + d.len = len; + memcpy(d.val, mem, len); + + return d; +} + +static char get_oct_char(const char *s, int *i) +{ + char x[4]; + char *endx; + long val; + + x[3] = '\0'; + strncpy(x, s + *i, 3); + + val = strtol(x, &endx, 8); + + assert(endx > x); + + (*i) += endx - x; + return val; +} + +static char get_hex_char(const char *s, int *i) +{ + char x[3]; + char *endx; + long val; + + x[2] = '\0'; + strncpy(x, s + *i, 2); + + val = strtol(x, &endx, 16); + if (!(endx > x)) + die("\\x used with no following hex digits\n"); + + (*i) += endx - x; + return val; +} + +struct data data_copy_escape_string(const char *s, int len) +{ + int i = 0; + struct data d; + char *q; + + d = data_grow_for(empty_data, strlen(s)+1); + + q = d.val; + while (i < len) { + char c = s[i++]; + + if (c != '\\') { + q[d.len++] = c; + continue; + } + + c = s[i++]; + assert(c); + switch (c) { + case 'a': + q[d.len++] = '\a'; + break; + case 'b': + q[d.len++] = '\b'; + break; + case 't': + q[d.len++] = '\t'; + break; + case 'n': + q[d.len++] = '\n'; + break; + case 'v': + q[d.len++] = '\v'; + break; + case 'f': + q[d.len++] = '\f'; + break; + case 'r': + q[d.len++] = '\r'; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + i--; /* need to re-read the first digit as + * part of the octal value */ + q[d.len++] = get_oct_char(s, &i); + break; + case 'x': + q[d.len++] = get_hex_char(s, &i); + break; + default: + q[d.len++] = c; + } + } + + q[d.len++] = '\0'; + return d; +} + +struct data data_copy_file(FILE *f, size_t maxlen) +{ + struct data d = empty_data; + + while (!feof(f) && (d.len < maxlen)) { + size_t chunksize, ret; + + if (maxlen == -1) + chunksize = 4096; + else + chunksize = maxlen - d.len; + + d = data_grow_for(d, chunksize); + ret = fread(d.val + d.len, 1, chunksize, f); + + if (ferror(f)) + die("Error reading file into data: %s", strerror(errno)); + + if (d.len + ret < d.len) + die("Overflow reading file into data\n"); + + d.len += ret; + } + + return d; +} + +struct data data_append_data(struct data d, const void *p, int len) +{ + d = data_grow_for(d, len); + memcpy(d.val + d.len, p, len); + d.len += len; + return d; +} + +struct data data_insert_at_marker(struct data d, struct marker *m, + const void *p, int len) +{ + d = data_grow_for(d, len); + memmove(d.val + m->offset + len, d.val + m->offset, d.len - m->offset); + memcpy(d.val + m->offset, p, len); + d.len += len; + + /* Adjust all markers after the one we're inserting at */ + m = m->next; + for_each_marker(m) + m->offset += len; + return d; +} + +static struct data data_append_markers(struct data d, struct marker *m) +{ + struct marker **mp = &d.markers; + + /* Find the end of the markerlist */ + while (*mp) + mp = &((*mp)->next); + *mp = m; + return d; +} + +struct data data_merge(struct data d1, struct data d2) +{ + struct data d; + struct marker *m2 = d2.markers; + + d = data_append_markers(data_append_data(d1, d2.val, d2.len), m2); + + /* Adjust for the length of d1 */ + for_each_marker(m2) + m2->offset += d1.len; + + d2.markers = NULL; /* So data_free() doesn't clobber them */ + data_free(d2); + + return d; +} + +struct data data_append_cell(struct data d, cell_t word) +{ + cell_t beword = cpu_to_fdt32(word); + + return data_append_data(d, &beword, sizeof(beword)); +} + +struct data data_append_re(struct data d, const struct fdt_reserve_entry *re) +{ + struct fdt_reserve_entry bere; + + bere.address = cpu_to_fdt64(re->address); + bere.size = cpu_to_fdt64(re->size); + + return data_append_data(d, &bere, sizeof(bere)); +} + +struct data data_append_addr(struct data d, uint64_t addr) +{ + uint64_t beaddr = cpu_to_fdt64(addr); + + return data_append_data(d, &beaddr, sizeof(beaddr)); +} + +struct data data_append_byte(struct data d, uint8_t byte) +{ + return data_append_data(d, &byte, 1); +} + +struct data data_append_zeroes(struct data d, int len) +{ + d = data_grow_for(d, len); + + memset(d.val + d.len, 0, len); + d.len += len; + return d; +} + +struct data data_append_align(struct data d, int align) +{ + int newlen = ALIGN(d.len, align); + return data_append_zeroes(d, newlen - d.len); +} + +struct data data_add_marker(struct data d, enum markertype type, char *ref) +{ + struct marker *m; + + m = xmalloc(sizeof(*m)); + m->offset = d.len; + m->type = type; + m->ref = ref; + m->next = NULL; + + return data_append_markers(d, m); +} + +int data_is_one_string(struct data d) +{ + int i; + int len = d.len; + + if (len == 0) + return 0; + + for (i = 0; i < len-1; i++) + if (d.val[i] == '\0') + return 0; + + if (d.val[len-1] != '\0') + return 0; + + return 1; +} diff --git a/contrib/dtc/dtc-lexer.l b/contrib/dtc/dtc-lexer.l new file mode 100644 index 000000000000..96c2fcef1aa3 --- /dev/null +++ b/contrib/dtc/dtc-lexer.l @@ -0,0 +1,266 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +%option noyywrap nounput noinput yylineno + +%x INCLUDE +%x BYTESTRING +%x PROPNODENAME +%s V1 + +PROPNODECHAR [a-zA-Z0-9,._+*#?@-] +PATHCHAR ({PROPNODECHAR}|[/]) +LABEL [a-zA-Z_][a-zA-Z0-9_]* +STRING \"([^\\"]|\\.)*\" +WS [[:space:]] +COMMENT "/*"([^*]|\*+[^*/])*\*+"/" +LINECOMMENT "//".*\n + +%{ +#include "dtc.h" +#include "srcpos.h" +#include "dtc-parser.tab.h" + +YYLTYPE yylloc; + +#define YY_USER_ACTION \ + { \ + yylloc.file = srcpos_file; \ + yylloc.first_line = yylineno; \ + } + +/*#define LEXDEBUG 1*/ + +#ifdef LEXDEBUG +#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) +#else +#define DPRINT(fmt, ...) do { } while (0) +#endif + +static int dts_version = 1; + +#define BEGIN_DEFAULT() DPRINT("\n"); \ + BEGIN(V1); \ + +static void push_input_file(const char *filename); +static int pop_input_file(void); +%} + +%% +<*>"/include/"{WS}*{STRING} { + char *name = strchr(yytext, '\"') + 1; + yytext[yyleng-1] = '\0'; + push_input_file(name); + } + +<*><> { + if (!pop_input_file()) { + yyterminate(); + } + } + +<*>{STRING} { + DPRINT("String: %s\n", yytext); + yylval.data = data_copy_escape_string(yytext+1, + yyleng-2); + return DT_STRING; + } + +<*>"/dts-v1/" { + DPRINT("Keyword: /dts-v1/\n"); + dts_version = 1; + BEGIN_DEFAULT(); + return DT_V1; + } + +<*>"/memreserve/" { + DPRINT("Keyword: /memreserve/\n"); + BEGIN_DEFAULT(); + return DT_MEMRESERVE; + } + +<*>{LABEL}: { + DPRINT("Label: %s\n", yytext); + yylval.labelref = xstrdup(yytext); + yylval.labelref[yyleng-1] = '\0'; + return DT_LABEL; + } + +[0-9]+|0[xX][0-9a-fA-F]+ { + yylval.literal = xstrdup(yytext); + DPRINT("Literal: '%s'\n", yylval.literal); + return DT_LITERAL; + } + +\&{LABEL} { /* label reference */ + DPRINT("Ref: %s\n", yytext+1); + yylval.labelref = xstrdup(yytext+1); + return DT_REF; + } + +"&{/"{PATHCHAR}+\} { /* new-style path reference */ + yytext[yyleng-1] = '\0'; + DPRINT("Ref: %s\n", yytext+2); + yylval.labelref = xstrdup(yytext+2); + return DT_REF; + } + +[0-9a-fA-F]{2} { + yylval.byte = strtol(yytext, NULL, 16); + DPRINT("Byte: %02x\n", (int)yylval.byte); + return DT_BYTE; + } + +"]" { + DPRINT("/BYTESTRING\n"); + BEGIN_DEFAULT(); + return ']'; + } + +{PROPNODECHAR}+ { + DPRINT("PropNodeName: %s\n", yytext); + yylval.propnodename = xstrdup(yytext); + BEGIN_DEFAULT(); + return DT_PROPNODENAME; + } + +"/incbin/" { + DPRINT("Binary Include\n"); + return DT_INCBIN; + } + +<*>{WS}+ /* eat whitespace */ +<*>{COMMENT}+ /* eat C-style comments */ +<*>{LINECOMMENT}+ /* eat C++-style comments */ + +<*>. { + DPRINT("Char: %c (\\x%02x)\n", yytext[0], + (unsigned)yytext[0]); + if (yytext[0] == '[') { + DPRINT("\n"); + BEGIN(BYTESTRING); + } + if ((yytext[0] == '{') + || (yytext[0] == ';')) { + DPRINT("\n"); + BEGIN(PROPNODENAME); + } + return yytext[0]; + } + +%% + + +/* + * Stack of nested include file contexts. + */ + +struct incl_file { + struct dtc_file *file; + YY_BUFFER_STATE yy_prev_buf; + int yy_prev_lineno; + struct incl_file *prev; +}; + +static struct incl_file *incl_file_stack; + + +/* + * Detect infinite include recursion. + */ +#define MAX_INCLUDE_DEPTH (100) + +static int incl_depth = 0; + + +static void push_input_file(const char *filename) +{ + struct incl_file *incl_file; + struct dtc_file *newfile; + struct search_path search, *searchptr = NULL; + + assert(filename); + + if (incl_depth++ >= MAX_INCLUDE_DEPTH) + die("Includes nested too deeply"); + + if (srcpos_file) { + search.dir = srcpos_file->dir; + search.next = NULL; + search.prev = NULL; + searchptr = &search; + } + + newfile = dtc_open_file(filename, searchptr); + + incl_file = xmalloc(sizeof(struct incl_file)); + + /* + * Save current context. + */ + incl_file->yy_prev_buf = YY_CURRENT_BUFFER; + incl_file->yy_prev_lineno = yylineno; + incl_file->file = srcpos_file; + incl_file->prev = incl_file_stack; + + incl_file_stack = incl_file; + + /* + * Establish new context. + */ + srcpos_file = newfile; + yylineno = 1; + yyin = newfile->file; + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); +} + + +static int pop_input_file(void) +{ + struct incl_file *incl_file; + + if (incl_file_stack == 0) + return 0; + + dtc_close_file(srcpos_file); + + /* + * Pop. + */ + --incl_depth; + incl_file = incl_file_stack; + incl_file_stack = incl_file->prev; + + /* + * Recover old context. + */ + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_switch_to_buffer(incl_file->yy_prev_buf); + yylineno = incl_file->yy_prev_lineno; + srcpos_file = incl_file->file; + yyin = incl_file->file ? incl_file->file->file : NULL; + + /* + * Free old state. + */ + free(incl_file); + + return 1; +} diff --git a/contrib/dtc/dtc-parser.y b/contrib/dtc/dtc-parser.y new file mode 100644 index 000000000000..4411aed4af73 --- /dev/null +++ b/contrib/dtc/dtc-parser.y @@ -0,0 +1,321 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + + +%{ +#include + +#include "dtc.h" +#include "srcpos.h" + +YYLTYPE yylloc; + +extern int yylex(void); +extern void yyerror(char const *s); + +extern struct boot_info *the_boot_info; +extern int treesource_error; + +static unsigned long long eval_literal(const char *s, int base, int bits); +%} + +%union { + char *propnodename; + char *literal; + char *labelref; + unsigned int cbase; + uint8_t byte; + struct data data; + + uint64_t addr; + cell_t cell; + struct property *prop; + struct property *proplist; + struct node *node; + struct node *nodelist; + struct reserve_info *re; +} + +%token DT_V1 +%token DT_MEMRESERVE +%token DT_PROPNODENAME +%token DT_LITERAL +%token DT_BASE +%token DT_BYTE +%token DT_STRING +%token DT_LABEL +%token DT_REF +%token DT_INCBIN + +%type propdata +%type propdataprefix +%type memreserve +%type memreserves +%type addr +%type celllist +%type cellval +%type bytestring +%type propdef +%type proplist + +%type devicetree +%type nodedef +%type subnode +%type subnodes +%type label + +%% + +sourcefile: + DT_V1 ';' memreserves devicetree + { + the_boot_info = build_boot_info($3, $4, 0); + } + ; + +memreserves: + /* empty */ + { + $$ = NULL; + } + | memreserve memreserves + { + $$ = chain_reserve_entry($1, $2); + } + ; + +memreserve: + label DT_MEMRESERVE addr addr ';' + { + $$ = build_reserve_entry($3, $4, $1); + } + ; + +addr: + DT_LITERAL + { + $$ = eval_literal($1, 0, 64); + } + ; + +devicetree: + '/' nodedef + { + $$ = name_node($2, "", NULL); + } + ; + +nodedef: + '{' proplist subnodes '}' ';' + { + $$ = build_node($2, $3); + } + ; + +proplist: + /* empty */ + { + $$ = NULL; + } + | proplist propdef + { + $$ = chain_property($2, $1); + } + ; + +propdef: + label DT_PROPNODENAME '=' propdata ';' + { + $$ = build_property($2, $4, $1); + } + | label DT_PROPNODENAME ';' + { + $$ = build_property($2, empty_data, $1); + } + ; + +propdata: + propdataprefix DT_STRING + { + $$ = data_merge($1, $2); + } + | propdataprefix '<' celllist '>' + { + $$ = data_merge($1, $3); + } + | propdataprefix '[' bytestring ']' + { + $$ = data_merge($1, $3); + } + | propdataprefix DT_REF + { + $$ = data_add_marker($1, REF_PATH, $2); + } + | propdataprefix DT_INCBIN '(' DT_STRING ',' addr ',' addr ')' + { + struct search_path path = { srcpos_file->dir, NULL, NULL }; + struct dtc_file *file = dtc_open_file($4.val, &path); + struct data d = empty_data; + + if ($6 != 0) + if (fseek(file->file, $6, SEEK_SET) != 0) + srcpos_error(&yylloc, + "Couldn't seek to offset %llu in \"%s\": %s", + (unsigned long long)$6, + $4.val, + strerror(errno)); + + d = data_copy_file(file->file, $8); + + $$ = data_merge($1, d); + dtc_close_file(file); + } + | propdataprefix DT_INCBIN '(' DT_STRING ')' + { + struct search_path path = { srcpos_file->dir, NULL, NULL }; + struct dtc_file *file = dtc_open_file($4.val, &path); + struct data d = empty_data; + + d = data_copy_file(file->file, -1); + + $$ = data_merge($1, d); + dtc_close_file(file); + } + | propdata DT_LABEL + { + $$ = data_add_marker($1, LABEL, $2); + } + ; + +propdataprefix: + /* empty */ + { + $$ = empty_data; + } + | propdata ',' + { + $$ = $1; + } + | propdataprefix DT_LABEL + { + $$ = data_add_marker($1, LABEL, $2); + } + ; + +celllist: + /* empty */ + { + $$ = empty_data; + } + | celllist cellval + { + $$ = data_append_cell($1, $2); + } + | celllist DT_REF + { + $$ = data_append_cell(data_add_marker($1, REF_PHANDLE, + $2), -1); + } + | celllist DT_LABEL + { + $$ = data_add_marker($1, LABEL, $2); + } + ; + +cellval: + DT_LITERAL + { + $$ = eval_literal($1, 0, 32); + } + ; + +bytestring: + /* empty */ + { + $$ = empty_data; + } + | bytestring DT_BYTE + { + $$ = data_append_byte($1, $2); + } + | bytestring DT_LABEL + { + $$ = data_add_marker($1, LABEL, $2); + } + ; + +subnodes: + /* empty */ + { + $$ = NULL; + } + | subnode subnodes + { + $$ = chain_node($1, $2); + } + | subnode propdef + { + yyerror("syntax error: properties must precede subnodes"); + YYERROR; + } + ; + +subnode: + label DT_PROPNODENAME nodedef + { + $$ = name_node($3, $2, $1); + } + ; + +label: + /* empty */ + { + $$ = NULL; + } + | DT_LABEL + { + $$ = $1; + } + ; + +%% + +void yyerror(char const *s) +{ + srcpos_error(&yylloc, "%s", s); + treesource_error = 1; +} + +static unsigned long long eval_literal(const char *s, int base, int bits) +{ + unsigned long long val; + char *e; + + errno = 0; + val = strtoull(s, &e, base); + if (*e) + yyerror("bad characters in literal"); + else if ((errno == ERANGE) + || ((bits < 64) && (val >= (1ULL << bits)))) + yyerror("literal out of range"); + else if (errno != 0) + yyerror("bad literal"); + return val; +} diff --git a/contrib/dtc/dtc.c b/contrib/dtc/dtc.c new file mode 100644 index 000000000000..800664c70e50 --- /dev/null +++ b/contrib/dtc/dtc.c @@ -0,0 +1,247 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" +#include "srcpos.h" + +#include "version_gen.h" + +/* + * Command line options + */ +int quiet; /* Level of quietness */ +int reservenum; /* Number of memory reservation slots */ +int minsize; /* Minimum blob size */ +int padsize; /* Additional padding to blob */ +int phandle_format = PHANDLE_BOTH; /* Use linux,phandle or phandle properties */ + +char *join_path(const char *path, const char *name) +{ + int lenp = strlen(path); + int lenn = strlen(name); + int len; + int needslash = 1; + char *str; + + len = lenp + lenn + 2; + if ((lenp > 0) && (path[lenp-1] == '/')) { + needslash = 0; + len--; + } + + str = xmalloc(len); + memcpy(str, path, lenp); + if (needslash) { + str[lenp] = '/'; + lenp++; + } + memcpy(str+lenp, name, lenn+1); + return str; +} + +static void fill_fullpaths(struct node *tree, const char *prefix) +{ + struct node *child; + const char *unit; + + tree->fullpath = join_path(prefix, tree->name); + + unit = strchr(tree->name, '@'); + if (unit) + tree->basenamelen = unit - tree->name; + else + tree->basenamelen = strlen(tree->name); + + for_each_child(tree, child) + fill_fullpaths(child, tree->fullpath); +} + +static void __attribute__ ((noreturn)) usage(void) +{ + fprintf(stderr, "Usage:\n"); + fprintf(stderr, "\tdtc [options] \n"); + fprintf(stderr, "\nOptions:\n"); + fprintf(stderr, "\t-h\n"); + fprintf(stderr, "\t\tThis help text\n"); + fprintf(stderr, "\t-q\n"); + fprintf(stderr, "\t\tQuiet: -q suppress warnings, -qq errors, -qqq all\n"); + fprintf(stderr, "\t-I \n"); + fprintf(stderr, "\t\tInput formats are:\n"); + fprintf(stderr, "\t\t\tdts - device tree source text\n"); + fprintf(stderr, "\t\t\tdtb - device tree blob\n"); + fprintf(stderr, "\t\t\tfs - /proc/device-tree style directory\n"); + fprintf(stderr, "\t-o \n"); + fprintf(stderr, "\t-O \n"); + fprintf(stderr, "\t\tOutput formats are:\n"); + fprintf(stderr, "\t\t\tdts - device tree source text\n"); + fprintf(stderr, "\t\t\tdtb - device tree blob\n"); + fprintf(stderr, "\t\t\tasm - assembler source\n"); + fprintf(stderr, "\t-V \n"); + fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION); + fprintf(stderr, "\t-R \n"); + fprintf(stderr, "\t\tMake space for reserve map entries (relevant for \n\t\tdtb and asm output only)\n"); + fprintf(stderr, "\t-S \n"); + fprintf(stderr, "\t\tMake the blob at least long (extra space)\n"); + fprintf(stderr, "\t-p \n"); + fprintf(stderr, "\t\tAdd padding to the blob of long (extra space)\n"); + fprintf(stderr, "\t-b \n"); + fprintf(stderr, "\t\tSet the physical boot cpu\n"); + fprintf(stderr, "\t-f\n"); + fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n"); + fprintf(stderr, "\t-v\n"); + fprintf(stderr, "\t\tPrint DTC version and exit\n"); + fprintf(stderr, "\t-H \n"); + fprintf(stderr, "\t\tphandle formats are:\n"); + fprintf(stderr, "\t\t\tlegacy - \"linux,phandle\" properties only\n"); + fprintf(stderr, "\t\t\tepapr - \"phandle\" properties only\n"); + fprintf(stderr, "\t\t\tboth - Both \"linux,phandle\" and \"phandle\" properties\n"); + exit(3); +} + +int main(int argc, char *argv[]) +{ + struct boot_info *bi; + const char *inform = "dts"; + const char *outform = "dts"; + const char *outname = "-"; + int force = 0, check = 0; + const char *arg; + int opt; + FILE *outf = NULL; + int outversion = DEFAULT_FDT_VERSION; + long long cmdline_boot_cpuid = -1; + + quiet = 0; + reservenum = 0; + minsize = 0; + padsize = 0; + + while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:vH:")) != EOF) { + switch (opt) { + case 'I': + inform = optarg; + break; + case 'O': + outform = optarg; + break; + case 'o': + outname = optarg; + break; + case 'V': + outversion = strtol(optarg, NULL, 0); + break; + case 'R': + reservenum = strtol(optarg, NULL, 0); + break; + case 'S': + minsize = strtol(optarg, NULL, 0); + break; + case 'p': + padsize = strtol(optarg, NULL, 0); + break; + case 'f': + force = 1; + break; + case 'c': + check = 1; + break; + case 'q': + quiet++; + break; + case 'b': + cmdline_boot_cpuid = strtoll(optarg, NULL, 0); + break; + case 'v': + printf("Version: %s\n", DTC_VERSION); + exit(0); + case 'H': + if (streq(optarg, "legacy")) + phandle_format = PHANDLE_LEGACY; + else if (streq(optarg, "epapr")) + phandle_format = PHANDLE_EPAPR; + else if (streq(optarg, "both")) + phandle_format = PHANDLE_BOTH; + else + die("Invalid argument \"%s\" to -H option\n", + optarg); + break; + + case 'h': + default: + usage(); + } + } + + if (argc > (optind+1)) + usage(); + else if (argc < (optind+1)) + arg = "-"; + else + arg = argv[optind]; + + /* minsize and padsize are mutually exclusive */ + if (minsize && padsize) + die("Can't set both -p and -S\n"); + + if (minsize) + fprintf(stderr, "DTC: Use of \"-S\" is deprecated; it will be removed soon, use \"-p\" instead\n"); + + fprintf(stderr, "DTC: %s->%s on file \"%s\"\n", + inform, outform, arg); + + if (streq(inform, "dts")) + bi = dt_from_source(arg); + else if (streq(inform, "fs")) + bi = dt_from_fs(arg); + else if(streq(inform, "dtb")) + bi = dt_from_blob(arg); + else + die("Unknown input format \"%s\"\n", inform); + + if (cmdline_boot_cpuid != -1) + bi->boot_cpuid_phys = cmdline_boot_cpuid; + + fill_fullpaths(bi->dt, ""); + process_checks(force, bi); + + + if (streq(outname, "-")) { + outf = stdout; + } else { + outf = fopen(outname, "w"); + if (! outf) + die("Couldn't open output file %s: %s\n", + outname, strerror(errno)); + } + + if (streq(outform, "dts")) { + dt_to_source(outf, bi); + } else if (streq(outform, "dtb")) { + dt_to_blob(outf, bi, outversion); + } else if (streq(outform, "asm")) { + dt_to_asm(outf, bi, outversion); + } else if (streq(outform, "null")) { + /* do nothing */ + } else { + die("Unknown output format \"%s\"\n", outform); + } + + exit(0); +} diff --git a/contrib/dtc/dtc.h b/contrib/dtc/dtc.h new file mode 100644 index 000000000000..0d7f0edb9904 --- /dev/null +++ b/contrib/dtc/dtc.h @@ -0,0 +1,231 @@ +#ifndef _DTC_H +#define _DTC_H + +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "util.h" + +#ifdef DEBUG +#define debug(fmt,args...) printf(fmt, ##args) +#else +#define debug(fmt,args...) +#endif + + +#define DEFAULT_FDT_VERSION 17 + +/* + * Command line options + */ +extern int quiet; /* Level of quietness */ +extern int reservenum; /* Number of memory reservation slots */ +extern int minsize; /* Minimum blob size */ +extern int padsize; /* Additional padding to blob */ +extern int phandle_format; /* Use linux,phandle or phandle properties */ + +#define PHANDLE_LEGACY 0x1 +#define PHANDLE_EPAPR 0x2 +#define PHANDLE_BOTH 0x3 + +typedef uint32_t cell_t; + + +#define streq(a, b) (strcmp((a), (b)) == 0) +#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0) + +#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +/* Data blobs */ +enum markertype { + REF_PHANDLE, + REF_PATH, + LABEL, +}; + +struct marker { + enum markertype type; + int offset; + char *ref; + struct marker *next; +}; + +struct data { + int len; + char *val; + struct marker *markers; +}; + + +#define empty_data ((struct data){ /* all .members = 0 or NULL */ }) + +#define for_each_marker(m) \ + for (; (m); (m) = (m)->next) +#define for_each_marker_of_type(m, t) \ + for_each_marker(m) \ + if ((m)->type == (t)) + +void data_free(struct data d); + +struct data data_grow_for(struct data d, int xlen); + +struct data data_copy_mem(const char *mem, int len); +struct data data_copy_escape_string(const char *s, int len); +struct data data_copy_file(FILE *f, size_t len); + +struct data data_append_data(struct data d, const void *p, int len); +struct data data_insert_at_marker(struct data d, struct marker *m, + const void *p, int len); +struct data data_merge(struct data d1, struct data d2); +struct data data_append_cell(struct data d, cell_t word); +struct data data_append_re(struct data d, const struct fdt_reserve_entry *re); +struct data data_append_addr(struct data d, uint64_t addr); +struct data data_append_byte(struct data d, uint8_t byte); +struct data data_append_zeroes(struct data d, int len); +struct data data_append_align(struct data d, int align); + +struct data data_add_marker(struct data d, enum markertype type, char *ref); + +int data_is_one_string(struct data d); + +/* DT constraints */ + +#define MAX_PROPNAME_LEN 31 +#define MAX_NODENAME_LEN 31 + +/* Live trees */ +struct property { + char *name; + struct data val; + + struct property *next; + + char *label; +}; + +struct node { + char *name; + struct property *proplist; + struct node *children; + + struct node *parent; + struct node *next_sibling; + + char *fullpath; + int basenamelen; + + cell_t phandle; + int addr_cells, size_cells; + + char *label; +}; + +#define for_each_property(n, p) \ + for ((p) = (n)->proplist; (p); (p) = (p)->next) + +#define for_each_child(n, c) \ + for ((c) = (n)->children; (c); (c) = (c)->next_sibling) + +struct property *build_property(char *name, struct data val, char *label); +struct property *chain_property(struct property *first, struct property *list); +struct property *reverse_properties(struct property *first); + +struct node *build_node(struct property *proplist, struct node *children); +struct node *name_node(struct node *node, char *name, char *label); +struct node *chain_node(struct node *first, struct node *list); + +void add_property(struct node *node, struct property *prop); +void add_child(struct node *parent, struct node *child); + +const char *get_unitname(struct node *node); +struct property *get_property(struct node *node, const char *propname); +cell_t propval_cell(struct property *prop); +struct node *get_subnode(struct node *node, const char *nodename); +struct node *get_node_by_path(struct node *tree, const char *path); +struct node *get_node_by_label(struct node *tree, const char *label); +struct node *get_node_by_phandle(struct node *tree, cell_t phandle); +struct node *get_node_by_ref(struct node *tree, const char *ref); +cell_t get_node_phandle(struct node *root, struct node *node); + +/* Boot info (tree plus memreserve information */ + +struct reserve_info { + struct fdt_reserve_entry re; + + struct reserve_info *next; + + char *label; +}; + +struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len, char *label); +struct reserve_info *chain_reserve_entry(struct reserve_info *first, + struct reserve_info *list); +struct reserve_info *add_reserve_entry(struct reserve_info *list, + struct reserve_info *new); + + +struct boot_info { + struct reserve_info *reservelist; + struct node *dt; /* the device tree */ + uint32_t boot_cpuid_phys; +}; + +struct boot_info *build_boot_info(struct reserve_info *reservelist, + struct node *tree, uint32_t boot_cpuid_phys); + +/* Checks */ + +void process_checks(int force, struct boot_info *bi); + +/* Flattened trees */ + +void dt_to_blob(FILE *f, struct boot_info *bi, int version); +void dt_to_asm(FILE *f, struct boot_info *bi, int version); + +struct boot_info *dt_from_blob(const char *fname); + +/* Tree source */ + +void dt_to_source(FILE *f, struct boot_info *bi); +struct boot_info *dt_from_source(const char *f); + +/* FS trees */ + +struct boot_info *dt_from_fs(const char *dirname); + +/* misc */ + +char *join_path(const char *path, const char *name); + +#endif /* _DTC_H */ diff --git a/contrib/dtc/flattree.c b/contrib/dtc/flattree.c new file mode 100644 index 000000000000..3eb0201acb58 --- /dev/null +++ b/contrib/dtc/flattree.c @@ -0,0 +1,927 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" +#include "srcpos.h" + +#define FTF_FULLPATH 0x1 +#define FTF_VARALIGN 0x2 +#define FTF_NAMEPROPS 0x4 +#define FTF_BOOTCPUID 0x8 +#define FTF_STRTABSIZE 0x10 +#define FTF_STRUCTSIZE 0x20 +#define FTF_NOPS 0x40 + +static struct version_info { + int version; + int last_comp_version; + int hdr_size; + int flags; +} version_table[] = { + {1, 1, FDT_V1_SIZE, + FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS}, + {2, 1, FDT_V2_SIZE, + FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID}, + {3, 1, FDT_V3_SIZE, + FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID|FTF_STRTABSIZE}, + {16, 16, FDT_V3_SIZE, + FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_NOPS}, + {17, 16, FDT_V17_SIZE, + FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_STRUCTSIZE|FTF_NOPS}, +}; + +struct emitter { + void (*cell)(void *, cell_t); + void (*string)(void *, char *, int); + void (*align)(void *, int); + void (*data)(void *, struct data); + void (*beginnode)(void *, const char *); + void (*endnode)(void *, const char *); + void (*property)(void *, const char *); +}; + +static void bin_emit_cell(void *e, cell_t val) +{ + struct data *dtbuf = e; + + *dtbuf = data_append_cell(*dtbuf, val); +} + +static void bin_emit_string(void *e, char *str, int len) +{ + struct data *dtbuf = e; + + if (len == 0) + len = strlen(str); + + *dtbuf = data_append_data(*dtbuf, str, len); + *dtbuf = data_append_byte(*dtbuf, '\0'); +} + +static void bin_emit_align(void *e, int a) +{ + struct data *dtbuf = e; + + *dtbuf = data_append_align(*dtbuf, a); +} + +static void bin_emit_data(void *e, struct data d) +{ + struct data *dtbuf = e; + + *dtbuf = data_append_data(*dtbuf, d.val, d.len); +} + +static void bin_emit_beginnode(void *e, const char *label) +{ + bin_emit_cell(e, FDT_BEGIN_NODE); +} + +static void bin_emit_endnode(void *e, const char *label) +{ + bin_emit_cell(e, FDT_END_NODE); +} + +static void bin_emit_property(void *e, const char *label) +{ + bin_emit_cell(e, FDT_PROP); +} + +static struct emitter bin_emitter = { + .cell = bin_emit_cell, + .string = bin_emit_string, + .align = bin_emit_align, + .data = bin_emit_data, + .beginnode = bin_emit_beginnode, + .endnode = bin_emit_endnode, + .property = bin_emit_property, +}; + +static void emit_label(FILE *f, const char *prefix, const char *label) +{ + fprintf(f, "\t.globl\t%s_%s\n", prefix, label); + fprintf(f, "%s_%s:\n", prefix, label); + fprintf(f, "_%s_%s:\n", prefix, label); +} + +static void emit_offset_label(FILE *f, const char *label, int offset) +{ + fprintf(f, "\t.globl\t%s\n", label); + fprintf(f, "%s\t= . + %d\n", label, offset); +} + +#define ASM_EMIT_BELONG(f, fmt, ...) \ + { \ + fprintf((f), "\t.byte\t((" fmt ") >> 24) & 0xff\n", __VA_ARGS__); \ + fprintf((f), "\t.byte\t((" fmt ") >> 16) & 0xff\n", __VA_ARGS__); \ + fprintf((f), "\t.byte\t((" fmt ") >> 8) & 0xff\n", __VA_ARGS__); \ + fprintf((f), "\t.byte\t(" fmt ") & 0xff\n", __VA_ARGS__); \ + } + +static void asm_emit_cell(void *e, cell_t val) +{ + FILE *f = e; + + fprintf(f, "\t.byte 0x%02x; .byte 0x%02x; .byte 0x%02x; .byte 0x%02x\n", + (val >> 24) & 0xff, (val >> 16) & 0xff, + (val >> 8) & 0xff, val & 0xff); +} + +static void asm_emit_string(void *e, char *str, int len) +{ + FILE *f = e; + char c = 0; + + if (len != 0) { + /* XXX: ewww */ + c = str[len]; + str[len] = '\0'; + } + + fprintf(f, "\t.string\t\"%s\"\n", str); + + if (len != 0) { + str[len] = c; + } +} + +static void asm_emit_align(void *e, int a) +{ + FILE *f = e; + + fprintf(f, "\t.balign\t%d, 0\n", a); +} + +static void asm_emit_data(void *e, struct data d) +{ + FILE *f = e; + int off = 0; + struct marker *m = d.markers; + + for_each_marker_of_type(m, LABEL) + emit_offset_label(f, m->ref, m->offset); + + while ((d.len - off) >= sizeof(uint32_t)) { + asm_emit_cell(e, fdt32_to_cpu(*((uint32_t *)(d.val+off)))); + off += sizeof(uint32_t); + } + + while ((d.len - off) >= 1) { + fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]); + off += 1; + } + + assert(off == d.len); +} + +static void asm_emit_beginnode(void *e, const char *label) +{ + FILE *f = e; + + if (label) { + fprintf(f, "\t.globl\t%s\n", label); + fprintf(f, "%s:\n", label); + } + fprintf(f, "\t/* FDT_BEGIN_NODE */\n"); + asm_emit_cell(e, FDT_BEGIN_NODE); +} + +static void asm_emit_endnode(void *e, const char *label) +{ + FILE *f = e; + + fprintf(f, "\t/* FDT_END_NODE */\n"); + asm_emit_cell(e, FDT_END_NODE); + if (label) { + fprintf(f, "\t.globl\t%s_end\n", label); + fprintf(f, "%s_end:\n", label); + } +} + +static void asm_emit_property(void *e, const char *label) +{ + FILE *f = e; + + if (label) { + fprintf(f, "\t.globl\t%s\n", label); + fprintf(f, "%s:\n", label); + } + fprintf(f, "\t/* FDT_PROP */\n"); + asm_emit_cell(e, FDT_PROP); +} + +static struct emitter asm_emitter = { + .cell = asm_emit_cell, + .string = asm_emit_string, + .align = asm_emit_align, + .data = asm_emit_data, + .beginnode = asm_emit_beginnode, + .endnode = asm_emit_endnode, + .property = asm_emit_property, +}; + +static int stringtable_insert(struct data *d, const char *str) +{ + int i; + + /* FIXME: do this more efficiently? */ + + for (i = 0; i < d->len; i++) { + if (streq(str, d->val + i)) + return i; + } + + *d = data_append_data(*d, str, strlen(str)+1); + return i; +} + +static void flatten_tree(struct node *tree, struct emitter *emit, + void *etarget, struct data *strbuf, + struct version_info *vi) +{ + struct property *prop; + struct node *child; + int seen_name_prop = 0; + + emit->beginnode(etarget, tree->label); + + if (vi->flags & FTF_FULLPATH) + emit->string(etarget, tree->fullpath, 0); + else + emit->string(etarget, tree->name, 0); + + emit->align(etarget, sizeof(cell_t)); + + for_each_property(tree, prop) { + int nameoff; + + if (streq(prop->name, "name")) + seen_name_prop = 1; + + nameoff = stringtable_insert(strbuf, prop->name); + + emit->property(etarget, prop->label); + emit->cell(etarget, prop->val.len); + emit->cell(etarget, nameoff); + + if ((vi->flags & FTF_VARALIGN) && (prop->val.len >= 8)) + emit->align(etarget, 8); + + emit->data(etarget, prop->val); + emit->align(etarget, sizeof(cell_t)); + } + + if ((vi->flags & FTF_NAMEPROPS) && !seen_name_prop) { + emit->property(etarget, NULL); + emit->cell(etarget, tree->basenamelen+1); + emit->cell(etarget, stringtable_insert(strbuf, "name")); + + if ((vi->flags & FTF_VARALIGN) && ((tree->basenamelen+1) >= 8)) + emit->align(etarget, 8); + + emit->string(etarget, tree->name, tree->basenamelen); + emit->align(etarget, sizeof(cell_t)); + } + + for_each_child(tree, child) { + flatten_tree(child, emit, etarget, strbuf, vi); + } + + emit->endnode(etarget, tree->label); +} + +static struct data flatten_reserve_list(struct reserve_info *reservelist, + struct version_info *vi) +{ + struct reserve_info *re; + struct data d = empty_data; + static struct fdt_reserve_entry null_re = {0,0}; + int j; + + for (re = reservelist; re; re = re->next) { + d = data_append_re(d, &re->re); + } + /* + * Add additional reserved slots if the user asked for them. + */ + for (j = 0; j < reservenum; j++) { + d = data_append_re(d, &null_re); + } + + return d; +} + +static void make_fdt_header(struct fdt_header *fdt, + struct version_info *vi, + int reservesize, int dtsize, int strsize, + int boot_cpuid_phys) +{ + int reserve_off; + + reservesize += sizeof(struct fdt_reserve_entry); + + memset(fdt, 0xff, sizeof(*fdt)); + + fdt->magic = cpu_to_fdt32(FDT_MAGIC); + fdt->version = cpu_to_fdt32(vi->version); + fdt->last_comp_version = cpu_to_fdt32(vi->last_comp_version); + + /* Reserve map should be doubleword aligned */ + reserve_off = ALIGN(vi->hdr_size, 8); + + fdt->off_mem_rsvmap = cpu_to_fdt32(reserve_off); + fdt->off_dt_struct = cpu_to_fdt32(reserve_off + reservesize); + fdt->off_dt_strings = cpu_to_fdt32(reserve_off + reservesize + + dtsize); + fdt->totalsize = cpu_to_fdt32(reserve_off + reservesize + dtsize + strsize); + + if (vi->flags & FTF_BOOTCPUID) + fdt->boot_cpuid_phys = cpu_to_fdt32(boot_cpuid_phys); + if (vi->flags & FTF_STRTABSIZE) + fdt->size_dt_strings = cpu_to_fdt32(strsize); + if (vi->flags & FTF_STRUCTSIZE) + fdt->size_dt_struct = cpu_to_fdt32(dtsize); +} + +void dt_to_blob(FILE *f, struct boot_info *bi, int version) +{ + struct version_info *vi = NULL; + int i; + struct data blob = empty_data; + struct data reservebuf = empty_data; + struct data dtbuf = empty_data; + struct data strbuf = empty_data; + struct fdt_header fdt; + int padlen = 0; + + for (i = 0; i < ARRAY_SIZE(version_table); i++) { + if (version_table[i].version == version) + vi = &version_table[i]; + } + if (!vi) + die("Unknown device tree blob version %d\n", version); + + flatten_tree(bi->dt, &bin_emitter, &dtbuf, &strbuf, vi); + bin_emit_cell(&dtbuf, FDT_END); + + reservebuf = flatten_reserve_list(bi->reservelist, vi); + + /* Make header */ + make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len, + bi->boot_cpuid_phys); + + /* + * If the user asked for more space than is used, adjust the totalsize. + */ + if (minsize > 0) { + padlen = minsize - fdt32_to_cpu(fdt.totalsize); + if ((padlen < 0) && (quiet < 1)) + fprintf(stderr, + "Warning: blob size %d >= minimum size %d\n", + fdt32_to_cpu(fdt.totalsize), minsize); + } + + if (padsize > 0) + padlen = padsize; + + if (padlen > 0) { + int tsize = fdt32_to_cpu(fdt.totalsize); + tsize += padlen; + fdt.totalsize = cpu_to_fdt32(tsize); + } + + /* + * Assemble the blob: start with the header, add with alignment + * the reserve buffer, add the reserve map terminating zeroes, + * the device tree itself, and finally the strings. + */ + blob = data_append_data(blob, &fdt, vi->hdr_size); + blob = data_append_align(blob, 8); + blob = data_merge(blob, reservebuf); + blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry)); + blob = data_merge(blob, dtbuf); + blob = data_merge(blob, strbuf); + + /* + * If the user asked for more space than is used, pad out the blob. + */ + if (padlen > 0) + blob = data_append_zeroes(blob, padlen); + + if (fwrite(blob.val, blob.len, 1, f) != 1) { + if (ferror(f)) + die("Error writing device tree blob: %s\n", + strerror(errno)); + else + die("Short write on device tree blob\n"); + } + + /* + * data_merge() frees the right-hand element so only the blob + * remains to be freed. + */ + data_free(blob); +} + +static void dump_stringtable_asm(FILE *f, struct data strbuf) +{ + const char *p; + int len; + + p = strbuf.val; + + while (p < (strbuf.val + strbuf.len)) { + len = strlen(p); + fprintf(f, "\t.string \"%s\"\n", p); + p += len+1; + } +} + +void dt_to_asm(FILE *f, struct boot_info *bi, int version) +{ + struct version_info *vi = NULL; + int i; + struct data strbuf = empty_data; + struct reserve_info *re; + const char *symprefix = "dt"; + + for (i = 0; i < ARRAY_SIZE(version_table); i++) { + if (version_table[i].version == version) + vi = &version_table[i]; + } + if (!vi) + die("Unknown device tree blob version %d\n", version); + + fprintf(f, "/* autogenerated by dtc, do not edit */\n\n"); + + emit_label(f, symprefix, "blob_start"); + emit_label(f, symprefix, "header"); + fprintf(f, "\t/* magic */\n"); + asm_emit_cell(f, FDT_MAGIC); + fprintf(f, "\t/* totalsize */\n"); + ASM_EMIT_BELONG(f, "_%s_blob_abs_end - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* off_dt_struct */\n"); + ASM_EMIT_BELONG(f, "_%s_struct_start - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* off_dt_strings */\n"); + ASM_EMIT_BELONG(f, "_%s_strings_start - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* off_mem_rsvmap */\n"); + ASM_EMIT_BELONG(f, "_%s_reserve_map - _%s_blob_start", + symprefix, symprefix); + fprintf(f, "\t/* version */\n"); + asm_emit_cell(f, vi->version); + fprintf(f, "\t/* last_comp_version */\n"); + asm_emit_cell(f, vi->last_comp_version); + + if (vi->flags & FTF_BOOTCPUID) { + fprintf(f, "\t/* boot_cpuid_phys */\n"); + asm_emit_cell(f, bi->boot_cpuid_phys); + } + + if (vi->flags & FTF_STRTABSIZE) { + fprintf(f, "\t/* size_dt_strings */\n"); + ASM_EMIT_BELONG(f, "_%s_strings_end - _%s_strings_start", + symprefix, symprefix); + } + + if (vi->flags & FTF_STRUCTSIZE) { + fprintf(f, "\t/* size_dt_struct */\n"); + ASM_EMIT_BELONG(f, "_%s_struct_end - _%s_struct_start", + symprefix, symprefix); + } + + /* + * Reserve map entries. + * Align the reserve map to a doubleword boundary. + * Each entry is an (address, size) pair of u64 values. + * Always supply a zero-sized temination entry. + */ + asm_emit_align(f, 8); + emit_label(f, symprefix, "reserve_map"); + + fprintf(f, "/* Memory reserve map from source file */\n"); + + /* + * Use .long on high and low halfs of u64s to avoid .quad + * as it appears .quad isn't available in some assemblers. + */ + for (re = bi->reservelist; re; re = re->next) { + if (re->label) { + fprintf(f, "\t.globl\t%s\n", re->label); + fprintf(f, "%s:\n", re->label); + } + ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.address >> 32)); + ASM_EMIT_BELONG(f, "0x%08x", + (unsigned int)(re->re.address & 0xffffffff)); + ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32)); + ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff)); + } + for (i = 0; i < reservenum; i++) { + fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); + } + + fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); + + emit_label(f, symprefix, "struct_start"); + flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi); + + fprintf(f, "\t/* FDT_END */\n"); + asm_emit_cell(f, FDT_END); + emit_label(f, symprefix, "struct_end"); + + emit_label(f, symprefix, "strings_start"); + dump_stringtable_asm(f, strbuf); + emit_label(f, symprefix, "strings_end"); + + emit_label(f, symprefix, "blob_end"); + + /* + * If the user asked for more space than is used, pad it out. + */ + if (minsize > 0) { + fprintf(f, "\t.space\t%d - (_%s_blob_end - _%s_blob_start), 0\n", + minsize, symprefix, symprefix); + } + if (padsize > 0) { + fprintf(f, "\t.space\t%d, 0\n", padsize); + } + emit_label(f, symprefix, "blob_abs_end"); + + data_free(strbuf); +} + +struct inbuf { + char *base, *limit, *ptr; +}; + +static void inbuf_init(struct inbuf *inb, void *base, void *limit) +{ + inb->base = base; + inb->limit = limit; + inb->ptr = inb->base; +} + +static void flat_read_chunk(struct inbuf *inb, void *p, int len) +{ + if ((inb->ptr + len) > inb->limit) + die("Premature end of data parsing flat device tree\n"); + + memcpy(p, inb->ptr, len); + + inb->ptr += len; +} + +static uint32_t flat_read_word(struct inbuf *inb) +{ + uint32_t val; + + assert(((inb->ptr - inb->base) % sizeof(val)) == 0); + + flat_read_chunk(inb, &val, sizeof(val)); + + return fdt32_to_cpu(val); +} + +static void flat_realign(struct inbuf *inb, int align) +{ + int off = inb->ptr - inb->base; + + inb->ptr = inb->base + ALIGN(off, align); + if (inb->ptr > inb->limit) + die("Premature end of data parsing flat device tree\n"); +} + +static char *flat_read_string(struct inbuf *inb) +{ + int len = 0; + const char *p = inb->ptr; + char *str; + + do { + if (p >= inb->limit) + die("Premature end of data parsing flat device tree\n"); + len++; + } while ((*p++) != '\0'); + + str = xstrdup(inb->ptr); + + inb->ptr += len; + + flat_realign(inb, sizeof(uint32_t)); + + return str; +} + +static struct data flat_read_data(struct inbuf *inb, int len) +{ + struct data d = empty_data; + + if (len == 0) + return empty_data; + + d = data_grow_for(d, len); + d.len = len; + + flat_read_chunk(inb, d.val, len); + + flat_realign(inb, sizeof(uint32_t)); + + return d; +} + +static char *flat_read_stringtable(struct inbuf *inb, int offset) +{ + const char *p; + + p = inb->base + offset; + while (1) { + if (p >= inb->limit || p < inb->base) + die("String offset %d overruns string table\n", + offset); + + if (*p == '\0') + break; + + p++; + } + + return xstrdup(inb->base + offset); +} + +static struct property *flat_read_property(struct inbuf *dtbuf, + struct inbuf *strbuf, int flags) +{ + uint32_t proplen, stroff; + char *name; + struct data val; + + proplen = flat_read_word(dtbuf); + stroff = flat_read_word(dtbuf); + + name = flat_read_stringtable(strbuf, stroff); + + if ((flags & FTF_VARALIGN) && (proplen >= 8)) + flat_realign(dtbuf, 8); + + val = flat_read_data(dtbuf, proplen); + + return build_property(name, val, NULL); +} + + +static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb) +{ + struct reserve_info *reservelist = NULL; + struct reserve_info *new; + const char *p; + struct fdt_reserve_entry re; + + /* + * Each entry is a pair of u64 (addr, size) values for 4 cell_t's. + * List terminates at an entry with size equal to zero. + * + * First pass, count entries. + */ + p = inb->ptr; + while (1) { + flat_read_chunk(inb, &re, sizeof(re)); + re.address = fdt64_to_cpu(re.address); + re.size = fdt64_to_cpu(re.size); + if (re.size == 0) + break; + + new = build_reserve_entry(re.address, re.size, NULL); + reservelist = add_reserve_entry(reservelist, new); + } + + return reservelist; +} + + +static char *nodename_from_path(const char *ppath, const char *cpath) +{ + int plen; + + plen = strlen(ppath); + + if (!strneq(ppath, cpath, plen)) + die("Path \"%s\" is not valid as a child of \"%s\"\n", + cpath, ppath); + + /* root node is a special case */ + if (!streq(ppath, "/")) + plen++; + + return xstrdup(cpath + plen); +} + +static struct node *unflatten_tree(struct inbuf *dtbuf, + struct inbuf *strbuf, + const char *parent_flatname, int flags) +{ + struct node *node; + char *flatname; + uint32_t val; + + node = build_node(NULL, NULL); + + flatname = flat_read_string(dtbuf); + + if (flags & FTF_FULLPATH) + node->name = nodename_from_path(parent_flatname, flatname); + else + node->name = flatname; + + do { + struct property *prop; + struct node *child; + + val = flat_read_word(dtbuf); + switch (val) { + case FDT_PROP: + if (node->children) + fprintf(stderr, "Warning: Flat tree input has " + "subnodes preceding a property.\n"); + prop = flat_read_property(dtbuf, strbuf, flags); + add_property(node, prop); + break; + + case FDT_BEGIN_NODE: + child = unflatten_tree(dtbuf,strbuf, flatname, flags); + add_child(node, child); + break; + + case FDT_END_NODE: + break; + + case FDT_END: + die("Premature FDT_END in device tree blob\n"); + break; + + case FDT_NOP: + if (!(flags & FTF_NOPS)) + fprintf(stderr, "Warning: NOP tag found in flat tree" + " version <16\n"); + + /* Ignore */ + break; + + default: + die("Invalid opcode word %08x in device tree blob\n", + val); + } + } while (val != FDT_END_NODE); + + return node; +} + + +struct boot_info *dt_from_blob(const char *fname) +{ + struct dtc_file *dtcf; + uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys; + uint32_t off_dt, off_str, off_mem_rsvmap; + int rc; + char *blob; + struct fdt_header *fdt; + char *p; + struct inbuf dtbuf, strbuf; + struct inbuf memresvbuf; + int sizeleft; + struct reserve_info *reservelist; + struct node *tree; + uint32_t val; + int flags = 0; + + dtcf = dtc_open_file(fname, NULL); + + rc = fread(&magic, sizeof(magic), 1, dtcf->file); + if (ferror(dtcf->file)) + die("Error reading DT blob magic number: %s\n", + strerror(errno)); + if (rc < 1) { + if (feof(dtcf->file)) + die("EOF reading DT blob magic number\n"); + else + die("Mysterious short read reading magic number\n"); + } + + magic = fdt32_to_cpu(magic); + if (magic != FDT_MAGIC) + die("Blob has incorrect magic number\n"); + + rc = fread(&totalsize, sizeof(totalsize), 1, dtcf->file); + if (ferror(dtcf->file)) + die("Error reading DT blob size: %s\n", strerror(errno)); + if (rc < 1) { + if (feof(dtcf->file)) + die("EOF reading DT blob size\n"); + else + die("Mysterious short read reading blob size\n"); + } + + totalsize = fdt32_to_cpu(totalsize); + if (totalsize < FDT_V1_SIZE) + die("DT blob size (%d) is too small\n", totalsize); + + blob = xmalloc(totalsize); + + fdt = (struct fdt_header *)blob; + fdt->magic = cpu_to_fdt32(magic); + fdt->totalsize = cpu_to_fdt32(totalsize); + + sizeleft = totalsize - sizeof(magic) - sizeof(totalsize); + p = blob + sizeof(magic) + sizeof(totalsize); + + while (sizeleft) { + if (feof(dtcf->file)) + die("EOF before reading %d bytes of DT blob\n", + totalsize); + + rc = fread(p, 1, sizeleft, dtcf->file); + if (ferror(dtcf->file)) + die("Error reading DT blob: %s\n", + strerror(errno)); + + sizeleft -= rc; + p += rc; + } + + off_dt = fdt32_to_cpu(fdt->off_dt_struct); + off_str = fdt32_to_cpu(fdt->off_dt_strings); + off_mem_rsvmap = fdt32_to_cpu(fdt->off_mem_rsvmap); + version = fdt32_to_cpu(fdt->version); + boot_cpuid_phys = fdt32_to_cpu(fdt->boot_cpuid_phys); + + if (off_mem_rsvmap >= totalsize) + die("Mem Reserve structure offset exceeds total size\n"); + + if (off_dt >= totalsize) + die("DT structure offset exceeds total size\n"); + + if (off_str > totalsize) + die("String table offset exceeds total size\n"); + + if (version >= 3) { + uint32_t size_str = fdt32_to_cpu(fdt->size_dt_strings); + if (off_str+size_str > totalsize) + die("String table extends past total size\n"); + inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str); + } else { + inbuf_init(&strbuf, blob + off_str, blob + totalsize); + } + + if (version >= 17) { + size_dt = fdt32_to_cpu(fdt->size_dt_struct); + if (off_dt+size_dt > totalsize) + die("Structure block extends past total size\n"); + } + + if (version < 16) { + flags |= FTF_FULLPATH | FTF_NAMEPROPS | FTF_VARALIGN; + } else { + flags |= FTF_NOPS; + } + + inbuf_init(&memresvbuf, + blob + off_mem_rsvmap, blob + totalsize); + inbuf_init(&dtbuf, blob + off_dt, blob + totalsize); + + reservelist = flat_read_mem_reserve(&memresvbuf); + + val = flat_read_word(&dtbuf); + + if (val != FDT_BEGIN_NODE) + die("Device tree blob doesn't begin with FDT_BEGIN_NODE (begins with 0x%08x)\n", val); + + tree = unflatten_tree(&dtbuf, &strbuf, "", flags); + + val = flat_read_word(&dtbuf); + if (val != FDT_END) + die("Device tree blob doesn't end with FDT_END\n"); + + free(blob); + + dtc_close_file(dtcf); + + return build_boot_info(reservelist, tree, boot_cpuid_phys); +} diff --git a/contrib/dtc/fstree.c b/contrib/dtc/fstree.c new file mode 100644 index 000000000000..7aee982e932b --- /dev/null +++ b/contrib/dtc/fstree.c @@ -0,0 +1,92 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" + +#include +#include + +static struct node *read_fstree(const char *dirname) +{ + DIR *d; + struct dirent *de; + struct stat st; + struct node *tree; + + d = opendir(dirname); + if (!d) + die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno)); + + tree = build_node(NULL, NULL); + + while ((de = readdir(d)) != NULL) { + char *tmpnam; + + if (streq(de->d_name, ".") + || streq(de->d_name, "..")) + continue; + + tmpnam = join_path(dirname, de->d_name); + + if (lstat(tmpnam, &st) < 0) + die("stat(%s): %s\n", tmpnam, strerror(errno)); + + if (S_ISREG(st.st_mode)) { + struct property *prop; + FILE *pfile; + + pfile = fopen(tmpnam, "r"); + if (! pfile) { + fprintf(stderr, + "WARNING: Cannot open %s: %s\n", + tmpnam, strerror(errno)); + } else { + prop = build_property(xstrdup(de->d_name), + data_copy_file(pfile, + st.st_size), + NULL); + add_property(tree, prop); + fclose(pfile); + } + } else if (S_ISDIR(st.st_mode)) { + struct node *newchild; + + newchild = read_fstree(tmpnam); + newchild = name_node(newchild, xstrdup(de->d_name), + NULL); + add_child(tree, newchild); + } + + free(tmpnam); + } + + return tree; +} + +struct boot_info *dt_from_fs(const char *dirname) +{ + struct node *tree; + + tree = read_fstree(dirname); + tree = name_node(tree, "", NULL); + + return build_boot_info(NULL, tree, 0); +} + diff --git a/contrib/dtc/ftdump.c b/contrib/dtc/ftdump.c new file mode 100644 index 000000000000..bce653573edc --- /dev/null +++ b/contrib/dtc/ftdump.c @@ -0,0 +1,208 @@ +/* + * ftdump.c - Contributed by Pantelis Antoniou + */ + +#include +#include +#include +#include +#include + +#include +#include + +#define FTDUMP_BUF_SIZE 65536 + +#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1)) +#define PALIGN(p, a) ((void *)(ALIGN((unsigned long)(p), (a)))) +#define GET_CELL(p) (p += 4, *((const uint32_t *)(p-4))) + +static int is_printable_string(const void *data, int len) +{ + const char *s = data; + const char *ss; + + /* zero length is not */ + if (len == 0) + return 0; + + /* must terminate with zero */ + if (s[len - 1] != '\0') + return 0; + + ss = s; + while (*s && isprint(*s)) + s++; + + /* not zero, or not done yet */ + if (*s != '\0' || (s + 1 - ss) < len) + return 0; + + return 1; +} + +static void print_data(const char *data, int len) +{ + int i; + const char *p = data; + + /* no data, don't print */ + if (len == 0) + return; + + if (is_printable_string(data, len)) { + printf(" = \"%s\"", (const char *)data); + } else if ((len % 4) == 0) { + printf(" = <"); + for (i = 0; i < len; i += 4) + printf("0x%08x%s", fdt32_to_cpu(GET_CELL(p)), + i < (len - 4) ? " " : ""); + printf(">"); + } else { + printf(" = ["); + for (i = 0; i < len; i++) + printf("%02x%s", *p++, i < len - 1 ? " " : ""); + printf("]"); + } +} + +static void dump_blob(void *blob) +{ + struct fdt_header *bph = blob; + uint32_t off_mem_rsvmap = fdt32_to_cpu(bph->off_mem_rsvmap); + uint32_t off_dt = fdt32_to_cpu(bph->off_dt_struct); + uint32_t off_str = fdt32_to_cpu(bph->off_dt_strings); + struct fdt_reserve_entry *p_rsvmap = + (struct fdt_reserve_entry *)((char *)blob + off_mem_rsvmap); + const char *p_struct = (const char *)blob + off_dt; + const char *p_strings = (const char *)blob + off_str; + uint32_t version = fdt32_to_cpu(bph->version); + uint32_t totalsize = fdt32_to_cpu(bph->totalsize); + uint32_t tag; + const char *p, *s, *t; + int depth, sz, shift; + int i; + uint64_t addr, size; + + depth = 0; + shift = 4; + + printf("/dts-v1/;\n"); + printf("// magic:\t\t0x%x\n", fdt32_to_cpu(bph->magic)); + printf("// totalsize:\t\t0x%x (%d)\n", totalsize, totalsize); + printf("// off_dt_struct:\t0x%x\n", off_dt); + printf("// off_dt_strings:\t0x%x\n", off_str); + printf("// off_mem_rsvmap:\t0x%x\n", off_mem_rsvmap); + printf("// version:\t\t%d\n", version); + printf("// last_comp_version:\t%d\n", + fdt32_to_cpu(bph->last_comp_version)); + if (version >= 2) + printf("// boot_cpuid_phys:\t0x%x\n", + fdt32_to_cpu(bph->boot_cpuid_phys)); + + if (version >= 3) + printf("// size_dt_strings:\t0x%x\n", + fdt32_to_cpu(bph->size_dt_strings)); + if (version >= 17) + printf("// size_dt_struct:\t0x%x\n", + fdt32_to_cpu(bph->size_dt_struct)); + printf("\n"); + + for (i = 0; ; i++) { + addr = fdt64_to_cpu(p_rsvmap[i].address); + size = fdt64_to_cpu(p_rsvmap[i].size); + if (addr == 0 && size == 0) + break; + + printf("/memreserve/ %llx %llx;\n", + (unsigned long long)addr, (unsigned long long)size); + } + + p = p_struct; + while ((tag = fdt32_to_cpu(GET_CELL(p))) != FDT_END) { + + /* printf("tag: 0x%08x (%d)\n", tag, p - p_struct); */ + + if (tag == FDT_BEGIN_NODE) { + s = p; + p = PALIGN(p + strlen(s) + 1, 4); + + if (*s == '\0') + s = "/"; + + printf("%*s%s {\n", depth * shift, "", s); + + depth++; + continue; + } + + if (tag == FDT_END_NODE) { + depth--; + + printf("%*s};\n", depth * shift, ""); + continue; + } + + if (tag == FDT_NOP) { + printf("%*s// [NOP]\n", depth * shift, ""); + continue; + } + + if (tag != FDT_PROP) { + fprintf(stderr, "%*s ** Unknown tag 0x%08x\n", depth * shift, "", tag); + break; + } + sz = fdt32_to_cpu(GET_CELL(p)); + s = p_strings + fdt32_to_cpu(GET_CELL(p)); + if (version < 16 && sz >= 8) + p = PALIGN(p, 8); + t = p; + + p = PALIGN(p + sz, 4); + + printf("%*s%s", depth * shift, "", s); + print_data(t, sz); + printf(";\n"); + } +} + + +int main(int argc, char *argv[]) +{ + FILE *fp; + char *buf; + int size; + + if (argc < 2) { + fprintf(stderr, "supply input filename\n"); + return 5; + } + + if (strcmp(argv[1], "-") == 0) { + fp = stdin; + } else { + fp = fopen(argv[1], "rb"); + if (fp == NULL) { + fprintf(stderr, "unable to open %s\n", argv[1]); + return 10; + } + } + + buf = malloc(FTDUMP_BUF_SIZE); + if (!buf) { + fprintf(stderr, "Couldn't allocate %d byte buffer\n", FTDUMP_BUF_SIZE); + return 10; + } + + size = fread(buf, 1, FTDUMP_BUF_SIZE, fp); + if (size == FTDUMP_BUF_SIZE) { + fprintf(stderr, "file too large (maximum is %d bytes)\n", FTDUMP_BUF_SIZE); + return 10; + } + + dump_blob(buf); + + fclose(fp); + + return 0; +} diff --git a/contrib/dtc/libfdt/Makefile.libfdt b/contrib/dtc/libfdt/Makefile.libfdt new file mode 100644 index 000000000000..341c803215fd --- /dev/null +++ b/contrib/dtc/libfdt/Makefile.libfdt @@ -0,0 +1,9 @@ +# Makefile.libfdt +# +# This is not a complete Makefile of itself. Instead, it is designed to +# be easily embeddable into other systems of Makefiles. +# +LIBFDT_INCLUDES = fdt.h libfdt.h +LIBFDT_VERSION = version.lds +LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c +LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o) diff --git a/contrib/dtc/libfdt/TODO b/contrib/dtc/libfdt/TODO new file mode 100644 index 000000000000..288437e394fc --- /dev/null +++ b/contrib/dtc/libfdt/TODO @@ -0,0 +1,3 @@ +- Tree traversal functions +- Graft function +- Complete libfdt.h documenting comments diff --git a/contrib/dtc/libfdt/fdt.c b/contrib/dtc/libfdt/fdt.c new file mode 100644 index 000000000000..b1130c2b8c43 --- /dev/null +++ b/contrib/dtc/libfdt/fdt.c @@ -0,0 +1,213 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +int fdt_check_header(const void *fdt) +{ + if (fdt_magic(fdt) == FDT_MAGIC) { + /* Complete tree */ + if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + } else if (fdt_magic(fdt) == FDT_SW_MAGIC) { + /* Unfinished sequential-write blob */ + if (fdt_size_dt_struct(fdt) == 0) + return -FDT_ERR_BADSTATE; + } else { + return -FDT_ERR_BADMAGIC; + } + + return 0; +} + +const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) +{ + const char *p; + + if (fdt_version(fdt) >= 0x11) + if (((offset + len) < offset) + || ((offset + len) > fdt_size_dt_struct(fdt))) + return NULL; + + p = _fdt_offset_ptr(fdt, offset); + + if (p + len < p) + return NULL; + return p; +} + +uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) +{ + const uint32_t *tagp, *lenp; + uint32_t tag; + int offset = startoffset; + const char *p; + + *nextoffset = -FDT_ERR_TRUNCATED; + tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE); + if (!tagp) + return FDT_END; /* premature end */ + tag = fdt32_to_cpu(*tagp); + offset += FDT_TAGSIZE; + + *nextoffset = -FDT_ERR_BADSTRUCTURE; + switch (tag) { + case FDT_BEGIN_NODE: + /* skip name */ + do { + p = fdt_offset_ptr(fdt, offset++, 1); + } while (p && (*p != '\0')); + if (!p) + return FDT_END; /* premature end */ + break; + + case FDT_PROP: + lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp)); + if (!lenp) + return FDT_END; /* premature end */ + /* skip-name offset, length and value */ + offset += sizeof(struct fdt_property) - FDT_TAGSIZE + + fdt32_to_cpu(*lenp); + break; + + case FDT_END: + case FDT_END_NODE: + case FDT_NOP: + break; + + default: + return FDT_END; + } + + if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset)) + return FDT_END; /* premature end */ + + *nextoffset = FDT_TAGALIGN(offset); + return tag; +} + +int _fdt_check_node_offset(const void *fdt, int offset) +{ + if ((offset < 0) || (offset % FDT_TAGSIZE) + || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE)) + return -FDT_ERR_BADOFFSET; + + return offset; +} + +int fdt_next_node(const void *fdt, int offset, int *depth) +{ + int nextoffset = 0; + uint32_t tag; + + if (offset >= 0) + if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0) + return nextoffset; + + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + + switch (tag) { + case FDT_PROP: + case FDT_NOP: + break; + + case FDT_BEGIN_NODE: + if (depth) + (*depth)++; + break; + + case FDT_END_NODE: + if (depth && ((--(*depth)) < 0)) + return nextoffset; + break; + + case FDT_END: + if ((nextoffset >= 0) + || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth)) + return -FDT_ERR_NOTFOUND; + else + return nextoffset; + } + } while (tag != FDT_BEGIN_NODE); + + return offset; +} + +const char *_fdt_find_string(const char *strtab, int tabsize, const char *s) +{ + int len = strlen(s) + 1; + const char *last = strtab + tabsize - len; + const char *p; + + for (p = strtab; p <= last; p++) + if (memcmp(p, s, len) == 0) + return p; + return NULL; +} + +int fdt_move(const void *fdt, void *buf, int bufsize) +{ + FDT_CHECK_HEADER(fdt); + + if (fdt_totalsize(fdt) > bufsize) + return -FDT_ERR_NOSPACE; + + memmove(buf, fdt, fdt_totalsize(fdt)); + return 0; +} diff --git a/contrib/dtc/libfdt/fdt.h b/contrib/dtc/libfdt/fdt.h new file mode 100644 index 000000000000..48ccfd910000 --- /dev/null +++ b/contrib/dtc/libfdt/fdt.h @@ -0,0 +1,60 @@ +#ifndef _FDT_H +#define _FDT_H + +#ifndef __ASSEMBLY__ + +struct fdt_header { + uint32_t magic; /* magic word FDT_MAGIC */ + uint32_t totalsize; /* total size of DT block */ + uint32_t off_dt_struct; /* offset to structure */ + uint32_t off_dt_strings; /* offset to strings */ + uint32_t off_mem_rsvmap; /* offset to memory reserve map */ + uint32_t version; /* format version */ + uint32_t last_comp_version; /* last compatible version */ + + /* version 2 fields below */ + uint32_t boot_cpuid_phys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + uint32_t size_dt_strings; /* size of the strings block */ + + /* version 17 fields below */ + uint32_t size_dt_struct; /* size of the structure block */ +}; + +struct fdt_reserve_entry { + uint64_t address; + uint64_t size; +}; + +struct fdt_node_header { + uint32_t tag; + char name[0]; +}; + +struct fdt_property { + uint32_t tag; + uint32_t len; + uint32_t nameoff; + char data[0]; +}; + +#endif /* !__ASSEMBLY */ + +#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ +#define FDT_TAGSIZE sizeof(uint32_t) + +#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ +#define FDT_END_NODE 0x2 /* End node */ +#define FDT_PROP 0x3 /* Property: name off, + size, content */ +#define FDT_NOP 0x4 /* nop */ +#define FDT_END 0x9 + +#define FDT_V1_SIZE (7*sizeof(uint32_t)) +#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t)) +#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t)) +#define FDT_V16_SIZE FDT_V3_SIZE +#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t)) + +#endif /* _FDT_H */ diff --git a/contrib/dtc/libfdt/fdt_ro.c b/contrib/dtc/libfdt/fdt_ro.c new file mode 100644 index 000000000000..951cc740b3f4 --- /dev/null +++ b/contrib/dtc/libfdt/fdt_ro.c @@ -0,0 +1,523 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +static int _fdt_nodename_eq(const void *fdt, int offset, + const char *s, int len) +{ + const char *p = fdt_offset_ptr(fdt, offset + FDT_TAGSIZE, len+1); + + if (! p) + /* short match */ + return 0; + + if (memcmp(p, s, len) != 0) + return 0; + + if (p[len] == '\0') + return 1; + else if (!memchr(s, '@', len) && (p[len] == '@')) + return 1; + else + return 0; +} + +const char *fdt_string(const void *fdt, int stroffset) +{ + return (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset; +} + +static int _fdt_string_eq(const void *fdt, int stroffset, + const char *s, int len) +{ + const char *p = fdt_string(fdt, stroffset); + + return (strlen(p) == len) && (memcmp(p, s, len) == 0); +} + +int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) +{ + FDT_CHECK_HEADER(fdt); + *address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address); + *size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size); + return 0; +} + +int fdt_num_mem_rsv(const void *fdt) +{ + int i = 0; + + while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0) + i++; + return i; +} + +int fdt_subnode_offset_namelen(const void *fdt, int offset, + const char *name, int namelen) +{ + int depth; + + FDT_CHECK_HEADER(fdt); + + for (depth = 0; + (offset >= 0) && (depth >= 0); + offset = fdt_next_node(fdt, offset, &depth)) + if ((depth == 1) + && _fdt_nodename_eq(fdt, offset, name, namelen)) + return offset; + + if (depth < 0) + return -FDT_ERR_NOTFOUND; + return offset; /* error */ +} + +int fdt_subnode_offset(const void *fdt, int parentoffset, + const char *name) +{ + return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name)); +} + +int fdt_path_offset(const void *fdt, const char *path) +{ + const char *end = path + strlen(path); + const char *p = path; + int offset = 0; + + FDT_CHECK_HEADER(fdt); + + /* see if we have an alias */ + if (*path != '/') { + const char *q = strchr(path, '/'); + + if (!q) + q = end; + + p = fdt_get_alias_namelen(fdt, p, q - p); + if (!p) + return -FDT_ERR_BADPATH; + offset = fdt_path_offset(fdt, p); + + p = q; + } + + while (*p) { + const char *q; + + while (*p == '/') + p++; + if (! *p) + return offset; + q = strchr(p, '/'); + if (! q) + q = end; + + offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p); + if (offset < 0) + return offset; + + p = q; + } + + return offset; +} + +const char *fdt_get_name(const void *fdt, int nodeoffset, int *len) +{ + const struct fdt_node_header *nh = _fdt_offset_ptr(fdt, nodeoffset); + int err; + + if (((err = fdt_check_header(fdt)) != 0) + || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0)) + goto fail; + + if (len) + *len = strlen(nh->name); + + return nh->name; + + fail: + if (len) + *len = err; + return NULL; +} + +const struct fdt_property *fdt_get_property_namelen(const void *fdt, + int nodeoffset, + const char *name, + int namelen, int *lenp) +{ + uint32_t tag; + const struct fdt_property *prop; + int offset, nextoffset; + int err; + + if (((err = fdt_check_header(fdt)) != 0) + || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0)) + goto fail; + + nextoffset = err; + do { + offset = nextoffset; + + tag = fdt_next_tag(fdt, offset, &nextoffset); + switch (tag) { + case FDT_END: + if (nextoffset < 0) + err = nextoffset; + else + /* FDT_END tag with unclosed nodes */ + err = -FDT_ERR_BADSTRUCTURE; + goto fail; + + case FDT_PROP: + prop = _fdt_offset_ptr(fdt, offset); + if (_fdt_string_eq(fdt, fdt32_to_cpu(prop->nameoff), + name, namelen)) { + /* Found it! */ + if (lenp) + *lenp = fdt32_to_cpu(prop->len); + + return prop; + } + break; + } + } while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE)); + + err = -FDT_ERR_NOTFOUND; + fail: + if (lenp) + *lenp = err; + return NULL; +} + +const struct fdt_property *fdt_get_property(const void *fdt, + int nodeoffset, + const char *name, int *lenp) +{ + return fdt_get_property_namelen(fdt, nodeoffset, name, + strlen(name), lenp); +} + +const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, + const char *name, int namelen, int *lenp) +{ + const struct fdt_property *prop; + + prop = fdt_get_property_namelen(fdt, nodeoffset, name, namelen, lenp); + if (! prop) + return NULL; + + return prop->data; +} + +const void *fdt_getprop(const void *fdt, int nodeoffset, + const char *name, int *lenp) +{ + return fdt_getprop_namelen(fdt, nodeoffset, name, strlen(name), lenp); +} + +uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) +{ + const uint32_t *php; + int len; + + /* FIXME: This is a bit sub-optimal, since we potentially scan + * over all the properties twice. */ + php = fdt_getprop(fdt, nodeoffset, "phandle", &len); + if (!php || (len != sizeof(*php))) { + php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len); + if (!php || (len != sizeof(*php))) + return 0; + } + + return fdt32_to_cpu(*php); +} + +const char *fdt_get_alias_namelen(const void *fdt, + const char *name, int namelen) +{ + int aliasoffset; + + aliasoffset = fdt_path_offset(fdt, "/aliases"); + if (aliasoffset < 0) + return NULL; + + return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL); +} + +const char *fdt_get_alias(const void *fdt, const char *name) +{ + return fdt_get_alias_namelen(fdt, name, strlen(name)); +} + +int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen) +{ + int pdepth = 0, p = 0; + int offset, depth, namelen; + const char *name; + + FDT_CHECK_HEADER(fdt); + + if (buflen < 2) + return -FDT_ERR_NOSPACE; + + for (offset = 0, depth = 0; + (offset >= 0) && (offset <= nodeoffset); + offset = fdt_next_node(fdt, offset, &depth)) { + while (pdepth > depth) { + do { + p--; + } while (buf[p-1] != '/'); + pdepth--; + } + + if (pdepth >= depth) { + name = fdt_get_name(fdt, offset, &namelen); + if (!name) + return namelen; + if ((p + namelen + 1) <= buflen) { + memcpy(buf + p, name, namelen); + p += namelen; + buf[p++] = '/'; + pdepth++; + } + } + + if (offset == nodeoffset) { + if (pdepth < (depth + 1)) + return -FDT_ERR_NOSPACE; + + if (p > 1) /* special case so that root path is "/", not "" */ + p--; + buf[p] = '\0'; + return 0; + } + } + + if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) + return -FDT_ERR_BADOFFSET; + else if (offset == -FDT_ERR_BADOFFSET) + return -FDT_ERR_BADSTRUCTURE; + + return offset; /* error from fdt_next_node() */ +} + +int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, + int supernodedepth, int *nodedepth) +{ + int offset, depth; + int supernodeoffset = -FDT_ERR_INTERNAL; + + FDT_CHECK_HEADER(fdt); + + if (supernodedepth < 0) + return -FDT_ERR_NOTFOUND; + + for (offset = 0, depth = 0; + (offset >= 0) && (offset <= nodeoffset); + offset = fdt_next_node(fdt, offset, &depth)) { + if (depth == supernodedepth) + supernodeoffset = offset; + + if (offset == nodeoffset) { + if (nodedepth) + *nodedepth = depth; + + if (supernodedepth > depth) + return -FDT_ERR_NOTFOUND; + else + return supernodeoffset; + } + } + + if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) + return -FDT_ERR_BADOFFSET; + else if (offset == -FDT_ERR_BADOFFSET) + return -FDT_ERR_BADSTRUCTURE; + + return offset; /* error from fdt_next_node() */ +} + +int fdt_node_depth(const void *fdt, int nodeoffset) +{ + int nodedepth; + int err; + + err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth); + if (err) + return (err < 0) ? err : -FDT_ERR_INTERNAL; + return nodedepth; +} + +int fdt_parent_offset(const void *fdt, int nodeoffset) +{ + int nodedepth = fdt_node_depth(fdt, nodeoffset); + + if (nodedepth < 0) + return nodedepth; + return fdt_supernode_atdepth_offset(fdt, nodeoffset, + nodedepth - 1, NULL); +} + +int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, + const char *propname, + const void *propval, int proplen) +{ + int offset; + const void *val; + int len; + + FDT_CHECK_HEADER(fdt); + + /* FIXME: The algorithm here is pretty horrible: we scan each + * property of a node in fdt_getprop(), then if that didn't + * find what we want, we scan over them again making our way + * to the next node. Still it's the easiest to implement + * approach; performance can come later. */ + for (offset = fdt_next_node(fdt, startoffset, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + val = fdt_getprop(fdt, offset, propname, &len); + if (val && (len == proplen) + && (memcmp(val, propval, len) == 0)) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} + +int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle) +{ + int offset; + + if ((phandle == 0) || (phandle == -1)) + return -FDT_ERR_BADPHANDLE; + + FDT_CHECK_HEADER(fdt); + + /* FIXME: The algorithm here is pretty horrible: we + * potentially scan each property of a node in + * fdt_get_phandle(), then if that didn't find what + * we want, we scan over them again making our way to the next + * node. Still it's the easiest to implement approach; + * performance can come later. */ + for (offset = fdt_next_node(fdt, -1, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + if (fdt_get_phandle(fdt, offset) == phandle) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} + +static int _fdt_stringlist_contains(const char *strlist, int listlen, + const char *str) +{ + int len = strlen(str); + const char *p; + + while (listlen >= len) { + if (memcmp(str, strlist, len+1) == 0) + return 1; + p = memchr(strlist, '\0', listlen); + if (!p) + return 0; /* malformed strlist.. */ + listlen -= (p-strlist) + 1; + strlist = p + 1; + } + return 0; +} + +int fdt_node_check_compatible(const void *fdt, int nodeoffset, + const char *compatible) +{ + const void *prop; + int len; + + prop = fdt_getprop(fdt, nodeoffset, "compatible", &len); + if (!prop) + return len; + if (_fdt_stringlist_contains(prop, len, compatible)) + return 0; + else + return 1; +} + +int fdt_node_offset_by_compatible(const void *fdt, int startoffset, + const char *compatible) +{ + int offset, err; + + FDT_CHECK_HEADER(fdt); + + /* FIXME: The algorithm here is pretty horrible: we scan each + * property of a node in fdt_node_check_compatible(), then if + * that didn't find what we want, we scan over them again + * making our way to the next node. Still it's the easiest to + * implement approach; performance can come later. */ + for (offset = fdt_next_node(fdt, startoffset, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + err = fdt_node_check_compatible(fdt, offset, compatible); + if ((err < 0) && (err != -FDT_ERR_NOTFOUND)) + return err; + else if (err == 0) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} diff --git a/contrib/dtc/libfdt/fdt_rw.c b/contrib/dtc/libfdt/fdt_rw.c new file mode 100644 index 000000000000..994037bbbda9 --- /dev/null +++ b/contrib/dtc/libfdt/fdt_rw.c @@ -0,0 +1,465 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +static int _fdt_blocks_misordered(const void *fdt, + int mem_rsv_size, int struct_size) +{ + return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8)) + || (fdt_off_dt_struct(fdt) < + (fdt_off_mem_rsvmap(fdt) + mem_rsv_size)) + || (fdt_off_dt_strings(fdt) < + (fdt_off_dt_struct(fdt) + struct_size)) + || (fdt_totalsize(fdt) < + (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); +} + +static int _fdt_rw_check_header(void *fdt) +{ + FDT_CHECK_HEADER(fdt); + + if (fdt_version(fdt) < 17) + return -FDT_ERR_BADVERSION; + if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry), + fdt_size_dt_struct(fdt))) + return -FDT_ERR_BADLAYOUT; + if (fdt_version(fdt) > 17) + fdt_set_version(fdt, 17); + + return 0; +} + +#define FDT_RW_CHECK_HEADER(fdt) \ + { \ + int err; \ + if ((err = _fdt_rw_check_header(fdt)) != 0) \ + return err; \ + } + +static inline int _fdt_data_size(void *fdt) +{ + return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); +} + +static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen) +{ + char *p = splicepoint; + char *end = (char *)fdt + _fdt_data_size(fdt); + + if (((p + oldlen) < p) || ((p + oldlen) > end)) + return -FDT_ERR_BADOFFSET; + if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt))) + return -FDT_ERR_NOSPACE; + memmove(p + newlen, p + oldlen, end - p - oldlen); + return 0; +} + +static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p, + int oldn, int newn) +{ + int delta = (newn - oldn) * sizeof(*p); + int err; + err = _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p)); + if (err) + return err; + fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta); + fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); + return 0; +} + +static int _fdt_splice_struct(void *fdt, void *p, + int oldlen, int newlen) +{ + int delta = newlen - oldlen; + int err; + + if ((err = _fdt_splice(fdt, p, oldlen, newlen))) + return err; + + fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta); + fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); + return 0; +} + +static int _fdt_splice_string(void *fdt, int newlen) +{ + void *p = (char *)fdt + + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); + int err; + + if ((err = _fdt_splice(fdt, p, 0, newlen))) + return err; + + fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen); + return 0; +} + +static int _fdt_find_add_string(void *fdt, const char *s) +{ + char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); + const char *p; + char *new; + int len = strlen(s) + 1; + int err; + + p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s); + if (p) + /* found it */ + return (p - strtab); + + new = strtab + fdt_size_dt_strings(fdt); + err = _fdt_splice_string(fdt, len); + if (err) + return err; + + memcpy(new, s, len); + return (new - strtab); +} + +int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size) +{ + struct fdt_reserve_entry *re; + int err; + + FDT_RW_CHECK_HEADER(fdt); + + re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt)); + err = _fdt_splice_mem_rsv(fdt, re, 0, 1); + if (err) + return err; + + re->address = cpu_to_fdt64(address); + re->size = cpu_to_fdt64(size); + return 0; +} + +int fdt_del_mem_rsv(void *fdt, int n) +{ + struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n); + int err; + + FDT_RW_CHECK_HEADER(fdt); + + if (n >= fdt_num_mem_rsv(fdt)) + return -FDT_ERR_NOTFOUND; + + err = _fdt_splice_mem_rsv(fdt, re, 1, 0); + if (err) + return err; + return 0; +} + +static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name, + int len, struct fdt_property **prop) +{ + int oldlen; + int err; + + *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); + if (! (*prop)) + return oldlen; + + if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen), + FDT_TAGALIGN(len)))) + return err; + + (*prop)->len = cpu_to_fdt32(len); + return 0; +} + +static int _fdt_add_property(void *fdt, int nodeoffset, const char *name, + int len, struct fdt_property **prop) +{ + int proplen; + int nextoffset; + int namestroff; + int err; + + if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0) + return nextoffset; + + namestroff = _fdt_find_add_string(fdt, name); + if (namestroff < 0) + return namestroff; + + *prop = _fdt_offset_ptr_w(fdt, nextoffset); + proplen = sizeof(**prop) + FDT_TAGALIGN(len); + + err = _fdt_splice_struct(fdt, *prop, 0, proplen); + if (err) + return err; + + (*prop)->tag = cpu_to_fdt32(FDT_PROP); + (*prop)->nameoff = cpu_to_fdt32(namestroff); + (*prop)->len = cpu_to_fdt32(len); + return 0; +} + +int fdt_set_name(void *fdt, int nodeoffset, const char *name) +{ + char *namep; + int oldlen, newlen; + int err; + + FDT_RW_CHECK_HEADER(fdt); + + namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen); + if (!namep) + return oldlen; + + newlen = strlen(name); + + err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1), + FDT_TAGALIGN(newlen+1)); + if (err) + return err; + + memcpy(namep, name, newlen+1); + return 0; +} + +int fdt_setprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + struct fdt_property *prop; + int err; + + FDT_RW_CHECK_HEADER(fdt); + + err = _fdt_resize_property(fdt, nodeoffset, name, len, &prop); + if (err == -FDT_ERR_NOTFOUND) + err = _fdt_add_property(fdt, nodeoffset, name, len, &prop); + if (err) + return err; + + memcpy(prop->data, val, len); + return 0; +} + +int fdt_delprop(void *fdt, int nodeoffset, const char *name) +{ + struct fdt_property *prop; + int len, proplen; + + FDT_RW_CHECK_HEADER(fdt); + + prop = fdt_get_property_w(fdt, nodeoffset, name, &len); + if (! prop) + return len; + + proplen = sizeof(*prop) + FDT_TAGALIGN(len); + return _fdt_splice_struct(fdt, prop, proplen, 0); +} + +int fdt_add_subnode_namelen(void *fdt, int parentoffset, + const char *name, int namelen) +{ + struct fdt_node_header *nh; + int offset, nextoffset; + int nodelen; + int err; + uint32_t tag; + uint32_t *endtag; + + FDT_RW_CHECK_HEADER(fdt); + + offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen); + if (offset >= 0) + return -FDT_ERR_EXISTS; + else if (offset != -FDT_ERR_NOTFOUND) + return offset; + + /* Try to place the new node after the parent's properties */ + fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */ + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + } while ((tag == FDT_PROP) || (tag == FDT_NOP)); + + nh = _fdt_offset_ptr_w(fdt, offset); + nodelen = sizeof(*nh) + FDT_TAGALIGN(namelen+1) + FDT_TAGSIZE; + + err = _fdt_splice_struct(fdt, nh, 0, nodelen); + if (err) + return err; + + nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); + memset(nh->name, 0, FDT_TAGALIGN(namelen+1)); + memcpy(nh->name, name, namelen); + endtag = (uint32_t *)((char *)nh + nodelen - FDT_TAGSIZE); + *endtag = cpu_to_fdt32(FDT_END_NODE); + + return offset; +} + +int fdt_add_subnode(void *fdt, int parentoffset, const char *name) +{ + return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name)); +} + +int fdt_del_node(void *fdt, int nodeoffset) +{ + int endoffset; + + FDT_RW_CHECK_HEADER(fdt); + + endoffset = _fdt_node_end_offset(fdt, nodeoffset); + if (endoffset < 0) + return endoffset; + + return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset), + endoffset - nodeoffset, 0); +} + +static void _fdt_packblocks(const char *old, char *new, + int mem_rsv_size, int struct_size) +{ + int mem_rsv_off, struct_off, strings_off; + + mem_rsv_off = FDT_ALIGN(sizeof(struct fdt_header), 8); + struct_off = mem_rsv_off + mem_rsv_size; + strings_off = struct_off + struct_size; + + memmove(new + mem_rsv_off, old + fdt_off_mem_rsvmap(old), mem_rsv_size); + fdt_set_off_mem_rsvmap(new, mem_rsv_off); + + memmove(new + struct_off, old + fdt_off_dt_struct(old), struct_size); + fdt_set_off_dt_struct(new, struct_off); + fdt_set_size_dt_struct(new, struct_size); + + memmove(new + strings_off, old + fdt_off_dt_strings(old), + fdt_size_dt_strings(old)); + fdt_set_off_dt_strings(new, strings_off); + fdt_set_size_dt_strings(new, fdt_size_dt_strings(old)); +} + +int fdt_open_into(const void *fdt, void *buf, int bufsize) +{ + int err; + int mem_rsv_size, struct_size; + int newsize; + const char *fdtstart = fdt; + const char *fdtend = fdtstart + fdt_totalsize(fdt); + char *tmp; + + FDT_CHECK_HEADER(fdt); + + mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) + * sizeof(struct fdt_reserve_entry); + + if (fdt_version(fdt) >= 17) { + struct_size = fdt_size_dt_struct(fdt); + } else { + struct_size = 0; + while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END) + ; + if (struct_size < 0) + return struct_size; + } + + if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) { + /* no further work necessary */ + err = fdt_move(fdt, buf, bufsize); + if (err) + return err; + fdt_set_version(buf, 17); + fdt_set_size_dt_struct(buf, struct_size); + fdt_set_totalsize(buf, bufsize); + return 0; + } + + /* Need to reorder */ + newsize = FDT_ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size + + struct_size + fdt_size_dt_strings(fdt); + + if (bufsize < newsize) + return -FDT_ERR_NOSPACE; + + /* First attempt to build converted tree at beginning of buffer */ + tmp = buf; + /* But if that overlaps with the old tree... */ + if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) { + /* Try right after the old tree instead */ + tmp = (char *)(uintptr_t)fdtend; + if ((tmp + newsize) > ((char *)buf + bufsize)) + return -FDT_ERR_NOSPACE; + } + + _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size); + memmove(buf, tmp, newsize); + + fdt_set_magic(buf, FDT_MAGIC); + fdt_set_totalsize(buf, bufsize); + fdt_set_version(buf, 17); + fdt_set_last_comp_version(buf, 16); + fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt)); + + return 0; +} + +int fdt_pack(void *fdt) +{ + int mem_rsv_size; + + FDT_RW_CHECK_HEADER(fdt); + + mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) + * sizeof(struct fdt_reserve_entry); + _fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt)); + fdt_set_totalsize(fdt, _fdt_data_size(fdt)); + + return 0; +} diff --git a/contrib/dtc/libfdt/fdt_strerror.c b/contrib/dtc/libfdt/fdt_strerror.c new file mode 100644 index 000000000000..e6c3ceee8c58 --- /dev/null +++ b/contrib/dtc/libfdt/fdt_strerror.c @@ -0,0 +1,96 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +struct fdt_errtabent { + const char *str; +}; + +#define FDT_ERRTABENT(val) \ + [(val)] = { .str = #val, } + +static struct fdt_errtabent fdt_errtable[] = { + FDT_ERRTABENT(FDT_ERR_NOTFOUND), + FDT_ERRTABENT(FDT_ERR_EXISTS), + FDT_ERRTABENT(FDT_ERR_NOSPACE), + + FDT_ERRTABENT(FDT_ERR_BADOFFSET), + FDT_ERRTABENT(FDT_ERR_BADPATH), + FDT_ERRTABENT(FDT_ERR_BADSTATE), + + FDT_ERRTABENT(FDT_ERR_TRUNCATED), + FDT_ERRTABENT(FDT_ERR_BADMAGIC), + FDT_ERRTABENT(FDT_ERR_BADVERSION), + FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE), + FDT_ERRTABENT(FDT_ERR_BADLAYOUT), +}; +#define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0])) + +const char *fdt_strerror(int errval) +{ + if (errval > 0) + return ""; + else if (errval == 0) + return ""; + else if (errval > -FDT_ERRTABSIZE) { + const char *s = fdt_errtable[-errval].str; + + if (s) + return s; + } + + return ""; +} diff --git a/contrib/dtc/libfdt/fdt_sw.c b/contrib/dtc/libfdt/fdt_sw.c new file mode 100644 index 000000000000..55ebebf1eb20 --- /dev/null +++ b/contrib/dtc/libfdt/fdt_sw.c @@ -0,0 +1,256 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +static int _fdt_sw_check_header(void *fdt) +{ + if (fdt_magic(fdt) != FDT_SW_MAGIC) + return -FDT_ERR_BADMAGIC; + /* FIXME: should check more details about the header state */ + return 0; +} + +#define FDT_SW_CHECK_HEADER(fdt) \ + { \ + int err; \ + if ((err = _fdt_sw_check_header(fdt)) != 0) \ + return err; \ + } + +static void *_fdt_grab_space(void *fdt, size_t len) +{ + int offset = fdt_size_dt_struct(fdt); + int spaceleft; + + spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt) + - fdt_size_dt_strings(fdt); + + if ((offset + len < offset) || (offset + len > spaceleft)) + return NULL; + + fdt_set_size_dt_struct(fdt, offset + len); + return _fdt_offset_ptr_w(fdt, offset); +} + +int fdt_create(void *buf, int bufsize) +{ + void *fdt = buf; + + if (bufsize < sizeof(struct fdt_header)) + return -FDT_ERR_NOSPACE; + + memset(buf, 0, bufsize); + + fdt_set_magic(fdt, FDT_SW_MAGIC); + fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION); + fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); + fdt_set_totalsize(fdt, bufsize); + + fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header), + sizeof(struct fdt_reserve_entry))); + fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt)); + fdt_set_off_dt_strings(fdt, bufsize); + + return 0; +} + +int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size) +{ + struct fdt_reserve_entry *re; + int offset; + + FDT_SW_CHECK_HEADER(fdt); + + if (fdt_size_dt_struct(fdt)) + return -FDT_ERR_BADSTATE; + + offset = fdt_off_dt_struct(fdt); + if ((offset + sizeof(*re)) > fdt_totalsize(fdt)) + return -FDT_ERR_NOSPACE; + + re = (struct fdt_reserve_entry *)((char *)fdt + offset); + re->address = cpu_to_fdt64(addr); + re->size = cpu_to_fdt64(size); + + fdt_set_off_dt_struct(fdt, offset + sizeof(*re)); + + return 0; +} + +int fdt_finish_reservemap(void *fdt) +{ + return fdt_add_reservemap_entry(fdt, 0, 0); +} + +int fdt_begin_node(void *fdt, const char *name) +{ + struct fdt_node_header *nh; + int namelen = strlen(name) + 1; + + FDT_SW_CHECK_HEADER(fdt); + + nh = _fdt_grab_space(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen)); + if (! nh) + return -FDT_ERR_NOSPACE; + + nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); + memcpy(nh->name, name, namelen); + return 0; +} + +int fdt_end_node(void *fdt) +{ + uint32_t *en; + + FDT_SW_CHECK_HEADER(fdt); + + en = _fdt_grab_space(fdt, FDT_TAGSIZE); + if (! en) + return -FDT_ERR_NOSPACE; + + *en = cpu_to_fdt32(FDT_END_NODE); + return 0; +} + +static int _fdt_find_add_string(void *fdt, const char *s) +{ + char *strtab = (char *)fdt + fdt_totalsize(fdt); + const char *p; + int strtabsize = fdt_size_dt_strings(fdt); + int len = strlen(s) + 1; + int struct_top, offset; + + p = _fdt_find_string(strtab - strtabsize, strtabsize, s); + if (p) + return p - strtab; + + /* Add it */ + offset = -strtabsize - len; + struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); + if (fdt_totalsize(fdt) + offset < struct_top) + return 0; /* no more room :( */ + + memcpy(strtab + offset, s, len); + fdt_set_size_dt_strings(fdt, strtabsize + len); + return offset; +} + +int fdt_property(void *fdt, const char *name, const void *val, int len) +{ + struct fdt_property *prop; + int nameoff; + + FDT_SW_CHECK_HEADER(fdt); + + nameoff = _fdt_find_add_string(fdt, name); + if (nameoff == 0) + return -FDT_ERR_NOSPACE; + + prop = _fdt_grab_space(fdt, sizeof(*prop) + FDT_TAGALIGN(len)); + if (! prop) + return -FDT_ERR_NOSPACE; + + prop->tag = cpu_to_fdt32(FDT_PROP); + prop->nameoff = cpu_to_fdt32(nameoff); + prop->len = cpu_to_fdt32(len); + memcpy(prop->data, val, len); + return 0; +} + +int fdt_finish(void *fdt) +{ + char *p = (char *)fdt; + uint32_t *end; + int oldstroffset, newstroffset; + uint32_t tag; + int offset, nextoffset; + + FDT_SW_CHECK_HEADER(fdt); + + /* Add terminator */ + end = _fdt_grab_space(fdt, sizeof(*end)); + if (! end) + return -FDT_ERR_NOSPACE; + *end = cpu_to_fdt32(FDT_END); + + /* Relocate the string table */ + oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt); + newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); + memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt)); + fdt_set_off_dt_strings(fdt, newstroffset); + + /* Walk the structure, correcting string offsets */ + offset = 0; + while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) { + if (tag == FDT_PROP) { + struct fdt_property *prop = + _fdt_offset_ptr_w(fdt, offset); + int nameoff; + + nameoff = fdt32_to_cpu(prop->nameoff); + nameoff += fdt_size_dt_strings(fdt); + prop->nameoff = cpu_to_fdt32(nameoff); + } + offset = nextoffset; + } + if (nextoffset < 0) + return nextoffset; + + /* Finally, adjust the header */ + fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt)); + fdt_set_magic(fdt, FDT_MAGIC); + return 0; +} diff --git a/contrib/dtc/libfdt/fdt_wip.c b/contrib/dtc/libfdt/fdt_wip.c new file mode 100644 index 000000000000..6025fa1fe8fe --- /dev/null +++ b/contrib/dtc/libfdt/fdt_wip.c @@ -0,0 +1,118 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + void *propval; + int proplen; + + propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen); + if (! propval) + return proplen; + + if (proplen != len) + return -FDT_ERR_NOSPACE; + + memcpy(propval, val, len); + return 0; +} + +static void _fdt_nop_region(void *start, int len) +{ + uint32_t *p; + + for (p = start; (char *)p < ((char *)start + len); p++) + *p = cpu_to_fdt32(FDT_NOP); +} + +int fdt_nop_property(void *fdt, int nodeoffset, const char *name) +{ + struct fdt_property *prop; + int len; + + prop = fdt_get_property_w(fdt, nodeoffset, name, &len); + if (! prop) + return len; + + _fdt_nop_region(prop, len + sizeof(*prop)); + + return 0; +} + +int _fdt_node_end_offset(void *fdt, int offset) +{ + int depth = 0; + + while ((offset >= 0) && (depth >= 0)) + offset = fdt_next_node(fdt, offset, &depth); + + return offset; +} + +int fdt_nop_node(void *fdt, int nodeoffset) +{ + int endoffset; + + endoffset = _fdt_node_end_offset(fdt, nodeoffset); + if (endoffset < 0) + return endoffset; + + _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), + endoffset - nodeoffset); + return 0; +} diff --git a/contrib/dtc/libfdt/libfdt.h b/contrib/dtc/libfdt/libfdt.h new file mode 100644 index 000000000000..18de52b844c5 --- /dev/null +++ b/contrib/dtc/libfdt/libfdt.h @@ -0,0 +1,1132 @@ +#ifndef _LIBFDT_H +#define _LIBFDT_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 +#include + +#define FDT_FIRST_SUPPORTED_VERSION 0x10 +#define FDT_LAST_SUPPORTED_VERSION 0x11 + +/* Error codes: informative error codes */ +#define FDT_ERR_NOTFOUND 1 + /* FDT_ERR_NOTFOUND: The requested node or property does not exist */ +#define FDT_ERR_EXISTS 2 + /* FDT_ERR_EXISTS: Attemped to create a node or property which + * already exists */ +#define FDT_ERR_NOSPACE 3 + /* FDT_ERR_NOSPACE: Operation needed to expand the device + * tree, but its buffer did not have sufficient space to + * contain the expanded tree. Use fdt_open_into() to move the + * device tree to a buffer with more space. */ + +/* Error codes: codes for bad parameters */ +#define FDT_ERR_BADOFFSET 4 + /* FDT_ERR_BADOFFSET: Function was passed a structure block + * offset which is out-of-bounds, or which points to an + * unsuitable part of the structure for the operation. */ +#define FDT_ERR_BADPATH 5 + /* FDT_ERR_BADPATH: Function was passed a badly formatted path + * (e.g. missing a leading / for a function which requires an + * absolute path) */ +#define FDT_ERR_BADPHANDLE 6 + /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle + * value. phandle values of 0 and -1 are not permitted. */ +#define FDT_ERR_BADSTATE 7 + /* FDT_ERR_BADSTATE: Function was passed an incomplete device + * tree created by the sequential-write functions, which is + * not sufficiently complete for the requested operation. */ + +/* Error codes: codes for bad device tree blobs */ +#define FDT_ERR_TRUNCATED 8 + /* FDT_ERR_TRUNCATED: Structure block of the given device tree + * ends without an FDT_END tag. */ +#define FDT_ERR_BADMAGIC 9 + /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a + * device tree at all - it is missing the flattened device + * tree magic number. */ +#define FDT_ERR_BADVERSION 10 + /* FDT_ERR_BADVERSION: Given device tree has a version which + * can't be handled by the requested operation. For + * read-write functions, this may mean that fdt_open_into() is + * required to convert the tree to the expected version. */ +#define FDT_ERR_BADSTRUCTURE 11 + /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt + * structure block or other serious error (e.g. misnested + * nodes, or subnodes preceding properties). */ +#define FDT_ERR_BADLAYOUT 12 + /* FDT_ERR_BADLAYOUT: For read-write functions, the given + * device tree has it's sub-blocks in an order that the + * function can't handle (memory reserve map, then structure, + * then strings). Use fdt_open_into() to reorganize the tree + * into a form suitable for the read-write operations. */ + +/* "Can't happen" error indicating a bug in libfdt */ +#define FDT_ERR_INTERNAL 13 + /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion. + * Should never be returned, if it is, it indicates a bug in + * libfdt itself. */ + +#define FDT_ERR_MAX 13 + +/**********************************************************************/ +/* Low-level functions (you probably don't need these) */ +/**********************************************************************/ + +const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen); +static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen) +{ + return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen); +} + +uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); + +/**********************************************************************/ +/* Traversal functions */ +/**********************************************************************/ + +int fdt_next_node(const void *fdt, int offset, int *depth); + +/**********************************************************************/ +/* General functions */ +/**********************************************************************/ + +#define fdt_get_header(fdt, field) \ + (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field)) +#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) +#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) +#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) +#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings)) +#define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap)) +#define fdt_version(fdt) (fdt_get_header(fdt, version)) +#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version)) +#define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys)) +#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings)) +#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct)) + +#define __fdt_set_hdr(name) \ + static inline void fdt_set_##name(void *fdt, uint32_t val) \ + { \ + struct fdt_header *fdth = (struct fdt_header*)fdt; \ + fdth->name = cpu_to_fdt32(val); \ + } +__fdt_set_hdr(magic); +__fdt_set_hdr(totalsize); +__fdt_set_hdr(off_dt_struct); +__fdt_set_hdr(off_dt_strings); +__fdt_set_hdr(off_mem_rsvmap); +__fdt_set_hdr(version); +__fdt_set_hdr(last_comp_version); +__fdt_set_hdr(boot_cpuid_phys); +__fdt_set_hdr(size_dt_strings); +__fdt_set_hdr(size_dt_struct); +#undef __fdt_set_hdr + +/** + * fdt_check_header - sanity check a device tree or possible device tree + * @fdt: pointer to data which might be a flattened device tree + * + * fdt_check_header() checks that the given buffer contains what + * appears to be a flattened device tree with sane information in its + * header. + * + * returns: + * 0, if the buffer appears to contain a valid device tree + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings, as above + */ +int fdt_check_header(const void *fdt); + +/** + * fdt_move - move a device tree around in memory + * @fdt: pointer to the device tree to move + * @buf: pointer to memory where the device is to be moved + * @bufsize: size of the memory space at buf + * + * fdt_move() relocates, if possible, the device tree blob located at + * fdt to the buffer at buf of size bufsize. The buffer may overlap + * with the existing device tree blob at fdt. Therefore, + * fdt_move(fdt, fdt, fdt_totalsize(fdt)) + * should always succeed. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_move(const void *fdt, void *buf, int bufsize); + +/**********************************************************************/ +/* Read-only functions */ +/**********************************************************************/ + +/** + * fdt_string - retrieve a string from the strings block of a device tree + * @fdt: pointer to the device tree blob + * @stroffset: offset of the string within the strings block (native endian) + * + * fdt_string() retrieves a pointer to a single string from the + * strings block of the device tree blob at fdt. + * + * returns: + * a pointer to the string, on success + * NULL, if stroffset is out of bounds + */ +const char *fdt_string(const void *fdt, int stroffset); + +/** + * fdt_num_mem_rsv - retrieve the number of memory reserve map entries + * @fdt: pointer to the device tree blob + * + * Returns the number of entries in the device tree blob's memory + * reservation map. This does not include the terminating 0,0 entry + * or any other (0,0) entries reserved for expansion. + * + * returns: + * the number of entries + */ +int fdt_num_mem_rsv(const void *fdt); + +/** + * fdt_get_mem_rsv - retrieve one memory reserve map entry + * @fdt: pointer to the device tree blob + * @address, @size: pointers to 64-bit variables + * + * On success, *address and *size will contain the address and size of + * the n-th reserve map entry from the device tree blob, in + * native-endian format. + * + * returns: + * 0, on success + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size); + +/** + * fdt_subnode_offset_namelen - find a subnode based on substring + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * @namelen: number of characters of name to consider + * + * Identical to fdt_subnode_offset(), but only examine the first + * namelen characters of name for matching the subnode name. This is + * useful for finding subnodes based on a portion of a larger string, + * such as a full path. + */ +int fdt_subnode_offset_namelen(const void *fdt, int parentoffset, + const char *name, int namelen); +/** + * fdt_subnode_offset - find a subnode of a given node + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * + * fdt_subnode_offset() finds a subnode of the node at structure block + * offset parentoffset with the given name. name may include a unit + * address, in which case fdt_subnode_offset() will find the subnode + * with that unit address, or the unit address may be omitted, in + * which case fdt_subnode_offset() will find an arbitrary subnode + * whose name excluding unit address matches the given name. + * + * returns: + * structure block offset of the requested subnode (>=0), on success + * -FDT_ERR_NOTFOUND, if the requested subnode does not exist + * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name); + +/** + * fdt_path_offset - find a tree node by its full path + * @fdt: pointer to the device tree blob + * @path: full path of the node to locate + * + * fdt_path_offset() finds a node of a given path in the device tree. + * Each path component may omit the unit address portion, but the + * results of this are undefined if any such path component is + * ambiguous (that is if there are multiple nodes at the relevant + * level matching the given component, differentiated only by unit + * address). + * + * returns: + * structure block offset of the node with the requested path (>=0), on success + * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid + * -FDT_ERR_NOTFOUND, if the requested node does not exist + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_path_offset(const void *fdt, const char *path); + +/** + * fdt_get_name - retrieve the name of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of the starting node + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_name() retrieves the name (including unit address) of the + * device tree node at structure block offset nodeoffset. If lenp is + * non-NULL, the length of this name is also returned, in the integer + * pointed to by lenp. + * + * returns: + * pointer to the node's name, on success + * If lenp is non-NULL, *lenp contains the length of that name (>=0) + * NULL, on error + * if lenp is non-NULL *lenp contains an error code (<0): + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp); + +/** + * fdt_get_property_namelen - find a property based on substring + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @namelen: number of characters of name to consider + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * Identical to fdt_get_property_namelen(), but only examine the first + * namelen characters of name for matching the property name. + */ +const struct fdt_property *fdt_get_property_namelen(const void *fdt, + int nodeoffset, + const char *name, + int namelen, int *lenp); + +/** + * fdt_get_property - find a given property in a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_property() retrieves a pointer to the fdt_property + * structure within the device tree blob corresponding to the property + * named 'name' of the node at offset nodeoffset. If lenp is + * non-NULL, the length of the property value is also returned, in the + * integer pointed to by lenp. + * + * returns: + * pointer to the structure representing the property + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_NOTFOUND, node does not have named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset, + const char *name, int *lenp); +static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset, + const char *name, + int *lenp) +{ + return (struct fdt_property *)(uintptr_t) + fdt_get_property(fdt, nodeoffset, name, lenp); +} + +/** + * fdt_getprop_namelen - get property value based on substring + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @namelen: number of characters of name to consider + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * Identical to fdt_getprop(), but only examine the first namelen + * characters of name for matching the property name. + */ +const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, + const char *name, int namelen, int *lenp); + +/** + * fdt_getprop - retrieve the value of a given property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_getprop() retrieves a pointer to the value of the property + * named 'name' of the node at offset nodeoffset (this will be a + * pointer to within the device blob itself, not a copy of the value). + * If lenp is non-NULL, the length of the property value is also + * returned, in the integer pointed to by lenp. + * + * returns: + * pointer to the property's value + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_NOTFOUND, node does not have named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +const void *fdt_getprop(const void *fdt, int nodeoffset, + const char *name, int *lenp); +static inline void *fdt_getprop_w(void *fdt, int nodeoffset, + const char *name, int *lenp) +{ + return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp); +} + +/** + * fdt_get_phandle - retrieve the phandle of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of the node + * + * fdt_get_phandle() retrieves the phandle of the device tree node at + * structure block offset nodeoffset. + * + * returns: + * the phandle of the node at nodeoffset, on success (!= 0, != -1) + * 0, if the node has no phandle, or another error occurs + */ +uint32_t fdt_get_phandle(const void *fdt, int nodeoffset); + +/** + * fdt_get_alias_namelen - get alias based on substring + * @fdt: pointer to the device tree blob + * @name: name of the alias th look up + * @namelen: number of characters of name to consider + * + * Identical to fdt_get_alias(), but only examine the first namelen + * characters of name for matching the alias name. + */ +const char *fdt_get_alias_namelen(const void *fdt, + const char *name, int namelen); + +/** + * fdt_get_alias - retreive the path referenced by a given alias + * @fdt: pointer to the device tree blob + * @name: name of the alias th look up + * + * fdt_get_alias() retrieves the value of a given alias. That is, the + * value of the property named 'name' in the node /aliases. + * + * returns: + * a pointer to the expansion of the alias named 'name', of it exists + * NULL, if the given alias or the /aliases node does not exist + */ +const char *fdt_get_alias(const void *fdt, const char *name); + +/** + * fdt_get_path - determine the full path of a node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose path to find + * @buf: character buffer to contain the returned path (will be overwritten) + * @buflen: size of the character buffer at buf + * + * fdt_get_path() computes the full path of the node at offset + * nodeoffset, and records that path in the buffer at buf. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + * 0, on success + * buf contains the absolute path of the node at + * nodeoffset, as a NUL-terminated string. + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1) + * characters and will not fit in the given buffer. + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen); + +/** + * fdt_supernode_atdepth_offset - find a specific ancestor of a node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * @supernodedepth: depth of the ancestor to find + * @nodedepth: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_supernode_atdepth_offset() finds an ancestor of the given node + * at a specific depth from the root (where the root itself has depth + * 0, its immediate subnodes depth 1 and so forth). So + * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL); + * will always return 0, the offset of the root node. If the node at + * nodeoffset has depth D, then: + * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL); + * will return nodeoffset itself. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + + * structure block offset of the node at node offset's ancestor + * of depth supernodedepth (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag +* -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, + int supernodedepth, int *nodedepth); + +/** + * fdt_node_depth - find the depth of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * + * fdt_node_depth() finds the depth of a given node. The root node + * has depth 0, its immediate subnodes depth 1 and so forth. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + * depth of the node at nodeoffset (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_depth(const void *fdt, int nodeoffset); + +/** + * fdt_parent_offset - find the parent of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * + * fdt_parent_offset() locates the parent node of a given node (that + * is, it finds the offset of the node which contains the node at + * nodeoffset as a subnode). + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset, *twice*. + * + * returns: + * structure block offset of the parent of the node at nodeoffset + * (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_parent_offset(const void *fdt, int nodeoffset); + +/** + * fdt_node_offset_by_prop_value - find nodes with a given property value + * @fdt: pointer to the device tree blob + * @startoffset: only find nodes after this offset + * @propname: property name to check + * @propval: property value to search for + * @proplen: length of the value in propval + * + * fdt_node_offset_by_prop_value() returns the offset of the first + * node after startoffset, which has a property named propname whose + * value is of length proplen and has value equal to propval; or if + * startoffset is -1, the very first such node in the tree. + * + * To iterate through all nodes matching the criterion, the following + * idiom can be used: + * offset = fdt_node_offset_by_prop_value(fdt, -1, propname, + * propval, proplen); + * while (offset != -FDT_ERR_NOTFOUND) { + * // other code here + * offset = fdt_node_offset_by_prop_value(fdt, offset, propname, + * propval, proplen); + * } + * + * Note the -1 in the first call to the function, if 0 is used here + * instead, the function will never locate the root node, even if it + * matches the criterion. + * + * returns: + * structure block offset of the located node (>= 0, >startoffset), + * on success + * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the + * tree after startoffset + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, + const char *propname, + const void *propval, int proplen); + +/** + * fdt_node_offset_by_phandle - find the node with a given phandle + * @fdt: pointer to the device tree blob + * @phandle: phandle value + * + * fdt_node_offset_by_phandle() returns the offset of the node + * which has the given phandle value. If there is more than one node + * in the tree with the given phandle (an invalid tree), results are + * undefined. + * + * returns: + * structure block offset of the located node (>= 0), on success + * -FDT_ERR_NOTFOUND, no node with that phandle exists + * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1) + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle); + +/** + * fdt_node_check_compatible: check a node's compatible property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of a tree node + * @compatible: string to match against + * + * + * fdt_node_check_compatible() returns 0 if the given node contains a + * 'compatible' property with the given string as one of its elements, + * it returns non-zero otherwise, or on error. + * + * returns: + * 0, if the node has a 'compatible' property listing the given string + * 1, if the node has a 'compatible' property, but it does not list + * the given string + * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property + * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_check_compatible(const void *fdt, int nodeoffset, + const char *compatible); + +/** + * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value + * @fdt: pointer to the device tree blob + * @startoffset: only find nodes after this offset + * @compatible: 'compatible' string to match against + * + * fdt_node_offset_by_compatible() returns the offset of the first + * node after startoffset, which has a 'compatible' property which + * lists the given compatible string; or if startoffset is -1, the + * very first such node in the tree. + * + * To iterate through all nodes matching the criterion, the following + * idiom can be used: + * offset = fdt_node_offset_by_compatible(fdt, -1, compatible); + * while (offset != -FDT_ERR_NOTFOUND) { + * // other code here + * offset = fdt_node_offset_by_compatible(fdt, offset, compatible); + * } + * + * Note the -1 in the first call to the function, if 0 is used here + * instead, the function will never locate the root node, even if it + * matches the criterion. + * + * returns: + * structure block offset of the located node (>= 0, >startoffset), + * on success + * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the + * tree after startoffset + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_compatible(const void *fdt, int startoffset, + const char *compatible); + +/**********************************************************************/ +/* Write-in-place functions */ +/**********************************************************************/ + +/** + * fdt_setprop_inplace - change a property's value, but not its size + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: pointer to data to replace the property value with + * @len: length of the property value + * + * fdt_setprop_inplace() replaces the value of a given property with + * the data in val, of length len. This function cannot change the + * size of a property, and so will only work if len is equal to the + * current length of the property. + * + * This function will alter only the bytes in the blob which contain + * the given property value, and will not alter or move any other part + * of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, if len is not equal to the property's current length + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, + const void *val, int len); + +/** + * fdt_setprop_inplace_cell - change the value of a single-cell property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: cell (32-bit integer) value to replace the property with + * + * fdt_setprop_inplace_cell() replaces the value of a given property + * with the 32-bit integer cell value in val, converting val to + * big-endian if necessary. This function cannot change the size of a + * property, and so will only work if the property already exists and + * has length 4. + * + * This function will alter only the bytes in the blob which contain + * the given property value, and will not alter or move any other part + * of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, if the property's length is not equal to 4 + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset, + const char *name, uint32_t val) +{ + val = cpu_to_fdt32(val); + return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val)); +} + +/** + * fdt_nop_property - replace a property with nop tags + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to nop + * @name: name of the property to nop + * + * fdt_nop_property() will replace a given property's representation + * in the blob with FDT_NOP tags, effectively removing it from the + * tree. + * + * This function will alter only the bytes in the blob which contain + * the property, and will not alter or move any other part of the + * tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_nop_property(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_nop_node - replace a node (subtree) with nop tags + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to nop + * + * fdt_nop_node() will replace a given node's representation in the + * blob, including all its subnodes, if any, with FDT_NOP tags, + * effectively removing it from the tree. + * + * This function will alter only the bytes in the blob which contain + * the node and its properties and subnodes, and will not alter or + * move any other part of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_nop_node(void *fdt, int nodeoffset); + +/**********************************************************************/ +/* Sequential write functions */ +/**********************************************************************/ + +int fdt_create(void *buf, int bufsize); +int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size); +int fdt_finish_reservemap(void *fdt); +int fdt_begin_node(void *fdt, const char *name); +int fdt_property(void *fdt, const char *name, const void *val, int len); +static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val) +{ + val = cpu_to_fdt32(val); + return fdt_property(fdt, name, &val, sizeof(val)); +} +#define fdt_property_string(fdt, name, str) \ + fdt_property(fdt, name, str, strlen(str)+1) +int fdt_end_node(void *fdt); +int fdt_finish(void *fdt); + +/**********************************************************************/ +/* Read-write functions */ +/**********************************************************************/ + +int fdt_open_into(const void *fdt, void *buf, int bufsize); +int fdt_pack(void *fdt); + +/** + * fdt_add_mem_rsv - add one memory reserve map entry + * @fdt: pointer to the device tree blob + * @address, @size: 64-bit values (native endian) + * + * Adds a reserve map entry to the given blob reserving a region at + * address address of length size. + * + * This function will insert data into the reserve map and will + * therefore change the indexes of some entries in the table. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new reservation entry + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size); + +/** + * fdt_del_mem_rsv - remove a memory reserve map entry + * @fdt: pointer to the device tree blob + * @n: entry to remove + * + * fdt_del_mem_rsv() removes the n-th memory reserve map entry from + * the blob. + * + * This function will delete data from the reservation table and will + * therefore change the indexes of some entries in the table. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there + * are less than n+1 reserve map entries) + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_del_mem_rsv(void *fdt, int n); + +/** + * fdt_set_name - change the name of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of a node + * @name: name to give the node + * + * fdt_set_name() replaces the name (including unit address, if any) + * of the given node with the given string. NOTE: this function can't + * efficiently check if the new name is unique amongst the given + * node's siblings; results are undefined if this function is invoked + * with a name equal to one of the given node's siblings. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob + * to contain the new name + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_set_name(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_setprop - create or change a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: pointer to data to set the property value to + * @len: length of the property value + * + * fdt_setprop() sets the value of the named property in the given + * node to the given value and length, creating the property if it + * does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len); + +/** + * fdt_setprop_cell - set a property to a single cell value + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 32-bit integer value for the property (native endian) + * + * fdt_setprop_cell() sets the value of the named property in the + * given node to the given cell value (converting to big-endian if + * necessary), or creates a new property with that value if it does + * not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name, + uint32_t val) +{ + val = cpu_to_fdt32(val); + return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val)); +} + +/** + * fdt_setprop_string - set a property to a string value + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @str: string value for the property + * + * fdt_setprop_string() sets the value of the named property in the + * given node to the given string value (using the length of the + * string to determine the new length of the property), or creates a + * new property with that value if it does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#define fdt_setprop_string(fdt, nodeoffset, name, str) \ + fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) + +/** + * fdt_delprop - delete a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to nop + * @name: name of the property to nop + * + * fdt_del_property() will delete the given property. + * + * This function will delete data from the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_delprop(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_add_subnode_namelen - creates a new node based on substring + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * @namelen: number of characters of name to consider + * + * Identical to fdt_add_subnode(), but use only the first namelen + * characters of name as the name of the new node. This is useful for + * creating subnodes based on a portion of a larger string, such as a + * full path. + */ +int fdt_add_subnode_namelen(void *fdt, int parentoffset, + const char *name, int namelen); + +/** + * fdt_add_subnode - creates a new node + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * + * fdt_add_subnode() creates a new node as a subnode of the node at + * structure block offset parentoffset, with the given name (which + * should include the unit address, if any). + * + * This function will insert data into the blob, and will therefore + * change the offsets of some existing nodes. + + * returns: + * structure block offset of the created nodeequested subnode (>=0), on success + * -FDT_ERR_NOTFOUND, if the requested subnode does not exist + * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag + * -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of + * the given name + * -FDT_ERR_NOSPACE, if there is insufficient free space in the + * blob to contain the new node + * -FDT_ERR_NOSPACE + * -FDT_ERR_BADLAYOUT + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_add_subnode(void *fdt, int parentoffset, const char *name); + +/** + * fdt_del_node - delete a node (subtree) + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to nop + * + * fdt_del_node() will remove the given node, including all its + * subnodes if any, from the blob. + * + * This function will delete data from the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_del_node(void *fdt, int nodeoffset); + +/**********************************************************************/ +/* Debugging / informational functions */ +/**********************************************************************/ + +const char *fdt_strerror(int errval); + +#endif /* _LIBFDT_H */ diff --git a/contrib/dtc/libfdt/libfdt_env.h b/contrib/dtc/libfdt/libfdt_env.h new file mode 100644 index 000000000000..449bf602daf1 --- /dev/null +++ b/contrib/dtc/libfdt/libfdt_env.h @@ -0,0 +1,23 @@ +#ifndef _LIBFDT_ENV_H +#define _LIBFDT_ENV_H + +#include +#include +#include + +#define _B(n) ((unsigned long long)((uint8_t *)&x)[n]) +static inline uint32_t fdt32_to_cpu(uint32_t x) +{ + return (_B(0) << 24) | (_B(1) << 16) | (_B(2) << 8) | _B(3); +} +#define cpu_to_fdt32(x) fdt32_to_cpu(x) + +static inline uint64_t fdt64_to_cpu(uint64_t x) +{ + return (_B(0) << 56) | (_B(1) << 48) | (_B(2) << 40) | (_B(3) << 32) + | (_B(4) << 24) | (_B(5) << 16) | (_B(6) << 8) | _B(7); +} +#define cpu_to_fdt64(x) fdt64_to_cpu(x) +#undef _B + +#endif /* _LIBFDT_ENV_H */ diff --git a/contrib/dtc/libfdt/libfdt_internal.h b/contrib/dtc/libfdt/libfdt_internal.h new file mode 100644 index 000000000000..d2dcbd65ee30 --- /dev/null +++ b/contrib/dtc/libfdt/libfdt_internal.h @@ -0,0 +1,94 @@ +#ifndef _LIBFDT_INTERNAL_H +#define _LIBFDT_INTERNAL_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 + +#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) +#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) + +#define FDT_CHECK_HEADER(fdt) \ + { \ + int err; \ + if ((err = fdt_check_header(fdt)) != 0) \ + return err; \ + } + +int _fdt_check_node_offset(const void *fdt, int offset); +const char *_fdt_find_string(const char *strtab, int tabsize, const char *s); +int _fdt_node_end_offset(void *fdt, int nodeoffset); + +static inline const void *_fdt_offset_ptr(const void *fdt, int offset) +{ + return (const char *)fdt + fdt_off_dt_struct(fdt) + offset; +} + +static inline void *_fdt_offset_ptr_w(void *fdt, int offset) +{ + return (void *)(uintptr_t)_fdt_offset_ptr(fdt, offset); +} + +static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n) +{ + const struct fdt_reserve_entry *rsv_table = + (const struct fdt_reserve_entry *) + ((const char *)fdt + fdt_off_mem_rsvmap(fdt)); + + return rsv_table + n; +} +static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n) +{ + return (void *)(uintptr_t)_fdt_mem_rsv(fdt, n); +} + +#define FDT_SW_MAGIC (~FDT_MAGIC) + +#endif /* _LIBFDT_INTERNAL_H */ diff --git a/contrib/dtc/libfdt/version.lds b/contrib/dtc/libfdt/version.lds new file mode 100644 index 000000000000..3c3994e27f7f --- /dev/null +++ b/contrib/dtc/libfdt/version.lds @@ -0,0 +1,54 @@ +LIBFDT_1.2 { + global: + fdt_next_node; + fdt_check_header; + fdt_move; + fdt_string; + fdt_num_mem_rsv; + fdt_get_mem_rsv; + fdt_subnode_offset_namelen; + fdt_subnode_offset; + fdt_path_offset; + fdt_get_name; + fdt_get_property_namelen; + fdt_get_property; + fdt_getprop_namelen; + fdt_getprop; + fdt_get_phandle; + fdt_get_alias_namelen; + fdt_get_alias; + fdt_get_path; + fdt_supernode_atdepth_offset; + fdt_node_depth; + fdt_parent_offset; + fdt_node_offset_by_prop_value; + fdt_node_offset_by_phandle; + fdt_node_check_compatible; + fdt_node_offset_by_compatible; + fdt_setprop_inplace; + fdt_nop_property; + fdt_nop_node; + fdt_create; + fdt_add_reservemap_entry; + fdt_finish_reservemap; + fdt_begin_node; + fdt_property; + fdt_end_node; + fdt_finish; + fdt_open_into; + fdt_pack; + fdt_add_mem_rsv; + fdt_del_mem_rsv; + fdt_set_name; + fdt_setprop; + fdt_delprop; + fdt_add_subnode_namelen; + fdt_add_subnode; + fdt_del_node; + fdt_strerror; + fdt_offset_ptr; + fdt_next_tag; + + local: + *; +}; diff --git a/contrib/dtc/livetree.c b/contrib/dtc/livetree.c new file mode 100644 index 000000000000..9a482a86f078 --- /dev/null +++ b/contrib/dtc/livetree.c @@ -0,0 +1,320 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" + +/* + * Tree building functions + */ + +struct property *build_property(char *name, struct data val, char *label) +{ + struct property *new = xmalloc(sizeof(*new)); + + new->name = name; + new->val = val; + + new->next = NULL; + + new->label = label; + + return new; +} + +struct property *chain_property(struct property *first, struct property *list) +{ + assert(first->next == NULL); + + first->next = list; + return first; +} + +struct property *reverse_properties(struct property *first) +{ + struct property *p = first; + struct property *head = NULL; + struct property *next; + + while (p) { + next = p->next; + p->next = head; + head = p; + p = next; + } + return head; +} + +struct node *build_node(struct property *proplist, struct node *children) +{ + struct node *new = xmalloc(sizeof(*new)); + struct node *child; + + memset(new, 0, sizeof(*new)); + + new->proplist = reverse_properties(proplist); + new->children = children; + + for_each_child(new, child) { + child->parent = new; + } + + return new; +} + +struct node *name_node(struct node *node, char *name, char * label) +{ + assert(node->name == NULL); + + node->name = name; + + node->label = label; + + return node; +} + +struct node *chain_node(struct node *first, struct node *list) +{ + assert(first->next_sibling == NULL); + + first->next_sibling = list; + return first; +} + +void add_property(struct node *node, struct property *prop) +{ + struct property **p; + + prop->next = NULL; + + p = &node->proplist; + while (*p) + p = &((*p)->next); + + *p = prop; +} + +void add_child(struct node *parent, struct node *child) +{ + struct node **p; + + child->next_sibling = NULL; + child->parent = parent; + + p = &parent->children; + while (*p) + p = &((*p)->next_sibling); + + *p = child; +} + +struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size, + char *label) +{ + struct reserve_info *new = xmalloc(sizeof(*new)); + + new->re.address = address; + new->re.size = size; + + new->next = NULL; + + new->label = label; + + return new; +} + +struct reserve_info *chain_reserve_entry(struct reserve_info *first, + struct reserve_info *list) +{ + assert(first->next == NULL); + + first->next = list; + return first; +} + +struct reserve_info *add_reserve_entry(struct reserve_info *list, + struct reserve_info *new) +{ + struct reserve_info *last; + + new->next = NULL; + + if (! list) + return new; + + for (last = list; last->next; last = last->next) + ; + + last->next = new; + + return list; +} + +struct boot_info *build_boot_info(struct reserve_info *reservelist, + struct node *tree, uint32_t boot_cpuid_phys) +{ + struct boot_info *bi; + + bi = xmalloc(sizeof(*bi)); + bi->reservelist = reservelist; + bi->dt = tree; + bi->boot_cpuid_phys = boot_cpuid_phys; + + return bi; +} + +/* + * Tree accessor functions + */ + +const char *get_unitname(struct node *node) +{ + if (node->name[node->basenamelen] == '\0') + return ""; + else + return node->name + node->basenamelen + 1; +} + +struct property *get_property(struct node *node, const char *propname) +{ + struct property *prop; + + for_each_property(node, prop) + if (streq(prop->name, propname)) + return prop; + + return NULL; +} + +cell_t propval_cell(struct property *prop) +{ + assert(prop->val.len == sizeof(cell_t)); + return fdt32_to_cpu(*((cell_t *)prop->val.val)); +} + +struct node *get_subnode(struct node *node, const char *nodename) +{ + struct node *child; + + for_each_child(node, child) + if (streq(child->name, nodename)) + return child; + + return NULL; +} + +struct node *get_node_by_path(struct node *tree, const char *path) +{ + const char *p; + struct node *child; + + if (!path || ! (*path)) + return tree; + + while (path[0] == '/') + path++; + + p = strchr(path, '/'); + + for_each_child(tree, child) { + if (p && strneq(path, child->name, p-path)) + return get_node_by_path(child, p+1); + else if (!p && streq(path, child->name)) + return child; + } + + return NULL; +} + +struct node *get_node_by_label(struct node *tree, const char *label) +{ + struct node *child, *node; + + assert(label && (strlen(label) > 0)); + + if (tree->label && streq(tree->label, label)) + return tree; + + for_each_child(tree, child) { + node = get_node_by_label(child, label); + if (node) + return node; + } + + return NULL; +} + +struct node *get_node_by_phandle(struct node *tree, cell_t phandle) +{ + struct node *child, *node; + + assert((phandle != 0) && (phandle != -1)); + + if (tree->phandle == phandle) + return tree; + + for_each_child(tree, child) { + node = get_node_by_phandle(child, phandle); + if (node) + return node; + } + + return NULL; +} + +struct node *get_node_by_ref(struct node *tree, const char *ref) +{ + if (ref[0] == '/') + return get_node_by_path(tree, ref); + else + return get_node_by_label(tree, ref); +} + +cell_t get_node_phandle(struct node *root, struct node *node) +{ + static cell_t phandle = 1; /* FIXME: ick, static local */ + + if ((node->phandle != 0) && (node->phandle != -1)) + return node->phandle; + + while (get_node_by_phandle(root, phandle)) + phandle++; + + node->phandle = phandle; + + if (!get_property(node, "linux,phandle") + && (phandle_format & PHANDLE_LEGACY)) + add_property(node, + build_property("linux,phandle", + data_append_cell(empty_data, phandle), + NULL)); + + if (!get_property(node, "phandle") + && (phandle_format & PHANDLE_EPAPR)) + add_property(node, + build_property("phandle", + data_append_cell(empty_data, phandle), + NULL)); + + /* If the node *does* have a phandle property, we must + * be dealing with a self-referencing phandle, which will be + * fixed up momentarily in the caller */ + + return node->phandle; +} diff --git a/contrib/dtc/scripts/setlocalversion b/contrib/dtc/scripts/setlocalversion new file mode 100755 index 000000000000..82e4993f0a73 --- /dev/null +++ b/contrib/dtc/scripts/setlocalversion @@ -0,0 +1,22 @@ +#!/bin/sh +# Print additional version information for non-release trees. + +usage() { + echo "Usage: $0 [srctree]" >&2 + exit 1 +} + +cd "${1:-.}" || usage + +# Check for git and a git repo. +if head=`git rev-parse --verify HEAD 2>/dev/null`; then + # Do we have an untagged version? + if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then + printf '%s%s' -g `echo "$head" | cut -c1-8` + fi + + # Are there uncommitted changes? + if git diff-index HEAD | read dummy; then + printf '%s' -dirty + fi +fi diff --git a/contrib/dtc/srcpos.c b/contrib/dtc/srcpos.c new file mode 100644 index 000000000000..8bb0c0223fde --- /dev/null +++ b/contrib/dtc/srcpos.c @@ -0,0 +1,240 @@ +/* + * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#define _GNU_SOURCE + +#include + +#include "dtc.h" +#include "srcpos.h" + + +/* + * Like yylineno, this is the current open file pos. + */ +struct dtc_file *srcpos_file; + +/* + * The empty source position. + */ + +struct dtc_file dtc_empty_file = { + .dir = NULL, + .name = "", + .file = NULL +}; + +srcpos srcpos_empty = { + .first_line = 0, + .first_column = 0, + .last_line = 0, + .last_column = 0, + .file = &dtc_empty_file +}; + + +static int +dtc_open_one(struct dtc_file *file, const char *search, const char *fname) +{ + char *fullname; + + if (search) { + fullname = xmalloc(strlen(search) + strlen(fname) + 2); + + strcpy(fullname, search); + strcat(fullname, "/"); + strcat(fullname, fname); + } else { + fullname = xstrdup(fname); + } + + file->file = fopen(fullname, "r"); + if (!file->file) { + free(fullname); + return 0; + } + + file->name = fullname; + return 1; +} + + +struct dtc_file * +dtc_open_file(const char *fname, const struct search_path *search) +{ + static const struct search_path default_search = { NULL, NULL, NULL }; + + struct dtc_file *file; + const char *slash; + + file = xmalloc(sizeof(struct dtc_file)); + + slash = strrchr(fname, '/'); + if (slash) { + char *dir = xmalloc(slash - fname + 1); + + memcpy(dir, fname, slash - fname); + dir[slash - fname] = 0; + file->dir = dir; + } else { + file->dir = NULL; + } + + if (streq(fname, "-")) { + file->name = "stdin"; + file->file = stdin; + return file; + } + + if (fname[0] == '/') { + file->file = fopen(fname, "r"); + if (!file->file) + goto fail; + + file->name = xstrdup(fname); + return file; + } + + if (!search) + search = &default_search; + + while (search) { + if (dtc_open_one(file, search->dir, fname)) + return file; + + if (errno != ENOENT) + goto fail; + + search = search->next; + } + +fail: + die("Couldn't open \"%s\": %s\n", fname, strerror(errno)); +} + + +void +dtc_close_file(struct dtc_file *file) +{ + if (fclose(file->file)) + die("Error closing \"%s\": %s\n", file->name, strerror(errno)); +} + + +srcpos * +srcpos_copy(srcpos *pos) +{ + srcpos *pos_new; + + pos_new = xmalloc(sizeof(srcpos)); + memcpy(pos_new, pos, sizeof(srcpos)); + + return pos_new; +} + + + +void +srcpos_dump(srcpos *pos) +{ + printf("file : \"%s\"\n", + pos->file ? (char *) pos->file : ""); + printf("first_line : %d\n", pos->first_line); + printf("first_column: %d\n", pos->first_column); + printf("last_line : %d\n", pos->last_line); + printf("last_column : %d\n", pos->last_column); + printf("file : %s\n", pos->file->name); +} + + +char * +srcpos_string(srcpos *pos) +{ + const char *fname; + char col_buf[100]; + char *pos_str; + + if (!pos) { + fname = ""; + } else if (pos->file->name) { + fname = pos->file->name; + if (strcmp(fname, "-") == 0) + fname = "stdin"; + } else { + fname = ""; + } + + if (pos->first_line == pos->last_line) { + if (pos->first_column == pos->last_column) { + snprintf(col_buf, sizeof(col_buf), + "%d:%d", + pos->first_line, pos->first_column); + } else { + snprintf(col_buf, sizeof(col_buf), + "%d:%d-%d", + pos->first_line, + pos->first_column, pos->last_column); + } + + } else { + snprintf(col_buf, sizeof(col_buf), + "%d:%d - %d:%d", + pos->first_line, pos->first_column, + pos->last_line, pos->last_column); + } + + if (asprintf(&pos_str, "%s %s", fname, col_buf) == -1) + return " + +struct dtc_file { + char *dir; + const char *name; + FILE *file; +}; + +#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE { + int first_line; + int first_column; + int last_line; + int last_column; + struct dtc_file *file; +} YYLTYPE; + +#define YYLTYPE_IS_DECLARED 1 +#define YYLTYPE_IS_TRIVIAL 1 +#endif + +/* Cater to old parser templates. */ +#ifndef YYID +#define YYID(n) (n) +#endif + +#define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + (Current).file = YYRHSLOC (Rhs, N).file; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + (Current).file = YYRHSLOC (Rhs, 0).file; \ + } \ + while (YYID (0)) + + +typedef YYLTYPE srcpos; + +/* + * Fictional source position used for IR nodes that are + * created without otherwise knowing a true source position. + * For example,constant definitions from the command line. + */ +extern srcpos srcpos_empty; + +extern struct dtc_file *srcpos_file; + +struct search_path { + const char *dir; /* NULL for current directory */ + struct search_path *prev, *next; +}; + +extern struct dtc_file *dtc_open_file(const char *fname, + const struct search_path *search); +extern void dtc_close_file(struct dtc_file *file); + +extern srcpos *srcpos_copy(srcpos *pos); +extern char *srcpos_string(srcpos *pos); +extern void srcpos_dump(srcpos *pos); + +extern void srcpos_error(srcpos *pos, char const *, ...) + __attribute__((format(printf, 2, 3))); +extern void srcpos_warn(srcpos *pos, char const *, ...) + __attribute__((format(printf, 2, 3))); + +#endif /* _SRCPOS_H_ */ diff --git a/contrib/dtc/treesource.c b/contrib/dtc/treesource.c new file mode 100644 index 000000000000..cc1751d7b4da --- /dev/null +++ b/contrib/dtc/treesource.c @@ -0,0 +1,279 @@ +/* + * (C) Copyright David Gibson , IBM Corporation. 2005. + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" +#include "srcpos.h" + +extern FILE *yyin; +extern int yyparse(void); + +struct boot_info *the_boot_info; +int treesource_error; + +struct boot_info *dt_from_source(const char *fname) +{ + the_boot_info = NULL; + treesource_error = 0; + + srcpos_file = dtc_open_file(fname, NULL); + yyin = srcpos_file->file; + + if (yyparse() != 0) + die("Unable to parse input tree\n"); + + if (treesource_error) + die("Syntax error parsing input tree\n"); + + return the_boot_info; +} + +static void write_prefix(FILE *f, int level) +{ + int i; + + for (i = 0; i < level; i++) + fputc('\t', f); +} + +static int isstring(char c) +{ + return (isprint(c) + || (c == '\0') + || strchr("\a\b\t\n\v\f\r", c)); +} + +static void write_propval_string(FILE *f, struct data val) +{ + const char *str = val.val; + int i; + struct marker *m = val.markers; + + assert(str[val.len-1] == '\0'); + + while (m && (m->offset == 0)) { + if (m->type == LABEL) + fprintf(f, "%s: ", m->ref); + m = m->next; + } + fprintf(f, "\""); + + for (i = 0; i < (val.len-1); i++) { + char c = str[i]; + + switch (c) { + case '\a': + fprintf(f, "\\a"); + break; + case '\b': + fprintf(f, "\\b"); + break; + case '\t': + fprintf(f, "\\t"); + break; + case '\n': + fprintf(f, "\\n"); + break; + case '\v': + fprintf(f, "\\v"); + break; + case '\f': + fprintf(f, "\\f"); + break; + case '\r': + fprintf(f, "\\r"); + break; + case '\\': + fprintf(f, "\\\\"); + break; + case '\"': + fprintf(f, "\\\""); + break; + case '\0': + fprintf(f, "\", "); + while (m && (m->offset < i)) { + if (m->type == LABEL) { + assert(m->offset == (i+1)); + fprintf(f, "%s: ", m->ref); + } + m = m->next; + } + fprintf(f, "\""); + break; + default: + if (isprint(c)) + fprintf(f, "%c", c); + else + fprintf(f, "\\x%02hhx", c); + } + } + fprintf(f, "\""); + + /* Wrap up any labels at the end of the value */ + for_each_marker_of_type(m, LABEL) { + assert (m->offset == val.len); + fprintf(f, " %s:", m->ref); + } +} + +static void write_propval_cells(FILE *f, struct data val) +{ + void *propend = val.val + val.len; + cell_t *cp = (cell_t *)val.val; + struct marker *m = val.markers; + + fprintf(f, "<"); + for (;;) { + while (m && (m->offset <= ((char *)cp - val.val))) { + if (m->type == LABEL) { + assert(m->offset == ((char *)cp - val.val)); + fprintf(f, "%s: ", m->ref); + } + m = m->next; + } + + fprintf(f, "0x%x", fdt32_to_cpu(*cp++)); + if ((void *)cp >= propend) + break; + fprintf(f, " "); + } + + /* Wrap up any labels at the end of the value */ + for_each_marker_of_type(m, LABEL) { + assert (m->offset == val.len); + fprintf(f, " %s:", m->ref); + } + fprintf(f, ">"); +} + +static void write_propval_bytes(FILE *f, struct data val) +{ + void *propend = val.val + val.len; + const char *bp = val.val; + struct marker *m = val.markers; + + fprintf(f, "["); + for (;;) { + while (m && (m->offset == (bp-val.val))) { + if (m->type == LABEL) + fprintf(f, "%s: ", m->ref); + m = m->next; + } + + fprintf(f, "%02hhx", *bp++); + if ((const void *)bp >= propend) + break; + fprintf(f, " "); + } + + /* Wrap up any labels at the end of the value */ + for_each_marker_of_type(m, LABEL) { + assert (m->offset == val.len); + fprintf(f, " %s:", m->ref); + } + fprintf(f, "]"); +} + +static void write_propval(FILE *f, struct property *prop) +{ + int len = prop->val.len; + const char *p = prop->val.val; + struct marker *m = prop->val.markers; + int nnotstring = 0, nnul = 0; + int nnotstringlbl = 0, nnotcelllbl = 0; + int i; + + if (len == 0) { + fprintf(f, ";\n"); + return; + } + + for (i = 0; i < len; i++) { + if (! isstring(p[i])) + nnotstring++; + if (p[i] == '\0') + nnul++; + } + + for_each_marker_of_type(m, LABEL) { + if ((m->offset > 0) && (prop->val.val[m->offset - 1] != '\0')) + nnotstringlbl++; + if ((m->offset % sizeof(cell_t)) != 0) + nnotcelllbl++; + } + + fprintf(f, " = "); + if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul)) + && (nnotstringlbl == 0)) { + write_propval_string(f, prop->val); + } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) { + write_propval_cells(f, prop->val); + } else { + write_propval_bytes(f, prop->val); + } + + fprintf(f, ";\n"); +} + +static void write_tree_source_node(FILE *f, struct node *tree, int level) +{ + struct property *prop; + struct node *child; + + write_prefix(f, level); + if (tree->label) + fprintf(f, "%s: ", tree->label); + if (tree->name && (*tree->name)) + fprintf(f, "%s {\n", tree->name); + else + fprintf(f, "/ {\n"); + + for_each_property(tree, prop) { + write_prefix(f, level+1); + if (prop->label) + fprintf(f, "%s: ", prop->label); + fprintf(f, "%s", prop->name); + write_propval(f, prop); + } + for_each_child(tree, child) { + fprintf(f, "\n"); + write_tree_source_node(f, child, level+1); + } + write_prefix(f, level); + fprintf(f, "};\n"); +} + + +void dt_to_source(FILE *f, struct boot_info *bi) +{ + struct reserve_info *re; + + fprintf(f, "/dts-v1/;\n\n"); + + for (re = bi->reservelist; re; re = re->next) { + if (re->label) + fprintf(f, "%s: ", re->label); + fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n", + (unsigned long long)re->re.address, + (unsigned long long)re->re.size); + } + + write_tree_source_node(f, bi->dt, 0); +} + diff --git a/contrib/dtc/util.c b/contrib/dtc/util.c new file mode 100644 index 000000000000..33631ce12e6a --- /dev/null +++ b/contrib/dtc/util.c @@ -0,0 +1,30 @@ +/* + * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +#include "dtc.h" + +char *xstrdup(const char *s) +{ + int len = strlen(s) + 1; + char *dup = xmalloc(len); + + memcpy(dup, s, len); + + return dup; +} diff --git a/contrib/dtc/util.h b/contrib/dtc/util.h new file mode 100644 index 000000000000..0fb60fee0d0d --- /dev/null +++ b/contrib/dtc/util.h @@ -0,0 +1,55 @@ +#ifndef _UTIL_H +#define _UTIL_H + +/* + * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ + +static inline void __attribute__((noreturn)) die(char * str, ...) +{ + va_list ap; + + va_start(ap, str); + fprintf(stderr, "FATAL ERROR: "); + vfprintf(stderr, str, ap); + exit(1); +} + +static inline void *xmalloc(size_t len) +{ + void *new = malloc(len); + + if (!new) + die("malloc() failed\n"); + + return new; +} + +static inline void *xrealloc(void *p, size_t len) +{ + void *new = realloc(p, len); + + if (!new) + die("realloc() failed (len=%d)\n", len); + + return new; +} + +extern char *xstrdup(const char *s); + +#endif /* _UTIL_H */ diff --git a/contrib/ee/ee.c b/contrib/ee/ee.c index a603756fb51b..ae37f65e7175 100755 --- a/contrib/ee/ee.c +++ b/contrib/ee/ee.c @@ -1989,7 +1989,7 @@ char *cmd_str; int number; int i; char *ptr; - char *direction = NULL; + char *direction = "d"; struct text *t_line; ptr = cmd_str; diff --git a/contrib/expat/lib/xmlparse.c b/contrib/expat/lib/xmlparse.c index 94e31de9da3f..e111460d0a3d 100644 --- a/contrib/expat/lib/xmlparse.c +++ b/contrib/expat/lib/xmlparse.c @@ -3725,7 +3725,6 @@ doProlog(XML_Parser parser, return XML_ERROR_NO_ELEMENTS; default: tok = -tok; - next = end; break; } } diff --git a/contrib/expat/lib/xmltok_impl.c b/contrib/expat/lib/xmltok_impl.c index 126881925222..16dfb85f031e 100644 --- a/contrib/expat/lib/xmltok_impl.c +++ b/contrib/expat/lib/xmltok_impl.c @@ -1744,7 +1744,7 @@ PREFIX(updatePosition)(const ENCODING *enc, const char *end, POSITION *pos) { - while (ptr != end) { + while (ptr < end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ diff --git a/contrib/gcc/config/freebsd-spec.h b/contrib/gcc/config/freebsd-spec.h index 06735c8874e1..5cd57b0bf615 100644 --- a/contrib/gcc/config/freebsd-spec.h +++ b/contrib/gcc/config/freebsd-spec.h @@ -103,9 +103,10 @@ Boston, MA 02110-1301, USA. */ %{p:gcrt1.o%s} \ %{!p: \ %{profile:gcrt1.o%s} \ - %{!profile:crt1.o%s}}}} \ + %{!profile: \ + %{pie: Scrt1.o%s;:crt1.o%s}}}}} \ crti.o%s \ - %{static:crtbeginT.o%s;shared:crtbeginS.o%s;:crtbegin.o%s}" + %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" /* Provide an ENDFILE_SPEC appropriate for FreeBSD/i386. Here we tack on our own magical crtend.o file (see crtstuff.c) which provides part of @@ -113,8 +114,7 @@ Boston, MA 02110-1301, USA. */ entering `main', followed by the normal "finalizer" file, `crtn.o'. */ #define FBSD_ENDFILE_SPEC "\ - %{!shared:crtend.o%s} \ - %{shared:crtendS.o%s} \ + %{shared|pie:crtendS.o%s;:crtend.o%s} \ crtn.o%s " /* Provide a LIB_SPEC appropriate for FreeBSD as configured and as diff --git a/contrib/gcc/config/i386/i386.c b/contrib/gcc/config/i386/i386.c index feab422cc383..e737ba542d4e 100644 --- a/contrib/gcc/config/i386/i386.c +++ b/contrib/gcc/config/i386/i386.c @@ -1614,7 +1614,7 @@ override_options (void) "-mtune=generic instead as appropriate."); if (!ix86_arch_string) - ix86_arch_string = TARGET_64BIT ? "x86-64" : "i386"; + ix86_arch_string = TARGET_64BIT ? "x86-64" : "i486"; if (!strcmp (ix86_arch_string, "generic")) error ("generic CPU can be used only for -mtune= switch"); if (!strncmp (ix86_arch_string, "generic", 7)) diff --git a/contrib/gcc/config/mips/freebsd.h b/contrib/gcc/config/mips/freebsd.h index f4b1cf572e32..6627e03fd15a 100644 --- a/contrib/gcc/config/mips/freebsd.h +++ b/contrib/gcc/config/mips/freebsd.h @@ -97,6 +97,9 @@ Boston, MA 02110-1301, USA. */ Needs to agree with . GCC defaults come from c-decl.c, c-common.c, and config//.h. */ +#undef TARGET_DEFAULT +#define TARGET_DEFAULT (MASK_ABICALLS | MASK_SOFT_FLOAT) + #if TARGET_ENDIAN_DEFAULT != 0 #define TARGET_VERSION fprintf (stderr, " (FreeBSD/mips)"); #else @@ -127,10 +130,67 @@ Boston, MA 02110-1301, USA. */ if (TARGET_MIPS16) \ builtin_define ("__mips16"); \ \ + if (mips_abi == ABI_N32) \ + { \ + builtin_define ("__mips_n32"); \ + builtin_define ("_ABIN32=2"); \ + builtin_define ("_MIPS_SIM=_ABIN32"); \ + builtin_define ("_MIPS_SZLONG=32"); \ + builtin_define ("_MIPS_SZPTR=32"); \ + } \ + else if (mips_abi == ABI_64) \ + { \ + builtin_define ("__mips_n64"); \ + builtin_define ("_ABI64=3"); \ + builtin_define ("_MIPS_SIM=_ABI64"); \ + builtin_define ("_MIPS_SZLONG=64"); \ + builtin_define ("_MIPS_SZPTR=64"); \ + } \ + else if (mips_abi == ABI_O64) \ + { \ + builtin_define ("__mips_o64"); \ + builtin_define ("_ABIO64=4"); \ + builtin_define ("_MIPS_SIM=_ABIO64"); \ + builtin_define ("_MIPS_SZLONG=64"); \ + builtin_define ("_MIPS_SZPTR=64"); \ + } \ + else if (mips_abi == ABI_EABI) \ + { \ + builtin_define ("__mips_eabi"); \ + builtin_define ("_ABIEMB=5"); \ + builtin_define ("_MIPS_SIM=_ABIEMB"); \ + if (TARGET_LONG64) \ + builtin_define ("_MIPS_SZLONG=64"); \ + else \ + builtin_define ("_MIPS_SZLONG=32"); \ + if (TARGET_64BIT) \ + builtin_define ("_MIPS_SZPTR=64"); \ + else \ + builtin_define ("_MIPS_SZPTR=32"); \ + } \ + else \ + { \ + builtin_define ("__mips_o32"); \ + builtin_define ("_ABIO32=1"); \ + builtin_define ("_MIPS_SIM=_ABIO32"); \ + builtin_define ("_MIPS_SZLONG=32"); \ + builtin_define ("_MIPS_SZPTR=32"); \ + } \ + if (TARGET_FLOAT64) \ + builtin_define ("_MIPS_FPSET=32"); \ + else \ + builtin_define ("_MIPS_FPSET=16"); \ + \ + builtin_define ("_MIPS_SZINT=32"); \ + \ MIPS_CPP_SET_PROCESSOR ("_MIPS_ARCH", mips_arch_info); \ MIPS_CPP_SET_PROCESSOR ("_MIPS_TUNE", mips_tune_info); \ \ - if (ISA_MIPS3) \ + if (ISA_MIPS1) \ + builtin_define ("__mips=1"); \ + else if (ISA_MIPS2) \ + builtin_define ("__mips=2"); \ + else if (ISA_MIPS3) \ builtin_define ("__mips=3"); \ else if (ISA_MIPS4) \ builtin_define ("__mips=4"); \ @@ -149,7 +209,12 @@ Boston, MA 02110-1301, USA. */ builtin_define ("__mips=64"); \ builtin_define ("__mips_isa_rev=1"); \ } \ - \ +/* else if (ISA_MIPS64R2) \ + { \ + builtin_define ("__mips=64"); \ + builtin_define ("__mips_isa_rev=2"); \ + } \ +*/ \ if (TARGET_HARD_FLOAT) \ builtin_define ("__mips_hard_float"); \ else if (TARGET_SOFT_FLOAT) \ @@ -164,18 +229,6 @@ Boston, MA 02110-1301, USA. */ builtin_define ("__MIPSEL__"); \ \ /* No language dialect defines. */ \ - \ - if (mips_abi == ABI_EABI) \ - builtin_define ("__mips_eabi"); \ - else if (mips_abi == ABI_N32) \ - builtin_define ("__mips_n32"); \ - else if (mips_abi == ABI_64) \ - builtin_define ("__mips_n64"); \ - else if (mips_abi == ABI_O64) \ - builtin_define ("__mips_o64"); \ - else \ - builtin_define ("__mips_o32"); \ - \ if (TARGET_ABICALLS) \ builtin_define ("__ABICALLS__"); \ } \ @@ -238,6 +291,15 @@ Boston, MA 02110-1301, USA. */ #undef LOCAL_LABEL_PREFIX #define LOCAL_LABEL_PREFIX "." +/* Currently we don't support 128bit long doubles, so for now we force + n32 to be 64bit. */ +#undef LONG_DOUBLE_TYPE_SIZE +#define LONG_DOUBLE_TYPE_SIZE 64 + +#ifdef IN_LIBGCC2 +#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE +#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 +#endif /************************[ Debugger stuff ]*********************************/ diff --git a/contrib/gdb/gdb/config/mips/nm-fbsd.h b/contrib/gdb/gdb/config/mips/nm-fbsd.h new file mode 100644 index 000000000000..a23a6d9e176b --- /dev/null +++ b/contrib/gdb/gdb/config/mips/nm-fbsd.h @@ -0,0 +1,48 @@ +/*********************************************************************** +Copyright 2003-2006 Raza Microelectronics, Inc.(RMI). +This is a derived work from software originally provided by the external +entity identified below. The licensing terms and warranties specified in +the header of the original work apply to this derived work. +Contribution by RMI: +*****************************#RMI_1#**********************************/ +/* Native-dependent definitions for NetBSD/mips. + Copyright 2002 Free Software Foundation, Inc. + Contributed by Wasabi Systems, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef NM_FBSD_H +#define NM_FBSD_H + +/* Override child_pid_to_exec_file in 'inftarg.c'. */ +#define CHILD_PID_TO_EXEC_FILE + +/* Type of the third argument to the `ptrace' system call. */ +#define PTRACE_ARG3_TYPE caddr_t + +/* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. */ +#define FETCH_INFERIOR_REGISTERS + +/* We can attach and detach. */ +#define ATTACH_DETACH + +/* Shared library support. */ + +#include "solib.h" + +#endif /* NM_FBSD_H */ diff --git a/contrib/gdb/gdb/config/mips/tm-fbsd.h b/contrib/gdb/gdb/config/mips/tm-fbsd.h new file mode 100644 index 000000000000..7f69f0b77d08 --- /dev/null +++ b/contrib/gdb/gdb/config/mips/tm-fbsd.h @@ -0,0 +1,43 @@ +/*********************************************************************** +Copyright 2003-2006 Raza Microelectronics, Inc.(RMI). +This is a derived work from software originally provided by the external +entity identified below. The licensing terms and warranties specified in +the header of the original work apply to this derived work. +Contribution by RMI: +*****************************#RMI_1#**********************************/ +/* Target-dependent definitions for NetBSD/mips. + Copyright 2002 Free Software Foundation, Inc. + Contributed by Wasabi Systems, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef TM_FBSD_H +#define TM_FBSD_H + +#include "mips/tm-mips.h" +#include "solib.h" + +/* We don't want to inherit tm-mips.h's shared library trampoline code. */ +#undef IN_SOLIB_CALL_TRAMPOLINE +#undef IN_SOLIB_RETURN_TRAMPOLINE +#undef SKIP_TRAMPOLINE_CODE +#undef IGNORE_HELPER_CALL + +/* XXX undef a bunch of stuff we want to use multi-arch */ +#undef IN_SIGTRAMP +#endif /* TM_FBSD_H */ diff --git a/contrib/gdb/gdb/mips-tdep.h b/contrib/gdb/gdb/mips-tdep.h index 7a00ffaf5e9d..af9a3c8dfc2e 100644 --- a/contrib/gdb/gdb/mips-tdep.h +++ b/contrib/gdb/gdb/mips-tdep.h @@ -62,6 +62,17 @@ struct mips_regnum extern const struct mips_regnum *mips_regnum (struct gdbarch *gdbarch); enum { + MIPS_S0_REGNUM = 16, + MIPS_S1_REGNUM = 17, + MIPS_S2_REGNUM = 18, + MIPS_S3_REGNUM = 19, + MIPS_S4_REGNUM = 20, + MIPS_S5_REGNUM = 21, + MIPS_S6_REGNUM = 22, + MIPS_S7_REGNUM = 23, + MIPS_SP_REGNUM = 29, + MIPS_FP_REGNUM = 30, + MIPS_RA_REGNUM = 31, MIPS_EMBED_LO_REGNUM = 33, MIPS_EMBED_HI_REGNUM = 34, MIPS_EMBED_BADVADDR_REGNUM = 35, diff --git a/contrib/gdb/gdb/mipsfbsd-nat.c b/contrib/gdb/gdb/mipsfbsd-nat.c new file mode 100644 index 000000000000..8b58971ec9c4 --- /dev/null +++ b/contrib/gdb/gdb/mipsfbsd-nat.c @@ -0,0 +1,108 @@ +/*********************************************************************** +Copyright 2003-2006 Raza Microelectronics, Inc.(RMI). +This is a derived work from software originally provided by the external +entity identified below. The licensing terms and warranties specified in +the header of the original work apply to this derived work. +Contribution by RMI: +*****************************#RMI_1#**********************************/ +/* Native-dependent code for MIPS systems running NetBSD. + Copyright 2000, 2001, 2002 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "defs.h" +#include "inferior.h" +#include "regcache.h" + +#include "mipsfbsd-tdep.h" + +#include +#include +#include + +/* Determine if PT_GETREGS fetches this register. */ +static int +getregs_supplies (int regno) +{ + return ((regno) >= ZERO_REGNUM && (regno) <= PC_REGNUM); +} + +void +fetch_inferior_registers (int regno) +{ + if (regno == -1 || getregs_supplies (regno)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't get registers"); + + mipsfbsd_supply_reg ((char *) ®s, regno); + if (regno != -1) + return; + } + + if (regno == -1 || regno >= FP0_REGNUM) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't get floating point status"); + + mipsfbsd_supply_fpreg ((char *) &fpregs, regno); + } +} + +void +store_inferior_registers (int regno) +{ + if (regno == -1 || getregs_supplies (regno)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't get registers"); + + mipsfbsd_fill_reg ((char *) ®s, regno); + + if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't write registers"); + + if (regno != -1) + return; + } + + if (regno == -1 || regno >= FP0_REGNUM) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't get floating point status"); + + mipsfbsd_fill_fpreg ((char *) &fpregs, regno); + + if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't write floating point status"); + } +} diff --git a/contrib/gdb/gdb/mipsfbsd-tdep.c b/contrib/gdb/gdb/mipsfbsd-tdep.c new file mode 100644 index 000000000000..0be5d2762c4b --- /dev/null +++ b/contrib/gdb/gdb/mipsfbsd-tdep.c @@ -0,0 +1,579 @@ +/*********************************************************************** +Copyright 2003-2006 Raza Microelectronics, Inc.(RMI). +This is a derived work from software originally provided by the external +entity identified below. The licensing terms and warranties specified in +the header of the original work apply to this derived work. +Contribution by RMI: +*****************************#RMI_1#**********************************/ +/* Target-dependent code for MIPS systems running NetBSD. + Copyright 2002, 2003 Free Software Foundation, Inc. + Contributed by Wasabi Systems, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "defs.h" +#include "gdbcore.h" +#include "regcache.h" +#include "target.h" +#include "value.h" +#include "osabi.h" + +#include "nbsd-tdep.h" +#include "mipsfbsd-tdep.h" +#include "mips-tdep.h" + +#include "solib-svr4.h" + +#include +#include "gregset.h" +#include "trad-frame.h" +#include "frame.h" +#include "frame-unwind.h" +#include "bfd.h" +#include "objfiles.h" + +/* Conveniently, GDB uses the same register numbering as the + ptrace register structure used by NetBSD/mips. */ + +void +mipsfbsd_supply_reg (char *regs, int regno) +{ + int i; + + for (i = 0; i <= PC_REGNUM; i++) + { + if (regno == i || regno == -1) + { + if (CANNOT_FETCH_REGISTER (i)) + supply_register (i, NULL); + else + supply_register (i, regs + (i * mips_regsize (current_gdbarch))); + } + } +} +void +supply_gregset (gdb_gregset_t *gregs) +{ + mipsfbsd_supply_reg((char *)gregs, -1); +} + +void +mipsfbsd_fill_reg (char *regs, int regno) +{ + int i; + + for (i = 0; i <= PC_REGNUM; i++) + if ((regno == i || regno == -1) && ! CANNOT_STORE_REGISTER (i)) + regcache_collect (i, regs + (i * mips_regsize (current_gdbarch))); +} + +void +fill_gregset (gdb_gregset_t *gregs, int regno) +{ + mipsfbsd_fill_reg ((char *)gregs, regno); +} + +void +mipsfbsd_supply_fpreg (char *fpregs, int regno) +{ + int i; + + for (i = FP0_REGNUM; + i <= mips_regnum (current_gdbarch)->fp_implementation_revision; + i++) + { + if (regno == i || regno == -1) + { + if (CANNOT_FETCH_REGISTER (i)) + supply_register (i, NULL); + else + supply_register (i, + fpregs + ((i - FP0_REGNUM) * mips_regsize (current_gdbarch))); + } + } +} + +void +supply_fpregset (gdb_fpregset_t *fpregs) +{ + mipsfbsd_supply_fpreg((char *)fpregs, -1); +} + +void +mipsfbsd_fill_fpreg (char *fpregs, int regno) +{ + int i; + + for (i = FP0_REGNUM; i <= mips_regnum (current_gdbarch)->fp_control_status; + i++) + if ((regno == i || regno == -1) && ! CANNOT_STORE_REGISTER (i)) + regcache_collect (i, + fpregs + ((i - FP0_REGNUM) * mips_regsize (current_gdbarch))); +} + +void +fill_fpregset (gdb_fpregset_t *fpregs, int regno) +{ + mipsfbsd_fill_fpreg ((char *)fpregs, regno); +} + +static void +fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which, + CORE_ADDR ignore) +{ + char *regs, *fpregs; + + /* We get everything from one section. */ + if (which != 0) + return; + + regs = core_reg_sect; + fpregs = core_reg_sect + SIZEOF_STRUCT_REG; + + /* Integer registers. */ + mipsfbsd_supply_reg (regs, -1); + + /* Floating point registers. */ + mipsfbsd_supply_fpreg (fpregs, -1); +} + +static void +fetch_elfcore_registers (char *core_reg_sect, unsigned core_reg_size, int which, + CORE_ADDR ignore) +{ + switch (which) + { + case 0: /* Integer registers. */ + if (core_reg_size != SIZEOF_STRUCT_REG) + warning ("Wrong size register set in core file."); + else + mipsfbsd_supply_reg (core_reg_sect, -1); + break; + + case 2: /* Floating point registers. */ + if (core_reg_size != SIZEOF_STRUCT_FPREG) + warning ("Wrong size register set in core file."); + else + mipsfbsd_supply_fpreg (core_reg_sect, -1); + break; + + default: + /* Don't know what kind of register request this is; just ignore it. */ + break; + } +} + +static struct core_fns mipsfbsd_core_fns = +{ + bfd_target_unknown_flavour, /* core_flavour */ + default_check_format, /* check_format */ + default_core_sniffer, /* core_sniffer */ + fetch_core_registers, /* core_read_registers */ + NULL /* next */ +}; + + +/* + * MIPSFBSD Offsets + * 0x7fff0000 User high mem -> USRSTACK [64K] + * + * 0x7ffefff0 ps_strings -> 16 bytes + * + * 0x7ffeffec sigcode -> 44 bytes + * + * 0x7ffeffc4 sigcode end env strings etc start + */ +#define MIPS_FBSD_SIGTRAMP_START (0x7ffeffc4) +#define MIPS_FBSD_SIGTRAMP_END (0x7ffeffec) +#define MIPS_FBSD_SIGTRAMP_STACK_MOD_START (0x7ffeffc8) +#define MIPS_FBSD_SIGTRAMP_STACK_MOD_END (0x7ffeffd8) + +static LONGEST +mipsfbsd_sigtramp_offset (CORE_ADDR pc) +{ + return pc < MIPS_FBSD_SIGTRAMP_END && + pc >= MIPS_FBSD_SIGTRAMP_START ? 1 : -1; +} + +static int +fbsd_pc_in_sigtramp (CORE_ADDR pc, char *name) +{ + return (name && strcmp (name, "__sigtramp") == 0); +} + +static int +mipsfbsd_pc_in_sigtramp (CORE_ADDR pc, char *func_name) +{ + return (fbsd_pc_in_sigtramp (pc, func_name) + || mipsfbsd_sigtramp_offset (pc) >= 0); +} + +static int +is_sigtramp_sp_modified (CORE_ADDR pc) +{ + return (pc >= MIPS_FBSD_SIGTRAMP_STACK_MOD_START && + pc <= MIPS_FBSD_SIGTRAMP_STACK_MOD_END); +} + + +/* Figure out where the longjmp will land. We expect that we have + just entered longjmp and haven't yet setup the stack frame, so + the args are still in the argument regs. A0_REGNUM points at the + jmp_buf structure from which we extract the PC that we will land + at. The PC is copied into *pc. This routine returns true on + success. */ + +#define FBSD_MIPS_JB_PC (12) +#define FBSD_MIPS_JB_ELEMENT_SIZE mips_regsize (current_gdbarch) +#define FBSD_MIPS_JB_OFFSET (FBSD_MIPS_JB_PC * \ + FBSD_MIPS_JB_ELEMENT_SIZE) + +static int +mipsfbsd_get_longjmp_target (CORE_ADDR *pc) +{ + CORE_ADDR jb_addr; + char *buf; + + buf = alloca (FBSD_MIPS_JB_ELEMENT_SIZE); + + jb_addr = read_register (A0_REGNUM); + + if (target_read_memory (jb_addr + FBSD_MIPS_JB_OFFSET, buf, + FBSD_MIPS_JB_ELEMENT_SIZE)) + return 0; + + *pc = extract_unsigned_integer (buf, FBSD_MIPS_JB_ELEMENT_SIZE); + + return 1; +} + +static int +mipsfbsd_cannot_fetch_register (int regno) +{ + return (regno == ZERO_REGNUM + || regno == mips_regnum (current_gdbarch)->fp_implementation_revision); + /* XXX TODO: Are there other registers that we cannot fetch ? */ +} + +static int +mipsfbsd_cannot_store_register (int regno) +{ + return (regno == ZERO_REGNUM + || regno == mips_regnum (current_gdbarch)->fp_implementation_revision); + /* XXX TODO: Are there other registers that we cannot write ? */ +} + +/* + * This structure is defined in mips-tdep.c. + */ +struct mips_frame_cache +{ + CORE_ADDR base; + struct trad_frame_saved_reg *saved_regs; +}; + +/* + * Prologue cache for sigtramp frame + * When we land in sigtramp, sigcontext is saved on the + * stack just below the sigtramp's stack frame. We have + * the Registers saved at fixed offsets on the stack. + */ + +#define MIPS_FBSD_SIGTRAMP_STACK_SIZE (48) +#define MIPS_FBSD_SIGCONTEXT_REG_OFFSET (32) + +static struct mips_frame_cache * +mipsfbsd_sigtramp_frame_cache (struct frame_info *next_frame, + void **this_cache) +{ + struct mips_frame_cache *cache; + CORE_ADDR gregs_addr, sp, pc; + int regnum; + int sigtramp_stack_size; + + if (*this_cache) + return *this_cache; + + cache = FRAME_OBSTACK_ZALLOC (struct mips_frame_cache); + *this_cache = cache; + + cache->saved_regs = trad_frame_alloc_saved_regs (next_frame); + + /* + * Get sp of next frame which is the adjusted sp of + * tramp code. + */ + sp = frame_unwind_register_unsigned(next_frame, NUM_REGS + SP_REGNUM); + pc = frame_unwind_register_unsigned(next_frame, NUM_REGS + PC_REGNUM); + sigtramp_stack_size = is_sigtramp_sp_modified(pc) ? + MIPS_FBSD_SIGTRAMP_STACK_SIZE : 0; + gregs_addr = sp + sigtramp_stack_size + MIPS_FBSD_SIGCONTEXT_REG_OFFSET; + + for (regnum = 0; regnum < PC_REGNUM; regnum++) { + cache->saved_regs[NUM_REGS + regnum].addr = gregs_addr + + regnum * mips_regsize (current_gdbarch); + } + /* Only retrieve PC and SP */ + cache->saved_regs[NUM_REGS + SP_REGNUM].addr = gregs_addr + + SP_REGNUM * ( mips_regsize (current_gdbarch)); + + cache->saved_regs[NUM_REGS + RA_REGNUM].addr = gregs_addr + + RA_REGNUM * ( mips_regsize (current_gdbarch)); + + cache->base = get_frame_memory_unsigned (next_frame, + cache->saved_regs[NUM_REGS + SP_REGNUM].addr, + mips_regsize (current_gdbarch)); + + /* Todo: Floating point registers */ + + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->pc] + = cache->saved_regs[NUM_REGS + RA_REGNUM]; + + return *this_cache; +} + +static void +mipsfbsd_sigtramp_frame_this_id (struct frame_info *next_frame, + void **this_cache, + struct frame_id *this_id) +{ + struct mips_frame_cache *cache = + mipsfbsd_sigtramp_frame_cache (next_frame, this_cache); + + (*this_id) = frame_id_build (cache->base, + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->pc].addr); +} + +static void +mipsfbsd_sigtramp_frame_prev_register (struct frame_info *next_frame, + void **this_cache, + int regnum, int *optimizedp, + enum lval_type *lvalp, + CORE_ADDR *addrp, + int *realnump, void *valuep) +{ + struct mips_frame_cache *cache = + mipsfbsd_sigtramp_frame_cache (next_frame, this_cache); + + trad_frame_prev_register (next_frame, cache->saved_regs, regnum, + optimizedp, lvalp, addrp, realnump, valuep); +} + + +static const struct frame_unwind mipsfbsd_sigtramp_frame_unwind = +{ + SIGTRAMP_FRAME, + mipsfbsd_sigtramp_frame_this_id, + mipsfbsd_sigtramp_frame_prev_register +}; + +static const struct frame_unwind * +mipsfbsd_sigtramp_frame_sniffer (struct frame_info *next_frame) +{ + CORE_ADDR pc = frame_pc_unwind (next_frame); + char *name; + + find_pc_partial_function (pc, &name, NULL, NULL); + if (mipsfbsd_pc_in_sigtramp (pc, name) ) + return &mipsfbsd_sigtramp_frame_unwind; + + return NULL; +} + +/* + * Find out if PC has landed into dynamic library stub. + * We can find it by seeing if the name of the object + * file section where the PC lies is "MIPS.stubs" + */ + +int +mipsfbsd_in_stub_section (CORE_ADDR pc, char *name) +{ + struct obj_section *s; + int retval = 0; + + s = find_pc_section (pc); + + retval = (s != NULL + && s->the_bfd_section->name != NULL + && strcmp (s->the_bfd_section->name, ".MIPS.stubs") == 0); + return (retval); +} + + +/* + * Prologue cache for dynamic library stub frame. + * This stub does not modify the SP, so we set the + * cache base to calling frame's SP + */ +static struct mips_frame_cache * +mipsfbsd_stub_frame_cache (struct frame_info *next_frame, + void **this_cache) +{ + struct mips_frame_cache *cache; + + if (*this_cache) + return *this_cache; + + cache = FRAME_OBSTACK_ZALLOC (struct mips_frame_cache); + *this_cache = cache; + + cache->saved_regs = trad_frame_alloc_saved_regs (next_frame); + + + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->pc].realreg = + NUM_REGS + RA_REGNUM; + cache->base = frame_unwind_register_unsigned (next_frame, + NUM_REGS + SP_REGNUM); + + return (*this_cache); +} + + +static void +mipsfbsd_stub_frame_this_id (struct frame_info *next_frame, + void **this_cache, + struct frame_id *this_id) +{ + struct mips_frame_cache *cache = + mipsfbsd_stub_frame_cache (next_frame, this_cache); + + (*this_id) = frame_id_build (cache->base, + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->pc].addr); +} + +static void +mipsfbsd_stub_frame_prev_register (struct frame_info *next_frame, + void **this_cache, + int regnum, int *optimizedp, + enum lval_type *lvalp, CORE_ADDR *addrp, + int *realnump, void *valuep) +{ + struct mips_frame_cache *cache = + mipsfbsd_stub_frame_cache (next_frame, this_cache); + + trad_frame_prev_register (next_frame, cache->saved_regs, regnum, + optimizedp, lvalp, addrp, realnump, valuep); +} + + + +static const struct frame_unwind mipsfbsd_stub_frame_unwind = { + NORMAL_FRAME, + mipsfbsd_stub_frame_this_id, + mipsfbsd_stub_frame_prev_register +}; + +static const struct frame_unwind * +mipsfbsd_stub_frame_sniffer (struct frame_info *next_frame) +{ + CORE_ADDR pc = frame_pc_unwind (next_frame); + + if (mipsfbsd_in_stub_section(pc, NULL)) + return &mipsfbsd_stub_frame_unwind; + + return NULL; +} + +/* + * typedef struct link_map { + * caddr_t l_addr; /* Base Address of library + * #ifdef __mips__ + * caddr_t l_offs; /* Load Offset of library + * #endif + * const char *l_name; /* Absolute Path to Library + * const void *l_ld; /* Pointer to .dynamic in memory + * struct link_map *l_next, *l_prev; /* linked list of of mapped libs + * } Link_map; + * + * struct r_debug { + * int r_version; /* not used + * struct link_map *r_map; /* list of loaded images + * void (*r_brk)(struct r_debug *, struct link_map *); + * /* pointer to break point + * enum { + * RT_CONSISTENT, /* things are stable + * RT_ADD, /* adding a shared library + * RT_DELETE /* removing a shared library + * } r_state; + * }; + * + */ + +static struct link_map_offsets * +mipsfbsd_ilp32_solib_svr4_fetch_link_map_offsets (void) +{ + static struct link_map_offsets lmo; + static struct link_map_offsets *lmp = NULL; + + if (lmp == NULL) + { + lmp = &lmo; + + lmo.r_debug_size = 16; + + lmo.r_map_offset = 4; + lmo.r_map_size = 4; + + lmo.link_map_size = 24; + + lmo.l_addr_offset = 0; + lmo.l_addr_size = 4; + + lmo.l_name_offset = 8; + lmo.l_name_size = 4; + + lmo.l_next_offset = 16; + lmo.l_next_size = 4; + + lmo.l_prev_offset = 20; + lmo.l_prev_size = 4; + } + + return lmp; +} + +static void +mipsfbsd_init_abi (struct gdbarch_info info, + struct gdbarch *gdbarch) +{ + set_gdbarch_pc_in_sigtramp (gdbarch, mipsfbsd_pc_in_sigtramp); + + set_gdbarch_get_longjmp_target (gdbarch, mipsfbsd_get_longjmp_target); + + set_gdbarch_cannot_fetch_register (gdbarch, mipsfbsd_cannot_fetch_register); + set_gdbarch_cannot_store_register (gdbarch, mipsfbsd_cannot_store_register); + + set_gdbarch_software_single_step (gdbarch, mips_software_single_step); + set_solib_svr4_fetch_link_map_offsets (gdbarch, + mipsfbsd_ilp32_solib_svr4_fetch_link_map_offsets); + set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + set_gdbarch_in_solib_call_trampoline (gdbarch, mipsfbsd_in_stub_section); + + /* frame sniffers */ + frame_unwind_append_sniffer (gdbarch, mipsfbsd_sigtramp_frame_sniffer); + frame_unwind_append_sniffer (gdbarch, mipsfbsd_stub_frame_sniffer); + +} + +void +_initialize_mipsfbsd_tdep (void) +{ + gdbarch_register_osabi (bfd_arch_mips, 0, GDB_OSABI_FREEBSD_ELF, + mipsfbsd_init_abi); +} diff --git a/contrib/gdb/gdb/mipsfbsd-tdep.h b/contrib/gdb/gdb/mipsfbsd-tdep.h new file mode 100644 index 000000000000..6b00bb4991f9 --- /dev/null +++ b/contrib/gdb/gdb/mipsfbsd-tdep.h @@ -0,0 +1,40 @@ +/*********************************************************************** +Copyright 2003-2006 Raza Microelectronics, Inc.(RMI). +This is a derived work from software originally provided by the external +entity identified below. The licensing terms and warranties specified in +the header of the original work apply to this derived work. +Contribution by RMI: +*****************************#RMI_1#**********************************/ +/* Common target dependent code for GDB on MIPS systems running NetBSD. + Copyright 2002 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef mipsfbsd_TDEP_H +#define mipsfbsd_TDEP_H + +void mipsfbsd_supply_reg (char *, int); +void mipsfbsd_fill_reg (char *, int); + +void mipsfbsd_supply_fpreg (char *, int); +void mipsfbsd_fill_fpreg (char *, int); + +#define SIZEOF_STRUCT_REG (38 * mips_regsize (current_gdbarch)) +#define SIZEOF_STRUCT_FPREG (33 * mips_regsize (current_gdbarch)) + +#endif /* mipsfbsd_TDEP_H */ diff --git a/contrib/groff/font/devutf8/R.proto b/contrib/groff/font/devutf8/R.proto index 3e69500db51a..ac0828fe4926 100644 --- a/contrib/groff/font/devutf8/R.proto +++ b/contrib/groff/font/devutf8/R.proto @@ -726,7 +726,7 @@ st 24 0 0x220B product 24 0 0x220F coproduct 24 0 0x2210 sum 24 0 0x2211 -\- 24 0 0x002D +\- 24 0 0x2212 mi " -+ 24 0 0x2213 ** 24 0 0x2217 diff --git a/contrib/groff/tmac/an-old.tmac b/contrib/groff/tmac/an-old.tmac index b51f2e2f4f6f..2bf34b304a38 100644 --- a/contrib/groff/tmac/an-old.tmac +++ b/contrib/groff/tmac/an-old.tmac @@ -630,6 +630,18 @@ . hy \n[HY] .\} . +.\" For UTF-8, map some characters conservatively for the sake +.\" of easy cut and paste. +. +.if '\*[.T]'utf8' \{\ +. rchar \- - ' ` +. +. char \- \N'45' +. char - \N'45' +. char ' \N'39' +. char ` \N'96' +.\} +. .\" Load local modifications. .mso man.local . diff --git a/contrib/groff/tmac/doc-common b/contrib/groff/tmac/doc-common index dc8cc28c3191..ff99165ef63b 100644 --- a/contrib/groff/tmac/doc-common +++ b/contrib/groff/tmac/doc-common @@ -46,6 +46,7 @@ .nr %Q 1 .nr %R 1 .nr %T 1 +.nr %U 1 .nr %V 1 .nr Ac 3 .nr Ad 12n @@ -77,6 +78,7 @@ .nr Dq 12n .nr Ds 6n\" many manpages still use this as a -width value .nr Dv 12n +.nr Dx 1 .nr Ec 3 .nr Ef 8n\" ? .nr Ek 8n\" ? @@ -219,6 +221,7 @@ .\" NS doc-document-title .\" NS doc-section .\" NS doc-volume +.\" NS doc-command-name .\" NS .\" NS local variables: .\" NS doc-volume-as-XXX @@ -319,6 +322,7 @@ . ds doc-document-title UNTITLED . ds doc-volume LOCAL . ds doc-section Null +. ds doc-command-name . . if !"\$1"" \ . ds doc-document-title "\$1 @@ -357,6 +361,12 @@ . if !"\$3"" \ . if "\*[doc-volume]"LOCAL" \ . ds doc-volume \$3 +. +. if !\n[cR] \ +. if \n[nl] \{\ + . doc-setup-header +. bp +. \} .. . . @@ -379,6 +389,7 @@ .\" NS .\" NS modifies: .\" NS doc-operating-system +.\" NS doc-command-name .\" NS .\" NS local variables: .\" NS doc-operating-system-XXX-XXX @@ -435,9 +446,14 @@ .ds doc-operating-system-NetBSD-2.0 2.0 .ds doc-operating-system-NetBSD-2.0.1 2.0.1 .ds doc-operating-system-NetBSD-2.0.2 2.0.2 +.ds doc-operating-system-NetBSD-2.0.3 2.0.3 .ds doc-operating-system-NetBSD-2.1 2.1 .ds doc-operating-system-NetBSD-3.0 3.0 +.ds doc-operating-system-NetBSD-3.0.1 3.0.1 +.ds doc-operating-system-NetBSD-3.0.2 3.0.2 +.ds doc-operating-system-NetBSD-3.1 3.1 .ds doc-operating-system-NetBSD-4.0 4.0 +.ds doc-operating-system-NetBSD-4.0.1 4.0.1 . .ds doc-operating-system-FreeBSD-1.0 1.0 .ds doc-operating-system-FreeBSD-1.1 1.1 @@ -486,23 +502,48 @@ .ds doc-operating-system-FreeBSD-6.0 6.0 .ds doc-operating-system-FreeBSD-6.1 6.1 .ds doc-operating-system-FreeBSD-6.2 6.2 +.ds doc-operating-system-FreeBSD-6.3 6.3 +.ds doc-operating-system-FreeBSD-6.4 6.4 .ds doc-operating-system-FreeBSD-7.0 7.0 +.ds doc-operating-system-FreeBSD-7.1 7.1 . -.ds doc-operating-system-Darwin-8.0.0 8.0.0 -.ds doc-operating-system-Darwin-8.1.0 8.1.0 -.ds doc-operating-system-Darwin-8.2.0 8.2.0 -.ds doc-operating-system-Darwin-8.3.0 8.3.0 -.ds doc-operating-system-Darwin-8.4.0 8.4.0 -.ds doc-operating-system-Darwin-8.5.0 8.5.0 +.ds doc-operating-system-Darwin-8.0.0 8.0.0 +.ds doc-operating-system-Darwin-8.1.0 8.1.0 +.ds doc-operating-system-Darwin-8.2.0 8.2.0 +.ds doc-operating-system-Darwin-8.3.0 8.3.0 +.ds doc-operating-system-Darwin-8.4.0 8.4.0 +.ds doc-operating-system-Darwin-8.5.0 8.5.0 +.ds doc-operating-system-Darwin-8.6.0 8.6.0 +.ds doc-operating-system-Darwin-8.7.0 8.7.0 +.ds doc-operating-system-Darwin-8.8.0 8.8.0 +.ds doc-operating-system-Darwin-8.9.0 8.9.0 +.ds doc-operating-system-Darwin-8.10.0 8.10.0 +.ds doc-operating-system-Darwin-8.11.0 8.11.0 +.ds doc-operating-system-Darwin-9.0.0 9.0.0 +.ds doc-operating-system-Darwin-9.1.0 9.1.0 +.ds doc-operating-system-Darwin-9.2.0 9.2.0 +.ds doc-operating-system-Darwin-9.3.0 9.3.0 +.ds doc-operating-system-Darwin-9.4.0 9.4.0 +.ds doc-operating-system-Darwin-9.5.0 9.5.0 +.ds doc-operating-system-Darwin-9.6.0 9.6.0 . -.ds doc-operating-system-DragonFly-1.0 1.0 -.ds doc-operating-system-DragonFly-1.1 1.1 -.ds doc-operating-system-DragonFly-1.2 1.2 -.ds doc-operating-system-DragonFly-1.3 1.3 -.ds doc-operating-system-DragonFly-1.4 1.4 -.ds doc-operating-system-DragonFly-1.5 1.5 +.ds doc-operating-system-DragonFly-1.0 1.0 +.ds doc-operating-system-DragonFly-1.1 1.1 +.ds doc-operating-system-DragonFly-1.2 1.2 +.ds doc-operating-system-DragonFly-1.3 1.3 +.ds doc-operating-system-DragonFly-1.4 1.4 +.ds doc-operating-system-DragonFly-1.5 1.5 +.ds doc-operating-system-DragonFly-1.6 1.6 +.ds doc-operating-system-DragonFly-1.8 1.8 +.ds doc-operating-system-DragonFly-1.8.1 1.8.1 +.ds doc-operating-system-DragonFly-1.10 1.10 +.ds doc-operating-system-DragonFly-1.12 1.12 +.ds doc-operating-system-DragonFly-1.12.2 1.12.2 +.ds doc-operating-system-DragonFly-2.0 2.0 . .de Os +. ds doc-command-name +. . ie "\$1"" \ . ds doc-operating-system "\*[doc-default-operating-system] . el \{ .ie "\$1"ATT" \{\ @@ -563,6 +604,7 @@ .\" NS .\" NS modifies: .\" NS doc-date-string +.\" NS doc-command-name .\" NS .\" NS local variables: .\" NS doc-date-XXX @@ -583,6 +625,8 @@ .ds doc-date-12 December . .de Dd +. ds doc-command-name +. . ie \n[.$] \{\ . ie (\n[.$] == 3) \ . ds doc-date-string \$1\~\$2 \$3 @@ -1128,6 +1172,8 @@ . tm doc-reference-title-count == \n[doc-reference-title-count] . tm doc-reference-title-name == `\*[doc-reference-title-name]' . tm doc-reference-title-name-for-book == `\*[doc-reference-title-name-for-book]' +. tm doc-url-count == \n[doc-url-count] +. tm doc-url-name == `\*[doc-url-name]' . tm doc-volume-count == \n[doc-volume-count] . tm doc-volume-name == `\*[doc-volume-name]' . tm doc-have-author == \n[doc-have-author] diff --git a/contrib/groff/tmac/doc-old.tmac b/contrib/groff/tmac/doc-old.tmac index b91fabf47d33..70eb4f5e249c 100644 --- a/contrib/groff/tmac/doc-old.tmac +++ b/contrib/groff/tmac/doc-old.tmac @@ -40,7 +40,7 @@ .ds aD \fI .\" Argument Reference Style .ds aR \f(CO -.\" Interactive Comand Modifier (flag) +.\" Interactive Command Modifier (flag) .ds cM \f(CB .\" Emphasis (in the English sense - usually italics) .ds eM \fI diff --git a/contrib/groff/tmac/doc-syms b/contrib/groff/tmac/doc-syms index 25cce80c7446..7e96a65dd955 100644 --- a/contrib/groff/tmac/doc-syms +++ b/contrib/groff/tmac/doc-syms @@ -651,6 +651,8 @@ .\" X/Open .ds doc-str-St--susv2 Version\~2 of the Single \*[doc-Tn-font-size]UNIX\*[doc-str-St] Specification .as doc-str-St--susv2 " (\*[Lq]\*[doc-Tn-font-size]SUSv2\*[doc-str-St]\*[Rq]) +.ds doc-str-St--susv3 Version\~3 of the Single \*[doc-Tn-font-size]UNIX\*[doc-str-St] Specification +.as doc-str-St--susv3 " (\*[Lq]\*[doc-Tn-font-size]SUSv3\*[doc-str-St]\*[Rq]) .ds doc-str-St--svid4 System\~V Interface Definition, Fourth Edition .as doc-str-St--svid4 " (\*[Lq]\*[doc-Tn-font-size]SVID\*[doc-str-St]\^4\*[Rq]) .ds doc-str-St--xbd5 \*[doc-Tn-font-size]X/Open\*[doc-str-St] System Interface Definitions Issue\~5 diff --git a/contrib/groff/tmac/doc.tmac b/contrib/groff/tmac/doc.tmac index 083b13a0550a..017835e00bf0 100644 --- a/contrib/groff/tmac/doc.tmac +++ b/contrib/groff/tmac/doc.tmac @@ -356,10 +356,10 @@ . ds doc-macro-name Fl . doc-parse-args \$@ . -. if !\n[.$] \{\ -. \" no arguments +. \" no arguments +. if !\n[.$] \ . nop \|\-\|\f[]\s[0] -. \}\} +. \} . . if !\n[doc-arg-limit] \ . return @@ -481,8 +481,8 @@ . el \{\ . nr doc-reg-dpr \n[doc-arg-ptr] . +. \" the `\%' prevents hyphenation on a dash (`-') . ie (\n[doc-reg-dpr1] == 2) \ -. \" the `\%' prevents hyphenation on a dash (`-') . nop \%\*[doc-str-dpr]\&\c . el \{\ . \" punctuation character @@ -595,10 +595,10 @@ . ds doc-macro-name Ar . doc-parse-args \$@ . -. if !\n[.$] \{\ -. \" no argument +. \" no argument +. if !\n[.$] \ . nop \)\*[doc-str-Ar-default]\&\f[]\s[0] -. \}\} +. \} . . if !\n[doc-arg-limit] \ . return @@ -1034,10 +1034,10 @@ . ds doc-macro-name Pa . doc-parse-args \$@ . -. if !\n[.$] \{\ -. \" default value +. \" default value +. if !\n[.$] \ . nop \*[doc-Pa-font]~\f[]\s[0] -. \}\} +. \} . . if !\n[doc-arg-limit] \ . return @@ -3430,6 +3430,8 @@ . nr doc-reference-title-count-saved \n[doc-reference-title-count] . ds doc-reference-title-name-saved "\*[doc-reference-title-name] . ds doc-reference-title-name-for-book-saved "\*[doc-reference-title-name-for-book] +. nr doc-url-count-saved \n[doc-url-count] +. ds doc-url-name-saved "\*[doc-url-name] . nr doc-volume-count-saved \n[doc-volume-count] . ds doc-volume-name-saved "\*[doc-volume-name] . nr doc-have-author-saved \n[doc-have-author] @@ -3570,6 +3572,8 @@ . nr doc-reference-title-count \n[doc-reference-title-count-saved] . ds doc-reference-title-name "\*[doc-reference-title-name-saved] . ds doc-reference-title-name-for-book "\*[doc-reference-title-name-for-book-saved] +. nr doc-url-count \n[doc-url-count-saved] +. ds doc-url-name "\*[doc-url-name-saved] . nr doc-volume-count \n[doc-volume-count-saved] . ds doc-volume-name "\*[doc-volume-name-saved] . nr doc-have-author \n[doc-have-author-saved] @@ -5194,6 +5198,8 @@ .\" NS doc-reference-title-name-for-book .\" NS doc-report-count .\" NS doc-report-name +.\" NS doc-url-count +.\" NS doc-url-name .\" NS doc-volume-count .\" NS doc-volume-name . @@ -5208,6 +5214,7 @@ . nr doc-corporate-count 0 . nr doc-report-count 0 . nr doc-reference-title-count 0 +. nr doc-url-count 0 . nr doc-volume-count 0 . nr doc-date-count 0 . nr doc-page-number-count 0 @@ -5222,6 +5229,7 @@ . ds doc-report-name . ds doc-reference-title-name . ds doc-reference-title-name-for-book +. ds doc-url-name . ds doc-volume-name . ds doc-date . ds doc-page-number-string @@ -5316,6 +5324,13 @@ . doc-finish-reference \n[doc-volume-count] . \} . +. if \n[doc-url-count] \{\ +. unformat doc-url-name +. chop doc-url-name +. nop \*[doc-url-name]\c +. doc-finish-reference \n[doc-url-count] +. \} +. . if \n[doc-page-number-count] \{\ . unformat doc-page-number-string . chop doc-page-number-string @@ -6019,6 +6034,18 @@ .. . . +.\" NS doc-url-count global register +.\" NS counter of hypertext references +. +.nr doc-url-count 0 +. +. +.\" NS doc-url-name global box +.\" NS string of collected hypertext references +. +.ds doc-url-name +. +. .\" NS doc-volume-count global register .\" NS counter of reference title references . @@ -6031,6 +6058,48 @@ .ds doc-volume-name . . +.\" NS %U user macro +.\" NS hypertext reference +.\" NS +.\" NS modifies: +.\" NS doc-arg-ptr +.\" NS doc-curr-font +.\" NS doc-curr-size +.\" NS doc-macro-name +.\" NS doc-reference-count +.\" NS doc-url-count +.\" NS +.\" NS local variables: +.\" NS doc-env-%U +.\" NS +.\" NS width register `%U' set in doc-common +. +.de %U +. if (\n[doc-arg-limit] : (\n[.$] == 0)) \{\ +. tm Usage: .%U URL ... (#\n[.c]) +. return +. \} +. +. nr doc-url-count +1 +. nr doc-reference-count +1 +. +. ds doc-macro-name %U +. doc-parse-args \$@ +. +. nr doc-arg-ptr +1 +. nr doc-curr-font \n[.f] +. nr doc-curr-size \n[.ps] +. +. \" append to reference box +. boxa doc-url-name +. ev doc-env-%U +. evc 0 +. in 0 +. nf +. doc-do-references +.. +. +. .\" NS %V user macro .\" NS reference volume .\" NS @@ -6039,7 +6108,7 @@ .\" NS doc-curr-font .\" NS doc-curr-size .\" NS doc-macro-name -.\" NS doc-reference-title-count +.\" NS doc-reference-count .\" NS doc-volume-count .\" NS .\" NS local variables: @@ -6428,6 +6497,19 @@ .ec . . +.\" For UTF-8, map some characters conservatively for the sake +.\" of easy cut and paste. +. +.if '\*[.T]'utf8' \{\ +. rchar \- - ' ` +. +. char \- \N'45' +. char - \N'45' +. char ' \N'39' +. char ` \N'96' +.\} +. +. .\" load local modifications .mso mdoc.local . diff --git a/contrib/groff/tmac/groff_mdoc.man b/contrib/groff/tmac/groff_mdoc.man index 5aa11b538ceb..174030b88f00 100644 --- a/contrib/groff/tmac/groff_mdoc.man +++ b/contrib/groff/tmac/groff_mdoc.man @@ -864,16 +864,18 @@ the release ID. .It NetBSD 0.8, 0.8a, 0.9, 0.9a, 1.0, 1.0a, 1.1, 1.2, 1.2a, 1.2b, 1.2c, 1.2d, 1.2e, 1.3, 1.3a, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.6, 1.6.1, -1.6.2, 2.0, 2.0.1, 2.0.2, 2.1, 3.0 +1.6.2, 1.6.3, 2.0, 2.0.1, 2.0.2, 2.0.3, 2.1, 3.0, 3.0.1, 3.0.2, 3.1, 4.0, +4.0.1 .It FreeBSD 1.0, 1.1, 1.1.5, 1.1.5.1, 2.0, 2.0.5, 2.1, 2.1.5, 2.1.6, 2.1.7, 2.2, 2.2.1, 2.2.2, 2.2.5, 2.2.6, 2.2.7, 2.2.8, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 4.0, 4.1, 4.1.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.6.2, 4.7, 4.8, 4.9, 4.10, 4.11, 5.0, 5.1, -5.2, 5.2.1, 5.3, 5.4, 5.5, 6.0, 6.1, 6.2, 7.0 +5.2, 5.2.1, 5.3, 5.4, 5.5, 6.0, 6.1, 6.2, 6.3, 6.4, 7.0, 7.1 .It DragonFly -1.0, 1.1, 1.2, 1.3, 1.4, 1.5 +1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.8, 1.8.1, 1.10, 1.12, 1.12.2, 2.0 .It Darwin -8.0.0, 8.1.0, 8.2.0, 8.3.0, 8.4.0, 8.5.0 +8.0.0, 8.1.0, 8.2.0, 8.3.0, 8.4.0, 8.5.0, 8.6.0, 8.7.0, 8.8.0, 8.9.0, +8.10.0, 8.11.0, 9.0.0, 9.1.0, 9.2.0, 9.3.0, 9.4.0, 9.5.0, 9.6.0 .El .Ed .Pp @@ -1995,6 +1997,8 @@ X/Open .Pp .It Li \-susv2 .St -susv2 +.It Li \-susv3 +.St -susv3 .It Li \-svid4 .St -svid4 .It Li \-xbd5 @@ -2552,6 +2556,8 @@ Corporate or foreign author. Report name. .It Li .%T Title of article. +.It Li .%U +Optional hypertext reference. .It Li .%V Volume. .El @@ -4086,11 +4092,12 @@ Definitions used for all other devices. .It Pa mdoc.local Local additions and customizations. .It Pa andoc.tmac -This file checks whether the +Use this file if you don't know whether the .Nm \-mdoc or the .Nm \-man package should be used. +Multiple man pages (in either format) can be handled. .El . . diff --git a/contrib/ipfilter/man/ipf.8 b/contrib/ipfilter/man/ipf.8 index 678010f73d26..6e88a9dea99c 100644 --- a/contrib/ipfilter/man/ipf.8 +++ b/contrib/ipfilter/man/ipf.8 @@ -46,7 +46,7 @@ supports \fBlanguage\fI. At present, the only target language supported is \fBC\fB (-cc) for which two files - \fBip_rules.c\fP and \fBip_rules.h\fP are generated in the \fBCURRENT DIRECTORY\fP when \fBipf\fP is being run. These files can be used with the -\fBIPFILTER_COMPILED\fP kernel option to build filter rules staticly into +\fBIPFILTER_COMPILED\fP kernel option to build filter rules staticlly into the kernel. .TP .B \-d diff --git a/contrib/libpcap/inet.c b/contrib/libpcap/inet.c index aad87963e786..5f081a6b8c02 100644 --- a/contrib/libpcap/inet.c +++ b/contrib/libpcap/inet.c @@ -401,10 +401,15 @@ add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags, pcap_if_t *curdev; char *description = NULL; pcap_addr_t *curaddr, *prevaddr, *nextaddr; + int s; #ifdef SIOCGIFDESCR struct ifreq ifrdesc; +#ifndef IFDESCRSIZE +#define _IFDESCRSIZE 64 + char ifdescr[_IFDESCRSIZE]; +#else char ifdescr[IFDESCRSIZE]; - int s; +#endif #endif #ifdef SIOCGIFDESCR @@ -413,12 +418,17 @@ add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags, */ memset(&ifrdesc, 0, sizeof ifrdesc); strlcpy(ifrdesc.ifr_name, name, sizeof ifrdesc.ifr_name); +#ifdef __FreeBSD__ + ifrdesc.ifr_buffer.buffer = ifdescr; + ifrdesc.ifr_buffer.length = sizeof(ifdescr); +#else ifrdesc.ifr_data = (caddr_t)&ifdescr; +#endif s = socket(AF_INET, SOCK_DGRAM, 0); if (s >= 0) { if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0 && - strlen(ifrdesc.ifr_data) != 0) - description = ifrdesc.ifr_data; + strlen(ifdescr) != 0) + description = ifdescr; close(s); } #endif diff --git a/contrib/ncurses/ncurses/base/lib_getch.c b/contrib/ncurses/ncurses/base/lib_getch.c index a3812bee76e8..e7ba0b210e34 100644 --- a/contrib/ncurses/ncurses/base/lib_getch.c +++ b/contrib/ncurses/ncurses/base/lib_getch.c @@ -476,6 +476,12 @@ _nc_wgetch(WINDOW *win, /* resizeterm can push KEY_RESIZE */ if (cooked_key_in_fifo()) { *result = fifo_pull(sp); + /* + * Get the ERR from queue -- it is from WINCH, + * so we should take it out, the "error" is handled. + */ + if (fifo_peek(sp) == -1) + fifo_pull(sp); returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK); } } diff --git a/contrib/netcat/FREEBSD-vendor b/contrib/netcat/FREEBSD-vendor index 1009e388e2e0..c808f5bbc5a4 100644 --- a/contrib/netcat/FREEBSD-vendor +++ b/contrib/netcat/FREEBSD-vendor @@ -1,5 +1,5 @@ # $FreeBSD$ Project: netcat (aka src/usr.bin/nc in OpenBSD) ProjectURL: http://www.openbsd.org/ -Version: 4.4 +Version: 4.6 License: BSD diff --git a/contrib/netcat/nc.1 b/contrib/netcat/nc.1 index b770a527e09a..4375ae84cea2 100644 --- a/contrib/netcat/nc.1 +++ b/contrib/netcat/nc.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: nc.1,v 1.48 2008/09/19 13:24:41 sobrado Exp $ +.\" $OpenBSD: nc.1,v 1.50 2009/06/05 06:47:12 jmc Exp $ .\" .\" Copyright (c) 1996 David Sacerdote .\" All rights reserved. @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 6 2008 +.Dd June 5 2009 .Dt NC 1 .Os .Sh NAME @@ -46,6 +46,7 @@ .Op Fl p Ar source_port .Op Fl s Ar source_ip_address .Op Fl T Ar ToS +.Op Fl V Ar fib .Op Fl w Ar timeout .Op Fl X Ar proxy_protocol .Oo Xo @@ -208,6 +209,9 @@ to script telnet sessions. Specifies to use Unix Domain Sockets. .It Fl u Use UDP instead of the default option of TCP. +.It Fl V Ar fib +Set the routing table (FIB). +The default is 0. .It Fl v Have .Nm @@ -449,6 +453,7 @@ if the proxy requires it: .Ex -std .Sh SEE ALSO .Xr cat 1 , +.Xr setfib 1 , .Xr ssh 1 , .Xr tcp 4 .Sh AUTHORS diff --git a/contrib/netcat/netcat.c b/contrib/netcat/netcat.c index d0c3881e3faf..a9ce18bb9b59 100644 --- a/contrib/netcat/netcat.c +++ b/contrib/netcat/netcat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: netcat.c,v 1.92 2008/09/19 13:24:41 sobrado Exp $ */ +/* $OpenBSD: netcat.c,v 1.93 2009/06/05 00:18:10 claudio Exp $ */ /* * Copyright (c) 2001 Eric Jackson * @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -94,6 +95,7 @@ int Iflag; /* TCP receive buffer size */ int Oflag; /* TCP send buffer size */ int Sflag; /* TCP MD5 signature option */ int Tflag = -1; /* IP Type of Service */ +u_int rdomain; int timeout = -1; int family = AF_UNSPEC; @@ -124,6 +126,8 @@ int main(int argc, char *argv[]) { int ch, s, ret, socksv, ipsec_count; + int numfibs; + size_t intsize = sizeof(int); char *host, *uport; struct addrinfo hints; struct servent *sv; @@ -137,6 +141,7 @@ main(int argc, char *argv[]) { NULL, 0, NULL, 0 } }; + rdomain = 0; ret = 1; ipsec_count = 0; s = 0; @@ -146,7 +151,7 @@ main(int argc, char *argv[]) sv = NULL; while ((ch = getopt_long(argc, argv, - "46e:DEdhi:jklnoI:O:P:p:rSs:tT:Uuvw:X:x:z", + "46DdEe:hI:i:jklnO:oP:p:rSs:tT:UuV:vw:X:x:z", longopts, NULL)) != -1) { switch (ch) { case '4': @@ -229,6 +234,14 @@ main(int argc, char *argv[]) case 'u': uflag = 1; break; + case 'V': + if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1) + errx(1, "Multiple FIBS not supported"); + rdomain = (unsigned int)strtonum(optarg, 0, + numfibs - 1, &errstr); + if (errstr) + errx(1, "FIB %s: %s", errstr, optarg); + break; case 'v': vflag = 1; break; @@ -550,6 +563,11 @@ remote_connect(const char *host, const char *port, struct addrinfo hints) add_ipsec_policy(s, ipsec_policy[1]); #endif + if (rdomain) { + if (setfib(rdomain) == -1) + err(1, "setfib"); + } + /* Bind to a local port or source address if specified. */ if (sflag || pflag) { struct addrinfo ahints, *ares; @@ -620,6 +638,11 @@ local_listen(char *host, char *port, struct addrinfo hints) res0->ai_protocol)) < 0) continue; + if (rdomain) { + if (setfib(rdomain) == -1) + err(1, "setfib"); + } + ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x)); if (ret == -1) err(1, NULL); @@ -930,6 +953,7 @@ help(void) \t-t Answer TELNET negotiation\n\ \t-U Use UNIX domain socket\n\ \t-u UDP mode\n\ + \t-V fib Specify alternate routing table (FIB)\n\ \t-v Verbose\n\ \t-w secs\t Timeout for connects and final net reads\n\ \t-X proto Proxy protocol: \"4\", \"5\" (SOCKS) or \"connect\"\n\ @@ -974,8 +998,8 @@ usage(int ret) "usage: nc [-46DdhklnorStUuvz] [-I length] [-i interval] [-O length]\n" #endif "\t [-P proxy_username] [-p source_port] [-s source_ip_address] [-T ToS]\n" - "\t [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname]\n" - "\t [port]\n"); + "\t [-V fib] [-w timeout] [-X proxy_protocol]\n" + "\t [-x proxy_address[:port]] [hostname] [port]\n"); if (ret) exit(1); } diff --git a/contrib/ntp/COPYRIGHT b/contrib/ntp/COPYRIGHT index f9184d7f33fe..5497040471ed 100644 --- a/contrib/ntp/COPYRIGHT +++ b/contrib/ntp/COPYRIGHT @@ -13,7 +13,7 @@ This file is automatically generated from html/copyright.html applies as if the text was explicitly included in the file. *********************************************************************** * * -* Copyright (c) David L. Mills 1992-2008 * +* Copyright (c) David L. Mills 1992-2009 * * * * Permission to use, copy, modify, and distribute this software and * * its documentation for any purpose with or without fee is hereby * diff --git a/contrib/ntp/ChangeLog b/contrib/ntp/ChangeLog index 3d193e202d2b..60b7f0508ff9 100644 --- a/contrib/ntp/ChangeLog +++ b/contrib/ntp/ChangeLog @@ -1,6 +1,85 @@ -(4.2.4p5) 2008/08/17 Released by Harlan Stenn --- -(4.2.4p5) 2008/08/17 Released by Harlan Stenn +(4.2.4p8) 2009/12/08 Released by Harlan Stenn + +* [Sec 1331] DoS with mode 7 packets - CVE-2009-3563. + +--- +(4.2.4p7) 2009/05/18 Released by Harlan Stenn + +* [Sec 1151] Remote exploit if autokey is enabled - CVE-2009-1252. +* [Bug 1187] Update the copyright date. +* [Bug 1191] ntpd fails on Win2000 - "Address already in use" after fix + for [Sec 1149]. + +--- +(4.2.4p7-RC7) 2009/05/12 Released by Harlan Stenn + +* ntp.isc.org -> ntp.org cleanup. +* [Bug 1178] Use prior FORCE_DNSRETRY behavior as needed at runtime, + add configure --enable-ignore-dns-errors to be even more stubborn + +--- +(4.2.4p7-RC6) 2009/05/08 Released by Harlan Stenn + +* [Bug 784] Make --enable-linuxcaps the default when available +* [Bug 1179] error messages for -u/--user and -i lacking droproot +* Updated JJY reference clock driver from Takao Abe +* [Bug 1071] Log a message and exit before trying to use FD_SET with a + descriptor larger than FD_SETSIZE, which will corrupt memory +* On corruption of the iface list head in add_interface, log and exit + +--- +(4.2.4p7-RC5) 2009/05/02 Released by Harlan Stenn + +* [Bug 1172] 4.2.4p7-RC{3,4} fail to build on linux. +* flock-build script unportable 'set -m' use removed + +--- +(4.2.4p7-RC4) 2009/04/29 Released by Harlan Stenn + +* [Bug 1167] use gcc -Winit-self only if it is understood + +--- +(4.2.4p7-RC3) 2009/04/22 Released by Harlan Stenn + +* [Bug 787] Bug fixes for 64-bit time_t on Windows +* [Bug 813] Conditional naming of Event +* [Bug 1147] System errors should be logged to msyslog() +* [Bug 1155] Fix compile problem on Windows with VS2005 +* [Bug 1156] lock_thread_to_processor() should be declared in header +* [Bug 1157] quiet OpenSSL warnings, clean up configure.ac +* [Bug 1158] support for aix6.1 +* [Bug 1160] MacOS X is like BSD regarding F_SETOWN + +--- +(4.2.4p7-RC2) 2009/04/09 Released by Harlan Stenn + +* [Sec 1144] limited buffer overflow in ntpq. CVE-2009-0159 +* [Sec 1149] use SO_EXCLUSIVEADDRUSE on Windows + +--- +(4.2.4p7-RC1) 2009/03/30 Released by Harlan Stenn + +* [Bug 1131] UDP sockets should not use SIGPOLL on Solaris. +* build system email address cleanup +* [Bug 774] parsesolaris.c does not compile under the new Solaris +* [Bug 873] Windows serial refclock proper TTY line discipline emulation +* [Bug 1014] Enable building with VC9 (in Visual Studio 2008, + Visual C++ 2008, or SDK) +* [Bug 1117] Deferred interface binding under Windows works only correctly + if FORCE_DNSRETRY is defined +* [BUG 1124] Lock QueryPerformanceCounter() client threads to same CPU +* DPRINTF macro made safer, always evaluates to a statement and will not + misassociate an else which follows the macro. + +--- +(4.2.4p6) 2009/01/08 Released by Harlan Stenn + +* [Bug 1113] Fixed build errors with recent versions of openSSL. +* [Sec 1111] Fix incorrect check of EVP_VerifyFinal()'s return value. +* Update the copyright year. + +--- (4.2.4p5) 2008/08/17 Released by Harlan Stenn * [BUG 1051] Month off by one in leap second message written to clockstats diff --git a/contrib/ntp/CommitLog b/contrib/ntp/CommitLog index 861e03d0dee0..ade3be7044ce 100644 --- a/contrib/ntp/CommitLog +++ b/contrib/ntp/CommitLog @@ -1,3 +1,1727 @@ +ChangeSet@1.1612, 2009-12-08 08:30:54-05:00, stenn@whimsy.udel.edu +1 -0 + ChangeLog: + typo + + ChangeLog@1.95, 2009-12-08 08:30:44-05:00, stenn@whimsy.udel.edu +0 -1 + typo + +ChangeSet@1.1611, 2009-12-08 08:23:12-05:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P8 + TAG: NTP_4_2_4P8 + + ChangeLog@1.94, 2009-12-08 08:23:01-05:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P8 + + ntpd/ntpd-opts.c@1.86, 2009-12-08 08:23:02-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + ntpd/ntpd-opts.h@1.86, 2009-12-08 08:23:02-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P8 + + ntpd/ntpd-opts.texi@1.85, 2009-12-08 08:23:03-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P8 + + ntpd/ntpd.1@1.84, 2009-12-08 08:23:03-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + ntpd/ntpdsim-opts.c@1.86, 2009-12-08 08:23:03-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + ntpd/ntpdsim-opts.h@1.86, 2009-12-08 08:23:04-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P8 + + ntpd/ntpdsim-opts.texi@1.84, 2009-12-08 08:23:05-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P8 + + ntpd/ntpdsim.1@1.84, 2009-12-08 08:23:05-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + ntpdc/ntpdc-opts.c@1.86, 2009-12-08 08:23:05-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + ntpdc/ntpdc-opts.h@1.86, 2009-12-08 08:23:05-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P8 + + ntpdc/ntpdc-opts.texi@1.84, 2009-12-08 08:23:06-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P8 + + ntpdc/ntpdc.1@1.84, 2009-12-08 08:23:06-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + ntpq/ntpq-opts.c@1.88, 2009-12-08 08:23:06-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + ntpq/ntpq-opts.h@1.88, 2009-12-08 08:23:06-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P8 + + ntpq/ntpq-opts.texi@1.85, 2009-12-08 08:23:07-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P8 + + ntpq/ntpq.1@1.84, 2009-12-08 08:23:07-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + packageinfo.sh@1.118, 2009-12-08 08:23:07-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P8 + + sntp/sntp-opts.c@1.84, 2009-12-08 08:23:07-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + sntp/sntp-opts.h@1.84, 2009-12-08 08:23:07-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P8 + + sntp/sntp-opts.texi@1.81, 2009-12-08 08:23:08-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P8 + + sntp/sntp.1@1.84, 2009-12-08 08:23:08-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + util/ntp-keygen-opts.c@1.85, 2009-12-08 08:23:08-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + + util/ntp-keygen-opts.h@1.85, 2009-12-08 08:23:08-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P8 + + util/ntp-keygen-opts.texi@1.83, 2009-12-08 08:23:09-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P8 + + util/ntp-keygen.1@1.83, 2009-12-08 08:23:09-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P8 + +ChangeSet@1.1610, 2009-12-08 07:45:28-05:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P9_RC1 + TAG: NTP_4_2_4P9_RC1 + + ChangeLog@1.93, 2009-12-08 07:45:19-05:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P9_RC1 + + ntpd/ntpd-opts.c@1.85, 2009-12-08 07:45:19-05:00, stenn@whimsy.udel.edu +5 -5 + NTP_4_2_4P9_RC1 + + ntpd/ntpd-opts.h@1.85, 2009-12-08 07:45:19-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P9_RC1 + + ntpd/ntpd-opts.texi@1.84, 2009-12-08 07:45:20-05:00, stenn@whimsy.udel.edu +13 -6 + NTP_4_2_4P9_RC1 + + ntpd/ntpd.1@1.83, 2009-12-08 07:45:20-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P9_RC1 + + ntpd/ntpdsim-opts.c@1.85, 2009-12-08 07:45:20-05:00, stenn@whimsy.udel.edu +5 -5 + NTP_4_2_4P9_RC1 + + ntpd/ntpdsim-opts.h@1.85, 2009-12-08 07:45:20-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P9_RC1 + + ntpd/ntpdsim-opts.texi@1.83, 2009-12-08 07:45:21-05:00, stenn@whimsy.udel.edu +61 -2 + NTP_4_2_4P9_RC1 + + ntpd/ntpdsim.1@1.83, 2009-12-08 07:45:21-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P9_RC1 + + ntpdc/ntpdc-opts.c@1.85, 2009-12-08 07:45:21-05:00, stenn@whimsy.udel.edu +5 -5 + NTP_4_2_4P9_RC1 + + ntpdc/ntpdc-opts.h@1.85, 2009-12-08 07:45:21-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P9_RC1 + + ntpdc/ntpdc-opts.texi@1.83, 2009-12-08 07:45:21-05:00, stenn@whimsy.udel.edu +7 -4 + NTP_4_2_4P9_RC1 + + ntpdc/ntpdc.1@1.83, 2009-12-08 07:45:22-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P9_RC1 + + ntpq/ntpq-opts.c@1.87, 2009-12-08 07:45:22-05:00, stenn@whimsy.udel.edu +5 -5 + NTP_4_2_4P9_RC1 + + ntpq/ntpq-opts.h@1.87, 2009-12-08 07:45:22-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P9_RC1 + + ntpq/ntpq-opts.texi@1.84, 2009-12-08 07:45:22-05:00, stenn@whimsy.udel.edu +8 -4 + NTP_4_2_4P9_RC1 + + ntpq/ntpq.1@1.83, 2009-12-08 07:45:23-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P9_RC1 + + packageinfo.sh@1.117, 2009-12-08 07:45:23-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P9_RC1 + + sntp/sntp-opts.c@1.83, 2009-12-08 07:45:23-05:00, stenn@whimsy.udel.edu +5 -5 + NTP_4_2_4P9_RC1 + + sntp/sntp-opts.h@1.83, 2009-12-08 07:45:23-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P9_RC1 + + sntp/sntp-opts.texi@1.80, 2009-12-08 07:45:24-05:00, stenn@whimsy.udel.edu +54 -2 + NTP_4_2_4P9_RC1 + + sntp/sntp.1@1.83, 2009-12-08 07:45:24-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P9_RC1 + + util/ntp-keygen-opts.c@1.84, 2009-12-08 07:45:24-05:00, stenn@whimsy.udel.edu +5 -5 + NTP_4_2_4P9_RC1 + + util/ntp-keygen-opts.h@1.84, 2009-12-08 07:45:24-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P9_RC1 + + util/ntp-keygen-opts.texi@1.82, 2009-12-08 07:45:24-05:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P9_RC1 + + util/ntp-keygen.1@1.82, 2009-12-08 07:45:25-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P9_RC1 + +ChangeSet@1.1609, 2009-12-08 05:36:47-05:00, stenn@whimsy.udel.edu +2 -0 + [Sec 1331] DoS with mode 7 packets - CVE-2009-3563 + + NEWS@1.102, 2009-12-08 05:36:36-05:00, stenn@whimsy.udel.edu +34 -0 + [Sec 1331] DoS with mode 7 packets - CVE-2009-3563 + + packageinfo.sh@1.116, 2009-12-08 05:36:36-05:00, stenn@whimsy.udel.edu +2 -2 + [Sec 1331] DoS with mode 7 packets - CVE-2009-3563 + +ChangeSet@1.1608, 2009-10-07 01:33:22+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + [Sec 1331] DoS with mode 7 packets - CVE-2009-3563. + + ChangeLog@1.92, 2009-10-07 01:33:21+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + [Sec 1331] DoS with mode 7 packets - CVE-2009-3563. + + ntpd/ntp_request.c@1.68, 2009-10-07 01:33:21+00:00, davehart@shiny.ad.hartbrothers.com +9 -2 + [Sec 1331] DoS with mode 7 packets - CVE-2009-3563. + +ChangeSet@1.1607, 2009-05-18 05:04:41-04:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7 + TAG: NTP_4_2_4P7 + + ChangeLog@1.91, 2009-05-18 05:04:18-04:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7 + + ntpd/ntpd-opts.c@1.84, 2009-05-18 05:04:19-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpd/ntpd-opts.h@1.84, 2009-05-18 05:04:20-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpd/ntpd-opts.texi@1.83, 2009-05-18 05:04:21-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7 + + ntpd/ntpd.1@1.82, 2009-05-18 05:04:22-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + + ntpd/ntpdsim-opts.c@1.84, 2009-05-18 05:04:22-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpd/ntpdsim-opts.h@1.84, 2009-05-18 05:04:23-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpd/ntpdsim-opts.texi@1.82, 2009-05-18 05:04:24-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7 + + ntpd/ntpdsim.1@1.82, 2009-05-18 05:04:25-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + + ntpdc/ntpdc-opts.c@1.84, 2009-05-18 05:04:26-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpdc/ntpdc-opts.h@1.84, 2009-05-18 05:04:26-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpdc/ntpdc-opts.texi@1.82, 2009-05-18 05:04:27-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7 + + ntpdc/ntpdc.1@1.82, 2009-05-18 05:04:28-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + + ntpq/ntpq-opts.c@1.86, 2009-05-18 05:04:29-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpq/ntpq-opts.h@1.86, 2009-05-18 05:04:29-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + ntpq/ntpq-opts.texi@1.83, 2009-05-18 05:04:30-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7 + + ntpq/ntpq.1@1.82, 2009-05-18 05:04:31-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + + packageinfo.sh@1.115, 2009-05-18 05:04:32-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + + sntp/sntp-opts.c@1.82, 2009-05-18 05:04:32-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + + sntp/sntp-opts.h@1.82, 2009-05-18 05:04:33-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7 + + sntp/sntp-opts.texi@1.79, 2009-05-18 05:04:34-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7 + + sntp/sntp.1@1.82, 2009-05-18 05:04:34-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + + util/ntp-keygen-opts.c@1.83, 2009-05-18 05:04:35-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + util/ntp-keygen-opts.h@1.83, 2009-05-18 05:04:36-04:00, stenn@whimsy.udel.edu +4 -4 + NTP_4_2_4P7 + + util/ntp-keygen-opts.texi@1.81, 2009-05-18 05:04:37-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7 + + util/ntp-keygen.1@1.81, 2009-05-18 05:04:37-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7 + +ChangeSet@1.1606, 2009-05-18 03:14:59-04:00, stenn@whimsy.udel.edu +2 -0 + 4.2.4p7 + + NEWS@1.101, 2009-05-18 03:14:49-04:00, stenn@whimsy.udel.edu +38 -0 + 4.2.4p7 + + packageinfo.sh@1.114, 2009-05-18 03:14:50-04:00, stenn@whimsy.udel.edu +1 -1 + 4.2.4p7 + +ChangeSet@1.1605, 2009-05-18 02:56:36-04:00, stenn@whimsy.udel.edu +2 -0 + [Sec 1151] Remote exploit if autokey is enabled - CVE-2009-1252 + + ChangeLog@1.90, 2009-05-18 02:56:22-04:00, stenn@whimsy.udel.edu +1 -0 + [Sec 1151] Remote exploit if autokey is enabled - CVE-2009-1252 + + ntpd/ntp_crypto.c@1.110, 2009-05-18 02:56:22-04:00, stenn@whimsy.udel.edu +22 -17 + [Sec 1151] Remote exploit if autokey is enabled - CVE-2009-1252 + +ChangeSet@1.1604, 2009-05-18 02:24:31-04:00, stenn@whimsy.udel.edu +2 -0 + [Bug 1187] Update the copyright date. + + ChangeLog@1.89, 2009-05-18 02:24:21-04:00, stenn@whimsy.udel.edu +1 -0 + [Bug 1187] Update the copyright date. + + include/copyright.def@1.8, 2009-05-18 02:24:22-04:00, stenn@whimsy.udel.edu +1 -1 + [Bug 1187] Update the copyright date. + +ChangeSet@1.1603, 2009-05-17 08:59:06+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + [Bug 1191] ntpd fails on Win2000 - "Address already in use" after fix + for [Sec 1149]. + + ChangeLog@1.88, 2009-05-17 08:59:05+00:00, davehart@shiny.ad.hartbrothers.com +5 -0 + [Bug 1191] ntpd fails on Win2000 - "Address already in use" after fix + for [Sec 1149]. + + ntpd/ntp_io.c@1.261, 2009-05-17 08:59:05+00:00, davehart@shiny.ad.hartbrothers.com +45 -34 + [Bug 1191] ntpd fails on Win2000 - "Address already in use" after fix + for [Sec 1149]. + +ChangeSet@1.1602, 2009-05-14 04:42:10+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + fix error from BitKeeper/triggers/pre-resolve.licfix triggered (ahem) + by recent BitKeeper/etc/config delta updating repologs email address + + BitKeeper/triggers/pre-resolve.licfix@1.5, 2009-05-14 04:42:09+00:00, davehart@shiny.ad.hartbrothers.com +4 -1 + bk sccscat has been removed, replaced by bk annotate -R + -q grep -> grep -q (untested until recent BitKeeper/etc/config commit + changing repologs@ntp.isc.org to repologs@ntp.org + +ChangeSet@1.1601, 2009-05-12 02:41:56-04:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7_RC7 + TAG: NTP_4_2_4P7_RC7 + + ChangeLog@1.87, 2009-05-12 02:41:33-04:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7_RC7 + + ntpd/ntpd-opts.c@1.83, 2009-05-12 02:41:33-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpd/ntpd-opts.h@1.83, 2009-05-12 02:41:33-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpd/ntpd-opts.texi@1.82, 2009-05-12 02:41:35-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC7 + + ntpd/ntpd.1@1.81, 2009-05-12 02:41:35-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpd/ntpdsim-opts.c@1.83, 2009-05-12 02:41:36-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpd/ntpdsim-opts.h@1.83, 2009-05-12 02:41:37-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpd/ntpdsim-opts.texi@1.81, 2009-05-12 02:41:37-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC7 + + ntpd/ntpdsim.1@1.81, 2009-05-12 02:41:38-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpdc/ntpdc-opts.c@1.83, 2009-05-12 02:41:39-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpdc/ntpdc-opts.h@1.83, 2009-05-12 02:41:40-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpdc/ntpdc-opts.texi@1.81, 2009-05-12 02:41:41-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC7 + + ntpdc/ntpdc.1@1.81, 2009-05-12 02:41:42-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpq/ntpq-opts.c@1.85, 2009-05-12 02:41:43-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpq/ntpq-opts.h@1.85, 2009-05-12 02:41:44-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + ntpq/ntpq-opts.texi@1.82, 2009-05-12 02:41:45-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC7 + + ntpq/ntpq.1@1.81, 2009-05-12 02:41:46-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + packageinfo.sh@1.113, 2009-05-12 02:41:47-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC7 + + sntp/sntp-opts.c@1.81, 2009-05-12 02:41:47-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + sntp/sntp-opts.h@1.81, 2009-05-12 02:41:48-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + sntp/sntp-opts.texi@1.78, 2009-05-12 02:41:49-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC7 + + sntp/sntp.1@1.81, 2009-05-12 02:41:50-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + util/ntp-keygen-opts.c@1.82, 2009-05-12 02:41:51-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + util/ntp-keygen-opts.h@1.82, 2009-05-12 02:41:51-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + + util/ntp-keygen-opts.texi@1.80, 2009-05-12 02:41:52-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC7 + + util/ntp-keygen.1@1.80, 2009-05-12 02:41:53-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC7 + +ChangeSet@1.1600, 2009-05-12 01:07:37-04:00, stenn@whimsy.udel.edu +9 -0 + ntp.isc.org -> ntp.org cleanup + + BitKeeper/etc/config@1.10, 2009-05-12 01:06:49-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + + ChangeLog@1.86, 2009-05-12 01:06:01-04:00, stenn@whimsy.udel.edu +1 -0 + ntp.isc.org -> ntp.org cleanup + + README@1.23, 2009-05-12 01:06:02-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + + README.bk@1.19, 2009-05-12 01:06:03-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + + README.patches@1.4, 2009-05-12 01:06:03-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + + WHERE-TO-START@1.7, 2009-05-12 01:06:03-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + + configure.ac@1.418, 2009-05-12 01:06:04-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + + include/copyright.def@1.7, 2009-05-12 01:06:49-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + + sntp/sntp-opts.def@1.11, 2009-05-12 01:06:49-04:00, stenn@whimsy.udel.edu +1 -1 + ntp.isc.org -> ntp.org cleanup + +ChangeSet@1.1597.1.1, 2009-05-08 18:11:36+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + configure.ac: + correct help text + + configure.ac@1.415.1.1, 2009-05-08 18:11:24+00:00, davehart@shiny.ad.hartbrothers.com +11 -5 + correct help text + +ChangeSet@1.1598, 2009-05-08 17:50:37+00:00, davehart@shiny.ad.hartbrothers.com +3 -0 + add configure --enable-ignore-dns-errors to retry on any failure + + ChangeLog@1.85, 2009-05-08 17:50:35+00:00, davehart@shiny.ad.hartbrothers.com +2 -1 + add configure --enable-ignore-dns-errors to retry on any failure + + configure.ac@1.416, 2009-05-08 17:50:35+00:00, davehart@shiny.ad.hartbrothers.com +26 -4 + add configure --enable-ignore-dns-errors to retry on any failure + + ntpd/ntp_intres.c@1.55, 2009-05-08 17:50:35+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + add configure --enable-ignore-dns-errors to retry on any failure + +ChangeSet@1.1597, 2009-05-08 15:34:46+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + Do not exceed FD_SETSIZE in ntp_intres.c + --- + ntp_intres.c: + typo + --- + ntp_intres.c: + missing comma typo + --- + ntp_intres.c: + typo + + ntpd/ntp_intres.c@1.54, 2009-05-08 15:34:45+00:00, davehart@shiny.ad.hartbrothers.com +64 -33 + fix typos, refine "host name not found" log message, stay under FD_SETSIZE + + ntpd/ntp_request.c@1.67, 2009-05-08 15:34:45+00:00, davehart@shiny.ad.hartbrothers.com +21 -3 + after ntp_intres adds a server entry, rescan interfaces, to notice the + return of connectivity sooner. + + ntpd/ntp_timer.c@1.34, 2009-05-08 15:34:45+00:00, davehart@shiny.ad.hartbrothers.com +3 -5 + indent cleanup + + ports/winnt/include/config.h@1.52, 2009-05-08 15:34:45+00:00, davehart@shiny.ad.hartbrothers.com +4 -10 + remove FORCE_DNSRETRY, no longer used + indent cleanup + +ChangeSet@1.1587.1.1, 2009-05-08 11:24:43+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + [Bug 1178] Use prior FORCE_DNSRETRY behavior as needed at runtime + + ChangeLog@1.76.1.1, 2009-05-08 11:24:42+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + [Bug 1178] Use prior FORCE_DNSRETRY behavior as needed at runtime + + ntpd/ntp_intres.c@1.53, 2009-05-08 11:24:42+00:00, davehart@shiny.ad.hartbrothers.com +53 -55 + [Bug 1178] Use prior FORCE_DNSRETRY behavior as needed at runtime + +ChangeSet@1.1595, 2009-05-08 04:42:52-04:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7_RC6 + TAG: NTP_4_2_4P7_RC6 + + ChangeLog@1.83, 2009-05-08 04:42:28-04:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7_RC6 + + ntpd/ntpd-opts.c@1.82, 2009-05-08 04:42:28-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpd/ntpd-opts.h@1.82, 2009-05-08 04:42:29-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC6 + + ntpd/ntpd-opts.texi@1.81, 2009-05-08 04:42:30-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpd/ntpd.1@1.80, 2009-05-08 04:42:30-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpd/ntpdsim-opts.c@1.82, 2009-05-08 04:42:31-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpd/ntpdsim-opts.h@1.82, 2009-05-08 04:42:32-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC6 + + ntpd/ntpdsim-opts.texi@1.80, 2009-05-08 04:42:33-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC6 + + ntpd/ntpdsim.1@1.80, 2009-05-08 04:42:34-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpdc/ntpdc-opts.c@1.82, 2009-05-08 04:42:35-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpdc/ntpdc-opts.h@1.82, 2009-05-08 04:42:35-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC6 + + ntpdc/ntpdc-opts.texi@1.80, 2009-05-08 04:42:36-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpdc/ntpdc.1@1.80, 2009-05-08 04:42:37-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpq/ntpq-opts.c@1.84, 2009-05-08 04:42:38-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpq/ntpq-opts.h@1.84, 2009-05-08 04:42:39-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC6 + + ntpq/ntpq-opts.texi@1.81, 2009-05-08 04:42:40-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + ntpq/ntpq.1@1.80, 2009-05-08 04:42:41-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + packageinfo.sh@1.112, 2009-05-08 04:42:42-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC6 + + sntp/sntp-opts.c@1.80, 2009-05-08 04:42:43-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + sntp/sntp-opts.h@1.80, 2009-05-08 04:42:43-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC6 + + sntp/sntp-opts.texi@1.77, 2009-05-08 04:42:44-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC6 + + sntp/sntp.1@1.80, 2009-05-08 04:42:44-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + util/ntp-keygen-opts.c@1.81, 2009-05-08 04:42:45-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + util/ntp-keygen-opts.h@1.81, 2009-05-08 04:42:46-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC6 + + util/ntp-keygen-opts.texi@1.79, 2009-05-08 04:42:47-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + + util/ntp-keygen.1@1.79, 2009-05-08 04:42:48-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC6 + +ChangeSet@1.1594, 2009-05-08 03:29:16-04:00, stenn@pogo.udel.edu +1 -0 + typo + + ChangeLog@1.82, 2009-05-08 03:28:46-04:00, stenn@pogo.udel.edu +1 -1 + typo + +ChangeSet@1.1593, 2009-05-08 02:13:17+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + Add [Bug 1071] reference to ChangeLog entry + + ChangeLog@1.81, 2009-05-08 02:13:16+00:00, davehart@shiny.ad.hartbrothers.com +2 -2 + [Bug 1071] Log a message and exit before trying to use FD_SET with a + descriptor larger than FD_SETSIZE, which will corrupt memory + (adds reference to 1071 to existing description) + +ChangeSet@1.1592, 2009-05-08 01:23:43+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + [Bug 1179] error messages for -u/--user and -i when built w/o droproot + + ChangeLog@1.80, 2009-05-08 01:23:41+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + [Bug 1179] error messages for -u/--user and -i when built w/o droproot + + ntpd/cmd_args.c@1.49, 2009-05-08 01:23:41+00:00, davehart@shiny.ad.hartbrothers.com +39 -19 + descriptive error messages for -u/--user and -i without droproot + +ChangeSet@1.1591, 2009-05-07 22:15:41+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + ntp_io.c: do not use FD_SET beyond FD_SETSIZE, watch for corruption of inter_list.head + + ChangeLog@1.79, 2009-05-07 22:15:39+00:00, davehart@shiny.ad.hartbrothers.com +3 -0 + do not use FD_SET beyond FD_SETSIZE, watch for corruption of inter_list.head + + ntpd/ntp_io.c@1.260, 2009-05-07 22:15:39+00:00, davehart@shiny.ad.hartbrothers.com +23 -0 + do not use FD_SET beyond FD_SETSIZE, watch for corruption of inter_list.head + +ChangeSet@1.1590, 2009-05-07 07:39:41+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + refclock_jjy.c: + add missing newline before EOF + + ntpd/refclock_jjy.c@1.15, 2009-05-07 07:39:32+00:00, davehart@shiny.ad.hartbrothers.com +1 -1 + add missing newline before EOF + +ChangeSet@1.1589, 2009-05-07 05:19:36+00:00, davehart@shiny.ad.hartbrothers.com +3 -0 + [Bug 784] Make --enable-linuxcaps the default when available + add reference to refclock_jjy.c to ports/winnt/ntpd/ntpd.vcproj + + ChangeLog@1.78, 2009-05-07 05:19:34+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + [Bug 784] Make --enable-linuxcaps the default when available + + configure.ac@1.415, 2009-05-07 05:19:34+00:00, davehart@shiny.ad.hartbrothers.com +34 -33 + [Bug 784] Make --enable-linuxcaps the default when available + + ports/winnt/ntpd/ntpd.vcproj@1.2, 2009-05-07 05:19:34+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + add reference to refclock_jjy.c to ports/winnt/ntpd/ntpd.vcproj + +ChangeSet@1.1588, 2009-05-07 05:10:54+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + Updated JJY reference clock driver from Takao abe + Make ntpd the default project in Visual C++/Visual Studio + + ChangeLog@1.77, 2009-05-07 05:10:52+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + Updated JJY reference clock driver from Takao abe + + html/drivers/driver40.html@1.14, 2009-05-07 05:10:52+00:00, davehart@shiny.ad.hartbrothers.com +103 -48 + Updated JJY reference clock driver from Takao abe + + ntpd/refclock_jjy.c@1.14, 2009-05-07 05:10:52+00:00, davehart@shiny.ad.hartbrothers.com +153 -5 + Updated JJY reference clock driver from Takao abe + + ports/winnt/ntp.sln@1.2, 2009-05-07 05:10:53+00:00, davehart@shiny.ad.hartbrothers.com +4 -4 + Make ntpd the default project in Visual C++/Visual Studio + +ChangeSet@1.1587, 2009-05-02 02:38:49-04:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7_RC5 + TAG: NTP_4_2_4P7_RC5 + + ChangeLog@1.76, 2009-05-02 02:38:22-04:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7_RC5 + + ntpd/ntpd-opts.c@1.81, 2009-05-02 02:38:24-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + ntpd/ntpd-opts.h@1.81, 2009-05-02 02:38:25-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC5 + + ntpd/ntpd-opts.texi@1.80, 2009-05-02 02:38:27-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC5 + + ntpd/ntpd.1@1.79, 2009-05-02 02:38:28-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + ntpd/ntpdsim-opts.c@1.81, 2009-05-02 02:38:28-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + ntpd/ntpdsim-opts.h@1.81, 2009-05-02 02:38:29-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC5 + + ntpd/ntpdsim-opts.texi@1.79, 2009-05-02 02:38:30-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC5 + + ntpd/ntpdsim.1@1.79, 2009-05-02 02:38:31-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + ntpdc/ntpdc-opts.c@1.81, 2009-05-02 02:38:31-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + ntpdc/ntpdc-opts.h@1.81, 2009-05-02 02:38:32-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC5 + + ntpdc/ntpdc-opts.texi@1.79, 2009-05-02 02:38:33-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC5 + + ntpdc/ntpdc.1@1.79, 2009-05-02 02:38:33-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + ntpq/ntpq-opts.c@1.83, 2009-05-02 02:38:34-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + ntpq/ntpq-opts.h@1.83, 2009-05-02 02:38:35-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC5 + + ntpq/ntpq-opts.texi@1.80, 2009-05-02 02:38:36-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC5 + + ntpq/ntpq.1@1.79, 2009-05-02 02:38:37-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + packageinfo.sh@1.111, 2009-05-02 02:38:38-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC5 + + sntp/sntp-opts.c@1.79, 2009-05-02 02:38:39-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + sntp/sntp-opts.h@1.79, 2009-05-02 02:38:40-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC5 + + sntp/sntp-opts.texi@1.76, 2009-05-02 02:38:41-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC5 + + sntp/sntp.1@1.79, 2009-05-02 02:38:42-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + util/ntp-keygen-opts.c@1.80, 2009-05-02 02:38:43-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + + util/ntp-keygen-opts.h@1.80, 2009-05-02 02:38:43-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC5 + + util/ntp-keygen-opts.texi@1.78, 2009-05-02 02:38:44-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC5 + + util/ntp-keygen.1@1.78, 2009-05-02 02:38:45-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC5 + +ChangeSet@1.1586, 2009-05-02 01:49:02+00:00, davehart@shiny.ad.hartbrothers.com +3 -0 + flock-build: + set -m wasn't needed with ssh -tt and caused problems, remove + ChangeLog: + [Bug 1172] 4.2.4p7-RC{3,4} fail to build on linux. + remove unportable 'set -m' from flock-build script + configure.ac: + reverse accidental backport from -dev of struct rtattr test in + configure.ac without corresponding ntp_io.c code for HAVE_RTNETLINK + + ChangeLog@1.75, 2009-05-02 01:48:30+00:00, davehart@shiny.ad.hartbrothers.com +5 -0 + [Bug 1172] 4.2.4p7-RC{3,4} fail to build on linux. + remove unportable 'set -m' from flock-build script + + configure.ac@1.414, 2009-05-02 01:48:30+00:00, davehart@shiny.ad.hartbrothers.com +1 -12 + reverse accidental backport from -dev of struct rtattr test in + configure.ac without corresponding ntp_io.c code for HAVE_RTNETLINK + + flock-build@1.41, 2009-05-02 01:48:30+00:00, davehart@shiny.ad.hartbrothers.com +3 -5 + set -m wasn't needed with ssh -tt and caused problems, remove + +ChangeSet@1.1585, 2009-04-29 04:03:41-04:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7_RC4 + TAG: NTP_4_2_4P7_RC4 + + ChangeLog@1.74, 2009-04-29 04:03:17-04:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7_RC4 + + ntpd/ntpd-opts.c@1.80, 2009-04-29 04:03:18-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + ntpd/ntpd-opts.h@1.80, 2009-04-29 04:03:19-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC4 + + ntpd/ntpd-opts.texi@1.79, 2009-04-29 04:03:21-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC4 + + ntpd/ntpd.1@1.78, 2009-04-29 04:03:21-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + ntpd/ntpdsim-opts.c@1.80, 2009-04-29 04:03:22-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + ntpd/ntpdsim-opts.h@1.80, 2009-04-29 04:03:22-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC4 + + ntpd/ntpdsim-opts.texi@1.78, 2009-04-29 04:03:24-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC4 + + ntpd/ntpdsim.1@1.78, 2009-04-29 04:03:25-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + ntpdc/ntpdc-opts.c@1.80, 2009-04-29 04:03:25-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + ntpdc/ntpdc-opts.h@1.80, 2009-04-29 04:03:26-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC4 + + ntpdc/ntpdc-opts.texi@1.78, 2009-04-29 04:03:27-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC4 + + ntpdc/ntpdc.1@1.78, 2009-04-29 04:03:28-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + ntpq/ntpq-opts.c@1.82, 2009-04-29 04:03:29-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + ntpq/ntpq-opts.h@1.82, 2009-04-29 04:03:29-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC4 + + ntpq/ntpq-opts.texi@1.79, 2009-04-29 04:03:30-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC4 + + ntpq/ntpq.1@1.78, 2009-04-29 04:03:31-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + packageinfo.sh@1.110, 2009-04-29 04:03:31-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC4 + + sntp/sntp-opts.c@1.78, 2009-04-29 04:03:32-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + sntp/sntp-opts.h@1.78, 2009-04-29 04:03:33-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC4 + + sntp/sntp-opts.texi@1.75, 2009-04-29 04:03:34-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC4 + + sntp/sntp.1@1.78, 2009-04-29 04:03:35-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + util/ntp-keygen-opts.c@1.79, 2009-04-29 04:03:36-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + + util/ntp-keygen-opts.h@1.79, 2009-04-29 04:03:36-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC4 + + util/ntp-keygen-opts.texi@1.77, 2009-04-29 04:03:36-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC4 + + util/ntp-keygen.1@1.77, 2009-04-29 04:03:37-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC4 + +ChangeSet@1.1584, 2009-04-29 01:50:44-04:00, stenn@pogo.udel.edu +1 -0 + No need to know the GCC -W items in config.h + + configure.ac@1.413, 2009-04-29 01:50:36-04:00, stenn@pogo.udel.edu +2 -12 + No need to know the GCC -W items in config.h + +ChangeSet@1.1583, 2009-04-27 11:47:49+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + ChangeLog: + add [Bug 1167] to ChangeLog entry + + ChangeLog@1.73, 2009-04-27 11:47:36+00:00, davehart@shiny.ad.hartbrothers.com +1 -1 + add [Bug 1167] to ChangeLog entry + +ChangeSet@1.1582, 2009-04-26 06:10:27+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + gcc -Winit-self is used only if it is understood + + ChangeLog@1.72, 2009-04-26 06:10:25+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + gcc -Winit-self is used only if it is understood + + configure.ac@1.412, 2009-04-26 06:10:26+00:00, davehart@shiny.ad.hartbrothers.com +34 -2 + gcc -Winit-self is used only if it is understood + +ChangeSet@1.1581, 2009-04-22 08:18:29-04:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7_RC3 + TAG: NTP_4_2_4P7_RC3 + + ChangeLog@1.71, 2009-04-22 08:18:04-04:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7_RC3 + + ntpd/ntpd-opts.c@1.79, 2009-04-22 08:18:04-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpd/ntpd-opts.h@1.79, 2009-04-22 08:18:05-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC3 + + ntpd/ntpd-opts.texi@1.78, 2009-04-22 08:18:05-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpd/ntpd.1@1.77, 2009-04-22 08:18:07-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpd/ntpdsim-opts.c@1.79, 2009-04-22 08:18:08-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpd/ntpdsim-opts.h@1.79, 2009-04-22 08:18:08-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC3 + + ntpd/ntpdsim-opts.texi@1.77, 2009-04-22 08:18:09-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC3 + + ntpd/ntpdsim.1@1.77, 2009-04-22 08:18:10-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpdc/ntpdc-opts.c@1.79, 2009-04-22 08:18:11-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpdc/ntpdc-opts.h@1.79, 2009-04-22 08:18:11-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC3 + + ntpdc/ntpdc-opts.texi@1.77, 2009-04-22 08:18:12-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpdc/ntpdc.1@1.77, 2009-04-22 08:18:13-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpq/ntpq-opts.c@1.81, 2009-04-22 08:18:13-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpq/ntpq-opts.h@1.81, 2009-04-22 08:18:14-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC3 + + ntpq/ntpq-opts.texi@1.78, 2009-04-22 08:18:15-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + ntpq/ntpq.1@1.77, 2009-04-22 08:18:16-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + packageinfo.sh@1.109, 2009-04-22 08:18:17-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC3 + + sntp/sntp-opts.c@1.77, 2009-04-22 08:18:19-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + sntp/sntp-opts.h@1.77, 2009-04-22 08:18:20-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC3 + + sntp/sntp-opts.texi@1.74, 2009-04-22 08:18:20-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC3 + + sntp/sntp.1@1.77, 2009-04-22 08:18:22-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + util/ntp-keygen-opts.c@1.78, 2009-04-22 08:18:23-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + util/ntp-keygen-opts.h@1.78, 2009-04-22 08:18:23-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC3 + + util/ntp-keygen-opts.texi@1.76, 2009-04-22 08:18:25-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + + util/ntp-keygen.1@1.76, 2009-04-22 08:18:25-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC3 + +ChangeSet@1.1580, 2009-04-22 07:00:20-04:00, stenn@whimsy.udel.edu +1 -0 + [Bug 1155] Fix compile problem on Windows with VS2005 + + ChangeLog@1.70, 2009-04-22 07:00:11-04:00, stenn@whimsy.udel.edu +1 -0 + [Bug 1155] Fix compile problem on Windows with VS2005 + +ChangeSet@1.1579, 2009-04-22 06:06:53-04:00, stenn@whimsy.udel.edu +1 -0 + Cleanup + + ChangeLog@1.69, 2009-04-22 06:06:44-04:00, stenn@whimsy.udel.edu +4 -2 + Cleanup + +ChangeSet@1.1578, 2009-04-20 22:55:13+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + ChangeLog: + auto merge not quite right + + ChangeLog@1.68, 2009-04-20 22:55:10+00:00, davehart@shiny.ad.hartbrothers.com +3 -7 + auto merge not quite right + +ChangeSet@1.1577, 2009-04-20 22:42:59+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + ntp_iocompletionport.c: + revert overlooked CreateEvent naming/sharing change not conditionalized away already + + ports/winnt/ntpd/ntp_iocompletionport.c@1.32, 2009-04-20 22:42:50+00:00, davehart@shiny.ad.hartbrothers.com +2 -2 + revert overlooked CreateEvent naming/sharing change not conditionalized away already + +ChangeSet@1.1567.1.11, 2009-04-20 06:17:21+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + ChangeLog: + [Bug 1160] Mac OS X is like BSD regarding F_SETOWN + + ChangeLog@1.64.1.3, 2009-04-20 06:17:15+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + [Bug 1160] Mac OS X is like BSD regarding F_SETOWN + +ChangeSet@1.1567.1.10, 2009-04-20 06:02:20+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + configure.ac: + [Bug 1160] MacOS X is like BSD regarding F_SETOWN + + configure.ac@1.411, 2009-04-20 06:02:08+00:00, davehart@shiny.ad.hartbrothers.com +3 -0 + [Bug 1160] MacOS X is like BSD regarding F_SETOWN + +ChangeSet@1.1567.1.9, 2009-04-16 02:39:01+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + configure.ac: + fix for --enable-ntp-signd=/my/path + + configure.ac@1.410, 2009-04-16 02:38:53+00:00, davehart@shiny.ad.hartbrothers.com +1 -1 + fix for --enable-ntp-signd=/my/path + +ChangeSet@1.1567.1.8, 2009-04-15 12:36:24+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + configure.ac: + do not cache options fix + + configure.ac@1.409, 2009-04-15 12:36:12+00:00, davehart@shiny.ad.hartbrothers.com +1 -1 + do not cache options fix + +ChangeSet@1.1567.1.7, 2009-04-15 10:43:51+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + configure.ac: + Do not cache configure --options, only current values matter + Default --enable-wintime when --enable-ntp-signd + + configure.ac@1.408, 2009-04-15 10:43:32+00:00, davehart@shiny.ad.hartbrothers.com +575 -403 + Do not cache configure --options, only current values matter + Default --enable-wintime when --enable-ntp-signd + +ChangeSet@1.1567.1.6, 2009-04-15 01:32:33+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + use AC_SEARCH_LIBS to avoid problems with sntp + + configure.ac@1.407, 2009-04-15 01:30:56+00:00, davehart@shiny.ad.hartbrothers.com +12 -20 + use AC_SEARCH_LIBS in preference to AC_CHECK_LIB particulary for sockets, use AM_PROG_CC_C_O which supersets prior AC_PROG_CC_C_O + + sntp/configure.ac@1.17, 2009-04-15 01:28:22+00:00, davehart@shiny.ad.hartbrothers.com +4 -4 + use AC_SEARCH_LIBS which is recommended particularly for sockets over the older AC_CHECK_LIB + +ChangeSet@1.1567.1.5, 2009-04-14 13:47:29+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + configure.ac: + tear off sntp/configure.ac from configure.ac + + configure.ac@1.406, 2009-04-14 13:46:17+00:00, davehart@shiny.ad.hartbrothers.com +6 -1 + tear off sntp/configure.ac from configure.ac + +ChangeSet@1.1575, 2009-04-14 07:55:41-04:00, mayer@pogo.udel.edu +1 -0 + Added fix for Bug 813 + + ChangeLog@1.66, 2009-04-14 07:55:31-04:00, mayer@pogo.udel.edu +1 -0 + Added fix for Bug 813 + +ChangeSet@1.1574, 2009-04-14 07:51:41-04:00, mayer@pogo.udel.edu +1 -0 + [Bug 813] Conditional naming of Event + + ports/winnt/ntpd/ntp_iocompletionport.c@1.31, 2009-04-14 07:51:14-04:00, mayer@pogo.udel.edu +7 -1 + [Bug 813] Conditional naming of Event + +ChangeSet@1.1567.1.4, 2009-04-14 05:21:17+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + configure.ac: + use unset for tickadj utility test fix + + configure.ac@1.405, 2009-04-14 05:21:15+00:00, davehart@shiny.ad.hartbrothers.com +1 -1 + use unset for tickadj utility test fix + +ChangeSet@1.1567.1.3, 2009-04-14 02:59:39+00:00, hart@pogo.udel.edu +1 -0 + build: + do not require nice + + build@1.26, 2009-04-14 02:59:20+00:00, hart@pogo.udel.edu +21 -4 + do not require nice + +ChangeSet@1.1567.1.2, 2009-04-14 01:33:01+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + configure.ac, ChangeLog: + [Bug 1158] support for aix6.1 + + ChangeLog@1.64.1.2, 2009-04-14 01:33:00+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + [Bug 1158] support for aix6.1 + + configure.ac@1.404, 2009-04-14 01:33:00+00:00, davehart@shiny.ad.hartbrothers.com +8 -8 + [Bug 1158] support for aix6.1 + +ChangeSet@1.1567.1.1, 2009-04-14 01:28:08+00:00, davehart@shiny.ad.hartbrothers.com +5 -0 + [Bug 1157] quiet OpenSSL warnings, clean up configure.ac + make flock-build quit before causing harm if another has not completed + + + ChangeLog@1.64.1.1, 2009-04-14 01:28:06+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + [Bug 1157] quiet OpenSSL warnings, clean up configure.ac + + build@1.25, 2009-04-14 01:28:07+00:00, davehart@shiny.ad.hartbrothers.com +6 -7 + prevent multiple flock-builds from stepping on each others work + + configure.ac@1.403, 2009-04-14 01:28:07+00:00, davehart@shiny.ad.hartbrothers.com +613 -361 + [Bug 1157] quiet OpenSSL warnings, configure.ac cleanup + + flock-build@1.40, 2009-04-14 01:28:07+00:00, davehart@shiny.ad.hartbrothers.com +76 -20 + prevent multiple flock-builds from stepping on each others work + + sntp/configure.ac@1.16, 2009-04-14 01:28:07+00:00, davehart@shiny.ad.hartbrothers.com +14 -0 + bring in line with -dev to ease merges, no functional change + +ChangeSet@1.1573, 2009-04-13 00:00:55-04:00, mayer@pogo.udel.edu +1 -0 + Forgot the _WIN32_WINNT update + + ports/winnt/include/config.h@1.51, 2009-04-13 00:00:24-04:00, mayer@pogo.udel.edu +10 -23 + Forgot the _WIN32_WINNT update + +ChangeSet@1.1572, 2009-04-12 00:55:24-04:00, mayer@pogo.udel.edu +1 -0 + Windows bug fixes + + ChangeLog@1.65, 2009-04-12 00:54:43-04:00, mayer@pogo.udel.edu +7 -2 + Windows bug fixes + +ChangeSet@1.1571, 2009-04-12 00:45:48-04:00, mayer@pogo.udel.edu +2 -0 + [Bug 1156] lock_thread_to_processor() should be declared in header + + ports/winnt/include/clockstuff.h@1.8, 2009-04-12 00:45:09-04:00, mayer@pogo.udel.edu +1 -0 + [Bug 1156] lock_thread_to_processor() should be declared in header + + ports/winnt/ntpd/nt_clockstuff.c@1.25, 2009-04-12 00:45:09-04:00, mayer@pogo.udel.edu +0 -1 + [Bug 1156] lock_thread_to_processor() should be declared in header + +ChangeSet@1.1570, 2009-04-12 00:38:47-04:00, mayer@pogo.udel.edu +1 -0 + [Bug 1147] System errors should be logged to msyslog() + + ports/winnt/ntpd/ntp_iocompletionport.c@1.30, 2009-04-12 00:38:08-04:00, mayer@pogo.udel.edu +17 -14 + [Bug 1147] System errors should be logged to msyslog() + +ChangeSet@1.1569, 2009-04-12 00:34:41-04:00, mayer@pogo.udel.edu +1 -0 + [Bug 1155] Wrong header included in config.h. Should have been winsock2.h + + ports/winnt/include/config.h@1.50, 2009-04-12 00:34:10-04:00, mayer@pogo.udel.edu +1 -2 + [Bug 1155] Wrong header included in config.h. Should have been winsock2.h + +ChangeSet@1.1568, 2009-04-12 00:32:25-04:00, mayer@pogo.udel.edu +1 -0 + [Bug 787] Bug fixes for 64-bit time_t on Windows + + ports/winnt/libntp/SetSystemTime.c@1.4, 2009-04-12 00:30:42-04:00, mayer@pogo.udel.edu +2 -2 + [Bug 787] Bug fixes for 64-bit time_t on Windows + +ChangeSet@1.1567, 2009-04-09 07:44:06-04:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7_RC2 + TAG: NTP_4_2_4P7_RC2 + + ChangeLog@1.64, 2009-04-09 07:43:41-04:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7_RC2 + + ntpd/ntpd-opts.c@1.78, 2009-04-09 07:43:42-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpd/ntpd-opts.h@1.78, 2009-04-09 07:43:43-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC2 + + ntpd/ntpd-opts.texi@1.77, 2009-04-09 07:43:43-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpd/ntpd.1@1.76, 2009-04-09 07:43:45-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpd/ntpdsim-opts.c@1.78, 2009-04-09 07:43:46-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpd/ntpdsim-opts.h@1.78, 2009-04-09 07:43:47-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC2 + + ntpd/ntpdsim-opts.texi@1.76, 2009-04-09 07:43:47-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC2 + + ntpd/ntpdsim.1@1.76, 2009-04-09 07:43:48-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpdc/ntpdc-opts.c@1.78, 2009-04-09 07:43:49-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpdc/ntpdc-opts.h@1.78, 2009-04-09 07:43:50-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC2 + + ntpdc/ntpdc-opts.texi@1.76, 2009-04-09 07:43:51-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpdc/ntpdc.1@1.76, 2009-04-09 07:43:51-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpq/ntpq-opts.c@1.80, 2009-04-09 07:43:52-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpq/ntpq-opts.h@1.80, 2009-04-09 07:43:53-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC2 + + ntpq/ntpq-opts.texi@1.77, 2009-04-09 07:43:54-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + ntpq/ntpq.1@1.76, 2009-04-09 07:43:55-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + packageinfo.sh@1.108, 2009-04-09 07:43:55-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC2 + + sntp/sntp-opts.c@1.76, 2009-04-09 07:43:57-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + sntp/sntp-opts.h@1.76, 2009-04-09 07:43:58-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC2 + + sntp/sntp-opts.texi@1.73, 2009-04-09 07:43:58-04:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC2 + + sntp/sntp.1@1.76, 2009-04-09 07:43:59-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + util/ntp-keygen-opts.c@1.77, 2009-04-09 07:44:00-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + util/ntp-keygen-opts.h@1.77, 2009-04-09 07:44:00-04:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC2 + + util/ntp-keygen-opts.texi@1.75, 2009-04-09 07:44:02-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + + util/ntp-keygen.1@1.75, 2009-04-09 07:44:02-04:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC2 + +ChangeSet@1.1566, 2009-04-09 04:16:50-04:00, stenn@whimsy.udel.edu +1 -0 + ChangLog cleanup + + ChangeLog@1.63, 2009-04-09 04:16:43-04:00, stenn@whimsy.udel.edu +1 -0 + ChangLog cleanup + +ChangeSet@1.1565, 2009-04-09 04:13:41-04:00, stenn@whimsy.udel.edu +2 -0 + [Sec 1144] limited buffer overflow in ntpq. CVE-2009-0159 + + ChangeLog@1.62, 2009-04-09 04:13:30-04:00, stenn@whimsy.udel.edu +2 -0 + [Sec 1144] limited buffer overflow in ntpq. CVE-2009-0159 + + ntpq/ntpq.c@1.66, 2009-04-09 04:13:30-04:00, stenn@whimsy.udel.edu +2 -2 + [Sec 1144] limited buffer overflow in ntpq. CVE-2009-0159 + +ChangeSet@1.1564, 2009-04-07 09:14:58+00:00, davehart@shiny.ad.hartbrothers.com +3 -0 + [Sec 1149] use setsockopt(SO_EXCLUSIVEADDRUSE) on Windows + + ChangeLog@1.61, 2009-04-07 09:14:56+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + [Sec 1149] use setsockopt(SO_EXCLUSIVEADDRUSE) on Windows + + ntpd/ntp_io.c@1.259, 2009-04-07 09:14:56+00:00, davehart@shiny.ad.hartbrothers.com +64 -31 + [Sec 1149] use setsockopt(SO_EXCLUSIVEADDRUSE) on Windows + + ports/winnt/libntp/libntp.vcproj@1.2, 2009-04-07 09:14:57+00:00, davehart@shiny.ad.hartbrothers.com +4 -0 + add ntp_debug.h + +ChangeSet@1.1563, 2009-03-30 06:47:41-05:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P7_RC1 + TAG: NTP_4_2_4P7_RC1 + + ChangeLog@1.60, 2009-03-30 06:47:19-05:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P7_RC1 + + ntpd/ntpd-opts.c@1.77, 2009-03-30 06:47:20-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpd/ntpd-opts.h@1.77, 2009-03-30 06:47:21-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC1 + + ntpd/ntpd-opts.texi@1.76, 2009-03-30 06:47:22-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpd/ntpd.1@1.75, 2009-03-30 06:47:22-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpd/ntpdsim-opts.c@1.77, 2009-03-30 06:47:23-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpd/ntpdsim-opts.h@1.77, 2009-03-30 06:47:24-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC1 + + ntpd/ntpdsim-opts.texi@1.75, 2009-03-30 06:47:25-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC1 + + ntpd/ntpdsim.1@1.75, 2009-03-30 06:47:26-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpdc/ntpdc-opts.c@1.77, 2009-03-30 06:47:26-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpdc/ntpdc-opts.h@1.77, 2009-03-30 06:47:26-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC1 + + ntpdc/ntpdc-opts.texi@1.75, 2009-03-30 06:47:27-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpdc/ntpdc.1@1.75, 2009-03-30 06:47:28-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpq/ntpq-opts.c@1.79, 2009-03-30 06:47:29-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpq/ntpq-opts.h@1.79, 2009-03-30 06:47:30-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC1 + + ntpq/ntpq-opts.texi@1.76, 2009-03-30 06:47:31-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + ntpq/ntpq.1@1.75, 2009-03-30 06:47:32-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + packageinfo.sh@1.107, 2009-03-30 06:47:33-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + sntp/sntp-opts.c@1.75, 2009-03-30 06:47:33-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + sntp/sntp-opts.h@1.75, 2009-03-30 06:47:34-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC1 + + sntp/sntp-opts.texi@1.72, 2009-03-30 06:47:35-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P7_RC1 + + sntp/sntp.1@1.75, 2009-03-30 06:47:35-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + util/ntp-keygen-opts.c@1.76, 2009-03-30 06:47:36-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + util/ntp-keygen-opts.h@1.76, 2009-03-30 06:47:36-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P7_RC1 + + util/ntp-keygen-opts.texi@1.74, 2009-03-30 06:47:37-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + + util/ntp-keygen.1@1.74, 2009-03-30 06:47:38-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P7_RC1 + +ChangeSet@1.1562, 2009-03-30 02:31:49-05:00, stenn@whimsy.udel.edu +1 -0 + Release Candidate + + packageinfo.sh@1.106, 2009-03-30 02:31:39-05:00, stenn@whimsy.udel.edu +1 -1 + Release Candidate + +ChangeSet@1.1560, 2009-03-28 02:46:45-05:00, stenn@whimsy.udel.edu +9 -0 + build system email address cleanup + + BitKeeper/triggers/changelog@1.4, 2009-03-28 02:45:21-05:00, stenn@whimsy.udel.edu +1 -1 + trigger email address cleanup + + BitKeeper/triggers/commitlogs@1.6, 2009-03-28 02:45:22-05:00, stenn@whimsy.udel.edu +1 -1 + trigger email address cleanup + + BitKeeper/triggers/delta-changelog@1.8, 2009-03-28 02:45:22-05:00, stenn@whimsy.udel.edu +2 -2 + trigger email address cleanup + + BitKeeper/triggers/notify@1.4, 2009-03-28 02:45:22-05:00, stenn@whimsy.udel.edu +1 -1 + trigger email address cleanup + + BitKeeper/triggers/paranoid@1.4, 2009-03-28 02:45:22-05:00, stenn@whimsy.udel.edu +1 -1 + trigger email address cleanup + + BitKeeper/triggers/post-incoming.license-warn@1.7, 2009-03-28 02:45:22-05:00, stenn@whimsy.udel.edu +1 -1 + trigger email address cleanup + + BitKeeper/triggers/pre-resolve.licfix@1.4, 2009-03-28 02:45:22-05:00, stenn@whimsy.udel.edu +1 -1 + trigger email address cleanup + + BitKeeper/triggers/send@1.14, 2009-03-28 02:45:22-05:00, stenn@whimsy.udel.edu +2 -2 + trigger email address cleanup + + ChangeLog@1.58, 2009-03-28 02:46:36-05:00, stenn@whimsy.udel.edu +3 -1 + build system email address cleanup + +ChangeSet@1.1559, 2009-03-24 15:22:36+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + config.h: + include winsock.h before ws2tcpip.h to fix VS 2005 build + + ports/winnt/include/config.h@1.49, 2009-03-24 15:22:23+00:00, davehart@shiny.ad.hartbrothers.com +8 -5 + include winsock.h before ws2tcpip.h to fix VS 2005 build + +ChangeSet@1.1549.4.2, 2009-03-24 15:14:36+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + ntp_iocompletionport.c: + use one receive per socket to avoid Win2000 afd.sys bugcheck 0x76 + + ports/winnt/ntpd/ntp_iocompletionport.c@1.26.1.2, 2009-03-24 15:14:23+00:00, davehart@shiny.ad.hartbrothers.com +10 -1 + use one receive per socket to avoid Win2000 afd.sys bugcheck 0x76 + +ChangeSet@1.1557, 2009-03-22 21:09:43+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + Makefile.am, ChangeLog: + [Bug 774] parsesolaris.c does not compile under the new Solaris + + ChangeLog@1.57, 2009-03-22 21:09:42+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + [Bug 774] parsesolaris.c does not compile under the new Solaris + + libparse/Makefile.am@1.9, 2009-03-22 21:09:42+00:00, davehart@shiny.ad.hartbrothers.com +1 -1 + [Bug 774] parsesolaris.c does not compile under the new Solaris + +ChangeSet@1.1556, 2009-03-20 03:39:26+00:00, hart@pogo.udel.edu +1 -0 + ChangeLog: + bk for windows isn't converting line endings correctly, remove two blank lines visible only on Unix side + + ChangeLog@1.56, 2009-03-20 03:39:16+00:00, hart@pogo.udel.edu +0 -2 + bk for windows isn't converting line endings correctly, remove two blank lines visible only on Unix side + +ChangeSet@1.1553, 2009-03-20 03:10:22+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + ChangeLog: + remove blank first line + + ChangeLog@1.53, 2009-03-20 03:09:55+00:00, davehart@shiny.ad.hartbrothers.com +0 -1 + remove blank first line + +ChangeSet@1.1549.4.1, 2009-03-20 01:46:15+00:00, davehart@shiny.ad.hartbrothers.com +10 -0 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ChangeLog@1.50.4.1, 2009-03-20 01:46:11+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ntpd/ntp_io.c@1.256.1.1, 2009-03-20 01:46:11+00:00, davehart@shiny.ad.hartbrothers.com +26 -23 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ntpd/ntpd.c@1.86, 2009-03-20 01:46:12+00:00, davehart@shiny.ad.hartbrothers.com +14 -25 + slightly reduce #ifdef SYS_WINNT forest + + ntpd/refclock_dumbclock.c@1.9, 2009-03-20 01:46:12+00:00, davehart@shiny.ad.hartbrothers.com +6 -5 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ntpd/refclock_hopfser.c@1.10, 2009-03-20 01:46:12+00:00, davehart@shiny.ad.hartbrothers.com +6 -5 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ntpd/refclock_nmea.c@1.26, 2009-03-20 01:46:12+00:00, davehart@shiny.ad.hartbrothers.com +6 -5 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ntpd/refclock_palisade.c@1.19, 2009-03-20 01:46:12+00:00, davehart@shiny.ad.hartbrothers.com +6 -5 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ports/winnt/include/ntp_iocompletionport.h@1.14, 2009-03-20 01:46:13+00:00, davehart@shiny.ad.hartbrothers.com +8 -9 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ports/winnt/ntpd/ntp_iocompletionport.c@1.26.1.1, 2009-03-20 01:46:13+00:00, davehart@shiny.ad.hartbrothers.com +331 -249 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + + ports/winnt/ntpd/win32_io.c@1.13, 2009-03-20 01:46:13+00:00, davehart@shiny.ad.hartbrothers.com +172 -66 + [Bug 873] Windows serial refclock proper TTY line discipline emulation + +ChangeSet@1.1549.3.2, 2009-03-18 11:44:59+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + [Bug 1014] Enable building with VC9 (in Visual Studio 2008, Visual C++ 2008, or SDK) + + ChangeLog@1.50.3.1, 2009-03-18 11:44:52+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + [Bug 1014] Enable building with VC9 (in Visual Studio 2008, Visual C++ 2008, or SDK) + +ChangeSet@1.1549.1.4, 2009-03-18 10:14:52+00:00, davehart@shiny.ad.hartbrothers.com +1 -0 + [Bug 1117] Deferred interface binding under Windows works only correctly if FORCE_DNSRETRY is defined + + ChangeLog@1.50.1.3, 2009-03-18 10:12:28+00:00, davehart@shiny.ad.hartbrothers.com +2 -0 + [Bug 1117] Deferred interface binding under Windows works only correctly if FORCE_DNSRETRY is defined + +ChangeSet@1.1549.3.1, 2009-03-17 18:39:09+00:00, davehart@shiny.ad.hartbrothers.com +8 -0 + add .sln and .vcproj files for VC9 + + ports/winnt/instsrv/Instsrv.vcproj@1.1, 2009-03-17 18:34:21+00:00, davehart@shiny.ad.hartbrothers.com +253 -0 + VC9 equivalent to Instsrv.dsp + + ports/winnt/instsrv/Instsrv.vcproj@1.0, 2009-03-17 18:34:21+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + + ports/winnt/libntp/libntp.vcproj@1.1, 2009-03-17 18:35:45+00:00, davehart@shiny.ad.hartbrothers.com +2229 -0 + VC9 equivalent to libntp.dsp + + ports/winnt/libntp/libntp.vcproj@1.0, 2009-03-17 18:35:45+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + + ports/winnt/ntp-keygen/ntpkeygen.vcproj@1.1, 2009-03-17 18:36:28+00:00, davehart@shiny.ad.hartbrothers.com +419 -0 + VC9 equivalent to ntpkeygen.dsp + + ports/winnt/ntp-keygen/ntpkeygen.vcproj@1.0, 2009-03-17 18:36:28+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + + ports/winnt/ntp.sln@1.1, 2009-03-17 18:38:44+00:00, davehart@shiny.ad.hartbrothers.com +71 -0 + VC9 equivalent to ntp.dsw + + ports/winnt/ntp.sln@1.0, 2009-03-17 18:38:44+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + + ports/winnt/ntpd/ntpd.vcproj@1.1, 2009-03-17 18:36:49+00:00, davehart@shiny.ad.hartbrothers.com +2198 -0 + VC9 equivalent to ntpd.dsp + + ports/winnt/ntpd/ntpd.vcproj@1.0, 2009-03-17 18:36:49+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + + ports/winnt/ntpdate/ntpdate.vcproj@1.1, 2009-03-17 18:37:19+00:00, davehart@shiny.ad.hartbrothers.com +327 -0 + VC9 equivalent to ntpdate.dsp + + ports/winnt/ntpdate/ntpdate.vcproj@1.0, 2009-03-17 18:37:19+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + + ports/winnt/ntpdc/ntpdc.vcproj@1.1, 2009-03-17 18:37:32+00:00, davehart@shiny.ad.hartbrothers.com +376 -0 + VC9 equivalent to ntpdc.dsp + + ports/winnt/ntpdc/ntpdc.vcproj@1.0, 2009-03-17 18:37:31+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + + ports/winnt/ntpq/ntpq.vcproj@1.1, 2009-03-17 18:37:48+00:00, davehart@shiny.ad.hartbrothers.com +370 -0 + VC9 equivalent to ntpq.dsp + + ports/winnt/ntpq/ntpq.vcproj@1.0, 2009-03-17 18:37:48+00:00, davehart@shiny.ad.hartbrothers.com +0 -0 + +ChangeSet@1.1549.1.3, 2009-03-17 18:18:13+00:00, hart@pogo.udel.edu +1 -0 + config.h: + now works with VC6 and VC9 compilers, declares DWORD_PTR on VC6 + + ports/winnt/include/config.h@1.48, 2009-03-17 18:18:01+00:00, hart@pogo.udel.edu +243 -96 + now works with VC6 and VC9 compilers, declares DWORD_PTR on VC6 + +ChangeSet@1.1549.2.1, 2009-02-21 07:45:56-05:00, utterback@pogo.udel.edu +2 -0 + configure.ac, ChangeLog: + [BUG 1131] UDP sockets should not use SIGPOLL on Solaris. + + ChangeLog@1.50.2.1, 2009-02-20 12:30:18-05:00, utterback@pogo.udel.edu +2 -0 + [BUG 1131] UDP sockets should not use SIGPOLL on Solaris. + + configure.ac@1.402, 2009-02-20 11:30:02-05:00, utterback@pogo.udel.edu +3 -0 + [BUG 1131] UDP sockets should not use SIGPOLL on Solaris. + +ChangeSet@1.1549.1.2, 2009-02-07 21:13:17+00:00, hart@pogo.udel.edu +1 -0 + ChangeLog: + formatting of newest line + + ChangeLog@1.50.1.2, 2009-02-07 21:12:26+00:00, hart@pogo.udel.edu +1 -1 + formatting of newest line + +ChangeSet@1.1549.1.1, 2009-02-07 21:05:32+00:00, hart@pogo.udel.edu +3 -0 + nt_clockstuff.c, ChangeLog, ntp_iocompletionport.c: + [BUG 1124] Lock QueryPerformanceCounter() client threads to same CPU + + ChangeLog@1.50.1.1, 2009-02-07 21:04:52+00:00, hart@pogo.udel.edu +2 -0 + [BUG 1124] Lock QueryPerformanceCounter() client threads to same CPU + + ports/winnt/ntpd/nt_clockstuff.c@1.24, 2009-02-07 21:02:04+00:00, hart@pogo.udel.edu +89 -22 + [BUG 1124] Lock QueryPerformanceCounter() client threads to same CPU + + ports/winnt/ntpd/ntp_iocompletionport.c@1.27, 2009-02-07 21:03:34+00:00, hart@pogo.udel.edu +12 -0 + [BUG 1124] Lock QueryPerformanceCounter() client threads to same CPU + +ChangeSet@1.1551, 2009-02-07 14:08:35-05:00, hart@pogo.udel.edu +1 -0 + ChangeLog: + DPRINTF safer + + ChangeLog@1.51, 2009-02-07 14:07:34-05:00, hart@pogo.udel.edu +2 -0 + DPRINTF safer + +ChangeSet@1.1550, 2009-02-06 19:00:15-05:00, hart@pogo.udel.edu +2 -0 + ntp_debug.h: + DPRINTF won't eat following else, always evaluates to a statement + ntp_io.c: + DPRINTF_INTERFACE always evaluates to a statement + fix DPRINTF use with misplaced semicolon + + include/ntp_debug.h@1.2, 2009-02-06 18:50:27-05:00, hart@pogo.udel.edu +6 -4 + DPRINTF won't eat following else, always evaluates to a statement + + ntpd/ntp_io.c@1.257, 2009-02-06 18:53:58-05:00, hart@pogo.udel.edu +2 -2 + DPRINTF_INTERFACE always evaluates to a statement + fix DPRINTF use with misplaced semicolon + +ChangeSet@1.1549, 2009-01-08 06:21:48-05:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P6 + TAG: NTP_4_2_4P6 + + ChangeLog@1.50, 2009-01-08 06:21:25-05:00, stenn@whimsy.udel.edu +1 -2 + NTP_4_2_4P6 + + ntpd/ntpd-opts.c@1.76, 2009-01-08 06:21:26-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + ntpd/ntpd-opts.h@1.76, 2009-01-08 06:21:27-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P6 + + ntpd/ntpd-opts.texi@1.75, 2009-01-08 06:21:28-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P6 + + ntpd/ntpd.1@1.74, 2009-01-08 06:21:29-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + ntpd/ntpdsim-opts.c@1.76, 2009-01-08 06:21:29-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + ntpd/ntpdsim-opts.h@1.76, 2009-01-08 06:21:30-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P6 + + ntpd/ntpdsim-opts.texi@1.74, 2009-01-08 06:21:31-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P6 + + ntpd/ntpdsim.1@1.74, 2009-01-08 06:21:32-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + ntpdc/ntpdc-opts.c@1.76, 2009-01-08 06:21:33-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + ntpdc/ntpdc-opts.h@1.76, 2009-01-08 06:21:34-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P6 + + ntpdc/ntpdc-opts.texi@1.74, 2009-01-08 06:21:34-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P6 + + ntpdc/ntpdc.1@1.74, 2009-01-08 06:21:35-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + ntpq/ntpq-opts.c@1.78, 2009-01-08 06:21:36-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + ntpq/ntpq-opts.h@1.78, 2009-01-08 06:21:37-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P6 + + ntpq/ntpq-opts.texi@1.75, 2009-01-08 06:21:37-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P6 + + ntpq/ntpq.1@1.74, 2009-01-08 06:21:39-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + packageinfo.sh@1.105, 2009-01-08 06:21:39-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P6 + + sntp/sntp-opts.c@1.74, 2009-01-08 06:21:40-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + sntp/sntp-opts.h@1.74, 2009-01-08 06:21:41-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P6 + + sntp/sntp-opts.texi@1.71, 2009-01-08 06:21:42-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P6 + + sntp/sntp.1@1.74, 2009-01-08 06:21:42-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + util/ntp-keygen-opts.c@1.75, 2009-01-08 06:21:43-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + + util/ntp-keygen-opts.h@1.75, 2009-01-08 06:21:44-05:00, stenn@whimsy.udel.edu +3 -3 + NTP_4_2_4P6 + + util/ntp-keygen-opts.texi@1.73, 2009-01-08 06:21:44-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P6 + + util/ntp-keygen.1@1.73, 2009-01-08 06:21:45-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P6 + +ChangeSet@1.1548, 2009-01-08 04:49:23-05:00, stenn@whimsy.udel.edu +26 -0 + NTP_4_2_4P5 + TAG: NTP_4_2_4P5 + + ChangeLog@1.49, 2009-01-08 04:48:59-05:00, stenn@whimsy.udel.edu +1 -0 + NTP_4_2_4P5 + + ntpd/ntpd-opts.c@1.75, 2009-01-08 04:49:01-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpd/ntpd-opts.h@1.75, 2009-01-08 04:49:01-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpd/ntpd-opts.texi@1.74, 2009-01-08 04:49:03-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + ntpd/ntpd.1@1.73, 2009-01-08 04:49:03-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + ntpd/ntpdsim-opts.c@1.75, 2009-01-08 04:49:04-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpd/ntpdsim-opts.h@1.75, 2009-01-08 04:49:04-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpd/ntpdsim-opts.texi@1.73, 2009-01-08 04:49:05-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpd/ntpdsim.1@1.73, 2009-01-08 04:49:06-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + ntpdc/ntpdc-opts.c@1.75, 2009-01-08 04:49:06-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpdc/ntpdc-opts.h@1.75, 2009-01-08 04:49:07-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpdc/ntpdc-opts.texi@1.73, 2009-01-08 04:49:08-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + ntpdc/ntpdc.1@1.73, 2009-01-08 04:49:09-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + ntpq/ntpq-opts.c@1.77, 2009-01-08 04:49:10-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpq/ntpq-opts.h@1.77, 2009-01-08 04:49:10-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + ntpq/ntpq-opts.texi@1.74, 2009-01-08 04:49:11-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + ntpq/ntpq.1@1.73, 2009-01-08 04:49:12-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + packageinfo.sh@1.104, 2009-01-08 04:49:13-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + sntp/sntp-opts.c@1.73, 2009-01-08 04:49:14-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + sntp/sntp-opts.h@1.73, 2009-01-08 04:49:15-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + sntp/sntp-opts.texi@1.70, 2009-01-08 04:49:16-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + sntp/sntp.1@1.73, 2009-01-08 04:49:17-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + util/ntp-keygen-opts.c@1.74, 2009-01-08 04:49:18-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + util/ntp-keygen-opts.h@1.74, 2009-01-08 04:49:19-05:00, stenn@whimsy.udel.edu +1 -1 + NTP_4_2_4P5 + + util/ntp-keygen-opts.texi@1.72, 2009-01-08 04:49:20-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + + util/ntp-keygen.1@1.72, 2009-01-08 04:49:20-05:00, stenn@whimsy.udel.edu +2 -2 + NTP_4_2_4P5 + +ChangeSet@1.1547, 2009-01-08 03:21:09-05:00, stenn@whimsy.udel.edu +1 -0 + 4.2.4p6 + + packageinfo.sh@1.103, 2009-01-08 03:20:56-05:00, stenn@whimsy.udel.edu +1 -1 + 4.2.4p6 + +ChangeSet@1.1546, 2009-01-08 03:14:17-05:00, stenn@whimsy.udel.edu +1 -0 + merge cleanup + + ChangeLog@1.48, 2009-01-08 03:14:09-05:00, stenn@whimsy.udel.edu +1 -1 + merge cleanup + +ChangeSet@1.1543.1.1, 2009-01-08 02:57:52-05:00, stenn@whimsy.udel.edu +5 -0 + 4.2.4p6 + + ChangeLog@1.46, 2009-01-07 05:31:52-05:00, stenn@whimsy.udel.edu +6 -0 + Fix incorrect check of EVP_VerifyFinal()'s return value. + + NEWS@1.100, 2009-01-08 02:57:32-05:00, stenn@whimsy.udel.edu +16 -0 + 4.2.4p6 + + html/copyright.html@1.38, 2009-01-07 05:30:58-05:00, stenn@whimsy.udel.edu +1 -1 + Update the copyright year + + ntpd/ntp_crypto.c@1.108, 2009-01-07 05:31:50-05:00, stenn@whimsy.udel.edu +1 -1 + Fix incorrect check of EVP_VerifyFinal()'s return value. + + packageinfo.sh@1.102, 2009-01-08 02:57:33-05:00, stenn@whimsy.udel.edu +1 -1 + 4.2.4p6 + +ChangeSet@1.1544, 2009-01-07 18:00:50+01:00, burnicki@pogo.udel.edu +2 -0 + [BUG 1113] Fixed build errors with recent versions of openSSL. + + ChangeLog@1.45.1.1, 2009-01-07 18:00:47+01:00, burnicki@pogo.udel.edu +1 -0 + [BUG 1113] Fixed build errors with recent versions of openSSL. + + ntpd/ntp_crypto.c@1.107.1.1, 2009-01-07 18:00:47+01:00, burnicki@pogo.udel.edu +2 -2 + [BUG 1113] Fixed build errors with recent versions of openSSL. + +ChangeSet@1.1543, 2008-08-17 06:21:39-04:00, stenn@whimsy.udel.edu +1 -0 + typo + + scripts/addChangeLogTag@1.3, 2008-08-17 06:21:25-04:00, stenn@whimsy.udel.edu +0 -3 + typo + +ChangeSet@1.1542, 2008-08-17 06:16:19-04:00, stenn@whimsy.udel.edu +1 -0 + typo + + ChangeLog@1.45, 2008-08-17 06:16:08-04:00, stenn@whimsy.udel.edu +0 -2 + typo + ChangeSet@1.1541, 2008-08-17 05:30:47-04:00, stenn@whimsy.udel.edu +26 -0 NTP_4_2_4P5 TAG: NTP_4_2_4P5 @@ -2906,288 +4630,108 @@ ChangeSet@1.1474, 2007-04-14 01:11:33-04:00, stenn@whimsy.udel.edu +166 -0 BitKeeper/deleted/.del-COPYING.lgpl@1.3, 2007-04-13 18:58:46-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/COPYING.lgpl - sntp/libopts/COPYING.lgpl@1.1, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +502 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/COPYING.lgpl - - sntp/libopts/COPYING.lgpl@1.0, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-COPYING.lgpl~54a90ba0899593cb@1.2, 2007-04-13 19:05:57-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/COPYING.lgpl - libopts/COPYING.lgpl@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +502 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/COPYING.lgpl - - libopts/COPYING.lgpl@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-COPYING.mbsd@1.2, 2007-04-13 18:58:48-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/COPYING.mbsd - libopts/COPYING.mbsd@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +26 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/COPYING.mbsd - - libopts/COPYING.mbsd@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-COPYING.mbsd~9b1945bb2136c70b@1.2, 2007-04-13 19:05:59-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/COPYING.mbsd - sntp/libopts/COPYING.mbsd@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +26 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/COPYING.mbsd - - sntp/libopts/COPYING.mbsd@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-MakeDefs.inc@1.2, 2007-04-13 18:58:49-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/MakeDefs.inc BitKeeper/deleted/.del-MakeDefs.inc~2b8fdfc9df6d652d@1.2, 2007-04-13 19:06:00-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/MakeDefs.inc - sntp/libopts/MakeDefs.inc@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/MakeDefs.inc - - sntp/libopts/MakeDefs.inc@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/MakeDefs.inc@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/MakeDefs.inc - - libopts/MakeDefs.inc@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-Makefile.am@1.7, 2007-04-13 18:58:50-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/Makefile.am - libopts/Makefile.am@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +24 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/Makefile.am - - libopts/Makefile.am@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-Makefile.am~fa9bd87b6045015c@1.5, 2007-04-13 19:06:01-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/Makefile.am - sntp/libopts/Makefile.am@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +24 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/Makefile.am - - sntp/libopts/Makefile.am@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-README@1.2, 2007-04-13 18:58:51-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/README BitKeeper/deleted/.del-README~1ae087758ee867d4@1.2, 2007-04-13 19:06:02-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/README - sntp/libopts/README@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +93 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/README - - sntp/libopts/README@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/README@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +93 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/README - - libopts/README@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-autoopts.c@1.11, 2007-04-13 18:58:52-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/autoopts.c BitKeeper/deleted/.del-autoopts.c~5b417341bc85d7a8@1.8, 2007-04-13 19:06:03-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/autoopts.c - sntp/libopts/autoopts.c@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +1101 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts.c - - sntp/libopts/autoopts.c@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/autoopts.c@1.1, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +1101 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts.c - - libopts/autoopts.c@1.0, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-autoopts.h@1.10, 2007-04-13 18:58:53-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/autoopts.h - libopts/autoopts.h@1.1, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +377 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts.h - - libopts/autoopts.h@1.0, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-autoopts.h~8cdce21b181a1a01@1.8, 2007-04-13 19:06:05-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/autoopts.h - sntp/libopts/autoopts.h@1.1, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +377 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts.h - - sntp/libopts/autoopts.h@1.0, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-boolean.c@1.9, 2007-04-13 18:58:54-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/boolean.c - sntp/libopts/boolean.c@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +106 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/boolean.c - - sntp/libopts/boolean.c@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-boolean.c~a5d10c8997e6a2e2@1.6, 2007-04-13 19:06:06-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/boolean.c - libopts/boolean.c@1.1, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +106 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/boolean.c - - libopts/boolean.c@1.0, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-compat.h@1.13, 2007-04-13 19:04:47-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/compat/compat.h - sntp/libopts/compat/compat.h@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +314 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/compat.h - - sntp/libopts/compat/compat.h@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-compat.h~9682d0ac273ae32@1.9, 2007-04-13 19:06:50-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/compat/compat.h - libopts/compat/compat.h@1.1, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +314 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/compat.h - - libopts/compat/compat.h@1.0, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-configfile.c@1.11, 2007-04-13 18:58:56-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/configfile.c - libopts/configfile.c@1.1, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +1288 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/configfile.c - - libopts/configfile.c@1.0, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-configfile.c~8194f784686fa804@1.8, 2007-04-13 19:06:07-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/configfile.c - sntp/libopts/configfile.c@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +1288 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/configfile.c - - sntp/libopts/configfile.c@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-cook.c@1.10, 2007-04-13 18:58:57-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/cook.c - sntp/libopts/cook.c@1.1, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +354 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/cook.c - - sntp/libopts/cook.c@1.0, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/cook.c@1.1, 2007-04-13 19:10:08-04:00, stenn@whimsy.udel.edu +354 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/cook.c - - libopts/cook.c@1.0, 2007-04-13 19:10:08-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-cook.c~e48d079a438432dc@1.7, 2007-04-13 19:06:08-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/cook.c BitKeeper/deleted/.del-enumeration.c@1.10, 2007-04-13 18:58:59-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/enumeration.c - libopts/enumeration.c@1.1, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +498 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/enumeration.c - - libopts/enumeration.c@1.0, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-enumeration.c~5f4e6af2706370ae@1.7, 2007-04-13 19:06:10-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/enumeration.c - sntp/libopts/enumeration.c@1.1, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +498 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/enumeration.c - - sntp/libopts/enumeration.c@1.0, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-environment.c@1.9, 2007-04-13 18:59:00-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/environment.c BitKeeper/deleted/.del-environment.c~2bae2966695067c2@1.6, 2007-04-13 19:06:11-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/environment.c - sntp/libopts/environment.c@1.1, 2007-04-13 19:08:54-04:00, stenn@whimsy.udel.edu +260 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/environment.c - - sntp/libopts/environment.c@1.0, 2007-04-13 19:08:54-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/environment.c@1.1, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +260 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/environment.c - - libopts/environment.c@1.0, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-genshell.c@1.10, 2007-04-13 18:59:01-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/genshell.c BitKeeper/deleted/.del-genshell.c~1fd152b2b52bdab@1.7, 2007-04-13 19:06:12-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/genshell.c - libopts/genshell.c@1.1, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +345 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/genshell.c - - libopts/genshell.c@1.0, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +0 -0 - - sntp/libopts/genshell.c@1.1, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +345 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/genshell.c - - sntp/libopts/genshell.c@1.0, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-genshell.h@1.10, 2007-04-13 18:59:02-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/genshell.h BitKeeper/deleted/.del-genshell.h~375f0fa5b925f454@1.7, 2007-04-13 19:06:14-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/genshell.h - libopts/genshell.h@1.1, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +149 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/genshell.h - - libopts/genshell.h@1.0, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +0 -0 - - sntp/libopts/genshell.h@1.1, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +149 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/genshell.h - - sntp/libopts/genshell.h@1.0, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-libopts.c@1.4, 2007-04-13 18:59:04-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/libopts.c BitKeeper/deleted/.del-libopts.c~58b8fbed850e6d5e@1.4, 2007-04-13 19:06:15-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/libopts.c - libopts/libopts.c@1.1, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +30 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/libopts.c - - libopts/libopts.c@1.0, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +0 -0 - - sntp/libopts/libopts.c@1.1, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +30 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/libopts.c - - sntp/libopts/libopts.c@1.0, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-libopts.m4@1.15, 2007-04-13 19:04:54-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/m4/libopts.m4 - libopts/m4/libopts.m4@1.1, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +489 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/m4/libopts.m4 - - libopts/m4/libopts.m4@1.0, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-libopts.m4~9e0f33f57d3a0a9@1.12, 2007-04-13 19:06:56-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/m4/libopts.m4 - sntp/libopts/m4/libopts.m4@1.1, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +489 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/m4/libopts.m4 - - sntp/libopts/m4/libopts.m4@1.0, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-liboptschk.m4@1.4, 2007-04-13 19:04:55-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/m4/liboptschk.m4 - libopts/m4/liboptschk.m4@1.1, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +42 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/m4/liboptschk.m4 - - libopts/m4/liboptschk.m4@1.0, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +0 -0 - - sntp/libopts/m4/liboptschk.m4@1.1, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +42 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/m4/liboptschk.m4 - - sntp/libopts/m4/liboptschk.m4@1.0, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-liboptschk.m4~bbeebebe76865058@1.4, 2007-04-13 19:06:58-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/m4/liboptschk.m4 @@ -3203,125 +4747,45 @@ ChangeSet@1.1474, 2007-04-14 01:11:33-04:00, stenn@whimsy.udel.edu +166 -0 BitKeeper/deleted/.del-load.c~59960aa12bb95bf7@1.8, 2007-04-13 19:06:16-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/load.c - sntp/libopts/load.c@1.1, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +563 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/load.c - - sntp/libopts/load.c@1.0, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/load.c@1.1, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +563 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/load.c - - libopts/load.c@1.0, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-makeshell.c@1.12, 2007-04-13 18:59:06-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/makeshell.c BitKeeper/deleted/.del-makeshell.c~4fcd12fc31c0a4a4@1.9, 2007-04-13 19:06:18-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/makeshell.c - sntp/libopts/makeshell.c@1.1, 2007-04-13 19:08:56-04:00, stenn@whimsy.udel.edu +1122 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/makeshell.c - - sntp/libopts/makeshell.c@1.0, 2007-04-13 19:08:56-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/makeshell.c@1.1, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +1122 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/makeshell.c - - libopts/makeshell.c@1.0, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-nested.c@1.10, 2007-04-13 18:59:07-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/nested.c - sntp/libopts/nested.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +733 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/nested.c - - sntp/libopts/nested.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-nested.c~85346d5d12098689@1.7, 2007-04-13 19:06:19-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/nested.c - libopts/nested.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +733 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/nested.c - - libopts/nested.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-numeric.c@1.10, 2007-04-13 18:59:08-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/numeric.c BitKeeper/deleted/.del-numeric.c~cdb7deb5cf6f27c2@1.7, 2007-04-13 19:06:21-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/numeric.c - sntp/libopts/numeric.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +93 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/numeric.c - - sntp/libopts/numeric.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/numeric.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +93 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/numeric.c - - libopts/numeric.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-options.h@1.11, 2007-04-13 19:04:44-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/autoopts/options.h - sntp/libopts/autoopts/options.h@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +964 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts/options.h - - sntp/libopts/autoopts/options.h@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-options.h~6eb465cb95a56bee@1.8, 2007-04-13 19:06:45-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/autoopts/options.h - libopts/autoopts/options.h@1.1, 2007-04-13 19:10:30-04:00, stenn@whimsy.udel.edu +964 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts/options.h - - libopts/autoopts/options.h@1.0, 2007-04-13 19:10:30-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-pathfind.c@1.10, 2007-04-13 19:04:49-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/compat/pathfind.c - sntp/libopts/compat/pathfind.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +339 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/pathfind.c - - sntp/libopts/compat/pathfind.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-pathfind.c~a0863179d884d4a4@1.7, 2007-04-13 19:06:51-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/compat/pathfind.c - libopts/compat/pathfind.c@1.1, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +339 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/pathfind.c - - libopts/compat/pathfind.c@1.0, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-pgusage.c@1.10, 2007-04-13 18:59:09-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/pgusage.c - sntp/libopts/pgusage.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +157 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/pgusage.c - - sntp/libopts/pgusage.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/pgusage.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +157 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/pgusage.c - - libopts/pgusage.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-pgusage.c~d981c42eb301cfdd@1.6, 2007-04-13 19:06:22-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/pgusage.c BitKeeper/deleted/.del-proto.h@1.12, 2007-04-13 18:59:11-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/proto.h - sntp/libopts/proto.h@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +91 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/proto.h - - sntp/libopts/proto.h@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/proto.h@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +91 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/proto.h - - libopts/proto.h@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-proto.h~fa076f6dd9d0667e@1.9, 2007-04-13 19:06:23-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/proto.h @@ -3331,109 +4795,39 @@ ChangeSet@1.1474, 2007-04-14 01:11:33-04:00, stenn@whimsy.udel.edu +166 -0 BitKeeper/deleted/.del-putshell.c~24959f5e1ba688e6@1.8, 2007-04-13 19:06:24-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/putshell.c - sntp/libopts/putshell.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +335 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/putshell.c - - sntp/libopts/putshell.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/putshell.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +335 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/putshell.c - - libopts/putshell.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-restore.c@1.10, 2007-04-13 18:59:13-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/restore.c - sntp/libopts/restore.c@1.1, 2007-04-13 19:08:58-04:00, stenn@whimsy.udel.edu +250 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/restore.c - - sntp/libopts/restore.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/restore.c@1.1, 2007-04-13 19:10:13-04:00, stenn@whimsy.udel.edu +250 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/restore.c - - libopts/restore.c@1.0, 2007-04-13 19:10:13-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-restore.c~eada4acbf21cd8bf@1.6, 2007-04-13 19:06:26-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/restore.c BitKeeper/deleted/.del-save.c@1.11, 2007-04-13 18:59:15-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/save.c - libopts/save.c@1.1, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +512 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/save.c - - libopts/save.c@1.0, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-save.c~a29f5bd429a568bb@1.8, 2007-04-13 19:06:27-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/save.c - sntp/libopts/save.c@1.1, 2007-04-13 19:08:58-04:00, stenn@whimsy.udel.edu +512 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/save.c - - sntp/libopts/save.c@1.0, 2007-04-13 19:08:58-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-snprintf.c@1.5, 2007-04-13 19:04:50-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/compat/snprintf.c - libopts/compat/snprintf.c@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +60 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/snprintf.c - - libopts/compat/snprintf.c@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-snprintf.c~66578c716014cd3d@1.4, 2007-04-13 19:06:52-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/compat/snprintf.c - sntp/libopts/compat/snprintf.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +60 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/snprintf.c - - sntp/libopts/compat/snprintf.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-sort.c@1.9, 2007-04-13 18:59:16-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/sort.c - sntp/libopts/sort.c@1.1, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +359 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/sort.c - - sntp/libopts/sort.c@1.0, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/sort.c@1.1, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +359 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/sort.c - - libopts/sort.c@1.0, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-sort.c~bec5a7fb6a01a5dc@1.5, 2007-04-13 19:06:28-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/sort.c BitKeeper/deleted/.del-stack.c@1.11, 2007-04-13 18:59:17-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/stack.c - sntp/libopts/stack.c@1.1, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +269 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/stack.c - - sntp/libopts/stack.c@1.0, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/stack.c@1.1, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +269 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/stack.c - - libopts/stack.c@1.0, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-stack.c~e817b57b18b315c1@1.8, 2007-04-13 19:06:29-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/stack.c BitKeeper/deleted/.del-strchr.c@1.4, 2007-04-13 19:04:51-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/compat/strchr.c - sntp/libopts/compat/strchr.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +60 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/strchr.c - - sntp/libopts/compat/strchr.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/compat/strchr.c@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +60 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/strchr.c - - libopts/compat/strchr.c@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-strchr.c~80e88afbe7e2209a@1.4, 2007-04-13 19:06:53-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/compat/strchr.c @@ -3443,127 +4837,457 @@ ChangeSet@1.1474, 2007-04-14 01:11:33-04:00, stenn@whimsy.udel.edu +166 -0 BitKeeper/deleted/.del-strdup.c~1f262be5e55c3c4a@1.3, 2007-04-13 19:06:54-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/compat/strdup.c - sntp/libopts/compat/strdup.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +19 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/strdup.c - - sntp/libopts/compat/strdup.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/compat/strdup.c@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +19 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/strdup.c - - libopts/compat/strdup.c@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-streqvcmp.c@1.10, 2007-04-13 18:59:19-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/streqvcmp.c BitKeeper/deleted/.del-streqvcmp.c~66420c6082b06827@1.7, 2007-04-13 19:06:31-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/streqvcmp.c - libopts/streqvcmp.c@1.1, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +289 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/streqvcmp.c - - libopts/streqvcmp.c@1.0, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +0 -0 - - sntp/libopts/streqvcmp.c@1.1, 2007-04-13 19:09:00-04:00, stenn@whimsy.udel.edu +289 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/streqvcmp.c - - sntp/libopts/streqvcmp.c@1.0, 2007-04-13 19:09:00-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-text_mmap.c@1.9, 2007-04-13 18:59:20-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/text_mmap.c - libopts/text_mmap.c@1.1, 2007-04-13 19:10:16-04:00, stenn@whimsy.udel.edu +363 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/text_mmap.c - - libopts/text_mmap.c@1.0, 2007-04-13 19:10:16-04:00, stenn@whimsy.udel.edu +0 -0 - - sntp/libopts/text_mmap.c@1.1, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +363 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/text_mmap.c - - sntp/libopts/text_mmap.c@1.0, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-text_mmap.c~f1915a52b87816ba@1.6, 2007-04-13 19:06:32-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/text_mmap.c BitKeeper/deleted/.del-tokenize.c@1.6, 2007-04-13 18:59:21-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/tokenize.c - sntp/libopts/tokenize.c@1.1, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +321 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/tokenize.c - - sntp/libopts/tokenize.c@1.0, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/tokenize.c@1.1, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +321 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/tokenize.c - - libopts/tokenize.c@1.0, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-tokenize.c~ae2f23dbb2bee589@1.5, 2007-04-13 19:06:33-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/tokenize.c BitKeeper/deleted/.del-usage-txt.h@1.10, 2007-04-13 19:04:46-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/autoopts/usage-txt.h - libopts/autoopts/usage-txt.h@1.1, 2007-04-13 19:10:31-04:00, stenn@whimsy.udel.edu +355 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts/usage-txt.h - - libopts/autoopts/usage-txt.h@1.0, 2007-04-13 19:10:31-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-usage-txt.h~6ce4dce87430d1b@1.7, 2007-04-13 19:06:47-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/autoopts/usage-txt.h - sntp/libopts/autoopts/usage-txt.h@1.1, 2007-04-13 19:08:49-04:00, stenn@whimsy.udel.edu +355 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts/usage-txt.h - - sntp/libopts/autoopts/usage-txt.h@1.0, 2007-04-13 19:08:49-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-usage.c@1.10, 2007-04-13 18:59:22-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/usage.c BitKeeper/deleted/.del-usage.c~c868ef1e661a6eb1@1.8, 2007-04-13 19:06:34-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/usage.c - sntp/libopts/usage.c@1.1, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +731 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/usage.c - - sntp/libopts/usage.c@1.0, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +0 -0 - - libopts/usage.c@1.1, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +731 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/usage.c - - libopts/usage.c@1.0, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-version.c@1.10, 2007-04-13 18:59:24-04:00, stenn@whimsy.udel.edu +0 -0 Delete: libopts/version.c BitKeeper/deleted/.del-version.c~a426e6b58b20d06@1.7, 2007-04-13 19:06:35-04:00, stenn@whimsy.udel.edu +0 -0 Delete: sntp/libopts/version.c - sntp/libopts/version.c@1.1, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +176 -0 - BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/version.c + BitKeeper/deleted/.del-windows-config.h@1.6, 2007-04-13 19:04:53-04:00, stenn@whimsy.udel.edu +0 -0 + Delete: libopts/compat/windows-config.h - sntp/libopts/version.c@1.0, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +0 -0 + BitKeeper/deleted/.del-windows-config.h~36f7ad2ccf764ad2@1.4, 2007-04-13 19:06:56-04:00, stenn@whimsy.udel.edu +0 -0 + Delete: sntp/libopts/compat/windows-config.h + + libopts/COPYING.lgpl@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +502 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/COPYING.lgpl + + libopts/COPYING.lgpl@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/COPYING.mbsd@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +26 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/COPYING.mbsd + + libopts/COPYING.mbsd@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/MakeDefs.inc@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/MakeDefs.inc + + libopts/MakeDefs.inc@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/Makefile.am@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +24 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/Makefile.am + + libopts/Makefile.am@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/README@1.1, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +93 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/README + + libopts/README@1.0, 2007-04-13 19:10:05-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/autoopts.c@1.1, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +1101 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts.c + + libopts/autoopts.c@1.0, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/autoopts.h@1.1, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +377 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts.h + + libopts/autoopts.h@1.0, 2007-04-13 19:10:06-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/autoopts/options.h@1.1, 2007-04-13 19:10:30-04:00, stenn@whimsy.udel.edu +964 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts/options.h + + libopts/autoopts/options.h@1.0, 2007-04-13 19:10:30-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/autoopts/usage-txt.h@1.1, 2007-04-13 19:10:31-04:00, stenn@whimsy.udel.edu +355 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/autoopts/usage-txt.h + + libopts/autoopts/usage-txt.h@1.0, 2007-04-13 19:10:31-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/boolean.c@1.1, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +106 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/boolean.c + + libopts/boolean.c@1.0, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/compat/compat.h@1.1, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +314 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/compat.h + + libopts/compat/compat.h@1.0, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/compat/pathfind.c@1.1, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +339 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/pathfind.c + + libopts/compat/pathfind.c@1.0, 2007-04-13 19:10:38-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/compat/snprintf.c@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +60 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/snprintf.c + + libopts/compat/snprintf.c@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/compat/strchr.c@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +60 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/strchr.c + + libopts/compat/strchr.c@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/compat/strdup.c@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +19 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/strdup.c + + libopts/compat/strdup.c@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/compat/windows-config.h@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +129 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/windows-config.h + + libopts/compat/windows-config.h@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/configfile.c@1.1, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +1288 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/configfile.c + + libopts/configfile.c@1.0, 2007-04-13 19:10:07-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/cook.c@1.1, 2007-04-13 19:10:08-04:00, stenn@whimsy.udel.edu +354 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/cook.c + + libopts/cook.c@1.0, 2007-04-13 19:10:08-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/enumeration.c@1.1, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +498 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/enumeration.c + + libopts/enumeration.c@1.0, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/environment.c@1.1, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +260 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/environment.c + + libopts/environment.c@1.0, 2007-04-13 19:10:09-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/genshell.c@1.1, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +345 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/genshell.c + + libopts/genshell.c@1.0, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/genshell.h@1.1, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +149 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/genshell.h + + libopts/genshell.h@1.0, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/libopts.c@1.1, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +30 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/libopts.c + + libopts/libopts.c@1.0, 2007-04-13 19:10:10-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/load.c@1.1, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +563 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/load.c + + libopts/load.c@1.0, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/m4/libopts.m4@1.1, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +489 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/m4/libopts.m4 + + libopts/m4/libopts.m4@1.0, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/m4/liboptschk.m4@1.1, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +42 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/m4/liboptschk.m4 + + libopts/m4/liboptschk.m4@1.0, 2007-04-13 19:10:43-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/makeshell.c@1.1, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +1122 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/makeshell.c + + libopts/makeshell.c@1.0, 2007-04-13 19:10:11-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/nested.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +733 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/nested.c + + libopts/nested.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/numeric.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +93 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/numeric.c + + libopts/numeric.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/pgusage.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +157 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/pgusage.c + + libopts/pgusage.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/proto.h@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +91 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/proto.h + + libopts/proto.h@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/putshell.c@1.1, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +335 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/putshell.c + + libopts/putshell.c@1.0, 2007-04-13 19:10:12-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/restore.c@1.1, 2007-04-13 19:10:13-04:00, stenn@whimsy.udel.edu +250 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/restore.c + + libopts/restore.c@1.0, 2007-04-13 19:10:13-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/save.c@1.1, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +512 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/save.c + + libopts/save.c@1.0, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/sort.c@1.1, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +359 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/sort.c + + libopts/sort.c@1.0, 2007-04-13 19:10:14-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/stack.c@1.1, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +269 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/stack.c + + libopts/stack.c@1.0, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/streqvcmp.c@1.1, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +289 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/streqvcmp.c + + libopts/streqvcmp.c@1.0, 2007-04-13 19:10:15-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/text_mmap.c@1.1, 2007-04-13 19:10:16-04:00, stenn@whimsy.udel.edu +363 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/text_mmap.c + + libopts/text_mmap.c@1.0, 2007-04-13 19:10:16-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/tokenize.c@1.1, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +321 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/tokenize.c + + libopts/tokenize.c@1.0, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +0 -0 + + libopts/usage.c@1.1, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +731 -0 + BitKeeper file /deacon/backroom/ntp-stable/libopts/usage.c + + libopts/usage.c@1.0, 2007-04-13 19:10:17-04:00, stenn@whimsy.udel.edu +0 -0 libopts/version.c@1.1, 2007-04-13 19:10:18-04:00, stenn@whimsy.udel.edu +176 -0 BitKeeper file /deacon/backroom/ntp-stable/libopts/version.c libopts/version.c@1.0, 2007-04-13 19:10:18-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-windows-config.h@1.6, 2007-04-13 19:04:53-04:00, stenn@whimsy.udel.edu +0 -0 - Delete: libopts/compat/windows-config.h + sntp/libopts/COPYING.lgpl@1.1, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +502 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/COPYING.lgpl + + sntp/libopts/COPYING.lgpl@1.0, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/COPYING.mbsd@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +26 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/COPYING.mbsd + + sntp/libopts/COPYING.mbsd@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/MakeDefs.inc@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/MakeDefs.inc + + sntp/libopts/MakeDefs.inc@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/Makefile.am@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +24 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/Makefile.am + + sntp/libopts/Makefile.am@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/README@1.1, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +93 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/README + + sntp/libopts/README@1.0, 2007-04-13 19:09:03-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/autoopts.c@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +1101 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts.c + + sntp/libopts/autoopts.c@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/autoopts.h@1.1, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +377 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts.h + + sntp/libopts/autoopts.h@1.0, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/autoopts/options.h@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +964 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts/options.h + + sntp/libopts/autoopts/options.h@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/autoopts/usage-txt.h@1.1, 2007-04-13 19:08:49-04:00, stenn@whimsy.udel.edu +355 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/autoopts/usage-txt.h + + sntp/libopts/autoopts/usage-txt.h@1.0, 2007-04-13 19:08:49-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/boolean.c@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +106 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/boolean.c + + sntp/libopts/boolean.c@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/compat/compat.h@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +314 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/compat.h + + sntp/libopts/compat/compat.h@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/compat/pathfind.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +339 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/pathfind.c + + sntp/libopts/compat/pathfind.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/compat/snprintf.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +60 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/snprintf.c + + sntp/libopts/compat/snprintf.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/compat/strchr.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +60 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/strchr.c + + sntp/libopts/compat/strchr.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/compat/strdup.c@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +19 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/strdup.c + + sntp/libopts/compat/strdup.c@1.0, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +0 -0 sntp/libopts/compat/windows-config.h@1.1, 2007-04-13 19:08:48-04:00, stenn@whimsy.udel.edu +129 -0 BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/compat/windows-config.h sntp/libopts/compat/windows-config.h@1.0, 2007-04-13 19:08:47-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper/deleted/.del-windows-config.h~36f7ad2ccf764ad2@1.4, 2007-04-13 19:06:56-04:00, stenn@whimsy.udel.edu +0 -0 - Delete: sntp/libopts/compat/windows-config.h + sntp/libopts/configfile.c@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +1288 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/configfile.c - libopts/compat/windows-config.h@1.1, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +129 -0 - BitKeeper file /deacon/backroom/ntp-stable/libopts/compat/windows-config.h + sntp/libopts/configfile.c@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 - libopts/compat/windows-config.h@1.0, 2007-04-13 19:10:39-04:00, stenn@whimsy.udel.edu +0 -0 + sntp/libopts/cook.c@1.1, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +354 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/cook.c + + sntp/libopts/cook.c@1.0, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/enumeration.c@1.1, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +498 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/enumeration.c + + sntp/libopts/enumeration.c@1.0, 2007-04-13 19:08:53-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/environment.c@1.1, 2007-04-13 19:08:54-04:00, stenn@whimsy.udel.edu +260 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/environment.c + + sntp/libopts/environment.c@1.0, 2007-04-13 19:08:54-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/genshell.c@1.1, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +345 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/genshell.c + + sntp/libopts/genshell.c@1.0, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/genshell.h@1.1, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +149 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/genshell.h + + sntp/libopts/genshell.h@1.0, 2007-04-13 19:08:51-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/libopts.c@1.1, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +30 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/libopts.c + + sntp/libopts/libopts.c@1.0, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/load.c@1.1, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +563 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/load.c + + sntp/libopts/load.c@1.0, 2007-04-13 19:08:55-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/m4/libopts.m4@1.1, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +489 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/m4/libopts.m4 + + sntp/libopts/m4/libopts.m4@1.0, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/m4/liboptschk.m4@1.1, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +42 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/m4/liboptschk.m4 + + sntp/libopts/m4/liboptschk.m4@1.0, 2007-04-13 19:08:50-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/makeshell.c@1.1, 2007-04-13 19:08:56-04:00, stenn@whimsy.udel.edu +1122 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/makeshell.c + + sntp/libopts/makeshell.c@1.0, 2007-04-13 19:08:56-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/nested.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +733 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/nested.c + + sntp/libopts/nested.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/numeric.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +93 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/numeric.c + + sntp/libopts/numeric.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/pgusage.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +157 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/pgusage.c + + sntp/libopts/pgusage.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/proto.h@1.1, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +91 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/proto.h + + sntp/libopts/proto.h@1.0, 2007-04-13 19:08:52-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/putshell.c@1.1, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +335 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/putshell.c + + sntp/libopts/putshell.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/restore.c@1.1, 2007-04-13 19:08:58-04:00, stenn@whimsy.udel.edu +250 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/restore.c + + sntp/libopts/restore.c@1.0, 2007-04-13 19:08:57-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/save.c@1.1, 2007-04-13 19:08:58-04:00, stenn@whimsy.udel.edu +512 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/save.c + + sntp/libopts/save.c@1.0, 2007-04-13 19:08:58-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/sort.c@1.1, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +359 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/sort.c + + sntp/libopts/sort.c@1.0, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/stack.c@1.1, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +269 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/stack.c + + sntp/libopts/stack.c@1.0, 2007-04-13 19:08:59-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/streqvcmp.c@1.1, 2007-04-13 19:09:00-04:00, stenn@whimsy.udel.edu +289 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/streqvcmp.c + + sntp/libopts/streqvcmp.c@1.0, 2007-04-13 19:09:00-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/text_mmap.c@1.1, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +363 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/text_mmap.c + + sntp/libopts/text_mmap.c@1.0, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/tokenize.c@1.1, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +321 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/tokenize.c + + sntp/libopts/tokenize.c@1.0, 2007-04-13 19:09:01-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/usage.c@1.1, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +731 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/usage.c + + sntp/libopts/usage.c@1.0, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +0 -0 + + sntp/libopts/version.c@1.1, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +176 -0 + BitKeeper file /deacon/backroom/ntp-stable/sntp/libopts/version.c + + sntp/libopts/version.c@1.0, 2007-04-13 19:09:02-04:00, stenn@whimsy.udel.edu +0 -0 ChangeSet@1.1473, 2007-04-12 06:32:19-04:00, stenn@whimsy.udel.edu +1 -0 Added ntp2 mirror @@ -5911,189 +7635,189 @@ ChangeSet@1.1379.1.44, 2006-10-12 22:42:48-04:00, stenn@whimsy.udel.edu +62 -0 libopts/autoopts.c@1.10, 2006-10-12 22:41:36-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/autoopts.c@1.7, 2006-10-12 22:41:36-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/autoopts.h@1.9, 2006-10-12 22:41:37-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/autoopts.h@1.7, 2006-10-12 22:41:38-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/boolean.c@1.8, 2006-10-12 22:41:39-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/boolean.c@1.5, 2006-10-12 22:41:39-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/compat/compat.h@1.12, 2006-10-12 22:41:39-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/compat/compat.h@1.8, 2006-10-12 22:41:40-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/configfile.c@1.10, 2006-10-12 22:41:44-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/configfile.c@1.7, 2006-10-12 22:41:45-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/cook.c@1.9, 2006-10-12 22:41:46-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/cook.c@1.6, 2006-10-12 22:41:47-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/enumeration.c@1.9, 2006-10-12 22:41:47-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/enumeration.c@1.6, 2006-10-12 22:41:48-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/environment.c@1.8, 2006-10-12 22:41:48-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/environment.c@1.5, 2006-10-12 22:41:49-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/genshell.c@1.9, 2006-10-12 22:41:50-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/genshell.c@1.6, 2006-10-12 22:41:50-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/genshell.h@1.9, 2006-10-12 22:41:51-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/genshell.h@1.6, 2006-10-12 22:41:52-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/m4/libopts.m4@1.14, 2006-10-12 22:41:54-04:00, stenn@whimsy.udel.edu +2 -2 - autogen-5.8.7 upgrade - - sntp/libopts/m4/libopts.m4@1.11, 2006-10-12 22:41:55-04:00, stenn@whimsy.udel.edu +2 -2 - autogen-5.8.7 upgrade - - libopts/m4/liboptschk.m4@1.3, 2006-10-12 22:41:55-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/m4/liboptschk.m4@1.3, 2006-10-12 22:41:56-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/load.c@1.10, 2006-10-12 22:41:52-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/load.c@1.7, 2006-10-12 22:41:54-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/makeshell.c@1.11, 2006-10-12 22:41:56-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/makeshell.c@1.8, 2006-10-12 22:41:57-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/nested.c@1.9, 2006-10-12 22:41:58-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/nested.c@1.6, 2006-10-12 22:41:59-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/numeric.c@1.9, 2006-10-12 22:41:59-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/numeric.c@1.6, 2006-10-12 22:42:00-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/autoopts/options.h@1.10, 2006-10-12 22:41:33-04:00, stenn@whimsy.udel.edu +2 -2 autogen-5.8.7 upgrade - sntp/libopts/autoopts/options.h@1.7, 2006-10-12 22:41:33-04:00, stenn@whimsy.udel.edu +2 -2 + libopts/autoopts/usage-txt.h@1.9, 2006-10-12 22:41:34-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/boolean.c@1.8, 2006-10-12 22:41:39-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/compat/compat.h@1.12, 2006-10-12 22:41:39-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade libopts/compat/pathfind.c@1.9, 2006-10-12 22:41:41-04:00, stenn@whimsy.udel.edu +2 -3 autogen-5.8.7 upgrade - sntp/libopts/compat/pathfind.c@1.6, 2006-10-12 22:41:42-04:00, stenn@whimsy.udel.edu +2 -3 + libopts/compat/windows-config.h@1.5, 2006-10-12 22:41:43-04:00, stenn@whimsy.udel.edu +8 -2 + autogen-5.8.7 upgrade + + libopts/configfile.c@1.10, 2006-10-12 22:41:44-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/cook.c@1.9, 2006-10-12 22:41:46-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/enumeration.c@1.9, 2006-10-12 22:41:47-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/environment.c@1.8, 2006-10-12 22:41:48-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/genshell.c@1.9, 2006-10-12 22:41:50-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/genshell.h@1.9, 2006-10-12 22:41:51-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/load.c@1.10, 2006-10-12 22:41:52-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/m4/libopts.m4@1.14, 2006-10-12 22:41:54-04:00, stenn@whimsy.udel.edu +2 -2 + autogen-5.8.7 upgrade + + libopts/m4/liboptschk.m4@1.3, 2006-10-12 22:41:55-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/makeshell.c@1.11, 2006-10-12 22:41:56-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/nested.c@1.9, 2006-10-12 22:41:58-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + libopts/numeric.c@1.9, 2006-10-12 22:41:59-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade libopts/pgusage.c@1.9, 2006-10-12 22:42:00-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/pgusage.c@1.5, 2006-10-12 22:42:00-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/proto.h@1.11, 2006-10-12 22:42:01-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/proto.h@1.8, 2006-10-12 22:42:01-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/putshell.c@1.10, 2006-10-12 22:42:01-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/putshell.c@1.7, 2006-10-12 22:42:02-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/restore.c@1.9, 2006-10-12 22:42:03-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/restore.c@1.5, 2006-10-12 22:42:04-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/save.c@1.10, 2006-10-12 22:42:05-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/save.c@1.7, 2006-10-12 22:42:06-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/sort.c@1.8, 2006-10-12 22:42:07-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/sort.c@1.4, 2006-10-12 22:42:07-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/stack.c@1.10, 2006-10-12 22:42:08-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/stack.c@1.7, 2006-10-12 22:42:09-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/streqvcmp.c@1.9, 2006-10-12 22:42:10-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/streqvcmp.c@1.6, 2006-10-12 22:42:10-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/text_mmap.c@1.8, 2006-10-12 22:42:11-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/text_mmap.c@1.5, 2006-10-12 22:42:12-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - libopts/autoopts/usage-txt.h@1.9, 2006-10-12 22:41:34-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - - sntp/libopts/autoopts/usage-txt.h@1.6, 2006-10-12 22:41:35-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/usage.c@1.9, 2006-10-12 22:42:13-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/usage.c@1.7, 2006-10-12 22:42:14-04:00, stenn@whimsy.udel.edu +1 -1 - autogen-5.8.7 upgrade - libopts/version.c@1.9, 2006-10-12 22:42:15-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - sntp/libopts/version.c@1.6, 2006-10-12 22:42:15-04:00, stenn@whimsy.udel.edu +1 -1 + sntp/libopts/autoopts.c@1.7, 2006-10-12 22:41:36-04:00, stenn@whimsy.udel.edu +1 -1 autogen-5.8.7 upgrade - libopts/compat/windows-config.h@1.5, 2006-10-12 22:41:43-04:00, stenn@whimsy.udel.edu +8 -2 + sntp/libopts/autoopts.h@1.7, 2006-10-12 22:41:38-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/autoopts/options.h@1.7, 2006-10-12 22:41:33-04:00, stenn@whimsy.udel.edu +2 -2 + autogen-5.8.7 upgrade + + sntp/libopts/autoopts/usage-txt.h@1.6, 2006-10-12 22:41:35-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/boolean.c@1.5, 2006-10-12 22:41:39-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/compat/compat.h@1.8, 2006-10-12 22:41:40-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/compat/pathfind.c@1.6, 2006-10-12 22:41:42-04:00, stenn@whimsy.udel.edu +2 -3 autogen-5.8.7 upgrade sntp/libopts/compat/windows-config.h@1.3, 2006-10-12 22:41:43-04:00, stenn@whimsy.udel.edu +8 -2 autogen-5.8.7 upgrade + sntp/libopts/configfile.c@1.7, 2006-10-12 22:41:45-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/cook.c@1.6, 2006-10-12 22:41:47-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/enumeration.c@1.6, 2006-10-12 22:41:48-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/environment.c@1.5, 2006-10-12 22:41:49-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/genshell.c@1.6, 2006-10-12 22:41:50-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/genshell.h@1.6, 2006-10-12 22:41:52-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/load.c@1.7, 2006-10-12 22:41:54-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/m4/libopts.m4@1.11, 2006-10-12 22:41:55-04:00, stenn@whimsy.udel.edu +2 -2 + autogen-5.8.7 upgrade + + sntp/libopts/m4/liboptschk.m4@1.3, 2006-10-12 22:41:56-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/makeshell.c@1.8, 2006-10-12 22:41:57-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/nested.c@1.6, 2006-10-12 22:41:59-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/numeric.c@1.6, 2006-10-12 22:42:00-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/pgusage.c@1.5, 2006-10-12 22:42:00-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/proto.h@1.8, 2006-10-12 22:42:01-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/putshell.c@1.7, 2006-10-12 22:42:02-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/restore.c@1.5, 2006-10-12 22:42:04-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/save.c@1.7, 2006-10-12 22:42:06-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/sort.c@1.4, 2006-10-12 22:42:07-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/stack.c@1.7, 2006-10-12 22:42:09-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/streqvcmp.c@1.6, 2006-10-12 22:42:10-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/text_mmap.c@1.5, 2006-10-12 22:42:12-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/usage.c@1.7, 2006-10-12 22:42:14-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + + sntp/libopts/version.c@1.6, 2006-10-12 22:42:15-04:00, stenn@whimsy.udel.edu +1 -1 + autogen-5.8.7 upgrade + ChangeSet@1.1379.1.43, 2006-10-12 19:22:09-04:00, stenn@whimsy.udel.edu +1 -0 Improve the getsockname() arg determination @@ -6561,124 +8285,67 @@ ChangeSet@1.1379.1.31, 2006-10-08 19:39:10-04:00, stenn@whimsy.udel.edu +25 -0 ChangeSet@1.1379.1.30, 2006-10-08 04:32:17-04:00, stenn@whimsy.udel.edu +53 -0 libopts-27.5.3 - libopts/Makefile.am@1.6, 2006-10-08 04:30:43-04:00, stenn@whimsy.udel.edu +1 -1 + clockstuff/clktest-opts.c@1.7, 2006-10-08 04:30:41-04:00, stenn@whimsy.udel.edu +9 -7 libopts-27.5.3 - sntp/libopts/Makefile.am@1.4, 2006-10-08 04:31:07-04:00, stenn@whimsy.udel.edu +10 -6 + clockstuff/clktest-opts.h@1.7, 2006-10-08 04:30:42-04:00, stenn@whimsy.udel.edu +6 -4 + libopts-27.5.3 + + libopts/Makefile.am@1.6, 2006-10-08 04:30:43-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.5.3 libopts/autoopts.c@1.9, 2006-10-08 04:30:43-04:00, stenn@whimsy.udel.edu +8 -6 libopts-27.5.3 - sntp/libopts/autoopts.c@1.6, 2006-10-08 04:31:07-04:00, stenn@whimsy.udel.edu +8 -6 - libopts-27.5.3 - - libopts/configfile.c@1.9, 2006-10-08 04:30:44-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - sntp/libopts/configfile.c@1.6, 2006-10-08 04:31:08-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - libopts/cook.c@1.8, 2006-10-08 04:30:45-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - sntp/libopts/cook.c@1.5, 2006-10-08 04:31:09-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - libopts/enumeration.c@1.8, 2006-10-08 04:30:46-04:00, stenn@whimsy.udel.edu +4 -4 - libopts-27.5.3 - - sntp/libopts/enumeration.c@1.5, 2006-10-08 04:31:09-04:00, stenn@whimsy.udel.edu +4 -4 - libopts-27.5.3 - - libopts/genshell.c@1.8, 2006-10-08 04:30:47-04:00, stenn@whimsy.udel.edu +3 -1 - libopts-27.5.3 - - sntp/libopts/genshell.c@1.5, 2006-10-08 04:31:10-04:00, stenn@whimsy.udel.edu +3 -1 - libopts-27.5.3 - - libopts/genshell.h@1.8, 2006-10-08 04:30:48-04:00, stenn@whimsy.udel.edu +5 -3 - libopts-27.5.3 - - sntp/libopts/genshell.h@1.5, 2006-10-08 04:31:11-04:00, stenn@whimsy.udel.edu +5 -3 - libopts-27.5.3 - - libopts/m4/libopts.m4@1.13, 2006-10-08 04:30:56-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - sntp/libopts/m4/libopts.m4@1.10, 2006-10-08 04:31:20-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - libopts/load.c@1.9, 2006-10-08 04:30:48-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - sntp/libopts/load.c@1.6, 2006-10-08 04:31:11-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - libopts/makeshell.c@1.10, 2006-10-08 04:30:50-04:00, stenn@whimsy.udel.edu +13 -4 - libopts-27.5.3 - - sntp/libopts/makeshell.c@1.7, 2006-10-08 04:31:12-04:00, stenn@whimsy.udel.edu +13 -4 - libopts-27.5.3 - - libopts/nested.c@1.8, 2006-10-08 04:30:50-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - sntp/libopts/nested.c@1.5, 2006-10-08 04:31:13-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - libopts/numeric.c@1.8, 2006-10-08 04:30:51-04:00, stenn@whimsy.udel.edu +4 -4 - libopts-27.5.3 - - sntp/libopts/numeric.c@1.5, 2006-10-08 04:31:14-04:00, stenn@whimsy.udel.edu +4 -4 - libopts-27.5.3 - libopts/autoopts/options.h@1.9, 2006-10-08 04:30:55-04:00, stenn@whimsy.udel.edu +131 -64 libopts-27.5.3 - sntp/libopts/autoopts/options.h@1.6, 2006-10-08 04:31:18-04:00, stenn@whimsy.udel.edu +131 -64 - libopts-27.5.3 - - libopts/proto.h@1.10, 2006-10-08 04:30:51-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - sntp/libopts/proto.h@1.7, 2006-10-08 04:31:14-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.5.3 - - libopts/putshell.c@1.9, 2006-10-08 04:30:51-04:00, stenn@whimsy.udel.edu +8 -8 - libopts-27.5.3 - - sntp/libopts/putshell.c@1.6, 2006-10-08 04:31:15-04:00, stenn@whimsy.udel.edu +8 -8 - libopts-27.5.3 - - libopts/restore.c@1.8, 2006-10-08 04:30:52-04:00, stenn@whimsy.udel.edu +2 -2 - libopts-27.5.3 - - sntp/libopts/restore.c@1.4, 2006-10-08 04:31:15-04:00, stenn@whimsy.udel.edu +2 -2 - libopts-27.5.3 - - libopts/save.c@1.9, 2006-10-08 04:30:53-04:00, stenn@whimsy.udel.edu +7 -8 - libopts-27.5.3 - - sntp/libopts/save.c@1.6, 2006-10-08 04:31:16-04:00, stenn@whimsy.udel.edu +7 -8 - libopts-27.5.3 - - libopts/stack.c@1.9, 2006-10-08 04:30:54-04:00, stenn@whimsy.udel.edu +3 -3 - libopts-27.5.3 - - sntp/libopts/stack.c@1.6, 2006-10-08 04:31:17-04:00, stenn@whimsy.udel.edu +3 -3 - libopts-27.5.3 - libopts/autoopts/usage-txt.h@1.8, 2006-10-08 04:30:56-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.5.3 - sntp/libopts/autoopts/usage-txt.h@1.5, 2006-10-08 04:31:18-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/configfile.c@1.9, 2006-10-08 04:30:44-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.5.3 - clockstuff/clktest-opts.c@1.7, 2006-10-08 04:30:41-04:00, stenn@whimsy.udel.edu +9 -7 + libopts/cook.c@1.8, 2006-10-08 04:30:45-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.5.3 - clockstuff/clktest-opts.h@1.7, 2006-10-08 04:30:42-04:00, stenn@whimsy.udel.edu +6 -4 + libopts/enumeration.c@1.8, 2006-10-08 04:30:46-04:00, stenn@whimsy.udel.edu +4 -4 + libopts-27.5.3 + + libopts/genshell.c@1.8, 2006-10-08 04:30:47-04:00, stenn@whimsy.udel.edu +3 -1 + libopts-27.5.3 + + libopts/genshell.h@1.8, 2006-10-08 04:30:48-04:00, stenn@whimsy.udel.edu +5 -3 + libopts-27.5.3 + + libopts/load.c@1.9, 2006-10-08 04:30:48-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + libopts/m4/libopts.m4@1.13, 2006-10-08 04:30:56-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + libopts/makeshell.c@1.10, 2006-10-08 04:30:50-04:00, stenn@whimsy.udel.edu +13 -4 + libopts-27.5.3 + + libopts/nested.c@1.8, 2006-10-08 04:30:50-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + libopts/numeric.c@1.8, 2006-10-08 04:30:51-04:00, stenn@whimsy.udel.edu +4 -4 + libopts-27.5.3 + + libopts/proto.h@1.10, 2006-10-08 04:30:51-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + libopts/putshell.c@1.9, 2006-10-08 04:30:51-04:00, stenn@whimsy.udel.edu +8 -8 + libopts-27.5.3 + + libopts/restore.c@1.8, 2006-10-08 04:30:52-04:00, stenn@whimsy.udel.edu +2 -2 + libopts-27.5.3 + + libopts/save.c@1.9, 2006-10-08 04:30:53-04:00, stenn@whimsy.udel.edu +7 -8 + libopts-27.5.3 + + libopts/stack.c@1.9, 2006-10-08 04:30:54-04:00, stenn@whimsy.udel.edu +3 -3 libopts-27.5.3 ntpd/ntpd-opts.c@1.28, 2006-10-08 04:30:57-04:00, stenn@whimsy.udel.edu +3 -1 @@ -6708,6 +8375,63 @@ ChangeSet@1.1379.1.30, 2006-10-08 04:32:17-04:00, stenn@whimsy.udel.edu +53 -0 ntpq/ntpq-opts.texi@1.28, 2006-10-08 04:31:04-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.5.3 + sntp/libopts/Makefile.am@1.4, 2006-10-08 04:31:07-04:00, stenn@whimsy.udel.edu +10 -6 + libopts-27.5.3 + + sntp/libopts/autoopts.c@1.6, 2006-10-08 04:31:07-04:00, stenn@whimsy.udel.edu +8 -6 + libopts-27.5.3 + + sntp/libopts/autoopts/options.h@1.6, 2006-10-08 04:31:18-04:00, stenn@whimsy.udel.edu +131 -64 + libopts-27.5.3 + + sntp/libopts/autoopts/usage-txt.h@1.5, 2006-10-08 04:31:18-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + sntp/libopts/configfile.c@1.6, 2006-10-08 04:31:08-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + sntp/libopts/cook.c@1.5, 2006-10-08 04:31:09-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + sntp/libopts/enumeration.c@1.5, 2006-10-08 04:31:09-04:00, stenn@whimsy.udel.edu +4 -4 + libopts-27.5.3 + + sntp/libopts/genshell.c@1.5, 2006-10-08 04:31:10-04:00, stenn@whimsy.udel.edu +3 -1 + libopts-27.5.3 + + sntp/libopts/genshell.h@1.5, 2006-10-08 04:31:11-04:00, stenn@whimsy.udel.edu +5 -3 + libopts-27.5.3 + + sntp/libopts/load.c@1.6, 2006-10-08 04:31:11-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + sntp/libopts/m4/libopts.m4@1.10, 2006-10-08 04:31:20-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + sntp/libopts/makeshell.c@1.7, 2006-10-08 04:31:12-04:00, stenn@whimsy.udel.edu +13 -4 + libopts-27.5.3 + + sntp/libopts/nested.c@1.5, 2006-10-08 04:31:13-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + sntp/libopts/numeric.c@1.5, 2006-10-08 04:31:14-04:00, stenn@whimsy.udel.edu +4 -4 + libopts-27.5.3 + + sntp/libopts/proto.h@1.7, 2006-10-08 04:31:14-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.5.3 + + sntp/libopts/putshell.c@1.6, 2006-10-08 04:31:15-04:00, stenn@whimsy.udel.edu +8 -8 + libopts-27.5.3 + + sntp/libopts/restore.c@1.4, 2006-10-08 04:31:15-04:00, stenn@whimsy.udel.edu +2 -2 + libopts-27.5.3 + + sntp/libopts/save.c@1.6, 2006-10-08 04:31:16-04:00, stenn@whimsy.udel.edu +7 -8 + libopts-27.5.3 + + sntp/libopts/stack.c@1.6, 2006-10-08 04:31:17-04:00, stenn@whimsy.udel.edu +3 -3 + libopts-27.5.3 + sntp/sntp-opts.c@1.27, 2006-10-08 04:31:05-04:00, stenn@whimsy.udel.edu +3 -1 libopts-27.5.3 @@ -6923,204 +8647,6 @@ ChangeSet@1.1379.1.24, 2006-09-25 07:49:15-04:00, stenn@whimsy.udel.edu +25 -0 ChangeSet@1.1379.1.23, 2006-09-25 01:53:46-04:00, stenn@whimsy.udel.edu +93 -0 autogen upgrade - libopts/autoopts.c@1.8, 2006-09-25 01:50:05-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/autoopts.c@1.5, 2006-09-25 01:50:36-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/autoopts.h@1.8, 2006-09-25 01:50:05-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/autoopts.h@1.6, 2006-09-25 01:50:37-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/boolean.c@1.7, 2006-09-25 01:50:06-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/boolean.c@1.4, 2006-09-25 01:50:38-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/compat/compat.h@1.11, 2006-09-25 01:50:22-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/compat/compat.h@1.7, 2006-09-25 01:50:56-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/configfile.c@1.8, 2006-09-25 01:50:06-04:00, stenn@whimsy.udel.edu +34 -35 - autogen upgrade - - sntp/libopts/configfile.c@1.5, 2006-09-25 01:50:38-04:00, stenn@whimsy.udel.edu +34 -35 - autogen upgrade - - libopts/cook.c@1.7, 2006-09-25 01:50:07-04:00, stenn@whimsy.udel.edu +5 -6 - autogen upgrade - - sntp/libopts/cook.c@1.4, 2006-09-25 01:50:40-04:00, stenn@whimsy.udel.edu +5 -6 - autogen upgrade - - libopts/enumeration.c@1.7, 2006-09-25 01:50:08-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/enumeration.c@1.4, 2006-09-25 01:50:41-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/environment.c@1.7, 2006-09-25 01:50:08-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/environment.c@1.4, 2006-09-25 01:50:42-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/genshell.c@1.7, 2006-09-25 01:50:09-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - sntp/libopts/genshell.c@1.4, 2006-09-25 01:50:42-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - libopts/genshell.h@1.7, 2006-09-25 01:50:10-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - sntp/libopts/genshell.h@1.4, 2006-09-25 01:50:43-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - libopts/m4/libopts.m4@1.12, 2006-09-25 01:50:25-04:00, stenn@whimsy.udel.edu +4 -1 - autogen upgrade - - sntp/libopts/m4/libopts.m4@1.9, 2006-09-25 01:50:58-04:00, stenn@whimsy.udel.edu +4 -1 - autogen upgrade - - libopts/m4/liboptschk.m4@1.2, 2006-09-25 01:50:27-04:00, stenn@whimsy.udel.edu +4 -1 - autogen upgrade - - sntp/libopts/m4/liboptschk.m4@1.2, 2006-09-25 01:50:59-04:00, stenn@whimsy.udel.edu +4 -1 - autogen upgrade - - libopts/load.c@1.8, 2006-09-25 01:50:10-04:00, stenn@whimsy.udel.edu +10 -11 - autogen upgrade - - sntp/libopts/load.c@1.5, 2006-09-25 01:50:44-04:00, stenn@whimsy.udel.edu +10 -11 - autogen upgrade - - libopts/makeshell.c@1.9, 2006-09-25 01:50:11-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/makeshell.c@1.6, 2006-09-25 01:50:45-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/nested.c@1.7, 2006-09-25 01:50:12-04:00, stenn@whimsy.udel.edu +18 -19 - autogen upgrade - - sntp/libopts/nested.c@1.4, 2006-09-25 01:50:45-04:00, stenn@whimsy.udel.edu +18 -19 - autogen upgrade - - libopts/numeric.c@1.7, 2006-09-25 01:50:12-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/numeric.c@1.4, 2006-09-25 01:50:46-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/autoopts/options.h@1.8, 2006-09-25 01:50:20-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - sntp/libopts/autoopts/options.h@1.5, 2006-09-25 01:50:55-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - libopts/compat/pathfind.c@1.8, 2006-09-25 01:50:23-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - sntp/libopts/compat/pathfind.c@1.5, 2006-09-25 01:50:57-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - libopts/pgusage.c@1.8, 2006-09-25 01:50:13-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/pgusage.c@1.4, 2006-09-25 01:50:46-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/proto.h@1.9, 2006-09-25 01:50:13-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - sntp/libopts/proto.h@1.6, 2006-09-25 01:50:47-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - libopts/putshell.c@1.8, 2006-09-25 01:50:13-04:00, stenn@whimsy.udel.edu +3 -4 - autogen upgrade - - sntp/libopts/putshell.c@1.5, 2006-09-25 01:50:47-04:00, stenn@whimsy.udel.edu +3 -4 - autogen upgrade - - libopts/restore.c@1.7, 2006-09-25 01:50:14-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/restore.c@1.3, 2006-09-25 01:50:47-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/save.c@1.8, 2006-09-25 01:50:15-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/save.c@1.5, 2006-09-25 01:50:49-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/sort.c@1.7, 2006-09-25 01:50:15-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/sort.c@1.3, 2006-09-25 01:50:50-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/stack.c@1.8, 2006-09-25 01:50:16-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/stack.c@1.5, 2006-09-25 01:50:50-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/compat/strchr.c@1.3, 2006-09-25 01:50:24-04:00, stenn@whimsy.udel.edu +0 -1 - autogen upgrade - - sntp/libopts/compat/strchr.c@1.3, 2006-09-25 01:50:57-04:00, stenn@whimsy.udel.edu +0 -1 - autogen upgrade - - libopts/streqvcmp.c@1.8, 2006-09-25 01:50:17-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/streqvcmp.c@1.5, 2006-09-25 01:50:51-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/text_mmap.c@1.7, 2006-09-25 01:50:17-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/text_mmap.c@1.4, 2006-09-25 01:50:52-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/tokenize.c@1.5, 2006-09-25 01:50:18-04:00, stenn@whimsy.udel.edu +0 -1 - autogen upgrade - - sntp/libopts/tokenize.c@1.4, 2006-09-25 01:50:53-04:00, stenn@whimsy.udel.edu +0 -1 - autogen upgrade - - libopts/autoopts/usage-txt.h@1.7, 2006-09-25 01:50:22-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - sntp/libopts/autoopts/usage-txt.h@1.4, 2006-09-25 01:50:55-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - libopts/usage.c@1.8, 2006-09-25 01:50:19-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/usage.c@1.6, 2006-09-25 01:50:53-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/version.c@1.8, 2006-09-25 01:50:20-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - sntp/libopts/version.c@1.5, 2006-09-25 01:50:54-04:00, stenn@whimsy.udel.edu +1 -2 - autogen upgrade - - libopts/compat/windows-config.h@1.4, 2006-09-25 01:50:25-04:00, stenn@whimsy.udel.edu +6 -0 - autogen upgrade - - sntp/libopts/compat/windows-config.h@1.2, 2006-09-25 01:50:58-04:00, stenn@whimsy.udel.edu +16 -10 - autogen upgrade - NEWS@1.64, 2006-09-25 01:53:32-04:00, stenn@whimsy.udel.edu +6 -5 updates @@ -7130,6 +8656,105 @@ ChangeSet@1.1379.1.23, 2006-09-25 01:53:46-04:00, stenn@whimsy.udel.edu +93 -0 clockstuff/clktest-opts.h@1.5, 2006-09-25 01:50:04-04:00, stenn@whimsy.udel.edu +3 -3 autogen upgrade + libopts/autoopts.c@1.8, 2006-09-25 01:50:05-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/autoopts.h@1.8, 2006-09-25 01:50:05-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/autoopts/options.h@1.8, 2006-09-25 01:50:20-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + libopts/autoopts/usage-txt.h@1.7, 2006-09-25 01:50:22-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + libopts/boolean.c@1.7, 2006-09-25 01:50:06-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/compat/compat.h@1.11, 2006-09-25 01:50:22-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/compat/pathfind.c@1.8, 2006-09-25 01:50:23-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + libopts/compat/strchr.c@1.3, 2006-09-25 01:50:24-04:00, stenn@whimsy.udel.edu +0 -1 + autogen upgrade + + libopts/compat/windows-config.h@1.4, 2006-09-25 01:50:25-04:00, stenn@whimsy.udel.edu +6 -0 + autogen upgrade + + libopts/configfile.c@1.8, 2006-09-25 01:50:06-04:00, stenn@whimsy.udel.edu +34 -35 + autogen upgrade + + libopts/cook.c@1.7, 2006-09-25 01:50:07-04:00, stenn@whimsy.udel.edu +5 -6 + autogen upgrade + + libopts/enumeration.c@1.7, 2006-09-25 01:50:08-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/environment.c@1.7, 2006-09-25 01:50:08-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/genshell.c@1.7, 2006-09-25 01:50:09-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/genshell.h@1.7, 2006-09-25 01:50:10-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/load.c@1.8, 2006-09-25 01:50:10-04:00, stenn@whimsy.udel.edu +10 -11 + autogen upgrade + + libopts/m4/libopts.m4@1.12, 2006-09-25 01:50:25-04:00, stenn@whimsy.udel.edu +4 -1 + autogen upgrade + + libopts/m4/liboptschk.m4@1.2, 2006-09-25 01:50:27-04:00, stenn@whimsy.udel.edu +4 -1 + autogen upgrade + + libopts/makeshell.c@1.9, 2006-09-25 01:50:11-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/nested.c@1.7, 2006-09-25 01:50:12-04:00, stenn@whimsy.udel.edu +18 -19 + autogen upgrade + + libopts/numeric.c@1.7, 2006-09-25 01:50:12-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/pgusage.c@1.8, 2006-09-25 01:50:13-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/proto.h@1.9, 2006-09-25 01:50:13-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/putshell.c@1.8, 2006-09-25 01:50:13-04:00, stenn@whimsy.udel.edu +3 -4 + autogen upgrade + + libopts/restore.c@1.7, 2006-09-25 01:50:14-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/save.c@1.8, 2006-09-25 01:50:15-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/sort.c@1.7, 2006-09-25 01:50:15-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/stack.c@1.8, 2006-09-25 01:50:16-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/streqvcmp.c@1.8, 2006-09-25 01:50:17-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/text_mmap.c@1.7, 2006-09-25 01:50:17-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/tokenize.c@1.5, 2006-09-25 01:50:18-04:00, stenn@whimsy.udel.edu +0 -1 + autogen upgrade + + libopts/usage.c@1.8, 2006-09-25 01:50:19-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + libopts/version.c@1.8, 2006-09-25 01:50:20-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + ntpd/ntpd-opts.c@1.25, 2006-09-25 01:50:27-04:00, stenn@whimsy.udel.edu +3 -2 autogen upgrade @@ -7178,6 +8803,105 @@ ChangeSet@1.1379.1.23, 2006-09-25 01:53:46-04:00, stenn@whimsy.udel.edu +93 -0 ntpq/ntpq.1@1.25, 2006-09-25 01:52:38-04:00, stenn@whimsy.udel.edu +2 -2 autogen upgrade + sntp/libopts/autoopts.c@1.5, 2006-09-25 01:50:36-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/autoopts.h@1.6, 2006-09-25 01:50:37-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/autoopts/options.h@1.5, 2006-09-25 01:50:55-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + sntp/libopts/autoopts/usage-txt.h@1.4, 2006-09-25 01:50:55-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + sntp/libopts/boolean.c@1.4, 2006-09-25 01:50:38-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/compat/compat.h@1.7, 2006-09-25 01:50:56-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/compat/pathfind.c@1.5, 2006-09-25 01:50:57-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + sntp/libopts/compat/strchr.c@1.3, 2006-09-25 01:50:57-04:00, stenn@whimsy.udel.edu +0 -1 + autogen upgrade + + sntp/libopts/compat/windows-config.h@1.2, 2006-09-25 01:50:58-04:00, stenn@whimsy.udel.edu +16 -10 + autogen upgrade + + sntp/libopts/configfile.c@1.5, 2006-09-25 01:50:38-04:00, stenn@whimsy.udel.edu +34 -35 + autogen upgrade + + sntp/libopts/cook.c@1.4, 2006-09-25 01:50:40-04:00, stenn@whimsy.udel.edu +5 -6 + autogen upgrade + + sntp/libopts/enumeration.c@1.4, 2006-09-25 01:50:41-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/environment.c@1.4, 2006-09-25 01:50:42-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/genshell.c@1.4, 2006-09-25 01:50:42-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + sntp/libopts/genshell.h@1.4, 2006-09-25 01:50:43-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + sntp/libopts/load.c@1.5, 2006-09-25 01:50:44-04:00, stenn@whimsy.udel.edu +10 -11 + autogen upgrade + + sntp/libopts/m4/libopts.m4@1.9, 2006-09-25 01:50:58-04:00, stenn@whimsy.udel.edu +4 -1 + autogen upgrade + + sntp/libopts/m4/liboptschk.m4@1.2, 2006-09-25 01:50:59-04:00, stenn@whimsy.udel.edu +4 -1 + autogen upgrade + + sntp/libopts/makeshell.c@1.6, 2006-09-25 01:50:45-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/nested.c@1.4, 2006-09-25 01:50:45-04:00, stenn@whimsy.udel.edu +18 -19 + autogen upgrade + + sntp/libopts/numeric.c@1.4, 2006-09-25 01:50:46-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/pgusage.c@1.4, 2006-09-25 01:50:46-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/proto.h@1.6, 2006-09-25 01:50:47-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + sntp/libopts/putshell.c@1.5, 2006-09-25 01:50:47-04:00, stenn@whimsy.udel.edu +3 -4 + autogen upgrade + + sntp/libopts/restore.c@1.3, 2006-09-25 01:50:47-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/save.c@1.5, 2006-09-25 01:50:49-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/sort.c@1.3, 2006-09-25 01:50:50-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/stack.c@1.5, 2006-09-25 01:50:50-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/streqvcmp.c@1.5, 2006-09-25 01:50:51-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/text_mmap.c@1.4, 2006-09-25 01:50:52-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/tokenize.c@1.4, 2006-09-25 01:50:53-04:00, stenn@whimsy.udel.edu +0 -1 + autogen upgrade + + sntp/libopts/usage.c@1.6, 2006-09-25 01:50:53-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + + sntp/libopts/version.c@1.5, 2006-09-25 01:50:54-04:00, stenn@whimsy.udel.edu +1 -2 + autogen upgrade + sntp/sntp-opts.c@1.24, 2006-09-25 01:52:39-04:00, stenn@whimsy.udel.edu +1 -1 autogen upgrade @@ -7284,195 +9008,6 @@ ChangeSet@1.1379.1.22, 2006-09-24 05:30:52-04:00, stenn@whimsy.udel.edu +25 -0 ChangeSet@1.1379.1.21, 2006-09-24 03:03:52-04:00, stenn@whimsy.udel.edu +67 -0 autogen upgrade - libopts/autoopts.c@1.7, 2006-09-24 03:02:46-04:00, stenn@whimsy.udel.edu +7 -7 - autogen upgrade - - sntp/libopts/autoopts.c@1.4, 2006-09-24 03:03:08-04:00, stenn@whimsy.udel.edu +51 -7 - autogen upgrade - - libopts/autoopts.h@1.7, 2006-09-24 03:02:46-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - sntp/libopts/autoopts.h@1.5, 2006-09-24 03:03:09-04:00, stenn@whimsy.udel.edu +10 -9 - autogen upgrade - - libopts/boolean.c@1.6, 2006-09-24 03:02:47-04:00, stenn@whimsy.udel.edu +6 -6 - autogen upgrade - - sntp/libopts/boolean.c@1.3, 2006-09-24 03:03:10-04:00, stenn@whimsy.udel.edu +5 -5 - autogen upgrade - - libopts/compat/compat.h@1.10, 2006-09-24 03:03:03-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - sntp/libopts/compat/compat.h@1.6, 2006-09-24 03:03:25-04:00, stenn@whimsy.udel.edu +7 -7 - autogen upgrade - - libopts/configfile.c@1.7, 2006-09-24 03:02:48-04:00, stenn@whimsy.udel.edu +23 -23 - autogen upgrade - - sntp/libopts/configfile.c@1.4, 2006-09-24 03:03:10-04:00, stenn@whimsy.udel.edu +37 -35 - autogen upgrade - - libopts/cook.c@1.6, 2006-09-24 03:02:48-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - sntp/libopts/cook.c@1.3, 2006-09-24 03:03:11-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - libopts/enumeration.c@1.6, 2006-09-24 03:02:49-04:00, stenn@whimsy.udel.edu +23 -23 - autogen upgrade - - sntp/libopts/enumeration.c@1.3, 2006-09-24 03:03:12-04:00, stenn@whimsy.udel.edu +23 -23 - autogen upgrade - - libopts/environment.c@1.6, 2006-09-24 03:02:50-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - sntp/libopts/environment.c@1.3, 2006-09-24 03:03:12-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - libopts/genshell.c@1.6, 2006-09-24 03:02:51-04:00, stenn@whimsy.udel.edu +8 -8 - autogen upgrade - - sntp/libopts/genshell.c@1.3, 2006-09-24 03:03:13-04:00, stenn@whimsy.udel.edu +11 -10 - autogen upgrade - - libopts/genshell.h@1.6, 2006-09-24 03:02:51-04:00, stenn@whimsy.udel.edu +4 -4 - autogen upgrade - - sntp/libopts/genshell.h@1.3, 2006-09-24 03:03:14-04:00, stenn@whimsy.udel.edu +8 -8 - autogen upgrade - - libopts/m4/libopts.m4@1.11, 2006-09-24 03:03:06-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - sntp/libopts/m4/libopts.m4@1.8, 2006-09-24 03:03:27-04:00, stenn@whimsy.udel.edu +8 -3 - autogen upgrade - - libopts/load.c@1.7, 2006-09-24 03:02:52-04:00, stenn@whimsy.udel.edu +4 -4 - autogen upgrade - - sntp/libopts/load.c@1.4, 2006-09-24 03:03:15-04:00, stenn@whimsy.udel.edu +4 -4 - autogen upgrade - - libopts/makeshell.c@1.8, 2006-09-24 03:02:53-04:00, stenn@whimsy.udel.edu +13 -12 - autogen upgrade - - sntp/libopts/makeshell.c@1.5, 2006-09-24 03:03:15-04:00, stenn@whimsy.udel.edu +13 -12 - autogen upgrade - - libopts/nested.c@1.6, 2006-09-24 03:02:53-04:00, stenn@whimsy.udel.edu +38 -38 - autogen upgrade - - sntp/libopts/nested.c@1.3, 2006-09-24 03:03:16-04:00, stenn@whimsy.udel.edu +40 -40 - autogen upgrade - - libopts/numeric.c@1.6, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +7 -7 - autogen upgrade - - sntp/libopts/numeric.c@1.3, 2006-09-24 03:03:17-04:00, stenn@whimsy.udel.edu +6 -6 - autogen upgrade - - libopts/autoopts/options.h@1.7, 2006-09-24 03:03:01-04:00, stenn@whimsy.udel.edu +51 -42 - autogen upgrade - - sntp/libopts/autoopts/options.h@1.4, 2006-09-24 03:03:23-04:00, stenn@whimsy.udel.edu +60 -51 - autogen upgrade - - libopts/compat/pathfind.c@1.7, 2006-09-24 03:03:04-04:00, stenn@whimsy.udel.edu +16 -16 - autogen upgrade - - sntp/libopts/compat/pathfind.c@1.4, 2006-09-24 03:03:25-04:00, stenn@whimsy.udel.edu +19 -19 - autogen upgrade - - libopts/pgusage.c@1.7, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - libopts/proto.h@1.8, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - sntp/libopts/proto.h@1.5, 2006-09-24 03:03:17-04:00, stenn@whimsy.udel.edu +14 -2 - autogen upgrade - - libopts/putshell.c@1.7, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +12 -12 - autogen upgrade - - sntp/libopts/putshell.c@1.4, 2006-09-24 03:03:18-04:00, stenn@whimsy.udel.edu +11 -11 - autogen upgrade - - libopts/restore.c@1.6, 2006-09-24 03:02:55-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - libopts/save.c@1.7, 2006-09-24 03:02:56-04:00, stenn@whimsy.udel.edu +14 -12 - autogen upgrade - - sntp/libopts/save.c@1.4, 2006-09-24 03:03:18-04:00, stenn@whimsy.udel.edu +14 -12 - autogen upgrade - - libopts/compat/snprintf.c@1.4, 2006-09-24 03:03:05-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - sntp/libopts/compat/snprintf.c@1.3, 2006-09-24 03:03:26-04:00, stenn@whimsy.udel.edu +4 -4 - autogen upgrade - - libopts/sort.c@1.6, 2006-09-24 03:02:56-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - libopts/stack.c@1.7, 2006-09-24 03:02:57-04:00, stenn@whimsy.udel.edu +6 -6 - autogen upgrade - - sntp/libopts/stack.c@1.4, 2006-09-24 03:03:19-04:00, stenn@whimsy.udel.edu +5 -5 - autogen upgrade - - libopts/compat/strchr.c@1.2, 2006-09-24 03:03:05-04:00, stenn@whimsy.udel.edu +5 -5 - autogen upgrade - - sntp/libopts/compat/strchr.c@1.2, 2006-09-24 03:03:26-04:00, stenn@whimsy.udel.edu +5 -5 - autogen upgrade - - libopts/compat/strdup.c@1.3, 2006-09-24 03:03:06-04:00, stenn@whimsy.udel.edu +1 -1 - autogen upgrade - - sntp/libopts/compat/strdup.c@1.2, 2006-09-24 03:03:27-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - libopts/streqvcmp.c@1.7, 2006-09-24 03:02:58-04:00, stenn@whimsy.udel.edu +9 -9 - autogen upgrade - - sntp/libopts/streqvcmp.c@1.4, 2006-09-24 03:03:20-04:00, stenn@whimsy.udel.edu +9 -9 - autogen upgrade - - libopts/text_mmap.c@1.6, 2006-09-24 03:02:58-04:00, stenn@whimsy.udel.edu +3 -3 - autogen upgrade - - sntp/libopts/text_mmap.c@1.3, 2006-09-24 03:03:20-04:00, stenn@whimsy.udel.edu +12 -16 - autogen upgrade - - libopts/tokenize.c@1.4, 2006-09-24 03:02:59-04:00, stenn@whimsy.udel.edu +8 -8 - autogen upgrade - - sntp/libopts/tokenize.c@1.3, 2006-09-24 03:03:21-04:00, stenn@whimsy.udel.edu +16 -16 - autogen upgrade - - libopts/autoopts/usage-txt.h@1.6, 2006-09-24 03:03:02-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - sntp/libopts/autoopts/usage-txt.h@1.3, 2006-09-24 03:03:24-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - libopts/usage.c@1.7, 2006-09-24 03:03:00-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - sntp/libopts/usage.c@1.5, 2006-09-24 03:03:22-04:00, stenn@whimsy.udel.edu +2 -2 - autogen upgrade - - libopts/version.c@1.7, 2006-09-24 03:03:01-04:00, stenn@whimsy.udel.edu +9 -9 - autogen upgrade - - sntp/libopts/version.c@1.4, 2006-09-24 03:03:23-04:00, stenn@whimsy.udel.edu +9 -9 - autogen upgrade - clockstuff/clktest-opts.c@1.4, 2006-09-24 03:02:44-04:00, stenn@whimsy.udel.edu +1 -1 autogen upgrade @@ -7485,6 +9020,105 @@ ChangeSet@1.1379.1.21, 2006-09-24 03:03:52-04:00, stenn@whimsy.udel.edu +67 -0 clockstuff/clktest-opts.h@1.3, 2006-09-24 00:44:31-04:00, stenn@whimsy.udel.edu +10 -10 new autogen + libopts/autoopts.c@1.7, 2006-09-24 03:02:46-04:00, stenn@whimsy.udel.edu +7 -7 + autogen upgrade + + libopts/autoopts.h@1.7, 2006-09-24 03:02:46-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + libopts/autoopts/options.h@1.7, 2006-09-24 03:03:01-04:00, stenn@whimsy.udel.edu +51 -42 + autogen upgrade + + libopts/autoopts/usage-txt.h@1.6, 2006-09-24 03:03:02-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + libopts/boolean.c@1.6, 2006-09-24 03:02:47-04:00, stenn@whimsy.udel.edu +6 -6 + autogen upgrade + + libopts/compat/compat.h@1.10, 2006-09-24 03:03:03-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/compat/pathfind.c@1.7, 2006-09-24 03:03:04-04:00, stenn@whimsy.udel.edu +16 -16 + autogen upgrade + + libopts/compat/snprintf.c@1.4, 2006-09-24 03:03:05-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + libopts/compat/strchr.c@1.2, 2006-09-24 03:03:05-04:00, stenn@whimsy.udel.edu +5 -5 + autogen upgrade + + libopts/compat/strdup.c@1.3, 2006-09-24 03:03:06-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/configfile.c@1.7, 2006-09-24 03:02:48-04:00, stenn@whimsy.udel.edu +23 -23 + autogen upgrade + + libopts/cook.c@1.6, 2006-09-24 03:02:48-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + libopts/enumeration.c@1.6, 2006-09-24 03:02:49-04:00, stenn@whimsy.udel.edu +23 -23 + autogen upgrade + + libopts/environment.c@1.6, 2006-09-24 03:02:50-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + libopts/genshell.c@1.6, 2006-09-24 03:02:51-04:00, stenn@whimsy.udel.edu +8 -8 + autogen upgrade + + libopts/genshell.h@1.6, 2006-09-24 03:02:51-04:00, stenn@whimsy.udel.edu +4 -4 + autogen upgrade + + libopts/load.c@1.7, 2006-09-24 03:02:52-04:00, stenn@whimsy.udel.edu +4 -4 + autogen upgrade + + libopts/m4/libopts.m4@1.11, 2006-09-24 03:03:06-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + libopts/makeshell.c@1.8, 2006-09-24 03:02:53-04:00, stenn@whimsy.udel.edu +13 -12 + autogen upgrade + + libopts/nested.c@1.6, 2006-09-24 03:02:53-04:00, stenn@whimsy.udel.edu +38 -38 + autogen upgrade + + libopts/numeric.c@1.6, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +7 -7 + autogen upgrade + + libopts/pgusage.c@1.7, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/proto.h@1.8, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + libopts/putshell.c@1.7, 2006-09-24 03:02:54-04:00, stenn@whimsy.udel.edu +12 -12 + autogen upgrade + + libopts/restore.c@1.6, 2006-09-24 03:02:55-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/save.c@1.7, 2006-09-24 03:02:56-04:00, stenn@whimsy.udel.edu +14 -12 + autogen upgrade + + libopts/sort.c@1.6, 2006-09-24 03:02:56-04:00, stenn@whimsy.udel.edu +1 -1 + autogen upgrade + + libopts/stack.c@1.7, 2006-09-24 03:02:57-04:00, stenn@whimsy.udel.edu +6 -6 + autogen upgrade + + libopts/streqvcmp.c@1.7, 2006-09-24 03:02:58-04:00, stenn@whimsy.udel.edu +9 -9 + autogen upgrade + + libopts/text_mmap.c@1.6, 2006-09-24 03:02:58-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + libopts/tokenize.c@1.4, 2006-09-24 03:02:59-04:00, stenn@whimsy.udel.edu +8 -8 + autogen upgrade + + libopts/usage.c@1.7, 2006-09-24 03:03:00-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + libopts/version.c@1.7, 2006-09-24 03:03:01-04:00, stenn@whimsy.udel.edu +9 -9 + autogen upgrade + ntpq/ntpq-opts.c@1.25, 2006-09-24 03:03:07-04:00, stenn@whimsy.udel.edu +1 -1 autogen upgrade @@ -7497,6 +9131,96 @@ ChangeSet@1.1379.1.21, 2006-09-24 03:03:52-04:00, stenn@whimsy.udel.edu +67 -0 ntpq/ntpq-opts.h@1.24, 2006-09-24 00:45:25-04:00, stenn@whimsy.udel.edu +5 -5 new autogen + sntp/libopts/autoopts.c@1.4, 2006-09-24 03:03:08-04:00, stenn@whimsy.udel.edu +51 -7 + autogen upgrade + + sntp/libopts/autoopts.h@1.5, 2006-09-24 03:03:09-04:00, stenn@whimsy.udel.edu +10 -9 + autogen upgrade + + sntp/libopts/autoopts/options.h@1.4, 2006-09-24 03:03:23-04:00, stenn@whimsy.udel.edu +60 -51 + autogen upgrade + + sntp/libopts/autoopts/usage-txt.h@1.3, 2006-09-24 03:03:24-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + sntp/libopts/boolean.c@1.3, 2006-09-24 03:03:10-04:00, stenn@whimsy.udel.edu +5 -5 + autogen upgrade + + sntp/libopts/compat/compat.h@1.6, 2006-09-24 03:03:25-04:00, stenn@whimsy.udel.edu +7 -7 + autogen upgrade + + sntp/libopts/compat/pathfind.c@1.4, 2006-09-24 03:03:25-04:00, stenn@whimsy.udel.edu +19 -19 + autogen upgrade + + sntp/libopts/compat/snprintf.c@1.3, 2006-09-24 03:03:26-04:00, stenn@whimsy.udel.edu +4 -4 + autogen upgrade + + sntp/libopts/compat/strchr.c@1.2, 2006-09-24 03:03:26-04:00, stenn@whimsy.udel.edu +5 -5 + autogen upgrade + + sntp/libopts/compat/strdup.c@1.2, 2006-09-24 03:03:27-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + sntp/libopts/configfile.c@1.4, 2006-09-24 03:03:10-04:00, stenn@whimsy.udel.edu +37 -35 + autogen upgrade + + sntp/libopts/cook.c@1.3, 2006-09-24 03:03:11-04:00, stenn@whimsy.udel.edu +3 -3 + autogen upgrade + + sntp/libopts/enumeration.c@1.3, 2006-09-24 03:03:12-04:00, stenn@whimsy.udel.edu +23 -23 + autogen upgrade + + sntp/libopts/environment.c@1.3, 2006-09-24 03:03:12-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + sntp/libopts/genshell.c@1.3, 2006-09-24 03:03:13-04:00, stenn@whimsy.udel.edu +11 -10 + autogen upgrade + + sntp/libopts/genshell.h@1.3, 2006-09-24 03:03:14-04:00, stenn@whimsy.udel.edu +8 -8 + autogen upgrade + + sntp/libopts/load.c@1.4, 2006-09-24 03:03:15-04:00, stenn@whimsy.udel.edu +4 -4 + autogen upgrade + + sntp/libopts/m4/libopts.m4@1.8, 2006-09-24 03:03:27-04:00, stenn@whimsy.udel.edu +8 -3 + autogen upgrade + + sntp/libopts/makeshell.c@1.5, 2006-09-24 03:03:15-04:00, stenn@whimsy.udel.edu +13 -12 + autogen upgrade + + sntp/libopts/nested.c@1.3, 2006-09-24 03:03:16-04:00, stenn@whimsy.udel.edu +40 -40 + autogen upgrade + + sntp/libopts/numeric.c@1.3, 2006-09-24 03:03:17-04:00, stenn@whimsy.udel.edu +6 -6 + autogen upgrade + + sntp/libopts/proto.h@1.5, 2006-09-24 03:03:17-04:00, stenn@whimsy.udel.edu +14 -2 + autogen upgrade + + sntp/libopts/putshell.c@1.4, 2006-09-24 03:03:18-04:00, stenn@whimsy.udel.edu +11 -11 + autogen upgrade + + sntp/libopts/save.c@1.4, 2006-09-24 03:03:18-04:00, stenn@whimsy.udel.edu +14 -12 + autogen upgrade + + sntp/libopts/stack.c@1.4, 2006-09-24 03:03:19-04:00, stenn@whimsy.udel.edu +5 -5 + autogen upgrade + + sntp/libopts/streqvcmp.c@1.4, 2006-09-24 03:03:20-04:00, stenn@whimsy.udel.edu +9 -9 + autogen upgrade + + sntp/libopts/text_mmap.c@1.3, 2006-09-24 03:03:20-04:00, stenn@whimsy.udel.edu +12 -16 + autogen upgrade + + sntp/libopts/tokenize.c@1.3, 2006-09-24 03:03:21-04:00, stenn@whimsy.udel.edu +16 -16 + autogen upgrade + + sntp/libopts/usage.c@1.5, 2006-09-24 03:03:22-04:00, stenn@whimsy.udel.edu +2 -2 + autogen upgrade + + sntp/libopts/version.c@1.4, 2006-09-24 03:03:23-04:00, stenn@whimsy.udel.edu +9 -9 + autogen upgrade + ChangeSet@1.1379.1.20, 2006-09-23 17:23:36+00:00, kardel@pogo.udel.edu +5 -0 ntpd.h, ntpd.c, ntp_timer.c, ntp_io.c, cmd_args.c: disable dynamic update when giving up the root privilege @@ -7549,12 +9273,30 @@ ChangeSet@1.1379.7.1, 2006-09-22 19:38:01-04:00, stenn@whimsy.udel.edu +34 -0 libopts/autoopts.h@1.6, 2006-09-22 19:36:57-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 + libopts/autoopts/options.h@1.6, 2006-09-22 19:36:55-04:00, stenn@whimsy.udel.edu +5 -5 + Upgrade to libopts-27.4.3 + + libopts/autoopts/usage-txt.h@1.5, 2006-09-22 19:36:55-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.3 + libopts/boolean.c@1.5, 2006-09-22 19:36:58-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 libopts/compat/compat.h@1.9, 2006-09-22 19:36:58-04:00, stenn@whimsy.udel.edu +5 -5 Upgrade to libopts-27.4.3 + libopts/compat/pathfind.c@1.6, 2006-09-22 19:37:00-04:00, stenn@whimsy.udel.edu +2 -2 + Upgrade to libopts-27.4.3 + + libopts/compat/snprintf.c@1.3, 2006-09-22 19:37:01-04:00, stenn@whimsy.udel.edu +2 -2 + Upgrade to libopts-27.4.3 + + libopts/compat/strdup.c@1.2, 2006-09-22 19:37:01-04:00, stenn@whimsy.udel.edu +2 -2 + Upgrade to libopts-27.4.3 + + libopts/compat/windows-config.h@1.3, 2006-09-22 19:37:01-04:00, stenn@whimsy.udel.edu +6 -6 + Upgrade to libopts-27.4.3 + libopts/configfile.c@1.6, 2006-09-22 19:37:02-04:00, stenn@whimsy.udel.edu +12 -13 Upgrade to libopts-27.4.3 @@ -7573,10 +9315,10 @@ ChangeSet@1.1379.7.1, 2006-09-22 19:38:01-04:00, stenn@whimsy.udel.edu +34 -0 libopts/genshell.h@1.5, 2006-09-22 19:37:06-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 - libopts/m4/libopts.m4@1.10, 2006-09-22 19:37:07-04:00, stenn@whimsy.udel.edu +6 -1 + libopts/load.c@1.6, 2006-09-22 19:37:06-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 - libopts/load.c@1.6, 2006-09-22 19:37:06-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/m4/libopts.m4@1.10, 2006-09-22 19:37:07-04:00, stenn@whimsy.udel.edu +6 -1 Upgrade to libopts-27.4.3 libopts/makeshell.c@1.7, 2006-09-22 19:37:07-04:00, stenn@whimsy.udel.edu +1 -1 @@ -7588,12 +9330,6 @@ ChangeSet@1.1379.7.1, 2006-09-22 19:38:01-04:00, stenn@whimsy.udel.edu +34 -0 libopts/numeric.c@1.5, 2006-09-22 19:37:09-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 - libopts/autoopts/options.h@1.6, 2006-09-22 19:36:55-04:00, stenn@whimsy.udel.edu +5 -5 - Upgrade to libopts-27.4.3 - - libopts/compat/pathfind.c@1.6, 2006-09-22 19:37:00-04:00, stenn@whimsy.udel.edu +2 -2 - Upgrade to libopts-27.4.3 - libopts/pgusage.c@1.6, 2006-09-22 19:37:09-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 @@ -7609,18 +9345,12 @@ ChangeSet@1.1379.7.1, 2006-09-22 19:38:01-04:00, stenn@whimsy.udel.edu +34 -0 libopts/save.c@1.6, 2006-09-22 19:37:12-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 - libopts/compat/snprintf.c@1.3, 2006-09-22 19:37:01-04:00, stenn@whimsy.udel.edu +2 -2 - Upgrade to libopts-27.4.3 - libopts/sort.c@1.5, 2006-09-22 19:37:12-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 libopts/stack.c@1.6, 2006-09-22 19:37:13-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 - libopts/compat/strdup.c@1.2, 2006-09-22 19:37:01-04:00, stenn@whimsy.udel.edu +2 -2 - Upgrade to libopts-27.4.3 - libopts/streqvcmp.c@1.6, 2006-09-22 19:37:14-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 @@ -7630,18 +9360,12 @@ ChangeSet@1.1379.7.1, 2006-09-22 19:38:01-04:00, stenn@whimsy.udel.edu +34 -0 libopts/tokenize.c@1.3, 2006-09-22 19:37:15-04:00, stenn@whimsy.udel.edu +14 -14 Upgrade to libopts-27.4.3 - libopts/autoopts/usage-txt.h@1.5, 2006-09-22 19:36:55-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.3 - libopts/usage.c@1.6, 2006-09-22 19:37:16-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 libopts/version.c@1.6, 2006-09-22 19:37:17-04:00, stenn@whimsy.udel.edu +1 -1 Upgrade to libopts-27.4.3 - libopts/compat/windows-config.h@1.3, 2006-09-22 19:37:01-04:00, stenn@whimsy.udel.edu +6 -6 - Upgrade to libopts-27.4.3 - ChangeSet@1.1379.1.18, 2006-09-22 22:58:27+00:00, kardel@pogo.udel.edu +2 -0 ntp_io.c: add autoconfig enabled code to temporarily @@ -8262,12 +9986,21 @@ ChangeSet@1.1379.2.24, 2006-09-10 20:47:32-04:00, stenn@whimsy.udel.edu +29 -0 libopts/autoopts.h@1.5, 2006-09-10 20:46:57-04:00, stenn@whimsy.udel.edu +8 -7 libopts-27.4.3 updates + libopts/autoopts/options.h@1.5, 2006-09-10 20:47:14-04:00, stenn@whimsy.udel.edu +3 -3 + libopts-27.4.3 updates + + libopts/autoopts/usage-txt.h@1.4, 2006-09-10 20:47:15-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.4.3 updates + libopts/boolean.c@1.4, 2006-09-10 20:46:58-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates libopts/compat/compat.h@1.8, 2006-09-10 20:47:16-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates + libopts/compat/pathfind.c@1.5, 2006-09-10 20:47:17-04:00, stenn@whimsy.udel.edu +2 -2 + libopts-27.4.3 updates + libopts/configfile.c@1.5, 2006-09-10 20:46:59-04:00, stenn@whimsy.udel.edu +5 -2 libopts-27.4.3 updates @@ -8286,10 +10019,10 @@ ChangeSet@1.1379.2.24, 2006-09-10 20:47:32-04:00, stenn@whimsy.udel.edu +29 -0 libopts/genshell.h@1.4, 2006-09-10 20:47:03-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates - libopts/m4/libopts.m4@1.9, 2006-09-10 20:47:17-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/load.c@1.5, 2006-09-10 20:47:03-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates - libopts/load.c@1.5, 2006-09-10 20:47:03-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/m4/libopts.m4@1.9, 2006-09-10 20:47:17-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates libopts/makeshell.c@1.6, 2006-09-10 20:47:05-04:00, stenn@whimsy.udel.edu +1 -1 @@ -8301,12 +10034,6 @@ ChangeSet@1.1379.2.24, 2006-09-10 20:47:32-04:00, stenn@whimsy.udel.edu +29 -0 libopts/numeric.c@1.4, 2006-09-10 20:47:06-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates - libopts/autoopts/options.h@1.5, 2006-09-10 20:47:14-04:00, stenn@whimsy.udel.edu +3 -3 - libopts-27.4.3 updates - - libopts/compat/pathfind.c@1.5, 2006-09-10 20:47:17-04:00, stenn@whimsy.udel.edu +2 -2 - libopts-27.4.3 updates - libopts/pgusage.c@1.5, 2006-09-10 20:47:06-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates @@ -8334,9 +10061,6 @@ ChangeSet@1.1379.2.24, 2006-09-10 20:47:32-04:00, stenn@whimsy.udel.edu +29 -0 libopts/text_mmap.c@1.4, 2006-09-10 20:47:12-04:00, stenn@whimsy.udel.edu +3 -8 libopts-27.4.3 updates - libopts/autoopts/usage-txt.h@1.4, 2006-09-10 20:47:15-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.4.3 updates - libopts/usage.c@1.5, 2006-09-10 20:47:13-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 updates @@ -8534,12 +10258,24 @@ ChangeSet@1.1379.2.18, 2006-09-09 18:21:20-04:00, stenn@whimsy.udel.edu +30 -0 libopts/autoopts.c@1.4, 2006-09-09 18:20:43-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 + libopts/autoopts/options.h@1.4, 2006-09-09 18:20:57-04:00, stenn@whimsy.udel.edu +5 -5 + libopts-27.4.3 + + libopts/autoopts/usage-txt.h@1.3, 2006-09-09 18:20:58-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.4.3 + libopts/boolean.c@1.3, 2006-09-09 18:20:44-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 libopts/compat/compat.h@1.7, 2006-09-09 18:20:59-04:00, stenn@whimsy.udel.edu +3 -3 libopts-27.4.3 + libopts/compat/pathfind.c@1.4, 2006-09-09 18:21:00-04:00, stenn@whimsy.udel.edu +5 -5 + libopts-27.4.3 + + libopts/compat/windows-config.h@1.2, 2006-09-09 18:21:01-04:00, stenn@whimsy.udel.edu +4 -4 + libopts-27.4.3 + libopts/configfile.c@1.4, 2006-09-09 18:20:44-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 @@ -8558,10 +10294,10 @@ ChangeSet@1.1379.2.18, 2006-09-09 18:21:20-04:00, stenn@whimsy.udel.edu +30 -0 libopts/genshell.h@1.3, 2006-09-09 18:20:48-04:00, stenn@whimsy.udel.edu +6 -6 libopts-27.4.3 - libopts/m4/libopts.m4@1.8, 2006-09-09 18:21:01-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/load.c@1.4, 2006-09-09 18:20:48-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 - libopts/load.c@1.4, 2006-09-09 18:20:48-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/m4/libopts.m4@1.8, 2006-09-09 18:21:01-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 libopts/makeshell.c@1.5, 2006-09-09 18:20:48-04:00, stenn@whimsy.udel.edu +1 -1 @@ -8573,12 +10309,6 @@ ChangeSet@1.1379.2.18, 2006-09-09 18:21:20-04:00, stenn@whimsy.udel.edu +30 -0 libopts/numeric.c@1.3, 2006-09-09 18:20:50-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 - libopts/autoopts/options.h@1.4, 2006-09-09 18:20:57-04:00, stenn@whimsy.udel.edu +5 -5 - libopts-27.4.3 - - libopts/compat/pathfind.c@1.4, 2006-09-09 18:21:00-04:00, stenn@whimsy.udel.edu +5 -5 - libopts-27.4.3 - libopts/pgusage.c@1.4, 2006-09-09 18:20:51-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 @@ -8606,15 +10336,9 @@ ChangeSet@1.1379.2.18, 2006-09-09 18:21:20-04:00, stenn@whimsy.udel.edu +30 -0 libopts/text_mmap.c@1.3, 2006-09-09 18:20:56-04:00, stenn@whimsy.udel.edu +7 -7 libopts-27.4.3 - libopts/autoopts/usage-txt.h@1.3, 2006-09-09 18:20:58-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.4.3 - libopts/version.c@1.4, 2006-09-09 18:20:57-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.3 - libopts/compat/windows-config.h@1.2, 2006-09-09 18:21:01-04:00, stenn@whimsy.udel.edu +4 -4 - libopts-27.4.3 - ChangeSet@1.1379.5.1, 2006-09-09 05:19:19-04:00, stenn@whimsy.udel.edu +25 -0 NTP_4_2_3P41 TAG: NTP_4_2_3P41 @@ -9579,16 +11303,16 @@ ChangeSet@1.1353.9.37, 2006-08-18 03:33:56-04:00, stenn@whimsy.udel.edu +6 -0 libopts/autoopts.h@1.4, 2006-08-18 03:33:36-04:00, stenn@whimsy.udel.edu +12 -4 libopts upgrade - sntp/libopts/autoopts.h@1.4, 2006-08-18 03:33:38-04:00, stenn@whimsy.udel.edu +12 -4 - libopts upgrade - libopts/m4/libopts.m4@1.7, 2006-08-18 03:33:37-04:00, stenn@whimsy.udel.edu +4 -4 libopts upgrade - sntp/libopts/m4/libopts.m4@1.7, 2006-08-18 03:33:39-04:00, stenn@whimsy.udel.edu +4 -4 + libopts/usage.c@1.4, 2006-08-18 03:33:37-04:00, stenn@whimsy.udel.edu +3 -3 libopts upgrade - libopts/usage.c@1.4, 2006-08-18 03:33:37-04:00, stenn@whimsy.udel.edu +3 -3 + sntp/libopts/autoopts.h@1.4, 2006-08-18 03:33:38-04:00, stenn@whimsy.udel.edu +12 -4 + libopts upgrade + + sntp/libopts/m4/libopts.m4@1.7, 2006-08-18 03:33:39-04:00, stenn@whimsy.udel.edu +4 -4 libopts upgrade sntp/libopts/usage.c@1.4, 2006-08-18 03:33:39-04:00, stenn@whimsy.udel.edu +3 -3 @@ -10033,10 +11757,10 @@ ChangeSet@1.1353.13.3, 2006-08-10 01:02:20-04:00, stenn@whimsy.udel.edu +1 -0 ChangeSet@1.1353.13.2, 2006-08-10 00:57:53-04:00, stenn@whimsy.udel.edu +3 -0 [Bug 659] Get the latest windows patches for libopts - sntp/libopts/compat/compat.h@1.5, 2006-08-10 00:57:34-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/m4/libopts.m4@1.6, 2006-08-10 00:57:33-04:00, stenn@whimsy.udel.edu +2 -1 [Bug 659] Get the latest windows patches for liboptslibopts/compat/compat.h - libopts/m4/libopts.m4@1.6, 2006-08-10 00:57:33-04:00, stenn@whimsy.udel.edu +2 -1 + sntp/libopts/compat/compat.h@1.5, 2006-08-10 00:57:34-04:00, stenn@whimsy.udel.edu +1 -1 [Bug 659] Get the latest windows patches for liboptslibopts/compat/compat.h sntp/libopts/m4/libopts.m4@1.6, 2006-08-10 00:57:35-04:00, stenn@whimsy.udel.edu +2 -1 @@ -10512,46 +12236,46 @@ ChangeSet@1.1251.94.41, 2006-07-28 01:28:32-04:00, stenn@whimsy.udel.edu +1 -0 ChangeSet@1.1251.94.40, 2006-07-28 01:20:54-04:00, stenn@whimsy.udel.edu +2 -0 Ready for release - packageinfo.sh@1.27.14.1, 2006-07-28 01:20:39-04:00, stenn@whimsy.udel.edu +3 -3 + NEWS@1.50.1.5, 2006-07-28 01:20:39-04:00, stenn@whimsy.udel.edu +30 -27 Ready for release - NEWS@1.50.1.5, 2006-07-28 01:20:39-04:00, stenn@whimsy.udel.edu +30 -27 + packageinfo.sh@1.27.14.1, 2006-07-28 01:20:39-04:00, stenn@whimsy.udel.edu +3 -3 Ready for release ChangeSet@1.1353.1.89, 2006-07-28 00:57:01-04:00, stenn@whimsy.udel.edu +12 -0 libopts-27.4.2 - libopts/m4/libopts.m4@1.4, 2006-07-28 00:52:00-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/compat/snprintf.c@1.2, 2006-07-28 00:56:19-04:00, stenn@whimsy.udel.edu +28 -4 libopts-27.4.2 - sntp/libopts/m4/libopts.m4@1.4, 2006-07-28 00:55:02-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/m4/libopts.m4@1.4, 2006-07-28 00:52:00-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.2 libopts/makeshell.c@1.4, 2006-07-28 00:51:31-04:00, stenn@whimsy.udel.edu +9 -9 libopts-27.4.2 - sntp/libopts/makeshell.c@1.4, 2006-07-28 00:52:22-04:00, stenn@whimsy.udel.edu +9 -9 - libopts-27.4.2 - libopts/proto.h@1.4, 2006-07-28 00:51:32-04:00, stenn@whimsy.udel.edu +1 -1 libopts-27.4.2 - sntp/libopts/proto.h@1.4, 2006-07-28 00:52:24-04:00, stenn@whimsy.udel.edu +1 -1 - libopts-27.4.2 - - libopts/compat/snprintf.c@1.2, 2006-07-28 00:56:19-04:00, stenn@whimsy.udel.edu +28 -4 - libopts-27.4.2 - - sntp/libopts/compat/snprintf.c@1.2, 2006-07-28 00:52:33-04:00, stenn@whimsy.udel.edu +28 -4 - libopts-27.4.2 - libopts/streqvcmp.c@1.3, 2006-07-28 00:51:34-04:00, stenn@whimsy.udel.edu +3 -5 libopts-27.4.2 - sntp/libopts/streqvcmp.c@1.3, 2006-07-28 00:52:26-04:00, stenn@whimsy.udel.edu +3 -5 + libopts/version.c@1.3, 2006-07-28 00:51:35-04:00, stenn@whimsy.udel.edu +4 -8 libopts-27.4.2 - libopts/version.c@1.3, 2006-07-28 00:51:35-04:00, stenn@whimsy.udel.edu +4 -8 + sntp/libopts/compat/snprintf.c@1.2, 2006-07-28 00:52:33-04:00, stenn@whimsy.udel.edu +28 -4 + libopts-27.4.2 + + sntp/libopts/m4/libopts.m4@1.4, 2006-07-28 00:55:02-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.4.2 + + sntp/libopts/makeshell.c@1.4, 2006-07-28 00:52:22-04:00, stenn@whimsy.udel.edu +9 -9 + libopts-27.4.2 + + sntp/libopts/proto.h@1.4, 2006-07-28 00:52:24-04:00, stenn@whimsy.udel.edu +1 -1 + libopts-27.4.2 + + sntp/libopts/streqvcmp.c@1.3, 2006-07-28 00:52:26-04:00, stenn@whimsy.udel.edu +3 -5 libopts-27.4.2 sntp/libopts/version.c@1.3, 2006-07-28 00:52:27-04:00, stenn@whimsy.udel.edu +4 -8 @@ -10654,121 +12378,22 @@ ChangeSet@1.1353.1.78, 2006-07-22 23:35:43-04:00, stenn@whimsy.udel.edu +42 -0 libopts/Makefile.am@1.3, 2006-07-22 23:28:42-04:00, stenn@whimsy.udel.edu +14 -14 Upgrade to libopts-27.4.2 - sntp/libopts/Makefile.am@1.3, 2006-07-22 23:34:06-04:00, stenn@whimsy.udel.edu +14 -14 - Upgrade to libopts-27.4.2 - libopts/autoopts.c@1.3, 2006-07-22 23:28:42-04:00, stenn@whimsy.udel.edu +7 -9 Upgrade to libopts-27.4.2 - sntp/libopts/autoopts.c@1.3, 2006-07-22 23:34:07-04:00, stenn@whimsy.udel.edu +7 -9 - Upgrade to libopts-27.4.2 - libopts/autoopts.h@1.3, 2006-07-22 23:28:43-04:00, stenn@whimsy.udel.edu +7 -8 Upgrade to libopts-27.4.2 - sntp/libopts/autoopts.h@1.3, 2006-07-22 23:34:07-04:00, stenn@whimsy.udel.edu +7 -8 - Upgrade to libopts-27.4.2 - - libopts/compat/compat.h@1.3, 2006-07-22 23:33:15-04:00, stenn@whimsy.udel.edu +25 -9 - Upgrade to libopts-27.4.2 - - sntp/libopts/compat/compat.h@1.3, 2006-07-22 23:34:19-04:00, stenn@whimsy.udel.edu +25 -9 - Upgrade to libopts-27.4.2 - - libopts/configfile.c@1.3, 2006-07-22 23:28:44-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - sntp/libopts/configfile.c@1.3, 2006-07-22 23:34:08-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - libopts/genshell.c@1.2, 2006-07-22 23:28:46-04:00, stenn@whimsy.udel.edu +50 -10 - Upgrade to libopts-27.4.2 - - sntp/libopts/genshell.c@1.2, 2006-07-22 23:34:10-04:00, stenn@whimsy.udel.edu +50 -10 - Upgrade to libopts-27.4.2 - - libopts/genshell.h@1.2, 2006-07-22 23:28:46-04:00, stenn@whimsy.udel.edu +21 -10 - Upgrade to libopts-27.4.2 - - sntp/libopts/genshell.h@1.2, 2006-07-22 23:34:10-04:00, stenn@whimsy.udel.edu +21 -10 - Upgrade to libopts-27.4.2 - - libopts/libopts.c@1.3, 2006-07-22 23:28:47-04:00, stenn@whimsy.udel.edu +0 -1 - Upgrade to libopts-27.4.2 - - sntp/libopts/libopts.c@1.3, 2006-07-22 23:34:11-04:00, stenn@whimsy.udel.edu +0 -1 - Upgrade to libopts-27.4.2 - - libopts/m4/libopts.m4@1.3, 2006-07-22 23:33:17-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - sntp/libopts/m4/libopts.m4@1.3, 2006-07-22 23:34:21-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - libopts/load.c@1.3, 2006-07-22 23:28:47-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - sntp/libopts/load.c@1.3, 2006-07-22 23:34:11-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - libopts/makeshell.c@1.3, 2006-07-22 23:28:48-04:00, stenn@whimsy.udel.edu +11 -2 - Upgrade to libopts-27.4.2 - - sntp/libopts/makeshell.c@1.3, 2006-07-22 23:34:12-04:00, stenn@whimsy.udel.edu +11 -2 - Upgrade to libopts-27.4.2 - libopts/autoopts/options.h@1.3, 2006-07-22 23:33:13-04:00, stenn@whimsy.udel.edu +64 -62 Upgrade to libopts-27.4.2 - sntp/libopts/autoopts/options.h@1.3, 2006-07-22 23:34:18-04:00, stenn@whimsy.udel.edu +64 -62 - Upgrade to libopts-27.4.2 - - libopts/compat/pathfind.c@1.3, 2006-07-22 23:33:15-04:00, stenn@whimsy.udel.edu +12 -3 - Upgrade to libopts-27.4.2 - - sntp/libopts/compat/pathfind.c@1.3, 2006-07-22 23:34:20-04:00, stenn@whimsy.udel.edu +12 -3 - Upgrade to libopts-27.4.2 - - libopts/pgusage.c@1.3, 2006-07-22 23:28:49-04:00, stenn@whimsy.udel.edu +7 -3 - Upgrade to libopts-27.4.2 - - sntp/libopts/pgusage.c@1.3, 2006-07-22 23:34:13-04:00, stenn@whimsy.udel.edu +7 -3 - Upgrade to libopts-27.4.2 - - libopts/proto.h@1.3, 2006-07-22 23:28:50-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - sntp/libopts/proto.h@1.3, 2006-07-22 23:34:13-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - libopts/putshell.c@1.3, 2006-07-22 23:28:50-04:00, stenn@whimsy.udel.edu +3 -3 - Upgrade to libopts-27.4.2 - - sntp/libopts/putshell.c@1.3, 2006-07-22 23:34:13-04:00, stenn@whimsy.udel.edu +3 -3 - Upgrade to libopts-27.4.2 - - libopts/save.c@1.3, 2006-07-22 23:28:51-04:00, stenn@whimsy.udel.edu +3 -3 - Upgrade to libopts-27.4.2 - - sntp/libopts/save.c@1.3, 2006-07-22 23:34:14-04:00, stenn@whimsy.udel.edu +3 -3 - Upgrade to libopts-27.4.2 - - libopts/stack.c@1.3, 2006-07-22 23:28:52-04:00, stenn@whimsy.udel.edu +5 -3 - Upgrade to libopts-27.4.2 - - sntp/libopts/stack.c@1.3, 2006-07-22 23:34:15-04:00, stenn@whimsy.udel.edu +5 -3 - Upgrade to libopts-27.4.2 - libopts/autoopts/usage-txt.h@1.2, 2006-07-22 23:33:14-04:00, stenn@whimsy.udel.edu +271 -395 Upgrade to libopts-27.4.2 - sntp/libopts/autoopts/usage-txt.h@1.2, 2006-07-22 23:34:19-04:00, stenn@whimsy.udel.edu +271 -395 + libopts/compat/compat.h@1.3, 2006-07-22 23:33:15-04:00, stenn@whimsy.udel.edu +25 -9 Upgrade to libopts-27.4.2 - libopts/usage.c@1.3, 2006-07-22 23:28:53-04:00, stenn@whimsy.udel.edu +1 -1 - Upgrade to libopts-27.4.2 - - sntp/libopts/usage.c@1.3, 2006-07-22 23:34:16-04:00, stenn@whimsy.udel.edu +1 -1 + libopts/compat/pathfind.c@1.3, 2006-07-22 23:33:15-04:00, stenn@whimsy.udel.edu +12 -3 Upgrade to libopts-27.4.2 libopts/compat/windows-config.h@1.1, 2006-07-22 23:27:32-04:00, stenn@whimsy.udel.edu +118 -0 @@ -10776,11 +12401,110 @@ ChangeSet@1.1353.1.78, 2006-07-22 23:35:43-04:00, stenn@whimsy.udel.edu +42 -0 libopts/compat/windows-config.h@1.0, 2006-07-22 23:27:32-04:00, stenn@whimsy.udel.edu +0 -0 + libopts/configfile.c@1.3, 2006-07-22 23:28:44-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + libopts/genshell.c@1.2, 2006-07-22 23:28:46-04:00, stenn@whimsy.udel.edu +50 -10 + Upgrade to libopts-27.4.2 + + libopts/genshell.h@1.2, 2006-07-22 23:28:46-04:00, stenn@whimsy.udel.edu +21 -10 + Upgrade to libopts-27.4.2 + + libopts/libopts.c@1.3, 2006-07-22 23:28:47-04:00, stenn@whimsy.udel.edu +0 -1 + Upgrade to libopts-27.4.2 + + libopts/load.c@1.3, 2006-07-22 23:28:47-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + libopts/m4/libopts.m4@1.3, 2006-07-22 23:33:17-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + libopts/makeshell.c@1.3, 2006-07-22 23:28:48-04:00, stenn@whimsy.udel.edu +11 -2 + Upgrade to libopts-27.4.2 + + libopts/pgusage.c@1.3, 2006-07-22 23:28:49-04:00, stenn@whimsy.udel.edu +7 -3 + Upgrade to libopts-27.4.2 + + libopts/proto.h@1.3, 2006-07-22 23:28:50-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + libopts/putshell.c@1.3, 2006-07-22 23:28:50-04:00, stenn@whimsy.udel.edu +3 -3 + Upgrade to libopts-27.4.2 + + libopts/save.c@1.3, 2006-07-22 23:28:51-04:00, stenn@whimsy.udel.edu +3 -3 + Upgrade to libopts-27.4.2 + + libopts/stack.c@1.3, 2006-07-22 23:28:52-04:00, stenn@whimsy.udel.edu +5 -3 + Upgrade to libopts-27.4.2 + + libopts/usage.c@1.3, 2006-07-22 23:28:53-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + sntp/libopts/Makefile.am@1.3, 2006-07-22 23:34:06-04:00, stenn@whimsy.udel.edu +14 -14 + Upgrade to libopts-27.4.2 + + sntp/libopts/autoopts.c@1.3, 2006-07-22 23:34:07-04:00, stenn@whimsy.udel.edu +7 -9 + Upgrade to libopts-27.4.2 + + sntp/libopts/autoopts.h@1.3, 2006-07-22 23:34:07-04:00, stenn@whimsy.udel.edu +7 -8 + Upgrade to libopts-27.4.2 + + sntp/libopts/autoopts/options.h@1.3, 2006-07-22 23:34:18-04:00, stenn@whimsy.udel.edu +64 -62 + Upgrade to libopts-27.4.2 + + sntp/libopts/autoopts/usage-txt.h@1.2, 2006-07-22 23:34:19-04:00, stenn@whimsy.udel.edu +271 -395 + Upgrade to libopts-27.4.2 + + sntp/libopts/compat/compat.h@1.3, 2006-07-22 23:34:19-04:00, stenn@whimsy.udel.edu +25 -9 + Upgrade to libopts-27.4.2 + + sntp/libopts/compat/pathfind.c@1.3, 2006-07-22 23:34:20-04:00, stenn@whimsy.udel.edu +12 -3 + Upgrade to libopts-27.4.2 + sntp/libopts/compat/windows-config.h@1.1, 2006-07-22 23:27:32-04:00, stenn@whimsy.udel.edu +118 -0 BitKeeper file /deacon/backroom/ntp-dev/sntp/libopts/compat/windows-config.h sntp/libopts/compat/windows-config.h@1.0, 2006-07-22 23:27:32-04:00, stenn@whimsy.udel.edu +0 -0 + sntp/libopts/configfile.c@1.3, 2006-07-22 23:34:08-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + sntp/libopts/genshell.c@1.2, 2006-07-22 23:34:10-04:00, stenn@whimsy.udel.edu +50 -10 + Upgrade to libopts-27.4.2 + + sntp/libopts/genshell.h@1.2, 2006-07-22 23:34:10-04:00, stenn@whimsy.udel.edu +21 -10 + Upgrade to libopts-27.4.2 + + sntp/libopts/libopts.c@1.3, 2006-07-22 23:34:11-04:00, stenn@whimsy.udel.edu +0 -1 + Upgrade to libopts-27.4.2 + + sntp/libopts/load.c@1.3, 2006-07-22 23:34:11-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + sntp/libopts/m4/libopts.m4@1.3, 2006-07-22 23:34:21-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + sntp/libopts/makeshell.c@1.3, 2006-07-22 23:34:12-04:00, stenn@whimsy.udel.edu +11 -2 + Upgrade to libopts-27.4.2 + + sntp/libopts/pgusage.c@1.3, 2006-07-22 23:34:13-04:00, stenn@whimsy.udel.edu +7 -3 + Upgrade to libopts-27.4.2 + + sntp/libopts/proto.h@1.3, 2006-07-22 23:34:13-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + + sntp/libopts/putshell.c@1.3, 2006-07-22 23:34:13-04:00, stenn@whimsy.udel.edu +3 -3 + Upgrade to libopts-27.4.2 + + sntp/libopts/save.c@1.3, 2006-07-22 23:34:14-04:00, stenn@whimsy.udel.edu +3 -3 + Upgrade to libopts-27.4.2 + + sntp/libopts/stack.c@1.3, 2006-07-22 23:34:15-04:00, stenn@whimsy.udel.edu +5 -3 + Upgrade to libopts-27.4.2 + + sntp/libopts/usage.c@1.3, 2006-07-22 23:34:16-04:00, stenn@whimsy.udel.edu +1 -1 + Upgrade to libopts-27.4.2 + ChangeSet@1.1353.1.77, 2006-07-22 10:12:26+00:00, kardel@pogo.udel.edu +2 -0 ntp_io.c: move debug level for most interface based activity up to 3 and 4 @@ -11125,11 +12849,6 @@ ChangeSet@1.1353.1.50, 2006-07-07 05:53:15-04:00, stenn@whimsy.udel.edu +11 -0 libopts/m4/libtool.m4@1.0, 2006-07-07 05:51:53-04:00, stenn@whimsy.udel.edu +0 -0 - sntp/libopts/m4/libtool.m4@1.1, 2006-07-07 05:51:56-04:00, stenn@whimsy.udel.edu +6397 -0 - BitKeeper file /deacon/backroom/ntp-dev/sntp/libopts/m4/libtool.m4 - - sntp/libopts/m4/libtool.m4@1.0, 2006-07-07 05:51:56-04:00, stenn@whimsy.udel.edu +0 -0 - ltmain.sh@1.1, 2006-07-07 05:51:57-04:00, stenn@whimsy.udel.edu +6863 -0 BitKeeper file /deacon/backroom/ntp-dev/ltmain.sh @@ -11150,6 +12869,11 @@ ChangeSet@1.1353.1.50, 2006-07-07 05:53:15-04:00, stenn@whimsy.udel.edu +11 -0 ntpq/ntpq-opts.def@1.7, 2006-07-07 05:49:45-04:00, stenn@whimsy.udel.edu +0 -0 Change mode to -rw-rw-r-- + sntp/libopts/m4/libtool.m4@1.1, 2006-07-07 05:51:56-04:00, stenn@whimsy.udel.edu +6397 -0 + BitKeeper file /deacon/backroom/ntp-dev/sntp/libopts/m4/libtool.m4 + + sntp/libopts/m4/libtool.m4@1.0, 2006-07-07 05:51:56-04:00, stenn@whimsy.udel.edu +0 -0 + sntp/ltmain.sh@1.1, 2006-07-07 05:51:55-04:00, stenn@whimsy.udel.edu +6863 -0 BitKeeper file /deacon/backroom/ntp-dev/sntp/ltmain.sh @@ -11176,176 +12900,176 @@ ChangeSet@1.1353.1.48, 2006-07-03 19:05:18-04:00, stenn@deacon.udel.edu +58 -0 libopts/Makefile.am@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +10 -10 Upgrade to libopts-27.3.2 - sntp/libopts/Makefile.am@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +10 -10 - Upgrade to libopts-27.3.2 - libopts/autoopts.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +9 -5 Upgrade to libopts-27.3.2 - sntp/libopts/autoopts.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +9 -5 - Upgrade to libopts-27.3.2 - libopts/autoopts.h@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +15 -7 Upgrade to libopts-27.3.2 - sntp/libopts/autoopts.h@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +15 -7 - Upgrade to libopts-27.3.2 - libopts/boolean.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +1 -1 Upgrade to libopts-27.3.2 - sntp/libopts/boolean.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - libopts/compat/compat.h@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +5 -2 Upgrade to libopts-27.3.2 - sntp/libopts/compat/compat.h@1.2, 2006-07-03 18:57:07-04:00, stenn@deacon.udel.edu +5 -2 - Upgrade to libopts-27.3.2 - - libopts/configfile.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +6 -6 - Upgrade to libopts-27.3.2 - - sntp/libopts/configfile.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +6 -6 - Upgrade to libopts-27.3.2 - - libopts/cook.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +6 -6 - Upgrade to libopts-27.3.2 - - sntp/libopts/cook.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +6 -6 - Upgrade to libopts-27.3.2 - - libopts/enumeration.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +8 -8 - Upgrade to libopts-27.3.2 - - sntp/libopts/enumeration.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +8 -8 - Upgrade to libopts-27.3.2 - - libopts/environment.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - - sntp/libopts/environment.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - - libopts/libopts.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -0 - Upgrade to libopts-27.3.2 - - sntp/libopts/libopts.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -0 - Upgrade to libopts-27.3.2 - - libopts/m4/libopts.m4@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +6 -13 - Upgrade to libopts-27.3.2 - - sntp/libopts/m4/libopts.m4@1.2, 2006-07-03 18:57:07-04:00, stenn@deacon.udel.edu +6 -13 - Upgrade to libopts-27.3.2 - - libopts/load.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +7 -7 - Upgrade to libopts-27.3.2 - - sntp/libopts/load.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +7 -7 - Upgrade to libopts-27.3.2 - - libopts/makeshell.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +10 -10 - Upgrade to libopts-27.3.2 - - sntp/libopts/makeshell.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +10 -10 - Upgrade to libopts-27.3.2 - - libopts/nested.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - - sntp/libopts/nested.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - - libopts/numeric.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - - sntp/libopts/numeric.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - libopts/compat/pathfind.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +2 -2 Upgrade to libopts-27.3.2 - sntp/libopts/compat/pathfind.c@1.2, 2006-07-03 18:57:07-04:00, stenn@deacon.udel.edu +2 -2 - Upgrade to libopts-27.3.2 - - libopts/pgusage.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +3 -3 - Upgrade to libopts-27.3.2 - - sntp/libopts/pgusage.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +3 -3 - Upgrade to libopts-27.3.2 - - libopts/proto.h@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +2 -2 - Upgrade to libopts-27.3.2 - - sntp/libopts/proto.h@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +2 -2 - Upgrade to libopts-27.3.2 - - libopts/putshell.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +8 -8 - Upgrade to libopts-27.3.2 - - sntp/libopts/putshell.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +8 -8 - Upgrade to libopts-27.3.2 - - libopts/restore.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - - sntp/libopts/restore.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 - Upgrade to libopts-27.3.2 - - libopts/save.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +7 -7 - Upgrade to libopts-27.3.2 - - sntp/libopts/save.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +7 -7 - Upgrade to libopts-27.3.2 - - libopts/sort.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +4 -4 - Upgrade to libopts-27.3.2 - - sntp/libopts/sort.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +4 -4 - Upgrade to libopts-27.3.2 - - libopts/stack.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +41 -2 - Upgrade to libopts-27.3.2 - - sntp/libopts/stack.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +41 -2 - Upgrade to libopts-27.3.2 - libopts/compat/strchr.c@1.1, 2006-07-03 18:55:11-04:00, stenn@deacon.udel.edu +61 -0 libopts/compat/strchr.c@1.0, 2006-07-03 18:55:11-04:00, stenn@deacon.udel.edu +0 -0 BitKeeper file /deacon/backroom/ntp-dev/libopts/compat/strchr.c - sntp/libopts/compat/strchr.c@1.1, 2006-07-03 18:55:11-04:00, stenn@deacon.udel.edu +61 -0 - - sntp/libopts/compat/strchr.c@1.0, 2006-07-03 18:55:11-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev/sntp/libopts/compat/strchr.c - - libopts/streqvcmp.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 + libopts/configfile.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +6 -6 Upgrade to libopts-27.3.2 - sntp/libopts/streqvcmp.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 + libopts/cook.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +6 -6 + Upgrade to libopts-27.3.2 + + libopts/enumeration.c@1.2, 2006-07-03 18:57:04-04:00, stenn@deacon.udel.edu +8 -8 + Upgrade to libopts-27.3.2 + + libopts/environment.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + libopts/libopts.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -0 + Upgrade to libopts-27.3.2 + + libopts/load.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +7 -7 + Upgrade to libopts-27.3.2 + + libopts/m4/libopts.m4@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +6 -13 + Upgrade to libopts-27.3.2 + + libopts/makeshell.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +10 -10 + Upgrade to libopts-27.3.2 + + libopts/nested.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + libopts/numeric.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + libopts/pgusage.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +3 -3 + Upgrade to libopts-27.3.2 + + libopts/proto.h@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +2 -2 + Upgrade to libopts-27.3.2 + + libopts/putshell.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +8 -8 + Upgrade to libopts-27.3.2 + + libopts/restore.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + libopts/save.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +7 -7 + Upgrade to libopts-27.3.2 + + libopts/sort.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +4 -4 + Upgrade to libopts-27.3.2 + + libopts/stack.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +41 -2 + Upgrade to libopts-27.3.2 + + libopts/streqvcmp.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 Upgrade to libopts-27.3.2 libopts/text_mmap.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +3 -3 Upgrade to libopts-27.3.2 - sntp/libopts/text_mmap.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +3 -3 - Upgrade to libopts-27.3.2 - libopts/tokenize.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +3 -3 Upgrade to libopts-27.3.2 - sntp/libopts/tokenize.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +3 -3 - Upgrade to libopts-27.3.2 - libopts/usage.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +11 -11 Upgrade to libopts-27.3.2 - sntp/libopts/usage.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +11 -11 + libopts/version.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 Upgrade to libopts-27.3.2 - libopts/version.c@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +1 -1 + sntp/libopts/Makefile.am@1.2, 2006-07-03 18:57:05-04:00, stenn@deacon.udel.edu +10 -10 + Upgrade to libopts-27.3.2 + + sntp/libopts/autoopts.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +9 -5 + Upgrade to libopts-27.3.2 + + sntp/libopts/autoopts.h@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +15 -7 + Upgrade to libopts-27.3.2 + + sntp/libopts/boolean.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + sntp/libopts/compat/compat.h@1.2, 2006-07-03 18:57:07-04:00, stenn@deacon.udel.edu +5 -2 + Upgrade to libopts-27.3.2 + + sntp/libopts/compat/pathfind.c@1.2, 2006-07-03 18:57:07-04:00, stenn@deacon.udel.edu +2 -2 + Upgrade to libopts-27.3.2 + + sntp/libopts/compat/strchr.c@1.1, 2006-07-03 18:55:11-04:00, stenn@deacon.udel.edu +61 -0 + + sntp/libopts/compat/strchr.c@1.0, 2006-07-03 18:55:11-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev/sntp/libopts/compat/strchr.c + + sntp/libopts/configfile.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +6 -6 + Upgrade to libopts-27.3.2 + + sntp/libopts/cook.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +6 -6 + Upgrade to libopts-27.3.2 + + sntp/libopts/enumeration.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +8 -8 + Upgrade to libopts-27.3.2 + + sntp/libopts/environment.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + sntp/libopts/libopts.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -0 + Upgrade to libopts-27.3.2 + + sntp/libopts/load.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +7 -7 + Upgrade to libopts-27.3.2 + + sntp/libopts/m4/libopts.m4@1.2, 2006-07-03 18:57:07-04:00, stenn@deacon.udel.edu +6 -13 + Upgrade to libopts-27.3.2 + + sntp/libopts/makeshell.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +10 -10 + Upgrade to libopts-27.3.2 + + sntp/libopts/nested.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + sntp/libopts/numeric.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + sntp/libopts/pgusage.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +3 -3 + Upgrade to libopts-27.3.2 + + sntp/libopts/proto.h@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +2 -2 + Upgrade to libopts-27.3.2 + + sntp/libopts/putshell.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +8 -8 + Upgrade to libopts-27.3.2 + + sntp/libopts/restore.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + sntp/libopts/save.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +7 -7 + Upgrade to libopts-27.3.2 + + sntp/libopts/sort.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +4 -4 + Upgrade to libopts-27.3.2 + + sntp/libopts/stack.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +41 -2 + Upgrade to libopts-27.3.2 + + sntp/libopts/streqvcmp.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +1 -1 + Upgrade to libopts-27.3.2 + + sntp/libopts/text_mmap.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +3 -3 + Upgrade to libopts-27.3.2 + + sntp/libopts/tokenize.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +3 -3 + Upgrade to libopts-27.3.2 + + sntp/libopts/usage.c@1.2, 2006-07-03 18:57:06-04:00, stenn@deacon.udel.edu +11 -11 Upgrade to libopts-27.3.2 sntp/libopts/version.c@1.2, 2006-07-03 18:57:07-04:00, stenn@deacon.udel.edu +1 -1 @@ -11369,396 +13093,6 @@ ChangeSet@1.1353.1.46, 2006-07-03 00:13:59-04:00, stenn@deacon.udel.edu +2 -0 ChangeSet@1.1353.1.45, 2006-06-30 01:03:52-04:00, stenn@deacon.udel.edu +111 -0 Check in libopts and autgen-generated files - libopts/COPYING.lgpl@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +502 -0 - - libopts/COPYING.lgpl@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/COPYING.lgpl - - sntp/libopts/COPYING.lgpl@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +502 -0 - - sntp/libopts/COPYING.lgpl@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/COPYING.lgpl - - libopts/COPYING.mbsd@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +26 -0 - - libopts/COPYING.mbsd@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/COPYING.mbsd - - sntp/libopts/COPYING.mbsd@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +26 -0 - - sntp/libopts/COPYING.mbsd@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/COPYING.mbsd - - libopts/MakeDefs.inc@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - - libopts/MakeDefs.inc@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/MakeDefs.inc - - sntp/libopts/MakeDefs.inc@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - - sntp/libopts/MakeDefs.inc@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/MakeDefs.inc - - libopts/Makefile.am@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +20 -0 - - libopts/Makefile.am@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/Makefile.am - - sntp/libopts/Makefile.am@1.1, 2006-06-30 01:00:05-04:00, stenn@deacon.udel.edu +20 -0 - - sntp/libopts/Makefile.am@1.0, 2006-06-30 01:00:05-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/Makefile.am - - libopts/README@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +93 -0 - - libopts/README@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/README - - sntp/libopts/README@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +93 -0 - - sntp/libopts/README@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/README - - libopts/autoopts.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +1043 -0 - - libopts/autoopts.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts.c - - sntp/libopts/autoopts.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +1043 -0 - - sntp/libopts/autoopts.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts.c - - libopts/autoopts.h@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +321 -0 - - libopts/autoopts.h@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts.h - - sntp/libopts/autoopts.h@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +321 -0 - - sntp/libopts/autoopts.h@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts.h - - libopts/boolean.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +102 -0 - - libopts/boolean.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/boolean.c - - sntp/libopts/boolean.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +102 -0 - - sntp/libopts/boolean.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/boolean.c - - libopts/compat/compat.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +292 -0 - - libopts/compat/compat.h@1.0, 2006-06-30 00:55:13-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/compat.h - - sntp/libopts/compat/compat.h@1.1, 2006-06-30 01:00:01-04:00, stenn@deacon.udel.edu +292 -0 - - sntp/libopts/compat/compat.h@1.0, 2006-06-30 01:00:01-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/compat.h - - libopts/configfile.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +1277 -0 - - libopts/configfile.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/configfile.c - - sntp/libopts/configfile.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +1277 -0 - - sntp/libopts/configfile.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/configfile.c - - libopts/cook.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +355 -0 - - libopts/cook.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/cook.c - - sntp/libopts/cook.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +355 -0 - - sntp/libopts/cook.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/cook.c - - libopts/enumeration.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +485 -0 - - libopts/enumeration.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/enumeration.c - - sntp/libopts/enumeration.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +485 -0 - - sntp/libopts/enumeration.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/enumeration.c - - libopts/environment.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +261 -0 - - libopts/environment.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/environment.c - - sntp/libopts/environment.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +261 -0 - - sntp/libopts/environment.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/environment.c - - libopts/genshell.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +301 -0 - - libopts/genshell.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/genshell.c - - sntp/libopts/genshell.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +301 -0 - - sntp/libopts/genshell.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/genshell.c - - libopts/genshell.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +142 -0 - - libopts/genshell.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/genshell.h - - sntp/libopts/genshell.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +142 -0 - - sntp/libopts/genshell.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/genshell.h - - libopts/libopts.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +30 -0 - - libopts/libopts.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/libopts.c - - sntp/libopts/libopts.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +30 -0 - - sntp/libopts/libopts.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/libopts.c - - libopts/m4/libopts.m4@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +487 -0 - - libopts/m4/libopts.m4@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/m4/libopts.m4 - - sntp/libopts/m4/libopts.m4@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +487 -0 - - sntp/libopts/m4/libopts.m4@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/m4/libopts.m4 - - libopts/m4/liboptschk.m4@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +39 -0 - - libopts/m4/liboptschk.m4@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/m4/liboptschk.m4 - - sntp/libopts/m4/liboptschk.m4@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +39 -0 - - sntp/libopts/m4/liboptschk.m4@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/m4/liboptschk.m4 - - libopts/load.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +520 -0 - - libopts/load.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/load.c - - sntp/libopts/load.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +520 -0 - - sntp/libopts/load.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/load.c - - libopts/makeshell.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +1100 -0 - - libopts/makeshell.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/makeshell.c - - sntp/libopts/makeshell.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +1100 -0 - - sntp/libopts/makeshell.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/makeshell.c - - libopts/nested.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +705 -0 - - libopts/nested.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/nested.c - - sntp/libopts/nested.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +705 -0 - - sntp/libopts/nested.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/nested.c - - libopts/numeric.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +89 -0 - - libopts/numeric.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/numeric.c - - sntp/libopts/numeric.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +89 -0 - - sntp/libopts/numeric.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/numeric.c - - libopts/autoopts/options.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +908 -0 - - libopts/autoopts/options.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts/options.h - - sntp/libopts/autoopts/options.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +908 -0 - - sntp/libopts/autoopts/options.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts/options.h - - libopts/compat/pathfind.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +330 -0 - - libopts/compat/pathfind.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/pathfind.c - - sntp/libopts/compat/pathfind.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +330 -0 - - sntp/libopts/compat/pathfind.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/pathfind.c - - libopts/pgusage.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +154 -0 - - libopts/pgusage.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/pgusage.c - - sntp/libopts/pgusage.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +154 -0 - - sntp/libopts/pgusage.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/pgusage.c - - libopts/proto.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +88 -0 - - libopts/proto.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/proto.h - - sntp/libopts/proto.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +88 -0 - - sntp/libopts/proto.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/proto.h - - libopts/putshell.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +333 -0 - - libopts/putshell.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/putshell.c - - sntp/libopts/putshell.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +333 -0 - - sntp/libopts/putshell.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/putshell.c - - libopts/restore.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +207 -0 - - libopts/restore.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/restore.c - - sntp/libopts/restore.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +207 -0 - - sntp/libopts/restore.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/restore.c - - libopts/save.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +499 -0 - - libopts/save.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/save.c - - sntp/libopts/save.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +499 -0 - - sntp/libopts/save.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/save.c - - libopts/compat/snprintf.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +36 -0 - - libopts/compat/snprintf.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/snprintf.c - - sntp/libopts/compat/snprintf.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +36 -0 - - sntp/libopts/compat/snprintf.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/snprintf.c - - libopts/sort.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +369 -0 - - libopts/sort.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/sort.c - - sntp/libopts/sort.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +369 -0 - - sntp/libopts/sort.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/sort.c - - libopts/stack.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +224 -0 - - libopts/stack.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/stack.c - - sntp/libopts/stack.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +224 -0 - - sntp/libopts/stack.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/stack.c - - libopts/compat/strdup.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +19 -0 - - libopts/compat/strdup.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/strdup.c - - sntp/libopts/compat/strdup.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +19 -0 - - sntp/libopts/compat/strdup.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/strdup.c - - libopts/streqvcmp.c@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +292 -0 - - libopts/streqvcmp.c@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/streqvcmp.c - - sntp/libopts/streqvcmp.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +292 -0 - - sntp/libopts/streqvcmp.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/streqvcmp.c - - libopts/text_mmap.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +367 -0 - - libopts/text_mmap.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/text_mmap.c - - sntp/libopts/text_mmap.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +367 -0 - - sntp/libopts/text_mmap.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/text_mmap.c - - libopts/tokenize.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +322 -0 - - libopts/tokenize.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/tokenize.c - - sntp/libopts/tokenize.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +322 -0 - - sntp/libopts/tokenize.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/tokenize.c - - libopts/autoopts/usage-txt.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +479 -0 - - libopts/autoopts/usage-txt.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts/usage-txt.h - - sntp/libopts/autoopts/usage-txt.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +479 -0 - - sntp/libopts/autoopts/usage-txt.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts/usage-txt.h - - libopts/usage.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +732 -0 - - libopts/usage.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/usage.c - - sntp/libopts/usage.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +732 -0 - - sntp/libopts/usage.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/usage.c - - libopts/version.c@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +181 -0 - - libopts/version.c@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/version.c - - sntp/libopts/version.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +181 -0 - - sntp/libopts/version.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/version.c - BitKeeper/etc/ignore@1.52, 2006-06-30 01:03:43-04:00, stenn@deacon.udel.edu +12 -12 Check in libopts and autgen-generated files @@ -11775,6 +13109,201 @@ ChangeSet@1.1353.1.45, 2006-06-30 01:03:52-04:00, stenn@deacon.udel.edu +111 -0 clockstuff/clktest-opts.h@1.0, 2006-06-30 00:58:06-04:00, stenn@deacon.udel.edu +0 -0 BitKeeper file /deacon/backroom/ntp-dev-hms/clockstuff/clktest-opts.h + libopts/COPYING.lgpl@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +502 -0 + + libopts/COPYING.lgpl@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/COPYING.lgpl + + libopts/COPYING.mbsd@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +26 -0 + + libopts/COPYING.mbsd@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/COPYING.mbsd + + libopts/MakeDefs.inc@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + + libopts/MakeDefs.inc@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/MakeDefs.inc + + libopts/Makefile.am@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +20 -0 + + libopts/Makefile.am@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/Makefile.am + + libopts/README@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +93 -0 + + libopts/README@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/README + + libopts/autoopts.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +1043 -0 + + libopts/autoopts.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts.c + + libopts/autoopts.h@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +321 -0 + + libopts/autoopts.h@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts.h + + libopts/autoopts/options.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +908 -0 + + libopts/autoopts/options.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts/options.h + + libopts/autoopts/usage-txt.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +479 -0 + + libopts/autoopts/usage-txt.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/autoopts/usage-txt.h + + libopts/boolean.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +102 -0 + + libopts/boolean.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/boolean.c + + libopts/compat/compat.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +292 -0 + + libopts/compat/compat.h@1.0, 2006-06-30 00:55:13-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/compat.h + + libopts/compat/pathfind.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +330 -0 + + libopts/compat/pathfind.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/pathfind.c + + libopts/compat/snprintf.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +36 -0 + + libopts/compat/snprintf.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/snprintf.c + + libopts/compat/strdup.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +19 -0 + + libopts/compat/strdup.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/compat/strdup.c + + libopts/configfile.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +1277 -0 + + libopts/configfile.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/configfile.c + + libopts/cook.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +355 -0 + + libopts/cook.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/cook.c + + libopts/enumeration.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +485 -0 + + libopts/enumeration.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/enumeration.c + + libopts/environment.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +261 -0 + + libopts/environment.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/environment.c + + libopts/genshell.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +301 -0 + + libopts/genshell.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/genshell.c + + libopts/genshell.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +142 -0 + + libopts/genshell.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/genshell.h + + libopts/libopts.c@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +30 -0 + + libopts/libopts.c@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/libopts.c + + libopts/load.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +520 -0 + + libopts/load.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/load.c + + libopts/m4/libopts.m4@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +487 -0 + + libopts/m4/libopts.m4@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/m4/libopts.m4 + + libopts/m4/liboptschk.m4@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +39 -0 + + libopts/m4/liboptschk.m4@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/m4/liboptschk.m4 + + libopts/makeshell.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +1100 -0 + + libopts/makeshell.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/makeshell.c + + libopts/nested.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +705 -0 + + libopts/nested.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/nested.c + + libopts/numeric.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +89 -0 + + libopts/numeric.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/numeric.c + + libopts/pgusage.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +154 -0 + + libopts/pgusage.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/pgusage.c + + libopts/proto.h@1.1, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +88 -0 + + libopts/proto.h@1.0, 2006-06-30 00:55:14-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/proto.h + + libopts/putshell.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +333 -0 + + libopts/putshell.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/putshell.c + + libopts/restore.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +207 -0 + + libopts/restore.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/restore.c + + libopts/save.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +499 -0 + + libopts/save.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/save.c + + libopts/sort.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +369 -0 + + libopts/sort.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/sort.c + + libopts/stack.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +224 -0 + + libopts/stack.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/stack.c + + libopts/streqvcmp.c@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +292 -0 + + libopts/streqvcmp.c@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/streqvcmp.c + + libopts/text_mmap.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +367 -0 + + libopts/text_mmap.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/text_mmap.c + + libopts/tokenize.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +322 -0 + + libopts/tokenize.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/tokenize.c + + libopts/usage.c@1.1, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +732 -0 + + libopts/usage.c@1.0, 2006-06-30 00:55:15-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/usage.c + + libopts/version.c@1.1, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +181 -0 + + libopts/version.c@1.0, 2006-06-30 00:55:16-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/libopts/version.c + ntpd/ntpd-opts.c@1.1, 2006-06-30 00:56:22-04:00, stenn@deacon.udel.edu +975 -0 ntpd/ntpd-opts.c@1.0, 2006-06-30 00:56:22-04:00, stenn@deacon.udel.edu +0 -0 @@ -11875,6 +13404,201 @@ ChangeSet@1.1353.1.45, 2006-06-30 01:03:52-04:00, stenn@deacon.udel.edu +111 -0 ntpq/ntpq.1@1.0, 2006-06-30 00:56:43-04:00, stenn@deacon.udel.edu +0 -0 BitKeeper file /deacon/backroom/ntp-dev-hms/ntpq/ntpq.1 + sntp/libopts/COPYING.lgpl@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +502 -0 + + sntp/libopts/COPYING.lgpl@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/COPYING.lgpl + + sntp/libopts/COPYING.mbsd@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +26 -0 + + sntp/libopts/COPYING.mbsd@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/COPYING.mbsd + + sntp/libopts/MakeDefs.inc@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + + sntp/libopts/MakeDefs.inc@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/MakeDefs.inc + + sntp/libopts/Makefile.am@1.1, 2006-06-30 01:00:05-04:00, stenn@deacon.udel.edu +20 -0 + + sntp/libopts/Makefile.am@1.0, 2006-06-30 01:00:05-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/Makefile.am + + sntp/libopts/README@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +93 -0 + + sntp/libopts/README@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/README + + sntp/libopts/autoopts.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +1043 -0 + + sntp/libopts/autoopts.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts.c + + sntp/libopts/autoopts.h@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +321 -0 + + sntp/libopts/autoopts.h@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts.h + + sntp/libopts/autoopts/options.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +908 -0 + + sntp/libopts/autoopts/options.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts/options.h + + sntp/libopts/autoopts/usage-txt.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +479 -0 + + sntp/libopts/autoopts/usage-txt.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/autoopts/usage-txt.h + + sntp/libopts/boolean.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +102 -0 + + sntp/libopts/boolean.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/boolean.c + + sntp/libopts/compat/compat.h@1.1, 2006-06-30 01:00:01-04:00, stenn@deacon.udel.edu +292 -0 + + sntp/libopts/compat/compat.h@1.0, 2006-06-30 01:00:01-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/compat.h + + sntp/libopts/compat/pathfind.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +330 -0 + + sntp/libopts/compat/pathfind.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/pathfind.c + + sntp/libopts/compat/snprintf.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +36 -0 + + sntp/libopts/compat/snprintf.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/snprintf.c + + sntp/libopts/compat/strdup.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +19 -0 + + sntp/libopts/compat/strdup.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/compat/strdup.c + + sntp/libopts/configfile.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +1277 -0 + + sntp/libopts/configfile.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/configfile.c + + sntp/libopts/cook.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +355 -0 + + sntp/libopts/cook.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/cook.c + + sntp/libopts/enumeration.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +485 -0 + + sntp/libopts/enumeration.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/enumeration.c + + sntp/libopts/environment.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +261 -0 + + sntp/libopts/environment.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/environment.c + + sntp/libopts/genshell.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +301 -0 + + sntp/libopts/genshell.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/genshell.c + + sntp/libopts/genshell.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +142 -0 + + sntp/libopts/genshell.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/genshell.h + + sntp/libopts/libopts.c@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +30 -0 + + sntp/libopts/libopts.c@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/libopts.c + + sntp/libopts/load.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +520 -0 + + sntp/libopts/load.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/load.c + + sntp/libopts/m4/libopts.m4@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +487 -0 + + sntp/libopts/m4/libopts.m4@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/m4/libopts.m4 + + sntp/libopts/m4/liboptschk.m4@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +39 -0 + + sntp/libopts/m4/liboptschk.m4@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/m4/liboptschk.m4 + + sntp/libopts/makeshell.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +1100 -0 + + sntp/libopts/makeshell.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/makeshell.c + + sntp/libopts/nested.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +705 -0 + + sntp/libopts/nested.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/nested.c + + sntp/libopts/numeric.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +89 -0 + + sntp/libopts/numeric.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/numeric.c + + sntp/libopts/pgusage.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +154 -0 + + sntp/libopts/pgusage.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/pgusage.c + + sntp/libopts/proto.h@1.1, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +88 -0 + + sntp/libopts/proto.h@1.0, 2006-06-30 01:00:02-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/proto.h + + sntp/libopts/putshell.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +333 -0 + + sntp/libopts/putshell.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/putshell.c + + sntp/libopts/restore.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +207 -0 + + sntp/libopts/restore.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/restore.c + + sntp/libopts/save.c@1.1, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +499 -0 + + sntp/libopts/save.c@1.0, 2006-06-30 01:00:03-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/save.c + + sntp/libopts/sort.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +369 -0 + + sntp/libopts/sort.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/sort.c + + sntp/libopts/stack.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +224 -0 + + sntp/libopts/stack.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/stack.c + + sntp/libopts/streqvcmp.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +292 -0 + + sntp/libopts/streqvcmp.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/streqvcmp.c + + sntp/libopts/text_mmap.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +367 -0 + + sntp/libopts/text_mmap.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/text_mmap.c + + sntp/libopts/tokenize.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +322 -0 + + sntp/libopts/tokenize.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/tokenize.c + + sntp/libopts/usage.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +732 -0 + + sntp/libopts/usage.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/usage.c + + sntp/libopts/version.c@1.1, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +181 -0 + + sntp/libopts/version.c@1.0, 2006-06-30 01:00:04-04:00, stenn@deacon.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev-hms/sntp/libopts/version.c + sntp/sntp-opts.c@1.1, 2006-06-30 01:02:22-04:00, stenn@deacon.udel.edu +742 -0 sntp/sntp-opts.c@1.0, 2006-06-30 01:02:22-04:00, stenn@deacon.udel.edu +0 -0 @@ -12706,10 +14430,10 @@ ChangeSet@1.1251.80.72, 2006-06-05 21:31:04-04:00, stenn@whimsy.udel.edu +1 -0 ChangeSet@1.1251.80.71, 2006-06-05 19:53:12-04:00, stenn@whimsy.udel.edu +3 -0 ntp-4.2.2 - packageinfo.sh@1.27, 2006-06-05 19:22:00-04:00, stenn@whimsy.udel.edu +4 -4 + NEWS@1.50, 2006-06-05 19:21:53-04:00, stenn@whimsy.udel.edu +6 -1 Release ntp-4.2.2 - NEWS@1.50, 2006-06-05 19:21:53-04:00, stenn@whimsy.udel.edu +6 -1 + packageinfo.sh@1.27, 2006-06-05 19:22:00-04:00, stenn@whimsy.udel.edu +4 -4 Release ntp-4.2.2 scripts/VersionName@1.3, 2006-06-05 19:51:58-04:00, stenn@whimsy.udel.edu +1 -0 @@ -13309,16 +15033,16 @@ ChangeSet@1.1342, 2006-04-11 18:05:00-07:00, bkorb@bach.veritas.com +5 -0 ChangeSet@1.1251.84.1, 2006-04-11 04:49:33-04:00, stenn@whimsy.udel.edu +2 -0 release prep - packageinfo.sh@1.1, 2006-04-11 04:47:12-04:00, stenn@whimsy.udel.edu +19 -0 - - packageinfo.sh@1.0, 2006-04-11 04:47:12-04:00, stenn@whimsy.udel.edu +0 -0 - BitKeeper file /deacon/backroom/ntp-dev/packageinfo.sh - bootstrap@1.1, 2006-04-11 04:47:55-04:00, stenn@whimsy.udel.edu +59 -0 bootstrap@1.0, 2006-04-11 04:47:55-04:00, stenn@whimsy.udel.edu +0 -0 BitKeeper file /deacon/backroom/ntp-dev/bootstrap + packageinfo.sh@1.1, 2006-04-11 04:47:12-04:00, stenn@whimsy.udel.edu +19 -0 + + packageinfo.sh@1.0, 2006-04-11 04:47:12-04:00, stenn@whimsy.udel.edu +0 -0 + BitKeeper file /deacon/backroom/ntp-dev/packageinfo.sh + ChangeSet@1.1251.80.25, 2006-04-09 05:25:08-04:00, stenn@whimsy.udel.edu +3 -0 README* updates @@ -13334,6 +15058,12 @@ ChangeSet@1.1251.80.25, 2006-04-09 05:25:08-04:00, stenn@whimsy.udel.edu +3 -0 ChangeSet@1.1251.80.24, 2006-04-09 05:00:52-04:00, stenn@whimsy.udel.edu +5 -0 New release numbering style support + BitKeeper/deleted/.del-version.m4~4ef47e5fd0c38ddb@1.3.2.1, 2006-04-09 04:57:32-04:00, stenn@whimsy.udel.edu +0 -0 + Delete: version.m4 + + BitKeeper/etc/ignore@1.35.1.1, 2006-04-09 04:57:51-04:00, stenn@whimsy.udel.edu +2 -0 + added include/version.def version.m4 + bootstrap@1.2, 2006-04-09 04:58:41-04:00, stenn@whimsy.udel.edu +13 -11 cleanup @@ -13347,12 +15077,6 @@ ChangeSet@1.1251.80.24, 2006-04-09 05:00:52-04:00, stenn@whimsy.udel.edu +5 -0 packageinfo.sh@1.0, 2006-04-09 04:05:25-04:00, stenn@whimsy.udel.edu +0 -0 BitKeeper file /deacon/backroom/ntp-dev-hms/packageinfo.sh - BitKeeper/deleted/.del-version.m4~4ef47e5fd0c38ddb@1.3.2.1, 2006-04-09 04:57:32-04:00, stenn@whimsy.udel.edu +0 -0 - Delete: version.m4 - - BitKeeper/etc/ignore@1.35.1.1, 2006-04-09 04:57:51-04:00, stenn@whimsy.udel.edu +2 -0 - added include/version.def version.m4 - scripts/VersionName@1.1, 2006-04-09 04:51:47-04:00, stenn@whimsy.udel.edu +29 -0 scripts/VersionName@1.0, 2006-04-09 04:51:47-04:00, stenn@whimsy.udel.edu +0 -0 @@ -13379,12 +15103,12 @@ ChangeSet@1.1339, 2006-04-08 22:11:27-04:00, stenn@pogo.udel.edu +1 -0 ChangeSet@1.1338, 2006-04-08 00:50:08-04:00, stenn@pogo.udel.edu +2 -0 Test new release numbering and snapshot method - packageinfo.sh@1.2, 2006-04-08 00:49:59-04:00, stenn@pogo.udel.edu +4 -1 - Test new release numbering and snapshot method - BitKeeper/etc/ignore@1.48, 2006-04-08 00:49:18-04:00, stenn@pogo.udel.edu +2 -0 added version.m4 include/version.def + packageinfo.sh@1.2, 2006-04-08 00:49:59-04:00, stenn@pogo.udel.edu +4 -1 + Test new release numbering and snapshot method + ChangeSet@1.1251.80.23, 2006-04-04 03:16:32-04:00, stenn@deacon.udel.edu +1 -0 [Bug 588] logfile documentation problems @@ -13895,15 +15619,15 @@ ChangeSet@1.1324, 2006-01-12 18:23:36-05:00, stenn@pogo.udel.edu +3 -0 Makefile.am: Get libopts.m4 from the sntp/m4 subdir - bootstrap@1.8, 2006-01-12 18:21:48-05:00, stenn@pogo.udel.edu +0 -1 - Leave libopts.m4 in sntp/ - BitKeeper/deleted/.del-libopts.m4~ebff9cfbfbe104c8@1.7, 2006-01-12 18:22:02-05:00, stenn@pogo.udel.edu +97 -88 Delete: sntp/m4/libopts.m4 Makefile.am@1.57, 2006-01-12 18:21:25-05:00, stenn@pogo.udel.edu +1 -1 Get libopts.m4 from the sntp/m4 subdir + bootstrap@1.8, 2006-01-12 18:21:48-05:00, stenn@pogo.udel.edu +0 -1 + Leave libopts.m4 in sntp/ + ChangeSet@1.1323, 2006-01-12 06:00:55-05:00, stenn@pogo.udel.edu +1 -0 libopts.m4 is in m4/ now @@ -13993,15 +15717,21 @@ ChangeSet@1.1251.74.6, 2005-12-30 14:50:03-05:00, stenn@pogo.udel.edu +1 -0 ChangeSet@1.1319, 2005-12-30 14:07:38-05:00, stenn@pogo.udel.edu +2 -0 verbose bootstrap, lose m4/libopts.m4 - bootstrap@1.4, 2005-12-30 14:07:15-05:00, stenn@pogo.udel.edu +3 -2 - be verbose - BitKeeper/deleted/.del-libopts.m4~9f04cbceeedbd0cf@1.10, 2005-12-30 14:06:59-05:00, stenn@pogo.udel.edu +97 -88 Delete: m4/libopts.m4 + bootstrap@1.4, 2005-12-30 14:07:15-05:00, stenn@pogo.udel.edu +3 -2 + be verbose + ChangeSet@1.1318, 2005-12-29 01:38:14-05:00, stenn@pogo.udel.edu +4 -0 wiggles + BitKeeper/deleted/.del-version.m4~4ef47e5fd0c38ddb@1.4, 2005-12-29 01:36:03-05:00, stenn@pogo.udel.edu +0 -0 + Delete: version.m4 + + Makefile.am@1.56, 2005-12-29 01:37:08-05:00, stenn@pogo.udel.edu +16 -1 + wiggles + bootstrap@1.3, 2005-12-29 01:37:08-05:00, stenn@pogo.udel.edu +2 -20 wiggles @@ -14010,12 +15740,6 @@ ChangeSet@1.1318, 2005-12-29 01:38:14-05:00, stenn@pogo.udel.edu +4 -0 packageinfo.sh@1.0, 2005-12-29 01:35:53-05:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/packageinfo.sh - BitKeeper/deleted/.del-version.m4~4ef47e5fd0c38ddb@1.4, 2005-12-29 01:36:03-05:00, stenn@pogo.udel.edu +0 -0 - Delete: version.m4 - - Makefile.am@1.56, 2005-12-29 01:37:08-05:00, stenn@pogo.udel.edu +16 -1 - wiggles - ChangeSet@1.1251.74.5, 2005-12-27 19:50:58-05:00, stenn@deacon.udel.edu +1 -0 [Bug 543] Leap second warning in ONCORE driver, from Luis Batanero Guerrero @@ -14063,14 +15787,6 @@ ChangeSet@1.1316, 2005-12-23 13:56:31-08:00, bkorb@bach.veritas.com +51 -0 BitKeeper/deleted/.del-boolean.c~2a088bf49e080afe@1.3, 2005-12-23 12:11:02-08:00, bkorb@bach.veritas.com +0 -0 Delete: sntp/libopts/boolean.c - bootstrap@1.2, 2005-12-23 12:17:54-08:00, bkorb@bach.veritas.com +12 -0 - Add in the commands that were part of Makefile.am - - bootstrap@1.1, 2005-12-23 10:56:19-08:00, bkorb@bach.veritas.com +61 -0 - - bootstrap@1.0, 2005-12-23 10:56:19-08:00, bkorb@bach.veritas.com +0 -0 - BitKeeper file /home/bkorb/tools/ntp/ntp-dev-ag/bootstrap - BitKeeper/deleted/.del-compat.h~1cf561c3e113254d@1.7, 2005-12-23 12:11:25-08:00, bkorb@bach.veritas.com +0 -0 Delete: sntp/libopts/compat/compat.h @@ -14167,6 +15883,14 @@ ChangeSet@1.1316, 2005-12-23 13:56:31-08:00, bkorb@bach.veritas.com +51 -0 Makefile.am@1.55, 2005-12-23 12:17:32-08:00, bkorb@bach.veritas.com +1 -16 Move some commands out into the bootstrap script + bootstrap@1.2, 2005-12-23 12:17:54-08:00, bkorb@bach.veritas.com +12 -0 + Add in the commands that were part of Makefile.am + + bootstrap@1.1, 2005-12-23 10:56:19-08:00, bkorb@bach.veritas.com +61 -0 + + bootstrap@1.0, 2005-12-23 10:56:19-08:00, bkorb@bach.veritas.com +0 -0 + BitKeeper file /home/bkorb/tools/ntp/ntp-dev-ag/bootstrap + include/debug-opt.def@1.1, 2005-12-23 10:56:50-08:00, bkorb@bach.veritas.com +24 -0 include/debug-opt.def@1.0, 2005-12-23 10:56:50-08:00, bkorb@bach.veritas.com +0 -0 @@ -14278,13 +16002,22 @@ ChangeSet@1.1315, 2005-12-16 03:37:46-05:00, stenn@pogo.udel.edu +1 -0 ChangeSet@1.1314, 2005-12-15 06:34:59-05:00, stenn@pogo.udel.edu +9 -0 AutoGen stuff - sntp/libopts/compat/compat.h@1.6, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +1 -1 - AutoGen stuff - m4/libopts.m4@1.9, 2005-12-15 06:33:50-05:00, stenn@pogo.udel.edu +15 -17 AutoGen stuff - sntp/m4/libopts.m4@1.6, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +15 -17 + ntpd/Makefile.am@1.44, 2005-12-15 06:33:50-05:00, stenn@pogo.udel.edu +10 -10 + AutoGen stuff + + ntpdc/Makefile.am@1.26, 2005-12-15 06:33:50-05:00, stenn@pogo.udel.edu +5 -5 + AutoGen stuff + + ntpq/Makefile.am@1.18, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +4 -4 + AutoGen stuff + + sntp/Makefile.am@1.10, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +4 -4 + AutoGen stuff + + sntp/libopts/compat/compat.h@1.6, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +1 -1 AutoGen stuff sntp/libopts/compat/snprintf.c@1.1, 2005-12-15 06:32:56-05:00, stenn@pogo.udel.edu +36 -0 @@ -14297,16 +16030,7 @@ ChangeSet@1.1314, 2005-12-15 06:34:59-05:00, stenn@pogo.udel.edu +9 -0 sntp/libopts/compat/strdup.c@1.0, 2005-12-15 06:32:56-05:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/compat/strdup.c - ntpd/Makefile.am@1.44, 2005-12-15 06:33:50-05:00, stenn@pogo.udel.edu +10 -10 - AutoGen stuff - - ntpdc/Makefile.am@1.26, 2005-12-15 06:33:50-05:00, stenn@pogo.udel.edu +5 -5 - AutoGen stuff - - ntpq/Makefile.am@1.18, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +4 -4 - AutoGen stuff - - sntp/Makefile.am@1.10, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +4 -4 + sntp/m4/libopts.m4@1.6, 2005-12-15 06:33:51-05:00, stenn@pogo.udel.edu +15 -17 AutoGen stuff ChangeSet@1.1312, 2005-12-15 06:27:57-05:00, stenn@pogo.udel.edu +3 -0 @@ -15109,6 +16833,12 @@ ChangeSet@1.1303, 2005-09-21 00:28:47-04:00, stenn@pogo.udel.edu +10 -0 sntp/libopts/autoopts.h@1.4, 2005-09-21 00:26:36-04:00, stenn@pogo.udel.edu +1 -8 libopts upgrade + sntp/libopts/autoopts/options.h@1.3, 2005-09-17 03:23:25-04:00, stenn@pogo.udel.edu +30 -5 + libopts upgrade + + sntp/libopts/autoopts/usage-txt.h@1.4, 2005-09-17 03:23:25-04:00, stenn@pogo.udel.edu +1 -1 + libopts upgrade + sntp/libopts/compat/compat.h@1.4, 2005-09-17 03:23:25-04:00, stenn@pogo.udel.edu +1 -1 libopts upgrade @@ -15124,15 +16854,9 @@ ChangeSet@1.1303, 2005-09-21 00:28:47-04:00, stenn@pogo.udel.edu +10 -0 sntp/libopts/libopts.m4@1.4, 2005-09-21 00:26:37-04:00, stenn@pogo.udel.edu +15 -17 libopts upgrade - sntp/libopts/autoopts/options.h@1.3, 2005-09-17 03:23:25-04:00, stenn@pogo.udel.edu +30 -5 - libopts upgrade - sntp/libopts/proto.h@1.4, 2005-09-21 00:26:37-04:00, stenn@pogo.udel.edu +1 -1 libopts upgrade - sntp/libopts/autoopts/usage-txt.h@1.4, 2005-09-17 03:23:25-04:00, stenn@pogo.udel.edu +1 -1 - libopts upgrade - ChangeSet@1.1251.53.3, 2005-09-20 23:35:55-04:00, mayer@pogo.udel.edu +1 -0 bug #486 and Fix memory leak and add heiko's change for hints @@ -15158,12 +16882,24 @@ ChangeSet@1.1251.52.2, 2005-09-17 10:11:26+00:00, kardel@pogo.udel.edu +1 -0 ChangeSet@1.1301, 2005-09-17 00:45:06-04:00, stenn@pogo.udel.edu +14 -0 libopts upgrade + m4/libopts.m4@1.8, 2005-09-17 00:39:38-04:00, stenn@pogo.udel.edu +36 -1 + libopts upgrade + + sntp/Makefile.am@1.9, 2005-09-17 00:39:46-04:00, stenn@pogo.udel.edu +1 -1 + libopts upgrade + sntp/libopts/Makefile.am@1.2, 2005-09-17 00:40:04-04:00, stenn@pogo.udel.edu +1 -1 libopts upgrade sntp/libopts/autoopts.h@1.3, 2005-09-17 00:40:04-04:00, stenn@pogo.udel.edu +1 -21 libopts upgrade + sntp/libopts/autoopts/usage-txt.h@1.3, 2005-09-11 23:12:25-04:00, stenn@pogo.udel.edu +0 -0 + Change mode to -rw-r--r-- + + sntp/libopts/autoopts/usage-txt.h@1.2, 2005-09-11 23:09:56-04:00, stenn@pogo.udel.edu +1 -1 + libopts updates + sntp/libopts/compat/compat.h@1.3, 2005-09-17 00:41:18-04:00, stenn@pogo.udel.edu +5 -4 libopts upgrade @@ -15185,7 +16921,10 @@ ChangeSet@1.1301, 2005-09-17 00:45:06-04:00, stenn@pogo.udel.edu +14 -0 sntp/libopts/libopts.m4@1.3, 2005-09-17 00:40:05-04:00, stenn@pogo.udel.edu +36 -1 libopts upgrade - m4/libopts.m4@1.8, 2005-09-17 00:39:38-04:00, stenn@pogo.udel.edu +36 -1 + sntp/libopts/proto.h@1.3, 2005-09-17 00:40:05-04:00, stenn@pogo.udel.edu +1 -10 + libopts upgrade + + sntp/libopts/text_mmap.c@1.3, 2005-09-17 00:40:05-04:00, stenn@pogo.udel.edu +74 -33 libopts upgrade sntp/m4/libopts.m4@1.5, 2005-09-17 00:39:52-04:00, stenn@pogo.udel.edu +36 -1 @@ -15194,21 +16933,6 @@ ChangeSet@1.1301, 2005-09-17 00:45:06-04:00, stenn@pogo.udel.edu +14 -0 sntp/m4/libopts.m4@1.4, 2005-09-12 17:12:47-04:00, stenn@pogo.udel.edu +0 -0 Rename: sntp/libopts.m4 -> sntp/m4/libopts.m4 - sntp/libopts/proto.h@1.3, 2005-09-17 00:40:05-04:00, stenn@pogo.udel.edu +1 -10 - libopts upgrade - - sntp/libopts/text_mmap.c@1.3, 2005-09-17 00:40:05-04:00, stenn@pogo.udel.edu +74 -33 - libopts upgrade - - sntp/libopts/autoopts/usage-txt.h@1.3, 2005-09-11 23:12:25-04:00, stenn@pogo.udel.edu +0 -0 - Change mode to -rw-r--r-- - - sntp/libopts/autoopts/usage-txt.h@1.2, 2005-09-11 23:09:56-04:00, stenn@pogo.udel.edu +1 -1 - libopts updates - - sntp/Makefile.am@1.9, 2005-09-17 00:39:46-04:00, stenn@pogo.udel.edu +1 -1 - libopts upgrade - sntp/sntp-opts.def@1.2, 2005-09-17 00:39:47-04:00, stenn@pogo.udel.edu +2 -0 libopts upgrade @@ -15473,6 +17197,33 @@ ChangeSet@1.1251.51.2, 2005-09-15 01:59:15-04:00, stenn@whimsy.udel.edu +10 -0 ChangeSet@1.1298, 2005-09-11 22:43:01-04:00, stenn@pogo.udel.edu +35 -0 libopts updates + build@1.22, 2005-09-11 22:40:14-04:00, stenn@pogo.udel.edu +6 -0 + libopts updates + + m4/libopts.m4@1.7, 2005-09-11 22:41:00-04:00, stenn@pogo.udel.edu +79 -55 + libopts updates + + ntpd/Makefile.am@1.43, 2005-09-11 22:41:01-04:00, stenn@pogo.udel.edu +1 -1 + libopts updates + + ntpd/ntpd-opts.def@1.2, 2005-09-11 22:41:03-04:00, stenn@pogo.udel.edu +1 -0 + libopts updates + + ntpd/ntpdsim-opts.def@1.2, 2005-09-11 22:41:03-04:00, stenn@pogo.udel.edu +1 -0 + libopts updates + + ntpdc/ntpdc-opts.def@1.5, 2005-09-11 22:41:07-04:00, stenn@pogo.udel.edu +1 -0 + libopts updates + + ntpq/ntpq-opts.def@1.4, 2005-09-11 22:41:08-04:00, stenn@pogo.udel.edu +1 -0 + libopts updates + + sntp/configure.ac@1.10, 2005-09-11 22:41:15-04:00, stenn@pogo.udel.edu +3 -2 + libopts updates + + sntp/libopts.m4@1.3, 2005-09-11 22:41:15-04:00, stenn@pogo.udel.edu +79 -55 + libopts updates + sntp/libopts/MakeDefs.inc@1.2, 2005-09-11 22:41:16-04:00, stenn@pogo.udel.edu +0 -5 libopts updates @@ -15485,6 +17236,9 @@ ChangeSet@1.1298, 2005-09-11 22:43:01-04:00, stenn@pogo.udel.edu +35 -0 sntp/libopts/autoopts.h@1.2, 2005-09-11 22:41:16-04:00, stenn@pogo.udel.edu +3 -5 libopts updates + sntp/libopts/autoopts/options.h@1.2, 2005-09-11 22:41:18-04:00, stenn@pogo.udel.edu +4 -4 + libopts updates + sntp/libopts/boolean.c@1.2, 2005-09-11 22:41:16-04:00, stenn@pogo.udel.edu +1 -1 libopts updates @@ -15503,12 +17257,6 @@ ChangeSet@1.1298, 2005-09-11 22:43:01-04:00, stenn@pogo.udel.edu +35 -0 sntp/libopts/libopts.m4@1.2, 2005-09-11 22:41:17-04:00, stenn@pogo.udel.edu +83 -56 libopts updates - m4/libopts.m4@1.7, 2005-09-11 22:41:00-04:00, stenn@pogo.udel.edu +79 -55 - libopts updates - - sntp/libopts.m4@1.3, 2005-09-11 22:41:15-04:00, stenn@pogo.udel.edu +79 -55 - libopts updates - sntp/libopts/load.c@1.2, 2005-09-11 22:41:17-04:00, stenn@pogo.udel.edu +14 -10 libopts updates @@ -15521,9 +17269,6 @@ ChangeSet@1.1298, 2005-09-11 22:43:01-04:00, stenn@pogo.udel.edu +35 -0 sntp/libopts/numeric.c@1.2, 2005-09-11 22:41:17-04:00, stenn@pogo.udel.edu +1 -1 libopts updates - sntp/libopts/autoopts/options.h@1.2, 2005-09-11 22:41:18-04:00, stenn@pogo.udel.edu +4 -4 - libopts updates - sntp/libopts/pgusage.c@1.2, 2005-09-11 22:41:17-04:00, stenn@pogo.udel.edu +1 -1 libopts updates @@ -15557,27 +17302,6 @@ ChangeSet@1.1298, 2005-09-11 22:43:01-04:00, stenn@pogo.udel.edu +35 -0 sntp/libopts/version.c@1.2, 2005-09-11 22:41:18-04:00, stenn@pogo.udel.edu +1 -1 libopts updates - build@1.22, 2005-09-11 22:40:14-04:00, stenn@pogo.udel.edu +6 -0 - libopts updates - - ntpd/Makefile.am@1.43, 2005-09-11 22:41:01-04:00, stenn@pogo.udel.edu +1 -1 - libopts updates - - ntpd/ntpd-opts.def@1.2, 2005-09-11 22:41:03-04:00, stenn@pogo.udel.edu +1 -0 - libopts updates - - ntpd/ntpdsim-opts.def@1.2, 2005-09-11 22:41:03-04:00, stenn@pogo.udel.edu +1 -0 - libopts updates - - ntpdc/ntpdc-opts.def@1.5, 2005-09-11 22:41:07-04:00, stenn@pogo.udel.edu +1 -0 - libopts updates - - ntpq/ntpq-opts.def@1.4, 2005-09-11 22:41:08-04:00, stenn@pogo.udel.edu +1 -0 - libopts updates - - sntp/configure.ac@1.10, 2005-09-11 22:41:15-04:00, stenn@pogo.udel.edu +3 -2 - libopts updates - ChangeSet@1.1251.50.1, 2005-09-06 22:16:23-04:00, mayer@pogo.udel.edu +1 -0 Revamped the input_handler code to separate the reading of packets from the selection process and logic @@ -15715,21 +17439,21 @@ ChangeSet@1.1251.38.31, 2005-08-28 15:49:21-04:00, mayer@pogo.udel.edu +1 -0 ChangeSet@1.1295, 2005-08-28 04:51:03-04:00, stenn@pogo.udel.edu +5 -0 libopts cleanup - m4/libopts.m4@1.6, 2005-08-28 04:49:38-04:00, stenn@pogo.udel.edu +8 -5 - libopts cleanup - - sntp/libopts.m4@1.2, 2005-08-28 04:49:51-04:00, stenn@pogo.udel.edu +8 -5 - libopts cleanup - Makefile.am@1.54, 2005-08-28 04:48:59-04:00, stenn@pogo.udel.edu +0 -2 libopts cleanup configure.ac@1.374, 2005-08-28 04:49:00-04:00, stenn@pogo.udel.edu +1 -1 libopts cleanup + m4/libopts.m4@1.6, 2005-08-28 04:49:38-04:00, stenn@pogo.udel.edu +8 -5 + libopts cleanup + sntp/Makefile.am@1.8, 2005-08-28 04:49:50-04:00, stenn@pogo.udel.edu +0 -1 libopts cleanup + sntp/libopts.m4@1.2, 2005-08-28 04:49:51-04:00, stenn@pogo.udel.edu +8 -5 + libopts cleanup + ChangeSet@1.1251.48.3, 2005-08-28 08:37:28+00:00, kardel@pogo.udel.edu +1 -0 ntp_io.c: more enum cleanup @@ -15792,17 +17516,6 @@ ChangeSet@1.1251.38.26, 2005-08-26 09:17:19-04:00, mayer@pogo.udel.edu +1 -0 ChangeSet@1.1293, 2005-08-26 04:40:05-04:00, stenn@pogo.udel.edu +9 -0 autogen stuff - m4/libopts.m4@1.5, 2005-08-26 04:38:44-04:00, stenn@pogo.udel.edu +1 -1 - changes for 1 copy of libopts - - m4/libopts.m4@1.4, 2005-08-26 04:20:13-04:00, stenn@pogo.udel.edu +147 -94 - new libopts stuff - - sntp/libopts.m4@1.1, 2005-08-26 04:20:29-04:00, stenn@pogo.udel.edu +418 -0 - - sntp/libopts.m4@1.0, 2005-08-26 04:20:29-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts.m4 - BitKeeper/etc/ignore@1.44, 2005-08-26 04:39:02-04:00, stenn@pogo.udel.edu +40 -48 Update the ignore list @@ -15827,6 +17540,12 @@ ChangeSet@1.1293, 2005-08-26 04:40:05-04:00, stenn@pogo.udel.edu +9 -0 configure.ac@1.373, 2005-08-26 04:20:13-04:00, stenn@pogo.udel.edu +0 -1 new libopts stuff + m4/libopts.m4@1.5, 2005-08-26 04:38:44-04:00, stenn@pogo.udel.edu +1 -1 + changes for 1 copy of libopts + + m4/libopts.m4@1.4, 2005-08-26 04:20:13-04:00, stenn@pogo.udel.edu +147 -94 + new libopts stuff + ntpd/ntpd-opts.def@1.1, 2005-08-26 04:18:41-04:00, stenn@pogo.udel.edu +42 -0 ntpd/ntpd-opts.def@1.0, 2005-08-26 04:18:41-04:00, stenn@pogo.udel.edu +0 -0 @@ -15842,6 +17561,11 @@ ChangeSet@1.1293, 2005-08-26 04:40:05-04:00, stenn@pogo.udel.edu +9 -0 ntpd/ntpdsim-opts.def@1.0, 2005-08-26 04:18:41-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/ntpd/ntpdsim-opts.def + sntp/libopts.m4@1.1, 2005-08-26 04:20:29-04:00, stenn@pogo.udel.edu +418 -0 + + sntp/libopts.m4@1.0, 2005-08-26 04:20:29-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts.m4 + sntp/sntp-opts.def@1.1, 2005-08-26 04:18:42-04:00, stenn@pogo.udel.edu +388 -0 sntp/sntp-opts.def@1.0, 2005-08-26 04:18:42-04:00, stenn@pogo.udel.edu +0 -0 @@ -15885,6 +17609,16 @@ ChangeSet@1.1292, 2005-08-26 04:17:32-04:00, stenn@pogo.udel.edu +36 -0 sntp/libopts/autoopts.h@1.0, 2005-08-26 04:16:19-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/autoopts.h + sntp/libopts/autoopts/options.h@1.1, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +864 -0 + + sntp/libopts/autoopts/options.h@1.0, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/autoopts/options.h + + sntp/libopts/autoopts/usage-txt.h@1.1, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +479 -0 + + sntp/libopts/autoopts/usage-txt.h@1.0, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/autoopts/usage-txt.h + sntp/libopts/boolean.c@1.1, 2005-08-26 04:16:19-04:00, stenn@pogo.udel.edu +102 -0 sntp/libopts/boolean.c@1.0, 2005-08-26 04:16:19-04:00, stenn@pogo.udel.edu +0 -0 @@ -15895,6 +17629,11 @@ ChangeSet@1.1292, 2005-08-26 04:17:32-04:00, stenn@pogo.udel.edu +36 -0 sntp/libopts/compat/compat.h@1.0, 2005-08-26 04:16:36-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/compat/compat.h + sntp/libopts/compat/pathfind.c@1.1, 2005-08-26 04:16:36-04:00, stenn@pogo.udel.edu +330 -0 + + sntp/libopts/compat/pathfind.c@1.0, 2005-08-26 04:16:36-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/compat/pathfind.c + sntp/libopts/configfile.c@1.1, 2005-08-26 04:16:19-04:00, stenn@pogo.udel.edu +1277 -0 sntp/libopts/configfile.c@1.0, 2005-08-26 04:16:19-04:00, stenn@pogo.udel.edu +0 -0 @@ -15955,16 +17694,6 @@ ChangeSet@1.1292, 2005-08-26 04:17:32-04:00, stenn@pogo.udel.edu +36 -0 sntp/libopts/numeric.c@1.0, 2005-08-26 04:16:20-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/numeric.c - sntp/libopts/autoopts/options.h@1.1, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +864 -0 - - sntp/libopts/autoopts/options.h@1.0, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/autoopts/options.h - - sntp/libopts/compat/pathfind.c@1.1, 2005-08-26 04:16:36-04:00, stenn@pogo.udel.edu +330 -0 - - sntp/libopts/compat/pathfind.c@1.0, 2005-08-26 04:16:36-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/compat/pathfind.c - sntp/libopts/pgusage.c@1.1, 2005-08-26 04:16:20-04:00, stenn@pogo.udel.edu +154 -0 sntp/libopts/pgusage.c@1.0, 2005-08-26 04:16:20-04:00, stenn@pogo.udel.edu +0 -0 @@ -16015,11 +17744,6 @@ ChangeSet@1.1292, 2005-08-26 04:17:32-04:00, stenn@pogo.udel.edu +36 -0 sntp/libopts/tokenize.c@1.0, 2005-08-26 04:16:20-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/tokenize.c - sntp/libopts/autoopts/usage-txt.h@1.1, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +479 -0 - - sntp/libopts/autoopts/usage-txt.h@1.0, 2005-08-26 04:16:29-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/sntp/libopts/autoopts/usage-txt.h - sntp/libopts/usage.c@1.1, 2005-08-26 04:16:21-04:00, stenn@pogo.udel.edu +651 -0 sntp/libopts/usage.c@1.0, 2005-08-26 04:16:21-04:00, stenn@pogo.udel.edu +0 -0 @@ -16781,6 +18505,9 @@ ChangeSet@1.1251.42.9, 2005-08-09 17:02:19-04:00, stenn@whimsy.udel.edu +5 -0 ChangeSet@1.1285, 2005-08-08 02:53:55-04:00, stenn@pogo.udel.edu +18 -0 autogen update and more conversion + include/ntpd.h@1.78.2.1, 2005-08-08 02:52:58-04:00, stenn@pogo.udel.edu +0 -1 + autogen update and more conversion + libopts/INSTALL@1.2, 2005-08-08 02:53:06-04:00, stenn@pogo.udel.edu +8 -3 autogen update and more conversion @@ -16805,9 +18532,6 @@ ChangeSet@1.1285, 2005-08-08 02:53:55-04:00, stenn@pogo.udel.edu +18 -0 libopts/m4/missing@1.2, 2005-08-08 02:53:12-04:00, stenn@pogo.udel.edu +10 -6 autogen update and more conversion - include/ntpd.h@1.78.2.1, 2005-08-08 02:52:58-04:00, stenn@pogo.udel.edu +0 -1 - autogen update and more conversion - ntpd/Makefile.am@1.42, 2005-08-08 02:53:13-04:00, stenn@pogo.udel.edu +37 -6 autogen update and more conversion @@ -17273,11 +18997,22 @@ ChangeSet@1.1251.38.3, 2005-07-16 17:29:55-04:00, mayer@pogo.udel.edu +1 -0 ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 New libopts + Makefile.am@1.51, 2005-07-04 04:09:28-04:00, stenn@pogo.udel.edu +2 -2 + Cleanup + + configure.ac@1.371, 2005-07-04 04:09:29-04:00, stenn@pogo.udel.edu +2 -0 + Cleanup + libopts/AUTHORS@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +2 -0 libopts/AUTHORS@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/AUTHORS + libopts/COPYING@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +502 -0 + + libopts/COPYING@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/COPYING + libopts/COPYING.lgpl@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +502 -0 libopts/COPYING.lgpl@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 @@ -17288,11 +19023,6 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/COPYING.mbsd@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/COPYING.mbsd - libopts/COPYING@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +502 -0 - - libopts/COPYING@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/COPYING - libopts/ChangeLog@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +4 -0 libopts/ChangeLog@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 @@ -17308,11 +19038,6 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/MakeDefs.inc@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/MakeDefs.inc - libopts/libopts/Makefile.am@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +12 -0 - - libopts/libopts/Makefile.am@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/Makefile.am - libopts/Makefile.am@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +4 -0 libopts/Makefile.am@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 @@ -17338,25 +19063,20 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/autoopts.c@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/autoopts.c - libopts/libopts/autoopts.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +1033 -0 - - libopts/libopts/autoopts.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/autoopts.c - - libopts/libopts/autoopts.h@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +337 -0 - - libopts/libopts/autoopts.h@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/autoopts.h - libopts/autoopts.h@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +337 -0 libopts/autoopts.h@1.0, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/autoopts.h - libopts/libopts/boolean.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +102 -0 + libopts/autoopts/options.h@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +864 -0 - libopts/libopts/boolean.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/boolean.c + libopts/autoopts/options.h@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/autoopts/options.h + + libopts/autoopts/usage-txt.h@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +479 -0 + + libopts/autoopts/usage-txt.h@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/autoopts/usage-txt.h libopts/boolean.c@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +102 -0 @@ -17373,10 +19093,10 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/compat/compat.h@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/compat/compat.h - libopts/m4/compile@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +142 -0 + libopts/compat/pathfind.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +332 -0 - libopts/m4/compile@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/compile + libopts/compat/pathfind.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/compat/pathfind.c libopts/config-h.in@1.1, 2005-07-04 04:10:36-04:00, stenn@pogo.udel.edu +140 -0 @@ -17388,56 +19108,26 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/config-h.in~@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/config-h.in~ - libopts/m4/config.guess@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +1495 -0 - - libopts/m4/config.guess@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/config.guess - - libopts/m4/config.sub@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +1570 -0 - - libopts/m4/config.sub@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/config.sub - - libopts/libopts/configfile.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +1282 -0 - - libopts/libopts/configfile.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/configfile.c - libopts/configfile.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +1282 -0 libopts/configfile.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/configfile.c - libopts/configure.ac@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +54 -0 - - libopts/configure.ac@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/configure.ac - libopts/configure@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +23905 -0 libopts/configure@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/configure + libopts/configure.ac@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +54 -0 + + libopts/configure.ac@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/configure.ac + libopts/cook.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +355 -0 libopts/cook.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/cook.c - libopts/libopts/cook.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +355 -0 - - libopts/libopts/cook.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/cook.c - - libopts/m4/depcomp@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +522 -0 - - libopts/m4/depcomp@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/depcomp - - libopts/libopts/enumeration.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +449 -0 - - libopts/libopts/enumeration.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/enumeration.c - libopts/enumeration.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +449 -0 libopts/enumeration.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 @@ -17448,6 +19138,61 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/environment.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/environment.c + libopts/genshell.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +300 -0 + + libopts/genshell.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/genshell.c + + libopts/genshell.h@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +143 -0 + + libopts/genshell.h@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/genshell.h + + libopts/libopts.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +29 -0 + + libopts/libopts.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts.c + + libopts/libopts.m4@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +387 -0 + + libopts/libopts.m4@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts.m4 + + libopts/libopts/Makefile.am@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +12 -0 + + libopts/libopts/Makefile.am@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/Makefile.am + + libopts/libopts/autoopts.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +1033 -0 + + libopts/libopts/autoopts.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/autoopts.c + + libopts/libopts/autoopts.h@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +337 -0 + + libopts/libopts/autoopts.h@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/autoopts.h + + libopts/libopts/boolean.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +102 -0 + + libopts/libopts/boolean.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/boolean.c + + libopts/libopts/configfile.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +1282 -0 + + libopts/libopts/configfile.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/configfile.c + + libopts/libopts/cook.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +355 -0 + + libopts/libopts/cook.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/cook.c + + libopts/libopts/enumeration.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +449 -0 + + libopts/libopts/enumeration.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/enumeration.c + libopts/libopts/environment.c@1.1, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +261 -0 libopts/libopts/environment.c@1.0, 2005-07-04 04:12:37-04:00, stenn@pogo.udel.edu +0 -0 @@ -17458,151 +19203,56 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/libopts/genshell.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/genshell.c - libopts/genshell.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +300 -0 - - libopts/genshell.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/genshell.c - libopts/libopts/genshell.h@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +143 -0 libopts/libopts/genshell.h@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/genshell.h - libopts/genshell.h@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +143 -0 - - libopts/genshell.h@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/genshell.h - - libopts/m4/install-sh@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +323 -0 - - libopts/m4/install-sh@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/install-sh - - libopts/libopts.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +29 -0 - - libopts/libopts.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts.c - libopts/libopts/libopts.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +29 -0 libopts/libopts/libopts.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/libopts.c - libopts/libopts.m4@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +387 -0 - - libopts/libopts.m4@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts.m4 - - libopts/m4/libopts.m4@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +331 -0 - - libopts/m4/libopts.m4@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/libopts.m4 - libopts/libopts/load.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +470 -0 libopts/libopts/load.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/load.c - libopts/load.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +470 -0 - - libopts/load.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/load.c - - libopts/m4/ltmain.sh@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +6500 -0 - - libopts/m4/ltmain.sh@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/ltmain.sh - libopts/libopts/makeshell.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +1100 -0 libopts/libopts/makeshell.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/makeshell.c - libopts/makeshell.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +1100 -0 - - libopts/makeshell.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/makeshell.c - - libopts/m4/missing@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +353 -0 - - libopts/m4/missing@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/missing - libopts/libopts/nested.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +707 -0 libopts/libopts/nested.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/nested.c - libopts/nested.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +707 -0 - - libopts/nested.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/nested.c - - libopts/numeric.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +89 -0 - - libopts/numeric.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/numeric.c - libopts/libopts/numeric.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +89 -0 libopts/libopts/numeric.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/numeric.c - libopts/autoopts/options.h@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +864 -0 - - libopts/autoopts/options.h@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/autoopts/options.h - - libopts/compat/pathfind.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +332 -0 - - libopts/compat/pathfind.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/compat/pathfind.c - libopts/libopts/pgusage.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +154 -0 libopts/libopts/pgusage.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/pgusage.c - libopts/pgusage.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +154 -0 - - libopts/pgusage.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/pgusage.c - libopts/libopts/proto.h@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +124 -0 libopts/libopts/proto.h@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/proto.h - libopts/proto.h@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +124 -0 - - libopts/proto.h@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/proto.h - libopts/libopts/putshell.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +333 -0 libopts/libopts/putshell.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/putshell.c - libopts/putshell.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +333 -0 - - libopts/putshell.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/putshell.c - libopts/libopts/restore.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +207 -0 libopts/libopts/restore.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/restore.c - libopts/restore.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +207 -0 - - libopts/restore.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/restore.c - - libopts/save.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +499 -0 - - libopts/save.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/save.c - libopts/libopts/save.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +499 -0 libopts/libopts/save.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 @@ -17613,16 +19263,6 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/libopts/sort.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/sort.c - libopts/sort.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +369 -0 - - libopts/sort.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/sort.c - - libopts/stack.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +224 -0 - - libopts/stack.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/stack.c - libopts/libopts/stack.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +224 -0 libopts/libopts/stack.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 @@ -17633,41 +19273,16 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/libopts/streqvcmp.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/streqvcmp.c - libopts/streqvcmp.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +292 -0 - - libopts/streqvcmp.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/streqvcmp.c - libopts/libopts/text_mmap.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +312 -0 libopts/libopts/text_mmap.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/text_mmap.c - libopts/text_mmap.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +312 -0 - - libopts/text_mmap.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/text_mmap.c - - libopts/tokenize.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +322 -0 - - libopts/tokenize.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/tokenize.c - libopts/libopts/tokenize.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +322 -0 libopts/libopts/tokenize.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/tokenize.c - libopts/autoopts/usage-txt.h@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +479 -0 - - libopts/autoopts/usage-txt.h@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/autoopts/usage-txt.h - - libopts/usage.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +651 -0 - - libopts/usage.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/usage.c - libopts/libopts/usage.c@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +651 -0 libopts/libopts/usage.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 @@ -17678,17 +19293,126 @@ ChangeSet@1.1283, 2005-07-04 04:15:16-04:00, stenn@pogo.udel.edu +86 -0 libopts/libopts/version.c@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts/version.c + libopts/load.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +470 -0 + + libopts/load.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/load.c + + libopts/m4/compile@1.1, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +142 -0 + + libopts/m4/compile@1.0, 2005-07-04 04:12:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/compile + + libopts/m4/config.guess@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +1495 -0 + + libopts/m4/config.guess@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/config.guess + + libopts/m4/config.sub@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +1570 -0 + + libopts/m4/config.sub@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/config.sub + + libopts/m4/depcomp@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +522 -0 + + libopts/m4/depcomp@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/depcomp + + libopts/m4/install-sh@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +323 -0 + + libopts/m4/install-sh@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/install-sh + + libopts/m4/libopts.m4@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +331 -0 + + libopts/m4/libopts.m4@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/libopts.m4 + + libopts/m4/ltmain.sh@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +6500 -0 + + libopts/m4/ltmain.sh@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/ltmain.sh + + libopts/m4/missing@1.1, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +353 -0 + + libopts/m4/missing@1.0, 2005-07-04 04:12:39-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/m4/missing + + libopts/makeshell.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +1100 -0 + + libopts/makeshell.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/makeshell.c + + libopts/nested.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +707 -0 + + libopts/nested.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/nested.c + + libopts/numeric.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +89 -0 + + libopts/numeric.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/numeric.c + + libopts/pgusage.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +154 -0 + + libopts/pgusage.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/pgusage.c + + libopts/proto.h@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +124 -0 + + libopts/proto.h@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/proto.h + + libopts/putshell.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +333 -0 + + libopts/putshell.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/putshell.c + + libopts/restore.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +207 -0 + + libopts/restore.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/restore.c + + libopts/save.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +499 -0 + + libopts/save.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/save.c + + libopts/sort.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +369 -0 + + libopts/sort.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/sort.c + + libopts/stack.c@1.1, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +224 -0 + + libopts/stack.c@1.0, 2005-07-04 04:10:37-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/stack.c + + libopts/streqvcmp.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +292 -0 + + libopts/streqvcmp.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/streqvcmp.c + + libopts/text_mmap.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +312 -0 + + libopts/text_mmap.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/text_mmap.c + + libopts/tokenize.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +322 -0 + + libopts/tokenize.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/tokenize.c + + libopts/usage.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +651 -0 + + libopts/usage.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/usage.c + libopts/version.c@1.1, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +177 -0 libopts/version.c@1.0, 2005-07-04 04:10:38-04:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/version.c - Makefile.am@1.51, 2005-07-04 04:09:28-04:00, stenn@pogo.udel.edu +2 -2 - Cleanup - - configure.ac@1.371, 2005-07-04 04:09:29-04:00, stenn@pogo.udel.edu +2 -0 - Cleanup - ntpdc/ntpdc-opts.def@1.3, 2005-07-04 04:09:16-04:00, stenn@pogo.udel.edu +22 -7 Cleanup @@ -18178,6 +19902,15 @@ ChangeSet@1.1251.26.12, 2005-05-21 10:53:09+00:00, kardel@pogo.udel.edu +39 -0 libntp/binio.c@1.5, 2005-05-21 10:29:41+00:00, kardel@pogo.udel.edu +3 -3 copyright maintenance + libntp/gpstolfp.c@1.7, 2005-05-21 10:29:41+00:00, kardel@pogo.udel.edu +6 -3 + copyright maintenance + + libntp/ieee754io.c@1.7, 2005-05-21 10:29:42+00:00, kardel@pogo.udel.edu +6 -3 + copyright maintenance + + libntp/mfp_mul.c@1.5, 2005-05-21 10:29:42+00:00, kardel@pogo.udel.edu +6 -3 + copyright maintenance + libparse/clk_computime.c@1.8, 2005-05-21 10:22:58+00:00, kardel@pogo.udel.edu +6 -3 copyright maintenance @@ -18214,18 +19947,9 @@ ChangeSet@1.1251.26.12, 2005-05-21 10:53:09+00:00, kardel@pogo.udel.edu +39 -0 libparse/data_mbg.c@1.5, 2005-05-21 10:22:59+00:00, kardel@pogo.udel.edu +6 -3 copyright maintenance - libntp/gpstolfp.c@1.7, 2005-05-21 10:29:41+00:00, kardel@pogo.udel.edu +6 -3 - copyright maintenance - - libntp/ieee754io.c@1.7, 2005-05-21 10:29:42+00:00, kardel@pogo.udel.edu +6 -3 - copyright maintenance - libparse/info_trimble.c@1.4, 2005-05-21 10:22:59+00:00, kardel@pogo.udel.edu +6 -4 copyright maintenance - libntp/mfp_mul.c@1.5, 2005-05-21 10:29:42+00:00, kardel@pogo.udel.edu +6 -3 - copyright maintenance - libparse/parse.c@1.10, 2005-05-21 10:22:59+00:00, kardel@pogo.udel.edu +7 -4 copyright maintenance @@ -18258,15 +19982,15 @@ ChangeSet@1.1251.26.12, 2005-05-21 10:53:09+00:00, kardel@pogo.udel.edu +39 -0 ChangeSet@1.1251.26.11, 2005-05-18 05:36:08-04:00, stenn@whimsy.udel.edu +3 -0 [Bug 408] fix based on proposed patch from cipo - ntpq/ntpq_ops.c@1.20.2.1, 2005-05-18 05:35:39-04:00, stenn@whimsy.udel.edu +1 -1 - [Bug 408] fix based on proposed patch from cipo - ntpq/ntpq.c@1.55.1.2, 2005-05-18 05:35:39-04:00, stenn@whimsy.udel.edu +10 -4 [Bug 408] fix based on proposed patch from cipo ntpq/ntpq.h@1.5, 2005-05-18 05:35:39-04:00, stenn@whimsy.udel.edu +1 -1 [Bug 408] fix based on proposed patch from cipo + ntpq/ntpq_ops.c@1.20.2.1, 2005-05-18 05:35:39-04:00, stenn@whimsy.udel.edu +1 -1 + [Bug 408] fix based on proposed patch from cipo + ChangeSet@1.1251.26.10, 2005-05-17 01:17:18-04:00, stenn@whimsy.udel.edu +6 -0 Stuff from Dave Mills @@ -19160,12 +20884,12 @@ ChangeSet@1.1251.1.61, 2005-01-11 16:02:59-05:00, mayer@pogo.udel.edu +1 -0 ChangeSet@1.1261, 2005-01-10 04:19:21-05:00, stenn@pogo.udel.edu +2 -0 fixes - m4/libopts.m4@1.3, 2005-01-10 04:18:45-05:00, stenn@pogo.udel.edu +2 -5 - fix from bkorb - configure.ac@1.364, 2005-01-10 04:19:11-05:00, stenn@pogo.udel.edu +7 -0 disable shared libraries on OSF4.0 + m4/libopts.m4@1.3, 2005-01-10 04:18:45-05:00, stenn@pogo.udel.edu +2 -5 + fix from bkorb + ChangeSet@1.1260, 2005-01-09 06:23:02-05:00, stenn@pogo.udel.edu +27 -0 autogen-5.6.5 @@ -19184,6 +20908,9 @@ ChangeSet@1.1260, 2005-01-09 06:23:02-05:00, stenn@pogo.udel.edu +27 -0 libopts/compat/compat.h@1.2, 2005-01-09 06:19:27-05:00, stenn@pogo.udel.edu +1 -1 autogen-5.6.5 + libopts/compat/pathfind.c@1.2, 2005-01-09 06:19:27-05:00, stenn@pogo.udel.edu +2 -2 + autogen-5.6.5 + libopts/enumeration.c@1.2, 2005-01-09 06:18:14-05:00, stenn@pogo.udel.edu +1 -1 autogen-5.6.5 @@ -19196,9 +20923,6 @@ ChangeSet@1.1260, 2005-01-09 06:23:02-05:00, stenn@pogo.udel.edu +27 -0 libopts/genshell.h@1.2, 2005-01-09 06:22:16-05:00, stenn@pogo.udel.edu +1 -1 autogen-5.6.5 - m4/libopts.m4@1.2, 2005-01-09 06:18:07-05:00, stenn@pogo.udel.edu +2 -29 - autogen-5.6.5 - libopts/libopts.m4@1.2, 2005-01-09 06:18:14-05:00, stenn@pogo.udel.edu +2 -29 autogen-5.6.5 @@ -19214,9 +20938,6 @@ ChangeSet@1.1260, 2005-01-09 06:23:02-05:00, stenn@pogo.udel.edu +27 -0 libopts/options.h@1.2, 2005-01-09 06:22:17-05:00, stenn@pogo.udel.edu +3 -3 autogen-5.6.5 - libopts/compat/pathfind.c@1.2, 2005-01-09 06:19:27-05:00, stenn@pogo.udel.edu +2 -2 - autogen-5.6.5 - libopts/pgusage.c@1.2, 2005-01-09 06:18:14-05:00, stenn@pogo.udel.edu +1 -1 autogen-5.6.5 @@ -19250,6 +20971,9 @@ ChangeSet@1.1260, 2005-01-09 06:23:02-05:00, stenn@pogo.udel.edu +27 -0 libopts/version.c@1.2, 2005-01-09 06:18:15-05:00, stenn@pogo.udel.edu +1 -1 autogen-5.6.5 + m4/libopts.m4@1.2, 2005-01-09 06:18:07-05:00, stenn@pogo.udel.edu +2 -29 + autogen-5.6.5 + ChangeSet@1.1251.7.31, 2005-01-09 02:05:42-05:00, stenn@whimsy.udel.edu +1 -0 Happy New Year @@ -19397,6 +21121,9 @@ ChangeSet@1.1255, 2004-12-30 19:47:48-05:00, stenn@pogo.udel.edu +4 -0 ChangeSet@1.1253, 2004-12-30 17:53:32-05:00, stenn@pogo.udel.edu +39 -0 AutoOpts conversion - starting with ntpq + Makefile.am@1.49, 2004-12-30 17:50:45-05:00, stenn@pogo.udel.edu +8 -1 + AutoOpts conversion + libopts/COPYING.lgpl@1.1, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +504 -0 libopts/COPYING.lgpl@1.0, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +0 -0 @@ -19447,6 +21174,11 @@ ChangeSet@1.1253, 2004-12-30 17:53:32-05:00, stenn@pogo.udel.edu +39 -0 libopts/compat/compat.h@1.0, 2004-12-30 17:52:51-05:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/compat/compat.h + libopts/compat/pathfind.c@1.1, 2004-12-30 17:52:51-05:00, stenn@pogo.udel.edu +278 -0 + + libopts/compat/pathfind.c@1.0, 2004-12-30 17:52:51-05:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/compat/pathfind.c + libopts/enumeration.c@1.1, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +448 -0 libopts/enumeration.c@1.0, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +0 -0 @@ -19472,11 +21204,6 @@ ChangeSet@1.1253, 2004-12-30 17:53:32-05:00, stenn@pogo.udel.edu +39 -0 libopts/libopts.c@1.0, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/libopts.c - m4/libopts.m4@1.1, 2004-12-30 17:51:53-05:00, stenn@pogo.udel.edu +395 -0 - - m4/libopts.m4@1.0, 2004-12-30 17:51:53-05:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/m4/libopts.m4 - libopts/libopts.m4@1.1, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +395 -0 libopts/libopts.m4@1.0, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +0 -0 @@ -19502,11 +21229,6 @@ ChangeSet@1.1253, 2004-12-30 17:53:32-05:00, stenn@pogo.udel.edu +39 -0 libopts/options.h@1.0, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/options.h - libopts/compat/pathfind.c@1.1, 2004-12-30 17:52:51-05:00, stenn@pogo.udel.edu +278 -0 - - libopts/compat/pathfind.c@1.0, 2004-12-30 17:52:51-05:00, stenn@pogo.udel.edu +0 -0 - BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/compat/pathfind.c - libopts/pgusage.c@1.1, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +156 -0 libopts/pgusage.c@1.0, 2004-12-30 17:52:50-05:00, stenn@pogo.udel.edu +0 -0 @@ -19572,8 +21294,10 @@ ChangeSet@1.1253, 2004-12-30 17:53:32-05:00, stenn@pogo.udel.edu +39 -0 libopts/version.c@1.0, 2004-12-30 17:52:51-05:00, stenn@pogo.udel.edu +0 -0 BitKeeper file /pogo/users/stenn/ntp-dev-ag/libopts/version.c - Makefile.am@1.49, 2004-12-30 17:50:45-05:00, stenn@pogo.udel.edu +8 -1 - AutoOpts conversion + m4/libopts.m4@1.1, 2004-12-30 17:51:53-05:00, stenn@pogo.udel.edu +395 -0 + + m4/libopts.m4@1.0, 2004-12-30 17:51:53-05:00, stenn@pogo.udel.edu +0 -0 + BitKeeper file /pogo/users/stenn/ntp-dev-ag/m4/libopts.m4 ntpq/Makefile.am@1.11.1.1, 2004-12-30 17:51:34-05:00, stenn@pogo.udel.edu +18 -4 AutoOpts conversion @@ -20066,10 +21790,10 @@ ChangeSet@1.1251.1.33, 2004-11-30 05:20:17-05:00, stenn@pogo.udel.edu +16 -0 ntpdc/ntpdc_ops.c@1.38, 2004-11-30 05:18:53-05:00, stenn@pogo.udel.edu +0 -1 netdb.h cleanup - ntpq/ntpq_ops.c@1.20.1.2, 2004-11-30 05:18:54-05:00, stenn@pogo.udel.edu +0 -1 + ntpq/ntpq.c@1.53, 2004-11-30 05:18:54-05:00, stenn@pogo.udel.edu +0 -1 netdb.h cleanup - ntpq/ntpq.c@1.53, 2004-11-30 05:18:54-05:00, stenn@pogo.udel.edu +0 -1 + ntpq/ntpq_ops.c@1.20.1.2, 2004-11-30 05:18:54-05:00, stenn@pogo.udel.edu +0 -1 netdb.h cleanup ChangeSet@1.1251.6.1, 2004-11-29 22:45:56-05:00, stenn@pogo.udel.edu +1 -0 @@ -20230,18 +21954,27 @@ ChangeSet@1.1251.4.1, 2004-11-19 03:04:35-05:00, stenn@whimsy.udel.edu +46 -0 kernel/sys/parsestreams.h@1.5, 2004-11-19 03:03:00-05:00, stenn@whimsy.udel.edu +1 -1 [Bug 341] Patches from Frank Kardel + libntp/binio.c@1.4, 2004-11-19 03:03:02-05:00, stenn@whimsy.udel.edu +29 -2 + [Bug 341] Patches from Frank Kardel + libntp/buftvtots.c@1.4, 2004-11-19 03:03:02-05:00, stenn@whimsy.udel.edu +12 -83 [Bug 341] Patches from Frank Kardel + libntp/gpstolfp.c@1.6, 2004-11-19 03:03:04-05:00, stenn@whimsy.udel.edu +34 -2 + [Bug 341] Patches from Frank Kardel + + libntp/ieee754io.c@1.6, 2004-11-19 03:03:04-05:00, stenn@whimsy.udel.edu +34 -2 + [Bug 341] Patches from Frank Kardel + + libntp/mfp_mul.c@1.4, 2004-11-19 03:03:05-05:00, stenn@whimsy.udel.edu +34 -2 + [Bug 341] Patches from Frank Kardel + libntp/mktime.c@1.8, 2004-11-19 03:03:05-05:00, stenn@whimsy.udel.edu +0 -1 [Bug 341] Patches from Frank Kardel libparse/README@1.3, 2004-11-19 03:03:08-05:00, stenn@whimsy.udel.edu +2 -2 [Bug 341] Patches from Frank Kardel - libntp/binio.c@1.4, 2004-11-19 03:03:02-05:00, stenn@whimsy.udel.edu +29 -2 - [Bug 341] Patches from Frank Kardel - libparse/clk_computime.c@1.7, 2004-11-19 03:03:08-05:00, stenn@whimsy.udel.edu +32 -9 [Bug 341] Patches from Frank Kardel @@ -20278,18 +22011,9 @@ ChangeSet@1.1251.4.1, 2004-11-19 03:04:35-05:00, stenn@whimsy.udel.edu +46 -0 libparse/data_mbg.c@1.4, 2004-11-19 03:03:10-05:00, stenn@whimsy.udel.edu +32 -2 [Bug 341] Patches from Frank Kardel - libntp/gpstolfp.c@1.6, 2004-11-19 03:03:04-05:00, stenn@whimsy.udel.edu +34 -2 - [Bug 341] Patches from Frank Kardel - - libntp/ieee754io.c@1.6, 2004-11-19 03:03:04-05:00, stenn@whimsy.udel.edu +34 -2 - [Bug 341] Patches from Frank Kardel - libparse/info_trimble.c@1.3, 2004-11-19 03:03:10-05:00, stenn@whimsy.udel.edu +0 -2 [Bug 341] Patches from Frank Kardel - libntp/mfp_mul.c@1.4, 2004-11-19 03:03:05-05:00, stenn@whimsy.udel.edu +34 -2 - [Bug 341] Patches from Frank Kardel - libparse/parse.c@1.9, 2004-11-19 03:03:10-05:00, stenn@whimsy.udel.edu +35 -9 [Bug 341] Patches from Frank Kardel @@ -20557,15 +22281,15 @@ ChangeSet@1.1249.1.9, 2004-11-04 00:03:35-05:00, mayer@tecotoo. +6 -0 ntpdc/ntpdc_ops.c@1.37, 2004-11-04 00:02:42-05:00, mayer@tecotoo. +21 -21 Prefix constants with NTP_ to avoid collisions with VS.NET - ntpq/ntpq_ops.c@1.20.1.1, 2004-11-04 00:03:09-05:00, mayer@tecotoo. +17 -17 - Prefix constants with NTP_ to avoid collisions with VS.NET - ntpq/ntpq.c@1.50, 2004-11-04 00:03:08-05:00, mayer@tecotoo. +18 -17 Prefix constants with NTP_ to avoid collisions with VS.NET ntpq/ntpq.h@1.4, 2004-11-04 00:03:08-05:00, mayer@tecotoo. +10 -7 Prefix constants with NTP_ to avoid collisions with VS.NET + ntpq/ntpq_ops.c@1.20.1.1, 2004-11-04 00:03:09-05:00, mayer@tecotoo. +17 -17 + Prefix constants with NTP_ to avoid collisions with VS.NET + ChangeSet@1.1202.1.47, 2004-11-03 02:43:58-05:00, stenn@pogo.udel.edu +2 -0 autogen @@ -20635,10 +22359,10 @@ ChangeSet@1.1249.1.3, 2004-11-02 23:07:27-05:00, mayer@tecotoo. +1 -0 ChangeSet@1.1249.1.2, 2004-11-02 23:05:22-05:00, mayer@tecotoo. +3 -0 Remove unnecessary time variable references - libntp/ranny.c@1.3, 2004-11-02 23:04:56-05:00, mayer@tecotoo. +0 -2 + libntp/mktime.c@1.7, 2004-11-02 23:04:56-05:00, mayer@tecotoo. +3 -5 Remove unnecessary time variable references - libntp/mktime.c@1.7, 2004-11-02 23:04:56-05:00, mayer@tecotoo. +3 -5 + libntp/ranny.c@1.3, 2004-11-02 23:04:56-05:00, mayer@tecotoo. +0 -2 Remove unnecessary time variable references ports/winnt/ntpd/nt_clockstuff.c@1.14, 2004-11-02 23:04:57-05:00, mayer@tecotoo. +25 -27 @@ -20746,14 +22470,14 @@ ChangeSet@1.1202.6.1, 2004-10-28 20:49:19-04:00, mayer@pogo.udel.edu +2 -0 ChangeSet@1.1202.5.6, 2004-10-27 19:52:51-04:00, stenn@whimsy.udel.edu +6 -0 Updates from Dave Mills + html/copyright.html@1.28, 2004-10-27 19:52:28-04:00, stenn@whimsy.udel.edu +2 -2 + Updates from Dave Mills + html/drivers/footer.txt@1.1, 2004-10-27 19:50:59-04:00, stenn@whimsy.udel.edu +7 -0 html/drivers/footer.txt@1.0, 2004-10-27 19:50:59-04:00, stenn@whimsy.udel.edu +0 -0 BitKeeper file /deacon/backroom/ntp-dev/html/drivers/footer.txt - html/copyright.html@1.28, 2004-10-27 19:52:28-04:00, stenn@whimsy.udel.edu +2 -2 - Updates from Dave Mills - html/drivers/tf582_4.html@1.1, 2004-10-27 19:50:59-04:00, stenn@whimsy.udel.edu +72 -0 html/drivers/tf582_4.html@1.0, 2004-10-27 19:50:59-04:00, stenn@whimsy.udel.edu +0 -0 @@ -21783,10 +23507,10 @@ ChangeSet@1.1152.34.1, 2004-04-11 18:53:56+01:00, mbrett@rgs16.fordson.demon.co. ntpdc/ntpdc_ops.c@1.29.1.1, 2004-04-11 18:51:44+01:00, mbrett@rgs16.fordson.demon.co.uk +17 -17 Changes for type-paranoid MIPSpro compiler. - ntpq/ntpq_ops.c@1.20, 2004-04-11 18:52:47+01:00, mbrett@rgs16.fordson.demon.co.uk +1 -1 + ntpq/ntpq.c@1.45.1.1, 2004-04-11 18:52:43+01:00, mbrett@rgs16.fordson.demon.co.uk +2 -2 Changes for type-paranoid MIPSpro compiler. - ntpq/ntpq.c@1.45.1.1, 2004-04-11 18:52:43+01:00, mbrett@rgs16.fordson.demon.co.uk +2 -2 + ntpq/ntpq_ops.c@1.20, 2004-04-11 18:52:47+01:00, mbrett@rgs16.fordson.demon.co.uk +1 -1 Changes for type-paranoid MIPSpro compiler. ChangeSet@1.1178.1.4, 2004-04-07 20:45:38-04:00, stenn@whimsy.udel.edu +1 -0 @@ -22003,12 +23727,6 @@ ChangeSet@1.1152.31.5, 2004-03-25 21:17:21-05:00, stenn@whimsy.udel.edu +1 -0 ChangeSet@1.1152.31.4, 2004-03-25 21:13:54-05:00, stenn@whimsy.udel.edu +46 -0 Documentation cleanup/resync with Dave. - html/drivers/driver23.html@1.12, 2004-03-25 21:12:21-05:00, stenn@whimsy.udel.edu +2 -2 - Documentation cleanup/resync with Dave. - - html/drivers/driver24.html@1.9, 2004-03-25 21:12:21-05:00, stenn@whimsy.udel.edu +2 -2 - Documentation cleanup/resync with Dave. - html/build/build.html@1.20, 2004-03-25 21:12:17-05:00, stenn@whimsy.udel.edu +12 -12 Documentation cleanup/resync with Dave. @@ -22066,6 +23784,12 @@ ChangeSet@1.1152.31.4, 2004-03-25 21:13:54-05:00, stenn@whimsy.udel.edu +46 -0 html/drivers/driver22.html@1.15, 2004-03-25 21:12:21-05:00, stenn@whimsy.udel.edu +2 -2 Documentation cleanup/resync with Dave. + html/drivers/driver23.html@1.12, 2004-03-25 21:12:21-05:00, stenn@whimsy.udel.edu +2 -2 + Documentation cleanup/resync with Dave. + + html/drivers/driver24.html@1.9, 2004-03-25 21:12:21-05:00, stenn@whimsy.udel.edu +2 -2 + Documentation cleanup/resync with Dave. + html/drivers/driver26.html@1.9, 2004-03-25 21:12:22-05:00, stenn@whimsy.udel.edu +2 -2 Documentation cleanup/resync with Dave. @@ -23010,9 +24734,15 @@ ChangeSet@1.1152.15.5, 2003-12-25 18:46:06-05:00, mayer@tecotoo.myibg.com +1 -0 ChangeSet@1.1152.14.9, 2003-12-24 00:41:50-05:00, stenn@whimsy.udel.edu +4 -0 Cleanups, fix [Bug 320] + Makefile.am@1.45, 2003-12-24 00:38:57-05:00, stenn@whimsy.udel.edu +1 -1 + [Bug 230] Require automake-1.8. + acinclude.m4@1.12, 2003-12-24 00:39:20-05:00, stenn@whimsy.udel.edu +2 -2 Quote auto* stuff properly. + configure.in@1.336.1.1, 2003-12-24 00:40:35-05:00, stenn@whimsy.udel.edu +5 -4 + Require autoconf-2.58. Use version.m4. Cleanup. + version.m4@1.2, 2003-12-24 00:40:05-05:00, stenn@whimsy.udel.edu +1 -1 4.2.0a @@ -23021,12 +24751,6 @@ ChangeSet@1.1152.14.9, 2003-12-24 00:41:50-05:00, stenn@whimsy.udel.edu +4 -0 version.m4@1.0, 2003-12-24 00:10:17-05:00, stenn@whimsy.udel.edu +0 -0 BitKeeper file /backroom/ntp-stable/version.m4 - Makefile.am@1.45, 2003-12-24 00:38:57-05:00, stenn@whimsy.udel.edu +1 -1 - [Bug 230] Require automake-1.8. - - configure.in@1.336.1.1, 2003-12-24 00:40:35-05:00, stenn@whimsy.udel.edu +5 -4 - Require autoconf-2.58. Use version.m4. Cleanup. - ChangeSet@1.1152.14.8, 2003-12-20 20:28:35-05:00, stenn@whimsy.udel.edu +2 -0 [Bug 259] Marc Brett: lint @@ -23530,10 +25254,10 @@ ChangeSet@1.1152.8.1, 2003-10-22 11:13:33-04:00, blu@corwin. +2 -0 ntpq_ops.c, ntpq.c: Change formatting for multiple servers and add assID for multiple association output. - ntpq/ntpq_ops.c@1.19, 2003-10-22 11:12:55-04:00, blu@corwin. +38 -4 + ntpq/ntpq.c@1.44, 2003-10-22 11:12:09-04:00, blu@corwin. +2 -0 Change formatting for multiple servers and add assID for multiple association output. - ntpq/ntpq.c@1.44, 2003-10-22 11:12:09-04:00, blu@corwin. +2 -0 + ntpq/ntpq_ops.c@1.19, 2003-10-22 11:12:55-04:00, blu@corwin. +38 -4 Change formatting for multiple servers and add assID for multiple association output. ChangeSet@1.1152.1.13, 2003-10-22 13:16:39+02:00, peda@sectra.se +1 -0 diff --git a/contrib/ntp/Makefile.in b/contrib/ntp/Makefile.in index beb62007edcb..42b2e2e79db6 100644 --- a/contrib/ntp/Makefile.in +++ b/contrib/ntp/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,15 +14,12 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = . +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -36,11 +34,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @NEED_LIBOPTS_TRUE@am__append_1 = libopts +subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure ChangeLog INSTALL NEWS TODO compile \ config.guess config.sub depcomp install-sh ltmain.sh missing -subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/libopts/m4/libopts.m4 \ $(top_srcdir)/m4/define_dir.m4 \ @@ -50,34 +48,64 @@ am__aclocal_m4_deps = $(top_srcdir)/libopts/m4/libopts.m4 \ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno + configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -93,10 +121,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -109,11 +133,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -127,6 +150,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -140,8 +164,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -151,6 +174,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -164,16 +188,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -185,29 +204,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = util/ansi2knr foreign dist-tarZ no-dependencies AUTOMAKE_OPTIONS = util/ansi2knr foreign 1.8 @@ -299,15 +330,15 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ - cd $(srcdir) && $(AUTOMAKE) --foreign \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -323,21 +354,22 @@ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENC $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) - cd $(srcdir) && $(AUTOCONF) + $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ - $(MAKE) stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ @@ -351,8 +383,7 @@ clean-libtool: -rm -rf .libs _libs distclean-libtool: - -rm -f libtool -uninstall-info-am: + -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. @@ -378,15 +409,14 @@ $(RECURSIVE_TARGETS): else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: +$(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ @@ -413,16 +443,16 @@ maintainer-clean-recursive: else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) @@ -430,14 +460,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ @@ -449,84 +479,103 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) - mkdir $(distdir) - $(mkdir_p) $(distdir)/libopts/m4 $(distdir)/m4 $(distdir)/ntpdc $(distdir)/scripts - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ - || $(mkdir_p) "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ @@ -534,11 +583,12 @@ distdir: $(DISTFILES) $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) @@ -547,6 +597,14 @@ dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) @@ -573,6 +631,10 @@ distcheck: dist GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ @@ -584,9 +646,11 @@ distcheck: dist mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ @@ -608,13 +672,15 @@ distcheck: dist && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @cd $(distuninstallcheck_dir) \ + @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ @@ -658,6 +724,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -680,18 +747,38 @@ dvi-am: html: html-recursive +html-am: + info: info-recursive info-am: install-data-am: +install-dvi: install-dvi-recursive + +install-dvi-am: + install-exec-am: +install-html: install-html-recursive + +install-html-am: + install-info: install-info-recursive +install-info-am: + install-man: +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-recursive @@ -712,24 +799,27 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-info-am +uninstall-am: -uninstall-info: uninstall-info-recursive +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + ctags-recursive install install-am install-strip \ + tags-recursive -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ - check-am clean clean-generic clean-libtool clean-recursive \ - ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ - dist-hook dist-shar dist-tarZ dist-zip distcheck distclean \ - distclean-generic distclean-hdr distclean-libtool \ - distclean-recursive distclean-tags distcleancheck distdir \ +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ - maintainer-clean-recursive mostlyclean mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am uninstall-info-am + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-recursive uninstall uninstall-am $(srcdir)/COPYRIGHT: $(srcdir)/html/copyright.html @@ -803,6 +893,7 @@ FRC.CommitLog FRC.distwarn FRC.checkcvo FRC.checkhost FRC.version: # HMS: what was I trying to do with this? #dot.emacs: FRC.distwarn + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/NEWS b/contrib/ntp/NEWS index 6290fb5b202b..729a91f0f7a3 100644 --- a/contrib/ntp/NEWS +++ b/contrib/ntp/NEWS @@ -1,3 +1,91 @@ +NTP 4.2.4p8 (Harlan Stenn , 2009/12/08) + +Focus: Security Fixes + +Severity: HIGH + +This release fixes the following high-severity vulnerability: + +* [Sec 1331] DoS with mode 7 packets - CVE-2009-3563. + + See http://support.ntp.org/security for more information. + + NTP mode 7 (MODE_PRIVATE) is used by the ntpdc query and control utility. + In contrast, ntpq uses NTP mode 6 (MODE_CONTROL), while routine NTP time + transfers use modes 1 through 5. Upon receipt of an incorrect mode 7 + request or a mode 7 error response from an address which is not listed + in a "restrict ... noquery" or "restrict ... ignore" statement, ntpd will + reply with a mode 7 error response (and log a message). In this case: + + * If an attacker spoofs the source address of ntpd host A in a + mode 7 response packet sent to ntpd host B, both A and B will + continuously send each other error responses, for as long as + those packets get through. + + * If an attacker spoofs an address of ntpd host A in a mode 7 + response packet sent to ntpd host A, A will respond to itself + endlessly, consuming CPU and logging excessively. + + Credit for finding this vulnerability goes to Robin Park and Dmitri + Vinokurov of Alcatel-Lucent. + +THIS IS A STRONGLY RECOMMENDED UPGRADE. + +--- +NTP 4.2.4p7 (Harlan Stenn , 2009/05/04) + +Focus: Security and Bug Fixes + +Severity: HIGH + +This release fixes the following high-severity vulnerability: + +* [Sec 1151] Remote exploit if autokey is enabled. CVE-2009-1252 + + See http://support.ntp.org/security for more information. + + If autokey is enabled (if ntp.conf contains a "crypto pw whatever" + line) then a carefully crafted packet sent to the machine will cause + a buffer overflow and possible execution of injected code, running + with the privileges of the ntpd process (often root). + + Credit for finding this vulnerability goes to Chris Ries of CMU. + +This release fixes the following low-severity vulnerabilities: + +* [Sec 1144] limited (two byte) buffer overflow in ntpq. CVE-2009-0159 + Credit for finding this vulnerability goes to Geoff Keating of Apple. + +* [Sec 1149] use SO_EXCLUSIVEADDRUSE on Windows + Credit for finding this issue goes to Dave Hart. + +This release fixes a number of bugs and adds some improvements: + +* Improved logging +* Fix many compiler warnings +* Many fixes and improvements for Windows +* Adds support for AIX 6.1 +* Resolves some issues under MacOS X and Solaris + +THIS IS A STRONGLY RECOMMENDED UPGRADE. + +--- +NTP 4.2.4p6 (Harlan Stenn , 2009/01/07) + +Focus: Security Fix + +Severity: Low + +This release fixes oCERT.org's CVE-2009-0021, a vulnerability affecting +the OpenSSL library relating to the incorrect checking of the return +value of EVP_VerifyFinal function. + +Credit for finding this issue goes to the Google Security Team for +finding the original issue with OpenSSL, and to ocert.org for finding +the problem in NTP and telling us about it. + +This is a recommended upgrade. +--- NTP 4.2.4p5 (Harlan Stenn , 2008/08/17) Focus: Minor Bugfixes diff --git a/contrib/ntp/README b/contrib/ntp/README index daa85824e94d..dde61e269adb 100644 --- a/contrib/ntp/README +++ b/contrib/ntp/README @@ -1,7 +1,7 @@ Submit patches, bug reports, and enhancement requests via - http://bugs.ntp.isc.org + http://bugs.ntp.org The ntp Distribution Base Directory diff --git a/contrib/ntp/README.bk b/contrib/ntp/README.bk index dc867b52ecfa..8d8b2961edad 100644 --- a/contrib/ntp/README.bk +++ b/contrib/ntp/README.bk @@ -1,6 +1,6 @@ In order to use the BitKeeper repository version of NTP you should visit - http://ntp.isc.org/Main/SoftwareDevelopment + http://support.ntp.org/Main/SoftwareDevelopment for important information. diff --git a/contrib/ntp/README.patches b/contrib/ntp/README.patches index 476bc69a151e..f4cf755ae6cf 100644 --- a/contrib/ntp/README.patches +++ b/contrib/ntp/README.patches @@ -2,7 +2,7 @@ See README.hackers for notes on coding styles. The master copy of this information can be found at: - http://ntp.isc.org/bin/view/Dev/MaintainerIssues#How_to_work_on_a_bug_using_BitKe + http://support.ntp.org/Dev/MaintainerIssues#How_to_work_on_a_bug_using_BitKe If you are going to patch both ntp-stable and ntp-dev please do it this way: diff --git a/contrib/ntp/WHERE-TO-START b/contrib/ntp/WHERE-TO-START index 0814557854ba..fb96137b0acb 100644 --- a/contrib/ntp/WHERE-TO-START +++ b/contrib/ntp/WHERE-TO-START @@ -15,7 +15,7 @@ bugfixes and drivers for new and exotic radios, telephones and sundials. This distribution is normally available by anonymous ftp as the compressed tar archive ntp-.tar.gz in the pub/ntp directory on huey.udel.edu and is the version number. The current stable -and development version numbers can be found at . +and development version numbers can be found at . A considerable amount of documentation, including build instructions, configuration advice, program usage and miscellaneous information is diff --git a/contrib/ntp/aclocal.m4 b/contrib/ntp/aclocal.m4 index b90f615a0cae..69c28495dcd2 100644 --- a/contrib/ntp/aclocal.m4 +++ b/contrib/ntp/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- +# generated automatically by aclocal 1.11 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,6 +11,14 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, +[m4_warning([this file was generated for autoconf 2.65. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 47 AC_PROG_LIBTOOL @@ -6175,7 +6183,7 @@ SED=$lt_cv_path_SED AC_MSG_RESULT([$SED]) ]) -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -6185,14 +6193,31 @@ AC_MSG_RESULT([$SED]) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) +[AM_AUTOMAKE_VERSION([1.11])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- @@ -6249,14 +6274,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 7 +# serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- @@ -6265,8 +6290,11 @@ AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' @@ -6280,15 +6308,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 8 +# serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, @@ -6316,6 +6343,7 @@ AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) @@ -6344,6 +6372,16 @@ AC_CACHE_CHECK([dependency style of $depcc], if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -6361,7 +6399,17 @@ AC_CACHE_CHECK([dependency style of $depcc], done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -6371,18 +6419,23 @@ AC_CACHE_CHECK([dependency style of $depcc], break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -6433,61 +6486,74 @@ if test "x$enable_dependency_tracking" != xno; then AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 3 +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done done -done +} ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -6518,14 +6584,14 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 12 +# serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. @@ -6542,16 +6608,20 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl +[AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi fi # test whether we have cygpath @@ -6571,6 +6641,9 @@ m4_ifval([$2], AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl @@ -6586,8 +6659,8 @@ AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. @@ -6595,20 +6668,37 @@ AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header @@ -6619,18 +6709,19 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX], # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $1 | $1:* ) + $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -6641,7 +6732,14 @@ echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. @@ -6667,13 +6765,13 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # AM_MAKE_INCLUDE() # ----------------- @@ -6682,7 +6780,7 @@ AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. @@ -6692,24 +6790,24 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) @@ -6717,16 +6815,51 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 +# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 6 + +# AM_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ @@ -6742,7 +6875,15 @@ AC_SUBST($1)]) # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " @@ -6752,7 +6893,7 @@ else fi ]) -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -6760,70 +6901,33 @@ fi # AM_PROG_MKDIR_P # --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) +# Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- @@ -6840,7 +6944,7 @@ AC_DEFUN([_AM_SET_OPTION], # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- @@ -6848,14 +6952,14 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005 +# Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 AC_DEFUN([AM_C_PROTOTYPES], [AC_REQUIRE([AC_C_PROTOTYPES]) @@ -6866,23 +6970,24 @@ else fi # Ensure some checks needed by ansi2knr itself. AC_REQUIRE([AC_HEADER_STDC]) -AC_CHECK_HEADERS(string.h) -AC_SUBST(U)dnl -AC_SUBST(ANSI2KNR)dnl +AC_CHECK_HEADERS([string.h]) +AC_SUBST([U])dnl +AC_SUBST([ANSI2KNR])dnl +_AM_SUBST_NOTMAKE([ANSI2KNR])dnl ]) AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 # AM_SANITY_CHECK # --------------- @@ -6891,16 +6996,29 @@ AC_DEFUN([AM_SANITY_CHECK], # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ @@ -6950,9 +7068,28 @@ dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. diff --git a/contrib/ntp/adjtimed/Makefile.in b/contrib/ntp/adjtimed/Makefile.in index 7c16debc5aed..2fde4c6d8d03 100644 --- a/contrib/ntp/adjtimed/Makefile.in +++ b/contrib/ntp/adjtimed/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -18,15 +19,12 @@ # in sbindir. Now that we offer a choice, look in the "other" installation # subdir to warn folks if there is another version there. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -41,7 +39,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ ANSI2KNR = ../util/ansi2knr -bin_PROGRAMS = @MAKE_ADJTIMED@ EXTRA_PROGRAMS = adjtimed$(EXEEXT) DIST_COMMON = README $(srcdir)/../bincheck.mf $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -57,32 +54,32 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) adjtimed_SOURCES = adjtimed.c adjtimed_OBJECTS = adjtimed$U.$(OBJEXT) adjtimed_LDADD = $(LDADD) adjtimed_DEPENDENCIES = ../libntp/libntp.a -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = adjtimed.c DIST_SOURCES = adjtimed.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -98,10 +95,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -114,11 +107,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -132,6 +124,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -145,8 +138,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -156,6 +148,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -169,16 +162,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -190,30 +178,43 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = ../util/ansi2knr +bin_PROGRAMS = @MAKE_ADJTIMED@ AM_CPPFLAGS = -I$(top_srcdir)/include LDADD = ../libntp/libntp.a ETAGS_ARGS = Makefile.am @@ -225,14 +226,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../bincheck.mf $(am__con @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign adjtimed/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign adjtimed/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign adjtimed/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign adjtimed/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -250,37 +251,53 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list adjtimed$(EXEEXT): $(adjtimed_OBJECTS) $(adjtimed_DEPENDENCIES) @rm -f adjtimed$(EXEEXT) - $(LINK) $(adjtimed_LDFLAGS) $(adjtimed_OBJECTS) $(adjtimed_LDADD) $(LIBS) + $(LINK) $(adjtimed_OBJECTS) $(adjtimed_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -288,7 +305,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -296,22 +313,22 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adjtimed$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -325,83 +342,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -410,7 +429,7 @@ check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am @@ -432,6 +451,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -444,7 +464,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -452,20 +472,39 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -486,19 +525,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am +uninstall-am: uninstall-binPROGRAMS + +.MAKE: ../util/ansi2knr install-am install-exec-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-exec \ - install-exec-am install-exec-hook install-info install-info-am \ - install-man install-strip installcheck installcheck-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-kr mostlyclean-libtool pdf pdf-am ps ps-am tags \ - uninstall uninstall-am uninstall-binPROGRAMS uninstall-info-am + uninstall uninstall-am uninstall-binPROGRAMS install-exec-hook: @@ -512,6 +555,7 @@ install-exec-hook: done # + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/arlib/Makefile.in b/contrib/ntp/arlib/Makefile.in index ad2e1c496fc3..590880f3fd20 100644 --- a/contrib/ntp/arlib/Makefile.in +++ b/contrib/ntp/arlib/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -16,15 +17,12 @@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = . +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -47,9 +45,10 @@ am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno + configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru @@ -61,9 +60,10 @@ PROGRAMS = $(noinst_PROGRAMS) am_example_OBJECTS = sample.$(OBJEXT) example_OBJECTS = $(am_example_OBJECTS) example_DEPENDENCIES = libares.a -DEFAULT_INCLUDES = -I. -I$(srcdir) +DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) @@ -77,16 +77,14 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -103,6 +101,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EXEEXT = @EXEEXT@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ @@ -112,12 +111,14 @@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -125,11 +126,11 @@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -137,24 +138,36 @@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign # ansi2knr #lib_LIBRARIES = libares.a @@ -178,15 +191,15 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ - cd $(srcdir) && $(AUTOMAKE) --foreign \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -202,9 +215,10 @@ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENC $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) - cd $(srcdir) && $(AUTOCONF) + $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) @@ -217,7 +231,7 @@ clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) example$(EXEEXT): $(example_OBJECTS) $(example_DEPENDENCIES) @rm -f example$(EXEEXT) - $(LINK) $(example_LDFLAGS) $(example_OBJECTS) $(example_LDADD) $(LIBS) + $(LINK) $(example_OBJECTS) $(example_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -229,102 +243,109 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` -uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) - mkdir $(distdir) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) @@ -333,6 +354,14 @@ dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) @@ -359,6 +388,10 @@ distcheck: dist GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ @@ -370,9 +403,11 @@ distcheck: dist mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ @@ -394,13 +429,15 @@ distcheck: dist && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @cd $(distuninstallcheck_dir) \ + @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ @@ -441,6 +478,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -463,18 +501,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -496,20 +554,26 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS ctags \ - dist dist-all dist-bzip2 dist-gzip dist-shar dist-tarZ \ - dist-zip distcheck distclean distclean-compile \ - distclean-generic distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ - tags uninstall uninstall-am uninstall-info-am + dist dist-all dist-bzip2 dist-gzip dist-lzma dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/arlib/aclocal.m4 b/contrib/ntp/arlib/aclocal.m4 index aef181a6ddb4..fb69e8e2c0fa 100644 --- a/contrib/ntp/arlib/aclocal.m4 +++ b/contrib/ntp/arlib/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- +# generated automatically by aclocal 1.11 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,7 +11,15 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, +[m4_warning([this file was generated for autoconf 2.65. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -21,14 +29,31 @@ # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) +[AM_AUTOMAKE_VERSION([1.11])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- @@ -85,14 +110,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 7 +# serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- @@ -101,8 +126,11 @@ AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' @@ -116,15 +144,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 8 +# serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, @@ -152,6 +179,7 @@ AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) @@ -180,6 +208,16 @@ AC_CACHE_CHECK([dependency style of $depcc], if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -197,7 +235,17 @@ AC_CACHE_CHECK([dependency style of $depcc], done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -207,18 +255,23 @@ AC_CACHE_CHECK([dependency style of $depcc], break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -269,61 +322,74 @@ if test "x$enable_dependency_tracking" != xno; then AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 3 +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done done -done +} ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -342,14 +408,14 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 12 +# serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. @@ -366,16 +432,20 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl +[AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi fi # test whether we have cygpath @@ -395,6 +465,9 @@ m4_ifval([$2], AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl @@ -410,8 +483,8 @@ AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. @@ -419,20 +492,37 @@ AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header @@ -443,18 +533,19 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX], # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $1 | $1:* ) + $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -465,7 +556,14 @@ echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. @@ -491,13 +589,13 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # AM_MAKE_INCLUDE() # ----------------- @@ -506,7 +604,7 @@ AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. @@ -516,24 +614,24 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) @@ -543,14 +641,14 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ @@ -566,7 +664,15 @@ AC_SUBST($1)]) # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " @@ -576,7 +682,7 @@ else fi ]) -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -584,70 +690,33 @@ fi # AM_PROG_MKDIR_P # --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) +# Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- @@ -664,7 +733,7 @@ AC_DEFUN([_AM_SET_OPTION], # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- @@ -674,14 +743,14 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 # AM_SANITY_CHECK # --------------- @@ -690,16 +759,29 @@ AC_DEFUN([AM_SANITY_CHECK], # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ @@ -749,9 +831,28 @@ dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. diff --git a/contrib/ntp/arlib/configure b/contrib/ntp/arlib/configure index 1ab682693112..95e8a849e7c7 100755 --- a/contrib/ntp/arlib/configure +++ b/contrib/ntp/arlib/configure @@ -1,81 +1,414 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59. +# Generated by GNU Autoconf 2.65. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# # -# Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset + setopt NO_GLOB_SUBST else - as_unset=false + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac fi -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` - -# PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -83,146 +416,107 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -231,38 +525,25 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -exec 6>&1 - # # Initializations. # ac_default_prefix=/usr/local +ac_clean_files= ac_config_libobj_dir=. +LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= @@ -270,14 +551,111 @@ PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= +PACKAGE_URL= ac_unique_file="arlib.c" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE RANLIB ac_ct_RANLIB LIBOBJS LTLIBOBJS' +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +RANLIB +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS' + # Initialize some variables set by options. ac_init_help= ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null @@ -300,34 +678,48 @@ x_libraries=NONE # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' ac_prev= +ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" + eval $ac_prev=\$ac_option ac_prev= continue fi - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -349,33 +741,59 @@ do --config-cache | -C) cache_file=config.cache ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) + -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "enable_$ac_feature='$ac_optarg'" ;; + eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -402,6 +820,12 @@ do -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; @@ -426,13 +850,16 @@ do | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) @@ -497,6 +924,16 @@ do | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; @@ -547,26 +984,36 @@ do ac_init_version=: ;; -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "with_$ac_package='$ac_optarg'" ;; + eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. @@ -586,26 +1033,25 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; @@ -614,31 +1060,36 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error "missing argument to $ac_option" fi -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac -done +fi -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - eval ac_val=$`echo $ac_var` + eval ac_val=\$$ac_var + # Remove trailing slashes. case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -652,7 +1103,7 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes @@ -665,70 +1116,72 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } - fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 - { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done # # Report the --help message. @@ -757,14 +1210,11 @@ Configuration: -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] -_ACEOF - - cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -774,18 +1224,25 @@ for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF @@ -802,6 +1259,7 @@ if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build @@ -812,125 +1270,259 @@ Some influential environment variables: CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory - CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have - headers in a nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. +Report bugs to the package provider. _ACEOF +ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. - ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } done fi -test -n "$ac_init_help" && exit 0 +test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF +configure +generated by GNU Autoconf 2.65 -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF - exit 0 + exit fi -exec 5>config.log -cat >&5 <<_ACEOF + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_type +cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF +exec 5>>config.log { cat <<_ASUNAME ## --------- ## @@ -949,7 +1541,7 @@ uname -v = `(uname -v) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` @@ -961,8 +1553,9 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS } >&5 @@ -984,7 +1577,6 @@ _ACEOF ac_configure_args= ac_configure_args0= ac_configure_args1= -ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do @@ -995,13 +1587,13 @@ do -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1017,21 +1609,19 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { @@ -1044,20 +1634,35 @@ trap 'exit_status=$? _ASBOX echo # The following way of writing the cache mishandles newlines in values, -{ +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} + esac | + sort +) echo cat <<\_ASBOX @@ -1068,22 +1673,28 @@ _ASBOX echo for ac_var in $ac_subst_vars do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## +## ------------------- ## +## File substitutions. ## +## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1095,26 +1706,26 @@ _ASBOX ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h | sort + cat confdefs.h echo fi test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status - ' 0 +' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. @@ -1122,112 +1733,128 @@ cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; esac fi else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do +for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -1236,48 +1863,30 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +am__api_version='1.11' - - - - - - - - - - - - - - - - -am__api_version="1.9" ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f $ac_dir/shtool; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -1292,22 +1901,23 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -1315,7 +1925,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1325,30 +1935,43 @@ case $as_dir/ in # program-specific install script used by HP pwplus--don't use. : else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi fi fi done done ;; esac -done + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -1358,21 +1981,34 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ @@ -1382,11 +2018,8 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file @@ -1395,81 +2028,206 @@ then # Ok. : else - { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } test "$program_prefix" != NONE && - program_transform_name="s,^,$program_prefix,;$program_transform_name" + program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && - program_transform_name="s,\$,$program_suffix,;$program_transform_name" -# Double any \ or $. echo might interpret backslashes. + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. # By default was `s,x,x', remove it if useless. -cat <<\_ACEOF >conftest.sed -s/[\\$]/&&/g;s/;s,x,x,$// -_ACEOF -program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm conftest.sed +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else - mkdir_p='$(install_sh) -d' + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" fi fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. @@ -1479,55 +2237,59 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$AWK" && break done -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -1540,12 +2302,14 @@ else fi rmdir .tst 2>/dev/null -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi fi # test whether we have cygpath @@ -1588,96 +2352,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -install_sh=${install_sh-"$am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - STRIP=$ac_ct_STRIP -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. @@ -1702,10 +2376,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1715,35 +2389,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -1753,39 +2429,50 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1795,77 +2482,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1876,18 +2523,19 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -1905,24 +2553,25 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -1932,39 +2581,41 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -1974,66 +2625,78 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2045,112 +2708,109 @@ main () } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. break;; * ) break;; esac done +test "$ac_cv_exeext" = no && ac_cv_exeext= + else - echo "$as_me: failed program was:" >&5 + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } fi - +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -rm -f a.out a.exe conftest$ac_cv_exeext b.out +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -2158,38 +2818,90 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} _ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2201,45 +2913,46 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2253,55 +2966,34 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -GCC=`test $ac_compiler_gnu = yes && echo yes` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2312,39 +3004,49 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_cv_prog_cc_g=no +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -2360,18 +3062,14 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -2399,12 +3097,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2419,205 +3122,37 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg fi -rm -f conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac - -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if test "x$ac_cv_prog_cc_c89" != xno; then : fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2625,60 +3160,58 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" - ac_config_commands="$ac_config_commands depfiles" +ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi -echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } rm -f confinc confmf -# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval="$enable_dependency_tracking" +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi -fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi - - -if test "x$enable_dependency_tracking" != xno; then + if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else @@ -2688,13 +3221,12 @@ fi - depcc="$CC" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up @@ -2719,6 +3251,11 @@ else if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -2736,7 +3273,17 @@ else done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -2746,18 +3293,23 @@ else break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -2781,13 +3333,11 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - -if + if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= @@ -2801,10 +3351,10 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. @@ -2814,35 +3364,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. @@ -2852,194 +3404,132 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi # Checks for libraries. -echo "$as_me:$LINENO: checking for gethostent" >&5 -echo $ECHO_N "checking for gethostent... $ECHO_C" >&6 -if test "${ac_cv_func_gethostent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_func "$LINENO" "gethostent" "ac_cv_func_gethostent" +if test "x$ac_cv_func_gethostent" = x""yes; then : + else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define gethostent to an innocuous variant, in case declares gethostent. - For example, HP-UX 11i declares gettimeofday. */ -#define gethostent innocuous_gethostent - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char gethostent (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef gethostent - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char gethostent (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_gethostent) || defined (__stub___gethostent) -choke me -#else -char (*f) () = gethostent; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != gethostent; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_gethostent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_gethostent=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_gethostent" >&5 -echo "${ECHO_T}$ac_cv_func_gethostent" >&6 -if test $ac_cv_func_gethostent = yes; then - : -else - -echo "$as_me:$LINENO: checking for gethostent in -lnsl" >&5 -echo $ECHO_N "checking for gethostent in -lnsl... $ECHO_C" >&6 -if test "${ac_cv_lib_nsl_gethostent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostent in -lnsl" >&5 +$as_echo_n "checking for gethostent in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_gethostent+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl -lsocket $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char gethostent (); int main () { -gethostent (); +return gethostent (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostent=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_nsl_gethostent=no + ac_cv_lib_nsl_gethostent=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostent" >&5 -echo "${ECHO_T}$ac_cv_lib_nsl_gethostent" >&6 -if test $ac_cv_lib_nsl_gethostent = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostent" >&5 +$as_echo "$ac_cv_lib_nsl_gethostent" >&6; } +if test "x$ac_cv_lib_nsl_gethostent" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNSL 1 _ACEOF @@ -3050,165 +3540,47 @@ fi fi -echo "$as_me:$LINENO: checking for setsockopt" >&5 -echo $ECHO_N "checking for setsockopt... $ECHO_C" >&6 -if test "${ac_cv_func_setsockopt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" +if test "x$ac_cv_func_setsockopt" = x""yes; then : + else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define setsockopt to an innocuous variant, in case declares setsockopt. - For example, HP-UX 11i declares gettimeofday. */ -#define setsockopt innocuous_setsockopt - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char setsockopt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef setsockopt - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char setsockopt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_setsockopt) || defined (__stub___setsockopt) -choke me -#else -char (*f) () = setsockopt; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != setsockopt; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_setsockopt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_setsockopt=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_setsockopt" >&5 -echo "${ECHO_T}$ac_cv_func_setsockopt" >&6 -if test $ac_cv_func_setsockopt = yes; then - : -else - -echo "$as_me:$LINENO: checking for setsockopt in -lsocket" >&5 -echo $ECHO_N "checking for setsockopt in -lsocket... $ECHO_C" >&6 -if test "${ac_cv_lib_socket_setsockopt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 +$as_echo_n "checking for setsockopt in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_setsockopt+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char setsockopt (); int main () { -setsockopt (); +return setsockopt (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_socket_setsockopt=no + ac_cv_lib_socket_setsockopt=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_socket_setsockopt" >&5 -echo "${ECHO_T}$ac_cv_lib_socket_setsockopt" >&6 -if test $ac_cv_lib_socket_setsockopt = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 +$as_echo "$ac_cv_lib_socket_setsockopt" >&6; } +if test "x$ac_cv_lib_socket_setsockopt" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSOCKET 1 _ACEOF @@ -3219,165 +3591,47 @@ fi fi -echo "$as_me:$LINENO: checking for res_init" >&5 -echo $ECHO_N "checking for res_init... $ECHO_C" >&6 -if test "${ac_cv_func_res_init+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_func "$LINENO" "res_init" "ac_cv_func_res_init" +if test "x$ac_cv_func_res_init" = x""yes; then : + else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define res_init to an innocuous variant, in case declares res_init. - For example, HP-UX 11i declares gettimeofday. */ -#define res_init innocuous_res_init - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char res_init (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef res_init - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char res_init (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_res_init) || defined (__stub___res_init) -choke me -#else -char (*f) () = res_init; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != res_init; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_res_init=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_res_init=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_res_init" >&5 -echo "${ECHO_T}$ac_cv_func_res_init" >&6 -if test $ac_cv_func_res_init = yes; then - : -else - -echo "$as_me:$LINENO: checking for res_init in -lresolv" >&5 -echo $ECHO_N "checking for res_init in -lresolv... $ECHO_C" >&6 -if test "${ac_cv_lib_resolv_res_init+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_init in -lresolv" >&5 +$as_echo_n "checking for res_init in -lresolv... " >&6; } +if test "${ac_cv_lib_resolv_res_init+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lresolv $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char res_init (); int main () { -res_init (); +return res_init (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_resolv_res_init=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_resolv_res_init=no + ac_cv_lib_resolv_res_init=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_resolv_res_init" >&5 -echo "${ECHO_T}$ac_cv_lib_resolv_res_init" >&6 -if test $ac_cv_lib_resolv_res_init = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_init" >&5 +$as_echo "$ac_cv_lib_resolv_res_init" >&6; } +if test "x$ac_cv_lib_resolv_res_init" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRESOLV 1 _ACEOF @@ -3393,88 +3647,27 @@ fi # Checks for typedefs, structures, and compiler characteristics. -echo "$as_me:$LINENO: checking for u_int32_t" >&5 -echo $ECHO_N "checking for u_int32_t... $ECHO_C" >&6 -if test "${ac_cv_type_u_int32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - +ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" " #include #include +" +if test "x$ac_cv_type_u_int32_t" = x""yes; then : -int -main () -{ -if ((u_int32_t *) 0) - return 0; -if (sizeof (u_int32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_u_int32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_u_int32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_u_int32_t" >&5 -echo "${ECHO_T}$ac_cv_type_u_int32_t" >&6 -if test $ac_cv_type_u_int32_t = yes; then - : else -cat >>confdefs.h <<\_ACEOF -#define u_int32_t unsigned int -_ACEOF +$as_echo "#define u_int32_t unsigned int" >>confdefs.h fi -echo "$as_me:$LINENO: checking for name of NS address list" >&5 -echo $ECHO_N "checking for name of NS address list... $ECHO_C" >&6 -if test "${ac_cv_var_ns_addr_list+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for name of NS address list" >&5 +$as_echo_n "checking for name of NS address list... " >&6; } +if test "${ac_cv_var_ns_addr_list+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans='' # Normal -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -3489,39 +3682,11 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ans=nsaddr_list else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -# Ultrix -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + # Ultrix +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -3536,49 +3701,22 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ans=ns_list -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext case "$ans" in - '') echo "$as_me:$LINENO: result: ???" >&5 -echo "${ECHO_T}???" >&6 - { { echo "$as_me:$LINENO: error: Can't find nameserver address list in _res" >&5 -echo "$as_me: error: Can't find nameserver address list in _res" >&2;} - { (exit 1); exit 1; }; } + '') { $as_echo "$as_me:${as_lineno-$LINENO}: result: ???" >&5 +$as_echo "???" >&6; } + as_fn_error "Can't find nameserver address list in _res" "$LINENO" 5 ;; esac ac_cv_var_ns_addr_list=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_ns_addr_list" >&5 -echo "${ECHO_T}$ac_cv_var_ns_addr_list" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_ns_addr_list" >&5 +$as_echo "$ac_cv_var_ns_addr_list" >&6; } cat >>confdefs.h <<_ACEOF #define NS_ADDR_LIST $ans @@ -3587,7 +3725,7 @@ _ACEOF # Checks for library functions. - ac_config_files="$ac_config_files Makefile" +ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -3607,39 +3745,59 @@ _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. +# So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -{ +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; + ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} | + esac | + sort +) | sed ' + /^ac_cv_env_/b end t clear - : clear + :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - echo "not updating unwritable cache $cache_file" + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -3648,90 +3806,85 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' -fi - # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that -# take arguments), then we branch to the quote section. Otherwise, +# take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. -cat >confdef2opt.sed <<\_ACEOF +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote -d -: quote -s,[ `~#$^&*(){}\\|;'"<>?],\\&,g -s,\[,\\&,g -s,\],\\&,g -s,\$,$$,g -p -_ACEOF -# We use echo to avoid assuming a particular line-breaking character. -# The extra dot is to prevent the shell from consuming trailing -# line-breaks from the sub-command output. A line-break within -# single-quotes doesn't work because, if this script is created in a -# platform that uses two characters for line-breaks (e.g., DOS), tr -# would break. -ac_LF_and_DOT=`echo; echo .` -DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` -rm -f confdef2opt.sed +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} +ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -3741,81 +3894,252 @@ cat >$CONFIG_STATUS <<_ACEOF debug=false ac_cs_recheck=false ac_cs_silent=false + SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset + setopt NO_GLOB_SUBST else - as_unset=false + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac fi -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` - -# PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -3823,148 +4147,123 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -3973,31 +4272,20 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Open the log real soon, to keep \$[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - +# values after options handling. +ac_log=" This file was extended by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -4005,43 +4293,41 @@ generated by GNU Autoconf 2.59. Invocation command line was CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + _ACEOF +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi +config_files="$ac_config_files" +config_commands="$ac_config_commands" -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -cat >>$CONFIG_STATUS <<\_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTIONS] [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE Configuration files: $config_files @@ -4049,84 +4335,75 @@ $config_files Configuration commands: $config_commands -Report bugs to ." -_ACEOF +Report bugs to the package provider." -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - -*) + *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; } ;; + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" ;; + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; esac shift @@ -4140,38 +4417,50 @@ if $ac_cs_silent; then fi _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" fi _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # -# INIT-COMMANDS section. +# INIT-COMMANDS # - AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF +# Handling of arguments. for ac_config_target in $ac_config_targets do - case "$ac_config_target" in - # Handling of arguments. - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done + # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely @@ -4182,564 +4471,515 @@ if $ac_need_defaults; then fi # Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, +# simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 } - # Create a (secure) tmp directory for tmp files. { - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) -} || + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + { - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi -# -# CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@PACKAGE@,$PACKAGE,;t t -s,@VERSION@,$VERSION,;t t -s,@ACLOCAL@,$ACLOCAL,;t t -s,@AUTOCONF@,$AUTOCONF,;t t -s,@AUTOMAKE@,$AUTOMAKE,;t t -s,@AUTOHEADER@,$AUTOHEADER,;t t -s,@MAKEINFO@,$MAKEINFO,;t t -s,@install_sh@,$install_sh,;t t -s,@STRIP@,$STRIP,;t t -s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -s,@mkdir_p@,$mkdir_p,;t t -s,@AWK@,$AWK,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@am__leading_dot@,$am__leading_dot,;t t -s,@AMTAR@,$AMTAR,;t t -s,@am__tar@,$am__tar,;t t -s,@am__untar@,$am__untar,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@DEPDIR@,$DEPDIR,;t t -s,@am__include@,$am__include,;t t -s,@am__quote@,$am__quote,;t t -s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -s,@CCDEPMODE@,$CCDEPMODE,;t t -s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t -s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; esac - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || + ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + case $ac_mode in + :F) + # + # CONFIG_FILE + # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac - - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub $extrasub _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`(dirname "$mf") 2>/dev/null || + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`(dirname "$file") 2>/dev/null || + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p $dirpart/$fdir - else - as_dir=$dirpart/$fdir - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} - { (exit 1); exit 1; }; }; } - - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" done -done +} ;; + esac -done -_ACEOF +done # for ac_tag -cat >>$CONFIG_STATUS <<\_ACEOF -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. @@ -4759,6 +4999,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/contrib/ntp/build b/contrib/ntp/build index 4eab58e0d375..2a65d8678266 100755 --- a/contrib/ntp/build +++ b/contrib/ntp/build @@ -2,13 +2,15 @@ LOGF=make.log IAM=`hostname || uname -n` +MYNAME=`IFS=. ; set $IAM ; echo $1` +SIG= case "$1" in 0.*) SIG=$1 shift CONFIG_ARGS="$@" - KEY=`sed -e q < .buildkey` + KEY=`sed -e q < .buildkey-$MYNAME` case "$SIG" in $KEY) ;; *) @@ -36,8 +38,6 @@ case "$CVO" in ;; esac -MYNAME=`IFS=. ; set $IAM ; echo $1` - case "$IAM" in *.udel.edu) BDIR=A.$MYNAME @@ -90,17 +90,33 @@ BDIR="$BDIR$KEYSUF$CCSUF" [ -f "$BDIR/.buildcvo" ] || echo $CVO > $BDIR/.buildcvo [ -f "$BDIR/.buildhost" ] || echo $IAM > $BDIR/.buildhost + cd $BDIR -( -[ -f config.status ] || ../configure $CONFIG_ARGS +# +# make sure we have a nice that works, +# +nice true && NICEB=nice +nice true || NICEB=./.nicebuild-$MYNAME-$SIG && ( + cat > .nicebuild-$MYNAME-$SIG < $LOGF 2>&1 diff --git a/contrib/ntp/clockstuff/Makefile.in b/contrib/ntp/clockstuff/Makefile.in index 4ee3a5b44884..ba4e4cdd6793 100644 --- a/contrib/ntp/clockstuff/Makefile.in +++ b/contrib/ntp/clockstuff/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -37,7 +35,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ ANSI2KNR = ../util/ansi2knr -noinst_PROGRAMS = @PROPDELAY@ @CHUTEST@ @CLKTEST@ EXTRA_PROGRAMS = propdelay$(EXEEXT) chutest$(EXEEXT) clktest$(EXEEXT) subdir = clockstuff DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in @@ -52,6 +49,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) chutest_SOURCES = chutest.c chutest_OBJECTS = chutest$U.$(OBJEXT) @@ -62,25 +60,25 @@ clktest_DEPENDENCIES = ../libntp/libntp.a propdelay_SOURCES = propdelay.c propdelay_OBJECTS = propdelay$U.$(OBJEXT) propdelay_DEPENDENCIES = ../libntp/libntp.a -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = chutest.c clktest.c propdelay.c DIST_SOURCES = chutest.c clktest.c propdelay.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -96,10 +94,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -112,11 +106,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -130,6 +123,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -143,8 +137,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -154,6 +147,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -167,16 +161,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -188,32 +177,45 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../util/ansi2knr +noinst_PROGRAMS = @PROPDELAY@ @CHUTEST@ @CLKTEST@ INCLUDES = -I$(top_srcdir)/include # We need -lm (and perhaps $(COMPAT) for propdelay, -lntp for {chu,clk}test propdelay_LDADD = -lm ../libntp/libntp.a @@ -228,14 +230,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign clockstuff/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign clockstuff/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign clockstuff/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign clockstuff/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -253,16 +255,19 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list propdelay$(EXEEXT): $(propdelay_OBJECTS) $(propdelay_DEPENDENCIES) @rm -f propdelay$(EXEEXT) - $(LINK) $(propdelay_LDFLAGS) $(propdelay_OBJECTS) $(propdelay_LDADD) $(LIBS) + $(LINK) $(propdelay_OBJECTS) $(propdelay_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -270,7 +275,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -280,22 +285,22 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/propdelay$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -314,82 +319,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -417,6 +425,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -430,7 +439,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -438,18 +447,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -470,19 +499,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: ../util/ansi2knr install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-kr \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-info-am + uninstall-am #EXTRA_DIST = TAGS @@ -491,6 +524,7 @@ uninstall-am: uninstall-info-am chutest$(EXEEXT): ../libntp/libntp.a clktest$(EXEEXT): ../libntp/libntp.a + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/config.h.in b/contrib/ntp/config.h.in index c8bfb41640de..84e57fd8e8e4 100644 --- a/contrib/ntp/config.h.in +++ b/contrib/ntp/config.h.in @@ -1,5 +1,8 @@ /* config.h.in. Generated from configure.ac by autoheader. */ +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + /* Is adjtime() accurate? */ #undef ADJTIME_IS_ACCURATE @@ -325,7 +328,7 @@ /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT -/* Can we drop root privileges? */ +/* [Can we drop root privileges?] */ #undef HAVE_DROPROOT /* Define to 1 if you have the header file. */ @@ -370,9 +373,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_IEEEFP_H -/* ISC: Use iflist_sysctl? */ +/* have iflist_sysctl? */ #undef HAVE_IFLIST_SYSCTL +/* inline keyword or macro available */ +#undef HAVE_INLINE + /* Define to 1 if the system has the type `int16_t'. */ #undef HAVE_INT16_T @@ -388,6 +394,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H +/* Do we have IPTOS support? */ +#undef HAVE_IPTOS_SUPPORT + /* Define to 1 if you have the `isfinite' function. */ #undef HAVE_ISFINITE @@ -421,18 +430,9 @@ /* Define to 1 if you have the `ld' library (-lld). */ #undef HAVE_LIBLD -/* Define to 1 if you have the `md' library (-lmd). */ -#undef HAVE_LIBMD - -/* Define to 1 if you have the `md5' library (-lmd5). */ -#undef HAVE_LIBMD5 - /* Define to 1 if you have the `mld' library (-lmld). */ #undef HAVE_LIBMLD -/* Define to 1 if you have the `nsl' library (-lnsl). */ -#undef HAVE_LIBNSL - /* Define to 1 if you have the `posix4' library (-lposix4). */ #undef HAVE_LIBPOSIX4 @@ -442,19 +442,13 @@ /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT -/* Define to 1 if you have the `socket' library (-lsocket). */ -#undef HAVE_LIBSOCKET - -/* Define to 1 if you have the `syslog' library (-lsyslog). */ -#undef HAVE_LIBSYSLOG - -/* Define to 1 if you have the `xnet' library (-lxnet). */ -#undef HAVE_LIBXNET +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBSCF_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H -/* Do we have Linux capabilities? */ +/* [Do we have Linux capabilities?] */ #undef HAVE_LINUX_CAPABILITIES /* Define to 1 if you have the header file. */ @@ -544,6 +538,9 @@ /* Define to 1 if you have the `ntp_gettime' function. */ #undef HAVE_NTP_GETTIME +/* Do we want support for Samba's signing daemon? */ +#undef HAVE_NTP_SIGND + /* Define this if pathfind(3) works */ #undef HAVE_PATHFIND @@ -646,6 +643,9 @@ /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF +/* [Are Solaris privileges available?] */ +#undef HAVE_SOLARIS_PRIVS + /* Does struct sockaddr_storage have ss_family? */ #undef HAVE_SS_FAMILY_IN_SS @@ -691,7 +691,7 @@ /* Do we have struct ntptimeval? */ #undef HAVE_STRUCT_NTPTIMEVAL -/* Define to 1 if `time.tv_nsec' is member of `struct ntptimeval'. */ +/* Define to 1 if `time.tv_nsec' is a member of `struct ntptimeval'. */ #undef HAVE_STRUCT_NTPTIMEVAL_TIME_TV_NSEC /* Does a system header define struct ppsclockev? */ @@ -700,9 +700,6 @@ /* Do we have struct snd_size? */ #undef HAVE_STRUCT_SND_SIZE -/* Define to 1 if `sin6_scope_id' is member of `struct sockaddr_in6'. */ -#undef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID - /* Does a system header define struct sockaddr_storage? */ #undef HAVE_STRUCT_SOCKADDR_STORAGE @@ -978,6 +975,9 @@ /* Does struct sockaddr_storage have __ss_len? */ #undef HAVE___SS_LEN_IN_SS +/* [Retry queries on _any_ DNS error?] */ +#undef IGNORE_DNS_ERRORS + /* Should we use the IRIG sawtooth filter? */ #undef IRIG_SUCKS @@ -987,30 +987,33 @@ /* ISC: do we have if_nametoindex()? */ #undef ISC_PLATFORM_HAVEIFNAMETOINDEX -/* ISC: have struct if_laddrconf? */ +/* have struct if_laddrconf? */ #undef ISC_PLATFORM_HAVEIF_LADDRCONF -/* ISC: have struct if_laddrreq? */ +/* have struct if_laddrreq? */ #undef ISC_PLATFORM_HAVEIF_LADDRREQ -/* ISC: Have struct in6_pktinfo? */ +/* have struct in6_pktinfo? */ #undef ISC_PLATFORM_HAVEIN6PKTINFO -/* ISC: Have IPv6? */ +/* have IPv6? */ #undef ISC_PLATFORM_HAVEIPV6 /* ISC: struct sockaddr as sa_len? */ #undef ISC_PLATFORM_HAVESALEN -/* ISC: Have sin6_scope_id? */ +/* have sin6_scope_id? */ #undef ISC_PLATFORM_HAVESCOPEID /* ISC: provide inet_aton() */ #undef ISC_PLATFORM_NEEDATON -/* ISC: Need in6addr_any? */ +/* missing in6addr_any? */ #undef ISC_PLATFORM_NEEDIN6ADDRANY +/* Do we need netinet6/in6.h? */ +#undef ISC_PLATFORM_NEEDNETINET6IN6H + /* ISC: provide inet_ntop() */ #undef ISC_PLATFORM_NEEDNTOP @@ -1089,6 +1092,9 @@ /* Default location of crypto key info */ #undef NTP_KEYSDIR +/* Path to sign daemon rendezvous socket */ +#undef NTP_SIGND_PATH + /* Do we have ntp_{adj,get}time in libc? */ #undef NTP_SYSCALLS_LIBC @@ -1129,6 +1135,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION @@ -1171,22 +1180,22 @@ /* Do we want the SCO clock hacks? */ #undef SCO5_CLOCK -/* The size of a `char*', as computed by sizeof. */ +/* The size of `char*', as computed by sizeof. */ #undef SIZEOF_CHARP -/* The size of a `int', as computed by sizeof. */ +/* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT -/* The size of a `long', as computed by sizeof. */ +/* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG -/* The size of a `short', as computed by sizeof. */ +/* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT -/* The size of a `signed char', as computed by sizeof. */ +/* The size of `signed char', as computed by sizeof. */ #undef SIZEOF_SIGNED_CHAR -/* The size of a `time_t', as computed by sizeof. */ +/* The size of `time_t', as computed by sizeof. */ #undef SIZEOF_TIME_T /* Does SIOCGIFCONF return size in the buffer? */ @@ -1249,6 +1258,28 @@ typedef unsigned int uintptr_t; /* Must we have a CTTY for fsetown? */ #undef USE_FSETOWNCTTY +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + /* Can we use SIGPOLL for tty IO? */ #undef USE_TTY_SIGPOLL @@ -1258,15 +1289,26 @@ typedef unsigned int uintptr_t; /* Version number of package */ #undef VERSION -/* ISC: Want IPv6? */ +/* configure --enable-ipv6 */ #undef WANT_IPV6 +/* Do we want the windows symmetric client hack? */ +#undef WINTIME + /* Define this if a working libregex can be found */ #undef WITH_LIBREGEX -/* Define to 1 if your processor stores words with the most significant byte - first (like Motorola and SPARC, unlike Intel and VAX). */ -#undef WORDS_BIGENDIAN +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif /* Handle ss_family */ #if !defined(HAVE_SS_FAMILY_IN_SS) && defined(HAVE___SS_FAMILY_IN_SS) @@ -1278,13 +1320,6 @@ typedef unsigned int uintptr_t; # define ss_len __ss_len #endif /* !defined(HAVE_SS_LEN_IN_SS) && defined(HAVE_SA_LEN_IN_SS) */ -/* Define to 1 if on AIX 3. - System headers sometimes define this. - We just want to avoid a redefinition error message. */ -#ifndef _ALL_SOURCE -# undef _ALL_SOURCE -#endif - /* Define to 1 if on MINIX. */ #undef _MINIX @@ -1315,10 +1350,10 @@ typedef unsigned int uintptr_t; #undef inline #endif -/* Define to `long' if does not define. */ +/* Define to `long int' if does not define. */ #undef off_t -/* Define to `unsigned' if does not define. */ +/* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `long' if does not define. */ diff --git a/contrib/ntp/configure b/contrib/ntp/configure index 03c099aad0d7..fa7716da51ab 100755 --- a/contrib/ntp/configure +++ b/contrib/ntp/configure @@ -1,81 +1,415 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for ntp 4.2.4p5. +# Generated by GNU Autoconf 2.65 for ntp 4.2.4p8. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# # -# Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset + setopt NO_GLOB_SUBST else - as_unset=false + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac fi -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` - -# PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -83,146 +417,107 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -231,16 +526,6 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - - # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} @@ -391,84 +676,326 @@ fi -tagnames=${tagnames+${tagnames},}CXX - -tagnames=${tagnames+${tagnames},}F77 +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -exec 6>&1 - # # Initializations. # ac_default_prefix=/usr/local +ac_clean_files= ac_config_libobj_dir=. +LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='ntp' PACKAGE_TARNAME='ntp' -PACKAGE_VERSION='4.2.4p5' -PACKAGE_STRING='ntp 4.2.4p5' +PACKAGE_VERSION='4.2.4p8' +PACKAGE_STRING='ntp 4.2.4p8' PACKAGE_BUGREPORT='' +PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include -#if HAVE_SYS_TYPES_H +#ifdef HAVE_SYS_TYPES_H # include #endif -#if HAVE_SYS_STAT_H +#ifdef HAVE_SYS_STAT_H # include #endif -#if STDC_HEADERS +#ifdef STDC_HEADERS # include # include #else -# if HAVE_STDLIB_H +# ifdef HAVE_STDLIB_H # include # endif #endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif -#if HAVE_STRINGS_H +#ifdef HAVE_STRINGS_H # include #endif -#if HAVE_INTTYPES_H +#ifdef HAVE_INTTYPES_H # include -#else -# if HAVE_STDINT_H -# include -# endif #endif -#if HAVE_UNISTD_H +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H # include #endif" -ac_subdirs_all="$ac_subdirs_all arlib" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP LIBOPTS_DIR INSTALL_LIBOPTS_TRUE INSTALL_LIBOPTS_FALSE NEED_LIBOPTS_TRUE NEED_LIBOPTS_FALSE LIBOPTS_LDADD LIBOPTS_CFLAGS BINSUBDIR subdirs ARLIB_DIR LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL PATH_SH PATH_PERL READLINE_LIBS U ANSI2KNR LIBPARSE MAKE_LIBPARSE MAKE_LIBPARSE_KERNEL MAKE_CHECK_Y2K OPENSSL OPENSSL_INC OPENSSL_LIB LCRYPTO EF_PROGS EF_LIBS MAKE_CHECK_LAYOUT TESTDCF DCFD MAKE_PARSEKMODULE PROPDELAY CHUTEST CLKTEST MAKE_ADJTIMED MAKE_NTPTIME MAKE_TICKADJ MAKE_TIMETRIM MAKE_LIBNTPSIM MAKE_NTPDSIM LIBOBJS LTLIBOBJS' +enable_option_checking=no +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +LSCF +MAKE_NTPDSIM +MAKE_LIBNTPSIM +MAKE_TIMETRIM +MAKE_TICKADJ +MAKE_NTPTIME +MAKE_ADJTIMED +CLKTEST +CHUTEST +PROPDELAY +MAKE_PARSEKMODULE +DCFD +TESTDCF +MAKE_CHECK_LAYOUT +EF_LIBS +EF_PROGS +LCRYPTO +OPENSSL_LIB +OPENSSL_INC +OPENSSL +MAKE_CHECK_Y2K +MAKE_LIBPARSE_KERNEL +MAKE_LIBPARSE +LIBPARSE +HAVE_INLINE +ANSI2KNR +U +READLINE_LIBS +PATH_PERL +PATH_SH +LIBTOOL +RANLIB +AR +ECHO +LN_S +ARLIB_DIR +subdirs +BINSUBDIR +LIBOPTS_CFLAGS +LIBOPTS_LDADD +NEED_LIBOPTS_FALSE +NEED_LIBOPTS_TRUE +INSTALL_LIBOPTS_FALSE +INSTALL_LIBOPTS_TRUE +LIBOPTS_DIR +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_shared +enable_local_libopts +enable_libopts_install +with_autoopts_config +with_regex_header +with_libregex +with_libregex_cflags +with_libregex_libs +enable_optional_args +with_binsubdir +with_arlib +with_rpath +enable_static +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_pic +with_tags +enable_getifaddrs +enable_debugging +enable_debug_timing +enable_dst_minutes +enable_ignore_dns_errors +enable_BANCOMM +enable_GPSVME +enable_all_clocks +enable_ACTS +enable_ARBITER +enable_ARCRON_MSF +enable_AS2201 +enable_ATOM +enable_CHRONOLOG +enable_CHU +enable_AUDIO_CHU +enable_DATUM +enable_DUMBCLOCK +enable_FG +enable_HEATH +enable_HOPFSERIAL +enable_HOPFPCI +enable_HPGPS +enable_IRIG +enable_JJY +enable_JUPITER +enable_LEITCH +enable_LOCAL_CLOCK +enable_MX4200 +enable_NEOCLOCK4X +enable_NMEA +enable_ONCORE +enable_PALISADE +enable_PCF +enable_PST +enable_RIPENCC +enable_SHM +enable_SPECTRACOM +enable_TPRO +enable_TRUETIME +enable_TT560 +enable_ULINK +enable_WWV +enable_ZYFER +enable_parse_clocks +enable_COMPUTIME +enable_DCF7000 +enable_HOPF6021 +enable_MEINBERG +enable_RAWDCF +enable_RCC8000 +enable_SCHMID +enable_TRIMTAIP +enable_TRIMTSIP +enable_WHARTON +enable_VARITEXT +with_openssl_libdir +with_openssl_incdir +with_crypto +with_electricfence +enable_kmem +enable_accurate_adjtime +enable_tick +enable_tickadj +enable_simulator +enable_slew_always +enable_step_slew +enable_ntpdate_step +enable_hourly_todr_sync +enable_kernel_fll_bug +enable_irig_sawtooth +enable_nist +enable_ntp_signd +enable_wintime +enable_clockctl +enable_linuxcaps +enable_ipv6 +with_kame +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' +ac_subdirs_all='arlib +sntp' # Initialize some variables set by options. ac_init_help= ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null @@ -491,34 +1018,48 @@ x_libraries=NONE # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' ac_prev= +ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" + eval $ac_prev=\$ac_option ac_prev= continue fi - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -540,33 +1081,59 @@ do --config-cache | -C) cache_file=config.cache ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) + -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "enable_$ac_feature='$ac_optarg'" ;; + eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -593,6 +1160,12 @@ do -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; @@ -617,13 +1190,16 @@ do | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) @@ -688,6 +1264,16 @@ do | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; @@ -738,26 +1324,36 @@ do ac_init_version=: ;; -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "with_$ac_package='$ac_optarg'" ;; + eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. @@ -777,26 +1373,25 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; @@ -805,31 +1400,36 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error "missing argument to $ac_option" fi -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac -done +fi -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - eval ac_val=$`echo $ac_var` + eval ac_val=\$$ac_var + # Remove trailing slashes. case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -843,7 +1443,7 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes @@ -856,94 +1456,72 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } - fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 - { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CPP_set=${CPP+set} -ac_env_CPP_value=$CPP -ac_cv_env_CPP_set=${CPP+set} -ac_cv_env_CPP_value=$CPP -ac_env_CXX_set=${CXX+set} -ac_env_CXX_value=$CXX -ac_cv_env_CXX_set=${CXX+set} -ac_cv_env_CXX_value=$CXX -ac_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_env_CXXFLAGS_value=$CXXFLAGS -ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_cv_env_CXXFLAGS_value=$CXXFLAGS -ac_env_CXXCPP_set=${CXXCPP+set} -ac_env_CXXCPP_value=$CXXCPP -ac_cv_env_CXXCPP_set=${CXXCPP+set} -ac_cv_env_CXXCPP_value=$CXXCPP -ac_env_F77_set=${F77+set} -ac_env_F77_value=$F77 -ac_cv_env_F77_set=${F77+set} -ac_cv_env_F77_value=$F77 -ac_env_FFLAGS_set=${FFLAGS+set} -ac_env_FFLAGS_value=$FFLAGS -ac_cv_env_FFLAGS_set=${FFLAGS+set} -ac_cv_env_FFLAGS_value=$FFLAGS +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done # # Report the --help message. @@ -952,7 +1530,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures ntp 4.2.4p5 to adapt to many kinds of systems. +\`configure' configures ntp 4.2.4p8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -972,14 +1550,11 @@ Configuration: -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] -_ACEOF - - cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -989,18 +1564,25 @@ for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/ntp] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF @@ -1018,35 +1600,34 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of ntp 4.2.4p5:";; + short | recursive ) echo "Configuration of ntp 4.2.4p8:";; esac cat <<\_ACEOF Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=no] --enable-local-libopts Force using the supplied libopts tearoff code --disable-libopts-install Do not install libopts with client installation --disable-optional-args not wanting optional option args - --enable-clockctl s Use /dev/clockctl for non-root clock control - --enable-linuxcaps s Use Linux capabilities for non-root clock control - --enable-shared[=PKGS] - build shared libraries [default=no] - --enable-static[=PKGS] - build static libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) - --enable-getifaddrs s Enable the use of getifaddrs() [yes|no|glibc]. + --enable-getifaddrs s Enable the use of getifaddrs() [[yes|no|glibc]]. glibc: Use getifaddrs() in glibc if you know it supports IPv6. --enable-debugging + include debugging code --enable-debug-timing - include processing time debugging code (costs performance) - --enable-dst-minutes=60 + minutes per DST adjustment + --enable-dst-minutes n minutes per DST adjustment [60] + --enable-ignore-dns-errors + - retry DNS queries on any error --enable-BANCOMM - Datum/Bancomm bc635/VME interface --enable-GPSVME - TrueTime GPS receiver/VME interface --enable-all-clocks + include all suitable non-PARSE clocks: @@ -1112,6 +1693,11 @@ Optional Features: --enable-kernel-fll-bug s if we should avoid a kernel FLL bug --enable-irig-sawtooth s if we should enable the IRIG sawtooth filter --enable-nist - if we should enable the NIST lockclock scheme + --enable-ntp-signd - Provide support for Samba's signing daemon, + =/var/run/ntp_signd + --enable-wintime - Provide the windows symmetric client hack + --enable-clockctl s Use /dev/clockctl for non-root clock control + --enable-linuxcaps + Use Linux capabilities for non-root clock control --enable-ipv6 s use IPv6? Optional Packages: @@ -1128,8 +1714,7 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] - --with-tags[=TAGS] - include additional configurations [automatic] + --with-tags[=TAGS] include additional configurations [automatic] --with-openssl-libdir + =/something/reasonable --with-openssl-incdir + =/something/reasonable --with-crypto + =openssl @@ -1141,133 +1726,738 @@ Some influential environment variables: CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory - CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have - headers in a nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory CPP C preprocessor - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CXXCPP C++ preprocessor - F77 Fortran 77 compiler command - FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. +Report bugs to the package provider. _ACEOF +ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. - ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } done fi -test -n "$ac_init_help" && exit 0 +test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -ntp configure 4.2.4p5 -generated by GNU Autoconf 2.59 +ntp configure 4.2.4p8 +generated by GNU Autoconf 2.65 -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF - exit 0 + exit fi -exec 5>config.log -cat >&5 <<_ACEOF + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_type + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_member +cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ntp $as_me 4.2.4p5, which was -generated by GNU Autoconf 2.59. Invocation command line was +It was created by ntp $as_me 4.2.4p8, which was +generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF +exec 5>>config.log { cat <<_ASUNAME ## --------- ## @@ -1286,7 +2476,7 @@ uname -v = `(uname -v) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` @@ -1298,8 +2488,9 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS } >&5 @@ -1321,7 +2512,6 @@ _ACEOF ac_configure_args= ac_configure_args0= ac_configure_args1= -ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do @@ -1332,13 +2522,13 @@ do -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1354,21 +2544,19 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { @@ -1381,20 +2569,35 @@ trap 'exit_status=$? _ASBOX echo # The following way of writing the cache mishandles newlines in values, -{ +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} + esac | + sort +) echo cat <<\_ASBOX @@ -1405,22 +2608,28 @@ _ASBOX echo for ac_var in $ac_subst_vars do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## +## ------------------- ## +## File substitutions. ## +## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1432,26 +2641,26 @@ _ASBOX ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h | sort + cat confdefs.h echo fi test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status - ' 0 +' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. @@ -1459,112 +2668,128 @@ cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; esac fi else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do +for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -1573,56 +2798,30 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +am__api_version='1.11' - - - - - - - - - - - - - - - - - - - - - - - - -am__api_version="1.9" ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f $ac_dir/shtool; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -1637,22 +2836,23 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -1660,7 +2860,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1670,30 +2870,43 @@ case $as_dir/ in # program-specific install script used by HP pwplus--don't use. : else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi fi fi done done ;; esac -done + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -1703,21 +2916,34 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ @@ -1727,11 +2953,8 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file @@ -1740,81 +2963,206 @@ then # Ok. : else - { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } test "$program_prefix" != NONE && - program_transform_name="s,^,$program_prefix,;$program_transform_name" + program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && - program_transform_name="s,\$,$program_suffix,;$program_transform_name" -# Double any \ or $. echo might interpret backslashes. + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. # By default was `s,x,x', remove it if useless. -cat <<\_ACEOF >conftest.sed -s/[\\$]/&&/g;s/;s,x,x,$// -_ACEOF -program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm conftest.sed +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else - mkdir_p='$(install_sh) -d' + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" fi fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. @@ -1824,55 +3172,59 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$AWK" && break done -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -1885,12 +3237,14 @@ else fi rmdir .tst 2>/dev/null -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi fi # test whether we have cygpath @@ -1905,7 +3259,7 @@ fi # Define the identity of the package. PACKAGE='ntp' - VERSION='4.2.4p5' + VERSION='4.2.4p8' cat >>confdefs.h <<_ACEOF @@ -1933,96 +3287,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -install_sh=${install_sh-"$am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - STRIP=$ac_ct_STRIP -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. @@ -2036,57 +3300,74 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_config_sub" >&2;} - { (exit 1); exit 1; }; } +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6 -if test "${ac_cv_build+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && - { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} - { (exit 1); exit 1; }; } + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi -echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; +esac build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6 -if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} - { (exit 1); exit 1; }; } + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; +esac host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac @@ -2094,7 +3375,7 @@ cat >>confdefs.h <<_ACEOF #define STR_SYSTEM "$host" _ACEOF - ac_config_headers="$ac_config_headers config.h" +ac_config_headers="$ac_config_headers config.h" @@ -2108,60 +3389,58 @@ iCFLAGS="$CFLAGS" DEPDIR="${am__leading_dot}deps" - ac_config_commands="$ac_config_commands depfiles" +ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi -echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } rm -f confinc confmf -# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval="$enable_dependency_tracking" +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi -fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi - - -if test "x$enable_dependency_tracking" != xno; then + if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else @@ -2170,7 +3449,6 @@ else fi - ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2179,10 +3457,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2192,35 +3470,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -2230,39 +3510,50 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2272,77 +3563,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2353,18 +3604,19 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -2382,24 +3634,25 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2409,39 +3662,41 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -2451,66 +3706,78 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2522,112 +3789,109 @@ main () } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. break;; * ) break;; esac done +test "$ac_cv_exeext" = no && ac_cv_exeext= + else - echo "$as_me: failed program was:" >&5 + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } fi - +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -rm -f a.out a.exe conftest$ac_cv_exeext b.out +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -2635,38 +3899,90 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} _ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2678,45 +3994,46 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2730,55 +4047,34 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -GCC=`test $ac_compiler_gnu = yes && echo yes` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2789,39 +4085,49 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_cv_prog_cc_g=no +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -2837,18 +4143,14 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -2876,12 +4178,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2896,205 +4203,37 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg fi -rm -f conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac - -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if test "x$ac_cv_prog_cc_c89" != xno; then : fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3103,10 +4242,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up @@ -3131,6 +4270,11 @@ else if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -3148,7 +4292,17 @@ else done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -3158,18 +4312,23 @@ else break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -3193,13 +4352,11 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - -if + if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= @@ -3216,15 +4373,15 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" @@ -3238,11 +4395,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -3251,68 +4404,24 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break @@ -3322,7 +4431,7 @@ rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then +if $ac_preproc_ok; then : break fi @@ -3334,8 +4443,8 @@ fi else ac_cv_prog_CPP=$CPP fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do @@ -3345,11 +4454,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -3358,68 +4463,24 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break @@ -3429,14 +4490,13 @@ rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : +if $ac_preproc_ok; then : + else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c @@ -3446,60 +4506,142 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count fi -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep - - - -echo "$as_me:$LINENO: checking for AIX" >&5 -echo $ECHO_N "checking for AIX... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef _AIX - yes -#endif - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -cat >>confdefs.h <<\_ACEOF -#define _ALL_SOURCE 1 -_ACEOF + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + ac_cv_path_GREP=$GREP fi -rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -3514,51 +4656,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -3568,18 +4682,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -3589,16 +4699,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -3618,109 +4725,40 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -3728,167 +4766,96 @@ fi done -if test "${ac_cv_header_minix_config_h+set}" = set; then - echo "$as_me:$LINENO: checking for minix/config.h" >&5 -echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 -if test "${ac_cv_header_minix_config_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking minix/config.h usability" >&5 -echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking minix/config.h presence" >&5 -echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for minix/config.h" >&5 -echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 -if test "${ac_cv_header_minix_config_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_header_minix_config_h=$ac_header_preproc -fi -echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 -echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 - -fi -if test $ac_cv_header_minix_config_h = yes; then + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = x""yes; then : MINIX=yes else MINIX= fi -if test "$MINIX" = yes; then + if test "$MINIX" = yes; then -cat >>confdefs.h <<\_ACEOF -#define _POSIX_SOURCE 1 +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} _ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define _POSIX_1_SOURCE 2 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define _MINIX 1 -_ACEOF - +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + + + + +# So far, the only shared library we might use is libopts. +# It's a small library - we might as well use a static version of it. +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=no +fi + + ac_ext=c @@ -3899,10 +4866,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -3912,35 +4879,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -3950,39 +4919,50 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -3992,77 +4972,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -4073,18 +5013,19 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -4102,24 +5043,25 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -4129,39 +5071,41 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -4171,71 +5115,83 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4249,55 +5205,34 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -GCC=`test $ac_compiler_gnu = yes && echo yes` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4308,39 +5243,49 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_cv_prog_cc_g=no +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -4356,18 +5301,14 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4395,12 +5336,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -4415,205 +5361,37 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg fi -rm -f conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac - -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if test "x$ac_cv_prog_cc_c89" != xno; then : fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -4622,10 +5400,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up @@ -4650,6 +5428,11 @@ else if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -4667,7 +5450,17 @@ else done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -4677,18 +5470,23 @@ else break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -4712,13 +5510,11 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - -if + if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= @@ -4730,23 +5526,20 @@ fi # Ralf Wildenhues: With per-target flags we need CC_C_O +# AM_PROG_CC_C_O supersets AC_PROG_CC_C_O if test "x$CC" != xcc; then - echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 -echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else - echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 -echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi -set dummy $CC; ac_cc=`echo $2 | +set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval "test \"\${ac_cv_prog_cc_${ac_cc}_c_o+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -4760,38 +5553,65 @@ _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest.$ac_objext >&5' -if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest.$ac_objext >&5' - if { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest.$ac_objext && { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && + test -f conftest2.$ac_objext && { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then # cc works too. : @@ -4804,37 +5624,342 @@ then else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi -rm -f conftest* +rm -f core conftest* fi -if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } -cat >>confdefs.h <<\_ACEOF -#define NO_MINUS_C_MINUS_O 1 -_ACEOF +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if test "${ac_cv_prog_cc_c99+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if test "${ac_cv_prog_cc_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" @@ -4848,11 +5973,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4861,68 +5982,24 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break @@ -4932,7 +6009,7 @@ rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then +if $ac_preproc_ok; then : break fi @@ -4944,8 +6021,8 @@ fi else ac_cv_prog_CPP=$CPP fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do @@ -4955,11 +6032,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -4968,68 +6041,24 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break @@ -5039,14 +6068,13 @@ rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : +if $ac_preproc_ok; then : + else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c @@ -5095,10 +6123,10 @@ case "$host" in esac -echo "$as_me:$LINENO: checking additional compiler flags" >&5 -echo $ECHO_N "checking additional compiler flags... $ECHO_C" >&6 -if test "${ac_cv_os_cflags+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking additional compiler flags" >&5 +$as_echo_n "checking additional compiler flags... " >&6; } +if test "${ac_cv_os_cflags+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "${host_os}" in @@ -5178,8 +6206,8 @@ case "${host_os}" in esac fi -echo "$as_me:$LINENO: result: $ac_cv_os_cflags" >&5 -echo "${ECHO_T}$ac_cv_os_cflags" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cflags" >&5 +$as_echo "$ac_cv_os_cflags" >&6; } CFLAGS="$CFLAGS $ac_cv_os_cflags" @@ -5201,27 +6229,25 @@ esac LIBOPTS_DIR=libopts - # Check whether --enable-local-libopts or --disable-local-libopts was given. -if test "${enable_local_libopts+set}" = set; then - enableval="$enable_local_libopts" - + # Check whether --enable-local-libopts was given. +if test "${enable_local_libopts+set}" = set; then : + enableval=$enable_local_libopts; if test x$enableval = xyes ; then - { echo "$as_me:$LINENO: Using supplied libopts tearoff" >&5 -echo "$as_me: Using supplied libopts tearoff" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Using supplied libopts tearoff" >&5 +$as_echo "$as_me: Using supplied libopts tearoff" >&6;} LIBOPTS_LDADD='$(top_builddir)/libopts/libopts.la' LIBOPTS_CFLAGS='-I$(top_srcdir)/libopts' NEED_LIBOPTS_DIR=true fi -fi; - - # Check whether --enable-libopts-install or --disable-libopts-install was given. -if test "${enable_libopts_install+set}" = set; then - enableval="$enable_libopts_install" - -fi; +fi -if test "X${enable_libopts_install}" != Xno; then + # Check whether --enable-libopts-install was given. +if test "${enable_libopts_install+set}" = set; then : + enableval=$enable_libopts_install; +fi + + if test "X${enable_libopts_install}" != Xno; then INSTALL_LIBOPTS_TRUE= INSTALL_LIBOPTS_FALSE='#' else @@ -5231,18 +6257,17 @@ fi if test -z "${NEED_LIBOPTS_DIR}" ; then - echo "$as_me:$LINENO: checking whether autoopts-config can be found" >&5 -echo $ECHO_N "checking whether autoopts-config can be found... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether autoopts-config can be found" >&5 +$as_echo_n "checking whether autoopts-config can be found... " >&6; } -# Check whether --with-autoopts-config or --without-autoopts-config was given. -if test "${with_autoopts_config+set}" = set; then - withval="$with_autoopts_config" - lo_cv_with_autoopts_config=${with_autoopts_config} +# Check whether --with-autoopts-config was given. +if test "${with_autoopts_config+set}" = set; then : + withval=$with_autoopts_config; lo_cv_with_autoopts_config=${with_autoopts_config} else - echo "$as_me:$LINENO: checking whether autoopts-config is specified" >&5 -echo $ECHO_N "checking whether autoopts-config is specified... $ECHO_C" >&6 -if test "${lo_cv_with_autoopts_config+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether autoopts-config is specified" >&5 +$as_echo_n "checking whether autoopts-config is specified... " >&6; } +if test "${lo_cv_with_autoopts_config+set}" = set; then : + $as_echo_n "(cached) " >&6 else if autoopts-config --help 2>/dev/null 1>&2 then lo_cv_with_autoopts_config=autoopts-config @@ -5250,13 +6275,14 @@ else then lo_cv_with_autoopts_config=libopts-config else lo_cv_with_autoopts_config=no ; fi fi -echo "$as_me:$LINENO: result: $lo_cv_with_autoopts_config" >&5 -echo "${ECHO_T}$lo_cv_with_autoopts_config" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lo_cv_with_autoopts_config" >&5 +$as_echo "$lo_cv_with_autoopts_config" >&6; } -fi; # end of AC_ARG_WITH +fi + # end of AC_ARG_WITH - if test "${lo_cv_test_autoopts+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + if test "${lo_cv_test_autoopts+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "${lo_cv_with_autoopts_config}" \ @@ -5275,8 +6301,8 @@ else fi # end of CACHE_VAL - echo "$as_me:$LINENO: result: ${lo_cv_test_autoopts}" >&5 -echo "${ECHO_T}${lo_cv_test_autoopts}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lo_cv_test_autoopts}" >&5 +$as_echo "${lo_cv_test_autoopts}" >&6; } if test "X${lo_cv_test_autoopts}" != Xno then @@ -5289,9 +6315,7 @@ echo "${ECHO_T}${lo_cv_test_autoopts}" >&6 fi fi # end of if test -z "${NEED_LIBOPTS_DIR}" - - -if test -n "${NEED_LIBOPTS_DIR}"; then + if test -n "${NEED_LIBOPTS_DIR}"; then NEED_LIBOPTS_TRUE= NEED_LIBOPTS_FALSE='#' else @@ -5303,7 +6327,7 @@ fi LIBOPTS_DIR=libopts - ac_config_files="$ac_config_files libopts/Makefile" + ac_config_files="$ac_config_files libopts/Makefile" @@ -5314,16 +6338,12 @@ if test X${INVOKE_LIBOPTS_MACROS_FIRST_done} != Xyes ; then # ================= # AC_HEADER_STDC # ================= - echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -5338,51 +6358,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -5392,18 +6384,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -5413,16 +6401,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -5442,65 +6427,41 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # ================= # AC_HEADER_DIRENT # ================= - - - - - -ac_header_dirent=no + ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 -echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> @@ -5514,42 +6475,20 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break @@ -5558,256 +6497,116 @@ fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in dir; do +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in x; do +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi @@ -5817,172 +6616,17 @@ fi # ================= # AC_CHECK_HEADERS # ================= - - - - - - - - - - - - - - - - - - - - -for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ + for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ setjmp.h sys/mman.h sys/param.h sys/poll.h sys/procset.h sys/select.h \ sys/socket.h sys/stropts.h sys/time.h sys/un.h sys/wait.h unistd.h \ utime.h sysexits.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -5997,160 +6641,21 @@ done string errno stdlib memory setjmp do eval as_ac_var=\${ac_cv_header_${f}_h+set} test "${as_ac_var}" = set || \ - { { echo "$as_me:$LINENO: error: You must have ${f}.h on your system" >&5 -echo "$as_me: error: You must have ${f}.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have ${f}.h on your system" "$LINENO" 5 done # ================================================ # AC_CHECK_HEADERS: stdarg.h is present define HAVE_STDARG_H, otherwise # if varargs.h is present define HAVE_VARARGS_H. # ================================================ - - -for ac_header in stdarg.h varargs.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdarg.h varargs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -6158,159 +6663,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have stdarg.h or varargs.h on your system" >&5 -echo "$as_me: error: You must have stdarg.h or varargs.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have stdarg.h or varargs.h on your system" "$LINENO" 5 fi # ================================================ # Similarly for the string.h and strings.h headers # ================================================ - - -for ac_header in string.h strings.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in string.h strings.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -6318,160 +6684,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have string.h or strings.h on your system" >&5 -echo "$as_me: error: You must have string.h or strings.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have string.h or strings.h on your system" "$LINENO" 5 fi # ===================== # ...and limits headers # ===================== - - - -for ac_header in limits.h sys/limits.h values.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in limits.h sys/limits.h values.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -6479,222 +6705,28 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have one of limits.h, sys/limits.h or values.h" >&5 -echo "$as_me: error: You must have one of limits.h, sys/limits.h or values.h" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have one of limits.h, sys/limits.h or values.h" "$LINENO" 5 fi # ======================== # ...and int types headers # ======================== - - -for ac_header in stdint.h inttypes.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdint.h inttypes.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi done - echo "$as_me:$LINENO: checking for int8_t" >&5 -echo $ECHO_N "checking for int8_t... $ECHO_C" >&6 -if test "${ac_cv_type_int8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int8_t *) 0) - return 0; -if (sizeof (int8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 -echo "${ECHO_T}$ac_cv_type_int8_t" >&6 -if test $ac_cv_type_int8_t = yes; then + ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_int8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT8_T 1 @@ -6702,63 +6734,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint8_t" >&5 -echo $ECHO_N "checking for uint8_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint8_t *) 0) - return 0; -if (sizeof (uint8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint8_t" >&6 -if test $ac_cv_type_uint8_t = yes; then +ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" +if test "x$ac_cv_type_uint8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT8_T 1 @@ -6766,63 +6743,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int16_t" >&5 -echo $ECHO_N "checking for int16_t... $ECHO_C" >&6 -if test "${ac_cv_type_int16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int16_t *) 0) - return 0; -if (sizeof (int16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 -echo "${ECHO_T}$ac_cv_type_int16_t" >&6 -if test $ac_cv_type_int16_t = yes; then +ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_int16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT16_T 1 @@ -6830,63 +6752,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint16_t" >&5 -echo $ECHO_N "checking for uint16_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint16_t *) 0) - return 0; -if (sizeof (uint16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint16_t" >&6 -if test $ac_cv_type_uint16_t = yes; then +ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "$ac_includes_default" +if test "x$ac_cv_type_uint16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT16_T 1 @@ -6894,63 +6761,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int32_t" >&5 -echo $ECHO_N "checking for int32_t... $ECHO_C" >&6 -if test "${ac_cv_type_int32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int32_t *) 0) - return 0; -if (sizeof (int32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 -echo "${ECHO_T}$ac_cv_type_int32_t" >&6 -if test $ac_cv_type_int32_t = yes; then +ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_int32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT32_T 1 @@ -6958,63 +6770,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint32_t" >&5 -echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint32_t *) 0) - return 0; -if (sizeof (uint32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint32_t" >&6 -if test $ac_cv_type_uint32_t = yes; then +ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" +if test "x$ac_cv_type_uint32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT32_T 1 @@ -7022,63 +6779,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for intptr_t" >&5 -echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_intptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((intptr_t *) 0) - return 0; -if (sizeof (intptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_intptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_intptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_intptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_intptr_t" >&6 -if test $ac_cv_type_intptr_t = yes; then +ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" +if test "x$ac_cv_type_intptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INTPTR_T 1 @@ -7086,63 +6788,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint_t" >&5 -echo $ECHO_N "checking for uint_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint_t *) 0) - return 0; -if (sizeof (uint_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint_t" >&6 -if test $ac_cv_type_uint_t = yes; then +ac_fn_c_check_type "$LINENO" "uint_t" "ac_cv_type_uint_t" "$ac_includes_default" +if test "x$ac_cv_type_uint_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT_T 1 @@ -7155,63 +6802,8 @@ fi # ==================== # uintptr type & sizes # ==================== - echo "$as_me:$LINENO: checking for uintptr_t" >&5 -echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_uintptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uintptr_t *) 0) - return 0; -if (sizeof (uintptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uintptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uintptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6 -if test $ac_cv_type_uintptr_t = yes; then + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTPTR_T 1 @@ -7220,1663 +6812,141 @@ _ACEOF else -cat >>confdefs.h <<\_ACEOF -#define uintptr_t unsigned long -_ACEOF +$as_echo "#define uintptr_t unsigned long" >>confdefs.h fi - echo "$as_me:$LINENO: checking for char*" >&5 -echo $ECHO_N "checking for char*... $ECHO_C" >&6 -if test "${ac_cv_type_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char*" >&5 +$as_echo_n "checking size of char*... " >&6; } +if test "${ac_cv_sizeof_charp+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((char* *) 0) - return 0; -if (sizeof (char*)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_charp=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char*))" "ac_cv_sizeof_charp" "$ac_includes_default"; then : -ac_cv_type_charp=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_charp" >&5 -echo "${ECHO_T}$ac_cv_type_charp" >&6 - -echo "$as_me:$LINENO: checking size of char*" >&5 -echo $ECHO_N "checking size of char*... $ECHO_C" >&6 -if test "${ac_cv_sizeof_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_charp" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (char*) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_charp=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_charp" >&5 +$as_echo "$ac_cv_sizeof_charp" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_charp=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (char*)); } -unsigned long ulongval () { return (long) (sizeof (char*)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (char*))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_charp=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_charp=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_charp" >&5 -echo "${ECHO_T}$ac_cv_sizeof_charp" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_CHARP $ac_cv_sizeof_charp _ACEOF - echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6 -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int *) 0) - return 0; -if (sizeof (int)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : -ac_cv_type_int=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6 - -echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6 -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_int" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (int)); } -unsigned long ulongval () { return (long) (sizeof (int)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (int))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_int=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF - echo "$as_me:$LINENO: checking for long" >&5 -echo $ECHO_N "checking for long... $ECHO_C" >&6 -if test "${ac_cv_type_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((long *) 0) - return 0; -if (sizeof (long)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_long=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : -ac_cv_type_long=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 -echo "${ECHO_T}$ac_cv_type_long" >&6 - -echo "$as_me:$LINENO: checking size of long" >&5 -echo $ECHO_N "checking size of long... $ECHO_C" >&6 -if test "${ac_cv_sizeof_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (long)); } -unsigned long ulongval () { return (long) (sizeof (long)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (long))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_long=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF - echo "$as_me:$LINENO: checking for short" >&5 -echo $ECHO_N "checking for short... $ECHO_C" >&6 -if test "${ac_cv_type_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((short *) 0) - return 0; -if (sizeof (short)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_short=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : -ac_cv_type_short=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 -echo "${ECHO_T}$ac_cv_type_short" >&6 - -echo "$as_me:$LINENO: checking size of short" >&5 -echo $ECHO_N "checking size of short... $ECHO_C" >&6 -if test "${ac_cv_sizeof_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_short" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_short=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_short=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (short)); } -unsigned long ulongval () { return (long) (sizeof (short)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (short))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_short=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_short=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -echo "${ECHO_T}$ac_cv_sizeof_short" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF @@ -8886,72 +6956,43 @@ _ACEOF # ---------------------------------------------------------------------- # AC_CHECK_LIB for SVR4 libgen, and use it if it defines pathfind. # ---------------------------------------------------------------------- - -echo "$as_me:$LINENO: checking for pathfind in -lgen" >&5 -echo $ECHO_N "checking for pathfind in -lgen... $ECHO_C" >&6 -if test "${ac_cv_lib_gen_pathfind+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pathfind in -lgen" >&5 +$as_echo_n "checking for pathfind in -lgen... " >&6; } +if test "${ac_cv_lib_gen_pathfind+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgen $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char pathfind (); int main () { -pathfind (); +return pathfind (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gen_pathfind=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_gen_pathfind=no + ac_cv_lib_gen_pathfind=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_gen_pathfind" >&5 -echo "${ECHO_T}$ac_cv_lib_gen_pathfind" >&6 -if test $ac_cv_lib_gen_pathfind = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_pathfind" >&5 +$as_echo "$ac_cv_lib_gen_pathfind" >&6; } +if test "x$ac_cv_lib_gen_pathfind" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGEN 1 _ACEOF @@ -8960,200 +7001,18 @@ _ACEOF fi - -for ac_func in vprintf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_VPRINTF 1 _ACEOF -echo "$as_me:$LINENO: checking for _doprnt" >&5 -echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 -if test "${ac_cv_func__doprnt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define _doprnt to an innocuous variant, in case declares _doprnt. - For example, HP-UX 11i declares gettimeofday. */ -#define _doprnt innocuous__doprnt +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char _doprnt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef _doprnt - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char _doprnt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub__doprnt) || defined (__stub____doprnt) -choke me -#else -char (*f) () = _doprnt; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != _doprnt; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func__doprnt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func__doprnt=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 -echo "${ECHO_T}$ac_cv_func__doprnt" >&6 -if test $ac_cv_func__doprnt = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DOPRNT 1 -_ACEOF +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi @@ -9161,108 +7020,14 @@ fi done - - - - - - -for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -9273,22 +7038,22 @@ fi # Check to see if a reg expr header is specified. -# Check whether --with-regex-header or --without-regex-header was given. -if test "${with_regex_header+set}" = set; then - withval="$with_regex_header" - libopts_cv_with_regex_header=${with_regex_header} +# Check whether --with-regex-header was given. +if test "${with_regex_header+set}" = set; then : + withval=$with_regex_header; libopts_cv_with_regex_header=${with_regex_header} else - echo "$as_me:$LINENO: checking whether a reg expr header is specified" >&5 -echo $ECHO_N "checking whether a reg expr header is specified... $ECHO_C" >&6 -if test "${libopts_cv_with_regex_header+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a reg expr header is specified" >&5 +$as_echo_n "checking whether a reg expr header is specified... " >&6; } +if test "${libopts_cv_with_regex_header+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_regex_header=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_regex_header" >&5 -echo "${ECHO_T}$libopts_cv_with_regex_header" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_regex_header" >&5 +$as_echo "$libopts_cv_with_regex_header" >&6; } -fi; # end of AC_ARG_WITH +fi + # end of AC_ARG_WITH if test "X${libopts_cv_with_regex_header}" != Xno then @@ -9298,9 +7063,7 @@ _ACEOF else -cat >>confdefs.h <<\_ACEOF -#define REGEX_HEADER -_ACEOF +$as_echo "#define REGEX_HEADER " >>confdefs.h fi @@ -9309,22 +7072,22 @@ _ACEOF # Check to see if a working libregex can be found. -# Check whether --with-libregex or --without-libregex was given. -if test "${with_libregex+set}" = set; then - withval="$with_libregex" - libopts_cv_with_libregex_root=${with_libregex} +# Check whether --with-libregex was given. +if test "${with_libregex+set}" = set; then : + withval=$with_libregex; libopts_cv_with_libregex_root=${with_libregex} else - echo "$as_me:$LINENO: checking whether with-libregex was specified" >&5 -echo $ECHO_N "checking whether with-libregex was specified... $ECHO_C" >&6 -if test "${libopts_cv_with_libregex_root+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether with-libregex was specified" >&5 +$as_echo_n "checking whether with-libregex was specified... " >&6; } +if test "${libopts_cv_with_libregex_root+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_libregex_root=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_libregex_root" >&5 -echo "${ECHO_T}$libopts_cv_with_libregex_root" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_libregex_root" >&5 +$as_echo "$libopts_cv_with_libregex_root" >&6; } -fi; # end of AC_ARG_WITH libregex +fi + # end of AC_ARG_WITH libregex if test "${with_libguile+set}" = set && \ test "${withval}" = no @@ -9335,40 +7098,40 @@ fi; # end of AC_ARG_WITH libregex else -# Check whether --with-libregex-cflags or --without-libregex-cflags was given. -if test "${with_libregex_cflags+set}" = set; then - withval="$with_libregex_cflags" - libopts_cv_with_libregex_cflags=${with_regex_cflags} +# Check whether --with-libregex-cflags was given. +if test "${with_libregex_cflags+set}" = set; then : + withval=$with_libregex_cflags; libopts_cv_with_libregex_cflags=${with_regex_cflags} else - echo "$as_me:$LINENO: checking whether with-libregex-cflags was specified" >&5 -echo $ECHO_N "checking whether with-libregex-cflags was specified... $ECHO_C" >&6 -if test "${libopts_cv_with_libregex_cflags+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether with-libregex-cflags was specified" >&5 +$as_echo_n "checking whether with-libregex-cflags was specified... " >&6; } +if test "${libopts_cv_with_libregex_cflags+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_libregex_cflags=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_libregex_cflags" >&5 -echo "${ECHO_T}$libopts_cv_with_libregex_cflags" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_libregex_cflags" >&5 +$as_echo "$libopts_cv_with_libregex_cflags" >&6; } -fi; # end of AC_ARG_WITH libregex-cflags +fi + # end of AC_ARG_WITH libregex-cflags -# Check whether --with-libregex-libs or --without-libregex-libs was given. -if test "${with_libregex_libs+set}" = set; then - withval="$with_libregex_libs" - libopts_cv_with_libregex_libs=${with_regex_libs} +# Check whether --with-libregex-libs was given. +if test "${with_libregex_libs+set}" = set; then : + withval=$with_libregex_libs; libopts_cv_with_libregex_libs=${with_regex_libs} else - echo "$as_me:$LINENO: checking whether with-libregex-libs was specified" >&5 -echo $ECHO_N "checking whether with-libregex-libs was specified... $ECHO_C" >&6 -if test "${libopts_cv_with_libregex_libs+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether with-libregex-libs was specified" >&5 +$as_echo_n "checking whether with-libregex-libs was specified... " >&6; } +if test "${libopts_cv_with_libregex_libs+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_libregex_libs=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_libregex_libs" >&5 -echo "${ECHO_T}$libopts_cv_with_libregex_libs" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_libregex_libs" >&5 +$as_echo "$libopts_cv_with_libregex_libs" >&6; } -fi; # end of AC_ARG_WITH libregex-libs +fi + # end of AC_ARG_WITH libregex-libs case "X${libopts_cv_with_libregex_cflags}" in Xyes|Xno|X ) @@ -9401,20 +7164,16 @@ fi; # end of AC_ARG_WITH libregex-libs esac LIBREGEX_CFLAGS="" LIBREGEX_LIBS="" - echo "$as_me:$LINENO: checking whether libregex functions properly" >&5 -echo $ECHO_N "checking whether libregex functions properly... $ECHO_C" >&6 - if test "${libopts_cv_with_libregex+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libregex functions properly" >&5 +$as_echo_n "checking whether libregex functions properly... " >&6; } + if test "${libopts_cv_with_libregex+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_with_libregex=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -9437,40 +7196,25 @@ int main() { } return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_with_libregex=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_with_libregex=no + libopts_cv_with_libregex=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of AC_TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of AC_TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_with_libregex - echo "$as_me:$LINENO: result: ${libopts_cv_with_libregex}" >&5 -echo "${ECHO_T}${libopts_cv_with_libregex}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_with_libregex}" >&5 +$as_echo "${libopts_cv_with_libregex}" >&6; } if test "X${libopts_cv_with_libregex}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define WITH_LIBREGEX 1 -_ACEOF +$as_echo "#define WITH_LIBREGEX 1" >>confdefs.h else CPPFLAGS="${libopts_save_CPPFLAGS}" @@ -9481,21 +7225,17 @@ _ACEOF # Check to see if pathfind(3) works. - echo "$as_me:$LINENO: checking whether pathfind(3) works" >&5 -echo $ECHO_N "checking whether pathfind(3) works... $ECHO_C" >&6 - if test "${libopts_cv_run_pathfind+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pathfind(3) works" >&5 +$as_echo_n "checking whether pathfind(3) works... " >&6; } + if test "${libopts_cv_run_pathfind+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_pathfind=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -9504,40 +7244,25 @@ int main (int argc, char** argv) { return (pz == 0) ? 1 : 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_pathfind=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_pathfind=no + libopts_cv_run_pathfind=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_pathfind - echo "$as_me:$LINENO: result: ${libopts_cv_run_pathfind}" >&5 -echo "${ECHO_T}${libopts_cv_run_pathfind}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_pathfind}" >&5 +$as_echo "${libopts_cv_run_pathfind}" >&6; } if test "X${libopts_cv_run_pathfind}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_PATHFIND 1 -_ACEOF +$as_echo "#define HAVE_PATHFIND 1" >>confdefs.h fi @@ -9545,10 +7270,10 @@ _ACEOF # Check to see if /dev/zero is readable device. - echo "$as_me:$LINENO: checking whether /dev/zero is readable device" >&5 -echo $ECHO_N "checking whether /dev/zero is readable device... $ECHO_C" >&6 - if test "${libopts_cv_test_dev_zero+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether /dev/zero is readable device" >&5 +$as_echo_n "checking whether /dev/zero is readable device... " >&6; } + if test "${libopts_cv_test_dev_zero+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_test_dev_zero=`exec 2> /dev/null @@ -9563,15 +7288,13 @@ echo ${dzero}` fi # end of CACHE_VAL of libopts_cv_test_dev_zero - echo "$as_me:$LINENO: result: ${libopts_cv_test_dev_zero}" >&5 -echo "${ECHO_T}${libopts_cv_test_dev_zero}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_test_dev_zero}" >&5 +$as_echo "${libopts_cv_test_dev_zero}" >&6; } if test "X${libopts_cv_test_dev_zero}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_DEV_ZERO 1 -_ACEOF +$as_echo "#define HAVE_DEV_ZERO 1" >>confdefs.h fi @@ -9579,21 +7302,17 @@ _ACEOF # Check to see if we have a functional realpath(3C). - echo "$as_me:$LINENO: checking whether we have a functional realpath(3C)" >&5 -echo $ECHO_N "checking whether we have a functional realpath(3C)... $ECHO_C" >&6 - if test "${libopts_cv_run_realpath+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have a functional realpath(3C)" >&5 +$as_echo_n "checking whether we have a functional realpath(3C)... " >&6; } + if test "${libopts_cv_run_realpath+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_realpath=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -9607,40 +7326,25 @@ choke me!! return (pz == zPath) ? 0 : 1; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_realpath=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_realpath=no + libopts_cv_run_realpath=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_realpath - echo "$as_me:$LINENO: result: ${libopts_cv_run_realpath}" >&5 -echo "${ECHO_T}${libopts_cv_run_realpath}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_realpath}" >&5 +$as_echo "${libopts_cv_run_realpath}" >&6; } if test "X${libopts_cv_run_realpath}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_REALPATH 1 -_ACEOF +$as_echo "#define HAVE_REALPATH 1" >>confdefs.h fi @@ -9648,21 +7352,17 @@ _ACEOF # Check to see if strftime() works. - echo "$as_me:$LINENO: checking whether strftime() works" >&5 -echo $ECHO_N "checking whether strftime() works... $ECHO_C" >&6 - if test "${libopts_cv_run_strftime+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strftime() works" >&5 +$as_echo_n "checking whether strftime() works... " >&6; } + if test "${libopts_cv_run_strftime+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_strftime=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -9682,40 +7382,25 @@ int main() { strftime( t_buf, sizeof( t_buf ), "%A %b %d %j", &tm ); return (strcmp( t_buf, z ) != 0); } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_strftime=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_strftime=no + libopts_cv_run_strftime=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_strftime - echo "$as_me:$LINENO: result: ${libopts_cv_run_strftime}" >&5 -echo "${ECHO_T}${libopts_cv_run_strftime}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_strftime}" >&5 +$as_echo "${libopts_cv_run_strftime}" >&6; } if test "X${libopts_cv_run_strftime}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRFTIME 1 -_ACEOF +$as_echo "#define HAVE_STRFTIME 1" >>confdefs.h fi @@ -9723,67 +7408,46 @@ _ACEOF # Check to see if fopen accepts "b" mode. - echo "$as_me:$LINENO: checking whether fopen accepts \"b\" mode" >&5 -echo $ECHO_N "checking whether fopen accepts \"b\" mode... $ECHO_C" >&6 - if test "${libopts_cv_run_fopen_binary+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen accepts \"b\" mode" >&5 +$as_echo_n "checking whether fopen accepts \"b\" mode... " >&6; } + if test "${libopts_cv_run_fopen_binary+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_fopen_binary=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (int argc, char** argv) { FILE* fp = fopen("conftest.$ac_ext", "rb"); return (fp == NULL) ? 1 : fclose(fp); } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_fopen_binary=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_fopen_binary=no + libopts_cv_run_fopen_binary=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_fopen_binary - echo "$as_me:$LINENO: result: ${libopts_cv_run_fopen_binary}" >&5 -echo "${ECHO_T}${libopts_cv_run_fopen_binary}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_fopen_binary}" >&5 +$as_echo "${libopts_cv_run_fopen_binary}" >&6; } if test "X${libopts_cv_run_fopen_binary}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define FOPEN_BINARY_FLAG "b" -_ACEOF +$as_echo "#define FOPEN_BINARY_FLAG \"b\"" >>confdefs.h else -cat >>confdefs.h <<\_ACEOF -#define FOPEN_BINARY_FLAG "" -_ACEOF +$as_echo "#define FOPEN_BINARY_FLAG \"\"" >>confdefs.h fi @@ -9791,67 +7455,46 @@ _ACEOF # Check to see if fopen accepts "t" mode. - echo "$as_me:$LINENO: checking whether fopen accepts \"t\" mode" >&5 -echo $ECHO_N "checking whether fopen accepts \"t\" mode... $ECHO_C" >&6 - if test "${libopts_cv_run_fopen_text+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen accepts \"t\" mode" >&5 +$as_echo_n "checking whether fopen accepts \"t\" mode... " >&6; } + if test "${libopts_cv_run_fopen_text+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_fopen_text=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (int argc, char** argv) { FILE* fp = fopen("conftest.$ac_ext", "rt"); return (fp == NULL) ? 1 : fclose(fp); } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_fopen_text=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_fopen_text=no + libopts_cv_run_fopen_text=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_fopen_text - echo "$as_me:$LINENO: result: ${libopts_cv_run_fopen_text}" >&5 -echo "${ECHO_T}${libopts_cv_run_fopen_text}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_fopen_text}" >&5 +$as_echo "${libopts_cv_run_fopen_text}" >&6; } if test "X${libopts_cv_run_fopen_text}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define FOPEN_TEXT_FLAG "t" -_ACEOF +$as_echo "#define FOPEN_TEXT_FLAG \"t\"" >>confdefs.h else -cat >>confdefs.h <<\_ACEOF -#define FOPEN_TEXT_FLAG "" -_ACEOF +$as_echo "#define FOPEN_TEXT_FLAG \"\"" >>confdefs.h fi @@ -9859,29 +7502,27 @@ _ACEOF # Check to see if not wanting optional option args. - # Check whether --enable-optional-args or --disable-optional-args was given. -if test "${enable_optional_args+set}" = set; then - enableval="$enable_optional_args" - libopts_cv_enable_optional_args=${enable_optional_args} + # Check whether --enable-optional-args was given. +if test "${enable_optional_args+set}" = set; then : + enableval=$enable_optional_args; libopts_cv_enable_optional_args=${enable_optional_args} else - echo "$as_me:$LINENO: checking whether not wanting optional option args" >&5 -echo $ECHO_N "checking whether not wanting optional option args... $ECHO_C" >&6 -if test "${libopts_cv_enable_optional_args+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether not wanting optional option args" >&5 +$as_echo_n "checking whether not wanting optional option args... " >&6; } +if test "${libopts_cv_enable_optional_args+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_enable_optional_args=yes fi -echo "$as_me:$LINENO: result: $libopts_cv_enable_optional_args" >&5 -echo "${ECHO_T}$libopts_cv_enable_optional_args" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_enable_optional_args" >&5 +$as_echo "$libopts_cv_enable_optional_args" >&6; } -fi; # end of AC_ARG_ENABLE +fi + # end of AC_ARG_ENABLE if test "X${libopts_cv_enable_optional_args}" = Xno then -cat >>confdefs.h <<\_ACEOF -#define NO_OPTIONAL_OPT_ARGS 1 -_ACEOF +$as_echo "#define NO_OPTIONAL_OPT_ARGS 1" >>confdefs.h fi @@ -9894,16 +7535,12 @@ if test X${INVOKE_LIBOPTS_MACROS_FIRST_done} != Xyes ; then # ================= # AC_HEADER_STDC # ================= - echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -9918,51 +7555,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -9972,18 +7581,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -9993,16 +7598,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -10022,65 +7624,41 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # ================= # AC_HEADER_DIRENT # ================= - - - - - -ac_header_dirent=no + ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 -echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> @@ -10094,42 +7672,20 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break @@ -10138,256 +7694,116 @@ fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in dir; do +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in x; do +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi @@ -10397,172 +7813,17 @@ fi # ================= # AC_CHECK_HEADERS # ================= - - - - - - - - - - - - - - - - - - - - -for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ + for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ setjmp.h sys/mman.h sys/param.h sys/poll.h sys/procset.h sys/select.h \ sys/socket.h sys/stropts.h sys/time.h sys/un.h sys/wait.h unistd.h \ utime.h sysexits.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -10577,160 +7838,21 @@ done string errno stdlib memory setjmp do eval as_ac_var=\${ac_cv_header_${f}_h+set} test "${as_ac_var}" = set || \ - { { echo "$as_me:$LINENO: error: You must have ${f}.h on your system" >&5 -echo "$as_me: error: You must have ${f}.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have ${f}.h on your system" "$LINENO" 5 done # ================================================ # AC_CHECK_HEADERS: stdarg.h is present define HAVE_STDARG_H, otherwise # if varargs.h is present define HAVE_VARARGS_H. # ================================================ - - -for ac_header in stdarg.h varargs.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdarg.h varargs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -10738,159 +7860,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have stdarg.h or varargs.h on your system" >&5 -echo "$as_me: error: You must have stdarg.h or varargs.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have stdarg.h or varargs.h on your system" "$LINENO" 5 fi # ================================================ # Similarly for the string.h and strings.h headers # ================================================ - - -for ac_header in string.h strings.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in string.h strings.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -10898,160 +7881,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have string.h or strings.h on your system" >&5 -echo "$as_me: error: You must have string.h or strings.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have string.h or strings.h on your system" "$LINENO" 5 fi # ===================== # ...and limits headers # ===================== - - - -for ac_header in limits.h sys/limits.h values.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in limits.h sys/limits.h values.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -11059,222 +7902,28 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have one of limits.h, sys/limits.h or values.h" >&5 -echo "$as_me: error: You must have one of limits.h, sys/limits.h or values.h" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have one of limits.h, sys/limits.h or values.h" "$LINENO" 5 fi # ======================== # ...and int types headers # ======================== - - -for ac_header in stdint.h inttypes.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdint.h inttypes.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi done - echo "$as_me:$LINENO: checking for int8_t" >&5 -echo $ECHO_N "checking for int8_t... $ECHO_C" >&6 -if test "${ac_cv_type_int8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int8_t *) 0) - return 0; -if (sizeof (int8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 -echo "${ECHO_T}$ac_cv_type_int8_t" >&6 -if test $ac_cv_type_int8_t = yes; then + ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_int8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT8_T 1 @@ -11282,63 +7931,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint8_t" >&5 -echo $ECHO_N "checking for uint8_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint8_t *) 0) - return 0; -if (sizeof (uint8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint8_t" >&6 -if test $ac_cv_type_uint8_t = yes; then +ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" +if test "x$ac_cv_type_uint8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT8_T 1 @@ -11346,63 +7940,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int16_t" >&5 -echo $ECHO_N "checking for int16_t... $ECHO_C" >&6 -if test "${ac_cv_type_int16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int16_t *) 0) - return 0; -if (sizeof (int16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 -echo "${ECHO_T}$ac_cv_type_int16_t" >&6 -if test $ac_cv_type_int16_t = yes; then +ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_int16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT16_T 1 @@ -11410,63 +7949,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint16_t" >&5 -echo $ECHO_N "checking for uint16_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint16_t *) 0) - return 0; -if (sizeof (uint16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint16_t" >&6 -if test $ac_cv_type_uint16_t = yes; then +ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "$ac_includes_default" +if test "x$ac_cv_type_uint16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT16_T 1 @@ -11474,63 +7958,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int32_t" >&5 -echo $ECHO_N "checking for int32_t... $ECHO_C" >&6 -if test "${ac_cv_type_int32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int32_t *) 0) - return 0; -if (sizeof (int32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 -echo "${ECHO_T}$ac_cv_type_int32_t" >&6 -if test $ac_cv_type_int32_t = yes; then +ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_int32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT32_T 1 @@ -11538,63 +7967,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint32_t" >&5 -echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint32_t *) 0) - return 0; -if (sizeof (uint32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint32_t" >&6 -if test $ac_cv_type_uint32_t = yes; then +ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" +if test "x$ac_cv_type_uint32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT32_T 1 @@ -11602,63 +7976,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for intptr_t" >&5 -echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_intptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((intptr_t *) 0) - return 0; -if (sizeof (intptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_intptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_intptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_intptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_intptr_t" >&6 -if test $ac_cv_type_intptr_t = yes; then +ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" +if test "x$ac_cv_type_intptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INTPTR_T 1 @@ -11666,63 +7985,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint_t" >&5 -echo $ECHO_N "checking for uint_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint_t *) 0) - return 0; -if (sizeof (uint_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint_t" >&6 -if test $ac_cv_type_uint_t = yes; then +ac_fn_c_check_type "$LINENO" "uint_t" "ac_cv_type_uint_t" "$ac_includes_default" +if test "x$ac_cv_type_uint_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT_T 1 @@ -11735,63 +7999,8 @@ fi # ==================== # uintptr type & sizes # ==================== - echo "$as_me:$LINENO: checking for uintptr_t" >&5 -echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_uintptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uintptr_t *) 0) - return 0; -if (sizeof (uintptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uintptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uintptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6 -if test $ac_cv_type_uintptr_t = yes; then + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTPTR_T 1 @@ -11800,1663 +8009,141 @@ _ACEOF else -cat >>confdefs.h <<\_ACEOF -#define uintptr_t unsigned long -_ACEOF +$as_echo "#define uintptr_t unsigned long" >>confdefs.h fi - echo "$as_me:$LINENO: checking for char*" >&5 -echo $ECHO_N "checking for char*... $ECHO_C" >&6 -if test "${ac_cv_type_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char*" >&5 +$as_echo_n "checking size of char*... " >&6; } +if test "${ac_cv_sizeof_charp+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((char* *) 0) - return 0; -if (sizeof (char*)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_charp=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char*))" "ac_cv_sizeof_charp" "$ac_includes_default"; then : -ac_cv_type_charp=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_charp" >&5 -echo "${ECHO_T}$ac_cv_type_charp" >&6 - -echo "$as_me:$LINENO: checking size of char*" >&5 -echo $ECHO_N "checking size of char*... $ECHO_C" >&6 -if test "${ac_cv_sizeof_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_charp" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (char*) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_charp=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_charp" >&5 +$as_echo "$ac_cv_sizeof_charp" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_charp=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (char*)); } -unsigned long ulongval () { return (long) (sizeof (char*)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (char*))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_charp=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_charp=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_charp" >&5 -echo "${ECHO_T}$ac_cv_sizeof_charp" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_CHARP $ac_cv_sizeof_charp _ACEOF - echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6 -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int *) 0) - return 0; -if (sizeof (int)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : -ac_cv_type_int=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6 - -echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6 -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_int" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (int)); } -unsigned long ulongval () { return (long) (sizeof (int)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (int))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_int=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF - echo "$as_me:$LINENO: checking for long" >&5 -echo $ECHO_N "checking for long... $ECHO_C" >&6 -if test "${ac_cv_type_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((long *) 0) - return 0; -if (sizeof (long)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_long=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : -ac_cv_type_long=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 -echo "${ECHO_T}$ac_cv_type_long" >&6 - -echo "$as_me:$LINENO: checking size of long" >&5 -echo $ECHO_N "checking size of long... $ECHO_C" >&6 -if test "${ac_cv_sizeof_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (long)); } -unsigned long ulongval () { return (long) (sizeof (long)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (long))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_long=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF - echo "$as_me:$LINENO: checking for short" >&5 -echo $ECHO_N "checking for short... $ECHO_C" >&6 -if test "${ac_cv_type_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((short *) 0) - return 0; -if (sizeof (short)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_short=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : -ac_cv_type_short=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 -echo "${ECHO_T}$ac_cv_type_short" >&6 - -echo "$as_me:$LINENO: checking size of short" >&5 -echo $ECHO_N "checking size of short... $ECHO_C" >&6 -if test "${ac_cv_sizeof_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_short" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_short=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_short=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (short)); } -unsigned long ulongval () { return (long) (sizeof (short)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (short))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_short=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_short=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -echo "${ECHO_T}$ac_cv_sizeof_short" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF @@ -13466,72 +8153,43 @@ _ACEOF # ---------------------------------------------------------------------- # AC_CHECK_LIB for SVR4 libgen, and use it if it defines pathfind. # ---------------------------------------------------------------------- - -echo "$as_me:$LINENO: checking for pathfind in -lgen" >&5 -echo $ECHO_N "checking for pathfind in -lgen... $ECHO_C" >&6 -if test "${ac_cv_lib_gen_pathfind+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pathfind in -lgen" >&5 +$as_echo_n "checking for pathfind in -lgen... " >&6; } +if test "${ac_cv_lib_gen_pathfind+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgen $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char pathfind (); int main () { -pathfind (); +return pathfind (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gen_pathfind=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_gen_pathfind=no + ac_cv_lib_gen_pathfind=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_gen_pathfind" >&5 -echo "${ECHO_T}$ac_cv_lib_gen_pathfind" >&6 -if test $ac_cv_lib_gen_pathfind = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_pathfind" >&5 +$as_echo "$ac_cv_lib_gen_pathfind" >&6; } +if test "x$ac_cv_lib_gen_pathfind" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGEN 1 _ACEOF @@ -13540,200 +8198,18 @@ _ACEOF fi - -for ac_func in vprintf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_VPRINTF 1 _ACEOF -echo "$as_me:$LINENO: checking for _doprnt" >&5 -echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 -if test "${ac_cv_func__doprnt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define _doprnt to an innocuous variant, in case declares _doprnt. - For example, HP-UX 11i declares gettimeofday. */ -#define _doprnt innocuous__doprnt +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char _doprnt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef _doprnt - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char _doprnt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub__doprnt) || defined (__stub____doprnt) -choke me -#else -char (*f) () = _doprnt; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != _doprnt; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func__doprnt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func__doprnt=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 -echo "${ECHO_T}$ac_cv_func__doprnt" >&6 -if test $ac_cv_func__doprnt = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DOPRNT 1 -_ACEOF +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi @@ -13741,108 +8217,14 @@ fi done - - - - - - -for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -13854,13 +8236,13 @@ fi # end of AC_DEFUN of LIBOPTS_CHECK -echo "$as_me:$LINENO: checking if $CC can handle #warning" >&5 -echo $ECHO_N "checking if $CC can handle #warning... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC can handle #warning" >&5 +$as_echo_n "checking if $CC can handle #warning... " >&6; } +if test "${ac_cv_cpp_warning+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -13871,61 +8253,120 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cpp_warning=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_cpp_warning=no + ac_cv_cpp_warning=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_cv_cpp_warning" >&5 -echo "${ECHO_T}$ac_cv_cpp_warning" >&6 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_warning" >&5 +$as_echo "$ac_cv_cpp_warning" >&6; } case "$ac_cv_cpp_warning" in no) -cat >>confdefs.h <<\_ACEOF -#define NO_OPTION_NAME_WARNINGS 1 -_ACEOF +$as_echo "#define NO_OPTION_NAME_WARNINGS 1" >>confdefs.h - echo "$as_me:$LINENO: result: Enabling NO_OPTION_NAME_WARNINGS as #warning does not work" >&5 -echo "${ECHO_T}Enabling NO_OPTION_NAME_WARNINGS as #warning does not work" >&6 - ;; esac -echo "$as_me:$LINENO: checking for bin subdirectory" >&5 -echo $ECHO_N "checking for bin subdirectory... $ECHO_C" >&6 +case "$GCC" in + yes) + SAVED_CFLAGS_AC="$CFLAGS" + CFLAGS="$CFLAGS -Wstrict-overflow" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC can handle -Wstrict-overflow" >&5 +$as_echo_n "checking if $CC can handle -Wstrict-overflow... " >&6; } +if test "${ac_cv_gcc_Wstrict_overflow+set}" = set; then : + $as_echo_n "(cached) " >&6 +else -# Check whether --with-binsubdir or --without-binsubdir was given. -if test "${with_binsubdir+set}" = set; then - withval="$with_binsubdir" - use_binsubdir="$withval" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_gcc_Wstrict_overflow=yes +else + ac_cv_gcc_Wstrict_overflow=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_Wstrict_overflow" >&5 +$as_echo "$ac_cv_gcc_Wstrict_overflow" >&6; } + CFLAGS="$SAVED_CFLAGS_AC" + unset SAVED_CFLAGS_AC + # + # $ac_cv_gcc_Wstrict_overflow is tested later to add the + # flag to CFLAGS. + # +esac + + +case "$GCC" in + yes) + SAVED_CFLAGS_AC="$CFLAGS" + CFLAGS="$CFLAGS -Winit-self" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC can handle -Winit-self" >&5 +$as_echo_n "checking if $CC can handle -Winit-self... " >&6; } +if test "${ac_cv_gcc_Winit_self+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_gcc_Winit_self=yes +else + ac_cv_gcc_Winit_self=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gcc_Winit_self" >&5 +$as_echo "$ac_cv_gcc_Winit_self" >&6; } + CFLAGS="$SAVED_CFLAGS_AC" + unset SAVED_CFLAGS_AC + # + # $ac_cv_gcc_Winit_self is tested later to add the + # flag to CFLAGS. + # +esac + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bin subdirectory" >&5 +$as_echo_n "checking for bin subdirectory... " >&6; } + +# Check whether --with-binsubdir was given. +if test "${with_binsubdir+set}" = set; then : + withval=$with_binsubdir; use_binsubdir="$withval" else use_binsubdir="bin" -fi; +fi + case "$use_binsubdir" in bin) @@ -13933,28 +8374,26 @@ case "$use_binsubdir" in sbin) ;; *) - { { echo "$as_me:$LINENO: error: <$use_binsubdir> is illegal - must be \"bin\" or \"sbin\"" >&5 -echo "$as_me: error: <$use_binsubdir> is illegal - must be \"bin\" or \"sbin\"" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "<$use_binsubdir> is illegal - must be \"bin\" or \"sbin\"" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: result: $use_binsubdir" >&5 -echo "${ECHO_T}$use_binsubdir" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_binsubdir" >&5 +$as_echo "$use_binsubdir" >&6; } BINSUBDIR=$use_binsubdir -echo "$as_me:$LINENO: checking if we want to use arlib" >&5 -echo $ECHO_N "checking if we want to use arlib... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want to use arlib" >&5 +$as_echo_n "checking if we want to use arlib... " >&6; } -# Check whether --with-arlib or --without-arlib was given. -if test "${with_arlib+set}" = set; then - withval="$with_arlib" - ans=$withval +# Check whether --with-arlib was given. +if test "${with_arlib+set}" = set; then : + withval=$with_arlib; ans=$withval else ans=no -fi; -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } if test -d $srcdir/arlib then @@ -13971,13 +8410,13 @@ fi -# Check whether --with-rpath or --without-rpath was given. -if test "${with_rpath+set}" = set; then - withval="$with_rpath" - ans=$withval +# Check whether --with-rpath was given. +if test "${with_rpath+set}" = set; then : + withval=$with_rpath; ans=$withval else ans=x -fi; +fi + case "$ans" in no) need_dash_r= @@ -14007,522 +8446,6 @@ case "$host" in ;; esac -echo "$as_me:$LINENO: checking if we should use /dev/clockctl" >&5 -echo $ECHO_N "checking if we should use /dev/clockctl... $ECHO_C" >&6 -if test "${ac_clockctl+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-clockctl or --disable-clockctl was given. -if test "${enable_clockctl+set}" = set; then - enableval="$enable_clockctl" - ans=$enableval -else - case "$host" in - *-*-netbsd*) - ans=yes - ;; - *) ans=no - ;; - esac - -fi; -ac_clockctl=$ans -fi -echo "$as_me:$LINENO: result: $ac_clockctl" >&5 -echo "${ECHO_T}$ac_clockctl" >&6 -# End of AC_CACHE_CHECK for clockctl - -for ac_header in sys/clockctl.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -case "$ac_clockctl$ac_cv_header_sys_clockctl_h" in - yesyes) - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DROPROOT -_ACEOF - - ;; -esac - -echo "$as_me:$LINENO: checking if we have linux capabilities (libcap)" >&5 -echo $ECHO_N "checking if we have linux capabilities (libcap)... $ECHO_C" >&6 -if test "${ac_linuxcaps+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-linuxcaps or --disable-linuxcaps was given. -if test "${enable_linuxcaps+set}" = set; then - enableval="$enable_linuxcaps" - ans=$enableval -else - ans=no -fi; -ac_linuxcaps=$ans -fi -echo "$as_me:$LINENO: result: $ac_linuxcaps" >&5 -echo "${ECHO_T}$ac_linuxcaps" >&6 -# End of AC_CACHE_CHECK for linuxcaps - -for ac_header in sys/capability.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -for ac_header in sys/prctl.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -case "$ac_linuxcaps$ac_cv_header_sys_capability_h$ac_cv_header_sys_prctl_h" in - yesyesyes) - -cat >>confdefs.h <<\_ACEOF -#define HAVE_LINUX_CAPABILITIES -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DROPROOT -_ACEOF - - LIBS="$LIBS -lcap" - ;; -esac case "$build" in $host) @@ -14531,9 +8454,7 @@ case "$build" in *-*-vxworks*) # Quick and dirty sanity check case "$VX_KERNEL" in - '') { { echo "$as_me:$LINENO: error: Please follow the directions in html/build/hints/vxworks.html!" >&5 -echo "$as_me: error: Please follow the directions in html/build/hints/vxworks.html!" >&2;} - { (exit 1); exit 1; }; } + '') as_fn_error "Please follow the directions in html/build/hints/vxworks.html!" "$LINENO" 5 ;; esac CFLAGS="$CFLAGS -DSYS_VXWORKS" @@ -14546,10 +8467,10 @@ for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. @@ -14559,55 +8480,59 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$AWK" && break done -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -14626,10 +8551,26 @@ case "$GCC" in CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wpointer-arith" CFLAGS="$CFLAGS -Wshadow" - CFLAGS="$CFLAGS -Wstrict-prototypes" + # + # OpenSSL has a number of callback prototypes + # inside other function prototypes which trigger + # warnings with -Wstrict-prototypes, such as: + # + # int i2d_RSA_NET(const RSA *a, unsigned char **pp, + # int (*cb)(), int sgckey); + # ^^^^^^^^^^^ + # + CFLAGS="$CFLAGS -Wno-strict-prototypes" # CFLAGS="$CFLAGS -Wtraditional" # CFLAGS="$CFLAGS -Wwrite-strings" - + case "$ac_cv_gcc_Winit_self" in + yes) + CFLAGS="$CFLAGS -Winit-self" + esac + case "$ac_cv_gcc_Wstrict_overflow" in + yes) + #not yet: CFLAGS="$CFLAGS -Wstrict-overflow" + esac ;; esac @@ -14661,9 +8602,7 @@ case "$ac_busted_vpath_in_make$srcdir" in yes.) ;; *) case "`${MAKE-make} -v -f /dev/null 2>/dev/null | sed -e 's/GNU Make version \(1-9.]*\).*/\1/' -e q`" in '') - { { echo "$as_me:$LINENO: error: building outside of the main directory requires GNU make" >&5 -echo "$as_me: error: building outside of the main directory requires GNU make" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "building outside of the main directory requires GNU make" "$LINENO" 5 ;; *) ;; esac @@ -14671,69 +8610,12 @@ echo "$as_me: error: building outside of the main directory requires GNU make" > esac -# HMS: From bunnylou/cowbird -case "$host" in - alpha-dec-osf4.0) - # Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=no -fi; - ;; - *) # So far, the only shared library we might use is libopts. - # It's a small library - we might as well use a static version of it. - # Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=no -fi; - - ;; -esac - -# Check whether --enable-static or --disable-static was given. -if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; @@ -14752,12 +8634,12 @@ if test "${enable_static+set}" = set; then esac else enable_static=yes -fi; +fi -# Check whether --enable-fast-install or --disable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval="$enable_fast_install" - p=${PACKAGE-default} + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; @@ -14776,12 +8658,13 @@ if test "${enable_fast_install+set}" = set; then esac else enable_fast_install=yes -fi; +fi -echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 -if test "${lt_cv_path_SED+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${lt_cv_path_SED+set}" = set; then : + $as_echo_n "(cached) " >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. @@ -14832,22 +8715,22 @@ done fi SED=$lt_cv_path_SED -echo "$as_me:$LINENO: result: $SED" >&5 -echo "${ECHO_T}$SED" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +$as_echo "$SED" >&6; } -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -14876,14 +8759,14 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } fi -if test "${lt_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +if test "${lt_cv_path_LD+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR @@ -14913,19 +8796,17 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -if test "${lt_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then : + $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld -echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 -echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 -if test "${lt_cv_ld_reload_flag+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi -echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 -echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -14967,10 +8848,10 @@ case $host_os in ;; esac -echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 -echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 -if test "${lt_cv_path_NM+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD-compatible nm" >&5 +$as_echo_n "checking for BSD-compatible nm... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. @@ -15009,25 +8890,25 @@ else test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi -echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -echo "${ECHO_T}$lt_cv_path_NM" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } NM="$lt_cv_path_NM" -echo "$as_me:$LINENO: checking whether ln -s works" >&5 -echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -echo "${ECHO_T}no, using $LN_S" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } fi -echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 -echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 -if test "${lt_cv_deplibs_check_method+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognise dependent libraries" >&5 +$as_echo_n "checking how to recognise dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= @@ -15196,8 +9077,8 @@ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) esac fi -echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown @@ -15211,11 +9092,11 @@ LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi -fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good @@ -15224,11 +9105,11 @@ case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" @@ -15242,12 +9123,12 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 15245 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + echo '#line 9126 "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) @@ -15280,11 +9161,11 @@ ia64-*-hpux*) x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in @@ -15327,10 +9208,10 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" - echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 -if test "${lt_cv_cc_needs_belf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -15338,11 +9219,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -15353,37 +9230,13 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -lt_cv_cc_needs_belf=no + lt_cv_cc_needs_belf=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -15391,8 +9244,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" @@ -15404,1103 +9257,26 @@ esac need_locks="$enable_libtool_lock" - for ac_header in dlfcn.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_DLFCN_H 1 _ACEOF fi done -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_CXX" && break -done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - - CXX=$ac_ct_CXX -fi - - -# Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C++ compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 -GXX=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cxx_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cxx_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -depcc="$CXX" am_compiler_list= - -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - - -if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - - -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 -if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6 -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -fi - - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$F77"; then - ac_cv_prog_F77="$F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_F77="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -F77=$ac_cv_prog_F77 -if test -n "$F77"; then - echo "$as_me:$LINENO: result: $F77" >&5 -echo "${ECHO_T}$F77" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$F77" && break - done -fi -if test -z "$F77"; then - ac_ct_F77=$F77 - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_F77"; then - ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_F77="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_F77=$ac_cv_prog_ac_ct_F77 -if test -n "$ac_ct_F77"; then - echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 -echo "${ECHO_T}$ac_ct_F77" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_F77" && break -done - - F77=$ac_ct_F77 -fi - - -# Provide some information about the compiler. -echo "$as_me:16351:" \ - "checking for Fortran 77 compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -rm -f a.out - -# If we don't use `.F' as extension, the preprocessor is not run on the -# input file. (Note that this only needs to work for GNU compilers.) -ac_save_ext=$ac_ext -ac_ext=F -echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 -if test "${ac_cv_f77_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF - program main -#ifndef __GNUC__ - choke me -#endif - - end -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_f77_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 -ac_ext=$ac_save_ext -ac_test_FFLAGS=${FFLAGS+set} -ac_save_FFLAGS=$FFLAGS -FFLAGS= -echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 -echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_f77_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - FFLAGS=-g -cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_f77_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_f77_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 -echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 -if test "$ac_test_FFLAGS" = set; then - FFLAGS=$ac_save_FFLAGS -elif test $ac_cv_prog_f77_g = yes; then - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O2" - else - FFLAGS="-g" - fi -else - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O2" - else - FFLAGS= - fi -fi - -G77=`test $ac_compiler_gnu = yes && echo yes` -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments -echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 -echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 -if test "${lt_cv_sys_max_cmd_len+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then : + $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" @@ -16589,21 +9365,21 @@ else fi if test -n $lt_cv_sys_max_cmd_len ; then - echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } else - echo "$as_me:$LINENO: result: none" >&5 -echo "${ECHO_T}none" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } fi # Check for command to grab the raw symbol name followed by C symbol from nm. -echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : + $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. @@ -16696,18 +9472,18 @@ void nm_test_func(){} int main(){nm_test_var='a';nm_test_func();return(0);} EOF - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm - if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s "$nlist"; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -16758,11 +9534,11 @@ EOF lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" @@ -16796,17 +9572,17 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - echo "$as_me:$LINENO: result: failed" >&5 -echo "${ECHO_T}failed" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } else - echo "$as_me:$LINENO: result: ok" >&5 -echo "${ECHO_T}ok" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } fi -echo "$as_me:$LINENO: checking for objdir" >&5 -echo $ECHO_N "checking for objdir... $ECHO_C" >&6 -if test "${lt_cv_objdir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then : + $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null @@ -16818,8 +9594,8 @@ else fi rmdir .libs 2>/dev/null fi -echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -echo "${ECHO_T}$lt_cv_objdir" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir @@ -16870,10 +9646,10 @@ with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. @@ -16883,35 +9659,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. @@ -16921,28 +9699,38 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - AR=$ac_ct_AR + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi else AR="$ac_cv_prog_AR" fi @@ -16950,10 +9738,10 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. @@ -16963,35 +9751,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. @@ -17001,28 +9791,38 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi @@ -17030,10 +9830,10 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. @@ -17043,35 +9843,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. @@ -17081,28 +9883,38 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi @@ -17160,10 +9972,10 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : + $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) @@ -17213,19 +10025,19 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - echo "$as_me:$LINENO: checking for file" >&5 -echo $ECHO_N "checking for file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : + $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) @@ -17275,11 +10087,11 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi else @@ -17294,21 +10106,21 @@ esac enable_dlopen=no enable_win32_dll=no -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi -fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes -# Check whether --with-pic or --without-pic was given. -if test "${with_pic+set}" = set; then - withval="$with_pic" - pic_mode="$withval" +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" else pic_mode=default -fi; +fi + test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script @@ -17368,12 +10180,12 @@ if test "$GCC" = no; then esac fi if test -n "$lt_prog_cc_shlib"; then - { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 -echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +$as_echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : else - { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 -echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +$as_echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} lt_cv_prog_cc_can_build_shared=no fi fi @@ -17382,10 +10194,10 @@ fi # # Check to make sure the static flag actually works. # -echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 -if test "${lt_prog_compiler_static_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +$as_echo_n "checking if $compiler static flag $lt_prog_compiler_static works... " >&6; } +if test "${lt_prog_compiler_static_works+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" @@ -17410,8 +10222,8 @@ else LDFLAGS="$save_LDFLAGS" fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_static_works" >&5 +$as_echo "$lt_prog_compiler_static_works" >&6; } if test x"$lt_prog_compiler_static_works" = xyes; then : @@ -17428,10 +10240,10 @@ if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' -echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext @@ -17446,11 +10258,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17449: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10261: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:17453: \$? = $ac_status" >&5 + echo "$as_me:10265: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -17463,8 +10275,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -17478,8 +10290,8 @@ lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' @@ -17682,18 +10494,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test "${lt_prog_compiler_pic_works+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext @@ -17708,11 +10520,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17711: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10523: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:17715: \$? = $ac_status" >&5 + echo "$as_me:10527: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -17725,8 +10537,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works" >&5 +$as_echo "$lt_prog_compiler_pic_works" >&6; } if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in @@ -17749,10 +10561,10 @@ case $host_os in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null @@ -17770,11 +10582,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:17773: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10585: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:17777: \$? = $ac_status" >&5 + echo "$as_me:10589: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -17796,34 +10608,34 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -18174,11 +10986,7 @@ EOF # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -18189,41 +10997,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -18235,11 +11018,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -18250,41 +11029,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -18718,8 +11472,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac fi -echo "$as_me:$LINENO: result: $ld_shlibs" >&5 -echo "${ECHO_T}$ld_shlibs" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -18744,16 +11498,16 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext @@ -18766,11 +11520,11 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } then archive_cmds_need_lc=no else @@ -18781,16 +11535,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -echo "${ECHO_T}$archive_cmds_need_lc" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -19343,12 +12097,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ @@ -19372,8 +12126,8 @@ else # directories. hardcode_action=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action" >&5 -echo "${ECHO_T}$hardcode_action" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink; then # Fast installation is not supported @@ -19386,29 +12140,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } ;; esac fi @@ -19440,71 +12194,43 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -19517,458 +12243,168 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -20007,10 +12443,10 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross @@ -20018,7 +12454,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -20100,15 +12536,15 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross @@ -20116,7 +12552,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -20198,8 +12634,8 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -20221,13 +12657,13 @@ fi # Report which librarie types wil actually be built -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -20247,15 +12683,15 @@ aix4* | aix5*) fi ;; esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh @@ -20346,8 +12782,8 @@ if test -f "$ltmain"; then cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" - { echo "$as_me:$LINENO: creating $ofile" >&5 -echo "$as_me: creating $ofile" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 +$as_echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL @@ -20744,26 +13180,26 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" -# Check whether --with-tags or --without-tags was given. -if test "${with_tags+set}" = set; then - withval="$with_tags" - tagnames="$withval" -fi; +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then : + withval=$with_tags; tagnames="$withval" +fi + if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not exist" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else - { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 -echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi @@ -20777,17 +13213,13 @@ echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; - *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 -echo "$as_me: error: invalid tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } + *) as_fn_error "invalid tag name: $tagname" "$LINENO" 5 ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then - { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 -echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "tag name \"$tagname\" already exists" "$LINENO" 5 fi # Update the list of available tags. @@ -20799,3641 +13231,7 @@ echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_flag_spec_ld_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_automatic_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -compiler_CXX=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' -else - lt_prog_compiler_no_builtin_flag_CXX= -fi - -if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi; -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 -else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 -fi -if test "${lt_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -echo "${ECHO_T}$LD" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi -test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -if test "${lt_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= -fi - -# PORTME: fill in a description of your system's C++ link characteristics -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -ld_shlibs_CXX=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_CXX=yes - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_CXX=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX=' ' - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs_CXX=no - fi - ;; - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - whole_archive_flag_spec_CXX='' - link_all_deplibs_CXX=yes - - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs_CXX=no - ;; - esac - fi - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - freebsd[12]*) - # C++ shared libraries reported to be fairly broken before switch to ELF - ld_shlibs_CXX=no - ;; - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - gnu*) - ;; - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld_CXX='+b $libdir' - hardcode_libdir_separator_CXX=: - ;; - ia64*) - hardcode_libdir_flag_spec_CXX='-L$libdir' - ;; - *) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - *) - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*|ia64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - ia64*|hppa*64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - ;; - linux*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc*) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC*) - # Portland Group C++ compiler - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - openbsd*) - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd='echo' - ;; - osf3*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ - $rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - sco*) - archive_cmds_need_lc_CXX=no - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='echo' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - archive_cmds_need_lc_CXX=no - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; -esac -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 -test "$ld_shlibs_CXX" = no && can_build_shared=no - -GCC_CXX="$GXX" -LD_CXX="$LD" - - -cat > conftest.$ac_ext <&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - # The `*' in the case matches for architectures that use `case' in - # $output_verbose_cmd can trigger glob expansion during the loop - # eval without this substitution. - output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` - - for p in `eval $output_verbose_link_cmd`; do - case $p in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" \ - || test $p = "-R"; then - prev=$p - continue - else - prev= - fi - - if test "$pre_test_object_deps_done" = no; then - case $p in - -L* | -R*) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - ;; - - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$rm -f confest.$objext - -# PORTME: override above test on systems where it is broken -case $host_os in -solaris*) - case $cc_basename in - CC*) - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - postdeps_CXX='-lCstd -lCrun' - ;; - esac -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - -lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic_CXX='-qnocommon' - lt_prog_compiler_wl_CXX='-Wl,' - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - icpc* | ecpc*) - # Intel C++ - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC*) - # Portland Group C++ compiler. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - sco*) - case $cc_basename in - CC*) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - *) - ;; - esac - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - unixware*) - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:22374: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:22378: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_CXX=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 - -if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" - ;; -esac - -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:22436: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:22440: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw*) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 -test "$ld_shlibs_CXX" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_CXX=no - else - archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 - ;; - esac - fi - ;; -esac - -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 -test "$dynamic_linker" = no && can_build_shared=no - -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || \ - test -n "$runpath_var_CXX" || \ - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -echo "${ECHO_T}$hardcode_action_CXX" >&6 - -if test "$hardcode_action_CXX" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac -fi - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then - lt_cv_dlopen="shl_load" -else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -int -main () -{ -shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then - lt_cv_dlopen="dlopen" -else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_svld_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dld_link (); -int -main () -{ -dld_link (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_dld_link=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 - - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_CXX \ - CC_CXX \ - LD_CXX \ - lt_prog_compiler_wl_CXX \ - lt_prog_compiler_pic_CXX \ - lt_prog_compiler_static_CXX \ - lt_prog_compiler_no_builtin_flag_CXX \ - export_dynamic_flag_spec_CXX \ - thread_safe_flag_spec_CXX \ - whole_archive_flag_spec_CXX \ - enable_shared_with_static_runtimes_CXX \ - old_archive_cmds_CXX \ - old_archive_from_new_cmds_CXX \ - predep_objects_CXX \ - postdep_objects_CXX \ - predeps_CXX \ - postdeps_CXX \ - compiler_lib_search_path_CXX \ - archive_cmds_CXX \ - archive_expsym_cmds_CXX \ - postinstall_cmds_CXX \ - postuninstall_cmds_CXX \ - old_archive_from_expsyms_cmds_CXX \ - allow_undefined_flag_CXX \ - no_undefined_flag_CXX \ - export_symbols_cmds_CXX \ - hardcode_libdir_flag_spec_CXX \ - hardcode_libdir_flag_spec_ld_CXX \ - hardcode_libdir_separator_CXX \ - hardcode_automatic_CXX \ - module_cmds_CXX \ - module_expsym_cmds_CXX \ - lt_cv_prog_compiler_c_o_CXX \ - exclude_expsyms_CXX \ - include_expsyms_CXX; do - - case $var in - old_archive_cmds_CXX | \ - old_archive_from_new_cmds_CXX | \ - archive_cmds_CXX | \ - archive_expsym_cmds_CXX | \ - module_cmds_CXX | \ - module_expsym_cmds_CXX | \ - old_archive_from_expsyms_cmds_CXX | \ - export_symbols_cmds_CXX | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_CXX - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_CXX -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_CXX - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_CXX" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld - + : else tagname="" fi @@ -24441,2458 +13239,7 @@ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld F77) if test -n "$F77" && test "X$F77" != "Xno"; then - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu - - -archive_cmds_need_lc_F77=no -allow_undefined_flag_F77= -always_export_symbols_F77=no -archive_expsym_cmds_F77= -export_dynamic_flag_spec_F77= -hardcode_direct_F77=no -hardcode_libdir_flag_spec_F77= -hardcode_libdir_flag_spec_ld_F77= -hardcode_libdir_separator_F77= -hardcode_minus_L_F77=no -hardcode_automatic_F77=no -module_cmds_F77= -module_expsym_cmds_F77= -link_all_deplibs_F77=unknown -old_archive_cmds_F77=$old_archive_cmds -no_undefined_flag_F77= -whole_archive_flag_spec_F77= -enable_shared_with_static_runtimes_F77=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -objext_F77=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code=" subroutine t\n return\n end\n" - -# Code to be used in simple link tests -lt_simple_link_test_code=" program t\n end\n" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${F77-"f77"} -compiler=$CC -compiler_F77=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case $host_os in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; -aix4* | aix5*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; -esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 - -test "$ld_shlibs_F77" = no && can_build_shared=no - -GCC_F77="$G77" -LD_F77="$LD" - -lt_prog_compiler_wl_F77= -lt_prog_compiler_pic_F77= -lt_prog_compiler_static_F77= - -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - - if test "$GCC" = yes; then - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_static_F77='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_F77='-fno-common' - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared_F77=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_F77=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - ;; - - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl_F77='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - else - lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' - fi - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic_F77='-qnocommon' - lt_prog_compiler_wl_F77='-Wl,' - ;; - esac - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static_F77='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static_F77='-non_shared' - ;; - - newsos6) - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - linux*) - case $cc_basename in - icc* | ecc*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-fpic' - lt_prog_compiler_static_F77='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl_F77='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl_F77='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - - sco3.2v5*) - lt_prog_compiler_pic_F77='-Kpic' - lt_prog_compiler_static_F77='-dn' - ;; - - solaris*) - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - lt_prog_compiler_wl_F77='-Qoption ld ';; - *) - lt_prog_compiler_wl_F77='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl_F77='-Qoption ld ' - lt_prog_compiler_pic_F77='-PIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic_F77='-Kconform_pic' - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - unicos*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_can_build_shared_F77=no - ;; - - uts4*) - lt_prog_compiler_pic_F77='-pic' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared_F77=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_F77"; then - -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_F77=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_F77" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:24796: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:24800: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_F77=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 - -if test x"$lt_prog_compiler_pic_works_F77" = xyes; then - case $lt_prog_compiler_pic_F77 in - "" | " "*) ;; - *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; - esac -else - lt_prog_compiler_pic_F77= - lt_prog_compiler_can_build_shared_F77=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_F77= - ;; - *) - lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" - ;; -esac - -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_F77=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:24858: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:24862: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_F77=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 - - runpath_var= - allow_undefined_flag_F77= - enable_shared_with_static_runtimes_F77=no - archive_cmds_F77= - archive_expsym_cmds_F77= - old_archive_From_new_cmds_F77= - old_archive_from_expsyms_cmds_F77= - export_dynamic_flag_spec_F77= - whole_archive_flag_spec_F77= - thread_safe_flag_spec_F77= - hardcode_libdir_flag_spec_F77= - hardcode_libdir_flag_spec_ld_F77= - hardcode_libdir_separator_F77= - hardcode_direct_F77=no - hardcode_minus_L_F77=no - hardcode_shlibpath_var_F77=unsupported - link_all_deplibs_F77=unknown - hardcode_automatic_F77=no - module_cmds_F77= - module_expsym_cmds_F77= - always_export_symbols_F77=no - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms_F77= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - # Just being paranoid about ensuring that cc_basename is set. - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs_F77=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_F77='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_F77= - fi - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs_F77=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_F77=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_F77='-L$libdir' - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=no - enable_shared_with_static_runtimes_F77=yes - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs_F77=no - fi - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_addflag= - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - esac - archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test $supports_anon_versioning = yes; then - archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - $echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - else - ld_shlibs_F77=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - sunos4*) - archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - esac - - if test "$ld_shlibs_F77" = no; then - runpath_var= - hardcode_libdir_flag_spec_F77= - export_dynamic_flag_spec_F77= - whole_archive_flag_spec_F77= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=yes - archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L_F77=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct_F77=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_F77='' - hardcode_direct_F77=yes - hardcode_libdir_separator_F77=':' - link_all_deplibs_F77=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_F77=yes - else - # We have old collect2 - hardcode_direct_F77=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_F77=yes - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_libdir_separator_F77= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_F77=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_F77='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_F77="-z nodefs" - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_F77=' ${wl}-bernotok' - allow_undefined_flag_F77=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_F77=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_F77=' ' - archive_cmds_need_lc_F77=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - # see comment about different semantics on the GNU ld section - ld_shlibs_F77=no - ;; - - bsdi[45]*) - export_dynamic_flag_spec_F77=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_F77=' ' - allow_undefined_flag_F77=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds_F77='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path_F77='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes_F77=yes - ;; - - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc_F77=no - hardcode_direct_F77=no - hardcode_automatic_F77=yes - hardcode_shlibpath_var_F77=unsupported - whole_archive_flag_spec_F77='' - link_all_deplibs_F77=yes - if test "$GCC" = yes ; then - output_verbose_link_cmd='echo' - archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs_F77=no - ;; - esac - fi - ;; - - dgux*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - freebsd1*) - ld_shlibs_F77=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) - archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*|ia64*) - archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*|ia64*) - archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld_F77='+b $libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - ;; - ia64*) - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - ;; - *) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - link_all_deplibs_F77=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - newsos6) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_shlibpath_var_F77=no - ;; - - openbsd*) - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - export_dynamic_flag_spec_F77='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - ;; - *) - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - allow_undefined_flag_F77=unsupported - archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec_F77='-rpath $libdir' - fi - hardcode_libdir_separator_F77=: - ;; - - sco3.2v5*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag_F77=' -z text' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - wlarc='' - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_shlibpath_var_F77=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. - # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; - *) - whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; - esac - link_all_deplibs_F77=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds_F77='$CC -r -o $output$reload_objs' - hardcode_direct_F77=no - ;; - motorola) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no - ;; - - sysv4.3*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs_F77=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=no - hardcode_shlibpath_var_F77=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag_F77='${wl}-z ${wl}text' - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no - ;; - - sysv5*) - no_undefined_flag_F77=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec_F77= - hardcode_shlibpath_var_F77=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - *) - ld_shlibs_F77=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 -echo "${ECHO_T}$ld_shlibs_F77" >&6 -test "$ld_shlibs_F77" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_F77" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_F77=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_F77 in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_F77 - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_F77 - allow_undefined_flag_F77= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_F77=no - else - archive_cmds_need_lc_F77=yes - fi - allow_undefined_flag_F77=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 - ;; - esac - fi - ;; -esac - -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 -test "$dynamic_linker" = no && can_build_shared=no - -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action_F77= -if test -n "$hardcode_libdir_flag_spec_F77" || \ - test -n "$runpath_var_F77" || \ - test "X$hardcode_automatic_F77" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_F77" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && - test "$hardcode_minus_L_F77" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_F77=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_F77=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_F77=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 -echo "${ECHO_T}$hardcode_action_F77" >&6 - -if test "$hardcode_action_F77" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac -fi - - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_F77 \ - CC_F77 \ - LD_F77 \ - lt_prog_compiler_wl_F77 \ - lt_prog_compiler_pic_F77 \ - lt_prog_compiler_static_F77 \ - lt_prog_compiler_no_builtin_flag_F77 \ - export_dynamic_flag_spec_F77 \ - thread_safe_flag_spec_F77 \ - whole_archive_flag_spec_F77 \ - enable_shared_with_static_runtimes_F77 \ - old_archive_cmds_F77 \ - old_archive_from_new_cmds_F77 \ - predep_objects_F77 \ - postdep_objects_F77 \ - predeps_F77 \ - postdeps_F77 \ - compiler_lib_search_path_F77 \ - archive_cmds_F77 \ - archive_expsym_cmds_F77 \ - postinstall_cmds_F77 \ - postuninstall_cmds_F77 \ - old_archive_from_expsyms_cmds_F77 \ - allow_undefined_flag_F77 \ - no_undefined_flag_F77 \ - export_symbols_cmds_F77 \ - hardcode_libdir_flag_spec_F77 \ - hardcode_libdir_flag_spec_ld_F77 \ - hardcode_libdir_separator_F77 \ - hardcode_automatic_F77 \ - module_cmds_F77 \ - module_expsym_cmds_F77 \ - lt_cv_prog_compiler_c_o_F77 \ - exclude_expsyms_F77 \ - include_expsyms_F77; do - - case $var in - old_archive_cmds_F77 | \ - old_archive_from_new_cmds_F77 | \ - archive_cmds_F77 | \ - archive_expsym_cmds_F77 | \ - module_cmds_F77 | \ - module_expsym_cmds_F77 | \ - old_archive_from_expsyms_cmds_F77 | \ - export_symbols_cmds_F77 | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_F77 - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_F77 - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_F77 - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_F77 - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_F77 - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_F77 -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_F77 - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_F77 -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_F77 -archive_expsym_cmds=$lt_archive_expsym_cmds_F77 -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_F77 -module_expsym_cmds=$lt_module_expsym_cmds_F77 - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_F77 - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_F77 - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_F77 - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_F77 - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_F77 - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_F77 - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_F77 - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_F77 - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_F77 - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_F77 - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_F77" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_F77 - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_F77 - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_F77 - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_F77 - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - + : else tagname="" fi @@ -26902,7 +13249,6 @@ CC="$lt_save_CC" if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - # Source file extension for Java test sources. ac_ext=java @@ -26967,10 +13313,10 @@ if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' -echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext @@ -26985,11 +13331,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:26988: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13334: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:26992: \$? = $ac_status" >&5 + echo "$as_me:13338: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -27002,8 +13348,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" @@ -27017,8 +13363,8 @@ lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' @@ -27221,18 +13567,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext @@ -27247,11 +13593,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:27250: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13596: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:27254: \$? = $ac_status" >&5 + echo "$as_me:13600: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -27264,8 +13610,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_works_GCJ" >&6; } if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in @@ -27288,10 +13634,10 @@ case $host_os in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null @@ -27309,11 +13655,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:27312: $lt_compile\"" >&5) + (eval echo "\"\$as_me:13658: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:27316: \$? = $ac_status" >&5 + echo "$as_me:13662: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -27335,34 +13681,34 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_GCJ= @@ -27713,11 +14059,7 @@ EOF # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -27728,41 +14070,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -27774,11 +14091,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -27789,41 +14102,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -28257,8 +14545,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac fi -echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 -echo "${ECHO_T}$ld_shlibs_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_GCJ" >&5 +$as_echo "$ld_shlibs_GCJ" >&6; } test "$ld_shlibs_GCJ" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -28283,16 +14571,16 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext @@ -28305,11 +14593,11 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } then archive_cmds_need_lc_GCJ=no else @@ -28320,16 +14608,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_GCJ" >&5 +$as_echo "$archive_cmds_need_lc_GCJ" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -28882,12 +15170,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ @@ -28911,8 +15199,8 @@ else # directories. hardcode_action_GCJ=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -echo "${ECHO_T}$hardcode_action_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_GCJ" >&5 +$as_echo "$hardcode_action_GCJ" >&6; } if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported @@ -28925,29 +15213,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } ;; esac fi @@ -28979,71 +15267,43 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -29056,458 +15316,168 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -29546,10 +15516,10 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross @@ -29557,7 +15527,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -29639,15 +15609,15 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross @@ -29655,7 +15625,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -29737,8 +15707,8 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -30180,7 +16150,6 @@ CC="$lt_save_CC" RC) - # Source file extension for RC test sources. ac_ext=rc @@ -30650,9 +16619,7 @@ CC="$lt_save_CC" ;; *) - { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 -echo "$as_me: error: Unsupported tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "Unsupported tag name: $tagname" "$LINENO" 5 ;; esac @@ -30670,9 +16637,7 @@ echo "$as_me: error: Unsupported tag name: $tagname" >&2;} chmod +x "$ofile" else rm -f "${ofile}T" - { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 -echo "$as_me: error: unable to update list of available tagged configurations." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "unable to update list of available tagged configurations." "$LINENO" 5 fi fi @@ -30695,45 +16660,31 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - -echo "$as_me:$LINENO: checking whether ln -s works" >&5 -echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -echo "${ECHO_T}no, using $LN_S" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } fi if test $ac_cv_c_compiler_gnu = yes; then - echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 -echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 -if test "${ac_cv_prog_gcc_traditional+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 +$as_echo_n "checking whether $CC needs -traditional... " >&6; } +if test "${ac_cv_prog_gcc_traditional+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then + $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no @@ -30742,40 +16693,32 @@ rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "$ac_pattern" >/dev/null 2>&1; then + $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi -echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 -echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 +$as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi -echo "$as_me:$LINENO: checking for working volatile" >&5 -echo $ECHO_N "checking for working volatile... $ECHO_C" >&6 -if test "${ac_cv_c_volatile+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 +$as_echo_n "checking for working volatile... " >&6; } +if test "${ac_cv_c_volatile+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -30783,184 +16726,89 @@ main () { volatile int x; -int * volatile y; +int * volatile y = (int *) 0; +return !x && !y; ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_volatile=no + ac_cv_c_volatile=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 -echo "${ECHO_T}$ac_cv_c_volatile" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +$as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then -cat >>confdefs.h <<\_ACEOF -#define volatile -_ACEOF +$as_echo "#define volatile /**/" >>confdefs.h fi -echo "$as_me:$LINENO: checking for library containing strerror" >&5 -echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6 -if test "${ac_cv_search_strerror+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if test "${ac_cv_search_strerror+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_strerror=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char strerror (); int main () { -strerror (); +return strerror (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_strerror="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_strerror" = no; then - for ac_lib in cposix; do +for ac_lib in '' cposix; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_strerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_strerror+set}" = set; then : + break +fi +done +if test "${ac_cv_search_strerror+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char strerror (); -int -main () -{ -strerror (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_strerror="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_strerror=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 -echo "${ECHO_T}$ac_cv_search_strerror" >&6 -if test "$ac_cv_search_strerror" != no; then - test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 +$as_echo "$ac_cv_search_strerror" >&6; } +ac_res=$ac_cv_search_strerror +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Extract the first word of "sh", so it can be a program name with args. set dummy sh; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_path_PATH_SH+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PATH_SH+set}" = set; then : + $as_echo_n "(cached) " >&6 else case $PATH_SH in [\\/]* | ?:[\\/]*) @@ -30972,34 +16820,35 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PATH_SH="$as_dir/$ac_word$ac_exec_ext" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS ;; esac fi PATH_SH=$ac_cv_path_PATH_SH - if test -n "$PATH_SH"; then - echo "$as_me:$LINENO: result: $PATH_SH" >&5 -echo "${ECHO_T}$PATH_SH" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATH_SH" >&5 +$as_echo "$PATH_SH" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_path_PATH_PERL+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PATH_PERL+set}" = set; then : + $as_echo_n "(cached) " >&6 else case $PATH_PERL in [\\/]* | ?:[\\/]*) @@ -31011,74 +16860,60 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PATH_PERL="$as_dir/$ac_word$ac_exec_ext" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS ;; esac fi PATH_PERL=$ac_cv_path_PATH_PERL - if test -n "$PATH_PERL"; then - echo "$as_me:$LINENO: result: $PATH_PERL" >&5 -echo "${ECHO_T}$PATH_PERL" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATH_PERL" >&5 +$as_echo "$PATH_PERL" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define ACAT(a,b)a ## b ACAT(Cir,cus) _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Circus" >/dev/null 2>&1; then - cat >>confdefs.h <<\_ACEOF -#define ULONG_CONST(a) a ## UL -_ACEOF + $EGREP "Circus" >/dev/null 2>&1; then : + $as_echo "#define ULONG_CONST(a) a ## UL" >>confdefs.h else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define RCAT(a,b)a/**/b RCAT(Rei,ser) _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "Reiser" >/dev/null 2>&1; then - cat >>confdefs.h <<\_ACEOF -#define ULONG_CONST(a) a/**/L -_ACEOF + $EGREP "Reiser" >/dev/null 2>&1; then : + $as_echo "#define ULONG_CONST(a) a/**/L" >>confdefs.h else - { { echo "$as_me:$LINENO: error: How do we create an unsigned long constant?" >&5 -echo "$as_me: error: How do we create an unsigned long constant?" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "How do we create an unsigned long constant?" "$LINENO" 5 fi rm -f conftest* fi rm -f conftest* - + # remove for 4.2.5 case "$host" in *-*-vxworks*) @@ -31086,148 +16921,41 @@ case "$host" in ;; esac -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - done - done - ;; -esac -done - - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL=$ac_install_sh - fi -fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' case "$host" in *-pc-cygwin*) - -echo "$as_me:$LINENO: checking for main in -ladvapi32" >&5 -echo $ECHO_N "checking for main in -ladvapi32... $ECHO_C" >&6 -if test "${ac_cv_lib_advapi32_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ladvapi32" >&5 +$as_echo_n "checking for main in -ladvapi32... " >&6; } +if test "${ac_cv_lib_advapi32_main+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ladvapi32 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { -main (); +return main (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_advapi32_main=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_advapi32_main=no + ac_cv_lib_advapi32_main=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_advapi32_main" >&5 -echo "${ECHO_T}$ac_cv_lib_advapi32_main" >&6 -if test $ac_cv_lib_advapi32_main = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_advapi32_main" >&5 +$as_echo "$ac_cv_lib_advapi32_main" >&6; } +if test "x$ac_cv_lib_advapi32_main" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBADVAPI32 1 _ACEOF @@ -31239,412 +16967,180 @@ fi ;; esac -echo "$as_me:$LINENO: checking for gethostent" >&5 -echo $ECHO_N "checking for gethostent... $ECHO_C" >&6 -if test "${ac_cv_func_gethostent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_func "$LINENO" "gethostent" "ac_cv_func_gethostent" +if test "x$ac_cv_func_gethostent" = x""yes; then : + else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostent" >&5 +$as_echo_n "checking for library containing gethostent... " >&6; } +if test "${ac_cv_search_gethostent+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Define gethostent to an innocuous variant, in case declares gethostent. - For example, HP-UX 11i declares gettimeofday. */ -#define gethostent innocuous_gethostent -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char gethostent (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef gethostent - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char gethostent (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_gethostent) || defined (__stub___gethostent) -choke me -#else -char (*f) () = gethostent; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != gethostent; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_gethostent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_gethostent=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_gethostent" >&5 -echo "${ECHO_T}$ac_cv_func_gethostent" >&6 -if test $ac_cv_func_gethostent = yes; then - : -else - -echo "$as_me:$LINENO: checking for gethostent in -lnsl" >&5 -echo $ECHO_N "checking for gethostent in -lnsl... $ECHO_C" >&6 -if test "${ac_cv_lib_nsl_gethostent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnsl $libxnet -lsocket $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char gethostent (); int main () { -gethostent (); +return gethostent (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_nsl_gethostent=yes +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $libxnet -lsocket $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_gethostent=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_gethostent+set}" = set; then : + break +fi +done +if test "${ac_cv_search_gethostent+set}" = set; then : + else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_nsl_gethostent=no + ac_cv_search_gethostent=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostent" >&5 -echo "${ECHO_T}$ac_cv_lib_nsl_gethostent" >&6 -if test $ac_cv_lib_nsl_gethostent = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBNSL 1 -_ACEOF - - LIBS="-lnsl $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostent" >&5 +$as_echo "$ac_cv_search_gethostent" >&6; } +ac_res=$ac_cv_search_gethostent +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi -echo "$as_me:$LINENO: checking for openlog" >&5 -echo $ECHO_N "checking for openlog... $ECHO_C" >&6 -if test "${ac_cv_func_openlog+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_func "$LINENO" "openlog" "ac_cv_func_openlog" +if test "x$ac_cv_func_openlog" = x""yes; then : + else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing openlog" >&5 +$as_echo_n "checking for library containing openlog... " >&6; } +if test "${ac_cv_search_openlog+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Define openlog to an innocuous variant, in case declares openlog. - For example, HP-UX 11i declares gettimeofday. */ -#define openlog innocuous_openlog -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char openlog (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef openlog - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char openlog (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_openlog) || defined (__stub___openlog) -choke me -#else -char (*f) () = openlog; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != openlog; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_openlog=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_openlog=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_openlog" >&5 -echo "${ECHO_T}$ac_cv_func_openlog" >&6 -if test $ac_cv_func_openlog = yes; then - : -else - -echo "$as_me:$LINENO: checking for openlog in -lgen" >&5 -echo $ECHO_N "checking for openlog in -lgen... $ECHO_C" >&6 -if test "${ac_cv_lib_gen_openlog+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lgen $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char openlog (); int main () { -openlog (); +return openlog (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_gen_openlog=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_gen_openlog=no +for ac_lib in '' gen; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_openlog=$ac_res fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_openlog+set}" = set; then : + break fi -echo "$as_me:$LINENO: result: $ac_cv_lib_gen_openlog" >&5 -echo "${ECHO_T}$ac_cv_lib_gen_openlog" >&6 -if test $ac_cv_lib_gen_openlog = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBGEN 1 -_ACEOF - - LIBS="-lgen $LIBS" +done +if test "${ac_cv_search_openlog+set}" = set; then : else + ac_cv_search_openlog=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_openlog" >&5 +$as_echo "$ac_cv_search_openlog" >&6; } +ac_res=$ac_cv_search_openlog +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" -echo "$as_me:$LINENO: checking for openlog in -lsyslog" >&5 -echo $ECHO_N "checking for openlog in -lsyslog... $ECHO_C" >&6 -if test "${ac_cv_lib_syslog_openlog+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsyslog $libxnet -lsocket $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing openlog" >&5 +$as_echo_n "checking for library containing openlog... " >&6; } +if test "${ac_cv_search_openlog+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char openlog (); int main () { -openlog (); +return openlog (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_syslog_openlog=yes +for ac_lib in '' syslog; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $libxnet -lsocket $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_openlog=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_openlog+set}" = set; then : + break +fi +done +if test "${ac_cv_search_openlog+set}" = set; then : + else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_syslog_openlog=no + ac_cv_search_openlog=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_syslog_openlog" >&5 -echo "${ECHO_T}$ac_cv_lib_syslog_openlog" >&6 -if test $ac_cv_lib_syslog_openlog = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBSYSLOG 1 -_ACEOF - - LIBS="-lsyslog $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_openlog" >&5 +$as_echo "$ac_cv_search_openlog" >&6; } +ac_res=$ac_cv_search_openlog +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi @@ -31652,402 +17148,83 @@ fi fi - -echo "$as_me:$LINENO: checking for MD5Init in -lmd5" >&5 -echo $ECHO_N "checking for MD5Init in -lmd5... $ECHO_C" >&6 -if test "${ac_cv_lib_md5_MD5Init+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing MD5Init" >&5 +$as_echo_n "checking for library containing MD5Init... " >&6; } +if test "${ac_cv_search_MD5Init+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lmd5 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char MD5Init (); int main () { -MD5Init (); +return MD5Init (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_md5_MD5Init=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_md5_MD5Init=no +for ac_lib in '' md5 md; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_MD5Init=$ac_res fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_MD5Init+set}" = set; then : + break fi -echo "$as_me:$LINENO: result: $ac_cv_lib_md5_MD5Init" >&5 -echo "${ECHO_T}$ac_cv_lib_md5_MD5Init" >&6 -if test $ac_cv_lib_md5_MD5Init = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBMD5 1 -_ACEOF - - LIBS="-lmd5 $LIBS" +done +if test "${ac_cv_search_MD5Init+set}" = set; then : else - -echo "$as_me:$LINENO: checking for MD5Init in -lmd" >&5 -echo $ECHO_N "checking for MD5Init in -lmd... $ECHO_C" >&6 -if test "${ac_cv_lib_md_MD5Init+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lmd $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char MD5Init (); -int -main () -{ -MD5Init (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_md_MD5Init=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_md_MD5Init=no + ac_cv_search_MD5Init=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_md_MD5Init" >&5 -echo "${ECHO_T}$ac_cv_lib_md_MD5Init" >&6 -if test $ac_cv_lib_md_MD5Init = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBMD 1 -_ACEOF - - LIBS="-lmd $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_MD5Init" >&5 +$as_echo "$ac_cv_search_MD5Init" >&6; } +ac_res=$ac_cv_search_MD5Init +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi -fi - - for ac_func in MD5Init -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "MD5Init" "ac_cv_func_MD5Init" +if test "x$ac_cv_func_MD5Init" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_MD5INIT 1 _ACEOF fi done - +# following block becomes on 4.2.5: NTP_LINEEDITLIBS for ac_header in readline/history.h readline/readline.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -32060,72 +17237,43 @@ case "$ac_cv_header_readline_history_h$ac_cv_header_readline_readline_h" in LIBS= # Ralf Wildenhues: either unset ... or cache READLINE_LIBS unset ac_cv_lib_readline_readline - -echo "$as_me:$LINENO: checking for readline in -lreadline" >&5 -echo $ECHO_N "checking for readline in -lreadline... $ECHO_C" >&6 -if test "${ac_cv_lib_readline_readline+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if test "${ac_cv_lib_readline_readline+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char readline (); int main () { -readline (); +return readline (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_readline_readline=no + ac_cv_lib_readline_readline=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_readline_readline" >&5 -echo "${ECHO_T}$ac_cv_lib_readline_readline" >&6 -if test $ac_cv_lib_readline_readline = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBREADLINE 1 _ACEOF @@ -32133,160 +17281,96 @@ _ACEOF LIBS="-lreadline $LIBS" else - { echo "$as_me:$LINENO: Trying again with -lcurses" >&5 -echo "$as_me: Trying again with -lcurses" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Trying again with -lcurses" >&5 +$as_echo "$as_me: Trying again with -lcurses" >&6;} unset ac_cv_lib_readline_readline - echo "$as_me:$LINENO: checking for readline in -lreadline" >&5 -echo $ECHO_N "checking for readline in -lreadline... $ECHO_C" >&6 -if test "${ac_cv_lib_readline_readline+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +$as_echo_n "checking for readline in -lreadline... " >&6; } +if test "${ac_cv_lib_readline_readline+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline -lcurses $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char readline (); int main () { -readline (); +return readline (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_readline_readline=no + ac_cv_lib_readline_readline=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_readline_readline" >&5 -echo "${ECHO_T}$ac_cv_lib_readline_readline" >&6 -if test $ac_cv_lib_readline_readline = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +$as_echo "$ac_cv_lib_readline_readline" >&6; } +if test "x$ac_cv_lib_readline_readline" = x""yes; then : LIBS="-lreadline -lcurses $LIBS" - cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBREADLINE 1 -_ACEOF + $as_echo "#define HAVE_LIBREADLINE 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBCURSES -_ACEOF +$as_echo "#define HAVE_LIBCURSES /**/" >>confdefs.h else - echo "$as_me:$LINENO: checking for readline in -ledit" >&5 -echo $ECHO_N "checking for readline in -ledit... $ECHO_C" >&6 -if test "${ac_cv_lib_edit_readline+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -ledit" >&5 +$as_echo_n "checking for readline in -ledit... " >&6; } +if test "${ac_cv_lib_edit_readline+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ledit -lcurses $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char readline (); int main () { -readline (); +return readline (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_edit_readline=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_edit_readline=no + ac_cv_lib_edit_readline=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_edit_readline" >&5 -echo "${ECHO_T}$ac_cv_lib_edit_readline" >&6 -if test $ac_cv_lib_edit_readline = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_readline" >&5 +$as_echo "$ac_cv_lib_edit_readline" >&6; } +if test "x$ac_cv_lib_edit_readline" = x""yes; then : LIBS="-ledit -lcurses" -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBEDIT -_ACEOF +$as_echo "#define HAVE_LIBEDIT /**/" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBCURSES -_ACEOF +$as_echo "#define HAVE_LIBCURSES /**/" >>confdefs.h fi @@ -32304,74 +17388,45 @@ esac case "$host" in - *-*-linux*) ;; + *-*-*linux*) ;; *) - -echo "$as_me:$LINENO: checking for sched_setscheduler in -lrt" >&5 -echo $ECHO_N "checking for sched_setscheduler in -lrt... $ECHO_C" >&6 -if test "${ac_cv_lib_rt_sched_setscheduler+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_setscheduler in -lrt" >&5 +$as_echo_n "checking for sched_setscheduler in -lrt... " >&6; } +if test "${ac_cv_lib_rt_sched_setscheduler+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sched_setscheduler (); int main () { -sched_setscheduler (); +return sched_setscheduler (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_sched_setscheduler=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_rt_sched_setscheduler=no + ac_cv_lib_rt_sched_setscheduler=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_rt_sched_setscheduler" >&5 -echo "${ECHO_T}$ac_cv_lib_rt_sched_setscheduler" >&6 -if test $ac_cv_lib_rt_sched_setscheduler = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_setscheduler" >&5 +$as_echo "$ac_cv_lib_rt_sched_setscheduler" >&6; } +if test "x$ac_cv_lib_rt_sched_setscheduler" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRT 1 _ACEOF @@ -32379,72 +17434,43 @@ _ACEOF LIBS="-lrt $LIBS" else - -echo "$as_me:$LINENO: checking for sched_setscheduler in -lposix4" >&5 -echo $ECHO_N "checking for sched_setscheduler in -lposix4... $ECHO_C" >&6 -if test "${ac_cv_lib_posix4_sched_setscheduler+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_setscheduler in -lposix4" >&5 +$as_echo_n "checking for sched_setscheduler in -lposix4... " >&6; } +if test "${ac_cv_lib_posix4_sched_setscheduler+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sched_setscheduler (); int main () { -sched_setscheduler (); +return sched_setscheduler (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix4_sched_setscheduler=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_posix4_sched_setscheduler=no + ac_cv_lib_posix4_sched_setscheduler=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_posix4_sched_setscheduler" >&5 -echo "${ECHO_T}$ac_cv_lib_posix4_sched_setscheduler" >&6 -if test $ac_cv_lib_posix4_sched_setscheduler = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_setscheduler" >&5 +$as_echo "$ac_cv_lib_posix4_sched_setscheduler" >&6; } +if test "x$ac_cv_lib_posix4_sched_setscheduler" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPOSIX4 1 _ACEOF @@ -32458,260 +17484,75 @@ fi ;; esac -echo "$as_me:$LINENO: checking for setsockopt" >&5 -echo $ECHO_N "checking for setsockopt... $ECHO_C" >&6 -if test "${ac_cv_func_setsockopt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" +if test "x$ac_cv_func_setsockopt" = x""yes; then : + else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 +$as_echo_n "checking for library containing setsockopt... " >&6; } +if test "${ac_cv_search_setsockopt+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Define setsockopt to an innocuous variant, in case declares setsockopt. - For example, HP-UX 11i declares gettimeofday. */ -#define setsockopt innocuous_setsockopt -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char setsockopt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef setsockopt - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char setsockopt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_setsockopt) || defined (__stub___setsockopt) -choke me -#else -char (*f) () = setsockopt; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != setsockopt; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_setsockopt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_setsockopt=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_setsockopt" >&5 -echo "${ECHO_T}$ac_cv_func_setsockopt" >&6 -if test $ac_cv_func_setsockopt = yes; then - : -else - -echo "$as_me:$LINENO: checking for setsockopt in -lsocket" >&5 -echo $ECHO_N "checking for setsockopt in -lsocket... $ECHO_C" >&6 -if test "${ac_cv_lib_socket_setsockopt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsocket $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char setsockopt (); int main () { -setsockopt (); +return setsockopt (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_socket_setsockopt=yes +for ac_lib in '' socket xnet; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_setsockopt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_setsockopt+set}" = set; then : + break +fi +done +if test "${ac_cv_search_setsockopt+set}" = set; then : + else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_socket_setsockopt=no + ac_cv_search_setsockopt=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_socket_setsockopt" >&5 -echo "${ECHO_T}$ac_cv_lib_socket_setsockopt" >&6 -if test $ac_cv_lib_socket_setsockopt = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBSOCKET 1 -_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setsockopt" >&5 +$as_echo "$ac_cv_search_setsockopt" >&6; } +ac_res=$ac_cv_search_setsockopt +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - LIBS="-lsocket $LIBS" +fi fi -echo "$as_me:$LINENO: checking for setsockopt in -lxnet" >&5 -echo $ECHO_N "checking for setsockopt in -lxnet... $ECHO_C" >&6 -if test "${ac_cv_lib_xnet_setsockopt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lxnet $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char setsockopt (); -int -main () -{ -setsockopt (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_xnet_setsockopt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_xnet_setsockopt=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_xnet_setsockopt" >&5 -echo "${ECHO_T}$ac_cv_lib_xnet_setsockopt" >&6 -if test $ac_cv_lib_xnet_setsockopt = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBXNET 1 -_ACEOF - - LIBS="-lxnet $LIBS" - -fi - -fi - - -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -32726,51 +17567,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -32780,18 +17593,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -32801,16 +17610,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -32830,401 +17636,82 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi - for ac_header in bstring.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "bstring.h" "ac_cv_header_bstring_h" "$ac_includes_default" +if test "x$ac_cv_header_bstring_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_BSTRING_H 1 _ACEOF fi done -if test "${ac_cv_header_dns_sd_h+set}" = set; then - echo "$as_me:$LINENO: checking for dns_sd.h" >&5 -echo $ECHO_N "checking for dns_sd.h... $ECHO_C" >&6 -if test "${ac_cv_header_dns_sd_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: $ac_cv_header_dns_sd_h" >&5 -echo "${ECHO_T}$ac_cv_header_dns_sd_h" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking dns_sd.h usability" >&5 -echo $ECHO_N "checking dns_sd.h usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking dns_sd.h presence" >&5 -echo $ECHO_N "checking dns_sd.h presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: dns_sd.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: dns_sd.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: dns_sd.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: dns_sd.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: dns_sd.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: dns_sd.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: dns_sd.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: dns_sd.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: dns_sd.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: dns_sd.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: dns_sd.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: dns_sd.h: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: dns_sd.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: dns_sd.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: dns_sd.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: dns_sd.h: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for dns_sd.h" >&5 -echo $ECHO_N "checking for dns_sd.h... $ECHO_C" >&6 -if test "${ac_cv_header_dns_sd_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_header_dns_sd_h=$ac_header_preproc -fi -echo "$as_me:$LINENO: result: $ac_cv_header_dns_sd_h" >&5 -echo "${ECHO_T}$ac_cv_header_dns_sd_h" >&6 - -fi -if test $ac_cv_header_dns_sd_h = yes; then - echo "$as_me:$LINENO: checking for DNSServiceRegister in -ldns_sd" >&5 -echo $ECHO_N "checking for DNSServiceRegister in -ldns_sd... $ECHO_C" >&6 -if test "${ac_cv_lib_dns_sd_DNSServiceRegister+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_header_mongrel "$LINENO" "dns_sd.h" "ac_cv_header_dns_sd_h" "$ac_includes_default" +if test "x$ac_cv_header_dns_sd_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DNSServiceRegister in -ldns_sd" >&5 +$as_echo_n "checking for DNSServiceRegister in -ldns_sd... " >&6; } +if test "${ac_cv_lib_dns_sd_DNSServiceRegister+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldns_sd $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char DNSServiceRegister (); int main () { -DNSServiceRegister (); +return DNSServiceRegister (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dns_sd_DNSServiceRegister=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dns_sd_DNSServiceRegister=no + ac_cv_lib_dns_sd_DNSServiceRegister=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dns_sd_DNSServiceRegister" >&5 -echo "${ECHO_T}$ac_cv_lib_dns_sd_DNSServiceRegister" >&6 -if test $ac_cv_lib_dns_sd_DNSServiceRegister = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dns_sd_DNSServiceRegister" >&5 +$as_echo "$ac_cv_lib_dns_sd_DNSServiceRegister" >&6; } +if test "x$ac_cv_lib_dns_sd_DNSServiceRegister" = x""yes; then : -cat >>confdefs.h <<\_ACEOF -#define HAVE_DNSREGISTRATION 1 -_ACEOF +$as_echo "#define HAVE_DNSREGISTRATION 1" >>confdefs.h fi @@ -33234,153 +17721,14 @@ fi case "$ac_cv_lib_dns_sd_DNSServiceRegister" in yes) LIBS="-ldns_sd $LIBS" ;; esac - - - - for ac_header in errno.h fcntl.h ieeefp.h math.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -33393,64 +17741,16 @@ if test -f /etc/redhat-release then : else - -for ac_header in md5.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H + for ac_header in md5.h +do : + ac_fn_c_check_header_compile "$LINENO" "md5.h" "ac_cv_header_md5_h" "#if HAVE_SYS_TYPES_H #include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_md5_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_MD5_H 1 _ACEOF fi @@ -33458,459 +17758,42 @@ fi done fi - - - for ac_header in memory.h netdb.h poll.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done - - - - - for ac_header in sched.h sgtty.h stdlib.h string.h termio.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done - - - - for ac_header in termios.h timepps.h timex.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -33919,150 +17802,12 @@ done case "$host" in *-*-aix*) - -for ac_header in utmpx.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in utmpx.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "utmpx.h" "ac_cv_header_utmpx_h" "$ac_includes_default" +if test "x$ac_cv_header_utmpx_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_UTMPX_H 1 _ACEOF fi @@ -34071,150 +17816,12 @@ done case "$ac_cv_header_utmpx_h" in yes) ;; - *) -for ac_header in utmp.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + *) for ac_header in utmp.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "utmp.h" "ac_cv_header_utmp_h" "$ac_includes_default" +if test "x$ac_cv_header_utmp_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_UTMP_H 1 _ACEOF fi @@ -34223,151 +17830,14 @@ done ;; esac ;; - *) - -for ac_header in utmp.h utmpx.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + *) for ac_header in utmp.h utmpx.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -34375,902 +17845,104 @@ fi done ;; esac - for ac_header in arpa/nameser.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "arpa/nameser.h" "ac_cv_header_arpa_nameser_h" "$ac_includes_default" +if test "x$ac_cv_header_arpa_nameser_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_ARPA_NAMESER_H 1 _ACEOF fi done - for ac_header in sys/socket.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_SOCKET_H 1 _ACEOF fi done - for ac_header in net/if.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_SOCKET_H +do : + ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "#if HAVE_SYS_SOCKET_H #include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_net_if_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NET_IF_H 1 _ACEOF fi done - for ac_header in net/if6.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "net/if6.h" "ac_cv_header_net_if6_h" "$ac_includes_default" +if test "x$ac_cv_header_net_if6_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NET_IF6_H 1 _ACEOF fi done - for ac_header in net/route.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - +do : + ac_fn_c_check_header_compile "$LINENO" "net/route.h" "ac_cv_header_net_route_h" " #include #include #include - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_net_route_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NET_ROUTE_H 1 _ACEOF fi done - - for ac_header in netinet/in_system.h netinet/in_systm.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done - for ac_header in netinet/in.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NETINET_IN_H 1 _ACEOF fi done - for ac_header in netinet/ip.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "netinet/ip.h" "ac_cv_header_netinet_ip_h" "#if HAVE_SYS_TYPES_H #include #endif #if HAVE_NETINET_IN_H @@ -35280,45 +17952,10 @@ cat >>conftest.$ac_ext <<_ACEOF #include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_netinet_ip_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NETINET_IP_H 1 _ACEOF fi @@ -35326,455 +17963,86 @@ fi done +# Check for IPTOS_PREC +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking IPPROTO_IP IP_TOS IPTOS_LOWDELAY" >&5 +$as_echo_n "checking IPPROTO_IP IP_TOS IPTOS_LOWDELAY... " >&6; } +if test "${ac_cv_ip_tos+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #if HAVE_SYS_TYPES_H + #include + #endif + #if HAVE_NETINET_IP_H + #include + #include + #endif + #if defined(IPPROTO_IP) && defined(IP_TOS) && defined(IPTOS_LOWDELAY) + yes + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + ac_cv_ip_tos=yes +else + ac_cv_ip_tos=no + +fi +rm -f conftest* + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ip_tos" >&5 +$as_echo "$ac_cv_ip_tos" >&6; } + +case "$ac_cv_ip_tos" in + yes) + +$as_echo "#define HAVE_IPTOS_SUPPORT 1" >>confdefs.h + +esac + for ac_header in netinfo/ni.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "netinfo/ni.h" "ac_cv_header_netinfo_ni_h" "$ac_includes_default" +if test "x$ac_cv_header_netinfo_ni_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_NETINFO_NI_H 1 _ACEOF -cat >>confdefs.h <<\_ACEOF -#define HAVE_NETINFO 1 -_ACEOF +$as_echo "#define HAVE_NETINFO 1" >>confdefs.h fi done - - for ac_header in sun/audioio.h sys/audioio.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done - - for ac_header in sys/clkdefs.h sys/file.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -35783,150 +18051,12 @@ done case "$host" in *-*-sunos4*) ;; - *) -for ac_header in sys/ioctl.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + *) for ac_header in sys/ioctl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_IOCTL_H 1 _ACEOF fi @@ -35935,304 +18065,26 @@ done ;; esac - for ac_header in sys/ipc.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/ipc.h" "ac_cv_header_sys_ipc_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ipc_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_IPC_H 1 _ACEOF fi done - - - - - for ac_header in sys/lock.h sys/mman.h sys/modem.h sys/param.h sys/ppsclock.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -36240,150 +18092,12 @@ fi done # HMS: Check sys/proc.h and sys/resource.h after some others - for ac_header in sys/ppstime.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/ppstime.h" "ac_cv_header_sys_ppstime_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ppstime_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_PPSTIME_H 1 _ACEOF fi @@ -36392,150 +18106,12 @@ done case "$ac_cv_header_sched_h" in yes) ;; - *) -for ac_header in sys/sched.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + *) for ac_header in sys/sched.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/sched.h" "ac_cv_header_sys_sched_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sched_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_SCHED_H 1 _ACEOF fi @@ -36545,150 +18121,12 @@ done esac case "$host" in *-*-sco*) - -for ac_header in sys/sio.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in sys/sio.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/sio.h" "ac_cv_header_sys_sio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sio_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_SIO_H 1 _ACEOF fi @@ -36698,152 +18136,14 @@ done ;; esac # HMS: Check sys/shm.h after some others - - - for ac_header in sys/select.h sys/signal.h sys/sockio.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -36853,151 +18153,14 @@ done # HMS: Checked sys/socket.h earlier case "$host" in *-*-netbsd*) ;; - *) - -for ac_header in machine/soundcard.h sys/soundcard.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + *) for ac_header in machine/soundcard.h sys/soundcard.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -37006,467 +18169,49 @@ done ;; esac - - for ac_header in sys/stat.h sys/stream.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done - - - - for ac_header in sys/stropts.h sys/sysctl.h sys/syssgi.h sys/systune.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done - - - for ac_header in sys/termios.h sys/time.h sys/signal.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if HAVE_SYS_TIME_H # include @@ -37481,68 +18226,20 @@ yes _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then - -for ac_header in sys/timepps.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TIME_H + $EGREP "yes" >/dev/null 2>&1; then : + for ac_header in sys/timepps.h +do : + ac_fn_c_check_header_compile "$LINENO" "sys/timepps.h" "ac_cv_header_sys_timepps_h" "#if HAVE_SYS_TIME_H # include #endif #if HAVE_ERRNO_H # include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_sys_timepps_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_TIMEPPS_H 1 _ACEOF fi @@ -37553,169 +18250,26 @@ done fi rm -f conftest* - - - - for ac_header in sys/timers.h sys/tpro.h sys/types.h sys/wait.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done -echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 -echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 -if test "${ac_cv_header_time+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if test "${ac_cv_header_time+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -37730,194 +18284,31 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_time=no + ac_cv_header_time=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 -echo "${ECHO_T}$ac_cv_header_time" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then -cat >>confdefs.h <<\_ACEOF -#define TIME_WITH_SYS_TIME 1 -_ACEOF +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi case "$host" in *-convex-*) - - -for ac_header in /sys/sync/queue.h /sys/sync/sema.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in /sys/sync/queue.h /sys/sync/sema.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -37926,152 +18317,14 @@ done ;; *-*-bsdi*) - - - -for ac_header in machine/inline.h sys/pcl720.h sys/i8253.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in machine/inline.h sys/pcl720.h sys/i8253.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -38082,105 +18335,15 @@ done esac case "$host" in - *-*-linux*) - - -for ac_func in __adjtimex __ntp_gettime -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *-*-*linux*) + for ac_func in __adjtimex __ntp_gettime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -38191,72 +18354,43 @@ esac case "$ac_cv_func___adjtimex" in yes) ;; *) - -echo "$as_me:$LINENO: checking for nlist in -lelf" >&5 -echo $ECHO_N "checking for nlist in -lelf... $ECHO_C" >&6 -if test "${ac_cv_lib_elf_nlist+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nlist in -lelf" >&5 +$as_echo_n "checking for nlist in -lelf... " >&6; } +if test "${ac_cv_lib_elf_nlist+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lelf $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char nlist (); int main () { -nlist (); +return nlist (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_elf_nlist=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_elf_nlist=no + ac_cv_lib_elf_nlist=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_elf_nlist" >&5 -echo "${ECHO_T}$ac_cv_lib_elf_nlist" >&6 -if test $ac_cv_lib_elf_nlist = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_elf_nlist" >&5 +$as_echo "$ac_cv_lib_elf_nlist" >&6; } +if test "x$ac_cv_lib_elf_nlist" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBELF 1 _ACEOF @@ -38264,66 +18398,37 @@ _ACEOF LIBS="-lelf $LIBS" fi - -echo "$as_me:$LINENO: checking for main in -lkvm" >&5 -echo $ECHO_N "checking for main in -lkvm... $ECHO_C" >&6 -if test "${ac_cv_lib_kvm_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lkvm" >&5 +$as_echo_n "checking for main in -lkvm... " >&6; } +if test "${ac_cv_lib_kvm_main+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lkvm $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { -main (); +return main (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_kvm_main=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_kvm_main=no + ac_cv_lib_kvm_main=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_kvm_main" >&5 -echo "${ECHO_T}$ac_cv_lib_kvm_main" >&6 -if test $ac_cv_lib_kvm_main = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kvm_main" >&5 +$as_echo "$ac_cv_lib_kvm_main" >&6; } +if test "x$ac_cv_lib_kvm_main" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBKVM 1 _ACEOF @@ -38331,72 +18436,43 @@ _ACEOF LIBS="-lkvm $LIBS" fi - -echo "$as_me:$LINENO: checking for nlist in -lld" >&5 -echo $ECHO_N "checking for nlist in -lld... $ECHO_C" >&6 -if test "${ac_cv_lib_ld_nlist+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nlist in -lld" >&5 +$as_echo_n "checking for nlist in -lld... " >&6; } +if test "${ac_cv_lib_ld_nlist+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char nlist (); int main () { -nlist (); +return nlist (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ld_nlist=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_ld_nlist=no + ac_cv_lib_ld_nlist=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_ld_nlist" >&5 -echo "${ECHO_T}$ac_cv_lib_ld_nlist" >&6 -if test $ac_cv_lib_ld_nlist = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ld_nlist" >&5 +$as_echo "$ac_cv_lib_ld_nlist" >&6; } +if test "x$ac_cv_lib_ld_nlist" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBLD 1 _ACEOF @@ -38405,72 +18481,43 @@ _ACEOF fi - -echo "$as_me:$LINENO: checking for nlist in -lmld" >&5 -echo $ECHO_N "checking for nlist in -lmld... $ECHO_C" >&6 -if test "${ac_cv_lib_mld_nlist+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nlist in -lmld" >&5 +$as_echo_n "checking for nlist in -lmld... " >&6; } +if test "${ac_cv_lib_mld_nlist+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char nlist (); int main () { -nlist (); +return nlist (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mld_nlist=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_mld_nlist=no + ac_cv_lib_mld_nlist=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_mld_nlist" >&5 -echo "${ECHO_T}$ac_cv_lib_mld_nlist" >&6 -if test $ac_cv_lib_mld_nlist = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mld_nlist" >&5 +$as_echo "$ac_cv_lib_mld_nlist" >&6; } +if test "x$ac_cv_lib_mld_nlist" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBMLD 1 _ACEOF @@ -38479,159 +18526,17 @@ _ACEOF fi - if test "${ac_cv_header_nlist_h+set}" = set; then - echo "$as_me:$LINENO: checking for nlist.h" >&5 -echo $ECHO_N "checking for nlist.h... $ECHO_C" >&6 -if test "${ac_cv_header_nlist_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: $ac_cv_header_nlist_h" >&5 -echo "${ECHO_T}$ac_cv_header_nlist_h" >&6 + ac_fn_c_check_header_mongrel "$LINENO" "nlist.h" "ac_cv_header_nlist_h" "$ac_includes_default" +if test "x$ac_cv_header_nlist_h" = x""yes; then : + +$as_echo "#define NLIST_STRUCT 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for n_un in struct nlist" >&5 +$as_echo_n "checking for n_un in struct nlist... " >&6; } +if test "${ac_cv_struct_nlist_n_un+set}" = set; then : + $as_echo_n "(cached) " >&6 else - # Is the header compilable? -echo "$as_me:$LINENO: checking nlist.h usability" >&5 -echo $ECHO_N "checking nlist.h usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking nlist.h presence" >&5 -echo $ECHO_N "checking nlist.h presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: nlist.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: nlist.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: nlist.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: nlist.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: nlist.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: nlist.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: nlist.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: nlist.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: nlist.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: nlist.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: nlist.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: nlist.h: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: nlist.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: nlist.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: nlist.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: nlist.h: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for nlist.h" >&5 -echo $ECHO_N "checking for nlist.h... $ECHO_C" >&6 -if test "${ac_cv_header_nlist_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_header_nlist_h=$ac_header_preproc -fi -echo "$as_me:$LINENO: result: $ac_cv_header_nlist_h" >&5 -echo "${ECHO_T}$ac_cv_header_nlist_h" >&6 - -fi -if test $ac_cv_header_nlist_h = yes; then - -cat >>confdefs.h <<\_ACEOF -#define NLIST_STRUCT 1 -_ACEOF - - echo "$as_me:$LINENO: checking for n_un in struct nlist" >&5 -echo $ECHO_N "checking for n_un in struct nlist... $ECHO_C" >&6 -if test "${ac_cv_struct_nlist_n_un+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -38642,44 +18547,18 @@ struct nlist n; n.n_un.n_name = 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_nlist_n_un=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_nlist_n_un=no + ac_cv_struct_nlist_n_un=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_nlist_n_un" >&5 -echo "${ECHO_T}$ac_cv_struct_nlist_n_un" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_nlist_n_un" >&5 +$as_echo "$ac_cv_struct_nlist_n_un" >&6; } if test $ac_cv_struct_nlist_n_un = yes; then -cat >>confdefs.h <<\_ACEOF -#define NLIST_NAME_UNION 1 -_ACEOF +$as_echo "#define NLIST_NAME_UNION 1" >>confdefs.h fi @@ -38689,67 +18568,19 @@ fi esac - for ac_header in sys/proc.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "sys/proc.h" "ac_cv_header_sys_proc_h" "#if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_TIME_H # include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_sys_proc_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_PROC_H 1 _ACEOF fi @@ -38757,64 +18588,16 @@ fi done - for ac_header in sys/resource.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TIME_H +do : + ac_fn_c_check_header_compile "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "#if HAVE_SYS_TIME_H # include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_sys_resource_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_RESOURCE_H 1 _ACEOF fi @@ -38822,67 +18605,19 @@ fi done - for ac_header in sys/shm.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "#if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_IPC_H # include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_sys_shm_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_SHM_H 1 _ACEOF fi @@ -38890,64 +18625,16 @@ fi done - for ac_header in sys/timex.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TIME_H +do : + ac_fn_c_check_header_compile "$LINENO" "sys/timex.h" "ac_cv_header_sys_timex_h" "#if HAVE_SYS_TIME_H # include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_sys_timex_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_SYS_TIMEX_H 1 _ACEOF fi @@ -38955,22 +18642,9 @@ fi done - for ac_header in resolv.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#if HAVE_SYS_TYPES_H +do : + ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "#if HAVE_SYS_TYPES_H #include #endif #if HAVE_NETINET_IN_H @@ -38980,45 +18654,10 @@ cat >>conftest.$ac_ext <<_ACEOF #include #endif - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +" +if test "x$ac_cv_header_resolv_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_RESOLV_H 1 _ACEOF fi @@ -39026,16 +18665,12 @@ fi done -echo "$as_me:$LINENO: checking for basic volatile support" >&5 -echo $ECHO_N "checking for basic volatile support... $ECHO_C" >&6 -if test "${ac_cv_c_volatile+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for basic volatile support" >&5 +$as_echo_n "checking for basic volatile support... " >&6; } +if test "${ac_cv_c_volatile+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -39047,75 +18682,48 @@ volatile int x; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_volatile=no + ac_cv_c_volatile=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 -echo "${ECHO_T}$ac_cv_c_volatile" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +$as_echo "$ac_cv_c_volatile" >&6; } case "$ac_cv_c_volatile" in yes) ;; *) -cat >>confdefs.h <<\_ACEOF -#define volatile -_ACEOF +$as_echo "#define volatile /**/" >>confdefs.h ;; esac +# +# following block goes away in 4.2.5 +# # AM_C_PROTOTYPES gives us ansi2knr case "$build" in *-*-solaris2*) # Assume that solaris2 is Ansi C... ;; *) - echo "$as_me:$LINENO: checking for function prototypes" >&5 -echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6 -if test "$ac_cv_prog_cc_stdc" != no; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function prototypes" >&5 +$as_echo_n "checking for function prototypes... " >&6; } +if test "$ac_cv_prog_cc_c89" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } -cat >>confdefs.h <<\_ACEOF -#define PROTOTYPES 1 -_ACEOF +$as_echo "#define PROTOTYPES 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define __PROTOTYPES 1 -_ACEOF +$as_echo "#define __PROTOTYPES 1" >>confdefs.h else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -39126,150 +18734,12 @@ else fi # Ensure some checks needed by ansi2knr itself. - for ac_header in string.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_STRING_H 1 _ACEOF fi @@ -39279,16 +18749,12 @@ done ;; esac -echo "$as_me:$LINENO: checking if C compiler permits function prototypes" >&5 -echo $ECHO_N "checking if C compiler permits function prototypes... $ECHO_C" >&6 -if test "${ac_cv_have_prototypes+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if C compiler permits function prototypes" >&5 +$as_echo_n "checking if C compiler permits function prototypes... " >&6; } +if test "${ac_cv_have_prototypes+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern int foo (short); @@ -39302,58 +18768,31 @@ int i; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_prototypes=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_have_prototypes=no + ac_cv_have_prototypes=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_have_prototypes" >&5 -echo "${ECHO_T}$ac_cv_have_prototypes" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_prototypes" >&5 +$as_echo "$ac_cv_have_prototypes" >&6; } if test "$ac_cv_have_prototypes" = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_PROTOTYPES 1 -_ACEOF +$as_echo "#define HAVE_PROTOTYPES 1" >>confdefs.h fi +# +# end block +# -echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 -echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 -if test "${ac_cv_c_const+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -39363,10 +18802,10 @@ main () #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; - const charset x; + const charset cs; /* SunOS 4.1.1 cc rejects this. */ - char const *const *ccp; - char **p; + char const *const *pcpcc; + char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; @@ -39375,16 +18814,17 @@ main () an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; - ccp = &g + (g ? g-g : 0); + pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ - ++ccp; - p = (char**) ccp; - ccp = (char const *const *) p; + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; + if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; @@ -39403,543 +18843,312 @@ main () } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; + if (!foo) return 0; } + return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_const=no + ac_cv_c_const=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 -echo "${ECHO_T}$ac_cv_c_const" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then -cat >>confdefs.h <<\_ACEOF -#define const -_ACEOF +$as_echo "#define const /**/" >>confdefs.h fi -echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 -echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6 -if test "${ac_cv_c_bigendian+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then : + $as_echo_n "(cached) " >&6 else - # See if sys/param.h defines the BYTE_ORDER macro. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + _ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include -#include + #include int main () { -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros -#endif +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include -#include + #include int main () { #if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif + not big endian + #endif ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_bigendian=no + ac_cv_c_bigendian=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -# It does not; compile a test program. -if test "$cross_compiling" = yes; then - # try to guess the endianness by grepping values into an object file - ac_cv_c_bigendian=unknown - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; -short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; -void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; } -short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; -short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; -void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; } +#include + int main () { - _ascii (); _ebcdic (); +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then - ac_cv_c_bigendian=yes -fi -if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi -fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include + int main () { - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long l; - char c[sizeof (long)]; - } u; - u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi -( exit $ac_status ) -ac_cv_c_bigendian=yes + fi fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 -echo "${ECHO_T}$ac_cv_c_bigendian" >&6 -case $ac_cv_c_bigendian in - yes) +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) -cat >>confdefs.h <<\_ACEOF -#define WORDS_BIGENDIAN 1 -_ACEOF - ;; - no) - ;; - *) - { { echo "$as_me:$LINENO: error: unknown endianness -presetting ac_cv_c_bigendian=no (or yes) will help" >&5 -echo "$as_me: error: unknown endianness -presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} - { (exit 1); exit 1; }; } ;; -esac +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h -echo "$as_me:$LINENO: checking return type of signal handlers" >&5 -echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 -if test "${ac_cv_type_signal+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + ;; #( + *) + as_fn_error "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 +$as_echo_n "checking return type of signal handlers... " >&6; } +if test "${ac_cv_type_signal+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#ifdef signal -# undef signal -#endif -#ifdef __cplusplus -extern "C" void (*signal (int, void (*)(int)))(int); -#else -void (*signal ()) (); -#endif int main () { -int i; +return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_signal=void +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_type_signal=int else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_signal=int + ac_cv_type_signal=void fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 -echo "${ECHO_T}$ac_cv_type_signal" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 +$as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF -echo "$as_me:$LINENO: checking for off_t" >&5 -echo $ECHO_N "checking for off_t... $ECHO_C" >&6 -if test "${ac_cv_type_off_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((off_t *) 0) - return 0; -if (sizeof (off_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_off_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" +if test "x$ac_cv_type_off_t" = x""yes; then : -ac_cv_type_off_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 -echo "${ECHO_T}$ac_cv_type_off_t" >&6 -if test $ac_cv_type_off_t = yes; then - : else cat >>confdefs.h <<_ACEOF -#define off_t long +#define off_t long int _ACEOF fi -echo "$as_me:$LINENO: checking for size_t" >&5 -echo $ECHO_N "checking for size_t... $ECHO_C" >&6 -if test "${ac_cv_type_size_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((size_t *) 0) - return 0; -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_size_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = x""yes; then : -ac_cv_type_size_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -echo "${ECHO_T}$ac_cv_type_size_t" >&6 -if test $ac_cv_type_size_t = yes; then - : else cat >>confdefs.h <<_ACEOF -#define size_t unsigned +#define size_t unsigned int _ACEOF fi -echo "$as_me:$LINENO: checking for time_t" >&5 -echo $ECHO_N "checking for time_t... $ECHO_C" >&6 -if test "${ac_cv_type_time_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((time_t *) 0) - return 0; -if (sizeof (time_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_time_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +ac_fn_c_check_type "$LINENO" "time_t" "ac_cv_type_time_t" "$ac_includes_default" +if test "x$ac_cv_type_time_t" = x""yes; then : -ac_cv_type_time_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_time_t" >&5 -echo "${ECHO_T}$ac_cv_type_time_t" >&6 -if test $ac_cv_type_time_t = yes; then - : else cat >>confdefs.h <<_ACEOF @@ -39948,477 +19157,42 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for time_t" >&5 -echo $ECHO_N "checking for time_t... $ECHO_C" >&6 -if test "${ac_cv_type_time_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 +$as_echo_n "checking size of time_t... " >&6; } +if test "${ac_cv_sizeof_time_t+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((time_t *) 0) - return 0; -if (sizeof (time_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_time_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "$ac_includes_default"; then : -ac_cv_type_time_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_time_t" >&5 -echo "${ECHO_T}$ac_cv_type_time_t" >&6 - -echo "$as_me:$LINENO: checking size of time_t" >&5 -echo $ECHO_N "checking size of time_t... $ECHO_C" >&6 -if test "${ac_cv_sizeof_time_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_time_t" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (time_t))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (time_t))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (time_t) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_time_t=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (time_t))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (time_t))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5 +$as_echo "$ac_cv_sizeof_time_t" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (time_t))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_time_t=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (time_t), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (time_t), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (time_t)); } -unsigned long ulongval () { return (long) (sizeof (time_t)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (time_t))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (time_t)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (time_t)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_time_t=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (time_t), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (time_t), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_time_t=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_time_t" >&5 -echo "${ECHO_T}$ac_cv_sizeof_time_t" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_TIME_T $ac_cv_sizeof_time_t _ACEOF -echo "$as_me:$LINENO: checking for uintptr_t" >&5 -echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_uintptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uintptr_t *) 0) - return 0; -if (sizeof (uintptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uintptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uintptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6 -if test $ac_cv_type_uintptr_t = yes; then +ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTPTR_T 1 @@ -40430,17 +19204,12 @@ fi - -echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 -echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6 -if test "${ac_cv_struct_tm+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 +$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } +if test "${ac_cv_struct_tm+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -40448,63 +19217,35 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -struct tm *tp; tp->tm_sec; +struct tm tm; + int *p = &tm.tm_sec; + return !p; ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_tm=sys/time.h + ac_cv_struct_tm=sys/time.h fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 -echo "${ECHO_T}$ac_cv_struct_tm" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 +$as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then -cat >>confdefs.h <<\_ACEOF -#define TM_IN_SYS_TIME 1 -_ACEOF +$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for u_int8_t" >&5 -echo $ECHO_N "checking for u_int8_t... $ECHO_C" >&6 -if test "${ac_cv_type_u_int8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for u_int8_t" >&5 +$as_echo_n "checking for u_int8_t... " >&6; } +if test "${ac_cv_type_u_int8_t+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -40515,58 +19256,28 @@ u_int8_t len = 42; return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_u_int8_t=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_u_int8_t=no + ac_cv_type_u_int8_t=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_type_u_int8_t" >&5 -echo "${ECHO_T}$ac_cv_type_u_int8_t" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_u_int8_t" >&5 +$as_echo "$ac_cv_type_u_int8_t" >&6; } if test $ac_cv_type_u_int8_t = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_TYPE_U_INT8_T 1 -_ACEOF +$as_echo "#define HAVE_TYPE_U_INT8_T 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for u_int64_t" >&5 -echo $ECHO_N "checking for u_int64_t... $ECHO_C" >&6 -if test "${ac_cv_type_u_int64_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for u_int64_t" >&5 +$as_echo_n "checking for u_int64_t... " >&6; } +if test "${ac_cv_type_u_int64_t+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -40577,58 +19288,28 @@ u_int64_t len = 42; return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_u_int64_t=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_u_int64_t=no + ac_cv_type_u_int64_t=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_type_u_int64_t" >&5 -echo "${ECHO_T}$ac_cv_type_u_int64_t" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_u_int64_t" >&5 +$as_echo "$ac_cv_type_u_int64_t" >&6; } if test $ac_cv_type_u_int64_t = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_TYPE_U_INT64_T 1 -_ACEOF +$as_echo "#define HAVE_TYPE_U_INT64_T 1" >>confdefs.h fi # # Look for in_port_t. # -echo "$as_me:$LINENO: checking for in_port_t" >&5 -echo $ECHO_N "checking for in_port_t... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for in_port_t" >&5 +$as_echo_n "checking for in_port_t... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -40641,50 +19322,24 @@ in_port_t port = 25; return (0); return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_NEEDPORTT 1 -_ACEOF +$as_echo "#define ISC_PLATFORM_NEEDPORTT 1" >>confdefs.h fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: checking for a fallback value for HZ" >&5 -echo $ECHO_N "checking for a fallback value for HZ... $ECHO_C" >&6 -if test "${ac_cv_var_default_hz+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a fallback value for HZ" >&5 +$as_echo_n "checking for a fallback value for HZ... " >&6; } +if test "${ac_cv_var_default_hz+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_var_default_hz=100 case "$host" in @@ -40696,18 +19351,18 @@ case "$host" in ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_var_default_hz" >&5 -echo "${ECHO_T}$ac_cv_var_default_hz" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_default_hz" >&5 +$as_echo "$ac_cv_var_default_hz" >&6; } cat >>confdefs.h <<_ACEOF #define DEFAULT_HZ $ac_cv_var_default_hz _ACEOF -echo "$as_me:$LINENO: checking if we need to override the system's value for HZ" >&5 -echo $ECHO_N "checking if we need to override the system's value for HZ... $ECHO_C" >&6 -if test "${ac_cv_var_override_hz+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need to override the system's value for HZ" >&5 +$as_echo_n "checking if we need to override the system's value for HZ... " >&6; } +if test "${ac_cv_var_override_hz+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_var_override_hz=no case "$host" in @@ -40725,30 +19380,24 @@ case "$host" in ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_var_override_hz" >&5 -echo "${ECHO_T}$ac_cv_var_override_hz" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_override_hz" >&5 +$as_echo "$ac_cv_var_override_hz" >&6; } case "$ac_cv_var_override_hz" in yes) -cat >>confdefs.h <<\_ACEOF -#define OVERRIDE_HZ 1 -_ACEOF +$as_echo "#define OVERRIDE_HZ 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for struct rt_msghdr" >&5 -echo $ECHO_N "checking for struct rt_msghdr... $ECHO_C" >&6 -if test "${ac_cv_struct_rt_msghdr+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct rt_msghdr" >&5 +$as_echo_n "checking for struct rt_msghdr... " >&6; } +if test "${ac_cv_struct_rt_msghdr+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -40763,59 +19412,30 @@ struct rt_msghdr p; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_rt_msghdr=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_rt_msghdr=no + ac_cv_struct_rt_msghdr=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_rt_msghdr" >&5 -echo "${ECHO_T}$ac_cv_struct_rt_msghdr" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_rt_msghdr" >&5 +$as_echo "$ac_cv_struct_rt_msghdr" >&6; } + if test $ac_cv_struct_rt_msghdr = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAS_ROUTING_SOCKET 1 -_ACEOF +$as_echo "#define HAS_ROUTING_SOCKET 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking struct sigaction for sa_sigaction" >&5 -echo $ECHO_N "checking struct sigaction for sa_sigaction... $ECHO_C" >&6 -if test "${ac_cv_struct_sigaction_has_sa_sigaction+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking struct sigaction for sa_sigaction" >&5 +$as_echo_n "checking struct sigaction for sa_sigaction... " >&6; } +if test "${ac_cv_struct_sigaction_has_sa_sigaction+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -40826,60 +19446,30 @@ struct sigaction act; act.sa_sigaction = 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_sigaction_has_sa_sigaction=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_sigaction_has_sa_sigaction=no + ac_cv_struct_sigaction_has_sa_sigaction=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_sigaction_has_sa_sigaction" >&5 -echo "${ECHO_T}$ac_cv_struct_sigaction_has_sa_sigaction" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_sigaction_has_sa_sigaction" >&5 +$as_echo "$ac_cv_struct_sigaction_has_sa_sigaction" >&6; } if test $ac_cv_struct_sigaction_has_sa_sigaction = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_SA_SIGACTION_IN_STRUCT_SIGACTION 1 -_ACEOF +$as_echo "#define HAVE_SA_SIGACTION_IN_STRUCT_SIGACTION 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for struct ppsclockev" >&5 -echo $ECHO_N "checking for struct ppsclockev... $ECHO_C" >&6 -if test "${ac_cv_struct_ppsclockev+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct ppsclockev" >&5 +$as_echo_n "checking for struct ppsclockev... " >&6; } +if test "${ac_cv_struct_ppsclockev+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -40902,58 +19492,28 @@ return pce->serial; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_ppsclockev=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_ppsclockev=no + ac_cv_struct_ppsclockev=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_ppsclockev" >&5 -echo "${ECHO_T}$ac_cv_struct_ppsclockev" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_ppsclockev" >&5 +$as_echo "$ac_cv_struct_ppsclockev" >&6; } if test $ac_cv_struct_ppsclockev = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRUCT_PPSCLOCKEV 1 -_ACEOF +$as_echo "#define HAVE_STRUCT_PPSCLOCKEV 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking struct sockaddr for sa_len" >&5 -echo $ECHO_N "checking struct sockaddr for sa_len... $ECHO_C" >&6 -if test "${ac_cv_struct_sockaddr_has_sa_len+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking struct sockaddr for sa_len" >&5 +$as_echo_n "checking struct sockaddr for sa_len... " >&6; } +if test "${ac_cv_struct_sockaddr_has_sa_len+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -40968,58 +19528,28 @@ return ps->sa_len; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_sockaddr_has_sa_len=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_sockaddr_has_sa_len=no + ac_cv_struct_sockaddr_has_sa_len=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_sockaddr_has_sa_len" >&5 -echo "${ECHO_T}$ac_cv_struct_sockaddr_has_sa_len" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_sockaddr_has_sa_len" >&5 +$as_echo "$ac_cv_struct_sockaddr_has_sa_len" >&6; } if test $ac_cv_struct_sockaddr_has_sa_len = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_SA_LEN_IN_STRUCT_SOCKADDR 1 -_ACEOF +$as_echo "#define HAVE_SA_LEN_IN_STRUCT_SOCKADDR 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for struct sockaddr_storage" >&5 -echo $ECHO_N "checking for struct sockaddr_storage... $ECHO_C" >&6 -if test "${ac_cv_struct_sockaddr_storage+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr_storage" >&5 +$as_echo_n "checking for struct sockaddr_storage... " >&6; } +if test "${ac_cv_struct_sockaddr_storage+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41035,59 +19565,29 @@ struct sockaddr_storage n; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_sockaddr_storage=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_sockaddr_storage=no + ac_cv_struct_sockaddr_storage=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_sockaddr_storage" >&5 -echo "${ECHO_T}$ac_cv_struct_sockaddr_storage" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_sockaddr_storage" >&5 +$as_echo "$ac_cv_struct_sockaddr_storage" >&6; } if test $ac_cv_struct_sockaddr_storage = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 -_ACEOF +$as_echo "#define HAVE_STRUCT_SOCKADDR_STORAGE 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for ss_family field in struct sockaddr_storage" >&5 -echo $ECHO_N "checking for ss_family field in struct sockaddr_storage... $ECHO_C" >&6 -if test "${ac_cv_have_ss_family_in_struct_ss+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ss_family field in struct sockaddr_storage" >&5 +$as_echo_n "checking for ss_family field in struct sockaddr_storage... " >&6; } +if test "${ac_cv_have_ss_family_in_struct_ss+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41101,45 +19601,19 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_ss_family_in_struct_ss="yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_ss_family_in_struct_ss="no" + ac_cv_have_ss_family_in_struct_ss="no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_have_ss_family_in_struct_ss" >&5 -echo "${ECHO_T}$ac_cv_have_ss_family_in_struct_ss" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_ss_family_in_struct_ss" >&5 +$as_echo "$ac_cv_have_ss_family_in_struct_ss" >&6; } if test "x$ac_cv_have_ss_family_in_struct_ss" = "xyes" ; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_SS_FAMILY_IN_SS 1 -_ACEOF +$as_echo "#define HAVE_SS_FAMILY_IN_SS 1" >>confdefs.h else # Hack around a problem... @@ -41152,17 +19626,13 @@ else esac fi -echo "$as_me:$LINENO: checking for __ss_family field in struct sockaddr_storage" >&5 -echo $ECHO_N "checking for __ss_family field in struct sockaddr_storage... $ECHO_C" >&6 -if test "${ac_cv_have___ss_family_in_struct_ss+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __ss_family field in struct sockaddr_storage" >&5 +$as_echo_n "checking for __ss_family field in struct sockaddr_storage... " >&6; } +if test "${ac_cv_have___ss_family_in_struct_ss+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41176,63 +19646,32 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have___ss_family_in_struct_ss="yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have___ss_family_in_struct_ss="no" + ac_cv_have___ss_family_in_struct_ss="no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_have___ss_family_in_struct_ss" >&5 -echo "${ECHO_T}$ac_cv_have___ss_family_in_struct_ss" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have___ss_family_in_struct_ss" >&5 +$as_echo "$ac_cv_have___ss_family_in_struct_ss" >&6; } if test "x$ac_cv_have___ss_family_in_struct_ss" = "xyes" ; then -cat >>confdefs.h <<\_ACEOF -#define HAVE___SS_FAMILY_IN_SS 1 -_ACEOF +$as_echo "#define HAVE___SS_FAMILY_IN_SS 1" >>confdefs.h fi - -echo "$as_me:$LINENO: checking for ss_len field in struct sockaddr_storage" >&5 -echo $ECHO_N "checking for ss_len field in struct sockaddr_storage... $ECHO_C" >&6 -if test "${ac_cv_have_ss_len_in_struct_ss+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ss_len field in struct sockaddr_storage" >&5 +$as_echo_n "checking for ss_len field in struct sockaddr_storage... " >&6; } +if test "${ac_cv_have_ss_len_in_struct_ss+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41246,59 +19685,29 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_ss_len_in_struct_ss="yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_ss_len_in_struct_ss="no" + ac_cv_have_ss_len_in_struct_ss="no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_have_ss_len_in_struct_ss" >&5 -echo "${ECHO_T}$ac_cv_have_ss_len_in_struct_ss" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_ss_len_in_struct_ss" >&5 +$as_echo "$ac_cv_have_ss_len_in_struct_ss" >&6; } if test "x$ac_cv_have_ss_len_in_struct_ss" = "xyes" ; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_SS_LEN_IN_SS 1 -_ACEOF +$as_echo "#define HAVE_SS_LEN_IN_SS 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for __ss_len field in struct sockaddr_storage" >&5 -echo $ECHO_N "checking for __ss_len field in struct sockaddr_storage... $ECHO_C" >&6 -if test "${ac_cv_have___ss_len_in_struct_ss+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __ss_len field in struct sockaddr_storage" >&5 +$as_echo_n "checking for __ss_len field in struct sockaddr_storage... " >&6; } +if test "${ac_cv_have___ss_len_in_struct_ss+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41312,64 +19721,33 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have___ss_len_in_struct_ss="yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have___ss_len_in_struct_ss="no" + ac_cv_have___ss_len_in_struct_ss="no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_have___ss_len_in_struct_ss" >&5 -echo "${ECHO_T}$ac_cv_have___ss_len_in_struct_ss" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have___ss_len_in_struct_ss" >&5 +$as_echo "$ac_cv_have___ss_len_in_struct_ss" >&6; } if test "x$ac_cv_have___ss_len_in_struct_ss" = "xyes" ; then -cat >>confdefs.h <<\_ACEOF -#define HAVE___SS_LEN_IN_SS 1 -_ACEOF +$as_echo "#define HAVE___SS_LEN_IN_SS 1" >>confdefs.h fi - case "$ac_cv_header_machine_soundcard_h$ac_cv_header_sys_soundcard_h" in *yes*) - echo "$as_me:$LINENO: checking for struct snd_size" >&5 -echo $ECHO_N "checking for struct snd_size... $ECHO_C" >&6 -if test "${ac_cv_struct_snd_size+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct snd_size" >&5 +$as_echo_n "checking for struct snd_size... " >&6; } +if test "${ac_cv_struct_snd_size+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_MACHINE_SOUNDCARD_H @@ -41388,60 +19766,30 @@ return ss->rec_size; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_snd_size=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_snd_size=no + ac_cv_struct_snd_size=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_snd_size" >&5 -echo "${ECHO_T}$ac_cv_struct_snd_size" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_snd_size" >&5 +$as_echo "$ac_cv_struct_snd_size" >&6; } case "$ac_cv_struct_snd_size" in yes) -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRUCT_SND_SIZE 1 -_ACEOF +$as_echo "#define HAVE_STRUCT_SND_SIZE 1" >>confdefs.h ;; esac ;; esac -echo "$as_me:$LINENO: checking struct clockinfo for hz" >&5 -echo $ECHO_N "checking struct clockinfo for hz... $ECHO_C" >&6 -if test "${ac_cv_struct_clockinfo_has_hz+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking struct clockinfo for hz" >&5 +$as_echo_n "checking struct clockinfo for hz... " >&6; } +if test "${ac_cv_struct_clockinfo_has_hz+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41455,58 +19803,28 @@ return pc->hz; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_clockinfo_has_hz=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_clockinfo_has_hz=no + ac_cv_struct_clockinfo_has_hz=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_clockinfo_has_hz" >&5 -echo "${ECHO_T}$ac_cv_struct_clockinfo_has_hz" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_clockinfo_has_hz" >&5 +$as_echo "$ac_cv_struct_clockinfo_has_hz" >&6; } if test $ac_cv_struct_clockinfo_has_hz = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_HZ_IN_STRUCT_CLOCKINFO 1 -_ACEOF +$as_echo "#define HAVE_HZ_IN_STRUCT_CLOCKINFO 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking struct clockinfo for tickadj" >&5 -echo $ECHO_N "checking struct clockinfo for tickadj... $ECHO_C" >&6 -if test "${ac_cv_struct_clockinfo_has_tickadj+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking struct clockinfo for tickadj" >&5 +$as_echo_n "checking struct clockinfo for tickadj... " >&6; } +if test "${ac_cv_struct_clockinfo_has_tickadj+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41520,58 +19838,28 @@ return pc->tickadj; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_clockinfo_has_tickadj=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_clockinfo_has_tickadj=no + ac_cv_struct_clockinfo_has_tickadj=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_clockinfo_has_tickadj" >&5 -echo "${ECHO_T}$ac_cv_struct_clockinfo_has_tickadj" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_clockinfo_has_tickadj" >&5 +$as_echo "$ac_cv_struct_clockinfo_has_tickadj" >&6; } if test $ac_cv_struct_clockinfo_has_tickadj = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_TICKADJ_IN_STRUCT_CLOCKINFO 1 -_ACEOF +$as_echo "#define HAVE_TICKADJ_IN_STRUCT_CLOCKINFO 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for struct timespec" >&5 -echo $ECHO_N "checking for struct timespec... $ECHO_C" >&6 -if test "${ac_cv_struct_timespec+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct timespec" >&5 +$as_echo_n "checking for struct timespec... " >&6; } +if test "${ac_cv_struct_timespec+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41591,57 +19879,27 @@ struct timespec n; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_timespec=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_timespec=no + ac_cv_struct_timespec=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_timespec" >&5 -echo "${ECHO_T}$ac_cv_struct_timespec" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_timespec" >&5 +$as_echo "$ac_cv_struct_timespec" >&6; } if test $ac_cv_struct_timespec = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRUCT_TIMESPEC 1 -_ACEOF +$as_echo "#define HAVE_STRUCT_TIMESPEC 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for struct ntptimeval" >&5 -echo $ECHO_N "checking for struct ntptimeval... $ECHO_C" >&6 -if test "${ac_cv_struct_ntptimeval+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct ntptimeval" >&5 +$as_echo_n "checking for struct ntptimeval... " >&6; } +if test "${ac_cv_struct_ntptimeval+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -41654,59 +19912,22 @@ struct ntptimeval n; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_ntptimeval=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_ntptimeval=no + ac_cv_struct_ntptimeval=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_ntptimeval" >&5 -echo "${ECHO_T}$ac_cv_struct_ntptimeval" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_ntptimeval" >&5 +$as_echo "$ac_cv_struct_ntptimeval" >&6; } if test $ac_cv_struct_ntptimeval = yes; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRUCT_NTPTIMEVAL 1 -_ACEOF +$as_echo "#define HAVE_STRUCT_NTPTIMEVAL 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for struct ntptimeval.time.tv_nsec" >&5 -echo $ECHO_N "checking for struct ntptimeval.time.tv_nsec... $ECHO_C" >&6 -if test "${ac_cv_member_struct_ntptimeval_time_tv_nsec+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef HAVE_SYS_TIME_H +ac_fn_c_check_member "$LINENO" "struct ntptimeval" "time.tv_nsec" "ac_cv_member_struct_ntptimeval_time_tv_nsec" "#ifdef HAVE_SYS_TIME_H #include #else # ifdef HAVE_TIME_H @@ -41720,111 +19941,8 @@ cat >>conftest.$ac_ext <<_ACEOF # include # endif #endif - -int -main () -{ -static struct ntptimeval ac_aggr; -if (ac_aggr.time.tv_nsec) -return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_member_struct_ntptimeval_time_tv_nsec=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef HAVE_SYS_TIME_H -#include -#else -# ifdef HAVE_TIME_H -# include -# endif -#endif -#ifdef HAVE_SYS_TIMEX_H -#include -#else -# ifdef HAVE_TIMEX_H -# include -# endif -#endif - -int -main () -{ -static struct ntptimeval ac_aggr; -if (sizeof ac_aggr.time.tv_nsec) -return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_member_struct_ntptimeval_time_tv_nsec=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_member_struct_ntptimeval_time_tv_nsec=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_member_struct_ntptimeval_time_tv_nsec" >&5 -echo "${ECHO_T}$ac_cv_member_struct_ntptimeval_time_tv_nsec" >&6 -if test $ac_cv_member_struct_ntptimeval_time_tv_nsec = yes; then +" +if test "x$ac_cv_member_struct_ntptimeval_time_tv_nsec" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_NTPTIMEVAL_TIME_TV_NSEC 1 @@ -41834,18 +19952,14 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for inline" >&5 -echo $ECHO_N "checking for inline... $ECHO_C" >&6 -if test "${ac_cv_c_inline+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; @@ -41854,41 +19968,16 @@ $ac_kw foo_t foo () {return 0; } #endif _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_c_inline=$ac_kw; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break done fi -echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 -echo "${ECHO_T}$ac_cv_c_inline" >&6 - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; @@ -41906,16 +19995,22 @@ _ACEOF esac -echo "$as_me:$LINENO: checking whether char is unsigned" >&5 -echo $ECHO_N "checking whether char is unsigned... $ECHO_C" >&6 -if test "${ac_cv_c_char_unsigned+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +case "$ac_cv_c_inline" in + '') + ;; + *) + +$as_echo "#define HAVE_INLINE 1" >>confdefs.h + + +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 +$as_echo_n "checking whether char is unsigned... " >&6; } +if test "${ac_cv_c_char_unsigned+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int @@ -41928,1345 +20023,124 @@ test_array [0] = 0 return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_char_unsigned=no else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_char_unsigned=yes + ac_cv_c_char_unsigned=yes fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_c_char_unsigned" >&5 -echo "${ECHO_T}$ac_cv_c_char_unsigned" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5 +$as_echo "$ac_cv_c_char_unsigned" >&6; } if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then - cat >>confdefs.h <<\_ACEOF -#define __CHAR_UNSIGNED__ 1 -_ACEOF + $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h fi - echo "$as_me:$LINENO: checking for signed char" >&5 -echo $ECHO_N "checking for signed char... $ECHO_C" >&6 -if test "${ac_cv_type_signed_char+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of signed char" >&5 +$as_echo_n "checking size of signed char... " >&6; } +if test "${ac_cv_sizeof_signed_char+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((signed char *) 0) - return 0; -if (sizeof (signed char)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_signed_char=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (signed char))" "ac_cv_sizeof_signed_char" "$ac_includes_default"; then : -ac_cv_type_signed_char=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_signed_char" >&5 -echo "${ECHO_T}$ac_cv_type_signed_char" >&6 - -echo "$as_me:$LINENO: checking size of signed char" >&5 -echo $ECHO_N "checking size of signed char... $ECHO_C" >&6 -if test "${ac_cv_sizeof_signed_char+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_signed_char" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (signed char))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (signed char))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (signed char) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_signed_char=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (signed char))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (signed char))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_signed_char" >&5 +$as_echo "$ac_cv_sizeof_signed_char" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (signed char))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_signed_char=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (signed char), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (signed char), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (signed char)); } -unsigned long ulongval () { return (long) (sizeof (signed char)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (signed char))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (signed char)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (signed char)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_signed_char=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (signed char), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (signed char), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_signed_char=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_signed_char" >&5 -echo "${ECHO_T}$ac_cv_sizeof_signed_char" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_SIGNED_CHAR $ac_cv_sizeof_signed_char _ACEOF -echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6 -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int *) 0) - return 0; -if (sizeof (int)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : -ac_cv_type_int=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6 - -echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6 -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_int" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (int)); } -unsigned long ulongval () { return (long) (sizeof (int)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (int))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_int=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF -echo "$as_me:$LINENO: checking for long" >&5 -echo $ECHO_N "checking for long... $ECHO_C" >&6 -if test "${ac_cv_type_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((long *) 0) - return 0; -if (sizeof (long)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_long=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : -ac_cv_type_long=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 -echo "${ECHO_T}$ac_cv_type_long" >&6 - -echo "$as_me:$LINENO: checking size of long" >&5 -echo $ECHO_N "checking size of long... $ECHO_C" >&6 -if test "${ac_cv_sizeof_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (long)); } -unsigned long ulongval () { return (long) (sizeof (long)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (long))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_long=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF -echo "$as_me:$LINENO: checking for s_char" >&5 -echo $ECHO_N "checking for s_char... $ECHO_C" >&6 -if test "${ac_cv_type_s_char+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((s_char *) 0) - return 0; -if (sizeof (s_char)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_s_char=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_s_char=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_s_char" >&5 -echo "${ECHO_T}$ac_cv_type_s_char" >&6 -if test $ac_cv_type_s_char = yes; then +ac_fn_c_check_type "$LINENO" "s_char" "ac_cv_type_s_char" "$ac_includes_default" +if test "x$ac_cv_type_s_char" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_S_CHAR 1 @@ -43282,48 +20156,36 @@ case "$ac_cv_c_char_unsigned$ac_cv_sizeof_signed_char$ac_cv_type_s_char" in no0no) # We have signed chars, can't say 'signed char', no s_char typedef. -cat >>confdefs.h <<\_ACEOF -#define NEED_S_CHAR_TYPEDEF 1 -_ACEOF +$as_echo "#define NEED_S_CHAR_TYPEDEF 1" >>confdefs.h ;; no1no) # We have signed chars, can say 'signed char', no s_char typedef. - cat >>confdefs.h <<\_ACEOF -#define NEED_S_CHAR_TYPEDEF 1 -_ACEOF + $as_echo "#define NEED_S_CHAR_TYPEDEF 1" >>confdefs.h ;; yes0no) # We have unsigned chars, can't say 'signed char', no s_char typedef. - { { echo "$as_me:$LINENO: error: No way to specify a signed character!" >&5 -echo "$as_me: error: No way to specify a signed character!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "No way to specify a signed character!" "$LINENO" 5 ;; yes1no) # We have unsigned chars, can say 'signed char', no s_char typedef. - cat >>confdefs.h <<\_ACEOF -#define NEED_S_CHAR_TYPEDEF 1 -_ACEOF + $as_echo "#define NEED_S_CHAR_TYPEDEF 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 -echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6 -if test "${ac_cv_type_uid_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 +$as_echo_n "checking for uid_t in sys/types.h... " >&6; } +if test "${ac_cv_type_uid_t+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "uid_t" >/dev/null 2>&1; then + $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no @@ -43331,128 +20193,34 @@ fi rm -f conftest* fi -echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 -echo "${ECHO_T}$ac_cv_type_uid_t" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 +$as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then -cat >>confdefs.h <<\_ACEOF -#define uid_t int -_ACEOF +$as_echo "#define uid_t int" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define gid_t int -_ACEOF +$as_echo "#define gid_t int" >>confdefs.h fi case "$host" in - *-*-aix[45]*) + *-*-aix[456]*) # (prr) aix 4.1 doesn't have clock_settime, but in aix 4.3 it's a stub # (returning ENOSYS). I didn't check 4.2. If, in the future, # IBM pulls its thumbs out long enough to implement clock_settime, # this conditional will need to change. Maybe use AC_TRY_RUN # instead to try to set the time to itself and check errno. ;; - *) - -for ac_func in clock_gettime clock_settime -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in clock_gettime clock_settime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -43460,317 +20228,40 @@ done ;; esac - for ac_func in daemon -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "daemon" "ac_cv_func_daemon" +if test "x$ac_cv_func_daemon" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_DAEMON 1 _ACEOF fi done - for ac_func in finite -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite" +if test "x$ac_cv_func_finite" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_FINITE 1 _ACEOF else - -for ac_func in isfinite -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in isfinite +do : + ac_fn_c_check_func "$LINENO" "isfinite" "ac_cv_func_isfinite" +if test "x$ac_cv_func_isfinite" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_ISFINITE 1 _ACEOF else - echo "$as_me:$LINENO: checking for isfinite with " >&5 -echo $ECHO_N "checking for isfinite with ... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isfinite with " >&5 +$as_echo_n "checking for isfinite with ... " >&6; } _libs=$LIBS LIBS="$LIBS -lm" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -43781,43 +20272,17 @@ float f = 0.0; isfinite(f) return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - cat >>confdefs.h <<\_ACEOF -#define HAVE_ISFINITE 1 -_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_ISFINITE 1" >>confdefs.h else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$_libs fi done @@ -43825,118 +20290,27 @@ done fi done - - - for ac_func in getbootfile getclock getdtablesize -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done -# Check whether --enable-getifaddrs or --disable-getifaddrs was given. -if test "${enable_getifaddrs+set}" = set; then - enableval="$enable_getifaddrs" - want_getifaddrs="$enableval" +# Check whether --enable-getifaddrs was given. +if test "${enable_getifaddrs+set}" = set; then : + enableval=$enable_getifaddrs; want_getifaddrs="$enableval" else want_getifaddrs="yes" -fi; +fi + case $want_getifaddrs in yes|glibc) @@ -43944,7 +20318,7 @@ yes|glibc) # Do we have getifaddrs() ? # case $host in -*-linux*) +*-*linux*) # Some recent versions of glibc support getifaddrs() which does not # provide AF_INET6 addresses while the function provided by the USAGI # project handles the AF_INET6 case correctly. We need to avoid @@ -43952,103 +20326,12 @@ case $host in # --enable-getifaddrs=glibc. if test $want_getifaddrs = glibc then - -for ac_func in getifaddrs -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in getifaddrs +do : + ac_fn_c_check_func "$LINENO" "getifaddrs" "ac_cv_func_getifaddrs" +if test "x$ac_cv_func_getifaddrs" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_GETIFADDRS 1 _ACEOF fi @@ -44057,75 +20340,45 @@ done else save_LIBS="$LIBS" LIBS="-L/usr/local/v6/lib $LIBS" - echo "$as_me:$LINENO: checking for getifaddrs in -linet6" >&5 -echo $ECHO_N "checking for getifaddrs in -linet6... $ECHO_C" >&6 -if test "${ac_cv_lib_inet6_getifaddrs+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getifaddrs in -linet6" >&5 +$as_echo_n "checking for getifaddrs in -linet6... " >&6; } +if test "${ac_cv_lib_inet6_getifaddrs+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet6 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char getifaddrs (); int main () { -getifaddrs (); +return getifaddrs (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet6_getifaddrs=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_inet6_getifaddrs=no + ac_cv_lib_inet6_getifaddrs=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_inet6_getifaddrs" >&5 -echo "${ECHO_T}$ac_cv_lib_inet6_getifaddrs" >&6 -if test $ac_cv_lib_inet6_getifaddrs = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet6_getifaddrs" >&5 +$as_echo "$ac_cv_lib_inet6_getifaddrs" >&6; } +if test "x$ac_cv_lib_inet6_getifaddrs" = x""yes; then : LIBS="$LIBS -linet6" - cat >>confdefs.h <<\_ACEOF -#define HAVE_GETIFADDRS 1 -_ACEOF + $as_echo "#define HAVE_GETIFADDRS 1" >>confdefs.h else LIBS=${save_LIBS} @@ -44134,103 +20387,12 @@ fi fi ;; *) - -for ac_func in getifaddrs -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in getifaddrs +do : + ac_fn_c_check_func "$LINENO" "getifaddrs" "ac_cv_func_getifaddrs" +if test "x$ac_cv_func_getifaddrs" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_GETIFADDRS 1 _ACEOF fi @@ -44243,21 +20405,17 @@ no) ;; esac -echo "$as_me:$LINENO: checking type of socklen arg for getsockname()" >&5 -echo $ECHO_N "checking type of socklen arg for getsockname()... $ECHO_C" >&6 -if test "${ac_cv_func_getsockname_arg2+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking type of socklen arg for getsockname()" >&5 +$as_echo_n "checking type of socklen arg for getsockname()... " >&6; } +if test "${ac_cv_func_getsockname_arg2+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "${ac_cv_func_getsockname_socklen_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + if test "${ac_cv_func_getsockname_socklen_type+set}" = set; then : + $as_echo_n "(cached) " >&6 else for ac_cv_func_getsockname_arg2 in 'struct sockaddr *' 'void *'; do for ac_cv_func_getsockname_socklen_type in 'socklen_t' 'size_t' 'unsigned int' 'int'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_SYS_TYPES_H #include @@ -44274,36 +20432,12 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_not_found=no ; break 2 else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_not_found=yes + ac_not_found=yes fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done @@ -44313,208 +20447,28 @@ fi if test "$ac_not_found" = yes; then ac_cv_func_getsockname_socklen_type='socklen_t' fi -echo "$as_me:$LINENO: result: $ac_cv_func_getsockname_socklen_type" >&5 -echo "${ECHO_T}$ac_cv_func_getsockname_socklen_type" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getsockname_socklen_type" >&5 +$as_echo "$ac_cv_func_getsockname_socklen_type" >&6; } cat >>confdefs.h <<_ACEOF #define GETSOCKNAME_SOCKLEN_TYPE $ac_cv_func_getsockname_socklen_type _ACEOF - for ac_func in getrusage -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage" +if test "x$ac_cv_func_getrusage" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_GETRUSAGE 1 _ACEOF fi done -echo "$as_me:$LINENO: checking for gettimeofday" >&5 -echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6 -if test "${ac_cv_func_gettimeofday+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define gettimeofday to an innocuous variant, in case declares gettimeofday. - For example, HP-UX 11i declares gettimeofday. */ -#define gettimeofday innocuous_gettimeofday +ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char gettimeofday (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef gettimeofday - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char gettimeofday (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday) -choke me -#else -char (*f) () = gettimeofday; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != gettimeofday; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_gettimeofday=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_gettimeofday=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_gettimeofday" >&5 -echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6 -if test $ac_cv_func_gettimeofday = yes; then - : else case "$host" in @@ -44526,103 +20480,12 @@ fi case "$host" in *-pc-cygwin*) ;; - *) -for ac_func in getuid -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in getuid +do : + ac_fn_c_check_func "$LINENO" "getuid" "ac_cv_func_getuid" +if test "x$ac_cv_func_getuid" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_GETUID 1 _ACEOF fi @@ -44630,103 +20493,12 @@ done ;; esac - for ac_func in hstrerror -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "hstrerror" "ac_cv_func_hstrerror" +if test "x$ac_cv_func_hstrerror" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_HSTRERROR 1 _ACEOF fi @@ -44736,97 +20508,8 @@ done # # Check for if_nametoindex() for IPv6 scoped addresses support # -echo "$as_me:$LINENO: checking for if_nametoindex" >&5 -echo $ECHO_N "checking for if_nametoindex... $ECHO_C" >&6 -if test "${ac_cv_func_if_nametoindex+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define if_nametoindex to an innocuous variant, in case declares if_nametoindex. - For example, HP-UX 11i declares gettimeofday. */ -#define if_nametoindex innocuous_if_nametoindex - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char if_nametoindex (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef if_nametoindex - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char if_nametoindex (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_if_nametoindex) || defined (__stub___if_nametoindex) -choke me -#else -char (*f) () = if_nametoindex; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != if_nametoindex; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_if_nametoindex=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_if_nametoindex=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_if_nametoindex" >&5 -echo "${ECHO_T}$ac_cv_func_if_nametoindex" >&6 -if test $ac_cv_func_if_nametoindex = yes; then +ac_fn_c_check_func "$LINENO" "if_nametoindex" "ac_cv_func_if_nametoindex" +if test "x$ac_cv_func_if_nametoindex" = x""yes; then : ac_cv_have_if_nametoindex=yes else ac_cv_have_if_nametoindex=no @@ -44836,71 +20519,43 @@ case $ac_cv_have_if_nametoindex in no) case "$host" in *-hp-hpux*) - echo "$as_me:$LINENO: checking for if_nametoindex in -lipv6" >&5 -echo $ECHO_N "checking for if_nametoindex in -lipv6... $ECHO_C" >&6 -if test "${ac_cv_lib_ipv6_if_nametoindex+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for if_nametoindex in -lipv6" >&5 +$as_echo_n "checking for if_nametoindex in -lipv6... " >&6; } +if test "${ac_cv_lib_ipv6_if_nametoindex+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipv6 $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char if_nametoindex (); int main () { -if_nametoindex (); +return if_nametoindex (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipv6_if_nametoindex=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_ipv6_if_nametoindex=no + ac_cv_lib_ipv6_if_nametoindex=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_ipv6_if_nametoindex" >&5 -echo "${ECHO_T}$ac_cv_lib_ipv6_if_nametoindex" >&6 -if test $ac_cv_lib_ipv6_if_nametoindex = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipv6_if_nametoindex" >&5 +$as_echo "$ac_cv_lib_ipv6_if_nametoindex" >&6; } +if test "x$ac_cv_lib_ipv6_if_nametoindex" = x""yes; then : ac_cv_have_if_nametoindex=yes LIBS="-lipv6 $LIBS" fi @@ -44911,414 +20566,46 @@ esac case $ac_cv_have_if_nametoindex in yes) -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_HAVEIFNAMETOINDEX 1 -_ACEOF +$as_echo "#define ISC_PLATFORM_HAVEIFNAMETOINDEX 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for inet_ntop" >&5 -echo $ECHO_N "checking for inet_ntop... $ECHO_C" >&6 -if test "${ac_cv_func_inet_ntop+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define inet_ntop to an innocuous variant, in case declares inet_ntop. - For example, HP-UX 11i declares gettimeofday. */ -#define inet_ntop innocuous_inet_ntop +ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" +if test "x$ac_cv_func_inet_ntop" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char inet_ntop (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef inet_ntop - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char inet_ntop (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_inet_ntop) || defined (__stub___inet_ntop) -choke me -#else -char (*f) () = inet_ntop; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != inet_ntop; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_inet_ntop=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_inet_ntop=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_inet_ntop" >&5 -echo "${ECHO_T}$ac_cv_func_inet_ntop" >&6 -if test $ac_cv_func_inet_ntop = yes; then - : else -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_NEEDNTOP 1 -_ACEOF +$as_echo "#define ISC_PLATFORM_NEEDNTOP 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for inet_pton" >&5 -echo $ECHO_N "checking for inet_pton... $ECHO_C" >&6 -if test "${ac_cv_func_inet_pton+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define inet_pton to an innocuous variant, in case declares inet_pton. - For example, HP-UX 11i declares gettimeofday. */ -#define inet_pton innocuous_inet_pton +ac_fn_c_check_func "$LINENO" "inet_pton" "ac_cv_func_inet_pton" +if test "x$ac_cv_func_inet_pton" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char inet_pton (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef inet_pton - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char inet_pton (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_inet_pton) || defined (__stub___inet_pton) -choke me -#else -char (*f) () = inet_pton; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != inet_pton; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_inet_pton=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_inet_pton=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_inet_pton" >&5 -echo "${ECHO_T}$ac_cv_func_inet_pton" >&6 -if test $ac_cv_func_inet_pton = yes; then - : else -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_NEEDPTON 1 -_ACEOF +$as_echo "#define ISC_PLATFORM_NEEDPTON 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for inet_aton" >&5 -echo $ECHO_N "checking for inet_aton... $ECHO_C" >&6 -if test "${ac_cv_func_inet_aton+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define inet_aton to an innocuous variant, in case declares inet_aton. - For example, HP-UX 11i declares gettimeofday. */ -#define inet_aton innocuous_inet_aton +ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" +if test "x$ac_cv_func_inet_aton" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char inet_aton (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef inet_aton - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char inet_aton (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_inet_aton) || defined (__stub___inet_aton) -choke me -#else -char (*f) () = inet_aton; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != inet_aton; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_inet_aton=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_inet_aton=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_inet_aton" >&5 -echo "${ECHO_T}$ac_cv_func_inet_aton" >&6 -if test $ac_cv_func_inet_aton = yes; then - : else -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_NEEDATON 1 -_ACEOF +$as_echo "#define ISC_PLATFORM_NEEDATON 1" >>confdefs.h fi - - - - - for ac_func in K_open kvm_open memcpy memmove memset -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -45328,103 +20615,12 @@ case "$host" in *-*-sco3.2v5.0.*) # Just stubs. Idiots. ;; - *) -for ac_func in mkstemp -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in mkstemp +do : + ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" +if test "x$ac_cv_func_mkstemp" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_MKSTEMP 1 _ACEOF fi @@ -45432,116 +20628,25 @@ done ;; esac - for ac_func in mktime -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "mktime" "ac_cv_func_mktime" +if test "x$ac_cv_func_mktime" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_MKTIME 1 _ACEOF fi done case "$host" in - *-*-aix[45]*) + *-*-aix[456]*) # Just a stub. Idiots. ;; *-*-irix[45]*) # Just a stub in "old" Irix. Idiots. ;; - *-*-linux*) + *-*-*linux*) # there, but more trouble than it is worth for now (resolver problems) ;; *-*-qnx*) @@ -45553,308 +20658,35 @@ case "$host" in alpha*-dec-osf4*|alpha*-dec-osf5*) # mlockall is there, as a #define calling memlk via # Not easy to test for - cheat. - -for ac_func in memlk -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in memlk +do : + ac_fn_c_check_func "$LINENO" "memlk" "ac_cv_func_memlk" +if test "x$ac_cv_func_memlk" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_MEMLK 1 _ACEOF ac_cv_func_mlockall='yes' fi done - -for ac_func in mlockall -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in mlockall +do : + ac_fn_c_check_func "$LINENO" "mlockall" "ac_cv_func_mlockall" +if test "x$ac_cv_func_mlockall" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_MLOCKALL 1 _ACEOF fi done ;; - *) -for ac_func in mlockall -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in mlockall +do : + ac_fn_c_check_func "$LINENO" "mlockall" "ac_cv_func_mlockall" +if test "x$ac_cv_func_mlockall" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_MLOCKALL 1 _ACEOF fi @@ -45862,104 +20694,14 @@ done ;; esac - - for ac_func in nice nlist -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -45969,104 +20711,14 @@ case "$host" in *-*-solaris2.6) # Broken... ;; - *) - -for ac_func in ntp_adjtime ntp_gettime -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in ntp_adjtime ntp_gettime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -46074,217 +20726,32 @@ done ;; esac - - - - - - for ac_func in plock pututline pututxline readlink recvmsg rtprio -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done case "$host" in - *-*-aix[45]*) + *-*-aix[456]*) # Just a stub in AIX 4. Idiots. ;; *-*-solaris2.5*) # Just stubs in solaris2.5. Idiots. ;; - *) -for ac_func in sched_setscheduler -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in sched_setscheduler +do : + ac_fn_c_check_func "$LINENO" "sched_setscheduler" "ac_cv_func_sched_setscheduler" +if test "x$ac_cv_func_sched_setscheduler" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_SCHED_SETSCHEDULER 1 _ACEOF fi @@ -46292,310 +20759,36 @@ done ;; esac - - - - for ac_func in setlinebuf setpgid setpriority setsid -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done - for ac_func in setrlimit -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "setrlimit" "ac_cv_func_setrlimit" +if test "x$ac_cv_func_setrlimit" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_SETRLIMIT 1 _ACEOF fi done - for ac_func in settimeofday -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "settimeofday" "ac_cv_func_settimeofday" +if test "x$ac_cv_func_settimeofday" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_SETTIMEOFDAY 1 _ACEOF else @@ -46607,426 +20800,58 @@ esac fi done - - for ac_func in setvbuf sigaction -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done - - - - - - - for ac_func in sigvec sigset sigsuspend stime strchr sysconf sysctl -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done - - - - for ac_func in snprintf strdup strerror strstr -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done - for ac_func in timegm -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" +if test "x$ac_cv_func_timegm" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_TIMEGM 1 _ACEOF fi done case "$host" in - *-*-aix[45]*) + *-*-aix[456]*) # Just stubs. Idiots. ;; *-*-netbsd1*) @@ -47038,104 +20863,14 @@ case "$host" in *-*-openbsd*) # Just stubs. Idiots. ;; - *) - -for ac_func in timer_create timer_settime -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in timer_create timer_settime +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -47147,103 +20882,12 @@ case "$host" in *-pc-cygwin*) # I have no idea... ;; - *) -for ac_func in umask -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + *) for ac_func in umask +do : + ac_fn_c_check_func "$LINENO" "umask" "ac_cv_func_umask" +if test "x$ac_cv_func_umask" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_UMASK 1 _ACEOF fi @@ -47251,107 +20895,14 @@ done ;; esac - - - - - for ac_func in uname updwtmp updwtmpx vsnprintf vsprintf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -47360,20 +20911,16 @@ done ### -# http://bugs.ntp.isc.org/737 +# http://bugs.ntp.org/737 case "$ac_cv_func_recvmsg" in yes) - echo "$as_me:$LINENO: checking if we need extra help to define struct iovec" >&5 -echo $ECHO_N "checking if we need extra help to define struct iovec... $ECHO_C" >&6 - if test "${ac_cv_struct_iovec_help+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need extra help to define struct iovec" >&5 +$as_echo_n "checking if we need extra help to define struct iovec... " >&6; } + if test "${ac_cv_struct_iovec_help+set}" = set; then : + $as_echo_n "(cached) " >&6 else for ac_cv_struct_iovec_help in '0' '1'; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_SYS_TYPES_H #include @@ -47404,75 +20951,43 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_worked=yes ; break 1 else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_worked=no + ac_worked=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done fi case "$ac_worked$ac_cv_struct_iovec_help" in yes1) -cat >>confdefs.h <<\_ACEOF -#define HAVE_SYS_UIO_H 1 -_ACEOF +$as_echo "#define HAVE_SYS_UIO_H 1" >>confdefs.h ans=yes ;; *) ans=no esac - echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } ;; esac case "$host" in *-*-sunos4*) -cat >>confdefs.h <<\_ACEOF -#define SPRINTF_CHAR 1 -_ACEOF +$as_echo "#define SPRINTF_CHAR 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking number of arguments to gettimeofday()" >&5 -echo $ECHO_N "checking number of arguments to gettimeofday()... $ECHO_C" >&6 -if test "${ac_cv_func_Xettimeofday_nargs+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking number of arguments to gettimeofday()" >&5 +$as_echo_n "checking number of arguments to gettimeofday()... " >&6; } +if test "${ac_cv_func_Xettimeofday_nargs+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int @@ -47486,58 +21001,28 @@ settimeofday((struct timeval*)0,(struct timezone*)0); return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_Xettimeofday_nargs=2 else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_Xettimeofday_nargs=1 + ac_cv_func_Xettimeofday_nargs=1 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_Xettimeofday_nargs" >&5 -echo "${ECHO_T}$ac_cv_func_Xettimeofday_nargs" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_Xettimeofday_nargs" >&5 +$as_echo "$ac_cv_func_Xettimeofday_nargs" >&6; } if test $ac_cv_func_Xettimeofday_nargs = 1; then -cat >>confdefs.h <<\_ACEOF -#define SYSV_TIMEOFDAY 1 -_ACEOF +$as_echo "#define SYSV_TIMEOFDAY 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking number of arguments taken by setpgrp()" >&5 -echo $ECHO_N "checking number of arguments taken by setpgrp()... $ECHO_C" >&6 -if test "${ac_cv_func_setpgrp_nargs+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking number of arguments taken by setpgrp()" >&5 +$as_echo_n "checking number of arguments taken by setpgrp()... " >&6; } +if test "${ac_cv_func_setpgrp_nargs+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_SYS_TYPES_H @@ -47555,61 +21040,31 @@ setpgrp(0,0); return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_setpgrp_nargs=2 else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_setpgrp_nargs=0 + ac_cv_func_setpgrp_nargs=0 fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_setpgrp_nargs" >&5 -echo "${ECHO_T}$ac_cv_func_setpgrp_nargs" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_setpgrp_nargs" >&5 +$as_echo "$ac_cv_func_setpgrp_nargs" >&6; } if test $ac_cv_func_setpgrp_nargs = 0; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_SETPGRP_0 1 -_ACEOF +$as_echo "#define HAVE_SETPGRP_0 1" >>confdefs.h fi save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -I$srcdir/include" -echo "$as_me:$LINENO: checking argument pointer type of qsort()'s compare function and base" >&5 -echo $ECHO_N "checking argument pointer type of qsort()'s compare function and base... $ECHO_C" >&6 -if test "${ac_cv_func_qsort_argtype+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking argument pointer type of qsort()'s compare function and base" >&5 +$as_echo_n "checking argument pointer type of qsort()'s compare function and base... " >&6; } +if test "${ac_cv_func_qsort_argtype+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "l_stdlib.h" @@ -47636,62 +21091,32 @@ qsort(base, 2, sizeof(char *), sortfunc); return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_qsort_argtype=void else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_qsort_argtype=char + ac_cv_func_qsort_argtype=char fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_func_qsort_argtype" >&5 -echo "${ECHO_T}$ac_cv_func_qsort_argtype" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_qsort_argtype" >&5 +$as_echo "$ac_cv_func_qsort_argtype" >&6; } case "$ac_cv_func_qsort_argtype" in void) -cat >>confdefs.h <<\_ACEOF -#define QSORT_USES_VOID_P 1 -_ACEOF +$as_echo "#define QSORT_USES_VOID_P 1" >>confdefs.h ;; esac CFLAGS=$save_CFLAGS -echo "$as_me:$LINENO: checking if we need to declare 'errno'" >&5 -echo $ECHO_N "checking if we need to declare 'errno'... $ECHO_C" >&6 -if test "${ac_cv_decl_errno+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need to declare 'errno'" >&5 +$as_echo_n "checking if we need to declare 'errno'... " >&6; } +if test "${ac_cv_decl_errno+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_ERRNO_H #include @@ -47704,57 +21129,27 @@ errno = 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_decl_errno=no else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_decl_errno=yes + ac_cv_decl_errno=yes fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_decl_errno" >&5 -echo "${ECHO_T}$ac_cv_decl_errno" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_errno" >&5 +$as_echo "$ac_cv_decl_errno" >&6; } case "$ac_cv_decl_errno" in yes) -cat >>confdefs.h <<\_ACEOF -#define DECL_ERRNO 1 -_ACEOF +$as_echo "#define DECL_ERRNO 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we may declare 'h_errno'" >&5 -echo $ECHO_N "checking if we may declare 'h_errno'... $ECHO_C" >&6 -if test "${ac_cv_decl_h_errno+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we may declare 'h_errno'" >&5 +$as_echo_n "checking if we may declare 'h_errno'... " >&6; } +if test "${ac_cv_decl_h_errno+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_NETINET_IN_H @@ -47777,57 +21172,27 @@ extern int h_errno; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_decl_h_errno=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_decl_h_errno=no + ac_cv_decl_h_errno=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_decl_h_errno" >&5 -echo "${ECHO_T}$ac_cv_decl_h_errno" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_h_errno" >&5 +$as_echo "$ac_cv_decl_h_errno" >&6; } case "$ac_cv_decl_h_errno" in yes) -cat >>confdefs.h <<\_ACEOF -#define DECL_H_ERRNO 1 -_ACEOF +$as_echo "#define DECL_H_ERRNO 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if declaring 'char *sys_errlist[]' is ok" >&5 -echo $ECHO_N "checking if declaring 'char *sys_errlist[]' is ok... $ECHO_C" >&6 -if test "${ac_cv_decl_sys_errlist+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if declaring 'char *sys_errlist[]' is ok" >&5 +$as_echo_n "checking if declaring 'char *sys_errlist[]' is ok... " >&6; } +if test "${ac_cv_decl_sys_errlist+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_ERRNO_H @@ -47842,57 +21207,27 @@ extern char *sys_errlist[]; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_decl_sys_errlist=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_decl_sys_errlist=no + ac_cv_decl_sys_errlist=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_decl_sys_errlist" >&5 -echo "${ECHO_T}$ac_cv_decl_sys_errlist" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_sys_errlist" >&5 +$as_echo "$ac_cv_decl_sys_errlist" >&6; } case "$ac_cv_decl_sys_errlist" in yes) -cat >>confdefs.h <<\_ACEOF -#define CHAR_SYS_ERRLIST 1 -_ACEOF +$as_echo "#define CHAR_SYS_ERRLIST 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if declaring 'syscall()' is ok" >&5 -echo $ECHO_N "checking if declaring 'syscall()' is ok... $ECHO_C" >&6 -if test "${ac_cv_decl_syscall+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if declaring 'syscall()' is ok" >&5 +$as_echo_n "checking if declaring 'syscall()' is ok... " >&6; } +if test "${ac_cv_decl_syscall+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_SYS_TYPES_H @@ -47915,395 +21250,239 @@ extern int syscall P((int, ...)); return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_decl_syscall=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_decl_syscall=no + ac_cv_decl_syscall=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_decl_syscall" >&5 -echo "${ECHO_T}$ac_cv_decl_syscall" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_decl_syscall" >&5 +$as_echo "$ac_cv_decl_syscall" >&6; } case "$ac_cv_decl_syscall" in yes) -cat >>confdefs.h <<\_ACEOF -#define DECL_SYSCALL 1 -_ACEOF +$as_echo "#define DECL_SYSCALL 1" >>confdefs.h ;; esac case "$host" in *-*-aix4.3.*) -cat >>confdefs.h <<\_ACEOF -#define DECL_HSTRERROR_0 1 -_ACEOF +$as_echo "#define DECL_HSTRERROR_0 1" >>confdefs.h # Needed for XLC under AIX 4.3.2 ;; *-*-mpeix*) -cat >>confdefs.h <<\_ACEOF -#define DECL_ADJTIME_0 1 -_ACEOF +$as_echo "#define DECL_ADJTIME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_INET_NTOA_0 1 -_ACEOF +$as_echo "#define DECL_INET_NTOA_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_MKTEMP_0 1 -_ACEOF +$as_echo "#define DECL_MKTEMP_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SELECT_0 1 -_ACEOF +$as_echo "#define DECL_SELECT_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETITIMER_0 1 -_ACEOF +$as_echo "#define DECL_SETITIMER_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SYSLOG_0 1 -_ACEOF +$as_echo "#define DECL_SYSLOG_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TIMEOFDAY_0 1 -_ACEOF +$as_echo "#define DECL_TIMEOFDAY_0 1" >>confdefs.h ;; *-*-osf[45]*) -cat >>confdefs.h <<\_ACEOF -#define DECL_PLOCK_0 1 -_ACEOF +$as_echo "#define DECL_PLOCK_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_STIME_1 1 -_ACEOF +$as_echo "#define DECL_STIME_1 1" >>confdefs.h ;; *-*-qnx*) -cat >>confdefs.h <<\_ACEOF -#define DECL_ADJTIME_0 1 -_ACEOF +$as_echo "#define DECL_ADJTIME_0 1" >>confdefs.h ;; *-*-riscos4*) -cat >>confdefs.h <<\_ACEOF -#define DECL_ADJTIME_0 1 -_ACEOF +$as_echo "#define DECL_ADJTIME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_BZERO_0 1 -_ACEOF +$as_echo "#define DECL_BZERO_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_IOCTL_0 1 -_ACEOF +$as_echo "#define DECL_IOCTL_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_IPC_0 1 -_ACEOF +$as_echo "#define DECL_IPC_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_MEMMOVE_0 1 -_ACEOF +$as_echo "#define DECL_MEMMOVE_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_MKTEMP_0 1 -_ACEOF +$as_echo "#define DECL_MKTEMP_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_RENAME_0 1 -_ACEOF +$as_echo "#define DECL_RENAME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SELECT_0 1 -_ACEOF +$as_echo "#define DECL_SELECT_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETITIMER_0 1 -_ACEOF +$as_echo "#define DECL_SETITIMER_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETPRIORITY_0 1 -_ACEOF +$as_echo "#define DECL_SETPRIORITY_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_STDIO_0 1 -_ACEOF +$as_echo "#define DECL_STDIO_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_STRTOL_0 1 -_ACEOF +$as_echo "#define DECL_STRTOL_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SYSLOG_0 1 -_ACEOF +$as_echo "#define DECL_SYSLOG_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TIME_0 1 -_ACEOF +$as_echo "#define DECL_TIME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TIMEOFDAY_0 1 -_ACEOF +$as_echo "#define DECL_TIMEOFDAY_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TOLOWER_0 1 -_ACEOF +$as_echo "#define DECL_TOLOWER_0 1" >>confdefs.h ;; *-*-solaris2*) -cat >>confdefs.h <<\_ACEOF -#define DECL_MKSTEMP_0 1 -_ACEOF +$as_echo "#define DECL_MKSTEMP_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETPRIORITY_1 1 -_ACEOF +$as_echo "#define DECL_SETPRIORITY_1 1" >>confdefs.h case "$host" in *-*-solaris2.4) -cat >>confdefs.h <<\_ACEOF -#define DECL_TIMEOFDAY_0 1 -_ACEOF +$as_echo "#define DECL_TIMEOFDAY_0 1" >>confdefs.h ;; esac ;; *-*-sunos4*) -cat >>confdefs.h <<\_ACEOF -#define DECL_ADJTIME_0 1 -_ACEOF +$as_echo "#define DECL_ADJTIME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_BCOPY_0 1 -_ACEOF +$as_echo "#define DECL_BCOPY_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_BZERO_0 1 -_ACEOF +$as_echo "#define DECL_BZERO_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_IOCTL_0 1 -_ACEOF +$as_echo "#define DECL_IOCTL_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_IPC_0 1 -_ACEOF +$as_echo "#define DECL_IPC_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_MEMMOVE_0 1 -_ACEOF +$as_echo "#define DECL_MEMMOVE_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_MKTEMP_0 1 -_ACEOF +$as_echo "#define DECL_MKTEMP_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_MKSTEMP_0 1 -_ACEOF +$as_echo "#define DECL_MKSTEMP_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_RENAME_0 1 -_ACEOF +$as_echo "#define DECL_RENAME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SELECT_0 1 -_ACEOF +$as_echo "#define DECL_SELECT_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETITIMER_0 1 -_ACEOF +$as_echo "#define DECL_SETITIMER_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETPRIORITY_0 1 -_ACEOF +$as_echo "#define DECL_SETPRIORITY_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SIGVEC_0 1 -_ACEOF +$as_echo "#define DECL_SIGVEC_0 1" >>confdefs.h case "`basename $ac_cv_prog_CC`" in acc*) ;; *) -cat >>confdefs.h <<\_ACEOF -#define DECL_STDIO_0 1 -_ACEOF +$as_echo "#define DECL_STDIO_0 1" >>confdefs.h ;; esac -cat >>confdefs.h <<\_ACEOF -#define DECL_STRTOL_0 1 -_ACEOF +$as_echo "#define DECL_STRTOL_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SYSLOG_0 1 -_ACEOF +$as_echo "#define DECL_SYSLOG_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TIME_0 1 -_ACEOF +$as_echo "#define DECL_TIME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TIMEOFDAY_0 1 -_ACEOF +$as_echo "#define DECL_TIMEOFDAY_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TOLOWER_0 1 -_ACEOF +$as_echo "#define DECL_TOLOWER_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TOUPPER_0 1 -_ACEOF +$as_echo "#define DECL_TOUPPER_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_STRERROR_0 1 -_ACEOF +$as_echo "#define DECL_STRERROR_0 1" >>confdefs.h ;; *-*-ultrix4*) -cat >>confdefs.h <<\_ACEOF -#define DECL_ADJTIME_0 1 -_ACEOF +$as_echo "#define DECL_ADJTIME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_BZERO_0 1 -_ACEOF +$as_echo "#define DECL_BZERO_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_CFSETISPEED_0 1 -_ACEOF +$as_echo "#define DECL_CFSETISPEED_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_IOCTL_0 1 -_ACEOF +$as_echo "#define DECL_IOCTL_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_IPC_0 1 -_ACEOF +$as_echo "#define DECL_IPC_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_MKTEMP_0 1 -_ACEOF +$as_echo "#define DECL_MKTEMP_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_NLIST_0 1 -_ACEOF +$as_echo "#define DECL_NLIST_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_PLOCK_0 1 -_ACEOF +$as_echo "#define DECL_PLOCK_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SELECT_0 1 -_ACEOF +$as_echo "#define DECL_SELECT_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETITIMER_0 1 -_ACEOF +$as_echo "#define DECL_SETITIMER_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SETPRIORITY_0 1 -_ACEOF +$as_echo "#define DECL_SETPRIORITY_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_STIME_0 1 -_ACEOF +$as_echo "#define DECL_STIME_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_SYSLOG_0 1 -_ACEOF +$as_echo "#define DECL_SYSLOG_0 1" >>confdefs.h -cat >>confdefs.h <<\_ACEOF -#define DECL_TIMEOFDAY_0 1 -_ACEOF +$as_echo "#define DECL_TIMEOFDAY_0 1" >>confdefs.h ;; esac @@ -48311,17 +21490,15 @@ esac case "$host" in *-*-sco3.2*) -cat >>confdefs.h <<\_ACEOF -#define TERMIOS_NEEDS__SVID3 1 -_ACEOF +$as_echo "#define TERMIOS_NEEDS__SVID3 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we need extra room for SO_RCVBUF" >&5 -echo $ECHO_N "checking if we need extra room for SO_RCVBUF... $ECHO_C" >&6 -if test "${ac_cv_var_rcvbuf_slop+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need extra room for SO_RCVBUF" >&5 +$as_echo_n "checking if we need extra room for SO_RCVBUF... " >&6; } +if test "${ac_cv_var_rcvbuf_slop+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$host" in @@ -48331,20 +21508,18 @@ case "$host" in esac ac_cv_var_rcvbuf_slop=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_rcvbuf_slop" >&5 -echo "${ECHO_T}$ac_cv_var_rcvbuf_slop" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_rcvbuf_slop" >&5 +$as_echo "$ac_cv_var_rcvbuf_slop" >&6; } case "$ac_cv_var_rcvbuf_slop" in yes) -cat >>confdefs.h <<\_ACEOF -#define NEED_RCVBUF_SLOP 1 -_ACEOF +$as_echo "#define NEED_RCVBUF_SLOP 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we will open the broadcast socket" >&5 -echo $ECHO_N "checking if we will open the broadcast socket... $ECHO_C" >&6 -if test "${ac_cv_var_open_bcast_socket+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we will open the broadcast socket" >&5 +$as_echo_n "checking if we will open the broadcast socket... " >&6; } +if test "${ac_cv_var_open_bcast_socket+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=yes case "$host" in @@ -48354,20 +21529,18 @@ case "$host" in esac ac_cv_var_open_bcast_socket=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_open_bcast_socket" >&5 -echo "${ECHO_T}$ac_cv_var_open_bcast_socket" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_open_bcast_socket" >&5 +$as_echo "$ac_cv_var_open_bcast_socket" >&6; } case "$ac_cv_var_open_bcast_socket" in yes) -cat >>confdefs.h <<\_ACEOF -#define OPEN_BCAST_SOCKET 1 -_ACEOF +$as_echo "#define OPEN_BCAST_SOCKET 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we want the HPUX version of FindConfig()" >&5 -echo $ECHO_N "checking if we want the HPUX version of FindConfig()... $ECHO_C" >&6 -if test "${ac_cv_var_hpux_findconfig+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want the HPUX version of FindConfig()" >&5 +$as_echo_n "checking if we want the HPUX version of FindConfig()... " >&6; } +if test "${ac_cv_var_hpux_findconfig+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$host" in @@ -48377,20 +21550,18 @@ case "$host" in esac ac_cv_var_hpux_findconfig=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_hpux_findconfig" >&5 -echo "${ECHO_T}$ac_cv_var_hpux_findconfig" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_hpux_findconfig" >&5 +$as_echo "$ac_cv_var_hpux_findconfig" >&6; } case "$ac_cv_var_hpux_findconfig" in yes) -cat >>confdefs.h <<\_ACEOF -#define NEED_HPUX_FINDCONFIG 1 -_ACEOF +$as_echo "#define NEED_HPUX_FINDCONFIG 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if process groups are set with -pid" >&5 -echo $ECHO_N "checking if process groups are set with -pid... $ECHO_C" >&6 -if test "${ac_cv_arg_setpgrp_negpid+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if process groups are set with -pid" >&5 +$as_echo_n "checking if process groups are set with -pid... " >&6; } +if test "${ac_cv_arg_setpgrp_negpid+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *-*-hpux[567]*) @@ -48399,7 +21570,7 @@ else *-*-hpux*) ans=yes ;; - *-*-linux*) + *-*-*linux*) ans=yes ;; *-*-sunos3*) @@ -48414,20 +21585,18 @@ else esac ac_cv_arg_setpgrp_negpid=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_arg_setpgrp_negpid" >&5 -echo "${ECHO_T}$ac_cv_arg_setpgrp_negpid" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_arg_setpgrp_negpid" >&5 +$as_echo "$ac_cv_arg_setpgrp_negpid" >&6; } case "$ac_cv_arg_setpgrp_negpid" in yes) -cat >>confdefs.h <<\_ACEOF -#define UDP_BACKWARDS_SETOWN 1 -_ACEOF +$as_echo "#define UDP_BACKWARDS_SETOWN 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we need a ctty for F_SETOWN" >&5 -echo $ECHO_N "checking if we need a ctty for F_SETOWN... $ECHO_C" >&6 -if test "${ac_cv_func_ctty_for_f_setown+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need a ctty for F_SETOWN" >&5 +$as_echo_n "checking if we need a ctty for F_SETOWN... " >&6; } +if test "${ac_cv_func_ctty_for_f_setown+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *-*-bsdi[23]*) @@ -48445,25 +21614,26 @@ else *-*-osf*) ans=yes ;; + *-*-darwin*) + ans=yes + ;; *) ans=no ;; esac ac_cv_func_ctty_for_f_setown=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_func_ctty_for_f_setown" >&5 -echo "${ECHO_T}$ac_cv_func_ctty_for_f_setown" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_ctty_for_f_setown" >&5 +$as_echo "$ac_cv_func_ctty_for_f_setown" >&6; } case "$ac_cv_func_ctty_for_f_setown" in yes) -cat >>confdefs.h <<\_ACEOF -#define USE_FSETOWNCTTY 1 -_ACEOF +$as_echo "#define USE_FSETOWNCTTY 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if the OS misses to clear cached routes when more specific routes become available" >&5 -echo $ECHO_N "checking if the OS misses to clear cached routes when more specific routes become available... $ECHO_C" >&6 -if test "${ac_cv_os_routeupdates+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the OS fails to clear cached routes when more specific routes become available" >&5 +$as_echo_n "checking if the OS fails to clear cached routes when more specific routes become available... " >&6; } +if test "${ac_cv_os_routeupdates+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *-*-netbsd*) @@ -48474,23 +21644,21 @@ else esac ac_cv_os_routeupdates=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_os_routeupdates" >&5 -echo "${ECHO_T}$ac_cv_os_routeupdates" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_routeupdates" >&5 +$as_echo "$ac_cv_os_routeupdates" >&6; } case "$ac_cv_os_routeupdates" in yes) -cat >>confdefs.h <<\_ACEOF -#define OS_MISSES_SPECIFIC_ROUTE_UPDATES 1 -_ACEOF +$as_echo "#define OS_MISSES_SPECIFIC_ROUTE_UPDATES 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if the OS needs the wildcard socket set to REUSEADDR for binding interface addresses" >&5 -echo $ECHO_N "checking if the OS needs the wildcard socket set to REUSEADDR for binding interface addresses... $ECHO_C" >&6 -if test "${ac_cv_os_wildcardreuse+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the OS needs the wildcard socket set to REUSEADDR for binding interface addresses" >&5 +$as_echo_n "checking if the OS needs the wildcard socket set to REUSEADDR for binding interface addresses... " >&6; } +if test "${ac_cv_os_wildcardreuse+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in - *-*-linux*) + *-*-*linux*) ans=yes ;; *) ans=no @@ -48498,19 +21666,17 @@ else esac ac_cv_os_wildcardreuse=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_os_wildcardreuse" >&5 -echo "${ECHO_T}$ac_cv_os_wildcardreuse" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_wildcardreuse" >&5 +$as_echo "$ac_cv_os_wildcardreuse" >&6; } case "$ac_cv_os_wildcardreuse" in yes) -cat >>confdefs.h <<\_ACEOF -#define OS_NEEDS_REUSEADDR_FOR_IFADDRBIND 1 -_ACEOF +$as_echo "#define OS_NEEDS_REUSEADDR_FOR_IFADDRBIND 1" >>confdefs.h ;; esac ntp_warning='GRONK' -echo "$as_me:$LINENO: checking if we'll use clock_settime or settimeofday or stime" >&5 -echo $ECHO_N "checking if we'll use clock_settime or settimeofday or stime... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we'll use clock_settime or settimeofday or stime" >&5 +$as_echo_n "checking if we'll use clock_settime or settimeofday or stime... " >&6; } case "$ac_cv_func_clock_settime$ac_cv_func_settimeofday$ac_cv_func_stime" in yes*) ntp_warning='' @@ -48531,19 +21697,19 @@ case "$ac_cv_func_clock_settime$ac_cv_func_settimeofday$ac_cv_func_stime" in ;; esac esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } case "$ntp_warning" in '') ;; - *) { echo "$as_me:$LINENO: WARNING: *** $ntp_warning ***" >&5 -echo "$as_me: WARNING: *** $ntp_warning ***" >&2;} + *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** $ntp_warning ***" >&5 +$as_echo "$as_me: WARNING: *** $ntp_warning ***" >&2;} ;; esac -echo "$as_me:$LINENO: checking if we have a losing syscall()" >&5 -echo $ECHO_N "checking if we have a losing syscall()... $ECHO_C" >&6 -if test "${ac_cv_var_syscall_bug+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have a losing syscall()" >&5 +$as_echo_n "checking if we have a losing syscall()... " >&6; } +if test "${ac_cv_var_syscall_bug+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *-*-solaris2.4*) @@ -48554,26 +21720,20 @@ else esac ac_cv_var_syscall_bug=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_syscall_bug" >&5 -echo "${ECHO_T}$ac_cv_var_syscall_bug" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_syscall_bug" >&5 +$as_echo "$ac_cv_var_syscall_bug" >&6; } case "$ac_cv_var_syscall_bug" in yes) -cat >>confdefs.h <<\_ACEOF -#define SYSCALL_BUG 1 -_ACEOF +$as_echo "#define SYSCALL_BUG 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for SIGIO" >&5 -echo $ECHO_N "checking for SIGIO... $ECHO_C" >&6 -if test "${ac_cv_hdr_def_sigio+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIGIO" >&5 +$as_echo_n "checking for SIGIO... " >&6; } +if test "${ac_cv_hdr_def_sigio+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef SIGIO @@ -48582,7 +21742,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ac_cv_hdr_def_sigio=yes else ac_cv_hdr_def_sigio=no @@ -48590,13 +21750,13 @@ fi rm -f conftest* fi -echo "$as_me:$LINENO: result: $ac_cv_hdr_def_sigio" >&5 -echo "${ECHO_T}$ac_cv_hdr_def_sigio" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hdr_def_sigio" >&5 +$as_echo "$ac_cv_hdr_def_sigio" >&6; } -echo "$as_me:$LINENO: checking if we want to use signalled IO" >&5 -echo $ECHO_N "checking if we want to use signalled IO... $ECHO_C" >&6 -if test "${ac_cv_var_signalled_io+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want to use signalled IO" >&5 +$as_echo_n "checking if we want to use signalled IO... " >&6; } +if test "${ac_cv_var_signalled_io+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$ac_cv_hdr_def_sigio" in @@ -48627,7 +21787,7 @@ case "$ac_cv_hdr_def_sigio" in *-*-freebsd*) ans=no ;; - *-*-linux*) + *-*-*linux*) ans=no ;; *-*-unicosmp*) @@ -48638,26 +21798,20 @@ case "$ac_cv_hdr_def_sigio" in esac ac_cv_var_signalled_io=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_signalled_io" >&5 -echo "${ECHO_T}$ac_cv_var_signalled_io" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_signalled_io" >&5 +$as_echo "$ac_cv_var_signalled_io" >&6; } case "$ac_cv_var_signalled_io" in yes) -cat >>confdefs.h <<\_ACEOF -#define HAVE_SIGNALED_IO 1 -_ACEOF +$as_echo "#define HAVE_SIGNALED_IO 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for SIGPOLL" >&5 -echo $ECHO_N "checking for SIGPOLL... $ECHO_C" >&6 -if test "${ac_cv_hdr_def_sigpoll+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIGPOLL" >&5 +$as_echo_n "checking for SIGPOLL... " >&6; } +if test "${ac_cv_hdr_def_sigpoll+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef SIGPOLL @@ -48666,7 +21820,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ac_cv_hdr_def_sigpoll=yes else ac_cv_hdr_def_sigpoll=no @@ -48674,19 +21828,15 @@ fi rm -f conftest* fi -echo "$as_me:$LINENO: result: $ac_cv_hdr_def_sigpoll" >&5 -echo "${ECHO_T}$ac_cv_hdr_def_sigpoll" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hdr_def_sigpoll" >&5 +$as_echo "$ac_cv_hdr_def_sigpoll" >&6; } -echo "$as_me:$LINENO: checking for SIGSYS" >&5 -echo $ECHO_N "checking for SIGSYS... $ECHO_C" >&6 -if test "${ac_cv_hdr_def_sigsys+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIGSYS" >&5 +$as_echo_n "checking for SIGSYS... " >&6; } +if test "${ac_cv_hdr_def_sigsys+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef SIGSYS @@ -48695,7 +21845,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ac_cv_hdr_def_sigsys=yes else ac_cv_hdr_def_sigsys=no @@ -48703,13 +21853,13 @@ fi rm -f conftest* fi -echo "$as_me:$LINENO: result: $ac_cv_hdr_def_sigsys" >&5 -echo "${ECHO_T}$ac_cv_hdr_def_sigsys" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hdr_def_sigsys" >&5 +$as_echo "$ac_cv_hdr_def_sigsys" >&6; } -echo "$as_me:$LINENO: checking if we can use SIGPOLL for UDP I/O" >&5 -echo $ECHO_N "checking if we can use SIGPOLL for UDP I/O... $ECHO_C" >&6 -if test "${ac_cv_var_use_udp_sigpoll+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can use SIGPOLL for UDP I/O" >&5 +$as_echo_n "checking if we can use SIGPOLL for UDP I/O... " >&6; } +if test "${ac_cv_var_use_udp_sigpoll+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$ac_cv_hdr_def_sigpoll" in @@ -48727,13 +21877,13 @@ case "$ac_cv_hdr_def_sigpoll" in *-sni-sysv*) ans=no ;; - *-*-aix[45]*) + *-*-aix[456]*) ans=no ;; *-*-hpux*) ans=no ;; - *-*-linux*) + *-*-*linux*) ans=no ;; *-*-osf*) @@ -48745,6 +21895,9 @@ case "$ac_cv_hdr_def_sigpoll" in *-*-sunos*) ans=no ;; + *-*-solaris*) + ans=no + ;; *-*-ultrix*) ans=no ;; @@ -48758,20 +21911,18 @@ case "$ac_cv_hdr_def_sigpoll" in esac ac_cv_var_use_udp_sigpoll=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_use_udp_sigpoll" >&5 -echo "${ECHO_T}$ac_cv_var_use_udp_sigpoll" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_use_udp_sigpoll" >&5 +$as_echo "$ac_cv_var_use_udp_sigpoll" >&6; } case "$ac_cv_var_use_udp_sigpoll" in yes) -cat >>confdefs.h <<\_ACEOF -#define USE_UDP_SIGPOLL 1 -_ACEOF +$as_echo "#define USE_UDP_SIGPOLL 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we can use SIGPOLL for TTY I/O" >&5 -echo $ECHO_N "checking if we can use SIGPOLL for TTY I/O... $ECHO_C" >&6 -if test "${ac_cv_var_use_tty_sigpoll+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can use SIGPOLL for TTY I/O" >&5 +$as_echo_n "checking if we can use SIGPOLL for TTY I/O... " >&6; } +if test "${ac_cv_var_use_tty_sigpoll+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$ac_cv_hdr_def_sigpoll" in @@ -48789,13 +21940,13 @@ case "$ac_cv_hdr_def_sigpoll" in *-sni-sysv*) ans=no ;; - *-*-aix[45]*) + *-*-aix[456]*) ans=no ;; *-*-hpux*) ans=no ;; - *-*-linux*) + *-*-*linux*) ans=no ;; *-*-osf*) @@ -48820,28 +21971,22 @@ case "$ac_cv_hdr_def_sigpoll" in esac ac_cv_var_use_tty_sigpoll=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_use_tty_sigpoll" >&5 -echo "${ECHO_T}$ac_cv_var_use_tty_sigpoll" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_use_tty_sigpoll" >&5 +$as_echo "$ac_cv_var_use_tty_sigpoll" >&6; } case "$ac_cv_var_use_tty_sigpoll" in yes) -cat >>confdefs.h <<\_ACEOF -#define USE_TTY_SIGPOLL 1 -_ACEOF +$as_echo "#define USE_TTY_SIGPOLL 1" >>confdefs.h ;; esac case "$ac_cv_header_sys_sio_h" in yes) - echo "$as_me:$LINENO: checking sys/sio.h for TIOCDCDTIMESTAMP" >&5 -echo $ECHO_N "checking sys/sio.h for TIOCDCDTIMESTAMP... $ECHO_C" >&6 -if test "${ac_cv_hdr_def_tiocdcdtimestamp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking sys/sio.h for TIOCDCDTIMESTAMP" >&5 +$as_echo_n "checking sys/sio.h for TIOCDCDTIMESTAMP... " >&6; } +if test "${ac_cv_hdr_def_tiocdcdtimestamp+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef TIOCDCDTIMESTAMP @@ -48850,7 +21995,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ac_cv_hdr_def_tiocdcdtimestamp=yes else ac_cv_hdr_def_tiocdcdtimestamp=no @@ -48858,8 +22003,8 @@ fi rm -f conftest* fi -echo "$as_me:$LINENO: result: $ac_cv_hdr_def_tiocdcdtimestamp" >&5 -echo "${ECHO_T}$ac_cv_hdr_def_tiocdcdtimestamp" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_hdr_def_tiocdcdtimestamp" >&5 +$as_echo "$ac_cv_hdr_def_tiocdcdtimestamp" >&6; } ;; esac @@ -48869,10 +22014,10 @@ case "$ac_cv_hdr_def_tiocdcdtimestamp" in ;; esac -echo "$as_me:$LINENO: checking if nlist() values might require extra indirection" >&5 -echo $ECHO_N "checking if nlist() values might require extra indirection... $ECHO_C" >&6 -if test "${ac_cv_var_nlist_extra_indirection+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if nlist() values might require extra indirection" >&5 +$as_echo_n "checking if nlist() values might require extra indirection... " >&6; } +if test "${ac_cv_var_nlist_extra_indirection+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$host" in @@ -48882,20 +22027,18 @@ case "$host" in esac ac_cv_var_nlist_extra_indirection=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_nlist_extra_indirection" >&5 -echo "${ECHO_T}$ac_cv_var_nlist_extra_indirection" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_nlist_extra_indirection" >&5 +$as_echo "$ac_cv_var_nlist_extra_indirection" >&6; } case "$ac_cv_var_nlist_extra_indirection" in yes) -cat >>confdefs.h <<\_ACEOF -#define NLIST_EXTRA_INDIRECTION 1 -_ACEOF +$as_echo "#define NLIST_EXTRA_INDIRECTION 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for a minimum recommended value of tickadj" >&5 -echo $ECHO_N "checking for a minimum recommended value of tickadj... $ECHO_C" >&6 -if test "${ac_cv_var_min_rec_tickadj+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a minimum recommended value of tickadj" >&5 +$as_echo_n "checking for a minimum recommended value of tickadj... " >&6; } +if test "${ac_cv_var_min_rec_tickadj+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$host" in @@ -48905,8 +22048,8 @@ case "$host" in esac ac_cv_var_min_rec_tickadj=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_min_rec_tickadj" >&5 -echo "${ECHO_T}$ac_cv_var_min_rec_tickadj" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_min_rec_tickadj" >&5 +$as_echo "$ac_cv_var_min_rec_tickadj" >&6; } case "$ac_cv_var_min_rec_tickadj" in ''|no) ;; *) @@ -48916,14 +22059,14 @@ _ACEOF ;; esac -echo "$as_me:$LINENO: checking if the TTY code permits PARENB and IGNPAR" >&5 -echo $ECHO_N "checking if the TTY code permits PARENB and IGNPAR... $ECHO_C" >&6 -if test "${ac_cv_var_no_parenb_ignpar+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the TTY code permits PARENB and IGNPAR" >&5 +$as_echo_n "checking if the TTY code permits PARENB and IGNPAR... " >&6; } +if test "${ac_cv_var_no_parenb_ignpar+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$host" in - i?86-*-linux*) + i?86-*-*linux*) ans=yes ;; mips-sgi-irix*) @@ -48940,120 +22083,127 @@ case "$host" in esac ac_cv_var_no_parenb_ignpar=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_no_parenb_ignpar" >&5 -echo "${ECHO_T}$ac_cv_var_no_parenb_ignpar" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_no_parenb_ignpar" >&5 +$as_echo "$ac_cv_var_no_parenb_ignpar" >&6; } case "$ac_cv_var_no_parenb_ignpar" in yes) -cat >>confdefs.h <<\_ACEOF -#define NO_PARENB_IGNPAR 1 -_ACEOF +$as_echo "#define NO_PARENB_IGNPAR 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we're including debugging code" >&5 -echo $ECHO_N "checking if we're including debugging code... $ECHO_C" >&6 -# Check whether --enable-debugging or --disable-debugging was given. -if test "${enable_debugging+set}" = set; then - enableval="$enable_debugging" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we're including debugging code" >&5 +$as_echo_n "checking if we're including debugging code... " >&6; } +# Check whether --enable-debugging was given. +if test "${enable_debugging+set}" = set; then : + enableval=$enable_debugging; ntp_ok=$enableval else ntp_ok=yes -fi; +fi + if test "$ntp_ok" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define DEBUG 1 -_ACEOF +$as_echo "#define DEBUG 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking if we including processing time debugging code" >&5 -echo $ECHO_N "checking if we including processing time debugging code... $ECHO_C" >&6 -# Check whether --enable-debug-timing or --disable-debug-timing was given. -if test "${enable_debug_timing+set}" = set; then - enableval="$enable_debug_timing" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we including processing time debugging code" >&5 +$as_echo_n "checking if we including processing time debugging code... " >&6; } +# Check whether --enable-debug-timing was given. +if test "${enable_debug_timing+set}" = set; then : + enableval=$enable_debug_timing; ntp_ok=$enableval else ntp_ok=no -fi; +fi + if test "$ntp_ok" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define DEBUG_TIMING 1 -_ACEOF +$as_echo "#define DEBUG_TIMING 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking for a the number of minutes in a DST adjustment" >&5 -echo $ECHO_N "checking for a the number of minutes in a DST adjustment... $ECHO_C" >&6 -# Check whether --enable-dst_minutes or --disable-dst_minutes was given. -if test "${enable_dst_minutes+set}" = set; then - enableval="$enable_dst_minutes" - ans=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a the number of minutes in a DST adjustment" >&5 +$as_echo_n "checking for a the number of minutes in a DST adjustment... " >&6; } +# Check whether --enable-dst_minutes was given. +if test "${enable_dst_minutes+set}" = set; then : + enableval=$enable_dst_minutes; ans=$enableval else ans=60 -fi; + +fi + cat >>confdefs.h <<_ACEOF #define DSTMINUTES $ans _ACEOF -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we have the tty_clk line discipline/streams module" >&5 -echo $ECHO_N "checking if we have the tty_clk line discipline/streams module... $ECHO_C" >&6 -if test "${ac_cv_var_tty_clk+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ntpd will retry on permanent DNS errors" >&5 +$as_echo_n "checking if ntpd will retry on permanent DNS errors... " >&6; } +# Check whether --enable-ignore-dns-errors was given. +if test "${enable_ignore_dns_errors+set}" = set; then : + enableval=$enable_ignore_dns_errors; ans=$enableval +else + ans=no + +fi + +case "$ans" in + yes) + +$as_echo "#define IGNORE_DNS_ERRORS 1" >>confdefs.h + +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have the tty_clk line discipline/streams module" >&5 +$as_echo_n "checking if we have the tty_clk line discipline/streams module... " >&6; } +if test "${ac_cv_var_tty_clk+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$ac_cv_header_sys_clkdefs_h$ac_cv_hdr_def_tiocdcdtimestamp" in *yes*) ac_cv_var_tty_clk=yes ;; + *) ac_cv_var_tty_clk=no ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_var_tty_clk" >&5 -echo "${ECHO_T}$ac_cv_var_tty_clk" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tty_clk" >&5 +$as_echo "$ac_cv_var_tty_clk" >&6; } case "$ac_cv_var_tty_clk" in yes) -cat >>confdefs.h <<\_ACEOF -#define TTYCLK 1 -_ACEOF +$as_echo "#define TTYCLK 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for the ppsclock streams module" >&5 -echo $ECHO_N "checking for the ppsclock streams module... $ECHO_C" >&6 -if test "${ac_cv_var_ppsclock+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the ppsclock streams module" >&5 +$as_echo_n "checking for the ppsclock streams module... " >&6; } +if test "${ac_cv_var_ppsclock+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_var_ppsclock=$ac_cv_struct_ppsclockev fi -echo "$as_me:$LINENO: result: $ac_cv_var_ppsclock" >&5 -echo "${ECHO_T}$ac_cv_var_ppsclock" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_ppsclock" >&5 +$as_echo "$ac_cv_var_ppsclock" >&6; } case "$ac_cv_var_ppsclock" in yes) -cat >>confdefs.h <<\_ACEOF -#define PPS 1 -_ACEOF +$as_echo "#define PPS 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for kernel multicast support" >&5 -echo $ECHO_N "checking for kernel multicast support... $ECHO_C" >&6 -if test "${ac_cv_var_mcast+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kernel multicast support" >&5 +$as_echo_n "checking for kernel multicast support... " >&6; } +if test "${ac_cv_var_mcast+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_var_mcast=no case "$host" in i386-sequent-sysv4) ;; - *) cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + *) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef IP_ADD_MEMBERSHIP @@ -49062,29 +22212,27 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ac_cv_var_mcast=yes fi rm -f conftest* ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_var_mcast" >&5 -echo "${ECHO_T}$ac_cv_var_mcast" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_mcast" >&5 +$as_echo "$ac_cv_var_mcast" >&6; } case "$ac_cv_var_mcast" in yes) -cat >>confdefs.h <<\_ACEOF -#define MCAST 1 -_ACEOF +$as_echo "#define MCAST 1" >>confdefs.h - echo "$as_me:$LINENO: checking arg type needed for IP*_MULTICAST_LOOP for setsockopt()" >&5 -echo $ECHO_N "checking arg type needed for IP*_MULTICAST_LOOP for setsockopt()... $ECHO_C" >&6 -if test "${ac_cv_var_typeof_ip_multicast_loop+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking arg type needed for IP*_MULTICAST_LOOP for setsockopt()" >&5 +$as_echo_n "checking arg type needed for IP*_MULTICAST_LOOP for setsockopt()... " >&6; } +if test "${ac_cv_var_typeof_ip_multicast_loop+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in - *-*-netbsd*|*-*-linux*) + *-*-netbsd*|*-*-*linux*) ac_cv_var_typeof_ip_multicast_loop=u_int ;; *-*-winnt*) @@ -49094,8 +22242,8 @@ else ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_var_typeof_ip_multicast_loop" >&5 -echo "${ECHO_T}$ac_cv_var_typeof_ip_multicast_loop" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_typeof_ip_multicast_loop" >&5 +$as_echo "$ac_cv_var_typeof_ip_multicast_loop" >&6; } cat >>confdefs.h <<_ACEOF #define TYPEOF_IP_MULTICAST_LOOP $ac_cv_var_typeof_ip_multicast_loop @@ -49104,10 +22252,10 @@ _ACEOF ;; esac -echo "$as_me:$LINENO: checking availability of ntp_{adj,get}time()" >&5 -echo $ECHO_N "checking availability of ntp_{adj,get}time()... $ECHO_C" >&6 -if test "${ac_cv_var_ntp_syscalls+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking availability of ntp_{adj,get}time()" >&5 +$as_echo_n "checking availability of ntp_{adj,get}time()... " >&6; } +if test "${ac_cv_var_ntp_syscalls+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_var_ntp_syscalls=no case "$ac_cv_func_ntp_adjtime$ac_cv_func_ntp_gettime$ac_cv_func___adjtimex" in @@ -49117,11 +22265,7 @@ else *yes) ac_cv_var_ntp_syscalls=inline ;; - *) cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + *) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if defined(SYS_ntp_gettime) && defined(SYS_ntp_adjtime) @@ -49130,7 +22274,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ac_cv_var_ntp_syscalls=kernel fi rm -f conftest* @@ -49138,37 +22282,29 @@ rm -f conftest* ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_var_ntp_syscalls" >&5 -echo "${ECHO_T}$ac_cv_var_ntp_syscalls" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_ntp_syscalls" >&5 +$as_echo "$ac_cv_var_ntp_syscalls" >&6; } case "$ac_cv_var_ntp_syscalls" in libc) -cat >>confdefs.h <<\_ACEOF -#define NTP_SYSCALLS_LIBC 1 -_ACEOF +$as_echo "#define NTP_SYSCALLS_LIBC 1" >>confdefs.h ;; kernel) -cat >>confdefs.h <<\_ACEOF -#define NTP_SYSCALLS_STD 1 -_ACEOF +$as_echo "#define NTP_SYSCALLS_STD 1" >>confdefs.h ;; *) ;; esac -echo "$as_me:$LINENO: checking if sys/timex.h has STA_FLL" >&5 -echo $ECHO_N "checking if sys/timex.h has STA_FLL... $ECHO_C" >&6 -if test "${ac_cv_var_sta_fll+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if sys/timex.h has STA_FLL" >&5 +$as_echo_n "checking if sys/timex.h has STA_FLL... " >&6; } +if test "${ac_cv_var_sta_fll+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef STA_FLL @@ -49177,7 +22313,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ac_cv_var_sta_fll=yes else ac_cv_var_sta_fll=no @@ -49185,13 +22321,13 @@ fi rm -f conftest* fi -echo "$as_me:$LINENO: result: $ac_cv_var_sta_fll" >&5 -echo "${ECHO_T}$ac_cv_var_sta_fll" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_sta_fll" >&5 +$as_echo "$ac_cv_var_sta_fll" >&6; } -echo "$as_me:$LINENO: checking if we have kernel PLL support" >&5 -echo $ECHO_N "checking if we have kernel PLL support... $ECHO_C" >&6 -if test "${ac_cv_var_kernel_pll+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have kernel PLL support" >&5 +$as_echo_n "checking if we have kernel PLL support... " >&6; } +if test "${ac_cv_var_kernel_pll+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$ac_cv_header_sys_timex_h$ac_cv_struct_ntptimeval$ac_cv_var_sta_fll$ac_cv_var_ntp_syscalls" in *no*) @@ -49201,22 +22337,20 @@ else ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_var_kernel_pll" >&5 -echo "${ECHO_T}$ac_cv_var_kernel_pll" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_kernel_pll" >&5 +$as_echo "$ac_cv_var_kernel_pll" >&6; } case "$ac_cv_var_kernel_pll" in yes) -cat >>confdefs.h <<\_ACEOF -#define KERNEL_PLL 1 -_ACEOF +$as_echo "#define KERNEL_PLL 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if SIOCGIFCONF returns buffer size in the buffer" >&5 -echo $ECHO_N "checking if SIOCGIFCONF returns buffer size in the buffer... $ECHO_C" >&6 -if test "${ac_cv_var_size_returned_in_buffer+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if SIOCGIFCONF returns buffer size in the buffer" >&5 +$as_echo_n "checking if SIOCGIFCONF returns buffer size in the buffer... " >&6; } +if test "${ac_cv_var_size_returned_in_buffer+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$host" in @@ -49232,26 +22366,20 @@ else esac ac_cv_var_size_returned_in_buffer=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_size_returned_in_buffer" >&5 -echo "${ECHO_T}$ac_cv_var_size_returned_in_buffer" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_size_returned_in_buffer" >&5 +$as_echo "$ac_cv_var_size_returned_in_buffer" >&6; } case "$ac_cv_var_size_returned_in_buffer" in yes) -cat >>confdefs.h <<\_ACEOF -#define SIZE_RETURNED_IN_BUFFER 1 -_ACEOF +$as_echo "#define SIZE_RETURNED_IN_BUFFER 1" >>confdefs.h ;; esac # Check for ioctls TIOCGPPSEV -echo "$as_me:$LINENO: checking ioctl TIOCGPPSEV" >&5 -echo $ECHO_N "checking ioctl TIOCGPPSEV... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ioctl TIOCGPPSEV" >&5 +$as_echo_n "checking ioctl TIOCGPPSEV... " >&6; } if test "$ac_cv_header_termios_h" = "yes"; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef TIOCGPPSEV @@ -49260,7 +22388,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ntp_ok=yes else ntp_ok=no @@ -49272,24 +22400,18 @@ ntp_ok=no fi if test "$ntp_ok" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_TIOCGPPSEV 1 -_ACEOF +$as_echo "#define HAVE_TIOCGPPSEV 1" >>confdefs.h ac_cv_var_oncore_ok=yes fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # Check for ioctls TIOCSPPS -echo "$as_me:$LINENO: checking ioctl TIOCSPPS" >&5 -echo $ECHO_N "checking ioctl TIOCSPPS... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ioctl TIOCSPPS" >&5 +$as_echo_n "checking ioctl TIOCSPPS... " >&6; } if test "$ac_cv_header_termios_h" = "yes"; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef TIOCSPPS @@ -49298,7 +22420,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ntp_ok=yes else ntp_ok=no @@ -49311,23 +22433,17 @@ fi if test "$ntp_ok" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_TIOCSPPS 1 -_ACEOF +$as_echo "#define HAVE_TIOCSPPS 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # Check for ioctls CIOGETEV -echo "$as_me:$LINENO: checking ioctl CIOGETEV" >&5 -echo $ECHO_N "checking ioctl CIOGETEV... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ioctl CIOGETEV" >&5 +$as_echo_n "checking ioctl CIOGETEV... " >&6; } if test "$ac_cv_header_sys_ppsclock_h" = "yes"; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef CIOGETEV @@ -49336,7 +22452,7 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ntp_ok=yes else ntp_ok=no @@ -49349,13 +22465,11 @@ fi if test "$ntp_ok" = "yes"; then ac_cv_var_oncore_ok=yes -cat >>confdefs.h <<\_ACEOF -#define HAVE_CIOGETEV 1 -_ACEOF +$as_echo "#define HAVE_CIOGETEV 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # ATOM/PPSAPI stuff. @@ -49382,9 +22496,7 @@ case "$ac_cv_c_inline$ac_cv_struct_timespec" in case "$ac_cv_header_timepps_h$ac_cv_header_sys_timepps_h$host_os" in *yes* | *sunos* | *solaris* | *sco* | *netbsd* ) -cat >>confdefs.h <<\_ACEOF -#define HAVE_PPSAPI 1 -_ACEOF +$as_echo "#define HAVE_PPSAPI 1" >>confdefs.h ac_cv_var_jupiter_ok=yes ac_cv_var_oncore_ok=yes @@ -49396,154 +22508,17 @@ _ACEOF esac # Check for ioctls TIOCGSERIAL, TIOCSSERIAL, ASYNC_PPS_CD_POS, ASYNC_PPS_CD_NEG -if test "${ac_cv_header_linux_serial_h+set}" = set; then - echo "$as_me:$LINENO: checking for linux/serial.h" >&5 -echo $ECHO_N "checking for linux/serial.h... $ECHO_C" >&6 -if test "${ac_cv_header_linux_serial_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: $ac_cv_header_linux_serial_h" >&5 -echo "${ECHO_T}$ac_cv_header_linux_serial_h" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking linux/serial.h usability" >&5 -echo $ECHO_N "checking linux/serial.h usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking linux/serial.h presence" >&5 -echo $ECHO_N "checking linux/serial.h presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: linux/serial.h: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: linux/serial.h: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: linux/serial.h: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: linux/serial.h: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: linux/serial.h: present but cannot be compiled" >&5 -echo "$as_me: WARNING: linux/serial.h: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: linux/serial.h: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: linux/serial.h: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: linux/serial.h: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: linux/serial.h: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: linux/serial.h: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: linux/serial.h: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: linux/serial.h: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: linux/serial.h: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: linux/serial.h: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: linux/serial.h: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------ ## -## Report this to the ntp lists. ## -## ------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for linux/serial.h" >&5 -echo $ECHO_N "checking for linux/serial.h... $ECHO_C" >&6 -if test "${ac_cv_header_linux_serial_h+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_header_linux_serial_h=$ac_header_preproc -fi -echo "$as_me:$LINENO: result: $ac_cv_header_linux_serial_h" >&5 -echo "${ECHO_T}$ac_cv_header_linux_serial_h" >&6 +ac_fn_c_check_header_mongrel "$LINENO" "linux/serial.h" "ac_cv_header_linux_serial_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_serial_h" = x""yes; then : fi -echo "$as_me:$LINENO: checking ioctl TIOCGSERIAL" >&5 -echo $ECHO_N "checking ioctl TIOCGSERIAL... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ioctl TIOCGSERIAL, TIOCSSERIAL, ASYNC_PPS_CD_POS, ASYNC_PPS_CD_NEG" >&5 +$as_echo_n "checking ioctl TIOCGSERIAL, TIOCSSERIAL, ASYNC_PPS_CD_POS, ASYNC_PPS_CD_NEG... " >&6; } case "$ac_cv_header_sys_ppsclock_h$ac_cv_header_linux_serial_h" in yesyes) - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include typedef int u_int; @@ -49565,7 +22540,7 @@ typedef int u_int; _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ntp_ok=yes fi rm -f conftest* @@ -49577,94 +22552,84 @@ rm -f conftest* esac if test "$ntp_ok" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define HAVE_TIO_SERIAL_STUFF 1 -_ACEOF +$as_echo "#define HAVE_TIO_SERIAL_STUFF 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # Check for SHMEM_STATUS support -echo "$as_me:$LINENO: checking SHMEM_STATUS support" >&5 -echo $ECHO_N "checking SHMEM_STATUS support... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking SHMEM_STATUS support" >&5 +$as_echo_n "checking SHMEM_STATUS support... " >&6; } case "$ac_cv_header_sys_mman_h" in yes) ntp_ok=yes ;; *) ntp_ok=no ;; esac if test "$ntp_ok" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define ONCORE_SHMEM_STATUS 1 -_ACEOF +$as_echo "#define ONCORE_SHMEM_STATUS 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } ntp_refclock=no # HPUX only, and by explicit request -echo "$as_me:$LINENO: checking Datum/Bancomm bc635/VME interface" >&5 -echo $ECHO_N "checking Datum/Bancomm bc635/VME interface... $ECHO_C" >&6 -# Check whether --enable-BANCOMM or --disable-BANCOMM was given. -if test "${enable_BANCOMM+set}" = set; then - enableval="$enable_BANCOMM" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Datum/Bancomm bc635/VME interface" >&5 +$as_echo_n "checking Datum/Bancomm bc635/VME interface... " >&6; } +# Check whether --enable-BANCOMM was given. +if test "${enable_BANCOMM+set}" = set; then : + enableval=$enable_BANCOMM; ntp_ok=$enableval else ntp_ok=no -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_BANC 1 -_ACEOF +$as_echo "#define CLOCK_BANC 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$host" in yes*-*-hpux*) ;; - yes*) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is... no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; + yes*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is... no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; esac #HPUX only, and only by explicit request -echo "$as_me:$LINENO: checking TrueTime GPS receiver/VME interface" >&5 -echo $ECHO_N "checking TrueTime GPS receiver/VME interface... $ECHO_C" >&6 -# Check whether --enable-GPSVME or --disable-GPSVME was given. -if test "${enable_GPSVME+set}" = set; then - enableval="$enable_GPSVME" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking TrueTime GPS receiver/VME interface" >&5 +$as_echo_n "checking TrueTime GPS receiver/VME interface... " >&6; } +# Check whether --enable-GPSVME was given. +if test "${enable_GPSVME+set}" = set; then : + enableval=$enable_GPSVME; ntp_ok=$enableval else ntp_ok=no -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_GPSVME 1 -_ACEOF +$as_echo "#define CLOCK_GPSVME 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$host" in yes*-*-hpux*) ;; - yes*) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is... no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; + yes*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is... no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; esac -echo "$as_me:$LINENO: checking for PCL720 clock support" >&5 -echo $ECHO_N "checking for PCL720 clock support... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PCL720 clock support" >&5 +$as_echo_n "checking for PCL720 clock support... " >&6; } case "$ac_cv_header_machine_inline_h$ac_cv_header_sys_pcl720_h$ac_cv_header_sys_i8253_h" in yesyesyes) -cat >>confdefs.h <<\_ACEOF -#define CLOCK_PPS720 1 -_ACEOF +$as_echo "#define CLOCK_PPS720 1" >>confdefs.h ans=yes ;; @@ -49672,24 +22637,24 @@ _ACEOF ans=no ;; esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking for default inclusion of all suitable non-PARSE clocks" >&5 -echo $ECHO_N "checking for default inclusion of all suitable non-PARSE clocks... $ECHO_C" >&6 -# Check whether --enable-all-clocks or --disable-all-clocks was given. -if test "${enable_all_clocks+set}" = set; then - enableval="$enable_all_clocks" - ntp_eac=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for default inclusion of all suitable non-PARSE clocks" >&5 +$as_echo_n "checking for default inclusion of all suitable non-PARSE clocks... " >&6; } +# Check whether --enable-all-clocks was given. +if test "${enable_all_clocks+set}" = set; then : + enableval=$enable_all_clocks; ntp_eac=$enableval else ntp_eac=yes -fi; -echo "$as_me:$LINENO: result: $ntp_eac" >&5 -echo "${ECHO_T}$ntp_eac" >&6 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_eac" >&5 +$as_echo "$ntp_eac" >&6; } # HMS: Should we also require ac_cv_var_parse_ok? -echo "$as_me:$LINENO: checking if we have support for PARSE clocks" >&5 -echo $ECHO_N "checking if we have support for PARSE clocks... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have support for PARSE clocks" >&5 +$as_echo_n "checking if we have support for PARSE clocks... " >&6; } case "$ac_cv_var_atom_ok$ac_cv_header_termio_h$ac_cv_header_termios_h" in yes*yes*) ntp_canparse=yes @@ -49697,49 +22662,42 @@ case "$ac_cv_var_atom_ok$ac_cv_header_termio_h$ac_cv_header_termios_h" in *) ntp_canparse=no ;; esac -echo "$as_me:$LINENO: result: $ntp_canparse" >&5 -echo "${ECHO_T}$ntp_canparse" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_canparse" >&5 +$as_echo "$ntp_canparse" >&6; } -echo "$as_me:$LINENO: checking if we have support for audio clocks" >&5 -echo $ECHO_N "checking if we have support for audio clocks... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have support for audio clocks" >&5 +$as_echo_n "checking if we have support for audio clocks... " >&6; } case "$ac_cv_header_sun_audioio_h$ac_cv_header_sys_audioio_h$ac_cv_header_machine_soundcard_h$ac_cv_header_sys_soundcard_h" in *yes*) ntp_canaudio=yes -cat >>confdefs.h <<\_ACEOF -#define HAVE_AUDIO -_ACEOF +$as_echo "#define HAVE_AUDIO /**/" >>confdefs.h ;; *) ntp_canaudio=no ;; esac -echo "$as_me:$LINENO: result: $ntp_canaudio" >&5 -echo "${ECHO_T}$ntp_canaudio" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_canaudio" >&5 +$as_echo "$ntp_canaudio" >&6; } -echo "$as_me:$LINENO: checking if we have support for the SHM refclock interface" >&5 -echo $ECHO_N "checking if we have support for the SHM refclock interface... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have support for the SHM refclock interface" >&5 +$as_echo_n "checking if we have support for the SHM refclock interface... " >&6; } case "$ac_cv_header_sys_ipc_h$ac_cv_header_sys_shm_h" in yesyes) ntp_canshm=yes ;; *) ntp_canshm=no ;; esac -echo "$as_me:$LINENO: result: $ntp_canshm" >&5 -echo "${ECHO_T}$ntp_canshm" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_canshm" >&5 +$as_echo "$ntp_canshm" >&6; } # Requires modem control -echo "$as_me:$LINENO: checking ACTS modem service" >&5 -echo $ECHO_N "checking ACTS modem service... $ECHO_C" >&6 -# Check whether --enable-ACTS or --disable-ACTS was given. -if test "${enable_ACTS+set}" = set; then - enableval="$enable_ACTS" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ACTS modem service" >&5 +$as_echo_n "checking ACTS modem service... " >&6; } +# Check whether --enable-ACTS was given. +if test "${enable_ACTS+set}" = set; then : + enableval=$enable_ACTS; ntp_ok=$enableval else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_IOCTL_H @@ -49751,183 +22709,167 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ntp_ok=$ntp_eac else ntp_ok=no fi rm -f conftest* -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_ACTS 1 -_ACEOF +$as_echo "#define CLOCK_ACTS 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Arbiter 1088A/B GPS receiver" >&5 -echo $ECHO_N "checking Arbiter 1088A/B GPS receiver... $ECHO_C" >&6 -# Check whether --enable-ARBITER or --disable-ARBITER was given. -if test "${enable_ARBITER+set}" = set; then - enableval="$enable_ARBITER" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Arbiter 1088A/B GPS receiver" >&5 +$as_echo_n "checking Arbiter 1088A/B GPS receiver... " >&6; } +# Check whether --enable-ARBITER was given. +if test "${enable_ARBITER+set}" = set; then : + enableval=$enable_ARBITER; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_ARBITER 1 -_ACEOF +$as_echo "#define CLOCK_ARBITER 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Arcron MSF receiver" >&5 -echo $ECHO_N "checking Arcron MSF receiver... $ECHO_C" >&6 -# Check whether --enable-ARCRON_MSF or --disable-ARCRON_MSF was given. -if test "${enable_ARCRON_MSF+set}" = set; then - enableval="$enable_ARCRON_MSF" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Arcron MSF receiver" >&5 +$as_echo_n "checking Arcron MSF receiver... " >&6; } +# Check whether --enable-ARCRON_MSF was given. +if test "${enable_ARCRON_MSF+set}" = set; then : + enableval=$enable_ARCRON_MSF; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_ARCRON_MSF 1 -_ACEOF +$as_echo "#define CLOCK_ARCRON_MSF 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Austron 2200A/2201A GPS receiver" >&5 -echo $ECHO_N "checking Austron 2200A/2201A GPS receiver... $ECHO_C" >&6 -# Check whether --enable-AS2201 or --disable-AS2201 was given. -if test "${enable_AS2201+set}" = set; then - enableval="$enable_AS2201" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Austron 2200A/2201A GPS receiver" >&5 +$as_echo_n "checking Austron 2200A/2201A GPS receiver... " >&6; } +# Check whether --enable-AS2201 was given. +if test "${enable_AS2201+set}" = set; then : + enableval=$enable_AS2201; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_AS2201 1 -_ACEOF +$as_echo "#define CLOCK_AS2201 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking ATOM PPS interface" >&5 -echo $ECHO_N "checking ATOM PPS interface... $ECHO_C" >&6 -# Check whether --enable-ATOM or --disable-ATOM was given. -if test "${enable_ATOM+set}" = set; then - enableval="$enable_ATOM" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ATOM PPS interface" >&5 +$as_echo_n "checking ATOM PPS interface... " >&6; } +# Check whether --enable-ATOM was given. +if test "${enable_ATOM+set}" = set; then : + enableval=$enable_ATOM; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + case "$ac_cv_var_atom_ok" in no) ntp_ok=no ;; esac if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_ATOM 1 -_ACEOF +$as_echo "#define CLOCK_ATOM 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Chrono-log K-series WWVB receiver" >&5 -echo $ECHO_N "checking Chrono-log K-series WWVB receiver... $ECHO_C" >&6 -# Check whether --enable-CHRONOLOG or --disable-CHRONOLOG was given. -if test "${enable_CHRONOLOG+set}" = set; then - enableval="$enable_CHRONOLOG" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Chrono-log K-series WWVB receiver" >&5 +$as_echo_n "checking Chrono-log K-series WWVB receiver... " >&6; } +# Check whether --enable-CHRONOLOG was given. +if test "${enable_CHRONOLOG+set}" = set; then : + enableval=$enable_CHRONOLOG; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_CHRONOLOG 1 -_ACEOF +$as_echo "#define CLOCK_CHRONOLOG 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking CHU modem/decoder" >&5 -echo $ECHO_N "checking CHU modem/decoder... $ECHO_C" >&6 -# Check whether --enable-CHU or --disable-CHU was given. -if test "${enable_CHU+set}" = set; then - enableval="$enable_CHU" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CHU modem/decoder" >&5 +$as_echo_n "checking CHU modem/decoder... " >&6; } +# Check whether --enable-CHU was given. +if test "${enable_CHU+set}" = set; then : + enableval=$enable_CHU; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_CHU 1 -_ACEOF +$as_echo "#define CLOCK_CHU 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } ac_refclock_chu=$ntp_ok -echo "$as_me:$LINENO: checking CHU audio/decoder" >&5 -echo $ECHO_N "checking CHU audio/decoder... $ECHO_C" >&6 -# Check whether --enable-AUDIO-CHU or --disable-AUDIO-CHU was given. -if test "${enable_AUDIO_CHU+set}" = set; then - enableval="$enable_AUDIO_CHU" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CHU audio/decoder" >&5 +$as_echo_n "checking CHU audio/decoder... " >&6; } +# Check whether --enable-AUDIO-CHU was given. +if test "${enable_AUDIO_CHU+set}" = set; then : + enableval=$enable_AUDIO_CHU; ntp_ok=$enableval else case "$ntp_eac$ac_refclock_chu$ntp_canaudio" in *no*) ntp_ok=no ;; *) ntp_ok=yes ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define AUDIO_CHU 1 -_ACEOF +$as_echo "#define AUDIO_CHU 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # We used to check for sunos/solaris target... case "$ntp_ok$ac_refclock_chu$ntp_canaudio" in - yes*no*) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is...no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is...no ***" >&2;} ;; + yes*no*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is...no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is...no ***" >&2;} ;; esac # Not under HP-UX -echo "$as_me:$LINENO: checking Datum Programmable Time System" >&5 -echo $ECHO_N "checking Datum Programmable Time System... $ECHO_C" >&6 -# Check whether --enable-DATUM or --disable-DATUM was given. -if test "${enable_DATUM+set}" = set; then - enableval="$enable_DATUM" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Datum Programmable Time System" >&5 +$as_echo_n "checking Datum Programmable Time System... " >&6; } +# Check whether --enable-DATUM was given. +if test "${enable_DATUM+set}" = set; then : + enableval=$enable_DATUM; ntp_ok=$enableval else case "$ac_cv_header_termios_h" in yes) @@ -49936,71 +22878,61 @@ else *) ntp_ok=no ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_DATUM 1 -_ACEOF +$as_echo "#define CLOCK_DATUM 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Dumb generic hh:mm:ss local clock" >&5 -echo $ECHO_N "checking Dumb generic hh:mm:ss local clock... $ECHO_C" >&6 -# Check whether --enable-DUMBCLOCK or --disable-DUMBCLOCK was given. -if test "${enable_DUMBCLOCK+set}" = set; then - enableval="$enable_DUMBCLOCK" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Dumb generic hh:mm:ss local clock" >&5 +$as_echo_n "checking Dumb generic hh:mm:ss local clock... " >&6; } +# Check whether --enable-DUMBCLOCK was given. +if test "${enable_DUMBCLOCK+set}" = set; then : + enableval=$enable_DUMBCLOCK; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_DUMBCLOCK 1 -_ACEOF +$as_echo "#define CLOCK_DUMBCLOCK 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Forum Graphic GPS" >&5 -echo $ECHO_N "checking Forum Graphic GPS... $ECHO_C" >&6 -# Check whether --enable-FG or --disable-FG was given. -if test "${enable_FG+set}" = set; then - enableval="$enable_FG" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Forum Graphic GPS" >&5 +$as_echo_n "checking Forum Graphic GPS... " >&6; } +# Check whether --enable-FG was given. +if test "${enable_FG+set}" = set; then : + enableval=$enable_FG; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_FG 1 -_ACEOF +$as_echo "#define CLOCK_FG 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # Requires modem control -echo "$as_me:$LINENO: checking Heath GC-1000 WWV/WWVH receiver" >&5 -echo $ECHO_N "checking Heath GC-1000 WWV/WWVH receiver... $ECHO_C" >&6 -# Check whether --enable-HEATH or --disable-HEATH was given. -if test "${enable_HEATH+set}" = set; then - enableval="$enable_HEATH" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Heath GC-1000 WWV/WWVH receiver" >&5 +$as_echo_n "checking Heath GC-1000 WWV/WWVH receiver... " >&6; } +# Check whether --enable-HEATH was given. +if test "${enable_HEATH+set}" = set; then : + enableval=$enable_HEATH; ntp_ok=$enableval else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_SYS_IOCTL_H @@ -50012,203 +22944,185 @@ cat >>conftest.$ac_ext <<_ACEOF _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then + $EGREP "yes" >/dev/null 2>&1; then : ntp_ok=$ntp_eac else ntp_ok=no fi rm -f conftest* -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_HEATH 1 -_ACEOF +$as_echo "#define CLOCK_HEATH 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking for hopf serial clock device" >&5 -echo $ECHO_N "checking for hopf serial clock device... $ECHO_C" >&6 -# Check whether --enable-HOPFSERIAL or --disable-HOPFSERIAL was given. -if test "${enable_HOPFSERIAL+set}" = set; then - enableval="$enable_HOPFSERIAL" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for hopf serial clock device" >&5 +$as_echo_n "checking for hopf serial clock device... " >&6; } +# Check whether --enable-HOPFSERIAL was given. +if test "${enable_HOPFSERIAL+set}" = set; then : + enableval=$enable_HOPFSERIAL; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_HOPF_SERIAL 1 -_ACEOF +$as_echo "#define CLOCK_HOPF_SERIAL 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking for hopf PCI clock 6039" >&5 -echo $ECHO_N "checking for hopf PCI clock 6039... $ECHO_C" >&6 -# Check whether --enable-HOPFPCI or --disable-HOPFPCI was given. -if test "${enable_HOPFPCI+set}" = set; then - enableval="$enable_HOPFPCI" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for hopf PCI clock 6039" >&5 +$as_echo_n "checking for hopf PCI clock 6039... " >&6; } +# Check whether --enable-HOPFPCI was given. +if test "${enable_HOPFPCI+set}" = set; then : + enableval=$enable_HOPFPCI; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_HOPF_PCI 1 -_ACEOF +$as_echo "#define CLOCK_HOPF_PCI 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking HP 58503A GPS receiver" >&5 -echo $ECHO_N "checking HP 58503A GPS receiver... $ECHO_C" >&6 -# Check whether --enable-HPGPS or --disable-HPGPS was given. -if test "${enable_HPGPS+set}" = set; then - enableval="$enable_HPGPS" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking HP 58503A GPS receiver" >&5 +$as_echo_n "checking HP 58503A GPS receiver... " >&6; } +# Check whether --enable-HPGPS was given. +if test "${enable_HPGPS+set}" = set; then : + enableval=$enable_HPGPS; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_HPGPS 1 -_ACEOF +$as_echo "#define CLOCK_HPGPS 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking IRIG audio decoder" >&5 -echo $ECHO_N "checking IRIG audio decoder... $ECHO_C" >&6 -# Check whether --enable-IRIG or --disable-IRIG was given. -if test "${enable_IRIG+set}" = set; then - enableval="$enable_IRIG" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking IRIG audio decoder" >&5 +$as_echo_n "checking IRIG audio decoder... " >&6; } +# Check whether --enable-IRIG was given. +if test "${enable_IRIG+set}" = set; then : + enableval=$enable_IRIG; ntp_ok=$enableval else case "$ntp_eac$ntp_canaudio" in *no*) ntp_ok=no ;; *) ntp_ok=yes ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_IRIG 1 -_ACEOF +$as_echo "#define CLOCK_IRIG 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canaudio" in - yesno) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is... no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; + yesno) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is... no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; esac -echo "$as_me:$LINENO: checking for JJY receiver" >&5 -echo $ECHO_N "checking for JJY receiver... $ECHO_C" >&6 -# Check whether --enable-JJY or --disable-JJY was given. -if test "${enable_JJY+set}" = set; then - enableval="$enable_JJY" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JJY receiver" >&5 +$as_echo_n "checking for JJY receiver... " >&6; } +# Check whether --enable-JJY was given. +if test "${enable_JJY+set}" = set; then : + enableval=$enable_JJY; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_JJY 1 -_ACEOF +$as_echo "#define CLOCK_JJY 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Rockwell Jupiter GPS receiver" >&5 -echo $ECHO_N "checking Rockwell Jupiter GPS receiver... $ECHO_C" >&6 -# Check whether --enable-JUPITER or --disable-JUPITER was given. -if test "${enable_JUPITER+set}" = set; then - enableval="$enable_JUPITER" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Rockwell Jupiter GPS receiver" >&5 +$as_echo_n "checking Rockwell Jupiter GPS receiver... " >&6; } +# Check whether --enable-JUPITER was given. +if test "${enable_JUPITER+set}" = set; then : + enableval=$enable_JUPITER; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + case "$ac_cv_var_jupiter_ok" in no) ntp_ok=no ;; esac if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_JUPITER 1 -_ACEOF +$as_echo "#define CLOCK_JUPITER 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Leitch CSD 5300 Master Clock System Driver" >&5 -echo $ECHO_N "checking Leitch CSD 5300 Master Clock System Driver... $ECHO_C" >&6 -# Check whether --enable-LEITCH or --disable-LEITCH was given. -if test "${enable_LEITCH+set}" = set; then - enableval="$enable_LEITCH" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Leitch CSD 5300 Master Clock System Driver" >&5 +$as_echo_n "checking Leitch CSD 5300 Master Clock System Driver... " >&6; } +# Check whether --enable-LEITCH was given. +if test "${enable_LEITCH+set}" = set; then : + enableval=$enable_LEITCH; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_LEITCH 1 -_ACEOF +$as_echo "#define CLOCK_LEITCH 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking local clock reference" >&5 -echo $ECHO_N "checking local clock reference... $ECHO_C" >&6 -# Check whether --enable-LOCAL-CLOCK or --disable-LOCAL-CLOCK was given. -if test "${enable_LOCAL_CLOCK+set}" = set; then - enableval="$enable_LOCAL_CLOCK" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking local clock reference" >&5 +$as_echo_n "checking local clock reference... " >&6; } +# Check whether --enable-LOCAL-CLOCK was given. +if test "${enable_LOCAL_CLOCK+set}" = set; then : + enableval=$enable_LOCAL_CLOCK; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_LOCAL 1 -_ACEOF +$as_echo "#define CLOCK_LOCAL 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # Not Ultrix -echo "$as_me:$LINENO: checking Magnavox MX4200 GPS receiver" >&5 -echo $ECHO_N "checking Magnavox MX4200 GPS receiver... $ECHO_C" >&6 -# Check whether --enable-MX4200 or --disable-MX4200 was given. -if test "${enable_MX4200+set}" = set; then - enableval="$enable_MX4200" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Magnavox MX4200 GPS receiver" >&5 +$as_echo_n "checking Magnavox MX4200 GPS receiver... " >&6; } +# Check whether --enable-MX4200 was given. +if test "${enable_MX4200+set}" = set; then : + enableval=$enable_MX4200; ntp_ok=$enableval else case "$ac_cv_var_ppsclock" in yes) ntp_ok=$ntp_eac @@ -50216,91 +23130,83 @@ else *) ntp_ok=no ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_MX4200 1 -_ACEOF +$as_echo "#define CLOCK_MX4200 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$host" in - yes*-*-ultrix*) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is... no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; + yes*-*-ultrix*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is... no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; esac -echo "$as_me:$LINENO: checking for NeoClock4X receiver" >&5 -echo $ECHO_N "checking for NeoClock4X receiver... $ECHO_C" >&6 -# Check whether --enable-NEOCLOCK4X or --disable-NEOCLOCK4X was given. -if test "${enable_NEOCLOCK4X+set}" = set; then - enableval="$enable_NEOCLOCK4X" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NeoClock4X receiver" >&5 +$as_echo_n "checking for NeoClock4X receiver... " >&6; } +# Check whether --enable-NEOCLOCK4X was given. +if test "${enable_NEOCLOCK4X+set}" = set; then : + enableval=$enable_NEOCLOCK4X; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_NEOCLOCK4X 1 -_ACEOF +$as_echo "#define CLOCK_NEOCLOCK4X 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking NMEA GPS receiver" >&5 -echo $ECHO_N "checking NMEA GPS receiver... $ECHO_C" >&6 -# Check whether --enable-NMEA or --disable-NMEA was given. -if test "${enable_NMEA+set}" = set; then - enableval="$enable_NMEA" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking NMEA GPS receiver" >&5 +$as_echo_n "checking NMEA GPS receiver... " >&6; } +# Check whether --enable-NMEA was given. +if test "${enable_NMEA+set}" = set; then : + enableval=$enable_NMEA; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_NMEA 1 -_ACEOF +$as_echo "#define CLOCK_NMEA 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking for ONCORE Motorola VP/UT Oncore GPS" >&5 -echo $ECHO_N "checking for ONCORE Motorola VP/UT Oncore GPS... $ECHO_C" >&6 -# Check whether --enable-ONCORE or --disable-ONCORE was given. -if test "${enable_ONCORE+set}" = set; then - enableval="$enable_ONCORE" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ONCORE Motorola VP/UT Oncore GPS" >&5 +$as_echo_n "checking for ONCORE Motorola VP/UT Oncore GPS... " >&6; } +# Check whether --enable-ONCORE was given. +if test "${enable_ONCORE+set}" = set; then : + enableval=$enable_ONCORE; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + case "$ac_cv_var_oncore_ok" in no) ntp_ok=no ;; esac if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_ONCORE 1 -_ACEOF +$as_echo "#define CLOCK_ONCORE 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking for Palisade clock" >&5 -echo $ECHO_N "checking for Palisade clock... $ECHO_C" >&6 -# Check whether --enable-PALISADE or --disable-PALISADE was given. -if test "${enable_PALISADE+set}" = set; then - enableval="$enable_PALISADE" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Palisade clock" >&5 +$as_echo_n "checking for Palisade clock... " >&6; } +# Check whether --enable-PALISADE was given. +if test "${enable_PALISADE+set}" = set; then : + enableval=$enable_PALISADE; ntp_ok=$enableval else case "$ac_cv_header_termios_h" in yes) @@ -50309,68 +23215,63 @@ else *) ntp_ok=no ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_PALISADE 1 -_ACEOF +$as_echo "#define CLOCK_PALISADE 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Conrad parallel port radio clock" >&5 -echo $ECHO_N "checking Conrad parallel port radio clock... $ECHO_C" >&6 -# Check whether --enable-PCF or --disable-PCF was given. -if test "${enable_PCF+set}" = set; then - enableval="$enable_PCF" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Conrad parallel port radio clock" >&5 +$as_echo_n "checking Conrad parallel port radio clock... " >&6; } +# Check whether --enable-PCF was given. +if test "${enable_PCF+set}" = set; then : + enableval=$enable_PCF; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_PCF 1 -_ACEOF +$as_echo "#define CLOCK_PCF 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking PST/Traconex 1020 WWV/WWVH receiver" >&5 -echo $ECHO_N "checking PST/Traconex 1020 WWV/WWVH receiver... $ECHO_C" >&6 -# Check whether --enable-PST or --disable-PST was given. -if test "${enable_PST+set}" = set; then - enableval="$enable_PST" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking PST/Traconex 1020 WWV/WWVH receiver" >&5 +$as_echo_n "checking PST/Traconex 1020 WWV/WWVH receiver... " >&6; } +# Check whether --enable-PST was given. +if test "${enable_PST+set}" = set; then : + enableval=$enable_PST; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_PST 1 -_ACEOF +$as_echo "#define CLOCK_PST 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking RIPENCC specific Trimble driver" >&5 -echo $ECHO_N "checking RIPENCC specific Trimble driver... $ECHO_C" >&6 -# Check whether --enable-RIPENCC or --disable-RIPENCC was given. -if test "${enable_RIPENCC+set}" = set; then - enableval="$enable_RIPENCC" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking RIPENCC specific Trimble driver" >&5 +$as_echo_n "checking RIPENCC specific Trimble driver... " >&6; } +# Check whether --enable-RIPENCC was given. +if test "${enable_RIPENCC+set}" = set; then : + enableval=$enable_RIPENCC; ntp_ok=$enableval else ntp_ok=no -fi; +fi + # 020629: HMS: s/$ntp_eac -> -/no because of ptr += sprintf(ptr, ...) usage case "$ac_cv_var_ripe_ncc_ok" in no) ntp_ok=no ;; @@ -50378,65 +23279,58 @@ esac if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_RIPENCC -_ACEOF +$as_echo "#define CLOCK_RIPENCC /**/" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } # Danny Meyer says SHM compiles (with a few warnings) under Win32. # For *IX, we need sys/ipc.h and sys/shm.h. -echo "$as_me:$LINENO: checking for SHM clock attached thru shared memory" >&5 -echo $ECHO_N "checking for SHM clock attached thru shared memory... $ECHO_C" >&6 -# Check whether --enable-SHM or --disable-SHM was given. -if test "${enable_SHM+set}" = set; then - enableval="$enable_SHM" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SHM clock attached thru shared memory" >&5 +$as_echo_n "checking for SHM clock attached thru shared memory... " >&6; } +# Check whether --enable-SHM was given. +if test "${enable_SHM+set}" = set; then : + enableval=$enable_SHM; ntp_ok=$enableval else case "$ntp_eac$ntp_canshm" in *no*) ntp_ok=no ;; *) ntp_ok=yes ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_SHM 1 -_ACEOF +$as_echo "#define CLOCK_SHM 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Spectracom 8170/Netclock/2 WWVB receiver" >&5 -echo $ECHO_N "checking Spectracom 8170/Netclock/2 WWVB receiver... $ECHO_C" >&6 -# Check whether --enable-SPECTRACOM or --disable-SPECTRACOM was given. -if test "${enable_SPECTRACOM+set}" = set; then - enableval="$enable_SPECTRACOM" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Spectracom 8170/Netclock/2 WWVB receiver" >&5 +$as_echo_n "checking Spectracom 8170/Netclock/2 WWVB receiver... " >&6; } +# Check whether --enable-SPECTRACOM was given. +if test "${enable_SPECTRACOM+set}" = set; then : + enableval=$enable_SPECTRACOM; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_SPECTRACOM 1 -_ACEOF +$as_echo "#define CLOCK_SPECTRACOM 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking KSI/Odetics TPRO/S GPS receiver/IRIG interface" >&5 -echo $ECHO_N "checking KSI/Odetics TPRO/S GPS receiver/IRIG interface... $ECHO_C" >&6 -# Check whether --enable-TPRO or --disable-TPRO was given. -if test "${enable_TPRO+set}" = set; then - enableval="$enable_TPRO" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking KSI/Odetics TPRO/S GPS receiver/IRIG interface" >&5 +$as_echo_n "checking KSI/Odetics TPRO/S GPS receiver/IRIG interface... " >&6; } +# Check whether --enable-TPRO was given. +if test "${enable_TPRO+set}" = set; then : + enableval=$enable_TPRO; ntp_ok=$enableval else case "$ac_cv_header_sys_tpro_h" in yes) @@ -50445,30 +23339,28 @@ else *) ntp_ok=no ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_TPRO 1 -_ACEOF +$as_echo "#define CLOCK_TPRO 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ac_cv_header_sys_tpro" in - yesno) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is... no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; + yesno) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is... no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; esac # Not on a vax-dec-bsd -echo "$as_me:$LINENO: checking Kinemetrics/TrueTime receivers" >&5 -echo $ECHO_N "checking Kinemetrics/TrueTime receivers... $ECHO_C" >&6 -# Check whether --enable-TRUETIME or --disable-TRUETIME was given. -if test "${enable_TRUETIME+set}" = set; then - enableval="$enable_TRUETIME" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Kinemetrics/TrueTime receivers" >&5 +$as_echo_n "checking Kinemetrics/TrueTime receivers... " >&6; } +# Check whether --enable-TRUETIME was given. +if test "${enable_TRUETIME+set}" = set; then : + enableval=$enable_TRUETIME; ntp_ok=$enableval else case "$host" in vax-dec-bsd) @@ -50478,115 +23370,106 @@ else ntp_ok=$ntp_eac ;; esac -fi; +fi + + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_TRUETIME 1 -_ACEOF +$as_echo "#define CLOCK_TRUETIME 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$host" in - yesvax-dec-bsd) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is... no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; + yesvax-dec-bsd) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is... no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; esac -echo "$as_me:$LINENO: checking TrueTime 560 IRIG-B decoder" >&5 -echo $ECHO_N "checking TrueTime 560 IRIG-B decoder... $ECHO_C" >&6 -# Check whether --enable-TT560 or --disable-TT560 was given. -if test "${enable_TT560+set}" = set; then - enableval="$enable_TT560" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking TrueTime 560 IRIG-B decoder" >&5 +$as_echo_n "checking TrueTime 560 IRIG-B decoder... " >&6; } +# Check whether --enable-TT560 was given. +if test "${enable_TT560+set}" = set; then : + enableval=$enable_TT560; ntp_ok=$enableval else ntp_ok=no -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_TT560 -_ACEOF +$as_echo "#define CLOCK_TT560 /**/" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking Ultralink M320 WWVB receiver" >&5 -echo $ECHO_N "checking Ultralink M320 WWVB receiver... $ECHO_C" >&6 -# Check whether --enable-ULINK or --disable-ULINK was given. -if test "${enable_ULINK+set}" = set; then - enableval="$enable_ULINK" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Ultralink M320 WWVB receiver" >&5 +$as_echo_n "checking Ultralink M320 WWVB receiver... " >&6; } +# Check whether --enable-ULINK was given. +if test "${enable_ULINK+set}" = set; then : + enableval=$enable_ULINK; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_ULINK 1 -_ACEOF +$as_echo "#define CLOCK_ULINK 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking WWV receiver" >&5 -echo $ECHO_N "checking WWV receiver... $ECHO_C" >&6 -# Check whether --enable-WWV or --disable-WWV was given. -if test "${enable_WWV+set}" = set; then - enableval="$enable_WWV" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking WWV receiver" >&5 +$as_echo_n "checking WWV receiver... " >&6; } +# Check whether --enable-WWV was given. +if test "${enable_WWV+set}" = set; then : + enableval=$enable_WWV; ntp_ok=$enableval else case "$ntp_eac$ntp_canaudio" in *no*) ntp_ok=no ;; *) ntp_ok=yes ;; esac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_WWV 1 -_ACEOF +$as_echo "#define CLOCK_WWV 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canaudio" in - yesno) { echo "$as_me:$LINENO: WARNING: *** But the expected answer is... no ***" >&5 -echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; + yesno) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** But the expected answer is... no ***" >&5 +$as_echo "$as_me: WARNING: *** But the expected answer is... no ***" >&2;} ;; esac -echo "$as_me:$LINENO: checking for Zyfer receiver" >&5 -echo $ECHO_N "checking for Zyfer receiver... $ECHO_C" >&6 -# Check whether --enable-ZYFER or --disable-ZYFER was given. -if test "${enable_ZYFER+set}" = set; then - enableval="$enable_ZYFER" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Zyfer receiver" >&5 +$as_echo_n "checking for Zyfer receiver... " >&6; } +# Check whether --enable-ZYFER was given. +if test "${enable_ZYFER+set}" = set; then : + enableval=$enable_ZYFER; ntp_ok=$enableval else ntp_ok=$ntp_eac -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_ZYFER 1 -_ACEOF +$as_echo "#define CLOCK_ZYFER 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } -echo "$as_me:$LINENO: checking for default inclusion of all suitable PARSE clocks" >&5 -echo $ECHO_N "checking for default inclusion of all suitable PARSE clocks... $ECHO_C" >&6 -# Check whether --enable-parse-clocks or --disable-parse-clocks was given. -if test "${enable_parse_clocks+set}" = set; then - enableval="$enable_parse_clocks" - ntp_eapc=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for default inclusion of all suitable PARSE clocks" >&5 +$as_echo_n "checking for default inclusion of all suitable PARSE clocks... " >&6; } +# Check whether --enable-parse-clocks was given. +if test "${enable_parse_clocks+set}" = set; then : + enableval=$enable_parse_clocks; ntp_eapc=$enableval else case "$ntp_eac" in yes) ntp_eapc=$ntp_canparse ;; @@ -50594,20 +23477,17 @@ else esac # Delete the next line one of these days ntp_eapc=no -fi; -echo "$as_me:$LINENO: result: $ntp_eapc" >&5 -echo "${ECHO_T}$ntp_eapc" >&6 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_eapc" >&5 +$as_echo "$ntp_eapc" >&6; } case "$ntp_eac$ntp_eapc$ntp_canparse" in noyes*) - { { echo "$as_me:$LINENO: error: \"--enable-parse-clocks\" requires \"--enable-all-clocks\"." >&5 -echo "$as_me: error: \"--enable-parse-clocks\" requires \"--enable-all-clocks\"." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "\"--enable-parse-clocks\" requires \"--enable-all-clocks\"." "$LINENO" 5 ;; yesyesno) - { { echo "$as_me:$LINENO: error: You said \"--enable-parse-clocks\" but PARSE isn't supported on this platform!" >&5 -echo "$as_me: error: You said \"--enable-parse-clocks\" but PARSE isn't supported on this platform!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You said \"--enable-parse-clocks\" but PARSE isn't supported on this platform!" "$LINENO" 5 ;; *) ;; esac @@ -50616,170 +23496,148 @@ ntp_libparse=no ntp_parseutil=no ntp_rawdcf=no -echo "$as_me:$LINENO: checking Diem Computime Radio Clock" >&5 -echo $ECHO_N "checking Diem Computime Radio Clock... $ECHO_C" >&6 -# Check whether --enable-COMPUTIME or --disable-COMPUTIME was given. -if test "${enable_COMPUTIME+set}" = set; then - enableval="$enable_COMPUTIME" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Diem Computime Radio Clock" >&5 +$as_echo_n "checking Diem Computime Radio Clock... " >&6; } +# Check whether --enable-COMPUTIME was given. +if test "${enable_COMPUTIME+set}" = set; then : + enableval=$enable_COMPUTIME; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_COMPUTIME 1 -_ACEOF +$as_echo "#define CLOCK_COMPUTIME 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking ELV/DCF7000 clock" >&5 -echo $ECHO_N "checking ELV/DCF7000 clock... $ECHO_C" >&6 -# Check whether --enable-DCF7000 or --disable-DCF7000 was given. -if test "${enable_DCF7000+set}" = set; then - enableval="$enable_DCF7000" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking ELV/DCF7000 clock" >&5 +$as_echo_n "checking ELV/DCF7000 clock... " >&6; } +# Check whether --enable-DCF7000 was given. +if test "${enable_DCF7000+set}" = set; then : + enableval=$enable_DCF7000; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_DCF7000 1 -_ACEOF +$as_echo "#define CLOCK_DCF7000 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking HOPF 6021 clock" >&5 -echo $ECHO_N "checking HOPF 6021 clock... $ECHO_C" >&6 -# Check whether --enable-HOPF6021 or --disable-HOPF6021 was given. -if test "${enable_HOPF6021+set}" = set; then - enableval="$enable_HOPF6021" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking HOPF 6021 clock" >&5 +$as_echo_n "checking HOPF 6021 clock... " >&6; } +# Check whether --enable-HOPF6021 was given. +if test "${enable_HOPF6021+set}" = set; then : + enableval=$enable_HOPF6021; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_HOPF6021 1 -_ACEOF +$as_echo "#define CLOCK_HOPF6021 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking Meinberg clocks" >&5 -echo $ECHO_N "checking Meinberg clocks... $ECHO_C" >&6 -# Check whether --enable-MEINBERG or --disable-MEINBERG was given. -if test "${enable_MEINBERG+set}" = set; then - enableval="$enable_MEINBERG" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Meinberg clocks" >&5 +$as_echo_n "checking Meinberg clocks... " >&6; } +# Check whether --enable-MEINBERG was given. +if test "${enable_MEINBERG+set}" = set; then : + enableval=$enable_MEINBERG; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_MEINBERG 1 -_ACEOF +$as_echo "#define CLOCK_MEINBERG 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking DCF77 raw time code" >&5 -echo $ECHO_N "checking DCF77 raw time code... $ECHO_C" >&6 -# Check whether --enable-RAWDCF or --disable-RAWDCF was given. -if test "${enable_RAWDCF+set}" = set; then - enableval="$enable_RAWDCF" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking DCF77 raw time code" >&5 +$as_echo_n "checking DCF77 raw time code... " >&6; } +# Check whether --enable-RAWDCF was given. +if test "${enable_RAWDCF+set}" = set; then : + enableval=$enable_RAWDCF; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_parseutil=yes ntp_refclock=yes ntp_rawdcf=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_RAWDCF 1 -_ACEOF +$as_echo "#define CLOCK_RAWDCF 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac case "$ntp_rawdcf" in yes) - echo "$as_me:$LINENO: checking if we must enable parity for RAWDCF" >&5 -echo $ECHO_N "checking if we must enable parity for RAWDCF... $ECHO_C" >&6 -if test "${ac_cv_var_rawdcf_parity+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we must enable parity for RAWDCF" >&5 +$as_echo_n "checking if we must enable parity for RAWDCF... " >&6; } +if test "${ac_cv_var_rawdcf_parity+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=no case "$host" in - *-*-linux*) + *-*-*linux*) ans=yes ;; esac ac_cv_var_rawdcf_parity=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_rawdcf_parity" >&5 -echo "${ECHO_T}$ac_cv_var_rawdcf_parity" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_rawdcf_parity" >&5 +$as_echo "$ac_cv_var_rawdcf_parity" >&6; } case "$ac_cv_var_rawdcf_parity" in yes) -cat >>confdefs.h <<\_ACEOF -#define RAWDCF_NO_IGNPAR 1 -_ACEOF +$as_echo "#define RAWDCF_NO_IGNPAR 1" >>confdefs.h ;; esac ;; @@ -50789,205 +23647,175 @@ _ACEOF ;; esac -echo "$as_me:$LINENO: checking RCC 8000 clock" >&5 -echo $ECHO_N "checking RCC 8000 clock... $ECHO_C" >&6 -# Check whether --enable-RCC8000 or --disable-RCC8000 was given. -if test "${enable_RCC8000+set}" = set; then - enableval="$enable_RCC8000" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking RCC 8000 clock" >&5 +$as_echo_n "checking RCC 8000 clock... " >&6; } +# Check whether --enable-RCC8000 was given. +if test "${enable_RCC8000+set}" = set; then : + enableval=$enable_RCC8000; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_RCC8000 1 -_ACEOF +$as_echo "#define CLOCK_RCC8000 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking Schmid DCF77 clock" >&5 -echo $ECHO_N "checking Schmid DCF77 clock... $ECHO_C" >&6 -# Check whether --enable-SCHMID or --disable-SCHMID was given. -if test "${enable_SCHMID+set}" = set; then - enableval="$enable_SCHMID" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Schmid DCF77 clock" >&5 +$as_echo_n "checking Schmid DCF77 clock... " >&6; } +# Check whether --enable-SCHMID was given. +if test "${enable_SCHMID+set}" = set; then : + enableval=$enable_SCHMID; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_SCHMID 1 -_ACEOF +$as_echo "#define CLOCK_SCHMID 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking Trimble GPS receiver/TAIP protocol" >&5 -echo $ECHO_N "checking Trimble GPS receiver/TAIP protocol... $ECHO_C" >&6 -# Check whether --enable-TRIMTAIP or --disable-TRIMTAIP was given. -if test "${enable_TRIMTAIP+set}" = set; then - enableval="$enable_TRIMTAIP" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Trimble GPS receiver/TAIP protocol" >&5 +$as_echo_n "checking Trimble GPS receiver/TAIP protocol... " >&6; } +# Check whether --enable-TRIMTAIP was given. +if test "${enable_TRIMTAIP+set}" = set; then : + enableval=$enable_TRIMTAIP; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_TRIMTAIP 1 -_ACEOF +$as_echo "#define CLOCK_TRIMTAIP 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking Trimble GPS receiver/TSIP protocol" >&5 -echo $ECHO_N "checking Trimble GPS receiver/TSIP protocol... $ECHO_C" >&6 -# Check whether --enable-TRIMTSIP or --disable-TRIMTSIP was given. -if test "${enable_TRIMTSIP+set}" = set; then - enableval="$enable_TRIMTSIP" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Trimble GPS receiver/TSIP protocol" >&5 +$as_echo_n "checking Trimble GPS receiver/TSIP protocol... " >&6; } +# Check whether --enable-TRIMTSIP was given. +if test "${enable_TRIMTSIP+set}" = set; then : + enableval=$enable_TRIMTSIP; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_TRIMTSIP 1 -_ACEOF +$as_echo "#define CLOCK_TRIMTSIP 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking WHARTON 400A Series clock" >&5 -echo $ECHO_N "checking WHARTON 400A Series clock... $ECHO_C" >&6 -# Check whether --enable-WHARTON or --disable-WHARTON was given. -if test "${enable_WHARTON+set}" = set; then - enableval="$enable_WHARTON" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking WHARTON 400A Series clock" >&5 +$as_echo_n "checking WHARTON 400A Series clock... " >&6; } +# Check whether --enable-WHARTON was given. +if test "${enable_WHARTON+set}" = set; then : + enableval=$enable_WHARTON; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_WHARTON_400A 1 -_ACEOF +$as_echo "#define CLOCK_WHARTON_400A 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking VARITEXT clock" >&5 -echo $ECHO_N "checking VARITEXT clock... $ECHO_C" >&6 -# Check whether --enable-VARITEXT or --disable-VARITEXT was given. -if test "${enable_VARITEXT+set}" = set; then - enableval="$enable_VARITEXT" - ntp_ok=$enableval +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking VARITEXT clock" >&5 +$as_echo_n "checking VARITEXT clock... " >&6; } +# Check whether --enable-VARITEXT was given. +if test "${enable_VARITEXT+set}" = set; then : + enableval=$enable_VARITEXT; ntp_ok=$enableval else ntp_ok=$ntp_eapc -fi; +fi + if test "$ntp_ok" = "yes"; then ntp_libparse=yes ntp_refclock=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_VARITEXT 1 -_ACEOF +$as_echo "#define CLOCK_VARITEXT 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_ok" >&5 -echo "${ECHO_T}$ntp_ok" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_ok" >&5 +$as_echo "$ntp_ok" >&6; } case "$ntp_ok$ntp_canparse" in yesno) - { { echo "$as_me:$LINENO: error: That's a parse clock and this system doesn't support it!" >&5 -echo "$as_me: error: That's a parse clock and this system doesn't support it!" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "That's a parse clock and this system doesn't support it!" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking if we need to make and use the parse libraries" >&5 -echo $ECHO_N "checking if we need to make and use the parse libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need to make and use the parse libraries" >&5 +$as_echo_n "checking if we need to make and use the parse libraries... " >&6; } ans=no case "$ntp_libparse" in yes) ans=yes -cat >>confdefs.h <<\_ACEOF -#define CLOCK_PARSE 1 -_ACEOF +$as_echo "#define CLOCK_PARSE 1" >>confdefs.h LIBPARSE=../libparse/libparse.a MAKE_LIBPARSE=libparse.a # HMS: check_y2k trips the 34 year problem now... false && MAKE_CHECK_Y2K=check_y2k -cat >>confdefs.h <<\_ACEOF -#define PPS_SAMPLE 1 -_ACEOF +$as_echo "#define PPS_SAMPLE 1" >>confdefs.h - cat >>confdefs.h <<\_ACEOF -#define CLOCK_ATOM 1 -_ACEOF + $as_echo "#define CLOCK_ATOM 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } # AC_SUBST(RSAOBJS) # AC_SUBST(RSASRCS) @@ -51000,19 +23828,19 @@ echo "${ECHO_T}$ans" >&6 -echo "$as_me:$LINENO: checking for openssl library directory" >&5 -echo $ECHO_N "checking for openssl library directory... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl library directory" >&5 +$as_echo_n "checking for openssl library directory... " >&6; } -# Check whether --with-openssl-libdir or --without-openssl-libdir was given. -if test "${with_openssl_libdir+set}" = set; then - withval="$with_openssl_libdir" - ans=$withval +# Check whether --with-openssl-libdir was given. +if test "${with_openssl_libdir+set}" = set; then : + withval=$with_openssl_libdir; ans=$withval else case "$build" in $host) ans=yes ;; *) ans=no ;; esac -fi; +fi + case "$ans" in no) ;; yes) # Look in: @@ -51047,22 +23875,22 @@ case "$ans" in esac ;; esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking for openssl include directory" >&5 -echo $ECHO_N "checking for openssl include directory... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openssl include directory" >&5 +$as_echo_n "checking for openssl include directory... " >&6; } -# Check whether --with-openssl-incdir or --without-openssl-incdir was given. -if test "${with_openssl_incdir+set}" = set; then - withval="$with_openssl_incdir" - ans=$withval +# Check whether --with-openssl-incdir was given. +if test "${with_openssl_incdir+set}" = set; then : + withval=$with_openssl_incdir; ans=$withval else case "$build" in $host) ans=yes ;; *) ans=no ;; esac -fi; +fi + case "$ans" in no) ;; yes) # look in: @@ -51089,17 +23917,17 @@ case "$ans" in esac ;; esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -# Check whether --with-crypto or --without-crypto was given. -if test "${with_crypto+set}" = set; then - withval="$with_crypto" - ans=$withval +# Check whether --with-crypto was given. +if test "${with_crypto+set}" = set; then : + withval=$with_crypto; ans=$withval else ans=yes -fi; +fi + case "$ans" in no) ;; yes|openssl) @@ -51118,108 +23946,16 @@ case "$ans" in LCRYPTO=-lcrypto -cat >>confdefs.h <<\_ACEOF -#define OPENSSL -_ACEOF +$as_echo "#define OPENSSL /**/" >>confdefs.h - - -for ac_func in EVP_md2 EVP_mdc2 -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in EVP_md2 EVP_mdc2 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -51228,21 +23964,21 @@ done fi ;; esac -echo "$as_me:$LINENO: checking for the level of crypto support" >&5 -echo $ECHO_N "checking for the level of crypto support... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the level of crypto support" >&5 +$as_echo_n "checking for the level of crypto support... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we want to compile with ElectricFence" >&5 -echo $ECHO_N "checking if we want to compile with ElectricFence... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want to compile with ElectricFence" >&5 +$as_echo_n "checking if we want to compile with ElectricFence... " >&6; } -# Check whether --with-electricfence or --without-electricfence was given. -if test "${with_electricfence+set}" = set; then - withval="$with_electricfence" - ans=$withval +# Check whether --with-electricfence was given. +if test "${with_electricfence+set}" = set; then : + withval=$with_electricfence; ans=$withval else ans=no -fi; +fi + case "$ans" in no) ;; *) @@ -51254,12 +23990,12 @@ case "$ans" in ans=yes ;; esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we want to run check-layout" >&5 -echo $ECHO_N "checking if we want to run check-layout... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want to run check-layout" >&5 +$as_echo_n "checking if we want to run check-layout... " >&6; } case "$cross_compiling$PATH_PERL" in no/*) MAKE_CHECK_LAYOUT=check-layout @@ -51269,30 +24005,30 @@ case "$cross_compiling$PATH_PERL" in ans=no ;; esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we can make dcf parse utilities" >&5 -echo $ECHO_N "checking if we can make dcf parse utilities... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can make dcf parse utilities" >&5 +$as_echo_n "checking if we can make dcf parse utilities... " >&6; } ans=no if test "$ntp_parseutil" = "yes"; then case "$host" in - *-*-sunos4*|*-*-solaris2*|*-*-linux*|*-*-netbsd*) + *-*-sunos4*|*-*-solaris2*|*-*-*linux*|*-*-netbsd*) ans="dcfd testdcf" DCFD=dcfd TESTDCF=testdcf ;; esac fi -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we can build kernel streams modules for parse" >&5 -echo $ECHO_N "checking if we can build kernel streams modules for parse... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can build kernel streams modules for parse" >&5 +$as_echo_n "checking if we can build kernel streams modules for parse... " >&6; } ans=no case "$ntp_parseutil$ac_cv_header_sys_stropts_h" in yesyes) @@ -51301,9 +24037,7 @@ case "$ntp_parseutil$ac_cv_header_sys_stropts_h" in case "$ac_cv_var_kernel_pll" in yes) -cat >>confdefs.h <<\_ACEOF -#define PPS_SYNC 1 -_ACEOF +$as_echo "#define PPS_SYNC 1" >>confdefs.h ;; esac @@ -51317,25 +24051,23 @@ _ACEOF esac ;; esac -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we need basic refclock support" >&5 -echo $ECHO_N "checking if we need basic refclock support... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we need basic refclock support" >&5 +$as_echo_n "checking if we need basic refclock support... " >&6; } if test "$ntp_refclock" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define REFCLOCK 1 -_ACEOF +$as_echo "#define REFCLOCK 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ntp_refclock" >&5 -echo "${ECHO_T}$ntp_refclock" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_refclock" >&5 +$as_echo "$ntp_refclock" >&6; } -echo "$as_me:$LINENO: checking if we want HP-UX adjtimed support" >&5 -echo $ECHO_N "checking if we want HP-UX adjtimed support... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want HP-UX adjtimed support" >&5 +$as_echo_n "checking if we want HP-UX adjtimed support... " >&6; } case "$host" in *-*-hpux[56789]*) ans=yes @@ -51346,16 +24078,14 @@ esac if test "$ans" = "yes"; then MAKE_ADJTIMED=adjtimed -cat >>confdefs.h <<\_ACEOF -#define NEED_HPUX_ADJTIME 1 -_ACEOF +$as_echo "#define NEED_HPUX_ADJTIME 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we want QNX adjtime support" >&5 -echo $ECHO_N "checking if we want QNX adjtime support... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want QNX adjtime support" >&5 +$as_echo_n "checking if we want QNX adjtime support... " >&6; } case "$host" in *-*-qnx*) ans=yes @@ -51365,129 +24095,130 @@ case "$host" in esac if test "$ans" = "yes"; then -cat >>confdefs.h <<\_ACEOF -#define NEED_QNX_ADJTIME 1 -_ACEOF +$as_echo "#define NEED_QNX_ADJTIME 1" >>confdefs.h fi -echo "$as_me:$LINENO: result: $ans" >&5 -echo "${ECHO_T}$ans" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } -echo "$as_me:$LINENO: checking if we can read kmem" >&5 -echo $ECHO_N "checking if we can read kmem... $ECHO_C" >&6 -if test "${ac_cv_var_can_kmem+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-kmem or --disable-kmem was given. -if test "${enable_kmem+set}" = set; then - enableval="$enable_kmem" - ans=$enableval -else - case "$ac_cv_func_nlist$ac_cv_func_K_open$ac_cv_func_kvm_open" in - *yes*) - ans=yes - ;; - *) ans=no - ;; - esac - case "$host" in - *-*-aix*) - #ans=no - ;; - *-*-domainos) # Won't be found... - ans=no - ;; - *-*-hpux*) - #ans=no - ;; - *-*-irix[456]*) - ans=no - ;; - *-*-linux*) - ans=no - ;; - *-*-winnt3.5) - ans=no - ;; - *-*-unicosmp*) - ans=no - ;; - esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can read kmem" >&5 +$as_echo_n "checking if we can read kmem... " >&6; } -fi; -ac_cv_var_can_kmem=$ans -fi -echo "$as_me:$LINENO: result: $ac_cv_var_can_kmem" >&5 -echo "${ECHO_T}$ac_cv_var_can_kmem" >&6 +# the default is to enable it if the system has the capability -case "$ac_cv_var_can_kmem" in - *yes*) ;; - *) -cat >>confdefs.h <<\_ACEOF -#define NOKMEM 1 -_ACEOF - ;; +case "$ac_cv_func_nlist$ac_cv_func_K_open$ac_cv_func_kvm_open" in + *yes*) + ans=yes + ;; + *) ans=no esac -echo "$as_me:$LINENO: checking if adjtime is accurate" >&5 -echo $ECHO_N "checking if adjtime is accurate... $ECHO_C" >&6 -if test "${ac_cv_var_adjtime_is_accurate+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-accurate-adjtime or --disable-accurate-adjtime was given. -if test "${enable_accurate_adjtime+set}" = set; then - enableval="$enable_accurate_adjtime" - ans=$enableval -else - case "$host" in - i386-sequent-ptx*) - ans=no - ;; - i386-unknown-osf1*) - ans=yes - ;; - mips-sgi-irix[456]*) - ans=yes - ;; - *-fujitsu-uxp*) - ans=yes - ;; - *-ibm-aix[45]*) - ans=yes - ;; - *-*-linux*) - ans=yes - ;; - *-*-solaris2.[01]) - ans=no - ;; - *-*-solaris2*) - ans=yes - ;; - *-*-unicosmp*) - ans=yes - ;; - *) ans=no - ;; - esac +case "$host" in + *-*-domainos) # Won't be found... + ans=no + ;; + *-*-hpux*) + #ans=no + ;; + *-*-irix[456]*) + ans=no + ;; + *-*-*linux*) + ans=no + ;; + *-*-winnt3.5) + ans=no + ;; + *-*-unicosmp*) + ans=no + ;; +esac + +# --enable-kmem / --disable-kmem controls if present +# Check whether --enable-kmem was given. +if test "${enable_kmem+set}" = set; then : + enableval=$enable_kmem; ans=$enableval -fi; -ac_cv_var_adjtime_is_accurate=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_adjtime_is_accurate" >&5 -echo "${ECHO_T}$ac_cv_var_adjtime_is_accurate" >&6 -case "$ac_cv_var_adjtime_is_accurate" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in yes) -cat >>confdefs.h <<\_ACEOF -#define ADJTIME_IS_ACCURATE 1 -_ACEOF - ;; + can_kmem=yes + ;; + *) + can_kmem=no + +$as_echo "#define NOKMEM 1" >>confdefs.h + esac -echo "$as_me:$LINENO: checking the name of 'tick' in the kernel" >&5 -echo $ECHO_N "checking the name of 'tick' in the kernel... $ECHO_C" >&6 -if test "${ac_cv_var_nlist_tick+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if adjtime is accurate" >&5 +$as_echo_n "checking if adjtime is accurate... " >&6; } + +# target-dependent defaults + +case "$host" in + i386-sequent-ptx*) + ans=no + ;; + i386-unknown-osf1*) + ans=yes + ;; + mips-sgi-irix[456]*) + ans=yes + ;; + *-fujitsu-uxp*) + ans=yes + ;; + *-ibm-aix[456]*) + ans=yes + ;; + *-*-*linux*) + ans=yes + ;; + *-*-solaris2.[01]) + ans=no + ;; + *-*-solaris2*) + ans=yes + ;; + *-*-unicosmp*) + ans=yes + ;; + *) ans=no +esac + +# --enable-accurate-adjtime / --disable-accurate-adjtime +# override the default +# Check whether --enable-accurate-adjtime was given. +if test "${enable_accurate_adjtime+set}" = set; then : + enableval=$enable_accurate_adjtime; ans=$enableval +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in + yes) + +$as_echo "#define ADJTIME_IS_ACCURATE 1" >>confdefs.h + + adjtime_is_accurate=yes + ;; + *) + adjtime_is_accurate=no +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name of 'tick' in the kernel" >&5 +$as_echo_n "checking the name of 'tick' in the kernel... " >&6; } +if test "${ac_cv_var_nlist_tick+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=_tick case "$host" in @@ -51500,7 +24231,7 @@ case "$host" in *-hp-hpux*) ans=old_tick ;; - *-ibm-aix[345]*) + *-ibm-aix[3456]*) ans=no ;; *-*-mpeix*) @@ -51521,8 +24252,8 @@ case "$host" in esac ac_cv_var_nlist_tick=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_nlist_tick" >&5 -echo "${ECHO_T}$ac_cv_var_nlist_tick" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_nlist_tick" >&5 +$as_echo "$ac_cv_var_nlist_tick" >&6; } case "$ac_cv_var_nlist_tick" in ''|no) ;; # HMS: I think we can only get 'no' here... *) @@ -51532,10 +24263,10 @@ _ACEOF ;; esac # -echo "$as_me:$LINENO: checking for the units of 'tick'" >&5 -echo $ECHO_N "checking for the units of 'tick'... $ECHO_C" >&6 -if test "${ac_cv_var_tick_nano+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the units of 'tick'" >&5 +$as_echo_n "checking for the units of 'tick'... " >&6; } +if test "${ac_cv_var_tick_nano+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=usec case "$host" in @@ -51545,22 +24276,20 @@ case "$host" in esac ac_cv_var_tick_nano=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_tick_nano" >&5 -echo "${ECHO_T}$ac_cv_var_tick_nano" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tick_nano" >&5 +$as_echo "$ac_cv_var_tick_nano" >&6; } case "$ac_cv_var_tick_nano" in nsec) -cat >>confdefs.h <<\_ACEOF -#define TICK_NANO 1 -_ACEOF +$as_echo "#define TICK_NANO 1" >>confdefs.h ;; esac # -echo "$as_me:$LINENO: checking the name of 'tickadj' in the kernel" >&5 -echo $ECHO_N "checking the name of 'tickadj' in the kernel... $ECHO_C" >&6 -if test "${ac_cv_var_nlist_tickadj+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name of 'tickadj' in the kernel" >&5 +$as_echo_n "checking the name of 'tickadj' in the kernel... " >&6; } +if test "${ac_cv_var_nlist_tickadj+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=_tickadj case "$host" in @@ -51603,8 +24332,8 @@ case "$host" in esac ac_cv_var_nlist_tickadj=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_nlist_tickadj" >&5 -echo "${ECHO_T}$ac_cv_var_nlist_tickadj" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_nlist_tickadj" >&5 +$as_echo "$ac_cv_var_nlist_tickadj" >&6; } case "$ac_cv_var_nlist_tickadj" in ''|no) ;; # HMS: I think we can only get 'no' here... *) @@ -51614,10 +24343,10 @@ _ACEOF ;; esac # -echo "$as_me:$LINENO: checking for the units of 'tickadj'" >&5 -echo $ECHO_N "checking for the units of 'tickadj'... $ECHO_C" >&6 -if test "${ac_cv_var_tickadj_nano+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the units of 'tickadj'" >&5 +$as_echo_n "checking for the units of 'tickadj'... " >&6; } +if test "${ac_cv_var_tickadj_nano+set}" = set; then : + $as_echo_n "(cached) " >&6 else ans=usec case "$host" in @@ -51627,22 +24356,20 @@ case "$host" in esac ac_cv_var_tickadj_nano=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_tickadj_nano" >&5 -echo "${ECHO_T}$ac_cv_var_tickadj_nano" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tickadj_nano" >&5 +$as_echo "$ac_cv_var_tickadj_nano" >&6; } case "$ac_cv_var_tickadj_nano" in nsec) -cat >>confdefs.h <<\_ACEOF -#define TICKADJ_NANO 1 -_ACEOF +$as_echo "#define TICKADJ_NANO 1" >>confdefs.h ;; esac # -echo "$as_me:$LINENO: checking half-heartedly for 'dosynctodr' in the kernel" >&5 -echo $ECHO_N "checking half-heartedly for 'dosynctodr' in the kernel... $ECHO_C" >&6 -if test "${ac_cv_var_nlist_dosynctodr+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking half-heartedly for 'dosynctodr' in the kernel" >&5 +$as_echo_n "checking half-heartedly for 'dosynctodr' in the kernel... " >&6; } +if test "${ac_cv_var_nlist_dosynctodr+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *-apple-aux[23]*) @@ -51684,8 +24411,8 @@ else esac ac_cv_var_nlist_dosynctodr=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_nlist_dosynctodr" >&5 -echo "${ECHO_T}$ac_cv_var_nlist_dosynctodr" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_nlist_dosynctodr" >&5 +$as_echo "$ac_cv_var_nlist_dosynctodr" >&6; } case "$ac_cv_var_nlist_dosynctodr" in no) ;; *) @@ -51696,10 +24423,10 @@ _ACEOF ;; esac # -echo "$as_me:$LINENO: checking half-heartedly for 'noprintf' in the kernel" >&5 -echo $ECHO_N "checking half-heartedly for 'noprintf' in the kernel... $ECHO_C" >&6 -if test "${ac_cv_var_nlist_noprintf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking half-heartedly for 'noprintf' in the kernel" >&5 +$as_echo_n "checking half-heartedly for 'noprintf' in the kernel... " >&6; } +if test "${ac_cv_var_nlist_noprintf+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *-apple-aux[23]*) @@ -51735,8 +24462,8 @@ else esac ac_cv_var_nlist_noprintf=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_nlist_noprintf" >&5 -echo "${ECHO_T}$ac_cv_var_nlist_noprintf" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_nlist_noprintf" >&5 +$as_echo "$ac_cv_var_nlist_noprintf" >&6; } case "$ac_cv_var_nlist_noprintf" in no) ;; *) @@ -51750,127 +24477,129 @@ esac -echo "$as_me:$LINENO: checking for a default value for 'tick'" >&5 -echo $ECHO_N "checking for a default value for 'tick'... $ECHO_C" >&6 -if test "${ac_cv_var_tick+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-tick or --disable-tick was given. -if test "${enable_tick+set}" = set; then - enableval="$enable_tick" - ans=$enableval -else - ans=no - case "$host" in - XXX-*-pc-cygwin*) - ;; - *-univel-sysv*) - ans=10000 - ;; - *-*-irix*) - ans=10000 - ;; - *-*-linux*) - ans=txc.tick - ;; - *-*-mpeix*) - ans=no - ;; - *-*-winnt3.5) - ans='(every / 10)' - ;; - *-*-unicosmp*) - ans=10000 - ;; - *) - ans='1000000L/hz' - ;; - esac -fi; -ac_cv_var_tick=$ans +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a default value for 'tick'" >&5 +$as_echo_n "checking for a default value for 'tick'... " >&6; } + +# target-dependent default for tick + +case "$host" in + *-*-pc-cygwin*) + as_fn_error "tick needs work for cygwin" "$LINENO" 5 + ;; + *-univel-sysv*) + ans=10000 + ;; + *-*-irix*) + ans=10000 + ;; + *-*-*linux*) + ans=txc.tick + ;; + *-*-mpeix*) + ans=no + ;; + *-*-winnt3.5) + ans='(every / 10)' + ;; + *-*-unicosmp*) + ans=10000 + ;; + *) + ans='1000000L/hz' + ;; +esac + +# Check whether --enable-tick was given. +if test "${enable_tick+set}" = set; then : + enableval=$enable_tick; ans=$enableval + fi -echo "$as_me:$LINENO: result: $ac_cv_var_tick" >&5 -echo "${ECHO_T}$ac_cv_var_tick" >&6 -case "$ac_cv_var_tick" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in ''|no) ;; # HMS: I think we can only get 'no' here... *) cat >>confdefs.h <<_ACEOF -#define PRESET_TICK $ac_cv_var_tick +#define PRESET_TICK $ans _ACEOF ;; esac -echo "$as_me:$LINENO: checking for a default value for 'tickadj'" >&5 -echo $ECHO_N "checking for a default value for 'tickadj'... $ECHO_C" >&6 -if test "${ac_cv_var_tickadj+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-tickadj or --disable-tickadj was given. -if test "${enable_tickadj+set}" = set; then - enableval="$enable_tickadj" - ans=$enableval -else - ans='500/hz' - case "$host" in - *-fujitsu-uxp*) - case "$ac_cv_var_adjtime_is_accurate" in - yes) ans='tick/16' ;; - esac - ;; - XXX-*-pc-cygwin*) - ans=no - ;; - *-univel-sysv*) - ans=80 - ;; - *-*-aix*) - case "$ac_cv_var_can_kmem" in - no) ans=1000 ;; - esac - ;; - *-*-domainos) # Skippy: won't be found... - case "$ac_cv_var_can_kmem" in - no) ans=668 ;; - esac - ;; - *-*-hpux*) - case "$ac_cv_var_adjtime_is_accurate" in - yes) ans='tick/16' ;; - esac - ;; - *-*-irix*) - ans=150 - ;; - *-*-mpeix*) - ans=no - ;; - *-*-sco3.2v5.0*) - ans=10000L/hz - ;; - *-*-solaris2*) - case "$ac_cv_var_adjtime_is_accurate" in - yes) - #ans='tick/16' - ;; - esac - ;; - *-*-winnt3.5) - ans=50 - ;; - *-*-unicosmp*) - ans=150 - ;; - esac -fi; -ac_cv_var_tickadj=$ans + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a default value for 'tickadj'" >&5 +$as_echo_n "checking for a default value for 'tickadj'... " >&6; } + +# target-specific default + +ans='500/hz' + +case "$host" in + *-fujitsu-uxp*) + case "$adjtime_is_accurate" in + yes) + ans='tick/16' + esac + ;; + XXX-*-pc-cygwin*) + ans=no + ;; + *-univel-sysv*) + ans=80 + ;; + *-*-aix*) + case "$can_kmem" in + no) + ans=1000 + esac + ;; + *-*-domainos) # Skippy: won't be found... + case "$can_kmem" in + no) + ans=668 + esac + ;; + *-*-hpux*) + case "$adjtime_is_accurate" in + yes) + ans='tick/16' + esac + ;; + *-*-irix*) + ans=150 + ;; + *-*-mpeix*) + ans=no + ;; + *-*-sco3.2v5.0*) + ans=10000L/hz + ;; + *-*-winnt3.5) + ans=50 + ;; + *-*-unicosmp*) + ans=150 +esac + +# Check whether --enable-tickadj was given. +if test "${enable_tickadj+set}" = set; then : + enableval=$enable_tickadj; ans=$enableval + fi -echo "$as_me:$LINENO: result: $ac_cv_var_tickadj" >&5 -echo "${ECHO_T}$ac_cv_var_tickadj" >&6 -case "$ac_cv_var_tickadj" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +default_tickadj=$ans + +case "$default_tickadj" in ''|no) ;; # HMS: I think we can only get 'no' here... *) cat >>confdefs.h <<_ACEOF -#define PRESET_TICKADJ $ac_cv_var_tickadj +#define PRESET_TICKADJ $default_tickadj _ACEOF ;; esac @@ -51881,35 +24610,31 @@ esac # has this "feature" or any obvious way to test for it. case "$host" in mips-sni-sysv4*) -cat >>confdefs.h <<\_ACEOF -#define RELIANTUNIX_CLOCK 1 -_ACEOF +$as_echo "#define RELIANTUNIX_CLOCK 1" >>confdefs.h ;; esac case "$host" in *-*-sco3.2v5*) -cat >>confdefs.h <<\_ACEOF -#define SCO5_CLOCK 1 -_ACEOF +$as_echo "#define SCO5_CLOCK 1" >>confdefs.h ;; esac ac_cv_make_tickadj=yes -case "$ac_cv_var_can_kmem$ac_cv_var_tick$ac_cv_var_tickadj" in +case "$can_kmem$ac_cv_var_tick$default_tickadj" in nonono) # Don't read KMEM, no presets. Bogus. - { echo "$as_me:$LINENO: WARNING: Can't read kmem" >&5 -echo "$as_me: WARNING: Can't read kmem" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't read kmem, no PRESET_TICK or PRESET_TICKADJ. No tickadj." >&5 +$as_echo "$as_me: WARNING: Can't read kmem, no PRESET_TICK or PRESET_TICKADJ. No tickadj." >&2;} ac_cv_make_tickadj=no ;; nono*) # Don't read KMEM, no PRESET_TICK but PRESET_TICKADJ. Bogus. - { echo "$as_me:$LINENO: WARNING: Can't read kmem but no PRESET_TICK. No tickadj." >&5 -echo "$as_me: WARNING: Can't read kmem but no PRESET_TICK. No tickadj." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't read kmem but no PRESET_TICK. No tickadj." >&5 +$as_echo "$as_me: WARNING: Can't read kmem but no PRESET_TICK. No tickadj." >&2;} ac_cv_make_tickadj=no ;; no*no) # Don't read KMEM, PRESET_TICK but no PRESET_TICKADJ. Bogus. - { echo "$as_me:$LINENO: WARNING: Can't read kmem but no PRESET_TICKADJ. No tickadj." >&5 -echo "$as_me: WARNING: Can't read kmem but no PRESET_TICKADJ. No tickadj." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't read kmem but no PRESET_TICKADJ. No tickadj." >&5 +$as_echo "$as_me: WARNING: Can't read kmem but no PRESET_TICKADJ. No tickadj." >&2;} ac_cv_make_tickadj=no ;; no*) # Don't read KMEM, PRESET_TICK and PRESET_TICKADJ. Cool. @@ -51917,25 +24642,23 @@ echo "$as_me: WARNING: Can't read kmem but no PRESET_TICKADJ. No tickadj." >&2; yesnono) # Read KMEM, no presets. Cool. ;; yesno*) # Read KMEM, no PRESET_TICK but PRESET_TICKADJ. Bogus. - { echo "$as_me:$LINENO: WARNING: PRESET_TICKADJ is defined but not PRESET_TICK. Please report this." >&5 -echo "$as_me: WARNING: PRESET_TICKADJ is defined but not PRESET_TICK. Please report this." >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PRESET_TICKADJ is defined but not PRESET_TICK. Please report this." >&5 +$as_echo "$as_me: WARNING: PRESET_TICKADJ is defined but not PRESET_TICK. Please report this." >&2;} ;; yes*no) # Read KMEM, PRESET_TICK but no PRESET_TICKADJ. Cool. ;; yes*) # READ KMEM, PRESET_TICK and PRESET_TICKADJ. ;; *) # Generally bogus. - { { echo "$as_me:$LINENO: error: This shouldn't happen." >&5 -echo "$as_me: error: This shouldn't happen." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "This shouldn't happen." "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: checking if we want and can make the ntptime utility" >&5 -echo $ECHO_N "checking if we want and can make the ntptime utility... $ECHO_C" >&6 -if test "${ac_cv_make_ntptime+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want and can make the ntptime utility" >&5 +$as_echo_n "checking if we want and can make the ntptime utility... " >&6; } +if test "${ac_cv_make_ntptime+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *) case "$ac_cv_struct_ntptimeval$ac_cv_var_kernel_pll" in @@ -51950,8 +24673,8 @@ else esac ac_cv_make_ntptime=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_make_ntptime" >&5 -echo "${ECHO_T}$ac_cv_make_ntptime" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_make_ntptime" >&5 +$as_echo "$ac_cv_make_ntptime" >&6; } case "$ac_cv_make_ntptime" in yes) MAKE_NTPTIME=ntptime @@ -51982,15 +24705,25 @@ case "$host" in ac_cv_make_tickadj=no ;; esac -echo "$as_me:$LINENO: checking if we want and can make the tickadj utility" >&5 -echo $ECHO_N "checking if we want and can make the tickadj utility... $ECHO_C" >&6 -if test "${ac_cv_make_tickadj+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + +# +# Despite all the above, we always make tickadj. Setting +# ac_cv_make_tickadj before AC_CACHE_CHECK will cause a false +# report that the configuration variable was cached. It may +# be better to simply remove the hunk above, I did not want +# to remove it if there is hope it will be used again. +# +unset ac_cv_make_tickadj + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want and can make the tickadj utility" >&5 +$as_echo_n "checking if we want and can make the tickadj utility... " >&6; } +if test "${ac_cv_make_tickadj+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_make_tickadj=yes fi -echo "$as_me:$LINENO: result: $ac_cv_make_tickadj" >&5 -echo "${ECHO_T}$ac_cv_make_tickadj" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_make_tickadj" >&5 +$as_echo "$ac_cv_make_tickadj" >&6; } case "$ac_cv_make_tickadj" in yes) MAKE_TICKADJ=tickadj @@ -51998,10 +24731,10 @@ case "$ac_cv_make_tickadj" in esac -echo "$as_me:$LINENO: checking if we want and can make the timetrim utility" >&5 -echo $ECHO_N "checking if we want and can make the timetrim utility... $ECHO_C" >&6 -if test "${ac_cv_make_timetrim+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want and can make the timetrim utility" >&5 +$as_echo_n "checking if we want and can make the timetrim utility... " >&6; } +if test "${ac_cv_make_timetrim+set}" = set; then : + $as_echo_n "(cached) " >&6 else case "$host" in *-*-irix*) @@ -52015,8 +24748,8 @@ else ;; esac fi -echo "$as_me:$LINENO: result: $ac_cv_make_timetrim" >&5 -echo "${ECHO_T}$ac_cv_make_timetrim" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_make_timetrim" >&5 +$as_echo "$ac_cv_make_timetrim" >&6; } case "$ac_cv_make_timetrim" in yes) MAKE_TIMETRIM=timetrim @@ -52025,23 +24758,23 @@ esac -echo "$as_me:$LINENO: checking if we want to build the NTPD simulator" >&5 -echo $ECHO_N "checking if we want to build the NTPD simulator... $ECHO_C" >&6 -if test "${ac_cv_var_ntpd_sim+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-simulator or --disable-simulator was given. -if test "${enable_simulator+set}" = set; then - enableval="$enable_simulator" - ans=$enableval + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want to build the NTPD simulator" >&5 +$as_echo_n "checking if we want to build the NTPD simulator... " >&6; } + +# Check whether --enable-simulator was given. +if test "${enable_simulator+set}" = set; then : + enableval=$enable_simulator; ans=$enableval else ans=no -fi; -ac_cv_var_ntpd_sim=$ans + fi -echo "$as_me:$LINENO: result: $ac_cv_var_ntpd_sim" >&5 -echo "${ECHO_T}$ac_cv_var_ntpd_sim" >&6 -case "$ac_cv_var_ntpd_sim" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in yes) MAKE_NTPDSIM=ntpdsim MAKE_LIBNTPSIM=libntpsim.a @@ -52053,305 +24786,483 @@ case "$build" in ;; *) case "$host" in *-*-vxworks*) - LDFLAGS="$LDFLAGS -r" - ;; + LDFLAGS="$LDFLAGS -r" + ;; esac ;; esac -echo "$as_me:$LINENO: checking if we should always slew the time" >&5 -echo $ECHO_N "checking if we should always slew the time... $ECHO_C" >&6 -if test "${ac_cv_var_slew_always+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-slew-always or --disable-slew-always was given. -if test "${enable_slew_always+set}" = set; then - enableval="$enable_slew_always" - ans=$enableval -else - case "$host" in - *-apple-aux[23]*) - ans=yes - ;; - *-*-bsdi[012]*) - ans=no - ;; - *-*-bsdi*) - ans=yes - ;; - *-*-openvms*) # HMS: won't be found - ans=yes - ;; - *) ans=no - ;; - esac -fi; -ac_cv_var_slew_always=$ans +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should always slew the time" >&5 +$as_echo_n "checking if we should always slew the time... " >&6; } + +# target-specific defaults + +case "$host" in + *-apple-aux[23]*) + ans=yes + ;; + *-*-bsdi[012]*) + ans=no + ;; + *-*-bsdi*) + ans=yes + ;; + *-*-openvms*) # HMS: won't be found + ans=yes + ;; + *) ans=no + ;; +esac + +# --enable-slew-always / --disable-slew-always overrides default + +# Check whether --enable-slew-always was given. +if test "${enable_slew_always+set}" = set; then : + enableval=$enable_slew_always; ans=$enableval + fi -echo "$as_me:$LINENO: result: $ac_cv_var_slew_always" >&5 -echo "${ECHO_T}$ac_cv_var_slew_always" >&6 -case "$ac_cv_var_slew_always" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in yes) -cat >>confdefs.h <<\_ACEOF -#define SLEWALWAYS 1 -_ACEOF +$as_echo "#define SLEWALWAYS 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we should step and slew the time" >&5 -echo $ECHO_N "checking if we should step and slew the time... $ECHO_C" >&6 -if test "${ac_cv_var_step_slew+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-step-slew or --disable-step-slew was given. -if test "${enable_step_slew+set}" = set; then - enableval="$enable_step_slew" - ans=$enableval -else - case "$host" in - *-sni-sysv*) - ans=yes - ;; - *-univel-sysv*) - ans=no - ;; - *-*-ptx*) - ans=yes - ;; - *-*-solaris2.1[0-9]*) - ans=no - ;; - *-*-solaris2.[012]*) - ans=yes - ;; - *-*-sysv4*) # HMS: Does this catch Fujitsu UXP? - ans=yes - ;; - *) ans=no - ;; - esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should step and slew the time" >&5 +$as_echo_n "checking if we should step and slew the time... " >&6; } + +case "$host" in + *-sni-sysv*) + ans=yes + ;; + *-univel-sysv*) + ans=no + ;; + *-*-ptx*) + ans=yes + ;; + *-*-solaris2.1[0-9]*) + ans=no + ;; + *-*-solaris2.[012]*) + ans=yes + ;; + *-*-sysv4*) # HMS: Does this catch Fujitsu UXP? + ans=yes + ;; + *) ans=no + ;; +esac + + +# Check whether --enable-step-slew was given. +if test "${enable_step_slew+set}" = set; then : + enableval=$enable_step_slew; ans=$enableval -fi; -ac_cv_var_step_slew=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_step_slew" >&5 -echo "${ECHO_T}$ac_cv_var_step_slew" >&6 -case "$ac_cv_var_step_slew" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in yes) -cat >>confdefs.h <<\_ACEOF -#define STEP_SLEW 1 -_ACEOF +$as_echo "#define STEP_SLEW 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if ntpdate should step the time" >&5 -echo $ECHO_N "checking if ntpdate should step the time... $ECHO_C" >&6 -if test "${ac_cv_var_ntpdate_step+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-ntpdate-step or --disable-ntpdate-step was given. -if test "${enable_ntpdate_step+set}" = set; then - enableval="$enable_ntpdate_step" - ans=$enableval -else - case "$host" in - *-apple-aux[23]*) - ans=yes - ;; - *) ans=no - ;; - esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ntpdate should step the time" >&5 +$as_echo_n "checking if ntpdate should step the time... " >&6; } + +case "$host" in + *-apple-aux[23]*) + ans=yes + ;; + *) ans=no +esac + +# Check whether --enable-ntpdate-step was given. +if test "${enable_ntpdate_step+set}" = set; then : + enableval=$enable_ntpdate_step; ans=$enableval -fi; -ac_cv_var_ntpdate_step=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_ntpdate_step" >&5 -echo "${ECHO_T}$ac_cv_var_ntpdate_step" >&6 -case "$ac_cv_var_ntpdate_step" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in yes) -cat >>confdefs.h <<\_ACEOF -#define FORCE_NTPDATE_STEP 1 -_ACEOF +$as_echo "#define FORCE_NTPDATE_STEP 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we should sync TODR clock every hour" >&5 -echo $ECHO_N "checking if we should sync TODR clock every hour... $ECHO_C" >&6 -if test "${ac_cv_var_sync_todr+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-hourly-todr-sync or --disable-hourly-todr-sync was given. -if test "${enable_hourly_todr_sync+set}" = set; then - enableval="$enable_hourly_todr_sync" - ans=$enableval -else - case "$host" in - *-*-nextstep*) - ans=yes - ;; - *-*-openvms*) # HMS: won't be found - ans=yes - ;; - *) ans=no - ;; - esac -fi; -ac_cv_var_sync_todr=$ans + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should sync TODR clock every hour" >&5 +$as_echo_n "checking if we should sync TODR clock every hour... " >&6; } + +case "$host" in + *-*-nextstep*) + ans=yes + ;; + *-*-openvms*) # HMS: won't be found + ans=yes + ;; + *) + ans=no +esac + +# Check whether --enable-hourly-todr-sync was given. +if test "${enable_hourly_todr_sync+set}" = set; then : + enableval=$enable_hourly_todr_sync; ans=$enableval + fi -echo "$as_me:$LINENO: result: $ac_cv_var_sync_todr" >&5 -echo "${ECHO_T}$ac_cv_var_sync_todr" >&6 + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + case "$ac_cv_var_sync_todr" in yes) -cat >>confdefs.h <<\_ACEOF -#define DOSYNCTODR 1 -_ACEOF +$as_echo "#define DOSYNCTODR 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we should avoid kernel FLL bug" >&5 -echo $ECHO_N "checking if we should avoid kernel FLL bug... $ECHO_C" >&6 -if test "${ac_cv_var_kernel_fll_bug+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-kernel-fll-bug or --disable-kernel-fll-bug was given. -if test "${enable_kernel_fll_bug+set}" = set; then - enableval="$enable_kernel_fll_bug" - ans=$enableval -else - case "$host" in - *-*-solaris2.6) - unamev=`uname -v` - case "$unamev" in - Generic_105181-*) - old_IFS="$IFS" - IFS="-" - set $unamev - IFS="$old_IFS" - if test "$2" -ge 17 - then - # Generic_105181-17 and higher - ans=no - else - ans=yes - fi - ;; - *) ans=yes - ;; - esac - ;; - *-*-solaris2.7) - unamev=`uname -v` - case "$unamev" in - Generic_106541-*) - old_IFS="$IFS" - IFS="-" - set $unamev - IFS="$old_IFS" - if test "$2" -ge 07 - then - # Generic_106541-07 and higher - ans=no - else - ans=yes - fi - ;; - *) ans=yes - ;; - esac - ;; - *) ans=no - ;; - esac -fi; -ac_cv_var_kernel_fll_bug=$ans -fi -echo "$as_me:$LINENO: result: $ac_cv_var_kernel_fll_bug" >&5 -echo "${ECHO_T}$ac_cv_var_kernel_fll_bug" >&6 -case "$ac_cv_var_kernel_fll_bug" in - yes) -cat >>confdefs.h <<\_ACEOF -#define KERNEL_FLL_BUG 1 -_ACEOF - ;; -esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should avoid kernel FLL bug" >&5 +$as_echo_n "checking if we should avoid kernel FLL bug... " >&6; } -echo "$as_me:$LINENO: checking if we should use the IRIG sawtooth filter" >&5 -echo $ECHO_N "checking if we should use the IRIG sawtooth filter... $ECHO_C" >&6 -if test "${ac_cv_var_irig_sucks+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-irig-sawtooth or --disable-irig-sawtooth was given. -if test "${enable_irig_sawtooth+set}" = set; then - enableval="$enable_irig_sawtooth" - ans=$enableval -else - case "$host" in - *-*-solaris2.[89]) +case "$host" in + *-*-solaris2.6) + unamev=`uname -v` + case "$unamev" in + Generic_105181-*) + old_IFS="$IFS" + IFS="-" + set $unamev + IFS="$old_IFS" + if test "$2" -ge 17 + then + # Generic_105181-17 and higher + ans=no + else + ans=yes + fi + ;; + *) ans=yes - ;; - *-*-solaris2.1[0-9]*) - ans=yes - ;; - *) ans=no - ;; esac + ;; + *-*-solaris2.7) + unamev=`uname -v` + case "$unamev" in + Generic_106541-*) + old_IFS="$IFS" + IFS="-" + set $unamev + IFS="$old_IFS" + if test "$2" -ge 07 + then + # Generic_106541-07 and higher + ans=no + else + ans=yes + fi + ;; + *) + ans=yes + esac + ;; + *) + ans=no +esac + +# Check whether --enable-kernel-fll-bug was given. +if test "${enable_kernel_fll_bug+set}" = set; then : + enableval=$enable_kernel_fll_bug; ans=$enableval -fi; -ac_cv_var_irig_sucks=$ans fi -echo "$as_me:$LINENO: result: $ac_cv_var_irig_sucks" >&5 -echo "${ECHO_T}$ac_cv_var_irig_sucks" >&6 -case "$ac_cv_var_irig_sucks" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in yes) -cat >>confdefs.h <<\_ACEOF -#define IRIG_SUCKS 1 -_ACEOF +$as_echo "#define KERNEL_FLL_BUG 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking if we should enable NIST lockclock scheme" >&5 -echo $ECHO_N "checking if we should enable NIST lockclock scheme... $ECHO_C" >&6 -if test "${ac_cv_var_nist_lockclock+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Check whether --enable-nist or --disable-nist was given. -if test "${enable_nist+set}" = set; then - enableval="$enable_nist" - ans=$enableval + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should use the IRIG sawtooth filter" >&5 +$as_echo_n "checking if we should use the IRIG sawtooth filter... " >&6; } + +case "$host" in + *-*-solaris2.[89]) + ans=yes + ;; + *-*-solaris2.1[0-9]*) + ans=yes + ;; + *) ans=no +esac + +# Check whether --enable-irig-sawtooth was given. +if test "${enable_irig_sawtooth+set}" = set; then : + enableval=$enable_irig_sawtooth; ans=$enableval + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in + yes) +$as_echo "#define IRIG_SUCKS 1" >>confdefs.h + ;; +esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should enable NIST lockclock scheme" >&5 +$as_echo_n "checking if we should enable NIST lockclock scheme... " >&6; } + +# Check whether --enable-nist was given. +if test "${enable_nist+set}" = set; then : + enableval=$enable_nist; ans=$enableval else ans=no -fi; -ac_cv_var_nist_lockclock=$ans + fi -echo "$as_me:$LINENO: result: $ac_cv_var_nist_lockclock" >&5 -echo "${ECHO_T}$ac_cv_var_nist_lockclock" >&6 -case "$ac_cv_var_nist_lockclock" in + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in yes) -cat >>confdefs.h <<\_ACEOF -#define LOCKCLOCK 1 -_ACEOF +$as_echo "#define LOCKCLOCK 1" >>confdefs.h ;; esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want support for Samba's signing daemon" >&5 +$as_echo_n "checking if we want support for Samba's signing daemon... " >&6; } + +# Check whether --enable-ntp-signd was given. +if test "${enable_ntp_signd+set}" = set; then : + enableval=$enable_ntp_signd; ans=$enableval +else + ans=no + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in + no) + ntp_signd_path= + ;; + yes) + ntp_signd_path=/var/run/ntp_signd + ;; + *) + ntp_signd_path="$ans" +esac + +case "$ntp_signd_path" in + '') + wintime_default=no + ;; + *) + wintime_default=yes + +$as_echo "#define HAVE_NTP_SIGND /**/" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define NTP_SIGND_PATH "$ntp_signd_path" +_ACEOF + +esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we want the windows symmetric client hack" >&5 +$as_echo_n "checking if we want the windows symmetric client hack... " >&6; } + +# default is no, unless --enable-ntp-signd was given +ans=$wintime_default +unset wintime_default + +# Check whether --enable-wintime was given. +if test "${enable_wintime+set}" = set; then : + enableval=$enable_wintime; ans=$enableval +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ans" >&5 +$as_echo "$ans" >&6; } + +case "$ans" in + yes) + +$as_echo "#define WINTIME /**/" >>confdefs.h + +esac + + +for ac_header in sys/clockctl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/clockctl.h" "ac_cv_header_sys_clockctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_clockctl_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_CLOCKCTL_H 1 +_ACEOF + +fi + +done + + +case "$host" in + *-*-netbsd*) + ans=yes + ;; + *) ans=no + ;; +esac + +# Check whether --enable-clockctl was given. +if test "${enable_clockctl+set}" = set; then : + enableval=$enable_clockctl; ntp_use_dev_clockctl=$enableval +else + ntp_use_dev_clockctl=$ac_cv_header_sys_clockctl_h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should use /dev/clockctl" >&5 +$as_echo_n "checking if we should use /dev/clockctl... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_use_dev_clockctl" >&5 +$as_echo "$ntp_use_dev_clockctl" >&6; } + + +for ac_header in sys/capability.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/capability.h" "ac_cv_header_sys_capability_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_capability_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_CAPABILITY_H 1 +_ACEOF + +fi + +done + +for ac_header in sys/prctl.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/prctl.h" "ac_cv_header_sys_prctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_prctl_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_PRCTL_H 1 +_ACEOF + +fi + +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we have linux capabilities (libcap)" >&5 +$as_echo_n "checking if we have linux capabilities (libcap)... " >&6; } + +case "$ac_cv_header_sys_capability_h$ac_cv_header_sys_prctl_h" in + yesyes) + ntp_have_linuxcaps=yes + ;; + *) + ntp_have_linuxcaps=no +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ntp_have_linuxcaps" >&5 +$as_echo "$ntp_have_linuxcaps" >&6; } + + +# Check whether --enable-linuxcaps was given. +if test "${enable_linuxcaps+set}" = set; then : + enableval=$enable_linuxcaps; ntp_have_linuxcaps=$enableval + +fi + + + +case "$ntp_have_linuxcaps" in + yes) + +$as_echo "#define HAVE_LINUX_CAPABILITIES /**/" >>confdefs.h + + LIBS="$LIBS -lcap" +esac + + +case "$ntp_use_dev_clockctl$ntp_have_linuxcaps" in + *yes*) + +$as_echo "#define HAVE_DROPROOT /**/" >>confdefs.h + +esac + + +for ac_header in libscf.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "libscf.h" "ac_cv_header_libscf_h" "$ac_includes_default" +if test "x$ac_cv_header_libscf_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSCF_H 1 +_ACEOF + +fi + +done + + +case "$ac_cv_header_libscf_h" in + yes) + LSCF=-lscf + +esac + +ac_fn_c_check_func "$LINENO" "setppriv" "ac_cv_func_setppriv" +if test "x$ac_cv_func_setppriv" = x""yes; then : + +$as_echo "#define HAVE_SOLARIS_PRIVS /**/" >>confdefs.h + + +fi + + + # # ISC stuff # if test $ac_cv_struct_sockaddr_has_sa_len = yes; then -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_HAVESALEN -_ACEOF +$as_echo "#define ISC_PLATFORM_HAVESALEN /**/" >>confdefs.h fi -# Check whether --enable-ipv6 or --disable-ipv6 was given. -if test "${enable_ipv6+set}" = set; then - enableval="$enable_ipv6" +# Check whether --enable-ipv6 was given. +if test "${enable_ipv6+set}" = set; then : + enableval=$enable_ipv6; +fi -fi; case "$enable_ipv6" in yes|''|autodetect) @@ -52359,9 +25270,7 @@ case "$enable_ipv6" in powerpc-ibm-aix4*) ;; *) -cat >>confdefs.h <<\_ACEOF -#define WANT_IPV6 -_ACEOF +$as_echo "#define WANT_IPV6 /**/" >>confdefs.h ;; esac @@ -52370,113 +25279,91 @@ _ACEOF ;; esac -echo "$as_me:$LINENO: checking for IPv6 structures" >&5 -echo $ECHO_N "checking for IPv6 structures... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6 structures" >&5 +$as_echo_n "checking for IPv6 structures... " >&6; } +if test "${ac_cv_isc_found_ipv6+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include + + #include + #include + #include + int main () { -struct sockaddr_in6 sin6; return (0); + + struct sockaddr_in6 sin6; + + ; return 0; } -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - found_ipv6=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - found_ipv6=no +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_isc_found_ipv6=yes +else + ac_cv_isc_found_ipv6=no + fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_isc_found_ipv6" >&5 +$as_echo "$ac_cv_isc_found_ipv6" >&6; } # # See whether IPv6 support is provided via a Kame add-on. # This is done before other IPv6 linking tests so LIBS is properly set. # -echo "$as_me:$LINENO: checking for Kame IPv6 support" >&5 -echo $ECHO_N "checking for Kame IPv6 support... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Kame IPv6 support" >&5 +$as_echo_n "checking for Kame IPv6 support... " >&6; } -# Check whether --with-kame or --without-kame was given. -if test "${with_kame+set}" = set; then - withval="$with_kame" - use_kame="$withval" +# Check whether --with-kame was given. +if test "${with_kame+set}" = set; then : + withval=$with_kame; use_kame="$withval" else use_kame="no" -fi; +fi + case "$use_kame" in - no) - ;; - yes) - kame_path=/usr/local/v6 - ;; - *) - kame_path="$use_kame" - ;; + no) + ;; + yes) + kame_path=/usr/local/v6 + ;; + *) + kame_path="$use_kame" + ;; esac case "$use_kame" in - no) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - *) - if test -f $kame_path/lib/libinet6.a; then - echo "$as_me:$LINENO: result: $kame_path/lib/libinet6.a" >&5 -echo "${ECHO_T}$kame_path/lib/libinet6.a" >&6 - LIBS="-L$kame_path/lib -linet6 $LIBS" - else - { { echo "$as_me:$LINENO: error: $kame_path/lib/libinet6.a not found. + no) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) + if test -f $kame_path/lib/libinet6.a; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $kame_path/lib/libinet6.a" >&5 +$as_echo "$kame_path/lib/libinet6.a" >&6; } + LIBS="-L$kame_path/lib -linet6 $LIBS" + else + as_fn_error "$kame_path/lib/libinet6.a not found. Please choose the proper path with the following command: configure --with-kame=PATH -" >&5 -echo "$as_me: error: $kame_path/lib/libinet6.a not found. - -Please choose the proper path with the following command: - - configure --with-kame=PATH -" >&2;} - { (exit 1); exit 1; }; } - fi - ;; +" "$LINENO" 5 + fi + ;; esac # @@ -52488,520 +25375,321 @@ esac # netinet6/in6.h is needed for. # case "$host" in -*-bsdi4.[01]*) - ISC_PLATFORM_NEEDNETINET6IN6H="#define ISC_PLATFORM_NEEDNETINET6IN6H 1" - LWRES_PLATFORM_NEEDNETINET6IN6H="#define LWRES_PLATFORM_NEEDNETINET6IN6H 1" - isc_netinet6in6_hack="#include " - ;; -*) - ISC_PLATFORM_NEEDNETINET6IN6H="#undef ISC_PLATFORM_NEEDNETINET6IN6H" - LWRES_PLATFORM_NEEDNETINET6IN6H="#undef LWRES_PLATFORM_NEEDNETINET6IN6H" - isc_netinet6in6_hack="" - ;; + *-bsdi4.[01]*) + +$as_echo "#define ISC_PLATFORM_NEEDNETINET6IN6H 1" >>confdefs.h + + isc_netinet6in6_hack="#include " + ;; + *) + isc_netinet6in6_hack="" esac # # This is similar to the netinet6/in6.h issue. # case "$host" in -*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) - # UnixWare - # ISC_PLATFORM_NEEDNETINETIN6H="#define ISC_PLATFORM_NEEDNETINETIN6H 1" - # LWRES_PLATFORM_NEEDNETINETIN6H="#define LWRES_PLATFORM_NEEDNETINETIN6H 1" + *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_FIXIN6ISADDR 1 -_ACEOF +$as_echo "#define ISC_PLATFORM_FIXIN6ISADDR 1" >>confdefs.h - isc_netinetin6_hack="#include " - ;; -*) - # ISC_PLATFORM_NEEDNETINETIN6H="#undef ISC_PLATFORM_NEEDNETINETIN6H" - # LWRES_PLATFORM_NEEDNETINETIN6H="#undef LWRES_PLATFORM_NEEDNETINETIN6H" - # ISC_PLATFORM_FIXIN6ISADDR="#undef ISC_PLATFORM_FIXIN6ISADDR" - isc_netinetin6_hack="" - ;; + isc_netinetin6_hack="#include " + ;; + *) + isc_netinetin6_hack="" esac -echo "$as_me:$LINENO: checking for struct if_laddrconf" >&5 -echo $ECHO_N "checking for struct if_laddrconf... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#include - -int -main () -{ - struct if_laddrconf a; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_HAVEIF_LADDRCONF -_ACEOF - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -echo "$as_me:$LINENO: checking for struct if_laddrreq" >&5 -echo $ECHO_N "checking for struct if_laddrreq... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#include - -int -main () -{ - struct if_laddrreq a; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_HAVEIF_LADDRREQ -_ACEOF - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -case "$found_ipv6" in +case "$ac_cv_isc_found_ipv6" in yes) -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_HAVEIPV6 -_ACEOF +$as_echo "#define ISC_PLATFORM_HAVEIPV6 /**/" >>confdefs.h - echo "$as_me:$LINENO: checking for struct sockaddr_in6.sin6_scope_id" >&5 -echo $ECHO_N "checking for struct sockaddr_in6.sin6_scope_id... $ECHO_C" >&6 -if test "${ac_cv_member_struct_sockaddr_in6_sin6_scope_id+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for in6_pktinfo" >&5 +$as_echo_n "checking for in6_pktinfo... " >&6; } +if test "${ac_cv_have_in6_pktinfo+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack + #include + #include + #include + $isc_netinetin6_hack + $isc_netinet6in6_hack int main () { -static struct sockaddr_in6 ac_aggr; -if (ac_aggr.sin6_scope_id) -return 0; + + struct in6_pktinfo xyzzy; + + ; return 0; } + _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_member_struct_sockaddr_in6_sin6_scope_id=yes +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_in6_pktinfo=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_have_in6_pktinfo=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack - - -int -main () -{ -static struct sockaddr_in6 ac_aggr; -if (sizeof ac_aggr.sin6_scope_id) -return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_member_struct_sockaddr_in6_sin6_scope_id=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_member_struct_sockaddr_in6_sin6_scope_id=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_in6_sin6_scope_id" >&5 -echo "${ECHO_T}$ac_cv_member_struct_sockaddr_in6_sin6_scope_id" >&6 -if test $ac_cv_member_struct_sockaddr_in6_sin6_scope_id = yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 -_ACEOF +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_in6_pktinfo" >&5 +$as_echo "$ac_cv_have_in6_pktinfo" >&6; } + case "$ac_cv_have_in6_pktinfo" in + yes) - echo "$as_me:$LINENO: checking for in6_pktinfo" >&5 -echo $ECHO_N "checking for in6_pktinfo... $ECHO_C" >&6 - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ +$as_echo "#define ISC_PLATFORM_HAVEIN6PKTINFO /**/" >>confdefs.h -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack + esac -int -main () -{ -struct in6_pktinfo xyzzy; return (0); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_HAVEIN6PKTINFO -_ACEOF - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -echo "$as_me:$LINENO: result: no -- disabling runtime ipv6 support" >&5 -echo "${ECHO_T}no -- disabling runtime ipv6 support" >&6 -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext # HMS: Use HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID instead? - echo "$as_me:$LINENO: checking for sin6_scope_id in struct sockaddr_in6" >&5 -echo $ECHO_N "checking for sin6_scope_id in struct sockaddr_in6... $ECHO_C" >&6 - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sockaddr_in6.sin6_scope_id" >&5 +$as_echo_n "checking for sockaddr_in6.sin6_scope_id... " >&6; } +if test "${ac_cv_have_sin6_scope_id+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack + + #include + #include + #include + $isc_netinetin6_hack + $isc_netinet6in6_hack int main () { -struct sockaddr_in6 xyzzy; xyzzy.sin6_scope_id = 0; return (0); + + struct sockaddr_in6 xyzzy; + xyzzy.sin6_scope_id = 0; + + ; return 0; } -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_HAVESCOPEID _ACEOF - +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_sin6_scope_id=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_have_sin6_scope_id=no -result="#define LWRES_HAVE_SIN6_SCOPE_ID 1" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - LWRES_HAVE_SIN6_SCOPE_ID="$result" +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ;; + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sin6_scope_id" >&5 +$as_echo "$ac_cv_have_sin6_scope_id" >&6; } + + case "$ac_cv_have_sin6_scope_id" in + yes) + +$as_echo "#define ISC_PLATFORM_HAVESCOPEID /**/" >>confdefs.h + + esac esac -# We need this check run all the time... -echo "$as_me:$LINENO: checking for in6addr_any" >&5 -echo $ECHO_N "checking for in6addr_any... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + +# We need this check run even without ac_cv_isc_found_ipv6=yes + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for in6addr_any" >&5 +$as_echo_n "checking for in6addr_any... " >&6; } +if test "${ac_cv_have_in6addr_any+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack -$isc_in_addr6_hack + + #include + #include + #include + $isc_netinetin6_hack + $isc_netinet6in6_hack int main () { -struct in6_addr in6; in6 = in6addr_any; return (in6.s6_addr[0]); + + struct in6_addr in6; + in6 = in6addr_any; + + ; return 0; } + _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_have_in6addr_any=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_have_in6addr_any=no -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - -cat >>confdefs.h <<\_ACEOF -#define ISC_PLATFORM_NEEDIN6ADDRANY -_ACEOF +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_in6addr_any" >&5 +$as_echo "$ac_cv_have_in6addr_any" >&6; } + +case "$ac_cv_have_in6addr_any" in + no) + +$as_echo "#define ISC_PLATFORM_NEEDIN6ADDRANY /**/" >>confdefs.h + +esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct if_laddrconf" >&5 +$as_echo_n "checking for struct if_laddrconf... " >&6; } +if test "${ac_cv_isc_struct_if_laddrconf+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include + #include + +int +main () +{ + + struct if_laddrconf a; + + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_isc_struct_if_laddrconf=yes +else + ac_cv_isc_struct_if_laddrconf=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_isc_struct_if_laddrconf" >&5 +$as_echo "$ac_cv_isc_struct_if_laddrconf" >&6; } + +case "$ac_cv_isc_struct_if_laddrconf" in + yes) + +$as_echo "#define ISC_PLATFORM_HAVEIF_LADDRCONF /**/" >>confdefs.h + +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct if_laddrreq" >&5 +$as_echo_n "checking for struct if_laddrreq... " >&6; } +if test "${ac_cv_isc_struct_if_laddrreq+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include + #include + +int +main () +{ + + struct if_laddrreq a; + + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_isc_struct_if_laddrreq=yes +else + ac_cv_isc_struct_if_laddrreq=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_isc_struct_if_laddrreq" >&5 +$as_echo "$ac_cv_isc_struct_if_laddrreq" >&6; } + +case "$ac_cv_isc_struct_if_laddrreq" in + yes) + +$as_echo "#define ISC_PLATFORM_HAVEIF_LADDRREQ /**/" >>confdefs.h + +esac # # Look for a sysctl call to get the list of network interfaces. # -echo "$as_me:$LINENO: checking for interface list sysctl" >&5 -echo $ECHO_N "checking for interface list sysctl... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for interface list sysctl" >&5 +$as_echo_n "checking for interface list sysctl... " >&6; } +if test "${ac_cv_iflist_sysctl+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -#ifdef NET_RT_IFLIST -found_rt_iflist -#endif + #include + #include + #include + #ifdef NET_RT_IFLIST + found_rt_iflist + #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "found_rt_iflist" >/dev/null 2>&1; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_IFLIST_SYSCTL 1 -_ACEOF - + $EGREP "found_rt_iflist" >/dev/null 2>&1; then : + ac_cv_iflist_sysctl=yes else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + ac_cv_iflist_sysctl=no + fi rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_iflist_sysctl" >&5 +$as_echo "$ac_cv_iflist_sysctl" >&6; } + +case "$ac_cv_iflist_sysctl" in + yes) + +$as_echo "#define HAVE_IFLIST_SYSCTL 1" >>confdefs.h + +esac + + ### @@ -53017,68 +25705,65 @@ _ACEOF - ac_config_files="$ac_config_files Makefile" +ac_config_files="$ac_config_files Makefile" - ac_config_files="$ac_config_files ElectricFence/Makefile" +ac_config_files="$ac_config_files ElectricFence/Makefile" - ac_config_files="$ac_config_files adjtimed/Makefile" +ac_config_files="$ac_config_files adjtimed/Makefile" - ac_config_files="$ac_config_files clockstuff/Makefile" +ac_config_files="$ac_config_files clockstuff/Makefile" - ac_config_files="$ac_config_files include/Makefile" +ac_config_files="$ac_config_files include/Makefile" - ac_config_files="$ac_config_files include/isc/Makefile" +ac_config_files="$ac_config_files include/isc/Makefile" - ac_config_files="$ac_config_files kernel/Makefile" +ac_config_files="$ac_config_files kernel/Makefile" - ac_config_files="$ac_config_files kernel/sys/Makefile" +ac_config_files="$ac_config_files kernel/sys/Makefile" - ac_config_files="$ac_config_files libntp/Makefile" +ac_config_files="$ac_config_files libntp/Makefile" - ac_config_files="$ac_config_files libparse/Makefile" +ac_config_files="$ac_config_files libparse/Makefile" - ac_config_files="$ac_config_files ntpd/Makefile" +ac_config_files="$ac_config_files ntpd/Makefile" - ac_config_files="$ac_config_files ntpdate/Makefile" +ac_config_files="$ac_config_files ntpdate/Makefile" - ac_config_files="$ac_config_files ntpdc/Makefile" +ac_config_files="$ac_config_files ntpdc/Makefile" - ac_config_files="$ac_config_files ntpdc/nl.pl" +ac_config_files="$ac_config_files ntpdc/nl.pl" - ac_config_files="$ac_config_files ntpq/Makefile" +ac_config_files="$ac_config_files ntpq/Makefile" - ac_config_files="$ac_config_files parseutil/Makefile" +ac_config_files="$ac_config_files parseutil/Makefile" - ac_config_files="$ac_config_files scripts/Makefile" +ac_config_files="$ac_config_files scripts/Makefile" - ac_config_files="$ac_config_files scripts/calc_tickadj" +ac_config_files="$ac_config_files scripts/calc_tickadj" - ac_config_files="$ac_config_files scripts/checktime" +ac_config_files="$ac_config_files scripts/checktime" - ac_config_files="$ac_config_files scripts/freq_adj" +ac_config_files="$ac_config_files scripts/freq_adj" - ac_config_files="$ac_config_files scripts/html2man" +ac_config_files="$ac_config_files scripts/html2man" - ac_config_files="$ac_config_files scripts/mkver" +ac_config_files="$ac_config_files scripts/mkver" - ac_config_files="$ac_config_files scripts/ntp-wait" +ac_config_files="$ac_config_files scripts/ntp-wait" - ac_config_files="$ac_config_files scripts/ntpsweep" +ac_config_files="$ac_config_files scripts/ntpsweep" - ac_config_files="$ac_config_files scripts/ntptrace" +ac_config_files="$ac_config_files scripts/ntptrace" - ac_config_files="$ac_config_files scripts/ntpver" +ac_config_files="$ac_config_files scripts/ntpver" - ac_config_files="$ac_config_files scripts/plot_summary" +ac_config_files="$ac_config_files scripts/plot_summary" - ac_config_files="$ac_config_files scripts/summary" +ac_config_files="$ac_config_files scripts/summary" - ac_config_files="$ac_config_files util/Makefile" +ac_config_files="$ac_config_files util/Makefile" - -ac_subdirs_all="$ac_subdirs_all sntp" - subdirs="$subdirs sntp" @@ -53100,39 +25785,59 @@ _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. +# So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -{ +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *]) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; + ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} | + esac | + sort +) | sed ' + /^ac_cv_env_/b end t clear - : clear + :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - echo "not updating unwritable cache $cache_file" + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -53141,87 +25846,62 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' -fi - DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${INSTALL_LIBOPTS_TRUE}" && test -z "${INSTALL_LIBOPTS_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"INSTALL_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"INSTALL_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${NEED_LIBOPTS_TRUE}" && test -z "${NEED_LIBOPTS_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"NEED_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"NEED_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${INSTALL_LIBOPTS_TRUE}" && test -z "${INSTALL_LIBOPTS_FALSE}"; then + as_fn_error "conditional \"INSTALL_LIBOPTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${NEED_LIBOPTS_TRUE}" && test -z "${NEED_LIBOPTS_FALSE}"; then + as_fn_error "conditional \"NEED_LIBOPTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + + : ${CONFIG_STATUS=./config.status} +ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -53231,81 +25911,252 @@ cat >$CONFIG_STATUS <<_ACEOF debug=false ac_cs_recheck=false ac_cs_silent=false + SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset + setopt NO_GLOB_SUBST else - as_unset=false + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac fi -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` - -# PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -53313,148 +26164,123 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -53463,31 +26289,20 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Open the log real soon, to keep \$[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - -This file was extended by ntp $as_me 4.2.4p5, which was -generated by GNU Autoconf 2.59. Invocation command line was +# values after options handling. +ac_log=" +This file was extended by ntp $as_me 4.2.4p8, which was +generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -53495,45 +26310,47 @@ generated by GNU Autoconf 2.59. Invocation command line was CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + _ACEOF +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -cat >>$CONFIG_STATUS <<\_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTIONS] [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE Configuration files: $config_files @@ -53544,84 +26361,86 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." +Report bugs to the package provider." + _ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -ntp config.status 4.2.4p5 -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" +ntp config.status 4.2.4p8 +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - -*) + *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; } ;; + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" ;; + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; esac shift @@ -53635,68 +26454,80 @@ if $ac_cs_silent; then fi _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" fi _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # -# INIT-COMMANDS section. +# INIT-COMMANDS # - AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF +# Handling of arguments. for ac_config_target in $ac_config_targets do - case "$ac_config_target" in - # Handling of arguments. - "libopts/Makefile" ) CONFIG_FILES="$CONFIG_FILES libopts/Makefile" ;; - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "ElectricFence/Makefile" ) CONFIG_FILES="$CONFIG_FILES ElectricFence/Makefile" ;; - "adjtimed/Makefile" ) CONFIG_FILES="$CONFIG_FILES adjtimed/Makefile" ;; - "clockstuff/Makefile" ) CONFIG_FILES="$CONFIG_FILES clockstuff/Makefile" ;; - "include/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; - "include/isc/Makefile" ) CONFIG_FILES="$CONFIG_FILES include/isc/Makefile" ;; - "kernel/Makefile" ) CONFIG_FILES="$CONFIG_FILES kernel/Makefile" ;; - "kernel/sys/Makefile" ) CONFIG_FILES="$CONFIG_FILES kernel/sys/Makefile" ;; - "libntp/Makefile" ) CONFIG_FILES="$CONFIG_FILES libntp/Makefile" ;; - "libparse/Makefile" ) CONFIG_FILES="$CONFIG_FILES libparse/Makefile" ;; - "ntpd/Makefile" ) CONFIG_FILES="$CONFIG_FILES ntpd/Makefile" ;; - "ntpdate/Makefile" ) CONFIG_FILES="$CONFIG_FILES ntpdate/Makefile" ;; - "ntpdc/Makefile" ) CONFIG_FILES="$CONFIG_FILES ntpdc/Makefile" ;; - "ntpdc/nl.pl" ) CONFIG_FILES="$CONFIG_FILES ntpdc/nl.pl" ;; - "ntpq/Makefile" ) CONFIG_FILES="$CONFIG_FILES ntpq/Makefile" ;; - "parseutil/Makefile" ) CONFIG_FILES="$CONFIG_FILES parseutil/Makefile" ;; - "scripts/Makefile" ) CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;; - "scripts/calc_tickadj" ) CONFIG_FILES="$CONFIG_FILES scripts/calc_tickadj" ;; - "scripts/checktime" ) CONFIG_FILES="$CONFIG_FILES scripts/checktime" ;; - "scripts/freq_adj" ) CONFIG_FILES="$CONFIG_FILES scripts/freq_adj" ;; - "scripts/html2man" ) CONFIG_FILES="$CONFIG_FILES scripts/html2man" ;; - "scripts/mkver" ) CONFIG_FILES="$CONFIG_FILES scripts/mkver" ;; - "scripts/ntp-wait" ) CONFIG_FILES="$CONFIG_FILES scripts/ntp-wait" ;; - "scripts/ntpsweep" ) CONFIG_FILES="$CONFIG_FILES scripts/ntpsweep" ;; - "scripts/ntptrace" ) CONFIG_FILES="$CONFIG_FILES scripts/ntptrace" ;; - "scripts/ntpver" ) CONFIG_FILES="$CONFIG_FILES scripts/ntpver" ;; - "scripts/plot_summary" ) CONFIG_FILES="$CONFIG_FILES scripts/plot_summary" ;; - "scripts/summary" ) CONFIG_FILES="$CONFIG_FILES scripts/summary" ;; - "util/Makefile" ) CONFIG_FILES="$CONFIG_FILES util/Makefile" ;; - "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libopts/Makefile") CONFIG_FILES="$CONFIG_FILES libopts/Makefile" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "ElectricFence/Makefile") CONFIG_FILES="$CONFIG_FILES ElectricFence/Makefile" ;; + "adjtimed/Makefile") CONFIG_FILES="$CONFIG_FILES adjtimed/Makefile" ;; + "clockstuff/Makefile") CONFIG_FILES="$CONFIG_FILES clockstuff/Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "include/isc/Makefile") CONFIG_FILES="$CONFIG_FILES include/isc/Makefile" ;; + "kernel/Makefile") CONFIG_FILES="$CONFIG_FILES kernel/Makefile" ;; + "kernel/sys/Makefile") CONFIG_FILES="$CONFIG_FILES kernel/sys/Makefile" ;; + "libntp/Makefile") CONFIG_FILES="$CONFIG_FILES libntp/Makefile" ;; + "libparse/Makefile") CONFIG_FILES="$CONFIG_FILES libparse/Makefile" ;; + "ntpd/Makefile") CONFIG_FILES="$CONFIG_FILES ntpd/Makefile" ;; + "ntpdate/Makefile") CONFIG_FILES="$CONFIG_FILES ntpdate/Makefile" ;; + "ntpdc/Makefile") CONFIG_FILES="$CONFIG_FILES ntpdc/Makefile" ;; + "ntpdc/nl.pl") CONFIG_FILES="$CONFIG_FILES ntpdc/nl.pl" ;; + "ntpq/Makefile") CONFIG_FILES="$CONFIG_FILES ntpq/Makefile" ;; + "parseutil/Makefile") CONFIG_FILES="$CONFIG_FILES parseutil/Makefile" ;; + "scripts/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/Makefile" ;; + "scripts/calc_tickadj") CONFIG_FILES="$CONFIG_FILES scripts/calc_tickadj" ;; + "scripts/checktime") CONFIG_FILES="$CONFIG_FILES scripts/checktime" ;; + "scripts/freq_adj") CONFIG_FILES="$CONFIG_FILES scripts/freq_adj" ;; + "scripts/html2man") CONFIG_FILES="$CONFIG_FILES scripts/html2man" ;; + "scripts/mkver") CONFIG_FILES="$CONFIG_FILES scripts/mkver" ;; + "scripts/ntp-wait") CONFIG_FILES="$CONFIG_FILES scripts/ntp-wait" ;; + "scripts/ntpsweep") CONFIG_FILES="$CONFIG_FILES scripts/ntpsweep" ;; + "scripts/ntptrace") CONFIG_FILES="$CONFIG_FILES scripts/ntptrace" ;; + "scripts/ntpver") CONFIG_FILES="$CONFIG_FILES scripts/ntpver" ;; + "scripts/plot_summary") CONFIG_FILES="$CONFIG_FILES scripts/plot_summary" ;; + "scripts/summary") CONFIG_FILES="$CONFIG_FILES scripts/summary" ;; + "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done + # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely @@ -53708,887 +26539,692 @@ if $ac_need_defaults; then fi # Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, +# simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 } - # Create a (secure) tmp directory for tmp files. { - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) -} || + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + { - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi -# -# CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@PACKAGE@,$PACKAGE,;t t -s,@VERSION@,$VERSION,;t t -s,@ACLOCAL@,$ACLOCAL,;t t -s,@AUTOCONF@,$AUTOCONF,;t t -s,@AUTOMAKE@,$AUTOMAKE,;t t -s,@AUTOHEADER@,$AUTOHEADER,;t t -s,@MAKEINFO@,$MAKEINFO,;t t -s,@install_sh@,$install_sh,;t t -s,@STRIP@,$STRIP,;t t -s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -s,@mkdir_p@,$mkdir_p,;t t -s,@AWK@,$AWK,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@am__leading_dot@,$am__leading_dot,;t t -s,@AMTAR@,$AMTAR,;t t -s,@am__tar@,$am__tar,;t t -s,@am__untar@,$am__untar,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@DEPDIR@,$DEPDIR,;t t -s,@am__include@,$am__include,;t t -s,@am__quote@,$am__quote,;t t -s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -s,@CCDEPMODE@,$CCDEPMODE,;t t -s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t -s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t -s,@CPP@,$CPP,;t t -s,@EGREP@,$EGREP,;t t -s,@LIBOPTS_DIR@,$LIBOPTS_DIR,;t t -s,@INSTALL_LIBOPTS_TRUE@,$INSTALL_LIBOPTS_TRUE,;t t -s,@INSTALL_LIBOPTS_FALSE@,$INSTALL_LIBOPTS_FALSE,;t t -s,@NEED_LIBOPTS_TRUE@,$NEED_LIBOPTS_TRUE,;t t -s,@NEED_LIBOPTS_FALSE@,$NEED_LIBOPTS_FALSE,;t t -s,@LIBOPTS_LDADD@,$LIBOPTS_LDADD,;t t -s,@LIBOPTS_CFLAGS@,$LIBOPTS_CFLAGS,;t t -s,@BINSUBDIR@,$BINSUBDIR,;t t -s,@subdirs@,$subdirs,;t t -s,@ARLIB_DIR@,$ARLIB_DIR,;t t -s,@LN_S@,$LN_S,;t t -s,@ECHO@,$ECHO,;t t -s,@AR@,$AR,;t t -s,@ac_ct_AR@,$ac_ct_AR,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@CXX@,$CXX,;t t -s,@CXXFLAGS@,$CXXFLAGS,;t t -s,@ac_ct_CXX@,$ac_ct_CXX,;t t -s,@CXXDEPMODE@,$CXXDEPMODE,;t t -s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t -s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t -s,@CXXCPP@,$CXXCPP,;t t -s,@F77@,$F77,;t t -s,@FFLAGS@,$FFLAGS,;t t -s,@ac_ct_F77@,$ac_ct_F77,;t t -s,@LIBTOOL@,$LIBTOOL,;t t -s,@PATH_SH@,$PATH_SH,;t t -s,@PATH_PERL@,$PATH_PERL,;t t -s,@READLINE_LIBS@,$READLINE_LIBS,;t t -s,@U@,$U,;t t -s,@ANSI2KNR@,$ANSI2KNR,;t t -s,@LIBPARSE@,$LIBPARSE,;t t -s,@MAKE_LIBPARSE@,$MAKE_LIBPARSE,;t t -s,@MAKE_LIBPARSE_KERNEL@,$MAKE_LIBPARSE_KERNEL,;t t -s,@MAKE_CHECK_Y2K@,$MAKE_CHECK_Y2K,;t t -s,@OPENSSL@,$OPENSSL,;t t -s,@OPENSSL_INC@,$OPENSSL_INC,;t t -s,@OPENSSL_LIB@,$OPENSSL_LIB,;t t -s,@LCRYPTO@,$LCRYPTO,;t t -s,@EF_PROGS@,$EF_PROGS,;t t -s,@EF_LIBS@,$EF_LIBS,;t t -s,@MAKE_CHECK_LAYOUT@,$MAKE_CHECK_LAYOUT,;t t -s,@TESTDCF@,$TESTDCF,;t t -s,@DCFD@,$DCFD,;t t -s,@MAKE_PARSEKMODULE@,$MAKE_PARSEKMODULE,;t t -s,@PROPDELAY@,$PROPDELAY,;t t -s,@CHUTEST@,$CHUTEST,;t t -s,@CLKTEST@,$CLKTEST,;t t -s,@MAKE_ADJTIMED@,$MAKE_ADJTIMED,;t t -s,@MAKE_NTPTIME@,$MAKE_NTPTIME,;t t -s,@MAKE_TICKADJ@,$MAKE_TICKADJ,;t t -s,@MAKE_TIMETRIM@,$MAKE_TIMETRIM,;t t -s,@MAKE_LIBNTPSIM@,$MAKE_LIBNTPSIM,;t t -s,@MAKE_NTPDSIM@,$MAKE_NTPDSIM,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; esac - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || + ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + case $ac_mode in + :F) + # + # CONFIG_FILE + # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac - - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub $extrasub _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 - # Run the commands associated with the file. +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" case $ac_file in - ntpdc/nl.pl ) chmod +x ntpdc/nl.pl ;; - scripts/calc_tickadj ) chmod +x scripts/calc_tickadj ;; - scripts/checktime ) chmod +x scripts/checktime ;; - scripts/freq_adj ) chmod +x scripts/freq_adj ;; - scripts/html2man ) chmod +x scripts/html2man ;; - scripts/mkver ) chmod +x scripts/mkver ;; - scripts/ntp-wait ) chmod +x scripts/ntp-wait ;; - scripts/ntpsweep ) chmod +x scripts/ntpsweep ;; - scripts/ntptrace ) chmod +x scripts/ntptrace ;; - scripts/ntpver ) chmod +x scripts/ntpver ;; - scripts/plot_summary ) chmod +x scripts/plot_summary ;; - scripts/summary ) chmod +x scripts/summary ;; - esac -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF - -# -# CONFIG_HEADER section. -# - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' -ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' - -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - -_ACEOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs - -cat >>$CONFIG_STATUS <<\_ACEOF - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # if test x"$ac_file" != x-; then - if diff $ac_file $tmp/config.h >/dev/null 2>&1; then - { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -echo "$as_me: $ac_file is unchanged" >&6;} + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} else - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - rm -f $ac_file - mv $tmp/config.h $ac_file + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else - cat $tmp/config.h - rm -f $tmp/config.h + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 fi -# Compute $ac_file's index in $config_headers. +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $ac_file | $ac_file:* ) + $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || -$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X$ac_file : 'X\(//\)[^/]' \| \ - X$ac_file : 'X\(//\)$' \| \ - X$ac_file : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X$ac_file | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'`/stamp-h$_am_stamp_count -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`(dirname "$mf") 2>/dev/null || + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`(dirname "$file") 2>/dev/null || + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p $dirpart/$fdir - else - as_dir=$dirpart/$fdir - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} - { (exit 1); exit 1; }; }; } - - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" done -done +} ;; + "ntpdc/nl.pl":F) chmod +x ntpdc/nl.pl ;; + "scripts/calc_tickadj":F) chmod +x scripts/calc_tickadj ;; + "scripts/checktime":F) chmod +x scripts/checktime ;; + "scripts/freq_adj":F) chmod +x scripts/freq_adj ;; + "scripts/html2man":F) chmod +x scripts/html2man ;; + "scripts/mkver":F) chmod +x scripts/mkver ;; + "scripts/ntp-wait":F) chmod +x scripts/ntp-wait ;; + "scripts/ntpsweep":F) chmod +x scripts/ntpsweep ;; + "scripts/ntptrace":F) chmod +x scripts/ntptrace ;; + "scripts/ntpver":F) chmod +x scripts/ntpver ;; + "scripts/plot_summary":F) chmod +x scripts/plot_summary ;; + "scripts/summary":F) chmod +x scripts/summary ;; + esac -done -_ACEOF +done # for ac_tag -cat >>$CONFIG_STATUS <<\_ACEOF -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. @@ -54608,7 +27244,7 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit $? fi # @@ -54616,10 +27252,14 @@ fi # if test "$no_recursion" != yes; then - # Remove --cache-file and --srcdir arguments so they do not pile up. + # Remove --cache-file, --srcdir, and --disable-option-checking arguments + # so they do not pile up. ac_sub_configure_args= ac_prev= - for ac_arg in $ac_configure_args; do + eval "set x $ac_configure_args" + shift + for ac_arg + do if test -n "$ac_prev"; then ac_prev= continue @@ -54642,126 +27282,92 @@ if test "$no_recursion" != yes; then ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; - *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; + --disable-option-checking) + ;; + *) + case $ac_arg in + *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. - ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args" + ac_arg="--prefix=$prefix" + case $ac_arg in + *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" + + # Pass --silent + if test "$silent" = yes; then + ac_sub_configure_args="--silent $ac_sub_configure_args" + fi + + # Always prepend --disable-option-checking to silence warnings, since + # different subdirs can have different --enable and --with options. + ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. - test -d $srcdir/$ac_dir || continue - - { echo "$as_me:$LINENO: configuring in $ac_dir" >&5 -echo "$as_me: configuring in $ac_dir" >&6;} - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } + test -d "$srcdir/$ac_dir" || continue + ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" + $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 + $as_echo "$ac_msg" >&6 + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - cd $ac_dir + cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'" - elif test -f $ac_srcdir/configure; then - ac_sub_configure="$SHELL '$ac_srcdir/configure'" - elif test -f $ac_srcdir/configure.in; then - ac_sub_configure=$ac_configure + if test -f "$ac_srcdir/configure.gnu"; then + ac_sub_configure=$ac_srcdir/configure.gnu + elif test -f "$ac_srcdir/configure"; then + ac_sub_configure=$ac_srcdir/configure + elif test -f "$ac_srcdir/configure.in"; then + # This should be Cygnus configure. + ac_sub_configure=$ac_aux_dir/configure else - { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5 -echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 +$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi @@ -54770,21 +27376,23 @@ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; - *) # Relative path. - ac_sub_cache_file=$ac_top_builddir$cache_file ;; + *) # Relative name. + ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac - { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 -echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 +$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. - eval $ac_sub_configure $ac_sub_configure_args \ - --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir || - { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5 -echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;} - { (exit 1); exit 1; }; } + eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ + --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || + as_fn_error "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi - cd $ac_popdir + cd "$ac_popdir" done fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi diff --git a/contrib/ntp/configure.ac b/contrib/ntp/configure.ac index 4c6ba13b0bbc..49cc9ae8dc4a 100644 --- a/contrib/ntp/configure.ac +++ b/contrib/ntp/configure.ac @@ -7,7 +7,7 @@ AC_CANONICAL_HOST dnl the 'build' machine is where we run configure and compile dnl the 'host' machine is where the resulting stuff runs. AC_DEFINE_UNQUOTED(STR_SYSTEM, "$host", [canonical system (cpu-vendor-os) of where we should run]) -AM_CONFIG_HEADER(config.h) +AM_CONFIG_HEADER([config.h]) dnl AC_ARG_PROGRAM AC_PREREQ(2.53) @@ -24,10 +24,15 @@ dnl check these early to avoid autoconf warnings AC_AIX AC_MINIX +# So far, the only shared library we might use is libopts. +# It's a small library - we might as well use a static version of it. +AC_DISABLE_SHARED + dnl we need to check for cross compile tools for vxWorks here AC_PROG_CC # Ralf Wildenhues: With per-target flags we need CC_C_O -AC_PROG_CC_C_O +# AM_PROG_CC_C_O supersets AC_PROG_CC_C_O +AM_PROG_CC_C_O AC_PROG_CC_STDC AC_PROG_CPP @@ -86,18 +91,73 @@ case "${enable_libopts_install+set}" in esac LIBOPTS_CHECK(libopts) -AC_MSG_CHECKING([[if $CC can handle #warning]]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[#warning foo]])],[ac_cv_cpp_warning=yes],[ac_cv_cpp_warning=no]) -AC_MSG_RESULT([$ac_cv_cpp_warning]) +AC_CACHE_CHECK( + [if $CC can handle @%:@warning], + ac_cv_cpp_warning, + [ + AC_COMPILE_IFELSE( + AC_LANG_PROGRAM([], [#warning foo]), + [ac_cv_cpp_warning=yes], + [ac_cv_cpp_warning=no], + ) + ] +) case "$ac_cv_cpp_warning" in no) - AC_DEFINE([NO_OPTION_NAME_WARNINGS], [1], [Should we avoid #warning on option name collisions?]) - AC_MSG_RESULT([[Enabling NO_OPTION_NAME_WARNINGS as #warning does not work]]) - ;; + AC_DEFINE([NO_OPTION_NAME_WARNINGS], [1], [Should we avoid @%:@warning on option name collisions?]) esac -AC_MSG_CHECKING(for bin subdirectory) +case "$GCC" in + yes) + SAVED_CFLAGS_AC="$CFLAGS" + CFLAGS="$CFLAGS -Wstrict-overflow" + AC_CACHE_CHECK( + [if $CC can handle -Wstrict-overflow], + ac_cv_gcc_Wstrict_overflow, + [ + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([], [])], + [ac_cv_gcc_Wstrict_overflow=yes], + [ac_cv_gcc_Wstrict_overflow=no] + ) + ] + ) + CFLAGS="$SAVED_CFLAGS_AC" + unset SAVED_CFLAGS_AC + # + # $ac_cv_gcc_Wstrict_overflow is tested later to add the + # flag to CFLAGS. + # +esac + + +case "$GCC" in + yes) + SAVED_CFLAGS_AC="$CFLAGS" + CFLAGS="$CFLAGS -Winit-self" + AC_CACHE_CHECK( + [if $CC can handle -Winit-self], + ac_cv_gcc_Winit_self, + [ + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([], [])], + [ac_cv_gcc_Winit_self=yes], + [ac_cv_gcc_Winit_self=no] + ) + ] + ) + CFLAGS="$SAVED_CFLAGS_AC" + unset SAVED_CFLAGS_AC + # + # $ac_cv_gcc_Winit_self is tested later to add the + # flag to CFLAGS. + # +esac + + + +AC_MSG_CHECKING([for bin subdirectory]) AC_ARG_WITH(binsubdir, AC_HELP_STRING([--with-binsubdir], [bin ={bin,sbin}]), use_binsubdir="$withval", use_binsubdir="bin") @@ -115,11 +175,11 @@ AC_MSG_RESULT($use_binsubdir) BINSUBDIR=$use_binsubdir AC_SUBST(BINSUBDIR) -AC_MSG_CHECKING(if we want to use arlib) +AC_MSG_CHECKING([if we want to use arlib]) AC_ARG_WITH(arlib, AC_HELP_STRING([--with-arlib], [- Compile the async resolver library?]), [ans=$withval], [ans=no]) -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) if test -d $srcdir/arlib then @@ -164,43 +224,6 @@ case "$host" in ;; esac -AC_CACHE_CHECK(if we should use /dev/clockctl, ac_clockctl, -[AC_ARG_ENABLE(clockctl, - AC_HELP_STRING([--enable-clockctl], [s Use /dev/clockctl for non-root clock control]), - [ans=$enableval], - [case "$host" in - *-*-netbsd*) - ans=yes - ;; - *) ans=no - ;; - esac - ]) -ac_clockctl=$ans]) -# End of AC_CACHE_CHECK for clockctl -AC_CHECK_HEADERS(sys/clockctl.h) -case "$ac_clockctl$ac_cv_header_sys_clockctl_h" in - yesyes) - AC_DEFINE(HAVE_DROPROOT, ,[Can we drop root privileges?]) - ;; -esac - -AC_CACHE_CHECK(if we have linux capabilities (libcap), ac_linuxcaps, -[AC_ARG_ENABLE(linuxcaps, - AC_HELP_STRING([--enable-linuxcaps], [s Use Linux capabilities for non-root clock control]), - [ans=$enableval], - [ans=no]) -ac_linuxcaps=$ans]) -# End of AC_CACHE_CHECK for linuxcaps -AC_CHECK_HEADERS(sys/capability.h) -AC_CHECK_HEADERS(sys/prctl.h) -case "$ac_linuxcaps$ac_cv_header_sys_capability_h$ac_cv_header_sys_prctl_h" in - yesyesyes) - AC_DEFINE(HAVE_LINUX_CAPABILITIES, ,[Do we have Linux capabilities?]) - AC_DEFINE(HAVE_DROPROOT, ,[Can we drop root privileges?]) - LIBS="$LIBS -lcap" - ;; -esac case "$build" in $host) @@ -236,10 +259,26 @@ case "$GCC" in CFLAGS="$CFLAGS -Wmissing-prototypes" CFLAGS="$CFLAGS -Wpointer-arith" CFLAGS="$CFLAGS -Wshadow" - CFLAGS="$CFLAGS -Wstrict-prototypes" + # + # OpenSSL has a number of callback prototypes + # inside other function prototypes which trigger + # warnings with -Wstrict-prototypes, such as: + # + # int i2d_RSA_NET(const RSA *a, unsigned char **pp, + # int (*cb)(), int sgckey); + # ^^^^^^^^^^^ + # + CFLAGS="$CFLAGS -Wno-strict-prototypes" # CFLAGS="$CFLAGS -Wtraditional" # CFLAGS="$CFLAGS -Wwrite-strings" - + case "$ac_cv_gcc_Winit_self" in + yes) + CFLAGS="$CFLAGS -Winit-self" + esac + case "$ac_cv_gcc_Wstrict_overflow" in + yes) + #not yet: CFLAGS="$CFLAGS -Wstrict-overflow" + esac ;; esac @@ -284,7 +323,7 @@ case "$ac_busted_vpath_in_make$srcdir" in yes.) ;; *) case "`${MAKE-make} -v -f /dev/null 2>/dev/null | sed -e 's/GNU Make version \(1-9.]*\).*/\1/' -e q`" in '') - AC_MSG_ERROR(building outside of the main directory requires GNU make) + AC_MSG_ERROR([building outside of the main directory requires GNU make]) ;; *) ;; esac @@ -294,18 +333,11 @@ esac AC_SUBST(CFLAGS)dnl AC_SUBST(LDFLAGS)dnl -# HMS: From bunnylou/cowbird -case "$host" in - alpha-dec-osf4.0) - AC_DISABLE_SHARED - ;; - *) # So far, the only shared library we might use is libopts. - # It's a small library - we might as well use a static version of it. - AC_DISABLE_SHARED - ;; -esac +m4_defun([_LT_AC_LANG_CXX_CONFIG], [:]) +m4_defun([_LT_AC_LANG_F77_CONFIG], [:]) AC_PROG_LIBTOOL + AC_PROG_LN_S AC_PROG_GCC_TRADITIONAL AC_C_VOLATILE @@ -313,7 +345,7 @@ AC_ISC_POSIX AC_PATH_PROG(PATH_SH, sh) AC_PATH_PROG(PATH_PERL, perl) -hs_ULONG_CONST +hs_ULONG_CONST # remove for 4.2.5 case "$host" in *-*-vxworks*) @@ -329,14 +361,15 @@ case "$host" in ;; esac -AC_CHECK_FUNC(gethostent, , - AC_CHECK_LIB(nsl, gethostent, , , $libxnet -lsocket)) -AC_CHECK_FUNC(openlog, , - AC_CHECK_LIB(gen, openlog, , - AC_CHECK_LIB(syslog, openlog, , , $libxnet -lsocket))) -AC_CHECK_LIB(md5, MD5Init, , - AC_CHECK_LIB(md, MD5Init)) +AC_CHECK_FUNC([gethostent], , + AC_SEARCH_LIBS([gethostent], [nsl], , , [$libxnet -lsocket])) +AC_CHECK_FUNC([openlog], , + AC_SEARCH_LIBS([openlog], [gen], , + AC_SEARCH_LIBS([openlog], [syslog], , , [$libxnet -lsocket]))) +AC_SEARCH_LIBS([MD5Init], [md5 md]) AC_CHECK_FUNCS(MD5Init) + +# following block becomes on 4.2.5: NTP_LINEEDITLIBS dnl HMS: What a hack... AC_CHECK_HEADERS(readline/history.h readline/readline.h) case "$ac_cv_header_readline_history_h$ac_cv_header_readline_readline_h" in @@ -371,7 +404,7 @@ dnl does Strange Things with extra processes using the Posix-compatibility dnl real-time library, so we don't want to use it. case "$host" in - *-*-linux*) ;; + *-*-*linux*) ;; *) AC_CHECK_LIB(rt, sched_setscheduler, , AC_CHECK_LIB(posix4, sched_setscheduler)) @@ -379,8 +412,7 @@ case "$host" in esac AC_CHECK_FUNC(setsockopt, , - [AC_CHECK_LIB(socket, setsockopt) - AC_CHECK_LIB(xnet, setsockopt)]) + [AC_SEARCH_LIBS([setsockopt], [socket xnet])]) AC_HEADER_STDC AC_CHECK_HEADERS(bstring.h) @@ -444,6 +476,37 @@ AC_CHECK_HEADERS(netinet/ip.h, [], [], #include #endif ]) + +# Check for IPTOS_PREC +AC_CACHE_CHECK( + [IPPROTO_IP IP_TOS IPTOS_LOWDELAY], + ac_cv_ip_tos, + [ + AC_EGREP_CPP( + [yes], + [ + #if HAVE_SYS_TYPES_H + #include + #endif + #if HAVE_NETINET_IP_H + #include + #include + #endif + #if defined(IPPROTO_IP) && defined(IP_TOS) && defined(IPTOS_LOWDELAY) + yes + #endif + ], + [ac_cv_ip_tos=yes], + [ac_cv_ip_tos=no] + ) + ] +) + +case "$ac_cv_ip_tos" in + yes) + AC_DEFINE(HAVE_IPTOS_SUPPORT, 1, [Do we have IPTOS support?]) +esac + AC_CHECK_HEADERS(netinfo/ni.h, [AC_DEFINE(HAVE_NETINFO, 1, [NetInfo support?])]) AC_CHECK_HEADERS(sun/audioio.h sys/audioio.h) dnl AC_CHECK_HEADERS(sys/chudefs.h) @@ -509,7 +572,7 @@ case "$host" in esac case "$host" in - *-*-linux*) + *-*-*linux*) AC_CHECK_FUNCS(__adjtimex __ntp_gettime) ;; esac @@ -585,7 +648,7 @@ AC_CHECK_HEADERS(resolv.h, [], [], #endif ]) -AC_CACHE_CHECK(for basic volatile support, ac_cv_c_volatile, +AC_CACHE_CHECK([for basic volatile support], ac_cv_c_volatile, [AC_TRY_COMPILE([],[ volatile int x;], ac_cv_c_volatile=yes, @@ -598,6 +661,9 @@ case "$ac_cv_c_volatile" in ;; esac +# +# following block goes away in 4.2.5 +# # AM_C_PROTOTYPES gives us ansi2knr case "$build" in *-*-solaris2*) @@ -616,6 +682,9 @@ int i;], ac_cv_have_prototypes=yes, ac_cv_have_prototypes=no) if test "$ac_cv_have_prototypes" = yes; then AC_DEFINE(HAVE_PROTOTYPES, 1, [Are function prototypes OK?]) fi +# +# end block +# AC_C_CONST AC_C_BIGENDIAN @@ -658,7 +727,7 @@ fi # # Look for in_port_t. # -AC_MSG_CHECKING(for in_port_t) +AC_MSG_CHECKING([for in_port_t]) AC_TRY_COMPILE([ #include #include ], @@ -669,7 +738,7 @@ AC_TRY_COMPILE([ AC_DEFINE(ISC_PLATFORM_NEEDPORTT, 1, [Do we need our own in_port_t?]) ]) -AC_CACHE_CHECK(for a fallback value for HZ, ac_cv_var_default_hz, +AC_CACHE_CHECK([for a fallback value for HZ], ac_cv_var_default_hz, [ac_cv_var_default_hz=100 case "$host" in alpha*-dec-osf4*|alpha*-dec-osf5*) @@ -681,7 +750,7 @@ case "$host" in esac]) AC_DEFINE_UNQUOTED(DEFAULT_HZ, $ac_cv_var_default_hz, [What is the fallback value for HZ?]) -AC_CACHE_CHECK(if we need to override the system's value for HZ, ac_cv_var_override_hz, +AC_CACHE_CHECK([if we need to override the system's value for HZ], ac_cv_var_override_hz, [ac_cv_var_override_hz=no case "$host" in alpha*-dec-osf4*|alpha*-dec-osf5*) @@ -725,7 +794,7 @@ dnl #endif dnl ], su_cv_have_boot_time=yes, su_cv_have_boot_time=no)]) dnl AC_MSG_RESULT($su_cv_have_boot_time) -AC_CACHE_CHECK(for struct rt_msghdr, ac_cv_struct_rt_msghdr, +AC_CACHE_CHECK([for struct rt_msghdr], ac_cv_struct_rt_msghdr, [AC_TRY_COMPILE([ #include #include @@ -735,12 +804,13 @@ AC_CACHE_CHECK(for struct rt_msghdr, ac_cv_struct_rt_msghdr, ac_cv_struct_rt_msghdr=yes, ac_cv_struct_rt_msghdr=no) ]) + if test $ac_cv_struct_rt_msghdr = yes; then AC_DEFINE(HAS_ROUTING_SOCKET, 1, [Do we have a routing socket (struct rt_msghdr)?]) fi AC_CACHE_CHECK( - struct sigaction for sa_sigaction, + [struct sigaction for sa_sigaction], ac_cv_struct_sigaction_has_sa_sigaction, [ AC_TRY_COMPILE( @@ -755,7 +825,7 @@ if test $ac_cv_struct_sigaction_has_sa_sigaction = yes; then AC_DEFINE(HAVE_SA_SIGACTION_IN_STRUCT_SIGACTION, 1, [Obvious...]) fi -AC_CACHE_CHECK(for struct ppsclockev, ac_cv_struct_ppsclockev, +AC_CACHE_CHECK([for struct ppsclockev], ac_cv_struct_ppsclockev, [AC_TRY_COMPILE([ #include #ifdef HAVE_SYS_TERMIOS_H @@ -776,7 +846,7 @@ if test $ac_cv_struct_ppsclockev = yes; then AC_DEFINE(HAVE_STRUCT_PPSCLOCKEV, 1, [Does a system header define struct ppsclockev?]) fi -AC_CACHE_CHECK(struct sockaddr for sa_len, ac_cv_struct_sockaddr_has_sa_len, +AC_CACHE_CHECK([struct sockaddr for sa_len], ac_cv_struct_sockaddr_has_sa_len, [AC_TRY_COMPILE([ #include #include ],[ @@ -789,7 +859,7 @@ if test $ac_cv_struct_sockaddr_has_sa_len = yes; then AC_DEFINE(HAVE_SA_LEN_IN_STRUCT_SOCKADDR, 1, [Should be obvious...]) fi -AC_CACHE_CHECK(for struct sockaddr_storage, ac_cv_struct_sockaddr_storage, +AC_CACHE_CHECK([for struct sockaddr_storage], ac_cv_struct_sockaddr_storage, [AC_TRY_COMPILE([ #include #include @@ -909,7 +979,7 @@ return ss->rec_size;], ;; esac -AC_CACHE_CHECK(struct clockinfo for hz, ac_cv_struct_clockinfo_has_hz, +AC_CACHE_CHECK([struct clockinfo for hz], ac_cv_struct_clockinfo_has_hz, [AC_TRY_COMPILE([ #include ],[ extern struct clockinfo *pc; @@ -921,7 +991,7 @@ if test $ac_cv_struct_clockinfo_has_hz = yes; then AC_DEFINE(HAVE_HZ_IN_STRUCT_CLOCKINFO, 1, [Obvious...]) fi -AC_CACHE_CHECK(struct clockinfo for tickadj, ac_cv_struct_clockinfo_has_tickadj, +AC_CACHE_CHECK([struct clockinfo for tickadj], ac_cv_struct_clockinfo_has_tickadj, [AC_TRY_COMPILE([ #include ],[ extern struct clockinfo *pc; @@ -977,6 +1047,15 @@ AC_CHECK_MEMBERS([struct ntptimeval.time.tv_nsec], , , #endif]) AC_C_INLINE + +case "$ac_cv_c_inline" in + '') + ;; + *) + AC_DEFINE(HAVE_INLINE,1,[inline keyword or macro available]) + AC_SUBST(HAVE_INLINE) +esac + AC_C_CHAR_UNSIGNED dnl CROSS_COMPILE? AC_CHECK_SIZEOF(signed char) AC_CHECK_SIZEOF(int) @@ -1007,7 +1086,7 @@ esac AC_TYPE_UID_T case "$host" in - *-*-aix[[45]]*) + *-*-aix[[456]]*) # (prr) aix 4.1 doesn't have clock_settime, but in aix 4.3 it's a stub # (returning ENOSYS). I didn't check 4.2. If, in the future, # IBM pulls its thumbs out long enough to implement clock_settime, @@ -1020,7 +1099,7 @@ esac AC_CHECK_FUNCS(daemon) AC_CHECK_FUNCS(finite, , [AC_CHECK_FUNCS(isfinite, , - [AC_MSG_CHECKING(for isfinite with ) + [AC_MSG_CHECKING([for isfinite with ]) _libs=$LIBS LIBS="$LIBS -lm" AC_TRY_LINK([#include ], [float f = 0.0; isfinite(f)], @@ -1042,7 +1121,7 @@ yes|glibc) # Do we have getifaddrs() ? # case $host in -*-linux*) +*-*linux*) # Some recent versions of glibc support getifaddrs() which does not # provide AF_INET6 addresses while the function provided by the USAGI # project handles the AF_INET6 case correctly. We need to avoid @@ -1143,13 +1222,13 @@ case "$host" in esac AC_CHECK_FUNCS(mktime) case "$host" in - *-*-aix[[45]]*) + *-*-aix[[456]]*) # Just a stub. Idiots. ;; *-*-irix[[45]]*) # Just a stub in "old" Irix. Idiots. ;; - *-*-linux*) + *-*-*linux*) # there, but more trouble than it is worth for now (resolver problems) ;; *-*-qnx*) @@ -1177,7 +1256,7 @@ case "$host" in esac AC_CHECK_FUNCS(plock pututline pututxline readlink recvmsg rtprio) case "$host" in - *-*-aix[[45]]*) + *-*-aix[[456]]*) # Just a stub in AIX 4. Idiots. ;; *-*-solaris2.5*) @@ -1198,7 +1277,7 @@ AC_CHECK_FUNCS(sigvec sigset sigsuspend stime strchr sysconf sysctl) AC_CHECK_FUNCS(snprintf strdup strerror strstr) AC_CHECK_FUNCS(timegm) case "$host" in - *-*-aix[[45]]*) + *-*-aix[[456]]*) # Just stubs. Idiots. ;; *-*-netbsd1*) @@ -1224,7 +1303,7 @@ AC_CHECK_FUNCS(uname updwtmp updwtmpx vsnprintf vsprintf) ### -# http://bugs.ntp.isc.org/737 +# http://bugs.ntp.org/737 case "$ac_cv_func_recvmsg" in yes) AC_MSG_CHECKING([if we need extra help to define struct iovec]) @@ -1272,7 +1351,7 @@ case "$host" in ;; esac -AC_CACHE_CHECK(number of arguments to gettimeofday(), ac_cv_func_Xettimeofday_nargs, +AC_CACHE_CHECK([number of arguments to gettimeofday()], ac_cv_func_Xettimeofday_nargs, [AC_TRY_COMPILE([#include ],[ gettimeofday((struct timeval*)0,(struct timezone*)0); settimeofday((struct timeval*)0,(struct timezone*)0); @@ -1283,7 +1362,7 @@ if test $ac_cv_func_Xettimeofday_nargs = 1; then AC_DEFINE(SYSV_TIMEOFDAY, 1, [Does Xettimeofday take 1 arg?]) fi -AC_CACHE_CHECK(number of arguments taken by setpgrp(), ac_cv_func_setpgrp_nargs, +AC_CACHE_CHECK([number of arguments taken by setpgrp()], ac_cv_func_setpgrp_nargs, [AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H # include @@ -1301,7 +1380,7 @@ fi save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -I$srcdir/include" -AC_CACHE_CHECK(argument pointer type of qsort()'s compare function and base, +AC_CACHE_CHECK([argument pointer type of qsort()'s compare function and base], ac_cv_func_qsort_argtype, [AC_TRY_COMPILE([ #include "l_stdlib.h" @@ -1330,7 +1409,7 @@ esac CFLAGS=$save_CFLAGS -AC_CACHE_CHECK(if we need to declare 'errno', ac_cv_decl_errno, +AC_CACHE_CHECK([if we need to declare 'errno'], ac_cv_decl_errno, [AC_TRY_COMPILE([#ifdef HAVE_ERRNO_H #include #endif], @@ -1348,7 +1427,7 @@ dnl MT purposes. This makes the line "extern int h_errno" choke dnl the compiler. Hopefully adding !defined(h_errno) fixes this dnl without breaking any other platforms. dnl -AC_CACHE_CHECK(if we may declare 'h_errno', ac_cv_decl_h_errno, +AC_CACHE_CHECK([if we may declare 'h_errno'], ac_cv_decl_h_errno, [AC_TRY_COMPILE([#include #ifdef HAVE_NETINET_IN_H #include @@ -1381,7 +1460,7 @@ case "$ac_cv_decl_sys_errlist" in yes) AC_DEFINE(CHAR_SYS_ERRLIST, 1, [Declare char *sys_errlist array]) ;; esac -AC_CACHE_CHECK(if declaring 'syscall()' is ok, ac_cv_decl_syscall, +AC_CACHE_CHECK([if declaring 'syscall()' is ok], ac_cv_decl_syscall, [AC_TRY_COMPILE([ #ifdef HAVE_SYS_TYPES_H # include @@ -1499,7 +1578,7 @@ case "$host" in ;; esac -AC_CACHE_CHECK(if we need extra room for SO_RCVBUF, ac_cv_var_rcvbuf_slop, +AC_CACHE_CHECK([if we need extra room for SO_RCVBUF], ac_cv_var_rcvbuf_slop, [ans=no case "$host" in *-*-hpux[[567]]*) @@ -1511,7 +1590,7 @@ case "$ac_cv_var_rcvbuf_slop" in yes) AC_DEFINE(NEED_RCVBUF_SLOP, 1, [Do we need extra room for SO_RCVBUF? (HPUX <8)]) ;; esac -AC_CACHE_CHECK(if we will open the broadcast socket, ac_cv_var_open_bcast_socket, +AC_CACHE_CHECK([if we will open the broadcast socket], ac_cv_var_open_bcast_socket, [ans=yes case "$host" in *-*-domainos) @@ -1523,7 +1602,7 @@ case "$ac_cv_var_open_bcast_socket" in yes) AC_DEFINE(OPEN_BCAST_SOCKET, 1, [Should we open the broadcast socket?]) ;; esac -AC_CACHE_CHECK(if we want the HPUX version of FindConfig(), ac_cv_var_hpux_findconfig, +AC_CACHE_CHECK([if we want the HPUX version of FindConfig()], ac_cv_var_hpux_findconfig, [ans=no case "$host" in *-*-hpux*) @@ -1535,7 +1614,7 @@ case "$ac_cv_var_hpux_findconfig" in yes) AC_DEFINE(NEED_HPUX_FINDCONFIG, 1, [Do we want the HPUX FindConfig()?]) ;; esac -AC_CACHE_CHECK(if process groups are set with -pid, ac_cv_arg_setpgrp_negpid, +AC_CACHE_CHECK([if process groups are set with -pid], ac_cv_arg_setpgrp_negpid, [case "$host" in *-*-hpux[[567]]*) ans=no @@ -1543,7 +1622,7 @@ AC_CACHE_CHECK(if process groups are set with -pid, ac_cv_arg_setpgrp_negpid, *-*-hpux*) ans=yes ;; - *-*-linux*) + *-*-*linux*) ans=yes ;; *-*-sunos3*) @@ -1561,7 +1640,7 @@ case "$ac_cv_arg_setpgrp_negpid" in yes) AC_DEFINE(UDP_BACKWARDS_SETOWN, 1, [Do we set process groups with -pid?]) ;; esac -AC_CACHE_CHECK(if we need a ctty for F_SETOWN, ac_cv_func_ctty_for_f_setown, +AC_CACHE_CHECK([if we need a ctty for F_SETOWN], ac_cv_func_ctty_for_f_setown, [[case "$host" in *-*-bsdi[23]*) ans=yes @@ -1578,6 +1657,9 @@ AC_CACHE_CHECK(if we need a ctty for F_SETOWN, ac_cv_func_ctty_for_f_setown, *-*-osf*) ans=yes ;; + *-*-darwin*) + ans=yes + ;; *) ans=no ;; esac @@ -1586,7 +1668,7 @@ case "$ac_cv_func_ctty_for_f_setown" in yes) AC_DEFINE(USE_FSETOWNCTTY, 1, [Must we have a CTTY for fsetown?]) ;; esac -AC_CACHE_CHECK(if the OS misses to clear cached routes when more specific routes become available, ac_cv_os_routeupdates, +AC_CACHE_CHECK([if the OS fails to clear cached routes when more specific routes become available], ac_cv_os_routeupdates, [[case "$host" in *-*-netbsd*) ans=yes @@ -1599,9 +1681,9 @@ case "$ac_cv_os_routeupdates" in yes) AC_DEFINE(OS_MISSES_SPECIFIC_ROUTE_UPDATES, 1, [need to recreate sockets on changed routing?]) ;; esac -AC_CACHE_CHECK(if the OS needs the wildcard socket set to REUSEADDR for binding interface addresses, ac_cv_os_wildcardreuse, +AC_CACHE_CHECK([if the OS needs the wildcard socket set to REUSEADDR for binding interface addresses], ac_cv_os_wildcardreuse, [[case "$host" in - *-*-linux*) + *-*-*linux*) ans=yes ;; *) ans=no @@ -1613,7 +1695,7 @@ case "$ac_cv_os_wildcardreuse" in esac ntp_warning='GRONK' -AC_MSG_CHECKING(if we'll use clock_settime or settimeofday or stime) +AC_MSG_CHECKING([if we'll use clock_settime or settimeofday or stime]) case "$ac_cv_func_clock_settime$ac_cv_func_settimeofday$ac_cv_func_stime" in yes*) ntp_warning='' @@ -1634,14 +1716,14 @@ case "$ac_cv_func_clock_settime$ac_cv_func_settimeofday$ac_cv_func_stime" in ;; esac esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) case "$ntp_warning" in '') ;; - *) AC_MSG_WARN(*** $ntp_warning ***) + *) AC_MSG_WARN([*** $ntp_warning ***]) ;; esac -AC_CACHE_CHECK(if we have a losing syscall(), ac_cv_var_syscall_bug, +AC_CACHE_CHECK([if we have a losing syscall()], ac_cv_var_syscall_bug, [case "$host" in *-*-solaris2.4*) ans=yes @@ -1654,7 +1736,7 @@ case "$ac_cv_var_syscall_bug" in yes) AC_DEFINE(SYSCALL_BUG, 1, [Buggy syscall() (Solaris2.4)?]) ;; esac -AC_CACHE_CHECK(for SIGIO, ac_cv_hdr_def_sigio, +AC_CACHE_CHECK([for SIGIO], ac_cv_hdr_def_sigio, AC_EGREP_CPP(yes, [#include #ifdef SIGIO @@ -1663,7 +1745,7 @@ AC_CACHE_CHECK(for SIGIO, ac_cv_hdr_def_sigio, ], ac_cv_hdr_def_sigio=yes, ac_cv_hdr_def_sigio=no)) dnl Override those system that have a losing SIGIO -AC_CACHE_CHECK(if we want to use signalled IO, ac_cv_var_signalled_io, +AC_CACHE_CHECK([if we want to use signalled IO], ac_cv_var_signalled_io, [ans=no case "$ac_cv_hdr_def_sigio" in yes) @@ -1693,7 +1775,7 @@ case "$ac_cv_hdr_def_sigio" in *-*-freebsd*) ans=no ;; - *-*-linux*) + *-*-*linux*) ans=no ;; *-*-unicosmp*) @@ -1707,7 +1789,7 @@ case "$ac_cv_var_signalled_io" in yes) AC_DEFINE(HAVE_SIGNALED_IO, 1, [Can we use SIGIO for tcp and udp IO?]) ;; esac -AC_CACHE_CHECK(for SIGPOLL, ac_cv_hdr_def_sigpoll, +AC_CACHE_CHECK([for SIGPOLL], ac_cv_hdr_def_sigpoll, AC_EGREP_CPP(yes, [#include #ifdef SIGPOLL @@ -1715,7 +1797,7 @@ AC_CACHE_CHECK(for SIGPOLL, ac_cv_hdr_def_sigpoll, #endif ], ac_cv_hdr_def_sigpoll=yes, ac_cv_hdr_def_sigpoll=no)) -AC_CACHE_CHECK(for SIGSYS, ac_cv_hdr_def_sigsys, +AC_CACHE_CHECK([for SIGSYS], ac_cv_hdr_def_sigsys, AC_EGREP_CPP(yes, [#include #ifdef SIGSYS @@ -1723,7 +1805,7 @@ AC_CACHE_CHECK(for SIGSYS, ac_cv_hdr_def_sigsys, #endif ], ac_cv_hdr_def_sigsys=yes, ac_cv_hdr_def_sigsys=no)) -AC_CACHE_CHECK(if we can use SIGPOLL for UDP I/O, ac_cv_var_use_udp_sigpoll, +AC_CACHE_CHECK([if we can use SIGPOLL for UDP I/O], ac_cv_var_use_udp_sigpoll, [ans=no case "$ac_cv_hdr_def_sigpoll" in yes) @@ -1740,13 +1822,13 @@ case "$ac_cv_hdr_def_sigpoll" in *-sni-sysv*) ans=no ;; - *-*-aix[[45]]*) + *-*-aix[[456]]*) ans=no ;; *-*-hpux*) ans=no ;; - *-*-linux*) + *-*-*linux*) ans=no ;; *-*-osf*) @@ -1758,6 +1840,9 @@ case "$ac_cv_hdr_def_sigpoll" in *-*-sunos*) ans=no ;; + *-*-solaris*) + ans=no + ;; *-*-ultrix*) ans=no ;; @@ -1774,7 +1859,7 @@ case "$ac_cv_var_use_udp_sigpoll" in yes) AC_DEFINE(USE_UDP_SIGPOLL, 1, [Can we use SIGPOLL for UDP?]) ;; esac -AC_CACHE_CHECK(if we can use SIGPOLL for TTY I/O, ac_cv_var_use_tty_sigpoll, +AC_CACHE_CHECK([if we can use SIGPOLL for TTY I/O], ac_cv_var_use_tty_sigpoll, [ans=no case "$ac_cv_hdr_def_sigpoll" in yes) @@ -1791,13 +1876,13 @@ case "$ac_cv_hdr_def_sigpoll" in *-sni-sysv*) ans=no ;; - *-*-aix[[45]]*) + *-*-aix[[456]]*) ans=no ;; *-*-hpux*) ans=no ;; - *-*-linux*) + *-*-*linux*) ans=no ;; *-*-osf*) @@ -1827,7 +1912,7 @@ esac case "$ac_cv_header_sys_sio_h" in yes) - AC_CACHE_CHECK(sys/sio.h for TIOCDCDTIMESTAMP, ac_cv_hdr_def_tiocdcdtimestamp, + AC_CACHE_CHECK([sys/sio.h for TIOCDCDTIMESTAMP], ac_cv_hdr_def_tiocdcdtimestamp, AC_EGREP_CPP(yes, [#include #ifdef TIOCDCDTIMESTAMP @@ -1843,7 +1928,7 @@ case "$ac_cv_hdr_def_tiocdcdtimestamp" in ;; esac -AC_CACHE_CHECK(if nlist() values might require extra indirection, +AC_CACHE_CHECK([if nlist() values might require extra indirection], ac_cv_var_nlist_extra_indirection, [ans=no case "$host" in @@ -1856,7 +1941,7 @@ case "$ac_cv_var_nlist_extra_indirection" in yes) AC_DEFINE(NLIST_EXTRA_INDIRECTION, 1, [Might nlist() values require an extra level of indirection (AIX)?]) ;; esac -AC_CACHE_CHECK(for a minimum recommended value of tickadj, +AC_CACHE_CHECK([for a minimum recommended value of tickadj], ac_cv_var_min_rec_tickadj, [ans=no case "$host" in @@ -1870,11 +1955,11 @@ case "$ac_cv_var_min_rec_tickadj" in *) AC_DEFINE_UNQUOTED(MIN_REC_TICKADJ, $ac_cv_var_min_rec_tickadj, [Should we recommend a minimum value for tickadj?]) ;; esac -AC_CACHE_CHECK(if the TTY code permits PARENB and IGNPAR, +AC_CACHE_CHECK([if the TTY code permits PARENB and IGNPAR], ac_cv_var_no_parenb_ignpar, [ans=no case "$host" in - i?86-*-linux*) + i?86-*-*linux*) ans=yes ;; mips-sgi-irix*) @@ -1894,7 +1979,7 @@ case "$ac_cv_var_no_parenb_ignpar" in yes) AC_DEFINE(NO_PARENB_IGNPAR, 1, [Is there a problem using PARENB and IGNPAR (IRIX)?]) ;; esac -AC_MSG_CHECKING(if we're including debugging code) +AC_MSG_CHECKING([if we're including debugging code]) AC_ARG_ENABLE(debugging, AC_HELP_STRING([--enable-debugging], [+ include debugging code]), [ntp_ok=$enableval], [ntp_ok=yes]) @@ -1903,7 +1988,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(if we including processing time debugging code) +AC_MSG_CHECKING([if we including processing time debugging code]) AC_ARG_ENABLE(debug-timing, AC_HELP_STRING([--enable-debug-timing], [- include processing time debugging code (costs performance)]), [ntp_ok=$enableval], [ntp_ok=no]) @@ -1912,30 +1997,53 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(for a the number of minutes in a DST adjustment) -AC_ARG_ENABLE(dst_minutes, - AC_HELP_STRING([--enable-dst-minutes=60], [+ minutes per DST adjustment]), - [ans=$enableval], [ans=60]) +AC_MSG_CHECKING([[for a the number of minutes in a DST adjustment]]) +AC_ARG_ENABLE( + [dst_minutes], + AS_HELP_STRING( + [--enable-dst-minutes], + [n minutes per DST adjustment @<:@60@:>@] dnl @<:@ is [ + ), + [ans=$enableval], + [ans=60] +) AC_DEFINE_UNQUOTED(DSTMINUTES, $ans, [The number of minutes in a DST adjustment]) -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) -AC_CACHE_CHECK(if we have the tty_clk line discipline/streams module, +AC_MSG_CHECKING([[if ntpd will retry on permanent DNS errors]]) +AC_ARG_ENABLE( + [ignore-dns-errors], + AS_HELP_STRING( + [--enable-ignore-dns-errors], + [- retry DNS queries on any error] + ), + [ans=$enableval], + [ans=no] +) +case "$ans" in + yes) + AC_DEFINE(IGNORE_DNS_ERRORS, 1, [[Retry queries on _any_ DNS error?]]) +esac +AC_MSG_RESULT([$ans]) + +AC_CACHE_CHECK([if we have the tty_clk line discipline/streams module], ac_cv_var_tty_clk, [case "$ac_cv_header_sys_clkdefs_h$ac_cv_hdr_def_tiocdcdtimestamp" in *yes*) ac_cv_var_tty_clk=yes ;; + *) ac_cv_var_tty_clk=no ;; esac]) case "$ac_cv_var_tty_clk" in yes) AC_DEFINE(TTYCLK, 1, [Do we have the tty_clk line discipline/streams module?]) ;; esac -AC_CACHE_CHECK(for the ppsclock streams module, +AC_CACHE_CHECK([for the ppsclock streams module], ac_cv_var_ppsclock, ac_cv_var_ppsclock=$ac_cv_struct_ppsclockev) case "$ac_cv_var_ppsclock" in yes) AC_DEFINE(PPS, 1, [Do we have the ppsclock streams module?]) ;; esac -AC_CACHE_CHECK(for kernel multicast support, ac_cv_var_mcast, +AC_CACHE_CHECK([for kernel multicast support], ac_cv_var_mcast, [ac_cv_var_mcast=no case "$host" in i386-sequent-sysv4) ;; @@ -1952,7 +2060,7 @@ case "$ac_cv_var_mcast" in AC_CACHE_CHECK([[arg type needed for IP*_MULTICAST_LOOP for setsockopt()]], ac_cv_var_typeof_ip_multicast_loop, [case "$host" in - *-*-netbsd*|*-*-linux*) + *-*-netbsd*|*-*-*linux*) ac_cv_var_typeof_ip_multicast_loop=u_int ;; *-*-winnt*) @@ -2036,6 +2144,7 @@ case "$ac_cv_var_size_returned_in_buffer" in yes) AC_DEFINE(SIZE_RETURNED_IN_BUFFER, 1, [Does SIOCGIFCONF return size in the buffer?]) ;; esac +dnl vvvvv-- this is wrong, if you re-enable the switch do not cache the result dnl AC_CACHE_CHECK(if we want GDT surveying code, ac_cv_var_gdt_surveying, dnl [AC_ARG_ENABLE(gdt-surveying, [ --enable-gdt-surveying - include GDT survey code], dnl [ans=$enableval], [ans=no]) @@ -2081,7 +2190,7 @@ fi AC_MSG_RESULT($ntp_ok) # Check for ioctls CIOGETEV -AC_MSG_CHECKING(ioctl CIOGETEV) +AC_MSG_CHECKING([ioctl CIOGETEV]) if test "$ac_cv_header_sys_ppsclock_h" = "yes"; then AC_EGREP_CPP(yes, [#include @@ -2134,7 +2243,7 @@ esac # Check for ioctls TIOCGSERIAL, TIOCSSERIAL, ASYNC_PPS_CD_POS, ASYNC_PPS_CD_NEG AC_CHECK_HEADER(linux/serial.h) -AC_MSG_CHECKING(ioctl TIOCGSERIAL, TIOCSSERIAL, ASYNC_PPS_CD_POS, ASYNC_PPS_CD_NEG) +AC_MSG_CHECKING([ioctl TIOCGSERIAL, TIOCSSERIAL, ASYNC_PPS_CD_POS, ASYNC_PPS_CD_NEG]) case "$ac_cv_header_sys_ppsclock_h$ac_cv_header_linux_serial_h" in yesyes) AC_EGREP_CPP(yes, @@ -2167,7 +2276,7 @@ fi AC_MSG_RESULT($ntp_ok) # Check for SHMEM_STATUS support -AC_MSG_CHECKING(SHMEM_STATUS support) +AC_MSG_CHECKING([SHMEM_STATUS support]) case "$ac_cv_header_sys_mman_h" in yes) ntp_ok=yes ;; *) ntp_ok=no ;; @@ -2193,7 +2302,7 @@ dnl AC_SUBST(UNIXCERT) ntp_refclock=no # HPUX only, and by explicit request -AC_MSG_CHECKING(Datum/Bancomm bc635/VME interface) +AC_MSG_CHECKING([Datum/Bancomm bc635/VME interface]) AC_ARG_ENABLE(BANCOMM, AC_HELP_STRING([--enable-BANCOMM], [- Datum/Bancomm bc635/VME interface]), [ntp_ok=$enableval], [ntp_ok=no]) @@ -2204,11 +2313,11 @@ fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$host" in yes*-*-hpux*) ;; - yes*) AC_MSG_WARN(*** But the expected answer is... no ***) ;; + yes*) AC_MSG_WARN([*** But the expected answer is... no ***]) ;; esac #HPUX only, and only by explicit request -AC_MSG_CHECKING(TrueTime GPS receiver/VME interface) +AC_MSG_CHECKING([TrueTime GPS receiver/VME interface]) AC_ARG_ENABLE(GPSVME, AC_HELP_STRING([--enable-GPSVME], [- TrueTime GPS receiver/VME interface]), [ntp_ok=$enableval], [ntp_ok=no]) @@ -2219,10 +2328,10 @@ fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$host" in yes*-*-hpux*) ;; - yes*) AC_MSG_WARN(*** But the expected answer is... no ***) ;; + yes*) AC_MSG_WARN([*** But the expected answer is... no ***]) ;; esac -AC_MSG_CHECKING(for PCL720 clock support) +AC_MSG_CHECKING([for PCL720 clock support]) case "$ac_cv_header_machine_inline_h$ac_cv_header_sys_pcl720_h$ac_cv_header_sys_i8253_h" in yesyesyes) AC_DEFINE(CLOCK_PPS720, 1, [PCL 720 clock support]) @@ -2232,16 +2341,16 @@ case "$ac_cv_header_machine_inline_h$ac_cv_header_sys_pcl720_h$ac_cv_header_sys_ ans=no ;; esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) -AC_MSG_CHECKING(for default inclusion of all suitable non-PARSE clocks) +AC_MSG_CHECKING([for default inclusion of all suitable non-PARSE clocks]) AC_ARG_ENABLE(all-clocks, AC_HELP_STRING([--enable-all-clocks], [+ include all suitable non-PARSE clocks:]), [ntp_eac=$enableval], [ntp_eac=yes]) AC_MSG_RESULT($ntp_eac) # HMS: Should we also require ac_cv_var_parse_ok? -AC_MSG_CHECKING(if we have support for PARSE clocks) +AC_MSG_CHECKING([if we have support for PARSE clocks]) case "$ac_cv_var_atom_ok$ac_cv_header_termio_h$ac_cv_header_termios_h" in yes*yes*) ntp_canparse=yes @@ -2271,7 +2380,7 @@ esac AC_MSG_RESULT($ntp_canshm) # Requires modem control -AC_MSG_CHECKING(ACTS modem service) +AC_MSG_CHECKING([ACTS modem service]) AC_ARG_ENABLE(ACTS, AC_HELP_STRING([--enable-ACTS], [s ACTS modem service]), [ntp_ok=$enableval], @@ -2290,7 +2399,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Arbiter 1088A/B GPS receiver) +AC_MSG_CHECKING([Arbiter 1088A/B GPS receiver]) AC_ARG_ENABLE(ARBITER, AC_HELP_STRING([--enable-ARBITER], [+ Arbiter 1088A/B GPS receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2300,7 +2409,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Arcron MSF receiver) +AC_MSG_CHECKING([Arcron MSF receiver]) AC_ARG_ENABLE(ARCRON_MSF, AC_HELP_STRING([--enable-ARCRON-MSF], [+ Arcron MSF receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2310,7 +2419,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Austron 2200A/2201A GPS receiver) +AC_MSG_CHECKING([Austron 2200A/2201A GPS receiver]) AC_ARG_ENABLE(AS2201, AC_HELP_STRING([--enable-AS2201], [+ Austron 2200A/2201A GPS receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2320,7 +2429,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(ATOM PPS interface) +AC_MSG_CHECKING([ATOM PPS interface]) AC_ARG_ENABLE(ATOM, AC_HELP_STRING([--enable-ATOM], [s ATOM PPS interface]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2333,7 +2442,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Chrono-log K-series WWVB receiver) +AC_MSG_CHECKING([Chrono-log K-series WWVB receiver]) AC_ARG_ENABLE(CHRONOLOG, AC_HELP_STRING([--enable-CHRONOLOG], [+ Chrono-log K-series WWVB receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2343,7 +2452,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(CHU modem/decoder) +AC_MSG_CHECKING([CHU modem/decoder]) AC_ARG_ENABLE(CHU, AC_HELP_STRING([--enable-CHU], [+ CHU modem/decoder]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2354,7 +2463,7 @@ fi AC_MSG_RESULT($ntp_ok) ac_refclock_chu=$ntp_ok -AC_MSG_CHECKING(CHU audio/decoder) +AC_MSG_CHECKING([CHU audio/decoder]) AC_ARG_ENABLE(AUDIO-CHU, AC_HELP_STRING([--enable-AUDIO-CHU], [s CHU audio/decoder]), [ntp_ok=$enableval], @@ -2368,11 +2477,11 @@ fi AC_MSG_RESULT($ntp_ok) # We used to check for sunos/solaris target... case "$ntp_ok$ac_refclock_chu$ntp_canaudio" in - yes*no*) AC_MSG_WARN(*** But the expected answer is...no ***) ;; + yes*no*) AC_MSG_WARN([*** But the expected answer is...no ***]) ;; esac # Not under HP-UX -AC_MSG_CHECKING(Datum Programmable Time System) +AC_MSG_CHECKING([Datum Programmable Time System]) AC_ARG_ENABLE(DATUM, AC_HELP_STRING([--enable-DATUM], [s Datum Programmable Time System]), [ntp_ok=$enableval], @@ -2389,7 +2498,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Dumb generic hh:mm:ss local clock) +AC_MSG_CHECKING([Dumb generic hh:mm:ss local clock]) AC_ARG_ENABLE(DUMBCLOCK, AC_HELP_STRING([--enable-DUMBCLOCK], [+ Dumb generic hh:mm:ss local clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2399,7 +2508,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Forum Graphic GPS) +AC_MSG_CHECKING([Forum Graphic GPS]) AC_ARG_ENABLE(FG, AC_HELP_STRING([--enable-FG], [+ Forum Graphic GPS]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2410,7 +2519,7 @@ fi AC_MSG_RESULT($ntp_ok) # Requires modem control -AC_MSG_CHECKING(Heath GC-1000 WWV/WWVH receiver) +AC_MSG_CHECKING([Heath GC-1000 WWV/WWVH receiver]) AC_ARG_ENABLE(HEATH, AC_HELP_STRING([--enable-HEATH], [s Heath GC-1000 WWV/WWVH receiver]), [ntp_ok=$enableval], @@ -2429,7 +2538,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(for hopf serial clock device) +AC_MSG_CHECKING([for hopf serial clock device]) AC_ARG_ENABLE(HOPFSERIAL, AC_HELP_STRING([--enable-HOPFSERIAL], [+ hopf serial clock device]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2439,7 +2548,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(for hopf PCI clock 6039) +AC_MSG_CHECKING([for hopf PCI clock 6039]) AC_ARG_ENABLE(HOPFPCI, AC_HELP_STRING([--enable-HOPFPCI], [+ hopf 6039 PCI board]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2449,7 +2558,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(HP 58503A GPS receiver) +AC_MSG_CHECKING([HP 58503A GPS receiver]) AC_ARG_ENABLE(HPGPS, AC_HELP_STRING([--enable-HPGPS], [+ HP 58503A GPS receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2459,7 +2568,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(IRIG audio decoder) +AC_MSG_CHECKING([IRIG audio decoder]) AC_ARG_ENABLE(IRIG, AC_HELP_STRING([--enable-IRIG], [s IRIG audio decoder]), [ntp_ok=$enableval], @@ -2473,10 +2582,10 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$ntp_canaudio" in - yesno) AC_MSG_WARN(*** But the expected answer is... no ***) ;; + yesno) AC_MSG_WARN([*** But the expected answer is... no ***]) ;; esac -AC_MSG_CHECKING(for JJY receiver) +AC_MSG_CHECKING([for JJY receiver]) AC_ARG_ENABLE(JJY, AC_HELP_STRING([--enable-JJY], [+ JJY receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2486,7 +2595,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Rockwell Jupiter GPS receiver) +AC_MSG_CHECKING([Rockwell Jupiter GPS receiver]) AC_ARG_ENABLE(JUPITER, AC_HELP_STRING([--enable-JUPITER], [s Rockwell Jupiter GPS receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2499,7 +2608,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Leitch CSD 5300 Master Clock System Driver) +AC_MSG_CHECKING([Leitch CSD 5300 Master Clock System Driver]) AC_ARG_ENABLE(LEITCH, AC_HELP_STRING([--enable-LEITCH], [+ Leitch CSD 5300 Master Clock System Driver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2509,7 +2618,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(local clock reference) +AC_MSG_CHECKING([local clock reference]) AC_ARG_ENABLE(LOCAL-CLOCK, AC_HELP_STRING([--enable-LOCAL-CLOCK], [+ local clock reference]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2531,7 +2640,7 @@ dnl fi dnl AC_MSG_RESULT($ntp_ok) # Not Ultrix -AC_MSG_CHECKING(Magnavox MX4200 GPS receiver) +AC_MSG_CHECKING([Magnavox MX4200 GPS receiver]) AC_ARG_ENABLE(MX4200, AC_HELP_STRING([--enable-MX4200 ], [s Magnavox MX4200 GPS receiver]), [ntp_ok=$enableval], @@ -2550,7 +2659,7 @@ case "$ntp_ok$host" in yes*-*-ultrix*) AC_MSG_WARN(*** But the expected answer is... no ***) ;; esac -AC_MSG_CHECKING(for NeoClock4X receiver) +AC_MSG_CHECKING([for NeoClock4X receiver]) AC_ARG_ENABLE(NEOCLOCK4X, AC_HELP_STRING([--enable-NEOCLOCK4X], [+ NeoClock4X DCF77 / TDF receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2560,7 +2669,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(NMEA GPS receiver) +AC_MSG_CHECKING([NMEA GPS receiver]) AC_ARG_ENABLE(NMEA, AC_HELP_STRING([--enable-NMEA], [+ NMEA GPS receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2570,7 +2679,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(for ONCORE Motorola VP/UT Oncore GPS) +AC_MSG_CHECKING([for ONCORE Motorola VP/UT Oncore GPS]) AC_ARG_ENABLE(ONCORE, AC_HELP_STRING([--enable-ONCORE], [s Motorola VP/UT Oncore GPS receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2583,7 +2692,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(for Palisade clock) +AC_MSG_CHECKING([for Palisade clock]) AC_ARG_ENABLE(PALISADE, AC_HELP_STRING([--enable-PALISADE], [s Palisade clock]), [ntp_ok=$enableval], @@ -2601,7 +2710,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Conrad parallel port radio clock) +AC_MSG_CHECKING([Conrad parallel port radio clock]) AC_ARG_ENABLE(PCF, AC_HELP_STRING([--enable-PCF ], [+ Conrad parallel port radio clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2611,7 +2720,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(PST/Traconex 1020 WWV/WWVH receiver) +AC_MSG_CHECKING([PST/Traconex 1020 WWV/WWVH receiver]) AC_ARG_ENABLE(PST, AC_HELP_STRING([--enable-PST], [+ PST/Traconex 1020 WWV/WWVH receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2621,7 +2730,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(RIPENCC specific Trimble driver) +AC_MSG_CHECKING([RIPENCC specific Trimble driver]) AC_ARG_ENABLE(RIPENCC, AC_HELP_STRING([--enable-RIPENCC], [- RIPENCC specific Trimble driver]), [ntp_ok=$enableval], [ntp_ok=no]) @@ -2637,7 +2746,7 @@ AC_MSG_RESULT($ntp_ok) # Danny Meyer says SHM compiles (with a few warnings) under Win32. # For *IX, we need sys/ipc.h and sys/shm.h. -AC_MSG_CHECKING(for SHM clock attached thru shared memory) +AC_MSG_CHECKING([for SHM clock attached thru shared memory]) AC_ARG_ENABLE(SHM, AC_HELP_STRING([--enable-SHM], [s SHM clock attached thru shared memory]), [ntp_ok=$enableval], @@ -2651,7 +2760,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Spectracom 8170/Netclock/2 WWVB receiver) +AC_MSG_CHECKING([Spectracom 8170/Netclock/2 WWVB receiver]) AC_ARG_ENABLE(SPECTRACOM, AC_HELP_STRING([--enable-SPECTRACOM], [+ Spectracom 8170/Netclock/2 WWVB receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2661,7 +2770,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(KSI/Odetics TPRO/S GPS receiver/IRIG interface) +AC_MSG_CHECKING([KSI/Odetics TPRO/S GPS receiver/IRIG interface]) AC_ARG_ENABLE(TPRO, AC_HELP_STRING([--enable-TPRO], [s KSI/Odetics TPRO/S GPS receiver/IRIG interface]), [ntp_ok=$enableval], @@ -2678,7 +2787,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$ac_cv_header_sys_tpro" in - yesno) AC_MSG_WARN(*** But the expected answer is... no ***) ;; + yesno) AC_MSG_WARN([*** But the expected answer is... no ***]) ;; esac dnl Bug 342: longstanding unfixed bugs @@ -2693,7 +2802,7 @@ dnl fi dnl AC_MSG_RESULT($ntp_ok) # Not on a vax-dec-bsd -AC_MSG_CHECKING(Kinemetrics/TrueTime receivers) +AC_MSG_CHECKING([Kinemetrics/TrueTime receivers]) AC_ARG_ENABLE(TRUETIME, AC_HELP_STRING([--enable-TRUETIME], [s Kinemetrics/TrueTime receivers]), [ntp_ok=$enableval], @@ -2705,16 +2814,17 @@ AC_ARG_ENABLE(TRUETIME, ntp_ok=$ntp_eac ;; esac]) + if test "$ntp_ok" = "yes"; then ntp_refclock=yes AC_DEFINE(CLOCK_TRUETIME, 1, [Kinemetrics/TrueTime receivers]) fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$host" in - yesvax-dec-bsd) AC_MSG_WARN(*** But the expected answer is... no ***) ;; + yesvax-dec-bsd) AC_MSG_WARN([*** But the expected answer is... no ***]) ;; esac -AC_MSG_CHECKING(TrueTime 560 IRIG-B decoder) +AC_MSG_CHECKING([TrueTime 560 IRIG-B decoder]) AC_ARG_ENABLE(TT560, AC_HELP_STRING([--enable-TT560], [- TrueTime 560 IRIG-B decoder]), [ntp_ok=$enableval], [ntp_ok=no]) @@ -2724,7 +2834,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(Ultralink M320 WWVB receiver) +AC_MSG_CHECKING([Ultralink M320 WWVB receiver]) AC_ARG_ENABLE(ULINK, AC_HELP_STRING([--enable-ULINK], [+ Ultralink WWVB receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2734,7 +2844,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(WWV receiver) +AC_MSG_CHECKING([WWV receiver]) AC_ARG_ENABLE(WWV, AC_HELP_STRING([--enable-WWV], [s WWV Audio receiver]), [ntp_ok=$enableval], @@ -2751,7 +2861,7 @@ case "$ntp_ok$ntp_canaudio" in yesno) AC_MSG_WARN(*** But the expected answer is... no ***) ;; esac -AC_MSG_CHECKING(for Zyfer receiver) +AC_MSG_CHECKING([for Zyfer receiver]) AC_ARG_ENABLE(ZYFER, AC_HELP_STRING([--enable-ZYFER], [+ Zyfer GPStarplus receiver]), [ntp_ok=$enableval], [ntp_ok=$ntp_eac]) @@ -2761,7 +2871,7 @@ if test "$ntp_ok" = "yes"; then fi AC_MSG_RESULT($ntp_ok) -AC_MSG_CHECKING(for default inclusion of all suitable PARSE clocks) +AC_MSG_CHECKING([for default inclusion of all suitable PARSE clocks]) AC_ARG_ENABLE(parse-clocks, AC_HELP_STRING([--enable-parse-clocks], [- include all suitable PARSE clocks:]), [ntp_eapc=$enableval], @@ -2775,10 +2885,10 @@ AC_MSG_RESULT($ntp_eapc) case "$ntp_eac$ntp_eapc$ntp_canparse" in noyes*) - AC_MSG_ERROR("--enable-parse-clocks" requires "--enable-all-clocks".) + AC_MSG_ERROR(["--enable-parse-clocks" requires "--enable-all-clocks".]) ;; yesyesno) - AC_MSG_ERROR(You said "--enable-parse-clocks" but PARSE isn't supported on this platform!) + AC_MSG_ERROR([You said "--enable-parse-clocks" but PARSE isn't supported on this platform!]) ;; *) ;; esac @@ -2787,7 +2897,7 @@ ntp_libparse=no ntp_parseutil=no ntp_rawdcf=no -AC_MSG_CHECKING(Diem Computime Radio Clock) +AC_MSG_CHECKING([Diem Computime Radio Clock]) AC_ARG_ENABLE(COMPUTIME, AC_HELP_STRING([--enable-COMPUTIME], [s Diem Computime Radio Clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2799,11 +2909,11 @@ fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$ntp_canparse" in yesno) - AC_MSG_ERROR(That's a parse clock and this system doesn't support it!) + AC_MSG_ERROR([That's a parse clock and this system doesn't support it!]) ;; esac -AC_MSG_CHECKING(ELV/DCF7000 clock) +AC_MSG_CHECKING([ELV/DCF7000 clock]) AC_ARG_ENABLE(DCF7000, AC_HELP_STRING([--enable-DCF7000], [s ELV/DCF7000 clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2815,11 +2925,11 @@ fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$ntp_canparse" in yesno) - AC_MSG_ERROR(That's a parse clock and this system doesn't support it!) + AC_MSG_ERROR([That's a parse clock and this system doesn't support it!]) ;; esac -AC_MSG_CHECKING(HOPF 6021 clock) +AC_MSG_CHECKING([HOPF 6021 clock]) AC_ARG_ENABLE(HOPF6021, AC_HELP_STRING([--enable-HOPF6021 ], [s HOPF 6021 clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2831,11 +2941,11 @@ fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$ntp_canparse" in yesno) - AC_MSG_ERROR(That's a parse clock and this system doesn't support it!) + AC_MSG_ERROR([That's a parse clock and this system doesn't support it!]) ;; esac -AC_MSG_CHECKING(Meinberg clocks) +AC_MSG_CHECKING([Meinberg clocks]) AC_ARG_ENABLE(MEINBERG, AC_HELP_STRING([--enable-MEINBERG], [s Meinberg clocks]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2847,11 +2957,11 @@ fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$ntp_canparse" in yesno) - AC_MSG_ERROR(That's a parse clock and this system doesn't support it!) + AC_MSG_ERROR([That's a parse clock and this system doesn't support it!]) ;; esac -AC_MSG_CHECKING(DCF77 raw time code) +AC_MSG_CHECKING([DCF77 raw time code]) AC_ARG_ENABLE(RAWDCF, AC_HELP_STRING([--enable-RAWDCF], [s DCF77 raw time code]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2871,11 +2981,11 @@ esac case "$ntp_rawdcf" in yes) - AC_CACHE_CHECK(if we must enable parity for RAWDCF, + AC_CACHE_CHECK([if we must enable parity for RAWDCF], ac_cv_var_rawdcf_parity, [ans=no case "$host" in - *-*-linux*) + *-*-*linux*) ans=yes ;; esac @@ -2890,7 +3000,7 @@ case "$ntp_rawdcf" in ;; esac -AC_MSG_CHECKING(RCC 8000 clock) +AC_MSG_CHECKING([RCC 8000 clock]) AC_ARG_ENABLE(RCC8000, AC_HELP_STRING([--enable-RCC8000], [s RCC 8000 clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2906,7 +3016,7 @@ case "$ntp_ok$ntp_canparse" in ;; esac -AC_MSG_CHECKING(Schmid DCF77 clock) +AC_MSG_CHECKING([Schmid DCF77 clock]) AC_ARG_ENABLE(SCHMID, AC_HELP_STRING([--enable-SCHMID ], [s Schmid DCF77 clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2922,7 +3032,7 @@ case "$ntp_ok$ntp_canparse" in ;; esac -AC_MSG_CHECKING(Trimble GPS receiver/TAIP protocol) +AC_MSG_CHECKING([Trimble GPS receiver/TAIP protocol]) AC_ARG_ENABLE(TRIMTAIP, AC_HELP_STRING([--enable-TRIMTAIP], [s Trimble GPS receiver/TAIP protocol]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2938,7 +3048,7 @@ case "$ntp_ok$ntp_canparse" in ;; esac -AC_MSG_CHECKING(Trimble GPS receiver/TSIP protocol) +AC_MSG_CHECKING([Trimble GPS receiver/TSIP protocol]) AC_ARG_ENABLE(TRIMTSIP, AC_HELP_STRING([--enable-TRIMTSIP], [s Trimble GPS receiver/TSIP protocol]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2954,7 +3064,7 @@ case "$ntp_ok$ntp_canparse" in ;; esac -AC_MSG_CHECKING(WHARTON 400A Series clock) +AC_MSG_CHECKING([WHARTON 400A Series clock]) AC_ARG_ENABLE(WHARTON, AC_HELP_STRING([--enable-WHARTON], [s WHARTON 400A Series clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2970,7 +3080,7 @@ case "$ntp_ok$ntp_canparse" in ;; esac -AC_MSG_CHECKING(VARITEXT clock) +AC_MSG_CHECKING([VARITEXT clock]) AC_ARG_ENABLE(VARITEXT, AC_HELP_STRING([--enable-VARITEXT], [s VARITEXT clock]), [ntp_ok=$enableval], [ntp_ok=$ntp_eapc]) @@ -2982,14 +3092,14 @@ fi AC_MSG_RESULT($ntp_ok) case "$ntp_ok$ntp_canparse" in yesno) - AC_MSG_ERROR(That's a parse clock and this system doesn't support it!) + AC_MSG_ERROR([That's a parse clock and this system doesn't support it!]) ;; esac AC_SUBST(LIBPARSE) AC_SUBST(MAKE_LIBPARSE) AC_SUBST(MAKE_LIBPARSE_KERNEL) AC_SUBST(MAKE_CHECK_Y2K) -AC_MSG_CHECKING(if we need to make and use the parse libraries) +AC_MSG_CHECKING([if we need to make and use the parse libraries]) ans=no case "$ntp_libparse" in yes) @@ -3003,7 +3113,7 @@ case "$ntp_libparse" in AC_DEFINE(CLOCK_ATOM) ;; esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) # AC_SUBST(RSAOBJS) # AC_SUBST(RSASRCS) @@ -3016,7 +3126,7 @@ AC_SUBST(OPENSSL) AC_SUBST(OPENSSL_INC) AC_SUBST(OPENSSL_LIB) -AC_MSG_CHECKING(for openssl library directory) +AC_MSG_CHECKING([for openssl library directory]) AC_ARG_WITH(openssl-libdir, AC_HELP_STRING([--with-openssl-libdir], [+ =/something/reasonable]), [ans=$withval], @@ -3058,9 +3168,9 @@ case "$ans" in esac ;; esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) -AC_MSG_CHECKING(for openssl include directory) +AC_MSG_CHECKING([for openssl include directory]) AC_ARG_WITH(openssl-incdir, AC_HELP_STRING([--with-openssl-incdir], [+ =/something/reasonable]), [ans=$withval], @@ -3094,7 +3204,7 @@ case "$ans" in esac ;; esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) AC_ARG_WITH(crypto, AC_HELP_STRING([--with-crypto], [+ =openssl]), @@ -3121,9 +3231,9 @@ case "$ans" in ;; esac AC_MSG_CHECKING(for the level of crypto support) -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) -AC_MSG_CHECKING(if we want to compile with ElectricFence) +AC_MSG_CHECKING([if we want to compile with ElectricFence]) AC_ARG_WITH(electricfence, AC_HELP_STRING([--with-electricfence], [- compile with ElectricFence malloc debugger]), [ans=$withval], [ans=no]) @@ -3138,10 +3248,10 @@ case "$ans" in ans=yes ;; esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) AC_SUBST(MAKE_CHECK_LAYOUT) -AC_MSG_CHECKING(if we want to run check-layout) +AC_MSG_CHECKING([if we want to run check-layout]) case "$cross_compiling$PATH_PERL" in no/*) MAKE_CHECK_LAYOUT=check-layout @@ -3151,26 +3261,26 @@ case "$cross_compiling$PATH_PERL" in ans=no ;; esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) AC_SUBST(TESTDCF) AC_SUBST(DCFD) -AC_MSG_CHECKING(if we can make dcf parse utilities) +AC_MSG_CHECKING([if we can make dcf parse utilities]) ans=no if test "$ntp_parseutil" = "yes"; then case "$host" in - *-*-sunos4*|*-*-solaris2*|*-*-linux*|*-*-netbsd*) + *-*-sunos4*|*-*-solaris2*|*-*-*linux*|*-*-netbsd*) ans="dcfd testdcf" DCFD=dcfd TESTDCF=testdcf ;; esac fi -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) AC_SUBST(MAKE_PARSEKMODULE) -AC_MSG_CHECKING(if we can build kernel streams modules for parse) +AC_MSG_CHECKING([if we can build kernel streams modules for parse]) ans=no case "$ntp_parseutil$ac_cv_header_sys_stropts_h" in yesyes) @@ -3191,9 +3301,9 @@ case "$ntp_parseutil$ac_cv_header_sys_stropts_h" in esac ;; esac -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) -AC_MSG_CHECKING(if we need basic refclock support) +AC_MSG_CHECKING([if we need basic refclock support]) if test "$ntp_refclock" = "yes"; then AC_DEFINE(REFCLOCK, 1, [Basic refclock support?]) fi @@ -3217,9 +3327,9 @@ if test "$ans" = "yes"; then MAKE_ADJTIMED=adjtimed AC_DEFINE(NEED_HPUX_ADJTIME, 1, [Do we need HPUX adjtime() library support?]) fi -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) -AC_MSG_CHECKING(if we want QNX adjtime support) +AC_MSG_CHECKING([if we want QNX adjtime support]) case "$host" in *-*-qnx*) ans=yes @@ -3230,89 +3340,116 @@ esac if test "$ans" = "yes"; then AC_DEFINE(NEED_QNX_ADJTIME, 1, [Do we need the qnx adjtime call?]) fi -AC_MSG_RESULT($ans) +AC_MSG_RESULT([$ans]) -AC_CACHE_CHECK(if we can read kmem, ac_cv_var_can_kmem, -[AC_ARG_ENABLE(kmem, - AC_HELP_STRING([--enable-kmem], [s read /dev/kmem for tick and/or tickadj]), - [ans=$enableval], - [case "$ac_cv_func_nlist$ac_cv_func_K_open$ac_cv_func_kvm_open" in - *yes*) - ans=yes - ;; - *) ans=no - ;; - esac - case "$host" in - *-*-aix*) - #ans=no - ;; - *-*-domainos) # Won't be found... - ans=no - ;; - *-*-hpux*) - #ans=no - ;; - *-*-irix[[456]]*) - ans=no - ;; - *-*-linux*) - ans=no - ;; - *-*-winnt3.5) - ans=no - ;; - *-*-unicosmp*) - ans=no - ;; - esac - ]) -ac_cv_var_can_kmem=$ans]) +AC_MSG_CHECKING([if we can read kmem]) -case "$ac_cv_var_can_kmem" in - *yes*) ;; - *) AC_DEFINE(NOKMEM, 1, [Should we NOT read /dev/kmem?]) ;; +# the default is to enable it if the system has the capability + +case "$ac_cv_func_nlist$ac_cv_func_K_open$ac_cv_func_kvm_open" in + *yes*) + ans=yes + ;; + *) ans=no esac -AC_CACHE_CHECK(if adjtime is accurate, ac_cv_var_adjtime_is_accurate, -[AC_ARG_ENABLE(accurate-adjtime, - AC_HELP_STRING([--enable-accurate-adjtime], [s the adjtime() call is accurate]), +case "$host" in + *-*-domainos) # Won't be found... + ans=no + ;; + *-*-hpux*) + #ans=no + ;; + *-*-irix[[456]]*) + ans=no + ;; + *-*-*linux*) + ans=no + ;; + *-*-winnt3.5) + ans=no + ;; + *-*-unicosmp*) + ans=no + ;; +esac + +# --enable-kmem / --disable-kmem controls if present +AC_ARG_ENABLE( + [kmem], + AC_HELP_STRING( + [--enable-kmem], + [s read /dev/kmem for tick and/or tickadj] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in + yes) + can_kmem=yes + ;; + *) + can_kmem=no + AC_DEFINE(NOKMEM, 1, [Should we NOT read /dev/kmem?]) +esac + + +AC_MSG_CHECKING([if adjtime is accurate]) + +# target-dependent defaults + +case "$host" in + i386-sequent-ptx*) + ans=no + ;; + i386-unknown-osf1*) + ans=yes + ;; + mips-sgi-irix[[456]]*) + ans=yes + ;; + *-fujitsu-uxp*) + ans=yes + ;; + *-ibm-aix[[456]]*) + ans=yes + ;; + *-*-*linux*) + ans=yes + ;; + *-*-solaris2.[[01]]) + ans=no + ;; + *-*-solaris2*) + ans=yes + ;; + *-*-unicosmp*) + ans=yes + ;; + *) ans=no +esac + +# --enable-accurate-adjtime / --disable-accurate-adjtime +# override the default +AC_ARG_ENABLE([accurate-adjtime], + AC_HELP_STRING( + [--enable-accurate-adjtime], + [s the adjtime() call is accurate] + ), [ans=$enableval], - [case "$host" in - i386-sequent-ptx*) - ans=no - ;; - i386-unknown-osf1*) - ans=yes - ;; - mips-sgi-irix[[456]]*) - ans=yes - ;; - *-fujitsu-uxp*) - ans=yes - ;; - *-ibm-aix[[45]]*) - ans=yes - ;; - *-*-linux*) - ans=yes - ;; - *-*-solaris2.[[01]]) - ans=no - ;; - *-*-solaris2*) - ans=yes - ;; - *-*-unicosmp*) - ans=yes - ;; - *) ans=no - ;; - esac - ]) -ac_cv_var_adjtime_is_accurate=$ans]) -case "$ac_cv_var_adjtime_is_accurate" in - yes) AC_DEFINE(ADJTIME_IS_ACCURATE, 1, [Is adjtime() accurate?]) ;; +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in + yes) + AC_DEFINE(ADJTIME_IS_ACCURATE, 1, [Is adjtime() accurate?]) + adjtime_is_accurate=yes + ;; + *) + adjtime_is_accurate=no esac AC_CACHE_CHECK([the name of 'tick' in the kernel], @@ -3328,7 +3465,7 @@ case "$host" in *-hp-hpux*) ans=old_tick ;; - *-ibm-aix[[345]]*) + *-ibm-aix[[3456]]*) ans=no ;; *-*-mpeix*) @@ -3535,101 +3672,123 @@ dnl (RS6000 && !NOKMEM), SINIX MIPS dnl But we'll only use these "values" if we can't find anything else. -AC_CACHE_CHECK(for a default value for 'tick', ac_cv_var_tick, -[AC_ARG_ENABLE(tick, - AC_HELP_STRING([--enable-tick=VALUE], [s force a value for 'tick']), - [ans=$enableval], - [ans=no - case "$host" in - XXX-*-pc-cygwin*) - ;; - *-univel-sysv*) - ans=10000 - ;; - *-*-irix*) - ans=10000 - ;; - *-*-linux*) - ans=txc.tick - ;; - *-*-mpeix*) - ans=no - ;; - *-*-winnt3.5) - ans='(every / 10)' - ;; - *-*-unicosmp*) - ans=10000 - ;; - *) - ans='1000000L/hz' - ;; - esac]) -ac_cv_var_tick=$ans]) -case "$ac_cv_var_tick" in - ''|no) ;; # HMS: I think we can only get 'no' here... - *) AC_DEFINE_UNQUOTED(PRESET_TICK, $ac_cv_var_tick, [Preset a value for 'tick'?]) ;; +AC_MSG_CHECKING([for a default value for 'tick']) + +# target-dependent default for tick + +case "$host" in + *-*-pc-cygwin*) + AC_MSG_ERROR([tick needs work for cygwin]) + ;; + *-univel-sysv*) + ans=10000 + ;; + *-*-irix*) + ans=10000 + ;; + *-*-*linux*) + ans=txc.tick + ;; + *-*-mpeix*) + ans=no + ;; + *-*-winnt3.5) + ans='(every / 10)' + ;; + *-*-unicosmp*) + ans=10000 + ;; + *) + ans='1000000L/hz' + ;; esac -AC_CACHE_CHECK(for a default value for 'tickadj', ac_cv_var_tickadj, -[AC_ARG_ENABLE(tickadj, - AC_HELP_STRING([--enable-tickadj=VALUE], [s force a value for 'tickadj']), - [ans=$enableval], - [ans='500/hz' - case "$host" in - *-fujitsu-uxp*) - case "$ac_cv_var_adjtime_is_accurate" in - yes) ans='tick/16' ;; - esac - ;; - XXX-*-pc-cygwin*) - ans=no - ;; - *-univel-sysv*) - ans=80 - ;; - *-*-aix*) - case "$ac_cv_var_can_kmem" in - no) ans=1000 ;; - esac - ;; - *-*-domainos) # Skippy: won't be found... - case "$ac_cv_var_can_kmem" in - no) ans=668 ;; - esac - ;; - *-*-hpux*) - case "$ac_cv_var_adjtime_is_accurate" in - yes) ans='tick/16' ;; - esac - ;; - *-*-irix*) - ans=150 - ;; - *-*-mpeix*) - ans=no - ;; - *-*-sco3.2v5.0*) - ans=10000L/hz - ;; - *-*-solaris2*) - case "$ac_cv_var_adjtime_is_accurate" in - yes) - #ans='tick/16' - ;; - esac - ;; - *-*-winnt3.5) - ans=50 - ;; - *-*-unicosmp*) - ans=150 - ;; - esac]) -ac_cv_var_tickadj=$ans]) -case "$ac_cv_var_tickadj" in +AC_ARG_ENABLE( + [tick], + AC_HELP_STRING( + [--enable-tick=VALUE], + [s force a value for 'tick'] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in ''|no) ;; # HMS: I think we can only get 'no' here... - *) AC_DEFINE_UNQUOTED(PRESET_TICKADJ, $ac_cv_var_tickadj, [Preset a value for 'tickadj'?]) ;; + *) AC_DEFINE_UNQUOTED(PRESET_TICK, [$ans], [Preset a value for 'tick'?]) ;; +esac + + +AC_MSG_CHECKING([for a default value for 'tickadj']) + +# target-specific default + +ans='500/hz' + +case "$host" in + *-fujitsu-uxp*) + case "$adjtime_is_accurate" in + yes) + ans='tick/16' + esac + ;; + XXX-*-pc-cygwin*) + ans=no + ;; + *-univel-sysv*) + ans=80 + ;; + *-*-aix*) + case "$can_kmem" in + no) + ans=1000 + esac + ;; + *-*-domainos) # Skippy: won't be found... + case "$can_kmem" in + no) + ans=668 + esac + ;; + *-*-hpux*) + case "$adjtime_is_accurate" in + yes) + ans='tick/16' + esac + ;; + *-*-irix*) + ans=150 + ;; + *-*-mpeix*) + ans=no + ;; + *-*-sco3.2v5.0*) + ans=10000L/hz + ;; + *-*-winnt3.5) + ans=50 + ;; + *-*-unicosmp*) + ans=150 +esac + +AC_ARG_ENABLE( + [tickadj], + AC_HELP_STRING( + [--enable-tickadj=VALUE], + [s force a value for 'tickadj'] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +default_tickadj=$ans + +case "$default_tickadj" in + ''|no) ;; # HMS: I think we can only get 'no' here... + *) AC_DEFINE_UNQUOTED(PRESET_TICKADJ, $default_tickadj, [Preset a value for 'tickadj'?]) ;; esac # Newer versions of ReliantUNIX round adjtime() values down to @@ -3645,17 +3804,17 @@ case "$host" in esac ac_cv_make_tickadj=yes -case "$ac_cv_var_can_kmem$ac_cv_var_tick$ac_cv_var_tickadj" in +case "$can_kmem$ac_cv_var_tick$default_tickadj" in nonono) # Don't read KMEM, no presets. Bogus. - AC_MSG_WARN(Can't read kmem, no PRESET_TICK or PRESET_TICKADJ. No tickadj.) + AC_MSG_WARN([Can't read kmem, no PRESET_TICK or PRESET_TICKADJ. No tickadj.]) ac_cv_make_tickadj=no ;; nono*) # Don't read KMEM, no PRESET_TICK but PRESET_TICKADJ. Bogus. - AC_MSG_WARN(Can't read kmem but no PRESET_TICK. No tickadj.) + AC_MSG_WARN([Can't read kmem but no PRESET_TICK. No tickadj.]) ac_cv_make_tickadj=no ;; no*no) # Don't read KMEM, PRESET_TICK but no PRESET_TICKADJ. Bogus. - AC_MSG_WARN(Can't read kmem but no PRESET_TICKADJ. No tickadj.) + AC_MSG_WARN([Can't read kmem but no PRESET_TICKADJ. No tickadj.]) ac_cv_make_tickadj=no ;; no*) # Don't read KMEM, PRESET_TICK and PRESET_TICKADJ. Cool. @@ -3663,19 +3822,19 @@ case "$ac_cv_var_can_kmem$ac_cv_var_tick$ac_cv_var_tickadj" in yesnono) # Read KMEM, no presets. Cool. ;; yesno*) # Read KMEM, no PRESET_TICK but PRESET_TICKADJ. Bogus. - AC_MSG_WARN(PRESET_TICKADJ is defined but not PRESET_TICK. Please report this.) + AC_MSG_WARN([PRESET_TICKADJ is defined but not PRESET_TICK. Please report this.]) ;; yes*no) # Read KMEM, PRESET_TICK but no PRESET_TICKADJ. Cool. ;; yes*) # READ KMEM, PRESET_TICK and PRESET_TICKADJ. ;; *) # Generally bogus. - AC_MSG_ERROR(This shouldn't happen.) + AC_MSG_ERROR([This shouldn't happen.]) ;; esac AC_SUBST(MAKE_NTPTIME) -AC_CACHE_CHECK(if we want and can make the ntptime utility, ac_cv_make_ntptime, +AC_CACHE_CHECK([if we want and can make the ntptime utility], ac_cv_make_ntptime, [case "$host" in *) case "$ac_cv_struct_ntptimeval$ac_cv_var_kernel_pll" in yesyes) @@ -3718,7 +3877,17 @@ case "$host" in ac_cv_make_tickadj=no ;; esac -AC_CACHE_CHECK(if we want and can make the tickadj utility, ac_cv_make_tickadj, + +# +# Despite all the above, we always make tickadj. Setting +# ac_cv_make_tickadj before AC_CACHE_CHECK will cause a false +# report that the configuration variable was cached. It may +# be better to simply remove the hunk above, I did not want +# to remove it if there is hope it will be used again. +# +unset ac_cv_make_tickadj + +AC_CACHE_CHECK([if we want and can make the tickadj utility], ac_cv_make_tickadj, ac_cv_make_tickadj=yes) case "$ac_cv_make_tickadj" in yes) @@ -3727,7 +3896,7 @@ case "$ac_cv_make_tickadj" in esac AC_SUBST(MAKE_TIMETRIM) -AC_CACHE_CHECK(if we want and can make the timetrim utility, ac_cv_make_timetrim, +AC_CACHE_CHECK([if we want and can make the timetrim utility], ac_cv_make_timetrim, [case "$host" in *-*-irix*) ac_cv_make_timetrim=yes @@ -3747,12 +3916,22 @@ esac AC_SUBST(MAKE_LIBNTPSIM) AC_SUBST(MAKE_NTPDSIM) -AC_CACHE_CHECK([if we want to build the NTPD simulator], ac_cv_var_ntpd_sim, -[AC_ARG_ENABLE(simulator, - AC_HELP_STRING([--enable-simulator], [- build/install the NTPD simulator?]), - [ans=$enableval], [ans=no]) -ac_cv_var_ntpd_sim=$ans]) -case "$ac_cv_var_ntpd_sim" in + +AC_MSG_CHECKING([if we want to build the NTPD simulator]) + +AC_ARG_ENABLE( + [simulator], + AC_HELP_STRING( + [--enable-simulator], + [- build/install the NTPD simulator?] + ), + [ans=$enableval], + [ans=no] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in yes) MAKE_NTPDSIM=ntpdsim MAKE_LIBNTPSIM=libntpsim.a @@ -3764,193 +3943,391 @@ case "$build" in ;; *) case "$host" in *-*-vxworks*) - LDFLAGS="$LDFLAGS -r" - ;; + LDFLAGS="$LDFLAGS -r" + ;; esac ;; esac -AC_CACHE_CHECK(if we should always slew the time, ac_cv_var_slew_always, -[AC_ARG_ENABLE(slew-always, - AC_HELP_STRING([--enable-slew-always], [s always slew the time]), - [ans=$enableval], - [case "$host" in - *-apple-aux[[23]]*) - ans=yes - ;; - *-*-bsdi[[012]]*) - ans=no - ;; - *-*-bsdi*) - ans=yes - ;; - *-*-openvms*) # HMS: won't be found - ans=yes - ;; - *) ans=no - ;; - esac - ]) -ac_cv_var_slew_always=$ans]) -case "$ac_cv_var_slew_always" in + +AC_MSG_CHECKING([if we should always slew the time]) + +# target-specific defaults + +case "$host" in + *-apple-aux[[23]]*) + ans=yes + ;; + *-*-bsdi[[012]]*) + ans=no + ;; + *-*-bsdi*) + ans=yes + ;; + *-*-openvms*) # HMS: won't be found + ans=yes + ;; + *) ans=no + ;; +esac + +# --enable-slew-always / --disable-slew-always overrides default + +AC_ARG_ENABLE( + [slew-always], + AC_HELP_STRING( + [--enable-slew-always], + [s always slew the time] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in yes) AC_DEFINE(SLEWALWAYS, 1, [Slew always?]) ;; esac -AC_CACHE_CHECK(if we should step and slew the time, ac_cv_var_step_slew, -[AC_ARG_ENABLE(step-slew, - AC_HELP_STRING([--enable-step-slew], [s step and slew the time]), - [ans=$enableval], - [case "$host" in - *-sni-sysv*) - ans=yes - ;; - *-univel-sysv*) - ans=no - ;; - *-*-ptx*) - ans=yes - ;; - *-*-solaris2.1[[0-9]]*) - ans=no - ;; - *-*-solaris2.[[012]]*) - ans=yes - ;; - *-*-sysv4*) # HMS: Does this catch Fujitsu UXP? - ans=yes - ;; - *) ans=no - ;; - esac - ]) -ac_cv_var_step_slew=$ans]) -case "$ac_cv_var_step_slew" in +AC_MSG_CHECKING([if we should step and slew the time]) + +case "$host" in + *-sni-sysv*) + ans=yes + ;; + *-univel-sysv*) + ans=no + ;; + *-*-ptx*) + ans=yes + ;; + *-*-solaris2.1[[0-9]]*) + ans=no + ;; + *-*-solaris2.[[012]]*) + ans=yes + ;; + *-*-sysv4*) # HMS: Does this catch Fujitsu UXP? + ans=yes + ;; + *) ans=no + ;; +esac + + +AC_ARG_ENABLE( + [step-slew], + AC_HELP_STRING( + [--enable-step-slew], + [s step and slew the time] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in yes) AC_DEFINE(STEP_SLEW, 1, [Step, then slew the clock?]) ;; esac -AC_CACHE_CHECK(if ntpdate should step the time, ac_cv_var_ntpdate_step, -[AC_ARG_ENABLE(ntpdate-step, - AC_HELP_STRING([--enable-ntpdate-step], [s if ntpdate should step the time]), - [ans=$enableval], - [case "$host" in - *-apple-aux[[23]]*) - ans=yes - ;; - *) ans=no - ;; - esac - ]) -ac_cv_var_ntpdate_step=$ans]) -case "$ac_cv_var_ntpdate_step" in +AC_MSG_CHECKING([if ntpdate should step the time]) + +case "$host" in + *-apple-aux[[23]]*) + ans=yes + ;; + *) ans=no +esac + +AC_ARG_ENABLE( + [ntpdate-step], + AC_HELP_STRING( + [--enable-ntpdate-step], + [s if ntpdate should step the time] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in yes) AC_DEFINE(FORCE_NTPDATE_STEP, 1, [force ntpdate to step the clock if !defined(STEP_SLEW) ?]) ;; esac -AC_CACHE_CHECK(if we should sync TODR clock every hour, ac_cv_var_sync_todr, -[AC_ARG_ENABLE(hourly-todr-sync, - AC_HELP_STRING([--enable-hourly-todr-sync], - [s if we should sync TODR hourly]), - [ans=$enableval], - [case "$host" in - *-*-nextstep*) - ans=yes - ;; - *-*-openvms*) # HMS: won't be found - ans=yes - ;; - *) ans=no - ;; - esac]) -ac_cv_var_sync_todr=$ans]) + +AC_MSG_CHECKING([if we should sync TODR clock every hour]) + +case "$host" in + *-*-nextstep*) + ans=yes + ;; + *-*-openvms*) # HMS: won't be found + ans=yes + ;; + *) + ans=no +esac + +AC_ARG_ENABLE( + [hourly-todr-sync], + AC_HELP_STRING( + [--enable-hourly-todr-sync], + [s if we should sync TODR hourly] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + case "$ac_cv_var_sync_todr" in yes) AC_DEFINE(DOSYNCTODR, 1, [synch TODR hourly?]) ;; esac -AC_CACHE_CHECK(if we should avoid kernel FLL bug, ac_cv_var_kernel_fll_bug, -[AC_ARG_ENABLE(kernel-fll-bug, - AC_HELP_STRING([--enable-kernel-fll-bug], - [s if we should avoid a kernel FLL bug]), - [ans=$enableval], - [case "$host" in - *-*-solaris2.6) - unamev=`uname -v` - case "$unamev" in - Generic_105181-*) - old_IFS="$IFS" - IFS="-" - set $unamev - IFS="$old_IFS" - if test "$2" -ge 17 - then - # Generic_105181-17 and higher - ans=no - else - ans=yes - fi - ;; - *) ans=yes - ;; - esac - ;; - *-*-solaris2.7) - unamev=`uname -v` - case "$unamev" in - Generic_106541-*) - old_IFS="$IFS" - IFS="-" - set $unamev - IFS="$old_IFS" - if test "$2" -ge 07 - then - # Generic_106541-07 and higher - ans=no - else - ans=yes - fi - ;; - *) ans=yes - ;; - esac - ;; - *) ans=no - ;; + +AC_MSG_CHECKING([if we should avoid kernel FLL bug]) + +case "$host" in + *-*-solaris2.6) + unamev=`uname -v` + case "$unamev" in + Generic_105181-*) + old_IFS="$IFS" + IFS="-" + set $unamev + IFS="$old_IFS" + if test "$2" -ge 17 + then + # Generic_105181-17 and higher + ans=no + else + ans=yes + fi + ;; + *) + ans=yes esac - ]) -ac_cv_var_kernel_fll_bug=$ans]) -case "$ac_cv_var_kernel_fll_bug" in + ;; + *-*-solaris2.7) + unamev=`uname -v` + case "$unamev" in + Generic_106541-*) + old_IFS="$IFS" + IFS="-" + set $unamev + IFS="$old_IFS" + if test "$2" -ge 07 + then + # Generic_106541-07 and higher + ans=no + else + ans=yes + fi + ;; + *) + ans=yes + esac + ;; + *) + ans=no +esac + +AC_ARG_ENABLE( + [kernel-fll-bug], + AC_HELP_STRING( + [--enable-kernel-fll-bug], + [s if we should avoid a kernel FLL bug] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in yes) AC_DEFINE(KERNEL_FLL_BUG, 1, [Does the kernel have an FLL bug?]) ;; esac -AC_CACHE_CHECK(if we should use the IRIG sawtooth filter, ac_cv_var_irig_sucks, -[AC_ARG_ENABLE(irig-sawtooth, - AC_HELP_STRING([--enable-irig-sawtooth], - [s if we should enable the IRIG sawtooth filter]), - [ans=$enableval], - [case "$host" in - *-*-solaris2.[[89]]) - ans=yes - ;; - *-*-solaris2.1[[0-9]]*) - ans=yes - ;; - *) ans=no - ;; - esac - ]) -ac_cv_var_irig_sucks=$ans]) -case "$ac_cv_var_irig_sucks" in + +AC_MSG_CHECKING([if we should use the IRIG sawtooth filter]) + +case "$host" in + *-*-solaris2.[[89]]) + ans=yes + ;; + *-*-solaris2.1[[0-9]]*) + ans=yes + ;; + *) ans=no +esac + +AC_ARG_ENABLE( + [irig-sawtooth], + AC_HELP_STRING( + [--enable-irig-sawtooth], + [s if we should enable the IRIG sawtooth filter] + ), + [ans=$enableval] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in yes) AC_DEFINE(IRIG_SUCKS, 1, [Should we use the IRIG sawtooth filter?]) ;; esac -AC_CACHE_CHECK(if we should enable NIST lockclock scheme, ac_cv_var_nist_lockclock, -[AC_ARG_ENABLE(nist, - AC_HELP_STRING([--enable-nist], - [- if we should enable the NIST lockclock scheme]), - [ans=$enableval],[ans=no]) -ac_cv_var_nist_lockclock=$ans]) -case "$ac_cv_var_nist_lockclock" in + +AC_MSG_CHECKING([if we should enable NIST lockclock scheme]) + +AC_ARG_ENABLE( + [nist], + AC_HELP_STRING( + [--enable-nist], + [- if we should enable the NIST lockclock scheme] + ), + [ans=$enableval], + [ans=no] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in yes) AC_DEFINE(LOCKCLOCK, 1, [Should we align with the NIST lockclock scheme?]) ;; esac + +AC_MSG_CHECKING([if we want support for Samba's signing daemon]) + +AC_ARG_ENABLE( + [ntp-signd], + AC_HELP_STRING( + [--enable-ntp-signd], + [- Provide support for Samba's signing daemon, =/var/run/ntp_signd] + ), + [ans=$enableval], + [ans=no] +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in + no) + ntp_signd_path= + ;; + yes) + ntp_signd_path=/var/run/ntp_signd + ;; + *) + ntp_signd_path="$ans" +esac + +case "$ntp_signd_path" in + '') + wintime_default=no + ;; + *) + wintime_default=yes + AC_DEFINE(HAVE_NTP_SIGND, ,[Do we want support for Samba's signing daemon?]) + AC_DEFINE_UNQUOTED(NTP_SIGND_PATH, "$ntp_signd_path", [Path to sign daemon rendezvous socket]) +esac + + +AC_MSG_CHECKING([if we want the windows symmetric client hack]) + +# default is no, unless --enable-ntp-signd was given +ans=$wintime_default +unset wintime_default + +AC_ARG_ENABLE( + [wintime], + AC_HELP_STRING( + [--enable-wintime], + [- Provide the windows symmetric client hack] + ), + [ans=$enableval], +) + +AC_MSG_RESULT([$ans]) + +case "$ans" in + yes) + AC_DEFINE(WINTIME, ,[Do we want the windows symmetric client hack?]) +esac + + +AC_CHECK_HEADERS(sys/clockctl.h) + +case "$host" in + *-*-netbsd*) + ans=yes + ;; + *) ans=no + ;; +esac + +AC_ARG_ENABLE( + [clockctl], + AC_HELP_STRING( + [--enable-clockctl], + [s Use /dev/clockctl for non-root clock control] + ), + [ntp_use_dev_clockctl=$enableval], + [ntp_use_dev_clockctl=$ac_cv_header_sys_clockctl_h] +) + +AC_MSG_CHECKING([[if we should use /dev/clockctl]]) +AC_MSG_RESULT([$ntp_use_dev_clockctl]) + + +AC_CHECK_HEADERS([sys/capability.h]) +AC_CHECK_HEADERS([sys/prctl.h]) + +AC_MSG_CHECKING([[if we have linux capabilities (libcap)]]) + +case "$ac_cv_header_sys_capability_h$ac_cv_header_sys_prctl_h" in + yesyes) + ntp_have_linuxcaps=yes + ;; + *) + ntp_have_linuxcaps=no +esac + +AC_MSG_RESULT([$ntp_have_linuxcaps]) + + +AC_ARG_ENABLE( + [linuxcaps], + AC_HELP_STRING( + [--enable-linuxcaps], + [+ Use Linux capabilities for non-root clock control] + ), + [ntp_have_linuxcaps=$enableval] +) + + +case "$ntp_have_linuxcaps" in + yes) + AC_DEFINE(HAVE_LINUX_CAPABILITIES, ,[[Do we have Linux capabilities?]]) + LIBS="$LIBS -lcap" +esac + + +case "$ntp_use_dev_clockctl$ntp_have_linuxcaps" in + *yes*) + AC_DEFINE(HAVE_DROPROOT, ,[[Can we drop root privileges?]]) +esac + + +AC_CHECK_HEADERS([libscf.h]) + +case "$ac_cv_header_libscf_h" in + yes) + AC_SUBST(LSCF, [-lscf]) +esac + +AC_CHECK_FUNC( + [setppriv], + AC_DEFINE(HAVE_SOLARIS_PRIVS, ,[[Are Solaris privileges available?]]) +) + + # # ISC stuff # @@ -3966,7 +4343,7 @@ case "$enable_ipv6" in case "$host" in powerpc-ibm-aix4*) ;; *) - AC_DEFINE(WANT_IPV6, ,[ISC: Want IPv6?]) + AC_DEFINE(WANT_IPV6, ,[configure --enable-ipv6]) ;; esac ;; @@ -3974,54 +4351,67 @@ case "$enable_ipv6" in ;; esac -AC_MSG_CHECKING(for IPv6 structures) -AC_TRY_COMPILE([ -#include -#include -#include ], -[struct sockaddr_in6 sin6; return (0);], - [AC_MSG_RESULT(yes) - found_ipv6=yes], - [AC_MSG_RESULT(no) - found_ipv6=no]) + +AC_CACHE_CHECK( + [for IPv6 structures], + ac_cv_isc_found_ipv6, + [ + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM( + [ + #include + #include + #include + ], + [ + struct sockaddr_in6 sin6; + ] + ) + ], + [ac_cv_isc_found_ipv6=yes], + [ac_cv_isc_found_ipv6=no] + ) + ] +) # # See whether IPv6 support is provided via a Kame add-on. # This is done before other IPv6 linking tests so LIBS is properly set. # -AC_MSG_CHECKING(for Kame IPv6 support) +AC_MSG_CHECKING([for Kame IPv6 support]) AC_ARG_WITH(kame, - AC_HELP_STRING([--with-kame], [- =/usr/local/v6]), + [AC_HELP_STRING([--with-kame], [- =/usr/local/v6])], use_kame="$withval", use_kame="no") case "$use_kame" in - no) - ;; - yes) - kame_path=/usr/local/v6 - ;; - *) - kame_path="$use_kame" - ;; + no) + ;; + yes) + kame_path=/usr/local/v6 + ;; + *) + kame_path="$use_kame" + ;; esac case "$use_kame" in - no) - AC_MSG_RESULT(no) - ;; - *) - if test -f $kame_path/lib/libinet6.a; then - AC_MSG_RESULT($kame_path/lib/libinet6.a) - LIBS="-L$kame_path/lib -linet6 $LIBS" - else - AC_MSG_ERROR([$kame_path/lib/libinet6.a not found. + no) + AC_MSG_RESULT(no) + ;; + *) + if test -f $kame_path/lib/libinet6.a; then + AC_MSG_RESULT($kame_path/lib/libinet6.a) + LIBS="-L$kame_path/lib -linet6 $LIBS" + else + AC_MSG_ERROR([$kame_path/lib/libinet6.a not found. Please choose the proper path with the following command: configure --with-kame=PATH ]) - fi - ;; + fi + ;; esac # @@ -4033,139 +4423,210 @@ esac # netinet6/in6.h is needed for. # case "$host" in -*-bsdi4.[[01]]*) - ISC_PLATFORM_NEEDNETINET6IN6H="#define ISC_PLATFORM_NEEDNETINET6IN6H 1" - LWRES_PLATFORM_NEEDNETINET6IN6H="#define LWRES_PLATFORM_NEEDNETINET6IN6H 1" - isc_netinet6in6_hack="#include " - ;; -*) - ISC_PLATFORM_NEEDNETINET6IN6H="#undef ISC_PLATFORM_NEEDNETINET6IN6H" - LWRES_PLATFORM_NEEDNETINET6IN6H="#undef LWRES_PLATFORM_NEEDNETINET6IN6H" - isc_netinet6in6_hack="" - ;; + *-bsdi4.[[01]]*) + AC_DEFINE(ISC_PLATFORM_NEEDNETINET6IN6H, 1, [Do we need netinet6/in6.h?]) + isc_netinet6in6_hack="#include " + ;; + *) + isc_netinet6in6_hack="" esac # # This is similar to the netinet6/in6.h issue. # case "$host" in -*-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) - # UnixWare - # ISC_PLATFORM_NEEDNETINETIN6H="#define ISC_PLATFORM_NEEDNETINETIN6H 1" - # LWRES_PLATFORM_NEEDNETINETIN6H="#define LWRES_PLATFORM_NEEDNETINETIN6H 1" - AC_DEFINE(ISC_PLATFORM_FIXIN6ISADDR, 1,[Do we need to fix in6isaddr?]) - isc_netinetin6_hack="#include " - ;; -*) - # ISC_PLATFORM_NEEDNETINETIN6H="#undef ISC_PLATFORM_NEEDNETINETIN6H" - # LWRES_PLATFORM_NEEDNETINETIN6H="#undef LWRES_PLATFORM_NEEDNETINETIN6H" - # ISC_PLATFORM_FIXIN6ISADDR="#undef ISC_PLATFORM_FIXIN6ISADDR" - isc_netinetin6_hack="" - ;; + *-sco-sysv*uw*|*-*-sysv*UnixWare*|*-*-sysv*OpenUNIX*) + AC_DEFINE(ISC_PLATFORM_FIXIN6ISADDR, 1,[Do we need to fix in6isaddr?]) + isc_netinetin6_hack="#include " + ;; + *) + isc_netinetin6_hack="" esac -AC_MSG_CHECKING([for struct if_laddrconf]) -AC_TRY_LINK([ -#include -#include -],[ struct if_laddrconf a; ], - [AC_MSG_RESULT(yes) - AC_DEFINE(ISC_PLATFORM_HAVEIF_LADDRCONF, , - [ISC: have struct if_laddrconf?])], - [AC_MSG_RESULT(no)]) - -AC_MSG_CHECKING([for struct if_laddrreq]) -AC_TRY_LINK([ -#include -#include -],[ struct if_laddrreq a; ], - [AC_MSG_RESULT(yes) - AC_DEFINE(ISC_PLATFORM_HAVEIF_LADDRREQ, , - [ISC: have struct if_laddrreq?])], - [AC_MSG_RESULT(no)]) - -case "$found_ipv6" in +case "$ac_cv_isc_found_ipv6" in yes) - AC_DEFINE(ISC_PLATFORM_HAVEIPV6, ,[ISC: Have IPv6?]) + AC_DEFINE(ISC_PLATFORM_HAVEIPV6, ,[have IPv6?]) - AC_CHECK_MEMBERS([struct sockaddr_in6.sin6_scope_id], , , -[ -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack -]) + AC_CACHE_CHECK( + [for in6_pktinfo], + ac_cv_have_in6_pktinfo, + [ + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM( + [ + #include + #include + #include + $isc_netinetin6_hack + $isc_netinet6in6_hack + ], + [ + struct in6_pktinfo xyzzy; + ] + ) + ], + [ac_cv_have_in6_pktinfo=yes], + [ac_cv_have_in6_pktinfo=no] + ) + ] + ) + + case "$ac_cv_have_in6_pktinfo" in + yes) + AC_DEFINE(ISC_PLATFORM_HAVEIN6PKTINFO, , [have struct in6_pktinfo?]) + esac - AC_MSG_CHECKING(for in6_pktinfo) - AC_TRY_COMPILE([ -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack -], - [struct in6_pktinfo xyzzy; return (0);], - [AC_MSG_RESULT(yes) - AC_DEFINE(ISC_PLATFORM_HAVEIN6PKTINFO, , - [ISC: Have struct in6_pktinfo?])], - [AC_MSG_RESULT(no -- disabling runtime ipv6 support)]) # HMS: Use HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID instead? - AC_MSG_CHECKING(for sin6_scope_id in struct sockaddr_in6) - AC_TRY_COMPILE([ -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack -], - [struct sockaddr_in6 xyzzy; xyzzy.sin6_scope_id = 0; return (0);], - [AC_MSG_RESULT(yes) - AC_DEFINE(ISC_PLATFORM_HAVESCOPEID, , - [ISC: Have sin6_scope_id?])], - result="#define LWRES_HAVE_SIN6_SCOPE_ID 1"], - [AC_MSG_RESULT(no) - ISC_PLATFORM_HAVESCOPEID="#undef ISC_PLATFORM_HAVESCOPEID" - result="#undef LWRES_HAVE_SIN6_SCOPE_ID"]) - LWRES_HAVE_SIN6_SCOPE_ID="$result" + AC_CACHE_CHECK( + [for sockaddr_in6.sin6_scope_id], + ac_cv_have_sin6_scope_id, + [ + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM( + [ + #include + #include + #include + $isc_netinetin6_hack + $isc_netinet6in6_hack + ], + [ + struct sockaddr_in6 xyzzy; + xyzzy.sin6_scope_id = 0; + ] + ) + ], + [ac_cv_have_sin6_scope_id=yes], + [ac_cv_have_sin6_scope_id=no] + ) + ] + ) - ;; + case "$ac_cv_have_sin6_scope_id" in + yes) + AC_DEFINE(ISC_PLATFORM_HAVESCOPEID, , [have sin6_scope_id?]) + esac esac -# We need this check run all the time... -AC_MSG_CHECKING(for in6addr_any) -AC_TRY_LINK([ -#include -#include -#include -$isc_netinetin6_hack -$isc_netinet6in6_hack -$isc_in_addr6_hack -], - [[struct in6_addr in6; in6 = in6addr_any; return (in6.s6_addr[0]);]], - [AC_MSG_RESULT(yes)], - [AC_MSG_RESULT(no) - AC_DEFINE(ISC_PLATFORM_NEEDIN6ADDRANY, , - [ISC: Need in6addr_any?])] + +# We need this check run even without ac_cv_isc_found_ipv6=yes + +AC_CACHE_CHECK( + [for in6addr_any], + ac_cv_have_in6addr_any, + [ + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM( + [ + #include + #include + #include + $isc_netinetin6_hack + $isc_netinet6in6_hack + ], + [ + struct in6_addr in6; + in6 = in6addr_any; + ] + ) + ], + [ac_cv_have_in6addr_any=yes], + [ac_cv_have_in6addr_any=no] + ) + ] ) +case "$ac_cv_have_in6addr_any" in + no) + AC_DEFINE(ISC_PLATFORM_NEEDIN6ADDRANY, , [missing in6addr_any?]) +esac + + +AC_CACHE_CHECK( + [for struct if_laddrconf], + ac_cv_isc_struct_if_laddrconf, + [ + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM( + [ + #include + #include + ], + [ + struct if_laddrconf a; + ] + ) + ], + [ac_cv_isc_struct_if_laddrconf=yes], + [ac_cv_isc_struct_if_laddrconf=no] + ) + ] +) + +case "$ac_cv_isc_struct_if_laddrconf" in + yes) + AC_DEFINE(ISC_PLATFORM_HAVEIF_LADDRCONF, , [have struct if_laddrconf?]) +esac + +AC_CACHE_CHECK( + [for struct if_laddrreq], + ac_cv_isc_struct_if_laddrreq, + [ + AC_COMPILE_IFELSE( + [ + AC_LANG_PROGRAM( + [ + #include + #include + ], + [ + struct if_laddrreq a; + ] + ) + ], + [ac_cv_isc_struct_if_laddrreq=yes], + [ac_cv_isc_struct_if_laddrreq=no] + ) + ] +) + +case "$ac_cv_isc_struct_if_laddrreq" in + yes) + AC_DEFINE(ISC_PLATFORM_HAVEIF_LADDRREQ, , [have struct if_laddrreq?]) +esac + # # Look for a sysctl call to get the list of network interfaces. # -AC_MSG_CHECKING(for interface list sysctl) -AC_EGREP_CPP(found_rt_iflist, [ -#include -#include -#include -#ifdef NET_RT_IFLIST -found_rt_iflist -#endif -], - [AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_IFLIST_SYSCTL,1,[ISC: Use iflist_sysctl?])], - [AC_MSG_RESULT(no)]) +AC_CACHE_CHECK( + [for interface list sysctl], + ac_cv_iflist_sysctl, + AC_EGREP_CPP( + [found_rt_iflist], + [ + #include + #include + #include + #ifdef NET_RT_IFLIST + found_rt_iflist + #endif + ], + [ac_cv_iflist_sysctl=yes], + [ac_cv_iflist_sysctl=no] + ) +) + +case "$ac_cv_iflist_sysctl" in + yes) + AC_DEFINE(HAVE_IFLIST_SYSCTL,1,[have iflist_sysctl?]) +esac + ### diff --git a/contrib/ntp/flock-build b/contrib/ntp/flock-build index 557809d346ca..d80fc6d3d48c 100755 --- a/contrib/ntp/flock-build +++ b/contrib/ntp/flock-build @@ -5,14 +5,26 @@ PARSE="--enable-parse-clocks" #PARSE= STD="--enable-simulator" +case "$SIMUL" in + '') PARALLEL_BUILDS=1 + ;; + *) PARALLEL_BUILDS=$SIMUL +esac + +case "$PARALLEL_BUILDS" in + 1) ;; + *) echo Launching $PARALLEL_BUILDS parallel builds on each machine +esac + # Backroom: -# beauregard freebsd-6 -# o churchy alpha-dec-osf5.1 +# barnstable freebsd-6.1 +# beauregard freebsd-6.0 +# X churchy alpha-dec-osf5.1 # deacon sparc-sun-solaris2.10 -# grundoon freebsd-6.1 +# grundoon freebsd-6.2 # howland freebsd-6.1 -# o macabre sparc-sun-solaris2.8 -# o mort sparc-sun-solaris2.8 +# o macabre freebsd-6.1-STABLE +# o mort freebsd-6.1 # whimsy sparc-sun-solaris2.10 # Campus: @@ -23,10 +35,11 @@ STD="--enable-simulator" # * pogo sparc-sun-solaris2.10 # * rackety freebsd-6.1 +# HMS: we need $PWD because solaris produces /deacon/backroom when +# we are in /backroom and in general there is no /deacon/backroom. c_d=${PWD:-`pwd`} SIG=`perl -e 'print rand'` -echo $SIG > .buildkey case "$LIST" in '') LIST="baldwin bridgeport cowbird malarky pogo rackety" ;; @@ -34,19 +47,60 @@ esac for i in $LIST do - echo $i - case "1" in - 0) - ssh $i "cd $c_d ; ./build $SIG $PARSE $STD $BUILD_ARGS" & - ssh $i "cd $c_d ; ./build $SIG $PARSE $STD --without-crypto $BUILD_ARGS" & - ssh $i "cd $c_d ; ./build $SIG $STD --disable-all-clocks $BUILD_ARGS" & - ;; - 1) ssh $i "cd $c_d ; \ -./build $SIG $PARSE $STD $BUILD_ARGS ; \ -./build $SIG $PARSE $STD --disable-debugging $BUILD_ARGS ; \ -./build $SIG $PARSE $STD --without-crypto $BUILD_ARGS ; \ -./build $SIG $STD --disable-all-clocks $BUILD_ARGS" \ -& - ;; + SKIPTHIS=0 + [ -f .buildkey-$i ] && SKIPTHIS=1 + case "$SKIPTHIS" in + 1) + echo flock-build running on $i? check LIST, skipping + ;; + 0) + echo $i + echo $SIG > .buildkey-$i + case "1" in + 0) + ssh $i "cd $c_d ; ./build $SIG $PARSE $STD $BUILD_ARGS" & + ssh $i "cd $c_d ; ./build $SIG $PARSE $STD --without-crypto $BUILD_ARGS" & + ssh $i "cd $c_d ; ./build $SIG $STD --disable-all-clocks $BUILD_ARGS" & + ;; + 1) + cat > .flockbuild-$i-$SIG </dev/null & + esac esac done +echo `date -u '+%H:%M:%S'` flock-build launched diff --git a/contrib/ntp/html/build/hints/solaris.xtra.4095849 b/contrib/ntp/html/build/hints/solaris.xtra.4095849 new file mode 100644 index 000000000000..8d3ce8074cfd --- /dev/null +++ b/contrib/ntp/html/build/hints/solaris.xtra.4095849 @@ -0,0 +1,74 @@ + Bug Id: 4095849 + Category: kernel + Subcategory: syscall + State: evaluated + Synopsis: time_constant value >6 with PLL in use leads to integer divide + zero trap panic + Description: +If the time_constant parameter is 7 or higher, and the phase-lock looping model +is in use, the system will take a "integer divide zero trap" panic in +the clock routine as soon as the time_offset becomes non-zero. + +time_constant defaults to 0. The only place it is set is in the ntp_adjtime +system call, from the 'constant' element of the timex structure argument. + + Work around: +Never set the constant element of the timex structure passed to ntp_adjtime to +a value larger than 6. + +satish.mynam@Eng 1998-04-30 +1. Use Sun's version of NTP software instead of PD version. This problem +is not seen with Sun's NTP version (which is mostly eqivalent to PD NTP 3.4 +plus some Sun's local functionality futures). + +2. Workaround for the public domain NTP version ONLY: + ===================================================== +The workaround for public domain NTP version is to disable the +KERNEL_PLL from the NTP code. This way ntp_Adjtime() system call is +totally bypassed without sacrificing any of the functionality of the +NTP. The only hit you might see is the way kernel precision timminig +is done without the PLL algorithm in the kernel. + + The easiest way to disable ntp_adjtime option is(without changing + any makefiles or other config files) to disable the KERNEL_PLL + value in the ./config.h file. + +After doing a ./configure for probing for all the necessary tools(compilers, +os version, libraries), please comment out KERNEL_PLL macro in +the ./config.h file. This will disable the KERNEL_PLL part of the source +code and the newly obtained xntpd is just similar to the old one but it +does not use ntp_adjtime() system call. This prevents it from panic'ng +the kernel. + +/*#define KERNEL_PLL 1*/ + +I complied a new xntpd binary this way and it does nothave any ntp_adjtime() +related stuff. + +Default: +======= +/net/divya/export/home/mynam/public_domain/ntp/xntp3-5.92/xntpd>strings +xntpd | +grep ntp_adjtime +354:adj_frequency: ntp_adjtime failed: %m +357:loop_config: ntp_adjtime() failed: %m +435:get_kernel_info: ntp_adjtime() failed: %m + +With KERNEL_PLL disabled in config.h file +-======================= + +/net/divya/export/home/mynam/public_domain/ntp/xntp3-5.92/xntpd>strings +xntpd.nopll | grep ntp_adjtime + + Integrated in releases: + Duplicate of: + Patch id: + See also: 4133517 + Summary: +If the time_constant parameter is 7 or higher, and the phase-lock looping model +is in use, the system will take a "integer divide zero trap" panic in +the clock routine as soon as the time_offset becomes non-zero. + +time_constant defaults to 0. The only place it is set is in the ntp_adjtime +system call, from the 'constant' element of the timex structure argument. +---------------------------------------------------------------------------- diff --git a/contrib/ntp/html/copyright.html b/contrib/ntp/html/copyright.html index 471069abcc04..cf34979060db 100644 --- a/contrib/ntp/html/copyright.html +++ b/contrib/ntp/html/copyright.html @@ -19,7 +19,7 @@
 ***********************************************************************
 *                                                                     *
-* Copyright (c) David L. Mills 1992-2008                              *
+* Copyright (c) David L. Mills 1992-2009                              *
 *                                                                     *
 * Permission to use, copy, modify, and distribute this software and   *
 * its documentation for any purpose with or without fee is hereby     *
diff --git a/contrib/ntp/html/drivers/driver40.html b/contrib/ntp/html/drivers/driver40.html
index 54e174746591..1901dcdbff74 100644
--- a/contrib/ntp/html/drivers/driver40.html
+++ b/contrib/ntp/html/drivers/driver40.html
@@ -5,7 +5,10 @@
 	
 		
 		
+		
 		JJY Receivers
+		
+		
 		
 	
 
@@ -13,122 +16,174 @@
 		

JJY Receivers


Synopsis

- Address: 127.127.40.u
- Reference ID: JJY
- Driver ID: JJY
- Serial Port: /dev/jjyu; 9600 baud, 8-bits, no parity, 1 stop bit + Address: 127.127.40.u
+ Reference ID: JJY
+ Driver ID: JJY
+ Serial Port: /dev/jjyu; 9600|4800(See corresponding receiver) baud, 8-bits, no parity, 1 stop bit

Description

This driver supports the following JJY receivers sold in Japan.

  • Tristate Ltd. JJY01 http://www.tristate.ne.jp/ (Japanese only)
    -
    Time code format -

    - - - - - - - - - - - - - - - - -
    Command Reply
    date<CR><LF> YYYY/MM/DD WWW<CR><LF>
    stim<CR><LF> HH:MM:SS<CR><LF>
    -
    -
    NTP configuration ( ntp.conf ) +
    NTP configuration ( ntp.conf )

    server   127.127.40.X   mode 1


    -
    -
  • C-DEX Co.,Ltd. JST2000 http://www.c-dex.co.jp/ (Japanese only)
    -
    -
    Time code format -

    - - - - - - - - - - - -
    Command Reply
    <ENQ>1J<ETX> <STX>JYYMMDD HHMMSSS<ETX>
    -
    -
    NTP configuration ( ntp.conf ) + +
    RS-232C
    -

    server   127.127.40.X   mode 2

    +

    9600 Baud


    -
    -
  • -

    Echo Keisokuki Co.,Ltd. LT-2000 http://www.clock.co.jp/ (Japanese only)

    -
    -
    Time code format + +
    Time code format

    - + + + + + + + + + + + + + +
    Command  --> Reply
    date<CR><LF> --> YYYY/MM/DD WWW<CR><LF>
    stim<CR><LF> --> HH:MM:SS<CR><LF>
    +
    +
    +
    +
  • C-DEX Co.,Ltd. JST2000 http://www.c-dex.co.jp/ (Japanese only)
    +
    +
    NTP configuration ( ntp.conf )
    +
    +

    server   127.127.40.X   mode 2

    +
    +
    +
    RS-232C
    +
    +

    9600 Baud

    +
    +
    +
    Time code format
    +

    + + + + + + + + + + + +
    Command --> Reply
    <ENQ>1J<ETX> --> <STX>JYYMMDD HHMMSSS<ETX>
    +
    +
    +
    +
  • +

    Echo Keisokuki Co.,Ltd. LT-2000 http://www.clock.co.jp/ (Japanese only)

    +
    +
    NTP configuration ( ntp.conf )
    +
    +

    server   127.127.40.X   mode 3

    +
    +
    +
    RS-232C
    +
    +

    9600 Baud

    +
    +
    +
    Time code format
    +

    + + + + - + - + - - + +
    Command -->  Reply
    C -->  ( Mode 2 : Continuous )
    ( Every second before 0.5 second ) YYMMDDWHHMMSS<ST1><ST2><ST3><ST4><CR>
    #( Mode 1 : Request&Send ) --> ( Mode 1 : Request&Send )

    -
    NTP configuration ( ntp.conf ) + +
    +
  • +

    CITIZEN T.I.C. CO.,LTD. JJY-200 http://www.tic-citizen.co.jp/ (Japanese only)

    +
    +
    NTP configuration ( ntp.conf )
    -

    server   127.127.40.X   mode 3

    +

    server   127.127.40.X   mode 4

    +
    +
    +
    RS-232C
    +
    +

    4800 Baud

    +
    +
    +
    Time code format
    +

    + + + + + + + + + + + +
    Command --> Reply
    ( Every second )'XX YY/MM/DD W HH:MM:SS<CR>
    +
    +

JJY is the radio station which transmites the JST (Japan Standard Time) in long wave radio. The station JJY is operated by the National Institute of Information and Communications Technology. An operating announcement and some information are avaiable from http://www.nict.go.jp/ (English and Japanese) and http://jjy.nict.go.jp/ (English and Japanese)

The user is expected to provide a symbolic link to an available serial port device. This is typically performed by a command such as:

-

ln -s /dev/ttyS0 /dev/jjy0

-

Windows NT does not support symbolic links to device files. COMX: is the unit used by the driver, based on the refclock unit number, where unit 1 corresponds to COM1: and unit 3 corresponds to COM3:

+

ln -s /dev/ttyS0 /dev/jjy0

+

Windows NT does not support symbolic links to device files. COMX: is the unit used by the driver, based on the refclock unit number, where unit 1 corresponds to COM1: and unit 3 corresponds to COM3:

Monitor Data

-

The driver writes each timecode as received to the clockstats file.

+

The driver writes each timecode as received to the clockstats file.

Fudge Factors

-
time1 time +
time1 time
Specifies the time offset calibration factor, in seconds and fraction, with default 0.0. -
time2 time +
time2 time
Not used by this driver. -
stratum number +
stratum number
Specifies the driver stratum, in decimal from 0 to 15, with default 0. -
refid string -
Specifies the driver reference identifier, an ASCII string from one to four characters, with default JJY. -
flag1 0 | 1 +
refid string +
Specifies the driver reference identifier, an ASCII string from one to four characters, with default JJY. +
flag1 0 | 1
Not used by this driver. -
flag2 0 | 1 +
flag2 0 | 1
Not used by this driver. -
flag3 0 | 1 +
flag3 0 | 1
Not used by this driver. -
flag4 0 | 1 +
flag4 0 | 1
Not used by this driver.

- \ No newline at end of file + diff --git a/contrib/ntp/include/Makefile.in b/contrib/ntp/include/Makefile.in index b65fac865075..70b0330d7681 100644 --- a/contrib/ntp/include/Makefile.in +++ b/contrib/ntp/include/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -50,22 +48,52 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive HEADERS = $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -81,10 +109,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -97,11 +121,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -115,6 +138,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -128,8 +152,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -139,6 +162,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -152,16 +176,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -173,29 +192,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../util/ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../util/ansi2knr @@ -265,14 +296,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -290,6 +321,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -297,10 +329,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, @@ -325,15 +353,14 @@ $(RECURSIVE_TARGETS): else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: +$(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ @@ -360,16 +387,16 @@ maintainer-clean-recursive: else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) @@ -377,14 +404,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ @@ -396,81 +423,101 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ - || $(mkdir_p) "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ @@ -500,6 +547,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -510,8 +558,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags +distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive @@ -519,18 +566,38 @@ dvi-am: html: html-recursive +html-am: + info: info-recursive info-am: install-data-am: +install-dvi: install-dvi-recursive + +install-dvi-am: + install-exec-am: +install-html: install-html-recursive + +install-html-am: + install-info: install-info-recursive +install-info-am: + install-man: +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-recursive @@ -549,22 +616,25 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-info-am +uninstall-am: -uninstall-info: uninstall-info-recursive +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ - clean clean-generic clean-libtool clean-recursive ctags \ - ctags-recursive distclean distclean-generic distclean-libtool \ - distclean-recursive distclean-tags distdir dvi dvi-am html \ +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic maintainer-clean-recursive \ - mostlyclean mostlyclean-generic mostlyclean-libtool \ - mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-info-am + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/include/copyright.def b/contrib/ntp/include/copyright.def index f86034bc3acf..ccc3e91cf215 100644 --- a/contrib/ntp/include/copyright.def +++ b/contrib/ntp/include/copyright.def @@ -1,9 +1,9 @@ /* -*- Mode: Text -*- */ copyright = { - date = "1970-2008"; + date = "1970-2009"; owner = "David L. Mills and/or others"; - eaddr = "http://bugs.ntp.isc.org, bugs@ntp.org"; + eaddr = "http://bugs.ntp.org, bugs@ntp.org"; type = note; text = "see html/copyright.html"; }; diff --git a/contrib/ntp/include/isc/Makefile.in b/contrib/ntp/include/isc/Makefile.in index 26ea36f2acff..531da09b454c 100644 --- a/contrib/ntp/include/isc/Makefile.in +++ b/contrib/ntp/include/isc/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -50,6 +48,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) @@ -57,8 +56,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -74,10 +71,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -90,11 +83,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -108,6 +100,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -121,8 +114,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -132,6 +124,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -145,16 +138,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -166,29 +154,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../util/ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../util/ansi2knr @@ -234,14 +234,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/isc/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign include/isc/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/isc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/isc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -259,6 +259,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -266,82 +267,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -369,6 +373,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -379,8 +384,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags +distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am @@ -388,18 +392,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -418,18 +442,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-info-am + uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/include/ntp_debug.h b/contrib/ntp/include/ntp_debug.h index 376b24b957db..55b2e1a76d8e 100644 --- a/contrib/ntp/include/ntp_debug.h +++ b/contrib/ntp/include/ntp_debug.h @@ -13,11 +13,13 @@ */ #ifdef DEBUG -#define DPRINTF(_lvl_, _arg_) \ - if (debug >= (_lvl_)) \ - printf _arg_; +#define DPRINTF(_lvl_, _arg_) \ + do { \ + if (debug >= (_lvl_)) \ + printf _arg_; \ + } while (0) #else -#define DPRINTF(_lvl_, _arg_) +#define DPRINTF(_lvl_, _arg_) do {} while (0) #endif #endif diff --git a/contrib/ntp/include/version.def b/contrib/ntp/include/version.def index b17d656155fc..f0dc444146e4 100644 --- a/contrib/ntp/include/version.def +++ b/contrib/ntp/include/version.def @@ -1 +1 @@ -version = '4.2.4p5'; +version = '4.2.4p8'; diff --git a/contrib/ntp/kernel/Makefile.in b/contrib/ntp/kernel/Makefile.in index 1f39c1adf59f..b00e41a72d2f 100644 --- a/contrib/ntp/kernel/Makefile.in +++ b/contrib/ntp/kernel/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -13,15 +14,12 @@ # PARTICULAR PURPOSE. @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -48,21 +46,51 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -78,10 +106,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -94,11 +118,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -112,6 +135,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -125,8 +149,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -136,6 +159,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -149,16 +173,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -170,29 +189,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../util/ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../util/ansi2knr @@ -206,14 +237,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kernel/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign kernel/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kernel/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign kernel/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -231,6 +262,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -238,10 +270,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, @@ -266,15 +294,14 @@ $(RECURSIVE_TARGETS): else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: +$(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ @@ -301,16 +328,16 @@ maintainer-clean-recursive: else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) @@ -318,14 +345,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ @@ -337,81 +364,101 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ - || $(mkdir_p) "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ @@ -441,6 +488,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -451,8 +499,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags +distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive @@ -460,18 +507,38 @@ dvi-am: html: html-recursive +html-am: + info: info-recursive info-am: install-data-am: +install-dvi: install-dvi-recursive + +install-dvi-am: + install-exec-am: +install-html: install-html-recursive + +install-html-am: + install-info: install-info-recursive +install-info-am: + install-man: +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-recursive @@ -490,22 +557,25 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-info-am +uninstall-am: -uninstall-info: uninstall-info-recursive +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ - clean clean-generic clean-libtool clean-recursive ctags \ - ctags-recursive distclean distclean-generic distclean-libtool \ - distclean-recursive distclean-tags distdir dvi dvi-am html \ +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic maintainer-clean-recursive \ - mostlyclean mostlyclean-generic mostlyclean-libtool \ - mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am uninstall-info-am + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/kernel/sys/Makefile.in b/contrib/ntp/kernel/sys/Makefile.in index e24a0e3049b3..4565a2e8a768 100644 --- a/contrib/ntp/kernel/sys/Makefile.in +++ b/contrib/ntp/kernel/sys/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -50,6 +48,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = HEADERS = $(noinst_HEADERS) @@ -57,8 +56,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -74,10 +71,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -90,11 +83,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -108,6 +100,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -121,8 +114,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -132,6 +124,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -145,16 +138,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -166,29 +154,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../../util/ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../../util/ansi2knr @@ -206,14 +206,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kernel/sys/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign kernel/sys/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kernel/sys/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign kernel/sys/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -231,6 +231,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -238,82 +239,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -341,6 +345,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -351,8 +356,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool \ - distclean-tags +distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am @@ -360,18 +364,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -390,18 +414,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-info-am + uninstall-am + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/libntp/Makefile.in b/contrib/ntp/libntp/Makefile.in index 802ba71913b8..e91e0a3fb3b2 100644 --- a/contrib/ntp/libntp/Makefile.in +++ b/contrib/ntp/libntp/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,15 +16,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -52,6 +50,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libntp_a_AR = $(AR) $(ARFLAGS) @@ -93,17 +92,19 @@ libntpsim_a_AR = $(AR) $(ARFLAGS) libntpsim_a_LIBADD = am_libntpsim_a_OBJECTS = systime_s$U.$(OBJEXT) $(am__objects_1) libntpsim_a_OBJECTS = $(am_libntpsim_a_OBJECTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(libntp_a_SOURCES) $(EXTRA_libntp_a_SOURCES) \ $(libntpsim_a_SOURCES) DIST_SOURCES = $(libntp_a_SOURCES) $(EXTRA_libntp_a_SOURCES) \ @@ -113,8 +114,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -130,10 +129,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -146,11 +141,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -164,6 +158,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -177,8 +172,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -188,6 +182,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -201,16 +196,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -222,29 +212,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../util/ansi2knr @@ -287,14 +289,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libntp/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign libntp/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libntp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libntp/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -312,6 +314,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) @@ -330,7 +333,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -418,386 +421,386 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ymd2yd$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< assertions_.o: assertions_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions_.o -MD -MP -MF "$(DEPDIR)/assertions_.Tpo" -c -o assertions_.o `test -f 'assertions_.c' || echo '$(srcdir)/'`assertions_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/assertions_.Tpo" "$(DEPDIR)/assertions_.Po"; else rm -f "$(DEPDIR)/assertions_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions_.o -MD -MP -MF $(DEPDIR)/assertions_.Tpo -c -o assertions_.o `test -f 'assertions_.c' || echo '$(srcdir)/'`assertions_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/assertions_.Tpo $(DEPDIR)/assertions_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='assertions_.c' object='assertions_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o assertions_.o `test -f 'assertions_.c' || echo '$(srcdir)/'`assertions_.c assertions_.obj: assertions_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions_.obj -MD -MP -MF "$(DEPDIR)/assertions_.Tpo" -c -o assertions_.obj `if test -f 'assertions_.c'; then $(CYGPATH_W) 'assertions_.c'; else $(CYGPATH_W) '$(srcdir)/assertions_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/assertions_.Tpo" "$(DEPDIR)/assertions_.Po"; else rm -f "$(DEPDIR)/assertions_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions_.obj -MD -MP -MF $(DEPDIR)/assertions_.Tpo -c -o assertions_.obj `if test -f 'assertions_.c'; then $(CYGPATH_W) 'assertions_.c'; else $(CYGPATH_W) '$(srcdir)/assertions_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/assertions_.Tpo $(DEPDIR)/assertions_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='assertions_.c' object='assertions_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o assertions_.obj `if test -f 'assertions_.c'; then $(CYGPATH_W) 'assertions_.c'; else $(CYGPATH_W) '$(srcdir)/assertions_.c'; fi` assertions.o: $(srcdir)/../libisc/assertions.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions.o -MD -MP -MF "$(DEPDIR)/assertions.Tpo" -c -o assertions.o `test -f '$(srcdir)/../libisc/assertions.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/assertions.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/assertions.Tpo" "$(DEPDIR)/assertions.Po"; else rm -f "$(DEPDIR)/assertions.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions.o -MD -MP -MF $(DEPDIR)/assertions.Tpo -c -o assertions.o `test -f '$(srcdir)/../libisc/assertions.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/assertions.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/assertions.Tpo $(DEPDIR)/assertions.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/assertions.c' object='assertions.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o assertions.o `test -f '$(srcdir)/../libisc/assertions.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/assertions.c assertions.obj: $(srcdir)/../libisc/assertions.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions.obj -MD -MP -MF "$(DEPDIR)/assertions.Tpo" -c -o assertions.obj `if test -f '$(srcdir)/../libisc/assertions.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/assertions.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/assertions.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/assertions.Tpo" "$(DEPDIR)/assertions.Po"; else rm -f "$(DEPDIR)/assertions.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT assertions.obj -MD -MP -MF $(DEPDIR)/assertions.Tpo -c -o assertions.obj `if test -f '$(srcdir)/../libisc/assertions.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/assertions.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/assertions.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/assertions.Tpo $(DEPDIR)/assertions.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/assertions.c' object='assertions.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o assertions.obj `if test -f '$(srcdir)/../libisc/assertions.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/assertions.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/assertions.c'; fi` error_.o: error_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error_.o -MD -MP -MF "$(DEPDIR)/error_.Tpo" -c -o error_.o `test -f 'error_.c' || echo '$(srcdir)/'`error_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/error_.Tpo" "$(DEPDIR)/error_.Po"; else rm -f "$(DEPDIR)/error_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error_.o -MD -MP -MF $(DEPDIR)/error_.Tpo -c -o error_.o `test -f 'error_.c' || echo '$(srcdir)/'`error_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/error_.Tpo $(DEPDIR)/error_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error_.c' object='error_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o error_.o `test -f 'error_.c' || echo '$(srcdir)/'`error_.c error_.obj: error_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error_.obj -MD -MP -MF "$(DEPDIR)/error_.Tpo" -c -o error_.obj `if test -f 'error_.c'; then $(CYGPATH_W) 'error_.c'; else $(CYGPATH_W) '$(srcdir)/error_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/error_.Tpo" "$(DEPDIR)/error_.Po"; else rm -f "$(DEPDIR)/error_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error_.obj -MD -MP -MF $(DEPDIR)/error_.Tpo -c -o error_.obj `if test -f 'error_.c'; then $(CYGPATH_W) 'error_.c'; else $(CYGPATH_W) '$(srcdir)/error_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/error_.Tpo $(DEPDIR)/error_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error_.c' object='error_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o error_.obj `if test -f 'error_.c'; then $(CYGPATH_W) 'error_.c'; else $(CYGPATH_W) '$(srcdir)/error_.c'; fi` error.o: $(srcdir)/../libisc/error.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error.o -MD -MP -MF "$(DEPDIR)/error.Tpo" -c -o error.o `test -f '$(srcdir)/../libisc/error.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/error.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/error.Tpo" "$(DEPDIR)/error.Po"; else rm -f "$(DEPDIR)/error.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error.o -MD -MP -MF $(DEPDIR)/error.Tpo -c -o error.o `test -f '$(srcdir)/../libisc/error.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/error.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/error.Tpo $(DEPDIR)/error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/error.c' object='error.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o error.o `test -f '$(srcdir)/../libisc/error.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/error.c error.obj: $(srcdir)/../libisc/error.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error.obj -MD -MP -MF "$(DEPDIR)/error.Tpo" -c -o error.obj `if test -f '$(srcdir)/../libisc/error.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/error.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/error.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/error.Tpo" "$(DEPDIR)/error.Po"; else rm -f "$(DEPDIR)/error.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT error.obj -MD -MP -MF $(DEPDIR)/error.Tpo -c -o error.obj `if test -f '$(srcdir)/../libisc/error.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/error.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/error.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/error.Tpo $(DEPDIR)/error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/error.c' object='error.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o error.obj `if test -f '$(srcdir)/../libisc/error.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/error.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/error.c'; fi` interfaceiter_.o: interfaceiter_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter_.o -MD -MP -MF "$(DEPDIR)/interfaceiter_.Tpo" -c -o interfaceiter_.o `test -f 'interfaceiter_.c' || echo '$(srcdir)/'`interfaceiter_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/interfaceiter_.Tpo" "$(DEPDIR)/interfaceiter_.Po"; else rm -f "$(DEPDIR)/interfaceiter_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter_.o -MD -MP -MF $(DEPDIR)/interfaceiter_.Tpo -c -o interfaceiter_.o `test -f 'interfaceiter_.c' || echo '$(srcdir)/'`interfaceiter_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/interfaceiter_.Tpo $(DEPDIR)/interfaceiter_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='interfaceiter_.c' object='interfaceiter_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interfaceiter_.o `test -f 'interfaceiter_.c' || echo '$(srcdir)/'`interfaceiter_.c interfaceiter_.obj: interfaceiter_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter_.obj -MD -MP -MF "$(DEPDIR)/interfaceiter_.Tpo" -c -o interfaceiter_.obj `if test -f 'interfaceiter_.c'; then $(CYGPATH_W) 'interfaceiter_.c'; else $(CYGPATH_W) '$(srcdir)/interfaceiter_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/interfaceiter_.Tpo" "$(DEPDIR)/interfaceiter_.Po"; else rm -f "$(DEPDIR)/interfaceiter_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter_.obj -MD -MP -MF $(DEPDIR)/interfaceiter_.Tpo -c -o interfaceiter_.obj `if test -f 'interfaceiter_.c'; then $(CYGPATH_W) 'interfaceiter_.c'; else $(CYGPATH_W) '$(srcdir)/interfaceiter_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/interfaceiter_.Tpo $(DEPDIR)/interfaceiter_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='interfaceiter_.c' object='interfaceiter_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interfaceiter_.obj `if test -f 'interfaceiter_.c'; then $(CYGPATH_W) 'interfaceiter_.c'; else $(CYGPATH_W) '$(srcdir)/interfaceiter_.c'; fi` interfaceiter.o: $(srcdir)/../libisc/interfaceiter.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter.o -MD -MP -MF "$(DEPDIR)/interfaceiter.Tpo" -c -o interfaceiter.o `test -f '$(srcdir)/../libisc/interfaceiter.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/interfaceiter.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/interfaceiter.Tpo" "$(DEPDIR)/interfaceiter.Po"; else rm -f "$(DEPDIR)/interfaceiter.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter.o -MD -MP -MF $(DEPDIR)/interfaceiter.Tpo -c -o interfaceiter.o `test -f '$(srcdir)/../libisc/interfaceiter.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/interfaceiter.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/interfaceiter.Tpo $(DEPDIR)/interfaceiter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/interfaceiter.c' object='interfaceiter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interfaceiter.o `test -f '$(srcdir)/../libisc/interfaceiter.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/interfaceiter.c interfaceiter.obj: $(srcdir)/../libisc/interfaceiter.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter.obj -MD -MP -MF "$(DEPDIR)/interfaceiter.Tpo" -c -o interfaceiter.obj `if test -f '$(srcdir)/../libisc/interfaceiter.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/interfaceiter.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/interfaceiter.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/interfaceiter.Tpo" "$(DEPDIR)/interfaceiter.Po"; else rm -f "$(DEPDIR)/interfaceiter.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT interfaceiter.obj -MD -MP -MF $(DEPDIR)/interfaceiter.Tpo -c -o interfaceiter.obj `if test -f '$(srcdir)/../libisc/interfaceiter.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/interfaceiter.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/interfaceiter.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/interfaceiter.Tpo $(DEPDIR)/interfaceiter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/interfaceiter.c' object='interfaceiter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o interfaceiter.obj `if test -f '$(srcdir)/../libisc/interfaceiter.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/interfaceiter.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/interfaceiter.c'; fi` lib_.o: lib_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib_.o -MD -MP -MF "$(DEPDIR)/lib_.Tpo" -c -o lib_.o `test -f 'lib_.c' || echo '$(srcdir)/'`lib_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_.Tpo" "$(DEPDIR)/lib_.Po"; else rm -f "$(DEPDIR)/lib_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib_.o -MD -MP -MF $(DEPDIR)/lib_.Tpo -c -o lib_.o `test -f 'lib_.c' || echo '$(srcdir)/'`lib_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/lib_.Tpo $(DEPDIR)/lib_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib_.c' object='lib_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib_.o `test -f 'lib_.c' || echo '$(srcdir)/'`lib_.c lib_.obj: lib_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib_.obj -MD -MP -MF "$(DEPDIR)/lib_.Tpo" -c -o lib_.obj `if test -f 'lib_.c'; then $(CYGPATH_W) 'lib_.c'; else $(CYGPATH_W) '$(srcdir)/lib_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib_.Tpo" "$(DEPDIR)/lib_.Po"; else rm -f "$(DEPDIR)/lib_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib_.obj -MD -MP -MF $(DEPDIR)/lib_.Tpo -c -o lib_.obj `if test -f 'lib_.c'; then $(CYGPATH_W) 'lib_.c'; else $(CYGPATH_W) '$(srcdir)/lib_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/lib_.Tpo $(DEPDIR)/lib_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib_.c' object='lib_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib_.obj `if test -f 'lib_.c'; then $(CYGPATH_W) 'lib_.c'; else $(CYGPATH_W) '$(srcdir)/lib_.c'; fi` lib.o: $(srcdir)/../libisc/lib.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib.o -MD -MP -MF "$(DEPDIR)/lib.Tpo" -c -o lib.o `test -f '$(srcdir)/../libisc/lib.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/lib.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib.Tpo" "$(DEPDIR)/lib.Po"; else rm -f "$(DEPDIR)/lib.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib.o -MD -MP -MF $(DEPDIR)/lib.Tpo -c -o lib.o `test -f '$(srcdir)/../libisc/lib.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/lib.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/lib.Tpo $(DEPDIR)/lib.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/lib.c' object='lib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib.o `test -f '$(srcdir)/../libisc/lib.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/lib.c lib.obj: $(srcdir)/../libisc/lib.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib.obj -MD -MP -MF "$(DEPDIR)/lib.Tpo" -c -o lib.obj `if test -f '$(srcdir)/../libisc/lib.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/lib.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/lib.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/lib.Tpo" "$(DEPDIR)/lib.Po"; else rm -f "$(DEPDIR)/lib.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib.obj -MD -MP -MF $(DEPDIR)/lib.Tpo -c -o lib.obj `if test -f '$(srcdir)/../libisc/lib.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/lib.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/lib.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/lib.Tpo $(DEPDIR)/lib.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/lib.c' object='lib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib.obj `if test -f '$(srcdir)/../libisc/lib.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/lib.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/lib.c'; fi` mem_.o: mem_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem_.o -MD -MP -MF "$(DEPDIR)/mem_.Tpo" -c -o mem_.o `test -f 'mem_.c' || echo '$(srcdir)/'`mem_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/mem_.Tpo" "$(DEPDIR)/mem_.Po"; else rm -f "$(DEPDIR)/mem_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem_.o -MD -MP -MF $(DEPDIR)/mem_.Tpo -c -o mem_.o `test -f 'mem_.c' || echo '$(srcdir)/'`mem_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mem_.Tpo $(DEPDIR)/mem_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mem_.c' object='mem_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem_.o `test -f 'mem_.c' || echo '$(srcdir)/'`mem_.c mem_.obj: mem_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem_.obj -MD -MP -MF "$(DEPDIR)/mem_.Tpo" -c -o mem_.obj `if test -f 'mem_.c'; then $(CYGPATH_W) 'mem_.c'; else $(CYGPATH_W) '$(srcdir)/mem_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/mem_.Tpo" "$(DEPDIR)/mem_.Po"; else rm -f "$(DEPDIR)/mem_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem_.obj -MD -MP -MF $(DEPDIR)/mem_.Tpo -c -o mem_.obj `if test -f 'mem_.c'; then $(CYGPATH_W) 'mem_.c'; else $(CYGPATH_W) '$(srcdir)/mem_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mem_.Tpo $(DEPDIR)/mem_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mem_.c' object='mem_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem_.obj `if test -f 'mem_.c'; then $(CYGPATH_W) 'mem_.c'; else $(CYGPATH_W) '$(srcdir)/mem_.c'; fi` mem.o: $(srcdir)/../libisc/mem.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem.o -MD -MP -MF "$(DEPDIR)/mem.Tpo" -c -o mem.o `test -f '$(srcdir)/../libisc/mem.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/mem.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/mem.Tpo" "$(DEPDIR)/mem.Po"; else rm -f "$(DEPDIR)/mem.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem.o -MD -MP -MF $(DEPDIR)/mem.Tpo -c -o mem.o `test -f '$(srcdir)/../libisc/mem.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/mem.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mem.Tpo $(DEPDIR)/mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/mem.c' object='mem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem.o `test -f '$(srcdir)/../libisc/mem.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/mem.c mem.obj: $(srcdir)/../libisc/mem.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem.obj -MD -MP -MF "$(DEPDIR)/mem.Tpo" -c -o mem.obj `if test -f '$(srcdir)/../libisc/mem.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/mem.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/mem.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/mem.Tpo" "$(DEPDIR)/mem.Po"; else rm -f "$(DEPDIR)/mem.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mem.obj -MD -MP -MF $(DEPDIR)/mem.Tpo -c -o mem.obj `if test -f '$(srcdir)/../libisc/mem.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/mem.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/mem.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/mem.Tpo $(DEPDIR)/mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/mem.c' object='mem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o mem.obj `if test -f '$(srcdir)/../libisc/mem.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/mem.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/mem.c'; fi` msgcat_.o: msgcat_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat_.o -MD -MP -MF "$(DEPDIR)/msgcat_.Tpo" -c -o msgcat_.o `test -f 'msgcat_.c' || echo '$(srcdir)/'`msgcat_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/msgcat_.Tpo" "$(DEPDIR)/msgcat_.Po"; else rm -f "$(DEPDIR)/msgcat_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat_.o -MD -MP -MF $(DEPDIR)/msgcat_.Tpo -c -o msgcat_.o `test -f 'msgcat_.c' || echo '$(srcdir)/'`msgcat_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/msgcat_.Tpo $(DEPDIR)/msgcat_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='msgcat_.c' object='msgcat_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o msgcat_.o `test -f 'msgcat_.c' || echo '$(srcdir)/'`msgcat_.c msgcat_.obj: msgcat_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat_.obj -MD -MP -MF "$(DEPDIR)/msgcat_.Tpo" -c -o msgcat_.obj `if test -f 'msgcat_.c'; then $(CYGPATH_W) 'msgcat_.c'; else $(CYGPATH_W) '$(srcdir)/msgcat_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/msgcat_.Tpo" "$(DEPDIR)/msgcat_.Po"; else rm -f "$(DEPDIR)/msgcat_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat_.obj -MD -MP -MF $(DEPDIR)/msgcat_.Tpo -c -o msgcat_.obj `if test -f 'msgcat_.c'; then $(CYGPATH_W) 'msgcat_.c'; else $(CYGPATH_W) '$(srcdir)/msgcat_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/msgcat_.Tpo $(DEPDIR)/msgcat_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='msgcat_.c' object='msgcat_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o msgcat_.obj `if test -f 'msgcat_.c'; then $(CYGPATH_W) 'msgcat_.c'; else $(CYGPATH_W) '$(srcdir)/msgcat_.c'; fi` msgcat.o: $(srcdir)/../libisc/msgcat.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat.o -MD -MP -MF "$(DEPDIR)/msgcat.Tpo" -c -o msgcat.o `test -f '$(srcdir)/../libisc/msgcat.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/msgcat.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/msgcat.Tpo" "$(DEPDIR)/msgcat.Po"; else rm -f "$(DEPDIR)/msgcat.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat.o -MD -MP -MF $(DEPDIR)/msgcat.Tpo -c -o msgcat.o `test -f '$(srcdir)/../libisc/msgcat.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/msgcat.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/msgcat.Tpo $(DEPDIR)/msgcat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/msgcat.c' object='msgcat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o msgcat.o `test -f '$(srcdir)/../libisc/msgcat.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/msgcat.c msgcat.obj: $(srcdir)/../libisc/msgcat.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat.obj -MD -MP -MF "$(DEPDIR)/msgcat.Tpo" -c -o msgcat.obj `if test -f '$(srcdir)/../libisc/msgcat.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/msgcat.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/msgcat.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/msgcat.Tpo" "$(DEPDIR)/msgcat.Po"; else rm -f "$(DEPDIR)/msgcat.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT msgcat.obj -MD -MP -MF $(DEPDIR)/msgcat.Tpo -c -o msgcat.obj `if test -f '$(srcdir)/../libisc/msgcat.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/msgcat.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/msgcat.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/msgcat.Tpo $(DEPDIR)/msgcat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/msgcat.c' object='msgcat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o msgcat.obj `if test -f '$(srcdir)/../libisc/msgcat.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/msgcat.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/msgcat.c'; fi` net_.o: net_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net_.o -MD -MP -MF "$(DEPDIR)/net_.Tpo" -c -o net_.o `test -f 'net_.c' || echo '$(srcdir)/'`net_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/net_.Tpo" "$(DEPDIR)/net_.Po"; else rm -f "$(DEPDIR)/net_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net_.o -MD -MP -MF $(DEPDIR)/net_.Tpo -c -o net_.o `test -f 'net_.c' || echo '$(srcdir)/'`net_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/net_.Tpo $(DEPDIR)/net_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='net_.c' object='net_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o net_.o `test -f 'net_.c' || echo '$(srcdir)/'`net_.c net_.obj: net_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net_.obj -MD -MP -MF "$(DEPDIR)/net_.Tpo" -c -o net_.obj `if test -f 'net_.c'; then $(CYGPATH_W) 'net_.c'; else $(CYGPATH_W) '$(srcdir)/net_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/net_.Tpo" "$(DEPDIR)/net_.Po"; else rm -f "$(DEPDIR)/net_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net_.obj -MD -MP -MF $(DEPDIR)/net_.Tpo -c -o net_.obj `if test -f 'net_.c'; then $(CYGPATH_W) 'net_.c'; else $(CYGPATH_W) '$(srcdir)/net_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/net_.Tpo $(DEPDIR)/net_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='net_.c' object='net_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o net_.obj `if test -f 'net_.c'; then $(CYGPATH_W) 'net_.c'; else $(CYGPATH_W) '$(srcdir)/net_.c'; fi` net.o: $(srcdir)/../libisc/net.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net.o -MD -MP -MF "$(DEPDIR)/net.Tpo" -c -o net.o `test -f '$(srcdir)/../libisc/net.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/net.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/net.Tpo" "$(DEPDIR)/net.Po"; else rm -f "$(DEPDIR)/net.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net.o -MD -MP -MF $(DEPDIR)/net.Tpo -c -o net.o `test -f '$(srcdir)/../libisc/net.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/net.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/net.Tpo $(DEPDIR)/net.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/net.c' object='net.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o net.o `test -f '$(srcdir)/../libisc/net.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/net.c net.obj: $(srcdir)/../libisc/net.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net.obj -MD -MP -MF "$(DEPDIR)/net.Tpo" -c -o net.obj `if test -f '$(srcdir)/../libisc/net.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/net.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/net.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/net.Tpo" "$(DEPDIR)/net.Po"; else rm -f "$(DEPDIR)/net.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT net.obj -MD -MP -MF $(DEPDIR)/net.Tpo -c -o net.obj `if test -f '$(srcdir)/../libisc/net.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/net.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/net.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/net.Tpo $(DEPDIR)/net.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/net.c' object='net.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o net.obj `if test -f '$(srcdir)/../libisc/net.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/net.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/net.c'; fi` isc_strerror_.o: isc_strerror_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror_.o -MD -MP -MF "$(DEPDIR)/isc_strerror_.Tpo" -c -o isc_strerror_.o `test -f 'isc_strerror_.c' || echo '$(srcdir)/'`isc_strerror_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/isc_strerror_.Tpo" "$(DEPDIR)/isc_strerror_.Po"; else rm -f "$(DEPDIR)/isc_strerror_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror_.o -MD -MP -MF $(DEPDIR)/isc_strerror_.Tpo -c -o isc_strerror_.o `test -f 'isc_strerror_.c' || echo '$(srcdir)/'`isc_strerror_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/isc_strerror_.Tpo $(DEPDIR)/isc_strerror_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='isc_strerror_.c' object='isc_strerror_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isc_strerror_.o `test -f 'isc_strerror_.c' || echo '$(srcdir)/'`isc_strerror_.c isc_strerror_.obj: isc_strerror_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror_.obj -MD -MP -MF "$(DEPDIR)/isc_strerror_.Tpo" -c -o isc_strerror_.obj `if test -f 'isc_strerror_.c'; then $(CYGPATH_W) 'isc_strerror_.c'; else $(CYGPATH_W) '$(srcdir)/isc_strerror_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/isc_strerror_.Tpo" "$(DEPDIR)/isc_strerror_.Po"; else rm -f "$(DEPDIR)/isc_strerror_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror_.obj -MD -MP -MF $(DEPDIR)/isc_strerror_.Tpo -c -o isc_strerror_.obj `if test -f 'isc_strerror_.c'; then $(CYGPATH_W) 'isc_strerror_.c'; else $(CYGPATH_W) '$(srcdir)/isc_strerror_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/isc_strerror_.Tpo $(DEPDIR)/isc_strerror_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='isc_strerror_.c' object='isc_strerror_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isc_strerror_.obj `if test -f 'isc_strerror_.c'; then $(CYGPATH_W) 'isc_strerror_.c'; else $(CYGPATH_W) '$(srcdir)/isc_strerror_.c'; fi` isc_strerror.o: $(srcdir)/../libisc/isc_strerror.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror.o -MD -MP -MF "$(DEPDIR)/isc_strerror.Tpo" -c -o isc_strerror.o `test -f '$(srcdir)/../libisc/isc_strerror.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/isc_strerror.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/isc_strerror.Tpo" "$(DEPDIR)/isc_strerror.Po"; else rm -f "$(DEPDIR)/isc_strerror.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror.o -MD -MP -MF $(DEPDIR)/isc_strerror.Tpo -c -o isc_strerror.o `test -f '$(srcdir)/../libisc/isc_strerror.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/isc_strerror.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/isc_strerror.Tpo $(DEPDIR)/isc_strerror.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/isc_strerror.c' object='isc_strerror.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isc_strerror.o `test -f '$(srcdir)/../libisc/isc_strerror.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/isc_strerror.c isc_strerror.obj: $(srcdir)/../libisc/isc_strerror.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror.obj -MD -MP -MF "$(DEPDIR)/isc_strerror.Tpo" -c -o isc_strerror.obj `if test -f '$(srcdir)/../libisc/isc_strerror.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/isc_strerror.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/isc_strerror.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/isc_strerror.Tpo" "$(DEPDIR)/isc_strerror.Po"; else rm -f "$(DEPDIR)/isc_strerror.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isc_strerror.obj -MD -MP -MF $(DEPDIR)/isc_strerror.Tpo -c -o isc_strerror.obj `if test -f '$(srcdir)/../libisc/isc_strerror.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/isc_strerror.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/isc_strerror.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/isc_strerror.Tpo $(DEPDIR)/isc_strerror.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/isc_strerror.c' object='isc_strerror.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isc_strerror.obj `if test -f '$(srcdir)/../libisc/isc_strerror.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/isc_strerror.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/isc_strerror.c'; fi` inet_ntop_.o: inet_ntop_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop_.o -MD -MP -MF "$(DEPDIR)/inet_ntop_.Tpo" -c -o inet_ntop_.o `test -f 'inet_ntop_.c' || echo '$(srcdir)/'`inet_ntop_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_ntop_.Tpo" "$(DEPDIR)/inet_ntop_.Po"; else rm -f "$(DEPDIR)/inet_ntop_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop_.o -MD -MP -MF $(DEPDIR)/inet_ntop_.Tpo -c -o inet_ntop_.o `test -f 'inet_ntop_.c' || echo '$(srcdir)/'`inet_ntop_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_ntop_.Tpo $(DEPDIR)/inet_ntop_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inet_ntop_.c' object='inet_ntop_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_ntop_.o `test -f 'inet_ntop_.c' || echo '$(srcdir)/'`inet_ntop_.c inet_ntop_.obj: inet_ntop_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop_.obj -MD -MP -MF "$(DEPDIR)/inet_ntop_.Tpo" -c -o inet_ntop_.obj `if test -f 'inet_ntop_.c'; then $(CYGPATH_W) 'inet_ntop_.c'; else $(CYGPATH_W) '$(srcdir)/inet_ntop_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_ntop_.Tpo" "$(DEPDIR)/inet_ntop_.Po"; else rm -f "$(DEPDIR)/inet_ntop_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop_.obj -MD -MP -MF $(DEPDIR)/inet_ntop_.Tpo -c -o inet_ntop_.obj `if test -f 'inet_ntop_.c'; then $(CYGPATH_W) 'inet_ntop_.c'; else $(CYGPATH_W) '$(srcdir)/inet_ntop_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_ntop_.Tpo $(DEPDIR)/inet_ntop_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inet_ntop_.c' object='inet_ntop_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_ntop_.obj `if test -f 'inet_ntop_.c'; then $(CYGPATH_W) 'inet_ntop_.c'; else $(CYGPATH_W) '$(srcdir)/inet_ntop_.c'; fi` inet_ntop.o: $(srcdir)/../libisc/inet_ntop.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop.o -MD -MP -MF "$(DEPDIR)/inet_ntop.Tpo" -c -o inet_ntop.o `test -f '$(srcdir)/../libisc/inet_ntop.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/inet_ntop.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_ntop.Tpo" "$(DEPDIR)/inet_ntop.Po"; else rm -f "$(DEPDIR)/inet_ntop.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop.o -MD -MP -MF $(DEPDIR)/inet_ntop.Tpo -c -o inet_ntop.o `test -f '$(srcdir)/../libisc/inet_ntop.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/inet_ntop.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_ntop.Tpo $(DEPDIR)/inet_ntop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/inet_ntop.c' object='inet_ntop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_ntop.o `test -f '$(srcdir)/../libisc/inet_ntop.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/inet_ntop.c inet_ntop.obj: $(srcdir)/../libisc/inet_ntop.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop.obj -MD -MP -MF "$(DEPDIR)/inet_ntop.Tpo" -c -o inet_ntop.obj `if test -f '$(srcdir)/../libisc/inet_ntop.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/inet_ntop.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/inet_ntop.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_ntop.Tpo" "$(DEPDIR)/inet_ntop.Po"; else rm -f "$(DEPDIR)/inet_ntop.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_ntop.obj -MD -MP -MF $(DEPDIR)/inet_ntop.Tpo -c -o inet_ntop.obj `if test -f '$(srcdir)/../libisc/inet_ntop.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/inet_ntop.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/inet_ntop.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_ntop.Tpo $(DEPDIR)/inet_ntop.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/inet_ntop.c' object='inet_ntop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_ntop.obj `if test -f '$(srcdir)/../libisc/inet_ntop.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/inet_ntop.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/inet_ntop.c'; fi` inet_pton_.o: inet_pton_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton_.o -MD -MP -MF "$(DEPDIR)/inet_pton_.Tpo" -c -o inet_pton_.o `test -f 'inet_pton_.c' || echo '$(srcdir)/'`inet_pton_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_pton_.Tpo" "$(DEPDIR)/inet_pton_.Po"; else rm -f "$(DEPDIR)/inet_pton_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton_.o -MD -MP -MF $(DEPDIR)/inet_pton_.Tpo -c -o inet_pton_.o `test -f 'inet_pton_.c' || echo '$(srcdir)/'`inet_pton_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_pton_.Tpo $(DEPDIR)/inet_pton_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inet_pton_.c' object='inet_pton_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_pton_.o `test -f 'inet_pton_.c' || echo '$(srcdir)/'`inet_pton_.c inet_pton_.obj: inet_pton_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton_.obj -MD -MP -MF "$(DEPDIR)/inet_pton_.Tpo" -c -o inet_pton_.obj `if test -f 'inet_pton_.c'; then $(CYGPATH_W) 'inet_pton_.c'; else $(CYGPATH_W) '$(srcdir)/inet_pton_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_pton_.Tpo" "$(DEPDIR)/inet_pton_.Po"; else rm -f "$(DEPDIR)/inet_pton_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton_.obj -MD -MP -MF $(DEPDIR)/inet_pton_.Tpo -c -o inet_pton_.obj `if test -f 'inet_pton_.c'; then $(CYGPATH_W) 'inet_pton_.c'; else $(CYGPATH_W) '$(srcdir)/inet_pton_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_pton_.Tpo $(DEPDIR)/inet_pton_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inet_pton_.c' object='inet_pton_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_pton_.obj `if test -f 'inet_pton_.c'; then $(CYGPATH_W) 'inet_pton_.c'; else $(CYGPATH_W) '$(srcdir)/inet_pton_.c'; fi` inet_pton.o: $(srcdir)/../libisc/inet_pton.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton.o -MD -MP -MF "$(DEPDIR)/inet_pton.Tpo" -c -o inet_pton.o `test -f '$(srcdir)/../libisc/inet_pton.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/inet_pton.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_pton.Tpo" "$(DEPDIR)/inet_pton.Po"; else rm -f "$(DEPDIR)/inet_pton.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton.o -MD -MP -MF $(DEPDIR)/inet_pton.Tpo -c -o inet_pton.o `test -f '$(srcdir)/../libisc/inet_pton.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/inet_pton.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_pton.Tpo $(DEPDIR)/inet_pton.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/inet_pton.c' object='inet_pton.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_pton.o `test -f '$(srcdir)/../libisc/inet_pton.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/inet_pton.c inet_pton.obj: $(srcdir)/../libisc/inet_pton.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton.obj -MD -MP -MF "$(DEPDIR)/inet_pton.Tpo" -c -o inet_pton.obj `if test -f '$(srcdir)/../libisc/inet_pton.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/inet_pton.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/inet_pton.Tpo" "$(DEPDIR)/inet_pton.Po"; else rm -f "$(DEPDIR)/inet_pton.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT inet_pton.obj -MD -MP -MF $(DEPDIR)/inet_pton.Tpo -c -o inet_pton.obj `if test -f '$(srcdir)/../libisc/inet_pton.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/inet_pton.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/inet_pton.Tpo $(DEPDIR)/inet_pton.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/inet_pton.c' object='inet_pton.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o inet_pton.obj `if test -f '$(srcdir)/../libisc/inet_pton.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/inet_pton.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/inet_pton.c'; fi` netaddr_.o: netaddr_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr_.o -MD -MP -MF "$(DEPDIR)/netaddr_.Tpo" -c -o netaddr_.o `test -f 'netaddr_.c' || echo '$(srcdir)/'`netaddr_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netaddr_.Tpo" "$(DEPDIR)/netaddr_.Po"; else rm -f "$(DEPDIR)/netaddr_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr_.o -MD -MP -MF $(DEPDIR)/netaddr_.Tpo -c -o netaddr_.o `test -f 'netaddr_.c' || echo '$(srcdir)/'`netaddr_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netaddr_.Tpo $(DEPDIR)/netaddr_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netaddr_.c' object='netaddr_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netaddr_.o `test -f 'netaddr_.c' || echo '$(srcdir)/'`netaddr_.c netaddr_.obj: netaddr_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr_.obj -MD -MP -MF "$(DEPDIR)/netaddr_.Tpo" -c -o netaddr_.obj `if test -f 'netaddr_.c'; then $(CYGPATH_W) 'netaddr_.c'; else $(CYGPATH_W) '$(srcdir)/netaddr_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netaddr_.Tpo" "$(DEPDIR)/netaddr_.Po"; else rm -f "$(DEPDIR)/netaddr_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr_.obj -MD -MP -MF $(DEPDIR)/netaddr_.Tpo -c -o netaddr_.obj `if test -f 'netaddr_.c'; then $(CYGPATH_W) 'netaddr_.c'; else $(CYGPATH_W) '$(srcdir)/netaddr_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netaddr_.Tpo $(DEPDIR)/netaddr_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netaddr_.c' object='netaddr_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netaddr_.obj `if test -f 'netaddr_.c'; then $(CYGPATH_W) 'netaddr_.c'; else $(CYGPATH_W) '$(srcdir)/netaddr_.c'; fi` netaddr.o: $(srcdir)/../libisc/netaddr.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr.o -MD -MP -MF "$(DEPDIR)/netaddr.Tpo" -c -o netaddr.o `test -f '$(srcdir)/../libisc/netaddr.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/netaddr.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netaddr.Tpo" "$(DEPDIR)/netaddr.Po"; else rm -f "$(DEPDIR)/netaddr.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr.o -MD -MP -MF $(DEPDIR)/netaddr.Tpo -c -o netaddr.o `test -f '$(srcdir)/../libisc/netaddr.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/netaddr.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netaddr.Tpo $(DEPDIR)/netaddr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/netaddr.c' object='netaddr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netaddr.o `test -f '$(srcdir)/../libisc/netaddr.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/netaddr.c netaddr.obj: $(srcdir)/../libisc/netaddr.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr.obj -MD -MP -MF "$(DEPDIR)/netaddr.Tpo" -c -o netaddr.obj `if test -f '$(srcdir)/../libisc/netaddr.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/netaddr.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/netaddr.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netaddr.Tpo" "$(DEPDIR)/netaddr.Po"; else rm -f "$(DEPDIR)/netaddr.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netaddr.obj -MD -MP -MF $(DEPDIR)/netaddr.Tpo -c -o netaddr.obj `if test -f '$(srcdir)/../libisc/netaddr.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/netaddr.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/netaddr.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netaddr.Tpo $(DEPDIR)/netaddr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/netaddr.c' object='netaddr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netaddr.obj `if test -f '$(srcdir)/../libisc/netaddr.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/netaddr.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/netaddr.c'; fi` sockaddr_.o: sockaddr_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr_.o -MD -MP -MF "$(DEPDIR)/sockaddr_.Tpo" -c -o sockaddr_.o `test -f 'sockaddr_.c' || echo '$(srcdir)/'`sockaddr_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sockaddr_.Tpo" "$(DEPDIR)/sockaddr_.Po"; else rm -f "$(DEPDIR)/sockaddr_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr_.o -MD -MP -MF $(DEPDIR)/sockaddr_.Tpo -c -o sockaddr_.o `test -f 'sockaddr_.c' || echo '$(srcdir)/'`sockaddr_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/sockaddr_.Tpo $(DEPDIR)/sockaddr_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sockaddr_.c' object='sockaddr_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sockaddr_.o `test -f 'sockaddr_.c' || echo '$(srcdir)/'`sockaddr_.c sockaddr_.obj: sockaddr_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr_.obj -MD -MP -MF "$(DEPDIR)/sockaddr_.Tpo" -c -o sockaddr_.obj `if test -f 'sockaddr_.c'; then $(CYGPATH_W) 'sockaddr_.c'; else $(CYGPATH_W) '$(srcdir)/sockaddr_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sockaddr_.Tpo" "$(DEPDIR)/sockaddr_.Po"; else rm -f "$(DEPDIR)/sockaddr_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr_.obj -MD -MP -MF $(DEPDIR)/sockaddr_.Tpo -c -o sockaddr_.obj `if test -f 'sockaddr_.c'; then $(CYGPATH_W) 'sockaddr_.c'; else $(CYGPATH_W) '$(srcdir)/sockaddr_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/sockaddr_.Tpo $(DEPDIR)/sockaddr_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sockaddr_.c' object='sockaddr_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sockaddr_.obj `if test -f 'sockaddr_.c'; then $(CYGPATH_W) 'sockaddr_.c'; else $(CYGPATH_W) '$(srcdir)/sockaddr_.c'; fi` sockaddr.o: $(srcdir)/../libisc/sockaddr.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr.o -MD -MP -MF "$(DEPDIR)/sockaddr.Tpo" -c -o sockaddr.o `test -f '$(srcdir)/../libisc/sockaddr.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/sockaddr.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sockaddr.Tpo" "$(DEPDIR)/sockaddr.Po"; else rm -f "$(DEPDIR)/sockaddr.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr.o -MD -MP -MF $(DEPDIR)/sockaddr.Tpo -c -o sockaddr.o `test -f '$(srcdir)/../libisc/sockaddr.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/sockaddr.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/sockaddr.Tpo $(DEPDIR)/sockaddr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/sockaddr.c' object='sockaddr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sockaddr.o `test -f '$(srcdir)/../libisc/sockaddr.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/sockaddr.c sockaddr.obj: $(srcdir)/../libisc/sockaddr.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr.obj -MD -MP -MF "$(DEPDIR)/sockaddr.Tpo" -c -o sockaddr.obj `if test -f '$(srcdir)/../libisc/sockaddr.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/sockaddr.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/sockaddr.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/sockaddr.Tpo" "$(DEPDIR)/sockaddr.Po"; else rm -f "$(DEPDIR)/sockaddr.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sockaddr.obj -MD -MP -MF $(DEPDIR)/sockaddr.Tpo -c -o sockaddr.obj `if test -f '$(srcdir)/../libisc/sockaddr.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/sockaddr.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/sockaddr.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/sockaddr.Tpo $(DEPDIR)/sockaddr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/sockaddr.c' object='sockaddr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sockaddr.obj `if test -f '$(srcdir)/../libisc/sockaddr.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/sockaddr.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/sockaddr.c'; fi` netscope_.o: netscope_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope_.o -MD -MP -MF "$(DEPDIR)/netscope_.Tpo" -c -o netscope_.o `test -f 'netscope_.c' || echo '$(srcdir)/'`netscope_.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netscope_.Tpo" "$(DEPDIR)/netscope_.Po"; else rm -f "$(DEPDIR)/netscope_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope_.o -MD -MP -MF $(DEPDIR)/netscope_.Tpo -c -o netscope_.o `test -f 'netscope_.c' || echo '$(srcdir)/'`netscope_.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netscope_.Tpo $(DEPDIR)/netscope_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netscope_.c' object='netscope_.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netscope_.o `test -f 'netscope_.c' || echo '$(srcdir)/'`netscope_.c netscope_.obj: netscope_.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope_.obj -MD -MP -MF "$(DEPDIR)/netscope_.Tpo" -c -o netscope_.obj `if test -f 'netscope_.c'; then $(CYGPATH_W) 'netscope_.c'; else $(CYGPATH_W) '$(srcdir)/netscope_.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netscope_.Tpo" "$(DEPDIR)/netscope_.Po"; else rm -f "$(DEPDIR)/netscope_.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope_.obj -MD -MP -MF $(DEPDIR)/netscope_.Tpo -c -o netscope_.obj `if test -f 'netscope_.c'; then $(CYGPATH_W) 'netscope_.c'; else $(CYGPATH_W) '$(srcdir)/netscope_.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netscope_.Tpo $(DEPDIR)/netscope_.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='netscope_.c' object='netscope_.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netscope_.obj `if test -f 'netscope_.c'; then $(CYGPATH_W) 'netscope_.c'; else $(CYGPATH_W) '$(srcdir)/netscope_.c'; fi` netscope.o: $(srcdir)/../libisc/netscope.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope.o -MD -MP -MF "$(DEPDIR)/netscope.Tpo" -c -o netscope.o `test -f '$(srcdir)/../libisc/netscope.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/netscope.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netscope.Tpo" "$(DEPDIR)/netscope.Po"; else rm -f "$(DEPDIR)/netscope.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope.o -MD -MP -MF $(DEPDIR)/netscope.Tpo -c -o netscope.o `test -f '$(srcdir)/../libisc/netscope.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/netscope.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netscope.Tpo $(DEPDIR)/netscope.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/netscope.c' object='netscope.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netscope.o `test -f '$(srcdir)/../libisc/netscope.c' || echo '$(srcdir)/'`$(srcdir)/../libisc/netscope.c netscope.obj: $(srcdir)/../libisc/netscope.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope.obj -MD -MP -MF "$(DEPDIR)/netscope.Tpo" -c -o netscope.obj `if test -f '$(srcdir)/../libisc/netscope.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/netscope.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/netscope.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/netscope.Tpo" "$(DEPDIR)/netscope.Po"; else rm -f "$(DEPDIR)/netscope.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT netscope.obj -MD -MP -MF $(DEPDIR)/netscope.Tpo -c -o netscope.obj `if test -f '$(srcdir)/../libisc/netscope.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/netscope.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/netscope.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/netscope.Tpo $(DEPDIR)/netscope.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(srcdir)/../libisc/netscope.c' object='netscope.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o netscope.obj `if test -f '$(srcdir)/../libisc/netscope.c'; then $(CYGPATH_W) '$(srcdir)/../libisc/netscope.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../libisc/netscope.c'; fi` @@ -1012,82 +1015,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -1115,6 +1121,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -1128,7 +1135,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -1136,18 +1143,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -1168,23 +1195,28 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: ../util/ansi2knr install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-kr \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-info-am + uninstall-am ../include/des.h: touch ../include/des.h + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/libopts/Makefile.in b/contrib/ntp/libopts/Makefile.in index 06b52a214a9f..6a4d03e36b81 100644 --- a/contrib/ntp/libopts/Makefile.in +++ b/contrib/ntp/libopts/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -49,39 +47,57 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" -libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) libopts_la_LIBADD = am_libopts_la_OBJECTS = libopts_la-libopts.lo libopts_la_OBJECTS = $(am_libopts_la_OBJECTS) +libopts_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libopts_la_LDFLAGS) $(LDFLAGS) -o $@ @INSTALL_LIBOPTS_FALSE@am_libopts_la_rpath = @INSTALL_LIBOPTS_TRUE@am_libopts_la_rpath = -rpath $(libdir) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(libopts_la_SOURCES) DIST_SOURCES = $(libopts_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -97,10 +113,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -113,11 +125,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -131,6 +142,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -144,8 +156,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -155,6 +166,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -168,16 +180,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -189,29 +196,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in @INSTALL_LIBOPTS_TRUE@lib_LTLIBRARIES = libopts.la @INSTALL_LIBOPTS_FALSE@noinst_LTLIBRARIES = libopts.la @@ -241,14 +260,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libopts/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign libopts/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libopts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libopts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -266,23 +285,28 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + list2="$$list2 $$p"; \ else :; fi; \ - done + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) - @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: @@ -303,7 +327,7 @@ clean-noinstLTLIBRARIES: rm -f "$${dir}/so_locations"; \ done libopts.la: $(libopts_la_OBJECTS) $(libopts_la_DEPENDENCIES) - $(LINK) $(am_libopts_la_rpath) $(libopts_la_LDFLAGS) $(libopts_la_OBJECTS) $(libopts_la_LIBADD) $(LIBS) + $(libopts_la_LINK) $(am_libopts_la_rpath) $(libopts_la_OBJECTS) $(libopts_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -314,32 +338,32 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopts_la-libopts.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libopts_la-libopts.lo: libopts.c -@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libopts_la-libopts.lo -MD -MP -MF "$(DEPDIR)/libopts_la-libopts.Tpo" -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libopts_la-libopts.Tpo" "$(DEPDIR)/libopts_la-libopts.Plo"; else rm -f "$(DEPDIR)/libopts_la-libopts.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libopts_la-libopts.lo -MD -MP -MF $(DEPDIR)/libopts_la-libopts.Tpo -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libopts_la-libopts.Tpo $(DEPDIR)/libopts_la-libopts.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libopts.c' object='libopts_la-libopts.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c mostlyclean-libtool: -rm -f *.lo @@ -347,83 +371,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/autoopts $(distdir)/compat $(distdir)/m4 - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -432,7 +458,7 @@ check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am @@ -454,6 +480,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -468,7 +495,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -476,18 +503,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-libLTLIBRARIES +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -508,20 +555,24 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-libLTLIBRARIES install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am uninstall-libLTLIBRARIES + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/libparse/Makefile.am b/contrib/ntp/libparse/Makefile.am index c2c403637dc6..8e21463b23e3 100644 --- a/contrib/ntp/libparse/Makefile.am +++ b/contrib/ntp/libparse/Makefile.am @@ -165,4 +165,4 @@ parsesolaris.o: sys/systm.h sys/systm.h: mkdir sys && \ - sed -e 's/ffs(long)/ffs(int)/' < /usr/include/sys/systm.h > sys/systm.h + sed -e '/ffs(.*)/d' < /usr/include/sys/systm.h > sys/systm.h diff --git a/contrib/ntp/libparse/Makefile.in b/contrib/ntp/libparse/Makefile.in index 47ddec9e52d0..4b42f7471abd 100644 --- a/contrib/ntp/libparse/Makefile.in +++ b/contrib/ntp/libparse/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,15 +16,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -39,7 +37,6 @@ build_triplet = @build@ host_triplet = @host@ ANSI2KNR = ../util/ansi2knr EXTRA_PROGRAMS = parsestreams$(EXEEXT) parsesolaris$(EXEEXT) -noinst_PROGRAMS = @MAKE_PARSEKMODULE@ subdir = libparse DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -53,6 +50,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libparse_a_AR = $(AR) $(ARFLAGS) @@ -84,17 +82,19 @@ parsesolaris_LDADD = $(LDADD) parsestreams_SOURCES = parsestreams.c parsestreams_OBJECTS = parsestreams$U.$(OBJEXT) parsestreams_LDADD = $(LDADD) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(libparse_a_SOURCES) $(libparse_kernel_a_SOURCES) \ parsesolaris.c parsestreams.c DIST_SOURCES = $(libparse_a_SOURCES) $(libparse_kernel_a_SOURCES) \ @@ -103,8 +103,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -120,10 +118,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -136,11 +130,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -154,6 +147,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -167,8 +161,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -178,6 +171,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -191,16 +185,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -212,34 +201,47 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../util/ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../util/ansi2knr noinst_LIBRARIES = @MAKE_LIBPARSE@ @MAKE_LIBPARSE_KERNEL@ EXTRA_LIBRARIES = libparse.a libparse_kernel.a +noinst_PROGRAMS = @MAKE_PARSEKMODULE@ CLEANFILES = libparse.a libparse_kernel.a K_CFLAGS = -DPARSESTREAM -DNTP_NEED_BOPS libparse_a_SOURCES = parse.c \ @@ -293,14 +295,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libparse/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign libparse/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libparse/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign libparse/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -318,6 +320,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) @@ -331,17 +334,19 @@ libparse_kernel.a: $(libparse_kernel_a_OBJECTS) $(libparse_kernel_a_DEPENDENCIES $(RANLIB) libparse_kernel.a clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list parsesolaris$(EXEEXT): $(parsesolaris_OBJECTS) $(parsesolaris_DEPENDENCIES) @rm -f parsesolaris$(EXEEXT) - $(LINK) $(parsesolaris_LDFLAGS) $(parsesolaris_OBJECTS) $(parsesolaris_LDADD) $(LIBS) + $(LINK) $(parsesolaris_OBJECTS) $(parsesolaris_LDADD) $(LIBS) parsestreams$(EXEEXT): $(parsestreams_OBJECTS) $(parsestreams_DEPENDENCIES) @rm -f parsestreams$(EXEEXT) - $(LINK) $(parsestreams_LDFLAGS) $(parsestreams_OBJECTS) $(parsestreams_LDADD) $(LIBS) + $(LINK) $(parsestreams_OBJECTS) $(parsestreams_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -349,7 +354,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -378,22 +383,22 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trim_info$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -462,82 +467,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -566,6 +574,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -579,7 +588,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -587,18 +596,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -619,19 +648,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: ../util/ansi2knr install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES clean-noinstPROGRAMS ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-kr mostlyclean-libtool pdf \ - pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am + pdf-am ps ps-am tags uninstall uninstall-am # @@ -745,7 +778,8 @@ parsesolaris.o: sys/systm.h sys/systm.h: mkdir sys && \ - sed -e 's/ffs(long)/ffs(int)/' < /usr/include/sys/systm.h > sys/systm.h + sed -e '/ffs(.*)/d' < /usr/include/sys/systm.h > sys/systm.h + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/libparse/clk_rawdcf.c b/contrib/ntp/libparse/clk_rawdcf.c index 3465e8dfbad1..3ef36c43ea37 100644 --- a/contrib/ntp/libparse/clk_rawdcf.c +++ b/contrib/ntp/libparse/clk_rawdcf.c @@ -229,7 +229,7 @@ convert_rawdcf( unsigned char *c = dcfprm->zerobits; int i; - parseprintf(DD_RAWDCF,("parse: convert_rawdcf: \"%.*s\"\n", size, buffer)); + parseprintf(DD_RAWDCF,("parse: convert_rawdcf: \"%s\"\n", buffer)); if (size < 57) { @@ -320,7 +320,7 @@ convert_rawdcf( * bad format - not for us */ #ifndef PARSEKERNEL - msyslog(LOG_ERR, "parse: convert_rawdcf: parity check FAILED for \"%.*s\"\n", size, buffer); + msyslog(LOG_ERR, "parse: convert_rawdcf: parity check FAILED for \"%s\"\n", buffer); #endif return CVT_FAIL|CVT_BADFMT; } diff --git a/contrib/ntp/ntpd/Makefile.in b/contrib/ntp/ntpd/Makefile.in index ad079300d0ad..f92b31fa3b72 100644 --- a/contrib/ntp/ntpd/Makefile.in +++ b/contrib/ntp/ntpd/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -19,15 +20,12 @@ # subdir to warn folks if there is another version there. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -43,7 +41,6 @@ build_triplet = @build@ host_triplet = @host@ ANSI2KNR = ../util/ansi2knr bin_PROGRAMS = ntpd$(EXEEXT) @MAKE_NTPDSIM@ -check_PROGRAMS = @MAKE_CHECK_Y2K@ EXTRA_PROGRAMS = check_y2k$(EXEEXT) ntpdsim$(EXEEXT) DIST_COMMON = $(srcdir)/../bincheck.mf $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in @@ -59,6 +56,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libntpd_a_AR = $(AR) $(ARFLAGS) @@ -91,7 +89,6 @@ am_libntpd_a_OBJECTS = ntp_control$U.$(OBJEXT) ntp_crypto$U.$(OBJEXT) \ refclock_wwvb$U.$(OBJEXT) refclock_zyfer$U.$(OBJEXT) libntpd_a_OBJECTS = $(am_libntpd_a_OBJECTS) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) check_y2k_SOURCES = check_y2k.c check_y2k_OBJECTS = check_y2k$U.$(OBJEXT) @@ -111,21 +108,47 @@ am_ntpdsim_OBJECTS = $(am__objects_1) ntpdsim-ntpsim$U.$(OBJEXT) \ ntpdsim_OBJECTS = $(am_ntpdsim_OBJECTS) ntpdsim_DEPENDENCIES = $(am__DEPENDENCIES_1) ../libntp/libntpsim.a \ $(am__DEPENDENCIES_2) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +ntpdsim_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(ntpdsim_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(libntpd_a_SOURCES) check_y2k.c $(ntpd_SOURCES) \ $(ntpdsim_SOURCES) DIST_SOURCES = $(libntpd_a_SOURCES) check_y2k.c $(ntpd_SOURCES) \ $(ntpdsim_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) @@ -133,8 +156,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -150,10 +171,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -166,11 +183,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -184,6 +200,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -197,8 +214,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -208,6 +224,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -221,16 +238,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -242,29 +254,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = ../util/ansi2knr noinst_LIBRARIES = libntpd.a AM_CPPFLAGS = -I$(top_srcdir)/include -I../include $(LIBOPTS_CFLAGS) @@ -291,6 +315,8 @@ EXTRA_DIST = ntpd-opts.def ntpdbase-opts.def ntpdsim-opts.def \ $(BUILT_SOURCES) ETAGS_ARGS = Makefile.am +### Y2Kfixes +check_PROGRAMS = @MAKE_CHECK_Y2K@ run_ag = cd $(srcdir) && autogen -L ../include --writable std_def_list = $(top_srcdir)/include/debug-opt.def \ $(top_srcdir)/include/autogen-version.def \ @@ -331,14 +357,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../bincheck.mf $(am__con @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpd/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign ntpd/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ntpd/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -356,6 +382,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) @@ -365,48 +392,65 @@ libntpd.a: $(libntpd_a_OBJECTS) $(libntpd_a_DEPENDENCIES) $(RANLIB) libntpd.a install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list clean-checkPROGRAMS: - @list='$(check_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list check_y2k$(EXEEXT): $(check_y2k_OBJECTS) $(check_y2k_DEPENDENCIES) @rm -f check_y2k$(EXEEXT) - $(LINK) $(check_y2k_LDFLAGS) $(check_y2k_OBJECTS) $(check_y2k_LDADD) $(LIBS) + $(LINK) $(check_y2k_OBJECTS) $(check_y2k_LDADD) $(LIBS) ntpd$(EXEEXT): $(ntpd_OBJECTS) $(ntpd_DEPENDENCIES) @rm -f ntpd$(EXEEXT) - $(LINK) $(ntpd_LDFLAGS) $(ntpd_OBJECTS) $(ntpd_LDADD) $(LIBS) + $(LINK) $(ntpd_OBJECTS) $(ntpd_LDADD) $(LIBS) ntpdsim$(EXEEXT): $(ntpdsim_OBJECTS) $(ntpdsim_DEPENDENCIES) @rm -f ntpdsim$(EXEEXT) - $(LINK) $(ntpdsim_LDFLAGS) $(ntpdsim_OBJECTS) $(ntpdsim_LDADD) $(LIBS) + $(ntpdsim_LINK) $(ntpdsim_OBJECTS) $(ntpdsim_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -414,7 +458,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -486,120 +530,120 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refclock_zyfer$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< ntpdsim-cmd_args$U.o: cmd_args$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-cmd_args$U.o -MD -MP -MF "$(DEPDIR)/ntpdsim-cmd_args$U.Tpo" -c -o ntpdsim-cmd_args$U.o `test -f 'cmd_args$U.c' || echo '$(srcdir)/'`cmd_args$U.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-cmd_args$U.Tpo" "$(DEPDIR)/ntpdsim-cmd_args$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-cmd_args$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-cmd_args$U.o -MD -MP -MF $(DEPDIR)/ntpdsim-cmd_args$U.Tpo -c -o ntpdsim-cmd_args$U.o `test -f 'cmd_args$U.c' || echo '$(srcdir)/'`cmd_args$U.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-cmd_args$U.Tpo $(DEPDIR)/ntpdsim-cmd_args$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmd_args$U.c' object='ntpdsim-cmd_args$U.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-cmd_args$U.o `test -f 'cmd_args$U.c' || echo '$(srcdir)/'`cmd_args$U.c ntpdsim-cmd_args$U.obj: cmd_args$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-cmd_args$U.obj -MD -MP -MF "$(DEPDIR)/ntpdsim-cmd_args$U.Tpo" -c -o ntpdsim-cmd_args$U.obj `if test -f 'cmd_args$U.c'; then $(CYGPATH_W) 'cmd_args$U.c'; else $(CYGPATH_W) '$(srcdir)/cmd_args$U.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-cmd_args$U.Tpo" "$(DEPDIR)/ntpdsim-cmd_args$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-cmd_args$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-cmd_args$U.obj -MD -MP -MF $(DEPDIR)/ntpdsim-cmd_args$U.Tpo -c -o ntpdsim-cmd_args$U.obj `if test -f 'cmd_args$U.c'; then $(CYGPATH_W) 'cmd_args$U.c'; else $(CYGPATH_W) '$(srcdir)/cmd_args$U.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-cmd_args$U.Tpo $(DEPDIR)/ntpdsim-cmd_args$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmd_args$U.c' object='ntpdsim-cmd_args$U.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-cmd_args$U.obj `if test -f 'cmd_args$U.c'; then $(CYGPATH_W) 'cmd_args$U.c'; else $(CYGPATH_W) '$(srcdir)/cmd_args$U.c'; fi` ntpdsim-ntp_config$U.o: ntp_config$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_config$U.o -MD -MP -MF "$(DEPDIR)/ntpdsim-ntp_config$U.Tpo" -c -o ntpdsim-ntp_config$U.o `test -f 'ntp_config$U.c' || echo '$(srcdir)/'`ntp_config$U.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntp_config$U.Tpo" "$(DEPDIR)/ntpdsim-ntp_config$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntp_config$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_config$U.o -MD -MP -MF $(DEPDIR)/ntpdsim-ntp_config$U.Tpo -c -o ntpdsim-ntp_config$U.o `test -f 'ntp_config$U.c' || echo '$(srcdir)/'`ntp_config$U.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntp_config$U.Tpo $(DEPDIR)/ntpdsim-ntp_config$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntp_config$U.c' object='ntpdsim-ntp_config$U.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntp_config$U.o `test -f 'ntp_config$U.c' || echo '$(srcdir)/'`ntp_config$U.c ntpdsim-ntp_config$U.obj: ntp_config$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_config$U.obj -MD -MP -MF "$(DEPDIR)/ntpdsim-ntp_config$U.Tpo" -c -o ntpdsim-ntp_config$U.obj `if test -f 'ntp_config$U.c'; then $(CYGPATH_W) 'ntp_config$U.c'; else $(CYGPATH_W) '$(srcdir)/ntp_config$U.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntp_config$U.Tpo" "$(DEPDIR)/ntpdsim-ntp_config$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntp_config$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_config$U.obj -MD -MP -MF $(DEPDIR)/ntpdsim-ntp_config$U.Tpo -c -o ntpdsim-ntp_config$U.obj `if test -f 'ntp_config$U.c'; then $(CYGPATH_W) 'ntp_config$U.c'; else $(CYGPATH_W) '$(srcdir)/ntp_config$U.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntp_config$U.Tpo $(DEPDIR)/ntpdsim-ntp_config$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntp_config$U.c' object='ntpdsim-ntp_config$U.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntp_config$U.obj `if test -f 'ntp_config$U.c'; then $(CYGPATH_W) 'ntp_config$U.c'; else $(CYGPATH_W) '$(srcdir)/ntp_config$U.c'; fi` ntpdsim-ntp_io$U.o: ntp_io$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_io$U.o -MD -MP -MF "$(DEPDIR)/ntpdsim-ntp_io$U.Tpo" -c -o ntpdsim-ntp_io$U.o `test -f 'ntp_io$U.c' || echo '$(srcdir)/'`ntp_io$U.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntp_io$U.Tpo" "$(DEPDIR)/ntpdsim-ntp_io$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntp_io$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_io$U.o -MD -MP -MF $(DEPDIR)/ntpdsim-ntp_io$U.Tpo -c -o ntpdsim-ntp_io$U.o `test -f 'ntp_io$U.c' || echo '$(srcdir)/'`ntp_io$U.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntp_io$U.Tpo $(DEPDIR)/ntpdsim-ntp_io$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntp_io$U.c' object='ntpdsim-ntp_io$U.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntp_io$U.o `test -f 'ntp_io$U.c' || echo '$(srcdir)/'`ntp_io$U.c ntpdsim-ntp_io$U.obj: ntp_io$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_io$U.obj -MD -MP -MF "$(DEPDIR)/ntpdsim-ntp_io$U.Tpo" -c -o ntpdsim-ntp_io$U.obj `if test -f 'ntp_io$U.c'; then $(CYGPATH_W) 'ntp_io$U.c'; else $(CYGPATH_W) '$(srcdir)/ntp_io$U.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntp_io$U.Tpo" "$(DEPDIR)/ntpdsim-ntp_io$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntp_io$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntp_io$U.obj -MD -MP -MF $(DEPDIR)/ntpdsim-ntp_io$U.Tpo -c -o ntpdsim-ntp_io$U.obj `if test -f 'ntp_io$U.c'; then $(CYGPATH_W) 'ntp_io$U.c'; else $(CYGPATH_W) '$(srcdir)/ntp_io$U.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntp_io$U.Tpo $(DEPDIR)/ntpdsim-ntp_io$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntp_io$U.c' object='ntpdsim-ntp_io$U.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntp_io$U.obj `if test -f 'ntp_io$U.c'; then $(CYGPATH_W) 'ntp_io$U.c'; else $(CYGPATH_W) '$(srcdir)/ntp_io$U.c'; fi` ntpdsim-ntpd$U.o: ntpd$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd$U.o -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpd$U.Tpo" -c -o ntpdsim-ntpd$U.o `test -f 'ntpd$U.c' || echo '$(srcdir)/'`ntpd$U.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpd$U.Tpo" "$(DEPDIR)/ntpdsim-ntpd$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpd$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd$U.o -MD -MP -MF $(DEPDIR)/ntpdsim-ntpd$U.Tpo -c -o ntpdsim-ntpd$U.o `test -f 'ntpd$U.c' || echo '$(srcdir)/'`ntpd$U.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpd$U.Tpo $(DEPDIR)/ntpdsim-ntpd$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpd$U.c' object='ntpdsim-ntpd$U.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpd$U.o `test -f 'ntpd$U.c' || echo '$(srcdir)/'`ntpd$U.c ntpdsim-ntpd$U.obj: ntpd$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd$U.obj -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpd$U.Tpo" -c -o ntpdsim-ntpd$U.obj `if test -f 'ntpd$U.c'; then $(CYGPATH_W) 'ntpd$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpd$U.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpd$U.Tpo" "$(DEPDIR)/ntpdsim-ntpd$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpd$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd$U.obj -MD -MP -MF $(DEPDIR)/ntpdsim-ntpd$U.Tpo -c -o ntpdsim-ntpd$U.obj `if test -f 'ntpd$U.c'; then $(CYGPATH_W) 'ntpd$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpd$U.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpd$U.Tpo $(DEPDIR)/ntpdsim-ntpd$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpd$U.c' object='ntpdsim-ntpd$U.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpd$U.obj `if test -f 'ntpd$U.c'; then $(CYGPATH_W) 'ntpd$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpd$U.c'; fi` ntpdsim-ntpd-opts$U.o: ntpd-opts$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd-opts$U.o -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo" -c -o ntpdsim-ntpd-opts$U.o `test -f 'ntpd-opts$U.c' || echo '$(srcdir)/'`ntpd-opts$U.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo" "$(DEPDIR)/ntpdsim-ntpd-opts$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd-opts$U.o -MD -MP -MF $(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo -c -o ntpdsim-ntpd-opts$U.o `test -f 'ntpd-opts$U.c' || echo '$(srcdir)/'`ntpd-opts$U.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo $(DEPDIR)/ntpdsim-ntpd-opts$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpd-opts$U.c' object='ntpdsim-ntpd-opts$U.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpd-opts$U.o `test -f 'ntpd-opts$U.c' || echo '$(srcdir)/'`ntpd-opts$U.c ntpdsim-ntpd-opts$U.obj: ntpd-opts$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd-opts$U.obj -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo" -c -o ntpdsim-ntpd-opts$U.obj `if test -f 'ntpd-opts$U.c'; then $(CYGPATH_W) 'ntpd-opts$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpd-opts$U.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo" "$(DEPDIR)/ntpdsim-ntpd-opts$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpd-opts$U.obj -MD -MP -MF $(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo -c -o ntpdsim-ntpd-opts$U.obj `if test -f 'ntpd-opts$U.c'; then $(CYGPATH_W) 'ntpd-opts$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpd-opts$U.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpd-opts$U.Tpo $(DEPDIR)/ntpdsim-ntpd-opts$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpd-opts$U.c' object='ntpdsim-ntpd-opts$U.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpd-opts$U.obj `if test -f 'ntpd-opts$U.c'; then $(CYGPATH_W) 'ntpd-opts$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpd-opts$U.c'; fi` ntpdsim-ntpsim$U.o: ntpsim$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpsim$U.o -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpsim$U.Tpo" -c -o ntpdsim-ntpsim$U.o `test -f 'ntpsim$U.c' || echo '$(srcdir)/'`ntpsim$U.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpsim$U.Tpo" "$(DEPDIR)/ntpdsim-ntpsim$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpsim$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpsim$U.o -MD -MP -MF $(DEPDIR)/ntpdsim-ntpsim$U.Tpo -c -o ntpdsim-ntpsim$U.o `test -f 'ntpsim$U.c' || echo '$(srcdir)/'`ntpsim$U.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpsim$U.Tpo $(DEPDIR)/ntpdsim-ntpsim$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpsim$U.c' object='ntpdsim-ntpsim$U.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpsim$U.o `test -f 'ntpsim$U.c' || echo '$(srcdir)/'`ntpsim$U.c ntpdsim-ntpsim$U.obj: ntpsim$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpsim$U.obj -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpsim$U.Tpo" -c -o ntpdsim-ntpsim$U.obj `if test -f 'ntpsim$U.c'; then $(CYGPATH_W) 'ntpsim$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpsim$U.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpsim$U.Tpo" "$(DEPDIR)/ntpdsim-ntpsim$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpsim$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpsim$U.obj -MD -MP -MF $(DEPDIR)/ntpdsim-ntpsim$U.Tpo -c -o ntpdsim-ntpsim$U.obj `if test -f 'ntpsim$U.c'; then $(CYGPATH_W) 'ntpsim$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpsim$U.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpsim$U.Tpo $(DEPDIR)/ntpdsim-ntpsim$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpsim$U.c' object='ntpdsim-ntpsim$U.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpsim$U.obj `if test -f 'ntpsim$U.c'; then $(CYGPATH_W) 'ntpsim$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpsim$U.c'; fi` ntpdsim-ntpdsim-opts$U.o: ntpdsim-opts$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpdsim-opts$U.o -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo" -c -o ntpdsim-ntpdsim-opts$U.o `test -f 'ntpdsim-opts$U.c' || echo '$(srcdir)/'`ntpdsim-opts$U.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo" "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpdsim-opts$U.o -MD -MP -MF $(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo -c -o ntpdsim-ntpdsim-opts$U.o `test -f 'ntpdsim-opts$U.c' || echo '$(srcdir)/'`ntpdsim-opts$U.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo $(DEPDIR)/ntpdsim-ntpdsim-opts$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpdsim-opts$U.c' object='ntpdsim-ntpdsim-opts$U.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpdsim-opts$U.o `test -f 'ntpdsim-opts$U.c' || echo '$(srcdir)/'`ntpdsim-opts$U.c ntpdsim-ntpdsim-opts$U.obj: ntpdsim-opts$U.c -@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpdsim-opts$U.obj -MD -MP -MF "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo" -c -o ntpdsim-ntpdsim-opts$U.obj `if test -f 'ntpdsim-opts$U.c'; then $(CYGPATH_W) 'ntpdsim-opts$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpdsim-opts$U.c'; fi`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo" "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Po"; else rm -f "$(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -MT ntpdsim-ntpdsim-opts$U.obj -MD -MP -MF $(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo -c -o ntpdsim-ntpdsim-opts$U.obj `if test -f 'ntpdsim-opts$U.c'; then $(CYGPATH_W) 'ntpdsim-opts$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpdsim-opts$U.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/ntpdsim-ntpdsim-opts$U.Tpo $(DEPDIR)/ntpdsim-ntpdsim-opts$U.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ntpdsim-opts$U.c' object='ntpdsim-ntpdsim-opts$U.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ntpdsim_CFLAGS) $(CFLAGS) -c -o ntpdsim-ntpdsim-opts$U.obj `if test -f 'ntpdsim-opts$U.c'; then $(CYGPATH_W) 'ntpdsim-opts$U.c'; else $(CYGPATH_W) '$(srcdir)/ntpdsim-opts$U.c'; fi` @@ -772,129 +816,137 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-man1: $(man1_MANS) $(man_MANS) +install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + uninstall-man1: @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -906,7 +958,7 @@ check: $(BUILT_SOURCES) all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am @@ -929,6 +981,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -944,7 +997,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -952,20 +1005,39 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: install-man +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: install-info: install-info-am +install-info-am: + install-man: install-man1 +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -986,24 +1058,29 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man +uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 +.MAKE: ../util/ansi2knr all check check-am install install-am \ + install-exec-am install-strip + .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libtool clean-noinstLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ - install-data-am install-exec install-exec-am install-exec-hook \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-hook install-html install-html-am \ install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-kr \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-info-am \ - uninstall-man uninstall-man1 + uninstall-am uninstall-binPROGRAMS uninstall-man \ + uninstall-man1 check-local: @MAKE_CHECK_Y2K@ @@ -1058,6 +1135,7 @@ install-exec-hook: done # + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/ntpd/cmd_args.c b/contrib/ntp/ntpd/cmd_args.c index 760bcede5849..7843bc317162 100644 --- a/contrib/ntp/ntpd/cmd_args.c +++ b/contrib/ntp/ntpd/cmd_args.c @@ -87,6 +87,16 @@ getCmdOpts( droproot = 1; chrootdir = OPT_ARG( JAILDIR ); #else + fprintf(stderr, + "command line -i option (jaildir) is not supported by this binary" +# ifndef SYS_WINNT + ",\n" "can not drop root privileges. See configure options\n" + "--enable-clockctl and --enable-linuxcaps.\n"); +# else + ".\n"); +# endif + msyslog(LOG_ERR, + "command line -i option (jaildir) is not supported by this binary."); errflg++; #endif } @@ -118,8 +128,8 @@ getCmdOpts( stats_config(STATS_STATSDIR, OPT_ARG( STATSDIR )); if (HAVE_OPT( TRUSTEDKEY )) { - int ct = STACKCT_OPT( TRUSTEDKEY ); - const char** pp = STACKLST_OPT( TRUSTEDKEY ); + int ct = STACKCT_OPT( TRUSTEDKEY ); + const char** pp = STACKLST_OPT( TRUSTEDKEY ); do { u_long tkey; @@ -141,23 +151,29 @@ getCmdOpts( char *ntp_optarg = OPT_ARG( USER ); droproot = 1; - user = malloc(strlen(ntp_optarg) + 1); - if (user == NULL) { - errflg++; - } else { - (void)strncpy(user, ntp_optarg, strlen(ntp_optarg) + 1); - group = rindex(user, ':'); - if (group) - *group++ = '\0'; /* get rid of the ':' */ - } + user = emalloc(strlen(ntp_optarg) + 1); + (void)strncpy(user, ntp_optarg, strlen(ntp_optarg) + 1); + group = rindex(user, ':'); + if (group) + *group++ = '\0'; /* get rid of the ':' */ #else + fprintf(stderr, + "command line -u/--user option is not supported by this binary" +# ifndef SYS_WINNT + ",\n" "can not drop root privileges. See configure options\n" + "--enable-clockctl and --enable-linuxcaps.\n"); +# else + ".\n"); +# endif + msyslog(LOG_ERR, + "command line -u/--user option is not supported by this binary."); errflg++; #endif } if (HAVE_OPT( VAR )) { - int ct = STACKCT_OPT( VAR ); - const char** pp = STACKLST_OPT( VAR ); + int ct = STACKCT_OPT( VAR ); + const char** pp = STACKLST_OPT( VAR ); do { const char* my_ntp_optarg = *pp++; @@ -168,8 +184,8 @@ getCmdOpts( } if (HAVE_OPT( DVAR )) { - int ct = STACKCT_OPT( DVAR ); - const char** pp = STACKLST_OPT( DVAR ); + int ct = STACKCT_OPT( DVAR ); + const char** pp = STACKLST_OPT( DVAR ); do { const char* my_ntp_optarg = *pp++; @@ -188,9 +204,12 @@ getCmdOpts( if (val >= 0) interface_interval = val; else { - msyslog(LOG_ERR, - "command line interface update interval %ld must be greater or equal to 0", - val); + fprintf(stderr, + "command line interface update interval %ld must not be negative\n", + val); + msyslog(LOG_ERR, + "command line interface update interval %ld must not be negative", + val); errflg++; } } @@ -225,7 +244,8 @@ getCmdOpts( #endif /* SIM */ if (errflg || argc) { - printf("argc is <%d>\n", argc); + if (argc) + fprintf(stderr, "argc after processing is <%d>\n", argc); optionUsage(myOptions, 2); } return; diff --git a/contrib/ntp/ntpd/ntp_crypto.c b/contrib/ntp/ntpd/ntp_crypto.c index b3b9b6059f75..cce95a8e1ea3 100644 --- a/contrib/ntp/ntpd/ntp_crypto.c +++ b/contrib/ntp/ntpd/ntp_crypto.c @@ -3618,7 +3618,7 @@ crypto_key( if (debug) printf("crypto_key: %s\n", statstr); if (debug > 1) { - if (EVP_MD_type(pkey) == EVP_PKEY_DSA) + if (pkey->type == EVP_PKEY_DSA) DSA_print_fp(stdout, pkey->pkey.dsa, 0); else RSA_print_fp(stdout, pkey->pkey.rsa, 0); @@ -3946,7 +3946,7 @@ crypto_setup(void) sign_pkey = pkey; sstamp = fstamp; hostval.fstamp = htonl(fstamp); - if (EVP_MD_type(host_pkey) != EVP_PKEY_RSA) { + if (host_pkey->type != EVP_PKEY_RSA) { msyslog(LOG_ERR, "crypto_setup: host key is not RSA key type"); exit (-1); diff --git a/contrib/ntp/ntpd/ntp_intres.c b/contrib/ntp/ntpd/ntp_intres.c index 2a4b51fef7c9..5facc85693c4 100644 --- a/contrib/ntp/ntpd/ntp_intres.c +++ b/contrib/ntp/ntpd/ntp_intres.c @@ -15,11 +15,6 @@ * might go about autoconfiguring an NTP distribution network. * */ - /* - * For special situations define the FORCE_DNSRETRY Macro - * to force retries even if it fails the lookup. - * Use with extreme caution since it will then retry forever. - */ #ifdef HAVE_CONFIG_H # include @@ -463,8 +458,10 @@ findhostaddr( struct conf_entry *entry ) { + static int eai_again_seen = 0; struct addrinfo *addr; struct addrinfo hints; + int again; int error; checkparent(); /* make sure our guy is still running */ @@ -475,17 +472,14 @@ findhostaddr( return 1; } - if (entry->ce_name == NULL && SOCKNUL(&entry->peer_store)) { + if (entry->ce_name == NULL && SOCKNUL(&entry->peer_store)) { msyslog(LOG_ERR, "findhostaddr: both ce_name and ce_peeraddr are undefined!"); return 0; } if (entry->ce_name) { -#ifdef DEBUG - if (debug > 2) - msyslog(LOG_INFO, "findhostaddr: Resolving <%s>", - entry->ce_name); -#endif /* DEBUG */ + DPRINTF(2, ("findhostaddr: Resolving <%s>\n", + entry->ce_name)); memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; @@ -508,68 +502,72 @@ findhostaddr( entry->ce_config.v6_flag = 1; } } - else if (error == EAI_NONAME) - { - msyslog(LOG_ERR, "host name not found: %s", entry->ce_name); - } } else { -#ifdef DEBUG - if (debug > 2) - msyslog(LOG_INFO, "findhostaddr: Resolving %s>", - stoa(&entry->peer_store)); -#endif + DPRINTF(2, ("findhostaddr: Resolving <%s>\n", + stoa(&entry->peer_store))); + entry->ce_name = emalloc(MAXHOSTNAMELEN); error = getnameinfo((const struct sockaddr *)&entry->peer_store, SOCKLEN(&entry->peer_store), (char *)&entry->ce_name, MAXHOSTNAMELEN, NULL, 0, 0); } -#ifdef DEBUG - if (debug > 2) - printf("intres: got error status of: %d\n", error); -#endif - /* - * If the resolver failed, see if the failure is - * temporary. If so, return success. - */ - if (error != 0) { - switch (error) - { + if (0 == error) { + + /* again is our return value, for success it is 1 */ + again = 1; + + DPRINTF(2, ("findhostaddr: %s resolved.\n", + (entry->ce_name) ? "name" : "address")); + } else { + /* + * If the resolver failed, see if the failure is + * temporary. If so, return success. + */ + again = 0; + + switch (error) { + + case EAI_FAIL: + again = 1; + break; + case EAI_AGAIN: - return (1); + again = 1; + eai_again_seen = 1; + break; + case EAI_NONAME: -#ifndef FORCE_DNSRETRY - return (0); -#else - return (1); -#endif #if defined(EAI_NODATA) && (EAI_NODATA != EAI_NONAME) case EAI_NODATA: #endif - case EAI_FAIL: + msyslog(LOG_ERR, "host name not found%s%s: %s", + (EAI_NONAME == error) ? "" : " EAI_NODATA", + (eai_again_seen) ? " (permanent)" : "", + entry->ce_name); + again = !eai_again_seen; + break; + #ifdef EAI_SYSTEM case EAI_SYSTEM: - return (1); + /* + * EAI_SYSTEM means the real error is in errno. We should be more + * discriminating about which errno values require retrying, but + * this matches existing behavior. + */ + again = 1; + DPRINTF(1, ("intres: EAI_SYSTEM errno %d (%s) means try again, right?\n", + errno, strerror(errno))); + break; #endif - default: - return (0); } + + /* do this here to avoid perturbing errno earlier */ + DPRINTF(2, ("intres: got error status of: %d\n", error)); } - if (entry->ce_name) { -#ifdef DEBUG - if (debug > 2) - msyslog(LOG_INFO, "findhostaddr: name resolved."); -#endif - -#ifdef DEBUG - if (debug > 2) - msyslog(LOG_INFO, "findhostaddr: address resolved."); -#endif - } - - return (1); + return again; } @@ -579,12 +577,14 @@ findhostaddr( static void openntp(void) { - struct addrinfo hints; - struct addrinfo *addrResult; - const char *localhost = "127.0.0.1"; /* Use IPv6 loopback */ + const char *localhost = "127.0.0.1"; /* Use IPv4 loopback */ + struct addrinfo hints; + struct addrinfo *addr; + u_long on; + int err; if (sockfd != INVALID_SOCKET) - return; + return; memset(&hints, 0, sizeof(hints)); @@ -592,52 +592,81 @@ openntp(void) * For now only bother with IPv4 */ hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_DGRAM; - if (getaddrinfo(localhost, "ntp", &hints, &addrResult)!=0) { - msyslog(LOG_ERR, "getaddrinfo failed: %m"); + + err = getaddrinfo(localhost, "ntp", &hints, &addr); + + if (err) { +#ifdef EAI_SYSTEM + if (EAI_SYSTEM == err) + msyslog(LOG_ERR, "getaddrinfo(%s) failed: %m", + localhost); + else +#endif + msyslog(LOG_ERR, "getaddrinfo(%s) failed: %s", + localhost, gai_strerror(err)); resolver_exit(1); } - sockfd = socket(addrResult->ai_family, addrResult->ai_socktype, 0); - if (sockfd == -1) { + sockfd = socket(addr->ai_family, addr->ai_socktype, 0); + + if (INVALID_SOCKET == sockfd) { msyslog(LOG_ERR, "socket() failed: %m"); resolver_exit(1); } +#ifndef SYS_WINNT + /* + * On Windows only the count of sockets must be less than + * FD_SETSIZE. On Unix each descriptor's value must be less + * than FD_SETSIZE, as fd_set is a bit array. + */ + if (sockfd >= FD_SETSIZE) { + msyslog(LOG_ERR, "socket fd %d too large, FD_SETSIZE %d", + (int)sockfd, FD_SETSIZE); + resolver_exit(1); + } + /* * Make the socket non-blocking. We'll wait with select() + * Unix: fcntl(O_NONBLOCK) or fcntl(FNDELAY) */ -#ifndef SYS_WINNT -#if defined(O_NONBLOCK) +# ifdef O_NONBLOCK if (fcntl(sockfd, F_SETFL, O_NONBLOCK) == -1) { msyslog(LOG_ERR, "fcntl(O_NONBLOCK) failed: %m"); resolver_exit(1); } -#else -#if defined(FNDELAY) +# else +# ifdef FNDELAY if (fcntl(sockfd, F_SETFL, FNDELAY) == -1) { msyslog(LOG_ERR, "fcntl(FNDELAY) failed: %m"); resolver_exit(1); } -#else -# include "Bletch: NEED NON BLOCKING IO" -#endif /* FNDDELAY */ -#endif /* O_NONBLOCK */ -#else /* SYS_WINNT */ - { - int on = 1; - if (ioctlsocket(sockfd,FIONBIO,(u_long *) &on) == SOCKET_ERROR) { - msyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m"); - resolver_exit(1); /* Windows NT - set socket in non-blocking mode */ - } +# else +# include "Bletch: NEED NON BLOCKING IO" +# endif /* FNDDELAY */ +# endif /* O_NONBLOCK */ + (void)on; /* quiet unused warning */ +#else /* !SYS_WINNT above */ + /* + * Make the socket non-blocking. We'll wait with select() + * Windows: ioctlsocket(FIONBIO) + */ + on = 1; + err = ioctlsocket(sockfd, FIONBIO, &on); + if (SOCKET_ERROR == err) { + msyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m"); + resolver_exit(1); } #endif /* SYS_WINNT */ - if (connect(sockfd, addrResult->ai_addr, addrResult->ai_addrlen) == -1) { + + err = connect(sockfd, addr->ai_addr, addr->ai_addrlen); + if (SOCKET_ERROR == err) { msyslog(LOG_ERR, "openntp: connect() failed: %m"); resolver_exit(1); } - freeaddrinfo(addrResult); + + freeaddrinfo(addr); } @@ -664,7 +693,7 @@ request( checkparent(); /* make sure our guy is still running */ if (sockfd == INVALID_SOCKET) - openntp(); + openntp(); #ifdef SYS_WINNT hReadWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL); @@ -1110,6 +1139,7 @@ doconfigure( #endif if (dores && SOCKNUL(&(ce->peer_store))) { if (!findhostaddr(ce)) { +#ifndef IGNORE_DNS_ERRORS msyslog(LOG_ERR, "couldn't resolve `%s', giving up on it", ce->ce_name); @@ -1117,6 +1147,7 @@ doconfigure( ce = ceremove->ce_next; removeentry(ceremove); continue; +#endif } } diff --git a/contrib/ntp/ntpd/ntp_io.c b/contrib/ntp/ntpd/ntp_io.c index faa46461f484..71ee15fef6f6 100644 --- a/contrib/ntp/ntpd/ntp_io.c +++ b/contrib/ntp/ntpd/ntp_io.c @@ -65,6 +65,12 @@ #endif /* IPV6 Multicast Support */ #endif /* IPv6 Support */ +#ifdef INCLUDE_IPV6_SUPPORT +#include +#include +#include +#endif /* !INCLUDE_IPV6_SUPPORT */ + extern int listen_to_virtual_ips; extern const char *specific_interface; @@ -94,7 +100,12 @@ extern const char *specific_interface; #define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12) #endif -#endif +/* + * Windows C runtime ioctl() can't deal properly with sockets, + * map to ioctlsocket for this source file. + */ +#define ioctl(fd, opt, val) ioctlsocket((fd), (opt), (u_long *)(val)) +#endif /* SYS_WINNT */ /* * We do asynchronous input using the SIGIO facility. A number of @@ -194,7 +205,7 @@ static isc_boolean_t socket_multicast_disable P((struct interface *, struct sock static void print_interface P((struct interface *, char *, char *)); #define DPRINT_INTERFACE(_LVL_, _ARGS_) do { if (debug >= (_LVL_)) { print_interface _ARGS_; } } while (0) #else -#define DPRINT_INTERFACE(_LVL_, _ARGS_) +#define DPRINT_INTERFACE(_LVL_, _ARGS_) do {} while (0) #endif typedef struct vsock vsock_t; @@ -289,23 +300,29 @@ static inline int read_refclock_packet P((SOCKET, struct refclockio *, l_fp) * systems are not affected by this and work correctly. * See Microsoft Knowledge Base Article Q263823 for details of this. */ -isc_result_t -connection_reset_fix(SOCKET fd) { +void +connection_reset_fix( + SOCKET fd, + struct sockaddr_storage *addr + ) +{ DWORD dwBytesReturned = 0; BOOL bNewBehavior = FALSE; DWORD status; - if(isc_win32os_majorversion() < 5) - return (ISC_R_SUCCESS); /* NT 4.0 has no problem */ - - /* disable bad behavior using IOCTL: SIO_UDP_CONNRESET */ - status = WSAIoctl(fd, SIO_UDP_CONNRESET, &bNewBehavior, - sizeof(bNewBehavior), NULL, 0, - &dwBytesReturned, NULL, NULL); - if (status != SOCKET_ERROR) - return (ISC_R_SUCCESS); - else - return (ISC_R_UNEXPECTED); + /* + * disable bad behavior using IOCTL: SIO_UDP_CONNRESET + * NT 4.0 has no problem + */ + if (isc_win32os_majorversion() >= 5) { + status = WSAIoctl(fd, SIO_UDP_CONNRESET, &bNewBehavior, + sizeof(bNewBehavior), NULL, 0, + &dwBytesReturned, NULL, NULL); + if (SOCKET_ERROR == status) + netsyslog(LOG_ERR, "connection_reset_fix() " + "failed for address %s: %m", + stoa(addr)); + } } #endif @@ -477,6 +494,8 @@ void init_io(void) { #ifdef SYS_WINNT + init_io_completion_port(); + if (!Win32InitSockets()) { netsyslog(LOG_ERR, "No useable winsock.dll: %m"); @@ -748,6 +767,24 @@ delete_interface(struct interface *interface) static void add_interface(struct interface *interface) { + static struct interface *listhead = NULL; + + /* + * For ntpd, the first few interfaces (wildcard, localhost) + * will never be removed. This means inter_list.head is + * unchanging once initialized. Take advantage of that to + * watch for changes and catch corruption earlier. This + * helped track down corruption caused by using FD_SET with + * a descriptor numerically larger than FD_SETSIZE. + */ + if (NULL == listhead) + listhead = inter_list.head; + + if (listhead != inter_list.head) { + msyslog(LOG_ERR, "add_interface inter_list.head corrupted: was %p now %p", + listhead, inter_list.head); + exit(1); + } /* * Calculate the address hash */ @@ -1137,6 +1174,36 @@ set_wildcard_reuse(int family, int on) } #endif /* OS_NEEDS_REUSEADDR_FOR_IFADDRBIND */ +#ifdef INCLUDE_IPV6_SUPPORT +static isc_boolean_t +is_anycast(struct sockaddr *sa, char *name) +{ +#if defined(SIOCGIFAFLAG_IN6) && defined(IN6_IFF_ANYCAST) + struct in6_ifreq ifr6; + int fd; + u_int32_t flags6; + + if (sa->sa_family != AF_INET6) + return ISC_FALSE; + if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) + return ISC_FALSE; + memset(&ifr6, 0, sizeof(ifr6)); + memcpy(&ifr6.ifr_addr, (struct sockaddr_in6 *)sa, + sizeof(struct sockaddr_in6)); + strlcpy(ifr6.ifr_name, name, IF_NAMESIZE); + if (ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) < 0) { + close(fd); + return ISC_FALSE; + } + close(fd); + flags6 = ifr6.ifr_ifru.ifru_flags6; + if ((flags6 & IN6_IFF_ANYCAST) != 0) + return ISC_TRUE; +#endif /* !SIOCGIFAFLAG_IN6 || !IN6_IFF_ANYCAST */ + return ISC_FALSE; +} +#endif /* !INCLUDE_IPV6_SUPPORT */ + /* * update_interface strategy * @@ -1184,7 +1251,7 @@ update_interfaces( scan_ipv6 = ISC_TRUE; #if defined(DEBUG) else - if(debug) + if (debug) netsyslog(LOG_ERR, "no IPv6 interfaces found"); #endif #endif @@ -1192,7 +1259,7 @@ update_interfaces( scan_ipv6 = ISC_TRUE; #if defined(ISC_PLATFORM_HAVEIPV6) && defined(DEBUG) else - if(debug) + if (debug) netsyslog(LOG_ERR, "no IPv6 interfaces found"); #endif @@ -1276,6 +1343,11 @@ update_interfaces( if (is_wildcard_addr(&interface.sin)) continue; +#ifdef INCLUDE_IPV6_SUPPORT + if (is_anycast((struct sockaddr *)&interface.sin, isc_if.name)) + continue; +#endif /* !INCLUDE_IPV6_SUPPORT */ + /* * map to local *address* in order * to map all duplicate interfaces to an interface structure @@ -1501,6 +1573,24 @@ create_interface( return interface; } + +#ifdef SO_EXCLUSIVEADDRUSE +static void +set_excladdruse(int fd) +{ + int one = 1; + int failed; + + failed = setsockopt(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, + (char *)&one, sizeof(one)); + + if (failed) + netsyslog(LOG_ERR, + "setsockopt(%d, SO_EXCLUSIVEADDRUSE, on): %m", fd); +} +#endif /* SO_EXCLUSIVEADDRUSE */ + + /* * set_reuseaddr() - set/clear REUSEADDR on all sockets * NB possible hole - should we be doing this on broadcast @@ -1508,13 +1598,16 @@ create_interface( */ static void set_reuseaddr(int flag) { - struct interface *interf; + struct interface *interf; + +#ifndef SO_EXCLUSIVEADDRUSE for (interf = ISC_LIST_HEAD(inter_list); interf != NULL; interf = ISC_LIST_NEXT(interf, link)) { - if (interf->flags & INT_WILDCARD) - continue; + + if (interf->flags & INT_WILDCARD) + continue; /* * if interf->fd is INVALID_SOCKET, we might have a adapter @@ -1530,6 +1623,7 @@ set_reuseaddr(int flag) { } } } +#endif /* ! SO_EXCLUSIVEADDRUSE */ } /* @@ -1691,7 +1785,7 @@ enable_multicast_if(struct interface *iface, struct sockaddr_storage *maddr) case AF_INET6: #ifdef INCLUDE_IPV6_MULTICAST_SUPPORT if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, - &iface->scopeid, sizeof(iface->scopeid)) == -1) { + (char *) &iface->scopeid, sizeof(iface->scopeid)) == -1) { netsyslog(LOG_ERR, "setsockopt IPV6_MULTICAST_IF failure: %m on socket %d, addr %s, scope %d for multicast address %s", iface->fd, stoa(&iface->sin), iface->scopeid, @@ -1703,7 +1797,7 @@ enable_multicast_if(struct interface *iface, struct sockaddr_storage *maddr) * Don't send back to itself, but allow it to fail to set it */ if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, - &off, sizeof(off)) == -1) { + (char *) &off, sizeof(off)) == -1) { netsyslog(LOG_ERR, "setsockopt IP_MULTICAST_LOOP failure: %m on socket %d, addr %s for multicast address %s", iface->fd, stoa(&iface->sin), stoa(maddr)); @@ -1981,7 +2075,10 @@ io_multicast_add( ) { #ifdef MCAST - struct interface *interface, *iface; + struct interface *interface; +#ifndef MULTICAST_NONEWSOCKET + struct interface *iface; +#endif int lscope = 0; /* @@ -2058,7 +2155,7 @@ io_multicast_add( } else { - delete_interface(interface); /* re-use existing interface */ + delete_interface(interface); /* re-use existing interface */ interface = NULL; if (addr.ss_family == AF_INET) interface = wildipv4; @@ -2227,12 +2324,7 @@ static void init_nonblocking_io(SOCKET fd) #elif defined(FIONBIO) { int on = 1; -# if defined(SYS_WINNT) - - if (ioctlsocket(fd,FIONBIO,(u_long *) &on) == SOCKET_ERROR) -# else if (ioctl(fd,FIONBIO,&on) < 0) -# endif { netsyslog(LOG_ERR, "ioctl(FIONBIO) fails on fd #%d: %m", fd); @@ -2267,8 +2359,13 @@ open_socket( { int errval; SOCKET fd; - int on = 1, off = 0; /* int is OK for REUSEADR per */ - /* http://www.kohala.com/start/mcast.api.txt */ + /* + * int is OK for REUSEADR per + * http://www.kohala.com/start/mcast.api.txt + */ + int on = 1; + int off = 0; + #if defined(IPTOS_LOWDELAY) && defined(IPPROTO_IP) && defined(IP_TOS) int tos; #endif /* IPTOS_LOWDELAY && IPPROTO_IP && IP_TOS */ @@ -2277,38 +2374,30 @@ open_socket( return (INVALID_SOCKET); /* create a datagram (UDP) socket */ + fd = socket(addr->ss_family, SOCK_DGRAM, 0); + if (INVALID_SOCKET == fd) { #ifndef SYS_WINNT - if ( (fd = socket(addr->ss_family, SOCK_DGRAM, 0)) < 0) { errval = errno; #else - if ( (fd = socket(addr->ss_family, SOCK_DGRAM, 0)) == INVALID_SOCKET) { errval = WSAGetLastError(); #endif - if(addr->ss_family == AF_INET) - netsyslog(LOG_ERR, "socket(AF_INET, SOCK_DGRAM, 0) failed on address %s: %m", - stoa(addr)); - else if(addr->ss_family == AF_INET6) - netsyslog(LOG_ERR, "socket(AF_INET6, SOCK_DGRAM, 0) failed on address %s: %m", - stoa(addr)); -#ifndef SYS_WINNT - if (errval == EPROTONOSUPPORT || errval == EAFNOSUPPORT || + netsyslog(LOG_ERR, + "socket(AF_INET%s, SOCK_DGRAM, 0) failed on address %s: %m", + (addr->ss_family == AF_INET6) ? "6" : "", + stoa(addr)); + + if (errval == EPROTONOSUPPORT || + errval == EAFNOSUPPORT || errval == EPFNOSUPPORT) -#else - if (errval == WSAEPROTONOSUPPORT || errval == WSAEAFNOSUPPORT || - errval == WSAEPFNOSUPPORT) -#endif return (INVALID_SOCKET); msyslog(LOG_ERR, "unexpected error code %d (not PROTONOSUPPORT|AFNOSUPPORT|FPNOSUPPORT) - exiting", errval); exit(1); /*NOTREACHED*/ } -#ifdef SYS_WINNT - if (connection_reset_fix(fd) != ISC_R_SUCCESS) { - netsyslog(LOG_ERR, "connection_reset_fix(fd) failed on address %s: %m", - stoa(addr)); - } -#endif /* SYS_WINNT */ +#ifdef SYS_WINNT + connection_reset_fix(fd, addr); +#endif /* * Fixup the file descriptor for some systems * See bug #530 for details of the issue. @@ -2317,18 +2406,36 @@ open_socket( /* * set SO_REUSEADDR since we will be binding the same port - * number on each interface according to flag + * number on each interface according to turn_off_reuse. + * This is undesirable on Windows versions starting with + * Windows XP (numeric version 5.1). */ - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, - turn_off_reuse ? (char *)&off : (char *)&on, sizeof(on))) - { - netsyslog(LOG_ERR, "setsockopt SO_REUSEADDR %s on fails on address %s: %m", - turn_off_reuse ? "off" : "on", stoa(addr)); +#ifdef SYS_WINNT + if (isc_win32os_versioncheck(5, 1, 0, 0) < 0) /* before 5.1 */ +#endif + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, + (char *)(turn_off_reuse + ? &off + : &on), + sizeof(on))) { - closesocket(fd); - - return INVALID_SOCKET; - } + netsyslog(LOG_ERR, "setsockopt SO_REUSEADDR %s" + " fails for address %s: %m", + turn_off_reuse + ? "off" + : "on", + stoa(addr)); + closesocket(fd); + return INVALID_SOCKET; + } +#ifdef SO_EXCLUSIVEADDRUSE + /* + * setting SO_EXCLUSIVEADDRUSE on the wildcard we open + * first will cause more specific binds to fail. + */ + if (!(interf->flags & INT_WILDCARD)) + set_excladdruse(fd); +#endif /* * IPv4 specific options go here @@ -2406,22 +2513,24 @@ open_socket( ) { if (addr->ss_family == AF_INET) netsyslog(LOG_ERR, - "bind() fd %d, family %d, port %d, addr %s, in_classd=%d flags=0x%x fails: %m", - fd, addr->ss_family, (int)ntohs(((struct sockaddr_in*)addr)->sin_port), + "bind() fd %d, family AF_INET, port %d, addr %s, in_classd=%d flags=0x%x fails: %m", + fd, (int)ntohs(((struct sockaddr_in*)addr)->sin_port), stoa(addr), - IN_CLASSD(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr)), flags); + IN_CLASSD(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr)), + flags); #ifdef INCLUDE_IPV6_SUPPORT else if (addr->ss_family == AF_INET6) - netsyslog(LOG_ERR, - "bind() fd %d, family %d, port %d, scope %d, addr %s, in6_is_addr_multicast=%d flags=0x%x fails: %m", - fd, addr->ss_family, (int)ntohs(((struct sockaddr_in6*)addr)->sin6_port), + netsyslog(LOG_ERR, + "bind() fd %d, family AF_INET6, port %d, scope %d, addr %s, mcast=%d flags=0x%x fails: %m", + fd, (int)ntohs(((struct sockaddr_in6*)addr)->sin6_port), # ifdef ISC_PLATFORM_HAVESCOPEID ((struct sockaddr_in6*)addr)->sin6_scope_id # else -1 # endif , stoa(addr), - IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)addr)->sin6_addr), flags); + IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)addr)->sin6_addr), + flags); #endif } @@ -2452,7 +2561,7 @@ open_socket( addr->ss_family, (int)ntohs(((struct sockaddr_in*)addr)->sin_port), stoa(addr), - flags)); + interf->flags)); init_nonblocking_io(fd); @@ -2496,9 +2605,6 @@ sendpkt( ) { int cc, slot; -#ifdef SYS_WINNT - DWORD err; -#endif /* SYS_WINNT */ /* * Send error caches. Empty slots have port == 0 @@ -2618,8 +2724,8 @@ sendpkt( #endif /* INCLUDE_IPV6_SUPPORT */ #if defined(HAVE_IO_COMPLETION_PORT) - err = io_completion_port_sendto(inter, pkt, len, dest); - if (err != ERROR_SUCCESS) + cc = io_completion_port_sendto(inter, pkt, len, dest); + if (cc != ERROR_SUCCESS) #else #ifdef SIM cc = srvr_rply(&ntp_node, dest, inter, pkt); @@ -2632,9 +2738,9 @@ sendpkt( { inter->notsent++; packets_notsent++; + #if defined(HAVE_IO_COMPLETION_PORT) - err = WSAGetLastError(); - if (err != WSAEWOULDBLOCK && err != WSAENOBUFS && slot < 0) + if (cc != WSAEWOULDBLOCK && cc != WSAENOBUFS && slot < 0) #else if (errno != EWOULDBLOCK && errno != ENOBUFS && slot < 0) #endif @@ -2659,13 +2765,13 @@ sendpkt( case AF_INET6 : for (slot = ERRORCACHESIZE; --slot >= 0; ) - if (badaddrs6[slot].port == 0) - { - badaddrs6[slot].port = SRCPORT(dest); - badaddrs6[slot].addr = ((struct sockaddr_in6*)dest)->sin6_addr; - break; - } - break; + if (badaddrs6[slot].port == 0) + { + badaddrs6[slot].port = SRCPORT(dest); + badaddrs6[slot].addr = ((struct sockaddr_in6*)dest)->sin6_addr; + break; + } + break; #endif /* INCLUDE_IPV6_SUPPORT */ default: /* don't care if not supported */ break; @@ -3207,7 +3313,7 @@ findlocalinterface( struct interface *iface; DPRINTF(4, ("Finding interface for addr %s in list of addresses\n", - stoa(addr));) + stoa(addr))); memset(&saddr, 0, sizeof(saddr)); saddr.ss_family = addr->ss_family; @@ -3624,6 +3730,11 @@ add_fd_to_list(SOCKET fd, enum desc_type type) { * I/O Completion Ports don't care about the select and FD_SET */ #ifndef HAVE_IO_COMPLETION_PORT + if (fd < 0 || fd >= FD_SETSIZE) { + msyslog(LOG_ERR, "Too many sockets in use, FD_SETSIZE %d exceeded", + FD_SETSIZE); + exit(1); + } /* * keep activefds in sync */ diff --git a/contrib/ntp/ntpd/ntp_request.c b/contrib/ntp/ntpd/ntp_request.c index b1bc99d6f3f8..f5eed4449d9a 100644 --- a/contrib/ntp/ntpd/ntp_request.c +++ b/contrib/ntp/ntpd/ntp_request.c @@ -409,6 +409,7 @@ process_private( int mod_okay ) { + static u_long quiet_until; struct req_pkt *inpkt; struct req_pkt_tail *tailinpkt; struct sockaddr_storage *srcadr; @@ -444,8 +445,14 @@ process_private( || (++ec, INFO_MBZ(inpkt->mbz_itemsize) != 0) || (++ec, rbufp->recv_length < REQ_LEN_HDR) ) { - msyslog(LOG_ERR, "process_private: INFO_ERR_FMT: test %d failed, pkt from %s", ec, stoa(srcadr)); - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); + NLOG(NLOG_SYSEVENT) + if (current_time >= quiet_until) { + msyslog(LOG_ERR, + "process_private: drop test %d" + " failed, pkt from %s", + ec, stoa(srcadr)); + quiet_until = current_time + 60; + } return; } @@ -496,10 +503,10 @@ process_private( */ temp_size = INFO_ITEMSIZE(inpkt->mbz_itemsize); if ((temp_size != proc->sizeofitem && - temp_size != proc->v6_sizeofitem) && + temp_size != proc->v6_sizeofitem) && !(inpkt->implementation == IMPL_XNTPD && - inpkt->request == REQ_CONFIG && - temp_size == sizeof(struct old_conf_peer))) { + inpkt->request == REQ_CONFIG && + temp_size == sizeof(struct old_conf_peer))) { #ifdef DEBUG if (debug > 2) printf("process_private: wrong item size, received %d, should be %d or %d\n", @@ -1319,6 +1326,7 @@ do_conf( struct req_pkt *inpkt ) { + static u_long soonest_ifrescan_time = 0; int items; u_int fl; struct conf_peer *cp; @@ -1412,6 +1420,23 @@ do_conf( req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); return; } + + /* + * ntp_intres.c uses REQ_CONFIG/doconf() to add each + * server after its name is resolved. If we have been + * disconnected from the network, it may notice the + * network has returned and add the first server while + * the relevant interface is still disabled, awaiting + * the next interface rescan. To get things moving + * more quickly, trigger an interface scan now, except + * if we have done so in the last half minute. + */ + if (soonest_ifrescan_time < current_time) { + soonest_ifrescan_time = current_time + 30; + timer_interfacetimeout(current_time); + DPRINTF(1, ("do_conf triggering interface rescan\n")); + } + cp = (struct conf_peer *) ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); } diff --git a/contrib/ntp/ntpd/ntp_timer.c b/contrib/ntp/ntpd/ntp_timer.c index fb6de702ac89..812206ad2627 100644 --- a/contrib/ntp/ntpd/ntp_timer.c +++ b/contrib/ntp/ntpd/ntp_timer.c @@ -343,12 +343,10 @@ timer(void) * interface update timer */ if (interface_interval && interface_timer <= current_time) { + timer_interfacetimeout(current_time + interface_interval); -#ifdef DEBUG - if (debug) - printf("timer: interface update\n"); -#endif - interface_update(NULL, NULL); + DPRINTF(1, ("timer: interface update\n")); + interface_update(NULL, NULL); } /* diff --git a/contrib/ntp/ntpd/ntpd-opts.c b/contrib/ntp/ntpd/ntpd-opts.c index eae28cb301ce..4d23d6674276 100644 --- a/contrib/ntp/ntpd/ntpd-opts.c +++ b/contrib/ntp/ntpd/ntpd-opts.c @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpd-opts.c) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:20:10 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:10 AM EST * From the definitions ntpd-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpd copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpd copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -34,7 +34,7 @@ extern "C" { #endif tSCC zCopyright[] = - "ntpd copyright (c) 1970-2008 David L. Mills and/or others, all rights reserved"; + "ntpd copyright (c) 1970-2009 David L. Mills and/or others, all rights reserved"; tSCC zCopyrightNotice[] = /* extracted from ../include/copyright.def near line 8 */ @@ -835,16 +835,16 @@ static tOptDesc optDesc[ OPTION_CT ] = { */ tSCC zPROGNAME[] = "NTPD"; tSCC zUsageTitle[] = -"ntpd - NTP daemon program - Ver. 4.2.4p5\n\ +"ntpd - NTP daemon program - Ver. 4.2.4p8\n\ USAGE: %s [ - [] | --[{=| }] ]...\n"; #define zRcName NULL #define apzHomeList NULL -tSCC zBugsAddr[] = "http://bugs.ntp.isc.org, bugs@ntp.org"; +tSCC zBugsAddr[] = "http://bugs.ntp.org, bugs@ntp.org"; #define zExplain NULL tSCC zDetail[] = "\n\n"; tSCC zFullVersion[] = NTPD_FULL_VERSION; -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 408 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 408 */ #if defined(ENABLE_NLS) # define OPTPROC_BASE OPTPROC_TRANSLATE @@ -914,7 +914,7 @@ DESC(DEBUG_LEVEL).optOccCt = atoi( pOptDesc->pzLastArg ); #endif /* defined(TEST_NTPD_OPTS) */ -/* extracted from /usr/local/gnu/share/autogen/optmain.tpl near line 92 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optmain.tpl near line 92 */ #if defined(TEST_NTPD_OPTS) /* TEST MAIN PROCEDURE: */ @@ -930,7 +930,7 @@ main( int argc, char** argv ) return res; } #endif /* defined TEST_NTPD_OPTS */ -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 514 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 514 */ #if ENABLE_NLS #include diff --git a/contrib/ntp/ntpd/ntpd-opts.h b/contrib/ntp/ntpd/ntpd-opts.h index 45d0de5a5e05..0347f333aa83 100644 --- a/contrib/ntp/ntpd/ntpd-opts.h +++ b/contrib/ntp/ntpd/ntpd-opts.h @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpd-opts.h) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:20:09 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:09 AM EST * From the definitions ntpd-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpd copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpd copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -87,8 +87,8 @@ typedef enum { } teOptIndex; #define OPTION_CT 32 -#define NTPD_VERSION "4.2.4p5" -#define NTPD_FULL_VERSION "ntpd - NTP daemon program - Ver. 4.2.4p5" +#define NTPD_VERSION "4.2.4p8" +#define NTPD_FULL_VERSION "ntpd - NTP daemon program - Ver. 4.2.4p8" /* * Interface defines for all options. Replace "n" with the UPPER_CASED @@ -319,7 +319,7 @@ typedef enum { ntpdOptions.pzCurOpt = NULL ) #define START_OPT RESTART_OPT(1) #define USAGE(c) (*ntpdOptions.pUsageProc)( &ntpdOptions, c ) -/* extracted from /usr/local/gnu/share/autogen/opthead.tpl near line 360 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/opthead.tpl near line 360 */ /* * * * * * * diff --git a/contrib/ntp/ntpd/ntpd-opts.texi b/contrib/ntp/ntpd/ntpd-opts.texi index 5a99b58abca7..04912945b240 100644 --- a/contrib/ntp/ntpd/ntpd-opts.texi +++ b/contrib/ntp/ntpd/ntpd-opts.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (ntpd-opts.texi) # -# It has been AutoGen-ed Sunday August 17, 2008 at 05:20:12 AM EDT +# It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:12 AM EST # From the definitions ntpd-opts.def # and the template file aginfo.tpl @end ignore @@ -60,12 +60,15 @@ This is the automatically generated usage text for ntpd: @exampleindent 0 @example -ntpd - NTP daemon program - Ver. 4.2.5p113 +ntpd - NTP daemon program - Ver. 4.2.5p247-RC USAGE: ntpd [ - [] | --[@{=| @}] ]... Flg Arg Option-Name Description -4 no ipv4 Force IPv4 DNS name resolution + - prohibits these options: + ipv6 -6 no ipv6 Force IPv6 DNS name resolution - - an alternate for ipv4 + - prohibits these options: + ipv4 -a no authreq Require crypto authentication - prohibits these options: authnoreq @@ -80,20 +83,24 @@ USAGE: ntpd [ - [] | --[@{=| @}] ]... - may appear multiple times -f Str driftfile frequency drift file name -g no panicgate Allow the first adjustment to be Big - -I Str interface Listen on the specified interface or IP + - may appear multiple times + -i --- jaildir built without --enable-clockctl or --enable-linuxcaps + -I Str interface Listen on an interface name or address - may appear multiple times -k Str keyfile path to symmetric keys -l Str logfile path to the log file - -L no novirtualips Do not listen to virtual IPs + -L no novirtualips Do not listen to virtual interfaces -n no nofork Do not fork -N no nice Run at high priority -p Str pidfile path to the PID file -P Num priority Process priority -q no quit Set the time and quit -r Str propagationdelay Broadcast/propagation delay + Str saveconfigquit Save parsed configuration and quit -s Str statsdir Statistics file location -t Str trustedkey Trusted key number - may appear multiple times + -u --- user built without --enable-clockctl or --enable-linuxcaps -U Num updateinterval interval in seconds between scans for new or dropped interfaces Str var make ARG an ntp variable (RW) - may appear multiple times @@ -101,7 +108,7 @@ USAGE: ntpd [ - [] | --[@{=| @}] ]... - may appear multiple times -x no slew Slew up to 600 seconds opt version Output version information and exit - -? no help Display usage information and exit + -? no help Display extended usage information and exit -! no more-help Extended usage information passed thru pager Options are specified by doubled hyphens and their name diff --git a/contrib/ntp/ntpd/ntpd.1 b/contrib/ntp/ntpd/ntpd.1 index 25aee4117f5e..ec0a0ed75fa6 100644 --- a/contrib/ntp/ntpd/ntpd.1 +++ b/contrib/ntp/ntpd/ntpd.1 @@ -1,7 +1,7 @@ -.TH NTPD 1 2008-08-17 "( 4.2.4p5)" "Programmer's Manual" +.TH NTPD 1 2009-12-08 "( 4.2.4p8)" "Programmer's Manual" .\" EDIT THIS FILE WITH CAUTION (ntpd.1) .\" -.\" It has been AutoGen-ed Sunday August 17, 2008 at 05:20:11 AM EDT +.\" It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:11 AM EST .\" From the definitions ntpd-opts.def .\" and the template file agman1.tpl .\" @@ -283,7 +283,7 @@ by loading values from environment variables named: .SH AUTHOR David L. Mills and/or others .br -Please send bug reports to: http://bugs.ntp.isc.org, bugs@ntp.org +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org .PP .nf diff --git a/contrib/ntp/ntpd/ntpd.c b/contrib/ntp/ntpd/ntpd.c index 04e0d07f94c9..02a5198b087f 100644 --- a/contrib/ntp/ntpd/ntpd.c +++ b/contrib/ntp/ntpd/ntpd.c @@ -26,30 +26,22 @@ # include #endif #include -#ifndef SYS_WINNT -# if !defined(VMS) /*wjm*/ -# ifdef HAVE_SYS_PARAM_H -# include -# endif -# endif /* VMS */ -# ifdef HAVE_SYS_SIGNAL_H -# include -# else -# include +#if !defined(VMS) /*wjm*/ +# ifdef HAVE_SYS_PARAM_H +# include # endif -# ifdef HAVE_SYS_IOCTL_H -# include -# endif /* HAVE_SYS_IOCTL_H */ -# ifdef HAVE_SYS_RESOURCE_H -# include -# endif /* HAVE_SYS_RESOURCE_H */ +#endif /* VMS */ +#ifdef HAVE_SYS_SIGNAL_H +# include #else # include -# include -# include -# include -#include "ntp_iocompletionport.h" -#endif /* SYS_WINNT */ +#endif +#ifdef HAVE_SYS_IOCTL_H +# include +#endif /* HAVE_SYS_IOCTL_H */ +#ifdef HAVE_SYS_RESOURCE_H +# include +#endif /* HAVE_SYS_RESOURCE_H */ #if defined(HAVE_RTPRIO) # ifdef HAVE_SYS_RESOURCE_H # include @@ -821,9 +813,6 @@ ntpdmain( init_restrict(); init_mon(); init_timer(); -#if defined (HAVE_IO_COMPLETION_PORT) - init_io_completion_port(); -#endif init_lib(); init_request(); init_control(); @@ -993,7 +982,7 @@ getgroup: #if defined(HAVE_IO_COMPLETION_PORT) for (;;) { - int tot_full_recvbufs = GetReceivedBuffers(); + GetReceivedBuffers(); #else /* normal I/O */ BLOCK_IO_AND_ALARM(); diff --git a/contrib/ntp/ntpd/ntpdsim-opts.c b/contrib/ntp/ntpd/ntpdsim-opts.c index 4f09c0fa9d62..d9ef1b22e057 100644 --- a/contrib/ntp/ntpd/ntpdsim-opts.c +++ b/contrib/ntp/ntpd/ntpdsim-opts.c @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpdsim-opts.c) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:20:14 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:13 AM EST * From the definitions ntpdsim-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpdsim copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpdsim copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -34,7 +34,7 @@ extern "C" { #endif tSCC zCopyright[] = - "ntpdsim copyright (c) 1970-2008 David L. Mills and/or others, all rights reserved"; + "ntpdsim copyright (c) 1970-2009 David L. Mills and/or others, all rights reserved"; tSCC zCopyrightNotice[] = /* extracted from ../include/copyright.def near line 8 */ @@ -1072,7 +1072,7 @@ static tOptDesc optDesc[ OPTION_CT ] = { */ tSCC zPROGNAME[] = "NTPDSIM"; tSCC zUsageTitle[] = -"ntpdsim - NTP daemon simulation program - Ver. 4.2.4p5\n\ +"ntpdsim - NTP daemon simulation program - Ver. 4.2.4p8\n\ USAGE: %s [ - [] | --[{=| }] ]...\n"; tSCC zRcName[] = ".ntprc"; tSCC* apzHomeList[] = { @@ -1080,11 +1080,11 @@ tSCC* apzHomeList[] = { ".", NULL }; -tSCC zBugsAddr[] = "http://bugs.ntp.isc.org, bugs@ntp.org"; +tSCC zBugsAddr[] = "http://bugs.ntp.org, bugs@ntp.org"; #define zExplain NULL tSCC zDetail[] = "\n\n"; tSCC zFullVersion[] = NTPDSIM_FULL_VERSION; -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 408 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 408 */ #if defined(ENABLE_NLS) # define OPTPROC_BASE OPTPROC_TRANSLATE @@ -1155,7 +1155,7 @@ DESC(DEBUG_LEVEL).optOccCt = atoi( pOptDesc->pzLastArg ); #endif /* defined(TEST_NTPDSIM_OPTS) */ -/* extracted from /usr/local/gnu/share/autogen/optmain.tpl near line 92 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optmain.tpl near line 92 */ #if defined(TEST_NTPDSIM_OPTS) /* TEST MAIN PROCEDURE: */ @@ -1171,7 +1171,7 @@ main( int argc, char** argv ) return res; } #endif /* defined TEST_NTPDSIM_OPTS */ -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 514 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 514 */ #if ENABLE_NLS #include diff --git a/contrib/ntp/ntpd/ntpdsim-opts.h b/contrib/ntp/ntpd/ntpdsim-opts.h index 1c63654d7786..3458bbfd0deb 100644 --- a/contrib/ntp/ntpd/ntpdsim-opts.h +++ b/contrib/ntp/ntpd/ntpdsim-opts.h @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpdsim-opts.h) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:20:13 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:12 AM EST * From the definitions ntpdsim-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpdsim copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpdsim copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -98,8 +98,8 @@ typedef enum { } teOptIndex; #define OPTION_CT 43 -#define NTPDSIM_VERSION "4.2.4p5" -#define NTPDSIM_FULL_VERSION "ntpdsim - NTP daemon simulation program - Ver. 4.2.4p5" +#define NTPDSIM_VERSION "4.2.4p8" +#define NTPDSIM_FULL_VERSION "ntpdsim - NTP daemon simulation program - Ver. 4.2.4p8" /* * Interface defines for all options. Replace "n" with the UPPER_CASED @@ -390,7 +390,7 @@ typedef enum { ntpdsimOptions.pzCurOpt = NULL ) #define START_OPT RESTART_OPT(1) #define USAGE(c) (*ntpdsimOptions.pUsageProc)( &ntpdsimOptions, c ) -/* extracted from /usr/local/gnu/share/autogen/opthead.tpl near line 360 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/opthead.tpl near line 360 */ /* * * * * * * diff --git a/contrib/ntp/ntpd/ntpdsim-opts.texi b/contrib/ntp/ntpd/ntpdsim-opts.texi index 49b54398dd5a..ed522106276a 100644 --- a/contrib/ntp/ntpd/ntpdsim-opts.texi +++ b/contrib/ntp/ntpd/ntpdsim-opts.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (ntpdsim-opts.texi) # -# It has been AutoGen-ed Sunday August 17, 2008 at 05:20:17 AM EDT +# It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:15 AM EST # From the definitions ntpdsim-opts.def # and the template file aginfo.tpl @end ignore @@ -69,7 +69,66 @@ This is the automatically generated usage text for ntpdsim: @exampleindent 0 @example -ntpdsim is unavailable - no --help +ntpd - NTP daemon program - Ver. 4.2.5p247-RC +USAGE: ntpdsim [ - [] | --[@{=| @}] ]... + Flg Arg Option-Name Description + -4 no ipv4 Force IPv4 DNS name resolution + - prohibits these options: + ipv6 + -6 no ipv6 Force IPv6 DNS name resolution + - prohibits these options: + ipv4 + -a no authreq Require crypto authentication + - prohibits these options: + authnoreq + -A no authnoreq Do not require crypto authentication + - prohibits these options: + authreq + -b no bcastsync Allow us to sync to broadcast servers + -c Str configfile configuration file name + -d no debug-level Increase output debug message level + - may appear multiple times + -D Str set-debug-level Set the output debug message level + - may appear multiple times + -f Str driftfile frequency drift file name + -g no panicgate Allow the first adjustment to be Big + - may appear multiple times + -i --- jaildir built without --enable-clockctl or --enable-linuxcaps + -I Str interface Listen on an interface name or address + - may appear multiple times + -k Str keyfile path to symmetric keys + -l Str logfile path to the log file + -L no novirtualips Do not listen to virtual interfaces + -n no nofork Do not fork + -N no nice Run at high priority + -p Str pidfile path to the PID file + -P Num priority Process priority + -q no quit Set the time and quit + -r Str propagationdelay Broadcast/propagation delay + Str saveconfigquit Save parsed configuration and quit + -s Str statsdir Statistics file location + -t Str trustedkey Trusted key number + - may appear multiple times + -u --- user built without --enable-clockctl or --enable-linuxcaps + -U Num updateinterval interval in seconds between scans for new or dropped interfaces + Str var make ARG an ntp variable (RW) + - may appear multiple times + Str dvar make ARG an ntp variable (RW|DEF) + - may appear multiple times + -x no slew Slew up to 600 seconds + opt version Output version information and exit + -? no help Display extended usage information and exit + -! no more-help Extended usage information passed thru pager + +Options are specified by doubled hyphens and their name +or by a single hyphen and the flag character. + +The following option preset mechanisms are supported: + - examining environment variables named NTPD_* + + + +please send bug reports to: http://bugs.ntp.org, bugs@@ntp.org @end example @exampleindent 4 diff --git a/contrib/ntp/ntpd/ntpdsim.1 b/contrib/ntp/ntpd/ntpdsim.1 index 2a7ea4667d20..202876418f25 100644 --- a/contrib/ntp/ntpd/ntpdsim.1 +++ b/contrib/ntp/ntpd/ntpdsim.1 @@ -1,7 +1,7 @@ -.TH NTPDSIM 1 2008-08-17 "( 4.2.4p5)" "Programmer's Manual" +.TH NTPDSIM 1 2009-12-08 "( 4.2.4p8)" "Programmer's Manual" .\" EDIT THIS FILE WITH CAUTION (ntpdsim.1) .\" -.\" It has been AutoGen-ed Sunday August 17, 2008 at 05:20:16 AM EDT +.\" It has been AutoGen-ed Tuesday December 8, 2009 at 08:13:14 AM EST .\" From the definitions ntpdsim-opts.def .\" and the template file agman1.tpl .\" @@ -344,7 +344,7 @@ is searched for within those directories. .SH AUTHOR David L. Mills and/or others .br -Please send bug reports to: http://bugs.ntp.isc.org, bugs@ntp.org +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org .PP .nf diff --git a/contrib/ntp/ntpd/refclock_dumbclock.c b/contrib/ntp/ntpd/refclock_dumbclock.c index 2788649ac3a7..10ff2cfe893b 100644 --- a/contrib/ntp/ntpd/refclock_dumbclock.c +++ b/contrib/ntp/ntpd/refclock_dumbclock.c @@ -12,11 +12,6 @@ #include #endif -#if defined(SYS_WINNT) -#undef close -#define close closesocket -#endif - #if defined(REFCLOCK) && defined(CLOCK_DUMBCLOCK) #include "ntpd.h" @@ -28,6 +23,12 @@ #include #include +#ifdef SYS_WINNT +extern int async_write(int, const void *, unsigned int); +#undef write +#define write(fd, data, octets) async_write(fd, data, octets) +#endif + /* * This driver supports a generic dumb clock that only outputs hh:mm:ss, * in local time, no less. diff --git a/contrib/ntp/ntpd/refclock_hopfser.c b/contrib/ntp/ntpd/refclock_hopfser.c index 94b660be236e..9037d4a9222a 100644 --- a/contrib/ntp/ntpd/refclock_hopfser.c +++ b/contrib/ntp/ntpd/refclock_hopfser.c @@ -14,11 +14,6 @@ # include "config.h" #endif -#if defined(SYS_WINNT) -#undef close -#define close closesocket -#endif - #if defined(REFCLOCK) && (defined(CLOCK_HOPF_SERIAL)) #include "ntpd.h" @@ -51,6 +46,12 @@ # include #endif +#ifdef SYS_WINNT +extern int async_write(int, const void *, unsigned int); +#undef write +#define write(fd, data, octets) async_write(fd, data, octets) +#endif + /* * clock definitions */ diff --git a/contrib/ntp/ntpd/refclock_jjy.c b/contrib/ntp/ntpd/refclock_jjy.c index 9d1419a6f6ba..d1707ced0f21 100644 --- a/contrib/ntp/ntpd/refclock_jjy.c +++ b/contrib/ntp/ntpd/refclock_jjy.c @@ -74,6 +74,9 @@ /* [Fix] C-DEX JST2000 */ /* Thanks to Hideo Kuramatsu for the patch */ /* */ +/* 2009/04/05 */ +/* [Add] Support the CITIZEN T.I.C JJY-200 receiver */ +/* */ /**********************************************************************/ #ifdef HAVE_CONFIG_H @@ -131,12 +134,26 @@ /* Second signal */ /* */ /**********************************************************************/ +/* */ +/* The CITIZEN T.I.C CO., LTD. JJY receiver JJY200 */ +/* */ +/* Command Response Remarks */ +/* ------------ ---------------------- --------------------- */ +/* 'XX YY/MM/DD W HH:MM:SS */ +/* XX: OK|NG|ER */ +/* W: 0(Monday)-6(Sunday) */ +/* */ +/**********************************************************************/ /* * Interface definitions */ #define DEVICE "/dev/jjy%d" /* device name and unit */ #define SPEED232 B9600 /* uart speed (9600 baud) */ +#define SPEED232_TRISTATE_JJY01 B9600 /* UART speed (9600 baud) */ +#define SPEED232_CDEX_JST2000 B9600 /* UART speed (9600 baud) */ +#define SPEED232_ECHOKEISOKUKI_LT2000 B9600 /* UART speed (9600 baud) */ +#define SPEED232_CITIZENTIC_JJY200 B4800 /* UART speed (4800 baud) */ #define REFID "JJY" /* reference ID */ #define DESCRIPTION "JJY Receiver" #define PRECISION (-3) /* precision assumed (about 100 ms) */ @@ -149,6 +166,7 @@ struct jjyunit { short operationmode ; /* Echo Keisokuki LT-2000 : 1 or 2 */ short version ; short linediscipline ; /* LDISC_CLK or LDISC_RAW */ + char bPollFlag ; /* Set by jjy_pool and Reset by jjy_receive */ int linecount ; int lineerror ; int year, month, day, hour, minute, second, msecond ; @@ -164,6 +182,7 @@ struct jjyunit { #define UNITTYPE_TRISTATE_JJY01 1 #define UNITTYPE_CDEX_JST2000 2 #define UNITTYPE_ECHOKEISOKUKI_LT2000 3 +#define UNITTYPE_CITIZENTIC_JJY200 4 /* * Function prototypes @@ -174,10 +193,12 @@ static void jjy_poll P((int, struct peer *)); static void jjy_poll_tristate_jjy01 P((int, struct peer *)); static void jjy_poll_cdex_jst2000 P((int, struct peer *)); static void jjy_poll_echokeisokuki_lt2000 P((int, struct peer *)); +static void jjy_poll_citizentic_jjy200 P((int, struct peer *)); static void jjy_receive P((struct recvbuf *)); static int jjy_receive_tristate_jjy01 P((struct recvbuf *)); static int jjy_receive_cdex_jst2000 P((struct recvbuf *)); static int jjy_receive_echokeisokuki_lt2000 P((struct recvbuf *)); +static int jjy_receive_citizentic_jjy200 P((struct recvbuf *)); /* * Transfer vector @@ -217,6 +238,7 @@ jjy_start ( int unit, struct peer *peer ) int fd ; char *pDeviceName ; short iDiscipline ; + int iSpeed232 ; #ifdef DEBUG if ( debug ) { @@ -238,9 +260,22 @@ jjy_start ( int unit, struct peer *peer ) */ switch ( peer->ttl ) { case 0 : - case 1 : iDiscipline = LDISC_CLK ; break ; - case 2 : iDiscipline = LDISC_RAW ; break ; - case 3 : iDiscipline = LDISC_CLK ; break ; + case 1 : + iDiscipline = LDISC_CLK ; + iSpeed232 = SPEED232_TRISTATE_JJY01 ; + break ; + case 2 : + iDiscipline = LDISC_RAW ; + iSpeed232 = SPEED232_CDEX_JST2000 ; + break ; + case 3 : + iDiscipline = LDISC_CLK ; + iSpeed232 = SPEED232_ECHOKEISOKUKI_LT2000 ; + break ; + case 4 : + iDiscipline = LDISC_CLK ; + iSpeed232 = SPEED232_CITIZENTIC_JJY200 ; + break ; default : msyslog ( LOG_ERR, "JJY receiver [ %s mode %d ] : Unsupported mode", ntoa(&peer->srcadr), peer->ttl ) ; @@ -248,7 +283,7 @@ jjy_start ( int unit, struct peer *peer ) return RC_START_ERROR ; } - if ( ! ( fd = refclock_open ( pDeviceName, SPEED232, iDiscipline ) ) ) { + if ( ! ( fd = refclock_open ( pDeviceName, iSpeed232, iDiscipline ) ) ) { free ( (void*) pDeviceName ) ; return RC_START_ERROR ; } @@ -299,6 +334,11 @@ jjy_start ( int unit, struct peer *peer ) break ; } break ; + case 4 : + up->unittype = UNITTYPE_CITIZENTIC_JJY200 ; + up->lineexpect = 1 ; + up->charexpect[0] = 23 ; /* 'XX YY/MM/DD W HH:MM:SS */ + break ; default : msyslog ( LOG_ERR, "JJY receiver [ %s mode %d ] : Unsupported mode", ntoa(&peer->srcadr), peer->ttl ) ; @@ -434,6 +474,10 @@ jjy_receive ( struct recvbuf *rbufp ) rc = jjy_receive_echokeisokuki_lt2000 ( rbufp ) ; break ; + case UNITTYPE_CITIZENTIC_JJY200 : + rc = jjy_receive_citizentic_jjy200 ( rbufp ) ; + break ; + default : rc = 0 ; break ; @@ -453,6 +497,8 @@ jjy_receive ( struct recvbuf *rbufp ) if ( rc == 0 ) return ; + up->bPollFlag = 0 ; + if ( up->lineerror != 0 ) { refclock_report ( peer, CEVNT_BADREPLY ) ; strcpy ( sLogText, "BAD REPLY [" ) ; @@ -865,6 +911,93 @@ jjy_receive_echokeisokuki_lt2000 ( struct recvbuf *rbufp ) } +/**************************************************************************************************/ + +static int +jjy_receive_citizentic_jjy200 ( struct recvbuf *rbufp ) +{ + + static char *sFunctionName = "jjy_receive_citizentic_jjy200" ; + + struct jjyunit *up ; + struct refclockproc *pp ; + struct peer *peer; + + char *pBuf ; + int iLen ; + int rc ; + char cApostrophe, sStatus[3] ; + int iWeekday ; + + /* + * Initialize pointers and read the timecode and timestamp + */ + peer = (struct peer *) rbufp->recv_srcclock ; + pp = peer->procptr ; + up = (struct jjyunit *) pp->unitptr ; + + if ( up->linediscipline == LDISC_RAW ) { + pBuf = up->rawbuf ; + iLen = up->charcount ; + } else { + pBuf = pp->a_lastcode ; + iLen = pp->lencode ; + } + + /* + * JJY-200 sends a timestamp every second. + * So, a timestamp is ignored unless it is right after polled. + */ + if ( ! up->bPollFlag ) return 0 ; + + switch ( up->linecount ) { + + case 1 : /* 'XX YY/MM/DD W HH:MM:SS */ + + if ( iLen != 23 ) { +#ifdef DEBUG + if ( debug >= 2 ) { + printf ( "%s (refclock_jjy.c) : Reply length error ( iLen=%d )\n", sFunctionName, iLen ) ; + } +#endif + up->lineerror = 1 ; + break ; + } + + rc = sscanf ( pBuf, "%c%2s %2d/%2d/%2d %1d %2d:%2d:%2d", + &cApostrophe, sStatus, + &up->year, &up->month, &up->day, &iWeekday, &up->hour, &up->minute, &up->second ) ; + sStatus[2] = 0 ; + if ( rc != 9 || cApostrophe != '\'' || strcmp( sStatus, "OK" ) != 0 + || up->month < 1 || up->month > 12 || up->day < 1 || up->day > 31 + || iWeekday > 6 + || up->hour > 23 || up->minute > 59 || up->second > 60 ) { +#ifdef DEBUG + if ( debug >= 2 ) { + printf ( "%s (refclock_jjy.c) : Time error (rc=%d) [ %c %2s %02d %02d %02d %d %02d %02d %02d ]\n", sFunctionName, + rc, cApostrophe, sStatus, up->year, up->month, up->day, iWeekday, up->hour, up->minute, up->second ) ; + } +#endif + up->lineerror = 1 ; + break ; + } + + up->year += 2000 ; + up->msecond = 0 ; + + break ; + + default : /* Unexpected reply */ + + up->lineerror = 1 ; + break ; + + } + + return 1 ; + +} + /**************************************************************************************************/ /* jjy_poll - called by the transmit procedure */ /**************************************************************************************************/ @@ -893,6 +1026,7 @@ jjy_poll ( int unit, struct peer *peer ) pp->polls ++ ; + up->bPollFlag = 1 ; up->linecount = 0 ; up->lineerror = 0 ; up->charcount = 0 ; @@ -911,6 +1045,10 @@ jjy_poll ( int unit, struct peer *peer ) jjy_poll_echokeisokuki_lt2000 ( unit, peer ) ; break ; + case UNITTYPE_CITIZENTIC_JJY200 : + jjy_poll_citizentic_jjy200 ( unit, peer ) ; + break ; + default : break ; @@ -1006,6 +1144,16 @@ jjy_poll_echokeisokuki_lt2000 ( int unit, struct peer *peer ) } +/**************************************************************************************************/ + +static void +jjy_poll_citizentic_jjy200 ( int unit, struct peer *peer ) +{ + + /* Do nothing ( up->bPollFlag is set by the jjy_poll ) */ + +} + #else int refclock_jjy_bs ; #endif /* REFCLOCK */ diff --git a/contrib/ntp/ntpd/refclock_nmea.c b/contrib/ntp/ntpd/refclock_nmea.c index 5b124cb0c3f4..a176ee86c139 100644 --- a/contrib/ntp/ntpd/refclock_nmea.c +++ b/contrib/ntp/ntpd/refclock_nmea.c @@ -7,11 +7,6 @@ #include #endif -#if defined(SYS_WINNT) -#undef close -#define close closesocket -#endif - #if defined(REFCLOCK) && defined(CLOCK_NMEA) #include @@ -27,6 +22,12 @@ # include "ppsapi_timepps.h" #endif /* HAVE_PPSAPI */ +#ifdef SYS_WINNT +extern int async_write(int, const void *, unsigned int); +#undef write +#define write(fd, data, octets) async_write(fd, data, octets) +#endif + /* * This driver supports the NMEA GPS Receiver with * diff --git a/contrib/ntp/ntpd/refclock_palisade.c b/contrib/ntp/ntpd/refclock_palisade.c index 217ec104dcf9..adb4659f97bb 100644 --- a/contrib/ntp/ntpd/refclock_palisade.c +++ b/contrib/ntp/ntpd/refclock_palisade.c @@ -56,13 +56,14 @@ #include "config.h" #endif -#if defined(SYS_WINNT) -#undef close -#define close closesocket -#endif - #if defined(REFCLOCK) && (defined(PALISADE) || defined(CLOCK_PALISADE)) +#ifdef SYS_WINNT +extern int async_write(int, const void *, unsigned int); +#undef write +#define write(fd, data, octets) async_write(fd, data, octets) +#endif + #include "refclock_palisade.h" /* Table to get from month to day of the year */ const int days_of_year [12] = { diff --git a/contrib/ntp/ntpdate/Makefile.in b/contrib/ntp/ntpdate/Makefile.in index fadcd184cbf6..d127815b087f 100644 --- a/contrib/ntp/ntpdate/Makefile.in +++ b/contrib/ntp/ntpdate/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -21,15 +22,12 @@ # subdir to warn folks if there is another version there. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -59,8 +57,8 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) ntpdate_SOURCES = ntpdate.c ntpdate_OBJECTS = ntpdate.$(OBJEXT) @@ -70,17 +68,19 @@ am_ntptimeset_OBJECTS = ntptimeset.$(OBJEXT) ntptime_config.$(OBJEXT) ntptimeset_OBJECTS = $(am_ntptimeset_OBJECTS) ntptimeset_LDADD = $(LDADD) ntptimeset_DEPENDENCIES = version.o ../libntp/libntp.a -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = ntpdate.c $(ntptimeset_SOURCES) DIST_SOURCES = ntpdate.c $(ntptimeset_SOURCES) HEADERS = $(noinst_HEADERS) @@ -88,8 +88,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -105,10 +103,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -121,11 +115,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -139,6 +132,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -152,8 +146,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -163,6 +156,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -176,16 +170,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -197,29 +186,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ ntptimeset_SOURCES = ntptimeset.c ntptime_config.c AM_CPPFLAGS = -I$(top_srcdir)/include # LDADD might need RESLIB and ADJLIB @@ -235,14 +236,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../bincheck.mf $(am__con @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpdate/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign ntpdate/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpdate/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ntpdate/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -260,40 +261,56 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list ntpdate$(EXEEXT): $(ntpdate_OBJECTS) $(ntpdate_DEPENDENCIES) @rm -f ntpdate$(EXEEXT) - $(LINK) $(ntpdate_LDFLAGS) $(ntpdate_OBJECTS) $(ntpdate_LDADD) $(LIBS) + $(LINK) $(ntpdate_OBJECTS) $(ntpdate_LDADD) $(LIBS) ntptimeset$(EXEEXT): $(ntptimeset_OBJECTS) $(ntptimeset_DEPENDENCIES) @rm -f ntptimeset$(EXEEXT) - $(LINK) $(ntptimeset_LDFLAGS) $(ntptimeset_OBJECTS) $(ntptimeset_LDADD) $(LIBS) + $(LINK) $(ntptimeset_OBJECTS) $(ntptimeset_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -306,22 +323,22 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntptimeset.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -332,83 +349,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -417,7 +436,7 @@ check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am @@ -439,6 +458,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -452,7 +472,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -460,20 +480,39 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -494,19 +533,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-exec-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-exec \ - install-exec-am install-exec-hook install-info install-info-am \ - install-man install-strip installcheck installcheck-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-info-am + uninstall-am uninstall-binPROGRAMS $(PROGRAMS): $(LDADD) @@ -532,6 +575,7 @@ install-exec-hook: done # + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/ntpdc/Makefile.in b/contrib/ntp/ntpdc/Makefile.in index 30c96acc8a79..0e4ce77f0f52 100644 --- a/contrib/ntp/ntpdc/Makefile.in +++ b/contrib/ntp/ntpdc/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -19,15 +20,12 @@ # subdir to warn folks if there is another version there. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -58,8 +56,8 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = nl.pl +CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_ntpdc_OBJECTS = ntpdc$U.$(OBJEXT) ntpdc_ops$U.$(OBJEXT) \ ntpdc-opts$U.$(OBJEXT) @@ -70,19 +68,42 @@ ntpdc_DEPENDENCIES = version.o $(am__DEPENDENCIES_1) \ ntpdc_layout_SOURCES = ntpdc-layout.c ntpdc_layout_OBJECTS = ntpdc-layout$U.$(OBJEXT) ntpdc_layout_DEPENDENCIES = -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(ntpdc_SOURCES) ntpdc-layout.c DIST_SOURCES = $(ntpdc_SOURCES) ntpdc-layout.c +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) @@ -91,8 +112,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -108,10 +127,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -124,11 +139,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -142,6 +156,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -155,8 +170,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -166,6 +180,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -179,16 +194,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -200,29 +210,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = ../util/ansi2knr EXTRA_DATA = check-layout BUILT_SOURCES = @MAKE_CHECK_LAYOUT@ ntpdc-opts.c ntpdc-opts.h ntpdc.1 \ @@ -257,14 +279,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../bincheck.mf $(am__con @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpdc/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign ntpdc/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpdc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ntpdc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -282,42 +304,58 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): nl.pl: $(top_builddir)/config.status $(srcdir)/nl.pl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list ntpdc$(EXEEXT): $(ntpdc_OBJECTS) $(ntpdc_DEPENDENCIES) @rm -f ntpdc$(EXEEXT) - $(LINK) $(ntpdc_LDFLAGS) $(ntpdc_OBJECTS) $(ntpdc_LDADD) $(LIBS) + $(LINK) $(ntpdc_OBJECTS) $(ntpdc_LDADD) $(LIBS) ntpdc-layout$(EXEEXT): $(ntpdc_layout_OBJECTS) $(ntpdc_layout_DEPENDENCIES) @rm -f ntpdc-layout$(EXEEXT) - $(LINK) $(ntpdc_layout_LDFLAGS) $(ntpdc_layout_OBJECTS) $(ntpdc_layout_LDADD) $(LIBS) + $(LINK) $(ntpdc_layout_OBJECTS) $(ntpdc_layout_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -325,7 +363,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -336,22 +374,22 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpdc_ops$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -372,129 +410,137 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-man1: $(man1_MANS) $(man_MANS) +install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + uninstall-man1: @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -504,7 +550,7 @@ check: $(BUILT_SOURCES) all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am @@ -528,6 +574,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -542,7 +589,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -550,20 +597,39 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: install-man +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: install-info: install-info-am +install-info-am: + install-man: install-man1 +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -584,22 +650,26 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man +uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 +.MAKE: ../util/ansi2knr all check install install-am install-exec-am \ + install-strip + .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-exec \ - install-exec-am install-exec-hook install-info install-info-am \ - install-man install-man1 install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic mostlyclean-kr mostlyclean-libtool pdf \ - pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-info-am uninstall-man \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-info install-info-am \ + install-man install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-kr mostlyclean-libtool pdf pdf-am ps ps-am tags \ + uninstall uninstall-am uninstall-binPROGRAMS uninstall-man \ uninstall-man1 @@ -649,6 +719,7 @@ install-exec-hook: done # + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/ntpdc/ntpdc-opts.c b/contrib/ntp/ntpdc/ntpdc-opts.c index d3c2549af812..41be37ec9e5f 100644 --- a/contrib/ntp/ntpdc/ntpdc-opts.c +++ b/contrib/ntp/ntpdc/ntpdc-opts.c @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpdc-opts.c) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:26:25 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:00 AM EST * From the definitions ntpdc-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpdc copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpdc copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -34,7 +34,7 @@ extern "C" { #endif tSCC zCopyright[] = - "ntpdc copyright (c) 1970-2008 David L. Mills and/or others, all rights reserved"; + "ntpdc copyright (c) 1970-2009 David L. Mills and/or others, all rights reserved"; tSCC zCopyrightNotice[] = /* extracted from ../include/copyright.def near line 8 */ @@ -462,7 +462,7 @@ static tOptDesc optDesc[ OPTION_CT ] = { */ tSCC zPROGNAME[] = "NTPDC"; tSCC zUsageTitle[] = -"ntpdc - vendor-specific NTP query program - Ver. 4.2.4p5\n\ +"ntpdc - vendor-specific NTP query program - Ver. 4.2.4p8\n\ USAGE: %s [ - [] | --[{=| }] ]... [ host ...]\n"; tSCC zRcName[] = ".ntprc"; tSCC* apzHomeList[] = { @@ -470,7 +470,7 @@ tSCC* apzHomeList[] = { ".", NULL }; -tSCC zBugsAddr[] = "http://bugs.ntp.isc.org, bugs@ntp.org"; +tSCC zBugsAddr[] = "http://bugs.ntp.org, bugs@ntp.org"; #define zExplain NULL tSCC zDetail[] = "\n\ The\n\ @@ -490,7 +490,7 @@ configuration options which can be specified at startup using\n\ ntpd's configuration file may also be specified at run time using\n\ [= prog-name =] .\n"; tSCC zFullVersion[] = NTPDC_FULL_VERSION; -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 408 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 408 */ #if defined(ENABLE_NLS) # define OPTPROC_BASE OPTPROC_TRANSLATE @@ -560,7 +560,7 @@ DESC(DEBUG_LEVEL).optOccCt = atoi( pOptDesc->pzLastArg ); #endif /* defined(TEST_NTPDC_OPTS) */ -/* extracted from /usr/local/gnu/share/autogen/optmain.tpl near line 92 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optmain.tpl near line 92 */ #if defined(TEST_NTPDC_OPTS) /* TEST MAIN PROCEDURE: */ @@ -576,7 +576,7 @@ main( int argc, char** argv ) return res; } #endif /* defined TEST_NTPDC_OPTS */ -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 514 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 514 */ #if ENABLE_NLS #include diff --git a/contrib/ntp/ntpdc/ntpdc-opts.h b/contrib/ntp/ntpdc/ntpdc-opts.h index a4bf99fd1e83..f6eef6575fac 100644 --- a/contrib/ntp/ntpdc/ntpdc-opts.h +++ b/contrib/ntp/ntpdc/ntpdc-opts.h @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpdc-opts.h) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:26:25 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:00 AM EST * From the definitions ntpdc-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpdc copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpdc copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -70,8 +70,8 @@ typedef enum { } teOptIndex; #define OPTION_CT 15 -#define NTPDC_VERSION "4.2.4p5" -#define NTPDC_FULL_VERSION "ntpdc - vendor-specific NTP query program - Ver. 4.2.4p5" +#define NTPDC_VERSION "4.2.4p8" +#define NTPDC_FULL_VERSION "ntpdc - vendor-specific NTP query program - Ver. 4.2.4p8" /* * Interface defines for all options. Replace "n" with the UPPER_CASED @@ -190,7 +190,7 @@ typedef enum { ntpdcOptions.pzCurOpt = NULL ) #define START_OPT RESTART_OPT(1) #define USAGE(c) (*ntpdcOptions.pUsageProc)( &ntpdcOptions, c ) -/* extracted from /usr/local/gnu/share/autogen/opthead.tpl near line 360 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/opthead.tpl near line 360 */ /* * * * * * * diff --git a/contrib/ntp/ntpdc/ntpdc-opts.texi b/contrib/ntp/ntpdc/ntpdc-opts.texi index dbce64c9cfea..121c270df17d 100644 --- a/contrib/ntp/ntpdc/ntpdc-opts.texi +++ b/contrib/ntp/ntpdc/ntpdc-opts.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (ntpdc-opts.texi) # -# It has been AutoGen-ed Sunday August 17, 2008 at 05:26:27 AM EDT +# It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:02 AM EST # From the definitions ntpdc-opts.def # and the template file aginfo.tpl @end ignore @@ -58,12 +58,15 @@ This is the automatically generated usage text for ntpdc: @exampleindent 0 @example -ntpdc - vendor-specific NTP query program - Ver. 4.2.5p113 +ntpdc - vendor-specific NTP query program - Ver. 4.2.5p247-RC USAGE: ntpdc [ - [] | --[@{=| @}] ]... [ host ...] Flg Arg Option-Name Description -4 no ipv4 Force IPv4 DNS name resolution + - prohibits these options: + ipv6 -6 no ipv6 Force IPv6 DNS name resolution - - an alternate for ipv4 + - prohibits these options: + ipv4 -c Str command run a command and exit - may appear multiple times -l no listpeers Print a list of the peers @@ -87,7 +90,7 @@ USAGE: ntpdc [ - [] | --[@{=| @}] ]... [ host ...] - may appear multiple times -n no numeric numeric host addresses opt version Output version information and exit - -? no help Display usage information and exit + -? no help Display extended usage information and exit -! no more-help Extended usage information passed thru pager -> opt save-opts Save the option state to a config file -< Str load-opts Load options from a config file diff --git a/contrib/ntp/ntpdc/ntpdc.1 b/contrib/ntp/ntpdc/ntpdc.1 index c653b62f9475..422706518497 100644 --- a/contrib/ntp/ntpdc/ntpdc.1 +++ b/contrib/ntp/ntpdc/ntpdc.1 @@ -1,7 +1,7 @@ -.TH NTPDC 1 2008-08-17 "( 4.2.4p5)" "Programmer's Manual" +.TH NTPDC 1 2009-12-08 "( 4.2.4p8)" "Programmer's Manual" .\" EDIT THIS FILE WITH CAUTION (ntpdc.1) .\" -.\" It has been AutoGen-ed Sunday August 17, 2008 at 05:26:27 AM EDT +.\" It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:01 AM EST .\" From the definitions ntpdc-opts.def .\" and the template file agman1.tpl .\" @@ -145,7 +145,7 @@ is searched for within those directories. .SH AUTHOR David L. Mills and/or others .br -Please send bug reports to: http://bugs.ntp.isc.org, bugs@ntp.org +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org .PP .nf diff --git a/contrib/ntp/ntpq/Makefile.in b/contrib/ntp/ntpq/Makefile.in index 32616a95f37e..0c5fcaeb684c 100644 --- a/contrib/ntp/ntpq/Makefile.in +++ b/contrib/ntp/ntpq/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,15 +16,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -53,27 +51,50 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_ntpq_OBJECTS = ntpq$U.$(OBJEXT) ntpq-subs$U.$(OBJEXT) \ ntpq-opts$U.$(OBJEXT) ntpq_OBJECTS = $(am_ntpq_OBJECTS) am__DEPENDENCIES_1 = ntpq_DEPENDENCIES = version.o $(am__DEPENDENCIES_1) ../libntp/libntp.a -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(ntpq_SOURCES) DIST_SOURCES = $(ntpq_SOURCES) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) @@ -82,8 +103,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -99,10 +118,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -115,11 +130,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -133,6 +147,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -146,8 +161,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -157,6 +171,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -170,16 +185,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -191,29 +201,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = ../util/ansi2knr AM_CPPFLAGS = -I$(top_srcdir)/include $(LIBOPTS_CFLAGS) @@ -242,14 +264,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpq/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign ntpq/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpq/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ntpq/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -267,37 +289,53 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list ntpq$(EXEEXT): $(ntpq_OBJECTS) $(ntpq_DEPENDENCIES) @rm -f ntpq$(EXEEXT) - $(LINK) $(ntpq_LDFLAGS) $(ntpq_OBJECTS) $(ntpq_LDADD) $(LIBS) + $(LINK) $(ntpq_OBJECTS) $(ntpq_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -305,7 +343,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -315,22 +353,22 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpq-subs$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -348,128 +386,137 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-man1: $(man1_MANS) $(man_MANS) +install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + uninstall-man1: @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -479,7 +526,7 @@ check: $(BUILT_SOURCES) all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am @@ -502,6 +549,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -516,7 +564,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -524,18 +572,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: install-man +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-binPROGRAMS +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-man1 +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -556,22 +624,26 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man +uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 +.MAKE: ../util/ansi2knr all check install install-am install-strip + .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool ctags distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-binPROGRAMS install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ - install-man1 install-strip installcheck installcheck-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-kr mostlyclean-libtool pdf pdf-am ps ps-am tags \ - uninstall uninstall-am uninstall-binPROGRAMS uninstall-info-am \ - uninstall-man uninstall-man1 + uninstall uninstall-am uninstall-binPROGRAMS uninstall-man \ + uninstall-man1 $(srcdir)/ntpq-opts.h: $(srcdir)/ntpq-opts.c @@ -595,6 +667,7 @@ $(top_srcdir)/version : version.o: $(ntpq_OBJECTS) ../libntp/libntp.a Makefile $(top_srcdir)/version env CSET=`cat $(top_srcdir)/version` $(top_builddir)/scripts/mkver ntpq $(COMPILE) -c version.c + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/ntpq/ntpq-opts.c b/contrib/ntp/ntpq/ntpq-opts.c index 0e73886b7232..868ef29a0197 100644 --- a/contrib/ntp/ntpq/ntpq-opts.c +++ b/contrib/ntp/ntpq/ntpq-opts.c @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpq-opts.c) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:26:55 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:26 AM EST * From the definitions ntpq-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpq copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpq copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -34,7 +34,7 @@ extern "C" { #endif tSCC zCopyright[] = - "ntpq copyright (c) 1970-2008 David L. Mills and/or others, all rights reserved"; + "ntpq copyright (c) 1970-2009 David L. Mills and/or others, all rights reserved"; tSCC zCopyrightNotice[] = /* extracted from ../include/copyright.def near line 8 */ @@ -410,7 +410,7 @@ static tOptDesc optDesc[ OPTION_CT ] = { */ tSCC zPROGNAME[] = "NTPQ"; tSCC zUsageTitle[] = -"ntpq - standard NTP query program - Ver. 4.2.4p5\n\ +"ntpq - standard NTP query program - Ver. 4.2.4p8\n\ USAGE: %s [ - [] | --[{=| }] ]... [ host ...]\n"; tSCC zRcName[] = ".ntprc"; tSCC* apzHomeList[] = { @@ -418,7 +418,7 @@ tSCC* apzHomeList[] = { ".", NULL }; -tSCC zBugsAddr[] = "http://bugs.ntp.isc.org, bugs@ntp.org"; +tSCC zBugsAddr[] = "http://bugs.ntp.org, bugs@ntp.org"; #define zExplain NULL tSCC zDetail[] = "\n\ The\n\ @@ -430,7 +430,7 @@ information about current state and/or changes in that state.\n\ The same formats are used in NTPv4, although some of the\n\ variables have changed and new ones added.\n"; tSCC zFullVersion[] = NTPQ_FULL_VERSION; -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 408 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 408 */ #if defined(ENABLE_NLS) # define OPTPROC_BASE OPTPROC_TRANSLATE @@ -500,7 +500,7 @@ DESC(DEBUG_LEVEL).optOccCt = atoi( pOptDesc->pzLastArg ); #endif /* defined(TEST_NTPQ_OPTS) */ -/* extracted from /usr/local/gnu/share/autogen/optmain.tpl near line 92 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optmain.tpl near line 92 */ #if defined(TEST_NTPQ_OPTS) /* TEST MAIN PROCEDURE: */ @@ -516,7 +516,7 @@ main( int argc, char** argv ) return res; } #endif /* defined TEST_NTPQ_OPTS */ -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 514 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 514 */ #if ENABLE_NLS #include diff --git a/contrib/ntp/ntpq/ntpq-opts.h b/contrib/ntp/ntpq/ntpq-opts.h index bbd35ca34399..2badce79077b 100644 --- a/contrib/ntp/ntpq/ntpq-opts.h +++ b/contrib/ntp/ntpq/ntpq-opts.h @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpq-opts.h) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:26:55 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:26 AM EST * From the definitions ntpq-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntpq copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntpq copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -68,8 +68,8 @@ typedef enum { } teOptIndex; #define OPTION_CT 13 -#define NTPQ_VERSION "4.2.4p5" -#define NTPQ_FULL_VERSION "ntpq - standard NTP query program - Ver. 4.2.4p5" +#define NTPQ_VERSION "4.2.4p8" +#define NTPQ_FULL_VERSION "ntpq - standard NTP query program - Ver. 4.2.4p8" /* * Interface defines for all options. Replace "n" with the UPPER_CASED @@ -176,7 +176,7 @@ typedef enum { ntpqOptions.pzCurOpt = NULL ) #define START_OPT RESTART_OPT(1) #define USAGE(c) (*ntpqOptions.pUsageProc)( &ntpqOptions, c ) -/* extracted from /usr/local/gnu/share/autogen/opthead.tpl near line 360 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/opthead.tpl near line 360 */ /* * * * * * * diff --git a/contrib/ntp/ntpq/ntpq-opts.texi b/contrib/ntp/ntpq/ntpq-opts.texi index 0c4ca7d9c669..a0618cead0c1 100644 --- a/contrib/ntp/ntpq/ntpq-opts.texi +++ b/contrib/ntp/ntpq/ntpq-opts.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (ntpq-opts.texi) # -# It has been AutoGen-ed Sunday August 17, 2008 at 05:26:58 AM EDT +# It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:28 AM EST # From the definitions ntpq-opts.def # and the template file aginfo.tpl @end ignore @@ -46,12 +46,15 @@ This is the automatically generated usage text for ntpq: @exampleindent 0 @example -ntpq - standard NTP query program - Ver. 4.2.5p113 +ntpq - standard NTP query program - Ver. 4.2.5p247-RC USAGE: ntpq [ - [] | --[@{=| @}] ]... [ host ...] Flg Arg Option-Name Description -4 no ipv4 Force IPv4 DNS name resolution + - prohibits these options: + ipv6 -6 no ipv6 Force IPv6 DNS name resolution - - an alternate for ipv4 + - prohibits these options: + ipv4 -c Str command run a command and exit - may appear multiple times -d no debug-level Increase output debug message level @@ -66,8 +69,9 @@ USAGE: ntpq [ - [] | --[@{=| @}] ]... [ host ...] command peers -n no numeric numeric host addresses + no old-rv Always output status line with readvar opt version Output version information and exit - -? no help Display usage information and exit + -? no help Display extended usage information and exit -! no more-help Extended usage information passed thru pager -> opt save-opts Save the option state to a config file -< Str load-opts Load options from a config file diff --git a/contrib/ntp/ntpq/ntpq.1 b/contrib/ntp/ntpq/ntpq.1 index d418636715b3..f65ae9aa422e 100644 --- a/contrib/ntp/ntpq/ntpq.1 +++ b/contrib/ntp/ntpq/ntpq.1 @@ -1,7 +1,7 @@ -.TH NTPQ 1 2008-08-17 "( 4.2.4p5)" "Programmer's Manual" +.TH NTPQ 1 2009-12-08 "( 4.2.4p8)" "Programmer's Manual" .\" EDIT THIS FILE WITH CAUTION (ntpq.1) .\" -.\" It has been AutoGen-ed Sunday August 17, 2008 at 05:26:57 AM EDT +.\" It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:27 AM EST .\" From the definitions ntpq-opts.def .\" and the template file agman1.tpl .\" @@ -372,7 +372,7 @@ is searched for within those directories. .SH AUTHOR David L. Mills and/or others .br -Please send bug reports to: http://bugs.ntp.isc.org, bugs@ntp.org +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org .PP .nf diff --git a/contrib/ntp/ntpq/ntpq.c b/contrib/ntp/ntpq/ntpq.c index 4835d7e3546f..2e51b35efad9 100644 --- a/contrib/ntp/ntpq/ntpq.c +++ b/contrib/ntp/ntpq/ntpq.c @@ -3187,7 +3187,7 @@ cookedprint( else { char b[12]; - (void) snprintf(b, sizeof(b), "%03lo", uval); + (void) snprintf(b, sizeof b, "%03lo", uval); output(fp, name, b); } break; diff --git a/contrib/ntp/packageinfo.sh b/contrib/ntp/packageinfo.sh index fe1a4ba1f53b..702373fd36bb 100644 --- a/contrib/ntp/packageinfo.sh +++ b/contrib/ntp/packageinfo.sh @@ -9,21 +9,21 @@ version=${proto}.${major}.${minor} # - Numeric values increment # - empty 'increments' to 1 # - NEW 'increments' to empty -point=5 +point=8 # Special. Normally unused. A suffix. #special=ag special= # [???] To start an RC cycle: RC->yes # To release from an RC cycle: rcpoint-> GO # ReleaseCandidate. 'yes' or 'no'. +#releasecandidate=yes releasecandidate=no -#releasecandidate=no # ChangeLog tag CLTAG=NTP_4_2_0 ### # The following is for ntp-stable. 2 cases: # - Numeric values increment -# - GO triggers a release +# - GO triggers a release (from releasecandidate=yes) # - - rcpoint gets set to 0 # - - releasecandidate gets set to no # - GRONK is for -dev diff --git a/contrib/ntp/parseutil/Makefile.in b/contrib/ntp/parseutil/Makefile.in index ce97f1c16482..3f56f677c75a 100644 --- a/contrib/ntp/parseutil/Makefile.in +++ b/contrib/ntp/parseutil/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -37,7 +35,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ ANSI2KNR = ../util/ansi2knr -noinst_PROGRAMS = @TESTDCF@ @DCFD@ EXTRA_PROGRAMS = testdcf$(EXEEXT) dcfd$(EXEEXT) subdir = parseutil DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in @@ -52,6 +49,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) dcfd_SOURCES = dcfd.c dcfd_OBJECTS = dcfd$U.$(OBJEXT) @@ -59,25 +57,25 @@ dcfd_LDADD = $(LDADD) testdcf_SOURCES = testdcf.c testdcf_OBJECTS = testdcf$U.$(OBJEXT) testdcf_LDADD = $(LDADD) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = dcfd.c testdcf.c DIST_SOURCES = dcfd.c testdcf.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -93,10 +91,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -109,11 +103,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -127,6 +120,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -140,8 +134,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -151,6 +144,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -164,16 +158,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -185,32 +174,45 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../util/ansi2knr no-dependencies AUTOMAKE_OPTIONS = ../util/ansi2knr +noinst_PROGRAMS = @TESTDCF@ @DCFD@ INCLUDES = -I$(top_srcdir)/include ETAGS_ARGS = Makefile.am DISTCLEANFILES = $(EXTRA_PROGRAMS) @@ -222,14 +224,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign parseutil/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign parseutil/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign parseutil/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign parseutil/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -247,19 +249,22 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list dcfd$(EXEEXT): $(dcfd_OBJECTS) $(dcfd_DEPENDENCIES) @rm -f dcfd$(EXEEXT) - $(LINK) $(dcfd_LDFLAGS) $(dcfd_OBJECTS) $(dcfd_LDADD) $(LIBS) + $(LINK) $(dcfd_OBJECTS) $(dcfd_LDADD) $(LIBS) testdcf$(EXEEXT): $(testdcf_OBJECTS) $(testdcf_DEPENDENCIES) @rm -f testdcf$(EXEEXT) - $(LINK) $(testdcf_LDFLAGS) $(testdcf_OBJECTS) $(testdcf_LDADD) $(LIBS) + $(LINK) $(testdcf_OBJECTS) $(testdcf_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -267,7 +272,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c ../util/ansi2knr: - cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr + $(am__cd) ../util && $(MAKE) $(AM_MAKEFLAGS) ./ansi2knr mostlyclean-kr: -test "$U" = "" || rm -f *_.c @@ -276,22 +281,22 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testdcf$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -307,82 +312,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -411,6 +419,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @@ -425,7 +434,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -433,18 +442,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -465,19 +494,23 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am +uninstall-am: + +.MAKE: ../util/ansi2knr check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ clean-generic clean-libtool clean-noinstPROGRAMS ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-kr mostlyclean-libtool pdf \ - pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am + pdf-am ps ps-am tags uninstall uninstall-am #EXTRA_DIST= TAGS @@ -485,6 +518,7 @@ check-local: @DCFD@ case "$(noinst_PROGRAMS)" in \ *dcfd*) ./dcfd -Y ;; \ esac + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/scripts/Makefile.in b/contrib/ntp/scripts/Makefile.in index 7aee5f7374e8..8577e771b5dd 100644 --- a/contrib/ntp/scripts/Makefile.in +++ b/contrib/ntp/scripts/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -55,15 +53,34 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = calc_tickadj checktime freq_adj html2man mkver \ ntp-wait ntpsweep ntptrace ntpver plot_summary summary +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(bindir)" -binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) $(noinst_SCRIPTS) SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -79,10 +96,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -95,11 +108,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -113,6 +125,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -126,8 +139,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -137,6 +149,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -150,16 +163,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -171,29 +179,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ bin_SCRIPTS = ntp-wait ntptrace noinst_SCRIPTS = calc_tickadj checktime freq_adj html2man mkver ntpsweep ntpver plot_summary summary EXTRA_DIST = VersionName fixautomakedepsmagic genCommitLog genver \ @@ -207,14 +227,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign scripts/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign scripts/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign scripts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign scripts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -232,6 +252,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): calc_tickadj: $(top_builddir)/config.status $(srcdir)/calc_tickadj.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ checktime: $(top_builddir)/config.status $(srcdir)/checktime.in @@ -256,33 +277,44 @@ summary: $(top_builddir)/config.status $(srcdir)/summary.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_SCRIPTS)'; for p in $$list; do \ + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - if test -f $$d$$p; then \ - f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ - echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ - else :; fi; \ - done + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) - @list='$(bin_SCRIPTS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: tags: TAGS TAGS: @@ -291,29 +323,32 @@ CTAGS: distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -322,7 +357,7 @@ check: check-am all-am: Makefile $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am @@ -344,6 +379,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -354,7 +390,7 @@ clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool +distclean-am: clean-am distclean-generic dvi: dvi-am @@ -362,18 +398,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-binSCRIPTS +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -392,17 +448,22 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binSCRIPTS uninstall-info-am +uninstall-am: uninstall-binSCRIPTS + +.MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ - install-binSCRIPTS install-data install-data-am install-exec \ - install-exec-am install-info install-info-am install-man \ + install-binSCRIPTS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-binSCRIPTS uninstall-info-am + uninstall uninstall-am uninstall-binSCRIPTS + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/sntp/Makefile.in b/contrib/ntp/sntp/Makefile.in index a3efa6a0251a..62acb87ad649 100644 --- a/contrib/ntp/sntp/Makefile.in +++ b/contrib/ntp/sntp/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -22,15 +23,12 @@ # in sbindir. Now that we offer a choice, look in the "other" installation # subdir to warn folks if there is another version there. -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = . +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -58,12 +56,12 @@ am__aclocal_m4_deps = $(top_srcdir)/libopts/m4/libopts.m4 \ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno + configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am__objects_1 = am_sntp_OBJECTS = internet.$(OBJEXT) main.$(OBJEXT) \ @@ -73,28 +71,57 @@ sntp_OBJECTS = $(am_sntp_OBJECTS) sntp_LDADD = $(LDADD) am__DEPENDENCIES_1 = sntp_DEPENDENCIES = $(am__DEPENDENCIES_1) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I. +DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(sntp_SOURCES) DIST_SOURCES = $(sntp_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ - install-exec-recursive install-info-recursive \ - install-recursive installcheck-recursive installdirs-recursive \ - pdf-recursive ps-recursive uninstall-info-recursive \ - uninstall-recursive + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) $(man_MANS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = libopts . @@ -102,16 +129,39 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ @@ -124,10 +174,6 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -137,11 +183,10 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -155,14 +200,14 @@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -170,16 +215,11 @@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -191,28 +231,40 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I libopts/m4 AM_CPPFLAGS = $(LIBOPTS_CFLAGS) @@ -255,15 +307,15 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/bincheck.mf $(am__config @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ - cd $(srcdir) && $(AUTOMAKE) --foreign \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -279,21 +331,22 @@ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENC $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) - cd $(srcdir) && $(AUTOCONF) + $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ - $(MAKE) stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) - cd $(top_srcdir) && $(AUTOHEADER) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ @@ -301,35 +354,50 @@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list sntp$(EXEEXT): $(sntp_OBJECTS) $(sntp_DEPENDENCIES) @rm -f sntp$(EXEEXT) - $(LINK) $(sntp_LDFLAGS) $(sntp_OBJECTS) $(sntp_LDADD) $(LIBS) + $(LINK) $(sntp_OBJECTS) $(sntp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -345,22 +413,22 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unix.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -372,53 +440,45 @@ clean-libtool: -rm -rf .libs _libs distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-man1: $(man1_MANS) $(man_MANS) + -rm -f libtool config.lt +install-man1: $(dist_man_MANS) $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + uninstall-man1: @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS) $(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. @@ -444,15 +504,14 @@ $(RECURSIVE_TARGETS): else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: +$(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ @@ -479,16 +538,16 @@ maintainer-clean-recursive: else \ local_target="$$target"; \ fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) @@ -496,14 +555,14 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ @@ -515,93 +574,126 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi $(am__remove_distdir) - mkdir $(distdir) - $(mkdir_p) $(distdir)/libopts/m4 - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ - || $(mkdir_p) "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) @@ -610,6 +702,14 @@ dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) @@ -636,6 +736,10 @@ distcheck: dist GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ @@ -647,9 +751,11 @@ distcheck: dist mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ @@ -671,13 +777,15 @@ distcheck: dist && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: - @cd $(distuninstallcheck_dir) \ + @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ @@ -701,7 +809,7 @@ all-am: Makefile $(PROGRAMS) $(MANS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive @@ -724,6 +832,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -746,20 +855,39 @@ dvi-am: html: html-recursive +html-am: + info: info-recursive info-am: install-data-am: install-man +install-dvi: install-dvi-recursive + +install-dvi-am: + install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-recursive + +install-html-am: install-info: install-info-recursive +install-info-am: + install-man: install-man1 +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-recursive @@ -782,30 +910,32 @@ ps: ps-recursive ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man - -uninstall-info: uninstall-info-recursive +uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 -.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ - check-am clean clean-binPROGRAMS clean-generic clean-libtool \ - clean-recursive ctags ctags-recursive dist dist-all dist-bzip2 \ - dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \ - distclean-compile distclean-generic distclean-hdr \ - distclean-libtool distclean-recursive distclean-tags \ - distcleancheck distdir distuninstallcheck dvi dvi-am html \ - html-am info info-am install install-am install-binPROGRAMS \ - install-data install-data-am install-exec install-exec-am \ - install-exec-hook install-info install-info-am install-man \ - install-man1 install-strip installcheck installcheck-am \ +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + ctags-recursive install install-am install-exec-am \ + install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags ctags-recursive dist \ + dist-all dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-info install-info-am \ + install-man install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic maintainer-clean-recursive \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-info-am uninstall-man \ - uninstall-man1 + uninstall-binPROGRAMS uninstall-man uninstall-man1 FRC: @@ -848,6 +978,7 @@ install-exec-hook: done # + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/sntp/aclocal.m4 b/contrib/ntp/sntp/aclocal.m4 index 21cd96033bd9..1994696b450f 100644 --- a/contrib/ntp/sntp/aclocal.m4 +++ b/contrib/ntp/sntp/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- +# generated automatically by aclocal 1.11 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -11,6 +11,14 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, +[m4_warning([this file was generated for autoconf 2.65. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 47 AC_PROG_LIBTOOL @@ -6175,7 +6183,7 @@ SED=$lt_cv_path_SED AC_MSG_RESULT([$SED]) ]) -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -6185,14 +6193,31 @@ AC_MSG_RESULT([$SED]) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) +[AM_AUTOMAKE_VERSION([1.11])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- @@ -6249,14 +6274,14 @@ am_aux_dir=`cd $ac_aux_dir && pwd` # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 7 +# serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- @@ -6265,8 +6290,11 @@ AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' @@ -6280,15 +6308,14 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 8 +# serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, @@ -6316,6 +6343,7 @@ AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) @@ -6344,6 +6372,16 @@ AC_CACHE_CHECK([dependency style of $depcc], if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -6361,7 +6399,17 @@ AC_CACHE_CHECK([dependency style of $depcc], done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -6371,18 +6419,23 @@ AC_CACHE_CHECK([dependency style of $depcc], break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -6433,61 +6486,74 @@ if test "x$enable_dependency_tracking" != xno; then AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -#serial 3 +#serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done done -done +} ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -6518,14 +6584,14 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 12 +# serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. @@ -6542,16 +6608,20 @@ AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl +[AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi fi # test whether we have cygpath @@ -6571,6 +6641,9 @@ m4_ifval([$2], AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl @@ -6586,8 +6659,8 @@ AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. @@ -6595,20 +6668,37 @@ AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header @@ -6619,18 +6709,19 @@ AC_PROVIDE_IFELSE([AC_PROG_CXX], # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $1 | $1:* ) + $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -6641,7 +6732,14 @@ echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. @@ -6667,13 +6765,13 @@ AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # AM_MAKE_INCLUDE() # ----------------- @@ -6682,7 +6780,7 @@ AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. @@ -6692,24 +6790,24 @@ am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) @@ -6719,14 +6817,14 @@ rm -f confinc confmf # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ @@ -6742,7 +6840,15 @@ AC_SUBST($1)]) # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " @@ -6752,7 +6858,7 @@ else fi ]) -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -6760,70 +6866,33 @@ fi # AM_PROG_MKDIR_P # --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) +# Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 3 +# serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- @@ -6840,7 +6909,7 @@ AC_DEFUN([_AM_SET_OPTION], # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- @@ -6850,14 +6919,14 @@ AC_DEFUN([_AM_IF_OPTION], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. -# serial 4 +# serial 5 # AM_SANITY_CHECK # --------------- @@ -6866,16 +6935,29 @@ AC_DEFUN([AM_SANITY_CHECK], # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ @@ -6925,9 +7007,28 @@ dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. diff --git a/contrib/ntp/sntp/config.h.in b/contrib/ntp/sntp/config.h.in index 067a3de20a81..ae394d728aba 100644 --- a/contrib/ntp/sntp/config.h.in +++ b/contrib/ntp/sntp/config.h.in @@ -43,6 +43,9 @@ /* Define to 1 if you have the `inet_ntoa' function. */ #undef HAVE_INET_NTOA +/* inline keyword or macro available */ +#undef HAVE_INLINE + /* Define to 1 if the system has the type `int16_t'. */ #undef HAVE_INT16_T @@ -64,15 +67,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LIBGEN_H -/* Define to 1 if you have the `m' library (-lm). */ -#undef HAVE_LIBM - -/* Define to 1 if you have the `nsl' library (-lnsl). */ -#undef HAVE_LIBNSL - -/* Define to 1 if you have the `socket' library (-lsocket). */ -#undef HAVE_LIBSOCKET - /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H @@ -249,33 +243,28 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION -/* Define to 1 if the C compiler supports function prototypes. */ -#undef PROTOTYPES - /* name of regex header file */ #undef REGEX_HEADER /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE -/* Define to 1 if the `setvbuf' function takes the buffering type as its - second argument and the buffer pointer as the third, as on System V before - release 3. */ -#undef SETVBUF_REVERSED - -/* The size of a `char*', as computed by sizeof. */ +/* The size of `char*', as computed by sizeof. */ #undef SIZEOF_CHARP -/* The size of a `int', as computed by sizeof. */ +/* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT -/* The size of a `long', as computed by sizeof. */ +/* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG -/* The size of a `short', as computed by sizeof. */ +/* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* Define to 1 if you have the ANSI C header files. */ @@ -293,13 +282,16 @@ /* Define this if a working libregex can be found */ #undef WITH_LIBREGEX -/* Define like PROTOTYPES; this can be used by system headers. */ -#undef __PROTOTYPES - /* Define to empty if `const' does not conform to ANSI C. */ #undef const -/* Define to `unsigned' if does not define. */ +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `unsigned int' if does not define. */ #undef size_t /* normalize ss_family access */ diff --git a/contrib/ntp/sntp/configure b/contrib/ntp/sntp/configure index fd313847a8f7..1bcdaf7abcc8 100755 --- a/contrib/ntp/sntp/configure +++ b/contrib/ntp/sntp/configure @@ -1,81 +1,415 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59. +# Generated by GNU Autoconf 2.65. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# # -# Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset + setopt NO_GLOB_SUBST else - as_unset=false + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac fi -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` - -# PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -83,146 +417,107 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s/-\n.*// ' >$as_me.lineno && - chmod +x $as_me.lineno || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" # Exit status is that of the last command. exit } - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -231,16 +526,6 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - - # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} @@ -391,32 +676,25 @@ fi -tagnames=${tagnames+${tagnames},}CXX - -tagnames=${tagnames+${tagnames},}F77 +test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` -exec 6>&1 - # # Initializations. # ac_default_prefix=/usr/local +ac_clean_files= ac_config_libobj_dir=. +LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Maximum number of lines to put in a shell here document. -# This variable seems obsolete. It should probably be removed, and -# only ac_max_sed_lines should be used. -: ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= @@ -424,52 +702,189 @@ PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= +PACKAGE_URL= ac_unique_file="main.c" ac_unique_file="header.h" # Factoring default headers for most tests. ac_includes_default="\ #include -#if HAVE_SYS_TYPES_H +#ifdef HAVE_SYS_TYPES_H # include #endif -#if HAVE_SYS_STAT_H +#ifdef HAVE_SYS_STAT_H # include #endif -#if STDC_HEADERS +#ifdef STDC_HEADERS # include # include #else -# if HAVE_STDLIB_H +# ifdef HAVE_STDLIB_H # include # endif #endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif -#if HAVE_STRINGS_H +#ifdef HAVE_STRINGS_H # include #endif -#if HAVE_INTTYPES_H +#ifdef HAVE_INTTYPES_H # include -#else -# if HAVE_STDINT_H -# include -# endif #endif -#if HAVE_UNISTD_H +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOPTS_DIR INSTALL_LIBOPTS_TRUE INSTALL_LIBOPTS_FALSE NEED_LIBOPTS_TRUE NEED_LIBOPTS_FALSE LIBOPTS_LDADD LIBOPTS_CFLAGS LIBOBJS BINSUBDIR LTLIBOBJS' +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +BINSUBDIR +HAVE_INLINE +LIBOPTS_CFLAGS +LIBOPTS_LDADD +NEED_LIBOPTS_FALSE +NEED_LIBOPTS_TRUE +INSTALL_LIBOPTS_FALSE +INSTALL_LIBOPTS_TRUE +LIBOPTS_DIR +LIBTOOL +CPP +RANLIB +AR +ECHO +LN_S +EGREP +GREP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_shared +enable_static +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_pic +with_tags +enable_local_libopts +enable_libopts_install +with_autoopts_config +with_regex_header +with_libregex +with_libregex_cflags +with_libregex_libs +enable_optional_args +with_binsubdir +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + # Initialize some variables set by options. ac_init_help= ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null @@ -492,34 +907,48 @@ x_libraries=NONE # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' ac_prev= +ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" + eval $ac_prev=\$ac_option ac_prev= continue fi - ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -541,33 +970,59 @@ do --config-cache | -C) cache_file=config.cache ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) + -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - eval "enable_$ac_feature=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "enable_$ac_feature='$ac_optarg'" ;; + eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -594,6 +1049,12 @@ do -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; @@ -618,13 +1079,16 @@ do | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) @@ -689,6 +1153,16 @@ do | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; @@ -739,26 +1213,36 @@ do ac_init_version=: ;; -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package| sed 's/-/_/g'` - case $ac_option in - *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "with_$ac_package='$ac_optarg'" ;; + eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/-/_/g'` - eval "with_$ac_package=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. @@ -778,26 +1262,25 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` - eval "$ac_envvar='$ac_optarg'" + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; @@ -806,31 +1289,36 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } + as_fn_error "missing argument to $ac_option" fi -# Be sure to have absolute paths. -for ac_var in exec_prefix prefix -do - eval ac_val=$`echo $ac_var` - case $ac_val in - [\\/$]* | ?:[\\/]* | NONE | '' ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac -done +fi -# Be sure to have absolute paths. -for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ - localstatedir libdir includedir oldincludedir infodir mandir +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - eval ac_val=$`echo $ac_var` + eval ac_val=\$$ac_var + # Remove trailing slashes. case $ac_val in - [\\/$]* | ?:[\\/]* ) ;; - *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; };; + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -844,7 +1332,7 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes @@ -857,94 +1345,72 @@ test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_confdir=`(dirname "$0") 2>/dev/null || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 - { (exit 1); exit 1; }; } - else - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } - fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi -(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || - { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 - { (exit 1); exit 1; }; } -srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` -ac_env_build_alias_set=${build_alias+set} -ac_env_build_alias_value=$build_alias -ac_cv_env_build_alias_set=${build_alias+set} -ac_cv_env_build_alias_value=$build_alias -ac_env_host_alias_set=${host_alias+set} -ac_env_host_alias_value=$host_alias -ac_cv_env_host_alias_set=${host_alias+set} -ac_cv_env_host_alias_value=$host_alias -ac_env_target_alias_set=${target_alias+set} -ac_env_target_alias_value=$target_alias -ac_cv_env_target_alias_set=${target_alias+set} -ac_cv_env_target_alias_value=$target_alias -ac_env_CC_set=${CC+set} -ac_env_CC_value=$CC -ac_cv_env_CC_set=${CC+set} -ac_cv_env_CC_value=$CC -ac_env_CFLAGS_set=${CFLAGS+set} -ac_env_CFLAGS_value=$CFLAGS -ac_cv_env_CFLAGS_set=${CFLAGS+set} -ac_cv_env_CFLAGS_value=$CFLAGS -ac_env_LDFLAGS_set=${LDFLAGS+set} -ac_env_LDFLAGS_value=$LDFLAGS -ac_cv_env_LDFLAGS_set=${LDFLAGS+set} -ac_cv_env_LDFLAGS_value=$LDFLAGS -ac_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_env_CPPFLAGS_value=$CPPFLAGS -ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} -ac_cv_env_CPPFLAGS_value=$CPPFLAGS -ac_env_CPP_set=${CPP+set} -ac_env_CPP_value=$CPP -ac_cv_env_CPP_set=${CPP+set} -ac_cv_env_CPP_value=$CPP -ac_env_CXX_set=${CXX+set} -ac_env_CXX_value=$CXX -ac_cv_env_CXX_set=${CXX+set} -ac_cv_env_CXX_value=$CXX -ac_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_env_CXXFLAGS_value=$CXXFLAGS -ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} -ac_cv_env_CXXFLAGS_value=$CXXFLAGS -ac_env_CXXCPP_set=${CXXCPP+set} -ac_env_CXXCPP_value=$CXXCPP -ac_cv_env_CXXCPP_set=${CXXCPP+set} -ac_cv_env_CXXCPP_value=$CXXCPP -ac_env_F77_set=${F77+set} -ac_env_F77_value=$F77 -ac_cv_env_F77_set=${F77+set} -ac_cv_env_F77_value=$F77 -ac_env_FFLAGS_set=${FFLAGS+set} -ac_env_FFLAGS_value=$FFLAGS -ac_cv_env_FFLAGS_set=${FFLAGS+set} -ac_cv_env_FFLAGS_value=$FFLAGS +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done # # Report the --help message. @@ -973,14 +1439,11 @@ Configuration: -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] -_ACEOF - - cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] + [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] + [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify @@ -990,18 +1453,25 @@ for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data [PREFIX/share] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --infodir=DIR info documentation [PREFIX/info] - --mandir=DIR man documentation [PREFIX/man] + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF @@ -1022,14 +1492,13 @@ if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors - --enable-shared[=PKGS] - build shared libraries [default=no] - --enable-static[=PKGS] - build static libraries [default=yes] + --enable-shared[=PKGS] build shared libraries [default=no] + --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) @@ -1044,8 +1513,7 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] - --with-tags[=TAGS] - include additional configurations [automatic] + --with-tags[=TAGS] include additional configurations [automatic] --with-autoopts-config specify the config-info script --with-regex-header a reg expr header is specified --with-libregex libregex installation prefix @@ -1058,131 +1526,681 @@ Some influential environment variables: CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory - CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have - headers in a nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory CPP C preprocessor - CXX C++ compiler command - CXXFLAGS C++ compiler flags - CXXCPP C++ preprocessor - F77 Fortran 77 compiler command - FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. +Report bugs to the package provider. _ACEOF +ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. - ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d $ac_dir || continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac - - cd $ac_dir - # Check for guested configure; otherwise get Cygnus style configure. - if test -f $ac_srcdir/configure.gnu; then - echo - $SHELL $ac_srcdir/configure.gnu --help=recursive - elif test -f $ac_srcdir/configure; then - echo - $SHELL $ac_srcdir/configure --help=recursive - elif test -f $ac_srcdir/configure.ac || - test -f $ac_srcdir/configure.in; then - echo - $ac_configure --help + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi - cd $ac_popdir + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } done fi -test -n "$ac_init_help" && exit 0 +test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF +configure +generated by GNU Autoconf 2.65 -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF - exit 0 + exit fi -exec 5>config.log -cat >&5 <<_ACEOF + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_type + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF +exec 5>>config.log { cat <<_ASUNAME ## --------- ## @@ -1201,7 +2219,7 @@ uname -v = `(uname -v) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` @@ -1213,8 +2231,9 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS } >&5 @@ -1236,7 +2255,6 @@ _ACEOF ac_configure_args= ac_configure_args0= ac_configure_args1= -ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do @@ -1247,13 +2265,13 @@ do -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" + as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else @@ -1269,21 +2287,19 @@ do -* ) ac_must_keep_next=true ;; esac fi - ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" - # Get rid of the leading space. - ac_sep=" " + as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. -# WARNING: Be sure not to use single quotes in there, as some shells, -# such as our DU 5.0 friend, will then `close' the trap. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { @@ -1296,20 +2312,35 @@ trap 'exit_status=$? _ASBOX echo # The following way of writing the cache mishandles newlines in values, -{ +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done (set) 2>&1 | - case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in - *ac_space=\ *) + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) sed -n \ - "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" - ;; + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( *) - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} + esac | + sort +) echo cat <<\_ASBOX @@ -1320,22 +2351,28 @@ _ASBOX echo for ac_var in $ac_subst_vars do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX -## ------------- ## -## Output files. ## -## ------------- ## +## ------------------- ## +## File substitutions. ## +## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do - eval ac_val=$`echo $ac_var` - echo "$ac_var='"'"'$ac_val'"'"'" + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi @@ -1347,26 +2384,26 @@ _ASBOX ## ----------- ## _ASBOX echo - sed "/^$/d" confdefs.h | sort + cat confdefs.h echo fi test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" } >&5 - rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status - ' 0 +' 0 for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. @@ -1374,112 +2411,128 @@ cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF - cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + # Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in - [\\/]* | ?:[\\/]* ) . $cache_file;; - *) . ./$cache_file;; + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; esac fi else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false -for ac_var in `(set) 2>&1 | - sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do +for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val="\$ac_cv_env_${ac_var}_value" - eval ac_new_val="\$ac_env_${ac_var}_value" + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) - ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -1488,48 +2541,30 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +am__api_version='1.11' - - - - - - - - - - - - - - - - -am__api_version="1.9" ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f $ac_dir/shtool; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or @@ -1544,22 +2579,23 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. -echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. @@ -1567,7 +2603,7 @@ case $as_dir/ in # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -1577,30 +2613,43 @@ case $as_dir/ in # program-specific install script used by HP pwplus--don't use. : else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi fi fi done done ;; esac -done + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi -echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -1610,21 +2659,34 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` + set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ @@ -1634,11 +2696,8 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file @@ -1647,81 +2706,206 @@ then # Ok. : else - { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } test "$program_prefix" != NONE && - program_transform_name="s,^,$program_prefix,;$program_transform_name" + program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && - program_transform_name="s,\$,$program_suffix,;$program_transform_name" -# Double any \ or $. echo might interpret backslashes. + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. # By default was `s,x,x', remove it if useless. -cat <<\_ACEOF >conftest.sed -s/[\\$]/&&/g;s/;s,x,x,$// -_ACEOF -program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm conftest.sed +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= - { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else - mkdir_p='$(install_sh) -d' + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" fi fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. @@ -1731,55 +2915,59 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$AWK" && break done -echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF +SHELL = /bin/sh all: - @echo 'ac_maketemp="$(MAKE)"' + @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac rm -f conftest.make fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } SET_MAKE= else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -1792,12 +2980,14 @@ else fi rmdir .tst 2>/dev/null -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi fi # test whether we have cygpath @@ -1840,96 +3030,6 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -install_sh=${install_sh-"$am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - STRIP=$ac_ct_STRIP -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. @@ -1944,60 +3044,77 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # Make sure we can run config.sub. -$ac_config_sub sun4 >/dev/null 2>&1 || - { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 -echo "$as_me: error: cannot run $ac_config_sub" >&2;} - { (exit 1); exit 1; }; } +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -echo "$as_me:$LINENO: checking build system type" >&5 -echo $ECHO_N "checking build system type... $ECHO_C" >&6 -if test "${ac_cv_build+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_build_alias=$build_alias -test -z "$ac_cv_build_alias" && - ac_cv_build_alias=`$ac_config_guess` -test -z "$ac_cv_build_alias" && - { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} - { (exit 1); exit 1; }; } + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi -echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -echo "${ECHO_T}$ac_cv_build" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; +esac build=$ac_cv_build -build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -echo "$as_me:$LINENO: checking host system type" >&5 -echo $ECHO_N "checking host system type... $ECHO_C" >&6 -if test "${ac_cv_host+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_host_alias=$host_alias -test -z "$ac_cv_host_alias" && - ac_cv_host_alias=$ac_cv_build_alias -ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || - { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 -echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} - { (exit 1); exit 1; }; } + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi fi -echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -echo "${ECHO_T}$ac_cv_host" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; +esac host=$ac_cv_host -host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - ac_config_headers="$ac_config_headers config.h" +ac_config_headers="$ac_config_headers config.h" # Checks for programs. @@ -2009,10 +3126,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2022,35 +3139,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -2060,39 +3179,50 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2102,77 +3232,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + fi -done -done - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - CC=$ac_ct_CC -else - CC="$ac_cv_prog_CC" -fi - fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2183,18 +3273,19 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. @@ -2212,24 +3303,25 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. @@ -2239,39 +3331,41 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - echo "$as_me:$LINENO: result: $CC" >&5 -echo "${ECHO_T}$CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl + for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. @@ -2281,66 +3375,78 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 -echo "${ECHO_T}$ac_ct_CC" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi fi -test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&5 -echo "$as_me: error: no acceptable C compiler found in \$PATH -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2352,112 +3458,109 @@ main () } _ACEOF ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 -echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 - (eval $ac_link_default) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -# Be careful to initialize this variable, since it used to be cached. -# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. -ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) - ;; - conftest.$ac_ext ) - # This is the source file. + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - # FIXME: I believe we export ac_cv_exeext for Libtool, - # but it would be cool to find out if it's true. Does anybody - # maintain Libtool? --akim. - export ac_cv_exeext + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. break;; * ) break;; esac done +test "$ac_cv_exeext" = no && ac_cv_exeext= + else - echo "$as_me: failed program was:" >&5 + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: C compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } fi - +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6 -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether the C compiler works" >&5 -echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -rm -f a.out a.exe conftest$ac_cv_exeext b.out +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -# Check the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6 - -echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -2465,38 +3568,90 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - export ac_cv_exeext break;; * ) break;; esac done else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } fi - -rm -f conftest$ac_cv_exeext -echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6 +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT -echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} _ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2508,45 +3663,46 @@ main () } _ACEOF rm -f conftest.o conftest.obj -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else - echo "$as_me: failed program was:" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } fi - rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 -if test "${ac_cv_c_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2560,55 +3716,34 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no + ac_compiler_gnu=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 -GCC=`test $ac_compiler_gnu = yes && echo yes` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 -echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -2619,39 +3754,49 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_cv_prog_cc_g=no +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then @@ -2667,18 +3812,14 @@ else CFLAGS= fi fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_cv_prog_cc_stdc=no + ac_cv_prog_cc_c89=no ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -2706,12 +3847,17 @@ static char *f (char * (*g) (char **, int), char **p, ...) /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; @@ -2726,205 +3872,37 @@ return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; return 0; } _ACEOF -# Don't try gcc -ansi; that turns off useful extensions and -# breaks some systems' header files. -# AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 -# HP-UX 10.20 and later -Ae -# HP-UX older versions -Aa -D_HPUX_SOURCE -# SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cc_stdc=$ac_arg -break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg fi -rm -f conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break done -rm -f conftest.$ac_ext conftest.$ac_objext +rm -f conftest.$ac_ext CC=$ac_save_CC fi - -case "x$ac_cv_prog_cc_stdc" in - x|xno) - echo "$as_me:$LINENO: result: none needed" >&5 -echo "${ECHO_T}none needed" >&6 ;; +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; *) - echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 - CC="$CC $ac_cv_prog_cc_stdc" ;; + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac - -# Some people use a C++ compiler to compile C. Since we use `exit', -# in C++ we need to declare it. In case someone uses the same compiler -# for both compiling C and C++ we need to have the C++ compiler decide -# the declaration of exit, since it's the most demanding environment. -cat >conftest.$ac_ext <<_ACEOF -#ifndef __cplusplus - choke me -#endif -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if test "x$ac_cv_prog_cc_c89" != xno; then : fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -2932,60 +3910,58 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" - ac_config_commands="$ac_config_commands depfiles" +ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: - @echo done + @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. -echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac fi -echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } rm -f confinc confmf -# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval="$enable_dependency_tracking" +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi -fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi - - -if test "x$enable_dependency_tracking" != xno; then + if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else @@ -2995,13 +3971,12 @@ fi - depcc="$CC" am_compiler_list= -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up @@ -3026,6 +4001,11 @@ else if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and @@ -3043,7 +4023,17 @@ else done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested @@ -3053,18 +4043,23 @@ else break fi ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; none) break ;; esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message @@ -3088,13 +4083,11 @@ else fi fi -echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type - - -if + if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= @@ -3108,10 +4101,9 @@ fi # So far, the only shared library we might use is libopts. # It's a small library - we might as well use a static version of it. -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; @@ -3130,14 +4122,17 @@ if test "${enable_shared+set}" = set; then esac else enable_shared=no -fi; +fi -# Check whether --enable-static or --disable-static was given. -if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} + + + + +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; @@ -3156,12 +4151,12 @@ if test "${enable_static+set}" = set; then esac else enable_static=yes -fi; +fi -# Check whether --enable-fast-install or --disable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval="$enable_fast_install" - p=${PACKAGE-default} + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; @@ -3180,12 +4175,13 @@ if test "${enable_fast_install+set}" = set; then esac else enable_fast_install=yes -fi; +fi -echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 -if test "${lt_cv_path_SED+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${lt_cv_path_SED+set}" = set; then : + $as_echo_n "(cached) " >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. @@ -3236,37 +4232,152 @@ done fi SED=$lt_cv_path_SED -echo "$as_me:$LINENO: result: $SED" >&5 -echo "${ECHO_T}$SED" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +$as_echo "$SED" >&6; } -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no -fi; +fi + ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw @@ -3295,14 +4406,14 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 ;; esac elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } fi -if test "${lt_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +if test "${lt_cv_path_LD+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR @@ -3332,19 +4443,17 @@ fi LD="$lt_cv_path_LD" if test -n "$LD"; then - echo "$as_me:$LINENO: result: $LD" >&5 -echo "${ECHO_T}$LD" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -if test "${lt_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then : + $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld -echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 -echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 -if test "${lt_cv_ld_reload_flag+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi -echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 -echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -3386,10 +4495,10 @@ case $host_os in ;; esac -echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 -echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 -if test "${lt_cv_path_NM+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD-compatible nm" >&5 +$as_echo_n "checking for BSD-compatible nm... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. @@ -3428,25 +4537,25 @@ else test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi -echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -echo "${ECHO_T}$lt_cv_path_NM" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } NM="$lt_cv_path_NM" -echo "$as_me:$LINENO: checking whether ln -s works" >&5 -echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -echo "${ECHO_T}no, using $LN_S" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } fi -echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 -echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 -if test "${lt_cv_deplibs_check_method+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognise dependent libraries" >&5 +$as_echo_n "checking how to recognise dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= @@ -3615,8 +4724,8 @@ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) esac fi -echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown @@ -3631,11 +4740,11 @@ LTCC=${LTCC-"$CC"} compiler=$CC -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi -fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good @@ -3644,11 +4753,11 @@ case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" @@ -3662,12 +4771,12 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 3665 "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + echo '#line 4774 "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) @@ -3700,11 +4809,11 @@ ia64-*-hpux*) x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in @@ -3747,10 +4856,10 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" - echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 -if test "${lt_cv_cc_needs_belf+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -3758,11 +4867,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -3773,37 +4878,13 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -lt_cv_cc_needs_belf=no + lt_cv_cc_needs_belf=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3811,8 +4892,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" @@ -3829,15 +4910,15 @@ ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" @@ -3851,11 +4932,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -3864,68 +4941,24 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break @@ -3935,7 +4968,7 @@ rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then +if $ac_preproc_ok; then : break fi @@ -3947,8 +4980,8 @@ fi else ac_cv_prog_CPP=$CPP fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do @@ -3958,11 +4991,7 @@ do # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include @@ -3971,68 +5000,24 @@ cat >>conftest.$ac_ext <<_ACEOF #endif Syntax error _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_cpp "$LINENO"; then : +else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext - # OK, works on sane cases. Now check whether non-existent headers + # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then +if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. ac_preproc_ok=: break @@ -4042,14 +5027,13 @@ rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : +if $ac_preproc_ok; then : + else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c @@ -4059,16 +5043,12 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -4083,51 +5063,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4137,18 +5089,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -4158,16 +5106,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -4187,109 +5132,40 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -4297,1103 +5173,26 @@ fi done - for ac_header in dlfcn.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define HAVE_DLFCN_H 1 _ACEOF fi done -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_CXX" && break -done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - - CXX=$ac_ct_CXX -fi - - -# Provide some information about the compiler. -echo "$as_me:$LINENO:" \ - "checking for C++ compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 -GXX=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" -echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_cxx_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_cxx_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -for ac_declaration in \ - '' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -#include -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -continue -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_declaration -int -main () -{ -exit (42); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -rm -f conftest* -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -depcc="$CXX" am_compiler_list= - -echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - - -if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - - -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 -if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6 -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -fi - - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu -if test -n "$ac_tool_prefix"; then - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$F77"; then - ac_cv_prog_F77="$F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_F77="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -F77=$ac_cv_prog_F77 -if test -n "$F77"; then - echo "$as_me:$LINENO: result: $F77" >&5 -echo "${ECHO_T}$F77" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$F77" && break - done -fi -if test -z "$F77"; then - ac_ct_F77=$F77 - for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_F77"; then - ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_F77="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi -fi -ac_ct_F77=$ac_cv_prog_ac_ct_F77 -if test -n "$ac_ct_F77"; then - echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 -echo "${ECHO_T}$ac_ct_F77" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - - test -n "$ac_ct_F77" && break -done - - F77=$ac_ct_F77 -fi - - -# Provide some information about the compiler. -echo "$as_me:5244:" \ - "checking for Fortran 77 compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 - (eval $ac_compiler --version &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 - (eval $ac_compiler -v &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 - (eval $ac_compiler -V &5) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -rm -f a.out - -# If we don't use `.F' as extension, the preprocessor is not run on the -# input file. (Note that this only needs to work for GNU compilers.) -ac_save_ext=$ac_ext -ac_ext=F -echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 -if test "${ac_cv_f77_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF - program main -#ifndef __GNUC__ - choke me -#endif - - end -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_compiler_gnu=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_f77_compiler_gnu=$ac_compiler_gnu - -fi -echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 -ac_ext=$ac_save_ext -ac_test_FFLAGS=${FFLAGS+set} -ac_save_FFLAGS=$FFLAGS -FFLAGS= -echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 -echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 -if test "${ac_cv_prog_f77_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - FFLAGS=-g -cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_prog_f77_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_prog_f77_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 -echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 -if test "$ac_test_FFLAGS" = set; then - FFLAGS=$ac_save_FFLAGS -elif test $ac_cv_prog_f77_g = yes; then - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-g -O2" - else - FFLAGS="-g" - fi -else - if test "x$ac_cv_f77_compiler_gnu" = xyes; then - FFLAGS="-O2" - else - FFLAGS= - fi -fi - -G77=`test $ac_compiler_gnu = yes && echo yes` -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments -echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 -echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 -if test "${lt_cv_sys_max_cmd_len+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then : + $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" @@ -5482,21 +5281,21 @@ else fi if test -n $lt_cv_sys_max_cmd_len ; then - echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 -echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } else - echo "$as_me:$LINENO: result: none" >&5 -echo "${ECHO_T}none" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } fi # Check for command to grab the raw symbol name followed by C symbol from nm. -echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : + $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. @@ -5589,18 +5388,18 @@ void nm_test_func(){} int main(){nm_test_var='a';nm_test_func();return(0);} EOF - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm - if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s "$nlist"; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -5651,11 +5450,11 @@ EOF lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" @@ -5689,17 +5488,17 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - echo "$as_me:$LINENO: result: failed" >&5 -echo "${ECHO_T}failed" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } else - echo "$as_me:$LINENO: result: ok" >&5 -echo "${ECHO_T}ok" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } fi -echo "$as_me:$LINENO: checking for objdir" >&5 -echo $ECHO_N "checking for objdir... $ECHO_C" >&6 -if test "${lt_cv_objdir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then : + $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null @@ -5711,8 +5510,8 @@ else fi rmdir .libs 2>/dev/null fi -echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -echo "${ECHO_T}$lt_cv_objdir" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir @@ -5763,10 +5562,10 @@ with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. @@ -5776,35 +5575,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. @@ -5814,28 +5615,38 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 -echo "${ECHO_T}$ac_ct_AR" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - AR=$ac_ct_AR + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi else AR="$ac_cv_prog_AR" fi @@ -5843,10 +5654,10 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. @@ -5856,35 +5667,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. @@ -5894,28 +5707,38 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi @@ -5923,10 +5746,10 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. @@ -5936,35 +5759,37 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi + fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. @@ -5974,28 +5799,38 @@ for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done -done + done +IFS=$as_save_IFS - test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - STRIP=$ac_ct_STRIP + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi else STRIP="$ac_cv_prog_STRIP" fi @@ -6053,10 +5888,10 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : + $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) @@ -6106,19 +5941,19 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - echo "$as_me:$LINENO: checking for file" >&5 -echo $ECHO_N "checking for file... $ECHO_C" >&6 -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : + $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) @@ -6168,11 +6003,11 @@ fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then - echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -echo "${ECHO_T}$MAGIC_CMD" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi else @@ -6187,21 +6022,21 @@ esac enable_dlopen=no enable_win32_dll=no -# Check whether --enable-libtool-lock or --disable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval="$enable_libtool_lock" +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi -fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes -# Check whether --with-pic or --without-pic was given. -if test "${with_pic+set}" = set; then - withval="$with_pic" - pic_mode="$withval" +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" else pic_mode=default -fi; +fi + test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script @@ -6261,12 +6096,12 @@ if test "$GCC" = no; then esac fi if test -n "$lt_prog_cc_shlib"; then - { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 -echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +$as_echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : else - { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 -echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +$as_echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} lt_cv_prog_cc_can_build_shared=no fi fi @@ -6275,10 +6110,10 @@ fi # # Check to make sure the static flag actually works. # -echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 -echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 -if test "${lt_prog_compiler_static_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +$as_echo_n "checking if $compiler static flag $lt_prog_compiler_static works... " >&6; } +if test "${lt_prog_compiler_static_works+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" @@ -6303,8 +6138,8 @@ else LDFLAGS="$save_LDFLAGS" fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_static_works" >&5 +$as_echo "$lt_prog_compiler_static_works" >&6; } if test x"$lt_prog_compiler_static_works" = xyes; then : @@ -6321,10 +6156,10 @@ if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' -echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext @@ -6339,11 +6174,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6342: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6177: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6346: \$? = $ac_status" >&5 + echo "$as_me:6181: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -6356,8 +6191,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -6371,8 +6206,8 @@ lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' @@ -6575,18 +6410,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test "${lt_prog_compiler_pic_works+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext @@ -6601,11 +6436,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6604: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6439: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6608: \$? = $ac_status" >&5 + echo "$as_me:6443: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -6618,8 +6453,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works" >&5 +$as_echo "$lt_prog_compiler_pic_works" >&6; } if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in @@ -6642,10 +6477,10 @@ case $host_os in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null @@ -6663,11 +6498,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6666: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6501: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:6670: \$? = $ac_status" >&5 + echo "$as_me:6505: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -6689,34 +6524,34 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -7067,11 +6902,7 @@ EOF # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7082,41 +6913,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -7128,11 +6934,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -7143,41 +6945,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -7611,8 +7388,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac fi -echo "$as_me:$LINENO: result: $ld_shlibs" >&5 -echo "${ECHO_T}$ld_shlibs" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -7637,16 +7414,16 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext @@ -7659,11 +7436,11 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } then archive_cmds_need_lc=no else @@ -7674,16 +7451,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 -echo "${ECHO_T}$archive_cmds_need_lc" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -8236,12 +8013,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ @@ -8265,8 +8042,8 @@ else # directories. hardcode_action=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action" >&5 -echo "${ECHO_T}$hardcode_action" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink; then # Fast installation is not supported @@ -8279,29 +8056,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } ;; esac fi @@ -8333,71 +8110,43 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -8410,458 +8159,168 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -8900,10 +8359,10 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross @@ -8911,7 +8370,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -8993,15 +8452,15 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross @@ -9009,7 +8468,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -9091,8 +8550,8 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -9114,13 +8573,13 @@ fi # Report which librarie types wil actually be built -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -9140,15 +8599,15 @@ aix4* | aix5*) fi ;; esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh @@ -9239,8 +8698,8 @@ if test -f "$ltmain"; then cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" - { echo "$as_me:$LINENO: creating $ofile" >&5 -echo "$as_me: creating $ofile" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 +$as_echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL @@ -9637,26 +9096,26 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" -# Check whether --with-tags or --without-tags was given. -if test "${with_tags+set}" = set; then - withval="$with_tags" - tagnames="$withval" -fi; +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then : + withval=$with_tags; tagnames="$withval" +fi + if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not exist" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then - { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 -echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else - { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 -echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi @@ -9670,17 +9129,13 @@ echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; - *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 -echo "$as_me: error: invalid tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } + *) as_fn_error "invalid tag name: $tagname" "$LINENO" 5 ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then - { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 -echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "tag name \"$tagname\" already exists" "$LINENO" 5 fi # Update the list of available tags. @@ -9692,3641 +9147,7 @@ echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then - ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - - -archive_cmds_need_lc_CXX=no -allow_undefined_flag_CXX= -always_export_symbols_CXX=no -archive_expsym_cmds_CXX= -export_dynamic_flag_spec_CXX= -hardcode_direct_CXX=no -hardcode_libdir_flag_spec_CXX= -hardcode_libdir_flag_spec_ld_CXX= -hardcode_libdir_separator_CXX= -hardcode_minus_L_CXX=no -hardcode_automatic_CXX=no -module_cmds_CXX= -module_expsym_cmds_CXX= -link_all_deplibs_CXX=unknown -old_archive_cmds_CXX=$old_archive_cmds -no_undefined_flag_CXX= -whole_archive_flag_spec_CXX= -enable_shared_with_static_runtimes_CXX=no - -# Dependencies to place before and after the object being linked: -predep_objects_CXX= -postdep_objects_CXX= -predeps_CXX= -postdeps_CXX= -compiler_lib_search_path_CXX= - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -objext_CXX=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;\n" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(int, char *) { return(0); }\n' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_LD=$LD -lt_save_GCC=$GCC -GCC=$GXX -lt_save_with_gnu_ld=$with_gnu_ld -lt_save_path_LD=$lt_cv_path_LD -if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx -else - unset lt_cv_prog_gnu_ld -fi -if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX -else - unset lt_cv_path_LD -fi -test -z "${LDCXX+set}" || LD=$LDCXX -CC=${CXX-"c++"} -compiler=$CC -compiler_CXX=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -# We don't want -fno-exception wen compiling C++ code, so set the -# no_builtin_flag separately -if test "$GXX" = yes; then - lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' -else - lt_prog_compiler_no_builtin_flag_CXX= -fi - -if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi; -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` - while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do - ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - echo "$as_me:$LINENO: checking for GNU ld" >&5 -echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 -else - echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 -fi -if test "${lt_cv_path_LD+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -echo "${ECHO_T}$LD" >&6 -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi -test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 -if test "${lt_cv_prog_gnu_ld+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ - grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_CXX= - fi - else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - -else - GXX=no - with_gnu_ld=no - wlarc= -fi - -# PORTME: fill in a description of your system's C++ link characteristics -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 -ld_shlibs_CXX=yes -case $host_os in - aix3*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_CXX='' - hardcode_direct_CXX=yes - hardcode_libdir_separator_CXX=':' - link_all_deplibs_CXX=yes - - if test "$GXX" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_CXX=yes - else - # We have old collect2 - hardcode_direct_CXX=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_CXX=yes - hardcode_libdir_flag_spec_CXX='-L$libdir' - hardcode_libdir_separator_CXX= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_CXX=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_CXX='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - - archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_CXX="-z nodefs" - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_CXX=' ${wl}-bernotok' - allow_undefined_flag_CXX=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_CXX=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_CXX=' ' - archive_cmds_need_lc_CXX=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_CXX='-L$libdir' - allow_undefined_flag_CXX=unsupported - always_export_symbols_CXX=no - enable_shared_with_static_runtimes_CXX=yes - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs_CXX=no - fi - ;; - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_direct_CXX=no - hardcode_automatic_CXX=yes - hardcode_shlibpath_var_CXX=unsupported - whole_archive_flag_spec_CXX='' - link_all_deplibs_CXX=yes - - if test "$GXX" = yes ; then - lt_int_apple_cc_single_mod=no - output_verbose_link_cmd='echo' - if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then - lt_int_apple_cc_single_mod=yes - fi - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - else - archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - fi - module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - if test "X$lt_int_apple_cc_single_mod" = Xyes ; then - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - fi - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs_CXX=no - ;; - esac - fi - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - freebsd[12]*) - # C++ shared libraries reported to be fairly broken before switch to ELF - ld_shlibs_CXX=no - ;; - freebsd-elf*) - archive_cmds_need_lc_CXX=no - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - ld_shlibs_CXX=yes - ;; - gnu*) - ;; - hpux9*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld_CXX='+b $libdir' - hardcode_libdir_separator_CXX=: - ;; - ia64*) - hardcode_libdir_flag_spec_CXX='-L$libdir' - ;; - *) - hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_CXX=: - export_dynamic_flag_spec_CXX='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - ;; - ia64*) - hardcode_direct_CXX=no - hardcode_shlibpath_var_CXX=no - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - *) - hardcode_direct_CXX=yes - hardcode_minus_L_CXX=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - aCC*) - case $host_cpu in - hppa*64*|ia64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - ia64*|hppa*64*) - archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' - ;; - *) - archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' - fi - fi - link_all_deplibs_CXX=yes - ;; - esac - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - ;; - linux*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc*) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - archive_cmds_need_lc_CXX=no - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC*) - # Portland Group C++ compiler - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_CXX='${wl}--export-dynamic' - whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - esac - ;; - lynxos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - m88k*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - openbsd2*) - # C++ shared libraries are fairly broken - ld_shlibs_CXX=no - ;; - openbsd*) - hardcode_direct_CXX=yes - hardcode_shlibpath_var_CXX=no - archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - export_dynamic_flag_spec_CXX='${wl}-E' - whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd='echo' - ;; - osf3*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' - - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' - hardcode_libdir_separator_CXX=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - cxx*) - allow_undefined_flag_CXX=' -expect_unresolved \*' - archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ - $rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-rpath $libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - - hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_CXX=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' - - else - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - fi - ;; - esac - ;; - psos*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - sco*) - archive_cmds_need_lc_CXX=no - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - archive_cmds_need_lc_CXX=yes - no_undefined_flag_CXX=' -zdefs' - archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - hardcode_libdir_flag_spec_CXX='-R$libdir' - hardcode_shlibpath_var_CXX=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The C++ compiler is used as linker so we must use $wl - # flag to pass the commands to the underlying system - # linker. We must also pass each convience library through - # to the system linker between allextract/defaultextract. - # The C++ compiler will combine linker options so we - # cannot just pass the convience library names through - # without $wl. - # Supported since Solaris 2.6 (maybe 2.5.1?) - whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' - ;; - esac - link_all_deplibs_CXX=yes - - output_verbose_link_cmd='echo' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - no_undefined_flag_CXX=' ${wl}-z ${wl}defs' - if $CC --version | grep -v '^2\.7' > /dev/null; then - archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" - fi - - hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' - fi - ;; - esac - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - archive_cmds_need_lc_CXX=no - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - esac - ;; - vxworks*) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; - *) - # FIXME: insert proper C++ library support - ld_shlibs_CXX=no - ;; -esac -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 -test "$ld_shlibs_CXX" = no && can_build_shared=no - -GCC_CXX="$GXX" -LD_CXX="$LD" - - -cat > conftest.$ac_ext <&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - # The `*' in the case matches for architectures that use `case' in - # $output_verbose_cmd can trigger glob expansion during the loop - # eval without this substitution. - output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` - - for p in `eval $output_verbose_link_cmd`; do - case $p in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" \ - || test $p = "-R"; then - prev=$p - continue - else - prev= - fi - - if test "$pre_test_object_deps_done" = no; then - case $p in - -L* | -R*) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$compiler_lib_search_path_CXX"; then - compiler_lib_search_path_CXX="${prev}${p}" - else - compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$postdeps_CXX"; then - postdeps_CXX="${prev}${p}" - else - postdeps_CXX="${postdeps_CXX} ${prev}${p}" - fi - fi - ;; - - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$predep_objects_CXX"; then - predep_objects_CXX="$p" - else - predep_objects_CXX="$predep_objects_CXX $p" - fi - else - if test -z "$postdep_objects_CXX"; then - postdep_objects_CXX="$p" - else - postdep_objects_CXX="$postdep_objects_CXX $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling CXX test program" -fi - -$rm -f confest.$objext - -# PORTME: override above test on systems where it is broken -case $host_os in -solaris*) - case $cc_basename in - CC*) - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - postdeps_CXX='-lCstd -lCrun' - ;; - esac -esac - - -case " $postdeps_CXX " in -*" -lc "*) archive_cmds_need_lc_CXX=no ;; -esac - -lt_prog_compiler_wl_CXX= -lt_prog_compiler_pic_CXX= -lt_prog_compiler_static_CXX= - -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - - # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - fi - ;; - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' - ;; - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - mingw* | os2* | pw32*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_CXX='-DDLL_EXPORT' - ;; - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_CXX='-fno-common' - ;; - *djgpp*) - # DJGPP does not support shared libraries at all - lt_prog_compiler_pic_CXX= - ;; - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_CXX=-Kconform_pic - fi - ;; - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - ;; - *) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - esac - else - case $host_os in - aix4* | aix5*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_CXX='-Bstatic' - else - lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' - fi - ;; - chorus*) - case $cc_basename in - cxch68*) - # Green Hills C++ Compiler - # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" - ;; - esac - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic_CXX='-qnocommon' - lt_prog_compiler_wl_CXX='-Wl,' - ;; - esac - ;; - dgux*) - case $cc_basename in - ec++*) - lt_prog_compiler_pic_CXX='-KPIC' - ;; - ghcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - # FreeBSD uses GNU C++ - ;; - hpux9* | hpux10* | hpux11*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - if test "$host_cpu" != ia64; then - lt_prog_compiler_pic_CXX='+Z' - fi - ;; - aCC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_CXX='+Z' - ;; - esac - ;; - *) - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case $cc_basename in - CC*) - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_static_CXX='-non_shared' - # CC pic flag -KPIC is the default. - ;; - *) - ;; - esac - ;; - linux*) - case $cc_basename in - KCC*) - # KAI C++ Compiler - lt_prog_compiler_wl_CXX='--backend -Wl,' - lt_prog_compiler_pic_CXX='-fPIC' - ;; - icpc* | ecpc*) - # Intel C++ - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-static' - ;; - pgCC*) - # Portland Group C++ compiler. - lt_prog_compiler_wl_CXX='-Wl,' - lt_prog_compiler_pic_CXX='-fpic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - cxx*) - # Compaq C++ - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - lynxos*) - ;; - m88k*) - ;; - mvs*) - case $cc_basename in - cxx*) - lt_prog_compiler_pic_CXX='-W c,exportall' - ;; - *) - ;; - esac - ;; - netbsd*) - ;; - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - lt_prog_compiler_wl_CXX='--backend -Wl,' - ;; - RCC*) - # Rational C++ 2.4.1 - lt_prog_compiler_pic_CXX='-pic' - ;; - cxx*) - # Digital/Compaq C++ - lt_prog_compiler_wl_CXX='-Wl,' - # Make sure the PIC flag is empty. It appears that all Alpha - # Linux and Compaq Tru64 Unix objects are PIC. - lt_prog_compiler_pic_CXX= - lt_prog_compiler_static_CXX='-non_shared' - ;; - *) - ;; - esac - ;; - psos*) - ;; - sco*) - case $cc_basename in - CC*) - lt_prog_compiler_pic_CXX='-fPIC' - ;; - *) - ;; - esac - ;; - solaris*) - case $cc_basename in - CC*) - # Sun C++ 4.2, 5.x and Centerline C++ - lt_prog_compiler_pic_CXX='-KPIC' - lt_prog_compiler_static_CXX='-Bstatic' - lt_prog_compiler_wl_CXX='-Qoption ld ' - ;; - gcx*) - # Green Hills C++ Compiler - lt_prog_compiler_pic_CXX='-PIC' - ;; - *) - ;; - esac - ;; - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - lt_prog_compiler_pic_CXX='-pic' - lt_prog_compiler_static_CXX='-Bstatic' - ;; - lcc*) - # Lucid - lt_prog_compiler_pic_CXX='-pic' - ;; - *) - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - lt_prog_compiler_pic_CXX='-KPIC' - ;; - *) - ;; - esac - ;; - unixware*) - ;; - vxworks*) - ;; - *) - lt_prog_compiler_can_build_shared_CXX=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_CXX"; then - -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_CXX=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11267: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:11271: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_CXX=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 - -if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then - case $lt_prog_compiler_pic_CXX in - "" | " "*) ;; - *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; - esac -else - lt_prog_compiler_pic_CXX= - lt_prog_compiler_can_build_shared_CXX=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_CXX= - ;; - *) - lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" - ;; -esac - -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_CXX=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:11329: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:11333: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_CXX=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 - - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - case $host_os in - aix4* | aix5*) - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - ;; - pw32*) - export_symbols_cmds_CXX="$ltdll_cmds" - ;; - cygwin* | mingw*) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - ;; - *) - export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; - esac - -echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 -echo "${ECHO_T}$ld_shlibs_CXX" >&6 -test "$ld_shlibs_CXX" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_CXX" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_CXX=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_CXX in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_CXX - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_CXX - allow_undefined_flag_CXX= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_CXX=no - else - archive_cmds_need_lc_CXX=yes - fi - allow_undefined_flag_CXX=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 - ;; - esac - fi - ;; -esac - -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 -test "$dynamic_linker" = no && can_build_shared=no - -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action_CXX= -if test -n "$hardcode_libdir_flag_spec_CXX" || \ - test -n "$runpath_var_CXX" || \ - test "X$hardcode_automatic_CXX" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_CXX" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && - test "$hardcode_minus_L_CXX" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_CXX=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_CXX=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_CXX=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 -echo "${ECHO_T}$hardcode_action_CXX" >&6 - -if test "$hardcode_action_CXX" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac -fi - -if test "x$enable_dlopen" != xyes; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen="load_add_on" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32*) - lt_cv_dlopen="LoadLibrary" - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen="dlopen" - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - - lt_cv_dlopen="dyld" - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then - lt_cv_dlopen="shl_load" -else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -int -main () -{ -shl_load (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then - lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" -else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then - lt_cv_dlopen="dlopen" -else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dl_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" -else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -int -main () -{ -dlopen (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_svld_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then - lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" -else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dld_link (); -int -main () -{ -dld_link (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_dld_dld_link=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then - lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else - enable_dlopen=no - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS="$LDFLAGS" - eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS="$LIBS" - LIBS="$lt_cv_dlopen_libs $LIBS" - - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 - - if test "x$lt_cv_dlopen_self" = xyes; then - LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext < -#endif - -#include - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -#ifdef __cplusplus -extern "C" void exit (int); -#endif - -void fnord() { int i=42;} -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - /* dlclose (self); */ - } - - exit (status); -} -EOF - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 - fi - - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_CXX \ - CC_CXX \ - LD_CXX \ - lt_prog_compiler_wl_CXX \ - lt_prog_compiler_pic_CXX \ - lt_prog_compiler_static_CXX \ - lt_prog_compiler_no_builtin_flag_CXX \ - export_dynamic_flag_spec_CXX \ - thread_safe_flag_spec_CXX \ - whole_archive_flag_spec_CXX \ - enable_shared_with_static_runtimes_CXX \ - old_archive_cmds_CXX \ - old_archive_from_new_cmds_CXX \ - predep_objects_CXX \ - postdep_objects_CXX \ - predeps_CXX \ - postdeps_CXX \ - compiler_lib_search_path_CXX \ - archive_cmds_CXX \ - archive_expsym_cmds_CXX \ - postinstall_cmds_CXX \ - postuninstall_cmds_CXX \ - old_archive_from_expsyms_cmds_CXX \ - allow_undefined_flag_CXX \ - no_undefined_flag_CXX \ - export_symbols_cmds_CXX \ - hardcode_libdir_flag_spec_CXX \ - hardcode_libdir_flag_spec_ld_CXX \ - hardcode_libdir_separator_CXX \ - hardcode_automatic_CXX \ - module_cmds_CXX \ - module_expsym_cmds_CXX \ - lt_cv_prog_compiler_c_o_CXX \ - exclude_expsyms_CXX \ - include_expsyms_CXX; do - - case $var in - old_archive_cmds_CXX | \ - old_archive_from_new_cmds_CXX | \ - archive_cmds_CXX | \ - archive_expsym_cmds_CXX | \ - module_cmds_CXX | \ - module_expsym_cmds_CXX | \ - old_archive_from_expsyms_cmds_CXX | \ - export_symbols_cmds_CXX | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_CXX - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_CXX -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_CXX - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_CXX - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_CXX - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_CXX" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC=$lt_save_CC -LDCXX=$LD -LD=$lt_save_LD -GCC=$lt_save_GCC -with_gnu_ldcxx=$with_gnu_ld -with_gnu_ld=$lt_save_with_gnu_ld -lt_cv_path_LDCXX=$lt_cv_path_LD -lt_cv_path_LD=$lt_save_path_LD -lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld -lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld - + : else tagname="" fi @@ -13334,2458 +9155,7 @@ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld F77) if test -n "$F77" && test "X$F77" != "Xno"; then - -ac_ext=f -ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' -ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_f77_compiler_gnu - - -archive_cmds_need_lc_F77=no -allow_undefined_flag_F77= -always_export_symbols_F77=no -archive_expsym_cmds_F77= -export_dynamic_flag_spec_F77= -hardcode_direct_F77=no -hardcode_libdir_flag_spec_F77= -hardcode_libdir_flag_spec_ld_F77= -hardcode_libdir_separator_F77= -hardcode_minus_L_F77=no -hardcode_automatic_F77=no -module_cmds_F77= -module_expsym_cmds_F77= -link_all_deplibs_F77=unknown -old_archive_cmds_F77=$old_archive_cmds -no_undefined_flag_F77= -whole_archive_flag_spec_F77= -enable_shared_with_static_runtimes_F77=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -objext_F77=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code=" subroutine t\n return\n end\n" - -# Code to be used in simple link tests -lt_simple_link_test_code=" program t\n end\n" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -printf "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$rm conftest* - -ac_outfile=conftest.$ac_objext -printf "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$rm conftest* - - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -CC=${F77-"f77"} -compiler=$CC -compiler_F77=$CC -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - -echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 -echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 -echo "$as_me:$LINENO: result: $can_build_shared" >&5 -echo "${ECHO_T}$can_build_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 -echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 -test "$can_build_shared" = "no" && enable_shared=no - -# On AIX, shared libraries and static libraries use the same namespace, and -# are all built from PIC. -case $host_os in -aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; -aix4* | aix5*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; -esac -echo "$as_me:$LINENO: result: $enable_shared" >&5 -echo "${ECHO_T}$enable_shared" >&6 - -echo "$as_me:$LINENO: checking whether to build static libraries" >&5 -echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 -# Make sure either enable_shared or enable_static is yes. -test "$enable_shared" = yes || enable_static=yes -echo "$as_me:$LINENO: result: $enable_static" >&5 -echo "${ECHO_T}$enable_static" >&6 - -test "$ld_shlibs_F77" = no && can_build_shared=no - -GCC_F77="$G77" -LD_F77="$LD" - -lt_prog_compiler_wl_F77= -lt_prog_compiler_pic_F77= -lt_prog_compiler_static_F77= - -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 - - if test "$GCC" = yes; then - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_static_F77='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - amigaos*) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' - ;; - - beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic_F77='-fno-common' - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared_F77=no - enable_shared=no - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic_F77=-Kconform_pic - fi - ;; - - hpux*) - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - ;; - - *) - lt_prog_compiler_pic_F77='-fPIC' - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl_F77='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static_F77='-Bstatic' - else - lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' - fi - ;; - darwin*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - case $cc_basename in - xlc*) - lt_prog_compiler_pic_F77='-qnocommon' - lt_prog_compiler_wl_F77='-Wl,' - ;; - esac - ;; - - mingw* | pw32* | os2*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic_F77='-DDLL_EXPORT' - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic_F77='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static_F77='${wl}-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl_F77='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static_F77='-non_shared' - ;; - - newsos6) - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - linux*) - case $cc_basename in - icc* | ecc*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-fpic' - lt_prog_compiler_static_F77='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl_F77='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - esac - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl_F77='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static_F77='-non_shared' - ;; - - sco3.2v5*) - lt_prog_compiler_pic_F77='-Kpic' - lt_prog_compiler_static_F77='-dn' - ;; - - solaris*) - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - case $cc_basename in - f77* | f90* | f95*) - lt_prog_compiler_wl_F77='-Qoption ld ';; - *) - lt_prog_compiler_wl_F77='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl_F77='-Qoption ld ' - lt_prog_compiler_pic_F77='-PIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_pic_F77='-KPIC' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec ;then - lt_prog_compiler_pic_F77='-Kconform_pic' - lt_prog_compiler_static_F77='-Bstatic' - fi - ;; - - unicos*) - lt_prog_compiler_wl_F77='-Wl,' - lt_prog_compiler_can_build_shared_F77=no - ;; - - uts4*) - lt_prog_compiler_pic_F77='-pic' - lt_prog_compiler_static_F77='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared_F77=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic_F77"; then - -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_prog_compiler_pic_works_F77=no - ac_outfile=conftest.$ac_objext - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic_F77" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13689: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:13693: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $echo "X$_lt_compiler_boilerplate" | $Xsed >conftest.exp - $SED '/^$/d' conftest.err >conftest.er2 - if test ! -s conftest.err || diff conftest.exp conftest.er2 >/dev/null; then - lt_prog_compiler_pic_works_F77=yes - fi - fi - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 - -if test x"$lt_prog_compiler_pic_works_F77" = xyes; then - case $lt_prog_compiler_pic_F77 in - "" | " "*) ;; - *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; - esac -else - lt_prog_compiler_pic_F77= - lt_prog_compiler_can_build_shared_F77=no -fi - -fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic_F77= - ;; - *) - lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" - ;; -esac - -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - lt_cv_prog_compiler_c_o_F77=no - $rm -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13751: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:13755: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $echo "X$_lt_compiler_boilerplate" | $Xsed > out/conftest.exp - $SED '/^$/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.err || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o_F77=yes - fi - fi - chmod u+w . 2>&5 - $rm conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files - $rm out/* && rmdir out - cd .. - rmdir conftest - $rm conftest* - -fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 - - -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then - # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 - hard_links=yes - $rm conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 - if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 - - runpath_var= - allow_undefined_flag_F77= - enable_shared_with_static_runtimes_F77=no - archive_cmds_F77= - archive_expsym_cmds_F77= - old_archive_From_new_cmds_F77= - old_archive_from_expsyms_cmds_F77= - export_dynamic_flag_spec_F77= - whole_archive_flag_spec_F77= - thread_safe_flag_spec_F77= - hardcode_libdir_flag_spec_F77= - hardcode_libdir_flag_spec_ld_F77= - hardcode_libdir_separator_F77= - hardcode_direct_F77=no - hardcode_minus_L_F77=no - hardcode_shlibpath_var_F77=unsupported - link_all_deplibs_F77=unknown - hardcode_automatic_F77=no - module_cmds_F77= - module_expsym_cmds_F77= - always_export_symbols_F77=no - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms_F77= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. - exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - extract_expsyms_cmds= - # Just being paranoid about ensuring that cc_basename is set. - for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` - - case $host_os in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; - esac - - ld_shlibs_F77=yes - if test "$with_gnu_ld" = yes; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' - export_dynamic_flag_spec_F77='${wl}--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec_F77= - fi - supports_anon_versioning=no - case `$LD -v 2>/dev/null` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: the GNU linker, at least up to release 2.9.1, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to modify your PATH -*** so that a non-GNU linker is found, and then restart. - -EOF - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we can't use - # them. - ld_shlibs_F77=no - ;; - - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag_F77=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - cygwin* | mingw* | pw32*) - # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec_F77='-L$libdir' - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=no - enable_shared_with_static_runtimes_F77=yes - export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' - - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' - else - ld_shlibs_F77=no - fi - ;; - - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - tmp_addflag= - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers - whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - esac - archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - - if test $supports_anon_versioning = yes; then - archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - $echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - else - ld_shlibs_F77=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs_F77=no - cat <&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -EOF - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - - sunos4*) - archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs_F77=no - fi - ;; - esac - - if test "$ld_shlibs_F77" = no; then - runpath_var= - hardcode_libdir_flag_spec_F77= - export_dynamic_flag_spec_F77= - whole_archive_flag_spec_F77= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag_F77=unsupported - always_export_symbols_F77=yes - archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L_F77=yes - if test "$GCC" = yes && test -z "$link_static_flag"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct_F77=unsupported - fi - ;; - - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - if $NM -V 2>&1 | grep 'GNU' > /dev/null; then - export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds_F77='' - hardcode_direct_F77=yes - hardcode_libdir_separator_F77=':' - link_all_deplibs_F77=yes - - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct_F77=yes - else - # We have old collect2 - hardcode_direct_F77=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L_F77=yes - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_libdir_separator_F77= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols_F77=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag_F77='-berok' - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' - allow_undefined_flag_F77="-z nodefs" - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF - program main - - end -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_f77_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` -# Check for a 64-bit object if we didn't find anything. -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi - - hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag_F77=' ${wl}-bernotok' - allow_undefined_flag_F77=' ${wl}-berok' - # -bexpall does not export symbols beginning with underscore (_) - always_export_symbols_F77=yes - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec_F77=' ' - archive_cmds_need_lc_F77=yes - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - amigaos*) - archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - # see comment about different semantics on the GNU ld section - ld_shlibs_F77=no - ;; - - bsdi[45]*) - export_dynamic_flag_spec_F77=-rdynamic - ;; - - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec_F77=' ' - allow_undefined_flag_F77=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_From_new_cmds_F77='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' - fix_srcfile_path_F77='`cygpath -w "$srcfile"`' - enable_shared_with_static_runtimes_F77=yes - ;; - - darwin* | rhapsody*) - case $host_os in - rhapsody* | darwin1.[012]) - allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' - ;; - *) # Darwin 1.3 on - if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then - allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - else - case ${MACOSX_DEPLOYMENT_TARGET} in - 10.[012]) - allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' - ;; - 10.*) - allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' - ;; - esac - fi - ;; - esac - archive_cmds_need_lc_F77=no - hardcode_direct_F77=no - hardcode_automatic_F77=yes - hardcode_shlibpath_var_F77=unsupported - whole_archive_flag_spec_F77='' - link_all_deplibs_F77=yes - if test "$GCC" = yes ; then - output_verbose_link_cmd='echo' - archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' - module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - else - case $cc_basename in - xlc*) - output_verbose_link_cmd='echo' - archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' - module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' - # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds - archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' - ;; - *) - ld_shlibs_F77=no - ;; - esac - fi - ;; - - dgux*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - freebsd1*) - ld_shlibs_F77=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | kfreebsd*-gnu | dragonfly*) - archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - hpux9*) - if test "$GCC" = yes; then - archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - ;; - - hpux10* | hpux11*) - if test "$GCC" = yes -a "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*|ia64*) - archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*|ia64*) - archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' - ;; - *) - archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - ;; - esac - fi - if test "$with_gnu_ld" = no; then - case $host_cpu in - hppa*64*) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_flag_spec_ld_F77='+b $libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - ;; - ia64*) - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_direct_F77=no - hardcode_shlibpath_var_F77=no - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - ;; - *) - hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_direct_F77=yes - export_dynamic_flag_spec_F77='${wl}-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L_F77=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - link_all_deplibs_F77=yes - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - newsos6) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - hardcode_shlibpath_var_F77=no - ;; - - openbsd*) - hardcode_direct_F77=yes - hardcode_shlibpath_var_F77=no - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - export_dynamic_flag_spec_F77='${wl}-E' - else - case $host_os in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-R$libdir' - ;; - *) - archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - - os2*) - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_minus_L_F77=yes - allow_undefined_flag_F77=unsupported - archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' - ;; - - osf3*) - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - fi - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator_F77=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' - else - allow_undefined_flag_F77=' -expect_unresolved \*' - archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ - $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec_F77='-rpath $libdir' - fi - hardcode_libdir_separator_F77=: - ;; - - sco3.2v5*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='${wl}-Bexport' - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ;; - - solaris*) - no_undefined_flag_F77=' -z text' - if test "$GCC" = yes; then - wlarc='${wl}' - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' - else - wlarc='' - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - fi - hardcode_libdir_flag_spec_F77='-R$libdir' - hardcode_shlibpath_var_F77=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine linker options so we - # cannot just pass the convience library names through - # without $wl, iff we do not link with $LD. - # Luckily, gcc supports the same syntax we need for Sun Studio. - # Supported since Solaris 2.6 (maybe 2.5.1?) - case $wlarc in - '') - whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; - *) - whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; - esac ;; - esac - link_all_deplibs_F77=yes - ;; - - sunos4*) - if test "x$host_vendor" = xsequent; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_direct_F77=yes - hardcode_minus_L_F77=yes - hardcode_shlibpath_var_F77=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds_F77='$CC -r -o $output$reload_objs' - hardcode_direct_F77=no - ;; - motorola) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no - ;; - - sysv4.3*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - export_dynamic_flag_spec_F77='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var_F77=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs_F77=yes - fi - ;; - - sysv4.2uw2*) - archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct_F77=yes - hardcode_minus_L_F77=no - hardcode_shlibpath_var_F77=no - hardcode_runpath_var=yes - runpath_var=LD_RUN_PATH - ;; - - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - no_undefined_flag_F77='${wl}-z ${wl}text' - if test "$GCC" = yes; then - archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var_F77=no - ;; - - sysv5*) - no_undefined_flag_F77=' -z text' - # $CC -shared without GNU ld will not create a library from C++ - # object files and a static libstdc++, better avoid it by now - archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' - hardcode_libdir_flag_spec_F77= - hardcode_shlibpath_var_F77=no - runpath_var='LD_RUN_PATH' - ;; - - uts4*) - archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec_F77='-L$libdir' - hardcode_shlibpath_var_F77=no - ;; - - *) - ld_shlibs_F77=no - ;; - esac - fi - -echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 -echo "${ECHO_T}$ld_shlibs_F77" >&6 -test "$ld_shlibs_F77" = no && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc_F77" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc_F77=yes - - if test "$enable_shared" = yes && test "$GCC" = yes; then - case $archive_cmds_F77 in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 - $rm conftest* - printf "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl_F77 - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag_F77 - allow_undefined_flag_F77= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - then - archive_cmds_need_lc_F77=no - else - archive_cmds_need_lc_F77=yes - fi - allow_undefined_flag_F77=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 - ;; - esac - fi - ;; -esac - -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - -case $host_os in -aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' - ;; - -aix4* | aix5*) - version_type=linux - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test "$host_cpu" = ia64; then - # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then - # If using run time linking (on AIX 4.2 or later) use lib.so - # instead of lib.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - -beos*) - library_names_spec='${libname}${shared_ext}' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32*) - version_type=windows - shrext_cmds=".dll" - need_version=no - need_lib_prefix=no - - case $GCC,$host_os in - yes,cygwin* | yes,mingw* | yes,pw32*) - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $rm \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" - ;; - mingw*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` - if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH printed by - # mingw gcc, but we are running on Cygwin. Gcc prints its search - # path with ; separators, and with drive letters. We can handle the - # drive letters (cygwin fileutils understands them), so leave them, - # especially as we might pass files found there to a mingw objdump, - # which wouldn't understand a cygwinified path. Ahh. - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - ;; - esac - ;; - - *) - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - ;; - esac - dynamic_linker='Win32 ld.exe' - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. - if test "$GCC" = yes; then - sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` - else - sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' - fi - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd1*) - dynamic_linker=no - ;; - -kfreebsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -freebsd* | dragonfly*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[123]*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - *) # from 3.2 on - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - esac - ;; - -gnu*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555. - postinstall_cmds='chmod 555 $lib' - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -# This must be Linux ELF. -linux*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -knetbsd*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='GNU ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -nto-qnx*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -openbsd*) - version_type=sunos - need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[89] | openbsd2.[89].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi - ;; - -os2*) - libname_spec='$name' - shrext_cmds=".dll" - need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" - ;; - -sco3.2v5*) - version_type=osf - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - ;; - -solaris*) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - export_dynamic_flag_spec='${wl}-Blargedynsym' - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec ;then - version_type=linux - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -uts4*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 -test "$dynamic_linker" = no && can_build_shared=no - -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 -hardcode_action_F77= -if test -n "$hardcode_libdir_flag_spec_F77" || \ - test -n "$runpath_var_F77" || \ - test "X$hardcode_automatic_F77" = "Xyes" ; then - - # We can hardcode non-existant directories. - if test "$hardcode_direct_F77" != no && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && - test "$hardcode_minus_L_F77" != no; then - # Linking always hardcodes the temporary library directory. - hardcode_action_F77=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action_F77=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action_F77=unsupported -fi -echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 -echo "${ECHO_T}$hardcode_action_F77" >&6 - -if test "$hardcode_action_F77" = relink; then - # Fast installation is not supported - enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then - # Fast installation is not necessary - enable_fast_install=needless -fi - -striplib= -old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 -if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - ;; - *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 - ;; - esac -fi - - - -# The else clause should only fire when bootstrapping the -# libtool distribution, otherwise you forgot to ship ltmain.sh -# with your package, and you will get complaints that there are -# no rules to generate ltmain.sh. -if test -f "$ltmain"; then - # See if we are running on zsh, and set the options which allow our commands through - # without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - # Now quote all the things that may contain metacharacters while being - # careful not to overquote the AC_SUBSTed values. We take copies of the - # variables and quote the copies for generation of the libtool script. - for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ - SED SHELL STRIP \ - libname_spec library_names_spec soname_spec extract_expsyms_cmds \ - old_striplib striplib file_magic_cmd finish_cmds finish_eval \ - deplibs_check_method reload_flag reload_cmds need_locks \ - lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ - lt_cv_sys_global_symbol_to_c_name_address \ - sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ - old_postinstall_cmds old_postuninstall_cmds \ - compiler_F77 \ - CC_F77 \ - LD_F77 \ - lt_prog_compiler_wl_F77 \ - lt_prog_compiler_pic_F77 \ - lt_prog_compiler_static_F77 \ - lt_prog_compiler_no_builtin_flag_F77 \ - export_dynamic_flag_spec_F77 \ - thread_safe_flag_spec_F77 \ - whole_archive_flag_spec_F77 \ - enable_shared_with_static_runtimes_F77 \ - old_archive_cmds_F77 \ - old_archive_from_new_cmds_F77 \ - predep_objects_F77 \ - postdep_objects_F77 \ - predeps_F77 \ - postdeps_F77 \ - compiler_lib_search_path_F77 \ - archive_cmds_F77 \ - archive_expsym_cmds_F77 \ - postinstall_cmds_F77 \ - postuninstall_cmds_F77 \ - old_archive_from_expsyms_cmds_F77 \ - allow_undefined_flag_F77 \ - no_undefined_flag_F77 \ - export_symbols_cmds_F77 \ - hardcode_libdir_flag_spec_F77 \ - hardcode_libdir_flag_spec_ld_F77 \ - hardcode_libdir_separator_F77 \ - hardcode_automatic_F77 \ - module_cmds_F77 \ - module_expsym_cmds_F77 \ - lt_cv_prog_compiler_c_o_F77 \ - exclude_expsyms_F77 \ - include_expsyms_F77; do - - case $var in - old_archive_cmds_F77 | \ - old_archive_from_new_cmds_F77 | \ - archive_cmds_F77 | \ - archive_expsym_cmds_F77 | \ - module_cmds_F77 | \ - module_expsym_cmds_F77 | \ - old_archive_from_expsyms_cmds_F77 | \ - export_symbols_cmds_F77 | \ - extract_expsyms_cmds | reload_cmds | finish_cmds | \ - postinstall_cmds | postuninstall_cmds | \ - old_postinstall_cmds | old_postuninstall_cmds | \ - sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) - # Double-quote double-evaled strings. - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" - ;; - *) - eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" - ;; - esac - done - - case $lt_echo in - *'\$0 --fallback-echo"') - lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` - ;; - esac - -cfgfile="$ofile" - - cat <<__EOF__ >> "$cfgfile" -# ### BEGIN LIBTOOL TAG CONFIG: $tagname - -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_F77 - -# Whether or not to disallow shared libs when runtime libs are static -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# An echo program that does not interpret backslashes. -echo=$lt_echo - -# The archiver. -AR=$lt_AR -AR_FLAGS=$lt_AR_FLAGS - -# A C compiler. -LTCC=$lt_LTCC - -# A language-specific compiler. -CC=$lt_compiler_F77 - -# Is the compiler the GNU C compiler? -with_gcc=$GCC_F77 - -# An ERE matcher. -EGREP=$lt_EGREP - -# The linker used to build libraries. -LD=$lt_LD_F77 - -# Whether we need hard or soft links. -LN_S=$lt_LN_S - -# A BSD-compatible nm program. -NM=$lt_NM - -# A symbol stripping program -STRIP=$lt_STRIP - -# Used to examine libraries when file_magic_cmd begins "file" -MAGIC_CMD=$MAGIC_CMD - -# Used on cygwin: DLL creation program. -DLLTOOL="$DLLTOOL" - -# Used on cygwin: object dumper. -OBJDUMP="$OBJDUMP" - -# Used on cygwin: assembler. -AS="$AS" - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_F77 - -# Object file suffix (normally "o"). -objext="$ac_objext" - -# Old archive suffix (normally "a"). -libext="$libext" - -# Shared library suffix (normally ".so"). -shrext_cmds='$shrext_cmds' - -# Executable file suffix (normally ""). -exeext="$exeext" - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_F77 -pic_mode=$pic_mode - -# What is the maximum length of a command? -max_cmd_len=$lt_cv_sys_max_cmd_len - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Do we need the lib prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_F77 - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 - -# Compiler flag to generate thread-safe objects. -thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 - -# Library versioning type. -version_type=$version_type - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME. -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Commands used to build and install an old-style archive. -RANLIB=$lt_RANLIB -old_archive_cmds=$lt_old_archive_cmds_F77 -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 - -# Commands used to build and install a shared archive. -archive_cmds=$lt_archive_cmds_F77 -archive_expsym_cmds=$lt_archive_expsym_cmds_F77 -postinstall_cmds=$lt_postinstall_cmds -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to build a loadable module (assumed same as above if empty) -module_cmds=$lt_module_cmds_F77 -module_expsym_cmds=$lt_module_expsym_cmds_F77 - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - -# Dependencies to place before the objects being linked to create a -# shared library. -predep_objects=$lt_predep_objects_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdep_objects=$lt_postdep_objects_F77 - -# Dependencies to place before the objects being linked to create a -# shared library. -predeps=$lt_predeps_F77 - -# Dependencies to place after the objects being linked to create a -# shared library. -postdeps=$lt_postdeps_F77 - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_F77 - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method == file_magic. -file_magic_cmd=$lt_file_magic_cmd - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_F77 - -# Flag that forces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_F77 - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# Same as above, but a single script fragment to be evaled but not shown. -finish_eval=$lt_finish_eval - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# This is the shared library runtime path variable. -runpath_var=$runpath_var - -# This is the shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_F77 - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 - -# If ld is used when linking, flag to hardcode \$libdir into -# a binary during linking. This must work even if \$libdir does -# not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 - -# Whether we need a single -rpath flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 - -# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the -# resulting binary. -hardcode_direct=$hardcode_direct_F77 - -# Set to yes if using the -LDIR flag during linking hardcodes DIR into the -# resulting binary. -hardcode_minus_L=$hardcode_minus_L_F77 - -# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into -# the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 - -# Set to yes if building a shared library automatically hardcodes DIR into the library -# and all subsequent libraries and executables linked against it. -hardcode_automatic=$hardcode_automatic_F77 - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at relink time. -variables_saved_for_relink="$variables_saved_for_relink" - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_F77 - -# Compile-time system search path for libraries -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Fix the shell variable \$srcfile for the compiler. -fix_srcfile_path="$fix_srcfile_path_F77" - -# Set to yes if exported symbols are required. -always_export_symbols=$always_export_symbols_F77 - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_F77 - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_F77 - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_F77 - -# ### END LIBTOOL TAG CONFIG: $tagname - -__EOF__ - - -else - # If there is no Makefile yet, we rely on a make rule to execute - # `config.status --recheck' to rerun these tests and create the - # libtool script then. - ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` - if test -f "$ltmain_in"; then - test -f Makefile && make "$ltmain" - fi -fi - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC="$lt_save_CC" - + : else tagname="" fi @@ -15795,7 +9165,6 @@ CC="$lt_save_CC" if test -n "$GCJ" && test "X$GCJ" != "Xno"; then - # Source file extension for Java test sources. ac_ext=java @@ -15860,10 +9229,10 @@ if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' -echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext @@ -15878,11 +9247,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15881: $lt_compile\"" >&5) + (eval echo "\"\$as_me:9250: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15885: \$? = $ac_status" >&5 + echo "$as_me:9254: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -15895,8 +9264,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" @@ -15910,8 +9279,8 @@ lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= -echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' @@ -16114,18 +9483,18 @@ echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 esac fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then -echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 -echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 -if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext @@ -16140,11 +9509,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16143: $lt_compile\"" >&5) + (eval echo "\"\$as_me:9512: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:16147: \$? = $ac_status" >&5 + echo "$as_me:9516: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -16157,8 +9526,8 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 -echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_works_GCJ" >&6; } if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in @@ -16181,10 +9550,10 @@ case $host_os in ;; esac -echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 -if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then : + $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null @@ -16202,11 +9571,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:16205: $lt_compile\"" >&5) + (eval echo "\"\$as_me:9574: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:16209: \$? = $ac_status" >&5 + echo "$as_me:9578: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -16228,34 +9597,34 @@ else $rm conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 -echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user - echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 -echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - echo "$as_me:$LINENO: result: $hard_links" >&5 -echo "${ECHO_T}$hard_links" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } if test "$hard_links" = no; then - { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 -echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi -echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_GCJ= @@ -16606,11 +9975,7 @@ EOF # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -16621,41 +9986,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -16667,11 +10007,7 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -16682,41 +10018,16 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" @@ -17150,8 +10461,8 @@ if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi esac fi -echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 -echo "${ECHO_T}$ld_shlibs_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_GCJ" >&5 +$as_echo "$ld_shlibs_GCJ" >&6; } test "$ld_shlibs_GCJ" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -17176,16 +10487,16 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 -echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } 2>conftest.err; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext @@ -17198,11 +10509,11 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } then archive_cmds_need_lc_GCJ=no else @@ -17213,16 +10524,16 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >& cat conftest.err 1>&5 fi $rm conftest* - echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 -echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_GCJ" >&5 +$as_echo "$archive_cmds_need_lc_GCJ" >&6; } ;; esac fi ;; esac -echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 -echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= @@ -17775,12 +11086,12 @@ uts4*) dynamic_linker=no ;; esac -echo "$as_me:$LINENO: result: $dynamic_linker" >&5 -echo "${ECHO_T}$dynamic_linker" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no -echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 -echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ @@ -17804,8 +11115,8 @@ else # directories. hardcode_action_GCJ=unsupported fi -echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 -echo "${ECHO_T}$hardcode_action_GCJ" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_GCJ" >&5 +$as_echo "$hardcode_action_GCJ" >&6; } if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported @@ -17818,29 +11129,29 @@ fi striplib= old_striplib= -echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi ;; *) - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } ;; esac fi @@ -17872,71 +11183,43 @@ else darwin*) # if libdl is installed we need to link against it - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else @@ -17949,458 +11232,168 @@ fi ;; *) - echo "$as_me:$LINENO: checking for shl_load" >&5 -echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 -if test "${ac_cv_func_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define shl_load to an innocuous variant, in case declares shl_load. - For example, HP-UX 11i declares gettimeofday. */ -#define shl_load innocuous_shl_load - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char shl_load (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef shl_load - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shl_load (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shl_load) || defined (__stub___shl_load) -choke me -#else -char (*f) () = shl_load; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != shl_load; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_shl_load=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_shl_load=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 -echo "${ECHO_T}$ac_cv_func_shl_load" >&6 -if test $ac_cv_func_shl_load = yes; then + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else - echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 -echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_shl_load+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char shl_load (); int main () { -shl_load (); +return shl_load (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_shl_load=no + ac_cv_lib_dld_shl_load=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 -if test $ac_cv_lib_dld_shl_load = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else - echo "$as_me:$LINENO: checking for dlopen" >&5 -echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 -if test "${ac_cv_func_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define dlopen to an innocuous variant, in case declares dlopen. - For example, HP-UX 11i declares gettimeofday. */ -#define dlopen innocuous_dlopen - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char dlopen (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef dlopen - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char dlopen (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_dlopen) || defined (__stub___dlopen) -choke me -#else -char (*f) () = dlopen; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != dlopen; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_dlopen=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_dlopen=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 -echo "${ECHO_T}$ac_cv_func_dlopen" >&6 -if test $ac_cv_func_dlopen = yes; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else - echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 -echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 -if test "${ac_cv_lib_dl_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dl_dlopen=no + ac_cv_lib_dl_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 -if test $ac_cv_lib_dl_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else - echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 -echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 -if test "${ac_cv_lib_svld_dlopen+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dlopen (); int main () { -dlopen (); +return dlopen (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_svld_dlopen=no + ac_cv_lib_svld_dlopen=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 -echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 -if test $ac_cv_lib_svld_dlopen = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else - echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 -echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 -if test "${ac_cv_lib_dld_dld_link+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char dld_link (); int main () { -dld_link (); +return dld_link (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_dld_dld_link=no + ac_cv_lib_dld_dld_link=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 -echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 -if test $ac_cv_lib_dld_dld_link = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi @@ -18439,10 +11432,10 @@ fi save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" - echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 -echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross @@ -18450,7 +11443,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -18532,15 +11525,15 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" - echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 -echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 -if test "${lt_cv_dlopen_self_static+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross @@ -18548,7 +11541,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <&5 + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in @@ -18630,8 +11623,8 @@ rm -fr conftest* fi -echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 -echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" @@ -19073,7 +12066,6 @@ CC="$lt_save_CC" RC) - # Source file extension for RC test sources. ac_ext=rc @@ -19543,9 +12535,7 @@ CC="$lt_save_CC" ;; *) - { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 -echo "$as_me: error: Unsupported tag name: $tagname" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "Unsupported tag name: $tagname" "$LINENO" 5 ;; esac @@ -19563,9 +12553,7 @@ echo "$as_me: error: Unsupported tag name: $tagname" >&2;} chmod +x "$ofile" else rm -f "${ofile}T" - { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 -echo "$as_me: error: unable to update list of available tagged configurations." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "unable to update list of available tagged configurations." "$LINENO" 5 fi fi @@ -19587,17 +12575,6 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - # NTP has (so far) been relying on leading-edge autogen. # Therefore, by default: @@ -19617,27 +12594,25 @@ esac LIBOPTS_DIR=libopts - # Check whether --enable-local-libopts or --disable-local-libopts was given. -if test "${enable_local_libopts+set}" = set; then - enableval="$enable_local_libopts" - + # Check whether --enable-local-libopts was given. +if test "${enable_local_libopts+set}" = set; then : + enableval=$enable_local_libopts; if test x$enableval = xyes ; then - { echo "$as_me:$LINENO: Using supplied libopts tearoff" >&5 -echo "$as_me: Using supplied libopts tearoff" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Using supplied libopts tearoff" >&5 +$as_echo "$as_me: Using supplied libopts tearoff" >&6;} LIBOPTS_LDADD='$(top_builddir)/libopts/libopts.la' LIBOPTS_CFLAGS='-I$(top_srcdir)/libopts' NEED_LIBOPTS_DIR=true fi -fi; - - # Check whether --enable-libopts-install or --disable-libopts-install was given. -if test "${enable_libopts_install+set}" = set; then - enableval="$enable_libopts_install" - -fi; +fi -if test "X${enable_libopts_install}" != Xno; then + # Check whether --enable-libopts-install was given. +if test "${enable_libopts_install+set}" = set; then : + enableval=$enable_libopts_install; +fi + + if test "X${enable_libopts_install}" != Xno; then INSTALL_LIBOPTS_TRUE= INSTALL_LIBOPTS_FALSE='#' else @@ -19647,18 +12622,17 @@ fi if test -z "${NEED_LIBOPTS_DIR}" ; then - echo "$as_me:$LINENO: checking whether autoopts-config can be found" >&5 -echo $ECHO_N "checking whether autoopts-config can be found... $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether autoopts-config can be found" >&5 +$as_echo_n "checking whether autoopts-config can be found... " >&6; } -# Check whether --with-autoopts-config or --without-autoopts-config was given. -if test "${with_autoopts_config+set}" = set; then - withval="$with_autoopts_config" - lo_cv_with_autoopts_config=${with_autoopts_config} +# Check whether --with-autoopts-config was given. +if test "${with_autoopts_config+set}" = set; then : + withval=$with_autoopts_config; lo_cv_with_autoopts_config=${with_autoopts_config} else - echo "$as_me:$LINENO: checking whether autoopts-config is specified" >&5 -echo $ECHO_N "checking whether autoopts-config is specified... $ECHO_C" >&6 -if test "${lo_cv_with_autoopts_config+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether autoopts-config is specified" >&5 +$as_echo_n "checking whether autoopts-config is specified... " >&6; } +if test "${lo_cv_with_autoopts_config+set}" = set; then : + $as_echo_n "(cached) " >&6 else if autoopts-config --help 2>/dev/null 1>&2 then lo_cv_with_autoopts_config=autoopts-config @@ -19666,13 +12640,14 @@ else then lo_cv_with_autoopts_config=libopts-config else lo_cv_with_autoopts_config=no ; fi fi -echo "$as_me:$LINENO: result: $lo_cv_with_autoopts_config" >&5 -echo "${ECHO_T}$lo_cv_with_autoopts_config" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lo_cv_with_autoopts_config" >&5 +$as_echo "$lo_cv_with_autoopts_config" >&6; } -fi; # end of AC_ARG_WITH +fi + # end of AC_ARG_WITH - if test "${lo_cv_test_autoopts+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + if test "${lo_cv_test_autoopts+set}" = set; then : + $as_echo_n "(cached) " >&6 else if test -z "${lo_cv_with_autoopts_config}" \ @@ -19691,8 +12666,8 @@ else fi # end of CACHE_VAL - echo "$as_me:$LINENO: result: ${lo_cv_test_autoopts}" >&5 -echo "${ECHO_T}${lo_cv_test_autoopts}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lo_cv_test_autoopts}" >&5 +$as_echo "${lo_cv_test_autoopts}" >&6; } if test "X${lo_cv_test_autoopts}" != Xno then @@ -19705,9 +12680,7 @@ echo "${ECHO_T}${lo_cv_test_autoopts}" >&6 fi fi # end of if test -z "${NEED_LIBOPTS_DIR}" - - -if test -n "${NEED_LIBOPTS_DIR}"; then + if test -n "${NEED_LIBOPTS_DIR}"; then NEED_LIBOPTS_TRUE= NEED_LIBOPTS_FALSE='#' else @@ -19719,7 +12692,7 @@ fi LIBOPTS_DIR=libopts - ac_config_files="$ac_config_files libopts/Makefile" + ac_config_files="$ac_config_files libopts/Makefile" @@ -19730,16 +12703,12 @@ if test X${INVOKE_LIBOPTS_MACROS_FIRST_done} != Xyes ; then # ================= # AC_HEADER_STDC # ================= - echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -19754,51 +12723,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -19808,18 +12749,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -19829,16 +12766,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -19858,65 +12792,41 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # ================= # AC_HEADER_DIRENT # ================= - - - - - -ac_header_dirent=no + ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 -echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> @@ -19930,42 +12840,20 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break @@ -19974,256 +12862,116 @@ fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in dir; do +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in x; do +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi @@ -20233,172 +12981,17 @@ fi # ================= # AC_CHECK_HEADERS # ================= - - - - - - - - - - - - - - - - - - - - -for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ + for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ setjmp.h sys/mman.h sys/param.h sys/poll.h sys/procset.h sys/select.h \ sys/socket.h sys/stropts.h sys/time.h sys/un.h sys/wait.h unistd.h \ utime.h sysexits.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -20413,160 +13006,21 @@ done string errno stdlib memory setjmp do eval as_ac_var=\${ac_cv_header_${f}_h+set} test "${as_ac_var}" = set || \ - { { echo "$as_me:$LINENO: error: You must have ${f}.h on your system" >&5 -echo "$as_me: error: You must have ${f}.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have ${f}.h on your system" "$LINENO" 5 done # ================================================ # AC_CHECK_HEADERS: stdarg.h is present define HAVE_STDARG_H, otherwise # if varargs.h is present define HAVE_VARARGS_H. # ================================================ - - -for ac_header in stdarg.h varargs.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdarg.h varargs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -20574,159 +13028,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have stdarg.h or varargs.h on your system" >&5 -echo "$as_me: error: You must have stdarg.h or varargs.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have stdarg.h or varargs.h on your system" "$LINENO" 5 fi # ================================================ # Similarly for the string.h and strings.h headers # ================================================ - - -for ac_header in string.h strings.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in string.h strings.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -20734,160 +13049,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have string.h or strings.h on your system" >&5 -echo "$as_me: error: You must have string.h or strings.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have string.h or strings.h on your system" "$LINENO" 5 fi # ===================== # ...and limits headers # ===================== - - - -for ac_header in limits.h sys/limits.h values.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in limits.h sys/limits.h values.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -20895,222 +13070,28 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have one of limits.h, sys/limits.h or values.h" >&5 -echo "$as_me: error: You must have one of limits.h, sys/limits.h or values.h" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have one of limits.h, sys/limits.h or values.h" "$LINENO" 5 fi # ======================== # ...and int types headers # ======================== - - -for ac_header in stdint.h inttypes.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdint.h inttypes.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi done - echo "$as_me:$LINENO: checking for int8_t" >&5 -echo $ECHO_N "checking for int8_t... $ECHO_C" >&6 -if test "${ac_cv_type_int8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int8_t *) 0) - return 0; -if (sizeof (int8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 -echo "${ECHO_T}$ac_cv_type_int8_t" >&6 -if test $ac_cv_type_int8_t = yes; then + ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_int8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT8_T 1 @@ -21118,63 +13099,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint8_t" >&5 -echo $ECHO_N "checking for uint8_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint8_t *) 0) - return 0; -if (sizeof (uint8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint8_t" >&6 -if test $ac_cv_type_uint8_t = yes; then +ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" +if test "x$ac_cv_type_uint8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT8_T 1 @@ -21182,63 +13108,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int16_t" >&5 -echo $ECHO_N "checking for int16_t... $ECHO_C" >&6 -if test "${ac_cv_type_int16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int16_t *) 0) - return 0; -if (sizeof (int16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 -echo "${ECHO_T}$ac_cv_type_int16_t" >&6 -if test $ac_cv_type_int16_t = yes; then +ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_int16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT16_T 1 @@ -21246,63 +13117,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint16_t" >&5 -echo $ECHO_N "checking for uint16_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint16_t *) 0) - return 0; -if (sizeof (uint16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint16_t" >&6 -if test $ac_cv_type_uint16_t = yes; then +ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "$ac_includes_default" +if test "x$ac_cv_type_uint16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT16_T 1 @@ -21310,63 +13126,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int32_t" >&5 -echo $ECHO_N "checking for int32_t... $ECHO_C" >&6 -if test "${ac_cv_type_int32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int32_t *) 0) - return 0; -if (sizeof (int32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 -echo "${ECHO_T}$ac_cv_type_int32_t" >&6 -if test $ac_cv_type_int32_t = yes; then +ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_int32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT32_T 1 @@ -21374,63 +13135,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint32_t" >&5 -echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint32_t *) 0) - return 0; -if (sizeof (uint32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint32_t" >&6 -if test $ac_cv_type_uint32_t = yes; then +ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" +if test "x$ac_cv_type_uint32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT32_T 1 @@ -21438,63 +13144,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for intptr_t" >&5 -echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_intptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((intptr_t *) 0) - return 0; -if (sizeof (intptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_intptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_intptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_intptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_intptr_t" >&6 -if test $ac_cv_type_intptr_t = yes; then +ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" +if test "x$ac_cv_type_intptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INTPTR_T 1 @@ -21502,63 +13153,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint_t" >&5 -echo $ECHO_N "checking for uint_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint_t *) 0) - return 0; -if (sizeof (uint_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint_t" >&6 -if test $ac_cv_type_uint_t = yes; then +ac_fn_c_check_type "$LINENO" "uint_t" "ac_cv_type_uint_t" "$ac_includes_default" +if test "x$ac_cv_type_uint_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT_T 1 @@ -21571,63 +13167,8 @@ fi # ==================== # uintptr type & sizes # ==================== - echo "$as_me:$LINENO: checking for uintptr_t" >&5 -echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_uintptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uintptr_t *) 0) - return 0; -if (sizeof (uintptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uintptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uintptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6 -if test $ac_cv_type_uintptr_t = yes; then + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTPTR_T 1 @@ -21636,1663 +13177,141 @@ _ACEOF else -cat >>confdefs.h <<\_ACEOF -#define uintptr_t unsigned long -_ACEOF +$as_echo "#define uintptr_t unsigned long" >>confdefs.h fi - echo "$as_me:$LINENO: checking for char*" >&5 -echo $ECHO_N "checking for char*... $ECHO_C" >&6 -if test "${ac_cv_type_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char*" >&5 +$as_echo_n "checking size of char*... " >&6; } +if test "${ac_cv_sizeof_charp+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((char* *) 0) - return 0; -if (sizeof (char*)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_charp=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char*))" "ac_cv_sizeof_charp" "$ac_includes_default"; then : -ac_cv_type_charp=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_charp" >&5 -echo "${ECHO_T}$ac_cv_type_charp" >&6 - -echo "$as_me:$LINENO: checking size of char*" >&5 -echo $ECHO_N "checking size of char*... $ECHO_C" >&6 -if test "${ac_cv_sizeof_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_charp" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (char*) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_charp=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_charp" >&5 +$as_echo "$ac_cv_sizeof_charp" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_charp=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (char*)); } -unsigned long ulongval () { return (long) (sizeof (char*)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (char*))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_charp=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_charp=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_charp" >&5 -echo "${ECHO_T}$ac_cv_sizeof_charp" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_CHARP $ac_cv_sizeof_charp _ACEOF - echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6 -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int *) 0) - return 0; -if (sizeof (int)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : -ac_cv_type_int=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6 - -echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6 -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_int" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (int)); } -unsigned long ulongval () { return (long) (sizeof (int)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (int))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_int=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF - echo "$as_me:$LINENO: checking for long" >&5 -echo $ECHO_N "checking for long... $ECHO_C" >&6 -if test "${ac_cv_type_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((long *) 0) - return 0; -if (sizeof (long)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_long=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : -ac_cv_type_long=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 -echo "${ECHO_T}$ac_cv_type_long" >&6 - -echo "$as_me:$LINENO: checking size of long" >&5 -echo $ECHO_N "checking size of long... $ECHO_C" >&6 -if test "${ac_cv_sizeof_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (long)); } -unsigned long ulongval () { return (long) (sizeof (long)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (long))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_long=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF - echo "$as_me:$LINENO: checking for short" >&5 -echo $ECHO_N "checking for short... $ECHO_C" >&6 -if test "${ac_cv_type_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((short *) 0) - return 0; -if (sizeof (short)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_short=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : -ac_cv_type_short=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 -echo "${ECHO_T}$ac_cv_type_short" >&6 - -echo "$as_me:$LINENO: checking size of short" >&5 -echo $ECHO_N "checking size of short... $ECHO_C" >&6 -if test "${ac_cv_sizeof_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_short" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_short=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_short=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (short)); } -unsigned long ulongval () { return (long) (sizeof (short)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (short))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_short=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_short=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -echo "${ECHO_T}$ac_cv_sizeof_short" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF @@ -23302,72 +13321,43 @@ _ACEOF # ---------------------------------------------------------------------- # AC_CHECK_LIB for SVR4 libgen, and use it if it defines pathfind. # ---------------------------------------------------------------------- - -echo "$as_me:$LINENO: checking for pathfind in -lgen" >&5 -echo $ECHO_N "checking for pathfind in -lgen... $ECHO_C" >&6 -if test "${ac_cv_lib_gen_pathfind+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pathfind in -lgen" >&5 +$as_echo_n "checking for pathfind in -lgen... " >&6; } +if test "${ac_cv_lib_gen_pathfind+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgen $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char pathfind (); int main () { -pathfind (); +return pathfind (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gen_pathfind=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_gen_pathfind=no + ac_cv_lib_gen_pathfind=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_gen_pathfind" >&5 -echo "${ECHO_T}$ac_cv_lib_gen_pathfind" >&6 -if test $ac_cv_lib_gen_pathfind = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_pathfind" >&5 +$as_echo "$ac_cv_lib_gen_pathfind" >&6; } +if test "x$ac_cv_lib_gen_pathfind" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGEN 1 _ACEOF @@ -23376,200 +13366,18 @@ _ACEOF fi - -for ac_func in vprintf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_VPRINTF 1 _ACEOF -echo "$as_me:$LINENO: checking for _doprnt" >&5 -echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 -if test "${ac_cv_func__doprnt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define _doprnt to an innocuous variant, in case declares _doprnt. - For example, HP-UX 11i declares gettimeofday. */ -#define _doprnt innocuous__doprnt +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char _doprnt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef _doprnt - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char _doprnt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub__doprnt) || defined (__stub____doprnt) -choke me -#else -char (*f) () = _doprnt; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != _doprnt; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func__doprnt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func__doprnt=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 -echo "${ECHO_T}$ac_cv_func__doprnt" >&6 -if test $ac_cv_func__doprnt = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DOPRNT 1 -_ACEOF +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi @@ -23577,108 +13385,14 @@ fi done - - - - - - -for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -23689,22 +13403,22 @@ fi # Check to see if a reg expr header is specified. -# Check whether --with-regex-header or --without-regex-header was given. -if test "${with_regex_header+set}" = set; then - withval="$with_regex_header" - libopts_cv_with_regex_header=${with_regex_header} +# Check whether --with-regex-header was given. +if test "${with_regex_header+set}" = set; then : + withval=$with_regex_header; libopts_cv_with_regex_header=${with_regex_header} else - echo "$as_me:$LINENO: checking whether a reg expr header is specified" >&5 -echo $ECHO_N "checking whether a reg expr header is specified... $ECHO_C" >&6 -if test "${libopts_cv_with_regex_header+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a reg expr header is specified" >&5 +$as_echo_n "checking whether a reg expr header is specified... " >&6; } +if test "${libopts_cv_with_regex_header+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_regex_header=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_regex_header" >&5 -echo "${ECHO_T}$libopts_cv_with_regex_header" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_regex_header" >&5 +$as_echo "$libopts_cv_with_regex_header" >&6; } -fi; # end of AC_ARG_WITH +fi + # end of AC_ARG_WITH if test "X${libopts_cv_with_regex_header}" != Xno then @@ -23714,9 +13428,7 @@ _ACEOF else -cat >>confdefs.h <<\_ACEOF -#define REGEX_HEADER -_ACEOF +$as_echo "#define REGEX_HEADER " >>confdefs.h fi @@ -23725,22 +13437,22 @@ _ACEOF # Check to see if a working libregex can be found. -# Check whether --with-libregex or --without-libregex was given. -if test "${with_libregex+set}" = set; then - withval="$with_libregex" - libopts_cv_with_libregex_root=${with_libregex} +# Check whether --with-libregex was given. +if test "${with_libregex+set}" = set; then : + withval=$with_libregex; libopts_cv_with_libregex_root=${with_libregex} else - echo "$as_me:$LINENO: checking whether with-libregex was specified" >&5 -echo $ECHO_N "checking whether with-libregex was specified... $ECHO_C" >&6 -if test "${libopts_cv_with_libregex_root+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether with-libregex was specified" >&5 +$as_echo_n "checking whether with-libregex was specified... " >&6; } +if test "${libopts_cv_with_libregex_root+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_libregex_root=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_libregex_root" >&5 -echo "${ECHO_T}$libopts_cv_with_libregex_root" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_libregex_root" >&5 +$as_echo "$libopts_cv_with_libregex_root" >&6; } -fi; # end of AC_ARG_WITH libregex +fi + # end of AC_ARG_WITH libregex if test "${with_libguile+set}" = set && \ test "${withval}" = no @@ -23751,40 +13463,40 @@ fi; # end of AC_ARG_WITH libregex else -# Check whether --with-libregex-cflags or --without-libregex-cflags was given. -if test "${with_libregex_cflags+set}" = set; then - withval="$with_libregex_cflags" - libopts_cv_with_libregex_cflags=${with_regex_cflags} +# Check whether --with-libregex-cflags was given. +if test "${with_libregex_cflags+set}" = set; then : + withval=$with_libregex_cflags; libopts_cv_with_libregex_cflags=${with_regex_cflags} else - echo "$as_me:$LINENO: checking whether with-libregex-cflags was specified" >&5 -echo $ECHO_N "checking whether with-libregex-cflags was specified... $ECHO_C" >&6 -if test "${libopts_cv_with_libregex_cflags+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether with-libregex-cflags was specified" >&5 +$as_echo_n "checking whether with-libregex-cflags was specified... " >&6; } +if test "${libopts_cv_with_libregex_cflags+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_libregex_cflags=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_libregex_cflags" >&5 -echo "${ECHO_T}$libopts_cv_with_libregex_cflags" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_libregex_cflags" >&5 +$as_echo "$libopts_cv_with_libregex_cflags" >&6; } -fi; # end of AC_ARG_WITH libregex-cflags +fi + # end of AC_ARG_WITH libregex-cflags -# Check whether --with-libregex-libs or --without-libregex-libs was given. -if test "${with_libregex_libs+set}" = set; then - withval="$with_libregex_libs" - libopts_cv_with_libregex_libs=${with_regex_libs} +# Check whether --with-libregex-libs was given. +if test "${with_libregex_libs+set}" = set; then : + withval=$with_libregex_libs; libopts_cv_with_libregex_libs=${with_regex_libs} else - echo "$as_me:$LINENO: checking whether with-libregex-libs was specified" >&5 -echo $ECHO_N "checking whether with-libregex-libs was specified... $ECHO_C" >&6 -if test "${libopts_cv_with_libregex_libs+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether with-libregex-libs was specified" >&5 +$as_echo_n "checking whether with-libregex-libs was specified... " >&6; } +if test "${libopts_cv_with_libregex_libs+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_with_libregex_libs=no fi -echo "$as_me:$LINENO: result: $libopts_cv_with_libregex_libs" >&5 -echo "${ECHO_T}$libopts_cv_with_libregex_libs" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_with_libregex_libs" >&5 +$as_echo "$libopts_cv_with_libregex_libs" >&6; } -fi; # end of AC_ARG_WITH libregex-libs +fi + # end of AC_ARG_WITH libregex-libs case "X${libopts_cv_with_libregex_cflags}" in Xyes|Xno|X ) @@ -23817,20 +13529,16 @@ fi; # end of AC_ARG_WITH libregex-libs esac LIBREGEX_CFLAGS="" LIBREGEX_LIBS="" - echo "$as_me:$LINENO: checking whether libregex functions properly" >&5 -echo $ECHO_N "checking whether libregex functions properly... $ECHO_C" >&6 - if test "${libopts_cv_with_libregex+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libregex functions properly" >&5 +$as_echo_n "checking whether libregex functions properly... " >&6; } + if test "${libopts_cv_with_libregex+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_with_libregex=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -23853,40 +13561,25 @@ int main() { } return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_with_libregex=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_with_libregex=no + libopts_cv_with_libregex=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of AC_TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of AC_TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_with_libregex - echo "$as_me:$LINENO: result: ${libopts_cv_with_libregex}" >&5 -echo "${ECHO_T}${libopts_cv_with_libregex}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_with_libregex}" >&5 +$as_echo "${libopts_cv_with_libregex}" >&6; } if test "X${libopts_cv_with_libregex}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define WITH_LIBREGEX 1 -_ACEOF +$as_echo "#define WITH_LIBREGEX 1" >>confdefs.h else CPPFLAGS="${libopts_save_CPPFLAGS}" @@ -23897,21 +13590,17 @@ _ACEOF # Check to see if pathfind(3) works. - echo "$as_me:$LINENO: checking whether pathfind(3) works" >&5 -echo $ECHO_N "checking whether pathfind(3) works... $ECHO_C" >&6 - if test "${libopts_cv_run_pathfind+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pathfind(3) works" >&5 +$as_echo_n "checking whether pathfind(3) works... " >&6; } + if test "${libopts_cv_run_pathfind+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_pathfind=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -23920,40 +13609,25 @@ int main (int argc, char** argv) { return (pz == 0) ? 1 : 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_pathfind=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_pathfind=no + libopts_cv_run_pathfind=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_pathfind - echo "$as_me:$LINENO: result: ${libopts_cv_run_pathfind}" >&5 -echo "${ECHO_T}${libopts_cv_run_pathfind}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_pathfind}" >&5 +$as_echo "${libopts_cv_run_pathfind}" >&6; } if test "X${libopts_cv_run_pathfind}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_PATHFIND 1 -_ACEOF +$as_echo "#define HAVE_PATHFIND 1" >>confdefs.h fi @@ -23961,10 +13635,10 @@ _ACEOF # Check to see if /dev/zero is readable device. - echo "$as_me:$LINENO: checking whether /dev/zero is readable device" >&5 -echo $ECHO_N "checking whether /dev/zero is readable device... $ECHO_C" >&6 - if test "${libopts_cv_test_dev_zero+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether /dev/zero is readable device" >&5 +$as_echo_n "checking whether /dev/zero is readable device... " >&6; } + if test "${libopts_cv_test_dev_zero+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_test_dev_zero=`exec 2> /dev/null @@ -23979,15 +13653,13 @@ echo ${dzero}` fi # end of CACHE_VAL of libopts_cv_test_dev_zero - echo "$as_me:$LINENO: result: ${libopts_cv_test_dev_zero}" >&5 -echo "${ECHO_T}${libopts_cv_test_dev_zero}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_test_dev_zero}" >&5 +$as_echo "${libopts_cv_test_dev_zero}" >&6; } if test "X${libopts_cv_test_dev_zero}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_DEV_ZERO 1 -_ACEOF +$as_echo "#define HAVE_DEV_ZERO 1" >>confdefs.h fi @@ -23995,21 +13667,17 @@ _ACEOF # Check to see if we have a functional realpath(3C). - echo "$as_me:$LINENO: checking whether we have a functional realpath(3C)" >&5 -echo $ECHO_N "checking whether we have a functional realpath(3C)... $ECHO_C" >&6 - if test "${libopts_cv_run_realpath+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have a functional realpath(3C)" >&5 +$as_echo_n "checking whether we have a functional realpath(3C)... " >&6; } + if test "${libopts_cv_run_realpath+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_realpath=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -24023,40 +13691,25 @@ choke me!! return (pz == zPath) ? 0 : 1; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_realpath=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_realpath=no + libopts_cv_run_realpath=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_realpath - echo "$as_me:$LINENO: result: ${libopts_cv_run_realpath}" >&5 -echo "${ECHO_T}${libopts_cv_run_realpath}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_realpath}" >&5 +$as_echo "${libopts_cv_run_realpath}" >&6; } if test "X${libopts_cv_run_realpath}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_REALPATH 1 -_ACEOF +$as_echo "#define HAVE_REALPATH 1" >>confdefs.h fi @@ -24064,21 +13717,17 @@ _ACEOF # Check to see if strftime() works. - echo "$as_me:$LINENO: checking whether strftime() works" >&5 -echo $ECHO_N "checking whether strftime() works... $ECHO_C" >&6 - if test "${libopts_cv_run_strftime+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strftime() works" >&5 +$as_echo_n "checking whether strftime() works... " >&6; } + if test "${libopts_cv_run_strftime+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_strftime=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -24098,40 +13747,25 @@ int main() { strftime( t_buf, sizeof( t_buf ), "%A %b %d %j", &tm ); return (strcmp( t_buf, z ) != 0); } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_strftime=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_strftime=no + libopts_cv_run_strftime=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_strftime - echo "$as_me:$LINENO: result: ${libopts_cv_run_strftime}" >&5 -echo "${ECHO_T}${libopts_cv_run_strftime}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_strftime}" >&5 +$as_echo "${libopts_cv_run_strftime}" >&6; } if test "X${libopts_cv_run_strftime}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define HAVE_STRFTIME 1 -_ACEOF +$as_echo "#define HAVE_STRFTIME 1" >>confdefs.h fi @@ -24139,67 +13773,46 @@ _ACEOF # Check to see if fopen accepts "b" mode. - echo "$as_me:$LINENO: checking whether fopen accepts \"b\" mode" >&5 -echo $ECHO_N "checking whether fopen accepts \"b\" mode... $ECHO_C" >&6 - if test "${libopts_cv_run_fopen_binary+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen accepts \"b\" mode" >&5 +$as_echo_n "checking whether fopen accepts \"b\" mode... " >&6; } + if test "${libopts_cv_run_fopen_binary+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_fopen_binary=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (int argc, char** argv) { FILE* fp = fopen("conftest.$ac_ext", "rb"); return (fp == NULL) ? 1 : fclose(fp); } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_fopen_binary=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_fopen_binary=no + libopts_cv_run_fopen_binary=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_fopen_binary - echo "$as_me:$LINENO: result: ${libopts_cv_run_fopen_binary}" >&5 -echo "${ECHO_T}${libopts_cv_run_fopen_binary}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_fopen_binary}" >&5 +$as_echo "${libopts_cv_run_fopen_binary}" >&6; } if test "X${libopts_cv_run_fopen_binary}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define FOPEN_BINARY_FLAG "b" -_ACEOF +$as_echo "#define FOPEN_BINARY_FLAG \"b\"" >>confdefs.h else -cat >>confdefs.h <<\_ACEOF -#define FOPEN_BINARY_FLAG "" -_ACEOF +$as_echo "#define FOPEN_BINARY_FLAG \"\"" >>confdefs.h fi @@ -24207,67 +13820,46 @@ _ACEOF # Check to see if fopen accepts "t" mode. - echo "$as_me:$LINENO: checking whether fopen accepts \"t\" mode" >&5 -echo $ECHO_N "checking whether fopen accepts \"t\" mode... $ECHO_C" >&6 - if test "${libopts_cv_run_fopen_text+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fopen accepts \"t\" mode" >&5 +$as_echo_n "checking whether fopen accepts \"t\" mode... " >&6; } + if test "${libopts_cv_run_fopen_text+set}" = set; then : + $as_echo_n "(cached) " >&6 else - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : libopts_cv_run_fopen_text=no else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (int argc, char** argv) { FILE* fp = fopen("conftest.$ac_ext", "rt"); return (fp == NULL) ? 1 : fclose(fp); } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_run "$LINENO"; then : libopts_cv_run_fopen_text=yes else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -libopts_cv_run_fopen_text=no + libopts_cv_run_fopen_text=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi # end of TRY_RUN +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + # end of TRY_RUN fi # end of AC_CACHE_VAL for libopts_cv_run_fopen_text - echo "$as_me:$LINENO: result: ${libopts_cv_run_fopen_text}" >&5 -echo "${ECHO_T}${libopts_cv_run_fopen_text}" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${libopts_cv_run_fopen_text}" >&5 +$as_echo "${libopts_cv_run_fopen_text}" >&6; } if test "X${libopts_cv_run_fopen_text}" != Xno then -cat >>confdefs.h <<\_ACEOF -#define FOPEN_TEXT_FLAG "t" -_ACEOF +$as_echo "#define FOPEN_TEXT_FLAG \"t\"" >>confdefs.h else -cat >>confdefs.h <<\_ACEOF -#define FOPEN_TEXT_FLAG "" -_ACEOF +$as_echo "#define FOPEN_TEXT_FLAG \"\"" >>confdefs.h fi @@ -24275,29 +13867,27 @@ _ACEOF # Check to see if not wanting optional option args. - # Check whether --enable-optional-args or --disable-optional-args was given. -if test "${enable_optional_args+set}" = set; then - enableval="$enable_optional_args" - libopts_cv_enable_optional_args=${enable_optional_args} + # Check whether --enable-optional-args was given. +if test "${enable_optional_args+set}" = set; then : + enableval=$enable_optional_args; libopts_cv_enable_optional_args=${enable_optional_args} else - echo "$as_me:$LINENO: checking whether not wanting optional option args" >&5 -echo $ECHO_N "checking whether not wanting optional option args... $ECHO_C" >&6 -if test "${libopts_cv_enable_optional_args+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether not wanting optional option args" >&5 +$as_echo_n "checking whether not wanting optional option args... " >&6; } +if test "${libopts_cv_enable_optional_args+set}" = set; then : + $as_echo_n "(cached) " >&6 else libopts_cv_enable_optional_args=yes fi -echo "$as_me:$LINENO: result: $libopts_cv_enable_optional_args" >&5 -echo "${ECHO_T}$libopts_cv_enable_optional_args" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libopts_cv_enable_optional_args" >&5 +$as_echo "$libopts_cv_enable_optional_args" >&6; } -fi; # end of AC_ARG_ENABLE +fi + # end of AC_ARG_ENABLE if test "X${libopts_cv_enable_optional_args}" = Xno then -cat >>confdefs.h <<\_ACEOF -#define NO_OPTIONAL_OPT_ARGS 1 -_ACEOF +$as_echo "#define NO_OPTIONAL_OPT_ARGS 1" >>confdefs.h fi @@ -24310,16 +13900,12 @@ if test X${INVOKE_LIBOPTS_MACROS_FIRST_done} != Xyes ; then # ================= # AC_HEADER_STDC # ================= - echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -24334,51 +13920,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -24388,18 +13946,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -24409,16 +13963,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -24438,65 +13989,41 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # ================= # AC_HEADER_DIRENT # ================= - - - - - -ac_header_dirent=no + ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do - as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 -echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> @@ -24510,42 +14037,20 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_Header=no" + eval "$as_ac_Header=no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -if test `eval echo '${'$as_ac_Header'}'` = yes; then +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break @@ -24554,256 +14059,116 @@ fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in dir; do +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else - echo "$as_me:$LINENO: checking for library containing opendir" >&5 -echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 -if test "${ac_cv_search_opendir+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS -ac_cv_search_opendir=no -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char opendir (); int main () { -opendir (); +return opendir (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="none required" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_search_opendir" = no; then - for ac_lib in x; do +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char opendir (); -int -main () -{ -opendir (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_search_opendir="-l$ac_lib" -break else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done + ac_cv_search_opendir=no fi +rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 -echo "${ECHO_T}$ac_cv_search_opendir" >&6 -if test "$ac_cv_search_opendir" != no; then - test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi @@ -24813,172 +14178,17 @@ fi # ================= # AC_CHECK_HEADERS # ================= - - - - - - - - - - - - - - - - - - - - -for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ + for ac_header in dlfcn.h errno.h fcntl.h libgen.h memory.h netinet/in.h \ setjmp.h sys/mman.h sys/param.h sys/poll.h sys/procset.h sys/select.h \ sys/socket.h sys/stropts.h sys/time.h sys/un.h sys/wait.h unistd.h \ utime.h sysexits.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -24993,160 +14203,21 @@ done string errno stdlib memory setjmp do eval as_ac_var=\${ac_cv_header_${f}_h+set} test "${as_ac_var}" = set || \ - { { echo "$as_me:$LINENO: error: You must have ${f}.h on your system" >&5 -echo "$as_me: error: You must have ${f}.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have ${f}.h on your system" "$LINENO" 5 done # ================================================ # AC_CHECK_HEADERS: stdarg.h is present define HAVE_STDARG_H, otherwise # if varargs.h is present define HAVE_VARARGS_H. # ================================================ - - -for ac_header in stdarg.h varargs.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdarg.h varargs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -25154,159 +14225,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have stdarg.h or varargs.h on your system" >&5 -echo "$as_me: error: You must have stdarg.h or varargs.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have stdarg.h or varargs.h on your system" "$LINENO" 5 fi # ================================================ # Similarly for the string.h and strings.h headers # ================================================ - - -for ac_header in string.h strings.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in string.h strings.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -25314,160 +14246,20 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have string.h or strings.h on your system" >&5 -echo "$as_me: error: You must have string.h or strings.h on your system" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have string.h or strings.h on your system" "$LINENO" 5 fi # ===================== # ...and limits headers # ===================== - - - -for ac_header in limits.h sys/limits.h values.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in limits.h sys/limits.h values.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi @@ -25475,222 +14267,28 @@ fi done if test `eval echo '${'$as_ac_Header'}'` != yes; then - { { echo "$as_me:$LINENO: error: You must have one of limits.h, sys/limits.h or values.h" >&5 -echo "$as_me: error: You must have one of limits.h, sys/limits.h or values.h" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "You must have one of limits.h, sys/limits.h or values.h" "$LINENO" 5 fi # ======================== # ...and int types headers # ======================== - - -for ac_header in stdint.h inttypes.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then + for ac_header in stdint.h inttypes.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi done - echo "$as_me:$LINENO: checking for int8_t" >&5 -echo $ECHO_N "checking for int8_t... $ECHO_C" >&6 -if test "${ac_cv_type_int8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int8_t *) 0) - return 0; -if (sizeof (int8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int8_t" >&5 -echo "${ECHO_T}$ac_cv_type_int8_t" >&6 -if test $ac_cv_type_int8_t = yes; then + ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default" +if test "x$ac_cv_type_int8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT8_T 1 @@ -25698,63 +14296,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint8_t" >&5 -echo $ECHO_N "checking for uint8_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint8_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint8_t *) 0) - return 0; -if (sizeof (uint8_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint8_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint8_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint8_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint8_t" >&6 -if test $ac_cv_type_uint8_t = yes; then +ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" +if test "x$ac_cv_type_uint8_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT8_T 1 @@ -25762,63 +14305,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int16_t" >&5 -echo $ECHO_N "checking for int16_t... $ECHO_C" >&6 -if test "${ac_cv_type_int16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int16_t *) 0) - return 0; -if (sizeof (int16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int16_t" >&5 -echo "${ECHO_T}$ac_cv_type_int16_t" >&6 -if test $ac_cv_type_int16_t = yes; then +ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default" +if test "x$ac_cv_type_int16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT16_T 1 @@ -25826,63 +14314,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint16_t" >&5 -echo $ECHO_N "checking for uint16_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint16_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint16_t *) 0) - return 0; -if (sizeof (uint16_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint16_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint16_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint16_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint16_t" >&6 -if test $ac_cv_type_uint16_t = yes; then +ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "$ac_includes_default" +if test "x$ac_cv_type_uint16_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT16_T 1 @@ -25890,63 +14323,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for int32_t" >&5 -echo $ECHO_N "checking for int32_t... $ECHO_C" >&6 -if test "${ac_cv_type_int32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int32_t *) 0) - return 0; -if (sizeof (int32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_int32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int32_t" >&5 -echo "${ECHO_T}$ac_cv_type_int32_t" >&6 -if test $ac_cv_type_int32_t = yes; then +ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_int32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INT32_T 1 @@ -25954,63 +14332,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint32_t" >&5 -echo $ECHO_N "checking for uint32_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint32_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint32_t *) 0) - return 0; -if (sizeof (uint32_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint32_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint32_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint32_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint32_t" >&6 -if test $ac_cv_type_uint32_t = yes; then +ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" +if test "x$ac_cv_type_uint32_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT32_T 1 @@ -26018,63 +14341,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for intptr_t" >&5 -echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_intptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((intptr_t *) 0) - return 0; -if (sizeof (intptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_intptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_intptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_intptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_intptr_t" >&6 -if test $ac_cv_type_intptr_t = yes; then +ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" +if test "x$ac_cv_type_intptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_INTPTR_T 1 @@ -26082,63 +14350,8 @@ _ACEOF fi -echo "$as_me:$LINENO: checking for uint_t" >&5 -echo $ECHO_N "checking for uint_t... $ECHO_C" >&6 -if test "${ac_cv_type_uint_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uint_t *) 0) - return 0; -if (sizeof (uint_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uint_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uint_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uint_t" >&5 -echo "${ECHO_T}$ac_cv_type_uint_t" >&6 -if test $ac_cv_type_uint_t = yes; then +ac_fn_c_check_type "$LINENO" "uint_t" "ac_cv_type_uint_t" "$ac_includes_default" +if test "x$ac_cv_type_uint_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT_T 1 @@ -26151,63 +14364,8 @@ fi # ==================== # uintptr type & sizes # ==================== - echo "$as_me:$LINENO: checking for uintptr_t" >&5 -echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6 -if test "${ac_cv_type_uintptr_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((uintptr_t *) 0) - return 0; -if (sizeof (uintptr_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_uintptr_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_uintptr_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5 -echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6 -if test $ac_cv_type_uintptr_t = yes; then + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTPTR_T 1 @@ -26216,1663 +14374,141 @@ _ACEOF else -cat >>confdefs.h <<\_ACEOF -#define uintptr_t unsigned long -_ACEOF +$as_echo "#define uintptr_t unsigned long" >>confdefs.h fi - echo "$as_me:$LINENO: checking for char*" >&5 -echo $ECHO_N "checking for char*... $ECHO_C" >&6 -if test "${ac_cv_type_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char*" >&5 +$as_echo_n "checking size of char*... " >&6; } +if test "${ac_cv_sizeof_charp+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((char* *) 0) - return 0; -if (sizeof (char*)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_charp=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char*))" "ac_cv_sizeof_charp" "$ac_includes_default"; then : -ac_cv_type_charp=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_charp" >&5 -echo "${ECHO_T}$ac_cv_type_charp" >&6 - -echo "$as_me:$LINENO: checking size of char*" >&5 -echo $ECHO_N "checking size of char*... $ECHO_C" >&6 -if test "${ac_cv_sizeof_charp+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_charp" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (char*) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_charp=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_charp" >&5 +$as_echo "$ac_cv_sizeof_charp" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (char*))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_charp=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (char*)); } -unsigned long ulongval () { return (long) (sizeof (char*)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (char*))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (char*)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_charp=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (char*), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_charp=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_charp" >&5 -echo "${ECHO_T}$ac_cv_sizeof_charp" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_CHARP $ac_cv_sizeof_charp _ACEOF - echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6 -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((int *) 0) - return 0; -if (sizeof (int)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : -ac_cv_type_int=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6 - -echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6 -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_int" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (int)); } -unsigned long ulongval () { return (long) (sizeof (int)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (int))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (int)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_int=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF - echo "$as_me:$LINENO: checking for long" >&5 -echo $ECHO_N "checking for long... $ECHO_C" >&6 -if test "${ac_cv_type_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((long *) 0) - return 0; -if (sizeof (long)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_long=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : -ac_cv_type_long=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5 -echo "${ECHO_T}$ac_cv_type_long" >&6 - -echo "$as_me:$LINENO: checking size of long" >&5 -echo $ECHO_N "checking size of long... $ECHO_C" >&6 -if test "${ac_cv_sizeof_long+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_long" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_long=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (long)); } -unsigned long ulongval () { return (long) (sizeof (long)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (long))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (long)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_long=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (long), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_long=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 -echo "${ECHO_T}$ac_cv_sizeof_long" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF - echo "$as_me:$LINENO: checking for short" >&5 -echo $ECHO_N "checking for short... $ECHO_C" >&6 -if test "${ac_cv_type_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((short *) 0) - return 0; -if (sizeof (short)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_short=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : -ac_cv_type_short=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5 -echo "${ECHO_T}$ac_cv_type_short" >&6 - -echo "$as_me:$LINENO: checking size of short" >&5 -echo $ECHO_N "checking size of short... $ECHO_C" >&6 -if test "${ac_cv_sizeof_short+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$ac_cv_type_short" = yes; then - # The cast to unsigned long works around a bug in the HP C Compiler - # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects - # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. - # This bug is HP SR number 8606223364. - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_short=0 + fi fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } -ac_lo= ac_hi= -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)]; -test_array [0] = 0 - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -ac_lo=`expr '(' $ac_mid ')' + 1` -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_short=$ac_lo;; -'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } ;; -esac -else - if test "$cross_compiling" = yes; then - { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -long longval () { return (long) (sizeof (short)); } -unsigned long ulongval () { return (long) (sizeof (short)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - exit (1); - if (((long) (sizeof (short))) < 0) - { - long i = longval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%ld\n", i); - } - else - { - unsigned long i = ulongval (); - if (i != ((long) (sizeof (short)))) - exit (1); - fprintf (f, "%lu\n", i); - } - exit (ferror (f) || fclose (f) != 0); - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_short=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (short), 77 -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -rm -f conftest.val -else - ac_cv_sizeof_short=0 -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 -echo "${ECHO_T}$ac_cv_sizeof_short" >&6 cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF @@ -27882,72 +14518,43 @@ _ACEOF # ---------------------------------------------------------------------- # AC_CHECK_LIB for SVR4 libgen, and use it if it defines pathfind. # ---------------------------------------------------------------------- - -echo "$as_me:$LINENO: checking for pathfind in -lgen" >&5 -echo $ECHO_N "checking for pathfind in -lgen... $ECHO_C" >&6 -if test "${ac_cv_lib_gen_pathfind+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pathfind in -lgen" >&5 +$as_echo_n "checking for pathfind in -lgen... " >&6; } +if test "${ac_cv_lib_gen_pathfind+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgen $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char pathfind (); int main () { -pathfind (); +return pathfind (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gen_pathfind=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_gen_pathfind=no + ac_cv_lib_gen_pathfind=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_gen_pathfind" >&5 -echo "${ECHO_T}$ac_cv_lib_gen_pathfind" >&6 -if test $ac_cv_lib_gen_pathfind = yes; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_pathfind" >&5 +$as_echo "$ac_cv_lib_gen_pathfind" >&6; } +if test "x$ac_cv_lib_gen_pathfind" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGEN 1 _ACEOF @@ -27956,200 +14563,18 @@ _ACEOF fi - -for ac_func in vprintf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_VPRINTF 1 _ACEOF -echo "$as_me:$LINENO: checking for _doprnt" >&5 -echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 -if test "${ac_cv_func__doprnt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define _doprnt to an innocuous variant, in case declares _doprnt. - For example, HP-UX 11i declares gettimeofday. */ -#define _doprnt innocuous__doprnt +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = x""yes; then : -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char _doprnt (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef _doprnt - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char _doprnt (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub__doprnt) || defined (__stub____doprnt) -choke me -#else -char (*f) () = _doprnt; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != _doprnt; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func__doprnt=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func__doprnt=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 -echo "${ECHO_T}$ac_cv_func__doprnt" >&6 -if test $ac_cv_func__doprnt = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_DOPRNT 1 -_ACEOF +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi @@ -28157,108 +14582,14 @@ fi done - - - - - - -for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then + for ac_func in mmap canonicalize_file_name snprintf strdup strchr strrchr +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -28270,13 +14601,9 @@ fi # end of AC_DEFUN of LIBOPTS_CHECK -echo "$as_me:$LINENO: checking if $CC can handle #warning" >&5 -echo $ECHO_N "checking if $CC can handle #warning... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC can handle #warning" >&5 +$as_echo_n "checking if $CC can handle #warning... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -28287,64 +14614,88 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cpp_warning=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_cpp_warning=no + ac_cv_cpp_warning=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_cv_cpp_warning" >&5 -echo "${ECHO_T}$ac_cv_cpp_warning" >&6 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_warning" >&5 +$as_echo "$ac_cv_cpp_warning" >&6; } case "$ac_cv_cpp_warning" in no) -cat >>confdefs.h <<\_ACEOF -#define NO_OPTION_NAME_WARNINGS 1 -_ACEOF +$as_echo "#define NO_OPTION_NAME_WARNINGS 1" >>confdefs.h - echo "$as_me:$LINENO: result: Enabling NO_OPTION_NAME_WARNINGS as #warning does not work" >&5 -echo "${ECHO_T}Enabling NO_OPTION_NAME_WARNINGS as #warning does not work" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Enabling NO_OPTION_NAME_WARNINGS as #warning does not work" >&5 +$as_echo "Enabling NO_OPTION_NAME_WARNINGS as #warning does not work" >&6; } ;; esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +case "$ac_cv_c_inline" in + '') + ;; + *) + +$as_echo "#define HAVE_INLINE 1" >>confdefs.h + + +esac + + # Checks for libraries. # Checks for header files. -echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -28359,51 +14710,23 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_stdc=no + ac_cv_header_stdc=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : + $EGREP "memchr" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -28413,18 +14736,14 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : + $EGREP "free" >/dev/null 2>&1; then : + else ac_cv_header_stdc=no fi @@ -28434,16 +14753,13 @@ fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then + if test "$cross_compiling" = yes; then : : else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -28463,199 +14779,37 @@ main () for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); - exit (0); + return 2; + return 0; } _ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +if ac_fn_c_try_run "$LINENO"; then : -( exit $ac_status ) -ac_cv_header_stdc=no +else + ac_cv_header_stdc=no fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + fi fi -fi -echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF +$as_echo "#define STDC_HEADERS 1" >>confdefs.h fi - - - - - - - - - - - - for ac_header in arpa/inet.h fcntl.h float.h limits.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h syslog.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------------ ## -## Report this to the AC_PACKAGE_NAME lists. ## -## ------------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -28664,16 +14818,12 @@ done # Checks for typedefs, structures, and compiler characteristics. -echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 -echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 -if test "${ac_cv_c_const+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int @@ -28683,10 +14833,10 @@ main () #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; - const charset x; + const charset cs; /* SunOS 4.1.1 cc rejects this. */ - char const *const *ccp; - char **p; + char const *const *pcpcc; + char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; @@ -28695,16 +14845,17 @@ main () an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; - ccp = &g + (g ? g-g : 0); + pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ - ++ccp; - p = (char**) ccp; - ccp = (char const *const *) p; + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; + if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; @@ -28723,130 +14874,47 @@ main () } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; + if (!foo) return 0; } + return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_c_const=no + ac_cv_c_const=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 -echo "${ECHO_T}$ac_cv_c_const" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then -cat >>confdefs.h <<\_ACEOF -#define const -_ACEOF +$as_echo "#define const /**/" >>confdefs.h fi -echo "$as_me:$LINENO: checking for size_t" >&5 -echo $ECHO_N "checking for size_t... $ECHO_C" >&6 -if test "${ac_cv_type_size_t+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -if ((size_t *) 0) - return 0; -if (sizeof (size_t)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_size_t=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = x""yes; then : -ac_cv_type_size_t=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 -echo "${ECHO_T}$ac_cv_type_size_t" >&6 -if test $ac_cv_type_size_t = yes; then - : else cat >>confdefs.h <<_ACEOF -#define size_t unsigned +#define size_t unsigned int _ACEOF fi -echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 -echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 -if test "${ac_cv_header_time+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if test "${ac_cv_header_time+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -28861,57 +14929,27 @@ return 0; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_header_time=no + ac_cv_header_time=no fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 -echo "${ECHO_T}$ac_cv_header_time" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then -cat >>confdefs.h <<\_ACEOF -#define TIME_WITH_SYS_TIME 1 -_ACEOF +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 -echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6 -if test "${ac_cv_struct_tm+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 +$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } +if test "${ac_cv_struct_tm+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include @@ -28919,64 +14957,36 @@ cat >>conftest.$ac_ext <<_ACEOF int main () { -struct tm *tp; tp->tm_sec; +struct tm tm; + int *p = &tm.tm_sec; + return !p; ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_struct_tm=sys/time.h + ac_cv_struct_tm=sys/time.h fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 -echo "${ECHO_T}$ac_cv_struct_tm" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 +$as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then -cat >>confdefs.h <<\_ACEOF -#define TM_IN_SYS_TIME 1 -_ACEOF +$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi -echo "$as_me:$LINENO: checking for ss_family field in struct sockaddr_storage" >&5 -echo $ECHO_N "checking for ss_family field in struct sockaddr_storage... $ECHO_C" >&6 -if test "${ac_cv_have_ss_family_in_struct_ss+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ss_family field in struct sockaddr_storage" >&5 +$as_echo_n "checking for ss_family field in struct sockaddr_storage... " >&6; } +if test "${ac_cv_have_ss_family_in_struct_ss+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -28990,61 +15000,31 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_ss_family_in_struct_ss="yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_ss_family_in_struct_ss="no" + ac_cv_have_ss_family_in_struct_ss="no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_have_ss_family_in_struct_ss" >&5 -echo "${ECHO_T}$ac_cv_have_ss_family_in_struct_ss" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_ss_family_in_struct_ss" >&5 +$as_echo "$ac_cv_have_ss_family_in_struct_ss" >&6; } case "$ac_cv_have_ss_family_in_struct_ss" in yes) -cat >>confdefs.h <<\_ACEOF -#define HAVE_SS_FAMILY_IN_SS 1 -_ACEOF +$as_echo "#define HAVE_SS_FAMILY_IN_SS 1" >>confdefs.h ;; esac -echo "$as_me:$LINENO: checking for __ss_family field in struct sockaddr_storage" >&5 -echo $ECHO_N "checking for __ss_family field in struct sockaddr_storage... $ECHO_C" >&6 -if test "${ac_cv_have___ss_family_in_struct_ss+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __ss_family field in struct sockaddr_storage" >&5 +$as_echo_n "checking for __ss_family field in struct sockaddr_storage... " >&6; } +if test "${ac_cv_have___ss_family_in_struct_ss+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include @@ -29058,47 +15038,21 @@ main () return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have___ss_family_in_struct_ss="yes" else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have___ss_family_in_struct_ss="no" + ac_cv_have___ss_family_in_struct_ss="no" fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_have___ss_family_in_struct_ss" >&5 -echo "${ECHO_T}$ac_cv_have___ss_family_in_struct_ss" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have___ss_family_in_struct_ss" >&5 +$as_echo "$ac_cv_have___ss_family_in_struct_ss" >&6; } case "$ac_cv_have___ss_family_in_struct_ss" in yes) -cat >>confdefs.h <<\_ACEOF -#define HAVE___SS_FAMILY_IN_SS 1 -_ACEOF +$as_echo "#define HAVE___SS_FAMILY_IN_SS 1" >>confdefs.h ;; esac @@ -29119,1164 +15073,275 @@ _ACEOF esac # Checks for library functions. -echo "$as_me:$LINENO: checking for working memcmp" >&5 -echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6 -if test "${ac_cv_func_memcmp_working+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_memcmp_working=no -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* Some versions of memcmp are not 8-bit clean. */ - char c0 = 0x40, c1 = 0x80, c2 = 0x81; - if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0) - exit (1); - - /* The Next x86 OpenStep bug shows up only when comparing 16 bytes - or more and with at least one buffer not starting on a 4-byte boundary. - William Lewis provided this test program. */ - { - char foo[21]; - char bar[21]; - int i; - for (i = 0; i < 4; i++) - { - char *a = foo + i; - char *b = bar + i; - strcpy (a, "--------01111111"); - strcpy (b, "--------10000000"); - if (memcmp (a, b, 16) >= 0) - exit (1); - } - exit (0); - } - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_memcmp_working=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_func_memcmp_working=no -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -fi -echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 -echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6 -test $ac_cv_func_memcmp_working = no && case $LIBOBJS in - "memcmp.$ac_objext" | \ - *" memcmp.$ac_objext" | \ - "memcmp.$ac_objext "* | \ - *" memcmp.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; -esac - - -echo "$as_me:$LINENO: checking for function prototypes" >&5 -echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6 -if test "$ac_cv_prog_cc_stdc" != no; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define PROTOTYPES 1 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define __PROTOTYPES 1 -_ACEOF - -else - echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi - -echo "$as_me:$LINENO: checking whether setvbuf arguments are reversed" >&5 -echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6 -if test "${ac_cv_func_setvbuf_reversed+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +#AC_FUNC_MEMCMP dnl HMS: we don't have a memcmp.c to use here, so why bother? +if test "${ac_cv_func_setvbuf_reversed+set}" = set; then : + $as_echo_n "(cached) " >&6 else ac_cv_func_setvbuf_reversed=no - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -# if PROTOTYPES - int (setvbuf) (FILE *, int, char *, size_t); -# endif -int -main () -{ -char buf; return setvbuf (stdout, _IOLBF, &buf, 1); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -# if PROTOTYPES - int (setvbuf) (FILE *, int, char *, size_t); -# endif -int -main () -{ -char buf; return setvbuf (stdout, &buf, _IOLBF, 1); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - # It compiles and links either way, so it must not be declared - # with a prototype and most likely this is a K&R C compiler. - # Try running it. - if test "$cross_compiling" = yes; then - : # Assume setvbuf is not reversed when cross-compiling. +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 +$as_echo_n "checking return type of signal handlers... " >&6; } +if test "${ac_cv_type_signal+set}" = set; then : + $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -/* This call has the arguments reversed. - A reversed system may check and see that the address of buf - is not _IOLBF, _IONBF, or _IOFBF, and return nonzero. */ - char buf; - if (setvbuf (stdout, _IOLBF, &buf, 1) != 0) - exit (1); - putchar ('\r'); - exit (0); /* Non-reversed systems SEGV here. */ - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_setvbuf_reversed=yes -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -rm -f core *.core -fi -rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - ac_cv_func_setvbuf_reversed=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_setvbuf_reversed" >&5 -echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6 -if test $ac_cv_func_setvbuf_reversed = yes; then - -cat >>confdefs.h <<\_ACEOF -#define SETVBUF_REVERSED 1 -_ACEOF - -fi - -echo "$as_me:$LINENO: checking return type of signal handlers" >&5 -echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 -if test "${ac_cv_type_signal+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include -#ifdef signal -# undef signal -#endif -#ifdef __cplusplus -extern "C" void (*signal (int, void (*)(int)))(int); -#else -void (*signal ()) (); -#endif int main () { -int i; +return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_type_signal=void +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_type_signal=int else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_type_signal=int + ac_cv_type_signal=void fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 -echo "${ECHO_T}$ac_cv_type_signal" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 +$as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF - for ac_func in alarm -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "alarm" "ac_cv_func_alarm" +if test "x$ac_cv_func_alarm" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_ALARM 1 _ACEOF fi done -echo "$as_me:$LINENO: checking for gethostent" >&5 -echo $ECHO_N "checking for gethostent... $ECHO_C" >&6 -if test "${ac_cv_func_gethostent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 +ac_fn_c_check_func "$LINENO" "gethostent" "ac_cv_func_gethostent" +if test "x$ac_cv_func_gethostent" = x""yes; then : + else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostent" >&5 +$as_echo_n "checking for library containing gethostent... " >&6; } +if test "${ac_cv_search_gethostent+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Define gethostent to an innocuous variant, in case declares gethostent. - For example, HP-UX 11i declares gettimeofday. */ -#define gethostent innocuous_gethostent -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char gethostent (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef gethostent - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -char gethostent (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_gethostent) || defined (__stub___gethostent) -choke me -#else -char (*f) () = gethostent; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != gethostent; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_func_gethostent=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_func_gethostent=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_func_gethostent" >&5 -echo "${ECHO_T}$ac_cv_func_gethostent" >&6 -if test $ac_cv_func_gethostent = yes; then - : -else - -echo "$as_me:$LINENO: checking for gethostent in -lnsl" >&5 -echo $ECHO_N "checking for gethostent in -lnsl... $ECHO_C" >&6 -if test "${ac_cv_lib_nsl_gethostent+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnsl -lsocket $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char gethostent (); int main () { -gethostent (); +return gethostent (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_nsl_gethostent=yes +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib -lsocket $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_gethostent=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_gethostent+set}" = set; then : + break +fi +done +if test "${ac_cv_search_gethostent+set}" = set; then : + else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_nsl_gethostent=no + ac_cv_search_gethostent=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostent" >&5 -echo "${ECHO_T}$ac_cv_lib_nsl_gethostent" >&6 -if test $ac_cv_lib_nsl_gethostent = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBNSL 1 -_ACEOF - - LIBS="-lnsl $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostent" >&5 +$as_echo "$ac_cv_search_gethostent" >&6; } +ac_res=$ac_cv_search_gethostent +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi - - - for ac_func in gettimeofday inet_ntoa memset -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done - for ac_func in socket -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_SOCKET 1 _ACEOF else - -echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 -echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6 -if test "${ac_cv_lib_socket_socket+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if test "${ac_cv_search_socket+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsocket $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char socket (); int main () { -socket (); +return socket (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_socket_socket=yes +for ac_lib in '' socket; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_socket+set}" = set; then : + break +fi +done +if test "${ac_cv_search_socket+set}" = set; then : + else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_socket_socket=no + ac_cv_search_socket=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 -echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6 -if test $ac_cv_lib_socket_socket = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBSOCKET 1 -_ACEOF - - LIBS="-lsocket $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi done - for ac_func in sqrt -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "sqrt" "ac_cv_func_sqrt" +if test "x$ac_cv_func_sqrt" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_SQRT 1 _ACEOF else - -echo "$as_me:$LINENO: checking for sqrt in -lm" >&5 -echo $ECHO_N "checking for sqrt in -lm... $ECHO_C" >&6 -if test "${ac_cv_lib_m_sqrt+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5 +$as_echo_n "checking for library containing sqrt... " >&6; } +if test "${ac_cv_search_sqrt+set}" = set; then : + $as_echo_n "(cached) " >&6 else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lm $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -/* Override any gcc2 internal prototype to avoid an error. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ char sqrt (); int main () { -sqrt (); +return sqrt (); ; return 0; } _ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_m_sqrt=yes +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_sqrt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_sqrt+set}" = set; then : + break +fi +done +if test "${ac_cv_search_sqrt+set}" = set; then : + else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_m_sqrt=no + ac_cv_search_sqrt=no fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS fi -echo "$as_me:$LINENO: result: $ac_cv_lib_m_sqrt" >&5 -echo "${ECHO_T}$ac_cv_lib_m_sqrt" >&6 -if test $ac_cv_lib_m_sqrt = yes; then - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBM 1 -_ACEOF - - LIBS="-lm $LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5 +$as_echo "$ac_cv_search_sqrt" >&6; } +ac_res=$ac_cv_search_sqrt +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi done - for ac_func in strrchr -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 -if eval "test \"\${$as_ac_var+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -{ -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -char (*f) () = $ac_func; -#endif -#ifdef __cplusplus -} -#endif - -int -main () -{ -return f != $ac_func; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -eval "$as_ac_var=no" -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 -if test `eval echo '${'$as_ac_var'}'` = yes; then +do : + ac_fn_c_check_func "$LINENO" "strrchr" "ac_cv_func_strrchr" +if test "x$ac_cv_func_strrchr" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_STRRCHR 1 _ACEOF fi @@ -30300,16 +15365,16 @@ case "$host" in ;; esac -echo "$as_me:$LINENO: checking for bin subdirectory" >&5 -echo $ECHO_N "checking for bin subdirectory... $ECHO_C" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bin subdirectory" >&5 +$as_echo_n "checking for bin subdirectory... " >&6; } -# Check whether --with-binsubdir or --without-binsubdir was given. -if test "${with_binsubdir+set}" = set; then - withval="$with_binsubdir" - use_binsubdir="$withval" +# Check whether --with-binsubdir was given. +if test "${with_binsubdir+set}" = set; then : + withval=$with_binsubdir; use_binsubdir="$withval" else use_binsubdir="bin" -fi; +fi + case "$use_binsubdir" in bin) @@ -30317,17 +15382,15 @@ case "$use_binsubdir" in sbin) ;; *) - { { echo "$as_me:$LINENO: error: <$use_binsubdir> is illegal - must be \"bin\" or \"sbin\"" >&5 -echo "$as_me: error: <$use_binsubdir> is illegal - must be \"bin\" or \"sbin\"" >&2;} - { (exit 1); exit 1; }; } + as_fn_error "<$use_binsubdir> is illegal - must be \"bin\" or \"sbin\"" "$LINENO" 5 ;; esac -echo "$as_me:$LINENO: result: $use_binsubdir" >&5 -echo "${ECHO_T}$use_binsubdir" >&6 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_binsubdir" >&5 +$as_echo "$use_binsubdir" >&6; } BINSUBDIR=$use_binsubdir - ac_config_files="$ac_config_files Makefile" +ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -30347,39 +15410,59 @@ _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. +# So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -{ +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; + ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n \ - "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; - esac; -} | + esac | + sort +) | sed ' + /^ac_cv_env_/b end t clear - : clear + :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end - /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - : end' >>confcache -if diff $cache_file confcache >/dev/null 2>&1; then :; else - if test -w $cache_file; then - test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else - echo "not updating unwritable cache $cache_file" + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -30388,80 +15471,57 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/; -s/:*\${srcdir}:*/:/; -s/:*@srcdir@:*/:/; -s/^\([^=]*=[ ]*\):*/\1/; -s/:*$//; -s/^[^=]*=[ ]*$//; -}' -fi - DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` - # 2. Add them. - ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${INSTALL_LIBOPTS_TRUE}" && test -z "${INSTALL_LIBOPTS_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"INSTALL_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"INSTALL_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "conditional \"INSTALL_LIBOPTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NEED_LIBOPTS_TRUE}" && test -z "${NEED_LIBOPTS_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"NEED_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"NEED_LIBOPTS\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } + as_fn_error "conditional \"NEED_LIBOPTS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} +ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. @@ -30471,81 +15531,252 @@ cat >$CONFIG_STATUS <<_ACEOF debug=false ac_cs_recheck=false ac_cs_silent=false + SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then - set -o posix -fi -DUALCASE=1; export DUALCASE # for MKS sh - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset + setopt NO_GLOB_SUBST else - as_unset=false + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac fi -# Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - $as_unset $as_var - fi -done +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1; then +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi -if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi -# Name of the executable. -as_me=`$as_basename "$0" || +as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)$' \| \ - . : '\(.\)' 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } - /^X\/\(\/\/\)$/{ s//\1/; q; } - /^X\/\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` - -# PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' @@ -30553,148 +15784,123 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | - sed ' - N - s,$,-, - : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, - t loop - s,-$,, - s,^['$as_cr_digits']*\n,, - ' >$as_me.lineno && - chmod +x $as_me.lineno || - { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 -echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensible to this). - . ./$as_me.lineno - # Exit status is that of the last command. - exit -} - - -case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in - *c*,-n*) ECHO_N= ECHO_C=' -' ECHO_T=' ' ;; - *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; - *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; esac -if expr a : '\(a\)' >/dev/null 2>&1; then - as_expr=expr -else - as_expr=false -fi - rm -f conf$$ conf$$.exe conf$$.file -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - # We could just check for DJGPP; but this test a) works b) is more generic - # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). - if test -f conf$$.exe; then - # Don't use ln at all; we don't have any links - as_ln_s='cp -p' - else +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' fi -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln else as_ln_s='cp -p' fi -rm -f conf$$ conf$$.exe conf$$.file +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then - as_mkdir_p=: + as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi -as_executable_p="test -f" +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -30703,31 +15909,20 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" -# IFS -# We need space, tab and new line, in precisely that order. -as_nl=' -' -IFS=" $as_nl" - -# CDPATH. -$as_unset CDPATH - exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 -# Open the log real soon, to keep \$[0] and so on meaningful, and to +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. Logging --version etc. is OK. -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX -} >&5 -cat >&5 <<_CSEOF - +# values after options handling. +ac_log=" This file was extended by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -30735,45 +15930,47 @@ generated by GNU Autoconf 2.59. Invocation command line was CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ -_CSEOF -echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 -echo >&5 +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + _ACEOF +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. -if test -n "$ac_config_files"; then - echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS -fi +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" -if test -n "$ac_config_headers"; then - echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_links"; then - echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS -fi - -if test -n "$ac_config_commands"; then - echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS -fi - -cat >>$CONFIG_STATUS <<\_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. -Usage: $0 [OPTIONS] [FILE]... +Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE Configuration files: $config_files @@ -30784,84 +15981,86 @@ $config_headers Configuration commands: $config_commands -Report bugs to ." -_ACEOF +Report bugs to the package provider." -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.59, - with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." -srcdir=$srcdir -INSTALL="$INSTALL" + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) - ac_option=`expr "x$1" : 'x\([^=]*\)='` - ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; - -*) + *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; - *) # This is not an option, so the user has probably given explicit - # arguments. - ac_option=$1 - ac_need_defaults=false;; esac case $ac_option in # Handling of the options. -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; - --version | --vers* | -V ) - echo "$ac_cs_version"; exit 0 ;; - --he | --h) - # Conflict between --help and --header - { { echo "$as_me:$LINENO: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: ambiguous option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; };; - --help | --hel | -h ) - echo "$ac_cs_usage"; exit 0 ;; - --debug | --d* | -d ) + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift - CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. - -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&5 -echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2;} - { (exit 1); exit 1; }; } ;; + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; - *) ac_config_targets="$ac_config_targets $1" ;; + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; esac shift @@ -30875,40 +16074,52 @@ if $ac_cs_silent; then fi _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" fi _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 -cat >>$CONFIG_STATUS <<_ACEOF +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # -# INIT-COMMANDS section. +# INIT-COMMANDS # - AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF +# Handling of arguments. for ac_config_target in $ac_config_targets do - case "$ac_config_target" in - # Handling of arguments. - "libopts/Makefile" ) CONFIG_FILES="$CONFIG_FILES libopts/Makefile" ;; - "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libopts/Makefile") CONFIG_FILES="$CONFIG_FILES libopts/Makefile" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done + # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely @@ -30920,842 +16131,680 @@ if $ac_need_defaults; then fi # Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason to put it here, and in addition, +# simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. -# Create a temporary directory, and hook for its removal unless debugging. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 } - # Create a (secure) tmp directory for tmp files. { - tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { - tmp=./confstat$$-$RANDOM - (umask 077 && mkdir $tmp) -} || + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + { - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi -# -# CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "\$CONFIG_FILES"; then - # Protect against being on the right side of a sed subst in config.status. - sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; - s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF -s,@SHELL@,$SHELL,;t t -s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t -s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t -s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t -s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t -s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t -s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t -s,@exec_prefix@,$exec_prefix,;t t -s,@prefix@,$prefix,;t t -s,@program_transform_name@,$program_transform_name,;t t -s,@bindir@,$bindir,;t t -s,@sbindir@,$sbindir,;t t -s,@libexecdir@,$libexecdir,;t t -s,@datadir@,$datadir,;t t -s,@sysconfdir@,$sysconfdir,;t t -s,@sharedstatedir@,$sharedstatedir,;t t -s,@localstatedir@,$localstatedir,;t t -s,@libdir@,$libdir,;t t -s,@includedir@,$includedir,;t t -s,@oldincludedir@,$oldincludedir,;t t -s,@infodir@,$infodir,;t t -s,@mandir@,$mandir,;t t -s,@build_alias@,$build_alias,;t t -s,@host_alias@,$host_alias,;t t -s,@target_alias@,$target_alias,;t t -s,@DEFS@,$DEFS,;t t -s,@ECHO_C@,$ECHO_C,;t t -s,@ECHO_N@,$ECHO_N,;t t -s,@ECHO_T@,$ECHO_T,;t t -s,@LIBS@,$LIBS,;t t -s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t -s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t -s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@PACKAGE@,$PACKAGE,;t t -s,@VERSION@,$VERSION,;t t -s,@ACLOCAL@,$ACLOCAL,;t t -s,@AUTOCONF@,$AUTOCONF,;t t -s,@AUTOMAKE@,$AUTOMAKE,;t t -s,@AUTOHEADER@,$AUTOHEADER,;t t -s,@MAKEINFO@,$MAKEINFO,;t t -s,@install_sh@,$install_sh,;t t -s,@STRIP@,$STRIP,;t t -s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t -s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t -s,@mkdir_p@,$mkdir_p,;t t -s,@AWK@,$AWK,;t t -s,@SET_MAKE@,$SET_MAKE,;t t -s,@am__leading_dot@,$am__leading_dot,;t t -s,@AMTAR@,$AMTAR,;t t -s,@am__tar@,$am__tar,;t t -s,@am__untar@,$am__untar,;t t -s,@build@,$build,;t t -s,@build_cpu@,$build_cpu,;t t -s,@build_vendor@,$build_vendor,;t t -s,@build_os@,$build_os,;t t -s,@host@,$host,;t t -s,@host_cpu@,$host_cpu,;t t -s,@host_vendor@,$host_vendor,;t t -s,@host_os@,$host_os,;t t -s,@CC@,$CC,;t t -s,@CFLAGS@,$CFLAGS,;t t -s,@LDFLAGS@,$LDFLAGS,;t t -s,@CPPFLAGS@,$CPPFLAGS,;t t -s,@ac_ct_CC@,$ac_ct_CC,;t t -s,@EXEEXT@,$EXEEXT,;t t -s,@OBJEXT@,$OBJEXT,;t t -s,@DEPDIR@,$DEPDIR,;t t -s,@am__include@,$am__include,;t t -s,@am__quote@,$am__quote,;t t -s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t -s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t -s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t -s,@CCDEPMODE@,$CCDEPMODE,;t t -s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t -s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t -s,@EGREP@,$EGREP,;t t -s,@LN_S@,$LN_S,;t t -s,@ECHO@,$ECHO,;t t -s,@AR@,$AR,;t t -s,@ac_ct_AR@,$ac_ct_AR,;t t -s,@RANLIB@,$RANLIB,;t t -s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t -s,@CPP@,$CPP,;t t -s,@CXX@,$CXX,;t t -s,@CXXFLAGS@,$CXXFLAGS,;t t -s,@ac_ct_CXX@,$ac_ct_CXX,;t t -s,@CXXDEPMODE@,$CXXDEPMODE,;t t -s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t -s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t -s,@CXXCPP@,$CXXCPP,;t t -s,@F77@,$F77,;t t -s,@FFLAGS@,$FFLAGS,;t t -s,@ac_ct_F77@,$ac_ct_F77,;t t -s,@LIBTOOL@,$LIBTOOL,;t t -s,@LIBOPTS_DIR@,$LIBOPTS_DIR,;t t -s,@INSTALL_LIBOPTS_TRUE@,$INSTALL_LIBOPTS_TRUE,;t t -s,@INSTALL_LIBOPTS_FALSE@,$INSTALL_LIBOPTS_FALSE,;t t -s,@NEED_LIBOPTS_TRUE@,$NEED_LIBOPTS_TRUE,;t t -s,@NEED_LIBOPTS_FALSE@,$NEED_LIBOPTS_FALSE,;t t -s,@LIBOPTS_LDADD@,$LIBOPTS_LDADD,;t t -s,@LIBOPTS_CFLAGS@,$LIBOPTS_CFLAGS,;t t -s,@LIBOBJS@,$LIBOBJS,;t t -s,@BINSUBDIR@,$BINSUBDIR,;t t -s,@LTLIBOBJS@,$LTLIBOBJS,;t t -CEOF - -_ACEOF - - cat >>$CONFIG_STATUS <<\_ACEOF - # Split the substitutions into bite-sized pieces for seds with - # small command number limits, like on Digital OSF/1 and HP-UX. - ac_max_sed_lines=48 - ac_sed_frag=1 # Number of current file. - ac_beg=1 # First line for current file. - ac_end=$ac_max_sed_lines # Line after last line for current file. - ac_more_lines=: - ac_sed_cmds= - while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - else - sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag - fi - if test ! -s $tmp/subs.frag; then - ac_more_lines=false - else - # The purpose of the label and of the branching condition is to - # speed up the sed processing (if there are no `@' at all, there - # is no need to browse any of the substitutions). - # These are the two extra sed commands mentioned above. - (echo ':t - /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" - else - ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" - fi - ac_sed_frag=`expr $ac_sed_frag + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_lines` - fi - done - if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat - fi +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; esac - # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. - ac_dir=`(dirname "$ac_file") 2>/dev/null || + ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix case $srcdir in - .) # No --srcdir option. We are building in place. + .) # We are building in place. ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + case $ac_mode in + :F) + # + # CONFIG_FILE + # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac - - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - configure_input= - else - configure_input="$ac_file. " - fi - configure_input=$configure_input"Generated from `echo $ac_file_in | - sed 's,.*/,,'` by configure." - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } _ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub $extrasub _ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s,@configure_input@,$configure_input,;t t -s,@srcdir@,$ac_srcdir,;t t -s,@abs_srcdir@,$ac_abs_srcdir,;t t -s,@top_srcdir@,$ac_top_srcdir,;t t -s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t -s,@builddir@,$ac_builddir,;t t -s,@abs_builddir@,$ac_abs_builddir,;t t -s,@top_builddir@,$ac_top_builddir,;t t -s,@abs_top_builddir@,$ac_abs_top_builddir,;t t -s,@INSTALL@,$ac_INSTALL,;t t -" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out - rm -f $tmp/stdin - if test x"$ac_file" != x-; then - mv $tmp/out $ac_file - else - cat $tmp/out - rm -f $tmp/out - fi +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} -# -# CONFIG_HEADER section. -# - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='[ ].*$,\1#\2' -ac_dC=' ' -ac_dD=',;t' -# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='$,\1#\2define\3' -ac_uC=' ' -ac_uD=',;t' - -for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + rm -f "$tmp/stdin" case $ac_file in - - | *:- | *:-:* ) # input from stdin - cat >$tmp/stdin - ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; - * ) ac_file_in=$ac_file.in ;; - esac - - test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - - # First look for the input files in the build tree, otherwise in the - # src tree. - ac_file_inputs=`IFS=: - for f in $ac_file_in; do - case $f in - -) echo $tmp/stdin ;; - [\\/$]*) - # Absolute (can't be DOS-style, as IFS=:) - test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. - echo "$f";; - *) # Relative - if test -f "$f"; then - # Build tree - echo "$f" - elif test -f "$srcdir/$f"; then - # Source tree - echo "$srcdir/$f" - else - # /dev/null tree - { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 -echo "$as_me: error: cannot find input file: $f" >&2;} - { (exit 1); exit 1; }; } - fi;; - esac - done` || { (exit 1); exit 1; } - # Remove the trailing spaces. - sed 's/[ ]*$//' $ac_file_inputs >$tmp/in - -_ACEOF - -# Transform confdefs.h into two sed scripts, `conftest.defines' and -# `conftest.undefs', that substitutes the proper values into -# config.h.in to produce config.h. The first handles `#define' -# templates, and the second `#undef' templates. -# And first: Protect against being on the right side of a sed subst in -# config.status. Protect against being in an unquoted here document -# in config.status. -rm -f conftest.defines conftest.undefs -# Using a here document instead of a string reduces the quoting nightmare. -# Putting comments in sed scripts is not portable. -# -# `end' is used to avoid that the second main sed command (meant for -# 0-ary CPP macros) applies to n-ary macro definitions. -# See the Autoconf documentation for `clear'. -cat >confdef2sed.sed <<\_ACEOF -s/[\\&,]/\\&/g -s,[\\$`],\\&,g -t clear -: clear -s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp -t end -s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp -: end -_ACEOF -# If some macros were called several times there might be several times -# the same #defines, which is useless. Nevertheless, we may not want to -# sort them, since we want the *last* AC-DEFINE to be honored. -uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines -sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs -rm -f confdef2sed.sed - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >>conftest.undefs <<\_ACEOF -s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, -_ACEOF - -# Break up conftest.defines because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS -echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS -echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS -echo ' :' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.defines >/dev/null -do - # Write a limited-size here document to $tmp/defines.sed. - echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#define' lines. - echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/defines.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail - rm -f conftest.defines - mv conftest.tail conftest.defines -done -rm -f conftest.defines -echo ' fi # grep' >>$CONFIG_STATUS -echo >>$CONFIG_STATUS - -# Break up conftest.undefs because some shells have a limit on the size -# of here documents, and old seds have small limits too (100 cmds). -echo ' # Handle all the #undef templates' >>$CONFIG_STATUS -rm -f conftest.tail -while grep . conftest.undefs >/dev/null -do - # Write a limited-size here document to $tmp/undefs.sed. - echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS - # Speed up: don't consider the non `#undef' - echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS - # Work around the forget-to-reset-the-flag bug. - echo 't clr' >>$CONFIG_STATUS - echo ': clr' >>$CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS - echo 'CEOF - sed -f $tmp/undefs.sed $tmp/in >$tmp/out - rm -f $tmp/in - mv $tmp/out $tmp/in -' >>$CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail - rm -f conftest.undefs - mv conftest.tail conftest.undefs -done -rm -f conftest.undefs - -cat >>$CONFIG_STATUS <<\_ACEOF - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - if test x"$ac_file" = x-; then - echo "/* Generated by configure. */" >$tmp/config.h - else - echo "/* $ac_file. Generated by configure. */" >$tmp/config.h - fi - cat $tmp/in >>$tmp/config.h - rm -f $tmp/in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # if test x"$ac_file" != x-; then - if diff $ac_file $tmp/config.h >/dev/null 2>&1; then - { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 -echo "$as_me: $ac_file is unchanged" >&6;} + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} else - ac_dir=`(dirname "$ac_file") 2>/dev/null || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - rm -f $ac_file - mv $tmp/config.h $ac_file + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else - cat $tmp/config.h - rm -f $tmp/config.h + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 fi -# Compute $ac_file's index in $config_headers. +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in - $ac_file | $ac_file:* ) + $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done -echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || -$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X$ac_file : 'X\(//\)[^/]' \| \ - X$ac_file : 'X\(//\)$' \| \ - X$ac_file : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X$ac_file | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'`/stamp-h$_am_stamp_count -done -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; -# -# CONFIG_COMMANDS section. -# -for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue - ac_dest=`echo "$ac_file" | sed 's,:.*,,'` - ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` - ac_dir=`(dirname "$ac_dest") 2>/dev/null || -$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_dest" : 'X\(//\)[^/]' \| \ - X"$ac_dest" : 'X\(//\)$' \| \ - X"$ac_dest" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$ac_dest" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p "$ac_dir" - else - as_dir="$ac_dir" - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 -echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} - { (exit 1); exit 1; }; }; } - - ac_builddir=. - -if test "$ac_dir" != .; then - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A "../" for each directory in $ac_dir_suffix. - ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` -else - ac_dir_suffix= ac_top_builddir= -fi - -case $srcdir in - .) # No --srcdir option. We are building in place. - ac_srcdir=. - if test -z "$ac_top_builddir"; then - ac_top_srcdir=. - else - ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` - fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir ;; - *) # Relative path. - ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_builddir$srcdir ;; -esac - -# Do not use `cd foo && pwd` to compute absolute paths, because -# the directories may not exist. -case `pwd` in -.) ac_abs_builddir="$ac_dir";; -*) - case "$ac_dir" in - .) ac_abs_builddir=`pwd`;; - [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; - *) ac_abs_builddir=`pwd`/"$ac_dir";; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_builddir=${ac_top_builddir}.;; -*) - case ${ac_top_builddir}. in - .) ac_abs_top_builddir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; - *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_srcdir=$ac_srcdir;; -*) - case $ac_srcdir in - .) ac_abs_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; - *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; - esac;; -esac -case $ac_abs_builddir in -.) ac_abs_top_srcdir=$ac_top_srcdir;; -*) - case $ac_top_srcdir in - .) ac_abs_top_srcdir=$ac_abs_builddir;; - [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; - *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; - esac;; -esac + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac - { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 -echo "$as_me: executing $ac_dest commands" >&6;} - case $ac_dest in - depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`(dirname "$mf") 2>/dev/null || + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`(dirname "$file") 2>/dev/null || + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` - { if $as_mkdir_p; then - mkdir -p $dirpart/$fdir - else - as_dir=$dirpart/$fdir - as_dirs= - while test ! -d "$as_dir"; do - as_dirs="$as_dir $as_dirs" - as_dir=`(dirname "$as_dir") 2>/dev/null || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| \ - . : '\(.\)' 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } - /^X\(\/\/\)[^/].*/{ s//\1/; q; } - /^X\(\/\/\)$/{ s//\1/; q; } - /^X\(\/\).*/{ s//\1/; q; } - s/.*/./; q'` + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" done - test ! -n "$as_dirs" || mkdir $as_dirs - fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 -echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} - { (exit 1); exit 1; }; }; } - - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" done -done +} ;; + esac -done -_ACEOF +done # for ac_tag -cat >>$CONFIG_STATUS <<\_ACEOF -{ (exit 0); exit 0; } +as_fn_exit 0 _ACEOF -chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. @@ -31775,6 +16824,10 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi diff --git a/contrib/ntp/sntp/configure.ac b/contrib/ntp/sntp/configure.ac index 5cc52b12db91..be6943ff9d42 100644 --- a/contrib/ntp/sntp/configure.ac +++ b/contrib/ntp/sntp/configure.ac @@ -12,6 +12,9 @@ AC_PROG_CC # It's a small library - we might as well use a static version of it. AC_DISABLE_SHARED +m4_defun([_LT_AC_LANG_CXX_CONFIG], [:]) +m4_defun([_LT_AC_LANG_F77_CONFIG], [:]) + AC_PROG_LIBTOOL # NTP has (so far) been relying on leading-edge autogen. @@ -40,6 +43,17 @@ case "$ac_cv_cpp_warning" in ;; esac +AC_C_INLINE + +case "$ac_cv_c_inline" in + '') + ;; + *) + AC_DEFINE(HAVE_INLINE,1,[inline keyword or macro available]) + AC_SUBST(HAVE_INLINE) +esac + + # Checks for libraries. # Checks for header files. @@ -96,14 +110,14 @@ case "$ac_cv_have_ss_family_in_struct_ss$ac_cv_have___ss_family_in_struct_ss" in esac # Checks for library functions. -AC_FUNC_MEMCMP +#AC_FUNC_MEMCMP dnl HMS: we don't have a memcmp.c to use here, so why bother? AC_FUNC_SETVBUF_REVERSED AC_TYPE_SIGNAL AC_CHECK_FUNCS([alarm]) -AC_CHECK_FUNC(gethostent, , AC_CHECK_LIB(nsl, gethostent, , , -lsocket)) +AC_CHECK_FUNC([gethostent], , AC_SEARCH_LIBS([gethostent], [nsl], , , [-lsocket])) AC_CHECK_FUNCS([gettimeofday inet_ntoa memset]) -AC_CHECK_FUNCS(socket, , AC_CHECK_LIB(socket, socket)) -AC_CHECK_FUNCS(sqrt, , AC_CHECK_LIB(m, sqrt)) +AC_CHECK_FUNCS([socket], , AC_SEARCH_LIBS([socket], [socket])) +AC_CHECK_FUNCS([sqrt], , AC_SEARCH_LIBS([sqrt], [m])) AC_CHECK_FUNCS([strrchr]) case "$host" in diff --git a/contrib/ntp/sntp/libopts/Makefile.in b/contrib/ntp/sntp/libopts/Makefile.in index 2a7eca38a35d..b5f27c67bb3e 100644 --- a/contrib/ntp/sntp/libopts/Makefile.in +++ b/contrib/ntp/sntp/libopts/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -46,39 +44,57 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; -am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" -libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) libopts_la_LIBADD = am_libopts_la_OBJECTS = libopts_la-libopts.lo libopts_la_OBJECTS = $(am_libopts_la_OBJECTS) +libopts_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libopts_la_LDFLAGS) $(LDFLAGS) -o $@ @INSTALL_LIBOPTS_FALSE@am_libopts_la_rpath = @INSTALL_LIBOPTS_TRUE@am_libopts_la_rpath = -rpath $(libdir) -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = $(libopts_la_SOURCES) DIST_SOURCES = $(libopts_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ @@ -91,10 +107,6 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ @@ -104,11 +116,10 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -122,14 +133,14 @@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -137,16 +148,11 @@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -158,28 +164,40 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in @INSTALL_LIBOPTS_TRUE@lib_LTLIBRARIES = libopts.la @INSTALL_LIBOPTS_FALSE@noinst_LTLIBRARIES = libopts.la @@ -209,14 +227,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libopts/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu libopts/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libopts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu libopts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -234,23 +252,28 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ if test -f $$p; then \ - f=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + list2="$$list2 $$p"; \ else :; fi; \ - done + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) - @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - p=$(am__strip_dir) \ - echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ - $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: @@ -271,7 +294,7 @@ clean-noinstLTLIBRARIES: rm -f "$${dir}/so_locations"; \ done libopts.la: $(libopts_la_OBJECTS) $(libopts_la_DEPENDENCIES) - $(LINK) $(am_libopts_la_rpath) $(libopts_la_LDFLAGS) $(libopts_la_OBJECTS) $(libopts_la_LIBADD) $(LIBS) + $(libopts_la_LINK) $(am_libopts_la_rpath) $(libopts_la_OBJECTS) $(libopts_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -282,32 +305,32 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libopts_la-libopts.Plo@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libopts_la-libopts.lo: libopts.c -@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libopts_la-libopts.lo -MD -MP -MF "$(DEPDIR)/libopts_la-libopts.Tpo" -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libopts_la-libopts.Tpo" "$(DEPDIR)/libopts_la-libopts.Plo"; else rm -f "$(DEPDIR)/libopts_la-libopts.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libopts_la-libopts.lo -MD -MP -MF $(DEPDIR)/libopts_la-libopts.Tpo -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libopts_la-libopts.Tpo $(DEPDIR)/libopts_la-libopts.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libopts.c' object='libopts_la-libopts.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libopts_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libopts_la-libopts.lo `test -f 'libopts.c' || echo '$(srcdir)/'`libopts.c mostlyclean-libtool: -rm -f *.lo @@ -315,83 +338,85 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -distclean-libtool: - -rm -f libtool -uninstall-info-am: - ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/autoopts $(distdir)/compat $(distdir)/m4 - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -400,7 +425,7 @@ check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am @@ -422,6 +447,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -436,7 +462,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -444,18 +470,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-libLTLIBRARIES +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -476,20 +522,24 @@ ps: ps-am ps-am: -uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ ctags distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-libLTLIBRARIES install-man \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-info-am uninstall-libLTLIBRARIES + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-libLTLIBRARIES + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/contrib/ntp/sntp/sntp-opts.c b/contrib/ntp/sntp/sntp-opts.c index 939c9772ccee..37c4e7cf1084 100644 --- a/contrib/ntp/sntp/sntp-opts.c +++ b/contrib/ntp/sntp/sntp-opts.c @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (sntp-opts.c) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:27:24 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:49 AM EST * From the definitions sntp-opts.def * and the template file options * @@ -513,7 +513,7 @@ static tOptDesc optDesc[ OPTION_CT ] = { */ tSCC zPROGNAME[] = "SNTP"; tSCC zUsageTitle[] = -"sntp - standard SNTP program - Ver. 4.2.4p5\n\ +"sntp - standard SNTP program - Ver. 4.2.4p8\n\ USAGE: %s [ - | -- ]...\n"; tSCC zRcName[] = ".ntprc"; tSCC* apzHomeList[] = { @@ -521,7 +521,7 @@ tSCC* apzHomeList[] = { ".", NULL }; -tSCC zBugsAddr[] = "http://bugs.ntp.isc.org, bugs@ntp.org"; +tSCC zBugsAddr[] = "http://bugs.ntp.org, bugs@ntp.org"; #define zExplain NULL tSCC zDetail[] = "\n\ .I sntp\n\ @@ -533,7 +533,7 @@ job.\n\ NTP is the Network Time Protocol (RFC 1305) and SNTP is the\n\ Simple Network Time Protocol (RFC 2030, which supersedes RFC 1769).\n"; tSCC zFullVersion[] = SNTP_FULL_VERSION; -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 408 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 408 */ #if defined(ENABLE_NLS) # define OPTPROC_BASE OPTPROC_TRANSLATE @@ -584,7 +584,7 @@ doUsageOpt( { USAGE( EXIT_SUCCESS ); } -/* extracted from /usr/local/gnu/share/autogen/optmain.tpl near line 92 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optmain.tpl near line 92 */ #if defined(TEST_SNTP_OPTS) /* TEST MAIN PROCEDURE: */ @@ -600,7 +600,7 @@ main( int argc, char** argv ) return res; } #endif /* defined TEST_SNTP_OPTS */ -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 514 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 514 */ #if ENABLE_NLS #include diff --git a/contrib/ntp/sntp/sntp-opts.def b/contrib/ntp/sntp/sntp-opts.def index d0ee84fbc101..b4c7f6b044e8 100644 --- a/contrib/ntp/sntp/sntp-opts.def +++ b/contrib/ntp/sntp/sntp-opts.def @@ -7,7 +7,7 @@ autogen definitions options; copyright = { date = "1970-2006"; owner = "ntp.org"; - eaddr = "http://bugs.ntp.isc.org, bugs@ntp.org"; + eaddr = "http://bugs.ntp.org, bugs@ntp.org"; type = note; text = `cat COPYRIGHT`; }; diff --git a/contrib/ntp/sntp/sntp-opts.h b/contrib/ntp/sntp/sntp-opts.h index 3c701241ebcd..e73737a7b88f 100644 --- a/contrib/ntp/sntp/sntp-opts.h +++ b/contrib/ntp/sntp/sntp-opts.h @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (sntp-opts.h) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:27:23 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:49 AM EST * From the definitions sntp-opts.def * and the template file options * @@ -147,8 +147,8 @@ typedef enum { } teOptIndex; #define OPTION_CT 13 -#define SNTP_VERSION "4.2.4p5" -#define SNTP_FULL_VERSION "sntp - standard SNTP program - Ver. 4.2.4p5" +#define SNTP_VERSION "4.2.4p8" +#define SNTP_FULL_VERSION "sntp - standard SNTP program - Ver. 4.2.4p8" /* * Interface defines for all options. Replace "n" with the UPPER_CASED @@ -251,7 +251,7 @@ typedef enum { sntpOptions.pzCurOpt = NULL ) #define START_OPT RESTART_OPT(1) #define USAGE(c) (*sntpOptions.pUsageProc)( &sntpOptions, c ) -/* extracted from /usr/local/gnu/share/autogen/opthead.tpl near line 360 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/opthead.tpl near line 360 */ /* * * * * * * diff --git a/contrib/ntp/sntp/sntp-opts.texi b/contrib/ntp/sntp/sntp-opts.texi index 8cc0d2c74fd2..7ba2e213d65b 100644 --- a/contrib/ntp/sntp/sntp-opts.texi +++ b/contrib/ntp/sntp/sntp-opts.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (sntp-opts.texi) # -# It has been AutoGen-ed Sunday August 17, 2008 at 05:27:25 AM EDT +# It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:51 AM EST # From the definitions sntp-opts.def # and the template file aginfo.tpl @end ignore @@ -46,7 +46,59 @@ This is the automatically generated usage text for sntp: @exampleindent 0 @example -sntp is unavailable - no --help +sntp - standard SNTP program - Ver. 4.2.5p247-RC +USAGE: sntp [ - [] | --[@{=| @}] ]... ... + Flg Arg Option-Name Description + -4 no ipv4 Force IPv4 DNS name resolution + - prohibits these options: + ipv6 + -6 no ipv6 Force IPv6 DNS name resolution + - prohibits these options: + ipv4 + -d no normalverbose Normal verbose + -K Str kod KoD history filename + -p no syslog Logging with syslog + - prohibits these options: + filelog + -l Str filelog Logging to specified logfile + - prohibits these options: + syslog + -s no settod Set (step) the time with settimeofday() + - prohibits these options: + adjtime + -j no adjtime Set (slew) the time with adjtime() + - prohibits these options: + settod + -b Str broadcast Use broadcasts to the address specified for synchronisation + -t Num timeout Specify the number of seconds to wait for broadcasts + -a Num authentication Enable authentication with the key keyno. This option is used as -a keyno + -k Str keyfile Specify a keyfile. SNTP will look in this file for the key specified with -a + opt version Output version information and exit + -? no help Display extended usage information and exit + -! no more-help Extended usage information passed thru pager + -> opt save-opts Save the option state to a config file + -< Str load-opts Load options from a config file + - disabled as --no-load-opts + - may appear multiple times + +Options are specified by doubled hyphens and their name +or by a single hyphen and the flag character. + +The following option preset mechanisms are supported: + - reading file /users/stenn/.ntprc + - reading file /deacon/backroom/snaps/ntp-stable/sntp/.ntprc + - examining environment variables named SNTP_* + +.I sntp +can be used as a SNTP client to query a NTP or SNTP server and either display +the time or set the local system's time (given suitable privilege). It can be +run as an interactive command or in a +.I cron +job. +NTP is the Network Time Protocol (RFC 1305) and SNTP is the +Simple Network Time Protocol (RFC 2030, which supersedes RFC 1769). + +please send bug reports to: http://bugs.ntp.org, bugs@@ntp.org @end example @exampleindent 4 diff --git a/contrib/ntp/sntp/sntp.1 b/contrib/ntp/sntp/sntp.1 index b6ccda23f15d..20c7d801646c 100644 --- a/contrib/ntp/sntp/sntp.1 +++ b/contrib/ntp/sntp/sntp.1 @@ -1,7 +1,7 @@ -.TH SNTP 1 2008-08-17 "( 4.2.4p5)" "Programmer's Manual" +.TH SNTP 1 2009-12-08 "( 4.2.4p8)" "Programmer's Manual" .\" EDIT THIS FILE WITH CAUTION (sntp.1) .\" -.\" It has been AutoGen-ed Sunday August 17, 2008 at 05:27:25 AM EDT +.\" It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:50 AM EST .\" From the definitions sntp-opts.def .\" and the template file agman1.tpl .\" @@ -308,7 +308,7 @@ is searched for within those directories. .SH AUTHOR ntp.org .br -Please send bug reports to: http://bugs.ntp.isc.org, bugs@ntp.org +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org .PP .nf diff --git a/contrib/ntp/sntp/version.def b/contrib/ntp/sntp/version.def index b17d656155fc..f0dc444146e4 100644 --- a/contrib/ntp/sntp/version.def +++ b/contrib/ntp/sntp/version.def @@ -1 +1 @@ -version = '4.2.4p5'; +version = '4.2.4p8'; diff --git a/contrib/ntp/util/Makefile.in b/contrib/ntp/util/Makefile.in index 4c511d74e563..75830d0b29e8 100644 --- a/contrib/ntp/util/Makefile.in +++ b/contrib/ntp/util/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -14,15 +15,12 @@ @SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = .. +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c @@ -58,8 +56,8 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) audio_pcm_SOURCES = audio-pcm.c audio_pcm_OBJECTS = audio-pcm$U.$(OBJEXT) @@ -121,23 +119,46 @@ timetrim_SOURCES = timetrim.c timetrim_OBJECTS = timetrim$U.$(OBJEXT) timetrim_LDADD = $(LDADD) timetrim_DEPENDENCIES = ../libntp/libntp.a -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles +am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ SOURCES = audio-pcm.c byteorder.c hist.c $(jitter_SOURCES) kern.c \ longsize.c $(ntp_keygen_SOURCES) ntptime.c pps-api.c \ precision.c sht.c testrs6000.c tg.c tickadj.c timetrim.c DIST_SOURCES = audio-pcm.c byteorder.c hist.c $(jitter_SOURCES) kern.c \ longsize.c $(ntp_keygen_SOURCES) ntptime.c pps-api.c \ precision.c sht.c testrs6000.c tg.c tickadj.c timetrim.c +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) @@ -145,8 +166,6 @@ ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ ARLIB_DIR = @ARLIB_DIR@ @@ -162,10 +181,6 @@ CHUTEST = @CHUTEST@ CLKTEST = @CLKTEST@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCFD = @DCFD@ DEFS = @DEFS@ @@ -178,11 +193,10 @@ EF_LIBS = @EF_LIBS@ EF_PROGS = @EF_PROGS@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +GREP = @GREP@ +HAVE_INLINE = @HAVE_INLINE@ +INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -INSTALL_LIBOPTS_FALSE = @INSTALL_LIBOPTS_FALSE@ -INSTALL_LIBOPTS_TRUE = @INSTALL_LIBOPTS_TRUE@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ @@ -196,6 +210,7 @@ LIBPARSE = @LIBPARSE@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ +LSCF = @LSCF@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_ADJTIMED = @MAKE_ADJTIMED@ @@ -209,8 +224,7 @@ MAKE_NTPTIME = @MAKE_NTPTIME@ MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ MAKE_TICKADJ = @MAKE_TICKADJ@ MAKE_TIMETRIM = @MAKE_TIMETRIM@ -NEED_LIBOPTS_FALSE = @NEED_LIBOPTS_FALSE@ -NEED_LIBOPTS_TRUE = @NEED_LIBOPTS_TRUE@ +MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENSSL = @OPENSSL@ OPENSSL_INC = @OPENSSL_INC@ @@ -220,6 +234,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_PERL = @PATH_PERL@ PATH_SEPARATOR = @PATH_SEPARATOR@ @@ -233,16 +248,11 @@ STRIP = @STRIP@ TESTDCF = @TESTDCF@ U = @U@ VERSION = @VERSION@ -ac_ct_AR = @ac_ct_AR@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -254,29 +264,41 @@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ +builddir = @builddir@ datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ +htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ +localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ +psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ #AUTOMAKE_OPTIONS = ../ansi2knr no-dependencies AUTOMAKE_OPTIONS = ansi2knr @@ -310,14 +332,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign util/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -335,86 +357,102 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - if test -f $$p \ - || test -f $$p1 \ - ; then \ - f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ - else :; fi; \ - done + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ - echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ - rm -f "$(DESTDIR)$(bindir)/$$f"; \ - done + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f $$p $$f"; \ - rm -f $$p $$f ; \ - done + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list audio-pcm$(EXEEXT): $(audio_pcm_OBJECTS) $(audio_pcm_DEPENDENCIES) @rm -f audio-pcm$(EXEEXT) - $(LINK) $(audio_pcm_LDFLAGS) $(audio_pcm_OBJECTS) $(audio_pcm_LDADD) $(LIBS) + $(LINK) $(audio_pcm_OBJECTS) $(audio_pcm_LDADD) $(LIBS) byteorder$(EXEEXT): $(byteorder_OBJECTS) $(byteorder_DEPENDENCIES) @rm -f byteorder$(EXEEXT) - $(LINK) $(byteorder_LDFLAGS) $(byteorder_OBJECTS) $(byteorder_LDADD) $(LIBS) + $(LINK) $(byteorder_OBJECTS) $(byteorder_LDADD) $(LIBS) hist$(EXEEXT): $(hist_OBJECTS) $(hist_DEPENDENCIES) @rm -f hist$(EXEEXT) - $(LINK) $(hist_LDFLAGS) $(hist_OBJECTS) $(hist_LDADD) $(LIBS) + $(LINK) $(hist_OBJECTS) $(hist_LDADD) $(LIBS) jitter$(EXEEXT): $(jitter_OBJECTS) $(jitter_DEPENDENCIES) @rm -f jitter$(EXEEXT) - $(LINK) $(jitter_LDFLAGS) $(jitter_OBJECTS) $(jitter_LDADD) $(LIBS) + $(LINK) $(jitter_OBJECTS) $(jitter_LDADD) $(LIBS) kern$(EXEEXT): $(kern_OBJECTS) $(kern_DEPENDENCIES) @rm -f kern$(EXEEXT) - $(LINK) $(kern_LDFLAGS) $(kern_OBJECTS) $(kern_LDADD) $(LIBS) + $(LINK) $(kern_OBJECTS) $(kern_LDADD) $(LIBS) longsize$(EXEEXT): $(longsize_OBJECTS) $(longsize_DEPENDENCIES) @rm -f longsize$(EXEEXT) - $(LINK) $(longsize_LDFLAGS) $(longsize_OBJECTS) $(longsize_LDADD) $(LIBS) + $(LINK) $(longsize_OBJECTS) $(longsize_LDADD) $(LIBS) ntp-keygen$(EXEEXT): $(ntp_keygen_OBJECTS) $(ntp_keygen_DEPENDENCIES) @rm -f ntp-keygen$(EXEEXT) - $(LINK) $(ntp_keygen_LDFLAGS) $(ntp_keygen_OBJECTS) $(ntp_keygen_LDADD) $(LIBS) + $(LINK) $(ntp_keygen_OBJECTS) $(ntp_keygen_LDADD) $(LIBS) ntptime$(EXEEXT): $(ntptime_OBJECTS) $(ntptime_DEPENDENCIES) @rm -f ntptime$(EXEEXT) - $(LINK) $(ntptime_LDFLAGS) $(ntptime_OBJECTS) $(ntptime_LDADD) $(LIBS) + $(LINK) $(ntptime_OBJECTS) $(ntptime_LDADD) $(LIBS) pps-api$(EXEEXT): $(pps_api_OBJECTS) $(pps_api_DEPENDENCIES) @rm -f pps-api$(EXEEXT) - $(LINK) $(pps_api_LDFLAGS) $(pps_api_OBJECTS) $(pps_api_LDADD) $(LIBS) + $(LINK) $(pps_api_OBJECTS) $(pps_api_LDADD) $(LIBS) precision$(EXEEXT): $(precision_OBJECTS) $(precision_DEPENDENCIES) @rm -f precision$(EXEEXT) - $(LINK) $(precision_LDFLAGS) $(precision_OBJECTS) $(precision_LDADD) $(LIBS) + $(LINK) $(precision_OBJECTS) $(precision_LDADD) $(LIBS) sht$(EXEEXT): $(sht_OBJECTS) $(sht_DEPENDENCIES) @rm -f sht$(EXEEXT) - $(LINK) $(sht_LDFLAGS) $(sht_OBJECTS) $(sht_LDADD) $(LIBS) + $(LINK) $(sht_OBJECTS) $(sht_LDADD) $(LIBS) testrs6000$(EXEEXT): $(testrs6000_OBJECTS) $(testrs6000_DEPENDENCIES) @rm -f testrs6000$(EXEEXT) - $(LINK) $(testrs6000_LDFLAGS) $(testrs6000_OBJECTS) $(testrs6000_LDADD) $(LIBS) + $(LINK) $(testrs6000_OBJECTS) $(testrs6000_LDADD) $(LIBS) tg$(EXEEXT): $(tg_OBJECTS) $(tg_DEPENDENCIES) @rm -f tg$(EXEEXT) - $(LINK) $(tg_LDFLAGS) $(tg_OBJECTS) $(tg_LDADD) $(LIBS) + $(LINK) $(tg_OBJECTS) $(tg_LDADD) $(LIBS) tickadj$(EXEEXT): $(tickadj_OBJECTS) $(tickadj_DEPENDENCIES) @rm -f tickadj$(EXEEXT) - $(LINK) $(tickadj_LDFLAGS) $(tickadj_OBJECTS) $(tickadj_LDADD) $(LIBS) + $(LINK) $(tickadj_OBJECTS) $(tickadj_LDADD) $(LIBS) timetrim$(EXEEXT): $(timetrim_OBJECTS) $(timetrim_DEPENDENCIES) @rm -f timetrim$(EXEEXT) - $(LINK) $(timetrim_LDFLAGS) $(timetrim_OBJECTS) $(timetrim_LDADD) $(LIBS) + $(LINK) $(timetrim_OBJECTS) $(timetrim_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c -ansi2knr: ansi2knr.$(OBJEXT) +./ansi2knr: ansi2knr.$(OBJEXT) $(LINK) ansi2knr.$(OBJEXT) $(LIBS) ansi2knr.$(OBJEXT): $(CONFIG_HEADER) @@ -442,22 +480,22 @@ mostlyclean-kr: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timetrim$U.Po@am__quote@ .c.o: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: -@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @@ -508,128 +546,137 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -install-man1: $(man1_MANS) $(man_MANS) +install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ - done + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + uninstall-man1: @$(NORMAL_UNINSTALL) - @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ - l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ - for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - case "$$ext" in \ - 1*) ;; \ - *) ext='1' ;; \ - esac; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed -e 's/^.*\///'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ - rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ - done + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ + set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique + $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -639,7 +686,7 @@ check: $(BUILT_SOURCES) all-am: Makefile $(ANSI2KNR) $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ - test -z "$$dir" || $(mkdir_p) "$$dir"; \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am @@ -662,6 +709,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -676,7 +724,7 @@ distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ - distclean-libtool distclean-tags + distclean-tags dvi: dvi-am @@ -684,18 +732,38 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: install-data-am: install-man +install-dvi: install-dvi-am + +install-dvi-am: + install-exec-am: install-binPROGRAMS +install-html: install-html-am + +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-man1 +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -716,23 +784,26 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-man +uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 +.MAKE: all check install install-am install-strip + .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-krextra clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-man1 install-strip \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-kr mostlyclean-libtool pdf \ pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-binPROGRAMS uninstall-info-am uninstall-man \ - uninstall-man1 + uninstall-binPROGRAMS uninstall-man uninstall-man1 $(srcdir)/ntp-keygen-opts.h: $(srcdir)/ntp-keygen-opts.c @@ -750,6 +821,7 @@ $(srcdir)/ntp-keygen-opts.texi $(srcdir)/ntp-keygen-opts.menu: $(srcdir)/ntp-key kern.o: kern.c $(COMPILE) -DHAVE_TIMEX_H -c kern.c + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/contrib/ntp/util/ntp-keygen-opts.c b/contrib/ntp/util/ntp-keygen-opts.c index edc9c5b41d5d..cb242c07ae14 100644 --- a/contrib/ntp/util/ntp-keygen-opts.c +++ b/contrib/ntp/util/ntp-keygen-opts.c @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntp-keygen-opts.c) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:27:33 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:56 AM EST * From the definitions ntp-keygen-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntp-keygen copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntp-keygen copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -34,7 +34,7 @@ extern "C" { #endif tSCC zCopyright[] = - "ntp-keygen copyright (c) 1970-2008 David L. Mills and/or others, all rights reserved"; + "ntp-keygen copyright (c) 1970-2009 David L. Mills and/or others, all rights reserved"; tSCC zCopyrightNotice[] = /* extracted from ../include/copyright.def near line 8 */ @@ -799,7 +799,7 @@ static tOptDesc optDesc[ OPTION_CT ] = { */ tSCC zPROGNAME[] = "NTP_KEYGEN"; tSCC zUsageTitle[] = -"ntp-keygen (ntp) - Create a NTP host key - Ver. 4.2.4p5\n\ +"ntp-keygen (ntp) - Create a NTP host key - Ver. 4.2.4p8\n\ USAGE: %s [ - [] | --[{=| }] ]...\n"; tSCC zRcName[] = ".ntprc"; tSCC* apzHomeList[] = { @@ -807,13 +807,13 @@ tSCC* apzHomeList[] = { ".", NULL }; -tSCC zBugsAddr[] = "http://bugs.ntp.isc.org, bugs@ntp.org"; +tSCC zBugsAddr[] = "http://bugs.ntp.org, bugs@ntp.org"; #define zExplain NULL tSCC zDetail[] = "\n\ If there is no new host key, look for an existing one.\n\ If one is not found, create it.\n"; tSCC zFullVersion[] = NTP_KEYGEN_FULL_VERSION; -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 408 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 408 */ #if defined(ENABLE_NLS) # define OPTPROC_BASE OPTPROC_TRANSLATE @@ -937,7 +937,7 @@ doOptModulus( } #endif /* defined OPENSSL */ -/* extracted from /usr/local/gnu/share/autogen/optmain.tpl near line 92 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optmain.tpl near line 92 */ #if defined(TEST_NTP_KEYGEN_OPTS) /* TEST MAIN PROCEDURE: */ @@ -953,7 +953,7 @@ main( int argc, char** argv ) return res; } #endif /* defined TEST_NTP_KEYGEN_OPTS */ -/* extracted from /usr/local/gnu/share/autogen/optcode.tpl near line 514 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/optcode.tpl near line 514 */ #if ENABLE_NLS #include diff --git a/contrib/ntp/util/ntp-keygen-opts.h b/contrib/ntp/util/ntp-keygen-opts.h index a22a5e7fe64f..e34a0a7e0366 100644 --- a/contrib/ntp/util/ntp-keygen-opts.h +++ b/contrib/ntp/util/ntp-keygen-opts.h @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntp-keygen-opts.h) * - * It has been AutoGen-ed Sunday August 17, 2008 at 05:27:32 AM EDT + * It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:55 AM EST * From the definitions ntp-keygen-opts.def * and the template file options * @@ -19,7 +19,7 @@ * * This source file is copyrighted and licensed under the following terms: * - * ntp-keygen copyright 1970-2008 David L. Mills and/or others - all rights reserved + * ntp-keygen copyright 1970-2009 David L. Mills and/or others - all rights reserved * * see html/copyright.html */ @@ -79,8 +79,8 @@ typedef enum { } teOptIndex; #define OPTION_CT 24 -#define NTP_KEYGEN_VERSION "4.2.4p5" -#define NTP_KEYGEN_FULL_VERSION "ntp-keygen (ntp) - Create a NTP host key - Ver. 4.2.4p5" +#define NTP_KEYGEN_VERSION "4.2.4p8" +#define NTP_KEYGEN_FULL_VERSION "ntp-keygen (ntp) - Create a NTP host key - Ver. 4.2.4p8" /* * Interface defines for all options. Replace "n" with the UPPER_CASED @@ -286,7 +286,7 @@ typedef enum { ntp_keygenOptions.pzCurOpt = NULL ) #define START_OPT RESTART_OPT(1) #define USAGE(c) (*ntp_keygenOptions.pUsageProc)( &ntp_keygenOptions, c ) -/* extracted from /usr/local/gnu/share/autogen/opthead.tpl near line 360 */ +/* extracted from /usr/local/gnu/autogen-5.9.1/share/autogen/opthead.tpl near line 360 */ /* * * * * * * diff --git a/contrib/ntp/util/ntp-keygen-opts.texi b/contrib/ntp/util/ntp-keygen-opts.texi index 19b77f8095e5..d54e9ba5a102 100644 --- a/contrib/ntp/util/ntp-keygen-opts.texi +++ b/contrib/ntp/util/ntp-keygen-opts.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (ntp-keygen-opts.texi) # -# It has been AutoGen-ed Sunday August 17, 2008 at 05:27:34 AM EDT +# It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:57 AM EST # From the definitions ntp-keygen-opts.def # and the template file aginfo.tpl @end ignore @@ -52,7 +52,7 @@ This is the automatically generated usage text for ntp-keygen: @exampleindent 0 @example Using OpenSSL version 90704f -ntp-keygen (ntp) - Create a NTP host key - Ver. 4.2.5p113 +ntp-keygen (ntp) - Create a NTP host key - Ver. 4.2.5p247-RC USAGE: ntp-keygen [ - [] | --[@{=| @}] ]... Flg Arg Option-Name Description -c Str certificate certificate scheme @@ -67,7 +67,7 @@ USAGE: ntp-keygen [ - [] | --[@{=| @}] ]... -i Str issuer-name set issuer name -M no md5key generate MD5 keys -m Num modulus modulus - it must lie in the range: 256 to 2048 + - it must be: 256 to 2048 -P no pvt-cert generate PC private certificate -p Str pvt-passwd output private password -q Str get-pvt-passwd input private password @@ -77,7 +77,7 @@ USAGE: ntp-keygen [ - [] | --[@{=| @}] ]... -V Num mv-params generate MV parameters -v Num mv-keys update MV keys opt version Output version information and exit - -? no help Display usage information and exit + -? no help Display extended usage information and exit -! no more-help Extended usage information passed thru pager -> opt save-opts Save the option state to a config file -< Str load-opts Load options from a config file diff --git a/contrib/ntp/util/ntp-keygen.1 b/contrib/ntp/util/ntp-keygen.1 index 3bf7d0cd86d8..90f8d5cceaec 100644 --- a/contrib/ntp/util/ntp-keygen.1 +++ b/contrib/ntp/util/ntp-keygen.1 @@ -1,7 +1,7 @@ -.TH NTP-KEYGEN 1 2008-08-17 "(ntp 4.2.4p5)" "Programmer's Manual" +.TH NTP-KEYGEN 1 2009-12-08 "(ntp 4.2.4p8)" "Programmer's Manual" .\" EDIT THIS FILE WITH CAUTION (ntp-keygen.1) .\" -.\" It has been AutoGen-ed Sunday August 17, 2008 at 05:27:34 AM EDT +.\" It has been AutoGen-ed Tuesday December 8, 2009 at 08:14:57 AM EST .\" From the definitions ntp-keygen-opts.def .\" and the template file agman1.tpl .\" @@ -163,7 +163,7 @@ is searched for within those directories. .SH AUTHOR David L. Mills and/or others .br -Please send bug reports to: http://bugs.ntp.isc.org, bugs@ntp.org +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org .PP .nf diff --git a/contrib/ntp/version b/contrib/ntp/version index 188972adf433..1308e7358a28 100644 --- a/contrib/ntp/version +++ b/contrib/ntp/version @@ -1 +1 @@ -1.1541 +1.1612 diff --git a/contrib/ntp/version.m4 b/contrib/ntp/version.m4 index 124fa7f1541a..7d687b905c1d 100644 --- a/contrib/ntp/version.m4 +++ b/contrib/ntp/version.m4 @@ -1 +1 @@ -m4_define([VERSION_NUMBER],[4.2.4p5]) +m4_define([VERSION_NUMBER],[4.2.4p8]) diff --git a/contrib/one-true-awk/FIXES b/contrib/one-true-awk/FIXES index 2f39d4827c10..bda79768606a 100644 --- a/contrib/one-true-awk/FIXES +++ b/contrib/one-true-awk/FIXES @@ -25,6 +25,23 @@ THIS SOFTWARE. This file lists all bug fixes, changes, etc., made since the AWK book was sent to the printers in August, 1987. +Nov 26, 2009: + fixed a long-standing issue with when FS takes effect. a + change to FS is now noticed immediately for subsequent splits. + + changed the name getline() to awkgetline() to avoid yet another + name conflict somewhere. + +Feb 11, 2009: + temporarily for now defined HAS_ISBLANK, since that seems to + be the best way through the thicket. isblank arrived in C99, + but seems to be arriving at different systems at different + times. + +Oct 8, 2008: + fixed typo in b.c that set tmpvec wrongly. no one had ever + run into the problem, apparently. thanks to alistair crooks. + Oct 23, 2007: minor fix in lib.c: increase inputFS to 100, change malloc for fields to n+1. diff --git a/contrib/one-true-awk/b.c b/contrib/one-true-awk/b.c index 0d91f23f548c..baefe6f71e27 100644 --- a/contrib/one-true-awk/b.c +++ b/contrib/one-true-awk/b.c @@ -24,6 +24,9 @@ THIS SOFTWARE. /* lasciate ogne speranza, voi ch'intrate. */ +#include +__FBSDID("$FreeBSD$"); + #define DEBUG #include @@ -285,9 +288,21 @@ int quoted(char **pp) /* pick up next thing after a \\ */ return c; } +static int collate_range_cmp(int a, int b) +{ + static char s[2][2]; + + if ((uschar)a == (uschar)b) + return 0; + s[0][0] = a; + s[1][0] = b; + return (strcoll(s[0], s[1])); +} + char *cclenter(const char *argp) /* add a character class */ { int i, c, c2; + int j; uschar *p = (uschar *) argp; uschar *op, *bp; static uschar *buf = 0; @@ -306,15 +321,18 @@ char *cclenter(const char *argp) /* add a character class */ c2 = *p++; if (c2 == '\\') c2 = quoted((char **) &p); - if (c > c2) { /* empty; ignore */ + if (collate_range_cmp(c, c2) > 0) { bp--; i--; continue; } - while (c < c2) { + for (j = 0; j < NCHARS; j++) { + if ((collate_range_cmp(c, j) > 0) || + collate_range_cmp(j, c2) > 0) + continue; if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, "cclenter1")) FATAL("out of space for character class [%.10s...] 2", p); - *bp++ = ++c; + *bp++ = j; i++; } continue; @@ -731,6 +749,7 @@ Node *unary(Node *np) * to nelson beebe for the suggestion; let's see if it works everywhere. */ +/* #define HAS_ISBLANK */ #ifndef HAS_ISBLANK int (isblank)(int c) @@ -876,7 +895,7 @@ int cgoto(fa *f, int s, int c) if (q[j] >= maxsetvec) { maxsetvec *= 4; setvec = (int *) realloc(setvec, maxsetvec * sizeof(int)); - tmpset = (int *) realloc(setvec, maxsetvec * sizeof(int)); + tmpset = (int *) realloc(tmpset, maxsetvec * sizeof(int)); if (setvec == 0 || tmpset == 0) overflo("cgoto overflow"); } diff --git a/contrib/one-true-awk/lib.c b/contrib/one-true-awk/lib.c index c9cc5d563b16..017b37670d07 100644 --- a/contrib/one-true-awk/lib.c +++ b/contrib/one-true-awk/lib.c @@ -274,6 +274,7 @@ void fldbld(void) /* create fields from current record */ } fr = fields; i = 0; /* number of fields accumulated here */ + strcpy(inputFS, *FS); if (strlen(inputFS) > 1) { /* it's a regular expression */ i = refldbld(r, inputFS); } else if ((sep = *inputFS) == ' ') { /* default whitespace */ diff --git a/contrib/one-true-awk/mac.code b/contrib/one-true-awk/mac.code deleted file mode 100644 index af47b17fb085..000000000000 --- a/contrib/one-true-awk/mac.code +++ /dev/null @@ -1,73 +0,0 @@ -Note added June, 2002: - -With the advent of OS X, life is simpler: if you have the developer -tools installed, the standard awk makefile and gcc works fine, and -you can ignore the rest of this file, which is now hereby deprecated. - - - - -This file contains a make shell script and a version of the file -missing95.c for the Mac, courtesy of Dan Allen. - -make shell script: - -# MPW Shell script to build Awk using Apple's MRC compiler. -# 22 Jan 1999 - Created by Dan Allen. -# 25 Mar 1999 - Updated for newer Awk. -# -# Porting notes for the Mac: -# -# 1. main in main.c needs to have its prototype changed to: -# -# int main(int argc, char *argv[], char *environ[]) -# -# 2. popen and pclose in missing95.c need to have as their body the -# older style -# -# return NULL; -# -# as parallel pipes are not supported by MPW. -# -# 3. To make your Mac more responsive while long awk scripts run, -# you may want to add some SpinCursor calls to support cooperative multitasking. -# -# All of these minor changes can be put under "#ifdef powerc" for portability's sake. -# -# - -If {1} == "clean" - Delete -i awk maketab maketab.c.o ytab.c.o b.c.o main.c.o parse.c.o proctab.c proctab.c.o tran.c.o lib.c.o run.c.o lex.c.o missing95.c.o -Else - MRC ytab.c -w off -opt speed - MRC b.c -w off -opt speed - MRC main.c -w off -opt speed - MRC parse.c -w off -opt speed - MRC maketab.c -w off -opt speed - PPCLink -o maketab maketab.c.o "{PPCLibraries}InterfaceLib" "{PPCLibraries}MathLib" "{PPCLibraries}StdCLib" "{PPCLibraries}StdCRuntime.o" "{PPCLibraries}PPCCRuntime.o" "{PPCLibraries}PPCToolLibs.o" -t MPST -c 'MPS ' - maketab > proctab.c - MRC proctab.c -w off -opt speed - MRC tran.c -w off -opt speed - MRC lib.c -w off -opt speed - MRC run.c -w off -opt speed - MRC lex.c -w off -opt speed - MRC missing95.c -w off -opt speed - PPCLink -o awk ytab.c.o b.c.o main.c.o parse.c.o proctab.c.o tran.c.o lib.c.o run.c.o lex.c.o missing95.c.o "{PPCLibraries}InterfaceLib" "{PPCLibraries}MathLib" "{PPCLibraries}StdCLib" "{PPCLibraries}StdCRuntime.o" "{PPCLibraries}PPCCRuntime.o" "{PPCLibraries}PPCToolLibs.o" -d - SetFile awk -d . -m . -t MPST -c 'MPS ' -End - - -missing95.c for the Mac: - -/* popen and pclose are not available on the Mac. */ - -#include - -FILE *popen(char *s, char *m) { - return NULL; -} - -int pclose(FILE *f) { - return NULL; -} - diff --git a/contrib/one-true-awk/main.c b/contrib/one-true-awk/main.c index e1ed1773e09b..d78a8511e79b 100644 --- a/contrib/one-true-awk/main.c +++ b/contrib/one-true-awk/main.c @@ -22,7 +22,10 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ -const char *version = "version 20070501"; +#include +__FBSDID("$FreeBSD$"); + +const char *version = "version 20091126 (FreeBSD)"; #define DEBUG #include @@ -58,6 +61,7 @@ int main(int argc, char *argv[]) const char *fs = NULL; setlocale(LC_CTYPE, ""); + setlocale(LC_COLLATE, ""); setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */ cmdname = argv[0]; if (argc == 1) { @@ -86,13 +90,18 @@ int main(int argc, char *argv[]) safe = 1; break; case 'f': /* next argument is program filename */ - argc--; - argv++; - if (argc <= 1) - FATAL("no program filename"); - if (npfile >= MAX_PFILE - 1) - FATAL("too many -f options"); - pfile[npfile++] = argv[1]; + if (argv[1][2] != 0) { /* arg is -fsomething */ + if (npfile >= MAX_PFILE - 1) + FATAL("too many -f options"); + pfile[npfile++] = &argv[1][2]; + } else { /* arg is -f something */ + argc--; argv++; + if (argc <= 1) + FATAL("no program filename"); + if (npfile >= MAX_PFILE - 1) + FATAL("too many -f options"); + pfile[npfile++] = argv[1]; + } break; case 'F': /* set field separator */ if (argv[1][2] != 0) { /* arg is -Fsomething */ @@ -111,8 +120,14 @@ int main(int argc, char *argv[]) WARNING("field separator FS is empty"); break; case 'v': /* -v a=1 to be done NOW. one -v for each */ - if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) - setclvar(argv[1]); + if (argv[1][2] != 0) { /* arg is -vsomething */ + if (argv[1][2] != 0) + setclvar(&argv[1][2]); + } else { /* arg is -v something */ + argc--; argv++; + if (argc > 1 && isclvar(argv[1])) + setclvar(argv[1]); + } break; case 'd': dbg = atoi(&argv[1][2]); diff --git a/contrib/one-true-awk/makefile b/contrib/one-true-awk/makefile index a761a594d894..9d3985be2d4c 100644 --- a/contrib/one-true-awk/makefile +++ b/contrib/one-true-awk/makefile @@ -31,7 +31,6 @@ CC = gcc -fprofile-arcs -ftest-coverage # then gcov f1.c; cat f1.c.gcov CC = gcc -Wall -g CC = cc CC = gcc -O4 -CC = gcc -Wall -g YACC = bison -y diff --git a/contrib/one-true-awk/maketab.c b/contrib/one-true-awk/maketab.c index 1f78a9eb9220..31acd7522da5 100644 --- a/contrib/one-true-awk/maketab.c +++ b/contrib/one-true-awk/maketab.c @@ -102,7 +102,7 @@ struct xx { CALL, "call", "call" }, { ARG, "arg", "arg" }, { VARNF, "getnf", "NF" }, - { GETLINE, "getline", "getline" }, + { GETLINE, "awkgetline", "getline" }, { 0, "", "" }, }; diff --git a/contrib/one-true-awk/proctab.c b/contrib/one-true-awk/proctab.c index 401dec635d90..e4eddfda92d1 100644 --- a/contrib/one-true-awk/proctab.c +++ b/contrib/one-true-awk/proctab.c @@ -180,7 +180,7 @@ Cell *(*proctab[93])(Node **, int) = { nullproc, /* NUMBER */ nullproc, /* STRING */ nullproc, /* REGEXPR */ - getline, /* GETLINE */ + awkgetline, /* GETLINE */ substr, /* SUBSTR */ split, /* SPLIT */ jump, /* RETURN */ diff --git a/contrib/one-true-awk/proto.h b/contrib/one-true-awk/proto.h index adda07108c8c..0a68b3a813f8 100644 --- a/contrib/one-true-awk/proto.h +++ b/contrib/one-true-awk/proto.h @@ -149,7 +149,7 @@ extern Cell *call(Node **, int); extern Cell *copycell(Cell *); extern Cell *arg(Node **, int); extern Cell *jump(Node **, int); -extern Cell *getline(Node **, int); +extern Cell *awkgetline(Node **, int); extern Cell *getnf(Node **, int); extern Cell *array(Node **, int); extern Cell *awkdelete(Node **, int); diff --git a/contrib/one-true-awk/run.c b/contrib/one-true-awk/run.c index a9e269cc7155..20c08b10525a 100644 --- a/contrib/one-true-awk/run.c +++ b/contrib/one-true-awk/run.c @@ -22,6 +22,9 @@ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************************************************/ +#include +__FBSDID("$FreeBSD$"); + #define DEBUG #include #include @@ -388,7 +391,7 @@ Cell *jump(Node **a, int n) /* break, continue, next, nextfile, return */ return 0; /* not reached */ } -Cell *getline(Node **a, int n) /* get next line from specific input */ +Cell *awkgetline(Node **a, int n) /* get next line from specific input */ { /* a[0] is variable, a[1] is operator, a[2] is filename */ Cell *r, *x; extern Cell **fldtab; @@ -653,7 +656,7 @@ Cell *relop(Node **a, int n) /* a[0 < a[1], etc. */ j = x->fval - y->fval; i = j<0? -1: (j>0? 1: 0); } else { - i = strcmp(getsval(x), getsval(y)); + i = strcoll(getsval(x), getsval(y)); } tempfree(x); tempfree(y); @@ -1159,11 +1162,11 @@ Cell *cat(Node **a, int q) /* a[0] cat a[1] */ x->sval, y->sval); strcpy(s, x->sval); strcpy(s+n1, y->sval); + tempfree(x); tempfree(y); z = gettemp(); z->sval = s; z->tval = STR; - tempfree(x); return(z); } diff --git a/contrib/openpam/doc/man/pam.conf.5 b/contrib/openpam/doc/man/pam.conf.5 index 8ffb6a32b0dc..d94163d13bac 100644 --- a/contrib/openpam/doc/man/pam.conf.5 +++ b/contrib/openpam/doc/man/pam.conf.5 @@ -109,7 +109,7 @@ will be failure regardless of the success of later modules. .It Cm requisite If this module succeeds, the result of the chain will be success unless a later module fails. -If it module fails, the chain is broken and the result is failure. +If the module fails, the chain is broken and the result is failure. .It Cm sufficient If this module succeeds, the chain is broken and the result is success. diff --git a/contrib/opie/libopie/getutmpentry.c b/contrib/opie/libopie/getutmpentry.c index f3afe0c3aa18..06d22c816434 100644 --- a/contrib/opie/libopie/getutmpentry.c +++ b/contrib/opie/libopie/getutmpentry.c @@ -15,13 +15,14 @@ you didn't get a copy, you may request one from . #include "opie_cfg.h" #include #include -#include #if DOUTMPX #include #define setutent setutxent #define getutline(x) getutxline(x) #define utmp utmpx +#else +#include #endif /* DOUTMPX */ #if HAVE_STRING_H diff --git a/contrib/opie/libopie/insecure.c b/contrib/opie/libopie/insecure.c index bc61c5457ea3..ba2a9dfaeb5a 100644 --- a/contrib/opie/libopie/insecure.c +++ b/contrib/opie/libopie/insecure.c @@ -39,11 +39,12 @@ $FreeBSD$ #include #include -#include #if DOUTMPX #include #define utmp utmpx #define endutent endutxent +#else +#include #endif /* DOUTMPX */ #if HAVE_SYS_UTSNAME_H diff --git a/contrib/opie/libopie/login.c b/contrib/opie/libopie/login.c index 6c6ca79a37a1..bb0f3ae6b2d1 100644 --- a/contrib/opie/libopie/login.c +++ b/contrib/opie/libopie/login.c @@ -21,13 +21,14 @@ you didn't get a copy, you may request one from . #include "opie_cfg.h" #include #include -#include #if DOUTMPX #include #define pututline(x) pututxline(x) #define endutent endutxent #define utmp utmpx +#else +#include #endif /* DOUTMPX */ #if HAVE_STRING_H diff --git a/contrib/pf/man/pf.conf.5 b/contrib/pf/man/pf.conf.5 index 67cb717540e7..98c3d0ea8789 100644 --- a/contrib/pf/man/pf.conf.5 +++ b/contrib/pf/man/pf.conf.5 @@ -28,7 +28,7 @@ .\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd October 30, 2006 +.Dd June 10, 2008 .Dt PF.CONF 5 .Os .Sh NAME @@ -2059,6 +2059,13 @@ Changes the timeout values used for states created by this rule. For a list of all valid timeout names, see .Sx OPTIONS above. +.It Ar sloppy +Uses a sloppy TCP connection tracker that does not check sequence +numbers at all, which makes insertion and ICMP teardown attacks way +easier. +This is intended to be used in situations where one does not see all +packets of a connection, i.e. in asymmetric routing situations. +Cannot be used with modulate or synproxy state. .El .Pp Multiple options can be specified, separated by commas: @@ -2923,7 +2930,7 @@ tos = "tos" ( "lowdelay" | "throughput" | "reliability" | [ "0x" ] number ) state-opts = state-opt [ [ "," ] state-opts ] -state-opt = ( "max" number | "no-sync" | timeout | +state-opt = ( "max" number | "no-sync" | timeout | sloppy | "source-track" [ ( "rule" | "global" ) ] | "max-src-nodes" number | "max-src-states" number | "max-src-conn" number | diff --git a/contrib/pf/pfctl/parse.y b/contrib/pf/pfctl/parse.y index 9817e8e23785..c22a0b662e6f 100644 --- a/contrib/pf/pfctl/parse.y +++ b/contrib/pf/pfctl/parse.y @@ -128,7 +128,7 @@ enum { PF_STATE_OPT_MAX, PF_STATE_OPT_NOSYNC, PF_STATE_OPT_SRCTRACK, PF_STATE_OPT_MAX_SRC_STATES, PF_STATE_OPT_MAX_SRC_CONN, PF_STATE_OPT_MAX_SRC_CONN_RATE, PF_STATE_OPT_MAX_SRC_NODES, PF_STATE_OPT_OVERLOAD, PF_STATE_OPT_STATELOCK, - PF_STATE_OPT_TIMEOUT }; + PF_STATE_OPT_TIMEOUT, PF_STATE_OPT_SLOPPY }; enum { PF_SRCTRACK_NONE, PF_SRCTRACK, PF_SRCTRACK_GLOBAL, PF_SRCTRACK_RULE }; @@ -423,7 +423,7 @@ typedef struct { %token QUEUE PRIORITY QLIMIT RTABLE %token LOAD RULESET_OPTIMIZATION %token STICKYADDRESS MAXSRCSTATES MAXSRCNODES SOURCETRACK GLOBAL RULE -%token MAXSRCCONN MAXSRCCONNRATE OVERLOAD FLUSH +%token MAXSRCCONN MAXSRCCONNRATE OVERLOAD FLUSH SLOPPY %token TAGGED TAG IFBOUND FLOATING STATEPOLICY ROUTE %token STRING %token PORTBINARY @@ -1891,6 +1891,14 @@ pfrule : action dir logquick interface route af proto fromto statelock = 1; r.rule_flag |= o->data.statelock; break; + case PF_STATE_OPT_SLOPPY: + if (r.rule_flag & PFRULE_STATESLOPPY) { + yyerror("state sloppy option: " + "multiple definitions"); + YYERROR; + } + r.rule_flag |= PFRULE_STATESLOPPY; + break; case PF_STATE_OPT_TIMEOUT: if (o->data.timeout.number == PFTM_ADAPTIVE_START || @@ -3216,6 +3224,14 @@ state_opt_item : MAXIMUM number { $$->next = NULL; $$->tail = $$; } + | SLOPPY { + $$ = calloc(1, sizeof(struct node_state_opt)); + if ($$ == NULL) + err(1, "state_opt_item: calloc"); + $$->type = PF_STATE_OPT_SLOPPY; + $$->next = NULL; + $$->tail = $$; + } | STRING number { int i; @@ -4101,6 +4117,13 @@ filter_consistent(struct pf_rule *r, int anchor_call) yyerror("keep state on block rules doesn't make sense"); problems++; } + if (r->rule_flag & PFRULE_STATESLOPPY && + (r->keep_state == PF_STATE_MODULATE || + r->keep_state == PF_STATE_SYNPROXY)) { + yyerror("sloppy state matching cannot be used with " + "synproxy state or modulate state"); + problems++; + } return (-problems); } @@ -4969,6 +4992,7 @@ lookup(char *s) { "scrub", SCRUB}, { "set", SET}, { "skip", SKIP}, + { "sloppy", SLOPPY}, { "source-hash", SOURCEHASH}, { "source-track", SOURCETRACK}, { "state", STATE}, diff --git a/contrib/pf/pfctl/pf_print_state.c b/contrib/pf/pfctl/pf_print_state.c index b3a693a5986a..02a39b321567 100644 --- a/contrib/pf/pfctl/pf_print_state.c +++ b/contrib/pf/pfctl/pf_print_state.c @@ -294,6 +294,8 @@ print_state(struct pf_state *s, int opts) printf(", anchor %u", s->anchor.nr); if (s->rule.nr != -1) printf(", rule %u", s->rule.nr); + if (s->state_flags & PFSTATE_SLOPPY) + printf(", sloppy"); if (s->src_node != NULL) printf(", source-track"); if (s->nat_src_node != NULL) diff --git a/contrib/pf/pfctl/pfctl_parser.c b/contrib/pf/pfctl/pfctl_parser.c index 9f232bdb7832..c9b2e1189b68 100644 --- a/contrib/pf/pfctl/pfctl_parser.c +++ b/contrib/pf/pfctl/pfctl_parser.c @@ -873,6 +873,8 @@ print_rule(struct pf_rule *r, const char *anchor_call, int verbose) opts = 1; if (r->rule_flag & PFRULE_IFBOUND) opts = 1; + if (r->rule_flag & PFRULE_STATESLOPPY) + opts = 1; for (i = 0; !opts && i < PFTM_MAX; ++i) if (r->timeout[i]) opts = 1; @@ -939,6 +941,12 @@ print_rule(struct pf_rule *r, const char *anchor_call, int verbose) printf("if-bound"); opts = 0; } + if (r->rule_flag & PFRULE_STATESLOPPY) { + if (!opts) + printf(", "); + printf("sloppy"); + opts = 0; + } for (i = 0; i < PFTM_MAX; ++i) if (r->timeout[i]) { int j; diff --git a/contrib/sendmail/CACerts b/contrib/sendmail/CACerts index b74fb7f19179..dee28194ebce 100644 --- a/contrib/sendmail/CACerts +++ b/contrib/sendmail/CACerts @@ -1,4 +1,4 @@ -# $Id: CACerts,v 8.3 2007/06/11 22:04:46 ca Exp $ +# $Id: CACerts,v 8.4 2009/06/26 05:46:10 ca Exp $ # This file contains some CA certificates that are used to sign the # certificates of mail servers of members of the sendmail consortium # who may reply to questions etc sent to sendmail.org. @@ -6,73 +6,6 @@ # a certificate signed by one of these CA certificates. # -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 0 (0x0) - Signature Algorithm: md5WithRSAEncryption - Issuer: C=US, ST=California, L=Berkeley, O=Sendmail Consortium, CN=Certificate Authority/emailAddress=certificates@sendmail.org - Validity - Not Before: Feb 1 21:51:47 2003 GMT - Not After : Jan 31 21:51:47 2008 GMT - Subject: C=US, ST=California, L=Berkeley, O=Sendmail Consortium, CN=Certificate Authority/emailAddress=certificates@sendmail.org - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public Key: (1024 bit) - Modulus (1024 bit): - 00:9a:fb:dc:4c:a3:58:21:1b:84:78:0a:53:56:b3: - 8d:84:05:b7:db:dd:d7:81:ea:dd:c1:ab:d4:be:d9: - 2b:12:e0:6d:3a:31:d5:f0:7b:13:fc:d8:da:09:0b: - 71:11:8e:b9:48:c4:ab:ae:f5:9c:4c:e2:04:27:8e: - c8:03:3a:aa:00:8b:46:f2:79:09:ae:65:b2:9a:66: - e7:ac:a9:ea:32:f7:4a:4e:fd:da:41:48:34:5a:9d: - b0:42:ea:55:40:17:27:5e:67:9e:e5:ce:dc:84:6d: - 1d:48:37:23:11:68:9d:a8:d4:58:02:05:ea:88:35: - bd:0d:b6:28:d5:cd:d4:d8:95 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Subject Key Identifier: - DE:CD:6E:B8:89:34:06:3D:E9:CD:A7:FE:45:4F:4E:FB:E1:8D:E7:79 - X509v3 Authority Key Identifier: - keyid:DE:CD:6E:B8:89:34:06:3D:E9:CD:A7:FE:45:4F:4E:FB:E1:8D:E7:79 - DirName:/C=US/ST=California/L=Berkeley/O=Sendmail Consortium/CN=Certificate Authority/emailAddress=certificates@sendmail.org - serial:00 - - X509v3 Basic Constraints: - CA:TRUE - Signature Algorithm: md5WithRSAEncryption - 66:92:b9:57:17:3b:6a:0e:72:b1:85:29:53:9f:11:68:a0:0d: - 79:43:d0:7c:48:73:b9:71:09:50:08:02:03:0b:28:0c:33:9a: - 00:ac:94:69:4f:bc:0f:45:6b:f5:3a:ca:6a:87:a1:7f:28:f7: - 9a:c4:b6:b0:f3:dc:a3:eb:42:95:9f:99:19:f8:b8:84:6d:f1: - 1d:bc:9f:f0:a0:cc:60:2d:00:6b:17:55:33:16:85:d1:73:e1: - 00:59:89:33:19:c4:2e:29:5a:39:a7:0e:e7:9b:d2:4c:c7:b9: - 7d:6a:3e:b4:00:83:86:d3:16:28:fd:ad:55:65:60:4e:14:02: - 46:d3 ------BEGIN CERTIFICATE----- -MIIDsDCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBnTELMAkGA1UEBhMCVVMx -EzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCEJlcmtlbGV5MRwwGgYDVQQK -ExNTZW5kbWFpbCBDb25zb3J0aXVtMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRo -b3JpdHkxKDAmBgkqhkiG9w0BCQEWGWNlcnRpZmljYXRlc0BzZW5kbWFpbC5vcmcw -HhcNMDMwMjAxMjE1MTQ3WhcNMDgwMTMxMjE1MTQ3WjCBnTELMAkGA1UEBhMCVVMx -EzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCEJlcmtlbGV5MRwwGgYDVQQK -ExNTZW5kbWFpbCBDb25zb3J0aXVtMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRo -b3JpdHkxKDAmBgkqhkiG9w0BCQEWGWNlcnRpZmljYXRlc0BzZW5kbWFpbC5vcmcw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJr73EyjWCEbhHgKU1azjYQFt9vd -14Hq3cGr1L7ZKxLgbTox1fB7E/zY2gkLcRGOuUjEq671nEziBCeOyAM6qgCLRvJ5 -Ca5lsppm56yp6jL3Sk792kFINFqdsELqVUAXJ15nnuXO3IRtHUg3IxFonajUWAIF -6og1vQ22KNXN1NiVAgMBAAGjgf0wgfowHQYDVR0OBBYEFN7NbriJNAY96c2n/kVP -Tvvhjed5MIHKBgNVHSMEgcIwgb+AFN7NbriJNAY96c2n/kVPTvvhjed5oYGjpIGg -MIGdMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMI -QmVya2VsZXkxHDAaBgNVBAoTE1NlbmRtYWlsIENvbnNvcnRpdW0xHjAcBgNVBAMT -FUNlcnRpZmljYXRlIEF1dGhvcml0eTEoMCYGCSqGSIb3DQEJARYZY2VydGlmaWNh -dGVzQHNlbmRtYWlsLm9yZ4IBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUA -A4GBAGaSuVcXO2oOcrGFKVOfEWigDXlD0HxIc7lxCVAIAgMLKAwzmgCslGlPvA9F -a/U6ymqHoX8o95rEtrDz3KPrQpWfmRn4uIRt8R28n/CgzGAtAGsXVTMWhdFz4QBZ -iTMZxC4pWjmnDueb0kzHuX1qPrQAg4bTFij9rVVlYE4UAkbT ------END CERTIFICATE----- - - Certificate: Data: Version: 3 (0x2) @@ -144,93 +77,93 @@ Certificate: Data: Version: 3 (0x2) Serial Number: - fa:7c:2c:80:29:3f:c2:64 + c2:3c:61:67:3b:0a:cc:5e Signature Algorithm: md5WithRSAEncryption - Issuer: C=US, ST=California, L=Berkeley, O=Endmail Org, OU=MTA, CN=Claus Assmann CA RSA 2007/emailAddress=ca+ca-rsa2007@esmtp.org + Issuer: C=US, ST=California, L=Berkeley, O=Endmail Org, OU=MTA, CN=Claus Assmann CA RSA 2009/emailAddress=ca+ca-rsa2009@esmtp.org Validity - Not Before: May 4 02:07:56 2007 GMT - Not After : May 3 02:07:56 2010 GMT - Subject: C=US, ST=California, L=Berkeley, O=Endmail Org, OU=MTA, CN=Claus Assmann CA RSA 2007/emailAddress=ca+ca-rsa2007@esmtp.org + Not Before: May 14 04:42:18 2009 GMT + Not After : May 13 04:42:18 2012 GMT + Subject: C=US, ST=California, L=Berkeley, O=Endmail Org, OU=MTA, CN=Claus Assmann CA RSA 2009/emailAddress=ca+ca-rsa2009@esmtp.org Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) Modulus (2048 bit): - 00:b0:28:91:31:af:82:ce:72:ef:36:ab:7d:e9:b1: - f5:77:66:38:4b:38:1f:5f:3d:12:d3:c8:fd:9a:f4: - d4:f6:b8:90:f9:26:5f:29:f7:43:f9:34:ec:65:62: - 01:bb:64:f1:5d:ea:75:04:3d:92:65:60:a2:06:62: - fa:88:ca:d8:20:50:c8:1e:38:53:b5:18:dd:b7:bd: - c7:08:35:4c:d9:dc:c6:97:56:37:b6:65:33:74:5a: - b2:c3:85:08:2b:b7:26:70:ff:38:02:1a:67:6a:d0: - 49:18:10:4b:f8:db:af:06:9c:b1:a8:82:a1:b1:75: - d2:52:9b:53:0c:ca:a7:e3:15:38:79:6d:a1:f5:ef: - 7c:8b:fd:bd:04:78:f9:e8:1e:b9:92:ea:74:d7:45: - 1e:4c:c8:bd:f4:5c:fc:1a:7f:e7:31:c6:ab:cb:78: - c7:4d:2f:b5:72:10:35:27:4a:1a:fa:53:19:f8:a7: - 59:63:eb:e9:15:ab:dc:71:69:8c:42:1c:96:4e:89: - 80:66:c9:9e:21:d5:3d:08:19:74:a5:f5:07:a0:ae: - de:79:af:fd:42:c2:79:7e:8c:f8:39:22:3b:c3:c4: - 58:3b:d0:0d:e6:a9:11:b6:a2:cd:2e:e5:16:66:fd: - 7e:65:33:94:b0:36:80:27:f5:80:76:a9:e5:df:f2: - cf:ef + 00:d5:f8:d3:48:38:75:df:2e:6b:8b:c4:8d:1d:41: + 5e:ad:4b:96:3d:48:c2:dc:e5:ff:61:98:95:32:03: + e9:b6:71:5a:68:31:bc:e1:5c:aa:0e:70:a7:bc:51: + b7:13:6a:78:54:ae:a6:d0:44:49:1b:5e:37:5b:59: + 20:01:47:a7:ec:41:4c:11:79:8c:25:c1:1b:c0:ed: + 85:b2:de:0f:10:9f:e7:b2:a3:c4:f1:fc:85:51:aa: + d6:68:49:51:3e:04:e1:eb:e9:cd:87:1b:d0:9d:97: + 7b:4c:e1:1e:b1:6a:be:01:0a:a9:97:9a:50:89:e3: + 66:06:4c:07:cb:7e:99:70:13:e8:b4:9c:e7:e6:52: + 38:c0:64:90:42:d0:f5:cf:22:46:22:60:e9:34:70: + 1d:e3:d1:13:33:3a:31:ba:13:06:a8:c2:34:90:47: + c5:a1:bd:2d:7d:98:21:70:de:22:d0:13:11:e5:08: + dd:a0:77:0b:df:34:a7:07:55:de:5a:71:f6:6c:9e: + ec:f7:45:75:1f:22:a9:84:06:c6:4f:84:3d:4e:05: + d7:e4:e5:98:41:61:7b:8e:c9:3b:a6:ed:31:80:7d: + fd:fa:f0:dc:b7:07:82:b8:ec:27:20:39:5f:78:95: + f1:0d:93:8d:f9:4d:21:08:fd:72:89:01:ff:2c:a0: + 71:9d Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: - B2:49:6B:52:45:EE:90:36:D2:79:47:03:33:D9:A0:BA:80:50:DA:1C + A7:61:FA:31:AF:A8:E2:5E:93:B6:84:9E:74:08:A2:76:50:87:69:7C X509v3 Authority Key Identifier: - keyid:B2:49:6B:52:45:EE:90:36:D2:79:47:03:33:D9:A0:BA:80:50:DA:1C - DirName:/C=US/ST=California/L=Berkeley/O=Endmail Org/OU=MTA/CN=Claus Assmann CA RSA 2007/emailAddress=ca+ca-rsa2007@esmtp.org - serial:FA:7C:2C:80:29:3F:C2:64 + keyid:A7:61:FA:31:AF:A8:E2:5E:93:B6:84:9E:74:08:A2:76:50:87:69:7C + DirName:/C=US/ST=California/L=Berkeley/O=Endmail Org/OU=MTA/CN=Claus Assmann CA RSA 2009/emailAddress=ca+ca-rsa2009@esmtp.org + serial:C2:3C:61:67:3B:0A:CC:5E X509v3 Basic Constraints: - CA:TRUE + CA:TRUE X509v3 Subject Alternative Name: - email:ca+ca-rsa2007@esmtp.org + email:ca+ca-rsa2009@esmtp.org X509v3 Issuer Alternative Name: - email:ca+ca-rsa2007@esmtp.org + email:ca+ca-rsa2009@esmtp.org Signature Algorithm: md5WithRSAEncryption - 98:98:7c:d3:d0:5b:72:47:15:e6:22:68:bb:78:0e:78:66:e9: - 56:16:d8:bc:9d:5a:dc:27:29:fb:91:2d:6a:21:35:18:56:b4: - 4f:2a:09:c0:08:6f:9a:59:2b:2e:72:9a:fb:50:ba:c7:a9:91: - a0:f9:6c:be:cf:78:42:43:02:70:53:97:ba:6a:e3:da:17:e8: - 1f:c7:3a:5b:e7:bc:eb:e5:24:4c:f5:cf:61:34:1e:20:ed:17: - 63:ef:81:d3:9e:25:fe:cc:05:19:cc:8a:82:c9:4c:3a:b5:6b: - 49:51:76:46:02:aa:60:bb:c4:b9:61:48:33:da:79:8d:46:a3: - 06:20:98:f3:b2:db:3b:ad:c9:1d:0e:97:3d:b7:14:19:d3:7d: - 04:8b:6a:81:e0:11:5b:e1:35:a3:ff:2f:11:86:1c:31:85:7a: - fd:3f:36:ef:99:25:46:2e:b0:cb:43:45:4a:ec:be:d3:3f:a4: - 77:9b:79:cc:ce:92:63:a5:d9:ed:db:a0:9d:5d:7c:d7:80:f6: - c9:41:fb:02:96:8e:fd:f3:da:05:9d:81:a7:25:da:26:35:3b: - a9:0c:8c:f5:a7:5d:48:ec:87:c7:7a:60:51:76:f2:de:9b:14: - 2b:55:8a:43:df:99:19:f3:eb:e7:03:e6:a7:a2:a2:28:dd:d5: - 07:6a:3f:f7 + b3:38:e0:da:a8:07:d8:cc:b8:4d:8c:20:a6:06:2c:f8:27:db: + 8e:28:0f:39:bd:d9:24:c7:9f:e0:4d:d6:b6:63:42:36:0f:d8: + 70:41:e7:9e:a2:24:64:05:ea:85:97:ac:f2:cc:c2:a6:71:bb: + 30:21:c1:c7:c4:54:34:1d:30:09:f0:9b:74:27:93:59:12:4c: + 53:0b:8c:3e:d0:39:ed:4a:d0:d9:66:24:d8:e7:e5:9c:a8:6d: + 5f:56:5d:9a:91:fe:1b:7d:b9:7c:79:9e:1c:b9:71:74:14:f8: + 0c:30:50:f9:b1:22:56:a8:4d:6f:4b:9b:e5:8a:81:33:1b:77: + 75:f6:d8:ce:d4:90:34:86:34:d1:86:75:a9:e1:23:e6:af:c1: + 8e:28:97:47:20:4d:1b:57:09:39:f4:56:01:d2:87:43:3e:29: + f6:c4:5b:7d:8f:9e:bd:ad:36:79:cf:09:70:43:30:21:98:23: + 31:c8:0d:39:ee:77:e1:4a:44:1a:5c:79:2f:6c:ec:8a:3c:db: + 99:a0:11:bc:1a:46:24:51:e7:75:d6:9a:db:ad:dd:55:d4:dd: + ca:81:a0:10:77:96:91:9c:76:30:38:18:f0:82:43:b3:7c:41: + 64:4c:4e:da:66:22:67:cf:b7:d7:10:ba:ed:f4:6d:43:59:00: + d0:82:1e:07 -----BEGIN CERTIFICATE----- -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 -dvLemxQrVYpD35kZ8+vnA+anoqIo3dUHaj/3 +BgNVBAsTA01UQTEiMCAGA1UEAxMZQ2xhdXMgQXNzbWFubiBDQSBSU0EgMjAwOTEm +MCQGCSqGSIb3DQEJARYXY2ErY2EtcnNhMjAwOUBlc210cC5vcmeCCQDCPGFnOwrM +XjAMBgNVHRMEBTADAQH/MCIGA1UdEQQbMBmBF2NhK2NhLXJzYTIwMDlAZXNtdHAu +b3JnMCIGA1UdEgQbMBmBF2NhK2NhLXJzYTIwMDlAZXNtdHAub3JnMA0GCSqGSIb3 +DQEBBAUAA4IBAQCzOODaqAfYzLhNjCCmBiz4J9uOKA85vdkkx5/gTda2Y0I2D9hw +QeeeoiRkBeqFl6zyzMKmcbswIcHHxFQ0HTAJ8Jt0J5NZEkxTC4w+0DntStDZZiTY +5+WcqG1fVl2akf4bfbl8eZ4cuXF0FPgMMFD5sSJWqE1vS5vlioEzG3d19tjO1JA0 +hjTRhnWp4SPmr8GOKJdHIE0bVwk59FYB0odDPin2xFt9j569rTZ5zwlwQzAhmCMx +yA057nfhSkQaXHkvbOyKPNuZoBG8GkYkUed11prbrd1V1N3KgaAQd5aRnHYwOBjw +gkOzfEFkTE7aZiJnz7fXELrt9G1DWQDQgh4H -----END CERTIFICATE----- diff --git a/contrib/sendmail/FREEBSD-upgrade b/contrib/sendmail/FREEBSD-upgrade index 670c6d6faa0b..5d4cf6512e98 100644 --- a/contrib/sendmail/FREEBSD-upgrade +++ b/contrib/sendmail/FREEBSD-upgrade @@ -1,6 +1,6 @@ $FreeBSD$ -sendmail 8.14.3 +sendmail 8.14.4 originals can be found at: ftp://ftp.sendmail.org/pub/sendmail/ For the import of sendmail, the following directories were renamed: @@ -110,4 +110,4 @@ infrastructure in FreeBSD: usr.sbin/mailwrapper/Makefile gshapiro@FreeBSD.org -27-August-2008 +25-January-2010 diff --git a/contrib/sendmail/LICENSE b/contrib/sendmail/LICENSE index e8639f5a5a92..2c604033ee30 100644 --- a/contrib/sendmail/LICENSE +++ b/contrib/sendmail/LICENSE @@ -1,7 +1,7 @@ SENDMAIL LICENSE The following license terms and conditions apply, unless a different -license is obtained from Sendmail, Inc., 6425 Christie Ave, Fourth Floor, +license is obtained from Sendmail, Inc., 6475 Christie Ave, Suite 350, Emeryville, CA 94608, USA, or by electronic mail at license@sendmail.com. License Terms: @@ -33,7 +33,7 @@ each of the following conditions is met: forth as paragraph 6 below, in the documentation and/or other materials provided with the distribution. For the purposes of binary distribution the "Copyright Notice" refers to the following language: - "Copyright (c) 1998-2004 Sendmail, Inc. All rights reserved." + "Copyright (c) 1998-2009 Sendmail, Inc. All rights reserved." 4. Neither the name of Sendmail, Inc. nor the University of California nor the names of their contributors may be used to endorse or promote @@ -76,4 +76,4 @@ each of the following conditions is met: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -$Revision: 8.13 $, Last updated $Date: 2004/05/11 23:57:57 $ +$Revision: 8.15 $, Last updated $Date: 2009/03/04 19:58:04 $ diff --git a/contrib/sendmail/PGPKEYS b/contrib/sendmail/PGPKEYS index 3f7e9226d968..5f89ed439429 100644 --- a/contrib/sendmail/PGPKEYS +++ b/contrib/sendmail/PGPKEYS @@ -141,6 +141,79 @@ gpExpdV7qPrw9k01j5rod5PjZlG8zV0= =SR28 -----END PGP PUBLIC KEY BLOCK----- +Type Bits KeyID Created Expires Algorithm Use +pub 1024 0xA77F2429 2009-01-01 ---------- RSA Sign & Encrypt +f16 Fingerprint16 = 33 3A 62 61 2C F3 21 AA 4E 87 47 F2 2F 2C 40 4D +uid Sendmail Signing Key/2009 + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.8 (OpenBSD) + +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 +wzfu +=RCyv +-----END PGP PUBLIC KEY BLOCK----- + Type Bits KeyID Created Expires Algorithm Use pub 1024 0xF6B30729 2008-01-18 ---------- RSA Sign & Encrypt f16 Fingerprint16 = 07 FB 9A F9 F7 94 4B E4 0F 28 D1 8E 23 6F A2 B0 @@ -1792,4 +1865,4 @@ DnF3FZZEzV7oqPwC2jzv/1dD6GFhtgy0cnyoPGUJCyc= =nES8 -----END PGP PUBLIC KEY BLOCK----- -$Revision: 8.26 $, Last updated $Date: 2008/01/22 06:20:27 $ +$Revision: 8.29 $, Last updated $Date: 2009/01/06 05:59:03 $ diff --git a/contrib/sendmail/README b/contrib/sendmail/README index a8db16227a3e..8175b1a879c7 100644 --- a/contrib/sendmail/README +++ b/contrib/sendmail/README @@ -38,6 +38,7 @@ the latest updates. 4. Read cf/README. Sendmail is a trademark of Sendmail, Inc. +US Patent Numbers 6865671, 6986037. +-----------------------+ | DIRECTORY PERMISSIONS | @@ -464,4 +465,4 @@ sendmail Source for the sendmail program itself. test Some test scripts (currently only for compilation aids). vacation Source for the vacation program. NOT PART OF SENDMAIL! -$Revision: 8.94 $, Last updated $Date: 2008/02/12 16:40:05 $ +$Revision: 8.95 $, Last updated $Date: 2009/04/10 17:49:18 $ diff --git a/contrib/sendmail/RELEASE_NOTES b/contrib/sendmail/RELEASE_NOTES index 0d8ed8663c09..4e1e8f38305f 100644 --- a/contrib/sendmail/RELEASE_NOTES +++ b/contrib/sendmail/RELEASE_NOTES @@ -1,11 +1,96 @@ SENDMAIL RELEASE NOTES - $Id: RELEASE_NOTES,v 8.1926 2008/05/03 03:34:26 ca Exp $ + $Id: RELEASE_NOTES,v 8.1963 2009/12/23 04:43:46 ca Exp $ This listing shows the version of the sendmail binary, the version of the sendmail configuration files, the date of release, and a summary of the changes in that release. +8.14.4/8.14.4 2009/12/30 + SECURITY: Handle bogus certificates containing NUL characters + in CNs by placing a string indicating a bad certificate + in the {cn_subject} or {cn_issuer} macro. Patch inspired + by Matthias Andree's changes for fetchmail. + During the generation of a queue identifier an integer overflow + could occur which might result in bogus characters + being used. Based on patch from John Vannoy of + Pepperdine University. + The value of headers, e.g., Precedence, Content-Type, et.al., + was not processed correctly. Patch from Per Hedeland. + Between 8.11.7 and 8.12.0 the length limitation on a return + path was erroneously reduced from MAXNAME (256) to + MAXSHORTSTR (203). Patch from John Gardiner Myers + of Proofpoint; the problem was also noted by Steve + Hubert of University of Washington. + Prevent a crash when a hostname lookup returns a seemingly + valid result which contains a NULL pointer (this seems + to be happening on some Linux versions). + The process title was missing the current load average when + the MTA was delaying connections due to DelayLA. + Patch from Dick St.Peters of NetHeaven. + Do not reset the number of queue entries in shared memory if + only some of them are processed. + Fix overflow of an internal array when parsing some replies + from a milter. Problem found by Scott Rotondo + of Sun Microsystems. + If STARTTLS is turned off in the server (via M=S) then it + would not be initialized for use in the client either. + Patch from Kazuteru Okahashi of IIJ. + If a Diffie-Hellman cipher is selected for STARTTLS, the + handshake could fail with some TLS implementations + because the prime used by the server is not long enough. + Note: the initialization of the DSA/DH parameters for + the server can take a significant amount of time on slow + machines. This can be turned off by setting DHParameters + to none or a file (see doc/op/op.me). Patch from + Petr Lampa of the Brno University of Technology. + Fix handling of `b' modifier for DaemonPortOptions on little + endian machines for loopback address. Patch from + John Beck of Sun Microsystems. + Fix a potential memory leak in libsmdb/smdb1.c found by parfait. + Based on patch from Jonathan Gray of OpenBSD. + If a milter sets the reply code to "421" during the transfer + of the body, the SMTP server will terminate the SMTP session + with that error to match the behavior of the other callbacks. + Return EX_IOERR (instead of 0) if a mail submission fails due to + missing disk space in the mail queue. Based on patch + from Martin Poole of RedHat. + CONFIG: Using FEATURE(`ldap_routing')'s `nodomain' argument would + cause addresses not found in LDAP to be misparsed. + CONFIG: Using a CN restriction did not work for TLS_Clt as it + referred to a wrong macro. Patch from John Gardiner + Myers of Proofpoint. + CONFIG: The option relaytofulladdress of FEATURE(`access_db') + did not work if FEATURE(`relay_hosts_only') is used too. + Problem noted by Kristian Shaw. + CONFIG: The internal function lower() was broken and hence + strcasecmp() did not work either, which could cause + problems for some FEATURE()s if upper case arguments + were used. Patch from Vesa-Matti J Kari of the + University of Helsinki. + LIBMILTER: Fix internal check whether a milter application + is compiled against the same version of libmilter as + it is linked against (especially useful for dynamic + libraries). + LIBMILTER: Fix memory leak that occurred when smfi_setsymlist() + was used. Based on patch by Dan Lukes. + LIBMILTER: Document the effect of SMFIP_HDR_LEADSPC for filters + which add, insert, or replace headers. From Benjamin + Pineau. + LIBMILTER: Fix error messages which refer to "select()" to be + correct if SM_CONF_POLL is used. Based on patch from + John Nemeth. + LIBSM: Fix handling of LDAP search failures where the error is + carried in the search result itself, such as seen with + OpenLDAP proxy servers. + VACATION: Do not refer to a local variable outside its scope. + Based on patch from Mark Costlow of Southwest Cyberport. + Portability: + Enable HAVE_NANOSLEEP for SunOS 5.11. Patch from + John Beck of Sun Microsystems. + Drop NISPLUS from default SunOS 5.11 map definitions. + Patch from John Beck of Sun Microsystems. + 8.14.3/8.14.3 2008/05/03 During ruleset processing the generation of a key for a map lookup and the parsing of the default value was broken @@ -37,7 +122,7 @@ summary of the changes in that release. Support shared libraries in Darwin 8 and 9. Patch from Chris Behrens of Concentric. Add support for SCO OpenServer 6, patch from Boyd Gerber. - DEVTOOLS: Clarify that confSHAREDLIBDIR requires a trailing path. + DEVTOOLS: Clarify that confSHAREDLIBDIR requires a trailing slash. Added Files: devtools/OS/Darwin.9.x devtools/OS/OSR.i386 diff --git a/contrib/sendmail/cf/README b/contrib/sendmail/cf/README index 43737f60bce6..e3496e927b6e 100644 --- a/contrib/sendmail/cf/README +++ b/contrib/sendmail/cf/README @@ -3142,7 +3142,7 @@ starts with '+' and the items are separated by '++'. Allowed extensions are: CN:name name must match ${cn_subject} -CN ${server_name} must match ${cn_subject} +CN ${client_name}/${server_name} must match ${cn_subject} CS:name name must match ${cert_subject} CI:name name must match ${cert_issuer} @@ -4701,4 +4701,4 @@ M4 DIVERSIONS 8 DNS based blacklists 9 special local rulesets (1 and 2) -$Revision: 8.724 $, Last updated $Date: 2008/02/15 23:05:32 $ +$Revision: 8.727 $, Last updated $Date: 2009/05/07 23:46:17 $ diff --git a/contrib/sendmail/cf/cf/submit.cf b/contrib/sendmail/cf/cf/submit.cf index 11f3820eaa3e..5286c681be03 100644 --- a/contrib/sendmail/cf/cf/submit.cf +++ b/contrib/sendmail/cf/cf/submit.cf @@ -1,5 +1,5 @@ # -# Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2004, 2009 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -16,8 +16,8 @@ ##### ##### SENDMAIL CONFIGURATION FILE ##### -##### built by ca@wiz.smi.sendmail.com on Fri May 2 20:39:00 PDT 2008 -##### in /extra/home/ca/sm-8.14.3/OpenSource/sendmail-8.14.3/cf/cf +##### built by ca@wiz.smi.sendmail.com on Tue Dec 22 20:49:09 PST 2009 +##### in /extra/home/ca/sm-8.14.4/OpenSource/sendmail-8.14.4/cf/cf ##### using ../ as configuration include directory ##### ###################################################################### @@ -27,7 +27,7 @@ ###################################################################### ###################################################################### -##### $Id: cfhead.m4,v 8.116 2004/01/28 22:02:22 ca Exp $ ##### +##### $Id: cfhead.m4,v 8.120 2009/01/23 22:39:21 ca Exp $ ##### ##### $Id: cf.m4,v 8.32 1999/02/07 07:26:14 gshapiro Exp $ ##### ##### $Id: submit.mc,v 8.14 2006/04/05 05:54:41 ca Exp $ ##### ##### $Id: msp.m4,v 1.33 2004/02/09 22:32:38 ca Exp $ ##### @@ -35,7 +35,7 @@ ##### $Id: no_default_msa.m4,v 8.2 2001/02/14 05:03:22 gshapiro Exp $ ##### -##### $Id: proto.m4,v 8.734 2008/01/24 23:42:01 ca Exp $ ##### +##### $Id: proto.m4,v 8.741 2009/12/11 00:04:53 ca Exp $ ##### # level 10 config file format V10/Berkeley @@ -114,7 +114,7 @@ D{MTAHost}[127.0.0.1] # Configuration version number -DZ8.14.3/Submit +DZ8.14.4/Submit ############### @@ -440,6 +440,7 @@ O RunAsUser=smmsp # once the threshold number of recipients have been rejected #O BadRcptThrottle=0 + # shall we get local names from our installed interfaces? O DontProbeInterfaces=True @@ -500,6 +501,7 @@ O PidFile=/var/spool/clientmqueue/sm-client.pid # SMTP STARTTLS server options #O TLSSrvOptions + # Input mail filters #O InputMailFilters diff --git a/contrib/sendmail/cf/feature/ldap_routing.m4 b/contrib/sendmail/cf/feature/ldap_routing.m4 index a474f17fbe4a..227060c20e90 100644 --- a/contrib/sendmail/cf/feature/ldap_routing.m4 +++ b/contrib/sendmail/cf/feature/ldap_routing.m4 @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 1999-2002, 2004, 2007 Sendmail, Inc. and its suppliers. +# Copyright (c) 1999-2002, 2004, 2007, 2009 Sendmail, Inc. and its suppliers. # All rights reserved. # # By using this file, you agree to the terms and conditions set @@ -10,7 +10,7 @@ divert(-1) # divert(0) -VERSIONID(`$Id: ldap_routing.m4,v 8.15 2007/05/01 17:38:25 ca Exp $') +VERSIONID(`$Id: ldap_routing.m4,v 8.17 2009/06/26 21:11:08 ca Exp $') divert(-1) # Check first two arguments. If they aren't set, may need to warn in proto.m4 @@ -35,12 +35,40 @@ ifelse(len(X`'_ARG6_), `1', `define(`_LDAP_ROUTE_MAPTEMP_', `_QUEUE_')', _ARG6_, `tempfail', `define(`_LDAP_ROUTE_MAPTEMP_', `_TEMPFAIL_')', _ARG6_, `queue', `define(`_LDAP_ROUTE_MAPTEMP_', `_QUEUE_')') +define(`_ATMPF_', `')dnl +dnl check whether arg contains -T`'_ATMPF_ +dnl unless it is a sequence map or just LDAP +dnl note: this does not work if ARG1 begins with space(s), however, as +dnl we issue a warning, hopefully the user will fix it... +ifelse(defn(`_ARG1_'), `', `', + defn(`_ARG1_'), `LDAP', `', + `ifelse(index(_ARG1_, `sequence '), `0', `', + `ifelse(index(_ARG1_, _ATMPF_), `-1', + `errprint(`*** WARNING: missing -T'_ATMPF_` in first argument of FEATURE(`ldap_routing') +') + define(`_ABP_', index(_ARG1_, ` ')) + define(`_NARG1_', `substr(_ARG1_, 0, _ABP_) -T'_ATMPF_` substr(_ARG1_, _ABP_)') + ') + ') + ') +ifelse(defn(`_ARG2_'), `', `', + defn(`_ARG2_'), `LDAP', `', + `ifelse(index(_ARG2_, `sequence '), `0', `', + `ifelse(index(_ARG2_, _ATMPF_), `-1', + `errprint(`*** WARNING: missing -T'_ATMPF_` in second argument of FEATURE(`ldap_routing') +') + define(`_ABP_', index(_ARG2_, ` ')) + define(`_NARG2_', `substr(_ARG2_, 0, _ABP_) -T'_ATMPF_` substr(_ARG2_, _ABP_)') + ') + ') + ') + LOCAL_CONFIG # LDAP routing maps Kldapmh ifelse(len(X`'_ARG1_), `1', `ldap -1 -T -v mailHost -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))', - `_ARG1_') + defn(`_NARG1_'), `', `_ARG1_', `_NARG1_') Kldapmra ifelse(len(X`'_ARG2_), `1', `ldap -1 -T -v mailRoutingAddress -k (&(objectClass=inetLocalMailRecipient)(mailLocalAddress=%0))', - `_ARG2_') + defn(`_NARG2_'), `', `_ARG2_', `_NARG2_') diff --git a/contrib/sendmail/cf/m4/cfhead.m4 b/contrib/sendmail/cf/m4/cfhead.m4 index dc1d8ba65614..c2d0df7c8e15 100644 --- a/contrib/sendmail/cf/m4/cfhead.m4 +++ b/contrib/sendmail/cf/m4/cfhead.m4 @@ -1,5 +1,5 @@ # -# Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2004, 2009 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -49,7 +49,7 @@ define(`OSTYPE', define(`_ARG_', $2) include(_CF_DIR_`'ostype/$1.m4)POPDIVERT`'') ## helpful functions -define(`lower', `translit(`$1', `ABCDEFGHIJKLMNOPQRSTUVWXYZ', `abcdefghijklmnopqrstuvwx')') +define(`lower', `translit(`$1', `ABCDEFGHIJKLMNOPQRSTUVWXYZ', `abcdefghijklmnopqrstuvwxyz')') define(`strcasecmp', `ifelse(lower($1), lower($2), `1', `0')') ## access to further arguments in FEATURE/HACK define(`_ACC_ARG_1_',`$1') @@ -308,4 +308,4 @@ define(`confMILTER_MACROS_EOM', `{msg_id}') divert(0)dnl -VERSIONID(`$Id: cfhead.m4,v 8.116 2004/01/28 22:02:22 ca Exp $') +VERSIONID(`$Id: cfhead.m4,v 8.120 2009/01/23 22:39:21 ca Exp $') diff --git a/contrib/sendmail/cf/m4/proto.m4 b/contrib/sendmail/cf/m4/proto.m4 index 4e314b3e41b9..c021581c3777 100644 --- a/contrib/sendmail/cf/m4/proto.m4 +++ b/contrib/sendmail/cf/m4/proto.m4 @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ divert(-1) # divert(0) -VERSIONID(`$Id: proto.m4,v 8.734 2008/01/24 23:42:01 ca Exp $') +VERSIONID(`$Id: proto.m4,v 8.741 2009/12/11 00:04:53 ca Exp $') # level CF_LEVEL config file format V`'CF_LEVEL/ifdef(`VENDOR_NAME', `VENDOR_NAME', `Berkeley') @@ -580,6 +580,7 @@ _OPTION(MaxRecipientsPerMessage, `confMAX_RCPTS_PER_MESSAGE', `0') # once the threshold number of recipients have been rejected _OPTION(BadRcptThrottle, `confBAD_RCPT_THROTTLE', `0') + # shall we get local names from our installed interfaces? _OPTION(DontProbeInterfaces, `confDONT_PROBE_INTERFACES', `False') @@ -640,6 +641,7 @@ _OPTION(AuthMaxBits, `confAUTH_MAX_BITS', `') # SMTP STARTTLS server options _OPTION(TLSSrvOptions, `confTLS_SRV_OPTIONS', `') + # Input mail filters _OPTION(InputMailFilters, `confINPUT_MAIL_FILTERS', `') @@ -1509,7 +1511,9 @@ ifdef(`_LDAP_ROUTE_DETAIL_', # try without +detail R<> <> <$+> <$+ + $* @ $+> <> $@ $>LDAPExpand <$1> <$2 @ $4> <+$3>')dnl -ifdef(`_LDAP_ROUTE_NODOMAIN_', `dnl', ` +ifdef(`_LDAP_ROUTE_NODOMAIN_', ` +# pretend we did the @domain lookup +R<> <> <$+> <$+ @ $+> <$*> $: <> <> <$1> <@ $3> <$4>', ` # if still no mailRoutingAddress and no mailHost, # try @domain ifelse(_LDAP_ROUTE_DETAIL_, `_PRESERVE_', `dnl @@ -2139,7 +2143,10 @@ R$+ < @ $=w > $@ RELAY ifdef(`_RELAY_HOSTS_ONLY_', `R$+ < @ $=R > $@ RELAY ifdef(`_ACCESS_TABLE_', `dnl -R$+ < @ $+ > $: <$(access To:$2 $: ? $)> <$1 < @ $2 >> +ifdef(`_RELAY_FULL_ADDR_', `dnl +R$+ < @ $+ > $: <$(access To:$1@$2 $: ? $)> <$1 < @ $2 >> +R <$+ < @ $+ >> $: <$(access To:$2 $: ? $)> <$1 < @ $2 >>',` +R$+ < @ $+ > $: <$(access To:$2 $: ? $)> <$1 < @ $2 >>') dnl workspace: > R <$+ < @ $+ >> $: <$(access $2 $: ? $)> <$1 < @ $2 >>',`dnl')', `R$+ < @ $* $=R > $@ RELAY @@ -2691,7 +2698,7 @@ R$* $#$* $#$2 R$* $* $: $1', `dnl') ifdef(`_ACCESS_TABLE_', `dnl dnl store name of other side -R$* $: $(macro {TLS_Name} $@ $&{server_name} $) $1 +R$* $: $(macro {TLS_Name} $@ $&{client_name} $) $1 dnl ignore second arg for now dnl maybe use it to distinguish permanent/temporary error? dnl if MAIL: permanent (STARTTLS has not been offered) diff --git a/contrib/sendmail/cf/m4/version.m4 b/contrib/sendmail/cf/m4/version.m4 index bd722ac3a89b..5ad5ffb90249 100644 --- a/contrib/sendmail/cf/m4/version.m4 +++ b/contrib/sendmail/cf/m4/version.m4 @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 1998-2008 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -11,8 +11,8 @@ divert(-1) # the sendmail distribution. # # -VERSIONID(`$Id: version.m4,v 8.195 2008/04/17 17:04:30 ca Exp $') +VERSIONID(`$Id: version.m4,v 8.205 2009/12/23 04:43:09 ca Exp $') # divert(0) # Configuration version number -DZ8.14.3`'ifdef(`confCF_VERSION', `/confCF_VERSION') +DZ8.14.4`'ifdef(`confCF_VERSION', `/confCF_VERSION') diff --git a/contrib/sendmail/contrib/qtool.pl b/contrib/sendmail/contrib/qtool.pl index d6a63ec17eba..f2d33c27b4ad 100755 --- a/contrib/sendmail/contrib/qtool.pl +++ b/contrib/sendmail/contrib/qtool.pl @@ -3,7 +3,7 @@ ## Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. ## All rights reserved. ## -## $Id: qtool.pl,v 8.29 2007/02/16 01:12:08 ca Exp $ +## $Id: qtool.pl,v 8.30 2009/03/04 16:57:30 ca Exp $ ## use strict; use File::Basename; @@ -450,7 +450,7 @@ sub unlock_file ## ## Parameters: ## src_name -- The name of the file to be move. -## dst_nome -- The name of the place to move it to. +## dst_name -- The name of the place to move it to. ## ## Returns: ## error_string -- If undef then no problem. Otherwise it is a @@ -1193,7 +1193,7 @@ sub bounce ## ## This Condition Class checks the modification time of the ## source file and returns true if the file's modification time is -## older than the number of seconds the class was initialzed with. +## older than the number of seconds the class was initialized with. ## package OlderThan; @@ -1286,7 +1286,7 @@ sub check_move ## Eval ## ## Takes a perl expression and evaluates it. The ControlFile object -## for the source QueuedMessage is avaliable through the name '$msg'. +## for the source QueuedMessage is available through the name '$msg'. ## package Eval; diff --git a/contrib/sendmail/contrib/smcontrol.pl b/contrib/sendmail/contrib/smcontrol.pl index 4987460e4d4e..43ae5759132c 100755 --- a/contrib/sendmail/contrib/smcontrol.pl +++ b/contrib/sendmail/contrib/smcontrol.pl @@ -1,4 +1,6 @@ -#!/usr/local/bin/perl -w +#!/usr/bin/perl -w + +# $Id: smcontrol.pl,v 8.8 2008/07/21 21:31:43 ca Exp $ use strict; use Getopt::Std; diff --git a/contrib/sendmail/doc/op/op.me b/contrib/sendmail/doc/op/op.me index 74c2d6679a41..be0781024366 100644 --- a/contrib/sendmail/doc/op/op.me +++ b/contrib/sendmail/doc/op/op.me @@ -9,7 +9,7 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: op.me,v 8.741 2007/06/22 23:08:59 ca Exp $ +.\" $Id: op.me,v 8.745 2009/12/13 04:12:46 ca Exp $ .\" .\" eqn op.me | pic | troff -me .\" @@ -90,13 +90,14 @@ Sendmail, Inc. .de Ve Version \\$2 .. -.Ve $Revision: 8.741 $ +.Ve $Revision: 8.745 $ .rm Ve .sp For Sendmail Version 8.14 .)l .(f Sendmail is a trademark of Sendmail, Inc. +US Patent Numbers 6865671, 6986037. .)f .sp 2 .pp @@ -4952,9 +4953,21 @@ as "(may be forged)". .ip ${cn_issuer} The CN (common name) of the CA that signed the presented certificate (STARTTLS only). +Note: if the CN cannot be extracted properly it will be replaced by +one of these strings based on the encountered error: +.(b +.ta 25n +BadCertificateContainsNUL CN contains a NUL character +BadCertificateTooLong CN is too long +BadCertificateUnknown CN could not be extracted +.)b +In the last case, some other (unspecific) error occurred. .ip ${cn_subject} The CN (common name) of the presented certificate (STARTTLS only). +See +.b ${cn_issuer} +for possible replacements. .ip ${currHeader} Header value as quoted string (possibly truncated to @@ -5130,7 +5143,7 @@ The total number of incoming connections over the time interval specified by ConnectionRateWindowSize. .ip ${verify} The result of the verification of the presented cert; -only defined after STARTTLS has been used. +only defined after STARTTLS has been used (or attempted). Possible values are: .(b .ta 13n @@ -6710,10 +6723,25 @@ CRL checking requires at least OpenSSL version 0.9.7. Note: if a CRLFile is specified but the file is unusable, STARTTLS is disabled. .ip DHParameters -File with DH parameters for STARTTLS. +Possible values are: +.(b +.ta 1i +5 use 512 bit prime +1 use 1024 bit prime +none do not use Diffie-Hellman +NAME load prime from file +.)b This is only required if a ciphersuite containing DSA/DH is used. -This is only for people with a good knowledge of TLS, all others -can ignore this option. +If ``5'' is selected, then precomputed, fixed primes are used. +This is the default for the client side. +If ``1'' is selected, then prime values are computed during startup. +This is the default for the server side. +Note: this operation can take a significant amount of time on a +slow machine (several seconds), but it is only done once at startup. +If ``none'' is selected, then TLS ciphersuites containing DSA/DH +cannot be used. +If a file name is specified (which must be an absolute path), +then the primes are read from it. .ip DaemonPortOptions=\fIoptions\fP [O] Set server SMTP options. @@ -11435,7 +11463,7 @@ replace it with a blank sheet for double-sided output. .\".sz 10 .\"Eric Allman .\".sp -.\"Version $Revision: 8.741 $ +.\"Version $Revision: 8.745 $ .\".ce 0 .bp 3 .ce diff --git a/contrib/sendmail/include/libmilter/mfapi.h b/contrib/sendmail/include/libmilter/mfapi.h index 7d7fb1d99f57..8e3a17328615 100644 --- a/contrib/sendmail/include/libmilter/mfapi.h +++ b/contrib/sendmail/include/libmilter/mfapi.h @@ -7,7 +7,7 @@ * the sendmail distribution. * * - * $Id: mfapi.h,v 8.78 2008/02/27 22:30:34 ca Exp $ + * $Id: mfapi.h,v 8.80 2009/11/06 00:57:08 ca Exp $ */ /* @@ -18,7 +18,14 @@ # define _LIBMILTER_MFAPI_H 1 #ifndef SMFI_VERSION -# define SMFI_VERSION 0x01000001 /* libmilter version number */ +# if _FFR_MDS_NEGOTIATE +# define SMFI_VERSION 0x01000002 /* libmilter version number */ + + /* first libmilter version that has MDS support */ +# define SMFI_VERSION_MDS 0x01000002 +# else /* _FFR_MDS_NEGOTIATE */ +# define SMFI_VERSION 0x01000001 /* libmilter version number */ +# endif /* _FFR_MDS_NEGOTIATE */ #endif /* ! SMFI_VERSION */ #define SM_LM_VRS_MAJOR(v) (((v) & 0x7f000000) >> 24) @@ -163,9 +170,7 @@ LIBMILTER_API int smfi_setdbg __P((int)); LIBMILTER_API int smfi_settimeout __P((int)); LIBMILTER_API int smfi_setconn __P((char *)); LIBMILTER_API int smfi_stop __P((void)); -#if _FFR_MAXDATASIZE LIBMILTER_API size_t smfi_setmaxdatasize __P((size_t)); -#endif /* _FFR_MAXDATASIZE */ LIBMILTER_API int smfi_version __P((unsigned int *, unsigned int *, unsigned int *)); /* diff --git a/contrib/sendmail/include/libmilter/mfdef.h b/contrib/sendmail/include/libmilter/mfdef.h index 674856707de4..f42ec026cc92 100644 --- a/contrib/sendmail/include/libmilter/mfdef.h +++ b/contrib/sendmail/include/libmilter/mfdef.h @@ -7,7 +7,7 @@ * the sendmail distribution. * * - * $Id: mfdef.h,v 8.38 2007/03/27 18:53:48 ca Exp $ + * $Id: mfdef.h,v 8.39 2009/11/06 00:57:08 ca Exp $ */ /* @@ -27,6 +27,12 @@ #define MILTER_CHUNK_SIZE 65535 /* body chunk size */ #define MILTER_MAX_DATA_SIZE 65535 /* default milter command data limit */ +#if _FFR_MDS_NEGOTIATE +# define MILTER_MDS_64K ((64 * 1024) - 1) +# define MILTER_MDS_256K ((256 * 1024) - 1) +# define MILTER_MDS_1M ((1024 * 1024) - 1) +#endif /* _FFR_MDS_NEGOTIATE */ + /* These apply to SMFIF_* flags */ #define SMFI_V1_ACTS 0x0000000FL /* The actions of V1 filter */ #define SMFI_V2_ACTS 0x0000003FL /* The actions of V2 filter */ @@ -100,6 +106,9 @@ #define SMFIP_NR_EOH 0x00040000L /* No reply for eoh */ #define SMFIP_NR_BODY 0x00080000L /* No reply for body chunk */ #define SMFIP_HDR_LEADSPC 0x00100000L /* header value leading space */ +#define SMFIP_MDS_256K 0x10000000L /* MILTER_MAX_DATA_SIZE=256K */ +#define SMFIP_MDS_1M 0x20000000L /* MILTER_MAX_DATA_SIZE=1M */ +/* #define SMFIP_ 0x40000000L reserved: see SMFI_INTERNAL*/ #define SMFI_V1_PROT 0x0000003FL /* The protocol of V1 filter */ #define SMFI_V2_PROT 0x0000007FL /* The protocol of V2 filter */ @@ -107,4 +116,11 @@ /* all defined protocol bits */ #define SMFI_CURR_PROT 0x001FFFFFL +/* internal flags: only used between MTA and libmilter */ +#define SMFI_INTERNAL 0x70000000L + +#if _FFR_MILTER_CHECK +# define SMFIP_TEST 0x80000000L +#endif /* _FFR_MILTER_CHECK */ + #endif /* !_LIBMILTER_MFDEF_H */ diff --git a/contrib/sendmail/include/sm/conf.h b/contrib/sendmail/include/sm/conf.h index 13b3b50cafc3..5b1875426af2 100644 --- a/contrib/sendmail/include/sm/conf.h +++ b/contrib/sendmail/include/sm/conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -10,7 +10,7 @@ * the sendmail distribution. * * - * $Id: conf.h,v 1.134 2007/09/24 23:05:37 ca Exp $ + * $Id: conf.h,v 1.139 2009/06/16 23:41:32 ca Exp $ */ /* @@ -460,6 +460,7 @@ typedef int pid_t; # endif /* SOLARIS >= 21000 || (SOLARIS < 10000 && SOLARIS >= 210) */ # if SOLARIS >= 21100 || (SOLARIS < 10000 && SOLARIS >= 211) # define GETLDAPALIASBYNAME_VERSION 2 /* changed in S11 */ +# define HAVE_NANOSLEEP 1 /* moved from librt to libc in S11 */ # endif /* SOLARIS >= 21100 || (SOLARIS < 10000 && SOLARIS >= 211) */ # ifndef HASGETUSERSHELL # define HASGETUSERSHELL 0 /* getusershell(3) causes core dumps pre-2.7 */ @@ -1021,6 +1022,10 @@ extern unsigned int sleepX __P((unsigned int seconds)); # define SMRSH_PATH "/bin:/usr/bin" # endif /* ! SMRSH_PATH */ # endif /* __FreeBSD_version >= 330000 */ +# if __FreeBSD_version >= 430000 /* 4.3.0-release and later */ +# define SOCKADDR_LEN_T socklen_t /* e.g., arg#3 to accept, getsockname */ +# define SOCKOPT_LEN_T socklen_t /* arg#5 to getsockopt */ +# endif /* __FreeBSD_version >= 430000 */ # define USESYSCTL 1 /* use sysctl(3) for getting ncpus */ # include # endif /* __FreeBSD__ >= 2 */ @@ -2800,6 +2805,20 @@ struct utsname # define MAXHOSTNAMELEN 256 # endif /* !defined(MAXHOSTNAMELEN) && !defined(_SCO_unix_) && !defined(NonStop_UX_BXX) && !defined(ALTOS_SYSTEM_V) */ + +# if _FFR_LINUX_MHNL && defined(__linux__) && MAXHOSTNAMELEN < 255 + /* + ** override Linux wierdness: a FQHN can be 255 chars long + ** SUSv3 requires HOST_NAME_MAX ("Maximum length of a host + ** name (not including the terminating null) as returned from the + ** gethostname() function.") to be at least 255. c.f.: + ** http://www.opengroup.org/onlinepubs/009695399 + ** but Linux defines that to 64 too. + */ +# undef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +# endif /* _FFR_LINUX_MHNL && defined(__linux__) && MAXHOSTNAMELEN < 255 */ + # if !defined(SIGCHLD) && defined(SIGCLD) # define SIGCHLD SIGCLD # endif /* !defined(SIGCHLD) && defined(SIGCLD) */ diff --git a/contrib/sendmail/include/sm/ldap.h b/contrib/sendmail/include/sm/ldap.h index fc9a325feef9..b0a9cc058044 100644 --- a/contrib/sendmail/include/sm/ldap.h +++ b/contrib/sendmail/include/sm/ldap.h @@ -6,7 +6,7 @@ * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. * - * $Id: ldap.h,v 1.33 2007/10/10 00:06:44 ca Exp $ + * $Id: ldap.h,v 1.34 2008/11/17 21:02:54 ca Exp $ */ #ifndef SM_LDAP_H @@ -92,7 +92,7 @@ struct sm_ldap_struct char ldap_attrsep; # if _FFR_LDAP_NETWORK_TIMEOUT - struct timeval ldap_networktmo; + int ldap_networktmo; # endif /* _FFR_LDAP_NETWORK_TIMEOUT */ /* Linked list of maps sharing the same LDAP binding */ diff --git a/contrib/sendmail/include/sm/sem.h b/contrib/sendmail/include/sm/sem.h index 7b691a43adc5..3ac0bc61cc3c 100644 --- a/contrib/sendmail/include/sm/sem.h +++ b/contrib/sendmail/include/sm/sem.h @@ -1,12 +1,12 @@ /* - * Copyright (c) 2000-2001, 2005 Sendmail, Inc. and its suppliers. + * Copyright (c) 2000-2001, 2005, 2008 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. * - * $Id: sem.h,v 1.9 2005/02/17 22:08:58 ca Exp $ + * $Id: sem.h,v 1.10 2008/05/30 16:26:39 ca Exp $ */ #ifndef SM_SEM_H @@ -47,6 +47,7 @@ extern int sm_sem_stop __P((int)); extern int sm_sem_acq __P((int, int, int)); extern int sm_sem_rel __P((int, int, int)); extern int sm_sem_get __P((int, int)); +extern int sm_semsetowner __P((int, uid_t, gid_t, mode_t)); # else /* SM_CONF_SEM > 0 */ # define sm_sem_start(key, nsem, semflg, owner) 0 diff --git a/contrib/sendmail/libmilter/Makefile.m4 b/contrib/sendmail/libmilter/Makefile.m4 index 929ec7519ef7..bc9bc66d6711 100644 --- a/contrib/sendmail/libmilter/Makefile.m4 +++ b/contrib/sendmail/libmilter/Makefile.m4 @@ -1,4 +1,4 @@ -dnl $Id: Makefile.m4,v 8.80 2008/04/08 05:23:44 ca Exp $ +dnl $Id: Makefile.m4,v 8.85 2009/11/24 21:59:33 ca Exp $ include(confBUILDTOOLSDIR`/M4/switch.m4') dnl only required for compilation of EXTRAS diff --git a/contrib/sendmail/libmilter/comm.c b/contrib/sendmail/libmilter/comm.c index a7a44dffa7bd..e04681c8d0ba 100644 --- a/contrib/sendmail/libmilter/comm.c +++ b/contrib/sendmail/libmilter/comm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2004 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2004, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -9,7 +9,7 @@ */ #include -SM_RCSID("@(#)$Id: comm.c,v 8.67 2006/11/02 17:54:44 ca Exp $") +SM_RCSID("@(#)$Id: comm.c,v 8.70 2009/12/16 16:33:48 ca Exp $") #include "libmilter.h" #include @@ -18,7 +18,6 @@ SM_RCSID("@(#)$Id: comm.c,v 8.67 2006/11/02 17:54:44 ca Exp $") static ssize_t retry_writev __P((socket_t, struct iovec *, int, struct timeval *)); static size_t Maxdatasize = MILTER_MAX_DATA_SIZE; -#if _FFR_MAXDATASIZE /* ** SMFI_SETMAXDATASIZE -- set limit for milter data read/write. ** @@ -39,7 +38,6 @@ smfi_setmaxdatasize(sz) Maxdatasize = sz; return old; } -#endif /* _FFR_MAXDATASIZE */ /* ** MI_RD_CMD -- read a command @@ -122,8 +120,8 @@ mi_rd_cmd(sd, timeout, cmd, rlen, name) else if (ret < 0) { smi_log(SMI_LOG_ERR, - "%s: mi_rd_cmd: select returned %d: %s", - name, ret, sm_errstring(errno)); + "%s: mi_rd_cmd: %s() returned %d: %s", + name, MI_POLLSELECT, ret, sm_errstring(errno)); *cmd = SMFIC_RECVERR; return NULL; } @@ -214,8 +212,8 @@ mi_rd_cmd(sd, timeout, cmd, rlen, name) if (ret < 0) { smi_log(SMI_LOG_ERR, - "%s: mi_rd_cmd: select returned %d: %s", - name, ret, sm_errstring(save_errno)); + "%s: mi_rd_cmd: %s() returned %d: %s", + name, MI_POLLSELECT, ret, sm_errstring(save_errno)); *cmd = SMFIC_RECVERR; return NULL; } @@ -326,7 +324,7 @@ mi_wr_cmd(sd, timeout, cmd, buf, len) char *buf; size_t len; { - size_t sl, i; + size_t sl; ssize_t l; mi_int32 nl; int iovcnt; @@ -339,7 +337,6 @@ mi_wr_cmd(sd, timeout, cmd, buf, len) nl = htonl(len + 1); /* add 1 for the cmd char */ (void) memcpy(data, (void *) &nl, MILTER_LEN_BYTES); data[MILTER_LEN_BYTES] = (char) cmd; - i = 0; sl = MILTER_LEN_BYTES + 1; /* set up the vector for the size / command */ diff --git a/contrib/sendmail/libmilter/docs/api.html b/contrib/sendmail/libmilter/docs/api.html index 4214df4dd87a..578e0ca686af 100644 --- a/contrib/sendmail/libmilter/docs/api.html +++ b/contrib/sendmail/libmilter/docs/api.html @@ -2,7 +2,7 @@ Milter API

Milter API

@@ -80,7 +80,9 @@ The following functions change a message's contents and attributes. They may only be called in xxfi_eom. All of these functions may invoke additional communication with the MTA. They will return either MI_SUCCESS or MI_FAILURE to indicate the status of -the operation. +the operation. Message data (senders, recipients, headers, body chunks) +passed to these functions via parameters is copied and does not need to be +preserved (i.e., allocated memory can be freed).

A filter must have set the appropriate flag (listed below) in the @@ -310,7 +312,7 @@ for a protocol stage.


-Copyright (c) 2000, 2003, 2006 Sendmail, Inc. and its suppliers. +Copyright (c) 2000, 2003, 2006, 2009 Sendmail, Inc. and its suppliers. All rights reserved.
By using this file, you agree to the terms and conditions set diff --git a/contrib/sendmail/libmilter/docs/overview.html b/contrib/sendmail/libmilter/docs/overview.html index b7e80dfdbed7..5c6f21ce4ce1 100644 --- a/contrib/sendmail/libmilter/docs/overview.html +++ b/contrib/sendmail/libmilter/docs/overview.html @@ -4,7 +4,7 @@

Technical Overview

@@ -60,7 +60,9 @@ returns to MESSAGE. For each of N connections { For each filter - process connection/helo (xxfi_connect, xxfi_helo) + process connection (xxfi_connect) + For each filter + process helo/ehlo (xxfi_helo) MESSAGE:For each message in this connection (sequentially) { For each filter diff --git a/contrib/sendmail/libmilter/docs/smfi_addheader.html b/contrib/sendmail/libmilter/docs/smfi_addheader.html index d068f9fdb934..460b4caf7cf1 100644 --- a/contrib/sendmail/libmilter/docs/smfi_addheader.html +++ b/contrib/sendmail/libmilter/docs/smfi_addheader.html @@ -2,7 +2,7 @@ smfi_addheader

smfi_addheader

@@ -90,7 +90,11 @@ To change a header's current value, use the MTA will add this automatically. It is the filter writer's responsibility to ensure that no standards are violated. -
  • The MTA adds a leading space to an added header value. +
  • The MTA adds a leading space to an added header value unless + the flag +SMFIP_HDR_LEADSPC + is set, in which case the milter + must include any desired leading spaces itself. @@ -116,7 +120,7 @@ To change a header's current value, use
    -Copyright (c) 2000-2003, 2006 Sendmail, Inc. and its suppliers. +Copyright (c) 2000-2003, 2006, 2009 Sendmail, Inc. and its suppliers. All rights reserved.
    By using this file, you agree to the terms and conditions set diff --git a/contrib/sendmail/libmilter/docs/smfi_chgheader.html b/contrib/sendmail/libmilter/docs/smfi_chgheader.html index 0701a3671aaf..517b5ba4c1c8 100644 --- a/contrib/sendmail/libmilter/docs/smfi_chgheader.html +++ b/contrib/sendmail/libmilter/docs/smfi_chgheader.html @@ -2,7 +2,7 @@ smfi_chgheader

    smfi_chgheader

    @@ -85,6 +85,11 @@ Otherwise, it returns MI_SUCCESS. carriage return (ASCII 0x0d); the MTA will add this automatically. It is the filter writer's responsibility to ensure that no standards are violated. +
  • The MTA adds a leading space to a header value unless + the flag +SMFIP_HDR_LEADSPC + is set, in which case the milter + must include any desired leading spaces itself. @@ -110,7 +115,7 @@ Otherwise, it returns MI_SUCCESS.
    -Copyright (c) 2000-2003 Sendmail, Inc. and its suppliers. +Copyright (c) 2000-2003, 2009 Sendmail, Inc. and its suppliers. All rights reserved.
    By using this file, you agree to the terms and conditions set diff --git a/contrib/sendmail/libmilter/docs/smfi_insheader.html b/contrib/sendmail/libmilter/docs/smfi_insheader.html index a4ba77f33d4f..5962e61afea1 100644 --- a/contrib/sendmail/libmilter/docs/smfi_insheader.html +++ b/contrib/sendmail/libmilter/docs/smfi_insheader.html @@ -2,7 +2,7 @@ smfi_insheader

    smfi_insheader

    @@ -111,6 +111,11 @@ Otherwise, it returns MI_SUCCESS. the MTA will add this automatically. It is the filter writer's responsibility to ensure that no standards are violated. +
  • The MTA adds a leading space to an inserted header value unless + the flag +SMFIP_HDR_LEADSPC + is set, in which case the milter + must include any desired leading spaces itself. @@ -135,7 +140,7 @@ Otherwise, it returns MI_SUCCESS.
    -Copyright (c) 2004, 2006 Sendmail, Inc. and its suppliers. +Copyright (c) 2004, 2006, 2009 Sendmail, Inc. and its suppliers. All rights reserved.
    By using this file, you agree to the terms and conditions set diff --git a/contrib/sendmail/libmilter/engine.c b/contrib/sendmail/libmilter/engine.c index 9002a0bab96f..a2d3e1e3f3fa 100644 --- a/contrib/sendmail/libmilter/engine.c +++ b/contrib/sendmail/libmilter/engine.c @@ -9,7 +9,7 @@ */ #include -SM_RCSID("@(#)$Id: engine.c,v 8.162 2008/02/27 01:34:14 ca Exp $") +SM_RCSID("@(#)$Id: engine.c,v 8.166 2009/11/06 00:57:07 ca Exp $") #include "libmilter.h" @@ -113,6 +113,7 @@ static void fix_stm __P((SMFICTX_PTR)); static bool trans_ok __P((int, int)); static char **dec_argv __P((char *, size_t)); static int dec_arg2 __P((char *, size_t, char **, char **)); +static void mi_clr_symlist __P((SMFICTX_PTR)); #if _FFR_WORKERS_POOL static bool mi_rd_socket_ready __P((int)); @@ -757,6 +758,69 @@ mi_clr_macros(ctx, m) } } +/* +** MI_CLR_SYMLIST -- clear list of macros +** +** Parameters: +** ctx -- context structure +** +** Returns: +** None. +*/ + +static void +mi_clr_symlist(ctx) + SMFICTX *ctx; +{ + int i; + + SM_ASSERT(ctx != NULL); + for (i = SMFIM_FIRST; i <= SMFIM_LAST; i++) + { + if (ctx->ctx_mac_list[i] != NULL) + { + free(ctx->ctx_mac_list[i]); + ctx->ctx_mac_list[i] = NULL; + } + } +} + +/* +** MI_CLR_CTX -- clear context +** +** Parameters: +** ctx -- context structure +** +** Returns: +** None. +*/ + +void +mi_clr_ctx(ctx) + SMFICTX *ctx; +{ + SM_ASSERT(ctx != NULL); + if (ValidSocket(ctx->ctx_sd)) + { + (void) closesocket(ctx->ctx_sd); + ctx->ctx_sd = INVALID_SOCKET; + } + if (ctx->ctx_reply != NULL) + { + free(ctx->ctx_reply); + ctx->ctx_reply = NULL; + } + if (ctx->ctx_privdata != NULL) + { + smi_log(SMI_LOG_WARN, + "%s: private data not NULL", + ctx->ctx_smfi->xxfi_name); + } + mi_clr_macros(ctx, 0); + mi_clr_symlist(ctx); + free(ctx); +} + /* ** ST_OPTIONNEG -- negotiate options ** @@ -771,8 +835,11 @@ static int st_optionneg(g) genarg *g; { - mi_int32 i, v, fake_pflags; + mi_int32 i, v, fake_pflags, internal_pflags; SMFICTX_PTR ctx; +#if _FFR_MILTER_CHECK + bool testmode = false; +#endif /* _FFR_MILTER_CHECK */ int (*fi_negotiate) __P((SMFICTX *, unsigned long, unsigned long, unsigned long, unsigned long, @@ -826,6 +893,7 @@ st_optionneg(g) v = SMFI_V1_ACTS; ctx->ctx_mta_aflags = v; /* MTA action flags */ + internal_pflags = 0; (void) memcpy((void *) &i, (void *) &(g->a_buf[MILTER_LEN_BYTES * 2]), MILTER_LEN_BYTES); v = ntohl(i); @@ -833,7 +901,51 @@ st_optionneg(g) /* no flags? set to default value for V1 protocol */ if (v == 0) v = SMFI_V1_PROT; - ctx->ctx_mta_pflags = v; /* MTA protocol flags */ +#if _FFR_MDS_NEGOTIATE + else if (ctx->ctx_smfi->xxfi_version >= SMFI_VERSION_MDS) + { + /* + ** Allow changing the size only if milter is compiled + ** against a version that supports this. + ** If a milter is dynamically linked against a newer + ** libmilter version, we don't want to "surprise" + ** it with a larger buffer as it may rely on it + ** even though it is not documented as a limit. + */ + + if (bitset(SMFIP_MDS_1M, v)) + { + internal_pflags |= SMFIP_MDS_1M; + (void) smfi_setmaxdatasize(MILTER_MDS_1M); + } + else if (bitset(SMFIP_MDS_256K, v)) + { + internal_pflags |= SMFIP_MDS_256K; + (void) smfi_setmaxdatasize(MILTER_MDS_256K); + } + } +# if 0 + /* don't log this for now... */ + else if (ctx->ctx_smfi->xxfi_version < SMFI_VERSION_MDS && + bitset(SMFIP_MDS_1M|SMFIP_MDS_256K, v)) + { + smi_log(SMI_LOG_WARN, + "%s: st_optionneg[%ld]: milter version=%X, trying flags=%X", + ctx->ctx_smfi->xxfi_name, + (long) ctx->ctx_id, ctx->ctx_smfi->xxfi_version, v); + } +# endif /* 0 */ +#endif /* _FFR_MDS_NEGOTIATE */ + + /* + ** MTA protocol flags. + ** We pass the internal flags to the milter as "read only", + ** i.e., a milter can read them so it knows which size + ** will be used, but any changes by a milter will be ignored + ** (see below, search for SMFI_INTERNAL). + */ + + ctx->ctx_mta_pflags = (v & ~SMFI_INTERNAL) | internal_pflags; /* ** Copy flags from milter struct into libmilter context; @@ -880,6 +992,12 @@ st_optionneg(g) 0, 0, &m_aflags, &m_pflags, &m_f2, &m_f3); +#if _FFR_MILTER_CHECK + testmode = bitset(SMFIP_TEST, m_pflags); + if (testmode) + m_pflags &= ~SMFIP_TEST; +#endif /* _FFR_MILTER_CHECK */ + /* ** Types of protocol flags (pflags): ** 1. do NOT send protocol step X @@ -1011,6 +1129,25 @@ st_optionneg(g) , ctx->ctx_mta_aflags, ctx->ctx_mta_pflags , ctx->ctx_aflags, ctx->ctx_pflags); +#if _FFR_MILTER_CHECK + if (ctx->ctx_dbg > 3) + sm_dprintf("[%ld] milter_negotiate:" + " testmode=%d, pflags2mta=%X, internal_pflags=%X\n" + , (long) ctx->ctx_id, testmode + , ctx->ctx_pflags2mta, internal_pflags); + + /* in test mode: take flags without further modifications */ + if (!testmode) + /* Warning: check statement below! */ +#endif /* _FFR_MILTER_CHECK */ + + /* + ** Remove the internal flags that might have been set by a milter + ** and set only those determined above. + */ + + ctx->ctx_pflags2mta = (ctx->ctx_pflags2mta & ~SMFI_INTERNAL) + | internal_pflags; return _SMFIS_OPTIONS; } diff --git a/contrib/sendmail/libmilter/example.c b/contrib/sendmail/libmilter/example.c index 5a09f1da9735..cef4b0f33aa2 100644 --- a/contrib/sendmail/libmilter/example.c +++ b/contrib/sendmail/libmilter/example.c @@ -6,7 +6,7 @@ * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. * - * $Id: example.c,v 8.3 2006/12/20 21:22:34 ca Exp $ + * $Id: example.c,v 8.4 2008/07/22 15:12:47 ca Exp $ */ /* @@ -252,7 +252,7 @@ struct smfiDesc smfilter = mlfi_close, /* connection cleanup */ mlfi_unknown, /* unknown/unimplemented SMTP commands */ mlfi_data, /* DATA command filter */ - mlfi_negotiate /* option negotation at connection startup */ + mlfi_negotiate /* option negotiation at connection startup */ }; int diff --git a/contrib/sendmail/libmilter/handler.c b/contrib/sendmail/libmilter/handler.c index 5fd4b2630a91..2c34f1f05dba 100644 --- a/contrib/sendmail/libmilter/handler.c +++ b/contrib/sendmail/libmilter/handler.c @@ -9,7 +9,7 @@ */ #include -SM_RCSID("@(#)$Id: handler.c,v 8.38 2006/11/02 02:38:22 ca Exp $") +SM_RCSID("@(#)$Id: handler.c,v 8.39 2008/11/25 01:14:16 ca Exp $") #include "libmilter.h" @@ -43,24 +43,7 @@ mi_handle_session(ctx) ret = MI_FAILURE; else ret = mi_engine(ctx); - if (ValidSocket(ctx->ctx_sd)) - { - (void) closesocket(ctx->ctx_sd); - ctx->ctx_sd = INVALID_SOCKET; - } - if (ctx->ctx_reply != NULL) - { - free(ctx->ctx_reply); - ctx->ctx_reply = NULL; - } - if (ctx->ctx_privdata != NULL) - { - smi_log(SMI_LOG_WARN, - "%s: private data not NULL", - ctx->ctx_smfi->xxfi_name); - } - mi_clr_macros(ctx, 0); - free(ctx); + mi_clr_ctx(ctx); ctx = NULL; return ret; } diff --git a/contrib/sendmail/libmilter/libmilter.h b/contrib/sendmail/libmilter/libmilter.h index 5a1240974924..5824151da37c 100644 --- a/contrib/sendmail/libmilter/libmilter.h +++ b/contrib/sendmail/libmilter/libmilter.h @@ -19,7 +19,7 @@ #ifdef _DEFINE # define EXTERN # define INIT(x) = x -SM_IDSTR(MilterlId, "@(#)$Id: libmilter.h,v 8.74 2006/12/19 18:19:52 ca Exp $") +SM_IDSTR(MilterlId, "@(#)$Id: libmilter.h,v 8.77 2008/11/25 18:28:18 ca Exp $") #else /* _DEFINE */ # define EXTERN extern # define INIT(x) @@ -282,6 +282,7 @@ extern int mi_handle_session __P((SMFICTX_PTR)); extern int mi_engine __P((SMFICTX_PTR)); extern int mi_listener __P((char *, int, smfiDesc_ptr, time_t, int)); extern void mi_clr_macros __P((SMFICTX_PTR, int)); +extern void mi_clr_ctx __P((SMFICTX_PTR)); extern int mi_stop __P((void)); extern int mi_control_startup __P((char *)); extern void mi_stop_milters __P((int)); diff --git a/contrib/sendmail/libmilter/listener.c b/contrib/sendmail/libmilter/listener.c index 6e68ae55d4a1..48c552fddd4d 100644 --- a/contrib/sendmail/libmilter/listener.c +++ b/contrib/sendmail/libmilter/listener.c @@ -9,7 +9,7 @@ */ #include -SM_RCSID("@(#)$Id: listener.c,v 8.124 2007/04/23 22:22:50 ca Exp $") +SM_RCSID("@(#)$Id: listener.c,v 8.126 2009/12/16 16:40:23 ca Exp $") /* ** listener.c -- threaded network listener @@ -777,8 +777,9 @@ mi_listener(conn, dbg, smfi, timeout, backlog) continue; scnt++; smi_log(SMI_LOG_ERR, - "%s: select() failed (%s), %s", - smfi->xxfi_name, sm_errstring(save_errno), + "%s: %s() failed (%s), %s", + smfi->xxfi_name, MI_POLLSELECT, + sm_errstring(save_errno), scnt >= MAX_FAILS_S ? "abort" : "try again"); MI_SLEEP(scnt); if (scnt >= MAX_FAILS_S) diff --git a/contrib/sendmail/libmilter/main.c b/contrib/sendmail/libmilter/main.c index 2da9a824a666..d6e727959dcc 100644 --- a/contrib/sendmail/libmilter/main.c +++ b/contrib/sendmail/libmilter/main.c @@ -9,7 +9,7 @@ */ #include -SM_RCSID("@(#)$Id: main.c,v 8.83 2007/04/23 22:22:50 ca Exp $") +SM_RCSID("@(#)$Id: main.c,v 8.84 2008/09/02 05:37:06 ca Exp $") #define _DEFINE 1 #include "libmilter.h" diff --git a/contrib/sendmail/libmilter/worker.c b/contrib/sendmail/libmilter/worker.c index fd4b66ec741d..28d404fa3a21 100644 --- a/contrib/sendmail/libmilter/worker.c +++ b/contrib/sendmail/libmilter/worker.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003-2004, 2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 2003-2004, 2007, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -11,7 +11,7 @@ */ #include -SM_RCSID("@(#)$Id: worker.c,v 8.10 2007/12/03 22:06:05 ca Exp $") +SM_RCSID("@(#)$Id: worker.c,v 8.17 2009/06/15 15:34:54 ca Exp $") #include "libmilter.h" @@ -210,23 +210,7 @@ mi_close_session(ctx) SM_ASSERT(ctx != NULL); (void) mi_list_del_ctx(ctx); - if (ValidSocket(ctx->ctx_sd)) - { - (void) closesocket(ctx->ctx_sd); - ctx->ctx_sd = INVALID_SOCKET; - } - if (ctx->ctx_reply != NULL) - { - free(ctx->ctx_reply); - ctx->ctx_reply = NULL; - } - if (ctx->ctx_privdata != NULL) - { - smi_log(SMI_LOG_WARN, "%s: private data not NULL", - ctx->ctx_smfi->xxfi_name); - } - mi_clr_macros(ctx, 0); - free(ctx); + mi_clr_ctx(ctx); return MI_SUCCESS; } @@ -259,7 +243,7 @@ mi_pool_controller_init() if (pipe(Tskmgr.tm_p) != 0) { smi_log(SMI_LOG_ERR, "can't create event pipe: %s", - sm_errstring(r)); + sm_errstring(errno)); return MI_FAILURE; } @@ -328,6 +312,7 @@ mi_pool_controller(arg) int dim_pfd = 0; bool rebuild_set = true; int pcnt = 0; /* error count for poll() failures */ + time_t lastcheck; Tskmgr.tm_tid = sthread_get_id(); if (pthread_detach(Tskmgr.tm_tid) != 0) @@ -345,12 +330,12 @@ mi_pool_controller(arg) } dim_pfd = PFD_STEP; + lastcheck = time(NULL); for (;;) { SMFICTX_PTR ctx; int nfd, rfd, i; time_t now; - time_t lastcheck; POOL_LEV_DPRINTF(4, ("Let's %s again...", WAITFN)); @@ -364,20 +349,20 @@ mi_pool_controller(arg) /* check for timed out sessions? */ if (lastcheck + DT_CHECK_OLD_SESSIONS < now) { - SM_TAILQ_FOREACH(ctx, &WRK_CTX_HEAD, ctx_link) + ctx = SM_TAILQ_FIRST(&WRK_CTX_HEAD); + while (ctx != SM_TAILQ_END(&WRK_CTX_HEAD)) { + SMFICTX_PTR ctx_nxt; + + ctx_nxt = SM_TAILQ_NEXT(ctx, ctx_link); if (ctx->ctx_wstate == WKST_WAITING) { if (ctx->ctx_wait == 0) - { ctx->ctx_wait = now; - continue; - } - - /* if session timed out, close it */ - if (ctx->ctx_wait + OLD_SESSION_TIMEOUT - < now) + else if (ctx->ctx_wait + OLD_SESSION_TIMEOUT + < now) { + /* if session timed out, close it */ sfsistat (*fi_close) __P((SMFICTX *)); POOL_LEV_DPRINTF(4, @@ -389,10 +374,9 @@ mi_pool_controller(arg) (void) (*fi_close)(ctx); mi_close_session(ctx); - ctx = SM_TAILQ_FIRST(&WRK_CTX_HEAD); - continue; } } + ctx = ctx_nxt; } lastcheck = now; } @@ -465,6 +449,7 @@ mi_pool_controller(arg) } } } + rebuild_set = false; } TASKMGR_UNLOCK(); diff --git a/contrib/sendmail/libsm/debug.c b/contrib/sendmail/libsm/debug.c index f9281fd5e710..ea9cd846ace5 100644 --- a/contrib/sendmail/libsm/debug.c +++ b/contrib/sendmail/libsm/debug.c @@ -8,7 +8,7 @@ */ #include -SM_RCSID("@(#)$Id: debug.c,v 1.30 2004/08/03 20:10:26 ca Exp $") +SM_RCSID("@(#)$Id: debug.c,v 1.32 2009/09/20 05:38:46 ca Exp $") /* ** libsm debugging and tracing @@ -17,6 +17,10 @@ SM_RCSID("@(#)$Id: debug.c,v 1.30 2004/08/03 20:10:26 ca Exp $") #include #include +#if _FFR_DEBUG_PID_TIME +#include +#include +#endif /* _FFR_DEBUG_PID_TIME */ #include #include #include @@ -112,6 +116,11 @@ sm_debug_close() ** none. */ +#if _FFR_DEBUG_PID_TIME +SM_DEBUG_T SmDBGPidTime = SM_DEBUG_INITIALIZER("sm_trace_pid_time", + "@(#)$Debug: sm_trace_pid_time - print pid and time in debug $"); +#endif /* _FFR_DEBUG_PID_TIME */ + void #if SM_VA_STD sm_dprintf(char *fmt, ...) @@ -125,6 +134,26 @@ sm_dprintf(fmt, va_alist) if (SmDebugOutput == NULL) return; +#if _FFR_DEBUG_PID_TIME + /* note: this is ugly if the output isn't a full line! */ + if (sm_debug_active(&SmDBGPidTime, 1)) + { + static char str[32] = "[1900-00-00/00:00:00] "; + struct tm *tmp; + time_t currt; + + currt = time((time_t *)0); + tmp = localtime(&currt); + snprintf(str, sizeof(str), "[%d-%02d-%02d/%02d:%02d:%02d] ", + 1900 + tmp->tm_year, /* HACK */ + tmp->tm_mon + 1, + tmp->tm_mday, + tmp->tm_hour, tmp->tm_min, tmp->tm_sec); + sm_io_fprintf(SmDebugOutput, SmDebugOutput->f_timeout, + "%ld: %s ", (long) getpid(), str); + } +#endif /* _FFR_DEBUG_PID_TIME */ + SM_VA_START(ap, fmt); sm_io_vfprintf(SmDebugOutput, SmDebugOutput->f_timeout, fmt, ap); SM_VA_END(ap); diff --git a/contrib/sendmail/libsm/ldap.c b/contrib/sendmail/libsm/ldap.c index 252e5475378d..7ee57fcbb689 100644 --- a/contrib/sendmail/libsm/ldap.c +++ b/contrib/sendmail/libsm/ldap.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 2001-2009 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -11,7 +11,7 @@ #define LDAP_DEPRECATED 1 #include -SM_RCSID("@(#)$Id: ldap.c,v 1.80 2007/10/12 00:19:44 ca Exp $") +SM_RCSID("@(#)$Id: ldap.c,v 1.83 2009/06/19 22:02:26 guenther Exp $") #if LDAPMAP # include @@ -1099,7 +1099,21 @@ sm_ldap_results(lmap, msgid, flags, delim, rpool, result, if (ret == 0) save_errno = ETIMEDOUT; else - save_errno = sm_ldap_geterrno(lmap->ldap_ld); + { + int rc; + + /* + ** We may have gotten an LDAP_RES_SEARCH_RESULT response + ** with an error inside it, so we have to extract that + ** with ldap_parse_result(). This can happen when talking + ** to an LDAP proxy whose backend has gone down. + */ + + save_errno = ldap_parse_result(lmap->ldap_ld, lmap->ldap_res, + &rc, NULL, NULL, NULL, NULL, 0); + if (save_errno == LDAP_SUCCESS) + save_errno = rc; + } if (save_errno != LDAP_SUCCESS) { statp = EX_TEMPFAIL; @@ -1370,9 +1384,16 @@ sm_ldap_setopts(ld, lmap) ldap_set_option(ld, LDAP_OPT_REFERRALS, LDAP_OPT_OFF); ldap_set_option(ld, LDAP_OPT_SIZELIMIT, &lmap->ldap_sizelimit); ldap_set_option(ld, LDAP_OPT_TIMELIMIT, &lmap->ldap_timelimit); -# if _FFR_LDAP_NETWORK_TIMEOUT && defined(LDAP_OPT_NETWORK_TIMEOUT) - ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT, &lmap->ldap_networktmo); -# endif /* _FFR_LDAP_NETWORK_TIMEOUT && defined(LDAP_OPT_NETWORK_TIMEOUT) */ +# if _FFR_LDAP_NETWORK_TIMEOUT && defined(LDAP_OPT_NETWORK_TIMEOUT) + if (lmap->ldap_networktmo > 0) + { + struct timeval tmo; + + tmo.tv_sec = lmap->ldap_networktmo; + tmo.tv_usec = 0; + ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT, &tmo); + } +# endif /* _FFR_LDAP_NETWORK_TIMEOUT && defined(LDAP_OPT_NETWORK_TIMEOUT) */ # ifdef LDAP_OPT_RESTART ldap_set_option(ld, LDAP_OPT_RESTART, LDAP_OPT_ON); # endif /* LDAP_OPT_RESTART */ diff --git a/contrib/sendmail/libsm/mbdb.c b/contrib/sendmail/libsm/mbdb.c index ad0e7ccbd13f..3bb514df5164 100644 --- a/contrib/sendmail/libsm/mbdb.c +++ b/contrib/sendmail/libsm/mbdb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001-2002 Sendmail, Inc. and its suppliers. + * Copyright (c) 2001-2003,2009 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -8,7 +8,7 @@ */ #include -SM_RCSID("@(#)$Id: mbdb.c,v 1.40 2003/12/10 03:19:07 gshapiro Exp $") +SM_RCSID("@(#)$Id: mbdb.c,v 1.41 2009/06/19 22:02:26 guenther Exp $") #include @@ -564,7 +564,20 @@ mbdb_ldap_lookup(name, user) entry = ldap_first_entry(LDAPLMAP.ldap_ld, LDAPLMAP.ldap_res); if (entry == NULL) { - save_errno = sm_ldap_geterrno(LDAPLMAP.ldap_ld); + int rc; + + /* + ** We may have gotten an LDAP_RES_SEARCH_RESULT response + ** with an error inside it, so we have to extract that + ** with ldap_parse_result(). This can happen when talking + ** to an LDAP proxy whose backend has gone down. + */ + + save_errno = ldap_parse_result(LDAPLMAP.ldap_ld, + LDAPLMAP.ldap_res, &rc, NULL, + NULL, NULL, NULL, 0); + if (save_errno == LDAP_SUCCESS) + save_errno = rc; if (save_errno == LDAP_SUCCESS) { errno = ENOENT; diff --git a/contrib/sendmail/libsm/sem.c b/contrib/sendmail/libsm/sem.c index 89394cbee4dd..83a54e32e1e0 100644 --- a/contrib/sendmail/libsm/sem.c +++ b/contrib/sendmail/libsm/sem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001, 2005 Sendmail, Inc. and its suppliers. + * Copyright (c) 2000-2001, 2005, 2008 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -8,11 +8,12 @@ */ #include -SM_RCSID("@(#)$Id: sem.c,v 1.13 2005/08/12 20:39:59 ca Exp $") +SM_RCSID("@(#)$Id: sem.c,v 1.14 2008/05/30 16:26:38 ca Exp $") #if SM_CONF_SEM # include # include +# include # include # include # include @@ -200,4 +201,45 @@ sm_sem_get(semid, semnum) return -1; return semval; } + +/* +** SM_SEMSETOWNER -- set owner/group/mode of semaphores. +** +** Parameters: +** semid -- id for semaphores. +** uid -- uid to use +** gid -- gid to use +** mode -- mode to use +** +** Returns: +** 0 on success. +** < 0 on failure. +*/ + +int +sm_semsetowner(semid, uid, gid, mode) + int semid; + uid_t uid; + gid_t gid; + mode_t mode; +{ + int r; + struct semid_ds semidds; + union semun { + int val; + struct semid_ds *buf; + ushort *array; + } arg; + + memset(&semidds, 0, sizeof(semidds)); + arg.buf = &semidds; + if ((r = semctl(semid, 1, IPC_STAT, arg)) < 0) + return r; + semidds.sem_perm.uid = uid; + semidds.sem_perm.gid = gid; + semidds.sem_perm.mode = mode; + if ((r = semctl(semid, 1, IPC_SET, arg)) < 0) + return r; + return 0; +} #endif /* SM_CONF_SEM */ diff --git a/contrib/sendmail/libsm/t-sem.c b/contrib/sendmail/libsm/t-sem.c index 24d056365fab..662b4f6d43cd 100644 --- a/contrib/sendmail/libsm/t-sem.c +++ b/contrib/sendmail/libsm/t-sem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2001, 2005-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 2000-2001, 2005-2008 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -8,7 +8,7 @@ */ #include -SM_RCSID("@(#)$Id: t-sem.c,v 1.16 2007/03/21 23:22:10 ca Exp $") +SM_RCSID("@(#)$Id: t-sem.c,v 1.17 2008/05/30 16:26:38 ca Exp $") #include @@ -127,6 +127,20 @@ sem_cleanup(sig) exit(EX_UNAVAILABLE); } +static int +drop_priv(uid, gid) + uid_t uid; + gid_t gid; +{ + int r; + + r = setgid(gid); + if (r != 0) + return r; + r = setuid(uid); + return r; +} + /* ** SEMTEST -- test of semaphores ** @@ -141,12 +155,23 @@ sem_cleanup(sig) # define MAX_CNT 10 static int -semtest(owner) +semtest(owner, uid, gid) int owner; + uid_t uid; + gid_t gid; { int semid, r; int cnt = 0; + if (!owner && uid != 0) + { + r = drop_priv(uid, gid); + if (r < 0) + { + perror("drop_priv child failed"); + return -1; + } + } semid = sm_sem_start(T_SM_SEM_KEY, 1, 0, owner); if (semid < 0) { @@ -156,6 +181,22 @@ semtest(owner) if (owner) { + if (uid != 0) + { + r = sm_semsetowner(semid, uid, gid, 0660); + if (r < 0) + { + perror("sm_semsetowner failed"); + return -1; + } + r = drop_priv(uid, gid); + if (r < 0) + { + perror("drop_priv owner failed"); + return -1; + } + } + /* just in case someone kills the program... */ semid_c = semid; (void) sm_signal(SIGHUP, sem_cleanup); @@ -281,18 +322,31 @@ main(argc, argv) { bool interactive = false; bool owner = false; - int ch; - int r = 0; + int ch, r; + uid_t uid; + gid_t gid; -# define OPTIONS "io" + uid = 0; + gid = 0; + r = 0; + +# define OPTIONS "iog:u:" while ((ch = getopt(argc, argv, OPTIONS)) != -1) { switch ((char) ch) { + case 'g': + gid = (gid_t)strtoul(optarg, 0, 0); + break; + case 'i': interactive = true; break; + case 'u': + uid = (uid_t)strtoul(optarg, 0, 0); + break; + case 'o': owner = true; break; @@ -323,11 +377,11 @@ main(argc, argv) { /* give the parent the chance to setup data */ sleep(1); - r = semtest(false); + r = semtest(false, uid, gid); } else { - r = semtest(true); + r = semtest(true, uid, gid); } SM_TEST(r == 0); return sm_test_end(); diff --git a/contrib/sendmail/libsmdb/smdb1.c b/contrib/sendmail/libsmdb/smdb1.c index e45de7c7f8f8..842d4b2ecab7 100644 --- a/contrib/sendmail/libsmdb/smdb1.c +++ b/contrib/sendmail/libsmdb/smdb1.c @@ -1,5 +1,5 @@ /* -** Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers. +** Copyright (c) 1999-2002, 2004, 2009 Sendmail, Inc. and its suppliers. ** All rights reserved. ** ** By using this file, you agree to the terms and conditions set @@ -8,7 +8,7 @@ */ #include -SM_RCSID("@(#)$Id: smdb1.c,v 8.59 2004/08/03 20:58:39 ca Exp $") +SM_RCSID("@(#)$Id: smdb1.c,v 8.62 2009/11/12 23:04:18 ca Exp $") #include #include @@ -397,15 +397,19 @@ smdb1_cursor(database, cursor, flags) if (db1->smdb1_cursor_in_use) return SMDBE_ONLY_SUPPORTS_ONE_CURSOR; - db1->smdb1_cursor_in_use = true; db1_cursor = (SMDB_DB1_CURSOR *) malloc(sizeof(SMDB_DB1_CURSOR)); - db1_cursor->db = db1; - - cur = (SMDB_CURSOR *) malloc(sizeof(SMDB_CURSOR)); - - if (cur == NULL) + if (db1_cursor == NULL) return SMDBE_MALLOC; + cur = (SMDB_CURSOR *) malloc(sizeof(SMDB_CURSOR)); + if (cur == NULL) + { + free(db1_cursor); + return SMDBE_MALLOC; + } + + db1->smdb1_cursor_in_use = true; + db1_cursor->db = db1; cur->smdbc_impl = db1_cursor; cur->smdbc_close = smdb1_cursor_close; cur->smdbc_del = smdb1_cursor_del; @@ -502,7 +506,12 @@ smdb_db_open(database, db_name, mode, mode_mask, sff, type, user_info, smdb_db = smdb_malloc_database(); db1 = smdb1_malloc_database(); if (smdb_db == NULL || db1 == NULL) + { + (void) smdb_unlock_file(lock_fd); + smdb_free_database(smdb_db); + free(db1); return SMDBE_MALLOC; + } db1->smdb1_lock_fd = lock_fd; params = NULL; diff --git a/contrib/sendmail/libsmdb/smdb2.c b/contrib/sendmail/libsmdb/smdb2.c index be07d636b47f..15806619ee58 100644 --- a/contrib/sendmail/libsmdb/smdb2.c +++ b/contrib/sendmail/libsmdb/smdb2.c @@ -1,5 +1,5 @@ /* -** Copyright (c) 1999-2003 Sendmail, Inc. and its suppliers. +** Copyright (c) 1999-2003, 2009 Sendmail, Inc. and its suppliers. ** All rights reserved. ** ** By using this file, you agree to the terms and conditions set @@ -8,7 +8,7 @@ */ #include -SM_RCSID("@(#)$Id: smdb2.c,v 8.79 2003/06/13 21:33:11 ca Exp $") +SM_RCSID("@(#)$Id: smdb2.c,v 8.80 2009/11/12 23:07:49 ca Exp $") #include #include @@ -620,12 +620,13 @@ smdb_db_open(database, db_name, mode, mode_mask, sff, type, user_info, db_params } smdb_db = smdb_malloc_database(); - if (smdb_db == NULL) - return SMDBE_MALLOC; - db2 = smdb2_malloc_database(); - if (db2 == NULL) + if (db2 == NULL || smdb_db == NULL) + { + smdb_unlock_file(lock_fd); + smdb_free_database(smdb_db); /* ok to be NULL */ return SMDBE_MALLOC; + } db2->smdb2_lock_fd = lock_fd; diff --git a/contrib/sendmail/libsmutil/safefile.c b/contrib/sendmail/libsmutil/safefile.c index 8488534280e3..f299e1053556 100644 --- a/contrib/sendmail/libsmutil/safefile.c +++ b/contrib/sendmail/libsmutil/safefile.c @@ -15,7 +15,7 @@ #include #include -SM_RCSID("@(#)$Id: safefile.c,v 8.128 2004/09/30 18:15:49 ca Exp $") +SM_RCSID("@(#)$Id: safefile.c,v 8.129 2008/08/04 18:07:04 gshapiro Exp $") /* @@ -699,7 +699,6 @@ safeopen(fn, omode, cmode, sff) if (bitset(O_CREAT, omode)) sff |= SFF_CREAT; omode &= ~O_CREAT; - smode = 0; switch (omode & O_ACCMODE) { case O_RDONLY: diff --git a/contrib/sendmail/praliases/praliases.8 b/contrib/sendmail/praliases/praliases.8 index 2c78cacff533..1f11014f41c6 100644 --- a/contrib/sendmail/praliases/praliases.8 +++ b/contrib/sendmail/praliases/praliases.8 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers. +.\" Copyright (c) 1998-2000, 2008 Sendmail, Inc. and its suppliers. .\" All rights reserved. .\" .\" By using this file, you agree to the terms and conditions set @@ -6,9 +6,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: praliases.8,v 8.17 2000/12/15 19:53:45 gshapiro Exp $ +.\" $Id: praliases.8,v 8.19 2008/07/10 20:13:10 ca Exp $ .\" -.TH PRALIASES 8 "$Date: 2000/12/15 19:53:45 $" +.TH PRALIASES 8 "$Date: 2008/07/10 20:13:10 $" .SH NAME praliases \- display system mail aliases @@ -30,12 +30,12 @@ The special internal @:@ alias will be displayed if present. .PP The options are as follows: .TP -.B \-C +.BI "\-C " file Read the specified sendmail configuration file instead of the default .B sendmail configuration file. .TP -.B \-f +.BI "\-f " file Read the specified file instead of the configured .B sendmail system aliases file(s). diff --git a/contrib/sendmail/praliases/praliases.c b/contrib/sendmail/praliases/praliases.c index 984981ff77a9..d0ee54e37a07 100644 --- a/contrib/sendmail/praliases/praliases.c +++ b/contrib/sendmail/praliases/praliases.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2001, 2008 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -20,7 +20,7 @@ SM_IDSTR(copyright, Copyright (c) 1988, 1993\n\ The Regents of the University of California. All rights reserved.\n") -SM_IDSTR(id, "@(#)$Id: praliases.c,v 8.94 2007/05/11 18:50:36 ca Exp $") +SM_IDSTR(id, "@(#)$Id: praliases.c,v 8.96 2008/07/10 20:13:10 ca Exp $") #include #include @@ -99,7 +99,8 @@ main(argc, argv) case '?': default: (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, - "usage: praliases [-C cffile] [-f aliasfile]\n"); + "usage: praliases [-C cffile] [-f aliasfile]" + " [key ...]\n"); exit(EX_USAGE); } } diff --git a/contrib/sendmail/src/Makefile.m4 b/contrib/sendmail/src/Makefile.m4 index fd015b4937a3..0fa337467d49 100644 --- a/contrib/sendmail/src/Makefile.m4 +++ b/contrib/sendmail/src/Makefile.m4 @@ -1,4 +1,4 @@ -dnl $Id: Makefile.m4,v 8.115 2008/03/27 16:13:33 ca Exp $ +dnl $Id: Makefile.m4,v 8.121 2009/12/15 22:39:23 ca Exp $ include(confBUILDTOOLSDIR`/M4/switch.m4') define(`confREQUIRE_LIBSM', `true') diff --git a/contrib/sendmail/src/README b/contrib/sendmail/src/README index 34313fc8506c..9c4628ffede4 100644 --- a/contrib/sendmail/src/README +++ b/contrib/sendmail/src/README @@ -9,7 +9,7 @@ # the sendmail distribution. # # -# $Id: README,v 8.391 2008/02/12 16:38:21 ca Exp $ +# $Id: README,v 8.392 2009/04/10 17:49:19 gshapiro Exp $ # This directory contains the source files for sendmail(TM). @@ -32,6 +32,7 @@ For detailed instructions, please read the document ../doc/op/op.me: cd ../doc/op ; make op.ps op.txt Sendmail is a trademark of Sendmail, Inc. +US Patent Numbers 6865671, 6986037. +-------------------+ @@ -1847,4 +1848,4 @@ util.c Some general purpose routines used by sendmail. version.c The version number and information about this version of sendmail. -(Version $Revision: 8.391 $, last update $Date: 2008/02/12 16:38:21 $ ) +(Version $Revision: 8.392 $, last update $Date: 2009/04/10 17:49:19 $ ) diff --git a/contrib/sendmail/src/TRACEFLAGS b/contrib/sendmail/src/TRACEFLAGS index a6249fd2c477..6fdfdd97df1d 100644 --- a/contrib/sendmail/src/TRACEFLAGS +++ b/contrib/sendmail/src/TRACEFLAGS @@ -1,4 +1,4 @@ -# $Id: TRACEFLAGS,v 8.47 2006/09/11 22:36:32 ca Exp $ +# $Id: TRACEFLAGS,v 8.48 2008/11/03 21:09:26 gshapiro Exp $ 0, 4 main.c main canonical name, UUCP node name, a.k.a.s 0, 15 main.c main print configuration 0, 44 util.c printav print address of each string @@ -86,6 +86,7 @@ 70 queue.c quarantining 71,>99 milter.c quarantine on errors 73 queue.c shared memory updates +74,>99 map.c LDAP map defer 80 content length 81 sun remote mode 83 collect.c timeout diff --git a/contrib/sendmail/src/collect.c b/contrib/sendmail/src/collect.c index 0a2cdaba83eb..f5d72477c510 100644 --- a/contrib/sendmail/src/collect.c +++ b/contrib/sendmail/src/collect.c @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: collect.c,v 8.282 2008/01/31 18:48:29 ca Exp $") +SM_RCSID("@(#)$Id: collect.c,v 8.284 2008/08/06 05:26:24 ca Exp $") static void eatfrom __P((char *volatile, ENVELOPE *)); static void collect_doheader __P((ENVELOPE *)); @@ -847,6 +847,9 @@ readerr: } /* Log collection information. */ + if (tTd(92, 2)) + sm_dprintf("collect: e_id=%s, EF_LOGSENDER=%d, LogLevel=%d\n", + e->e_id, bitset(EF_LOGSENDER, e->e_flags), LogLevel); if (bitset(EF_LOGSENDER, e->e_flags) && LogLevel > 4) { logsender(e, e->e_msgid); diff --git a/contrib/sendmail/src/conf.c b/contrib/sendmail/src/conf.c index bf9705712c44..8d8f9ed6b147 100644 --- a/contrib/sendmail/src/conf.c +++ b/contrib/sendmail/src/conf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2008 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: conf.c,v 8.1141 2008/04/14 02:09:35 ca Exp $") +SM_RCSID("@(#)$Id: conf.c,v 8.1153 2009/12/18 17:25:12 ca Exp $") #include #include @@ -392,6 +392,9 @@ setdefaults(e) #if REQUIRES_DIR_FSYNC RequiresDirfsync = true; #endif /* REQUIRES_DIR_FSYNC */ +#if _FFR_RCPTTHROTDELAY + BadRcptThrottleDelay = 1; +#endif /* _FFR_RCPTTHROTDELAY */ ConnectionRateWindowSize = 60; setupmaps(); setupqueues(); @@ -782,7 +785,7 @@ inithostmaps() else if (strcmp(maptype[i], "ldap") == 0 && stab("aliases.ldap", ST_MAP, ST_FIND) == NULL) { - (void) strlcpy(buf, "aliases.ldap ldap -b . -h localhost -k mail=%0 -v mailgroup", + (void) sm_strlcpy(buf, "aliases.ldap ldap -b . -h localhost -k mail=%0 -v mailgroup", sizeof buf); (void) makemapentry(buf); } @@ -968,7 +971,10 @@ switch_map_find(service, maptype, mapreturn) p = strpbrk(buf, "#\n"); if (p != NULL) *p = '\0'; - p = strpbrk(buf, " \t"); +#ifndef SM_NSSWITCH_DELIMS +# define SM_NSSWITCH_DELIMS " \t" +#endif /* SM_NSSWITCH_DELIMS */ + p = strpbrk(buf, SM_NSSWITCH_DELIMS); if (p != NULL) *p++ = '\0'; if (buf[0] == '\0') @@ -981,7 +987,7 @@ switch_map_find(service, maptype, mapreturn) buf); continue; } - while (isspace(*p)) + while (isascii(*p) && isspace(*p)) p++; if (*p == '\0') continue; @@ -1007,7 +1013,7 @@ switch_map_find(service, maptype, mapreturn) if (p == NULL) break; *p++ = '\0'; - while (isspace(*p)) + while (isascii(*p) && isspace(*p)) p++; } if (svcno < MAXMAPSTACK) @@ -2282,7 +2288,8 @@ refuseconnections(e, dn, active) # define MIN_DELAY_LOG 90 /* wait before logging this again */ # define D_MSG_LA "delaying connections on daemon %s: load average=%d >= %d" /* sleep to flatten out connection load */ - sm_setproctitle(true, e, D_MSG_LA, Daemons[dn].d_name, limit); + sm_setproctitle(true, e, D_MSG_LA, Daemons[dn].d_name, + CurrentLA, limit); if (LogLevel > 8 && (now = curtime()) > log_delay) { sm_syslog(LOG_INFO, NOQID, D_MSG_LA, @@ -3374,6 +3381,10 @@ enoughdiskspace(msize, e) { int i; +#if _FFR_TESTS + if (tTd(4, 101)) + return false; +#endif /* _FFR_TESTS */ if (MinBlocksFree <= 0 && msize <= 0) { if (tTd(4, 80)) @@ -4074,7 +4085,7 @@ strtol(nptr, endptr, base) */ do { c = *s++; - } while (isspace(c)); + } while (isascii(c) && isspace(c)); if (c == '-') { neg = 1; c = *s++; @@ -4110,9 +4121,9 @@ strtol(nptr, endptr, base) cutlim = cutoff % (unsigned long) base; cutoff /= (unsigned long) base; for (acc = 0, any = 0;; c = *s++) { - if (isdigit(c)) + if (isascii(c) && isdigit(c)) c -= '0'; - else if (isalpha(c)) + else if (isascii(c) && isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; @@ -6043,6 +6054,10 @@ char *FFRCompileOptions[] = /* Deal with MTAs that send a reply during the DATA phase. */ "_FFR_CATCH_BROKEN_MTAS", #endif /* _FFR_CATCH_BROKEN_MTAS */ +#if _FFR_CHECKCONFIG + /* New OpMode to check the configuration file */ + "_FFR_CHECKCONFIG", +#endif /* _FFR_CHECKCONFIG */ #if _FFR_CHK_QUEUE /* Stricter checks about queue directory permissions. */ "_FFR_CHK_QUEUE", @@ -6117,6 +6132,10 @@ char *FFRCompileOptions[] = /* EightBitAddrOK: allow 8-bit e-mail addresses */ "_FFR_EIGHT_BIT_ADDR_OK", #endif /* _FFR_EIGHT_BIT_ADDR_OK */ +#if _FFR_EXPDELAY + /* exponential queue delay */ + "_FFR_EXPDELAY", +#endif /* _FFR_EXPDELAY */ #if _FFR_EXTRA_MAP_CHECK /* perform extra checks on $( $) in R lines */ "_FFR_EXTRA_MAP_CHECK", @@ -6175,10 +6194,17 @@ char *FFRCompileOptions[] = /* Ignore extensions offered in response to HELO */ "_FFR_IGNORE_EXT_ON_HELO", #endif /* _FFR_IGNORE_EXT_ON_HELO */ +#if _FFR_LINUX_MHNL + /* Set MAXHOSTNAMELEN to 256 (Linux) */ + "_FFR_LINUX_MHNL", +#endif /* _FFR_LINUX_MHNL */ #if _FFR_LOCAL_DAEMON /* Local daemon mode (-bl) which only accepts loopback connections */ "_FFR_LOCAL_DAEMON", #endif /* _FFR_LOCAL_DAEMON */ +#if _FFR_MAIL_MACRO + "_FFR_MAIL_MACRO", +#endif /* _FFR_MAIL_MACRO */ #if _FFR_MAXDATASIZE /* ** It is possible that a header is larger than MILTER_CHUNK_SIZE, @@ -6199,6 +6225,10 @@ char *FFRCompileOptions[] = /* Limit sleep(2) time in libsm/clock.c */ "_FFR_MAX_SLEEP_TIME", #endif /* _FFR_MAX_SLEEP_TIME */ +#if _FFR_MDS_NEGOTIATE + /* MaxDataSize negotation with libmilter */ + "_FFR_MDS_NEGOTIATE", +#endif /* _FFR_MDS_NEGOTIATE */ #if _FFR_MEMSTAT /* Check free memory */ "_FFR_MEMSTAT", @@ -6232,6 +6262,10 @@ char *FFRCompileOptions[] = "_FFR_MILTER_CHECK_REJECTIONS_TOO", #endif /* _FFR_MILTER_CHECK_REJECTIONS_TOO */ +#if _FFR_MILTER_ENHSC + /* extract enhanced status code from milter replies for dsn= logging */ + "_FFR_MILTER_ENHSC", +#endif /* _FFR_MILTER_ENHSC */ #if _FFR_MIME7TO8_OLD /* Old mime7to8 code, the new is broken for at least one example. */ "_FFR_MIME7TO8_OLD", @@ -6285,6 +6319,10 @@ char *FFRCompileOptions[] = /* Debug output for the queue scheduler. */ "_FFR_QUEUE_SCHED_DBG", #endif /* _FFR_QUEUE_SCHED_DBG */ +#if _FFR_RCPTTHROTDELAY + /* configurable delay for BadRcptThrottle */ + "_FFR_RCPTTHROTDELAY" +#endif /* _FFR_RCPTTHROTDELAY */ #if _FFR_REDIRECTEMPTY /* ** envelope <> can't be sent to mailing lists, only owner- @@ -6361,6 +6399,10 @@ char *FFRCompileOptions[] = /* SuperSafe per DaemonPortOptions: 'T' (better letter?) */ "_FFR_SS_PER_DAEMON", #endif /* _FFR_SS_PER_DAEMON */ +#if _FFR_TESTS + /* enable some test code */ + "_FFR_TESTS", +#endif /* _FFR_TESTS */ #if _FFR_TIMERS /* Donated code (unused). */ "_FFR_TIMERS", diff --git a/contrib/sendmail/src/conf.h b/contrib/sendmail/src/conf.h index f1386c4b61f6..dff37ff99fee 100644 --- a/contrib/sendmail/src/conf.h +++ b/contrib/sendmail/src/conf.h @@ -10,7 +10,7 @@ * the sendmail distribution. * * - * $Id: conf.h,v 8.574 2006/11/29 00:36:06 ca Exp $ + * $Id: conf.h,v 8.575 2009/03/25 20:04:00 ca Exp $ */ /* @@ -123,9 +123,18 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */ #define DATA_PROGRESS_TIMEOUT 300 /* how often to check DATA progress */ #define ENHSCLEN 10 /* max len of enhanced status code */ #define DEFAULT_MAX_RCPT 100 /* max number of RCPTs per envelope */ -#define MAXQUEUEGROUPS 50 /* max # of queue groups */ +#ifndef MAXQUEUEGROUPS +# define MAXQUEUEGROUPS 50 /* max # of queue groups */ /* must be less than BITMAPBITS for DoQueueRun */ -#define MAXWORKGROUPS 50 /* max # of work groups */ +#endif /* MAXQUEUEGROUPS */ +#if MAXQUEUEGROUPS >= BITMAPBITS + ERROR _MAXQUEUEGROUPS must be less than _BITMAPBITS +#endif /* MAXQUEUEGROUPS >= BITMAPBITS */ + +#ifndef MAXWORKGROUPS +# define MAXWORKGROUPS 50 /* max # of work groups */ +#endif /* MAXWORKGROUPS */ + #define MAXFILESYS BITMAPBITS /* max # of queue file systems * must be <= BITMAPBITS */ #ifndef FILESYS_UPDATE_INTERVAL diff --git a/contrib/sendmail/src/daemon.c b/contrib/sendmail/src/daemon.c index 06a36c7e6487..983ad2fe3ede 100644 --- a/contrib/sendmail/src/daemon.c +++ b/contrib/sendmail/src/daemon.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2007, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -14,7 +14,7 @@ #include #include "map.h" -SM_RCSID("@(#)$Id: daemon.c,v 8.680 2008/02/14 00:20:26 ca Exp $") +SM_RCSID("@(#)$Id: daemon.c,v 8.683 2009/12/18 01:12:40 ca Exp $") #if defined(SOCK_STREAM) || defined(__GNU_LIBRARY__) # define USE_SOCK_STREAM 1 @@ -199,7 +199,7 @@ getrequests(e) if (tTd(15, 1)) { for (idx = 0; idx < NDaemons; idx++) - sm_dprintf("getrequests: daemon %s: %d\n", + sm_dprintf("getrequests: daemon %s: socket %d\n", Daemons[idx].d_name, Daemons[idx].d_socket); } @@ -2161,7 +2161,8 @@ makeconnection(host, port, mci, e, enough) case AF_INET: clt_addr.sin.sin_addr.s_addr = inet_addr(p); if (clt_addr.sin.sin_addr.s_addr != INADDR_NONE && - clt_addr.sin.sin_addr.s_addr != INADDR_LOOPBACK) + clt_addr.sin.sin_addr.s_addr != + htonl(INADDR_LOOPBACK)) { clt_bind = true; socksize = sizeof(struct sockaddr_in); @@ -2342,7 +2343,7 @@ makeconnection(host, port, mci, e, enough) } } gothostent: - if (hp == NULL) + if (hp == NULL || hp->h_addr == NULL) { #if NAMED_BIND /* check for name server timeouts */ diff --git a/contrib/sendmail/src/deliver.c b/contrib/sendmail/src/deliver.c index ed60e47a3c96..0322c956ef2b 100644 --- a/contrib/sendmail/src/deliver.c +++ b/contrib/sendmail/src/deliver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2008 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -14,7 +14,7 @@ #include #include -SM_RCSID("@(#)$Id: deliver.c,v 8.1015 2007/10/17 21:35:30 ca Exp $") +SM_RCSID("@(#)$Id: deliver.c,v 8.1020 2009/12/18 17:08:01 ca Exp $") #if HASSETUSERCONTEXT # include @@ -575,12 +575,12 @@ sendall(e, mode) #endif /* HASFLOCK */ if (e->e_nrcpts > 0) e->e_flags |= EF_INQUEUE; - dropenvelope(e, splitenv != NULL, true); + (void) dropenvelope(e, splitenv != NULL, true); for (ee = splitenv; ee != NULL; ee = ee->e_sibling) { if (ee->e_nrcpts > 0) ee->e_flags |= EF_INQUEUE; - dropenvelope(ee, false, true); + (void) dropenvelope(ee, false, true); } return; @@ -602,7 +602,7 @@ sendall(e, mode) /* now drop the envelope in the parent */ e->e_flags |= EF_INQUEUE; - dropenvelope(e, splitenv != NULL, false); + (void) dropenvelope(e, splitenv != NULL, false); /* arrange to reacquire lock after fork */ e->e_id = qid; @@ -615,7 +615,7 @@ sendall(e, mode) /* drop envelope in parent */ ee->e_flags |= EF_INQUEUE; - dropenvelope(ee, false, false); + (void) dropenvelope(ee, false, false); /* and save qid for reacquisition */ ee->e_id = qid; @@ -762,14 +762,14 @@ sendall(e, mode) } sendenvelope(e, mode); - dropenvelope(e, true, true); + (void) dropenvelope(e, true, true); for (ee = splitenv; ee != NULL; ee = ee->e_sibling) { CurEnv = ee; if (mode != SM_VERIFY) openxscript(ee); sendenvelope(ee, mode); - dropenvelope(ee, true, true); + (void) dropenvelope(ee, true, true); } CurEnv = e; @@ -1391,7 +1391,7 @@ deliver(e, firstto) else p = e->e_from.q_paddr; rpath = remotename(p, m, RF_SENDERADDR|RF_CANONICAL, &rcode, e); - if (strlen(rpath) > MAXSHORTSTR) + if (strlen(rpath) > MAXNAME) { rpath = shortenstring(rpath, MAXSHORTSTR); @@ -2978,7 +2978,7 @@ reconnect: /* after switching to an encrypted connection */ char *s; /* - ** TLS negotation failed, what to do? + ** TLS negotiation failed, what to do? ** fall back to unencrypted connection ** or abort? How to decide? ** set a macro and call a ruleset. @@ -3021,7 +3021,7 @@ reconnect: /* after switching to an encrypted connection */ /* ** rcode == EX_SOFTWARE is special: - ** the TLS negotation failed + ** the TLS negotiation failed ** we have to drop the connection no matter what ** However, we call tls_server to give it the chance ** to log the problem and return an appropriate @@ -6075,8 +6075,9 @@ initclttls(tls_ok) return false; if (clt_ctx != NULL) return true; /* already done */ - tls_ok_clt = inittls(&clt_ctx, TLS_I_CLT, false, CltCertFile, - CltKeyFile, CACertPath, CACertFile, DHParams); + tls_ok_clt = inittls(&clt_ctx, TLS_I_CLT, Clt_SSL_Options, false, + CltCertFile, CltKeyFile, + CACertPath, CACertFile, DHParams); return tls_ok_clt; } @@ -6108,6 +6109,16 @@ starttls(m, mci, e) if (clt_ctx == NULL && !initclttls(true)) return EX_TEMPFAIL; + +# if USE_OPENSSL_ENGINE + if (!SSL_set_engine(NULL)) + { + sm_syslog(LOG_ERR, NOQID, + "STARTTLS=client, SSL_set_engine=failed"); + return EX_TEMPFAIL; + } +# endif /* USE_OPENSSL_ENGINE */ + smtpmessage("STARTTLS", m, mci); /* get the reply */ diff --git a/contrib/sendmail/src/envelope.c b/contrib/sendmail/src/envelope.c index 641c621a416c..022c3ca8b2d6 100644 --- a/contrib/sendmail/src/envelope.c +++ b/contrib/sendmail/src/envelope.c @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: envelope.c,v 8.305 2008/03/31 16:32:13 ca Exp $") +SM_RCSID("@(#)$Id: envelope.c,v 8.310 2009/12/18 17:08:01 ca Exp $") /* ** CLRSESSENVELOPE -- clear session oriented data in an envelope @@ -163,14 +163,14 @@ newenvelope(e, parent, rpool) ** split -- if true, split by recipient if message is queued up ** ** Returns: -** none. +** EX_* status (currently: 0: success, EX_IOERR on panic) ** ** Side Effects: ** housekeeping necessary to dispose of an envelope. ** Unlocks this queue file. */ -void +int dropenvelope(e, fulldrop, split) register ENVELOPE *e; bool fulldrop; @@ -209,12 +209,15 @@ dropenvelope(e, fulldrop, split) /* we must have an id to remove disk files */ if (id == NULL) - return; + return EX_OK; /* if verify-only mode, we can skip most of this */ if (OpMode == MD_VERIFY) goto simpledrop; + if (tTd(92, 2)) + sm_dprintf("dropenvelope: e_id=%s, EF_LOGSENDER=%d, LogLevel=%d\n", + e->e_id, bitset(EF_LOGSENDER, e->e_flags), LogLevel); if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) logsender(e, NULL); e->e_flags &= ~EF_LOGSENDER; @@ -618,7 +621,11 @@ simpledrop: } e->e_id = NULL; e->e_flags &= ~EF_HAS_DF; + if (panic) + return EX_IOERR; + return EX_OK; } + /* ** CLEARENVELOPE -- clear an envelope without unlocking ** @@ -714,6 +721,9 @@ clearenvelope(e, fullclear, rpool) bh = bh->h_link; nhp = &(*nhp)->h_link; } +#if _FFR_MILTER_ENHSC + e->e_enhsc[0] = '\0'; +#endif /* _FFR_MILTER_ENHSC */ } /* ** INITSYS -- initialize instantiation of system diff --git a/contrib/sendmail/src/headers.c b/contrib/sendmail/src/headers.c index 8e70fed7618e..c4bdc8770025 100644 --- a/contrib/sendmail/src/headers.c +++ b/contrib/sendmail/src/headers.c @@ -14,7 +14,7 @@ #include #include -SM_RCSID("@(#)$Id: headers.c,v 8.312 2007/06/19 18:52:11 ca Exp $") +SM_RCSID("@(#)$Id: headers.c,v 8.317 2008/08/27 20:11:55 gshapiro Exp $") static HDR *allocheader __P((char *, char *, int, SM_RPOOL_T *, bool)); static size_t fix_mime_header __P((HDR *, ENVELOPE *)); @@ -715,7 +715,16 @@ hvalue(field, header) { if (!bitset(H_DEFAULT, h->h_flags) && sm_strcasecmp(h->h_field, field) == 0) - return h->h_value; + { + char *s; + + s = h->h_value; + if (s == NULL) + return NULL; + while (isascii(*s) && isspace(*s)) + s++; + return s; + } } return NULL; } @@ -1065,6 +1074,10 @@ eatheader(e, full, log) ** Log collection information. */ + if (tTd(92, 2)) + sm_dprintf("eatheader: e_id=%s, EF_LOGSENDER=%d, LogLevel=%d, log=%d\n", + e->e_id, bitset(EF_LOGSENDER, e->e_flags), LogLevel, + log); if (log && bitset(EF_LOGSENDER, e->e_flags) && LogLevel > 4) { logsender(e, e->e_msgid); diff --git a/contrib/sendmail/src/main.c b/contrib/sendmail/src/main.c index d68d5b590d6b..1bbb070dace6 100644 --- a/contrib/sendmail/src/main.c +++ b/contrib/sendmail/src/main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2006, 2008 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2006, 2008, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -26,7 +26,7 @@ SM_UNUSED(static char copyright[]) = The Regents of the University of California. All rights reserved.\n"; #endif /* ! lint */ -SM_RCSID("@(#)$Id: main.c,v 8.967 2008/03/31 16:32:13 ca Exp $") +SM_RCSID("@(#)$Id: main.c,v 8.971 2009/12/18 17:08:01 ca Exp $") #if NETINET || NETINET6 @@ -129,7 +129,7 @@ int SyslogPrefixLen; /* estimated length of syslog prefix */ { \ if (extraprivs && \ OpMode != MD_DELIVER && OpMode != MD_SMTP && \ - OpMode != MD_ARPAFTP && \ + OpMode != MD_ARPAFTP && OpMode != MD_CHECKCONFIG && \ OpMode != MD_VERIFY && OpMode != MD_TEST) \ { \ (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, \ @@ -401,6 +401,9 @@ main(argc, argv, envp) case MD_HOSTSTAT: case MD_PURGESTAT: case MD_ARPAFTP: +#if _FFR_CHECKCONFIG + case MD_CHECKCONFIG: +#endif /* _FFR_CHECKCONFIG */ OpMode = j; break; @@ -1192,7 +1195,7 @@ main(argc, argv, envp) } /* if we've had errors so far, exit now */ - if ((ExitStat != EX_OK && OpMode != MD_TEST) || + if ((ExitStat != EX_OK && OpMode != MD_TEST && OpMode != MD_CHECKCONFIG) || ExitStat == EX_OSERR) { finis(false, true, ExitStat); @@ -1566,6 +1569,7 @@ main(argc, argv, envp) break; case MD_TEST: + case MD_CHECKCONFIG: case MD_PRINT: case MD_PRINTNQE: case MD_FREEZE: @@ -1626,6 +1630,9 @@ main(argc, argv, envp) case MD_TEST: /* don't have persistent host status in test mode */ HostStatDir = NULL; + /* FALLTHROUGH */ + + case MD_CHECKCONFIG: if (Verbose == 0) Verbose = 2; BlankEnvelope.e_errormode = EM_PRINT; @@ -1933,8 +1940,8 @@ main(argc, argv, envp) } } - /* if we've had errors so far, exit now */ - if (ExitStat != EX_OK && OpMode != MD_TEST) + /* if checking config or have had errors so far, exit now */ + if (OpMode == MD_CHECKCONFIG || (ExitStat != EX_OK && OpMode != MD_TEST)) { finis(false, true, ExitStat); /* NOTREACHED */ @@ -1958,7 +1965,7 @@ main(argc, argv, envp) case MD_PRINT: /* print the queue */ HoldErrs = false; - dropenvelope(&BlankEnvelope, true, false); + (void) dropenvelope(&BlankEnvelope, true, false); (void) sm_signal(SIGPIPE, sigpipe); if (qgrp != NOQGRP) { @@ -1981,7 +1988,7 @@ main(argc, argv, envp) case MD_PRINTNQE: /* print number of entries in queue */ - dropenvelope(&BlankEnvelope, true, false); + (void) dropenvelope(&BlankEnvelope, true, false); (void) sm_signal(SIGPIPE, sigpipe); printnqe(smioout, NULL); finis(false, true, EX_OK); @@ -2133,8 +2140,8 @@ main(argc, argv, envp) else if (OpMode == MD_DAEMON || OpMode == MD_FGDAEMON || OpMode == MD_SMTP) { - /* check whether STARTTLS is turned off for the server */ - if (chkdaemonmodifiers(D_NOTLS)) + /* check whether STARTTLS is turned off */ + if (chkdaemonmodifiers(D_NOTLS) && chkclientmodifiers(D_NOTLS)) tls_ok = false; } else /* other modes don't need STARTTLS */ @@ -2530,7 +2537,7 @@ main(argc, argv, envp) } } } - dropenvelope(&MainEnvelope, true, false); + (void) dropenvelope(&MainEnvelope, true, false); #if STARTTLS /* init TLS for server, ignore result for now */ @@ -2952,7 +2959,11 @@ finis(drop, cleanup, exitstat) { if (CurEnv->e_id != NULL) { - dropenvelope(CurEnv, true, false); + int r; + + r = dropenvelope(CurEnv, true, false); + if (exitstat == EX_OK) + exitstat = r; sm_rpool_free(CurEnv->e_rpool); CurEnv->e_rpool = NULL; diff --git a/contrib/sendmail/src/map.c b/contrib/sendmail/src/map.c index 4248fd90f519..be88685babd9 100644 --- a/contrib/sendmail/src/map.c +++ b/contrib/sendmail/src/map.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2008 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1992, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1992, 1993 @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: map.c,v 8.699 2007/10/10 00:06:45 ca Exp $") +SM_RCSID("@(#)$Id: map.c,v 8.705 2009/08/11 22:22:40 ca Exp $") #if LDAPMAP # include @@ -730,7 +730,7 @@ getcanonname(host, hbsize, trymx, pttl) int mapno; bool found = false; bool got_tempfail = false; - auto int status; + auto int status = EX_UNAVAILABLE; char *maptype[MAXMAPSTACK]; short mapreturn[MAXMAPACTIONS]; #if defined(SUN_EXTENSIONS) && defined(SUN_INIT_DOMAIN) @@ -1710,7 +1710,7 @@ lockdbm: { map->map_mflags |= MF_OPEN; map->map_pid = CurrentPid; - if ((omode && O_ACCMODE) == O_RDWR) + if ((omode & O_ACCMODE) == O_RDWR) map->map_mflags |= MF_WRITABLE; goto lockdbm; } @@ -2359,7 +2359,7 @@ db_map_lookup(map, name, av, statp) { map->map_mflags |= MF_OPEN; map->map_pid = CurrentPid; - if ((omode && O_ACCMODE) == O_RDWR) + if ((omode & O_ACCMODE) == O_RDWR) map->map_mflags |= MF_WRITABLE; db = (DB *) map->map_db2; goto lockdb; @@ -3415,6 +3415,18 @@ ldapmap_open(map, mode) else id = "localhost"; + if (tTd(74, 104)) + { + extern MAPCLASS NullMapClass; + + /* debug mode: don't actually open an LDAP connection */ + map->map_orgclass = map->map_class; + map->map_class = &NullMapClass; + map->map_mflags |= MF_OPEN; + map->map_pid = CurrentPid; + return true; + } + /* No connection yet, connect */ if (!sm_ldap_start(map->map_mname, lmap)) { @@ -3514,12 +3526,12 @@ sunet_id_hash(str) p_last = p; while (*p != '\0') { - if (islower(*p) || isdigit(*p)) + if (isascii(*p) && (islower(*p) || isdigit(*p))) { *p_last = *p; p_last++; } - else if (isupper(*p)) + else if (isascii(*p) && isupper(*p)) { *p_last = tolower(*p); p_last++; @@ -3967,6 +3979,10 @@ ldapmap_parseargs(map, args) map->map_coldelim = ' '; } +# if _FFR_LDAP_NETWORK_TIMEOUT + lmap->ldap_networktmo = 120; +# endif /* _FFR_LDAP_NETWORK_TIMEOUT */ + for (;;) { while (isascii(*p) && isspace(*p)) @@ -4066,7 +4082,7 @@ ldapmap_parseargs(map, args) case 'c': /* network (connect) timeout */ while (isascii(*++p) && isspace(*p)) continue; - lmap->ldap_networktmo.tv_sec = atoi(p); + lmap->ldap_networktmo = atoi(p); break; # endif /* _FFR_LDAP_NETWORK_TIMEOUT */ @@ -6687,6 +6703,13 @@ null_map_store(map, key, val) return; } +MAPCLASS NullMapClass = +{ + "null-map", NULL, 0, + NULL, null_map_lookup, null_map_store, + null_map_open, null_map_close, +}; + /* ** BOGUS stubs */ @@ -7325,7 +7348,8 @@ arith_map_lookup(map, name, av, statp) if (LogLevel > 10) sm_syslog(LOG_WARNING, NOQID, "arith_map: unknown operator %c", - isprint(*name) ? *name : '?'); + (isascii(*name) && isprint(*name)) ? + *name : '?'); return NULL; } if (boolres) diff --git a/contrib/sendmail/src/milter.c b/contrib/sendmail/src/milter.c index 816c7bf7d4ac..773dfa8f9c6d 100644 --- a/contrib/sendmail/src/milter.c +++ b/contrib/sendmail/src/milter.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2006 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2009 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -10,7 +10,7 @@ #include -SM_RCSID("@(#)$Id: milter.c,v 8.269 2007/06/06 17:26:12 ca Exp $") +SM_RCSID("@(#)$Id: milter.c,v 8.277 2009/11/06 00:57:06 ca Exp $") #if MILTER # include @@ -514,7 +514,6 @@ milter_write(m, cmd, buf, len, to, e, where) ENVELOPE *e; const char *where; { - time_t writestart = (time_t) 0; ssize_t sl, i; int num_vectors; mi_int32 nl; @@ -532,12 +531,16 @@ milter_write(m, cmd, buf, len, to, e, where) if (len < 0 || len > MilterMaxDataSize) { if (tTd(64, 5)) - sm_dprintf("milter_write(%s): length %ld out of range\n", - m->mf_name, (long) len); + { + sm_dprintf("milter_write(%s): length %ld out of range, cmd=%c\n", + m->mf_name, (long) len, command); + sm_dprintf("milter_write(%s): buf=%s\n", + m->mf_name, str2prt(buf)); + } if (MilterLogLevel > 0) sm_syslog(LOG_ERR, e->e_id, - "milter_write(%s): length %ld out of range", - m->mf_name, (long) len); + "milter_write(%s): length %ld out of range, cmd=%c", + m->mf_name, (long) len, command); milter_error(m, e); return NULL; } @@ -594,10 +597,7 @@ milter_write(m, cmd, buf, len, to, e, where) } if (to > 0) - { - writestart = curtime(); MILTER_TIMEOUT("write", to, true, started, where); - } /* write the vector(s) */ i = writev(m->mf_sock, vector, num_vectors); @@ -1572,10 +1572,10 @@ static struct milteropt # define MO_LOGLEVEL 0x07 { "loglevel", MO_LOGLEVEL }, -# if _FFR_MAXDATASIZE +# if _FFR_MAXDATASIZE || _FFR_MDS_NEGOTIATE # define MO_MAXDATASIZE 0x08 { "maxdatasize", MO_MAXDATASIZE }, -# endif /* _FFR_MAXDATASIZE */ +# endif /* _FFR_MAXDATASIZE || _FFR_MDS_NEGOTIATE */ { NULL, (unsigned char)-1 }, }; @@ -1631,11 +1631,29 @@ milter_set_option(name, val, sticky) MilterLogLevel = atoi(val); break; -#if _FFR_MAXDATASIZE +# if _FFR_MAXDATASIZE || _FFR_MDS_NEGOTIATE case MO_MAXDATASIZE: +# if _FFR_MDS_NEGOTIATE MilterMaxDataSize = (size_t)atol(val); + if (MilterMaxDataSize != MILTER_MDS_64K && + MilterMaxDataSize != MILTER_MDS_256K && + MilterMaxDataSize != MILTER_MDS_1M) + { + sm_syslog(LOG_WARNING, NOQID, + "WARNING: Milter.%s=%d, allowed are only %d, %d, and %d", + name, MilterMaxDataSize, + MILTER_MDS_64K, MILTER_MDS_256K, + MILTER_MDS_1M); + if (MilterMaxDataSize < MILTER_MDS_64K) + MilterMaxDataSize = MILTER_MDS_64K; + else if (MilterMaxDataSize < MILTER_MDS_256K) + MilterMaxDataSize = MILTER_MDS_256K; + else + MilterMaxDataSize = MILTER_MDS_1M; + } +# endif /* _FFR_MDS_NEGOTIATE */ break; -#endif /* _FFR_MAXDATASIZE */ +# endif /* _FFR_MAXDATASIZE || _FFR_MDS_NEGOTIATE */ case MO_MACROS_CONNECT: if (macros == NULL) @@ -2411,6 +2429,12 @@ milter_negotiate(m, e, milters) mta_prot_flags = SMFI_CURR_PROT; mta_actions = SMFI_CURR_ACTS; #endif /* _FFR_MILTER_CHECK */ +#if _FFR_MDS_NEGOTIATE + if (MilterMaxDataSize == MILTER_MDS_256K) + mta_prot_flags |= SMFIP_MDS_256K; + else if (MilterMaxDataSize == MILTER_MDS_1M) + mta_prot_flags |= SMFIP_MDS_1M; +#endif /* _FFR_MDS_NEGOTIATE */ fvers = htonl(mta_prot_vers); pflags = htonl(mta_prot_flags); @@ -2525,6 +2549,39 @@ milter_negotiate(m, e, milters) goto error; } +#if _FFR_MDS_NEGOTIATE + /* use a table instead of sequence? */ + if (bitset(SMFIP_MDS_1M, m->mf_pflags)) + { + if (MilterMaxDataSize != MILTER_MDS_1M) + { + /* this should not happen... */ + sm_syslog(LOG_WARNING, NOQID, + "WARNING: Milter.maxdatasize: configured=%d, set by libmilter=%d", + MilterMaxDataSize, MILTER_MDS_1M); + MilterMaxDataSize = MILTER_MDS_1M; + } + } + else if (bitset(SMFIP_MDS_256K, m->mf_pflags)) + { + if (MilterMaxDataSize != MILTER_MDS_256K) + { + sm_syslog(LOG_WARNING, NOQID, + "WARNING: Milter.maxdatasize: configured=%d, set by libmilter=%d", + MilterMaxDataSize, MILTER_MDS_256K); + MilterMaxDataSize = MILTER_MDS_256K; + } + } + else if (MilterMaxDataSize != MILTER_MDS_64K) + { + sm_syslog(LOG_WARNING, NOQID, + "WARNING: Milter.maxdatasize: configured=%d, set by libmilter=%d", + MilterMaxDataSize, MILTER_MDS_64K); + MilterMaxDataSize = MILTER_MDS_64K; + } + m->mf_pflags &= ~SMFI_INTERNAL; +#endif /* _FFR_MDS_NEGOTIATE */ + /* check for protocol feature mismatch */ if ((m->mf_pflags & mta_prot_flags) != m->mf_pflags) { @@ -2976,7 +3033,7 @@ milter_addheader(m, response, rlen, e) h->h_value = mh_value; else { - h->h_value = addleadingspace (mh_value, e->e_rpool); + h->h_value = addleadingspace(mh_value, e->e_rpool); SM_FREE(mh_value); } h->h_flags |= H_USER; @@ -3277,7 +3334,7 @@ milter_changeheader(m, response, rlen, e) h->h_value = mh_value; else { - h->h_value = addleadingspace (mh_value, e->e_rpool); + h->h_value = addleadingspace(mh_value, e->e_rpool); SM_FREE(mh_value); } h->h_flags |= H_USER; @@ -3330,7 +3387,7 @@ milter_split_response(response, rlen, pargc) return NULL; /* last entry is only for the name */ - s = (char **)malloc(nelem * (sizeof(*s))); + s = (char **)malloc((nelem + 1) * (sizeof(*s))); if (s == NULL) return NULL; s[0] = response; @@ -3813,7 +3870,7 @@ milter_init(e, state, milters) m->mf_sock < 0 ? "open" : "negotiate"); - /* if negotation failure, close socket */ + /* if negotiation failure, close socket */ milter_error(m, e); MILTER_CHECK_ERROR(true, continue); continue; @@ -4383,7 +4440,7 @@ milter_data(e, state) response = milter_read(m, &rcmd, &rlen, m->mf_timeout[SMFTO_READ], e, - "body"); + "eom"); if (m->mf_state == SMFS_ERROR) break; diff --git a/contrib/sendmail/src/queue.c b/contrib/sendmail/src/queue.c index d4c6369d0e6a..194f5250d663 100644 --- a/contrib/sendmail/src/queue.c +++ b/contrib/sendmail/src/queue.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -14,7 +14,7 @@ #include #include -SM_RCSID("@(#)$Id: queue.c,v 8.977 2008/02/15 23:19:58 ca Exp $") +SM_RCSID("@(#)$Id: queue.c,v 8.987 2009/12/18 17:08:01 ca Exp $") #include @@ -134,7 +134,7 @@ static const char EmptyString[] = ""; static void grow_wlist __P((int, int)); static int multiqueue_cache __P((char *, int, QUEUEGRP *, int, unsigned int *)); -static int gatherq __P((int, int, bool, bool *, bool *)); +static int gatherq __P((int, int, bool, bool *, bool *, int *)); static int sortq __P((int)); static void printctladdr __P((ADDRESS *, SM_FILE_T *)); static bool readqf __P((ENVELOPE *, bool)); @@ -2106,7 +2106,7 @@ run_work_group(wgrp, flags) for (i = 0; i < Queue[qgrp]->qg_numqueues; i++) { - h = gatherq(qgrp, qdir, false, &full, &more); + (void) gatherq(qgrp, qdir, false, &full, &more, &h); #if SM_CONF_SHM if (ShmId != SM_SHM_NO_ID) QSHM_ENTRIES(Queue[qgrp]->qg_qpaths[qdir].qp_idx) = h; @@ -2450,6 +2450,7 @@ runqueueevent(ignore) ** full -- (optional) to be set 'true' if WorkList is full ** more -- (optional) to be set 'true' if there are still more ** messages in this queue not added to WorkList +** pnentries -- (optional) total nuber of entries in queue ** ** Returns: ** The number of request in the queue (not necessarily @@ -2472,25 +2473,26 @@ static int WorkListSize = 0; /* current max size of WorkList */ static int WorkListCount = 0; /* # of work items in WorkList */ static int -gatherq(qgrp, qdir, doall, full, more) +gatherq(qgrp, qdir, doall, full, more, pnentries) int qgrp; int qdir; bool doall; bool *full; bool *more; + int *pnentries; { register struct dirent *d; register WORK *w; register char *p; DIR *f; - int i, num_ent; - int wn; + int i, num_ent, wn, nentries; QUEUE_CHAR *check; char qd[MAXPATHLEN]; char qf[MAXPATHLEN]; wn = WorkListCount - 1; num_ent = 0; + nentries = 0; if (qdir == NOQDIR) (void) sm_strlcpy(qd, ".", sizeof(qd)); else @@ -2600,6 +2602,7 @@ gatherq(qgrp, qdir, doall, full, more) continue; } + ++nentries; check = QueueLimitId; while (check != NULL) { @@ -2855,6 +2858,21 @@ gatherq(qgrp, qdir, doall, full, more) break; case 'K': +#if _FFR_EXPDELAY + if (MaxQueueAge > 0) + { + time_t lasttry, delay; + + lasttry = (time_t) atol(&lbuf[1]); + delay = MIN(lasttry - w->w_ctime, + MaxQueueAge); + age = curtime() - lasttry; + if (age < delay) + w->w_tooyoung = true; + break; + } +#endif /* _FFR_EXPDELAY */ + age = curtime() - (time_t) atol(&lbuf[1]); if (age >= 0 && MinQueueAge > 0 && age < MinQueueAge) @@ -2900,6 +2918,8 @@ gatherq(qgrp, qdir, doall, full, more) *full = (wn >= MaxQueueRun && MaxQueueRun > 0) || (WorkList == NULL && wn > 0); + if (pnentries != NULL) + *pnentries = nentries; return i; } /* @@ -3331,8 +3351,8 @@ workcmpf4(a, b) ** WORKCMPF5 -- compare based on assigned random number ** ** Parameters: -** a -- the first argument (ignored). -** b -- the second argument (ignored). +** a -- the first argument. +** b -- the second argument. ** ** Returns: ** randomly 1/-1 @@ -3682,7 +3702,7 @@ dowork(qgrp, qdir, id, forkflag, requeueflag, e) finis(true, true, ExitStat); else { - dropenvelope(e, true, false); + (void) dropenvelope(e, true, false); sm_rpool_free(rpool); e->e_rpool = NULL; } @@ -3859,7 +3879,7 @@ doworklist(el, forkflag, requeueflag) /* do the delivery */ sendall(&e, SM_DELIVER); - dropenvelope(&e, true, false); + (void) dropenvelope(&e, true, false); } else { @@ -4834,7 +4854,7 @@ print_single_queue(qgrp, qdir) ** Read and order the queue. */ - nrequests = gatherq(qgrp, qdir, true, NULL, NULL); + nrequests = gatherq(qgrp, qdir, true, NULL, NULL, NULL); (void) sortq(Queue[qgrp]->qg_maxlist); /* @@ -5332,31 +5352,31 @@ static const char QueueIdChars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh */ # define queuenextid() CurrentPid - +#define QIC_LEN_SQR (QIC_LEN * QIC_LEN) void assign_queueid(e) register ENVELOPE *e; { pid_t pid = queuenextid(); - static int cX = 0; - static long random_offset; + static unsigned int cX = 0; + static unsigned int random_offset; struct tm *tm; char idbuf[MAXQFNAME - 2]; - int seq; + unsigned int seq; if (e->e_id != NULL) return; /* see if we need to get a new base time/pid */ - if (cX >= QIC_LEN * QIC_LEN || LastQueueTime == 0 || - LastQueuePid != pid) + if (cX >= QIC_LEN_SQR || LastQueueTime == 0 || LastQueuePid != pid) { time_t then = LastQueueTime; /* if the first time through, pick a random offset */ if (LastQueueTime == 0) - random_offset = get_random(); + random_offset = ((unsigned int)get_random()) + % QIC_LEN_SQR; while ((LastQueueTime = curtime()) == then && LastQueuePid == pid) @@ -5368,16 +5388,16 @@ assign_queueid(e) } /* - ** Generate a new sequence number between 0 and QIC_LEN*QIC_LEN-1. - ** This lets us generate up to QIC_LEN*QIC_LEN unique queue ids + ** Generate a new sequence number between 0 and QIC_LEN_SQR-1. + ** This lets us generate up to QIC_LEN_SQR unique queue ids ** per second, per process. With envelope splitting, ** a single message can consume many queue ids. */ - seq = (int)((cX + random_offset) % (QIC_LEN * QIC_LEN)); + seq = (cX + random_offset) % QIC_LEN_SQR; ++cX; if (tTd(7, 50)) - sm_dprintf("assign_queueid: random_offset = %ld (%d)\n", + sm_dprintf("assign_queueid: random_offset=%u (%u)\n", random_offset, seq); tm = gmtime(&LastQueueTime); @@ -5430,6 +5450,7 @@ sync_queue_time() { #if FAST_PID_RECYCLE if (OpMode != MD_TEST && + OpMode != MD_CHECKCONFIG && OpMode != MD_VERIFY && LastQueueTime > 0 && LastQueuePid == CurrentPid && @@ -5740,6 +5761,10 @@ pickqdir(qg, fsize, e) else qdir = get_rand_mod(qg->qg_numqueues); +#if _FFR_TESTS + if (tTd(4, 101)) + return NOQDIR; +#endif /* _FFR_TESTS */ if (MinBlocksFree <= 0 && fsize <= 0) return qdir; @@ -6600,6 +6625,16 @@ init_sem(owner) (long) SemKey, SemId, sm_errstring(-SemId)); return; } + if (owner && RunAsUid != 0) + { + int r; + + r = sm_semsetowner(SemId, RunAsUid, RunAsGid, 0660); + if (r != 0) + sm_syslog(LOG_ERR, NOQID, + "key=%ld, sm_semsetowner=%d, RunAsUid=%d, RunAsGid=%d", + (long) SemKey, r, RunAsUid, RunAsGid); + } #endif /* SM_CONF_SEM */ #endif /* _FFR_USE_SEM_LOCKING */ return; @@ -8826,7 +8861,7 @@ quarantine_queue(reason, qgrplimit) if (StopRequest) stop_sendmail(); - nrequests = gatherq(qgrp, qdir, true, NULL, NULL); + nrequests = gatherq(qgrp, qdir, true, NULL, NULL, NULL); /* first see if there is anything */ if (nrequests <= 0) diff --git a/contrib/sendmail/src/ratectrl.c b/contrib/sendmail/src/ratectrl.c index 8b95b3753df0..773955a6db0f 100644 --- a/contrib/sendmail/src/ratectrl.c +++ b/contrib/sendmail/src/ratectrl.c @@ -45,7 +45,7 @@ */ #include -SM_RCSID("@(#)$Id: ratectrl.c,v 8.12 2008/02/11 22:56:05 ca Exp $") +SM_RCSID("@(#)$Id: ratectrl.c,v 8.13 2009/05/05 23:19:34 ca Exp $") /* ** stuff included - given some warnings (inet_ntoa) @@ -69,9 +69,6 @@ SM_RCSID("@(#)$Id: ratectrl.c,v 8.12 2008/02/11 22:56:05 ca Exp $") /* forward declarations */ static int client_rate __P((time_t, SOCKADDR *, bool)); static int total_rate __P((time_t, bool)); -#if 0 -static int sockaddrcmp __P((SOCKADDR *, SOCKADDR *)); -#endif /* 0 */ /* ** CONNECTION_RATE_CHECK - updates connection history data @@ -485,50 +482,3 @@ total_rate(now, update) return cnt; } - -#if 0 -/* -** SOCKADDRCMP - compare two SOCKADDR structures -** this function may be used to compare SOCKADDR -** structures when using bsearch and qsort functions -** in the same way we do with strcmp -** -** Parameters: -** a, b - addresses -** -** Returns: -** 1 if a > b -** -1 if a < b -** 0 if a = b -** -** OBS: This call isn't used at the moment, it will -** be used when code will be extended to work with IPV6 -*/ - -static int -sockaddrcmp(a, b) - SOCKADDR *a; - SOCKADDR *b; -{ - if (a->sa.sa_family > b->sa.sa_family) - return 1; - if (a->sa.sa_family < b->sa.sa_family) - return -1; - - switch (a->sa.sa_family) - { - case AF_INET: - if (a->sin.sin_addr.s_addr > b->sin.sin_addr.s_addr) - return 1; - if (a->sin.sin_addr.s_addr < b->sin.sin_addr.s_addr) - return -1; - return 0; - break; - - case AF_INET6: - /* TO BE DONE */ - break; - } - return 0; -} -#endif /* 0 */ diff --git a/contrib/sendmail/src/readcf.c b/contrib/sendmail/src/readcf.c index 445df9e10686..c6d48a8cfea6 100644 --- a/contrib/sendmail/src/readcf.c +++ b/contrib/sendmail/src/readcf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2006, 2008 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2006, 2008, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -14,7 +14,7 @@ #include #include -SM_RCSID("@(#)$Id: readcf.c,v 8.666 2008/02/14 17:25:14 ca Exp $") +SM_RCSID("@(#)$Id: readcf.c,v 8.674 2009/10/26 17:47:00 ca Exp $") #if NETINET || NETINET6 # include @@ -113,6 +113,9 @@ readcf(cfname, safe, e) FileName = cfname; LineNumber = 0; +#if STARTTLS + Srv_SSL_Options = Clt_SSL_Options = SSL_OP_ALL; +#endif /* STARTTLS */ if (DontLockReadFiles) sff |= SFF_NOLOCK; cf = safefopen(cfname, O_RDONLY, 0444, sff); @@ -136,7 +139,7 @@ readcf(cfname, safe, e) if (OpMode != MD_TEST && bitset(S_IWGRP|S_IWOTH, statb.st_mode)) { - if (OpMode == MD_DAEMON || OpMode == MD_INITALIAS) + if (OpMode == MD_DAEMON || OpMode == MD_INITALIAS || OpMode == MD_CHECKCONFIG) (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "%s: WARNING: dangerous write permissions\n", FileName); @@ -462,7 +465,7 @@ readcf(cfname, safe, e) rwp = RewriteRules[ruleset]; if (rwp != NULL) { - if (OpMode == MD_TEST) + if (OpMode == MD_TEST || OpMode == MD_CHECKCONFIG) (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "WARNING: Ruleset %s has multiple definitions\n", @@ -534,7 +537,6 @@ readcf(cfname, safe, e) p++; while (isascii(*p) && isspace(*p)) p++; - file = p; } else optional = false; @@ -2255,10 +2257,101 @@ static struct optioninfo # define O_RCPTSHUTDG 0xe2 { "BadRcptShutdownGood", O_RCPTSHUTDG, OI_SAFE }, #endif /* _FFR_BADRCPT_SHUTDOWN */ +#if STARTTLS && _FFR_TLS_1 +# define O_SRV_SSL_OPTIONS 0xe3 + { "ServerSSLOptions", O_SRV_SSL_OPTIONS, OI_NONE }, +# define O_CLT_SSL_OPTIONS 0xe4 + { "ClientSSLOptions", O_CLT_SSL_OPTIONS, OI_NONE }, +#endif /* STARTTLS && _FFR_TLS_1 */ +#if _FFR_EXPDELAY +# define O_MAX_QUEUE_AGE 0xe5 + { "MaxQueueAge", O_MAX_QUEUE_AGE, OI_NONE }, +#endif /* _FFR_EXPDELAY */ +#if _FFR_RCPTTHROTDELAY +# define O_RCPTTHROTDELAY 0xe6 + { "BadRcptThrottleDelay", O_RCPTTHROTDELAY, OI_SAFE }, +#endif /* _FFR_RCPTTHROTDELAY */ { NULL, '\0', OI_NONE } }; +#if STARTTLS && _FFR_TLS_1 +static struct ssl_options +{ + const char *sslopt_name; /* name of the flag */ + long sslopt_bits; /* bits to set/clear */ +} SSL_Option[] = +{ +/* these are turned on by default */ +#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG + { "SSL_OP_MICROSOFT_SESS_ID_BUG", SSL_OP_MICROSOFT_SESS_ID_BUG }, +#endif /* SSL_OP_MICROSOFT_SESS_ID_BUG */ +#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG + { "SSL_OP_NETSCAPE_CHALLENGE_BUG", SSL_OP_NETSCAPE_CHALLENGE_BUG }, +#endif /* SSL_OP_NETSCAPE_CHALLENGE_BUG */ +#ifdef SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG + { "SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG }, +#endif /* SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG */ +#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG + { "SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG", SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG }, +#endif /* SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG */ +#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER + { "SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER", SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER }, +#endif /* SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER */ +#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING + { "SSL_OP_MSIE_SSLV2_RSA_PADDING", SSL_OP_MSIE_SSLV2_RSA_PADDING }, +#endif /* SSL_OP_MSIE_SSLV2_RSA_PADDING */ +#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG + { "SSL_OP_SSLEAY_080_CLIENT_DH_BUG", SSL_OP_SSLEAY_080_CLIENT_DH_BUG }, +#endif /* SSL_OP_SSLEAY_080_CLIENT_DH_BUG */ +#ifdef SSL_OP_TLS_D5_BUG + { "SSL_OP_TLS_D5_BUG", SSL_OP_TLS_D5_BUG }, +#endif /* SSL_OP_TLS_D5_BUG */ +#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG + { "SSL_OP_TLS_BLOCK_PADDING_BUG", SSL_OP_TLS_BLOCK_PADDING_BUG }, +#endif /* SSL_OP_TLS_BLOCK_PADDING_BUG */ +#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS + { "SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS", SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS }, +#endif /* SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS */ + { "SSL_OP_ALL", SSL_OP_ALL }, +#ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION + { "SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION", SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION }, +#endif /* SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION */ +#ifdef SSL_OP_EPHEMERAL_RSA + { "SSL_OP_EPHEMERAL_RSA", SSL_OP_EPHEMERAL_RSA }, +#endif /* SSL_OP_EPHEMERAL_RSA */ +#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE + { "SSL_OP_CIPHER_SERVER_PREFERENCE", SSL_OP_CIPHER_SERVER_PREFERENCE }, +#endif /* SSL_OP_CIPHER_SERVER_PREFERENCE */ +#ifdef SSL_OP_TLS_ROLLBACK_BUG + { "SSL_OP_TLS_ROLLBACK_BUG", SSL_OP_TLS_ROLLBACK_BUG }, +#endif /* SSL_OP_TLS_ROLLBACK_BUG */ +#ifdef SSL_OP_NO_SSLv2 + { "SSL_OP_NO_SSLv2", SSL_OP_NO_SSLv2 }, +#endif /* SSL_OP_NO_SSLv2 */ +#ifdef SSL_OP_NO_SSLv3 + { "SSL_OP_NO_SSLv3", SSL_OP_NO_SSLv3 }, +#endif /* SSL_OP_NO_SSLv3 */ +#ifdef SSL_OP_NO_TLSv1 + { "SSL_OP_NO_TLSv1", SSL_OP_NO_TLSv1 }, +#endif /* SSL_OP_NO_TLSv1 */ +#ifdef SSL_OP_PKCS1_CHECK_1 + { "SSL_OP_PKCS1_CHECK_1", SSL_OP_PKCS1_CHECK_1 }, +#endif /* SSL_OP_PKCS1_CHECK_1 */ +#ifdef SSL_OP_PKCS1_CHECK_2 + { "SSL_OP_PKCS1_CHECK_2", SSL_OP_PKCS1_CHECK_2 }, +#endif /* SSL_OP_PKCS1_CHECK_2 */ +#ifdef SSL_OP_NETSCAPE_CA_DN_BUG + { "SSL_OP_NETSCAPE_CA_DN_BUG", SSL_OP_NETSCAPE_CA_DN_BUG }, +#endif /* SSL_OP_NETSCAPE_CA_DN_BUG */ +#ifdef SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG + { "SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG }, +#endif /* SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG */ + { NULL, 0 } +}; +#endif /* STARTTLS && _FFR_TLS_1 */ + + # define CANONIFY(val) # define SET_OPT_DEFAULT(opt, val) opt = val @@ -2299,6 +2392,9 @@ setoption(opt, val, safe, sticky, e) char *newval; char exbuf[MAXLINE]; #endif /* STARTTLS || SM_CONF_SHM */ +#if STARTTLS && _FFR_TLS_1 + long *pssloptions = NULL; +#endif /* STARTTLS && _FFR_TLS_1 */ errno = 0; if (opt == ' ') @@ -2995,6 +3091,12 @@ setoption(opt, val, safe, sticky, e) MinQueueAge = convtime(val, 'm'); break; +#if _FFR_EXPDELAY + case O_MAX_QUEUE_AGE: + MaxQueueAge = convtime(val, 'm'); + break; +#endif /* _FFR_EXPDELAY */ + case O_DEFCHARSET: /* default character set for mimefying */ DefaultCharSet = newstr(denlstring(val, true, true)); break; @@ -3317,6 +3419,12 @@ setoption(opt, val, safe, sticky, e) BadRcptThrottle = atoi(val); break; +#if _FFR_RCPTTHROTDELAY + case O_RCPTTHROTDELAY: + BadRcptThrottleDelay = atoi(val); + break; +#endif /* _FFR_RCPTTHROTDELAY */ + case O_DEADLETTER: CANONIFY(val); PSTRSET(DeadLetterDrop, val); @@ -3578,7 +3686,51 @@ setoption(opt, val, safe, sticky, e) SET_STRING_EXP(DHParams5); case O_CIPHERLIST: SET_STRING_EXP(CipherList); + case O_SRV_SSL_OPTIONS: + pssloptions = &Srv_SSL_Options; + case O_CLT_SSL_OPTIONS: + if (pssloptions == NULL) + pssloptions = &Clt_SSL_Options; + for (p = val; *p != 0; ) + { + bool clearmode; + char *q; + struct ssl_options *sslopts; + + while (*p == ' ') + p++; + if (*p == '\0') + break; + clearmode = false; + if (*p == '-' || *p == '+') + clearmode = *p++ == '-'; + q = p; + while (*p != '\0' && !(isascii(*p) && isspace(*p))) + p++; + if (*p != '\0') + *p++ = '\0'; + for (sslopts = SSL_Option; + sslopts->sslopt_name != NULL; sslopts++) + { + if (sm_strcasecmp(q, sslopts->sslopt_name) == 0) + break; + } + if (sslopts->sslopt_name == NULL) + { + errno = 0; + syserr("readcf: %s option value %s unrecognized", + o->o_name, q); + } + else if (clearmode) + *pssloptions &= ~sslopts->sslopt_bits; + else + *pssloptions |= sslopts->sslopt_bits; + } + pssloptions = NULL; + break; + # endif /* _FFR_TLS_1 */ + case O_CRLFILE: # if OPENSSL_VERSION_NUMBER > 0x00907000L SET_STRING_EXP(CRLFile); @@ -4026,8 +4178,7 @@ strtorwset(p, endp, stabmode) char *q = NULL; q = p; - while (*p != '\0' && isascii(*p) && - (isalnum(*p) || *p == '_')) + while (*p != '\0' && isascii(*p) && (isalnum(*p) || *p == '_')) p++; if (q == p || !(isascii(*q) && isalpha(*q))) { diff --git a/contrib/sendmail/src/savemail.c b/contrib/sendmail/src/savemail.c index cf72e8d497ef..4178245cc5a3 100644 --- a/contrib/sendmail/src/savemail.c +++ b/contrib/sendmail/src/savemail.c @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: savemail.c,v 8.313 2006/11/29 00:20:41 ca Exp $") +SM_RCSID("@(#)$Id: savemail.c,v 8.314 2009/12/18 17:08:01 ca Exp $") static bool errbody __P((MCI *, ENVELOPE *, char *)); static bool pruneroute __P((char *)); @@ -705,7 +705,7 @@ returntosender(msg, returnq, flags, e) sendall(ee, SM_DELIVER); /* restore state */ - dropenvelope(ee, true, false); + (void) dropenvelope(ee, true, false); sm_rpool_free(ee->e_rpool); CurEnv = oldcur; returndepth--; diff --git a/contrib/sendmail/src/sendmail.8 b/contrib/sendmail/src/sendmail.8 index 540d55480ae1..e5ce9aeef9de 100644 --- a/contrib/sendmail/src/sendmail.8 +++ b/contrib/sendmail/src/sendmail.8 @@ -9,9 +9,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: sendmail.8,v 8.58 2007/08/02 05:42:33 ca Exp $ +.\" $Id: sendmail.8,v 8.59 2009/04/10 17:49:19 gshapiro Exp $ .\" -.TH SENDMAIL 8 "$Date: 2007/08/02 05:42:33 $" +.TH SENDMAIL 8 "$Date: 2009/04/10 17:49:19 $" .SH NAME sendmail \- an electronic mail transport agent @@ -741,6 +741,8 @@ Internet Request For Comments No. 8, SMM. .PP http://www.sendmail.org/ +.PP +US Patent Numbers 6865671, 6986037. .SH HISTORY The .B sendmail diff --git a/contrib/sendmail/src/sendmail.h b/contrib/sendmail/src/sendmail.h index b6b231d844ef..b170c2bbb3d7 100644 --- a/contrib/sendmail/src/sendmail.h +++ b/contrib/sendmail/src/sendmail.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2008 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -52,7 +52,7 @@ #ifdef _DEFINE # ifndef lint -SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.1059 2008/02/15 23:19:58 ca Exp $"; +SM_UNUSED(static char SmailId[]) = "@(#)$Id: sendmail.h,v 8.1068 2009/12/18 17:08:01 ca Exp $"; # endif /* ! lint */ #endif /* _DEFINE */ @@ -607,7 +607,7 @@ extern bool filesys_free __P((long)); ERROR: change SASL_SEC_MASK_ notify sendmail.org! # endif /* SASL_SEC_NOPLAINTEXT & SASL_SEC_MASK) == 0 ... */ # endif /* SASL >= 20101 */ -# define MAXOUTLEN 8192 /* length of output buffer */ +# define MAXOUTLEN 8192 /* length of output buffer, should be 2^n */ /* functions */ extern char *intersect __P((char *, char *, SM_RPOOL_T *)); @@ -931,6 +931,10 @@ struct envelope int e_dlvr_flag; /* deliver by flag */ SM_RPOOL_T *e_rpool; /* resource pool for this envelope */ unsigned int e_features; /* server features */ +#if _FFR_MILTER_ENHSC +#define ENHSC_LEN 11 + char e_enhsc[ENHSC_LEN]; /* enhanced status code */ +#endif /* _FFR_MILTER_ENHSC */ }; /* values for e_flags */ @@ -982,7 +986,7 @@ extern ENVELOPE BlankEnvelope; /* functions */ extern void clearenvelope __P((ENVELOPE *, bool, SM_RPOOL_T *)); -extern void dropenvelope __P((ENVELOPE *, bool, bool)); +extern int dropenvelope __P((ENVELOPE *, bool, bool)); extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *, SM_RPOOL_T *)); extern void clrsessenvelope __P((ENVELOPE *)); extern void printenvflags __P((ENVELOPE *)); @@ -1561,6 +1565,7 @@ extern void stabapply __P((void (*)(STAB *, int), int)); #define MD_HOSTSTAT 'h' /* print persistent host stat info */ #define MD_PURGESTAT 'H' /* purge persistent host stat info */ #define MD_QUEUERUN 'q' /* queue run */ +#define MD_CHECKCONFIG 'C' /* check configuration file */ #if _FFR_LOCAL_DAEMON EXTERN bool LocalDaemon; @@ -1880,7 +1885,7 @@ struct termescape /* functions */ extern bool init_tls_library __P((void)); -extern bool inittls __P((SSL_CTX **, unsigned long, bool, char *, char *, char *, char *, char *)); +extern bool inittls __P((SSL_CTX **, unsigned long, long, bool, char *, char *, char *, char *, char *)); extern bool initclttls __P((bool)); extern void setclttls __P((bool)); extern bool initsrvtls __P((bool)); @@ -1906,6 +1911,7 @@ EXTERN char *CRLFile; /* file CRLs */ EXTERN char *CRLPath; /* path to CRLs (dir. with hashes) */ #endif /* _FFR_CRLPATH */ EXTERN unsigned long TLS_Srv_Opts; /* TLS server options */ +EXTERN long Srv_SSL_Options, Clt_SSL_Options; /* SSL options */ #endif /* STARTTLS */ /* @@ -1986,6 +1992,9 @@ EXTERN int QueueFileMode; /* mode on files in mail queue */ EXTERN int QueueMode; /* which queue items to act upon */ EXTERN int QueueSortOrder; /* queue sorting order algorithm */ EXTERN time_t MinQueueAge; /* min delivery interval */ +#if _FFR_EXPDELAY +EXTERN time_t MaxQueueAge; /* max delivery interval */ +#endif /* _FFR_EXPDELAY */ EXTERN time_t QueueIntvl; /* intervals between running the queue */ EXTERN char *QueueDir; /* location of queue directory */ EXTERN QUEUE_CHAR *QueueLimitId; /* limit queue run to id */ @@ -2235,11 +2244,16 @@ EXTERN bool UseNameServer; /* using DNS -- interpret h_errno & MX RRs */ EXTERN char InetMode; /* default network for daemon mode */ EXTERN char OpMode; /* operation mode, see below */ EXTERN char SpaceSub; /* substitution for */ -EXTERN int BadRcptThrottle; /* Throttle rejected RCPTs per SMTP message */ #if _FFR_BADRCPT_SHUTDOWN EXTERN int BadRcptShutdown; /* Shutdown connection for rejected RCPTs */ EXTERN int BadRcptShutdownGood; /* above even when there are good RCPTs */ #endif /* _FFR_BADRCPT_SHUTDOWN */ +EXTERN int BadRcptThrottle; /* Throttle rejected RCPTs per SMTP message */ +#if _FFR_RCPTTHROTDELAY +EXTERN unsigned int BadRcptThrottleDelay; /* delay for BadRcptThrottle */ +#else +# define BadRcptThrottleDelay 1 +#endif /* _FFR_RCPTTHROTDELAY */ EXTERN int CheckpointInterval; /* queue file checkpoint interval */ EXTERN int ConfigLevel; /* config file level */ EXTERN int ConnRateThrottle; /* throttle for SMTP connection rate */ diff --git a/contrib/sendmail/src/sfsasl.c b/contrib/sendmail/src/sfsasl.c index 67e919f34df3..cad16db1686a 100644 --- a/contrib/sendmail/src/sfsasl.c +++ b/contrib/sendmail/src/sfsasl.c @@ -9,7 +9,7 @@ */ #include -SM_RCSID("@(#)$Id: sfsasl.c,v 8.117 2008/01/31 18:48:29 ca Exp $") +SM_RCSID("@(#)$Id: sfsasl.c,v 8.118 2008/07/22 15:12:48 ca Exp $") #include #include #include @@ -296,7 +296,7 @@ sasl_write(fp, buf, size) /* ** Fetch the maximum input buffer size for sasl_encode(). ** This can be less than the size set in attemptauth() - ** due to a negotation with the other side, e.g., + ** due to a negotiation with the other side, e.g., ** Cyrus IMAP lmtp program sets maxbuf=4096, ** digestmd5 substracts 25 and hence we'll get 4071 ** instead of 8192 (MAXOUTLEN). diff --git a/contrib/sendmail/src/srvrsmtp.c b/contrib/sendmail/src/srvrsmtp.c index fffcd0d37ab7..49016e4572b5 100644 --- a/contrib/sendmail/src/srvrsmtp.c +++ b/contrib/sendmail/src/srvrsmtp.c @@ -17,7 +17,7 @@ # include #endif /* MILTER */ -SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.975 2008/03/31 16:32:13 ca Exp $") +SM_RCSID("@(#)$Id: srvrsmtp.c,v 8.989 2009/12/18 17:08:01 ca Exp $") #include #include @@ -479,6 +479,9 @@ do \ e->e_sendqueue = NULL; \ e->e_flags |= EF_CLRQUEUE; \ \ + if (tTd(92, 2)) \ + sm_dprintf("CLEAR_STATE: e_id=%s, EF_LOGSENDER=%d, LogLevel=%d\n",\ + e->e_id, bitset(EF_LOGSENDER, e->e_flags), LogLevel);\ if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) \ logsender(e, NULL); \ e->e_flags &= ~EF_LOGSENDER; \ @@ -486,7 +489,7 @@ do \ /* clean up a bit */ \ smtp.sm_gotmail = false; \ SuprErrs = true; \ - dropenvelope(e, true, false); \ + (void) dropenvelope(e, true, false); \ sm_rpool_free(e->e_rpool); \ e = newenvelope(e, CurEnv, sm_rpool_new_x(NULL)); \ CurEnv = e; \ @@ -906,6 +909,16 @@ smtp(nullserver, d_flags, e) #endif /* SASL */ #if STARTTLS +# if USE_OPENSSL_ENGINE + if (tls_ok_srv && bitset(SRV_OFFER_TLS, features) && + !SSL_set_engine(NULL)) + { + sm_syslog(LOG_ERR, NOQID, + "STARTTLS=server, SSL_set_engine=failed"); + tls_ok_srv = false; + } +# endif /* USE_OPENSSL_ENGINE */ + set_tls_rd_tmo(TimeOuts.to_nextcommand); #endif /* STARTTLS */ @@ -1272,7 +1285,8 @@ smtp(nullserver, d_flags, e) { if (++np_log < 3) sm_syslog(LOG_INFO, NOQID, - "unauthorized PIPELINING, sleeping"); + "unauthorized PIPELINING, sleeping, relay=%.100s", + CurSmtpClient); sleep(1); } @@ -1447,8 +1461,9 @@ smtp(nullserver, d_flags, e) message("454 4.5.4 Internal error: unable to encode64"); if (LogLevel > 5) sm_syslog(LOG_WARNING, e->e_id, - "AUTH encode64 error [%d for \"%s\"]", - result, out); + "AUTH encode64 error [%d for \"%s\"], relay=%.100s", + result, out, + CurSmtpClient); /* start over? */ authenticating = SASL_NOT_AUTH; } @@ -1469,16 +1484,17 @@ smtp(nullserver, d_flags, e) message("535 5.7.0 authentication failed"); if (LogLevel > 9) sm_syslog(LOG_WARNING, e->e_id, - "AUTH failure (%s): %s (%d) %s", + "AUTH failure (%s): %s (%d) %s, relay=%.100s", auth_type, sasl_errstring(result, NULL, NULL), result, # if SASL >= 20000 - sasl_errdetail(conn)); + sasl_errdetail(conn), # else /* SASL >= 20000 */ - errstr == NULL ? "" : errstr); + errstr == NULL ? "" : errstr, # endif /* SASL >= 20000 */ + CurSmtpClient); RESET_SASLCONN; authenticating = SASL_NOT_AUTH; } @@ -1700,8 +1716,9 @@ smtp(nullserver, d_flags, e) q); if (LogLevel > 5) sm_syslog(LOG_WARNING, e->e_id, - "AUTH decode64 error [%d for \"%s\"]", - result, q); + "AUTH decode64 error [%d for \"%s\"], relay=%.100s", + result, q, + CurSmtpClient); /* start over? */ authenticating = SASL_NOT_AUTH; # if SASL >= 20000 @@ -1734,16 +1751,17 @@ smtp(nullserver, d_flags, e) message("535 5.7.0 authentication failed"); if (LogLevel > 9) sm_syslog(LOG_ERR, e->e_id, - "AUTH failure (%s): %s (%d) %s", + "AUTH failure (%s): %s (%d) %s, relay=%.100s", p, sasl_errstring(result, NULL, NULL), result, # if SASL >= 20000 - sasl_errdetail(conn)); + sasl_errdetail(conn), # else /* SASL >= 20000 */ - errstr); + errstr, # endif /* SASL >= 20000 */ + CurSmtpClient); RESET_SASLCONN; break; } @@ -1893,8 +1911,9 @@ smtp(nullserver, d_flags, e) if (LogLevel > 5) { sm_syslog(LOG_WARNING, NOQID, - "STARTTLS=server, error: accept failed=%d, SSL_error=%d, errno=%d, retry=%d", - r, ssl_err, errno, i); + "STARTTLS=server, error: accept failed=%d, SSL_error=%d, errno=%d, retry=%d, relay=%.100s", + r, ssl_err, errno, i, + CurSmtpClient); if (LogLevel > 8) tlslogerr("server"); } @@ -2532,7 +2551,7 @@ smtp(nullserver, d_flags, e) #if _FFR_BADRCPT_SHUTDOWN /* ** hack to deal with hack, see below: - ** n_badrcpts is increased is limit is reached. + ** n_badrcpts is increased if limit is reached. */ n_badrcpts_adj = (BadRcptThrottle > 0 && @@ -2576,12 +2595,12 @@ smtp(nullserver, d_flags, e) /* ** Don't use exponential backoff for now. - ** Some servers will open more connections + ** Some systems will open more connections ** and actually overload the receiver even ** more. */ - (void) sleep(1); + (void) sleep(BadRcptThrottleDelay); } if (!smtp.sm_gotmail) { @@ -3147,6 +3166,11 @@ doquit: milter_quit(e); #endif /* MILTER */ + if (tTd(92, 2)) + sm_dprintf("QUIT: e_id=%s, EF_LOGSENDER=%d, LogLevel=%d\n", + e->e_id, + bitset(EF_LOGSENDER, e->e_flags), + LogLevel); if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) logsender(e, NULL); e->e_flags &= ~EF_LOGSENDER; @@ -3358,6 +3382,11 @@ smtp_data(smtp, e) response); LogUsrErrs = false; } +#if _FFR_MILTER_ENHSC + if (ISSMTPCODE(response)) + (void) extenhsc(response + 4, ' ', e->e_enhsc); +#endif /* _FFR_MILTER_ENHSC */ + usrerr(response); if (strncmp(response, "421 ", 4) == 0 || strncmp(response, "421-", 4) == 0) @@ -3374,6 +3403,10 @@ smtp_data(smtp, e) "Milter: cmd=data, reject=550 5.7.1 Command rejected"); LogUsrErrs = false; } +#if _FFR_MILTER_ENHSC + (void) sm_strlcpy(e->e_enhsc, "5.7.1", + sizeof(e->e_enhsc)); +#endif /* _FFR_MILTER_ENHSC */ usrerr("550 5.7.1 Command rejected"); return true; @@ -3392,6 +3425,9 @@ smtp_data(smtp, e) MSG_TEMPFAIL); LogUsrErrs = false; } +#if _FFR_MILTER_ENHSC + (void) extenhsc(MSG_TEMPFAIL + 4, ' ', e->e_enhsc); +#endif /* _FFR_MILTER_ENHSC */ usrerr(MSG_TEMPFAIL); return true; @@ -3467,7 +3503,14 @@ smtp_data(smtp, e) "Milter: data, reject=%s", response); milteraccept = false; +#if _FFR_MILTER_ENHSC + if (ISSMTPCODE(response)) + (void) extenhsc(response + 4, ' ', e->e_enhsc); +#endif /* _FFR_MILTER_ENHSC */ usrerr(response); + if (strncmp(response, "421 ", 4) == 0 + || strncmp(response, "421-", 4) == 0) + rv = false; break; case SMFIR_REJECT: @@ -3492,6 +3535,9 @@ smtp_data(smtp, e) "Milter: data, reject=%s", MSG_TEMPFAIL); milteraccept = false; +#if _FFR_MILTER_ENHSC + (void) extenhsc(MSG_TEMPFAIL + 4, ' ', e->e_enhsc); +#endif /* _FFR_MILTER_ENHSC */ usrerr(MSG_TEMPFAIL); break; @@ -3782,6 +3828,9 @@ smtp_data(smtp, e) } abortmessage: + if (tTd(92, 2)) + sm_dprintf("abortmessage: e_id=%s, EF_LOGSENDER=%d, LogLevel=%d\n", + e->e_id, bitset(EF_LOGSENDER, e->e_flags), LogLevel); if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) logsender(e, NULL); e->e_flags &= ~EF_LOGSENDER; @@ -3795,7 +3844,7 @@ smtp_data(smtp, e) */ if (aborting || bitset(EF_DISCARD, e->e_flags)) - dropenvelope(e, true, false); + (void) dropenvelope(e, true, false); else { for (ee = e; ee != NULL; ee = ee->e_sibling) @@ -3804,11 +3853,11 @@ smtp_data(smtp, e) QueueMode != QM_QUARANTINE && ee->e_quarmsg != NULL) { - dropenvelope(ee, true, false); + (void) dropenvelope(ee, true, false); continue; } if (WILL_BE_QUEUED(ee->e_sendmode)) - dropenvelope(ee, true, false); + (void) dropenvelope(ee, true, false); } } @@ -3870,8 +3919,13 @@ logundelrcpts(e, msg, level, all) if (!QS_IS_UNDELIVERED(a->q_state) && !all) continue; e->e_to = a->q_paddr; - logdelivery(NULL, NULL, a->q_status, msg, NULL, - (time_t) 0, e); + logdelivery(NULL, NULL, +#if _FFR_MILTER_ENHSC + (a->q_status == NULL && e->e_enhsc[0] != '\0') + ? e->e_enhsc : +#endif /* _FFR_MILTER_ENHSC */ + a->q_status, + msg, NULL, (time_t) 0, e); } e->e_to = NULL; } @@ -4692,8 +4746,9 @@ initsrvtls(tls_ok) return false; /* do NOT remove assignment */ - tls_ok_srv = inittls(&srv_ctx, TLS_Srv_Opts, true, SrvCertFile, - SrvKeyFile, CACertPath, CACertFile, DHParams); + tls_ok_srv = inittls(&srv_ctx, TLS_Srv_Opts, Srv_SSL_Options, true, + SrvCertFile, SrvKeyFile, + CACertPath, CACertFile, DHParams); return tls_ok_srv; } #endif /* STARTTLS */ diff --git a/contrib/sendmail/src/tls.c b/contrib/sendmail/src/tls.c index 1a213cab68ee..70319944950c 100644 --- a/contrib/sendmail/src/tls.c +++ b/contrib/sendmail/src/tls.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2006 Sendmail, Inc. and its suppliers. + * Copyright (c) 2000-2006, 2008, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set @@ -10,7 +10,7 @@ #include -SM_RCSID("@(#)$Id: tls.c,v 8.107 2006/10/12 21:35:11 ca Exp $") +SM_RCSID("@(#)$Id: tls.c,v 8.114 2009/08/10 15:11:09 ca Exp $") #if STARTTLS # include @@ -486,6 +486,7 @@ tls_safe_f(var, sff, srv) ** Parameters: ** ctx -- pointer to context ** req -- requirements for initialization (see sendmail.h) +** options -- options ** srv -- server side? ** certfile -- filename of certificate ** keyfile -- filename of private key @@ -514,9 +515,10 @@ static char server_session_id_context[] = "sendmail8"; #endif bool -inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam) +inittls(ctx, req, options, srv, certfile, keyfile, cacertpath, cacertfile, dhparam) SSL_CTX **ctx; unsigned long req; + long options; bool srv; char *certfile, *keyfile, *cacertpath, *cacertfile, *dhparam; { @@ -525,7 +527,7 @@ inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam) # endif /* !NO_DH */ int r; bool ok; - long sff, status, options; + long sff, status; char *who; # if _FFR_TLS_1 char *cf2, *kf2; @@ -643,7 +645,10 @@ inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam) } } if (dhparam == NULL) + { dhparam = srv ? "1" : "5"; + req |= (srv ? TLS_I_DH1024 : TLS_I_DH512); + } else if (*dhparam == '/') { TLS_OK_F(dhparam, "DHParameters", @@ -913,7 +918,6 @@ inittls(ctx, req, srv, certfile, keyfile, cacertpath, cacertfile, dhparam) /* SSL_CTX_set_quiet_shutdown(*ctx, 1); violation of standard? */ - options = SSL_OP_ALL; /* bug compatibility? */ #if SM_SSL_OP_TLS_BLOCK_PADDING_BUG /* @@ -1196,23 +1200,62 @@ tls_get_info(ssl, srv, host, mac, certreq) if (cert != NULL) { unsigned int n; + X509_NAME *subj, *issuer; unsigned char md[EVP_MAX_MD_SIZE]; char buf[MAXNAME]; - X509_NAME_oneline(X509_get_subject_name(cert), - buf, sizeof(buf)); + subj = X509_get_subject_name(cert); + issuer = X509_get_issuer_name(cert); + X509_NAME_oneline(subj, buf, sizeof(buf)); macdefine(mac, A_TEMP, macid("{cert_subject}"), xtextify(buf, "<>\")")); - X509_NAME_oneline(X509_get_issuer_name(cert), - buf, sizeof(buf)); + X509_NAME_oneline(issuer, buf, sizeof(buf)); macdefine(mac, A_TEMP, macid("{cert_issuer}"), xtextify(buf, "<>\")")); - X509_NAME_get_text_by_NID(X509_get_subject_name(cert), - NID_commonName, buf, sizeof(buf)); + +#define CHECK_X509_NAME(which) \ + do { \ + if (r == -1) \ + { \ + sm_strlcpy(buf, "BadCertificateUnknown", sizeof(buf)); \ + if (LogLevel > 7) \ + sm_syslog(LOG_INFO, NOQID, \ + "STARTTLS=%s, relay=%.100s, field=%s, status=failed to extract CN", \ + who, \ + host == NULL ? "local" : host, \ + which); \ + } \ + else if ((size_t)r >= sizeof(buf) - 1) \ + { \ + sm_strlcpy(buf, "BadCertificateTooLong", sizeof(buf)); \ + if (LogLevel > 7) \ + sm_syslog(LOG_INFO, NOQID, \ + "STARTTLS=%s, relay=%.100s, field=%s, status=CN too long", \ + who, \ + host == NULL ? "local" : host, \ + which); \ + } \ + else if ((size_t)r > strlen(buf)) \ + { \ + sm_strlcpy(buf, "BadCertificateContainsNUL", \ + sizeof(buf)); \ + if (LogLevel > 7) \ + sm_syslog(LOG_INFO, NOQID, \ + "STARTTLS=%s, relay=%.100s, field=%s, status=CN contains NUL", \ + who, \ + host == NULL ? "local" : host, \ + which); \ + } \ + } while (0) + + r = X509_NAME_get_text_by_NID(subj, NID_commonName, buf, + sizeof buf); + CHECK_X509_NAME("cn_subject"); macdefine(mac, A_TEMP, macid("{cn_subject}"), xtextify(buf, "<>\")")); - X509_NAME_get_text_by_NID(X509_get_issuer_name(cert), - NID_commonName, buf, sizeof(buf)); + r = X509_NAME_get_text_by_NID(issuer, NID_commonName, buf, + sizeof buf); + CHECK_X509_NAME("cn_issuer"); macdefine(mac, A_TEMP, macid("{cn_issuer}"), xtextify(buf, "<>\")")); n = 0; @@ -1596,14 +1639,19 @@ tls_verify_cb(ctx, unused) { int ok; + /* + ** man SSL_CTX_set_cert_verify_callback(): + ** callback should return 1 to indicate verification success + ** and 0 to indicate verification failure. + */ + ok = X509_verify_cert(ctx); - if (ok == 0) + if (ok <= 0) { if (LogLevel > 13) return tls_verify_log(ok, ctx, "TLS"); - return 1; /* override it */ } - return ok; + return 1; } /* ** TLSLOGERR -- log the errors from the TLS error stack diff --git a/contrib/sendmail/src/usersmtp.c b/contrib/sendmail/src/usersmtp.c index b29495c3ae7f..23278b0b59d7 100644 --- a/contrib/sendmail/src/usersmtp.c +++ b/contrib/sendmail/src/usersmtp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2006, 2008 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2006, 2008, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: usersmtp.c,v 8.472 2008/01/31 18:48:29 ca Exp $") +SM_RCSID("@(#)$Id: usersmtp.c,v 8.473 2009/06/17 17:26:51 ca Exp $") #include @@ -1568,7 +1568,9 @@ attemptauth(m, mci, e, sai) sasl_interact_t *client_interact = NULL; char *mechusing; sasl_security_properties_t ssp; - char in64[MAXOUTLEN]; + + /* MUST NOT be a multiple of 4: bug in some sasl_encode64() versions */ + char in64[MAXOUTLEN + 1]; #if NETINET || (NETINET6 && SASL >= 20000) extern SOCKADDR CurHostAddr; #endif /* NETINET || (NETINET6 && SASL >= 20000) */ @@ -1770,7 +1772,8 @@ attemptauth(m, mci, e, sai) } else { - saslresult = sasl_encode64(out, outlen, in64, MAXOUTLEN, NULL); + saslresult = sasl_encode64(out, outlen, in64, sizeof(in64), + NULL); if (saslresult != SASL_OK) /* internal error */ { if (LogLevel > 8) @@ -1837,7 +1840,7 @@ attemptauth(m, mci, e, sai) if (outlen > 0) { saslresult = sasl_encode64(out, outlen, in64, - MAXOUTLEN, NULL); + sizeof(in64), NULL); if (saslresult != SASL_OK) { /* give an error reply to the other side! */ diff --git a/contrib/sendmail/src/util.c b/contrib/sendmail/src/util.c index dab596130500..ab491fbfe52b 100644 --- a/contrib/sendmail/src/util.c +++ b/contrib/sendmail/src/util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2007, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: util.c,v 8.414 2007/11/02 17:30:38 ca Exp $") +SM_RCSID("@(#)$Id: util.c,v 8.416 2009/12/18 17:05:26 ca Exp $") #include #include @@ -868,7 +868,7 @@ xputs(fp, s) c &= 0177; } printchar: - if (isprint(c)) + if (isascii(c) && isprint(c)) { (void) sm_io_putc(fp, SM_TIME_DEFAULT, c); continue; @@ -895,7 +895,7 @@ xputs(fp, s) TermEscape.te_rv_on); shiftout = true; } - if (isprint(c)) + if (isascii(c) && isprint(c)) { (void) sm_io_putc(fp, SM_TIME_DEFAULT, '\\'); (void) sm_io_putc(fp, SM_TIME_DEFAULT, c); diff --git a/contrib/sendmail/src/version.c b/contrib/sendmail/src/version.c index 3e5ee8e6fdcc..cb94d0f2c574 100644 --- a/contrib/sendmail/src/version.c +++ b/contrib/sendmail/src/version.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2008 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,6 +13,6 @@ #include -SM_RCSID("@(#)$Id: version.c,v 8.208 2008/04/17 17:04:30 ca Exp $") +SM_RCSID("@(#)$Id: version.c,v 8.218 2009/12/23 04:43:09 ca Exp $") -char Version[] = "8.14.3"; +char Version[] = "8.14.4"; diff --git a/contrib/sendmail/vacation/vacation.c b/contrib/sendmail/vacation/vacation.c index 10712b8ed8b0..2ead0b86cbee 100644 --- a/contrib/sendmail/vacation/vacation.c +++ b/contrib/sendmail/vacation/vacation.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers. + * Copyright (c) 1999-2002, 2009 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1987, 1993 * The Regents of the University of California. All rights reserved. @@ -14,13 +14,13 @@ #include SM_IDSTR(copyright, -"@(#) Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers.\n\ +"@(#) Copyright (c) 1999-2002, 2009 Sendmail, Inc. and its suppliers.\n\ All rights reserved.\n\ Copyright (c) 1983, 1987, 1993\n\ The Regents of the University of California. All rights reserved.\n\ Copyright (c) 1983 Eric P. Allman. All rights reserved.\n") -SM_IDSTR(id, "@(#)$Id: vacation.c,v 8.144 2007/05/11 18:50:36 ca Exp $") +SM_IDSTR(id, "@(#)$Id: vacation.c,v 8.146 2009/08/07 21:28:39 ca Exp $") #include @@ -153,7 +153,7 @@ main(argc, argv) char *dbfilename = NULL; char *msgfilename = NULL; char *cfpath = NULL; - char *name; + char *name = NULL; char *returnaddr = NULL; SMDB_USER_INFO user_info; static char rnamebuf[MAXNAME]; @@ -299,7 +299,7 @@ main(argc, argv) "vacation: no such user uid %u.\n", getuid()); EXITM(EX_NOUSER); } - name = pw->pw_name; + name = strdup(pw->pw_name); user_info.smdbu_id = pw->pw_uid; user_info.smdbu_group_id = pw->pw_gid; (void) sm_strlcpy(user_info.smdbu_name, pw->pw_name, @@ -314,7 +314,7 @@ main(argc, argv) } else if (runasuser) { - name = *argv; + name = strdup(*argv); if (dbfilename == NULL || msgfilename == NULL) { msglog(LOG_NOTICE, @@ -358,7 +358,7 @@ main(argc, argv) sm_strexit(err)); EXITM(err); } - name = user.mbdb_name; + name = strdup(user.mbdb_name); if (chdir(user.mbdb_homedir) != 0) { msglog(LOG_NOTICE, @@ -371,6 +371,12 @@ main(argc, argv) (void) sm_strlcpy(user_info.smdbu_name, user.mbdb_name, SMDB_MAX_USER_NAME_LEN); } + if (name == NULL) + { + msglog(LOG_ERR, + "vacation: can't allocate memory for username.\n"); + EXITM(EX_OSERR); + } if (dbfilename == NULL) dbfilename = VDB; @@ -1032,6 +1038,14 @@ sendmessage(myname, msgfn, sender) (void *) &(pvect[1]), SM_IO_WRONLY, NULL)) != NULL) { +#if _FFR_VAC_WAIT4SM +# ifdef WAITUNION + union wait st; +# else /* WAITUNION */ + auto int st; +# endif /* WAITUNION */ +#endif /* _FFR_VAC_WAIT4SM */ + (void) sm_io_fprintf(sfp, SM_TIME_DEFAULT, "To: %s\n", From); (void) sm_io_fprintf(sfp, SM_TIME_DEFAULT, "Auto-Submitted: auto-replied\n"); @@ -1039,6 +1053,9 @@ sendmessage(myname, msgfn, sender) (void) sm_io_fputs(sfp, SM_TIME_DEFAULT, buf); (void) sm_io_close(mfp, SM_TIME_DEFAULT); (void) sm_io_close(sfp, SM_TIME_DEFAULT); +#if _FFR_VAC_WAIT4SM + (void) wait(&st); +#endif /* _FFR_VAC_WAIT4SM */ } else { diff --git a/contrib/smbfs/smbutil/view.c b/contrib/smbfs/smbutil/view.c index 87f5e0cc7fc6..1af0d9bcea89 100644 --- a/contrib/smbfs/smbutil/view.c +++ b/contrib/smbfs/smbutil/view.c @@ -69,6 +69,7 @@ cmd_view(int argc, char *argv[]) struct smb_ctx sctx, *ctx = &sctx; struct smb_share_info_1 *rpbuf, *ep; char *cp; + u_int32_t remark; u_int16_t type; int error, opt, bufsize, i, entries, total; @@ -117,11 +118,13 @@ cmd_view(int argc, char *argv[]) } for (ep = rpbuf, i = 0; i < entries; i++, ep++) { type = le16toh(ep->shi1_type); + remark = le32toh(ep->shi1_remark); + remark &= 0xFFFF; - cp = (char*)rpbuf + ep->shi1_remark; + cp = (char*)rpbuf + remark; printf("%-12s %-10s %s\n", ep->shi1_netname, shtype[min(type, sizeof shtype / sizeof(char *) - 1)], - ep->shi1_remark ? nls_str_toloc(cp, cp) : ""); + remark ? nls_str_toloc(cp, cp) : ""); } printf("\n%d shares listed from %d available\n", entries, total); free(rpbuf); diff --git a/contrib/tcp_wrappers/hosts_access.c b/contrib/tcp_wrappers/hosts_access.c index 8220e6497065..03d305b7dc2c 100644 --- a/contrib/tcp_wrappers/hosts_access.c +++ b/contrib/tcp_wrappers/hosts_access.c @@ -148,6 +148,7 @@ struct request_info *request; char *sh_cmd; /* becomes optional shell command */ int match = NO; struct tcpd_context saved_context; + char *cp; saved_context = tcpd_context; /* stupid compilers */ @@ -164,7 +165,16 @@ struct request_info *request; tcpd_warn("missing newline or line too long"); continue; } - if (sv_list[0] == '#' || sv_list[strspn(sv_list, " \t\r\n")] == 0) + /* Ignore anything after unescaped # character */ + for (cp = strchr(sv_list, '#'); cp != NULL;) { + if (cp > sv_list && cp[-1] == '\\') { + cp = strchr(cp + 1, '#'); + continue; + } + *cp = '\0'; + break; + } + if (sv_list[strspn(sv_list, " \t\r\n")] == 0) continue; if ((cl_list = split_at(sv_list, ':')) == 0) { tcpd_warn("missing \":\" separator"); diff --git a/contrib/tcpdump/print-tcp.c b/contrib/tcpdump/print-tcp.c index 5b0a7969a583..4200c319372d 100644 --- a/contrib/tcpdump/print-tcp.c +++ b/contrib/tcpdump/print-tcp.c @@ -124,6 +124,7 @@ struct tok tcp_option_values[] = { { TCPOPT_CCECHO, "" }, { TCPOPT_SIGNATURE, "md5" }, { TCPOPT_AUTH, "enhanced auth" }, + { TCPOPT_UTO, "uto" }, { 0, NULL } }; @@ -613,6 +614,17 @@ tcp_print(register const u_char *bp, register u_int length, */ break; + case TCPOPT_UTO: + datalen = 2; + LENCHECK(datalen); + uint utoval = EXTRACT_16BITS(cp); + if (utoval & 0x0001) + utoval = (utoval >> 1) * 60; + else + utoval >>= 1; + (void)printf(" %u", utoval); + break; + default: datalen = len - 2; for (i = 0; i < datalen; ++i) { diff --git a/contrib/tcpdump/tcp.h b/contrib/tcpdump/tcp.h index db7dd44775e6..1393a277cd91 100644 --- a/contrib/tcpdump/tcp.h +++ b/contrib/tcpdump/tcp.h @@ -83,6 +83,8 @@ struct tcphdr { #define TCPOLEN_SIGNATURE 18 #define TCP_SIGLEN 16 /* length of an option 19 digest */ #define TCPOPT_AUTH 20 /* Enhanced AUTH option */ +#define TCPOPT_UTO 28 /* tcp user timeout (rfc5482) */ +#define TCPOLEN_UTO 4 #define TCPOPT_TSTAMP_HDR \ (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) diff --git a/contrib/tcsh/sh.c b/contrib/tcsh/sh.c index 73b6d7f54832..f90eeab19423 100644 --- a/contrib/tcsh/sh.c +++ b/contrib/tcsh/sh.c @@ -1291,6 +1291,8 @@ main(int argc, char **argv) /* * Mop-up. */ + /* Take care of these (especially HUP) here instead of inside flush. */ + handle_pending_signals(); if (intty) { if (loginsh) { xprintf("logout\n"); diff --git a/contrib/telnet/telnet/externs.h b/contrib/telnet/telnet/externs.h index 73743c025ed8..cfa1aec372d9 100644 --- a/contrib/telnet/telnet/externs.h +++ b/contrib/telnet/telnet/externs.h @@ -57,7 +57,7 @@ #include #ifdef USE_TERMIO # ifndef VINTR -# include +# include # endif # define termio termios #endif diff --git a/contrib/telnet/telnetd/sys_term.c b/contrib/telnet/telnetd/sys_term.c index 7b2dbdb2dfa3..a7b0075f387d 100644 --- a/contrib/telnet/telnetd/sys_term.c +++ b/contrib/telnet/telnetd/sys_term.c @@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include "telnetd.h" #include "pathnames.h" @@ -55,19 +54,6 @@ __FBSDID("$FreeBSD$"); int cleanopen(char *); void scrub_env(void); -struct utmp wtmp; - -#ifdef _PATH_WTMP -char wtmpf[] = _PATH_WTMP; -#else -char wtmpf[] = "/var/log/wtmp"; -#endif -#ifdef _PATH_UTMP -char utmpf[] = _PATH_UTMP; -#else -char utmpf[] = "/var/run/utmp"; -#endif - char *envinit[3]; extern char **environ; @@ -1317,24 +1303,7 @@ scrub_env(void) void cleanup(int sig __unused) { - char *p; - sigset_t mask; - p = line + sizeof(_PATH_DEV) - 1; - /* - * Block all signals before clearing the utmp entry. We don't want to - * be called again after calling logout() and then not add the wtmp - * entry because of not finding the corresponding entry in utmp. - */ - sigfillset(&mask); - sigprocmask(SIG_SETMASK, &mask, NULL); - if (logout(p)) - logwtmp(p, "", ""); - (void)chmod(line, 0666); - (void)chown(line, 0, 0); - *p = 'p'; - (void)chmod(line, 0666); - (void)chown(line, 0, 0); - (void) shutdown(net, 2); + (void) shutdown(net, SHUT_RDWR); _exit(1); } diff --git a/contrib/telnet/telnetd/telnetd.c b/contrib/telnet/telnetd/telnetd.c index ad1e45953e9e..938f8533b216 100644 --- a/contrib/telnet/telnetd/telnetd.c +++ b/contrib/telnet/telnetd/telnetd.c @@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include @@ -693,7 +692,6 @@ doit(struct sockaddr *who) Please contact your net administrator"); remote_hostname[sizeof(remote_hostname) - 1] = '\0'; - trimdomain(remote_hostname, UT_HOSTSIZE); if (!isdigit(remote_hostname[0]) && strlen(remote_hostname) > utmp_len) err_ = getnameinfo(who, who->sa_len, remote_hostname, sizeof(remote_hostname), NULL, 0, diff --git a/contrib/top/username.c b/contrib/top/username.c index 23591866eb83..77f1517b706d 100644 --- a/contrib/top/username.c +++ b/contrib/top/username.c @@ -30,17 +30,17 @@ * This makes the table size independent of the passwd file size. */ +#include #include #include #include -#include #include "top.local.h" #include "utils.h" struct hash_el { int uid; - char name[UT_NAMESIZE + 1]; + char name[MAXLOGNAME]; }; #define is_empty_hash(x) (hash_table[x].name[0] == 0) @@ -129,7 +129,7 @@ int wecare; /* 1 = enter it always, 0 = nice to have */ /* empty or wrong slot -- fill it with new value */ hash_table[hashindex].uid = uid; - (void) strncpy(hash_table[hashindex].name, name, UT_NAMESIZE); + (void) strncpy(hash_table[hashindex].name, name, MAXLOGNAME - 1); return(hashindex); } diff --git a/lib/libc/stdtime/asctime.c b/contrib/tzcode/stdtime/asctime.c similarity index 100% rename from lib/libc/stdtime/asctime.c rename to contrib/tzcode/stdtime/asctime.c diff --git a/lib/libc/stdtime/ctime.3 b/contrib/tzcode/stdtime/ctime.3 similarity index 100% rename from lib/libc/stdtime/ctime.3 rename to contrib/tzcode/stdtime/ctime.3 diff --git a/lib/libc/stdtime/difftime.c b/contrib/tzcode/stdtime/difftime.c similarity index 100% rename from lib/libc/stdtime/difftime.c rename to contrib/tzcode/stdtime/difftime.c diff --git a/lib/libc/stdtime/localtime.c b/contrib/tzcode/stdtime/localtime.c similarity index 97% rename from lib/libc/stdtime/localtime.c rename to contrib/tzcode/stdtime/localtime.c index 9fc5f3ee99b7..bee916b03f99 100644 --- a/lib/libc/stdtime/localtime.c +++ b/contrib/tzcode/stdtime/localtime.c @@ -235,9 +235,14 @@ static struct state gmtmem; static char lcl_TZname[TZ_STRLEN_MAX + 1]; static int lcl_is_set; -static int gmt_is_set; +static pthread_once_t gmt_once = PTHREAD_ONCE_INIT; static pthread_rwlock_t lcl_rwlock = PTHREAD_RWLOCK_INITIALIZER; -static pthread_mutex_t gmt_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_once_t gmtime_once = PTHREAD_ONCE_INIT; +static pthread_key_t gmtime_key; +static int gmtime_key_error; +static pthread_once_t localtime_once = PTHREAD_ONCE_INIT; +static pthread_key_t localtime_key; +static int localtime_key_error; char * tzname[2] = { wildabbr, @@ -1407,27 +1412,24 @@ struct tm * const tmp; return result; } +static void +localtime_key_init(void) +{ + + localtime_key_error = _pthread_key_create(&localtime_key, free); +} + struct tm * localtime(timep) const time_t * const timep; { - static pthread_mutex_t localtime_mutex = PTHREAD_MUTEX_INITIALIZER; - static pthread_key_t localtime_key = -1; struct tm *p_tm; - int r; if (__isthreaded != 0) { - if (localtime_key < 0) { - _pthread_mutex_lock(&localtime_mutex); - if (localtime_key < 0) { - if ((r = _pthread_key_create(&localtime_key, - free)) != 0) { - _pthread_mutex_unlock(&localtime_mutex); - errno = r; - return(NULL); - } - } - _pthread_mutex_unlock(&localtime_mutex); + _pthread_once(&localtime_once, localtime_key_init); + if (localtime_key_error != 0) { + errno = localtime_key_error; + return(NULL); } p_tm = _pthread_getspecific(localtime_key); if (p_tm == NULL) { @@ -1464,6 +1466,17 @@ struct tm * tmp; return tmp; } +static void +gmt_init(void) +{ + +#ifdef ALL_STATE + gmtptr = (struct state *) malloc(sizeof *gmtptr); + if (gmtptr != NULL) +#endif /* defined ALL_STATE */ + gmtload(gmtptr); +} + /* ** gmtsub is to gmtime as localsub is to localtime. */ @@ -1476,16 +1489,7 @@ struct tm * const tmp; { register struct tm * result; - _MUTEX_LOCK(&gmt_mutex); - if (!gmt_is_set) { -#ifdef ALL_STATE - gmtptr = (struct state *) malloc(sizeof *gmtptr); - if (gmtptr != NULL) -#endif /* defined ALL_STATE */ - gmtload(gmtptr); - gmt_is_set = TRUE; - } - _MUTEX_UNLOCK(&gmt_mutex); + _once(&gmt_once, gmt_init); result = timesub(timep, offset, gmtptr, tmp); #ifdef TM_ZONE /* @@ -1509,27 +1513,24 @@ struct tm * const tmp; return result; } +static void +gmtime_key_init(void) +{ + + gmtime_key_error = _pthread_key_create(&gmtime_key, free); +} + struct tm * gmtime(timep) const time_t * const timep; { - static pthread_mutex_t gmtime_mutex = PTHREAD_MUTEX_INITIALIZER; - static pthread_key_t gmtime_key = -1; struct tm *p_tm; - int r; if (__isthreaded != 0) { - if (gmtime_key < 0) { - _pthread_mutex_lock(&gmtime_mutex); - if (gmtime_key < 0) { - if ((r = _pthread_key_create(&gmtime_key, - free)) != 0) { - _pthread_mutex_unlock(&gmtime_mutex); - errno = r; - return(NULL); - } - } - _pthread_mutex_unlock(&gmtime_mutex); + _pthread_once(&gmtime_once, gmtime_key_init); + if (gmtime_key_error != 0) { + errno = gmtime_key_error; + return(NULL); } /* * Changed to follow POSIX.1 threads standard, which diff --git a/lib/libc/stdtime/private.h b/contrib/tzcode/stdtime/private.h similarity index 100% rename from lib/libc/stdtime/private.h rename to contrib/tzcode/stdtime/private.h diff --git a/lib/libc/stdtime/time2posix.3 b/contrib/tzcode/stdtime/time2posix.3 similarity index 100% rename from lib/libc/stdtime/time2posix.3 rename to contrib/tzcode/stdtime/time2posix.3 diff --git a/lib/libc/stdtime/tzfile.5 b/contrib/tzcode/stdtime/tzfile.5 similarity index 99% rename from lib/libc/stdtime/tzfile.5 rename to contrib/tzcode/stdtime/tzfile.5 index 15625d273c9e..1606b5ae8c45 100644 --- a/lib/libc/stdtime/tzfile.5 +++ b/contrib/tzcode/stdtime/tzfile.5 @@ -147,6 +147,6 @@ such instants). .Xr ctime 3 , .Xr time2posix 3 , .Xr zic 8 -.\" @(#)tzfile.5 8.2 +.\" @(#)tzfile.5 8.3 .\" This file is in the public domain, so clarified as of .\" 1996-06-05 by Arthur David Olson. diff --git a/lib/libc/stdtime/tzfile.h b/contrib/tzcode/stdtime/tzfile.h similarity index 100% rename from lib/libc/stdtime/tzfile.h rename to contrib/tzcode/stdtime/tzfile.h diff --git a/contrib/tzcode/zic/README b/contrib/tzcode/zic/README new file mode 100644 index 000000000000..5cb701eca276 --- /dev/null +++ b/contrib/tzcode/zic/README @@ -0,0 +1,88 @@ +@(#)README 8.3 +This file is in the public domain, so clarified as of +2009-05-17 by Arthur David Olson. + +$FreeBSD$ + +"What time is it?" -- Richard Deacon as The King +"Any time you want it to be." -- Frank Baxter as The Scientist + (from the Bell System film "About Time") + +The 1989 update of the time zone package featured + +* POSIXization (including interpretation of POSIX-style TZ environment + variables, provided by Guy Harris), +* ANSIfication (including versions of "mktime" and "difftime"), +* SVIDulation (an "altzone" variable) +* MACHination (the "gtime" function) +* corrections to some time zone data (including corrections to the rules + for Great Britain and New Zealand) +* reference data from the United States Naval Observatory for folks who + want to do additional time zones +* and the 1989 data for Saudi Arabia. + +(Since this code will be treated as "part of the implementation" in some places +and as "part of the application" in others, there's no good way to name +functions, such as timegm, that are not part of the proposed ANSI C standard; +such functions have kept their old, underscore-free names in this update.) + +And the "dysize" function has disappeared; it was present to allow compilation +of the "date" command on old BSD systems, and a version of "date" is now +provided in the package. The "date" command is not created when you "make all" +since it may lack options provided by the version distributed with your +operating system, or may not interact with the system in the same way the +native version does. + +Since POSIX frowns on correct leap second handling, the default behavior of +the "zic" command (in the absence of a "-L" option) has been changed to omit +leap second information from its output files. + +Here is a recipe for acquiring, building, installing, and testing the +tz distribution on a GNU/Linux or similar host. + + mkdir tz + cd tz + wget 'ftp://elsie.nci.nih.gov/pub/tz*.tar.gz' + gzip -dc tzcode*.tar.gz | tar -xf - + gzip -dc tzdata*.tar.gz | tar -xf - + +Be sure to read the comments in "Makefile" and make any changes needed +to make things right for your system, especially if you are using some +platform other than GNU/Linux. Then run the following commands, +substituting your desired installation directory for "$HOME/tzdir": + + make TOPDIR=$HOME/tzdir install + $HOME/tzdir/etc/zdump -v America/Los_Angeles + +To use the new functions, use a "-ltz" option when compiling or linking. + +Historical local time information has been included here to: + +* provide a compendium of data about the history of civil time + that is useful even if the data are not 100% accurate; + +* give an idea of the variety of local time rules that have + existed in the past and thus an idea of the variety that may be + expected in the future; + +* provide a test of the generality of the local time rule description + system. + +The information in the time zone data files is by no means authoritative; +the files currently do not even attempt to cover all time stamps before +1970, and there are undoubtedly errors even for time stamps since 1970. +If you know that the rules are different from those in a file, by all means +feel free to change file (and please send the changed version to +tz@elsie.nci.nih.gov for use in the future). Europeans take note! + +Thanks to these Timezone Caballeros who've made major contributions to the +time conversion package: Keith Bostic; Bob Devine; Paul Eggert; Robert Elz; +Guy Harris; Mark Horton; John Mackin; and Bradley White. Thanks also to +Michael Bloom, Art Neilson, Stephen Prince, John Sovereign, and Frank Wales +for testing work, and to Gwillim Law for checking local mean time data. +None of them are responsible for remaining errors. + +Look in the ~ftp/pub directory of elsie.nci.nih.gov +for updated versions of these files. + +Please send comments or information to tz@elsie.nci.nih.gov. diff --git a/usr.sbin/zic/Theory b/contrib/tzcode/zic/Theory similarity index 98% rename from usr.sbin/zic/Theory rename to contrib/tzcode/zic/Theory index 8e933659a46b..752125c95a56 100644 --- a/usr.sbin/zic/Theory +++ b/contrib/tzcode/zic/Theory @@ -1,4 +1,4 @@ -@(#)Theory 8.3 +@(#)Theory 8.4 This file is in the public domain, so clarified as of 2009-05-17 by Arthur David Olson. $FreeBSD$ @@ -361,10 +361,10 @@ abbreviations like `EST'; this avoids the ambiguity. Calendrical issues are a bit out of scope for a time zone database, but they indicate the sort of problems that we would run into if we extended the time zone database further into the past. An excellent -resource in this area is Edward M. Reingold and Nachum Dershowitz, - -Calendrical Calculations: The Millennium Edition -, Cambridge University Press (2001). Other information and +resource in this area is Nachum Dershowitz and Edward M. Reingold, + +Calendrical Calculations: Third Edition +, Cambridge University Press (2008). Other information and sources are given below. They sometimes disagree. diff --git a/usr.sbin/zic/ialloc.c b/contrib/tzcode/zic/ialloc.c similarity index 100% rename from usr.sbin/zic/ialloc.c rename to contrib/tzcode/zic/ialloc.c diff --git a/usr.sbin/zic/private.h b/contrib/tzcode/zic/private.h similarity index 100% rename from usr.sbin/zic/private.h rename to contrib/tzcode/zic/private.h diff --git a/usr.sbin/zic/scheck.c b/contrib/tzcode/zic/scheck.c similarity index 100% rename from usr.sbin/zic/scheck.c rename to contrib/tzcode/zic/scheck.c diff --git a/usr.sbin/zic/zdump.8 b/contrib/tzcode/zic/zdump.8 similarity index 100% rename from usr.sbin/zic/zdump.8 rename to contrib/tzcode/zic/zdump.8 diff --git a/usr.sbin/zic/zdump.c b/contrib/tzcode/zic/zdump.c similarity index 98% rename from usr.sbin/zic/zdump.c rename to contrib/tzcode/zic/zdump.c index 263a5926320d..0f61125c7d67 100644 --- a/usr.sbin/zic/zdump.c +++ b/contrib/tzcode/zic/zdump.c @@ -6,7 +6,7 @@ #ifndef lint static const char rcsid[] = "$FreeBSD$"; -static char elsieid[] = "@(#)zdump.c 8.9"; +static char elsieid[] = "@(#)zdump.c 8.10"; #endif /* not lint */ /* @@ -152,7 +152,7 @@ static size_t longest; static char * progname; static int warned; -static void usage(const char *progname, FILE *stream, int status); +static void usage(FILE *stream, int status); static char * abbr(struct tm * tmp); static void abbrok(const char * abbrp, const char * zone); static long delta(struct tm * newp, struct tm * oldp); @@ -273,7 +273,7 @@ char * argv[]; if (strcmp(argv[i], "--version") == 0) { errx(EXIT_SUCCESS, "%s", elsieid); } else if (strcmp(argv[i], "--help") == 0) { - usage(progname, stdout, EXIT_SUCCESS); + usage(stdout, EXIT_SUCCESS); } vflag = 0; cutarg = NULL; @@ -283,7 +283,7 @@ char * argv[]; else cutarg = optarg; if ((c != -1) || (optind == argc - 1 && strcmp(argv[optind], "=") == 0)) { - usage(progname, stderr, EXIT_FAILURE); + usage(stderr, EXIT_FAILURE); } if (vflag) { if (cutarg != NULL) { @@ -468,7 +468,7 @@ const long y; } static void -usage(const char *progname, FILE *stream, int status) +usage(FILE *stream, int status) { fprintf(stream, _("usage: %s [--version] [-v] [--help] [-c [loyear,]hiyear] zonename ...\n\ diff --git a/contrib/tzcode/zic/zdump/Makefile b/contrib/tzcode/zic/zdump/Makefile new file mode 100644 index 000000000000..7ee8db324927 --- /dev/null +++ b/contrib/tzcode/zic/zdump/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/.. + +PROG= zdump +MAN= zdump.8 +SRCS= zdump.c ialloc.c scheck.c + +CFLAGS+= -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone -DSTD_INSPIRED -DPCTS +CFLAGS+= -DHAVE_LONG_DOUBLE -DTZDIR=\"/usr/share/zoneinfo\" -Demkdir=mkdir +CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../lib/libc/stdtime + +WARNS?= 2 + +.include diff --git a/usr.sbin/zic/zic.8 b/contrib/tzcode/zic/zic.8 similarity index 99% rename from usr.sbin/zic/zic.8 rename to contrib/tzcode/zic/zic.8 index 082ff259908c..f7ff815b080a 100644 --- a/usr.sbin/zic/zic.8 +++ b/contrib/tzcode/zic/zic.8 @@ -260,7 +260,7 @@ the variable part is null. .El .Pp A zone line has the form: -.Dl "Zone NAME GMTOFF RULES/SAVE FORMAT [UNTILYEAR [MONTH [DAY [TIME]]]] +.Dl "Zone NAME GMTOFF RULES/SAVE FORMAT [UNTILYEAR [MONTH [DAY [TIME]]]]" For example: .Dl "Zone Australia/Adelaide 9:30 Aus CST 1971 Oct 31 2:00 The fields that make up a zone line are: diff --git a/usr.sbin/zic/zic.c b/contrib/tzcode/zic/zic.c similarity index 100% rename from usr.sbin/zic/zic.c rename to contrib/tzcode/zic/zic.c diff --git a/contrib/tzcode/zic/zic/Makefile b/contrib/tzcode/zic/zic/Makefile new file mode 100644 index 000000000000..02dc6e2d710e --- /dev/null +++ b/contrib/tzcode/zic/zic/Makefile @@ -0,0 +1,16 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/.. + +PROG= zic +MAN= zic.8 +SRCS= zic.c ialloc.c scheck.c + +CFLAGS+= -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone -DSTD_INSPIRED -DPCTS +CFLAGS+= -DHAVE_LONG_DOUBLE -DTZDIR=\"/usr/share/zoneinfo\" -Demkdir=mkdir +CFLAGS+= -DHAVE_STRERROR -DHAVE_UNISTD_H +CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../lib/libc/stdtime + +WARNS?= 2 + +.include diff --git a/share/zoneinfo/africa b/contrib/tzdata/africa similarity index 100% rename from share/zoneinfo/africa rename to contrib/tzdata/africa diff --git a/share/zoneinfo/antarctica b/contrib/tzdata/antarctica similarity index 93% rename from share/zoneinfo/antarctica rename to contrib/tzdata/antarctica index 8511ab207e52..f18ae959e3e7 100644 --- a/share/zoneinfo/antarctica +++ b/contrib/tzdata/antarctica @@ -1,5 +1,5 @@ #
    -# @(#)antarctica	8.5
    +# @(#)antarctica	8.7
     # This file is in the public domain, so clarified as of
     # 2009-05-17 by Arthur David Olson.
     
    @@ -80,15 +80,38 @@ Rule	ChileAQ	2000	max	-	Mar	Sun>=9	3:00u	0	-
     # Davis, Vestfold Hills, -6835+07759, since 1957-01-13
     #	(except 1964-11 - 1969-02)
     # Mawson, Holme Bay, -6736+06253, since 1954-02-13
    +
    +# From Steffen Thorsen (2009-03-11):
    +# Three Australian stations in Antarctica have changed their time zone:
    +# Casey moved from UTC+8 to UTC+11
    +# Davis moved from UTC+7 to UTC+5
    +# Mawson moved from UTC+6 to UTC+5
    +# The changes occurred on 2009-10-18 at 02:00 (local times).
    +#
    +# Government source: (Australian Antarctic Division)
    +# 
    +# http://www.aad.gov.au/default.asp?casid=37079
    +# 
    +#
    +# We have more background information here:
    +# 
    +# http://www.timeanddate.com/news/time/antarctica-new-times.html
    +# 
    +
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     Zone Antarctica/Casey	0	-	zzz	1969
    -			8:00	-	WST	# Western (Aus) Standard Time
    +			8:00	-	WST	2009 Oct 18 2:00
    +						# Western (Aus) Standard Time
    +			11:00	-	CAST	# Casey Time
     Zone Antarctica/Davis	0	-	zzz	1957 Jan 13
     			7:00	-	DAVT	1964 Nov # Davis Time
     			0	-	zzz	1969 Feb
    -			7:00	-	DAVT
    +			7:00	-	DAVT	2009 Oct 18 2:00
    +			5:00	-	DAVT
     Zone Antarctica/Mawson	0	-	zzz	1954 Feb 13
    -			6:00	-	MAWT	# Mawson Time
    +			6:00	-	MAWT	2009 Oct 18 2:00
    +						# Mawson Time
    +			5:00	-	MAWT
     # References:
     # 
     # Casey Weather (1998-02-26)
    diff --git a/share/zoneinfo/asia b/contrib/tzdata/asia
    similarity index 88%
    rename from share/zoneinfo/asia
    rename to contrib/tzdata/asia
    index 7142b4552f3a..e9780acff3e7 100644
    --- a/share/zoneinfo/asia
    +++ b/contrib/tzdata/asia
    @@ -1,5 +1,4 @@
    -# 
    -# @(#)asia	8.40
    +# @(#)asia	8.51
     # This file is in the public domain, so clarified as of
     # 2009-05-17 by Arthur David Olson.
     
    @@ -172,11 +171,65 @@ Zone	Asia/Bahrain	3:22:20 -	LMT	1920		# Al Manamah
     #
     # No DST end date has been announced yet.
     
    -# From Arthur David Olson (2009-07-11):
    -# Arbitrarily end DST at the end of 2009 so that a POSIX-sytle time zone string
    -# can appear in the Dhaka binary file and for the benefit of old glibc
    -# reimplementations of the time zone software that mishandle permanent DST.
    -# A change will be required once the end date is known.
    +# From Alexander Krivenyshev (2009-09-25):
    +# Bangladesh won't go back to Standard Time from October 1, 2009, 
    +# instead it will continue DST measure till the cabinet makes a fresh decision. 
    +#
    +# Following report by same newspaper-"The Daily Star Friday":
    +# "DST change awaits cabinet decision-Clock won't go back by 1-hr from Oct 1"
    +# 
    +# http://www.thedailystar.net/newDesign/news-details.php?nid=107021
    +# 
    +# or
    +# 
    +# http://www.worldtimezone.com/dst_news/dst_news_bangladesh04.html
    +# 
    +
    +# From Steffen Thorsen (2009-10-13):
    +# IANS (Indo-Asian News Service) now reports:
    +# Bangladesh has decided that the clock advanced by an hour to make 
    +# maximum use of daylight hours as an energy saving measure would 
    +# "continue for an indefinite period."
    +#
    +# One of many places where it is published:
    +# 
    +# http://www.thaindian.com/newsportal/business/bangladesh-to-continue-indefinitely-with-advanced-time_100259987.html
    +# 
    +
    +# From Alexander Krivenyshev (2009-12-24):
    +# According to Bangladesh newspaper "The Daily Star,"
    +# Bangladesh will change its clock back to Standard Time on Dec 31, 2009.
    +#
    +# Clock goes back 1-hr on Dec 31 night.
    +# 
    +# http://www.thedailystar.net/newDesign/news-details.php?nid=119228
    +# 
    +# and
    +# 
    +# http://www.worldtimezone.com/dst_news/dst_news_bangladesh05.html
    +# 
    +#
    +# "...The government yesterday decided to put the clock back by one hour
    +# on December 31 midnight and the new time will continue until March 31,
    +# 2010 midnight. The decision came at a cabinet meeting at the Prime
    +# Minister's Office last night..."
    +
    +# From Danvin Ruangchan (2009-12-24):
    +# ...the news mentions DST will be turned off again 7 months after March
    +# 31st on Oct 31, 2010.
    +
    +# From Arthur David Olson (2009-12-26):
    +# Indeed, "The government will advance again the Banglasdesh Standard
    +# Time by one one hour on March 31 next year by enforcing the Daylight
    +# Saving Time (DST) for seven months. It will continue till October 31
    +# until further notice." I take that last sentence as the
    +# establishment of a rule.
    +
    +# Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
    +Rule	Dhaka	2009	only	-	Jun	19	23:00	1:00	S
    +Rule	Dhaka	2010	only	-	Jan	1	0:00	0	-
    +Rule	Dhaka	2010	max	-	Mar	31	23:00	1:00	S
    +Rule	Dhaka	2010	max	-	Nov	1	0:00	0	-
     
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     Zone	Asia/Dhaka	6:01:40 -	LMT	1890
    @@ -185,9 +238,8 @@ Zone	Asia/Dhaka	6:01:40 -	LMT	1890
     			5:30	-	IST	1942 Sep
     			6:30	-	BURT	1951 Sep 30
     			6:00	-	DACT	1971 Mar 26 # Dacca Time
    -			6:00	-	BDT	2009 Jun 19 23:00 # Bangladesh Time
    -			6:00	1:00	BDST	2010
    -			6:00	-	BDT
    +			6:00	-	BDT	2009
    +			6:00	Dhaka	BD%sT
     
     # Bhutan
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
    @@ -346,19 +398,152 @@ Zone	Asia/Urumqi	5:50:20	-	LMT	1928 # or Urumchi
     # West Xinjiang, including Aksu, Atushi, Yining, Hetian, Cele, Luopu, Nileke,
     # Zhaosu, Tekesi, Gongliu, Chabuchaer, Huocheng, Bole, Pishan, Suiding,
     # and Yarkand.
    +
    +# From Luther Ma (2009-10-17):
    +# Almost all (>99.9%) ethnic Chinese (properly ethnic Han) living in
    +# Xinjiang use Chinese Standard Time. Some are aware of Xinjiang time,
    +# but have no need of it. All planes, trains, and schools function on
    +# what is called "Beijing time." When Han make an appointment in Chinese
    +# they implicitly use Beijing time.
    +#
    +# On the other hand, ethnic Uyghurs, who make up about half the
    +# population of Xinjiang, typically use "Xinjiang time" which is two
    +# hours behind Beijing time, or UTC +0600. The government of the Xinjiang
    +# Uyghur Autonomous Region, (XAUR, or just Xinjiang for short) as well as
    +# local governments such as the Urumqi city government use both times in
    +# publications, referring to what is popularly called Xinjiang time as
    +# "Urumqi time." When Uyghurs make an appointment in the Uyghur language
    +# they almost invariably use Xinjiang time.
    +#
    +# (Their ethnic Han compatriots would typically have no clue of its
    +# widespread use, however, because so extremely few of them are fluent in
    +# Uyghur, comparable to the number of Anglo-Americans fluent in Navajo.)
    +#
    +# (...As with the rest of China there was a brief interval ending in 1990
    +# or 1991 when summer time was in use.  The confusion was severe, with
    +# the province not having dual times but four times in use at the same
    +# time. Some areas remained on standard Xinjiang time or Beijing time and
    +# others moving their clocks ahead.)
    +#
    +# ...an example of an official website using of Urumqi time.
    +#
    +# The first few lines of the Google translation of
    +# 
    +# http://www.fjysgl.gov.cn/show.aspx?id=2379&cid=39
    +# 
    +# (retrieved 2009-10-13)
    +# > Urumqi fire seven people are missing the alleged losses of at least
    +# > 500 million yuan
    +# >
    +# > (Reporter Dong Liu) the day before 20:20 or so (Urumqi Time 18:20),
    +# > Urumqi City Department of International Plaza Luther Qiantang River
    +# > burst fire. As of yesterday, 18:30, Urumqi City Fire officers and men
    +# > have worked continuously for 22 hours...
    +
    +# From Luther Ma (2009-11-19):
    +# With the risk of being redundant to previous answers these are the most common
    +# English "transliterations" (w/o using non-English symbols):
    +#
    +# 1. Wulumuqi...
    +# 2. Kashi...
    +# 3. Urumqi...
    +# 4. Kashgar...
    +# ...
    +# 5. It seems that Uyghurs in Urumqi has been using Xinjiang since at least the
    +# 1960's. I know of one Han, now over 50, who grew up in the surrounding
    +# countryside and used Xinjiang time as a child.
    +#
    +# 6. Likewise for Kashgar and the rest of south Xinjiang I don't know of any
    +# start date for Xinjiang time.
    +#
    +# Without having access to local historical records, nor the ability to legally
    +# publish them, I would go with October 1, 1949, when Xinjiang became the Uyghur
    +# Autonomous Region under the PRC. (Before that Uyghurs, of course, would also
    +# not be using Beijing time, but some local time.)
    +
     Zone	Asia/Kashgar	5:03:56	-	LMT	1928 # or Kashi or Kaxgar
     			5:30	-	KAST	1940	 # Kashgar Time
     			5:00	-	KAST	1980 May
     			8:00	PRC	C%sT
     
    +
    +# From Lee Yiu Chung (2009-10-24):
    +# I found there are some mistakes for the...DST rule for Hong
    +# Kong. [According] to the DST record from Hong Kong Observatory (actually,
    +# it is not [an] observatory, but the official meteorological agency of HK,
    +# and also serves as the official timing agency), there are some missing
    +# and incorrect rules. Although the exact switch over time is missing, I
    +# think 3:30 is correct. The official DST record for Hong Kong can be
    +# obtained from
    +# 
    +# http://www.hko.gov.hk/gts/time/Summertime.htm
    +# .
    +
    +# From Arthur David Olson (2009-10-28):
    +# Here are the dates given at
    +# 
    +# http://www.hko.gov.hk/gts/time/Summertime.htm
    +# 
    +# as of 2009-10-28:
    +# Year        Period
    +# 1941        1 Apr to 30 Sep
    +# 1942        Whole year 
    +# 1943        Whole year
    +# 1944        Whole year
    +# 1945        Whole year
    +# 1946        20 Apr to 1 Dec
    +# 1947        13 Apr to 30 Dec
    +# 1948        2 May to 31 Oct
    +# 1949        3 Apr to 30 Oct
    +# 1950        2 Apr to 29 Oct
    +# 1951        1 Apr to 28 Oct
    +# 1952        6 Apr to 25 Oct
    +# 1953        5 Apr to 1 Nov
    +# 1954        21 Mar to 31 Oct
    +# 1955        20 Mar to 6 Nov
    +# 1956        18 Mar to 4 Nov
    +# 1957        24 Mar to 3 Nov
    +# 1958        23 Mar to 2 Nov
    +# 1959        22 Mar to 1 Nov
    +# 1960        20 Mar to 6 Nov
    +# 1961        19 Mar to 5 Nov
    +# 1962        18 Mar to 4 Nov
    +# 1963        24 Mar to 3 Nov
    +# 1964        22 Mar to 1 Nov
    +# 1965        18 Apr to 17 Oct
    +# 1966        17 Apr to 16 Oct
    +# 1967        16 Apr to 22 Oct
    +# 1968        21 Apr to 20 Oct
    +# 1969        20 Apr to 19 Oct
    +# 1970        19 Apr to 18 Oct
    +# 1971        18 Apr to 17 Oct
    +# 1972        16 Apr to 22 Oct
    +# 1973        22 Apr to 21 Oct
    +# 1973/74     30 Dec 73 to 20 Oct 74
    +# 1975        20 Apr to 19 Oct
    +# 1976        18 Apr to 17 Oct
    +# 1977        Nil
    +# 1978        Nil
    +# 1979        13 May to 21 Oct
    +# 1980 to Now Nil
    +# The page does not give start or end times of day.
    +# The page does not give a start date for 1942.
    +# The page does not givw an end date for 1945.
    +# The Japanese occupation of Hong Kong began on 1941-12-25.
    +# The Japanese surrender of Hong Kong was signed 1945-09-15.
    +# For lack of anything better, use start of those days as the transition times.
    +
     # Hong Kong (Xianggang)
     # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
    +Rule	HK	1941	only	-	Apr	1	3:30	1:00	S
    +Rule	HK	1941	only	-	Sep	30	3:30	0	-
     Rule	HK	1946	only	-	Apr	20	3:30	1:00	S
     Rule	HK	1946	only	-	Dec	1	3:30	0	-
     Rule	HK	1947	only	-	Apr	13	3:30	1:00	S
     Rule	HK	1947	only	-	Dec	30	3:30	0	-
     Rule	HK	1948	only	-	May	2	3:30	1:00	S
    -Rule	HK	1948	1952	-	Oct	lastSun	3:30	0	-
    +Rule	HK	1948	1951	-	Oct	lastSun	3:30	0	-
    +Rule	HK	1952	only	-	Oct	25	3:30	0	-
     Rule	HK	1949	1953	-	Apr	Sun>=1	3:30	1:00	S
     Rule	HK	1953	only	-	Nov	1	3:30	0	-
     Rule	HK	1954	1964	-	Mar	Sun>=18	3:30	1:00	S
    @@ -366,13 +551,15 @@ Rule	HK	1954	only	-	Oct	31	3:30	0	-
     Rule	HK	1955	1964	-	Nov	Sun>=1	3:30	0	-
     Rule	HK	1965	1977	-	Apr	Sun>=16	3:30	1:00	S
     Rule	HK	1965	1977	-	Oct	Sun>=16	3:30	0	-
    -Rule	HK	1979	1980	-	May	Sun>=8	3:30	1:00	S
    -Rule	HK	1979	1980	-	Oct	Sun>=16	3:30	0	-
    +Rule	HK	1973	only	-	Dec	30	3:30	1:00	S
    +Rule	HK	1979	only	-	May	Sun>=8	3:30	1:00	S
    +Rule	HK	1979	only	-	Oct	Sun>=16	3:30	0	-
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     Zone	Asia/Hong_Kong	7:36:36 -	LMT	1904 Oct 30
    +			8:00	HK	HK%sT	1941 Dec 25
    +			9:00	-	JST	1945 Sep 15
     			8:00	HK	HK%sT
     
    -
     ###############################################################################
     
     # Taiwan
    @@ -1674,16 +1861,66 @@ Zone	Asia/Muscat	3:54:20 -	LMT	1920
     # advance clocks in the country by one hour from April 15 to
     # conserve energy"
     
    -# From Arthur David Olson (2009-04-10):
    -# Assume for now that Pakistan will end DST in 2009 as it did in 2008.
    +# From Steffen Thorsen (2009-09-17):
    +# "The News International," Pakistan reports that: "The Federal
    +# Government has decided to restore the previous time by moving the
    +# clocks backward by one hour from October 1. A formal announcement to
    +# this effect will be made after the Prime Minister grants approval in
    +# this regard." 
    +# 
    +# http://www.thenews.com.pk/updates.asp?id=87168
    +# 
    +
    +# From Alexander Krivenyshev (2009-09-28):
    +# According to Associated Press Of Pakistan, it is confirmed that
    +# Pakistan clocks across the country would be turned back by an hour from October
    +# 1, 2009.
    +#
    +# "Clocks to go back one hour from 1 Oct"
    +# 
    +# http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=86715&Itemid=2
    +# 
    +# or
    +# 
    +# http://www.worldtimezone.com/dst_news/dst_news_pakistan07.htm
    +# 
    +
    +# From Steffen Thorsen (2009-09-29):
    +# Alexander Krivenyshev wrote:
    +# > According to Associated Press Of Pakistan, it is confirmed that
    +# > Pakistan clocks across the country would be turned back by an hour from October
    +# > 1, 2009.
    +#
    +# Now they seem to have changed their mind, November 1 is the new date:
    +# 
    +# http://www.thenews.com.pk/top_story_detail.asp?Id=24742
    +# 
    +# "The country's clocks will be reversed by one hour on November 1.
    +# Officials of Federal Ministry for Interior told this to Geo News on
    +# Monday."
    +#
    +# And more importantly, it seems that these dates will be kept every year:
    +# "It has now been decided that clocks will be wound forward by one hour
    +# on April 15 and reversed by an hour on November 1 every year without
    +# obtaining prior approval, the officials added."
    +#
    +# We have confirmed this year's end date with both with the Ministry of
    +# Water and Power and the Pakistan Electric Power Company:
    +# 
    +# http://www.timeanddate.com/news/time/pakistan-ends-dst09.html
    +# 
    +
    +# From Christoph Goehre (2009-10-01):
    +# [T]he German Consulate General in Karachi reported me today that Pakistan
    +# will go back to standard time on 1st of November.
     
     # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
     Rule Pakistan	2002	only	-	Apr	Sun>=2	0:01	1:00	S
     Rule Pakistan	2002	only	-	Oct	Sun>=2	0:01	0	-
     Rule Pakistan	2008	only	-	Jun	1	0:00	1:00	S
     Rule Pakistan	2008	only	-	Nov	1	0:00	0	-
    -Rule Pakistan	2009	only	-	Apr	15	0:00	1:00	S
    -Rule Pakistan	2009	only	-	Nov	1	0:00	0	-
    +Rule Pakistan	2009	max	-	Apr	15	0:00	1:00	S
    +Rule Pakistan	2009	max	-	Nov	1	0:00	0	-
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     Zone	Asia/Karachi	4:28:12 -	LMT	1907
     			5:30	-	IST	1942 Sep
    @@ -2168,9 +2405,23 @@ Rule	Syria	2007	only	-	Nov	 Fri>=1	0:00	0	-
     # http://www.timeanddate.com/news/time/syria-dst-starts-march-27-2009.html
     # 
     
    +# From Steffen Thorsen (2009-10-27):
    +# The Syrian Arab News Network on 2009-09-29 reported that Syria will 
    +# revert back to winter (standard) time on midnight between Thursday 
    +# 2009-10-29 and Friday 2009-10-30:
    +# 
    +# http://www.sana.sy/ara/2/2009/09/29/247012.htm (Arabic)
    +# 
    +
    +# From Arthur David Olson (2009-10-28):
    +# We'll see if future DST switching times turn out to be end of the last
    +# Thursday of the month or the start of the last Friday of the month or
    +# something else. For now, use the start of the last Friday.
    +
     Rule	Syria	2008	only	-	Apr	Fri>=1	0:00	1:00	S
    -Rule	Syria	2008	max	-	Nov	1	0:00	0	-
    +Rule	Syria	2008	only	-	Nov	1	0:00	0	-
     Rule	Syria	2009	max	-	Mar	lastFri	0:00	1:00	S
    +Rule	Syria	2009	max	-	Oct	lastFri	0:00	0	-
     
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     Zone	Asia/Damascus	2:25:12 -	LMT	1920	# Dimashq
    diff --git a/share/zoneinfo/australasia b/contrib/tzdata/australasia
    similarity index 96%
    rename from share/zoneinfo/australasia
    rename to contrib/tzdata/australasia
    index 86fac13d98eb..381239008701 100644
    --- a/share/zoneinfo/australasia
    +++ b/contrib/tzdata/australasia
    @@ -1,5 +1,5 @@
     # 
    -# @(#)australasia	8.13
    +# @(#)australasia	8.15
     # This file is in the public domain, so clarified as of
     # 2009-05-17 by Arthur David Olson.
     
    @@ -248,9 +248,30 @@ Zone	Indian/Cocos	6:27:40	-	LMT	1900
     			6:30	-	CCT	# Cocos Islands Time
     
     # Fiji
    +# From Alexander Krivenyshev (2009-11-10):
    +# According to Fiji Broadcasting Corporation,  Fiji plans to re-introduce DST
    +# from November 29th 2009  to April 25th 2010.
    +#
    +# "Daylight savings to commence this month"
    +# 
    +# http://www.radiofiji.com.fj/fullstory.php?id=23719
    +# 
    +# or
    +# 
    +# http://www.worldtimezone.com/dst_news/dst_news_fiji01.html
    +# 
    +
    +# From Steffen Thorsen (2009-11-10):
    +# The Fiji Government has posted some more details about the approved
    +# amendments:
    +# 
    +# http://www.fiji.gov.fj/publish/page_16198.shtml
    +# 
     # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
     Rule	Fiji	1998	1999	-	Nov	Sun>=1	2:00	1:00	S
     Rule	Fiji	1999	2000	-	Feb	lastSun	3:00	0	-
    +Rule	Fiji	2009	only	-	Nov	29	2:00	1:00	S
    +Rule	Fiji	2010	only	-	Apr	25	3:00	0	-
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     Zone	Pacific/Fiji	11:53:40 -	LMT	1915 Oct 26	# Suva
     			12:00	Fiji	FJ%sT	# Fiji Time
    @@ -457,6 +478,36 @@ Zone Pacific/Pago_Pago	 12:37:12 -	LMT	1879 Jul  5
     # http://www.timeanddate.com/news/time/samoa-dst-plan-2009.html
     # 
     
    +# From Alexander Krivenyshev (2009-10-03):
    +# First, my deepest condolences to people of Samoa islands and all families and
    +# loved ones around the world who lost their lives in the earthquake and tsunami.
    +#
    +# Considering the recent devastation on Samoa by earthquake and tsunami and that
    +# many government offices/ ministers are closed- not sure if "Daylight Saving
    +# Bill 2009" will be implemented in next few days- on October 4, 2009.
    +#
    +# Here is reply from Consulate-General of Samoa in New Zealand
    +# ---------------------------
    +# Consul General
    +# consulgeneral@samoaconsulate.org.nz
    +#
    +# Talofa Alexander,
    +#
    +# Thank you for your sympathy for our country but at this time we have not
    +# been informed about the Daylight Savings Time Change.  Most Ministries in
    +# Apia are closed or relocating due to weather concerns.
    +#
    +# When we do find out if they are still proceeding with the time change we
    +# will advise you soonest.
    +#
    +# Kind Regards,
    +# Lana
    +# for: Consul General
    +
    +# From Steffen Thorsen (2009-10-05):
    +# We have called a hotel in Samoa and asked about local time there - they 
    +# are still on standard time.
    +
     Zone Pacific/Apia	 12:33:04 -	LMT	1879 Jul  5
     			-11:26:56 -	LMT	1911
     			-11:30	-	SAMT	1950		# Samoa Time
    diff --git a/share/zoneinfo/backward b/contrib/tzdata/backward
    similarity index 100%
    rename from share/zoneinfo/backward
    rename to contrib/tzdata/backward
    diff --git a/share/zoneinfo/etcetera b/contrib/tzdata/etcetera
    similarity index 97%
    rename from share/zoneinfo/etcetera
    rename to contrib/tzdata/etcetera
    index 5c9368298570..8f69280b22b5 100644
    --- a/share/zoneinfo/etcetera
    +++ b/contrib/tzdata/etcetera
    @@ -16,9 +16,9 @@ Zone	Etc/UCT		0	-	UCT
     
     # The following link uses older naming conventions,
     # but it belongs here, not in the file `backward',
    -# as functions like gmtime load the "GMT" file to handle leap seconds properly.
    +# as functions like gmtime load the "UTC" file to handle leap seconds properly.
     # We want this to work even on installations that omit the other older names.
    -Link	Etc/GMT				GMT
    +Link	Etc/UTC				UTC
     
     Link	Etc/UTC				Etc/Universal
     Link	Etc/UTC				Etc/Zulu
    diff --git a/share/zoneinfo/europe b/contrib/tzdata/europe
    similarity index 98%
    rename from share/zoneinfo/europe
    rename to contrib/tzdata/europe
    index adf20a2828c4..05e3caec3aef 100644
    --- a/share/zoneinfo/europe
    +++ b/contrib/tzdata/europe
    @@ -1,5 +1,5 @@
     # 
    -# @(#)europe	8.22
    +# @(#)europe	8.25
     # This file is in the public domain, so clarified as of
     # 2009-05-17 by Arthur David Olson.
     
    @@ -2072,9 +2072,43 @@ Zone Asia/Novosibirsk	 5:31:40 -	LMT	1919 Dec 14 6:00
     			 6:00	Russia	NOV%sT	1992 Jan 19 2:00s
     			 7:00	Russia	NOV%sT	1993 May 23 # say Shanks & P.
     			 6:00	Russia	NOV%sT
    +
    +# From Alexander Krivenyshev (2009-10-13):
    +# Kemerovo oblast' (Kemerovo region) in Russia will change current time zone on
    +# March 28, 2010:
    +# from current Russia Zone 6 - Krasnoyarsk Time Zone (KRA) UTC +0700
    +# to Russia Zone 5 - Novosibirsk Time Zone (NOV) UTC +0600
    +#
    +# This is according to Government of Russia decree # 740, on September
    +# 14, 2009 "Application in the territory of the Kemerovo region the Fifth
    +# time zone." ("Russia Zone 5" or old "USSR Zone 5" is GMT +0600)
    +#
    +# Russian Government web site (Russian language)
    +# 
    +# http://www.government.ru/content/governmentactivity/rfgovernmentdecisions/archive/2009/09/14/991633.htm
    +# 
    +# or Russian-English translation by WorldTimeZone.com with reference
    +# map to local region and new Russia Time Zone map after March 28, 2010
    +# 
    +# http://www.worldtimezone.com/dst_news/dst_news_russia03.html
    +# 
    +#
    +# Thus, when Russia will switch to DST on the night of March 28, 2010
    +# Kemerovo region (Kemerovo oblast') will not change the clock.
    +#
    +# As a result, Kemerovo oblast' will be in the same time zone as
    +# Novosibirsk, Omsk, Tomsk, Barnaul and Altai Republic.
    +
    +Zone Asia/Novokuznetsk	 5:48:48 -	NMT	1920 Jan  6
    +			 6:00	-	KRAT	1930 Jun 21 # Krasnoyarsk Time
    +			 7:00	Russia	KRA%sT	1991 Mar 31 2:00s
    +			 6:00	Russia	KRA%sT	1992 Jan 19 2:00s
    +			 7:00	Russia	KRA%sT	2010 Mar 28 2:00s
    +			 6:00	Russia	NOV%sT # Novosibirsk/Novokuznetsk Time
    +
     #
     # From Oscar van Vlijmen (2001-08-25): [This region consists of]
    -# Kemerovskaya oblast', Krasnoyarskij kraj,
    +# Krasnoyarskij kraj,
     # Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug,
     # Respublika Tuva, Respublika Khakasiya, Evenkijskij avtonomnyj okrug.
     Zone Asia/Krasnoyarsk	 6:11:20 -	LMT	1920 Jan  6
    @@ -2096,12 +2130,20 @@ Zone Asia/Irkutsk	 6:57:20 -	LMT	1880
     # From Oscar van Vlijmen (2003-10-18): [This region consists of]
     # Aginskij Buryatskij avtonomnyj okrug, Amurskaya oblast',
     # [parts of] Respublika Sakha (Yakutiya), Chitinskaya oblast'.
    +
    +# From Oscar van Vlijmen (2009-11-29):
    +# ...some regions of RUssia were merged with others since 2005...
    +# Some names were changed, no big deal, except for one instance: a new name.
    +# YAK/YAKST: UTC+9 Zabajkal'skij kraj.
    +
    +# From Oscar van Vlijmen (2009-11-29):
     # The Sakha districts are: Aldanskij, Amginskij, Anabarskij,
    -# Bulunskij, Verkhnekolymskij, Verkhnevilyujskij, Vilyujskij, Gornyj,
    +# Verkhnevilyujskij, Vilyujskij, Gornyj,
     # Zhiganskij, Kobyajskij, Lenskij, Megino-Kangalasskij, Mirninskij,
    -# Namskij, Nyurbinskij, Olenekskij, Olekminskij, Srednekolymskij,
    +# Namskij, Nyurbinskij, Olenyokskij, Olyokminskij,
     # Suntarskij, Tattinskij, Ust'-Aldanskij, Khangalasskij,
    -# Churapchinskij, Eveno-Bytantajskij.
    +# Churapchinskij, Eveno-Bytantajskij Natsional'nij.
    +
     Zone Asia/Yakutsk	 8:38:40 -	LMT	1919 Dec 15
     			 8:00	-	YAKT	1930 Jun 21 # Yakutsk Time
     			 9:00	Russia	YAK%sT	1991 Mar 31 2:00s
    @@ -2111,7 +2153,9 @@ Zone Asia/Yakutsk	 8:38:40 -	LMT	1919 Dec 15
     # From Oscar van Vlijmen (2003-10-18): [This region consists of]
     # Evrejskaya avtonomnaya oblast', Khabarovskij kraj, Primorskij kraj,
     # [parts of] Respublika Sakha (Yakutiya).
    -# The Sakha districts are: Verkhoyanskij, Tomponskij, Ust'-Majskij,
    +
    +# From Oscar van Vlijmen (2009-11-29):
    +# The Sakha districts are: Bulunskij, Verkhoyanskij, Tomponskij, Ust'-Majskij,
     # Ust'-Yanskij.
     Zone Asia/Vladivostok	 8:47:44 -	LMT	1922 Nov 15
     			 9:00	-	VLAT	1930 Jun 21 # Vladivostok Time
    @@ -2132,8 +2176,10 @@ Zone Asia/Sakhalin	 9:30:48 -	LMT	1905 Aug 23
     # From Oscar van Vlijmen (2003-10-18): [This region consists of]
     # Magadanskaya oblast', Respublika Sakha (Yakutiya).
     # Probably also: Kuril Islands.
    -# The Sakha districts are: Abyjskij, Allaikhovskij, Momskij,
    -# Nizhnekolymskij, Ojmyakonskij.
    +
    +# From Oscar van Vlijmen (2009-11-29):
    +# The Sakha districts are: Abyjskij, Allaikhovskij, Verkhhhnekolymskij, Momskij,
    +# Nizhnekolymskij, Ojmyakonskij, Srednekolymskij.
     Zone Asia/Magadan	10:03:12 -	LMT	1924 May  2
     			10:00	-	MAGT	1930 Jun 21 # Magadan Time
     			11:00	Russia	MAG%sT	1991 Mar 31 2:00s
    diff --git a/share/zoneinfo/factory b/contrib/tzdata/factory
    similarity index 100%
    rename from share/zoneinfo/factory
    rename to contrib/tzdata/factory
    diff --git a/share/zoneinfo/leapseconds b/contrib/tzdata/leapseconds
    similarity index 100%
    rename from share/zoneinfo/leapseconds
    rename to contrib/tzdata/leapseconds
    diff --git a/share/zoneinfo/northamerica b/contrib/tzdata/northamerica
    similarity index 96%
    rename from share/zoneinfo/northamerica
    rename to contrib/tzdata/northamerica
    index 236922d75454..5c25664b234d 100644
    --- a/share/zoneinfo/northamerica
    +++ b/contrib/tzdata/northamerica
    @@ -1,5 +1,5 @@
     # 
    -# @(#)northamerica	8.28
    +# @(#)northamerica	8.30
     # This file is in the public domain, so clarified as of
     # 2009-05-17 by Arthur David Olson.
     
    @@ -1955,6 +1955,58 @@ Zone America/Dawson	-9:17:40 -	LMT	1900 Aug 20
     # http://www.conae.gob.mx/ahorro/horaver2001_m1_2002.html (2002-02-20)
     # confirms this.  Sonora as usual is the only state where DST is not applied.
     
    +# From Steffen Thorsen (2009-12-28):
    +#
    +# Steffen Thorsen wrote:
    +# > Mexico's House of Representatives has approved a proposal for northern
    +# > Mexico's border cities to share the same daylight saving schedule as
    +# > the United States.
    +# Now this has passed both the Congress and the Senate, so starting from
    +# 2010, some border regions will be the same:
    +# 
    +# http://www.signonsandiego.com/news/2009/dec/28/clocks-will-match-both-sides-border/
    +# 
    +# 
    +# http://www.elmananarey.com/diario/noticia/nacional/noticias/empatan_horario_de_frontera_con_eu/621939
    +# 
    +# (Spanish)
    +#
    +# Could not find the new law text, but the proposed law text changes are here:
    +# 
    +# http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/20091210-V.pdf
    +# 
    +# (Gaceta Parlamentaria)
    +#
    +# There is also a list of the votes here:
    +# 
    +# http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/V2-101209.html
    +# 
    +#
    +# Our page:
    +# 
    +# http://www.timeanddate.com/news/time/north-mexico-dst-change.html
    +# 
    +
    +# From Arthur David Olson (2010-01-20):
    +# The page
    +# 
    +# http://dof.gob.mx/nota_detalle.php?codigo=5127480&fecha=06/01/2010
    +# 
    +# includes this text:
    +# En los municipios fronterizos de Tijuana y Mexicali en Baja California;
    +# Juárez y Ojinaga en Chihuahua; Acuña y Piedras Negras en Coahuila;
    +# Anáhuac en Nuevo León; y Nuevo Laredo, Reynosa y Matamoros en
    +# Tamaulipas, la aplicación de este horario estacional surtirá efecto
    +# desde las dos horas del segundo domingo de marzo y concluirá a las dos
    +# horas del primer domingo de noviembre.
    +# En los municipios fronterizos que se encuentren ubicados en la franja
    +# fronteriza norte en el territorio comprendido entre la línea
    +# internacional y la línea paralela ubicada a una distancia de veinte
    +# kilómetros, así como la Ciudad de Ensenada, Baja California, hacia el
    +# interior del país, la aplicación de este horario estacional surtirá
    +# efecto desde las dos horas del segundo domingo de marzo y concluirá a
    +# las dos horas del primer domingo de noviembre.
    +
     # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
     Rule	Mexico	1939	only	-	Feb	5	0:00	1:00	D
     Rule	Mexico	1939	only	-	Jun	25	0:00	0	S
    @@ -1981,13 +2033,19 @@ Zone America/Merida	-5:58:28 -	LMT	1922 Jan  1  0:01:32
     			-6:00	-	CST	1981 Dec 23
     			-5:00	-	EST	1982 Dec  2
     			-6:00	Mexico	C%sT
    -# Coahuila, Durango, Nuevo Leon, Tamaulipas
    +# Coahuila, Durango, Nuevo Leon, Tamaulipas (near US border)
    +Zone America/Matamoros	-6:40:00 -	LMT	1921 Dec 31 23:20:00
    +			-6:00	-	CST	1988
    +			-6:00	US	C%sT	1989
    +			-6:00	Mexico	C%sT	2010
    +			-6:00	US	C%sT
    +# Coahuila, Durango, Nuevo Leon, Tamaulipas (away from US border)
     Zone America/Monterrey	-6:41:16 -	LMT	1921 Dec 31 23:18:44
     			-6:00	-	CST	1988
     			-6:00	US	C%sT	1989
     			-6:00	Mexico	C%sT
     # Central Mexico
    -Zone America/Mexico_City -6:36:36 -	LMT	1922 Jan  1  0:23:24
    +Zone America/Mexico_City -6:36:36 -	LMT	1922 Jan  1 0:23:24
     			-7:00	-	MST	1927 Jun 10 23:00
     			-6:00	-	CST	1930 Nov 15
     			-7:00	-	MST	1931 May  1 23:00
    @@ -1996,7 +2054,19 @@ Zone America/Mexico_City -6:36:36 -	LMT	1922 Jan  1  0:23:24
     			-6:00	Mexico	C%sT	2001 Sep 30 02:00
     			-6:00	-	CST	2002 Feb 20
     			-6:00	Mexico	C%sT
    -# Chihuahua
    +# Chihuahua (near US border)
    +Zone America/Ojinaga	-6:57:40 -	LMT	1922 Jan 1 0:02:20
    +			-7:00	-	MST	1927 Jun 10 23:00
    +			-6:00	-	CST	1930 Nov 15
    +			-7:00	-	MST	1931 May  1 23:00
    +			-6:00	-	CST	1931 Oct
    +			-7:00	-	MST	1932 Apr  1
    +			-6:00	-	CST	1996
    +			-6:00	Mexico	C%sT	1998
    +			-6:00	-	CST	1998 Apr Sun>=1 3:00
    +			-7:00	Mexico	M%sT	2010
    +			-7:00	US	M%sT
    +# Chihuahua (away from US border)
     Zone America/Chihuahua	-7:04:20 -	LMT	1921 Dec 31 23:55:40
     			-7:00	-	MST	1927 Jun 10 23:00
     			-6:00	-	CST	1930 Nov 15
    @@ -2030,8 +2100,28 @@ Zone America/Mazatlan	-7:05:40 -	LMT	1921 Dec 31 23:54:20
     			-7:00	-	MST	1949 Jan 14
     			-8:00	-	PST	1970
     			-7:00	Mexico	M%sT
    -# Baja California
    +# Baja California (near US border)
     Zone America/Tijuana	-7:48:04 -	LMT	1922 Jan  1  0:11:56
    +			-7:00	-	MST	1924
    +			-8:00	-	PST	1927 Jun 10 23:00
    +			-7:00	-	MST	1930 Nov 15
    +			-8:00	-	PST	1931 Apr  1
    +			-8:00	1:00	PDT	1931 Sep 30
    +			-8:00	-	PST	1942 Apr 24
    +			-8:00	1:00	PWT	1945 Aug 14 23:00u
    +			-8:00	1:00	PPT	1945 Nov 12 # Peace
    +			-8:00	-	PST	1948 Apr  5
    +			-8:00	1:00	PDT	1949 Jan 14
    +			-8:00	-	PST	1954
    +			-8:00	CA	P%sT	1961
    +			-8:00	-	PST	1976
    +			-8:00	US	P%sT	1996
    +			-8:00	Mexico	P%sT	2001
    +			-8:00	US	P%sT	2002 Feb 20
    +			-8:00	Mexico	P%sT	2010
    +			-8:00	US	P%sT
    +# Baja California (away from US border)
    +Zone America/Santa_Isabel	-7:39:28 -	LMT	1922 Jan  1  0:20:32
     			-7:00	-	MST	1924
     			-8:00	-	PST	1927 Jun 10 23:00
     			-7:00	-	MST	1930 Nov 15
    diff --git a/share/zoneinfo/pacificnew b/contrib/tzdata/pacificnew
    similarity index 100%
    rename from share/zoneinfo/pacificnew
    rename to contrib/tzdata/pacificnew
    diff --git a/share/zoneinfo/southamerica b/contrib/tzdata/southamerica
    similarity index 94%
    rename from share/zoneinfo/southamerica
    rename to contrib/tzdata/southamerica
    index 341e57ff907c..7ad8170826ca 100644
    --- a/share/zoneinfo/southamerica
    +++ b/contrib/tzdata/southamerica
    @@ -1,5 +1,5 @@
     # 
    -# @(#)southamerica	8.36
    +# @(#)southamerica	8.41
     # This file is in the public domain, so clarified as of
     # 2009-05-17 by Arthur David Olson.
     
    @@ -215,9 +215,23 @@ Rule	Arg	2000	only	-	Mar	3	0:00	0	-
     # http://www.jujuy.gov.ar/index2/partes_prensa/18_10_08/235-181008.doc
     # 
     
    +# From fullinet (2009-10-18):
    +# As announced in
    +# 
    +# http://www.argentina.gob.ar/argentina/portal/paginas.dhtml?pagina=356
    +# 
    +# (an official .gob.ar) under title: "Sin Cambio de Hora" (english: "No hour change")
    +#
    +# "Por el momento, el Gobierno Nacional resolvio no modificar la hora
    +# oficial, decision que estaba en estudio para su implementacion el
    +# domingo 18 de octubre. Desde el Ministerio de Planificacion se anuncio
    +# que la Argentina hoy, en estas condiciones meteorologicas, no necesita
    +# la modificacion del huso horario, ya que 2009 nos encuentra con
    +# crecimiento en la produccion y distribucion energetica."
    +
     Rule	Arg	2007	only	-	Dec	30	0:00	1:00	S
    -Rule	Arg	2008	max	-	Mar	Sun>=15	0:00	0	-
    -Rule	Arg	2008	max	-	Oct	Sun>=15	0:00	1:00	S
    +Rule	Arg	2008	2009	-	Mar	Sun>=15	0:00	0	-
    +Rule	Arg	2008	only	-	Oct	Sun>=15	0:00	1:00	S
      
     # From Mariano Absatz (2004-05-21):
     # Today it was officially published that the Province of Mendoza is changing
    @@ -389,15 +403,40 @@ Rule	Arg	2008	max	-	Oct	Sun>=15	0:00	1:00	S
     # during 2009, this timezone change will run from 00:00 the third Sunday
     # in March until 24:00 of the second Saturday in October.
     
    -# From Arthur David Olson (2009-03-16):
    -# The unofficial claim at
    -# 
    -# http://www.timeanddate.com/news/time/san-luis-new-time-zone.html
    -# 
    -# is that "The province will most likely follow the next daylight saving schedule,
    -# which is planned for the second Sunday in October."
    -
    +# From Mariano Absatz (2009-10-16):
    +# ...the Province of San Luis is a case in itself.
     #
    +# The Law at
    +# 
    +# is ambiguous because establishes a calendar from the 2nd Sunday in
    +# October at 0:00 thru the 2nd Saturday in March at 24:00 and the
    +# complement of that starting on the 2nd Sunday of March at 0:00 and
    +# ending on the 2nd Saturday of March at 24:00.
    +#
    +# This clearly breaks every time the 1st of March or October is a Sunday.
    +#
    +# IMHO, the "spirit of the Law" is to make the changes at 0:00 on the 2nd
    +# Sunday of October and March.
    +#
    +# The problem is that the changes in the rest of the Provinces that did
    +# change in 2007/2008, were made according to the Federal Law and Decrees
    +# that did so on the 3rd Sunday of October and March.
    +#
    +# In fact, San Luis actually switched from UTC-4 to UTC-3 last Sunday
    +# (October 11th) at 0:00.
    +#
    +# So I guess a new set of rules, besides "Arg", must be made and the last
    +# America/Argentina/San_Luis entries should change to use these...
    +#
    +# I'm enclosing a patch that does what I say... regretfully, the San Luis
    +# timezone must be called "WART/WARST" even when most of the time (like,
    +# right now) WARST == ART... that is, since last Sunday, all the country
    +# is using UTC-3, but in my patch, San Luis calls it "WARST" and the rest
    +# of the country calls it "ART".
    +# ...
    +
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     #
     # Buenos Aires (BA), Capital Federal (CF),
    @@ -530,6 +569,10 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT	1894 Oct 31
     			-3:00	-	ART
     #
     # San Luis (SL)
    +
    +Rule	SanLuis	2008	max	-	Mar	Sun>=8	0:00	0	-
    +Rule	SanLuis	2007	max	-	Oct	Sun>=8	0:00	1:00	S
    +
     Zone America/Argentina/San_Luis -4:25:24 - LMT	1894 Oct 31
     			-4:16:48 -	CMT	1920 May
     			-4:00	-	ART	1930 Dec
    @@ -544,8 +587,7 @@ Zone America/Argentina/San_Luis -4:25:24 - LMT	1894 Oct 31
     			-3:00	-	ART	2004 May 31
     			-4:00	-	WART	2004 Jul 25
     			-3:00	Arg	AR%sT	2008 Jan 21
    -			-3:00	-	ART	2009 Mar 15
    -			-4:00	Arg	WAR%sT
    +			-4:00	SanLuis	WAR%sT
     #
     # Santa Cruz (SC)
     Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
    @@ -1322,8 +1364,24 @@ Rule	Para	2002	2003	-	Sep	Sun>=1	0:00	1:00	S
     # Decree 1,867 (2004-03-05)
     # From Carlos Raul Perasso via Jesper Norgaard Welen (2006-10-13)
     # 
    -Rule	Para	2004	max	-	Oct	Sun>=15	0:00	1:00	S
    -Rule	Para	2005	max	-	Mar	Sun>=8	0:00	0	-
    +Rule	Para	2004	2009	-	Oct	Sun>=15	0:00	1:00	S
    +Rule	Para	2005	2009	-	Mar	Sun>=8	0:00	0	-
    +# From Carlos Raul Perasso (2010-02-18):
    +# By decree number 3958 issued yesterday (
    +# 
    +# http://www.presidencia.gov.py/v1/wp-content/uploads/2010/02/decreto3958.pdf
    +# 
    +# )
    +# Paraguay changes its DST schedule, postponing the March rule to April and
    +# modifying the October date. The decree reads:
    +# ...
    +# Art. 1. It is hereby established that from the second Sunday of the month of
    +# April of this year (2010), the official time is to be set back 60 minutes,
    +# and that on the first Sunday of the month of October, it is to be set
    +# forward 60 minutes, in all the territory of the Paraguayan Republic.
    +# ...
    +Rule	Para	2010	max	-	Oct	Sun<=7	0:00	1:00	S
    +Rule	Para	2010	max	-	Apr	Sun>=8	0:00	0	-
     
     # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
     Zone America/Asuncion	-3:50:40 -	LMT	1890
    diff --git a/share/zoneinfo/systemv b/contrib/tzdata/systemv
    similarity index 100%
    rename from share/zoneinfo/systemv
    rename to contrib/tzdata/systemv
    diff --git a/share/zoneinfo/yearistype.sh b/contrib/tzdata/yearistype.sh
    similarity index 100%
    rename from share/zoneinfo/yearistype.sh
    rename to contrib/tzdata/yearistype.sh
    diff --git a/share/zoneinfo/zone.tab b/contrib/tzdata/zone.tab
    similarity index 96%
    rename from share/zoneinfo/zone.tab
    rename to contrib/tzdata/zone.tab
    index c04fb49f2210..c8fb2503db81 100644
    --- a/share/zoneinfo/zone.tab
    +++ b/contrib/tzdata/zone.tab
    @@ -1,5 +1,5 @@
     # 
    -# @(#)zone.tab	8.28
    +# @(#)zone.tab	8.33
     # This file is in the public domain, so clarified as of
     # 2009-05-17 by Arthur David Olson.
     #
    @@ -279,11 +279,14 @@ MW	-1547+03500	Africa/Blantyre
     MX	+1924-09909	America/Mexico_City	Central Time - most locations
     MX	+2105-08646	America/Cancun	Central Time - Quintana Roo
     MX	+2058-08937	America/Merida	Central Time - Campeche, Yucatan
    -MX	+2540-10019	America/Monterrey	Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas
    +MX	+2540-10019	America/Monterrey	Mexican Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas away from US border
    +MX	+2550-09730	America/Matamoros	US Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas near US border
     MX	+2313-10625	America/Mazatlan	Mountain Time - S Baja, Nayarit, Sinaloa
    -MX	+2838-10605	America/Chihuahua	Mountain Time - Chihuahua
    +MX	+2838-10605	America/Chihuahua	Mexican Mountain Time - Chihuahua away from US border
    +MX	+2934-10425	America/Ojinaga	US Mountain Time - Chihuahua near US border
     MX	+2904-11058	America/Hermosillo	Mountain Standard Time - Sonora
    -MX	+3232-11701	America/Tijuana	Pacific Time
    +MX	+3232-11701	America/Tijuana	US Pacific Time - Baja California near US border
    +MX	+3018-11452	America/Santa_Isabel	Mexican Pacific Time - Baja California away from US border
     MY	+0310+10142	Asia/Kuala_Lumpur	peninsular Malaysia
     MY	+0133+11020	Asia/Kuching	Sabah & Sarawak
     MZ	-2558+03235	Africa/Maputo
    @@ -330,6 +333,7 @@ RU	+5312+05009	Europe/Samara	Moscow+01 - Samara, Udmurtia
     RU	+5651+06036	Asia/Yekaterinburg	Moscow+02 - Urals
     RU	+5500+07324	Asia/Omsk	Moscow+03 - west Siberia
     RU	+5502+08255	Asia/Novosibirsk	Moscow+03 - Novosibirsk
    +RU	+5345+08707	Asia/Novokuznetsk	Moscow+03 - Novokuznetsk
     RU	+5601+09250	Asia/Krasnoyarsk	Moscow+04 - Yenisei River
     RU	+5216+10420	Asia/Irkutsk	Moscow+05 - Lake Baikal
     RU	+6200+12940	Asia/Yakutsk	Moscow+06 - Lena River
    diff --git a/crypto/heimdal/kcm/connect.c b/crypto/heimdal/kcm/connect.c
    index b3a21aa66a0b..edad6fcdf259 100644
    --- a/crypto/heimdal/kcm/connect.c
    +++ b/crypto/heimdal/kcm/connect.c
    @@ -149,7 +149,7 @@ update_client_creds(int s, kcm_client *peer)
     	struct sockcred *sc;
     	
     	memset(&msg, 0, sizeof(msg));
    -	crmsgsize = CMSG_SPACE(SOCKCREDSIZE(NGROUPS));
    +	crmsgsize = CMSG_SPACE(SOCKCREDSIZE(CMGROUP_MAX));
     	if (crmsgsize == 0)
     	    return 1 ;
     
    diff --git a/crypto/openssh/ChangeLog b/crypto/openssh/ChangeLog
    index f802c0d7fc4d..b2df6602371d 100644
    --- a/crypto/openssh/ChangeLog
    +++ b/crypto/openssh/ChangeLog
    @@ -1,3 +1,282 @@
    +20090926
    + - (djm) [contrib/caldera/openssh.spec contrib/redhat/openssh.spec]
    +         [contrib/suse/openssh.spec] Update for release
    + - (djm) [README] update relnotes URL
    + - (djm) [packet.c] Restore EWOULDBLOCK handling that got lost somewhere
    + - (djm) Release 5.3p1
    +
    +20090911
    + - (dtucker) [configure.ac] Change the -lresolv check so it works on Mac OS X
    +   10.6 (which doesn't have BIND8_COMPAT and thus uses res_9_query).  Patch
    +   from jbasney at ncsa uiuc edu.
    +
    +20090908
    + - (djm) [serverloop.c] Fix test for server-assigned remote forwarding port
    +   (-R 0:...); bz#1578, spotted and fix by gavin AT emf.net; ok dtucker@
    +
    +20090901
    + - (dtucker) [configure.ac] Bug #1639: use AC_PATH_PROG to search the path for
    +   krb5-config if it's not in the location specified by --with-kerberos5.
    +   Patch from jchadima at redhat.
    +
    +20090829
    + - (dtucker) [README.platform] Add text about development packages, based on
    +   text from Chris Pepper in bug #1631.
    +
    +20090828
    + - dtucker [auth-sia.c] Roll back the change for bug #1241 as it apparently
    +   causes problems in some Tru64 configurations.
    + - (djm) [sshd_config.5] downgrade mention of login.conf to be an example
    +   and mention PAM as another provider for ChallengeResponseAuthentication;
    +   bz#1408; ok dtucker@
    + - (djm) [sftp-server.c] bz#1535: accept ENOSYS as a fallback error when
    +   attempting atomic rename(); ok dtucker@
    + - (djm) [Makefile.in] bz#1505: Solaris make(1) doesn't accept make variables
    +   in argv, so pass them in the environment; ok dtucker@
    + - (dtucker) [channels.c configure.ac] Bug #1528: skip the tcgetattr call on
    +    the pty master on Solaris, since it never succeeds and can hang if large
    +    amounts of data is sent to the slave (eg a copy-paste).  Based on a patch
    +    originally from Doke Scott, ok djm@
    + - (dtucker) [clientloop.c configure.ac defines.h] Make the client's IO buffer
    +   size a compile-time option and set it to 64k on Cygwin, since Corinna
    +   reports that it makes a significant difference to performance.  ok djm@
    + - (dtucker) [configure.ac] Fix the syntax of the Solaris tcgetattr entry.
    +
    +20090820
    + - (dtucker) [includes.h] Bug #1634: do not include system glob.h if we're not
    +   using it since the type conflicts can cause problems on FreeBSD.  Patch
    +   from Jonathan Chen.
    + - (dtucker) [session.c openbsd-compat/port-aix.h] Bugs #1249 and #1567: move
    +   the setpcred call on AIX to immediately before the permanently_set_uid().
    +   Ensures that we still have privileges when we call chroot and
    +   pam_open_sesson.  Based on a patch from David Leonard.
    +
    +20090817
    + - (dtucker) [configure.ac] Check for headers before libraries for openssl an
    +   zlib, which should make the errors slightly more meaningful on platforms
    +   where there's separate "-devel" packages for those.
    + - (dtucker) [sshlogin.c openbsd-compat/port-aix.{c,h}] Bug #1595: make
    +   PrintLastLog work on AIX.  Based in part on a patch from Miguel Sanders.
    +
    +20090729
    + - (tim) [contrib/cygwin/ssh-user-config] Change script to call correct error
    +   function. Patch from Corinna Vinschen.
    +
    +20090713
    + - (dtucker) [openbsd-compat/getrrsetbyname.c] Reduce answer buffer size so it
    +   fits into 16 bits to work around a bug in glibc's resolver where it masks
    +   off the buffer size at 16 bits.  Patch from Hauke Lampe, ok djm jakob.
    +
    +20090712
    + - (dtucker) [configure.ac] Include sys/param.h for the sys/mount.h test,
    +   prevents configure complaining on older BSDs.
    + - (dtucker [contrib/cygwin/ssh-{host,user}-config] Add license text. Patch
    +   from Corinna Vinschen.
    + - (dtucker) [auth-pam.c] Bug #1534: move the deletion of PAM credentials on
    +   logout to after the session close.  Patch from Anicka Bernathova,
    +   originally from Andreas Schwab via Novelll ok djm.
    +
    +20090707
    + - (dtucker) [contrib/cygwin/ssh-host-config] better support for automated
    +   scripts and fix usage of eval.  Patch from Corinna Vinschen.
    +
    +20090705
    + - (dtucker) OpenBSD CVS Sync
    +   - andreas@cvs.openbsd.org 2009/06/27 09:29:06
    +     [packet.h packet.c]
    +     packet_bacup_state() and packet_restore_state() will be used to
    +     temporarily save the current state ren resuming a suspended connection.
    +     ok markus@
    +   - andreas@cvs.openbsd.org 2009/06/27 09:32:43
    +     [roaming_common.c roaming.h]
    +     It may be necessary to retransmit some data when resuming, so add it
    +     to a buffer when roaming is enabled.
    +     Most of this code was written by Martin Forssen, maf at appgate dot com.
    +     ok markus@
    +   - andreas@cvs.openbsd.org 2009/06/27 09:35:06
    +     [readconf.h readconf.c]
    +     Add client option UseRoaming. It doesn't do anything yet but will
    +     control whether the client tries to use roaming if enabled on the
    +     server. From Martin Forssen.
    +     ok markus@
    +   - markus@cvs.openbsd.org 2009/06/30 14:54:40
    +     [version.h]
    +     crank version; ok deraadt
    +   - dtucker@cvs.openbsd.org 2009/07/02 02:11:47
    +     [ssh.c]
    +     allow for long home dir paths (bz #1615).  ok deraadt
    +     (based in part on a patch from jchadima at redhat)
    +   - stevesk@cvs.openbsd.org 2009/07/05 19:28:33
    +     [clientloop.c]
    +     only send SSH2_MSG_DISCONNECT if we're in compat20; from dtucker@
    +     ok deraadt@ markus@
    +
    +20090622
    + - (dtucker) OpenBSD CVS Sync
    +   - dtucker@cvs.openbsd.org 2009/06/22 05:39:28
    +     [monitor_wrap.c monitor_mm.c ssh-keygen.c auth2.c gss-genr.c sftp-client.c]
    +     alphabetize includes; reduces diff vs portable and style(9).
    +     ok stevesk djm
    +     (Id sync only; these were already in order in -portable)
    +
    +20090621
    + - (dtucker) OpenBSD CVS Sync
    +   - markus@cvs.openbsd.org 2009/03/17 21:37:00
    +     [ssh.c]
    +     pass correct argv[0] to openlog(); ok djm@
    +  - jmc@cvs.openbsd.org 2009/03/19 15:15:09
    +     [ssh.1]
    +     for "Ciphers", just point the reader to the keyword in ssh_config(5), just
    +     as we do for "MACs": this stops us getting out of sync when the lists
    +     change;
    +     fixes documentation/6102, submitted by Peter J. Philipp
    +     alternative fix proposed by djm
    +     ok markus
    +   - tobias@cvs.openbsd.org 2009/03/23 08:31:19
    +     [ssh-agent.c]
    +     Fixed a possible out-of-bounds memory access if the environment variable
    +     SHELL is shorter than 3 characters.
    +     with input by and ok dtucker
    +   - tobias@cvs.openbsd.org 2009/03/23 19:38:04
    +     [ssh-agent.c]
    +     My previous commit didn't fix the problem at all, so stick at my first
    +     version of the fix presented to dtucker.
    +     Issue notified by Matthias Barkhoff (matthias dot barkhoff at gmx dot de).
    +     ok dtucker
    +   - sobrado@cvs.openbsd.org 2009/03/26 08:38:39
    +     [sftp-server.8 sshd.8 ssh-agent.1]
    +     fix a few typographical errors found by spell(1).
    +     ok dtucker@, jmc@
    +   - stevesk@cvs.openbsd.org 2009/04/13 19:07:44
    +     [sshd_config.5]
    +     fix possessive; ok djm@
    +   - stevesk@cvs.openbsd.org 2009/04/14 16:33:42
    +     [sftp-server.c]
    +     remove unused option character from getopt() optstring; ok markus@
    +   - jj@cvs.openbsd.org 2009/04/14 21:10:54
    +     [servconf.c]
    +     Fixed a few the-the misspellings in comments. Skipped a bunch in
    +     binutils,gcc and so on. ok jmc@
    +   - stevesk@cvs.openbsd.org 2009/04/17 19:23:06
    +     [session.c]
    +     use INTERNAL_SFTP_NAME for setproctitle() of in-process sftp-server;
    +     ok djm@ markus@
    +   - stevesk@cvs.openbsd.org 2009/04/17 19:40:17
    +     [sshd_config.5]
    +     clarify that even internal-sftp needs /dev/log for logging to work; ok
    +     markus@
    +   - jmc@cvs.openbsd.org 2009/04/18 18:39:10
    +     [sshd_config.5]
    +     tweak previous; ok stevesk
    +   - stevesk@cvs.openbsd.org 2009/04/21 15:13:17
    +     [sshd_config.5]
    +     clarify we cd to user's home after chroot; ok markus@ on
    +     earlier version; tweaks and ok jmc@
    +   - andreas@cvs.openbsd.org 2009/05/25 06:48:01
    +     [channels.c packet.c clientloop.c packet.h serverloop.c monitor_wrap.c
    +     monitor.c]
    +     Put the globals in packet.c into a struct and don't access it directly
    +     from other files. No functional changes.
    +     ok markus@ djm@
    +   - andreas@cvs.openbsd.org 2009/05/27 06:31:25
    +     [canohost.h canohost.c]
    +     Add clear_cached_addr(), needed for upcoming changes allowing the peer
    +     address to change.
    +     ok markus@
    +   - andreas@cvs.openbsd.org 2009/05/27 06:33:39
    +     [clientloop.c]
    +     Send SSH2_MSG_DISCONNECT when the client disconnects. From a larger
    +     change from Martin Forssen, maf at appgate dot com.
    +     ok markus@
    +   - andreas@cvs.openbsd.org 2009/05/27 06:34:36
    +     [kex.c kex.h]
    +     Move the KEX_COOKIE_LEN define to kex.h
    +     ok markus@
    +   - andreas@cvs.openbsd.org 2009/05/27 06:36:07
    +     [packet.h packet.c]
    +     Add packet_put_int64() and packet_get_int64(), part of a larger change
    +     from Martin Forssen.
    +     ok markus@
    +   - andreas@cvs.openbsd.org 2009/05/27 06:38:16
    +     [sshconnect.h sshconnect.c]
    +     Un-static ssh_exchange_identification(), part of a larger change from
    +     Martin Forssen and needed for upcoming changes.
    +     ok markus@
    +   - andreas@cvs.openbsd.org 2009/05/28 16:50:16
    +     [sshd.c packet.c serverloop.c monitor_wrap.c clientloop.c sshconnect.c
    +     monitor.c Added roaming.h roaming_common.c roaming_dummy.c]
    +     Keep track of number of bytes read and written. Needed for upcoming
    +     changes. Most code from Martin Forssen, maf at appgate dot com.
    +     ok markus@
    +     Also, applied appropriate changes to Makefile.in
    +   - andreas@cvs.openbsd.org 2009/06/12 20:43:22
    +     [monitor.c packet.c]
    +     Fix warnings found by chl@ and djm@ and change roaming_atomicio's
    +     return type to match atomicio's
    +     Diff from djm@, ok markus@
    +   - andreas@cvs.openbsd.org 2009/06/12 20:58:32
    +     [packet.c]
    +     Move some more statics into session_state
    +     ok markus@ djm@
    +   - dtucker@cvs.openbsd.org 2009/06/21 07:37:15
    +     [kexdhs.c kexgexs.c]
    +     abort if key_sign fails, preventing possible null deref.  Based on report
    +     from Paolo Ganci, ok markus@ djm@
    +   - dtucker@cvs.openbsd.org 2009/06/21 09:04:03
    +     [roaming.h roaming_common.c roaming_dummy.c]
    +     Add  tags for the benefit of the sync scripts
    +     Also: pull in the changes for 1.1->1.2 missed in the previous sync.
    + - (dtucker) [auth2-jpake.c auth2.c canohost.h session.c] Whitespace and
    +   header-order changes to reduce diff vs OpenBSD.
    + - (dtucker) [servconf.c sshd.c] More whitespace sync.
    + - (dtucker) [roaming_common.c roaming_dummy.c] Wrap #include  in
    +   ifdef.
    +
    +20090616
    + - (dtucker) [configure.ac defines.h] Bug #1607: handle the case where fsid_t
    +   is a struct with a __val member.  Fixes build on, eg, Redhat 6.2.
    +
    +20090504
    + - (dtucker) [sshlogin.c] Move the NO_SSH_LASTLOG #ifndef line to include
    +   variable declarations.  Should prevent unused warnings anywhere it's set
    +   (only Crays as far as I can tell) and be a no-op everywhere else.
    +
    +20090318
    + - (tim) [configure.ac] Remove setting IP_TOS_IS_BROKEN for Cygwin. The problem
    +   that setsockopt(IP_TOS) doesn't work on Cygwin has been fixed since 2005.
    +   Based on patch from vinschen at redhat com.
    +
    +20090308
    + - (dtucker) [auth-passwd.c auth1.c auth2-kbdint.c auth2-none.c auth2-passwd.c
    +   auth2-pubkey.c session.c openbsd-compat/bsd-cygwin_util.{c,h}
    +   openbsd-compat/daemon.c] Remove support for Windows 95/98/ME and very old
    +   version of Cygwin.  Patch from vinschen at redhat com.
    +
    +20090307
    + - (dtucker) [contrib/aix/buildbff.sh] Only try to rename ssh_prng_cmds if it
    +   exists (it's not created if OpenSSL's PRNG is self-seeded, eg if the OS
    +   has a /dev/random).
    + - (dtucker) [schnorr.c openbsd-compat/openssl-compat.{c,h}] Add
    +   EVP_DigestUpdate to the OLD_EVP compatibility functions and tell schnorr.c
    +   to use them.  Allows building with older OpenSSL versions.
    + - (dtucker) [configure.ac defines.h] Check for in_port_t and typedef if needed.
    + - (dtucker) [configure.ac] Missing comma in type list.
    + - (dtucker) [configure.ac openbsd-compat/openssl-compat.{c,h}]
    +   EVP_DigestUpdate does not exactly match the other OLD_EVP functions (eg
    +   in openssl 0.9.6) so add an explicit test for it.
    +
    +20090306
    + - (djm) OpenBSD CVS Sync
    +   - djm@cvs.openbsd.org 2009/03/05 07:18:19
    +     [auth2-jpake.c jpake.c jpake.h monitor_wrap.c monitor_wrap.h schnorr.c]
    +     [sshconnect2.c]
    +     refactor the (disabled) Schnorr proof code to make it a little more
    +     generally useful
    +   - djm@cvs.openbsd.org 2009/03/05 11:30:50
    +     [uuencode.c]
    +     document what these functions do so I don't ever have to recuse into
    +     b64_pton/ntop to remember their return values
    +
     20090223
      - (djm) OpenBSD CVS Sync
        - djm@cvs.openbsd.org 2009/02/22 23:50:57
    diff --git a/crypto/openssh/README b/crypto/openssh/README
    index 9de00c093352..8538e8c9bb25 100644
    --- a/crypto/openssh/README
    +++ b/crypto/openssh/README
    @@ -1,4 +1,4 @@
    -See http://www.openssh.com/txt/release-5.2 for the release notes.
    +See http://www.openssh.com/txt/release-5.3 for the release notes.
     
     - A Japanese translation of this document and of the OpenSSH FAQ is
     - available at http://www.unixuser.org/~haruyama/security/openssh/index.html
    @@ -62,4 +62,4 @@ References -
     [6] http://www.openbsd.org/cgi-bin/man.cgi?query=style&sektion=9
     [7] http://www.openssh.com/faq.html
     
    -$Id: README,v 1.70 2009/02/23 00:11:57 djm Exp $
    +$Id: README,v 1.70.4.1 2009/09/26 04:11:47 djm Exp $
    diff --git a/crypto/openssh/README.platform b/crypto/openssh/README.platform
    index 3d7db1494777..d1982321e3a9 100644
    --- a/crypto/openssh/README.platform
    +++ b/crypto/openssh/README.platform
    @@ -56,6 +56,18 @@ using a third party driver. More information is available at:
     	http://www-user.rhrk.uni-kl.de/~nissler/tuntap/
     
     
    +Linux
    +-----
    +
    +Some Linux distributions (including Red Hat/Fedora/CentOS) include
    +headers and library links in the -devel RPMs rather than the main
    +binary RPMs. If you get an error about headers, or complaining about a
    +missing prerequisite then you may need to install the equivalent
    +development packages.  On Redhat based distros these may be openssl-devel,
    +zlib-devel and pam-devel, on Debian based distros these may be
    +libssl-dev, libz-dev and libpam-dev.
    +
    +
     Solaris
     -------
     If you enable BSM auditing on Solaris, you need to update audit_event(4)
    @@ -81,4 +93,4 @@ account stacks which will prevent authentication entirely, but will still
     return the output from pam_nologin to the client.
     
     
    -$Id: README.platform,v 1.9 2007/08/09 04:31:53 dtucker Exp $
    +$Id: README.platform,v 1.10 2009/08/28 23:14:48 dtucker Exp $
    diff --git a/crypto/openssh/auth-pam.c b/crypto/openssh/auth-pam.c
    index bbfafa67e053..fc79dee80e81 100644
    --- a/crypto/openssh/auth-pam.c
    +++ b/crypto/openssh/auth-pam.c
    @@ -602,16 +602,16 @@ sshpam_cleanup(void)
     		return;
     	debug("PAM: cleanup");
     	pam_set_item(sshpam_handle, PAM_CONV, (const void *)&null_conv);
    -	if (sshpam_cred_established) {
    -		debug("PAM: deleting credentials");
    -		pam_setcred(sshpam_handle, PAM_DELETE_CRED);
    -		sshpam_cred_established = 0;
    -	}
     	if (sshpam_session_open) {
     		debug("PAM: closing session");
     		pam_close_session(sshpam_handle, PAM_SILENT);
     		sshpam_session_open = 0;
     	}
    +	if (sshpam_cred_established) {
    +		debug("PAM: deleting credentials");
    +		pam_setcred(sshpam_handle, PAM_DELETE_CRED);
    +		sshpam_cred_established = 0;
    +	}
     	sshpam_authenticated = 0;
     	pam_end(sshpam_handle, sshpam_err);
     	sshpam_handle = NULL;
    diff --git a/crypto/openssh/auth-passwd.c b/crypto/openssh/auth-passwd.c
    index bdfced023f28..b1c6ce092894 100644
    --- a/crypto/openssh/auth-passwd.c
    +++ b/crypto/openssh/auth-passwd.c
    @@ -102,7 +102,7 @@ auth_password(Authctxt *authctxt, const char *password)
     	}
     #endif
     #ifdef HAVE_CYGWIN
    -	if (is_winnt) {
    +	{
     		HANDLE hToken = cygwin_logon_user(pw, password);
     
     		if (hToken == INVALID_HANDLE_VALUE)
    diff --git a/crypto/openssh/auth-sia.c b/crypto/openssh/auth-sia.c
    index debf30201b73..a9e1c258ca61 100644
    --- a/crypto/openssh/auth-sia.c
    +++ b/crypto/openssh/auth-sia.c
    @@ -34,10 +34,6 @@
     #include 
     #include 
     #include 
    -#include 
    -#include 
    -#include 
    -#include 
     
     #include "ssh.h"
     #include "key.h"
    @@ -53,52 +49,6 @@ extern ServerOptions options;
     extern int saved_argc;
     extern char **saved_argv;
     
    -static int
    -sia_password_change_required(const char *user)
    -{
    -	struct es_passwd *acct;
    -	time_t pw_life;
    -	time_t pw_date;
    -
    -	set_auth_parameters(saved_argc, saved_argv);
    -
    -	if ((acct = getespwnam(user)) == NULL) {
    -		error("Couldn't access protected database entry for %s", user);
    -		endprpwent();
    -		return (0);
    -	}
    -
    -	/* If forced password change flag is set, honor it */
    -	if (acct->uflg->fg_psw_chg_reqd && acct->ufld->fd_psw_chg_reqd) {
    -		endprpwent();
    -		return (1);
    -	}
    -
    -	/* Obtain password lifetime; if none, it can't have expired */
    -	if (acct->uflg->fg_expire)
    -		pw_life = acct->ufld->fd_expire;
    -	else if (acct->sflg->fg_expire)
    -		pw_life = acct->sfld->fd_expire;
    -	else {
    -		endprpwent();
    -		return (0);
    -	}
    -
    -	/* Offset from last change; if none, it must be expired */
    -	if (acct->uflg->fg_schange)
    -		pw_date = acct->ufld->fd_schange + pw_life;
    -	else {
    -		endprpwent();
    -		return (1);
    -	}
    -
    -	endprpwent();
    -
    -	/* If expiration date is prior to now, change password */
    -	
    -	return (pw_date <= time((time_t *) NULL));
    -}
    -
     int
     sys_auth_passwd(Authctxt *authctxt, const char *pass)
     {
    @@ -126,9 +76,6 @@ sys_auth_passwd(Authctxt *authctxt, const char *pass)
     
     	sia_ses_release(&ent);
     
    -	authctxt->force_pwchange = sia_password_change_required(
    -		authctxt->user);
    -
     	return (1);
     }
     
    diff --git a/crypto/openssh/auth1.c b/crypto/openssh/auth1.c
    index b8a255872327..1801661fdda8 100644
    --- a/crypto/openssh/auth1.c
    +++ b/crypto/openssh/auth1.c
    @@ -318,15 +318,7 @@ do_authloop(Authctxt *authctxt)
     		}
     #endif /* _UNICOS */
     
    -#ifdef HAVE_CYGWIN
    -		if (authenticated &&
    -		    !check_nt_auth(type == SSH_CMSG_AUTH_PASSWORD,
    -		    authctxt->pw)) {
    -			packet_disconnect("Authentication rejected for uid %d.",
    -			    authctxt->pw == NULL ? -1 : authctxt->pw->pw_uid);
    -			authenticated = 0;
    -		}
    -#else
    +#ifndef HAVE_CYGWIN
     		/* Special handling for root */
     		if (authenticated && authctxt->pw->pw_uid == 0 &&
     		    !auth_root_allowed(meth->name)) {
    diff --git a/crypto/openssh/auth2-jpake.c b/crypto/openssh/auth2-jpake.c
    index efe7ff2a396f..5de5506a6641 100644
    --- a/crypto/openssh/auth2-jpake.c
    +++ b/crypto/openssh/auth2-jpake.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: auth2-jpake.c,v 1.2 2008/11/07 23:34:48 dtucker Exp $ */
    +/* $OpenBSD: auth2-jpake.c,v 1.3 2009/03/05 07:18:19 djm Exp $ */
     /*
      * Copyright (c) 2008 Damien Miller.  All rights reserved.
      *
    @@ -42,8 +42,8 @@
     #include "ssh2.h"
     #include "key.h"
     #include "hostfile.h"
    -#include "buffer.h"
     #include "auth.h"
    +#include "buffer.h"
     #include "packet.h"
     #include "dispatch.h"
     #include "log.h"
    @@ -55,6 +55,7 @@
     #endif
     #include "monitor_wrap.h"
     
    +#include "schnorr.h"
     #include "jpake.h"
     
     /*
    @@ -359,7 +360,7 @@ auth2_jpake_get_pwdata(Authctxt *authctxt, BIGNUM **s,
     }
     
     /*
    - * Being authentication attempt.
    + * Begin authentication attempt.
      * Note, sets authctxt->postponed while in subprotocol
      */
     static int
    diff --git a/crypto/openssh/auth2-kbdint.c b/crypto/openssh/auth2-kbdint.c
    index a4fc9e6f73f2..fae67da6e337 100644
    --- a/crypto/openssh/auth2-kbdint.c
    +++ b/crypto/openssh/auth2-kbdint.c
    @@ -58,10 +58,6 @@ userauth_kbdint(Authctxt *authctxt)
     
     	xfree(devs);
     	xfree(lang);
    -#ifdef HAVE_CYGWIN
    -	if (check_nt_auth(0, authctxt->pw) == 0)
    -		authenticated = 0;
    -#endif
     	return authenticated;
     }
     
    diff --git a/crypto/openssh/auth2-none.c b/crypto/openssh/auth2-none.c
    index 10accfe552df..08f2f935fe98 100644
    --- a/crypto/openssh/auth2-none.c
    +++ b/crypto/openssh/auth2-none.c
    @@ -61,10 +61,6 @@ userauth_none(Authctxt *authctxt)
     {
     	none_enabled = 0;
     	packet_check_eom();
    -#ifdef HAVE_CYGWIN
    -	if (check_nt_auth(1, authctxt->pw) == 0)
    -		return (0);
    -#endif
     	if (options.password_authentication)
     		return (PRIVSEP(auth_password(authctxt, "")));
     	return (0);
    diff --git a/crypto/openssh/auth2-passwd.c b/crypto/openssh/auth2-passwd.c
    index 421c5c25d018..5f1f3635f7a0 100644
    --- a/crypto/openssh/auth2-passwd.c
    +++ b/crypto/openssh/auth2-passwd.c
    @@ -68,10 +68,6 @@ userauth_passwd(Authctxt *authctxt)
     		logit("password change not supported");
     	else if (PRIVSEP(auth_password(authctxt, password)) == 1)
     		authenticated = 1;
    -#ifdef HAVE_CYGWIN
    -	if (check_nt_auth(1, authctxt->pw) == 0)
    -		authenticated = 0;
    -#endif
     	memset(password, 0, len);
     	xfree(password);
     	return authenticated;
    diff --git a/crypto/openssh/auth2-pubkey.c b/crypto/openssh/auth2-pubkey.c
    index b1e38e5f586d..2886f1275f02 100644
    --- a/crypto/openssh/auth2-pubkey.c
    +++ b/crypto/openssh/auth2-pubkey.c
    @@ -170,10 +170,6 @@ done:
     		key_free(key);
     	xfree(pkalg);
     	xfree(pkblob);
    -#ifdef HAVE_CYGWIN
    -	if (check_nt_auth(0, authctxt->pw) == 0)
    -		authenticated = 0;
    -#endif
     	return authenticated;
     }
     
    diff --git a/crypto/openssh/auth2.c b/crypto/openssh/auth2.c
    index 1c44bb5c937f..50fb3396f04c 100644
    --- a/crypto/openssh/auth2.c
    +++ b/crypto/openssh/auth2.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: auth2.c,v 1.120 2008/11/04 08:22:12 djm Exp $ */
    +/* $OpenBSD: auth2.c,v 1.121 2009/06/22 05:39:28 dtucker Exp $ */
     /*
      * Copyright (c) 2000 Markus Friedl.  All rights reserved.
      *
    @@ -36,8 +36,8 @@ __RCSID("$FreeBSD$");
     #include 
     #include 
     
    -#include "xmalloc.h"
     #include "atomicio.h"
    +#include "xmalloc.h"
     #include "ssh2.h"
     #include "packet.h"
     #include "log.h"
    diff --git a/crypto/openssh/canohost.c b/crypto/openssh/canohost.c
    index 7138f48d0f41..22b19bb9fa49 100644
    --- a/crypto/openssh/canohost.c
    +++ b/crypto/openssh/canohost.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: canohost.c,v 1.64 2009/02/12 03:00:56 djm Exp $ */
    +/* $OpenBSD: canohost.c,v 1.65 2009/05/27 06:31:25 andreas Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -35,6 +35,8 @@
     #include "misc.h"
     
     static void check_ip_options(int, char *);
    +static char *canonical_host_ip = NULL;
    +static int cached_port = -1;
     
     /*
      * Return the canonical name of the host at the other end of the socket. The
    @@ -304,6 +306,16 @@ get_local_name(int sock)
     	return get_socket_address(sock, 0, NI_NAMEREQD);
     }
     
    +void
    +clear_cached_addr(void)
    +{
    +	if (canonical_host_ip != NULL) {
    +		xfree(canonical_host_ip);
    +		canonical_host_ip = NULL;
    +	}
    +	cached_port = -1;
    +}
    +
     /*
      * Returns the IP-address of the remote host as a string.  The returned
      * string must not be freed.
    @@ -312,8 +324,6 @@ get_local_name(int sock)
     const char *
     get_remote_ipaddr(void)
     {
    -	static char *canonical_host_ip = NULL;
    -
     	/* Check whether we have cached the ipaddr. */
     	if (canonical_host_ip == NULL) {
     		if (packet_connection_is_on_socket()) {
    @@ -402,13 +412,11 @@ get_peer_port(int sock)
     int
     get_remote_port(void)
     {
    -	static int port = -1;
    -
     	/* Cache to avoid getpeername() on a dead connection */
    -	if (port == -1)
    -		port = get_port(0);
    +	if (cached_port == -1)
    +		cached_port = get_port(0);
     
    -	return port;
    +	return cached_port;
     }
     
     int
    diff --git a/crypto/openssh/canohost.h b/crypto/openssh/canohost.h
    index d9b41ffe5449..4c8636f42dd4 100644
    --- a/crypto/openssh/canohost.h
    +++ b/crypto/openssh/canohost.h
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: canohost.h,v 1.10 2009/02/12 03:00:56 djm Exp $ */
    +/* $OpenBSD: canohost.h,v 1.11 2009/05/27 06:31:25 andreas Exp $ */
     
     /*
      * Author: Tatu Ylonen 
    @@ -24,6 +24,6 @@ char		*get_local_name(int);
     int		 get_remote_port(void);
     int		 get_local_port(void);
     int		 get_sock_port(int, int);
    -
    +void		 clear_cached_addr(void);
     
     void		 ipv64_normalise_mapped(struct sockaddr_storage *, socklen_t *);
    diff --git a/crypto/openssh/channels.c b/crypto/openssh/channels.c
    index dea60ba24e77..e8b8aa07e16e 100644
    --- a/crypto/openssh/channels.c
    +++ b/crypto/openssh/channels.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: channels.c,v 1.295 2009/02/12 03:00:56 djm Exp $ */
    +/* $OpenBSD: channels.c,v 1.296 2009/05/25 06:48:00 andreas Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -1653,6 +1653,7 @@ channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)
     			}
     			return -1;
     		}
    +#ifndef BROKEN_TCGETATTR_ICANON
     		if (compat20 && c->isatty && dlen >= 1 && buf[0] != '\r') {
     			if (tcgetattr(c->wfd, &tio) == 0 &&
     			    !(tio.c_lflag & ECHO) && (tio.c_lflag & ICANON)) {
    @@ -1666,6 +1667,7 @@ channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)
     				packet_send();
     			}
     		}
    +#endif
     		buffer_consume(&c->output, len);
     		if (compat20 && len > 0) {
     			c->local_consumed += len;
    @@ -2431,7 +2433,7 @@ channel_input_status_confirm(int type, u_int32_t seq, void *ctxt)
     	int id;
     
     	/* Reset keepalive timeout */
    -	keep_alive_timeouts = 0;
    +	packet_set_alive_timeouts(0);
     
     	id = packet_get_int();
     	packet_check_eom();
    diff --git a/crypto/openssh/clientloop.c b/crypto/openssh/clientloop.c
    index a2d2d1d07465..9a7dc0ab0b01 100644
    --- a/crypto/openssh/clientloop.c
    +++ b/crypto/openssh/clientloop.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: clientloop.c,v 1.209 2009/02/12 03:00:56 djm Exp $ */
    +/* $OpenBSD: clientloop.c,v 1.213 2009/07/05 19:28:33 stevesk Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -109,6 +109,7 @@
     #include "misc.h"
     #include "match.h"
     #include "msg.h"
    +#include "roaming.h"
     
     /* import options */
     extern Options options;
    @@ -491,13 +492,13 @@ client_global_request_reply(int type, u_int32_t seq, void *ctxt)
     		xfree(gc);
     	}
     
    -	keep_alive_timeouts = 0;
    +	packet_set_alive_timeouts(0);
     }
     
     static void
     server_alive_check(void)
     {
    -	if (++keep_alive_timeouts > options.server_alive_count_max) {
    +	if (packet_inc_alive_timeouts() > options.server_alive_count_max) {
     		logit("Timeout, server not responding.");
     		cleanup_exit(255);
     	}
    @@ -634,8 +635,8 @@ client_suspend_self(Buffer *bin, Buffer *bout, Buffer *berr)
     static void
     client_process_net_input(fd_set *readset)
     {
    -	int len;
    -	char buf[8192];
    +	int len, cont = 0;
    +	char buf[SSH_IOBUFSZ];
     
     	/*
     	 * Read input from the server, and add any such data to the buffer of
    @@ -643,8 +644,8 @@ client_process_net_input(fd_set *readset)
     	 */
     	if (FD_ISSET(connection_in, readset)) {
     		/* Read as much as possible. */
    -		len = read(connection_in, buf, sizeof(buf));
    -		if (len == 0) {
    +		len = roaming_read(connection_in, buf, sizeof(buf), &cont);
    +		if (len == 0 && cont == 0) {
     			/*
     			 * Received EOF.  The remote host has closed the
     			 * connection.
    @@ -1128,7 +1129,7 @@ static void
     client_process_input(fd_set *readset)
     {
     	int len;
    -	char buf[8192];
    +	char buf[SSH_IOBUFSZ];
     
     	/* Read input from stdin. */
     	if (FD_ISSET(fileno(stdin), readset)) {
    @@ -1476,6 +1477,14 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
     	/* Stop watching for window change. */
     	signal(SIGWINCH, SIG_DFL);
     
    +	if (compat20) {
    +		packet_start(SSH2_MSG_DISCONNECT);
    +		packet_put_int(SSH2_DISCONNECT_BY_APPLICATION);
    +		packet_put_cstring("disconnected by user");
    +		packet_send();
    +		packet_write_wait();
    +	}
    +
     	channel_free_all();
     
     	if (have_pty)
    diff --git a/crypto/openssh/config.h b/crypto/openssh/config.h
    index d07ee699a020..2240a37884ad 100644
    --- a/crypto/openssh/config.h
    +++ b/crypto/openssh/config.h
    @@ -69,6 +69,9 @@
     /* Define if your snprintf is busted */
     /* #undef BROKEN_SNPRINTF */
     
    +/* tcgetattr with ICANON may hang */
    +/* #undef BROKEN_TCGETATTR_ICANON */
    +
     /* updwtmpx is broken (if present) */
     /* #undef BROKEN_UPDWTMPX */
     
    @@ -82,13 +85,13 @@
     /* #undef CONF_UTMPX_FILE */
     
     /* Define if you want to specify the path to your utmp file */
    -#define CONF_UTMP_FILE "/var/run/utmp"
    +/* #undef CONF_UTMP_FILE */
     
     /* Define if you want to specify the path to your wtmpx file */
     /* #undef CONF_WTMPX_FILE */
     
     /* Define if you want to specify the path to your wtmp file */
    -#define CONF_WTMP_FILE "/var/log/wtmp"
    +/* #undef CONF_WTMP_FILE */
     
     /* Define if your platform needs to skip post auth file descriptor passing */
     /* #undef DISABLE_FD_PASSING */
    @@ -109,13 +112,13 @@
     /* #undef DISABLE_SHADOW */
     
     /* Define if you don't want to use utmp */
    -/* #undef DISABLE_UTMP */
    +#define DISABLE_UTMP 1
     
     /* Define if you don't want to use utmpx */
    -#define DISABLE_UTMPX 1
    +/* #undef DISABLE_UTMPX */
     
     /* Define if you don't want to use wtmp */
    -/* #undef DISABLE_WTMP */
    +#define DISABLE_WTMP 1
     
     /* Define if you don't want to use wtmpx */
     #define DISABLE_WTMPX 1
    @@ -123,9 +126,12 @@
     /* Builtin PRNG command timeout */
     #define ENTROPY_TIMEOUT_MSEC 200
     
    -/* f_fsid has members */
    +/* fsid_t has member val */
     /* #undef FSID_HAS_VAL */
     
    +/* fsid_t has member __val */
    +/* #undef FSID_HAS___VAL */
    +
     /* Define to 1 if the `getpgrp' function requires zero arguments. */
     #define GETPGRP_VOID 1
     
    @@ -313,7 +319,7 @@
     /* #undef HAVE_ENDUTENT */
     
     /* Define to 1 if you have the `endutxent' function. */
    -/* #undef HAVE_ENDUTXENT */
    +#define HAVE_ENDUTXENT 1
     
     /* Define if your system has /etc/default/login */
     /* #undef HAVE_ETC_DEFAULT_LOGIN */
    @@ -439,13 +445,13 @@
     /* #undef HAVE_GETUTLINE */
     
     /* Define to 1 if you have the `getutxent' function. */
    -/* #undef HAVE_GETUTXENT */
    +#define HAVE_GETUTXENT 1
     
     /* Define to 1 if you have the `getutxid' function. */
    -/* #undef HAVE_GETUTXID */
    +#define HAVE_GETUTXID 1
     
     /* Define to 1 if you have the `getutxline' function. */
    -/* #undef HAVE_GETUTXLINE */
    +#define HAVE_GETUTXLINE 1
     
     /* Define to 1 if you have the `get_default_context_with_level' function. */
     /* #undef HAVE_GET_DEFAULT_CONTEXT_WITH_LEVEL */
    @@ -478,10 +484,10 @@
     #define HAVE_HEADER_AD 1
     
     /* Define if you have ut_host in utmp.h */
    -#define HAVE_HOST_IN_UTMP 1
    +/* #undef HAVE_HOST_IN_UTMP */
     
     /* Define if you have ut_host in utmpx.h */
    -/* #undef HAVE_HOST_IN_UTMPX */
    +#define HAVE_HOST_IN_UTMPX 1
     
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_IAF_H */
    @@ -493,7 +499,7 @@
     /* #undef HAVE_ID_IN_UTMP */
     
     /* Define if you have ut_id in utmpx.h */
    -/* #undef HAVE_ID_IN_UTMPX */
    +#define HAVE_ID_IN_UTMPX 1
     
     /* Define to 1 if you have the `inet_aton' function. */
     #define HAVE_INET_ATON 1
    @@ -519,6 +525,9 @@
     /* Define to 1 if the system has the type `in_addr_t'. */
     #define HAVE_IN_ADDR_T 1
     
    +/* Define to 1 if the system has the type `in_port_t'. */
    +#define HAVE_IN_PORT_T 1
    +
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_LASTLOG_H */
     
    @@ -565,7 +574,7 @@
     /* #undef HAVE_LINUX_IF_TUN_H */
     
     /* Define if your libraries define login() */
    -#define HAVE_LOGIN 1
    +/* #undef HAVE_LOGIN */
     
     /* Define to 1 if you have the  header file. */
     #define HAVE_LOGIN_CAP_H 1
    @@ -577,10 +586,10 @@
     /* #undef HAVE_LOGIN_H */
     
     /* Define to 1 if you have the `logout' function. */
    -#define HAVE_LOGOUT 1
    +/* #undef HAVE_LOGOUT */
     
     /* Define to 1 if you have the `logwtmp' function. */
    -#define HAVE_LOGWTMP 1
    +/* #undef HAVE_LOGWTMP */
     
     /* Define to 1 if the system has the type `long double'. */
     #define HAVE_LONG_DOUBLE 1
    @@ -695,7 +704,7 @@
     /* #undef HAVE_PUTUTLINE */
     
     /* Define to 1 if you have the `pututxline' function. */
    -/* #undef HAVE_PUTUTXLINE */
    +#define HAVE_PUTUTXLINE 1
     
     /* Define if your password has a pw_change field */
     #define HAVE_PW_CHANGE_IN_PASSWD 1
    @@ -791,7 +800,7 @@
     /* #undef HAVE_SETUTENT */
     
     /* Define to 1 if you have the `setutxent' function. */
    -/* #undef HAVE_SETUTXENT */
    +#define HAVE_SETUTXENT 1
     
     /* Define to 1 if you have the `setvbuf' function. */
     #define HAVE_SETVBUF 1
    @@ -1016,7 +1025,7 @@
     #define HAVE_TIME_H 1
     
     /* Define if you have ut_time in utmp.h */
    -#define HAVE_TIME_IN_UTMP 1
    +/* #undef HAVE_TIME_IN_UTMP */
     
     /* Define if you have ut_time in utmpx.h */
     /* #undef HAVE_TIME_IN_UTMPX */
    @@ -1034,13 +1043,13 @@
     /* #undef HAVE_TV_IN_UTMP */
     
     /* Define if you have ut_tv in utmpx.h */
    -/* #undef HAVE_TV_IN_UTMPX */
    +#define HAVE_TV_IN_UTMPX 1
     
     /* Define if you have ut_type in utmp.h */
     /* #undef HAVE_TYPE_IN_UTMP */
     
     /* Define if you have ut_type in utmpx.h */
    -/* #undef HAVE_TYPE_IN_UTMPX */
    +#define HAVE_TYPE_IN_UTMPX 1
     
     /* Define to 1 if you have the  header file. */
     /* #undef HAVE_UCRED_H */
    @@ -1082,10 +1091,10 @@
     /* #undef HAVE_UTMPXNAME */
     
     /* Define to 1 if you have the  header file. */
    -/* #undef HAVE_UTMPX_H */
    +#define HAVE_UTMPX_H 1
     
     /* Define to 1 if you have the  header file. */
    -#define HAVE_UTMP_H 1
    +/* #undef HAVE_UTMP_H */
     
     /* define if you have u_char data type */
     #define HAVE_U_CHAR 1
    @@ -1227,6 +1236,9 @@
     /* Define if X11 doesn't support AF_UNIX sockets on that system */
     /* #undef NO_X11_UNIX_SOCKETS */
     
    +/* Define if EVP_DigestUpdate returns void */
    +/* #undef OPENSSL_EVP_DIGESTUPDATE_VOID */
    +
     /* libcrypto is missing AES 192 and 256 bit functions */
     /* #undef OPENSSL_LOBOTOMISED_AES */
     
    @@ -1310,6 +1322,9 @@
     /* Use audit debugging module */
     /* #undef SSH_AUDIT_EVENTS */
     
    +/* Windows is sensitive to read buffer size */
    +/* #undef SSH_IOBUFSZ */
    +
     /* non-privileged user for privilege separation */
     #define SSH_PRIVSEP_USER "sshd"
     
    @@ -1398,9 +1413,13 @@
     /* Define if you want SELinux support. */
     /* #undef WITH_SELINUX */
     
    -/* Define to 1 if your processor stores words with the most significant byte
    -   first (like Motorola and SPARC, unlike Intel and VAX). */
    -/* #undef WORDS_BIGENDIAN */
    +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    +   significant byte first (like Motorola and SPARC, unlike Intel and VAX). */
    +#if defined __BIG_ENDIAN__
    +# define WORDS_BIGENDIAN 1
    +#elif ! defined __LITTLE_ENDIAN__
    +/* # undef WORDS_BIGENDIAN */
    +#endif
     
     /* Define if xauth is found in your path */
     /* #undef XAUTH_PATH */
    diff --git a/crypto/openssh/config.h.in b/crypto/openssh/config.h.in
    index 84967a46126f..fc195bad54f6 100644
    --- a/crypto/openssh/config.h.in
    +++ b/crypto/openssh/config.h.in
    @@ -1,5 +1,8 @@
     /* config.h.in.  Generated from configure.ac by autoheader.  */
     
    +/* Define if building universal (internal helper macro) */
    +#undef AC_APPLE_UNIVERSAL_BUILD
    +
     /* Define if you have a getaddrinfo that fails for the all-zeros IPv6 address
        */
     #undef AIX_GETNAMEINFO_HACK
    @@ -68,6 +71,9 @@
     /* Define if your snprintf is busted */
     #undef BROKEN_SNPRINTF
     
    +/* tcgetattr with ICANON may hang */
    +#undef BROKEN_TCGETATTR_ICANON
    +
     /* updwtmpx is broken (if present) */
     #undef BROKEN_UPDWTMPX
     
    @@ -122,9 +128,12 @@
     /* Builtin PRNG command timeout */
     #undef ENTROPY_TIMEOUT_MSEC
     
    -/* f_fsid has members */
    +/* fsid_t has member val */
     #undef FSID_HAS_VAL
     
    +/* fsid_t has member __val */
    +#undef FSID_HAS___VAL
    +
     /* Define to 1 if the `getpgrp' function requires zero arguments. */
     #undef GETPGRP_VOID
     
    @@ -518,6 +527,9 @@
     /* Define to 1 if the system has the type `in_addr_t'. */
     #undef HAVE_IN_ADDR_T
     
    +/* Define to 1 if the system has the type `in_port_t'. */
    +#undef HAVE_IN_PORT_T
    +
     /* Define to 1 if you have the  header file. */
     #undef HAVE_LASTLOG_H
     
    @@ -1226,6 +1238,9 @@
     /* Define if X11 doesn't support AF_UNIX sockets on that system */
     #undef NO_X11_UNIX_SOCKETS
     
    +/* Define if EVP_DigestUpdate returns void */
    +#undef OPENSSL_EVP_DIGESTUPDATE_VOID
    +
     /* libcrypto is missing AES 192 and 256 bit functions */
     #undef OPENSSL_LOBOTOMISED_AES
     
    @@ -1309,6 +1324,9 @@
     /* Use audit debugging module */
     #undef SSH_AUDIT_EVENTS
     
    +/* Windows is sensitive to read buffer size */
    +#undef SSH_IOBUFSZ
    +
     /* non-privileged user for privilege separation */
     #undef SSH_PRIVSEP_USER
     
    @@ -1397,9 +1415,17 @@
     /* Define if you want SELinux support. */
     #undef WITH_SELINUX
     
    -/* Define to 1 if your processor stores words with the most significant byte
    -   first (like Motorola and SPARC, unlike Intel and VAX). */
    -#undef WORDS_BIGENDIAN
    +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    +   significant byte first (like Motorola and SPARC, unlike Intel). */
    +#if defined AC_APPLE_UNIVERSAL_BUILD
    +# if defined __BIG_ENDIAN__
    +#  define WORDS_BIGENDIAN 1
    +# endif
    +#else
    +# ifndef WORDS_BIGENDIAN
    +#  undef WORDS_BIGENDIAN
    +# endif
    +#endif
     
     /* Define if xauth is found in your path */
     #undef XAUTH_PATH
    diff --git a/crypto/openssh/defines.h b/crypto/openssh/defines.h
    index 536ec4978be5..827e92d276fd 100644
    --- a/crypto/openssh/defines.h
    +++ b/crypto/openssh/defines.h
    @@ -25,7 +25,7 @@
     #ifndef _DEFINES_H
     #define _DEFINES_H
     
    -/* $Id: defines.h,v 1.153 2009/02/01 11:19:54 dtucker Exp $ */
    +/* $Id: defines.h,v 1.156 2009/08/28 01:21:07 dtucker Exp $ */
     
     
     /* Constants */
    @@ -300,6 +300,9 @@ struct	sockaddr_un {
     #ifndef HAVE_IN_ADDR_T
     typedef u_int32_t	in_addr_t;
     #endif
    +#ifndef HAVE_IN_PORT_T
    +typedef u_int16_t	in_port_t;
    +#endif
     
     #if defined(BROKEN_SYS_TERMIO_H) && !defined(_STRUCT_WINSIZE)
     #define _STRUCT_WINSIZE
    @@ -591,6 +594,10 @@ struct winsize {
     #define FSID_TO_ULONG(f) \
     	((((u_int64_t)(f).val[0] & 0xffffffffUL) << 32) | \
     	    ((f).val[1] & 0xffffffffUL))
    +#elif defined(FSID_HAS___VAL)
    +#define FSID_TO_ULONG(f) \
    +	((((u_int64_t)(f).__val[0] & 0xffffffffUL) << 32) | \
    +	    ((f).__val[1] & 0xffffffffUL))
     #else
     # define FSID_TO_ULONG(f) ((f))
     #endif
    @@ -667,7 +674,7 @@ struct winsize {
     #else
     /* Simply select your favourite login types. */
     /* Can't do if-else because some systems use several...  */
    -#  if defined(UTMPX_FILE) && !defined(DISABLE_UTMPX)
    +#  if !defined(DISABLE_UTMPX)
     #    define USE_UTMPX
     #  endif
     #  if defined(UTMP_FILE) && !defined(DISABLE_UTMP)
    @@ -742,4 +749,8 @@ struct winsize {
     #define INET6_ADDRSTRLEN 46
     #endif
     
    +#ifndef SSH_IOBUFSZ
    +# define SSH_IOBUFSZ 8192
    +#endif
    +
     #endif /* _DEFINES_H */
    diff --git a/crypto/openssh/gss-genr.c b/crypto/openssh/gss-genr.c
    index e9190575d357..842f38582c0c 100644
    --- a/crypto/openssh/gss-genr.c
    +++ b/crypto/openssh/gss-genr.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: gss-genr.c,v 1.19 2007/06/12 11:56:15 dtucker Exp $ */
    +/* $OpenBSD: gss-genr.c,v 1.20 2009/06/22 05:39:28 dtucker Exp $ */
     
     /*
      * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
    diff --git a/crypto/openssh/includes.h b/crypto/openssh/includes.h
    index f1b47f666d03..6bb98780729c 100644
    --- a/crypto/openssh/includes.h
    +++ b/crypto/openssh/includes.h
    @@ -31,7 +31,8 @@
     #endif
     #if defined(HAVE_GLOB_H) && defined(GLOB_HAS_ALTDIRFUNC) && \
         defined(GLOB_HAS_GL_MATCHC) && \
    -    defined(HAVE_DECL_GLOB_NOMATCH) &&  HAVE_DECL_GLOB_NOMATCH != 0
    +    defined(HAVE_DECL_GLOB_NOMATCH) &&  HAVE_DECL_GLOB_NOMATCH != 0 && \
    +    !defined(BROKEN_GLOB)
     # include 
     #endif
     #ifdef HAVE_ENDIAN_H
    diff --git a/crypto/openssh/jpake.c b/crypto/openssh/jpake.c
    index 565f2e255089..130661069fbd 100644
    --- a/crypto/openssh/jpake.c
    +++ b/crypto/openssh/jpake.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: jpake.c,v 1.1 2008/11/04 08:22:12 djm Exp $ */
    +/* $OpenBSD: jpake.c,v 1.2 2009/03/05 07:18:19 djm Exp $ */
     /*
      * Copyright (c) 2008 Damien Miller.  All rights reserved.
      *
    @@ -47,6 +47,7 @@
     #include "log.h"
     
     #include "jpake.h"
    +#include "schnorr.h"
     
     #ifdef JPAKE
     
    @@ -60,165 +61,10 @@
     	"98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB" \
     	"9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF"
     
    -struct jpake_group *
    +struct modp_group *
     jpake_default_group(void)
     {
    -	struct jpake_group *ret;
    -
    -	ret = xmalloc(sizeof(*ret));
    -	ret->p = ret->q = ret->g = NULL;
    -	if (BN_hex2bn(&ret->p, JPAKE_GROUP_P) == 0 ||
    -	    BN_hex2bn(&ret->g, JPAKE_GROUP_G) == 0)
    -		fatal("%s: BN_hex2bn", __func__);
    -	/* Subgroup order is p/2 (p is a safe prime) */
    -	if ((ret->q = BN_new()) == NULL)
    -		fatal("%s: BN_new", __func__);
    -	if (BN_rshift1(ret->q, ret->p) != 1)
    -		fatal("%s: BN_rshift1", __func__);
    -
    -	return ret;
    -}
    -
    -/*
    - * Generate uniformly distributed random number in range (1, high).
    - * Return number on success, NULL on failure.
    - */
    -BIGNUM *
    -bn_rand_range_gt_one(const BIGNUM *high)
    -{
    -	BIGNUM *r, *tmp;
    -	int success = -1;
    -
    -	if ((tmp = BN_new()) == NULL) {
    -		error("%s: BN_new", __func__);
    -		return NULL;
    -	}
    -	if ((r = BN_new()) == NULL) {
    -		error("%s: BN_new failed", __func__);
    -		goto out;
    -	}
    -	if (BN_set_word(tmp, 2) != 1) {
    -		error("%s: BN_set_word(tmp, 2)", __func__);
    -		goto out;
    -	}
    -	if (BN_sub(tmp, high, tmp) == -1) {
    -		error("%s: BN_sub failed (tmp = high - 2)", __func__);
    -		goto out;
    -	}
    -	if (BN_rand_range(r, tmp) == -1) {
    -		error("%s: BN_rand_range failed", __func__);
    -		goto out;
    -	}
    -	if (BN_set_word(tmp, 2) != 1) {
    -		error("%s: BN_set_word(tmp, 2)", __func__);
    -		goto out;
    -	}
    -	if (BN_add(r, r, tmp) == -1) {
    -		error("%s: BN_add failed (r = r + 2)", __func__);
    -		goto out;
    -	}
    -	success = 0;
    - out:
    -	BN_clear_free(tmp);
    -	if (success == 0)
    -		return r;
    -	BN_clear_free(r);
    -	return NULL;
    -}
    -
    -/*
    - * Hash contents of buffer 'b' with hash 'md'. Returns 0 on success,
    - * with digest via 'digestp' (caller to free) and length via 'lenp'.
    - * Returns -1 on failure.
    - */
    -int
    -hash_buffer(const u_char *buf, u_int len, const EVP_MD *md,
    -    u_char **digestp, u_int *lenp)
    -{
    -	u_char digest[EVP_MAX_MD_SIZE];
    -	u_int digest_len;
    -	EVP_MD_CTX evp_md_ctx;
    -	int success = -1;
    -
    -	EVP_MD_CTX_init(&evp_md_ctx);
    -
    -	if (EVP_DigestInit_ex(&evp_md_ctx, md, NULL) != 1) {
    -		error("%s: EVP_DigestInit_ex", __func__);
    -		goto out;
    -	}
    -	if (EVP_DigestUpdate(&evp_md_ctx, buf, len) != 1) {
    -		error("%s: EVP_DigestUpdate", __func__);
    -		goto out;
    -	}
    -	if (EVP_DigestFinal_ex(&evp_md_ctx, digest, &digest_len) != 1) {
    -		error("%s: EVP_DigestFinal_ex", __func__);
    -		goto out;
    -	}
    -	*digestp = xmalloc(digest_len);
    -	*lenp = digest_len;
    -	memcpy(*digestp, digest, *lenp);
    -	success = 0;
    - out:
    -	EVP_MD_CTX_cleanup(&evp_md_ctx);
    -	bzero(digest, sizeof(digest));
    -	digest_len = 0;
    -	return success;
    -}
    -
    -/* print formatted string followed by bignum */
    -void
    -jpake_debug3_bn(const BIGNUM *n, const char *fmt, ...)
    -{
    -	char *out, *h;
    -	va_list args;
    -
    -	out = NULL;
    -	va_start(args, fmt);
    -	vasprintf(&out, fmt, args);
    -	va_end(args);
    -	if (out == NULL)
    -		fatal("%s: vasprintf failed", __func__);
    -
    -	if (n == NULL)
    -		debug3("%s(null)", out);
    -	else {
    -		h = BN_bn2hex(n);
    -		debug3("%s0x%s", out, h);
    -		free(h);
    -	}
    -	free(out);
    -}
    -
    -/* print formatted string followed by buffer contents in hex */
    -void
    -jpake_debug3_buf(const u_char *buf, u_int len, const char *fmt, ...)
    -{
    -	char *out, h[65];
    -	u_int i, j;
    -	va_list args;
    -
    -	out = NULL;
    -	va_start(args, fmt);
    -	vasprintf(&out, fmt, args);
    -	va_end(args);
    -	if (out == NULL)
    -		fatal("%s: vasprintf failed", __func__);
    -
    -	debug3("%s length %u%s", out, len, buf == NULL ? " (null)" : "");
    -	free(out);
    -	if (buf == NULL)
    -		return;
    -
    -	*h = '\0';
    -	for (i = j = 0; i < len; i++) {
    -		snprintf(h + j, sizeof(h) - j, "%02x", buf[i]);
    -		j += 2;
    -		if (j >= sizeof(h) - 1 || i == len - 1) {
    -			debug3("    %s", h);
    -			*h = '\0';
    -			j = 0;
    -		}
    -	}
    +	return modp_group_from_g_and_safe_p(JPAKE_GROUP_G, JPAKE_GROUP_P);
     }
     
     struct jpake_ctx *
    @@ -243,7 +89,6 @@ jpake_new(void)
     	return ret;
     }
     
    -
     void
     jpake_free(struct jpake_ctx *pctx)
     {
    @@ -344,7 +189,7 @@ jpake_dump(struct jpake_ctx *pctx, const char *fmt, ...)
     
     /* Shared parts of step 1 exchange calculation */
     void
    -jpake_step1(struct jpake_group *grp,
    +jpake_step1(struct modp_group *grp,
         u_char **id, u_int *id_len,
         BIGNUM **priv1, BIGNUM **priv2, BIGNUM **g_priv1, BIGNUM **g_priv2,
         u_char **priv1_proof, u_int *priv1_proof_len,
    @@ -383,11 +228,11 @@ jpake_step1(struct jpake_group *grp,
     		fatal("%s: BN_mod_exp", __func__);
     
     	/* Generate proofs for holding x1/x3 and x2/x4 */
    -	if (schnorr_sign(grp->p, grp->q, grp->g,
    +	if (schnorr_sign_buf(grp->p, grp->q, grp->g,
     	    *priv1, *g_priv1, *id, *id_len,
     	    priv1_proof, priv1_proof_len) != 0)
     		fatal("%s: schnorr_sign", __func__);
    -	if (schnorr_sign(grp->p, grp->q, grp->g,
    +	if (schnorr_sign_buf(grp->p, grp->q, grp->g,
     	    *priv2, *g_priv2, *id, *id_len,
     	    priv2_proof, priv2_proof_len) != 0)
     		fatal("%s: schnorr_sign", __func__);
    @@ -397,7 +242,7 @@ jpake_step1(struct jpake_group *grp,
     
     /* Shared parts of step 2 exchange calculation */
     void
    -jpake_step2(struct jpake_group *grp, BIGNUM *s,
    +jpake_step2(struct modp_group *grp, BIGNUM *s,
         BIGNUM *mypub1, BIGNUM *theirpub1, BIGNUM *theirpub2, BIGNUM *mypriv2,
         const u_char *theirid, u_int theirid_len,
         const u_char *myid, u_int myid_len,
    @@ -415,10 +260,10 @@ jpake_step2(struct jpake_group *grp, BIGNUM *s,
     	if (BN_cmp(theirpub2, BN_value_one()) <= 0)
     		fatal("%s: theirpub2 <= 1", __func__);
     
    -	if (schnorr_verify(grp->p, grp->q, grp->g, theirpub1,
    +	if (schnorr_verify_buf(grp->p, grp->q, grp->g, theirpub1,
     	    theirid, theirid_len, theirpub1_proof, theirpub1_proof_len) != 1)
     		fatal("%s: schnorr_verify theirpub1 failed", __func__);
    -	if (schnorr_verify(grp->p, grp->q, grp->g, theirpub2,
    +	if (schnorr_verify_buf(grp->p, grp->q, grp->g, theirpub2,
     	    theirid, theirid_len, theirpub2_proof, theirpub2_proof_len) != 1)
     		fatal("%s: schnorr_verify theirpub2 failed", __func__);
     
    @@ -459,7 +304,7 @@ jpake_step2(struct jpake_group *grp, BIGNUM *s,
     	JPAKE_DEBUG_BN((exponent, "%s: exponent = ", __func__));
     
     	/* Note the generator here is 'tmp', not g */
    -	if (schnorr_sign(grp->p, grp->q, tmp, exponent, *newpub,
    +	if (schnorr_sign_buf(grp->p, grp->q, tmp, exponent, *newpub,
     	    myid, myid_len,
     	    newpub_exponent_proof, newpub_exponent_proof_len) != 0)
     		fatal("%s: schnorr_sign newpub", __func__);
    @@ -496,7 +341,7 @@ jpake_confirm_hash(const BIGNUM *k,
     
     /* Shared parts of key derivation and confirmation calculation */
     void
    -jpake_key_confirm(struct jpake_group *grp, BIGNUM *s, BIGNUM *step2_val,
    +jpake_key_confirm(struct modp_group *grp, BIGNUM *s, BIGNUM *step2_val,
         BIGNUM *mypriv2, BIGNUM *mypub1, BIGNUM *mypub2,
         BIGNUM *theirpub1, BIGNUM *theirpub2,
         const u_char *my_id, u_int my_id_len,
    @@ -531,7 +376,7 @@ jpake_key_confirm(struct jpake_group *grp, BIGNUM *s, BIGNUM *step2_val,
     
     	JPAKE_DEBUG_BN((tmp, "%s: tmp = ", __func__));
     
    -	if (schnorr_verify(grp->p, grp->q, tmp, step2_val, 
    +	if (schnorr_verify_buf(grp->p, grp->q, tmp, step2_val, 
     	    their_id, their_id_len,
     	    theirpriv2_s_proof, theirpriv2_s_proof_len) != 1)
     		fatal("%s: schnorr_verify theirpriv2_s_proof failed", __func__);
    diff --git a/crypto/openssh/jpake.h b/crypto/openssh/jpake.h
    index a3d800cd3c41..a3f2cf0256c6 100644
    --- a/crypto/openssh/jpake.h
    +++ b/crypto/openssh/jpake.h
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: jpake.h,v 1.1 2008/11/04 08:22:13 djm Exp $ */
    +/* $OpenBSD: jpake.h,v 1.2 2009/03/05 07:18:19 djm Exp $ */
     /*
      * Copyright (c) 2008 Damien Miller.  All rights reserved.
      *
    @@ -28,20 +28,16 @@
     # define JPAKE_DEBUG_BUF(a)
     # define JPAKE_DEBUG_CTX(a)
     #else
    -# define JPAKE_DEBUG_BN(a)	jpake_debug3_bn a
    -# define JPAKE_DEBUG_BUF(a)	jpake_debug3_buf a
    +# define JPAKE_DEBUG_BN(a)	debug3_bn a
    +# define JPAKE_DEBUG_BUF(a)	debug3_buf a
     # define JPAKE_DEBUG_CTX(a)	jpake_dump a
    -#endif /* SCHNORR_DEBUG */
    -
    -struct jpake_group {
    -	BIGNUM *p, *q, *g;
    -};
    +#endif /* JPAKE_DEBUG */
     
     #define KZP_ID_LEN	16	/* Length of client and server IDs */
     
     struct jpake_ctx {
     	/* Parameters */
    -	struct jpake_group *grp;
    +	struct modp_group *grp;
     
     	/* Private values shared by client and server */
     	BIGNUM *s;			/* Secret (salted, crypted password) */
    @@ -83,26 +79,18 @@ struct jpake_ctx {
     };
     
     /* jpake.c */
    -struct jpake_group *jpake_default_group(void);
    -BIGNUM *bn_rand_range_gt_one(const BIGNUM *high);
    -int hash_buffer(const u_char *, u_int, const EVP_MD *, u_char **, u_int *);
    -void jpake_debug3_bn(const BIGNUM *, const char *, ...)
    -    __attribute__((__nonnull__ (2)))
    -    __attribute__((format(printf, 2, 3)));
    -void jpake_debug3_buf(const u_char *, u_int, const char *, ...)
    -    __attribute__((__nonnull__ (3)))
    -    __attribute__((format(printf, 3, 4)));
    +struct modp_group *jpake_default_group(void);
     void jpake_dump(struct jpake_ctx *, const char *, ...)
         __attribute__((__nonnull__ (2)))
         __attribute__((format(printf, 2, 3)));
     struct jpake_ctx *jpake_new(void);
     void jpake_free(struct jpake_ctx *);
     
    -void jpake_step1(struct jpake_group *, u_char **, u_int *,
    +void jpake_step1(struct modp_group *, u_char **, u_int *,
         BIGNUM **, BIGNUM **, BIGNUM **, BIGNUM **,
         u_char **, u_int *, u_char **, u_int *);
     
    -void jpake_step2(struct jpake_group *, BIGNUM *,
    +void jpake_step2(struct modp_group *, BIGNUM *,
         BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
         const u_char *, u_int, const u_char *, u_int,
         const u_char *, u_int, const u_char *, u_int,
    @@ -113,7 +101,7 @@ void jpake_confirm_hash(const BIGNUM *,
         const u_char *, u_int,
         u_char **, u_int *);
     
    -void jpake_key_confirm(struct jpake_group *, BIGNUM *, BIGNUM *,
    +void jpake_key_confirm(struct modp_group *, BIGNUM *, BIGNUM *,
         BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
         const u_char *, u_int, const u_char *, u_int,
         const u_char *, u_int, const u_char *, u_int,
    @@ -122,13 +110,5 @@ void jpake_key_confirm(struct jpake_group *, BIGNUM *, BIGNUM *,
     int jpake_check_confirm(const BIGNUM *, const u_char *, u_int,
         const u_char *, u_int, const u_char *, u_int);
     
    -/* schnorr.c */
    -int schnorr_sign(const BIGNUM *, const BIGNUM *, const BIGNUM *,
    -    const BIGNUM *, const BIGNUM *, const u_char *, u_int ,
    -    u_char **, u_int *);
    -int schnorr_verify(const BIGNUM *, const BIGNUM *, const BIGNUM *, 
    -    const BIGNUM *, const u_char *, u_int,
    -    const u_char *, u_int);
    -
     #endif /* JPAKE_H */
     
    diff --git a/crypto/openssh/kex.c b/crypto/openssh/kex.c
    index 48b54f5f7341..f4f44f095d6c 100644
    --- a/crypto/openssh/kex.c
    +++ b/crypto/openssh/kex.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: kex.c,v 1.80 2008/09/06 12:24:13 djm Exp $ */
    +/* $OpenBSD: kex.c,v 1.81 2009/05/27 06:34:36 andreas Exp $ */
     /*
      * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
      *
    @@ -49,8 +49,6 @@
     #include "dispatch.h"
     #include "monitor.h"
     
    -#define KEX_COOKIE_LEN	16
    -
     #if OPENSSL_VERSION_NUMBER >= 0x00907000L
     # if defined(HAVE_EVP_SHA256)
     # define evp_ssh_sha256 EVP_sha256
    diff --git a/crypto/openssh/kex.h b/crypto/openssh/kex.h
    index 8e29c90e9025..68c80c5a90d2 100644
    --- a/crypto/openssh/kex.h
    +++ b/crypto/openssh/kex.h
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: kex.h,v 1.46 2007/06/07 19:37:34 pvalchev Exp $ */
    +/* $OpenBSD: kex.h,v 1.47 2009/05/27 06:34:36 andreas Exp $ */
     
     /*
      * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
    @@ -30,6 +30,8 @@
     #include 
     #include 
     
    +#define KEX_COOKIE_LEN	16
    +
     #define	KEX_DH1			"diffie-hellman-group1-sha1"
     #define	KEX_DH14		"diffie-hellman-group14-sha1"
     #define	KEX_DHGEX_SHA1		"diffie-hellman-group-exchange-sha1"
    diff --git a/crypto/openssh/kexdhs.c b/crypto/openssh/kexdhs.c
    index 861708818451..a6719f6722f6 100644
    --- a/crypto/openssh/kexdhs.c
    +++ b/crypto/openssh/kexdhs.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: kexdhs.c,v 1.9 2006/11/06 21:25:28 markus Exp $ */
    +/* $OpenBSD: kexdhs.c,v 1.10 2009/06/21 07:37:15 dtucker Exp $ */
     /*
      * Copyright (c) 2001 Markus Friedl.  All rights reserved.
      *
    @@ -137,7 +137,9 @@ kexdh_server(Kex *kex)
     	}
     
     	/* sign H */
    -	PRIVSEP(key_sign(server_host_key, &signature, &slen, hash, hashlen));
    +	if (PRIVSEP(key_sign(server_host_key, &signature, &slen, hash,
    +	    hashlen)) < 0)
    +		fatal("kexdh_server: key_sign failed");
     
     	/* destroy_sensitive_data(); */
     
    diff --git a/crypto/openssh/kexgexs.c b/crypto/openssh/kexgexs.c
    index 76a0f8ca7164..8515568b36ed 100644
    --- a/crypto/openssh/kexgexs.c
    +++ b/crypto/openssh/kexgexs.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: kexgexs.c,v 1.11 2009/01/01 21:17:36 djm Exp $ */
    +/* $OpenBSD: kexgexs.c,v 1.12 2009/06/21 07:37:15 dtucker Exp $ */
     /*
      * Copyright (c) 2000 Niels Provos.  All rights reserved.
      * Copyright (c) 2001 Markus Friedl.  All rights reserved.
    @@ -179,7 +179,9 @@ kexgex_server(Kex *kex)
     	}
     
     	/* sign H */
    -	PRIVSEP(key_sign(server_host_key, &signature, &slen, hash, hashlen));
    +	if (PRIVSEP(key_sign(server_host_key, &signature, &slen, hash,
    +	    hashlen)) < 0)
    +		fatal("kexgex_server: key_sign failed");
     
     	/* destroy_sensitive_data(); */
     
    diff --git a/crypto/openssh/loginrec.c b/crypto/openssh/loginrec.c
    index f4af06736018..0ce5bb418ea4 100644
    --- a/crypto/openssh/loginrec.c
    +++ b/crypto/openssh/loginrec.c
    @@ -146,6 +146,7 @@
      */
     
     #include "includes.h"
    +__RCSID("$FreeBSD$");
     
     #include 
     #include 
    @@ -207,6 +208,7 @@ int syslogin_write_entry(struct logininfo *li);
     
     int getlast_entry(struct logininfo *li);
     int lastlog_get_entry(struct logininfo *li);
    +int utmpx_get_entry(struct logininfo *li);
     int wtmp_get_entry(struct logininfo *li);
     int wtmpx_get_entry(struct logininfo *li);
     
    @@ -509,6 +511,10 @@ getlast_entry(struct logininfo *li)
     	return(lastlog_get_entry(li));
     #else /* !USE_LASTLOG */
     
    +#if 1
    +	return (utmpx_get_entry(li));
    +#endif
    +
     #if defined(DISABLE_LASTLOG)
     	/* On some systems we shouldn't even try to obtain last login
     	 * time, e.g. AIX */
    @@ -758,8 +764,8 @@ construct_utmpx(struct logininfo *li, struct utmpx *utx)
     	utx->ut_pid = li->pid;
     
     	/* strncpy(): Don't necessarily want null termination */
    -	strncpy(utx->ut_name, li->username,
    -	    MIN_SIZEOF(utx->ut_name, li->username));
    +	strncpy(utx->ut_user, li->username,
    +	    MIN_SIZEOF(utx->ut_user, li->username));
     
     	if (li->type == LTYPE_LOGOUT)
     		return;
    @@ -1608,6 +1614,31 @@ lastlog_get_entry(struct logininfo *li)
     #endif /* HAVE_GETLASTLOGXBYNAME */
     #endif /* USE_LASTLOG */
     
    +#if 1
    +int
    +utmpx_get_entry(struct logininfo *li)
    +{
    +	struct utmpx *utx;
    +
    +	if (setutxdb(UTXDB_LASTLOGIN, NULL) != 0)
    +		return (0);
    +	utx = getutxuser(li->username);
    +	if (utx == NULL) {
    +		endutxent();
    +		return (0);
    +	}
    +
    +	line_fullname(li->line, utx->ut_line,
    +	    MIN_SIZEOF(li->line, utx->ut_line));
    +	strlcpy(li->hostname, utx->ut_host,
    +	    MIN_SIZEOF(li->hostname, utx->ut_host));
    +	li->tv_sec = utx->ut_tv.tv_sec;
    +	li->tv_usec = utx->ut_tv.tv_usec;
    +	endutxent();
    +	return (1);
    +}
    +#endif
    +
     #ifdef USE_BTMP
       /*
        * Logs failed login attempts in _PATH_BTMP if that exists.
    diff --git a/crypto/openssh/monitor.c b/crypto/openssh/monitor.c
    index f57e74ba5ced..ace25c4047b0 100644
    --- a/crypto/openssh/monitor.c
    +++ b/crypto/openssh/monitor.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: monitor.c,v 1.101 2009/02/12 03:26:22 djm Exp $ */
    +/* $OpenBSD: monitor.c,v 1.104 2009/06/12 20:43:22 andreas Exp $ */
     /*
      * Copyright 2002 Niels Provos 
      * Copyright 2002 Markus Friedl 
    @@ -88,6 +88,7 @@
     #include "compat.h"
     #include "ssh2.h"
     #include "jpake.h"
    +#include "roaming.h"
     
     #ifdef GSSAPI
     static Gssctxt *gsscontext = NULL;
    @@ -100,7 +101,6 @@ extern Newkeys *current_keys[];
     extern z_stream incoming_stream;
     extern z_stream outgoing_stream;
     extern u_char session_id[];
    -extern Buffer input, output;
     extern Buffer auth_debug;
     extern int auth_debug_init;
     extern Buffer loginmsg;
    @@ -126,6 +126,8 @@ struct {
     	u_int ilen;
     	u_char *output;
     	u_int olen;
    +	u_int64_t sent_bytes;
    +	u_int64_t recv_bytes;
     } child_state;
     
     /* Functions on the monitor that answer unprivileged requests */
    @@ -1670,15 +1672,20 @@ monitor_apply_keystate(struct monitor *pmonitor)
     
     	/* Network I/O buffers */
     	/* XXX inefficient for large buffers, need: buffer_init_from_string */
    -	buffer_clear(&input);
    -	buffer_append(&input, child_state.input, child_state.ilen);
    +	buffer_clear(packet_get_input());
    +	buffer_append(packet_get_input(), child_state.input, child_state.ilen);
     	memset(child_state.input, 0, child_state.ilen);
     	xfree(child_state.input);
     
    -	buffer_clear(&output);
    -	buffer_append(&output, child_state.output, child_state.olen);
    +	buffer_clear(packet_get_output());
    +	buffer_append(packet_get_output(), child_state.output,
    +		      child_state.olen);
     	memset(child_state.output, 0, child_state.olen);
     	xfree(child_state.output);
    +
    +	/* Roaming */
    +	if (compat20)
    +		roam_set_bytes(child_state.sent_bytes, child_state.recv_bytes);
     }
     
     static Kex *
    @@ -1794,6 +1801,12 @@ mm_get_keystate(struct monitor *pmonitor)
     	child_state.input = buffer_get_string(&m, &child_state.ilen);
     	child_state.output = buffer_get_string(&m, &child_state.olen);
     
    +	/* Roaming */
    +	if (compat20) {
    +		child_state.sent_bytes = buffer_get_int64(&m);
    +		child_state.recv_bytes = buffer_get_int64(&m);
    +	}
    +
     	buffer_free(&m);
     }
     
    diff --git a/crypto/openssh/monitor_mm.c b/crypto/openssh/monitor_mm.c
    index dab747532a0d..faf9f3dcb4f6 100644
    --- a/crypto/openssh/monitor_mm.c
    +++ b/crypto/openssh/monitor_mm.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: monitor_mm.c,v 1.15 2006/08/03 03:34:42 deraadt Exp $ */
    +/* $OpenBSD: monitor_mm.c,v 1.16 2009/06/22 05:39:28 dtucker Exp $ */
     /*
      * Copyright 2002 Niels Provos 
      * All rights reserved.
    diff --git a/crypto/openssh/monitor_wrap.c b/crypto/openssh/monitor_wrap.c
    index 0986fc51827c..b8e8710f71f1 100644
    --- a/crypto/openssh/monitor_wrap.c
    +++ b/crypto/openssh/monitor_wrap.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: monitor_wrap.c,v 1.64 2008/11/04 08:22:13 djm Exp $ */
    +/* $OpenBSD: monitor_wrap.c,v 1.68 2009/06/22 05:39:28 dtucker Exp $ */
     /*
      * Copyright 2002 Niels Provos 
      * Copyright 2002 Markus Friedl 
    @@ -71,19 +71,19 @@
     #include "atomicio.h"
     #include "monitor_fdpass.h"
     #include "misc.h"
    +#include "schnorr.h"
     #include "jpake.h"
     
     #include "channels.h"
     #include "session.h"
     #include "servconf.h"
    +#include "roaming.h"
     
     /* Imports */
     extern int compat20;
    -extern Newkeys *newkeys[];
     extern z_stream incoming_stream;
     extern z_stream outgoing_stream;
     extern struct monitor *pmonitor;
    -extern Buffer input, output;
     extern Buffer loginmsg;
     extern ServerOptions options;
     
    @@ -508,7 +508,7 @@ mm_newkeys_to_blob(int mode, u_char **blobp, u_int *lenp)
     	Enc *enc;
     	Mac *mac;
     	Comp *comp;
    -	Newkeys *newkey = newkeys[mode];
    +	Newkeys *newkey = (Newkeys *)packet_get_newkeys(mode);
     
     	debug3("%s: converting %p", __func__, newkey);
     
    @@ -570,7 +570,7 @@ mm_send_kex(Buffer *m, Kex *kex)
     void
     mm_send_keystate(struct monitor *monitor)
     {
    -	Buffer m;
    +	Buffer m, *input, *output;
     	u_char *blob, *p;
     	u_int bloblen, plen;
     	u_int32_t seqnr, packets;
    @@ -608,7 +608,8 @@ mm_send_keystate(struct monitor *monitor)
     	}
     
     	debug3("%s: Sending new keys: %p %p",
    -	    __func__, newkeys[MODE_OUT], newkeys[MODE_IN]);
    +	    __func__, packet_get_newkeys(MODE_OUT),
    +	    packet_get_newkeys(MODE_IN));
     
     	/* Keys from Kex */
     	if (!mm_newkeys_to_blob(MODE_OUT, &blob, &bloblen))
    @@ -655,8 +656,16 @@ mm_send_keystate(struct monitor *monitor)
     	buffer_put_string(&m, &incoming_stream, sizeof(incoming_stream));
     
     	/* Network I/O buffers */
    -	buffer_put_string(&m, buffer_ptr(&input), buffer_len(&input));
    -	buffer_put_string(&m, buffer_ptr(&output), buffer_len(&output));
    +	input = (Buffer *)packet_get_input();
    +	output = (Buffer *)packet_get_output();
    +	buffer_put_string(&m, buffer_ptr(input), buffer_len(input));
    +	buffer_put_string(&m, buffer_ptr(output), buffer_len(output));
    +
    +	/* Roaming */
    +	if (compat20) {
    +		buffer_put_int64(&m, get_sent_bytes());
    +		buffer_put_int64(&m, get_recv_bytes());
    +	}
     
     	mm_request_send(monitor->m_recvfd, MONITOR_REQ_KEYEXPORT, &m);
     	debug3("%s: Finished sending state", __func__);
    @@ -1282,7 +1291,7 @@ mm_auth2_jpake_get_pwdata(Authctxt *authctxt, BIGNUM **s,
     }
     
     void
    -mm_jpake_step1(struct jpake_group *grp,
    +mm_jpake_step1(struct modp_group *grp,
         u_char **id, u_int *id_len,
         BIGNUM **priv1, BIGNUM **priv2, BIGNUM **g_priv1, BIGNUM **g_priv2,
         u_char **priv1_proof, u_int *priv1_proof_len,
    @@ -1317,7 +1326,7 @@ mm_jpake_step1(struct jpake_group *grp,
     }
     
     void
    -mm_jpake_step2(struct jpake_group *grp, BIGNUM *s,
    +mm_jpake_step2(struct modp_group *grp, BIGNUM *s,
         BIGNUM *mypub1, BIGNUM *theirpub1, BIGNUM *theirpub2, BIGNUM *mypriv2,
         const u_char *theirid, u_int theirid_len,
         const u_char *myid, u_int myid_len,
    @@ -1357,7 +1366,7 @@ mm_jpake_step2(struct jpake_group *grp, BIGNUM *s,
     }
     
     void
    -mm_jpake_key_confirm(struct jpake_group *grp, BIGNUM *s, BIGNUM *step2_val,
    +mm_jpake_key_confirm(struct modp_group *grp, BIGNUM *s, BIGNUM *step2_val,
         BIGNUM *mypriv2, BIGNUM *mypub1, BIGNUM *mypub2,
         BIGNUM *theirpub1, BIGNUM *theirpub2,
         const u_char *my_id, u_int my_id_len,
    diff --git a/crypto/openssh/monitor_wrap.h b/crypto/openssh/monitor_wrap.h
    index 55c4b99f354b..de2d16f66276 100644
    --- a/crypto/openssh/monitor_wrap.h
    +++ b/crypto/openssh/monitor_wrap.h
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: monitor_wrap.h,v 1.21 2008/11/04 08:22:13 djm Exp $ */
    +/* $OpenBSD: monitor_wrap.h,v 1.22 2009/03/05 07:18:19 djm Exp $ */
     
     /*
      * Copyright 2002 Niels Provos 
    @@ -102,17 +102,17 @@ int mm_skey_query(void *, char **, char **, u_int *, char ***, u_int **);
     int mm_skey_respond(void *, u_int, char **);
     
     /* jpake */
    -struct jpake_group;
    +struct modp_group;
     void mm_auth2_jpake_get_pwdata(struct Authctxt *, BIGNUM **, char **, char **);
    -void mm_jpake_step1(struct jpake_group *, u_char **, u_int *,
    +void mm_jpake_step1(struct modp_group *, u_char **, u_int *,
         BIGNUM **, BIGNUM **, BIGNUM **, BIGNUM **,
         u_char **, u_int *, u_char **, u_int *);
    -void mm_jpake_step2(struct jpake_group *, BIGNUM *,
    +void mm_jpake_step2(struct modp_group *, BIGNUM *,
         BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
         const u_char *, u_int, const u_char *, u_int,
         const u_char *, u_int, const u_char *, u_int,
         BIGNUM **, u_char **, u_int *);
    -void mm_jpake_key_confirm(struct jpake_group *, BIGNUM *, BIGNUM *,
    +void mm_jpake_key_confirm(struct modp_group *, BIGNUM *, BIGNUM *,
         BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *, BIGNUM *,
         const u_char *, u_int, const u_char *, u_int,
         const u_char *, u_int, const u_char *, u_int,
    diff --git a/crypto/openssh/openbsd-compat/bsd-cygwin_util.c b/crypto/openssh/openbsd-compat/bsd-cygwin_util.c
    index 38be7e350ae2..e90c1597f59b 100644
    --- a/crypto/openssh/openbsd-compat/bsd-cygwin_util.c
    +++ b/crypto/openssh/openbsd-compat/bsd-cygwin_util.c
    @@ -39,9 +39,6 @@
     #endif
     
     #include 
    -#include 
    -#include 
    -#include 
     
     #include 
     #include 
    @@ -49,11 +46,6 @@
     #include 
     
     #include "xmalloc.h"
    -#define is_winnt       (GetVersion() < 0x80000000)
    -
    -#define ntsec_on(c)	((c) && strstr((c),"ntsec") && !strstr((c),"nontsec"))
    -#define ntsec_off(c)	((c) && strstr((c),"nontsec"))
    -#define ntea_on(c)	((c) && strstr((c),"ntea") && !strstr((c),"nontea"))
     
     int 
     binary_open(const char *filename, int flags, ...)
    @@ -79,128 +71,12 @@ binary_pipe(int fd[2])
     	return (ret);
     }
     
    -#define HAS_CREATE_TOKEN 1
    -#define HAS_NTSEC_BY_DEFAULT 2
    -#define HAS_CREATE_TOKEN_WO_NTSEC 3
    -
    -static int 
    -has_capability(int what)
    -{
    -	static int inited;
    -	static int has_create_token;
    -	static int has_ntsec_by_default;
    -	static int has_create_token_wo_ntsec;
    -
    -	/* 
    -	 * has_capability() basically calls uname() and checks if
    -	 * specific capabilities of Cygwin can be evaluated from that.
    -	 * This simplifies the calling functions which only have to ask
    -	 * for a capability using has_capability() instead of having
    -	 * to figure that out by themselves.
    -	 */
    -	if (!inited) {
    -		struct utsname uts;
    -		
    -		if (!uname(&uts)) {
    -			int major_high = 0, major_low = 0, minor = 0;
    -			int api_major_version = 0, api_minor_version = 0;
    -			char *c;
    -
    -			sscanf(uts.release, "%d.%d.%d", &major_high,
    -			    &major_low, &minor);
    -			if ((c = strchr(uts.release, '(')) != NULL) {
    -				sscanf(c + 1, "%d.%d", &api_major_version,
    -				    &api_minor_version);
    -			}
    -			if (major_high > 1 ||
    -			    (major_high == 1 && (major_low > 3 ||
    -			    (major_low == 3 && minor >= 2))))
    -				has_create_token = 1;
    -			if (api_major_version > 0 || api_minor_version >= 56)
    -				has_ntsec_by_default = 1;
    -			if (major_high > 1 ||
    -			    (major_high == 1 && major_low >= 5))
    -				has_create_token_wo_ntsec = 1;
    -			inited = 1;
    -		}
    -	}
    -	switch (what) {
    -	case HAS_CREATE_TOKEN:
    -		return (has_create_token);
    -	case HAS_NTSEC_BY_DEFAULT:
    -		return (has_ntsec_by_default);
    -	case HAS_CREATE_TOKEN_WO_NTSEC:
    -		return (has_create_token_wo_ntsec);
    -	}
    -	return (0);
    -}
    -
    -int
    -check_nt_auth(int pwd_authenticated, struct passwd *pw)
    -{
    -	/*
    -	* The only authentication which is able to change the user
    -	* context on NT systems is the password authentication. So
    -	* we deny all requsts for changing the user context if another
    -	* authentication method is used.
    -	*
    -	* This doesn't apply to Cygwin versions >= 1.3.2 anymore which
    -	* uses the undocumented NtCreateToken() call to create a user
    -	* token if the process has the appropriate privileges and if
    -	* CYGWIN ntsec setting is on.
    -	*/
    -	static int has_create_token = -1;
    -
    -	if (pw == NULL)
    -		return 0;
    -	if (is_winnt) {
    -		if (has_create_token < 0) {
    -			char *cygwin = getenv("CYGWIN");
    -
    -			has_create_token = 0;
    -			if (has_capability(HAS_CREATE_TOKEN) &&
    -			    (ntsec_on(cygwin) ||
    -			    (has_capability(HAS_NTSEC_BY_DEFAULT) &&
    -			     !ntsec_off(cygwin)) ||
    -			     has_capability(HAS_CREATE_TOKEN_WO_NTSEC)))
    -				has_create_token = 1;
    -		}
    -		if (has_create_token < 1 &&
    -		    !pwd_authenticated && geteuid() != pw->pw_uid)
    -			return (0);
    -	}
    -	return (1);
    -}
    -
     int
     check_ntsec(const char *filename)
     {
     	return (pathconf(filename, _PC_POSIX_PERMISSIONS));
     }
     
    -void
    -register_9x_service(void)
    -{
    -        HINSTANCE kerneldll;
    -        DWORD (*RegisterServiceProcess)(DWORD, DWORD);
    -
    -	/* The service register mechanism in 9x/Me is pretty different from
    -	 * NT/2K/XP.  In NT/2K/XP we're using a special service starter
    -	 * application to register and control sshd as service.  This method
    -	 * doesn't play nicely with 9x/Me.  For that reason we register here
    -	 * as service when running under 9x/Me.  This function is only called
    -	 * by the child sshd when it's going to daemonize.
    -	 */
    -	if (is_winnt)
    -		return;
    -	if (!(kerneldll = LoadLibrary("KERNEL32.DLL")))
    -		return;
    -	if (!(RegisterServiceProcess = (DWORD (*)(DWORD, DWORD))
    -		GetProcAddress(kerneldll, "RegisterServiceProcess")))
    -		return;
    -	RegisterServiceProcess(0, 1);
    -}
    -
     #define NL(x) x, (sizeof (x) - 1)
     #define WENV_SIZ (sizeof (wenv_arr) / sizeof (wenv_arr[0]))
     
    diff --git a/crypto/openssh/openbsd-compat/bsd-cygwin_util.h b/crypto/openssh/openbsd-compat/bsd-cygwin_util.h
    index 6719b8a49c2e..39b8eb788df0 100644
    --- a/crypto/openssh/openbsd-compat/bsd-cygwin_util.h
    +++ b/crypto/openssh/openbsd-compat/bsd-cygwin_util.h
    @@ -1,4 +1,4 @@
    -/* $Id: bsd-cygwin_util.h,v 1.11 2004/08/30 10:42:08 dtucker Exp $ */
    +/* $Id: bsd-cygwin_util.h,v 1.12 2009/03/08 00:40:28 dtucker Exp $ */
     
     /*
      * Copyright (c) 2000, 2001, Corinna Vinschen 
    @@ -35,7 +35,6 @@
     #ifdef HAVE_CYGWIN
     
     #undef ERROR
    -#define is_winnt       (GetVersion() < 0x80000000)
     
     #include 
     #include 
    @@ -43,9 +42,7 @@
     
     int binary_open(const char *, int , ...);
     int binary_pipe(int fd[2]);
    -int check_nt_auth(int, struct passwd *);
     int check_ntsec(const char *);
    -void register_9x_service(void);
     char **fetch_windows_environment(void);
     void free_windows_environment(char **);
     
    diff --git a/crypto/openssh/openbsd-compat/daemon.c b/crypto/openssh/openbsd-compat/daemon.c
    index e3a6886bd1c9..3efe14c68c41 100644
    --- a/crypto/openssh/openbsd-compat/daemon.c
    +++ b/crypto/openssh/openbsd-compat/daemon.c
    @@ -57,18 +57,8 @@ daemon(int nochdir, int noclose)
     	case -1:
     		return (-1);
     	case 0:
    -#ifdef HAVE_CYGWIN
    -		register_9x_service();
    -#endif
     		break;
     	default:
    -#ifdef HAVE_CYGWIN
    -		/*
    -		 * This sleep avoids a race condition which kills the
    -		 * child process if parent is started by a NT/W2K service.
    -		 */
    -		sleep(1);
    -#endif
     		_exit(0);
     	}
     
    diff --git a/crypto/openssh/openbsd-compat/getrrsetbyname.c b/crypto/openssh/openbsd-compat/getrrsetbyname.c
    index 785b2256911c..98876673d002 100644
    --- a/crypto/openssh/openbsd-compat/getrrsetbyname.c
    +++ b/crypto/openssh/openbsd-compat/getrrsetbyname.c
    @@ -143,7 +143,7 @@ u_int32_t _getlong(register const u_char *);
     
     /* ************** */
     
    -#define ANSWER_BUFFER_SIZE 1024*64
    +#define ANSWER_BUFFER_SIZE 0xffff
     
     struct dns_query {
     	char			*name;
    diff --git a/crypto/openssh/openbsd-compat/openssl-compat.c b/crypto/openssh/openbsd-compat/openssl-compat.c
    index 49238ba804be..dd326c00fa60 100644
    --- a/crypto/openssh/openbsd-compat/openssl-compat.c
    +++ b/crypto/openssh/openbsd-compat/openssl-compat.c
    @@ -1,4 +1,4 @@
    -/* $Id: openssl-compat.c,v 1.6 2008/02/28 08:13:52 dtucker Exp $ */
    +/* $Id: openssl-compat.c,v 1.8 2009/03/07 11:22:35 dtucker Exp $ */
     
     /*
      * Copyright (c) 2005 Darren Tucker 
    @@ -49,6 +49,15 @@ ssh_EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *evp)
     }
     #endif
     
    +#ifdef OPENSSL_EVP_DIGESTUPDATE_VOID
    +int
    +ssh_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt)
    +{
    +	EVP_DigestUpdate(ctx, d, cnt);
    +	return 1;
    +}
    +#endif
    +
     #ifdef	USE_OPENSSL_ENGINE
     void
     ssh_SSLeay_add_all_algorithms(void)
    diff --git a/crypto/openssh/openbsd-compat/openssl-compat.h b/crypto/openssh/openbsd-compat/openssl-compat.h
    index 6a1bed5b2b43..fcc762867d5d 100644
    --- a/crypto/openssh/openbsd-compat/openssl-compat.h
    +++ b/crypto/openssh/openbsd-compat/openssl-compat.h
    @@ -1,4 +1,4 @@
    -/* $Id: openssl-compat.h,v 1.12 2008/02/28 08:22:04 dtucker Exp $ */
    +/* $Id: openssl-compat.h,v 1.14 2009/03/07 11:22:35 dtucker Exp $ */
     
     /*
      * Copyright (c) 2005 Darren Tucker 
    @@ -80,6 +80,10 @@ extern const EVP_CIPHER *evp_acss(void);
     #  define EVP_CIPHER_CTX_cleanup(a)	ssh_EVP_CIPHER_CTX_cleanup((a))
     # endif /* SSH_OLD_EVP */
     
    +# ifdef OPENSSL_EVP_DIGESTUPDATE_VOID
    +#  define EVP_DigestUpdate(a,b,c)	ssh_EVP_DigestUpdate((a),(b),(c))
    +#  endif
    +
     # ifdef USE_OPENSSL_ENGINE
     #  ifdef SSLeay_add_all_algorithms
     #   undef SSLeay_add_all_algorithms
    diff --git a/crypto/openssh/openbsd-compat/port-aix.c b/crypto/openssh/openbsd-compat/port-aix.c
    index 5b1cb73874dd..d9c0876f3ad3 100644
    --- a/crypto/openssh/openbsd-compat/port-aix.c
    +++ b/crypto/openssh/openbsd-compat/port-aix.c
    @@ -57,6 +57,8 @@
     
     #include "port-aix.h"
     
    +static char *lastlogin_msg = NULL;
    +
     # ifdef HAVE_SETAUTHDB
     static char old_registry[REGISTRY_SIZE] = "";
     # endif
    @@ -276,23 +278,30 @@ sys_auth_record_login(const char *user, const char *host, const char *ttynm,
         Buffer *loginmsg)
     {
     	char *msg = NULL;
    -	static int msg_done = 0;
     	int success = 0;
     
     	aix_setauthdb(user);
     	if (loginsuccess((char *)user, (char *)host, (char *)ttynm, &msg) == 0) {
     		success = 1;
    -		if (msg != NULL && loginmsg != NULL && !msg_done) {
    +		if (msg != NULL) {
     			debug("AIX/loginsuccess: msg %s", msg);
    -			buffer_append(loginmsg, msg, strlen(msg));
    -			xfree(msg);
    -			msg_done = 1;
    +			if (lastlogin_msg == NULL)
    +				lastlogin_msg = msg;
     		}
     	}
     	aix_restoreauthdb();
     	return (success);
     }
     
    +char *
    +sys_auth_get_lastlogin_msg(const char *user, uid_t uid)
    +{
    +	char *msg = lastlogin_msg;
    +
    +	lastlogin_msg = NULL;
    +	return msg;
    +}
    +
     #  ifdef CUSTOM_FAILED_LOGIN
     /*
      * record_failed_login: generic "login failed" interface function
    diff --git a/crypto/openssh/openbsd-compat/port-aix.h b/crypto/openssh/openbsd-compat/port-aix.h
    index ecb9feae8bb8..3ac76ae1551e 100644
    --- a/crypto/openssh/openbsd-compat/port-aix.h
    +++ b/crypto/openssh/openbsd-compat/port-aix.h
    @@ -1,4 +1,4 @@
    -/* $Id: port-aix.h,v 1.29 2008/03/09 05:36:55 dtucker Exp $ */
    +/* $Id: port-aix.h,v 1.31 2009/08/20 06:20:50 dtucker Exp $ */
     
     /*
      *
    @@ -71,6 +71,11 @@ int passwdexpired(char *, char **);
     # include 
     #endif
     
    +/* for setpcred and friends */
    +#ifdef HAVE_USERSEC_H
    +# include 
    +#endif
    +
     /*
      * According to the setauthdb man page, AIX password registries must be 15
      * chars or less plus terminating NUL.
    @@ -87,6 +92,8 @@ void aix_usrinfo(struct passwd *);
     int sys_auth_allowed_user(struct passwd *, Buffer *);
     # define CUSTOM_SYS_AUTH_RECORD_LOGIN 1
     int sys_auth_record_login(const char *, const char *, const char *, Buffer *);
    +# define CUSTOM_SYS_AUTH_GET_LASTLOGIN_MSG
    +char *sys_auth_get_lastlogin_msg(const char *, uid_t);
     # define CUSTOM_FAILED_LOGIN 1
     #endif
     
    diff --git a/crypto/openssh/packet.c b/crypto/openssh/packet.c
    index 5afc84ce0bc2..994e35b6df50 100644
    --- a/crypto/openssh/packet.c
    +++ b/crypto/openssh/packet.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: packet.c,v 1.160 2009/02/13 11:50:21 markus Exp $ */
    +/* $OpenBSD: packet.c,v 1.166 2009/06/27 09:29:06 andreas Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -77,6 +77,7 @@
     #include "canohost.h"
     #include "misc.h"
     #include "ssh.h"
    +#include "roaming.h"
     
     #ifdef PACKET_DEBUG
     #define DBG(x) x
    @@ -86,92 +87,126 @@
     
     #define PACKET_MAX_SIZE (256 * 1024)
     
    -/*
    - * This variable contains the file descriptors used for communicating with
    - * the other side.  connection_in is used for reading; connection_out for
    - * writing.  These can be the same descriptor, in which case it is assumed to
    - * be a socket.
    - */
    -static int connection_in = -1;
    -static int connection_out = -1;
    -
    -/* Protocol flags for the remote side. */
    -static u_int remote_protocol_flags = 0;
    -
    -/* Encryption context for receiving data.  This is only used for decryption. */
    -static CipherContext receive_context;
    -
    -/* Encryption context for sending data.  This is only used for encryption. */
    -static CipherContext send_context;
    -
    -/* Buffer for raw input data from the socket. */
    -Buffer input;
    -
    -/* Buffer for raw output data going to the socket. */
    -Buffer output;
    -
    -/* Buffer for the partial outgoing packet being constructed. */
    -static Buffer outgoing_packet;
    -
    -/* Buffer for the incoming packet currently being processed. */
    -static Buffer incoming_packet;
    -
    -/* Scratch buffer for packet compression/decompression. */
    -static Buffer compression_buffer;
    -static int compression_buffer_ready = 0;
    -
    -/* Flag indicating whether packet compression/decompression is enabled. */
    -static int packet_compression = 0;
    -
    -/* default maximum packet size */
    -u_int max_packet_size = 32768;
    -
    -/* Flag indicating whether this module has been initialized. */
    -static int initialized = 0;
    -
    -/* Set to true if the connection is interactive. */
    -static int interactive_mode = 0;
    -
    -/* Set to true if we are the server side. */
    -static int server_side = 0;
    -
    -/* Set to true if we are authenticated. */
    -static int after_authentication = 0;
    -
    -int keep_alive_timeouts = 0;
    -
    -/* Set to the maximum time that we will wait to send or receive a packet */
    -static int packet_timeout_ms = -1;
    -
    -/* Session key information for Encryption and MAC */
    -Newkeys *newkeys[MODE_MAX];
    -static struct packet_state {
    +struct packet_state {
     	u_int32_t seqnr;
     	u_int32_t packets;
     	u_int64_t blocks;
     	u_int64_t bytes;
    -} p_read, p_send;
    -
    -static u_int64_t max_blocks_in, max_blocks_out;
    -static u_int32_t rekey_limit;
    -
    -/* Session key for protocol v1 */
    -static u_char ssh1_key[SSH_SESSION_KEY_LENGTH];
    -static u_int ssh1_keylen;
    -
    -/* roundup current message to extra_pad bytes */
    -static u_char extra_pad = 0;
    -
    -/* XXX discard incoming data after MAC error */
    -static u_int packet_discard = 0;
    -static Mac *packet_discard_mac = NULL;
    +};
     
     struct packet {
     	TAILQ_ENTRY(packet) next;
     	u_char type;
     	Buffer payload;
     };
    -TAILQ_HEAD(, packet) outgoing;
    +
    +struct session_state {
    +	/*
    +	 * This variable contains the file descriptors used for
    +	 * communicating with the other side.  connection_in is used for
    +	 * reading; connection_out for writing.  These can be the same
    +	 * descriptor, in which case it is assumed to be a socket.
    +	 */
    +	int connection_in;
    +	int connection_out;
    +
    +	/* Protocol flags for the remote side. */
    +	u_int remote_protocol_flags;
    +
    +	/* Encryption context for receiving data.  Only used for decryption. */
    +	CipherContext receive_context;
    +
    +	/* Encryption context for sending data.  Only used for encryption. */
    +	CipherContext send_context;
    +
    +	/* Buffer for raw input data from the socket. */
    +	Buffer input;
    +
    +	/* Buffer for raw output data going to the socket. */
    +	Buffer output;
    +
    +	/* Buffer for the partial outgoing packet being constructed. */
    +	Buffer outgoing_packet;
    +
    +	/* Buffer for the incoming packet currently being processed. */
    +	Buffer incoming_packet;
    +
    +	/* Scratch buffer for packet compression/decompression. */
    +	Buffer compression_buffer;
    +	int compression_buffer_ready;
    +
    +	/*
    +	 * Flag indicating whether packet compression/decompression is
    +	 * enabled.
    +	 */
    +	int packet_compression;
    +
    +	/* default maximum packet size */
    +	u_int max_packet_size;
    +
    +	/* Flag indicating whether this module has been initialized. */
    +	int initialized;
    +
    +	/* Set to true if the connection is interactive. */
    +	int interactive_mode;
    +
    +	/* Set to true if we are the server side. */
    +	int server_side;
    +
    +	/* Set to true if we are authenticated. */
    +	int after_authentication;
    +
    +	int keep_alive_timeouts;
    +
    +	/* The maximum time that we will wait to send or receive a packet */
    +	int packet_timeout_ms;
    +
    +	/* Session key information for Encryption and MAC */
    +	Newkeys *newkeys[MODE_MAX];
    +	struct packet_state p_read, p_send;
    +
    +	u_int64_t max_blocks_in, max_blocks_out;
    +	u_int32_t rekey_limit;
    +
    +	/* Session key for protocol v1 */
    +	u_char ssh1_key[SSH_SESSION_KEY_LENGTH];
    +	u_int ssh1_keylen;
    +
    +	/* roundup current message to extra_pad bytes */
    +	u_char extra_pad;
    +
    +	/* XXX discard incoming data after MAC error */
    +	u_int packet_discard;
    +	Mac *packet_discard_mac;
    +
    +	/* Used in packet_read_poll2() */
    +	u_int packlen;
    +
    +	/* Used in packet_send2 */
    +	int rekeying;
    +
    +	/* Used in packet_set_interactive */
    +	int set_interactive_called;
    +
    +	/* Used in packet_set_maxsize */
    +	int set_maxsize_called;
    +
    +	TAILQ_HEAD(, packet) outgoing;
    +};
    +
    +static struct session_state *active_state, *backup_state;
    +
    +static struct session_state *
    +alloc_session_state(void)
    +{
    +    struct session_state *s = xcalloc(1, sizeof(*s));
    +
    +    s->connection_in = -1;
    +    s->connection_out = -1;
    +    s->max_packet_size = 32768;
    +    s->packet_timeout_ms = -1;
    +    return s;
    +}
     
     /*
      * Sets the descriptors used for communication.  Disables encryption until
    @@ -184,21 +219,23 @@ packet_set_connection(int fd_in, int fd_out)
     
     	if (none == NULL)
     		fatal("packet_set_connection: cannot load cipher 'none'");
    -	connection_in = fd_in;
    -	connection_out = fd_out;
    -	cipher_init(&send_context, none, (const u_char *)"",
    +	if (active_state == NULL)
    +		active_state = alloc_session_state();
    +	active_state->connection_in = fd_in;
    +	active_state->connection_out = fd_out;
    +	cipher_init(&active_state->send_context, none, (const u_char *)"",
     	    0, NULL, 0, CIPHER_ENCRYPT);
    -	cipher_init(&receive_context, none, (const u_char *)"",
    +	cipher_init(&active_state->receive_context, none, (const u_char *)"",
     	    0, NULL, 0, CIPHER_DECRYPT);
    -	newkeys[MODE_IN] = newkeys[MODE_OUT] = NULL;
    -	if (!initialized) {
    -		initialized = 1;
    -		buffer_init(&input);
    -		buffer_init(&output);
    -		buffer_init(&outgoing_packet);
    -		buffer_init(&incoming_packet);
    -		TAILQ_INIT(&outgoing);
    -		p_send.packets = p_read.packets = 0;
    +	active_state->newkeys[MODE_IN] = active_state->newkeys[MODE_OUT] = NULL;
    +	if (!active_state->initialized) {
    +		active_state->initialized = 1;
    +		buffer_init(&active_state->input);
    +		buffer_init(&active_state->output);
    +		buffer_init(&active_state->outgoing_packet);
    +		buffer_init(&active_state->incoming_packet);
    +		TAILQ_INIT(&active_state->outgoing);
    +		active_state->p_send.packets = active_state->p_read.packets = 0;
     	}
     }
     
    @@ -206,27 +243,29 @@ void
     packet_set_timeout(int timeout, int count)
     {
     	if (timeout == 0 || count == 0) {
    -		packet_timeout_ms = -1;
    +		active_state->packet_timeout_ms = -1;
     		return;
     	}
     	if ((INT_MAX / 1000) / count < timeout)
    -		packet_timeout_ms = INT_MAX;
    +		active_state->packet_timeout_ms = INT_MAX;
     	else
    -		packet_timeout_ms = timeout * count * 1000;
    +		active_state->packet_timeout_ms = timeout * count * 1000;
     }
     
     static void
     packet_stop_discard(void)
     {
    -	if (packet_discard_mac) {
    +	if (active_state->packet_discard_mac) {
     		char buf[1024];
     		
     		memset(buf, 'a', sizeof(buf));
    -		while (buffer_len(&incoming_packet) < PACKET_MAX_SIZE)
    -			buffer_append(&incoming_packet, buf, sizeof(buf));
    -		(void) mac_compute(packet_discard_mac,
    -		    p_read.seqnr,
    -		    buffer_ptr(&incoming_packet),
    +		while (buffer_len(&active_state->incoming_packet) <
    +		    PACKET_MAX_SIZE)
    +			buffer_append(&active_state->incoming_packet, buf,
    +			    sizeof(buf));
    +		(void) mac_compute(active_state->packet_discard_mac,
    +		    active_state->p_read.seqnr,
    +		    buffer_ptr(&active_state->incoming_packet),
     		    PACKET_MAX_SIZE);
     	}
     	logit("Finished discarding for %.200s", get_remote_ipaddr());
    @@ -239,10 +278,11 @@ packet_start_discard(Enc *enc, Mac *mac, u_int packet_length, u_int discard)
     	if (enc == NULL || !cipher_is_cbc(enc->cipher))
     		packet_disconnect("Packet corrupt");
     	if (packet_length != PACKET_MAX_SIZE && mac && mac->enabled)
    -		packet_discard_mac = mac;
    -	if (buffer_len(&input) >= discard)
    +		active_state->packet_discard_mac = mac;
    +	if (buffer_len(&active_state->input) >= discard)
     		packet_stop_discard();
    -	packet_discard = discard - buffer_len(&input);
    +	active_state->packet_discard = discard -
    +	    buffer_len(&active_state->input);
     }
     
     /* Returns 1 if remote host is connected via socket, 0 if not. */
    @@ -254,15 +294,17 @@ packet_connection_is_on_socket(void)
     	socklen_t fromlen, tolen;
     
     	/* filedescriptors in and out are the same, so it's a socket */
    -	if (connection_in == connection_out)
    +	if (active_state->connection_in == active_state->connection_out)
     		return 1;
     	fromlen = sizeof(from);
     	memset(&from, 0, sizeof(from));
    -	if (getpeername(connection_in, (struct sockaddr *)&from, &fromlen) < 0)
    +	if (getpeername(active_state->connection_in, (struct sockaddr *)&from,
    +	    &fromlen) < 0)
     		return 0;
     	tolen = sizeof(to);
     	memset(&to, 0, sizeof(to));
    -	if (getpeername(connection_out, (struct sockaddr *)&to, &tolen) < 0)
    +	if (getpeername(active_state->connection_out, (struct sockaddr *)&to,
    +	    &tolen) < 0)
     		return 0;
     	if (fromlen != tolen || memcmp(&from, &to, fromlen) != 0)
     		return 0;
    @@ -283,9 +325,9 @@ packet_get_keyiv(int mode, u_char *iv, u_int len)
     	CipherContext *cc;
     
     	if (mode == MODE_OUT)
    -		cc = &send_context;
    +		cc = &active_state->send_context;
     	else
    -		cc = &receive_context;
    +		cc = &active_state->receive_context;
     
     	cipher_get_keyiv(cc, iv, len);
     }
    @@ -296,9 +338,9 @@ packet_get_keycontext(int mode, u_char *dat)
     	CipherContext *cc;
     
     	if (mode == MODE_OUT)
    -		cc = &send_context;
    +		cc = &active_state->send_context;
     	else
    -		cc = &receive_context;
    +		cc = &active_state->receive_context;
     
     	return (cipher_get_keycontext(cc, dat));
     }
    @@ -309,9 +351,9 @@ packet_set_keycontext(int mode, u_char *dat)
     	CipherContext *cc;
     
     	if (mode == MODE_OUT)
    -		cc = &send_context;
    +		cc = &active_state->send_context;
     	else
    -		cc = &receive_context;
    +		cc = &active_state->receive_context;
     
     	cipher_set_keycontext(cc, dat);
     }
    @@ -322,9 +364,9 @@ packet_get_keyiv_len(int mode)
     	CipherContext *cc;
     
     	if (mode == MODE_OUT)
    -		cc = &send_context;
    +		cc = &active_state->send_context;
     	else
    -		cc = &receive_context;
    +		cc = &active_state->receive_context;
     
     	return (cipher_get_keyiv_len(cc));
     }
    @@ -335,9 +377,9 @@ packet_set_iv(int mode, u_char *dat)
     	CipherContext *cc;
     
     	if (mode == MODE_OUT)
    -		cc = &send_context;
    +		cc = &active_state->send_context;
     	else
    -		cc = &receive_context;
    +		cc = &active_state->receive_context;
     
     	cipher_set_keyiv(cc, dat);
     }
    @@ -345,7 +387,7 @@ packet_set_iv(int mode, u_char *dat)
     int
     packet_get_ssh1_cipher(void)
     {
    -	return (cipher_get_number(receive_context.cipher));
    +	return (cipher_get_number(active_state->receive_context.cipher));
     }
     
     void
    @@ -354,7 +396,8 @@ packet_get_state(int mode, u_int32_t *seqnr, u_int64_t *blocks, u_int32_t *packe
     {
     	struct packet_state *state;
     
    -	state = (mode == MODE_IN) ? &p_read : &p_send;
    +	state = (mode == MODE_IN) ?
    +	    &active_state->p_read : &active_state->p_send;
     	if (seqnr)
     		*seqnr = state->seqnr;
     	if (blocks)
    @@ -371,7 +414,8 @@ packet_set_state(int mode, u_int32_t seqnr, u_int64_t blocks, u_int32_t packets,
     {
     	struct packet_state *state;
     
    -	state = (mode == MODE_IN) ? &p_read : &p_send;
    +	state = (mode == MODE_IN) ?
    +	    &active_state->p_read : &active_state->p_send;
     	state->seqnr = seqnr;
     	state->blocks = blocks;
     	state->packets = packets;
    @@ -387,7 +431,8 @@ packet_connection_is_ipv4(void)
     	socklen_t tolen = sizeof(to);
     
     	memset(&to, 0, sizeof(to));
    -	if (getsockname(connection_out, (struct sockaddr *)&to, &tolen) < 0)
    +	if (getsockname(active_state->connection_out, (struct sockaddr *)&to,
    +	    &tolen) < 0)
     		return 0;
     	if (to.ss_family == AF_INET)
     		return 1;
    @@ -405,10 +450,10 @@ void
     packet_set_nonblocking(void)
     {
     	/* Set the socket into non-blocking mode. */
    -	set_nonblock(connection_in);
    +	set_nonblock(active_state->connection_in);
     
    -	if (connection_out != connection_in)
    -		set_nonblock(connection_out);
    +	if (active_state->connection_out != active_state->connection_in)
    +		set_nonblock(active_state->connection_out);
     }
     
     /* Returns the socket used for reading. */
    @@ -416,7 +461,7 @@ packet_set_nonblocking(void)
     int
     packet_get_connection_in(void)
     {
    -	return connection_in;
    +	return active_state->connection_in;
     }
     
     /* Returns the descriptor used for writing. */
    @@ -424,7 +469,7 @@ packet_get_connection_in(void)
     int
     packet_get_connection_out(void)
     {
    -	return connection_out;
    +	return active_state->connection_out;
     }
     
     /* Closes the connection and clears and frees internal data structures. */
    @@ -432,26 +477,26 @@ packet_get_connection_out(void)
     void
     packet_close(void)
     {
    -	if (!initialized)
    +	if (!active_state->initialized)
     		return;
    -	initialized = 0;
    -	if (connection_in == connection_out) {
    -		shutdown(connection_out, SHUT_RDWR);
    -		close(connection_out);
    +	active_state->initialized = 0;
    +	if (active_state->connection_in == active_state->connection_out) {
    +		shutdown(active_state->connection_out, SHUT_RDWR);
    +		close(active_state->connection_out);
     	} else {
    -		close(connection_in);
    -		close(connection_out);
    +		close(active_state->connection_in);
    +		close(active_state->connection_out);
     	}
    -	buffer_free(&input);
    -	buffer_free(&output);
    -	buffer_free(&outgoing_packet);
    -	buffer_free(&incoming_packet);
    -	if (compression_buffer_ready) {
    -		buffer_free(&compression_buffer);
    +	buffer_free(&active_state->input);
    +	buffer_free(&active_state->output);
    +	buffer_free(&active_state->outgoing_packet);
    +	buffer_free(&active_state->incoming_packet);
    +	if (active_state->compression_buffer_ready) {
    +		buffer_free(&active_state->compression_buffer);
     		buffer_compress_uninit();
     	}
    -	cipher_cleanup(&send_context);
    -	cipher_cleanup(&receive_context);
    +	cipher_cleanup(&active_state->send_context);
    +	cipher_cleanup(&active_state->receive_context);
     }
     
     /* Sets remote side protocol flags. */
    @@ -459,7 +504,7 @@ packet_close(void)
     void
     packet_set_protocol_flags(u_int protocol_flags)
     {
    -	remote_protocol_flags = protocol_flags;
    +	active_state->remote_protocol_flags = protocol_flags;
     }
     
     /* Returns the remote protocol flags set earlier by the above function. */
    @@ -467,7 +512,7 @@ packet_set_protocol_flags(u_int protocol_flags)
     u_int
     packet_get_protocol_flags(void)
     {
    -	return remote_protocol_flags;
    +	return active_state->remote_protocol_flags;
     }
     
     /*
    @@ -478,18 +523,18 @@ packet_get_protocol_flags(void)
     static void
     packet_init_compression(void)
     {
    -	if (compression_buffer_ready == 1)
    +	if (active_state->compression_buffer_ready == 1)
     		return;
    -	compression_buffer_ready = 1;
    -	buffer_init(&compression_buffer);
    +	active_state->compression_buffer_ready = 1;
    +	buffer_init(&active_state->compression_buffer);
     }
     
     void
     packet_start_compression(int level)
     {
    -	if (packet_compression && !compat20)
    +	if (active_state->packet_compression && !compat20)
     		fatal("Compression already enabled.");
    -	packet_compression = 1;
    +	active_state->packet_compression = 1;
     	packet_init_compression();
     	buffer_compress_init_send(level);
     	buffer_compress_init_recv();
    @@ -513,19 +558,21 @@ packet_set_encryption_key(const u_char *key, u_int keylen,
     		fatal("packet_set_encryption_key: keylen too small: %d", keylen);
     	if (keylen > SSH_SESSION_KEY_LENGTH)
     		fatal("packet_set_encryption_key: keylen too big: %d", keylen);
    -	memcpy(ssh1_key, key, keylen);
    -	ssh1_keylen = keylen;
    -	cipher_init(&send_context, cipher, key, keylen, NULL, 0, CIPHER_ENCRYPT);
    -	cipher_init(&receive_context, cipher, key, keylen, NULL, 0, CIPHER_DECRYPT);
    +	memcpy(active_state->ssh1_key, key, keylen);
    +	active_state->ssh1_keylen = keylen;
    +	cipher_init(&active_state->send_context, cipher, key, keylen, NULL,
    +	    0, CIPHER_ENCRYPT);
    +	cipher_init(&active_state->receive_context, cipher, key, keylen, NULL,
    +	    0, CIPHER_DECRYPT);
     }
     
     u_int
     packet_get_encryption_key(u_char *key)
     {
     	if (key == NULL)
    -		return (ssh1_keylen);
    -	memcpy(key, ssh1_key, ssh1_keylen);
    -	return (ssh1_keylen);
    +		return (active_state->ssh1_keylen);
    +	memcpy(key, active_state->ssh1_key, active_state->ssh1_keylen);
    +	return (active_state->ssh1_keylen);
     }
     
     /* Start constructing a packet to send. */
    @@ -539,8 +586,8 @@ packet_start(u_char type)
     	len = compat20 ? 6 : 9;
     	memset(buf, 0, len - 1);
     	buf[len - 1] = type;
    -	buffer_clear(&outgoing_packet);
    -	buffer_append(&outgoing_packet, buf, len);
    +	buffer_clear(&active_state->outgoing_packet);
    +	buffer_append(&active_state->outgoing_packet, buf, len);
     }
     
     /* Append payload. */
    @@ -549,43 +596,49 @@ packet_put_char(int value)
     {
     	char ch = value;
     
    -	buffer_append(&outgoing_packet, &ch, 1);
    +	buffer_append(&active_state->outgoing_packet, &ch, 1);
     }
     
     void
     packet_put_int(u_int value)
     {
    -	buffer_put_int(&outgoing_packet, value);
    +	buffer_put_int(&active_state->outgoing_packet, value);
    +}
    +
    +void
    +packet_put_int64(u_int64_t value)
    +{
    +	buffer_put_int64(&active_state->outgoing_packet, value);
     }
     
     void
     packet_put_string(const void *buf, u_int len)
     {
    -	buffer_put_string(&outgoing_packet, buf, len);
    +	buffer_put_string(&active_state->outgoing_packet, buf, len);
     }
     
     void
     packet_put_cstring(const char *str)
     {
    -	buffer_put_cstring(&outgoing_packet, str);
    +	buffer_put_cstring(&active_state->outgoing_packet, str);
     }
     
     void
     packet_put_raw(const void *buf, u_int len)
     {
    -	buffer_append(&outgoing_packet, buf, len);
    +	buffer_append(&active_state->outgoing_packet, buf, len);
     }
     
     void
     packet_put_bignum(BIGNUM * value)
     {
    -	buffer_put_bignum(&outgoing_packet, value);
    +	buffer_put_bignum(&active_state->outgoing_packet, value);
     }
     
     void
     packet_put_bignum2(BIGNUM * value)
     {
    -	buffer_put_bignum2(&outgoing_packet, value);
    +	buffer_put_bignum2(&active_state->outgoing_packet, value);
     }
     
     /*
    @@ -605,24 +658,27 @@ packet_send1(void)
     	 * If using packet compression, compress the payload of the outgoing
     	 * packet.
     	 */
    -	if (packet_compression) {
    -		buffer_clear(&compression_buffer);
    +	if (active_state->packet_compression) {
    +		buffer_clear(&active_state->compression_buffer);
     		/* Skip padding. */
    -		buffer_consume(&outgoing_packet, 8);
    +		buffer_consume(&active_state->outgoing_packet, 8);
     		/* padding */
    -		buffer_append(&compression_buffer, "\0\0\0\0\0\0\0\0", 8);
    -		buffer_compress(&outgoing_packet, &compression_buffer);
    -		buffer_clear(&outgoing_packet);
    -		buffer_append(&outgoing_packet, buffer_ptr(&compression_buffer),
    -		    buffer_len(&compression_buffer));
    +		buffer_append(&active_state->compression_buffer,
    +		    "\0\0\0\0\0\0\0\0", 8);
    +		buffer_compress(&active_state->outgoing_packet,
    +		    &active_state->compression_buffer);
    +		buffer_clear(&active_state->outgoing_packet);
    +		buffer_append(&active_state->outgoing_packet,
    +		    buffer_ptr(&active_state->compression_buffer),
    +		    buffer_len(&active_state->compression_buffer));
     	}
     	/* Compute packet length without padding (add checksum, remove padding). */
    -	len = buffer_len(&outgoing_packet) + 4 - 8;
    +	len = buffer_len(&active_state->outgoing_packet) + 4 - 8;
     
     	/* Insert padding. Initialized to zero in packet_start1() */
     	padding = 8 - len % 8;
    -	if (!send_context.plaintext) {
    -		cp = buffer_ptr(&outgoing_packet);
    +	if (!active_state->send_context.plaintext) {
    +		cp = buffer_ptr(&active_state->outgoing_packet);
     		for (i = 0; i < padding; i++) {
     			if (i % 4 == 0)
     				rnd = arc4random();
    @@ -630,33 +686,36 @@ packet_send1(void)
     			rnd >>= 8;
     		}
     	}
    -	buffer_consume(&outgoing_packet, 8 - padding);
    +	buffer_consume(&active_state->outgoing_packet, 8 - padding);
     
     	/* Add check bytes. */
    -	checksum = ssh_crc32(buffer_ptr(&outgoing_packet),
    -	    buffer_len(&outgoing_packet));
    +	checksum = ssh_crc32(buffer_ptr(&active_state->outgoing_packet),
    +	    buffer_len(&active_state->outgoing_packet));
     	put_u32(buf, checksum);
    -	buffer_append(&outgoing_packet, buf, 4);
    +	buffer_append(&active_state->outgoing_packet, buf, 4);
     
     #ifdef PACKET_DEBUG
     	fprintf(stderr, "packet_send plain: ");
    -	buffer_dump(&outgoing_packet);
    +	buffer_dump(&active_state->outgoing_packet);
     #endif
     
     	/* Append to output. */
     	put_u32(buf, len);
    -	buffer_append(&output, buf, 4);
    -	cp = buffer_append_space(&output, buffer_len(&outgoing_packet));
    -	cipher_crypt(&send_context, cp, buffer_ptr(&outgoing_packet),
    -	    buffer_len(&outgoing_packet));
    +	buffer_append(&active_state->output, buf, 4);
    +	cp = buffer_append_space(&active_state->output,
    +	    buffer_len(&active_state->outgoing_packet));
    +	cipher_crypt(&active_state->send_context, cp,
    +	    buffer_ptr(&active_state->outgoing_packet),
    +	    buffer_len(&active_state->outgoing_packet));
     
     #ifdef PACKET_DEBUG
     	fprintf(stderr, "encrypted: ");
    -	buffer_dump(&output);
    +	buffer_dump(&active_state->output);
     #endif
    -	p_send.packets++;
    -	p_send.bytes += len + buffer_len(&outgoing_packet);
    -	buffer_clear(&outgoing_packet);
    +	active_state->p_send.packets++;
    +	active_state->p_send.bytes += len +
    +	    buffer_len(&active_state->outgoing_packet);
    +	buffer_clear(&active_state->outgoing_packet);
     
     	/*
     	 * Note that the packet is now only buffered in output.  It won't be
    @@ -678,22 +737,22 @@ set_newkeys(int mode)
     	debug2("set_newkeys: mode %d", mode);
     
     	if (mode == MODE_OUT) {
    -		cc = &send_context;
    +		cc = &active_state->send_context;
     		crypt_type = CIPHER_ENCRYPT;
    -		p_send.packets = p_send.blocks = 0;
    -		max_blocks = &max_blocks_out;
    +		active_state->p_send.packets = active_state->p_send.blocks = 0;
    +		max_blocks = &active_state->max_blocks_out;
     	} else {
    -		cc = &receive_context;
    +		cc = &active_state->receive_context;
     		crypt_type = CIPHER_DECRYPT;
    -		p_read.packets = p_read.blocks = 0;
    -		max_blocks = &max_blocks_in;
    +		active_state->p_read.packets = active_state->p_read.blocks = 0;
    +		max_blocks = &active_state->max_blocks_in;
     	}
    -	if (newkeys[mode] != NULL) {
    +	if (active_state->newkeys[mode] != NULL) {
     		debug("set_newkeys: rekeying");
     		cipher_cleanup(cc);
    -		enc  = &newkeys[mode]->enc;
    -		mac  = &newkeys[mode]->mac;
    -		comp = &newkeys[mode]->comp;
    +		enc  = &active_state->newkeys[mode]->enc;
    +		mac  = &active_state->newkeys[mode]->mac;
    +		comp = &active_state->newkeys[mode]->comp;
     		mac_clear(mac);
     		xfree(enc->name);
     		xfree(enc->iv);
    @@ -701,14 +760,14 @@ set_newkeys(int mode)
     		xfree(mac->name);
     		xfree(mac->key);
     		xfree(comp->name);
    -		xfree(newkeys[mode]);
    +		xfree(active_state->newkeys[mode]);
     	}
    -	newkeys[mode] = kex_get_newkeys(mode);
    -	if (newkeys[mode] == NULL)
    +	active_state->newkeys[mode] = kex_get_newkeys(mode);
    +	if (active_state->newkeys[mode] == NULL)
     		fatal("newkeys: no keys for mode %d", mode);
    -	enc  = &newkeys[mode]->enc;
    -	mac  = &newkeys[mode]->mac;
    -	comp = &newkeys[mode]->comp;
    +	enc  = &active_state->newkeys[mode]->enc;
    +	mac  = &active_state->newkeys[mode]->mac;
    +	comp = &active_state->newkeys[mode]->comp;
     	if (mac_init(mac) == 0)
     		mac->enabled = 1;
     	DBG(debug("cipher_init_context: %d", mode));
    @@ -719,8 +778,8 @@ set_newkeys(int mode)
     	   memset(enc->key, 0, enc->key_len);
     	   memset(mac->key, 0, mac->key_len); */
     	if ((comp->type == COMP_ZLIB ||
    -	    (comp->type == COMP_DELAYED && after_authentication)) &&
    -	    comp->enabled == 0) {
    +	    (comp->type == COMP_DELAYED &&
    +	     active_state->after_authentication)) && comp->enabled == 0) {
     		packet_init_compression();
     		if (mode == MODE_OUT)
     			buffer_compress_init_send(6);
    @@ -736,8 +795,9 @@ set_newkeys(int mode)
     		*max_blocks = (u_int64_t)1 << (enc->block_size*2);
     	else
     		*max_blocks = ((u_int64_t)1 << 30) / enc->block_size;
    -	if (rekey_limit)
    -		*max_blocks = MIN(*max_blocks, rekey_limit / enc->block_size);
    +	if (active_state->rekey_limit)
    +		*max_blocks = MIN(*max_blocks,
    +		    active_state->rekey_limit / enc->block_size);
     }
     
     /*
    @@ -755,12 +815,12 @@ packet_enable_delayed_compress(void)
     	 * Remember that we are past the authentication step, so rekeying
     	 * with COMP_DELAYED will turn on compression immediately.
     	 */
    -	after_authentication = 1;
    +	active_state->after_authentication = 1;
     	for (mode = 0; mode < MODE_MAX; mode++) {
     		/* protocol error: USERAUTH_SUCCESS received before NEWKEYS */
    -		if (newkeys[mode] == NULL)
    +		if (active_state->newkeys[mode] == NULL)
     			continue;
    -		comp = &newkeys[mode]->comp;
    +		comp = &active_state->newkeys[mode]->comp;
     		if (comp && !comp->enabled && comp->type == COMP_DELAYED) {
     			packet_init_compression();
     			if (mode == MODE_OUT)
    @@ -788,37 +848,39 @@ packet_send2_wrapped(void)
     	Comp *comp = NULL;
     	int block_size;
     
    -	if (newkeys[MODE_OUT] != NULL) {
    -		enc  = &newkeys[MODE_OUT]->enc;
    -		mac  = &newkeys[MODE_OUT]->mac;
    -		comp = &newkeys[MODE_OUT]->comp;
    +	if (active_state->newkeys[MODE_OUT] != NULL) {
    +		enc  = &active_state->newkeys[MODE_OUT]->enc;
    +		mac  = &active_state->newkeys[MODE_OUT]->mac;
    +		comp = &active_state->newkeys[MODE_OUT]->comp;
     	}
     	block_size = enc ? enc->block_size : 8;
     
    -	cp = buffer_ptr(&outgoing_packet);
    +	cp = buffer_ptr(&active_state->outgoing_packet);
     	type = cp[5];
     
     #ifdef PACKET_DEBUG
     	fprintf(stderr, "plain:     ");
    -	buffer_dump(&outgoing_packet);
    +	buffer_dump(&active_state->outgoing_packet);
     #endif
     
     	if (comp && comp->enabled) {
    -		len = buffer_len(&outgoing_packet);
    +		len = buffer_len(&active_state->outgoing_packet);
     		/* skip header, compress only payload */
    -		buffer_consume(&outgoing_packet, 5);
    -		buffer_clear(&compression_buffer);
    -		buffer_compress(&outgoing_packet, &compression_buffer);
    -		buffer_clear(&outgoing_packet);
    -		buffer_append(&outgoing_packet, "\0\0\0\0\0", 5);
    -		buffer_append(&outgoing_packet, buffer_ptr(&compression_buffer),
    -		    buffer_len(&compression_buffer));
    +		buffer_consume(&active_state->outgoing_packet, 5);
    +		buffer_clear(&active_state->compression_buffer);
    +		buffer_compress(&active_state->outgoing_packet,
    +		    &active_state->compression_buffer);
    +		buffer_clear(&active_state->outgoing_packet);
    +		buffer_append(&active_state->outgoing_packet, "\0\0\0\0\0", 5);
    +		buffer_append(&active_state->outgoing_packet,
    +		    buffer_ptr(&active_state->compression_buffer),
    +		    buffer_len(&active_state->compression_buffer));
     		DBG(debug("compression: raw %d compressed %d", len,
    -		    buffer_len(&outgoing_packet)));
    +		    buffer_len(&active_state->outgoing_packet)));
     	}
     
     	/* sizeof (packet_len + pad_len + payload) */
    -	len = buffer_len(&outgoing_packet);
    +	len = buffer_len(&active_state->outgoing_packet);
     
     	/*
     	 * calc size of padding, alloc space, get random data,
    @@ -827,17 +889,19 @@ packet_send2_wrapped(void)
     	padlen = block_size - (len % block_size);
     	if (padlen < 4)
     		padlen += block_size;
    -	if (extra_pad) {
    +	if (active_state->extra_pad) {
     		/* will wrap if extra_pad+padlen > 255 */
    -		extra_pad  = roundup(extra_pad, block_size);
    -		pad = extra_pad - ((len + padlen) % extra_pad);
    +		active_state->extra_pad =
    +		    roundup(active_state->extra_pad, block_size);
    +		pad = active_state->extra_pad -
    +		    ((len + padlen) % active_state->extra_pad);
     		debug3("packet_send2: adding %d (len %d padlen %d extra_pad %d)",
    -		    pad, len, padlen, extra_pad);
    +		    pad, len, padlen, active_state->extra_pad);
     		padlen += pad;
    -		extra_pad = 0;
    +		active_state->extra_pad = 0;
     	}
    -	cp = buffer_append_space(&outgoing_packet, padlen);
    -	if (enc && !send_context.plaintext) {
    +	cp = buffer_append_space(&active_state->outgoing_packet, padlen);
    +	if (enc && !active_state->send_context.plaintext) {
     		/* random padding */
     		for (i = 0; i < padlen; i++) {
     			if (i % 4 == 0)
    @@ -850,86 +914,88 @@ packet_send2_wrapped(void)
     		memset(cp, 0, padlen);
     	}
     	/* packet_length includes payload, padding and padding length field */
    -	packet_length = buffer_len(&outgoing_packet) - 4;
    -	cp = buffer_ptr(&outgoing_packet);
    +	packet_length = buffer_len(&active_state->outgoing_packet) - 4;
    +	cp = buffer_ptr(&active_state->outgoing_packet);
     	put_u32(cp, packet_length);
     	cp[4] = padlen;
     	DBG(debug("send: len %d (includes padlen %d)", packet_length+4, padlen));
     
     	/* compute MAC over seqnr and packet(length fields, payload, padding) */
     	if (mac && mac->enabled) {
    -		macbuf = mac_compute(mac, p_send.seqnr,
    -		    buffer_ptr(&outgoing_packet),
    -		    buffer_len(&outgoing_packet));
    -		DBG(debug("done calc MAC out #%d", p_send.seqnr));
    +		macbuf = mac_compute(mac, active_state->p_send.seqnr,
    +		    buffer_ptr(&active_state->outgoing_packet),
    +		    buffer_len(&active_state->outgoing_packet));
    +		DBG(debug("done calc MAC out #%d", active_state->p_send.seqnr));
     	}
     	/* encrypt packet and append to output buffer. */
    -	cp = buffer_append_space(&output, buffer_len(&outgoing_packet));
    -	cipher_crypt(&send_context, cp, buffer_ptr(&outgoing_packet),
    -	    buffer_len(&outgoing_packet));
    +	cp = buffer_append_space(&active_state->output,
    +	    buffer_len(&active_state->outgoing_packet));
    +	cipher_crypt(&active_state->send_context, cp,
    +	    buffer_ptr(&active_state->outgoing_packet),
    +	    buffer_len(&active_state->outgoing_packet));
     	/* append unencrypted MAC */
     	if (mac && mac->enabled)
    -		buffer_append(&output, macbuf, mac->mac_len);
    +		buffer_append(&active_state->output, macbuf, mac->mac_len);
     #ifdef PACKET_DEBUG
     	fprintf(stderr, "encrypted: ");
    -	buffer_dump(&output);
    +	buffer_dump(&active_state->output);
     #endif
     	/* increment sequence number for outgoing packets */
    -	if (++p_send.seqnr == 0)
    +	if (++active_state->p_send.seqnr == 0)
     		logit("outgoing seqnr wraps around");
    -	if (++p_send.packets == 0)
    +	if (++active_state->p_send.packets == 0)
     		if (!(datafellows & SSH_BUG_NOREKEY))
     			fatal("XXX too many packets with same key");
    -	p_send.blocks += (packet_length + 4) / block_size;
    -	p_send.bytes += packet_length + 4;
    -	buffer_clear(&outgoing_packet);
    +	active_state->p_send.blocks += (packet_length + 4) / block_size;
    +	active_state->p_send.bytes += packet_length + 4;
    +	buffer_clear(&active_state->outgoing_packet);
     
     	if (type == SSH2_MSG_NEWKEYS)
     		set_newkeys(MODE_OUT);
    -	else if (type == SSH2_MSG_USERAUTH_SUCCESS && server_side)
    +	else if (type == SSH2_MSG_USERAUTH_SUCCESS && active_state->server_side)
     		packet_enable_delayed_compress();
     }
     
     static void
     packet_send2(void)
     {
    -	static int rekeying = 0;
     	struct packet *p;
     	u_char type, *cp;
     
    -	cp = buffer_ptr(&outgoing_packet);
    +	cp = buffer_ptr(&active_state->outgoing_packet);
     	type = cp[5];
     
     	/* during rekeying we can only send key exchange messages */
    -	if (rekeying) {
    +	if (active_state->rekeying) {
     		if (!((type >= SSH2_MSG_TRANSPORT_MIN) &&
     		    (type <= SSH2_MSG_TRANSPORT_MAX))) {
     			debug("enqueue packet: %u", type);
     			p = xmalloc(sizeof(*p));
     			p->type = type;
    -			memcpy(&p->payload, &outgoing_packet, sizeof(Buffer));
    -			buffer_init(&outgoing_packet);
    -			TAILQ_INSERT_TAIL(&outgoing, p, next);
    +			memcpy(&p->payload, &active_state->outgoing_packet,
    +			    sizeof(Buffer));
    +			buffer_init(&active_state->outgoing_packet);
    +			TAILQ_INSERT_TAIL(&active_state->outgoing, p, next);
     			return;
     		}
     	}
     
     	/* rekeying starts with sending KEXINIT */
     	if (type == SSH2_MSG_KEXINIT)
    -		rekeying = 1;
    +		active_state->rekeying = 1;
     
     	packet_send2_wrapped();
     
     	/* after a NEWKEYS message we can send the complete queue */
     	if (type == SSH2_MSG_NEWKEYS) {
    -		rekeying = 0;
    -		while ((p = TAILQ_FIRST(&outgoing))) {
    +		active_state->rekeying = 0;
    +		while ((p = TAILQ_FIRST(&active_state->outgoing))) {
     			type = p->type;
     			debug("dequeue packet: %u", type);
    -			buffer_free(&outgoing_packet);
    -			memcpy(&outgoing_packet, &p->payload,
    +			buffer_free(&active_state->outgoing_packet);
    +			memcpy(&active_state->outgoing_packet, &p->payload,
     			    sizeof(Buffer));
    -			TAILQ_REMOVE(&outgoing, p, next);
    +			TAILQ_REMOVE(&active_state->outgoing, p, next);
     			xfree(p);
     			packet_send2_wrapped();
     		}
    @@ -955,15 +1021,15 @@ packet_send(void)
     int
     packet_read_seqnr(u_int32_t *seqnr_p)
     {
    -	int type, len, ret, ms_remain;
    +	int type, len, ret, ms_remain, cont;
     	fd_set *setp;
     	char buf[8192];
     	struct timeval timeout, start, *timeoutp = NULL;
     
     	DBG(debug("packet_read()"));
     
    -	setp = (fd_set *)xcalloc(howmany(connection_in+1, NFDBITS),
    -	    sizeof(fd_mask));
    +	setp = (fd_set *)xcalloc(howmany(active_state->connection_in + 1,
    +	    NFDBITS), sizeof(fd_mask));
     
     	/* Since we are blocking, ensure that all written packets have been sent. */
     	packet_write_wait();
    @@ -987,27 +1053,27 @@ packet_read_seqnr(u_int32_t *seqnr_p)
     		 * Otherwise, wait for some data to arrive, add it to the
     		 * buffer, and try again.
     		 */
    -		memset(setp, 0, howmany(connection_in + 1, NFDBITS) *
    -		    sizeof(fd_mask));
    -		FD_SET(connection_in, setp);
    +		memset(setp, 0, howmany(active_state->connection_in + 1,
    +		    NFDBITS) * sizeof(fd_mask));
    +		FD_SET(active_state->connection_in, setp);
     
    -		if (packet_timeout_ms > 0) {
    -			ms_remain = packet_timeout_ms;
    +		if (active_state->packet_timeout_ms > 0) {
    +			ms_remain = active_state->packet_timeout_ms;
     			timeoutp = &timeout;
     		}
     		/* Wait for some data to arrive. */
     		for (;;) {
    -			if (packet_timeout_ms != -1) {
    +			if (active_state->packet_timeout_ms != -1) {
     				ms_to_timeval(&timeout, ms_remain);
     				gettimeofday(&start, NULL);
     			}
    -			if ((ret = select(connection_in + 1, setp, NULL,
    -			    NULL, timeoutp)) >= 0)
    +			if ((ret = select(active_state->connection_in + 1, setp,
    +			    NULL, NULL, timeoutp)) >= 0)
     				break;
    -		   	if (errno != EAGAIN && errno != EINTR &&
    +			if (errno != EAGAIN && errno != EINTR &&
     			    errno != EWOULDBLOCK)
     				break;
    -			if (packet_timeout_ms == -1)
    +			if (active_state->packet_timeout_ms == -1)
     				continue;
     			ms_subtract_diff(&start, &ms_remain);
     			if (ms_remain <= 0) {
    @@ -1021,7 +1087,11 @@ packet_read_seqnr(u_int32_t *seqnr_p)
     			cleanup_exit(255);
     		}
     		/* Read data from the socket. */
    -		len = read(connection_in, buf, sizeof(buf));
    +		do {
    +			cont = 0;
    +			len = roaming_read(active_state->connection_in, buf,
    +			    sizeof(buf), &cont);
    +		} while (len == 0 && cont);
     		if (len == 0) {
     			logit("Connection closed by %.200s", get_remote_ipaddr());
     			cleanup_exit(255);
    @@ -1073,31 +1143,32 @@ packet_read_poll1(void)
     	u_int checksum, stored_checksum;
     
     	/* Check if input size is less than minimum packet size. */
    -	if (buffer_len(&input) < 4 + 8)
    +	if (buffer_len(&active_state->input) < 4 + 8)
     		return SSH_MSG_NONE;
     	/* Get length of incoming packet. */
    -	cp = buffer_ptr(&input);
    +	cp = buffer_ptr(&active_state->input);
     	len = get_u32(cp);
     	if (len < 1 + 2 + 2 || len > 256 * 1024)
     		packet_disconnect("Bad packet length %u.", len);
     	padded_len = (len + 8) & ~7;
     
     	/* Check if the packet has been entirely received. */
    -	if (buffer_len(&input) < 4 + padded_len)
    +	if (buffer_len(&active_state->input) < 4 + padded_len)
     		return SSH_MSG_NONE;
     
     	/* The entire packet is in buffer. */
     
     	/* Consume packet length. */
    -	buffer_consume(&input, 4);
    +	buffer_consume(&active_state->input, 4);
     
     	/*
     	 * Cryptographic attack detector for ssh
     	 * (C)1998 CORE-SDI, Buenos Aires Argentina
     	 * Ariel Futoransky(futo@core-sdi.com)
     	 */
    -	if (!receive_context.plaintext) {
    -		switch (detect_attack(buffer_ptr(&input), padded_len)) {
    +	if (!active_state->receive_context.plaintext) {
    +		switch (detect_attack(buffer_ptr(&active_state->input),
    +		    padded_len)) {
     		case DEATTACK_DETECTED:
     			packet_disconnect("crc32 compensation attack: "
     			    "network attack detected");
    @@ -1108,45 +1179,48 @@ packet_read_poll1(void)
     	}
     
     	/* Decrypt data to incoming_packet. */
    -	buffer_clear(&incoming_packet);
    -	cp = buffer_append_space(&incoming_packet, padded_len);
    -	cipher_crypt(&receive_context, cp, buffer_ptr(&input), padded_len);
    +	buffer_clear(&active_state->incoming_packet);
    +	cp = buffer_append_space(&active_state->incoming_packet, padded_len);
    +	cipher_crypt(&active_state->receive_context, cp,
    +	    buffer_ptr(&active_state->input), padded_len);
     
    -	buffer_consume(&input, padded_len);
    +	buffer_consume(&active_state->input, padded_len);
     
     #ifdef PACKET_DEBUG
     	fprintf(stderr, "read_poll plain: ");
    -	buffer_dump(&incoming_packet);
    +	buffer_dump(&active_state->incoming_packet);
     #endif
     
     	/* Compute packet checksum. */
    -	checksum = ssh_crc32(buffer_ptr(&incoming_packet),
    -	    buffer_len(&incoming_packet) - 4);
    +	checksum = ssh_crc32(buffer_ptr(&active_state->incoming_packet),
    +	    buffer_len(&active_state->incoming_packet) - 4);
     
     	/* Skip padding. */
    -	buffer_consume(&incoming_packet, 8 - len % 8);
    +	buffer_consume(&active_state->incoming_packet, 8 - len % 8);
     
     	/* Test check bytes. */
    -	if (len != buffer_len(&incoming_packet))
    +	if (len != buffer_len(&active_state->incoming_packet))
     		packet_disconnect("packet_read_poll1: len %d != buffer_len %d.",
    -		    len, buffer_len(&incoming_packet));
    +		    len, buffer_len(&active_state->incoming_packet));
     
    -	cp = (u_char *)buffer_ptr(&incoming_packet) + len - 4;
    +	cp = (u_char *)buffer_ptr(&active_state->incoming_packet) + len - 4;
     	stored_checksum = get_u32(cp);
     	if (checksum != stored_checksum)
     		packet_disconnect("Corrupted check bytes on input.");
    -	buffer_consume_end(&incoming_packet, 4);
    +	buffer_consume_end(&active_state->incoming_packet, 4);
     
    -	if (packet_compression) {
    -		buffer_clear(&compression_buffer);
    -		buffer_uncompress(&incoming_packet, &compression_buffer);
    -		buffer_clear(&incoming_packet);
    -		buffer_append(&incoming_packet, buffer_ptr(&compression_buffer),
    -		    buffer_len(&compression_buffer));
    +	if (active_state->packet_compression) {
    +		buffer_clear(&active_state->compression_buffer);
    +		buffer_uncompress(&active_state->incoming_packet,
    +		    &active_state->compression_buffer);
    +		buffer_clear(&active_state->incoming_packet);
    +		buffer_append(&active_state->incoming_packet,
    +		    buffer_ptr(&active_state->compression_buffer),
    +		    buffer_len(&active_state->compression_buffer));
     	}
    -	p_read.packets++;
    -	p_read.bytes += padded_len + 4;
    -	type = buffer_get_char(&incoming_packet);
    +	active_state->p_read.packets++;
    +	active_state->p_read.bytes += padded_len + 4;
    +	type = buffer_get_char(&active_state->incoming_packet);
     	if (type < SSH_MSG_MIN || type > SSH_MSG_MAX)
     		packet_disconnect("Invalid ssh1 packet type: %d", type);
     	return type;
    @@ -1155,7 +1229,6 @@ packet_read_poll1(void)
     static int
     packet_read_poll2(u_int32_t *seqnr_p)
     {
    -	static u_int packet_length = 0;
     	u_int padlen, need;
     	u_char *macbuf, *cp, type;
     	u_int maclen, block_size;
    @@ -1163,50 +1236,52 @@ packet_read_poll2(u_int32_t *seqnr_p)
     	Mac *mac   = NULL;
     	Comp *comp = NULL;
     
    -	if (packet_discard)
    +	if (active_state->packet_discard)
     		return SSH_MSG_NONE;
     
    -	if (newkeys[MODE_IN] != NULL) {
    -		enc  = &newkeys[MODE_IN]->enc;
    -		mac  = &newkeys[MODE_IN]->mac;
    -		comp = &newkeys[MODE_IN]->comp;
    +	if (active_state->newkeys[MODE_IN] != NULL) {
    +		enc  = &active_state->newkeys[MODE_IN]->enc;
    +		mac  = &active_state->newkeys[MODE_IN]->mac;
    +		comp = &active_state->newkeys[MODE_IN]->comp;
     	}
     	maclen = mac && mac->enabled ? mac->mac_len : 0;
     	block_size = enc ? enc->block_size : 8;
     
    -	if (packet_length == 0) {
    +	if (active_state->packlen == 0) {
     		/*
     		 * check if input size is less than the cipher block size,
     		 * decrypt first block and extract length of incoming packet
     		 */
    -		if (buffer_len(&input) < block_size)
    +		if (buffer_len(&active_state->input) < block_size)
     			return SSH_MSG_NONE;
    -		buffer_clear(&incoming_packet);
    -		cp = buffer_append_space(&incoming_packet, block_size);
    -		cipher_crypt(&receive_context, cp, buffer_ptr(&input),
    +		buffer_clear(&active_state->incoming_packet);
    +		cp = buffer_append_space(&active_state->incoming_packet,
     		    block_size);
    -		cp = buffer_ptr(&incoming_packet);
    -		packet_length = get_u32(cp);
    -		if (packet_length < 1 + 4 || packet_length > PACKET_MAX_SIZE) {
    +		cipher_crypt(&active_state->receive_context, cp,
    +		    buffer_ptr(&active_state->input), block_size);
    +		cp = buffer_ptr(&active_state->incoming_packet);
    +		active_state->packlen = get_u32(cp);
    +		if (active_state->packlen < 1 + 4 ||
    +		    active_state->packlen > PACKET_MAX_SIZE) {
     #ifdef PACKET_DEBUG
    -			buffer_dump(&incoming_packet);
    +			buffer_dump(&active_state->incoming_packet);
     #endif
    -			logit("Bad packet length %u.", packet_length);
    -			packet_start_discard(enc, mac, packet_length,
    +			logit("Bad packet length %u.", active_state->packlen);
    +			packet_start_discard(enc, mac, active_state->packlen,
     			    PACKET_MAX_SIZE);
     			return SSH_MSG_NONE;
     		}
    -		DBG(debug("input: packet len %u", packet_length+4));
    -		buffer_consume(&input, block_size);
    +		DBG(debug("input: packet len %u", active_state->packlen+4));
    +		buffer_consume(&active_state->input, block_size);
     	}
     	/* we have a partial packet of block_size bytes */
    -	need = 4 + packet_length - block_size;
    +	need = 4 + active_state->packlen - block_size;
     	DBG(debug("partial packet %d, need %d, maclen %d", block_size,
     	    need, maclen));
     	if (need % block_size != 0) {
     		logit("padding error: need %d block %d mod %d",
     		    need, block_size, need % block_size);
    -		packet_start_discard(enc, mac, packet_length,
    +		packet_start_discard(enc, mac, active_state->packlen,
     		    PACKET_MAX_SIZE - block_size);
     		return SSH_MSG_NONE;
     	}
    @@ -1214,84 +1289,90 @@ packet_read_poll2(u_int32_t *seqnr_p)
     	 * check if the entire packet has been received and
     	 * decrypt into incoming_packet
     	 */
    -	if (buffer_len(&input) < need + maclen)
    +	if (buffer_len(&active_state->input) < need + maclen)
     		return SSH_MSG_NONE;
     #ifdef PACKET_DEBUG
     	fprintf(stderr, "read_poll enc/full: ");
    -	buffer_dump(&input);
    +	buffer_dump(&active_state->input);
     #endif
    -	cp = buffer_append_space(&incoming_packet, need);
    -	cipher_crypt(&receive_context, cp, buffer_ptr(&input), need);
    -	buffer_consume(&input, need);
    +	cp = buffer_append_space(&active_state->incoming_packet, need);
    +	cipher_crypt(&active_state->receive_context, cp,
    +	    buffer_ptr(&active_state->input), need);
    +	buffer_consume(&active_state->input, need);
     	/*
     	 * compute MAC over seqnr and packet,
     	 * increment sequence number for incoming packet
     	 */
     	if (mac && mac->enabled) {
    -		macbuf = mac_compute(mac, p_read.seqnr,
    -		    buffer_ptr(&incoming_packet),
    -		    buffer_len(&incoming_packet));
    -		if (memcmp(macbuf, buffer_ptr(&input), mac->mac_len) != 0) {
    +		macbuf = mac_compute(mac, active_state->p_read.seqnr,
    +		    buffer_ptr(&active_state->incoming_packet),
    +		    buffer_len(&active_state->incoming_packet));
    +		if (memcmp(macbuf, buffer_ptr(&active_state->input),
    +		    mac->mac_len) != 0) {
     			logit("Corrupted MAC on input.");
     			if (need > PACKET_MAX_SIZE)
     				fatal("internal error need %d", need);
    -			packet_start_discard(enc, mac, packet_length,
    +			packet_start_discard(enc, mac, active_state->packlen,
     			    PACKET_MAX_SIZE - need);
     			return SSH_MSG_NONE;
     		}
     				
    -		DBG(debug("MAC #%d ok", p_read.seqnr));
    -		buffer_consume(&input, mac->mac_len);
    +		DBG(debug("MAC #%d ok", active_state->p_read.seqnr));
    +		buffer_consume(&active_state->input, mac->mac_len);
     	}
     	/* XXX now it's safe to use fatal/packet_disconnect */
     	if (seqnr_p != NULL)
    -		*seqnr_p = p_read.seqnr;
    -	if (++p_read.seqnr == 0)
    +		*seqnr_p = active_state->p_read.seqnr;
    +	if (++active_state->p_read.seqnr == 0)
     		logit("incoming seqnr wraps around");
    -	if (++p_read.packets == 0)
    +	if (++active_state->p_read.packets == 0)
     		if (!(datafellows & SSH_BUG_NOREKEY))
     			fatal("XXX too many packets with same key");
    -	p_read.blocks += (packet_length + 4) / block_size;
    -	p_read.bytes += packet_length + 4;
    +	active_state->p_read.blocks += (active_state->packlen + 4) / block_size;
    +	active_state->p_read.bytes += active_state->packlen + 4;
     
     	/* get padlen */
    -	cp = buffer_ptr(&incoming_packet);
    +	cp = buffer_ptr(&active_state->incoming_packet);
     	padlen = cp[4];
     	DBG(debug("input: padlen %d", padlen));
     	if (padlen < 4)
     		packet_disconnect("Corrupted padlen %d on input.", padlen);
     
     	/* skip packet size + padlen, discard padding */
    -	buffer_consume(&incoming_packet, 4 + 1);
    -	buffer_consume_end(&incoming_packet, padlen);
    +	buffer_consume(&active_state->incoming_packet, 4 + 1);
    +	buffer_consume_end(&active_state->incoming_packet, padlen);
     
    -	DBG(debug("input: len before de-compress %d", buffer_len(&incoming_packet)));
    +	DBG(debug("input: len before de-compress %d",
    +	    buffer_len(&active_state->incoming_packet)));
     	if (comp && comp->enabled) {
    -		buffer_clear(&compression_buffer);
    -		buffer_uncompress(&incoming_packet, &compression_buffer);
    -		buffer_clear(&incoming_packet);
    -		buffer_append(&incoming_packet, buffer_ptr(&compression_buffer),
    -		    buffer_len(&compression_buffer));
    +		buffer_clear(&active_state->compression_buffer);
    +		buffer_uncompress(&active_state->incoming_packet,
    +		    &active_state->compression_buffer);
    +		buffer_clear(&active_state->incoming_packet);
    +		buffer_append(&active_state->incoming_packet,
    +		    buffer_ptr(&active_state->compression_buffer),
    +		    buffer_len(&active_state->compression_buffer));
     		DBG(debug("input: len after de-compress %d",
    -		    buffer_len(&incoming_packet)));
    +		    buffer_len(&active_state->incoming_packet)));
     	}
     	/*
     	 * get packet type, implies consume.
     	 * return length of payload (without type field)
     	 */
    -	type = buffer_get_char(&incoming_packet);
    +	type = buffer_get_char(&active_state->incoming_packet);
     	if (type < SSH2_MSG_MIN || type >= SSH2_MSG_LOCAL_MIN)
     		packet_disconnect("Invalid ssh2 packet type: %d", type);
     	if (type == SSH2_MSG_NEWKEYS)
     		set_newkeys(MODE_IN);
    -	else if (type == SSH2_MSG_USERAUTH_SUCCESS && !server_side)
    +	else if (type == SSH2_MSG_USERAUTH_SUCCESS &&
    +	    !active_state->server_side)
     		packet_enable_delayed_compress();
     #ifdef PACKET_DEBUG
     	fprintf(stderr, "read/plain[%d]:\r\n", type);
    -	buffer_dump(&incoming_packet);
    +	buffer_dump(&active_state->incoming_packet);
     #endif
     	/* reset for next packet */
    -	packet_length = 0;
    +	active_state->packlen = 0;
     	return type;
     }
     
    @@ -1306,7 +1387,7 @@ packet_read_poll_seqnr(u_int32_t *seqnr_p)
     		if (compat20) {
     			type = packet_read_poll2(seqnr_p);
     			if (type) {
    -				keep_alive_timeouts = 0;
    +				active_state->keep_alive_timeouts = 0;
     				DBG(debug("received packet type %d", type));
     			}
     			switch (type) {
    @@ -1376,14 +1457,14 @@ packet_read_poll(void)
     void
     packet_process_incoming(const char *buf, u_int len)
     {
    -	if (packet_discard) {
    -		keep_alive_timeouts = 0; /* ?? */
    -		if (len >= packet_discard)
    +	if (active_state->packet_discard) {
    +		active_state->keep_alive_timeouts = 0; /* ?? */
    +		if (len >= active_state->packet_discard)
     			packet_stop_discard();
    -		packet_discard -= len;
    +		active_state->packet_discard -= len;
     		return;
     	}
    -	buffer_append(&input, buf, len);
    +	buffer_append(&active_state->input, buf, len);
     }
     
     /* Returns a character from the packet. */
    @@ -1393,7 +1474,7 @@ packet_get_char(void)
     {
     	char ch;
     
    -	buffer_get(&incoming_packet, &ch, 1);
    +	buffer_get(&active_state->incoming_packet, &ch, 1);
     	return (u_char) ch;
     }
     
    @@ -1402,7 +1483,15 @@ packet_get_char(void)
     u_int
     packet_get_int(void)
     {
    -	return buffer_get_int(&incoming_packet);
    +	return buffer_get_int(&active_state->incoming_packet);
    +}
    +
    +/* Returns an 64 bit integer from the packet data. */
    +
    +u_int64_t
    +packet_get_int64(void)
    +{
    +	return buffer_get_int64(&active_state->incoming_packet);
     }
     
     /*
    @@ -1413,29 +1502,29 @@ packet_get_int(void)
     void
     packet_get_bignum(BIGNUM * value)
     {
    -	buffer_get_bignum(&incoming_packet, value);
    +	buffer_get_bignum(&active_state->incoming_packet, value);
     }
     
     void
     packet_get_bignum2(BIGNUM * value)
     {
    -	buffer_get_bignum2(&incoming_packet, value);
    +	buffer_get_bignum2(&active_state->incoming_packet, value);
     }
     
     void *
     packet_get_raw(u_int *length_ptr)
     {
    -	u_int bytes = buffer_len(&incoming_packet);
    +	u_int bytes = buffer_len(&active_state->incoming_packet);
     
     	if (length_ptr != NULL)
     		*length_ptr = bytes;
    -	return buffer_ptr(&incoming_packet);
    +	return buffer_ptr(&active_state->incoming_packet);
     }
     
     int
     packet_remaining(void)
     {
    -	return buffer_len(&incoming_packet);
    +	return buffer_len(&active_state->incoming_packet);
     }
     
     /*
    @@ -1448,13 +1537,13 @@ packet_remaining(void)
     void *
     packet_get_string(u_int *length_ptr)
     {
    -	return buffer_get_string(&incoming_packet, length_ptr);
    +	return buffer_get_string(&active_state->incoming_packet, length_ptr);
     }
     
     void *
     packet_get_string_ptr(u_int *length_ptr)
     {
    -	return buffer_get_string_ptr(&incoming_packet, length_ptr);
    +	return buffer_get_string_ptr(&active_state->incoming_packet, length_ptr);
     }
     
     /*
    @@ -1547,23 +1636,25 @@ packet_disconnect(const char *fmt,...)
     void
     packet_write_poll(void)
     {
    -	int len = buffer_len(&output);
    +	int len = buffer_len(&active_state->output);
    +	int cont;
     
     	if (len > 0) {
    -		len = write(connection_out, buffer_ptr(&output), len);
    +		cont = 0;
    +		len = roaming_write(active_state->connection_out,
    +		    buffer_ptr(&active_state->output), len, &cont);
     		if (len == -1) {
     			if (errno == EINTR || errno == EAGAIN ||
     			    errno == EWOULDBLOCK)
     				return;
     			fatal("Write failed: %.100s", strerror(errno));
     		}
    -		if (len == 0)
    +		if (len == 0 && !cont)
     			fatal("Write connection closed");
    -		buffer_consume(&output, len);
    +		buffer_consume(&active_state->output, len);
     	}
     }
     
    -
     /*
      * Calls packet_write_poll repeatedly until all pending output data has been
      * written.
    @@ -1576,30 +1667,30 @@ packet_write_wait(void)
     	int ret, ms_remain;
     	struct timeval start, timeout, *timeoutp = NULL;
     
    -	setp = (fd_set *)xcalloc(howmany(connection_out + 1, NFDBITS),
    -	    sizeof(fd_mask));
    +	setp = (fd_set *)xcalloc(howmany(active_state->connection_out + 1,
    +	    NFDBITS), sizeof(fd_mask));
     	packet_write_poll();
     	while (packet_have_data_to_write()) {
    -		memset(setp, 0, howmany(connection_out + 1, NFDBITS) *
    -		    sizeof(fd_mask));
    -		FD_SET(connection_out, setp);
    +		memset(setp, 0, howmany(active_state->connection_out + 1,
    +		    NFDBITS) * sizeof(fd_mask));
    +		FD_SET(active_state->connection_out, setp);
     
    -		if (packet_timeout_ms > 0) {
    -			ms_remain = packet_timeout_ms;
    +		if (active_state->packet_timeout_ms > 0) {
    +			ms_remain = active_state->packet_timeout_ms;
     			timeoutp = &timeout;
     		}
     		for (;;) {
    -			if (packet_timeout_ms != -1) {
    +			if (active_state->packet_timeout_ms != -1) {
     				ms_to_timeval(&timeout, ms_remain);
     				gettimeofday(&start, NULL);
     			}
    -			if ((ret = select(connection_out + 1, NULL, setp,
    -			    NULL, timeoutp)) >= 0)
    +			if ((ret = select(active_state->connection_out + 1,
    +			    NULL, setp, NULL, timeoutp)) >= 0)
     				break;
    -		   	if (errno != EAGAIN && errno != EINTR &&
    +			if (errno != EAGAIN && errno != EINTR &&
     			    errno != EWOULDBLOCK)
     				break;
    -			if (packet_timeout_ms == -1)
    +			if (active_state->packet_timeout_ms == -1)
     				continue;
     			ms_subtract_diff(&start, &ms_remain);
     			if (ms_remain <= 0) {
    @@ -1622,7 +1713,7 @@ packet_write_wait(void)
     int
     packet_have_data_to_write(void)
     {
    -	return buffer_len(&output) != 0;
    +	return buffer_len(&active_state->output) != 0;
     }
     
     /* Returns true if there is not too much data to write to the connection. */
    @@ -1630,13 +1721,12 @@ packet_have_data_to_write(void)
     int
     packet_not_very_much_data_to_write(void)
     {
    -	if (interactive_mode)
    -		return buffer_len(&output) < 16384;
    +	if (active_state->interactive_mode)
    +		return buffer_len(&active_state->output) < 16384;
     	else
    -		return buffer_len(&output) < 128 * 1024;
    +		return buffer_len(&active_state->output) < 128 * 1024;
     }
     
    -
     static void
     packet_set_tos(int interactive)
     {
    @@ -1646,7 +1736,7 @@ packet_set_tos(int interactive)
     	if (!packet_connection_is_on_socket() ||
     	    !packet_connection_is_ipv4())
     		return;
    -	if (setsockopt(connection_in, IPPROTO_IP, IP_TOS, &tos,
    +	if (setsockopt(active_state->connection_in, IPPROTO_IP, IP_TOS, &tos,
     	    sizeof(tos)) < 0)
     		error("setsockopt IP_TOS %d: %.100s:",
     		    tos, strerror(errno));
    @@ -1658,19 +1748,17 @@ packet_set_tos(int interactive)
     void
     packet_set_interactive(int interactive)
     {
    -	static int called = 0;
    -
    -	if (called)
    +	if (active_state->set_interactive_called)
     		return;
    -	called = 1;
    +	active_state->set_interactive_called = 1;
     
     	/* Record that we are in interactive mode. */
    -	interactive_mode = interactive;
    +	active_state->interactive_mode = interactive;
     
     	/* Only set socket options if using a socket.  */
     	if (!packet_connection_is_on_socket())
     		return;
    -	set_nodelay(connection_in);
    +	set_nodelay(active_state->connection_in);
     	packet_set_tos(interactive);
     }
     
    @@ -1679,34 +1767,50 @@ packet_set_interactive(int interactive)
     int
     packet_is_interactive(void)
     {
    -	return interactive_mode;
    +	return active_state->interactive_mode;
     }
     
     int
     packet_set_maxsize(u_int s)
     {
    -	static int called = 0;
    -
    -	if (called) {
    +	if (active_state->set_maxsize_called) {
     		logit("packet_set_maxsize: called twice: old %d new %d",
    -		    max_packet_size, s);
    +		    active_state->max_packet_size, s);
     		return -1;
     	}
     	if (s < 4 * 1024 || s > 1024 * 1024) {
     		logit("packet_set_maxsize: bad size %d", s);
     		return -1;
     	}
    -	called = 1;
    +	active_state->set_maxsize_called = 1;
     	debug("packet_set_maxsize: setting to %d", s);
    -	max_packet_size = s;
    +	active_state->max_packet_size = s;
     	return s;
     }
     
    +int
    +packet_inc_alive_timeouts(void)
    +{
    +	return ++active_state->keep_alive_timeouts;
    +}
    +
    +void
    +packet_set_alive_timeouts(int ka)
    +{
    +	active_state->keep_alive_timeouts = ka;
    +}
    +
    +u_int
    +packet_get_maxsize(void)
    +{
    +	return active_state->max_packet_size;
    +}
    +
     /* roundup current message to pad bytes */
     void
     packet_add_padding(u_char pad)
     {
    -	extra_pad = pad;
    +	active_state->extra_pad = pad;
     }
     
     /*
    @@ -1743,26 +1847,93 @@ packet_need_rekeying(void)
     	if (datafellows & SSH_BUG_NOREKEY)
     		return 0;
     	return
    -	    (p_send.packets > MAX_PACKETS) ||
    -	    (p_read.packets > MAX_PACKETS) ||
    -	    (max_blocks_out && (p_send.blocks > max_blocks_out)) ||
    -	    (max_blocks_in  && (p_read.blocks > max_blocks_in));
    +	    (active_state->p_send.packets > MAX_PACKETS) ||
    +	    (active_state->p_read.packets > MAX_PACKETS) ||
    +	    (active_state->max_blocks_out &&
    +	        (active_state->p_send.blocks > active_state->max_blocks_out)) ||
    +	    (active_state->max_blocks_in &&
    +	        (active_state->p_read.blocks > active_state->max_blocks_in));
     }
     
     void
     packet_set_rekey_limit(u_int32_t bytes)
     {
    -	rekey_limit = bytes;
    +	active_state->rekey_limit = bytes;
     }
     
     void
     packet_set_server(void)
     {
    -	server_side = 1;
    +	active_state->server_side = 1;
     }
     
     void
     packet_set_authenticated(void)
     {
    -	after_authentication = 1;
    +	active_state->after_authentication = 1;
    +}
    +
    +void *
    +packet_get_input(void)
    +{
    +	return (void *)&active_state->input;
    +}
    +
    +void *
    +packet_get_output(void)
    +{
    +	return (void *)&active_state->output;
    +}
    +
    +void *
    +packet_get_newkeys(int mode)
    +{
    +	return (void *)active_state->newkeys[mode];
    +}
    +
    +/*
    + * Save the state for the real connection, and use a separate state when
    + * resuming a suspended connection.
    + */
    +void
    +packet_backup_state(void)
    +{
    +	struct session_state *tmp;
    +
    +	close(active_state->connection_in);
    +	active_state->connection_in = -1;
    +	close(active_state->connection_out);
    +	active_state->connection_out = -1;
    +	if (backup_state)
    +		tmp = backup_state;
    +	else
    +		tmp = alloc_session_state();
    +	backup_state = active_state;
    +	active_state = tmp;
    +}
    +
    +/*
    + * Swap in the old state when resuming a connecion.
    + */
    +void
    +packet_restore_state(void)
    +{
    +	struct session_state *tmp;
    +	void *buf;
    +	u_int len;
    +
    +	tmp = backup_state;
    +	backup_state = active_state;
    +	active_state = tmp;
    +	active_state->connection_in = backup_state->connection_in;
    +	backup_state->connection_in = -1;
    +	active_state->connection_out = backup_state->connection_out;
    +	backup_state->connection_out = -1;
    +	len = buffer_len(&backup_state->input);
    +	if (len > 0) {
    +		buf = buffer_ptr(&backup_state->input);
    +		buffer_append(&active_state->input, buf, len);
    +		buffer_clear(&backup_state->input);
    +		add_recv_bytes(len);
    +	}
     }
    diff --git a/crypto/openssh/packet.h b/crypto/openssh/packet.h
    index 03bb87c9beed..33523d7503ca 100644
    --- a/crypto/openssh/packet.h
    +++ b/crypto/openssh/packet.h
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: packet.h,v 1.49 2008/07/10 18:08:11 markus Exp $ */
    +/* $OpenBSD: packet.h,v 1.52 2009/06/27 09:29:06 andreas Exp $ */
     
     /*
      * Author: Tatu Ylonen 
    @@ -39,6 +39,7 @@ void     packet_set_authenticated(void);
     void     packet_start(u_char);
     void     packet_put_char(int ch);
     void     packet_put_int(u_int value);
    +void     packet_put_int64(u_int64_t value);
     void     packet_put_bignum(BIGNUM * value);
     void     packet_put_bignum2(BIGNUM * value);
     void     packet_put_string(const void *buf, u_int len);
    @@ -55,6 +56,7 @@ int      packet_read_poll_seqnr(u_int32_t *seqnr_p);
     
     u_int	 packet_get_char(void);
     u_int	 packet_get_int(void);
    +u_int64_t packet_get_int64(void);
     void     packet_get_bignum(BIGNUM * value);
     void     packet_get_bignum2(BIGNUM * value);
     void	*packet_get_raw(u_int *length_ptr);
    @@ -72,6 +74,7 @@ void	 packet_get_state(int, u_int32_t *, u_int64_t *, u_int32_t *, u_int64_t *);
     void	 packet_set_state(int, u_int32_t, u_int64_t, u_int32_t, u_int64_t);
     int	 packet_get_ssh1_cipher(void);
     void	 packet_set_iv(int, u_char *);
    +void	*packet_get_newkeys(int);
     
     void     packet_write_poll(void);
     void     packet_write_wait(void);
    @@ -87,10 +90,10 @@ void	 packet_add_padding(u_char);
     void	 tty_make_modes(int, struct termios *);
     void	 tty_parse_modes(int, int *);
     
    -extern u_int max_packet_size;
    -extern int keep_alive_timeouts;
    +void	 packet_set_alive_timeouts(int);
    +int	 packet_inc_alive_timeouts(void);
     int	 packet_set_maxsize(u_int);
    -#define  packet_get_maxsize() max_packet_size
    +u_int	 packet_get_maxsize(void);
     
     /* don't allow remaining bytes after the end of the message */
     #define packet_check_eom() \
    @@ -106,4 +109,10 @@ do { \
     int	 packet_need_rekeying(void);
     void	 packet_set_rekey_limit(u_int32_t);
     
    +void	 packet_backup_state(void);
    +void	 packet_restore_state(void);
    +
    +void	*packet_get_input(void);
    +void	*packet_get_output(void);
    +
     #endif				/* PACKET_H */
    diff --git a/crypto/openssh/readconf.c b/crypto/openssh/readconf.c
    index 8b810a1fc78d..8d3fc403e542 100644
    --- a/crypto/openssh/readconf.c
    +++ b/crypto/openssh/readconf.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: readconf.c,v 1.176 2009/02/12 03:00:56 djm Exp $ */
    +/* $OpenBSD: readconf.c,v 1.177 2009/06/27 09:35:06 andreas Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -133,7 +133,7 @@ typedef enum {
     	oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly,
     	oSendEnv, oControlPath, oControlMaster, oHashKnownHosts,
     	oTunnel, oTunnelDevice, oLocalCommand, oPermitLocalCommand,
    -	oVisualHostKey, oZeroKnowledgePasswordAuthentication,
    +	oVisualHostKey, oUseRoaming, oZeroKnowledgePasswordAuthentication,
     	oVersionAddendum,
     	oDeprecated, oUnsupported
     } OpCodes;
    @@ -232,6 +232,7 @@ static struct {
     	{ "localcommand", oLocalCommand },
     	{ "permitlocalcommand", oPermitLocalCommand },
     	{ "visualhostkey", oVisualHostKey },
    +	{ "useroaming", oUseRoaming },
     #ifdef JPAKE
     	{ "zeroknowledgepasswordauthentication",
     	    oZeroKnowledgePasswordAuthentication },
    @@ -931,6 +932,10 @@ parse_int:
     		intptr = &options->visual_host_key;
     		goto parse_flag;
     
    +	case oUseRoaming:
    +		intptr = &options->use_roaming;
    +		goto parse_flag;
    +
     	case oVersionAddendum:
     		ssh_version_set_addendum(strtok(s, "\n"));
     		do {
    @@ -1087,6 +1092,7 @@ initialize_options(Options * options)
     	options->tun_remote = -1;
     	options->local_command = NULL;
     	options->permit_local_command = -1;
    +	options->use_roaming = -1;
     	options->visual_host_key = -1;
     	options->zero_knowledge_password_authentication = -1;
     }
    @@ -1223,6 +1229,8 @@ fill_default_options(Options * options)
     		options->tun_remote = SSH_TUNID_ANY;
     	if (options->permit_local_command == -1)
     		options->permit_local_command = 0;
    +	if (options->use_roaming == -1)
    +		options->use_roaming = 1;
     	if (options->visual_host_key == -1)
     		options->visual_host_key = 0;
     	if (options->zero_knowledge_password_authentication == -1)
    diff --git a/crypto/openssh/readconf.h b/crypto/openssh/readconf.h
    index 8fb3a8528163..2ebfebe946a2 100644
    --- a/crypto/openssh/readconf.h
    +++ b/crypto/openssh/readconf.h
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: readconf.h,v 1.78 2009/02/12 03:00:56 djm Exp $ */
    +/* $OpenBSD: readconf.h,v 1.79 2009/06/27 09:35:06 andreas Exp $ */
     
     /*
      * Author: Tatu Ylonen 
    @@ -123,6 +123,8 @@ typedef struct {
     	int	permit_local_command;
     	int	visual_host_key;
     
    +	int	use_roaming;
    +
     }       Options;
     
     #define SSHCTL_MASTER_NO	0
    diff --git a/crypto/openssh/roaming.h b/crypto/openssh/roaming.h
    new file mode 100644
    index 000000000000..e517161f628c
    --- /dev/null
    +++ b/crypto/openssh/roaming.h
    @@ -0,0 +1,38 @@
    +/* $OpenBSD: roaming.h,v 1.4 2009/06/27 09:32:43 andreas Exp $ */
    +/*
    + * Copyright (c) 2004-2009 AppGate Network Security AB
    + *
    + * Permission to use, copy, modify, and distribute this software for any
    + * purpose with or without fee is hereby granted, provided that the above
    + * copyright notice and this permission notice appear in all copies.
    + *
    + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    + */
    +
    +#ifndef ROAMING_H
    +#define ROAMING_H
    +
    +#define DEFAULT_ROAMBUF 65536
    +
    +extern int resume_in_progress;
    +
    +int	get_snd_buf_size(void);
    +int	get_recv_buf_size(void);
    +void	add_recv_bytes(u_int64_t);
    +void	set_out_buffer_size(size_t);
    +ssize_t	roaming_write(int, const void *, size_t, int *);
    +ssize_t	roaming_read(int, void *, size_t, int *);
    +size_t	roaming_atomicio(ssize_t (*)(int, void *, size_t), int, void *, size_t);
    +u_int64_t	get_recv_bytes(void);
    +u_int64_t	get_sent_bytes(void);
    +void	roam_set_bytes(u_int64_t, u_int64_t);
    +void	resend_bytes(int, u_int64_t *);
    +int	resume_kex(void);
    +
    +#endif /* ROAMING */
    diff --git a/crypto/openssh/roaming_common.c b/crypto/openssh/roaming_common.c
    new file mode 100644
    index 000000000000..73db09d798eb
    --- /dev/null
    +++ b/crypto/openssh/roaming_common.c
    @@ -0,0 +1,201 @@
    +/* $OpenBSD: roaming_common.c,v 1.5 2009/06/27 09:32:43 andreas Exp $ */
    +/*
    + * Copyright (c) 2004-2009 AppGate Network Security AB
    + *
    + * Permission to use, copy, modify, and distribute this software for any
    + * purpose with or without fee is hereby granted, provided that the above
    + * copyright notice and this permission notice appear in all copies.
    + *
    + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    + */
    +
    +#include "includes.h"
    +
    +#include 
    +#include 
    +#include 
    +
    +#include 
    +#ifdef HAVE_INTTYPES_H
    +#include 
    +#endif
    +#include 
    +#include 
    +#include 
    +
    +#include "atomicio.h"
    +#include "log.h"
    +#include "packet.h"
    +#include "xmalloc.h"
    +#include "cipher.h"
    +#include "buffer.h"
    +#include "roaming.h"
    +
    +static size_t out_buf_size = 0;
    +static char *out_buf = NULL;
    +static size_t out_start;
    +static size_t out_last;
    +
    +static u_int64_t write_bytes = 0;
    +static u_int64_t read_bytes = 0;
    +
    +int roaming_enabled = 0;
    +int resume_in_progress = 0;
    +
    +int
    +get_snd_buf_size()
    +{
    +	int fd = packet_get_connection_out();
    +	int optval, optvallen;
    +
    +	optvallen = sizeof(optval);
    +	if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &optval, &optvallen) != 0)
    +		optval = DEFAULT_ROAMBUF;
    +	return optval;
    +}
    +
    +int
    +get_recv_buf_size()
    +{
    +	int fd = packet_get_connection_in();
    +	int optval, optvallen;
    +
    +	optvallen = sizeof(optval);
    +	if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &optval, &optvallen) != 0)
    +		optval = DEFAULT_ROAMBUF;
    +	return optval;
    +}
    +
    +void
    +set_out_buffer_size(size_t size)
    +{
    +	/*
    +	 * The buffer size can only be set once and the buffer will live
    +	 * as long as the session lives.
    +	 */
    +	if (out_buf == NULL) {
    +		out_buf_size = size;
    +		out_buf = xmalloc(size);
    +		out_start = 0;
    +		out_last = 0;
    +	}
    +}
    +
    +u_int64_t
    +get_recv_bytes(void)
    +{
    +	return read_bytes;
    +}
    +
    +void
    +add_recv_bytes(u_int64_t num)
    +{
    +	read_bytes += num;
    +}
    +
    +u_int64_t
    +get_sent_bytes(void)
    +{
    +	return write_bytes;
    +}
    +
    +void
    +roam_set_bytes(u_int64_t sent, u_int64_t recvd)
    +{
    +	read_bytes = recvd;
    +	write_bytes = sent;
    +}
    +
    +static void
    +buf_append(const char *buf, size_t count)
    +{
    +	if (count > out_buf_size) {
    +		buf += count - out_buf_size;
    +		count = out_buf_size;
    +	}
    +	if (count < out_buf_size - out_last) {
    +		memcpy(out_buf + out_last, buf, count);
    +		if (out_start > out_last)
    +			out_start += count;
    +		out_last += count;
    +	} else {
    +		/* data will wrap */
    +		size_t chunk = out_buf_size - out_last;
    +		memcpy(out_buf + out_last, buf, chunk);
    +		memcpy(out_buf, buf + chunk, count - chunk);
    +		out_last = count - chunk;
    +		out_start = out_last + 1;
    +	}
    +}
    +
    +ssize_t
    +roaming_write(int fd, const void *buf, size_t count, int *cont)
    +{
    +	ssize_t ret;
    +
    +	ret = write(fd, buf, count);
    +	if (ret > 0 && !resume_in_progress) {
    +		write_bytes += ret;
    +		if (out_buf_size > 0)
    +			buf_append(buf, ret);
    +	}
    +	debug3("Wrote %ld bytes for a total of %llu", (long)ret,
    +	    (unsigned long long)write_bytes);
    +	return ret;
    +}
    +
    +ssize_t
    +roaming_read(int fd, void *buf, size_t count, int *cont)
    +{
    +	ssize_t ret = read(fd, buf, count);
    +	if (ret > 0) {
    +		if (!resume_in_progress) {
    +			read_bytes += ret;
    +		}
    +	}
    +	return ret;
    +}
    +
    +size_t
    +roaming_atomicio(ssize_t(*f)(int, void*, size_t), int fd, void *buf,
    +    size_t count)
    +{
    +	size_t ret = atomicio(f, fd, buf, count);
    +
    +	if (f == vwrite && ret > 0 && !resume_in_progress) {
    +		write_bytes += ret;
    +	} else if (f == read && ret > 0 && !resume_in_progress) {
    +		read_bytes += ret;
    +	}
    +	return ret;
    +}
    +
    +void
    +resend_bytes(int fd, u_int64_t *offset)
    +{
    +	size_t available, needed;
    +
    +	if (out_start < out_last)
    +		available = out_last - out_start;
    +	else
    +		available = out_buf_size;
    +	needed = write_bytes - *offset;
    +	debug3("resend_bytes: resend %lu bytes from %llu",
    +	    (unsigned long)needed, (unsigned long long)*offset);
    +	if (needed > available)
    +		fatal("Needed to resend more data than in the cache");
    +	if (out_last < needed) {
    +		int chunkend = needed - out_last;
    +		atomicio(vwrite, fd, out_buf + out_buf_size - chunkend,
    +		    chunkend);
    +		atomicio(vwrite, fd, out_buf, out_last);
    +	} else {
    +		atomicio(vwrite, fd, out_buf + (out_last - needed), needed);
    +	}
    +}
    diff --git a/crypto/openssh/roaming_dummy.c b/crypto/openssh/roaming_dummy.c
    new file mode 100644
    index 000000000000..45c4008e7f9b
    --- /dev/null
    +++ b/crypto/openssh/roaming_dummy.c
    @@ -0,0 +1,61 @@
    +/* $OpenBSD: roaming_dummy.c,v 1.3 2009/06/21 09:04:03 dtucker Exp $ */
    +/*
    + * Copyright (c) 2004-2009 AppGate Network Security AB
    + *
    + * Permission to use, copy, modify, and distribute this software for any
    + * purpose with or without fee is hereby granted, provided that the above
    + * copyright notice and this permission notice appear in all copies.
    + *
    + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    + */
    +
    +/*
    + * This file is included in the client programs which should not
    + * support roaming.
    + */
    +
    +#include "includes.h"
    +
    +#include 
    +#include 
    +
    +#include "roaming.h"
    +
    +int resume_in_progress = 0;
    +
    +u_int64_t
    +get_recv_bytes(void)
    +{
    +	return 0;
    +}
    +
    +ssize_t
    +roaming_write(int fd, const void *buf, size_t count, int *cont)
    +{
    +	return write(fd, buf, count);
    +}
    +
    +ssize_t
    +roaming_read(int fd, void *buf, size_t count, int *cont)
    +{
    +	if (cont)
    +		*cont = 0;
    +	return read(fd, buf, count);
    +}
    +
    +void
    +add_recv_bytes(u_int64_t num)
    +{
    +}
    +
    +int
    +resume_kex(void)
    +{
    +	return 1;
    +}
    diff --git a/crypto/openssh/schnorr.c b/crypto/openssh/schnorr.c
    index 61ba68a73b72..daeec0627a38 100644
    --- a/crypto/openssh/schnorr.c
    +++ b/crypto/openssh/schnorr.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: schnorr.c,v 1.2 2009/02/18 04:31:21 djm Exp $ */
    +/* $OpenBSD: schnorr.c,v 1.3 2009/03/05 07:18:19 djm Exp $ */
     /* $FreeBSD$ */
     /*
      * Copyright (c) 2008 Damien Miller.  All rights reserved.
    @@ -41,38 +41,36 @@
     #include "buffer.h"
     #include "log.h"
     
    -#include "jpake.h"
    +#include "schnorr.h"
     
     #ifdef JPAKE
     
    +#include "openbsd-compat/openssl-compat.h"
    +
     /* #define SCHNORR_DEBUG */		/* Privacy-violating debugging */
     /* #define SCHNORR_MAIN */		/* Include main() selftest */
     
    -/* XXX */
    -/* Parametise signature hash? (sha256, sha1, etc.) */
    -/* Signature format - include type name, hash type, group params? */
    -
     #ifndef SCHNORR_DEBUG
     # define SCHNORR_DEBUG_BN(a)
     # define SCHNORR_DEBUG_BUF(a)
     #else
    -# define SCHNORR_DEBUG_BN(a)	jpake_debug3_bn a
    -# define SCHNORR_DEBUG_BUF(a)	jpake_debug3_buf a
    +# define SCHNORR_DEBUG_BN(a)	debug3_bn a
    +# define SCHNORR_DEBUG_BUF(a)	debug3_buf a
     #endif /* SCHNORR_DEBUG */
     
     /*
      * Calculate hash component of Schnorr signature H(g || g^v || g^x || id)
    - * using SHA1. Returns signature as bignum or NULL on error.
    + * using the hash function defined by "evp_md". Returns signature as
    + * bignum or NULL on error.
      */
     static BIGNUM *
     schnorr_hash(const BIGNUM *p, const BIGNUM *q, const BIGNUM *g,
    -    const BIGNUM *g_v, const BIGNUM *g_x,
    +    const EVP_MD *evp_md, const BIGNUM *g_v, const BIGNUM *g_x,
         const u_char *id, u_int idlen)
     {
     	u_char *digest;
     	u_int digest_len;
     	BIGNUM *h;
    -	EVP_MD_CTX evp_md_ctx;
     	Buffer b;
     	int success = -1;
     
    @@ -82,7 +80,6 @@ schnorr_hash(const BIGNUM *p, const BIGNUM *q, const BIGNUM *g,
     	}
     
     	buffer_init(&b);
    -	EVP_MD_CTX_init(&evp_md_ctx);
     
     	/* h = H(g || p || q || g^v || g^x || id) */
     	buffer_put_bignum2(&b, g);
    @@ -94,7 +91,7 @@ schnorr_hash(const BIGNUM *p, const BIGNUM *q, const BIGNUM *g,
     
     	SCHNORR_DEBUG_BUF((buffer_ptr(&b), buffer_len(&b),
     	    "%s: hashblob", __func__));
    -	if (hash_buffer(buffer_ptr(&b), buffer_len(&b), EVP_sha256(),
    +	if (hash_buffer(buffer_ptr(&b), buffer_len(&b), evp_md,
     	    &digest, &digest_len) != 0) {
     		error("%s: hash_buffer", __func__);
     		goto out;
    @@ -107,7 +104,6 @@ schnorr_hash(const BIGNUM *p, const BIGNUM *q, const BIGNUM *g,
     	SCHNORR_DEBUG_BN((h, "%s: h = ", __func__));
      out:
     	buffer_free(&b);
    -	EVP_MD_CTX_cleanup(&evp_md_ctx);
     	bzero(digest, digest_len);
     	xfree(digest);
     	digest_len = 0;
    @@ -120,18 +116,20 @@ schnorr_hash(const BIGNUM *p, const BIGNUM *q, const BIGNUM *g,
     /*
      * Generate Schnorr signature to prove knowledge of private value 'x' used
      * in public exponent g^x, under group defined by 'grp_p', 'grp_q' and 'grp_g'
    + * using the hash function "evp_md".
      * 'idlen' bytes from 'id' will be included in the signature hash as an anti-
      * replay salt.
    - * On success, 0 is returned and *siglen bytes of signature are returned in
    - * *sig (caller to free). Returns -1 on failure.
    + * 
    + * On success, 0 is returned. The signature values are returned as *e_p
    + * (g^v mod p) and *r_p (v - xh mod q). The caller must free these values.
    + * On failure, -1 is returned.
      */
     int
     schnorr_sign(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
    -    const BIGNUM *x, const BIGNUM *g_x, const u_char *id, u_int idlen,
    -    u_char **sig, u_int *siglen)
    +    const EVP_MD *evp_md, const BIGNUM *x, const BIGNUM *g_x,
    +    const u_char *id, u_int idlen, BIGNUM **r_p, BIGNUM **e_p)
     {
     	int success = -1;
    -	Buffer b;
     	BIGNUM *h, *tmp, *v, *g_v, *r;
     	BN_CTX *bn_ctx;
     
    @@ -174,7 +172,7 @@ schnorr_sign(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
     	SCHNORR_DEBUG_BN((g_v, "%s: g_v = ", __func__));
     
     	/* h = H(g || g^v || g^x || id) */
    -	if ((h = schnorr_hash(grp_p, grp_q, grp_g, g_v, g_x,
    +	if ((h = schnorr_hash(grp_p, grp_q, grp_g, evp_md, g_v, g_x,
     	    id, idlen)) == NULL) {
     		error("%s: schnorr_hash failed", __func__);
     		goto out;
    @@ -189,19 +187,12 @@ schnorr_sign(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
     		error("%s: BN_mod_mul (r = v - tmp)", __func__);
     		goto out;
     	}
    +	SCHNORR_DEBUG_BN((g_v, "%s: e = ", __func__));
     	SCHNORR_DEBUG_BN((r, "%s: r = ", __func__));
     
    -	/* Signature is (g_v, r) */
    -	buffer_init(&b);
    -	/* XXX sigtype-hash as string? */
    -	buffer_put_bignum2(&b, g_v);
    -	buffer_put_bignum2(&b, r);
    -	*siglen = buffer_len(&b);
    -	*sig = xmalloc(*siglen);
    -	memcpy(*sig, buffer_ptr(&b), *siglen);
    -	SCHNORR_DEBUG_BUF((buffer_ptr(&b), buffer_len(&b),
    -	    "%s: sigblob", __func__));
    -	buffer_free(&b);
    +	*e_p = g_v;
    +	*r_p = r;
    +
     	success = 0;
      out:
     	BN_CTX_free(bn_ctx);
    @@ -209,29 +200,65 @@ schnorr_sign(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
     		BN_clear_free(h);
     	if (v != NULL)
     		BN_clear_free(v);
    -	BN_clear_free(r);
    -	BN_clear_free(g_v);
     	BN_clear_free(tmp);
     
     	return success;
     }
     
     /*
    - * Verify Schnorr signature 'sig' of length 'siglen' against public exponent
    - * g_x (g^x) under group defined by 'grp_p', 'grp_q' and 'grp_g'.
    + * Generate Schnorr signature to prove knowledge of private value 'x' used
    + * in public exponent g^x, under group defined by 'grp_p', 'grp_q' and 'grp_g'
    + * using a SHA256 hash.
    + * 'idlen' bytes from 'id' will be included in the signature hash as an anti-
    + * replay salt.
    + * On success, 0 is returned and *siglen bytes of signature are returned in
    + * *sig (caller to free). Returns -1 on failure.
    + */
    +int
    +schnorr_sign_buf(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
    +    const BIGNUM *x, const BIGNUM *g_x, const u_char *id, u_int idlen,
    +    u_char **sig, u_int *siglen)
    +{
    +	Buffer b;
    +	BIGNUM *r, *e;
    +
    +	if (schnorr_sign(grp_p, grp_q, grp_g, EVP_sha256(),
    +	    x, g_x, id, idlen, &r, &e) != 0)
    +		return -1;
    +
    +	/* Signature is (e, r) */
    +	buffer_init(&b);
    +	/* XXX sigtype-hash as string? */
    +	buffer_put_bignum2(&b, e);
    +	buffer_put_bignum2(&b, r);
    +	*siglen = buffer_len(&b);
    +	*sig = xmalloc(*siglen);
    +	memcpy(*sig, buffer_ptr(&b), *siglen);
    +	SCHNORR_DEBUG_BUF((buffer_ptr(&b), buffer_len(&b),
    +	    "%s: sigblob", __func__));
    +	buffer_free(&b);
    +
    +	BN_clear_free(r);
    +	BN_clear_free(e);
    +
    +	return 0;
    +}
    +
    +/*
    + * Verify Schnorr signature { r (v - xh mod q), e (g^v mod p) } against
    + * public exponent g_x (g^x) under group defined by 'grp_p', 'grp_q' and
    + * 'grp_g' using hash "evp_md".
      * Signature hash will be salted with 'idlen' bytes from 'id'.
      * Returns -1 on failure, 0 on incorrect signature or 1 on matching signature.
      */
     int
     schnorr_verify(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
    -    const BIGNUM *g_x, const u_char *id, u_int idlen,
    -    const u_char *sig, u_int siglen)
    +    const EVP_MD *evp_md, const BIGNUM *g_x, const u_char *id, u_int idlen,
    +    const BIGNUM *r, const BIGNUM *e)
     {
     	int success = -1;
    -	Buffer b;
    -	BIGNUM *g_v, *h, *r, *g_xh, *g_r, *expected;
    +	BIGNUM *h, *g_xh, *g_r, *expected;
     	BN_CTX *bn_ctx;
    -	u_int rlen;
     
     	SCHNORR_DEBUG_BN((g_x, "%s: g_x = ", __func__));
     
    @@ -241,39 +268,23 @@ schnorr_verify(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
     		return -1;
     	}
     
    -	g_v = h = r = g_xh = g_r = expected = NULL;
    +	h = g_xh = g_r = expected = NULL;
     	if ((bn_ctx = BN_CTX_new()) == NULL) {
     		error("%s: BN_CTX_new", __func__);
     		goto out;
     	}
    -	if ((g_v = BN_new()) == NULL ||
    -	    (r = BN_new()) == NULL ||
    -	    (g_xh = BN_new()) == NULL ||
    +	if ((g_xh = BN_new()) == NULL ||
     	    (g_r = BN_new()) == NULL ||
     	    (expected = BN_new()) == NULL) {
     		error("%s: BN_new", __func__);
     		goto out;
     	}
     
    -	/* Extract g^v and r from signature blob */
    -	buffer_init(&b);
    -	buffer_append(&b, sig, siglen);
    -	SCHNORR_DEBUG_BUF((buffer_ptr(&b), buffer_len(&b),
    -	    "%s: sigblob", __func__));
    -	buffer_get_bignum2(&b, g_v);
    -	buffer_get_bignum2(&b, r);
    -	rlen = buffer_len(&b);
    -	buffer_free(&b);
    -	if (rlen != 0) {
    -		error("%s: remaining bytes in signature %d", __func__, rlen);
    -		goto out;
    -	}
    -	buffer_free(&b);
    -	SCHNORR_DEBUG_BN((g_v, "%s: g_v = ", __func__));
    +	SCHNORR_DEBUG_BN((e, "%s: e = ", __func__));
     	SCHNORR_DEBUG_BN((r, "%s: r = ", __func__));
     
     	/* h = H(g || g^v || g^x || id) */
    -	if ((h = schnorr_hash(grp_p, grp_q, grp_g, g_v, g_x,
    +	if ((h = schnorr_hash(grp_p, grp_q, grp_g, evp_md, e, g_x,
     	    id, idlen)) == NULL) {
     		error("%s: schnorr_hash failed", __func__);
     		goto out;
    @@ -300,20 +311,248 @@ schnorr_verify(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
     	}
     	SCHNORR_DEBUG_BN((expected, "%s: expected = ", __func__));
     
    -	/* Check g_v == expected */
    -	success = BN_cmp(expected, g_v) == 0;
    +	/* Check e == expected */
    +	success = BN_cmp(expected, e) == 0;
      out:
     	BN_CTX_free(bn_ctx);
     	if (h != NULL)
     		BN_clear_free(h);
    -	BN_clear_free(g_v);
    -	BN_clear_free(r);
     	BN_clear_free(g_xh);
     	BN_clear_free(g_r);
     	BN_clear_free(expected);
     	return success;
     }
     
    +/*
    + * Verify Schnorr signature 'sig' of length 'siglen' against public exponent
    + * g_x (g^x) under group defined by 'grp_p', 'grp_q' and 'grp_g' using a
    + * SHA256 hash.
    + * Signature hash will be salted with 'idlen' bytes from 'id'.
    + * Returns -1 on failure, 0 on incorrect signature or 1 on matching signature.
    + */
    +int
    +schnorr_verify_buf(const BIGNUM *grp_p, const BIGNUM *grp_q,
    +    const BIGNUM *grp_g,
    +    const BIGNUM *g_x, const u_char *id, u_int idlen,
    +    const u_char *sig, u_int siglen)
    +{
    +	Buffer b;
    +	int ret = -1;
    +	u_int rlen;
    +	BIGNUM *r, *e;
    +
    +	e = r = NULL;
    +	if ((e = BN_new()) == NULL ||
    +	    (r = BN_new()) == NULL) {
    +		error("%s: BN_new", __func__);
    +		goto out;
    +	}
    +
    +	/* Extract g^v and r from signature blob */
    +	buffer_init(&b);
    +	buffer_append(&b, sig, siglen);
    +	SCHNORR_DEBUG_BUF((buffer_ptr(&b), buffer_len(&b),
    +	    "%s: sigblob", __func__));
    +	buffer_get_bignum2(&b, e);
    +	buffer_get_bignum2(&b, r);
    +	rlen = buffer_len(&b);
    +	buffer_free(&b);
    +	if (rlen != 0) {
    +		error("%s: remaining bytes in signature %d", __func__, rlen);
    +		goto out;
    +	}
    +
    +	ret = schnorr_verify(grp_p, grp_q, grp_g, EVP_sha256(),
    +	    g_x, id, idlen, r, e);
    + out:
    +	BN_clear_free(e);
    +	BN_clear_free(r);
    +
    +	return ret;
    +}
    +
    +/* Helper functions */
    +
    +/*
    + * Generate uniformly distributed random number in range (1, high).
    + * Return number on success, NULL on failure.
    + */
    +BIGNUM *
    +bn_rand_range_gt_one(const BIGNUM *high)
    +{
    +	BIGNUM *r, *tmp;
    +	int success = -1;
    +
    +	if ((tmp = BN_new()) == NULL) {
    +		error("%s: BN_new", __func__);
    +		return NULL;
    +	}
    +	if ((r = BN_new()) == NULL) {
    +		error("%s: BN_new failed", __func__);
    +		goto out;
    +	}
    +	if (BN_set_word(tmp, 2) != 1) {
    +		error("%s: BN_set_word(tmp, 2)", __func__);
    +		goto out;
    +	}
    +	if (BN_sub(tmp, high, tmp) == -1) {
    +		error("%s: BN_sub failed (tmp = high - 2)", __func__);
    +		goto out;
    +	}
    +	if (BN_rand_range(r, tmp) == -1) {
    +		error("%s: BN_rand_range failed", __func__);
    +		goto out;
    +	}
    +	if (BN_set_word(tmp, 2) != 1) {
    +		error("%s: BN_set_word(tmp, 2)", __func__);
    +		goto out;
    +	}
    +	if (BN_add(r, r, tmp) == -1) {
    +		error("%s: BN_add failed (r = r + 2)", __func__);
    +		goto out;
    +	}
    +	success = 0;
    + out:
    +	BN_clear_free(tmp);
    +	if (success == 0)
    +		return r;
    +	BN_clear_free(r);
    +	return NULL;
    +}
    +
    +/*
    + * Hash contents of buffer 'b' with hash 'md'. Returns 0 on success,
    + * with digest via 'digestp' (caller to free) and length via 'lenp'.
    + * Returns -1 on failure.
    + */
    +int
    +hash_buffer(const u_char *buf, u_int len, const EVP_MD *md,
    +    u_char **digestp, u_int *lenp)
    +{
    +	u_char digest[EVP_MAX_MD_SIZE];
    +	u_int digest_len;
    +	EVP_MD_CTX evp_md_ctx;
    +	int success = -1;
    +
    +	EVP_MD_CTX_init(&evp_md_ctx);
    +
    +	if (EVP_DigestInit_ex(&evp_md_ctx, md, NULL) != 1) {
    +		error("%s: EVP_DigestInit_ex", __func__);
    +		goto out;
    +	}
    +	if (EVP_DigestUpdate(&evp_md_ctx, buf, len) != 1) {
    +		error("%s: EVP_DigestUpdate", __func__);
    +		goto out;
    +	}
    +	if (EVP_DigestFinal_ex(&evp_md_ctx, digest, &digest_len) != 1) {
    +		error("%s: EVP_DigestFinal_ex", __func__);
    +		goto out;
    +	}
    +	*digestp = xmalloc(digest_len);
    +	*lenp = digest_len;
    +	memcpy(*digestp, digest, *lenp);
    +	success = 0;
    + out:
    +	EVP_MD_CTX_cleanup(&evp_md_ctx);
    +	bzero(digest, sizeof(digest));
    +	digest_len = 0;
    +	return success;
    +}
    +
    +/* print formatted string followed by bignum */
    +void
    +debug3_bn(const BIGNUM *n, const char *fmt, ...)
    +{
    +	char *out, *h;
    +	va_list args;
    +
    +	out = NULL;
    +	va_start(args, fmt);
    +	vasprintf(&out, fmt, args);
    +	va_end(args);
    +	if (out == NULL)
    +		fatal("%s: vasprintf failed", __func__);
    +
    +	if (n == NULL)
    +		debug3("%s(null)", out);
    +	else {
    +		h = BN_bn2hex(n);
    +		debug3("%s0x%s", out, h);
    +		free(h);
    +	}
    +	free(out);
    +}
    +
    +/* print formatted string followed by buffer contents in hex */
    +void
    +debug3_buf(const u_char *buf, u_int len, const char *fmt, ...)
    +{
    +	char *out, h[65];
    +	u_int i, j;
    +	va_list args;
    +
    +	out = NULL;
    +	va_start(args, fmt);
    +	vasprintf(&out, fmt, args);
    +	va_end(args);
    +	if (out == NULL)
    +		fatal("%s: vasprintf failed", __func__);
    +
    +	debug3("%s length %u%s", out, len, buf == NULL ? " (null)" : "");
    +	free(out);
    +	if (buf == NULL)
    +		return;
    +
    +	*h = '\0';
    +	for (i = j = 0; i < len; i++) {
    +		snprintf(h + j, sizeof(h) - j, "%02x", buf[i]);
    +		j += 2;
    +		if (j >= sizeof(h) - 1 || i == len - 1) {
    +			debug3("    %s", h);
    +			*h = '\0';
    +			j = 0;
    +		}
    +	}
    +}
    +
    +/*
    + * Construct a MODP group from hex strings p (which must be a safe
    + * prime) and g, automatically calculating subgroup q as (p / 2)
    + */
    +struct modp_group *
    +modp_group_from_g_and_safe_p(const char *grp_g, const char *grp_p)
    +{
    +	struct modp_group *ret;
    +
    +	ret = xmalloc(sizeof(*ret));
    +	ret->p = ret->q = ret->g = NULL;
    +	if (BN_hex2bn(&ret->p, grp_p) == 0 ||
    +	    BN_hex2bn(&ret->g, grp_g) == 0)
    +		fatal("%s: BN_hex2bn", __func__);
    +	/* Subgroup order is p/2 (p is a safe prime) */
    +	if ((ret->q = BN_new()) == NULL)
    +		fatal("%s: BN_new", __func__);
    +	if (BN_rshift1(ret->q, ret->p) != 1)
    +		fatal("%s: BN_rshift1", __func__);
    +
    +	return ret;
    +}
    +
    +void
    +modp_group_free(struct modp_group *grp)
    +{
    +	if (grp->g != NULL)
    +		BN_clear_free(grp->g);
    +	if (grp->p != NULL)
    +		BN_clear_free(grp->p);
    +	if (grp->q != NULL)
    +		BN_clear_free(grp->q);
    +	bzero(grp, sizeof(*grp));
    +	xfree(grp);
    +}
    +
    +/* main() function for self-test */
    +
     #ifdef SCHNORR_MAIN
     static void
     schnorr_selftest_one(const BIGNUM *grp_p, const BIGNUM *grp_q,
    @@ -331,16 +570,17 @@ schnorr_selftest_one(const BIGNUM *grp_p, const BIGNUM *grp_q,
     
     	if (BN_mod_exp(g_x, grp_g, x, grp_p, bn_ctx) == -1)
     		fatal("%s: g_x", __func__);
    -	if (schnorr_sign(grp_p, grp_q, grp_g, x, g_x, "junk", 4, &sig, &siglen))
    +	if (schnorr_sign_buf(grp_p, grp_q, grp_g, x, g_x, "junk", 4,
    +	    &sig, &siglen))
     		fatal("%s: schnorr_sign", __func__);
    -	if (schnorr_verify(grp_p, grp_q, grp_g, g_x, "junk", 4,
    +	if (schnorr_verify_buf(grp_p, grp_q, grp_g, g_x, "junk", 4,
     	    sig, siglen) != 1)
     		fatal("%s: verify fail", __func__);
    -	if (schnorr_verify(grp_p, grp_q, grp_g, g_x, "JUNK", 4,
    +	if (schnorr_verify_buf(grp_p, grp_q, grp_g, g_x, "JUNK", 4,
     	    sig, siglen) != 0)
     		fatal("%s: verify should have failed (bad ID)", __func__);
     	sig[4] ^= 1;
    -	if (schnorr_verify(grp_p, grp_q, grp_g, g_x, "junk", 4,
    +	if (schnorr_verify_buf(grp_p, grp_q, grp_g, g_x, "junk", 4,
     	    sig, siglen) != 0)
     		fatal("%s: verify should have failed (bit error)", __func__);
     	xfree(sig);
    @@ -352,7 +592,7 @@ static void
     schnorr_selftest(void)
     {
     	BIGNUM *x;
    -	struct jpake_group *grp;
    +	struct modp_group *grp;
     	u_int i;
     	char *hh;
     
    diff --git a/crypto/openssh/schnorr.h b/crypto/openssh/schnorr.h
    new file mode 100644
    index 000000000000..9730b47cef31
    --- /dev/null
    +++ b/crypto/openssh/schnorr.h
    @@ -0,0 +1,60 @@
    +/* $OpenBSD: schnorr.h,v 1.1 2009/03/05 07:18:19 djm Exp $ */
    +/*
    + * Copyright (c) 2009 Damien Miller.  All rights reserved.
    + *
    + * Permission to use, copy, modify, and distribute this software for any
    + * purpose with or without fee is hereby granted, provided that the above
    + * copyright notice and this permission notice appear in all copies.
    + *
    + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
    + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    + */
    +
    +#ifndef SCHNORR_H
    +#define SCHNORR_H
    +
    +#include 
    +
    +#include 
    +
    +struct modp_group {
    +	BIGNUM *p, *q, *g;
    +};
    +
    +BIGNUM *bn_rand_range_gt_one(const BIGNUM *high);
    +int hash_buffer(const u_char *, u_int, const EVP_MD *, u_char **, u_int *);
    +void debug3_bn(const BIGNUM *, const char *, ...)
    +    __attribute__((__nonnull__ (2)))
    +    __attribute__((format(printf, 2, 3)));
    +void debug3_buf(const u_char *, u_int, const char *, ...)
    +    __attribute__((__nonnull__ (3)))
    +    __attribute__((format(printf, 3, 4)));
    +struct modp_group *modp_group_from_g_and_safe_p(const char *, const char *);
    +void modp_group_free(struct modp_group *);
    +
    +/* Signature and verification functions */
    +int
    +schnorr_sign(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
    +    const EVP_MD *evp_md, const BIGNUM *x, const BIGNUM *g_x,
    +    const u_char *id, u_int idlen, BIGNUM **r_p, BIGNUM **e_p);
    +int
    +schnorr_sign_buf(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
    +    const BIGNUM *x, const BIGNUM *g_x, const u_char *id, u_int idlen,
    +    u_char **sig, u_int *siglen);
    +int
    +schnorr_verify(const BIGNUM *grp_p, const BIGNUM *grp_q, const BIGNUM *grp_g,
    +    const EVP_MD *evp_md, const BIGNUM *g_x, const u_char *id, u_int idlen,
    +    const BIGNUM *r, const BIGNUM *e);
    +int
    +schnorr_verify_buf(const BIGNUM *grp_p, const BIGNUM *grp_q,
    +    const BIGNUM *grp_g,
    +    const BIGNUM *g_x, const u_char *id, u_int idlen,
    +    const u_char *sig, u_int siglen);
    +
    +#endif /* JPAKE_H */
    +
    diff --git a/crypto/openssh/servconf.c b/crypto/openssh/servconf.c
    index 4744688c49bd..ad25fefa0515 100644
    --- a/crypto/openssh/servconf.c
    +++ b/crypto/openssh/servconf.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: servconf.c,v 1.194 2009/01/22 10:02:34 djm Exp $ */
    +/* $OpenBSD: servconf.c,v 1.195 2009/04/14 21:10:54 jj Exp $ */
     /*
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
      *                    All rights reserved
    @@ -345,7 +345,7 @@ static struct {
     	{ "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly, SSHCFG_GLOBAL },
     	{ "rsaauthentication", sRSAAuthentication, SSHCFG_ALL },
     	{ "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL },
    -	{ "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL },	/* alias */
    +	{ "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL }, /* alias */
     #ifdef KRB5
     	{ "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL },
     	{ "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL },
    @@ -419,10 +419,10 @@ static struct {
     	{ "clientalivecountmax", sClientAliveCountMax, SSHCFG_GLOBAL },
     	{ "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_GLOBAL },
     	{ "authorizedkeysfile2", sAuthorizedKeysFile2, SSHCFG_GLOBAL },
    -	{ "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL },
    +	{ "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL},
     	{ "acceptenv", sAcceptEnv, SSHCFG_GLOBAL },
     	{ "permittunnel", sPermitTunnel, SSHCFG_GLOBAL },
    - 	{ "match", sMatch, SSHCFG_ALL },
    +	{ "match", sMatch, SSHCFG_ALL },
     	{ "permitopen", sPermitOpen, SSHCFG_ALL },
     	{ "forcecommand", sForceCommand, SSHCFG_ALL },
     	{ "chrootdirectory", sChrootDirectory, SSHCFG_ALL },
    @@ -1386,7 +1386,7 @@ parse_server_match_config(ServerOptions *options, const char *user,
     /*
      * Copy any supported values that are set.
      *
    - * If the preauth flag is set, we do not bother copying the the string or
    + * If the preauth flag is set, we do not bother copying the string or
      * array values that are not used pre-authentication, because any that we
      * do use must be explictly sent in mm_getpwnamallow().
      */
    diff --git a/crypto/openssh/serverloop.c b/crypto/openssh/serverloop.c
    index 81cafe6ad553..8be01c5c37c4 100644
    --- a/crypto/openssh/serverloop.c
    +++ b/crypto/openssh/serverloop.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: serverloop.c,v 1.157 2009/02/12 03:16:01 djm Exp $ */
    +/* $OpenBSD: serverloop.c,v 1.159 2009/05/28 16:50:16 andreas Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -78,6 +78,7 @@
     #include "auth-options.h"
     #include "serverloop.h"
     #include "misc.h"
    +#include "roaming.h"
     
     extern ServerOptions options;
     
    @@ -249,7 +250,7 @@ client_alive_check(void)
     	int channel_id;
     
     	/* timeout, check to see how many we have had */
    -	if (++keep_alive_timeouts > options.client_alive_count_max) {
    +	if (packet_inc_alive_timeouts() > options.client_alive_count_max) {
     		logit("Timeout, client not responding.");
     		cleanup_exit(255);
     	}
    @@ -391,8 +392,11 @@ process_input(fd_set *readset)
     
     	/* Read and buffer any input data from the client. */
     	if (FD_ISSET(connection_in, readset)) {
    -		len = read(connection_in, buf, sizeof(buf));
    +		int cont = 0;
    +		len = roaming_read(connection_in, buf, sizeof(buf), &cont);
     		if (len == 0) {
    +			if (cont)
    +				return;
     			verbose("Connection closed by %.100s",
     			    get_remote_ipaddr());
     			connection_closed = 1;
    @@ -890,7 +894,7 @@ server_input_keep_alive(int type, u_int32_t seq, void *ctxt)
     	 * even if this was generated by something other than
     	 * the bogus CHANNEL_REQUEST we send for keepalives.
     	 */
    -	keep_alive_timeouts = 0;
    +	packet_set_alive_timeouts(0);
     }
     
     static void
    @@ -1120,7 +1124,8 @@ server_input_global_request(int type, u_int32_t seq, void *ctxt)
     		    no_port_forwarding_flag ||
     		    (!want_reply && listen_port == 0)
     #ifndef NO_IPPORT_RESERVED_CONCEPT
    -		    || (listen_port < IPPORT_RESERVED && pw->pw_uid != 0)
    +		    || (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    +                    pw->pw_uid != 0)
     #endif
     		    ) {
     			success = 0;
    diff --git a/crypto/openssh/session.c b/crypto/openssh/session.c
    index 16cc4aef3088..51cca49c2da2 100644
    --- a/crypto/openssh/session.c
    +++ b/crypto/openssh/session.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: session.c,v 1.245 2009/01/22 09:46:01 djm Exp $ */
    +/* $OpenBSD: session.c,v 1.246 2009/04/17 19:23:06 stevesk Exp $ */
     /*
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
      *                    All rights reserved
    @@ -572,8 +572,7 @@ do_exec_no_pty(Session *s, const char *command)
     	signal(WJSIGNAL, cray_job_termination_handler);
     #endif /* _UNICOS */
     #ifdef HAVE_CYGWIN
    -	if (is_winnt)
    -		cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
    +	cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
     #endif
     
     	s->pid = pid;
    @@ -717,8 +716,8 @@ do_exec_pty(Session *s, const char *command)
     		 * Do common processing for the child, such as execing
     		 * the command.
     		 */
    - 		do_child(s, command);
    - 		/* NOTREACHED */
    +		do_child(s, command);
    +		/* NOTREACHED */
     	default:
     		break;
     	}
    @@ -727,8 +726,7 @@ do_exec_pty(Session *s, const char *command)
     	signal(WJSIGNAL, cray_job_termination_handler);
     #endif /* _UNICOS */
     #ifdef HAVE_CYGWIN
    -	if (is_winnt)
    -		cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
    +	cygwin_set_impersonation_token(INVALID_HANDLE_VALUE);
     #endif
     
     	s->pid = pid;
    @@ -848,7 +846,7 @@ do_login(Session *s, const char *command)
     	fromlen = sizeof(from);
     	if (packet_connection_is_on_socket()) {
     		if (getpeername(packet_get_connection_in(),
    -		    (struct sockaddr *) & from, &fromlen) < 0) {
    +		    (struct sockaddr *)&from, &fromlen) < 0) {
     			debug("getpeername: %.100s", strerror(errno));
     			cleanup_exit(255);
     		}
    @@ -1135,7 +1133,7 @@ do_setup_env(Session *s, const char *shell)
     	u_int i, envsize;
     	char **env, *laddr;
     	struct passwd *pw = s->pw;
    -#ifndef HAVE_LOGIN_CAP
    +#if !defined (HAVE_LOGIN_CAP) && !defined (HAVE_CYGWIN)
     	char *path = NULL;
     #else
     	extern char **environ;
    @@ -1498,11 +1496,6 @@ do_setusercontext(struct passwd *pw)
     	if (getuid() == 0 || geteuid() == 0)
     #endif /* HAVE_CYGWIN */
     	{
    -
    -#ifdef HAVE_SETPCRED
    -		if (setpcred(pw->pw_name, (char **)NULL) == -1)
    -			fatal("Failed to set process credentials");
    -#endif /* HAVE_SETPCRED */
     #ifdef HAVE_LOGIN_CAP
     # ifdef __bsdi__
     		setpgid(0, 0);
    @@ -1570,6 +1563,10 @@ do_setusercontext(struct passwd *pw)
     			free(chroot_path);
     		}
     
    +#ifdef HAVE_SETPCRED
    +		if (setpcred(pw->pw_name, (char **)NULL) == -1)
    +			fatal("Failed to set process credentials");
    +#endif /* HAVE_SETPCRED */
     #ifdef HAVE_LOGIN_CAP
     		if (setusercontext(lc, pw, pw->pw_uid, LOGIN_SETUSER) < 0) {
     			perror("unable to set user context (setuser)");
    @@ -1581,9 +1578,6 @@ do_setusercontext(struct passwd *pw)
     #endif
     	}
     
    -#ifdef HAVE_CYGWIN
    -	if (is_winnt)
    -#endif
     	if (getuid() != pw->pw_uid || geteuid() != pw->pw_uid)
     		fatal("Failed to set uids to %u.", (u_int) pw->pw_uid);
     
    @@ -1824,7 +1818,7 @@ do_child(Session *s, const char *command)
     		int i;
     		char *p, *args;
     
    -		setproctitle("%s@internal-sftp-server", s->pw->pw_name);
    +		setproctitle("%s@%s", s->pw->pw_name, INTERNAL_SFTP_NAME);
     		args = xstrdup(command ? command : "sftp-server");
     		for (i = 0, (p = strtok(args, " ")); p; (p = strtok(NULL, " ")))
     			if (i < ARGV_MAX - 1)
    diff --git a/crypto/openssh/sftp-client.c b/crypto/openssh/sftp-client.c
    index 5e39aa7d21bd..0990b7912f65 100644
    --- a/crypto/openssh/sftp-client.c
    +++ b/crypto/openssh/sftp-client.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: sftp-client.c,v 1.86 2008/06/26 06:10:09 djm Exp $ */
    +/* $OpenBSD: sftp-client.c,v 1.87 2009/06/22 05:39:28 dtucker Exp $ */
     /*
      * Copyright (c) 2001-2004 Damien Miller 
      *
    diff --git a/crypto/openssh/sftp-server.8 b/crypto/openssh/sftp-server.8
    index 03e58cb893af..0201d4b29c53 100644
    --- a/crypto/openssh/sftp-server.8
    +++ b/crypto/openssh/sftp-server.8
    @@ -1,4 +1,5 @@
    -.\" $OpenBSD: sftp-server.8,v 1.14 2008/07/18 22:51:01 jmc Exp $
    +.\" $OpenBSD: sftp-server.8,v 1.15 2009/03/26 08:38:39 sobrado Exp $
    +.\" $FreeBSD$
     .\"
     .\" Copyright (c) 2000 Markus Friedl.  All rights reserved.
     .\"
    @@ -22,7 +23,7 @@
     .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     .\"
    -.Dd July 18 2008
    +.Dd March 26 2009
     .Dt SFTP-SERVER 8
     .Os
     .Sh NAME
    @@ -79,7 +80,7 @@ must be able to access
     .Pa /dev/log .
     Use of
     .Nm
    -in a chroot configuation therefore requires that
    +in a chroot configuration therefore requires that
     .Xr syslogd 8
     establish a logging socket inside the chroot directory.
     .Sh SEE ALSO
    diff --git a/crypto/openssh/sftp-server.c b/crypto/openssh/sftp-server.c
    index 24c4ff717227..d984e60493b3 100644
    --- a/crypto/openssh/sftp-server.c
    +++ b/crypto/openssh/sftp-server.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: sftp-server.c,v 1.84 2008/06/26 06:10:09 djm Exp $ */
    +/* $OpenBSD: sftp-server.c,v 1.85 2009/04/14 16:33:42 stevesk Exp $ */
     /*
      * Copyright (c) 2000-2004 Markus Friedl.  All rights reserved.
      *
    @@ -1041,7 +1041,7 @@ process_rename(void)
     	else if (S_ISREG(sb.st_mode)) {
     		/* Race-free rename of regular files */
     		if (link(oldpath, newpath) == -1) {
    -			if (errno == EOPNOTSUPP
    +			if (errno == EOPNOTSUPP || errno == ENOSYS
     #ifdef EXDEV
     			    || errno == EXDEV
     #endif
    @@ -1341,7 +1341,7 @@ sftp_server_main(int argc, char **argv, struct passwd *user_pw)
     	__progname = ssh_get_progname(argv[0]);
     	log_init(__progname, log_level, log_facility, log_stderr);
     
    -	while (!skipargs && (ch = getopt(argc, argv, "C:f:l:che")) != -1) {
    +	while (!skipargs && (ch = getopt(argc, argv, "f:l:che")) != -1) {
     		switch (ch) {
     		case 'c':
     			/*
    diff --git a/crypto/openssh/ssh-agent.1 b/crypto/openssh/ssh-agent.1
    index 7ce9dc2ba709..bc389009a2dd 100644
    --- a/crypto/openssh/ssh-agent.1
    +++ b/crypto/openssh/ssh-agent.1
    @@ -1,4 +1,5 @@
    -.\" $OpenBSD: ssh-agent.1,v 1.46 2007/09/09 11:38:01 sobrado Exp $
    +.\" $OpenBSD: ssh-agent.1,v 1.47 2009/03/26 08:38:39 sobrado Exp $
    +.\" $FreeBSD$
     .\"
     .\" Author: Tatu Ylonen 
     .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -34,7 +35,7 @@
     .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     .\"
    -.Dd June 5 2007
    +.Dd March 26 2009
     .Dt SSH-AGENT 1
     .Os
     .Sh NAME
    @@ -141,7 +142,7 @@ The second is that the agent prints the needed shell commands (either
     .Xr sh 1
     or
     .Xr csh 1
    -syntax can be generated) which can be evalled in the calling shell, eg
    +syntax can be generated) which can be evaluated in the calling shell, eg
     .Cm eval `ssh-agent -s`
     for Bourne-type shells such as
     .Xr sh 1
    diff --git a/crypto/openssh/ssh-agent.c b/crypto/openssh/ssh-agent.c
    index ef62f196b48a..1fdf5294f730 100644
    --- a/crypto/openssh/ssh-agent.c
    +++ b/crypto/openssh/ssh-agent.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: ssh-agent.c,v 1.159 2008/06/28 14:05:15 djm Exp $ */
    +/* $OpenBSD: ssh-agent.c,v 1.161 2009/03/23 19:38:04 tobias Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -1062,6 +1062,7 @@ main(int ac, char **av)
     	pid_t pid;
     	char pidstrbuf[1 + 3 * sizeof pid];
     	struct timeval *tvp = NULL;
    +	size_t len;
     
     	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
     	sanitise_stdfd();
    @@ -1123,8 +1124,8 @@ main(int ac, char **av)
     
     	if (ac == 0 && !c_flag && !s_flag) {
     		shell = getenv("SHELL");
    -		if (shell != NULL &&
    -		    strncmp(shell + strlen(shell) - 3, "csh", 3) == 0)
    +		if (shell != NULL && (len = strlen(shell)) > 2 &&
    +		    strncmp(shell + len - 3, "csh", 3) == 0)
     			c_flag = 1;
     	}
     	if (k_flag) {
    diff --git a/crypto/openssh/ssh-keygen.c b/crypto/openssh/ssh-keygen.c
    index 5765cff08849..da5db98455d0 100644
    --- a/crypto/openssh/ssh-keygen.c
    +++ b/crypto/openssh/ssh-keygen.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: ssh-keygen.c,v 1.173 2009/02/21 19:32:04 tobias Exp $ */
    +/* $OpenBSD: ssh-keygen.c,v 1.174 2009/06/22 05:39:28 dtucker Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland
    diff --git a/crypto/openssh/ssh.1 b/crypto/openssh/ssh.1
    index 0ea4c490f624..e88cfe3a960a 100644
    --- a/crypto/openssh/ssh.1
    +++ b/crypto/openssh/ssh.1
    @@ -34,9 +34,9 @@
     .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     .\"
    -.\" $OpenBSD: ssh.1,v 1.282 2009/02/12 03:44:25 djm Exp $
    +.\" $OpenBSD: ssh.1,v 1.283 2009/03/19 15:15:09 jmc Exp $
     .\" $FreeBSD$
    -.Dd February 12 2009
    +.Dd March 19 2009
     .Dt SSH 1
     .Os
     .Sh NAME
    @@ -192,26 +192,9 @@ For protocol version 2,
     .Ar cipher_spec
     is a comma-separated list of ciphers
     listed in order of preference.
    -The supported ciphers are:
    -3des-cbc,
    -aes128-cbc,
    -aes192-cbc,
    -aes256-cbc,
    -aes128-ctr,
    -aes192-ctr,
    -aes256-ctr,
    -arcfour128,
    -arcfour256,
    -arcfour,
    -blowfish-cbc,
    -and
    -cast128-cbc.
    -The default is:
    -.Bd -literal -offset indent
    -aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,
    -arcfour256,arcfour,aes192-cbc,aes256-cbc,aes128-ctr,
    -aes192-ctr,aes256-ctr
    -.Ed
    +See the
    +.Cm Ciphers
    +keyword for more information.
     .It Fl D Xo
     .Sm off
     .Oo Ar bind_address : Oc
    diff --git a/crypto/openssh/ssh.c b/crypto/openssh/ssh.c
    index cd3449a11738..25dd863dca4a 100644
    --- a/crypto/openssh/ssh.c
    +++ b/crypto/openssh/ssh.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: ssh.c,v 1.324 2009/02/12 03:00:56 djm Exp $ */
    +/* $OpenBSD: ssh.c,v 1.326 2009/07/02 02:11:47 dtucker Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -49,6 +49,7 @@ __RCSID("$FreeBSD$");
     #endif
     #include 
     #include 
    +#include 
     #include 
     
     #include 
    @@ -204,8 +205,8 @@ void muxserver_listen(void);
     int
     main(int ac, char **av)
     {
    -	int i, opt, exit_status, use_syslog;
    -	char *p, *cp, *line, buf[256];
    +	int i, r, opt, exit_status, use_syslog;
    +	char *p, *cp, *line, *argv0, buf[MAXPATHLEN];
     	struct stat st;
     	struct passwd *pw;
     	int dummy, timeout_ms;
    @@ -271,6 +272,7 @@ main(int ac, char **av)
     	/* Parse command-line arguments. */
     	host = NULL;
     	use_syslog = 0;
    +	argv0 = av[0];
     
      again:
     	while ((opt = getopt(ac, av, "1246ab:c:e:fgi:kl:m:no:p:qstvx"
    @@ -601,7 +603,7 @@ main(int ac, char **av)
     	 * Initialize "log" output.  Since we are the client all output
     	 * actually goes to stderr.
     	 */
    -	log_init(av[0],
    +	log_init(argv0,
     	    options.log_level == -1 ? SYSLOG_LEVEL_INFO : options.log_level,
     	    SYSLOG_FACILITY_USER, !use_syslog);
     
    @@ -614,9 +616,10 @@ main(int ac, char **av)
     			fatal("Can't open user config file %.100s: "
     			    "%.100s", config, strerror(errno));
     	} else {
    -		snprintf(buf, sizeof buf, "%.100s/%.100s", pw->pw_dir,
    +		r = snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir,
     		    _PATH_SSH_USER_CONFFILE);
    -		(void)read_config_file(buf, host, &options, 1);
    +		if (r > 0 && (size_t)r < sizeof(buf))
    +			(void)read_config_file(buf, host, &options, 1);
     
     		/* Read systemwide configuration file after use config. */
     		(void)read_config_file(_PATH_HOST_CONFIG_FILE, host,
    @@ -629,7 +632,7 @@ main(int ac, char **av)
     	channel_set_af(options.address_family);
     
     	/* reinit */
    -	log_init(av[0], options.log_level, SYSLOG_FACILITY_USER, !use_syslog);
    +	log_init(argv0, options.log_level, SYSLOG_FACILITY_USER, !use_syslog);
     
     	seed_rng();
     
    @@ -784,9 +787,9 @@ main(int ac, char **av)
     	 * Now that we are back to our own permissions, create ~/.ssh
     	 * directory if it doesn't already exist.
     	 */
    -	snprintf(buf, sizeof buf, "%.100s%s%.100s", pw->pw_dir,
    +	r = snprintf(buf, sizeof buf, "%s%s%s", pw->pw_dir,
     	    strcmp(pw->pw_dir, "/") ? "/" : "", _PATH_SSH_USER_DIR);
    -	if (stat(buf, &st) < 0)
    +	if (r > 0 && (size_t)r < sizeof(buf) && stat(buf, &st) < 0)
     		if (mkdir(buf, 0700) < 0)
     			error("Could not create directory '%.200s'.", buf);
     
    diff --git a/crypto/openssh/ssh_config b/crypto/openssh/ssh_config
    index 1549e06a6ef9..e5045a5cf26f 100644
    --- a/crypto/openssh/ssh_config
    +++ b/crypto/openssh/ssh_config
    @@ -45,4 +45,4 @@
     #   TunnelDevice any:any
     #   PermitLocalCommand no
     #   VisualHostKey no
    -#   VersionAddendum FreeBSD-20090522
    +#   VersionAddendum FreeBSD-20091001
    diff --git a/crypto/openssh/ssh_config.5 b/crypto/openssh/ssh_config.5
    index e5e020e54156..b0497d1e5f14 100644
    --- a/crypto/openssh/ssh_config.5
    +++ b/crypto/openssh/ssh_config.5
    @@ -1073,7 +1073,7 @@ in
     Specifies a string to append to the regular version string to identify
     OS- or site-specific modifications.
     The default is
    -.Dq FreeBSD-20090522 .
    +.Dq FreeBSD-20091001 .
     .It Cm VisualHostKey
     If this flag is set to
     .Dq yes ,
    diff --git a/crypto/openssh/ssh_namespace.h b/crypto/openssh/ssh_namespace.h
    index 8fdf708a6a5e..89978fc938c3 100644
    --- a/crypto/openssh/ssh_namespace.h
    +++ b/crypto/openssh/ssh_namespace.h
    @@ -7,7 +7,7 @@
      *
      * A list of symbols which need munging is obtained as follows:
      *
    - * nm libssh.a | awk '$2 == "T" && $3 !~ /^ssh_/ { print "#define", $3, "ssh_" $3 }'
    + * nm libssh.a | awk '/[0-9a-z] [A-Z] / && $3 !~ /^ssh_/ { print "#define", $3, "ssh_" $3 }'
      *
      * $FreeBSD$
      */
    @@ -18,6 +18,7 @@
     #define acss_setkey				ssh_acss_setkey
     #define acss_setsubkey				ssh_acss_setsubkey
     #define add_host_to_hostfile			ssh_add_host_to_hostfile
    +#define add_recv_bytes				ssh_add_recv_bytes
     #define addargs					ssh_addargs
     #define addr_match_list				ssh_addr_match_list
     #define ask_permission				ssh_ask_permission
    @@ -111,6 +112,8 @@
     #define channel_open_message			ssh_channel_open_message
     #define channel_output_poll			ssh_channel_output_poll
     #define channel_permit_all_opens		ssh_channel_permit_all_opens
    +#define channel_post				ssh_channel_post
    +#define channel_pre				ssh_channel_pre
     #define channel_prepare_select			ssh_channel_prepare_select
     #define channel_print_adm_permitted_opens	ssh_channel_print_adm_permitted_opens
     #define channel_register_cleanup		ssh_channel_register_cleanup
    @@ -150,13 +153,19 @@
     #define cipher_set_key_string			ssh_cipher_set_key_string
     #define cipher_set_keycontext			ssh_cipher_set_keycontext
     #define cipher_set_keyiv			ssh_cipher_set_keyiv
    +#define ciphers					ssh_ciphers
     #define ciphers_valid				ssh_ciphers_valid
     #define cleanhostname				ssh_cleanhostname
     #define cleanup_exit				ssh_cleanup_exit
    +#define clear_cached_addr			ssh_clear_cached_addr
     #define colon					ssh_colon
    +#define compat13				ssh_compat13
    +#define compat20				ssh_compat20
     #define compat_cipher_proposal			ssh_compat_cipher_proposal
     #define compat_datafellows			ssh_compat_datafellows
     #define convtime				ssh_convtime
    +#define current_keys				ssh_current_keys
    +#define datafellows				ssh_datafellows
     #define debug					ssh_debug
     #define debug					ssh_debug
     #define debug2					ssh_debug2
    @@ -174,6 +183,7 @@
     #define dh_new_group14				ssh_dh_new_group14
     #define dh_new_group_asc			ssh_dh_new_group_asc
     #define dh_pub_is_valid				ssh_dh_pub_is_valid
    +#define dispatch				ssh_dispatch
     #define dispatch_init				ssh_dispatch_init
     #define dispatch_protocol_error			ssh_dispatch_protocol_error
     #define dispatch_protocol_ignore		ssh_dispatch_protocol_ignore
    @@ -204,6 +214,7 @@
     #define get_local_port				ssh_get_local_port
     #define get_peer_ipaddr				ssh_get_peer_ipaddr
     #define get_peer_port				ssh_get_peer_port
    +#define get_recv_bytes				ssh_get_recv_bytes
     #define get_remote_ipaddr			ssh_get_remote_ipaddr
     #define get_remote_name_or_ip			ssh_get_remote_name_or_ip
     #define get_remote_port				ssh_get_remote_port
    @@ -212,9 +223,12 @@
     #define get_u32					ssh_get_u32
     #define get_u64					ssh_get_u64
     #define getrrsetbyname				ssh_getrrsetbyname
    +#define glob					ssh_glob
    +#define globfree				ssh_globfree
     #define host_hash				ssh_host_hash
     #define hostfile_read_key			ssh_hostfile_read_key
     #define hpdelim					ssh_hpdelim
    +#define incoming_stream				ssh_incoming_stream
     #define init_rng				ssh_init_rng
     #define ipv64_normalise_mapped			ssh_ipv64_normalise_mapped
     #define kex_derive_keys				ssh_kex_derive_keys
    @@ -267,6 +281,7 @@
     #define mac_init				ssh_mac_init
     #define mac_setup				ssh_mac_setup
     #define mac_valid				ssh_mac_valid
    +#define macs					ssh_macs
     #define match_host_and_ip			ssh_match_host_and_ip
     #define match_hostname				ssh_match_hostname
     #define match_list				ssh_match_list
    @@ -278,7 +293,9 @@
     #define ms_subtract_diff			ssh_ms_subtract_diff
     #define ms_to_timeval				ssh_ms_to_timeval
     #define mysignal				ssh_mysignal
    +#define outgoing_stream				ssh_outgoing_stream
     #define packet_add_padding			ssh_packet_add_padding
    +#define packet_backup_state			ssh_packet_backup_state
     #define packet_close				ssh_packet_close
     #define packet_connection_is_ipv4		ssh_packet_connection_is_ipv4
     #define packet_connection_is_on_socket		ssh_packet_connection_is_on_socket
    @@ -289,10 +306,15 @@
     #define packet_get_connection_in		ssh_packet_get_connection_in
     #define packet_get_connection_out		ssh_packet_get_connection_out
     #define packet_get_encryption_key		ssh_packet_get_encryption_key
    +#define packet_get_input			ssh_packet_get_input
     #define packet_get_int				ssh_packet_get_int
    +#define packet_get_int64			ssh_packet_get_int64
     #define packet_get_keycontext			ssh_packet_get_keycontext
     #define packet_get_keyiv			ssh_packet_get_keyiv
     #define packet_get_keyiv_len			ssh_packet_get_keyiv_len
    +#define packet_get_maxsize			ssh_packet_get_maxsize
    +#define packet_get_newkeys			ssh_packet_get_newkeys
    +#define packet_get_output			ssh_packet_get_output
     #define packet_get_protocol_flags		ssh_packet_get_protocol_flags
     #define packet_get_raw				ssh_packet_get_raw
     #define packet_get_ssh1_cipher			ssh_packet_get_ssh1_cipher
    @@ -300,6 +322,7 @@
     #define packet_get_string			ssh_packet_get_string
     #define packet_get_string_ptr			ssh_packet_get_string_ptr
     #define packet_have_data_to_write		ssh_packet_have_data_to_write
    +#define packet_inc_alive_timeouts		ssh_packet_inc_alive_timeouts
     #define packet_is_interactive			ssh_packet_is_interactive
     #define packet_need_rekeying			ssh_packet_need_rekeying
     #define packet_not_very_much_data_to_write	ssh_packet_not_very_much_data_to_write
    @@ -309,6 +332,7 @@
     #define packet_put_char				ssh_packet_put_char
     #define packet_put_cstring			ssh_packet_put_cstring
     #define packet_put_int				ssh_packet_put_int
    +#define packet_put_int64			ssh_packet_put_int64
     #define packet_put_raw				ssh_packet_put_raw
     #define packet_put_string			ssh_packet_put_string
     #define packet_read				ssh_packet_read
    @@ -317,9 +341,11 @@
     #define packet_read_poll_seqnr			ssh_packet_read_poll_seqnr
     #define packet_read_seqnr			ssh_packet_read_seqnr
     #define packet_remaining			ssh_packet_remaining
    +#define packet_restore_state			ssh_packet_restore_state
     #define packet_send				ssh_packet_send
     #define packet_send_debug			ssh_packet_send_debug
     #define packet_send_ignore			ssh_packet_send_ignore
    +#define packet_set_alive_timeouts		ssh_packet_set_alive_timeouts
     #define packet_set_authenticated		ssh_packet_set_authenticated
     #define packet_set_connection			ssh_packet_set_connection
     #define packet_set_encryption_key		ssh_packet_set_encryption_key
    @@ -352,9 +378,13 @@
     #define refresh_progress_meter			ssh_refresh_progress_meter
     #define replacearg				ssh_replacearg
     #define restore_uid				ssh_restore_uid
    +#define resume_in_progress			ssh_resume_in_progress
    +#define resume_kex				ssh_resume_kex
     #define rijndael_decrypt			ssh_rijndael_decrypt
     #define rijndael_encrypt			ssh_rijndael_encrypt
     #define rijndael_set_key			ssh_rijndael_set_key
    +#define roaming_read				ssh_roaming_read
    +#define roaming_write				ssh_roaming_write
     #define rsa_generate_additional_parameters	ssh_rsa_generate_additional_parameters
     #define rsa_private_decrypt			ssh_rsa_private_decrypt
     #define rsa_public_encrypt			ssh_rsa_public_encrypt
    @@ -382,6 +412,7 @@
     #define tty_make_modes				ssh_tty_make_modes
     #define tty_parse_modes				ssh_tty_parse_modes
     #define tun_open				ssh_tun_open
    +#define umac_ctx				ssh_umac_ctx
     #define umac_delete				ssh_umac_delete
     #define umac_final				ssh_umac_final
     #define umac_new				ssh_umac_new
    diff --git a/crypto/openssh/sshconnect.c b/crypto/openssh/sshconnect.c
    index cc214714c3cb..19009cd12ff8 100644
    --- a/crypto/openssh/sshconnect.c
    +++ b/crypto/openssh/sshconnect.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: sshconnect.c,v 1.212 2008/10/14 18:11:33 stevesk Exp $ */
    +/* $OpenBSD: sshconnect.c,v 1.214 2009/05/28 16:50:16 andreas Exp $ */
     /* $FreeBSD$ */
     /*
      * Author: Tatu Ylonen 
    @@ -57,6 +57,7 @@
     #include "atomicio.h"
     #include "misc.h"
     #include "dns.h"
    +#include "roaming.h"
     #include "version.h"
     
     char *client_version_string = NULL;
    @@ -414,7 +415,7 @@ ssh_connect(const char *host, struct sockaddr_storage * hostaddr,
      * Waits for the server identification string, and sends our own
      * identification string.
      */
    -static void
    +void
     ssh_exchange_identification(int timeout_ms)
     {
     	char buf[256], remote_version[256];	/* must be same size! */
    @@ -453,7 +454,7 @@ ssh_exchange_identification(int timeout_ms)
     				}
     			}
     
    -			len = atomicio(read, connection_in, &buf[i], 1);
    +			len = roaming_atomicio(read, connection_in, &buf[i], 1);
     
     			if (len != 1 && errno == EPIPE)
     				fatal("ssh_exchange_identification: "
    @@ -538,7 +539,8 @@ ssh_exchange_identification(int timeout_ms)
     	    compat20 ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1,
     	    compat20 ? PROTOCOL_MINOR_2 : minor1,
     	    SSH_VERSION, compat20 ? "\r\n" : "\n");
    -	if (atomicio(vwrite, connection_out, buf, strlen(buf)) != strlen(buf))
    +	if (roaming_atomicio(vwrite, connection_out, buf, strlen(buf))
    +	    != strlen(buf))
     		fatal("write: %.100s", strerror(errno));
     	client_version_string = xstrdup(buf);
     	chop(client_version_string);
    diff --git a/crypto/openssh/sshconnect.h b/crypto/openssh/sshconnect.h
    index 75bde1a4db14..c59a097f4eba 100644
    --- a/crypto/openssh/sshconnect.h
    +++ b/crypto/openssh/sshconnect.h
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: sshconnect.h,v 1.24 2007/09/04 11:15:56 djm Exp $ */
    +/* $OpenBSD: sshconnect.h,v 1.25 2009/05/27 06:38:16 andreas Exp $ */
     
     /*
      * Copyright (c) 2000 Markus Friedl.  All rights reserved.
    @@ -38,6 +38,8 @@ ssh_connect(const char *, struct sockaddr_storage *, u_short, int, int,
     void
     ssh_login(Sensitive *, const char *, struct sockaddr *, struct passwd *, int);
     
    +void	 ssh_exchange_identification(int);
    +
     int	 verify_host_key(char *, struct sockaddr *, Key *);
     
     void	 ssh_kex(char *, struct sockaddr *);
    diff --git a/crypto/openssh/sshconnect2.c b/crypto/openssh/sshconnect2.c
    index a762eec3bdb4..260c6307a69a 100644
    --- a/crypto/openssh/sshconnect2.c
    +++ b/crypto/openssh/sshconnect2.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: sshconnect2.c,v 1.170 2008/11/04 08:22:13 djm Exp $ */
    +/* $OpenBSD: sshconnect2.c,v 1.171 2009/03/05 07:18:19 djm Exp $ */
     /*
      * Copyright (c) 2000 Markus Friedl.  All rights reserved.
      * Copyright (c) 2008 Damien Miller.  All rights reserved.
    @@ -68,6 +68,7 @@
     #include "msg.h"
     #include "pathnames.h"
     #include "uidswap.h"
    +#include "schnorr.h"
     #include "jpake.h"
     
     #ifdef GSSAPI
    diff --git a/crypto/openssh/sshd.8 b/crypto/openssh/sshd.8
    index f74decf39048..2e3c0a5a23d6 100644
    --- a/crypto/openssh/sshd.8
    +++ b/crypto/openssh/sshd.8
    @@ -34,9 +34,9 @@
     .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     .\"
    -.\" $OpenBSD: sshd.8,v 1.247 2008/10/03 13:08:12 jmc Exp $
    +.\" $OpenBSD: sshd.8,v 1.248 2009/03/26 08:38:39 sobrado Exp $
     .\" $FreeBSD$
    -.Dd October 3 2008
    +.Dd March 26 2009
     .Dt SSHD 8
     .Os
     .Sh NAME
    @@ -546,7 +546,7 @@ for more information on patterns.
     In addition to the wildcard matching that may be applied to hostnames or
     addresses, a
     .Cm from
    -stanza may match IP addressess using CIDR address/masklen notation.
    +stanza may match IP addresses using CIDR address/masklen notation.
     .Pp
     The purpose of this option is to optionally increase security: public key
     authentication by itself does not trust the network or name servers or
    diff --git a/crypto/openssh/sshd.c b/crypto/openssh/sshd.c
    index 75ab86ccf12a..166f42b4f258 100644
    --- a/crypto/openssh/sshd.c
    +++ b/crypto/openssh/sshd.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: sshd.c,v 1.366 2009/01/22 10:02:34 djm Exp $ */
    +/* $OpenBSD: sshd.c,v 1.367 2009/05/28 16:50:16 andreas Exp $ */
     /*
      * Author: Tatu Ylonen 
      * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland
    @@ -47,6 +47,7 @@ __RCSID("$FreeBSD$");
     
     #include 
     #include 
    +#include 
     #include 
     #ifdef HAVE_SYS_STAT_H
     # include 
    @@ -72,7 +73,6 @@ __RCSID("$FreeBSD$");
     #include 
     #include 
     #include 
    -#include 
     
     #include 
     #include 
    @@ -128,6 +128,7 @@ __RCSID("$FreeBSD$");
     #include "ssh-gss.h"
     #endif
     #include "monitor_wrap.h"
    +#include "roaming.h"
     #include "version.h"
     
     #ifdef LIBWRAP
    @@ -238,7 +239,7 @@ u_char *session_id2 = NULL;
     u_int session_id2_len = 0;
     
     /* record remote hostname or ip */
    -u_int utmp_len = UT_HOSTSIZE;
    +u_int utmp_len = MAXHOSTNAMELEN;
     
     /* options.max_startup sized array of fd ints */
     int *startup_pipes = NULL;
    @@ -430,7 +431,7 @@ sshd_exchange_identification(int sock_in, int sock_out)
     	server_version_string = xstrdup(buf);
     
     	/* Send our protocol version identification. */
    -	if (atomicio(vwrite, sock_out, server_version_string,
    +	if (roaming_atomicio(vwrite, sock_out, server_version_string,
     	    strlen(server_version_string))
     	    != strlen(server_version_string)) {
     		logit("Could not write ident string to %s", get_remote_ipaddr());
    @@ -440,7 +441,7 @@ sshd_exchange_identification(int sock_in, int sock_out)
     	/* Read other sides version identification. */
     	memset(buf, 0, sizeof(buf));
     	for (i = 0; i < sizeof(buf) - 1; i++) {
    -		if (atomicio(read, sock_in, &buf[i], 1) != 1) {
    +		if (roaming_atomicio(read, sock_in, &buf[i], 1) != 1) {
     			logit("Did not receive identification string from %s",
     			    get_remote_ipaddr());
     			cleanup_exit(255);
    @@ -588,7 +589,7 @@ demote_sensitive_data(void)
     static void
     privsep_preauth_child(void)
     {
    - 	u_int32_t rnd[256];
    +	u_int32_t rnd[256];
     	gid_t gidset[1];
     
     	/* Enable challenge-response authentication for privilege separation */
    @@ -1292,6 +1293,10 @@ main(int ac, char **av)
     	/* Initialize configuration options to their default values. */
     	initialize_server_options(&options);
     
    +	/* Avoid killing the process in high-pressure swapping environments. */
    +	if (madvise(NULL, 0, MADV_PROTECT) != 0)
    +		debug("madvise(): %.200s", strerror(errno));
    +
     	/* Parse command-line arguments. */
     	while ((opt = getopt(ac, av, "f:p:b:k:h:g:u:o:C:dDeiqrtQRT46")) != -1) {
     		switch (opt) {
    diff --git a/crypto/openssh/sshd_config b/crypto/openssh/sshd_config
    index c2c08843df27..fc2b68364929 100644
    --- a/crypto/openssh/sshd_config
    +++ b/crypto/openssh/sshd_config
    @@ -14,10 +14,9 @@
     # Note that some of FreeBSD's defaults differ from OpenBSD's, and
     # FreeBSD has a few additional options.
     
    -#VersionAddendum FreeBSD-20090522
    +#VersionAddendum FreeBSD-20091001
     
     #Port 22
    -#Protocol 2
     #AddressFamily any
     #ListenAddress 0.0.0.0
     #ListenAddress ::
    diff --git a/crypto/openssh/sshd_config.5 b/crypto/openssh/sshd_config.5
    index 6779f0a5e573..84b0ae8106f6 100644
    --- a/crypto/openssh/sshd_config.5
    +++ b/crypto/openssh/sshd_config.5
    @@ -34,9 +34,9 @@
     .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     .\"
    -.\" $OpenBSD: sshd_config.5,v 1.102 2009/02/22 23:59:25 djm Exp $
    +.\" $OpenBSD: sshd_config.5,v 1.106 2009/04/21 15:13:17 stevesk Exp $
     .\" $FreeBSD$
    -.Dd February 22 2009
    +.Dd April 21 2009
     .Dt SSHD_CONFIG 5
     .Os
     .Sh NAME
    @@ -177,9 +177,9 @@ then no banner is displayed.
     This option is only available for protocol version 2.
     By default, no banner is displayed.
     .It Cm ChallengeResponseAuthentication
    -Specifies whether challenge-response authentication is allowed.
    -See also
    -.Cm UsePAM .
    +Specifies whether challenge-response authentication is allowed (e.g. via
    +PAM or though authentication styles supported in
    +.Xr login.conf 5 )
     The default is
     .Dq yes .
     .It Cm ChrootDirectory
    @@ -188,6 +188,9 @@ Specifies a path to
     to after authentication.
     This path, and all its components, must be root-owned directories that are
     not writable by any other user or group.
    +After the chroot,
    +.Xr sshd 8
    +changes the working directory to the user's home directory.
     .Pp
     The path may contain the following tokens that are expanded at runtime once
     the connecting user has been authenticated: %% is replaced by a literal '%',
    @@ -197,7 +200,7 @@ the connecting user has been authenticated: %% is replaced by a literal '%',
     The
     .Cm ChrootDirectory
     must contain the necessary files and directories to support the
    -users' session.
    +user's session.
     For an interactive session this requires at least a shell, typically
     .Xr sh 1 ,
     and basic
    @@ -215,8 +218,11 @@ devices.
     For file transfer sessions using
     .Dq sftp ,
     no additional configuration of the environment is necessary if the
    -in-process sftp server is used (see
    -.Cm Subsystem
    +in-process sftp server is used,
    +though sessions which use logging do require
    +.Pa /dev/log
    +inside the chroot directory (see
    +.Xr sftp-server 8
     for details).
     .Pp
     The default is not to
    @@ -949,7 +955,7 @@ The default is
     Specifies a string to append to the regular version string to identify
     OS- or site-specific modifications.
     The default is
    -.Dq FreeBSD-20090522 .
    +.Dq FreeBSD-20091001 .
     .It Cm X11DisplayOffset
     Specifies the first display number available for
     .Xr sshd 8 Ns 's
    diff --git a/crypto/openssh/sshlogin.c b/crypto/openssh/sshlogin.c
    index cc35d6024b41..33bd652fb0b5 100644
    --- a/crypto/openssh/sshlogin.c
    +++ b/crypto/openssh/sshlogin.c
    @@ -86,13 +86,20 @@ get_last_login_time(uid_t uid, const char *logname,
     static void
     store_lastlog_message(const char *user, uid_t uid)
     {
    +#ifndef NO_SSH_LASTLOG
     	char *time_string, hostname[MAXHOSTNAMELEN] = "", buf[512];
     	time_t last_login_time;
     
    -#ifndef NO_SSH_LASTLOG
     	if (!options.print_lastlog)
     		return;
     
    +# ifdef CUSTOM_SYS_AUTH_GET_LASTLOGIN_MSG
    +	time_string = sys_auth_get_lastlogin_msg(user, uid);
    +	if (time_string != NULL) {
    +		buffer_append(&loginmsg, time_string, strlen(time_string));
    +		xfree(time_string);
    +	}
    +# else
     	last_login_time = get_last_login_time(uid, user, hostname,
     	    sizeof(hostname));
     
    @@ -107,6 +114,7 @@ store_lastlog_message(const char *user, uid_t uid)
     			    time_string, hostname);
     		buffer_append(&loginmsg, buf, strlen(buf));
     	}
    +# endif /* CUSTOM_SYS_AUTH_GET_LASTLOGIN_MSG */
     #endif /* NO_SSH_LASTLOG */
     }
     
    diff --git a/crypto/openssh/uuencode.c b/crypto/openssh/uuencode.c
    index a13949585f8e..b9e57e9934b1 100644
    --- a/crypto/openssh/uuencode.c
    +++ b/crypto/openssh/uuencode.c
    @@ -1,4 +1,4 @@
    -/* $OpenBSD: uuencode.c,v 1.24 2006/08/03 03:34:42 deraadt Exp $ */
    +/* $OpenBSD: uuencode.c,v 1.25 2009/03/05 11:30:50 djm Exp $ */
     /*
      * Copyright (c) 2000 Markus Friedl.  All rights reserved.
      *
    @@ -33,6 +33,12 @@
     #include "xmalloc.h"
     #include "uuencode.h"
     
    +/*
    + * Encode binary 'src' of length 'srclength', writing base64-encoded text
    + * to 'target' of size 'targsize'. Will always nul-terminate 'target'.
    + * Returns the number of bytes stored in 'target' or -1 on error (inc.
    + * 'targsize' too small).
    + */
     int
     uuencode(const u_char *src, u_int srclength,
         char *target, size_t targsize)
    @@ -40,6 +46,11 @@ uuencode(const u_char *src, u_int srclength,
     	return __b64_ntop(src, srclength, target, targsize);
     }
     
    +/*
    + * Decode base64-encoded 'src' into buffer 'target' of 'targsize' bytes.
    + * Will skip leading and trailing whitespace. Returns the number of bytes
    + * stored in 'target' or -1 on error (inc. targsize too small).
    + */
     int
     uudecode(const char *src, u_char *target, size_t targsize)
     {
    diff --git a/crypto/openssh/version.h b/crypto/openssh/version.h
    index ff87b920e9fe..581decf6dc54 100644
    --- a/crypto/openssh/version.h
    +++ b/crypto/openssh/version.h
    @@ -1,12 +1,12 @@
    -/* $OpenBSD: version.h,v 1.55 2009/02/23 00:06:15 djm Exp $ */
    +/* $OpenBSD: version.h,v 1.56 2009/06/30 14:54:40 markus Exp $ */
     /* $FreeBSD$ */
     
     #ifndef SSH_VERSION
     
     #define SSH_VERSION             (ssh_version_get())
     #define SSH_RELEASE             (ssh_version_get())
    -#define SSH_VERSION_BASE        "OpenSSH_5.2p1"
    -#define SSH_VERSION_ADDENDUM    "FreeBSD-20090522"
    +#define SSH_VERSION_BASE        "OpenSSH_5.3p1"
    +#define SSH_VERSION_ADDENDUM    "FreeBSD-20091001"
     
     const char *ssh_version_get(void);
     void ssh_version_set_addendum(const char *);
    diff --git a/crypto/openssl/ssl/s3_lib.c b/crypto/openssl/ssl/s3_lib.c
    index 8916a0b1b3c7..1b38f72d0865 100644
    --- a/crypto/openssl/ssl/s3_lib.c
    +++ b/crypto/openssl/ssl/s3_lib.c
    @@ -2592,6 +2592,9 @@ int ssl3_renegotiate(SSL *s)
     	if (s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS)
     		return(0);
     
    +	if (1)
    +		return(0);
    +
     	s->s3->renegotiate=1;
     	return(1);
     	}
    diff --git a/crypto/openssl/ssl/s3_pkt.c b/crypto/openssl/ssl/s3_pkt.c
    index 9476dcddf6e9..1644f19d49c0 100644
    --- a/crypto/openssl/ssl/s3_pkt.c
    +++ b/crypto/openssl/ssl/s3_pkt.c
    @@ -983,9 +983,7 @@ start:
     		if (s->msg_callback)
     			s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->s3->handshake_fragment, 4, s, s->msg_callback_arg);
     
    -		if (SSL_is_init_finished(s) &&
    -			!(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) &&
    -			!s->s3->renegotiate)
    +		if (0)
     			{
     			ssl3_renegotiate(s);
     			if (ssl3_renegotiate_check(s))
    @@ -1116,8 +1114,7 @@ start:
     	/* Unexpected handshake message (Client Hello, or protocol violation) */
     	if ((s->s3->handshake_fragment_len >= 4) &&	!s->in_handshake)
     		{
    -		if (((s->state&SSL_ST_MASK) == SSL_ST_OK) &&
    -			!(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS))
    +		if (0)
     			{
     #if 0 /* worked only because C operator preferences are not as expected (and
            * because this is not really needed for clients except for detecting
    diff --git a/crypto/openssl/ssl/s3_srvr.c b/crypto/openssl/ssl/s3_srvr.c
    index 80b45eb86ff1..b2ba9ffeb03d 100644
    --- a/crypto/openssl/ssl/s3_srvr.c
    +++ b/crypto/openssl/ssl/s3_srvr.c
    @@ -718,6 +718,13 @@ int ssl3_get_client_hello(SSL *s)
     #endif
     	STACK_OF(SSL_CIPHER) *ciphers=NULL;
     
    +	if (s->new_session)
    +		{
    +		al=SSL_AD_HANDSHAKE_FAILURE;
    +		SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
    +		goto f_err;
    +		}
    +
     	/* We do this so that we will respond with our native type.
     	 * If we are TLSv1 and we get SSLv3, we will respond with TLSv1,
     	 * This down switching should be handled by a different method.
    diff --git a/etc/Makefile b/etc/Makefile
    index 1181104a3a43..42221a809c5f 100644
    --- a/etc/Makefile
    +++ b/etc/Makefile
    @@ -15,11 +15,16 @@ BIN1=	auth.conf \
     	inetd.conf libalias.conf login.access login.conf mac.conf motd \
     	netconfig network.subr networks newsyslog.conf nsswitch.conf \
     	phones profile protocols \
    -	rc rc.bsdextended rc.firewall rc.firewall6 rc.initdiskless \
    +	rc rc.bsdextended rc.firewall rc.initdiskless \
     	rc.sendmail rc.shutdown \
     	rc.subr remote rpc services shells \
    -	sysctl.conf syslog.conf \
    -	etc.${MACHINE_ARCH}/ttys
    +	sysctl.conf syslog.conf
    +
    +.if exists(${.CURDIR}/etc.${MACHINE}/ttys)
    +BIN1+=	etc.${MACHINE}/ttys
    +.else
    +BIN1+=	etc.${MACHINE_ARCH}/ttys
    +.endif
     
     OPENBSMDIR=			${.CURDIR}/../contrib/openbsm
     BSM_ETC_OPEN_FILES=		${OPENBSMDIR}/etc/audit_class \
    diff --git a/etc/defaults/devfs.rules b/etc/defaults/devfs.rules
    index a00b75d9247e..a3e30b776b19 100644
    --- a/etc/defaults/devfs.rules
    +++ b/etc/defaults/devfs.rules
    @@ -44,6 +44,14 @@ add path 'ptyP*' unhide
     add path 'ptyQ*' unhide
     add path 'ptyR*' unhide
     add path 'ptyS*' unhide
    +add path 'ptyl*' unhide
    +add path 'ptym*' unhide
    +add path 'ptyn*' unhide
    +add path 'ptyo*' unhide
    +add path 'ptyL*' unhide
    +add path 'ptyM*' unhide
    +add path 'ptyN*' unhide
    +add path 'ptyO*' unhide
     add path 'ttyp*' unhide
     add path 'ttyq*' unhide
     add path 'ttyr*' unhide
    @@ -52,6 +60,14 @@ add path 'ttyP*' unhide
     add path 'ttyQ*' unhide
     add path 'ttyR*' unhide
     add path 'ttyS*' unhide
    +add path 'ttyl*' unhide
    +add path 'ttym*' unhide
    +add path 'ttyn*' unhide
    +add path 'ttyo*' unhide
    +add path 'ttyL*' unhide
    +add path 'ttyM*' unhide
    +add path 'ttyN*' unhide
    +add path 'ttyO*' unhide
     add path ptmx unhide
     add path pts unhide
     add path 'pts/*' unhide
    diff --git a/etc/defaults/rc.conf b/etc/defaults/rc.conf
    index cc4b6a5de67e..35b3a7bb52e1 100644
    --- a/etc/defaults/rc.conf
    +++ b/etc/defaults/rc.conf
    @@ -23,7 +23,7 @@
     
     rc_debug="NO"		# Set to YES to enable debugging output from rc.d
     rc_info="NO"		# Enables display of informational messages at boot.
    -rc_startmsgs="NO" 	# Show "Starting foo:" messages at boot
    +rc_startmsgs="YES" 	# Show "Starting foo:" messages at boot
     rcshutdown_timeout="30" # Seconds to wait before terminating rc.shutdown
     early_late_divider="FILESYSTEMS"	# Script that separates early/late
     			# stages of the boot process.  Make sure you know
    @@ -118,7 +118,12 @@ firewall_type="UNKNOWN"		# Firewall type (see /etc/rc.firewall)
     firewall_quiet="NO"		# Set to YES to suppress rule display
     firewall_logging="NO"		# Set to YES to enable events logging
     firewall_flags=""		# Flags passed to ipfw when type is a file
    -firewall_client_net="192.0.2.0/24" # Network address for "client" firewall.
    +firewall_coscripts=""		# List of executables/scripts to run after
    +				# firewall starts/stops
    +firewall_client_net="192.0.2.0/24" # IPv4 Network address for "client"
    +				# firewall.
    +#firewall_client_net_ipv6="2001:db8:2:1::/64" # IPv6 network prefix for
    +				# "client" firewall.
     firewall_simple_iif="ed1"	# Inside network interface for "simple"
     				# firewall.
     firewall_simple_inet="192.0.2.16/28" # Inside network address for "simple"
    @@ -127,6 +132,14 @@ firewall_simple_oif="ed0"	# Outside network interface for "simple"
     				# firewall.
     firewall_simple_onet="192.0.2.0/28" # Outside network address for "simple"
     				# firewall.
    +#firewall_simple_iif_ipv6="ed1"	# Inside IPv6 network interface for "simple"
    +				# firewall.
    +#firewall_simple_inet_ipv6="2001:db8:2:800::/56" # Inside IPv6 network prefix
    +				# for "simple" firewall.
    +#firewall_simple_oif_ipv6="ed0"	# Outside IPv6 network interface for "simple"
    +				# firewall.
    +#firewall_simple_onet_ipv6="2001:db8:2:0::/56" # Outside IPv6 network prefix
    +				# for "simple" firewall.
     firewall_myservices=""		# List of TCP ports on which this host
     				# offers services for "workstation" firewall.
     firewall_allowservices=""	# List of IPs which have access to
    @@ -200,6 +213,8 @@ ifconfig_lo0="inet 127.0.0.1"	# default loopback device configuration.
     #ifconfig_ed0_ipv6="inet6 2001:db8:1::1 prefixlen 64" # Sample IPv6 addr entry
     #ifconfig_ed0_alias0="inet6 2001:db8:2::1 prefixlen 64" # Sample IPv6 alias
     #ifconfig_fxp0_name="net0"	# Change interface name from fxp0 to net0.
    +#vlans_fxp0="101 vlan0"		# vlan(4) interfaces for fxp0 device
    +#create_arg_vlan0="vlan 102"	# vlan tag for vlan0 device
     #wlans_ath0="wlan0"		# wlan(4) interfaces for ath0 device
     #wlandebug_wlan0="scan+auth+assoc"	# Set debug flags with wlanddebug(8)
     #ipv4_addrs_fxp0="192.168.0.1/24 192.168.1.1-5/28" # example IPv4 address entry.
    @@ -245,6 +260,9 @@ syslogd_flags="-s"		# Flags to syslogd (if enabled).
     inetd_enable="NO"		# Run the network daemon dispatcher (YES/NO).
     inetd_program="/usr/sbin/inetd"	# path to inetd, if you want a different one.
     inetd_flags="-wW -C 60"		# Optional flags to inetd
    +hastd_enable="NO"		# Run the HAST daemon (YES/NO).
    +hastd_program="/sbin/hastd"	# path to hastd, if you want a different one.
    +hastd_flags=""			# Optional flags to hastd.
     #
     # named.  It may be possible to run named in a sandbox, man security for
     # details.
    @@ -252,7 +270,7 @@ inetd_flags="-wW -C 60"		# Optional flags to inetd
     named_enable="NO"		# Run named, the DNS server (or NO).
     named_program="/usr/sbin/named" # Path to named, if you want a different one.
     named_conf="/etc/namedb/named.conf" 	# Path to the configuration file
    -#named_flags="-c /etc/namedb/named.conf" # Uncomment for named not in /usr/sbin
    +#named_flags=""			# Use this for flags OTHER than -u and -c
     named_pidfile="/var/run/named/pid" # Must set this in named.conf as well
     named_uid="bind" 		# User to run named as
     named_chrootdir="/var/named"	# Chroot directory (or "" not to auto-chroot it)
    @@ -447,6 +465,10 @@ ipv6_default_interface="NO"	# Default output interface for scoped addrs.
     				# Now this works only for IPv6 link local
     				# multicast addrs.
     rtsol_flags=""			# Flags to IPv6 router solicitation.
    +rtsold_enable="NO"		# Set to YES to enable an IPv6 router
    +				# solicitation daemon.
    +rtsold_flags="-a"		# Flags to an IPv6 router solicitation
    +				# daemon.
     rtadvd_enable="NO"		# Set to YES to enable an IPv6 router
     				# advertisement daemon. If set to YES,
     				# this router becomes a possible candidate
    @@ -472,13 +494,6 @@ ipv6_faith_prefix="NO"		# Set faith prefix to enable a FAITH
     				# faithd(8) setup.
     ipv6_ipv4mapping="NO"		# Set to "YES" to enable IPv4 mapped IPv6 addr
     				# communication. (like ::ffff:a.b.c.d)
    -ipv6_firewall_enable="NO"	# Set to YES to enable IPv6 firewall
    -				# functionality
    -ipv6_firewall_script="/etc/rc.firewall6" # Which script to run to set up the IPv6 firewall
    -ipv6_firewall_type="UNKNOWN"	# IPv6 Firewall type (see /etc/rc.firewall6)
    -ipv6_firewall_quiet="NO"	# Set to YES to suppress rule display
    -ipv6_firewall_logging="NO"	# Set to YES to enable events logging
    -ipv6_firewall_flags=""		# Flags passed to ip6fw when type is a file
     ipv6_ipfilter_rules="/etc/ipf6.rules"	# rules definition file for ipfilter,
     					# see /usr/src/contrib/ipfilter/rules
     					# for examples
    @@ -600,6 +615,7 @@ harvest_ethernet="YES"	# Entropy device harvests ethernet randomness
     harvest_p_to_p="YES"	# Entropy device harvests point-to-point randomness
     dmesg_enable="YES"	# Save dmesg(8) to /var/run/dmesg.boot
     watchdogd_enable="NO"	# Start the software watchdog daemon
    +watchdogd_flags=""	# Flags to watchdogd (if enabled)
     devfs_rulesets="/etc/defaults/devfs.rules /etc/devfs.rules" # Files containing
     							    # devfs(8) rules.
     devfs_system_ruleset=""	# The name (NOT number) of a ruleset to apply to /dev
    diff --git a/etc/devd/Makefile b/etc/devd/Makefile
    index f2bb18449178..ad434f270e3f 100644
    --- a/etc/devd/Makefile
    +++ b/etc/devd/Makefile
    @@ -1,6 +1,6 @@
     # $FreeBSD$
     
    -FILES=	asus.conf
    +FILES=	asus.conf uath.conf
     
     NO_OBJ=
     FILESDIR=	/etc/devd
    diff --git a/etc/devd/uath.conf b/etc/devd/uath.conf
    new file mode 100644
    index 000000000000..33bee69bb176
    --- /dev/null
    +++ b/etc/devd/uath.conf
    @@ -0,0 +1,120 @@
    +# $FreeBSD$
    +#
    +# Atheros USB wireless network device specific devd events
    +
    +# Accton
    +#   SMCWUSB-G and SMCWUSBT-G2
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x083a";
    +	match "product" "(0x4505|0x4507)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Atheros Communications
    +#   AR5523
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x168c";
    +	match "product" "0x0002";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Atheros Communications
    +#   AR5523
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x0cf3";
    +	match "product" "(0x0002|0x0004|0x0006)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Conceptronic
    +#   AR5523
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x0d8e";
    +	match "product" "(0x7802|0x7812)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# D-Link
    +#   DWL-AG132, DWL-G132 and DWL-AG122
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x2001";
    +	match "product" "(0x3a01|0x3a03|0x3a05)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# D-Link
    +#  DWA-120
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x07d1";
    +	match "product" "0x3a0c";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Gigaset
    +#   SMCWUSBT-G
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x1690";
    +	match "product" "(0x0711|0x0713)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Global Sun Technology
    +#   AR5523
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x16ab";
    +	match "product" "(0x7802|0x7812)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# BayNETGEAR
    +#   WG111U
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x0846";
    +	match "product" "0x4301";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Netgear
    +#   WG111T and WPN111
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x1385";
    +	match "product" "(0x4251|0x5f01)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# U-MEDIA Communications
    +#   TEW-444UB and AR5523
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x157e";
    +	match "product" "(0x3007|0x3206)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Wistron NeWeb
    +#   AR5523
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x1435";
    +	match "product" "(0x0827|0x0829)";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    +
    +# Z-Com
    +#   AR5523
    +attach 100 {
    +	device-name "ugen[0-9.]+";
    +	match "vendor" "0x0cde";
    +	match "product" "0x0013";
    +	action "/usr/sbin/uathload -d /dev/$device-name";
    +};
    diff --git a/etc/etc.amd64/ttys b/etc/etc.amd64/ttys
    index c4650cbdb03b..39205470e709 100644
    --- a/etc/etc.amd64/ttys
    +++ b/etc/etc.amd64/ttys
    @@ -15,7 +15,7 @@
     #
     # type The initial terminal type for this port.  For hardwired
     #      terminal lines, this will contain the type of terminal used.
    -#      For virtual consoles, the correct type is typically cons25.
    +#      For virtual consoles, the correct type is typically xterm.
     #      Other common values include network for network connections on
     #      pseudo-terminals, dialup for incoming modem ports, and unknown
     #      when the terminal type cannot be predetermined.
    @@ -30,15 +30,15 @@
     # when going to single-user mode.
     console	none				unknown	off secure
     #
    -ttyv0	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv0	"/usr/libexec/getty Pc"		xterm	on  secure
     # Virtual terminals
    -ttyv1	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv2	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv3	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv4	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv5	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv6	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv7	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv1	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv2	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv3	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv4	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv5	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv6	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv7	"/usr/libexec/getty Pc"		xterm	on  secure
     ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
     # Serial terminals
     # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    @@ -48,260 +48,3 @@ ttyu2	"/usr/libexec/getty std.9600"	dialup	off secure
     ttyu3	"/usr/libexec/getty std.9600"	dialup	off secure
     # Dumb console
     dcons	"/usr/libexec/getty std.9600"	vt100	off secure
    -# Pseudo terminals
    -ttyp0	none			network
    -ttyp1	none			network
    -ttyp2	none			network
    -ttyp3	none			network
    -ttyp4	none			network
    -ttyp5	none			network
    -ttyp6	none			network
    -ttyp7	none			network
    -ttyp8	none			network
    -ttyp9	none			network
    -ttypa	none			network
    -ttypb	none			network
    -ttypc	none			network
    -ttypd	none			network
    -ttype	none			network
    -ttypf	none			network
    -ttypg	none			network
    -ttyph	none			network
    -ttypi	none			network
    -ttypj	none			network
    -ttypk	none			network
    -ttypl	none			network
    -ttypm	none			network
    -ttypn	none			network
    -ttypo	none			network
    -ttypp	none			network
    -ttypq	none			network
    -ttypr	none			network
    -ttyps	none			network
    -ttypt	none			network
    -ttypu	none			network
    -ttypv	none			network
    -ttyq0	none			network
    -ttyq1	none			network
    -ttyq2	none			network
    -ttyq3	none			network
    -ttyq4	none			network
    -ttyq5	none			network
    -ttyq6	none			network
    -ttyq7	none			network
    -ttyq8	none			network
    -ttyq9	none			network
    -ttyqa	none			network
    -ttyqb	none			network
    -ttyqc	none			network
    -ttyqd	none			network
    -ttyqe	none			network
    -ttyqf	none			network
    -ttyqg	none			network
    -ttyqh	none			network
    -ttyqi	none			network
    -ttyqj	none			network
    -ttyqk	none			network
    -ttyql	none			network
    -ttyqm	none			network
    -ttyqn	none			network
    -ttyqo	none			network
    -ttyqp	none			network
    -ttyqq	none			network
    -ttyqr	none			network
    -ttyqs	none			network
    -ttyqt	none			network
    -ttyqu	none			network
    -ttyqv	none			network
    -ttyr0	none			network
    -ttyr1	none			network
    -ttyr2	none			network
    -ttyr3	none			network
    -ttyr4	none			network
    -ttyr5	none			network
    -ttyr6	none			network
    -ttyr7	none			network
    -ttyr8	none			network
    -ttyr9	none			network
    -ttyra	none			network
    -ttyrb	none			network
    -ttyrc	none			network
    -ttyrd	none			network
    -ttyre	none			network
    -ttyrf	none			network
    -ttyrg	none			network
    -ttyrh	none			network
    -ttyri	none			network
    -ttyrj	none			network
    -ttyrk	none			network
    -ttyrl	none			network
    -ttyrm	none			network
    -ttyrn	none			network
    -ttyro	none			network
    -ttyrp	none			network
    -ttyrq	none			network
    -ttyrr	none			network
    -ttyrs	none			network
    -ttyrt	none			network
    -ttyru	none			network
    -ttyrv	none			network
    -ttys0	none			network
    -ttys1	none			network
    -ttys2	none			network
    -ttys3	none			network
    -ttys4	none			network
    -ttys5	none			network
    -ttys6	none			network
    -ttys7	none			network
    -ttys8	none			network
    -ttys9	none			network
    -ttysa	none			network
    -ttysb	none			network
    -ttysc	none			network
    -ttysd	none			network
    -ttyse	none			network
    -ttysf	none			network
    -ttysg	none			network
    -ttysh	none			network
    -ttysi	none			network
    -ttysj	none			network
    -ttysk	none			network
    -ttysl	none			network
    -ttysm	none			network
    -ttysn	none			network
    -ttyso	none			network
    -ttysp	none			network
    -ttysq	none			network
    -ttysr	none			network
    -ttyss	none			network
    -ttyst	none			network
    -ttysu	none			network
    -ttysv	none			network
    -ttyP0	none			network
    -ttyP1	none			network
    -ttyP2	none			network
    -ttyP3	none			network
    -ttyP4	none			network
    -ttyP5	none			network
    -ttyP6	none			network
    -ttyP7	none			network
    -ttyP8	none			network
    -ttyP9	none			network
    -ttyPa	none			network
    -ttyPb	none			network
    -ttyPc	none			network
    -ttyPd	none			network
    -ttyPe	none			network
    -ttyPf	none			network
    -ttyPg	none			network
    -ttyPh	none			network
    -ttyPi	none			network
    -ttyPj	none			network
    -ttyPk	none			network
    -ttyPl	none			network
    -ttyPm	none			network
    -ttyPn	none			network
    -ttyPo	none			network
    -ttyPp	none			network
    -ttyPq	none			network
    -ttyPr	none			network
    -ttyPs	none			network
    -ttyPt	none			network
    -ttyPu	none			network
    -ttyPv	none			network
    -ttyQ0	none			network
    -ttyQ1	none			network
    -ttyQ2	none			network
    -ttyQ3	none			network
    -ttyQ4	none			network
    -ttyQ5	none			network
    -ttyQ6	none			network
    -ttyQ7	none			network
    -ttyQ8	none			network
    -ttyQ9	none			network
    -ttyQa	none			network
    -ttyQb	none			network
    -ttyQc	none			network
    -ttyQd	none			network
    -ttyQe	none			network
    -ttyQf	none			network
    -ttyQg	none			network
    -ttyQh	none			network
    -ttyQi	none			network
    -ttyQj	none			network
    -ttyQk	none			network
    -ttyQl	none			network
    -ttyQm	none			network
    -ttyQn	none			network
    -ttyQo	none			network
    -ttyQp	none			network
    -ttyQq	none			network
    -ttyQr	none			network
    -ttyQs	none			network
    -ttyQt	none			network
    -ttyQu	none			network
    -ttyQv	none			network
    -ttyR0	none			network
    -ttyR1	none			network
    -ttyR2	none			network
    -ttyR3	none			network
    -ttyR4	none			network
    -ttyR5	none			network
    -ttyR6	none			network
    -ttyR7	none			network
    -ttyR8	none			network
    -ttyR9	none			network
    -ttyRa	none			network
    -ttyRb	none			network
    -ttyRc	none			network
    -ttyRd	none			network
    -ttyRe	none			network
    -ttyRf	none			network
    -ttyRg	none			network
    -ttyRh	none			network
    -ttyRi	none			network
    -ttyRj	none			network
    -ttyRk	none			network
    -ttyRl	none			network
    -ttyRm	none			network
    -ttyRn	none			network
    -ttyRo	none			network
    -ttyRp	none			network
    -ttyRq	none			network
    -ttyRr	none			network
    -ttyRs	none			network
    -ttyRt	none			network
    -ttyRu	none			network
    -ttyRv	none			network
    -ttyS0	none			network
    -ttyS1	none			network
    -ttyS2	none			network
    -ttyS3	none			network
    -ttyS4	none			network
    -ttyS5	none			network
    -ttyS6	none			network
    -ttyS7	none			network
    -ttyS8	none			network
    -ttyS9	none			network
    -ttySa	none			network
    -ttySb	none			network
    -ttySc	none			network
    -ttySd	none			network
    -ttySe	none			network
    -ttySf	none			network
    -ttySg	none			network
    -ttySh	none			network
    -ttySi	none			network
    -ttySj	none			network
    -ttySk	none			network
    -ttySl	none			network
    -ttySm	none			network
    -ttySn	none			network
    -ttySo	none			network
    -ttySp	none			network
    -ttySq	none			network
    -ttySr	none			network
    -ttySs	none			network
    -ttySt	none			network
    -ttySu	none			network
    -ttySv	none			network
    diff --git a/etc/etc.arm/ttys b/etc/etc.arm/ttys
    index 7c3b3341a158..2c8e9ef4643a 100644
    --- a/etc/etc.arm/ttys
    +++ b/etc/etc.arm/ttys
    @@ -15,7 +15,7 @@
     #
     # type The initial terminal type for this port.  For hardwired
     #      terminal lines, this will contain the type of terminal used.
    -#      For virtual consoles, the correct type is typically cons25.
    +#      For virtual consoles, the correct type is typically xterm.
     #      Other common values include network for network connections on
     #      pseudo-terminals, dialup for incoming modem ports, and unknown
     #      when the terminal type cannot be predetermined.
    @@ -30,15 +30,15 @@
     # when going to single-user mode.
     console	none				unknown	off secure
     #
    -ttyv0	"/usr/libexec/getty Pc"		cons25	off  secure
    +ttyv0	"/usr/libexec/getty Pc"		xterm	off  secure
     # Virtual terminals
    -ttyv1	"/usr/libexec/getty Pc"		cons25	off  secure
    -ttyv2	"/usr/libexec/getty Pc"		cons25	off  secure
    -ttyv3	"/usr/libexec/getty Pc"		cons25	off  secure
    -ttyv4	"/usr/libexec/getty Pc"		cons25	off  secure
    -ttyv5	"/usr/libexec/getty Pc"		cons25	off  secure
    -ttyv6	"/usr/libexec/getty Pc"		cons25	off  secure
    -ttyv7	"/usr/libexec/getty Pc"		cons25	off  secure
    +ttyv1	"/usr/libexec/getty Pc"		xterm	off  secure
    +ttyv2	"/usr/libexec/getty Pc"		xterm	off  secure
    +ttyv3	"/usr/libexec/getty Pc"		xterm	off  secure
    +ttyv4	"/usr/libexec/getty Pc"		xterm	off  secure
    +ttyv5	"/usr/libexec/getty Pc"		xterm	off  secure
    +ttyv6	"/usr/libexec/getty Pc"		xterm	off  secure
    +ttyv7	"/usr/libexec/getty Pc"		xterm	off  secure
     #ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
     # Serial terminals
     # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    @@ -48,260 +48,3 @@ ttyu2	"/usr/libexec/getty std.9600"	dialup	off secure
     ttyu3	"/usr/libexec/getty std.9600"	dialup	off secure
     # Dumb console
     dcons	"/usr/libexec/getty std.9600"	vt100	off secure
    -# Pseudo terminals
    -ttyp0	none			network
    -ttyp1	none			network
    -ttyp2	none			network
    -ttyp3	none			network
    -ttyp4	none			network
    -ttyp5	none			network
    -ttyp6	none			network
    -ttyp7	none			network
    -ttyp8	none			network
    -ttyp9	none			network
    -ttypa	none			network
    -ttypb	none			network
    -ttypc	none			network
    -ttypd	none			network
    -ttype	none			network
    -ttypf	none			network
    -ttypg	none			network
    -ttyph	none			network
    -ttypi	none			network
    -ttypj	none			network
    -ttypk	none			network
    -ttypl	none			network
    -ttypm	none			network
    -ttypn	none			network
    -ttypo	none			network
    -ttypp	none			network
    -ttypq	none			network
    -ttypr	none			network
    -ttyps	none			network
    -ttypt	none			network
    -ttypu	none			network
    -ttypv	none			network
    -ttyq0	none			network
    -ttyq1	none			network
    -ttyq2	none			network
    -ttyq3	none			network
    -ttyq4	none			network
    -ttyq5	none			network
    -ttyq6	none			network
    -ttyq7	none			network
    -ttyq8	none			network
    -ttyq9	none			network
    -ttyqa	none			network
    -ttyqb	none			network
    -ttyqc	none			network
    -ttyqd	none			network
    -ttyqe	none			network
    -ttyqf	none			network
    -ttyqg	none			network
    -ttyqh	none			network
    -ttyqi	none			network
    -ttyqj	none			network
    -ttyqk	none			network
    -ttyql	none			network
    -ttyqm	none			network
    -ttyqn	none			network
    -ttyqo	none			network
    -ttyqp	none			network
    -ttyqq	none			network
    -ttyqr	none			network
    -ttyqs	none			network
    -ttyqt	none			network
    -ttyqu	none			network
    -ttyqv	none			network
    -ttyr0	none			network
    -ttyr1	none			network
    -ttyr2	none			network
    -ttyr3	none			network
    -ttyr4	none			network
    -ttyr5	none			network
    -ttyr6	none			network
    -ttyr7	none			network
    -ttyr8	none			network
    -ttyr9	none			network
    -ttyra	none			network
    -ttyrb	none			network
    -ttyrc	none			network
    -ttyrd	none			network
    -ttyre	none			network
    -ttyrf	none			network
    -ttyrg	none			network
    -ttyrh	none			network
    -ttyri	none			network
    -ttyrj	none			network
    -ttyrk	none			network
    -ttyrl	none			network
    -ttyrm	none			network
    -ttyrn	none			network
    -ttyro	none			network
    -ttyrp	none			network
    -ttyrq	none			network
    -ttyrr	none			network
    -ttyrs	none			network
    -ttyrt	none			network
    -ttyru	none			network
    -ttyrv	none			network
    -ttys0	none			network
    -ttys1	none			network
    -ttys2	none			network
    -ttys3	none			network
    -ttys4	none			network
    -ttys5	none			network
    -ttys6	none			network
    -ttys7	none			network
    -ttys8	none			network
    -ttys9	none			network
    -ttysa	none			network
    -ttysb	none			network
    -ttysc	none			network
    -ttysd	none			network
    -ttyse	none			network
    -ttysf	none			network
    -ttysg	none			network
    -ttysh	none			network
    -ttysi	none			network
    -ttysj	none			network
    -ttysk	none			network
    -ttysl	none			network
    -ttysm	none			network
    -ttysn	none			network
    -ttyso	none			network
    -ttysp	none			network
    -ttysq	none			network
    -ttysr	none			network
    -ttyss	none			network
    -ttyst	none			network
    -ttysu	none			network
    -ttysv	none			network
    -ttyP0	none			network
    -ttyP1	none			network
    -ttyP2	none			network
    -ttyP3	none			network
    -ttyP4	none			network
    -ttyP5	none			network
    -ttyP6	none			network
    -ttyP7	none			network
    -ttyP8	none			network
    -ttyP9	none			network
    -ttyPa	none			network
    -ttyPb	none			network
    -ttyPc	none			network
    -ttyPd	none			network
    -ttyPe	none			network
    -ttyPf	none			network
    -ttyPg	none			network
    -ttyPh	none			network
    -ttyPi	none			network
    -ttyPj	none			network
    -ttyPk	none			network
    -ttyPl	none			network
    -ttyPm	none			network
    -ttyPn	none			network
    -ttyPo	none			network
    -ttyPp	none			network
    -ttyPq	none			network
    -ttyPr	none			network
    -ttyPs	none			network
    -ttyPt	none			network
    -ttyPu	none			network
    -ttyPv	none			network
    -ttyQ0	none			network
    -ttyQ1	none			network
    -ttyQ2	none			network
    -ttyQ3	none			network
    -ttyQ4	none			network
    -ttyQ5	none			network
    -ttyQ6	none			network
    -ttyQ7	none			network
    -ttyQ8	none			network
    -ttyQ9	none			network
    -ttyQa	none			network
    -ttyQb	none			network
    -ttyQc	none			network
    -ttyQd	none			network
    -ttyQe	none			network
    -ttyQf	none			network
    -ttyQg	none			network
    -ttyQh	none			network
    -ttyQi	none			network
    -ttyQj	none			network
    -ttyQk	none			network
    -ttyQl	none			network
    -ttyQm	none			network
    -ttyQn	none			network
    -ttyQo	none			network
    -ttyQp	none			network
    -ttyQq	none			network
    -ttyQr	none			network
    -ttyQs	none			network
    -ttyQt	none			network
    -ttyQu	none			network
    -ttyQv	none			network
    -ttyR0	none			network
    -ttyR1	none			network
    -ttyR2	none			network
    -ttyR3	none			network
    -ttyR4	none			network
    -ttyR5	none			network
    -ttyR6	none			network
    -ttyR7	none			network
    -ttyR8	none			network
    -ttyR9	none			network
    -ttyRa	none			network
    -ttyRb	none			network
    -ttyRc	none			network
    -ttyRd	none			network
    -ttyRe	none			network
    -ttyRf	none			network
    -ttyRg	none			network
    -ttyRh	none			network
    -ttyRi	none			network
    -ttyRj	none			network
    -ttyRk	none			network
    -ttyRl	none			network
    -ttyRm	none			network
    -ttyRn	none			network
    -ttyRo	none			network
    -ttyRp	none			network
    -ttyRq	none			network
    -ttyRr	none			network
    -ttyRs	none			network
    -ttyRt	none			network
    -ttyRu	none			network
    -ttyRv	none			network
    -ttyS0	none			network
    -ttyS1	none			network
    -ttyS2	none			network
    -ttyS3	none			network
    -ttyS4	none			network
    -ttyS5	none			network
    -ttyS6	none			network
    -ttyS7	none			network
    -ttyS8	none			network
    -ttyS9	none			network
    -ttySa	none			network
    -ttySb	none			network
    -ttySc	none			network
    -ttySd	none			network
    -ttySe	none			network
    -ttySf	none			network
    -ttySg	none			network
    -ttySh	none			network
    -ttySi	none			network
    -ttySj	none			network
    -ttySk	none			network
    -ttySl	none			network
    -ttySm	none			network
    -ttySn	none			network
    -ttySo	none			network
    -ttySp	none			network
    -ttySq	none			network
    -ttySr	none			network
    -ttySs	none			network
    -ttySt	none			network
    -ttySu	none			network
    -ttySv	none			network
    diff --git a/etc/etc.i386/ttys b/etc/etc.i386/ttys
    index c4650cbdb03b..39205470e709 100644
    --- a/etc/etc.i386/ttys
    +++ b/etc/etc.i386/ttys
    @@ -15,7 +15,7 @@
     #
     # type The initial terminal type for this port.  For hardwired
     #      terminal lines, this will contain the type of terminal used.
    -#      For virtual consoles, the correct type is typically cons25.
    +#      For virtual consoles, the correct type is typically xterm.
     #      Other common values include network for network connections on
     #      pseudo-terminals, dialup for incoming modem ports, and unknown
     #      when the terminal type cannot be predetermined.
    @@ -30,15 +30,15 @@
     # when going to single-user mode.
     console	none				unknown	off secure
     #
    -ttyv0	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv0	"/usr/libexec/getty Pc"		xterm	on  secure
     # Virtual terminals
    -ttyv1	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv2	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv3	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv4	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv5	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv6	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv7	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv1	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv2	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv3	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv4	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv5	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv6	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv7	"/usr/libexec/getty Pc"		xterm	on  secure
     ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
     # Serial terminals
     # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    @@ -48,260 +48,3 @@ ttyu2	"/usr/libexec/getty std.9600"	dialup	off secure
     ttyu3	"/usr/libexec/getty std.9600"	dialup	off secure
     # Dumb console
     dcons	"/usr/libexec/getty std.9600"	vt100	off secure
    -# Pseudo terminals
    -ttyp0	none			network
    -ttyp1	none			network
    -ttyp2	none			network
    -ttyp3	none			network
    -ttyp4	none			network
    -ttyp5	none			network
    -ttyp6	none			network
    -ttyp7	none			network
    -ttyp8	none			network
    -ttyp9	none			network
    -ttypa	none			network
    -ttypb	none			network
    -ttypc	none			network
    -ttypd	none			network
    -ttype	none			network
    -ttypf	none			network
    -ttypg	none			network
    -ttyph	none			network
    -ttypi	none			network
    -ttypj	none			network
    -ttypk	none			network
    -ttypl	none			network
    -ttypm	none			network
    -ttypn	none			network
    -ttypo	none			network
    -ttypp	none			network
    -ttypq	none			network
    -ttypr	none			network
    -ttyps	none			network
    -ttypt	none			network
    -ttypu	none			network
    -ttypv	none			network
    -ttyq0	none			network
    -ttyq1	none			network
    -ttyq2	none			network
    -ttyq3	none			network
    -ttyq4	none			network
    -ttyq5	none			network
    -ttyq6	none			network
    -ttyq7	none			network
    -ttyq8	none			network
    -ttyq9	none			network
    -ttyqa	none			network
    -ttyqb	none			network
    -ttyqc	none			network
    -ttyqd	none			network
    -ttyqe	none			network
    -ttyqf	none			network
    -ttyqg	none			network
    -ttyqh	none			network
    -ttyqi	none			network
    -ttyqj	none			network
    -ttyqk	none			network
    -ttyql	none			network
    -ttyqm	none			network
    -ttyqn	none			network
    -ttyqo	none			network
    -ttyqp	none			network
    -ttyqq	none			network
    -ttyqr	none			network
    -ttyqs	none			network
    -ttyqt	none			network
    -ttyqu	none			network
    -ttyqv	none			network
    -ttyr0	none			network
    -ttyr1	none			network
    -ttyr2	none			network
    -ttyr3	none			network
    -ttyr4	none			network
    -ttyr5	none			network
    -ttyr6	none			network
    -ttyr7	none			network
    -ttyr8	none			network
    -ttyr9	none			network
    -ttyra	none			network
    -ttyrb	none			network
    -ttyrc	none			network
    -ttyrd	none			network
    -ttyre	none			network
    -ttyrf	none			network
    -ttyrg	none			network
    -ttyrh	none			network
    -ttyri	none			network
    -ttyrj	none			network
    -ttyrk	none			network
    -ttyrl	none			network
    -ttyrm	none			network
    -ttyrn	none			network
    -ttyro	none			network
    -ttyrp	none			network
    -ttyrq	none			network
    -ttyrr	none			network
    -ttyrs	none			network
    -ttyrt	none			network
    -ttyru	none			network
    -ttyrv	none			network
    -ttys0	none			network
    -ttys1	none			network
    -ttys2	none			network
    -ttys3	none			network
    -ttys4	none			network
    -ttys5	none			network
    -ttys6	none			network
    -ttys7	none			network
    -ttys8	none			network
    -ttys9	none			network
    -ttysa	none			network
    -ttysb	none			network
    -ttysc	none			network
    -ttysd	none			network
    -ttyse	none			network
    -ttysf	none			network
    -ttysg	none			network
    -ttysh	none			network
    -ttysi	none			network
    -ttysj	none			network
    -ttysk	none			network
    -ttysl	none			network
    -ttysm	none			network
    -ttysn	none			network
    -ttyso	none			network
    -ttysp	none			network
    -ttysq	none			network
    -ttysr	none			network
    -ttyss	none			network
    -ttyst	none			network
    -ttysu	none			network
    -ttysv	none			network
    -ttyP0	none			network
    -ttyP1	none			network
    -ttyP2	none			network
    -ttyP3	none			network
    -ttyP4	none			network
    -ttyP5	none			network
    -ttyP6	none			network
    -ttyP7	none			network
    -ttyP8	none			network
    -ttyP9	none			network
    -ttyPa	none			network
    -ttyPb	none			network
    -ttyPc	none			network
    -ttyPd	none			network
    -ttyPe	none			network
    -ttyPf	none			network
    -ttyPg	none			network
    -ttyPh	none			network
    -ttyPi	none			network
    -ttyPj	none			network
    -ttyPk	none			network
    -ttyPl	none			network
    -ttyPm	none			network
    -ttyPn	none			network
    -ttyPo	none			network
    -ttyPp	none			network
    -ttyPq	none			network
    -ttyPr	none			network
    -ttyPs	none			network
    -ttyPt	none			network
    -ttyPu	none			network
    -ttyPv	none			network
    -ttyQ0	none			network
    -ttyQ1	none			network
    -ttyQ2	none			network
    -ttyQ3	none			network
    -ttyQ4	none			network
    -ttyQ5	none			network
    -ttyQ6	none			network
    -ttyQ7	none			network
    -ttyQ8	none			network
    -ttyQ9	none			network
    -ttyQa	none			network
    -ttyQb	none			network
    -ttyQc	none			network
    -ttyQd	none			network
    -ttyQe	none			network
    -ttyQf	none			network
    -ttyQg	none			network
    -ttyQh	none			network
    -ttyQi	none			network
    -ttyQj	none			network
    -ttyQk	none			network
    -ttyQl	none			network
    -ttyQm	none			network
    -ttyQn	none			network
    -ttyQo	none			network
    -ttyQp	none			network
    -ttyQq	none			network
    -ttyQr	none			network
    -ttyQs	none			network
    -ttyQt	none			network
    -ttyQu	none			network
    -ttyQv	none			network
    -ttyR0	none			network
    -ttyR1	none			network
    -ttyR2	none			network
    -ttyR3	none			network
    -ttyR4	none			network
    -ttyR5	none			network
    -ttyR6	none			network
    -ttyR7	none			network
    -ttyR8	none			network
    -ttyR9	none			network
    -ttyRa	none			network
    -ttyRb	none			network
    -ttyRc	none			network
    -ttyRd	none			network
    -ttyRe	none			network
    -ttyRf	none			network
    -ttyRg	none			network
    -ttyRh	none			network
    -ttyRi	none			network
    -ttyRj	none			network
    -ttyRk	none			network
    -ttyRl	none			network
    -ttyRm	none			network
    -ttyRn	none			network
    -ttyRo	none			network
    -ttyRp	none			network
    -ttyRq	none			network
    -ttyRr	none			network
    -ttyRs	none			network
    -ttyRt	none			network
    -ttyRu	none			network
    -ttyRv	none			network
    -ttyS0	none			network
    -ttyS1	none			network
    -ttyS2	none			network
    -ttyS3	none			network
    -ttyS4	none			network
    -ttyS5	none			network
    -ttyS6	none			network
    -ttyS7	none			network
    -ttyS8	none			network
    -ttyS9	none			network
    -ttySa	none			network
    -ttySb	none			network
    -ttySc	none			network
    -ttySd	none			network
    -ttySe	none			network
    -ttySf	none			network
    -ttySg	none			network
    -ttySh	none			network
    -ttySi	none			network
    -ttySj	none			network
    -ttySk	none			network
    -ttySl	none			network
    -ttySm	none			network
    -ttySn	none			network
    -ttySo	none			network
    -ttySp	none			network
    -ttySq	none			network
    -ttySr	none			network
    -ttySs	none			network
    -ttySt	none			network
    -ttySu	none			network
    -ttySv	none			network
    diff --git a/etc/etc.ia64/ttys b/etc/etc.ia64/ttys
    index acacb90aa3b3..4c7bc127ff8c 100644
    --- a/etc/etc.ia64/ttys
    +++ b/etc/etc.ia64/ttys
    @@ -15,7 +15,7 @@
     #
     # type The initial terminal type for this port.  For hardwired
     #      terminal lines, this will contain the type of terminal used.
    -#      For virtual consoles, the correct type is typically cons25.
    +#      For virtual consoles, the correct type is typically xterm.
     #      Other common values include network for network connections on
     #      pseudo-terminals, dialup for incoming modem ports, and unknown
     #      when the terminal type cannot be predetermined.
    @@ -30,15 +30,15 @@
     # when going to single-user mode.
     console	none				unknown	off secure
     #
    -ttyv0	"/usr/libexec/getty Pc"		cons25	off secure
    -# Virtual terminals.
    -ttyv1	"/usr/libexec/getty Pc"		cons25	off secure
    -ttyv2	"/usr/libexec/getty Pc"		cons25	off secure
    -ttyv3	"/usr/libexec/getty Pc"		cons25	off secure
    -ttyv4	"/usr/libexec/getty Pc"		cons25	off secure
    -ttyv5	"/usr/libexec/getty Pc"		cons25	off secure
    -ttyv6	"/usr/libexec/getty Pc"		cons25	off secure
    -ttyv7	"/usr/libexec/getty Pc"		cons25	off secure
    +ttyv0	"/usr/libexec/getty Pc"		xterm	off secure
    +# Virtual terminals
    +ttyv1	"/usr/libexec/getty Pc"		xterm	off secure
    +ttyv2	"/usr/libexec/getty Pc"		xterm	off secure
    +ttyv3	"/usr/libexec/getty Pc"		xterm	off secure
    +ttyv4	"/usr/libexec/getty Pc"		xterm	off secure
    +ttyv5	"/usr/libexec/getty Pc"		xterm	off secure
    +ttyv6	"/usr/libexec/getty Pc"		xterm	off secure
    +ttyv7	"/usr/libexec/getty Pc"		xterm	off secure
     ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
     # Serial terminals. The 'dialup' keyword identifies dialin lines to login,
     # fingerd etc.
    @@ -48,260 +48,3 @@ ttyu2	"/usr/libexec/getty std.9600"	dialup	off secure
     ttyu3	"/usr/libexec/getty std.9600"	dialup	off secure
     # Dumb console
     dcons	"/usr/libexec/getty std.9600"	vt100	off secure
    -# Pseudo terminals.
    -ttyp0	none			network
    -ttyp1	none			network
    -ttyp2	none			network
    -ttyp3	none			network
    -ttyp4	none			network
    -ttyp5	none			network
    -ttyp6	none			network
    -ttyp7	none			network
    -ttyp8	none			network
    -ttyp9	none			network
    -ttypa	none			network
    -ttypb	none			network
    -ttypc	none			network
    -ttypd	none			network
    -ttype	none			network
    -ttypf	none			network
    -ttypg	none			network
    -ttyph	none			network
    -ttypi	none			network
    -ttypj	none			network
    -ttypk	none			network
    -ttypl	none			network
    -ttypm	none			network
    -ttypn	none			network
    -ttypo	none			network
    -ttypp	none			network
    -ttypq	none			network
    -ttypr	none			network
    -ttyps	none			network
    -ttypt	none			network
    -ttypu	none			network
    -ttypv	none			network
    -ttyq0	none			network
    -ttyq1	none			network
    -ttyq2	none			network
    -ttyq3	none			network
    -ttyq4	none			network
    -ttyq5	none			network
    -ttyq6	none			network
    -ttyq7	none			network
    -ttyq8	none			network
    -ttyq9	none			network
    -ttyqa	none			network
    -ttyqb	none			network
    -ttyqc	none			network
    -ttyqd	none			network
    -ttyqe	none			network
    -ttyqf	none			network
    -ttyqg	none			network
    -ttyqh	none			network
    -ttyqi	none			network
    -ttyqj	none			network
    -ttyqk	none			network
    -ttyql	none			network
    -ttyqm	none			network
    -ttyqn	none			network
    -ttyqo	none			network
    -ttyqp	none			network
    -ttyqq	none			network
    -ttyqr	none			network
    -ttyqs	none			network
    -ttyqt	none			network
    -ttyqu	none			network
    -ttyqv	none			network
    -ttyr0	none			network
    -ttyr1	none			network
    -ttyr2	none			network
    -ttyr3	none			network
    -ttyr4	none			network
    -ttyr5	none			network
    -ttyr6	none			network
    -ttyr7	none			network
    -ttyr8	none			network
    -ttyr9	none			network
    -ttyra	none			network
    -ttyrb	none			network
    -ttyrc	none			network
    -ttyrd	none			network
    -ttyre	none			network
    -ttyrf	none			network
    -ttyrg	none			network
    -ttyrh	none			network
    -ttyri	none			network
    -ttyrj	none			network
    -ttyrk	none			network
    -ttyrl	none			network
    -ttyrm	none			network
    -ttyrn	none			network
    -ttyro	none			network
    -ttyrp	none			network
    -ttyrq	none			network
    -ttyrr	none			network
    -ttyrs	none			network
    -ttyrt	none			network
    -ttyru	none			network
    -ttyrv	none			network
    -ttys0	none			network
    -ttys1	none			network
    -ttys2	none			network
    -ttys3	none			network
    -ttys4	none			network
    -ttys5	none			network
    -ttys6	none			network
    -ttys7	none			network
    -ttys8	none			network
    -ttys9	none			network
    -ttysa	none			network
    -ttysb	none			network
    -ttysc	none			network
    -ttysd	none			network
    -ttyse	none			network
    -ttysf	none			network
    -ttysg	none			network
    -ttysh	none			network
    -ttysi	none			network
    -ttysj	none			network
    -ttysk	none			network
    -ttysl	none			network
    -ttysm	none			network
    -ttysn	none			network
    -ttyso	none			network
    -ttysp	none			network
    -ttysq	none			network
    -ttysr	none			network
    -ttyss	none			network
    -ttyst	none			network
    -ttysu	none			network
    -ttysv	none			network
    -ttyP0	none			network
    -ttyP1	none			network
    -ttyP2	none			network
    -ttyP3	none			network
    -ttyP4	none			network
    -ttyP5	none			network
    -ttyP6	none			network
    -ttyP7	none			network
    -ttyP8	none			network
    -ttyP9	none			network
    -ttyPa	none			network
    -ttyPb	none			network
    -ttyPc	none			network
    -ttyPd	none			network
    -ttyPe	none			network
    -ttyPf	none			network
    -ttyPg	none			network
    -ttyPh	none			network
    -ttyPi	none			network
    -ttyPj	none			network
    -ttyPk	none			network
    -ttyPl	none			network
    -ttyPm	none			network
    -ttyPn	none			network
    -ttyPo	none			network
    -ttyPp	none			network
    -ttyPq	none			network
    -ttyPr	none			network
    -ttyPs	none			network
    -ttyPt	none			network
    -ttyPu	none			network
    -ttyPv	none			network
    -ttyQ0	none			network
    -ttyQ1	none			network
    -ttyQ2	none			network
    -ttyQ3	none			network
    -ttyQ4	none			network
    -ttyQ5	none			network
    -ttyQ6	none			network
    -ttyQ7	none			network
    -ttyQ8	none			network
    -ttyQ9	none			network
    -ttyQa	none			network
    -ttyQb	none			network
    -ttyQc	none			network
    -ttyQd	none			network
    -ttyQe	none			network
    -ttyQf	none			network
    -ttyQg	none			network
    -ttyQh	none			network
    -ttyQi	none			network
    -ttyQj	none			network
    -ttyQk	none			network
    -ttyQl	none			network
    -ttyQm	none			network
    -ttyQn	none			network
    -ttyQo	none			network
    -ttyQp	none			network
    -ttyQq	none			network
    -ttyQr	none			network
    -ttyQs	none			network
    -ttyQt	none			network
    -ttyQu	none			network
    -ttyQv	none			network
    -ttyR0	none			network
    -ttyR1	none			network
    -ttyR2	none			network
    -ttyR3	none			network
    -ttyR4	none			network
    -ttyR5	none			network
    -ttyR6	none			network
    -ttyR7	none			network
    -ttyR8	none			network
    -ttyR9	none			network
    -ttyRa	none			network
    -ttyRb	none			network
    -ttyRc	none			network
    -ttyRd	none			network
    -ttyRe	none			network
    -ttyRf	none			network
    -ttyRg	none			network
    -ttyRh	none			network
    -ttyRi	none			network
    -ttyRj	none			network
    -ttyRk	none			network
    -ttyRl	none			network
    -ttyRm	none			network
    -ttyRn	none			network
    -ttyRo	none			network
    -ttyRp	none			network
    -ttyRq	none			network
    -ttyRr	none			network
    -ttyRs	none			network
    -ttyRt	none			network
    -ttyRu	none			network
    -ttyRv	none			network
    -ttyS0	none			network
    -ttyS1	none			network
    -ttyS2	none			network
    -ttyS3	none			network
    -ttyS4	none			network
    -ttyS5	none			network
    -ttyS6	none			network
    -ttyS7	none			network
    -ttyS8	none			network
    -ttyS9	none			network
    -ttySa	none			network
    -ttySb	none			network
    -ttySc	none			network
    -ttySd	none			network
    -ttySe	none			network
    -ttySf	none			network
    -ttySg	none			network
    -ttySh	none			network
    -ttySi	none			network
    -ttySj	none			network
    -ttySk	none			network
    -ttySl	none			network
    -ttySm	none			network
    -ttySn	none			network
    -ttySo	none			network
    -ttySp	none			network
    -ttySq	none			network
    -ttySr	none			network
    -ttySs	none			network
    -ttySt	none			network
    -ttySu	none			network
    -ttySv	none			network
    diff --git a/etc/etc.mips/ttys b/etc/etc.mips/ttys
    index 55e58ae2a14b..fdbeb723f250 100644
    --- a/etc/etc.mips/ttys
    +++ b/etc/etc.mips/ttys
    @@ -15,7 +15,7 @@
     #
     # type The initial terminal type for this port.  For hardwired
     #      terminal lines, this will contain the type of terminal used.
    -#      For virtual consoles, the correct type is typically cons25.
    +#      For virtual consoles, the correct type is typically xterm.
     #      Other common values include network for network connections on
     #      pseudo-terminals, dialup for incoming modem ports, and unknown
     #      when the terminal type cannot be predetermined.
    @@ -35,260 +35,3 @@ ttyu0	"/usr/libexec/getty std.115200"	dialup	on  secure
     ttyu1	"/usr/libexec/getty std.115200"	dialup	off secure
     ttyu2	"/usr/libexec/getty std.115200"	dialup	off secure
     ttyu3	"/usr/libexec/getty std.115200"	dialup	off secure
    -# Pseudo terminals
    -ttyp0	none			network
    -ttyp1	none			network
    -ttyp2	none			network
    -ttyp3	none			network
    -ttyp4	none			network
    -ttyp5	none			network
    -ttyp6	none			network
    -ttyp7	none			network
    -ttyp8	none			network
    -ttyp9	none			network
    -ttypa	none			network
    -ttypb	none			network
    -ttypc	none			network
    -ttypd	none			network
    -ttype	none			network
    -ttypf	none			network
    -ttypg	none			network
    -ttyph	none			network
    -ttypi	none			network
    -ttypj	none			network
    -ttypk	none			network
    -ttypl	none			network
    -ttypm	none			network
    -ttypn	none			network
    -ttypo	none			network
    -ttypp	none			network
    -ttypq	none			network
    -ttypr	none			network
    -ttyps	none			network
    -ttypt	none			network
    -ttypu	none			network
    -ttypv	none			network
    -ttyq0	none			network
    -ttyq1	none			network
    -ttyq2	none			network
    -ttyq3	none			network
    -ttyq4	none			network
    -ttyq5	none			network
    -ttyq6	none			network
    -ttyq7	none			network
    -ttyq8	none			network
    -ttyq9	none			network
    -ttyqa	none			network
    -ttyqb	none			network
    -ttyqc	none			network
    -ttyqd	none			network
    -ttyqe	none			network
    -ttyqf	none			network
    -ttyqg	none			network
    -ttyqh	none			network
    -ttyqi	none			network
    -ttyqj	none			network
    -ttyqk	none			network
    -ttyql	none			network
    -ttyqm	none			network
    -ttyqn	none			network
    -ttyqo	none			network
    -ttyqp	none			network
    -ttyqq	none			network
    -ttyqr	none			network
    -ttyqs	none			network
    -ttyqt	none			network
    -ttyqu	none			network
    -ttyqv	none			network
    -ttyr0	none			network
    -ttyr1	none			network
    -ttyr2	none			network
    -ttyr3	none			network
    -ttyr4	none			network
    -ttyr5	none			network
    -ttyr6	none			network
    -ttyr7	none			network
    -ttyr8	none			network
    -ttyr9	none			network
    -ttyra	none			network
    -ttyrb	none			network
    -ttyrc	none			network
    -ttyrd	none			network
    -ttyre	none			network
    -ttyrf	none			network
    -ttyrg	none			network
    -ttyrh	none			network
    -ttyri	none			network
    -ttyrj	none			network
    -ttyrk	none			network
    -ttyrl	none			network
    -ttyrm	none			network
    -ttyrn	none			network
    -ttyro	none			network
    -ttyrp	none			network
    -ttyrq	none			network
    -ttyrr	none			network
    -ttyrs	none			network
    -ttyrt	none			network
    -ttyru	none			network
    -ttyrv	none			network
    -ttys0	none			network
    -ttys1	none			network
    -ttys2	none			network
    -ttys3	none			network
    -ttys4	none			network
    -ttys5	none			network
    -ttys6	none			network
    -ttys7	none			network
    -ttys8	none			network
    -ttys9	none			network
    -ttysa	none			network
    -ttysb	none			network
    -ttysc	none			network
    -ttysd	none			network
    -ttyse	none			network
    -ttysf	none			network
    -ttysg	none			network
    -ttysh	none			network
    -ttysi	none			network
    -ttysj	none			network
    -ttysk	none			network
    -ttysl	none			network
    -ttysm	none			network
    -ttysn	none			network
    -ttyso	none			network
    -ttysp	none			network
    -ttysq	none			network
    -ttysr	none			network
    -ttyss	none			network
    -ttyst	none			network
    -ttysu	none			network
    -ttysv	none			network
    -ttyP0	none			network
    -ttyP1	none			network
    -ttyP2	none			network
    -ttyP3	none			network
    -ttyP4	none			network
    -ttyP5	none			network
    -ttyP6	none			network
    -ttyP7	none			network
    -ttyP8	none			network
    -ttyP9	none			network
    -ttyPa	none			network
    -ttyPb	none			network
    -ttyPc	none			network
    -ttyPd	none			network
    -ttyPe	none			network
    -ttyPf	none			network
    -ttyPg	none			network
    -ttyPh	none			network
    -ttyPi	none			network
    -ttyPj	none			network
    -ttyPk	none			network
    -ttyPl	none			network
    -ttyPm	none			network
    -ttyPn	none			network
    -ttyPo	none			network
    -ttyPp	none			network
    -ttyPq	none			network
    -ttyPr	none			network
    -ttyPs	none			network
    -ttyPt	none			network
    -ttyPu	none			network
    -ttyPv	none			network
    -ttyQ0	none			network
    -ttyQ1	none			network
    -ttyQ2	none			network
    -ttyQ3	none			network
    -ttyQ4	none			network
    -ttyQ5	none			network
    -ttyQ6	none			network
    -ttyQ7	none			network
    -ttyQ8	none			network
    -ttyQ9	none			network
    -ttyQa	none			network
    -ttyQb	none			network
    -ttyQc	none			network
    -ttyQd	none			network
    -ttyQe	none			network
    -ttyQf	none			network
    -ttyQg	none			network
    -ttyQh	none			network
    -ttyQi	none			network
    -ttyQj	none			network
    -ttyQk	none			network
    -ttyQl	none			network
    -ttyQm	none			network
    -ttyQn	none			network
    -ttyQo	none			network
    -ttyQp	none			network
    -ttyQq	none			network
    -ttyQr	none			network
    -ttyQs	none			network
    -ttyQt	none			network
    -ttyQu	none			network
    -ttyQv	none			network
    -ttyR0	none			network
    -ttyR1	none			network
    -ttyR2	none			network
    -ttyR3	none			network
    -ttyR4	none			network
    -ttyR5	none			network
    -ttyR6	none			network
    -ttyR7	none			network
    -ttyR8	none			network
    -ttyR9	none			network
    -ttyRa	none			network
    -ttyRb	none			network
    -ttyRc	none			network
    -ttyRd	none			network
    -ttyRe	none			network
    -ttyRf	none			network
    -ttyRg	none			network
    -ttyRh	none			network
    -ttyRi	none			network
    -ttyRj	none			network
    -ttyRk	none			network
    -ttyRl	none			network
    -ttyRm	none			network
    -ttyRn	none			network
    -ttyRo	none			network
    -ttyRp	none			network
    -ttyRq	none			network
    -ttyRr	none			network
    -ttyRs	none			network
    -ttyRt	none			network
    -ttyRu	none			network
    -ttyRv	none			network
    -ttyS0	none			network
    -ttyS1	none			network
    -ttyS2	none			network
    -ttyS3	none			network
    -ttyS4	none			network
    -ttyS5	none			network
    -ttyS6	none			network
    -ttyS7	none			network
    -ttyS8	none			network
    -ttyS9	none			network
    -ttySa	none			network
    -ttySb	none			network
    -ttySc	none			network
    -ttySd	none			network
    -ttySe	none			network
    -ttySf	none			network
    -ttySg	none			network
    -ttySh	none			network
    -ttySi	none			network
    -ttySj	none			network
    -ttySk	none			network
    -ttySl	none			network
    -ttySm	none			network
    -ttySn	none			network
    -ttySo	none			network
    -ttySp	none			network
    -ttySq	none			network
    -ttySr	none			network
    -ttySs	none			network
    -ttySt	none			network
    -ttySu	none			network
    -ttySv	none			network
    diff --git a/etc/etc.pc98/ttys b/etc/etc.pc98/ttys
    new file mode 100644
    index 000000000000..bf4b5583a56a
    --- /dev/null
    +++ b/etc/etc.pc98/ttys
    @@ -0,0 +1,50 @@
    +#
    +# $FreeBSD$
    +#	@(#)ttys	5.1 (Berkeley) 4/17/89
    +#
    +# This file specifies various information about terminals on the system.
    +# It is used by several different programs.  Common entries for the
    +# various columns include:
    +#
    +# name  The name of the terminal device.
    +#
    +# getty The program to start running on the terminal.  Typically a
    +#       getty program, as the name implies.  Other common entries
    +#       include none, when no getty is needed, and xdm, to start the
    +#       X Window System.
    +#
    +# type The initial terminal type for this port.  For hardwired
    +#      terminal lines, this will contain the type of terminal used.
    +#      For virtual consoles, the correct type is typically cons25w.
    +#      Other common values include network for network connections on
    +#      pseudo-terminals, dialup for incoming modem ports, and unknown
    +#      when the terminal type cannot be predetermined.
    +#
    +# status Must be on or off.  If on, init will run the getty program on
    +#        the specified port.  If the word "secure" appears, this tty
    +#        allows root login.
    +#
    +# name	getty				type	status		comments
    +#
    +# If console is marked "insecure", then init will ask for the root password
    +# when going to single-user mode.
    +console	none				unknown	off secure
    +#
    +ttyv0	"/usr/libexec/getty Pc"		cons25w	on  secure
    +# Virtual terminals
    +ttyv1	"/usr/libexec/getty Pc"		cons25w	on  secure
    +ttyv2	"/usr/libexec/getty Pc"		cons25w	on  secure
    +ttyv3	"/usr/libexec/getty Pc"		cons25w	on  secure
    +ttyv4	"/usr/libexec/getty Pc"		cons25w	on  secure
    +ttyv5	"/usr/libexec/getty Pc"		cons25w	on  secure
    +ttyv6	"/usr/libexec/getty Pc"		cons25w	on  secure
    +ttyv7	"/usr/libexec/getty Pc"		cons25w	on  secure
    +ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
    +# Serial terminals
    +# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    +ttyu0	"/usr/libexec/getty std.9600"	dialup	off secure
    +ttyu1	"/usr/libexec/getty std.9600"	dialup	off secure
    +ttyu2	"/usr/libexec/getty std.9600"	dialup	off secure
    +ttyu3	"/usr/libexec/getty std.9600"	dialup	off secure
    +# Dumb console
    +dcons	"/usr/libexec/getty std.9600"	vt100	off secure
    diff --git a/etc/etc.powerpc/ttys b/etc/etc.powerpc/ttys
    index 96408ed7830b..6a04446b614a 100644
    --- a/etc/etc.powerpc/ttys
    +++ b/etc/etc.powerpc/ttys
    @@ -15,7 +15,7 @@
     #
     # type The initial terminal type for this port.  For hardwired
     #      terminal lines, this will contain the type of terminal used.
    -#      For virtual consoles, the correct type is typically cons25.
    +#      For virtual consoles, the correct type is typically xterm.
     #      Other common values include network for network connections on
     #      pseudo-terminals, dialup for incoming modem ports, and unknown
     #      when the terminal type cannot be predetermined.
    @@ -30,15 +30,15 @@
     # when going to single-user mode.
     console	none				unknown	off secure
     #
    -ttyv0	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv0	"/usr/libexec/getty Pc"		xterm	on  secure
     # Virtual terminals
    -ttyv1	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv2	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv3	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv4	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv5	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv6	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv7	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv1	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv2	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv3	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv4	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv5	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv6	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv7	"/usr/libexec/getty Pc"		xterm	on  secure
     #ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
     # Serial terminals
     # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    @@ -48,260 +48,3 @@ ttyu2	"/usr/libexec/getty std.9600"	dialup	off secure
     ttyu3	"/usr/libexec/getty std.9600"	dialup	off secure
     # Dumb console
     dcons	"/usr/libexec/getty std.9600"	vt100	off secure
    -# Pseudo terminals
    -ttyp0	none			network
    -ttyp1	none			network
    -ttyp2	none			network
    -ttyp3	none			network
    -ttyp4	none			network
    -ttyp5	none			network
    -ttyp6	none			network
    -ttyp7	none			network
    -ttyp8	none			network
    -ttyp9	none			network
    -ttypa	none			network
    -ttypb	none			network
    -ttypc	none			network
    -ttypd	none			network
    -ttype	none			network
    -ttypf	none			network
    -ttypg	none			network
    -ttyph	none			network
    -ttypi	none			network
    -ttypj	none			network
    -ttypk	none			network
    -ttypl	none			network
    -ttypm	none			network
    -ttypn	none			network
    -ttypo	none			network
    -ttypp	none			network
    -ttypq	none			network
    -ttypr	none			network
    -ttyps	none			network
    -ttypt	none			network
    -ttypu	none			network
    -ttypv	none			network
    -ttyq0	none			network
    -ttyq1	none			network
    -ttyq2	none			network
    -ttyq3	none			network
    -ttyq4	none			network
    -ttyq5	none			network
    -ttyq6	none			network
    -ttyq7	none			network
    -ttyq8	none			network
    -ttyq9	none			network
    -ttyqa	none			network
    -ttyqb	none			network
    -ttyqc	none			network
    -ttyqd	none			network
    -ttyqe	none			network
    -ttyqf	none			network
    -ttyqg	none			network
    -ttyqh	none			network
    -ttyqi	none			network
    -ttyqj	none			network
    -ttyqk	none			network
    -ttyql	none			network
    -ttyqm	none			network
    -ttyqn	none			network
    -ttyqo	none			network
    -ttyqp	none			network
    -ttyqq	none			network
    -ttyqr	none			network
    -ttyqs	none			network
    -ttyqt	none			network
    -ttyqu	none			network
    -ttyqv	none			network
    -ttyr0	none			network
    -ttyr1	none			network
    -ttyr2	none			network
    -ttyr3	none			network
    -ttyr4	none			network
    -ttyr5	none			network
    -ttyr6	none			network
    -ttyr7	none			network
    -ttyr8	none			network
    -ttyr9	none			network
    -ttyra	none			network
    -ttyrb	none			network
    -ttyrc	none			network
    -ttyrd	none			network
    -ttyre	none			network
    -ttyrf	none			network
    -ttyrg	none			network
    -ttyrh	none			network
    -ttyri	none			network
    -ttyrj	none			network
    -ttyrk	none			network
    -ttyrl	none			network
    -ttyrm	none			network
    -ttyrn	none			network
    -ttyro	none			network
    -ttyrp	none			network
    -ttyrq	none			network
    -ttyrr	none			network
    -ttyrs	none			network
    -ttyrt	none			network
    -ttyru	none			network
    -ttyrv	none			network
    -ttys0	none			network
    -ttys1	none			network
    -ttys2	none			network
    -ttys3	none			network
    -ttys4	none			network
    -ttys5	none			network
    -ttys6	none			network
    -ttys7	none			network
    -ttys8	none			network
    -ttys9	none			network
    -ttysa	none			network
    -ttysb	none			network
    -ttysc	none			network
    -ttysd	none			network
    -ttyse	none			network
    -ttysf	none			network
    -ttysg	none			network
    -ttysh	none			network
    -ttysi	none			network
    -ttysj	none			network
    -ttysk	none			network
    -ttysl	none			network
    -ttysm	none			network
    -ttysn	none			network
    -ttyso	none			network
    -ttysp	none			network
    -ttysq	none			network
    -ttysr	none			network
    -ttyss	none			network
    -ttyst	none			network
    -ttysu	none			network
    -ttysv	none			network
    -ttyP0	none			network
    -ttyP1	none			network
    -ttyP2	none			network
    -ttyP3	none			network
    -ttyP4	none			network
    -ttyP5	none			network
    -ttyP6	none			network
    -ttyP7	none			network
    -ttyP8	none			network
    -ttyP9	none			network
    -ttyPa	none			network
    -ttyPb	none			network
    -ttyPc	none			network
    -ttyPd	none			network
    -ttyPe	none			network
    -ttyPf	none			network
    -ttyPg	none			network
    -ttyPh	none			network
    -ttyPi	none			network
    -ttyPj	none			network
    -ttyPk	none			network
    -ttyPl	none			network
    -ttyPm	none			network
    -ttyPn	none			network
    -ttyPo	none			network
    -ttyPp	none			network
    -ttyPq	none			network
    -ttyPr	none			network
    -ttyPs	none			network
    -ttyPt	none			network
    -ttyPu	none			network
    -ttyPv	none			network
    -ttyQ0	none			network
    -ttyQ1	none			network
    -ttyQ2	none			network
    -ttyQ3	none			network
    -ttyQ4	none			network
    -ttyQ5	none			network
    -ttyQ6	none			network
    -ttyQ7	none			network
    -ttyQ8	none			network
    -ttyQ9	none			network
    -ttyQa	none			network
    -ttyQb	none			network
    -ttyQc	none			network
    -ttyQd	none			network
    -ttyQe	none			network
    -ttyQf	none			network
    -ttyQg	none			network
    -ttyQh	none			network
    -ttyQi	none			network
    -ttyQj	none			network
    -ttyQk	none			network
    -ttyQl	none			network
    -ttyQm	none			network
    -ttyQn	none			network
    -ttyQo	none			network
    -ttyQp	none			network
    -ttyQq	none			network
    -ttyQr	none			network
    -ttyQs	none			network
    -ttyQt	none			network
    -ttyQu	none			network
    -ttyQv	none			network
    -ttyR0	none			network
    -ttyR1	none			network
    -ttyR2	none			network
    -ttyR3	none			network
    -ttyR4	none			network
    -ttyR5	none			network
    -ttyR6	none			network
    -ttyR7	none			network
    -ttyR8	none			network
    -ttyR9	none			network
    -ttyRa	none			network
    -ttyRb	none			network
    -ttyRc	none			network
    -ttyRd	none			network
    -ttyRe	none			network
    -ttyRf	none			network
    -ttyRg	none			network
    -ttyRh	none			network
    -ttyRi	none			network
    -ttyRj	none			network
    -ttyRk	none			network
    -ttyRl	none			network
    -ttyRm	none			network
    -ttyRn	none			network
    -ttyRo	none			network
    -ttyRp	none			network
    -ttyRq	none			network
    -ttyRr	none			network
    -ttyRs	none			network
    -ttyRt	none			network
    -ttyRu	none			network
    -ttyRv	none			network
    -ttyS0	none			network
    -ttyS1	none			network
    -ttyS2	none			network
    -ttyS3	none			network
    -ttyS4	none			network
    -ttyS5	none			network
    -ttyS6	none			network
    -ttyS7	none			network
    -ttyS8	none			network
    -ttyS9	none			network
    -ttySa	none			network
    -ttySb	none			network
    -ttySc	none			network
    -ttySd	none			network
    -ttySe	none			network
    -ttySf	none			network
    -ttySg	none			network
    -ttySh	none			network
    -ttySi	none			network
    -ttySj	none			network
    -ttySk	none			network
    -ttySl	none			network
    -ttySm	none			network
    -ttySn	none			network
    -ttySo	none			network
    -ttySp	none			network
    -ttySq	none			network
    -ttySr	none			network
    -ttySs	none			network
    -ttySt	none			network
    -ttySu	none			network
    -ttySv	none			network
    diff --git a/etc/etc.sparc64/ttys b/etc/etc.sparc64/ttys
    index 99533a4b6eb1..5b38b65f625d 100644
    --- a/etc/etc.sparc64/ttys
    +++ b/etc/etc.sparc64/ttys
    @@ -15,7 +15,7 @@
     #
     # type The initial terminal type for this port.  For hardwired
     #      terminal lines, this will contain the type of terminal used.
    -#      For virtual consoles, the correct type is typically cons25.
    +#      For virtual consoles, the correct type is typically xterm.
     #      Other common values include network for network connections on
     #      pseudo-terminals, dialup for incoming modem ports, and unknown
     #      when the terminal type cannot be predetermined.
    @@ -34,15 +34,15 @@ screen	"/usr/libexec/getty Pc"		vt100	off secure
     ttya	"/usr/libexec/getty 3wire.9600"	vt100	off secure
     ttyb	"/usr/libexec/getty 3wire.9600"	vt100	off secure
     # syscons(4)
    -ttyv0	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv0	"/usr/libexec/getty Pc"		xterm	on  secure
     # Virtual terminals
    -ttyv1	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv2	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv3	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv4	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv5	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv6	"/usr/libexec/getty Pc"		cons25	on  secure
    -ttyv7	"/usr/libexec/getty Pc"		cons25	on  secure
    +ttyv1	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv2	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv3	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv4	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv5	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv6	"/usr/libexec/getty Pc"		xterm	on  secure
    +ttyv7	"/usr/libexec/getty Pc"		xterm	on  secure
     ttyv8	"/usr/local/bin/xdm -nodaemon"	xterm	off secure
     # Serial terminals
     # The 'dialup' keyword identifies dialin lines to login, fingerd etc.
    @@ -53,260 +53,3 @@ ttyu2	"/usr/libexec/getty std.9600"	vt100	on  secure
     ttyu3	"/usr/libexec/getty std.9600"	vt100	off secure
     # Dumb console
     dcons	"/usr/libexec/getty std.9600"	vt100	off secure
    -# Pseudo terminals
    -ttyp0	none			network
    -ttyp1	none			network
    -ttyp2	none			network
    -ttyp3	none			network
    -ttyp4	none			network
    -ttyp5	none			network
    -ttyp6	none			network
    -ttyp7	none			network
    -ttyp8	none			network
    -ttyp9	none			network
    -ttypa	none			network
    -ttypb	none			network
    -ttypc	none			network
    -ttypd	none			network
    -ttype	none			network
    -ttypf	none			network
    -ttypg	none			network
    -ttyph	none			network
    -ttypi	none			network
    -ttypj	none			network
    -ttypk	none			network
    -ttypl	none			network
    -ttypm	none			network
    -ttypn	none			network
    -ttypo	none			network
    -ttypp	none			network
    -ttypq	none			network
    -ttypr	none			network
    -ttyps	none			network
    -ttypt	none			network
    -ttypu	none			network
    -ttypv	none			network
    -ttyq0	none			network
    -ttyq1	none			network
    -ttyq2	none			network
    -ttyq3	none			network
    -ttyq4	none			network
    -ttyq5	none			network
    -ttyq6	none			network
    -ttyq7	none			network
    -ttyq8	none			network
    -ttyq9	none			network
    -ttyqa	none			network
    -ttyqb	none			network
    -ttyqc	none			network
    -ttyqd	none			network
    -ttyqe	none			network
    -ttyqf	none			network
    -ttyqg	none			network
    -ttyqh	none			network
    -ttyqi	none			network
    -ttyqj	none			network
    -ttyqk	none			network
    -ttyql	none			network
    -ttyqm	none			network
    -ttyqn	none			network
    -ttyqo	none			network
    -ttyqp	none			network
    -ttyqq	none			network
    -ttyqr	none			network
    -ttyqs	none			network
    -ttyqt	none			network
    -ttyqu	none			network
    -ttyqv	none			network
    -ttyr0	none			network
    -ttyr1	none			network
    -ttyr2	none			network
    -ttyr3	none			network
    -ttyr4	none			network
    -ttyr5	none			network
    -ttyr6	none			network
    -ttyr7	none			network
    -ttyr8	none			network
    -ttyr9	none			network
    -ttyra	none			network
    -ttyrb	none			network
    -ttyrc	none			network
    -ttyrd	none			network
    -ttyre	none			network
    -ttyrf	none			network
    -ttyrg	none			network
    -ttyrh	none			network
    -ttyri	none			network
    -ttyrj	none			network
    -ttyrk	none			network
    -ttyrl	none			network
    -ttyrm	none			network
    -ttyrn	none			network
    -ttyro	none			network
    -ttyrp	none			network
    -ttyrq	none			network
    -ttyrr	none			network
    -ttyrs	none			network
    -ttyrt	none			network
    -ttyru	none			network
    -ttyrv	none			network
    -ttys0	none			network
    -ttys1	none			network
    -ttys2	none			network
    -ttys3	none			network
    -ttys4	none			network
    -ttys5	none			network
    -ttys6	none			network
    -ttys7	none			network
    -ttys8	none			network
    -ttys9	none			network
    -ttysa	none			network
    -ttysb	none			network
    -ttysc	none			network
    -ttysd	none			network
    -ttyse	none			network
    -ttysf	none			network
    -ttysg	none			network
    -ttysh	none			network
    -ttysi	none			network
    -ttysj	none			network
    -ttysk	none			network
    -ttysl	none			network
    -ttysm	none			network
    -ttysn	none			network
    -ttyso	none			network
    -ttysp	none			network
    -ttysq	none			network
    -ttysr	none			network
    -ttyss	none			network
    -ttyst	none			network
    -ttysu	none			network
    -ttysv	none			network
    -ttyP0	none			network
    -ttyP1	none			network
    -ttyP2	none			network
    -ttyP3	none			network
    -ttyP4	none			network
    -ttyP5	none			network
    -ttyP6	none			network
    -ttyP7	none			network
    -ttyP8	none			network
    -ttyP9	none			network
    -ttyPa	none			network
    -ttyPb	none			network
    -ttyPc	none			network
    -ttyPd	none			network
    -ttyPe	none			network
    -ttyPf	none			network
    -ttyPg	none			network
    -ttyPh	none			network
    -ttyPi	none			network
    -ttyPj	none			network
    -ttyPk	none			network
    -ttyPl	none			network
    -ttyPm	none			network
    -ttyPn	none			network
    -ttyPo	none			network
    -ttyPp	none			network
    -ttyPq	none			network
    -ttyPr	none			network
    -ttyPs	none			network
    -ttyPt	none			network
    -ttyPu	none			network
    -ttyPv	none			network
    -ttyQ0	none			network
    -ttyQ1	none			network
    -ttyQ2	none			network
    -ttyQ3	none			network
    -ttyQ4	none			network
    -ttyQ5	none			network
    -ttyQ6	none			network
    -ttyQ7	none			network
    -ttyQ8	none			network
    -ttyQ9	none			network
    -ttyQa	none			network
    -ttyQb	none			network
    -ttyQc	none			network
    -ttyQd	none			network
    -ttyQe	none			network
    -ttyQf	none			network
    -ttyQg	none			network
    -ttyQh	none			network
    -ttyQi	none			network
    -ttyQj	none			network
    -ttyQk	none			network
    -ttyQl	none			network
    -ttyQm	none			network
    -ttyQn	none			network
    -ttyQo	none			network
    -ttyQp	none			network
    -ttyQq	none			network
    -ttyQr	none			network
    -ttyQs	none			network
    -ttyQt	none			network
    -ttyQu	none			network
    -ttyQv	none			network
    -ttyR0	none			network
    -ttyR1	none			network
    -ttyR2	none			network
    -ttyR3	none			network
    -ttyR4	none			network
    -ttyR5	none			network
    -ttyR6	none			network
    -ttyR7	none			network
    -ttyR8	none			network
    -ttyR9	none			network
    -ttyRa	none			network
    -ttyRb	none			network
    -ttyRc	none			network
    -ttyRd	none			network
    -ttyRe	none			network
    -ttyRf	none			network
    -ttyRg	none			network
    -ttyRh	none			network
    -ttyRi	none			network
    -ttyRj	none			network
    -ttyRk	none			network
    -ttyRl	none			network
    -ttyRm	none			network
    -ttyRn	none			network
    -ttyRo	none			network
    -ttyRp	none			network
    -ttyRq	none			network
    -ttyRr	none			network
    -ttyRs	none			network
    -ttyRt	none			network
    -ttyRu	none			network
    -ttyRv	none			network
    -ttyS0	none			network
    -ttyS1	none			network
    -ttyS2	none			network
    -ttyS3	none			network
    -ttyS4	none			network
    -ttyS5	none			network
    -ttyS6	none			network
    -ttyS7	none			network
    -ttyS8	none			network
    -ttyS9	none			network
    -ttySa	none			network
    -ttySb	none			network
    -ttySc	none			network
    -ttySd	none			network
    -ttySe	none			network
    -ttySf	none			network
    -ttySg	none			network
    -ttySh	none			network
    -ttySi	none			network
    -ttySj	none			network
    -ttySk	none			network
    -ttySl	none			network
    -ttySm	none			network
    -ttySn	none			network
    -ttySo	none			network
    -ttySp	none			network
    -ttySq	none			network
    -ttySr	none			network
    -ttySs	none			network
    -ttySt	none			network
    -ttySu	none			network
    -ttySv	none			network
    diff --git a/etc/gettytab b/etc/gettytab
    index b75da3d13816..a7059e7768ec 100644
    --- a/etc/gettytab
    +++ b/etc/gettytab
    @@ -162,7 +162,7 @@ X|Xwindow|X window system:\
     	:fd@:nd@:cd@:rw:sp#9600:
     
     P|Pc|Pc console:\
    -	:ht:np:sp#115200:
    +	:ht:np:sp#9600:
     
     #
     # Wierdo special case for fast crt's with hardcopy devices
    diff --git a/etc/mtree/BIND.chroot.dist b/etc/mtree/BIND.chroot.dist
    index e41a369a4262..95423db5cd21 100644
    --- a/etc/mtree/BIND.chroot.dist
    +++ b/etc/mtree/BIND.chroot.dist
    @@ -15,6 +15,8 @@
                 ..
                 slave   uname=bind
                 ..
    +            working uname=bind
    +            ..
             ..
         ..
     /set type=dir uname=bind gname=wheel mode=0755
    diff --git a/etc/mtree/BSD.include.dist b/etc/mtree/BSD.include.dist
    index 50fec7a79626..78240112c9bb 100644
    --- a/etc/mtree/BSD.include.dist
    +++ b/etc/mtree/BSD.include.dist
    @@ -174,6 +174,8 @@
             ..
             mirror
             ..
    +        mountver
    +        ..
             multipath
             ..
             nop
    diff --git a/etc/mtree/BSD.usr.dist b/etc/mtree/BSD.usr.dist
    index d4d60534e8af..87f7ca397671 100644
    --- a/etc/mtree/BSD.usr.dist
    +++ b/etc/mtree/BSD.usr.dist
    @@ -160,6 +160,10 @@
                 usd
                     04.csh
                     ..
    +                05.dc
    +                ..
    +                06.bc
    +                ..
                     07.mail
                     ..
                     10.exref
    @@ -189,8 +193,6 @@
                 ..
                 IPv6
                 ..
    -            bc
    -            ..
                 bootforth
                 ..
                 cvs
    @@ -211,6 +213,8 @@
                 ..
                 find_interface
                 ..
    +            hast
    +            ..
                 hostapd
                 ..
                 ibcs2
    @@ -230,6 +234,12 @@
                     ..
                     dyn_sysctl
                     ..
    +                firmware
    +                    fwconsumer
    +                    ..
    +                    fwimage
    +                    ..
    +                ..
                     syscall
                         module
                         ..
    @@ -259,8 +269,6 @@
                 ..
                 ppp
                 ..
    -            pppd
    -            ..
                 printing
                 ..
                 scsi_target
    @@ -277,16 +285,10 @@
                     srcs
                     ..
                 ..
    -            slattach
    -            ..
    -            sliplogin
    -            ..
                 smbfs
                     print
                     ..
                 ..
    -            startslip
    -            ..
                 sunrpc
                     dir
                     ..
    @@ -1031,6 +1033,8 @@
                 ..
                 fr_FR.UTF-8
                 ..
    +            gl_ES.ISO8859-1
    +            ..
                 he_IL.UTF-8
                 ..
                 hi_IN.ISCII-DEV
    diff --git a/etc/mtree/BSD.var.dist b/etc/mtree/BSD.var.dist
    index 29b48622199c..f55fbbb23b7b 100644
    --- a/etc/mtree/BSD.var.dist
    +++ b/etc/mtree/BSD.var.dist
    @@ -32,7 +32,7 @@
         db
             entropy         uname=operator gname=operator mode=0700
             ..
    -        freebsd-update
    +        freebsd-update  mode=0700
             ..
             ipf             mode=0700
             ..
    diff --git a/etc/namedb/named.conf b/etc/namedb/named.conf
    index c9b09cba7ce6..57b7bf5252f8 100644
    --- a/etc/namedb/named.conf
    +++ b/etc/namedb/named.conf
    @@ -9,8 +9,9 @@
     // or cause huge amounts of useless Internet traffic.
     
     options {
    -	// Relative to the chroot directory, if any
    -	directory	"/etc/namedb";
    +	// All file and path names are relative to the chroot directory,
    +	// if any, and should be fully qualified.
    +	directory	"/etc/namedb/working";
     	pid-file	"/var/run/named/pid";
     	dump-file	"/var/dump/named_dump.db";
     	statistics-file	"/var/stats/named.stats";
    @@ -74,7 +75,7 @@ options {
     // Also, make sure to enable it in /etc/rc.conf.
     
     // The traditional root hints mechanism. Use this, OR the slave zones below.
    -zone "." { type hint; file "named.root"; };
    +zone "." { type hint; file "/etc/namedb/named.root"; };
     
     /*	Slaving the following zones from the root name servers has some
     	significant advantages:
    @@ -94,7 +95,7 @@ zone "." { type hint; file "named.root"; };
     /*
     zone "." {
     	type slave;
    -	file "slave/root.slave";
    +	file "/etc/namedb/slave/root.slave";
     	masters {
     		192.5.5.241;	// F.ROOT-SERVERS.NET.
     	};
    @@ -102,7 +103,7 @@ zone "." {
     };
     zone "arpa" {
     	type slave;
    -	file "slave/arpa.slave";
    +	file "/etc/namedb/slave/arpa.slave";
     	masters {
     		192.5.5.241;	// F.ROOT-SERVERS.NET.
     	};
    @@ -110,7 +111,7 @@ zone "arpa" {
     };
     zone "in-addr.arpa" {
     	type slave;
    -	file "slave/in-addr.arpa.slave";
    +	file "/etc/namedb/slave/in-addr.arpa.slave";
     	masters {
     		192.5.5.241;	// F.ROOT-SERVERS.NET.
     	};
    @@ -124,117 +125,130 @@ zone "in-addr.arpa" {
     	1. Faster local resolution for your users
     	2. No spurious traffic will be sent from your network to the roots
     */
    -// RFC 1912
    -zone "localhost"	{ type master; file "master/localhost-forward.db"; };
    -zone "127.in-addr.arpa" { type master; file "master/localhost-reverse.db"; };
    -zone "255.in-addr.arpa"	{ type master; file "master/empty.db"; };
    +// RFC 1912 (and BCP 32 for localhost)
    +zone "localhost"	{ type master; file "/etc/namedb/master/localhost-forward.db"; };
    +zone "127.in-addr.arpa"	{ type master; file "/etc/namedb/master/localhost-reverse.db"; };
    +zone "255.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
     
     // RFC 1912-style zone for IPv6 localhost address
    -zone "0.ip6.arpa"	{ type master; file "master/localhost-reverse.db"; };
    +zone "0.ip6.arpa"	{ type master; file "/etc/namedb/master/localhost-reverse.db"; };
     
     // "This" Network (RFCs 1912 and 3330)
    -zone "0.in-addr.arpa"		{ type master; file "master/empty.db"; };
    +zone "0.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
     
     // Private Use Networks (RFC 1918)
    -zone "10.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "16.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "17.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "18.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "19.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "20.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "21.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "22.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "23.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "24.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "25.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "26.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "27.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "28.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "29.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "30.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "31.172.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "168.192.in-addr.arpa"	{ type master; file "master/empty.db"; };
    +zone "10.in-addr.arpa"	   { type master; file "/etc/namedb/master/empty.db"; };
    +zone "16.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "17.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "18.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "19.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "20.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "21.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "22.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "23.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "24.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "25.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "26.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "27.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "28.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "29.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "30.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "31.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "168.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
     
     // Link-local/APIPA (RFCs 3330 and 3927)
    -zone "254.169.in-addr.arpa"	{ type master; file "master/empty.db"; };
    +zone "254.169.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
     
    -// TEST-NET for Documentation (RFC 3330)
    -zone "2.0.192.in-addr.arpa"	{ type master; file "master/empty.db"; };
    +// TEST-NET-[1-3] for Documentation (RFC 5737)
    +zone "2.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "100.51.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "113.0.203.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +
    +// IPv6 Range for Documentation (RFC 3849)
    +zone "0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +
    +// Domain Names for Documentation and Testing (BCP 32)
    +zone "test" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "example" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "invalid" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "example.com" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "example.net" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "example.org" { type master; file "/etc/namedb/master/empty.db"; };
     
     // Router Benchmark Testing (RFC 3330)
    -zone "18.198.in-addr.arpa"	{ type master; file "master/empty.db"; };
    -zone "19.198.in-addr.arpa"	{ type master; file "master/empty.db"; };
    +zone "18.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
    +zone "19.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
     
     // IANA Reserved - Old Class E Space
    -zone "240.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "241.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "242.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "243.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "244.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "245.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "246.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "247.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "248.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "249.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "250.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "251.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "252.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "253.in-addr.arpa"		{ type master; file "master/empty.db"; };
    -zone "254.in-addr.arpa"		{ type master; file "master/empty.db"; };
    +zone "240.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "241.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "242.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "243.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "244.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "245.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "246.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "247.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "248.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "249.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "250.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "251.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "252.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "253.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "254.in-addr.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
     
     // IPv6 Unassigned Addresses (RFC 4291)
    -zone "1.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "3.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "4.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "5.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "6.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "7.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "8.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "9.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "a.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "b.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "c.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "d.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "e.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "0.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "1.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "2.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "3.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "4.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "5.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "6.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "7.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "8.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "9.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "a.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "b.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "0.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "1.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "2.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "3.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "4.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "5.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "6.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "7.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    +zone "1.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "3.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "4.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "5.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "6.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "7.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "8.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "9.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "a.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "b.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "c.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "d.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "e.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "0.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "1.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "2.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "3.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "4.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "5.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "6.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "7.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "8.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "9.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "a.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "b.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "0.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "1.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "2.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "3.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "4.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "5.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "6.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "7.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
     
     // IPv6 ULA (RFC 4193)
    -zone "c.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "d.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    +zone "c.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "d.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
     
     // IPv6 Link Local (RFC 4291)
    -zone "8.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "9.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "a.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "b.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    +zone "8.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "9.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "a.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "b.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
     
     // IPv6 Deprecated Site-Local Addresses (RFC 3879)
    -zone "c.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "d.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "e.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    -zone "f.e.f.ip6.arpa"		{ type master; file "master/empty.db"; };
    +zone "c.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "d.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "e.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
    +zone "f.e.f.ip6.arpa"	{ type master; file "/etc/namedb/master/empty.db"; };
     
     // IP6.INT is Deprecated (RFC 4159)
    -zone "ip6.int"			{ type master; file "master/empty.db"; };
    +zone "ip6.int"		{ type master; file "/etc/namedb/master/empty.db"; };
     
     // NB: Do not use the IP addresses below, they are faked, and only
     // serve demonstration/documentation purposes!
    @@ -265,17 +279,16 @@ zone "example.org" {
     	allow-update {
     		key "exampleorgkey";
     	};
    -	file "dynamic/example.org";
    +	file "/etc/namedb/dynamic/example.org";
     };
     */
     
     /* Example of a slave reverse zone
     zone "1.168.192.in-addr.arpa" {
     	type slave;
    -	file "slave/1.168.192.in-addr.arpa";
    +	file "/etc/namedb/slave/1.168.192.in-addr.arpa";
     	masters {
     		192.168.1.1;
     	};
     };
     */
    -
    diff --git a/etc/namedb/named.root b/etc/namedb/named.root
    index 274a3eefd55d..1c41c0e3fec0 100644
    --- a/etc/namedb/named.root
    +++ b/etc/namedb/named.root
    @@ -13,8 +13,8 @@
     ;           on server           FTP.INTERNIC.NET
     ;       -OR-                    RS.INTERNIC.NET
     ;
    -;       last update:    Feb 04, 2008
    -;       related version of root zone:   2008020400
    +;       last update:    Dec 12, 2008
    +;       related version of root zone:   2008121200
     ;
     ; formerly NS.INTERNIC.NET
     ;
    @@ -22,68 +22,69 @@
     A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
     A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:BA3E::2:30
     ;
    -; formerly NS1.ISI.EDU
    +; FORMERLY NS1.ISI.EDU
     ;
     .                        3600000      NS    B.ROOT-SERVERS.NET.
     B.ROOT-SERVERS.NET.      3600000      A     192.228.79.201
     ;
    -; formerly C.PSI.NET
    +; FORMERLY C.PSI.NET
     ;
     .                        3600000      NS    C.ROOT-SERVERS.NET.
     C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
     ;
    -; formerly TERP.UMD.EDU
    +; FORMERLY TERP.UMD.EDU
     ;
     .                        3600000      NS    D.ROOT-SERVERS.NET.
     D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
     ;
    -; formerly NS.NASA.GOV
    +; FORMERLY NS.NASA.GOV
     ;
     .                        3600000      NS    E.ROOT-SERVERS.NET.
     E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
     ;
    -; formerly NS.ISC.ORG
    +; FORMERLY NS.ISC.ORG
     ;
     .                        3600000      NS    F.ROOT-SERVERS.NET.
     F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
    -F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2f::f
    +F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2F::F
     ;
    -; formerly NS.NIC.DDN.MIL
    +; FORMERLY NS.NIC.DDN.MIL
     ;
     .                        3600000      NS    G.ROOT-SERVERS.NET.
     G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
     ;
    -; formerly AOS.ARL.ARMY.MIL
    +; FORMERLY AOS.ARL.ARMY.MIL
     ;
     .                        3600000      NS    H.ROOT-SERVERS.NET.
     H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53
    -H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::803f:235
    +H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::803F:235
     ;
    -; formerly NIC.NORDU.NET
    +; FORMERLY NIC.NORDU.NET
     ;
     .                        3600000      NS    I.ROOT-SERVERS.NET.
     I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
     ;
    -; operated by VeriSign, Inc.
    +; OPERATED BY VERISIGN, INC.
     ;
     .                        3600000      NS    J.ROOT-SERVERS.NET.
     J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
     J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:C27::2:30
     ;
    -; operated by RIPE NCC
    +; OPERATED BY RIPE NCC
     ;
     .                        3600000      NS    K.ROOT-SERVERS.NET.
     K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
    -K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fd::1
    +K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7FD::1
     ;
    -; operated by ICANN
    +; OPERATED BY ICANN
     ;
     .                        3600000      NS    L.ROOT-SERVERS.NET.
     L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42
    +L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:3::42
     ;
    -; operated by WIDE
    +; OPERATED BY WIDE
     ;
     .                        3600000      NS    M.ROOT-SERVERS.NET.
     M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
    -M.ROOT-SERVERS.NET.      3600000      AAAA  2001:dc3::35
    +M.ROOT-SERVERS.NET.      3600000      AAAA  2001:DC3::35
     ; End of File
    diff --git a/etc/network.subr b/etc/network.subr
    index 83141ec3879f..fbf3ff9022de 100644
    --- a/etc/network.subr
    +++ b/etc/network.subr
    @@ -356,6 +356,16 @@ afexists()
     	inet6)
     		${SYSCTL_N} net.inet6 > /dev/null 2>&1
     		;;
    +	ipx)
    +		${SYSCTL_N} net.ipx > /dev/null 2>&1
    +		;;
    +	atm)
    +		if [ -x /sbin/atmconfig ]; then
    +			/sbin/atmconfig diag list > /dev/null 2>&1
    +		else
    +			return 1
    +		fi
    +		;;
     	*)
     		err 1 "afexists(): Unsupported address family: $_af"
     		;;
    @@ -872,7 +882,9 @@ ipv6_accept_rtadv_up()
     {
     	if ipv6_autoconfif $1; then
     		ifconfig $1 inet6 accept_rtadv up
    -		rtsol ${rtsol_flags} $1
    +		if ! checkyesno rtsold_enable; then
    +			rtsol ${rtsol_flags} $1
    +		fi
     	fi
     }
     
    @@ -961,7 +973,7 @@ clone_down()
     #
     childif_create()
     {
    -	local cfg child child_wlans create_args debug_flags ifn i
    +	local cfg child child_vlans child_wlans create_args debug_flags ifn i
     	cfg=1
     	ifn=$1
     
    @@ -989,6 +1001,32 @@ childif_create()
     		fi
     	done
     
    +	# Create vlan interfaces
    +	child_vlans=`get_if_var $ifn vlans_IF`
    +
    +	if [ -n "${child_vlans}" ]; then
    +		load_kld if_vlan
    +	fi
    +
    +	for child in ${child_vlans}; do
    +		if expr $child : '[1-9][0-9]*$' >/dev/null 2>&1; then
    +			child="${ifn}.${child}"
    +			create_args=`get_if_var $child create_args_IF`
    +			ifconfig $child create ${create_args} && cfg=0
    +		else
    +			create_args="vlandev $ifn `get_if_var $child create_args_IF`"
    +			if expr $child : 'vlan[0-9][0-9]*$' >/dev/null 2>&1; then
    +				ifconfig $child create ${create_args} && cfg=0
    +			else
    +				i=`ifconfig vlan create ${create_args}`
    +				ifconfig $i name $child && cfg=0
    +			fi
    +		fi
    +		if autoif $child; then
    +			ifn_start $child
    +		fi
    +	done
    +
     	return ${cfg}
     }
     
    @@ -997,11 +1035,31 @@ childif_create()
     #
     childif_destroy()
     {
    -	local cfg child child_wlans ifn
    +	local cfg child child_vlans child_wlans ifn
     	cfg=1
     
    -	child_wlans="`get_if_var $ifn wlans_IF` `get_if_var $ifn vaps_IF`"
    +	child_wlans=`get_if_var $ifn wlans_IF`
     	for child in ${child_wlans}; do
    +		if ! ifexists $child; then
    +			continue
    +		fi
    +		if autoif $child; then
    +			ifn_stop $child
    +		fi
    +		ifconfig $child destroy && cfg=0
    +	done
    +
    +	child_vlans=`get_if_var $ifn vlans_IF`
    +	for child in ${child_vlans}; do
    +		if expr $child : '[1-9][0-9]*$' >/dev/null 2>&1; then
    +			child="${ifn}.${child}"
    +		fi
    +		if ! ifexists $child; then
    +			continue
    +		fi
    +		if autoif $child; then
    +			ifn_stop $child
    +		fi
     		ifconfig $child destroy && cfg=0
     	done
     
    diff --git a/etc/newsyslog.conf b/etc/newsyslog.conf
    index 354ed09fd099..79ad03739ccb 100644
    --- a/etc/newsyslog.conf
    +++ b/etc/newsyslog.conf
    @@ -33,6 +33,6 @@
     /var/log/ppp.log	root:network	640  3	   100	*     JC
     /var/log/security			600  10	   100	*     JC
     /var/log/sendmail.st			640  10	   *	168   B
    +/var/log/utx.log			644  3	   *	@01T05 B
     /var/log/weekly.log			640  5	   1	$W6D0 JN
    -/var/log/wtmp				644  3	   *	@01T05 B
     /var/log/xferlog			600  7	   100	*     JC
    diff --git a/etc/pam.d/ftpd b/etc/pam.d/ftpd
    index 632c97333f18..0d0b0766cc21 100644
    --- a/etc/pam.d/ftpd
    +++ b/etc/pam.d/ftpd
    @@ -8,12 +8,12 @@
     auth		sufficient	pam_opie.so		no_warn no_fake_prompts
     auth		requisite	pam_opieaccess.so	no_warn allow_local
     #auth		sufficient	pam_krb5.so		no_warn
    -#auth           sufficient      pam_ssh.so		no_warn try_first_pass
    +#auth		sufficient	pam_ssh.so		no_warn try_first_pass
     auth		required	pam_unix.so		no_warn try_first_pass
     
     # account
     account		required	pam_nologin.so
    -#account 	required	pam_krb5.so
    +#account	required	pam_krb5.so
     account		required	pam_unix.so
     
     # session
    diff --git a/etc/pam.d/kde b/etc/pam.d/kde
    index a384d628940b..f7d54f66c6ca 100644
    --- a/etc/pam.d/kde
    +++ b/etc/pam.d/kde
    @@ -11,9 +11,9 @@ auth		required	pam_unix.so		no_warn try_first_pass
     
     # account
     account		required	pam_nologin.so
    -#account 	required	pam_krb5.so
    +#account	required	pam_krb5.so
     account		required	pam_unix.so
     
     # session
    -#session 	optional	pam_ssh.so
    +#session	optional	pam_ssh.so		want_agent
     session		required	pam_permit.so
    diff --git a/etc/pam.d/other b/etc/pam.d/other
    index c86239cb56db..110aa00e74df 100644
    --- a/etc/pam.d/other
    +++ b/etc/pam.d/other
    @@ -13,12 +13,12 @@ auth		required	pam_unix.so		no_warn try_first_pass
     
     # account
     account		required	pam_nologin.so
    -#account 	required	pam_krb5.so
    +#account	required	pam_krb5.so
     account		required	pam_login_access.so
     account		required	pam_unix.so
     
     # session
    -#session 	optional	pam_ssh.so
    +#session	optional	pam_ssh.so		want_agent
     session		required	pam_permit.so
     
     # password
    diff --git a/etc/pam.d/sshd b/etc/pam.d/sshd
    index 46f536c74a4f..b4707c009f49 100644
    --- a/etc/pam.d/sshd
    +++ b/etc/pam.d/sshd
    @@ -13,12 +13,12 @@ auth		required	pam_unix.so		no_warn try_first_pass
     
     # account
     account		required	pam_nologin.so
    -#account 	required	pam_krb5.so
    +#account	required	pam_krb5.so
     account		required	pam_login_access.so
     account		required	pam_unix.so
     
     # session
    -#session 	optional	pam_ssh.so
    +#session	optional	pam_ssh.so		want_agent
     session		required	pam_permit.so
     
     # password
    diff --git a/etc/pam.d/system b/etc/pam.d/system
    index c2f4d8b3fdac..b8b7101e6b85 100644
    --- a/etc/pam.d/system
    +++ b/etc/pam.d/system
    @@ -12,12 +12,12 @@ auth		requisite	pam_opieaccess.so	no_warn allow_local
     auth		required	pam_unix.so		no_warn try_first_pass nullok
     
     # account
    -#account 	required	pam_krb5.so
    +#account	required	pam_krb5.so
     account		required	pam_login_access.so
     account		required	pam_unix.so
     
     # session
    -#session 	optional	pam_ssh.so
    +#session	optional	pam_ssh.so		want_agent
     session		required	pam_lastlog.so		no_fail
     
     # password
    diff --git a/etc/pam.d/telnetd b/etc/pam.d/telnetd
    index 535afc293157..fb2f523d4ad1 100644
    --- a/etc/pam.d/telnetd
    +++ b/etc/pam.d/telnetd
    @@ -13,12 +13,12 @@ auth		required	pam_unix.so		no_warn try_first_pass
     
     # account
     account		required	pam_nologin.so
    -#account 	required	pam_krb5.so
    +#account	required	pam_krb5.so
     account		required	pam_login_access.so
     account		required	pam_unix.so
     
     # session
    -#session 	optional	pam_ssh.so
    +#session	optional	pam_ssh.so		want_agent
     session		required	pam_lastlog.so		no_fail
     
     # password
    diff --git a/etc/pam.d/xdm b/etc/pam.d/xdm
    index b883de762a40..2a7db08053f4 100644
    --- a/etc/pam.d/xdm
    +++ b/etc/pam.d/xdm
    @@ -11,11 +11,11 @@ auth		required	pam_unix.so		no_warn try_first_pass
     
     # account
     account		required	pam_nologin.so
    -#account 	required	pam_krb5.so
    +#account	required	pam_krb5.so
     account		required	pam_unix.so
     
     # session
    -#session 	required	pam_ssh.so		want_agent
    +#session	required	pam_ssh.so		want_agent
     session		required	pam_lastlog.so		no_fail
     
     # password
    diff --git a/etc/periodic/daily/400.status-disks b/etc/periodic/daily/400.status-disks
    index 63b2b6bef676..dc525a5bccac 100755
    --- a/etc/periodic/daily/400.status-disks
    +++ b/etc/periodic/daily/400.status-disks
    @@ -19,6 +19,9 @@ case "$daily_status_disks_enable" in
     	df $daily_status_disks_df_flags && rc=1 || rc=3
     
     	# display which filesystems need backing up
    +	if ! [ -f /etc/fstab ]; then
    +		export PATH_FSTAB=/dev/null
    +	fi
     
     	echo ""
     	dump W || rc=3;;
    diff --git a/etc/periodic/monthly/200.accounting b/etc/periodic/monthly/200.accounting
    index 0be8c326abf5..46f153de535a 100755
    --- a/etc/periodic/monthly/200.accounting
    +++ b/etc/periodic/monthly/200.accounting
    @@ -15,7 +15,7 @@ oldmask=$(umask)
     umask 066
     case "$monthly_accounting_enable" in
         [Yy][Ee][Ss])
    -	W=/var/log/wtmp
    +	W=/var/log/utx.log
     	rc=0
     	remove=NO
     	if [ ! -f $W.0 ]
    diff --git a/etc/periodic/security/200.chkmounts b/etc/periodic/security/200.chkmounts
    index 2558d0e01ff6..17b114ef0a8c 100755
    --- a/etc/periodic/security/200.chkmounts
    +++ b/etc/periodic/security/200.chkmounts
    @@ -50,6 +50,9 @@ case "$daily_status_security_chkmounts_enable" in
     		ignore="${ignore}|^amd:"
     	esac
     	[ -n "$ignore" ] && cmd="egrep -v ${ignore#|}" || cmd=cat
    +	if ! [ -f /etc/fstab ]; then
    +		export PATH_FSTAB=/dev/null
    +	fi
     	mount -p | sort | ${cmd} |
     	  check_diff mount - "${host} changes in mounted filesystems:"
     	rc=$?;;
    diff --git a/etc/ppp/ppp.conf b/etc/ppp/ppp.conf
    index 251231468fde..2b63834839f9 100644
    --- a/etc/ppp/ppp.conf
    +++ b/etc/ppp/ppp.conf
    @@ -10,7 +10,7 @@
     
     default:
      set log Phase Chat LCP IPCP CCP tun command
    - ident user-ppp VERSION (built COMPILATIONDATE)
    + ident user-ppp VERSION
     
      # Ensure that "device" references the correct serial port
      # for your modem. (cuau0 = COM1, cuau1 = COM2)
    diff --git a/etc/rc.d/Makefile b/etc/rc.d/Makefile
    index fbfac8ac83dc..17f763486645 100755
    --- a/etc/rc.d/Makefile
    +++ b/etc/rc.d/Makefile
    @@ -12,10 +12,10 @@ FILES=	DAEMON FILESYSTEMS LOGIN NETWORKING SERVERS \
     	encswap \
     	faith fsck ftp-proxy ftpd \
     	gbde geli geli2 gssd \
    -	hcsecd \
    +	hastd hcsecd \
     	hostapd hostid hostid_save hostname \
     	inetd initrandom \
    -	ip6addrctl ip6fw ipfilter ipfs ipfw ipmon \
    +	ip6addrctl ipfilter ipfs ipfw ipmon \
     	ipnat ipsec ipxrouted \
     	jail \
     	kadmind kerberos keyserv kldxref kpasswdd \
    @@ -30,7 +30,7 @@ FILES=	DAEMON FILESYSTEMS LOGIN NETWORKING SERVERS \
     	powerd power_profile ppp pppoed pwcheck \
     	quota \
     	random rarpd resolv rfcomm_pppd_server root \
    -	route6d routed routing rpcbind rtadvd rwho \
    +	route6d routed routing rpcbind rtadvd rtsold rwho \
     	savecore sdpd securelevel sendmail \
     	serial sppp statd static_arp stf swap1 \
     	syscons sysctl syslogd \
    diff --git a/etc/rc.d/bgfsck b/etc/rc.d/bgfsck
    index 04c4cb529ca5..3715354fc3ed 100755
    --- a/etc/rc.d/bgfsck
    +++ b/etc/rc.d/bgfsck
    @@ -31,7 +31,7 @@ bgfsck_start ()
     		bgfsck_msg="${bgfsck_msg} in ${background_fsck_delay} seconds"
     	fi
     	if [ -z "${rc_force}" ]; then
    -		[ -z "${rc_quiet}" ] && echo "${bgfsck_msg}."
    +		check_startmsgs && echo "${bgfsck_msg}."
     	fi
     
     	(sleep ${background_fsck_delay}; nice -4 fsck -B -p) 2>&1 | \
    diff --git a/etc/rc.d/cleanvar b/etc/rc.d/cleanvar
    index 68e03bdc1119..d4b5b14f700f 100755
    --- a/etc/rc.d/cleanvar
    +++ b/etc/rc.d/cleanvar
    @@ -58,8 +58,8 @@ cleanvar_start ()
     {
     	if [ -d /var/run -a ! -f /var/run/clean_var ]; then
     		purgedir /var/run
    -		# And an initial utmp file
    -		(cd /var/run && cp /dev/null utmp && chmod 644 utmp)
    +		# And an initial utmpx active session file
    +		(cd /var/run && cp /dev/null utx.active && chmod 644 utx.active)
     		>/var/run/clean_var
     	fi
     	if [ -d /var/spool/lock -a ! -f /var/spool/lock/clean_var ]; then
    diff --git a/etc/rc.d/cleartmp b/etc/rc.d/cleartmp
    index a41a15ebf453..94b7799ba6d5 100755
    --- a/etc/rc.d/cleartmp
    +++ b/etc/rc.d/cleartmp
    @@ -25,7 +25,7 @@ cleartmp_start()
     			       ${tmp}/.ICE-unix ${tmp}/.font-unix"
     
     	if checkyesno ${rcvar1}; then
    -		[ -z "${rc_quiet}" ] && echo "Clearing ${tmp}."
    +		check_startmsgs && echo "Clearing ${tmp}."
     
     		# This is not needed for mfs, but doesn't hurt anything.
     		# Things to note:
    @@ -44,7 +44,7 @@ cleartmp_start()
     	elif checkyesno clear_tmp_X; then
     		# Remove X lock files, since they will prevent you from
     		# restarting X.  Remove other X related directories.
    -		[ -z "${rc_quiet}" ] && echo "Clearing ${tmp} (X related)."
    +		check_startmsgs && echo "Clearing ${tmp} (X related)."
     		rm -rf ${tmp}/.X[0-9]-lock ${x11_socket_dirs}
     	fi
     	if checkyesno clear_tmp_X; then
    diff --git a/etc/rc.d/defaultroute b/etc/rc.d/defaultroute
    index cade406b796b..b4dc37315464 100755
    --- a/etc/rc.d/defaultroute
    +++ b/etc/rc.d/defaultroute
    @@ -20,6 +20,8 @@ defaultroute_start()
     {
     	local output carrier nocarrier nl
     
    +	afexists inet || return 0
    +
     	# Return without waiting if we don't have dhcp interfaces or
     	# if none of the dhcp interfaces is plugged in.
     	dhcp_interfaces=`list_net_interfaces dhcp`
    diff --git a/etc/rc.d/devfs b/etc/rc.d/devfs
    index cd50b15a9776..82278af53cf4 100755
    --- a/etc/rc.d/devfs
    +++ b/etc/rc.d/devfs
    @@ -44,7 +44,7 @@ read_devfs_conf()
     		while read action devicelist parameter; do
     			case "${action}" in
     			l*)	for device in ${devicelist}; do
    -					if [ -c ${device} -a ! -e ${parameter} ]; then
    +					if [ ! -e ${parameter} ]; then
     						ln -fs ${device} ${parameter}
     					fi
     				done
    diff --git a/etc/rc.d/faith b/etc/rc.d/faith
    index 020b947ec86a..9994114cd46c 100755
    --- a/etc/rc.d/faith
    +++ b/etc/rc.d/faith
    @@ -3,7 +3,7 @@
     #
     
     # PROVIDE: faith
    -# REQUIRE: netif routing
    +# REQUIRE: netif
     # KEYWORD: nojail
     
     . /etc/rc.subr
    @@ -39,9 +39,7 @@ faith_up()
     			route change -inet6 ${prefix} -prefixlen ${prefixlen} \
     				-ifp faith0
     		done
    -		if [ -z "${rc_quiet}" ]; then
    -			ifconfig faith0
    -		fi
    +		check_startmsgs && ifconfig faith0
     		;;
     	esac
     }
    diff --git a/etc/rc.d/fsck b/etc/rc.d/fsck
    index a2ca0b753844..c1fe155e48f4 100755
    --- a/etc/rc.d/fsck
    +++ b/etc/rc.d/fsck
    @@ -23,7 +23,7 @@ fsck_start()
     					# During fsck ignore SIGQUIT
     		trap : 3
     
    -		[ -z "${rc_quiet}" ] && echo "Starting file system checks:"
    +		check_startmsgs && echo "Starting file system checks:"
     		if checkyesno background_fsck; then
     			fsck -F -p
     		else
    diff --git a/etc/rc.d/hastd b/etc/rc.d/hastd
    new file mode 100644
    index 000000000000..11006788e68c
    --- /dev/null
    +++ b/etc/rc.d/hastd
    @@ -0,0 +1,28 @@
    +#!/bin/sh
    +#
    +# $FreeBSD$
    +#
    +
    +# PROVIDE: hastd
    +# REQUIRE: NETWORKING syslogd
    +# BEFORE:  DAEMON
    +# KEYWORD: nojail shutdown
    +
    +. /etc/rc.subr
    +
    +name="hastd"
    +rcvar=`set_rcvar`
    +pidfile="/var/run/${name}.pid"
    +command="/sbin/${name}"
    +hastctl="/sbin/hastctl"
    +required_files="/etc/hast.conf"
    +stop_precmd="hastd_stop_precmd"
    +required_modules="geom_gate:g_gate"
    +
    +hastd_stop_precmd()
    +{
    +	${hastctl} role init all
    +}
    +
    +load_rc_config $name
    +run_rc_command "$1"
    diff --git a/etc/rc.d/hostid b/etc/rc.d/hostid
    index f8a3d94485f6..45d679bbabf6 100755
    --- a/etc/rc.d/hostid
    +++ b/etc/rc.d/hostid
    @@ -49,9 +49,9 @@ hostid_set()
     
     	# Set both kern.hostuuid and kern.hostid.
     	#
    -	[ -z "${rc_quiet}" ] && echo "Setting hostuuid: ${uuid}."
    +	check_startmsgs && echo "Setting hostuuid: ${uuid}."
     	${SYSCTL_W} kern.hostuuid="${uuid}" >/dev/null
    -	[ -z "${rc_quiet}" ] && echo "Setting hostid: ${id}."
    +	check_startmsgs && echo "Setting hostid: ${id}."
     	${SYSCTL_W} kern.hostid=${id} >/dev/null
     }
     
    diff --git a/etc/rc.d/hostname b/etc/rc.d/hostname
    index 52f4408b635c..142dc4713c33 100755
    --- a/etc/rc.d/hostname
    +++ b/etc/rc.d/hostname
    @@ -72,8 +72,9 @@ hostname_start()
     
     	# All right, it is safe to invoke hostname(1) now.
     	#
    -	[ -z "${rc_quiet}" ] && echo "Setting hostname: ${hostname}."
    +	check_startmsgs && echo -n "Setting hostname: ${hostname}"
     	/bin/hostname "${hostname}"
    +	check_startmsgs && echo '.'
     }
     
     load_rc_config $name
    diff --git a/etc/rc.d/ip6addrctl b/etc/rc.d/ip6addrctl
    index 66f1952a65b0..d3b185617959 100755
    --- a/etc/rc.d/ip6addrctl
    +++ b/etc/rc.d/ip6addrctl
    @@ -9,6 +9,7 @@
     # KEYWORD: nojail
     
     . /etc/rc.subr
    +. /etc/network.subr
     
     name="ip6addrctl"
     rcvar=`set_rcvar`
    @@ -23,6 +24,8 @@ set_rcvar_obsolete ipv6_enable ipv6_prefer
     
     ip6addrctl_prefer_ipv6()
     {
    +	afexists inet6 || return 0
    +
     	ip6addrctl flush >/dev/null 2>&1
     	ip6addrctl add ::1/128		50	0
     	ip6addrctl add ::/0		40	1
    @@ -34,6 +37,8 @@ ip6addrctl_prefer_ipv6()
     
     ip6addrctl_prefer_ipv4()
     {
    +	afexists inet6 || return 0
    +
     	ip6addrctl flush >/dev/null 2>&1
     	ip6addrctl add ::ffff:0:0/96	50	0
     	ip6addrctl add ::1/128		40	1
    @@ -45,30 +50,27 @@ ip6addrctl_prefer_ipv4()
     
     ip6addrctl_start()
     {
    -	if ifconfig lo0 inet6 >/dev/null 2>&1; then
    -		# We have IPv6 support in kernel.
    +	afexists inet6 || return 0
     
    -		# install the policy of the address selection algorithm.
    -		if [ -f /etc/ip6addrctl.conf ]; then
    -			ip6addrctl flush >/dev/null 2>&1
    -			ip6addrctl install /etc/ip6addrctl.conf
    -			checkyesno ip6addrctl_verbose && ip6addrctl
    +	# install the policy of the address selection algorithm.
    +	if [ -f /etc/ip6addrctl.conf ]; then
    +		ip6addrctl flush >/dev/null 2>&1
    +		ip6addrctl install /etc/ip6addrctl.conf
    +		checkyesno ip6addrctl_verbose && ip6addrctl
    +	else
    +		if checkyesno ipv6_prefer; then
    +			ip6addrctl_prefer_ipv6
     		else
    -			if checkyesno ipv6_prefer; then
    -				ip6addrctl_prefer_ipv6
    -			else
    -				ip6addrctl_prefer_ipv4
    -			fi
    +			ip6addrctl_prefer_ipv4
     		fi
     	fi
     }
     
     ip6addrctl_stop()
     {
    -	if ifconfig lo0 inet6 >/dev/null 2>&1; then
    -		# We have IPv6 support in kernel.
    -		ip6addrctl flush >/dev/null 2>&1
    -	fi
    +	afexists inet6 || return 0
    +
    +	ip6addrctl flush >/dev/null 2>&1
     }
     
     load_rc_config $name
    diff --git a/etc/rc.d/ip6fw b/etc/rc.d/ip6fw
    deleted file mode 100755
    index ca95d368a2fd..000000000000
    --- a/etc/rc.d/ip6fw
    +++ /dev/null
    @@ -1,48 +0,0 @@
    -#!/bin/sh
    -#
    -# $FreeBSD$
    -#
    -
    -# PROVIDE: ip6fw
    -# REQUIRE: routing
    -# KEYWORD: nojail
    -
    -. /etc/rc.subr
    -
    -name="ip6fw"
    -rcvar=`set_rcvar ipv6_firewall`
    -start_cmd="ip6fw_start"
    -stop_cmd="${SYSCTL_W} net.inet6.ip6.fw.enable=0"
    -required_modules="ipfw"
    -
    -ip6fw_start()
    -{
    -	# Specify default rules file if none provided
    -	if [ -z "${ipv6_firewall_script}" ]; then
    -		ipv6_firewall_script=/etc/rc.firewall6
    -	fi
    -
    -	# Load rules
    -	#
    -	if [ -r "${ipv6_firewall_script}" ]; then
    -		/bin/sh "${ipv6_firewall_script}"
    -		echo 'IPv6 Firewall rules loaded.'
    -	elif [ "`ipfw show 65535`" = "65535 deny ip from any to any" ]; then
    -		warn 'IPv6 firewall rules have not been loaded. Default' \
    -		    ' to DENY all access.'
    -	fi
    -
    -	# Enable firewall logging
    -	#
    -	if checkyesno ipv6_firewall_logging; then
    -		echo 'IPv6 Firewall logging=YES'
    -		sysctl net.inet.ip.fw.verbose=1 >/dev/null
    -	fi
    -
    -	# Enable the firewall
    -	#
    -	${SYSCTL_W} net.inet6.ip6.fw.enable=1
    -}
    -
    -load_rc_config $name
    -run_rc_command "$1"
    diff --git a/etc/rc.d/ipfw b/etc/rc.d/ipfw
    index 872f2787ab3e..689905d9e4a8 100755
    --- a/etc/rc.d/ipfw
    +++ b/etc/rc.d/ipfw
    @@ -14,9 +14,12 @@ name="ipfw"
     rcvar="firewall_enable"
     start_cmd="ipfw_start"
     start_precmd="ipfw_prestart"
    +start_postcmd="ipfw_poststart"
     stop_cmd="ipfw_stop"
     required_modules="ipfw"
     
    +set_rcvar_obsolete ipv6_firewall_enable
    +
     ipfw_prestart()
     {
     	if checkyesno dummynet_enable; then
    @@ -40,9 +43,6 @@ ipfw_start()
     	[ -z "${firewall_script}" ] && firewall_script=/etc/rc.firewall
     
     	if [ -r "${firewall_script}" ]; then
    -		if [ -f /etc/rc.d/natd ] ; then
    -			/etc/rc.d/natd quietstart
    -		fi
     		/bin/sh "${firewall_script}" "${_firewall_type}"
     		echo 'Firewall rules loaded.'
     	elif [ "`ipfw list 65535`" = "65535 deny ip from any to any" ]; then
    @@ -57,23 +57,54 @@ ipfw_start()
     		echo 'Firewall logging enabled.'
     		sysctl net.inet.ip.fw.verbose=1 >/dev/null
     	fi
    +}
    +
    +ipfw_poststart()
    +{
    +	local	_coscript
    +
    +	# Start firewall coscripts
    +	#
    +	for _coscript in ${firewall_coscripts} ; do
    +		if [ -f "${_coscript}" ]; then
    +			${_coscript} quietstart
    +		fi
    +	done
     
     	# Enable the firewall
     	#
     	if ! ${SYSCTL_W} net.inet.ip.fw.enable=1 1>/dev/null 2>&1; then
    -		warn "failed to enable firewall"
    +		warn "failed to enable IPv4 firewall"
    +	fi
    +	if afexists inet6; then
    +		if ! ${SYSCTL_W} net.inet6.ip6.fw.enable=1 1>/dev/null 2>&1
    +		then
    +			warn "failed to enable IPv6 firewall"
    +		fi
     	fi
     }
     
     ipfw_stop()
     {
    +	local	_coscript
    +
     	# Disable the firewall
     	#
     	${SYSCTL_W} net.inet.ip.fw.enable=0
    -	if [ -f /etc/rc.d/natd ] ; then
    -		/etc/rc.d/natd quietstop
    +	if afexists inet6; then
    +		${SYSCTL_W} net.inet6.ip6.fw.enable=0
     	fi
    +
    +	# Stop firewall coscripts
    +	#
    +	for _coscript in `reverse_list ${firewall_coscripts}` ; do
    +		if [ -f "${_coscript}" ]; then
    +			${_coscript} quietstop
    +		fi
    +	done
     }
     
     load_rc_config $name
    +firewall_coscripts="/etc/rc.d/natd ${firewall_coscripts}"
    +
     run_rc_command $*
    diff --git a/etc/rc.d/jail b/etc/rc.d/jail
    index 830cd5f8170a..084acb713b53 100755
    --- a/etc/rc.d/jail
    +++ b/etc/rc.d/jail
    @@ -728,4 +728,4 @@ fi
     if [ -n "$*" ]; then
     	jail_list="$*"
     fi
    -run_rc_command "${cmd}"
    +run_rc_command "${cmd}" &
    diff --git a/etc/rc.d/ldconfig b/etc/rc.d/ldconfig
    index 8e30576394f2..5ed1ed1d5d77 100755
    --- a/etc/rc.d/ldconfig
    +++ b/etc/rc.d/ldconfig
    @@ -36,7 +36,7 @@ ldconfig_start()
     				_LDC="${_LDC} ${i}"
     			fi
     		done
    -		[ -z "${rc_quiet}" ] && echo 'ELF ldconfig path:' ${_LDC}
    +		check_startmsgs && echo 'ELF ldconfig path:' ${_LDC}
     		${ldconfig} -elf ${_ins} ${_LDC}
     
     		case `sysctl -n hw.machine_arch` in
    @@ -55,7 +55,7 @@ ldconfig_start()
     					_LDC="${_LDC} ${i}"
     				fi
     			done
    -			[ -z "${rc_quiet}" ] &&
    +			check_startmsgs &&
     			    echo '32-bit compatibility ldconfig path:' ${_LDC}
     			${ldconfig} -32 -m ${_ins} ${_LDC}
     			;;
    @@ -72,8 +72,7 @@ ldconfig_start()
     					_LDC="${_LDC} ${i}"
     				fi
     			done
    -			[ -z "${rc_quiet}" ] &&
    -			    echo 'a.out ldconfig path:' ${_LDC}
    +			check_startmsgs && echo 'a.out ldconfig path:' ${_LDC}
     			${ldconfig} -aout ${_ins} ${_LDC}
     			;;
     		esac
    diff --git a/etc/rc.d/motd b/etc/rc.d/motd
    index 0b6707a58a22..8256d9682836 100755
    --- a/etc/rc.d/motd
    +++ b/etc/rc.d/motd
    @@ -22,7 +22,7 @@ motd_start()
     	#	Must be done *before* interactive logins are possible
     	#	to prevent possible race conditions.
     	#
    -	[ -z "${rc_quiet}" ] && echo -n 'Updating motd:'
    +	check_startmsgs && echo -n 'Updating motd:'
     	if [ ! -f /etc/motd ]; then
     		install -c -o root -g wheel -m ${PERMS} /dev/null /etc/motd
     	fi
    @@ -42,7 +42,7 @@ motd_start()
     	}
     	rm -f $T
     
    -	[ -z "${rc_quiet}" ] && echo .
    +	check_startmsgs && echo '.'
     }
     
     load_rc_config $name
    diff --git a/etc/rc.d/mountcritlocal b/etc/rc.d/mountcritlocal
    index 49f8f06bb8aa..789251765eb2 100755
    --- a/etc/rc.d/mountcritlocal
    +++ b/etc/rc.d/mountcritlocal
    @@ -28,7 +28,7 @@ mountcritlocal_start()
     	esac
     
     	# Mount everything except nfs filesystems.
    -	[ -z "${rc_quiet}" ] && echo -n 'Mounting local file systems:'
    +	check_startmsgs && echo -n 'Mounting local file systems:'
     	mount_excludes='no'
     	for i in ${netfs_types}; do
     		fstype=${i%:*}
    @@ -37,7 +37,7 @@ mountcritlocal_start()
     	mount_excludes=${mount_excludes%,}
     	mount -a -t ${mount_excludes}
     	err=$?
    -	[ -z "${rc_quiet}" ] && echo '.'
    +	check_startmsgs && echo '.'
     
     	case ${err} in
     	0)
    diff --git a/etc/rc.d/moused b/etc/rc.d/moused
    index 60372a020f21..fd2c447c60ad 100755
    --- a/etc/rc.d/moused
    +++ b/etc/rc.d/moused
    @@ -51,8 +51,9 @@ moused_start()
     		mytype="$moused_type"
     	fi
     
    -	[ -z "${rc_quiet}" ] && echo -n "Starting ${ms} moused."
    +	check_startmsgs && echo -n "Starting ${ms} moused"
     	/usr/sbin/moused ${myflags} -p ${myport} -t ${mytype} ${pidarg}
    +	check_startmsgs && echo '.'
     
     	mousechar_arg=
     	case ${mousechar_start} in
    diff --git a/etc/rc.d/named b/etc/rc.d/named
    index 65a13a54eb91..346b6fc9dd41 100755
    --- a/etc/rc.d/named
    +++ b/etc/rc.d/named
    @@ -12,10 +12,9 @@
     name="named"
     rcvar=named_enable
     
    -command="/usr/sbin/named"
     extra_commands="reload"
     
    -start_precmd="named_precmd"
    +start_precmd="named_prestart"
     start_postcmd="named_poststart"
     reload_cmd="named_reload"
     stop_cmd="named_stop"
    @@ -44,19 +43,19 @@ chroot_autoupdate()
     		warn "chroot directory structure not updated"
     	fi
     
    -	# Create /etc/namedb symlink
    +	# Create (or update) the configuration directory symlink
     	#
    -	if [ ! -L /etc/namedb ]; then
    -		if [ -d /etc/namedb ]; then
    -			warn "named chroot: /etc/namedb is a directory!"
    -		elif [ -e /etc/namedb ]; then
    -			warn "named chroot: /etc/namedb exists!"
    +	if [ ! -L "${named_conf%/*}" ]; then
    +		if [ -d "${named_conf%/*}" ]; then
    +			warn "named chroot: ${named_conf%/*} is a directory!"
    +		elif [ -e "${named_conf%/*}" ]; then
    +			warn "named chroot: ${named_conf%/*} exists!"
     		else
    -			ln -s ${named_chrootdir}/etc/namedb /etc/namedb
    +			ln -s ${named_confdir} ${named_conf%/*}
     		fi
     	else
     		# Make sure it points to the right place.
    -		ln -shf ${named_chrootdir}/etc/namedb /etc/namedb
    +		ln -shf ${named_confdir} ${named_conf%/*}
     	fi
     
     	# Mount a devfs in the chroot directory if needed
    @@ -155,8 +154,17 @@ create_file () {
     	chmod 644 $1
     }
     
    -named_precmd()
    +named_prestart()
     {
    +	command_args="-u ${named_uid:=root}"
    +
    +	if [ ! "$named_conf" = '/etc/namedb/named.conf' ]; then
    +		case "$named_flags" in
    +		-c*|*' -c'*) ;;		# No need to add it
    +		*) command_args="-c $named_conf $command_args" ;;
    +		esac
    +	fi
    +
     	local line nsip firstns
     
     	# Is the user using a sandbox?
    @@ -170,13 +178,13 @@ named_precmd()
     
     	# Create an rndc.key file for the user if none exists
     	#
    -	if [ -s "${named_chrootdir}/etc/namedb/rndc.conf" ]; then
    -		return 0
    -	fi
     	confgen_command="${command%/named}/rndc-confgen -a -b256 -u $named_uid \
    -	    -c ${named_chrootdir}/etc/namedb/rndc.key"
    -	if [ -s "${named_chrootdir}/etc/namedb/rndc.key" ]; then
    -		case `stat -f%Su ${named_chrootdir}/etc/namedb/rndc.key` in
    +	    -c ${named_confdir}/rndc.key"
    +	if [ -s "${named_confdir}/rndc.conf" ]; then
    +		unset confgen_command
    +	fi
    +	if [ -s "${named_confdir}/rndc.key" ]; then
    +		case `stat -f%Su ${named_confdir}/rndc.key` in
     		root|$named_uid) ;;
     		*) $confgen_command ;;
     		esac
    @@ -190,8 +198,8 @@ named_precmd()
     			warn "named_auto_forward enabled, but no /etc/resolv.conf"
     
     			# Empty the file in case it is included in named.conf
    -			[ -s "${named_chrootdir}/etc/namedb/auto_forward.conf" ] &&
    -			    create_file ${named_chrootdir}/etc/namedb/auto_forward.conf
    +			[ -s "${named_confdir}/auto_forward.conf" ] &&
    +			    create_file ${named_confdir}/auto_forward.conf
     
     			${command%/named}/named-checkconf $named_conf ||
     			    err 3 'named-checkconf for $named_conf failed'
    @@ -240,19 +248,19 @@ named_precmd()
     			mv /var/run/naf-resolv.conf /etc/resolv.conf
     		fi
     
    -		if cmp -s ${named_chrootdir}/etc/namedb/auto_forward.conf \
    +		if cmp -s ${named_confdir}/auto_forward.conf \
     		    /var/run/auto_forward.conf; then
     			unlink /var/run/auto_forward.conf
     		else
    -			[ -e "${named_chrootdir}/etc/namedb/auto_forward.conf" ] &&
    -			    unlink ${named_chrootdir}/etc/namedb/auto_forward.conf
    +			[ -e "${named_confdir}/auto_forward.conf" ] &&
    +			    unlink ${named_confdir}/auto_forward.conf
     			mv /var/run/auto_forward.conf \
    -			    ${named_chrootdir}/etc/namedb/auto_forward.conf
    +			    ${named_confdir}/auto_forward.conf
     		fi
     	else
     		# Empty the file in case it is included in named.conf
    -		[ -s "${named_chrootdir}/etc/namedb/auto_forward.conf" ] &&
    -		    create_file ${named_chrootdir}/etc/namedb/auto_forward.conf
    +		[ -s "${named_confdir}/auto_forward.conf" ] &&
    +		    create_file ${named_confdir}/auto_forward.conf
     	fi
     
     	${command%/named}/named-checkconf $named_conf ||
    @@ -260,10 +268,12 @@ named_precmd()
     }
     
     load_rc_config $name
    +
     # Updating the following variables requires that rc.conf be loaded first
     #
     required_dirs="$named_chrootdir"	# if it is set, it must exist
    +required_files="${named_conf:=/etc/namedb/named.conf}"
     pidfile="${named_pidfile:-/var/run/named/pid}"
    -command_args="-u ${named_uid:=root}"
    +named_confdir="${named_chrootdir}${named_conf%/*}"
     
     run_rc_command "$1"
    diff --git a/etc/rc.d/netif b/etc/rc.d/netif
    index 3c8e5dc5d200..f982cfce6474 100755
    --- a/etc/rc.d/netif
    +++ b/etc/rc.d/netif
    @@ -143,7 +143,7 @@ network_common()
     			;;
     		esac
     		echo "${_str} Network:${_ok}."
    -		if [ -z "${rc_quiet}" ]; then
    +		if check_startmsgs; then
     			for ifn in ${_ok}; do
     				/sbin/ifconfig ${ifn}
     			done
    diff --git a/etc/rc.d/netoptions b/etc/rc.d/netoptions
    index 593333a74005..463130456797 100755
    --- a/etc/rc.d/netoptions
    +++ b/etc/rc.d/netoptions
    @@ -9,6 +9,7 @@
     # KEYWORD: nojail
     
     . /etc/rc.subr
    +. /etc/network.subr
     
     name="netoptions"
     start_cmd="netoptions_start"
    @@ -25,29 +26,51 @@ netoptions_init()
     
     netoptions_start()
     {
    -	if checkyesno log_in_vain; then
    +	local _af
    +
    +	for _af in inet inet6; do
    +		afexists ${_af} && eval netoptions_${_af}
    +	done
    +	[ -n "${_netoptions_initdone}" ] && echo '.'
    +}
    +
    +netoptions_inet()
    +{
    +	case ${log_in_vain} in
    +	[12])
     		netoptions_init
     		echo -n " log_in_vain=${log_in_vain}"
    -		${SYSCTL_W} net.inet.tcp.log_in_vain="${log_in_vain}" >/dev/null
    -		${SYSCTL_W} net.inet.udp.log_in_vain="${log_in_vain}" >/dev/null
    -	fi
    +		${SYSCTL_W} net.inet.tcp.log_in_vain=${log_in_vain} >/dev/null
    +		${SYSCTL_W} net.inet.udp.log_in_vain=${log_in_vain} >/dev/null
    +		;;
    +	*)
    +		${SYSCTL_W} net.inet.tcp.log_in_vain=0 >/dev/null
    +		${SYSCTL_W} net.inet.udp.log_in_vain=0 >/dev/null
    +		;;
    +	esac
     
     	if checkyesno tcp_extensions; then
    +		${SYSCTL_W} net.inet.tcp.rfc1323=1 >/dev/null
    +	else
     		netoptions_init
    -		echo -n ' rfc1323 extensions=NO'
    +		echo -n " rfc1323 extensions=${tcp_extensions}"
     		${SYSCTL_W} net.inet.tcp.rfc1323=0 >/dev/null
     	fi
     
    -	if ! checkyesno tcp_keepalive; then
    +	if checkyesno tcp_keepalive; then
    +		${SYSCTL_W} net.inet.tcp.always_keepalive=1 >/dev/null
    +	else
     		netoptions_init
    -		echo -n ' TCP keepalive=NO'
    +		echo -n " TCP keepalive=${tcp_keepalive}"
     		${SYSCTL_W} net.inet.tcp.always_keepalive=0 >/dev/null
     	fi
     
     	if checkyesno tcp_drop_synfin; then
     		netoptions_init
    -		echo -n ' drop SYN+FIN packets=YES'
    +		echo -n " drop SYN+FIN packets=${tcp_drop_synfin}"
     		${SYSCTL_W} net.inet.tcp.drop_synfin=1 >/dev/null
    +	else
    +		${SYSCTL_W} net.inet.tcp.drop_synfin=0 >/dev/null
     	fi
     
     	case ${ip_portrange_first} in
    @@ -65,15 +88,17 @@ netoptions_start()
     		${SYSCTL_W} net.inet.ip.portrange.last=$ip_portrange_last >/dev/null
     		;;
     	esac
    +}
     
    +netoptions_inet6()
    +{
     	if checkyesno ipv6_ipv4mapping; then
    +		netoptions_init
    +		echo -n " ipv4-mapped-ipv6=${ipv6_ipv4mapping}"
     		${SYSCTL_W} net.inet6.ip6.v6only=0 >/dev/null
     	else
    -		echo -n " no-ipv4-mapped-ipv6"
     		${SYSCTL_W} net.inet6.ip6.v6only=1 >/dev/null
     	fi
    -
    -	[ -n "${_netoptions_initdone}" ] && echo '.'
     }
     
     load_rc_config $name
    diff --git a/etc/rc.d/newsyslog b/etc/rc.d/newsyslog
    index f03d97cfb0f4..ab8f2d314971 100755
    --- a/etc/rc.d/newsyslog
    +++ b/etc/rc.d/newsyslog
    @@ -17,9 +17,9 @@ stop_cmd=":"
     
     newsyslog_start()
     {
    -	[ -z "${rc_quiet}" ] && echo -n "Creating and/or trimming log files:"
    +	check_startmsgs && echo -n 'Creating and/or trimming log files'
     	${command} ${rc_flags}
    -	[ -z "${rc_quiet}" ] && echo "."
    +	check_startmsgs && echo '.'
     }
     
     load_rc_config $name
    diff --git a/etc/rc.d/nfsclient b/etc/rc.d/nfsclient
    index 2b26d09da6dc..d28e45f6a2e9 100755
    --- a/etc/rc.d/nfsclient
    +++ b/etc/rc.d/nfsclient
    @@ -22,7 +22,8 @@ nfsclient_start()
     	#
     
     	if [ -n "${nfs_access_cache}" ]; then
    -		[ -z "${rc_quiet}" ] && echo "NFS access cache time=${nfs_access_cache}"
    +		check_startmsgs &&
    +			echo "NFS access cache time=${nfs_access_cache}"
     		if ! sysctl vfs.nfs.access_cache_timeout=${nfs_access_cache} >/dev/null; then
     			warn "failed to set access cache timeout"
     		fi
    diff --git a/etc/rc.d/nsswitch b/etc/rc.d/nsswitch
    index 1540583c1633..8b0b228d77dd 100755
    --- a/etc/rc.d/nsswitch
    +++ b/etc/rc.d/nsswitch
    @@ -77,10 +77,10 @@ generate_host_conf()
     	nis)
     		echo "nis" >> $host_conf
     		;;
    -	*=*)
    +	cache | *=*)
     		;;
     	*)
    -		printf "Warning: unrecognized source [%s]", $_s > "/dev/stderr"
    +		printf "Warning: unrecognized source [%s]\n" $_s >&2
     		;;
     	esac
         done
    diff --git a/etc/rc.d/ntpdate b/etc/rc.d/ntpdate
    index c76f7a0e7f54..3f93e2718072 100755
    --- a/etc/rc.d/ntpdate
    +++ b/etc/rc.d/ntpdate
    @@ -19,7 +19,9 @@ ntpdate_start()
     	if [ -z "$ntpdate_hosts" -a -f ${ntpdate_config} ]; then
     		ntpdate_hosts=`awk '
     			/^server[ \t]*127.127/      {next}
    -			/^(server|peer)/            {print $2}
    +			/^(server|peer)/            {
    +			    if ($2 ~/^-/)           {print $3}
    +			    else                    {print $2}}
     		' < ${ntpdate_config}`
     	fi
     	if [ -n "$ntpdate_hosts" -o -n "$rc_flags" ]; then
    diff --git a/etc/rc.d/pf b/etc/rc.d/pf
    index f1044a36882e..9f64c04a6696 100755
    --- a/etc/rc.d/pf
    +++ b/etc/rc.d/pf
    @@ -25,19 +25,21 @@ required_modules="pf"
     
     pf_start()
     {
    -	[ -z "${rc_quiet}" ] && echo "Enabling pf."
    +	check_startmsgs && echo -n 'Enabling pf'
     	$pf_program -F all > /dev/null 2>&1
     	$pf_program -f "$pf_rules" $pf_flags
     	if ! $pf_program -s info | grep -q "Enabled" ; then
     		$pf_program -e
     	fi
    +	check_startmsgs && echo '.'
     }
     
     pf_stop()
     {
     	if $pf_program -s info | grep -q "Enabled" ; then
    -		[ -z "${rc_quiet}" ] && echo "Disabling pf."
    +		echo -n 'Disabling pf'
     		$pf_program -d
    +		echo '.'
     	fi
     }
     
    diff --git a/etc/rc.d/routing b/etc/rc.d/routing
    index 05f6013635a1..befceca0752f 100755
    --- a/etc/rc.d/routing
    +++ b/etc/rc.d/routing
    @@ -13,83 +13,108 @@
     . /etc/network.subr
     
     name="routing"
    -start_cmd="routing_start"
    +start_cmd="routing_start doall"
     stop_cmd="routing_stop"
     extra_commands="options static"
    -static_cmd="static_start"
    -options_cmd="options_start"
    +static_cmd="routing_start static"
    +options_cmd="routing_start options"
    +
    +afcheck()
    +{
    +	case $_af in
    +	""|inet|inet6|ipx|atm)
    +		;;
    +	*)
    +		err 1 "Unsupported address family: $_af."
    +		;;
    +	esac
    +}
     
     routing_start()
     {
    -	static_start "$@"
    -	options_start "$@"
    +	local _cmd _af _a
    +	_cmd=$1
    +	_af=$2
    +
    +	afcheck
    +
    +	case $_af in
    +	inet|inet6|ipx|atm)
    +		setroutes $_cmd $_af
    +		;;
    +	"")
    +		for _a in inet inet6 ipx atm; do
    +			afexists $_a && setroutes $_cmd $_a
    +		done
    +		;;
    +	esac
    +	[ -n "${_ropts_initdone}" ] && echo '.'
     }
     
     routing_stop()
     {
    -	static_stop "$@"
    -	route -n flush
    +	local _af _a
    +	_af=$1
    +
    +	afcheck
    +
    +	case $_af in
    +	inet|inet6|ipx|atm)
    +		eval static_${_af} delete
    +		eval routing_stop_${_af}
    +		;;
    +	"")
    +		for _a in inet inet6 ipx atm; do
    +			afexists $_a || continue
    +			eval static_${_a} delete
    +			eval routing_stop_${_a}
    +		done
    +		;;
    +	esac
    +}
    +
    +setroutes()
    +{
    +	case $1 in
    +	static)
    +		static_$2 add
    +		;;
    +	options)
    +		options_$2
    +		;;
    +	doall)
    +		static_$2 add
    +		options_$2
    +		;;
    +	esac
    +}
    +
    +routing_stop_inet()
    +{
    +	route -n flush -inet
    +}
    +
    +routing_stop_inet6()
    +{
    +	local i
    +
    +	route -n flush -inet6
     	for i in ${ipv6_network_interfaces}; do
     		ifconfig $i inet6 -defaultif
     	done
     }
     
    -static_start()
    +routing_stop_atm()
     {
    -	local _af
    -	_af=$1
    -
    -	case ${_af} in
    -	inet)
    -		do_static inet add
    -		;;
    -	inet6)
    -		do_static inet6 add
    -		;;
    -	atm)
    -		do_static atm add
    -		;;
    -	*)
    -		do_static inet add
    -		do_static inet6 add
    -		do_static atm add
    -		;;
    -	esac
    +	return 0
     }
     
    -static_stop()
    +routing_stop_ipx()
     {
    -	local _af
    -	_af=$1
    -
    -	case ${_af} in
    -	inet)
    -		do_static inet delete
    -		;;
    -	inet6)
    -		do_static inet6 delete
    -		;;
    -	atm)
    -		do_static atm delete
    -		;;
    -	*)
    -		do_static inet delete
    -		do_static inet6 delete
    -		do_static atm delete
    -		;;
    -	esac
    +	return 0
     }
     
    -do_static()
    -{
    -	local _af _action
    -	_af=$1
    -	_action=$2
    -
    -	eval $1_static $2
    -}
    -
    -inet_static()
    +static_inet()
     {
     	local _action
     	_action=$1
    @@ -111,7 +136,7 @@ inet_static()
     	fi
     }
     
    -inet6_static()
    +static_inet6()
     {
     	local _action i
     	_action=$1
    @@ -218,9 +243,9 @@ inet6_static()
     	esac
     }
     
    -atm_static()
    +static_atm()
     {
    -	local _action i
    +	local _action i route_args
     	_action=$1
     
     	if [ -n "${natm_static_routes}" ]; then
    @@ -231,6 +256,10 @@ atm_static()
     	fi
     }
     
    +static_ipx()
    +{
    +}
    +
     _ropts_initdone=
     ropts_init()
     {
    @@ -240,63 +269,89 @@ ropts_init()
     	fi
     }
     
    -options_start()
    +options_inet()
     {
     	if checkyesno icmp_bmcastecho; then
     		ropts_init
     		echo -n ' broadcast ping responses=YES'
    -		sysctl net.inet.icmp.bmcastecho=1 >/dev/null
    +		${SYSCTL_W} net.inet.icmp.bmcastecho=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.inet.icmp.bmcastecho=0 > /dev/null
     	fi
     
     	if checkyesno icmp_drop_redirect; then
     		ropts_init
     		echo -n ' ignore ICMP redirect=YES'
    -		sysctl net.inet.icmp.drop_redirect=1 >/dev/null
    +		${SYSCTL_W} net.inet.icmp.drop_redirect=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.inet.icmp.drop_redirect=0 > /dev/null
     	fi
     
     	if checkyesno icmp_log_redirect; then
     		ropts_init
     		echo -n ' log ICMP redirect=YES'
    -		sysctl net.inet.icmp.log_redirect=1 >/dev/null
    +		${SYSCTL_W} net.inet.icmp.log_redirect=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.inet.icmp.log_redirect=0 > /dev/null
     	fi
     
     	if checkyesno gateway_enable; then
     		ropts_init
     		echo -n ' IPv4 gateway=YES'
    -		sysctl net.inet.ip.forwarding=1 >/dev/null
    -	fi
    -
    -	if checkyesno ipv6_gateway_enable; then
    -		ropts_init
    -		echo -n ' IPv6 gateway=YES'
    -		sysctl net.inet6.ip6.forwarding=1 >/dev/null
    +		${SYSCTL_W} net.inet.ip.forwarding=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.inet.ip.forwarding=0 > /dev/null
     	fi
     
     	if checkyesno forward_sourceroute; then
     		ropts_init
     		echo -n ' do source routing=YES'
    -		sysctl net.inet.ip.sourceroute=1 >/dev/null
    +		${SYSCTL_W} net.inet.ip.sourceroute=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.inet.ip.sourceroute=0 > /dev/null
     	fi
     
     	if checkyesno accept_sourceroute; then
     		ropts_init
     		echo -n ' accept source routing=YES'
    -		sysctl net.inet.ip.accept_sourceroute=1 >/dev/null
    -	fi
    -
    -	if checkyesno ipxgateway_enable; then
    -		ropts_init
    -		echo -n ' IPX gateway=YES'
    -		sysctl net.ipx.ipx.ipxforwarding=1 >/dev/null
    +		${SYSCTL_W} net.inet.ip.accept_sourceroute=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.inet.ip.accept_sourceroute=0 > /dev/null
     	fi
     
     	if checkyesno arpproxy_all; then
     		ropts_init
     		echo -n ' ARP proxyall=YES'
    -		sysctl net.link.ether.inet.proxyall=1 >/dev/null
    +		${SYSCTL_W} net.link.ether.inet.proxyall=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.link.ether.inet.proxyall=0 > /dev/null
     	fi
    +}
     
    -	 [ -n "${_ropts_initdone}" ] && echo '.'
    +options_inet6()
    +{
    +	if checkyesno ipv6_gateway_enable; then
    +		ropts_init
    +		echo -n ' IPv6 gateway=YES'
    +		${SYSCTL_W} net.inet6.ip6.forwarding=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.inet6.ip6.forwarding=0 > /dev/null
    +	fi
    +}
    +
    +options_atm()
    +{
    +}
    +
    +options_ipx()
    +{
    +	if checkyesno ipxgateway_enable; then
    +		ropts_init
    +		echo -n ' IPX gateway=YES'
    +		${SYSCTL_W} net.ipx.ipx.ipxforwarding=1 > /dev/null
    +	else
    +		${SYSCTL_W} net.ipx.ipx.ipxforwarding=0 > /dev/null
    +	fi
     }
     
     load_rc_config $name
    diff --git a/etc/rc.d/rtsold b/etc/rc.d/rtsold
    new file mode 100755
    index 000000000000..64a83e3a08a6
    --- /dev/null
    +++ b/etc/rc.d/rtsold
    @@ -0,0 +1,26 @@
    +#!/bin/sh
    +#
    +# $FreeBSD$
    +#
    +
    +# PROVIDE: rtsold
    +# REQUIRE: netif
    +# BEFORE: NETWORKING
    +# KEYWORD: nojail shutdown
    +
    +. /etc/rc.subr
    +
    +name="rtsold"
    +rcvar=`set_rcvar`
    +command="/usr/sbin/${name}"
    +pidfile="/var/run/${name}.pid"
    +start_postcmd="rtsold_poststart"
    +
    +rtsold_poststart()
    +{
    +	# wait for DAD
    +	sleep $(($(${SYSCTL_N} net.inet6.ip6.dad_count) + 1))
    +}
    +
    +load_rc_config $name
    +run_rc_command "$1"
    diff --git a/etc/rc.d/savecore b/etc/rc.d/savecore
    index ff8e128eda03..2bee021392ce 100755
    --- a/etc/rc.d/savecore
    +++ b/etc/rc.d/savecore
    @@ -69,7 +69,7 @@ savecore_start()
     			${crashinfo_program} -d ${dumpdir}
     		fi
     	else
    -		[ -z "${rc_quiet}" ] && echo "No core dumps found"
    +		check_startmsgs && echo 'No core dumps found.'
     	fi
     }
     
    diff --git a/etc/rc.d/static_arp b/etc/rc.d/static_arp
    old mode 100644
    new mode 100755
    index 582518fe97ea..6283b56ef087
    --- a/etc/rc.d/static_arp
    +++ b/etc/rc.d/static_arp
    @@ -34,6 +34,7 @@
     # KEYWORD: nojail
     
     . /etc/rc.subr
    +. /etc/network.subr
     
     name="static_arp"
     start_cmd="static_arp_start"
    diff --git a/etc/rc.d/stf b/etc/rc.d/stf
    index 40b182a0de93..bb7f5b5ea559 100755
    --- a/etc/rc.d/stf
    +++ b/etc/rc.d/stf
    @@ -3,7 +3,7 @@
     #
     
     # PROVIDE: stf
    -# REQUIRE: netif routing
    +# REQUIRE: netif
     # KEYWORD: nojail
     
     . /etc/rc.subr
    @@ -53,9 +53,8 @@ stf_up()
     		ifconfig stf0 create >/dev/null 2>&1
     		ifconfig stf0 inet6 2002:${ipv4_in_hexformat}:${stf_interface_ipv6_slaid:-0}:${stf_interface_ipv6_ifid} \
     			prefixlen ${stf_prefixlen}
    -		if [ -z "${rc_quiet}" ]; then
    -			/sbin/ifconfig stf0
    -		fi
    +		check_startmsgs && /sbin/ifconfig stf0
    +
     		# disallow packets to malicious 6to4 prefix
     		route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject
     		route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject
    diff --git a/etc/rc.d/var b/etc/rc.d/var
    index 4b57fb5026f2..8e5bddefb84e 100755
    --- a/etc/rc.d/var
    +++ b/etc/rc.d/var
    @@ -98,12 +98,12 @@ case "${populate_var}" in
     	;;
     esac
     
    -# Make sure we have /var/log/lastlog and /var/log/wtmp files
    -if [ ! -f /var/log/lastlog ]; then
    -	cp /dev/null /var/log/lastlog
    -	chmod 644 /var/log/lastlog
    +# Make sure we have /var/log/utx.lastlogin and /var/log/utx.log files
    +if [ ! -f /var/log/utx.lastlogin ]; then
    +	cp /dev/null /var/log/utx.lastlogin
    +	chmod 644 /var/log/utx.lastlogin
     fi
    -if [ ! -f /var/log/wtmp ]; then
    -	cp /dev/null /var/log/wtmp
    -	chmod 644 /var/log/wtmp
    +if [ ! -f /var/log/utx.log ]; then
    +	cp /dev/null /var/log/utx.log
    +	chmod 644 /var/log/utx.log
     fi
    diff --git a/etc/rc.firewall b/etc/rc.firewall
    index bc700d1f8b27..7034359b96b6 100644
    --- a/etc/rc.firewall
    +++ b/etc/rc.firewall
    @@ -85,12 +85,42 @@ setup_loopback () {
     	${fwcmd} add 100 pass all from any to any via lo0
     	${fwcmd} add 200 deny all from any to 127.0.0.0/8
     	${fwcmd} add 300 deny ip from 127.0.0.0/8 to any
    +	if [ $ipv6_available -eq 0 ]; then
    +		${fwcmd} add 400 deny all from any to ::1
    +		${fwcmd} add 500 deny all from ::1 to any
    +	fi
    +}
    +
    +setup_ipv6_mandatory () {
    +	[ $ipv6_available -eq 0 ] || return 0
    +
    +	############
    +	# Only in rare cases do you want to change these rules
    +	#
    +	# ND
    +	#
    +	# DAD
    +	${fwcmd} add pass ipv6-icmp from :: to ff02::/16
    +	# RS, RA, NS, NA, redirect...
    +	${fwcmd} add pass ipv6-icmp from fe80::/10 to fe80::/10
    +	${fwcmd} add pass ipv6-icmp from fe80::/10 to ff02::/16
    +
    +	# Allow ICMPv6 destination unreach
    +	${fwcmd} add pass ipv6-icmp from any to any icmp6types 1
    +
    +	# Allow NS/NA/toobig (don't filter it out)
    +	${fwcmd} add pass ipv6-icmp from any to any icmp6types 2,135,136
     }
     
     if [ -n "${1}" ]; then
     	firewall_type="${1}"
     fi
     
    +. /etc/rc.subr
    +. /etc/network.subr
    +afexists inet6
    +ipv6_available=$?
    +
     ############
     # Set quiet mode if requested
     #
    @@ -109,6 +139,7 @@ esac
     ${fwcmd} -f flush
     
     setup_loopback
    +setup_ipv6_mandatory
     
     ############
     # Network Address Translation.  All packets are passed to natd(8)
    @@ -166,11 +197,13 @@ case ${firewall_type} in
     	# against people from outside your own network.
     	#
     	# Configuration:
    -	#  firewall_client_net:		Network address of local network.
    +	#  firewall_client_net:		Network address of local IPv4 network.
    +	#  firewall_client_net_ipv6:	Network address of local IPv6 network.
     	############
     
     	# set this to your local network
     	net="$firewall_client_net"
    +	net6="$firewall_client_net_ipv6"
     
     	# Allow limited broadcast traffic from my own net.
     	${fwcmd} add pass all from ${net} to 255.255.255.255
    @@ -178,6 +211,18 @@ case ${firewall_type} in
     	# Allow any traffic to or from my own net.
     	${fwcmd} add pass all from me to ${net}
     	${fwcmd} add pass all from ${net} to me
    +	if [ -n "$net6" ]; then
    +		${fwcmd} add pass all from me to ${net6}
    +		${fwcmd} add pass all from ${net6} to me
    +	fi
    +
    +	if [ -n "$net6" ]; then
    +		# Allow any link-local multicast traffic
    +		${fwcmd} add pass all from fe80::/10 to ff02::/16
    +		${fwcmd} add pass all from ${net6} to ff02::/16
    +		# Allow DHCPv6
    +		${fwcmd} add pass udp from fe80::/10 to me 546
    +	fi
     
     	# Allow TCP through if setup succeeded
     	${fwcmd} add pass tcp from any to any established
    @@ -212,23 +257,38 @@ case ${firewall_type} in
     	# on the inside at this machine for those services.
     	#
     	# Configuration:
    -	#  firewall_simple_iif:		Inside network interface.
    -	#  firewall_simple_inet:	Inside network address.
    -	#  firewall_simple_oif:		Outside network interface.
    -	#  firewall_simple_onet:	Outside network address.
    +	#  firewall_simple_iif:		Inside IPv4 network interface.
    +	#  firewall_simple_inet:	Inside IPv4 network address.
    +	#  firewall_simple_oif:		Outside IPv4 network interface.
    +	#  firewall_simple_onet:	Outside IPv4 network address.
    +	#  firewall_simple_iif_ipv6:	Inside IPv6 network interface.
    +	#  firewall_simple_inet_ipv6:	Inside IPv6 network prefix.
    +	#  firewall_simple_oif_ipv6:	Outside IPv6 network interface.
    +	#  firewall_simple_onet_ipv6:	Outside IPv6 network prefix.
     	############
     
     	# set these to your outside interface network
     	oif="$firewall_simple_oif"
     	onet="$firewall_simple_onet"
    +	oif6="${firewall_simple_oif_ipv6:-$firewall_simple_oif}"
    +	onet6="$firewall_simple_onet_ipv6"
     
     	# set these to your inside interface network
     	iif="$firewall_simple_iif"
     	inet="$firewall_simple_inet"
    +	iif6="${firewall_simple_iif_ipv6:-$firewall_simple_iif}"
    +	inet6="$firewall_simple_inet_ipv6"
     
     	# Stop spoofing
     	${fwcmd} add deny all from ${inet} to any in via ${oif}
     	${fwcmd} add deny all from ${onet} to any in via ${iif}
    +	if [ -n "$inet6" ]; then
    +		${fwcmd} add deny all from ${inet6} to any in via ${oif6}
    +		if [ -n "$onet6" ]; then
    +			${fwcmd} add deny all from ${onet6} to any in \
    +			    via ${iif6}
    +		fi
    +	fi
     
     	# Stop RFC1918 nets on the outside interface
     	${fwcmd} add deny all from any to 10.0.0.0/8 via ${oif}
    @@ -254,7 +314,7 @@ case ${firewall_type} in
     	case ${natd_enable} in
     	[Yy][Ee][Ss])
     		if [ -n "${natd_interface}" ]; then
    -			${fwcmd} add divert natd all from any to any via ${natd_interface}
    +			${fwcmd} add divert natd ip4 from any to any via ${natd_interface}
     		fi
     		;;
     	esac
    @@ -273,6 +333,55 @@ case ${firewall_type} in
     	${fwcmd} add deny all from 224.0.0.0/4 to any via ${oif}
     	${fwcmd} add deny all from 240.0.0.0/4 to any via ${oif}
     
    +	if [ -n "$inet6" ]; then
    +		# Stop unique local unicast address on the outside interface
    +		${fwcmd} add deny all from fc00::/7 to any via ${oif6}
    +		${fwcmd} add deny all from any to fc00::/7 via ${oif6}
    +
    +		# Stop site-local on the outside interface
    +		${fwcmd} add deny all from fec0::/10 to any via ${oif6}
    +		${fwcmd} add deny all from any to fec0::/10 via ${oif6}
    +
    +		# Disallow "internal" addresses to appear on the wire.
    +		${fwcmd} add deny all from ::ffff:0.0.0.0/96 to any \
    +		    via ${oif6}
    +		${fwcmd} add deny all from any to ::ffff:0.0.0.0/96 \
    +		    via ${oif6}
    +
    +		# Disallow packets to malicious IPv4 compatible prefix.
    +		${fwcmd} add deny all from ::224.0.0.0/100 to any via ${oif6}
    +		${fwcmd} add deny all from any to ::224.0.0.0/100 via ${oif6}
    +		${fwcmd} add deny all from ::127.0.0.0/104 to any via ${oif6}
    +		${fwcmd} add deny all from any to ::127.0.0.0/104 via ${oif6}
    +		${fwcmd} add deny all from ::0.0.0.0/104 to any via ${oif6}
    +		${fwcmd} add deny all from any to ::0.0.0.0/104 via ${oif6}
    +		${fwcmd} add deny all from ::255.0.0.0/104 to any via ${oif6}
    +		${fwcmd} add deny all from any to ::255.0.0.0/104 via ${oif6}
    +
    +		${fwcmd} add deny all from ::0.0.0.0/96 to any via ${oif6}
    +		${fwcmd} add deny all from any to ::0.0.0.0/96 via ${oif6}
    +
    +		# Disallow packets to malicious 6to4 prefix.
    +		${fwcmd} add deny all from 2002:e000::/20 to any via ${oif6}
    +		${fwcmd} add deny all from any to 2002:e000::/20 via ${oif6}
    +		${fwcmd} add deny all from 2002:7f00::/24 to any via ${oif6}
    +		${fwcmd} add deny all from any to 2002:7f00::/24 via ${oif6}
    +		${fwcmd} add deny all from 2002:0000::/24 to any via ${oif6}
    +		${fwcmd} add deny all from any to 2002:0000::/24 via ${oif6}
    +		${fwcmd} add deny all from 2002:ff00::/24 to any via ${oif6}
    +		${fwcmd} add deny all from any to 2002:ff00::/24 via ${oif6}
    +
    +		${fwcmd} add deny all from 2002:0a00::/24 to any via ${oif6}
    +		${fwcmd} add deny all from any to 2002:0a00::/24 via ${oif6}
    +		${fwcmd} add deny all from 2002:ac10::/28 to any via ${oif6}
    +		${fwcmd} add deny all from any to 2002:ac10::/28 via ${oif6}
    +		${fwcmd} add deny all from 2002:c0a8::/32 to any via ${oif6}
    +		${fwcmd} add deny all from any to 2002:c0a8::/32 via ${oif6}
    +
    +		${fwcmd} add deny all from ff05::/16 to any via ${oif6}
    +		${fwcmd} add deny all from any to ff05::/16 via ${oif6}
    +	fi
    +
     	# Allow TCP through if setup succeeded
     	${fwcmd} add pass tcp from any to any established
     
    @@ -291,7 +400,11 @@ case ${firewall_type} in
     	${fwcmd} add pass tcp from any to me 80 setup
     
     	# Reject&Log all setup of incoming connections from the outside
    -	${fwcmd} add deny log tcp from any to any in via ${oif} setup
    +	${fwcmd} add deny log ip4 from any to any in via ${oif} setup proto tcp
    +	if [ -n "$inet6" ]; then
    +		${fwcmd} add deny log ip6 from any to any in via ${oif6} \
    +		    setup proto tcp
    +	fi
     
     	# Allow setup of any other TCP connection
     	${fwcmd} add pass tcp from any to any setup
    @@ -313,7 +426,7 @@ case ${firewall_type} in
     	#			 	 offers services.
     	#  firewall_allowservices:	List of IPs which has access to
     	#				 $firewall_myservices.
    -	#  firewall_trusted:		List of IPs which has full access 
    +	#  firewall_trusted:		List of IPv4s which has full access 
     	#				 to this host. Be very carefull 
     	#				 when setting this. This option can
     	#				 seriously degrade the level of 
    @@ -324,7 +437,12 @@ case ${firewall_type} in
     	#  firewall_nologports:		List of TCP/UDP ports for which
     	#				 denied incomming packets are not
     	#				 logged.
    -	
    +	#  firewall_trusted_ipv6:	List of IPv6s which has full access 
    +	#				 to this host. Be very carefull 
    +	#				 when setting this. This option can
    +	#				 seriously degrade the level of 
    +	#				 protection provided by the firewall.
    +
     	# Allow packets for which a state has been built.
     	${fwcmd} add check-state
     
    @@ -335,18 +453,30 @@ case ${firewall_type} in
     	${fwcmd} add pass tcp  from me to any setup keep-state
     	${fwcmd} add pass udp  from me to any       keep-state
     	${fwcmd} add pass icmp from me to any       keep-state
    +	if [ $ipv6_available -eq 0 ]; then
    +		${fwcmd} add pass ipv6-icmp from me to any keep-state
    +	fi
     
     	# Allow DHCP.
     	${fwcmd} add pass udp  from 0.0.0.0 68 to 255.255.255.255 67 out
     	${fwcmd} add pass udp  from any 67     to me 68 in
     	${fwcmd} add pass udp  from any 67     to 255.255.255.255 68 in
    +	if [ $ipv6_available -eq 0 ]; then
    +		${fwcmd} add pass udp from fe80::/10 to me 546 in
    +	fi
     	# Some servers will ping the IP while trying to decide if it's 
     	# still in use.
     	${fwcmd} add pass icmp from any to any icmptype 8
    +	if [ $ipv6_available -eq 0 ]; then
    +		${fwcmd} add pass ipv6-icmp from any to any icmp6type 128,129
    +	fi
     
     	# Allow "mandatory" ICMP in.
     	${fwcmd} add pass icmp from any to any icmptype 3,4,11
    -	
    +	if [ $ipv6_available -eq 0 ]; then
    +		${fwcmd} add pass ipv6-icmp from any to any icmp6type 3
    +	fi
    +
     	# Add permits for this workstations published services below
     	# Only IPs and nets in firewall_allowservices is allowed in.
     	# If you really wish to let anyone use services on your 
    @@ -370,7 +500,7 @@ case ${firewall_type} in
     	for i in ${firewall_trusted} ; do
     	  ${fwcmd} add pass ip from $i to me
     	done
    -	
    +
     	${fwcmd} add 65000 count ip from any to any
     
     	# Drop packets to ports where we don't want logging
    diff --git a/etc/rc.firewall6 b/etc/rc.firewall6
    deleted file mode 100644
    index 7498bbc68f5d..000000000000
    --- a/etc/rc.firewall6
    +++ /dev/null
    @@ -1,295 +0,0 @@
    -#!/bin/sh -
    -############
    -# Setup system for IPv6 firewall service.
    -# $FreeBSD$
    -
    -# Suck in the configuration variables.
    -if [ -z "${source_rc_confs_defined}" ]; then
    -	if [ -r /etc/defaults/rc.conf ]; then
    -		. /etc/defaults/rc.conf
    -		source_rc_confs
    -	elif [ -r /etc/rc.conf ]; then
    -		. /etc/rc.conf
    -	fi
    -fi
    -
    -############
    -# Define the firewall type in /etc/rc.conf.  Valid values are:
    -#   open     - will allow anyone in
    -#   client   - will try to protect just this machine
    -#   simple   - will try to protect a whole network
    -#   closed   - totally disables IP services except via lo0 interface
    -#   UNKNOWN  - disables the loading of firewall rules.
    -#   filename - will load the rules in the given filename (full path required)
    -#
    -# For ``client'' and ``simple'' the entries below should be customized
    -# appropriately.
    -
    -############
    -#
    -# If you don't know enough about packet filtering, we suggest that you
    -# take time to read this book:
    -#
    -#	Building Internet Firewalls, 2nd Edition
    -#	Brent Chapman and Elizabeth Zwicky
    -#
    -#	O'Reilly & Associates, Inc
    -#	ISBN 1-56592-871-7
    -#	http://www.ora.com/
    -#	http://www.oreilly.com/catalog/fire2/
    -#
    -# For a more advanced treatment of Internet Security read:
    -#
    -#	Firewalls and Internet Security: Repelling the Wily Hacker, 2nd Edition
    -#	William R. Cheswick, Steven M. Bellowin, Aviel D. Rubin
    -#
    -#	Addison-Wesley / Prentice Hall
    -#	ISBN 0-201-63466-X
    -#	http://www.pearsonhighered.com/
    -#	http://www.pearsonhighered.com/educator/academic/product/0,3110,020163466X,00.html
    -#
    -
    -setup_local () {
    -	############
    -	# Only in rare cases do you want to change these rules
    -	#
    -	${fw6cmd} add 100 pass ip6 from any to any via lo0
    -	${fw6cmd} add 200 deny ip6 from any to ::1
    -	${fw6cmd} add 300 deny ip6 from ::1 to any
    -	#
    -	# ND
    -	#
    -	# DAD
    -	${fw6cmd} add pass ip6 from :: to ff02::/16 proto ipv6-icmp
    -	# RS, RA, NS, NA, redirect...
    -	${fw6cmd} add pass ip6 from fe80::/10 to fe80::/10 proto ipv6-icmp
    -	${fw6cmd} add pass ip6 from fe80::/10 to ff02::/16 proto ipv6-icmp
    -}
    -
    -if [ -n "${1}" ]; then
    -	ipv6_firewall_type="${1}"
    -fi
    -
    -############
    -# Set quiet mode if requested
    -#
    -case ${ipv6_firewall_quiet} in
    -[Yy][Ee][Ss])
    -	fw6cmd="/sbin/ipfw -q"
    -	;;
    -*)
    -	fw6cmd="/sbin/ipfw"
    -	;;
    -esac
    -
    -############
    -# Flush out the list before we begin.
    -#
    -${fw6cmd} -f flush
    -
    -############
    -# If you just configured ipfw in the kernel as a tool to solve network
    -# problems or you just want to disallow some particular kinds of traffic
    -# then you will want to change the default policy to open.  You can also
    -# do this as your only action by setting the ipv6_firewall_type to ``open''.
    -#
    -# ${fw6cmd} add 65000 pass all from any to any
    -
    -
    -# Prototype setups.
    -#
    -case ${ipv6_firewall_type} in
    -[Oo][Pp][Ee][Nn])
    -	setup_local
    -	${fw6cmd} add 65000 pass ip6 from any to any
    -	;;
    -
    -[Cc][Ll][Ii][Ee][Nn][Tt])
    -	############
    -	# This is a prototype setup that will protect your system somewhat
    -	# against people from outside your own network.
    -	############
    -
    -	# set these to your network and prefixlen and ip
    -	#
    -	# This needs more work
    -	#
    -	net="2001:db8:2:1::"
    -	prefixlen="64"
    -	ip="2001:db8:2:1::1"
    -
    -	setup_local
    -
    -	# Allow any traffic to or from my own net.
    -	${fw6cmd} add pass ip6 from ${ip} to ${net}/${prefixlen}
    -	${fw6cmd} add pass ip6 from ${net}/${prefixlen} to ${ip}
    -
    -	# Allow any link-local multicast traffic
    -	${fw6cmd} add pass ip6 from fe80::/10 to ff02::/16
    -	${fw6cmd} add pass ip6 from ${net}/${prefixlen} to ff02::/16
    -
    -	# Allow TCP through if setup succeeded
    -	${fw6cmd} add pass ip6 from any to any established proto tcp
    -
    -	# Allow IP fragments to pass through
    -	${fw6cmd} add pass ip6 from any to any frag
    -
    -	# Allow setup of incoming email
    -	${fw6cmd} add pass ip6 from any to ${ip} 25 setup proto tcp
    -
    -	# Allow setup of outgoing TCP connections only
    -	${fw6cmd} add pass ip6 from ${ip} to any setup proto tcp
    -
    -	# Disallow setup of all other TCP connections
    -	${fw6cmd} add deny ip6 from any to any setup proto tcp
    -
    -	# Allow DNS queries out in the world
    -	${fw6cmd} add pass ip6 from any 53 to ${ip} proto udp
    -	${fw6cmd} add pass ip6 from ${ip} to any 53 proto udp
    -
    -	# Allow NTP queries out in the world
    -	${fw6cmd} add pass ip6 from any 123 to ${ip} proto udp
    -	${fw6cmd} add pass ip6 from ${ip} to any 123 proto udp
    -
    -	# Allow ICMPv6 destination unreach
    -	${fw6cmd} add pass ip6 from any to any icmp6types 1 proto ipv6-icmp
    -
    -	# Allow NS/NA/toobig (don't filter it out)
    -	${fw6cmd} add pass ip6 from any to any icmp6types 2,135,136 \
    -	    proto ipv6-icmp
    -
    -	# Everything else is denied by default, unless the
    -	# IPV6FIREWALL_DEFAULT_TO_ACCEPT option is set in your kernel
    -	# config file.
    -	;;
    -
    -[Ss][Ii][Mm][Pp][Ll][Ee])
    -	############
    -	# This is a prototype setup for a simple firewall.  Configure this
    -	# machine as a DNS and NTP server, and point all the machines
    -	# on the inside at this machine for those services.
    -	############
    -
    -	# set these to your outside interface network and prefixlen and ip
    -	oif="ed0"
    -	onet="2001:db8:2:1::"
    -	oprefixlen="64"
    -	oip="2001:db8:2:1::1"
    -
    -	# set these to your inside interface network and prefixlen and ip
    -	iif="ed1"
    -	inet="2001:db8:2:2::"
    -	iprefixlen="64"
    -	iip="2001:db8:2:2::1"
    -
    -	setup_local
    -
    -	# Stop spoofing
    -	${fw6cmd} add deny ip6 from ${inet}/${iprefixlen} to any in via ${oif}
    -	${fw6cmd} add deny ip6 from ${onet}/${oprefixlen} to any in via ${iif}
    -
    -	# Stop unique local unicast address on the outside interface
    -	${fw6cmd} add deny ip6 from fc00::/7 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to fc00::/7 via ${oif}
    -
    -	# Stop site-local on the outside interface
    -	${fw6cmd} add deny ip6 from fec0::/10 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to fec0::/10 via ${oif}
    -
    -	# Disallow "internal" addresses to appear on the wire.
    -	${fw6cmd} add deny ip6 from ::ffff:0.0.0.0/96 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to ::ffff:0.0.0.0/96 via ${oif}
    -
    -	# Disallow packets to malicious IPv4 compatible prefix.
    -	${fw6cmd} add deny ip6 from ::224.0.0.0/100 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to ::224.0.0.0/100 via ${oif}
    -	${fw6cmd} add deny ip6 from ::127.0.0.0/104 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to ::127.0.0.0/104 via ${oif}
    -	${fw6cmd} add deny ip6 from ::0.0.0.0/104 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to ::0.0.0.0/104 via ${oif}
    -	${fw6cmd} add deny ip6 from ::255.0.0.0/104 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to ::255.0.0.0/104 via ${oif}
    -
    -	${fw6cmd} add deny ip6 from ::0.0.0.0/96 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to ::0.0.0.0/96 via ${oif}
    -
    -	# Disallow packets to malicious 6to4 prefix.
    -	${fw6cmd} add deny ip6 from 2002:e000::/20 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to 2002:e000::/20 via ${oif}
    -	${fw6cmd} add deny ip6 from 2002:7f00::/24 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to 2002:7f00::/24 via ${oif}
    -	${fw6cmd} add deny ip6 from 2002:0000::/24 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to 2002:0000::/24 via ${oif}
    -	${fw6cmd} add deny ip6 from 2002:ff00::/24 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to 2002:ff00::/24 via ${oif}
    -
    -	${fw6cmd} add deny ip6 from 2002:0a00::/24 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to 2002:0a00::/24 via ${oif}
    -	${fw6cmd} add deny ip6 from 2002:ac10::/28 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to 2002:ac10::/28 via ${oif}
    -	${fw6cmd} add deny ip6 from 2002:c0a8::/32 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to 2002:c0a8::/32 via ${oif}
    -
    -	${fw6cmd} add deny ip6 from ff05::/16 to any via ${oif}
    -	${fw6cmd} add deny ip6 from any to ff05::/16 via ${oif}
    -
    -	# Allow TCP through if setup succeeded
    -	${fw6cmd} add pass tcp from any to any established
    -
    -	# Allow IP fragments to pass through
    -	${fw6cmd} add pass ip6 from any to any frag
    -
    -	# Allow setup of incoming email
    -	${fw6cmd} add pass ip6 from any to ${oip} 25 setup proto tcp
    -
    -	# Allow access to our DNS
    -	${fw6cmd} add pass ip6 from any to ${oip} 53 setup proto tcp
    -	${fw6cmd} add pass ip6 from any to ${oip} 53 proto udp
    -	${fw6cmd} add pass ip6 from ${oip} 53 to any proto udp
    -
    -	# Allow access to our WWW
    -	${fw6cmd} add pass ip6 from any to ${oip} 80 setup proto tcp
    -
    -	# Reject&Log all setup of incoming connections from the outside
    -	${fw6cmd} add deny log ip6 from any to any in via ${oif} setup \
    -	    proto tcp
    -
    -	# Allow setup of any other TCP connection
    -	${fw6cmd} add pass ip6 from any to any setup proto tcp
    -
    -	# Allow DNS queries out in the world
    -	${fw6cmd} add pass ip6 from any 53 to ${oip} proto udp
    -	${fw6cmd} add pass ip6 from ${oip} to any 53 proto udp
    -
    -	# Allow NTP queries out in the world
    -	${fw6cmd} add pass ip6 from any 123 to ${oip} proto udp
    -	${fw6cmd} add pass ip6 from ${oip} to any 123 proto udp
    -
    -	# Allow RIPng
    -	#${fw6cmd} add pass ip6 from fe80::/10 521 to ff02::9 521 proto udp
    -	#${fw6cmd} add pass ip6 from fe80::/10 521 to fe80::/10 521 proto udp
    -
    -	# Allow ICMPv6 destination unreach
    -	${fw6cmd} add pass ip6 from any to any icmp6types 1 proto ipv6-icmp
    -
    -	# Allow NS/NA/toobig (don't filter it out)
    -	${fw6cmd} add pass ip6 from any to any icmp6types 2,135,136 \
    -	     proto ipv6-icmp
    -
    -	# Everything else is denied by default, unless the
    -	# IPV6FIREWALL_DEFAULT_TO_ACCEPT option is set in your kernel
    -	# config file.
    -	;;
    -
    -[Cc][Ll][Oo][Ss][Ee][Dd])
    -	# Only enable the loopback interface
    -	${fw6cmd} add 100 pass ip6 from any to any via lo0
    -	;;
    -[Uu][Nn][Kk][Nn][Oo][Ww][Nn])
    -	;;
    -*)
    -	if [ -r "${ipv6_firewall_type}" ]; then
    -		${fw6cmd} ${ipv6_firewall_flags} ${ipv6_firewall_type}
    -	fi
    -	;;
    -esac
    diff --git a/etc/rc.subr b/etc/rc.subr
    index 6cb7db51c9ab..0c28f2d267aa 100644
    --- a/etc/rc.subr
    +++ b/etc/rc.subr
    @@ -15,13 +15,6 @@
     # 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. All advertising materials mentioning features or use of this software
    -#    must display the following acknowledgement:
    -#        This product includes software developed by the NetBSD
    -#        Foundation, Inc. and its contributors.
    -# 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    @@ -52,22 +45,12 @@ _rc_subr_loaded="YES"
     
     SYSCTL="/sbin/sysctl"
     SYSCTL_N="${SYSCTL} -n"
    -CMD_OSTYPE="${SYSCTL_N} kern.ostype"
    -OSTYPE=`${CMD_OSTYPE}`
    +SYSCTL_W="${SYSCTL}"
     ID="/usr/bin/id"
     IDCMD="if [ -x $ID ]; then $ID -un; fi"
     PS="/bin/ps -ww"
     JID=`$PS -p $$ -o jid=`
     
    -case ${OSTYPE} in
    -FreeBSD)
    -	SYSCTL_W="${SYSCTL}"
    -	;;
    -NetBSD)
    -	SYSCTL_W="${SYSCTL} -w"
    -	;;
    -esac
    -
     #
     #	functions
     #	---------
    @@ -390,13 +373,27 @@ wait_for_pids()
     		_list=$_nlist
     		echo -n ${_prefix:-"Waiting for PIDS: "}$_list
     		_prefix=", "
    -		sleep 2
    +		pwait $_list 2>/dev/null || sleep 2
     	done
     	if [ -n "$_prefix" ]; then
     		echo "."
     	fi
     }
     
    +#
    +# check_startmsgs
    +#	If rc_quiet is set (usually as a result of using faststart at
    +#	boot time) check if rc_startmsgs is enabled.
    +#
    +check_startmsgs()
    +{
    +	if [ -n "$rc_quiet" ]; then
    +		checkyesno rc_startmsgs
    +	else
    +		return 0
    +	fi
    +}
    +
     #
     # run_rc_command argument
     #	Search for argument in the list of supported commands, which is:
    @@ -579,7 +576,7 @@ run_rc_command()
     		rc_fast=yes
     		rc_quiet=yes
     		;;
    -	force*)				# "force prefix; always run
    +	force*)				# "force" prefix; always run
     		rc_force=yes
     		_rc_prefix=force
     		rc_arg=${rc_arg#${_rc_prefix}}
    @@ -602,7 +599,7 @@ run_rc_command()
     	esac
     
     	eval _override_command=\$${name}_program
    -	command=${command:-${_override_command}}
    +	command=${_override_command:-$command}
     
     	_keywords="start stop restart rcvar $extra_commands"
     	rc_pid=
    @@ -708,13 +705,7 @@ run_rc_command()
     
     					# setup the full command to run
     					#
    -			_show_startmsgs=1
    -			if [ -n "${rc_quiet}" ]; then
    -				if ! checkyesno rc_startmsgs; then
    -					unset _show_startmsgs
    -				fi
    -			fi
    -			[ -n "$_show_startmsgs" ] && echo "Starting ${name}."
    +			check_startmsgs && echo "Starting ${name}."
     			if [ -n "$_chroot" ]; then
     				_doit="\
     ${_nice:+nice -n $_nice }\
    @@ -730,7 +721,7 @@ $command $rc_flags $command_args"
     				if [ -n "$_nice" ]; then
     					if [ -z "$_user" ]; then
     						_doit="sh -c \"$_doit\""
    -					fi	
    +					fi
     					_doit="nice -n $_nice $_doit"
     				fi
     			fi
    @@ -950,10 +941,11 @@ _run_rc_killcmd()
     #
     # run_rc_script file arg
     #	Start the script `file' with `arg', and correctly handle the
    -#	return value from the script.  If `file' ends with `.sh', it's
    -#	sourced into the current environment.  If `file' appears to be
    -#	a backup or scratch file, ignore it.  Otherwise if it's
    -#	executable run as a child process.
    +#	return value from the script.
    +#	If `file' ends with `.sh', it's sourced into the current environment
    +#	when $rc_fast_and_loose is set, otherwise it is run as a child process.
    +#	If `file' appears to be a backup or scratch file, ignore it.
    +#	Otherwise if it is executable run as a child process.
     #
     run_rc_script()
     {
    @@ -1055,7 +1047,7 @@ load_rc_config()
     		esac
     	done
     }
    -  
    +
     #
     # load_rc_config_var name var
     #	Read the rc.conf(5) var for name and set in the
    diff --git a/etc/root/dot.profile b/etc/root/dot.profile
    index ab8431959c7c..1fca58edc87c 100644
    --- a/etc/root/dot.profile
    +++ b/etc/root/dot.profile
    @@ -4,7 +4,7 @@ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:~/b
     export PATH
     HOME=/root
     export HOME
    -TERM=${TERM:-cons25}
    +TERM=${TERM:-xterm}
     export TERM
     PAGER=more
     export PAGER
    diff --git a/etc/sendmail/freebsd.mc b/etc/sendmail/freebsd.mc
    index b6b02c2d094a..4bf41a56340d 100644
    --- a/etc/sendmail/freebsd.mc
    +++ b/etc/sendmail/freebsd.mc
    @@ -34,7 +34,7 @@ divert(-1)
     #
     
     #
    -#  This is a generic configuration file for FreeBSD 5.X and later systems.
    +#  This is a generic configuration file for FreeBSD 6.X and later systems.
     #  If you want to customize it, copy it to a name appropriate for your
     #  environment and do the modifications there.
     #
    diff --git a/etc/sendmail/freebsd.submit.mc b/etc/sendmail/freebsd.submit.mc
    index c6ec65553598..0fd8d63237ab 100644
    --- a/etc/sendmail/freebsd.submit.mc
    +++ b/etc/sendmail/freebsd.submit.mc
    @@ -25,3 +25,4 @@ define(`confBIND_OPTS', `WorkAroundBrokenAAAA')dnl
     dnl
     dnl If you use IPv6 only, change [127.0.0.1] to [IPv6:::1]
     FEATURE(`msp', `[127.0.0.1]')dnl
    +
    diff --git a/etc/services b/etc/services
    index 729f20be11dc..4499c69d61d5 100644
    --- a/etc/services
    +++ b/etc/services
    @@ -1521,6 +1521,8 @@ nfa		1155/tcp   #Network File Access
     nfa		1155/udp   #Network File Access
     phone		1167/udp   #conference calling
     skkserv		1178/tcp   #SKK (kanji input)
    +openvpn		1194/tcp   #OpenVPN
    +openvpn		1194/udp   #OpenVPN
     lupa		1212/tcp
     lupa		1212/udp
     nerv		1222/tcp   #SNI R&D network
    @@ -2223,10 +2225,14 @@ nuts_dem	4132/tcp   #NUTS Daemon
     nuts_dem	4132/udp   #NUTS Daemon
     nuts_bootp	4133/tcp   #NUTS Bootp Server
     nuts_bootp	4133/udp   #NUTS Bootp Server
    +sieve		4190/tcp   #ManageSieve Protocol
    +sieve		4190/udp   #ManageSieve Protocol
     rwhois		4321/tcp   #Remote Who Is
     rwhois		4321/udp   #Remote Who Is
     unicall		4343/tcp
     unicall		4343/udp
    +epmd		4369/tcp   #Erlang Port Mapper Daemon
    +epmd		4369/udp   #Erlang Port Mapper Daemon
     krb524		4444/tcp
     krb524		4444/udp
     # PROBLEM krb524 assigned the port,
    @@ -2334,6 +2340,8 @@ sge_execd	6445/tcp   #Grid Engine Execution Service
     sge_execd	6445/udp   #Grid Engine Execution Service
     xdsxdm		6558/tcp
     xdsxdm		6558/udp
    +sane-port	6566/tcp   #Scanner Access Now Easy (SANE) Control Port
    +sane-port	6566/udp   #Scanner Access Now Easy (SANE) Control Port
     ircd		6667/tcp   #Internet Relay Chat (unoffical)
     acmsoda		6969/tcp
     acmsoda		6969/udp
    @@ -2372,6 +2380,8 @@ dlip		7201/udp
     ftp-proxy	8021/tcp   # FTP proxy
     natd		8668/divert # Network Address Translation
     jetdirect	9100/tcp   #HP JetDirect card
    +git		9418/tcp   #git pack transfer service
    +git		9418/udp   #git pack transfer service
     man		9535/tcp
     man		9535/udp
     sd		9876/tcp   #Session Director
    diff --git a/etc/termcap.small b/etc/termcap.small
    index e2b35b8f5d0f..916e31cd3776 100644
    --- a/etc/termcap.small
    +++ b/etc/termcap.small
    @@ -291,32 +291,37 @@ pc3|ibmpc3|IBM PC 386BSD Console:\
     	:up=\E[A:\
     	:ut:
     
    -# $XFree86: xc/programs/xterm/termcap,v 3.28 2001/01/17 23:46:39 dawes Exp $
    +# $XTermId: termcap,v 1.78 2009/11/09 00:24:26 tom Exp $
     #
    -xterm-xfree86|XFree86 xterm:\
    -	:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
    -	:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
    -	:k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\
    -	:@7=\EOF:@8=\EOM:kI=\E[2~:\
    -	:kh=\EOH:kP=\E[5~:kN=\E[6~:\
    -	:ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:Km=\E[M:tc=xterm-basic:
    +xterm-new|modern xterm:\
    +	:@7=\EOF:@8=\EOM:F1=\E[23~:F2=\E[24~:K2=\EOE:Km=\E[M:\
    +	:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\
    +	:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kI=\E[2~:\
    +	:kN=\E[6~:kP=\E[5~:kd=\EOB:kh=\EOH:kl=\EOD:kr=\EOC:ku=\EOA:\
    +	:tc=xterm-basic:
     #
     # This chunk is used for building the VT220/Sun/PC keyboard variants.
    -xterm-basic|xterm common (XFree86):\
    -	:li#24:co#80:am:kn#12:km:mi:ms:xn:AX:bl=^G:\
    -	:is=\E[!p\E[?3;4l\E[4l\E>:rs=\E[!p\E[?3;4l\E[4l\E>:le=^H:\
    -	:AL=\E[%dL:DL=\E[%dM:DC=\E[%dP:al=\E[L:dc=\E[P:dl=\E[M:\
    -	:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\
    -	:ho=\E[H:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:\
    -	:im=\E[4h:ei=\E[4l:ks=\E[?1h\E=:ke=\E[?1l\E>:kD=\E[3~:kb=^H:\
    -	:sf=\n:sr=\EM:st=\EH:ct=\E[3g:sc=\E7:rc=\E8:\
    -	:eA=\E(B\E)0:as=\E(0:ae=\E(B:ml=\El:mu=\Em:up=\E[A:nd=\E[C:\
    -	:md=\E[1m:me=\E[m:mr=\E[7m:so=\E[7m:se=\E[27m:us=\E[4m:ue=\E[24m:\
    -	:ti=\E[?1049h:te=\E[?1049l:vi=\E[?25l:ve=\E[?25h:\
    -	:ut:Co#8:pa#64:op=\E[39;49m:AB=\E[4%dm:AF=\E[3%dm:\
    +xterm-basic|modern xterm common:\
    +	:am:bs:km:mi:ms:ut:xn:AX:\
    +	:Co#8:co#80:kn#12:li#24:pa#64:\
    +	:AB=\E[4%dm:AF=\E[3%dm:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
    +	:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\E[L:\
    +	:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
    +	:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:\
    +	:ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>:\
    +	:kD=\E[3~:kb=^H:ke=\E[?1l\E>:ks=\E[?1h\E=:le=^H:md=\E[1m:\
    +	:me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:op=\E[39;49m:\
    +	:rc=\E8:rs=\E[!p\E[?3;4l\E[4l\E>:sc=\E7:se=\E[27m:sf=^J:\
    +	:so=\E[7m:sr=\EM:st=\EH:\
    +	:ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?12l\E[?25h:vi=\E[?25l:vs=\E[?12;25h:
     #
     # This is the only entry which you should have to customize, since "xterm"
     # is widely used for a variety of incompatible terminal emulations including
     # color_xterm and rxvt.
    -xterm|xterm-color|X11 terminal emulator:\
    -	:ti@:te@:tc=xterm-xfree86:
    +xterm|X11 terminal emulator:\
    +	:tc=xterm-new:
    +#
    +# Add the capability to "clear the screen" after exiting vi, more/less, etc.
    +xterm-clear:\
    +	:te=\E[?1049l:ti=\E[?1049h:\
    +	:tc=xterm-new:
    diff --git a/games/Makefile.inc b/games/Makefile.inc
    index b81af5e0f246..6e4b6f10429b 100644
    --- a/games/Makefile.inc
    +++ b/games/Makefile.inc
    @@ -3,3 +3,4 @@
     
     BINDIR?=	/usr/games
     FILESDIR?=	${SHAREDIR}/games
    +WARNS?=		6
    diff --git a/games/bcd/Makefile b/games/bcd/Makefile
    index 5698c121d638..1e0bbfc60cea 100644
    --- a/games/bcd/Makefile
    +++ b/games/bcd/Makefile
    @@ -2,7 +2,6 @@
     # $FreeBSD$
     
     PROG=	bcd
    -WARNS?=	6
     MAN=	bcd.6
     MLINKS=	bcd.6 ppt.6
     
    diff --git a/games/bcd/bcd.c b/games/bcd/bcd.c
    index 27f483ec6313..a294ac352ca9 100644
    --- a/games/bcd/bcd.c
    +++ b/games/bcd/bcd.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/caesar/Makefile b/games/caesar/Makefile
    index ebb770e861e4..88b79eeb62aa 100644
    --- a/games/caesar/Makefile
    +++ b/games/caesar/Makefile
    @@ -8,6 +8,4 @@ SCRIPTS=rot13.sh
     MAN=	caesar.6
     MLINKS=	caesar.6 rot13.6
     
    -WARNS?=	6
    -
     .include 
    diff --git a/games/caesar/caesar.c b/games/caesar/caesar.c
    index 25c0a123bd4f..a12f6413e11d 100644
    --- a/games/caesar/caesar.c
    +++ b/games/caesar/caesar.c
    @@ -18,11 +18,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/factor/factor.c b/games/factor/factor.c
    index e3aa90cb8bee..1444d0be202a 100644
    --- a/games/factor/factor.c
    +++ b/games/factor/factor.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -35,18 +31,20 @@
      */
     
     #ifndef lint
    -static const char copyright[] =
    -"@(#) Copyright (c) 1989, 1993\n\
    -	The Regents of the University of California.  All rights reserved.\n";
    -#endif /* not lint */
    -
    -#ifndef lint
    -#if 0
    -static char sccsid[] = "@(#)factor.c	8.4 (Berkeley) 5/4/95";
    -__RCSID("$NetBSD: factor.c,v 1.13 2002/06/18 23:07:36 simonb Exp $");
    +#include 
    +#ifdef __COPYRIGHT
    +__COPYRIGHT("@(#) Copyright (c) 1989, 1993\
    +	The Regents of the University of California.  All rights reserved.");
    +#endif
    +#ifdef __SCCSID
    +__SCCSID("@(#)factor.c	8.4 (Berkeley) 5/4/95");
    +#endif
    +#ifdef __RCSID
    +__RCSID("$NetBSD: factor.c,v 1.19 2009/08/12 05:54:31 dholland Exp $");
    +#endif
    +#ifdef __FBSDID
    +__FBSDID("$FreeBSD$");
     #endif
    -static const char rcsid[] =
    - "$FreeBSD$";
     #endif /* not lint */
     
     /*
    @@ -63,7 +61,7 @@ static const char rcsid[] =
      *
      *	number: factor1 factor1 factor2 factor3 factor3 factor3 ...
      *
    - * where factor1 < factor2 < factor3 < ...
    + * where factor1 <= factor2 <= factor3 <= ...
      *
      * If no args are given, the list of numbers are read from stdin.
      */
    @@ -214,7 +212,9 @@ pr_fact(BIGNUM *val)
     			bnfact = BN_new();
     			BN_set_word(bnfact, *(fact - 1));
     			BN_sqr(bnfact, bnfact, ctx);
    -			if (BN_cmp(bnfact, val) > 0)
    +			if (BN_cmp(bnfact, val) > 0 ||
    +			    BN_is_prime(val, PRIME_CHECKS,
    +					NULL, NULL, NULL) == 1)
     				pr_print(val);
     			else
     				pollard_pminus1(val);
    @@ -257,22 +257,28 @@ usage(void)
     
     #ifdef HAVE_OPENSSL
     
    -/* pollard rho, algorithm from Jim Gillogly, May 2000 */
    +/* pollard p-1, algorithm from Jim Gillogly, May 2000 */
     static void
     pollard_pminus1(BIGNUM *val)
     {
    -	BIGNUM *base, *num, *i, *x;
    +	BIGNUM *base, *rbase, *num, *i, *x;
     
     	base = BN_new();
    +	rbase = BN_new();
     	num = BN_new();
     	i = BN_new();
     	x = BN_new();
     
    +	BN_set_word(rbase, 1);
    +newbase:
    +	BN_add_word(rbase, 1);
     	BN_set_word(i, 2);
    -	BN_set_word(base, 2);
    +	BN_copy(base, rbase);
     
     	for (;;) {
     		BN_mod_exp(base, base, i, val, ctx);
    +		if (BN_is_one(base))
    +			goto newbase;
     
     		BN_copy(x, base);
     		BN_sub_word(x, 1);
    diff --git a/games/fortune/datfiles/fortunes b/games/fortune/datfiles/fortunes
    index de09c960db7e..ceff2a087f56 100644
    --- a/games/fortune/datfiles/fortunes
    +++ b/games/fortune/datfiles/fortunes
    @@ -68,6 +68,17 @@ the damage.  Having a bootable tape (for larger machines) is not a bad idea
     either.  If you need some help, give us a call.
     
     		-- CommUNIXque 1:1, ASCAR Business Systems
    +%
    +			   1/2
    +	12 + 144 + 20 + 3*4                    2
    +	----------------------  +  5 * 11  =  9  +  0
    +		  7
    +
    +A dozen, a gross and a score,
    +Plus three times the square root of four,
    +	Divided by seven,
    +	Plus five times eleven,
    +Equals nine squared plus zero, no more!
     %
     			-- Gifts for Children --
     
    @@ -673,17 +684,6 @@ Liza Minnelli.
     		-- Dave Barry, "In Search of Excellence"
     %
     	... with liberty and justice for all who can afford it.
    -%
    -			   1/2
    -	12 + 144 + 20 + 3*4                    2
    -	----------------------  +  5 * 11  =  9  +  0
    -		  7
    -
    -A dozen, a gross and a score,
    -Plus three times the square root of four,
    -	Divided by seven,
    -	Plus five times eleven,
    -Equals nine squared plus zero, no more!
     %
     	7,140	pounds on the Sun
     	   97	pounds on Mercury or Mars
    @@ -1695,14 +1695,6 @@ the Cat.
     	"I don't care much where--" said Alice.
     	"Then it doesn't matter which way you go," said the Cat.
     		-- Lewis Carroll
    -%
    -	COMMENT
    -
    -Oh, life is a glorious cycle of song,
    -A medley of extemporanea;
    -And love is thing that can never go wrong;
    -And I am Marie of Roumania.
    -		-- Dorothy Parker
     %
     	Concerning the war in Vietnam, Senator George Aiken of Vermont noted
     in January, 1966, "I'm not very keen for doves or hawks.  I think we need more
    @@ -1922,22 +1914,6 @@ Christmas tree.  The piano is missing.
     	You want to keep your party somewhere around level 3, unless
     you rent your home and own Firearms, in which case you can go to level
     4.  The best way to get to level 3 is egg-nog.
    -%
    -	FIGHTING WORDS
    -
    -Say my love is easy had,
    -	Say I'm bitten raw with pride,
    -Say I am too often sad --
    -	Still behold me at your side.
    -
    -Say I'm neither brave nor young,
    -	Say I woo and coddle care,
    -Say the devil touched my tongue --
    -	Still you have my heart to wear.
    -
    -But say my verses do not scan,
    -	And I get me another man!
    -		-- Dorothy Parker
     %
     	"For I perceive that behind this seemingly unrelated sequence
     of events, there lurks a singular, sinister attitude of mind."
    @@ -2209,20 +2185,6 @@ full of money before."
     	"Ran over a bottle."
     	"Didn't you see it?"
     	"Damn kid had it under his coat."
    -%
    -	Hug O' War
    -
    -I will not play at tug o' war.
    -I'd rather play at hug o' war,
    -Where everyone hugs
    -Instead of tugs,
    -Where everyone giggles
    -And rolls on the rug,
    -Where everyone kisses,
    -And everyone grins,
    -And everyone cuddles,
    -And everyone wins.
    -		-- Shel Silverstein
     %
     	Human thinking can skip over a great deal, leap over small
     misunderstandings, can contain ifs and buts in untroubled corners of
    @@ -2515,12 +2477,6 @@ which is why you should do them yourself.  There is no point in paying
     other people to screw things up when you can easily screw them up
     yourself for far less money.  This article can help you.
     		-- Dave Barry, "The Taming of the Screw"
    -%
    -	I'd say that VCS is more like the anal sex of the software
    -world: Everybody talks about it, some people do it, some people enjoy
    -it, but typically only vague implications about the best techniques
    -are ever voiced in public.
    -              -- Warner Losh, on Version Control Systems
     %
     	"I'll tell you what I know, then," he decided.  "The pin I'm wearing
     means I'm a member of the IA.  That's Inamorati Anonymous.  An inamorato is
    @@ -2682,33 +2638,6 @@ right any day."
     	"Pity," said Arthur with sympathy.  "It sounded like quite a good
     life-style otherwise."
     		-- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"
    -%
    -	Insofar as I may be heard by anything, which may or may not care
    -what I say, I ask, if it matters, that you be forgiven for anything you
    -may have done or failed to do which requires forgiveness.  Conversely, if
    -not forgiveness but something else may be required to insure any possible
    -benefit for which you may be eligible after the destruction of your body,
    -I ask this, whatever it may be, be granted or withheld, as the case may be,
    -in such a manner as to insure your receiving said benefit.  I ask this in my
    -capacity as your elected intermediary between yourself and that which may
    -not be yourself, but which may have an interest in the matter of your
    -receiving as much as it is possible for you to receive of this thing, and
    -which may in some way be influenced by this ceremony.
    -	Amen.
    -		-- Roger Zelazny, "Creatures of Light and Darkness", 1969
    -%
    -	INVENTORY
    -Four be the things I am wiser to know:
    -Idleness, sorrow, a friend, and a foe.
    -
    -Four be the things I'd been better without:
    -Love, curiosity, freckles, and doubt.
    -
    -Three be the things I shall never attain:
    -Envy, content, and sufficient champagne.
    -
    -Three be the things I shall have till I die:
    -Laughter and hope and a sock in the eye.
     %
     	"Is there any point to which you would wish to draw my attention?"
     	"To the curious incident of the dog in the night-time."
    @@ -3988,28 +3917,6 @@ The center is very pleased with progress to date.  They say they have
     almost succeeded in getting a VAX to think. However, sources inside the
     organization say that each time the machine fails to think it ceases to
     exist.
    -%
    -	THE LESSER-KNOWN PROGRAMMING LANGUAGES #5: VALGOL
    -From its modest beginnings in Southern California's San Fernando Valley,
    -VALGOL is enjoying a dramatic surge of popularity across the industry.
    -
    -Here is a sample program:
    -	LIKE, Y*KNOW(I MEAN)START
    -	IF PIZZA = LIKE BITCHEN AND GUY = LIKE TUBULAR AND
    -	   VALLEY GIRL = LIKE GRODY**MAX(FERSURE)**2 THEN
    -		FOR I = LIKE 1 TO OH*MAYBE 100
    -			DO*WAH - (DITTY**2)
    -			BARF(I)=TOTALLY GROSS(OUT)
    -		SURE
    -	LIKE BAG THIS PROGRAM
    -	REALLY
    -	LIKE TOTALLY (Y*KNOW)
    -	IM*SURE
    -	GOTO THE MALL
    -
    -When the user makes a syntax error, the interpreter displays the message:
    -
    -	GAG ME WITH A SPOON!!
     %
     	THE LESSER-KNOWN PROGRAMMING LANGUAGES #8: LAIDBACK
     
    @@ -5341,9 +5248,6 @@ that he didn't force you down on the asking price.
     -- A plethora of individuals wither expertise in culinary techniques vitiated
     	the potable concoction produced by steeping certain coupestibles.
     -- Eleemosynary deeds have their initial incidence intramurally.
    --- Male cadavers are incapable of yielding testimony.
    --- Individuals who make their abode in vitreous edifices would be well
    -	advised to refrain from catapulting projectiles.
     %
     =============== ALL FRESHMEN PLEASE NOTE ===============
     
    @@ -11082,9 +10986,6 @@ Armstrong's Collection Law:
     	If the check is truly in the mail,
     	it is surely made out to someone else.
     %
    -Arnold's Addendum:
    -	Anything not fitting into these categories causes cancer in rats.
    -%
     Arnold's Laws of Documentation:
     	1.) If it should exist, it doesn't.
     	2.) If it does exist, it's out of date.
    @@ -12660,7 +12561,7 @@ Boren's Laws:
     	(2) When in trouble, delegate.
     	(3) When in doubt, mumble.
     %
    -boss, n:
    +Boss, n:
     	According to the Oxford English Dictionary, in the Middle Ages the
     	words "boss" and "botch" were largely synonymous, except that boss,
     	in addition to meaning "a supervisor of workers" also meant "an
    @@ -12941,7 +12842,7 @@ wrote the program.
     Fortunately, the second-to-last bug has just been fixed.
     		-- Ray Simard
     %
    -bug, n:
    +Bug, n:
     	An elusive creature living in a program that makes it incorrect.
     	The activity of "debugging", or removing bugs from a program, ends
     	when people get tired of doing it, not when the bugs are removed.
    @@ -13530,14 +13431,14 @@ only robust persons doing this thing is that it has killed all the
     others who have tried it.
     		-- Ambrose Bierce, "The Devil's Dictionary"
     %
    -
    -Certain passages in several laws have always defied interpretation and the
    -most inexplicable must be a matter of opinion.  A judge of the Court of
    -Session of Scotland has sent the editors of this book his candidate which
    -reads, "In the Nuts (unground), (other than ground nuts) Order, the expression
    -nuts shall have reference to such nuts, other than ground nuts, as would
    -but for this amending Order not qualify as nuts (unground) (other than ground
    -nuts) by reason of their being nuts (unground)."
    +Certain passages in several laws have always defied interpretation and
    +the most inexplicable must be a matter of opinion.  A judge of the Court
    +of Session of Scotland has sent the editors of this book his candidate
    +which reads, "In the Nuts (unground), (other than ground nuts) Order,
    +the expression nuts shall have reference to such nuts, other than ground
    +nuts, as would but for this amending Order not qualify as nuts
    +(unground) (other than ground nuts) by reason of their being nuts
    +(unground)."
     		-- Guinness Book of World Records, 1973
     %
     Certainly the game is rigged.
    @@ -15063,17 +14964,6 @@ letter, or even 25 cents on a stamp!
     so post it as many places as you can.
     		-- Emily Postnews Answers Your Questions on Netiquette
     %
    -Dear Sir,
    -	I am firmly opposed to the spread of microchips either to the home or
    -to the office.  We have more than enough of them foisted upon us in public
    -places.  They are a disgusting Americanism, and can only result in the farmers
    -being forced to grow smaller potatoes, which in turn will cause massive un-
    -employment in the already severely depressed agricultural industry.
    -	Yours faithfully,
    -	Capt. Quinton D'Arcy, J.P.
    -	Sevenoaks
    -		-- Letters To The Editor, The Times of London
    -%
     Death before dishonor.
     But neither before breakfast.
     %
    @@ -17843,9 +17733,6 @@ Finagle's Eleventh Law:
     	No matter what occurs, someone believes
     	it happened according to his pet theory.
     %
    -Finagle's First Law:
    -	If an experiment works, something has gone wrong.
    -%
     Finagle's First Law:
     	To study a subject best, understand it thoroughly before you start.
     
    @@ -18126,7 +18013,7 @@ tail on me, go ahead.  They'd be very bored.
     		   commenting on rumors of womanizing.
     %
     Food for thought is no substitute for the real thing.
    -		-- Walt Kelly, "Putluck Pogo"
    +		-- Walt Kelly, "Potluck Pogo"
     %
     Foolproof Operation:
     	No provision for adjustment.
    @@ -18179,9 +18066,6 @@ For children with short attention spans: boomerangs that don't come back.
     For courage mounteth with occasion.
     		-- William Shakespeare, "King John"
     %
    -For every action, there is an equal and opposite criticism.
    -		-- Harrison
    -%
     For every bloke who makes his mark,
     there's half a dozen waiting to rub it out.
     		-- Andy Capp
    @@ -19526,17 +19410,6 @@ Your butt is on the menu
     And the check is in the mail.
     		-- The Piranha Club Anthem, to the tune of "De Camptown Races"
     %
    -From the "Guinness Book of World Records", 1973:
    -
    -Certain passages in several laws have always defied interpretation and
    -the most inexplicable must be a matter of opinion.  A judge of the
    -Court of Session of Scotland has sent the editors of this book his
    -candidate which reads, "In the Nuts (unground), (other than ground
    -nuts) Order, the expression nuts shall have reference to such nuts,
    -other than ground nuts, as would but for this amending Order not
    -qualify as nuts (unground)(other than ground nuts) by reason of their
    -being nuts (unground)."
    -%
     From the moment I picked your book up until I put it down I was
     convulsed with laughter.  Some day I intend reading it.
     		-- Groucho Marx, from "The Book of Insults"
    @@ -24041,21 +23914,6 @@ I may not be totally perfect, but parts of me are excellent.
     I met a wonderful new man.  He's fictional, but you can't have everything.
     		-- Cecelia, "The Purple Rose of Cairo"
     %
    -I met him in a swamp down in Dagobah
    -Where it bubbles all the time like a giant cabinet soda
    -	S-O-D-A soda
    -I saw the little runt sitting there on a log
    -I asked him his name and in a raspy voice he said Yoda
    -	Y-O-D-A Yoda, Yo-Yo-Yo-Yo Yoda
    -
    -Well I've been around but I ain't never seen
    -A guy who looks like a Muppet but he's wrinkled and green
    -	Oh my Yoda, Yo-Yo-Yo-Yo Yoda
    -Well I'm not dumb but I can't understand
    -How he can raise me in the air just by raising his hand
    -	Oh my Yoda, Yo-Yo-Yo-Yo Yoda, Yo-Yo-Yo-Yo Yoda
    -		-- The STAR WARS Song, to "Lola", by the Kinks
    -%
     I met my latest girl friend in a department store.  She was looking at
     clothes, and I was putting Slinkys on the escalators.
     		-- Steven Wright
    @@ -24530,10 +24388,6 @@ are worth considering, to wit:
     	"When paying tolls, remember that it is necessary to release the
     	quarter a full 3 seconds before passing the basket if you are
     	traveling more than 60 MPH."
    -
    -[110.13]:
    -	"When traveling on a one-way street, stay to the right, so as not
    -	to interfere with oncoming traffic."
     %
     I suppose some of the variation between Boston drivers and the rest of the
     country is due to the progressive Massachusetts Driver Education Manual which
    @@ -24626,12 +24480,6 @@ But only Schlitz can make a beer.
     I think that I shall never see
     A billboard lovely as a tree.
     Indeed, unless the billboards fall
    -I'll never see a tree at all.
    -		-- Nash
    -%
    -I think that I shall never see
    -A billboard lovely as a tree.
    -Perhaps, unless the billboards fall
     I'll never see a tree at all.
     		-- Ogden Nash
     %
    @@ -25228,7 +25076,8 @@ them scream.
     		-- Sylvestre Matuschka, "the Hungarian Train Wreck Freak",
     		   escaped prison 1937, not heard from since
     %
    -Iam
    +I
    +am
     not
     very
     happy
    @@ -25897,21 +25746,6 @@ this is the case, then programmers stand on one another's toes, and
     software engineers dig each other's graves.
     		-- Unknown
     %
    -If I have seen farther than others, it is because I was standing on the
    -shoulders of giants.
    -		-- Isaac Newton
    -
    -In the sciences, we are now uniquely privileged to sit side by side
    -with the giants on whose shoulders we stand.
    -		-- Gerald Holton
    -
    -If I have not seen as far as others, it is because giants were standing
    -on my shoulders.
    -		-- Hal Abelson
    -
    -In computer science, we stand on each other's feet.
    -		-- Brian K. Reid
    -%
     If I have to lay an egg for my country, I'll do it.
     		-- Bob Hope
     %
    @@ -33070,6 +32904,10 @@ versions of songs from The Wizard of Oz.
     %
     May a Misguided Platypus lay its Eggs in your Jockey Shorts
     %
    +May all your Emus lay soft boiled eggs, and may all your
    +Kangaroos be born with iPods already fitted.
    +		-- Aussie New Years wish, found on hasselbladinfo.com
    +%
     May all your PUSHes be POPped.
     %
     May Euell Gibbons eat your only copy of the manual!
    @@ -33497,6 +33335,12 @@ Miss, n.:
     %
     Mistakes are often the stepping stones to utter failure.
     %
    +Mistakeholder, n.:
    +	A person who depends on accidental features or 
    +	implementation errors and so now has a vested 
    +	interest in keeping things from being fixed.
    +		-- Chip Morningstar
    +%
     Mistrust first impulses; they are always right.
     %
     MIT:
    @@ -37635,7 +37479,7 @@ Pardo's First Postulate:
     fattening.
     
     Arnold's Addendum:
    -	Everything else causes cancer in rats.
    +	Anything not fitting into these categories causes cancer in rats.
     %
     Parents often talk about the younger generation as if they
     didn't have much of anything to do with it.
    @@ -39432,10 +39276,6 @@ A:	A dope ring.
     
     Q:	Why do blondes put their hair in ponytails?
     A:	To cover up the valve stem.
    -
    -Q:	Why did the blonde get so excited after she finished her jigsaw
    -	puzzle in only 6 months?
    -A:	Because on the box it said "From 2-4 years".
     %
     Q:	What do you call a blind pre-historic animal?
     A:	Diyathinkhesaurus.
    @@ -41468,25 +41308,6 @@ Spock:	Affirmative.
     Kirk:	Mr. Sulu, go to pass two.
     Sulu:	Aye aye, sir, going to pass two.
     %
    -Scratch the disks, dump the core,	Shut it down, pull the plug
    -Roll the tapes across the floor,	Give the core an extra tug
    -And the system is going to crash.	And the system is going to crash.
    -Teletypes smashed to bits.		Mem'ry cards, one and all,
    -Give the scopes some nasty hits		Toss out halfway down the hall
    -And the system is going to crash.	And the system is going to crash.
    -And we've also found			Just flip one switch
    -When you turn the power down,		And the lights will cease to twitch
    -You turn the disk readers into trash.	And the tape drives will crumble
    -Oh, it's so much fun,				in a flash.
    -Now the CPU won't run			 When the CPU
    -And the system is going to crash.	Can print nothing out but "foo,"
    -					The system is going to crash.
    -		-- To The Caissons Go Rolling Along
    -%
    -Scratch the disks!
    -Drop the core!
    -Roll the tapes across the floor!
    -%
     Screw up your courage!  You've screwed up everything else.
     %
     Scribline, n.:
    @@ -46663,7 +46484,8 @@ often turn to a related (but infinitely faster) language, COCAINE.
     %
     THE LESSER-KNOWN PROGRAMMING LANGUAGES #14 -- VALGOL
     
    -	VALGOL is enjoying a dramatic surge of popularity across the
    +	From its modest beginnings in Southern California's San Fernando
    +Valley VALGOL is enjoying a dramatic surge of popularity across the
     industry.  VALGOL commands include REALLY, LIKE, WELL, and Y*KNOW.
     Variables are assigned with the =LIKE and =TOTALLY operators.  Other
     operators include the "California booleans", AX and NOWAY.  Loops are
    @@ -48370,9 +48192,6 @@ and peculiar sort of voluntary thinking.
     The solution of this problem is trivial
     and is left as an exercise for the reader.
     %
    -The solution to a problem changes the nature of the problem.
    -		-- Peer
    -%
     The somewhat old and crusty vicar was taking a well-earned retirement from
     his rather old and crusty parish.  As is usual in these cases, a locum was
     sent to cover the transition period.  This particular man was young and
    @@ -52041,7 +51860,7 @@ yourself and that which may have an interest in the matter of your receiving
     as much as it is possible for you to receive of this thing, and which may
     in some way be influenced by this ceremony.
     	Amen.
    -		-- Roger Zelazny, "Creatures of Light and Darkness"
    +		-- Roger Zelazny, "Creatures of Light and Darkness", 1969
     %
     To understand a program you must become both the machine and the program.
     %
    @@ -56790,22 +56609,6 @@ I'd LOVE to, but...
     	-- I'm teaching my ferret to yodel.
     	-- My crayons all melted together.
     %
    -Why I Can't Go Out With You:
    -
    -I'd LOVE to, but ...
    -	-- I have to floss my cat.
    -	-- I've dedicated my life to linguini.
    -	-- I need to spend more time with my blender.
    -	-- it wouldn't be fair to the other Beautiful People.
    -	-- it's my night to pet the dog/ferret/goldfish.
    -	-- I'm going downtown to try on some gloves.
    -	-- I have to check the freshness dates on my dairy products.
    -	-- I'm going down to the bakery to watch the buns rise.
    -	-- I have an appointment with a cuticle specialist.
    -	-- I have some really hard words to look up.
    -	-- I've got a Friends of the Lowly Rutabaga meeting.
    -	-- I promised to help a friend fold road maps.
    -%
     Why is it called a funny bone when it hurts so much?
     %
     Why is it taking so long for her to bring out all the good in you?
    @@ -57860,9 +57663,6 @@ a private eye.
     Yeah, there are more important things in life than money,
     but they won't go out with you if you don't have any.
     %
    -YEAR:
    -	A period of three hundred and sixty-five disappointments.
    -%
     Year  Name				James Bond	Book
     ----  --------------------------------	--------------	----
     50's  James Bond TV Series		Barry Nelson
    @@ -59769,6 +59569,17 @@ You've been telling me to relax all the way here,
     and now you're telling me just to be myself?
     		-- The Return of the Secaucus Seven
     %
    +You've decked the halls with a dozen miles' length of electric lights. 
    +Your front lawn is a gleaming testament of incandescent wonder. The neighbors 
    +wear sunglasses 24/7,  and orbiting satellites have officially picked up 
    +and pinpointed your house as the brightest spot on earth.
    +        
    +You've finally put together the Christmas wonderland of your dreams... now 
    +if only you could get a good picture of it.
    +        
    +Photographing holiday lights is no easy task. 
    +		-- from an email sent by photojojo.com
    +%
     You've got to have a gimmick if your band sucks.
     		-- Gary Giddens
     %
    @@ -59809,18 +59620,19 @@ since I first called my brother's father dad.
     Zymurgy's Law of Volunteer Labor:
     	People are always available for work in the past tense.
     %
    -You've decked the halls with a dozen miles' length of electric lights. 
    -Your front lawn is a gleaming testament of incandescent wonder. The neighbors 
    -wear sunglasses 24/7,  and orbiting satellites have officially picked up 
    -and pinpointed your house as the brightest spot on earth.
    -        
    -You've finally put together the Christmas wonderland of your dreams... now 
    -if only you could get a good picture of it.
    -        
    -Photographing holiday lights is no easy task. 
    -		-- from an email sent by photojojo.com
    -%
    -May all your Emus lay soft boiled eggs, and may all your
    -Kangaroos be born with iPods already fitted.
    -		-- Aussie New Years wish, found on hasselbladinfo.com
    +This email and any files transmitted with it are confidential and
    +intended solely for the use of the individual or entity to which they
    +are addressed. If you are not the intended recipient of this
    +transmission, please delete it immediately.
    +
    +Obviously, I am the idiot who sent it to you by mistake. Furthermore,
    +there is no way I can force you to delete it. Worse, by the time you
    +have reached this disclaimer you have already read the document.
    +Telling you to forget it would seem absurd. In any event, I have no
    +legal right to force you to take any action upon this email anyway.
    +
    +This entire disclaimer is just a waste of everyone's time and
    +bandwidth. Therefore, let us just forget the whole thing and enjoy a
    +cold beer instead.
    + 		-- found on the dovecot mailinglist
     %
    diff --git a/games/fortune/datfiles/fortunes-o.real b/games/fortune/datfiles/fortunes-o.real
    index 3238af460937..5c893637cc43 100644
    --- a/games/fortune/datfiles/fortunes-o.real
    +++ b/games/fortune/datfiles/fortunes-o.real
    @@ -662,6 +662,13 @@ posh hotel.
     	"Anything for your wife, sir?" the bellhop asked.
     	"Why, yes, young man," said the gentleman.  "Would you bring me
     a postcard?"
    +%
    +	As we know, there are known knowns.  There are things we know we
    +know.  We also know there are known unknowns.  That is to say, we know
    +there are some things we do not know.  But there are also unknown
    +unknowns; the ones we don't know we don't know.
    +		-- United States Secretary of Defense Donald Rumsfeld
    +		   12 February 2002, Regarding the US invasion of Iraq
     %
     	"Are pirates an ethnic group?  Or are they just people who burn
     illegal cds?"
    @@ -1152,6 +1159,12 @@ and stuck it in my back."
     	"Not my remains, Al!"
     	"Gabriel's trumpet will produce you from the ass of a pig."
     		-- Al Swearingen, E. B. Farnum, _Deadwood_
    +%
    +	I'd say that VCS is more like the anal sex of the software
    +world: Everybody talks about it, some people do it, some people enjoy
    +it, but typically only vague implications about the best techniques
    +are ever voiced in public.
    +              -- Warner Losh, on Version Control Systems
     %
     	"I'll tell ya, Jeb," Wilbur said to his friend, "the tractor
     business ain't doin' too well.  I ain't sold one all month.
    @@ -12867,6 +12880,14 @@ Contraception", has been withdrawn after the Pope advised them to
     pull it out at the last minute.
     		-- Not the Nine O'Clock News
     %
    +The investment community feels very putupon.  They feel there is no
    +reason why they shouldn't earn $1 million to $200 million a year,
    +and they don't want to be held responsible for the global financial
    +meltdown.
    +		-- Daniel Fass, Chairman of United States President
    +		   Barack Obama's financial-industry fundraising party
    +		   20 October 2009
    +%
     The king arranged a regal marriage for his daughter -- a bond that would unite
     two great kingdoms.  Yet, because the young couple seemed so formal to each
     other, he posted a spy outside the royal wedding chamber and demanded a full
    diff --git a/games/fortune/datfiles/fortunes.sp.ok b/games/fortune/datfiles/fortunes.sp.ok
    index ffe8b3c9c33f..f26b5e3798f6 100644
    --- a/games/fortune/datfiles/fortunes.sp.ok
    +++ b/games/fortune/datfiles/fortunes.sp.ok
    @@ -3300,6 +3300,7 @@ postjudice
     Postnews
     Postpetroleum
     potholes
    +Potluck
     potty
     Poul
     Pournelle
    @@ -3376,7 +3377,6 @@ Purshottam
     PUSHes
     pushy
     pussycats
    -Putluck
     Putt's
     PVLC
     PxP
    diff --git a/games/fortune/datfiles/freebsd-tips b/games/fortune/datfiles/freebsd-tips
    index c9a2ed6bbac9..1b0844384b00 100644
    --- a/games/fortune/datfiles/freebsd-tips
    +++ b/games/fortune/datfiles/freebsd-tips
    @@ -50,18 +50,6 @@ If you are in the C shell and have just installed a new program, you won't
     be able to run it unless you first type "rehash".
     		-- Dru 
     %
    -If you are running xterm, the default TERM variable will be 'xterm'.  If you
    -set this environment variable to 'xterm-color' instead, a lot of programs will
    -use colors.  You can do this by
    -
    -	TERM=xterm-color; export TERM
    -
    -in Bourne-derived shells, and
    -
    -	setenv TERM xterm-color
    -
    -in csh-derived shells.
    -%
     If you do not want to get beeps in X11 (X Windows), you can turn them off with
     
     	xset b off
    diff --git a/games/fortune/datfiles/gerrold.limerick b/games/fortune/datfiles/gerrold.limerick
    old mode 100755
    new mode 100644
    diff --git a/games/fortune/fortune/Makefile b/games/fortune/fortune/Makefile
    index e8bd74be5626..c18ead9ef77d 100644
    --- a/games/fortune/fortune/Makefile
    +++ b/games/fortune/fortune/Makefile
    @@ -3,7 +3,6 @@
     
     PROG=	fortune
     MAN=	fortune.6
    -WARNS?=	2
     CFLAGS+=-DDEBUG -I${.CURDIR}/../strfile
     
     .include 
    diff --git a/games/fortune/fortune/fortune.6 b/games/fortune/fortune/fortune.6
    index a74a07530d67..d73274349381 100644
    --- a/games/fortune/fortune/fortune.6
    +++ b/games/fortune/fortune/fortune.6
    @@ -12,11 +12,7 @@
     .\" 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. All advertising materials mentioning features or use of this software
    -.\"    must display the following acknowledgement:
    -.\"	This product includes software developed by the University of
    -.\"	California, Berkeley and its contributors.
    -.\" 4. Neither the name of the University nor the names of its contributors
    +.\" 3. 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.
     .\"
    diff --git a/games/fortune/fortune/fortune.c b/games/fortune/fortune/fortune.c
    index 465dd819315f..65ae35ec466f 100644
    --- a/games/fortune/fortune/fortune.c
    +++ b/games/fortune/fortune/fortune.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -48,49 +44,50 @@ static const char sccsid[] = "@(#)fortune.c   8.1 (Berkeley) 5/31/93";
     #include 
     __FBSDID("$FreeBSD$");
     
    -# include	
    -# include	
    +#include 
    +#include 
     
    -# include	
    -# include	
    -# include	
    -# include	
    -# include	
    -# include	
    -# include	
    -# include	
    -# include       
    -# include       
    -# include       
    -# include	"strfile.h"
    -# include	"pathnames.h"
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
     
    -# define	TRUE	1
    -# define	FALSE	0
    -# define	bool	short
    +#include "strfile.h"
    +#include "pathnames.h"
     
    -# define	MINW	6		/* minimum wait if desired */
    -# define	CPERS	20		/* # of chars for each sec */
    -# define	SLEN	160		/* # of chars in short fortune */
    +#define	TRUE	1
    +#define	FALSE	0
    +#define	bool	short
     
    -# define        POS_UNKNOWN     ((uint32_t) -1)	/* pos for file unknown */
    -# define	NO_PROB		(-1)		/* no prob specified for file */
    +#define	MINW	6		/* minimum wait if desired */
    +#define	CPERS	20		/* # of chars for each sec */
    +#define	SLEN	160		/* # of chars in short fortune */
     
    -# ifdef DEBUG
    -# define        DPRINTF(l,x)    { if (Debug >= l) fprintf x; }
    -# undef		NDEBUG
    -# else
    -# define	DPRINTF(l,x)
    -# define	NDEBUG	1
    -# endif
    +#define	POS_UNKNOWN	((uint32_t) -1)	/* pos for file unknown */
    +#define	NO_PROB		(-1)		/* no prob specified for file */
    +
    +#ifdef	DEBUG
    +#define	DPRINTF(l,x)	{ if (Debug >= l) fprintf x; }
    +#undef	NDEBUG
    +#else
    +#define	DPRINTF(l,x)
    +#define	NDEBUG	1
    +#endif
     
     typedef struct fd {
     	int		percent;
     	int		fd, datfd;
     	uint32_t	pos;
     	FILE		*inf;
    -	char		*name;
    -	char		*path;
    +	const char	*name;
    +	const char	*path;
     	char		*datfile, *posfile;
     	bool		read_tbl;
     	bool		was_pos_file;
    @@ -102,7 +99,7 @@ typedef struct fd {
     
     bool	Found_one;			/* did we find a match? */
     bool	Find_files	= FALSE;	/* just find a list of proper fortune files */
    -bool    Fortunes_only   = FALSE;        /* check only "fortunes" files */
    +bool	Fortunes_only   = FALSE;	/* check only "fortunes" files */
     bool	Wait		= FALSE;	/* wait desired after fortune */
     bool	Short_only	= FALSE;	/* short fortune desired */
     bool	Long_only	= FALSE;	/* long fortune desired */
    @@ -126,14 +123,14 @@ FILEDESC	*Fortfile;		/* Fortune file to use */
     
     STRFILE		Noprob_tbl;		/* sum of data for all no prob files */
     
    -char	*Fortune_path;
    +const char	*Fortune_path;
     char	**Fortune_path_arr;
     
     int	 add_dir(FILEDESC *);
    -int	 add_file __P((int,
    -	    char *, char *, FILEDESC **, FILEDESC **, FILEDESC *));
    +int	 add_file(int, const char *, const char *, FILEDESC **, FILEDESC **,
    +	    FILEDESC *);
     void	 all_forts(FILEDESC *, char *);
    -char	*copy(char *, u_int);
    +char	*copy(const char *, u_int);
     void	 display(FILEDESC *);
     void	 do_free(void *);
     void	*do_malloc(u_int);
    @@ -145,13 +142,13 @@ void	 get_tbl(FILEDESC *);
     void	 getargs(int, char *[]);
     void	 getpath(void);
     void	 init_prob(void);
    -int	 is_dir(char *);
    -int	 is_fortfile(char *, char **, char **, int);
    -int	 is_off_name(char *);
    +int	 is_dir(const char *);
    +int	 is_fortfile(const char *, char **, char **, int);
    +int	 is_off_name(const char *);
     int	 max(int, int);
     FILEDESC *
     	 new_fp(void);
    -char	*off_name(char *);
    +char	*off_name(const char *);
     void	 open_dat(FILEDESC *);
     void	 open_fp(FILEDESC *);
     FILEDESC *
    @@ -171,18 +168,16 @@ int	 maxlen_in_list(FILEDESC *);
     static regex_t Re_pat;
     
     int
    -main(ac, av)
    -int	ac;
    -char	*av[];
    +main(int argc, char *argv[])
     {
    -#ifdef	OK_TO_WRITE_DISK
    +#ifdef OK_TO_WRITE_DISK
     	int	fd;
    -#endif	/* OK_TO_WRITE_DISK */
    +#endif /* OK_TO_WRITE_DISK */
     
     	(void) setlocale(LC_ALL, "");
     
     	getpath();
    -	getargs(ac, av);
    +	getargs(argc, argv);
     
     	if (Match)
     		exit(find_matches() != 0);
    @@ -195,45 +190,44 @@ char	*av[];
     
     	display(Fortfile);
     
    -#ifdef	OK_TO_WRITE_DISK
    +#ifdef OK_TO_WRITE_DISK
     	if ((fd = creat(Fortfile->posfile, 0666)) < 0) {
     		perror(Fortfile->posfile);
     		exit(1);
     	}
    -#ifdef	LOCK_EX
    +#ifdef LOCK_EX
     	/*
     	 * if we can, we exclusive lock, but since it isn't very
     	 * important, we just punt if we don't have easy locking
     	 * available.
     	 */
     	(void) flock(fd, LOCK_EX);
    -#endif	/* LOCK_EX */
    +#endif /* LOCK_EX */
     	write(fd, (char *) &Fortfile->pos, sizeof Fortfile->pos);
     	if (!Fortfile->was_pos_file)
     		(void) chmod(Fortfile->path, 0666);
    -#ifdef	LOCK_EX
    +#ifdef LOCK_EX
     	(void) flock(fd, LOCK_UN);
    -#endif	/* LOCK_EX */
    -#endif	/* OK_TO_WRITE_DISK */
    +#endif /* LOCK_EX */
    +#endif /* OK_TO_WRITE_DISK */
     	if (Wait) {
     		if (Fort_len == 0)
     			(void) fortlen();
     		sleep((unsigned int) max(Fort_len / CPERS, MINW));
     	}
    +
     	exit(0);
    -	/* NOTREACHED */
     }
     
     void
    -display(fp)
    -FILEDESC	*fp;
    +display(FILEDESC *fp)
     {
     	char   *p;
     	unsigned char ch;
     	char	line[BUFSIZ];
     
     	open_fp(fp);
    -	(void) fseeko(fp->inf, Seekpts[0], 0);
    +	fseeko(fp->inf, Seekpts[0], SEEK_SET);
     	for (Fort_len = 0; fgets(line, sizeof line, fp->inf) != NULL &&
     	    !STR_ENDSTRING(line, fp->tbl); Fort_len++) {
     		if (fp->tbl.str_flags & STR_ROTATED)
    @@ -259,7 +253,7 @@ FILEDESC	*fp;
      *	Return the length of the fortune.
      */
     int
    -fortlen()
    +fortlen(void)
     {
     	int	nchar;
     	char	line[BUFSIZ];
    @@ -268,34 +262,31 @@ fortlen()
     		nchar = (int)(Seekpts[1] - Seekpts[0]);
     	else {
     		open_fp(Fortfile);
    -		(void) fseeko(Fortfile->inf, Seekpts[0], 0);
    +		fseeko(Fortfile->inf, Seekpts[0], SEEK_SET);
     		nchar = 0;
     		while (fgets(line, sizeof line, Fortfile->inf) != NULL &&
     		       !STR_ENDSTRING(line, Fortfile->tbl))
     			nchar += strlen(line);
     	}
     	Fort_len = nchar;
    -	return nchar;
    +
    +	return (nchar);
     }
     
     /*
      *	This routine evaluates the arguments on the command line
      */
     void
    -getargs(argc, argv)
    -int	argc;
    -char	**argv;
    +getargs(int argc, char *argv[])
     {
     	int	ignore_case;
     	char	*pat;
    -	extern char *optarg;
    -	extern int optind;
     	int ch;
     
     	ignore_case = FALSE;
     	pat = NULL;
     
    -# ifdef DEBUG
    +#ifdef DEBUG
     	while ((ch = getopt(argc, argv, "aDefilm:osw")) != -1)
     #else
     	while ((ch = getopt(argc, argv, "aefilm:osw")) != -1)
    @@ -304,11 +295,11 @@ char	**argv;
     		case 'a':		/* any fortune */
     			All_forts++;
     			break;
    -# ifdef DEBUG
    +#ifdef DEBUG
     		case 'D':
     			Debug++;
     			break;
    -# endif /* DEBUG */
    +#endif /* DEBUG */
     		case 'e':
     			Equal_probs++;	/* scatter un-allocted prob equally */
     			break;
    @@ -362,7 +353,7 @@ char	**argv;
     		error = regcomp(&Re_pat, pat, REG_BASIC);
     		if (error) {
     			fprintf(stderr, "regcomp(%s) fails\n", pat);
    -			exit (1);
    +			exit(1);
     		}
     	}
     }
    @@ -372,9 +363,7 @@ char	**argv;
      *	Form the file list from the file specifications.
      */
     int
    -form_file_list(files, file_cnt)
    -char	**files;
    -int	file_cnt;
    +form_file_list(char **files, int file_cnt)
     {
     	int	i, percent;
     	char	*sp;
    @@ -386,7 +375,7 @@ int	file_cnt;
     			pstr = Fortune_path_arr;
     			i = 0;
     			while (*pstr) {
    -				i += add_file(NO_PROB, *pstr++, NULL, 
    +				i += add_file(NO_PROB, *pstr++, NULL,
     					      &File_list, &File_tail, NULL);
     			}
     			Fortunes_only = FALSE;
    @@ -394,7 +383,7 @@ int	file_cnt;
     				fprintf(stderr, "No fortunes found in %s.\n",
     				    Fortune_path);
     			}
    -			return i != 0;
    +			return (i != 0);
     		} else {
     			pstr = Fortune_path_arr;
     			i = 0;
    @@ -406,7 +395,7 @@ int	file_cnt;
     				fprintf(stderr, "No fortunes found in %s.\n",
     				    Fortune_path);
     			}
    -			return i != 0;
    +			return (i != 0);
     		}
     	}
     	for (i = 0; i < file_cnt; i++) {
    @@ -419,11 +408,11 @@ int	file_cnt;
     				percent = percent * 10 + *sp - '0';
     			if (percent > 100) {
     				fprintf(stderr, "percentages must be <= 100\n");
    -				return FALSE;
    +				return (FALSE);
     			}
     			if (*sp == '.') {
     				fprintf(stderr, "percentages must be integers\n");
    -				return FALSE;
    +				return (FALSE);
     			}
     			/*
     			 * If the number isn't followed by a '%', then
    @@ -437,7 +426,7 @@ int	file_cnt;
     			else if (*++sp == '\0') {
     				if (++i >= file_cnt) {
     					fprintf(stderr, "percentages must precede files\n");
    -					return FALSE;
    +					return (FALSE);
     				}
     				sp = files[i];
     			}
    @@ -446,20 +435,21 @@ int	file_cnt;
     			pstr = Fortune_path_arr;
     			i = 0;
     			while (*pstr) {
    -				i += add_file(NO_PROB, *pstr++, NULL, 
    +				i += add_file(NO_PROB, *pstr++, NULL,
     					      &File_list, &File_tail, NULL);
     			}
     			if (!i) {
     				fprintf(stderr, "No fortunes found in %s.\n",
     				    Fortune_path);
    -				return FALSE;
    +				return (FALSE);
     			}
    -		} else if (!add_file(percent, sp, NULL, &File_list, 
    +		} else if (!add_file(percent, sp, NULL, &File_list,
     				     &File_tail, NULL)) {
    - 			return FALSE;
    + 			return (FALSE);
     		}
     	}
    -	return TRUE;
    +
    +	return (TRUE);
     }
     
     /*
    @@ -467,32 +457,31 @@ int	file_cnt;
      *	Add a file to the file list.
      */
     int
    -add_file(percent, file, dir, head, tail, parent)
    -int		percent;
    -char		*file;
    -char		*dir;
    -FILEDESC	**head, **tail;
    -FILEDESC	*parent;
    +add_file(int percent, const char *file, const char *dir, FILEDESC **head,
    +    FILEDESC **tail, FILEDESC *parent)
     {
     	FILEDESC	*fp;
     	int		fd;
    -	char		*path, *offensive;
    +	const char 	*path;
    +	char		*tpath, *offensive;
     	bool		was_malloc;
     	bool		isdir;
     
     	if (dir == NULL) {
     		path = file;
    +		tpath = NULL;
     		was_malloc = FALSE;
     	}
     	else {
    -		path = do_malloc((unsigned int) (strlen(dir) + strlen(file) + 2));
    -		(void) strcat(strcat(strcpy(path, dir), "/"), file);
    +		tpath = do_malloc((unsigned int)(strlen(dir) + strlen(file) + 2));
    +		strcat(strcat(strcpy(tpath, dir), "/"), file);
    +		path = tpath;
     		was_malloc = TRUE;
     	}
     	if ((isdir = is_dir(path)) && parent != NULL) {
     		if (was_malloc)
    -			free(path);
    -		return FALSE;	/* don't recurse */
    +			free(tpath);
    +		return (FALSE);	/* don't recurse */
     	}
     	offensive = NULL;
     	if (!isdir && parent == NULL && (All_forts || Offend) &&
    @@ -500,7 +489,7 @@ FILEDESC	*parent;
     		offensive = off_name(path);
     		if (Offend) {
     			if (was_malloc)
    -				free(path);
    +				free(tpath);
     			path = offensive;
     			offensive = NULL;
     			was_malloc = TRUE;
    @@ -511,7 +500,7 @@ FILEDESC	*parent;
     
     	DPRINTF(1, (stderr, "adding file \"%s\"\n", path));
     over:
    -	if ((fd = open(path, 0)) < 0) {
    +	if ((fd = open(path, O_RDONLY)) < 0) {
     		/*
     		 * This is a sneak.  If the user said -a, and if the
     		 * file we're given isn't a file, we check to see if
    @@ -522,7 +511,7 @@ over:
     		 */
     		if (All_forts && offensive != NULL) {
     			if (was_malloc)
    -				free(path);
    +				free(tpath);
     			path = offensive;
     			offensive = NULL;
     			was_malloc = TRUE;
    @@ -535,22 +524,22 @@ over:
     			char **pstr = Fortune_path_arr;
     
     			while (*pstr) {
    -				i += add_file(percent, file, *pstr++, 
    +				i += add_file(percent, file, *pstr++,
     					      head, tail, parent);
     			}
     			if (!i) {
     				fprintf(stderr, "No '%s' found in %s.\n",
     				    file, Fortune_path);
     			}
    -			return i != 0;
    +			return (i != 0);
     		}
     		/*
     		if (parent == NULL)
     			perror(path);
     		*/
     		if (was_malloc)
    -			free(path);
    -		return FALSE;
    +			free(tpath);
    +		return (FALSE);
     	}
     
     	DPRINTF(2, (stderr, "path = \"%s\"\n", path));
    @@ -571,12 +560,12 @@ over:
     				"fortune:%s not a fortune file or directory\n",
     				path);
     		if (was_malloc)
    -			free(path);
    +			free(tpath);
     		do_free(fp->datfile);
     		do_free(fp->posfile);
    -		free((char *) fp);
    +		free(fp);
     		do_free(offensive);
    -		return FALSE;
    +		return (FALSE);
     	}
     	/*
     	 * If the user said -a, we need to make this node a pointer to
    @@ -598,11 +587,11 @@ over:
     		fp->next = *head;
     		*head = fp;
     	}
    -#ifdef	OK_TO_WRITE_DISK
    +#ifdef OK_TO_WRITE_DISK
     	fp->was_pos_file = (access(fp->posfile, W_OK) >= 0);
    -#endif	/* OK_TO_WRITE_DISK */
    +#endif /* OK_TO_WRITE_DISK */
     
    -	return TRUE;
    +	return (TRUE);
     }
     
     /*
    @@ -610,11 +599,11 @@ over:
      *	Return a pointer to an initialized new FILEDESC.
      */
     FILEDESC *
    -new_fp()
    +new_fp(void)
     {
     	FILEDESC	*fp;
     
    -	fp = (FILEDESC *) do_malloc(sizeof *fp);
    +	fp = do_malloc(sizeof(*fp));
     	fp->datfd = -1;
     	fp->pos = POS_UNKNOWN;
     	fp->inf = NULL;
    @@ -627,7 +616,8 @@ new_fp()
     	fp->parent = NULL;
     	fp->datfile = NULL;
     	fp->posfile = NULL;
    -	return fp;
    +
    +	return (fp);
     }
     
     /*
    @@ -635,13 +625,13 @@ new_fp()
      *	Return a pointer to the offensive version of a file of this name.
      */
     char *
    -off_name(file)
    -char	*file;
    +off_name(const char *file)
     {
     	char	*new;
     
     	new = copy(file, (unsigned int) (strlen(file) + 2));
    -	return strcat(new, "-o");
    +
    +	return (strcat(new, "-o"));
     }
     
     /*
    @@ -649,12 +639,12 @@ char	*file;
      *	Is the file an offensive-style name?
      */
     int
    -is_off_name(file)
    -char	*file;
    +is_off_name(const char *file)
     {
     	int	len;
     
     	len = strlen(file);
    +
     	return (len >= 3 && file[len - 2] == '-' && file[len - 1] == 'o');
     }
     
    @@ -664,20 +654,18 @@ char	*file;
      *	there are two children to be a parent of.
      */
     void
    -all_forts(fp, offensive)
    -FILEDESC	*fp;
    -char		*offensive;
    +all_forts(FILEDESC *fp, char *offensive)
     {
     	char		*sp;
     	FILEDESC	*scene, *obscene;
     	int		fd;
    -	auto char		*datfile, *posfile;
    +	char		*datfile, *posfile;
     
     	if (fp->child != NULL)	/* this is a directory, not a file */
     		return;
     	if (!is_fortfile(offensive, &datfile, &posfile, FALSE))
     		return;
    -	if ((fd = open(offensive, 0)) < 0)
    +	if ((fd = open(offensive, O_RDONLY)) < 0)
     		return;
     	DPRINTF(1, (stderr, "adding \"%s\" because of -a\n", offensive));
     	scene = new_fp();
    @@ -704,9 +692,9 @@ char		*offensive;
     	obscene->datfile = datfile;
     	obscene->posfile = posfile;
     	obscene->read_tbl = FALSE;
    -#ifdef	OK_TO_WRITE_DISK
    +#ifdef OK_TO_WRITE_DISK
     	obscene->was_pos_file = (access(obscene->posfile, W_OK) >= 0);
    -#endif	/* OK_TO_WRITE_DISK */
    +#endif /* OK_TO_WRITE_DISK */
     }
     
     /*
    @@ -714,19 +702,18 @@ char		*offensive;
      *	Add the contents of an entire directory.
      */
     int
    -add_dir(fp)
    -FILEDESC	*fp;
    +add_dir(FILEDESC *fp)
     {
     	DIR		*dir;
     	struct dirent	*dirent;
    -	auto FILEDESC	*tailp;
    -	auto char	*name;
    +	FILEDESC	*tailp;
    +	char		*name;
     
     	(void) close(fp->fd);
     	fp->fd = -1;
     	if ((dir = opendir(fp->path)) == NULL) {
     		perror(fp->path);
    -		return FALSE;
    +		return (FALSE);
     	}
     	tailp = NULL;
     	DPRINTF(1, (stderr, "adding dir \"%s\"\n", fp->path));
    @@ -743,9 +730,10 @@ FILEDESC	*fp;
     	if (fp->num_children == 0) {
     		(void) fprintf(stderr,
     		    "fortune: %s: No fortune files in directory.\n", fp->path);
    -		return FALSE;
    +		return (FALSE);
     	}
    -	return TRUE;
    +
    +	return (TRUE);
     }
     
     /*
    @@ -753,13 +741,13 @@ FILEDESC	*fp;
      *	Return TRUE if the file is a directory, FALSE otherwise.
      */
     int
    -is_dir(file)
    -char	*file;
    +is_dir(const char *file)
     {
    -	auto struct stat	sbuf;
    +	struct stat	sbuf;
     
     	if (stat(file, &sbuf) < 0)
    -		return FALSE;
    +		return (FALSE);
    +
     	return (sbuf.st_mode & S_IFDIR);
     }
     
    @@ -772,19 +760,18 @@ char	*file;
      */
     /* ARGSUSED */
     int
    -is_fortfile(file, datp, posp, check_for_offend)
    -char	*file, **datp, **posp;
    -int	check_for_offend;
    +is_fortfile(const char *file, char **datp, char **posp, int check_for_offend)
     {
     	int	i;
    -	char	*sp;
    +	const char	*sp;
     	char	*datfile;
    -	static char	*suflist[] = {	/* list of "illegal" suffixes" */
    -				"dat", "pos", "c", "h", "p", "i", "f",
    -				"pas", "ftn", "ins.c", "ins,pas",
    -				"ins.ftn", "sml",
    -				NULL
    -			};
    +	static const char *suflist[] = {
    +		/* list of "illegal" suffixes" */
    +		"dat", "pos", "c", "h", "p", "i", "f",
    +		"pas", "ftn", "ins.c", "ins,pas",
    +		"ins.ftn", "sml",
    +		NULL
    +	};
     
     	DPRINTF(2, (stderr, "is_fortfile(%s) returns ", file));
     
    @@ -796,7 +783,7 @@ int	check_for_offend;
     		i = strlen(file);
     		if (Offend ^ (file[i - 2] == '-' && file[i - 1] == 'o')) {
     			DPRINTF(2, (stderr, "FALSE (offending file)\n"));
    -			return FALSE;
    +			return (FALSE);
     		}
     	}
     
    @@ -806,18 +793,18 @@ int	check_for_offend;
     		sp++;
     	if (*sp == '.') {
     		DPRINTF(2, (stderr, "FALSE (file starts with '.')\n"));
    -		return FALSE;
    +		return (FALSE);
     	}
     	if (Fortunes_only && strncmp(sp, "fortunes", 8) != 0) {
     		DPRINTF(2, (stderr, "FALSE (check fortunes only)\n"));
    -		return FALSE;
    +		return (FALSE);
     	}
     	if ((sp = rindex(sp, '.')) != NULL) {
     		sp++;
     		for (i = 0; suflist[i] != NULL; i++)
     			if (strcmp(sp, suflist[i]) == 0) {
     				DPRINTF(2, (stderr, "FALSE (file has suffix \".%s\")\n", sp));
    -				return FALSE;
    +				return (FALSE);
     			}
     	}
     
    @@ -830,22 +817,23 @@ int	check_for_offend;
     			DPRINTF(0, (stderr, "Warning: file \"%s\" unreadable\n", datfile));
     #endif
     		free(datfile);
    -		return FALSE;
    +		return (FALSE);
     	}
     	if (datp != NULL)
     		*datp = datfile;
     	else
     		free(datfile);
     	if (posp != NULL) {
    -#ifdef	OK_TO_WRITE_DISK
    +#ifdef OK_TO_WRITE_DISK
     		*posp = copy(file, (unsigned int) (strlen(file) + 4)); /* +4 for ".dat" */
     		(void) strcat(*posp, ".pos");
     #else
     		*posp = NULL;
    -#endif	/* OK_TO_WRITE_DISK */
    +#endif /* OK_TO_WRITE_DISK */
     	}
     	DPRINTF(2, (stderr, "TRUE\n"));
    -	return TRUE;
    +
    +	return (TRUE);
     }
     
     /*
    @@ -853,18 +841,17 @@ int	check_for_offend;
      *	Return a malloc()'ed copy of the string
      */
     char *
    -copy(str, len)
    -char		*str;
    -unsigned int	len;
    +copy(const char *str, unsigned int len)
     {
    -	char	*new, *sp;
    +	char *new, *sp;
     
     	new = do_malloc(len + 1);
     	sp = new;
     	do {
     		*sp++ = *str;
     	} while (*str++);
    -	return new;
    +
    +	return (new);
     }
     
     /*
    @@ -872,16 +859,16 @@ unsigned int	len;
      *	Do a malloc, checking for NULL return.
      */
     void *
    -do_malloc(size)
    -unsigned int	size;
    +do_malloc(unsigned int size)
     {
    -	void	*new;
    +	void *new;
     
     	if ((new = malloc(size)) == NULL) {
     		(void) fprintf(stderr, "fortune: out of memory.\n");
     		exit(1);
     	}
    -	return new;
    +
    +	return (new);
     }
     
     /*
    @@ -889,8 +876,7 @@ unsigned int	size;
      *	Free malloc'ed space, if any.
      */
     void
    -do_free(ptr)
    -void	*ptr;
    +do_free(void *ptr)
     {
     	if (ptr != NULL)
     		free(ptr);
    @@ -901,7 +887,7 @@ void	*ptr;
      *	Initialize the fortune probabilities.
      */
     void
    -init_prob()
    +init_prob(void)
     {
     	FILEDESC       *fp, *last = NULL;
     	int		percent, num_noprob, frac;
    @@ -919,8 +905,7 @@ init_prob()
     			num_noprob++;
     			if (Equal_probs)
     				last = fp;
    -		}
    -		else
    +		} else
     			percent += fp->percent;
     	DPRINTF(1, (stderr, "summing probabilities:%d%% with %d NO_PROB's",
     		    percent, num_noprob));
    @@ -928,14 +913,12 @@ init_prob()
     		(void) fprintf(stderr,
     		    "fortune: probabilities sum to %d%% > 100%%!\n", percent);
     		exit(1);
    -	}
    -	else if (percent < 100 && num_noprob == 0) {
    +	} else if (percent < 100 && num_noprob == 0) {
     		(void) fprintf(stderr,
     		    "fortune: no place to put residual probability (%d%% < 100%%)\n",
     		    percent);
     		exit(1);
    -	}
    -	else if (percent == 100 && num_noprob != 0) {
    +	} else if (percent == 100 && num_noprob != 0) {
     		(void) fprintf(stderr,
     		    "fortune: no probability left to put in residual files (100%%)\n");
     		exit(1);
    @@ -955,7 +938,7 @@ init_prob()
     			last->percent = percent;
     			DPRINTF(1, (stderr, ", residual = %d%%", percent));
     		}
    -	else
    +		else
     		DPRINTF(1, (stderr,
     			    ", %d%% distributed over remaining fortunes\n",
     			    percent));
    @@ -973,7 +956,7 @@ init_prob()
      *	Get the fortune data file's seek pointer for the next fortune.
      */
     void
    -get_fort()
    +get_fort(void)
     {
     	FILEDESC	*fp;
     	int		choice;
    @@ -1004,7 +987,7 @@ get_fort()
     			choice = arc4random_uniform(Noprob_tbl.str_numstr);
     			DPRINTF(1, (stderr, "choice = %d (of %u) \n", choice,
     				    Noprob_tbl.str_numstr));
    -			while (choice >= fp->tbl.str_numstr) {
    +			while ((unsigned int)choice >= fp->tbl.str_numstr) {
     				choice -= fp->tbl.str_numstr;
     				fp = fp->next;
     				DPRINTF(1, (stderr,
    @@ -1024,8 +1007,8 @@ get_fort()
     	Fortfile = fp;
     	get_pos(fp);
     	open_dat(fp);
    -	(void) lseek(fp->datfd,
    -		     (off_t) (sizeof fp->tbl + fp->pos * sizeof Seekpts[0]), 0);
    +	lseek(fp->datfd,
    +	    (off_t) (sizeof fp->tbl + fp->pos * sizeof Seekpts[0]), SEEK_SET);
     	read(fp->datfd, Seekpts, sizeof Seekpts);
     	Seekpts[0] = be64toh(Seekpts[0]);
     	Seekpts[1] = be64toh(Seekpts[1]);
    @@ -1036,8 +1019,7 @@ get_fort()
      *	Pick a child from a chosen parent.
      */
     FILEDESC *
    -pick_child(parent)
    -FILEDESC	*parent;
    +pick_child(FILEDESC *parent)
     {
     	FILEDESC	*fp;
     	int		choice;
    @@ -1049,14 +1031,14 @@ FILEDESC	*parent;
     		for (fp = parent->child; choice--; fp = fp->next)
     			continue;
     		DPRINTF(1, (stderr, "    using %s\n", fp->name));
    -		return fp;
    +		return (fp);
     	}
     	else {
     		get_tbl(parent);
     		choice = arc4random_uniform(parent->tbl.str_numstr);
     		DPRINTF(1, (stderr, "    choice = %d (of %u)\n",
     			    choice, parent->tbl.str_numstr));
    -		for (fp = parent->child; choice >= fp->tbl.str_numstr;
    +		for (fp = parent->child; (unsigned)choice >= fp->tbl.str_numstr;
     		     fp = fp->next) {
     			choice -= fp->tbl.str_numstr;
     			DPRINTF(1, (stderr, "\tskip %s, %u (choice = %d)\n",
    @@ -1064,7 +1046,7 @@ FILEDESC	*parent;
     		}
     		DPRINTF(1, (stderr, "    using %s, %u\n", fp->name,
     			    fp->tbl.str_numstr));
    -		return fp;
    +		return (fp);
     	}
     }
     
    @@ -1073,8 +1055,7 @@ FILEDESC	*parent;
      *	Sum up all the noprob probabilities, starting with fp.
      */
     void
    -sum_noprobs(fp)
    -FILEDESC	*fp;
    +sum_noprobs(FILEDESC *fp)
     {
     	static bool	did_noprobs = FALSE;
     
    @@ -1090,8 +1071,7 @@ FILEDESC	*fp;
     }
     
     int
    -max(i, j)
    -int	i, j;
    +max(int i, int j)
     {
     	return (i >= j ? i : j);
     }
    @@ -1101,8 +1081,7 @@ int	i, j;
      *	Assocatiate a FILE * with the given FILEDESC.
      */
     void
    -open_fp(fp)
    -FILEDESC	*fp;
    +open_fp(FILEDESC *fp)
     {
     	if (fp->inf == NULL && (fp->inf = fdopen(fp->fd, "r")) == NULL) {
     		perror(fp->path);
    @@ -1115,10 +1094,9 @@ FILEDESC	*fp;
      *	Open up the dat file if we need to.
      */
     void
    -open_dat(fp)
    -FILEDESC	*fp;
    +open_dat(FILEDESC *fp)
     {
    -	if (fp->datfd < 0 && (fp->datfd = open(fp->datfile, 0)) < 0) {
    +	if (fp->datfd < 0 && (fp->datfd = open(fp->datfile, O_RDONLY)) < 0) {
     		perror(fp->datfile);
     		exit(1);
     	}
    @@ -1130,17 +1108,16 @@ FILEDESC	*fp;
      *	return a random number.
      */
     void
    -get_pos(fp)
    -FILEDESC	*fp;
    +get_pos(FILEDESC *fp)
     {
    -#ifdef	OK_TO_WRITE_DISK
    +#ifdef OK_TO_WRITE_DISK
     	int	fd;
     #endif /* OK_TO_WRITE_DISK */
     
     	assert(fp->read_tbl);
     	if (fp->pos == POS_UNKNOWN) {
    -#ifdef	OK_TO_WRITE_DISK
    -		if ((fd = open(fp->posfile, 0)) < 0 ||
    +#ifdef OK_TO_WRITE_DISK
    +		if ((fd = open(fp->posfile, O_RDONLY)) < 0 ||
     		    read(fd, &fp->pos, sizeof fp->pos) != sizeof fp->pos)
     			fp->pos = arc4random_uniform(fp->tbl.str_numstr);
     		else if (fp->pos >= fp->tbl.str_numstr)
    @@ -1161,16 +1138,15 @@ FILEDESC	*fp;
      *	Get the tbl data file the datfile.
      */
     void
    -get_tbl(fp)
    -FILEDESC	*fp;
    +get_tbl(FILEDESC *fp)
     {
    -	auto int		fd;
    +	int		fd;
     	FILEDESC	*child;
     
     	if (fp->read_tbl)
     		return;
     	if (fp->child == NULL) {
    -		if ((fd = open(fp->datfile, 0)) < 0) {
    +		if ((fd = open(fp->datfile, O_RDONLY)) < 0) {
     			perror(fp->datfile);
     			exit(1);
     		}
    @@ -1201,8 +1177,7 @@ FILEDESC	*fp;
      *	Zero out the fields we care about in a tbl structure.
      */
     void
    -zero_tbl(tp)
    -STRFILE	*tp;
    +zero_tbl(STRFILE *tp)
     {
     	tp->str_numstr = 0;
     	tp->str_longlen = 0;
    @@ -1214,8 +1189,7 @@ STRFILE	*tp;
      *	Merge the tbl data of t2 into t1.
      */
     void
    -sum_tbl(t1, t2)
    -STRFILE	*t1, *t2;
    +sum_tbl(STRFILE *t1, STRFILE *t2)
     {
     	t1->str_numstr += t2->str_numstr;
     	if (t1->str_longlen < t2->str_longlen)
    @@ -1231,7 +1205,7 @@ STRFILE	*t1, *t2;
      *	Print out the file list
      */
     void
    -print_file_list()
    +print_file_list(void)
     {
     	print_list(File_list, 0);
     }
    @@ -1241,9 +1215,7 @@ print_file_list()
      *	Print out the actual list, recursively.
      */
     void
    -print_list(list, lev)
    -FILEDESC	*list;
    -int			lev;
    +print_list(FILEDESC *list, int lev)
     {
     	while (list != NULL) {
     		fprintf(stderr, "%*s", lev * 4, "");
    @@ -1266,8 +1238,7 @@ int			lev;
      *	Convert the pattern to an ignore-case equivalent.
      */
     char *
    -conv_pat(orig)
    -char	*orig;
    +conv_pat(char *orig)
     {
     	char		*sp;
     	unsigned int	cnt;
    @@ -1301,7 +1272,8 @@ char	*orig;
     			*sp++ = *orig;
     	}
     	*sp = '\0';
    -	return new;
    +
    +	return (new);
     }
     
     /*
    @@ -1309,7 +1281,7 @@ char	*orig;
      *	Find all the fortunes which match the pattern we've been given.
      */
     int
    -find_matches()
    +find_matches(void)
     {
     	Fort_len = maxlen_in_list(File_list);
     	DPRINTF(2, (stderr, "Maximum length is %d\n", Fort_len));
    @@ -1318,8 +1290,8 @@ find_matches()
     
     	Found_one = FALSE;
     	matches_in_list(File_list);
    -	return Found_one;
    -	/* NOTREACHED */
    +
    +	return (Found_one);
     }
     
     /*
    @@ -1327,8 +1299,7 @@ find_matches()
      *	Return the maximum fortune len in the file list.
      */
     int
    -maxlen_in_list(list)
    -FILEDESC	*list;
    +maxlen_in_list(FILEDESC *list)
     {
     	FILEDESC	*fp;
     	int		len, maxlen;
    @@ -1341,11 +1312,12 @@ FILEDESC	*list;
     		}
     		else {
     			get_tbl(fp);
    -			if (fp->tbl.str_longlen > maxlen)
    +			if (fp->tbl.str_longlen > (unsigned int)maxlen)
     				maxlen = fp->tbl.str_longlen;
     		}
     	}
    -	return maxlen;
    +
    +	return (maxlen);
     }
     
     /*
    @@ -1353,13 +1325,12 @@ FILEDESC	*list;
      *	Print out the matches from the files in the list.
      */
     void
    -matches_in_list(list)
    -FILEDESC	*list;
    +matches_in_list(FILEDESC *list)
     {
     	char           *sp, *p;
     	FILEDESC	*fp;
    -	int			in_file;
    -	unsigned char           ch;
    +	int		in_file;
    +	unsigned char	ch;
     
     	for (fp = list; fp != NULL; fp = fp->next) {
     		if (fp->child != NULL) {
    @@ -1405,7 +1376,7 @@ FILEDESC	*list;
     }
     
     void
    -usage()
    +usage(void)
     {
     	(void) fprintf(stderr, "fortune [-a");
     #ifdef	DEBUG
    @@ -1462,6 +1433,6 @@ getpath(void)
     			exit(1);
     		}
     		free(path);
    -		Fortune_path_arr[0] = FORTDIR;
    +		Fortune_path_arr[0] = strdup(FORTDIR);
     	}
     }
    diff --git a/games/fortune/fortune/pathnames.h b/games/fortune/fortune/pathnames.h
    index 341d0b860c33..d777c6d38445 100644
    --- a/games/fortune/fortune/pathnames.h
    +++ b/games/fortune/fortune/pathnames.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,7 @@
      * SUCH DAMAGE.
      *
      *	@(#)pathnames.h	8.1 (Berkeley) 5/31/93
    + *	$FreeBSD$
      */
     
     #define	FORTDIR		"/usr/share/games/fortune"
    diff --git a/games/fortune/strfile/Makefile b/games/fortune/strfile/Makefile
    index 251779eb2274..a43e8ea3e128 100644
    --- a/games/fortune/strfile/Makefile
    +++ b/games/fortune/strfile/Makefile
    @@ -4,6 +4,5 @@
     PROG=	strfile
     MAN=	strfile.8
     MLINKS= strfile.8 unstr.8
    -WARNS?=	6
     
     .include 
    diff --git a/games/fortune/strfile/strfile.8 b/games/fortune/strfile/strfile.8
    index 5c2d64241be4..26de0d727d44 100644
    --- a/games/fortune/strfile/strfile.8
    +++ b/games/fortune/strfile/strfile.8
    @@ -13,11 +13,7 @@
     .\" 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. All advertising materials mentioning features or use of this software
    -.\"    must display the following acknowledgement:
    -.\"	This product includes software developed by the University of
    -.\"	California, Berkeley and its contributors.
    -.\" 4. Neither the name of the University nor the names of its contributors
    +.\" 3. 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.
     .\"
    diff --git a/games/fortune/strfile/strfile.c b/games/fortune/strfile/strfile.c
    index 2f09e3d6dd0c..c88d99741d5b 100644
    --- a/games/fortune/strfile/strfile.c
    +++ b/games/fortune/strfile/strfile.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -48,16 +44,18 @@ static const char sccsid[] = "@(#)strfile.c   8.1 (Berkeley) 5/31/93";
     #include 
     __FBSDID("$FreeBSD$");
     
    -# include	
    -# include	
    -# include	
    -# include       
    -# include	
    -# include       
    -# include       
    -# include       
    -# include       
    -# include	"strfile.h"
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#include "strfile.h"
     
     /*
      *	This program takes a file composed of strings separated by
    @@ -83,26 +81,19 @@ __FBSDID("$FreeBSD$");
      *	Added ordering options.
      */
     
    -# define	TRUE	1
    -# define	FALSE	0
    +#define	STORING_PTRS	(Oflag || Rflag)
    +#define	CHUNKSIZE	512
     
    -# define	STORING_PTRS	(Oflag || Rflag)
    -# define	CHUNKSIZE	512
    -
    -# define        ALLOC(ptr,sz) { \
    +#define		ALLOC(ptr, sz)	do { \
     			if (ptr == NULL) \
    -				ptr = malloc(CHUNKSIZE * sizeof *ptr); \
    +				ptr = malloc(CHUNKSIZE * sizeof(*ptr)); \
     			else if (((sz) + 1) % CHUNKSIZE == 0) \
    -				ptr = realloc(ptr, ((sz) + CHUNKSIZE) * sizeof *ptr); \
    +				ptr = realloc(ptr, ((sz) + CHUNKSIZE) * sizeof(*ptr)); \
     			if (ptr == NULL) { \
     				fprintf(stderr, "out of space\n"); \
     				exit(1); \
     			} \
    -		}
    -
    -#ifdef NO_VOID
    -# define	void	char
    -#endif
    +		} while (0)
     
     typedef struct {
     	int	first;
    @@ -113,12 +104,12 @@ static char	*Infile		= NULL,		/* input file name */
     		Outfile[MAXPATHLEN] = "",	/* output file name */
     		Delimch		= '%';		/* delimiting character */
     
    -static int	Cflag		= FALSE;	/* embedded comments */
    -static int	Sflag		= FALSE;	/* silent run flag */
    -static int	Oflag		= FALSE;	/* ordering flag */
    -static int	Iflag		= FALSE;	/* ignore case flag */
    -static int	Rflag		= FALSE;	/* randomize order flag */
    -static int	Xflag		= FALSE;	/* set rotated bit */
    +static int	Cflag		= false;	/* embedded comments */
    +static int	Sflag		= false;	/* silent run flag */
    +static int	Oflag		= false;	/* ordering flag */
    +static int	Iflag		= false;	/* ignore case flag */
    +static int	Rflag		= false;	/* randomize order flag */
    +static int	Xflag		= false;	/* set rotated bit */
     static uint32_t	Num_pts		= 0;		/* number of pointers/strings */
     
     static off_t	*Seekpts;
    @@ -129,13 +120,13 @@ static STRFILE	Tbl;				/* statistics table */
     
     static STR	*Firstch;			/* first chars of each string */
     
    -static void	add_offset(FILE *, off_t);
    -static int	cmp_str(const void *, const void *);
    -static int      stable_collate_range_cmp(int, int);
    -static void	do_order(void);
    -static void	getargs(int, char **);
    -static void	randomize(void);
    -static void	usage(void);
    +static void add_offset(FILE *, off_t);
    +static int cmp_str(const void *, const void *);
    +static int stable_collate_range_cmp(int, int);
    +static void do_order(void);
    +static void getargs(int, char **);
    +static void randomize(void);
    +static void usage(void);
     
     /*
      * main:
    @@ -146,19 +137,19 @@ static void	usage(void);
      *	CHUNKSIZE blocks; if the latter, we just write each pointer,
      *	and then seek back to the beginning to write in the table.
      */
    -int main(int ac, char *av[])
    +int
    +main(int ac, char *av[])
     {
    -	char		*sp, dc;
    -	FILE		*inf, *outf;
    -	off_t		last_off, pos, *p;
    -	size_t		length;
    -	int		first;
    -	uint32_t	cnt;
    -	char		*nsp;
    -	STR		*fp;
    -	static char		string[257];
    +	char *sp, *nsp, dc;
    +	FILE *inf, *outf;
    +	off_t last_off, pos, *p;
    +	size_t length;
    +	int first;
    +	uint32_t cnt;
    +	STR *fp;
    +	static char string[257];
     
    -	(void) setlocale(LC_ALL, "");
    +	setlocale(LC_ALL, "");
     
     	getargs(ac, av);		/* evalute arguments */
     	dc = Delimch;
    @@ -172,7 +163,7 @@ int main(int ac, char *av[])
     		exit(1);
     	}
     	if (!STORING_PTRS)
    -		(void) fseek(outf, (long) sizeof Tbl, 0);
    +		fseek(outf, (long)sizeof(Tbl), SEEK_SET);
     
     	/*
     	 * Write the strings onto the file
    @@ -211,7 +202,7 @@ int main(int ac, char *av[])
     			else
     				fp->first = *nsp;
     			fp->pos = Seekpts[Num_pts - 1];
    -			first = FALSE;
    +			first = false;
     		}
     	} while (sp != NULL);
     
    @@ -219,7 +210,7 @@ int main(int ac, char *av[])
     	 * write the tables in
     	 */
     
    -	(void) fclose(inf);
    +	fclose(inf);
     	Tbl.str_numstr = Num_pts - 1;
     
     	if (Cflag)
    @@ -251,24 +242,23 @@ int main(int ac, char *av[])
     	Tbl.str_longlen = htobe32(Tbl.str_longlen);
     	Tbl.str_shortlen = htobe32(Tbl.str_shortlen);
     	Tbl.str_flags = htobe32(Tbl.str_flags);
    -	(void) fwrite((char *) &Tbl, sizeof Tbl, 1, outf);
    +	fwrite((char *)&Tbl, sizeof(Tbl), 1, outf);
     	if (STORING_PTRS) {
     		for (p = Seekpts, cnt = Num_pts; cnt--; ++p)
     			*p = htobe64(*p);
    -		(void) fwrite(Seekpts, sizeof *Seekpts, (size_t) Num_pts, outf);
    +		fwrite(Seekpts, sizeof(*Seekpts), (size_t)Num_pts, outf);
     	}
    -	(void) fclose(outf);
    +	fclose(outf);
     	exit(0);
     }
     
     /*
      *	This routine evaluates arguments from the command line
      */
    -void getargs(argc, argv)
    -int	argc;
    -char	**argv;
    +void
    +getargs(int argc, char **argv)
     {
    -	int	ch;
    +	int ch;
     
     	while ((ch = getopt(argc, argv, "Cc:iorsx")) != -1)
     		switch(ch) {
    @@ -306,21 +296,22 @@ char	**argv;
     	if (*argv) {
     		Infile = *argv;
     		if (*++argv)
    -			(void) strcpy(Outfile, *argv);
    +			strcpy(Outfile, *argv);
     	}
     	if (!Infile) {
     		puts("No input file name");
     		usage();
     	}
     	if (*Outfile == '\0') {
    -		(void) strcpy(Outfile, Infile);
    -		(void) strcat(Outfile, ".dat");
    +		strcpy(Outfile, Infile);
    +		strcat(Outfile, ".dat");
     	}
     }
     
    -void usage()
    +void
    +usage(void)
     {
    -	(void) fprintf(stderr,
    +	fprintf(stderr,
     	    "strfile [-Ciorsx] [-c char] source_file [output_file]\n");
     	exit(1);
     }
    @@ -329,15 +320,14 @@ void usage()
      * add_offset:
      *	Add an offset to the list, or write it out, as appropriate.
      */
    -void add_offset(fp, off)
    -FILE	*fp;
    -off_t	off;
    +void
    +add_offset(FILE *fp, off_t off)
     {
     	off_t beoff;
     
     	if (!STORING_PTRS) {
     		beoff = htobe64(off);
    -		fwrite(&beoff, 1, sizeof beoff, fp);
    +		fwrite(&beoff, 1, sizeof(beoff), fp);
     	} else {
     		ALLOC(Seekpts, Num_pts + 1);
     		Seekpts[Num_pts] = off;
    @@ -349,27 +339,28 @@ off_t	off;
      * do_order:
      *	Order the strings alphabetically (possibly ignoring case).
      */
    -void do_order()
    +void
    +do_order(void)
     {
     	uint32_t i;
    -	off_t	*lp;
    -	STR	*fp;
    +	off_t *lp;
    +	STR *fp;
     
     	Sort_1 = fopen(Infile, "r");
     	Sort_2 = fopen(Infile, "r");
    -	qsort(Firstch, (size_t) Tbl.str_numstr, sizeof *Firstch, cmp_str);
    +	qsort(Firstch, (size_t)Tbl.str_numstr, sizeof(*Firstch), cmp_str);
     	i = Tbl.str_numstr;
     	lp = Seekpts;
     	fp = Firstch;
     	while (i--)
     		*lp++ = fp++->pos;
    -	(void) fclose(Sort_1);
    -	(void) fclose(Sort_2);
    +	fclose(Sort_1);
    +	fclose(Sort_2);
     	Tbl.str_flags |= STR_ORDERED;
     }
     
    -static int stable_collate_range_cmp(c1, c2)
    -	int c1, c2;
    +static int
    +stable_collate_range_cmp(int c1, int c2)
     {
     	static char s1[2], s2[2];
     	int ret;
    @@ -385,30 +376,28 @@ static int stable_collate_range_cmp(c1, c2)
      * cmp_str:
      *	Compare two strings in the file
      */
    -int cmp_str(s1, s2)
    -const void	*s1, *s2;
    +int
    +cmp_str(const void *s1, const void *s2)
     {
    -	const STR	*p1, *p2;
    -	int	c1, c2;
    -	int	n1, n2;
    -	int r;
    +	const STR *p1, *p2;
    +	int c1, c2, n1, n2, r;
     
    -# define	SET_N(nf,ch)	(nf = (ch == '\n'))
    -# define        IS_END(ch,nf)   (ch == EOF || (ch == (unsigned char) Delimch && nf))
    +#define	SET_N(nf,ch)	(nf = (ch == '\n'))
    +#define	IS_END(ch,nf)	(ch == EOF || (ch == (unsigned char)Delimch && nf))
     
    -	p1 = (const STR *) s1;
    -	p2 = (const STR *) s2;
    -	
    -	c1 = (unsigned char) p1->first;
    -	c2 = (unsigned char) p2->first;
    +	p1 = (const STR *)s1;
    +	p2 = (const STR *)s2;
    +
    +	c1 = (unsigned char)p1->first;
    +	c2 = (unsigned char)p2->first;
     	if ((r = stable_collate_range_cmp(c1, c2)) != 0)
     		return (r);
     
    -	(void) fseeko(Sort_1, p1->pos, 0);
    -	(void) fseeko(Sort_2, p2->pos, 0);
    +	fseeko(Sort_1, p1->pos, SEEK_SET);
    +	fseeko(Sort_2, p2->pos, SEEK_SET);
     
    -	n1 = FALSE;
    -	n2 = FALSE;
    +	n1 = false;
    +	n2 = false;
     	while (!isalnum(c1 = getc(Sort_1)) && c1 != '\0' && c1 != EOF)
     		SET_N(n1, c1);
     	while (!isalnum(c2 = getc(Sort_2)) && c2 != '\0' && c2 != EOF)
    @@ -432,6 +421,7 @@ const void	*s1, *s2;
     		c1 = 0;
     	if (IS_END(c2, n2))
     		c2 = 0;
    +
     	return (stable_collate_range_cmp(c1, c2));
     }
     
    @@ -441,11 +431,12 @@ const void	*s1, *s2;
      *	not to randomize across delimiter boundaries.  All
      *	randomization is done within each block.
      */
    -void randomize()
    +void
    +randomize(void)
     {
     	uint32_t cnt, i;
    -	off_t	tmp;
    -	off_t	*sp;
    +	off_t tmp;
    +	off_t *sp;
     
     #if __FreeBSD_version < 800041
     	srandomdev();
    diff --git a/games/fortune/strfile/strfile.h b/games/fortune/strfile/strfile.h
    index 4726024cca13..5d4f87558411 100644
    --- a/games/fortune/strfile/strfile.h
    +++ b/games/fortune/strfile/strfile.h
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/fortune/unstr/Makefile b/games/fortune/unstr/Makefile
    index 0331e4bfa2a8..428b10922737 100644
    --- a/games/fortune/unstr/Makefile
    +++ b/games/fortune/unstr/Makefile
    @@ -3,7 +3,6 @@
     
     PROG=	unstr
     NO_MAN=
    -WARNS?=	6
     CFLAGS+= -I${.CURDIR}/../strfile
     
     .include 
    diff --git a/games/fortune/unstr/unstr.c b/games/fortune/unstr/unstr.c
    index 25996f4f6b95..da799a072cd6 100644
    --- a/games/fortune/unstr/unstr.c
    +++ b/games/fortune/unstr/unstr.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -61,14 +57,15 @@ __FBSDID("$FreeBSD$");
      *	Ken Arnold		Aug 13, 1978
      */
     
    -# include	
    -# include	
    -# include	
    -# include	
    -# include	
    -# include	
    -# include       
    -# include	"strfile.h"
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#include "strfile.h"
     
     char	*Infile,			/* name of input file */
     	Datafile[MAXPATHLEN],		/* name of data file */
    @@ -79,22 +76,23 @@ FILE	*Inf, *Dataf;
     void order_unstr(STRFILE *);
     
     /* ARGSUSED */
    -int main(int ac, char **av)
    +int
    +main(int argc, char *argv[])
     {
    -	static STRFILE	tbl;		/* description table */
    +	static STRFILE tbl;		/* description table */
     
    -	if (ac != 2) {
    -		(void)fprintf(stderr, "usage: unstr datafile\n");
    +	if (argc != 2) {
    +		fprintf(stderr, "usage: unstr datafile\n");
     		exit(1);
     	}
    -	Infile = av[1];
    -	(void) strcpy(Datafile, Infile);
    -	(void) strcat(Datafile, ".dat");
    +	Infile = argv[1];
    +	strcpy(Datafile, Infile);
    +	strcat(Datafile, ".dat");
     	if ((Inf = fopen(Infile, "r")) == NULL)
     		err(1, "%s", Infile);
     	if ((Dataf = fopen(Datafile, "r")) == NULL)
     		err(1, "%s", Datafile);
    -	(void) fread((char *) &tbl, sizeof tbl, 1, Dataf);
    +	fread((char *)&tbl, sizeof(tbl), 1, Dataf);
     	tbl.str_version = be32toh(tbl.str_version);
     	tbl.str_numstr = be32toh(tbl.str_numstr);
     	tbl.str_longlen = be32toh(tbl.str_longlen);
    @@ -104,26 +102,26 @@ int main(int ac, char **av)
     		errx(1, "nothing to do -- table in file order");
     	Delimch = tbl.str_delim;
     	order_unstr(&tbl);
    -	(void) fclose(Inf);
    -	(void) fclose(Dataf);
    +	fclose(Inf);
    +	fclose(Dataf);
     	exit(0);
     }
     
    -void order_unstr(tbl)
    -STRFILE	*tbl;
    +void
    +order_unstr(STRFILE *tbl)
     {
     	uint32_t i;
    -	char	*sp;
    -	off_t	pos;
    -	char	buf[BUFSIZ];
    +	char *sp;
    +	off_t pos;
    +	char buf[BUFSIZ];
     
     	for (i = 0; i < tbl->str_numstr; i++) {
    -		(void) fread(&pos, 1, sizeof pos, Dataf);
    -		(void) fseeko(Inf, be64toh(pos), 0);
    +		fread(&pos, 1, sizeof(pos), Dataf);
    +		fseeko(Inf, be64toh(pos), SEEK_SET);
     		if (i != 0)
    -			(void) printf("%c\n", Delimch);
    +			printf("%c\n", Delimch);
     		for (;;) {
    -			sp = fgets(buf, sizeof buf, Inf);
    +			sp = fgets(buf, sizeof(buf), Inf);
     			if (sp == NULL || STR_ENDSTRING(sp, *tbl))
     				break;
     			else
    diff --git a/games/grdc/Makefile b/games/grdc/Makefile
    index 0aeea1e2ab2e..6b1d6ee8034a 100644
    --- a/games/grdc/Makefile
    +++ b/games/grdc/Makefile
    @@ -1,9 +1,8 @@
     # $FreeBSD$
     
    -PROG=   grdc
    -WARNS?=	2
    -MAN=   grdc.6
    -DPADD=  ${LIBNCURSES}
    -LDADD=  -lncurses
    +PROG=	grdc
    +MAN=	grdc.6
    +DPADD=	${LIBNCURSES}
    +LDADD=	-lncurses
     
     .include 
    diff --git a/games/grdc/grdc.c b/games/grdc/grdc.c
    index d27b10ed7916..7586be6accec 100644
    --- a/games/grdc/grdc.c
    +++ b/games/grdc/grdc.c
    @@ -48,23 +48,22 @@ void movto(int, int);
     void sighndl(int);
     void usage(void);
     
    -void sighndl(signo)
    -int signo;
    +void
    +sighndl(int signo)
     {
     	sigtermed=signo;
     }
     
     int
    -main(argc, argv)
    -int argc;
    -char **argv;
    +main(int argc, char *argv[])
     {
    -long t, a;
    -int i, j, s, k;
    -int n;
    -int ch;
    -int scrol;
    -int t12;
    +	struct timespec ts;
    +	long t, a;
    +	int i, j, s, k;
    +	int n;
    +	int ch;
    +	int scrol;
    +	int t12;
     
     	t12 = scrol = 0;
     
    @@ -136,9 +135,9 @@ int t12;
     
     		attrset(COLOR_PAIR(2));
     	}
    +	time(&now);
     	do {
     		mask = 0;
    -		time(&now);
     		tm = localtime(&now);
     		set(tm->tm_sec%10, 0);
     		set(tm->tm_sec/10, 4);
    @@ -193,7 +192,19 @@ int t12;
     		}
     		movto(6, 0);
     		refresh();
    -		sleep(1);
    +		clock_gettime(CLOCK_REALTIME_FAST, &ts);
    +		if (ts.tv_sec == now) {
    +			if (ts.tv_nsec > 0) {
    +				ts.tv_sec = 0;
    +				ts.tv_nsec = 1000000000 - ts.tv_nsec;
    +			} else {
    +				ts.tv_sec = 1;
    +				ts.tv_nsec = 0;
    +			}
    +			nanosleep(&ts, NULL);
    +			now = ts.tv_sec + 1;
    +		} else
    +			now = ts.tv_sec;
     		if (sigtermed) {
     			standend();
     			clear();
    @@ -212,7 +223,7 @@ int t12;
     void
     set(int t, int n)
     {
    -int i, m;
    +	int i, m;
     
     	m = 7<
    diff --git a/games/morse/morse.c b/games/morse/morse.c
    index 7663402c5c99..6c8ff5ff9a79 100644
    --- a/games/morse/morse.c
    +++ b/games/morse/morse.c
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -63,13 +59,16 @@ static const char rcsid[] =
     #include 
     #include 
     
    +/* Always use the speaker, let the open fail if -p is selected */
    +#define SPEAKER "/dev/speaker"
    +
     #ifdef SPEAKER
     #include 
     #endif
     
     struct morsetab {
    -	char            inchar;
    -	char           *morse;
    +	const char      inchar;
    +	const char     *morse;
     };
     
     static const struct morsetab mtab[] = {
    diff --git a/games/number/number.c b/games/number/number.c
    index 243fc8ddc866..2ffc87cfea77 100644
    --- a/games/number/number.c
    +++ b/games/number/number.c
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -88,9 +84,7 @@ void	usage(void);
     int lflag;
     
     int
    -main(argc, argv)
    -	int argc;
    -	char *argv[];
    +main(int argc, char *argv[])
     {
     	int ch, first;
     	char line[256];
    @@ -127,8 +121,7 @@ main(argc, argv)
     }
     
     void
    -convert(line)
    -	char *line;
    +convert(char *line)
     {
     	int flen, len, rval;
     	char *p, *fraction;
    @@ -196,9 +189,7 @@ badnum:			errx(1, "illegal number: %s", line);
     }
     
     int
    -unit(len, p)
    -	int len;
    -	char *p;
    +unit(int len, char *p)
     {
     	int off, rval;
     
    @@ -232,9 +223,7 @@ unit(len, p)
     }
     
     int
    -number(p, len)
    -	char *p;
    -	int len;
    +number(char *p, int len)
     {
     	int val, rval;
     
    @@ -272,10 +261,9 @@ number(p, len)
     }
     
     void
    -pfract(len)
    -	int len;
    +pfract(int len)
     {
    -	static char *pref[] = { "", "ten-", "hundred-" };
    +	static char const * const pref[] = { "", "ten-", "hundred-" };
     
     	switch(len) {
     	case 1:
    @@ -291,7 +279,7 @@ pfract(len)
     }
     
     void
    -usage()
    +usage(void)
     {
     	(void)fprintf(stderr, "usage: number [-l] [# ...]\n");
     	exit(1);
    diff --git a/games/pom/Makefile b/games/pom/Makefile
    index 332f3cf1aeaf..9a74204f2564 100644
    --- a/games/pom/Makefile
    +++ b/games/pom/Makefile
    @@ -6,6 +6,4 @@ MAN=	pom.6
     DPADD=	${LIBM}
     LDADD=	-lm
     
    -WARNS?=	6
    -
     .include 
    diff --git a/games/pom/pom.6 b/games/pom/pom.6
    index 1a5325b4b5a0..e6bc957518c1 100644
    --- a/games/pom/pom.6
    +++ b/games/pom/pom.6
    @@ -32,15 +32,34 @@
     .\"	@(#)pom.6	8.1 (Berkeley) 5/31/93
     .\" $FreeBSD$
     .\"
    -.TH POM 6 "May 31, 1993"
    +.Dd May 31, 1993
    +.Dt POM 6
     .UC 7
    -.SH NAME
    -pom \- display the phase of the moon
    -.SH SYNOPSIS
    -.B pom
    -.SH DESCRIPTION
    +.Sh NAME
    +.Nm pom
    +.Nd display the phase of the moon
    +.Sh SYNOPSIS
    +.Nm 
    +.Op Fl d Ar yyyy.mm.dd
    +.Op Fl t Ar hh:mm:ss
    +.Sh DESCRIPTION
     The
    -.I pom
    +.Nm
     utility displays the current phase of the moon.
     Useful for selecting software completion target dates and predicting
     managerial behavior.
    +.Pp
    +Use the arguments
    +.Fl d
    +and
    +.Fl o
    +to specify a specific date and time for which the phase of the moon
    +has to be calculated.
    +If
    +.Fl d
    +but not
    +.Fl t
    +has been specified, it will calculate the phase of the moon on that
    +day at midnight.
    +.Sh SEE ALSO
    +`Practical Astronomy with Your Calculator' by Duffett-Smith.
    diff --git a/games/pom/pom.c b/games/pom/pom.c
    index d245f34bd7f2..00dacd8f9555 100644
    --- a/games/pom/pom.c
    +++ b/games/pom/pom.c
    @@ -12,11 +12,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -57,9 +53,13 @@ __FBSDID("$FreeBSD$");
      *
      */
     
    -#include 
     #include 
    +#include 
     #include 
    +#include 
    +#include 
    +#include 
    +#include  
     
     #ifndef	PI
     #define	PI	  3.14159265358979323846
    @@ -76,20 +76,62 @@ __FBSDID("$FreeBSD$");
     static void	adj360(double *);
     static double	dtor(double);
     static double	potm(double);
    +static void	usage(char *progname);
     
     int
    -main(void)
    +main(int argc, char **argv)
     {
     	time_t tt;
    -	struct tm *GMT;
    +	struct tm GMT, tmd;
     	double days, today, tomorrow;
    -	int cnt;
    +	int ch, cnt;
    +	char *odate = NULL, *otime = NULL;
     
    -	(void) time(&tt);
    -	GMT = gmtime(&tt);
    -	days = (GMT->tm_yday + 1) + ((GMT->tm_hour +
    -	    (GMT->tm_min / 60.0) + (GMT->tm_sec / 3600.0)) / 24.0);
    -	for (cnt = EPOCH; cnt < GMT->tm_year; ++cnt)
    +	while ((ch = getopt(argc, argv, "d:t:")) != -1)
    +		switch (ch) {
    +		case 'd':
    +			odate = optarg;
    +			break;
    +		case 't':
    +			otime = optarg;
    +			break;
    +		default:
    +			usage(argv[0]);
    +		}
    +
    +        argc -= optind;
    +	argv += optind;
    +
    +	if (argc)
    +		usage(argv[0]);
    +
    +	/* Adjust based on users preferences */
    +	time(&tt);
    +	if (otime != NULL || odate != NULL) {
    +		/* Save today in case -d isn't specified */
    +		localtime_r(&tt, &tmd);
    +
    +		if (odate != NULL) {
    +			tmd.tm_year = strtol(odate, NULL, 10) - 1900;
    +			tmd.tm_mon = strtol(odate + 5, NULL, 10) - 1;
    +			tmd.tm_mday = strtol(odate + 8, NULL, 10);
    +			/* Use midnight as the middle of the night */
    +			tmd.tm_hour = 0;
    +			tmd.tm_min = 0;
    +			tmd.tm_sec = 0;
    +		}
    +		if (otime != NULL) {
    +			tmd.tm_hour = strtol(otime, NULL, 10);
    +			tmd.tm_min = strtol(otime + 3, NULL, 10);
    +			tmd.tm_sec = strtol(otime + 6, NULL, 10);
    +		}
    +		tt = mktime(&tmd);
    +	}
    +
    +	gmtime_r(&tt, &GMT);
    +	days = (GMT.tm_yday + 1) + ((GMT.tm_hour +
    +	    (GMT.tm_min / 60.0) + (GMT.tm_sec / 3600.0)) / 24.0);
    +	for (cnt = EPOCH; cnt < GMT.tm_year; ++cnt)
     		days += isleap(1900 + cnt) ? 366 : 365;
     	today = potm(days) + .5;
     	(void)printf("The Moon is ");
    @@ -160,6 +202,7 @@ potm(double days)
     static double
     dtor(double deg)
     {
    +
     	return(deg * PI / 180);
     }
     
    @@ -170,6 +213,7 @@ dtor(double deg)
     static void
     adj360(double *deg)
     {
    +
     	for (;;)
     		if (*deg < 0)
     			*deg += 360;
    @@ -178,3 +222,11 @@ adj360(double *deg)
     		else
     			break;
     }
    +
    +static void
    +usage(char *progname)
    +{
    +
    +	fprintf(stderr, "Usage: %s [-d yyyy.mm.dd] [-t hh:mm:ss]\n", progname);
    +	exit(EX_USAGE);
    +}
    diff --git a/games/ppt/Makefile b/games/ppt/Makefile
    index d4433c45ccc3..c5ac6a8b2f3c 100644
    --- a/games/ppt/Makefile
    +++ b/games/ppt/Makefile
    @@ -4,7 +4,5 @@
     PROG=	ppt
     NO_MAN=
     
    -WARNS?=	6
    -
     .include 
     
    diff --git a/games/ppt/ppt.c b/games/ppt/ppt.c
    index e0ae5e137c54..a032e13ed394 100644
    --- a/games/ppt/ppt.c
    +++ b/games/ppt/ppt.c
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/primes/pattern.c b/games/primes/pattern.c
    index 66b2dc807151..2b30678cf3b5 100644
    --- a/games/primes/pattern.c
    +++ b/games/primes/pattern.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/primes/pr_tbl.c b/games/primes/pr_tbl.c
    index 6447916daad3..5bb709330b83 100644
    --- a/games/primes/pr_tbl.c
    +++ b/games/primes/pr_tbl.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/primes/primes.c b/games/primes/primes.c
    index c89817d7da68..33838ee933da 100644
    --- a/games/primes/primes.c
    +++ b/games/primes/primes.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/primes/primes.h b/games/primes/primes.h
    index fde2b83f3fa9..0951bbf5ad9c 100644
    --- a/games/primes/primes.h
    +++ b/games/primes/primes.h
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/games/random/Makefile b/games/random/Makefile
    index 7db5a8f8f85a..9136c98a9d1e 100644
    --- a/games/random/Makefile
    +++ b/games/random/Makefile
    @@ -4,6 +4,5 @@
     PROG=	random
     MAN=	random.6
     SRCS=	random.c randomize_fd.c
    -WARNS?=	5
     
     .include 
    diff --git a/games/random/random.c b/games/random/random.c
    index c1be97ba5cb9..4ec36c6377a7 100644
    --- a/games/random/random.c
    +++ b/games/random/random.c
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/gnu/lib/libgcc/Makefile b/gnu/lib/libgcc/Makefile
    index 399aff85bb0b..51e763046554 100644
    --- a/gnu/lib/libgcc/Makefile
    +++ b/gnu/lib/libgcc/Makefile
    @@ -115,6 +115,10 @@ LIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c
     #	_fixsfsi _fixunssfsi _floatdidf _floatdisf
     .endif
     
    +.if ${TARGET_ARCH} == "mips"
    +LIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c
    +.endif
    +
     .if ${TARGET_ARCH} == "ia64"
     #	from config/ia64/t-ia64
     LIB1ASMSRC   = lib1funcs.asm
    @@ -179,7 +183,7 @@ OBJ_GRPS =	STD DIV
     #
     # Floating point emulation functions
     #
    -.if ${TARGET_ARCH} == "armNOT_YET" || ${TARGET_ARCH} == "mips" || \
    +.if ${TARGET_ARCH} == "armNOT_YET" || \
         ${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "sparc64"
     
     FPBIT_CFLAGS =	-DFINE_GRAINED_LIBRARIES -DFLOAT
    @@ -297,7 +301,7 @@ CLEANFILES += cs-*.h option*
     
     #-----------------------------------------------------------------------
     #
    -# Build additional static libgcc_eh[_p].a librarries.
    +# Build symbol version map
     #
     SHLIB_MKMAP      = ${GCCDIR}/mkmap-symver.awk
     SHLIB_MKMAP_OPTS =
    @@ -316,7 +320,7 @@ CLEANFILES +=	libgcc.map
     
     #-----------------------------------------------------------------------
     #
    -# Build additional static libgcc_eh[_p].a librarries.
    +# Build additional static libgcc_eh[_p].a libraries.
     #
     lib${LIB}_eh.a:	${EH_OBJS_T}
     	@${ECHO} building static ${LIB}_eh library
    diff --git a/gnu/lib/libgcov/Makefile b/gnu/lib/libgcov/Makefile
    index 36be1ea21a18..680cdbff30a0 100644
    --- a/gnu/lib/libgcov/Makefile
    +++ b/gnu/lib/libgcov/Makefile
    @@ -2,6 +2,7 @@
     
     NO_PROFILE=
     .include 
    +MK_SSP=		no
     .include "${.CURDIR}/../../usr.bin/cc/Makefile.tgt"
     
     GCCDIR=	${.CURDIR}/../../../contrib/gcc
    diff --git a/gnu/lib/libstdc++/Makefile b/gnu/lib/libstdc++/Makefile
    index e2a774e22a54..419d51c4f4df 100644
    --- a/gnu/lib/libstdc++/Makefile
    +++ b/gnu/lib/libstdc++/Makefile
    @@ -21,6 +21,7 @@ CFLAGS+=	-I${GCCLIB}/include -I${SRCDIR}/include -I.
     CFLAGS+=	-frandom-seed=RepeatabilityConsideredGood
     CXXFLAGS+=	-fno-implicit-templates -ffunction-sections -fdata-sections \
     		-Wno-deprecated
    +PO_CXXFLAGS=	${CXXFLAGS:N-ffunction-sections}
     
     DPADD=		${LIBM}
     LDADD=		-lm
    diff --git a/gnu/lib/libsupc++/Makefile b/gnu/lib/libsupc++/Makefile
    index 54e96b855565..fc024e861ccb 100644
    --- a/gnu/lib/libsupc++/Makefile
    +++ b/gnu/lib/libsupc++/Makefile
    @@ -23,6 +23,7 @@ CFLAGS+=	-I${GCCLIB}/include -I${SRCDIR} -I${GCCDIR}
     CFLAGS+=	-I${.CURDIR}/../libstdc++ -I.
     CFLAGS+=	-frandom-seed=RepeatabilityConsideredGood
     CXXFLAGS+=	-fno-implicit-templates -ffunction-sections -fdata-sections
    +PO_CXXFLAGS=    ${CXXFLAGS:N-ffunction-sections}
     
     HDRS=	exception new typeinfo cxxabi.h exception_defines.h
     INCS=	${HDRS:S;^;${SRCDIR}/;}
    diff --git a/gnu/usr.bin/Makefile b/gnu/usr.bin/Makefile
    index 82792df3bf98..bfb4d93a0b74 100644
    --- a/gnu/usr.bin/Makefile
    +++ b/gnu/usr.bin/Makefile
    @@ -2,12 +2,10 @@
     
     .include 
     
    -SUBDIR= bc \
    -	${_binutils} \
    +SUBDIR= ${_binutils} \
     	${_cc} \
     	${_cpio} \
     	${_cvs} \
    -	dc \
     	dialog \
     	diff \
     	diff3 \
    @@ -23,10 +21,6 @@ SUBDIR= bc \
     	sort \
     	${_texinfo}
     
    -.if ${MACHINE_ARCH} == "mips"
    -MK_GDB=no	# not yet
    -.endif
    -
     .if ${MK_CXX} != "no"
     _gperf=		gperf
     .if ${MK_GROFF} != "no"
    diff --git a/gnu/usr.bin/bc/Makefile b/gnu/usr.bin/bc/Makefile
    deleted file mode 100644
    index 74419f2d8d22..000000000000
    --- a/gnu/usr.bin/bc/Makefile
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -# $FreeBSD$
    -
    -.include 
    -
    -BCDIR=	${.CURDIR}/../../../contrib/bc
    -.PATH: ${BCDIR}/bc ${BCDIR}/lib ${BCDIR}/doc ${BCDIR}/Examples
    -
    -PROG=	bc
    -SRCS=	bc.y execute.c global.c load.c main.c scan.l storage.c util.c \
    -	number.c
    -CFLAGS+=-I. -I${.CURDIR} -I${BCDIR}/h -I${BCDIR}/bc
    -CFLAGS+=-DHAVE_CONFIG_H
    -DPADD=	${LIBREADLINE} ${LIBTERMCAP}
    -LDADD=	-lreadline -ltermcap
    -
    -.if ${MK_EXAMPLES} != "no"
    -FILES=	ckbook.b pi.b primes.b twins.b
    -FILESDIR=	${SHAREDIR}/examples/bc
    -.endif
    -
    -.include 
    diff --git a/gnu/usr.bin/bc/config.h b/gnu/usr.bin/bc/config.h
    deleted file mode 100644
    index b9e3520ac551..000000000000
    --- a/gnu/usr.bin/bc/config.h
    +++ /dev/null
    @@ -1,84 +0,0 @@
    -/* $FreeBSD$ */
    -
    -/* config.h.  Generated automatically by configure.  */
    -/* config.h.in.  Generated automatically from configure.in by autoheader.  */
    -
    -/* Define to empty if the keyword does not work.  */
    -/* #undef const */
    -
    -/* Define if you don't have vprintf but do have _doprnt.  */
    -/* #undef HAVE_DOPRNT */
    -
    -/* Define if you have the vprintf function.  */
    -#define HAVE_VPRINTF 1
    -
    -/* Define if on MINIX.  */
    -/* #undef _MINIX */
    -
    -/* Define if the system does not provide POSIX.1 features except
    -   with this defined.  */
    -/* #undef _POSIX_1_SOURCE */
    -
    -/* Define if you need to in order for stat and other things to work.  */
    -/* #undef _POSIX_SOURCE */
    -
    -/* Define to `unsigned' if  doesn't define.  */
    -/* #undef size_t */
    -
    -/* Define if you have the ANSI C header files.  */
    -#define STDC_HEADERS 1
    -
    -/* Define if lex declares yytext as a char * by default, not a char[].  */
    -#define YYTEXT_POINTER 1
    -
    -/* VERSION number for DC target*/
    -#define DC_VERSION "1.3"
    -
    -/* COPYRIGHT notice for DC target */
    -#define DC_COPYRIGHT "Copyright 1994, 1997, 1998, 2000 Free Software Foundation, Inc."
    -
    -/* COPYRIGHT notice for BC target */
    -#define BC_COPYRIGHT "Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc."
    -
    -/* Define to use the readline library. */
    -#define READLINE 1
    -
    -/* Define to use the BSD libedit library. */
    -/* #define LIBEDIT 1 */
    -
    -/* Define to `size_t' if  and  don't define.  */
    -/* #undef ptrdiff_t */
    -
    -/* Define if you have the isgraph function.  */
    -#define HAVE_ISGRAPH 1
    -
    -/* Define if you have the setvbuf function.  */
    -#define HAVE_SETVBUF 1
    -
    -/* Define if you have the  header file.  */
    -/* #undef HAVE_LIB_H */
    -
    -/* Define if you have the  header file.  */
    -#define HAVE_LIMITS_H 1
    -
    -/* Define if you have the  header file.  */
    -#define HAVE_STDARG_H 1
    -
    -/* Define if you have the  header file.  */
    -#define HAVE_STDDEF_H 1
    -
    -/* Define if you have the  header file.  */
    -#define HAVE_STDLIB_H 1
    -
    -/* Define if you have the  header file.  */
    -#define HAVE_STRING_H 1
    -
    -/* Define if you have the  header file.  */
    -#define HAVE_UNISTD_H 1
    -
    -/* Name of package */
    -#define PACKAGE "bc"
    -
    -/* Version number of package */
    -#define VERSION "1.06"
    -
    diff --git a/gnu/usr.bin/binutils/Makefile.inc b/gnu/usr.bin/binutils/Makefile.inc
    index 9ce4ca3e5f32..1e2665f97d9b 100644
    --- a/gnu/usr.bin/binutils/Makefile.inc
    +++ b/gnu/usr.bin/binutils/Makefile.inc
    @@ -1,9 +1,5 @@
     # $FreeBSD$
     
    -.if (${TARGET_ARCH} == "alpha")
    -WARNS?=	2
    -.else
     WARNS?=	3
    -.endif
     
     .include "../Makefile.inc"
    diff --git a/gnu/usr.bin/binutils/Makefile.inc0 b/gnu/usr.bin/binutils/Makefile.inc0
    index 859a3a8cff3b..945c9339b4e4 100644
    --- a/gnu/usr.bin/binutils/Makefile.inc0
    +++ b/gnu/usr.bin/binutils/Makefile.inc0
    @@ -22,7 +22,8 @@ RELTOP:= ..
     RELSRC=	${RELTOP}/../../../contrib/binutils
     SRCDIR=	${.CURDIR}/${RELSRC}
     
    -.if ${TARGET_ARCH} == "arm" || ${TARGET_ARCH} == "i386" || ${TARGET_ARCH} == "powerpc"
    +.if ${TARGET_ARCH} == "arm" || ${TARGET_ARCH} == "i386" || \
    +	${TARGET_ARCH} == "powerpc" || ${TARGET_ARCH} == "mips"
     CFLAGS+= -DBFD_DEFAULT_TARGET_SIZE=32
     .else
     CFLAGS+= -DBFD_DEFAULT_TARGET_SIZE=64
    diff --git a/gnu/usr.bin/binutils/gdb/Makefile.alpha b/gnu/usr.bin/binutils/gdb/Makefile.alpha
    deleted file mode 100644
    index e05dd278a82a..000000000000
    --- a/gnu/usr.bin/binutils/gdb/Makefile.alpha
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -# $FreeBSD$
    -
    -XSRCS+=	alphabsd-nat.c alphafbsd-tdep.c alpha-tdep.c \
    -	core-regset.c
    -CFLAGS+= -DDEFAULT_BFD_VEC=bfd_elf64_alpha_freebsd_vec
    diff --git a/gnu/usr.bin/binutils/ld/Makefile.alpha b/gnu/usr.bin/binutils/ld/Makefile.alpha
    deleted file mode 100644
    index 06a14bd00bfd..000000000000
    --- a/gnu/usr.bin/binutils/ld/Makefile.alpha
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -# $FreeBSD$
    -
    -NATIVE_EMULATION= elf64alpha_fbsd
    -
    -EMS+=		elf64alpha alpha
    -.for ext in ${ELF_SCR_EXT}
    -LDSCRIPTS+=	elf64alpha.${ext}
    -.endfor
    -LDSCRIPTS+=	alpha.x alpha.xbn alpha.xn alpha.xr alpha.xu
    -
    -SRCS+=	e${NATIVE_EMULATION}.c eelf64alpha.c ealpha.c
    -CLEANFILES+=	e${NATIVE_EMULATION}.c eelf64alpha.c ealpha.c
    -
    -e${NATIVE_EMULATION}.c:	emulparams/${NATIVE_EMULATION}.sh emultempl/elf32.em \
    -    scripttempl/elf.sc genscripts.sh stringify.sed
    -	sh ${.CURDIR}/genscripts.sh ${SRCDIR}/ld ${LIBSERACHPATH} \
    -	    ${TOOLS_PREFIX}/usr \
    -	    ${HOST} ${TARGET_TUPLE} ${TARGET_TUPLE} \
    -	    ${NATIVE_EMULATION} "" no ${NATIVE_EMULATION} ${TARGET_TUPLE}
    -
    -eelf64alpha.c: emulparams/elf64alpha.sh emultempl/elf32.em \
    -    scripttempl/elf.sc genscripts.sh stringify.sed
    -	sh ${.CURDIR}/genscripts.sh ${SRCDIR}/ld ${LIBSERACHPATH} \
    -	    ${TOOLS_PREFIX}/usr \
    -	    ${HOST} ${TARGET_TUPLE} ${TARGET_TUPLE} \
    -	    ${NATIVE_EMULATION} "" no elf64alpha ${TARGET_TUPLE}
    -
    -ealpha.c: emulparams/alpha.sh emultempl/generic.em scripttempl/alpha.sc \
    -    genscripts.sh stringify.sed
    -	sh ${.CURDIR}/genscripts.sh ${SRCDIR}/ld ${LIBSERACHPATH} \
    -	    ${TOOLS_PREFIX}/usr \
    -	    ${HOST} ${TARGET_TUPLE} ${TARGET_TUPLE} \
    -	    ${NATIVE_EMULATION} "" no alpha ${TARGET_TUPLE}
    diff --git a/gnu/usr.bin/binutils/ld/Makefile.mips b/gnu/usr.bin/binutils/ld/Makefile.mips
    index cf58c706818c..d1e25ef89ca9 100644
    --- a/gnu/usr.bin/binutils/ld/Makefile.mips
    +++ b/gnu/usr.bin/binutils/ld/Makefile.mips
    @@ -10,15 +10,23 @@ NATIVE_EMULATION=elf${_sz}btsmip_fbsd
     NATIVE_EMULATION=elf${_sz}ltsmip_fbsd
     .endif
     
    -SRCS+=	e${NATIVE_EMULATION}.c 
    -CLEANFILES+=	e${NATIVE_EMULATION}.c
    -
    +MIPS_ABIS=elf32btsmip_fbsd elf32ltsmip_fbsd elf64btsmip_fbsd elf64ltsmip_fbsd \
    +    elf32btsmipn32_fbsd elf32ltsmipn32_fbsd
    +.for abi in ${MIPS_ABIS}
    +#.if (${abi} != ${NATIVE_EMULATION})
    +EMS+= ${abi}
    +#.endif
    +.for ext in ${ELF_SCR_EXT}
    +LDSCRIPTS+= ${abi}.${ext}
    +.endfor
    +SRCS+=	e${abi}.c 
    +CLEANFILES+=	e${abi}.c
     # nb: elf32 handles both elf32 and elf64 targets
    -e${NATIVE_EMULATION}.c:	${.CURDIR}/${NATIVE_EMULATION}.sh emultempl/elf32.em \
    +e${abi}.c:	${.CURDIR}/${abi}.sh emultempl/elf32.em \
         scripttempl/elf.sc genscripts.sh stringify.sed
     	sh ${.CURDIR}/genscripts.sh ${SRCDIR}/ld ${LIBSERACHPATH} \
     	    ${TOOLS_PREFIX}/usr \
     	    ${HOST} ${TARGET_TUPLE} ${TARGET_TUPLE} \
    -	    ${NATIVE_EMULATION} ""  no ${NATIVE_EMULATION} ${TARGET_TUPLE} \
    -	    ${.CURDIR}/${NATIVE_EMULATION}.sh
    -
    +	    ${abi} ""  no ${abi} ${TARGET_TUPLE} \
    +	    ${.CURDIR}/${abi}.sh
    +.endfor
    diff --git a/gnu/usr.bin/binutils/ld/elf32btsmipn32_fbsd.sh b/gnu/usr.bin/binutils/ld/elf32btsmipn32_fbsd.sh
    new file mode 100755
    index 000000000000..ef5afbcdf4a6
    --- /dev/null
    +++ b/gnu/usr.bin/binutils/ld/elf32btsmipn32_fbsd.sh
    @@ -0,0 +1,4 @@
    +# $FreeBSD$
    +. ${srcdir}/emulparams/elf32btsmip.sh
    +. ${srcdir}/emulparams/elf_fbsd.sh
    +GENERATE_PIE_SCRIPT=yes
    diff --git a/gnu/usr.bin/binutils/ld/elf32ltsmipn32_fbsd.sh b/gnu/usr.bin/binutils/ld/elf32ltsmipn32_fbsd.sh
    new file mode 100755
    index 000000000000..89c13d8bd056
    --- /dev/null
    +++ b/gnu/usr.bin/binutils/ld/elf32ltsmipn32_fbsd.sh
    @@ -0,0 +1,4 @@
    +# $FreeBSD$
    +. ${srcdir}/emulparams/elf32ltsmip.sh
    +. ${srcdir}/emulparams/elf_fbsd.sh
    +GENERATE_PIE_SCRIPT=yes
    diff --git a/gnu/usr.bin/binutils/ld/genscripts.sh b/gnu/usr.bin/binutils/ld/genscripts.sh
    index 20d1022a46fd..6f8da9f7f2cb 100755
    --- a/gnu/usr.bin/binutils/ld/genscripts.sh
    +++ b/gnu/usr.bin/binutils/ld/genscripts.sh
    @@ -50,6 +50,7 @@ fi
     if test -d ldscripts; then
       true
     else
    +  rm -f ldscripts
       mkdir ldscripts
     fi
     
    diff --git a/gnu/usr.bin/binutils/libbfd/Makefile b/gnu/usr.bin/binutils/libbfd/Makefile
    index c90281ad0c59..3bd512c40a84 100644
    --- a/gnu/usr.bin/binutils/libbfd/Makefile
    +++ b/gnu/usr.bin/binutils/libbfd/Makefile
    @@ -11,8 +11,7 @@ SRCS+=	archive.c archive64.c archures.c bfd.c bfdwin.c binary.c cache.c \
     	section.c srec.c stab-syms.c stabs.c syms.c targets.c tekhex.c \
     	targmatch.h dwarf1.c dwarf2.c config.h bfdver.h bfdio.c simple.c
     WARNS?=	0
    -.if (${TARGET_ARCH} == "alpha" || ${TARGET_ARCH} == "ia64" || \
    -    ${TARGET_ARCH} == "sparc64")
    +.if (${TARGET_ARCH} == "ia64" || ${TARGET_ARCH} == "sparc64")
     WARNS?=	2
     .endif
     CFLAGS+= -D_GNU_SOURCE
    diff --git a/gnu/usr.bin/binutils/libbfd/Makefile.alpha b/gnu/usr.bin/binutils/libbfd/Makefile.alpha
    deleted file mode 100644
    index 5d413fa78f62..000000000000
    --- a/gnu/usr.bin/binutils/libbfd/Makefile.alpha
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -# $FreeBSD$
    -
    -DEFAULT_VECTOR=	bfd_elf64_alpha_freebsd_vec
    -
    -SRCS+=	coff-alpha.c \
    -	cpu-alpha.c \
    -	ecoff.c \
    -	ecofflink.c \
    -	elf64.c \
    -	elf64-alpha.c \
    -	elf64-target.h \
    -	elflink.c
    -
    -VECS=	${DEFAULT_VECTOR} \
    -	bfd_elf64_alpha_vec \
    -	ecoffalpha_little_vec
    diff --git a/gnu/usr.bin/binutils/libopcodes/Makefile.alpha b/gnu/usr.bin/binutils/libopcodes/Makefile.alpha
    deleted file mode 100644
    index 03d911dbd73b..000000000000
    --- a/gnu/usr.bin/binutils/libopcodes/Makefile.alpha
    +++ /dev/null
    @@ -1,4 +0,0 @@
    -# $FreeBSD$
    -
    -SRCS+=	alpha-dis.c alpha-opc.c
    -CFLAGS+= -DARCH_alpha
    diff --git a/gnu/usr.bin/cc/Makefile.tgt b/gnu/usr.bin/cc/Makefile.tgt
    index dc6cc81f39a1..3cb9678a0025 100644
    --- a/gnu/usr.bin/cc/Makefile.tgt
    +++ b/gnu/usr.bin/cc/Makefile.tgt
    @@ -15,9 +15,6 @@ GCC_CPU=	${TARGET_ARCH}
     .if ${TARGET_ARCH} == "ia64"
     TARGET_CPU_DEFAULT= MASK_GNU_AS|MASK_GNU_LD
     .endif
    -.if ${TARGET_ARCH} == "mips"
    -TARGET_CPU_DEFAULT= 16
    -.endif
     .if ${TARGET_ARCH} == "sparc64"
     TARGET_CPU_DEFAULT= TARGET_CPU_ultrasparc
     .endif
    diff --git a/gnu/usr.bin/dc/Makefile b/gnu/usr.bin/dc/Makefile
    deleted file mode 100644
    index 12de718b8f8f..000000000000
    --- a/gnu/usr.bin/dc/Makefile
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -# $FreeBSD$
    -
    -BCDIR=	${.CURDIR}/../../../contrib/bc
    -
    -.PATH:	${BCDIR}/dc ${BCDIR}/lib ${BCDIR}/doc
    -
    -PROG=	dc
    -SRCS=	array.c dc.c eval.c misc.c numeric.c stack.c string.c \
    -	number.c
    -CFLAGS+=-I${.CURDIR}/../bc -I${BCDIR}/h -DHAVE_CONFIG_H
    -DPADD=	${LIBM}
    -LDADD=	-lm
    -SUBDIR=	doc
    -
    -.include 
    diff --git a/gnu/usr.bin/dc/doc/Makefile b/gnu/usr.bin/dc/doc/Makefile
    deleted file mode 100644
    index 2b3d553efb8a..000000000000
    --- a/gnu/usr.bin/dc/doc/Makefile
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -# Makefile copyright Andreas Klemm  1998
    -#
    -# $FreeBSD$
    -
    -.PATH:	${.CURDIR}/../../../../contrib/bc/doc
    -
    -INFO = dc
    -INFOSECTION= "System Utilities"
    -INFOENTRY_dc= "* DC: (dc).			The GNU Desktop Calculator."
    -
    -.include 
    diff --git a/gnu/usr.bin/diff/Makefile b/gnu/usr.bin/diff/Makefile
    index 25d439f83e59..ba5ab653834e 100644
    --- a/gnu/usr.bin/diff/Makefile
    +++ b/gnu/usr.bin/diff/Makefile
    @@ -29,7 +29,7 @@ LDADD=	-lgnuregex
     
     .for f in diff.c context.c
     ${f}: ${DIFFSRC}/${f} ${.CURDIR}/${f}.diff
    -	patch -s -b .orig -o ${.TARGET} < ${.CURDIR}/${f}.diff ${DIFFSRC}/${f}
    +	patch -s -o ${.TARGET} < ${.CURDIR}/${f}.diff ${DIFFSRC}/${f}
     CLEANFILES+= ${f}
     .endfor
     
    diff --git a/gnu/usr.bin/diff3/Makefile b/gnu/usr.bin/diff3/Makefile
    index 9fbb5dba6150..6e9f8670d193 100644
    --- a/gnu/usr.bin/diff3/Makefile
    +++ b/gnu/usr.bin/diff3/Makefile
    @@ -20,7 +20,7 @@ CFLAGS+=-DDEFAULT_DIFF_PROGRAM=\"/usr/bin/diff\"
     
     .for f in diff3.c
     ${f}: ${DIFFSRC}/${f} ${.CURDIR}/${f}.diff
    -	patch -s -b .orig -o ${.TARGET} < ${.CURDIR}/${f}.diff ${DIFFSRC}/${f}
    +	patch -s -o ${.TARGET} < ${.CURDIR}/${f}.diff ${DIFFSRC}/${f}
     CLEANFILES+= ${f}
     .endfor
     
    diff --git a/gnu/usr.bin/dtc/Makefile b/gnu/usr.bin/dtc/Makefile
    new file mode 100644
    index 000000000000..3bab94e01f21
    --- /dev/null
    +++ b/gnu/usr.bin/dtc/Makefile
    @@ -0,0 +1,51 @@
    +# $FreeBSD$
    +
    +.include 
    +
    +DTCDIR=	${.CURDIR}/../../../contrib/dtc
    +LIBFDTDIR= ${.CURDIR}/../../../sys/contrib/libfdt
    +.PATH: ${DTCDIR} ${LIBFDTDIR} ${DTCDIR}/tests
    +
    +PROG=	dtc
    +
    +SRCS=	dtc.c checks.c fstree.c livetree.c treesource.c data.c \
    +	flattree.c srcpos.c util.c \
    +	fdt.c fdt_ro.c fdt_rw.c fdt_strerror.c \
    +	fdt_sw.c fdt_wip.c $(DTCDIR)/version_gen.h
    +
    +CFLAGS = -Wall -g -Os -fPIC -Wpointer-arith -Wcast-qual
    +CFLAGS+= -I. -I${.CURDIR} -I${DTCDIR} -I${LIBFDTDIR}
    +
    +VERSIONMAJ!= awk '/^VERSION =/ { print $$3 }' $(DTCDIR)/Makefile
    +VERSIONMIN!= awk '/^PATCHLEVEL =/ { print $$3 }' $(DTCDIR)/Makefile
    +VERSIONSUB!= awk '/^SUBLEVEL =/ { print $$3 }' $(DTCDIR)/Makefile
    +VERSIONEXTRA!= $(DTCDIR)/scripts/setlocalversion
    +
    +DTCVERSION:=	${VERSIONMAJ}.${VERSIONMIN}.${VERSIONSUB}${VERSIONEXTRA}
    +DTCVERSIONFILE:=	$(DTCDIR)/version_gen.h
    +
    +MAN=
    +
    +BISON=	yacc
    +LEX=	lex
    +
    +OBJS+= dtc-parser.tab.o dtc-lexer.lex.o
    +
    +CLEANFILES+= dtc-parser.tab.o dtc-lexer.lex.o dtc-parser.tab.c \
    +		dtc-parser.tab.h dtc-lexer.lex.c ${DTCVERSIONFILE}
    +
    +$(DTCVERSIONFILE):
    +	@echo '#define DTC_VERSION "DTC ${DTCVERSION}"' > ${DTCVERSIONFILE}
    +
    +dtc-parser.tab.o:	dtc-parser.tab.c dtc-parser.tab.h
    +dtc-lexer.lex.o:	dtc-lexer.lex.c dtc-parser.tab.h
    +
    +dtc-parser.tab.c:	dtc-parser.y
    +	$(BISON) -o$@ -d $(DTCDIR)/dtc-parser.y
    +
    +dtc-parser.tab.h:	dtc-parser.tab.c
    +
    +dtc-lexer.lex.c: dtc-lexer.l
    +	$(LEX) -o$@ $(DTCDIR)/dtc-lexer.l
    +
    +.include 
    diff --git a/gnu/usr.bin/gdb/Makefile b/gnu/usr.bin/gdb/Makefile
    index 4c10759a6b17..81a1d6c17ccd 100644
    --- a/gnu/usr.bin/gdb/Makefile
    +++ b/gnu/usr.bin/gdb/Makefile
    @@ -2,7 +2,7 @@
     
     SUBDIR=	doc libgdb gdb gdbtui kgdb
     
    -.if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "arm" || ${MACHINE_ARCH} == "powerpc"
    +.if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "arm" || ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "powerpc"
     SUBDIR+=gdbserver
     .endif
     
    diff --git a/gnu/usr.bin/gdb/arch/ia64/Makefile b/gnu/usr.bin/gdb/arch/ia64/Makefile
    index 5462cc2b94c3..2fe489999cd5 100644
    --- a/gnu/usr.bin/gdb/arch/ia64/Makefile
    +++ b/gnu/usr.bin/gdb/arch/ia64/Makefile
    @@ -1,7 +1,7 @@
     # $FreeBSD$
     
     .if !defined(GDB_CROSS_DEBUGGER)
    -LIBSRCS+= fbsd-proc.c gcore.c
    +LIBSRCS+= fbsd-proc.c fbsd-threads.c gcore.c
     LIBSRCS+= ia64-fbsd-nat.c
     .endif
     LIBSRCS+= solib.c solib-svr4.c
    diff --git a/gnu/usr.bin/gdb/arch/ia64/init.c b/gnu/usr.bin/gdb/arch/ia64/init.c
    index c2cd71f42bb2..ee383e9c96f6 100644
    --- a/gnu/usr.bin/gdb/arch/ia64/init.c
    +++ b/gnu/usr.bin/gdb/arch/ia64/init.c
    @@ -15,6 +15,7 @@ extern initialize_file_ftype _initialize_ser_pipe;
     extern initialize_file_ftype _initialize_ser_tcp;
     extern initialize_file_ftype _initialize_fbsd_proc;
     extern initialize_file_ftype _initialize_gcore;
    +extern initialize_file_ftype _initialize_thread_db;
     extern initialize_file_ftype _initialize_ia64_fbsd_nat;
     extern initialize_file_ftype _initialize_kernel_u_addr;
     extern initialize_file_ftype _initialize_infptrace;
    @@ -127,6 +128,7 @@ initialize_all_files (void)
     #ifndef CROSS_DEBUGGER
       _initialize_fbsd_proc ();
       _initialize_gcore ();
    +  _initialize_thread_db ();
       _initialize_ia64_fbsd_nat ();
       _initialize_kernel_u_addr ();
       _initialize_infptrace ();
    diff --git a/gnu/usr.bin/gdb/arch/mips/Makefile b/gnu/usr.bin/gdb/arch/mips/Makefile
    index ff05421faecd..54180d957151 100644
    --- a/gnu/usr.bin/gdb/arch/mips/Makefile
    +++ b/gnu/usr.bin/gdb/arch/mips/Makefile
    @@ -1,10 +1,10 @@
     # $FreeBSD$
     
     .if !defined(GDB_CROSS_DEBUGGER)
    -LIBSRCS+= mips-nat.c mips-nat.c mipsfbsd-nat.c
    +LIBSRCS+= mipsfbsd-nat.c
     .endif
     LIBSRCS+= solib.c solib-svr4.c
    -LIBSRCS+= mips-tdep.c mipsfbsd-tdep.c
    +LIBSRCS+= mips-tdep.c mipsfbsd-tdep.c fbsd-proc.c
     
     nm.h:
     	echo '#include "mips/nm-fbsd.h"' > ${.TARGET}
    diff --git a/gnu/usr.bin/gdb/arch/mips/init.c b/gnu/usr.bin/gdb/arch/mips/init.c
    index 3aa7ec51ee23..27631f2c0458 100644
    --- a/gnu/usr.bin/gdb/arch/mips/init.c
    +++ b/gnu/usr.bin/gdb/arch/mips/init.c
    @@ -123,14 +123,18 @@ initialize_all_files (void)
       _initialize_ser_pipe ();
       _initialize_ser_tcp ();
     #ifndef CROSS_DEBUGGER
    +#if 0
       _initialize_mipsfbsd_nat ();
       _initialize_mips_nat ();
    +#endif
       _initialize_kernel_u_addr ();
       _initialize_infptrace ();
       _initialize_inftarg ();
       _initialize_solib ();
       _initialize_svr4_solib ();
    +#if 0
       _initialize_svr4_lm ();
    +#endif
     #endif
       _initialize_remote ();
       _initialize_dcache ();
    diff --git a/gnu/usr.bin/gdb/gdbserver/Makefile b/gnu/usr.bin/gdb/gdbserver/Makefile
    index 9f84f6f550d8..390ef32692b6 100644
    --- a/gnu/usr.bin/gdb/gdbserver/Makefile
    +++ b/gnu/usr.bin/gdb/gdbserver/Makefile
    @@ -14,14 +14,18 @@ SRCS=	inferiors.c mem-break.c regcache.c remote-utils.c	\
     	server.c signals.c target.c utils.c
     SRCS+=	fbsd-low.c
     
    -.if ${MACHINE_ARCH} == "i386"
    -SRCS+= fbsd-i386-low.c i387-fp.c reg-i386.c
    +.if ${MACHINE_ARCH} == "amd64"
    +SRCS+= fbsd-amd64-low.c i387-fp.c reg-x86-64.c
     .endif
     
     .if ${MACHINE_ARCH} == "arm"
     SRCS+= fbsd-arm-low.c reg-arm.c
     .endif
     
    +.if ${MACHINE_ARCH} == "i386"
    +SRCS+= fbsd-i386-low.c i387-fp.c reg-i386.c
    +.endif
    +
     .if ${MACHINE_ARCH} == "powerpc"
     SRCS+= fbsd-ppc-low.c reg-ppc.c
     .endif
    diff --git a/gnu/usr.bin/gdb/gdbserver/fbsd-amd64-low.c b/gnu/usr.bin/gdb/gdbserver/fbsd-amd64-low.c
    new file mode 100644
    index 000000000000..82a8c93f3dfb
    --- /dev/null
    +++ b/gnu/usr.bin/gdb/gdbserver/fbsd-amd64-low.c
    @@ -0,0 +1,213 @@
    +/* GNU/FreeBSD/amd64 specific low level interface, for the remote server for GDB.
    +   Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002
    +   Free Software Foundation, Inc.
    +
    +   This file is part of GDB.
    +
    +   This program is free software; you can redistribute it and/or modify
    +   it under the terms of the GNU General Public License as published by
    +   the Free Software Foundation; either version 2 of the License, or
    +   (at your option) any later version.
    +
    +   This program is distributed in the hope that it will be useful,
    +   but WITHOUT ANY WARRANTY; without even the implied warranty of
    +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +   GNU General Public License for more details.
    +
    +   You should have received a copy of the GNU General Public License
    +   along with this program; if not, write to the Free Software
    +   Foundation, Inc., 59 Temple Place - Suite 330,
    +   Boston, MA 02111-1307, USA.  */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include "server.h"
    +#include "fbsd-low.h"
    +#include "i387-fp.h"
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +/* Mapping between the general-purpose registers in `struct user'
    +   format and GDB's register array layout.  */
    +static int amd64_regmap[] = {
    +	offsetof(struct reg, r_rax),
    +	offsetof(struct reg, r_rbx),
    +	offsetof(struct reg, r_rcx),
    +	offsetof(struct reg, r_rdx),
    +	offsetof(struct reg, r_rsi),
    +	offsetof(struct reg, r_rdi),
    +	offsetof(struct reg, r_rbp),
    +	offsetof(struct reg, r_rsp),
    +	offsetof(struct reg, r_r8),
    +	offsetof(struct reg, r_r9),
    +	offsetof(struct reg, r_r10),
    +	offsetof(struct reg, r_r11),
    +	offsetof(struct reg, r_r12),
    +	offsetof(struct reg, r_r13),
    +	offsetof(struct reg, r_r14),
    +	offsetof(struct reg, r_r15),
    +	offsetof(struct reg, r_rip),
    +	offsetof(struct reg, r_rflags),	/* XXX 64-bit */
    +	offsetof(struct reg, r_cs),
    +	offsetof(struct reg, r_ss),
    +	offsetof(struct reg, r_ds),
    +	offsetof(struct reg, r_es),
    +	offsetof(struct reg, r_fs),
    +	offsetof(struct reg, r_gs),
    +};
    +#define	AMD64_NUM_REGS	(sizeof(amd64_regmap) / sizeof(amd64_regmap[0]))
    +
    +static const char amd64_breakpoint[] = { 0xCC };
    +#define	AMD64_BP_LEN	1
    +
    +extern int debug_threads;
    +
    +static int
    +amd64_cannot_store_register(int regno)
    +{
    +
    +	return (regno >= AMD64_NUM_REGS);
    +}
    +
    +static int
    +amd64_cannot_fetch_register(int regno)
    +{
    +
    +	return (regno >= AMD64_NUM_REGS);
    +}
    +
    +static void
    +amd64_fill_gregset(void *buf)
    +{
    +	int i;
    +
    +	for (i = 0; i < AMD64_NUM_REGS; i++)
    +		collect_register(i, ((char *)buf) + amd64_regmap[i]);
    +}
    +
    +static void
    +amd64_store_gregset(const void *buf)
    +{
    +	int i;
    +
    +	for (i = 0; i < AMD64_NUM_REGS; i++)
    +		supply_register(i, ((char *)buf) + amd64_regmap[i]);
    +}
    +
    +static void
    +amd64_fill_fpregset(void *buf)
    +{
    +
    +	i387_cache_to_fsave(buf);
    +}
    +
    +static void
    +amd64_store_fpregset(const void *buf)
    +{
    +
    +	i387_fsave_to_cache(buf);
    +}
    +
    +static void
    +amd64_fill_fpxregset(void *buf)
    +{  
    +
    +	i387_cache_to_fxsave(buf);
    +}
    +
    +static void
    +amd64_store_fpxregset(const void *buf)
    +{
    +
    +	i387_fxsave_to_cache(buf);
    +}
    +
    +
    +struct regset_info target_regsets[] = {
    +	{
    +		PT_GETREGS,
    +		PT_SETREGS,
    +		sizeof(struct reg),
    +		GENERAL_REGS,
    +		amd64_fill_gregset,
    +		amd64_store_gregset,
    +	},
    +#ifdef HAVE_PTRACE_GETFPXREGS
    +	{
    +		PTRACE_GETFPXREGS,
    +		PTRACE_SETFPXREGS,
    +		sizeof(elf_fpxregset_t),
    +		EXTENDED_REGS,
    +		amd64_fill_fpxregset,
    +		amd64_store_fpxregset,
    +	},
    +#endif
    +	{
    +		PT_GETFPREGS,
    +		PT_SETFPREGS,
    +		sizeof(struct fpreg),
    +		FP_REGS,
    +		amd64_fill_fpregset,
    +		amd64_store_fpregset,
    +	},
    +	{
    +		0,
    +		0,
    +		-1,
    +		-1,
    +		NULL,
    +		NULL,
    +	}
    +};
    +
    +static CORE_ADDR
    +amd64_get_pc(void)
    +{
    +	unsigned long pc;
    +
    +	collect_register_by_name("rip", &pc);
    +
    +	if (debug_threads)
    +		fprintf(stderr, "stop pc (before any decrement) is %016lx\n", pc);
    +
    +	return (pc);
    +}
    +
    +static void
    +amd64_set_pc(CORE_ADDR newpc)
    +{
    +
    +	if (debug_threads)
    +		fprintf(stderr, "set pc to %016lx\n", (long)newpc);
    +	supply_register_by_name("rip", &newpc);
    +}
    +
    +static int
    +amd64_breakpoint_at(CORE_ADDR pc)
    +{
    +	unsigned char c;
    +
    +	read_inferior_memory(pc, &c, 1);
    +	if (c == 0xCC)
    +		return (1);
    +
    +	return (0);
    +}
    +
    +struct fbsd_target_ops the_low_target = {
    +	AMD64_NUM_REGS,
    +	amd64_regmap,
    +	amd64_cannot_fetch_register,
    +	amd64_cannot_store_register,
    +	amd64_get_pc,
    +	amd64_set_pc,
    +	amd64_breakpoint,
    +	AMD64_BP_LEN,
    +	NULL,
    +	1,
    +	amd64_breakpoint_at,
    +};
    diff --git a/gnu/usr.bin/gdb/gdbserver/reg-x86-64.c b/gnu/usr.bin/gdb/gdbserver/reg-x86-64.c
    new file mode 100644
    index 000000000000..7b0534f0d569
    --- /dev/null
    +++ b/gnu/usr.bin/gdb/gdbserver/reg-x86-64.c
    @@ -0,0 +1,99 @@
    +/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
    +
    +/* A register protocol for GDB, the GNU debugger.
    +   Copyright 2001, 2002 Free Software Foundation, Inc.
    +
    +   This file is part of GDB.
    +
    +   This program is free software; you can redistribute it and/or modify
    +   it under the terms of the GNU General Public License as published by
    +   the Free Software Foundation; either version 2 of the License, or
    +   (at your option) any later version.
    +
    +   This program is distributed in the hope that it will be useful,
    +   but WITHOUT ANY WARRANTY; without even the implied warranty of
    +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +   GNU General Public License for more details.
    +
    +   You should have received a copy of the GNU General Public License
    +   along with this program; if not, write to the Free Software
    +   Foundation, Inc., 59 Temple Place - Suite 330,
    +   Boston, MA 02111-1307, USA.  */
    +
    +/* This file was created with the aid of ``regdat.sh'' and ``../../../../contrib/gdb/gdb/regformats/reg-x86-64.dat''.  */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include "regdef.h"
    +#include "regcache.h"
    +
    +struct reg regs_x86_64[] = {
    +  { "rax", 0, 64 },
    +  { "rbx", 64, 64 },
    +  { "rcx", 128, 64 },
    +  { "rdx", 192, 64 },
    +  { "rsi", 256, 64 },
    +  { "rdi", 320, 64 },
    +  { "rbp", 384, 64 },
    +  { "rsp", 448, 64 },
    +  { "r8", 512, 64 },
    +  { "r9", 576, 64 },
    +  { "r10", 640, 64 },
    +  { "r11", 704, 64 },
    +  { "r12", 768, 64 },
    +  { "r13", 832, 64 },
    +  { "r14", 896, 64 },
    +  { "r15", 960, 64 },
    +  { "rip", 1024, 64 },
    +  { "eflags", 1088, 32 },
    +  { "cs", 1120, 32 },
    +  { "ss", 1152, 32 },
    +  { "ds", 1184, 32 },
    +  { "es", 1216, 32 },
    +  { "fs", 1248, 32 },
    +  { "gs", 1280, 32 },
    +  { "st0", 1312, 80 },
    +  { "st1", 1392, 80 },
    +  { "st2", 1472, 80 },
    +  { "st3", 1552, 80 },
    +  { "st4", 1632, 80 },
    +  { "st5", 1712, 80 },
    +  { "st6", 1792, 80 },
    +  { "st7", 1872, 80 },
    +  { "fctrl", 1952, 32 },
    +  { "fstat", 1984, 32 },
    +  { "ftag", 2016, 32 },
    +  { "fiseg", 2048, 32 },
    +  { "fioff", 2080, 32 },
    +  { "foseg", 2112, 32 },
    +  { "fooff", 2144, 32 },
    +  { "fop", 2176, 32 },
    +  { "xmm0", 2208, 128 },
    +  { "xmm1", 2336, 128 },
    +  { "xmm2", 2464, 128 },
    +  { "xmm3", 2592, 128 },
    +  { "xmm4", 2720, 128 },
    +  { "xmm5", 2848, 128 },
    +  { "xmm6", 2976, 128 },
    +  { "xmm7", 3104, 128 },
    +  { "xmm8", 3232, 128 },
    +  { "xmm9", 3360, 128 },
    +  { "xmm10", 3488, 128 },
    +  { "xmm11", 3616, 128 },
    +  { "xmm12", 3744, 128 },
    +  { "xmm13", 3872, 128 },
    +  { "xmm14", 4000, 128 },
    +  { "xmm15", 4128, 128 },
    +  { "mxcsr", 4256, 32 },
    +};
    +
    +const char *expedite_regs_x86_64[] = { "rbp", "rsp", "rip", 0 };
    +
    +void
    +init_registers ()
    +{
    +    set_register_cache (regs_x86_64,
    +			sizeof (regs_x86_64) / sizeof (regs_x86_64[0]));
    +    gdbserver_expedite_regs = expedite_regs_x86_64;
    +}
    diff --git a/gnu/usr.bin/gdb/kgdb/kthr.c b/gnu/usr.bin/gdb/kgdb/kthr.c
    index 7e5b1c00665e..1ab66eb61f53 100644
    --- a/gnu/usr.bin/gdb/kgdb/kthr.c
    +++ b/gnu/usr.bin/gdb/kgdb/kthr.c
    @@ -58,6 +58,7 @@ kgdb_lookup(const char *sym)
     {
     	struct nlist nl[2];
     
    +	nl[0].n_type = N_UNDF;
     	nl[0].n_name = (char *)(uintptr_t)sym;
     	nl[1].n_name = NULL;
     	if (kvm_nlist(kvm, nl) != 0)
    diff --git a/gnu/usr.bin/gdb/kgdb/trgt_mips.c b/gnu/usr.bin/gdb/kgdb/trgt_mips.c
    index 92d6f23ad6e7..97822223d076 100644
    --- a/gnu/usr.bin/gdb/kgdb/trgt_mips.c
    +++ b/gnu/usr.bin/gdb/kgdb/trgt_mips.c
    @@ -61,18 +61,17 @@ kgdb_trgt_fetch_registers(int regno __unused)
     		warnx("kvm_read: %s", kvm_geterr(kvm));
     		memset(&pcb, 0, sizeof(pcb));
     	}
    -	supply_register(MIPS_S0_REGNUM, (char *)&pcb.pcb_context.val[0]);
    -	supply_register(MIPS_S1_REGNUM, (char *)&pcb.pcb_context.val[1]);
    -	supply_register(MIPS_S2_REGNUM, (char *)&pcb.pcb_context.val[2]);
    -	supply_register(MIPS_S3_REGNUM, (char *)&pcb.pcb_context.val[3]);
    -	supply_register(MIPS_S4_REGNUM, (char *)&pcb.pcb_context.val[4]);
    -	supply_register(MIPS_S5_REGNUM, (char *)&pcb.pcb_context.val[5]);
    -	supply_register(MIPS_S6_REGNUM, (char *)&pcb.pcb_context.val[6]);
    -	supply_register(MIPS_S7_REGNUM, (char *)&pcb.pcb_context.val[7]);
    -	supply_register(MIPS_SP_REGNUM, (char *)&pcb.pcb_context.val[8]);
    -	supply_register(MIPS_SP_REGNUM, (char *)&pcb.pcb_context.val[8]);
    -	supply_register(MIPS_FP_REGNUM, (char *)&pcb.pcb_context.val[9]);
    -	supply_register(MIPS_RA_REGNUM, (char *)&pcb.pcb_context.val[10]);
    +	supply_register(MIPS_S0_REGNUM, (char *)&pcb.pcb_context[0]);
    +	supply_register(MIPS_S1_REGNUM, (char *)&pcb.pcb_context[1]);
    +	supply_register(MIPS_S2_REGNUM, (char *)&pcb.pcb_context[2]);
    +	supply_register(MIPS_S3_REGNUM, (char *)&pcb.pcb_context[3]);
    +	supply_register(MIPS_S4_REGNUM, (char *)&pcb.pcb_context[4]);
    +	supply_register(MIPS_S5_REGNUM, (char *)&pcb.pcb_context[5]);
    +	supply_register(MIPS_S6_REGNUM, (char *)&pcb.pcb_context[6]);
    +	supply_register(MIPS_S7_REGNUM, (char *)&pcb.pcb_context[7]);
    +	supply_register(MIPS_SP_REGNUM, (char *)&pcb.pcb_context[8]);
    +	supply_register(MIPS_FP_REGNUM, (char *)&pcb.pcb_context[9]);
    +	supply_register(MIPS_RA_REGNUM, (char *)&pcb.pcb_context[10]);
     }
     
     void
    diff --git a/gnu/usr.bin/groff/tmac/mdoc.local b/gnu/usr.bin/groff/tmac/mdoc.local
    index 1db5aa8b2b27..4c83635c5031 100644
    --- a/gnu/usr.bin/groff/tmac/mdoc.local
    +++ b/gnu/usr.bin/groff/tmac/mdoc.local
    @@ -43,9 +43,11 @@
     .ds doc-str-Lb-libdevstat  Device Statistics Library (libdevstat, \-ldevstat)
     .ds doc-str-Lb-libdisk     Interface to Slice and Partition Labels Library (libdisk, \-ldisk)
     .ds doc-str-Lb-libedit     Line Editor and History Library (libedit, \-ledit)
    +.ds doc-str-Lb-libefi      EFI Runtime Services Library (libefi, \-lefi)
     .ds doc-str-Lb-libelf      ELF Parsing Library (libelf, \-lelf)
     .ds doc-str-Lb-libfetch    File Transfer Library (libfetch, \-lfetch)
     .ds doc-str-Lb-libgeom     Userland API Library for kernel GEOM subsystem (libgeom, \-lgeom)
    +.ds doc-str-Lb-libgpib     General-Purpose Instrument Bus (GPIB) library (libgpib, \-lgpib)
     .ds doc-str-Lb-libipx      IPX Address Conversion Support Library (libipx, \-lipx)
     .ds doc-str-Lb-libjail     Jail Library (libjail, \-ljail)
     .ds doc-str-Lb-libkiconv   Kernel side iconv library (libkiconv, \-lkiconv)
    @@ -60,6 +62,7 @@
     .ds doc-str-Lb-libthr      1:1 Threading Library (libthr, \-lthr)
     .ds doc-str-Lb-libufs      UFS File System Access Library (libufs, \-lufs)
     .ds doc-str-Lb-libugidfw   File System Firewall Interface Library (libugidfw, \-lugidfw)
    +.ds doc-str-Lb-libulog     User Login Record Library (libulog, \-lulog)
     .ds doc-str-Lb-libvgl      Video Graphics Library (libvgl, \-lvgl)
     .
     .\" FreeBSD architectures not found in doc-common
    @@ -69,9 +72,6 @@
     .ds doc-default-operating-system FreeBSD\~9.0
     .
     .\" FreeBSD releases not found in doc-common
    -.ds doc-operating-system-FreeBSD-6.3    6.3
    -.ds doc-operating-system-FreeBSD-6.4    6.4
    -.ds doc-operating-system-FreeBSD-7.1    7.1
     .ds doc-operating-system-FreeBSD-7.2    7.2
     .ds doc-operating-system-FreeBSD-7.3    7.3
     .ds doc-operating-system-FreeBSD-8.0    8.0
    diff --git a/gnu/usr.bin/sdiff/Makefile b/gnu/usr.bin/sdiff/Makefile
    index c40cd4d9d568..efadcf2b8b24 100644
    --- a/gnu/usr.bin/sdiff/Makefile
    +++ b/gnu/usr.bin/sdiff/Makefile
    @@ -21,7 +21,7 @@ CFLAGS+=-DDEFAULT_DIFF_PROGRAM=\"/usr/bin/diff\"
     
     .for f in sdiff.c
     ${f}: ${DIFFSRC}/${f} ${.CURDIR}/${f}.diff
    -	patch -s -b .orig -o ${.TARGET} < ${.CURDIR}/${f}.diff ${DIFFSRC}/${f}
    +	patch -s -o ${.TARGET} < ${.CURDIR}/${f}.diff ${DIFFSRC}/${f}
     CLEANFILES+= ${f}
     .endfor
     
    diff --git a/include/Makefile b/include/Makefile
    index 08ef6a5c768d..c96482781d28 100644
    --- a/include/Makefile
    +++ b/include/Makefile
    @@ -18,20 +18,20 @@ INCS=	a.out.h ar.h assert.h bitstring.h complex.h cpio.h _ctype.h ctype.h \
     	netdb.h nl_types.h nlist.h nss.h nsswitch.h paths.h \
     	printf.h proc_service.h pthread.h \
     	pthread_np.h pwd.h ranlib.h readpassphrase.h regex.h regexp.h \
    -	res_update.h resolv.h runetype.h search.h setjmp.h \
    +	res_update.h resolv.h runetype.h search.h semaphore.h setjmp.h \
     	signal.h spawn.h stab.h \
     	stdbool.h stddef.h stdio.h stdlib.h string.h stringlist.h \
    -	strings.h sysexits.h tar.h tgmath.h \
    +	strings.h sysexits.h tar.h termios.h tgmath.h \
     	time.h timeconv.h timers.h ttyent.h \
    -	ulimit.h unistd.h utime.h utmp.h uuid.h varargs.h vis.h wchar.h \
    -	wctype.h wordexp.h
    +	ulimit.h unistd.h utime.h utmp.h utmpx.h uuid.h varargs.h vis.h \
    +	wchar.h wctype.h wordexp.h
     
     MHDRS=	float.h floatingpoint.h stdarg.h
     
    -PHDRS=	sched.h semaphore.h _semaphore.h
    +PHDRS=	sched.h _semaphore.h
     
     LHDRS=	aio.h errno.h fcntl.h linker_set.h poll.h stdint.h syslog.h \
    -	termios.h ucontext.h
    +	ucontext.h
     
     LDIRS=	bsm cam geom net net80211 netatalk netgraph netinet netinet6 \
     	netipsec ${_netipx} netnatm ${_netncp} netsmb \
    @@ -46,7 +46,7 @@ LSUBDIRS=	cam/ata cam/scsi \
     	fs/devfs fs/fdescfs fs/fifofs fs/msdosfs fs/nfs fs/ntfs fs/nullfs \
     	${_fs_nwfs} fs/portalfs fs/procfs fs/smbfs fs/udf fs/unionfs \
     	geom/cache geom/concat geom/eli geom/gate geom/journal geom/label \
    -	geom/mirror geom/multipath geom/nop \
    +	geom/mirror geom/mountver geom/multipath geom/nop \
     	geom/raid3 geom/shsec geom/stripe geom/virstor \
     	netgraph/atm netgraph/netflow \
     	security/audit \
    diff --git a/include/_ctype.h b/include/_ctype.h
    index 0076adc7b624..2bef5870d905 100644
    --- a/include/_ctype.h
    +++ b/include/_ctype.h
    @@ -18,11 +18,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/a.out.h b/include/a.out.h
    index b0bbe4954819..23f80aa79f64 100644
    --- a/include/a.out.h
    +++ b/include/a.out.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/ar.h b/include/ar.h
    index 40b4d74b04c6..aa5fac210289 100644
    --- a/include/ar.h
    +++ b/include/ar.h
    @@ -18,11 +18,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/arpa/ftp.h b/include/arpa/ftp.h
    index 9a3648854017..081c037ecb30 100644
    --- a/include/arpa/ftp.h
    +++ b/include/arpa/ftp.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)ftp.h	8.1 (Berkeley) 6/2/93
    + *
    + * $FreeBSD$
      */
     
     #ifndef _ARPA_FTP_H_
    diff --git a/include/arpa/inet.h b/include/arpa/inet.h
    index 084810692b79..c0695ebbd28d 100644
    --- a/include/arpa/inet.h
    +++ b/include/arpa/inet.h
    @@ -12,11 +12,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - * 	This product includes software developed by the University of
    - * 	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      * 
    diff --git a/include/arpa/nameser.h b/include/arpa/nameser.h
    index ce2f2e062a4c..1f5ce4539f24 100644
    --- a/include/arpa/nameser.h
    +++ b/include/arpa/nameser.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - * 	This product includes software developed by the University of
    - * 	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      * 
    diff --git a/include/arpa/nameser_compat.h b/include/arpa/nameser_compat.h
    index 64d05f828721..161fed355c36 100644
    --- a/include/arpa/nameser_compat.h
    +++ b/include/arpa/nameser_compat.h
    @@ -9,11 +9,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - * 	This product includes software developed by the University of
    - * 	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      * 
    diff --git a/include/arpa/telnet.h b/include/arpa/telnet.h
    index 26f75fb31303..758e9b83451e 100644
    --- a/include/arpa/telnet.h
    +++ b/include/arpa/telnet.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/arpa/tftp.h b/include/arpa/tftp.h
    index eef9d4dc513f..5c2a4c7eeadc 100644
    --- a/include/arpa/tftp.h
    +++ b/include/arpa/tftp.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/assert.h b/include/assert.h
    index 763ab5ce660d..d5cfda603791 100644
    --- a/include/assert.h
    +++ b/include/assert.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/ctype.h b/include/ctype.h
    index 103619c3b612..94bc8ab47372 100644
    --- a/include/ctype.h
    +++ b/include/ctype.h
    @@ -18,11 +18,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/db.h b/include/db.h
    index e845fa8ee64a..4d04db41e8eb 100644
    --- a/include/db.h
    +++ b/include/db.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/dirent.h b/include/dirent.h
    index 63626b59bc72..e3ef1495f77f 100644
    --- a/include/dirent.h
    +++ b/include/dirent.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -93,9 +89,11 @@ typedef	void *	DIR;
     #ifndef _KERNEL
     
     __BEGIN_DECLS
    +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700
    +int	 alphasort(const struct dirent **, const struct dirent **);
    +#endif
     #if __BSD_VISIBLE
     DIR	*__opendir2(const char *, int);
    -int	 alphasort(const void *, const void *);
     int	 getdents(int, char *, int);
     int	 getdirentries(int, char *, int, long *);
     #endif
    @@ -107,9 +105,10 @@ struct dirent *
     int	 readdir_r(DIR *, struct dirent *, struct dirent **);
     #endif
     void	 rewinddir(DIR *);
    -#if __BSD_VISIBLE
    +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700
     int	 scandir(const char *, struct dirent ***,
    -	    int (*)(struct dirent *), int (*)(const void *, const void *));
    +	    int (*)(const struct dirent *), int (*)(const struct dirent **,
    +	    const struct dirent **));
     #endif
     #if __XSI_VISIBLE
     void	 seekdir(DIR *, long);
    diff --git a/include/dlfcn.h b/include/dlfcn.h
    index b1a97386747d..de654f76a31b 100644
    --- a/include/dlfcn.h
    +++ b/include/dlfcn.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/err.h b/include/err.h
    index 675c708f98cb..b6ab2147ef0d 100644
    --- a/include/err.h
    +++ b/include/err.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/fnmatch.h b/include/fnmatch.h
    index f905ff6e3c26..e6403a54ed35 100644
    --- a/include/fnmatch.h
    +++ b/include/fnmatch.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/fstab.h b/include/fstab.h
    index cae9172aed8c..9b80f733cc41 100644
    --- a/include/fstab.h
    +++ b/include/fstab.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/fts.h b/include/fts.h
    index cd3da87b679e..a679ea6876ab 100644
    --- a/include/fts.h
    +++ b/include/fts.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/getopt.h b/include/getopt.h
    index dca3c3d66194..445194128c68 100644
    --- a/include/getopt.h
    +++ b/include/getopt.h
    @@ -16,13 +16,6 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *        This product includes software developed by the NetBSD
    - *        Foundation, Inc. and its contributors.
    - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/include/glob.h b/include/glob.h
    index 1c0605e55998..351b6c46bbb6 100644
    --- a/include/glob.h
    +++ b/include/glob.h
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/grp.h b/include/grp.h
    index 96584deaf72d..2b9f73f763cc 100644
    --- a/include/grp.h
    +++ b/include/grp.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/hesiod.h b/include/hesiod.h
    index 4b5d42f7d302..2c29294cc993 100644
    --- a/include/hesiod.h
    +++ b/include/hesiod.h
    @@ -14,13 +14,6 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *        This product includes software developed by the NetBSD
    - *        Foundation, Inc. and its contributors.
    - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/include/langinfo.h b/include/langinfo.h
    index 59b50f9ce34c..6d6b95f2cc4e 100644
    --- a/include/langinfo.h
    +++ b/include/langinfo.h
    @@ -114,6 +114,20 @@ typedef	__nl_item	nl_item;
     #define	D_MD_ORDER	57	/* month/day order (local extension) */
     #endif
     
    +/* standalone months forms for %OB */
    +#define	ALTMON_1	58
    +#define	ALTMON_2	59
    +#define	ALTMON_3	60
    +#define	ALTMON_4	61
    +#define	ALTMON_5	62
    +#define	ALTMON_6	63
    +#define	ALTMON_7	64
    +#define	ALTMON_8	65
    +#define	ALTMON_9	66
    +#define	ALTMON_10	67
    +#define	ALTMON_11	68
    +#define	ALTMON_12	69
    +
     __BEGIN_DECLS
     char	*nl_langinfo(nl_item);
     __END_DECLS
    diff --git a/include/libgen.h b/include/libgen.h
    index 3639c712b9fa..0d4472f0168e 100644
    --- a/include/libgen.h
    +++ b/include/libgen.h
    @@ -36,6 +36,7 @@
     __BEGIN_DECLS
     
     char	*basename(const char *);
    +char	*basename_r(const char *, char *);
     char	*dirname(const char *);
     #if 0
     char	*regcmp(const char *, ...);
    diff --git a/include/limits.h b/include/limits.h
    index 3f770cc3408e..6a249136731f 100644
    --- a/include/limits.h
    +++ b/include/limits.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/locale.h b/include/locale.h
    index ba702140a4ec..83620f86d381 100644
    --- a/include/locale.h
    +++ b/include/locale.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/memory.h b/include/memory.h
    index cb9c8b5f77a8..fb670d4fe1d4 100644
    --- a/include/memory.h
    +++ b/include/memory.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)memory.h	8.1 (Berkeley) 6/2/93
    + *
    + * $FreeBSD$
      */
     
     #include 
    diff --git a/include/mpool.h b/include/mpool.h
    index c74764d725f3..3f22ab788409 100644
    --- a/include/mpool.h
    +++ b/include/mpool.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/ndbm.h b/include/ndbm.h
    index 1277e70bcf3d..0acb6a657e84 100644
    --- a/include/ndbm.h
    +++ b/include/ndbm.h
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/netdb.h b/include/netdb.h
    index 1c9ef27bacc9..2132044d7c92 100644
    --- a/include/netdb.h
    +++ b/include/netdb.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/nl_types.h b/include/nl_types.h
    index e3865680bbef..c9da68ea9ba3 100644
    --- a/include/nl_types.h
    +++ b/include/nl_types.h
    @@ -15,13 +15,6 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *        This product includes software developed by the NetBSD
    - *        Foundation, Inc. and its contributors.
    - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/include/nlist.h b/include/nlist.h
    index 3dccf9e7b8eb..a4965fd96952 100644
    --- a/include/nlist.h
    +++ b/include/nlist.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/nsswitch.h b/include/nsswitch.h
    index 9069ac11b49e..0ff6cf1de78b 100644
    --- a/include/nsswitch.h
    +++ b/include/nsswitch.h
    @@ -16,13 +16,6 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *        This product includes software developed by the NetBSD
    - *        Foundation, Inc. and its contributors.
    - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/include/paths.h b/include/paths.h
    index a8a68a036dc2..0cbc092b6a9d 100644
    --- a/include/paths.h
    +++ b/include/paths.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -42,7 +38,7 @@
     /* Default search path. */
     #define	_PATH_DEFPATH	"/usr/bin:/bin"
     /* All standard utilities path. */
    -#define	_PATH_STDPATH	"/usr/bin:/bin:/usr/sbin:/sbin:"
    +#define	_PATH_STDPATH	"/usr/bin:/bin:/usr/sbin:/sbin"
     /* Locate system binaries. */
     #define	_PATH_SYSPATH	"/sbin:/usr/sbin"
     
    diff --git a/include/protocols/dumprestore.h b/include/protocols/dumprestore.h
    index b4e6ec9a08ac..d6740a6193af 100644
    --- a/include/protocols/dumprestore.h
    +++ b/include/protocols/dumprestore.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/protocols/routed.h b/include/protocols/routed.h
    index b55b62250788..bf1604549c66 100644
    --- a/include/protocols/routed.h
    +++ b/include/protocols/routed.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgment:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/protocols/rwhod.h b/include/protocols/rwhod.h
    index fbfe2ed7cb04..f63bf76b4893 100644
    --- a/include/protocols/rwhod.h
    +++ b/include/protocols/rwhod.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)rwhod.h	8.1 (Berkeley) 6/2/93
    + *
    + * $FreeBSD$
      */
     
     #ifndef _PROTOCOLS_RWHOD_H_
    diff --git a/include/protocols/talkd.h b/include/protocols/talkd.h
    index 962e47be7e0d..3b2f0de6654e 100644
    --- a/include/protocols/talkd.h
    +++ b/include/protocols/talkd.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)talkd.h	8.1 (Berkeley) 6/2/93
    + *
    + * $FreeBSD$
      */
     
     #ifndef _PROTOCOLS_TALKD_H_
    diff --git a/include/protocols/timed.h b/include/protocols/timed.h
    index faa44e4e49fd..18747be7a111 100644
    --- a/include/protocols/timed.h
    +++ b/include/protocols/timed.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/pwd.h b/include/pwd.h
    index 6906db8b4ba0..0a6dba1d7b90 100644
    --- a/include/pwd.h
    +++ b/include/pwd.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/ranlib.h b/include/ranlib.h
    index c8429190e9ef..dd376b4d8a59 100644
    --- a/include/ranlib.h
    +++ b/include/ranlib.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)ranlib.h	8.1 (Berkeley) 6/2/93
    + *
    + * $FreeBSD$
      */
     
     #ifndef _RANLIB_H_
    diff --git a/include/regex.h b/include/regex.h
    index 3c3c87fde57b..fb9b99c7ad9a 100644
    --- a/include/regex.h
    +++ b/include/regex.h
    @@ -14,11 +14,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/regexp.h b/include/regexp.h
    index 96c2c94db951..3a8d3252f311 100644
    --- a/include/regexp.h
    +++ b/include/regexp.h
    @@ -14,11 +14,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/resolv.h b/include/resolv.h
    index 20f7954ecdb8..f59f4459356b 100644
    --- a/include/resolv.h
    +++ b/include/resolv.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - * 	This product includes software developed by the University of
    - * 	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      * 
    diff --git a/include/runetype.h b/include/runetype.h
    index 1625ef8f4e83..a63d909ea3ca 100644
    --- a/include/runetype.h
    +++ b/include/runetype.h
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/semaphore.h b/include/semaphore.h
    new file mode 100644
    index 000000000000..3531353d0d3a
    --- /dev/null
    +++ b/include/semaphore.h
    @@ -0,0 +1,64 @@
    +/*
    + * Copyright (c) 2010 David Xu 
    + *
    + * 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 unmodified, 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 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$
    + */
    +
    +/* semaphore.h: POSIX 1003.1b semaphores */
    +
    +#ifndef _SEMAPHORE_H_
    +#define _SEMAPHORE_H_
    +
    +#include 
    +#include 
    +#include 
    +
    +struct _sem {
    +	__uint32_t	_magic;
    +	struct _usem	_kern;
    +};
    +
    +typedef	struct _sem	sem_t;
    +
    +#define	SEM_FAILED	((sem_t *)0)
    +#define	SEM_VALUE_MAX	__INT_MAX
    +
    +struct timespec;
    +
    +__BEGIN_DECLS
    +int	 sem_close(sem_t *);
    +int	 sem_destroy(sem_t *);
    +int	 sem_getvalue(sem_t * __restrict, int * __restrict);
    +int	 sem_init(sem_t *, int, unsigned int);
    +sem_t	*sem_open(const char *, int, ...);
    +int	 sem_post(sem_t *);
    +int	 sem_timedwait(sem_t * __restrict, const struct timespec * __restrict);
    +int	 sem_trywait(sem_t *);
    +int	 sem_unlink(const char *);
    +int	 sem_wait(sem_t *);
    +__END_DECLS
    +
    +#endif /* !_SEMAPHORE_H_ */
    diff --git a/include/setjmp.h b/include/setjmp.h
    index 9e25f603be48..49d4ed5e8cef 100644
    --- a/include/setjmp.h
    +++ b/include/setjmp.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/signal.h b/include/signal.h
    index fdb4b3ed6d09..4a4cd1744e41 100644
    --- a/include/signal.h
    +++ b/include/signal.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -99,7 +95,12 @@ int	sigwaitinfo(const sigset_t * __restrict, siginfo_t * __restrict);
     #if __XSI_VISIBLE
     int	killpg(__pid_t, int);
     int	sigaltstack(const stack_t * __restrict, stack_t * __restrict); 
    +int	sighold(int);
    +int	sigignore(int);
     int	sigpause(int);
    +int	sigrelse(int);
    +void	(*sigset(int, void (*)(int)))(int);
    +int	xsi_sigpause(int);
     #endif
     
     #if __XSI_VISIBLE >= 600
    diff --git a/include/stab.h b/include/stab.h
    index 9200f52f3d51..649bb421f8cb 100644
    --- a/include/stab.h
    +++ b/include/stab.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)stab.h	8.1 (Berkeley) 6/2/93
    + *
    + * $FreeBSD$
      */
     
     #ifndef _STAB_H_
    diff --git a/include/stddef.h b/include/stddef.h
    index dd7362129323..ea88214f7761 100644
    --- a/include/stddef.h
    +++ b/include/stddef.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/stdio.h b/include/stdio.h
    index f8af8e2e2941..5ff3d8e1fa98 100644
    --- a/include/stdio.h
    +++ b/include/stdio.h
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/stdlib.h b/include/stdlib.h
    index 265398e6eef4..b8cd1a389f84 100644
    --- a/include/stdlib.h
    +++ b/include/stdlib.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/string.h b/include/string.h
    index bd4ed2ebd951..239a76f5ec1a 100644
    --- a/include/string.h
    +++ b/include/string.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/strings.h b/include/strings.h
    index 078ce1b5f5fb..f2720786f097 100644
    --- a/include/strings.h
    +++ b/include/strings.h
    @@ -46,7 +46,7 @@ void	 bzero(void *, size_t);					/* LEGACY */
     #if __XSI_VISIBLE
     int	 ffs(int) __pure2;
     #endif
    -#ifdef __BSD_VISIBLE
    +#if __BSD_VISIBLE
     int	 ffsl(long) __pure2;
     int	 ffsll(long long) __pure2;
     int	 fls(int) __pure2;
    diff --git a/include/sysexits.h b/include/sysexits.h
    index 464cb11bab2d..e52bb5be95b3 100644
    --- a/include/sysexits.h
    +++ b/include/sysexits.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -31,6 +27,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)sysexits.h	8.1 (Berkeley) 6/2/93
    + *
    + * $FreeBSD$
      */
     
     #ifndef	_SYSEXITS_H_
    diff --git a/include/tar.h b/include/tar.h
    index 764ca01a10c1..f9da49a10d28 100644
    --- a/include/tar.h
    +++ b/include/tar.h
    @@ -13,11 +13,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -34,6 +30,8 @@
      * SUCH DAMAGE.
      *
      *	@(#)tar.h	8.2 (Berkeley) 1/4/94
    + *
    + * $FreeBSD$
      */
     
     #ifndef _TAR_H
    diff --git a/include/termios.h b/include/termios.h
    new file mode 100644
    index 000000000000..92d186105f94
    --- /dev/null
    +++ b/include/termios.h
    @@ -0,0 +1,100 @@
    +/*-
    + * Copyright (c) 1988, 1989, 1993, 1994
    + *	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.
    + * 3. 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.
    + *
    + *	@(#)termios.h	8.3 (Berkeley) 3/28/94
    + * $FreeBSD$
    + */
    +
    +#ifndef _TERMIOS_H_
    +#define	_TERMIOS_H_
    +
    +#include 
    +#include 
    +#include 
    +
    +#ifndef _PID_T_DECLARED
    +typedef	__pid_t		pid_t;
    +#define	_PID_T_DECLARED
    +#endif
    +
    +#ifndef _POSIX_SOURCE
    +#define	OXTABS		TAB3
    +#define	MDMBUF		CCAR_OFLOW
    +#endif 
    +
    +#ifndef _POSIX_SOURCE
    +#define	CCEQ(val, c)	((c) == (val) && (val) != _POSIX_VDISABLE)
    +#endif
    +
    +/*
    + * Commands passed to tcsetattr() for setting the termios structure.
    + */
    +#define	TCSANOW		0		/* make change immediate */
    +#define	TCSADRAIN	1		/* drain output, then change */
    +#define	TCSAFLUSH	2		/* drain output, flush input */
    +#ifndef _POSIX_SOURCE
    +#define	TCSASOFT	0x10		/* flag - don't alter h.w. state */
    +#endif
    +
    +#define	TCIFLUSH	1
    +#define	TCOFLUSH	2
    +#define	TCIOFLUSH	3
    +#define	TCOOFF		1
    +#define	TCOON		2
    +#define	TCIOFF		3
    +#define	TCION		4
    +
    +__BEGIN_DECLS
    +speed_t	cfgetispeed(const struct termios *);
    +speed_t	cfgetospeed(const struct termios *);
    +int	cfsetispeed(struct termios *, speed_t);
    +int	cfsetospeed(struct termios *, speed_t);
    +int	tcgetattr(int, struct termios *);
    +int	tcsetattr(int, int, const struct termios *);
    +int	tcdrain(int);
    +int	tcflow(int, int);
    +int	tcflush(int, int);
    +int	tcsendbreak(int, int);
    +
    +#if __POSIX_VISIBLE >= 200112 || __BSD_VISIBLE
    +pid_t	tcgetsid(int);
    +#endif
    +#if __BSD_VISIBLE
    +int	tcsetsid(int, pid_t);
    +
    +void	cfmakeraw(struct termios *);
    +int	cfsetspeed(struct termios *, speed_t);
    +#endif
    +__END_DECLS
    +
    +#endif /* !_TERMIOS_H_ */
    +
    +#ifndef _POSIX_SOURCE
    +#include 
    +#include 
    +#endif
    diff --git a/include/time.h b/include/time.h
    index d28d9b48b905..add970e5df74 100644
    --- a/include/time.h
    +++ b/include/time.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/timeconv.h b/include/timeconv.h
    index cce937cf7e54..147db1509345 100644
    --- a/include/timeconv.h
    +++ b/include/timeconv.h
    @@ -15,11 +15,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/ttyent.h b/include/ttyent.h
    index 12902d097fcf..815d16844709 100644
    --- a/include/ttyent.h
    +++ b/include/ttyent.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/unistd.h b/include/unistd.h
    index b4b7516bc6ac..d97f9dc017f8 100644
    --- a/include/unistd.h
    +++ b/include/unistd.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    @@ -574,7 +570,6 @@ int	 swapon(const char *);
     int	 swapoff(const char *);
     int	 syscall(int, ...);
     off_t	 __syscall(quad_t, ...);
    -int	 ttyslot(void);
     int	 undelete(const char *);
     int	 unwhiteout(const char *);
     void	*valloc(size_t);			/* obsoleted by malloc() */
    diff --git a/include/utime.h b/include/utime.h
    index 8f803657bc48..619c5db627ba 100644
    --- a/include/utime.h
    +++ b/include/utime.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/utmp.h b/include/utmp.h
    index 1b57bb8d9159..8e1363cc5842 100644
    --- a/include/utmp.h
    +++ b/include/utmp.h
    @@ -1,73 +1,2 @@
    -/*
    - * Copyright (c) 1988, 1993
    - *	The Regents of the University of California.  All rights reserved.
    - * (c) UNIX System Laboratories, Inc.
    - * All or some portions of this file are derived from material licensed
    - * to the University of California by American Telephone and Telegraph
    - * Co. or Unix System Laboratories, Inc. and are reproduced herein with
    - * the permission of UNIX System Laboratories, Inc.
    - *
    - * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 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.
    - *
    - *	@(#)utmp.h	8.2 (Berkeley) 1/21/94
    - * $FreeBSD$
    - */
    -
    -#ifndef	_UTMP_H_
    -#define	_UTMP_H_
    -
    -#define	_PATH_UTMP	"/var/run/utmp"
    -#define	_PATH_WTMP	"/var/log/wtmp"
    -#define	_PATH_LASTLOG	"/var/log/lastlog"
    -
    -/*
    - * XXX: These values are too low, but cannot be changed without breaking
    - * the file format.  Right now pts(4) is limited to 1000 instances,
    - * because /dev/pts/1000 would require UT_LINESIZE to be bigger.
    - * UT_HOSTSIZE is also too small to hold most common hostnames or IPv6
    - * addresses.
    - */
    -#define	UT_NAMESIZE	16	/* see MAXLOGNAME in  */
    -#define	UT_LINESIZE	8
    -#define	UT_HOSTSIZE	16
    -
    -struct lastlog {
    -	int32_t	ll_time;
    -	char	ll_line[UT_LINESIZE];
    -	char	ll_host[UT_HOSTSIZE];
    -};
    -
    -struct utmp {
    -	char	ut_line[UT_LINESIZE];
    -	char	ut_name[UT_NAMESIZE];
    -	char	ut_host[UT_HOSTSIZE];
    -	int32_t	ut_time;
    -};
    -
    -#endif /* !_UTMP_H_ */
    +/* $FreeBSD$ */
    +#error " has been replaced by "
    diff --git a/include/utmpx.h b/include/utmpx.h
    new file mode 100644
    index 000000000000..22707e4d3681
    --- /dev/null
    +++ b/include/utmpx.h
    @@ -0,0 +1,88 @@
    +/*-
    + * Copyright (c) 2010 Ed Schouten 
    + * 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$
    + */
    +
    +#ifndef _UTMPX_H_
    +#define	_UTMPX_H_
    +
    +#include 
    +#include 
    +#include 
    +
    +#ifndef _PID_T_DECLARED
    +typedef	__pid_t		pid_t;
    +#define	_PID_T_DECLARED
    +#endif
    +
    +struct utmpx {
    +	short		ut_type;	/* Type of entry. */
    +	struct timeval	ut_tv;		/* Time entry was made. */
    +	char		ut_id[8];	/* Record identifier. */
    +	pid_t		ut_pid;		/* Process ID. */
    +	char		ut_user[32];	/* User login name. */
    +	char		ut_line[16];	/* Device name. */
    +#if __BSD_VISIBLE
    +	char		ut_host[128];	/* Remote hostname. */
    +#else
    +	char		__ut_host[128];
    +#endif
    +	char		__ut_spare[64];
    +};
    +
    +#define	EMPTY		0	/* No valid user accounting information. */
    +#define	BOOT_TIME	1	/* Time of system boot. */
    +#define	OLD_TIME	2	/* Time when system clock changed. */
    +#define	NEW_TIME	3	/* Time after system clock changed. */
    +#define	USER_PROCESS	4	/* A process. */
    +#define	INIT_PROCESS	5	/* A process spawned by the init process. */
    +#define	LOGIN_PROCESS	6	/* The session leader of a logged-in user. */
    +#define	DEAD_PROCESS	7	/* A session leader who has exited. */
    +#if __BSD_VISIBLE
    +#define	SHUTDOWN_TIME	8	/* Time of system shutdown. */
    +#endif
    +
    +#if __BSD_VISIBLE
    +#define	UTXDB_ACTIVE	0	/* Active login sessions. */
    +#define	UTXDB_LASTLOGIN	1	/* Last login sessions. */
    +#define	UTXDB_LOG	2	/* Log indexed by time. */
    +#endif
    +
    +__BEGIN_DECLS
    +void	endutxent(void);
    +struct utmpx *getutxent(void);
    +struct utmpx *getutxid(const struct utmpx *);
    +struct utmpx *getutxline(const struct utmpx *);
    +struct utmpx *pututxline(const struct utmpx *);
    +void	setutxent(void);
    +
    +#if __BSD_VISIBLE
    +struct utmpx *getutxuser(const char *);
    +int	setutxdb(int, const char *);
    +#endif
    +__END_DECLS
    +
    +#endif /* !_UTMPX_H_ */
    diff --git a/include/vis.h b/include/vis.h
    index 28f9765e78bd..f3889547e973 100644
    --- a/include/vis.h
    +++ b/include/vis.h
    @@ -10,11 +10,7 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *	This product includes software developed by the University of
    - *	California, Berkeley and its contributors.
    - * 4. Neither the name of the University nor the names of its contributors
    + * 3. 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.
      *
    diff --git a/include/wchar.h b/include/wchar.h
    index 9e58f4c2a91c..9b59494415bb 100644
    --- a/include/wchar.h
    +++ b/include/wchar.h
    @@ -41,13 +41,6 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *        This product includes software developed by the NetBSD
    - *        Foundation, Inc. and its contributors.
    - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/kerberos5/lib/libgssapi_krb5/Makefile b/kerberos5/lib/libgssapi_krb5/Makefile
    index b2cbe51f4e2f..6c2f4217b3c7 100644
    --- a/kerberos5/lib/libgssapi_krb5/Makefile
    +++ b/kerberos5/lib/libgssapi_krb5/Makefile
    @@ -2,8 +2,8 @@
     
     LIB=	gssapi_krb5
     LDFLAGS= -Wl,-Bsymbolic
    -LDADD=	-lkrb5 -lhx509 -lcrypto -lroken -lasn1 -lcom_err -lcrypt
    -DPADD=	${LIBKRB5} ${LIBHX509} ${LIBCRYPTO} ${LIBROKEN} ${LIBASN1} \
    +LDADD=	-lgssapi -lkrb5 -lhx509 -lcrypto -lroken -lasn1 -lcom_err -lcrypt
    +DPADD=	${LIBGSSAPI} ${LIBKRB5} ${LIBHX509} ${LIBCRYPTO} ${LIBROKEN} ${LIBASN1} \
     	${LIBCOM_ERR} ${LIBCRYPT}
     
     INCS=	${KRB5DIR}/lib/gssapi/gssapi/gssapi_krb5.h
    diff --git a/kerberos5/lib/libgssapi_spnego/Makefile b/kerberos5/lib/libgssapi_spnego/Makefile
    index af98880a6388..32348ecf1ba5 100644
    --- a/kerberos5/lib/libgssapi_spnego/Makefile
    +++ b/kerberos5/lib/libgssapi_spnego/Makefile
    @@ -2,8 +2,8 @@
     
     LIB=	gssapi_spnego
     LDFLAGS= -Wl,-Bsymbolic
    -LDADD=	-lasn1
    -DPADD=	${LIBASN1}
    +LDADD=	-lgssapi -lasn1
    +DPADD=	${LIBGSSAPI} ${LIBASN1}
     
     SRCS=	accept_sec_context.c \
     	compat.c \
    diff --git a/kerberos5/usr.bin/kdestroy/Makefile b/kerberos5/usr.bin/kdestroy/Makefile
    index 8ebb201cee4d..592f5e69a572 100644
    --- a/kerberos5/usr.bin/kdestroy/Makefile
    +++ b/kerberos5/usr.bin/kdestroy/Makefile
    @@ -2,7 +2,7 @@
     
     PROG=	kdestroy
     CFLAGS+=-I${KRB5DIR}/lib/roken
    -DPADD=	${LIBKAFS5} ${LIBKRB5} ${LIBHX509) ${LIBROKEN} ${LIBVERS} \
    +DPADD=	${LIBKAFS5} ${LIBKRB5} ${LIBHX509} ${LIBROKEN} ${LIBVERS} \
     	${LIBASN1} ${LIBCRYPTO} ${LIBCRYPT} ${LIBCOM_ERR}
     LDADD=	-lkafs5 -lkrb5 -lhx509 -lroken ${LIBVERS} \
     	-lasn1 -lcrypto -lcrypt -lcom_err
    diff --git a/kerberos5/usr.bin/kpasswd/Makefile b/kerberos5/usr.bin/kpasswd/Makefile
    index e4da7695574b..a9ab1c99ec89 100644
    --- a/kerberos5/usr.bin/kpasswd/Makefile
    +++ b/kerberos5/usr.bin/kpasswd/Makefile
    @@ -2,7 +2,7 @@
     
     PROG=	kpasswd
     CFLAGS+=-I${KRB5DIR}/lib/roken
    -DPADD=	${LIBKRB5} ${LIBHX509 ${LIBROKEN} ${LIBVERS} \
    +DPADD=	${LIBKRB5} ${LIBHX509} ${LIBROKEN} ${LIBVERS} \
     	${LIBASN1} ${LIBCRYPTO} ${LIBCRYPT} ${LIBCOM_ERR}
     LDADD=	-lkrb5 -lhx509 -lroken ${LIBVERS} \
     	-lasn1 -lcrypto -lcrypt -lcom_err
    diff --git a/lib/Makefile b/lib/Makefile
    index 00b1c6089b3e..c661a4b8eb45 100644
    --- a/lib/Makefile
    +++ b/lib/Makefile
    @@ -30,17 +30,17 @@
     SUBDIR=	${_csu} libc libbsm libauditd libcom_err libcrypt libelf libkvm msun \
     	libmd \
     	ncurses ${_libnetgraph} libradius librpcsvc libsbuf \
    -	libtacplus libutil ${_libypclnt} libalias libarchive ${_libatm} \
    -	libbegemot ${_libbluetooth} ${_libbsnmp} libbz2 \
    +	libtacplus libutil ${_libypclnt} libalias libarchive \
    +	${_libatm} libbegemot ${_libbluetooth} ${_libbsnmp} libbz2 \
     	libcalendar libcam libcompat libdevinfo libdevstat libdisk \
    -	libdwarf libedit libexpat libfetch libftpio libgeom ${_libgpib} \
    -	${_libgssapi} ${_librpcsec_gss} libipsec \
    +	libdwarf libedit ${_libefi} libexpat libfetch libftpio libgeom \
    +	${_libgpib} ${_libgssapi} ${_librpcsec_gss} libipsec \
     	${_libipx} libjail libkiconv libmagic libmemstat ${_libmilter} \
     	${_libmp} ${_libncp} ${_libngatm} libopie libpam libpcap \
     	${_libpmc} libproc librt ${_libsdp} ${_libsm} ${_libsmb} \
    -	${_libsmdb} \
    -	${_libsmutil} libstand ${_libtelnet} ${_libthr} libthread_db libufs \
    -	libugidfw ${_libusbhid} ${_libusb} ${_libvgl} libwrap liby libz \
    +	${_libsmdb} ${_libsmutil} libstand \
    +	${_libtelnet} ${_libthr} libthread_db libufs libugidfw libulog \
    +	${_libusbhid} ${_libusb} ${_libvgl} libwrap liby libz \
     	${_bind}
     
     .if exists(${.CURDIR}/csu/${MACHINE_ARCH}-elf)
    @@ -104,6 +104,7 @@ _libvgl=	libvgl
     .endif
     
     .if ${MACHINE_ARCH} == "ia64"
    +_libefi=	libefi
     _libsmb=	libsmb
     .endif
     
    @@ -119,6 +120,10 @@ _libvgl=	libvgl
     _libsmb=	libsmb
     .endif
     
    +.if ${MACHINE_ARCH} == "sparc64"
    +_libsmb=	libsmb
    +.endif
    +
     .if ${MK_OPENSSL} != "no"
     _libmp=		libmp
     .endif
    diff --git a/lib/Makefile.inc b/lib/Makefile.inc
    index e9cf750939ce..d77e2dbd15d5 100644
    --- a/lib/Makefile.inc
    +++ b/lib/Makefile.inc
    @@ -1,3 +1,5 @@
     # $FreeBSD$
     # Default version for system libs (override in /Makefile if necessary)
     SHLIB_MAJOR?= 5
    +
    +WARNS?=	6
    diff --git a/lib/bind/config.h b/lib/bind/config.h
    index 8e5242669188..1d68450eafb5 100644
    --- a/lib/bind/config.h
    +++ b/lib/bind/config.h
    @@ -277,6 +277,10 @@ int sigwait(const unsigned int *set, int *sig);
     /* Define to 1 if you have the  header file. */
     #define HAVE_UNISTD_H 1
     
    +/* Define to the sub-directory in which libtool stores uninstalled libraries.
    +   */
    +#define LT_OBJDIR ".libs/"
    +
     /* Defined if extern char *optarg is not declared. */
     /* #undef NEED_OPTARG */
     
    diff --git a/lib/bind/dns/code.h b/lib/bind/dns/code.h
    index db8d8c5a89af..264fc119fe75 100644
    --- a/lib/bind/dns/code.h
    +++ b/lib/bind/dns/code.h
    @@ -1,7 +1,7 @@
     /* $FreeBSD$ */
     
     /*
    - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
    + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
      * Copyright (C) 1998-2003 Internet Software Consortium.
      *
      * Permission to use, copy, modify, and distribute this software for any
    diff --git a/lib/bind/dns/dns/enumclass.h b/lib/bind/dns/dns/enumclass.h
    index b1e363f2a3f0..e33d4c421f57 100644
    --- a/lib/bind/dns/dns/enumclass.h
    +++ b/lib/bind/dns/dns/enumclass.h
    @@ -1,7 +1,7 @@
     /* $FreeBSD$ */
     
     /*
    - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
    + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
      * Copyright (C) 1998-2003 Internet Software Consortium.
      *
      * Permission to use, copy, modify, and distribute this software for any
    diff --git a/lib/bind/dns/dns/enumtype.h b/lib/bind/dns/dns/enumtype.h
    index 74a6db77b83f..4ad3358e1cdf 100644
    --- a/lib/bind/dns/dns/enumtype.h
    +++ b/lib/bind/dns/dns/enumtype.h
    @@ -1,7 +1,7 @@
     /* $FreeBSD$ */
     
     /*
    - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
    + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
      * Copyright (C) 1998-2003 Internet Software Consortium.
      *
      * Permission to use, copy, modify, and distribute this software for any
    diff --git a/lib/bind/dns/dns/rdatastruct.h b/lib/bind/dns/dns/rdatastruct.h
    index d723941f8db3..94f57b89e4e1 100644
    --- a/lib/bind/dns/dns/rdatastruct.h
    +++ b/lib/bind/dns/dns/rdatastruct.h
    @@ -1,7 +1,7 @@
     /* $FreeBSD$ */
     
     /*
    - * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC")
    + * Copyright (C) 2004-2010 Internet Systems Consortium, Inc. ("ISC")
      * Copyright (C) 1998-2003 Internet Software Consortium.
      *
      * Permission to use, copy, modify, and distribute this software for any
    diff --git a/lib/csu/Makefile.inc b/lib/csu/Makefile.inc
    index 3545446762df..51e9fdfa7478 100644
    --- a/lib/csu/Makefile.inc
    +++ b/lib/csu/Makefile.inc
    @@ -1,3 +1,5 @@
     # $FreeBSD$
     
     SSP_CFLAGS=
    +
    +WARNS?=	6
    diff --git a/lib/csu/amd64/Makefile b/lib/csu/amd64/Makefile
    index 71ccd675b31f..1a74efcbcabe 100644
    --- a/lib/csu/amd64/Makefile
    +++ b/lib/csu/amd64/Makefile
    @@ -4,7 +4,7 @@
     
     SRCS=		crt1.c crti.S crtn.S
     OBJS=		${SRCS:N*.h:R:S/$/.o/g}
    -OBJS+=		gcrt1.o
    +OBJS+=		Scrt1.o gcrt1.o
     CFLAGS+=	-I${.CURDIR}/../common \
     		-I${.CURDIR}/../../libc/include
     CFLAGS+=	-fno-omit-frame-pointer
    @@ -16,6 +16,9 @@ CLEANFILES=	${OBJS}
     gcrt1.o: crt1.c
     	${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.CURDIR}/crt1.c
     
    +Scrt1.o: crt1.c
    +	${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.CURDIR}/crt1.c
    +
     realinstall:
     	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
     	    ${OBJS} ${DESTDIR}${LIBDIR}
    diff --git a/lib/csu/arm/Makefile b/lib/csu/arm/Makefile
    index 23954e840f36..da0eb125ce83 100644
    --- a/lib/csu/arm/Makefile
    +++ b/lib/csu/arm/Makefile
    @@ -4,11 +4,13 @@
     
     SRCS=		crt1.c crti.S crtn.S
     OBJS=		${SRCS:N*.h:R:S/$/.o/g}
    -OBJS+=		gcrt1.o
    +OBJS+=		Scrt1.o gcrt1.o
     CFLAGS+=	-Wall -Wno-unused \
     		-I${.CURDIR}/../common \
     		-I${.CURDIR}/../../libc/include
     
    +WARNS?=		2
    +
     all: ${OBJS}
     
     CLEANFILES=	${OBJS}
    @@ -16,6 +18,9 @@ CLEANFILES=	${OBJS}
     gcrt1.o: crt1.c
     	${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC}
     
    +Scrt1.o: crt1.c
    +	${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC}
    +
     realinstall:
     	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
     	    ${OBJS} ${DESTDIR}${LIBDIR}
    diff --git a/lib/csu/i386-elf/Makefile b/lib/csu/i386-elf/Makefile
    index 8598ce8552f5..8e6f50d57dd4 100644
    --- a/lib/csu/i386-elf/Makefile
    +++ b/lib/csu/i386-elf/Makefile
    @@ -2,18 +2,31 @@
     
     .PATH: ${.CURDIR}/../common
     
    -SRCS=		crt1.c crti.S crtn.S
    -FILES=		${SRCS:N*.h:R:S/$/.o/g} gcrt1.o
    +SRCS=		crti.S crtn.S
    +FILES=		${SRCS:N*.h:R:S/$/.o/g} gcrt1.o crt1.o Scrt1.o
     FILESOWN=	${LIBOWN}
     FILESGRP=	${LIBGRP}
     FILESMODE=	${LIBMODE}
     FILESDIR=	${LIBDIR}
    -WARNS?=		6
     CFLAGS+=	-I${.CURDIR}/../common \
     		-I${.CURDIR}/../../libc/include
    -CLEANFILES=	${FILES}
    +CLEANFILES=	${FILES} crt1_c.o crt1_s.o gcrt1_c.o Scrt1_c.o
     
    -gcrt1.o: crt1.c
    -	${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.CURDIR}/crt1.c
    +gcrt1_c.o: crt1_c.c
    +	${CC} ${CFLAGS} -DGCRT -c -o gcrt1_c.o ${.CURDIR}/crt1_c.c
    +
    +gcrt1.o: gcrt1_c.o crt1_s.o
    +	${LD} ${LDFLAGS} -o gcrt1.o -r crt1_s.o gcrt1_c.o
    +
    +crt1.o:	crt1_c.o crt1_s.o
    +	${LD} ${LDFLAGS} -o crt1.o -r crt1_s.o crt1_c.o
    +	objcopy --localize-symbol _start1 crt1.o
    +
    +Scrt1_c.o:	crt1_c.c
    +	${CC} ${CFLAGS} -DGCRT -fPIC -DPIC -c -o Scrt1_c.o ${.CURDIR}/crt1_c.c
    +
    +Scrt1.o: Scrt1_c.o crt1_s.o
    +	${LD} ${LDFLAGS} -o Scrt1.o -r crt1_s.o Scrt1_c.o
    +	objcopy --localize-symbol _start1 Scrt1.o
     
     .include 
    diff --git a/lib/csu/i386-elf/crt1.c b/lib/csu/i386-elf/crt1_c.c
    similarity index 83%
    rename from lib/csu/i386-elf/crt1.c
    rename to lib/csu/i386-elf/crt1_c.c
    index 093433330e35..c38f267c8e36 100644
    --- a/lib/csu/i386-elf/crt1.c
    +++ b/lib/csu/i386-elf/crt1_c.c
    @@ -22,6 +22,8 @@
      * 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$
      */
     
     #ifndef lint
    @@ -55,35 +57,15 @@ extern int etext;
     char **environ;
     const char *__progname = "";
     
    -static __inline fptr
    -get_rtld_cleanup(void)
    -{
    -	fptr retval;
    +void _start1(fptr, int, char *[]) __dead2;
     
    -#ifdef	__GNUC__
    -	__asm__("movl %%edx,%0" : "=rm"(retval));
    -#else
    -	retval = (fptr)0; /* XXXX Fix this for other compilers */
    -#endif
    -	return(retval);
    -}
    -
    -/* The entry function. */
    +/* The entry function, C part. */
     void
    -_start(char *ap, ...)
    +_start1(fptr cleanup, int argc, char *argv[])
     {
    -	fptr cleanup;
    -	int argc;
    -	char **argv;
     	char **env;
     	const char *s;
     
    -#ifdef __GNUC__
    -	__asm__("and $0xfffffff0,%esp");
    -#endif
    -	cleanup = get_rtld_cleanup();
    -	argv = ≈
    -	argc = *(long *)(void *)(argv - 1);
     	env = argv + argc + 1;
     	environ = env;
     	if (argc > 0 && argv[0] != NULL) {
    @@ -110,4 +92,4 @@ __asm__("eprol:");
     	exit( main(argc, argv, env) );
     }
     
    -__asm__(".ident\t\"$FreeBSD$\"");
    +__asm(".hidden	_start1");
    diff --git a/sys/boot/pc98/boot2/probe_keyboard.c b/lib/csu/i386-elf/crt1_s.S
    similarity index 70%
    rename from sys/boot/pc98/boot2/probe_keyboard.c
    rename to lib/csu/i386-elf/crt1_s.S
    index f10329683a8c..2af8a1bc83a0 100644
    --- a/sys/boot/pc98/boot2/probe_keyboard.c
    +++ b/lib/csu/i386-elf/crt1_s.S
    @@ -1,18 +1,16 @@
    -/*
    - * Copyright (c) KATO Takenori, 1994-1995. All rights reserved.
    - * 
    +/*-
    + * Copyright 2009 Konstantin Belousov.
    + * 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 as
    - *    the first lines of this file unmodified.
    + *    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 ``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.
    @@ -23,20 +21,24 @@
      * 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 
    -__FBSDID("$FreeBSD$");
     
    -#include "boot.h"
    -
    -int probe_keyboard(void)
    -{
    -	/*
    -	 * New type (RA and later) keyboard only!
    -	 */
    -	if (*(unsigned char*)V(0xA1481) & 0x48)
    -		return 0;
    -	return 1;	/* keyboard not found */
    -}
    +	.text
    +	.align	4
    +	.globl	_start
    +	.type	_start, @function
    +_start:	xorl	%ebp,%ebp
    +	pushl	%ebp
    +	movl	%esp,%ebp
    +	andl	$0xfffffff0,%esp # align stack
    +	leal	8(%ebp),%eax
    +	pushl	%eax		# argv
    +	pushl	4(%ebp)		# argc
    +	pushl	%edx		# rtld cleanup
    +	call	_start1
    +	.size	_start, . - _start
     
    +	.ident	"$FreeBSD$"
    diff --git a/lib/csu/ia64/Makefile b/lib/csu/ia64/Makefile
    index c906c094267b..d79510399dbb 100644
    --- a/lib/csu/ia64/Makefile
    +++ b/lib/csu/ia64/Makefile
    @@ -4,7 +4,7 @@
     
     SRCS=		crt1.S crti.S crtn.S
     OBJS=		${SRCS:N*.h:R:S/$/.o/g}
    -OBJS+=		gcrt1.o
    +OBJS+=		Scrt1.o gcrt1.o
     CFLAGS+=	-Wall -Wno-unused \
     		-I${.CURDIR}/../common \
     		-I${.CURDIR}/../../libc/include
    @@ -16,6 +16,9 @@ CLEANFILES=	${OBJS}
     gcrt1.o: crt1.S
     	${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC}
     
    +Scrt1.o: crt1.S
    +	${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC}
    +
     realinstall:
     	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
     	    ${OBJS} ${DESTDIR}${LIBDIR}
    diff --git a/lib/csu/mips/Makefile b/lib/csu/mips/Makefile
    index 23954e840f36..da0eb125ce83 100644
    --- a/lib/csu/mips/Makefile
    +++ b/lib/csu/mips/Makefile
    @@ -4,11 +4,13 @@
     
     SRCS=		crt1.c crti.S crtn.S
     OBJS=		${SRCS:N*.h:R:S/$/.o/g}
    -OBJS+=		gcrt1.o
    +OBJS+=		Scrt1.o gcrt1.o
     CFLAGS+=	-Wall -Wno-unused \
     		-I${.CURDIR}/../common \
     		-I${.CURDIR}/../../libc/include
     
    +WARNS?=		2
    +
     all: ${OBJS}
     
     CLEANFILES=	${OBJS}
    @@ -16,6 +18,9 @@ CLEANFILES=	${OBJS}
     gcrt1.o: crt1.c
     	${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC}
     
    +Scrt1.o: crt1.c
    +	${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC}
    +
     realinstall:
     	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
     	    ${OBJS} ${DESTDIR}${LIBDIR}
    diff --git a/lib/csu/powerpc/Makefile b/lib/csu/powerpc/Makefile
    index 23954e840f36..097f82df1f9b 100644
    --- a/lib/csu/powerpc/Makefile
    +++ b/lib/csu/powerpc/Makefile
    @@ -4,7 +4,7 @@
     
     SRCS=		crt1.c crti.S crtn.S
     OBJS=		${SRCS:N*.h:R:S/$/.o/g}
    -OBJS+=		gcrt1.o
    +OBJS+=		Scrt1.o gcrt1.o
     CFLAGS+=	-Wall -Wno-unused \
     		-I${.CURDIR}/../common \
     		-I${.CURDIR}/../../libc/include
    @@ -16,6 +16,9 @@ CLEANFILES=	${OBJS}
     gcrt1.o: crt1.c
     	${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC}
     
    +Scrt1.o: crt1.c
    +	${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC}
    +
     realinstall:
     	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
     	    ${OBJS} ${DESTDIR}${LIBDIR}
    diff --git a/lib/csu/sparc64/Makefile b/lib/csu/sparc64/Makefile
    index 2e1d03f9cb6d..7f8dd7a5483c 100644
    --- a/lib/csu/sparc64/Makefile
    +++ b/lib/csu/sparc64/Makefile
    @@ -4,7 +4,7 @@
     
     SRCS=		crt1.c crti.S crtn.S
     OBJS=		${SRCS:N*.h:R:S/$/.o/g}
    -OBJS+=		gcrt1.o
    +OBJS+=		Scrt1.o gcrt1.o
     CFLAGS+=	-I${.CURDIR}/../common -I${.CURDIR}/../../libc/include
     
     all: ${OBJS}
    @@ -14,6 +14,9 @@ CLEANFILES=	${OBJS}
     gcrt1.o: crt1.c
     	${CC} ${CFLAGS} -DGCRT -c -o gcrt1.o ${.ALLSRC}
     
    +Scrt1.o: crt1.c
    +	${CC} ${CFLAGS} -fPIC -DPIC -c -o Scrt1.o ${.ALLSRC}
    +
     realinstall:
     	${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \
     	    ${OBJS} ${DESTDIR}${LIBDIR}
    diff --git a/lib/libarchive/Makefile b/lib/libarchive/Makefile
    index c377f9b2d477..8de8247b64df 100644
    --- a/lib/libarchive/Makefile
    +++ b/lib/libarchive/Makefile
    @@ -22,8 +22,6 @@ DPADD+=	${LIBCRYPTO}
     LDADD+=	-lcrypto
     .endif
     
    -WARNS?=	6
    -
     # Headers to be installed in /usr/include
     INCS=	archive.h archive_entry.h
     
    @@ -34,6 +32,7 @@ SRCS=	archive_check_magic.c				\
     	archive_entry_stat.c				\
     	archive_entry_strmode.c				\
     	archive_entry_link_resolver.c			\
    +	archive_entry_xattr.c				\
     	archive_read.c					\
     	archive_read_data_into_fd.c			\
     	archive_read_disk.c				\
    @@ -50,6 +49,7 @@ SRCS=	archive_check_magic.c				\
     	archive_read_support_compression_gzip.c		\
     	archive_read_support_compression_none.c		\
     	archive_read_support_compression_program.c	\
    +	archive_read_support_compression_uu.c		\
     	archive_read_support_compression_xz.c		\
     	archive_read_support_format_all.c		\
     	archive_read_support_format_ar.c		\
    @@ -86,6 +86,7 @@ SRCS=	archive_check_magic.c				\
     	archive_write_set_format_pax.c			\
     	archive_write_set_format_shar.c			\
     	archive_write_set_format_ustar.c		\
    +	archive_write_set_format_zip.c			\
     	filter_fork.c
     
     # Man pages to be installed.
    @@ -223,6 +224,7 @@ MLINKS+=	archive_util.3 archive_compression.3
     MLINKS+=	archive_util.3 archive_compression_name.3
     MLINKS+=	archive_util.3 archive_errno.3
     MLINKS+=	archive_util.3 archive_error_string.3
    +MLINKS+=	archive_util.3 archive_file_count.3
     MLINKS+=	archive_util.3 archive_format.3
     MLINKS+=	archive_util.3 archive_format_name.3
     MLINKS+=	archive_util.3 archive_set_error.3
    diff --git a/lib/libarchive/archive.h b/lib/libarchive/archive.h
    index f438f22b3135..23095313f99e 100644
    --- a/lib/libarchive/archive.h
    +++ b/lib/libarchive/archive.h
    @@ -35,12 +35,16 @@
      * this header!  If you must conditionalize, use predefined compiler and/or
      * platform macros.
      */
    +#if defined(__BORLANDC__) && __BORLANDC__ >= 0x560
    +# define __LA_STDINT_H 
    +#elif !defined(__WATCOMC__) && !defined(_MSC_VER) && !defined(__INTERIX) && !defined(__BORLANDC__)
    +# define __LA_STDINT_H 
    +#endif
     
     #include 
     #include   /* Linux requires this for off_t */
    -#if !defined(__WATCOMC__) && !defined(_MSC_VER) && !defined(__INTERIX)
    -/* Header unavailable on Watcom C or MS Visual C++ or SFU. */
    -#include  /* int64_t, etc. */
    +#ifdef __LA_STDINT_H
    +# include __LA_STDINT_H /* int64_t, etc. */
     #endif
     #include  /* For FILE * */
     
    @@ -53,8 +57,13 @@
     # else
     #  define	__LA_SSIZE_T	long
     # endif
    -#define	__LA_UID_T	unsigned int
    -#define	__LA_GID_T	unsigned int
    +# if defined(__BORLANDC__)
    +#  define	__LA_UID_T	uid_t
    +#  define	__LA_GID_T	gid_t
    +# else
    +#  define	__LA_UID_T	short
    +#  define	__LA_GID_T	short
    +# endif
     #else
     #include   /* ssize_t, uid_t, and gid_t */
     #define	__LA_INT64_T	int64_t
    @@ -118,13 +127,13 @@ extern "C" {
      *             (ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000)
      * #endif
      */
    -#define	ARCHIVE_VERSION_NUMBER 2007000
    +#define	ARCHIVE_VERSION_NUMBER 2007901
     __LA_DECL int		archive_version_number(void);
     
     /*
      * Textual name/version of the library, useful for version displays.
      */
    -#define	ARCHIVE_VERSION_STRING "libarchive 2.7.0"
    +#define	ARCHIVE_VERSION_STRING "libarchive 2.7.901a"
     __LA_DECL const char *	archive_version_string(void);
     
     #if ARCHIVE_VERSION_NUMBER < 3000000
    @@ -232,6 +241,8 @@ typedef int	archive_close_callback(struct archive *, void *_client_data);
     #define	ARCHIVE_COMPRESSION_PROGRAM	4
     #define	ARCHIVE_COMPRESSION_LZMA	5
     #define	ARCHIVE_COMPRESSION_XZ		6
    +#define	ARCHIVE_COMPRESSION_UU		7
    +#define	ARCHIVE_COMPRESSION_RPM		8
     
     /*
      * Codes returned by archive_format.
    @@ -273,6 +284,7 @@ typedef int	archive_close_callback(struct archive *, void *_client_data);
     #define	ARCHIVE_FORMAT_AR_BSD			(ARCHIVE_FORMAT_AR | 2)
     #define	ARCHIVE_FORMAT_MTREE			0x80000
     #define	ARCHIVE_FORMAT_RAW			0x90000
    +#define	ARCHIVE_FORMAT_XAR			0xA0000
     
     /*-
      * Basic outline for reading an archive:
    @@ -307,6 +319,7 @@ __LA_DECL int		 archive_read_support_compression_program_signature
     				(struct archive *, const char *,
     				    const void * /* match */, size_t);
     
    +__LA_DECL int		 archive_read_support_compression_uu(struct archive *);
     __LA_DECL int		 archive_read_support_compression_xz(struct archive *);
     
     __LA_DECL int		 archive_read_support_format_all(struct archive *);
    @@ -529,6 +542,7 @@ __LA_DECL int		 archive_write_set_format_pax_restricted(struct archive *);
     __LA_DECL int		 archive_write_set_format_shar(struct archive *);
     __LA_DECL int		 archive_write_set_format_shar_dump(struct archive *);
     __LA_DECL int		 archive_write_set_format_ustar(struct archive *);
    +__LA_DECL int		 archive_write_set_format_zip(struct archive *);
     __LA_DECL int		 archive_write_open(struct archive *, void *,
     		     archive_open_callback *, archive_write_callback *,
     		     archive_close_callback *);
    @@ -704,6 +718,7 @@ __LA_DECL void		 archive_set_error(struct archive *, int _err,
     			    const char *fmt, ...);
     __LA_DECL void		 archive_copy_error(struct archive *dest,
     			    struct archive *src);
    +__LA_DECL int		 archive_file_count(struct archive *);
     
     #ifdef __cplusplus
     }
    diff --git a/lib/libarchive/archive_check_magic.c b/lib/libarchive/archive_check_magic.c
    index 8f1fa2f00adb..1381a186be83 100644
    --- a/lib/libarchive/archive_check_magic.c
    +++ b/lib/libarchive/archive_check_magic.c
    @@ -50,7 +50,16 @@ __FBSDID("$FreeBSD$");
     static void
     errmsg(const char *m)
     {
    -	write(2, m, strlen(m));
    +	size_t s = strlen(m);
    +	ssize_t written;
    +
    +	while (s > 0) {
    +		written = write(2, m, strlen(m));
    +		if (written <= 0)
    +			return;
    +		m += written;
    +		s -= written;
    +	}
     }
     
     static void
    @@ -60,8 +69,7 @@ diediedie(void)
     	/* Cause a breakpoint exception  */
     	DebugBreak();
     #endif
    -	*(char *)0 = 1;	/* Deliberately segfault and force a coredump. */
    -	_exit(1);	/* If that didn't work, just exit with an error. */
    +	abort();        /* Terminate the program abnormally. */
     }
     
     static const char *
    @@ -85,7 +93,7 @@ write_all_states(unsigned int states)
     	unsigned int lowbit;
     
     	/* A trick for computing the lowest set bit. */
    -	while ((lowbit = states & (-states)) != 0) {
    +	while ((lowbit = states & (1 + ~states)) != 0) {
     		states &= ~lowbit;		/* Clear the low bit. */
     		errmsg(state_name(lowbit));
     		if (states != 0)
    diff --git a/lib/libarchive/archive_crc32.h b/lib/libarchive/archive_crc32.h
    new file mode 100644
    index 000000000000..771575476d98
    --- /dev/null
    +++ b/lib/libarchive/archive_crc32.h
    @@ -0,0 +1,66 @@
    +/*-
    + * Copyright (c) 2009 Joerg  Sonnenberger
    + * 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(S) ``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(S) 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$
    + */
    +
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
    +/*
    + * When zlib is unavailable, we should still be able to validate
    + * uncompressed zip archives.  That requires us to be able to compute
    + * the CRC32 check value.  This is a drop-in compatible replacement
    + * for crc32() from zlib.  It's slower than the zlib implementation,
    + * but still pretty fast: This runs about 300MB/s on my 3GHz P4
    + * compared to about 800MB/s for the zlib implementation.
    + */
    +static unsigned long
    +crc32(unsigned long crc, const void *_p, size_t len)
    +{
    +	unsigned long crc2, b, i;
    +	const unsigned char *p = _p;
    +	static volatile int crc_tbl_inited = 0;
    +	static unsigned long crc_tbl[256];
    +
    +	if (!crc_tbl_inited) {
    +		for (b = 0; b < 256; ++b) {
    +			crc2 = b;
    +			for (i = 8; i > 0; --i) {
    +				if (crc2 & 1)
    +					crc2 = (crc2 >> 1) ^ 0xedb88320UL;
    +				else    
    +					crc2 = (crc2 >> 1);
    +			}
    +			crc_tbl[b] = crc2;
    +		}
    +		crc_tbl_inited = 1;
    +	}
    +
    +	crc = crc ^ 0xffffffffUL;
    +	while (len--)
    +		crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8);
    +	return (crc ^ 0xffffffffUL);
    +}
    diff --git a/lib/libarchive/archive_endian.h b/lib/libarchive/archive_endian.h
    index 47739c0d2464..9d0136544792 100644
    --- a/lib/libarchive/archive_endian.h
    +++ b/lib/libarchive/archive_endian.h
    @@ -28,6 +28,10 @@
      * Borrowed from FreeBSD's 
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     /* Note:  This is a purely internal header! */
     /* Do not use this outside of libarchive internal code! */
     
    @@ -41,7 +45,7 @@
      * - SGI MIPSpro
      * - Microsoft Visual C++ 6.0 (supposedly newer versions too)
      */
    -#if defined(__WATCOMC__) || defined(__sgi)
    +#if defined(__WATCOMC__) || defined(__sgi) || defined(__hpux) || defined(__BORLANDC__)
     #define	inline
     #elif defined(_MSC_VER)
     #define inline __inline
    diff --git a/lib/libarchive/archive_entry.c b/lib/libarchive/archive_entry.c
    index 16166aa85ae4..1202a8a28297 100644
    --- a/lib/libarchive/archive_entry.c
    +++ b/lib/libarchive/archive_entry.c
    @@ -32,12 +32,12 @@ __FBSDID("$FreeBSD$");
     #ifdef HAVE_SYS_TYPES_H
     #include 
     #endif
    -#ifdef MAJOR_IN_MKDEV
    +#if MAJOR_IN_MKDEV
     #include 
    -#else
    -#ifdef MAJOR_IN_SYSMACROS
    +#define HAVE_MAJOR
    +#elif MAJOR_IN_SYSMACROS
     #include 
    -#endif
    +#define HAVE_MAJOR
     #endif
     #ifdef HAVE_LIMITS_H
     #include 
    @@ -75,6 +75,13 @@ __FBSDID("$FreeBSD$");
     #undef max
     #define	max(a, b)	((a)>(b)?(a):(b))
     
    +#if !defined(HAVE_MAJOR) && !defined(major)
    +/* Replacement for major/minor/makedev. */
    +#define	major(x) ((int)(0x00ff & ((x) >> 8)))
    +#define	minor(x) ((int)(0xffff00ff & (x)))
    +#define	makedev(maj,min) ((0xff00 & ((maj)<<8)) | (0xffff00ff & (min)))
    +#endif
    +
     /* Play games to come up with a suitable makedev() definition. */
     #ifdef __QNXNTO__
     /* QNX.   */
    @@ -215,7 +222,7 @@ static const wchar_t *
     aes_get_wcs(struct aes *aes)
     {
     	wchar_t *w;
    -	int r;
    +	size_t r;
     
     	/* Return WCS form if we already have it. */
     	if (aes->aes_set & AES_SET_WCS)
    @@ -233,7 +240,7 @@ aes_get_wcs(struct aes *aes)
     		if (w == NULL)
     			__archive_errx(1, "No memory for aes_get_wcs()");
     		r = mbstowcs(w, aes->aes_mbs.s, wcs_length);
    -		if (r > 0) {
    +		if (r != (size_t)-1 && r != 0) {
     			w[r] = 0;
     			aes->aes_set |= AES_SET_WCS;
     			return (aes->aes_wcs = w);
    @@ -618,6 +625,12 @@ archive_entry_ino(struct archive_entry *entry)
     	return (entry->ae_stat.aest_ino);
     }
     
    +int64_t
    +archive_entry_ino64(struct archive_entry *entry)
    +{
    +	return (entry->ae_stat.aest_ino);
    +}
    +
     mode_t
     archive_entry_mode(struct archive_entry *entry)
     {
    @@ -817,6 +830,13 @@ archive_entry_set_ino(struct archive_entry *entry, unsigned long ino)
     	entry->ae_stat.aest_ino = ino;
     }
     
    +void
    +archive_entry_set_ino64(struct archive_entry *entry, int64_t ino)
    +{
    +	entry->stat_valid = 0;
    +	entry->ae_stat.aest_ino = ino;
    +}
    +
     void
     archive_entry_set_hardlink(struct archive_entry *entry, const char *target)
     {
    @@ -847,6 +867,16 @@ archive_entry_copy_hardlink_w(struct archive_entry *entry, const wchar_t *target
     		entry->ae_set &= ~AE_SET_HARDLINK;
     }
     
    +int
    +archive_entry_update_hardlink_utf8(struct archive_entry *entry, const char *target)
    +{
    +	if (target != NULL)
    +		entry->ae_set |= AE_SET_HARDLINK;
    +	else
    +		entry->ae_set &= ~AE_SET_HARDLINK;
    +	return (aes_update_utf8(&entry->ae_hardlink, target));
    +}
    +
     void
     archive_entry_set_atime(struct archive_entry *entry, time_t t, long ns)
     {
    @@ -1095,6 +1125,16 @@ archive_entry_copy_symlink_w(struct archive_entry *entry, const wchar_t *linknam
     		entry->ae_set &= ~AE_SET_SYMLINK;
     }
     
    +int
    +archive_entry_update_symlink_utf8(struct archive_entry *entry, const char *linkname)
    +{
    +	if (linkname != NULL)
    +		entry->ae_set |= AE_SET_SYMLINK;
    +	else
    +		entry->ae_set &= ~AE_SET_SYMLINK;
    +	return (aes_update_utf8(&entry->ae_symlink, linkname));
    +}
    +
     void
     archive_entry_set_uid(struct archive_entry *entry, uid_t u)
     {
    @@ -1186,7 +1226,7 @@ archive_entry_acl_add_entry_w(struct archive_entry *entry,
     	archive_entry_acl_add_entry_w_len(entry, type, permset, tag, id, name, wcslen(name));
     }
     
    -void
    +static void
     archive_entry_acl_add_entry_w_len(struct archive_entry *entry,
         int type, int permset, int tag, int id, const wchar_t *name, size_t len)
     {
    @@ -1595,7 +1635,7 @@ __archive_entry_acl_parse_w(struct archive_entry *entry,
     		const wchar_t *end;
     	} field[4], name;
     
    -	int fields;
    +	int fields, n;
     	int type, tag, permset, id;
     	wchar_t sep;
     
    @@ -1615,6 +1655,10 @@ __archive_entry_acl_parse_w(struct archive_entry *entry,
     			++fields;
     		} while (sep == L':');
     
    +		/* Set remaining fields to blank. */
    +		for (n = fields; n < 4; ++n)
    +			field[n].start = field[n].end = NULL;
    +
     		/* Check for a numeric ID in field 1 or 3. */
     		id = -1;
     		isint_w(field[1].start, field[1].end, &id);
    @@ -1626,7 +1670,7 @@ __archive_entry_acl_parse_w(struct archive_entry *entry,
     		 * Solaris extension:  "defaultuser::rwx" is the
     		 * default ACL corresponding to "user::rwx", etc.
     		 */
    -		if (field[0].end-field[0].start > 7
    +		if (field[0].end - field[0].start > 7
     		    && wmemcmp(field[0].start, L"default", 7) == 0) {
     			type = ARCHIVE_ENTRY_ACL_TYPE_DEFAULT;
     			field[0].start += 7;
    @@ -1653,7 +1697,7 @@ __archive_entry_acl_parse_w(struct archive_entry *entry,
     		} else if (prefix_w(field[0].start, field[0].end, L"other")) {
     			if (fields == 2
     			    && field[1].start < field[1].end
    -			    && ismode_w(field[1].start, field[2].end, &permset)) {
    +			    && ismode_w(field[1].start, field[1].end, &permset)) {
     				/* This is Solaris-style "other:rwx" */
     			} else if (fields == 3
     			    && field[1].start == field[1].end
    @@ -1686,98 +1730,6 @@ __archive_entry_acl_parse_w(struct archive_entry *entry,
     	return (ARCHIVE_OK);
     }
     
    -/*
    - * extended attribute handling
    - */
    -
    -void
    -archive_entry_xattr_clear(struct archive_entry *entry)
    -{
    -	struct ae_xattr	*xp;
    -
    -	while (entry->xattr_head != NULL) {
    -		xp = entry->xattr_head->next;
    -		free(entry->xattr_head->name);
    -		free(entry->xattr_head->value);
    -		free(entry->xattr_head);
    -		entry->xattr_head = xp;
    -	}
    -
    -	entry->xattr_head = NULL;
    -}
    -
    -void
    -archive_entry_xattr_add_entry(struct archive_entry *entry,
    -	const char *name, const void *value, size_t size)
    -{
    -	struct ae_xattr	*xp;
    -
    -	for (xp = entry->xattr_head; xp != NULL; xp = xp->next)
    -		;
    -
    -	if ((xp = (struct ae_xattr *)malloc(sizeof(struct ae_xattr))) == NULL)
    -		/* XXX Error XXX */
    -		return;
    -
    -	xp->name = strdup(name);
    -	if ((xp->value = malloc(size)) != NULL) {
    -		memcpy(xp->value, value, size);
    -		xp->size = size;
    -	} else
    -		xp->size = 0;
    -
    -	xp->next = entry->xattr_head;
    -	entry->xattr_head = xp;
    -}
    -
    -
    -/*
    - * returns number of the extended attribute entries
    - */
    -int
    -archive_entry_xattr_count(struct archive_entry *entry)
    -{
    -	struct ae_xattr *xp;
    -	int count = 0;
    -
    -	for (xp = entry->xattr_head; xp != NULL; xp = xp->next)
    -		count++;
    -
    -	return count;
    -}
    -
    -int
    -archive_entry_xattr_reset(struct archive_entry * entry)
    -{
    -	entry->xattr_p = entry->xattr_head;
    -
    -	return archive_entry_xattr_count(entry);
    -}
    -
    -int
    -archive_entry_xattr_next(struct archive_entry * entry,
    -	const char **name, const void **value, size_t *size)
    -{
    -	if (entry->xattr_p) {
    -		*name = entry->xattr_p->name;
    -		*value = entry->xattr_p->value;
    -		*size = entry->xattr_p->size;
    -
    -		entry->xattr_p = entry->xattr_p->next;
    -
    -		return (ARCHIVE_OK);
    -	} else {
    -		*name = NULL;
    -		*value = NULL;
    -		*size = (size_t)0;
    -		return (ARCHIVE_WARN);
    -	}
    -}
    -
    -/*
    - * end of xattr handling
    - */
    -
     /*
      * Parse a string to a positive decimal integer.  Returns true if
      * the string is non-empty and consists only of decimal digits,
    @@ -1814,6 +1766,8 @@ ismode_w(const wchar_t *start, const wchar_t *end, int *permset)
     {
     	const wchar_t *p;
     
    +	if (start >= end)
    +		return (0);
     	p = start;
     	*permset = 0;
     	while (p < end) {
    @@ -1988,6 +1942,18 @@ static struct flag {
     	{ "nouunlnk",	L"nouunlnk",		UF_NOUNLINK,	0 },
     	{ "nouunlink",	L"nouunlink",		UF_NOUNLINK,	0 },
     #endif
    +#ifdef EXT2_UNRM_FL
    +        { "nouunlink",	L"nouunlink",		EXT2_UNRM_FL,	0},
    +#endif
    +
    +#ifdef EXT2_BTREE_FL
    +        { "nobtree",	L"nobtree",       	EXT2_BTREE_FL,	0 },
    +#endif
    +
    +#ifdef EXT2_ECOMPR_FL
    +        { "nocomperr",	L"nocomperr",       	EXT2_ECOMPR_FL,	0 },
    +#endif
    +
     #ifdef EXT2_COMPR_FL				/* 'c' */
             { "nocompress",	L"nocompress",       	EXT2_COMPR_FL,	0 },
     #endif
    @@ -1995,6 +1961,46 @@ static struct flag {
     #ifdef EXT2_NOATIME_FL				/* 'A' */
             { "noatime",	L"noatime",		0,		EXT2_NOATIME_FL},
     #endif
    +
    +#ifdef EXT2_DIRTY_FL
    +        { "nocompdirty",L"nocompdirty",		EXT2_DIRTY_FL,		0},
    +#endif
    +
    +#ifdef EXT2_COMPRBLK_FL
    +#ifdef EXT2_NOCOMPR_FL
    +        { "nocomprblk",	L"nocomprblk",		EXT2_COMPRBLK_FL, EXT2_NOCOMPR_FL},
    +#else
    +        { "nocomprblk",	L"nocomprblk",		EXT2_COMPRBLK_FL,	0},
    +#endif
    +#endif
    +#ifdef EXT2_DIRSYNC_FL
    +        { "nodirsync",	L"nodirsync",		EXT2_DIRSYNC_FL,	0},
    +#endif
    +#ifdef EXT2_INDEX_FL
    +        { "nohashidx",	L"nohashidx",		EXT2_INDEX_FL,		0},
    +#endif
    +#ifdef EXT2_IMAGIC_FL
    +        { "noimagic",	L"noimagic",		EXT2_IMAGIC_FL,		0},
    +#endif
    +#ifdef EXT3_JOURNAL_DATA_FL
    +        { "nojournal",	L"nojournal",		EXT3_JOURNAL_DATA_FL,	0},
    +#endif
    +#ifdef EXT2_SECRM_FL
    +        { "nosecuredeletion",L"nosecuredeletion",EXT2_SECRM_FL,		0},
    +#endif
    +#ifdef EXT2_SYNC_FL
    +        { "nosync",	L"nosync",		EXT2_SYNC_FL,		0},
    +#endif
    +#ifdef EXT2_NOTAIL_FL
    +        { "notail",	L"notail",		0,		EXT2_NOTAIL_FL},
    +#endif
    +#ifdef EXT2_TOPDIR_FL
    +        { "notopdir",	L"notopdir",		EXT2_TOPDIR_FL,		0},
    +#endif
    +#ifdef EXT2_RESERVED_FL
    +        { "noreserved",	L"noreserved",		EXT2_RESERVED_FL,	0},
    +#endif
    +
     	{ NULL,		NULL,			0,		0 }
     };
     
    diff --git a/lib/libarchive/archive_entry.h b/lib/libarchive/archive_entry.h
    index a2748fdff67a..7ed2dde2c426 100644
    --- a/lib/libarchive/archive_entry.h
    +++ b/lib/libarchive/archive_entry.h
    @@ -40,14 +40,25 @@
     #include   /* for wchar_t */
     #include 
     
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +#include 
    +#endif
    +
     /* Get appropriate definitions of standard POSIX-style types. */
     /* These should match the types used in 'struct stat' */
     #if defined(_WIN32) && !defined(__CYGWIN__)
     #define	__LA_INT64_T	__int64
    -#define	__LA_UID_T	unsigned int
    -#define	__LA_GID_T	unsigned int
    -#define	__LA_DEV_T	unsigned int
    -#define	__LA_MODE_T	unsigned short
    +# if defined(__BORLANDC__)
    +#  define	__LA_UID_T	uid_t
    +#  define	__LA_GID_T	gid_t
    +#  define	__LA_DEV_T	dev_t
    +#  define	__LA_MODE_T	mode_t
    +# else
    +#  define	__LA_UID_T	short
    +#  define	__LA_GID_T	short
    +#  define	__LA_DEV_T	unsigned int
    +#  define	__LA_MODE_T	unsigned short
    +# endif
     #else
     #include 
     #define	__LA_INT64_T	int64_t
    @@ -194,6 +205,7 @@ __LA_DECL const wchar_t	*archive_entry_gname_w(struct archive_entry *);
     __LA_DECL const char	*archive_entry_hardlink(struct archive_entry *);
     __LA_DECL const wchar_t	*archive_entry_hardlink_w(struct archive_entry *);
     __LA_DECL __LA_INO_T	 archive_entry_ino(struct archive_entry *);
    +__LA_DECL __LA_INT64_T	 archive_entry_ino64(struct archive_entry *);
     __LA_DECL __LA_MODE_T	 archive_entry_mode(struct archive_entry *);
     __LA_DECL time_t	 archive_entry_mtime(struct archive_entry *);
     __LA_DECL long		 archive_entry_mtime_nsec(struct archive_entry *);
    @@ -227,6 +239,10 @@ __LA_DECL const wchar_t	*archive_entry_uname_w(struct archive_entry *);
     
     __LA_DECL void	archive_entry_set_atime(struct archive_entry *, time_t, long);
     __LA_DECL void  archive_entry_unset_atime(struct archive_entry *);
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +__LA_DECL void archive_entry_copy_bhfi(struct archive_entry *,
    +									   BY_HANDLE_FILE_INFORMATION *);
    +#endif
     __LA_DECL void	archive_entry_set_birthtime(struct archive_entry *, time_t, long);
     __LA_DECL void  archive_entry_unset_birthtime(struct archive_entry *);
     __LA_DECL void	archive_entry_set_ctime(struct archive_entry *, time_t, long);
    @@ -251,7 +267,14 @@ __LA_DECL int	archive_entry_update_gname_utf8(struct archive_entry *, const char
     __LA_DECL void	archive_entry_set_hardlink(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_copy_hardlink(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_copy_hardlink_w(struct archive_entry *, const wchar_t *);
    +__LA_DECL int	archive_entry_update_hardlink_utf8(struct archive_entry *, const char *);
    +#if ARCHIVE_VERSION_NUMBER >= 3000000
    +/* Starting with libarchive 3.0, this will be synonym for ino64. */
    +__LA_DECL void	archive_entry_set_ino(struct archive_entry *, __LA_INT64_T);
    +#else
     __LA_DECL void	archive_entry_set_ino(struct archive_entry *, unsigned long);
    +#endif
    +__LA_DECL void	archive_entry_set_ino64(struct archive_entry *, __LA_INT64_T);
     __LA_DECL void	archive_entry_set_link(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_copy_link(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_copy_link_w(struct archive_entry *, const wchar_t *);
    @@ -274,6 +297,7 @@ __LA_DECL void	archive_entry_copy_sourcepath(struct archive_entry *, const char
     __LA_DECL void	archive_entry_set_symlink(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_copy_symlink(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_copy_symlink_w(struct archive_entry *, const wchar_t *);
    +__LA_DECL int	archive_entry_update_symlink_utf8(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_set_uid(struct archive_entry *, __LA_UID_T);
     __LA_DECL void	archive_entry_set_uname(struct archive_entry *, const char *);
     __LA_DECL void	archive_entry_copy_uname(struct archive_entry *, const char *);
    diff --git a/lib/libarchive/archive_entry_link_resolver.c b/lib/libarchive/archive_entry_link_resolver.c
    index e7758d66d909..a5eb624b6107 100644
    --- a/lib/libarchive/archive_entry_link_resolver.c
    +++ b/lib/libarchive/archive_entry_link_resolver.c
    @@ -181,8 +181,10 @@ archive_entry_linkify(struct archive_entry_linkresolver *res,
     	/* If it has only one link, then we're done. */
     	if (archive_entry_nlink(*e) == 1)
     		return;
    -	/* Directories never have hardlinks. */
    -	if (archive_entry_filetype(*e) == AE_IFDIR)
    +	/* Directories, devices never have hardlinks. */
    +	if (archive_entry_filetype(*e) == AE_IFDIR
    +	    || archive_entry_filetype(*e) == AE_IFBLK
    +	    || archive_entry_filetype(*e) == AE_IFCHR)
     		return;
     
     	switch (res->strategy) {
    @@ -249,7 +251,7 @@ find_entry(struct archive_entry_linkresolver *res,
     	struct links_entry	*le;
     	int			 hash, bucket;
     	dev_t			 dev;
    -	ino_t			 ino;
    +	int64_t			 ino;
     
     	/* Free a held entry. */
     	if (res->spare != NULL) {
    @@ -264,15 +266,15 @@ find_entry(struct archive_entry_linkresolver *res,
     		return (NULL);
     
     	dev = archive_entry_dev(entry);
    -	ino = archive_entry_ino(entry);
    -	hash = dev ^ ino;
    +	ino = archive_entry_ino64(entry);
    +	hash = (int)(dev ^ ino);
     
     	/* Try to locate this entry in the links cache. */
     	bucket = hash % res->number_buckets;
     	for (le = res->buckets[bucket]; le != NULL; le = le->next) {
     		if (le->hash == hash
     		    && dev == archive_entry_dev(le->canonical)
    -		    && ino == archive_entry_ino(le->canonical)) {
    +		    && ino == archive_entry_ino64(le->canonical)) {
     			/*
     			 * Decrement link count each time and release
     			 * the entry if it hits zero.  This saves
    @@ -350,7 +352,7 @@ insert_entry(struct archive_entry_linkresolver *res,
     	if (res->number_entries > res->number_buckets * 2)
     		grow_hash(res);
     
    -	hash = archive_entry_dev(entry) ^ archive_entry_ino(entry);
    +	hash = archive_entry_dev(entry) ^ archive_entry_ino64(entry);
     	bucket = hash % res->number_buckets;
     
     	/* If we could allocate the entry, record it. */
    diff --git a/lib/libarchive/archive_entry_private.h b/lib/libarchive/archive_entry_private.h
    index 4614a4f8e2d0..d59021c24875 100644
    --- a/lib/libarchive/archive_entry_private.h
    +++ b/lib/libarchive/archive_entry_private.h
    @@ -25,6 +25,10 @@
      * $FreeBSD$
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef ARCHIVE_ENTRY_PRIVATE_H_INCLUDED
     #define	ARCHIVE_ENTRY_PRIVATE_H_INCLUDED
     
    @@ -115,7 +119,7 @@ struct archive_entry {
     		int64_t		aest_birthtime;
     		uint32_t	aest_birthtime_nsec;
     		gid_t		aest_gid;
    -		ino_t		aest_ino;
    +		int64_t		aest_ino;
     		mode_t		aest_mode;
     		uint32_t	aest_nlink;
     		uint64_t	aest_size;
    diff --git a/lib/libarchive/archive_entry_stat.c b/lib/libarchive/archive_entry_stat.c
    index 8b58658017de..cdaeac3429a1 100644
    --- a/lib/libarchive/archive_entry_stat.c
    +++ b/lib/libarchive/archive_entry_stat.c
    @@ -72,7 +72,7 @@ archive_entry_stat(struct archive_entry *entry)
     	st->st_dev = archive_entry_dev(entry);
     	st->st_gid = archive_entry_gid(entry);
     	st->st_uid = archive_entry_uid(entry);
    -	st->st_ino = archive_entry_ino(entry);
    +	st->st_ino = archive_entry_ino64(entry);
     	st->st_nlink = archive_entry_nlink(entry);
     	st->st_rdev = archive_entry_rdev(entry);
     	st->st_size = archive_entry_size(entry);
    diff --git a/lib/libarchive/archive_entry_xattr.c b/lib/libarchive/archive_entry_xattr.c
    new file mode 100644
    index 000000000000..b7e53e31544e
    --- /dev/null
    +++ b/lib/libarchive/archive_entry_xattr.c
    @@ -0,0 +1,158 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * 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(S) ``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(S) 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 "archive_platform.h"
    +__FBSDID("$FreeBSD$");
    +
    +#ifdef HAVE_SYS_STAT_H
    +#include 
    +#endif
    +#ifdef HAVE_SYS_TYPES_H
    +#include 
    +#endif
    +#ifdef HAVE_LIMITS_H
    +#include 
    +#endif
    +#ifdef HAVE_LINUX_FS_H
    +#include 	/* for Linux file flags */
    +#endif
    +/*
    + * Some Linux distributions have both linux/ext2_fs.h and ext2fs/ext2_fs.h.
    + * As the include guards don't agree, the order of include is important.
    + */
    +#ifdef HAVE_LINUX_EXT2_FS_H
    +#include 	/* for Linux file flags */
    +#endif
    +#if defined(HAVE_EXT2FS_EXT2_FS_H) && !defined(__CYGWIN__)
    +#include 	/* for Linux file flags */
    +#endif
    +#include 
    +#include 
    +#ifdef HAVE_STDLIB_H
    +#include 
    +#endif
    +#ifdef HAVE_STRING_H
    +#include 
    +#endif
    +#ifdef HAVE_WCHAR_H
    +#include 
    +#endif
    +
    +#include "archive.h"
    +#include "archive_entry.h"
    +#include "archive_private.h"
    +#include "archive_entry_private.h"
    +
    +/*
    + * extended attribute handling
    + */
    +
    +void
    +archive_entry_xattr_clear(struct archive_entry *entry)
    +{
    +	struct ae_xattr	*xp;
    +
    +	while (entry->xattr_head != NULL) {
    +		xp = entry->xattr_head->next;
    +		free(entry->xattr_head->name);
    +		free(entry->xattr_head->value);
    +		free(entry->xattr_head);
    +		entry->xattr_head = xp;
    +	}
    +
    +	entry->xattr_head = NULL;
    +}
    +
    +void
    +archive_entry_xattr_add_entry(struct archive_entry *entry,
    +	const char *name, const void *value, size_t size)
    +{
    +	struct ae_xattr	*xp;
    +
    +	for (xp = entry->xattr_head; xp != NULL; xp = xp->next)
    +		;
    +
    +	if ((xp = (struct ae_xattr *)malloc(sizeof(struct ae_xattr))) == NULL)
    +		/* XXX Error XXX */
    +		return;
    +
    +	xp->name = strdup(name);
    +	if ((xp->value = malloc(size)) != NULL) {
    +		memcpy(xp->value, value, size);
    +		xp->size = size;
    +	} else
    +		xp->size = 0;
    +
    +	xp->next = entry->xattr_head;
    +	entry->xattr_head = xp;
    +}
    +
    +
    +/*
    + * returns number of the extended attribute entries
    + */
    +int
    +archive_entry_xattr_count(struct archive_entry *entry)
    +{
    +	struct ae_xattr *xp;
    +	int count = 0;
    +
    +	for (xp = entry->xattr_head; xp != NULL; xp = xp->next)
    +		count++;
    +
    +	return count;
    +}
    +
    +int
    +archive_entry_xattr_reset(struct archive_entry * entry)
    +{
    +	entry->xattr_p = entry->xattr_head;
    +
    +	return archive_entry_xattr_count(entry);
    +}
    +
    +int
    +archive_entry_xattr_next(struct archive_entry * entry,
    +	const char **name, const void **value, size_t *size)
    +{
    +	if (entry->xattr_p) {
    +		*name = entry->xattr_p->name;
    +		*value = entry->xattr_p->value;
    +		*size = entry->xattr_p->size;
    +
    +		entry->xattr_p = entry->xattr_p->next;
    +
    +		return (ARCHIVE_OK);
    +	} else {
    +		*name = NULL;
    +		*value = NULL;
    +		*size = (size_t)0;
    +		return (ARCHIVE_WARN);
    +	}
    +}
    +
    +/*
    + * end of xattr handling
    + */
    diff --git a/lib/libarchive/archive_hash.h b/lib/libarchive/archive_hash.h
    new file mode 100644
    index 000000000000..9dc4d5e9941d
    --- /dev/null
    +++ b/lib/libarchive/archive_hash.h
    @@ -0,0 +1,196 @@
    +/*-
    + * Copyright (c) 2009 Joerg Sonnenberger
    + * 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(S) ``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(S) 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$
    + */
    +
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
    +/*
    + * Hash function support in various Operating Systems:
    + *
    + * NetBSD:
    + * - MD5 and SHA1 in libc: without _ after algorithm name
    + * - SHA2 in libc: with _ after algorithm name
    + *
    + * OpenBSD:
    + * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name
    + * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name
    + *
    + * DragonFly and FreeBSD (XXX not used yet):
    + * - MD5 and SHA1 in libmd: without _ after algorithm name
    + * - SHA256: with _ after algorithm name
    + *
    + * OpenSSL:
    + * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
    + */
    +
    +#if defined(HAVE_MD5_H) && defined(HAVE_MD5INIT)
    +#  include 
    +#  define ARCHIVE_HAS_MD5
    +typedef MD5_CTX archive_md5_ctx;
    +#  define archive_md5_init(ctx)			MD5Init(ctx)
    +#  define archive_md5_final(ctx, buf)		MD5Final(buf, ctx)
    +#  define archive_md5_update(ctx, buf, n)	MD5Update(ctx, buf, n)
    +#elif defined(HAVE_OPENSSL_MD5_H)
    +#  include 
    +#  define ARCHIVE_HAS_MD5
    +typedef MD5_CTX archive_md5_ctx;
    +#  define archive_md5_init(ctx)			MD5_Init(ctx)
    +#  define archive_md5_final(ctx, buf)		MD5_Final(buf, ctx)
    +#  define archive_md5_update(ctx, buf, n)	MD5_Update(ctx, buf, n)
    +#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_MD5)
    +#  define ARCHIVE_HAS_MD5
    +typedef MD5_CTX archive_md5_ctx;
    +#  define archive_md5_init(ctx)			MD5_Init(ctx)
    +#  define archive_md5_final(ctx, buf)		MD5_Final(buf, ctx)
    +#  define archive_md5_update(ctx, buf, n)	MD5_Update(ctx, buf, n)
    +#endif
    +
    +#if defined(HAVE_RMD160_H) && defined(HAVE_RMD160INIT)
    +#  include 
    +#  define ARCHIVE_HAS_RMD160
    +typedef RMD160_CTX archive_rmd160_ctx;
    +#  define archive_rmd160_init(ctx)		RMD160Init(ctx)
    +#  define archive_rmd160_final(ctx, buf)	RMD160Final(buf, ctx)
    +#  define archive_rmd160_update(ctx, buf, n)	RMD160Update(ctx, buf, n)
    +#elif defined(HAVE_OPENSSL_RIPEMD_H)
    +#  include 
    +#  define ARCHIVE_HAS_RMD160
    +typedef RIPEMD160_CTX archive_rmd160_ctx;
    +#  define archive_rmd160_init(ctx)		RIPEMD160_Init(ctx)
    +#  define archive_rmd160_final(ctx, buf)	RIPEMD160_Final(buf, ctx)
    +#  define archive_rmd160_update(ctx, buf, n)	RIPEMD160_Update(ctx, buf, n)
    +#endif
    +
    +#if defined(HAVE_SHA1_H) && defined(HAVE_SHA1INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA1
    +typedef SHA1_CTX archive_sha1_ctx;
    +#  define archive_sha1_init(ctx)		SHA1Init(ctx)
    +#  define archive_sha1_final(ctx, buf)		SHA1Final(buf, ctx)
    +#  define archive_sha1_update(ctx, buf, n)	SHA1Update(ctx, buf, n)
    +#elif defined(HAVE_OPENSSL_SHA_H)
    +#  include 
    +#  define ARCHIVE_HAS_SHA1
    +typedef SHA_CTX archive_sha1_ctx;
    +#  define archive_sha1_init(ctx)		SHA1_Init(ctx)
    +#  define archive_sha1_final(ctx, buf)		SHA1_Final(buf, ctx)
    +#  define archive_sha1_update(ctx, buf, n)	SHA1_Update(ctx, buf, n)
    +#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA1)
    +#  define ARCHIVE_HAS_SHA1
    +typedef SHA1_CTX archive_sha1_ctx;
    +#  define archive_sha1_init(ctx)		SHA1_Init(ctx)
    +#  define archive_sha1_final(ctx, buf)		SHA1_Final(buf, ctx)
    +#  define archive_sha1_update(ctx, buf, n)	SHA1_Update(ctx, buf, n)
    +#endif
    +
    +#if defined(HAVE_SHA2_H) && defined(HAVE_SHA256_INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA256
    +typedef SHA256_CTX archive_sha256_ctx;
    +#  define archive_sha256_init(ctx)		SHA256_Init(ctx)
    +#  define archive_sha256_final(ctx, buf)	SHA256_Final(buf, ctx)
    +#  define archive_sha256_update(ctx, buf, n)	SHA256_Update(ctx, buf, n)
    +#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA256INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA256
    +typedef SHA256_CTX archive_sha256_ctx;
    +#  define archive_sha256_init(ctx)		SHA256Init(ctx)
    +#  define archive_sha256_final(ctx, buf)	SHA256Final(buf, ctx)
    +#  define archive_sha256_update(ctx, buf, n)	SHA256Update(ctx, buf, n)
    +#elif defined(HAVE_OPENSSL_SHA_H) && defined(HAVE_OPENSSL_SHA256_INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA256
    +typedef SHA256_CTX archive_sha256_ctx;
    +#  define archive_sha256_init(ctx)		SHA256_Init(ctx)
    +#  define archive_sha256_final(ctx, buf)	SHA256_Final(buf, ctx)
    +#  define archive_sha256_update(ctx, buf, n)	SHA256_Update(ctx, buf, n)
    +#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA_256)
    +#  define ARCHIVE_HAS_SHA256
    +typedef SHA256_CTX archive_sha256_ctx;
    +#  define archive_sha256_init(ctx)		SHA256_Init(ctx)
    +#  define archive_sha256_final(ctx, buf)	SHA256_Final(buf, ctx)
    +#  define archive_sha256_update(ctx, buf, n)	SHA256_Update(ctx, buf, n)
    +#endif
    +
    +#if defined(HAVE_SHA2_H) && defined(HAVE_SHA384_INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA384
    +typedef SHA384_CTX archive_sha384_ctx;
    +#  define archive_sha384_init(ctx)		SHA384_Init(ctx)
    +#  define archive_sha384_final(ctx, buf)	SHA384_Final(buf, ctx)
    +#  define archive_sha384_update(ctx, buf, n)	SHA384_Update(ctx, buf, n)
    +#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA384INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA384
    +typedef SHA384_CTX archive_sha384_ctx;
    +#  define archive_sha384_init(ctx)		SHA384Init(ctx)
    +#  define archive_sha384_final(ctx, buf)	SHA384Final(buf, ctx)
    +#  define archive_sha384_update(ctx, buf, n)	SHA384Update(ctx, buf, n)
    +#elif defined(HAVE_OPENSSL_SHA_H) && defined(HAVE_OPENSSL_SHA384_INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA384
    +typedef SHA512_CTX archive_sha384_ctx;
    +#  define archive_sha384_init(ctx)		SHA384_Init(ctx)
    +#  define archive_sha384_final(ctx, buf)	SHA384_Final(buf, ctx)
    +#  define archive_sha384_update(ctx, buf, n)	SHA384_Update(ctx, buf, n)
    +#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA_384)
    +#  define ARCHIVE_HAS_SHA384
    +typedef SHA512_CTX archive_sha384_ctx;
    +#  define archive_sha384_init(ctx)		SHA384_Init(ctx)
    +#  define archive_sha384_final(ctx, buf)	SHA384_Final(buf, ctx)
    +#  define archive_sha384_update(ctx, buf, n)	SHA384_Update(ctx, buf, n)
    +#endif
    +
    +#if defined(HAVE_SHA2_H) && defined(HAVE_SHA512_INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA512
    +typedef SHA512_CTX archive_sha512_ctx;
    +#  define archive_sha512_init(ctx)		SHA512_Init(ctx)
    +#  define archive_sha512_final(ctx, buf)	SHA512_Final(buf, ctx)
    +#  define archive_sha512_update(ctx, buf, n)	SHA512_Update(ctx, buf, n)
    +#elif defined(HAVE_SHA2_H) && defined(HAVE_SHA512INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA512
    +typedef SHA512_CTX archive_sha512_ctx;
    +#  define archive_sha512_init(ctx)		SHA512Init(ctx)
    +#  define archive_sha512_final(ctx, buf)	SHA512Final(buf, ctx)
    +#  define archive_sha512_update(ctx, buf, n)	SHA512Update(ctx, buf, n)
    +#elif defined(HAVE_OPENSSL_SHA_H) && defined(HAVE_OPENSSL_SHA512_INIT)
    +#  include 
    +#  define ARCHIVE_HAS_SHA512
    +typedef SHA512_CTX archive_sha512_ctx;
    +#  define archive_sha512_init(ctx)		SHA512_Init(ctx)
    +#  define archive_sha512_final(ctx, buf)	SHA512_Final(buf, ctx)
    +#  define archive_sha512_update(ctx, buf, n)	SHA512_Update(ctx, buf, n)
    +#elif defined(_WIN32) && !defined(__CYGWIN__) && defined(CALG_SHA_512)
    +#  define ARCHIVE_HAS_SHA512
    +typedef SHA512_CTX archive_sha512_ctx;
    +#  define archive_sha512_init(ctx)		SHA512_Init(ctx)
    +#  define archive_sha512_final(ctx, buf)	SHA512_Final(buf, ctx)
    +#  define archive_sha512_update(ctx, buf, n)	SHA512_Update(ctx, buf, n)
    +#endif
    diff --git a/lib/libarchive/archive_platform.h b/lib/libarchive/archive_platform.h
    index dbf51145a0bc..9dc4643644b4 100644
    --- a/lib/libarchive/archive_platform.h
    +++ b/lib/libarchive/archive_platform.h
    @@ -25,6 +25,8 @@
      * $FreeBSD$
      */
     
    +/* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */
    +
     /*
      * This header is the first thing included in any of the libarchive
      * source files.  As far as possible, platform-specific issues should
    @@ -50,17 +52,27 @@
     #error Oops: No config.h and no pre-built configuration in archive_platform.h.
     #endif
     
    +/* It should be possible to get rid of this by extending the feature-test
    + * macros to cover Windows API functions, probably along with non-trivial
    + * refactoring of code to find structures that sit more cleanly on top of
    + * either Windows or Posix APIs. */
    +#if (defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__)
    +#include "archive_windows.h"
    +#endif
    +
     /*
      * The config files define a lot of feature macros.  The following
      * uses those macros to select/define replacements and include key
      * headers as required.
      */
     
    -/* No non-FreeBSD platform will have __FBSDID, so just define it here. */
    -#ifdef __FreeBSD__
    -#include   /* For __FBSDID */
    -#else
    -/* Just leaving this macro replacement empty leads to a dangling semicolon. */
    +/* Get a real definition for __FBSDID if we can */
    +#if HAVE_SYS_CDEFS_H
    +#include 
    +#endif
    +
    +/* If not, define it so as to avoid dangling semicolons. */
    +#ifndef __FBSDID
     #define	__FBSDID(a)     struct _undefined_hack
     #endif
     
    @@ -72,6 +84,26 @@
     #include 
     #endif
     
    +/* Borland warns about its own constants!  */
    +#if defined(__BORLANDC__)
    +# if HAVE_DECL_UINT64_MAX
    +#  undef	UINT64_MAX
    +#  undef	HAVE_DECL_UINT64_MAX
    +# endif
    +# if HAVE_DECL_UINT64_MIN
    +#  undef	UINT64_MIN
    +#  undef	HAVE_DECL_UINT64_MIN
    +# endif
    +# if HAVE_DECL_INT64_MAX
    +#  undef	INT64_MAX
    +#  undef	HAVE_DECL_INT64_MAX
    +# endif
    +# if HAVE_DECL_INT64_MIN
    +#  undef	INT64_MIN
    +#  undef	HAVE_DECL_INT64_MIN
    +# endif
    +#endif
    +
     /* Some platforms lack the standard *_MAX definitions. */
     #if !HAVE_DECL_SIZE_MAX
     #define	SIZE_MAX (~(size_t)0)
    diff --git a/lib/libarchive/archive_private.h b/lib/libarchive/archive_private.h
    index 1b031332c7a4..e09ddce0f51b 100644
    --- a/lib/libarchive/archive_private.h
    +++ b/lib/libarchive/archive_private.h
    @@ -25,6 +25,10 @@
      * $FreeBSD$
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef ARCHIVE_PRIVATE_H_INCLUDED
     #define	ARCHIVE_PRIVATE_H_INCLUDED
     
    @@ -87,9 +91,11 @@ struct archive {
     	const char *compression_name;
     
     	/* Position in UNCOMPRESSED data stream. */
    -	off_t		  file_position;
    +	int64_t		  file_position;
     	/* Position in COMPRESSED data stream. */
    -	off_t		  raw_position;
    +	int64_t		  raw_position;
    +	/* Number of file entries processed. */
    +	int		  file_count;
     
     	int		  archive_error_number;
     	const char	 *error;
    @@ -107,4 +113,12 @@ int	__archive_parse_options(const char *p, const char *fn,
     
     #define	err_combine(a,b)	((a) < (b) ? (a) : (b))
     
    +#if defined(__BORLANDC__) || (defined(_MSC_VER) &&  _MSC_VER <= 1300)
    +# define	ARCHIVE_LITERAL_LL(x)	x##i64
    +# define	ARCHIVE_LITERAL_ULL(x)	x##ui64
    +#else
    +# define	ARCHIVE_LITERAL_LL(x)	x##ll
    +# define	ARCHIVE_LITERAL_ULL(x)	x##ull
    +#endif
    +
     #endif
    diff --git a/lib/libarchive/archive_read.c b/lib/libarchive/archive_read.c
    index fd4f888867bd..91c5aa58854a 100644
    --- a/lib/libarchive/archive_read.c
    +++ b/lib/libarchive/archive_read.c
    @@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
     
     static int	build_stream(struct archive_read *);
     static int	choose_format(struct archive_read *);
    +static int	cleanup_filters(struct archive_read *);
     static struct archive_vtable *archive_read_vtable(void);
     static int	_archive_read_close(struct archive *);
     static int	_archive_read_finish(struct archive *);
    @@ -121,6 +122,9 @@ archive_read_set_format_options(struct archive *_a, const char *s)
     	size_t i;
     	int len, r;
     
    +	__archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
    +	    "archive_read_set_format_options");
    +
     	if (s == NULL || *s == '\0')
     		return (ARCHIVE_OK);
     	a = (struct archive_read *)_a;
    @@ -165,12 +169,14 @@ archive_read_set_filter_options(struct archive *_a, const char *s)
     	char key[64], val[64];
     	int len, r;
     
    +	__archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
    +	    "archive_read_set_filter_options");
    +
     	if (s == NULL || *s == '\0')
     		return (ARCHIVE_OK);
     	a = (struct archive_read *)_a;
     	__archive_check_magic(&a->archive, ARCHIVE_READ_MAGIC,
     	    ARCHIVE_STATE_NEW, "archive_read_set_filter_options");
    -	filter = a->filter;
     	len = 0;
     	for (filter = a->filter; filter != NULL; filter = filter->upstream) {
     		bidder = filter->bidder;
    @@ -206,6 +212,10 @@ archive_read_set_options(struct archive *_a, const char *s)
     {
     	int r;
     
    +	__archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
    +	    "archive_read_set_options");
    +	archive_clear_error(_a);
    +
     	r = archive_read_set_format_options(_a, s);
     	if (r != ARCHIVE_OK)
     		return (r);
    @@ -242,13 +252,26 @@ client_read_proxy(struct archive_read_filter *self, const void **buff)
     static int64_t
     client_skip_proxy(struct archive_read_filter *self, int64_t request)
     {
    -	int64_t r;
    +	int64_t ask, get, total;
    +	/* Limit our maximum seek request to 1GB on platforms
    +	* with 32-bit off_t (such as Windows). */
    +	int64_t skip_limit = ((int64_t)1) << (sizeof(off_t) * 8 - 2);
    +
     	if (self->archive->client.skipper == NULL)
     		return (0);
    -	r = (self->archive->client.skipper)(&self->archive->archive,
    -	    self->data, request);
    -	self->archive->archive.raw_position += r;
    -	return (r);
    +	total = 0;
    +	for (;;) {
    +		ask = request;
    +		if (ask > skip_limit)
    +			ask = skip_limit;
    +		get = (self->archive->client.skipper)(&self->archive->archive,
    +			self->data, ask);
    +		if (get == 0)
    +			return (total);
    +		request -= get;
    +		self->archive->archive.raw_position += get;
    +		total += get;
    +	}
     }
     
     static int
    @@ -277,6 +300,7 @@ archive_read_open2(struct archive *_a, void *client_data,
     
     	__archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
     	    "archive_read_open");
    +	archive_clear_error(&a->archive);
     
     	if (client_reader == NULL)
     		__archive_errx(1,
    @@ -331,6 +355,7 @@ build_stream(struct archive_read *a)
     	int number_bidders, i, bid, best_bid;
     	struct archive_read_filter_bidder *bidder, *best_bidder;
     	struct archive_read_filter *filter;
    +	ssize_t avail;
     	int r;
     
     	for (;;) {
    @@ -370,6 +395,12 @@ build_stream(struct archive_read *a)
     			return (r);
     		}
     		a->filter = filter;
    +		/* Verify the filter by asking it for some data. */
    +		__archive_read_filter_ahead(filter, 1, &avail);
    +		if (avail < 0) {
    +			cleanup_filters(a);
    +			return (ARCHIVE_FATAL);
    +		}
     	}
     }
     
    @@ -386,6 +417,7 @@ archive_read_next_header2(struct archive *_a, struct archive_entry *entry)
     	    ARCHIVE_STATE_HEADER | ARCHIVE_STATE_DATA,
     	    "archive_read_next_header");
     
    +	++_a->file_count;
     	archive_entry_clear(entry);
     	archive_clear_error(&a->archive);
     
    @@ -706,18 +738,10 @@ _archive_read_close(struct archive *_a)
     
     	/* TODO: Clean up the formatters. */
     
    -	/* Clean up the filter pipeline. */
    -	while (a->filter != NULL) {
    -		struct archive_read_filter *t = a->filter->upstream;
    -		if (a->filter->close != NULL) {
    -			r1 = (a->filter->close)(a->filter);
    -			if (r1 < r)
    -				r = r1;
    -		}
    -		free(a->filter->buffer);
    -		free(a->filter);
    -		a->filter = t;
    -	}
    +	/* Release the filter objects. */
    +	r1 = cleanup_filters(a);
    +	if (r1 < r)
    +		r = r1;
     
     	/* Release the bidder objects. */
     	n = sizeof(a->bidders)/sizeof(a->bidders[0]);
    @@ -732,10 +756,29 @@ _archive_read_close(struct archive *_a)
     	return (r);
     }
     
    +static int
    +cleanup_filters(struct archive_read *a)
    +{
    +	int r = ARCHIVE_OK;
    +	/* Clean up the filter pipeline. */
    +	while (a->filter != NULL) {
    +		struct archive_read_filter *t = a->filter->upstream;
    +		if (a->filter->close != NULL) {
    +			int r1 = (a->filter->close)(a->filter);
    +			if (r1 < r)
    +				r = r1;
    +		}
    +		free(a->filter->buffer);
    +		free(a->filter);
    +		a->filter = t;
    +	}
    +	return r;
    +}
    +
     /*
      * Release memory and other resources.
      */
    -int
    +static int
     _archive_read_finish(struct archive *_a)
     {
     	struct archive_read *a = (struct archive_read *)_a;
    @@ -1120,6 +1163,8 @@ __archive_read_skip(struct archive_read *a, int64_t request)
     	if (skipped == request)
     		return (skipped);
     	/* We hit EOF before we satisfied the skip request. */
    +	if (skipped < 0)  // Map error code to 0 for error message below.
    +		skipped = 0;
     	archive_set_error(&a->archive,
     	    ARCHIVE_ERRNO_MISC,
     	    "Truncated input file (needed %jd bytes, only %jd available)",
    @@ -1139,7 +1184,7 @@ __archive_read_skip_lenient(struct archive_read *a, int64_t request)
     int64_t
     __archive_read_filter_skip(struct archive_read_filter *filter, int64_t request)
     {
    -	off_t bytes_skipped, total_bytes_skipped = 0;
    +	int64_t bytes_skipped, total_bytes_skipped = 0;
     	size_t min;
     
     	if (filter->fatal)
    @@ -1154,7 +1199,7 @@ __archive_read_filter_skip(struct archive_read_filter *filter, int64_t request)
     		total_bytes_skipped += bytes_skipped;
     	}
     	if (filter->client_avail > 0) {
    -		min = minimum(request, (off_t)filter->client_avail);
    +		min = minimum(request, (int64_t)filter->client_avail);
     		bytes_skipped = __archive_read_filter_consume(filter, min);
     		request -= bytes_skipped;
     		total_bytes_skipped += bytes_skipped;
    @@ -1188,10 +1233,8 @@ __archive_read_filter_skip(struct archive_read_filter *filter, int64_t request)
     	 * have to use ordinary reads to finish out the request.
     	 */
     	while (request > 0) {
    -		const void* dummy_buffer;
     		ssize_t bytes_read;
    -		dummy_buffer = __archive_read_filter_ahead(filter,
    -		    1, &bytes_read);
    +		(void)__archive_read_filter_ahead(filter, 1, &bytes_read);
     		if (bytes_read < 0)
     			return (bytes_read);
     		if (bytes_read == 0) {
    diff --git a/lib/libarchive/archive_read_disk_entry_from_file.c b/lib/libarchive/archive_read_disk_entry_from_file.c
    index 8f90191352aa..dbb7d7501dd3 100644
    --- a/lib/libarchive/archive_read_disk_entry_from_file.c
    +++ b/lib/libarchive/archive_read_disk_entry_from_file.c
    @@ -103,7 +103,7 @@ archive_read_disk_entry_from_file(struct archive *_a,
     	 * open file descriptor which we can use in the subsequent lookups. */
     	if ((S_ISREG(st->st_mode) || S_ISDIR(st->st_mode))) {
     		if (fd < 0)
    -			fd = open(pathname, O_RDONLY | O_NONBLOCK);
    +			fd = open(pathname, O_RDONLY | O_NONBLOCK | O_BINARY);
     		if (fd >= 0) {
     			unsigned long stflags;
     			int r = ioctl(fd, EXT2_IOC_GETFLAGS, &stflags);
    @@ -114,20 +114,34 @@ archive_read_disk_entry_from_file(struct archive *_a,
     #endif
     
     	if (st == NULL) {
    +		/* TODO: On Windows, use GetFileInfoByHandle() here.
    +		 * Using Windows stat() call is badly broken, but
    +		 * even the stat() wrapper has problems because
    +		 * 'struct stat' is broken on Windows.
    +		 */
     #if HAVE_FSTAT
     		if (fd >= 0) {
    -			if (fstat(fd, &s) != 0)
    -				return (ARCHIVE_FATAL);
    +			if (fstat(fd, &s) != 0) {
    +				archive_set_error(&a->archive, errno,
    +				    "Can't fstat");
    +				return (ARCHIVE_FAILED);
    +			}
     		} else
     #endif
     #if HAVE_LSTAT
     		if (!a->follow_symlinks) {
    -			if (lstat(path, &s) != 0)
    -				return (ARCHIVE_FATAL);
    +			if (lstat(path, &s) != 0) {
    +				archive_set_error(&a->archive, errno,
    +				    "Can't lstat %s", path);
    +				return (ARCHIVE_FAILED);
    +			}
     		} else
     #endif
    -		if (stat(path, &s) != 0)
    -			return (ARCHIVE_FATAL);
    +		if (stat(path, &s) != 0) {
    +			archive_set_error(&a->archive, errno,
    +			    "Can't stat %s", path);
    +			return (ARCHIVE_FAILED);
    +		}
     		st = &s;
     	}
     	archive_entry_copy_stat(entry, st);
    @@ -154,7 +168,7 @@ archive_read_disk_entry_from_file(struct archive *_a,
     		if (lnklen < 0) {
     			archive_set_error(&a->archive, errno,
     			    "Couldn't read link data");
    -			return (ARCHIVE_WARN);
    +			return (ARCHIVE_FAILED);
     		}
     		linkbuffer[lnklen] = 0;
     		archive_entry_set_symlink(entry, linkbuffer);
    diff --git a/lib/libarchive/archive_read_disk_private.h b/lib/libarchive/archive_read_disk_private.h
    index fd385a6b77e6..3e8884b613c7 100644
    --- a/lib/libarchive/archive_read_disk_private.h
    +++ b/lib/libarchive/archive_read_disk_private.h
    @@ -26,6 +26,10 @@
      * $FreeBSD$
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef ARCHIVE_READ_DISK_PRIVATE_H_INCLUDED
     #define ARCHIVE_READ_DISK_PRIVATE_H_INCLUDED
     
    diff --git a/lib/libarchive/archive_read_disk_set_standard_lookup.c b/lib/libarchive/archive_read_disk_set_standard_lookup.c
    index 60054f918f0f..dc2f67f8f07a 100644
    --- a/lib/libarchive/archive_read_disk_set_standard_lookup.c
    +++ b/lib/libarchive/archive_read_disk_set_standard_lookup.c
    @@ -195,6 +195,7 @@ lookup_uname_helper(struct name_cache *cache, id_t id)
     	if (cache->buff == NULL)
     		return (NULL);
     	for (;;) {
    +		result = &pwent; /* Old getpwuid_r ignores last arg. */
     		r = getpwuid_r((uid_t)id, &pwent,
     			       cache->buff, cache->buff_size, &result);
     		if (r == 0)
    @@ -243,6 +244,7 @@ lookup_gname_helper(struct name_cache *cache, id_t id)
     	if (cache->buff == NULL)
     		return (NULL);
     	for (;;) {
    +		result = &grent; /* Old getgrgid_r ignores last arg. */
     		r = getgrgid_r((gid_t)id, &grent,
     			       cache->buff, cache->buff_size, &result);
     		if (r == 0)
    diff --git a/lib/libarchive/archive_read_open_fd.c b/lib/libarchive/archive_read_open_fd.c
    index 259ddc28be59..8a7829b7fb0a 100644
    --- a/lib/libarchive/archive_read_open_fd.c
    +++ b/lib/libarchive/archive_read_open_fd.c
    @@ -32,6 +32,12 @@ __FBSDID("$FreeBSD$");
     #ifdef HAVE_ERRNO_H
     #include 
     #endif
    +#ifdef HAVE_FCNTL_H
    +#include 
    +#endif
    +#ifdef HAVE_IO_H
    +#include 
    +#endif
     #ifdef HAVE_STDLIB_H
     #include 
     #endif
    @@ -95,6 +101,9 @@ archive_read_open_fd(struct archive *a, int fd, size_t block_size)
     		mine->can_skip = 1;
     	} else
     		mine->can_skip = 0;
    +#if defined(__CYGWIN__) || defined(_WIN32)
    +	setmode(mine->fd, O_BINARY);
    +#endif
     
     	return (archive_read_open2(a, mine,
     		NULL, file_read, file_skip, file_close));
    diff --git a/lib/libarchive/archive_read_open_file.c b/lib/libarchive/archive_read_open_file.c
    index 37039e95a111..1575f94ca443 100644
    --- a/lib/libarchive/archive_read_open_file.c
    +++ b/lib/libarchive/archive_read_open_file.c
    @@ -35,6 +35,9 @@ __FBSDID("$FreeBSD$");
     #ifdef HAVE_FCNTL_H
     #include 
     #endif
    +#ifdef HAVE_IO_H
    +#include 
    +#endif
     #ifdef HAVE_STDLIB_H
     #include 
     #endif
    @@ -94,6 +97,10 @@ archive_read_open_FILE(struct archive *a, FILE *f)
     	} else
     		mine->can_skip = 0;
     
    +#if defined(__CYGWIN__) || defined(_WIN32)
    +	setmode(fileno(mine->f), O_BINARY);
    +#endif
    +
     	return (archive_read_open2(a, mine, NULL, file_read,
     		    file_skip, file_close));
     }
    diff --git a/lib/libarchive/archive_read_open_filename.c b/lib/libarchive/archive_read_open_filename.c
    index 64a89b52b3c9..ec0bb369e036 100644
    --- a/lib/libarchive/archive_read_open_filename.c
    +++ b/lib/libarchive/archive_read_open_filename.c
    @@ -35,6 +35,9 @@ __FBSDID("$FreeBSD$");
     #ifdef HAVE_FCNTL_H
     #include 
     #endif
    +#ifdef HAVE_IO_H
    +#include 
    +#endif
     #ifdef HAVE_STDLIB_H
     #include 
     #endif
    @@ -96,6 +99,9 @@ archive_read_open_filename(struct archive *a, const char *filename,
     		 */
     		filename = ""; /* Normalize NULL to "" */
     		fd = 0;
    +#if defined(__CYGWIN__) || defined(_WIN32)
    +		setmode(0, O_BINARY);
    +#endif
     	} else {
     		fd = open(filename, O_RDONLY | O_BINARY);
     		if (fd < 0) {
    diff --git a/lib/libarchive/archive_read_private.h b/lib/libarchive/archive_read_private.h
    index 394d6afc9d3b..ed8a889d4182 100644
    --- a/lib/libarchive/archive_read_private.h
    +++ b/lib/libarchive/archive_read_private.h
    @@ -25,6 +25,10 @@
      * $FreeBSD$
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef ARCHIVE_READ_PRIVATE_H_INCLUDED
     #define	ARCHIVE_READ_PRIVATE_H_INCLUDED
     
    @@ -160,7 +164,7 @@ struct archive_read {
     		int	(*read_data)(struct archive_read *, const void **, size_t *, off_t *);
     		int	(*read_data_skip)(struct archive_read *);
     		int	(*cleanup)(struct archive_read *);
    -	}	formats[8];
    +	}	formats[9];
     	struct archive_format_descriptor	*format; /* Active format. */
     
     	/*
    diff --git a/lib/libarchive/archive_read_support_compression_all.c b/lib/libarchive/archive_read_support_compression_all.c
    index 284eab5cb98d..bb7b66cf929a 100644
    --- a/lib/libarchive/archive_read_support_compression_all.c
    +++ b/lib/libarchive/archive_read_support_compression_all.c
    @@ -44,11 +44,15 @@ archive_read_support_compression_all(struct archive *a)
     	archive_read_support_compression_lzma(a);
     	/* Xz falls back to "unxz" command-line program. */
     	archive_read_support_compression_xz(a);
    +	/* The decode code doesn't use an outside library. */
    +	archive_read_support_compression_uu(a);
     
     	/* Note: We always return ARCHIVE_OK here, even if some of the
     	 * above return ARCHIVE_WARN.  The intent here is to enable
     	 * "as much as possible."  Clients who need specific
     	 * compression should enable those individually so they can
     	 * verify the level of support. */
    +	/* Clear any warning messages set by the above functions. */
    +	archive_clear_error(a);
     	return (ARCHIVE_OK);
     }
    diff --git a/lib/libarchive/archive_read_support_compression_bzip2.c b/lib/libarchive/archive_read_support_compression_bzip2.c
    index 693bdd63b707..e72e1c5adc88 100644
    --- a/lib/libarchive/archive_read_support_compression_bzip2.c
    +++ b/lib/libarchive/archive_read_support_compression_bzip2.c
    @@ -210,12 +210,11 @@ static ssize_t
     bzip2_filter_read(struct archive_read_filter *self, const void **p)
     {
     	struct private_data *state;
    -	size_t read_avail, decompressed;
    +	size_t decompressed;
     	const char *read_buf;
     	ssize_t ret;
     
     	state = (struct private_data *)self->data;
    -	read_avail = 0;
     
     	if (state->eof) {
     		*p = NULL;
    @@ -348,7 +347,7 @@ bzip2_filter_close(struct archive_read_filter *self)
     
     	free(state->out_block);
     	free(state);
    -	return (ARCHIVE_OK);
    +	return (ret);
     }
     
     #endif /* HAVE_BZLIB_H */
    diff --git a/lib/libarchive/archive_read_support_compression_compress.c b/lib/libarchive/archive_read_support_compression_compress.c
    index e115d25a2426..c6d4e8550e3e 100644
    --- a/lib/libarchive/archive_read_support_compression_compress.c
    +++ b/lib/libarchive/archive_read_support_compression_compress.c
    @@ -229,8 +229,8 @@ compress_bidder_init(struct archive_read_filter *self)
     
     	/* XXX MOVE THE FOLLOWING OUT OF INIT() XXX */
     
    -	code = getbits(self, 8); /* Skip first signature byte. */
    -	code = getbits(self, 8); /* Skip second signature byte. */
    +	(void)getbits(self, 8); /* Skip first signature byte. */
    +	(void)getbits(self, 8); /* Skip second signature byte. */
     
     	code = getbits(self, 8);
     	state->maxcode_bits = code & 0x1f;
    diff --git a/lib/libarchive/archive_read_support_compression_gzip.c b/lib/libarchive/archive_read_support_compression_gzip.c
    index b20c7697b14d..bf6ee468be76 100644
    --- a/lib/libarchive/archive_read_support_compression_gzip.c
    +++ b/lib/libarchive/archive_read_support_compression_gzip.c
    @@ -411,6 +411,8 @@ gzip_filter_read(struct archive_read_filter *self, const void **p)
     			/* Consume the stream trailer; release the
     			 * decompression library. */
     			ret = consume_trailer(self);
    +			if (ret < ARCHIVE_OK)
    +				return (ret);
     			break;
     		default:
     			/* Return an error. */
    diff --git a/lib/libarchive/archive_read_support_compression_program.c b/lib/libarchive/archive_read_support_compression_program.c
    index 21c2377b53f3..01552ba69e98 100644
    --- a/lib/libarchive/archive_read_support_compression_program.c
    +++ b/lib/libarchive/archive_read_support_compression_program.c
    @@ -205,7 +205,7 @@ program_bidder_bid(struct archive_read_filter_bidder *self,
     		/* No match, so don't bid. */
     		if (memcmp(p, state->signature, state->signature_len) != 0)
     			return (0);
    -		return (state->signature_len * 8);
    +		return ((int)state->signature_len * 8);
     	}
     
     	/* Otherwise, bid once and then never bid again. */
    @@ -251,6 +251,7 @@ child_stop(struct archive_read_filter *self, struct program_filter *state)
     		return (ARCHIVE_WARN);
     	}
     
    +#if !defined(_WIN32) || defined(__CYGWIN__)
     	if (WIFSIGNALED(state->exit_status)) {
     #ifdef SIGPIPE
     		/* If the child died because we stopped reading before
    @@ -267,6 +268,7 @@ child_stop(struct archive_read_filter *self, struct program_filter *state)
     		    WTERMSIG(state->exit_status));
     		return (ARCHIVE_WARN);
     	}
    +#endif /* !_WIN32 || __CYGWIN__ */
     
     	if (WIFEXITED(state->exit_status)) {
     		if (WEXITSTATUS(state->exit_status) == 0)
    diff --git a/lib/libarchive/archive_read_support_compression_uu.c b/lib/libarchive/archive_read_support_compression_uu.c
    new file mode 100644
    index 000000000000..5f397d67d3c5
    --- /dev/null
    +++ b/lib/libarchive/archive_read_support_compression_uu.c
    @@ -0,0 +1,627 @@
    +/*-
    + * Copyright (c) 2009 Michihiro NAKAJIMA
    + * 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(S) ``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(S) 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 "archive_platform.h"
    +__FBSDID("$FreeBSD$");
    +
    +#ifdef HAVE_ERRNO_H
    +#include 
    +#endif
    +#ifdef HAVE_STDLIB_H
    +#include 
    +#endif
    +#ifdef HAVE_STRING_H
    +#include 
    +#endif
    +
    +#include "archive.h"
    +#include "archive_private.h"
    +#include "archive_read_private.h"
    +
    +struct uudecode {
    +	int64_t		 total;
    +	unsigned char	*in_buff;
    +#define IN_BUFF_SIZE	(1024)
    +	int		 in_cnt;
    +	size_t		 in_allocated;
    +	unsigned char	*out_buff;
    +#define OUT_BUFF_SIZE	(64 * 1024)
    +	int		 state;
    +#define ST_FIND_HEAD	0
    +#define ST_READ_UU	1
    +#define ST_UUEND	2
    +#define ST_READ_BASE64	3
    +};
    +
    +static int	uudecode_bidder_bid(struct archive_read_filter_bidder *,
    +		    struct archive_read_filter *filter);
    +static int	uudecode_bidder_init(struct archive_read_filter *);
    +
    +static ssize_t	uudecode_filter_read(struct archive_read_filter *,
    +		    const void **);
    +static int	uudecode_filter_close(struct archive_read_filter *);
    +
    +int
    +archive_read_support_compression_uu(struct archive *_a)
    +{
    +	struct archive_read *a = (struct archive_read *)_a;
    +	struct archive_read_filter_bidder *bidder;
    +
    +	bidder = __archive_read_get_bidder(a);
    +	archive_clear_error(_a);
    +	if (bidder == NULL)
    +		return (ARCHIVE_FATAL);
    +
    +	bidder->data = NULL;
    +	bidder->bid = uudecode_bidder_bid;
    +	bidder->init = uudecode_bidder_init;
    +	bidder->options = NULL;
    +	bidder->free = NULL;
    +	return (ARCHIVE_OK);
    +}
    +
    +static const unsigned char ascii[256] = {
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\n', 0, 0, '\r', 0, 0, /* 00 - 0F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 - 1F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 20 - 2F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 30 - 3F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 - 4F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 50 - 5F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 60 - 6F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* 70 - 7F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 - 8F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 - 9F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A0 - AF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* B0 - BF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* C0 - CF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* D0 - DF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* E0 - EF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* F0 - FF */
    +};
    +
    +static const unsigned char uuchar[256] = {
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 00 - 0F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 - 1F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 20 - 2F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 30 - 3F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 - 4F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 50 - 5F */
    +	1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 60 - 6F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 - 7F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 - 8F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 - 9F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A0 - AF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* B0 - BF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* C0 - CF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* D0 - DF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* E0 - EF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* F0 - FF */
    +};
    +
    +static const unsigned char base64[256] = {
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 00 - 0F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 - 1F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, /* 20 - 2F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, /* 30 - 3F */
    +	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 - 4F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 50 - 5F */
    +	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 60 - 6F */
    +	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 70 - 7F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 - 8F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 - 9F */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A0 - AF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* B0 - BF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* C0 - CF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* D0 - DF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* E0 - EF */
    +	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* F0 - FF */
    +};
    +
    +static const int base64num[128] = {
    +	 0,  0,  0,  0,  0,  0,  0,  0,
    +	 0,  0,  0,  0,  0,  0,  0,  0, /* 00 - 0F */
    +	 0,  0,  0,  0,  0,  0,  0,  0,
    +	 0,  0,  0,  0,  0,  0,  0,  0, /* 10 - 1F */
    +	 0,  0,  0,  0,  0,  0,  0,  0,
    +	 0,  0,  0, 62,  0,  0,  0, 63, /* 20 - 2F */
    +	52, 53, 54, 55, 56, 57, 58, 59,
    +	60, 61,  0,  0,  0,  0,  0,  0, /* 30 - 3F */
    +	 0,  0,  1,  2,  3,  4,  5,  6,
    +	 7,  8,  9, 10, 11, 12, 13, 14, /* 40 - 4F */
    +	15, 16, 17, 18, 19, 20, 21, 22,
    +	23, 24, 25,  0,  0,  0,  0,  0, /* 50 - 5F */
    +	 0, 26, 27, 28, 29, 30, 31, 32,
    +	33, 34, 35, 36, 37, 38, 39, 40, /* 60 - 6F */
    +	41, 42, 43, 44, 45, 46, 47, 48,
    +	49, 50, 51,  0,  0,  0,  0,  0, /* 70 - 7F */
    +};
    +
    +static ssize_t
    +get_line(const unsigned char *b, ssize_t avail, ssize_t *nlsize)
    +{
    +	ssize_t len;
    +
    +	len = 0;
    +	while (len < avail) {
    +		switch (ascii[*b]) {
    +		case 0:	/* Non-ascii character or control character. */
    +			if (nlsize != NULL)
    +				*nlsize = 0;
    +			return (-1);
    +		case '\r':
    +			if (avail-len > 1 && b[1] == '\n') {
    +				if (nlsize != NULL)
    +					*nlsize = 2;
    +				return (len+2);
    +			}
    +			/* FALL THROUGH */
    +		case '\n':
    +			if (nlsize != NULL)
    +				*nlsize = 1;
    +			return (len+1);
    +		case 1:
    +			b++;
    +			len++;
    +			break;
    +		}
    +	}
    +	if (nlsize != NULL)
    +		*nlsize = 0;
    +	return (avail);
    +}
    +
    +static ssize_t
    +bid_get_line(struct archive_read_filter *filter,
    +    const unsigned char **b, ssize_t *avail, ssize_t *ravail, ssize_t *nl)
    +{
    +	ssize_t len;
    +	int quit;
    +	
    +	quit = 0;
    +	if (*avail == 0) {
    +		*nl = 0;
    +		len = 0;
    +	} else
    +		len = get_line(*b, *avail, nl);
    +	/*
    +	 * Read bytes more while it does not reach the end of line.
    +	 */
    +	while (*nl == 0 && len == *avail && !quit) {
    +		ssize_t diff = *ravail - *avail;
    +
    +		*b = __archive_read_filter_ahead(filter, 160 + *ravail, avail);
    +		if (*b == NULL) {
    +			if (*ravail >= *avail)
    +				return (0);
    +			/* Reading bytes reaches the end of file. */
    +			*b = __archive_read_filter_ahead(filter, *avail, avail);
    +			quit = 1;
    +		}
    +		*ravail = *avail;
    +		*b += diff;
    +		*avail -= diff;
    +		len = get_line(*b, *avail, nl);
    +	}
    +	return (len);
    +}
    +
    +#define UUDECODE(c) (((c) - 0x20) & 0x3f)
    +
    +static int
    +uudecode_bidder_bid(struct archive_read_filter_bidder *self,
    +    struct archive_read_filter *filter)
    +{
    +	const unsigned char *b;
    +	ssize_t avail, ravail;
    +	ssize_t len, nl;
    +	int l;
    +	int firstline;
    +
    +	(void)self; /* UNUSED */
    +
    +	b = __archive_read_filter_ahead(filter, 1, &avail);
    +	if (b == NULL)
    +		return (0);
    +
    +	firstline = 20;
    +	ravail = avail;
    +	for (;;) {
    +		len = bid_get_line(filter, &b, &avail, &ravail, &nl);
    +		if (len < 0 || nl == 0)
    +			return (0);/* Binary data. */
    +		if (memcmp(b, "begin ", 6) == 0 && len - nl >= 11)
    +			l = 6;
    +		else if (memcmp(b, "begin-base64 ", 13) == 0 && len - nl >= 18)
    +			l = 13;
    +		else
    +			l = 0;
    +
    +		if (l > 0 && (b[l] < '0' || b[l] > '7' ||
    +		    b[l+1] < '0' || b[l+1] > '7' ||
    +		    b[l+2] < '0' || b[l+2] > '7' || b[l+3] != ' '))
    +			l = 0;
    +
    +		b += len;
    +		avail -= len;
    +		if (l)
    +			break;
    +		firstline = 0;
    +	}
    +	if (!avail)
    +		return (0);
    +	len = bid_get_line(filter, &b, &avail, &ravail, &nl);
    +	if (len < 0 || nl == 0)
    +		return (0);/* There are non-ascii characters. */
    +	avail -= len;
    +
    +	if (l == 6) {
    +		if (!uuchar[*b])
    +			return (0);
    +		/* Get a length of decoded bytes. */
    +		l = UUDECODE(*b++); len--;
    +		if (l > 45)
    +			/* Normally, maximum length is 45(character 'M'). */
    +			return (0);
    +		while (l && len-nl > 0) {
    +			if (l > 0) {
    +				if (!uuchar[*b++])
    +					return (0);
    +				if (!uuchar[*b++])
    +					return (0);
    +				len -= 2;
    +				--l;
    +			}
    +			if (l > 0) {
    +				if (!uuchar[*b++])
    +					return (0);
    +				--len;
    +				--l;
    +			}
    +			if (l > 0) {
    +				if (!uuchar[*b++])
    +					return (0);
    +				--len;
    +				--l;
    +			}
    +		}
    +		if (len-nl < 0)
    +			return (0);
    +		if (len-nl == 1 &&
    +		    (uuchar[*b] ||		 /* Check sum. */
    +		     (*b >= 'a' && *b <= 'z'))) {/* Padding data(MINIX). */
    +			++b;
    +			--len;
    +		}
    +		b += nl;
    +		if (avail && uuchar[*b])
    +			return (firstline+30);
    +	}
    +	if (l == 13) {
    +		while (len-nl > 0) {
    +			if (!base64[*b++])
    +				return (0);
    +			--len;
    +		}
    +		b += nl;
    +		
    +		if (avail >= 5 && memcmp(b, "====\n", 5) == 0)
    +			return (firstline+40);
    +		if (avail >= 6 && memcmp(b, "====\r\n", 6) == 0)
    +			return (firstline+40);
    +		if (avail > 0 && base64[*b])
    +			return (firstline+30);
    +	}
    +
    +	return (0);
    +}
    +
    +static int
    +uudecode_bidder_init(struct archive_read_filter *self)
    +{
    +	struct uudecode   *uudecode;
    +	void *out_buff;
    +	void *in_buff;
    +
    +	self->code = ARCHIVE_COMPRESSION_UU;
    +	self->name = "uu";
    +	self->read = uudecode_filter_read;
    +	self->skip = NULL; /* not supported */
    +	self->close = uudecode_filter_close;
    +
    +	uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1);
    +	out_buff = malloc(OUT_BUFF_SIZE);
    +	in_buff = malloc(IN_BUFF_SIZE);
    +	if (uudecode == NULL || out_buff == NULL || in_buff == NULL) {
    +		archive_set_error(&self->archive->archive, ENOMEM,
    +		    "Can't allocate data for uudecode");
    +		free(uudecode);
    +		free(out_buff);
    +		free(in_buff);
    +		return (ARCHIVE_FATAL);
    +	}
    +
    +	self->data = uudecode;
    +	uudecode->in_buff = in_buff;
    +	uudecode->in_cnt = 0;
    +	uudecode->in_allocated = IN_BUFF_SIZE;
    +	uudecode->out_buff = out_buff;
    +	uudecode->state = ST_FIND_HEAD;
    +
    +	return (ARCHIVE_OK);
    +}
    +
    +static int
    +ensure_in_buff_size(struct archive_read_filter *self,
    +    struct uudecode *uudecode, size_t size)
    +{
    +
    +	if (size > uudecode->in_allocated) {
    +		unsigned char *ptr;
    +		size_t newsize;
    +
    +		newsize = uudecode->in_allocated << 1;
    +		ptr = malloc(newsize);
    +		if (ptr == NULL ||
    +		    newsize < uudecode->in_allocated) {
    +			free(ptr);
    +			archive_set_error(&self->archive->archive,
    +			    ENOMEM,
    +    			    "Can't allocate data for uudecode");
    +			return (ARCHIVE_FATAL);
    +		}
    +		if (uudecode->in_cnt)
    +			memmove(ptr, uudecode->in_buff,
    +			    uudecode->in_cnt);
    +		free(uudecode->in_buff);
    +		uudecode->in_buff = ptr;
    +		uudecode->in_allocated = newsize;
    +	}
    +	return (ARCHIVE_OK);
    +}
    +
    +static ssize_t
    +uudecode_filter_read(struct archive_read_filter *self, const void **buff)
    +{
    +	struct uudecode *uudecode;
    +	const unsigned char *b, *d;
    +	unsigned char *out;
    +	ssize_t avail_in, ravail;
    +	ssize_t used;
    +	ssize_t total;
    +	ssize_t len, llen, nl;
    +
    +	uudecode = (struct uudecode *)self->data;
    +
    +read_more:
    +	d = __archive_read_filter_ahead(self->upstream, 1, &avail_in);
    +	if (d == NULL && avail_in < 0)
    +		return (ARCHIVE_FATAL);
    +	/* Quiet a code analyzer; make sure avail_in must be zero
    +	 * when d is NULL. */
    +	if (d == NULL)
    +		avail_in = 0;
    +	used = 0;
    +	total = 0;
    +	out = uudecode->out_buff;
    +	ravail = avail_in;
    +	if (uudecode->in_cnt) {
    +		/*
    +		 * If there is remaining data which is saved by
    +		 * previous calling, use it first.
    +		 */
    +		if (ensure_in_buff_size(self, uudecode,
    +		    avail_in + uudecode->in_cnt) != ARCHIVE_OK)
    +			return (ARCHIVE_FATAL);
    +		memcpy(uudecode->in_buff + uudecode->in_cnt,
    +		    d, avail_in);
    +		d = uudecode->in_buff;
    +		avail_in += uudecode->in_cnt;
    +		uudecode->in_cnt = 0;
    +	}
    +	for (;used < avail_in; d += llen, used += llen) {
    +		int l, body;
    +
    +		b = d;
    +		len = get_line(b, avail_in - used, &nl);
    +		if (len < 0) {
    +			/* Non-ascii character is found. */
    +			archive_set_error(&self->archive->archive,
    +			    ARCHIVE_ERRNO_MISC,
    +			    "Insufficient compressed data");
    +			return (ARCHIVE_FATAL);
    +		}
    +		llen = len;
    +		if (nl == 0) {
    +			/*
    +			 * Save remaining data which does not contain
    +			 * NL('\n','\r').
    +			 */
    +			if (ensure_in_buff_size(self, uudecode, len)
    +			    != ARCHIVE_OK)
    +				return (ARCHIVE_FATAL);
    +			if (uudecode->in_buff != b)
    +				memmove(uudecode->in_buff, b, len);
    +			uudecode->in_cnt = len;
    +			if (total == 0) {
    +				/* Do not return 0; it means end-of-file.
    +				 * We should try to read bytes more. */
    +				__archive_read_filter_consume(
    +				    self->upstream, ravail);
    +				goto read_more;
    +			}
    +			break;
    +		}
    +		if (total + len * 2 > OUT_BUFF_SIZE)
    +			break;
    +		switch (uudecode->state) {
    +		default:
    +		case ST_FIND_HEAD:
    +			if (len - nl > 13 && memcmp(b, "begin ", 6) == 0)
    +				l = 6;
    +			else if (len - nl > 18 &&
    +			    memcmp(b, "begin-base64 ", 13) == 0)
    +				l = 13;
    +			else
    +				l = 0;
    +			if (l != 0 && b[l] >= '0' && b[l] <= '7' &&
    +			    b[l+1] >= '0' && b[l+1] <= '7' &&
    +			    b[l+2] >= '0' && b[l+2] <= '7' && b[l+3] == ' ') {
    +				if (l == 6)
    +					uudecode->state = ST_READ_UU;
    +				else
    +					uudecode->state = ST_READ_BASE64;
    +			}
    +			break;
    +		case ST_READ_UU:
    +			body = len - nl;
    +			if (!uuchar[*b] || body <= 0) {
    +				archive_set_error(&self->archive->archive,
    +				    ARCHIVE_ERRNO_MISC,
    +				    "Insufficient compressed data");
    +				return (ARCHIVE_FATAL);
    +			}
    +			/* Get length of undecoded bytes of curent line. */
    +			l = UUDECODE(*b++);
    +			body--;
    +			if (l > body) {
    +				archive_set_error(&self->archive->archive,
    +				    ARCHIVE_ERRNO_MISC,
    +				    "Insufficient compressed data");
    +				return (ARCHIVE_FATAL);
    +			}
    +			if (l == 0) {
    +				uudecode->state = ST_UUEND;
    +				break;
    +			}
    +			while (l > 0) {
    +				int n = 0;
    +
    +				if (l > 0) {
    +					if (!uuchar[b[0]] || !uuchar[b[1]])
    +						break;
    +					n = UUDECODE(*b++) << 18;
    +					n |= UUDECODE(*b++) << 12;
    +					*out++ = n >> 16; total++;
    +					--l;
    +				}
    +				if (l > 0) {
    +					if (!uuchar[b[0]])
    +						break;
    +					n |= UUDECODE(*b++) << 6;
    +					*out++ = (n >> 8) & 0xFF; total++;
    +					--l;
    +				}
    +				if (l > 0) {
    +					if (!uuchar[b[0]])
    +						break;
    +					n |= UUDECODE(*b++);
    +					*out++ = n & 0xFF; total++;
    +					--l;
    +				}
    +			}
    +			if (l) {
    +				archive_set_error(&self->archive->archive,
    +				    ARCHIVE_ERRNO_MISC,
    +				    "Insufficient compressed data");
    +				return (ARCHIVE_FATAL);
    +			}
    +			break;
    +		case ST_UUEND:
    +			if (len - nl == 3 && memcmp(b, "end ", 3) == 0)
    +				uudecode->state = ST_FIND_HEAD;
    +			else {
    +				archive_set_error(&self->archive->archive,
    +				    ARCHIVE_ERRNO_MISC,
    +				    "Insufficient compressed data");
    +				return (ARCHIVE_FATAL);
    +			}
    +			break;
    +		case ST_READ_BASE64:
    +			l = len - nl;
    +			if (l >= 3 && b[0] == '=' && b[1] == '=' &&
    +			    b[2] == '=') {
    +				uudecode->state = ST_FIND_HEAD;
    +				break;
    +			}
    +			while (l > 0) {
    +				int n = 0;
    +
    +				if (l > 0) {
    +					if (!base64[b[0]] || !base64[b[1]])
    +						break;
    +					n = base64num[*b++] << 18;
    +					n |= base64num[*b++] << 12;
    +					*out++ = n >> 16; total++;
    +					l -= 2;
    +				}
    +				if (l > 0) {
    +					if (*b == '=')
    +						break;
    +					if (!base64[*b])
    +						break;
    +					n |= base64num[*b++] << 6;
    +					*out++ = (n >> 8) & 0xFF; total++;
    +					--l;
    +				}
    +				if (l > 0) {
    +					if (*b == '=')
    +						break;
    +					if (!base64[*b])
    +						break;
    +					n |= base64num[*b++];
    +					*out++ = n & 0xFF; total++;
    +					--l;
    +				}
    +			}
    +			if (l && *b != '=') {
    +				archive_set_error(&self->archive->archive,
    +				    ARCHIVE_ERRNO_MISC,
    +				    "Insufficient compressed data");
    +				return (ARCHIVE_FATAL);
    +			}
    +			break;
    +		}
    +	}
    +
    +	__archive_read_filter_consume(self->upstream, ravail);
    +
    +	*buff = uudecode->out_buff;
    +	uudecode->total += total;
    +	return (total);
    +}
    +
    +static int
    +uudecode_filter_close(struct archive_read_filter *self)
    +{
    +	struct uudecode *uudecode;
    +
    +	uudecode = (struct uudecode *)self->data;
    +	free(uudecode->in_buff);
    +	free(uudecode->out_buff);
    +	free(uudecode);
    +
    +	return (ARCHIVE_OK);
    +}
    +
    diff --git a/lib/libarchive/archive_read_support_compression_xz.c b/lib/libarchive/archive_read_support_compression_xz.c
    index d3f429786790..1554d99b38d4 100644
    --- a/lib/libarchive/archive_read_support_compression_xz.c
    +++ b/lib/libarchive/archive_read_support_compression_xz.c
    @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
     #endif
     
     #include "archive.h"
    +#include "archive_endian.h"
     #include "archive_private.h"
     #include "archive_read_private.h"
     
    @@ -205,37 +206,100 @@ lzma_bidder_bid(struct archive_read_filter_bidder *self,
     {
     	const unsigned char *buffer;
     	ssize_t avail;
    +	uint32_t dicsize;
    +	uint64_t uncompressed_size;
     	int bits_checked;
     
     	(void)self; /* UNUSED */
     
    -	buffer = __archive_read_filter_ahead(filter, 6, &avail);
    +	buffer = __archive_read_filter_ahead(filter, 14, &avail);
     	if (buffer == NULL)
     		return (0);
     
    -	/* First byte of raw LZMA stream is always 0x5d. */
    +	/* First byte of raw LZMA stream is commonly 0x5d.
    +	 * The first byte is a special number, which consists of
    +	 * three parameters of LZMA compression, a number of literal
    +	 * context bits(which is from 0 to 8, default is 3), a number
    +	 * of literal pos bits(which is from 0 to 4, default is 0),
    +	 * a number of pos bits(which is from 0 to 4, default is 2).
    +	 * The first byte is made by
    +	 * (pos bits * 5 + literal pos bit) * 9 + * literal contest bit,
    +	 * and so the default value in this field is
    +	 * (2 * 5 + 0) * 9 + 3 = 0x5d.
    +	 * lzma of LZMA SDK has options to change those parameters.
    +	 * It means a range of this field is from 0 to 224. And lzma of
    +	 * XZ Utils with option -e records 0x5e in this field. */
    +	/* NOTE: If this checking of the first byte increases false
    +	 * recognition, we should allow only 0x5d and 0x5e for the first
    +	 * byte of LZMA stream. */
     	bits_checked = 0;
    -	if (buffer[0] != 0x5d)
    +	if (buffer[0] > (4 * 5 + 4) * 9 + 8)
     		return (0);
    -	bits_checked += 8;
    +	/* Most likely value in the first byte of LZMA stream. */
    +	if (buffer[0] == 0x5d || buffer[0] == 0x5e)
    +		bits_checked += 8;
     
    -	/* Second through fifth bytes are dictionary code, stored in
    -	 * little-endian order.  The two least-significant bytes are
    -	 * always zero. */
    -	if (buffer[1] != 0 || buffer[2] != 0)
    -		return (0);
    -	bits_checked += 16;
    +	/* Sixth through fourteenth bytes are uncompressed size,
    +	 * stored in little-endian order. `-1' means uncompressed
    +	 * size is unknown and lzma of XZ Utils always records `-1'
    +	 * in this field. */
    +	uncompressed_size = archive_le64dec(buffer+5);
    +	if (uncompressed_size == (uint64_t)ARCHIVE_LITERAL_LL(-1))
    +		bits_checked += 64;
     
    -	/* ??? TODO:  Fix this. ??? */
    -	/* NSIS format check uses this, but I've seen tar.lzma
    -	 * archives where this byte is 0xff, not 0.  Can it
    -	 * ever be anything other than 0 or 0xff?
    -	 */
    -#if 0
    -	if (buffer[5] != 0)
    +	/* Second through fifth bytes are dictionary size, stored in
    +	 * little-endian order. The minimum dictionary size is
    +	 * 1 << 12(4KiB) which the lzma of LZMA SDK uses with option
    +	 * -d12 and the maxinam dictionary size is 1 << 27(128MiB)
    +	 * which the one uses with option -d27.
    +	 * NOTE: A comment of LZMA SDK source code says this dictionary
    +	 * range is from 1 << 12 to 1 << 30. */
    +	dicsize = archive_le32dec(buffer+1);
    +	switch (dicsize) {
    +	case 0x00001000:/* lzma of LZMA SDK option -d12. */
    +	case 0x00002000:/* lzma of LZMA SDK option -d13. */
    +	case 0x00004000:/* lzma of LZMA SDK option -d14. */
    +	case 0x00008000:/* lzma of LZMA SDK option -d15. */
    +	case 0x00010000:/* lzma of XZ Utils option -0 and -1.
    +			 * lzma of LZMA SDK option -d16. */
    +	case 0x00020000:/* lzma of LZMA SDK option -d17. */
    +	case 0x00040000:/* lzma of LZMA SDK option -d18. */
    +	case 0x00080000:/* lzma of XZ Utils option -2.
    +			 * lzma of LZMA SDK option -d19. */
    +	case 0x00100000:/* lzma of XZ Utils option -3.
    +			 * lzma of LZMA SDK option -d20. */
    +	case 0x00200000:/* lzma of XZ Utils option -4.
    +			 * lzma of LZMA SDK option -d21. */
    +	case 0x00400000:/* lzma of XZ Utils option -5.
    +			 * lzma of LZMA SDK option -d22. */
    +	case 0x00800000:/* lzma of XZ Utils option -6.
    +			 * lzma of LZMA SDK option -d23. */
    +	case 0x01000000:/* lzma of XZ Utils option -7.
    +			 * lzma of LZMA SDK option -d24. */
    +	case 0x02000000:/* lzma of XZ Utils option -8.
    +			 * lzma of LZMA SDK option -d25. */
    +	case 0x04000000:/* lzma of XZ Utils option -9.
    +			 * lzma of LZMA SDK option -d26. */
    +	case 0x08000000:/* lzma of LZMA SDK option -d27. */
    +		bits_checked += 32;
    +		break;
    +	default:
    +		/* If a memory usage for encoding was not enough on
    +		 * the platform where LZMA stream was made, lzma of
    +		 * XZ Utils automatically decreased the dictionary
    +		 * size to enough memory for encoding by 1Mi bytes
    +		 * (1 << 20).*/
    +		if (dicsize <= 0x03F00000 && dicsize >= 0x00300000 &&
    +		    (dicsize & ((1 << 20)-1)) == 0 &&
    +		    bits_checked == 8 + 64) {
    +			bits_checked += 32;
    +			break;
    +		}
    +		/* Otherwise dictionary size is unlikely. But it is
    +		 * possible that someone makes lzma stream with
    +		 * liblzma/LZMA SDK in one's dictionary size. */
     		return (0);
    -	bits_checked += 8;
    -#endif
    +	}
     
     	/* TODO: The above test is still very weak.  It would be
     	 * good to do better. */
    @@ -304,11 +368,11 @@ xz_lzma_bidder_init(struct archive_read_filter *self)
     	 */
     	if (self->code == ARCHIVE_COMPRESSION_XZ)
     		ret = lzma_stream_decoder(&(state->stream),
    -		    (1U << 23) + (1U << 21),/* memlimit */
    +		    (1U << 30),/* memlimit */
     		    LZMA_CONCATENATED);
     	else
     		ret = lzma_alone_decoder(&(state->stream),
    -		    (1U << 23) + (1U << 21));/* memlimit */
    +		    (1U << 30));/* memlimit */
     
     	if (ret == LZMA_OK)
     		return (ARCHIVE_OK);
    diff --git a/lib/libarchive/archive_read_support_format_ar.c b/lib/libarchive/archive_read_support_format_ar.c
    index 0992b277e72b..8b95f2216ed4 100644
    --- a/lib/libarchive/archive_read_support_format_ar.c
    +++ b/lib/libarchive/archive_read_support_format_ar.c
    @@ -40,6 +40,9 @@ __FBSDID("$FreeBSD$");
     #ifdef HAVE_STRING_H
     #include 
     #endif
    +#ifdef HAVE_LIMITS_H
    +#include 
    +#endif
     
     #include "archive.h"
     #include "archive_entry.h"
    @@ -134,7 +137,6 @@ archive_read_format_ar_cleanup(struct archive_read *a)
     static int
     archive_read_format_ar_bid(struct archive_read *a)
     {
    -	struct ar *ar;
     	const void *h;
     
     	if (a->archive.archive_format != 0 &&
    @@ -142,8 +144,6 @@ archive_read_format_ar_bid(struct archive_read *a)
     	    ARCHIVE_FORMAT_AR)
     		return(0);
     
    -	ar = (struct ar *)(a->format->data);
    -
     	/*
     	 * Verify the 8-byte file signature.
     	 * TODO: Do we need to check more than this?
    diff --git a/lib/libarchive/archive_read_support_format_cpio.c b/lib/libarchive/archive_read_support_format_cpio.c
    index 3bf05ce977e3..7e52fbe1b81b 100644
    --- a/lib/libarchive/archive_read_support_format_cpio.c
    +++ b/lib/libarchive/archive_read_support_format_cpio.c
    @@ -92,7 +92,7 @@ struct links_entry {
             struct links_entry      *previous;
             int                      links;
             dev_t                    dev;
    -        ino_t                    ino;
    +        int64_t                  ino;
             char                    *name;
     };
     
    @@ -356,7 +356,7 @@ find_newc_header(struct archive_read *a)
     		 * Scan ahead until we find something that looks
     		 * like an odc header.
     		 */
    -		while (p + sizeof(struct cpio_newc_header) < q) {
    +		while (p + sizeof(struct cpio_newc_header) <= q) {
     			switch (p[5]) {
     			case '1':
     			case '2':
    @@ -490,7 +490,7 @@ find_odc_header(struct archive_read *a)
     		 * Scan ahead until we find something that looks
     		 * like an odc header.
     		 */
    -		while (p + sizeof(struct cpio_odc_header) < q) {
    +		while (p + sizeof(struct cpio_odc_header) <= q) {
     			switch (p[5]) {
     			case '7':
     				if (memcmp("070707", p, 6) == 0
    @@ -727,48 +727,51 @@ atol16(const char *p, unsigned char_cnt)
     static void
     record_hardlink(struct cpio *cpio, struct archive_entry *entry)
     {
    -        struct links_entry      *le;
    +	struct links_entry      *le;
     	dev_t dev;
    -	ino_t ino;
    +	int64_t ino;
    +
    +	if (archive_entry_nlink(entry) <= 1)
    +		return;
     
     	dev = archive_entry_dev(entry);
    -	ino = archive_entry_ino(entry);
    +	ino = archive_entry_ino64(entry);
     
    -        /*
    -         * First look in the list of multiply-linked files.  If we've
    -         * already dumped it, convert this entry to a hard link entry.
    -         */
    -        for (le = cpio->links_head; le; le = le->next) {
    -                if (le->dev == dev && le->ino == ino) {
    -                        archive_entry_copy_hardlink(entry, le->name);
    +	/*
    +	 * First look in the list of multiply-linked files.  If we've
    +	 * already dumped it, convert this entry to a hard link entry.
    +	 */
    +	for (le = cpio->links_head; le; le = le->next) {
    +		if (le->dev == dev && le->ino == ino) {
    +			archive_entry_copy_hardlink(entry, le->name);
     
    -                        if (--le->links <= 0) {
    -                                if (le->previous != NULL)
    -                                        le->previous->next = le->next;
    -                                if (le->next != NULL)
    -                                        le->next->previous = le->previous;
    -                                if (cpio->links_head == le)
    -                                        cpio->links_head = le->next;
    +			if (--le->links <= 0) {
    +				if (le->previous != NULL)
    +					le->previous->next = le->next;
    +				if (le->next != NULL)
    +					le->next->previous = le->previous;
    +				if (cpio->links_head == le)
    +					cpio->links_head = le->next;
     				free(le->name);
    -                                free(le);
    -                        }
    +				free(le);
    +			}
     
    -                        return;
    -                }
    -        }
    +			return;
    +		}
    +	}
     
    -        le = (struct links_entry *)malloc(sizeof(struct links_entry));
    +	le = (struct links_entry *)malloc(sizeof(struct links_entry));
     	if (le == NULL)
     		__archive_errx(1, "Out of memory adding file to list");
    -        if (cpio->links_head != NULL)
    -                cpio->links_head->previous = le;
    -        le->next = cpio->links_head;
    -        le->previous = NULL;
    -        cpio->links_head = le;
    -        le->dev = dev;
    -        le->ino = ino;
    -        le->links = archive_entry_nlink(entry) - 1;
    -        le->name = strdup(archive_entry_pathname(entry));
    +	if (cpio->links_head != NULL)
    +		cpio->links_head->previous = le;
    +	le->next = cpio->links_head;
    +	le->previous = NULL;
    +	cpio->links_head = le;
    +	le->dev = dev;
    +	le->ino = ino;
    +	le->links = archive_entry_nlink(entry) - 1;
    +	le->name = strdup(archive_entry_pathname(entry));
     	if (le->name == NULL)
     		__archive_errx(1, "Out of memory adding file to list");
     }
    diff --git a/lib/libarchive/archive_read_support_format_iso9660.c b/lib/libarchive/archive_read_support_format_iso9660.c
    index efc39b46e476..1f640037fadf 100644
    --- a/lib/libarchive/archive_read_support_format_iso9660.c
    +++ b/lib/libarchive/archive_read_support_format_iso9660.c
    @@ -1,6 +1,7 @@
     /*-
      * Copyright (c) 2003-2007 Tim Kientzle
      * Copyright (c) 2009 Andreas Henriksson 
    + * Copyright (c) 2009 Michihiro NAKAJIMA
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
    @@ -39,8 +40,12 @@ __FBSDID("$FreeBSD$");
     #include 
     #endif
     #include 
    +#ifdef HAVE_ZLIB_H
    +#include 
    +#endif
     
     #include "archive.h"
    +#include "archive_endian.h"
     #include "archive_entry.h"
     #include "archive_private.h"
     #include "archive_read_private.h"
    @@ -73,6 +78,8 @@ __FBSDID("$FreeBSD$");
      * the file body.  This strategy allows us to read most compliant
      * CDs with a single pass through the data, as required by libarchive.
      */
    +#define	LOGICAL_BLOCK_SIZE	2048
    +#define	SYSTEM_AREA_BLOCK	16
     
     /* Structure of on-disk primary volume descriptor. */
     #define PVD_type_offset 0
    @@ -158,6 +165,8 @@ __FBSDID("$FreeBSD$");
     #define SVD_version_offset (SVD_id_offset + SVD_id_size)
     #define SVD_version_size 1
     /* ... */
    +#define SVD_reserved1_offset	72
    +#define SVD_reserved1_size	8
     #define SVD_volume_space_size_offset 80
     #define SVD_volume_space_size_size 8
     #define SVD_escape_sequences_offset (SVD_volume_space_size_offset + SVD_volume_space_size_size)
    @@ -165,9 +174,16 @@ __FBSDID("$FreeBSD$");
     /* ... */
     #define SVD_logical_block_size_offset 128
     #define SVD_logical_block_size_size 4
    +#define SVD_type_L_path_table_offset 140
    +#define SVD_type_M_path_table_offset 148
     /* ... */
     #define SVD_root_directory_record_offset 156
     #define SVD_root_directory_record_size 34
    +#define SVD_file_structure_version_offset 881
    +#define SVD_reserved2_offset	882
    +#define SVD_reserved2_size	1
    +#define SVD_reserved3_offset	1395
    +#define SVD_reserved3_size	653
     /* ... */
     /* FIXME: validate correctness of last SVD entry offset. */
     
    @@ -198,60 +214,146 @@ __FBSDID("$FreeBSD$");
     #define DR_name_len_size 1
     #define DR_name_offset 33
     
    +#ifdef HAVE_ZLIB_H
    +static const unsigned char zisofs_magic[8] = {
    +	0x37, 0xE4, 0x53, 0x96, 0xC9, 0xDB, 0xD6, 0x07
    +};
    +
    +struct zisofs {
    +	/* Set 1 if this file compressed by paged zlib */
    +	int		 pz;
    +	int		 pz_log2_bs; /* Log2 of block size */
    +	uint64_t	 pz_uncompressed_size;
    +
    +	int		 initialized;
    +	unsigned char	*uncompressed_buffer;
    +	size_t		 uncompressed_buffer_size;
    +
    +	uint32_t	 pz_offset;
    +	unsigned char	 header[16];
    +	size_t		 header_avail;
    +	int		 header_passed;
    +	unsigned char	*block_pointers;
    +	size_t		 block_pointers_alloc;
    +	size_t		 block_pointers_size;
    +	size_t		 block_pointers_avail;
    +	size_t		 block_off;
    +	uint32_t	 block_avail;
    +
    +	z_stream	 stream;
    +	int		 stream_valid;
    +};
    +#else
    +struct zisofs {
    +	/* Set 1 if this file compressed by paged zlib */
    +	int		 pz;
    +};
    +#endif
    +
    +struct content {
    +	uint64_t	 offset;/* Offset on disk.		*/
    +	uint64_t	 size;	/* File size in bytes.		*/
    +	struct content	*next;
    +};
    +
     /* In-memory storage for a directory record. */
     struct file_info {
    +	struct file_info	*use_next;
     	struct file_info	*parent;
    -	int		 refcount;
    -	uint64_t	 offset;  /* Offset on disk. */
    -	uint64_t	 size;	/* File size in bytes. */
    -	uint64_t	 ce_offset; /* Offset of CE */
    -	uint64_t	 ce_size; /* Size of CE */
    -	time_t		 birthtime; /* File created time. */
    -	time_t		 mtime;	/* File last modified time. */
    -	time_t		 atime;	/* File last accessed time. */
    -	time_t		 ctime;	/* File attribute change time. */
    -	uint64_t	 rdev; /* Device number */
    +	struct file_info	*next;
    +	int		 subdirs;
    +	uint64_t	 key;		/* Heap Key.			*/
    +	uint64_t	 offset;	/* Offset on disk.		*/
    +	uint64_t	 size;		/* File size in bytes.		*/
    +	uint32_t	 ce_offset;	/* Offset of CE.		*/
    +	uint32_t	 ce_size;	/* Size of CE.			*/
    +	char		 re;		/* Having RRIP "RE" extension.	*/
    +	uint64_t	 cl_offset;	/* Having RRIP "CL" extension.	*/
    +	int		 birthtime_is_set;
    +	time_t		 birthtime;	/* File created time.		*/
    +	time_t		 mtime;		/* File last modified time.	*/
    +	time_t		 atime;		/* File last accessed time.	*/
    +	time_t		 ctime;		/* File attribute change time.	*/
    +	uint64_t	 rdev;		/* Device number.		*/
     	mode_t		 mode;
     	uid_t		 uid;
     	gid_t		 gid;
    -	ino_t		 inode;
    +	int64_t		 number;
     	int		 nlinks;
     	struct archive_string name; /* Pathname */
     	char		 name_continues; /* Non-zero if name continues */
     	struct archive_string symlink;
     	char		 symlink_continues; /* Non-zero if link continues */
    +	/* Set 1 if this file compressed by paged zlib(zisofs) */
    +	int		 pz;
    +	int		 pz_log2_bs; /* Log2 of block size */
    +	uint64_t	 pz_uncompressed_size;
    +	/* Set 1 if this file is multi extent. */
    +	int		 multi_extent;
    +	struct {
    +		struct content	*first;
    +		struct content	**last;
    +	} contents;
    +	char		 exposed;
     };
     
    +struct heap_queue {
    +	struct file_info **files;
    +	int		 allocated;
    +	int		 used;
    +};
     
     struct iso9660 {
     	int	magic;
     #define ISO9660_MAGIC   0x96609660
     
    -	int option_ignore_joliet;
    +	int opt_support_joliet;
    +	int opt_support_rockridge;
     
     	struct archive_string pathname;
    -	char	seenRockridge; /* Set true if RR extensions are used. */
    -	unsigned char	suspOffset;
    +	char	seenRockridge;	/* Set true if RR extensions are used. */
    +	char	seenSUSP;	/* Set true if SUSP is beging used. */
     	char	seenJoliet;
     
    -	uint64_t	previous_offset;
    -	uint64_t	previous_size;
    +	unsigned char	suspOffset;
    +	struct file_info *rr_moved;
    +	struct heap_queue		 re_dirs;
    +	struct heap_queue		 cl_files;
    +	struct read_ce_queue {
    +		struct read_ce_req {
    +			uint64_t	 offset;/* Offset of CE on disk. */
    +			struct file_info *file;
    +		}		*reqs;
    +		int		 cnt;
    +		int		 allocated;
    +	}	read_ce_req;
    +
    +	int64_t		previous_number;
     	struct archive_string previous_pathname;
     
    -	/* TODO: Make this a heap for fast inserts and deletions. */
    -	struct file_info **pending_files;
    -	int	pending_files_allocated;
    -	int	pending_files_used;
    +	struct file_info		*use_files;
    +	struct heap_queue		 pending_files;
    +	struct {
    +		struct file_info	*first;
    +		struct file_info	**last;
    +	}	cache_files;
     
     	uint64_t current_position;
     	ssize_t	logical_block_size;
     	uint64_t volume_size; /* Total size of volume in bytes. */
    +	int32_t  volume_block;/* Total size of volume in logical blocks. */
    +
    +	struct vd {
    +		int		location;	/* Location of Extent.	*/
    +		uint32_t	size;
    +	} primary, joliet;
     
     	off_t	entry_sparse_offset;
     	int64_t	entry_bytes_remaining;
    +	struct zisofs	 entry_zisofs;
    +	struct content	*entry_content;
     };
     
    -static void	add_entry(struct iso9660 *iso9660, struct file_info *file);
     static int	archive_read_format_iso9660_bid(struct archive_read *);
     static int	archive_read_format_iso9660_options(struct archive_read *,
     		    const char *, const char *);
    @@ -268,25 +370,49 @@ static void	dump_isodirrec(FILE *, const unsigned char *isodirrec);
     static time_t	time_from_tm(struct tm *);
     static time_t	isodate17(const unsigned char *);
     static time_t	isodate7(const unsigned char *);
    +static int	isBootRecord(struct iso9660 *, const unsigned char *);
    +static int	isVolumePartition(struct iso9660 *, const unsigned char *);
    +static int	isVDSetTerminator(struct iso9660 *, const unsigned char *);
     static int	isJolietSVD(struct iso9660 *, const unsigned char *);
    +static int	isSVD(struct iso9660 *, const unsigned char *);
    +static int	isEVD(struct iso9660 *, const unsigned char *);
     static int	isPVD(struct iso9660 *, const unsigned char *);
    -static struct file_info *next_entry(struct iso9660 *);
    +static struct file_info *next_cache_entry(struct iso9660 *iso9660);
     static int	next_entry_seek(struct archive_read *a, struct iso9660 *iso9660,
     		    struct file_info **pfile);
     static struct file_info *
    -		parse_file_info(struct iso9660 *iso9660,
    +		parse_file_info(struct archive_read *a,
     		    struct file_info *parent, const unsigned char *isodirrec);
    -static void	parse_rockridge(struct iso9660 *iso9660,
    +static int	parse_rockridge(struct archive_read *a,
     		    struct file_info *file, const unsigned char *start,
     		    const unsigned char *end);
    +static int	register_CE(struct archive_read *a, int32_t location,
    +		    struct file_info *file);
    +static int	read_CE(struct archive_read *a, struct iso9660 *iso9660);
     static void	parse_rockridge_NM1(struct file_info *,
     		    const unsigned char *, int);
     static void	parse_rockridge_SL1(struct file_info *,
     		    const unsigned char *, int);
     static void	parse_rockridge_TF1(struct file_info *,
     		    const unsigned char *, int);
    -static void	release_file(struct iso9660 *, struct file_info *);
    +static void	parse_rockridge_ZF1(struct file_info *,
    +		    const unsigned char *, int);
    +static void	register_file(struct iso9660 *, struct file_info *);
    +static void	release_files(struct iso9660 *);
     static unsigned	toi(const void *p, int n);
    +static inline void cache_add_entry(struct iso9660 *iso9660,
    +		    struct file_info *file);
    +static inline void cache_add_to_next_of_parent(struct iso9660 *iso9660,
    +		    struct file_info *file);
    +static inline struct file_info *cache_get_entry(struct iso9660 *iso9660);
    +static void	heap_add_entry(struct heap_queue *heap,
    +		    struct file_info *file, uint64_t key);
    +static struct file_info *heap_get_entry(struct heap_queue *heap);
    +
    +#define add_entry(iso9660, file)	\
    +	heap_add_entry(&((iso9660)->pending_files), file, file->offset)
    +#define next_entry(iso9660)		\
    +	heap_get_entry(&((iso9660)->pending_files))
     
     int
     archive_read_support_format_iso9660(struct archive *_a)
    @@ -302,6 +428,12 @@ archive_read_support_format_iso9660(struct archive *_a)
     	}
     	memset(iso9660, 0, sizeof(*iso9660));
     	iso9660->magic = ISO9660_MAGIC;
    +	iso9660->cache_files.first = NULL;
    +	iso9660->cache_files.last = &(iso9660->cache_files.first);
    +	/* Enable to support Joliet extensions by default.	*/
    +	iso9660->opt_support_joliet = 1;
    +	/* Enable to support Rock Ridge extensions by default.	*/
    +	iso9660->opt_support_rockridge = 1;
     
     	r = __archive_read_register_format(a,
     	    iso9660,
    @@ -325,10 +457,10 @@ static int
     archive_read_format_iso9660_bid(struct archive_read *a)
     {
     	struct iso9660 *iso9660;
    -	ssize_t bytes_read, brsvd;
    +	ssize_t bytes_read;
     	const void *h;
    -	const unsigned char *p, *psvd;
    -	int bid;
    +	const unsigned char *p;
    +	int seenTerminator;
     
     	iso9660 = (struct iso9660 *)(a->format->data);
     
    @@ -337,34 +469,56 @@ archive_read_format_iso9660_bid(struct archive_read *a)
     	 * 8 sectors of the volume descriptor table.  Of course,
     	 * if the I/O layer gives us more, we'll take it.
     	 */
    -	h = __archive_read_ahead(a, 32768 + 8*2048, &bytes_read);
    +#define RESERVED_AREA	(SYSTEM_AREA_BLOCK * LOGICAL_BLOCK_SIZE)
    +	h = __archive_read_ahead(a,
    +	    RESERVED_AREA + 8 * LOGICAL_BLOCK_SIZE,
    +	    &bytes_read);
     	if (h == NULL)
     	    return (-1);
     	p = (const unsigned char *)h;
     
     	/* Skip the reserved area. */
    -	bytes_read -= 32768;
    -	p += 32768;
    +	bytes_read -= RESERVED_AREA;
    +	p += RESERVED_AREA;
     
    -	/* Check each volume descriptor to locate possible SVD with Joliet. */
    -	for (brsvd = bytes_read, psvd = p;
    -			!iso9660->option_ignore_joliet && brsvd > 2048;
    -			brsvd -= 2048, psvd += 2048) {
    -		bid = isJolietSVD(iso9660, psvd);
    -		if (bid > 0)
    -			return (bid);
    -		if (*p == '\177') /* End-of-volume-descriptor marker. */
    -			break;
    -	}
    -
    -	/* Check each volume descriptor to locate the PVD. */
    -	for (; bytes_read > 2048; bytes_read -= 2048, p += 2048) {
    -		bid = isPVD(iso9660, p);
    -		if (bid > 0)
    -			return (bid);
    -		if (*p == '\177') /* End-of-volume-descriptor marker. */
    +	/* Check each volume descriptor. */
    +	seenTerminator = 0;
    +	for (; bytes_read > LOGICAL_BLOCK_SIZE;
    +	    bytes_read -= LOGICAL_BLOCK_SIZE, p += LOGICAL_BLOCK_SIZE) {
    +		/* Do not handle undefined Volume Descriptor Type. */
    +		if (p[0] >= 4 && p[0] <= 254)
    +			return (0);
    +		/* Standard Identifier must be "CD001" */
    +		if (memcmp(p + 1, "CD001", 5) != 0)
    +			return (0);
    +		if (!iso9660->primary.location) {
    +			if (isPVD(iso9660, p))
    +				continue;
    +		}
    +		if (!iso9660->joliet.location) {
    +			if (isJolietSVD(iso9660, p))
    +				continue;
    +		}
    +		if (isBootRecord(iso9660, p))
    +			continue;
    +		if (isEVD(iso9660, p))
    +			continue;
    +		if (isSVD(iso9660, p))
    +			continue;
    +		if (isVolumePartition(iso9660, p))
    +			continue;
    +		if (isVDSetTerminator(iso9660, p)) {
    +			seenTerminator = 1;
     			break;
    +		}
    +		return (0);
     	}
    +	/*
    +	 * ISO 9660 format must have Primary Volume Descriptor and
    +	 * Volume Descriptor Set Terminator.
    +	 */
    +	if (seenTerminator && iso9660->primary.location > 16)
    +		return (48);
     
     	/* We didn't find a valid PVD; return a bid of zero. */
     	return (0);
    @@ -383,9 +537,14 @@ archive_read_format_iso9660_options(struct archive_read *a,
     				strcmp(val, "ignore") == 0 ||
     				strcmp(val, "disable") == 0 ||
     				strcmp(val, "0") == 0)
    -			iso9660->option_ignore_joliet = 1;
    +			iso9660->opt_support_joliet = 0;
     		else
    -			iso9660->option_ignore_joliet = 0;
    +			iso9660->opt_support_joliet = 1;
    +		return (ARCHIVE_OK);
    +	}
    +	if (strcmp(key, "rockridge") == 0 ||
    +	    strcmp(key, "Rockridge") == 0) {
    +		iso9660->opt_support_rockridge = val != NULL;
     		return (ARCHIVE_OK);
     	}
     
    @@ -396,17 +555,80 @@ archive_read_format_iso9660_options(struct archive_read *a,
     }
     
     static int
    -isJolietSVD(struct iso9660 *iso9660, const unsigned char *h)
    +isBootRecord(struct iso9660 *iso9660, const unsigned char *h)
     {
    -	struct file_info *file;
    -	const unsigned char *p;
    +	(void)iso9660; /* UNUSED */
     
    -	/* Type 2 means it's a SVD. */
    -	if (h[SVD_type_offset] != 2)
    +	/* Type of the Volume Descriptor Boot Record must be 0. */
    +	if (h[0] != 0)
     		return (0);
     
    -	/* ID must be "CD001" */
    -	if (memcmp(h + SVD_id_offset, "CD001", 5) != 0)
    +	/* Volume Descriptor Version must be 1. */
    +	if (h[6] != 1)
    +		return (0);
    +
    +	return (1);
    +}
    +
    +static int
    +isVolumePartition(struct iso9660 *iso9660, const unsigned char *h)
    +{
    +	int32_t location;
    +
    +	/* Type of the Volume Partition Descriptor must be 3. */
    +	if (h[0] != 3)
    +		return (0);
    +
    +	/* Volume Descriptor Version must be 1. */
    +	if (h[6] != 1)
    +		return (0);
    +	/* Unused Field */
    +	if (h[7] != 0)
    +		return (0);
    +
    +	location = archive_le32dec(h + 72);
    +	if (location <= SYSTEM_AREA_BLOCK ||
    +	    location >= iso9660->volume_block)
    +		return (0);
    +	if ((uint32_t)location != archive_be32dec(h + 76))
    +		return (0);
    +
    +	return (1);
    +}
    +
    +static int
    +isVDSetTerminator(struct iso9660 *iso9660, const unsigned char *h)
    +{
    +	int i;
    +
    +	(void)iso9660; /* UNUSED */
    +
    +	/* Type of the Volume Descriptor Set Terminator must be 255. */
    +	if (h[0] != 255)
    +		return (0);
    +
    +	/* Volume Descriptor Version must be 1. */
    +	if (h[6] != 1)
    +		return (0);
    +
    +	/* Reserved field must be 0. */
    +	for (i = 7; i < 2048; ++i)
    +		if (h[i] != 0)
    +			return (0);
    +
    +	return (1);
    +}
    +
    +static int
    +isJolietSVD(struct iso9660 *iso9660, const unsigned char *h)
    +{
    +	const unsigned char *p;
    +	ssize_t logical_block_size;
    +	int32_t volume_block;
    +
    +	/* Check if current sector is a kind of Supplementary Volume
    +	 * Descriptor. */
    +	if (!isSVD(iso9660, h))
     		return (0);
     
     	/* FIXME: do more validations according to joliet spec. */
    @@ -431,23 +653,160 @@ isJolietSVD(struct iso9660 *iso9660, const unsigned char *h)
     	} else /* not joliet */
     		return (0);
     
    -	iso9660->logical_block_size = toi(h + SVD_logical_block_size_offset, 2);
    -	if (iso9660->logical_block_size <= 0)
    +	logical_block_size =
    +	    archive_le16dec(h + SVD_logical_block_size_offset);
    +	volume_block = archive_le32dec(h + SVD_volume_space_size_offset);
    +
    +	iso9660->logical_block_size = logical_block_size;
    +	iso9660->volume_block = volume_block;
    +	iso9660->volume_size = logical_block_size * (uint64_t)volume_block;
    +	/* Read Root Directory Record in Volume Descriptor. */
    +	p = h + SVD_root_directory_record_offset;
    +	iso9660->joliet.location = archive_le32dec(p + DR_extent_offset);
    +	iso9660->joliet.size = archive_le32dec(p + DR_size_offset);
    +
    +	return (48);
    +}
    +
    +static int
    +isSVD(struct iso9660 *iso9660, const unsigned char *h)
    +{
    +	const unsigned char *p;
    +	ssize_t logical_block_size;
    +	int32_t volume_block;
    +	int32_t location;
    +	int i;
    +
    +	(void)iso9660; /* UNUSED */
    +
    +	/* Type 2 means it's a SVD. */
    +	if (h[SVD_type_offset] != 2)
     		return (0);
     
    -	iso9660->volume_size = iso9660->logical_block_size
    -	    * (uint64_t)toi(h + SVD_volume_space_size_offset, 4);
    +	/* Reserved field must be 0. */
    +	for (i = 0; i < SVD_reserved1_size; ++i)
    +		if (h[SVD_reserved1_offset + i] != 0)
    +			return (0);
    +	for (i = 0; i < SVD_reserved2_size; ++i)
    +		if (h[SVD_reserved2_offset + i] != 0)
    +			return (0);
    +	for (i = 0; i < SVD_reserved3_size; ++i)
    +		if (h[SVD_reserved3_offset + i] != 0)
    +			return (0);
     
    -#if DEBUG
    -	fprintf(stderr, "Joliet UCS-2 level %d with "
    -			"logical block size:%d, volume size:%d\n",
    -			iso9660->seenJoliet,
    -			iso9660->logical_block_size, iso9660->volume_size);
    -#endif
    +	/* File structure version must be 1 for ISO9660/ECMA119. */
    +	if (h[SVD_file_structure_version_offset] != 1)
    +		return (0);
     
    -	/* Store the root directory in the pending list. */
    -	file = parse_file_info(iso9660, NULL, h + SVD_root_directory_record_offset);
    -	add_entry(iso9660, file);
    +	logical_block_size =
    +	    archive_le16dec(h + SVD_logical_block_size_offset);
    +	if (logical_block_size <= 0)
    +		return (0);
    +
    +	volume_block = archive_le32dec(h + SVD_volume_space_size_offset);
    +	if (volume_block <= SYSTEM_AREA_BLOCK+4)
    +		return (0);
    +
    +	/* Location of Occurrence of Type L Path Table must be
    +	 * available location,
    +	 * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */
    +	location = archive_le32dec(h+SVD_type_L_path_table_offset);
    +	if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block)
    +		return (0);
    +
    +	/* Location of Occurrence of Type M Path Table must be
    +	 * available location,
    +	 * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */
    +	location = archive_be32dec(h+SVD_type_M_path_table_offset);
    +	if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block)
    +		return (0);
    +
    +	/* Read Root Directory Record in Volume Descriptor. */
    +	p = h + SVD_root_directory_record_offset;
    +	if (p[DR_length_offset] != 34)
    +		return (0);
    +
    +	return (48);
    +}
    +
    +static int
    +isEVD(struct iso9660 *iso9660, const unsigned char *h)
    +{
    +	const unsigned char *p;
    +	ssize_t logical_block_size;
    +	int32_t volume_block;
    +	int32_t location;
    +	int i;
    +
    +	(void)iso9660; /* UNUSED */
    +
    +	/* Type of the Enhanced Volume Descriptor must be 2. */
    +	if (h[PVD_type_offset] != 2)
    +		return (0);
    +
    +	/* EVD version must be 2. */
    +	if (h[PVD_version_offset] != 2)
    +		return (0);
    +
    +	/* Reserved field must be 0. */
    +	if (h[PVD_reserved1_offset] != 0)
    +		return (0);
    +
    +	/* Reserved field must be 0. */
    +	for (i = 0; i < PVD_reserved2_size; ++i)
    +		if (h[PVD_reserved2_offset + i] != 0)
    +			return (0);
    +
    +	/* Reserved field must be 0. */
    +	for (i = 0; i < PVD_reserved3_size; ++i)
    +		if (h[PVD_reserved3_offset + i] != 0)
    +			return (0);
    +
    +	/* Logical block size must be > 0. */
    +	/* I've looked at Ecma 119 and can't find any stronger
    +	 * restriction on this field. */
    +	logical_block_size =
    +	    archive_le16dec(h + PVD_logical_block_size_offset);
    +	if (logical_block_size <= 0)
    +		return (0);
    +
    +	volume_block =
    +	    archive_le32dec(h + PVD_volume_space_size_offset);
    +	if (volume_block <= SYSTEM_AREA_BLOCK+4)
    +		return (0);
    +
    +	/* File structure version must be 2 for ISO9660:1999. */
    +	if (h[PVD_file_structure_version_offset] != 2)
    +		return (0);
    +
    +	/* Location of Occurrence of Type L Path Table must be
    +	 * available location,
    +	 * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */
    +	location = archive_le32dec(h+PVD_type_1_path_table_offset);
    +	if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block)
    +		return (0);
    +
    +	/* Location of Occurrence of Type M Path Table must be
    +	 * available location,
    +	 * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */
    +	location = archive_be32dec(h+PVD_type_m_path_table_offset);
    +	if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block)
    +		return (0);
    +
    +	/* Reserved field must be 0. */
    +	for (i = 0; i < PVD_reserved4_size; ++i)
    +		if (h[PVD_reserved4_offset + i] != 0)
    +			return (0);
    +
    +	/* Reserved field must be 0. */
    +	for (i = 0; i < PVD_reserved5_size; ++i)
    +		if (h[PVD_reserved5_offset + i] != 0)
    +			return (0);
    +
    +	/* Read Root Directory Record in Volume Descriptor. */
    +	p = h + PVD_root_directory_record_offset;
    +	if (p[DR_length_offset] != 34)
    +		return (0);
     
     	return (48);
     }
    @@ -455,17 +814,16 @@ isJolietSVD(struct iso9660 *iso9660, const unsigned char *h)
     static int
     isPVD(struct iso9660 *iso9660, const unsigned char *h)
     {
    -	struct file_info *file;
    +	const unsigned char *p;
    +	ssize_t logical_block_size;
    +	int32_t volume_block;
    +	int32_t location;
     	int i;
     
     	/* Type of the Primary Volume Descriptor must be 1. */
     	if (h[PVD_type_offset] != 1)
     		return (0);
     
    -	/* ID must be "CD001" */
    -	if (memcmp(h + PVD_id_offset, "CD001", 5) != 0)
    -		return (0);
    -
     	/* PVD version must be 1. */
     	if (h[PVD_version_offset] != 1)
     		return (0);
    @@ -487,17 +845,32 @@ isPVD(struct iso9660 *iso9660, const unsigned char *h)
     	/* Logical block size must be > 0. */
     	/* I've looked at Ecma 119 and can't find any stronger
     	 * restriction on this field. */
    -	iso9660->logical_block_size = toi(h + PVD_logical_block_size_offset, 2);
    -	if (iso9660->logical_block_size <= 0)
    +	logical_block_size =
    +	    archive_le16dec(h + PVD_logical_block_size_offset);
    +	if (logical_block_size <= 0)
     		return (0);
     
    -	iso9660->volume_size = iso9660->logical_block_size
    -	    * (uint64_t)toi(h + PVD_volume_space_size_offset, 4);
    +	volume_block = archive_le32dec(h + PVD_volume_space_size_offset);
    +	if (volume_block <= SYSTEM_AREA_BLOCK+4)
    +		return (0);
     
     	/* File structure version must be 1 for ISO9660/ECMA119. */
     	if (h[PVD_file_structure_version_offset] != 1)
     		return (0);
     
    +	/* Location of Occurrence of Type L Path Table must be
    +	 * available location,
    +	 * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */
    +	location = archive_le32dec(h+PVD_type_1_path_table_offset);
    +	if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block)
    +		return (0);
    +
    +	/* Location of Occurrence of Type M Path Table must be
    +	 * available location,
    +	 * > SYSTEM_AREA_BLOCK(16) + 2 and < Volume Space Size. */
    +	location = archive_be32dec(h+PVD_type_m_path_table_offset);
    +	if (location <= SYSTEM_AREA_BLOCK+2 || location >= volume_block)
    +		return (0);
     
     	/* Reserved field must be 0. */
     	for (i = 0; i < PVD_reserved4_size; ++i)
    @@ -512,19 +885,231 @@ isPVD(struct iso9660 *iso9660, const unsigned char *h)
     	/* XXX TODO: Check other values for sanity; reject more
     	 * malformed PVDs. XXX */
     
    -	/* Store the root directory in the pending list. */
    -	file = parse_file_info(iso9660, NULL, h + PVD_root_directory_record_offset);
    -	add_entry(iso9660, file);
    +	/* Read Root Directory Record in Volume Descriptor. */
    +	p = h + PVD_root_directory_record_offset;
    +	if (p[DR_length_offset] != 34)
    +		return (0);
    +
    +	iso9660->logical_block_size = logical_block_size;
    +	iso9660->volume_block = volume_block;
    +	iso9660->volume_size = logical_block_size * (uint64_t)volume_block;
    +	iso9660->primary.location = archive_le32dec(p + DR_extent_offset);
    +	iso9660->primary.size = archive_le32dec(p + DR_size_offset);
    +
     	return (48);
     }
     
    +static int
    +read_children(struct archive_read *a, struct file_info *parent)
    +{
    +	struct iso9660 *iso9660;
    +	const unsigned char *b, *p;
    +	struct file_info *multi;
    +	size_t step;
    +
    +	iso9660 = (struct iso9660 *)(a->format->data);
    +	if (iso9660->current_position > parent->offset) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Ignoring out-of-order directory (%s) %jd > %jd",
    +		    parent->name.s,
    +		    iso9660->current_position,
    +		    parent->offset);
    +		return (ARCHIVE_WARN);
    +	}
    +	if (parent->offset + parent->size > iso9660->volume_size) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Directory is beyond end-of-media: %s",
    +		    parent->name);
    +		return (ARCHIVE_WARN);
    +	}
    +	if (iso9660->current_position < parent->offset) {
    +		int64_t skipsize;
    +
    +		skipsize = parent->offset - iso9660->current_position;
    +		skipsize = __archive_read_skip(a, skipsize);
    +		if (skipsize < 0)
    +			return ((int)skipsize);
    +		iso9660->current_position = parent->offset;
    +	}
    +
    +	step = ((parent->size + iso9660->logical_block_size -1) /
    +	    iso9660->logical_block_size) * iso9660->logical_block_size;
    +	b = __archive_read_ahead(a, step, NULL);
    +	if (b == NULL) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Failed to read full block when scanning "
    +		    "ISO9660 directory list");
    +		return (ARCHIVE_FATAL);
    +	}
    +	__archive_read_consume(a, step);
    +	iso9660->current_position += step;
    +	multi = NULL;
    +	while (step) {
    +		p = b;
    +		b += iso9660->logical_block_size;
    +		step -= iso9660->logical_block_size;
    +		for (; *p != 0 && p < b && p + *p <= b; p += *p) {
    +			struct file_info *child;
    +
    +			/* N.B.: these special directory identifiers
    +			 * are 8 bit "values" even on a
    +			 * Joliet CD with UCS-2 (16bit) encoding.
    +			 */
    +
    +			/* Skip '.' entry. */
    +			if (*(p + DR_name_len_offset) == 1
    +			    && *(p + DR_name_offset) == '\0')
    +				continue;
    +			/* Skip '..' entry. */
    +			if (*(p + DR_name_len_offset) == 1
    +			    && *(p + DR_name_offset) == '\001')
    +				continue;
    +			child = parse_file_info(a, parent, p);
    +			if (child == NULL)
    +				return (ARCHIVE_FATAL);
    +			if (child->cl_offset)
    +				heap_add_entry(&(iso9660->cl_files),
    +				    child, child->cl_offset);
    +			else {
    +				if (child->multi_extent || multi != NULL) {
    +					struct content *con;
    +
    +					if (multi == NULL) {
    +						multi = child;
    +						multi->contents.first = NULL;
    +						multi->contents.last =
    +						    &(multi->contents.first);
    +					}
    +					con = malloc(sizeof(struct content));
    +					if (con == NULL) {
    +						archive_set_error(
    +						    &a->archive, ENOMEM,
    +						    "No memory for "
    +						    "multi extent");
    +						return (ARCHIVE_FATAL);
    +					}
    +					con->offset = child->offset;
    +					con->size = child->size;
    +					con->next = NULL;
    +					*multi->contents.last = con;
    +					multi->contents.last = &(con->next);
    +					if (multi == child)
    +						add_entry(iso9660, child);
    +					else {
    +						multi->size += child->size;
    +						if (!child->multi_extent)
    +							multi = NULL;
    +					}
    +				} else
    +					add_entry(iso9660, child);
    +			}
    +		}
    +	}
    +
    +	/* Read data which recorded by RRIP "CE" extension. */
    +	if (read_CE(a, iso9660) != ARCHIVE_OK)
    +		return (ARCHIVE_FATAL);
    +
    +	return (ARCHIVE_OK);
    +}
    +
    +static int
    +relocate_dir(struct iso9660 *iso9660, struct file_info *file)
    +{
    +	struct file_info *re;
    +
    +	re = heap_get_entry(&(iso9660->re_dirs));
    +	while (re != NULL && re->offset < file->cl_offset) {
    +		/* This case is wrong pattern.
    +		 * But dont't reject this directory entry to be robust. */
    +		cache_add_entry(iso9660, re);
    +		re = heap_get_entry(&(iso9660->re_dirs));
    +	}
    +	if (re == NULL)
    +		/* This case is wrong pattern. */
    +		return (0);
    +	if (re->offset == file->cl_offset) {
    +		re->parent->subdirs--;
    +		re->parent = file->parent;
    +		re->parent->subdirs++;
    +		cache_add_to_next_of_parent(iso9660, re);
    +		return (1);
    +	} else
    +		/* This case is wrong pattern. */
    +		heap_add_entry(&(iso9660->re_dirs), re, re->offset);
    +	return (0);
    +}
    +
    +static int
    +read_entries(struct archive_read *a)
    +{
    +	struct iso9660 *iso9660;
    +	struct file_info *file;
    +	int r;
    +
    +	iso9660 = (struct iso9660 *)(a->format->data);
    +
    +	while ((file = next_entry(iso9660)) != NULL &&
    +	    (file->mode & AE_IFMT) == AE_IFDIR) {
    +		r = read_children(a, file);
    +		if (r != ARCHIVE_OK)
    +			return (r);
    +
    +		if (iso9660->seenRockridge &&
    +		    file->parent != NULL &&
    +		    file->parent->parent == NULL &&
    +		    iso9660->rr_moved == NULL &&
    +		    (strcmp(file->name.s, "rr_moved") == 0 ||
    +		     strcmp(file->name.s, ".rr_moved") == 0)) {
    +			iso9660->rr_moved = file;
    +		} else if (file->re)
    +			heap_add_entry(&(iso9660->re_dirs), file,
    +			    file->offset);
    +		else
    +			cache_add_entry(iso9660, file);
    +	}
    +	if (file != NULL)
    +		add_entry(iso9660, file);
    +
    +	if (iso9660->rr_moved != NULL) {
    +		/*
    +		 * Relocate directory which rr_moved has.
    +		 */
    +		while ((file = heap_get_entry(&(iso9660->cl_files))) != NULL)
    +			relocate_dir(iso9660, file);
    +
    +		/* If rr_moved directory still has children,
    +		 * Add rr_moved into pending_files to show
    +		 */
    +		if (iso9660->rr_moved->subdirs) {
    +			cache_add_entry(iso9660, iso9660->rr_moved);
    +			/* If entries which have "RE" extension are still
    +			 * remaining(this case is unlikely except ISO image
    +			 * is broken), the entries won't be exposed. */
    +			while ((file = heap_get_entry(&(iso9660->re_dirs))) != NULL)
    +				cache_add_entry(iso9660, file);
    +		} else
    +			iso9660->rr_moved->parent->subdirs--;
    +	} else {
    +		/*
    +		 * In case ISO image is broken. If the name of rr_moved
    +		 * directory has been changed by damage, subdirectories
    +		 * of rr_moved entry won't be exposed.
    +		 */
    +		while ((file = heap_get_entry(&(iso9660->re_dirs))) != NULL)
    +			cache_add_entry(iso9660, file);
    +	}
    +
    +	return (ARCHIVE_OK);
    +}
    +
     static int
     archive_read_format_iso9660_read_header(struct archive_read *a,
         struct archive_entry *entry)
     {
     	struct iso9660 *iso9660;
     	struct file_info *file;
    -	int r;
    +	int r, rd_r;
     
     	iso9660 = (struct iso9660 *)(a->format->data);
     
    @@ -533,12 +1118,97 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
     		a->archive.archive_format_name = "ISO9660";
     	}
     
    +	if (iso9660->current_position == 0) {
    +		int64_t skipsize;
    +		struct vd *vd;
    +		const void *block;
    +		char seenJoliet;
    +
    +		vd = &(iso9660->primary);
    +		if (!iso9660->opt_support_joliet)
    +			iso9660->seenJoliet = 0;
    +		if (iso9660->seenJoliet &&
    +			vd->location > iso9660->joliet.location)
    +			/* This condition is unlikely; by way of caution. */
    +			vd = &(iso9660->joliet);
    +
    +		skipsize = LOGICAL_BLOCK_SIZE * vd->location;
    +		skipsize = __archive_read_skip(a, skipsize);
    +		if (skipsize < 0)
    +			return ((int)skipsize);
    +		iso9660->current_position = skipsize;
    +
    +		block = __archive_read_ahead(a, vd->size, NULL);
    +		if (block == NULL) {
    +			archive_set_error(&a->archive,
    +			    ARCHIVE_ERRNO_MISC,
    +			    "Failed to read full block when scanning "
    +			    "ISO9660 directory list");
    +			return (ARCHIVE_FATAL);
    +		}
    +
    +		/*
    +		 * While reading Root Directory, flag seenJoliet
    +		 * must be zero to avoid converting special name
    +		 * 0x00(Current Directory) and next byte to UCS2.
    +		 */
    +		seenJoliet = iso9660->seenJoliet;/* Save flag. */
    +		iso9660->seenJoliet = 0;
    +		file = parse_file_info(a, NULL, block);
    +		if (file == NULL)
    +			return (ARCHIVE_FATAL);
    +		iso9660->seenJoliet = seenJoliet;
    +		if (vd == &(iso9660->primary) && iso9660->seenRockridge
    +		    && iso9660->seenJoliet)
    +			/*
    +			 * If iso image has RockRidge and Joliet,
    +			 * we use RockRidge Extensions.
    +			 */
    +			iso9660->seenJoliet = 0;
    +		if (vd == &(iso9660->primary) && !iso9660->seenRockridge
    +		    && iso9660->seenJoliet) {
    +			/* Switch reading data from primary to joliet. */ 
    +			vd = &(iso9660->joliet);
    +			skipsize = LOGICAL_BLOCK_SIZE * vd->location;
    +			skipsize -= iso9660->current_position;
    +			skipsize = __archive_read_skip(a, skipsize);
    +			if (skipsize < 0)
    +				return ((int)skipsize);
    +			iso9660->current_position += skipsize;
    +
    +			block = __archive_read_ahead(a, vd->size, NULL);
    +			if (block == NULL) {
    +				archive_set_error(&a->archive,
    +				    ARCHIVE_ERRNO_MISC,
    +				    "Failed to read full block when scanning "
    +				    "ISO9660 directory list");
    +				return (ARCHIVE_FATAL);
    +			}
    +			seenJoliet = iso9660->seenJoliet;/* Save flag. */
    +			iso9660->seenJoliet = 0;
    +			file = parse_file_info(a, NULL, block);
    +			if (file == NULL)
    +				return (ARCHIVE_FATAL);
    +			iso9660->seenJoliet = seenJoliet;
    +		}
    +		/* Store the root directory in the pending list. */
    +		add_entry(iso9660, file);
    +		if (iso9660->seenRockridge) {
    +			a->archive.archive_format =
    +			    ARCHIVE_FORMAT_ISO9660_ROCKRIDGE;
    +			a->archive.archive_format_name =
    +			    "ISO9660 with Rockridge extensions";
    +		}
    +		rd_r = read_entries(a);
    +		if (rd_r == ARCHIVE_FATAL)
    +			return (ARCHIVE_FATAL);
    +	} else
    +		rd_r = ARCHIVE_OK;
    +
     	/* Get the next entry that appears after the current offset. */
     	r = next_entry_seek(a, iso9660, &file);
    -	if (r != ARCHIVE_OK) {
    -		release_file(iso9660, file);
    +	if (r != ARCHIVE_OK)
     		return (r);
    -	}
     
     	iso9660->entry_bytes_remaining = file->size;
     	iso9660->entry_sparse_offset = 0; /* Offset for sparse-file-aware clients. */
    @@ -548,7 +1218,6 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
     		    "File is beyond end-of-media: %s", file->name);
     		iso9660->entry_bytes_remaining = 0;
     		iso9660->entry_sparse_offset = 0;
    -		release_file(iso9660, file);
     		return (ARCHIVE_WARN);
     	}
     
    @@ -557,8 +1226,10 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
     	archive_entry_set_uid(entry, file->uid);
     	archive_entry_set_gid(entry, file->gid);
     	archive_entry_set_nlink(entry, file->nlinks);
    -	archive_entry_set_ino(entry, file->inode);
    -	archive_entry_set_birthtime(entry, file->birthtime, 0);
    +	if (file->birthtime_is_set)
    +		archive_entry_set_birthtime(entry, file->birthtime, 0);
    +	else
    +		archive_entry_unset_birthtime(entry);
     	archive_entry_set_mtime(entry, file->mtime, 0);
     	archive_entry_set_ctime(entry, file->ctime, 0);
     	archive_entry_set_atime(entry, file->atime, 0);
    @@ -575,18 +1246,13 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
     	 * return the same body again, so if the next entry refers to
     	 * the same data, we have to return it as a hardlink to the
     	 * original entry. */
    -	/* TODO: We have enough information here to compute an
    -	 * accurate value for nlinks.  We should do so and ignore
    -	 * nlinks from the RR extensions. */
    -	if (file->offset == iso9660->previous_offset
    -	    && file->size == iso9660->previous_size
    -	    && file->size > 0) {
    +	if (file->number != -1 &&
    +	    file->number == iso9660->previous_number) {
     		archive_entry_set_hardlink(entry,
     		    iso9660->previous_pathname.s);
     		archive_entry_unset_size(entry);
     		iso9660->entry_bytes_remaining = 0;
     		iso9660->entry_sparse_offset = 0;
    -		release_file(iso9660, file);
     		return (ARCHIVE_OK);
     	}
     
    @@ -605,7 +1271,8 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
     	 * will give us support for whacky ISO images that require
     	 * seeking while retaining the ability to read almost all ISO
     	 * images in a streaming fashion. */
    -	if (file->offset < iso9660->current_position) {
    +	if ((file->mode & AE_IFMT) != AE_IFDIR &&
    +	    file->offset < iso9660->current_position) {
     		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
     		    "Ignoring out-of-order file @%x (%s) %jd < %jd",
     		    file,
    @@ -613,63 +1280,47 @@ archive_read_format_iso9660_read_header(struct archive_read *a,
     		    file->offset, iso9660->current_position);
     		iso9660->entry_bytes_remaining = 0;
     		iso9660->entry_sparse_offset = 0;
    -		release_file(iso9660, file);
     		return (ARCHIVE_WARN);
     	}
     
    -	iso9660->previous_size = file->size;
    -	iso9660->previous_offset = file->offset;
    -	archive_strcpy(&iso9660->previous_pathname, iso9660->pathname.s);
    +	/* Initialize zisofs variables. */
    +	iso9660->entry_zisofs.pz = file->pz;
    +	if (file->pz) {
    +#ifdef HAVE_ZLIB_H
    +		struct zisofs  *zisofs;
     
    -	/* If this is a directory, read in all of the entries right now. */
    -	if (archive_entry_filetype(entry) == AE_IFDIR) {
    -		while (iso9660->entry_bytes_remaining > 0) {
    -			const void *block;
    -			const unsigned char *p;
    -			ssize_t step = iso9660->logical_block_size;
    -			if (step > iso9660->entry_bytes_remaining)
    -				step = iso9660->entry_bytes_remaining;
    -			block = __archive_read_ahead(a, step, NULL);
    -			if (block == NULL) {
    -				archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    -	    "Failed to read full block when scanning ISO9660 directory list");
    -				release_file(iso9660, file);
    -				return (ARCHIVE_FATAL);
    -			}
    -			__archive_read_consume(a, step);
    -			iso9660->current_position += step;
    -			iso9660->entry_bytes_remaining -= step;
    -			for (p = (const unsigned char *)block;
    -			     *p != 0 && p < (const unsigned char *)block + step;
    -			     p += *p) {
    -				struct file_info *child;
    -
    -				/* N.B.: these special directory identifiers
    -				 * are 8 bit "values" even on a
    -				 * Joliet CD with UCS-2 (16bit) encoding.
    -				 */
    -
    -				/* Skip '.' entry. */
    -				if (*(p + DR_name_len_offset) == 1
    -				    && *(p + DR_name_offset) == '\0')
    -					continue;
    -				/* Skip '..' entry. */
    -				if (*(p + DR_name_len_offset) == 1
    -				    && *(p + DR_name_offset) == '\001')
    -					continue;
    -				child = parse_file_info(iso9660, file, p);
    -				add_entry(iso9660, child);
    -				if (iso9660->seenRockridge) {
    -					a->archive.archive_format =
    -					    ARCHIVE_FORMAT_ISO9660_ROCKRIDGE;
    -					a->archive.archive_format_name =
    -					    "ISO9660 with Rockridge extensions";
    -				}
    -			}
    -		}
    +		zisofs = &iso9660->entry_zisofs;
    +		zisofs->initialized = 0;
    +		zisofs->pz_log2_bs = file->pz_log2_bs;
    +		zisofs->pz_uncompressed_size = file->pz_uncompressed_size;
    +		zisofs->pz_offset = 0;
    +		zisofs->header_avail = 0;
    +		zisofs->header_passed = 0;
    +		zisofs->block_pointers_avail = 0;
    +#endif
    +		archive_entry_set_size(entry, file->pz_uncompressed_size);
     	}
     
    -	release_file(iso9660, file);
    +	iso9660->previous_number = file->number;
    +	archive_strcpy(&iso9660->previous_pathname, iso9660->pathname.s);
    +
    +	/* Reset entry_bytes_remaining if the file is multi extent. */
    +	iso9660->entry_content = file->contents.first;
    +	if (iso9660->entry_content != NULL)
    +		iso9660->entry_bytes_remaining = iso9660->entry_content->size;
    +
    +	if (archive_entry_filetype(entry) == AE_IFDIR) {
    +		/* Overwrite nlinks by proper link number which is
    +		 * calculated from number of sub directories. */
    +		archive_entry_set_nlink(entry, 2 + file->subdirs);
    +		/* Directory data has been read completely. */
    +		iso9660->entry_bytes_remaining = 0;
    +		iso9660->entry_sparse_offset = 0;
    +		file->exposed = 1;
    +	}
    +
    +	if (rd_r != ARCHIVE_OK)
    +		return (rd_r);
     	return (ARCHIVE_OK);
     }
     
    @@ -682,6 +1333,241 @@ archive_read_format_iso9660_read_data_skip(struct archive_read *a)
     	return (ARCHIVE_OK);
     }
     
    +#ifdef HAVE_ZLIB_H
    +
    +static int
    +zisofs_read_data(struct archive_read *a,
    +    const void **buff, size_t *size, off_t *offset)
    +{
    +	struct iso9660 *iso9660;
    +	struct zisofs  *zisofs;
    +	const unsigned char *p;
    +	size_t avail;
    +	ssize_t bytes_read;
    +	size_t uncompressed_size;
    +	int r;
    +
    +	iso9660 = (struct iso9660 *)(a->format->data);
    +	zisofs = &iso9660->entry_zisofs;
    +
    +	p = __archive_read_ahead(a, 1, &bytes_read);
    +	if (bytes_read <= 0) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
    +		    "Truncated zisofs file body");
    +		return (ARCHIVE_FATAL);
    +	}
    +	if (bytes_read > iso9660->entry_bytes_remaining)
    +		bytes_read = iso9660->entry_bytes_remaining;
    +	avail = bytes_read;
    +	uncompressed_size = 0;
    +
    +	if (!zisofs->initialized) {
    +		size_t ceil, xsize;
    +
    +		/* Allocate block pointers buffer. */
    +		ceil = (zisofs->pz_uncompressed_size +
    +			(1LL << zisofs->pz_log2_bs) - 1)
    +			>> zisofs->pz_log2_bs;
    +		xsize = (ceil + 1) * 4;
    +		if (zisofs->block_pointers_alloc < xsize) {
    +			size_t alloc;
    +
    +			if (zisofs->block_pointers != NULL)
    +				free(zisofs->block_pointers);
    +			alloc = ((xsize >> 10) + 1) << 10;
    +			zisofs->block_pointers = malloc(alloc);
    +			if (zisofs->block_pointers == NULL) {
    +				archive_set_error(&a->archive, ENOMEM,
    +				    "No memory for zisofs decompression");
    +				return (ARCHIVE_FATAL);
    +			}
    +			zisofs->block_pointers_alloc = alloc;
    +		}
    +		zisofs->block_pointers_size = xsize;
    +
    +		/* Allocate uncompressed data buffer. */
    +		xsize = 1UL << zisofs->pz_log2_bs;
    +		if (zisofs->uncompressed_buffer_size < xsize) {
    +			if (zisofs->uncompressed_buffer != NULL)
    +				free(zisofs->uncompressed_buffer);
    +			zisofs->uncompressed_buffer = malloc(xsize);
    +			if (zisofs->uncompressed_buffer == NULL) {
    +				archive_set_error(&a->archive, ENOMEM,
    +				    "No memory for zisofs decompression");
    +				return (ARCHIVE_FATAL);
    +			}
    +		}
    +		zisofs->uncompressed_buffer_size = xsize;
    +
    +		/*
    +		 * Read the file header, and check the magic code of zisofs.
    +		 */
    +		if (zisofs->header_avail < sizeof(zisofs->header)) {
    +			xsize = sizeof(zisofs->header) - zisofs->header_avail;
    +			if (avail < xsize)
    +				xsize = avail;
    +			memcpy(zisofs->header + zisofs->header_avail, p, xsize);
    +			zisofs->header_avail += xsize;
    +			avail -= xsize;
    +			p += xsize;
    +		}
    +		if (!zisofs->header_passed &&
    +		    zisofs->header_avail == sizeof(zisofs->header)) {
    +			int err = 0;
    +
    +			if (memcmp(zisofs->header, zisofs_magic,
    +			    sizeof(zisofs_magic)) != 0)
    +				err = 1;
    +			if (archive_le32dec(zisofs->header + 8)
    +			    != zisofs->pz_uncompressed_size)
    +				err = 1;
    +			if (zisofs->header[12] != 4)
    +				err = 1;
    +			if (zisofs->header[13] != zisofs->pz_log2_bs)
    +				err = 1;
    +			if (err) {
    +				archive_set_error(&a->archive,
    +				    ARCHIVE_ERRNO_FILE_FORMAT,
    +				    "Illegal zisofs file body");
    +				return (ARCHIVE_FATAL);
    +			}
    +			zisofs->header_passed = 1;
    +		}
    +		/*
    +		 * Read block pointers.
    +		 */
    +		if (zisofs->header_passed &&
    +		    zisofs->block_pointers_avail < zisofs->block_pointers_size) {
    +			xsize = zisofs->block_pointers_size
    +			    - zisofs->block_pointers_avail;
    +			if (avail < xsize)
    +				xsize = avail;
    +			memcpy(zisofs->block_pointers
    +			    + zisofs->block_pointers_avail, p, xsize);
    +			zisofs->block_pointers_avail += xsize;
    +			avail -= xsize;
    +			p += xsize;
    +		    	if (zisofs->block_pointers_avail
    +			    == zisofs->block_pointers_size) {
    +				/* We've got all block pointers and initialize
    +				 * related variables.	*/
    +				zisofs->block_off = 0;
    +				zisofs->block_avail = 0;
    +				/* Complete a initialization */
    +				zisofs->initialized = 1;
    +			}
    +		}
    +
    +		if (!zisofs->initialized)
    +			goto next_data; /* We need more datas. */
    +	}
    +
    +	/*
    +	 * Get block offsets from block pointers.
    +	 */
    +	if (zisofs->block_avail == 0) {
    +		uint32_t bst, bed;
    +
    +		if (zisofs->block_off + 4 >= zisofs->block_pointers_size) {
    +			/* There isn't a pair of offsets. */
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
    +			    "Illegal zisofs block pointers");
    +			return (ARCHIVE_FATAL);
    +		}
    +		bst = archive_le32dec(zisofs->block_pointers + zisofs->block_off);
    +		if (bst != zisofs->pz_offset + (bytes_read - avail)) {
    +			/* TODO: Should we seek offset of current file by bst ? */
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
    +			    "Illegal zisofs block pointers(cannot seek)");
    +			return (ARCHIVE_FATAL);
    +		}
    +		bed = archive_le32dec(
    +		    zisofs->block_pointers + zisofs->block_off + 4);
    +		if (bed < bst) {
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
    +			    "Illegal zisofs block pointers");
    +			return (ARCHIVE_FATAL);
    +		}
    +		zisofs->block_avail = bed - bst;
    +		zisofs->block_off += 4;
    +
    +		/* Initialize compression library for new block. */
    +		if (zisofs->stream_valid)
    +			r = inflateReset(&zisofs->stream);
    +		else
    +			r = inflateInit(&zisofs->stream);
    +		if (r != Z_OK) {
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +			    "Can't initialize zisofs decompression.");
    +			return (ARCHIVE_FATAL);
    +		}
    +		zisofs->stream_valid = 1;
    +		zisofs->stream.total_in = 0;
    +		zisofs->stream.total_out = 0;
    +	}
    +
    +	/*
    +	 * Make uncompressed datas.
    +	 */
    +	if (zisofs->block_avail == 0) {
    +		memset(zisofs->uncompressed_buffer, 0,
    +		    zisofs->uncompressed_buffer_size);
    +		uncompressed_size = zisofs->uncompressed_buffer_size;
    +	} else {
    +		zisofs->stream.next_in = (Bytef *)(uintptr_t)(const void *)p;
    +		if (avail > zisofs->block_avail)
    +			zisofs->stream.avail_in = zisofs->block_avail;
    +		else
    +			zisofs->stream.avail_in = avail;
    +		zisofs->stream.next_out = zisofs->uncompressed_buffer;
    +		zisofs->stream.avail_out = zisofs->uncompressed_buffer_size;
    +
    +		r = inflate(&zisofs->stream, 0);
    +		switch (r) {
    +		case Z_OK: /* Decompressor made some progress.*/
    +		case Z_STREAM_END: /* Found end of stream. */
    +			break;
    +		default:
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +			    "zisofs decompression failed (%d)", r);
    +			return (ARCHIVE_FATAL);
    +		}
    +		uncompressed_size =
    +		    zisofs->uncompressed_buffer_size - zisofs->stream.avail_out;
    +		avail -= zisofs->stream.next_in - p;
    +		zisofs->block_avail -= zisofs->stream.next_in - p;
    +	}
    +next_data:
    +	bytes_read -= avail;
    +	*buff = zisofs->uncompressed_buffer;
    +	*size = uncompressed_size;
    +	*offset = iso9660->entry_sparse_offset;
    +	iso9660->entry_sparse_offset += uncompressed_size;
    +	iso9660->entry_bytes_remaining -= bytes_read;
    +	iso9660->current_position += bytes_read;
    +	zisofs->pz_offset += bytes_read;
    +	__archive_read_consume(a, bytes_read);
    +
    +	return (ARCHIVE_OK);
    +}
    +
    +#else /* HAVE_ZLIB_H */
    +
    +static int
    +zisofs_read_data(struct archive_read *a,
    +    const void **buff, size_t *size, off_t *offset)
    +{
    +
    +	(void)buff;/* UNUSED */
    +	(void)size;/* UNUSED */
    +	(void)offset;/* UNUSED */
    +	archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
    +	    "zisofs is not supported on this platform.");
    +	return (ARCHIVE_FAILED);
    +}
    +
    +#endif /* HAVE_ZLIB_H */
    +
     static int
     archive_read_format_iso9660_read_data(struct archive_read *a,
         const void **buff, size_t *size, off_t *offset)
    @@ -691,11 +1577,41 @@ archive_read_format_iso9660_read_data(struct archive_read *a,
     
     	iso9660 = (struct iso9660 *)(a->format->data);
     	if (iso9660->entry_bytes_remaining <= 0) {
    -		*buff = NULL;
    -		*size = 0;
    -		*offset = iso9660->entry_sparse_offset;
    -		return (ARCHIVE_EOF);
    +		if (iso9660->entry_content != NULL)
    +			iso9660->entry_content = iso9660->entry_content->next;
    +		if (iso9660->entry_content == NULL) {
    +			*buff = NULL;
    +			*size = 0;
    +			*offset = iso9660->entry_sparse_offset;
    +			return (ARCHIVE_EOF);
    +		}
    +		/* Seek forward to the start of the entry. */
    +		if (iso9660->current_position < iso9660->entry_content->offset) {
    +			int64_t step;
    +
    +			step = iso9660->entry_content->offset -
    +			    iso9660->current_position;
    +			step = __archive_read_skip(a, step);
    +			if (step < 0)
    +				return ((int)step);
    +			iso9660->current_position =
    +			    iso9660->entry_content->offset;
    +		}
    +		if (iso9660->entry_content->offset < iso9660->current_position) {
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +			    "Ignoring out-of-order file (%s) %jd < %jd",
    +			    iso9660->pathname.s,
    +			    iso9660->entry_content->offset,
    +			    iso9660->current_position);
    +			*buff = NULL;
    +			*size = 0;
    +			*offset = iso9660->entry_sparse_offset;
    +			return (ARCHIVE_WARN);
    +		}
    +		iso9660->entry_bytes_remaining = iso9660->entry_content->size;
     	}
    +	if (iso9660->entry_zisofs.pz)
    +		return (zisofs_read_data(a, buff, size, offset));
     
     	*buff = __archive_read_ahead(a, 1, &bytes_read);
     	if (bytes_read == 0)
    @@ -718,18 +1634,33 @@ static int
     archive_read_format_iso9660_cleanup(struct archive_read *a)
     {
     	struct iso9660 *iso9660;
    -	struct file_info *file;
    +	int r = ARCHIVE_OK;
     
     	iso9660 = (struct iso9660 *)(a->format->data);
    -	while ((file = next_entry(iso9660)) != NULL)
    -		release_file(iso9660, file);
    +	release_files(iso9660);
    +	free(iso9660->read_ce_req.reqs);
     	archive_string_free(&iso9660->pathname);
     	archive_string_free(&iso9660->previous_pathname);
    -	if (iso9660->pending_files)
    -		free(iso9660->pending_files);
    +	if (iso9660->pending_files.files)
    +		free(iso9660->pending_files.files);
    +	if (iso9660->re_dirs.files)
    +		free(iso9660->re_dirs.files);
    +	if (iso9660->cl_files.files)
    +		free(iso9660->cl_files.files);
    +#ifdef HAVE_ZLIB_H
    +	free(iso9660->entry_zisofs.uncompressed_buffer);
    +	free(iso9660->entry_zisofs.block_pointers);
    +	if (iso9660->entry_zisofs.stream_valid) {
    +		if (inflateEnd(&iso9660->entry_zisofs.stream) != Z_OK) {
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +			    "Failed to clean up zlib decompressor");
    +			r = ARCHIVE_FATAL;
    +		}
    +	}
    +#endif
     	free(iso9660);
     	(a->format->data) = NULL;
    -	return (ARCHIVE_OK);
    +	return (r);
     }
     
     /*
    @@ -737,47 +1668,78 @@ archive_read_format_iso9660_cleanup(struct archive_read *a)
      * of any extensions, and stores the result in memory.
      */
     static struct file_info *
    -parse_file_info(struct iso9660 *iso9660, struct file_info *parent,
    +parse_file_info(struct archive_read *a, struct file_info *parent,
         const unsigned char *isodirrec)
     {
    +	struct iso9660 *iso9660;
     	struct file_info *file;
     	size_t name_len;
     	const unsigned char *rr_start, *rr_end;
     	const unsigned char *p;
    +	size_t dr_len;
    +	int32_t location;
     	int flags;
     
    -	/* TODO: Sanity check that name_len doesn't exceed length, etc. */
    +	iso9660 = (struct iso9660 *)(a->format->data);
    +
    +	dr_len = (size_t)isodirrec[DR_length_offset];
    +	name_len = (size_t)isodirrec[DR_name_len_offset];
    +	location = archive_le32dec(isodirrec + DR_extent_offset);
    +	/* Sanity check that dr_len needs at least 34. */
    +	if (dr_len < 34) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Invalid length of directory record");
    +		return (NULL);
    +	}
    +	/* Sanity check that name_len doesn't exceed dr_len. */
    +	if (dr_len - 33 < name_len || name_len == 0) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Invalid length of file identifier");
    +		return (NULL);
    +	}
    +	/* Sanity check that location doesn't exceed volume block.
    +	 * Don't check lower limit of location; it's possibility
    +	 * the location has negative value when file type is symbolic
    +	 * link or file size is zero. As far as I know latest mkisofs
    +	 * do that.
    +	 */
    +	if (location >= iso9660->volume_block) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Invalid location of extent of file");
    +		return (NULL);
    +	}
     
     	/* Create a new file entry and copy data from the ISO dir record. */
     	file = (struct file_info *)malloc(sizeof(*file));
    -	if (file == NULL)
    +	if (file == NULL) {
    +		archive_set_error(&a->archive, ENOMEM,
    +		    "No memory for file entry");
     		return (NULL);
    +	}
     	memset(file, 0, sizeof(*file));
     	file->parent = parent;
    -	if (parent != NULL)
    -		parent->refcount++;
    -	file->offset = (uint64_t)toi(isodirrec + DR_extent_offset, DR_extent_size)
    -	    * iso9660->logical_block_size;
    +	file->offset = iso9660->logical_block_size * (uint64_t)location;
     	file->size = toi(isodirrec + DR_size_offset, DR_size_size);
     	file->mtime = isodate7(isodirrec + DR_date_offset);
     	file->ctime = file->atime = file->mtime;
     
    -	name_len = (size_t)isodirrec[DR_name_len_offset];
     	p = isodirrec + DR_name_offset;
     	/* Rockridge extensions (if any) follow name.  Compute this
     	 * before fidgeting the name_len below. */
    -	rr_start = p + name_len + (name_len & 1 ? 0 : 1) + iso9660->suspOffset;
    -	rr_end = isodirrec + isodirrec[DR_length_offset];
    +	rr_start = p + name_len + (name_len & 1 ? 0 : 1);
    +	rr_end = isodirrec + dr_len;
     
     	if (iso9660->seenJoliet) {
     		/* Joliet names are max 64 chars (128 bytes) according to spec,
    -		 * but genisoimage (and others?) will allow you to have more.
    +		 * but genisoimage/mkisofs allows recording longer Joliet
    +		 * names which are 103 UCS2 characters(206 bytes) by their
    +		 * option '-joliet-long'.
     		 */
    -		wchar_t wbuff[64+1], *wp;
    +		wchar_t wbuff[103+1], *wp;
     		const unsigned char *c;
     
    -		/* TODO: warn when name_len > 128 ? */
    -
    +		if (name_len > 206)
    +			name_len = 206;
     		/* convert BE UTF-16 to wchar_t */
     		for (c = p, wp = wbuff;
     				c < (p + name_len) &&
    @@ -828,9 +1790,78 @@ parse_file_info(struct iso9660 *iso9660, struct file_info *parent,
     		file->mode = AE_IFDIR | 0700;
     	else
     		file->mode = AE_IFREG | 0400;
    +	if (flags & 0x80)
    +		file->multi_extent = 1;
    +	else
    +		file->multi_extent = 0;
    +	/*
    +	 * Use location for file number.
    +	 * File number is treated as inode number to find out harlink
    +	 * target. If Rockridge extensions is being used, file number
    +	 * will be overwritten by FILE SERIAL NUMBER of RRIP "PX"
    +	 * extension.
    +	 * NOTE: Old mkisofs did not record that FILE SERIAL NUMBER
    +	 * in ISO images.
    +	 */
    +	if (file->size == 0 && location >= 0)
    +		/* If file->size is zero, its location points wrong place.
    +		 * Dot not use it for file number.
    +		 * When location has negative value, it can be used
    +		 * for file number.
    +		 */
    +		file->number = -1;
    +	else
    +		file->number = (int64_t)(uint32_t)location;
     
     	/* Rockridge extensions overwrite information from above. */
    -	parse_rockridge(iso9660, file, rr_start, rr_end);
    +	if (iso9660->opt_support_rockridge) {
    +		if (parent == NULL && rr_end - rr_start >= 7) {
    +			p = rr_start;
    +			if (p[0] == 'S' && p[1] == 'P'
    +			    && p[2] == 7 && p[3] == 1
    +			    && p[4] == 0xBE && p[5] == 0xEF) {
    +				/*
    +				 * SP extension stores the suspOffset
    +				 * (Number of bytes to skip between
    +				 * filename and SUSP records.)
    +				 * It is mandatory by the SUSP standard
    +				 * (IEEE 1281).
    +				 *
    +				 * It allows SUSP to coexist with
    +				 * non-SUSP uses of the System
    +				 * Use Area by placing non-SUSP data
    +				 * before SUSP data.
    +				 *
    +				 * SP extension must be in the root
    +				 * directory entry, disable all SUSP
    +				 * processing if not found.
    +				 */
    +				iso9660->suspOffset = p[6];
    +				iso9660->seenSUSP = 1;
    +				rr_start += 7;
    +			}
    +		}
    +		if (iso9660->seenSUSP) {
    +			int r;
    +
    +			file->name_continues = 0;
    +			file->symlink_continues = 0;
    +			rr_start += iso9660->suspOffset;
    +			r = parse_rockridge(a, file, rr_start, rr_end);
    +			if (r != ARCHIVE_OK) {
    +				free(file);
    +				return (NULL);
    +			}
    +		} else
    +			/* If there isn't SUSP, disable parsing
    +			 * rock ridge extensions. */
    +			iso9660->opt_support_rockridge = 0;
    +	}
    +
    +	file->nlinks = 1;/* Reset nlink. we'll calculate it later. */
    +	/* Tell file's parent how many children that parent has. */
    +	if (parent != NULL && (flags & 0x02) && file->cl_offset == 0)
    +		parent->subdirs++;
     
     #if DEBUG
     	/* DEBUGGING: Warn about attributes I don't yet fully support. */
    @@ -856,45 +1887,19 @@ parse_file_info(struct iso9660 *iso9660, struct file_info *parent,
     		fprintf(stderr, "\n");
     	}
     #endif
    +	register_file(iso9660, file);
     	return (file);
     }
     
    -static void
    -add_entry(struct iso9660 *iso9660, struct file_info *file)
    -{
    -	/* Expand our pending files list as necessary. */
    -	if (iso9660->pending_files_used >= iso9660->pending_files_allocated) {
    -		struct file_info **new_pending_files;
    -		int new_size = iso9660->pending_files_allocated * 2;
    -
    -		if (iso9660->pending_files_allocated < 1024)
    -			new_size = 1024;
    -		/* Overflow might keep us from growing the list. */
    -		if (new_size <= iso9660->pending_files_allocated)
    -			__archive_errx(1, "Out of memory");
    -		new_pending_files = (struct file_info **)malloc(new_size * sizeof(new_pending_files[0]));
    -		if (new_pending_files == NULL)
    -			__archive_errx(1, "Out of memory");
    -		memcpy(new_pending_files, iso9660->pending_files,
    -		    iso9660->pending_files_allocated * sizeof(new_pending_files[0]));
    -		if (iso9660->pending_files != NULL)
    -			free(iso9660->pending_files);
    -		iso9660->pending_files = new_pending_files;
    -		iso9660->pending_files_allocated = new_size;
    -	}
    -
    -	iso9660->pending_files[iso9660->pending_files_used++] = file;
    -}
    -
    -static void
    -parse_rockridge(struct iso9660 *iso9660, struct file_info *file,
    +static int
    +parse_rockridge(struct archive_read *a, struct file_info *file,
         const unsigned char *p, const unsigned char *end)
     {
    -	(void)iso9660; /* UNUSED */
    -	file->name_continues = 0;
    -	file->symlink_continues = 0;
    +	struct iso9660 *iso9660;
     
    -	while (p + 4 < end  /* Enough space for another entry. */
    +	iso9660 = (struct iso9660 *)(a->format->data);
    +
    +	while (p + 4 <= end  /* Enough space for another entry. */
     	    && p[0] >= 'A' && p[0] <= 'Z' /* Sanity-check 1st char of name. */
     	    && p[1] >= 'A' && p[1] <= 'Z' /* Sanity-check 2nd char of name. */
     	    && p[2] >= 4 /* Sanity-check length. */
    @@ -918,26 +1923,35 @@ parse_rockridge(struct iso9660 *iso9660, struct file_info *file,
     					 *   8 byte offset w/in above sector
     					 *   8 byte length of continuation
     					 */
    -					file->ce_offset = (uint64_t)toi(data, 4)
    -					    * iso9660->logical_block_size
    -					    + toi(data + 8, 4);
    -					file->ce_size = toi(data + 16, 4);
    -					/* If the result is rediculous,
    -					 * ignore it. */
    -					if (file->ce_offset + file->ce_size
    -					    > iso9660->volume_size) {
    -						file->ce_offset = 0;
    -						file->ce_size = 0;
    -					}
    +					int32_t location =
    +					    archive_le32dec(data);
    +					file->ce_offset =
    +					    archive_le32dec(data+8);
    +					file->ce_size =
    +					    archive_le32dec(data+16);
    +					if (register_CE(a, location, file)
    +					    != ARCHIVE_OK)
    +						return (ARCHIVE_FATAL);
    +				}
    +				break;
    +			}
    +			if (p[0] == 'C' && p[1] == 'L') {
    +				if (version == 1 && data_length == 8) {
    +					file->cl_offset = (uint64_t)
    +					    iso9660->logical_block_size *
    +					    (uint64_t)archive_le32dec(data);
    +					iso9660->seenRockridge = 1;
     				}
     				break;
     			}
     			/* FALLTHROUGH */
     		case 'N':
     			if (p[0] == 'N' && p[1] == 'M') {
    -				if (version == 1)
    +				if (version == 1) {
     					parse_rockridge_NM1(file,
     					    data, data_length);
    +					iso9660->seenRockridge = 1;
    +				}
     				break;
     			}
     			/* FALLTHROUGH */
    @@ -954,6 +1968,7 @@ parse_rockridge(struct iso9660 *iso9660, struct file_info *file,
     					file->rdev = toi(data,4);
     					file->rdev <<= 32;
     					file->rdev |= toi(data + 8, 4);
    +					iso9660->seenRockridge = 1;
     				}
     				break;
     			}
    @@ -980,51 +1995,36 @@ parse_rockridge(struct iso9660 *iso9660, struct file_info *file,
     						file->gid
     						    = toi(data + 24, 4);
     					if (data_length >= 40)
    -						file->inode
    +						file->number
     						    = toi(data + 32, 4);
    +					iso9660->seenRockridge = 1;
     				}
     				break;
     			}
     			/* FALLTHROUGH */
     		case 'R':
    -			if (p[0] == 'R' && p[1] == 'R' && version == 1) {
    +			if (p[0] == 'R' && p[1] == 'E' && version == 1) {
    +				file->re = 1;
     				iso9660->seenRockridge = 1;
    +				break;
    +			}
    +			if (p[0] == 'R' && p[1] == 'R' && version == 1) {
     				/*
     				 * RR extension comprises:
     				 *    one byte flag value
    +				 * This extension is obsolete,
    +				 * so contents are always ignored.
     				 */
    -				/* TODO: Handle RR extension. */
     				break;
     			}
     			/* FALLTHROUGH */
     		case 'S':
     			if (p[0] == 'S' && p[1] == 'L') {
    -				if (version == 1)
    +				if (version == 1) {
     					parse_rockridge_SL1(file,
     					    data, data_length);
    -				break;
    -			}
    -			if (p[0] == 'S' && p[1] == 'P'
    -			    && version == 1 && data_length == 3
    -			    && data[0] == (unsigned char)'\xbe'
    -			    && data[1] == (unsigned char)'\xef') {
    -				/*
    -				 * SP extension stores the suspOffset
    -				 * (Number of bytes to skip between
    -				 * filename and SUSP records.)
    -				 * It is mandatory by the SUSP standard
    -				 * (IEEE 1281).
    -				 *
    -				 * It allows SUSP to coexist with
    -				 * non-SUSP uses of the System
    -				 * Use Area by placing non-SUSP data
    -				 * before SUSP data.
    -				 *
    -				 * TODO: Add a check for 'SP' in
    -				 * first directory entry, disable all SUSP
    -				 * processing if not found.
    -				 */
    -				iso9660->suspOffset = data[2];
    +					iso9660->seenRockridge = 1;
    +				}
     				break;
     			}
     			if (p[0] == 'S' && p[1] == 'T'
    @@ -1038,29 +2038,31 @@ parse_rockridge(struct iso9660 *iso9660, struct file_info *file,
     				 * Use Area by placing non-SUSP data
     				 * after SUSP data.
     				 */
    -				return;
    +				iso9660->seenSUSP = 0;
    +				iso9660->seenRockridge = 0;
    +				return (ARCHIVE_OK);
     			}
     		case 'T':
     			if (p[0] == 'T' && p[1] == 'F') {
    -				if (version == 1)
    +				if (version == 1) {
     					parse_rockridge_TF1(file,
     					    data, data_length);
    +					iso9660->seenRockridge = 1;
    +				}
    +				break;
    +			}
    +			/* FALLTHROUGH */
    +		case 'Z':
    +			if (p[0] == 'Z' && p[1] == 'F') {
    +				if (version == 1)
    +					parse_rockridge_ZF1(file,
    +					    data, data_length);
     				break;
     			}
     			/* FALLTHROUGH */
     		default:
     			/* The FALLTHROUGHs above leave us here for
     			 * any unsupported extension. */
    -#if DEBUG
    -			{
    -				const unsigned char *t;
    -				fprintf(stderr, "\nUnsupported RRIP extension for %s\n", file->name.s);
    -				fprintf(stderr, " %c%c(%d):", p[0], p[1], data_length);
    -				for (t = data; t < data + data_length && t < data + 16; t++)
    -					fprintf(stderr, " %02x", *t);
    -				fprintf(stderr, "\n");
    -			}
    -#endif
     			break;
     		}
     
    @@ -1068,6 +2070,155 @@ parse_rockridge(struct iso9660 *iso9660, struct file_info *file,
     
     		p += p[2];
     	}
    +	return (ARCHIVE_OK);
    +}
    +
    +static int
    +register_CE(struct archive_read *a, int32_t location,
    +    struct file_info *file)
    +{
    +	struct iso9660 *iso9660;
    +	struct read_ce_queue *heap;
    +	struct read_ce_req *p;
    +	uint64_t offset, parent_offset;
    +	int hole, parent;
    +
    +	iso9660 = (struct iso9660 *)(a->format->data);
    +	offset = ((uint64_t)location) * (uint64_t)iso9660->logical_block_size;
    +	if (((file->mode & AE_IFMT) == AE_IFREG &&
    +	    offset >= file->offset) ||
    +	    offset < iso9660->current_position) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Invalid location in SUSP \"CE\" extension");
    +		return (ARCHIVE_FATAL);
    +	}
    +
    +	/* Expand our CE list as necessary. */
    +	heap = &(iso9660->read_ce_req);
    +	if (heap->cnt >= heap->allocated) {
    +		int new_size;
    +
    +		if (heap->allocated < 16)
    +			new_size = 16;
    +		else
    +			new_size = heap->allocated * 2;
    +		/* Overflow might keep us from growing the list. */
    +		if (new_size <= heap->allocated)
    +			__archive_errx(1, "Out of memory");
    +		p = malloc(new_size * sizeof(p[0]));
    +		if (p == NULL)
    +			__archive_errx(1, "Out of memory");
    +		if (heap->reqs != NULL) {
    +			memcpy(p, heap->reqs, heap->cnt * sizeof(*p));
    +			free(heap->reqs);
    +		}
    +		heap->reqs = p;
    +		heap->allocated = new_size;
    +	}
    +
    +	/*
    +	 * Start with hole at end, walk it up tree to find insertion point.
    +	 */
    +	hole = heap->cnt++;
    +	while (hole > 0) {
    +		parent = (hole - 1)/2;
    +		parent_offset = heap->reqs[parent].offset;
    +		if (offset >= parent_offset) {
    +			heap->reqs[hole].offset = offset;
    +			heap->reqs[hole].file = file;
    +			return (ARCHIVE_OK);
    +		}
    +		// Move parent into hole <==> move hole up tree.
    +		heap->reqs[hole] = heap->reqs[parent];
    +		hole = parent;
    +	}
    +	heap->reqs[0].offset = offset;
    +	heap->reqs[0].file = file;
    +	return (ARCHIVE_OK);
    +}
    +
    +static void
    +next_CE(struct read_ce_queue *heap)
    +{
    +	uint64_t a_offset, b_offset, c_offset;
    +	int a, b, c;
    +	struct read_ce_req tmp;
    +
    +	if (heap->cnt < 1)
    +		return;
    +
    +	/*
    +	 * Move the last item in the heap to the root of the tree
    +	 */
    +	heap->reqs[0] = heap->reqs[--(heap->cnt)];
    +
    +	/*
    +	 * Rebalance the heap.
    +	 */
    +	a = 0; // Starting element and its offset
    +	a_offset = heap->reqs[a].offset;
    +	for (;;) {
    +		b = a + a + 1; // First child
    +		if (b >= heap->cnt)
    +			return;
    +		b_offset = heap->reqs[b].offset;
    +		c = b + 1; // Use second child if it is smaller.
    +		if (c < heap->cnt) {
    +			c_offset = heap->reqs[c].offset;
    +			if (c_offset < b_offset) {
    +				b = c;
    +				b_offset = c_offset;
    +			}
    +		}
    +		if (a_offset <= b_offset)
    +			return;
    +		tmp = heap->reqs[a];
    +		heap->reqs[a] = heap->reqs[b];
    +		heap->reqs[b] = tmp;
    +		a = b;
    +	}
    +}
    +
    +
    +static int
    +read_CE(struct archive_read *a, struct iso9660 *iso9660)
    +{
    +	struct read_ce_queue *heap;
    +	const unsigned char *b, *p, *end;
    +	struct file_info *file;
    +	size_t step;
    +	int r;
    +
    +	/* Read data which RRIP "CE" extension points. */
    +	heap = &(iso9660->read_ce_req);
    +	step = iso9660->logical_block_size;
    +	while (heap->cnt &&
    +	    heap->reqs[0].offset == iso9660->current_position) {
    +		b = __archive_read_ahead(a, step, NULL);
    +		if (b == NULL) {
    +			archive_set_error(&a->archive,
    +			    ARCHIVE_ERRNO_MISC,
    +			    "Failed to read full block when scanning "
    +			    "ISO9660 directory list");
    +			return (ARCHIVE_FATAL);
    +		}
    +		do {
    +			file = heap->reqs[0].file;
    +			p = b + file->ce_offset;
    +			end = p + file->ce_size;
    +			next_CE(heap);
    +			r = parse_rockridge(a, file, p, end);
    +			if (r != ARCHIVE_OK)
    +				return (ARCHIVE_FATAL);
    +		} while (heap->cnt &&
    +		    heap->reqs[0].offset == iso9660->current_position);
    +		/* NOTE: Do not move this consume's code to fron of
    +		 * do-while loop. Registration of nested CE extension
    +		 * might cause error because of current position. */
    +		__archive_read_consume(a, step);
    +		iso9660->current_position += step;
    +	}
    +	return (ARCHIVE_OK);
     }
     
     static void
    @@ -1137,6 +2288,7 @@ parse_rockridge_TF1(struct file_info *file, const unsigned char *data,
     		/* Use 17-byte time format. */
     		if ((flag & 1) && data_length >= 17) {
     			/* Create time. */
    +			file->birthtime_is_set = 1;
     			file->birthtime = isodate17(data);
     			data += 17;
     			data_length -= 17;
    @@ -1156,14 +2308,13 @@ parse_rockridge_TF1(struct file_info *file, const unsigned char *data,
     		if ((flag & 8) && data_length >= 17) {
     			/* Attribute change time. */
     			file->ctime = isodate17(data);
    -			data += 17;
    -			data_length -= 17;
     		}
     	} else {
     		/* Use 7-byte time format. */
     		if ((flag & 1) && data_length >= 7) {
     			/* Create time. */
    -			file->birthtime = isodate17(data);
    +			file->birthtime_is_set = 1;
    +			file->birthtime = isodate7(data);
     			data += 7;
     			data_length -= 7;
     		}
    @@ -1182,8 +2333,6 @@ parse_rockridge_TF1(struct file_info *file, const unsigned char *data,
     		if ((flag & 8) && data_length >= 7) {
     			/* Attribute change time. */
     			file->ctime = isodate7(data);
    -			data += 7;
    -			data_length -= 7;
     		}
     	}
     }
    @@ -1196,7 +2345,8 @@ parse_rockridge_SL1(struct file_info *file, const unsigned char *data,
     
     	if (!file->symlink_continues || file->symlink.length < 1)
     		archive_string_empty(&file->symlink);
    -	else if (file->symlink.s[file->symlink.length - 1] != '/')
    +	else if (!file->symlink_continues &&
    +	    file->symlink.s[file->symlink.length - 1] != '/')
     		separator = "/";
     	file->symlink_continues = 0;
     
    @@ -1258,7 +2408,6 @@ parse_rockridge_SL1(struct file_info *file, const unsigned char *data,
     			archive_strcat(&file->symlink, "..");
     			break;
     		case 0x08: /* Root of filesystem. */
    -			archive_string_empty(&file->symlink);
     			archive_strcat(&file->symlink, "/");
     			separator = "";
     			break;
    @@ -1278,24 +2427,47 @@ parse_rockridge_SL1(struct file_info *file, const unsigned char *data,
     	}
     }
     
    +static void
    +parse_rockridge_ZF1(struct file_info *file, const unsigned char *data,
    +    int data_length)
    +{
    +
    +	if (data[0] == 0x70 && data[1] == 0x7a && data_length == 12) {
    +		/* paged zlib */
    +		file->pz = 1;
    +		file->pz_log2_bs = data[3];
    +		file->pz_uncompressed_size = archive_le32dec(&data[4]);
    +	}
    +}
     
     static void
    -release_file(struct iso9660 *iso9660, struct file_info *file)
    +register_file(struct iso9660 *iso9660, struct file_info *file)
     {
    -	struct file_info *parent;
     
    -	if (file == NULL)
    -		return;
    +	file->use_next = iso9660->use_files;
    +	iso9660->use_files = file;
    +}
    +
    +static void
    +release_files(struct iso9660 *iso9660)
    +{
    +	struct content *con, *connext;
    +	struct file_info *file;
    +
    +	file = iso9660->use_files;
    +	while (file != NULL) {
    +		struct file_info *next = file->use_next;
     
    -	if (file->refcount == 0) {
    -		parent = file->parent;
     		archive_string_free(&file->name);
     		archive_string_free(&file->symlink);
    -		free(file);
    -		if (parent != NULL) {
    -			parent->refcount--;
    -			release_file(iso9660, parent);
    +		con = file->contents.first;
    +		while (con != NULL) {
    +			connext = con->next;
    +			free(con);
    +			con = connext;
     		}
    +		free(file);
    +		file = next;
     	}
     }
     
    @@ -1304,101 +2476,242 @@ next_entry_seek(struct archive_read *a, struct iso9660 *iso9660,
         struct file_info **pfile)
     {
     	struct file_info *file;
    -	uint64_t offset;
     
    -	*pfile = NULL;
    -	for (;;) {
    -		*pfile = file = next_entry(iso9660);
    -		if (file == NULL)
    -			return (ARCHIVE_EOF);
    +	*pfile = file = next_cache_entry(iso9660);
    +	if (file == NULL)
    +		return (ARCHIVE_EOF);
     
    -		/* CE area precedes actual file data? Ignore it. */
    -		if (file->ce_offset > file->offset) {
    -			/* fprintf(stderr, " *** Discarding CE data.\n"); */
    -			file->ce_offset = 0;
    -			file->ce_size = 0;
    -		}
    +	/* Don't waste time seeking for zero-length bodies. */
    +	if (file->size == 0)
    +		file->offset = iso9660->current_position;
     
    -		/* Don't waste time seeking for zero-length bodies. */
    -		if (file->size == 0) {
    -			file->offset = iso9660->current_position;
    -		}
    +	/* Seek forward to the start of the entry. */
    +	if (iso9660->current_position < file->offset) {
    +		int64_t step;
     
    -		/* If CE exists, find and read it now. */
    -		if (file->ce_offset > 0)
    -			offset = file->ce_offset;
    -		else
    -			offset = file->offset;
    -
    -		/* Seek forward to the start of the entry. */
    -		if (iso9660->current_position < offset) {
    -			off_t step = offset - iso9660->current_position;
    -			off_t bytes_read;
    -			bytes_read = __archive_read_skip(a, step);
    -			if (bytes_read < 0)
    -				return (bytes_read);
    -			iso9660->current_position = offset;
    -		}
    -
    -		/* We found body of file; handle it now. */
    -		if (offset == file->offset)
    -			return (ARCHIVE_OK);
    -
    -		/* Found CE?  Process it and push the file back onto list. */
    -		if (offset == file->ce_offset) {
    -			const void *p;
    -			ssize_t size = file->ce_size;
    -			const unsigned char *rr_start;
    -
    -			file->ce_offset = 0;
    -			file->ce_size = 0;
    -			p = __archive_read_ahead(a, size, NULL);
    -			if (p == NULL)
    -				return (ARCHIVE_FATAL);
    -			rr_start = (const unsigned char *)p;
    -			parse_rockridge(iso9660, file, rr_start,
    -			    rr_start + size);
    -			__archive_read_consume(a, size);
    -			iso9660->current_position += size;
    -			add_entry(iso9660, file);
    -		}
    +		step = file->offset - iso9660->current_position;
    +		step = __archive_read_skip(a, step);
    +		if (step < 0)
    +			return ((int)step);
    +		iso9660->current_position = file->offset;
     	}
    +
    +	/* We found body of file; handle it now. */
    +	return (ARCHIVE_OK);
     }
     
     static struct file_info *
    -next_entry(struct iso9660 *iso9660)
    +next_cache_entry(struct iso9660 *iso9660)
     {
    -	int least_index;
    -	uint64_t least_end_offset;
    -	int i;
    -	struct file_info *r;
    +	struct file_info *file;
    +	struct {
    +		struct file_info	*first;
    +		struct file_info	**last;
    +	}	empty_files;
    +	int64_t number;
    +	int count;
     
    -	if (iso9660->pending_files_used < 1)
    +	file = cache_get_entry(iso9660);
    +	if (file != NULL) {
    +		while (file->parent != NULL && !file->parent->exposed) {
    +			/* If file's parent is not exposed, it's moved
    +			 * to next entry of its parent. */
    +			cache_add_to_next_of_parent(iso9660, file);
    +			file = cache_get_entry(iso9660);
    +		}
    +		return (file);
    +	}
    +
    +	file = next_entry(iso9660);
    +	if (file == NULL)
     		return (NULL);
     
    -	/* Assume the first file in the list is the earliest on disk. */
    -	least_index = 0;
    -	least_end_offset = iso9660->pending_files[0]->offset
    -	    + iso9660->pending_files[0]->size;
    +	if ((file->mode & AE_IFMT) != AE_IFREG || file->number == -1)
    +		return (file);
     
    -	/* Now, try to find an earlier one. */
    -	for (i = 0; i < iso9660->pending_files_used; i++) {
    -		/* Use the position of the file *end* as our comparison. */
    -		uint64_t end_offset = iso9660->pending_files[i]->offset
    -		    + iso9660->pending_files[i]->size;
    -		if (iso9660->pending_files[i]->ce_offset > 0
    -		    && iso9660->pending_files[i]->ce_offset < iso9660->pending_files[i]->offset)
    -			end_offset = iso9660->pending_files[i]->ce_offset
    -		    + iso9660->pending_files[i]->ce_size;
    -		if (least_end_offset > end_offset) {
    -			least_index = i;
    -			least_end_offset = end_offset;
    +	count = 0;
    +	number = file->number;
    +	iso9660->cache_files.first = NULL;
    +	iso9660->cache_files.last = &(iso9660->cache_files.first);
    +	empty_files.first = NULL;
    +	empty_files.last = &empty_files.first;
    +	/* Collect files which has the same file serial number.
    +	 * Peek pending_files so that file which number is different
    +	 * is not put bak. */
    +	while (iso9660->pending_files.used > 0 &&
    +	    (iso9660->pending_files.files[0]->number == -1 ||
    +	     iso9660->pending_files.files[0]->number == number)) {
    +		if (file->number == -1) {
    +			/* This file has the same offset
    +			 * but it's wrong offset which empty files
    +			 * and symlink files have.
    +			 * NOTE: This wrong offse was recorded by
    +			 * old mkisofs utility. If ISO images is
    +			 * created by latest mkisofs, this does not
    +			 * happen.
    +			 */
    +			file->next = NULL;
    +			*empty_files.last = file;
    +			empty_files.last = &(file->next);
    +		} else {
    +			count++;
    +			cache_add_entry(iso9660, file);
     		}
    +		file = next_entry(iso9660);
    +	}
    +
    +	if (count == 0)
    +		return (file);
    +	if (file->number == -1) {
    +		file->next = NULL;
    +		*empty_files.last = file;
    +		empty_files.last = &(file->next);
    +	} else {
    +		count++;
    +		cache_add_entry(iso9660, file);
    +	}
    +
    +	if (count > 1) {
    +		/* The count is the same as number of hardlink,
    +		 * so much so that each nlinks of files in cache_file
    +		 * is overwritten by value of the count.
    +		 */
    +		for (file = iso9660->cache_files.first;
    +		    file != NULL; file = file->next)
    +			file->nlinks = count;
    +	}
    +	/* If there are empty files, that files are added
    +	 * to the tail of the cache_files. */
    +	if (empty_files.first != NULL) {
    +		*iso9660->cache_files.last = empty_files.first;
    +		iso9660->cache_files.last = empty_files.last;
    +	}
    +	return (cache_get_entry(iso9660));
    +}
    +
    +static inline void
    +cache_add_entry(struct iso9660 *iso9660, struct file_info *file)
    +{
    +	file->next = NULL;
    +	*iso9660->cache_files.last = file;
    +	iso9660->cache_files.last = &(file->next);
    +}
    +
    +static inline void
    +cache_add_to_next_of_parent(struct iso9660 *iso9660, struct file_info *file)
    +{
    +	file->next = file->parent->next;
    +	file->parent->next = file;
    +	if (iso9660->cache_files.last == &(file->parent->next))
    +		iso9660->cache_files.last = &(file->next);
    +}
    +
    +static inline struct file_info *
    +cache_get_entry(struct iso9660 *iso9660)
    +{
    +	struct file_info *file;
    +
    +	if ((file = iso9660->cache_files.first) != NULL) {
    +		iso9660->cache_files.first = file->next;
    +		if (iso9660->cache_files.first == NULL)
    +			iso9660->cache_files.last = &(iso9660->cache_files.first);
    +	}
    +	return (file);
    +}
    +
    +static void
    +heap_add_entry(struct heap_queue *heap, struct file_info *file, uint64_t key)
    +{
    +	uint64_t file_key, parent_key;
    +	int hole, parent;
    +
    +	/* Expand our pending files list as necessary. */
    +	if (heap->used >= heap->allocated) {
    +		struct file_info **new_pending_files;
    +		int new_size = heap->allocated * 2;
    +
    +		if (heap->allocated < 1024)
    +			new_size = 1024;
    +		/* Overflow might keep us from growing the list. */
    +		if (new_size <= heap->allocated)
    +			__archive_errx(1, "Out of memory");
    +		new_pending_files = (struct file_info **)
    +		    malloc(new_size * sizeof(new_pending_files[0]));
    +		if (new_pending_files == NULL)
    +			__archive_errx(1, "Out of memory");
    +		memcpy(new_pending_files, heap->files,
    +		    heap->allocated * sizeof(new_pending_files[0]));
    +		if (heap->files != NULL)
    +			free(heap->files);
    +		heap->files = new_pending_files;
    +		heap->allocated = new_size;
    +	}
    +
    +	file_key = file->key = key;
    +
    +	/*
    +	 * Start with hole at end, walk it up tree to find insertion point.
    +	 */
    +	hole = heap->used++;
    +	while (hole > 0) {
    +		parent = (hole - 1)/2;
    +		parent_key = heap->files[parent]->key;
    +		if (file_key >= parent_key) {
    +			heap->files[hole] = file;
    +			return;
    +		}
    +		// Move parent into hole <==> move hole up tree.
    +		heap->files[hole] = heap->files[parent];
    +		hole = parent;
    +	}
    +	heap->files[0] = file;
    +}
    +
    +static struct file_info *
    +heap_get_entry(struct heap_queue *heap)
    +{
    +	uint64_t a_key, b_key, c_key;
    +	int a, b, c;
    +	struct file_info *r, *tmp;
    +
    +	if (heap->used < 1)
    +		return (NULL);
    +
    +	/*
    +	 * The first file in the list is the earliest; we'll return this.
    +	 */
    +	r = heap->files[0];
    +
    +	/*
    +	 * Move the last item in the heap to the root of the tree
    +	 */
    +	heap->files[0] = heap->files[--(heap->used)];
    +
    +	/*
    +	 * Rebalance the heap.
    +	 */
    +	a = 0; // Starting element and its heap key
    +	a_key = heap->files[a]->key;
    +	for (;;) {
    +		b = a + a + 1; // First child
    +		if (b >= heap->used)
    +			return (r);
    +		b_key = heap->files[b]->key;
    +		c = b + 1; // Use second child if it is smaller.
    +		if (c < heap->used) {
    +			c_key = heap->files[c]->key;
    +			if (c_key < b_key) {
    +				b = c;
    +				b_key = c_key;
    +			}
    +		}
    +		if (a_key <= b_key)
    +			return (r);
    +		tmp = heap->files[a];
    +		heap->files[a] = heap->files[b];
    +		heap->files[b] = tmp;
    +		a = b;
     	}
    -	r = iso9660->pending_files[least_index];
    -	iso9660->pending_files[least_index]
    -	    = iso9660->pending_files[--iso9660->pending_files_used];
    -	return (r);
     }
     
     static unsigned int
    diff --git a/lib/libarchive/archive_read_support_format_mtree.c b/lib/libarchive/archive_read_support_format_mtree.c
    index 95094aea8756..5efe4a8a8a75 100644
    --- a/lib/libarchive/archive_read_support_format_mtree.c
    +++ b/lib/libarchive/archive_read_support_format_mtree.c
    @@ -196,7 +196,7 @@ mtree_bid(struct archive_read *a)
     		return (-1);
     
     	if (strncmp(p, signature, strlen(signature)) == 0)
    -		return (8 * strlen(signature));
    +		return (8 * (int)strlen(signature));
     	return (0);
     }
     
    @@ -398,7 +398,6 @@ read_mtree(struct archive_read *a, struct mtree *mtree)
     
     	global = NULL;
     	last_entry = NULL;
    -	r = ARCHIVE_OK;
     
     	for (counter = 1; ; ++counter) {
     		len = readline(a, mtree, &p, 256);
    @@ -588,8 +587,7 @@ parse_file(struct archive_read *a, struct archive_entry *entry,
     
     	if (archive_entry_filetype(entry) == AE_IFREG ||
     	    archive_entry_filetype(entry) == AE_IFDIR) {
    -		mtree->fd = open(path,
    -		    O_RDONLY | O_BINARY);
    +		mtree->fd = open(path, O_RDONLY | O_BINARY);
     		if (mtree->fd == -1 &&
     		    (errno != ENOENT ||
     		     archive_strlen(&mtree->contents_name) > 0)) {
    @@ -1038,11 +1036,7 @@ parse_escapes(char *src, struct mtree_entry *mentry)
     	char *dest = src;
     	char c;
     
    -	/*
    -	 * The current directory is somewhat special, it should be archived
    -	 * only once as it will confuse extraction otherwise.
    -	 */
    -	if (strcmp(src, ".") == 0)
    +	if (mentry != NULL && strcmp(src, ".") == 0)
     		mentry->full = 1;
     
     	while (*src != '\0') {
    @@ -1161,7 +1155,7 @@ mtree_atol10(char **p)
     	digit = **p - '0';
     	while (digit >= 0 && digit < base) {
     		if (l > limit || (l == limit && digit > last_digit_limit)) {
    -			l = UINT64_MAX; /* Truncate on overflow. */
    +			l = INT64_MAX; /* Truncate on overflow. */
     			break;
     		}
     		l = (l * base) + digit;
    @@ -1202,7 +1196,7 @@ mtree_atol16(char **p)
     		digit = -1;
     	while (digit >= 0 && digit < base) {
     		if (l > limit || (l == limit && digit > last_digit_limit)) {
    -			l = UINT64_MAX; /* Truncate on overflow. */
    +			l = INT64_MAX; /* Truncate on overflow. */
     			break;
     		}
     		l = (l * base) + digit;
    diff --git a/lib/libarchive/archive_read_support_format_raw.c b/lib/libarchive/archive_read_support_format_raw.c
    index 7fcfcc1984bd..c994a5deb955 100644
    --- a/lib/libarchive/archive_read_support_format_raw.c
    +++ b/lib/libarchive/archive_read_support_format_raw.c
    @@ -1,187 +1,185 @@
    -/*-
    - * Copyright (c) 2003-2009 Tim Kientzle
    - * 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(S) ``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(S) 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 "archive_platform.h"
    -__FBSDID("$FreeBSD$");
    -
    -#ifdef HAVE_ERRNO_H
    -#include 
    -#endif
    -#include 
    -#ifdef HAVE_STDLIB_H
    -#include 
    -#endif
    -
    -#include "archive.h"
    -#include "archive_entry.h"
    -#include "archive_private.h"
    -#include "archive_read_private.h"
    -
    -struct raw_info {
    -	int64_t offset; /* Current position in the file. */
    -	int     end_of_file;
    -};
    -
    -static int	archive_read_format_raw_bid(struct archive_read *);
    -static int	archive_read_format_raw_cleanup(struct archive_read *);
    -static int	archive_read_format_raw_read_data(struct archive_read *,
    -		    const void **, size_t *, off_t *);
    -static int	archive_read_format_raw_read_data_skip(struct archive_read *);
    -static int	archive_read_format_raw_read_header(struct archive_read *,
    -		    struct archive_entry *);
    -
    -int
    -archive_read_support_format_raw(struct archive *_a)
    -{
    -	struct raw_info *info;
    -	struct archive_read *a = (struct archive_read *)_a;
    -	int r;
    -
    -	info = (struct raw_info *)calloc(1, sizeof(*info));
    -	if (info == NULL) {
    -		archive_set_error(&a->archive, ENOMEM,
    -		    "Can't allocate raw_info data");
    -		return (ARCHIVE_FATAL);
    -	}
    -
    -	r = __archive_read_register_format(a,
    -	    info,
    -	    "raw",
    -	    archive_read_format_raw_bid,
    -	    NULL,
    -	    archive_read_format_raw_read_header,
    -	    archive_read_format_raw_read_data,
    -	    archive_read_format_raw_read_data_skip,
    -	    archive_read_format_raw_cleanup);
    -	if (r != ARCHIVE_OK)
    -		free(info);
    -	return (r);
    -}
    -
    -/*
    - * Bid 1 if this is a non-empty file.  Anyone who can really support
    - * this should outbid us, so it should generally be safe to use "raw"
    - * in conjunction with other formats.  But, this could really confuse
    - * folks if there are bid errors or minor file damage, so we don't
    - * include "raw" as part of support_format_all().
    - */
    -static int
    -archive_read_format_raw_bid(struct archive_read *a)
    -{
    -	const char *p;
    -
    -	if ((p = __archive_read_ahead(a, 1, NULL)) == NULL)
    -		return (-1);
    -	return (1);
    -}
    -
    -/*
    - * Mock up a fake header.
    - */
    -static int
    -archive_read_format_raw_read_header(struct archive_read *a,
    -    struct archive_entry *entry)
    -{
    -	struct raw_info *info;
    -
    -	info = (struct raw_info *)(a->format->data);
    -	if (info->end_of_file)
    -		return (ARCHIVE_EOF);
    -
    -	a->archive.archive_format = ARCHIVE_FORMAT_RAW;
    -	a->archive.archive_format_name = "Raw data";
    -	archive_entry_set_pathname(entry, "data");
    -	/* XXX should we set mode to mimic a regular file? XXX */
    -	/* I'm deliberately leaving most fields unset here. */
    -	return (ARCHIVE_OK);
    -}
    -
    -static int
    -archive_read_format_raw_read_data(struct archive_read *a,
    -    const void **buff, size_t *size, off_t *offset)
    -{
    -	struct raw_info *info;
    -	ssize_t avail;
    -
    -	info = (struct raw_info *)(a->format->data);
    -	if (info->end_of_file)
    -		return (ARCHIVE_EOF);
    -
    -	/* Get whatever bytes are immediately available. */
    -	*buff = __archive_read_ahead(a, 1, &avail);
    -	if (avail > 0) {
    -		/* Consume and return the bytes we just read */
    -		__archive_read_consume(a, avail);
    -		*size = avail;
    -		*offset = info->offset;
    -		info->offset += *size;
    -		return (ARCHIVE_OK);
    -	} else if (0 == avail) {
    -		/* Record and return end-of-file. */
    -		info->end_of_file = 1;
    -		*size = 0;
    -		*offset = info->offset;
    -		return (ARCHIVE_EOF);
    -	} else {
    -		/* Record and return an error. */
    -		*size = 0;
    -		*offset = info->offset;
    -		return (avail);
    -	}
    -	return (ARCHIVE_OK);
    -}
    -
    -static int
    -archive_read_format_raw_read_data_skip(struct archive_read *a)
    -{
    -	struct raw_info *info;
    -	off_t bytes_skipped;
    -	int64_t request = 1024 * 1024 * 1024UL; /* Skip 1 GB at a time. */
    -
    -	info = (struct raw_info *)(a->format->data);
    -	if (info->end_of_file)
    -		return (ARCHIVE_EOF);
    -	info->end_of_file = 1;
    -
    -	for (;;) {
    -		bytes_skipped = __archive_read_skip_lenient(a, request);
    -		if (bytes_skipped < 0)
    -			return (ARCHIVE_FATAL);
    -		if (bytes_skipped < request)
    -			return (ARCHIVE_OK);
    -		/* We skipped all the bytes we asked for.  There might
    -		 * be more, so try again. */
    -	}
    -}
    -
    -static int
    -archive_read_format_raw_cleanup(struct archive_read *a)
    -{
    -	struct raw_info *info;
    -
    -	info = (struct raw_info *)(a->format->data);
    -	free(info);
    -	a->format->data = NULL;
    -	return (ARCHIVE_OK);
    -}
    +/*-
    + * Copyright (c) 2003-2009 Tim Kientzle
    + * 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(S) ``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(S) 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 "archive_platform.h"
    +__FBSDID("$FreeBSD$");
    +
    +#ifdef HAVE_ERRNO_H
    +#include 
    +#endif
    +#include 
    +#ifdef HAVE_STDLIB_H
    +#include 
    +#endif
    +
    +#include "archive.h"
    +#include "archive_entry.h"
    +#include "archive_private.h"
    +#include "archive_read_private.h"
    +
    +struct raw_info {
    +	int64_t offset; /* Current position in the file. */
    +	int     end_of_file;
    +};
    +
    +static int	archive_read_format_raw_bid(struct archive_read *);
    +static int	archive_read_format_raw_cleanup(struct archive_read *);
    +static int	archive_read_format_raw_read_data(struct archive_read *,
    +		    const void **, size_t *, off_t *);
    +static int	archive_read_format_raw_read_data_skip(struct archive_read *);
    +static int	archive_read_format_raw_read_header(struct archive_read *,
    +		    struct archive_entry *);
    +
    +int
    +archive_read_support_format_raw(struct archive *_a)
    +{
    +	struct raw_info *info;
    +	struct archive_read *a = (struct archive_read *)_a;
    +	int r;
    +
    +	info = (struct raw_info *)calloc(1, sizeof(*info));
    +	if (info == NULL) {
    +		archive_set_error(&a->archive, ENOMEM,
    +		    "Can't allocate raw_info data");
    +		return (ARCHIVE_FATAL);
    +	}
    +
    +	r = __archive_read_register_format(a,
    +	    info,
    +	    "raw",
    +	    archive_read_format_raw_bid,
    +	    NULL,
    +	    archive_read_format_raw_read_header,
    +	    archive_read_format_raw_read_data,
    +	    archive_read_format_raw_read_data_skip,
    +	    archive_read_format_raw_cleanup);
    +	if (r != ARCHIVE_OK)
    +		free(info);
    +	return (r);
    +}
    +
    +/*
    + * Bid 1 if this is a non-empty file.  Anyone who can really support
    + * this should outbid us, so it should generally be safe to use "raw"
    + * in conjunction with other formats.  But, this could really confuse
    + * folks if there are bid errors or minor file damage, so we don't
    + * include "raw" as part of support_format_all().
    + */
    +static int
    +archive_read_format_raw_bid(struct archive_read *a)
    +{
    +
    +	if (__archive_read_ahead(a, 1, NULL) == NULL)
    +		return (-1);
    +	return (1);
    +}
    +
    +/*
    + * Mock up a fake header.
    + */
    +static int
    +archive_read_format_raw_read_header(struct archive_read *a,
    +    struct archive_entry *entry)
    +{
    +	struct raw_info *info;
    +
    +	info = (struct raw_info *)(a->format->data);
    +	if (info->end_of_file)
    +		return (ARCHIVE_EOF);
    +
    +	a->archive.archive_format = ARCHIVE_FORMAT_RAW;
    +	a->archive.archive_format_name = "Raw data";
    +	archive_entry_set_pathname(entry, "data");
    +	/* XXX should we set mode to mimic a regular file? XXX */
    +	/* I'm deliberately leaving most fields unset here. */
    +	return (ARCHIVE_OK);
    +}
    +
    +static int
    +archive_read_format_raw_read_data(struct archive_read *a,
    +    const void **buff, size_t *size, off_t *offset)
    +{
    +	struct raw_info *info;
    +	ssize_t avail;
    +
    +	info = (struct raw_info *)(a->format->data);
    +	if (info->end_of_file)
    +		return (ARCHIVE_EOF);
    +
    +	/* Get whatever bytes are immediately available. */
    +	*buff = __archive_read_ahead(a, 1, &avail);
    +	if (avail > 0) {
    +		/* Consume and return the bytes we just read */
    +		__archive_read_consume(a, avail);
    +		*size = avail;
    +		*offset = info->offset;
    +		info->offset += *size;
    +		return (ARCHIVE_OK);
    +	} else if (0 == avail) {
    +		/* Record and return end-of-file. */
    +		info->end_of_file = 1;
    +		*size = 0;
    +		*offset = info->offset;
    +		return (ARCHIVE_EOF);
    +	} else {
    +		/* Record and return an error. */
    +		*size = 0;
    +		*offset = info->offset;
    +		return (avail);
    +	}
    +}
    +
    +static int
    +archive_read_format_raw_read_data_skip(struct archive_read *a)
    +{
    +	struct raw_info *info;
    +	off_t bytes_skipped;
    +	int64_t request = 1024 * 1024 * 1024UL; /* Skip 1 GB at a time. */
    +
    +	info = (struct raw_info *)(a->format->data);
    +	if (info->end_of_file)
    +		return (ARCHIVE_EOF);
    +	info->end_of_file = 1;
    +
    +	for (;;) {
    +		bytes_skipped = __archive_read_skip_lenient(a, request);
    +		if (bytes_skipped < 0)
    +			return (ARCHIVE_FATAL);
    +		if (bytes_skipped < request)
    +			return (ARCHIVE_OK);
    +		/* We skipped all the bytes we asked for.  There might
    +		 * be more, so try again. */
    +	}
    +}
    +
    +static int
    +archive_read_format_raw_cleanup(struct archive_read *a)
    +{
    +	struct raw_info *info;
    +
    +	info = (struct raw_info *)(a->format->data);
    +	free(info);
    +	a->format->data = NULL;
    +	return (ARCHIVE_OK);
    +}
    diff --git a/lib/libarchive/archive_read_support_format_tar.c b/lib/libarchive/archive_read_support_format_tar.c
    index 57f420f86c20..20e1293c15c6 100644
    --- a/lib/libarchive/archive_read_support_format_tar.c
    +++ b/lib/libarchive/archive_read_support_format_tar.c
    @@ -159,10 +159,10 @@ struct tar {
     	wchar_t 		*pax_entry;
     	size_t			 pax_entry_length;
     	int			 header_recursion_depth;
    -	off_t			 entry_bytes_remaining;
    -	off_t			 entry_offset;
    -	off_t			 entry_padding;
    -	off_t			 realsize;
    +	int64_t			 entry_bytes_remaining;
    +	int64_t			 entry_offset;
    +	int64_t			 entry_padding;
    +	int64_t			 realsize;
     	struct sparse_block	*sparse_list;
     	struct sparse_block	*sparse_last;
     	int64_t			 sparse_offset;
    @@ -509,7 +509,7 @@ archive_read_format_tar_read_data(struct archive_read *a,
     static int
     archive_read_format_tar_skip(struct archive_read *a)
     {
    -	off_t bytes_skipped;
    +	int64_t bytes_skipped;
     	struct tar* tar;
     
     	tar = (struct tar *)(a->format->data);
    @@ -552,7 +552,7 @@ tar_read_header(struct archive_read *a, struct tar *tar,
     		return (bytes);
     	if (bytes < 512) {  /* Short read or EOF. */
     		/* Try requesting just one byte and see what happens. */
    -		h = __archive_read_ahead(a, 1, &bytes);
    +		(void)__archive_read_ahead(a, 1, &bytes);
     		if (bytes == 0) {
     			/*
     			 * The archive ends at a 512-byte boundary but
    @@ -773,7 +773,7 @@ header_Solaris_ACL(struct archive_read *a, struct tar *tar,
     		}
     		p++;
     	}
    -	switch (type & ~0777777) {
    +	switch ((int)type & ~0777777) {
     	case 01000000:
     		/* POSIX.1e ACL */
     		break;
    @@ -1196,7 +1196,7 @@ pax_header(struct archive_read *a, struct tar *tar,
         struct archive_entry *entry, char *attr)
     {
     	size_t attr_length, l, line_length;
    -	char *line, *p;
    +	char *p;
     	char *key, *value;
     	int err, err2;
     
    @@ -1212,7 +1212,7 @@ pax_header(struct archive_read *a, struct tar *tar,
     		/* Parse decimal length field at start of line. */
     		line_length = 0;
     		l = attr_length;
    -		line = p = attr; /* Record start of line. */
    +		p = attr; /* Record start of line. */
     		while (l>0) {
     			if (*p == ' ') {
     				p++;
    @@ -1630,7 +1630,7 @@ pax_time(const char *p, int64_t *ps, long *pn)
     		digit = *p - '0';
     		if (s > limit ||
     		    (s == limit && digit > last_digit_limit)) {
    -			s = UINT64_MAX;
    +			s = INT64_MAX;
     			break;
     		}
     		s = (s * 10) + digit;
    @@ -1929,7 +1929,7 @@ gnu_sparse_10_atol(struct archive_read *a, struct tar *tar,
     			return (ARCHIVE_WARN);
     		digit = *p - '0';
     		if (l > limit || (l == limit && digit > last_digit_limit))
    -			l = UINT64_MAX; /* Truncate on overflow. */
    +			l = INT64_MAX; /* Truncate on overflow. */
     		else
     			l = (l * base) + digit;
     		p++;
    @@ -2035,7 +2035,7 @@ tar_atol8(const char *p, unsigned char_cnt)
     	digit = *p - '0';
     	while (digit >= 0 && digit < base  && char_cnt-- > 0) {
     		if (l>limit || (l == limit && digit > last_digit_limit)) {
    -			l = UINT64_MAX; /* Truncate on overflow. */
    +			l = INT64_MAX; /* Truncate on overflow. */
     			break;
     		}
     		l = (l * base) + digit;
    @@ -2071,7 +2071,7 @@ tar_atol10(const char *p, unsigned char_cnt)
     	digit = *p - '0';
     	while (digit >= 0 && digit < base  && char_cnt-- > 0) {
     		if (l > limit || (l == limit && digit > last_digit_limit)) {
    -			l = UINT64_MAX; /* Truncate on overflow. */
    +			l = INT64_MAX; /* Truncate on overflow. */
     			break;
     		}
     		l = (l * base) + digit;
    @@ -2189,7 +2189,7 @@ utf8_decode(struct tar *tar, const char *src, size_t length)
     
     	/* Ensure pax_entry buffer is big enough. */
     	if (tar->pax_entry_length <= length) {
    -		wchar_t *old_entry = tar->pax_entry;
    +		wchar_t *old_entry;
     
     		if (tar->pax_entry_length <= 0)
     			tar->pax_entry_length = 1024;
    @@ -2217,7 +2217,7 @@ utf8_decode(struct tar *tar, const char *src, size_t length)
     		src += n;
     		length -= n;
     	}
    -	*dest++ = L'\0';
    +	*dest = L'\0';
     	return (tar->pax_entry);
     }
     
    @@ -2318,7 +2318,7 @@ base64_decode(const char *s, size_t len, size_t *out_len)
     
     	/* If the decode table is not yet initialized, prepare it. */
     	if (decode_table[digits[1]] != 1) {
    -		size_t i;
    +		unsigned i;
     		memset(decode_table, 0xff, sizeof(decode_table));
     		for (i = 0; i < sizeof(digits); i++)
     			decode_table[digits[i]] = i;
    diff --git a/lib/libarchive/archive_read_support_format_zip.c b/lib/libarchive/archive_read_support_format_zip.c
    index ccb675d36749..4a24cc80930b 100644
    --- a/lib/libarchive/archive_read_support_format_zip.c
    +++ b/lib/libarchive/archive_read_support_format_zip.c
    @@ -36,10 +36,6 @@ __FBSDID("$FreeBSD$");
     #include 
     #ifdef HAVE_ZLIB_H
     #include 
    -#else
    -/* Hmmm... This is necessary, but means that we can't correctly extract
    - * even uncompressed entries on platforms that lack zlib. */
    -#define	crc32(crc, buf, len) (unsigned long)0
     #endif
     
     #include "archive.h"
    @@ -48,6 +44,10 @@ __FBSDID("$FreeBSD$");
     #include "archive_read_private.h"
     #include "archive_endian.h"
     
    +#ifndef HAVE_ZLIB_H
    +#include "archive_crc32.h"
    +#endif
    +
     struct zip {
     	/* entry_bytes_remaining is the number of bytes we expect. */
     	int64_t			entry_bytes_remaining;
    @@ -540,8 +540,7 @@ archive_read_format_zip_read_data(struct archive_read *a,
     		return (r);
     	/* Update checksum */
     	if (*size)
    -		zip->entry_crc32 =
    -		    crc32(zip->entry_crc32, *buff, *size);
    +		zip->entry_crc32 = crc32(zip->entry_crc32, *buff, *size);
     	/* If we hit the end, swallow any end-of-data marker. */
     	if (zip->end_of_entry) {
     		if (zip->flags & ZIP_LENGTH_AT_END) {
    diff --git a/lib/libarchive/archive_string.c b/lib/libarchive/archive_string.c
    index 111dcb1291de..d68ad5875ae7 100644
    --- a/lib/libarchive/archive_string.c
    +++ b/lib/libarchive/archive_string.c
    @@ -291,12 +291,10 @@ __archive_string_utf8_w(struct archive_string *as)
     	int wc, wc2;/* Must be large enough for a 21-bit Unicode code point. */
     	const char *src;
     	int n;
    -	int err;
     
     	ws = (wchar_t *)malloc((as->length + 1) * sizeof(wchar_t));
     	if (ws == NULL)
     		__archive_errx(1, "Out of memory");
    -	err = 0;
     	dest = ws;
     	src = as->s;
     	while (*src != '\0') {
    @@ -344,7 +342,7 @@ __archive_string_utf8_w(struct archive_string *as)
     		} else
     			*dest++ = wc;
     	}
    -	*dest++ = L'\0';
    +	*dest = L'\0';
     	return (ws);
     }
     
    diff --git a/lib/libarchive/archive_string.h b/lib/libarchive/archive_string.h
    index 56ca7ca31805..68fbf167e734 100644
    --- a/lib/libarchive/archive_string.h
    +++ b/lib/libarchive/archive_string.h
    @@ -26,6 +26,10 @@
      *
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef ARCHIVE_STRING_H_INCLUDED
     #define	ARCHIVE_STRING_H_INCLUDED
     
    diff --git a/lib/libarchive/archive_util.3 b/lib/libarchive/archive_util.3
    index 831355d8dcfe..18234af7099b 100644
    --- a/lib/libarchive/archive_util.3
    +++ b/lib/libarchive/archive_util.3
    @@ -34,6 +34,7 @@
     .Nm archive_copy_error ,
     .Nm archive_errno ,
     .Nm archive_error_string ,
    +.Nm archive_file_count ,
     .Nm archive_format ,
     .Nm archive_format_name ,
     .Nm archive_set_error
    @@ -53,6 +54,8 @@
     .Ft const char *
     .Fn archive_error_string "struct archive *"
     .Ft int
    +.Fn archive_file_count "struct archive *"
    +.Ft int
     .Fn archive_format "struct archive *"
     .Ft const char *
     .Fn archive_format_name "struct archive *"
    @@ -92,6 +95,12 @@ obtained from passing the result of
     .Fn archive_errno
     to
     .Xr strerror 3 .
    +.It Fn archive_file_count
    +Returns a count of the number of files processed by this archive object.
    +The count is incremented by calls to
    +.Xr archive_write_header
    +or
    +.Xr archive_read_next_header .
     .It Fn archive_format
     Returns a numeric code indicating the format of the current
     archive entry.
    diff --git a/lib/libarchive/archive_util.c b/lib/libarchive/archive_util.c
    index 1c171b903792..4c0de025dda0 100644
    --- a/lib/libarchive/archive_util.c
    +++ b/lib/libarchive/archive_util.c
    @@ -100,6 +100,11 @@ archive_error_string(struct archive *a)
     		return ("(Empty error message)");
     }
     
    +int
    +archive_file_count(struct archive *a)
    +{
    +	return (a->file_count);
    +}
     
     int
     archive_format(struct archive *a)
    @@ -182,9 +187,14 @@ void
     __archive_errx(int retvalue, const char *msg)
     {
     	static const char *msg1 = "Fatal Internal Error in libarchive: ";
    -	write(2, msg1, strlen(msg1));
    -	write(2, msg, strlen(msg));
    -	write(2, "\n", 1);
    +	size_t s;
    +
    +	s = write(2, msg1, strlen(msg1));
    +	(void)s; /* UNUSED */
    +	s = write(2, msg, strlen(msg));
    +	(void)s; /* UNUSED */
    +	s = write(2, "\n", 1);
    +	(void)s; /* UNUSED */
     	exit(retvalue);
     }
     
    diff --git a/lib/libarchive/archive_virtual.c b/lib/libarchive/archive_virtual.c
    index 214e381710c6..9ea24d09378d 100644
    --- a/lib/libarchive/archive_virtual.c
    +++ b/lib/libarchive/archive_virtual.c
    @@ -66,6 +66,7 @@ archive_read_finish(struct archive *a)
     int
     archive_write_header(struct archive *a, struct archive_entry *entry)
     {
    +	++a->file_count;
     	return ((a->vtable->archive_write_header)(a, entry));
     }
     
    diff --git a/lib/libarchive/archive_write.3 b/lib/libarchive/archive_write.3
    index 8228903dc176..7c33a74ff8f3 100644
    --- a/lib/libarchive/archive_write.3
    +++ b/lib/libarchive/archive_write.3
    @@ -453,6 +453,9 @@ and
     .Xr close 2
     system calls.
     .Bd -literal -offset indent
    +#ifdef __linux__
    +#define	_FILE_OFFSET_BITS 64
    +#endif
     #include 
     #include 
     #include 
    diff --git a/lib/libarchive/archive_write.c b/lib/libarchive/archive_write.c
    index ef3492918486..cd53fa1a6425 100644
    --- a/lib/libarchive/archive_write.c
    +++ b/lib/libarchive/archive_write.c
    @@ -312,7 +312,6 @@ archive_write_open(struct archive *_a, void *client_data,
     	struct archive_write *a = (struct archive_write *)_a;
     	int ret;
     
    -	ret = ARCHIVE_OK;
     	__archive_check_magic(&a->archive, ARCHIVE_WRITE_MAGIC,
     	    ARCHIVE_STATE_NEW, "archive_write_open");
     	archive_clear_error(&a->archive);
    @@ -423,7 +422,7 @@ _archive_write_header(struct archive *_a, struct archive_entry *entry)
     	if (a->skip_file_dev != 0 &&
     	    archive_entry_dev(entry) == a->skip_file_dev &&
     	    a->skip_file_ino != 0 &&
    -	    archive_entry_ino(entry) == a->skip_file_ino) {
    +	    archive_entry_ino64(entry) == a->skip_file_ino) {
     		archive_set_error(&a->archive, 0,
     		    "Can't add archive to itself");
     		return (ARCHIVE_FAILED);
    diff --git a/lib/libarchive/archive_write_disk.3 b/lib/libarchive/archive_write_disk.3
    index 4a395923c33b..2bdc0f5c9506 100644
    --- a/lib/libarchive/archive_write_disk.3
    +++ b/lib/libarchive/archive_write_disk.3
    @@ -339,7 +339,7 @@ In particular, the directory
     .Pa aa
     is created as well as the final object
     .Pa bb .
    -In theory, this can be exploited to create an entire directory heirarchy
    +In theory, this can be exploited to create an entire directory hierarchy
     with a single request.
     Of course, this does not work if the
     .Cm ARCHIVE_EXTRACT_NODOTDOT
    @@ -371,5 +371,5 @@ compact implementation when appropriate.
     .Pp
     There should be a corresponding
     .Nm archive_read_disk
    -interface that walks a directory heirarchy and returns archive
    -entry objects.
    \ No newline at end of file
    +interface that walks a directory hierarchy and returns archive
    +entry objects.
    diff --git a/lib/libarchive/archive_write_disk.c b/lib/libarchive/archive_write_disk.c
    index 80b1b6a69e66..6abd195dd21d 100644
    --- a/lib/libarchive/archive_write_disk.c
    +++ b/lib/libarchive/archive_write_disk.c
    @@ -442,20 +442,23 @@ _archive_write_header(struct archive *_a, struct archive_entry *entry)
     	ret = restore_entry(a);
     
     	/*
    -	 * On the GNU tar mailing list, some people working with new
    -	 * Linux filesystems observed that system xattrs used as
    -	 * layout hints need to be restored before the file contents
    -	 * are written, so this can't be done at file close.
    +	 * TODO: There are rumours that some extended attributes must
    +	 * be restored before file data is written.  If this is true,
    +	 * then we either need to write all extended attributes both
    +	 * before and after restoring the data, or find some rule for
    +	 * determining which must go first and which last.  Due to the
    +	 * many ways people are using xattrs, this may prove to be an
    +	 * intractable problem.
     	 */
    -	if (a->todo & TODO_XATTR) {
    -		int r2 = set_xattrs(a);
    -		if (r2 < ret) ret = r2;
    -	}
     
     #ifdef HAVE_FCHDIR
     	/* If we changed directory above, restore it here. */
     	if (a->restore_pwd >= 0) {
    -		fchdir(a->restore_pwd);
    +		r = fchdir(a->restore_pwd);
    +		if (r != 0) {
    +			archive_set_error(&a->archive, errno, "chdir() failure");
    +			ret = ARCHIVE_FATAL;
    +		}
     		close(a->restore_pwd);
     		a->restore_pwd = -1;
     	}
    @@ -692,15 +695,18 @@ _archive_write_finish_entry(struct archive *_a)
     		}
     #endif
     		/*
    -		 * Explicitly stat the file as some platforms might not
    -		 * implement the XSI option to extend files via ftruncate.
    +		 * Not all platforms implement the XSI option to
    +		 * extend files via ftruncate.  Stat() the file again
    +		 * to see what happened.
     		 */
     		a->pst = NULL;
     		if ((ret = _archive_write_disk_lazy_stat(a)) != ARCHIVE_OK)
     			return (ret);
    -		if (a->st.st_size != a->filesize) {
    +		/* We can use lseek()/write() to extend the file if
    +		 * ftruncate didn't work or isn't available. */
    +		if (a->st.st_size < a->filesize) {
     			const char nul = '\0';
    -			if (lseek(a->fd, a->st.st_size - 1, SEEK_SET) < 0) {
    +			if (lseek(a->fd, a->filesize - 1, SEEK_SET) < 0) {
     				archive_set_error(&a->archive, errno,
     				    "Seek failed");
     				return (ARCHIVE_FATAL);
    @@ -747,6 +753,17 @@ _archive_write_finish_entry(struct archive *_a)
     		int r2 = set_acls(a);
     		if (r2 < ret) ret = r2;
     	}
    +
    +	/*
    +	 * Security-related extended attributes (such as
    +	 * security.capability on Linux) have to be restored last,
    +	 * since they're implicitly removed by other file changes.
    +	 */
    +	if (a->todo & TODO_XATTR) {
    +		int r2 = set_xattrs(a);
    +		if (r2 < ret) ret = r2;
    +	}
    +
     	/*
     	 * Some flags prevent file modification; they must be restored after
     	 * file contents are written.
    @@ -1057,7 +1074,7 @@ restore_entry(struct archive_write_disk *a)
      * the failed system call.   Note:  This function should only ever perform
      * a single system call.
      */
    -int
    +static int
     create_filesystem_object(struct archive_write_disk *a)
     {
     	/* Create the entry. */
    @@ -1069,6 +1086,9 @@ create_filesystem_object(struct archive_write_disk *a)
     	/* Since link(2) and symlink(2) don't handle modes, we're done here. */
     	linkname = archive_entry_hardlink(a->entry);
     	if (linkname != NULL) {
    +#if !HAVE_LINK
    +		return (EPERM);
    +#else
     		r = link(linkname, a->name) ? errno : 0;
     		/*
     		 * New cpio and pax formats allow hardlink entries
    @@ -1091,10 +1111,16 @@ create_filesystem_object(struct archive_write_disk *a)
     				r = errno;
     		}
     		return (r);
    +#endif
     	}
     	linkname = archive_entry_symlink(a->entry);
    -	if (linkname != NULL)
    +	if (linkname != NULL) {
    +#if HAVE_SYMLINK
     		return symlink(linkname, a->name) ? errno : 0;
    +#else
    +		return (EPERM);
    +#endif
    +	}
     
     	/*
     	 * The remaining system calls all set permissions, so let's
    @@ -1126,22 +1152,22 @@ create_filesystem_object(struct archive_write_disk *a)
     		 * S_IFCHR for the mknod() call.  This is correct.  */
     		r = mknod(a->name, mode | S_IFCHR,
     		    archive_entry_rdev(a->entry));
    +		break;
     #else
     		/* TODO: Find a better way to warn about our inability
     		 * to restore a char device node. */
     		return (EINVAL);
     #endif /* HAVE_MKNOD */
    -		break;
     	case AE_IFBLK:
     #ifdef HAVE_MKNOD
     		r = mknod(a->name, mode | S_IFBLK,
     		    archive_entry_rdev(a->entry));
    +		break;
     #else
     		/* TODO: Find a better way to warn about our inability
     		 * to restore a block device node. */
     		return (EINVAL);
     #endif /* HAVE_MKNOD */
    -		break;
     	case AE_IFDIR:
     		mode = (mode | MINIMUM_DIR_MODE) & MAXIMUM_DIR_MODE;
     		r = mkdir(a->name, mode);
    @@ -1161,12 +1187,12 @@ create_filesystem_object(struct archive_write_disk *a)
     	case AE_IFIFO:
     #ifdef HAVE_MKFIFO
     		r = mkfifo(a->name, mode);
    +		break;
     #else
     		/* TODO: Find a better way to warn about our inability
     		 * to restore a fifo. */
     		return (EINVAL);
     #endif /* HAVE_MKFIFO */
    -		break;
     	}
     
     	/* All the system calls above set errno on failure. */
    @@ -1394,9 +1420,15 @@ current_fixup(struct archive_write_disk *a, const char *pathname)
      * scan the path and both can be optimized by comparing against other
      * recent paths.
      */
    +/* TODO: Extend this to support symlinks on Windows Vista and later. */
     static int
     check_symlinks(struct archive_write_disk *a)
     {
    +#if !defined(HAVE_LSTAT)
    +	/* Platform doesn't have lstat, so we can't look for symlinks. */
    +	(void)a; /* UNUSED */
    +	return (ARCHIVE_OK);
    +#else
     	char *pn, *p;
     	char c;
     	int r;
    @@ -1477,6 +1509,7 @@ check_symlinks(struct archive_write_disk *a)
     	/* We've checked and/or cleaned the whole path, so remember it. */
     	archive_strcpy(&a->path_safe, a->name);
     	return (ARCHIVE_OK);
    +#endif
     }
     
     #if defined(_WIN32) || defined(__CYGWIN__)
    @@ -1661,8 +1694,6 @@ create_dir(struct archive_write_disk *a, char *path)
     	mode_t mode_final, mode;
     	int r;
     
    -	r = ARCHIVE_OK;
    -
     	/* Check for special names and just skip them. */
     	slash = strrchr(path, '/');
     	if (slash == NULL)
    @@ -1806,11 +1837,31 @@ set_ownership(struct archive_write_disk *a)
     	return (ARCHIVE_WARN);
     }
     
    -#ifdef HAVE_UTIMES
    +
    +#if defined(HAVE_UTIMENSAT) && defined(HAVE_FUTIMENS)
    +/* 
    + * utimensat() and futimens() are defined in POSIX.1-2008. They provide ns
    + * resolution and setting times on fd and on symlinks, too.
    + */
    +static int
    +set_time(int fd, int mode, const char *name,
    +    time_t atime, long atime_nsec,
    +    time_t mtime, long mtime_nsec)
    +{
    +	struct timespec ts[2];
    +	ts[0].tv_sec = atime;
    +	ts[0].tv_nsec = atime_nsec;
    +	ts[1].tv_sec = mtime;
    +	ts[1].tv_nsec = mtime_nsec;
    +	if (fd >= 0)
    +		return futimens(fd, ts);
    +	return utimensat(AT_FDCWD, name, ts, AT_SYMLINK_NOFOLLOW);
    +}
    +#elif HAVE_UTIMES
     /*
    - * The utimes()-family functions provide high resolution and
    + * The utimes()-family functions provide µs-resolution and
      * a way to set time on an fd or a symlink.  We prefer them
    - * when they're available.
    + * when they're available and utimensat/futimens aren't there.
      */
     static int
     set_time(int fd, int mode, const char *name,
    diff --git a/lib/libarchive/archive_write_disk_private.h b/lib/libarchive/archive_write_disk_private.h
    index 562229b2e53d..8ec6391e8b91 100644
    --- a/lib/libarchive/archive_write_disk_private.h
    +++ b/lib/libarchive/archive_write_disk_private.h
    @@ -26,6 +26,10 @@
      * $FreeBSD$
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED
     #define ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED
     
    diff --git a/lib/libarchive/archive_write_disk_set_standard_lookup.c b/lib/libarchive/archive_write_disk_set_standard_lookup.c
    index 59f6e172e7fe..1842cbd8f069 100644
    --- a/lib/libarchive/archive_write_disk_set_standard_lookup.c
    +++ b/lib/libarchive/archive_write_disk_set_standard_lookup.c
    @@ -125,6 +125,7 @@ lookup_gid(void *private_data, const char *gname, gid_t gid)
     		int r;
     
     		for (;;) {
    +			result = &grent; /* Old getgrnam_r ignores last arg. */
     			r = getgrnam_r(gname, &grent, buffer, bufsize, &result);
     			if (r == 0)
     				break;
    @@ -184,6 +185,7 @@ lookup_uid(void *private_data, const char *uname, uid_t uid)
     		int r;
     
     		for (;;) {
    +			result = &pwent; /* Old getpwnam_r ignores last arg. */
     			r = getpwnam_r(uname, &pwent, buffer, bufsize, &result);
     			if (r == 0)
     				break;
    @@ -230,8 +232,8 @@ hash(const char *p)
     	   as used by ELF for hashing function names. */
     	unsigned g, h = 0;
     	while (*p != '\0') {
    -		h = ( h << 4 ) + *p++;
    -		if (( g = h & 0xF0000000 )) {
    +		h = (h << 4) + *p++;
    +		if ((g = h & 0xF0000000) != 0) {
     			h ^= g >> 24;
     			h &= 0x0FFFFFFF;
     		}
    diff --git a/lib/libarchive/archive_write_open_fd.c b/lib/libarchive/archive_write_open_fd.c
    index f4cc6ac1c54e..b0793a26bc89 100644
    --- a/lib/libarchive/archive_write_open_fd.c
    +++ b/lib/libarchive/archive_write_open_fd.c
    @@ -32,6 +32,12 @@ __FBSDID("$FreeBSD$");
     #ifdef HAVE_ERRNO_H
     #include 
     #endif
    +#ifdef HAVE_FCNTL_H
    +#include 
    +#endif
    +#ifdef HAVE_IO_H
    +#include 
    +#endif
     #ifdef HAVE_STDLIB_H
     #include 
     #endif
    @@ -64,6 +70,9 @@ archive_write_open_fd(struct archive *a, int fd)
     		return (ARCHIVE_FATAL);
     	}
     	mine->fd = fd;
    +#if defined(__CYGWIN__) || defined(_WIN32)
    +	setmode(mine->fd, O_BINARY);
    +#endif
     	return (archive_write_open(a, mine,
     		    file_open, file_write, file_close));
     }
    diff --git a/lib/libarchive/archive_write_private.h b/lib/libarchive/archive_write_private.h
    index 0f7215f9219e..f902f08a3c42 100644
    --- a/lib/libarchive/archive_write_private.h
    +++ b/lib/libarchive/archive_write_private.h
    @@ -25,6 +25,10 @@
      * $FreeBSD$
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef ARCHIVE_WRITE_PRIVATE_H_INCLUDED
     #define	ARCHIVE_WRITE_PRIVATE_H_INCLUDED
     
    @@ -37,7 +41,7 @@ struct archive_write {
     
     	/* Dev/ino of the archive being written. */
     	dev_t		  skip_file_dev;
    -	ino_t		  skip_file_ino;
    +	int64_t		  skip_file_ino;
     
     	/* Utility:  Pointer to a block of nulls. */
     	const unsigned char	*nulls;
    diff --git a/lib/libarchive/archive_write_set_compression_bzip2.c b/lib/libarchive/archive_write_set_compression_bzip2.c
    index ccf2229d6d97..c8b502e51676 100644
    --- a/lib/libarchive/archive_write_set_compression_bzip2.c
    +++ b/lib/libarchive/archive_write_set_compression_bzip2.c
    @@ -291,7 +291,6 @@ archive_compressor_bzip2_finish(struct archive_write *a)
     		block_length = state->stream.next_out - state->compressed;
     
     		/* Tricky calculation to determine size of last block. */
    -		target_block_length = block_length;
     		if (a->bytes_in_last_block <= 0)
     			/* Default or Zero: pad to full block */
     			target_block_length = a->bytes_per_block;
    diff --git a/lib/libarchive/archive_write_set_compression_compress.c b/lib/libarchive/archive_write_set_compression_compress.c
    index fe6b905ee4a5..da44b04f629c 100644
    --- a/lib/libarchive/archive_write_set_compression_compress.c
    +++ b/lib/libarchive/archive_write_set_compression_compress.c
    @@ -243,7 +243,6 @@ output_code(struct archive_write *a, int ocode)
     	int bits, ret, clear_flg, bit_offset;
     
     	clear_flg = ocode == CLEAR;
    -	bits = state->code_len;
     
     	/*
     	 * Since ocode is always >= 8 bits, only need to mask the first
    @@ -426,10 +425,9 @@ archive_compressor_compress_finish(struct archive_write *a)
     	ssize_t block_length, target_block_length, bytes_written;
     	int ret;
     	struct private_data *state;
    -	unsigned tocopy;
    +	size_t tocopy;
     
     	state = (struct private_data *)a->compressor.data;
    -	ret = 0;
     	if (a->client_writer == NULL) {
     		archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
     		    "No write callback is registered?  "
    diff --git a/lib/libarchive/archive_write_set_compression_gzip.c b/lib/libarchive/archive_write_set_compression_gzip.c
    index 701d6a8d9dae..6ecb4eab420f 100644
    --- a/lib/libarchive/archive_write_set_compression_gzip.c
    +++ b/lib/libarchive/archive_write_set_compression_gzip.c
    @@ -365,7 +365,6 @@ archive_compressor_gzip_finish(struct archive_write *a)
     		block_length = state->stream.next_out - state->compressed;
     
     		/* Tricky calculation to determine size of last block. */
    -		target_block_length = block_length;
     		if (a->bytes_in_last_block <= 0)
     			/* Default or Zero: pad to full block */
     			target_block_length = a->bytes_per_block;
    diff --git a/lib/libarchive/archive_write_set_compression_none.c b/lib/libarchive/archive_write_set_compression_none.c
    index 36828c28fa5e..4527485264b5 100644
    --- a/lib/libarchive/archive_write_set_compression_none.c
    +++ b/lib/libarchive/archive_write_set_compression_none.c
    @@ -208,11 +208,10 @@ archive_compressor_none_finish(struct archive_write *a)
     	ssize_t target_block_length;
     	ssize_t bytes_written;
     	int ret;
    -	int ret2;
     	struct archive_none *state;
     
     	state = (struct archive_none *)a->compressor.data;
    -	ret = ret2 = ARCHIVE_OK;
    +	ret = ARCHIVE_OK;
     	if (a->client_writer == NULL) {
     		archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
     		    "No write callback is registered?  "
    @@ -225,7 +224,6 @@ archive_compressor_none_finish(struct archive_write *a)
     		block_length = state->buffer_size - state->avail;
     
     		/* Tricky calculation to determine size of last block */
    -		target_block_length = block_length;
     		if (a->bytes_in_last_block <= 0)
     			/* Default or Zero: pad to full block */
     			target_block_length = a->bytes_per_block;
    diff --git a/lib/libarchive/archive_write_set_compression_program.c b/lib/libarchive/archive_write_set_compression_program.c
    index e612f3be9225..68c86cc48543 100644
    --- a/lib/libarchive/archive_write_set_compression_program.c
    +++ b/lib/libarchive/archive_write_set_compression_program.c
    @@ -230,11 +230,9 @@ static int
     archive_compressor_program_write(struct archive_write *a, const void *buff,
         size_t length)
     {
    -	struct private_data *state;
     	ssize_t ret;
     	const char *buf;
     
    -	state = (struct private_data *)a->compressor.data;
     	if (a->client_writer == NULL) {
     		archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
     		    "No write callback is registered?  "
    diff --git a/lib/libarchive/archive_write_set_compression_xz.c b/lib/libarchive/archive_write_set_compression_xz.c
    index 8396252527cf..81733170b6a3 100644
    --- a/lib/libarchive/archive_write_set_compression_xz.c
    +++ b/lib/libarchive/archive_write_set_compression_xz.c
    @@ -323,7 +323,6 @@ archive_compressor_xz_finish(struct archive_write *a)
     		block_length = state->stream.next_out - state->compressed;
     
     		/* Tricky calculation to determine size of last block. */
    -		target_block_length = block_length;
     		if (a->bytes_in_last_block <= 0)
     			/* Default or Zero: pad to full block */
     			target_block_length = a->bytes_per_block;
    diff --git a/lib/libarchive/archive_write_set_format.c b/lib/libarchive/archive_write_set_format.c
    index 369f2c9399e3..dd91d44c33f9 100644
    --- a/lib/libarchive/archive_write_set_format.c
    +++ b/lib/libarchive/archive_write_set_format.c
    @@ -53,6 +53,7 @@ struct { int code; int (*setter)(struct archive *); } codes[] =
     	{ ARCHIVE_FORMAT_TAR_PAX_RESTRICTED,
     				archive_write_set_format_pax_restricted },
     	{ ARCHIVE_FORMAT_TAR_USTAR,	archive_write_set_format_ustar },
    +	{ ARCHIVE_FORMAT_ZIP,	archive_write_set_format_zip },
     	{ 0,		NULL }
     };
     
    diff --git a/lib/libarchive/archive_write_set_format_ar.c b/lib/libarchive/archive_write_set_format_ar.c
    index f9dd546592f2..bffe07cba8f5 100644
    --- a/lib/libarchive/archive_write_set_format_ar.c
    +++ b/lib/libarchive/archive_write_set_format_ar.c
    @@ -145,7 +145,6 @@ archive_write_ar_header(struct archive_write *a, struct archive_entry *entry)
     	const char *filename;
     	int64_t size;
     
    -	ret = 0;
     	append_fn = 0;
     	ar = (struct ar_w *)a->format_data;
     	ar->is_strtab = 0;
    diff --git a/lib/libarchive/archive_write_set_format_by_name.c b/lib/libarchive/archive_write_set_format_by_name.c
    index d5be6c0d961a..593f544f1577 100644
    --- a/lib/libarchive/archive_write_set_format_by_name.c
    +++ b/lib/libarchive/archive_write_set_format_by_name.c
    @@ -57,6 +57,7 @@ struct { const char *name; int (*setter)(struct archive *); } names[] =
     	{ "shar",	archive_write_set_format_shar },
     	{ "shardump",	archive_write_set_format_shar_dump },
     	{ "ustar",	archive_write_set_format_ustar },
    +	{ "zip",	archive_write_set_format_zip },
     	{ NULL,		NULL }
     };
     
    diff --git a/lib/libarchive/archive_write_set_format_cpio.c b/lib/libarchive/archive_write_set_format_cpio.c
    index fd7e8a9a2dc6..a0bccc508d01 100644
    --- a/lib/libarchive/archive_write_set_format_cpio.c
    +++ b/lib/libarchive/archive_write_set_format_cpio.c
    @@ -54,6 +54,12 @@ static int64_t	format_octal_recursive(int64_t, char *, int);
     
     struct cpio {
     	uint64_t	  entry_bytes_remaining;
    +
    +	int64_t		  ino_next;
    +
    +	struct		 { int64_t old; int new;} *ino_list;
    +	size_t		  ino_list_size;
    +	size_t		  ino_list_next;
     };
     
     struct cpio_header {
    @@ -103,35 +109,102 @@ archive_write_set_format_cpio(struct archive *_a)
     	return (ARCHIVE_OK);
     }
     
    +/*
    + * Ino values are as long as 64 bits on some systems; cpio format
    + * only allows 18 bits and relies on the ino values to identify hardlinked
    + * files.  So, we can't merely "hash" the ino numbers since collisions
    + * would corrupt the archive.  Instead, we generate synthetic ino values
    + * to store in the archive and maintain a map of original ino values to
    + * synthetic ones so we can preserve hardlink information.
    + *
    + * TODO: Make this more efficient.  It's not as bad as it looks (most
    + * files don't have any hardlinks and we don't do any work here for those),
    + * but it wouldn't be hard to do better.
    + *
    + * TODO: Work with dev/ino pairs here instead of just ino values.
    + */
    +static int
    +synthesize_ino_value(struct cpio *cpio, struct archive_entry *entry)
    +{
    +	int64_t ino = archive_entry_ino64(entry);
    +	int ino_new;
    +	size_t i;
    +
    +	/*
    +	 * If no index number was given, don't assign one.  In
    +	 * particular, this handles the end-of-archive marker
    +	 * correctly by giving it a zero index value.  (This is also
    +	 * why we start our synthetic index numbers with one below.)
    +	 */
    +	if (ino == 0)
    +		return (0);
    +
    +	/* Don't store a mapping if we don't need to. */
    +	if (archive_entry_nlink(entry) < 2) {
    +		return ++cpio->ino_next;
    +	}
    +
    +	/* Look up old ino; if we have it, this is a hardlink
    +	 * and we reuse the same value. */
    +	for (i = 0; i < cpio->ino_list_next; ++i) {
    +		if (cpio->ino_list[i].old == ino)
    +			return (cpio->ino_list[i].new);
    +	}
    +
    +	/* Assign a new index number. */
    +	ino_new = ++cpio->ino_next;
    +
    +	/* Ensure space for the new mapping. */
    +	if (cpio->ino_list_size <= cpio->ino_list_next) {
    +		size_t newsize = cpio->ino_list_size < 512
    +		    ? 512 : cpio->ino_list_size * 2;
    +		void *newlist = realloc(cpio->ino_list,
    +		    sizeof(cpio->ino_list[0]) * newsize);
    +		if (newlist == NULL)
    +			return (-1);
    +
    +		cpio->ino_list_size = newsize;
    +		cpio->ino_list = newlist;
    +	}
    +
    +	/* Record and return the new value. */
    +	cpio->ino_list[cpio->ino_list_next].old = ino;
    +	cpio->ino_list[cpio->ino_list_next].new = ino_new;
    +	++cpio->ino_list_next;
    +	return (ino_new);
    +}
    +
     static int
     archive_write_cpio_header(struct archive_write *a, struct archive_entry *entry)
     {
     	struct cpio *cpio;
     	const char *p, *path;
    -	int pathlength, ret;
    +	int pathlength, ret, ret2;
    +	int64_t	ino;
     	struct cpio_header	 h;
     
     	cpio = (struct cpio *)a->format_data;
    -	ret = 0;
    +	ret2 = ARCHIVE_OK;
     
     	path = archive_entry_pathname(entry);
    -	pathlength = strlen(path) + 1; /* Include trailing null. */
    +	pathlength = (int)strlen(path) + 1; /* Include trailing null. */
     
     	memset(&h, 0, sizeof(h));
     	format_octal(070707, &h.c_magic, sizeof(h.c_magic));
     	format_octal(archive_entry_dev(entry), &h.c_dev, sizeof(h.c_dev));
    -	/*
    -	 * TODO: Generate artificial inode numbers rather than just
    -	 * re-using the ones off the disk.  That way, the 18-bit c_ino
    -	 * field only limits the number of files in the archive.
    -	 */
    -	if ((int)archive_entry_ino(entry) > 0777777) {
    -		archive_set_error(&a->archive, ERANGE,
    -		    "large inode number truncated");
    -		ret = ARCHIVE_WARN;
    -	}
     
    -	format_octal(archive_entry_ino(entry) & 0777777, &h.c_ino, sizeof(h.c_ino));
    +	ino = synthesize_ino_value(cpio, entry);
    +	if (ino < 0) {
    +		archive_set_error(&a->archive, ENOMEM,
    +		    "No memory for ino translation table");
    +		return (ARCHIVE_FATAL);
    +	} else if (ino > 0777777) {
    +		archive_set_error(&a->archive, ERANGE,
    +		    "Too many files for this cpio format");
    +		return (ARCHIVE_FATAL);
    +	}
    +	format_octal(ino & 0777777, &h.c_ino, sizeof(h.c_ino));
    +
     	format_octal(archive_entry_mode(entry), &h.c_mode, sizeof(h.c_mode));
     	format_octal(archive_entry_uid(entry), &h.c_uid, sizeof(h.c_uid));
     	format_octal(archive_entry_gid(entry), &h.c_gid, sizeof(h.c_gid));
    @@ -170,6 +243,8 @@ archive_write_cpio_header(struct archive_write *a, struct archive_entry *entry)
     	if (p != NULL  &&  *p != '\0')
     		ret = (a->compressor.write)(a, p, strlen(p));
     
    +	if (ret == ARCHIVE_OK)
    +		ret = ret2;
     	return (ret);
     }
     
    @@ -218,17 +293,15 @@ format_octal_recursive(int64_t v, char *p, int s)
     		return (v);
     	v = format_octal_recursive(v, p+1, s-1);
     	*p = '0' + (v & 7);
    -	return (v >>= 3);
    +	return (v >> 3);
     }
     
     static int
     archive_write_cpio_finish(struct archive_write *a)
     {
    -	struct cpio *cpio;
     	int er;
     	struct archive_entry *trailer;
     
    -	cpio = (struct cpio *)a->format_data;
     	trailer = archive_entry_new();
     	/* nlink = 1 here for GNU cpio compat. */
     	archive_entry_set_nlink(trailer, 1);
    @@ -244,6 +317,7 @@ archive_write_cpio_destroy(struct archive_write *a)
     	struct cpio *cpio;
     
     	cpio = (struct cpio *)a->format_data;
    +	free(cpio->ino_list);
     	free(cpio);
     	a->format_data = NULL;
     	return (ARCHIVE_OK);
    @@ -253,7 +327,8 @@ static int
     archive_write_cpio_finish_entry(struct archive_write *a)
     {
     	struct cpio *cpio;
    -	int to_write, ret;
    +	size_t to_write;
    +	int ret;
     
     	cpio = (struct cpio *)a->format_data;
     	ret = ARCHIVE_OK;
    diff --git a/lib/libarchive/archive_write_set_format_cpio_newc.c b/lib/libarchive/archive_write_set_format_cpio_newc.c
    index 9df79e7ca006..187e7d692b4a 100644
    --- a/lib/libarchive/archive_write_set_format_cpio_newc.c
    +++ b/lib/libarchive/archive_write_set_format_cpio_newc.c
    @@ -75,6 +75,9 @@ struct cpio_header_newc {
     	char	c_checksum[8];
     };
     
    +/* Logic trick: difference between 'n' and next multiple of 4 */
    +#define PAD4(n)	(3 & (1 + ~(n)))
    +
     /*
      * Set output format to 'cpio' format.
      */
    @@ -111,28 +114,34 @@ archive_write_set_format_cpio_newc(struct archive *_a)
     static int
     archive_write_newc_header(struct archive_write *a, struct archive_entry *entry)
     {
    +	int64_t ino;
     	struct cpio *cpio;
     	const char *p, *path;
    -	int pathlength, ret;
    +	int pathlength, ret, ret2;
     	struct cpio_header_newc	 h;
     	int pad;
     
     	cpio = (struct cpio *)a->format_data;
    -	ret = 0;
    +	ret2 = ARCHIVE_OK;
     
     	path = archive_entry_pathname(entry);
    -	pathlength = strlen(path) + 1; /* Include trailing null. */
    +	pathlength = (int)strlen(path) + 1; /* Include trailing null. */
     
     	memset(&h, 0, sizeof(h));
     	format_hex(0x070701, &h.c_magic, sizeof(h.c_magic));
    -	format_hex(archive_entry_devmajor(entry), &h.c_devmajor, sizeof(h.c_devmajor));
    -	format_hex(archive_entry_devminor(entry), &h.c_devminor, sizeof(h.c_devminor));
    -	if (archive_entry_ino(entry) > 0xffffffff) {
    -		archive_set_error(&a->archive, ERANGE, "large inode number truncated");
    -		ret = ARCHIVE_WARN;
    +	format_hex(archive_entry_devmajor(entry), &h.c_devmajor,
    +	    sizeof(h.c_devmajor));
    +	format_hex(archive_entry_devminor(entry), &h.c_devminor,
    +	    sizeof(h.c_devminor));
    +
    +	ino = archive_entry_ino64(entry);
    +	if (ino > 0xffffffff) {
    +		archive_set_error(&a->archive, ERANGE,
    +		    "large inode number truncated");
    +		ret2 = ARCHIVE_WARN;
     	}
     
    -	format_hex(archive_entry_ino(entry) & 0xffffffff, &h.c_ino, sizeof(h.c_ino));
    +	format_hex(ino & 0xffffffff, &h.c_ino, sizeof(h.c_ino));
     	format_hex(archive_entry_mode(entry), &h.c_mode, sizeof(h.c_mode));
     	format_hex(archive_entry_uid(entry), &h.c_uid, sizeof(h.c_uid));
     	format_hex(archive_entry_gid(entry), &h.c_gid, sizeof(h.c_gid));
    @@ -169,24 +178,26 @@ archive_write_newc_header(struct archive_write *a, struct archive_entry *entry)
     	ret = (a->compressor.write)(a, path, pathlength);
     	if (ret != ARCHIVE_OK)
     		return (ARCHIVE_FATAL);
    -	pad = 0x3 & - (pathlength + sizeof(struct cpio_header_newc));
    +	pad = PAD4(pathlength + sizeof(struct cpio_header_newc));
     	if (pad)
     		ret = (a->compressor.write)(a, "\0\0\0", pad);
     	if (ret != ARCHIVE_OK)
     		return (ARCHIVE_FATAL);
     
     	cpio->entry_bytes_remaining = archive_entry_size(entry);
    -	cpio->padding = 3 & (-cpio->entry_bytes_remaining);
    +	cpio->padding = PAD4(cpio->entry_bytes_remaining);
     
     	/* Write the symlink now. */
     	if (p != NULL  &&  *p != '\0') {
     		ret = (a->compressor.write)(a, p, strlen(p));
     		if (ret != ARCHIVE_OK)
     			return (ARCHIVE_FATAL);
    -		pad = 0x3 & -strlen(p);
    +		pad = PAD4(strlen(p));
     		ret = (a->compressor.write)(a, "\0\0\0", pad);
     	}
     
    +	if (ret == ARCHIVE_OK)
    +		ret = ret2;
     	return (ret);
     }
     
    @@ -235,17 +246,15 @@ format_hex_recursive(int64_t v, char *p, int s)
     		return (v);
     	v = format_hex_recursive(v, p+1, s-1);
     	*p = "0123456789abcdef"[v & 0xf];
    -	return (v >>= 4);
    +	return (v >> 4);
     }
     
     static int
     archive_write_newc_finish(struct archive_write *a)
     {
    -	struct cpio *cpio;
     	int er;
     	struct archive_entry *trailer;
     
    -	cpio = (struct cpio *)a->format_data;
     	trailer = archive_entry_new();
     	archive_entry_set_nlink(trailer, 1);
     	archive_entry_set_pathname(trailer, "TRAILER!!!");
    @@ -269,10 +278,10 @@ static int
     archive_write_newc_finish_entry(struct archive_write *a)
     {
     	struct cpio *cpio;
    -	int to_write, ret;
    +	size_t to_write;
    +	int ret;
     
     	cpio = (struct cpio *)a->format_data;
    -	ret = ARCHIVE_OK;
     	while (cpio->entry_bytes_remaining > 0) {
     		to_write = cpio->entry_bytes_remaining < a->null_length ?
     		    cpio->entry_bytes_remaining : a->null_length;
    diff --git a/lib/libarchive/archive_write_set_format_mtree.c b/lib/libarchive/archive_write_set_format_mtree.c
    index 377fa606f387..1b46147a6522 100644
    --- a/lib/libarchive/archive_write_set_format_mtree.c
    +++ b/lib/libarchive/archive_write_set_format_mtree.c
    @@ -33,45 +33,14 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    -#ifdef HAVE_MD5_H
    -#include 
    -#else
    -#ifdef HAVE_OPENSSL_MD5_H
    -#include 
    -#endif /* HAVE_OPENSSL_MD5_H */
    -#endif /* HAVE_MD5_H */
    -#ifdef HAVE_OPENSSL_RIPEMD_H
    -#include 
    -#else /* HAVE_OPENSSL_RIPEMD_H */
    -#ifdef HAVE_RIPEMD_H
    -#include 
    -#endif
    -#ifdef HAVE_RMD160_H
    -#include 
    -#endif
    -#endif /* HAVE_OPENSSL_RIPEMD_H */
    -#ifdef HAVE_OPENSSL_SHA_H
    -#include 
    -#else /* HAVE_OPENSSL_SHA_H */
    -#ifdef HAVE_SHA_H
    -#include 
    -#endif
    -#ifdef HAVE_SHA1_H
    -#include 
    -#endif
    -#ifdef HAVE_SHA2_H
    -#include 
    -#endif
    -#ifdef HAVE_SHA256_H
    -#include 
    -#endif
    -#endif /* HAVE_OPENSSL_SHA_H */
     
     #include "archive.h"
     #include "archive_entry.h"
     #include "archive_private.h"
     #include "archive_write_private.h"
     
    +#include "archive_hash.h"
    +
     #define INDENTNAMELEN	15
     #define MAXLINELEN	80
     
    @@ -97,33 +66,23 @@ struct mtree_writer {
     	int compute_sum;
     	uint32_t crc;
     	uint64_t crc_len;
    -#ifdef HAVE_MD5
    -	MD5_CTX md5ctx;
    +#ifdef ARCHIVE_HAS_MD5
    +	archive_md5_ctx md5ctx;
     #endif
    -#if defined(HAVE_OPENSSL_RIPEMD_H) || defined(HAVE_RIPEMD_H)
    -	RIPEMD160_CTX rmd160ctx;
    -#elif defined(HAVE_RMD160_H)
    -	RMD160_CTX rmd160ctx;
    +#ifdef ARCHIVE_HAS_RMD160
    +	archive_rmd160_ctx rmd160ctx;
     #endif
    -#ifdef HAVE_SHA1
    -#if defined(HAVE_OPENSSL_SHA_H) || defined(HAVE_SHA_H)
    -	SHA_CTX sha1ctx;
    -#else
    -	SHA1_CTX sha1ctx;
    +#ifdef ARCHIVE_HAS_SHA1
    +	archive_sha1_ctx sha1ctx;
     #endif
    +#ifdef ARCHIVE_HAS_SHA256
    +	archive_sha256_ctx sha256ctx;
     #endif
    -#ifdef HAVE_SHA256
    -	SHA256_CTX sha256ctx;
    +#ifdef ARCHIVE_HAS_SHA384
    +	archive_sha384_ctx sha384ctx;
     #endif
    -#ifdef HAVE_SHA384
    -#if defined(HAVE_OPENSSL_SHA_H)
    -	SHA512_CTX sha384ctx;
    -#else
    -	SHA384_CTX sha384ctx;
    -#endif
    -#endif
    -#ifdef HAVE_SHA512
    -	SHA512_CTX sha512ctx;
    +#ifdef ARCHIVE_HAS_SHA512
    +	archive_sha512_ctx sha512ctx;
     #endif
     	/* Keyword options */
     	int keys;
    @@ -614,51 +573,51 @@ archive_write_mtree_header(struct archive_write *a,
     		mtree->crc_len = 0;
     	} else
     		mtree->compute_sum &= ~F_CKSUM;
    -#ifdef HAVE_MD5
    +#ifdef ARCHIVE_HAS_MD5
     	if ((mtree->keys & F_MD5) != 0 &&
     	    archive_entry_filetype(entry) == AE_IFREG) {
     		mtree->compute_sum |= F_MD5;
    -		MD5Init(&mtree->md5ctx);
    +		archive_md5_init(&mtree->md5ctx);
     	} else
     		mtree->compute_sum &= ~F_MD5;
     #endif
    -#ifdef HAVE_RMD160
    +#ifdef ARCHIVE_HAS_RMD160
     	if ((mtree->keys & F_RMD160) != 0 &&
     	    archive_entry_filetype(entry) == AE_IFREG) {
     		mtree->compute_sum |= F_RMD160;
    -		RIPEMD160_Init(&mtree->rmd160ctx);
    +		archive_rmd160_init(&mtree->rmd160ctx);
     	} else
     		mtree->compute_sum &= ~F_RMD160;
     #endif
    -#ifdef HAVE_SHA1
    +#ifdef ARCHIVE_HAS_SHA1
     	if ((mtree->keys & F_SHA1) != 0 &&
     	    archive_entry_filetype(entry) == AE_IFREG) {
     		mtree->compute_sum |= F_SHA1;
    -		SHA1_Init(&mtree->sha1ctx);
    +		archive_sha1_init(&mtree->sha1ctx);
     	} else
     		mtree->compute_sum &= ~F_SHA1;
     #endif
    -#ifdef HAVE_SHA256
    +#ifdef ARCHIVE_HAS_SHA256
     	if ((mtree->keys & F_SHA256) != 0 &&
     	    archive_entry_filetype(entry) == AE_IFREG) {
     		mtree->compute_sum |= F_SHA256;
    -		SHA256_Init(&mtree->sha256ctx);
    +		archive_sha256_init(&mtree->sha256ctx);
     	} else
     		mtree->compute_sum &= ~F_SHA256;
     #endif
    -#ifdef HAVE_SHA384
    +#ifdef ARCHIVE_HAS_SHA384
     	if ((mtree->keys & F_SHA384) != 0 &&
     	    archive_entry_filetype(entry) == AE_IFREG) {
     		mtree->compute_sum |= F_SHA384;
    -		SHA384_Init(&mtree->sha384ctx);
    +		archive_sha384_init(&mtree->sha384ctx);
     	} else
     		mtree->compute_sum &= ~F_SHA384;
     #endif
    -#ifdef HAVE_SHA512
    +#ifdef ARCHIVE_HAS_SHA512
     	if ((mtree->keys & F_SHA512) != 0 &&
     	    archive_entry_filetype(entry) == AE_IFREG) {
     		mtree->compute_sum |= F_SHA512;
    -		SHA512_Init(&mtree->sha512ctx);
    +		archive_sha512_init(&mtree->sha512ctx);
     	} else
     		mtree->compute_sum &= ~F_SHA512;
     #endif
    @@ -666,7 +625,9 @@ archive_write_mtree_header(struct archive_write *a,
     	return (ARCHIVE_OK);
     }
     
    -#if defined(HAVE_MD5) || defined(HAVE_RMD160) || defined(HAVE_SHA1) || defined(HAVE_SHA256) || defined(HAVE_SHA384) || defined(HAVE_SHA512)
    +#if defined(ARCHIVE_HAS_MD5) || defined(ARCHIVE_HAS_RMD160) || \
    +    defined(ARCHIVE_HAS_SHA1) || defined(ARCHIVE_HAS_SHA256) || \
    +    defined(ARCHIVE_HAS_SHA384) || defined(ARCHIVE_HAS_SHA512)
     static void
     strappend_bin(struct archive_string *s, const unsigned char *bin, int n)
     {
    @@ -799,56 +760,56 @@ archive_write_mtree_finish_entry(struct archive_write *a)
     		archive_string_sprintf(str, " cksum=%ju",
     		    (uintmax_t)mtree->crc);
     	}
    -#ifdef HAVE_MD5
    +#ifdef ARCHIVE_HAS_MD5
     	if (mtree->compute_sum & F_MD5) {
     		unsigned char buf[16];
     
    -		MD5Final(buf, &mtree->md5ctx);
    +		archive_md5_final(&mtree->md5ctx, buf);
     		archive_strcat(str, " md5digest=");
     		strappend_bin(str, buf, sizeof(buf));
     	}
     #endif
    -#ifdef HAVE_RMD160
    +#ifdef ARCHIVE_HAS_RMD160
     	if (mtree->compute_sum & F_RMD160) {
     		unsigned char buf[20];
     
    -		RIPEMD160_Final(buf, &mtree->rmd160ctx);
    +		archive_rmd160_final(&mtree->rmd160ctx, buf);
     		archive_strcat(str, " rmd160digest=");
     		strappend_bin(str, buf, sizeof(buf));
     	}
     #endif
    -#ifdef HAVE_SHA1
    +#ifdef ARCHIVE_HAS_SHA1
     	if (mtree->compute_sum & F_SHA1) {
     		unsigned char buf[20];
     
    -		SHA1_Final(buf, &mtree->sha1ctx);
    +		archive_sha1_final(&mtree->sha1ctx, buf);
     		archive_strcat(str, " sha1digest=");
     		strappend_bin(str, buf, sizeof(buf));
     	}
     #endif
    -#ifdef HAVE_SHA256
    +#ifdef ARCHIVE_HAS_SHA256
     	if (mtree->compute_sum & F_SHA256) {
     		unsigned char buf[32];
     
    -		SHA256_Final(buf, &mtree->sha256ctx);
    +		archive_sha256_final(&mtree->sha256ctx, buf);
     		archive_strcat(str, " sha256digest=");
     		strappend_bin(str, buf, sizeof(buf));
     	}
     #endif
    -#ifdef HAVE_SHA384
    +#ifdef ARCHIVE_HAS_SHA384
     	if (mtree->compute_sum & F_SHA384) {
     		unsigned char buf[48];
     
    -		SHA384_Final(buf, &mtree->sha384ctx);
    +		archive_sha384_final(&mtree->sha384ctx, buf);
     		archive_strcat(str, " sha384digest=");
     		strappend_bin(str, buf, sizeof(buf));
     	}
     #endif
    -#ifdef HAVE_SHA512
    +#ifdef ARCHIVE_HAS_SHA512
     	if (mtree->compute_sum & F_SHA512) {
     		unsigned char buf[64];
     
    -		SHA512_Final(buf, &mtree->sha512ctx);
    +		archive_sha512_final(&mtree->sha512ctx, buf);
     		archive_strcat(str, " sha512digest=");
     		strappend_bin(str, buf, sizeof(buf));
     	}
    @@ -893,35 +854,35 @@ archive_write_mtree_data(struct archive_write *a, const void *buff, size_t n)
     		 * Compute a POSIX 1003.2 checksum
     		 */
     		const unsigned char *p;
    -		int nn;
    +		size_t nn;
     
     		for (nn = n, p = buff; nn--; ++p)
     			COMPUTE_CRC(mtree->crc, *p);
     		mtree->crc_len += n;
     	}
    -#ifdef HAVE_MD5
    +#ifdef ARCHIVE_HAS_MD5
     	if (mtree->compute_sum & F_MD5)
    -		MD5Update(&mtree->md5ctx, buff, n);
    +		archive_md5_update(&mtree->md5ctx, buff, n);
     #endif
    -#ifdef HAVE_RMD160
    +#ifdef ARCHIVE_HAS_RMD160
     	if (mtree->compute_sum & F_RMD160)
    -		RIPEMD160_Update(&mtree->rmd160ctx, buff, n);
    +		archive_rmd160_update(&mtree->rmd160ctx, buff, n);
     #endif
    -#ifdef HAVE_SHA1
    +#ifdef ARCHIVE_HAS_SHA1
     	if (mtree->compute_sum & F_SHA1)
    -		SHA1_Update(&mtree->sha1ctx, buff, n);
    +		archive_sha1_update(&mtree->sha1ctx, buff, n);
     #endif
    -#ifdef HAVE_SHA256
    +#ifdef ARCHIVE_HAS_SHA256
     	if (mtree->compute_sum & F_SHA256)
    -		SHA256_Update(&mtree->sha256ctx, buff, n);
    +		archive_sha256_update(&mtree->sha256ctx, buff, n);
     #endif
    -#ifdef HAVE_SHA384
    +#ifdef ARCHIVE_HAS_SHA384
     	if (mtree->compute_sum & F_SHA384)
    -		SHA384_Update(&mtree->sha384ctx, buff, n);
    +		archive_sha384_update(&mtree->sha384ctx, buff, n);
     #endif
    -#ifdef HAVE_SHA512
    +#ifdef ARCHIVE_HAS_SHA512
     	if (mtree->compute_sum & F_SHA512)
    -		SHA512_Update(&mtree->sha512ctx, buff, n);
    +		archive_sha512_update(&mtree->sha512ctx, buff, n);
     #endif
     	return (n);
     }
    @@ -988,11 +949,9 @@ archive_write_mtree_options(struct archive_write *a, const char *key,
     			keybit = F_SLINK;
     		break;
     	case 'm':
    -#ifdef HAVE_MD5
     		if (strcmp(key, "md5") == 0 ||
     		    strcmp(key, "md5digest") == 0)
     			keybit = F_MD5;
    -#endif
     		if (strcmp(key, "mode") == 0)
     			keybit = F_MODE;
     		break;
    @@ -1000,35 +959,25 @@ archive_write_mtree_options(struct archive_write *a, const char *key,
     		if (strcmp(key, "nlink") == 0)
     			keybit = F_NLINK;
     		break;
    -#ifdef HAVE_RMD160
     	case 'r':
     		if (strcmp(key, "ripemd160digest") == 0 ||
     		    strcmp(key, "rmd160") == 0 ||
     		    strcmp(key, "rmd160digest") == 0)
     			keybit = F_RMD160;
     		break;
    -#endif
     	case 's':
    -#ifdef HAVE_SHA1
     		if (strcmp(key, "sha1") == 0 ||
     		    strcmp(key, "sha1digest") == 0)
     			keybit = F_SHA1;
    -#endif
    -#ifdef HAVE_SHA256
     		if (strcmp(key, "sha256") == 0 ||
     		    strcmp(key, "sha256digest") == 0)
     			keybit = F_SHA256;
    -#endif
    -#ifdef HAVE_SHA384
     		if (strcmp(key, "sha384") == 0 ||
     		    strcmp(key, "sha384digest") == 0)
     			keybit = F_SHA384;
    -#endif
    -#ifdef HAVE_SHA384
     		if (strcmp(key, "sha512") == 0 ||
     		    strcmp(key, "sha512digest") == 0)
     			keybit = F_SHA512;
    -#endif
     		if (strcmp(key, "size") == 0)
     			keybit = F_SIZE;
     		break;
    diff --git a/lib/libarchive/archive_write_set_format_pax.c b/lib/libarchive/archive_write_set_format_pax.c
    index e768a7dc3a81..29291793a73b 100644
    --- a/lib/libarchive/archive_write_set_format_pax.c
    +++ b/lib/libarchive/archive_write_set_format_pax.c
    @@ -307,7 +307,7 @@ add_pax_attr(struct archive_string *as, const char *key, const char *value)
     	 * PAX attributes have the following layout:
     	 *        <=>  
     	 */
    -	len = 1 + strlen(key) + 1 + strlen(value) + 1;
    +	len = 1 + (int)strlen(key) + 1 + (int)strlen(value) + 1;
     
     	/*
     	 * The  field includes the length of the  field, so
    @@ -362,7 +362,7 @@ archive_write_pax_header_xattrs(struct pax *pax, struct archive_entry *entry)
     		url_encoded_name = url_encode(name);
     		if (url_encoded_name != NULL) {
     			/* Convert narrow-character to wide-character. */
    -			int wcs_length = strlen(url_encoded_name);
    +			size_t wcs_length = strlen(url_encoded_name);
     			wcs_name = (wchar_t *)malloc((wcs_length + 1) * sizeof(wchar_t));
     			if (wcs_name == NULL)
     				__archive_errx(1, "No memory for xattr conversion");
    @@ -479,7 +479,7 @@ archive_write_pax_header(struct archive_write *a,
     	path = archive_entry_pathname(entry_main);
     	path_w = archive_entry_pathname_w(entry_main);
     	if (path != NULL && path_w == NULL) {
    -		archive_set_error(&a->archive, EILSEQ,
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
     		    "Can't translate pathname '%s' to UTF-8", path);
     		ret = ARCHIVE_WARN;
     		hdrcharset = "BINARY";
    @@ -487,7 +487,7 @@ archive_write_pax_header(struct archive_write *a,
     	uname = archive_entry_uname(entry_main);
     	uname_w = archive_entry_uname_w(entry_main);
     	if (uname != NULL && uname_w == NULL) {
    -		archive_set_error(&a->archive, EILSEQ,
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
     		    "Can't translate uname '%s' to UTF-8", uname);
     		ret = ARCHIVE_WARN;
     		hdrcharset = "BINARY";
    @@ -495,7 +495,7 @@ archive_write_pax_header(struct archive_write *a,
     	gname = archive_entry_gname(entry_main);
     	gname_w = archive_entry_gname_w(entry_main);
     	if (gname != NULL && gname_w == NULL) {
    -		archive_set_error(&a->archive, EILSEQ,
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
     		    "Can't translate gname '%s' to UTF-8", gname);
     		ret = ARCHIVE_WARN;
     		hdrcharset = "BINARY";
    @@ -509,7 +509,7 @@ archive_write_pax_header(struct archive_write *a,
     			linkpath_w = archive_entry_symlink_w(entry_main);
     	}
     	if (linkpath != NULL && linkpath_w == NULL) {
    -		archive_set_error(&a->archive, EILSEQ,
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
     		    "Can't translate linkpath '%s' to UTF-8", linkpath);
     		ret = ARCHIVE_WARN;
     		hdrcharset = "BINARY";
    @@ -625,7 +625,7 @@ archive_write_pax_header(struct archive_write *a,
     	}
     
     	/* If numeric GID is too large, add 'gid' to pax extended attrs. */
    -	if (archive_entry_gid(entry_main) >= (1 << 18)) {
    +	if ((unsigned int)archive_entry_gid(entry_main) >= (1 << 18)) {
     		add_pax_attr_int(&(pax->pax_header), "gid",
     		    archive_entry_gid(entry_main));
     		need_extension = 1;
    @@ -650,7 +650,7 @@ archive_write_pax_header(struct archive_write *a,
     	}
     
     	/* If numeric UID is too large, add 'uid' to pax extended attrs. */
    -	if (archive_entry_uid(entry_main) >= (1 << 18)) {
    +	if ((unsigned int)archive_entry_uid(entry_main) >= (1 << 18)) {
     		add_pax_attr_int(&(pax->pax_header), "uid",
     		    archive_entry_uid(entry_main));
     		need_extension = 1;
    @@ -819,7 +819,7 @@ archive_write_pax_header(struct archive_write *a,
     		add_pax_attr_int(&(pax->pax_header), "SCHILY.dev",
     		    archive_entry_dev(entry_main));
     		add_pax_attr_int(&(pax->pax_header), "SCHILY.ino",
    -		    archive_entry_ino(entry_main));
    +		    archive_entry_ino64(entry_main));
     		add_pax_attr_int(&(pax->pax_header), "SCHILY.nlink",
     		    archive_entry_nlink(entry_main));
     
    @@ -887,7 +887,6 @@ archive_write_pax_header(struct archive_write *a,
     		uid_t uid;
     		gid_t gid;
     		mode_t mode;
    -		long ns;
     
     		pax_attr_entry = archive_entry_new();
     		p = archive_entry_pathname(entry_main);
    @@ -897,12 +896,12 @@ archive_write_pax_header(struct archive_write *a,
     		    archive_strlen(&(pax->pax_header)));
     		/* Copy uid/gid (but clip to ustar limits). */
     		uid = archive_entry_uid(entry_main);
    -		if (uid >= 1 << 18)
    -			uid = (1 << 18) - 1;
    +		if ((unsigned int)uid >= 1 << 18)
    +			uid = (uid_t)(1 << 18) - 1;
     		archive_entry_set_uid(pax_attr_entry, uid);
     		gid = archive_entry_gid(entry_main);
    -		if (gid >= 1 << 18)
    -			gid = (1 << 18) - 1;
    +		if ((unsigned int)gid >= 1 << 18)
    +			gid = (gid_t)(1 << 18) - 1;
     		archive_entry_set_gid(pax_attr_entry, gid);
     		/* Copy mode over (but not setuid/setgid bits) */
     		mode = archive_entry_mode(entry_main);
    @@ -925,17 +924,12 @@ archive_write_pax_header(struct archive_write *a,
     
     		/* Copy mtime, but clip to ustar limits. */
     		s = archive_entry_mtime(entry_main);
    -		ns = archive_entry_mtime_nsec(entry_main);
    -		if (s < 0) { s = 0; ns = 0; }
    -		if (s > 0x7fffffff) { s = 0x7fffffff; ns = 0; }
    -		archive_entry_set_mtime(pax_attr_entry, s, ns);
    +		if (s < 0) { s = 0; }
    +		if (s >= 0x7fffffff) { s = 0x7fffffff; }
    +		archive_entry_set_mtime(pax_attr_entry, s, 0);
     
    -		/* Ditto for atime. */
    -		s = archive_entry_atime(entry_main);
    -		ns = archive_entry_atime_nsec(entry_main);
    -		if (s < 0) { s = 0; ns = 0; }
    -		if (s > 0x7fffffff) { s = 0x7fffffff; ns = 0; }
    -		archive_entry_set_atime(pax_attr_entry, s, ns);
    +		/* Standard ustar doesn't support atime. */
    +		archive_entry_set_atime(pax_attr_entry, 0, 0);
     
     		/* Standard ustar doesn't support ctime. */
     		archive_entry_set_ctime(pax_attr_entry, 0, 0);
    @@ -949,7 +943,8 @@ archive_write_pax_header(struct archive_write *a,
     		if (r != 0) {
     			const char *msg = "archive_write_pax_header: "
     			    "'x' header failed?!  This can't happen.\n";
    -			write(2, msg, strlen(msg));
    +			size_t u = write(2, msg, strlen(msg));
    +			(void)u; /* UNUSED */
     			exit(1);
     		}
     		r = (a->compressor.write)(a, paxbuff, 512);
    @@ -1030,7 +1025,7 @@ build_ustar_entry_name(char *dest, const char *src, size_t src_length,
     	char *p;
     	int need_slash = 0; /* Was there a trailing slash? */
     	size_t suffix_length = 99;
    -	int insert_length;
    +	size_t insert_length;
     
     	/* Length of additional dir element to be added. */
     	if (insert == NULL)
    @@ -1124,7 +1119,7 @@ build_ustar_entry_name(char *dest, const char *src, size_t src_length,
     	p += filename_end - filename;
     	if (need_slash)
     		*p++ = '/';
    -	*p++ = '\0';
    +	*p = '\0';
     
     	return (dest);
     }
    @@ -1215,13 +1210,11 @@ build_pax_attribute_name(char *dest, const char *src)
     static int
     archive_write_pax_finish(struct archive_write *a)
     {
    -	struct pax *pax;
     	int r;
     
     	if (a->compressor.write == NULL)
     		return (ARCHIVE_OK);
     
    -	pax = (struct pax *)a->format_data;
     	r = write_nulls(a, 512 * 2);
     	return (r);
     }
    @@ -1256,7 +1249,8 @@ archive_write_pax_finish_entry(struct archive_write *a)
     static int
     write_nulls(struct archive_write *a, size_t padding)
     {
    -	int ret, to_write;
    +	int ret;
    +	size_t to_write;
     
     	while (padding > 0) {
     		to_write = padding < a->null_length ? padding : a->null_length;
    @@ -1387,6 +1381,6 @@ base64_encode(const char *s, size_t len)
     		break;
     	}
     	/* Add trailing NUL character so output is a valid C string. */
    -	*d++ = '\0';
    +	*d = '\0';
     	return (out);
     }
    diff --git a/lib/libarchive/archive_write_set_format_zip.c b/lib/libarchive/archive_write_set_format_zip.c
    new file mode 100644
    index 000000000000..d4d4f879edae
    --- /dev/null
    +++ b/lib/libarchive/archive_write_set_format_zip.c
    @@ -0,0 +1,667 @@
    +/*-
    + * Copyright (c) 2008 Anselm Strauss
    + * Copyright (c) 2009 Joerg Sonnenberger
    + * 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(S) ``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(S) 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.
    + */
    +
    +/*
    + * Development supported by Google Summer of Code 2008.
    + */
    +
    +/*
    + * The current implementation is very limited:
    + *
    + *   - No encryption support.
    + *   - No ZIP64 support.
    + *   - No support for splitting and spanning.
    + *   - Only supports regular file and folder entries.
    + *
    + * Note that generally data in ZIP files is little-endian encoded,
    + * with some exceptions.
    + *
    + * TODO: Since Libarchive is generally 64bit oriented, but this implementation
    + * does not yet support sizes exceeding 32bit, it is highly fragile for
    + * big archives. This should change when ZIP64 is finally implemented, otherwise
    + * some serious checking has to be done.
    + *
    + */
    +
    +#include "archive_platform.h"
    +__FBSDID("$FreeBSD$");
    +
    +#ifdef HAVE_ERRNO_H
    +#include 
    +#endif
    +#include 
    +#ifdef HAVE_STDLIB_H
    +#include 
    +#endif
    +#ifdef HAVE_STRING_H
    +#include 
    +#endif
    +#ifdef HAVE_ZLIB_H
    +#include 
    +#endif
    +
    +#include "archive.h"
    +#include "archive_endian.h"
    +#include "archive_entry.h"
    +#include "archive_private.h"
    +#include "archive_write_private.h"
    +
    +#ifndef HAVE_ZLIB_H
    +#include "archive_crc32.h"
    +#endif
    +
    +#define ZIP_SIGNATURE_LOCAL_FILE_HEADER 0x04034b50
    +#define ZIP_SIGNATURE_DATA_DESCRIPTOR 0x08074b50
    +#define ZIP_SIGNATURE_FILE_HEADER 0x02014b50
    +#define ZIP_SIGNATURE_CENTRAL_DIRECTORY_END 0x06054b50
    +#define ZIP_SIGNATURE_EXTRA_TIMESTAMP 0x5455
    +#define ZIP_SIGNATURE_EXTRA_UNIX 0x7855
    +#define ZIP_VERSION_EXTRACT 0x0014 /* ZIP version 2.0 is needed. */
    +#define ZIP_VERSION_BY 0x0314 /* Made by UNIX, using ZIP version 2.0. */
    +#define ZIP_FLAGS 0x08 /* Flagging bit 3 (count from 0) for using data descriptor. */
    +
    +enum compression {
    +	COMPRESSION_STORE = 0
    +#ifdef HAVE_ZLIB_H
    +	,
    +	COMPRESSION_DEFLATE = 8
    +#endif
    +};
    +
    +static ssize_t archive_write_zip_data(struct archive_write *, const void *buff, size_t s);
    +static int archive_write_zip_finish(struct archive_write *);
    +static int archive_write_zip_destroy(struct archive_write *);
    +static int archive_write_zip_finish_entry(struct archive_write *);
    +static int archive_write_zip_header(struct archive_write *, struct archive_entry *);
    +static unsigned int dos_time(const time_t);
    +static size_t path_length(struct archive_entry *);
    +static int write_path(struct archive_entry *, struct archive_write *);
    +
    +struct zip_local_file_header {
    +	char signature[4];
    +	char version[2];
    +	char flags[2];
    +	char compression[2];
    +	char timedate[4];
    +	char crc32[4];
    +	char compressed_size[4];
    +	char uncompressed_size[4];
    +	char filename_length[2];
    +	char extra_length[2];
    +};
    +
    +struct zip_file_header {
    +	char signature[4];
    +	char version_by[2];
    +	char version_extract[2];
    +	char flags[2];
    +	char compression[2];
    +	char timedate[4];
    +	char crc32[4];
    +	char compressed_size[4];
    +	char uncompressed_size[4];
    +	char filename_length[2];
    +	char extra_length[2];
    +	char comment_length[2];
    +	char disk_number[2];
    +	char attributes_internal[2];
    +	char attributes_external[4];
    +	char offset[4];
    +};
    +
    +struct zip_data_descriptor {
    +	char signature[4]; /* Not mandatory, but recommended by specification. */
    +	char crc32[4];
    +	char compressed_size[4];
    +	char uncompressed_size[4];
    +};
    +
    +struct zip_extra_data_local {
    +	char time_id[2];
    +	char time_size[2];
    +	char time_flag[1];
    +	char mtime[4];
    +	char atime[4];
    +	char ctime[4];
    +	char unix_id[2];
    +	char unix_size[2];
    +	char unix_uid[2];
    +	char unix_gid[2];
    +};
    +
    +struct zip_extra_data_central {
    +	char time_id[2];
    +	char time_size[2];
    +	char time_flag[1];
    +	char mtime[4];
    +	char unix_id[2];
    +	char unix_size[2];
    +};
    +
    +struct zip_file_header_link {
    +	struct zip_file_header_link *next;
    +	struct archive_entry *entry;
    +	off_t offset;
    +	unsigned long crc32;
    +	off_t compressed_size;
    +	enum compression compression;
    +};
    +
    +struct zip {
    +	struct zip_data_descriptor data_descriptor;
    +	struct zip_file_header_link *central_directory;
    +	struct zip_file_header_link *central_directory_end;
    +	int64_t offset;
    +	int64_t written_bytes;
    +	int64_t remaining_data_bytes;
    +	enum compression compression;
    +
    +#ifdef HAVE_ZLIB_H
    +	z_stream stream;
    +	size_t len_buf;
    +	unsigned char *buf;
    +#endif
    +};
    +
    +struct zip_central_directory_end {
    +	char signature[4];
    +	char disk[2];
    +	char start_disk[2];
    +	char entries_disk[2];
    +	char entries[2];
    +	char size[4];
    +	char offset[4];
    +	char comment_length[2];
    +};
    +
    +static int
    +archive_write_zip_options(struct archive_write *a, const char *key,
    +    const char *value)
    +{
    +	struct zip *zip = a->format_data;
    +
    +	if (strcmp(key, "compression") == 0) {
    +		if (strcmp(value, "deflate") == 0) {
    +#ifdef HAVE_ZLIB_H
    +			zip->compression = COMPRESSION_DEFLATE;
    +#else
    +			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +			    "deflate compression not supported");
    +			return ARCHIVE_WARN;
    +#endif
    +		} else if (strcmp(value, "store") == 0)
    +			zip->compression = COMPRESSION_STORE;
    +		else
    +			return (ARCHIVE_WARN);
    +		return (ARCHIVE_OK);
    +	}
    +	return (ARCHIVE_WARN);
    +}
    +
    +int
    +archive_write_set_format_zip(struct archive *_a)
    +{
    +	struct archive_write *a = (struct archive_write *)_a;
    +	struct zip *zip;
    +
    +	/* If another format was already registered, unregister it. */
    +	if (a->format_destroy != NULL)
    +		(a->format_destroy)(a);
    +
    +	zip = (struct zip *) calloc(1, sizeof(*zip));
    +	if (zip == NULL) {
    +		archive_set_error(&a->archive, ENOMEM, "Can't allocate zip data");
    +		return (ARCHIVE_FATAL);
    +	}
    +	zip->central_directory = NULL;
    +	zip->central_directory_end = NULL;
    +	zip->offset = 0;
    +	zip->written_bytes = 0;
    +	zip->remaining_data_bytes = 0;
    +
    +#ifdef HAVE_ZLIB_H
    +	zip->compression = COMPRESSION_DEFLATE;
    +	zip->len_buf = 65536;
    +	zip->buf = malloc(zip->len_buf);
    +	if (zip->buf == NULL) {
    +		archive_set_error(&a->archive, ENOMEM, "Can't allocate compression buffer");
    +		return (ARCHIVE_FATAL);
    +	}
    +#else
    +	zip->compression = COMPRESSION_STORE;
    +#endif
    +
    +	a->format_data = zip;
    +
    +	a->pad_uncompressed = 0; /* Actually not needed for now, since no compression support yet. */
    +	a->format_name = "zip";
    +	a->format_options = archive_write_zip_options;
    +	a->format_write_header = archive_write_zip_header;
    +	a->format_write_data = archive_write_zip_data;
    +	a->format_finish_entry = archive_write_zip_finish_entry;
    +	a->format_finish = archive_write_zip_finish;
    +	a->format_destroy = archive_write_zip_destroy;
    +	a->archive.archive_format = ARCHIVE_FORMAT_ZIP;
    +	a->archive.archive_format_name = "ZIP";
    +
    +	archive_le32enc(&zip->data_descriptor.signature,
    +	    ZIP_SIGNATURE_DATA_DESCRIPTOR);
    +
    +	return (ARCHIVE_OK);
    +}
    +
    +static int
    +archive_write_zip_header(struct archive_write *a, struct archive_entry *entry)
    +{
    +	struct zip *zip;
    +	struct zip_local_file_header h;
    +	struct zip_extra_data_local e;
    +	struct zip_data_descriptor *d;
    +	struct zip_file_header_link *l;
    +	int ret;
    +	int64_t size;
    +	mode_t type;
    +
    +	/* Entries other than a regular file or a folder are skipped. */
    +	type = archive_entry_filetype(entry);
    +	if ((type != AE_IFREG) & (type != AE_IFDIR)) {
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Filetype not supported");
    +		return ARCHIVE_FAILED;
    +	};
    +
    +	/* Directory entries should have a size of 0. */
    +	if (type == AE_IFDIR)
    +		archive_entry_set_size(entry, 0);
    +
    +	zip = a->format_data;
    +	d = &zip->data_descriptor;
    +	size = archive_entry_size(entry);
    +	zip->remaining_data_bytes = size;
    +
    +	/* Append archive entry to the central directory data. */
    +	l = (struct zip_file_header_link *) malloc(sizeof(*l));
    +	if (l == NULL) {
    +		archive_set_error(&a->archive, ENOMEM, "Can't allocate zip header data");
    +		return (ARCHIVE_FATAL);
    +	}
    +	l->entry = archive_entry_clone(entry);
    +	/* Initialize the CRC variable and potentially the local crc32(). */
    +	l->crc32 = crc32(0, NULL, 0);
    +	l->compression = zip->compression;
    +	l->compressed_size = 0;
    +	l->next = NULL;
    +	if (zip->central_directory == NULL) {
    +		zip->central_directory = l;
    +	} else {
    +		zip->central_directory_end->next = l;
    +	}
    +	zip->central_directory_end = l;
    +
    +	/* Store the offset of this header for later use in central directory. */
    +	l->offset = zip->written_bytes;
    +
    +	memset(&h, 0, sizeof(h));
    +	archive_le32enc(&h.signature, ZIP_SIGNATURE_LOCAL_FILE_HEADER);
    +	archive_le16enc(&h.version, ZIP_VERSION_EXTRACT);
    +	archive_le16enc(&h.flags, ZIP_FLAGS);
    +	archive_le16enc(&h.compression, zip->compression);
    +	archive_le32enc(&h.timedate, dos_time(archive_entry_mtime(entry)));
    +	archive_le16enc(&h.filename_length, (uint16_t)path_length(entry));
    +
    +	switch (zip->compression) {
    +	case COMPRESSION_STORE:
    +		/* Setting compressed and uncompressed sizes even when specification says
    +		 * to set to zero when using data descriptors. Otherwise the end of the
    +		 * data for an entry is rather difficult to find. */
    +		archive_le32enc(&h.compressed_size, size);
    +		archive_le32enc(&h.uncompressed_size, size);
    +		break;
    +#ifdef HAVE_ZLIB_H
    +	case COMPRESSION_DEFLATE:
    +		archive_le32enc(&h.uncompressed_size, size);
    +
    +		zip->stream.zalloc = Z_NULL;
    +		zip->stream.zfree = Z_NULL;
    +		zip->stream.opaque = Z_NULL;
    +		zip->stream.next_out = zip->buf;
    +		zip->stream.avail_out = zip->len_buf;
    +		if (deflateInit2(&zip->stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
    +		    -15, 8, Z_DEFAULT_STRATEGY) != Z_OK) {
    +			archive_set_error(&a->archive, ENOMEM, "Can't init deflate compressor");
    +			return (ARCHIVE_FATAL);
    +		}
    +		break;
    +#endif
    +	}
    +
    +	/* Formatting extra data. */
    +	archive_le16enc(&h.extra_length, sizeof(e));
    +	archive_le16enc(&e.time_id, ZIP_SIGNATURE_EXTRA_TIMESTAMP);
    +	archive_le16enc(&e.time_size, sizeof(e.time_flag) +
    +	    sizeof(e.mtime) + sizeof(e.atime) + sizeof(e.ctime));
    +	e.time_flag[0] = 0x07;
    +	archive_le32enc(&e.mtime, archive_entry_mtime(entry));
    +	archive_le32enc(&e.atime, archive_entry_atime(entry));
    +	archive_le32enc(&e.ctime, archive_entry_ctime(entry));
    +	    
    +	archive_le16enc(&e.unix_id, ZIP_SIGNATURE_EXTRA_UNIX);
    +	archive_le16enc(&e.unix_size, sizeof(e.unix_uid) + sizeof(e.unix_gid));
    +	archive_le16enc(&e.unix_uid, archive_entry_uid(entry));
    +	archive_le16enc(&e.unix_gid, archive_entry_gid(entry));
    +
    +	archive_le32enc(&d->uncompressed_size, size);
    +
    +	ret = (a->compressor.write)(a, &h, sizeof(h));
    +	if (ret != ARCHIVE_OK)
    +		return (ARCHIVE_FATAL);
    +	zip->written_bytes += sizeof(h);
    +
    +	ret = write_path(entry, a);
    +	if (ret <= ARCHIVE_OK)
    +		return (ARCHIVE_FATAL);
    +	zip->written_bytes += ret;
    +
    +	ret = (a->compressor.write)(a, &e, sizeof(e));
    +	if (ret != ARCHIVE_OK)
    +		return (ARCHIVE_FATAL);
    +	zip->written_bytes += sizeof(e);
    +
    +	return (ARCHIVE_OK);
    +}
    +
    +static ssize_t
    +archive_write_zip_data(struct archive_write *a, const void *buff, size_t s)
    +{
    +	int ret;
    +	struct zip *zip = a->format_data;
    +	struct zip_file_header_link *l = zip->central_directory_end;
    +
    +	if ((int64_t)s > zip->remaining_data_bytes)
    +		s = (size_t)zip->remaining_data_bytes;
    +
    +	if (s == 0) return 0;
    +
    +	switch (zip->compression) {
    +	case COMPRESSION_STORE:
    +		ret = (a->compressor.write)(a, buff, s);
    +		if (ret != ARCHIVE_OK) return (ret);
    +		zip->written_bytes += s;
    +		zip->remaining_data_bytes -= s;
    +		l->compressed_size += s;
    +		l->crc32 = crc32(l->crc32, buff, s);
    +		return (s);
    +#if HAVE_ZLIB_H
    +	case COMPRESSION_DEFLATE:
    +		zip->stream.next_in = (unsigned char*)(uintptr_t)buff;
    +		zip->stream.avail_in = s;
    +		do {
    +			ret = deflate(&zip->stream, Z_NO_FLUSH);
    +			if (ret == Z_STREAM_ERROR)
    +				return (ARCHIVE_FATAL);
    +			if (zip->stream.avail_out == 0) {
    +				ret = (a->compressor.write)(a, zip->buf, zip->len_buf);
    +				if (ret != ARCHIVE_OK)
    +					return (ret);
    +				l->compressed_size += zip->len_buf;
    +				zip->written_bytes += zip->len_buf;
    +				zip->stream.next_out = zip->buf;
    +				zip->stream.avail_out = zip->len_buf;
    +			}
    +		} while (zip->stream.avail_in != 0);
    +		zip->remaining_data_bytes -= s;
    +		/* If we have it, use zlib's fast crc32() */
    +		l->crc32 = crc32(l->crc32, buff, s);
    +		return (s);
    +#endif
    +
    +	default:
    +		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
    +		    "Invalid ZIP compression type");
    +		return ARCHIVE_FATAL;
    +	}
    +}
    +
    +static int
    +archive_write_zip_finish_entry(struct archive_write *a)
    +{
    +	/* Write the data descripter after file data has been written. */
    +	int ret;
    +	struct zip *zip = a->format_data;
    +	struct zip_data_descriptor *d = &zip->data_descriptor;
    +	struct zip_file_header_link *l = zip->central_directory_end;
    +#if HAVE_ZLIB_H
    +	size_t reminder;
    +#endif
    +
    +	switch(zip->compression) {
    +	case COMPRESSION_STORE:
    +		break;
    +#if HAVE_ZLIB_H
    +	case COMPRESSION_DEFLATE:
    +		for (;;) {
    +			ret = deflate(&zip->stream, Z_FINISH);
    +			if (ret == Z_STREAM_ERROR)
    +				return (ARCHIVE_FATAL);
    +			reminder = zip->len_buf - zip->stream.avail_out;
    +			ret = (a->compressor.write)(a, zip->buf, reminder);
    +			if (ret != ARCHIVE_OK)
    +				return (ret);
    +			l->compressed_size += reminder;
    +			zip->written_bytes += reminder;
    +			zip->stream.next_out = zip->buf;
    +			if (zip->stream.avail_out != 0)
    +				break;
    +			zip->stream.avail_out = zip->len_buf;
    +		}
    +		deflateEnd(&zip->stream);
    +		break;
    +#endif
    +	}
    +
    +	archive_le32enc(&d->crc32, l->crc32);
    +	archive_le32enc(&d->compressed_size, l->compressed_size);
    +	ret = (a->compressor.write)(a, d, sizeof(*d));
    +	if (ret != ARCHIVE_OK)
    +		return (ARCHIVE_FATAL);
    +	zip->written_bytes += sizeof(*d);
    +	return (ARCHIVE_OK);
    +}
    +
    +static int
    +archive_write_zip_finish(struct archive_write *a)
    +{
    +	struct zip *zip;
    +	struct zip_file_header_link *l;
    +	struct zip_file_header h;
    +	struct zip_central_directory_end end;
    +	struct zip_extra_data_central e;
    +	off_t offset_start, offset_end;
    +	int entries;
    +	int ret;
    +
    +	zip = a->format_data;
    +	l = zip->central_directory;
    +
    +	/*
    +	 * Formatting central directory file header fields that are fixed for all entries.
    +	 * Fields not used (and therefor 0) are:
    +	 *
    +	 *   - comment_length
    +	 *   - disk_number
    +	 *   - attributes_internal
    +	 */
    +	memset(&h, 0, sizeof(h));
    +	archive_le32enc(&h.signature, ZIP_SIGNATURE_FILE_HEADER);
    +	archive_le16enc(&h.version_by, ZIP_VERSION_BY);
    +	archive_le16enc(&h.version_extract, ZIP_VERSION_EXTRACT);
    +	archive_le16enc(&h.flags, ZIP_FLAGS);
    +
    +	entries = 0;
    +	offset_start = zip->written_bytes;
    +
    +	/* Formatting individual header fields per entry and
    +	 * writing each entry. */
    +	while (l != NULL) {
    +		archive_le16enc(&h.compression, l->compression);
    +		archive_le32enc(&h.timedate, dos_time(archive_entry_mtime(l->entry)));
    +		archive_le32enc(&h.crc32, l->crc32);
    +		archive_le32enc(&h.compressed_size, l->compressed_size);
    +		archive_le32enc(&h.uncompressed_size, archive_entry_size(l->entry));
    +		archive_le16enc(&h.filename_length, (uint16_t)path_length(l->entry));
    +		archive_le16enc(&h.extra_length, sizeof(e));
    +		archive_le16enc(&h.attributes_external[2], archive_entry_mode(l->entry));
    +		archive_le32enc(&h.offset, l->offset);
    +
    +		/* Formatting extra data. */
    +		archive_le16enc(&e.time_id, ZIP_SIGNATURE_EXTRA_TIMESTAMP);
    +		archive_le16enc(&e.time_size, sizeof(e.mtime) + sizeof(e.time_flag));
    +		e.time_flag[0] = 0x07;
    +		archive_le32enc(&e.mtime, archive_entry_mtime(l->entry));
    +		archive_le16enc(&e.unix_id, ZIP_SIGNATURE_EXTRA_UNIX);
    +		archive_le16enc(&e.unix_size, 0x0000);
    +
    +		ret = (a->compressor.write)(a, &h, sizeof(h));
    +		if (ret != ARCHIVE_OK)
    +			return (ARCHIVE_FATAL);
    +		zip->written_bytes += sizeof(h);
    +
    +		ret = write_path(l->entry, a);
    +		if (ret <= ARCHIVE_OK)
    +			return (ARCHIVE_FATAL);
    +		zip->written_bytes += ret;
    +
    +		ret = (a->compressor.write)(a, &e, sizeof(e));
    +		if (ret != ARCHIVE_OK)
    +			return (ARCHIVE_FATAL);
    +		zip->written_bytes += sizeof(e);
    +
    +		l = l->next;
    +		entries++;
    +	}
    +	offset_end = zip->written_bytes;
    +
    +	/* Formatting end of central directory. */
    +	memset(&end, 0, sizeof(end));
    +	archive_le32enc(&end.signature, ZIP_SIGNATURE_CENTRAL_DIRECTORY_END);
    +	archive_le16enc(&end.entries_disk, entries);
    +	archive_le16enc(&end.entries, entries);
    +	archive_le32enc(&end.size, offset_end - offset_start);
    +	archive_le32enc(&end.offset, offset_start);
    +
    +	/* Writing end of central directory. */
    +	ret = (a->compressor.write)(a, &end, sizeof(end));
    +	if (ret != ARCHIVE_OK)
    +		return (ARCHIVE_FATAL);
    +	zip->written_bytes += sizeof(end);
    +	return (ARCHIVE_OK);
    +}
    +
    +static int
    +archive_write_zip_destroy(struct archive_write *a)
    +{
    +	struct zip *zip;
    +	struct zip_file_header_link *l;
    +
    +	zip = a->format_data;
    +	while (zip->central_directory != NULL) {
    +	   l = zip->central_directory;
    +	   zip->central_directory = l->next;
    +	   archive_entry_free(l->entry);
    +	   free(l);
    +	}
    +#ifdef HAVE_ZLIB_H
    +	free(zip->buf);
    +#endif
    +	free(zip);
    +	a->format_data = NULL;
    +	return (ARCHIVE_OK);
    +}
    +
    +/* Convert into MSDOS-style date/time. */
    +static unsigned int
    +dos_time(const time_t unix_time)
    +{
    +	struct tm *t;
    +	unsigned int dt;
    +
    +	/* This will not preserve time when creating/extracting the archive
    +	 * on two systems with different time zones. */
    +	t = localtime(&unix_time);
    +
    +	dt = 0;
    +	dt += ((t->tm_year - 80) & 0x7f) << 9;
    +	dt += ((t->tm_mon + 1) & 0x0f) << 5;
    +	dt += (t->tm_mday & 0x1f);
    +	dt <<= 16;
    +	dt += (t->tm_hour & 0x1f) << 11;
    +	dt += (t->tm_min & 0x3f) << 5;
    +	dt += (t->tm_sec & 0x3e) >> 1; /* Only counting every 2 seconds. */
    +	return dt;
    +}
    +
    +static size_t
    +path_length(struct archive_entry *entry)
    +{
    +	mode_t type;
    +	const char *path;
    +
    +	type = archive_entry_filetype(entry);
    +	path = archive_entry_pathname(entry);
    +
    +	if ((type == AE_IFDIR) & (path[strlen(path) - 1] != '/')) {
    +		return strlen(path) + 1;
    +	} else {
    +		return strlen(path);
    +	}
    +}
    +
    +static int
    +write_path(struct archive_entry *entry, struct archive_write *archive)
    +{
    +	int ret;
    +	const char *path;
    +	mode_t type;
    +	size_t written_bytes;
    +
    +	path = archive_entry_pathname(entry);
    +	type = archive_entry_filetype(entry);
    +	written_bytes = 0;
    +
    +	ret = (archive->compressor.write)(archive, path, strlen(path));
    +	if (ret != ARCHIVE_OK)
    +		return (ARCHIVE_FATAL);
    +	written_bytes += strlen(path);
    +
    +	/* Folders are recognized by a traling slash. */
    +	if ((type == AE_IFDIR) & (path[strlen(path) - 1] != '/')) {
    +		ret = (archive->compressor.write)(archive, "/", 1);
    +		if (ret != ARCHIVE_OK)
    +			return (ARCHIVE_FATAL);
    +		written_bytes += 1;
    +	}
    +
    +	return ((int)written_bytes);
    +}
    diff --git a/lib/libarchive/config_freebsd.h b/lib/libarchive/config_freebsd.h
    index 484b8662ea23..10b399a25db1 100644
    --- a/lib/libarchive/config_freebsd.h
    +++ b/lib/libarchive/config_freebsd.h
    @@ -28,6 +28,7 @@
     /* FreeBSD 5.0 and later have ACL and extattr support. */
     #if __FreeBSD__ > 4
     #define	HAVE_ACL_CREATE_ENTRY 1
    +#define	HAVE_ACL_GET_LINK_NP 1
     #define	HAVE_ACL_GET_PERM_NP 1
     #define	HAVE_ACL_INIT 1
     #define	HAVE_ACL_SET_FD 1
    @@ -50,6 +51,7 @@
     #define	HAVE_SHA512 1
     #endif
     
    +#define	HAVE_BSDXML_H 1
     #define	HAVE_BZLIB_H 1
     #define	HAVE_CHFLAGS 1
     #define	HAVE_CHOWN 1
    @@ -60,6 +62,7 @@
     #define	HAVE_DECL_STRERROR_R 1
     #define	HAVE_DECL_UINT32_MAX 1
     #define	HAVE_DECL_UINT64_MAX 1
    +#define	HAVE_DIRENT_H 1
     #define	HAVE_EFTYPE 1
     #define	HAVE_EILSEQ 1
     #define	HAVE_ERRNO_H 1
    @@ -81,12 +84,13 @@
     #define	HAVE_LCHMOD 1
     #define	HAVE_LCHOWN 1
     #define	HAVE_LIMITS_H 1
    +#define	HAVE_LINK 1
    +#define	HAVE_LSTAT 1
     #define	HAVE_LUTIMES 1
     #define	HAVE_MALLOC 1
     #define	HAVE_MD5 1
     #define	HAVE_MD5_H 1
     #define	HAVE_MEMMOVE 1
    -#define	HAVE_MEMSET 1
     #define	HAVE_MKDIR 1
     #define	HAVE_MKFIFO 1
     #define	HAVE_MKNOD 1
    @@ -95,7 +99,6 @@
     #define	HAVE_POLL_H 1
     #define	HAVE_PWD_H 1
     #define	HAVE_READLINK 1
    -#define	HAVE_RIPEMD_H
     #define	HAVE_RMD160 1
     #define	HAVE_SELECT 1
     #define	HAVE_SETENV 1
    @@ -118,6 +121,8 @@
     #define	HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1
     #define	HAVE_STRUCT_STAT_ST_FLAGS 1
     #define	HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1
    +#define	HAVE_SYMLINK 1
    +#define	HAVE_SYS_CDEFS_H 1
     #define	HAVE_SYS_IOCTL_H 1
     #define	HAVE_SYS_SELECT_H 1
     #define	HAVE_SYS_STAT_H 1
    @@ -140,7 +145,6 @@
     #define	HAVE_WMEMCMP 1
     #define	HAVE_WMEMCPY 1
     #define	HAVE_ZLIB_H 1
    -#define	STDC_HEADERS 1
     #define	TIME_WITH_SYS_TIME 1
     
     /* FreeBSD 4 and earlier lack intmax_t/uintmax_t */
    diff --git a/lib/libarchive/filter_fork.h b/lib/libarchive/filter_fork.h
    index d34ae22c36c1..77ff71b1534f 100644
    --- a/lib/libarchive/filter_fork.h
    +++ b/lib/libarchive/filter_fork.h
    @@ -25,6 +25,10 @@
      * $FreeBSD$
      */
     
    +#ifndef __LIBARCHIVE_BUILD
    +#error This header is only to be used internally to libarchive.
    +#endif
    +
     #ifndef FILTER_FORK_H
     #define FILTER_FORK_H
     
    diff --git a/lib/libarchive/libarchive-formats.5 b/lib/libarchive/libarchive-formats.5
    index d76515fe0e5e..8661df086658 100644
    --- a/lib/libarchive/libarchive-formats.5
    +++ b/lib/libarchive/libarchive-formats.5
    @@ -1,4 +1,4 @@
    -.\" Copyright (c) 2003-2007 Tim Kientzle
    +.\" Copyright (c) 2003-2009 Tim Kientzle
     .\" All rights reserved.
     .\"
     .\" Redistribution and use in source and binary forms, with or without
    @@ -24,7 +24,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd April 17, 2009
    +.Dd December 27, 2009
     .Dt libarchive-formats 5
     .Os
     .Sh NAME
    @@ -45,7 +45,8 @@ limitations of the current library support.
     Note that just because a format is supported by libarchive does not
     imply that a program that uses libarchive will support that format.
     Applications that use libarchive specify which formats they wish
    -to support.
    +to support, though many programs do use libarchive convenience
    +functions to enable all supported formats.
     .Ss Tar Formats
     The
     .Xr libarchive 3
    @@ -83,8 +84,8 @@ library can read and write POSIX-compliant pax interchange format
     archives.
     Pax interchange format archives are an extension of the older ustar
     format that adds a separate entry with additional attributes stored
    -as key/value pairs.
    -The presence of this additional entry is the only difference between
    +as key/value pairs immediately before each regular entry.
    +The presence of these additional entries is the only difference between
     pax interchange format and the older ustar format.
     The extended attributes are of unlimited length and are stored
     as UTF-8 Unicode strings.
    @@ -131,16 +132,30 @@ This name is limited to 100 bytes.
     Extended attributes, file flags, and other extended
     security information cannot be stored.
     .It
    -Archive entries are limited to 2 gigabytes in size.
    +Archive entries are limited to 8 gigabytes in size.
     .El
     Note that the pax interchange format has none of these restrictions.
     .El
     .Pp
    -The libarchive library can also read a variety of commonly-used extensions to
    +The libarchive library also reads a variety of commonly-used extensions to
     the basic tar format.
    -In particular, it supports base-256 values in certain numeric fields.
    -This essentially removes the limitations on file size, modification time,
    +These extensions are recognized automatically whenever they appear.
    +.Bl -tag -width indent
    +.It Numeric extensions.
    +The POSIX standards require fixed-length numeric fields to be written with
    +some character position reserved for terminators.
    +Libarchive allows these fields to be written without terminator characters.
    +This extends the allowable range; in particular, ustar archives with this
    +extension can support entries up to 64 gigabytes in size.
    +Libarchive also recognizes base-256 values in most numeric fields.
    +This essentially removes all limitations on file size, modification time,
     and device numbers.
    +.It Solaris extensions
    +Libarchive recognizes ACL and extended attribute records written
    +by Solaris tar.
    +Currently, libarchive only has support for old-style ACLs; the
    +newer NFSv4 ACLs are recognized but discarded.
    +.El
     .Pp
     The first tar program appeared in Seventh Edition Unix in 1979.
     The first official standard for the tar file format was the
    @@ -159,13 +174,13 @@ A cpio archive stores each entry as a fixed-size header followed
     by a variable-length filename and variable-length data.
     Unlike the tar format, the cpio format does only minimal padding
     of the header or file data.
    -There are a variety of cpio formats, which differ primarily in
    +There are several cpio variants, which differ primarily in
     how they store the initial header: some store the values as
     octal or hexadecimal numbers in ASCII, others as binary values of
     varying byte order and length.
     .Bl -tag -width indent
     .It Cm binary
    -The libarchive library can read both big-endian and little-endian
    +The libarchive library transparently reads both big-endian and little-endian
     variants of the original binary cpio format.
     This format used 32-bit binary values for file size and mtime,
     and 16-bit binary values for the other fields.
    @@ -243,20 +258,24 @@ shardump archives less portable than plain shar archives.
     .Ss ISO9660 format
     Libarchive can read and extract from files containing ISO9660-compliant
     CDROM images.
    -It also has partial support for Rockridge extensions.
     In many cases, this can remove the need to burn a physical CDROM
     just in order to read the files contained in an ISO9660 image.
     It also avoids security and complexity issues that come with
     virtual mounts and loopback devices.
    +Libarchive supports the most common Rockridge extensions and has partial
    +support for Joliet extensions.
    +If both extensions are present, the Joliet extensions will be
    +used and the Rockridge extensions will be ignored.
    +In particular, this can create problems with hardlinks and symlinks,
    +which are supported by Rockridge but not by Joliet.
     .Ss Zip format
    -Libarchive can extract from most zip format archives, including
    -jar archives, archives that use Zip64 extensions and many
    -self-extracting zip archives.
    -It currently only supports uncompressed entries and entries
    -compressed with the
    +Libarchive can read and write zip format archives that have
    +uncompressed entries and entries compressed with the
     .Dq deflate
     algorithm.
     Older zip compression algorithms are not supported.
    +It can extract jar archives, archives that use Zip64 extensions and many
    +self-extracting zip archives.
     Libarchive reads Zip archives as they are being streamed,
     which allows it to read archives of arbitrary size.
     It currently does not use the central directory; this
    @@ -273,7 +292,20 @@ The ar format has never been standardised.
     There are two common variants:
     the GNU format derived from SVR4,
     and the BSD format, which first appeared in 4.4BSD.
    -Libarchive provides read and write support for both variants.
    +The two differ primarily in their handling of filenames
    +longer than 15 characters:
    +the GNU/SVR4 variant writes a filename table at the beginning of the archive;
    +the BSD format stores each long filename in an extension
    +area adjacent to the entry.
    +Libarchive can read both extensions,
    +including archives that may include both types of long filenames.
    +Programs using libarchive can write GNU/SVR4 format
    +if they provide a filename table to be written into
    +the archive before any of the entries.
    +Any entries whose names are not in the filename table
    +will be written using BSD-style long filenames.
    +This can cause problems for programs such as
    +GNU ld that do not support the BSD-style long filenames.
     .Ss mtree
     Libarchive can read and write files in
     .Xr mtree 5
    @@ -287,20 +319,29 @@ the NetBSD and FreeBSD versions of
     although many of the keywords cannot currently be stored in an
     .Tn archive_entry
     object.
    -When reading, libarchive supports an extension that allows it
    -to obtain the contents of the files described by the
    -.Xr mtree 5
    -description from files on disk.
     When writing, libarchive supports use of the
     .Xr archive_write_set_options 3
     interface to specify which keywords should be included in the
     output.
    -This includes the ability to compute hash entries such
    -as
    +If libarchive was compiled with access to suitable
    +cryptographic libraries (such as the OpenSSL libraries),
    +it can compute hash entries such as
     .Cm sha512
     or
     .Cm md5
     from file data being written to the mtree writer.
    +.Pp
    +When reading an mtree file, libarchive will locate the corresponding
    +files on disk using the
    +.Cm contents
    +keyword if present or the regular filename.
    +If it can locate and open the file on disk, it will use that
    +to fill in any metadata that is missing from the mtree file
    +and will read the file contents and return those to the program
    +using libarchive.
    +If it cannot locate and open the file on disk, libarchive
    +will return an error for any attempt to read the entry
    +body.
     .Sh SEE ALSO
     .Xr ar 1 ,
     .Xr cpio 1 ,
    diff --git a/lib/libarchive/tar.5 b/lib/libarchive/tar.5
    index 7927b04f3314..bd56d262d805 100644
    --- a/lib/libarchive/tar.5
    +++ b/lib/libarchive/tar.5
    @@ -24,7 +24,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd April 19, 2009
    +.Dd December 27, 2009
     .Dt tar 5
     .Os
     .Sh NAME
    @@ -55,8 +55,11 @@ number of records with each I/O operation.
     These
     .Dq blocks
     are always a multiple of the record size.
    -The most common block size\(emand the maximum supported by historic
    -implementations\(emis 10240 bytes or 20 records.
    +The maximum block size supported by early
    +implementations was 10240 bytes or 20 records.
    +This is still the default for most implementations
    +although block sizes of 1MiB (2048 records) or larger are
    +commonly used with modern high-speed tape drives.
     (Note: the terms
     .Dq block
     and
    @@ -272,16 +275,19 @@ when they are set and the corresponding names exist on
     the system.
     .It Va devmajor , Va devminor
     Major and minor numbers for character device or block device entry.
    -.It Va prefix
    -First part of pathname.
    +.It Va name , Va prefix
     If the pathname is too long to fit in the 100 bytes provided by the standard
     format, it can be split at any
     .Pa /
    -character with the first portion going here.
    +character with the first portion going into the prefix field.
     If the prefix field is not empty, the reader will prepend
     the prefix value and a
     .Pa /
     character to the regular name field to obtain the full pathname.
    +The standard does not require a trailing
    +.Pa /
    +character on directory names, though most implementations still
    +include this for compatibility reasons.
     .El
     .Pp
     Note that all unused bytes must be set to
    @@ -308,7 +314,7 @@ unless they fill the entire field.
     happens to have a
     .Pa /
     as the 156th character.)
    -POSIX requires numeric fields to be zero-padded in the front, and allows
    +POSIX requires numeric fields to be zero-padded in the front, and requires
     them to be terminated with either space or
     .Dv NUL
     characters.
    @@ -809,9 +815,17 @@ John Gilmore's
     .Nm pdtar
     public-domain implementation (circa 1987) was highly influential
     and formed the basis of
    -.Nm GNU tar .
    +.Nm GNU tar
    +(circa 1988).
     Joerg Shilling's
     .Nm star
     archiver is another open-source (GPL) archiver (originally developed
     circa 1985) which features complete support for pax interchange
     format.
    +.Pp
    +This documentation was written as part of the
    +.Nm libarchive
    +and
    +.Nm bsdtar
    +project by
    +.An Tim Kientzle Aq kientzle@FreeBSD.org .
    diff --git a/lib/libarchive/test/Makefile b/lib/libarchive/test/Makefile
    index dec95fdb151d..ab65da3b2ab4 100644
    --- a/lib/libarchive/test/Makefile
    +++ b/lib/libarchive/test/Makefile
    @@ -14,8 +14,10 @@ TESTS= \
     	test_archive_api_feature.c		\
     	test_bad_fd.c				\
     	test_compat_bzip2.c			\
    +	test_compat_cpio.c			\
     	test_compat_gtar.c			\
     	test_compat_gzip.c			\
    +	test_compat_lzma.c			\
     	test_compat_solaris_tar_acl.c		\
     	test_compat_tar_hardlink.c		\
     	test_compat_xz.c			\
    @@ -42,6 +44,7 @@ TESTS= \
     	test_read_format_cpio_bin_be.c		\
     	test_read_format_cpio_bin_bz2.c		\
     	test_read_format_cpio_bin_gz.c		\
    +	test_read_format_cpio_bin_lzma.c	\
     	test_read_format_cpio_bin_xz.c		\
     	test_read_format_cpio_odc.c		\
     	test_read_format_cpio_svr4_gzip.c	\
    @@ -51,8 +54,15 @@ TESTS= \
     	test_read_format_gtar_lzma.c		\
     	test_read_format_gtar_sparse.c		\
     	test_read_format_iso_gz.c		\
    +	test_read_format_iso_multi_extent.c	\
    +	test_read_format_isorr_rr_moved.c	\
     	test_read_format_isojoliet_bz2.c	\
    +	test_read_format_isojoliet_long.c	\
    +	test_read_format_isojoliet_rr.c		\
     	test_read_format_isorr_bz2.c		\
    +	test_read_format_isorr_ce.c		\
    +	test_read_format_isorr_new_bz2.c	\
    +	test_read_format_isozisofs_bz2.c	\
     	test_read_format_mtree.c		\
     	test_read_format_pax_bz2.c		\
     	test_read_format_raw.c			\
    @@ -60,6 +70,7 @@ TESTS= \
     	test_read_format_tar_empty_filename.c	\
     	test_read_format_tbz.c			\
     	test_read_format_tgz.c			\
    +	test_read_format_tlz.c			\
     	test_read_format_txz.c			\
     	test_read_format_tz.c			\
     	test_read_format_zip.c			\
    @@ -67,6 +78,7 @@ TESTS= \
     	test_read_pax_truncated.c		\
     	test_read_position.c			\
     	test_read_truncated.c			\
    +	test_read_uu.c				\
     	test_tar_filenames.c			\
     	test_tar_large.c			\
     	test_ustar_filenames.c			\
    @@ -82,6 +94,7 @@ TESTS= \
     	test_write_disk_perms.c			\
     	test_write_disk_secure.c		\
     	test_write_disk_sparse.c		\
    +	test_write_disk_symlink.c		\
     	test_write_disk_times.c			\
     	test_write_format_ar.c			\
     	test_write_format_cpio.c		\
    @@ -94,6 +107,9 @@ TESTS= \
     	test_write_format_tar.c			\
     	test_write_format_tar_empty.c		\
     	test_write_format_tar_ustar.c		\
    +	test_write_format_zip.c			\
    +	test_write_format_zip_empty.c		\
    +	test_write_format_zip_no_compression.c	\
     	test_write_open_memory.c
     
     
    @@ -108,16 +124,12 @@ NO_MAN=yes
     
     PROG=libarchive_test
     INTERNALPROG=yes  # Don't install this; it's just for testing
    -DPADD=${LIBBZ2} ${LIBZ}
    +DPADD=${LIBBZ2} ${LIBZ} ${LIBMD} ${LIBCRYPTO} ${LIBBSDXML}
     CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\"
    -LDADD= -lz -lbz2 -lmd -lcrypto
    +LDADD= -lz -lbz2 -lmd -lcrypto -lbsdxml
     CFLAGS+= -g
     CFLAGS+= -I${LA_SRCDIR} -I.
     
    -# Uncomment to build and test lzma support via liblzmadec
    -#CFLAGS+= -I/usr/local/include -DHAVE_LIBLZMADEC=1 -DHAVE_LZMADEC_H=1
    -#LDADD+= -L/usr/local/lib -llzmadec
    -
     # Uncomment to build and test lzma and xz support via liblzma
     #CFLAGS+= -I/usr/local/include -DHAVE_LIBLZMA=1 -DHAVE_LZMA_H=1
     #LDADD+= -L/usr/local/lib -llzma
    @@ -125,11 +137,11 @@ CFLAGS+= -I${LA_SRCDIR} -I.
     # Uncomment to link against dmalloc
     #LDADD+= -L/usr/local/lib -ldmalloc
     #CFLAGS+= -I/usr/local/include -DUSE_DMALLOC
    -WARNS=6
    +#WARNS=6
     
     # Build libarchive_test and run it.
     check test: libarchive_test
    -	./libarchive_test -v -r ${.CURDIR}
    +	./libarchive_test -r ${.CURDIR}
     
     # list.h is just a list of all tests, as indicated by DEFINE_TEST macro lines
     list.h: ${TESTS} Makefile
    diff --git a/lib/libarchive/test/main.c b/lib/libarchive/test/main.c
    index 0d16c81edd10..5f8cbc311a52 100644
    --- a/lib/libarchive/test/main.c
    +++ b/lib/libarchive/test/main.c
    @@ -1,5 +1,5 @@
     /*
    - * Copyright (c) 2003-2007 Tim Kientzle
    + * Copyright (c) 2003-2009 Tim Kientzle
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
    @@ -23,74 +23,142 @@
      * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      */
     
    -/*
    - * Various utility routines useful for test programs.
    - * Each test program is linked against this file.
    - */
     #include "test.h"
    -
     #include 
     #include 
     #include 
     #include 
    -#if defined(_WIN32) && !defined(__CYGWIN__)
    -#include 
    -#include 
    -#include 
    -#endif
     
     /*
      * This same file is used pretty much verbatim for all test harnesses.
      *
      * The next few lines are the only differences.
    + * TODO: Move this into a separate configuration header, have all test
    + * suites share one copy of this file.
      */
    +__FBSDID("$FreeBSD$");
    +#define KNOWNREF	"test_compat_gtar_1.tar.uu"
    +#define	ENVBASE "LIBARCHIVE" /* Prefix for environment variables. */
     #undef	PROGRAM              /* Testing a library, not a program. */
     #define	LIBRARY	"libarchive"
    -#define	ENVBASE "LIBARCHIVE" /* Prefix for environment variables. */
     #define	EXTRA_DUMP(x)	archive_error_string((struct archive *)(x))
     #define	EXTRA_VERSION	archive_version()
    -#define KNOWNREF	"test_compat_gtar_1.tar.uu"
    -__FBSDID("$FreeBSD$");
     
     /*
    - * "list.h" is simply created by "grep DEFINE_TEST"; it has
    - * a line like
    - *      DEFINE_TEST(test_function)
    - * for each test.
    - * Include it here with a suitable DEFINE_TEST to declare all of the
    - * test functions.
    + *
    + * Windows support routines
    + *
    + * Note: Configuration is a tricky issue.  Using HAVE_* feature macros
    + * in the test harness is dangerous because they cover up
    + * configuration errors.  The classic example of this is omitting a
    + * configure check.  If libarchive and libarchive_test both look for
    + * the same feature macro, such errors are hard to detect.  Platform
    + * macros (e.g., _WIN32 or __GNUC__) are a little better, but can
    + * easily lead to very messy code.  It's best to limit yourself
    + * to only the most generic programming techniques in the test harness
    + * and thus avoid conditionals altogether.  Where that's not possible,
    + * try to minimize conditionals by grouping platform-specific tests in
    + * one place (e.g., test_acl_freebsd) or by adding new assert()
    + * functions (e.g., assertMakeHardlink()) to cover up platform
    + * differences.  Platform-specific coding in libarchive_test is often
    + * a symptom that some capability is missing from libarchive itself.
      */
    -#undef DEFINE_TEST
    -#define	DEFINE_TEST(name) void name(void);
    -#include "list.h"
    -
    -/* Interix doesn't define these in a standard header. */
    -#if __INTERIX__
    -extern char *optarg;
    -extern int optind;
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +#include 
    +#include 
    +#ifndef F_OK
    +#define F_OK (0)
    +#endif
    +#ifndef S_ISDIR
    +#define S_ISDIR(m)  ((m) & _S_IFDIR)
    +#endif
    +#ifndef S_ISREG
    +#define S_ISREG(m)  ((m) & _S_IFREG)
    +#endif
    +#if !defined(__BORLANDC__)
    +#define access _access
    +#define chdir _chdir
    +#endif
    +#ifndef fileno
    +#define fileno _fileno
    +#endif
    +/*#define fstat _fstat64*/
    +#if !defined(__BORLANDC__)
    +#define getcwd _getcwd
    +#endif
    +#define lstat stat
    +/*#define lstat _stat64*/
    +/*#define stat _stat64*/
    +#define rmdir _rmdir
    +#if !defined(__BORLANDC__)
    +#define strdup _strdup
    +#define umask _umask
    +#endif
    +#define int64_t __int64
     #endif
     
    -/* Enable core dump on failure. */
    -static int dump_on_failure = 0;
    -/* Default is to remove temp dirs for successful tests. */
    -static int keep_temp_files = 0;
    -/* Default is to print some basic information about each test. */
    -static int quiet_flag = 0;
    -/* Default is to summarize repeated failures. */
    -static int verbose = 0;
    -/* Cumulative count of component failures. */
    -static int failures = 0;
    -/* Cumulative count of skipped component tests. */
    -static int skips = 0;
    -/* Cumulative count of assertions. */
    -static int assertions = 0;
    -
    -/* Directory where uuencoded reference files can be found. */
    -static const char *refdir;
    -
    +#if defined(HAVE__CrtSetReportMode)
    +# include 
    +#endif
     
     #if defined(_WIN32) && !defined(__CYGWIN__)
    +void *GetFunctionKernel32(const char *name)
    +{
    +	static HINSTANCE lib;
    +	static int set;
    +	if (!set) {
    +		set = 1;
    +		lib = LoadLibrary("kernel32.dll");
    +	}
    +	if (lib == NULL) {
    +		fprintf(stderr, "Can't load kernel32.dll?!\n");
    +		exit(1);
    +	}
    +	return (void *)GetProcAddress(lib, name);
    +}
     
    +static int
    +my_CreateSymbolicLinkA(const char *linkname, const char *target, int flags)
    +{
    +	static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, DWORD);
    +	static int set;
    +	if (!set) {
    +		set = 1;
    +		f = GetFunctionKernel32("CreateSymbolicLinkA");
    +	}
    +	return f == NULL ? 0 : (*f)(linkname, target, flags);
    +}
    +
    +static int
    +my_CreateHardLinkA(const char *linkname, const char *target)
    +{
    +	static BOOLEAN (WINAPI *f)(LPCSTR, LPCSTR, LPSECURITY_ATTRIBUTES);
    +	static int set;
    +	if (!set) {
    +		set = 1;
    +		f = GetFunctionKernel32("CreateHardLinkA");
    +	}
    +	return f == NULL ? 0 : (*f)(linkname, target, NULL);
    +}
    +
    +int
    +my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi)
    +{
    +	HANDLE h;
    +	int r;
    +
    +	memset(bhfi, 0, sizeof(*bhfi));
    +	h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL,
    +		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    +	if (h == INVALID_HANDLE_VALUE)
    +		return (0);
    +	r = GetFileInformationByHandle(h, bhfi);
    +	CloseHandle(h);
    +	return (r);
    +}
    +#endif
    +
    +#if defined(HAVE__CrtSetReportMode)
     static void
     invalid_parameter_handler(const wchar_t * expression,
         const wchar_t * function, const wchar_t * file,
    @@ -98,123 +166,181 @@ invalid_parameter_handler(const wchar_t * expression,
     {
     	/* nop */
     }
    -
     #endif
     
     /*
    - * My own implementation of the standard assert() macro emits the
    - * message in the same format as GCC (file:line: message).
    - * It also includes some additional useful information.
    - * This makes it a lot easier to skim through test failures in
    - * Emacs.  ;-)
      *
    - * It also supports a few special features specifically to simplify
    - * test harnesses:
    - *    failure(fmt, args) -- Stores a text string that gets
    - *          printed if the following assertion fails, good for
    - *          explaining subtle tests.
    + * OPTIONS FLAGS
    + *
      */
    -static char msg[4096];
    +
    +/* Enable core dump on failure. */
    +static int dump_on_failure = 0;
    +/* Default is to remove temp dirs and log data for successful tests. */
    +static int keep_temp_files = 0;
    +/* Default is to just report pass/fail for each test. */
    +static int verbosity = 0;
    +#define	VERBOSITY_SUMMARY_ONLY -1 /* -q */
    +#define VERBOSITY_PASSFAIL 0   /* Default */
    +#define VERBOSITY_LIGHT_REPORT 1 /* -v */
    +#define VERBOSITY_FULL 2 /* -vv */
    +/* A few places generate even more output for verbosity > VERBOSITY_FULL,
    + * mostly for debugging the test harness itself. */
    +/* Cumulative count of assertion failures. */
    +static int failures = 0;
    +/* Cumulative count of reported skips. */
    +static int skips = 0;
    +/* Cumulative count of assertions checked. */
    +static int assertions = 0;
    +
    +/* Directory where uuencoded reference files can be found. */
    +static const char *refdir;
     
     /*
    - * For each test source file, we remember how many times each
    - * failure was reported.
    - */
    -static const char *failed_filename = NULL;
    -static struct line {
    -	int line;
    -	int count;
    -	int critical;
    -}  failed_lines[1000];
    -
    -/*
    - * Called at the beginning of each assert() function.
    + * Report log information selectively to console and/or disk log.
      */
    +static int log_console = 0;
    +static FILE *logfile;
     static void
    -count_assertion(const char *file, int line)
    +vlogprintf(const char *fmt, va_list ap)
    +{
    +#ifdef va_copy
    +	va_list lfap;
    +	va_copy(lfap, ap);
    +#endif
    +	if (log_console)
    +		vfprintf(stdout, fmt, ap);
    +	if (logfile != NULL)
    +#ifdef va_copy
    +		vfprintf(logfile, fmt, lfap);
    +	va_end(lfap);
    +#else
    +		vfprintf(logfile, fmt, ap);
    +#endif
    +}
    +
    +static void
    +logprintf(const char *fmt, ...)
    +{
    +	va_list ap;
    +	va_start(ap, fmt);
    +	vlogprintf(fmt, ap);
    +	va_end(ap);
    +}
    +
    +/* Set up a message to display only if next assertion fails. */
    +static char msgbuff[4096];
    +static const char *msg, *nextmsg;
    +void
    +failure(const char *fmt, ...)
    +{
    +	va_list ap;
    +	va_start(ap, fmt);
    +	vsprintf(msgbuff, fmt, ap);
    +	va_end(ap);
    +	nextmsg = msgbuff;
    +}
    +
    +/*
    + * Copy arguments into file-local variables.
    + * This was added to permit vararg assert() functions without needing
    + * variadic wrapper macros.  Turns out that the vararg capability is almost
    + * never used, so almost all of the vararg assertions can be simplified
    + * by removing the vararg capability and reworking the wrapper macro to
    + * pass __FILE__, __LINE__ directly into the function instead of using
    + * this hook.  I suspect this machinery is used so rarely that we
    + * would be better off just removing it entirely.  That would simplify
    + * the code here noticably.
    + */
    +static const char *test_filename;
    +static int test_line;
    +static void *test_extra;
    +void assertion_setup(const char *filename, int line)
    +{
    +	test_filename = filename;
    +	test_line = line;
    +}
    +
    +/* Called at the beginning of each assert() function. */
    +static void
    +assertion_count(const char *file, int line)
     {
     	(void)file; /* UNUSED */
     	(void)line; /* UNUSED */
     	++assertions;
    +	/* Proper handling of "failure()" message. */
    +	msg = nextmsg;
    +	nextmsg = NULL;
     	/* Uncomment to print file:line after every assertion.
     	 * Verbose, but occasionally useful in tracking down crashes. */
     	/* printf("Checked %s:%d\n", file, line); */
     }
     
     /*
    - * Count this failure; return the number of previous failures.
    + * For each test source file, we remember how many times each
    + * assertion was reported.  Cleared before each new test,
    + * used by test_summarize().
      */
    -static int
    -previous_failures(const char *filename, int line, int critical)
    -{
    -	unsigned int i;
    +static struct line {
     	int count;
    +	int skip;
    +}  failed_lines[10000];
     
    -	if (failed_filename == NULL || strcmp(failed_filename, filename) != 0)
    -		memset(failed_lines, 0, sizeof(failed_lines));
    -	failed_filename = filename;
    -
    -	for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
    -		if (failed_lines[i].line == line) {
    -			count = failed_lines[i].count;
    -			failed_lines[i].count++;
    -			return (count);
    -		}
    -		if (failed_lines[i].line == 0) {
    -			failed_lines[i].line = line;
    -			failed_lines[i].count = 1;
    -			failed_lines[i].critical = critical;
    -			return (0);
    -		}
    -	}
    -	return (0);
    -}
    -
    -/*
    - * Copy arguments into file-local variables.
    - */
    -static const char *test_filename;
    -static int test_line;
    -static void *test_extra;
    -void test_setup(const char *filename, int line)
    -{
    -	test_filename = filename;
    -	test_line = line;
    -}
    -
    -/*
    - * Inform user that we're skipping a test.
    - */
    -void
    -test_skipping(const char *fmt, ...)
    +/* Count this failure, setup up log destination and handle initial report. */
    +static void
    +failure_start(const char *filename, int line, const char *fmt, ...)
     {
     	va_list ap;
     
    -	if (previous_failures(test_filename, test_line, 0))
    -		return;
    +	/* Record another failure for this line. */
    +	++failures;
    +	/* test_filename = filename; */
    +	failed_lines[line].count++;
     
    -	va_start(ap, fmt);
    -	fprintf(stderr, " *** SKIPPING: ");
    -	vfprintf(stderr, fmt, ap);
    -	fprintf(stderr, "\n");
    -	va_end(ap);
    -	++skips;
    -}
    -
    -/* Common handling of failed tests. */
    -static void
    -report_failure(void *extra)
    -{
    -	if (msg[0] != '\0') {
    -		fprintf(stderr, "   Description: %s\n", msg);
    -		msg[0] = '\0';
    +	/* Determine whether to log header to console. */
    +	switch (verbosity) {
    +	case VERBOSITY_LIGHT_REPORT:
    +		log_console = (failed_lines[line].count < 2);
    +		break;
    +	default:
    +		log_console = (verbosity >= VERBOSITY_FULL);
     	}
     
    +	/* Log file:line header for this failure */
    +	va_start(ap, fmt);
    +#if _MSC_VER
    +	logprintf("%s(%d): ", filename, line);
    +#else
    +	logprintf("%s:%d: ", filename, line);
    +#endif
    +	vlogprintf(fmt, ap);
    +	va_end(ap);
    +	logprintf("\n");
    +
    +	if (msg != NULL && msg[0] != '\0') {
    +		logprintf("   Description: %s\n", msg);
    +		msg = NULL;
    +	}
    +
    +	/* Determine whether to log details to console. */
    +	if (verbosity == VERBOSITY_LIGHT_REPORT)
    +		log_console = 0;
    +}
    +
    +/* Complete reporting of failed tests. */
    +/*
    + * The 'extra' hook here is used by libarchive to include libarchive
    + * error messages with assertion failures.  It could also be used
    + * to add strerror() output, for example.  Just define the EXTRA_DUMP()
    + * macro appropriately.
    + */
    +static void
    +failure_finish(void *extra)
    +{
    +	(void)extra; /* UNUSED (maybe) */
     #ifdef EXTRA_DUMP
     	if (extra != NULL)
    -		fprintf(stderr, "   detail: %s\n", EXTRA_DUMP(extra));
    -#else
    -	(void)extra; /* UNUSED */
    +		logprintf("   detail: %s\n", EXTRA_DUMP(extra));
     #endif
     
     	if (dump_on_failure) {
    @@ -225,203 +351,154 @@ report_failure(void *extra)
     	}
     }
     
    -/*
    - * Summarize repeated failures in the just-completed test file.
    - * The reports above suppress multiple failures from the same source
    - * line; this reports on any tests that did fail multiple times.
    - */
    -static int
    -summarize_comparator(const void *a0, const void *b0)
    -{
    -	const struct line *a = a0, *b = b0;
    -	if (a->line == 0 && b->line == 0)
    -		return (0);
    -	if (a->line == 0)
    -		return (1);
    -	if (b->line == 0)
    -		return (-1);
    -	return (a->line - b->line);
    -}
    -
    -static void
    -summarize(void)
    -{
    -	unsigned int i;
    -
    -	qsort(failed_lines, sizeof(failed_lines)/sizeof(failed_lines[0]),
    -	    sizeof(failed_lines[0]), summarize_comparator);
    -	for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
    -		if (failed_lines[i].line == 0)
    -			break;
    -		if (failed_lines[i].count > 1 && failed_lines[i].critical)
    -			fprintf(stderr, "%s:%d: Failed %d times\n",
    -			    failed_filename, failed_lines[i].line,
    -			    failed_lines[i].count);
    -	}
    -	/* Clear the failure history for the next file. */
    -	memset(failed_lines, 0, sizeof(failed_lines));
    -}
    -
    -/* Set up a message to display only after a test fails. */
    +/* Inform user that we're skipping some checks. */
     void
    -failure(const char *fmt, ...)
    +test_skipping(const char *fmt, ...)
     {
    +	char buff[1024];
     	va_list ap;
    +
     	va_start(ap, fmt);
    -	vsprintf(msg, fmt, ap);
    +	vsprintf(buff, fmt, ap);
     	va_end(ap);
    +	/* failure_start() isn't quite right, but is awfully convenient. */
    +	failure_start(test_filename, test_line, "SKIPPING: %s", buff);
    +	--failures; /* Undo failures++ in failure_start() */
    +	/* Don't failure_finish() here. */
    +	/* Mark as skip, so doesn't count as failed test. */
    +	failed_lines[test_line].skip = 1;
    +	++skips;
     }
     
    +/*
    + *
    + * ASSERTIONS
    + *
    + */
    +
     /* Generic assert() just displays the failed condition. */
     int
    -test_assert(const char *file, int line, int value, const char *condition, void *extra)
    +assertion_assert(const char *file, int line, int value,
    +    const char *condition, void *extra)
     {
    -	count_assertion(file, line);
    -	if (value) {
    -		msg[0] = '\0';
    -		return (value);
    +	assertion_count(file, line);
    +	if (!value) {
    +		failure_start(file, line, "Assertion failed: %s", condition);
    +		failure_finish(extra);
     	}
    -	failures ++;
    -	if (!verbose && previous_failures(file, line, 1))
    -		return (value);
    -	fprintf(stderr, "%s:%d: Assertion failed\n", file, line);
    -	fprintf(stderr, "   Condition: %s\n", condition);
    -	report_failure(extra);
     	return (value);
     }
     
    -/* assertEqualInt() displays the values of the two integers. */
    +/* chdir() and report any errors */
     int
    -test_assert_equal_int(const char *file, int line,
    -    int v1, const char *e1, int v2, const char *e2, void *extra)
    +assertion_chdir(const char *file, int line, const char *pathname)
     {
    -	count_assertion(file, line);
    -	if (v1 == v2) {
    -		msg[0] = '\0';
    +	assertion_count(file, line);
    +	if (chdir(pathname) == 0)
     		return (1);
    -	}
    -	failures ++;
    -	if (!verbose && previous_failures(file, line, 1))
    -		return (0);
    -	fprintf(stderr, "%s:%d: Assertion failed: Ints not equal\n",
    -	    file, line);
    -	fprintf(stderr, "      %s=%d\n", e1, v1);
    -	fprintf(stderr, "      %s=%d\n", e2, v2);
    -	report_failure(extra);
    +	failure_start(file, line, "chdir(\"%s\")", pathname);
    +	failure_finish(NULL);
    +	return (0);
    +
    +}
    +
    +/* Verify two integers are equal. */
    +int
    +assertion_equal_int(const char *file, int line,
    +    long long v1, const char *e1, long long v2, const char *e2, void *extra)
    +{
    +	assertion_count(file, line);
    +	if (v1 == v2)
    +		return (1);
    +	failure_start(file, line, "%s != %s", e1, e2);
    +	logprintf("      %s=%lld (0x%llx, 0%llo)\n", e1, v1, v1, v1);
    +	logprintf("      %s=%lld (0x%llx, 0%llo)\n", e2, v2, v2, v2);
    +	failure_finish(extra);
     	return (0);
     }
     
    -static void strdump(const char *p)
    +static void strdump(const char *e, const char *p)
     {
    +	const char *q = p;
    +
    +	logprintf("      %s = ", e);
     	if (p == NULL) {
    -		fprintf(stderr, "(null)");
    +		logprintf("NULL");
     		return;
     	}
    -	fprintf(stderr, "\"");
    +	logprintf("\"");
     	while (*p != '\0') {
     		unsigned int c = 0xff & *p++;
     		switch (c) {
    -		case '\a': fprintf(stderr, "\a"); break;
    -		case '\b': fprintf(stderr, "\b"); break;
    -		case '\n': fprintf(stderr, "\n"); break;
    -		case '\r': fprintf(stderr, "\r"); break;
    +		case '\a': printf("\a"); break;
    +		case '\b': printf("\b"); break;
    +		case '\n': printf("\n"); break;
    +		case '\r': printf("\r"); break;
     		default:
     			if (c >= 32 && c < 127)
    -				fprintf(stderr, "%c", c);
    +				logprintf("%c", c);
     			else
    -				fprintf(stderr, "\\x%02X", c);
    +				logprintf("\\x%02X", c);
     		}
     	}
    -	fprintf(stderr, "\"");
    +	logprintf("\"");
    +	logprintf(" (length %d)\n", q == NULL ? -1 : (int)strlen(q));
     }
     
    -/* assertEqualString() displays the values of the two strings. */
    +/* Verify two strings are equal, dump them if not. */
     int
    -test_assert_equal_string(const char *file, int line,
    +assertion_equal_string(const char *file, int line,
         const char *v1, const char *e1,
         const char *v2, const char *e2,
         void *extra)
     {
    -	count_assertion(file, line);
    -	if (v1 == NULL || v2 == NULL) {
    -		if (v1 == v2) {
    -			msg[0] = '\0';
    -			return (1);
    -		}
    -	} else if (strcmp(v1, v2) == 0) {
    -		msg[0] = '\0';
    +	assertion_count(file, line);
    +	if (v1 == v2 || (v1 != NULL && v2 != NULL && strcmp(v1, v2) == 0))
     		return (1);
    -	}
    -	failures ++;
    -	if (!verbose && previous_failures(file, line, 1))
    -		return (0);
    -	fprintf(stderr, "%s:%d: Assertion failed: Strings not equal\n",
    -	    file, line);
    -	fprintf(stderr, "      %s = ", e1);
    -	strdump(v1);
    -	fprintf(stderr, " (length %d)\n", v1 == NULL ? 0 : (int)strlen(v1));
    -	fprintf(stderr, "      %s = ", e2);
    -	strdump(v2);
    -	fprintf(stderr, " (length %d)\n", v2 == NULL ? 0 : (int)strlen(v2));
    -	report_failure(extra);
    +	failure_start(file, line, "%s != %s", e1, e2);
    +	strdump(e1, v1);
    +	strdump(e2, v2);
    +	failure_finish(extra);
     	return (0);
     }
     
    -static void wcsdump(const wchar_t *w)
    +static void
    +wcsdump(const char *e, const wchar_t *w)
     {
    +	logprintf("      %s = ", e);
     	if (w == NULL) {
    -		fprintf(stderr, "(null)");
    +		logprintf("(null)");
     		return;
     	}
    -	fprintf(stderr, "\"");
    +	logprintf("\"");
     	while (*w != L'\0') {
     		unsigned int c = *w++;
     		if (c >= 32 && c < 127)
    -			fprintf(stderr, "%c", c);
    +			logprintf("%c", c);
     		else if (c < 256)
    -			fprintf(stderr, "\\x%02X", c);
    +			logprintf("\\x%02X", c);
     		else if (c < 0x10000)
    -			fprintf(stderr, "\\u%04X", c);
    +			logprintf("\\u%04X", c);
     		else
    -			fprintf(stderr, "\\U%08X", c);
    +			logprintf("\\U%08X", c);
     	}
    -	fprintf(stderr, "\"");
    +	logprintf("\"\n");
     }
     
    -/* assertEqualWString() displays the values of the two strings. */
    +/* Verify that two wide strings are equal, dump them if not. */
     int
    -test_assert_equal_wstring(const char *file, int line,
    +assertion_equal_wstring(const char *file, int line,
         const wchar_t *v1, const char *e1,
         const wchar_t *v2, const char *e2,
         void *extra)
     {
    -	count_assertion(file, line);
    -	if (v1 == NULL) {
    -		if (v2 == NULL) {
    -			msg[0] = '\0';
    -			return (1);
    -		}
    -	} else if (v2 == NULL) {
    -		if (v1 == NULL) {
    -			msg[0] = '\0';
    -			return (1);
    -		}
    -	} else if (wcscmp(v1, v2) == 0) {
    -		msg[0] = '\0';
    +	assertion_count(file, line);
    +	if (v1 == v2 || wcscmp(v1, v2) == 0)
     		return (1);
    -	}
    -	failures ++;
    -	if (!verbose && previous_failures(file, line, 1))
    -		return (0);
    -	fprintf(stderr, "%s:%d: Assertion failed: Unicode strings not equal\n",
    -	    file, line);
    -	fprintf(stderr, "      %s = ", e1);
    -	wcsdump(v1);
    -	fprintf(stderr, "\n");
    -	fprintf(stderr, "      %s = ", e2);
    -	wcsdump(v2);
    -	fprintf(stderr, "\n");
    -	report_failure(extra);
    +	failure_start(file, line, "%s != %s", e1, e2);
    +	wcsdump(e1, v1);
    +	wcsdump(e2, v2);
    +	failure_finish(extra);
     	return (0);
     }
     
    @@ -436,35 +513,40 @@ hexdump(const char *p, const char *ref, size_t l, size_t offset)
     	size_t i, j;
     	char sep;
     
    +	if (p == NULL) {
    +		logprintf("(null)\n");
    +		return;
    +	}
     	for(i=0; i < l; i+=16) {
    -		fprintf(stderr, "%04x", (unsigned)(i + offset));
    +		logprintf("%04x", (unsigned)(i + offset));
     		sep = ' ';
     		for (j = 0; j < 16 && i + j < l; j++) {
     			if (ref != NULL && p[i + j] != ref[i + j])
     				sep = '_';
    -			fprintf(stderr, "%c%02x", sep, 0xff & (int)p[i+j]);
    +			logprintf("%c%02x", sep, 0xff & (int)p[i+j]);
     			if (ref != NULL && p[i + j] == ref[i + j])
     				sep = ' ';
     		}
     		for (; j < 16; j++) {
    -			fprintf(stderr, "%c  ", sep);
    +			logprintf("%c  ", sep);
     			sep = ' ';
     		}
    -		fprintf(stderr, "%c", sep);
    +		logprintf("%c", sep);
     		for (j=0; j < 16 && i + j < l; j++) {
     			int c = p[i + j];
     			if (c >= ' ' && c <= 126)
    -				fprintf(stderr, "%c", c);
    +				logprintf("%c", c);
     			else
    -				fprintf(stderr, ".");
    +				logprintf(".");
     		}
    -		fprintf(stderr, "\n");
    +		logprintf("\n");
     	}
     }
     
    -/* assertEqualMem() displays the values of the two memory blocks. */
    +/* Verify that two blocks of memory are the same, display the first
    + * block of differences if they're not. */
     int
    -test_assert_equal_mem(const char *file, int line,
    +assertion_equal_mem(const char *file, int line,
         const void *_v1, const char *e1,
         const void *_v2, const char *e2,
         size_t l, const char *ld, void *extra)
    @@ -473,202 +555,908 @@ test_assert_equal_mem(const char *file, int line,
     	const char *v2 = (const char *)_v2;
     	size_t offset;
     
    -	count_assertion(file, line);
    -	if (v1 == NULL || v2 == NULL) {
    -		if (v1 == v2) {
    -			msg[0] = '\0';
    -			return (1);
    -		}
    -	} else if (memcmp(v1, v2, l) == 0) {
    -		msg[0] = '\0';
    +	assertion_count(file, line);
    +	if (v1 == v2 || (v1 != NULL && v2 != NULL && memcmp(v1, v2, l) == 0))
     		return (1);
    -	}
    -	failures ++;
    -	if (!verbose && previous_failures(file, line, 1))
    -		return (0);
    -	fprintf(stderr, "%s:%d: Assertion failed: memory not equal\n",
    -	    file, line);
    -	fprintf(stderr, "      size %s = %d\n", ld, (int)l);
    +
    +	failure_start(file, line, "%s != %s", e1, e2);
    +	logprintf("      size %s = %d\n", ld, (int)l);
     	/* Dump 48 bytes (3 lines) so that the first difference is
     	 * in the second line. */
     	offset = 0;
     	while (l > 64 && memcmp(v1, v2, 32) == 0) {
    -		/* The first two lines agree, so step forward one line. */
    +		/* Two lines agree, so step forward one line. */
     		v1 += 16;
     		v2 += 16;
     		l -= 16;
     		offset += 16;
     	}
    -	fprintf(stderr, "      Dump of %s\n", e1);
    +	logprintf("      Dump of %s\n", e1);
     	hexdump(v1, v2, l < 64 ? l : 64, offset);
    -	fprintf(stderr, "      Dump of %s\n", e2);
    +	logprintf("      Dump of %s\n", e2);
     	hexdump(v2, v1, l < 64 ? l : 64, offset);
    -	fprintf(stderr, "\n");
    -	report_failure(extra);
    +	logprintf("\n");
    +	failure_finish(extra);
     	return (0);
     }
     
    +/* Verify that the named file exists and is empty. */
     int
    -test_assert_empty_file(const char *f1fmt, ...)
    +assertion_empty_file(const char *f1fmt, ...)
     {
     	char buff[1024];
     	char f1[1024];
     	struct stat st;
     	va_list ap;
     	ssize_t s;
    -	int fd;
    -
    +	FILE *f;
     
    +	assertion_count(test_filename, test_line);
     	va_start(ap, f1fmt);
     	vsprintf(f1, f1fmt, ap);
     	va_end(ap);
     
     	if (stat(f1, &st) != 0) {
    -		fprintf(stderr, "%s:%d: Could not stat: %s\n", test_filename, test_line, f1);
    -		report_failure(NULL);
    +		failure_start(test_filename, test_line, "Stat failed: %s", f1);
    +		failure_finish(NULL);
     		return (0);
     	}
     	if (st.st_size == 0)
     		return (1);
     
    -	failures ++;
    -	if (!verbose && previous_failures(test_filename, test_line, 1))
    -		return (0);
    -
    -	fprintf(stderr, "%s:%d: File not empty: %s\n", test_filename, test_line, f1);
    -	fprintf(stderr, "    File size: %d\n", (int)st.st_size);
    -	fprintf(stderr, "    Contents:\n");
    -	fd = open(f1, O_RDONLY);
    -	if (fd < 0) {
    -		fprintf(stderr, "    Unable to open %s\n", f1);
    +	failure_start(test_filename, test_line, "File should be empty: %s", f1);
    +	logprintf("    File size: %d\n", (int)st.st_size);
    +	logprintf("    Contents:\n");
    +	f = fopen(f1, "rb");
    +	if (f == NULL) {
    +		logprintf("    Unable to open %s\n", f1);
     	} else {
    -		s = sizeof(buff) < st.st_size ? sizeof(buff) : st.st_size;
    -		s = read(fd, buff, s);
    +		s = ((off_t)sizeof(buff) < st.st_size) ?
    +		    (ssize_t)sizeof(buff) : (ssize_t)st.st_size;
    +		s = fread(buff, 1, s, f);
     		hexdump(buff, NULL, s, 0);
    +		fclose(f);
     	}
    -	report_failure(NULL);
    +	failure_finish(NULL);
     	return (0);
     }
     
    -/* assertEqualFile() asserts that two files have the same contents. */
    +/* Verify that the named file exists and is not empty. */
    +int
    +assertion_non_empty_file(const char *f1fmt, ...)
    +{
    +	char f1[1024];
    +	struct stat st;
    +	va_list ap;
    +
    +	assertion_count(test_filename, test_line);
    +	va_start(ap, f1fmt);
    +	vsprintf(f1, f1fmt, ap);
    +	va_end(ap);
    +
    +	if (stat(f1, &st) != 0) {
    +		failure_start(test_filename, test_line, "Stat failed: %s", f1);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	if (st.st_size == 0) {
    +		failure_start(test_filename, test_line, "File empty: %s", f1);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	return (1);
    +}
    +
    +/* Verify that two files have the same contents. */
     /* TODO: hexdump the first bytes that actually differ. */
     int
    -test_assert_equal_file(const char *f1, const char *f2pattern, ...)
    +assertion_equal_file(const char *fn1, const char *f2pattern, ...)
     {
    -	char f2[1024];
    +	char fn2[1024];
     	va_list ap;
     	char buff1[1024];
     	char buff2[1024];
    -	int fd1, fd2;
    +	FILE *f1, *f2;
     	int n1, n2;
     
    +	assertion_count(test_filename, test_line);
     	va_start(ap, f2pattern);
    -	vsprintf(f2, f2pattern, ap);
    +	vsprintf(fn2, f2pattern, ap);
     	va_end(ap);
     
    -	fd1 = open(f1, O_RDONLY);
    -	fd2 = open(f2, O_RDONLY);
    +	f1 = fopen(fn1, "rb");
    +	f2 = fopen(fn2, "rb");
     	for (;;) {
    -		n1 = read(fd1, buff1, sizeof(buff1));
    -		n2 = read(fd2, buff2, sizeof(buff2));
    +		n1 = fread(buff1, 1, sizeof(buff1), f1);
    +		n2 = fread(buff2, 1, sizeof(buff2), f2);
     		if (n1 != n2)
     			break;
    -		if (n1 == 0 && n2 == 0)
    +		if (n1 == 0 && n2 == 0) {
    +			fclose(f1);
    +			fclose(f2);
     			return (1);
    +		}
     		if (memcmp(buff1, buff2, n1) != 0)
     			break;
     	}
    -	failures ++;
    -	if (!verbose && previous_failures(test_filename, test_line, 1))
    -		return (0);
    -	fprintf(stderr, "%s:%d: Files are not identical\n",
    -	    test_filename, test_line);
    -	fprintf(stderr, "  file1=\"%s\"\n", f1);
    -	fprintf(stderr, "  file2=\"%s\"\n", f2);
    -	report_failure(test_extra);
    +	fclose(f1);
    +	fclose(f2);
    +	failure_start(test_filename, test_line, "Files not identical");
    +	logprintf("  file1=\"%s\"\n", fn1);
    +	logprintf("  file2=\"%s\"\n", fn2);
    +	failure_finish(test_extra);
     	return (0);
     }
     
    +/* Verify that the named file does exist. */
     int
    -test_assert_file_exists(const char *fpattern, ...)
    +assertion_file_exists(const char *fpattern, ...)
     {
     	char f[1024];
     	va_list ap;
     
    +	assertion_count(test_filename, test_line);
     	va_start(ap, fpattern);
     	vsprintf(f, fpattern, ap);
     	va_end(ap);
     
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	if (!_access(f, 0))
    +		return (1);
    +#else
     	if (!access(f, F_OK))
     		return (1);
    -	if (!previous_failures(test_filename, test_line, 1)) {
    -		fprintf(stderr, "%s:%d: File doesn't exist\n",
    -		    test_filename, test_line);
    -		fprintf(stderr, "  file=\"%s\"\n", f);
    -		report_failure(test_extra);
    -	}
    +#endif
    +	failure_start(test_filename, test_line, "File should exist: %s", f);
    +	failure_finish(test_extra);
     	return (0);
     }
     
    +/* Verify that the named file doesn't exist. */
     int
    -test_assert_file_not_exists(const char *fpattern, ...)
    +assertion_file_not_exists(const char *fpattern, ...)
     {
     	char f[1024];
     	va_list ap;
     
    +	assertion_count(test_filename, test_line);
     	va_start(ap, fpattern);
     	vsprintf(f, fpattern, ap);
     	va_end(ap);
     
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	if (_access(f, 0))
    +		return (1);
    +#else
     	if (access(f, F_OK))
     		return (1);
    -	if (!previous_failures(test_filename, test_line, 1)) {
    -		fprintf(stderr, "%s:%d: File exists and shouldn't\n",
    -		    test_filename, test_line);
    -		fprintf(stderr, "  file=\"%s\"\n", f);
    -		report_failure(test_extra);
    -	}
    +#endif
    +	failure_start(test_filename, test_line, "File should not exist: %s", f);
    +	failure_finish(test_extra);
     	return (0);
     }
     
    -/* assertFileContents() asserts the contents of a file. */
    +/* Compare the contents of a file to a block of memory. */
     int
    -test_assert_file_contents(const void *buff, int s, const char *fpattern, ...)
    +assertion_file_contents(const void *buff, int s, const char *fpattern, ...)
     {
    -	char f[1024];
    +	char fn[1024];
     	va_list ap;
     	char *contents;
    -	int fd;
    +	FILE *f;
     	int n;
     
    +	assertion_count(test_filename, test_line);
     	va_start(ap, fpattern);
    -	vsprintf(f, fpattern, ap);
    +	vsprintf(fn, fpattern, ap);
     	va_end(ap);
     
    -	fd = open(f, O_RDONLY);
    +	f = fopen(fn, "rb");
    +	if (f == NULL) {
    +		failure_start(test_filename, test_line,
    +		    "File should exist: %s", fn);
    +		failure_finish(test_extra);
    +		return (0);
    +	}
     	contents = malloc(s * 2);
    -	n = read(fd, contents, s * 2);
    +	n = fread(contents, 1, s * 2, f);
    +	fclose(f);
     	if (n == s && memcmp(buff, contents, s) == 0) {
     		free(contents);
     		return (1);
     	}
    -	failures ++;
    -	if (!previous_failures(test_filename, test_line, 1)) {
    -		fprintf(stderr, "%s:%d: File contents don't match\n",
    -		    test_filename, test_line);
    -		fprintf(stderr, "  file=\"%s\"\n", f);
    -		if (n > 0)
    -			hexdump(contents, buff, n, 0);
    -		else {
    -			fprintf(stderr, "  File empty, contents should be:\n");
    -			hexdump(buff, NULL, s, 0);
    -		}
    -		report_failure(test_extra);
    +	failure_start(test_filename, test_line, "File contents don't match");
    +	logprintf("  file=\"%s\"\n", fn);
    +	if (n > 0)
    +		hexdump(contents, buff, n > 512 ? 512 : n, 0);
    +	else {
    +		logprintf("  File empty, contents should be:\n");
    +		hexdump(buff, NULL, s > 512 ? 512 : n, 0);
     	}
    +	failure_finish(test_extra);
     	free(contents);
     	return (0);
     }
     
    +/* Check the contents of a text file, being tolerant of line endings. */
    +int
    +assertion_text_file_contents(const char *buff, const char *fn)
    +{
    +	char *contents;
    +	const char *btxt, *ftxt;
    +	FILE *f;
    +	int n, s;
    +
    +	assertion_count(test_filename, test_line);
    +	f = fopen(fn, "r");
    +	s = strlen(buff);
    +	contents = malloc(s * 2 + 128);
    +	n = fread(contents, 1, s * 2 + 128 - 1, f);
    +	if (n >= 0)
    +		contents[n] = '\0';
    +	fclose(f);
    +	/* Compare texts. */
    +	btxt = buff;
    +	ftxt = (const char *)contents;
    +	while (*btxt != '\0' && *ftxt != '\0') {
    +		if (*btxt == *ftxt) {
    +			++btxt;
    +			++ftxt;
    +			continue;
    +		}
    +		if (btxt[0] == '\n' && ftxt[0] == '\r' && ftxt[1] == '\n') {
    +			/* Pass over different new line characters. */
    +			++btxt;
    +			ftxt += 2;
    +			continue;
    +		}
    +		break;
    +	}
    +	if (*btxt == '\0' && *ftxt == '\0') {
    +		free(contents);
    +		return (1);
    +	}
    +	failure_start(test_filename, test_line, "Contents don't match");
    +	logprintf("  file=\"%s\"\n", fn);
    +	if (n > 0)
    +		hexdump(contents, buff, n, 0);
    +	else {
    +		logprintf("  File empty, contents should be:\n");
    +		hexdump(buff, NULL, s, 0);
    +	}
    +	failure_finish(test_extra);
    +	free(contents);
    +	return (0);
    +}
    +
    +/* Test that two paths point to the same file. */
    +/* As a side-effect, asserts that both files exist. */
    +static int
    +is_hardlink(const char *file, int line,
    +    const char *path1, const char *path2)
    +{
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2;
    +	int r;
    +
    +	assertion_count(file, line);
    +	r = my_GetFileInformationByName(path1, &bhfi1);
    +	if (r == 0) {
    +		failure_start(file, line, "File %s can't be inspected?", path1);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	r = my_GetFileInformationByName(path2, &bhfi2);
    +	if (r == 0) {
    +		failure_start(file, line, "File %s can't be inspected?", path2);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	return (bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber
    +		&& bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh
    +		&& bhfi1.nFileIndexLow == bhfi2.nFileIndexLow);
    +#else
    +	struct stat st1, st2;
    +	int r;
    +
    +	assertion_count(file, line);
    +	r = lstat(path1, &st1);
    +	if (r != 0) {
    +		failure_start(file, line, "File should exist: %s", path1);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	r = lstat(path2, &st2);
    +	if (r != 0) {
    +		failure_start(file, line, "File should exist: %s", path2);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	return (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev);
    +#endif
    +}
    +
    +int
    +assertion_is_hardlink(const char *file, int line,
    +    const char *path1, const char *path2)
    +{
    +	if (is_hardlink(file, line, path1, path2))
    +		return (1);
    +	failure_start(file, line,
    +	    "Files %s and %s are not hardlinked", path1, path2);
    +	failure_finish(NULL);
    +	return (0);
    +}
    +
    +int
    +assertion_is_not_hardlink(const char *file, int line,
    +    const char *path1, const char *path2)
    +{
    +	if (!is_hardlink(file, line, path1, path2))
    +		return (1);
    +	failure_start(file, line,
    +	    "Files %s and %s should not be hardlinked", path1, path2);
    +	failure_finish(NULL);
    +	return (0);
    +}
    +
    +/* Verify a/b/mtime of 'pathname'. */
    +/* If 'recent', verify that it's within last 10 seconds. */
    +static int
    +assertion_file_time(const char *file, int line,
    +    const char *pathname, long t, long nsec, char type, int recent)
    +{
    +	long long filet, filet_nsec;
    +	int r;
    +
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +#define EPOC_TIME	(116444736000000000ULL)
    +	FILETIME ftime, fbirthtime, fatime, fmtime;
    +	ULARGE_INTEGER wintm;
    +	HANDLE h;
    +	ftime.dwLowDateTime = 0;
    +	ftime.dwHighDateTime = 0;
    +
    +	assertion_count(file, line);
    +	h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL,
    +	    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    +	if (h == INVALID_HANDLE_VALUE) {
    +		failure_start(file, line, "Can't access %s\n", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	r = GetFileTime(h, &fbirthtime, &fatime, &fmtime);
    +	switch (type) {
    +	case 'a': ftime = fatime; break;
    +	case 'b': ftime = fbirthtime; break;
    +	case 'm': ftime = fmtime; break;
    +	}
    +	CloseHandle(h);
    +	if (r == 0) {
    +		failure_start(file, line, "Can't GetFileTime %s\n", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	wintm.LowPart = ftime.dwLowDateTime;
    +	wintm.HighPart = ftime.dwHighDateTime;
    +	filet = (wintm.QuadPart - EPOC_TIME) / 10000000;
    +	filet_nsec = ((wintm.QuadPart - EPOC_TIME) % 10000000) * 100;
    +	nsec = (nsec / 100) * 100; /* Round the request */
    +#else
    +	struct stat st;
    +
    +	assertion_count(file, line);
    +	r = lstat(pathname, &st);
    +	if (r != 0) {
    +		failure_start(file, line, "Can't stat %s\n", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	switch (type) {
    +	case 'a': filet = st.st_atime; break;
    +	case 'm': filet = st.st_mtime; break;
    +	case 'b': filet = 0; break;
    +	default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
    +		exit(1);
    +	}
    +#if defined(__FreeBSD__)
    +	switch (type) {
    +	case 'a': filet_nsec = st.st_atimespec.tv_nsec; break;
    +	case 'b': filet = st.st_birthtime;
    +		filet_nsec = st.st_birthtimespec.tv_nsec; break;
    +	case 'm': filet_nsec = st.st_mtimespec.tv_nsec; break;
    +	default: fprintf(stderr, "INTERNAL: Bad type %c for file time", type);
    +		exit(1);
    +	}
    +	/* FreeBSD generally only stores to microsecond res, so round. */
    +	filet_nsec = (filet_nsec / 1000) * 1000;
    +	nsec = (nsec / 1000) * 1000;
    +#else
    +	filet_nsec = nsec = 0;	/* Generic POSIX only has whole seconds. */
    +	if (type == 'b') return (1); /* Generic POSIX doesn't have birthtime */
    +#if defined(__HAIKU__)
    +	if (type == 'a') return (1); /* Haiku doesn't have atime. */
    +#endif
    +#endif
    +#endif
    +	if (recent) {
    +		/* Check that requested time is up-to-date. */
    +		time_t now = time(NULL);
    +		if (filet < now - 10 || filet > now + 1) {
    +			failure_start(file, line,
    +			    "File %s has %ctime %ld, %ld seconds ago\n",
    +			    pathname, type, filet, now - filet);
    +			failure_finish(NULL);
    +			return (0);
    +		}
    +	} else if (filet != t || filet_nsec != nsec) {
    +		failure_start(file, line,
    +		    "File %s has %ctime %ld.%09ld, expected %ld.%09ld",
    +		    pathname, type, filet, filet_nsec, t, nsec);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	return (1);
    +}
    +
    +/* Verify atime of 'pathname'. */
    +int
    +assertion_file_atime(const char *file, int line,
    +    const char *pathname, long t, long nsec)
    +{
    +	return assertion_file_time(file, line, pathname, t, nsec, 'a', 0);
    +}
    +
    +/* Verify atime of 'pathname' is up-to-date. */
    +int
    +assertion_file_atime_recent(const char *file, int line, const char *pathname)
    +{
    +	return assertion_file_time(file, line, pathname, 0, 0, 'a', 1);
    +}
    +
    +/* Verify birthtime of 'pathname'. */
    +int
    +assertion_file_birthtime(const char *file, int line,
    +    const char *pathname, long t, long nsec)
    +{
    +	return assertion_file_time(file, line, pathname, t, nsec, 'b', 0);
    +}
    +
    +/* Verify birthtime of 'pathname' is up-to-date. */
    +int
    +assertion_file_birthtime_recent(const char *file, int line,
    +    const char *pathname)
    +{
    +	return assertion_file_time(file, line, pathname, 0, 0, 'b', 1);
    +}
    +
    +/* Verify mtime of 'pathname'. */
    +int
    +assertion_file_mtime(const char *file, int line,
    +    const char *pathname, long t, long nsec)
    +{
    +	return assertion_file_time(file, line, pathname, t, nsec, 'm', 0);
    +}
    +
    +/* Verify mtime of 'pathname' is up-to-date. */
    +int
    +assertion_file_mtime_recent(const char *file, int line, const char *pathname)
    +{
    +	return assertion_file_time(file, line, pathname, 0, 0, 'm', 1);
    +}
    +
    +/* Verify number of links to 'pathname'. */
    +int
    +assertion_file_nlinks(const char *file, int line,
    +    const char *pathname, int nlinks)
    +{
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	BY_HANDLE_FILE_INFORMATION bhfi;
    +	int r;
    +
    +	assertion_count(file, line);
    +	r = my_GetFileInformationByName(pathname, &bhfi);
    +	if (r != 0 && bhfi.nNumberOfLinks == (DWORD)nlinks)
    +		return (1);
    +	failure_start(file, line, "File %s has %d links, expected %d",
    +	    pathname, bhfi.nNumberOfLinks, nlinks);
    +	failure_finish(NULL);
    +	return (0);
    +#else
    +	struct stat st;
    +	int r;
    +
    +	assertion_count(file, line);
    +	r = lstat(pathname, &st);
    +	if (r == 0 && st.st_nlink == nlinks)
    +			return (1);
    +	failure_start(file, line, "File %s has %d links, expected %d",
    +	    pathname, st.st_nlink, nlinks);
    +	failure_finish(NULL);
    +	return (0);
    +#endif
    +}
    +
    +/* Verify size of 'pathname'. */
    +int
    +assertion_file_size(const char *file, int line, const char *pathname, long size)
    +{
    +	int64_t filesize;
    +	int r;
    +
    +	assertion_count(file, line);
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	{
    +		BY_HANDLE_FILE_INFORMATION bhfi;
    +		r = !my_GetFileInformationByName(pathname, &bhfi);
    +		filesize = ((int64_t)bhfi.nFileSizeHigh << 32) + bhfi.nFileSizeLow;
    +	}
    +#else
    +	{
    +		struct stat st;
    +		r = lstat(pathname, &st);
    +		filesize = st.st_size;
    +	}
    +#endif
    +	if (r == 0 && filesize == size)
    +			return (1);
    +	failure_start(file, line, "File %s has size %ld, expected %ld",
    +	    pathname, (long)filesize, (long)size);
    +	failure_finish(NULL);
    +	return (0);
    +}
    +
    +/* Assert that 'pathname' is a dir.  If mode >= 0, verify that too. */
    +int
    +assertion_is_dir(const char *file, int line, const char *pathname, int mode)
    +{
    +	struct stat st;
    +	int r;
    +
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	(void)mode; /* UNUSED */
    +#endif
    +	assertion_count(file, line);
    +	r = lstat(pathname, &st);
    +	if (r != 0) {
    +		failure_start(file, line, "Dir should exist: %s", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	if (!S_ISDIR(st.st_mode)) {
    +		failure_start(file, line, "%s is not a dir", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +#if !defined(_WIN32) || defined(__CYGWIN__)
    +	/* Windows doesn't handle permissions the same way as POSIX,
    +	 * so just ignore the mode tests. */
    +	/* TODO: Can we do better here? */
    +	if (mode >= 0 && mode != (st.st_mode & 07777)) {
    +		failure_start(file, line, "Dir %s has wrong mode", pathname);
    +		logprintf("  Expected: 0%3o\n", mode);
    +		logprintf("  Found: 0%3o\n", st.st_mode & 07777);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +#endif
    +	return (1);
    +}
    +
    +/* Verify that 'pathname' is a regular file.  If 'mode' is >= 0,
    + * verify that too. */
    +int
    +assertion_is_reg(const char *file, int line, const char *pathname, int mode)
    +{
    +	struct stat st;
    +	int r;
    +
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	(void)mode; /* UNUSED */
    +#endif
    +	assertion_count(file, line);
    +	r = lstat(pathname, &st);
    +	if (r != 0 || !S_ISREG(st.st_mode)) {
    +		failure_start(file, line, "File should exist: %s", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +#if !defined(_WIN32) || defined(__CYGWIN__)
    +	/* Windows doesn't handle permissions the same way as POSIX,
    +	 * so just ignore the mode tests. */
    +	/* TODO: Can we do better here? */
    +	if (mode >= 0 && mode != (st.st_mode & 07777)) {
    +		failure_start(file, line, "File %s has wrong mode", pathname);
    +		logprintf("  Expected: 0%3o\n", mode);
    +		logprintf("  Found: 0%3o\n", st.st_mode & 07777);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +#endif
    +	return (1);
    +}
    +
    +/* Check whether 'pathname' is a symbolic link.  If 'contents' is
    + * non-NULL, verify that the symlink has those contents. */
    +static int
    +is_symlink(const char *file, int line,
    +    const char *pathname, const char *contents)
    +{
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	(void)pathname; /* UNUSED */
    +	(void)contents; /* UNUSED */
    +	assertion_count(file, line);
    +	/* Windows sort-of has real symlinks, but they're only usable
    +	 * by privileged users and are crippled even then, so there's
    +	 * really not much point in bothering with this. */
    +	return (0);
    +#else
    +	char buff[300];
    +	struct stat st;
    +	ssize_t linklen;
    +	int r;
    +
    +	assertion_count(file, line);
    +	r = lstat(pathname, &st);
    +	if (r != 0) {
    +		failure_start(file, line,
    +		    "Symlink should exist: %s", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	if (!S_ISLNK(st.st_mode))
    +		return (0);
    +	if (contents == NULL)
    +		return (1);
    +	linklen = readlink(pathname, buff, sizeof(buff));
    +	if (linklen < 0) {
    +		failure_start(file, line, "Can't read symlink %s", pathname);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	buff[linklen] = '\0';
    +	if (strcmp(buff, contents) != 0)
    +		return (0);
    +	return (1);
    +#endif
    +}
    +
    +/* Assert that path is a symlink that (optionally) contains contents. */
    +int
    +assertion_is_symlink(const char *file, int line,
    +    const char *path, const char *contents)
    +{
    +	if (is_symlink(file, line, path, contents))
    +		return (1);
    +	if (contents)
    +		failure_start(file, line, "File %s is not a symlink to %s",
    +		    path, contents);
    +	else
    +		failure_start(file, line, "File %s is not a symlink", path);
    +	failure_finish(NULL);
    +	return (0);
    +}
    +
    +
    +/* Create a directory and report any errors. */
    +int
    +assertion_make_dir(const char *file, int line, const char *dirname, int mode)
    +{
    +	assertion_count(file, line);
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	(void)mode; /* UNUSED */
    +	if (0 == _mkdir(dirname))
    +		return (1);
    +#else
    +	if (0 == mkdir(dirname, mode))
    +		return (1);
    +#endif
    +	failure_start(file, line, "Could not create directory %s", dirname);
    +	failure_finish(NULL);
    +	return(0);
    +}
    +
    +/* Create a file with the specified contents and report any failures. */
    +int
    +assertion_make_file(const char *file, int line,
    +    const char *path, int mode, const char *contents)
    +{
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	/* TODO: Rework this to set file mode as well. */
    +	FILE *f;
    +	(void)mode; /* UNUSED */
    +	assertion_count(file, line);
    +	f = fopen(path, "wb");
    +	if (f == NULL) {
    +		failure_start(file, line, "Could not create file %s", path);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	if (contents != NULL) {
    +		if (strlen(contents)
    +		    != fwrite(contents, 1, strlen(contents), f)) {
    +			fclose(f);
    +			failure_start(file, line,
    +			    "Could not write file %s", path);
    +			failure_finish(NULL);
    +			return (0);
    +		}
    +	}
    +	fclose(f);
    +	return (1);
    +#else
    +	int fd;
    +	assertion_count(file, line);
    +	fd = open(path, O_CREAT | O_WRONLY, mode >= 0 ? mode : 0644);
    +	if (fd < 0) {
    +		failure_start(file, line, "Could not create %s", path);
    +		failure_finish(NULL);
    +		return (0);
    +	}
    +	if (contents != NULL) {
    +		if ((ssize_t)strlen(contents)
    +		    != write(fd, contents, strlen(contents))) {
    +			close(fd);
    +			failure_start(file, line, "Could not write to %s", path);
    +			failure_finish(NULL);
    +			return (0);
    +		}
    +	}
    +	close(fd);
    +	return (1);
    +#endif
    +}
    +
    +/* Create a hardlink and report any failures. */
    +int
    +assertion_make_hardlink(const char *file, int line,
    +    const char *newpath, const char *linkto)
    +{
    +	int succeeded;
    +
    +	assertion_count(file, line);
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	succeeded = my_CreateHardLinkA(newpath, linkto);
    +#elif HAVE_LINK
    +	succeeded = !link(linkto, newpath);
    +#else
    +	succeeded = 0;
    +#endif
    +	if (succeeded)
    +		return (1);
    +	failure_start(file, line, "Could not create hardlink");
    +	logprintf("   New link: %s\n", newpath);
    +	logprintf("   Old name: %s\n", linkto);
    +	failure_finish(NULL);
    +	return(0);
    +}
    +
    +/* Create a symlink and report any failures. */
    +int
    +assertion_make_symlink(const char *file, int line,
    +    const char *newpath, const char *linkto)
    +{
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	int targetIsDir = 0;  /* TODO: Fix this */
    +	assertion_count(file, line);
    +	if (my_CreateSymbolicLinkA(newpath, linkto, targetIsDir))
    +		return (1);
    +#elif HAVE_SYMLINK
    +	assertion_count(file, line);
    +	if (0 == symlink(linkto, newpath))
    +		return (1);
    +#endif
    +	failure_start(file, line, "Could not create symlink");
    +	logprintf("   New link: %s\n", newpath);
    +	logprintf("   Old name: %s\n", linkto);
    +	failure_finish(NULL);
    +	return(0);
    +}
    +
    +/* Set umask, report failures. */
    +int
    +assertion_umask(const char *file, int line, int mask)
    +{
    +	assertion_count(file, line);
    +	(void)file; /* UNUSED */
    +	(void)line; /* UNUSED */
    +	umask(mask);
    +	return (1);
    +}
    +
    +/*
    + *
    + *  UTILITIES for use by tests.
    + *
    + */
    +
    +/*
    + * Check whether platform supports symlinks.  This is intended
    + * for tests to use in deciding whether to bother testing symlink
    + * support; if the platform doesn't support symlinks, there's no point
    + * in checking whether the program being tested can create them.
    + *
    + * Note that the first time this test is called, we actually go out to
    + * disk to create and verify a symlink.  This is necessary because
    + * symlink support is actually a property of a particular filesystem
    + * and can thus vary between directories on a single system.  After
    + * the first call, this returns the cached result from memory, so it's
    + * safe to call it as often as you wish.
    + */
    +int
    +canSymlink(void)
    +{
    +	/* Remember the test result */
    +	static int value = 0, tested = 0;
    +	if (tested)
    +		return (value);
    +
    +	++tested;
    +	assertion_make_file(__FILE__, __LINE__, "canSymlink.0", 0644, "a");
    +	/* Note: Cygwin has its own symlink() emulation that does not
    +	 * use the Win32 CreateSymbolicLink() function. */
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +	value = my_CreateSymbolicLinkA("canSymlink.1", "canSymlink.0", 0)
    +	    && is_symlink(__FILE__, __LINE__, "canSymlink.1", "canSymlink.0");
    +#elif HAVE_SYMLINK
    +	value = (0 == symlink("canSymlink.0", "canSymlink.1"))
    +	    && is_symlink(__FILE__, __LINE__, "canSymlink.1","canSymlink.0");
    +#endif
    +	return (value);
    +}
    +
    +/*
    + * Can this platform run the gzip program?
    + */
    +/* Platform-dependent options for hiding the output of a subcommand. */
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +static const char *redirectArgs = ">NUL 2>NUL"; /* Win32 cmd.exe */
    +#else
    +static const char *redirectArgs = ">/dev/null 2>/dev/null"; /* POSIX 'sh' */
    +#endif
    +int
    +canGzip(void)
    +{
    +	static int tested = 0, value = 0;
    +	if (!tested) {
    +		tested = 1;
    +		if (systemf("gzip -V %s", redirectArgs) == 0)
    +			value = 1;
    +	}
    +	return (value);
    +}
    +
    +/*
    + * Can this platform run the gunzip program?
    + */
    +int
    +canGunzip(void)
    +{
    +	static int tested = 0, value = 0;
    +	if (!tested) {
    +		tested = 1;
    +		if (systemf("gunzip -V %s", redirectArgs) == 0)
    +			value = 1;
    +	}
    +	return (value);
    +}
    +
    +/*
    + * Sleep as needed; useful for verifying disk timestamp changes by
    + * ensuring that the wall-clock time has actually changed before we
    + * go back to re-read something from disk.
    + */
    +void
    +sleepUntilAfter(time_t t)
    +{
    +	while (t >= time(NULL))
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +		Sleep(500);
    +#else
    +		sleep(1);
    +#endif
    +}
    +
     /*
      * Call standard system() call, but build up the command line using
      * sprintf() conventions.
    @@ -682,6 +1470,8 @@ systemf(const char *fmt, ...)
     
     	va_start(ap, fmt);
     	vsprintf(buff, fmt, ap);
    +	if (verbosity > VERBOSITY_FULL)
    +		logprintf("Cmd: %s\n", buff);
     	r = system(buff);
     	va_end(ap);
     	return (r);
    @@ -700,176 +1490,48 @@ slurpfile(size_t * sizep, const char *fmt, ...)
     	va_list ap;
     	char *p;
     	ssize_t bytes_read;
    -	int fd;
    +	FILE *f;
     	int r;
     
     	va_start(ap, fmt);
     	vsprintf(filename, fmt, ap);
     	va_end(ap);
     
    -	fd = open(filename, O_RDONLY);
    -	if (fd < 0) {
    +	f = fopen(filename, "rb");
    +	if (f == NULL) {
     		/* Note: No error; non-existent file is okay here. */
     		return (NULL);
     	}
    -	r = fstat(fd, &st);
    +	r = fstat(fileno(f), &st);
     	if (r != 0) {
    -		fprintf(stderr, "Can't stat file %s\n", filename);
    -		close(fd);
    +		logprintf("Can't stat file %s\n", filename);
    +		fclose(f);
     		return (NULL);
     	}
    -	p = malloc(st.st_size + 1);
    +	p = malloc((size_t)st.st_size + 1);
     	if (p == NULL) {
    -		fprintf(stderr, "Can't allocate %ld bytes of memory to read file %s\n", (long int)st.st_size, filename);
    -		close(fd);
    +		logprintf("Can't allocate %ld bytes of memory to read file %s\n",
    +		    (long int)st.st_size, filename);
    +		fclose(f);
     		return (NULL);
     	}
    -	bytes_read = read(fd, p, st.st_size);
    +	bytes_read = fread(p, 1, (size_t)st.st_size, f);
     	if (bytes_read < st.st_size) {
    -		fprintf(stderr, "Can't read file %s\n", filename);
    -		close(fd);
    +		logprintf("Can't read file %s\n", filename);
    +		fclose(f);
     		free(p);
     		return (NULL);
     	}
     	p[st.st_size] = '\0';
     	if (sizep != NULL)
     		*sizep = (size_t)st.st_size;
    -	close(fd);
    +	fclose(f);
     	return (p);
     }
     
    -/*
    - * "list.h" is automatically generated; it just has a lot of lines like:
    - * 	DEFINE_TEST(function_name)
    - * It's used above to declare all of the test functions.
    - * We reuse it here to define a list of all tests (functions and names).
    - */
    -#undef DEFINE_TEST
    -#define	DEFINE_TEST(n) { n, #n },
    -struct { void (*func)(void); const char *name; } tests[] = {
    -	#include "list.h"
    -};
    -
    -/*
    - * This is well-intentioned, but sometimes the standard libraries
    - * leave open file descriptors and expect to be able to come back to
    - * them (e.g., for username lookups or logging).  Closing these
    - * descriptors out from under those libraries creates havoc.
    - *
    - * Maybe there's some reasonably portable way to tell if a descriptor
    - * is open without using close()?
    - */
    -#if 0
    -static void
    -close_descriptors(int warn)
    -{
    -	int i;
    -	int left_open = 0;
    -
    -	for (i = 3; i < 100; ++i) {
    -		if (close(i) == 0)
    -			++left_open;
    -	}
    -	if (warn && left_open > 0) {
    -		fprintf(stderr, " ** %d descriptors unclosed\n", left_open);
    -		failures += left_open;
    -		report_failure(NULL);
    -	}
    -}
    -#endif
    -
    -/*
    - * Each test is run in a private work dir.  Those work dirs
    - * do have consistent and predictable names, in case a group
    - * of tests need to collaborate.  However, there is no provision
    - * for requiring that tests run in a certain order.
    - */
    -static int test_run(int i, const char *tmpdir)
    -{
    -	int failures_before = failures;
    -
    -	if (!quiet_flag) {
    -		printf("%d: %s\n", i, tests[i].name);
    -		fflush(stdout);
    -	}
    -
    -	/*
    -	 * Always explicitly chdir() in case the last test moved us to
    -	 * a strange place.
    -	 */
    -	if (chdir(tmpdir)) {
    -		fprintf(stderr,
    -		    "ERROR: Couldn't chdir to temp dir %s\n",
    -		    tmpdir);
    -		exit(1);
    -	}
    -	/* Create a temp directory for this specific test. */
    -	if (mkdir(tests[i].name, 0755)) {
    -		fprintf(stderr,
    -		    "ERROR: Couldn't create temp dir ``%s''\n",
    -		    tests[i].name);
    -		exit(1);
    -	}
    -	/* Chdir() to that work directory. */
    -	if (chdir(tests[i].name)) {
    -		fprintf(stderr,
    -		    "ERROR: Couldn't chdir to temp dir ``%s''\n",
    -		    tests[i].name);
    -		exit(1);
    -	}
    -	/* Explicitly reset the locale before each test. */
    -	setlocale(LC_ALL, "C");
    -	/* Make sure there are no stray descriptors going into the test. */
    -	/* TODO: Find a better way to identify file descriptor leaks. */
    -	//close_descriptors(0);
    -	/* Run the actual test. */
    -	(*tests[i].func)();
    -	/* Close stray descriptors, record as errors against this test. */
    -	//close_descriptors(1);
    -	/* Summarize the results of this test. */
    -	summarize();
    -	/* If there were no failures, we can remove the work dir. */
    -	if (failures == failures_before) {
    -		if (!keep_temp_files && chdir(tmpdir) == 0) {
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -			systemf("rm -rf %s", tests[i].name);
    -#else
    -			systemf("rmdir /S /Q %s", tests[i].name);
    -#endif
    -		}
    -	}
    -	/* Return appropriate status. */
    -	return (failures == failures_before ? 0 : 1);
    -}
    -
    -static void usage(const char *program)
    -{
    -	static const int limit = sizeof(tests) / sizeof(tests[0]);
    -	int i;
    -
    -	printf("Usage: %s [options]   ...\n", program);
    -	printf("Default is to run all tests.\n");
    -	printf("Otherwise, specify the numbers of the tests you wish to run.\n");
    -	printf("Options:\n");
    -	printf("  -d  Dump core after any failure, for debugging.\n");
    -	printf("  -k  Keep all temp files.\n");
    -	printf("      Default: temp files for successful tests deleted.\n");
    -#ifdef PROGRAM
    -	printf("  -p   Path to executable to be tested.\n");
    -	printf("      Default: path taken from " ENVBASE " environment variable.\n");
    -#endif
    -	printf("  -q  Quiet.\n");
    -	printf("  -r    Path to dir containing reference files.\n");
    -	printf("      Default: Current directory.\n");
    -	printf("  -v  Verbose.\n");
    -	printf("Available tests:\n");
    -	for (i = 0; i < limit; i++)
    -		printf("  %d: %s\n", i, tests[i].name);
    -	exit(1);
    -}
    -
    +/* Read a uuencoded file from the reference directory, decode, and
    + * write the result into the current directory. */
     #define	UUDECODE(c) (((c) - 0x20) & 0x3f)
    -
     void
     extract_reference_file(const char *name)
     {
    @@ -893,7 +1555,7 @@ extract_reference_file(const char *name)
     	}
     	/* Now, decode the rest and write it. */
     	/* Not a lot of error checking here; the input better be right. */
    -	out = fopen(name, "w");
    +	out = fopen(name, "wb");
     	while (fgets(buff, sizeof(buff), in) != NULL) {
     		char *p = buff;
     		int bytes;
    @@ -927,48 +1589,211 @@ extract_reference_file(const char *name)
     	fclose(in);
     }
     
    +/*
    + *
    + * TEST management
    + *
    + */
     
    -/* Since gzip is by far the most popular external compression program
    - * available, we try to use it in the read_program and write_program
    - * tests.  But if it's not available, then we can't use it.  This
    - * function just tries to run gzip/gunzip to see if they're available.
    - * If not, some of the external compression program tests will be
    - * skipped. */
    -const char *
    -external_gzip_program(int un)
    +/*
    + * "list.h" is simply created by "grep DEFINE_TEST test_*.c"; it has
    + * a line like
    + *      DEFINE_TEST(test_function)
    + * for each test.
    + */
    +
    +/* Use "list.h" to declare all of the test functions. */
    +#undef DEFINE_TEST
    +#define	DEFINE_TEST(name) void name(void);
    +#include "list.h"
    +
    +/* Use "list.h" to create a list of all tests (functions and names). */
    +#undef DEFINE_TEST
    +#define	DEFINE_TEST(n) { n, #n, 0 },
    +struct { void (*func)(void); const char *name; int failures; } tests[] = {
    +	#include "list.h"
    +};
    +
    +/*
    + * Summarize repeated failures in the just-completed test.
    + */
    +static void
    +test_summarize(const char *filename, int failed)
     {
    -	static int tested = 0;
    -	static const char *compress_prog = NULL;
    -	static const char *decompress_prog = NULL;
    -	/* Args vary depending on the command interpreter we're using. */
    -#if defined(_WIN32) && !defined(__CYGWIN__)
    -	static const char *args = "-V >NUL 2>NUL"; /* Win32 cmd.exe */
    -#else
    -	static const char *args = "-V >/dev/null 2>/dev/null"; /* POSIX 'sh' */
    -#endif
    +	unsigned int i;
     
    -	if (!tested) {
    -		if (systemf("gunzip %s", args) == 0)
    -			decompress_prog = "gunzip";
    -		if (systemf("gzip %s", args) == 0)
    -			compress_prog = "gzip";
    -		tested = 1;
    +	switch (verbosity) {
    +	case VERBOSITY_SUMMARY_ONLY:
    +		printf(failed ? "E" : ".");
    +		fflush(stdout);
    +		break;
    +	case VERBOSITY_PASSFAIL:
    +		printf(failed ? "FAIL\n" : "ok\n");
    +		break;
     	}
    -	return (un ? decompress_prog : compress_prog);
    +
    +	log_console = (verbosity == VERBOSITY_LIGHT_REPORT);
    +
    +	for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
    +		if (failed_lines[i].count > 1 && !failed_lines[i].skip)
    +			logprintf("%s:%d: Summary: Failed %d times\n",
    +			    filename, i, failed_lines[i].count);
    +	}
    +	/* Clear the failure history for the next file. */
    +	memset(failed_lines, 0, sizeof(failed_lines));
    +}
    +
    +/*
    + * Actually run a single test, with appropriate setup and cleanup.
    + */
    +static int
    +test_run(int i, const char *tmpdir)
    +{
    +	char logfilename[64];
    +	int failures_before = failures;
    +	int oldumask;
    +
    +	switch (verbosity) {
    +	case VERBOSITY_SUMMARY_ONLY: /* No per-test reports at all */
    +		break;
    +	case VERBOSITY_PASSFAIL: /* rest of line will include ok/FAIL marker */
    +		printf("%3d: %-50s", i, tests[i].name);
    +		fflush(stdout);
    +		break;
    +	default: /* Title of test, details will follow */
    +		printf("%3d: %s\n", i, tests[i].name);
    +	}
    +
    +	/* Chdir to the top-level work directory. */
    +	if (!assertChdir(tmpdir)) {
    +		fprintf(stderr,
    +		    "ERROR: Can't chdir to top work dir %s\n", tmpdir);
    +		exit(1);
    +	}
    +	/* Create a log file for this test. */
    +	sprintf(logfilename, "%s.log", tests[i].name);
    +	logfile = fopen(logfilename, "w");
    +	fprintf(logfile, "%s\n\n", tests[i].name);
    +	/* Chdir() to a work dir for this specific test. */
    +	if (!assertMakeDir(tests[i].name, 0755)
    +	    || !assertChdir(tests[i].name)) {
    +		fprintf(stderr,
    +		    "ERROR: Can't chdir to work dir %s/%s\n",
    +		    tmpdir, tests[i].name);
    +		exit(1);
    +	}
    +	/* Explicitly reset the locale before each test. */
    +	setlocale(LC_ALL, "C");
    +	/* Record the umask before we run the test. */
    +	umask(oldumask = umask(0));
    +	/*
    +	 * Run the actual test.
    +	 */
    +	(*tests[i].func)();
    +	/*
    +	 * Clean up and report afterwards.
    +	 */
    +	/* Restore umask */
    +	umask(oldumask);
    +	/* Reset locale. */
    +	setlocale(LC_ALL, "C");
    +	/* Reset directory. */
    +	if (!assertChdir(tmpdir)) {
    +		fprintf(stderr, "ERROR: Couldn't chdir to temp dir %s\n",
    +		    tmpdir);
    +		exit(1);
    +	}
    +	/* Report per-test summaries. */
    +	tests[i].failures = failures - failures_before;
    +	test_summarize(test_filename, tests[i].failures);
    +	/* Close the per-test log file. */
    +	fclose(logfile);
    +	logfile = NULL;
    +	/* If there were no failures, we can remove the work dir and logfile. */
    +	if (tests[i].failures == 0) {
    +		if (!keep_temp_files && assertChdir(tmpdir)) {
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +			/* Make sure not to leave empty directories.
    +			 * Sometimes a processing of closing files used by tests
    +			 * is not done, then rmdir will be failed and it will
    +			 * leave a empty test directory. So we should wait a few
    +			 * seconds and retry rmdir. */
    +			int r, t;
    +			for (t = 0; t < 10; t++) {
    +				if (t > 0)
    +					Sleep(1000);
    +				r = systemf("rmdir /S /Q %s", tests[i].name);
    +				if (r == 0)
    +					break;
    +			}
    +			systemf("del %s", logfilename);
    +#else
    +			systemf("rm -rf %s", tests[i].name);
    +			systemf("rm %s", logfilename);
    +#endif
    +		}
    +	}
    +	/* Return appropriate status. */
    +	return (tests[i].failures);
    +}
    +
    +/*
    + *
    + *
    + * MAIN and support routines.
    + *
    + *
    + */
    +
    +static void
    +usage(const char *program)
    +{
    +	static const int limit = sizeof(tests) / sizeof(tests[0]);
    +	int i;
    +
    +	printf("Usage: %s [options]   ...\n", program);
    +	printf("Default is to run all tests.\n");
    +	printf("Otherwise, specify the numbers of the tests you wish to run.\n");
    +	printf("Options:\n");
    +	printf("  -d  Dump core after any failure, for debugging.\n");
    +	printf("  -k  Keep all temp files.\n");
    +	printf("      Default: temp files for successful tests deleted.\n");
    +#ifdef PROGRAM
    +	printf("  -p   Path to executable to be tested.\n");
    +	printf("      Default: path taken from " ENVBASE " environment variable.\n");
    +#endif
    +	printf("  -q  Quiet.\n");
    +	printf("  -r    Path to dir containing reference files.\n");
    +	printf("      Default: Current directory.\n");
    +	printf("  -v  Verbose.\n");
    +	printf("Available tests:\n");
    +	for (i = 0; i < limit; i++)
    +		printf("  %d: %s\n", i, tests[i].name);
    +	exit(1);
     }
     
     static char *
    -get_refdir(void)
    +get_refdir(const char *d)
     {
     	char tried[512] = { '\0' };
     	char buff[128];
     	char *pwd, *p;
     
    +	/* If a dir was specified, try that */
    +	if (d != NULL) {
    +		pwd = NULL;
    +		snprintf(buff, sizeof(buff), "%s", d);
    +		p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
    +		if (p != NULL) goto success;
    +		strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
    +		strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
    +		goto failure;
    +	}
    +
     	/* Get the current dir. */
     	pwd = getcwd(NULL, 0);
     	while (pwd[strlen(pwd) - 1] == '\n')
     		pwd[strlen(pwd) - 1] = '\0';
    -	printf("PWD: %s\n", pwd);
     
     	/* Look for a known file. */
     	snprintf(buff, sizeof(buff), "%s", pwd);
    @@ -983,7 +1808,11 @@ get_refdir(void)
     	strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
     	strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
     
    +#if defined(LIBRARY)
     	snprintf(buff, sizeof(buff), "%s/%s/test", pwd, LIBRARY);
    +#else
    +	snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM);
    +#endif
     	p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
     	if (p != NULL) goto success;
     	strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
    @@ -1003,11 +1832,12 @@ get_refdir(void)
     		strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
     	}
     
    +failure:
    +	printf("Unable to locate known reference file %s\n", KNOWNREF);
    +	printf("  Checked following directories:\n%s\n", tried);
     #if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG)
     	DebugBreak();
     #endif
    -	printf("Unable to locate known reference file %s\n", KNOWNREF);
    -	printf("  Checked following directories:\n%s\n", tried);
     	exit(1);
     
     success:
    @@ -1016,31 +1846,42 @@ success:
     	return strdup(buff);
     }
     
    -int main(int argc, char **argv)
    +int
    +main(int argc, char **argv)
     {
     	static const int limit = sizeof(tests) / sizeof(tests[0]);
     	int i, tests_run = 0, tests_failed = 0, option;
     	time_t now;
     	char *refdir_alloc = NULL;
    -	const char *progname = LIBRARY "_test";
    +	const char *progname;
     	const char *tmp, *option_arg, *p;
     	char tmpdir[256];
     	char tmpdir_timestamp[256];
     
     	(void)argc; /* UNUSED */
     
    -#if defined(_WIN32) && !defined(__CYGWIN__)
    +#if defined(HAVE__CrtSetReportMode)
     	/* To stop to run the default invalid parameter handler. */
     	_set_invalid_parameter_handler(invalid_parameter_handler);
    -	/* for open() to a binary mode. */
    -	_set_fmode(_O_BINARY);
     	/* Disable annoying assertion message box. */
     	_CrtSetReportMode(_CRT_ASSERT, 0);
     #endif
     
    +	/*
    +	 * Name of this program, used to build root of our temp directory
    +	 * tree.
    +	 */
    +	progname = p = argv[0];
    +	while (*p != '\0') {
    +		/* Support \ or / dir separators for Windows compat. */
    +		if (*p == '/' || *p == '\\')
    +			progname = p + 1;
    +		++p;
    +	}
    +
     #ifdef PROGRAM
     	/* Get the target program from environment, if available. */
    -	testprog = getenv(ENVBASE);
    +	testprogfile = getenv(ENVBASE);
     #endif
     
     	if (getenv("TMPDIR") != NULL)
    @@ -1098,19 +1939,19 @@ int main(int argc, char **argv)
     				break;
     			case 'p':
     #ifdef PROGRAM
    -				testprog = option_arg;
    +				testprogfile = option_arg;
     #else
     				usage(progname);
     #endif
     				break;
     			case 'q':
    -				quiet_flag++;
    +				verbosity--;
     				break;
     			case 'r':
     				refdir = option_arg;
     				break;
     			case 'v':
    -				verbose = 1;
    +				verbosity++;
     				break;
     			default:
     				usage(progname);
    @@ -1122,8 +1963,26 @@ int main(int argc, char **argv)
     	 * Sanity-check that our options make sense.
     	 */
     #ifdef PROGRAM
    -	if (testprog == NULL)
    +	if (testprogfile == NULL)
     		usage(progname);
    +	{
    +		char *testprg;
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +		/* Command.com sometimes rejects '/' separators. */
    +		testprg = strdup(testprogfile);
    +		for (i = 0; testprg[i] != '\0'; i++) {
    +			if (testprg[i] == '/')
    +				testprg[i] = '\\';
    +		}
    +		testprogfile = testprg;
    +#endif
    +		/* Quote the name that gets put into shell command lines. */
    +		testprg = malloc(strlen(testprogfile) + 3);
    +		strcpy(testprg, "\"");
    +		strcat(testprg, testprogfile);
    +		strcat(testprg, "\"");
    +		testprog = testprg;
    +	}
     #endif
     
     	/*
    @@ -1132,19 +1991,20 @@ int main(int argc, char **argv)
     	 * to make it easier to track the results of multiple tests.
     	 */
     	now = time(NULL);
    -	for (i = 0; i < 1000; i++) {
    +	for (i = 0; ; i++) {
     		strftime(tmpdir_timestamp, sizeof(tmpdir_timestamp),
     		    "%Y-%m-%dT%H.%M.%S",
     		    localtime(&now));
     		sprintf(tmpdir, "%s/%s.%s-%03d", tmp, progname,
     		    tmpdir_timestamp, i);
    -		if (mkdir(tmpdir,0755) == 0)
    +		if (assertMakeDir(tmpdir,0755))
     			break;
    -		if (errno == EEXIST)
    -			continue;
    -		fprintf(stderr, "ERROR: Unable to create temp directory %s\n",
    -		    tmpdir);
    -		exit(1);
    +		if (i >= 999) {
    +			fprintf(stderr,
    +			    "ERROR: Unable to create temp directory %s\n",
    +			    tmpdir);
    +			exit(1);
    +		}
     	}
     
     	/*
    @@ -1152,14 +2012,16 @@ int main(int argc, char **argv)
     	 * reference files, try to find the reference files in
     	 * the "usual places."
     	 */
    -	if (refdir == NULL)
    -		refdir = refdir_alloc = get_refdir();
    +	refdir = refdir_alloc = get_refdir(refdir);
     
     	/*
     	 * Banner with basic information.
     	 */
    -	if (!quiet_flag) {
    -		printf("Running tests in: %s\n", tmpdir);
    +	printf("\n");
    +	printf("If tests fail or crash, details will be in:\n");
    +	printf("   %s\n", tmpdir);
    +	printf("\n");
    +	if (verbosity > VERBOSITY_SUMMARY_ONLY) {
     		printf("Reference files will be read from: %s\n", refdir);
     #ifdef PROGRAM
     		printf("Running tests on: %s\n", testprog);
    @@ -1167,6 +2029,9 @@ int main(int argc, char **argv)
     		printf("Exercising: ");
     		fflush(stdout);
     		printf("%s\n", EXTRA_VERSION);
    +	} else {
    +		printf("Running ");
    +		fflush(stdout);
     	}
     
     	/*
    @@ -1212,20 +2077,38 @@ int main(int argc, char **argv)
     	/*
     	 * Report summary statistics.
     	 */
    -	if (!quiet_flag) {
    +	if (verbosity > VERBOSITY_SUMMARY_ONLY) {
     		printf("\n");
    -		printf("%d of %d tests reported failures\n",
    -		    tests_failed, tests_run);
    -		printf(" Total of %d assertions checked.\n", assertions);
    -		printf(" Total of %d assertions failed.\n", failures);
    -		printf(" Total of %d reported skips.\n", skips);
    +		printf("Totals:\n");
    +		printf("  Tests run:         %8d\n", tests_run);
    +		printf("  Tests failed:      %8d\n", tests_failed);
    +		printf("  Assertions checked:%8d\n", assertions);
    +		printf("  Assertions failed: %8d\n", failures);
    +		printf("  Skips reported:    %8d\n", skips);
    +	}
    +	if (failures) {
    +		printf("\n");
    +		printf("Failing tests:\n");
    +		for (i = 0; i < limit; ++i) {
    +			if (tests[i].failures)
    +				printf("  %d: %s (%d failures)\n", i,
    +				    tests[i].name, tests[i].failures);
    +		}
    +		printf("\n");
    +		printf("Details for failing tests: %s\n", tmpdir);
    +		printf("\n");
    +	} else {
    +		if (verbosity == VERBOSITY_SUMMARY_ONLY)
    +			printf("\n");
    +		printf("%d tests passed, no failures\n", tests_run);
     	}
     
     	free(refdir_alloc);
     
     	/* If the final tmpdir is empty, we can remove it. */
     	/* This should be the usual case when all tests succeed. */
    +	assertChdir("..");
     	rmdir(tmpdir);
     
    -	return (tests_failed);
    +	return (tests_failed ? 1 : 0);
     }
    diff --git a/lib/libarchive/test/test.h b/lib/libarchive/test/test.h
    index 94c66e8d3bca..6ea7b571f3f5 100644
    --- a/lib/libarchive/test/test.h
    +++ b/lib/libarchive/test/test.h
    @@ -45,43 +45,85 @@
     #error Oops: No config.h and no pre-built configuration in test.h.
     #endif
     
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -#include 
    -#else
    -#include 
    -#endif
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    +#include   /* Windows requires this before sys/stat.h */
     #include 
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -#include 
    -#endif
    -#include 
     
     #ifdef USE_DMALLOC
     #include 
     #endif
    +#if HAVE_DIRENT_H
    +#include 
    +#endif
    +#ifdef HAVE_DIRECT_H
    +#include 
    +#define dirent direct
    +#endif
    +#include 
    +#include 
    +#ifdef HAVE_IO_H
    +#include 
    +#endif
    +#ifdef HAVE_STDINT_H
    +#include 
    +#endif
    +#include 
    +#include 
    +#include 
    +#include 
    +#ifdef HAVE_UNISTD_H
    +#include 
    +#endif
    +#include 
    +#ifdef HAVE_WINDOWS_H
    +#include 
    +#endif
     
    -/* No non-FreeBSD platform will have __FBSDID, so just define it here. */
    -#ifdef __FreeBSD__
    -#include   /* For __FBSDID */
    -#else
    -/* Some non-FreeBSD platforms such as newlib-derived ones like 
    - * cygwin, have __FBSDID, so this definition must be guarded.
    +/*
    + * System-specific tweaks.  We really want to minimize these
    + * as much as possible, since they make it harder to understand
    + * the mainline code.
      */
    -#ifndef __FBSDID
    -#define	__FBSDID(a)     /* null */
    +
    +/* Windows (including Visual Studio and MinGW but not Cygwin) */
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +#if !defined(__BORLANDC__)
    +#define strdup _strdup
     #endif
    +#define	LOCALE_UTF8	NULL
    +#else
    +#define LOCALE_UTF8	"de_DE.UTF-8"
     #endif
     
    -#if defined(_WIN32) && !defined(__CYGWIN__)
    +/* Visual Studio */
    +#ifdef _MSC_VER
     #define snprintf	sprintf_s
    -#define LOCALE_DE	"deu"
    -#else
    -#define LOCALE_DE	"de_DE.UTF-8"
    +#endif
    +
    +#if defined(__BORLANDC__)
    +#pragma warn -8068	/* Constant out of range in comparison. */
    +#endif
    +
    +/* Cygwin */
    +#if defined(__CYGWIN__)
    +/* Cygwin-1.7.x is lazy about populating nlinks, so don't
    + * expect it to be accurate. */
    +# define NLINKS_INACCURATE_FOR_DIRS
    +#endif
    +
    +/* Haiku OS */
    +#if defined(__HAIKU__)
    +/* Haiku has typedefs in stdint.h (needed for int64_t) */
    +#include 
    +#endif
    +
    +/* Get a real definition for __FBSDID if we can */
    +#if HAVE_SYS_CDEFS_H
    +#include 
    +#endif
    +
    +/* If not, define it so as to avoid dangling semicolons. */
    +#ifndef __FBSDID
    +#define	__FBSDID(a)     struct _undefined_hack
     #endif
     
     #ifndef O_BINARY
    @@ -95,38 +137,81 @@
     #define DEFINE_TEST(name) void name(void); void name(void)
     
     /* An implementation of the standard assert() macro */
    -#define assert(e)   test_assert(__FILE__, __LINE__, (e), #e, NULL)
    -
    +#define assert(e)   assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
    +/* chdir() and error if it fails */
    +#define assertChdir(path)  \
    +  assertion_chdir(__FILE__, __LINE__, path)
     /* Assert two integers are the same.  Reports value of each one if not. */
    -#define assertEqualInt(v1,v2)   \
    -  test_assert_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
    -
    +#define assertEqualInt(v1,v2) \
    +  assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
     /* Assert two strings are the same.  Reports value of each one if not. */
     #define assertEqualString(v1,v2)   \
    -  test_assert_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
    +  assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
     /* As above, but v1 and v2 are wchar_t * */
     #define assertEqualWString(v1,v2)   \
    -  test_assert_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
    +  assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
     /* As above, but raw blocks of bytes. */
     #define assertEqualMem(v1, v2, l)	\
    -  test_assert_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
    +  assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
     /* Assert two files are the same; allow printf-style expansion of second name.
      * See below for comments about variable arguments here...
      */
     #define assertEqualFile		\
    -  test_setup(__FILE__, __LINE__);test_assert_equal_file
    +  assertion_setup(__FILE__, __LINE__);assertion_equal_file
     /* Assert that a file is empty; supports printf-style arguments. */
     #define assertEmptyFile		\
    -  test_setup(__FILE__, __LINE__);test_assert_empty_file
    +  assertion_setup(__FILE__, __LINE__);assertion_empty_file
    +/* Assert that a file is not empty; supports printf-style arguments. */
    +#define assertNonEmptyFile		\
    +  assertion_setup(__FILE__, __LINE__);assertion_non_empty_file
    +#define assertFileAtime(pathname, sec, nsec)	\
    +  assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
    +#define assertFileAtimeRecent(pathname)	\
    +  assertion_file_atime_recent(__FILE__, __LINE__, pathname)
    +#define assertFileBirthtime(pathname, sec, nsec)	\
    +  assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
    +#define assertFileBirthtimeRecent(pathname) \
    +  assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
     /* Assert that a file exists; supports printf-style arguments. */
     #define assertFileExists		\
    -  test_setup(__FILE__, __LINE__);test_assert_file_exists
    +  assertion_setup(__FILE__, __LINE__);assertion_file_exists
     /* Assert that a file exists; supports printf-style arguments. */
     #define assertFileNotExists		\
    -  test_setup(__FILE__, __LINE__);test_assert_file_not_exists
    +  assertion_setup(__FILE__, __LINE__);assertion_file_not_exists
     /* Assert that file contents match a string; supports printf-style arguments. */
     #define assertFileContents             \
    -  test_setup(__FILE__, __LINE__);test_assert_file_contents
    +  assertion_setup(__FILE__, __LINE__);assertion_file_contents
    +#define assertFileMtime(pathname, sec, nsec)	\
    +  assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
    +#define assertFileMtimeRecent(pathname) \
    +  assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
    +#define assertFileNLinks(pathname, nlinks)  \
    +  assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
    +#define assertFileSize(pathname, size)  \
    +  assertion_file_size(__FILE__, __LINE__, pathname, size)
    +#define assertTextFileContents         \
    +  assertion_setup(__FILE__, __LINE__);assertion_text_file_contents
    +#define assertIsDir(pathname, mode)		\
    +  assertion_is_dir(__FILE__, __LINE__, pathname, mode)
    +#define assertIsHardlink(path1, path2)	\
    +  assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
    +#define assertIsNotHardlink(path1, path2)	\
    +  assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
    +#define assertIsReg(pathname, mode)		\
    +  assertion_is_reg(__FILE__, __LINE__, pathname, mode)
    +#define assertIsSymlink(pathname, contents)	\
    +  assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
    +/* Create a directory, report error if it fails. */
    +#define assertMakeDir(dirname, mode)	\
    +  assertion_make_dir(__FILE__, __LINE__, dirname, mode)
    +#define assertMakeFile(path, mode, contents) \
    +  assertion_make_file(__FILE__, __LINE__, path, mode, contents)
    +#define assertMakeHardlink(newfile, oldfile)	\
    +  assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
    +#define assertMakeSymlink(newfile, linkto)	\
    +  assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
    +#define assertUmask(mask)	\
    +  assertion_umask(__FILE__, __LINE__, mask)
     
     /*
      * This would be simple with C99 variadic macros, but I don't want to
    @@ -135,26 +220,60 @@
      * but effective.
      */
     #define skipping	\
    -  test_setup(__FILE__, __LINE__);test_skipping
    +  assertion_setup(__FILE__, __LINE__);test_skipping
     
     /* Function declarations.  These are defined in test_utility.c. */
     void failure(const char *fmt, ...);
    -void test_setup(const char *, int);
    +int assertion_assert(const char *, int, int, const char *, void *);
    +int assertion_chdir(const char *, int, const char *);
    +int assertion_empty_file(const char *, ...);
    +int assertion_equal_file(const char *, const char *, ...);
    +int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
    +int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
    +int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
    +int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
    +int assertion_file_atime(const char *, int, const char *, long, long);
    +int assertion_file_atime_recent(const char *, int, const char *);
    +int assertion_file_birthtime(const char *, int, const char *, long, long);
    +int assertion_file_birthtime_recent(const char *, int, const char *);
    +int assertion_file_contents(const void *, int, const char *, ...);
    +int assertion_file_exists(const char *, ...);
    +int assertion_file_mtime(const char *, int, const char *, long, long);
    +int assertion_file_mtime_recent(const char *, int, const char *);
    +int assertion_file_nlinks(const char *, int, const char *, int);
    +int assertion_file_not_exists(const char *, ...);
    +int assertion_file_size(const char *, int, const char *, long);
    +int assertion_is_dir(const char *, int, const char *, int);
    +int assertion_is_hardlink(const char *, int, const char *, const char *);
    +int assertion_is_not_hardlink(const char *, int, const char *, const char *);
    +int assertion_is_reg(const char *, int, const char *, int);
    +int assertion_is_symlink(const char *, int, const char *, const char *);
    +int assertion_make_dir(const char *, int, const char *, int);
    +int assertion_make_file(const char *, int, const char *, int, const char *);
    +int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
    +int assertion_make_symlink(const char *, int, const char *newpath, const char *);
    +int assertion_non_empty_file(const char *, ...);
    +int assertion_text_file_contents(const char *buff, const char *f);
    +int assertion_umask(const char *, int, int);
    +void assertion_setup(const char *, int);
    +
     void test_skipping(const char *fmt, ...);
    -int test_assert(const char *, int, int, const char *, void *);
    -int test_assert_empty_file(const char *, ...);
    -int test_assert_equal_file(const char *, const char *, ...);
    -int test_assert_equal_int(const char *, int, int, const char *, int, const char *, void *);
    -int test_assert_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
    -int test_assert_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
    -int test_assert_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
    -int test_assert_file_contents(const void *, int, const char *, ...);
    -int test_assert_file_exists(const char *, ...);
    -int test_assert_file_not_exists(const char *, ...);
     
     /* Like sprintf, then system() */
     int systemf(const char * fmt, ...);
     
    +/* Delay until time() returns a value after this. */
    +void sleepUntilAfter(time_t);
    +
    +/* Return true if this platform can create symlinks. */
    +int canSymlink(void);
    +
    +/* Return true if this platform can run the "gzip" program. */
    +int canGzip(void);
    +
    +/* Return true if this platform can run the "gunzip" program. */
    +int canGunzip(void);
    +
     /* Suck file into string allocated via malloc(). Call free() when done. */
     /* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
     char *slurpfile(size_t *, const char *fmt, ...);
    @@ -162,9 +281,6 @@ char *slurpfile(size_t *, const char *fmt, ...);
     /* Extracts named reference file to the current directory. */
     void extract_reference_file(const char *);
     
    -/* Get external gzip program name */
    -const char *external_gzip_program(int un);
    -
     /*
      * Special interfaces for libarchive test harness.
      */
    @@ -177,20 +293,9 @@ int read_open_memory(struct archive *, void *, size_t, size_t);
     /* "2" version exercises a slightly different set of libarchive APIs. */
     int read_open_memory2(struct archive *, void *, size_t, size_t);
     
    -/*
    - * ARCHIVE_VERSION_STAMP first appeared in 1.9 and libarchive 2.2.4.
    - * We can approximate it for earlier versions, though.
    - * This is used to disable tests of features not present in the current
    - * version.
    - */
    -#ifndef ARCHIVE_VERSION_STAMP
    -#define ARCHIVE_VERSION_STAMP	\
    -		(ARCHIVE_API_VERSION * 1000000 + ARCHIVE_API_FEATURE * 1000)
    -#endif
    -
     /* Versions of above that accept an archive argument for additional info. */
    -#define assertA(e)   test_assert(__FILE__, __LINE__, (e), #e, (a))
    +#define assertA(e)   assertion_assert(__FILE__, __LINE__, (e), #e, (a))
     #define assertEqualIntA(a,v1,v2)   \
    -  test_assert_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
    +  assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
     #define assertEqualStringA(a,v1,v2)   \
    -  test_assert_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
    +  assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
    diff --git a/lib/libarchive/test/test_acl_pax.c b/lib/libarchive/test/test_acl_pax.c
    index 5898a6626d73..f6b065d2a689 100644
    --- a/lib/libarchive/test/test_acl_pax.c
    +++ b/lib/libarchive/test/test_acl_pax.c
    @@ -406,7 +406,7 @@ DEFINE_TEST(test_acl_pax)
     	struct archive *a;
     	struct archive_entry *ae;
     	size_t used;
    -	int fd;
    +	FILE *f;
     
     	/* Write an archive to memory. */
     	assert(NULL != (a = archive_write_new()));
    @@ -453,14 +453,14 @@ DEFINE_TEST(test_acl_pax)
     #endif
     
     	/* Write out the data we generated to a file for manual inspection. */
    -	assert(-1 < (fd = open("testout", O_WRONLY | O_CREAT | O_TRUNC, 0775)));
    -	assert(used == (size_t)write(fd, buff, (unsigned int)used));
    -	close(fd);
    +	assert(NULL != (f = fopen("testout", "wb")));
    +	assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f));
    +	fclose(f);
     
     	/* Write out the reference data to a file for manual inspection. */
    -	assert(-1 < (fd = open("reference", O_WRONLY | O_CREAT | O_TRUNC, 0775)));
    -	assert(sizeof(reference) == write(fd, reference, sizeof(reference)));
    -	close(fd);
    +	assert(NULL != (f = fopen("reference", "wb")));
    +	assert(sizeof(reference) == fwrite(reference, 1, sizeof(reference), f));
    +	fclose(f);
     
     	/* Assert that the generated data matches the built-in reference data.*/
     	failure("Generated pax archive does not match reference; check 'testout' and 'reference' files.");
    diff --git a/lib/libarchive/test/test_compat_bzip2.c b/lib/libarchive/test/test_compat_bzip2.c
    index cbd113b0153a..96eacad79cc4 100644
    --- a/lib/libarchive/test/test_compat_bzip2.c
    +++ b/lib/libarchive/test/test_compat_bzip2.c
    @@ -47,7 +47,10 @@ compat_bzip2(const char *name)
     	int i;
     
     	assert((a = archive_read_new()) != NULL);
    -	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
    +	if (ARCHIVE_OK != archive_read_support_compression_bzip2(a)) {
    +		skipping("Unsupported bzip2");
    +		return;
    +	}
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
     	extract_reference_file(name);
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2));
    diff --git a/lib/libarchive/test/test_compat_cpio.c b/lib/libarchive/test/test_compat_cpio.c
    new file mode 100644
    index 000000000000..b0ead3901e14
    --- /dev/null
    +++ b/lib/libarchive/test/test_compat_cpio.c
    @@ -0,0 +1,106 @@
    +/*-
    + * Copyright (c) 2003-2009 Tim Kientzle
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +/*
    + * Verify our ability to read various sample files.
    + * It should be easy to add any new sample files sent in by users
    + * to this collection of tests.
    + */
    +
    +/* Copy this function for each test file and adjust it accordingly. */
    +
    +/*
    + * test_compat_cpio_1.cpio checks heuristics for avoiding false
    + * hardlinks.  foo1 and foo2 are files that have nlinks=1 and so
    + * should not be marked as hardlinks even though they have identical
    + * ino values.  bar1 and bar2 have nlinks=2 so should be marked
    + * as hardlinks.
    + */
    +static void
    +test_compat_cpio_1(void)
    +{
    +	char name[] = "test_compat_cpio_1.cpio";
    +	struct archive_entry *ae;
    +	struct archive *a;
    +
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
    +	extract_reference_file(name);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 17));
    +
    +	/* Read first entry. */
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualString("foo1", archive_entry_pathname(ae));
    +	assertEqualString(NULL, archive_entry_hardlink(ae));
    +	assertEqualInt(1260250228, archive_entry_mtime(ae));
    +	assertEqualInt(1000, archive_entry_uid(ae));
    +	assertEqualInt(1000, archive_entry_gid(ae));
    +	assertEqualInt(0100644, archive_entry_mode(ae));
    +
    +	/* Read second entry. */
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualString("foo2", archive_entry_pathname(ae));
    +	assertEqualString(NULL, archive_entry_hardlink(ae));
    +	assertEqualInt(1260250228, archive_entry_mtime(ae));
    +	assertEqualInt(1000, archive_entry_uid(ae));
    +	assertEqualInt(1000, archive_entry_gid(ae));
    +	assertEqualInt(0100644, archive_entry_mode(ae));
    +
    +	/* Read third entry. */
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualString("bar1", archive_entry_pathname(ae));
    +	assertEqualString(NULL, archive_entry_hardlink(ae));
    +	assertEqualInt(1260250228, archive_entry_mtime(ae));
    +	assertEqualInt(1000, archive_entry_uid(ae));
    +	assertEqualInt(1000, archive_entry_gid(ae));
    +	assertEqualInt(0100644, archive_entry_mode(ae));
    +
    +	/* Read fourth entry. */
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualString("bar2", archive_entry_pathname(ae));
    +	assertEqualString("bar1", archive_entry_hardlink(ae));
    +	assertEqualInt(1260250228, archive_entry_mtime(ae));
    +	assertEqualInt(1000, archive_entry_uid(ae));
    +	assertEqualInt(1000, archive_entry_gid(ae));
    +	assertEqualInt(0100644, archive_entry_mode(ae));
    +
    +	/* Verify that the format detection worked. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_SVR4_NOCRC);
    +
    +	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
    +	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    +}
    +
    +
    +DEFINE_TEST(test_compat_cpio)
    +{
    +	test_compat_cpio_1();
    +}
    +
    +
    diff --git a/lib/libarchive/test/test_compat_cpio_1.cpio.uu b/lib/libarchive/test/test_compat_cpio_1.cpio.uu
    new file mode 100644
    index 000000000000..3f0ee524c9fc
    --- /dev/null
    +++ b/lib/libarchive/test/test_compat_cpio_1.cpio.uu
    @@ -0,0 +1,19 @@
    +$FreeBSD$
    +
    +begin 644 test_compat_cpio_1.cpio
    +M,# $dir/f1
    +echo "f2" > $dir/f2
    +echo "f3" > $dir/f3
    +mkdir $dir/d1
    +echo "f1" > $dir/d1/f1
    +echo "f2" > $dir/d1/f2
    +echo "f3" > $dir/d1/f3
    +(cd $dir; tar cf ../$name.tar f1 f2 f3 d1/f1 d1/f2 d1/f3)
    +rm -r $dir
    +}
    +mktarfile
    +$zcmd $name.tar
    +mv $name.tar.$zsuffix $name.$ztar_suffix
    +echo "This is unrelated junk data at the end of the file" >> $name.$ztar_suffix
    +uuencode $name.$ztar_suffix $name.$ztar_suffix > $name.$ztar_suffix.uu
    +rm -f $name.$ztar_suffix
    +#
    +# Use option -e
    +#
    +name=test_compat_lzma_2
    +dir="$name`date +%Y%m%d%H%M%S`.$USER"
    +mktarfile
    +$zcmd -e $name.tar
    +mv $name.tar.$zsuffix $name.$ztar_suffix
    +uuencode $name.$ztar_suffix $name.$ztar_suffix > $name.$ztar_suffix.uu
    +rm -f $name.$ztar_suffix
    +#
    +# Use lzma command of LZMA SDK with option -d12.
    +#
    +name=test_compat_lzma_3
    +zcmd=lzmasdk	# Change this path to use lzma of LZMA SDK.
    +dir="$name`date +%Y%m%d%H%M%S`.$USER"
    +mktarfile
    +$zcmd e -d12 $name.tar $name.$ztar_suffix
    +rm -f $name.tar
    +uuencode $name.$ztar_suffix $name.$ztar_suffix > $name.$ztar_suffix.uu
    +rm -f $name.$ztar_suffix
    +
    +exit 0
    +*/
    +
    +/*
    + * Verify our ability to read sample files compatibly with unlzma.
    + *
    + * In particular:
    + *  * unlzma will read multiple lzma streams, concatenating the output
    + *  * unlzma will read lzma streams which is made by lzma with option -e,
    + *    concatenating the output
    + *
    + * Verify our ability to read sample files compatibly with lzma of
    + * LZMA SDK.
    + *  * lzma will read lzma streams which is made by lzma with option -d12,
    + *    concatenating the output
    + */
    +
    +/*
    + * All of the sample files have the same contents; they're just
    + * compressed in different ways.
    + */
    +static void
    +compat_lzma(const char *name)
    +{
    +	const char *n[7] = { "f1", "f2", "f3", "d1/f1", "d1/f2", "d1/f3", NULL };
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	int i, r;
    +
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
    +	r = archive_read_support_compression_lzma(a);
    +	if (r == ARCHIVE_WARN) {
    +		skipping("lzma reading not fully supported on this platform");
    +		assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    +		return;
    +	}
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
    +	extract_reference_file(name);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2));
    +
    +	/* Read entries, match up names with list above. */
    +	for (i = 0; i < 6; ++i) {
    +		failure("Could not read file %d (%s) from %s", i, n[i], name);
    +		assertEqualIntA(a, ARCHIVE_OK,
    +		    archive_read_next_header(a, &ae));
    +		assertEqualString(n[i], archive_entry_pathname(ae));
    +	}
    +
    +	/* Verify the end-of-archive. */
    +	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify that the format detection worked. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_LZMA);
    +	assertEqualString(archive_compression_name(a), "lzma");
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
    +
    +	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
    +	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    +}
    +
    +
    +DEFINE_TEST(test_compat_lzma)
    +{
    +	/* This sample has been added junk datas to its tail. */
    +	compat_lzma("test_compat_lzma_1.tlz");
    +	/* This sample has been made by lzma with option -e,
    +	 * the first byte of which is 0x5e.
    +	 * Not supported in libarchive 2.7.* and earlier */
    +	compat_lzma("test_compat_lzma_2.tlz");
    +	/* This sample has been made by lzma of LZMA SDK with
    +	 * option -d12, second byte and third byte of which is
    +	 * not zero.
    +	 * Not supported in libarchive 2.7.* and earlier */
    +	compat_lzma("test_compat_lzma_3.tlz");
    +}
    diff --git a/lib/libarchive/test/test_compat_lzma_1.tlz.uu b/lib/libarchive/test/test_compat_lzma_1.tlz.uu
    new file mode 100644
    index 000000000000..3b6321114220
    --- /dev/null
    +++ b/lib/libarchive/test/test_compat_lzma_1.tlz.uu
    @@ -0,0 +1,10 @@
    +$FreeBSD$
    +
    +begin 644 test_compat_lzma_1.tlz
    +M70``@`#__________P`S##P;IXPT!HUK`DO\DC[V2OB%Z^'=ZT59ANYMTD(/
    +M^W;\8!%O7<+P&=#(9W<_!$Z.7/Y<&\(8+E0^,_-\Z"D^P'N0J^4-UH"WMJ<&
    +MV-P6=Y[-FY$IFNZ="RF24TO.B7EP[F]BGMJSP[]OZ_P9/#J'T=;7E&&A@J<[
    +MA^C'Q*/Y&I)2^T930'MJTK-98U0D9R*-X2^5__6H:+A4:&ES(&ES('5N`W2"/3R1F1:P:&Q9A
    +MGH2JJI9$C?8.=WTE:O<1WA@X>DK-Y#SW;I2!P;NYG^2"-(D9/E(D_0XK_H,\
    +95*/V"T#E9ZO][@'R,6E&^A([.##_\M#YU@``
    +`
    +end
    diff --git a/lib/libarchive/test/test_compat_lzma_3.tlz.uu b/lib/libarchive/test/test_compat_lzma_3.tlz.uu
    new file mode 100644
    index 000000000000..b8d61b70afd3
    --- /dev/null
    +++ b/lib/libarchive/test/test_compat_lzma_3.tlz.uu
    @@ -0,0 +1,9 @@
    +$FreeBSD$
    +
    +begin 644 test_compat_lzma_3.tlz
    +M70`0````'``````````S##P;IXPT!HUK`DO\DC[V2OB%Z^'=ZT59ANYMTD(1
    +M$Y^=;\4%U_CXKQ*F$OFZKEQUG)1U8="](V<2K"U1\Z6%H(UNQ[Y3.=D'>_G-
    +MCO71X+M*7WH7$D1&E9Y$XHW,(`[X";GGTO+,'&1?F%<@`.$-OV;8P1?*M$A"
    +:MA+1XONREMK,1('455L=X1>WC#1YW"('I@``
    +`
    +end
    diff --git a/lib/libarchive/test/test_compat_solaris_tar_acl.c b/lib/libarchive/test/test_compat_solaris_tar_acl.c
    index ec3955ecd7fe..af4f9d3825df 100644
    --- a/lib/libarchive/test/test_compat_solaris_tar_acl.c
    +++ b/lib/libarchive/test/test_compat_solaris_tar_acl.c
    @@ -50,9 +50,9 @@ DEFINE_TEST(test_compat_solaris_tar_acl)
     
     	/* Archive has 1 entry with some ACLs set on it. */
     	assertA(0 == archive_read_next_header(a, &ae));
    -	failure("Basic ACLs should set mode to 0640, not %04o",
    +	failure("Basic ACLs should set mode to 0644, not %04o",
     	    archive_entry_mode(ae)&0777);
    -	assertEqualInt((archive_entry_mode(ae) & 0777), 0640);
    +	assertEqualInt((archive_entry_mode(ae) & 0777), 0644);
     	assertEqualInt(7, archive_entry_acl_reset(ae,
     		ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
     	assertEqualInt(ARCHIVE_OK, archive_entry_acl_next(ae,
    @@ -77,7 +77,7 @@ DEFINE_TEST(test_compat_solaris_tar_acl)
     		ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
     		&type, &permset, &tag, &qual, &name));
     	assertEqualInt(ARCHIVE_ENTRY_ACL_TYPE_ACCESS, type);
    -	assertEqualInt(000, permset);
    +	assertEqualInt(004, permset);
     	assertEqualInt(ARCHIVE_ENTRY_ACL_OTHER, tag);
     	assertEqualInt(-1, qual);
     	assert(name == NULL);
    diff --git a/lib/libarchive/test/test_entry.c b/lib/libarchive/test/test_entry.c
    index b79e822cc723..bd946c44a9e7 100644
    --- a/lib/libarchive/test/test_entry.c
    +++ b/lib/libarchive/test/test_entry.c
    @@ -51,12 +51,39 @@ DEFINE_TEST(test_entry)
     	const char *xname; /* For xattr tests. */
     	const void *xval; /* For xattr tests. */
     	size_t xsize; /* For xattr tests. */
    -	int c;
     	wchar_t wc;
     	long l;
     
     	assert((e = archive_entry_new()) != NULL);
     
    +	/*
    +	 * Verify that the AE_IF* defines match S_IF* defines
    +	 * on this platform. See comments in archive_entry.h.
    +	 */
    +#ifdef S_IFREG
    +	assertEqualInt(S_IFREG, AE_IFREG);
    +#endif
    +#ifdef S_IFLNK
    +	assertEqualInt(S_IFLNK, AE_IFLNK);
    +#endif
    +#ifdef S_IFSOCK
    +	assertEqualInt(S_IFSOCK, AE_IFSOCK);
    +#endif
    +#ifdef S_IFCHR
    +	assertEqualInt(S_IFCHR, AE_IFCHR);
    +#endif
    +/* Work around MinGW, which defines S_IFBLK wrong. */
    +/* sourceforge.net/tracker/?func=detail&atid=102435&aid=1942809&group_id=2435 */
    +#if defined(S_IFBLK) && !defined(_WIN32)
    +	assertEqualInt(S_IFBLK, AE_IFBLK);
    +#endif
    +#ifdef S_IFDIR
    +	assertEqualInt(S_IFDIR, AE_IFDIR);
    +#endif
    +#ifdef S_IFIFO
    +	assertEqualInt(S_IFIFO, AE_IFIFO);
    +#endif
    +
     	/*
     	 * Basic set/read tests for all fields.
     	 * We should be able to set any field and read
    @@ -414,7 +441,7 @@ DEFINE_TEST(test_entry)
     	skipping("ACL preserved by archive_entry_clone()");
     #else
     	/* Verify ACL was copied. */
    -	assertEqualInt(4, c = archive_entry_acl_reset(e2,
    +	assertEqualInt(4, archive_entry_acl_reset(e2,
     			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
     	/* First three are standard permission bits. */
     	assertEqualInt(0, archive_entry_acl_next(e2,
    @@ -455,7 +482,7 @@ DEFINE_TEST(test_entry)
     	skipping("xattr data preserved by archive_entry_clone");
     #else
     	/* Verify xattr was copied. */
    -	assertEqualInt(1, c = archive_entry_xattr_reset(e2));
    +	assertEqualInt(1, archive_entry_xattr_reset(e2));
     	assertEqualInt(0, archive_entry_xattr_next(e2, &xname, &xval, &xsize));
     	assertEqualString(xname, "xattr1");
     	assertEqualString(xval, "xattrvalue");
    @@ -539,7 +566,7 @@ DEFINE_TEST(test_entry)
     	skipping("ACL held by clone of archive_entry");
     #else
     	/* Verify ACL was unchanged. */
    -	assertEqualInt(4, c = archive_entry_acl_reset(e2,
    +	assertEqualInt(4, archive_entry_acl_reset(e2,
     			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
     	/* First three are standard permission bits. */
     	assertEqualInt(0, archive_entry_acl_next(e2,
    @@ -807,7 +834,7 @@ DEFINE_TEST(test_entry)
     	/*
     	 * Exercise the character-conversion logic, if we can.
     	 */
    -	if (NULL == setlocale(LC_ALL, LOCALE_DE)) {
    +	if (NULL == LOCALE_UTF8 || NULL == setlocale(LC_ALL, LOCALE_UTF8)) {
     		skipping("Can't exercise charset-conversion logic without"
     			" a suitable locale.");
     	} else {
    diff --git a/lib/libarchive/test/test_entry_strmode.c b/lib/libarchive/test/test_entry_strmode.c
    index 5ede8b6f2172..70c0e7556968 100644
    --- a/lib/libarchive/test/test_entry_strmode.c
    +++ b/lib/libarchive/test/test_entry_strmode.c
    @@ -31,11 +31,11 @@ DEFINE_TEST(test_entry_strmode)
     
     	assert((entry = archive_entry_new()) != NULL);
     
    -	archive_entry_set_mode(entry, S_IFREG | 0642);
    +	archive_entry_set_mode(entry, AE_IFREG | 0642);
     	assertEqualString(archive_entry_strmode(entry), "-rw-r---w- ");
     
     	/* Regular file + hardlink still shows as regular file. */
    -	archive_entry_set_mode(entry, S_IFREG | 0644);
    +	archive_entry_set_mode(entry, AE_IFREG | 0644);
     	archive_entry_set_hardlink(entry, "link");
     	assertEqualString(archive_entry_strmode(entry), "-rw-r--r-- ");
     
    @@ -44,22 +44,22 @@ DEFINE_TEST(test_entry_strmode)
     	assertEqualString(archive_entry_strmode(entry), "hrw-r----- ");
     	archive_entry_set_hardlink(entry, NULL);
     
    -	archive_entry_set_mode(entry, S_IFDIR | 0777);
    +	archive_entry_set_mode(entry, AE_IFDIR | 0777);
     	assertEqualString(archive_entry_strmode(entry), "drwxrwxrwx ");
     
    -	archive_entry_set_mode(entry, S_IFBLK | 03642);
    +	archive_entry_set_mode(entry, AE_IFBLK | 03642);
     	assertEqualString(archive_entry_strmode(entry), "brw-r-S-wT ");
     
    -	archive_entry_set_mode(entry, S_IFCHR | 05777);
    +	archive_entry_set_mode(entry, AE_IFCHR | 05777);
     	assertEqualString(archive_entry_strmode(entry), "crwsrwxrwt ");
     
    -	archive_entry_set_mode(entry, S_IFSOCK | 0222);
    +	archive_entry_set_mode(entry, AE_IFSOCK | 0222);
     	assertEqualString(archive_entry_strmode(entry), "s-w--w--w- ");
     
    -	archive_entry_set_mode(entry, S_IFIFO | 0444);
    +	archive_entry_set_mode(entry, AE_IFIFO | 0444);
     	assertEqualString(archive_entry_strmode(entry), "pr--r--r-- ");
     
    -	archive_entry_set_mode(entry, S_IFLNK | 04000);
    +	archive_entry_set_mode(entry, AE_IFLNK | 04000);
     	assertEqualString(archive_entry_strmode(entry), "l--S------ ");
     
     	archive_entry_acl_add_entry(entry, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
    diff --git a/lib/libarchive/test/test_extattr_freebsd.c b/lib/libarchive/test/test_extattr_freebsd.c
    index 19881c2ece59..de3ae2a586d1 100644
    --- a/lib/libarchive/test/test_extattr_freebsd.c
    +++ b/lib/libarchive/test/test_extattr_freebsd.c
    @@ -85,7 +85,7 @@ DEFINE_TEST(test_extattr_freebsd)
     
     	n = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, "testattr", "1234", 4);
     	if (n != 4) {
    -		skipping("Restoring xattr to an unwritable file (broken in some versions of FreeBSD");
    +		skipping("Restoring xattr to an unwritable file seems to be broken on this platform");
     		extattr_privilege_bug = 1;
     	}
     	close(fd);
    @@ -114,17 +114,15 @@ DEFINE_TEST(test_extattr_freebsd)
     	archive_entry_set_size(ae, 0);
     	archive_entry_set_mode(ae, 0);
     	archive_entry_xattr_add_entry(ae, "user.bar", "123456", 6);
    -	if (extattr_privilege_bug)
    -		/* If the bug is here, write_header will return warning. */
    -		assertEqualIntA(a, ARCHIVE_WARN,
    -		    archive_write_header(a, ae));
    -	else
    -		assertEqualIntA(a, ARCHIVE_OK,
    -		    archive_write_header(a, ae));
    +	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
     	archive_entry_free(ae);
     
     	/* Close the archive. */
    -	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
    +	if (extattr_privilege_bug)
    +		/* If the bug is here, write_close will return warning. */
    +		assertEqualIntA(a, ARCHIVE_WARN, archive_write_close(a));
    +	else
    +		assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
     	assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
     
     	/* Verify the data on disk. */
    diff --git a/lib/libarchive/test/test_fuzz.c b/lib/libarchive/test/test_fuzz.c
    index 9c5a05615903..7e3f28d0bb32 100644
    --- a/lib/libarchive/test/test_fuzz.c
    +++ b/lib/libarchive/test/test_fuzz.c
    @@ -44,86 +44,87 @@ __FBSDID("$FreeBSD$");
      * post-failure diagnostics.
      */
     
    -/* Because this works for any archive, I can just re-use the archives
    - * developed for other tests.  I've not included all of the compressed
    - * archives here, though; I don't want to spend all of my test time
    - * testing zlib and bzlib. */
    -static const char *
    -files[] = {
    -	"test_fuzz_1.iso",
    -	"test_compat_bzip2_1.tbz",
    -	"test_compat_gtar_1.tar",
    -	"test_compat_tar_hardlink_1.tar",
    -	"test_compat_zip_1.zip",
    -	"test_read_format_gtar_sparse_1_17_posix10_modified.tar",
    -	"test_read_format_tar_empty_filename.tar",
    -	"test_read_format_zip.zip",
    -	NULL
    +/* Because this works for any archive, we can just re-use the archives
    + * developed for other tests. */
    +static struct {
    +	int uncompress; /* If 1, decompress the file before fuzzing. */
    +	const char *name;
    +} files[] = {
    +	{0, "test_fuzz_1.iso.Z"}, /* Exercise compress decompressor. */
    +	{1, "test_fuzz_1.iso.Z"},
    +	{0, "test_compat_bzip2_1.tbz"}, /* Exercise bzip2 decompressor. */
    +	{1, "test_compat_bzip2_1.tbz"},
    +	{0, "test_compat_gtar_1.tar"},
    +	{0, "test_compat_gzip_1.tgz"}, /* Exercise gzip decompressor. */
    +	{0, "test_compat_gzip_2.tgz"}, /* Exercise gzip decompressor. */
    +	{0, "test_compat_tar_hardlink_1.tar"},
    +	{0, "test_compat_xz_1.txz"}, /* Exercise xz decompressor. */
    +	{0, "test_compat_zip_1.zip"},
    +	{0, "test_read_format_ar.ar"},
    +	{0, "test_read_format_cpio_bin_be.cpio"},
    +	{0, "test_read_format_gtar_sparse_1_17_posix10_modified.tar"},
    +	{0, "test_read_format_mtree.mtree"},
    +	{0, "test_read_format_tar_empty_filename.tar"},
    +	{0, "test_read_format_zip.zip"},
    +	{1, NULL}
     };
     
    -#define UnsupportedCompress(r, a) \
    -        (r != ARCHIVE_OK && \
    -         (strcmp(archive_error_string(a), \
    -            "Unrecognized archive format") == 0 && \
    -          archive_compression(a) == ARCHIVE_COMPRESSION_NONE))
    -
     DEFINE_TEST(test_fuzz)
     {
    -	const char **filep;
     	const void *blk;
     	size_t blk_size;
     	off_t blk_offset;
    +	int n;
     
    -	for (filep = files; *filep != NULL; ++filep) {
    +	for (n = 0; files[n].name != NULL; ++n) {
    +		const size_t buffsize = 30000000;
    +		const char *filename = files[n].name;
     		struct archive_entry *ae;
     		struct archive *a;
     		char *rawimage, *image;
     		size_t size;
    -		int i, r;
    +		int i;
     
    -		extract_reference_file(*filep);
    -		rawimage = slurpfile(&size, *filep);
    -		assert(rawimage != NULL);
    -		image = malloc(size);
    -		assert(image != NULL);
    -		srand(time(NULL));
    -
    -		assert((a = archive_read_new()) != NULL);
    -		assert(0 == archive_read_support_compression_all(a));
    -		assert(0 == archive_read_support_format_all(a));
    -		assert(0 == archive_read_open_memory(a, rawimage, size));
    -		r = archive_read_next_header(a, &ae);
    -		if (UnsupportedCompress(r, a)) {
    -			skipping("Skipping GZIP/BZIP2 compression check: "
    -			    "This version of libarchive was compiled "
    -			    "without gzip/bzip2 support");
    -			assert(0 == archive_read_close(a));
    -			assert(0 == archive_read_finish(a));
    -			continue;
    -		}
    -		assert(0 == r);
    -		if (r == ARCHIVE_OK) {
    -			char buff[20];
    -
    -			r = archive_read_data(a, buff, 19);
    -			if (r < ARCHIVE_OK && strcmp(archive_error_string(a),
    -			    "libarchive compiled without deflate support (no libz)") == 0) {
    -				skipping("Skipping ZIP compression check: %s",
    -				    archive_error_string(a));
    -				assert(0 == archive_read_close(a));
    -				assert(0 == archive_read_finish(a));
    +		extract_reference_file(filename);
    +		if (files[n].uncompress) {
    +			int r;
    +			/* Use format_raw to decompress the data. */
    +			assert((a = archive_read_new()) != NULL);
    +			assertEqualIntA(a, ARCHIVE_OK,
    +			    archive_read_support_compression_all(a));
    +			assertEqualIntA(a, ARCHIVE_OK,
    +			    archive_read_support_format_raw(a));
    +			r = archive_read_open_filename(a, filename, 16384);
    +			if (r != ARCHIVE_OK) {
    +				archive_read_finish(a);
    +				skipping("Cannot uncompress %s", filename);
     				continue;
     			}
    -			while (0 == archive_read_data_block(a, &blk,
    -				&blk_size, &blk_offset))
    +			assertEqualIntA(a, ARCHIVE_OK,
    +			    archive_read_next_header(a, &ae));
    +			rawimage = malloc(buffsize);
    +			size = archive_read_data(a, rawimage, buffsize);
    +			assertEqualIntA(a, ARCHIVE_EOF,
    +			    archive_read_next_header(a, &ae));
    +			assertEqualInt(ARCHIVE_OK,
    +			    archive_read_finish(a));
    +			assert(size > 0);
    +			failure("Internal buffer is not big enough for "
    +			    "uncompressed test file: %s", filename);
    +			if (!assert(size < buffsize))
    +				continue;
    +		} else {
    +			rawimage = slurpfile(&size, filename);
    +			if (!assert(rawimage != NULL))
     				continue;
    -
     		}
    -		assert(0 == archive_read_close(a));
    -		assert(0 == archive_read_finish(a));
    +		image = malloc(size);
    +		assert(image != NULL);
    +		srand((unsigned)time(NULL));
     
     		for (i = 0; i < 100; ++i) {
    -			int j, fd, numbytes;
    +			FILE *f;
    +			int j, numbytes;
     
     			/* Fuzz < 1% of the bytes in the archive. */
     			memcpy(image, rawimage, size);
    @@ -133,11 +134,10 @@ DEFINE_TEST(test_fuzz)
     
     			/* Save the messed-up image to a file.
     			 * If we crash, that file will be useful. */
    -			fd = open("after.test.failure.send.this.file."
    -			    "to.libarchive.maintainers.with.system.details",
    -			    O_WRONLY | O_CREAT | O_TRUNC, 0744);
    -			write(fd, image, (off_t)size);
    -			close(fd);
    +			f = fopen("after.test.failure.send.this.file."
    +			    "to.libarchive.maintainers.with.system.details", "wb");
    +			fwrite(image, 1, (size_t)size, f);
    +			fclose(f);
     
     			assert((a = archive_read_new()) != NULL);
     			assertEqualIntA(a, ARCHIVE_OK,
    diff --git a/lib/libarchive/test/test_fuzz_1.iso.Z.uu b/lib/libarchive/test/test_fuzz_1.iso.Z.uu
    new file mode 100644
    index 000000000000..6044296c1ad6
    --- /dev/null
    +++ b/lib/libarchive/test/test_fuzz_1.iso.Z.uu
    @@ -0,0 +1,495 @@
    +$FreeBSD$
    +
    +begin 644 test_fuzz_1.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1GA0%`(,)$`4'QT(0``F'H@``@"(PJ)`"(A"04(6#"0"
    +M`!P4E..+`;'(Q@(6),!``^"$>&)`*`+0X9),-NGDDU!&*>645%9IY9589JGE
    +MEEQ>V<0224SQA!%3@!#F$R#D8(,-,+R`!)D@&)$$$T5,D<445!2AH1!5S$E$
    +M$5*`8`((%Q8QQ!-2/"A@"U*\0(05BDI11!!4(`H""D.D`$(,.>0P`PA%N)#%
    +M$U4X<0010=!Y:::;=GH#"$JX`,6D4HCIQ`NQ3C$$$G,RD82I708K;+`R$(A#
    +M##'(4&P.R<8P`X'@%`O#L,L<,Y`&"#VP#``,`7`"!A=L(.`SPV
    +M$P"4G'`69%/1=\8,'UR%V`#PO7#)%CML`L,3+VQQR1-C;/'"$E/<0L5S4VP%
    +MQ9E/#D`074-=^M2G,QTNLN.6>VZVJU=+[K70>FO[MN`:R[JUYF(+3KKV!B_\
    +M\,07;_SQR",K`QD.-`Z!A(B#`%B'0`800A3Z\(_\A4#DAM%<""0&[YR%0&3PSE8(!)D8/85`
    +MM(K14`BD!N_AM%*".0&[WR$0'#PSD0(I&T8'81`K(K1/@AD!^^\@T!X
    +M\,XX"*0'[UR#0'SP3H(%Y)<8I5M`I(I1P`6$=!A-6$`.AE&-!61B&#V"0!:&
    +M4=(%I&08A>V_WHG9@$@7HX`-B-TPF@*!C`VCYA"($MZ)U8"$#:/>$`C?,(H-
    +M@6@,H](0B!/>R0R!8`RCQA`(%-X)#(&0"*.Z$(C%,$H+@20,HZX0B.`PB@J!
    +M'`ZCHA#(YS#*"8&D$J.6$(A0,0H)@0`.HXH0B!;>20B!;.&=?A`(%]Z)!X&4
    +M$J,,!(!/,.>2`A.&=*PZ(&-XIN("$$J/[#8A.,6JW@!`,
    +MHP<+2)`Q2MN`G.&=;PL(&MXIMX!T$J-L#8A-,7H.@>@6HUP-2(\Q^@V!M.&=
    +MV1"(&]XY#8%D$J/-$(A,,7H,@=@6H\$0B,`PN@N!S.&=M1`('=[Y"H%4$J.I
    +M$(A+,3H*@<@6HYT02(TQ>@F!Y.&=D1"('MZY"(%$$J.%$(A*,?H'@;@6HZ<.
    +M2(PQ^NB`U!JC=PX((-[YY8`T$J-'#HA),?KB@*@6HX<+2(LQBK&`Q!JC8PN(
    +M(=XYL8`D$J.X#8A(,0K:@)@6HX@-2(HQ"M>`M!JCZ!`((][YN(`4$J/@$(A'
    +M,:H-@8@6H]002(DQZ@R!I!JCR!"()-XI#($$$J.\$(A&,6H+@7@6H[`02(@Q
    +MJ@J!E!JCI!`()M[I"8'T$:,C#TA%,;KP@&@6H_,.2(
    +M@$@6HPL+2(4QRMN`9!JCI`U(QS'*V(#$$:-T#4A"K3O!NMO][GC/>WBDAZ,C
    +M^3T@&0P`#@7R0<%_\_`CS-E/3]3"%\9PA@.IH0`&'Q`=#@#QF/\[`(9(`-(5
    +M42!)[#P3!^)$T1?H\P&9HNFM.!`LFGZ+`^FBZ;\XD#":?HP#*:/ISSB0-)I^
    +MC0-IH^G?.)`XFGZ.`ZFCZ>\XD#R:?H\#Z:/I_SB00)I^D`,II.D/.9!$FGZ1
    +M`VFDZ1\YD$B:?I(#J:3I+SF03)I^DP/II.D_.9!0FGZ4`RFEZ4\YD%2:?I4#
    +M02*F)TL#$3:FATL#43*FUTL#\4NF%TP#T3:F9TP#@4RFITP#L3FF]TP#$4VF
    +M-TT#44T%0'D`H$T&@'F(IWDW<@`8)1#GE``M&!#LI``Q"$\`L``U6$\,4(/Y
    +MU``UV$\.4(,!]0`U6%`04(,)%0$UV%`24(,1-0$U6%$44(,:50$UZ%$64(,B
    +M=0$U:%(84(,JE0$UZ%(:4(,RM0$U:%,<4(,ZU0$UZ%,>4(-"]0$UV#@UR#90(U*%8G4(-FA0(U2%4J4(-NM0(U*%=0,U*%HX4(.FE0,UJ%HZ4(.NM0,U*%L\4(.VU0,UJ%L^4(,$\P,U2#=`
    +M4(,G5H,)(P0UJ#%#4(/2A2J:1SJ3HGFP900UB%E'4(.`A00U6%Y)4(/II00U
    +MB%5+4(/QQ00U6%]-4(/YY00UV%]/4(,!!@4U6&!14(,))@4UV&!34(,11@4U
    +M6&%54(,99@4UV&%74(,AA@4U6&)94(,II@4UV&);4(,QQ@4U6&-=4(,"XP4U
    +MV&-?4(-!!@8U.&1A4(,K)@8U*#AC4(/[108U:#=E4(,'8P8U2%MG4(-O@P8U
    +M*#=I4(-LI08UV&9K4(-+4(/QQ@@U^#B-4(/YY@@UV&^/4(,!!PDU
    +M6'"14(,))PDUV'"34(,11PDU6'&54(,99PDUV'&74(,AAPDU6'*94(,CIPDU
    +MN'";4(/SQ@DUN&V=4(/#Y@DUN&J?4(.3!@HUN&>A4(-C)@HUN&2C4(,S1@HU
    +M^#FE4(,#9@HUN%ZG4(,+@PHUR%NI4(.DI0HUR%BK4(-TQ0ITIW<8FJ$:NJ$<
    +MRAL'4C,7!``A`@LH,SK#=@LEBEQ&I*(LNJ(NVJ(P^J(R&J,T.J,V6J,X>J,Z
    +M&@0A$@LF8B1!,&RX8"(\M*-&FJ-(>J1*FJ1,NJ0K&B*R8"*?%Z0`D`LF^J0`,`LFPDVC$R*T8"(OPJ,`4`LFPC)E"@"V8"+N]*;O($_'
    +M%2+P8$]W"@#QH$][*@_^M*?S(%![2@\&M:?UH%![:@\.M:?W(%%[B@\6M:?Y
    +ML%%[J@\?M:?[,%)[R@\GM:?]L%)[Z@\OM:?_,%-[ZG<6I*9)`@`\]:8"8"(K
    +M]*8#8"(=]*8$$#1[6@`F,D1O:@`F(DYJ>@`FHE9JB@`FTEYJF@`F$F=JJ@`F
    +M4F]JN@`F$DUOR@`F(E9OV@`F4EYOZ@`FDF9J^@`FTFYJ"@$F$G=J&@$FPDQJ
    +M*@$FXE5O.@$F$EYJ2@$F4F9J6@$FDFYJ:@$FTG9J>@$F@DQOB@$FHE5OF@$F
    +MTEUJJ@$F$F9JN@$F4FYJR@$FDG9JV@$F,DQJZ@$F8E5O^@$FHEUJ"@(FTF5J
    +M&@(F$FYJ*@(F4G9J.@(F\DMO2@(F(E5O6@(F8EUJ:@(FDF5J>@(FTFUJB@(F
    +M$G9JF@(FHDMJJ@(FXE1JN@(F(EUOR@(F4F5JV@(FDFUJZ@(FTG5J^@(F0DMJ
    +M"@,FHE1JZB^$\Z8R8")1IJ8S8"+5IJ8T8")9IZ8U8"*MI*8V8")&I:8W8"+*
    +MI:8X8")-IJ8Y8"+1IJ8Z8")5IZ8[8"*I]*8\8")"]:8]8"+&I:8^8"))IJ8_
    +M8"+-IJ9`8")1IZ9!8"*E]*9"8"(^]:9#8"+"I:9$8")%IJ9%8"+)IJ9&8")-
    +MIZ9'8"*A]*9(8"(Z]:9)8"*^I:9*8")!]J9+8"+%IJ9,8"))IZ9-8"*=]*9.
    +M8"(V]:9/8"*Z]:908"(]]J918"+!IJ928")%IZ938"*9]*948"(R]:958"*V
    +M]:8@&#![>@4FTFMJB@4F$G1JF@4F4DEOJ@4FXE)ON@4F(EMOR@4F4F-OV@4F
    +MDFMJZ@4FTG-J^@4F$DEO"@8FHE)O&@8FXEIO*@8F$F-O.@8F4FMO"GD`D'-J
    +M6@8FTDAO:@8F8E)O>@8FHEIOB@8FTF)OF@8F$FMOJ@8F4G-JN@8FDDAOR@8F
    +M(E)OV@8F8EIOZ@8FDF)O^@8FTFIO"@@@@FTFEOB@@F$G)OF@@F4D=OJ@@F
    +MTE!ON@@F(EEOR@@F4F%OV@@FDFEOZ@@FTG%O^@@F$D=O"@DFDE!O&@DFXEAO
    +M*@DF$F%O.@DF4FEO2@DFDG%O6@DFTD9O:@DF4E!O>@DFHEAOB@DFTF!OF@DF
    +M$FEOJ@DF4G%ON@DFDD9OR@DF$E!OV@DF8EAOZ@DFDF!O^@DFTFAO"@HF$G%O
    +M&@HF4D9O*@HFTD]O.@HF(EAO2@HF4F!O6@HFDFAO:@HFTG!O>@HF$D9OB@HF
    +MDD]OF@HFXE=OJ@HF$F!ON@HF4FAOR@HFDG!OV@HFTD5OZ@HF4D]O^@HFHE=&
    +MU*%F?=9HG=;LP7$K=>%?=@WRMD^DW:?[1-J`^D^D/:@#1=J&>E"DG:@+1=J,^E"D_:@3
    +M1=J2>E%\#0"5RE&DC:D@-=R;2E*D[:DH-=RARE*D3:HP-=RG2E.=;2(XI=@'
    +MPE/9'2)`I=@\1%2*741(I=C7Q%2*S4U0I=CD1%79S2)8E=TLPU79[4Y@I=CS
    +M1%:*?4]HI=C[5%[9_4]LE=T#!5?9?5!TE=T+A5>*_5!\I=@3!5C9/2.$I=@<
    +MA5C972.,E=TD!5F*#3.4I=@LA5G9+3.*+3B#IMB'H3.L'\]
    +M(_\!C0````4@`32`"%`!%H0&^``!0`0\"!30`G9`#0@#B<00U!D`((,0A`R"
    +M,^H?S\!_%P1%!($:&``2@1-H`L!J=-S``'``!T("[($0T`$.A!\X`2M@`+B`
    +M19`(/D$UF`$!@*3Z(`3A@S3!%[@&9>")H$,HZ)M002O8!`2:X06P4,%[()9<@6S$I>L`VHE8$P`L3@#D$'KC`,!L$S.`1K81IT?[@P%^K"
    +MQG`%W5@W*83`,!@*PQ&R!;N@0/B"!2$"]D`R6!!F(1I<@[9P#>[":4@-JZ$U
    +MO(8X(HX$3$@AOD(OK#X180!,!&9(8$X1TBQ)VX!D7B@9@T3H0@.)&46`>C
    +MH.E!+"Z1(L;$T#C0T02NZ2,:V'2L+'LDR.9(^/HD621/+)(9/@BT>-:5(_L\3^*
    +M2+@(`*A8]VF2%Q)@K,C\:!ZKY)"\DC(R2Q[)$)&Z$)79C3OY&.VDE!X).Q(YJTCTRL/3C)T_$^K&//E)*
    +MDDD.22C/I*%DBXA22]9(+EF_VD^C#`#O!U)&R049)!LD1_R0$+(P6I'):ITC@>QLK5?Y(E#-@OS))2OL([>2FQI*;$E5FQE00@:VDY
    +MH&2LG)2E,E@^2SQ)+%5E5J0E!HPXF1EUT4)"Q#T8*=$FQUR70K-=2L.E23@+I^$\G)DAR-Q-
    +M@7`C\B:*I)K[T&^>S+E9,PVFFI2'FZ<@0$T8(37UY@RLFANR7D+,CADX/V;/
    +M0()J,R!0%<=Y"04/WQR5H?-J:L2L63DG)HA$G+@S=^K.W=D8@DSJ!`"K,VK>
    +MQA,A#B-G['R86)-@UDZ5>3L59T%HG,)S;)X,?6@#C^??I)D`P&9>SEO88]K+
    +M0,`JK#,<1D1>Q0?/)9U$GK-3>69/RZDO;R'O?)_P,W[*S[D09+SG5?F4Q;-Z
    +MRLKK23G7I^V$C0#`=ZI#_$D]`P`_1)>R,SB23JTI.-M@CXDS`X&KA$^R.3Y!
    +M(>S,0))6$(Z@^*2"F:!O6L\BVC:/:,\8`G$S`.S,L=)$^Z@?_:.`M",$F3T:
    +M$*+)#P4:)U1RVE`SFD/;H,#PF@``;%9"Z2E&>=79/)Z_HZT&@E@YI,2S@@K1'SDH1^<579Y;T#0[2@F!(P>C4K*0&5)&646#:2$]GC_%6`Z&\H%(I^#K-9RM-
    +MGA$3EC;0TWE+NZDW_::!-,A`4X$@38VIYR2>B72.+E)FVDF%*0#0I0'AE)K3
    +MQXE,4>@U39_9U'\R3P#:8]+,0&`KT]1U!E$Y2D9=*?;DI+<3G"K4A0
    +M\:<"`:#.T]:93@LJ-EV@VC2+YAMQ6A#**><!=2>`LME6E*;J1;M,7%G(-`5EEI-A^@]M:('E7VV4VYZ4[NJ5_VJZR_(
    +M1-6YPE.3J3IEJD#5I`I5E%H05NI$#8=)59D:U!NJ56]G&EVC!\&-4E`XZE)'
    +M*EHMG3(U`^)1;.4R[PI8/:R(-;%FCR!36`/"Y@BH%=6G_E4L&EA/YR,M")+4
    +M&W9.>HI4S2;:S*1L,ZTZ57#P20/`6`T(=*7'R*N!X%6HZD"]H))UKC+2K:I%
    +M%:MMO:VX-3\$F=6Z5\JJ4FV6LI6=-D\`T%B)*P$5J5DQX&0B`
    +MQ;62S[Z:7&FG/HVE:C*W:M?MREWM0Y!YKG_%M\K5B_I*K^LV7:N\-2"TUK=*
    +M-N/J60VN396V-M>X41#DAG2UH-9TJ<)7T2I?NZM__:\`UCP$F3(S$.PK>X6<
    +M/=6O[M?EJE8W*@``KP$ANA[8>CI>\2E&-:\:%0FFFX&`6.[K*I64"I:\9M7_
    +MR34#K(D]L2BV.@29#7M8Q.M[%;%TE<3*T@%;7X]K+PVQ%K:\(E1^"BX*`F/Q
    +ML-15O\+8V9I04ZR1/;)(EC@$F;8S$'[LA$6GR%7(YM@1NT^YYHHM"!WVR8;4
    +M&UM=-VE=!:!W=2`$`#9*$/0J$.55<12VXEBL&F.K[(PF<[K:?]M(D3`%#:R>)B+>J4;;/8]5MN43T+`/BL
    +MEBV;7%;*LEDBRV.[RT#`+)!NYUJK*6N5*69FKL/VVX#;<&H8@8VTW
    +MR[%=L]PVHU;6M5IL`P*N?;9^5ELF6_YZ.WM,N1D(H"7;LM)MVVB_K*\5MP`W
    +MX`I<^@D`[NUG.;>9]L)NVNQ*;@L"MH6WL7;72EMERV/3SD`@+?H6Q"9<'>MO
    +M.>W`_;@@-^22A2!C<4<+PN6W7E;&,MR"6Q#R+<1-L!N7RJ9:(PD`PJP&(;,#
    +MP5I$KM$]NDA7*009HAL0VD:?C;@_=^+26T$;
    +M23&KH0V;F[5U%E!%2T49;HS(&@A6)>-66*G+8$=KTGV[
    +M<#?NZH0@L*MJ):_K?;VPMR0$&=,[6RZOZ)RW;;>_4MZ"D'@_[]K-O*.7YO:8
    +M<#,0<$OJ1;:,=^HZWMC+?)NO\XT(08;XWA;;FT"!+^NEN;.W(*!>W[MXV6ZW
    +M;;!(L.P,!-YR?-'MZIVY>O7YJM_URWX'0I`1O[N%^E91ZXM^;V'T+0C&E_NJ
    +MWJ];?]$H`%"C8A;G"@2=FTKY*J9%N9I6\WY+.*LP!4(#;K\0.`(?W2#S@`'`
    +M+WFZ,!&WZ)<(_),@/A
    +M8$!A,CR$,^P5?L-P&-P&&30L$-0P$(ZWMS?YYM[AFOZ,2$"%MDF8_IIA`-!M
    +M!L+$6,.AMPWOW3C,B!NQIPTRA5@@'.([#'7SL!+6N]YV#A<$.VQ41?"6'<.)
    +M&`5?WR/88\+.0%@8B-@2"V(W[(A;L2M&L4'&%$^7+0Q3]S``A<0%81)WXC`Z
    +M@D&Q*B[#&=;F(@D!+&[9<"`1J_XFE,C6]JD)'&
    +M@P,#!]Y`#(P7L0?FAE@7I,):2_I9U>$JWKNE518'A(718YS*0``8J;CZ=F-O
    +M6XWKL3U>J$'&'0L$>$R)?;$\5L29>'`0A)+QA_'P/V;&@]AJ#03I$H_G[SP&
    +MO_!L+882<8?-Q0>#'N_B8]F*-3(-[K2SM,55F(-B-
    +MALR%E:_'G<@P.2;7TB"3D@7"2L[(H/<7`V3P6Y$+`D8.R>?T$Y/D*"QS!W&V
    +M&0AC@R77XN_K=F6R4W[*?33('&7S0HM_JBVVLG6C(-QDH,Q9A7)./L@;>`KK
    +M4`#0=0;">E'*5IDI]U>HS);;L@<-,F59O53ER;J$>3+B(`A)&0EOY+`\BF^A
    +M,#X1Q'BS@I`"_`F3\;Y=QGRY&=_1/`HO!4)C=LN0.3)?PR#SF`%`V-#&7]DA
    +M[V2W^XV_)@C6K.)XZY9C@J!).3(ZSJ-Q.2"LEQZC5`8"WT#+=!D30V3)3)MK
    +MS:8YS+0-`8L)DWU^6F;)N;LW.>AD'&
    +M.-N7W8Q[>_,M3AP%X34'9Z)<@S-LCXDR`V&_).?JO)S7\G,^S^A9_049\*Q?
    +MJ+,>MLY863H'!.2\G1&S%.[+8[G:#`2,,9[?*[/H3@Q#^*L,Q`&3'].T!PX_0[H#]N_/&;SJC'>N0;8YZ9H":U1X:RX-#`=.D?K:/\09&YT0"`1
    +MF/GW/F3.7'4)[6>^NJ'9LV)2],-@A"PK#231I`;^DY3:?I0Y!1
    +M+@/A38?I[GNEW6Z7+@A@FBMK78.LF54T^.TQ3<90XL^6>H#5='=>Q'4Z4DMJ
    +M]Q!D$K6$$=%Q^CKC:0>#IC-S2[[*)QD`1)N!<#C@])B6TY,Z5:OJ\!!D1K6%
    +MP=2G^CI;ZIK9J<6TH7:[/:;J#(3/8:IOM7E>U<`Z6&N'(*.K-0RL]M7#U54'
    +MA%*-HL'R?5;,6I1%!V8"3$T+T$P[(`QMJAV;%?01E-8N
    +M>J8>8\.L<;GSV1Z"91L!X09TV-BUT#P*5Q[.'MMO\VY._>XU3$%`7/OZ<+]L,ETX`8`
    +M@YMM*V?9#+&%RT"@&YF["V=7STV[:_=B"#*NV\>8;%H(,_Q8(_MM]"V?9K6K5=T%HW_5[AE9B9XVSP2_<
    +M-@C46J"BV6L=H>$WZ+M(?F%TK
    +M;I',N)`=P$T[$B[A3"#(^7"``<05NMWDW
    +MYDSA*WQ[^^?\S6-]RT`@&$&QR.%^0)[K`).<1..@-A
    +MS"CR#,W('[DI/^4V(QE!WL)+MUW]OW@5@[]HPKS!
    +M&[4EO]MI$,ZR2H$PS%&Y,3_F(B'(%',`T$E8^/NNX_U572?NK"N\27#C7IOH
    +M>D:6UE4N9I!@^!H(-F64BV4DBLS+N3G?"$'FFPN$<.[**?@E)]/+O)E+<0P]
    +MSD]J^1H(ND6NO]-7SHWC
    +MKU5&NW-@/E/_N46_Z!0AR#CT`4S0R;=!%^@!(9_/@+O*`+7P!0=`;"GDGI%]NE"_6A#L=[NIZ9
    +MZ4+R+O(4"
    +M@,`>$/1Z8G?AH3K'*!J(/EU]^2O'Z@!TLJOV[<#]D0>9W>YH,#LIU^RN'8!MKY6B7M`Z.VX/:Z#65P>@.,V.9_;'/RT._=;"6<7
    +MI:6Q[O!]@`<9]QX0*DEL+^.S_19*\R,]PX,R6W?K?1&NH_9'FT>S>T"8-#T&
    +M@@T$ES+=[7A\?_"V.\@H>$VSW??YZ9SO!<&^A_(KN0`%`KAD(IZ;&IW8U.!TV:[3WS9YO[GFG:NB=],^T;6\,\96
    +M?-+5B/D]'[.#3)X/")'DOO]R.V]9T;IGEN'4W'Y;
    +M@\(&@DKY\B^9SVMZ5&_YO%[F^>>`("%#037@NF'^*9_
    +M]1H[R*AZ6P/J`[*G#PB7/LOG][$,PP9"C&GUFQO6"WN,'61ZO4#X]5*>>!/V
    +ME3OK`P*KU_6G?BS3L(%0:X`]S1WVV%Y@!YEI+Q"J?;+'WYG=G1I[75/J!_VN
    +M+_)R32`,&VNOH;.]NP?602;="YM:;Y>YO:\I]^J=RD?K-S^,XWQMW:O6FLY/
    +M>4+O`?-HFQ0(!__=*_P<'602/@!H)((^WQ/\?+/?$7V27O2+EDDK]D>?1^7]
    +M#4."0&P@F!1V7\H7OLD/T`RO((S\;U^UE[U!=_@0']J;=5(,`(C80%`M)+^B
    +MG_R=KZ6#C,T7"#B?Y;?MX^Y.0[Y`6/D1G,*R<="^V)'80&@Q.9^?\_RIS_`!
    +M@-,7"%!?Z*_N<%_E?[ZSP?=U_MR?5"8V$&)-U.>J5#_M;^@@0_8%@MG7^MR;
    +MZZ_5JR]MP/[`%_M/%0#4G(&P;<[^OU?[@#\]!YF]+Q#Z/MR?XG+?P;9]:V/W
    +ME7WBM_(`&,[K^D2RMA%_;($$L-A!$BM]?Z:`_]\/D($/[!8+M/_STW,*OU=&?
    +M2)9[FC;WT;[(<[&!8%INO^Y__I(YR"Q_@=#\@3])Q\J]7]PT?G"?^?,^&!L(
    +M*<;Y0__QSY:#S/<7".'?^COZ!3W]S0L8'0:L0_^;__,3G(S'^!
    +M4/_5O^O'G.>?NO'^#7WNA:.N6O_W36G.EU_VEP>]0`&!/-&CP''#`0>A0)X`@Z!$EB0\0/J&Q'@
    +M<*4"LH`R'TVWT]$Q`X%H(002@53@&Q9D0('^1A)XG1V!`4$0V`0F=3L='C,0
    +ME!A38!5H!N9@0888*'!H@5@9%A@02(%?H,NWT_$Q`T&J40:>@7A@^Q5DT($&
    +M!QOHA:F!`0$9&`?&?P!`RS$0+!QW8!ZH"#I?088AJ'#X@2L7'Q@0V(&#X`4(
    +M^>5R4AWEQ\MU@`(?YE<`PEDWDL.Q"(Z"D5>0$0H&!(%$"WCW@8!:5,4W`WIB
    +M-2#K=P.N?RH8MN((!@0+1X^!R`P$&D4B2`K^@B!7D+$+2AR0H$%W"@(`J6`E
    +M6``B08S,0.!9^(+`8#3X=@49S:#%40PN:,-@0-`+*H/"WWP%R0P$(08T*`V.
    +M@R)7D/$-:AS7(.94#08$SR`WJ.+U&)3,0%!JB(/D8#TH<`49\:#'D0Z><>=@
    +M0!`.NH.#6,HQ$(P<]*`]:!#*80"`0"AR[(.:73X8$,R#`&$PQN\!9O[>2C?G
    +M77[81Y5()L=!Z!$&6T$&1Q@0]!&JH"?8#79-5I?%1P.*9K(@\(0#AEUY
    +ME$(8$(P%.Z!0F64&&4B@0,(5!86Z'E?F$*H=1B/@AA0``*C,0=!A-X5,H%L)B
    +M76%!`!96A>(=5B85NAQ:8?#W#@(`K,Q`$&J$A6-A7?A?!1EQH4`P%Z*%'-[*
    +MY14*!&=ATC>2>6H9X4G88\`R`T')01?:A8RA=A5D((8"@6+(%\)X*U=>:'.T
    +MA2^AJI4!YEP;(,_E`:Z"+^`:!&=-2`(!:=@8GH:X59!A&@(`>41)6!BJ>*Z@
    +M6D?#Q8(9WPU'"Z9!I15DJ',@0;C,0!!1+(:H87`(3@49O:%`\!M.AOJ>@[4:
    +MMH81X2+68_`R`X%E`1P*A]2A315D0(<"@72('$Y\6U1Q*'1@AK?A6`;,#`09
    +MQG18'9Z'^%B+4!"4A]LAWN=@88=&!WCX_Z%ZQ,Q`T&F8A^AA?MA-!1GUH4!P
    +M'[:'K*"#-1X*!.RA8.B5V6I68:B&S`P$(0=^J!\^B+-4D+$@"@0-(H`8&KI3
    +M_:'3(1\*A3379CB`=88QFC*&_%V((>"`)!"8B!!BBFA+!1DH(@!01[B&\)\E
    +M&!N"9BNADE8;-GKSH2>51TV(4@<2!,T,!`V%@Z@B#HF\4Y#Q(PH$0:*%Z`1B
    +M3BWBB]@<,F$``#4S$$@60B*1:"6^95%B04`E*HE@(.9T)&H=&V*"N-AA,P-!
    +MA5$E7HEH(OP49)")`H&9R"7*@9B3E"@0;(D&(EM'&,:(RV"/P*;^/BMB06!FU@G`F(+77*(!($S`T''X2<"BI1BX11D0(H"
    +M@:1H*%J"@F)!4"@NBO<;GG@2>HC%F"9(U7&"&*&HJ-+!6?"10-`J5HJP8I'X
    +M'A4$<02,2`">A#-BNP8+LH0W8NO'(=:"`0"FJ'8@0>C,0)!03(JQ8K(85@$`
    +MQ:)`<"QNBLM@D/$JSHK&WYUX*[Z%[,Q`X%@@B\IBM[@+!1G9HD"P+4*+)V&0
    +MT2S*'6%B6ABJP3,#083!+7J+\&+[$V2PBP*!NT@NJGC@8D$P+H**G)Q)^!;2
    +M,P-!I?$NQHL$8UH39`",`H'`>"_Z>```O1@0V(O\(G/G+PYBC9!`D'$,C`5C
    +MQLBA!!D58T!P,2Z,(1O"&!`HC!'C\2?QN8>78'DW^9UWE5]5)R*>C`$BG,4=
    +M"00SH\9H,]YF`$#-F#,RA(Y4##C-77RK7Z\X"^:(&5!IU3$"`!E'CP'0#`0%
    +M!<9X,SZ-UD.0L30*!$TCR!CJZ8QM1+6((*J+BQU!,Q`H%DXCU"@V0A!!AMF8.6)REF-`@#DJ
    +MCDN?F*@93H0MVLHHY[6,J.++&#IVB<%<'H4<"03#8^IH/$X004;Q"`"D$;8B
    +MW(@K^HRHW^<(X#E%`AYER/%A*ZQC0%!Q]!@8S4`04)R.QV/XN!X$&=VC0/`]
    +MOHYDFO+(/#Z)A1Q',Q`8%N"C^"@_,$V2'BCM,:B&CY^8Z@H>AXYP4`M)%`$$2ND$2D;@4`#)%'9`?9"D*/*N&N
    +M:"-V71K?KX@;YE$N9$`04<:='1D0&!'\I%L'HF8]_$T`T&B,4@6DICD)#E?`34#0<-Q26:2K*1Q$&2@D@*!*OE)8DZ<
    +M9$#@29*2(Z(/>3J1BH+9&[5#SG$PHRD)9WE&`@$QV4H>DZP:`&!,*I-*),7'
    +M1+Z":QVO"$7:AD1CSU!:P9(!0
    +M!]4,!`&&/$E/'I2S09`Q4`H$!:4^Z4[=DP%!/OE/_HYP(JI'U0P$A89!B5!N
    +ME*Y!D'%1"@09I4-9Y2V4`4%#.5'VD'YDD8?5#`0)AT;)4;Z4J4&0L5(*!"VE
    +M2+E6?90!04AY4DZ,$F'DU^_ICO_>165!P%<*EJKB(!9H$`2!!F*I6&Z6
    +MD4&0<5D.!)DE9`D`-)8"P6-)6>:-;%K!01`4')HE9^E:,@9!AFHY$+"6HN5G
    +M*1"$EJ>E\ZCB\9(9G&?8"0Z6-5H>)1>U'J]E<5D;!!G#I4!`%_65N6)_UY71
    +MAM,DCBA%ZHC8BFPI$!0E=IF\VR'8)52*7!<%RF5L>A7&C
    +M74$0V!7=Y7?I7OH%089Z.1"PEZ*E=CD0<)?L(\267Q`$^45[^5[^EWE!D+%?
    +M#@3]I6@I7PH$].5YN17&C7T&0=!G^)<`9H1)%P09#>9`\&"*E@.F0%!@*IAN
    +MX2`6$*6&.F&]!D/%A#@0AIFA980H$%R:'F1G>D#XE10A46H2\(]VV
    +M.*J1>%L>M14-!#LFB>EC:@9!1H^9>D"5S67JEVC9@"YA>%@TYE$GID`07$$0R!54II5I9H8%08:8
    +M.1"0F:)EEBD0;)DNII)Y4M47!$%]46:>F7@F5Q!DT)D#@9TI6JJ9`@&;&6=6
    +MDWE?GD$0Y!EW9IZI:%X%08:A.1`@FJ(EGRD0^)F#YG19Y/4;!$&_D6@NFIRF
    +M5!!D8)H#@:8I6CJ:`@&D66EBE6Y>C)D[9H(LXR9H8]:08*9HF$<%1:1'IVEK
    +M%@9!!JTI$`Q%S.4S*1OZ=]*D54E-6IK69!X%:@H$_4:/<4X0!.?$IGEK/IL]
    +M09"Q;`X$S:9HJ6L&!+SFJ6E#TGQN!4'@5CB;T&:X210$&=WF0/!MBI;3I@OR
    +M9>*8J%Y\01#$%^"FN"EO_@1!AKLY$,";HF6Y*1"HF7@*1`,GF4G7`D`M!D$09O1
    +M>#Z>H&=&MWD6!)ZG:"EY"@249^89(")!
    +MJJ71SE-2T7L:7PV!4$&'#00R$%.)SWD5N9`4V=`
    +M$!`1FUJ4I*)#$`0ZQ#2%!PU#C)H?Q'U^G^!G^%D('4(!@#I0$)B?!L'1>#0>
    +MGW=E+[1!B)_P9_QI0MR8CB+[:7]F!T'&]3D09)^BI?))>*R;CJ*D<@(-!-J$
    +M]@E^OD[>I_RI@"Z@\"?YR0X4!`]H^ED0K)_WYU+I?OY"#&@&"@RA33AGU:GS
    +M5:`@:-)9@IA`\E<'JG,Z6/JG0,!_YIX!I=$9@KZ@KL&-`*(,!#<#$":#V@P$
    +M%%9!HHA9'Z.!>$.HARB*F+4^&H@'#V5CA$HV2*B3`H,NH7+!C5"G$`1U"F1U
    +M(\0I8I;KN"AB%7D*09"G3%,_*!/JA4H0-T(6.A!LH39H:5,01*'/%E;1IQ`$
    +M?0H76M9\H7!H`W$CK*$#01M:AHJA`@$9>H4"`(`*00"HN*%]6!PJB#8/-T(?
    +M.A#\H64H'2H0V*%[Z*!"$`PJ@.@@*HE2#S>"(SH00*)EJ"$J$""B>ZBA0A`8
    +M*I'H)"J*X@LW@B@L*HS:!S>"+SH0`*-EJ"TJ$."B>^BC0A`\*L'H,"J-
    +MQ@@X*H^>!S>".SH0P*-EJ#DJ$*"C>RBF0A!@*O'H/"J0B@VBH0A"$*B'I2"J33@E0*I4F
    +M!S>"4SH00*5EJ%$J$""E>ZCF@:9H65WH5"J6/@?BQ`CD`@F.56E!@)7NH:T*
    +M(A65CJ5P*7!P([2EZ)04&J+X'7\85A&KB%DAPEL:E_ZEN\&-L)=J$'UI&4J7
    +M)@EYJ0\T`O$0?BE@ZIC:!C="K2)F,:9EZ&"*)!2F>^A(I$$4$8WI8^J9Q@8W
    +M@F:*&YE0D>EBFH,"`+R*F'5-=*:?:6O*&MP(J:D&L9J6H:*IHW2:9D$:!#?!
    +MFKJFO.EI<"/@IDB";EJ&QJ9(PFRZAQ(K8A8YL9OVILRI:+""C$#*:1D*G)X(
    +MPND>BJR(62S"=0>,T`F6G92ARJD%$IWLHLR)FL0S:*7>JGF(&-X)Y
    +MJD&@IV7H=:I!@*=[*+0B9KD3Z>EZJI].!C>"?:I!X*=EJ'N*),"G>RBU(F;-
    +M$_GI?JJ@.@8W@H&J02"H9:A_BB0`J'LHMB)FW1,)ZH*JH28&-X*%JD%@J&6H
    +M@XHD0*A[J"BD0>P3&>J&JJ(2!C>"B8HDH*AEJ(>*)("H>RBX(F;]$RGJBJJC
    +M_@4W@HVJ0>"H9:B+>B+`J'LHN2)F#10YZHZJI.H%-X*1JD$@J66HCXHD`*E[
    +M*+HB9AT42>J2JJ76!3>"E:I!8*EEJ).*)$"I>RB[(F8M%%GJEJJFP@4W@IFJ
    +M0:"I9:B7BB2`J7LHO")F/11IZIJJIZX%-X*=JD'@J66HFXHDP*E[*+TB9DT4
    +M>>J>JJB:!3>"H:I!(*IEJ)^*)`"J>RB^(F;-"(GJHJJIA@4W@J6J06"J9:BC
    +MBB1`JGLHOR)F<129ZJ:JJG(%-X*IJD&@JF6HIXHD@*I[*,`B9M4(J>JJJJM>
    +M!3>"K:I!X*IEJ*N*),"J>RC!(F:1%+GJKJJL2@4W@K&J02"K9:BOBB0`JWLH
    +MPB)FP0S)ZK*JK38%-X*UJD%@JV6HLXHD0*M[*,,B9K$4V>JVJJXB!3>"N:I!
    +MH*MEJ+>*)("K>RC$(F;)#.GJNJJO#@4W@KVJ0>"K9:B[BB3`JWLHQ2)FT13Y
    +MZKZJL/H$-X+!JD$@K&6HOXHD`*Q[*,8B9D6=GJ.[%I8NK!RK5W`C6*P:!,9J
    +M#]&``$##.@)!K'LHQR)F\10):\?JLM8$-X+*JD&PK&4HR(HDB*R,D<^)58`L
    +M8M8*T;*^K$`K3'`C\*P:A,]:ALJL2`+-NH>2+&)6!_&S!JU0ZTIP(S"M&H33
    +M6H82K4B"T;J'HBQBEL/PM$:M8*M)<"-PK1J$UUJ&4JU(@M6ZA[(L8M;FE+%Z
    +M8AMKV"JW)@4W`MNJ0;BM(RLL6+(J"2.0V;J'PBQB%O3D@[ZA&O."FQB%32+F!4\#:Z!J.&JN3*LP-,(=+DRKK/AWIJX
    +M(@F+:]X:36(5.(N8!4-AKIMKZQH4W`BIJP:QNH*N_MW>6KEJ$)^KZ:JSPA.\CVL:R*`LIILW#`"9;*,+%*%5;PM8I:3%\LB";FL+XLB8!5WBYCE;`VSQ.PD>R-$
    +MLQK$-)O*'K,:1#+KS.ZQ>XN8]6Y1L]4L('LCA+,:Q#B;RF*S2((V^\UB%7^+
    +MF/5PD;/EK!M[(\2S&L0\F\JBLTB".OO.%EPCD,M%S]:S7.R-,+B(60)M*HO/
    +M(@GZ[#][N(A9&-<62]`2LS?"0ZM!1+3;ZT&K022T_^SB(F;]70/M1'O#W@@>
    +MK08!TJ:R%BV2@-'JL5C%XR)F>5XAK4A+PMX(+JT&`=.FLB4MDG#2_K.3BYC5
    +M>\6T,NT#>R/TM!K$3YO*UK1(PDW[SUXN8M;V!=0&M?CKC<#4:A!.;2I+U"()
    +M1NT_N[F(6?G74PO5DJ\WPE:K072UJ>Q4BR14M?_LYR)FD5\2[5<;R`(Y(Q!;
    +MN[V*M4@"6?O/CBYBUA'FU;JUU>N-@-=J$'IM*JO6:A!R+4O[A8U`/]A>R]<"
    +MKS?"Z2)F);:I[%^+)`2V_^SJ(F8]86WM8MO%0A4C$&:[O3JV&@1D^\^^+F(6
    +M)W;&-K":[4AK,(Q`IJTSN[=:MAJ$9VO8SBYBEBYVVHJPJ:T->R/0MAJ$;>O:
    +MW@BDK0;1V@JQ&^SM(F:A8IEM;JO:&K<:!'*[O?*V2()O2]RV5UC%[B)F$63)
    +MK7([T_8-(Q!VN[TRMTB"B.0MQJ$>?O;,0%N9?7O?ZK8#KIA5X+ZW
    +M^BV2P-\&N(VLV#`"Y66*[8$+MMX(RXN81>&FLL>+@GN:/B]BUEF6W5JX8"U9
    +M-@*)N-MKAJM!;+C_[/0B9@%G%2Z)&[3>""ZN!@'CIK(@K@:!XAJVUXN8I9W%
    +MN#+NRWHC]+@:Q(^;RM:X2,*-^\]N+V(6?0;D!KD=ZXW`Y&H03FXJ2^0B"4;N
    +M/_N]B%D/VI,+Y2ZL-\*6JT%TN:GLE(LD5+G_[/@B9IUH7NZ7NZ_>"&JN!L'F
    +MIK)B+I)`YOZSYXN89:&-N&YNZWHCY+D:Q)Z[O<:Y2,*<^\^N+V(6D,;G]KF:
    +MZXV`Z&H0BN[V"N@B"8*N8?N^B%F!FH'+Z`:O-\*EJT%DNN_MHXLD1+J&[?PB
    +M9NEI;>ZFJZW>"*:N!H'JIK*>+I(`ZD*XKFSV-`()#E^KJKNDW@CWBYB%ZY:A
    +MK2Z2\.K^L_N+F,6LI;JZ[JYZ(Q2[&L2QF\KVNAK$K[N'_B](`J^VZ":[%RX`
    +M0.V>"-;N]LKL(@G.[C\KP(A9#!NRB^VJJC?"N*M!E+NI[+8;`'2[AJT!(V:5
    +M;.;NN:NIW@CRK@9![Z:RZBZ2P.[^LPJ,F,6SU;OVKJ)Z(P2\&L3`F\KFNTC"
    +MOOO/.C!BUM1&\!:\>NJ-`/%J$!)O*HOP(@D*[S\KP8A9:]O$2_&JJ3?"QZM!
    +MA+RI[,6+)&2\_ZP%(V9M;=?NR!OE8FTC$,R[O9J\2`+*^\]J,&)6ZB;RRKR[
    +M+NHV`OF\J:S+JT'8O(:M!R-F`6^:+M`+M=X(2J\&P?2^MSRO!D'T_K,BC)BE
    +MO?V\3J^.>B-DO1K$UIO*1KU(PM1+Z_ZR)HR81;\UO5VOD`L`I+T:Q-K[WH*]
    +M2(+8^\^J,&(6!,?VMKTS+]ZK0>B][RWZ@1(V:UL`8!`I>A
    +M%C"2@`'_LUJ,F-742<`B\%]Z([3`&L0+G,J6P$C"";R'>C%BUD\7\\;`!B]/
    +M-P+YP-LK#8PDV,#_K!@C9B%V,#`0/);>"$JP!L$$I[(\L`9!!!NV9HR8Y=DU
    +MP4[P5'HC9,$:Q!:+)/>"(:P!H$(
    +MI[)^,.-QFMHQ8I9TIP(61I>(HP)3Z0W
    +MPBBL093"J>PFC"1TPH:M'R-FN7BF\"D\D-X(LK`&00NGLJHPDL`*_[."C)@E
    +MY-7"MO`\>B,$PQK$,)S*YL)(PB[\SQHR8A:61PP7P^/HC0`-:Q#2<"J+#",)
    +MRO`_J\B(65'>-$P-3Z,WPC>L083#J>PUC"1DP_^L(R-F>7F7\#B\H-X([K`&
    +M`0]OK^8PDH`._[.2C)@5Z,7#\O!^>B/TPQK$/[R]UL-(PCULV%HR8E:N)PX'
    +MQ+/HC<`0:Q`.<2I+$",)!K%AJ\F(6<_>0PP1CZ(WPD:L073$J>Q$C"14Q/^L
    +M)R-F(7L>\4<\B=X(*K$&P1*GLB(QDD`2_[.BC)CE[;7$+O$@>B/DQ!K$3IS*
    +MQL1(PDS\SYHR8M:Z!Q#WQ-CO#3,"*<7;*U",)`C%_ZPJ(V;%?#PQ4PR'W@A6
    +ML0:!%:>R2+$&`14;MJZ,F(7T[;U:\3P,`)3%&L19_-YVQ4C"5_S/RC)B5M"7
    +M%:?%3.B-0!=K$'9Q*LL6(PEN<>6+5=@R8E;6=Q?CQ3#HC4`8:Q"&<2J[%R,)
    +M??$_J\N(66_?88P8AZ`WPF2L053&J>QBC"0TQO^L+R-F&7Z6\65<@=X(HK$&
    +M01JGLIHQDL`9_[/"C)A5_"W%IC$%W"6-0+/Q]IH:(PFK\3]KS(A9OU]I7!NS
    +MGS?";ZQ!!,>I;&RL0>3&AJTR(V95?\+Q<&Q\W@C.L08!':>RQC&2@!S_L\Z,
    +MF)7^1QY(W3'&L1WG,I6QTC"=?S/2C-B5O\''H?'H.>-P!YK$.YQ*DL>
    +M(PGF\3]KS8A9"2!M#!\_P0#`?JQ!],?;ZWR,)-3'_ZPV(V8Q@>_Q?^QWW@@*
    +ML@;!(*>R`C*20"`;MMZ,F.4%-L@.-@")K$"IR*@LB(PDB\C]KSHA9@N"*S"(CG3?"C:Q!Y,BI[(N,),3(
    +M_ZPZ(V91@CKRCAQSW@A&L@:!)*>R/C*2`"3_L^Z,F(4(^L=*\B)<"(Y`5_+V
    +MVB0C"4_R/RO/B%G)8)*<)5N<-\*8K$&4R:ELE:Q!=,F&K3TC9FV#9O*93'#>
    +M"'*R!D$GI[)J,I+`)O^S^HR8U0[6R7:RO'DC!,H:Q*"_,_Z,V+6
    +M/T@H%\KAYHT`*6L0DG(JBR@C"8KR/RO0B%D0X:1,*3^;-\*GK$&$RJGLI8PD
    +M9,K_K$$C9A&$6/*H;`PGA",0K+R]FLI(`JK\SRHT8A9)&"O+RM4PB30"^RO+(&02P;MA*-F$45-LO.LJ)Y
    +M(V3+&L2VG,I&RTC"M/S/6C1B5F"(%G?+0NF-@"YK$.KR>PLN(PGB\C^KT8A9
    +M>R&WS"Z?F3?"O:Q!Y,NI[+N,),3+@C$`X-&(69*AOKPO6YDWPL&L023,J:R_
    +MC"0`S/^L2"-F,8<*\\+\8]X(%K,&@3&GL@XSD@`Q_[,FC9AU'&;,&C.)>2.4
    +MS!K$R9S*=LQ(PL?\SZHT8I9VB#*GS!+FC4`S:Q`VR=C.2@#?_LT*-F$4G&LV",SD<
    +M)8Y`C_-[6S@C"8?S/VO4B%F*(N0<.0^C-\+FK$%TSN]MXZQ!5,X%LU(C9GV*
    +MGO/G'!$#`*JS!L$ZO[>B,Y)`.A?,3HV8I2D&SJZS8GDCY,X:Q.Z".:S!H$^O[?>,Y(`/O^S7HV8!3&FS^JS
    +M('HCU,\:Q/W\WK;/2,+[7#"+-6(6R8@_Y\];,0!`0&L0!O1[RS\C"?YSY8M`
    +MZ[Y(XPC4@Z:R,ZA`4(/NH3Z*F)4U+L\3M/UY(W30&L0'O;WNH&_-:1JEB%EM
    +MXP$=0C?/`,`*K4&TT.\M"8TDF-"&K9@B9B6.+O0+_8+>"#JT!L%#O[]M%JU!A-$%\Q,Z$*"AVC,;
    +M/4_>"$&H!C&$8M`XZ!^680PI8A;_>,86H4EH(GV$+M(QBAXM-MX(A+0&84B_
    +MMWTTDO!'?[,9AI4B9D&0AS0C[4DKTJ`T;NM(%XPW@B:M07#2[VTDC21,TA+T
    +M*/V8`@KM0`"@`%`!P@P`E`1``5\`I\`L4`I(0!$``F`(0\`2\$LG`43`$>!+
    +M_PIY@A2P*P0!IH(O#05@")7"H<`$@`#/]!-@!1#3=4+W4`5``5``HD`%Q`F6
    +M0C<]!20!6$"<,"?XTG8"GJ`G=`]Z`C--!20!0\`4`#=-"E.`+WTH.`$.R1#P
    +M31,!8<(00$U7`4*`KS`%]-*!@A%@*N5*_]1`=5`M5`_51'51;50?
    +MU4AU4JU4+]5,=5/M5#_54'54+55/U51U56U57]58=5:M56_57'57[55_U6!U
    +M6"U6C]5D=5EM5I_5:'5:K5:OU6QU6^U6O]5P=5PM5\_5='5=;5??U7AU7JU7
    +M[]5\=5_M5__5@'5@+5@/UH1U86U8']:(=6*M6"_6C'5C[5@_UI!U9"U93]:4
    +M=65M65_6F'5FK5EOUIQU9^U9?]:@=6@M6H_6I'5I;5J?UJAU:JU:K]:L=6OM
    +M6K_6L'5L+5O/UK1U;6U;W]:X=6ZM6^_6O'5O[5O_UL!U<"U<#]?$=7%M7!_7
    +MR'5RK5POU\QU<^U6U>G]?H=7JM7J_7['5[[5Z_U_!U?"U?S]?T=7UM7]_7^'5^K5_O
    +MU_QU?^U?_]<`=H`M8`_8!':!;6`?V`AV@JU@+]@,=H/M8#_8$':$+6%/V!1V
    +MA6UA7]@8=H:M86_8'':'[6%_V"!VB"UBC]@D=HEM8I_8*':*K6*OV"QVB^UB
    +4O]@P=HPM8\_8-':-;6/?V#BVW0$`
    +`
    +end
    diff --git a/lib/libarchive/test/test_fuzz_1.iso.uu b/lib/libarchive/test/test_fuzz_1.iso.uu
    deleted file mode 100644
    index 42e9300d5932..000000000000
    --- a/lib/libarchive/test/test_fuzz_1.iso.uu
    +++ /dev/null
    @@ -1,26993 +0,0 @@
    -$FreeBSD$
    -begin 644 test_fuzz_1.iso
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M```````````!0T0P,#$!`$9R965"4T0@("`@("`@("`@("`@("`@("`@("`@
    -M("`@0T123TT@("`@("`@("`@("`@("`@("`@("`@("`@("```````````%$"
    -M``````)1```````````````````````````````````````````!```!`0``
    -M`0`("`"B"``````(HA0`````````````%@`````B`!P````````<``@`````
    -M"`!L"Q8)#`W@`@```0```0$`("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@34M)
    -M4T]&4R!)4T\@.38V,"](1E,@1DE,15-94U1%32!"54E,1$52("8@0T1214-/
    -M4D0@0T0M4B]$5D0@0U)%051/4B`H0RD@,3DY,R!%+EE/54Y'1$%,12`H0RD@
    -M,3DY-R!*+E!%05)33TXO2BY30TA)3$Q)3D<@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -M("`@("`@("`@("`R,#`X,3$R,C`Y,3(Q,S`PX#(P,#@Q,3(R,#DQ,C$S,##@
    -M,#`P,#`P,#`P,#`P,#`P,``R,#`X,3$R,C`Y,3(Q,S`PX`$`("`@("`@("`@
    -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``````````````````````````````````````````)#1#`P,0$``$8`<@!E
    -M`&4`0@!3`$0`(``@`"``(``@`"``(``@`"``0P!$`%(`3P!-`"``(``@`"``
    -M(``@`"``(``@`"``(```````````40(``````E$E+T4`````````````````
    -M``````````````````````$```$!```!``@(`'()``````ER&```````````
    -M```:`````"(`[@```````.X`"``````(`&P+%@D,#>`"```!```!`0``(``@
    -M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``
    -M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@
    -M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``
    -M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@
    -M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``
    -M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@
    -M`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``
    -M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@
    -M`"``(``@`"``(``@`"``(``@`"``30!+`$D`4P!/`$8`4P`@`$D`4P!/`"``
    -M.0`V`#8`,`!?`$@`1@!3`"``1@!)`$P`10!3`%D`4P!4`$4`30`@`$(`50!)
    -M`$P`1`!%`%(`(``F`"``0P!$`%(`10!#`$\`4@!$`"``0P!$`"T`4@!?`$0`
    -M5@!$`"``0P!2`$4`00`@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@
    -M`"``(```(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`"```"``
    -M(``@`"``(``@`"``(``@`"``(``@`"``(``@`"``(``@`#(P,#@Q,3(R,#DQ
    -M,C$S,##@,C`P.#$Q,C(P.3$R,3,P,.`P,#`P,#`P,#`P,#`P,#`P`#(P,#@Q
    -M,3(R,#DQ,C$S,##@`0`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@
    -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````````````_T-$,#`Q`0``````````````````````````````````````
    -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``````````````````````````````````````````!-2TD@4V%T($YO=B`R
    -M,B`P.3HQ,CHQ,R`R,#`X"FUK:7-O9G,@,BXP,2`M52`M4B`M2B`M;R!C9"YI
    -M`$$`
    -M`0!8````'P!!``$`4@```"``00`!`$P````A`$$``0!&````(@!!``$`0```
    -M`",`00`!`#H````D`$$``0`T````)0!!``$`+@```"8`00`!`"@````G`$$`
    -M`0#E````*`!!``$`(P```"H`00`!`-T````K`$$``0#7````+`!!``$`T0``
    -M`"T`00`!`,L````N`$$``0#%````+P!!``$`OP```#``00`!`+D````Q`$$`
    -M`0"S````,@!!``$`K0```#,`00`!`*<````T`$$``0"A````-0!!``$`FP``
    -M`#8`00`!`)4````W`$$``0"/````.`!!``$`B0```#D`00`!`(,````Z`$$`
    -M`0!]````.P!!``$`=P```#P`00`!`'$````]`$$``0!K````/@!!``$`90``
    -M`#\`00`!`%\```!``$$``0!9````00!!``$`4P```$(`00`!`$T```!#`$$`
    -M`0!'````1`!!``$`00```$4`00`!`#L```!&`$$``0`U````1P!!``$`+P``
    -M`$@`00`!`"D```!)`$$``0#F````2@!!``$`)````$L`00`!`-X```!,`$$`
    -M`0#8````30!!``$`T@```$X`00`!`,P```!/`$$``0#&````4`!!``$`P```
    -M`%$`00`!`+H```!2`$$``0"T````4P!!``$`K@```%0`00`!`*@```!5`$$`
    -M`0"B````5@!!``$`G````%<`00`!`)8```!8`$$``0"0````60!!``$`B@``
    -M`%H`00`!`(0```!;`$$``0!^````7`!!``$`>````%T`00`!`'(```!>`$$`
    -M`0!L````7P!!``$`9@```&``00`!`&````!A`$$``0!:````8@!!``$`5```
    -M`&,`00`!`$X```!D`$$``0!(````90!!``$`0@```&8`00`!`#P```!G`$$`
    -M`0`V````:`!!``$`,````&D`00`!`"H```!J`$$``0#G````:P!!``$`)0``
    -M`&P`00`!`-\```!M`$$``0#9````;@!!``$`TP```&\`00`!`,T```!P`$$`
    -M`0#'````<0!!``$`P0```'(`00`!`+L```!S`$$``0"U````=`!!``$`KP``
    -M`'4`00`!`*D```!V`$$``0"C````=P!!``$`G0```'@`00`!`)<```!Y`$$`
    -M`0"1````>@!!``$`BP```'L`00`!`(4```!\`$$``0!_````?0!!``$`>0``
    -M`'X`00`!`',```!_`$$``0!M````@`!!``$`9P```($`00`!`&$```""`$$`
    -M`0!;````@P!!``$`50```(0`00`!`$\```"%`$$``0!)````A@!!``$`0P``
    -M`(<`00`!`#T```"(`$$``0`W````B0!!``$`,0```(H`00`!`"L```"+`$$`
    -M`0#H````C`!!``$`)@```(T`00`!`.````".`$$``0#:````CP!!``$`U```
    -M`)``00`!`,X```"1`$$``0#(````D@!!``$`P@```),`00`!`+P```"4`$$`
    -M`0"V````E0!!``$`L````)8`00`!`*H```"7`$$``0"D````F`!!``$`G@``
    -M`)D`00`!`)@```":`$$``0"2````FP!!``$`C````)P`00`!`(8```"=`$$`
    -M`0"`````G@!!``$`>@```)\`00`!`'0```"@`$$``0!N````H0!!``$`:```
    -M`*(`00`!`&(```"C`$$``0!<````I`!!``$`5@```*4`00`!`%````"F`$$`
    -M`0!*````IP!!``$`1````*@`00`!`#X```"I`$$``0`X````J@!!``$`,@``
    -M`*L`00`!`"P```"L`$$`````````````````````````````````````````
    -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```````````````!`````!P``0```0````#B``%!`!\`````Z0`!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!00`(`````!X``7)R7VUO=F5D`0``
    -M``#C``)!`!\`````ZP`#04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M00`!`````"$`!$$`!`````#A``1!,#`P!`````#;``1!,#`Q!`````#5``1!
    -M,#`R!`````#/``1!,#`S!`````#)``1!,#`T!`````##``1!,#`U!`````"]
    -M``1!,#`V!`````"W``1!,#`W!`````"Q``1!,#`X!`````"K``1!,#`Y!```
    -M``"E``1!,#!!!`````"?``1!,#!"!`````"9``1!,#!#!`````"3``1!,#!$
    -M!`````"-``1!,#!%!`````"'``1!,#!&!`````"!``1!,#!'!`````![``1!
    -M,#!(!`````!U``1!,#!)!`````!O``1!,#!*!`````!I``1!,#!+!`````!C
    -M``1!,#!,!`````!=``1!,#!-!`````!7``1!,#!.!`````!1``1!,#!/!```
    -M``!+``1!,#!0!`````!%``1!,#!1!``````_``1!,#!2!``````Y``1!,#!3
    -M!``````S``1!,#!4!``````M``1!,#!5!``````G``1!,#!6`0````#D``5!
    -M`!\`````[0`&04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!00`!````
    -M`"(`!T$``0````#<``E!``$`````U@`*00`!`````-``"T$``0````#*``Q!
    -M``$`````Q``-00`!`````+X`#D$``0````"X``]!``$`````L@`000`!````
    -M`*P`$4$``0````"F`!)!``$`````H``300`!`````)H`%$$``0````"4`!5!
    -M``$`````C@`600`!`````(@`%T$``0````""`!A!``$`````?``900`!````
    -M`'8`&D$``0````!P`!M!``$`````:@`<00`!`````&0`'4$``0````!>`!Y!
    -M``$`````6``?00`!`````%(`($$``0````!,`"%!``$`````1@`B00`!````
    -M`$``(T$``0`````Z`"1!``$`````-``E00`!`````"X`)D$``0`````H`"=!
    -M``$`````Y0`H00`!`````",`*D$``0````#=`"M!``$`````UP`L00`!````
    -M`-$`+4$``0````#+`"Y!``$`````Q0`O00`!`````+\`,$$``0````"Y`#%!
    -M``$`````LP`R00`!`````*T`,T$``0````"G`#1!``$`````H0`U00`!````
    -M`)L`-D$``0````"5`#=!``$`````CP`X00`!`````(D`.4$``0````"#`#I!
    -M``$`````?0`[00`!`````'<`/$$``0````!Q`#U!``$`````:P`^00`!````
    -M`&4`/T$``0````!?`$!!``$`````60!!00`!`````%,`0D$``0````!-`$-!
    -M``$`````1P!$00`!`````$$`14$``0`````[`$9!``$`````-0!'00`!````
    -M`"\`2$$``0`````I`$E!``$`````Y@!*00`!`````"0`2T$``0````#>`$Q!
    -M``$`````V`!-00`!`````-(`3D$``0````#,`$]!``$`````Q@!000`!````
    -M`,``44$``0````"Z`%)!``$`````M`!300`!`````*X`5$$``0````"H`%5!
    -M``$`````H@!600`!`````)P`5T$``0````"6`%A!``$`````D`!900`!````
    -M`(H`6D$``0````"$`%M!``$`````?@!<00`!`````'@`74$``0````!R`%Y!
    -M``$`````;`!?00`!`````&8`8$$``0````!@`&%!``$`````6@!B00`!````
    -M`%0`8T$``0````!.`&1!``$`````2`!E00`!`````$(`9D$``0`````\`&=!
    -M``$`````-@!H00`!`````#``:4$``0`````J`&I!``$`````YP!K00`!````
    -M`"4`;$$``0````#?`&U!``$`````V0!N00`!`````-,`;T$``0````#-`'!!
    -M``$`````QP!Q00`!`````,$`$$``0````"7`'E!
    -M``$`````D0!Z00`!`````(L`>T$``0````"%`'Q!``$`````?P!]00`!````
    -M`'D`?D$``0````!S`']!``$`````;0"`00`!`````&<`@4$``0````!A`()!
    -M``$`````6P"#00`!`````%4`A$$``0````!/`(5!``$`````20"&00`!````
    -M`$,`AT$``0`````]`(A!``$`````-P")00`!`````#$`BD$``0`````K`(M!
    -M``$`````Z`",00`!`````"8`C4$``0````#@`(Y!``$`````V@"/00`!````
    -M`-0`D$$``0````#.`)%!``$`````R`"200`!`````,(`DT$``0````"\`)1!
    -M``$`````M@"500`!`````+``ED$``0````"J`)=!``$`````I`"800`!````
    -M`)X`F4$``0````"8`)I!``$`````D@";00`!`````(P`G$$``0````"&`)U!
    -M``$`````@`">00`!`````'H`GT$``0````!T`*!!``$`````;@"A00`!````
    -M`&@`HD$``0````!B`*-!``$`````7`"D00`!`````%8`I4$``0````!0`*9!
    -M``$`````2@"G00`!`````$0`J$$``0`````^`*E!``$`````.`"J00`!````
    -M`#(`JT$``0`````L`*Q!````````````````````````````````````````
    -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`````````````````0#N`````0````(`L`$```$``$&``+```00(`70$``'D``$$"`%X!``!Z``!!
    -M`@!?`0``>P``00(`8`$``'P``$$"`&$!``!]``!!`@!B`0``?@``00(`8P$`
    -M`'\``$$"`&0!``"```!!`@!E`0``@0``00(`9@$``((``$$"`&`$``)0``$$"`'D!``"5``!!
    -M`@!Z`0``E@``00(`>P$``)<``$$"`'P!``"8``!!`@!]`0``F0``00(`?@$`
    -M`)H``$$"`'\!``";``!!`@"``0``G```00(`@0$``)T``$$"`((!``">``!!
    -M`@"#`0``GP``00(`A`$``*```$$"`(4!``"A``!!`@"&`0``H@``00(`AP$`
    -M`*,``$$"`(@!``"D``!!`@")`0``I0``00(`B@$``*8``$$"`(L!``"G``!!
    -M`@",`0``J```00(`C0$``*D``$$"`(X!``"J``!!`@"/`0``JP``00(`D`$`
    -M`*P``$$"`)$!``"M``!!`@"2`0``K@``00(`DP$``*\``$$"`)0!``"P``!!
    -M`@"5`0``L0``00(`E@$``+(``$$"`)`0``N@``00(`GP$``+L``$$"`*`!``"\``!!`@"A`0``O0``00(`H@$`
    -M`+X``$$"`*,!``"_``!!`@"D`0``P```00(`I0$``,$``$$"`*8!``#"``!!
    -M`@"G`0``PP``00(`J`$``,0``$$"`*D!``#%``!!`@"J`0``Q@``00(`JP$`
    -M`,<``$$"`*P!``#(``!!`@"M`0``R0``00(`K@$``,H``$$"`*\!``#+``!!
    -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``````````````````$`````[@`!```"`````;```0!!@`````&W``$`00!!
    -M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`
    -M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!
    -M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00(````!L0`"`$&`
    -M`````;@``P!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!
    -M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`
    -M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!
    -M`@````&R``0`08`````!N0`%`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`
    -M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!
    -M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`
    -M00!!`$$`00!!`$$"`````;,`!@!!`@````&T``@`00(````!M0`)`$$"````
    -M`;8`"@!!`@````#O``L`00(`````\``,`$$"`````/$`#0!!`@````#R``X`
    -M00(`````\P`/`$$"`````/0`$`!!`@````#U`!$`00(`````]@`2`$$"````
    -M`/<`$P!!`@````#X`!0`00(`````^0`5`$$"`````/H`%@!!`@````#[`!<`
    -M00(`````_``8`$$"`````/T`&0!!`@````#^`!H`00(`````_P`;`$$"````
    -M`0``'`!!`@````$!`!T`00(````!`@`>`$$"`````0,`'P!!`@````$$`"``
    -M00(````!!0`A`$$"`````08`(@!!`@````$'`",`00(````!"``D`$$"````
    -M`0D`)0!!`@````$*`"8`00(````!"P`G`$$"`````0P`*`!!`@````$-`"D`
    -M00(````!#@`J`$$"`````0\`*P!!`@````$0`"P`00(````!$0`M`$$"````
    -M`1(`+@!!`@````$3`"\`00(````!%``P`$$"`````14`,0!!`@````$6`#(`
    -M00(````!%P`S`$$"`````1@`-`!!`@````$9`#4`00(````!&@`V`$$"````
    -M`1L`-P!!`@````$<`#@`00(````!'0`Y`$$"`````1X`.@!!`@````$?`#L`
    -M00(````!(``\`$$"`````2$`/0!!`@````$B`#X`00(````!(P`_`$$"````
    -M`20`0`!!`@````$E`$$`00(````!)@!"`$$"`````2<`0P!!`@````$H`$0`
    -M00(````!*0!%`$$"`````2H`1@!!`@````$K`$<`00(````!+`!(`$$"````
    -M`2T`20!!`@````$N`$H`00(````!+P!+`$$"`````3``3`!!`@````$Q`$T`
    -M00(````!,@!.`$$"`````3,`3P!!`@````$T`%``00(````!-0!1`$$"````
    -M`38`4@!!`@````$W`%,`00(````!.`!4`$$"`````3D`50!!`@````$Z`%8`
    -M00(````!.P!7`$$"`````3P`6`!!`@````$]`%D`00(````!/@!:`$$"````
    -M`3\`6P!!`@````%``%P`00(````!00!=`$$"`````4(`7@!!`@````%#`%\`
    -M00(````!1`!@`$$"`````44`80!!`@````%&`&(`00(````!1P!C`$$"````
    -M`4@`9`!!`@````%)`&4`00(````!2@!F`$$"`````4L`9P!!`@````%,`&@`
    -M00(````!30!I`$$"`````4X`:@!!`@````%/`&L`00(````!4`!L`$$"````
    -M`5$`;0!!`@````%2`&X`00(````!4P!O`$$"`````50`<`!!`@````%5`'$`
    -M00(````!5@!R`$$"`````5<`0!!`@````%>`'H`
    -M00(````!7P![`$$"`````6``?`!!`@````%A`'T`00(````!8@!^`$$"````
    -M`6,`?P!!`@````%D`(``00(````!90"!`$$"`````68`@@!!`@````%G`(,`
    -M00(````!:`"$`$$"`````6D`A0!!`@````%J`(8`00(````!:P"'`$$"````
    -M`6P`B`!!`@````%M`(D`00(````!;@"*`$$"`````6\`BP!!`@````%P`(P`
    -M00(````!<0"-`$$"`````7(`C@!!`@````%S`(\`00(````!=`"0`$$"````
    -M`74`D0!!`@````%V`)(`00(````!=P"3`$$"`````7@`E`!!`@````%Y`)4`
    -M00(````!>@"6`$$"`````7L`EP!!`@````%\`)@`00(````!?0"9`$$"````
    -M`7X`F@!!`@````%_`)L`00(````!@`"<`$$"`````8$`G0!!`@````&"`)X`
    -M00(````!@P"?`$$"`````80`H`!!`@````&%`*$`00(````!A@"B`$$"````
    -M`8<`HP!!`@````&(`*0`00(````!B0"E`$$"`````8H`I@!!`@````&+`*<`
    -M00(````!C`"H`$$"`````8T`J0!!`@````&.`*H`00(````!CP"K`$$"````
    -M`9``K`!!`@````&1`*T`00(````!D@"N`$$"`````9,`KP!!`@````&4`+``
    -M00(````!E0"Q`$$"`````98`L@!!`@````&7`+,`00(````!F`"T`$$"````
    -M`9D`M0!!`@````&:`+8`00(````!FP"W`$$"`````9P`N`!!`@````&=`+D`
    -M00(````!G@"Z`$$"`````9\`NP!!`@````&@`+P`00(````!H0"]`$$"````
    -M`:(`O@!!`@````&C`+\`00(````!I`#``$$"`````:4`P0!!`@````&F`,(`
    -M00(````!IP##`$$"`````:@`Q`!!`@````&I`,4`00(````!J@#&`$$"````
    -M`:L`QP!!`@````&L`,@`00(````!K0#)`$$"`````:X`R@!!`@````&O`,L`
    -M00``````````````````````````````````````````````````````````
    -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``````````````````"(`!P````````<``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`4U`'`;[O`%)2!0&!4%@D`>U!`````$'M!0````````7H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!#11P!N@$``````;H`
    -M`````````.T```````#M9@`<````````'``(``````@`;`L6"0P-X`(```$`
    -M``$!`5)2!0&!4%@D`>U!`````$'M!0````````7H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#B````````X@`(``````@`
    -M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M^`#I````````Z0`(``````@`;`L6"0P-X`(```$```$?04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!05)2!0&)3DV7`0%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04-%'`$=
    -M````````'0``````````L````````+!Z`!X````````>`!@`````&`!L"Q8)
    -M#`W@`@```0```0AR!L"Q8)
    -M#`W@;`L6"0P-X```````````````````````````````````````````````
    -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`````````````````````````````````````````````````$Y-<@$`04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!05!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````
    -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````````````````````9@`>````````'@`8`````!@`;`L6"0P-X`(```$`
    -M``$!`%)2!0&!4%@D`6U!`````$%M(P```````"/H`P`````#Z.@#``````/H
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`<````````'``(``````@`
    -M;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M!0````````7H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<``A````
    -M````(0`(``````@`;`L6"0P-X`(```$```$!05)2!0')3DT&`0!!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>!2100!`'0`X0```````.$`"``````(`&P+%@D,#>`"```!
    -M```!!$$P,#``4E(%`T"`````````N@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`#;
    -M````````VP`(``````@`;`L6"0P-X`(```$```$$03`P,0!24@4!R4Y-!@$`
    -M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`-4```````#5``@`````"`!L"Q8)
    -M#`W@`@```0```01!,#`R`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2
    -M100!`'0`SP```````,\`"``````(`&P+%@D,#>`"```!```!!$$P,#,`4E(%
    -M`T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`#)````````R0`(````
    -M``@`;`L6"0P-X`(```$```$$03`P-`!24@4!R4Y-!@$`05!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@4D4$`0!T`,,```````##``@`````"`!L"Q8)#`W@`@```0```01!
    -M,#`U`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`O0``````
    -M`+T`"``````(`&P+%@D,#>`"```!```!!$$P,#8`4E(%`T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X%)%!`$`=`"W````````MP`(``````@`;`L6"0P-X`(`
    -M``$```$$03`P-P!24@4!R4Y-!@$`05!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T
    -M`+$```````"Q``@`````"`!L"Q8)#`W@`@```0```01!,#`X`%)2!0')3DT&
    -M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`JP```````*L`"``````(`&P+
    -M%@D,#>`"```!```!!$$P,#D`4E(%`T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX%)%!`$`=`"E````````I0`(``````@`;`L6"0P-X`(```$```$$03`P00!2
    -M4@4!R4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`)\```````"?``@`
    -M````"`!L"Q8)#`W@`@```0```01!,#!"`%)2!0')3DT&`0!!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>!2100!`'0`F0```````)D`"``````(`&P+%@D,#>`"```!```!
    -M!$$P,$,`4E(%`T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`"3````
    -M````DP`(``````@`;`L6"0P-X`(```$```$$03`P1`!24@4!R4Y-!@$`05!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@4D4$`0``````````````````````````````````
    -M````````````````````````````````````````````````````````````
    -M``````````````````````````````````````````````````!T`(T`````
    -M``"-``@`````"`!L"Q8)#`W@`@```0```01!,#!%`%)2!0')3DT&`0!!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>!2100!`'0`AP```````(<`"``````(`&P+%@D,#>`"
    -M```!```!!$$P,$8`4E(%`T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`
    -M=`"!````````@0`(``````@`;`L6"0P-X`(```$```$$03`P1P!24@4!R4Y-
    -M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`'L```````![``@`````"`!L
    -M"Q8)#`W@`@```0```01!,#!(`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>!2100!`'0`=0```````'4`"``````(`&P+%@D,#>`"```!```!!$$P,$D`
    -M4E(%`T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`!O````````;P`(
    -M``````@`;`L6"0P-X`(```$```$$03`P2@!24@4!R4Y-!@$`05!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@4D4$`0!T`&D```````!I``@`````"`!L"Q8)#`W@`@```0``
    -M`01!,#!+`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`8P``
    -M`````&,`"``````(`&P+%@D,#>`"```!```!!$$P,$P`4E(%`T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=`!=````````70`(``````@`;`L6"0P-
    -MX`(```$```$$03`P30!24@4!R4Y-!@$`05!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$
    -M`0!T`%<```````!7``@`````"`!L"Q8)#`W@`@```0```01!,#!.`%)2!0')
    -M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2100!`'0`40```````%$`"``````(
    -M`&P+%@D,#>`"```!```!!$$P,$\`4E(%`T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X%)%!`$`=`!+````````2P`(``````@`;`L6"0P-X`(```$```$$03`P
    -M4`!24@4!R4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`$4```````!%
    -M``@`````"`!L"Q8)#`W@`@```0```01!,#!1`%)2!0')3DT&`0!!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>!2100!`'0`/P```````#\`"``````(`&P+%@D,#>`"```!
    -M```!!$$P,%(`4E(%`T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`=``Y
    -M````````.0`(``````@`;`L6"0P-X`(```$```$$03`P4P!24@4!R4Y-!@$`
    -M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@4D4$`0!T`#,````````S``@`````"`!L"Q8)
    -M#`W@`@```0```01!,#!4`%)2!0')3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!2
    -M100!`'0`+0```````"T`"``````(`&P+%@D,#>`"```!```!!$$P,%4`4E(%
    -M`T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`````````````````````
    -M````````````````````````````````````````````````````````````
    -M`````````````````````'0`)P```````"<`"``````(`&P+%@D,#>`"```!
    -M```!!$$P,%8`4E(%`T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X%)%!`$`````
    -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````````````````````````````````````````````````````9@`A````
    -M````(0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A
    -M4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>!03`P!Z````````.@`;``B````````(@`(````
    -M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -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``````````````````````!F`"(````````B``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`"$````````A``@`````
    -M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`",`
    -M```````C``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X```````````````````````````````````````````
    -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`````````````````````````````````````````````````````&8`(P``
    -M`````",`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`&8`(@```````"(`"``````(`&P+%@D,#>`"```!```!`0%24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`&P`)````````"0`"``````(`&P+%@D,#>`"
    -M```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````
    -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````````````````````````9@`D````````)``(``````@`;`L6"0P-X`(`
    -M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`C````````(P`(````
    -M``@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;``E
    -M````````)0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``````````````````````````````````````````
    -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``````````````````````````````````````````````````````!F`"4`
    -M```````E``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!F`"0````````D``@`````"`!L"Q8)#`W@`@```0```0$!4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`"8````````F``@`````"`!L"Q8)#`W@
    -M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````
    -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`````````````````````````&8`)@```````"8`"``````(`&P+%@D,#>`"
    -M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`)0```````"4`"```
    -M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`
    -MNP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@0TP,`2<````````G````````````````````````
    -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````````````````````````````````````````````````````````9@`G
    -M````````)P`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2
    -M!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!)@```````"8`;``H````````*``(
    -M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``````````````````````````````````````````````````````
    -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``````````````````````````!F`"@````````H``@`````"`!L"Q8)#`W@
    -M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`"<````````G``@`
    -M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L
    -M`"D````````I``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````````
    -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`````````````````````````````````````````````````````````&8`
    -M*0```````"D`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`&8`*````````"@`"``````(`&P+%@D,#>`"```!```!`0%2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`*@```````"H`"``````(`&P+%@D,
    -M#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````
    -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````````````````````````````9@`J````````*@`(``````@`;`L6"0P-
    -MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`I````````*0`(
    -M``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M;``K````````*P`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````````
    -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``````````````````````````````````````````````````````````!F
    -M`"L````````K``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!F`"H````````J``@`````"`!L"Q8)#`W@`@```0```0$!
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`"P````````L``@`````"`!L"Q8)
    -M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````
    -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`````````````````````````````&8`+````````"P`"``````(`&P+%@D,
    -M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`*P```````"L`
    -M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`
    -M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`2T````````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````````````````````````````````````````````````````````````
    -M9@`M````````+0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!
    -M`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!+````````"P`;``N````````
    -M+@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``````````````````````````````````````````````````
    -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``````````````````````````````!F`"X````````N``@`````"`!L"Q8)
    -M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`"T````````M
    -M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!L`"\````````O``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!
    -M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````
    -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`&8`+P```````"\`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`&8`+@```````"X`"``````(`&P+%@D,#>`"```!```!
    -M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`,````````#``"``````(`&P+
    -M%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````
    -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````````````````````````````````9@`P````````,``(``````@`;`L6
    -M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`O````````
    -M+P`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>``;``Q````````,0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&
    -M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````
    -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``!F`#$````````Q``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!F`#`````````P``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`#(````````R``@`````"`!L
    -M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```
    -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`````````````````````````````````&8`,@```````#(`"``````(`&P+
    -M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`,0``````
    -M`#$`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-
    -M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`3,````````S````````````````
    -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````9@`S````````,P`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$`
    -M``$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!,@```````#(`;``T````
    -M````-``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``````````````````````````````````````````````
    -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``````````````````````````````````!F`#0````````T``@`````"`!L
    -M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`#,`````
    -M```S``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!L`#4````````U``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.
    -M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````
    -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`````&8`-0```````#4`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`&8`-````````#0`"``````(`&P+%@D,#>`"```!
    -M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`-@```````#8`"``````(
    -M`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -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````````````````````````````````````9@`V````````-@`(``````@`
    -M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`U````
    -M````-0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``;``W````````-P`(``````@`;`L6"0P-X`(```$```$!05)2!0&)
    -M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````
    -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``````!F`#<````````W``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!F`#8````````V``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`#@````````X``@`````
    -M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX```````````````````````````````````````````````````````````
    -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`````````````````````````````````````&8`.````````#@`"``````(
    -M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`-P``
    -M`````#<`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!
    -MF4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`3D````````Y````````````
    -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````````9@`Y````````.0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(`
    -M``$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!.````````#@`;``Z
    -M````````.@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``````````````````````````````````````````
    -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``````````````````````````````````````!F`#H````````Z``@`````
    -M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`#D`
    -M```````Y``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!L`#L````````[``@`````"`!L"Q8)#`W@`@```0```0%!4E(%
    -M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````
    -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`````````&8`.P```````#L`"``````(`&P+%@D,#>`"```!```!`0!24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`.@```````#H`"``````(`&P+%@D,#>`"
    -M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`/````````#P`"```
    -M```(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@````````````````````````````````````````````````````````
    -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````````````````````````````````````````9@`\````````/``(````
    -M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@`[
    -M````````.P`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``;``]````````/0`(``````@`;`L6"0P-X`(```$```$!05)2
    -M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````
    -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``````````!F`#T````````]``@`````"`!L"Q8)#`W@`@```0```0$`4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`#P````````\``@`````"`!L"Q8)#`W@
    -M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`#X````````^``@`
    -M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X```````````````````````````````````````````````````````
    -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`````````````````````````````````````````&8`/@```````#X`"```
    -M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`
    -M/0```````#T`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%2
    -M4@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`3\````````_````````
    -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````````````9@`_````````/P`(``````@`;`L6"0P-X`(```$```$!`%)2
    -M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-
    -MX`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!/@```````#X`
    -M;`!`````````0``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````````
    -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``````````````````````````````````````````!F`$````````!```@`
    -M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F
    -M`#\````````_``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!L`$$```````!!``@`````"`!L"Q8)#`W@`@```0```0%!
    -M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````
    -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`````````````&8`00```````$$`"``````(`&P+%@D,#>`"```!```!`0!2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`0````````$``"``````(`&P+%@D,
    -M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`0@```````$(`
    -M"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@````````````````````````````````````````````````````
    -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````````````````````````````````````````````9@!"````````0@`(
    -M``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M9@!!````````00`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``;`!#````````0P`(``````@`;`L6"0P-X`(```$```$!
    -M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````
    -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``````````````!F`$,```````!#``@`````"`!L"Q8)#`W@`@```0```0$`
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`$(```````!"``@`````"`!L"Q8)
    -M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`$0```````!$
    -M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X```````````````````````````````````````````````````
    -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`````````````````````````````````````````````&8`1````````$0`
    -M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`&8`0P```````$,`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!
    -M`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`44```````!%````
    -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````````````````9@!%````````10`(``````@`;`L6"0P-X`(```$```$!
    -M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6
    -M"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!1```````
    -M`$0`;`!&````````1@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&
    -M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````
    -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``````````````````````````````````````````````!F`$8```````!&
    -M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!F`$4```````!%``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!L`$<```````!'``@`````"`!L"Q8)#`W@`@```0``
    -M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````
    -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`````````````````&8`1P```````$<`"``````(`&P+%@D,#>`"```!```!
    -M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`1@```````$8`"``````(`&P+
    -M%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`2```````
    -M`$@`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@````````````````````````````````````````````````
    -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````````````````````````````````````````````````9@!(````````
    -M2``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>``9@!'````````1P`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``;`!)````````20`(``````@`;`L6"0P-X`(```$`
    -M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````
    -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``````````````````!F`$D```````!)``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`$@```````!(``@`````"`!L
    -M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`$H`````
    -M``!*``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X```````````````````````````````````````````````
    -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`````````````````````````````````````````````````&8`2@``````
    -M`$H`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`&8`20```````$D`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!
    -M```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`4L```````!+
    -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````````````````````9@!+````````2P`(``````@`;`L6"0P-X`(```$`
    -M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`
    -M;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!2@``
    -M`````$H`;`!,````````3``(``````@`;`L6"0P-X`(```$```$!05)2!0&)
    -M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````
    -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``````````````````````````````````````````````````!F`$P`````
    -M``!,``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!F`$L```````!+``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!L`$T```````!-``@`````"`!L"Q8)#`W@`@``
    -M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````
    -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`````````````````````&8`30```````$T`"``````(`&P+%@D,#>`"```!
    -M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`3````````$P`"``````(
    -M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`3@``
    -M`````$X`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@````````````````````````````````````````````
    -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````````````````````````````````````````````````````9@!.````
    -M````3@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``9@!-````````30`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``;`!/````````3P`(``````@`;`L6"0P-X`(`
    -M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````
    -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``````````````````````!F`$\```````!/``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`$X```````!.``@`````
    -M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%``
    -M``````!0``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X```````````````````````````````````````````
    -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`````````````````````````````````````````````````````&8`4```
    -M`````%``"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`&8`3P```````$\`"``````(`&P+%@D,#>`"```!```!`0%24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>``
    -M```!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`5$`````
    -M``!1````````````````````````````````````````````````````````
    -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````````````````````````9@!1````````40`(``````@`;`L6"0P-X`(`
    -M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8````
    -M`!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!
    -M4````````%``;`!2````````4@`(``````@`;`L6"0P-X`(```$```$!05)2
    -M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````
    -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``````````````````````````````````````````````````````!F`%(`
    -M``````!2``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!F`%$```````!1``@`````"`!L"Q8)#`W@`@```0```0$!4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%,```````!3``@`````"`!L"Q8)#`W@
    -M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````
    -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`````````````````````````&8`4P```````%,`"``````(`&P+%@D,#>`"
    -M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`4@```````%(`"```
    -M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`
    -M5````````%0`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@````````````````````````````````````````
    -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````````````````````````````````````````````````````````9@!4
    -M````````5``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``9@!3````````4P`(``````@`;`L6"0P-X`(```$```$!`5)2
    -M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!5````````50`(``````@`;`L6"0P-
    -MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````
    -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``````````````````````````!F`%4```````!5``@`````"`!L"Q8)#`W@
    -M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`%0```````!4``@`
    -M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L
    -M`%8```````!6``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````````
    -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`````````````````````````````````````````````````````````&8`
    -M5@```````%8`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`&8`50```````%4`"``````(`&P+%@D,#>`"```!```!`0%2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,
    -M#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`5<`
    -M``````!7````````````````````````````````````````````````````
    -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````````````````````````````9@!7````````5P`(``````@`;`L6"0P-
    -MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8
    -M`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P``````
    -M`"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!0
    -M3`P!5@```````%8`;`!8````````6``(``````@`;`L6"0P-X`(```$```$!
    -M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````
    -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``````````````````````````````````````````````````````````!F
    -M`%@```````!8``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!F`%<```````!7``@`````"`!L"Q8)#`W@`@```0```0$!
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%D```````!9``@`````"`!L"Q8)
    -M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````
    -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`````````````````````````````&8`60```````%D`"``````(`&P+%@D,
    -M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`6````````%@`
    -M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`&P`6@```````%H`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`
    -M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -M9@!:````````6@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``9@!9````````60`(``````@`;`L6"0P-X`(```$```$!
    -M`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!;````````6P`(``````@`;`L6
    -M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````
    -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``````````````````````````````!F`%L```````!;``@`````"`!L"Q8)
    -M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`%H```````!:
    -M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!L`%P```````!<``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!
    -M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````
    -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`&8`7````````%P`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`&8`6P```````%L`"``````(`&P+%@D,#>`"```!```!
    -M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+
    -M%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,
    -M`5T```````!=````````````````````````````````````````````````
    -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````````````````````````````````9@!=````````70`(``````@`;`L6
    -M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````
    -M'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P``
    -M`````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>!03`P!7````````%P`;`!>````````7@`(``````@`;`L6"0P-X`(```$`
    -M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````
    -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``!F`%X```````!>``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!F`%T```````!=``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`%\```````!?``@`````"`!L
    -M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```
    -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`````````````````````````````````&8`7P```````%\`"``````(`&P+
    -M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`7@``````
    -M`%X`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`&P`8````````&``"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-
    -M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````````
    -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````9@!@````````8``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``9@!?````````7P`(``````@`;`L6"0P-X`(```$`
    -M``$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!A````````80`(``````@`
    -M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -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``````````````````````````````````!F`&$```````!A``@`````"`!L
    -M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&``````
    -M``!@``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!L`&(```````!B``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.
    -M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````
    -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`````&8`8@```````&(`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`&8`80```````&$`"``````(`&P+%@D,#>`"```!
    -M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L`````````
    -M`&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M0TP,`6,```````!C````````````````````````````````````````````
    -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````````````````````````````````````9@!C````````8P`(``````@`
    -M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````
    -M````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M
    -M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>!03`P!8@```````&(`;`!D````````9``(``````@`;`L6"0P-X`(`
    -M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````
    -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``````!F`&0```````!D``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!F`&,```````!C``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`&4```````!E``@`````
    -M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX```````````````````````````````````````````````````````````
    -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`````````````````````````````````````&8`90```````&4`"``````(
    -M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`9```
    -M`````&0`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`&P`9@```````&8`"``````(`&P+%@D,#>`"```!```!`4%24@4!
    -MB4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````
    -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````````9@!F````````9@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``9@!E````````90`(``````@`;`L6"0P-X`(`
    -M``$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!G````````9P`(````
    -M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -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``````````````````````````````````````!F`&<```````!G``@`````
    -M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&8`
    -M``````!F``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!L`&@```````!H``@`````"`!L"Q8)#`W@`@```0```0%!4E(%
    -M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````
    -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`````````&8`:````````&@`"``````(`&P+%@D,#>`"```!```!`0!24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`9P```````&<`"``````(`&P+%@D,#>`"
    -M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L`````
    -M`````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@0TP,`6D```````!I````````````````````````````````````````
    -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````````````````````````````````````````9@!I````````:0`(````
    -M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>
    -M````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!````
    -M`$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>!03`P!:````````&@`;`!J````````:@`(``````@`;`L6"0P-
    -MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````
    -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``````````!F`&H```````!J``@`````"`!L"Q8)#`W@`@```0```0$`4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&D```````!I``@`````"`!L"Q8)#`W@
    -M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`&L```````!K``@`
    -M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X```````````````````````````````````````````````````````
    -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`````````````````````````````````````````&8`:P```````&L`"```
    -M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`
    -M:@```````&H`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`&P`;````````&P`"``````(`&P+%@D,#>`"```!```!`4%2
    -M4@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````
    -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````````````9@!L````````;``(``````@`;`L6"0P-X`(```$```$!`%)2
    -M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!K````````:P`(``````@`;`L6"0P-
    -MX`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!M````````;0`(
    -M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``````````````````````````````````````````````````````
    -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``````````````````````````````````````````!F`&T```````!M``@`
    -M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F
    -M`&P```````!L``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!L`&X```````!N``@`````"`!L"Q8)#`W@`@```0```0%!
    -M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````
    -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`````````````&8`;@```````&X`"``````(`&P+%@D,#>`"```!```!`0!2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`;0```````&T`"``````(`&P+%@D,
    -M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L`
    -M`````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@0TP,`6\```````!O````````````````````````````````````
    -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````````````````````````````````````````````9@!O````````;P`(
    -M``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!
    -M`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>!03`P!;@```````&X`;`!P````````<``(``````@`;`L6
    -M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````
    -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``````````````!F`'````````!P``@`````"`!L"Q8)#`W@`@```0```0$`
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`&\```````!O``@`````"`!L"Q8)
    -M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`'$```````!Q
    -M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X```````````````````````````````````````````````````
    -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`````````````````````````````````````````````&8`<0```````'$`
    -M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`&8`<````````'``"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`&P`<@```````'(`"``````(`&P+%@D,#>`"```!```!
    -M`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````
    -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````````````````9@!R````````<@`(``````@`;`L6"0P-X`(```$```$!
    -M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!Q````````<0`(``````@`;`L6
    -M"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!S````````
    -MU!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``````````````````````````````````````````````````
    -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``````````````````````````````````````````````!F`',```````!S
    -M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!F`'(```````!R``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!L`'0```````!T``@`````"`!L"Q8)#`W@`@```0``
    -M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````
    -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`````````````````&8`=````````'0`"``````(`&P+%@D,#>`"```!```!
    -M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8``"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$`````
    -M`;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@0TP,`74```````!U````````````````````````````````
    -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````````````````````````````````````````````````9@!U````````
    -M=0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D
    -M`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>!03`P!=````````'0`;`!V````````=@`(``````@`
    -M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -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``````````````````!F`'8```````!V``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`'4```````!U``@`````"`!L
    -M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`'<`````
    -M``!W``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X```````````````````````````````````````````````
    -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`````````````````````````````````````````````````&8`=P``````
    -M`'<`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`&8`=@```````'8`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`&P`>````````'@`"``````(`&P+%@D,#>`"```!
    -M```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````
    -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````````````````````9@!X````````>``(``````@`;`L6"0P-X`(```$`
    -M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!W````````=P`(``````@`
    -M;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!Y````
    -M````>0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``````````````````````````````````````````````
    -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``````````````````````````````````````````````````!F`'D`````
    -M``!Y``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!F`'@```````!X``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!L`'H```````!Z``@`````"`!L"Q8)#`W@`@``
    -M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````
    -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`````````````````````&8`>@```````'H`"``````(`&P+%@D,#>`"```!
    -M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`>0```````'D`"``````(
    -M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$`
    -M`````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@0TP,`7L```````![````````````````````````````
    -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````````````````````````````````````````````````````9@![````
    -M````>P`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A
    -M4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>!03`P!>@```````'H`;`!\````````?``(````
    -M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -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``````````````````````!F`'P```````!\``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`'L```````![``@`````
    -M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`'T`
    -M``````!]``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X```````````````````````````````````````````
    -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`````````````````````````````````````````````````````&8`?0``
    -M`````'T`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`&8`?````````'P`"``````(`&P+%@D,#>`"```!```!`0%24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`&P`?@```````'X`"``````(`&P+%@D,#>`"
    -M```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````
    -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````````````````````````9@!^````````?@`(``````@`;`L6"0P-X`(`
    -M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@!]````````?0`(````
    -M``@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`!_
    -M````````?P`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``````````````````````````````````````````
    -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``````````````````````````````````````````````````````!F`'\`
    -M``````!_``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!F`'X```````!^``@`````"`!L"Q8)#`W@`@```0```0$!4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`(````````"```@`````"`!L"Q8)#`W@
    -M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````
    -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`````````````````````````&8`@````````(``"``````(`&P+%@D,#>`"
    -M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`?P```````'\`"```
    -M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`
    -MNP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@0TP,`8$```````"!````````````````````````
    -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````````````````````````````````````````````````````````9@"!
    -M````````@0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2
    -M!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!@````````(``;`""````````@@`(
    -M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``````````````````````````````````````````````````````
    -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``````````````````````````!F`((```````""``@`````"`!L"Q8)#`W@
    -M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`($```````"!``@`
    -M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L
    -M`(,```````"#``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````````
    -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`````````````````````````````````````````````````````````&8`
    -M@P```````(,`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`&8`@@```````((`"``````(`&P+%@D,#>`"```!```!`0%2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`A````````(0`"``````(`&P+%@D,
    -M#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````
    -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````````````````````````````9@"$````````A``(``````@`;`L6"0P-
    -MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@"#````````@P`(
    -M``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M;`"%````````A0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````````
    -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``````````````````````````````````````````````````````````!F
    -M`(4```````"%``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!F`(0```````"$``@`````"`!L"Q8)#`W@`@```0```0$!
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`(8```````"&``@`````"`!L"Q8)
    -M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````
    -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`````````````````````````````&8`A@```````(8`"``````(`&P+%@D,
    -M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`A0```````(4`
    -M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`
    -M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`8<```````"'````````````````````
    -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````````````````````````````````````````````````````````````
    -M9@"'````````AP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!
    -M`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!A@```````(8`;`"(````````
    -MB``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``````````````````````````````````````````````````
    -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``````````````````````````````!F`(@```````"(``@`````"`!L"Q8)
    -M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`(<```````"'
    -M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!L`(D```````")``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!
    -M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````
    -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`&8`B0```````(D`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`&8`B````````(@`"``````(`&P+%@D,#>`"```!```!
    -M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`B@```````(H`"``````(`&P+
    -M%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````
    -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````````````````````````````````9@"*````````B@`(``````@`;`L6
    -M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@")````````
    -MB0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>``;`"+````````BP`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&
    -M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````
    -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``!F`(L```````"+``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!F`(H```````"*``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`(P```````",``@`````"`!L
    -M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```
    -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`````````````````````````````````&8`C````````(P`"``````(`&P+
    -M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`BP``````
    -M`(L`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-
    -M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`8T```````"-````````````````
    -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````9@"-````````C0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$`
    -M``$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!C````````(P`;`".````
    -M````C@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``````````````````````````````````````````````
    -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``````````````````````````````````!F`(X```````".``@`````"`!L
    -M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`(T`````
    -M``"-``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!L`(\```````"/``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.
    -M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````
    -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`````&8`CP```````(\`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`&8`C@```````(X`"``````(`&P+%@D,#>`"```!
    -M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`D````````)``"``````(
    -M`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -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````````````````````````````````````9@"0````````D``(``````@`
    -M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@"/````
    -M````CP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``;`"1````````D0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)
    -M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````
    -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``````!F`)$```````"1``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!F`)````````"0``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`)(```````"2``@`````
    -M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX```````````````````````````````````````````````````````````
    -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`````````````````````````````````````&8`D@```````)(`"``````(
    -M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`D0``
    -M`````)$`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!
    -MF4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`9,```````"3````````````
    -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````````9@"3````````DP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(`
    -M``$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!D@```````)(`;`"4
    -M````````E``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``````````````````````````````````````````
    -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``````````````````````````````````````!F`)0```````"4``@`````
    -M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`),`
    -M``````"3``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!L`)4```````"5``@`````"`!L"Q8)#`W@`@```0```0%!4E(%
    -M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````
    -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`````````&8`E0```````)4`"``````(`&P+%@D,#>`"```!```!`0!24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`E````````)0`"``````(`&P+%@D,#>`"
    -M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`E@```````)8`"```
    -M```(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@````````````````````````````````````````````````````````
    -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````````````````````````````````````````9@"6````````E@`(````
    -M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@"5
    -M````````E0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``;`"7````````EP`(``````@`;`L6"0P-X`(```$```$!05)2
    -M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````
    -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``````````!F`)<```````"7``@`````"`!L"Q8)#`W@`@```0```0$`4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`)8```````"6``@`````"`!L"Q8)#`W@
    -M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`)@```````"8``@`
    -M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X```````````````````````````````````````````````````````
    -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`````````````````````````````````````````&8`F````````)@`"```
    -M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`
    -MEP```````)<`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%2
    -M4@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`9D```````"9````````
    -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````````````9@"9````````F0`(``````@`;`L6"0P-X`(```$```$!`%)2
    -M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-
    -MX`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!F````````)@`
    -M;`":````````F@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````````
    -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``````````````````````````````````````````!F`)H```````":``@`
    -M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F
    -M`)D```````"9``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!L`)L```````";``@`````"`!L"Q8)#`W@`@```0```0%!
    -M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````
    -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`````````````&8`FP```````)L`"``````(`&P+%@D,#>`"```!```!`0!2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`F@```````)H`"``````(`&P+%@D,
    -M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`G````````)P`
    -M"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@````````````````````````````````````````````````````
    -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````````````````````````````````````````````9@"<````````G``(
    -M``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M9@";````````FP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``;`"=````````G0`(``````@`;`L6"0P-X`(```$```$!
    -M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````
    -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``````````````!F`)T```````"=``@`````"`!L"Q8)#`W@`@```0```0$`
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`)P```````"<``@`````"`!L"Q8)
    -M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`)X```````">
    -M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X```````````````````````````````````````````````````
    -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`````````````````````````````````````````````&8`G@```````)X`
    -M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`&8`G0```````)T`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!```!
    -M`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`9\```````"?````
    -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````````````````9@"?````````GP`(``````@`;`L6"0P-X`(```$```$!
    -M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6
    -M"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!G@``````
    -M`)X`;`"@````````H``(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&
    -M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````
    -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``````````````````````````````````````````````!F`*````````"@
    -M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!F`)\```````"?``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!L`*$```````"A``@`````"`!L"Q8)#`W@`@```0``
    -M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````
    -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`````````````````&8`H0```````*$`"``````(`&P+%@D,#>`"```!```!
    -M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`H````````*``"``````(`&P+
    -M%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`H@``````
    -M`*(`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@````````````````````````````````````````````````
    -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````````````````````````````````````````````````9@"B````````
    -MH@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>``9@"A````````H0`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``;`"C````````HP`(``````@`;`L6"0P-X`(```$`
    -M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````
    -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``````````````````!F`*,```````"C``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`*(```````"B``@`````"`!L
    -M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`*0`````
    -M``"D``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X```````````````````````````````````````````````
    -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`````````````````````````````````````````````````&8`I```````
    -M`*0`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`&8`HP```````*,`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>`````!
    -M```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`:4```````"E
    -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````````````````````9@"E````````I0`(``````@`;`L6"0P-X`(```$`
    -M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`
    -M;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!I```
    -M`````*0`;`"F````````I@`(``````@`;`L6"0P-X`(```$```$!05)2!0&)
    -M3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````
    -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``````````````````````````````````````````````````!F`*8`````
    -M``"F``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!F`*4```````"E``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!L`*<```````"G``@`````"`!L"Q8)#`W@`@``
    -M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````
    -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`````````````````````&8`IP```````*<`"``````(`&P+%@D,#>`"```!
    -M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`I@```````*8`"``````(
    -M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`J```
    -M`````*@`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@````````````````````````````````````````````
    -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````````````````````````````````````````````````````9@"H````
    -M````J``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``9@"G````````IP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``;`"I````````J0`(``````@`;`L6"0P-X`(`
    -M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````
    -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``````````````````````!F`*D```````"I``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`*@```````"H``@`````
    -M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`*H`
    -M``````"J``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X```````````````````````````````````````````
    -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`````````````````````````````````````````````````````&8`J@``
    -M`````*H`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`&8`J0```````*D`"``````(`&P+%@D,#>`"```!```!`0%24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,#>``
    -M```!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`:L`````
    -M``"K````````````````````````````````````````````````````````
    -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````````````````````````9@"K````````JP`(``````@`;`L6"0P-X`(`
    -M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8````
    -M`!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P```````"/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!
    -MJ@```````*H`;`"L````````K``(``````@`;`L6"0P-X`(```$```$!05)2
    -M!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````
    -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``````````````````````````````````````````````````````!F`*P`
    -M``````"L``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!F`*L```````"K``@`````"`!L"Q8)#`W@`@```0```0$!4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`*T```````"M``@`````"`!L"Q8)#`W@
    -M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````
    -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`````````````````````````&8`K0```````*T`"``````(`&P+%@D,#>`"
    -M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`K````````*P`"```
    -M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`
    -MK@```````*X`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@````````````````````````````````````````
    -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````````````````````````````````````````````````````````9@"N
    -M````````K@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``9@"M````````K0`(``````@`;`L6"0P-X`(```$```$!`5)2
    -M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`"O````````KP`(``````@`;`L6"0P-
    -MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````
    -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``````````````````````````!F`*\```````"O``@`````"`!L"Q8)#`W@
    -M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`*X```````"N``@`
    -M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L
    -M`+````````"P``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````````
    -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`````````````````````````````````````````````````````````&8`
    -ML````````+``"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`&8`KP```````*\`"``````(`&P+%@D,#>`"```!```!`0%2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+%@D,
    -M#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`;$`
    -M``````"Q````````````````````````````````````````````````````
    -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````````````````````````````9@"Q````````L0`(``````@`;`L6"0P-
    -MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````'@`8
    -M`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P``````
    -M`"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!0
    -M3`P!L````````+``;`"R````````L@`(``````@`;`L6"0P-X`(```$```$!
    -M05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````
    -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``````````````````````````````````````````````````````````!F
    -M`+(```````"R``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!F`+$```````"Q``@`````"`!L"Q8)#`W@`@```0```0$!
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`+,```````"S``@`````"`!L"Q8)
    -M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````
    -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`````````````````````````````&8`LP```````+,`"``````(`&P+%@D,
    -M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`L@```````+(`
    -M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`&P`M````````+0`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-!@$`
    -M05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -M9@"T````````M``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``9@"S````````LP`(``````@`;`L6"0P-X`(```$```$!
    -M`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`"U````````M0`(``````@`;`L6
    -M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````
    -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``````````````````````````````!F`+4```````"U``@`````"`!L"Q8)
    -M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`+0```````"T
    -M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!L`+8```````"V``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!
    -M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````
    -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`&8`M@```````+8`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`&8`M0```````+4`"``````(`&P+%@D,#>`"```!```!
    -M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L``````````&P+
    -M%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@0TP,
    -M`;<```````"W````````````````````````````````````````````````
    -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````````````````````````````````9@"W````````MP`(``````@`;`L6
    -M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````````
    -M'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M(P``
    -M`````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>!03`P!M@```````+8`;`"X````````N``(``````@`;`L6"0P-X`(```$`
    -M``$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````
    -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``!F`+@```````"X``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!F`+<```````"W``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`+D```````"Y``@`````"`!L
    -M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```
    -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`````````````````````````````````&8`N0```````+D`"``````(`&P+
    -M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`N```````
    -M`+@`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`&P`N@```````+H`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-
    -M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````````
    -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````9@"Z````````N@`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``9@"Y````````N0`(``````@`;`L6"0P-X`(```$`
    -M``$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`"[````````NP`(``````@`
    -M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -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``````````````````````````````````!F`+L```````"[``@`````"`!L
    -M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`+H`````
    -M``"Z``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!L`+P```````"\``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.
    -M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````
    -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`````&8`O````````+P`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`&8`NP```````+L`"``````(`&P+%@D,#>`"```!
    -M```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L`````````
    -M`&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M0TP,`;T```````"]````````````````````````````````````````````
    -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````````````````````````````````````9@"]````````O0`(``````@`
    -M;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>````
    -M````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!`````$'M
    -M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>!03`P!O````````+P`;`"^````````O@`(``````@`;`L6"0P-X`(`
    -M``$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````
    -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``````!F`+X```````"^``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!F`+T```````"]``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`+\```````"_``@`````
    -M"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX```````````````````````````````````````````````````````````
    -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`````````````````````````````````````&8`OP```````+\`"``````(
    -M`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`O@``
    -M`````+X`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`&P`P````````,``"``````(`&P+%@D,#>`"```!```!`4%24@4!
    -MB4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````
    -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````````9@#`````````P``(``````@`;`L6"0P-X`(```$```$!`%)2!0&!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``9@"_````````OP`(``````@`;`L6"0P-X`(`
    -M``$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#!````````P0`(````
    -M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -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``````````````````````````````````````!F`,$```````#!``@`````
    -M"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,``
    -M``````#```@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!L`,(```````#"``@`````"`!L"Q8)#`W@`@```0```0%!4E(%
    -M`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````
    -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`````````&8`P@```````,(`"``````(`&P+%@D,#>`"```!```!`0!24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`&8`P0```````,$`"``````(`&P+%@D,#>`"
    -M```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L`````
    -M`````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@0TP,`<,```````##````````````````````````````````````````
    -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````````````````````````````````````````9@##````````PP`(````
    -M``@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``<@`>
    -M````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!````
    -M`$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>!03`P!P@```````,(`;`#$````````Q``(``````@`;`L6"0P-
    -MX`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````
    -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``````````!F`,0```````#$``@`````"`!L"Q8)#`W@`@```0```0$`4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,,```````##``@`````"`!L"Q8)#`W@
    -M`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`,4```````#%``@`
    -M````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X```````````````````````````````````````````````````````
    -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`````````````````````````````````````````&8`Q0```````,4`"```
    -M```(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`
    -MQ````````,0`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`&P`Q@```````,8`"``````(`&P+%@D,#>`"```!```!`4%2
    -M4@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````
    -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````````````9@#&````````Q@`(``````@`;`L6"0P-X`(```$```$!`%)2
    -M!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#%````````Q0`(``````@`;`L6"0P-
    -MX`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#'````````QP`(
    -M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``````````````````````````````````````````````````````
    -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``````````````````````````````````````````!F`,<```````#'``@`
    -M````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F
    -M`,8```````#&``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!L`,@```````#(``@`````"`!L"Q8)#`W@`@```0```0%!
    -M4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````
    -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`````````````&8`R````````,@`"``````(`&P+%@D,#>`"```!```!`0!2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`QP```````,<`"``````(`&P+%@D,
    -M#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$``````;L`
    -M`````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@0TP,`U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D`>U!
    -M`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>!03`P!R````````,@`;`#*````````R@`(``````@`;`L6
    -M"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````
    -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``````````````!F`,H```````#*``@`````"`!L"Q8)#`W@`@```0```0$`
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,D```````#)``@`````"`!L"Q8)
    -M#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`,L```````#+
    -M``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X```````````````````````````````````````````````````
    -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`````````````````````````````````````````````&8`RP```````,L`
    -M"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`&8`R@```````,H`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`&P`S````````,P`"``````(`&P+%@D,#>`"```!```!
    -M`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````
    -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````````````````9@#,````````S``(``````@`;`L6"0P-X`(```$```$!
    -M`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#+````````RP`(``````@`;`L6
    -M"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#-````````
    -MS0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``````````````````````````````````````````````````
    -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``````````````````````````````````````````````!F`,T```````#-
    -M``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#````
    -M`````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!F`,P```````#,``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!L`,X```````#.``@`````"`!L"Q8)#`W@`@```0``
    -M`0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````
    -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`````````````````&8`S@```````,X`"``````(`&P+%@D,#>`"```!```!
    -M`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`S0```````,T`"``````(`&P+
    -M%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$`````
    -M`;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@0TP,`<\```````#/````````````````````````````````
    -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````````````````````````````````````````````````9@#/````````
    -MSP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A4%@D
    -M`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>!03`P!S@```````,X`;`#0````````T``(``````@`
    -M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -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``````````````````!F`-````````#0``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`,\```````#/``@`````"`!L
    -M"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`-$`````
    -M``#1``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X```````````````````````````````````````````````
    -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`````````````````````````````````````````````````&8`T0``````
    -M`-$`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`&8`T````````-``"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`&P`T@```````-(`"``````(`&P+%@D,#>`"```!
    -M```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````
    -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````````````````````9@#2````````T@`(``````@`;`L6"0P-X`(```$`
    -M``$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#1````````T0`(``````@`
    -M;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P``
    -M```#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#3````
    -M````TP`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!
    -M`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``````````````````````````````````````````````
    -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``````````````````````````````````````````````````!F`-,`````
    -M``#3``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!F`-(```````#2``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!L`-0```````#4``@`````"`!L"Q8)#`W@`@``
    -M`0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````
    -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`````````````````````&8`U````````-0`"``````(`&P+%@D,#>`"```!
    -M```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`TP```````-,`"``````(
    -M`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`NP$`
    -M`````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@0TP,`=4```````#5````````````````````````````
    -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````````````````````````````````````````````````````9@#5````
    -M````U0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2!0&A
    -M4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>!03`P!U````````-0`;`#6````````U@`(````
    -M``@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -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``````````````````````!F`-8```````#6``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`-4```````#5``@`````
    -M"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`-<`
    -M``````#7``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X```````````````````````````````````````````
    -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`````````````````````````````````````````````````````&8`UP``
    -M`````-<`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!!
    -M[0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L
    -M"Q8)#`W@`&8`U@```````-8`"``````(`&P+%@D,#>`"```!```!`0%24@4!
    -M@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@`&P`V````````-@`"``````(`&P+%@D,#>`"
    -M```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````
    -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````````````````````````9@#8````````V``(``````@`;`L6"0P-X`(`
    -M``$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#7````````UP`(````
    -M``@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H
    -M`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#9
    -M````````V0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``````````````````````````````````````````
    -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``````````````````````````````````````````````````````!F`-D`
    -M``````#9``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````
    -M0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@
    -M;`L6"0P-X`!F`-@```````#8``@`````"`!L"Q8)#`W@`@```0```0$!4E(%
    -M`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`-H```````#:``@`````"`!L"Q8)#`W@
    -M`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````````
    -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`````````````````````````&8`V@```````-H`"``````(`&P+%@D,#>`"
    -M```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`````
    -M`````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`V0```````-D`"```
    -M```(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`'@`
    -MNP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`05!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@0TP,`=L```````#;````````````````````````
    -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````````````````````````````````````````````````````````9@#;
    -M````````VP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!````
    -M`$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-
    -MX&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!`5)2
    -M!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!V@```````-H`;`#<````````W``(
    -M``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M
    -M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+
    -M%@D,#>``````````````````````````````````````````````````````
    -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``````````````````````````!F`-P```````#<``@`````"`!L"Q8)#`W@
    -M`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````
    -M``````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`-L```````#;``@`
    -M````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L
    -M`-T```````#=``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````````
    -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`````````````````````````````````````````````````````````&8`
    -MW0```````-T`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M00``
    -M``!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,
    -M#>!L"Q8)#`W@`&8`W````````-P`"``````(`&P+%@D,#>`"```!```!`0%2
    -M4@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`W@```````-X`"``````(`&P+%@D,
    -M#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#Z`,`
    -M`````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````
    -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````````````````````````````9@#>````````W@`(``````@`;`L6"0P-
    -MX`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```
    -M````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#=````````W0`(
    -M``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -M;`#?````````WP`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!
    -M4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````````
    -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``````````````````````````````````````````````````````````!F
    -M`-\```````#?``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`
    -M````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)
    -M#`W@;`L6"0P-X`!F`-X```````#>``@`````"`!L"Q8)#`W@`@```0```0$!
    -M4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`.````````#@``@`````"`!L"Q8)
    -M#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#`````````^@#
    -M``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```````
    -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`````````````````````````````&8`X````````.``"``````(`&P+%@D,
    -M#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,``````^@`
    -M`````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`WP```````-\`
    -M"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`````
    -M```#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@
    -M`'@`NP$``````;L``````````&P+%@D,#>`````!```!`4%24@4!F4Y-!@$`
    -M05!8)`'M00````!![0(````````"Z`,``````^@``````````%1&&@$.;`L6
    -M"0P-X&P+%@D,#>!L"Q8)#`W@0TP,`>$```````#A````````````````````
    -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````````````````````````````````````````````````````````````
    -M9@#A````````X0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D`>U!
    -M`````$'M`@````````+H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6
    -M"0P-X&P+%@D,#>``<@`>````````'@`8`````!@`;`L6"0P-X`(```$```$!
    -M`5)2!0&A4%@D`>U!`````$'M(P```````"/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>!03`P!X````````.``````````````
    -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``````````````````````````````!F`.(```````#B``@`````"`!L"Q8)
    -M#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#``````/H
    -M``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`!P````````<
    -M``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T%````
    -M````!>@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-
    -MX`!L`.,```````#C``@`````"`!L"Q8)#`W@`@```0```0%!4E(%`8E.308!
    -M`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+
    -M%@D,#>!L"Q8)#`W@;`L6"0P-X```````````````````````````````````
    -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`&8`XP```````.,`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8)`'M
    -M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+
    -M%@D,#>!L"Q8)#`W@`&8`X@```````.(`"``````(`&P+%@D,#>`"```!```!
    -M`0%24@4!@5!8)`'M00````!![0,````````#Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&P`Y````````.0`"``````(`&P+
    -M%@D,#>`"```!```!`4%24@4!B4Y-!@$`05!8)`'M00````!![0,````````#
    -MZ`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````
    -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````````````````````````````````9@#D````````Y``(``````@`;`L6
    -M"0P-X`(```$```$!`%)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#
    -MZ```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``9@#C````````
    -MXP`(``````@`;`L6"0P-X`(```$```$!`5)2!0&!4%@D`>U!`````$'M`P``
    -M``````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,
    -M#>``;`#E````````Y0`(``````@`;`L6"0P-X`(```$```$!05)2!0&)3DT&
    -M`0!!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL
    -M"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````````
    -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``!F`.4```````#E``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%06"0!
    -M[4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L
    -M"Q8)#`W@;`L6"0P-X`!F`.0```````#D``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H``````````!4
    -M1AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!L`.8```````#F``@`````"`!L
    -M"Q8)#`W@`@```0```0%!4E(%`8E.308!`$%06"0![4$`````0>T#````````
    -M`^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X```
    -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`````````````````````````````````&8`Y@```````.8`"``````(`&P+
    -M%@D,#>`"```!```!`0!24@4!@5!8)`'M00````!![0,````````#Z`,`````
    -M`^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`&8`Y0``````
    -M`.4`"``````(`&P+%@D,#>`"```!```!`0%24@4!@5!8)`'M00````!![0,`
    -M```````#Z`,``````^@``````````%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)
    -M#`W@`&P`YP```````.<`"``````(`&P+%@D,#>`"```!```!`4%24@4!B4Y-
    -M!@$`05!8)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.
    -M;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````````
    -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````9@#G````````YP`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!4%@D
    -M`>U!`````$'M`P````````/H`P`````#Z```````````5$8:`0YL"Q8)#`W@
    -M;`L6"0P-X&P+%@D,#>``9@#F````````Y@`(``````@`;`L6"0P-X`(```$`
    -M``$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````
    -M5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``;`#H````````Z``(``````@`
    -M;`L6"0P-X`(```$```$!05)2!0&)3DT&`0!!4%@D`>U!`````$'M`P``````
    -M``/H`P`````#Z```````````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``
    -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``````````````````````````````````!F`.@```````#H``@`````"`!L
    -M"Q8)#`W@`@```0```0$`4E(%`8%06"0![4$`````0>T#`````````^@#````
    -M``/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`!F`.<`````
    -M``#G``@`````"`!L"Q8)#`W@`@```0```0$!4E(%`8%06"0![4$`````0>T#
    -M`````````^@#``````/H``````````!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6
    -M"0P-X`!X`+L!``````&[``````````!L"Q8)#`W@`````0```0%!4E(%`9E.
    -M308!`$%06"0![4$`````0>T#`````````^@#``````/H``````````!41AH!
    -M#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X$-,#`$A````````(0``````````````
    -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`````&8`Z0```````.D`"``````(`&P+%@D,#>`"```!```!`0!24@4!@5!8
    -M)`'M00````!![0,````````#Z`,``````^@``````````%1&&@$.;`L6"0P-
    -MX&P+%@D,#>!L"Q8)#`W@`&8`'````````!P`"``````(`&P+%@D,#>`"```!
    -M```!`0%24@4!@5!8)`'M00````!![04````````%Z`,``````^@`````````
    -M`%1&&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@`/@`ZP```````.L`"``````(
    -M`&P+%@D,#>`"```!```!'T%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%24@4!B4Y-EP$!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%#11P!Z@```````.H``````````+``
    -M``````"P````````````````````````````````````````````````````
    -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````````````````````````````````````3DUR`0!!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!4%@D`>U!`````$'M`P````````/H`P`````#Z```````````5$8:
    -M`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````````````
    -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``````!F`.L```````#K``@`````"`!L"Q8)#`W@`@```0```0$`4E(%`8%0
    -M6"0![4$`````0>T#`````````^@#``````/H``````````!41AH!#FP+%@D,
    -M#>!L"Q8)#`W@;`L6"0P-X`!F`.D```````#I``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!4E(%`8%06"0![4$`````0>T#`````````^@#``````/H````````
    -M``!41AH!#FP+%@D,#>!L"Q8)#`W@;`L6"0P-X`#X`.T```````#M``@`````
    -M"`!L"Q8)#`W@`@```0```1]!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!4E(%`8E.39P```````#L``````````"P
    -M````````L```````````````````````````````````````````````````
    -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`````````````````````````````````````$Y-<@$`04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!04%!
    -M04%!04%!05!8)`'M00````!![0(````````"Z`,``````^@``````````%1&
    -M&@$.;`L6"0P-X&P+%@D,#>!L"Q8)#`W@````````````````````````````
    -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````````9@#M````````[0`(``````@`;`L6"0P-X`(```$```$!`%)2!0&!
    -M4%@D`>U!`````$'M`@````````+H`P`````#Z```````````5$8:`0YL"Q8)
    -M#`W@;`L6"0P-X&P+%@D,#>``9@#K````````ZP`(``````@`;`L6"0P-X`(`
    -M``$```$!`5)2!0&!4%@D`>U!`````$'M`P````````/H`P`````#Z```````
    -M````5$8:`0YL"Q8)#`W@;`L6"0P-X&P+%@D,#>``````````````````````
    -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```````````````````````````````````````B`.X```````#N``@`````
    -M"`!L"Q8)#`W@`@```0```0$`(@#N````````[@`(``````@`;`L6"0P-X`(`
    -M``$```$!`20`L`$``````;``"``````(`&P+%@D,#>`"```!```!`@!!`*(`
    -MMP$``````;<`"``````(`&P+%@D,#>`"```!```!@`!!`$$`00!!`$$`00!!
    -M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`
    -M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!
    -M`$$`00!!`$$`00!!`$$`00!!`$$`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`````````"(`[P```````.\`"``````(`&P+%@D,#>`"```!```!`0`B`+8!
    -M``````&V``@`````"`!L"Q8)#`W@`@```0```0$!)`#P````````\``(````
    -M``@`;`L6"0P-X`(```$```$"`$$`````````````````````````````````
    -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````````````````````````````````````````(@#P````````\``(````
    -M``@`;`L6"0P-X`(```$```$!`"(`[P```````.\`"``````(`&P+%@D,#>`"
    -M```!```!`0$D`/$```````#Q``@`````"`!L"Q8)#`W@`@```0```0(`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```````````B`/$```````#Q``@`````"`!L"Q8)#`W@`@```0```0$`(@#P
    -M````````\``(``````@`;`L6"0P-X`(```$```$!`20`\@```````/(`"```
    -M```(`&P+%@D,#>`"```!```!`@!!````````````````````````````````
    -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```(`&P+%@D,#>`"```!```!`0`B`/$```````#Q``@`````"`!L"Q8)#`W@
    -M`@```0```0$!)`#S````````\P`(``````@`;`L6"0P-X`(```$```$"`$$`
    -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````````````(@#S````````\P`(``````@`;`L6"0P-X`(```$```$!`"(`
    -M\@```````/(`"``````(`&P+%@D,#>`"```!```!`0$D`/0```````#T``@`
    -M````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````B`/0```````#T``@`
    -M````"`!L"Q8)#`W@`@```0```0$`(@#S````````\P`(``````@`;`L6"0P-
    -MX`(```$```$!`20`]0```````/4`"``````(`&P+%@D,#>`"```!```!`@!!
    -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`````````````"(`]0```````/4`"``````(`&P+%@D,#>`"```!```!`0`B
    -M`/0```````#T``@`````"`!L"Q8)#`W@`@```0```0$!)`#V````````]@`(
    -M``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````````
    -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````````````````````````````````````````````(@#V````````]@`(
    -M``````@`;`L6"0P-X`(```$```$!`"(`]0```````/4`"``````(`&P+%@D,
    -M#>`"```!```!`0$D`/<```````#W``@`````"`!L"Q8)#`W@`@```0```0(`
    -M00``````````````````````````````````````````````````````````
    -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```````````````B`/<```````#W``@`````"`!L"Q8)#`W@`@```0```0$`
    -M(@#V````````]@`(``````@`;`L6"0P-X`(```$```$!`20`^````````/@`
    -M"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````````
    -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"``````(`&P+%@D,#>`"```!```!`0`B`/<```````#W``@`````"`!L"Q8)
    -M#`W@`@```0```0$!)`#Y````````^0`(``````@`;`L6"0P-X`(```$```$"
    -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````````````````(@#Y````````^0`(``````@`;`L6"0P-X`(```$```$!
    -M`"(`^````````/@`"``````(`&P+%@D,#>`"```!```!`0$D`/H```````#Z
    -M``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````B`/H```````#Z
    -M``@`````"`!L"Q8)#`W@`@```0```0$`(@#Y````````^0`(``````@`;`L6
    -M"0P-X`(```$```$!`20`^P```````/L`"``````(`&P+%@D,#>`"```!```!
    -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`````````````````"(`^P```````/L`"``````(`&P+%@D,#>`"```!```!
    -M`0`B`/H```````#Z``@`````"`!L"Q8)#`W@`@```0```0$!)`#\````````
    -M_``(``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````
    -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_``(``````@`;`L6"0P-X`(```$```$!`"(`^P```````/L`"``````(`&P+
    -M%@D,#>`"```!```!`0$D`/T```````#]``@`````"`!L"Q8)#`W@`@```0``
    -M`0(`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```````````````````B`/T```````#]``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`(@#\````````_``(``````@`;`L6"0P-X`(```$```$!`20`_@``````
    -M`/X`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````
    -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`/X`"``````(`&P+%@D,#>`"```!```!`0`B`/T```````#]``@`````"`!L
    -M"Q8)#`W@`@```0```0$!)`#_````````_P`(``````@`;`L6"0P-X`(```$`
    -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````````````````````(@#_````````_P`(``````@`;`L6"0P-X`(```$`
    -M``$!`"(`_@```````/X`"``````(`&P+%@D,#>`"```!```!`0$D```!````
    -M``$```@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````B```!````
    -M``$```@`````"`!L"Q8)#`W@`@```0```0$`(@#_````````_P`(``````@`
    -M;`L6"0P-X`(```$```$!`20``0$``````0$`"``````(`&P+%@D,#>`"```!
    -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`````````````````````"(``0$``````0$`"``````(`&P+%@D,#>`"```!
    -M```!`0`B```!``````$```@`````"`!L"Q8)#`W@`@```0```0$!)``"`0``
    -M```!`@`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````````
    -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````````````````````````````````````````````````````(@`"`0``
    -M```!`@`(``````@`;`L6"0P-X`(```$```$!`"(``0$``````0$`"``````(
    -M`&P+%@D,#>`"```!```!`0$D``,!``````$#``@`````"`!L"Q8)#`W@`@``
    -M`0```0(`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```````````````````````B``,!``````$#``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`(@`"`0`````!`@`(``````@`;`L6"0P-X`(```$```$!`20`!`$`
    -M`````00`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````
    -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`````00`"``````(`&P+%@D,#>`"```!```!`0`B``,!``````$#``@`````
    -M"`!L"Q8)#`W@`@```0```0$!)``%`0`````!!0`(``````@`;`L6"0P-X`(`
    -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````````````````````````(@`%`0`````!!0`(``````@`;`L6"0P-X`(`
    -M``$```$!`"(`!`$``````00`"``````(`&P+%@D,#>`"```!```!`0$D``8!
    -M``````$&``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````B``8!
    -M``````$&``@`````"`!L"Q8)#`W@`@```0```0$`(@`%`0`````!!0`(````
    -M``@`;`L6"0P-X`(```$```$!`20`!P$``````0<`"``````(`&P+%@D,#>`"
    -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`````````````````````````"(`!P$``````0<`"``````(`&P+%@D,#>`"
    -M```!```!`0`B``8!``````$&``@`````"`!L"Q8)#`W@`@```0```0$!)``(
    -M`0`````!"``(``````@`;`L6"0P-X`(```$```$"`$$`````````````````
    -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`0`````!"``(``````@`;`L6"0P-X`(```$```$!`"(`!P$``````0<`"```
    -M```(`&P+%@D,#>`"```!```!`0$D``D!``````$)``@`````"`!L"Q8)#`W@
    -M`@```0```0(`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```````````````````````````B``D!``````$)``@`````"`!L"Q8)#`W@
    -M`@```0```0$`(@`(`0`````!"``(``````@`;`L6"0P-X`(```$```$!`20`
    -M"@$``````0H`"``````(`&P+%@D,#>`"```!```!`@!!````````````````
    -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"@$``````0H`"``````(`&P+%@D,#>`"```!```!`0`B``D!``````$)``@`
    -M````"`!L"Q8)#`W@`@```0```0$!)``+`0`````!"P`(``````@`;`L6"0P-
    -MX`(```$```$"`$$`````````````````````````````````````````````
    -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````````````````````````````(@`+`0`````!"P`(``````@`;`L6"0P-
    -MX`(```$```$!`"(`"@$``````0H`"``````(`&P+%@D,#>`"```!```!`0$D
    -M``P!``````$,``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````````B
    -M``P!``````$,``@`````"`!L"Q8)#`W@`@```0```0$`(@`+`0`````!"P`(
    -M``````@`;`L6"0P-X`(```$```$!`20`#0$``````0T`"``````(`&P+%@D,
    -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`````````````````````````````"(`#0$``````0T`"``````(`&P+%@D,
    -M#>`"```!```!`0`B``P!``````$,``@`````"`!L"Q8)#`W@`@```0```0$!
    -M)``.`0`````!#@`(``````@`;`L6"0P-X`(```$```$"`$$`````````````
    -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(@`.`0`````!#@`(``````@`;`L6"0P-X`(```$```$!`"(`#0$``````0T`
    -M"``````(`&P+%@D,#>`"```!```!`0$D``\!``````$/``@`````"`!L"Q8)
    -M#`W@`@```0```0(`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```````````````````````````````B``\!``````$/``@`````"`!L"Q8)
    -M#`W@`@```0```0$`(@`.`0`````!#@`(``````@`;`L6"0P-X`(```$```$!
    -M`20`$`$``````1``"``````(`&P+%@D,#>`"```!```!`@!!````````````
    -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`"(`$`$``````1``"``````(`&P+%@D,#>`"```!```!`0`B``\!``````$/
    -M``@`````"`!L"Q8)#`W@`@```0```0$!)``1`0`````!$0`(``````@`;`L6
    -M"0P-X`(```$```$"`$$`````````````````````````````````````````
    -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````````````````````````````````(@`1`0`````!$0`(``````@`;`L6
    -M"0P-X`(```$```$!`"(`$`$``````1``"``````(`&P+%@D,#>`"```!```!
    -M`0$D`!(!``````$2``@`````"`!L"Q8)#`W@`@```0```0(`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```B`!(!``````$2``@`````"`!L"Q8)#`W@`@```0```0$`(@`1`0`````!
    -M$0`(``````@`;`L6"0P-X`(```$```$!`20`$P$``````1,`"``````(`&P+
    -M%@D,#>`"```!```!`@!!````````````````````````````````````````
    -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`````````````````````````````````"(`$P$``````1,`"``````(`&P+
    -M%@D,#>`"```!```!`0`B`!(!``````$2``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!)``4`0`````!%``(``````@`;`L6"0P-X`(```$```$"`$$`````````
    -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````(@`4`0`````!%``(``````@`;`L6"0P-X`(```$```$!`"(`$P$`````
    -M`1,`"``````(`&P+%@D,#>`"```!```!`0$D`!4!``````$5``@`````"`!L
    -M"Q8)#`W@`@```0```0(`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```````````````````````````````````B`!4!``````$5``@`````"`!L
    -M"Q8)#`W@`@```0```0$`(@`4`0`````!%``(``````@`;`L6"0P-X`(```$`
    -M``$!`20`%@$``````18`"``````(`&P+%@D,#>`"```!```!`@!!````````
    -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`````"(`%@$``````18`"``````(`&P+%@D,#>`"```!```!`0`B`!4!````
    -M``$5``@`````"`!L"Q8)#`W@`@```0```0$!)``7`0`````!%P`(``````@`
    -M;`L6"0P-X`(```$```$"`$$`````````````````````````````````````
    -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````````````````````````````````````(@`7`0`````!%P`(``````@`
    -M;`L6"0P-X`(```$```$!`"(`%@$``````18`"``````(`&P+%@D,#>`"```!
    -M```!`0$D`!@!``````$8``@`````"`!L"Q8)#`W@`@```0```0(`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```````B`!@!``````$8``@`````"`!L"Q8)#`W@`@```0```0$`(@`7`0``
    -M```!%P`(``````@`;`L6"0P-X`(```$```$!`20`&0$``````1D`"``````(
    -M`&P+%@D,#>`"```!```!`@!!````````````````````````````````````
    -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`````````````````````````````````````"(`&0$``````1D`"``````(
    -M`&P+%@D,#>`"```!```!`0`B`!@!``````$8``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!)``:`0`````!&@`(``````@`;`L6"0P-X`(```$```$"`$$`````
    -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````````(@`:`0`````!&@`(``````@`;`L6"0P-X`(```$```$!`"(`&0$`
    -M`````1D`"``````(`&P+%@D,#>`"```!```!`0$D`!L!``````$;``@`````
    -M"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````B`!L!``````$;``@`````
    -M"`!L"Q8)#`W@`@```0```0$`(@`:`0`````!&@`(``````@`;`L6"0P-X`(`
    -M``$```$!`20`'`$``````1P`"``````(`&P+%@D,#>`"```!```!`@!!````
    -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`````````"(`'`$``````1P`"``````(`&P+%@D,#>`"```!```!`0`B`!L!
    -M``````$;``@`````"`!L"Q8)#`W@`@```0```0$!)``=`0`````!'0`(````
    -M``@`;`L6"0P-X`(```$```$"`$$`````````````````````````````````
    -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````````````````````````````````````````(@`=`0`````!'0`(````
    -M``@`;`L6"0P-X`(```$```$!`"(`'`$``````1P`"``````(`&P+%@D,#>`"
    -M```!```!`0$D`!X!``````$>``@`````"`!L"Q8)#`W@`@```0```0(`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```````````B`!X!``````$>``@`````"`!L"Q8)#`W@`@```0```0$`(@`=
    -M`0`````!'0`(``````@`;`L6"0P-X`(```$```$!`20`'P$``````1\`"```
    -M```(`&P+%@D,#>`"```!```!`@!!````````````````````````````````
    -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`````````````````````````````````````````"(`'P$``````1\`"```
    -M```(`&P+%@D,#>`"```!```!`0`B`!X!``````$>``@`````"`!L"Q8)#`W@
    -M`@```0```0$!)``@`0`````!(``(``````@`;`L6"0P-X`(```$```$"`$$`
    -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````````````(@`@`0`````!(``(``````@`;`L6"0P-X`(```$```$!`"(`
    -M'P$``````1\`"``````(`&P+%@D,#>`"```!```!`0$D`"$!``````$A``@`
    -M````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````B`"$!``````$A``@`
    -M````"`!L"Q8)#`W@`@```0```0$`(@`@`0`````!(``(``````@`;`L6"0P-
    -MX`(```$```$!`20`(@$``````2(`"``````(`&P+%@D,#>`"```!```!`@!!
    -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`````````````"(`(@$``````2(`"``````(`&P+%@D,#>`"```!```!`0`B
    -M`"$!``````$A``@`````"`!L"Q8)#`W@`@```0```0$!)``C`0`````!(P`(
    -M``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````````
    -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````````````````````````````````````````````(@`C`0`````!(P`(
    -M``````@`;`L6"0P-X`(```$```$!`"(`(@$``````2(`"``````(`&P+%@D,
    -M#>`"```!```!`0$D`"0!``````$D``@`````"`!L"Q8)#`W@`@```0```0(`
    -M00``````````````````````````````````````````````````````````
    -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```````````````B`"0!``````$D``@`````"`!L"Q8)#`W@`@```0```0$`
    -M(@`C`0`````!(P`(``````@`;`L6"0P-X`(```$```$!`20`)0$``````24`
    -M"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````````
    -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`````````````````````````````````````````````"(`)0$``````24`
    -M"``````(`&P+%@D,#>`"```!```!`0`B`"0!``````$D``@`````"`!L"Q8)
    -M#`W@`@```0```0$!)``F`0`````!)@`(``````@`;`L6"0P-X`(```$```$"
    -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````````````````(@`F`0`````!)@`(``````@`;`L6"0P-X`(```$```$!
    -M`"(`)0$``````24`"``````(`&P+%@D,#>`"```!```!`0$D`"`"```!```!
    -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`````````````````"(`*`$``````2@`"``````(`&P+%@D,#>`"```!```!
    -M`0`B`"`"```!```!`0$D`"H!``````$J``@`````"`!L"Q8)#`W@`@```0``
    -M`0(`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```````````````````B`"H!``````$J``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`(@`I`0`````!*0`(``````@`;`L6"0P-X`(```$```$!`20`*P$`````
    -M`2L`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````
    -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`````````````````````````````````````````````````"(`*P$`````
    -M`2L`"``````(`&P+%@D,#>`"```!```!`0`B`"H!``````$J``@`````"`!L
    -M"Q8)#`W@`@```0```0$!)``L`0`````!+``(``````@`;`L6"0P-X`(```$`
    -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`0`````!+``(``````@`;`L6"0P-X`(```$`
    -M``$!`"(`*P$``````2L`"``````(`&P+%@D,#>`"```!```!`0$D`"T!````
    -M``$M``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````B`"T!````
    -M``$M``@`````"`!L"Q8)#`W@`@```0```0$`(@`L`0`````!+``(``````@`
    -M;`L6"0P-X`(```$```$!`20`+@$``````2X`"``````(`&P+%@D,#>`"```!
    -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`````````````````````"(`+@$``````2X`"``````(`&P+%@D,#>`"```!
    -M```!`0`B`"T!``````$M``@`````"`!L"Q8)#`W@`@```0```0$!)``O`0``
    -M```!+P`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````````
    -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````````````````````````````````````````````````````(@`O`0``
    -M```!+P`(``````@`;`L6"0P-X`(```$```$!`"(`+@$``````2X`"``````(
    -M`&P+%@D,#>`"```!```!`0$D`#`!``````$P``@`````"`!L"Q8)#`W@`@``
    -M`0```0(`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```````````````````````B`#`!``````$P``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`(@`O`0`````!+P`(``````@`;`L6"0P-X`(```$```$!`20`,0$`
    -M`````3$`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````
    -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`````````````````````````````````````````````````````"(`,0$`
    -M`````3$`"``````(`&P+%@D,#>`"```!```!`0`B`#`!``````$P``@`````
    -M"`!L"Q8)#`W@`@```0```0$!)``R`0`````!,@`(``````@`;`L6"0P-X`(`
    -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````````````````````````(@`R`0`````!,@`(``````@`;`L6"0P-X`(`
    -M``$```$!`"(`,0$``````3$`"``````(`&P+%@D,#>`"```!```!`0$D`#,!
    -M``````$S``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````B`#,!
    -M``````$S``@`````"`!L"Q8)#`W@`@```0```0$`(@`R`0`````!,@`(````
    -M``@`;`L6"0P-X`(```$```$!`20`-`$``````30`"``````(`&P+%@D,#>`"
    -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`````````````````````````"(`-`$``````30`"``````(`&P+%@D,#>`"
    -M```!```!`0`B`#,!``````$S``@`````"`!L"Q8)#`W@`@```0```0$!)``U
    -M`0`````!-0`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````
    -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````````````````````````````````````````````````````````(@`U
    -M`0`````!-0`(``````@`;`L6"0P-X`(```$```$!`"(`-`$``````30`"```
    -M```(`&P+%@D,#>`"```!```!`0$D`#8!``````$V``@`````"`!L"Q8)#`W@
    -M`@```0```0(`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```````````````````````````B`#8!``````$V``@`````"`!L"Q8)#`W@
    -M`@```0```0$`(@`U`0`````!-0`(``````@`;`L6"0P-X`(```$```$!`20`
    -M-P$``````3<`"``````(`&P+%@D,#>`"```!```!`@!!````````````````
    -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-P$``````3<`"``````(`&P+%@D,#>`"```!```!`0`B`#8!``````$V``@`
    -M````"`!L"Q8)#`W@`@```0```0$!)``X`0`````!.``(``````@`;`L6"0P-
    -MX`(```$```$"`$$`````````````````````````````````````````````
    -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````````````````````````````(@`X`0`````!.``(``````@`;`L6"0P-
    -MX`(```$```$!`"(`-P$``````3<`"``````(`&P+%@D,#>`"```!```!`0$D
    -M`#D!``````$Y``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````````B
    -M`#D!``````$Y``@`````"`!L"Q8)#`W@`@```0```0$`(@`X`0`````!.``(
    -M``````@`;`L6"0P-X`(```$```$!`20`.@$``````3H`"``````(`&P+%@D,
    -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`````````````````````````````"(`.@$``````3H`"``````(`&P+%@D,
    -M#>`"```!```!`0`B`#D!``````$Y``@`````"`!L"Q8)#`W@`@```0```0$!
    -M)``[`0`````!.P`(``````@`;`L6"0P-X`(```$```$"`$$`````````````
    -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(@`[`0`````!.P`(``````@`;`L6"0P-X`(```$```$!`"(`.@$``````3H`
    -M"``````(`&P+%@D,#>`"```!```!`0$D`#P!``````$\``@`````"`!L"Q8)
    -M#`W@`@```0```0(`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```````````````````````````````B`#P!``````$\``@`````"`!L"Q8)
    -M#`W@`@```0```0$`(@`[`0`````!.P`(``````@`;`L6"0P-X`(```$```$!
    -M`20`/0$``````3T`"``````(`&P+%@D,#>`"```!```!`@!!````````````
    -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`"(`/0$``````3T`"``````(`&P+%@D,#>`"```!```!`0`B`#P!``````$\
    -M``@`````"`!L"Q8)#`W@`@```0```0$!)``^`0`````!/@`(``````@`;`L6
    -M"0P-X`(```$```$"`$$`````````````````````````````````````````
    -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````````````````````````````````(@`^`0`````!/@`(``````@`;`L6
    -M"0P-X`(```$```$!`"(`/0$``````3T`"``````(`&P+%@D,#>`"```!```!
    -M`0$D`#\!``````$_``@`````"`!L"Q8)#`W@`@```0```0(`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```B`#\!``````$_``@`````"`!L"Q8)#`W@`@```0```0$`(@`^`0`````!
    -M/@`(``````@`;`L6"0P-X`(```$```$!`20`0`$``````4``"``````(`&P+
    -M%@D,#>`"```!```!`@!!````````````````````````````````````````
    -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`````````````````````````````````"(`0`$``````4``"``````(`&P+
    -M%@D,#>`"```!```!`0`B`#\!``````$_``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!)`!!`0`````!00`(``````@`;`L6"0P-X`(```$```$"`$$`````````
    -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````(@!!`0`````!00`(``````@`;`L6"0P-X`(```$```$!`"(`0`$`````
    -M`4``"``````(`&P+%@D,#>`"```!```!`0$D`$(!``````%"``@`````"`!L
    -M"Q8)#`W@`@```0```0(`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```````````````````````````````````B`$(!``````%"``@`````"`!L
    -M"Q8)#`W@`@```0```0$`(@!!`0`````!00`(``````@`;`L6"0P-X`(```$`
    -M``$!`20`0P$``````4,`"``````(`&P+%@D,#>`"```!```!`@!!````````
    -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`````"(`0P$``````4,`"``````(`&P+%@D,#>`"```!```!`0`B`$(!````
    -M``%"``@`````"`!L"Q8)#`W@`@```0```0$!)`!$`0`````!1``(``````@`
    -M;`L6"0P-X`(```$```$"`$$`````````````````````````````````````
    -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````````````````````````````````````(@!$`0`````!1``(``````@`
    -M;`L6"0P-X`(```$```$!`"(`0P$``````4,`"``````(`&P+%@D,#>`"```!
    -M```!`0$D`$4!``````%%``@`````"`!L"Q8)#`W@`@```0```0(`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```````B`$4!``````%%``@`````"`!L"Q8)#`W@`@```0```0$`(@!$`0``
    -M```!1``(``````@`;`L6"0P-X`(```$```$!`20`1@$``````48`"``````(
    -M`&P+%@D,#>`"```!```!`@!!````````````````````````````````````
    -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`````````````````````````````````````"(`1@$``````48`"``````(
    -M`&P+%@D,#>`"```!```!`0`B`$4!``````%%``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!)`!'`0`````!1P`(``````@`;`L6"0P-X`(```$```$"`$$`````
    -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````````(@!'`0`````!1P`(``````@`;`L6"0P-X`(```$```$!`"(`1@$`
    -M`````48`"``````(`&P+%@D,#>`"```!```!`0$D`$@!``````%(``@`````
    -M"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````B`$@!``````%(``@`````
    -M"`!L"Q8)#`W@`@```0```0$`(@!'`0`````!1P`(``````@`;`L6"0P-X`(`
    -M``$```$!`20`20$``````4D`"``````(`&P+%@D,#>`"```!```!`@!!````
    -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`````````"(`20$``````4D`"``````(`&P+%@D,#>`"```!```!`0`B`$@!
    -M``````%(``@`````"`!L"Q8)#`W@`@```0```0$!)`!*`0`````!2@`(````
    -M``@`;`L6"0P-X`(```$```$"`$$`````````````````````````````````
    -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````````````````````````````````````````(@!*`0`````!2@`(````
    -M``@`;`L6"0P-X`(```$```$!`"(`20$``````4D`"``````(`&P+%@D,#>`"
    -M```!```!`0$D`$L!``````%+``@`````"`!L"Q8)#`W@`@```0```0(`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```````````B`$L!``````%+``@`````"`!L"Q8)#`W@`@```0```0$`(@!*
    -M`0`````!2@`(``````@`;`L6"0P-X`(```$```$!`20`3`$``````4P`"```
    -M```(`&P+%@D,#>`"```!```!`@!!````````````````````````````````
    -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`````````````````````````````````````````"(`3`$``````4P`"```
    -M```(`&P+%@D,#>`"```!```!`0`B`$L!``````%+``@`````"`!L"Q8)#`W@
    -M`@```0```0$!)`!-`0`````!30`(``````@`;`L6"0P-X`(```$```$"`$$`
    -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````````````(@!-`0`````!30`(``````@`;`L6"0P-X`(```$```$!`"(`
    -M3`$``````4P`"``````(`&P+%@D,#>`"```!```!`0$D`$X!``````%.``@`
    -M````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````B`$X!``````%.``@`
    -M````"`!L"Q8)#`W@`@```0```0$`(@!-`0`````!30`(``````@`;`L6"0P-
    -MX`(```$```$!`20`3P$``````4\`"``````(`&P+%@D,#>`"```!```!`@!!
    -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`````````````"(`3P$``````4\`"``````(`&P+%@D,#>`"```!```!`0`B
    -M`$X!``````%.``@`````"`!L"Q8)#`W@`@```0```0$!)`!0`0`````!4``(
    -M``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````````
    -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````````````````````````````````````````````(@!0`0`````!4``(
    -M``````@`;`L6"0P-X`(```$```$!`"(`3P$``````4\`"``````(`&P+%@D,
    -M#>`"```!```!`0$D`%$!``````%1``@`````"`!L"Q8)#`W@`@```0```0(`
    -M00``````````````````````````````````````````````````````````
    -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```````````````B`%$!``````%1``@`````"`!L"Q8)#`W@`@```0```0$`
    -M(@!0`0`````!4``(``````@`;`L6"0P-X`(```$```$!`20`4@$``````5(`
    -M"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````````
    -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`````````````````````````````````````````````"(`4@$``````5(`
    -M"``````(`&P+%@D,#>`"```!```!`0`B`%$!``````%1``@`````"`!L"Q8)
    -M#`W@`@```0```0$!)`!3`0`````!4P`(``````@`;`L6"0P-X`(```$```$"
    -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````````````````(@!3`0`````!4P`(``````@`;`L6"0P-X`(```$```$!
    -M`"(`4@$``````5(`"``````(`&P+%@D,#>`"```!```!`0$D`%0!``````%4
    -M``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````B`%0!``````%4
    -M``@`````"`!L"Q8)#`W@`@```0```0$`(@!3`0`````!4P`(``````@`;`L6
    -M"0P-X`(```$```$!`20`50$``````54`"``````(`&P+%@D,#>`"```!```!
    -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`````````````````"(`50$``````54`"``````(`&P+%@D,#>`"```!```!
    -M`0`B`%0!``````%4``@`````"`!L"Q8)#`W@`@```0```0$!)`!6`0`````!
    -M5@`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````
    -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````````````````````````````````````````````````(@!6`0`````!
    -M5@`(``````@`;`L6"0P-X`(```$```$!`"(`50$``````54`"``````(`&P+
    -M%@D,#>`"```!```!`0$D`%`"```!```!`@!!````````````````````````
    -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`````````````````````````````````````````````````"(`6`$`````
    -M`5@`"``````(`&P+%@D,#>`"```!```!`0`B`%`"```!```!`0$D`%H!````
    -M``%:``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````B`%H!````
    -M``%:``@`````"`!L"Q8)#`W@`@```0```0$`(@!9`0`````!60`(``````@`
    -M;`L6"0P-X`(```$```$!`20`6P$``````5L`"``````(`&P+%@D,#>`"```!
    -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`````````````````````"(`6P$``````5L`"``````(`&P+%@D,#>`"```!
    -M```!`0`B`%H!``````%:``@`````"`!L"Q8)#`W@`@```0```0$!)`!<`0``
    -M```!7``(``````@`;`L6"0P-X`(```$```$"`$$`````````````````````
    -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````````````````````````````````````````````````````(@!<`0``
    -M```!7``(``````@`;`L6"0P-X`(```$```$!`"(`6P$``````5L`"``````(
    -M`&P+%@D,#>`"```!```!`0$D`%T!``````%=``@`````"`!L"Q8)#`W@`@``
    -M`0```0(`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```````````````````````B`%T!``````%=``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`(@!<`0`````!7``(``````@`;`L6"0P-X`(```$```$!`20`7@$`
    -M`````5X`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````
    -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`````````````````````````````````````````````````````"(`7@$`
    -M`````5X`"``````(`&P+%@D,#>`"```!```!`0`B`%T!``````%=``@`````
    -M"`!L"Q8)#`W@`@```0```0$!)`!?`0`````!7P`(``````@`;`L6"0P-X`(`
    -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````````````````````````(@!?`0`````!7P`(``````@`;`L6"0P-X`(`
    -M``$```$!`"(`7@$``````5X`"``````(`&P+%@D,#>`"```!```!`0$D`&`!
    -M``````%@``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````B`&`!
    -M``````%@``@`````"`!L"Q8)#`W@`@```0```0$`(@!?`0`````!7P`(````
    -M``@`;`L6"0P-X`(```$```$!`20`80$``````6$`"``````(`&P+%@D,#>`"
    -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`````````````````````````"(`80$``````6$`"``````(`&P+%@D,#>`"
    -M```!```!`0`B`&`!``````%@``@`````"`!L"Q8)#`W@`@```0```0$!)`!B
    -M`0`````!8@`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````
    -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````````````````````````````````````````````````````````(@!B
    -M`0`````!8@`(``````@`;`L6"0P-X`(```$```$!`"(`80$``````6$`"```
    -M```(`&P+%@D,#>`"```!```!`0$D`&,!``````%C``@`````"`!L"Q8)#`W@
    -M`@```0```0(`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```````````````````````````B`&,!``````%C``@`````"`!L"Q8)#`W@
    -M`@```0```0$`(@!B`0`````!8@`(``````@`;`L6"0P-X`(```$```$!`20`
    -M9`$``````60`"``````(`&P+%@D,#>`"```!```!`@!!````````````````
    -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`````````````````````````````````````````````````````````"(`
    -M9`$``````60`"``````(`&P+%@D,#>`"```!```!`0`B`&,!``````%C``@`
    -M````"`!L"Q8)#`W@`@```0```0$!)`!E`0`````!90`(``````@`;`L6"0P-
    -MX`(```$```$"`$$`````````````````````````````````````````````
    -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````````````````````````````(@!E`0`````!90`(``````@`;`L6"0P-
    -MX`(```$```$!`"(`9`$``````60`"``````(`&P+%@D,#>`"```!```!`0$D
    -M`&8!``````%F``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````````B
    -M`&8!``````%F``@`````"`!L"Q8)#`W@`@```0```0$`(@!E`0`````!90`(
    -M``````@`;`L6"0P-X`(```$```$!`20`9P$``````6<`"``````(`&P+%@D,
    -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`````````````````````````````"(`9P$``````6<`"``````(`&P+%@D,
    -M#>`"```!```!`0`B`&8!``````%F``@`````"`!L"Q8)#`W@`@```0```0$!
    -M)`!H`0`````!:``(``````@`;`L6"0P-X`(```$```$"`$$`````````````
    -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(@!H`0`````!:``(``````@`;`L6"0P-X`(```$```$!`"(`9P$``````6<`
    -M"``````(`&P+%@D,#>`"```!```!`0$D`&D!``````%I``@`````"`!L"Q8)
    -M#`W@`@```0```0(`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```````````````````````````````B`&D!``````%I``@`````"`!L"Q8)
    -M#`W@`@```0```0$`(@!H`0`````!:``(``````@`;`L6"0P-X`(```$```$!
    -M`20`:@$``````6H`"``````(`&P+%@D,#>`"```!```!`@!!````````````
    -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`"(`:@$``````6H`"``````(`&P+%@D,#>`"```!```!`0`B`&D!``````%I
    -M``@`````"`!L"Q8)#`W@`@```0```0$!)`!K`0`````!:P`(``````@`;`L6
    -M"0P-X`(```$```$"`$$`````````````````````````````````````````
    -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````````````````````````````````(@!K`0`````!:P`(``````@`;`L6
    -M"0P-X`(```$```$!`"(`:@$``````6H`"``````(`&P+%@D,#>`"```!```!
    -M`0$D`&P!``````%L``@`````"`!L"Q8)#`W@`@```0```0(`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```B`&P!``````%L``@`````"`!L"Q8)#`W@`@```0```0$`(@!K`0`````!
    -M:P`(``````@`;`L6"0P-X`(```$```$!`20`;0$``````6T`"``````(`&P+
    -M%@D,#>`"```!```!`@!!````````````````````````````````````````
    -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`````````````````````````````````"(`;0$``````6T`"``````(`&P+
    -M%@D,#>`"```!```!`0`B`&P!``````%L``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!)`!N`0`````!;@`(``````@`;`L6"0P-X`(```$```$"`$$`````````
    -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````(@!N`0`````!;@`(``````@`;`L6"0P-X`(```$```$!`"(`;0$`````
    -M`6T`"``````(`&P+%@D,#>`"```!```!`0$D`&\!``````%O``@`````"`!L
    -M"Q8)#`W@`@```0```0(`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```````````````````````````````````B`&\!``````%O``@`````"`!L
    -M"Q8)#`W@`@```0```0$`(@!N`0`````!;@`(``````@`;`L6"0P-X`(```$`
    -M``$!`20`<`$``````7``"``````(`&P+%@D,#>`"```!```!`@!!````````
    -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`````"(`<`$``````7``"``````(`&P+%@D,#>`"```!```!`0`B`&\!````
    -M``%O``@`````"`!L"Q8)#`W@`@```0```0$!)`!Q`0`````!<0`(``````@`
    -M;`L6"0P-X`(```$```$"`$$`````````````````````````````````````
    -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````````````````````````````````````(@!Q`0`````!<0`(``````@`
    -M;`L6"0P-X`(```$```$!`"(`<`$``````7``"``````(`&P+%@D,#>`"```!
    -M```!`0$D`'(!``````%R``@`````"`!L"Q8)#`W@`@```0```0(`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```````B`'(!``````%R``@`````"`!L"Q8)#`W@`@```0```0$`(@!Q`0``
    -M```!<0`(``````@`;`L6"0P-X`(```$```$!`20``"```!```!`@!!````````````````````````````````````
    -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`````````````````````````````````````"(``"```!```!`0`B`'(!``````%R``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!)`!T`0`````!=``(``````@`;`L6"0P-X`(```$```$"`$$`````
    -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````````(@!T`0`````!=``(``````@`;`L6"0P-X`(```$```$!`"(``"```!```!`0$D`'4!``````%U``@`````
    -M"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````B`'4!``````%U``@`````
    -M"`!L"Q8)#`W@`@```0```0$`(@!T`0`````!=``(``````@`;`L6"0P-X`(`
    -M``$```$!`20`=@$``````78`"``````(`&P+%@D,#>`"```!```!`@!!````
    -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`````````"(`=@$``````78`"``````(`&P+%@D,#>`"```!```!`0`B`'4!
    -M``````%U``@`````"`!L"Q8)#`W@`@```0```0$!)`!W`0`````!=P`(````
    -M``@`;`L6"0P-X`(```$```$"`$$`````````````````````````````````
    -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````````````````````````````````````````(@!W`0`````!=P`(````
    -M``@`;`L6"0P-X`(```$```$!`"(`=@$``````78`"``````(`&P+%@D,#>`"
    -M```!```!`0$D`'@!``````%X``@`````"`!L"Q8)#`W@`@```0```0(`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```````````B`'@!``````%X``@`````"`!L"Q8)#`W@`@```0```0$`(@!W
    -M`0`````!=P`(``````@`;`L6"0P-X`(```$```$!`20`>0$``````7D`"```
    -M```(`&P+%@D,#>`"```!```!`@!!````````````````````````````````
    -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`````````````````````````````````````````"(`>0$``````7D`"```
    -M```(`&P+%@D,#>`"```!```!`0`B`'@!``````%X``@`````"`!L"Q8)#`W@
    -M`@```0```0$!)`!Z`0`````!>@`(``````@`;`L6"0P-X`(```$```$"`$$`
    -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````````````(@!Z`0`````!>@`(``````@`;`L6"0P-X`(```$```$!`"(`
    -M>0$``````7D`"``````(`&P+%@D,#>`"```!```!`0$D`'L!``````%[``@`
    -M````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````B`'L!``````%[``@`
    -M````"`!L"Q8)#`W@`@```0```0$`(@!Z`0`````!>@`(``````@`;`L6"0P-
    -MX`(```$```$!`20`?`$``````7P`"``````(`&P+%@D,#>`"```!```!`@!!
    -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`````````````"(`?`$``````7P`"``````(`&P+%@D,#>`"```!```!`0`B
    -M`'L!``````%[``@`````"`!L"Q8)#`W@`@```0```0$!)`!]`0`````!?0`(
    -M``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````````
    -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````````````````````````````````````````````(@!]`0`````!?0`(
    -M``````@`;`L6"0P-X`(```$```$!`"(`?`$``````7P`"``````(`&P+%@D,
    -M#>`"```!```!`0$D`'X!``````%^``@`````"`!L"Q8)#`W@`@```0```0(`
    -M00``````````````````````````````````````````````````````````
    -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```````````````B`'X!``````%^``@`````"`!L"Q8)#`W@`@```0```0$`
    -M(@!]`0`````!?0`(``````@`;`L6"0P-X`(```$```$!`20`?P$``````7\`
    -M"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````````
    -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`````````````````````````````````````````````"(`?P$``````7\`
    -M"``````(`&P+%@D,#>`"```!```!`0`B`'X!``````%^``@`````"`!L"Q8)
    -M#`W@`@```0```0$!)`"``0`````!@``(``````@`;`L6"0P-X`(```$```$"
    -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````````````````(@"``0`````!@``(``````@`;`L6"0P-X`(```$```$!
    -M`"(`?P$``````7\`"``````(`&P+%@D,#>`"```!```!`0$D`($!``````&!
    -M``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````B`($!``````&!
    -M``@`````"`!L"Q8)#`W@`@```0```0$`(@"``0`````!@``(``````@`;`L6
    -M"0P-X`(```$```$!`20`@@$``````8(`"``````(`&P+%@D,#>`"```!```!
    -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`````````````````"(`@@$``````8(`"``````(`&P+%@D,#>`"```!```!
    -M`0`B`($!``````&!``@`````"`!L"Q8)#`W@`@```0```0$!)`"#`0`````!
    -M@P`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````
    -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````````````````````````````````````````````````(@"#`0`````!
    -M@P`(``````@`;`L6"0P-X`(```$```$!`"(`@@$``````8(`"``````(`&P+
    -M%@D,#>`"```!```!`0$D`(0!``````&$``@`````"`!L"Q8)#`W@`@```0``
    -M`0(`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```````````````````B`(0!``````&$``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`(@"#`0`````!@P`(``````@`;`L6"0P-X`(```$```$!`20`A0$`````
    -M`84`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````
    -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`````````````````````````````````````````````````"(`A0$`````
    -M`84`"``````(`&P+%@D,#>`"```!```!`0`B`(0!``````&$``@`````"`!L
    -M"Q8)#`W@`@```0```0$!)`"&`0`````!A@`(``````@`;`L6"0P-X`(```$`
    -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````````````````````(@"&`0`````!A@`(``````@`;`L6"0P-X`(```$`
    -M``$!`"(`A0$``````84`"``````(`&P+%@D,#>`"```!```!`0$D`(`"```!
    -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`````````````````````"(`B`$``````8@`"``````(`&P+%@D,#>`"```!
    -M```!`0`B`(`"```!```!`0$D`(H!``````&*``@`````"`!L"Q8)#`W@`@``
    -M`0```0(`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```````````````````````B`(H!``````&*``@`````"`!L"Q8)#`W@`@``
    -M`0```0$`(@")`0`````!B0`(``````@`;`L6"0P-X`(```$```$!`20`BP$`
    -M`````8L`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````
    -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`````````````````````````````````````````````````````"(`BP$`
    -M`````8L`"``````(`&P+%@D,#>`"```!```!`0`B`(H!``````&*``@`````
    -M"`!L"Q8)#`W@`@```0```0$!)`",`0`````!C``(``````@`;`L6"0P-X`(`
    -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````````````````````````(@",`0`````!C``(``````@`;`L6"0P-X`(`
    -M``$```$!`"(`BP$``````8L`"``````(`&P+%@D,#>`"```!```!`0$D`(T!
    -M``````&-``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````B`(T!
    -M``````&-``@`````"`!L"Q8)#`W@`@```0```0$`(@",`0`````!C``(````
    -M``@`;`L6"0P-X`(```$```$!`20`C@$``````8X`"``````(`&P+%@D,#>`"
    -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`````````````````````````"(`C@$``````8X`"``````(`&P+%@D,#>`"
    -M```!```!`0`B`(T!``````&-``@`````"`!L"Q8)#`W@`@```0```0$!)`"/
    -M`0`````!CP`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````
    -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`0`````!CP`(``````@`;`L6"0P-X`(```$```$!`"(`C@$``````8X`"```
    -M```(`&P+%@D,#>`"```!```!`0$D`)`!``````&0``@`````"`!L"Q8)#`W@
    -M`@```0```0(`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```````````````````````````B`)`!``````&0``@`````"`!L"Q8)#`W@
    -M`@```0```0$`(@"/`0`````!CP`(``````@`;`L6"0P-X`(```$```$!`20`
    -MD0$``````9$`"``````(`&P+%@D,#>`"```!```!`@!!````````````````
    -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`````````````````````````````````````````````````````````"(`
    -MD0$``````9$`"``````(`&P+%@D,#>`"```!```!`0`B`)`!``````&0``@`
    -M````"`!L"Q8)#`W@`@```0```0$!)`"2`0`````!D@`(``````@`;`L6"0P-
    -MX`(```$```$"`$$`````````````````````````````````````````````
    -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````````````````````````````(@"2`0`````!D@`(``````@`;`L6"0P-
    -MX`(```$```$!`"(`D0$``````9$`"``````(`&P+%@D,#>`"```!```!`0$D
    -M`),!``````&3``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````````````B
    -M`),!``````&3``@`````"`!L"Q8)#`W@`@```0```0$`(@"2`0`````!D@`(
    -M``````@`;`L6"0P-X`(```$```$!`20`E`$``````90`"``````(`&P+%@D,
    -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`````````````````````````````"(`E`$``````90`"``````(`&P+%@D,
    -M#>`"```!```!`0`B`),!``````&3``@`````"`!L"Q8)#`W@`@```0```0$!
    -M)`"5`0`````!E0`(``````@`;`L6"0P-X`(```$```$"`$$`````````````
    -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(@"5`0`````!E0`(``````@`;`L6"0P-X`(```$```$!`"(`E`$``````90`
    -M"``````(`&P+%@D,#>`"```!```!`0$D`)8!``````&6``@`````"`!L"Q8)
    -M#`W@`@```0```0(`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```````````````````````````````B`)8!``````&6``@`````"`!L"Q8)
    -M#`W@`@```0```0$`(@"5`0`````!E0`(``````@`;`L6"0P-X`(```$```$!
    -M`20`EP$``````9<`"``````(`&P+%@D,#>`"```!```!`@!!````````````
    -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`"(`EP$``````9<`"``````(`&P+%@D,#>`"```!```!`0`B`)8!``````&6
    -M``@`````"`!L"Q8)#`W@`@```0```0$!)`"8`0`````!F``(``````@`;`L6
    -M"0P-X`(```$```$"`$$`````````````````````````````````````````
    -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````````````````````````````````(@"8`0`````!F``(``````@`;`L6
    -M"0P-X`(```$```$!`"(`EP$``````9<`"``````(`&P+%@D,#>`"```!```!
    -M`0$D`)D!``````&9``@`````"`!L"Q8)#`W@`@```0```0(`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```B`)D!``````&9``@`````"`!L"Q8)#`W@`@```0```0$`(@"8`0`````!
    -MF``(``````@`;`L6"0P-X`(```$```$!`20`F@$``````9H`"``````(`&P+
    -M%@D,#>`"```!```!`@!!````````````````````````````````````````
    -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`````````````````````````````````"(`F@$``````9H`"``````(`&P+
    -M%@D,#>`"```!```!`0`B`)D!``````&9``@`````"`!L"Q8)#`W@`@```0``
    -M`0$!)`";`0`````!FP`(``````@`;`L6"0P-X`(```$```$"`$$`````````
    -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````(@";`0`````!FP`(``````@`;`L6"0P-X`(```$```$!`"(`F@$`````
    -M`9H`"``````(`&P+%@D,#>`"```!```!`0$D`)P!``````&<``@`````"`!L
    -M"Q8)#`W@`@```0```0(`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```````````````````````````````````B`)P!``````&<``@`````"`!L
    -M"Q8)#`W@`@```0```0$`(@";`0`````!FP`(``````@`;`L6"0P-X`(```$`
    -M``$!`20`G0$``````9T`"``````(`&P+%@D,#>`"```!```!`@!!````````
    -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`````"(`G0$``````9T`"``````(`&P+%@D,#>`"```!```!`0`B`)P!````
    -M``&<``@`````"`!L"Q8)#`W@`@```0```0$!)`">`0`````!G@`(``````@`
    -M;`L6"0P-X`(```$```$"`$$`````````````````````````````````````
    -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````````````````````````````````````(@">`0`````!G@`(``````@`
    -M;`L6"0P-X`(```$```$!`"(`G0$``````9T`"``````(`&P+%@D,#>`"```!
    -M```!`0$D`)\!``````&?``@`````"`!L"Q8)#`W@`@```0```0(`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```````B`)\!``````&?``@`````"`!L"Q8)#`W@`@```0```0$`(@">`0``
    -M```!G@`(``````@`;`L6"0P-X`(```$```$!`20`H`$``````:``"``````(
    -M`&P+%@D,#>`"```!```!`@!!````````````````````````````````````
    -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`````````````````````````````````````"(`H`$``````:``"``````(
    -M`&P+%@D,#>`"```!```!`0`B`)\!``````&?``@`````"`!L"Q8)#`W@`@``
    -M`0```0$!)`"A`0`````!H0`(``````@`;`L6"0P-X`(```$```$"`$$`````
    -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````````(@"A`0`````!H0`(``````@`;`L6"0P-X`(```$```$!`"(`H`$`
    -M`````:``"``````(`&P+%@D,#>`"```!```!`0$D`*(!``````&B``@`````
    -M"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````B`*(!``````&B``@`````
    -M"`!L"Q8)#`W@`@```0```0$`(@"A`0`````!H0`(``````@`;`L6"0P-X`(`
    -M``$```$!`20`HP$``````:,`"``````(`&P+%@D,#>`"```!```!`@!!````
    -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`````````"(`HP$``````:,`"``````(`&P+%@D,#>`"```!```!`0`B`*(!
    -M``````&B``@`````"`!L"Q8)#`W@`@```0```0$!)`"D`0`````!I``(````
    -M``@`;`L6"0P-X`(```$```$"`$$`````````````````````````````````
    -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````````````````````````````````````````(@"D`0`````!I``(````
    -M``@`;`L6"0P-X`(```$```$!`"(`HP$``````:,`"``````(`&P+%@D,#>`"
    -M```!```!`0$D`*4!``````&E``@`````"`!L"Q8)#`W@`@```0```0(`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```````````B`*4!``````&E``@`````"`!L"Q8)#`W@`@```0```0$`(@"D
    -M`0`````!I``(``````@`;`L6"0P-X`(```$```$!`20`I@$``````:8`"```
    -M```(`&P+%@D,#>`"```!```!`@!!````````````````````````````````
    -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`````````````````````````````````````````"(`I@$``````:8`"```
    -M```(`&P+%@D,#>`"```!```!`0`B`*4!``````&E``@`````"`!L"Q8)#`W@
    -M`@```0```0$!)`"G`0`````!IP`(``````@`;`L6"0P-X`(```$```$"`$$`
    -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````````````(@"G`0`````!IP`(``````@`;`L6"0P-X`(```$```$!`"(`
    -MI@$``````:8`"``````(`&P+%@D,#>`"```!```!`0$D`*@!``````&H``@`
    -M````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````B`*@!``````&H``@`
    -M````"`!L"Q8)#`W@`@```0```0$`(@"G`0`````!IP`(``````@`;`L6"0P-
    -MX`(```$```$!`20`J0$``````:D`"``````(`&P+%@D,#>`"```!```!`@!!
    -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`````````````"(`J0$``````:D`"``````(`&P+%@D,#>`"```!```!`0`B
    -M`*@!``````&H``@`````"`!L"Q8)#`W@`@```0```0$!)`"J`0`````!J@`(
    -M``````@`;`L6"0P-X`(```$```$"`$$`````````````````````````````
    -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````````````````````````````````````````````(@"J`0`````!J@`(
    -M``````@`;`L6"0P-X`(```$```$!`"(`J0$``````:D`"``````(`&P+%@D,
    -M#>`"```!```!`0$D`*L!``````&K``@`````"`!L"Q8)#`W@`@```0```0(`
    -M00``````````````````````````````````````````````````````````
    -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```````````````B`*L!``````&K``@`````"`!L"Q8)#`W@`@```0```0$`
    -M(@"J`0`````!J@`(``````@`;`L6"0P-X`(```$```$!`20`K`$``````:P`
    -M"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````````
    -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`````````````````````````````````````````````"(`K`$``````:P`
    -M"``````(`&P+%@D,#>`"```!```!`0`B`*L!``````&K``@`````"`!L"Q8)
    -M#`W@`@```0```0$!)`"M`0`````!K0`(``````@`;`L6"0P-X`(```$```$"
    -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`0`````!K0`(``````@`;`L6"0P-X`(```$```$!
    -M`"(`K`$``````:P`"``````(`&P+%@D,#>`"```!```!`0$D`*X!``````&N
    -M``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````B`*X!``````&N
    -M``@`````"`!L"Q8)#`W@`@```0```0$`(@"M`0`````!K0`(``````@`;`L6
    -M"0P-X`(```$```$!`20`KP$``````:\`"``````(`&P+%@D,#>`"```!```!
    -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`````````````````"(`KP$``````:\`"``````(`&P+%@D,#>`"```!```!
    -M`0`B`*X!``````&N``@`````"`!L"Q8)#`W@`@```0```0$!````````````
    -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````````````````````````````````````````````````(@"P`0`````!
    -ML``(``````@`;`L6"0P-X`(```$```$!`"(`[@```````.X`"``````(`&P+
    -M%@D,#>`"```!```!`0$D`+$!``````&Q``@`````"`!L"Q8)#`W@`@```0``
    -M`0(`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```````````````````B`+$!``````&Q``@`````"`!L"Q8)#`W@`@```0``
    -M`0$`(@"P`0`````!L``(``````@`;`L6"0P-X`(```$```$!`20`L@$`````
    -M`;(`"``````(`&P+%@D,#>`"```!```!`@!!````````````````````````
    -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@$`````
    -M`;(`"``````(`&P+%@D,#>`"```!```!`0`B`+$!``````&Q``@`````"`!L
    -M"Q8)#`W@`@```0```0$!)`"S`0`````!LP`(``````@`;`L6"0P-X`(```$`
    -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````````````````````(@"S`0`````!LP`(``````@`;`L6"0P-X`(```$`
    -M``$!`"(`L@$``````;(`"``````(`&P+%@D,#>`"```!```!`0$D`+0!````
    -M``&T``@`````"`!L"Q8)#`W@`@```0```0(`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```````````````````````````````````````````````````B`+0!````
    -M``&T``@`````"`!L"Q8)#`W@`@```0```0$`(@"S`0`````!LP`(``````@`
    -M;`L6"0P-X`(```$```$!`20`M0$``````;4`"``````(`&P+%@D,#>`"```!
    -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`````````````````````"(`M0$``````;4`"``````(`&P+%@D,#>`"```!
    -M```!`0`B`+0!``````&T``@`````"`!L"Q8)#`W@`@```0```0$!)`"V`0``
    -M```!M@`(``````@`;`L6"0P-X`(```$```$"`$$`````````````````````
    -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````````````````````````````````````````````````````(@"V`0``
    -M```!M@`(``````@`;`L6"0P-X`(```$```$!`"(`M0$``````;4`"``````(
    -M`&P+%@D,#>`"```!```!`0$D`.\```````#O``@`````"`!L"Q8)#`W@`@``
    -M`0```0(`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```````````````````````B`+`"```!```!@`!!`$$`00!!`$$`00!!`$$`
    -M00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!
    -M`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`00!!`$$`
    -M00!!`$$`00!!`$$`00!!`$$`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`````````````````````````````````````````````````````"(`N`$`
    -M`````;@`"``````(`&P+%@D,#>`"```!```!`0`B`+`"```!```!`0$`````
    -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``````````````````````````````````````````````````````!%4NT!
    -M"E2'`5)225!?,3DY,4%42$4@4D]#2R!2241'12!)3E1%4D-(04Y'12!04D]4
    -M3T-/3"!04D]6241%4R!355!03U)4($9/4B!03U-)6"!&24Q%(%-94U1%32!3
    -M14U!3E1)0U-03$5!4T4@0T].5$%#5"!$25-#(%!50DQ)4TA%4B!&3U(@4U!%
    -M0TE&24-!5$E/3B!33U520T4N("!3144@4%5"3$E32$52($E$14Y4249)15(@
    -M24X@4%))34%262!63TQ5344@1$530U))4%1/4B!&3U(@0T].5$%#5"!)3D9/
    -M4DU!5$E/3BX`````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -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````````````````````````````````````````````````````````````
    -$````````
    -`
    -end
    diff --git a/lib/libarchive/test/test_open_fd.c b/lib/libarchive/test/test_open_fd.c
    index 0aec1d5e9fcf..7551dd01a168 100644
    --- a/lib/libarchive/test/test_open_fd.c
    +++ b/lib/libarchive/test/test_open_fd.c
    @@ -25,6 +25,13 @@
     #include "test.h"
     __FBSDID("$FreeBSD$");
     
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +#define open _open
    +#if !defined(__BORLANDC__)
    +#define lseek _lseek
    +#endif
    +#define close _close
    +#endif
     
     DEFINE_TEST(test_open_fd)
     {
    @@ -33,7 +40,11 @@ DEFINE_TEST(test_open_fd)
     	struct archive *a;
     	int fd;
     
    -	fd = open("test.tar", O_RDWR | O_CREAT, 0777);
    +#if defined(__BORLANDC__)
    +	fd = open("test.tar", O_RDWR | O_CREAT | O_BINARY);
    +#else
    +	fd = open("test.tar", O_RDWR | O_CREAT | O_BINARY, 0777);
    +#endif
     	assert(fd >= 0);
     	if (fd < 0)
     		return;
    diff --git a/lib/libarchive/test/test_open_file.c b/lib/libarchive/test/test_open_file.c
    index e931163de21a..7e6c5719a260 100644
    --- a/lib/libarchive/test/test_open_file.c
    +++ b/lib/libarchive/test/test_open_file.c
    @@ -32,7 +32,7 @@ DEFINE_TEST(test_open_file)
     	struct archive *a;
     	FILE *f;
     
    -	f = fopen("test.tar", "w");
    +	f = fopen("test.tar", "wb");
     	assert(f != NULL);
     	if (f == NULL)
     		return;
    @@ -73,7 +73,7 @@ DEFINE_TEST(test_open_file)
     	/*
     	 * Now, read the data back.
     	 */
    -	f = fopen("test.tar", "r");
    +	f = fopen("test.tar", "rb");
     	assert(f != NULL);
     	if (f == NULL)
     		return;
    diff --git a/lib/libarchive/test/test_pax_filename_encoding.c b/lib/libarchive/test/test_pax_filename_encoding.c
    index 45f984839caf..5affe9f3915f 100644
    --- a/lib/libarchive/test/test_pax_filename_encoding.c
    +++ b/lib/libarchive/test/test_pax_filename_encoding.c
    @@ -107,9 +107,10 @@ test_pax_filename_encoding_2(void)
     	 * de_DE.UTF-8 seems to be commonly supported.
     	 */
     	/* If it doesn't exist, just warn and return. */
    -	if (NULL == setlocale(LC_ALL, LOCALE_DE)) {
    +	if (LOCALE_UTF8 == NULL
    +	    || NULL == setlocale(LC_ALL, LOCALE_UTF8)) {
     		skipping("invalid encoding tests require a suitable locale;"
    -		    " %s not available on this system", LOCALE_DE);
    +		    " %s not available on this system", LOCALE_UTF8);
     		return;
     	}
     
    @@ -151,11 +152,7 @@ test_pax_filename_encoding_2(void)
     	archive_entry_free(entry);
     
     	assertEqualInt(0, archive_write_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_write_finish(a);
    -#else
     	assertEqualInt(0, archive_write_finish(a));
    -#endif
     
     	/*
     	 * Now read the entries back.
    @@ -181,11 +178,7 @@ test_pax_filename_encoding_2(void)
     	assertEqualString(longname, archive_entry_pathname(entry));
     
     	assertEqualInt(0, archive_read_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_read_finish(a);
    -#else
     	assertEqualInt(0, archive_read_finish(a));
    -#endif
     }
     
     /*
    @@ -227,6 +220,15 @@ test_pax_filename_encoding_3(void)
     		return;
     	}
     
    +	/* Skip test if archive_entry_update_pathname_utf8() is broken. */
    +	/* In particular, this is currently broken on Win32 because
    +	 * setlocale() does not set the default encoding for CP_ACP. */
    +	entry = archive_entry_new();
    +	if (archive_entry_update_pathname_utf8(entry, badname_utf8)) {
    +		skipping("Cannot test conversion failures.");
    +		return;
    +	}
    +
     	assert((a = archive_write_new()) != NULL);
     	assertEqualIntA(a, 0, archive_write_set_format_pax(a));
     	assertEqualIntA(a, 0, archive_write_set_compression_none(a));
    @@ -274,11 +276,7 @@ test_pax_filename_encoding_3(void)
     	archive_entry_free(entry);
     
     	assertEqualInt(0, archive_write_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_write_finish(a);
    -#else
     	assertEqualInt(0, archive_write_finish(a));
    -#endif
     
     	/*
     	 * Now read the entries back.
    @@ -322,11 +320,7 @@ test_pax_filename_encoding_3(void)
     	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &entry));
     
     	assertEqualInt(0, archive_read_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_read_finish(a);
    -#else
     	assertEqualInt(0, archive_read_finish(a));
    -#endif
     }
     
     DEFINE_TEST(test_pax_filename_encoding)
    diff --git a/lib/libarchive/test/test_read_compress_program.c b/lib/libarchive/test/test_read_compress_program.c
    index 042c6159c486..12e6afc2cc12 100644
    --- a/lib/libarchive/test/test_read_compress_program.c
    +++ b/lib/libarchive/test/test_read_compress_program.c
    @@ -37,7 +37,6 @@ DEFINE_TEST(test_read_compress_program)
     	int r;
     	struct archive_entry *ae;
     	struct archive *a;
    -	const char *extprog;
     
     	/*
     	 * First, test handling when a non-existent compression
    @@ -53,26 +52,23 @@ DEFINE_TEST(test_read_compress_program)
     	assertEqualIntA(a, ARCHIVE_OK, r);
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_support_format_all(a));
    -	assertEqualIntA(a, ARCHIVE_OK,
    -	    archive_read_open_memory(a, archive, sizeof(archive)));
     	assertEqualIntA(a, ARCHIVE_FATAL,
    -	    archive_read_next_header(a, &ae));
    -	assertEqualIntA(a, ARCHIVE_WARN, archive_read_close(a));
    +	    archive_read_open_memory(a, archive, sizeof(archive)));
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
     	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
     
     	/*
     	 * If we have "gzip -d", try using that.
     	 */
    -	if ((extprog = external_gzip_program(1)) == NULL) {
    -		skipping("There is no gzip uncompression "
    -		    "program in this platform");
    +	if (!canGunzip()) {
    +		skipping("Can't run gunzip program on this platform");
     		return;
     	}
     	assert((a = archive_read_new()) != NULL);
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_support_compression_none(a));
     	assertEqualIntA(a, ARCHIVE_OK,
    -	    archive_read_support_compression_program(a, extprog));
    +	    archive_read_support_compression_program(a, "gunzip"));
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_support_format_all(a));
     	assertEqualIntA(a, ARCHIVE_OK,
    diff --git a/lib/libarchive/test/test_read_data_large.c b/lib/libarchive/test/test_read_data_large.c
    index 76b9e1283783..ecacf65e7e9e 100644
    --- a/lib/libarchive/test/test_read_data_large.c
    +++ b/lib/libarchive/test/test_read_data_large.c
    @@ -33,6 +33,11 @@ __FBSDID("$FreeBSD$");
      * had a bug relating to this, fixed in Nov 2006).
      */
     
    +#if defined(_WIN32) && !defined(__CYGWIN__)
    +#define open _open
    +#define close _close
    +#endif
    +
     char buff1[11000000];
     char buff2[10000000];
     char buff3[10000000];
    @@ -43,6 +48,7 @@ DEFINE_TEST(test_read_data_large)
     	struct archive *a;
     	char tmpfilename[] = "largefile";
     	int tmpfilefd;
    +	FILE *f;
     	unsigned int i;
     	size_t used;
     
    @@ -96,7 +102,11 @@ DEFINE_TEST(test_read_data_large)
     	assertA(0 == archive_read_support_compression_all(a));
     	assertA(0 == archive_read_open_memory(a, buff1, sizeof(buff1)));
     	assertA(0 == archive_read_next_header(a, &ae));
    -	tmpfilefd = open(tmpfilename, O_WRONLY | O_CREAT, 0777);
    +#if defined(__BORLANDC__)
    +	tmpfilefd = open(tmpfilename, O_WRONLY | O_CREAT | O_BINARY);
    +#else
    +	tmpfilefd = open(tmpfilename, O_WRONLY | O_CREAT | O_BINARY, 0777);
    +#endif
     	assert(tmpfilefd != 0);
     	assertEqualIntA(a, 0, archive_read_data_into_fd(a, tmpfilefd));
     	assert(0 == archive_read_close(a));
    @@ -107,11 +117,9 @@ DEFINE_TEST(test_read_data_large)
     #endif
     	close(tmpfilefd);
     
    -	tmpfilefd = open(tmpfilename, O_RDONLY);
    -	assert(tmpfilefd != 0);
    -	assertEqualIntA(NULL, sizeof(buff3), read(tmpfilefd, buff3, sizeof(buff3)));
    -	close(tmpfilefd);
    +	f = fopen(tmpfilename, "rb");
    +	assert(f != NULL);
    +	assertEqualInt(sizeof(buff3), fread(buff3, 1, sizeof(buff3), f));
    +	fclose(f);
     	assert(0 == memcmp(buff2, buff3, sizeof(buff3)));
    -
    -	unlink(tmpfilename);
     }
    diff --git a/lib/libarchive/test/test_read_disk.c b/lib/libarchive/test/test_read_disk.c
    index cd87c5ba39cd..5666656d5389 100644
    --- a/lib/libarchive/test/test_read_disk.c
    +++ b/lib/libarchive/test/test_read_disk.c
    @@ -111,8 +111,10 @@ DEFINE_TEST(test_read_disk)
     	if (archive_read_disk_set_standard_lookup(a) != ARCHIVE_OK) {
     		skipping("standard uname/gname lookup");
     	} else {
    -#if defined(__CYGWIN__)
    -		skipping("standard uname/gname lookup; typically no user with uid=0 on cygwin platform");
    +#if defined(__CYGWIN__) || defined(__HAIKU__)
    +		/* Some platforms don't have predictable names for
    +		 * uid=0, so we skip this part of the test. */
    +		skipping("standard uname/gname lookup");
     		i = 0;
     		p = zero_groups[0]; /* avoid unused warnings */
     #else
    diff --git a/lib/libarchive/test/test_read_disk_entry_from_file.c b/lib/libarchive/test/test_read_disk_entry_from_file.c
    index 8b3b6d79c560..652b5e4a590b 100644
    --- a/lib/libarchive/test/test_read_disk_entry_from_file.c
    +++ b/lib/libarchive/test/test_read_disk_entry_from_file.c
    @@ -45,7 +45,7 @@ DEFINE_TEST(test_read_disk_entry_from_file)
     {
     	struct archive *a;
     	struct archive_entry *entry;
    -	int fd;
    +	FILE *f;
     
     	assert((a = archive_read_disk_new()) != NULL);
     
    @@ -57,10 +57,10 @@ DEFINE_TEST(test_read_disk_entry_from_file)
     	assertEqualString(archive_read_disk_gname(a, 0), "FOOGROUP");
     
     	/* Create a file on disk. */
    -	fd = open("foo", O_WRONLY | O_CREAT, 0777);
    -	assert(fd >= 0);
    -	assertEqualInt(4, write(fd, "1234", 4));
    -	close(fd);
    +	f = fopen("foo", "wb");
    +	assert(f != NULL);
    +	assertEqualInt(4, fwrite("1234", 1, 4, f));
    +	fclose(f);
     
     	/* Use archive_read_disk_entry_from_file to get information about it. */
     	entry = archive_entry_new();
    diff --git a/lib/libarchive/test/test_read_extract.c b/lib/libarchive/test/test_read_extract.c
    index 887ddfde6852..10bd014ac1ed 100644
    --- a/lib/libarchive/test/test_read_extract.c
    +++ b/lib/libarchive/test/test_read_extract.c
    @@ -32,22 +32,15 @@ DEFINE_TEST(test_read_extract)
     {
     	struct archive_entry *ae;
     	struct archive *a;
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -	struct stat st;
    -#endif
     	size_t used;
    -	int i;
    +	int i, numEntries = 0;
     	char *buff, *file_buff;
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -	int fd;
    -	ssize_t bytes_read;
    -#endif
     
     	buff = malloc(BUFF_SIZE);
     	file_buff = malloc(FILE_BUFF_SIZE);
     
     	/* Force the umask to something predictable. */
    -	umask(022);
    +	assertUmask(022);
     
     	/* Create a new archive in memory containing various types of entries. */
     	assert((a = archive_write_new()) != NULL);
    @@ -55,12 +48,14 @@ DEFINE_TEST(test_read_extract)
     	assertA(0 == archive_write_set_compression_none(a));
     	assertA(0 == archive_write_open_memory(a, buff, BUFF_SIZE, &used));
     	/* A directory to be restored with EXTRACT_PERM. */
    +	++numEntries;
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "dir_0775");
     	archive_entry_set_mode(ae, S_IFDIR | 0775);
     	assertA(0 == archive_write_header(a, ae));
     	archive_entry_free(ae);
     	/* A regular file. */
    +	++numEntries;
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "file");
     	archive_entry_set_mode(ae, S_IFREG | 0755);
    @@ -71,49 +66,53 @@ DEFINE_TEST(test_read_extract)
     	assertA(FILE_BUFF_SIZE == archive_write_data(a, file_buff, FILE_BUFF_SIZE));
     	archive_entry_free(ae);
     	/* A directory that should obey umask when restored. */
    +	++numEntries;
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "dir");
     	archive_entry_set_mode(ae, S_IFDIR | 0777);
     	assertA(0 == archive_write_header(a, ae));
     	archive_entry_free(ae);
     	/* A file in the directory. */
    +	++numEntries;
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "dir/file");
     	archive_entry_set_mode(ae, S_IFREG | 0700);
     	assertA(0 == archive_write_header(a, ae));
     	archive_entry_free(ae);
     	/* A file in a dir that is not already in the archive. */
    +	++numEntries;
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "dir2/file");
     	archive_entry_set_mode(ae, S_IFREG | 0000);
     	assertA(0 == archive_write_header(a, ae));
     	archive_entry_free(ae);
     	/* A dir with a trailing /. */
    +	++numEntries;
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "dir3/.");
     	archive_entry_set_mode(ae, S_IFDIR | 0710);
     	assertA(0 == archive_write_header(a, ae));
     	archive_entry_free(ae);
     	/* Multiple dirs with a single entry. */
    +	++numEntries;
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "dir4/a/../b/../c/");
     	archive_entry_set_mode(ae, S_IFDIR | 0711);
     	assertA(0 == archive_write_header(a, ae));
     	archive_entry_free(ae);
     	/* A symlink. */
    -	assert((ae = archive_entry_new()) != NULL);
    -	archive_entry_copy_pathname(ae, "symlink");
    -	archive_entry_set_mode(ae, S_IFLNK | 0755);
    -	archive_entry_set_symlink(ae, "file");
    -	assertA(0 == archive_write_header(a, ae));
    -	archive_entry_free(ae);
    +	if (canSymlink()) {
    +		++numEntries;
    +		assert((ae = archive_entry_new()) != NULL);
    +		archive_entry_copy_pathname(ae, "symlink");
    +		archive_entry_set_mode(ae, AE_IFLNK | 0755);
    +		archive_entry_set_symlink(ae, "file");
    +		assertA(0 == archive_write_header(a, ae));
    +		archive_entry_free(ae);
    +	}
     	/* Close out the archive. */
     	assertA(0 == archive_write_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_write_finish(a);
    -#else
     	assertA(0 == archive_write_finish(a));
    -#endif
     
     	/* Extract the entries to disk. */
     	assert((a = archive_read_new()) != NULL);
    @@ -125,75 +124,44 @@ DEFINE_TEST(test_read_extract)
     	assertA(0 == archive_read_next_header(a, &ae));
     	assertA(0 == archive_read_extract(a, ae, ARCHIVE_EXTRACT_PERM));
     	/* Rest of entries get restored with no flags. */
    -	for (i = 0; i < 7; i++) {
    -		failure("Error reading entry %d", i+1);
    +	for (i = 1; i < numEntries; i++) {
    +		failure("Error reading entry %d", i);
     		assertA(0 == archive_read_next_header(a, &ae));
    +		failure("Failed to extract entry %d: %s", i,
    +			archive_entry_pathname(ae));
     		assertA(0 == archive_read_extract(a, ae, 0));
     	}
     	assertA(ARCHIVE_EOF == archive_read_next_header(a, &ae));
     	assert(0 == archive_read_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_read_finish(a);
    -#else
     	assert(0 == archive_read_finish(a));
    -#endif
     
    -#if !defined(_WIN32) || defined(__CYGWIN__)
     	/* Test the entries on disk. */
     	/* This first entry was extracted with ARCHIVE_EXTRACT_PERM,
     	 * so the permissions should have been restored exactly,
     	 * including resetting the gid bit on those platforms
     	 * where gid is inherited by subdirs. */
    -	assert(0 == stat("dir_0775", &st));
     	failure("This was 0775 in archive, and should be 0775 on disk");
    -	assertEqualInt(st.st_mode, S_IFDIR | 0775);
    +	assertIsDir("dir_0775", 0775);
     	/* Everything else was extracted without ARCHIVE_EXTRACT_PERM,
     	 * so there may be some sloppiness about gid bits on directories. */
    -	assert(0 == stat("file", &st));
    -	failure("st.st_mode=%o should be %o", st.st_mode, S_IFREG | 0755);
    -	assertEqualInt(st.st_mode, S_IFREG | 0755);
    -	failure("The file extracted to disk is the wrong size.");
    -	assert(st.st_size == FILE_BUFF_SIZE);
    -	fd = open("file", O_RDONLY);
    -	failure("The file on disk could not be opened.");
    -	assert(fd != 0);
    -	bytes_read = read(fd, buff, FILE_BUFF_SIZE);
    -	close(fd);
    -	failure("The file contents read from disk are the wrong size");
    -	assert(bytes_read == FILE_BUFF_SIZE);
    -	failure("The file contents on disk do not match the file contents that were put into the archive.");
    -	assert(memcmp(buff, file_buff, FILE_BUFF_SIZE) == 0);
    -	assert(0 == stat("dir", &st));
    -	failure("This was 0777 in archive, but umask should make it 0755");
    +	assertIsReg("file", 0755);
    +	assertFileSize("file", FILE_BUFF_SIZE);
    +	assertFileContents(file_buff, FILE_BUFF_SIZE, "file");
     	/* If EXTRACT_PERM wasn't used, be careful to ignore sgid bit
     	 * when checking dir modes, as some systems inherit sgid bit
     	 * from the parent dir. */
    -	assertEqualInt(0755, st.st_mode & 0777);
    -	assert(0 == stat("dir/file", &st));
    -	assert(st.st_mode == (S_IFREG | 0700));
    -	assert(0 == stat("dir2", &st));
    -	assertEqualInt(0755, st.st_mode & 0777);
    -	assert(0 == stat("dir2/file", &st));
    -	assert(st.st_mode == (S_IFREG | 0000));
    -	assert(0 == stat("dir3", &st));
    -	assertEqualInt(0710, st.st_mode & 0777);
    -	assert(0 == stat("dir4", &st));
    -	assertEqualInt(0755, st.st_mode & 0777);
    -	assert(0 == stat("dir4/a", &st));
    -	assertEqualInt(0755, st.st_mode & 0777);
    -	assert(0 == stat("dir4/b", &st));
    -	assertEqualInt(0755, st.st_mode & 0777);
    -	assert(0 == stat("dir4/c", &st));
    -	assertEqualInt(0711, st.st_mode & 0777);
    -	assert(0 == lstat("symlink", &st));
    -	assert(S_ISLNK(st.st_mode));
    -#if HAVE_LCHMOD
    -	/* Systems that lack lchmod() can't set symlink perms, so skip this. */
    -	assert((st.st_mode & 07777) == 0755);
    -#endif
    -	assert(0 == stat("symlink", &st));
    -	assert(st.st_mode == (S_IFREG | 0755));
    -#endif
    +	failure("This was 0777 in archive, but umask should make it 0755");
    +	assertIsDir("dir", 0755);
    +	assertIsReg("dir/file", 0700);
    +	assertIsDir("dir2", 0755);
    +	assertIsReg("dir2/file", 0000);
    +	assertIsDir("dir3", 0710);
    +	assertIsDir("dir4", 0755);
    +	assertIsDir("dir4/a", 0755);
    +	assertIsDir("dir4/b", 0755);
    +	assertIsDir("dir4/c", 0711);
    +	if (canSymlink())
    +		assertIsSymlink("symlink", "file");
     
     	free(buff);
     	free(file_buff);
    diff --git a/lib/libarchive/test/test_read_format_ar.ar.uu b/lib/libarchive/test/test_read_format_ar.ar.uu
    new file mode 100644
    index 000000000000..70507cc1da9d
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_ar.ar.uu
    @@ -0,0 +1,12 @@
    +$FreeBSD$
    +
    +begin 755 test_read_format_ar.ar
    +M(3QA7ET='1S= 1009000
    -/*
    - * This "archive" is created by "GNU ar". Here we try to verify
    - * our GNU format handling functionality.
    - */
    -static unsigned char archive[] = {
    -'!','<','a','r','c','h','>',10,'/','/',' ',' ',' ',' ',' ',' ',' ',
    -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    -' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    -' ',' ',' ',' ',' ','4','0',' ',' ',' ',' ',' ',' ',' ',' ','`',10,
    -'y','y','y','t','t','t','s','s','s','a','a','a','f','f','f','.','o',
    -'/',10,'h','h','h','h','j','j','j','j','k','k','k','k','l','l','l',
    -'l','.','o','/',10,10,'/','0',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    -' ',' ',' ',' ','1','1','7','5','4','6','5','6','5','2',' ',' ','1',
    -'0','0','1',' ',' ','0',' ',' ',' ',' ',' ','1','0','0','6','4','4',
    -' ',' ','8',' ',' ',' ',' ',' ',' ',' ',' ',' ','`',10,'5','5','6',
    -'6','7','7','8','8','g','g','h','h','.','o','/',' ',' ',' ',' ',' ',
    -' ',' ',' ',' ','1','1','7','5','4','6','5','6','6','8',' ',' ','1',
    -'0','0','1',' ',' ','0',' ',' ',' ',' ',' ','1','0','0','6','4','4',
    -' ',' ','4',' ',' ',' ',' ',' ',' ',' ',' ',' ','`',10,'3','3','3',
    -'3','/','1','9',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    -'1','1','7','5','4','6','5','7','1','3',' ',' ','1','0','0','1',' ',
    -' ','0',' ',' ',' ',' ',' ','1','0','0','6','4','4',' ',' ','9',' ',
    -' ',' ',' ',' ',' ',' ',' ',' ','`',10,'9','8','7','6','5','4','3',
    -'2','1',10};
    -
    -char buff[64];
    -#endif
     
     DEFINE_TEST(test_read_format_ar)
     {
    -#if ARCHIVE_VERSION_NUMBER < 1009000
    -	skipping("test_read_support_format_ar()");
    -#else
    +	char buff[64];
    +	const char reffile[] = "test_read_format_ar.ar";
     	struct archive_entry *ae;
     	struct archive *a;
    +
    +	extract_reference_file(reffile);
     	assert((a = archive_read_new()) != NULL);
     	assertA(0 == archive_read_support_compression_all(a));
     	assertA(0 == archive_read_support_format_all(a));
    -	assertA(0 == archive_read_open_memory(a, archive, sizeof(archive)));
    +	assertA(0 == archive_read_open_file(a, reffile, 7));
     
     	/* Filename table.  */
     	assertA(0 == archive_read_next_header(a, &ae));
    @@ -110,10 +83,5 @@ DEFINE_TEST(test_read_format_ar)
     	/* Test EOF */
     	assertA(1 == archive_read_next_header(a, &ae));
     	assert(0 == archive_read_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_read_finish(a);
    -#else
     	assert(0 == archive_read_finish(a));
    -#endif
    -#endif
     }
    diff --git a/lib/libarchive/test/test_read_format_cpio_bin_bz2.c b/lib/libarchive/test/test_read_format_cpio_bin_bz2.c
    index 90270c8f53bd..f7c4efb0a08d 100644
    --- a/lib/libarchive/test/test_read_format_cpio_bin_bz2.c
    +++ b/lib/libarchive/test/test_read_format_cpio_bin_bz2.c
    @@ -36,10 +36,15 @@ DEFINE_TEST(test_read_format_cpio_bin_bz2)
     {
     	struct archive_entry *ae;
     	struct archive *a;
    +	int r;
     
     	assert((a = archive_read_new()) != NULL);
    -	assertEqualIntA(a, ARCHIVE_OK,
    -	    archive_read_support_compression_all(a));
    +	r = archive_read_support_compression_bzip2(a);
    +	if (r != ARCHIVE_OK) {
    +		skipping("bzip2 support unavailable");
    +		archive_read_close(a);
    +		return;
    +	}
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_open_memory(a, archive, sizeof(archive)));
    diff --git a/lib/libarchive/test/test_read_format_cpio_bin_lzma.c b/lib/libarchive/test/test_read_format_cpio_bin_lzma.c
    new file mode 100644
    index 000000000000..26c044043839
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_cpio_bin_lzma.c
    @@ -0,0 +1,60 @@
    +/*-
    + * Copyright (c) 2009 Michihiro NAKAJIMA
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +static unsigned char archive[] = {
    + 93,  0,  0,128,  0,255,255,255,255,255,255,255,255,  0, 99,156,
    + 62,160, 67,124,230, 93,220,235,118, 29, 75, 27,226,158, 67,149,
    +151, 96, 22, 54,198,209, 63,104,209,148,249,238, 71,187,201,243,
    +162,  1, 42, 47, 43,178, 35, 90,  6,156,208, 74,107, 91,229,126,
    +  5, 85,255,136,255, 64,  0
    +};
    +
    +DEFINE_TEST(test_read_format_cpio_bin_lzma)
    +{
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	int r;
    +
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
    +	r = archive_read_support_compression_lzma(a);
    +	if (r == ARCHIVE_WARN) {
    +		skipping("lzma reading not fully supported on this platform");
    +		assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    +		return;
    +	}
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_read_open_memory(a, archive, sizeof(archive)));
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_LZMA);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_BIN_LE);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
    +	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    +}
    +
    diff --git a/lib/libarchive/test/test_read_format_iso.iso.Z.uu b/lib/libarchive/test/test_read_format_iso.iso.Z.uu
    new file mode 100644
    index 000000000000..2f5cbd792041
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso.iso.Z.uu
    @@ -0,0 +1,26 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1G@0#`6!Z-&!``1`XH$((`"``@4I,$%"%0PD`@`7%%2C
    +MB@*IF,8"!UR``0O@"!#0B0=V:.212":IY)),-NGDDU!&*>645%9IY952-K%$
    +M$E,\8<04('#Y!`@YV&`##"\@\24(1B3!1!%39#$%%45H*$05;A)1A!0@F`#"
    +MA44,\804#PK8@A0O$&%%H5(4$005@X*`PA`I@!!##CG,`$(1+F3Q1!5.'$%$
    +M$&]*2JFEF-X`@A(N0.&H%%TZ\0*K4PR!A)M,)!$JEKSVRJL,!-800PPPW"##
    +M##+04,,-!((#+`S"$FLLLLHR"P,X!&:K[;8$`O!LM,4>F^RRS1;IZ[GHIJON
    +MNNRVZ^Z[\,8K+Y/_U;O8/P(2:*"]_/;K[[\`!UR=EDF`T,0;;H#@Q!MV0*CJ
    +ML3HDJ\.R('RK0!MKI#''&V;,4;$+,+B@:0MO@$!'&7/0T8*"89#QA1EOR-%&
    +M&'2XH'')80BL\\X\]^SSSV<=6..00!=M]-%()ZWTTDPW[?334$?=&XD!U4BU
    +MU%AGK?767'?M]==@ARWVV%K/./1`-PZD(X\^`BEDB4,>:+:-`.`8T-H]_A@D
    +MT26:2/;?@`N^>:<=^[Y
    +MYZ"'+OKHI)=N^NFHIZ[ZZJRW[OKKL,O_/+,-^_\\]!'+_WTU%=O_?789Z_]]MQW[_WWX(BGK_[Z[+?O_OOPQR___/37;__]^.>O__[\]^___P`,H``'2,`"&O"`]`,`
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_iso_gz.c b/lib/libarchive/test/test_read_format_iso_gz.c
    index 73c841588c54..22893790c307 100644
    --- a/lib/libarchive/test/test_read_format_iso_gz.c
    +++ b/lib/libarchive/test/test_read_format_iso_gz.c
    @@ -29,20 +29,13 @@ DEFINE_TEST(test_read_format_iso_gz)
     {
     	struct archive_entry *ae;
     	struct archive *a;
    -	int r;
    -	const char *name = "test_read_format_iso_gz.iso.gz";
    +	const char *name = "test_read_format_iso.iso.Z";
     
     	extract_reference_file(name);
     
     	assert((a = archive_read_new()) != NULL);
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_support_compression_all(a));
    -	r = archive_read_support_compression_gzip(a);
    -	if (r == ARCHIVE_WARN) {
    -		skipping("gzip reading not fully supported on this platform");
    -		assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    -		return;
    -	}
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_support_format_all(a));
     	assertEqualIntA(a, ARCHIVE_OK,
    @@ -50,7 +43,7 @@ DEFINE_TEST(test_read_format_iso_gz)
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_next_header(a, &ae));
     	assertEqualInt(archive_compression(a),
    -	    ARCHIVE_COMPRESSION_GZIP);
    +	    ARCHIVE_COMPRESSION_COMPRESS);
     	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660);
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
     	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    diff --git a/lib/libarchive/test/test_read_format_iso_gz.iso.gz.uu b/lib/libarchive/test/test_read_format_iso_gz.iso.gz.uu
    deleted file mode 100644
    index 759e5b64adfb..000000000000
    --- a/lib/libarchive/test/test_read_format_iso_gz.iso.gz.uu
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -$FreeBSD$
    -begin 755 test_read_format_iso_gz.iso.gz
    -M'XL(",E2<$,``W1EDDV&5W;&L+J>O%OV0WW+;;E'I7+4>6RJO+\5_.+9?(J
    -MJEX>5:/R,BM'Q\^>5E^^.W^R.O^&`?$7C-X/\DD_#T4:NAL;<7VW..@/AFE^
    -MF.^GH[!],!@F:19>+Y^?M#?)DJ*PEM63CT4A2[?V)UEXTWL;&MUN*Z2UP\G!
    -M>"?9&J:KRD[8JWU(M[)\,J[OU?+>[F`X'(QW'FJZS3AN-QIQI]EJKK<[<7Q^
    -MI2+^0W2E1REZJ-'S;[B/US;+^=$B-&MQK176YN%LMCA;.YU-/W\ZFI^>3,]J17N8/O0<`("[
    -M*5VLL8O_`0``X#&[B/RK%@````#@,;O]'[M;>U@[````````````````````
    -M`````````````````````````````````````````````.#.?@")(\.V`(`!
    -!````
    -`
    -end
    diff --git a/lib/libarchive/test/test_read_format_iso_joliet.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_joliet.iso.Z.uu
    new file mode 100644
    index 000000000000..b6ac2520083d
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_joliet.iso.Z.uu
    @@ -0,0 +1,66 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso_joliet.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$PDX4056(#@X(,01BBA
    +MA`)*\403$V:HX8,'X5*0AQX="$``(AZ(``(`6%"0!10DI*)`(@#`04$SHB@0
    +MBD8$(,"!`1`@0$`E'KCAD$06:>212":IY)),-NGDDU!&*>645#YY1!%.)#'%
    +M$TDT$<25(&CY!`@YV&`##"\@8<04(!B1!!-%3)'%%%04@>$04A01!!5/2`$"
    +M"D.D`$(,.>0P`PA%N)#%$U4X<0010<#Y9Z"#%GI#"S(0:`,(2K@`A9Y2;.G$
    +M"YU.,002;R;HZ*2"9@J##9@2>`,(%2Z1!!4@U!D$AE7VZJN3KN8`0Z8TR!!#
    +M#3+,0`.!!`0[+`S%'IOLLC`00."UV&9+(`#.$FLLLLHR*^2OY)9K[KGHIJON
    +MNNRVZ^Z[2?XG[V(""$B@@0$Q`4`2`#@!0!4`8`$`"`,73/#!!B=,\!``$`&`
    +M%``\`4`3"E>,\,4=?EC""T5P%"20`)P(``8%84`R0AH,%*,'!;%L8T`XZLBC
    +MCR"/*"+&.%NL<\X\[^QSST#_+'301`]M=-%('ZUTTDPO[7334#\M-<9'`-"Q
    +MO_Q.$?&^$P,0!`!5=TQPUEL3G`,`-J`-``P`?`$`$@`8`8#6!,O-K[X=:YW%
    +MW`!08777"S_\]]=^2PPQP2@`P'`*!<<`P-EGSU!PQRX`L+?$`/M;M<-?XSVU
    +MT9\7';K0W4+[[;3,EAXMN-1:J^WKVZI^>KC5C@OO[;CGKOONO/?N^^]'SBO\
    +M8?_86Z"(PR>O_/+,-^_\\]!'+_WTU%=O?50'SE@S``,`T(%`!Q*1!,37EV_^
    +M^>BGK_[Z[+?O_OOPQT\8\C*.&%#W`GT?@/CDR^___P`,H``'2,`"&O"`"$Q@
    +M>P[$LNT9```?`%]`R`"`-`!`#@K,H`8WR,$.>O"#(`RA"$=(PJ'0CV4B>J!`
    +M(G@@"EH0@R6,H0QG2,,:VO"&.,RA#G<('D34CR`U&DC,=C0BFMG/9G.#P@$"
    +MX(MW/$P*!0A`(*"`!1($H!U?$T@0VH&_@0R`?D#Z$4$$0`4C:"``#L@1$7ND
    +MQIFU00`$J``-1$"`(12!`P$@&$'T6)!V]-$,/QQ($&\4-YD548Q!"H`4H"A%
    +M*EH1BP/98A<%\L6"Z*@@9#0C&MM81$[VZ(UQG",!```'[Q7D>R\+62'7:,02
    +M#8!_BXQB(IS0!`2T,`UR<.05LQB0+8IQ($0DR"7'6,8SIM&0;$0F`4`I1SH"
    +M@`\`"$%!0J#"@1@@1Y6$HP1'M``D!$$*1%#5$ERP@QC$,@"S;$(##H2&,,B!
    +M#&Q(@QO6H$M2!&(@@2#%+P42S($,$YC%W&0`LDD`;!X(CLP4I26B.L_^"+H$<5EG<6O=`"0N@@2)8"J'^%F*/M"%%^060PE"S8)`E*#;#``$`(`&
    +M`(0AO11D0P4!X`8`K`$`7ECO0-I+D/=*-+X\`(!^W\!?`)P!`"T`@!H`P&#]
    +M6K`,`*`#A&6[7_UB.,+]O6\;`(#ARFD8PWC(,(V2NTOD*EOY
    +MREB67A&DT(X`*(`*A]AM$J#P!4+E(`9[0D(10&"A(2R!S4D@`I@45"J9"$(4P!"G`*PA36[&^F0406&&C56C"
    +MFI5M*FE#@4^S=G2I3YWJ9]/:2YR^:.6RS.YVN_O=2D%#&=A@4@7`^][XSK>^
    +M]\WO?OO[WP`/N,`'3O""&_S@"$^XPA?.\(8[_.$0C[C$)T[QBEO\XAC/N,8W
    +MSO&.>_SC(`^YR$=.\I*;_.0H3[G*5\[REKO\Y3"/NI8S[K6M\[U
    +MKGO]ZV`/N]C'3O:RF_WL:$^[VM?.]K:[_>UPC[O^
    +M^_WO@`^\X`=/^,(;_O"(3[SB%\_XQCO^\9"/O.0G3_G*6_[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/OO"'3_SB&__XR$^^\I?/_.8[__G0C[[TIT_]ZEO_^MC/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +M>(F8F(F:N(F^(F@&(JB.(JD6(JF>(JHF(JJN(JLV(JN^(JP&(NR.(NT
    +M6(NV>(NXF(NZN(N\V(N^^(O`&(S".(S$6(S&>(S(F(S*N(S,V(S.^(S0&(W2
    +M.(W46(W6>(W8F(W:N(W^(W@&([B.([D6([F>([HF([JN([LV([N^([P
    +(&(_R.(_T:!4`
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu
    new file mode 100644
    index 000000000000..9babf696e12c
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_joliet_long.iso.Z.uu
    @@ -0,0 +1,71 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso_joliet_long.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1GA0+@6!Z-&!``1`XH$((`"`!@5I0$%"%@PD`@`<%%2C
    +MB@*I:$0``B10(@D"!'3B@1T6:>212":IY)),-NGDDU!&*>645%9I991-+)'$
    +M%$\8,04(6SX!0@XVV`##"TAX"8(123!1Q!193$%%$1H*446;1!0A!0@F@'!A
    +M$4,\(<6#`K8@Q0M$6$&H%$4$086@(*`P1`H@Q)!##C.`4(0+63Q1A1-'$!&$
    +MFY%.6NFE-X"@A`M0-"H%ETZ\L.H40R#1)A-)@'KEKKSN*@.!.<1`(`XPX!!#
    +M##7D0"`)O\(0[+#%'IOLL@16:^VU!`+0[+/%1HNLLC"00&2OY)9K[KGHIJON
    +MNNRVZ^Z[2_XG[V(""$B@@0$9`8`<`)31+P!"`#`%`$0``(+!"!^L<,((#T$P
    +M`%(`\`0`33"\\,46(VR0B`/E4L(+17`TI)``I`@`.`6!@T%"+`HTXP<%P8QC
    +M0#KRZ&,`0))<(HD8]YRQST#_+'301`]M=-%('ZUTTDPO[7334#\M==143VUU
    +MU557O`0`20@L,8)>']SUP!,?G`,`-J`-``P`?`$`$F`/?+"^73,!0,@#9^$U
    +M%7=3C'#`57`-@-T%AQSQP28T_'#$(3L\<<0%'^QPP2U`W/;#5CPLN>4A!W&U
    +MU)\W';K3VPK;K;'?+ELZM*A/&RZVL%>K+;"F$]LZN.(:#._NO/?N^^_`!R_\
    +M\$K.:_QA_]A;((G'-^_\\]!'+WUQ628!`A5HU`'"$V/0`2$.(!2KP[$Z)`O"
    +MM@K(X$*!Z\<0A@V9MJ`$""VH\08;:91!1PMLO.'&&?2K0QK(4"GZG6&`YP.!
    +M"Q;X@C3,X0W3BZ`$)TC!"EK0*;B8P8%JI+.2`<`#`CE0#&0P`QK4P`8WP,$%
    +M5\C"%KKPA3",H0QG2,,:VO"&CF$>C4I$LX&`,``C+.$)4XC#(AKQB$A,HA*7
    +MR,0F.O&)4+S/@6#606=HC(<`B(&V`#`#`-```#50VPT`H,*SL4V+,N"B%\$H
    +M1C("P(Q9W&(7OQC&M(VQC&N+8QKGR$8[NA&.:%0C'=N(QS/*<8UU!,`=WYC'
    +M0/(QD8L$Y"$'Z<="ZE&0?53D'QLYR4Q&,H]D`$`:]A7%4IKRE*A,I2I7R%[4@SE"D,WLJ3,3!4`*`1UH00^:T($PU*$$@6A!>%20BMHHHQOM
    +MZ$Y!*E($D-2D5;TJ`'#QP8*`<&8>].C-M=\RK$M/)UKG@MD%[]*MB^TK6P@/WK7A&[6#*D00XJ96D'
    +M"C)9@^B+(/K2!0!F1!`1&*`@!A#KCT(HI`78-:TNV$$,UAJ`MKXUKH8-[&D/
    +M.UO9#I:VM[5M;!5+V-KR%K>[+6QD`U#9@73@L@,Q`G(%HB]";+8@G@6M:'%&
    +MVA(M``E!&!2NG+"$U*XVJ*YMP('0$`8YD`%_;EC#4`-`BD`,)!"DF*A`!!#1
    +M$LDW(`+@K(R@RM'IDL"_)[5J2=M)X`*+<[U%76@[[@L`^BZ5P0(`(4$\P%^I
    +M?O2_4\4J2DFPWO:^-[Y-K2]3"9)?Z%;8OP#.ZH`-S.(6N_C%\JJIA'V(TQ[Z
    +M]YXC8RU!#8I0A0:$H1`6,81G+!`*:[2_&0[P594\X)I:5"#RS.F->VHB'2/8
    +MQP`XZD.%W-0G!P2C1[;P6)FL80&3`,9H3K.:UYR9E\6LQF'-,(Z%="`W$T1F
    +M\]3IA>>\LP#`X[F=_2Q!0IOAZ@;`BMNL)C2I.4QM1O.8S!2F-(.I3$A/4]*6
    +MIC0VNWE-;EHST8V.=*6S*6H`_/E@!#D86.DY5CX?NM.*=C2C)PWK4%]ZU)P&
    +M-:UUG>E:[_K1I+[UIC\-;$Y_DY1IU*_+!#T00E_8T!```!H`$`92AI(-H@1`
    +M3=?`YFY[^]M!"("YFI,4:A4$4!T<"AAZ5*"8
    +M``*,/\$*#7\3"*90!2A`05!46!.D3CZ%)&!A36TZ.)SD1*>1TZGB5$C"$*8`
    +M!3<%80H'#Y03J!"$(:2<"%L:0L>K(`1<3<'@>S("I'@.J"2P:0B.2L(3G#!R
    +M3TU\4Q`"^L69[G2H@RE/0[=Z$O0$)JYC/`E-R&X60&"%)S"A"DTX>)YH]6\H
    +M/"KJD!(ZT8W>=JE+(>XYW[H+[,WXQCO^\4%!0QG8T#\%0/[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/OO"'3_SB&__XR$^^\I?/_.8[__G0C[[TIT_]ZEO_^MC/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +M>(F8F(F:N(F^(F@&(JB.(JD6(JF>(JHF(JJN(JLV(JN^(JP&(NR.(NT
    +M6(NV>(NXF(NZN(N\V(N^^(O`&(S".(S$6(S&>(S(F(S*N(S,V(S.^(S0&(W2
    +M.(W46(W6>(W8F(W:N(W^(W@&([B.([D6([F>([HF([JN([LV([N^([P
    +M&(_R.(_T6(_V>(_XF(_ZN(_\V(_^^(\`&9`".9`$69`&>9`(F9`*N9`,V9`.
    +M^9`0&9$2.9$469$6>9$8F9$:N9$^9$@&9(B.9(D69(F>9(HF9(JN9(L
    +MV9(N^9(P&9,R.9,T69,V>9,XF9,ZN9,\V9,^^9-`&91".91$691&>91(F91*
    +MN91,V91.^910&952.9546956>958F95:N95^95@&99B.99D699F>99H
    +MF99JN99LV99N^99P&9=R.9=T69=V>9=XF9=ZN9=\V9=^^9>`&9B".9B$69B&
    +4>9B(F9B*N9B,V9B.^9B0&9F2J90`
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu
    new file mode 100644
    index 000000000000..fdccb0cf7143
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_joliet_rockridge.iso.Z.uu
    @@ -0,0 +1,68 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso_joliet_rockridge.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1G@0+@6!Z-&!``1`XH$((`"`!0590$%"+`HD`@`<%%2C
    +MB@*I:$0``B10(@D"!'3B@1T6:>212":IY)),-NGDDU!&*>645%9I991-+)'$
    +M%$\8,04(6SX!0@XVV`##"TAX"8(123!1Q!193$%%$1H*446;1!0A!0@F@'!A
    +M$4,\(<6#`K8@Q0M$6$&H%$4$086@(*`P1`H@Q)!##C.`4(0+63Q1A1-'$!&$
    +MFY%.6NFE-X"@A`M0-"H%ETZ\L.H40R#1)A-)@'KEKKSN*@.!.<1`(`XQU""#
    +M##340"`)O\(0[+#%'IOLL@16:^VU!`+0[+,P$&LLLLK"0`*1O99K[KGHIJON
    +MNNRVZ^Z[\"[YW[R+"2`@@08&9`0`<@!0AK\`"`'`%``0`0`(!R>,\,(*)SQ$
    +MP0!(`<`3`#31,,,87YRP02(.A$L)+Q3!T9!"`I`B`!@4A$'*"&DPT(P>%!0S
    +MC@'IR*./`0!927BQP$
    +MUE.#[K3H3V\K;+?1@KNLZ=!^.ZVXV,9>K;;`GNZMM.&.>W"\O/?N^^_`!R_\
    +M\,0K2>_QA_US;X$D(N_\\]!'+_WTQ669!`A4H%$'"$^,00>$.%1:@P['ZI`L
    +M"-LJ((,+!;(?0Q@V9-J"$B"T4$<:9%1:_QGXHP^""P!\01KF\`;J&?"`"$R@
    +M`A>X%5QHX$`UVAD`!@"`#@CD0$1(@L08R,$.>O"#(`RA"$=(PA*:\(0HE$SS
    +M:%2B@%!0(!8,0`8WF,(:VO"&.,RA#G?(PQ[Z\(=`U,^!8B9!`P#@`Q<,"!D`
    +MD`9^!?&)4(RB%*=(Q2I:\8I8S*(6H;+"F)'(B`)!XH&6V,1^;?&,:$RC&M?(
    +MQC:Z\8UPC"-[(,%"@MQH(#;KT8^"U$*>#0P*!PB`+]X1,2D4(`"!@`(66!"`
    +M=GQ.($%HQPL',H`5"HF/`Q%`!`?"`2H8X8$.V)$><]8&!2#@`19H`0E*>!``!!&$%H6I!VW=$,=.6DR/"+H9GO1)4(H29ZLT)2I5R*A@02Q(LUY>,YA]#,``9EC,0R;"
    +M"4U`P!C3(`=D-O*1`8DD)@4B`$N6:)\!$8`%"=*!:@8@E,#,V3E)J4U7`H`0
    +M``A!04(`QH$88*'?%.8"D!"$0>'*"4MPP0YBT,X`O+,)#3@0&L(@!S*P(0UN
    +M6(,]21&(@02"%``%0#^AF5,!2)0@(3`H0D=)`HQVTY6>B.A$*RJ0BR8TH^ET
    +M`!.>`*HO*.$)3'#!G+`PTD*Z$YXC.!`;WN"&,[1`#6]X:1GHT`(SI($-96B!
    +M&\+0AC*X@`YEP`,=W`K7F=94(#?MJ3^C21"?3E2HJ0U6)"@#`XQ^0C2P\
    +M#H+1))9(`7!JPD=#VM62-@*>##C0'/+0AI?&U)[M",5`0M&.P0ZVIX^-+&3A
    +M,04FE(!$'AAK6<^:UC2LM:UOC>M2A.[,$PN48_*S<5^4Y>;%,@=<_1+
    +MHG972";Z+FKQ"0!F%N29!"%L)N,;D$Y^\J"*C2YTO5G=!COXP1!N#8!YHP06:VW:?>EV6N]S$+[/-L;*=+66?6F,'`&`.
    +M`,@#`,A\92`#0,@1#K2@!TWHHPJ"`%74TCUGHP`J6\#*@EL&H*C
    +MDD!58WO*UIN"T+AU[6YXRQM,>3(WOI.@)S`Y`=BB;D)'LP`"*V"U"DU0=9YH
    +M)6HH/&K>D"KWN=/M<'I+0>+I8S[K6M\[U
    +MKGO]ZV`/N]C'3O:RF_WL:$^[VM?.]K:[_>UPC[O^
    +M^_WO@`^\X`=/^,(;_O"(3[SB%\_XQCO^\9"/O.0G3_G*6_[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/OO"'3_SB&__XR$^^\I?/_.8[__G0C[[TIT_]ZEO_^MC/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +M>(F8F(F:N(F^(F@&(JB.(JD6(JF>(JHF(JJN(JLV(JN^(JP&(NR.(NT
    +M6(NV>(NXF(NZN(N\V(N^^(O`&(S".(S$6(S&>(S(F(S*N(S,V(S.^(S0&(W2
    +M.(W46(W6>(W8F(W:N(W^(W@&([B.([D6([F>([HF([JN([LV([N^([P
    +M&(_R.(_T6(_V>(_XF(_ZN(_\V(_^^(\`&9`".9`$69`&>9`(F9`*N9`,V9`.
    +M^9`0&9$2.9$469$6>9$8F9$:N9$^9$@&9(B.9(D69(F>9(HF9(JN9(L
    +.V9(N^9(P&9,R.9,T^8(`
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_iso_multi_extent.c b/lib/libarchive/test/test_read_format_iso_multi_extent.c
    new file mode 100644
    index 000000000000..9697a4b5de6e
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_multi_extent.c
    @@ -0,0 +1,94 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * Copyright (c) 2009 Michihiro NAKAJIMA
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +DEFINE_TEST(test_read_format_iso_multi_extent)
    +{
    +	const char *refname = "test_read_format_iso_multi_extent.iso.Z";
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	const void *p;
    +	size_t size;
    +	off_t offset;
    +	int i;
    +
    +	extract_reference_file(refname);
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
    +	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_open_filename(a, refname, 10240));
    +
    +	/* Retrieve each of the 2 files on the ISO image and
    +	 * verify that each one is what we expect. */
    +	for (i = 0; i < 2; ++i) {
    +		assertEqualInt(0, archive_read_next_header(a, &ae));
    +
    +		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
    +			/* '.' root directory. */
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualIntA(a, ARCHIVE_EOF,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt((int)size, 0);
    +		} else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString("file", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(262280, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "head--head--head", 16);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else {
    +			failure("Saw a file that shouldn't have been there");
    +			assertEqualString(archive_entry_pathname(ae), "");
    +		}
    +	}
    +
    +	/* End of archive. */
    +	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify archive format. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
    +
    +	/* Close the archive. */
    +	assertEqualInt(0, archive_read_close(a));
    +	assertEqualInt(0, archive_read_finish(a));
    +}
    +
    +
    diff --git a/lib/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu
    new file mode 100644
    index 000000000000..3ce33dc2001e
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_multi_extent.iso.Z.uu
    @@ -0,0 +1,67 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso_multi_extent.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1GB0#0<*%(`-'X48@(D`((````H4I``%"5DPD`@`<%"0
    +MC2L*M*(1`0B0```!D"!`0"8>V.&12":IY)),-NGDDU!&*>645%9IY9583LE$
    +M$D($(<402"1A11$@)#'%$R#D8(,-,(!@1!),%#%%%E-0482&5TB1A)U29.GG
    +MGX`&*FB2,A"80PP%WD!@#&PJ"@,)A<)P:**+-DH@"01FJNFF!`(0Z:0Q.,HH
    +M#(Z28.2@J*:JZJJLMNKJJ[#&*FN5_]6ZF``"+AJB$0#(`4`9OP(@!`!3`$`$
    +M`"`@JVRRS"ZK[!#&`B`%`$\`T(2SS6:+K;(&@3C0B"6\4`1'11*9XHHM$J0`
    +M!@EI,",`'104;XX![=CCCT$."221(6KK[[;_!@SPP`(73/#!!B>,\,(*-\SP
    +MPPY'#/'$$E=,\<466\P$`$D("T`0T@(`+1(<`V`%`.,FVW&QU2:;`P`DD@B#
    +MLKQVO/&XQ69!+`!4H&RMLE>$W''/XTZ;,<9('ZUMT@\SK?"GB(9:*:F70DUI
    +M@98^RNG6F7IJ:-2B9FTJLK.6;?;9:*>M]MILIVWKVX?]DVN!(<)M]]UXYZWW
    +MWL4EX801:$X1!AT@/#$&X:&"0*`.C.I`*@B?*L!&&F*$(<<8:*1A1QF0NW"#
    +M"SD0&`8(:O_/+,-^_\\]"#5G>-^T9O_?789Z_]]MQW[_WWX(>O]X'Q#B_^
    +M^>BGK_[Z[+?O_OOPQR__5]/'._W\^.>O__[\]^___P`,H`#S`PGJ$01'`[&7
    +MCX`DI.&=B%A0.$``?/$.:4FA``$(!!2PP((`M`%D`@E"&_0U$`'<#T@D%(@`
    +MA#<0#E#!"!H(@`-XM,`@T1!?)&B#`B(```@<@`1#*`('`N"!@A31(.TH2#O<
    +M8,`6IBB!"+H7`_55I`!(X8(9W&`'/S@0$:8P("8L2(\*LL(;O3"&,Y2B#=68
    +MPQWV\(<`X`,`/E`0.N+#1/B(8@U)``@''N!-<7+!#F)P10PFP@E-2,"!S)"&
    +MU&DQ2($82"#&1I`'5O*+`!``'0GR@3/*\(8,!&60=,A#'Y)`CEXH2"KO2*0\
    +MBI*/?@1D$01)2"P>,I&+;&09'DF"2`IDDB>TY+>
    +M$@"=*$@G$`&!@4``$:\4$9'^"*=9#K*0`;BE(@'`2$=R$)*2I.2W@DG,:!*D
    +M$\E\)3/=:,H!VO.>^'P+C,(0GL`$KV+("DD@@IQ`,(4J0`$*3Y`"
    +M%=P45Z\^80I)P(*;NLE6.ME)0U.XTU:ID(0A3`$*<0I"8$$P5B=0(0A#F"L1
    +MS#0$KU9!"%N:@E/[!+@^';8(0TC"FX;`U"0\P0EL?4(5OC1+"`663%"X;&8W
    +M6R:U.E:T2?!IF5#[U20TP4M9`($5R%J%)I!)K5,8@E'#RMFZ-O:QD=UM9W]+
    +MV-.Z@*?8S:YVM]L7-)0A#&1H00N\"U[QDC>\X_TN>L]K7O6&X;WPC:]\YTO?
    +M^7+WOOC-KW[WR]_^^O>_``ZP@`=,X`(;^,`(3K""%\S@!COXP1".L(0G3.$*
    +M6_C"&,ZPAC?,X0Y[^,,@#K&(1TSB$IOXQ"A.L8I7S.(6N_C%,(ZQC&=,XQK;
    +M^,8XSK&.=\SC'OOXQT`.LI"'3.0B&_G(2$ZRDI?,Y"8[^_G+8`ZSF,=,YC*;^,ZSGO?,YS[[^<^`#K2@!TWH0AOZT(A.M*(7S>A&._K1D(ZTI"=-Z4I;^M*8
    +MSK2F-\WI3GOZTZ`.M:A'3>I2F_K4J$ZUJE?-ZE:[^M6PCK6L9TWK6MOZUKC.
    +MM:YWS>M>^_K7P`ZVL(=-[&(;^]C(3K:RE\WL9CO[V=".MK2G3>UJ6_O:V,ZV
    +MMK?-[6Y[^]O@#K>XQTWNYVN_O=\(ZWO.=-[WK;^][XSK>^
    +M]\WO?OO[WP`/N,`'3O""&_S@"$^XPA?.\(8[_.$0C[C$)T[QBEO\XAC/N,8W
    +MSO&.>_SC(`^YR$=.\I*;_.0H3[G*5\[REKO\Y3"/NI8S[K6M\[U
    +MKGO]ZV`/N]C'3O:RF_WL:$^[VM?.]K:[_>UPC[O^
    +M^_WO@`^\X`=/^,(;_O"(3[SB%\_XQCO^\9"/O.0G3_G*6_[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/?FOJ2_SBTY<.86BD>)&O_!8PGPW+3S[TG2_]Z#=2^-C/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +M>(F8F(F:N(F^(F@&(JB.(JD6(JF>(JHF(JJN(JLV(JN^(JP&(NR.(NT
    +M6(NV>(NXF(NZN(N\V(N^^(O`&(S".(S$6(S&>(S(F(S*N(S,V(S.^(S0&(W2
    +M.(W46(W6>(W8F(W:N(W^(W@&([B.([D6([F>([HF([JN([LV([N^([P
    +M&(_R.(_T6(_V>(_XF(_ZN(_\V(_^^(\`&9`".9`$69`&>9`(F9`*N9`,V9`.
    +0^9`0&9$2.9$469$6>9%O"```
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu
    new file mode 100644
    index 000000000000..218631ca2c30
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_rockridge.iso.Z.uu
    @@ -0,0 +1,206 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso_rockridge.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1GA0#Q@,A$$/'QT(0``F'H@``@!84)`%$R14P4`B`'!!
    +M03>R*!"+1@0@0`(GDB!`0"D>V.&12":IY)),-NGDDU!&*>645%9IY9583MG$
    +M$DE,\8014X#0Y1,@Y&"##3"\@`28(!B1!!-%3)'%%%04H:$05;Q)1!%2@&`"
    +M"!<6,<034CPH8`M2O$"$%89*44005!`*`@I#I`!"##GD,`,(1;B0Q1-5.'$$
    +M$4'`.6FEEV9Z`PA*N`#%HU)XZ<0+K4XQ!!)O,I&$J%GVZFNO,A"8`PPYR'`#
    +MIC'4,$.P,)#`[+#%'IM#LLL22`*!V&:K+8$`/$NLL<@JRRP)1OYJ[KGHIJON
    +MNNRVZ^Z[\,;;Y'_T+O:/@`0:6.^^_/;K[[\`5[=E$B!,48<;!9-B(TX`J!C0#SZ"&0`0NY\XH%30'%`
    +M`+Z\`X`44A000"!08$%N.T$,%$0[5P\TP-0"^5B0`%08H4$`#O3X8Y!M)+#!
    +M!`^`0$+GGX=.PA!%2)1*((N."$&QX`
    +MXHHS7M#C!4E.$.668Z[YW*-[#KKHI$]/`@!P^%Q0B&^[C:#<0>Z>X@!;_QY`
    +M(DXT@<"!9*0A1^&')R[0XKL/)`#D1-8O$/.79PX^W<_CG/1,!P`Z`$`#!=$`
    +M%<+`BX#P(@R5^]_U[!:``[@)3B[800S,A[XF).!`9D@#&\H`OP"0(A`#"00I
    +M]!>0^R6/A0#@G_,D&$"Z5<]T?#A@`A?80``\,(*YFR#O3K0`)`2A4+IRPA(R
    +MN,'`G2]]#3@0&L(@!S*P(0UN6$,)3YC"%4X.?R>"H0S]%\0:1J]THC,$`$ZA
    +M,ZJ=XB!FC!R1%""G)B1QB1K\FQ,;D3X&'&@.>6C#%;-8PG:$8B"A:`<84?3"
    +MR4V!"0LP$0%".,+*]:]'`P"2`$B`24V>T7IK8^-`+O!&@]Q0='(D8AWO*`,F
    +MFH^/38@B```I2"RN00:%/*1`$KG(18KQD7[T'@`&0(X3B'P,YR#7,()>(5&3R?.E()CA`
    +M10$AIC$)``!D.D"9^!R@Z!CQS%%*DR#*3&4`MID%.W:3!N`4'"QE20Z#G,8AZS>??4YS*I)U)']%,@I(2C!`5*4(,JL08)
    +M#`&8'3:KAU7MFY.O=
    +M`F"^X,6O>(WC65D-"U(S)I:``(3JM`$V^[)5JZ%0J3Z*ZGWQG>^&?:O%#I\W@.[
    +MP+0XSK&.=QPS-)2!#6QX@P)X3.0B&_G(2$ZRDI?,Y"8[^_G+8`ZSF,=,YC*;^,ZSGO?,YS[[^<^`#K2@!TWH0AOZT(A.M*(7S>A&._K1D(ZTI"=-Z4I;^M*8
    +MSK2F-\WI3GOZTZ`.M:A'3>I2F_K4J$ZUJE?-ZE:[^M6PCK6L9TWK6MOZUKC.
    +MM:YWS>M>^_K7P`ZVL(=-[&(;^]C(3K:RE\WL9CO[V=".MK2G3>UJ6_O:V,ZV
    +MMK?-[6Y[^]O@#K>XQTWNYVN_O=\(ZWO.=-[WK;^][XSK>^
    +M]\WO?OO[WP`/N,`'3O""&_S@"$^XPA?.\(8[_.$0C[C$)T[QBEO\XAC/N,8W
    +MSO&.>_SC(`^YR$=.\I*;_.0H3[G*5\[REKO\Y3"/NI8S[K6M\[U
    +MKGO]ZV`/N]C'3O:RF_WL:$^[VM?.]K:[_>UPC[O^
    +M^_WO@`^\X`=/^,(;_O"(3[SB%\_XQCO^\9"/O.0G3_G*6_[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/OO"'3_SB&__XR$^^\I?/_.8[__G0C[[TIT_]ZEO_^MC/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +M>(F8F(F:N(F^(F@&(JB.(JD6(JF>(JHF(JJN(JLV(JN^(JP&(NR.(NT
    +M6(NV>(NXF(NZN(N\V(N^^(O`&(S".(S$6(S&>(S(F(S*N(S,V(S.^(S0&(W2
    +M.(W46(W6>(W8F(W:N(W^(W@&([B.([D6([F>([HF([JN([LV([N^([P
    +M&(_R.(_T6(_V>(_XF(_ZN(_\V(_^^(\`&9`".9`$69`&>9`(F9`*N9`,V9`.
    +M^9`0&9$2.9$469$6>9$8F9$:N9$^9$@&9(B.9(D69(F>9(HF9(JN9(L
    +MV9(N^9(P&9,R.9,T69,V>9,XF9,ZN9,\V9,^^9-`&91".91$691&>91(F91*
    +MN91,V91.^910&952.9546956>958F95:N95^95@&99B.99D699F>99H
    +MF99JN99LV99N^99P&9=R.9=T69=V>9=XF9=ZN9=\V9=^^9>`&9B".9B$69B&
    +M>9B(F9B*N9B,V9B.^9B0&9F2.9F469F6>9F8F9F:N9F^9F@&9JB.9JD
    +M69JF>9JHF9JJN9JLV9JN^9JP&9NR.9NT69NV>9NXF9NZN9N\V9N^^9O`&9S"
    +M.9S$69S&>9S(F9S*N9S,V9S.^9S0&9W2.9W469W6>9W8F9W:N9W^9W@
    +M&9[B.9[D69[F>9[HF9[JN9[LV9[N^9[P&9_R.9_T69_V>9_XF9_ZN9_\V9_^
    +M^9\`&J`".J`$6J`&>J`(FJ`*NJ`,VJ`.^J`0&J$2.J$46J$6>J$8FJ$:NJ$<
    +MVJ$>^J$@&J(B.J(D6J(F>J(HFJ(JNJ(LVJ(N^J(P&J,R.J,T6J,V>J,XFJ,Z
    +MNJ,\VJ,^^J-`&J1".J1$6J1&>J1(FJ1*NJ1,VJ1.^J10&J52.J546J56>J58
    +MFJ5:NJ5^J5@&J9B.J9D6J9F>J9HFJ9JNJ9LVJ9N^J9P&J=R.J=T6J=V
    +M>J=XFJ=ZNJ=\VJ=^^J>`&JB".JB$6JB&>JB(FJB*NJB,VJB.^JB0&JF2.JF4
    +M6JF6>JF8FJF:NJF^JF@&JJB.JJD6JJF>JJHFJJJNJJLVJJN^JJP&JNR
    +M.JNT6JNV>JNXFJNZNJN\VJN^^JO`&JS".JS$6JS&>JS(FJS*NJS,VJS.^JS0
    +M&JW2.JW46JW6>JW8FJW:NJW^JW@&J[B.J[D6J[F>J[HFJ[JNJ[LVJ[N
    +M^J[P&J_R.J_T6J_V>J_XFJ_ZNJ_\VJ_^^J\`&[`".[`$6[`&>[`(F[`*N[`,
    +MV[`.^[`0&[$2.[$46[$6>[$8F[$:N[$^[$@&[(B.[(D6[(F>[(HF[(J
    +MN[(LV[(N^[(P&[,R.[,T6[,V>[,XF[,ZN[,\V[,^^[-`&[1".[1$6[1&>[1(
    +MF[1*N[1,V[1.^[10&[52.[546[56>[58F[5:N[5^[5@&[9B.[9D6[9F
    +M>[9HF[9JN[9LV[9N^[9P&[=R.[=T6[=V>[=XF[=ZN[=\V[=^^[>`&[B".[B$
    +M6[B&>[B(F[B*N[B,V[B.^[B0&[F2.[F46[F6>[F8F[F:N[F^[F@&[JB
    +M.[JD6[JF>[JHF[JJN[JLV[JN^[JP&[NR.[NT6[NV>[NXF[NZN[N\V[N^^[O`
    +M&[S".[S$6[S&>[S(F[S*N[S,V[S.^[S0&[W2.[W46[W6>[W8F[W:N[W
    +M^[W@&[[B.[[D6[[F>[[HF[[JN[[LV[[N^[[P&[_R.[_T6[_V>[_XF[_ZN[_\
    +MV[_^^[\`',`"/,`$7,`&?,`(G,`*O,`,W,`._,`0',$2/,$47,$6?,$8G,$:
    +MO,$_,$@',(B/,(D7,(F?,(HG,(JO,(LW,(N_,(P',,R/,,T7,,V?,,X
    +MG,,ZO,,\W,,^_,-`',1"/,1$7,1&?,1(G,1*O,1,W,1._,10',52/,547,56
    +M?,58G,5:O,5_,5@',9B/,9D7,9F?,9HG,9JO,9LW,9N_,9P',=R/,=T
    +M7,=V?,=XG,=ZO,=\W,=^_,>`',B"/,B$7,B&?,B(G,B*O,B,W,B._,B0',F2
    +M/,F47,F6?,F8G,F:O,F_,F@',JB/,JD7,JF?,JHG,JJO,JLW,JN_,JP
    +M',NR/,NT7,NV?,NXG,NZO,N\W,N^_,O`',S"/,S$7,S&?,S(G,S*O,S,W,S.
    +M_,S0',W2/,W47,W6?,W8G,W:O,W_,W@',[B/,[D7,[F?,[HG,[JO,[L
    +MW,[N_,[P',_R/,_T7,_V?,_XG,_ZO,_\W,_^_,\`'=`"/=`$7=`&?=`(G=`*
    +MO=`,W=`._=`0'=$2/=$47=$6?=$8G=$:O=$_=$@'=(B/=(D7=(F?=(H
    +MG=(JO=(LW=(N_=(P'=,R/=,T7=,V?=,XG=,ZO=,\W=,^_=-`'=1"/=1$7=1&
    +M?=1(G=1*O=1,W=1._=10'=52/=547=56?=58G=5:O=5_=5@'=9B/=9D
    +M7=9F?=9HG=9JO=9LW=9N_=9P'==R/==T7==V?==XG==ZO==\W==^_=>`'=B"
    +M/=B$7=B&?=B(G=B*O=B,W=B._=B0'=F2/=F47=F6?=F8G=F:O=F_=F@
    +M'=JB/=JD7=JF?=JHG=JJO=JLW=JN_=JP'=NR/=NT7=NV?=NXG=NZO=N\W=N^
    +M_=O`'=S"/=S$7=S&?=S(G=S*O=S,W=S._=S0'=W2/=W47=W6?=W8G=W:O=W<
    +MW=W>_=W@'=[B/=[D7=[F?=[HG=[JO=[LW=[N_=[P'=_R/=_T7=_V?=_XG=_Z
    +MO=_\W=_^_=\`'N`"/N`$7N`&?N`(GN`*ON`,WN`._N`0'N$2/N$47N$6?N$8
    +MGN$:ON$_N$@'N(B/N(D7N(F?N(HGN(JON(LWN(N_N(P'N,R/N,T7N,V
    +M?N,XGN,ZON,\WN,^_N-`'N1"/N1$7N1&?N1(GN1*ON1,WN1._N10'N52/N54
    +M7N56?N58GN5:ON5_N5@'N9B/N9D7N9F?N9HGN9JON9LWN9N_N9P'N=R
    +M/N=T7N=V?N=XGN=ZON=\WN=^_N>`'NB"/NB$7NB&?NB(GNB*ONB,WNB._NB0
    +M'NF2/NF47NF6?NF8GNF:ONF_NF@'NJB/NJD7NJF?NJHGNJJONJLWNJN
    +M_NJP'NNR/NNT7NNV?NNXGNNZONN\WNN^_NO`'NS"/NS$7NS&?NS(GNS*ONS,
    +MWNS._NS0'NW2/NW47NW6?NW8GNW:ONW_NW@'N[B/N[D7N[F?N[HGN[J
    +MON[LWN[N_N[P'N_R/N_T7N_V?N_XGN_ZON_\WN_^_N\`'_`"/_`$7_`&?_`(
    +MG_`*O_`,W_`.__`0'_$2/_$47_$6?_$8G_$:O_$__$@'_(B/_(D7_(F
    +M?_(HG_(JO_(LW_(N__(P'_,R/_,T7_,V?_,XG_,ZO_,\W_,^__-`'_1"/_1$
    +M7_1&?_1(G_1*O_1,W_1.__10'_52/_547_56?_58G_5:O_5__5@'_9B
    +M/_9D7_9F?_9HG_9JO_9LW_9N__9P'_=R/_=T7_=V?_=XG_=ZO_=\W_=^__>`
    +M'_B"/_B$7_B&?_B(G_B*O_B,W_B.__B0'_F2/_F47_F6?_F8G_F:O_F
    +M__F@'_JB/_JD7_JF?_JHG_JJO_JLW_JN__JP'_NR/_NT7_NV?_NXG_NZO_N\
    +MW_N^__O`'_S"/_S$7_S&?_S(G_S*O_S,W_S.__S0'_W2/_W47_W6?_W8G_W:
    +MO_W__W@'_[B/_[D7_[F?_[HG_[JO_[LW_[N__[P'__R/__T7__V?__X
    +MG__ZO__\W__^__\`,``*P`%(``N@`3R`"#`!*L`%R``;H`-\@!`P`DK`"4@!
    +M*Z`%O(`8,`-JP`W(`3N@!_R`(#`$BL`12`)+H`D\@2@P!:K`%<@"6Z`+?($P
    +M,`;*P!E(`VN@#;R!.#`'ZL`=R`-[H`_\@4`P"`K!(4@$BZ`1/()(,`DJP27(
    +M!)N@$WR"4#`*2L$I2`6KH!6\@E@P"VK!+<@%NZ`7_()@,`R*P3%(!LN@&3R#
    +M:#`-JL$UR`;;H!M\@W`P#LK!.4@'ZZ`=O(-X,`_JP3W(!_N@'_R#@#`0"L)!
    +M2`@+H2$\A(@P$2K"1<@(&Z$C?(20,!)*PDE("2NA);R$F#`3:L)-R`D[H2?\
    +MA*`P%(K"44@*2Z$I/(6H,!6JPE7("ENA*WR%L#`6RL)92`MKH2V\A;@P%^K"
    +M7<@+>Z$O_(7`,!@*PV%(#(NA,3R&R#`9*L-ER`R;H3-\AM`P&DK#:4@-JZ$U
    +MO(;8,!MJPVW(#;NA-_R&X#`3R/Z#$]JL?U
    +MR![;HWM\C_`Q/LK'^4@?ZZ-]O(_X,3_JQ_W('_NC?_R/`#)`"L@!22`+I($\
    +MD`@R02K(!Z2/
    +M_)%`,D@*R2%))(NDD3R22#))*LDER22;I)-\DE`R2DK)*4DEJZ25O))8,DMJ
    +MR2W));NDE_R28#),BLDQ22;+I)D\DV@R3:K)-#)/ZLD]R2?[I)_\DX`R4`K*04DH"Z6A/)2(,E$JRD7)*!NEHWR4D#)2
    +M2LI)22DKI:6\E)@R4VK*3RLMY22_KI;V\E_@R7^K+?Z?O_)W`,W@*
    +MS^%)/(NG\3R>R#-Y*L_ER3R;I_-\GM`S>DK/Z4D]JZ?UO)[8,WMJS^W)/;NG
    +M]_R>X#-\BL_Q23[+I_D\G^@S?:K/]4I/ZZD]O:?X-)_JTWW*3_NI/_VG`#6@"M2!2E`+JD$]J`@UH2K4AZI/_:E`-:@*U:%*5(NJ
    +M43VJ2#6I*M6ERE2;JE-]JE`UJDK5J4I5JZI5O:I8-:MJU:W*5;NJ5_VJ8#6L
    +MBM6Q2E;+JED]JV@UK:K5M#6OZM6]RE?[
    +MJE_]JX`UL`K6P4I8"ZMA/:R(-;$JUL7*6!NK8WVLD#6R2M;)2EDKJV6]K)@U
    +MLVK6SRZMY/:_H-;VJU_7*
    +M7MNK>WVO\#6^RM?Y2E_KJWV]K_@UO^K7_ZVO_;7`-M@*VV%+;(NML3VVR#;9
    +M*MMERVR;K;-]MM`VVDK;:4MMJZVUO;;8-MMJVVW+;;NMM_VVX#;`NOX3V\B#?Q*M[%
    +MRW@;K^-]O)`W\DK>R4MY*Z_EO;R8-_-JWLW+>3NOY_V\H#?TBM[12WI+K^D]
    +MO:@W]:K>UVNO[;V]N#?WZM[=RWM[K^_]O<`W^`K?
    +MX4M\BZ_Q/;[(-_DJW^7+?)NO\WV^T#?Z2M_I2WVKK_6]OM@W^VK?[[`/_L%`.`@+X2%,A(NP$3["2#@)*^$ES(2;
    +ML!-^PE`X"DOA*4R%J[`5OL)8.`MKX2W,A;NP%_["8#@,B^$Q3(;+L!D^PV@X
    +M#:OA-#@/Z^$]S(?[L!_^PX`X$`OB04R(
    +M"[$A/L2(.!$KXD7,B!NQ(W[$D#@22^))3(DKL26^Q)@X$VOB3/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1GC0+06!Z-&!``1`XH$((`"`!059,$%"%0PD`@`7%%2C
    +MB@*I:$0``B10(@D"!'3B@1T6:>212":IY)),-NGDDU!&*>645%9I991-+)'$
    +M%$\8,04(6SX!0@XVV`##"TAX"8(123!1Q!193$%%$1H*446;1!0A!0@F@'!A
    +M$4,\(<6#`K8@Q0M$6$&H%$4$086@(*`P1`H@Q)!##C.`4(0+63Q1A1-'$!&$
    +MFY%.6NFE-X"@A`M0-"H%ETZ\L.H40R#1)A-)@'KEKKSN*@.!.<10H`PQR%##
    +MKV;"0,*O,`0[;+''PI`L"016:^VU!`+`K+/%0HLL@200V>NXY)9K[KGHIJON
    +MNNRVZ^Z2_\6[V#\"$FB@O/CFJ^^^_/9;799)@-#$&VZ`\,08=%0J@\(Z'*N#
    +MM"!LJX`,+A18<0QAV)"IH2"T4$<:9%3:\1D@1PR""RB_D,8<;_CK\LLPQRSS
    +MS&G=0L^!-0HIT```9"#0@40D(07-1!=M]-%()ZWTTDPW[?334+]&8D`UDLBS
    +M0#X'$/3047?M]==@ARWVV&27;?;9:"<-"8TV`H!C0#KRZ&,`0.I,&VP3=.%#EQSHAT0^3IKJL!'X2\"!YI"'-L3`CH@+Q4!"T0X_
    +MFJ@@/"J(`"(Y24G"8PI,$(.)`K`%*_KREV'`(@3I41!Z=*$@77CD.VHI2;\9
    +MY)+KTV06FD"Q^=4/E$T0)0!(V089H+(=JA0(*UWI2D`"0`#+9.8[<*E+$_42
    +MF/"4HC`)@L/(!<\+!?'"(]W!S'^XPY)IQ*0TFS`#3PH.F]KDY@R^&!``40E*0(QD$"0@IRP
    +M-*<`P$>0#1B2>KTC@2*UISK\+0"E_U,I2P7B4I@2)):4NR!!.G!31>Z4D:8#
    +M`/X4`-3^";6E+X5H3&4)1()\H*EI?&KJ3(?+(9"(!QJ5(5@'X",!+'*L;]T>
    +M`'!)!!+U(*UJU=PA`\#6<\95=3PEJYM(Y`.\YG5Z.^JK6P/[UZB2]+&0C:QD
    +M$W*[00ZDC+M#8TY_)Z0#U8]X=SQ>0!@GTXA2SK)8`VM.&*B1A"'ES4Q"FP-U`
    +M.8$*01B"?X-&*_E600BXFL)V]V0$2.4-4$E@TQ`+ISB).@)3"]N;Q*:$`0I9`$$5G@"$ZK0!.[FB592J.ZC2`PI"V-8
    +MPT`NL12([&`7NZ"Y8`ZSF,>L'S24@0UL>$.E:C`#!9#YS7".LYSG3.,[S>\R,9C7'X%ANUK.@!TWH0AOZT(A.M*(7S6BO\#G-:XY!H!M-Z4I;^M*8
    +MSK2F-\WI3GOZTZ`.M:A'3>I2F_K4J$ZUJE?-ZE:[^M6PCK6L9TWK6MOZUKC.
    +MM:YWS>M>^_K7P`ZVL(=-[&(;^]C(3K:RE\WL9CO[V=".MK2G3>UJ6_O:V,ZV
    +MMK?-[6Y[^]O@#K>XQTWNYVN_O=\(ZWO.=-[WK;^][XSK>^
    +M]\WO?OO[WP`/N,`'3O""&_S@"$^XPA?.\(8[_.$0C[C$)T[QBEO\XAC/N,8W
    +MSO&.>_SC(`^YR$=.\I*;_.0H3[G*5\[REKO\Y3"/NI8S[K6M\[U
    +MKGO]ZV`/N]C'3O:RF_WL:$^[VM?.]K:[_>UPC[O^
    +M^_WO@`^\X`=/^,(;_O"(3[SB%\_XQCO^\9"/O.0G3_G*6_[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/OO"'3_SB&__XR$^^\I?/_.8[__G0C[[TIT_]ZEO_^MC/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +(>(F8F(F:^!,`
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu
    new file mode 100644
    index 000000000000..dd013ffc84d8
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu
    @@ -0,0 +1,208 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso_rockridge_new.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1GA0#Q@,A$$/'QT(0``F'H@``@!84)`%$R14P4`B`'!!
    +M03>R*!"+1@0@0`(GDB!`0"D>V.&12":IY)),-NGDDU!&*>645%9IY9583MG$
    +M$DE,\8014X#0Y1,@Y&"##3"\@`28(!B1!!-%3)'%%%04H:$05;Q)1!%2@&`"
    +M"!<6,<034CPH8`M2O$"$%89*44005!`*`@I#I`!"##GD,`,(1;B0Q1-5.'$$
    +M$4'`.6FEEV9Z`PA*N`#%HU)XZ<0+K4XQ!!)O,I&$J%GVZFNO,A"8`PPYR'"#
    +M##/$,,.R!)(0++'$&HNLLLS"0`*!V&:K+8$`/#MLL<M]MI,0V(CC@#H&!"//@(9@)`^GWC@
    +M%%`<$(`O[P`@A10%!!`(%%BP$$`[00P41#M:#S2`U0+Y6)``/0]T`15&:!"`
    +M`SW^&&0;"6QP00,AD$"ZZ:B3,$01'`2004&S&]1.0>VX\39!.0Y$M^AW#WDB
    +MD2@.7OCAB2_>N$"/1_XSY40*/Q#F.'+N.>AUCU[ZZ:FOSCT)`.`1=$$ARATW
    +M@MD'GW<``WAM?`").-$$`@>2D88B1:`A"`42E=.6`()34@X^,FO`0="0QCD0`8VI,$-:X"A#&EH
    +MP\L%<(?3\^%`@'@](C+0@T9,G2,``(]_^/&/\#B('2M')`7(J0E8U&()!=?%
    +M1LB/`0>:0Q[:8$8TPK`=H1A(*-KQQC?>4`!]_*,?X3$%)BS`1`1@H0L1B+T!
    +M`$D`=W0E#E6WO=9)`@#O$*4?`V<0(X(@BBE:P"$3B;$2OL^130`C`"1)R3.N
    +M00:7S*1`-ME)'7XRE[I\1RD=H**`#(`.;8!#0%B91UH^T)S?HP0`W*'+?[CC
    +M(*3#@`,*<`)@$DF864#DKI8P@RT>\XN1G&0EUS"#:&J2DSKTY.78J4MWE!("
    +MW03`-\-)`(&0LY;=PR@Z6V<)`+2CG;?K92U_2<@I#G.?-/!G(P&Z3($ZDP8&
    +MG29""8(B:U[NH[IL1RDE<*"*#JFB$@6G.`%PT7.6LYP=94<[V2%(#Y8T`/C4
    +M9Q9KH-+"(5.9S!QH#6(:$&HFU*8\5*HNV5'*"!SHAJEL81E8V2-9PK*MK]PH
    +M!#NZCG:N`YX)D"<][6G2?";2!E4-P%4#VDPTVH"K`/`J317*P[KJA$
    +MAPI4H@;1`4?5:#G9AA[=&7!KY]L1^J`HO"(Q\GB77%Y`'O=)QD[OLP'!`%OQ
    +MJ%F-`D!WF1-([T1KQ](2+P#O0Y[^5`N`YA5DHVA$^<5``5#@%<*20!"E_`5`YB`"DD%`$$&!K"$M";!"(>5$YWL9#`[
    +MU9<*21@"W^`4A"F<=U!.H$(0AH!@HMFJOU40@JZF8-X^&4%2?!-4$MPT!$@E
    +MX0E.,!BHYMLI"'GXOBE><8O%M*<0SS@)?!)3CO&;A"98,0L@L,(3F%"%)IQW
    +M3[;R+A0BY6))@5C$)%;RBZ7@9`SCV`763;.:U\SFFZ&A#&Q@PQL4T.8ZV_G.
    +M>,ZSGO?,YS[[^<^`#K2@!TWH0AOZT(A.M*(7S>A&._K1D(ZTI"=-Z4I;^M*8
    +MSK2F-\WI3GOZTZ`.M:A'3>I2F_K4J$ZUJE?-ZE:[^M6PCK6L9TWK6MOZUKC.
    +MM:YWS>M>^_K7P`ZVL(=-[&(;^]C(3K:RE\WL9CO[V=".MK2G3>UJ6_O:V,ZV
    +MMK?-[6Y[^]O@#K>XQTWNYVN_O=\(ZWO.=-[WK;^][XSK>^
    +M]\WO?OO[WP`/N,`'3O""&_S@"$^XPA?.\(8[_.$0C[C$)T[QBEO\XAC/N,8W
    +MSO&.>_SC(`^YR$=.\I*;_.0H3[G*5\[REKO\Y3"/NI8S[K6M\[U
    +MKGO]ZV`/N]C'3O:RF_WL:$^[VM?.]K:[_>UPC[O^
    +M^_WO@`^\X`=/^,(;_O"(3[SB%\_XQCO^\9"/O.0G3_G*6_[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/OO"'3_SB&__XR$^^\I?/_.8[__G0C[[TIT_]ZEO_^MC/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +M>(F8F(F:N(F^(F@&(JB.(JD6(JF>(JHF(JJN(JLV(JN^(JP&(NR.(NT
    +M6(NV>(NXF(NZN(N\V(N^^(O`&(S".(S$6(S&>(S(F(S*N(S,V(S.^(S0&(W2
    +M.(W46(W6>(W8F(W:N(W^(W@&([B.([D6([F>([HF([JN([LV([N^([P
    +M&(_R.(_T6(_V>(_XF(_ZN(_\V(_^^(\`&9`".9`$69`&>9`(F9`*N9`,V9`.
    +M^9`0&9$2.9$469$6>9$8F9$:N9$^9$@&9(B.9(D69(F>9(HF9(JN9(L
    +MV9(N^9(P&9,R.9,T69,V>9,XF9,ZN9,\V9,^^9-`&91".91$691&>91(F91*
    +MN91,V91.^910&952.9546956>958F95:N95^95@&99B.99D699F>99H
    +MF99JN99LV99N^99P&9=R.9=T69=V>9=XF9=ZN9=\V9=^^9>`&9B".9B$69B&
    +M>9B(F9B*N9B,V9B.^9B0&9F2.9F469F6>9F8F9F:N9F^9F@&9JB.9JD
    +M69JF>9JHF9JJN9JLV9JN^9JP&9NR.9NT69NV>9NXF9NZN9N\V9N^^9O`&9S"
    +M.9S$69S&>9S(F9S*N9S,V9S.^9S0&9W2.9W469W6>9W8F9W:N9W^9W@
    +M&9[B.9[D69[F>9[HF9[JN9[LV9[N^9[P&9_R.9_T69_V>9_XF9_ZN9_\V9_^
    +M^9\`&J`".J`$6J`&>J`(FJ`*NJ`,VJ`.^J`0&J$2.J$46J$6>J$8FJ$:NJ$<
    +MVJ$>^J$@&J(B.J(D6J(F>J(HFJ(JNJ(LVJ(N^J(P&J,R.J,T6J,V>J,XFJ,Z
    +MNJ,\VJ,^^J-`&J1".J1$6J1&>J1(FJ1*NJ1,VJ1.^J10&J52.J546J56>J58
    +MFJ5:NJ5^J5@&J9B.J9D6J9F>J9HFJ9JNJ9LVJ9N^J9P&J=R.J=T6J=V
    +M>J=XFJ=ZNJ=\VJ=^^J>`&JB".JB$6JB&>JB(FJB*NJB,VJB.^JB0&JF2.JF4
    +M6JF6>JF8FJF:NJF^JF@&JJB.JJD6JJF>JJHFJJJNJJLVJJN^JJP&JNR
    +M.JNT6JNV>JNXFJNZNJN\VJN^^JO`&JS".JS$6JS&>JS(FJS*NJS,VJS.^JS0
    +M&JW2.JW46JW6>JW8FJW:NJW^JW@&J[B.J[D6J[F>J[HFJ[JNJ[LVJ[N
    +M^J[P&J_R.J_T6J_V>J_XFJ_ZNJ_\VJ_^^J\`&[`".[`$6[`&>[`(F[`*N[`,
    +MV[`.^[`0&[$2.[$46[$6>[$8F[$:N[$^[$@&[(B.[(D6[(F>[(HF[(J
    +MN[(LV[(N^[(P&[,R.[,T6[,V>[,XF[,ZN[,\V[,^^[-`&[1".[1$6[1&>[1(
    +MF[1*N[1,V[1.^[10&[52.[546[56>[58F[5:N[5^[5@&[9B.[9D6[9F
    +M>[9HF[9JN[9LV[9N^[9P&[=R.[=T6[=V>[=XF[=ZN[=\V[=^^[>`&[B".[B$
    +M6[B&>[B(F[B*N[B,V[B.^[B0&[F2.[F46[F6>[F8F[F:N[F^[F@&[JB
    +M.[JD6[JF>[JHF[JJN[JLV[JN^[JP&[NR.[NT6[NV>[NXF[NZN[N\V[N^^[O`
    +M&[S".[S$6[S&>[S(F[S*N[S,V[S.^[S0&[W2.[W46[W6>[W8F[W:N[W
    +M^[W@&[[B.[[D6[[F>[[HF[[JN[[LV[[N^[[P&[_R.[_T6[_V>[_XF[_ZN[_\
    +MV[_^^[\`',`"/,`$7,`&?,`(G,`*O,`,W,`._,`0',$2/,$47,$6?,$8G,$:
    +MO,$_,$@',(B/,(D7,(F?,(HG,(JO,(LW,(N_,(P',,R/,,T7,,V?,,X
    +MG,,ZO,,\W,,^_,-`',1"/,1$7,1&?,1(G,1*O,1,W,1._,10',52/,547,56
    +M?,58G,5:O,5_,5@',9B/,9D7,9F?,9HG,9JO,9LW,9N_,9P',=R/,=T
    +M7,=V?,=XG,=ZO,=\W,=^_,>`',B"/,B$7,B&?,B(G,B*O,B,W,B._,B0',F2
    +M/,F47,F6?,F8G,F:O,F_,F@',JB/,JD7,JF?,JHG,JJO,JLW,JN_,JP
    +M',NR/,NT7,NV?,NXG,NZO,N\W,N^_,O`',S"/,S$7,S&?,S(G,S*O,S,W,S.
    +M_,S0',W2/,W47,W6?,W8G,W:O,W_,W@',[B/,[D7,[F?,[HG,[JO,[L
    +MW,[N_,[P',_R/,_T7,_V?,_XG,_ZO,_\W,_^_,\`'=`"/=`$7=`&?=`(G=`*
    +MO=`,W=`._=`0'=$2/=$47=$6?=$8G=$:O=$_=$@'=(B/=(D7=(F?=(H
    +MG=(JO=(LW=(N_=(P'=,R/=,T7=,V?=,XG=,ZO=,\W=,^_=-`'=1"/=1$7=1&
    +M?=1(G=1*O=1,W=1._=10'=52/=547=56?=58G=5:O=5_=5@'=9B/=9D
    +M7=9F?=9HG=9JO=9LW=9N_=9P'==R/==T7==V?==XG==ZO==\W==^_=>`'=B"
    +M/=B$7=B&?=B(G=B*O=B,W=B._=B0'=F2/=F47=F6?=F8G=F:O=F_=F@
    +M'=JB/=JD7=JF?=JHG=JJO=JLW=JN_=JP'=NR/=NT7=NV?=NXG=NZO=N\W=N^
    +M_=O`'=S"/=S$7=S&?=S(G=S*O=S,W=S._=S0'=W2/=W47=W6?=W8G=W:O=W<
    +MW=W>_=W@'=[B/=[D7=[F?=[HG=[JO=[LW=[N_=[P'=_R/=_T7=_V?=_XG=_Z
    +MO=_\W=_^_=\`'N`"/N`$7N`&?N`(GN`*ON`,WN`._N`0'N$2/N$47N$6?N$8
    +MGN$:ON$_N$@'N(B/N(D7N(F?N(HGN(JON(LWN(N_N(P'N,R/N,T7N,V
    +M?N,XGN,ZON,\WN,^_N-`'N1"/N1$7N1&?N1(GN1*ON1,WN1._N10'N52/N54
    +M7N56?N58GN5:ON5_N5@'N9B/N9D7N9F?N9HGN9JON9LWN9N_N9P'N=R
    +M/N=T7N=V?N=XGN=ZON=\WN=^_N>`'NB"/NB$7NB&?NB(GNB*ONB,WNB._NB0
    +M'NF2/NF47NF6?NF8GNF:ONF_NF@'NJB/NJD7NJF?NJHGNJJONJLWNJN
    +M_NJP'NNR/NNT7NNV?NNXGNNZONN\WNN^_NO`'NS"/NS$7NS&?NS(GNS*ONS,
    +MWNS._NS0'NW2/NW47NW6?NW8GNW:ONW_NW@'N[B/N[D7N[F?N[HGN[J
    +MON[LWN[N_N[P'N_R/N_T7N_V?N_XGN_ZON_\WN_^_N\`'_`"/_`$7_`&?_`(
    +MG_`*O_`,W_`.__`0'_$2/_$47_$6?_$8G_$:O_$__$@'_(B/_(D7_(F
    +M?_(HG_(JO_(LW_(N__(P'_,R/_,T7_,V?_,XG_,ZO_,\W_,^__-`'_1"/_1$
    +M7_1&?_1(G_1*O_1,W_1.__10'_52/_547_56?_58G_5:O_5__5@'_9B
    +M/_9D7_9F?_9HG_9JO_9LW_9N__9P'_=R/_=T7_=V?_=XG_=ZO_=\W_=^__>`
    +M'_B"/_B$7_B&?_B(G_B*O_B,W_B.__B0'_F2/_F47_F6?_F8G_F:O_F
    +M__F@'_JB/_JD7_JF?_JHG_JJO_JLW_JN__JP'_NR/_NT7_NV?_NXG_NZO_N\
    +MW_N^__O`'_S"/_S$7_S&?_S(G_S*O_S,W_S.__S0'_W2/_W47_W6?_W8G_W:
    +MO_W__W@'_[B/_[D7_[F?_[HG_[JO_[LW_[N__[P'__R/__T7__V?__X
    +MG__ZO__\W__^__\`,``*P`%(``N@`3R`"#`!*L`%R``;H`-\@!`P`DK`"4@!
    +M*Z`%O(`8,`-JP`W(`3N@!_R`(#`$BL`12`)+H`D\@2@P!:K`%<@"6Z`+?($P
    +M,`;*P!E(`VN@#;R!.#`'ZL`=R`-[H`_\@4`P"`K!(4@$BZ`1/()(,`DJP27(
    +M!)N@$WR"4#`*2L$I2`6KH!6\@E@P"VK!+<@%NZ`7_()@,`R*P3%(!LN@&3R#
    +M:#`-JL$UR`;;H!M\@W`P#LK!.4@'ZZ`=O(-X,`_JP3W(!_N@'_R#@#`0"L)!
    +M2`@+H2$\A(@P$2K"1<@(&Z$C?(20,!)*PDE("2NA);R$F#`3:L)-R`D[H2?\
    +MA*`P%(K"44@*2Z$I/(6H,!6JPE7("ENA*WR%L#`6RL)92`MKH2V\A;@P%^K"
    +M7<@+>Z$O_(7`,!@*PV%(#(NA,3R&R#`9*L-ER`R;H3-\AM`P&DK#:4@-JZ$U
    +MO(;8,!MJPVW(#;NA-_R&X#`3R/Z#$]JL?U
    +MR![;HWM\C_`Q/LK'^4@?ZZ-]O(_X,3_JQ_W('_NC?_R/`#)`"L@!22`+I($\
    +MD`@R02K(!Z2/
    +M_)%`,D@*R2%))(NDD3R22#))*LDER22;I)-\DE`R2DK)*4DEJZ25O))8,DMJ
    +MR2W));NDE_R28#),BLDQ22;+I)D\DV@R3:K)-#)/ZLD]R2?[I)_\DX`R4`K*04DH"Z6A/)2(,E$JRD7)*!NEHWR4D#)2
    +M2LI)22DKI:6\E)@R4VK*3RLMY22_KI;V\E_@R7^K+?Z?O_)W`,W@*
    +MS^%)/(NG\3R>R#-Y*L_ER3R;I_-\GM`S>DK/Z4D]JZ?UO)[8,WMJS^W)/;NG
    +M]_R>X#-\BL_Q23[+I_D\G^@S?:K/]4I/ZZD]O:?X-)_JTWW*3_NI/_VG`#6@"M2!2E`+JD$]J`@UH2K4AZI/_:E`-:@*U:%*5(NJ
    +M43VJ2#6I*M6ERE2;JE-]JE`UJDK5J4I5JZI5O:I8-:MJU:W*5;NJ5_VJ8#6L
    +MBM6Q2E;+JED]JV@UK:K5M#6OZM6]RE?[
    +MJE_]JX`UL`K6P4I8"ZMA/:R(-;$JUL7*6!NK8WVLD#6R2M;)2EDKJV6]K)@U
    +MLVK6SRZMY/:_H-;VJU_7*
    +M7MNK>WVO\#6^RM?Y2E_KJWV]K_@UO^K7_ZVO_;7`-M@*VV%+;(NML3VVR#;9
    +M*MMERVR;K;-]MM`VVDK;:4MMJZVUO;;8-MMJVVW+;;NMM_VVX#;`NOX3V\B#?Q*M[%
    +MRW@;K^-]O)`W\DK>R4MY*Z_EO;R8-_-JWLW+>3NOY_V\H#?TBM[12WI+K^D]
    +MO:@W]:K>UVNO[;V]N#?WZM[=RWM[K^_]O<`W^`K?
    +MX4M\BZ_Q/;[(-_DJW^7+?)NO\WV^T#?Z2M_I2WVKK_6]OM@W^VK?[[`/_L%`.`@+X2%,A(NP$3["2#@)*^$ES(2;
    +ML!-^PE`X"DOA*4R%J[`5OL)8.`MKX2W,A;NP%_["8#@,B^$Q3(;+L!D^PV@X
    +M#:OA-#@/Z^$]S(?[L!_^PX`X$`OB04R(
    +M"[$A/L2(.!$KXD7,B!NQ(W[$D#@22^))3(DKL26^Q)@X$VOB3/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1G@0-2\,]`(U'QT(0``F'H@``@!04A`E$R14P4`B`'!!
    +M03>R*!"+1@0@0`(GDB!`0"D>V.&12":IY)),-NGDDU!&*>645%9IY9583MG$
    +M$DE,\8014X#0Y1,@Y&"##3"\@`28(!B1!!-%3)'%%%04H:$05;Q)1!%2@&`"
    +M"!<6,<034CPH8`M2O$"$%89*44005!`*`@I#I`!"##GD,`,(1;B0Q1-5.'$$
    +M$4'`.6FEEV9Z`PA*N`#%HU)XZ<0+K4XQ!!)O,I&$J%GVZFNO,A"80PP%RA`#
    +M#C/0(`,-!)(0+`S#%GMLLLLV2^"UV&9+(`#/1AN#L<@JRRP,)!CYZ[GHIJON
    +MNNRVZ^Z[\,8K;Y/_U;O8/P(2:*"]_/;K[[\`!US=EDF`T,0;;H#PQ!AT7"K#
    +MI3CHD*P.RX+0K0(RN%"@QC&$8<.FB(+00AUID'&IR&>4;#$(+K3\0AISO"'P
    +MS#37;//-.*>5BR8'WDBD0`0`P(%`!Q*1A!0QL(@!T0!((<4733QA11%$!-V!
    +M0$,:+84,06<@T```:(U#T!X`'?;1,P2M@4`%G"U%#D%_()`!;M/0]@8"'>`V
    +ML0`$#<*.;M<0=`@"*>"V#4'7&-`";M^0\^.01R[YY)17;OGEF&>N^>8PF1C0
    +MC28&+=#0`6B=]$!+!^`TU%)3+7I`5PN@-=<#>3V`V*\#4#8!6J<]T-H%:`WW
    +M0'(;H+7=`^%]@.DP]#W0WPAH+?A`A"N@->(T`K"`UHYS[OWWX(BG;QDD-N((@(X!\>@CD`$(^?.)!TX!Q0$!^/).TU(H0``"`04LL"``[0C"
    +M0(+0#K`19`">(]J0""(`GPWD`E0P@@8"X(`>_2A(;5```R0@`@R0((0C+"$)
    +MAE`$#@1@!`6!H4':49!VN*%]!,G10.3WP?I-L$BJ"^``"WC`!"ZP@06!8$%\
    +M5)`*XBB#&^S@_$`H0A*:$(56)`$`]""T@@P-?N]#T!1]>+\`\.YH,0"@`!/A
    +MA"8DX$!D2(,<8D!$!"I0(`QTX$"42!`F4G!H!.$`%#GH0?J1H)!43*$)^0``
    +M+1*$!%0(`R\"PHLP9'",CCP1D0[@)CBY8`8(^,QG.D?C`AC81I[6+
    +M:2\Q.<\BK%2?6,VJ5K?ZFAM"52`Z!:A'!XJB@B;5I'ED*$N?6I`,2+6'\*3I
    +M.[`!OX
    +MREC.LI;+`V]<2V]/+H,KQEM\'KW*D3?6I?$
    +M*>V;DXFKT<^QV<4TI>O5"'*U.(MYO4"5P69).5\9C#BM9Q9N$P<]D`[XM\59
    +MW+*F-\WI3D/EAI062*'#'"2]/KBD9LXNFK$6:MC].8O,[6(@GQL_,E>-Y'<`8M*8E$GY;#0!+SSN1L'8M%^5&$+DI&]T_/9ZSBRQ'&D@;X-5F./&T
    +M/>Q,A_OC(`^YR#MR0XT+Q.'G]JDLU7UG2*M:TA0T>4`^\&IYNEEW!3&WOB$N
    +MRWY?G->GI2"\=5?S*RH<`'\C"/123E:@UF#B\ZW!S]L==%LF_7DW1\[U
    +MKGO]ZP.YX=4%LO2=JYR@N5[W=3&^:I>./2`@*'I<,UWR@J#<["&N\]1?[NZ8
    +MVUWN<^4BX0A"N(>?W8S7@[IGY6B#O9L8YK88$4
    +MGNECUGN9V!O_G:DTSJ,E^5WVEL^[=)6N_5Q/[ARB3U>+D)6
    +M(#4R?-.YI_C/WL#QU&X[<7\?$!%0?O<>U[STIT]]V-Z0^0`(/NC3/?M_`UW@
    +M3<2^\W4_=YO;&P"H1__K>7AH7(M>UVO_/BV;F'[5DU_#6A0F//[!__[#XR`>
    +MM6.(=S1"Q5>9P&B+)P=(-7KQ1W7@1T'[UW_\!P_/5WXF-`2-%0#<=5/5UX$>
    +M^(&:PR?M$``*0`6'$$1)``5?@"G#`BE(4`0@@"%#L`0QF`1$<`0PN"MU(@6W
    +M$@2B`H-0@"&1,BA,``)!*#4V&"<@,`55``500"A4T":2\H13D`18T"9O`H-R
    +M0B=VLH1VXH-4D`1#H#]P$@13`(.#X@14$`1#$(5&8RM&6`5"H"M3\()]8@22
    +MHC^"D@1N,@20D@1/X`1+""H\V"D0V(@4I&"EW*"EIN(9M.(EX*`67&(:!Z`(@.(NT
    +M6(NVF!%H4`9LP`9O8#BW^(O`&(S".(S$6(S&>(S(F(S*N(S,V(S.^(S0&(W2
    +M.(W46(W6>(W8F(W:N(W^(W@&([B.([D6([F>([HF([JN([LV([N^([P
    +M&(_R.(_T6(_V>(_XF(_ZN(_\V(_^^(\`&9`".9`$69`&>9`(F9`*N9`,V9`.
    +M^9`0&9$2.9$469$6>9$8F9$:N9$^9$@&9(B.9(D69(F>9(HF9(JN9(L
    +MV9(N^9(P&9,R.9,T69,V>9,XF9,ZN9,\V9,^^9-`&91".91$691&>91(F91*
    +MN91,V91.^910&952.9546956>958F95:N95^95@&99B.99D699F>99H
    +MF99JN99LV99N^99P&9=R.9=T69=V>9=XF9=ZN9=\V9=^^9>`&9B".9B$69B&
    +M>9B(F9B*N9B,V9B.^9B0&9F2.9F469F6>9F8F9F:N9F^9F@&9JB.9JD
    +M69JF>9JHF9JJN9JLV9JN^9JP&9NR.9NT69NV>9NXF9NZN9N\V9N^^9O`&9S"
    +M.9S$69S&>9S(F9S*N9S,V9S.^9S0&9W2.9W469W6>9W8F9W:N9W^9W@
    +M&9[B.9[D69[F>9[HF9[JN9[LV9[N^9[P&9_R.9_T69_V>9_XF9_ZN9_\V9_^
    +M^9\`&J`".J`$6J`&>J`(FJ`*NJ`,VJ`.^J`0&J$2.J$46J$6>J$8FJ$:NJ$<
    +MVJ$>^J$@&J(B.J(D6J(F>J(HFJ(JNJ(LVJ(N^J(P&J,R.J,T6J,V>J,XFJ,Z
    +MNJ,\VJ,^^J-`&J1".J1$6J1&>J1(FJ1*NJ1,VJ1.^J10&J52.J546J56>J58
    +MFJ5:NJ5^J5@&J9B.J9D6J9F>J9HFJ9JNJ9LVJ9N^J9P&J=R.J=T6J=V
    +M>J=XFJ=ZNJ=\VJ=^^J>`&JB".JB$6JB&>JB(FJB*NJB,VJB.^JB0&JF2.JF4
    +M6JF6>JF8FJF:NJF^JF@&JJB.JJD6JJF>JJHFJJJNJJLVJJN^JJP&JNR
    +M.JNT6JNV>JNXFJNZNJN\VJN^^JO`&JS".JS$6JS&>JS(FJS*NJS,VJS.^JS0
    +M&JW2.JW46JW6>JW8FJW:NJW^JW@&J[B.J[D6J[F>J[HFJ[JNJ[LVJ[N
    +M^J[P&J_R.J_T6J_V>J_XFJ_ZNJ_\VJ_^^J\`&[`".[`$6[`&>[`(F[`*N[`,
    +MV[`.^[`0&[$2.[$46[$6>[$8F[$:N[$^[$@&[(B.[(D6[(F>[(HF[(J
    +MN[(LV[(N^[(P&[,R.[,T6[,V>[,XF[,ZN[,\V[,^^[-`&[1".[1$6[1&>[1(
    +MF[1*N[1,V[1.^[10&[52.[546[56>[58F[5:N[5^[5@&[9B.[9D6[9F
    +M>[9HF[9JN[9LV[9N^[9P&[=R.[=T6[=V>[=XF[=ZN[=\V[=^^[>`&[B".[B$
    +M6[B&>[B(F[B*N[B,V[B.^[B0&[F2.[F46[F6>[F8F[F:N[F^[F@&[JB
    +M.[JD6[JF>[JHF[JJN[JLV[JN^[JP&[NR.[NT6[NV>[NXF[NZN[N\V[N^^[O`
    +M&[S".[S$6[S&>[S(F[S*N[S,V[S.^[S0&[W2.[W46[W6>[W8F[W:N[W
    +M^[W@&[[B.[[D6[[F>[[HF[[JN[[LV[[N^[[P&[_R.[_T6[_V>[_XF[_ZN[_\
    +MV[_^^[\`',`"/,`$7,`&?,`(G,`*O,`,W,`._,`0',$2/,$47,$6?,$8G,$:
    +MO,$_,$@',(B/,(D7,(F?,(HG,(JO,(LW,(N_,(P',,R/,,T7,,V?,,X
    +MG,,ZO,,\W,,^_,-`',1"/,1$7,1&?,1(G,1*O,1,W,1._,10',52/,547,56
    +M?,58G,5:O,5_,5@',9B/,9D7,9F?,9HG,9JO,9LW,9N_,9P',=R/,=T
    +M7,=V?,=XG,=ZO,=\W,=^_,>`',B"/,B$7,B&?,B(G,B*O,B,W,B._,B0',F2
    +M/,F47,F6?,F8G,F:O,F_,F@',JB/,JD7,JF?,JHG,JJO,JLW,JN_,JP
    +M',NR/,NT7,NV?,NXG,NZO,N\W,N^_,O`',S"/,S$7,S&?,S(G,S*O,S,W,S.
    +M_,S0',W2/,W47,W6?,W8G,W:O,W_,W@',[B/,[D7,[F?,[HG,[JO,[L
    +MW,[N_,[P',_R/,_T7,_V?,_XG,_ZO,_\W,_^_,\`'=`"/=`$7=`&?=`(G=`*
    +MO=`,W=`._=`0'=$2/=$47=$6?=$8G=$:O=$_=$@'=(B/=(D7=(F?=(H
    +MG=(JO=(LW=(N_=(P'=,R/=,T7=,V?=,XG=,ZO=,\W=,^_=-`'=1"/=1$7=1&
    +M?=1(G=1*O=1,W=1._=10'=52/=547=56?=58G=5:O=5_=5@'=9B/=9D
    +M7=9F?=9HG=9JO=9LW=9N_=9P'==R/==T7==V?==XG==ZO==\W==^_=>`'=B"
    +M/=B$7=B&?=B(G=B*O=B,W=B._=B0'=F2/=F47=F6?=F8G=F:O=F_=F@
    +M'=JB/=JD7=JF?=JHG=JJO=JLW=JN_=JP'=NR/=NT7=NV?=NXG=NZO=N\W=N^
    +M_=O`'=S"/=S$7=S&?=S(G=S*O=S,W=S._=S0'=W2/=W47=W6?=W8G=W:O=W<
    +MW=W>_=W@'=[B/=[D7=[F?=[HG=[JO=[LW=[N_=[P'=_R/=_T7=_V?=_XG=_Z
    +MO=_\W=_^_=\`'N`"/N`$7N`&?N`(GN`*ON`,WN`._N`0'N$2/N$47N$6?N$8
    +MGN$:ON$_N$@'N(B/N(D7N(F?N(HGN(JON(LWN(N_N(P'N,R/N,T7N,V
    +M?N,XGN,ZON,\WN,^_N-`'N1"/N1$7N1&?N1(GN1*ON1,WN1._N10'N52/N54
    +M7N56?N58GN5:ON5_N5@'N9B/N9D7N9F?N9HGN9JON9LWN9N_N9P'N=R
    +M/N=T7N=V?N=XGN=ZON=\WN=^_N>`'NB"/NB$7NB&?NB(GNB*ONB,WNB._NB0
    +M'NF2/NF47NF6?NF8GNF:ONF_NF@'NJB/NJD7NJF?NJHGNJJONJLWNJN
    +M_NJP'NNR/NNT7NNV?NNXGNNZONN\WNN^_NO`'NS"/NS$7NS&?NS(GNS*ONS,
    +MWNS._NS0'NW2/NW47NW6?NW8GNW:ONW_NW@'N[B/N[D7N[F?N[HGN[J
    +MON[LWN[N_N[P'N_R/N_T7N_V?N_XGN_ZON_\WN_^_N\`'_`"/_`$7_`&?_`(
    +MG_`*O_`,W_`.__`0'_$2/_$47_$6?_$8G_$:O_$__$@'_(B/_(D7_(F
    +M?_(HG_(JO_(LW_(N__(P'_,R/_,T7_,V?_,XG_,ZO_,\W_,^__-`'_1"/_1$
    +M7_1&?_1(G_1*O_1,W_1.__10'_52/_547_56?_58G_5:O_5__5@'_9B
    +M/_9D7_9F?_9HG_9JO_9LW_9N__9P'_=R/_=T7_=V?_=XG_=ZO_=\W_=^__>`
    +M'_B"/_B$7_B&?_B(G_B*O_B,W_B.__B0'_F2/_F47_F6?_F8G_F:O_F
    +M__F@'_JB/_JD7_JF?_JHG_JJO_JLW_JN__JP'_NR/_NT7_NV?_NXG_NZO_N\
    +MW_N^__O`'_S"/_S$7_S&?_S(G_S*O_S,W_S.__S0'_W2/_W47_W6?_W8G_W:
    +MO_W__W@'_[B/_[D7_[F?_[HG_[JO_[LW_[N__[P'__R/__T7__V?__X
    +MG__ZO__\W__^__\`,``*P`%(``N@`3R`"#`!*L`%R``;H`-\@!`P`DK`"4@!
    +M*Z`%O(`8,`-JP`W(`3N@!_R`(#`$BL`12`)+H`D\@2@P!:K`%<@"6Z`+?($P
    +M,`;*P!E(`VN@#;R!.#`'ZL`=R`-[H`_\@4`P"`K!(4@$BZ`1/()(,`DJP27(
    +M!)N@$WR"4#`*2L$I2`6KH!6\@E@P"VK!+<@%NZ`7_()@,`R*P3%(!LN@&3R#
    +M:#`-JL$UR`;;H!M\@W`P#LK!.4@'ZZ`=O(-X,`_JP3W(!_N@'_R#@#`0"L)!
    +M2`@+H2$\A(@P$2K"1<@(&Z$C?(20,!)*PDE("2NA);R$F#`3:L)-R`D[H2?\
    +MA*`P%(K"44@*2Z$I/(6H,!6JPE7("ENA*WR%L#`6RL)92`MKH2V\A;@P%^K"
    +M7<@+>Z$O_(7`,!@*PV%(#(NA,3R&R#`9*L-ER`R;H3-\AM`P&DK#:4@-JZ$U
    +MO(;8,!MJPVW(#;NA-_R&X#`3R/Z#$]JL?U
    +MR![;HWM\C_`Q/LK'^4@?ZZ-]O(_X,3_JQ_W('_NC?_R/`#)`"L@!22`+I($\
    +MD`@R02K(!Z2/
    +M_)%`,D@*R2%))(NDD3R22#))*LDER22;I)-\DE`R2DK)*4DEJZ25O))8,DMJ
    +MR2W));NDE_R28#),BLDQ22;+I)D\DV@R3:K)-#)/ZLD]R2?[I)_\DX`R4`K*04DH"Z6A/)2(,E$JRD7)*!NEHWR4D#)2
    +M2LI)22DKI:6\E)@R4VK*3RLMY22_KI;V\E_@R7^K+?Z?O_)W`,W@*
    +MS^%)/(NG\3R>R#-Y*L_ER3R;I_-\GM`S>DK/Z4D]JZ?UO)[8,WMJS^W)/;NG
    +M]_R>X#-\BL_Q23[+I_D\G^@S?:K/]4I/ZZD]O:?X-)_JTWW*3_NI/_VG`#6@"M2!2E`+JD$]J`@UH2K4AZI/_:E`-:@*U:%*5(NJ
    +M43VJ2#6I*M6ERE2;JE-]JE`UJDK5J4I5JZI5O:I8-:MJU:W*5;NJ5_VJ8#6L
    +MBM6Q2E;+JED]JV@UK:K5M#6OZM6]RE?[
    +MJE_]JX`UL`K6P4I8"ZMA/:R(-;$JUL7*6!NK8WVLD#6R2M;)2EDKJV6]K)@U
    +MLVK6SRZMY/:_H-;VJU_7*
    +M7MNK>WVO\#6^RM?Y2E_KJWV]K_@UO^K7_ZVO_;7`-M@*VV%+;(NML3VVR#;9
    +M*MMERVR;K;-]MM`VVDK;:4MMJZVUO;;8-MMJVVW+;;NMM_VVX#;`NOX3V\B#?Q*M[%
    +MRW@;K^-]O)`W\DK>R4MY*Z_EO;R8-_-JWLW+>3NOY_V\H#?TBM[12WI+K^D]
    +MO:@W]:K>UVNO[;V]N#?WZM[=RWM[K^_]O<`W^`K?
    +MX4M\BZ_Q/;[(-_DJW^7+?)NO\WV^T#?Z2M_I2WVKK_6]OM@W^VK?[[`/_L%`.`@+X2%,A(NP$3["2#@)*^$ES(2;
    +ML!-^PE`X"DOA*4R%J[`5OL)8.`MKX2W,A;NP%_["8#@,B^$Q3(;+L!D^PV@X
    +M#:OA-#@/Z^$]S(?[L!_^PX`X$`OB04R(
    +M"[$A/L2(.!$KXD7,B!NQ(W[$D#@22^))3(DKL26^Q)@X$VOB3R^-Y
    +M3(_KL3V^Q_@X'^OC?[-O_LW`.3@+Y^%,G(NS<3[.R#DY*^?ES)R;LW-^SM`Y
    +M.DOGZ4R=J[-UOL[8.3MKY^W,G;NS=_[.X#D\B^?Q3)[+LWD^S^@Y/:OG]
    +MV[-[?L_P.3[+Y_E,G^NS?;[/^#D_Z^?]S)_[LW_^SP`Z0`OH`4V@"[2!/M`(
    +M.D$KZ`7-H!NT@W[0$#I"2^@)3:$KM(6^T!@Z0VOH#4VOZ[6]OM?X.E_KZWW-K_NUO_[7`#M@
    +M"^R!3;`+ML$^V`@[82OLA[;/_ME`.V@+[:%-M(NVT3[:2#MI*^VES;2;MM-^VE`[:DOMJ4VU
    +MJ[;5OMI8.VMK[:W-M;NVU_[:8#MLB^VQ3;;+MMD^VV@[;:OMM#MOZ^V]S;?[MM_^VX`[<`ONP4VX"[?A/MR(.W$K[L7-
    +MN!NWXW[2OOYV#M[:^_MS;V[M_?^
    +MWN`[?(OO\4V^R[?Y/M_H.WVK[_7-OMNW^W[?\#M^R^_Y3;_KM_V^W_@[?^OO
    +M_[DO_^7`/)@+\V%.S(NY,3_FR#R9*_-ESLR;N3-_YM`\FDOS:4[-J[DUO^;8
    +M/)MK\VW.S;NY-__FX#R3_OZ#V]J_?USM[;
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
    +M;"@;SH:T86UH&]Z&N&%NJ!ONAKQA;^@;_H;`87`H'`Z'Q&%Q:!P>A\AA"@>CH?D
    +M87EH'IZ'Z&%ZJ!ZNA^QA>^@>OH?P87PH'\Z']&%]:!_>A_AA?J@?[H?\87_H
    +M'_Z'`&*`*"`.B`1B@6@@'H@(8H*H("Z(#&*#Z"`^B!!BA"@A3H@48H5H(5Z(
    +M&&*&J"%NB!QBA^@A?H@@8H@H(HZ()&*):"*>B"ABBJ@BKH@L8HOH(KZ(,&*,
    +M*"/.B#1BC6@CWH@X8HZH(^Z(/&*/Z"/^B$!BD"@D#HE$8I%H)!Z)2&*2J"0N
    +MB4QBD^@D/HE08I0H)4Z)5&*5:"5>B5ABEJ@E;HE<8I?H)7Z)8&*8*":.B61B
    +MF6@FGHEH8IJH)JZ);&*;Z":^B7!BG"@GSHET8IUH)]Z)>&*>J"?NB7QBG^@G
    +M_HF`8J`H*`Z*A&*A:"@>BHABHJ@H+HJ,8J/H*#Z*D&*D*"E.BI1BI6@I7HJ8
    +M8J:H*6Z*G&*GZ"E^BJ!BJ"@JCHJD8JEH*IZ*J&*JJ"JNBJQBJ^@JOHJP8JPH
    +M*\Z*M&*M:"O>BKABKJ@K[HJ\8J_H*_Z*P&*P*"P.B\1BL6@L'HO(8K*H+"Z+
    +MS&*SZ"P^B]!BM"@M3HO48K5H+5Z+V&*VJ"UNB]QBM^@M?HO@8K@H+HZ+Y&*Y
    +M:"Z>B^ABNJ@NKHOL8KOH+KZ+\&*\*"_.B_1BO6@OWHOX8KZH+^Z+_&*_Z"_^
    +'BP!CP+@7`0``
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu b/lib/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu
    new file mode 100644
    index 000000000000..00896e1f67e7
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_iso_zisofs.iso.Z.uu
    @@ -0,0 +1,63 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_iso_zisofs.iso.Z
    +M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR
    +MI,F3*%.J7,FRIO8,.*'4NVK-FS:-.J7//JW/'D"-+GDRYLN7+F#-KWLRY
    +ML^?/H$.+'DVZM.G3J%.K7LVZM>O7L&/+GDV[MNW;N'/KWLV[M^_?P(,+'TZ\
    +MN/'CR),K7\Z\N?/GT*-+GTZ]NO7KV+-KW\Z]N_?OX,.+'T^^O/GSZ-.K7\^^
    +MO?OW\./+GT^_OOW[^//KW\^_O_^_`0Q!!`PPQ!```$;(44890DQ!!`@01BCA
    +MA!1***`43S11X88<1GA0+`6!Z-&!``1`XH$((`"`!059,$%"%0PD`@`7%%2C
    +MB@*I:$0``B10(@D"!'3B@1T6:>212":IY)),-NGDDU!&*>645%9I991-+)'$
    +M%$\8,04(6SX!0@XVV`##"TAX"8(123!1Q!193$%%$1H*446;1!0A!0@F@'!A
    +M$4,\(<6#`K8@Q0M$6$&H%$4$086@(*`P1`H@Q)!##C.`4(0+63Q1A1-'$!&$
    +MFY%.6NFE-X"@A`M0-"H%ETZ\L.H40R#1)A-)@'KEKKSN*@.!.<`0K`PRQ$!#
    +M#300"`,)OPKK++'&(JLL"NXY)9K[KGHIJON
    +MNNRVZ^Z2_\6[V#\"$FB@O/CFJ^^^_/9;799)@'!%&62`,$49<$`H`PC%ZG"L
    +MPS`P#*P";:R1QAQOF#$'PRX4"(*A']>11L$Q?'S&R`Q_K`<(+K3\@AX7O^'O
    +MS#37;//-.)=U8(U""C0``!@(="`124B1\]%()ZWTTDPW[?334$M]MI,(T*CC0#@&)".//H8`)`]EWC@
    +M%%`<$(`O[P`@A10%!!`(%%B$VTX0`P71CM8##6"UT$$2)``51F@0@`,[]OAC
    +M&PD(4$$+*)``NNBDDS!$$1P$D$%!KQO43D'MF/$V03<.1+?G=U<^9`"#%WYX
    +MX@$LWOCC!4E>$(\%79[YYIW;;7KHHY=^>O4D```'T`4%+7?<"-;]H^]"#N!U
    +M\`$DXD03"!Q(1AIR(*XXXP(Y7OE``DPNY/T".:\YY^*[6_0^1[W4`8`0`-!`
    +M031@`P,,Q``V&.#=A":D`[#)32[800S0I[XF).!`9D@#&\H@OP"0(A`#"00I
    +M^!>0_"V/A0#P'_0"2`()3@]UI=."$2`0`#CH@0`/H$(8>!$07H2!"HQ(X`(;
    +M^,`(TI"")5H`$H(P*%PY80D9W"#ATK>^!AP(#6&0`QG8D`8WK*&$)TSA"ING
    +MOQ+!4(8`Y-T-L7>]U.F0ASX$HA")"``C4L$0`-A`001I$!M",0`*@%,3K(A%
    +M#0INBXU8'P,.-(<\M(&,9BPA,$(QD%``HXTF>F'SIL"$!9"(`"$<(>;^MZ,!
    +M^$@`-0R`*V,XQ]2YC9`#P25!ZEBZ0RY`D8R401;1%\DF>!$`E;QD&=<@`TUR
    +M4B">!"4HWTC*28(/``.@0QO@L,K-\;*6UBM@Z101R$$>Y'0%^%GV\A:`7V9A
    +MD;E:P@R&"%HA4`^+TK&A-JUK7:A$]M0.15#B$
    +M5I,`A2]8*@C``IO@$J"6P:@J.2\`0G&,Q3B-T4A&;+
    +M6-\"5[A@RI-MD9L$/8')N8U-0A.HF`406.$)3*A"$_B:)UI)@:Z/&BZD:GO;
    +MW'Z7N%(8;VN;ZP*V^O>_``[PS&Y`CBE8(AG;L,8!]JC2!P0$'P4("!,!,.$*
    +M.Y#"%[:PA#/,X0U[&,,?UC"(1RSB$G>8Q"9
    +MRE>VQG+7]8RF,I2F_K4J$ZUJE?-ZE:[^M6PCK6L9TWK6MOZUKC.
    +MM:YWS>M>^_K7P`ZVL(=-[&(;^]C(3K:RE\WL9CO[V=".MK2G3>UJ6_O:V,ZV
    +MMK?-[6Y[^]O@#K>XQTWNYVN_O=\(ZWO.=-[WK;^][XSK>^
    +M]\WO?OO[WP`/N,`'3O""&_S@"$^XPA?.\(8[_.$0C[C$)T[QBEO\XAC/N,8W
    +MSO&.>_SC(`^YR$=.\I*;_.0H3[G*5\[REKO\Y3"/NI8S[K6M\[U
    +MKGO]ZV`/N]C'3O:RF_WL:$^[VM?.]K:[_>UPC[O^
    +M^_WO@`^\X`=/^,(;_O"(3[SB%\_XQCO^\9"/O.0G3_G*6_[RF,^\YC?/^I7S_K6N_[UL(^][&=/^]K;_O:XS[WN=\_[WOO^
    +M]\`/OO"'3_SB&__XR$^^\I?/_.8[__G0C[[TIT_]ZEO_^MC/OO:WS_WN>__[
    +MX`^_^,=/_O*;__SH3[_ZU\_^]KO__?"/O_SG3__ZV__^^,^__O?/__[[__\`
    +M&(`".(`$6(`&>(`(F(`*N(`,V(`.^(`0&($2.($46($6>($8F($:N($
    +M^($@&((B.((D6((F>((HF((JN((LV((N^((P&(,R.(,T6(,V>(,XF(,ZN(,\
    +MV(,^^(-`&(1".(1$6(1&>(1(F(1*N(1,V(1.^(10&(52.(546(56>(58F(5:
    +MN(5^(5@&(9B.(9D6(9F>(9HF(9JN(9LV(9N^(9P&(=R.(=T6(=V>(=X
    +MF(=ZN(=\V(=^^(>`&(B".(B$6(B&>(B(F(B*N(B,V(B.^(B0&(F2.(F46(F6
    +@>(F8F(F:N(F^(F@&(JB.(JD6(JF>(JHF(JJN'``
    +`
    +end
    diff --git a/lib/libarchive/test/test_read_format_isojoliet_bz2.c b/lib/libarchive/test/test_read_format_isojoliet_bz2.c
    index 9ee87c91cba6..b2f22a7a597f 100644
    --- a/lib/libarchive/test/test_read_format_isojoliet_bz2.c
    +++ b/lib/libarchive/test/test_read_format_isojoliet_bz2.c
    @@ -46,49 +46,39 @@ else
     TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/long-joliet-file-name.textfile /tmp/iso/dir
     TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
     fi
    -mkhybrid -J -uid 1 -gid 2 /tmp/iso | bzip2 > test_read_format_isojoliet_bz2.iso.bz2
    -F=test_read_format_isojoliet_bz2.iso.bz2
    +F=test_read_format_iso_joliet.iso.Z
    +mkhybrid -J -uid 1 -gid 2 /tmp/iso | compress > $F
     uuencode $F $F > $F.uu
     exit 1
      */
     
    -static void
    -joliettest(int withrr)
    +DEFINE_TEST(test_read_format_isojoliet_bz2)
     {
    -	const char *refname = "test_read_format_isojoliet_bz2.iso.bz2";
    +	const char *refname = "test_read_format_iso_joliet.iso.Z";
     	struct archive_entry *ae;
     	struct archive *a;
     	const void *p;
     	size_t size;
     	off_t offset;
    -	int r;
    -
    -	if (withrr) {
    -		refname = "test_read_format_isojolietrr_bz2.iso.bz2";
    -	}
     
     	extract_reference_file(refname);
     	assert((a = archive_read_new()) != NULL);
    -	r = archive_read_support_compression_bzip2(a);
    -	if (r == ARCHIVE_WARN) {
    -		skipping("bzip2 reading not fully supported on this platform");
    -		assertEqualInt(0, archive_read_finish(a));
    -		return;
    -	}
    -	assertEqualInt(0, r);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
     	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_set_options(a, "iso9660:!rockridge"));
     	assertEqualInt(ARCHIVE_OK,
     	    archive_read_open_filename(a, refname, 10240));
     
     	/* First entry is '.' root directory. */
     	assertEqualInt(0, archive_read_next_header(a, &ae));
     	assertEqualString(".", archive_entry_pathname(ae));
    -	assert(S_ISDIR(archive_entry_stat(ae)->st_mode));
    +	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
     	assertEqualInt(2048, archive_entry_size(ae));
     	assertEqualInt(86401, archive_entry_mtime(ae));
     	assertEqualInt(0, archive_entry_mtime_nsec(ae));
     	assertEqualInt(86401, archive_entry_ctime(ae));
    -	assertEqualInt(0, archive_entry_stat(ae)->st_nlink);
    +	assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
     	assertEqualInt(0, archive_entry_uid(ae));
     	assertEqualIntA(a, ARCHIVE_EOF,
     	    archive_read_data_block(a, &p, &size, &offset));
    @@ -97,100 +87,48 @@ joliettest(int withrr)
     	/* A directory. */
     	assertEqualInt(0, archive_read_next_header(a, &ae));
     	assertEqualString("dir", archive_entry_pathname(ae));
    -	assert(S_ISDIR(archive_entry_stat(ae)->st_mode));
    +	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
     	assertEqualInt(2048, archive_entry_size(ae));
     	assertEqualInt(86401, archive_entry_mtime(ae));
     	assertEqualInt(86401, archive_entry_atime(ae));
    -	if (withrr) {
    -		assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    -		assertEqualInt(1, archive_entry_uid(ae));
    -		assertEqualInt(2, archive_entry_gid(ae));
    -	}
     
     	/* A regular file with two names ("hardlink" gets returned
     	 * first, so it's not marked as a hardlink). */
     	assertEqualInt(0, archive_read_next_header(a, &ae));
    -	assertEqualString("hardlink", archive_entry_pathname(ae));
    -	assert(S_ISREG(archive_entry_stat(ae)->st_mode));
    +	assertEqualString("long-joliet-file-name.textfile",
    +	    archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
     	assert(archive_entry_hardlink(ae) == NULL);
     	assertEqualInt(6, archive_entry_size(ae));
     	assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset));
     	assertEqualInt(6, (int)size);
     	assertEqualInt(0, offset);
     	assertEqualInt(0, memcmp(p, "hello\n", 6));
    -	if (withrr) {
    -		assertEqualInt(86401, archive_entry_mtime(ae));
    -		assertEqualInt(86401, archive_entry_atime(ae));
    -		/* TODO: Actually, libarchive should be able to
    -		 * compute nlinks correctly even without RR
    -		 * extensions. See comments in libarchive source. */
    -		assertEqualInt(2, archive_entry_nlink(ae));
    -		assertEqualInt(1, archive_entry_uid(ae));
    -		assertEqualInt(2, archive_entry_gid(ae));
    -	}
     
     	/* Second name for the same regular file (this happens to be
     	 * returned second, so does get marked as a hardlink). */
     	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString("hardlink", archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
     	assertEqualString("long-joliet-file-name.textfile",
    -	    archive_entry_pathname(ae));
    -	assert(S_ISREG(archive_entry_stat(ae)->st_mode));
    -	assertEqualString("hardlink", archive_entry_hardlink(ae));
    +	    archive_entry_hardlink(ae));
     	assert(!archive_entry_size_is_set(ae));
    -	if (withrr) {
    -		assertEqualInt(86401, archive_entry_mtime(ae));
    -		assertEqualInt(86401, archive_entry_atime(ae));
    -		/* TODO: See above. */
    -		assertEqualInt(2, archive_entry_nlink(ae));
    -		assertEqualInt(1, archive_entry_uid(ae));
    -		assertEqualInt(2, archive_entry_gid(ae));
    -	}
     
     	/* A symlink to the regular file. */
     	assertEqualInt(0, archive_read_next_header(a, &ae));
     	assertEqualString("symlink", archive_entry_pathname(ae));
    -	if (withrr) {
    -		assert(S_ISLNK(archive_entry_stat(ae)->st_mode));
    -		assertEqualString("long-joliet-file-name.textfile",
    -		    archive_entry_symlink(ae));
    -	}
     	assertEqualInt(0, archive_entry_size(ae));
     	assertEqualInt(172802, archive_entry_mtime(ae));
     	assertEqualInt(172802, archive_entry_atime(ae));
    -	if (withrr) {
    -		assertEqualInt(1, archive_entry_nlink(ae));
    -		assertEqualInt(1, archive_entry_uid(ae));
    -		assertEqualInt(2, archive_entry_gid(ae));
    -	}
     
     	/* End of archive. */
     	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
     
     	/* Verify archive format. */
    -	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2);
    -	if (withrr) {
    -		assertEqualInt(archive_format(a),
    -		    ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
    -	}
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
     
     	/* Close the archive. */
     	assertEqualInt(0, archive_read_close(a));
     	assertEqualInt(0, archive_read_finish(a));
     }
     
    -
    -DEFINE_TEST(test_read_format_isojoliet_bz2)
    -{
    -	joliettest(0);
    -
    -	/* XXXX This doesn't work today; can it be made to work? */
    -#if 0
    -	joliettest(1);
    -#else
    -	skipping("Mixed Joliet/RR not fully supported yet.");
    -#endif
    -}
    -
    -
    -
    -
    diff --git a/lib/libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu b/lib/libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu
    deleted file mode 100644
    index 0cf1de8b8ab4..000000000000
    --- a/lib/libarchive/test/test_read_format_isojoliet_bz2.iso.bz2.uu
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -$FreeBSD$
    -begin 644 test_read_format_isojoliet_bz2.iso.bz2
    -M0EIH.3%!62936??^FX(``/9_^__?1_?^8__L/__?8:?_W&8@Z@$`9``008"`
    -M``+)"-`$/@=NN!W8[`8#23*GY-3U$](,0:`:`&"`9``9``T-'J::>B/4``#0
    -MIM$9&IA-!-0'I`>HT`&1Z@``T`!H`:#0'H(,E-(-3-$-&AB-`8C0`R9#1A`#
    -M1A/1`&@,@!H'``#0`-`&@``-&(`!H`````&@`D1)H0B-1O)&4V2:9#"9/4/2
    -M`/4>H'J-#(83U/$R@WZJ#>J&CREP**.W2R[".$_:J#$"N5P7:?.#4-4/..?K
    -M!KG\G]P="PX^ADTP4^Y%[1+0V,;$*HTA&\V'@+*$<.M-0L@CLZ\Z(B=]`3`4%B"00B`FF@!-]HK<2.
    -M)?&IAD^/KKM>TRY#@+H5W781AM)P\\-4$&88^S$WX"2$=(X7(?,=$?H.A')A
    -M`%2T4:GEQRL:WS4Q=4SU(F>*JM1UEK\V`5P$L[9[D*;FBNEC^GPMAH8T>K&>
    -MQ)_.TSB;5G`P>)20L5V6':NL^M38\&.')5))BO/*5`\P%H!`D7B2](0T)?Y0"`M3A6)'=($UL$@I$0$RBA0F4.!DAM`/@
    -M!V,L#/`+FC!;C.K58BA"1P\H1LVXG\@^"8IJ@0*0>TP@8F#0R^(M($"`"#I"
    -M`.FD45RN3EH2^8X6C/LKMKA;@K,T&ZZ%&PIJW%:>FG[.F=KGJ_O.(K`+0#!@
    -MQK&-G6!">H`4_/.<\CK)K+S/I/"?`9JG,TS^C1FI[O3NN(`Q^:*`Z1WEO()6
    -MZ*!0@MSD*1?AE*V5[='!>>O%XL8LXIOQB\@CIBM%\0JD'+MAR$"@T'8M;JFM
    -MLHN7HG1S:F]+B'BZ)SJ(=0,6*Z791QW+3RNI(7!E!)'@.B$(934!)D0=U#%#
    -MV21)DA=@4;RM?@RLG1[`,A:"YQF2!`P`2B)#APE)`^\F8V
    -M5_U]0O,4AE6?->8U4$<2N%TC-HD%($@9'E1DCQZ&B:X4\IUV83HQ7)A'8I511-P`;=!!).^8X*0NHMB+.&!W"009
    -M,<;0G^>BA6F[;A;X2B!%?BP&(G7&@(,*O-QP;;1*`*6"F:X8D"Y$/T,(1JM'
    -M$>\,IQ&V6;/)!\)0C$,[;`O,`9A-HRHQ8@^PLT.?=7RL[2789J_J86!HF0T"
    -M3%@,A$VPC(:A@3(\&9-TZP2>KA*D>D;<^L4(H=EUT419R5`$A(R(Y-^O
    -+_B[DBG"A(>_]-P0`
    -`
    -end
    diff --git a/lib/libarchive/test/test_read_format_isojoliet_long.c b/lib/libarchive/test/test_read_format_isojoliet_long.c
    new file mode 100644
    index 000000000000..acd220f4b6e6
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_isojoliet_long.c
    @@ -0,0 +1,141 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * Copyright (c) 2009 Michihiro NAKAJIMA
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +/*
    +Execute the following to rebuild the data for this program:
    +   tail -n +35 test_read_format_isojoliet_long.c | /bin/sh
    +
    +rm -rf /tmp/iso
    +mkdir /tmp/iso
    +num=0
    +file="";
    +while [ $num -lt 100 ]
    +do
    +  num=$((num+10))
    +  file="${file}1234567890"
    +done
    +dir="${file}dir"
    +mkdir /tmp/iso/${dir}
    +file="${file}123"
    +echo "hello" > /tmp/iso/${file}
    +ln /tmp/iso/${file} /tmp/iso/hardlink
    +if [ "$(uname -s)" = "Linux" ]; then # gnu coreutils touch doesn't have -h
    +TZ=utc touch -afm -t 197001020000.01 /tmp/iso /tmp/iso/${file} /tmp/iso/${dir}
    +else
    +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/${file} /tmp/iso/${dir}
    +fi
    +F=test_read_format_iso_joliet_long.iso.Z
    +mkhybrid -J -joliet-long -uid 1 -gid 2 /tmp/iso | compress > $F
    +uuencode $F $F > $F.uu
    +rm -rf /tmp/iso
    +exit 1
    + */
    +
    +DEFINE_TEST(test_read_format_isojoliet_long)
    +{
    +	const char *refname = "test_read_format_iso_joliet_long.iso.Z";
    +	char pathname[104];
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	const void *p;
    +	size_t size;
    +	off_t offset;
    +	int i;
    +
    +	for (i = 0; i < 100; i++)
    +		pathname[i] = '0' + ((i+1) % 10); 
    +	extract_reference_file(refname);
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
    +	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_set_options(a, "iso9660:!rockridge"));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_open_filename(a, refname, 10240));
    +
    +	/* First entry is '.' root directory. */
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString(".", archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +	assertEqualInt(2048, archive_entry_size(ae));
    +	assertEqualInt(86401, archive_entry_mtime(ae));
    +	assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +	assertEqualInt(86401, archive_entry_ctime(ae));
    +	assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +	assertEqualInt(0, archive_entry_uid(ae));
    +	assertEqualIntA(a, ARCHIVE_EOF,
    +	    archive_read_data_block(a, &p, &size, &offset));
    +	assertEqualInt((int)size, 0);
    +
    +	/* A directory. */
    +	pathname[100] = 'd';
    +	pathname[101] = 'i';
    +	pathname[102] = 'r';
    +	pathname[103] = '\0';
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString(pathname, archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +	assertEqualInt(2048, archive_entry_size(ae));
    +	assertEqualInt(86401, archive_entry_mtime(ae));
    +	assertEqualInt(86401, archive_entry_atime(ae));
    +
    +	/* A regular file with two names (pathname gets returned
    +	 * first, so it's not marked as a hardlink). */
    +	pathname[100] = '1';
    +	pathname[101] = '2';
    +	pathname[102] = '3';
    +	pathname[103] = '\0';
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString(pathname, archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +	assert(archive_entry_hardlink(ae) == NULL);
    +	assertEqualInt(6, archive_entry_size(ae));
    +	assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset));
    +	assertEqualInt(6, (int)size);
    +	assertEqualInt(0, offset);
    +	assertEqualInt(0, memcmp(p, "hello\n", 6));
    +
    +	/* Second name for the same regular file (this happens to be
    +	 * returned second, so does get marked as a hardlink). */
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString("hardlink", archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +	assertEqualString(pathname, archive_entry_hardlink(ae));
    +	assert(!archive_entry_size_is_set(ae));
    +
    +	/* End of archive. */
    +	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify archive format. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
    +
    +	/* Close the archive. */
    +	assertEqualInt(0, archive_read_close(a));
    +	assertEqualInt(0, archive_read_finish(a));
    +}
    +
    diff --git a/lib/libarchive/test/test_read_format_isojoliet_rr.c b/lib/libarchive/test/test_read_format_isojoliet_rr.c
    new file mode 100644
    index 000000000000..394df144f3ca
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_isojoliet_rr.c
    @@ -0,0 +1,159 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * All rights reserved.
    + *
    + * Based on libarchive/test/test_read_format_isorr_bz2.c with
    + * bugs introduced by Andreas Henriksson  for
    + * testing ISO9660 image with Joliet extension.
    + *
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +/*
    +Execute the following to rebuild the data for this program:
    +   tail -n +35 test_read_format_isojoliet_rr.c | /bin/sh
    +
    +rm -rf /tmp/iso
    +mkdir /tmp/iso
    +mkdir /tmp/iso/dir
    +file="long-joliet-file-name.textfile"
    +echo "hello" >/tmp/iso/$file
    +ln /tmp/iso/$file /tmp/iso/hardlink
    +(cd /tmp/iso; ln -s $file symlink)
    +if [ "$(uname -s)" = "Linux" ]; then # gnu coreutils touch doesn't have -h
    +TZ=utc touch -afm -t 197001020000.01 /tmp/iso/hardlink /tmp/iso/$file /tmp/iso/dir
    +TZ=utc touch -afm -t 197001030000.02 /tmp/iso/symlink
    +TZ=utc touch -afm -t 197001020000.01 /tmp/iso
    +else
    +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso/hardlink /tmp/iso/$file /tmp/iso/dir
    +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
    +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso
    +fi
    +F=test_read_format_iso_joliet_rockridge.iso.Z
    +mkhybrid -J -uid 1 -gid 2 /tmp/iso | compress > $F
    +uuencode $F $F > $F.uu
    +exit 1
    + */
    +
    +DEFINE_TEST(test_read_format_isojoliet_rr)
    +{
    +	const char *refname = "test_read_format_iso_joliet_rockridge.iso.Z";
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	const void *p;
    +	size_t size;
    +	off_t offset;
    +
    +	extract_reference_file(refname);
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
    +	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_open_filename(a, refname, 10240));
    +
    +	/* First entry is '.' root directory. */
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString(".", archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +	assertEqualInt(2048, archive_entry_size(ae));
    +	assertEqualInt(86401, archive_entry_mtime(ae));
    +	assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +	assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +	assertEqualInt(1, archive_entry_uid(ae));
    +	assertEqualIntA(a, ARCHIVE_EOF,
    +	    archive_read_data_block(a, &p, &size, &offset));
    +	assertEqualInt((int)size, 0);
    +
    +	/* A directory. */
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString("dir", archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +	assertEqualInt(2048, archive_entry_size(ae));
    +	assertEqualInt(86401, archive_entry_mtime(ae));
    +	assertEqualInt(86401, archive_entry_atime(ae));
    +	assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +	assertEqualInt(1, archive_entry_uid(ae));
    +	assertEqualInt(2, archive_entry_gid(ae));
    +
    +	/* A regular file with two names ("hardlink" gets returned
    +	 * first, so it's not marked as a hardlink). */
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString("long-joliet-file-name.textfile",
    +	    archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +	assert(archive_entry_hardlink(ae) == NULL);
    +	assertEqualInt(6, archive_entry_size(ae));
    +	assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset));
    +	assertEqualInt(6, (int)size);
    +	assertEqualInt(0, offset);
    +	assertEqualInt(0, memcmp(p, "hello\n", 6));
    +	assertEqualInt(86401, archive_entry_mtime(ae));
    +	/* mkisofs records their access time. */
    +	/*assertEqualInt(86401, archive_entry_atime(ae));*/
    +	/* TODO: Actually, libarchive should be able to
    +	 * compute nlinks correctly even without RR
    +	 * extensions. See comments in libarchive source. */
    +	assertEqualInt(2, archive_entry_nlink(ae));
    +	assertEqualInt(1, archive_entry_uid(ae));
    +	assertEqualInt(2, archive_entry_gid(ae));
    +
    +	/* Second name for the same regular file (this happens to be
    +	 * returned second, so does get marked as a hardlink). */
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString("hardlink", archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +	assertEqualString("long-joliet-file-name.textfile",
    +	    archive_entry_hardlink(ae));
    +	assert(!archive_entry_size_is_set(ae));
    +	assertEqualInt(86401, archive_entry_mtime(ae));
    +	assertEqualInt(86401, archive_entry_atime(ae));
    +	/* TODO: See above. */
    +	assertEqualInt(2, archive_entry_nlink(ae));
    +	assertEqualInt(1, archive_entry_uid(ae));
    +	assertEqualInt(2, archive_entry_gid(ae));
    +
    +	/* A symlink to the regular file. */
    +	assertEqualInt(0, archive_read_next_header(a, &ae));
    +	assertEqualString("symlink", archive_entry_pathname(ae));
    +	assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +	assertEqualString("long-joliet-file-name.textfile",
    +	    archive_entry_symlink(ae));
    +	assertEqualInt(0, archive_entry_size(ae));
    +	assertEqualInt(172802, archive_entry_mtime(ae));
    +	assertEqualInt(172802, archive_entry_atime(ae));
    +	assertEqualInt(1, archive_entry_nlink(ae));
    +	assertEqualInt(1, archive_entry_uid(ae));
    +	assertEqualInt(2, archive_entry_gid(ae));
    +
    +	/* End of archive. */
    +	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify archive format. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
    +
    +	/* Close the archive. */
    +	assertEqualInt(0, archive_read_close(a));
    +	assertEqualInt(0, archive_read_finish(a));
    +}
    +
    diff --git a/lib/libarchive/test/test_read_format_isojolietrr_bz2.iso.bz2.uu b/lib/libarchive/test/test_read_format_isojolietrr_bz2.iso.bz2.uu
    deleted file mode 100644
    index 9258c186595e..000000000000
    --- a/lib/libarchive/test/test_read_format_isojolietrr_bz2.iso.bz2.uu
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -$FreeBSD$
    -begin 644 test_read_format_isojolietrr_bz2.iso.bz2
    -M0EIH.3%!6293695"/:0``/9_^__?1??^8_WL/__?8:?_W&8@Z@$`9``008"`
    -M``+)"-`$/@36`T;`8#*3*GY3U-$R`T::`&F@`!HQ`T9&FC0T!Z@8C0``-"-$
    -M9&IA-!3U`9`:-``]0``#0T!H`](`'J9!P`---``9```-```-```R``&AH`<`
    -M#330`&0``#0``#0``,@`!H:`"1$FIBFBGE/&H;4/5!H&GJ9,C(&3]4>H&T@!
    -MX4S4_23)^I!^J&,I:"BCP:NQU49CQU07@K5:%N+FASC:#&<_H!T3^C_8,EAR
    -M>AAY@*??BYHEH;&-B%4:0N+*$9NC-0L@CJ9)U!$ST`F*D.$$@A"`320`3$S7*"&2:*6P36])5
    -M/UEPPP-G5GGH*!-7B20Y.4AU"9MM0?K(C+%&%#XTJCZZ.GH)4JHJ2)5-QVD^9IA`
    -MJ%BPT5G;#K;5KM8^'@["26TJX1E,$$=G]($UUB04B("910H3*'`R0R@/,#L98&B`7-&
    -M"[C.G57E"$CP=BMVJ(CYQYJ5$37&!`J`\K""HB!0#0RZ(M($"`9Q##2WW*HJ
    -M);;2U[_KWUN>.EE\=W@T_FK1D:C59VF:FHGY.JASX+#OO(K0+@#!@Q]C&S&H
    -M`7LV-TZ>LFMC7W3@.V;-37Q'^&I-3X>E;:0!I<(H#U#>7?02J"@4(*Z"%P[!
    -M6EG=HX+CKQ:+0*\$Q3=05!208:0Y"@I%)<\JQ^N8_<147'#8&2%E+]X01#.8H+0J!NJ=8/99+F^C?B4L"NABYS:$@T
    -M'/CG%2[+1.R0(O$0N!93,D"!H`F$B'`C,2"&!,YML_<*Q@:I#GK1GP-FSA<4[2H)(;4,0KAA2WE9%>%ON#\AF6`/K>AZ1ANTM,HF-?E[&N9,4K"B`+BOD
    -M8@EUE%*/R3*BB??@W::!E$)SBI"^BVHM`:'\%!%LYRN"?R"*%<;]L%PA*8D6
    -M&308D=DJ0@QK`WG%UU,P`J:*I[QA@7209C/",;1QGP#*<9E+.QRP=LH1>,W6
    -M!<9P9GG`,J,5X?86:?0MKY&=E+J,Q^(SV!J&$TR2_.,A$X(1A-HSDR/.S#PG
    -ILA)[>>5(]8W)ZY0BAMDR3TMM%$6/tmp/iso/file
    -dd if=/dev/zero bs=1 count=12345678 >>/tmp/iso/file
    +dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file
     ln /tmp/iso/file /tmp/iso/hardlink
     (cd /tmp/iso; ln -s file symlink)
    +(cd /tmp/iso; ln -s /tmp/ symlink2)
    +(cd /tmp/iso; ln -s /tmp/../ symlink3)
    +(cd /tmp/iso; ln -s .././../tmp/ symlink4)
    +(cd /tmp/iso; ln -s .///file symlink5)
    +(cd /tmp/iso; ln -s /tmp//../ symlink6)
     TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir
    -TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
    -mkhybrid -R -uid 1 -gid 2 /tmp/iso | bzip2 > test_read_format_isorr_bz2.iso.bz2
    -F=test_read_format_isorr_bz2.iso.bz2
    +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink /tmp/iso/symlink5
    +F=test_read_format_iso_rockridge.iso.Z
    +mkhybrid -R -uid 1 -gid 2 /tmp/iso | compress > $F
     uuencode $F $F > $F.uu
     exit 1
      */
     
     DEFINE_TEST(test_read_format_isorr_bz2)
     {
    -	const char *refname = "test_read_format_isorr_bz2.iso.bz2";
    +	const char *refname = "test_read_format_iso_rockridge.iso.Z";
     	struct archive_entry *ae;
     	struct archive *a;
     	const void *p;
     	size_t size;
     	off_t offset;
    -	int r;
    +	int i;
     
     	extract_reference_file(refname);
     	assert((a = archive_read_new()) != NULL);
    -	r = archive_read_support_compression_bzip2(a);
    -	if (r == ARCHIVE_WARN) {
    -		skipping("bzip2 reading not fully supported on this platform");
    -		assertEqualInt(0, archive_read_finish(a));
    -		return;
    -	}
    -	assertEqualInt(0, r);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
     	assertEqualInt(0, archive_read_support_format_all(a));
     	assertEqualInt(ARCHIVE_OK,
     	    archive_read_open_filename(a, refname, 10240));
     
    -	/* First entry is '.' root directory. */
    -	assertEqualInt(0, archive_read_next_header(a, &ae));
    -	assertEqualString(".", archive_entry_pathname(ae));
    -	assert(S_ISDIR(archive_entry_stat(ae)->st_mode));
    -	assertEqualInt(2048, archive_entry_size(ae));
    -	assertEqualInt(86401, archive_entry_mtime(ae));
    -	assertEqualInt(0, archive_entry_mtime_nsec(ae));
    -	assertEqualInt(86401, archive_entry_ctime(ae));
    -	assertEqualInt(0, archive_entry_stat(ae)->st_nlink);
    -	assertEqualInt(0, archive_entry_uid(ae));
    -	assertEqualIntA(a, ARCHIVE_EOF,
    -	    archive_read_data_block(a, &p, &size, &offset));
    -	assertEqualInt((int)size, 0);
    +	/* Retrieve each of the 8 files on the ISO image and
    +	 * verify that each one is what we expect. */
    +	for (i = 0; i < 10; ++i) {
    +		assertEqualInt(0, archive_read_next_header(a, &ae));
     
    -	/* A directory. */
    -	assertEqualInt(0, archive_read_next_header(a, &ae));
    -	assertEqualString("dir", archive_entry_pathname(ae));
    -	assert(S_ISDIR(archive_entry_stat(ae)->st_mode));
    -	assertEqualInt(2048, archive_entry_size(ae));
    -	assertEqualInt(86401, archive_entry_mtime(ae));
    -	assertEqualInt(86401, archive_entry_atime(ae));
    -	assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    -	assertEqualInt(1, archive_entry_uid(ae));
    -	assertEqualInt(2, archive_entry_gid(ae));
    -
    -	/* A regular file. */
    -	assertEqualInt(0, archive_read_next_header(a, &ae));
    -	assertEqualString("file", archive_entry_pathname(ae));
    -	assert(S_ISREG(archive_entry_stat(ae)->st_mode));
    -	assertEqualInt(12345684, archive_entry_size(ae));
    -	assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset));
    -	assertEqualInt(0, offset);
    -	assertEqualMem(p, "hello\n", 6);
    -	assertEqualInt(86401, archive_entry_mtime(ae));
    -	assertEqualInt(86401, archive_entry_atime(ae));
    -	assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    -	assertEqualInt(1, archive_entry_uid(ae));
    -	assertEqualInt(2, archive_entry_gid(ae));
    -
    -	/* A hardlink to the regular file. */
    -	assertEqualInt(0, archive_read_next_header(a, &ae));
    -	assertEqualString("hardlink", archive_entry_pathname(ae));
    -	assert(S_ISREG(archive_entry_stat(ae)->st_mode));
    -	assertEqualString("file", archive_entry_hardlink(ae));
    -	assert(!archive_entry_size_is_set(ae));
    -	assertEqualInt(86401, archive_entry_mtime(ae));
    -	assertEqualInt(86401, archive_entry_atime(ae));
    -	assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    -	assertEqualInt(1, archive_entry_uid(ae));
    -	assertEqualInt(2, archive_entry_gid(ae));
    -
    -	/* A symlink to the regular file. */
    -	assertEqualInt(0, archive_read_next_header(a, &ae));
    -	assertEqualString("symlink", archive_entry_pathname(ae));
    -	assert(S_ISLNK(archive_entry_stat(ae)->st_mode));
    -	assertEqualString("file", archive_entry_symlink(ae));
    -	assertEqualInt(0, archive_entry_size(ae));
    -	assertEqualInt(172802, archive_entry_mtime(ae));
    -	assertEqualInt(172802, archive_entry_atime(ae));
    -	assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    -	assertEqualInt(1, archive_entry_uid(ae));
    -	assertEqualInt(2, archive_entry_gid(ae));
    +		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
    +			/* '.' root directory. */
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			/* Now, we read timestamp recorded by RRIP "TF". */ 
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +			/* Now, we read links recorded by RRIP "PX". */ 
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualIntA(a, ARCHIVE_EOF,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt((int)size, 0);
    +		} else if (strcmp("dir", archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString("hardlink", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(12345684, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "hello\n", 6);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
    +			/* A hardlink to the regular file. */
    +			/* Note: If "hardlink" gets returned before "file",
    +			 * then "hardlink" will get returned as a regular file
    +			 * and "file" will get returned as the hardlink.
    +			 * This test should tolerate that, since it's a
    +			 * perfectly permissible thing for libarchive to do. */
    +			assertEqualString("file", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualString("hardlink", archive_entry_hardlink(ae));
    +			assertEqualInt(0, archive_entry_size_is_set(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("file", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(172802, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp (an absolute path) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp/.. (with a ".." component) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp/..", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to a path with ".." and "." components */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(".././../tmp",
    +			    archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink5", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file with "/" components. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(".///file", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(172802, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink6", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp//..
    +			 * (with "/" and ".." components) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp//..", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else {
    +			failure("Saw a file that shouldn't have been there");
    +			assertEqualString(archive_entry_pathname(ae), "");
    +		}
    +	}
     
     	/* End of archive. */
     	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
     
     	/* Verify archive format. */
    -	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2);
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
     	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
     
     	/* Close the archive. */
     	assertEqualInt(0, archive_read_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_read_finish(a);
    -#else
     	assertEqualInt(0, archive_read_finish(a));
    -#endif
     }
     
     
    diff --git a/lib/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu b/lib/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu
    deleted file mode 100644
    index f675794de00f..000000000000
    --- a/lib/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -$FreeBSD$
    -begin 644 test_read_format_isorr_bz2.iso.bz2
    -M0EIH.3%!629363S[0-4``,?_W?__R_158__Z/__?8*?OWB8AZB2```4@`,0"
    -M@0C0`SX`6UH$P:F@32FCU-D1Z@#U'J!HT>H#0`!H`T9`#U-#33(-`-3TFA#1
    -MJ933TFR%#(&@`#0-````'J`T``,.-#1HT&C0-``````R````-`9``8<:&C1H
    -M-&@:`````!D````:`R``P1*(1$]3U,C(--``T!H:9``````:``&F)?&F1;DY
    -M&:FB?6\AB@WG9X@8AM,HTK/Q9EXPZD#E2A$D)(@;F(G^B.92GLB`=H@`+I1!
    -M1$`';Y%%P_YU^!0+8BJ(@#DC&D@D4"1D4?Z1!$1`&Z`V[]0H($(!6L90;:>A0V<))XH7BH%"KAF8!:H8\].K:4`Y`,4,!RN:#SL[!;-"!6%0F?`H
    -M2_2AM@*%/%<\*!XL/C2%A1AI$8/AF(#SZ;]:>$5^/NKNO<+EH@_CS4XUI(Q*
    -M123&G=9T]QQR?"=WMV(,&60`1D0:U043)E&22GWA);Z:"9R.A@,4,IL+O=L7
    -MACF:V5C!L"HB&,82/[./'>PAEG-"PA,D6T1+
    -M2<\S]-*$,]X-XF%:_)1,W,=`,^+.N0""6@"85=H@<2FZ=HI-GDHK&)>/T74Y
    -M+5>[4:S`Z`M87AHD`H6BE*8R%X=9AS$7&+Z?F%A.`AX!"XZRR@C5_?4^P".90`*]#[D(PA*&MPV7U2
    -M;.]7.&/5!?P@C:J)S&T%=%,KJ@X0[""E8G!I!/I%`KSMA<#^!%C+Y*")'1](
    -MJ06:CXD^5K*:`$E`B`0$P5;&R;BF<5/Y7&(5A`?:!J@``
    -`
    -end
    diff --git a/lib/libarchive/test/test_read_format_isorr_ce.c b/lib/libarchive/test/test_read_format_isorr_ce.c
    new file mode 100644
    index 000000000000..c9cd059f0f03
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_isorr_ce.c
    @@ -0,0 +1,223 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * Copyright (c) 2009 Michihiro NAKAJIMA
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +/*
    +Execute the following command to rebuild the data for this program:
    +   tail -n +32 test_read_format_isorr_ce.c | /bin/sh
    +
    +dirname=/tmp/iso
    +#
    +rm -rf $dirname
    +mkdir $dirname
    +#
    +num=0
    +file=""
    +while [ $num -lt 150 ]
    +do
    +  num=$((num+1))
    +  file="a$file"
    +done
    +#
    +num=0
    +while [ $num -lt 3 ]
    +do
    +  num=$((num+1))
    +  file="a$file"
    +  echo "hello $((num+150))" > $dirname/$file
    +  dd if=/dev/zero count=1 bs=4080 >> $dirname/$file
    +  (cd $dirname; ln -s $file sym$num)
    +done
    +#
    +mkdir $dirname/dir
    +#
    +time1="197001020000.01"
    +time2="197001030000.02"
    +TZ=utc touch -afhm -t $time1 $dirname/dir $dirname/aaaa*
    +TZ=utc touch -afhm -t $time2 $dirname/sym*
    +TZ=utc touch -afhm -t $time1 $dirname
    +#
    +F=test_read_format_iso_rockridge_ce.iso.Z
    +mkisofs -R -uid 1 -gid 2 $dirname | compress > $F
    +uuencode $F $F > $F.uu
    +rm -rf $dirname
    +exit 1
    + */
    +
    +/*
    + * Test reading SUSP "CE" extension is works fine.
    + */
    +
    +static void
    +mkpath(char *p, int len)
    +{
    +	int i;
    +
    +	for (i = 0; i < len; i++)
    +		p[i] = 'a';
    +	p[len] = '\0';
    +}
    +
    +DEFINE_TEST(test_read_format_isorr_ce)
    +{
    +	const char *refname = "test_read_format_iso_rockridge_ce.iso.Z";
    +	char path1[160];
    +	char path2[160];
    +	char path3[160];
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	const void *p;
    +	size_t size;
    +	off_t offset;
    +	int i;
    +
    +	mkpath(path1, 151);
    +	mkpath(path2, 152);
    +	mkpath(path3, 153);
    +	extract_reference_file(refname);
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
    +	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_open_filename(a, refname, 10240));
    +
    +	/* Retrieve each of the 8 files on the ISO image and
    +	 * verify that each one is what we expect. */
    +	for (i = 0; i < 8; ++i) {
    +		assertEqualInt(0, archive_read_next_header(a, &ae));
    +
    +		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
    +			/* '.' root directory. */
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			/* Now, we read timestamp recorded by RRIP "TF". */
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +			/* Now, we read links recorded by RRIP "PX". */
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualIntA(a, ARCHIVE_EOF,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt((int)size, 0);
    +		} else if (strcmp("dir", archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp(path1, archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString(path1, archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(4090, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "hello 151\n", 10);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp(path2, archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString(path2, archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(4090, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "hello 152\n", 10);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp(path3, archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString(path3, archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(4090, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "hello 153\n", 10);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("sym1", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(path1, archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("sym2", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(path2, archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("sym3", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(path3, archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else {
    +			failure("Saw a file that shouldn't have been there");
    +			assertEqualString(archive_entry_pathname(ae), "");
    +		}
    +	}
    +
    +	/* End of archive. */
    +	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify archive format. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
    +
    +	/* Close the archive. */
    +	assertEqualInt(0, archive_read_close(a));
    +	assertEqualInt(0, archive_read_finish(a));
    +}
    +
    +
    diff --git a/lib/libarchive/test/test_read_format_isorr_new_bz2.c b/lib/libarchive/test/test_read_format_isorr_new_bz2.c
    new file mode 100644
    index 000000000000..5fa2492ec265
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_isorr_new_bz2.c
    @@ -0,0 +1,204 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +
    +/*
    +PLEASE use latest cdrtools at least mkisofs version is 2.01.01a63 or later.
    +Old version mkisofs made wrong "SL" System Use Entry of RRIP.
    +
    +Execute the following command to rebuild the data for this program:
    +   tail -n +34 test_read_format_isorr_new_bz2.c | /bin/sh
    +
    +rm -rf /tmp/iso
    +mkdir /tmp/iso
    +mkdir /tmp/iso/dir
    +echo "hello" >/tmp/iso/file
    +dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file
    +ln /tmp/iso/file /tmp/iso/hardlink
    +(cd /tmp/iso; ln -s file symlink)
    +(cd /tmp/iso; ln -s /tmp/ symlink2)
    +(cd /tmp/iso; ln -s /tmp/../ symlink3)
    +(cd /tmp/iso; ln -s .././../tmp/ symlink4)
    +(cd /tmp/iso; ln -s .///file symlink5)
    +(cd /tmp/iso; ln -s /tmp//../ symlink6)
    +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir
    +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
    +F=test_read_format_iso_rockridge_new.iso.Z
    +mkhybrid -R -uid 1 -gid 2 /tmp/iso | compress > $F
    +uuencode $F $F > $F.uu
    +exit 1
    + */
    +
    +DEFINE_TEST(test_read_format_isorr_new_bz2)
    +{
    +	const char *refname = "test_read_format_iso_rockridge_new.iso.Z";
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	const void *p;
    +	size_t size;
    +	off_t offset;
    +	int i;
    +
    +	extract_reference_file(refname);
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
    +	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_open_filename(a, refname, 10240));
    +
    +	/* Retrieve each of the 8 files on the ISO image and
    +	 * verify that each one is what we expect. */
    +	for (i = 0; i < 10; ++i) {
    +		assertEqualInt(0, archive_read_next_header(a, &ae));
    +
    +		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
    +			/* '.' root directory. */
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			/* Now, we read timestamp recorded by RRIP "TF". */
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +			/* Now, we read links recorded by RRIP "PX". */
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualIntA(a, ARCHIVE_EOF,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt((int)size, 0);
    +		} else if (strcmp("dir", archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString("hardlink", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(12345684, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "hello\n", 6);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
    +			/* A hardlink to the regular file. */
    +			/* Note: If "hardlink" gets returned before "file",
    +			 * then "hardlink" will get returned as a regular file
    +			 * and "file" will get returned as the hardlink.
    +			 * This test should tolerate that, since it's a
    +			 * perfectly permissible thing for libarchive to do. */
    +			assertEqualString("file", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualString("hardlink", archive_entry_hardlink(ae));
    +			assertEqualInt(0, archive_entry_size_is_set(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("file", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(172802, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp/ (an absolute path) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp/", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp/../ (with a ".." component) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp/../", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to a path with ".." and "." components */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(".././../tmp/",
    +			    archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink5", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file with "/" components. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(".///file", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(172802, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink6", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp//../
    +			 * (with "/" and ".." components) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp//../", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else {
    +			failure("Saw a file that shouldn't have been there");
    +			assertEqualString(archive_entry_pathname(ae), "");
    +		}
    +	}
    +
    +	/* End of archive. */
    +	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify archive format. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
    +
    +	/* Close the archive. */
    +	assertEqualInt(0, archive_read_close(a));
    +	assertEqualInt(0, archive_read_finish(a));
    +}
    +
    +
    diff --git a/lib/libarchive/test/test_read_format_isorr_rr_moved.c b/lib/libarchive/test/test_read_format_isorr_rr_moved.c
    new file mode 100644
    index 000000000000..0aeb2260fc85
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_isorr_rr_moved.c
    @@ -0,0 +1,270 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * Copyright (c) 2009 Michihiro NAKAJIMA
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +/*
    +Execute the following command to rebuild the data for this program:
    +   tail -n +32 test_read_format_isorr_rr_moved.c | /bin/sh
    +
    +dirname=/tmp/iso
    +rm -rf $dirname
    +mkdir -p $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10
    +echo "hello" >$dirname/file
    +dd if=/dev/zero count=1 bs=12345678 >>$dirname/file
    +deepfile=$dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10/deep
    +echo "hello" >$deepfile
    +dd if=/dev/zero count=1 bs=12345678 >>$deepfile
    +time="197001020000.01"
    +TZ=utc touch -afhm -t $time $deepfile
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dir10
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6/dir7
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5/dir6
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4/dir5
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3/dir4
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2/dir3
    +TZ=utc touch -afhm -t $time $dirname/dir1/dir2
    +TZ=utc touch -afhm -t $time $dirname/dir1
    +TZ=utc touch -afhm -t $time $dirname/file
    +TZ=utc touch -afhm -t $time $dirname
    +F=test_read_format_isorr_rockridge_moved.iso.Z
    +mkhybrid -R -uid 1 -gid 2 $dirname | compress > $F
    +uuencode $F $F > $F.uu
    +exit 1
    + */
    +
    +DEFINE_TEST(test_read_format_isorr_rr_moved)
    +{
    +	const char *refname = "test_read_format_iso_rockridge_rr_moved.iso.Z";
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	const void *p;
    +	size_t size;
    +	off_t offset;
    +	int i;
    +
    +	extract_reference_file(refname);
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
    +	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_open_filename(a, refname, 10240));
    +
    +	/* Retrieve each of the 8 files on the ISO image and
    +	 * verify that each one is what we expect. */
    +	for (i = 0; i < 13; ++i) {
    +		assertEqualInt(0, archive_read_next_header(a, &ae));
    +
    +		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
    +			/* '.' root directory. */
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			/* Now, we read timestamp recorded by RRIP "TF". */
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +			/* Now, we read links recorded by RRIP "PX". */
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualIntA(a, ARCHIVE_EOF,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt((int)size, 0);
    +		} else if (strcmp("dir1", archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3/dir4",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4/dir5",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3/dir4/dir5",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +		   "/dir8",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +			    "/dir8",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +		   "/dir8/dir9",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +			    "/dir8/dir9",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +		   "/dir8/dir9/dir10",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +			    "/dir8/dir9/dir10",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString("file", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(12345684, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "hello\n", 6);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +		    "/dir8/dir9/dir10/deep",
    +		    archive_entry_pathname(ae)) == 0) {
    +			/* A regular file. */
    +			assertEqualString("dir1/dir2/dir3/dir4/dir5/dir6/dir7"
    +			    "/dir8/dir9/dir10/deep",
    +			    archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(12345684, archive_entry_size(ae));
    +			assertEqualInt(0,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt(0, offset);
    +			assertEqualMem(p, "hello\n", 6);
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else {
    +			failure("Saw a file that shouldn't have been there");
    +			assertEqualString(archive_entry_pathname(ae), "");
    +		}
    +	}
    +
    +	/* End of archive. */
    +	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify archive format. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
    +
    +	/* Close the archive. */
    +	assertEqualInt(0, archive_read_close(a));
    +	assertEqualInt(0, archive_read_finish(a));
    +}
    +
    +
    diff --git a/lib/libarchive/test/test_read_format_isozisofs_bz2.c b/lib/libarchive/test/test_read_format_isozisofs_bz2.c
    new file mode 100644
    index 000000000000..56c39c0be229
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_isozisofs_bz2.c
    @@ -0,0 +1,187 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +/*
    +Execute the following command to rebuild the data for this program:
    +   tail -n +32 test_read_format_isozisofs_bz2.c | /bin/sh
    +
    +rm -rf /tmp/iso /tmp/ziso
    +mkdir /tmp/iso
    +mkdir /tmp/iso/dir
    +echo "hello" >/tmp/iso/file
    +dd if=/dev/zero count=1 bs=12345678 >>/tmp/iso/file
    +ln /tmp/iso/file /tmp/iso/hardlink
    +(cd /tmp/iso; ln -s file symlink)
    +(cd /tmp/iso; ln -s /tmp/ symlink2)
    +(cd /tmp/iso; ln -s /tmp/../ symlink3)
    +(cd /tmp/iso; ln -s .././../tmp/ symlink4)
    +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir
    +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
    +mkzftree /tmp/iso /tmp/ziso
    +TZ=utc touch -afhm -t 197001020000.01 /tmp/ziso /tmp/ziso/file /tmp/ziso/dir
    +TZ=utc touch -afhm -t 197001030000.02 /tmp/ziso/symlink
    +F=test_read_format_iso_zisofs.iso.Z
    +mkhybrid -R -uid 1 -gid 2 -z /tmp/ziso | compress > $F
    +uuencode $F $F > $F.uu
    +exit 1
    +
    + */
    +
    +DEFINE_TEST(test_read_format_isozisofs_bz2)
    +{
    +	const char *refname = "test_read_format_iso_zisofs.iso.Z";
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	const void *p;
    +	size_t size;
    +	off_t offset;
    +	int i;
    +
    +	extract_reference_file(refname);
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualInt(0, archive_read_support_compression_all(a));
    +	assertEqualInt(0, archive_read_support_format_all(a));
    +	assertEqualInt(ARCHIVE_OK,
    +	    archive_read_open_filename(a, refname, 10240));
    +
    +	/* Retrieve each of the 8 files on the ISO image and
    +	 * verify that each one is what we expect. */
    +	for (i = 0; i < 8; ++i) {
    +		assertEqualInt(0, archive_read_next_header(a, &ae));
    +
    +		if (strcmp(".", archive_entry_pathname(ae)) == 0) {
    +			/* '.' root directory. */
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			/* Now, we read timestamp recorded by RRIP "TF". */
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +			/* Now, we read links recorded by RRIP "PX". */
    +			assertEqualInt(3, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualIntA(a, ARCHIVE_EOF,
    +			    archive_read_data_block(a, &p, &size, &offset));
    +			assertEqualInt((int)size, 0);
    +		} else if (strcmp("dir", archive_entry_pathname(ae)) == 0) {
    +			/* A directory. */
    +			assertEqualString("dir", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
    +			assertEqualInt(2048, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("hardlink", archive_entry_pathname(ae)) == 0) {
    +			int r;
    +			/* A regular file. */
    +			assertEqualString("hardlink", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualInt(12345684, archive_entry_size(ae));
    +			r = archive_read_data_block(a, &p, &size, &offset);
    +			if (r == ARCHIVE_FAILED) {
    +			  skipping("Can't read body of ZISOFS entry.");
    +			} else {
    +			  assertEqualInt(ARCHIVE_OK, r);
    +			  assertEqualInt(0, offset);
    +			  assertEqualMem(p, "hello\n", 6);
    +			}
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("file", archive_entry_pathname(ae)) == 0) {
    +			/* A hardlink to the regular file. */
    +			/* Note: If "hardlink" gets returned before "file",
    +			 * then "hardlink" will get returned as a regular file
    +			 * and "file" will get returned as the hardlink.
    +			 * This test should tolerate that, since it's a
    +			 * perfectly permissible thing for libarchive to do. */
    +			assertEqualString("file", archive_entry_pathname(ae));
    +			assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
    +			assertEqualString("hardlink", archive_entry_hardlink(ae));
    +			assertEqualInt(0, archive_entry_size_is_set(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(86401, archive_entry_mtime(ae));
    +			assertEqualInt(86401, archive_entry_atime(ae));
    +			assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to the regular file. */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("file", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(172802, archive_entry_mtime(ae));
    +			assertEqualInt(172802, archive_entry_atime(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink2", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp (an absolute path) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink3", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to /tmp/.. (with a ".." component) */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString("/tmp/..", archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else if (strcmp("symlink4", archive_entry_pathname(ae)) == 0) {
    +			/* A symlink to a path with ".." and "." components */
    +			assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
    +			assertEqualString(".././../tmp",
    +			    archive_entry_symlink(ae));
    +			assertEqualInt(0, archive_entry_size(ae));
    +			assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
    +			assertEqualInt(1, archive_entry_uid(ae));
    +			assertEqualInt(2, archive_entry_gid(ae));
    +		} else {
    +			failure("Saw a file that shouldn't have been there");
    +			assertEqualString(archive_entry_pathname(ae), "");
    +		}
    +	}
    +
    +	/* End of archive. */
    +	assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +
    +	/* Verify archive format. */
    +	assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
    +
    +	/* Close the archive. */
    +	assertEqualInt(0, archive_read_close(a));
    +	assertEqualInt(0, archive_read_finish(a));
    +}
    +
    +
    diff --git a/lib/libarchive/test/test_read_format_mtree.c b/lib/libarchive/test/test_read_format_mtree.c
    index b13034fbf4d3..5001e4d8a7a6 100644
    --- a/lib/libarchive/test/test_read_format_mtree.c
    +++ b/lib/libarchive/test/test_read_format_mtree.c
    @@ -25,34 +25,16 @@
     #include "test.h"
     __FBSDID("$FreeBSD$");
     
    -/* Single entry with a hardlink. */
    -static unsigned char archive[] = {
    -	"#mtree\n"
    -	"file type=file uid=18 mode=0123 size=3\n"
    -	"dir type=dir\n"
    -	" file\\040with\\040space type=file uid=18\n"
    -	" ..\n"
    -	"file\\04with\\040space type=file\n"
    -	"dir2 type=dir\n"
    -	" dir3a type=dir\n"
    -	"  indir3a type=file\n"
    -	"dir2/fullindir2 type=file mode=0777\n"
    -	"  ..\n"
    -	" indir2 type=file\n"
    -	" dir3b type=dir\n"
    -	"  indir3b type=file\n"
    -	"  ..\n"
    -	" ..\n"
    -	"notindir type=file\n"
    -	"dir2/fullindir2 mode=0644\n"
    -};
    -
    -DEFINE_TEST(test_read_format_mtree)
    +static void
    +test_read_format_mtree1(void)
     {
    +	const char reffile[] = "test_read_format_mtree.mtree";
     	char buff[16];
     	struct archive_entry *ae;
     	struct archive *a;
    -	int fd;
    +	FILE *f;
    +
    +	extract_reference_file(reffile);
     
     	/*
     	 * An access error occurred on some platform when mtree
    @@ -60,29 +42,28 @@ DEFINE_TEST(test_read_format_mtree)
     	 * the routine which open a directory that we create
     	 * "dir" and "dir2" directories.
     	 */
    -	assertEqualInt(0, mkdir("dir", 0775));
    -	assertEqualInt(0, mkdir("dir2", 0775));
    +	assertMakeDir("dir", 0775);
    +	assertMakeDir("dir2", 0775);
     
     	assert((a = archive_read_new()) != NULL);
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_support_compression_all(a));
     	assertEqualIntA(a, ARCHIVE_OK,
     	    archive_read_support_format_all(a));
    -	assertEqualIntA(a, ARCHIVE_OK,
    -	    archive_read_open_memory(a, archive, sizeof(archive)));
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_open_file(a, reffile, 11));
     
     	/*
     	 * Read "file", whose data is available on disk.
     	 */
    -	fd = open("file", O_WRONLY | O_CREAT, 0777);
    -	assert(fd >= 0);
    -	assertEqualInt(3, write(fd, "hi\n", 3));
    -	close(fd);
    +	f = fopen("file", "wb");
    +	assert(f != NULL);
    +	assertEqualInt(3, fwrite("hi\n", 1, 3, f));
    +	fclose(f);
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
     	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE);
     	assertEqualString(archive_entry_pathname(ae), "file");
     	assertEqualInt(archive_entry_uid(ae), 18);
    -	assert(S_ISREG(archive_entry_mode(ae)));
    +	assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
     	assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123);
     	assertEqualInt(archive_entry_size(ae), 3);
     	assertEqualInt(3, archive_read_data(a, buff, 3));
    @@ -90,13 +71,13 @@ DEFINE_TEST(test_read_format_mtree)
     
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
     	assertEqualString(archive_entry_pathname(ae), "dir");
    -	assert(S_ISDIR(archive_entry_mode(ae)));
    +	assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
     
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
     	assertEqualString(archive_entry_pathname(ae), "dir/file with space");
     
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    -	assertEqualString(archive_entry_pathname(ae), "file\\04with space");
    +	assertEqualString(archive_entry_pathname(ae), "file with space");
     
     	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
     	assertEqualString(archive_entry_pathname(ae), "dir2");
    @@ -125,11 +106,38 @@ DEFINE_TEST(test_read_format_mtree)
     
     	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
     	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_read_finish(a);
    -#else
     	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    -#endif
    +}
    +
    +static void
    +test_read_format_mtree2(void)
    +{
    +	static char archive[] =
    +	    "#mtree\n"
    +	    "d type=dir content=.\n";
    +	struct archive_entry *ae;
    +	struct archive *a;
    +
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_read_support_compression_all(a));
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_read_support_format_all(a));
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_read_open_memory(a, archive, sizeof(archive)));
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE);
    +	assertEqualString(archive_entry_pathname(ae), "d");
    +	assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
    +	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
    +	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
     }
     
     
    +
    +DEFINE_TEST(test_read_format_mtree)
    +{
    +	test_read_format_mtree1();
    +	test_read_format_mtree2();
    +}
    diff --git a/lib/libarchive/test/test_read_format_mtree.mtree.uu b/lib/libarchive/test/test_read_format_mtree.mtree.uu
    new file mode 100644
    index 000000000000..9fa0d9b04d55
    --- /dev/null
    +++ b/lib/libarchive/test/test_read_format_mtree.mtree.uu
    @@ -0,0 +1,13 @@
    +$FreeBSD$
    +
    +begin 644 test_read_format_mtree.mtree
    +M(VUT7!E/61I<@H@9FEL95PP-#!W:71H7#`T,'-P86-E('1Y<&4]9FEL
    +M92!U:60],3@*("XN"F9I;&5<,#0P=VET:%PP-#!S<&%C92!T>7!E/69I;&4*
    +M9&ER,B!T>7!E/61I<@H@9&ER,V$@='EP93UD:7(*("!I;F1I7!E/61I<@H@(&EN9&ER,V(@
    +M='EP93UF:6QE"B`@+BX*("XN"FYO=&EN9&ER('1Y<&4]9FEL90ID:7(R+V9U
    +3;&QI;F1I/1A2\n"
    +"IHU\"0%9=*G4JUJM6K6+-JWO8,.*'4NVK-FS:-.J7\n"
    +"Received: from libarchive (localhost [127.0.0.1])\n"
    +"        by libarchive (8.14.2/8.14.2) with ESMTP id m5233UT1006448\n"
    +"        for ; Mon, 2 Jun 2008 03:03:31 GMT\n"
    +"        (envelope-from uudecode@libarchive)\n"
    +"Received: (from uudecode@localhost)\n"
    +"        by libarchive (8.14.2/8.14.2/Submit) id m5233U3e006406\n"
    +"        for uudecode; Mon, 2 Jun 2008 03:03:30 GMT\n"
    +"        (envelope-from root)\n"
    +"Date: Mon, 2 Jun 2008 03:03:30 GMT\n"
    +"From: Libarchive Test \n"
    +"Message-Id: <200806020303.m5233U3e006406@libarchive>\n"
    +"To: uudecode@libarchive\n"
    +"Subject: Libarchive uudecode test\n"
    +"\n"
    +"* Redistribution and use in source and binary forms, with or without\n"
    +"* modification, are permitted provided that the following conditions\n"
    +"* are met:\n"
    +"\n"
    +"01234567890abcdeghijklmnopqrstuvwxyz\n"
    +"01234567890ABCEFGHIJKLMNOPQRSTUVWXYZ\n"
    +"\n"
    +};
    +
    +static void
    +test_read_uu_sub(const char *uudata, size_t uusize)
    +{
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	char *buff;
    +	int extra;
    +
    +	assert(NULL != (buff = malloc(uusize + 64 * 1024)));
    +	if (buff == NULL)
    +		return;
    +	for (extra = 0; extra <= 64; extra = extra==0?1:extra*2) {
    +		size_t size = extra * 1024;
    +		char *p = buff;
    +
    +		/* Add extra text size of which is from 1K bytes to
    +		 * 64Kbytes before uuencoded data. */
    +		while (size) {
    +			if (size > sizeof(extradata)-1) {
    +				memcpy(p, extradata, sizeof(extradata)-1);
    +				p += sizeof(extradata)-1;
    +				size -= sizeof(extradata)-1;
    +			} else {
    +				memcpy(p, extradata, size-1);
    +				p += size-1;
    +				*p++ = '\n';/* the last of extra text must have
    +					     * '\n' character. */
    +				break;
    +			}
    +		}
    +		memcpy(p, uudata, uusize);
    +		size = extra * 1024 + uusize;
    +
    +		assert((a = archive_read_new()) != NULL);
    +		assertEqualIntA(a, ARCHIVE_OK,
    +		    archive_read_support_compression_all(a));
    +		assertEqualIntA(a, ARCHIVE_OK,
    +		    archive_read_support_format_all(a));
    +		assertEqualIntA(a, ARCHIVE_OK,
    +		    read_open_memory(a, buff, size, 2));
    +		assertEqualIntA(a, ARCHIVE_OK,
    +		    archive_read_next_header(a, &ae));
    +		failure("archive_compression_name(a)=\"%s\"",
    +		    archive_compression_name(a));
    +		assertEqualInt(archive_compression(a),
    +		    ARCHIVE_COMPRESSION_COMPRESS);
    +		failure("archive_format_name(a)=\"%s\"",
    +		    archive_format_name(a));
    +		assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
    +		assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
    +		assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    +	}
    +	free(buff);
    +}
    +
    +DEFINE_TEST(test_read_uu)
    +{
    +	/* Read the traditional uuencoded data. */
    +	test_read_uu_sub(archive, sizeof(archive)-1);
    +	/* Read the Base64 uuencoded data. */
    +	test_read_uu_sub(archive64, sizeof(archive64)-1);
    +}
    +
    diff --git a/lib/libarchive/test/test_tar_large.c b/lib/libarchive/test/test_tar_large.c
    index b2b8e5dbfdc7..92ca83993172 100644
    --- a/lib/libarchive/test/test_tar_large.c
    +++ b/lib/libarchive/test/test_tar_large.c
    @@ -190,7 +190,7 @@ memory_read_skip(struct archive *a, void *_private, off_t skip)
     	}
     	if (private->filebytes > 0) {
     		if (private->filebytes < skip)
    -			skip = private->filebytes;
    +			skip = (off_t)private->filebytes;
     		private->filebytes -= skip;
     	} else {
     		skip = 0;
    diff --git a/lib/libarchive/test/test_write_compress_program.c b/lib/libarchive/test/test_write_compress_program.c
    index 713638e7eb69..34d0680489e2 100644
    --- a/lib/libarchive/test/test_write_compress_program.c
    +++ b/lib/libarchive/test/test_write_compress_program.c
    @@ -38,12 +38,9 @@ DEFINE_TEST(test_write_compress_program)
     	size_t used;
     	int blocksize = 1024;
     	int r;
    -	const char *compprog, *decompprog;
     
    -	decompprog = external_gzip_program(1);
    -	if ((compprog = external_gzip_program(0)) == NULL) {
    -		skipping("There is no gzip compression "
    -		    "program in this platform");
    +	if (!canGzip()) {
    +		skipping("Cannot run 'gzip'");
     		return;
     	}
     
    @@ -51,7 +48,7 @@ DEFINE_TEST(test_write_compress_program)
     	/* Write it through an external "gzip" program. */
     	assert((a = archive_write_new()) != NULL);
     	assertA(0 == archive_write_set_format_ustar(a));
    -	r = archive_write_set_compression_program(a, compprog);
    +	r = archive_write_set_compression_program(a, "gzip");
     	if (r == ARCHIVE_FATAL) {
     		skipping("Write compression via external "
     		    "program unsupported on this platform");
    @@ -91,8 +88,8 @@ DEFINE_TEST(test_write_compress_program)
     	/* The compression_gzip() handler will fall back to gunzip
     	 * automatically, but if we know gunzip isn't available, then
     	 * skip the rest. */
    -	if (r != ARCHIVE_OK && decompprog == NULL) {
    -		skipping("No gzip decompression is available; "
    +	if (r != ARCHIVE_OK && !canGunzip()) {
    +		skipping("No libz and no gunzip program, "
     		    "unable to verify gzip compression");
     		assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
     		return;
    diff --git a/lib/libarchive/test/test_write_disk.c b/lib/libarchive/test/test_write_disk.c
    index c0b22e58a125..f3f4e56ee786 100644
    --- a/lib/libarchive/test/test_write_disk.c
    +++ b/lib/libarchive/test/test_write_disk.c
    @@ -28,6 +28,14 @@ __FBSDID("$FreeBSD$");
     #if ARCHIVE_VERSION_NUMBER >= 1009000
     
     #define UMASK 022
    +/*
    + * When comparing mode values, ignore high-order bits
    + * that are set on some OSes.  This should cover the bits
    + * we're interested in (standard mode bits + file type bits)
    + * while ignoring extra markers such as Haiku/BeOS index
    + * flags.
    + */
    +#define MODE_MASK 0777777
     
     static void create(struct archive_entry *ae, const char *msg)
     {
    @@ -46,14 +54,15 @@ static void create(struct archive_entry *ae, const char *msg)
     #endif
     	/* Test the entries on disk. */
     	assert(0 == stat(archive_entry_pathname(ae), &st));
    -	failure("st.st_mode=%o archive_entry_mode(ae)=%o",
    -	    st.st_mode, archive_entry_mode(ae));
    +	failure("%s", msg);
    +
    +#if !defined(_WIN32) || defined(__CYGWIN__)
     	/* When verifying a dir, ignore the S_ISGID bit, as some systems set
     	 * that automatically. */
     	if (archive_entry_filetype(ae) == AE_IFDIR)
     		st.st_mode &= ~S_ISGID;
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -	assertEqualInt(st.st_mode, archive_entry_mode(ae) & ~UMASK);
    +	assertEqualInt(st.st_mode & MODE_MASK,
    +	    archive_entry_mode(ae) & ~UMASK & MODE_MASK);
     #endif
     }
     
    @@ -61,8 +70,6 @@ static void create_reg_file(struct archive_entry *ae, const char *msg)
     {
     	static const char data[]="abcdefghijklmnopqrstuvwxyz";
     	struct archive *ad;
    -	struct stat st;
    -	time_t now;
     
     	/* Write the entry to disk. */
     	assert((ad = archive_write_disk_new()) != NULL);
    @@ -96,28 +103,20 @@ static void create_reg_file(struct archive_entry *ae, const char *msg)
     	assertEqualInt(0, archive_write_finish(ad));
     #endif
     	/* Test the entries on disk. */
    -	assert(0 == stat(archive_entry_pathname(ae), &st));
    -	failure("st.st_mode=%o archive_entry_mode(ae)=%o",
    -	    st.st_mode, archive_entry_mode(ae));
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -	assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK));
    -#endif
    -	assertEqualInt(st.st_size, sizeof(data));
    +	assertIsReg(archive_entry_pathname(ae), archive_entry_mode(ae) & 0777);
    +	assertFileSize(archive_entry_pathname(ae), sizeof(data));
     	/* test_write_disk_times has more detailed tests of this area. */
    -        assertEqualInt(st.st_mtime, 123456789);
    -        failure("No atime was specified, so atime should get set to current time");
    -	now = time(NULL);
    -        assert(st.st_atime <= now && st.st_atime > now - 5);
    +	assertFileMtime(archive_entry_pathname(ae), 123456789, 0);
    +        failure("No atime given, so atime should get set to current time");
    +	assertFileAtimeRecent(archive_entry_pathname(ae));
     }
     
     static void create_reg_file2(struct archive_entry *ae, const char *msg)
     {
     	const int datasize = 100000;
     	char *data;
    -	char *compare;
     	struct archive *ad;
    -	struct stat st;
    -	int i, fd;
    +	int i;
     
     	data = malloc(datasize);
     	for (i = 0; i < datasize; i++)
    @@ -137,26 +136,12 @@ static void create_reg_file2(struct archive_entry *ae, const char *msg)
     		    archive_write_data_block(ad, data + i, 1000, i));
     	}
     	assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_write_finish(ad);
    -#else
     	assertEqualInt(0, archive_write_finish(ad));
    -#endif
    -	/* Test the entries on disk. */
    -	assert(0 == stat(archive_entry_pathname(ae), &st));
    -	failure("st.st_mode=%o archive_entry_mode(ae)=%o",
    -	    st.st_mode, archive_entry_mode(ae));
    -#if !defined(_WIN32) || defined(__CYGWIN__)
    -	assertEqualInt(st.st_mode, (archive_entry_mode(ae) & ~UMASK));
    -#endif
    -	assertEqualInt(st.st_size, i);
     
    -	compare = malloc(datasize);
    -	fd = open(archive_entry_pathname(ae), O_RDONLY);
    -	assertEqualInt(datasize, read(fd, compare, datasize));
    -	close(fd);
    -	assert(memcmp(compare, data, datasize) == 0);
    -	free(compare);
    +	/* Test the entries on disk. */
    +	assertIsReg(archive_entry_pathname(ae), archive_entry_mode(ae) & 0777);
    +	assertFileSize(archive_entry_pathname(ae), i);
    +	assertFileContents(data, datasize, archive_entry_pathname(ae));
     	free(data);
     }
     
    @@ -268,7 +253,7 @@ DEFINE_TEST(test_write_disk)
     	struct archive_entry *ae;
     
     	/* Force the umask to something predictable. */
    -	umask(UMASK);
    +	assertUmask(UMASK);
     
     	/* A regular file. */
     	assert((ae = archive_entry_new()) != NULL);
    diff --git a/lib/libarchive/test/test_write_disk_failures.c b/lib/libarchive/test/test_write_disk_failures.c
    index 1befbac61d85..f74c947ab365 100644
    --- a/lib/libarchive/test/test_write_disk_failures.c
    +++ b/lib/libarchive/test/test_write_disk_failures.c
    @@ -42,13 +42,13 @@ DEFINE_TEST(test_write_disk_failures)
     	int fd;
     
     	/* Force the umask to something predictable. */
    -	umask(UMASK);
    +	assertUmask(UMASK);
     
     	/* A directory that we can't write to. */
    -	assertEqualInt(0, mkdir("dir", 0555));
    +	assertMakeDir("dir", 0555);
     
     	/* Can we? */
    -	fd = open("dir/testfile", O_WRONLY | O_CREAT, 0777);
    +	fd = open("dir/testfile", O_WRONLY | O_CREAT | O_BINARY, 0777);
     	if (fd >= 0) {
     	  /* Apparently, we can, so the test below won't work. */
     	  close(fd);
    diff --git a/lib/libarchive/test/test_write_disk_hardlink.c b/lib/libarchive/test/test_write_disk_hardlink.c
    index 2ab242093a61..5756602d28ef 100644
    --- a/lib/libarchive/test/test_write_disk_hardlink.c
    +++ b/lib/libarchive/test/test_write_disk_hardlink.c
    @@ -43,16 +43,16 @@ __FBSDID("$FreeBSD$");
      */
     DEFINE_TEST(test_write_disk_hardlink)
     {
    -#if ARCHIVE_VERSION_NUMBER < 1009000
    -	skipping("archive_write_disk_hardlink tests");
    +#if defined(__HAIKU__)
    +	skipping("archive_write_disk_hardlink; hardlinks are not supported on bfs");
     #else
     	static const char data[]="abcdefghijklmnopqrstuvwxyz";
     	struct archive *ad;
     	struct archive_entry *ae;
    -	struct stat st, st2;
    +	int r;
     
     	/* Force the umask to something predictable. */
    -	umask(UMASK);
    +	assertUmask(UMASK);
     
     	/* Write entries to disk. */
     	assert((ad = archive_write_disk_new()) != NULL);
    @@ -79,10 +79,12 @@ DEFINE_TEST(test_write_disk_hardlink)
     	archive_entry_set_mode(ae, S_IFREG | 0642);
     	archive_entry_set_size(ae, 0);
     	archive_entry_copy_hardlink(ae, "link1a");
    -	assertEqualIntA(ad, 0, archive_write_header(ad, ae));
    -	assertEqualInt(ARCHIVE_WARN,
    -	    archive_write_data(ad, data, sizeof(data)));
    -	assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	assertEqualIntA(ad, 0, r = archive_write_header(ad, ae));
    +	if (r >= ARCHIVE_WARN) {
    +		assertEqualInt(ARCHIVE_WARN,
    +		    archive_write_data(ad, data, sizeof(data)));
    +		assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	}
     	archive_entry_free(ae);
     
     	/*
    @@ -107,10 +109,12 @@ DEFINE_TEST(test_write_disk_hardlink)
     	archive_entry_set_mode(ae, S_IFREG | 0642);
     	archive_entry_unset_size(ae);
     	archive_entry_copy_hardlink(ae, "link2a");
    -	assertEqualIntA(ad, 0, archive_write_header(ad, ae));
    -	assertEqualInt(ARCHIVE_WARN,
    -	    archive_write_data(ad, data, sizeof(data)));
    -	assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	assertEqualIntA(ad, 0, r = archive_write_header(ad, ae));
    +	if (r >= ARCHIVE_WARN) {
    +		assertEqualInt(ARCHIVE_WARN,
    +		    archive_write_data(ad, data, sizeof(data)));
    +		assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	}
     	archive_entry_free(ae);
     
     	/*
    @@ -134,9 +138,12 @@ DEFINE_TEST(test_write_disk_hardlink)
     	archive_entry_set_mode(ae, S_IFREG | 0755);
     	archive_entry_set_size(ae, sizeof(data));
     	archive_entry_copy_hardlink(ae, "link3a");
    -	assertEqualIntA(ad, 0, archive_write_header(ad, ae));
    -	assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data)));
    -	assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	assertEqualIntA(ad, 0, r = archive_write_header(ad, ae));
    +	if (r > ARCHIVE_WARN) {
    +		assertEqualInt(sizeof(data),
    +		    archive_write_data(ad, data, sizeof(data)));
    +		assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	}
     	archive_entry_free(ae);
     
     	/*
    @@ -164,34 +171,26 @@ DEFINE_TEST(test_write_disk_hardlink)
     	archive_entry_set_mode(ae, S_IFREG | 0755);
     	archive_entry_set_size(ae, sizeof(data));
     	archive_entry_copy_hardlink(ae, "link4a");
    -	assertEqualIntA(ad, 0, archive_write_header(ad, ae));
    -	assertEqualInt(sizeof(data), archive_write_data(ad, data, sizeof(data)));
    -	assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	assertEqualIntA(ad, 0, r = archive_write_header(ad, ae));
    +	if (r > ARCHIVE_FAILED) {
    +		assertEqualInt(sizeof(data),
    +		    archive_write_data(ad, data, sizeof(data)));
    +		assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	}
     	archive_entry_free(ae);
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_write_finish(ad);
    -#else
     	assertEqualInt(0, archive_write_finish(ad));
    -#endif
     
     	/* Test the entries on disk. */
     
     	/* Test #1 */
    -	assert(0 == stat("link1a", &st));
     	/* If the hardlink was successfully created and the archive
     	 * doesn't carry data for it, we consider it to be
     	 * non-authoritive for meta data as well.  This is consistent
     	 * with GNU tar and BSD pax.  */
    -	assertEqualInt(st.st_mode & E_MASK, (S_IFREG | 0755) & ~UMASK);
    -	assertEqualInt(st.st_size, sizeof(data));
    -	assertEqualInt(st.st_nlink, 2);
    -
    -	assert(0 == stat("link1b", &st2));
    -	assertEqualInt(st.st_mode, st2.st_mode);
    -	assertEqualInt(st.st_size, st2.st_size);
    -	assertEqualInt(st.st_nlink, st2.st_nlink);
    -	assertEqualInt(st.st_ino, st2.st_ino);
    -	assertEqualInt(st.st_dev, st2.st_dev);
    +	assertIsReg("link1a", 0755 & ~UMASK);
    +	assertFileSize("link1a", sizeof(data));
    +	assertFileNLinks("link1a", 2);
    +	assertIsHardlink("link1a", "link1b");
     
     	/* Test #2: Should produce identical results to test #1 */
     	/* Note that marking a hardlink with size = 0 is treated the
    @@ -200,42 +199,21 @@ DEFINE_TEST(test_write_disk_hardlink)
     	 * relied on size == 0) and partly to match the model used by
     	 * common file formats that store a size of zero for
     	 * hardlinks. */
    -	assert(0 == stat("link2a", &st));
    -	assertEqualInt(st.st_mode & E_MASK, (S_IFREG | 0755) & ~UMASK);
    -	assertEqualInt(st.st_size, sizeof(data));
    -	assertEqualInt(st.st_nlink, 2);
    -
    -	assert(0 == stat("link2b", &st2));
    -	assertEqualInt(st.st_mode, st2.st_mode);
    -	assertEqualInt(st.st_size, st2.st_size);
    -	assertEqualInt(st.st_nlink, st2.st_nlink);
    -	assertEqualInt(st.st_ino, st2.st_ino);
    -	assertEqualInt(st.st_dev, st2.st_dev);
    +	assertIsReg("link2a", 0755 & ~UMASK);
    +	assertFileSize("link2a", sizeof(data));
    +	assertFileNLinks("link2a", 2);
    +	assertIsHardlink("link2a", "link2b");
     
     	/* Test #3 */
    -	assert(0 == stat("link3a", &st));
    -	assertEqualInt(st.st_mode & E_MASK, (S_IFREG | 0755) & ~UMASK);
    -	assertEqualInt(st.st_size, sizeof(data));
    -	assertEqualInt(st.st_nlink, 2);
    -
    -	assert(0 == stat("link3b", &st2));
    -	assertEqualInt(st2.st_mode & E_MASK, (S_IFREG | 0755) & ~UMASK);
    -	assertEqualInt(st2.st_size, sizeof(data));
    -	assertEqualInt(st2.st_nlink, 2);
    -	assertEqualInt(st.st_ino, st2.st_ino);
    -	assertEqualInt(st.st_dev, st2.st_dev);
    +	assertIsReg("link3a", 0755 & ~UMASK);
    +	assertFileSize("link3a", sizeof(data));
    +	assertFileNLinks("link3a", 2);
    +	assertIsHardlink("link3a", "link3b");
     
     	/* Test #4 */
    -	assert(0 == stat("link4a", &st));
    -	assertEqualInt(st.st_mode & E_MASK, (S_IFREG | 0755) & ~UMASK);
    -	assertEqualInt(st.st_size, sizeof(data));
    -	assertEqualInt(st.st_nlink, 2);
    -
    -	assert(0 == stat("link4b", &st2));
    -	assertEqualInt(st2.st_mode & E_MASK, (S_IFREG | 0755) & ~UMASK);
    -	assertEqualInt(st2.st_size, sizeof(data));
    -	assertEqualInt(st2.st_nlink, 2);
    -	assertEqualInt(st.st_ino, st2.st_ino);
    -	assertEqualInt(st.st_dev, st2.st_dev);
    +	assertIsReg("link4a", 0755 & ~UMASK);
    +	assertFileNLinks("link4a", 2);
    +	assertFileSize("link4a", sizeof(data));
    +	assertIsHardlink("link4a", "link4b");
     #endif
     }
    diff --git a/lib/libarchive/test/test_write_disk_perms.c b/lib/libarchive/test/test_write_disk_perms.c
    index 3d9be27e5964..f53ce1946bdc 100644
    --- a/lib/libarchive/test/test_write_disk_perms.c
    +++ b/lib/libarchive/test/test_write_disk_perms.c
    @@ -60,7 +60,7 @@ searchgid(void)
     	_searched = 1;
     
     	/* Create a file on disk in the current default dir. */
    -	fd = open("test_gid", O_CREAT, 0664);
    +	fd = open("test_gid", O_CREAT | O_BINARY, 0664);
     	failure("Couldn't create a file for gid testing.");
     	assert(fd > 0);
     
    @@ -132,6 +132,8 @@ DEFINE_TEST(test_write_disk_perms)
     	struct archive_entry *ae;
     	struct stat st;
     
    +	assertUmask(UMASK);
    +
     	/*
     	 * Set ownership of the current directory to the group of this
     	 * process.  Otherwise, the SGID tests below fail if the
    @@ -182,7 +184,7 @@ DEFINE_TEST(test_write_disk_perms)
     
     	/* Overwrite an existing dir. */
     	/* For dir, the first perms should get left. */
    -	assert(mkdir("dir_overwrite_0744", 0744) == 0);
    +	assertMakeDir("dir_overwrite_0744", 0744);
     	/* Check original perms. */
     	assert(0 == stat("dir_overwrite_0744", &st));
     	failure("dir_overwrite_0744: st.st_mode=%o", st.st_mode);
    diff --git a/lib/libarchive/test/test_write_disk_secure.c b/lib/libarchive/test/test_write_disk_secure.c
    index d41748907b8f..74506f1bccb0 100644
    --- a/lib/libarchive/test/test_write_disk_secure.c
    +++ b/lib/libarchive/test/test_write_disk_secure.c
    @@ -36,13 +36,13 @@ DEFINE_TEST(test_write_disk_secure)
     {
     #if ARCHIVE_VERSION_NUMBER < 1009000
     	skipping("archive_write_disk interface");
    -#else
    +#elif !defined(_WIN32) || defined(__CYGWIN__)
     	struct archive *a;
     	struct archive_entry *ae;
     	struct stat st;
     
     	/* Start with a known umask. */
    -	umask(UMASK);
    +	assertUmask(UMASK);
     
     	/* Create an archive_write_disk object. */
     	assert((a = archive_write_disk_new()) != NULL);
    @@ -55,7 +55,6 @@ DEFINE_TEST(test_write_disk_secure)
     	archive_entry_free(ae);
     	assert(0 == archive_write_finish_entry(a));
     
    -#if !defined(_WIN32) || defined(__CYGWIN__)
     	/* Write a symlink to the dir above. */
     	assert((ae = archive_entry_new()) != NULL);
     	archive_entry_copy_pathname(ae, "link_to_dir");
    @@ -150,7 +149,6 @@ DEFINE_TEST(test_write_disk_secure)
     	assertEqualInt(0, lstat("link_to_dir4", &st));
     	assert(S_ISDIR(st.st_mode));
     	archive_entry_free(ae);
    -#endif
     
     	/*
     	 * As above, but a link to a non-dir, so the link should get replaced.
    @@ -180,14 +178,8 @@ DEFINE_TEST(test_write_disk_secure)
     	assert(S_ISDIR(st.st_mode));
     	archive_entry_free(ae);
     
    -
    -#if ARCHIVE_VERSION_NUMBER < 2000000
    -	archive_write_finish(a);
    -#else
     	assert(0 == archive_write_finish(a));
    -#endif
     
    -#if !defined(_WIN32) || defined(__CYGWIN__)
     	/* Test the entries on disk. */
     	assert(0 == lstat("dir", &st));
     	failure("dir: st.st_mode=%o", st.st_mode);
    @@ -220,5 +212,4 @@ DEFINE_TEST(test_write_disk_secure)
     	failure("link_to_dir2/filec: st.st_mode=%o", st.st_mode);
     	assert((st.st_mode & 07777) == 0755);
     #endif
    -#endif
     }
    diff --git a/lib/libarchive/test/test_write_disk_sparse.c b/lib/libarchive/test/test_write_disk_sparse.c
    index c9c00d3d1e61..b613f56c026b 100644
    --- a/lib/libarchive/test/test_write_disk_sparse.c
    +++ b/lib/libarchive/test/test_write_disk_sparse.c
    @@ -40,7 +40,7 @@ verify_write_data(struct archive *a, int sparse)
     	size_t buff_size = 64 * 1024;
     	char *buff, *p;
     	const char *msg = sparse ? "sparse" : "non-sparse";
    -	int fd;
    +	FILE *f;
     
     	buff = malloc(buff_size);
     	assert(buff != NULL);
    @@ -78,12 +78,12 @@ verify_write_data(struct archive *a, int sparse)
     	/* Test the entry on disk. */
     	assert(0 == stat(archive_entry_pathname(ae), &st));
             assertEqualInt(st.st_size, 8 * buff_size);
    -	fd = open(archive_entry_pathname(ae), O_RDONLY);
    -	if (!assert(fd >= 0))
    +	f = fopen(archive_entry_pathname(ae), "rb");
    +	if (!assert(f != NULL))
     		return;
     
     	/* Check first block. */
    -	assertEqualInt(buff_size, read(fd, buff, buff_size));
    +	assertEqualInt(buff_size, fread(buff, 1, buff_size, f));
     	failure("%s", msg);
     	assertEqualMem(buff, data, sizeof(data));
     	for (p = buff + sizeof(data); p < buff + buff_size; ++p) {
    @@ -93,7 +93,7 @@ verify_write_data(struct archive *a, int sparse)
     	}
     
     	/* Check second block. */
    -	assertEqualInt(buff_size, read(fd, buff, buff_size));
    +	assertEqualInt(buff_size, fread(buff, 1, buff_size, f));
     	for (p = buff; p < buff + buff_size; ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
     		if (p == buff + buff_size / 2 - 3) {
    @@ -104,7 +104,7 @@ verify_write_data(struct archive *a, int sparse)
     	}
     
     	/* Check third block. */
    -	assertEqualInt(buff_size, read(fd, buff, buff_size));
    +	assertEqualInt(buff_size, fread(buff, 1, buff_size, f));
     	for (p = buff; p < buff + buff_size - sizeof(data); ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
     		if (!assertEqualInt(0, *p))
    @@ -115,7 +115,7 @@ verify_write_data(struct archive *a, int sparse)
     
     	/* XXX more XXX */
     
    -	assertEqualInt(0, close(fd));
    +	assertEqualInt(0, fclose(f));
     	archive_entry_free(ae);
     	free(buff);
     }
    @@ -132,7 +132,7 @@ verify_write_data_block(struct archive *a, int sparse)
     	size_t buff_size = 64 * 1024;
     	char *buff, *p;
     	const char *msg = sparse ? "sparse" : "non-sparse";
    -	int fd;
    +	FILE *f;
     
     	buff = malloc(buff_size);
     	assert(buff != NULL);
    @@ -174,12 +174,12 @@ verify_write_data_block(struct archive *a, int sparse)
     	/* Test the entry on disk. */
     	assert(0 == stat(archive_entry_pathname(ae), &st));
             assertEqualInt(st.st_size, 8 * buff_size);
    -	fd = open(archive_entry_pathname(ae), O_RDONLY);
    -	if (!assert(fd >= 0))
    +	f = fopen(archive_entry_pathname(ae), "rb");
    +	if (!assert(f != NULL))
     		return;
     
     	/* Check 100-byte gap at beginning */
    -	assertEqualInt(100, read(fd, buff, 100));
    +	assertEqualInt(100, fread(buff, 1, 100, f));
     	failure("%s", msg);
     	for (p = buff; p < buff + 100; ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
    @@ -188,7 +188,7 @@ verify_write_data_block(struct archive *a, int sparse)
     	}
     
     	/* Check first block. */
    -	assertEqualInt(buff_size, read(fd, buff, buff_size));
    +	assertEqualInt(buff_size, fread(buff, 1, buff_size, f));
     	failure("%s", msg);
     	assertEqualMem(buff, data, sizeof(data));
     	for (p = buff + sizeof(data); p < buff + buff_size; ++p) {
    @@ -198,7 +198,7 @@ verify_write_data_block(struct archive *a, int sparse)
     	}
     
     	/* Check 100-byte gap */
    -	assertEqualInt(100, read(fd, buff, 100));
    +	assertEqualInt(100, fread(buff, 1, 100, f));
     	failure("%s", msg);
     	for (p = buff; p < buff + 100; ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
    @@ -207,7 +207,7 @@ verify_write_data_block(struct archive *a, int sparse)
     	}
     
     	/* Check second block. */
    -	assertEqualInt(buff_size, read(fd, buff, buff_size));
    +	assertEqualInt(buff_size, fread(buff, 1, buff_size, f));
     	for (p = buff; p < buff + buff_size; ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
     		if (p == buff + buff_size / 2 - 3) {
    @@ -218,7 +218,7 @@ verify_write_data_block(struct archive *a, int sparse)
     	}
     
     	/* Check 100-byte gap */
    -	assertEqualInt(100, read(fd, buff, 100));
    +	assertEqualInt(100, fread(buff, 1, 100, f));
     	failure("%s", msg);
     	for (p = buff; p < buff + 100; ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
    @@ -227,7 +227,7 @@ verify_write_data_block(struct archive *a, int sparse)
     	}
     
     	/* Check third block. */
    -	assertEqualInt(buff_size, read(fd, buff, buff_size));
    +	assertEqualInt(buff_size, fread(buff, 1, buff_size, f));
     	for (p = buff; p < buff + buff_size - sizeof(data); ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
     		if (!assertEqualInt(0, *p))
    @@ -237,7 +237,7 @@ verify_write_data_block(struct archive *a, int sparse)
     	assertEqualMem(buff + buff_size - sizeof(data), data, sizeof(data));
     
     	/* Check another block size beyond last we wrote. */
    -	assertEqualInt(buff_size, read(fd, buff, buff_size));
    +	assertEqualInt(buff_size, fread(buff, 1, buff_size, f));
     	failure("%s", msg);
     	for (p = buff; p < buff + buff_size; ++p) {
     		failure("offset: %d, %s", (int)(p - buff), msg);
    @@ -248,7 +248,7 @@ verify_write_data_block(struct archive *a, int sparse)
     
     	/* XXX more XXX */
     
    -	assertEqualInt(0, close(fd));
    +	assertEqualInt(0, fclose(f));
     	free(buff);
     	archive_entry_free(ae);
     }
    diff --git a/lib/libarchive/test/test_write_disk_symlink.c b/lib/libarchive/test/test_write_disk_symlink.c
    new file mode 100644
    index 000000000000..861f3bf6704e
    --- /dev/null
    +++ b/lib/libarchive/test/test_write_disk_symlink.c
    @@ -0,0 +1,117 @@
    +/*-
    + * Copyright (c) 2003-2007 Tim Kientzle
    + * 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(S) ``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(S) 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 "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +/*
    + * Exercise symlink recreation.
    + */
    +DEFINE_TEST(test_write_disk_symlink)
    +{
    +	static const char data[]="abcdefghijklmnopqrstuvwxyz";
    +	struct archive *ad;
    +	struct archive_entry *ae;
    +	int r;
    +
    +	if (!canSymlink()) {
    +		skipping("Symlinks not supported");
    +		return;
    +	}
    +
    +	/* Write entries to disk. */
    +	assert((ad = archive_write_disk_new()) != NULL);
    +
    +	/*
    +	 * First, create a regular file then a symlink to that file.
    +	 */
    +
    +	/* Regular file: link1a */
    +	assert((ae = archive_entry_new()) != NULL);
    +	archive_entry_copy_pathname(ae, "link1a");
    +	archive_entry_set_mode(ae, AE_IFREG | 0755);
    +	archive_entry_set_size(ae, sizeof(data));
    +	assertEqualIntA(ad, 0, archive_write_header(ad, ae));
    +	assertEqualInt(sizeof(data),
    +	    archive_write_data(ad, data, sizeof(data)));
    +	assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	archive_entry_free(ae);
    +
    +	/* Symbolic Link: link1b -> link1a */
    +	assert((ae = archive_entry_new()) != NULL);
    +	archive_entry_copy_pathname(ae, "link1b");
    +	archive_entry_set_mode(ae, AE_IFLNK | 0642);
    +	archive_entry_set_size(ae, 0);
    +	archive_entry_copy_symlink(ae, "link1a");
    +	assertEqualIntA(ad, 0, r = archive_write_header(ad, ae));
    +	if (r >= ARCHIVE_WARN)
    +		assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	archive_entry_free(ae);
    +
    +	/*
    +	 * We should be able to do this in the other order as well,
    +	 * of course.
    +	 */
    +
    +	/* Symbolic link: link2b -> link2a */
    +	assert((ae = archive_entry_new()) != NULL);
    +	archive_entry_copy_pathname(ae, "link2b");
    +	archive_entry_set_mode(ae, AE_IFLNK | 0642);
    +	archive_entry_unset_size(ae);
    +	archive_entry_copy_symlink(ae, "link2a");
    +	assertEqualIntA(ad, 0, r = archive_write_header(ad, ae));
    +	if (r >= ARCHIVE_WARN) {
    +		assertEqualInt(ARCHIVE_WARN,
    +		    archive_write_data(ad, data, sizeof(data)));
    +		assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	}
    +	archive_entry_free(ae);
    +
    +	/* File: link2a */
    +	assert((ae = archive_entry_new()) != NULL);
    +	archive_entry_copy_pathname(ae, "link2a");
    +	archive_entry_set_mode(ae, AE_IFREG | 0755);
    +	archive_entry_set_size(ae, sizeof(data));
    +	assertEqualIntA(ad, 0, archive_write_header(ad, ae));
    +	assertEqualInt(sizeof(data),
    +	    archive_write_data(ad, data, sizeof(data)));
    +	assertEqualIntA(ad, 0, archive_write_finish_entry(ad));
    +	archive_entry_free(ae);
    +
    +	assertEqualInt(ARCHIVE_OK, archive_write_finish(ad));
    +
    +	/* Test the entries on disk. */
    +
    +	/* Test #1 */
    +	assertIsReg("link1a", -1);
    +	assertFileSize("link1a", sizeof(data));
    +	assertFileNLinks("link1a", 1);
    +	assertIsSymlink("link1b", "link1a");
    +
    +	/* Test #2: Should produce identical results to test #1 */
    +	assertIsReg("link2a", -1);
    +	assertFileSize("link2a", sizeof(data));
    +	assertFileNLinks("link2a", 1);
    +	assertIsSymlink("link2b", "link2a");
    +}
    diff --git a/lib/libarchive/test/test_write_disk_times.c b/lib/libarchive/test/test_write_disk_times.c
    index 2891e3612aff..13841cfddafe 100644
    --- a/lib/libarchive/test/test_write_disk_times.c
    +++ b/lib/libarchive/test/test_write_disk_times.c
    @@ -35,8 +35,6 @@ DEFINE_TEST(test_write_disk_times)
     {
     	struct archive *a;
     	struct archive_entry *ae;
    -	struct stat st;
    - 	time_t now = time(NULL);
     
     	/* Create an archive_write_disk object. */
     	assert((a = archive_write_disk_new()) != NULL);
    @@ -55,9 +53,8 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
     	/* Verify */
    -	assertEqualInt(0, stat("file1", &st));
    -	assertEqualInt(123456, st.st_atime);
    -	assertEqualInt(234567, st.st_mtime);
    +	assertFileAtime("file1", 123456, 0);
    +	assertFileMtime("file1", 234567, 0);
     
     	/*
     	 * mtime specified, but not atime
    @@ -69,11 +66,8 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
    -	/* Verify: Current atime and mtime as specified. */
    -	assertEqualInt(0, stat("file2", &st));
    -	assertEqualInt(234567, st.st_mtime);
    -	failure("now: %ld st.st_atime: %ld", (long)now, (long)st.st_atime);
    -	assert(st.st_atime >= now && st.st_atime < now + 3);
    +	assertFileMtime("file2", 234567, 0);
    +	assertFileAtimeRecent("file2");
     
     	/*
     	 * atime specified, but not mtime
    @@ -86,10 +80,8 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
     	/* Verify: Current mtime and atime as specified. */
    -	assertEqualInt(0, stat("file3", &st));
    -	assertEqualInt(345678, st.st_atime);
    -	failure("now: %ld st.st_mtime: %ld", (long)now, (long)st.st_mtime);
    -	assert(st.st_mtime >= now && st.st_mtime < now + 3);
    +	assertFileAtime("file3", 345678, 0);
    +	assertFileMtimeRecent("file3");
     
     	/*
     	 * Neither atime nor mtime specified.
    @@ -101,11 +93,8 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
     	/* Verify: Current mtime and atime. */
    -	assertEqualInt(0, stat("file4", &st));
    -	failure("now: %ld st.st_atime: %ld", (long)now, (long)st.st_atime);
    -	assert(st.st_atime >= now && st.st_atime < now + 3);
    -	failure("now: %ld st.st_mtime: %ld", (long)now, (long)st.st_mtime);
    -	assert(st.st_mtime >= now && st.st_mtime < now + 3);
    +	assertFileAtimeRecent("file4");
    +	assertFileMtimeRecent("file4");
     
     #if defined(__FreeBSD__)
     	/*
    @@ -120,12 +109,8 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
     	/* Verify */
    -	/* FreeBSD can only store usec resolution, hence rounding here. */
    -	assertEqualInt(0, stat("file10", &st));
    -	assertEqualInt(1234567, st.st_atime);
    -	assertEqualInt(23000, st.st_atimespec.tv_nsec);
    -	assertEqualInt(2345678, st.st_mtime);
    -	assertEqualInt(4000, st.st_mtimespec.tv_nsec);
    +	assertFileMtime("file10", 2345678, 4567);
    +	assertFileAtime("file10", 1234567, 23456);
     
     	/*
     	 * Birthtime, mtime and atime on FreeBSD
    @@ -141,14 +126,9 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
     	/* Verify */
    -	/* FreeBSD can only store usec resolution, hence rounding here. */
    -	assertEqualInt(0, stat("file11", &st));
    -	assertEqualInt(1234567, st.st_atime);
    -	assertEqualInt(23000, st.st_atimespec.tv_nsec);
    -	assertEqualInt(3456789, st.st_birthtime);
    -	assertEqualInt(12000, st.st_birthtimespec.tv_nsec);
    -	assertEqualInt(12345678, st.st_mtime);
    -	assertEqualInt(4000, st.st_mtimespec.tv_nsec);
    +	assertFileAtime("file11", 1234567, 23456);
    +	assertFileBirthtime("file11", 3456789, 12345);
    +	assertFileMtime("file11", 12345678, 4567);
     
     	/*
     	 * Birthtime only on FreeBSD.
    @@ -161,14 +141,9 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
     	/* Verify */
    -	/* FreeBSD can only store usec resolution, hence rounding here. */
    -	assertEqualInt(0, stat("file12", &st));
    -	assertEqualInt(3456789, st.st_birthtime);
    -	assertEqualInt(12000, st.st_birthtimespec.tv_nsec);
    -	failure("now: %ld st.st_atime: %ld", (long)now, (long)st.st_atime);
    -	assert(st.st_atime >= now && st.st_atime < now + 3);
    -	failure("now: %ld st.st_mtime: %ld", (long)now, (long)st.st_mtime);
    -	assert(st.st_mtime >= now && st.st_mtime < now + 3);
    +	assertFileAtimeRecent("file12");
    +	assertFileBirthtime("file12", 3456789, 12345);
    +	assertFileMtimeRecent("file12");
     
     	/*
     	 * mtime only on FreeBSD.
    @@ -181,14 +156,9 @@ DEFINE_TEST(test_write_disk_times)
     	assertEqualInt(ARCHIVE_OK, archive_write_finish_entry(a));
     	archive_entry_free(ae);
     	/* Verify */
    -	/* FreeBSD can only store usec resolution, hence rounding here. */
    -	assertEqualInt(0, stat("file13", &st));
    -	assertEqualInt(4567890, st.st_birthtime);
    -	assertEqualInt(23000, st.st_birthtimespec.tv_nsec);
    -	assertEqualInt(4567890, st.st_mtime);
    -	assertEqualInt(23000, st.st_mtimespec.tv_nsec);
    -	failure("now: %ld st.st_atime: %ld", (long)now, (long)st.st_atime);
    -	assert(st.st_atime >= now && st.st_atime < now + 3);
    +	assertFileAtimeRecent("file13");
    +	assertFileBirthtime("file13", 4567890, 23456);
    +	assertFileMtime("file13", 4567890, 23456);
     #else
     	skipping("Platform-specific time restore tests");
     #endif
    diff --git a/lib/libarchive/test/test_write_format_cpio_empty.c b/lib/libarchive/test/test_write_format_cpio_empty.c
    index 81f17a415acf..fed26ec04020 100644
    --- a/lib/libarchive/test/test_write_format_cpio_empty.c
    +++ b/lib/libarchive/test/test_write_format_cpio_empty.c
    @@ -71,5 +71,5 @@ DEFINE_TEST(test_write_format_cpio_empty)
     	failure("Empty cpio archive should be exactly 87 bytes, was %d.", used);
     	assert(used == 87);
     	failure("Empty cpio archive is incorrectly formatted.");
    -	assert(memcmp(buff, ref, 87) == 0);
    +	assertEqualMem(buff, ref, 87);
     }
    diff --git a/lib/libarchive/test/test_write_format_cpio_newc.c b/lib/libarchive/test/test_write_format_cpio_newc.c
    index 512df7422912..447d111420dc 100644
    --- a/lib/libarchive/test/test_write_format_cpio_newc.c
    +++ b/lib/libarchive/test/test_write_format_cpio_newc.c
    @@ -52,7 +52,7 @@ DEFINE_TEST(test_write_format_cpio_newc)
     {
     	struct archive *a;
     	struct archive_entry *entry;
    -	char *buff, *e;
    +	char *buff, *e, *file;
     	size_t buffsize = 100000;
     	size_t used;
     
    @@ -99,7 +99,8 @@ DEFINE_TEST(test_write_format_cpio_newc)
     	assert((entry = archive_entry_new()) != NULL);
     	archive_entry_set_mtime(entry, 3, 30);
     	archive_entry_set_pathname(entry, "lnk");
    -	archive_entry_set_mode(entry, S_IFLNK | 0664);
    +	archive_entry_set_mode(entry, 0664);
    +	archive_entry_set_filetype(entry, AE_IFLNK);
     	archive_entry_set_size(entry, 0);
     	archive_entry_set_uid(entry, 83);
     	archive_entry_set_gid(entry, 93);
    @@ -123,9 +124,10 @@ DEFINE_TEST(test_write_format_cpio_newc)
     	e = buff;
     
     	/* First entry is "file" */
    +	file = e;
     	assert(is_hex(e, 110)); /* Entire header is hex digits. */
     	assertEqualMem(e + 0, "070701", 6); /* Magic */
    -	assertEqualMem(e + 6, "00000059", 8); /* ino */
    +	assert(memcmp(e + 6, "00000000", 8) != 0); /* ino != 0 */
     	assertEqualMem(e + 14, "000081b4", 8); /* Mode */
     	assertEqualMem(e + 22, "00000050", 8); /* uid */
     	assertEqualMem(e + 30, "0000005a", 8); /* gid */
    @@ -166,7 +168,8 @@ DEFINE_TEST(test_write_format_cpio_newc)
     	/* Third entry is "lnk" */
     	assert(is_hex(e, 110)); /* Entire header is hex digits. */
     	assertEqualMem(e + 0, "070701", 6); /* Magic */
    -	assertEqualMem(e + 6, "00000058", 8); /* ino */
    +	assert(memcmp(e + 6, file + 6, 8) != 0); /* ino != file ino */
    +	assert(memcmp(e + 6, "00000000", 8) != 0); /* ino != 0 */
     	assertEqualMem(e + 14, "0000a1b4", 8); /* Mode */
     	assertEqualMem(e + 22, "00000053", 8); /* uid */
     	assertEqualMem(e + 30, "0000005d", 8); /* gid */
    diff --git a/lib/libarchive/test/test_write_format_cpio_odc.c b/lib/libarchive/test/test_write_format_cpio_odc.c
    index 73cc3e6218c5..309e003e18b2 100644
    --- a/lib/libarchive/test/test_write_format_cpio_odc.c
    +++ b/lib/libarchive/test/test_write_format_cpio_odc.c
    @@ -46,7 +46,7 @@ DEFINE_TEST(test_write_format_cpio_odc)
     {
     	struct archive *a;
     	struct archive_entry *entry;
    -	char *buff, *e;
    +	char *buff, *e, *file;
     	size_t buffsize = 100000;
     	size_t used;
     
    @@ -109,7 +109,8 @@ DEFINE_TEST(test_write_format_cpio_odc)
     	assert((entry = archive_entry_new()) != NULL);
     	archive_entry_set_mtime(entry, 3, 30);
     	archive_entry_set_pathname(entry, "symlink");
    -	archive_entry_set_mode(entry, S_IFLNK | 0664);
    +	archive_entry_set_mode(entry, 0664);
    +	archive_entry_set_filetype(entry, AE_IFLNK);
     	archive_entry_set_symlink(entry,"file");
     	archive_entry_set_size(entry, 0);
     	archive_entry_set_uid(entry, 88);
    @@ -130,14 +131,29 @@ DEFINE_TEST(test_write_format_cpio_odc)
     
     	/*
     	 * Verify the archive format.
    +	 *
    +	 * Notes on the ino validation: cpio does not actually require
    +	 * that the ino values written to the archive match those read
    +	 * from disk.  It really requires that:
    +	 *   * matching non-zero ino values be written as matching
    +	 *     non-zero values
    +	 *   * non-matching non-zero ino values be written as non-matching
    +	 *     non-zero values
    +	 * Libarchive further ensures that zero ino values get written
    +	 * as zeroes.  This allows the cpio writer to generate
    +	 * synthetic ino values for the archive that may be different
    +	 * than those on disk in order to avoid problems due to truncation.
    +	 * This is especially needed for odc (POSIX format) that
    +	 * only supports 18-bit ino values.
     	 */
     	e = buff;
     
     	/* "file" */
    +	file = e; /* Remember where this starts... */
     	assert(is_octal(e, 76)); /* Entire header is octal digits. */
     	assertEqualMem(e + 0, "070707", 6); /* Magic */
     	assertEqualMem(e + 6, "000014", 6); /* dev */
    -	assertEqualMem(e + 12, "000131", 6); /* ino */
    +	assert(memcmp(e + 12, "000000", 6) != 0); /* ino must be != 0 */
     	assertEqualMem(e + 18, "100664", 6); /* Mode */
     	assertEqualMem(e + 24, "000120", 6); /* uid */
     	assertEqualMem(e + 30, "000132", 6); /* gid */
    @@ -154,7 +170,7 @@ DEFINE_TEST(test_write_format_cpio_odc)
     	assert(is_octal(e, 76)); /* Entire header is octal digits. */
     	assertEqualMem(e + 0, "070707", 6); /* Magic */
     	assertEqualMem(e + 6, "000014", 6); /* dev */
    -	assertEqualMem(e + 12, "000131", 6); /* ino */
    +	assertEqualMem(e + 12, file + 12, 6); /* ino must match above */
     	assertEqualMem(e + 18, "100664", 6); /* Mode */
     	assertEqualMem(e + 24, "000120", 6); /* uid */
     	assertEqualMem(e + 30, "000132", 6); /* gid */
    @@ -187,7 +203,8 @@ DEFINE_TEST(test_write_format_cpio_odc)
     	assert(is_octal(e, 76)); /* Entire header is octal digits. */
     	assertEqualMem(e + 0, "070707", 6); /* Magic */
     	assertEqualMem(e + 6, "000014", 6); /* dev */
    -	assertEqualMem(e + 12, "000132", 6); /* ino */
    +	assert(memcmp(e + 12, file + 12, 6) != 0); /* ino must != file ino */
    +	assert(memcmp(e + 12, "000000", 6) != 0); /* ino must != 0 */
     	assertEqualMem(e + 18, "120664", 6); /* Mode */
     	assertEqualMem(e + 24, "000130", 6); /* uid */
     	assertEqualMem(e + 30, "000142", 6); /* gid */
    diff --git a/lib/libarchive/test/test_write_format_tar_ustar.c b/lib/libarchive/test/test_write_format_tar_ustar.c
    index 3adacb4e90d1..f66fd7ad82bc 100644
    --- a/lib/libarchive/test/test_write_format_tar_ustar.c
    +++ b/lib/libarchive/test/test_write_format_tar_ustar.c
    @@ -133,7 +133,8 @@ DEFINE_TEST(test_write_format_tar_ustar)
     	assert((entry = archive_entry_new()) != NULL);
     	archive_entry_set_mtime(entry, 3, 30);
     	archive_entry_set_pathname(entry, "symlink");
    -	archive_entry_set_mode(entry, S_IFLNK | 0664);
    +	archive_entry_set_mode(entry, 0664);
    +	archive_entry_set_filetype(entry, AE_IFLNK);
     	archive_entry_set_symlink(entry,"file");
     	archive_entry_set_size(entry, 0);
     	archive_entry_set_uid(entry, 88);
    diff --git a/lib/libarchive/test/test_write_format_zip.c b/lib/libarchive/test/test_write_format_zip.c
    new file mode 100644
    index 000000000000..f4c51f34ba93
    --- /dev/null
    +++ b/lib/libarchive/test/test_write_format_zip.c
    @@ -0,0 +1,180 @@
    +/*-
    + * Copyright (c) 2003-2008 Tim Kientzle
    + * Copyright (c) 2008 Anselm Strauss
    + * 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(S) ``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(S) 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.
    + */
    +
    +/*
    + * Development supported by Google Summer of Code 2008.
    + */
    +
    +/* TODO: reader does not yet restore permissions. */
    +
    +#include "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +DEFINE_TEST(test_write_format_zip)
    +{
    +	char filedata[64];
    +	struct archive_entry *ae;
    +	struct archive *a;
    +	size_t used;
    +	size_t buffsize = 1000000;
    +	char *buff;
    +	const char *compression_type;
    +
    +	buff = malloc(buffsize);
    +
    +	/* Create a new archive in memory. */
    +	assert((a = archive_write_new()) != NULL);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a));
    +#ifdef HAVE_ZLIB_H
    +	compression_type = "zip:compression=deflate";
    +#else
    +	compression_type = "zip:compression=store";
    +#endif
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_write_set_format_options(a, compression_type));
    +	assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a));
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_write_open_memory(a, buff, buffsize, &used));
    +
    +	/*
    +	 * Write a file to it.
    +	 */
    +	assert((ae = archive_entry_new()) != NULL);
    +	archive_entry_set_mtime(ae, 1, 10);
    +	assertEqualInt(1, archive_entry_mtime(ae));
    +	assertEqualInt(10, archive_entry_mtime_nsec(ae));
    +	archive_entry_copy_pathname(ae, "file");
    +	assertEqualString("file", archive_entry_pathname(ae));
    +	archive_entry_set_mode(ae, S_IFREG | 0755);
    +	assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae));
    +	archive_entry_set_size(ae, 8);
    +
    +	assertEqualInt(0, archive_write_header(a, ae));
    +	archive_entry_free(ae);
    +	assertEqualInt(8, archive_write_data(a, "12345678", 9));
    +	assertEqualInt(0, archive_write_data(a, "1", 1));
    +
    +	/*
    +	 * Write another file to it.
    +	 */
    +	assert((ae = archive_entry_new()) != NULL);
    +	archive_entry_set_mtime(ae, 1, 10);
    +	assertEqualInt(1, archive_entry_mtime(ae));
    +	assertEqualInt(10, archive_entry_mtime_nsec(ae));
    +	archive_entry_copy_pathname(ae, "file2");
    +	assertEqualString("file2", archive_entry_pathname(ae));
    +	archive_entry_set_mode(ae, S_IFREG | 0755);
    +	assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae));
    +	archive_entry_set_size(ae, 4);
    +
    +	assertEqualInt(ARCHIVE_OK, archive_write_header(a, ae));
    +	archive_entry_free(ae);
    +	assertEqualInt(4, archive_write_data(a, "1234", 5));
    +
    +	/*
    +	 * Write a directory to it.
    +	 */
    +	assert((ae = archive_entry_new()) != NULL);
    +	archive_entry_set_mtime(ae, 11, 110);
    +	archive_entry_copy_pathname(ae, "dir");
    +	archive_entry_set_mode(ae, S_IFDIR | 0755);
    +	archive_entry_set_size(ae, 512);
    +
    +	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
    +	failure("size should be zero so that applications know not to write");
    +	assertEqualInt(0, archive_entry_size(ae));
    +	archive_entry_free(ae);
    +	assertEqualIntA(a, 0, archive_write_data(a, "12345678", 9));
    +
    +	/* Close out the archive. */
    +	assertEqualInt(ARCHIVE_OK, archive_write_close(a));
    +	assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
    +
    +	/*
    +	 * Now, read the data back.
    +	 */
    +	ae = NULL;
    +	assert((a = archive_read_new()) != NULL);
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_read_support_compression_all(a));
    +	assertEqualIntA(a, ARCHIVE_OK,
    +	    archive_read_open_memory(a, buff, used));
    +
    +	/*
    +	 * Read and verify first file.
    +	 */
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualInt(1, archive_entry_mtime(ae));
    +	/* Zip doesn't store high-resolution mtime. */
    +	assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +	assertEqualInt(0, archive_entry_atime(ae));
    +	assertEqualInt(0, archive_entry_ctime(ae));
    +	assertEqualString("file", archive_entry_pathname(ae));
    +	//assertEqualInt((S_IFREG | 0755), archive_entry_mode(ae));
    +	assertEqualInt(0, archive_entry_size(ae));
    +	assertEqualIntA(a, 8,
    +	    archive_read_data(a, filedata, sizeof(filedata)));
    +	assertEqualMem(filedata, "12345678", 8);
    +
    +
    +	/*
    +	 * Read the second file back.
    +	 */
    +	if (!assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae))){
    +		free(buff);
    +		return;
    +	}
    +	assertEqualInt(1, archive_entry_mtime(ae));
    +	assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +	assertEqualInt(0, archive_entry_atime(ae));
    +	assertEqualInt(0, archive_entry_ctime(ae));
    +	assertEqualString("file2", archive_entry_pathname(ae));
    +	//assert((S_IFREG | 0755) == archive_entry_mode(ae));
    +	assertEqualInt(0, archive_entry_size(ae));
    +	assertEqualIntA(a, 4,
    +	    archive_read_data(a, filedata, sizeof(filedata)));
    +	assertEqualMem(filedata, "1234", 4);
    +
    +	/*
    +	 * Read the dir entry back.
    +	 */
    +	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
    +	assertEqualInt(11, archive_entry_mtime(ae));
    +	assertEqualInt(0, archive_entry_mtime_nsec(ae));
    +	assertEqualInt(0, archive_entry_atime(ae));
    +	assertEqualInt(0, archive_entry_ctime(ae));
    +	assertEqualString("dir/", archive_entry_pathname(ae));
    +	//assertEqualInt((S_IFDIR | 0755), archive_entry_mode(ae));
    +	assertEqualInt(0, archive_entry_size(ae));
    +	assertEqualIntA(a, 0, archive_read_data(a, filedata, 10));
    +
    +	/* Verify the end of the archive. */
    +	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
    +	assertEqualInt(ARCHIVE_OK, archive_read_close(a));
    +	assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
    +	free(buff);
    +}
    diff --git a/lib/libarchive/test/test_write_format_zip_empty.c b/lib/libarchive/test/test_write_format_zip_empty.c
    new file mode 100644
    index 000000000000..ef90b8d96551
    --- /dev/null
    +++ b/lib/libarchive/test/test_write_format_zip_empty.c
    @@ -0,0 +1,56 @@
    +/*-
    + * Copyright (c) 2008 Anselm Strauss
    + * 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(S) ``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(S) 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.
    + */
    +
    +/*
    + * Development supported by Google Summer of Code 2008.
    + */
    +
    +#include "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +DEFINE_TEST(test_write_format_zip_empty)
    +{
    +	struct archive *a;
    +	char buff[256];
    +	size_t used;
    +
    +	/* Zip format: Create a new archive in memory. */
    +	assert((a = archive_write_new()) != NULL);
    +	assertA(0 == archive_write_set_format_zip(a));
    +	assertA(0 == archive_write_set_compression_none(a));
    +	assertA(0 == archive_write_set_bytes_per_block(a, 1));
    +	assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
    +	assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used));
    +
    +	/* Close out the archive without writing anything. */
    +	assertA(0 == archive_write_close(a));
    +	assertA(0 == archive_write_finish(a));
    +
    +	/* Verify the correct format for an empy Zip archive. */
    +	assertEqualInt(used, 22);
    +	assertEqualMem(buff,
    +	    "PK\005\006\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
    +	    22);
    +}
    diff --git a/lib/libarchive/test/test_write_format_zip_no_compression.c b/lib/libarchive/test/test_write_format_zip_no_compression.c
    new file mode 100644
    index 000000000000..63e76b670387
    --- /dev/null
    +++ b/lib/libarchive/test/test_write_format_zip_no_compression.c
    @@ -0,0 +1,304 @@
    +/*-
    + * Copyright (c) 2008 Anselm Strauss
    + * 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(S) ``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(S) 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.
    + */
    +
    +/*
    + * Development supported by Google Summer of Code 2008.
    + */
    +
    +#include "test.h"
    +__FBSDID("$FreeBSD$");
    +
    +static unsigned long
    +bitcrc32(unsigned long c, void *_p, size_t s)
    +{
    +	/* This is a drop-in replacement for crc32() from zlib.
    +	 * Libarchive should be able to correctly generate
    +	 * uncompressed zip archives (including correct CRCs) even
    +	 * when zlib is unavailable, and this function helps us verify
    +	 * that.  Yes, this is very, very slow and unsuitable for
    +	 * production use, but it's correct, compact, and works well
    +	 * enough for this particular usage.  Libarchive internally
    +	 * uses a much more efficient implementation.  */
    +	const unsigned char *p = _p;
    +	int bitctr;
    +
    +	if (p == NULL)
    +		return (0);
    +
    +	for (; s > 0; --s) {
    +		c ^= *p++;
    +		for (bitctr = 8; bitctr > 0; --bitctr) {
    +			if (c & 1) c = (c >> 1);
    +			else	   c = (c >> 1) ^ 0xedb88320;
    +			c ^= 0x80000000;
    +		}
    +	}
    +	return (c);
    +}
    +
    +/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */
    +static int i2(const char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); }
    +static int i4(const char *p) { return (i2(p) | (i2(p + 2) << 16)); }
    +
    +DEFINE_TEST(test_write_format_zip_no_compression)
    +{
    +	/* Buffer data */
    +	struct archive *a;
    +	struct archive_entry *entry;
    +	char buff[100000];
    +	const char *buffend;
    +	/* p is the pointer to walk over the central directory,
    +	 * q walks over the local headers, the data and the data descriptors. */
    +	const char *p, *q;
    +	size_t used;
    +
    +	/* File data */
    +	char file_name[] = "file";
    +	char file_data1[] = {'1', '2', '3', '4', '5'};
    +	char file_data2[] = {'6', '7', '8', '9', '0'};
    +	int file_perm = 00644;
    +	short file_uid = 10;
    +	short file_gid = 20;
    +
    +	/* Folder data */
    +	char folder_name[] = "folder/";
    +	int folder_perm = 00755;
    +	short folder_uid = 30;
    +	short folder_gid = 40;
    +
    +	/* Time data */
    +	time_t t = time(NULL);
    +	struct tm *tm = localtime(&t);
    +
    +	/* Misc variables */
    +	unsigned long crc;
    +
    +	/* Create new ZIP archive in memory without padding. */
    +	assert((a = archive_write_new()) != NULL);
    +	assertA(0 == archive_write_set_format_zip(a));
    +	assertA(0 == archive_write_set_format_options(a, "zip:compression=store"));
    +	assertA(0 == archive_write_set_compression_none(a));
    +	assertA(0 == archive_write_set_bytes_per_block(a, 1));
    +	assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
    +	assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used));
    +
    +	/* Write entries. */
    +
    +	/* Regular file */
    +	assert((entry = archive_entry_new()) != NULL);
    +	archive_entry_set_pathname(entry, file_name);
    +	archive_entry_set_mode(entry, S_IFREG | 0644);
    +	archive_entry_set_size(entry, sizeof(file_data1) + sizeof(file_data2));
    +	archive_entry_set_uid(entry, file_uid);
    +	archive_entry_set_gid(entry, file_gid);
    +	archive_entry_set_mtime(entry, t, 0);
    +	archive_entry_set_atime(entry, t, 0);
    +	archive_entry_set_ctime(entry, t, 0);
    +	assertEqualIntA(a, 0, archive_write_header(a, entry));
    +	assertEqualIntA(a, sizeof(file_data1), archive_write_data(a, file_data1, sizeof(file_data1)));
    +	assertEqualIntA(a, sizeof(file_data2), archive_write_data(a, file_data2, sizeof(file_data2)));
    +	archive_entry_free(entry);
    +
    +	/* Folder */
    +	assert((entry = archive_entry_new()) != NULL);
    +	archive_entry_set_pathname(entry, folder_name);
    +	archive_entry_set_mode(entry, S_IFDIR | folder_perm);
    +	archive_entry_set_size(entry, 0);
    +	archive_entry_set_uid(entry, folder_uid);
    +	archive_entry_set_gid(entry, folder_gid);
    +	archive_entry_set_mtime(entry, t, 0);
    +	archive_entry_set_atime(entry, t, 0);
    +	archive_entry_set_ctime(entry, t, 0);
    +	assertEqualIntA(a, 0, archive_write_header(a, entry));
    +	archive_entry_free(entry);
    +
    +	/* Close the archive . */
    +	assertA(0 == archive_write_close(a));
    +	assertA(0 == archive_write_finish(a));
    +
    +	/* Remember the end of the archive in memory. */
    +	buffend = buff + used;
    +
    +	/* Verify "End of Central Directory" record. */
    +	/* Get address of end-of-central-directory record. */
    +	p = buffend - 22; /* Assumes there is no zip comment field. */
    +	failure("End-of-central-directory begins with PK\\005\\006 signature");
    +	assertEqualMem(p, "PK\005\006", 4);
    +	failure("This must be disk 0");
    +	assertEqualInt(i2(p + 4), 0);
    +	failure("Central dir must start on disk 0");
    +	assertEqualInt(i2(p + 6), 0);
    +	failure("All central dir entries are on this disk");
    +	assertEqualInt(i2(p + 8), i2(p + 10));
    +	failure("CD start (%d) + CD length (%d) should == archive size - 22",
    +	    i4(p + 12), i4(p + 16));
    +	assertEqualInt(i4(p + 12) + i4(p + 16), used - 22);
    +	failure("no zip comment");
    +	assertEqualInt(i2(p + 20), 0);
    +
    +	/* Get address of first entry in central directory. */
    +	p = buff + i4(buffend - 6);
    +	failure("Central file record at offset %d should begin with"
    +	    " PK\\001\\002 signature",
    +	    i4(buffend - 10));
    +
    +	/* Verify file entry in central directory. */
    +	assertEqualMem(p, "PK\001\002", 4); /* Signature */
    +	assertEqualInt(i2(p + 4), 3 * 256 + 20); /* Version made by */
    +	assertEqualInt(i2(p + 6), 20); /* Version needed to extract */
    +	assertEqualInt(i2(p + 8), 8); /* Flags */
    +	assertEqualInt(i2(p + 10), 0); /* Compression method */
    +	assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */
    +	assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */
    +	crc = bitcrc32(0, file_data1, sizeof(file_data1));
    +	crc = bitcrc32(crc, file_data2, sizeof(file_data2));
    +	assertEqualInt(i4(p + 16), crc); /* CRC-32 */
    +	assertEqualInt(i4(p + 20), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */
    +	assertEqualInt(i4(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */
    +	assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */
    +	assertEqualInt(i2(p + 30), 13); /* Extra field length */
    +	assertEqualInt(i2(p + 32), 0); /* File comment length */
    +	assertEqualInt(i2(p + 34), 0); /* Disk number start */
    +	assertEqualInt(i2(p + 36), 0); /* Internal file attrs */
    +	assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */
    +	assertEqualInt(i4(p + 42), 0); /* Offset of local header */
    +	assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */
    +	p = p + 46 + strlen(file_name);
    +	assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */
    +	assertEqualInt(i2(p + 2), 5); /* 'UT' size */
    +	assertEqualInt(p[4], 7); /* 'UT' flags */
    +	assertEqualInt(i4(p + 5), t); /* 'UT' mtime */
    +	p = p + 9;
    +	assertEqualInt(i2(p), 0x7855); /* 'Ux' extension header */
    +	assertEqualInt(i2(p + 2), 0); /* 'Ux' size */
    +	p = p + 4;
    +
    +	/* Verify local header of file entry. */
    +	q = buff;
    +	assertEqualMem(q, "PK\003\004", 4); /* Signature */
    +	assertEqualInt(i2(q + 4), 20); /* Version needed to extract */
    +	assertEqualInt(i2(q + 6), 8); /* Flags */
    +	assertEqualInt(i2(q + 8), 0); /* Compression method */
    +	assertEqualInt(i2(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */
    +	assertEqualInt(i2(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */
    +	assertEqualInt(i4(q + 14), 0); /* CRC-32 */
    +	assertEqualInt(i4(q + 18), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */
    +	assertEqualInt(i4(q + 22), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */
    +	assertEqualInt(i2(q + 26), strlen(file_name)); /* Pathname length */
    +	assertEqualInt(i2(q + 28), 25); /* Extra field length */
    +	assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */
    +	q = q + 30 + strlen(file_name);
    +	assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */
    +	assertEqualInt(i2(q + 2), 13); /* 'UT' size */
    +	assertEqualInt(q[4], 7); /* 'UT' flags */
    +	assertEqualInt(i4(q + 5), t); /* 'UT' mtime */
    +	assertEqualInt(i4(q + 9), t); /* 'UT' atime */
    +	assertEqualInt(i4(q + 13), t); /* 'UT' ctime */
    +	q = q + 17;
    +	assertEqualInt(i2(q), 0x7855); /* 'Ux' extension header */
    +	assertEqualInt(i2(q + 2), 4); /* 'Ux' size */
    +	assertEqualInt(i2(q + 4), file_uid); /* 'Ux' UID */
    +	assertEqualInt(i2(q + 6), file_gid); /* 'Ux' GID */
    +	q = q + 8;
    +
    +	/* Verify data of file entry. */
    +	assertEqualMem(q, file_data1, sizeof(file_data1));
    +	assertEqualMem(q + sizeof(file_data1), file_data2, sizeof(file_data2));
    +	q = q + sizeof(file_data1) + sizeof(file_data2);
    +
    +	/* Verify data descriptor of file entry. */
    +	assertEqualMem(q, "PK\007\010", 4); /* Signature */
    +	assertEqualInt(i4(q + 4), crc); /* CRC-32 */
    +	assertEqualInt(i4(q + 8), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */
    +	assertEqualInt(i4(q + 12), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */
    +	q = q + 16;
    +
    +	/* Verify folder entry in central directory. */
    +	assertEqualMem(p, "PK\001\002", 4); /* Signature */
    +	assertEqualInt(i2(p + 4), 3 * 256 + 20); /* Version made by */
    +	assertEqualInt(i2(p + 6), 20); /* Version needed to extract */
    +	assertEqualInt(i2(p + 8), 8); /* Flags */
    +	assertEqualInt(i2(p + 10), 0); /* Compression method */
    +	assertEqualInt(i2(p + 12), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */
    +	assertEqualInt(i2(p + 14), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */
    +	crc = 0;
    +	assertEqualInt(i4(p + 16), crc); /* CRC-32 */
    +	assertEqualInt(i4(p + 20), 0); /* Compressed size */
    +	assertEqualInt(i4(p + 24), 0); /* Uncompressed size */
    +	assertEqualInt(i2(p + 28), strlen(folder_name)); /* Pathname length */
    +	assertEqualInt(i2(p + 30), 13); /* Extra field length */
    +	assertEqualInt(i2(p + 32), 0); /* File comment length */
    +	assertEqualInt(i2(p + 34), 0); /* Disk number start */
    +	assertEqualInt(i2(p + 36), 0); /* Internal file attrs */
    +	assertEqualInt(i4(p + 38) >> 16 & 01777, folder_perm); /* External file attrs */
    +	assertEqualInt(i4(p + 42), q - buff); /* Offset of local header */
    +	assertEqualMem(p + 46, folder_name, strlen(folder_name)); /* Pathname */
    +	p = p + 46 + strlen(folder_name);
    +	assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */
    +	assertEqualInt(i2(p + 2), 5); /* 'UT' size */
    +	assertEqualInt(p[4], 7); /* 'UT' flags */
    +	assertEqualInt(i4(p + 5), t); /* 'UT' mtime */
    +	p = p + 9;
    +	assertEqualInt(i2(p), 0x7855); /* 'Ux' extension header */
    +	assertEqualInt(i2(p + 2), 0); /* 'Ux' size */
    +	p = p + 4;
    +
    +	/* Verify local header of folder entry. */
    +	assertEqualMem(q, "PK\003\004", 4); /* Signature */
    +	assertEqualInt(i2(q + 4), 20); /* Version needed to extract */
    +	assertEqualInt(i2(q + 6), 8); /* Flags */
    +	assertEqualInt(i2(q + 8), 0); /* Compression method */
    +	assertEqualInt(i2(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */
    +	assertEqualInt(i2(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */
    +	assertEqualInt(i4(q + 14), 0); /* CRC-32 */
    +	assertEqualInt(i4(q + 18), 0); /* Compressed size */
    +	assertEqualInt(i4(q + 22), 0); /* Uncompressed size */
    +	assertEqualInt(i2(q + 26), strlen(folder_name)); /* Pathname length */
    +	assertEqualInt(i2(q + 28), 25); /* Extra field length */
    +	assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */
    +	q = q + 30 + strlen(folder_name);
    +	assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */
    +	assertEqualInt(i2(q + 2), 13); /* 'UT' size */
    +	assertEqualInt(q[4], 7); /* 'UT' flags */
    +	assertEqualInt(i4(q + 5), t); /* 'UT' mtime */
    +	assertEqualInt(i4(q + 9), t); /* 'UT' atime */
    +	assertEqualInt(i4(q + 13), t); /* 'UT' ctime */
    +	q = q + 17;
    +	assertEqualInt(i2(q), 0x7855); /* 'Ux' extension header */
    +	assertEqualInt(i2(q + 2), 4); /* 'Ux' size */
    +	assertEqualInt(i2(q + 4), folder_uid); /* 'Ux' UID */
    +	assertEqualInt(i2(q + 6), folder_gid); /* 'Ux' GID */
    +	q = q + 8;
    +
    +	/* There should not be any data in the folder entry,
    +	 * meaning next is the data descriptor header. */
    +
    +	/* Verify data descriptor of folder entry. */
    +	assertEqualMem(q, "PK\007\010", 4); /* Signature */
    +	assertEqualInt(i4(q + 4), crc); /* CRC-32 */
    +	assertEqualInt(i4(q + 8), 0); /* Compressed size */
    +	assertEqualInt(i4(q + 12), 0); /* Uncompressed size */
    +	q = q + 16;
    +}
    diff --git a/lib/libauditd/Makefile b/lib/libauditd/Makefile
    index 48ec4b143132..24873836394b 100644
    --- a/lib/libauditd/Makefile
    +++ b/lib/libauditd/Makefile
    @@ -17,6 +17,8 @@ SRCS=	auditd_lib.c
     #
     CFLAGS+=	-I${OPENBSMDIR} -I${LIBBSMDIR}
     
    +WARNS?=		3
    +
     NO_MAN=
     
     .include 
    diff --git a/lib/libautofs/Makefile b/lib/libautofs/Makefile
    index ea4d8cfa1768..197585699766 100644
    --- a/lib/libautofs/Makefile
    +++ b/lib/libautofs/Makefile
    @@ -3,7 +3,6 @@
     
     LIB=	autofs
     SHLIB_MAJOR= 3
    -WARNS?=	4
     
     SRCS=	libautofs.c
     INCS=	libautofs.h
    diff --git a/lib/libbegemot/Makefile b/lib/libbegemot/Makefile
    index b964e6bd6112..27baf563cff6 100644
    --- a/lib/libbegemot/Makefile
    +++ b/lib/libbegemot/Makefile
    @@ -8,8 +8,6 @@ LIB=	begemot
     SHLIB_MAJOR= 4
     SHLIBDIR?= /lib
     
    -# WARNS?=	6
    -
     CFLAGS+=	-DUSE_SELECT -DQUADFMT='"ll"'
     SRCS=	rpoll.c
     INCS=	rpoll.h
    diff --git a/lib/libbluetooth/bluetooth.3 b/lib/libbluetooth/bluetooth.3
    index c4eab90fbaa3..40ea20c45c58 100644
    --- a/lib/libbluetooth/bluetooth.3
    +++ b/lib/libbluetooth/bluetooth.3
    @@ -272,7 +272,7 @@ otherwise 0.
     .Pp
     The
     .Fn bt_devinfo
    -function populates prodivded
    +function populates provided
     .Vt bt_devinfo
     structure with the information about given Bluetooth device.
     The caller is expected to pass Bluetooth device name in the
    diff --git a/lib/libbluetooth/bluetooth.h b/lib/libbluetooth/bluetooth.h
    index 5ad3c3c553b0..a73dbe915bc1 100644
    --- a/lib/libbluetooth/bluetooth.h
    +++ b/lib/libbluetooth/bluetooth.h
    @@ -163,8 +163,8 @@ int		bt_devclose(int s);
     int		bt_devsend (int s, uint16_t opcode, void *param, size_t plen);
     ssize_t		bt_devrecv (int s, void *buf, size_t size, time_t to);
     int		bt_devreq  (int s, struct bt_devreq *r, time_t to);
    -int		bt_devfilter(int s, struct bt_devfilter const *new,
    -			     struct bt_devfilter *old);
    +int		bt_devfilter(int s, struct bt_devfilter const *newp,
    +			     struct bt_devfilter *oldp);
     void		bt_devfilter_pkt_set(struct bt_devfilter *filter, uint8_t type);
     void		bt_devfilter_pkt_clr(struct bt_devfilter *filter, uint8_t type);
     int		bt_devfilter_pkt_tst(struct bt_devfilter const *filter, uint8_t type);
    diff --git a/lib/libbsm/Makefile b/lib/libbsm/Makefile
    index 157b61ead3b8..eec2c409144f 100644
    --- a/lib/libbsm/Makefile
    +++ b/lib/libbsm/Makefile
    @@ -33,6 +33,8 @@ SRCS=	bsm_audit.c							\
     #
     CFLAGS+=	-I${OPENBSMDIR} -I${LIBBSMDIR}
     
    +WARNS?=		1
    +
     INCS=		audit_uevents.h libbsm.h
     INCSDIR=	${INCLUDEDIR}/bsm
     
    diff --git a/lib/libbz2/Makefile b/lib/libbz2/Makefile
    index 6ea018bcfa4e..b505927b4fb7 100644
    --- a/lib/libbz2/Makefile
    +++ b/lib/libbz2/Makefile
    @@ -10,4 +10,6 @@ SRCS=		bzlib.c blocksort.c compress.c crctable.c decompress.c \
     INCS=		bzlib.h
     CFLAGS+=	-I${BZ2DIR}
     
    +WARNS?=		3
    +
     .include 
    diff --git a/lib/libc/Makefile b/lib/libc/Makefile
    index 4f13f8e1f5a5..b58b6cb60429 100644
    --- a/lib/libc/Makefile
    +++ b/lib/libc/Makefile
    @@ -64,7 +64,7 @@ NOASM=
     .include "${.CURDIR}/rpc/Makefile.inc"
     .include "${.CURDIR}/uuid/Makefile.inc"
     .include "${.CURDIR}/xdr/Makefile.inc"
    -.if ${MACHINE_ARCH} == "arm"
    +.if ${MACHINE_ARCH} == "arm" || ${MACHINE_ARCH} == "mips"
     .include "${.CURDIR}/softfloat/Makefile.inc"
     .endif
     .if ${MK_NIS} != "no"
    diff --git a/lib/libc/compat-43/Makefile.inc b/lib/libc/compat-43/Makefile.inc
    index 836f0a60ca50..8505ff227873 100644
    --- a/lib/libc/compat-43/Makefile.inc
    +++ b/lib/libc/compat-43/Makefile.inc
    @@ -13,6 +13,11 @@ MAN+=	creat.2 killpg.2 sigpause.2 sigsetmask.2 sigvec.2
     MAN+=	gethostid.3 setruid.3
     
     MLINKS+=gethostid.3 sethostid.3
    +MLINKS+=sigpause.2 sighold.2
    +MLINKS+=sigpause.2 sigignore.2
    +MLINKS+=sigpause.2 sigrelse.2
    +MLINKS+=sigpause.2 sigset.2
    +MLINKS+=sigpause.2 xsi_sigpause.2
     MLINKS+=setruid.3 setrgid.3
     
     MLINKS+=sigsetmask.2 sigblock.2
    diff --git a/lib/libc/compat-43/Symbol.map b/lib/libc/compat-43/Symbol.map
    index e859a310cb0f..bd49f99e2df6 100644
    --- a/lib/libc/compat-43/Symbol.map
    +++ b/lib/libc/compat-43/Symbol.map
    @@ -17,6 +17,14 @@ FBSD_1.0 {
     	sigvec;
     };
     
    +FBSD_1.2 {
    +	sighold;
    +	sigignore;
    +	sigrelse;
    +	sigset;
    +	xsi_sigpause;
    +};
    +
     FBSDprivate_1.0 {
     	__creat;
     	_creat;
    diff --git a/lib/libc/compat-43/sigcompat.c b/lib/libc/compat-43/sigcompat.c
    index 6280183238fd..c3ba30a41f40 100644
    --- a/lib/libc/compat-43/sigcompat.c
    +++ b/lib/libc/compat-43/sigcompat.c
    @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
     #include "namespace.h"
     #include 
     #include 
    +#include 
     #include "un-namespace.h"
     #include "libc_private.h"
     
    @@ -97,8 +98,7 @@ sigblock(mask)
     }
     
     int
    -sigpause(mask)
    -	int mask;
    +sigpause(int mask)
     {
     	sigset_t set;
     
    @@ -106,3 +106,84 @@ sigpause(mask)
     	set.__bits[0] = mask;
     	return (_sigsuspend(&set));
     }
    +
    +int
    +xsi_sigpause(int sig)
    +{
    +	sigset_t set;
    +
    +	sigemptyset(&set);
    +	sigaddset(&set, sig);
    +	return (_sigsuspend(&set));
    +}
    +
    +int
    +sighold(int sig)
    +{
    +	sigset_t set;
    +
    +	sigemptyset(&set);
    +	sigaddset(&set, sig);
    +	return (_sigprocmask(SIG_BLOCK, &set, NULL));
    +}
    +
    +int
    +sigignore(int sig)
    +{
    +	struct sigaction sa;
    +
    +	bzero(&sa, sizeof(sa));
    +	sa.sa_handler = SIG_IGN;
    +	return (_sigaction(sig, &sa, NULL));
    +}
    +
    +int
    +sigrelse(int sig)
    +{
    +	sigset_t set;
    +
    +	sigemptyset(&set);
    +	sigaddset(&set, sig);
    +	return (_sigprocmask(SIG_UNBLOCK, &set, NULL));
    +}
    +
    +void
    +(*sigset(int sig, void (*disp)(int)))(int)
    +{
    +	sigset_t set, pset;
    +	struct sigaction sa, psa;
    +	int error;
    +
    +	sigemptyset(&set);
    +	sigaddset(&set, sig);
    +	error = _sigprocmask(SIG_BLOCK, NULL, &pset);
    +	if (error == -1)
    +		return (SIG_ERR);
    +	if ((__sighandler_t *)disp == SIG_HOLD) {
    +		error = _sigprocmask(SIG_BLOCK, &set, &pset);
    +		if (error == -1)
    +			return (SIG_ERR);
    +		if (sigismember(&pset, sig))
    +			return (SIG_HOLD);
    +		else {
    +			error = _sigaction(sig, NULL, &psa);
    +			if (error == -1)
    +				return (SIG_ERR);
    +			return (psa.sa_handler);
    +		}
    +	} else {
    +		error = _sigprocmask(SIG_UNBLOCK, &set, &pset);
    +		if (error == -1)
    +			return (SIG_ERR);
    +	}
    +
    +	bzero(&sa, sizeof(sa));
    +	sa.sa_handler = disp;
    +	error = _sigaction(sig, &sa, &psa);
    +	if (error == -1)
    +		return (SIG_ERR);
    +	if (sigismember(&pset, sig))
    +		return (SIG_HOLD);
    +	else
    +		return (psa.sa_handler);
    +}
    diff --git a/lib/libc/compat-43/sigpause.2 b/lib/libc/compat-43/sigpause.2
    index 39edb0b5c184..bf3cf0bef8fa 100644
    --- a/lib/libc/compat-43/sigpause.2
    +++ b/lib/libc/compat-43/sigpause.2
    @@ -28,21 +28,118 @@
     .\"     @(#)sigpause.2	8.1 (Berkeley) 6/2/93
     .\" $FreeBSD$
     .\"
    +.\" Part of the content of the man page was derived from
    +.\" The Open Group Base Specifications Issue 7
    +.\" IEEE Std 1003.1-2008
    +.\"
     .Dd June 2, 1993
     .Dt SIGPAUSE 2
     .Os
     .Sh NAME
    -.Nm sigpause
    -.Nd atomically release blocked signals and wait for interrupt
    +.Nm sighold ,
    +.Nm sigignore ,
    +.Nm sigpause ,
    +.Nm sigrelse ,
    +.Nm sigset
    +.Nd legacy interface for signal management
     .Sh LIBRARY
     .Lb libc
     .Sh SYNOPSIS
     .In signal.h
     .Ft int
    +.Fn sighold "int sig"
    +.Ft int
    +.Fn sigignore "int sig"
    +.Ft int
    +.Fn xsi_sigpause "int sigmask"
    +.Ft int
    +.Fn sigrelse "int sig"
    +.Ft void (*)(int)
    +.Fn sigset "int" "void (*disp)(int)"
    +.Ft int
     .Fn sigpause "int sigmask"
     .Sh DESCRIPTION
     .Sy This interface is made obsolete by
    -.Xr sigsuspend 2 .
    +.Xr sigsuspend 2
    +.Sy and
    +.Xr sigaction 2
    +.Pp
    +The
    +.Fn sigset
    +function modifies signal dispositions.
    +The
    +.Fa sig
    +argument specifies the signal, which may be any signal except
    +.Dv SIGKILL
    +and
    +.Dv SIGSTOP .
    +The
    +.Fa disp
    +argument specifies the signal's disposition,
    +which may be
    +.Dv SIG_DFL ,
    +.Dv SIG_IGN ,
    +or the address of a signal handler.
    +If
    +.Fn sigset
    +is used, and
    +.Fa disp
    +is the address of a signal handler, the
    +system adds
    +.Fa sig
    +to the signal mask of the calling process before executing the signal
    +handler; when the signal handler returns, the system restores the
    +signal mask of the calling process to its state prior to the delivery
    +of the signal.
    +In addition, if
    +.Fn sigset
    +is used, and
    +.Fa disp
    +is equal to
    +.Dv SIG_HOLD ,
    +.Fa sig
    +is added to the signal
    +mask of the calling process and
    +.Fa sig 's
    +disposition remains unchanged.
    +If
    +.Fn sigset
    +is used, and
    +.Fa disp
    +is not equal to
    +.Dv SIG_HOLD ,
    +.Fa sig
    +is removed from the signal mask of the calling process.
    +.Pp
    +The
    +.Fn sighold
    +function adds
    +.Fa sig
    +to the signal mask of the calling process.
    +.Pp
    +The
    +.Fn sigrelse
    +function removes
    +.Fa sig
    +from the signal mask of the calling process.
    +.Pp
    +The
    +.Fn sigignore
    +function sets the disposition of
    +.Fa sig
    +to
    +.Dv SIG_IGN .
    +.Pp
    +The
    +.Fn xsi_sigpause
    +function removes
    +.Fa sig
    +from the signal mask of the calling process and suspend the calling process
    +until a signal is received.
    +The
    +.Fn xsi_sigpause
    +function restores the signal mask of the process to its original state before
    +returning.
     .Pp
     The
     .Fn sigpause
    @@ -57,13 +154,47 @@ The
     argument
     is usually 0 to indicate that no
     signals are to be blocked.
    +.Sh RETURN VALUES
     The
     .Fn sigpause
    -function
    -always terminates by being interrupted, returning -1 with
    +and
    +.Fn xsi_sigpause
    +functions
    +always terminate by being interrupted, returning -1 with
     .Va errno
     set to
    -.Er EINTR
    +.Er EINTR .
    +.Pp
    +Upon successful completion,
    +.Fn sigset
    +returns
    +.Dv SIG_HOLD
    +if the signal had been blocked and the signal's previous disposition if
    +it had not been blocked.
    +Otherwise,
    +.Dv SIG_ERR is returned and
    +.Va errno
    +set to indicate the error.
    +.Pp
    +For all other functions, upon successful completion, 0 is returned.
    +Otherwise, -1 is returned and
    +.Va errno
    +is set to indicate the error:
    +.Bl -tag -width Er
    +.It Bq Er EINVAL
    +The
    +.Fa sig
    +argument
    +is not a valid signal number.
    +.It Bq Er EINVAL
    +For
    +.Fn sigset
    +and
    +.Fn sigignore
    +functions, an attempt was made to catch or ignore
    +.Dv SIGKILL
    +or
    +.Dv SIGSTOP .
     .Sh SEE ALSO
     .Xr kill 2 ,
     .Xr sigaction 2 ,
    @@ -85,9 +216,26 @@ and was copied from there into the
     .Pq Tn XSI
     option of
     .St -p1003.1-2001 .
    +.Fx
    +implements it under the name
    +.Fn xsi_sigpause .
    +The
    +.Fn sighold ,
    +.Fn sigignore ,
    +.Fn sigrelse
    +and
    +.Fn sigset
    +functions are implemented for compatibility with
    +.Sy System V
    +and
    +.Sy XSI
    +interfaces.
     .Sh HISTORY
     The
     .Fn sigpause
     function appeared in
     .Bx 4.2
     and has been deprecated.
    +All other functions appeared in
    +.Fx 9.0
    +and were deprecated before being implemented.
    diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
    index b06f846dd47d..2f562dae839f 100644
    --- a/lib/libc/gen/Makefile.inc
    +++ b/lib/libc/gen/Makefile.inc
    @@ -5,7 +5,8 @@
     .PATH: ${.CURDIR}/${MACHINE_ARCH}/gen ${.CURDIR}/gen
     
     SRCS+=  __getosreldate.c __xuname.c \
    -	_pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \
    +	_once_stub.c _pthread_stubs.c _rand48.c _spinlock_stub.c \
    +	_thread_init.c \
     	alarm.c arc4random.c assert.c basename.c check_utility_compat.c \
     	clock.c closedir.c confstr.c \
     	crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \
    @@ -17,21 +18,21 @@ SRCS+=  __getosreldate.c __xuname.c \
     	gethostname.c getloadavg.c getlogin.c getmntinfo.c getnetgrent.c \
     	getosreldate.c getpagesize.c getpagesizes.c \
     	getpeereid.c getprogname.c getpwent.c getttyent.c \
    -	getusershell.c getvfsbyname.c glob.c \
    +	getusershell.c getutxent.c getvfsbyname.c glob.c \
     	initgroups.c isatty.c isinf.c isnan.c jrand48.c lcong48.c \
     	lockf.c lrand48.c mrand48.c nftw.c nice.c \
     	nlist.c nrand48.c opendir.c \
    -	pause.c pmadvise.c popen.c posix_spawn.c pselect.c \
    -	psignal.c pw_scan.c pwcache.c \
    +	pause.c pmadvise.c popen.c posix_spawn.c \
    +	psignal.c pututxline.c pw_scan.c pwcache.c \
     	raise.c readdir.c readpassphrase.c rewinddir.c \
    -	scandir.c seed48.c seekdir.c sem.c semctl.c \
    +	scandir.c seed48.c seekdir.c sem.c sem_new.c semctl.c \
     	setdomainname.c sethostname.c setjmperr.c setmode.c \
     	setproctitle.c setprogname.c siginterrupt.c siglist.c signal.c \
     	sigsetops.c sleep.c srand48.c statvfs.c stringlist.c strtofflags.c \
     	sysconf.c sysctl.c sysctlbyname.c sysctlnametomib.c \
     	syslog.c telldir.c termios.c time.c times.c timezone.c tls.c \
     	ttyname.c ttyslot.c ualarm.c ulimit.c uname.c unvis.c \
    -	usleep.c utime.c valloc.c vis.c wait.c wait3.c waitpid.c \
    +	usleep.c utime.c utxdb.c valloc.c vis.c wait.c wait3.c waitpid.c \
     	wordexp.c
     
     SYM_MAPS+=${.CURDIR}/gen/Symbol.map
    @@ -53,7 +54,7 @@ MAN+=	alarm.3 arc4random.3 \
     	getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \
     	getmntinfo.3 getnetgrent.3 getosreldate.3 getpagesize.3 \
     	getpagesizes.3 getpass.3 getpeereid.3 getprogname.3 getpwent.3 \
    -	getttyent.3 getusershell.3 getvfsbyname.3 \
    +	getttyent.3 getusershell.3 getutxent.3 getvfsbyname.3 \
     	glob.3 initgroups.3 isgreater.3 ldexp.3 lockf.3 makecontext.3 \
     	modf.3 \
     	nice.3 nlist.3 pause.3 popen.3 \
    @@ -62,7 +63,7 @@ MAN+=	alarm.3 arc4random.3 \
     	posix_spawnattr_getpgroup.3 posix_spawnattr_getschedparam.3 \
     	posix_spawnattr_getschedpolicy.3 posix_spawnattr_init.3 \
     	posix_spawnattr_getsigdefault.3 posix_spawnattr_getsigmask.3 \
    -	pselect.3 psignal.3 pwcache.3 \
    +	psignal.3 pwcache.3 \
     	raise.3 rand48.3 readpassphrase.3 rfork_thread.3 \
     	scandir.3 sem_destroy.3 sem_getvalue.3 sem_init.3 \
     	sem_open.3 sem_post.3 sem_timedwait.3 sem_wait.3 \
    @@ -76,6 +77,7 @@ MAN+=	alarm.3 arc4random.3 \
     
     MLINKS+=arc4random.3 arc4random_addrandom.3 arc4random.3 arc4random_stir.3 \
     	arc4random.3 arc4random_buf.3 arc4random.3 arc4random_uniform.3
    +MLINKS+=basename.3 basename_r.3
     MLINKS+=ctermid.3 ctermid_r.3
     MLINKS+=devname.3 devname_r.3
     MLINKS+=devname.3 fdevname.3
    @@ -124,6 +126,10 @@ MLINKS+=getttyent.3 endttyent.3 getttyent.3 getttynam.3 \
     	getttyent.3 isdialuptty.3 getttyent.3 isnettty.3 \
     	getttyent.3 setttyent.3
     MLINKS+=getusershell.3 endusershell.3 getusershell.3 setusershell.3
    +MLINKS+=getutxent.3 endutxent.3 getutxent.3 getutxid.3 \
    +	getutxent.3 getutxline.3 getutxent.3 getutxuser.3 \
    +	getutxent.3 pututxline.3 getutxent.3 setutxdb.3 \
    +	getutxent.3 setutxent.3
     MLINKS+=glob.3 globfree.3
     MLINKS+=isgreater.3 isgreaterequal.3 isgreater.3 isless.3 \
     	isgreater.3 islessequal.3 isgreater.3 islessgreater.3 \
    @@ -171,7 +177,7 @@ MLINKS+=tcsetattr.3 cfgetispeed.3 tcsetattr.3 cfgetospeed.3 \
     	tcsetattr.3 cfmakeraw.3 tcsetattr.3 cfsetispeed.3 \
     	tcsetattr.3 cfsetospeed.3 tcsetattr.3 cfsetspeed.3 \
     	tcsetattr.3 tcgetattr.3
    -MLINKS+=ttyname.3 isatty.3 ttyname.3 ttyname_r.3 ttyname.3 ttyslot.3
    +MLINKS+=ttyname.3 isatty.3 ttyname.3 ttyname_r.3
     MLINKS+=tzset.3 tzsetwall.3
     MLINKS+=unvis.3 strunvis.3 unvis.3 strunvisx.3
     MLINKS+=vis.3 strvis.3 vis.3 strvisx.3
    diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map
    index 197430acdda0..42404bcc277c 100644
    --- a/lib/libc/gen/Symbol.map
    +++ b/lib/libc/gen/Symbol.map
    @@ -223,7 +223,6 @@ FBSD_1.0 {
     	posix_madvise;
     	popen;
     	pclose;
    -	pselect;
     	psignal;
     	raise;
     	readdir;
    @@ -237,16 +236,6 @@ FBSD_1.0 {
     	seekdir;
     	user_from_uid;
     	group_from_gid;
    -	sem_init;
    -	sem_destroy;
    -	sem_open;
    -	sem_close;
    -	sem_unlink;
    -	sem_wait;
    -	sem_trywait;
    -	sem_timedwait;
    -	sem_post;
    -	sem_getvalue;
     	setdomainname;
     	sethostname;
     	longjmperror;
    @@ -283,7 +272,6 @@ FBSD_1.0 {
     	openlog;
     	closelog;
     	setlogmask;
    -	ttyslot;
     	ttyname_r;
     	ttyname;
     	timezone;
    @@ -364,10 +352,31 @@ FBSD_1.1 {
     	semctl;
     	tcgetsid;
     	tcsetsid;
    +	__pthread_cleanup_pop_imp;
    +	__pthread_cleanup_push_imp;
     };
     
     FBSD_1.2 {
    +	basename_r;
    +	endutxent;
     	getpagesizes;
    +	getutxent;
    +	getutxid;
    +	getutxline;
    +	getutxuser;
    +	pututxline;
    +	sem_close;
    +	sem_destroy;
    +	sem_getvalue;
    +	sem_init;
    +	sem_open;
    +	sem_post;
    +	sem_timedwait;
    +	sem_trywait;
    +	sem_unlink;
    +	sem_wait;
    +	setutxdb;
    +	setutxent;
     };
     
     FBSDprivate_1.0 {
    @@ -453,20 +462,9 @@ FBSDprivate_1.0 {
     	__opendir2;
     	__pause;
     	_pause;
    -	__pselect;
     	__pw_scan;	/* Used by (at least) libutil */
     	__raise;
     	_raise;
    -	__sem_init;
    -	__sem_destroy;
    -	__sem_open;
    -	__sem_close;
    -	__sem_unlink;
    -	__sem_wait;
    -	__sem_trywait;
    -	__sem_timedwait;
    -	__sem_post;
    -	__sem_getvalue;
     	__sleep;
     	_sleep;
     	_rtld_allocate_tls;
    @@ -483,4 +481,15 @@ FBSDprivate_1.0 {
     	_wait;
     	__waitpid;
     	_waitpid;
    +
    +	_libc_sem_init_compat;
    +	_libc_sem_destroy_compat;
    +	_libc_sem_open_compat;
    +	_libc_sem_close_compat;
    +	_libc_sem_unlink_compat;
    +	_libc_sem_wait_compat;
    +	_libc_sem_trywait_compat;
    +	_libc_sem_timedwait_compat;
    +	_libc_sem_post_compat;
    +	_libc_sem_getvalue_compat;
     };
    diff --git a/lib/libc/gen/_once_stub.c b/lib/libc/gen/_once_stub.c
    new file mode 100644
    index 000000000000..d2acc29f32c2
    --- /dev/null
    +++ b/lib/libc/gen/_once_stub.c
    @@ -0,0 +1,64 @@
    +/*-
    + * Copyright (c) 2009 Advanced Computing Technologies LLC
    + * Written by: John H. Baldwin 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include "namespace.h"
    +#include 
    +#include "un-namespace.h"
    +#include "libc_private.h"
    +
    +/* This implements pthread_once() for the single-threaded case. */
    +static int
    +_libc_once(pthread_once_t *once_control, void (*init_routine)(void))
    +{
    +
    +	if (once_control->state == PTHREAD_DONE_INIT)
    +		return (0);
    +	init_routine();
    +	once_control->state = PTHREAD_DONE_INIT;
    +	return (0);
    +}
    +
    +/*
    + * This is the internal interface provided to libc.  It will use
    + * pthread_once() from the threading library in a multi-threaded
    + * process and _libc_once() for a single-threaded library.  Because
    + * _libc_once() uses the same ABI for the values in the pthread_once_t
    + * structure as the threading library, it is safe for a process to
    + * switch from _libc_once() to pthread_once() when threading is
    + * enabled.
    + */
    +int
    +_once(pthread_once_t *once_control, void (*init_routine)(void))
    +{
    +
    +	if (__isthreaded)
    +		return (_pthread_once(once_control, init_routine));
    +	return (_libc_once(once_control, init_routine));
    +}
    diff --git a/lib/libc/gen/_pthread_stubs.c b/lib/libc/gen/_pthread_stubs.c
    index a3e55b085ee0..044e299e75a1 100644
    --- a/lib/libc/gen/_pthread_stubs.c
    +++ b/lib/libc/gen/_pthread_stubs.c
    @@ -119,6 +119,8 @@ pthread_func_entry_t __thr_jtable[PJT_MAX] = {
     	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_SETSPECIFIC */
     	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_SIGMASK */
     	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_TESTCANCEL */
    +	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_CLEANUP_POP_IMP */
    +	{PJT_DUAL_ENTRY(stub_zero)},    /* PJT_CLEANUP_PUSH_IMP */
     };
     
     /*
    @@ -222,7 +224,7 @@ STUB_FUNC1(pthread_mutex_trylock, PJT_MUTEX_TRYLOCK, int, void *)
     STUB_FUNC1(pthread_mutex_unlock, PJT_MUTEX_UNLOCK, int, void *)
     STUB_FUNC1(pthread_mutexattr_destroy, PJT_MUTEXATTR_DESTROY, int, void *)
     STUB_FUNC1(pthread_mutexattr_init, PJT_MUTEXATTR_INIT, int, void *)
    -STUB_FUNC1(pthread_mutexattr_settype, PJT_MUTEXATTR_SETTYPE, int, void *)
    +STUB_FUNC2(pthread_mutexattr_settype, PJT_MUTEXATTR_SETTYPE, int, void *, int)
     STUB_FUNC2(pthread_once, 	PJT_ONCE, int, void *, void *)
     STUB_FUNC1(pthread_rwlock_destroy, PJT_RWLOCK_DESTROY, int, void *)
     STUB_FUNC2(pthread_rwlock_init,	PJT_RWLOCK_INIT, int, void *, void *)
    @@ -265,6 +267,8 @@ STUB_FUNC2(pthread_kill, PJT_KILL, int, void *, int)
     STUB_FUNC2(pthread_setcancelstate, PJT_SETCANCELSTATE, int, int, void *)
     STUB_FUNC2(pthread_setcanceltype, PJT_SETCANCELTYPE, int, int, void *)
     STUB_FUNC(pthread_testcancel, PJT_TESTCANCEL, void)
    +STUB_FUNC1(__pthread_cleanup_pop_imp, PJT_CLEANUP_POP_IMP, int, int)
    +STUB_FUNC2(__pthread_cleanup_push_imp, PJT_CLEANUP_PUSH_IMP, void, void*, void *);
     
     static int
     stub_zero(void)
    diff --git a/lib/libc/gen/basename.3 b/lib/libc/gen/basename.3
    index 33a0a717d910..4a3743a8634a 100644
    --- a/lib/libc/gen/basename.3
    +++ b/lib/libc/gen/basename.3
    @@ -27,7 +27,7 @@
     .\" $OpenBSD: basename.3,v 1.12 2000/04/18 03:01:25 aaron Exp $
     .\" $FreeBSD$
     .\"
    -.Dd October 12, 2006
    +.Dd October 6, 2009
     .Dt BASENAME 3
     .Os
     .Sh NAME
    @@ -37,6 +37,8 @@
     .In libgen.h
     .Ft char *
     .Fn basename "const char *path"
    +.Ft char *
    +.Fn basename_r "const char *path" "char *bname"
     .Sh DESCRIPTION
     The
     .Fn basename
    @@ -58,6 +60,12 @@ If
     is a null pointer or the empty string, a pointer to the string
     .Qq \&.
     is returned.
    +.Pp
    +The
    +.Fn basename_r
    +variation accepts a buffer of at least
    +.Dv MAXPATHLEN
    +bytes in which to store the resulting component.
     .Sh IMPLEMENTATION NOTES
     The
     .Fn basename
    @@ -65,15 +73,17 @@ function
     returns a pointer to internal storage space allocated on the first call
     that will be overwritten
     by subsequent calls.
    +.Fn basename_r
    +is therefore preferred for threaded applications.
     .Sh RETURN VALUES
     On successful completion,
     .Fn basename
    -returns a pointer to the last component of
    +and
    +.Fn basename_r
    +return pointers to the last component of
     .Fa path .
     .Pp
    -If
    -.Fn basename
    -fails, a null pointer is returned and the global variable
    +If they fail, a null pointer is returned and the global variable
     .Va errno
     is set to indicate the error.
     .Sh ERRORS
    diff --git a/lib/libc/gen/basename.c b/lib/libc/gen/basename.c
    index 9552ab348666..9588c282bcf7 100644
    --- a/lib/libc/gen/basename.c
    +++ b/lib/libc/gen/basename.c
    @@ -40,18 +40,12 @@ __FBSDID("$FreeBSD$");
     #include 
     
     char *
    -basename(path)
    +basename_r(path, bname)
     	const char *path;
    +	char *bname;
     {
    -	static char *bname = NULL;
     	const char *endp, *startp;
     
    - 	if (bname == NULL) {
    -		bname = (char *)malloc(MAXPATHLEN);
    -		if (bname == NULL)
    -			return(NULL);
    -	}
    -
     	/* Empty or NULL string gets treated as "." */
     	if (path == NULL || *path == '\0') {
     		(void)strcpy(bname, ".");
    @@ -82,3 +76,17 @@ basename(path)
     	bname[endp - startp + 1] = '\0';
     	return(bname);
     }
    +
    +char *
    +basename(path)
    +	const char *path;
    +{
    +	static char *bname = NULL;
    +
    +	if (bname == NULL) {
    +		bname = (char *)malloc(MAXPATHLEN);
    +		if (bname == NULL)
    +			return (NULL);
    +	}
    +	return (basename_r(path, bname));
    +}
    diff --git a/lib/libc/gen/devname.c b/lib/libc/gen/devname.c
    index 21e46e6b0e04..65a690fcdcc3 100644
    --- a/lib/libc/gen/devname.c
    +++ b/lib/libc/gen/devname.c
    @@ -36,10 +36,7 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     
    -#include 
    -#include 
     #include 
    -#include 
     #include 
     #include 
     #include 
    @@ -49,22 +46,22 @@ devname_r(dev_t dev, mode_t type, char *buf, int len)
     {
     	int i;
     	size_t j;
    -	char *r;
     
    -	if ((type & S_IFMT) == S_IFCHR) {
    +	if (dev == NODEV || !(S_ISCHR(type) || S_ISBLK(dev))) {
    +		strlcpy(buf, "#NODEV", len);
    +		return (buf);
    +	}
    +
    +	if (S_ISCHR(type)) {
     		j = len;
     		i = sysctlbyname("kern.devname", buf, &j, &dev, sizeof (dev));
     		if (i == 0)
    -		    return (buf);
    +			return (buf);
     	}
     
     	/* Finally just format it */
    -	if (dev == NODEV)
    -		r = "#NODEV";
    -	else 
    -		r = "#%c:%d:0x%x";
    -	snprintf(buf, len, r,
    -	    (type & S_IFMT) == S_IFCHR ? 'C' : 'B', major(dev), minor(dev));
    +	snprintf(buf, len, "#%c:%d:0x%x",
    +	    S_ISCHR(type) ? 'C' : 'B', major(dev), minor(dev));
     	return (buf);
     }
     
    @@ -73,5 +70,5 @@ devname(dev_t dev, mode_t type)
     {
     	static char buf[SPECNAMELEN + 1];
     
    -	return(devname_r(dev, type, buf, sizeof(buf)));
    +	return (devname_r(dev, type, buf, sizeof(buf)));
     }
    diff --git a/lib/libc/gen/errlst.c b/lib/libc/gen/errlst.c
    index bc3e0c98f3f4..db6bfa296854 100644
    --- a/lib/libc/gen/errlst.c
    +++ b/lib/libc/gen/errlst.c
    @@ -150,5 +150,6 @@ const char *const sys_errlist[] = {
     	"Multihop attempted",			/* 90 - EMULTIHOP */
     	"Link has been severed",		/* 91 - ENOLINK */
     	"Protocol error",			/* 92 - EPROTO */
    +	"Capabilities insufficient",		/* 93 - ENOTCAPABLE */
     };
     const int sys_nerr = sizeof(sys_errlist) / sizeof(sys_errlist[0]);
    diff --git a/lib/libc/gen/exec.c b/lib/libc/gen/exec.c
    index 985a09a4fcf7..b83136eb5102 100644
    --- a/lib/libc/gen/exec.c
    +++ b/lib/libc/gen/exec.c
    @@ -54,7 +54,7 @@ int
     execl(const char *name, const char *arg, ...)
     {
     	va_list ap;
    -	char **argv;
    +	const char **argv;
     	int n;
     
     	va_start(ap, arg);
    @@ -69,18 +69,19 @@ execl(const char *name, const char *arg, ...)
     	}
     	va_start(ap, arg);
     	n = 1;
    -	argv[0] = (char *)arg;
    +	argv[0] = arg;
     	while ((argv[n] = va_arg(ap, char *)) != NULL)
     		n++;
     	va_end(ap);
    -	return (_execve(name, argv, environ));
    +	return (_execve(name, __DECONST(char **, argv), environ));
     }
     
     int
     execle(const char *name, const char *arg, ...)
     {
     	va_list ap;
    -	char **argv, **envp;
    +	const char **argv;
    +	char **envp;
     	int n;
     
     	va_start(ap, arg);
    @@ -95,19 +96,19 @@ execle(const char *name, const char *arg, ...)
     	}
     	va_start(ap, arg);
     	n = 1;
    -	argv[0] = (char *)arg;
    +	argv[0] = arg;
     	while ((argv[n] = va_arg(ap, char *)) != NULL)
     		n++;
     	envp = va_arg(ap, char **);
     	va_end(ap);
    -	return (_execve(name, argv, envp));
    +	return (_execve(name, __DECONST(char **, argv), envp));
     }
     
     int
     execlp(const char *name, const char *arg, ...)
     {
     	va_list ap;
    -	char **argv;
    +	const char **argv;
     	int n;
     
     	va_start(ap, arg);
    @@ -122,11 +123,11 @@ execlp(const char *name, const char *arg, ...)
     	}
     	va_start(ap, arg);
     	n = 1;
    -	argv[0] = (char *)arg;
    +	argv[0] = arg;
     	while ((argv[n] = va_arg(ap, char *)) != NULL)
     		n++;
     	va_end(ap);
    -	return (execvp(name, argv));
    +	return (execvp(name, __DECONST(char **, argv)));
     }
     
     int
    @@ -145,24 +146,21 @@ execvp(const char *name, char * const *argv)
     }
     
     static int
    -execvPe(name, path, argv, envp)
    -	const char *name;
    -	const char *path;
    -	char * const *argv;
    -	char * const *envp;
    +execvPe(const char *name, const char *path, char * const *argv,
    +    char * const *envp)
     {
    -	char **memp;
    -	int cnt, lp, ln;
    -	char *p;
    +	const char **memp;
    +	size_t cnt, lp, ln;
     	int eacces, save_errno;
    -	char *bp, *cur, buf[MAXPATHLEN];
    +	char *cur, buf[MAXPATHLEN];
    +	const char *p, *bp;
     	struct stat sb;
     
     	eacces = 0;
     
     	/* If it's an absolute or relative path name, it's easy. */
     	if (index(name, '/')) {
    -		bp = (char *)name;
    +		bp = name;
     		cur = NULL;
     		goto retry;
     	}
    @@ -209,7 +207,7 @@ execvPe(name, path, argv, envp)
     		bcopy(name, buf + lp + 1, ln);
     		buf[lp + ln + 1] = '\0';
     
    -retry:		(void)_execve(bp, argv, environ);
    +retry:		(void)_execve(bp, argv, envp);
     		switch (errno) {
     		case E2BIG:
     			goto done;
    @@ -228,7 +226,8 @@ retry:		(void)_execve(bp, argv, environ);
     			memp[0] = "sh";
     			memp[1] = bp;
     			bcopy(argv + 1, memp + 2, cnt * sizeof(char *));
    -			(void)_execve(_PATH_BSHELL, memp, environ);
    + 			(void)_execve(_PATH_BSHELL,
    +			    __DECONST(char **, memp), envp);
     			goto done;
     		case ENOMEM:
     			goto done;
    diff --git a/lib/libc/gen/fdevname.c b/lib/libc/gen/fdevname.c
    index be235f78916f..d60da70d84e6 100644
    --- a/lib/libc/gen/fdevname.c
    +++ b/lib/libc/gen/fdevname.c
    @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$");
     #include "namespace.h"
     #include 
     #include 
    +#include 
     #include "un-namespace.h"
     
     char *
    diff --git a/lib/libc/gen/fmtmsg.c b/lib/libc/gen/fmtmsg.c
    index 6caabbbb884d..e6b1b960d64b 100644
    --- a/lib/libc/gen/fmtmsg.c
    +++ b/lib/libc/gen/fmtmsg.c
    @@ -128,7 +128,7 @@ printfmt(char *msgverb, long class, const char *label, int sev,
     		size += strlen(sevname);
     	if (text != MM_NULLTXT)
     		size += strlen(text);
    -	if (text != MM_NULLACT)
    +	if (act != MM_NULLACT)
     		size += strlen(act);
     	if (tag != MM_NULLTAG)
     		size += strlen(tag);
    diff --git a/lib/libc/gen/fts.3 b/lib/libc/gen/fts.3
    index 8e1a1e422690..4b051578c1e2 100644
    --- a/lib/libc/gen/fts.3
    +++ b/lib/libc/gen/fts.3
    @@ -28,7 +28,7 @@
     .\"     @(#)fts.3	8.5 (Berkeley) 4/16/94
     .\" $FreeBSD$
     .\"
    -.Dd January 26, 2008
    +.Dd November 25, 2009
     .Dt FTS 3
     .Os
     .Sh NAME
    @@ -198,10 +198,9 @@ A directory being visited in post-order.
     The contents of the
     .Vt FTSENT
     structure will be unchanged from when
    -it was returned in pre-order, i.e., with the
    +the directory was visited in pre-order, except for the
     .Fa fts_info
    -field set to
    -.Dv FTS_D .
    +field.
     .It Dv FTS_ERR
     This is an error return, and the
     .Fa fts_errno
    @@ -776,7 +775,7 @@ may fail and set
     as follows:
     .Bl -tag -width Er
     .It Bq Er EINVAL
    -The options were invalid.
    +The options were invalid, or the list were empty.
     .El
     .Sh SEE ALSO
     .Xr find 1 ,
    diff --git a/lib/libc/gen/fts.c b/lib/libc/gen/fts.c
    index 41443c5795c8..1c547a10722c 100644
    --- a/lib/libc/gen/fts.c
    +++ b/lib/libc/gen/fts.c
    @@ -124,6 +124,12 @@ fts_open(argv, options, compar)
     		return (NULL);
     	}
     
    +	/* fts_open() requires at least one path */
    +	if (*argv == NULL) {
    +		errno = EINVAL;
    +		return (NULL);
    +	}
    +
     	/* Allocate/initialize the stream. */
     	if ((priv = malloc(sizeof(*priv))) == NULL)
     		return (NULL);
    @@ -836,11 +842,8 @@ mem1:				saved_errno = errno;
     	 * If not changing directories, reset the path back to original
     	 * state.
     	 */
    -	if (ISSET(FTS_NOCHDIR)) {
    -		if (len == sp->fts_pathlen || nitems == 0)
    -			--cp;
    -		*cp = '\0';
    -	}
    +	if (ISSET(FTS_NOCHDIR))
    +		sp->fts_path[cur->fts_pathlen] = '\0';
     
     	/*
     	 * If descended after called from fts_children or after called from
    diff --git a/lib/libc/gen/getcap.c b/lib/libc/gen/getcap.c
    index 32d66d484f5f..2700d3d10313 100644
    --- a/lib/libc/gen/getcap.c
    +++ b/lib/libc/gen/getcap.c
    @@ -647,7 +647,7 @@ int
     cgetnext(char **bp, char **db_array)
     {
     	size_t len;
    -	int done, hadreaderr, i, savederrno, status;
    +	int done, hadreaderr, savederrno, status;
     	char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE];
     	u_int dummy;
     
    @@ -658,7 +658,7 @@ cgetnext(char **bp, char **db_array)
     		(void)cgetclose();
     		return (-1);
     	}
    -	for(;;) {
    +	for (;;) {
     		if (toprec && !gottoprec) {
     			gottoprec = 1;
     			line = toprec;
    @@ -709,7 +709,6 @@ cgetnext(char **bp, char **db_array)
     		/*
     		 * Line points to a name line.
     		 */
    -		i = 0;
     		done = 0;
     		np = nbuf;
     		for (;;) {
    diff --git a/lib/libc/gen/getcwd.c b/lib/libc/gen/getcwd.c
    index 0cd320853912..c886dde98feb 100644
    --- a/lib/libc/gen/getcwd.c
    +++ b/lib/libc/gen/getcwd.c
    @@ -62,13 +62,14 @@ getcwd(pt, size)
     	dev_t dev;
     	ino_t ino;
     	int first;
    -	char *bpt, *bup;
    +	char *bpt;
     	struct stat s;
     	dev_t root_dev;
     	ino_t root_ino;
    -	size_t ptsize, upsize;
    +	size_t ptsize;
     	int save_errno;
    -	char *ept, *eup, *up, c;
    +	char *ept, c;
    +	int fd;
     
     	/*
     	 * If no buffer specified by the user, allocate one as necessary.
    @@ -106,18 +107,6 @@ getcwd(pt, size)
     	bpt = ept - 1;
     	*bpt = '\0';
     
    -	/*
    -	 * Allocate 1024 bytes for the string of "../"'s.
    -	 * Should always be enough.  If it's not, allocate
    -	 * as necessary.  Special case the first stat, it's ".", not "..".
    -	 */
    -	if ((up = malloc(upsize = 1024)) == NULL)
    -		goto err;
    -	eup = up + upsize;
    -	bup = up;
    -	up[0] = '.';
    -	up[1] = '\0';
    -
     	/* Save root values, so know when to stop. */
     	if (stat("/", &s))
     		goto err;
    @@ -128,7 +117,7 @@ getcwd(pt, size)
     
     	for (first = 1;; first = 0) {
     		/* Stat the current level. */
    -		if (lstat(up, &s))
    +		if (dir != NULL ? _fstat(dirfd(dir), &s) : lstat(".", &s))
     			goto err;
     
     		/* Save current node values. */
    @@ -144,32 +133,22 @@ getcwd(pt, size)
     			 * been that way and stuff would probably break.
     			 */
     			bcopy(bpt, pt, ept - bpt);
    -			free(up);
    +			if (dir)
    +				(void) closedir(dir);
     			return (pt);
     		}
     
    -		/*
    -		 * Build pointer to the parent directory, allocating memory
    -		 * as necessary.  Max length is 3 for "../", the largest
    -		 * possible component name, plus a trailing NUL.
    -		 */
    -		while (bup + 3  + MAXNAMLEN + 1 >= eup) {
    -			if ((up = reallocf(up, upsize *= 2)) == NULL)
    -				goto err;
    -			bup = up;
    -			eup = up + upsize;
    -		}
    -		*bup++ = '.';
    -		*bup++ = '.';
    -		*bup = '\0';
    -
     		/* Open and stat parent directory. */
    -		if (!(dir = opendir(up)) || _fstat(dirfd(dir), &s))
    +		fd = _openat(dir != NULL ? dirfd(dir) : AT_FDCWD,
    +				"..", O_RDONLY);
    +		if (fd == -1)
     			goto err;
    -
    -		/* Add trailing slash for next directory. */
    -		*bup++ = '/';
    -		*bup = '\0';
    +		if (dir)
    +			(void) closedir(dir);
    +		if (!(dir = fdopendir(fd)) || _fstat(dirfd(dir), &s)) {
    +			_close(fd);
    +			goto err;
    +		}
     
     		/*
     		 * If it's a mount point, have to stat each element because
    @@ -190,10 +169,10 @@ getcwd(pt, size)
     					goto notfound;
     				if (ISDOT(dp))
     					continue;
    -				bcopy(dp->d_name, bup, dp->d_namlen + 1);
     
     				/* Save the first error for later. */
    -				if (lstat(up, &s)) {
    +				if (fstatat(dirfd(dir), dp->d_name, &s,
    +				    AT_SYMLINK_NOFOLLOW)) {
     					if (!save_errno)
     						save_errno = errno;
     					errno = 0;
    @@ -227,11 +206,6 @@ getcwd(pt, size)
     			*--bpt = '/';
     		bpt -= dp->d_namlen;
     		bcopy(dp->d_name, bpt, dp->d_namlen);
    -		(void) closedir(dir);
    -		dir = NULL;
    -
    -		/* Truncate any file name. */
    -		*bup = '\0';
     	}
     
     notfound:
    @@ -250,7 +224,6 @@ err:
     		free(pt);
     	if (dir)
     		(void) closedir(dir);
    -	free(up);
     
     	errno = save_errno;
     	return (NULL);
    diff --git a/lib/libc/gen/getlogin.c b/lib/libc/gen/getlogin.c
    index dc85d3a6952a..569cf4276ad9 100644
    --- a/lib/libc/gen/getlogin.c
    +++ b/lib/libc/gen/getlogin.c
    @@ -36,7 +36,6 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    -#include 
     #include 
     #include 
     #include 
    diff --git a/lib/libc/gen/getttyent.3 b/lib/libc/gen/getttyent.3
    index 0be79910013e..18c3f07c1aad 100644
    --- a/lib/libc/gen/getttyent.3
    +++ b/lib/libc/gen/getttyent.3
    @@ -188,7 +188,6 @@ zero otherwise.
     .El
     .Sh SEE ALSO
     .Xr login 1 ,
    -.Xr ttyslot 3 ,
     .Xr gettytab 5 ,
     .Xr termcap 5 ,
     .Xr ttys 5 ,
    diff --git a/lib/libc/gen/getttyent.c b/lib/libc/gen/getttyent.c
    index 9152626213e8..9b9e3ea1753d 100644
    --- a/lib/libc/gen/getttyent.c
    +++ b/lib/libc/gen/getttyent.c
    @@ -38,25 +38,19 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    -#include 
    -#include 
     
     static char zapchar;
     static FILE *tf;
    -static int maxpts = -1;
    -static int curpts = 0;
     static size_t lbsize;
     static char *line;
     
    -#define PTS "pts/"
     #define	MALLOCCHUNK	100
     
     static char *skip(char *);
     static char *value(char *);
     
     struct ttyent *
    -getttynam(tty)
    -	const char *tty;
    +getttynam(const char *tty)
     {
     	struct ttyent *t;
     
    @@ -71,10 +65,9 @@ getttynam(tty)
     }
     
     struct ttyent *
    -getttyent()
    +getttyent(void)
     {
     	static struct ttyent tty;
    -	static char devpts_name[] = "pts/4294967295";
     	char *p;
     	int c;
     	size_t i;
    @@ -82,19 +75,8 @@ getttyent()
     	if (!tf && !setttyent())
     		return (NULL);
     	for (;;) {
    -		if (!fgets(p = line, lbsize, tf)) {
    -			if (curpts <= maxpts) {
    -				sprintf(devpts_name, "pts/%d", curpts++);
    -				tty.ty_name = devpts_name;
    -				tty.ty_getty = tty.ty_type = NULL;
    -				tty.ty_status = TTY_NETWORK;
    -				tty.ty_window = NULL;   
    -				tty.ty_comment = NULL;
    -				tty.ty_group  = _TTYS_NOGROUP; 	
    -				return (&tty);
    -			}
    +		if (!fgets(p = line, lbsize, tf))
     			return (NULL);
    -		}
     		/* extend buffer if line was too big, and retry */
     		while (!index(p, '\n') && !feof(tf)) {
     			i = strlen(p);
    @@ -178,8 +160,7 @@ getttyent()
      * the next field.
      */
     static char *
    -skip(p)
    -	char *p;
    +skip(char *p)
     {
     	char *t;
     	int c, q;
    @@ -212,39 +193,21 @@ skip(p)
     }
     
     static char *
    -value(p)
    -	char *p;
    +value(char *p)
     {
     
     	return ((p = index(p, '=')) ? ++p : NULL);
     }
     
     int
    -setttyent()
    +setttyent(void)
     {
    -	DIR *devpts_dir;
     
     	if (line == NULL) {
     		if ((line = malloc(MALLOCCHUNK)) == NULL)
     			return (0);
     		lbsize = MALLOCCHUNK;
     	}
    -	devpts_dir = opendir(_PATH_DEV PTS);
    -	if (devpts_dir) {
    -		struct dirent *dp;
    -
    -		maxpts = -1;
    -		while ((dp = readdir(devpts_dir))) {
    -			if (strcmp(dp->d_name, ".") != 0 &&
    -			    strcmp(dp->d_name, "..") != 0) {
    -				if (atoi(dp->d_name) > maxpts) {
    -					maxpts = atoi(dp->d_name);
    -					curpts = 0;
    -				}
    -			}
    -		}
    -		closedir(devpts_dir);
    -	}
     	if (tf) {
     		rewind(tf);
     		return (1);
    @@ -254,11 +217,10 @@ setttyent()
     }
     
     int
    -endttyent()
    +endttyent(void)
     {
     	int rval;
     
    -	maxpts = -1;
     	/*
              * NB: Don't free `line' because getttynam()
     	 * may still be referencing it
    @@ -272,9 +234,7 @@ endttyent()
     }
     
     static int
    -isttystat(tty, flag)
    -	const char *tty;
    -	int flag;
    +isttystat(const char *tty, int flag)
     {
     	struct ttyent *t;
     
    @@ -283,15 +243,14 @@ isttystat(tty, flag)
     
     
     int
    -isdialuptty(tty)
    -	const char *tty;
    +isdialuptty(const char *tty)
     {
     
     	return isttystat(tty, TTY_DIALUP);
     }
     
    -int isnettty(tty)
    -	const char *tty;
    +int
    +isnettty(const char *tty)
     {
     
     	return isttystat(tty, TTY_NETWORK);
    diff --git a/lib/libc/gen/getusershell.c b/lib/libc/gen/getusershell.c
    index b0da2a1d5cdc..d09b50ca6b29 100644
    --- a/lib/libc/gen/getusershell.c
    +++ b/lib/libc/gen/getusershell.c
    @@ -124,7 +124,7 @@ _local_initshells(rv, cb_data, ap)
     	if ((fp = fopen(_PATH_SHELLS, "r")) == NULL)
     		return NS_UNAVAIL;
     
    -	sp = cp = line;
    +	cp = line;
     	while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
     		while (*cp != '#' && *cp != '/' && *cp != '\0')
     			cp++;
    diff --git a/lib/libc/gen/getutxent.3 b/lib/libc/gen/getutxent.3
    new file mode 100644
    index 000000000000..5ab21eede740
    --- /dev/null
    +++ b/lib/libc/gen/getutxent.3
    @@ -0,0 +1,462 @@
    +.\" Copyright (c) 2010 Ed Schouten 
    +.\" 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$
    +.\"
    +.Dd January 8, 2010
    +.Os
    +.Dt GETUTXENT 3
    +.Sh NAME
    +.Nm endutxent ,
    +.Nm getutxent ,
    +.Nm getutxid ,
    +.Nm getutxline ,
    +.Nm getutxuser ,
    +.Nm pututxline ,
    +.Nm setutxdb ,
    +.Nm setutxent
    +.Nd user accounting database functions
    +.Sh LIBRARY
    +.Lb libc
    +.Sh SYNOPSIS
    +.In utmpx.h
    +.Ft void
    +.Fn endutxent "void"
    +.Ft struct utmpx *
    +.Fn getutxent "void"
    +.Ft struct utmpx *
    +.Fn getutxid "const struct utmpx *id"
    +.Ft struct utmpx *
    +.Fn getutxline "const struct utmpx *line"
    +.Ft struct utmpx *
    +.Fn getutxuser "const char *user"
    +.Ft struct utmpx *
    +.Fn pututxline "const struct utmpx *utmpx"
    +.Ft int
    +.Fn setutxdb "int type" "const char *file"
    +.Ft void
    +.Fn setutxent "void"
    +.Sh DESCRIPTION
    +These functions operate on the user accounting database which stores
    +records of various system activities, such as user login and logouts,
    +but also system startups and shutdowns and modifications to the system's
    +clock.
    +The system stores these records in three databases, each having a
    +different purpose:
    +.Bl -tag -width indent
    +.It Pa /var/run/utx.active
    +Log of currently active user login sessions.
    +This file is similar to the traditional
    +.Pa utmp
    +file.
    +This file only contains process related entries, such as user login and
    +logout records.
    +.It Pa /var/log/utx.lastlogin
    +Log of last user login entries per user.
    +This file is similar to the traditional
    +.Pa lastlog
    +file.
    +This file only contains user login records for users who have at least
    +logged in once.
    +.It Pa /var/log/utx.log
    +Log of all entries, sorted by date of addition.
    +This file is similar to the traditional
    +.Pa wtmp
    +file.
    +This file may contain any type of record described below.
    +.El
    +.Pp
    +Each entry in these databases is defined by the structure
    +.Vt utmpx
    +found in the include file
    +.In utmpx.h :
    +.Bd -literal -offset indent
    +struct utmpx {
    +	short           ut_type;    /* Type of entry. */
    +	struct timeval  ut_tv;      /* Time entry was made. */
    +	char            ut_id[];    /* Record identifier. */
    +	pid_t           ut_pid;     /* Process ID. */
    +	char            ut_user[];  /* User login name. */
    +	char            ut_line[];  /* Device name. */
    +	char            ut_host[];  /* Remote hostname. */
    +};
    +.Ed
    +.Pp
    +The
    +.Fa ut_type
    +field indicates the type of the log entry, which can have one of the
    +following values:
    +.Bl -tag -width LOGIN_PROCESS
    +.It Dv EMPTY
    +No valid user accounting information.
    +.It Dv BOOT_TIME
    +Identifies time of system boot.
    +.It Dv SHUTDOWN_TIME
    +Identifies time of system shutdown.
    +.It Dv OLD_TIME
    +Identifies time when system clock changed.
    +.It Dv NEW_TIME
    +Identifies time after system clock changed.
    +.It Dv USER_PROCESS
    +Identifies a process.
    +.It Dv INIT_PROCESS
    +Identifies a process spawned by the init process.
    +.It Dv LOGIN_PROCESS
    +Identifies the session leader of a logged-in user.
    +.It Dv DEAD_PROCESS
    +Identifies a session leader who has exited.
    +.El
    +.Pp
    +Entries of type
    +.Dv INIT_PROCESS
    +and
    +.Dv LOGIN_PROCESS
    +are not processed by this implementation.
    +.Pp
    +Other fields inside the structure are:
    +.Bl -tag -width ut_user
    +.It Fa ut_tv
    +The time the event occured.
    +This field is used for all types of entries, except
    +.Dv EMPTY .
    +.It Fa ut_id
    +An identifier that is used to refer to the entry.
    +This identifier can be used to remove or replace a login entry by
    +writing a new entry to the database containing the same value for
    +.Fa ut_id .
    +This field is only applicable to entries of type
    +.Dv USER_PROCESS ,
    +.Dv INIT_PROCESS ,
    +.Dv LOGIN_PROCESS
    +and
    +.Dv DEAD_PROCESS .
    +.It Fa ut_pid
    +The process identifier of the session leader of the login session.
    +This field is only applicable to entries of type
    +.Dv USER_PROCESS ,
    +.Dv INIT_PROCESS ,
    +.Dv LOGIN_PROCESS
    +and
    +.Dv DEAD_PROCESS .
    +.It Fa ut_user
    +The user login name corresponding with the login session.
    +This field is only applicable to entries of type
    +.Dv USER_PROCESS
    +and
    +.Dv INIT_PROCESS .
    +For
    +.Dv INIT_PROCESS
    +entries this entry typically contains the name of the login process.
    +.It Fa ut_line
    +The name of the TTY character device, without the leading
    +.Pa /dev/
    +prefix, corresponding with the device used to facilitate the user login
    +session.
    +If no TTY character device is used, this field is left blank.
    +This field is only applicable to entries of type
    +.Dv USER_PROCESS 
    +and
    +.Dv LOGIN_PROCESS .
    +.It Fa ut_host
    +The network hostname of the remote system, connecting to perform a user
    +login.
    +If the user login session is not performed across a network, this field
    +is left blank.
    +This field is only applicable to entries of type
    +.Dv USER_PROCESS .
    +.El
    +.Pp
    +This implementation guarantees all inapplicable fields are discarded.
    +The
    +.Fa ut_user ,
    +.Fa ut_line
    +and
    +.Fa ut_host
    +fields of the structure returned by the library functions are also
    +guaranteed to be null-terminated in this implementation.
    +.Pp
    +The
    +.Fn getutxent
    +function can be used to read the next entry from the user accounting
    +database.
    +.Pp
    +The
    +.Fn getutxid
    +function searches for the next entry in the database of which the
    +behaviour is based on the
    +.Fa ut_type
    +field of
    +.Fa id .
    +If
    +.Fa ut_type
    +has a value of
    +.Dv BOOT_TIME ,
    +.Dv SHUTDOWN_TIME ,
    +.Dv OLD_TIME
    +or
    +.Dv NEW_TIME ,
    +it will return the next entry whose
    +.Fa ut_type
    +has an equal value.
    +If
    +.Fa ut_type
    +has a value of
    +.Dv USER_PROCESS ,
    +.Dv INIT_PROCESS ,
    +.Dv LOGIN_PROCESS
    +or
    +.Dv DEAD_PROCESS ,
    +it will return the next entry whose
    +.Fa ut_type
    +has one of the previously mentioned values and whose
    +.Fa ut_id
    +is equal.
    +.Pp
    +The
    +.Fn getutxline
    +function searches for the next entry in the database whose
    +.Fa ut_type
    +has a value of
    +.Dv USER_PROCESS
    +or
    +.Dv LOGIN_PROCESS
    +and whose
    +.Fa ut_line
    +is equal to the the same field in
    +.Fa line .
    +.Pp
    +The
    +.Fn getutxuser
    +function searches for the next entry in the database whose
    +.Fa ut_type
    +has a value of
    +.Dv USER_PROCESS
    +and whose
    +.Fa ut_user
    +is equal to
    +.Fa user .
    +.Pp
    +The previously mentioned functions will automatically try to open the
    +user accounting database if not already done so.
    +The
    +.Fn setutxdb
    +and
    +.Fn setutxent
    +functions allow the database to be opened manually, causing the offset
    +within the user accounting database to be rewound.
    +The
    +.Fn endutxent
    +function closes the database.
    +.Pp
    +The
    +.Fn setutxent
    +database always opens the active sessions database.
    +The
    +.Fn setutxdb
    +function opens the database identified by
    +.Fa type ,
    +whose value is either
    +.Dv UTXDB_ACTIVE ,
    +.Dv UTXDB_LASTLOGIN
    +or
    +.Dv UTXDB_LOG .
    +It will open a custom file with filename
    +.Fa file
    +instead of the system-default if
    +.Fa file
    +is not null.
    +Care must be taken that when using a custom filename,
    +.Fa type
    +still has to match with the actual format, since each database may use
    +its own file format.
    +.Pp
    +The
    +.Fn pututxline
    +function writes record
    +.Fa utmpx
    +to the system-default user accounting databases.
    +The value of
    +.Fa ut_type
    +determines which databases are modified.
    +.Pp
    +Entries of type
    +.Dv BOOT_TIME ,
    +.Dv SHUTDOWN_TIME ,
    +.Dv OLD_TIME
    +and
    +.Dv NEW_TIME
    +will only be written to
    +.Pa /var/log/utx.log .
    +.Pp
    +Entries of type
    +.Dv USER_PROCESS
    +will also be written to
    +.Pa /var/run/utx.active
    +and
    +.Pa /var/log/utx.lastlogin .
    +.Pp
    +Entries of type
    +.Dv DEAD_PROCESS
    +will only be written to
    +.Pa /var/log/utx.log
    +and
    +.Pa /var/run/utx.active
    +if a corresponding
    +.Dv USER_PROCESS ,
    +.Dv INIT_PROCESS
    +or
    +.Dv LOGIN_PROCESS
    +entry whose
    +.Fa ut_id
    +is equal has been found in the latter.
    +.Pp
    +In addition, entries of type
    +.Dv BOOT_TIME
    +and
    +.Dv SHUTDOWN_TIME
    +will cause all entries in
    +.Pa /var/run/utx.active
    +to be discarded.
    +.Pp
    +All entries whose type has not been mentioned previously, are discarded
    +by this implementation of
    +.Fn pututxline .
    +This implementation also ignores the value of
    +.Fa ut_tv .
    +.Sh RETURN VALUES
    +The
    +.Fn getutxent ,
    +.Fn getutxid ,
    +.Fn getutxline ,
    +and
    +.Fn getutxuser
    +functions return a pointer to an
    +.Vt utmpx
    +structure that matches the mentioned constraints on success or
    +.Dv NULL
    +when reaching the end-of-file or when an error occurs.
    +.Pp
    +The
    +.Fn pututxline
    +function returns a pointer to an
    +.Vt utmpx
    +structure containing a copy of the structure written to disk upon
    +success.
    +It returns
    +.Dv NULL
    +when the provided
    +.Vt utmpx
    +is invalid.
    +This may be because
    +.Fa ut_type
    +is invalid or
    +.Fa ut_type
    +has a value of
    +.Dv DEAD_PROCESS
    +and an entry with an identifier with a value equal to the field
    +.Fa ut_id
    +was not found.
    +.Pp
    +The
    +.Fn setutxdb
    +function returns 0 if the user accounting database was opened
    +successfully.
    +Otherwise, -1 is returned and the global variable
    +.Va errno
    +is set to indicate the error.
    +.Sh ERRORS
    +In addition to the error conditions described in
    +.Xr fopen 3 ,
    +the
    +.Fn setutxdb
    +function can generate the following errors:
    +.Bl -tag -width Er
    +.It Bq Er EINVAL
    +The
    +.Fa type
    +argument contains a value not supported by this implementation.
    +.It Bq Er EFTYPE
    +The file format is invalid.
    +.El
    +.Sh SEE ALSO
    +.Xr last 1 ,
    +.Xr write 1 ,
    +.Xr wtmpcvt 1 ,
    +.Xr getpid 2 ,
    +.Xr gettimeofday 2 ,
    +.Xr tty 4 ,
    +.Xr ac 8 ,
    +.Xr newsyslog 8
    +.Sh STANDARDS
    +The
    +.Fn endutxent ,
    +.Fn getutxent ,
    +.Fn getutxid ,
    +.Fn getutxline
    +and
    +.Fn setutxent
    +functions are expected to conform to
    +.St -p1003.1-2008 .
    +.Pp
    +The
    +.Fn pututxline
    +function deviates from the standard by writing its records to multiple
    +database files, depending on its
    +.Fa ut_type .
    +This prevents the need for special utility functions to update the other
    +databases, such as the
    +.Fn updlastlogx
    +and
    +.Fn updwtmpx
    +functions which are available in other implementations.
    +It also tries to replace
    +.Dv DEAD_PROCESS
    +entries in the active sessions database when storing
    +.Dv USER_PROCESS
    +entries and no entry with the same value for
    +.Fa ut_id
    +has been found.
    +The standard always requires a new entry to be allocated, which could
    +cause an unbounded growth of the database.
    +.Pp
    +The
    +.Fn getutxuser
    +and
    +.Fn setutxdb
    +functions,
    +the
    +.Fa ut_host
    +field of the
    +.Vt utmpx
    +structure and
    +.Dv SHUTDOWN_TIME
    +are extensions.
    +.Sh HISTORY
    +These functions appeared in
    +.Fx 9.0 .
    +They replaced the 
    +.In utmp.h
    +interface.
    +.Sh AUTHORS
    +.An Ed Schouten Aq ed@FreeBSD.org
    diff --git a/lib/libc/gen/getutxent.c b/lib/libc/gen/getutxent.c
    new file mode 100644
    index 000000000000..654a634eb5ca
    --- /dev/null
    +++ b/lib/libc/gen/getutxent.c
    @@ -0,0 +1,223 @@
    +/*-
    + * Copyright (c) 2010 Ed Schouten 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include "namespace.h"
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include "utxdb.h"
    +#include "un-namespace.h"
    +
    +static FILE *uf = NULL;
    +static int udb;
    +
    +int
    +setutxdb(int db, const char *file)
    +{
    +	struct stat sb;
    +
    +	switch (db) {
    +	case UTXDB_ACTIVE:
    +		if (file == NULL)
    +			file = _PATH_UTX_ACTIVE;
    +		break;
    +	case UTXDB_LASTLOGIN:
    +		if (file == NULL)
    +			file = _PATH_UTX_LASTLOGIN;
    +		break;
    +	case UTXDB_LOG:
    +		if (file == NULL)
    +			file = _PATH_UTX_LOG;
    +		break;
    +	default:
    +		errno = EINVAL;
    +		return (-1);
    +	}
    +
    +	if (uf != NULL)
    +		fclose(uf);
    +	uf = fopen(file, "r");
    +	if (uf == NULL)
    +		return (-1);
    +
    +	/* Safety check: never use broken files. */
    +	if (db != UTXDB_LOG && _fstat(fileno(uf), &sb) != -1 &&
    +	    sb.st_size % sizeof(struct futx) != 0) {
    +		fclose(uf);
    +		uf = NULL;
    +		errno = EFTYPE;
    +		return (-1);
    +	}
    +
    +	udb = db;
    +	return (0);
    +}
    +
    +void
    +setutxent(void)
    +{
    +
    +	setutxdb(UTXDB_ACTIVE, NULL);
    +}
    +
    +void
    +endutxent(void)
    +{
    +
    +	if (uf != NULL) {
    +		fclose(uf);
    +		uf = NULL;
    +	}
    +}
    +
    +static int
    +getfutxent(struct futx *fu)
    +{
    +
    +	if (uf == NULL)
    +		setutxent();
    +	if (uf == NULL)
    +		return (-1);
    +
    +	if (udb == UTXDB_LOG) {
    +		uint16_t len;
    +
    +		if (fread(&len, sizeof len, 1, uf) != 1)
    +			return (-1);
    +		len = be16toh(len);
    +		if (len > sizeof *fu) {
    +			/* Forward compatibility. */
    +			if (fread(fu, sizeof *fu, 1, uf) != 1)
    +				return (-1);
    +			fseek(uf, len - sizeof *fu, SEEK_CUR);
    +		} else {
    +			/* Partial record. */
    +			memset(fu, 0, sizeof *fu);
    +			if (fread(fu, len, 1, uf) != 1)
    +				return (-1);
    +		}
    +	} else {
    +		if (fread(fu, sizeof *fu, 1, uf) != 1)
    +			return (-1);
    +	}
    +	return (0);
    +}
    +
    +struct utmpx *
    +getutxent(void)
    +{
    +	struct futx fu;
    +
    +	if (getfutxent(&fu) != 0)
    +		return (NULL);
    +	return (futx_to_utx(&fu));
    +}
    +
    +struct utmpx *
    +getutxid(const struct utmpx *id)
    +{
    +	struct futx fu;
    +
    +	for (;;) {
    +		if (getfutxent(&fu) != 0)
    +			return (NULL);
    +
    +		switch (fu.fu_type) {
    +		case USER_PROCESS:
    +		case INIT_PROCESS:
    +		case LOGIN_PROCESS:
    +		case DEAD_PROCESS:
    +			switch (id->ut_type) {
    +			case USER_PROCESS:
    +			case INIT_PROCESS:
    +			case LOGIN_PROCESS:
    +			case DEAD_PROCESS:
    +				if (memcmp(fu.fu_id, id->ut_id,
    +				    MIN(sizeof fu.fu_id, sizeof id->ut_id)) == 0)
    +					goto found;
    +			}
    +			break;
    +		default:
    +			if (fu.fu_type == id->ut_type)
    +				goto found;
    +			break;
    +		}
    +	}
    +
    +found:
    +	return (futx_to_utx(&fu));
    +}
    +
    +struct utmpx *
    +getutxline(const struct utmpx *line)
    +{
    +	struct futx fu;
    +
    +	for (;;) {
    +		if (getfutxent(&fu) != 0)
    +			return (NULL);
    +
    +		switch (fu.fu_type) {
    +		case USER_PROCESS:
    +		case LOGIN_PROCESS:
    +			if (strncmp(fu.fu_line, line->ut_line,
    +			    MIN(sizeof fu.fu_line, sizeof line->ut_line)) == 0)
    +				goto found;
    +			break;
    +		}
    +	}
    +
    +found:
    +	return (futx_to_utx(&fu));
    +}
    +
    +struct utmpx *
    +getutxuser(const char *user)
    +{
    +	struct futx fu;
    +
    +	for (;;) {
    +		if (getfutxent(&fu) != 0)
    +			return (NULL);
    +
    +		switch (fu.fu_type) {
    +		case USER_PROCESS:
    +			if (strncmp(fu.fu_user, user, sizeof fu.fu_user) == 0)
    +				goto found;
    +			break;
    +		}
    +	}
    +
    +found:
    +	return (futx_to_utx(&fu));
    +}
    diff --git a/lib/libc/gen/nlist.c b/lib/libc/gen/nlist.c
    index 690e0b0a7c0c..1361af3366c9 100644
    --- a/lib/libc/gen/nlist.c
    +++ b/lib/libc/gen/nlist.c
    @@ -209,8 +209,7 @@ static void elf_sym_to_nlist(struct nlist *, Elf_Sym *, Elf_Shdr *, int);
      * as such its use should be restricted.
      */
     int
    -__elf_is_okay__(ehdr)
    -	Elf_Ehdr *ehdr;
    +__elf_is_okay__(Elf_Ehdr *ehdr)
     {
     	int retval = 0;
     	/*
    diff --git a/lib/libc/gen/opendir.c b/lib/libc/gen/opendir.c
    index 9625ec690941..b312c89d76a7 100644
    --- a/lib/libc/gen/opendir.c
    +++ b/lib/libc/gen/opendir.c
    @@ -92,6 +92,14 @@ __opendir2(const char *name, int flags)
     	return __opendir_common(fd, name, flags);
     }
     
    +static int
    +opendir_compar(const void *p1, const void *p2)
    +{
    +
    +	return (strcmp((*(const struct dirent **)p1)->d_name,
    +	    (*(const struct dirent **)p2)->d_name));
    +}
    +
     /*
      * Common routine for opendir(3), __opendir2(3) and fdopendir(3).
      */
    @@ -240,7 +248,8 @@ __opendir_common(int fd, const char *name, int flags)
     				/*
     				 * This sort must be stable.
     				 */
    -				mergesort(dpv, n, sizeof(*dpv), alphasort);
    +				mergesort(dpv, n, sizeof(*dpv),
    +				    opendir_compar);
     
     				dpv[n] = NULL;
     				xp = NULL;
    diff --git a/lib/libc/gen/pause.c b/lib/libc/gen/pause.c
    index 86d3643435d3..51706cf947e8 100644
    --- a/lib/libc/gen/pause.c
    +++ b/lib/libc/gen/pause.c
    @@ -33,16 +33,22 @@ static char sccsid[] = "@(#)pause.c	8.1 (Berkeley) 6/4/93";
     #include 
     __FBSDID("$FreeBSD$");
     
    +#include "namespace.h"
     #include 
     #include 
    +#include "un-namespace.h"
     
     /*
      * Backwards compatible pause.
      */
     int
    -__pause()
    +__pause(void)
     {
    -	return sigpause(sigblock(0L));
    +	sigset_t oset;
    +
    +	if (_sigprocmask(SIG_BLOCK, NULL, &oset) == -1)
    +		return (-1);
    +	return (_sigsuspend(&oset));
     }
     __weak_reference(__pause, pause);
     __weak_reference(__pause, _pause);
    diff --git a/lib/libc/gen/posix_spawn.3 b/lib/libc/gen/posix_spawn.3
    index 518be2e2d751..756923986ff6 100644
    --- a/lib/libc/gen/posix_spawn.3
    +++ b/lib/libc/gen/posix_spawn.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWN 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawn_file_actions_addopen.3 b/lib/libc/gen/posix_spawn_file_actions_addopen.3
    index b1fc2595cc7a..c6fd017f22d1 100644
    --- a/lib/libc/gen/posix_spawn_file_actions_addopen.3
    +++ b/lib/libc/gen/posix_spawn_file_actions_addopen.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWN_FILE_ACTIONS_ADDOPEN 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawn_file_actions_init.3 b/lib/libc/gen/posix_spawn_file_actions_init.3
    index 31b677e0976d..d826b8bf4458 100644
    --- a/lib/libc/gen/posix_spawn_file_actions_init.3
    +++ b/lib/libc/gen/posix_spawn_file_actions_init.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWN_FILE_ACTIONS_INIT 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawnattr_getflags.3 b/lib/libc/gen/posix_spawnattr_getflags.3
    index c3f9ee547f14..a2dda02c128b 100644
    --- a/lib/libc/gen/posix_spawnattr_getflags.3
    +++ b/lib/libc/gen/posix_spawnattr_getflags.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWNATTR_GETFLAGS 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawnattr_getpgroup.3 b/lib/libc/gen/posix_spawnattr_getpgroup.3
    index 8ba8142037f4..5cd51d687ab7 100644
    --- a/lib/libc/gen/posix_spawnattr_getpgroup.3
    +++ b/lib/libc/gen/posix_spawnattr_getpgroup.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWNATTR_GETPGROUP 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawnattr_getschedparam.3 b/lib/libc/gen/posix_spawnattr_getschedparam.3
    index 59cece893c04..70009b9b4090 100644
    --- a/lib/libc/gen/posix_spawnattr_getschedparam.3
    +++ b/lib/libc/gen/posix_spawnattr_getschedparam.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWNATTR_GETSCHEDPARAM 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawnattr_getschedpolicy.3 b/lib/libc/gen/posix_spawnattr_getschedpolicy.3
    index 158923a0634d..45c1965408b6 100644
    --- a/lib/libc/gen/posix_spawnattr_getschedpolicy.3
    +++ b/lib/libc/gen/posix_spawnattr_getschedpolicy.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWNATTR_GETSCHEDPOLICY 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawnattr_getsigdefault.3 b/lib/libc/gen/posix_spawnattr_getsigdefault.3
    index f37992a594f2..9e13c3742cf7 100644
    --- a/lib/libc/gen/posix_spawnattr_getsigdefault.3
    +++ b/lib/libc/gen/posix_spawnattr_getsigdefault.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWNATTR_GETSIGDEFAULT 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawnattr_getsigmask.3 b/lib/libc/gen/posix_spawnattr_getsigmask.3
    index 44b5c1761207..5cee7ec6853e 100644
    --- a/lib/libc/gen/posix_spawnattr_getsigmask.3
    +++ b/lib/libc/gen/posix_spawnattr_getsigmask.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWNATTR_GETSIGMASK 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/posix_spawnattr_init.3 b/lib/libc/gen/posix_spawnattr_init.3
    index 7eddc750acc8..66c99cd5afa8 100644
    --- a/lib/libc/gen/posix_spawnattr_init.3
    +++ b/lib/libc/gen/posix_spawnattr_init.3
    @@ -34,7 +34,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd Mar 24, 2008
    +.Dd March 24, 2008
     .Dt POSIX_SPAWNATTR_INIT 3
     .Os
     .Sh NAME
    diff --git a/lib/libc/gen/pselect.c b/lib/libc/gen/pselect.c
    deleted file mode 100644
    index 28066a204aa4..000000000000
    --- a/lib/libc/gen/pselect.c
    +++ /dev/null
    @@ -1,78 +0,0 @@
    -/*
    - * Copyright 2000 Massachusetts Institute of Technology
    - *
    - * Permission to use, copy, modify, and distribute this software and
    - * its documentation for any purpose and without fee is hereby
    - * granted, provided that both the above copyright notice and this
    - * permission notice appear in all copies, that both the above
    - * copyright notice and this permission notice appear in all
    - * supporting documentation, and that the name of M.I.T. not be used
    - * in advertising or publicity pertaining to distribution of the
    - * software without specific, written prior permission.  M.I.T. makes
    - * no representations about the suitability of this software for any
    - * purpose.  It is provided "as is" without express or implied
    - * warranty.
    - *
    - * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
    - * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
    - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
    - * SHALL M.I.T. 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 
    -__FBSDID("$FreeBSD$");
    -
    -#include "namespace.h"
    -#include 
    -#include 
    -
    -#include 
    -#include 
    -#include "un-namespace.h"
    -
    -__weak_reference(__pselect, pselect);
    -
    -/*
    - * Emulate the POSIX 1003.1g-2000 `pselect' interface.  This is the
    - * same as the traditional BSD `select' function, except that it uses
    - * a timespec rather than a timeval, doesn't modify the timeout argument,
    - * and allows the user to specify a signal mask to apply during the select.
    - */
    -int
    -__pselect(int count, fd_set * __restrict rfds, fd_set * __restrict wfds, 
    -	fd_set * __restrict efds, const struct timespec * __restrict timo, 
    -	const sigset_t * __restrict mask)
    -{
    -	sigset_t omask;
    -	struct timeval tvtimo, *tvp;
    -	int rv, sverrno;
    -
    -	if (timo) {
    -		TIMESPEC_TO_TIMEVAL(&tvtimo, timo);
    -		tvp = &tvtimo;
    -	} else
    -		tvp = 0;
    -
    -	if (mask != 0) {
    -		rv = _sigprocmask(SIG_SETMASK, mask, &omask);
    -		if (rv != 0)
    -			return rv;
    -	}
    -
    -	rv = _select(count, rfds, wfds, efds, tvp);
    -	if (mask != 0) {
    -		sverrno = errno;
    -		_sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
    -		errno = sverrno;
    -	}
    -
    -	return rv;
    -}
    diff --git a/lib/libc/gen/pututxline.c b/lib/libc/gen/pututxline.c
    new file mode 100644
    index 000000000000..ce4dc280c3ce
    --- /dev/null
    +++ b/lib/libc/gen/pututxline.c
    @@ -0,0 +1,263 @@
    +/*-
    + * Copyright (c) 2010 Ed Schouten 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include "namespace.h"
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include "utxdb.h"
    +#include "un-namespace.h"
    +
    +static FILE *
    +futx_open(const char *file)
    +{
    +	int fd;
    +	FILE *fp;
    +	struct stat sb;
    +
    +	fd = _open(file, O_CREAT|O_RDWR|O_EXLOCK, 0644);
    +	if (fd < 0)
    +		return (NULL);
    +
    +	/* Safety check: never use broken files. */
    +	if (_fstat(fd, &sb) != -1 && sb.st_size % sizeof(struct futx) != 0) {
    +		_close(fd);
    +		return (NULL);
    +	}
    +	
    +	fp = fdopen(fd, "r+");
    +	if (fp == NULL) {
    +		_close(fd);
    +		return (NULL);
    +	}
    +
    +	return (fp);
    +}
    +
    +static void
    +utx_active_add(const struct futx *fu)
    +{
    +	FILE *fp;
    +	struct futx fe;
    +	off_t partial = -1;
    +
    +	/*
    +	 * Register user login sessions.  Overwrite entries of sessions
    +	 * that have already been terminated.
    +	 */
    +	fp = futx_open(_PATH_UTX_ACTIVE);
    +	if (fp == NULL)
    +		return;
    +	while (fread(&fe, sizeof fe, 1, fp) == 1) {
    +		switch (fe.fu_type) {
    +		case USER_PROCESS:
    +		case INIT_PROCESS:
    +		case LOGIN_PROCESS:
    +		case DEAD_PROCESS:
    +			/* Overwrite when ut_id matches. */
    +			if (memcmp(fu->fu_id, fe.fu_id, sizeof fe.fu_id) == 0) {
    +				fseeko(fp, -(off_t)sizeof fe, SEEK_CUR);
    +				goto exact;
    +			}
    +			if (fe.fu_type != DEAD_PROCESS)
    +				break;
    +			/* FALLTHROUGH */
    +		default:
    +			/* Allow us to overwrite unused records. */
    +			if (partial == -1)
    +				partial = ftello(fp) - (off_t)sizeof fe;
    +			break;
    +		}
    +	}
    +	
    +	/*
    +	 * No exact match found.  Use the partial match.  If no partial
    +	 * match was found, just append a new record.
    +	 */
    +	if (partial != -1)
    +		fseeko(fp, partial, SEEK_SET);
    +exact:
    +	fwrite(fu, sizeof *fu, 1, fp);
    +	fclose(fp);
    +}
    +
    +static int
    +utx_active_remove(struct futx *fu)
    +{
    +	FILE *fp;
    +	struct futx fe;
    +
    +	/*
    +	 * Remove user login sessions, having the same ut_id.
    +	 */
    +	fp = futx_open(_PATH_UTX_ACTIVE);
    +	if (fp == NULL)
    +		return (0);
    +	while (fread(&fe, sizeof fe, 1, fp) == 1) {
    +		switch (fe.fu_type) {
    +		case USER_PROCESS:
    +		case INIT_PROCESS:
    +		case LOGIN_PROCESS:
    +			if (memcmp(fu->fu_id, fe.fu_id, sizeof fe.fu_id) != 0)
    +				continue;
    +
    +			/* Terminate session. */
    +			fseeko(fp, -(off_t)sizeof fe, SEEK_CUR);
    +			fwrite(fu, sizeof *fu, 1, fp);
    +			fclose(fp);
    +			return (0);
    +		}
    +	}
    +
    +	fclose(fp);
    +	return (1);
    +}
    +
    +static void
    +utx_active_purge(void)
    +{
    +
    +	truncate(_PATH_UTX_ACTIVE, 0);
    +}
    +
    +static void
    +utx_lastlogin_add(const struct futx *fu)
    +{
    +	FILE *fp;
    +	struct futx fe;
    +
    +	/*
    +	 * Write an entry to lastlogin.  Overwrite the entry if the
    +	 * current user already has an entry.  If not, append a new
    +	 * entry.
    +	 */
    +	fp = futx_open(_PATH_UTX_LASTLOGIN);
    +	if (fp == NULL)
    +		return;
    +	while (fread(&fe, sizeof fe, 1, fp) == 1) {
    +		if (strncmp(fu->fu_user, fe.fu_user, sizeof fe.fu_user) != 0)
    +			continue;
    +		
    +		/* Found a previous lastlogin entry for this user. */
    +		fseeko(fp, -(off_t)sizeof fe, SEEK_CUR);
    +		break;
    +	}
    +	fwrite(fu, sizeof *fu, 1, fp);
    +	fclose(fp);
    +}
    +
    +static void
    +utx_lastlogin_upgrade(void)
    +{
    +	int fd;
    +	struct stat sb;
    +
    +	fd = _open(_PATH_UTX_LASTLOGIN, O_RDWR, 0644);
    +	if (fd < 0)
    +		return;
    +
    +	/*
    +	 * Truncate broken lastlogin files.  In the future we should
    +	 * check for older versions of the file format here and try to
    +	 * upgrade it.
    +	 */
    +	if (_fstat(fd, &sb) != -1 && sb.st_size % sizeof(struct futx) != 0)
    +		ftruncate(fd, 0);
    +	_close(fd);
    +}
    +
    +static void
    +utx_log_add(const struct futx *fu)
    +{
    +	int fd;
    +	uint16_t l;
    +	struct iovec vec[2];
    +
    +	/*
    +	 * Append an entry to the log file.  We only need to append
    +	 * records to this file, so to conserve space, trim any trailing
    +	 * zero-bytes.  Prepend a length field, indicating the length of
    +	 * the record, excluding the length field itself.
    +	 */
    +	for (l = sizeof *fu; l > 0 && ((const char *)fu)[l - 1] == '\0'; l--);
    +	vec[0].iov_base = &l;
    +	vec[0].iov_len = sizeof l;
    +	vec[1].iov_base = __DECONST(void *, fu);
    +	vec[1].iov_len = l;
    +	l = htobe16(l);
    +
    +	fd = _open(_PATH_UTX_LOG, O_CREAT|O_WRONLY|O_APPEND, 0644);
    +	if (fd < 0)
    +		return;
    +	_writev(fd, vec, 2);
    +	_close(fd);
    +}
    +
    +struct utmpx *
    +pututxline(const struct utmpx *utmpx)
    +{
    +	struct futx fu;
    +
    +	utx_to_futx(utmpx, &fu);
    +	
    +	switch (fu.fu_type) {
    +	case BOOT_TIME:
    +	case SHUTDOWN_TIME:
    +		utx_active_purge();
    +		utx_lastlogin_upgrade();
    +		break;
    +	case OLD_TIME:
    +	case NEW_TIME:
    +		break;
    +	case USER_PROCESS:
    +		utx_active_add(&fu);
    +		utx_lastlogin_add(&fu);
    +		break;
    +#if 0 /* XXX: Are these records of any use to us? */
    +	case INIT_PROCESS:
    +	case LOGIN_PROCESS:
    +		utx_active_add(&fu);
    +		break;
    +#endif
    +	case DEAD_PROCESS:
    +		if (utx_active_remove(&fu) != 0)
    +			return (NULL);
    +		break;
    +	default:
    +		return (NULL);
    +	}
    +
    +	utx_log_add(&fu);
    +	return (futx_to_utx(&fu));
    +}
    diff --git a/lib/libc/gen/pwcache.c b/lib/libc/gen/pwcache.c
    index 501d6ba9cd73..a8a73f16cd85 100644
    --- a/lib/libc/gen/pwcache.c
    +++ b/lib/libc/gen/pwcache.c
    @@ -33,13 +33,13 @@ static char sccsid[] = "@(#)pwcache.c	8.1 (Berkeley) 6/4/93";
     #include 
     __FBSDID("$FreeBSD$");
     
    +#include 
     #include 
     
     #include 
     #include 
     #include 
     #include 
    -#include 
     
     #define	NCACHE	64			/* power of 2 */
     #define	MASK	(NCACHE - 1)		/* bits to store with */
    @@ -50,7 +50,7 @@ user_from_uid(uid_t uid, int nouser)
     	static struct ncache {
     		uid_t	uid;
     		int	found;
    -		char	name[UT_NAMESIZE + 1];
    +		char	name[MAXLOGNAME];
     	} c_uid[NCACHE];
     	static int pwopen;
     	struct passwd *pw;
    @@ -66,11 +66,11 @@ user_from_uid(uid_t uid, int nouser)
     		cp->uid = uid;
     		if (pw != NULL) {
     			cp->found = 1;
    -			(void)strncpy(cp->name, pw->pw_name, UT_NAMESIZE);
    -			cp->name[UT_NAMESIZE] = '\0';
    +			(void)strncpy(cp->name, pw->pw_name, MAXLOGNAME - 1);
    +			cp->name[MAXLOGNAME - 1] = '\0';
     		} else {
     			cp->found = 0;
    -			(void)snprintf(cp->name, UT_NAMESIZE, "%u", uid);
    +			(void)snprintf(cp->name, MAXLOGNAME - 1, "%u", uid);
     			if (nouser)
     				return (NULL);
     		}
    @@ -84,7 +84,7 @@ group_from_gid(gid_t gid, int nogroup)
     	static struct ncache {
     		gid_t	gid;
     		int	found;
    -		char	name[UT_NAMESIZE + 1];
    +		char	name[MAXLOGNAME];
     	} c_gid[NCACHE];
     	static int gropen;
     	struct group *gr;
    @@ -100,11 +100,11 @@ group_from_gid(gid_t gid, int nogroup)
     		cp->gid = gid;
     		if (gr != NULL) {
     			cp->found = 1;
    -			(void)strncpy(cp->name, gr->gr_name, UT_NAMESIZE);
    -			cp->name[UT_NAMESIZE] = '\0';
    +			(void)strncpy(cp->name, gr->gr_name, MAXLOGNAME - 1);
    +			cp->name[MAXLOGNAME - 1] = '\0';
     		} else {
     			cp->found = 0;
    -			(void)snprintf(cp->name, UT_NAMESIZE, "%u", gid);
    +			(void)snprintf(cp->name, MAXLOGNAME - 1, "%u", gid);
     			if (nogroup)
     				return (NULL);
     		}
    diff --git a/lib/libc/gen/raise.c b/lib/libc/gen/raise.c
    index 12bd31fc7f13..b3d0aaed3ed2 100644
    --- a/lib/libc/gen/raise.c
    +++ b/lib/libc/gen/raise.c
    @@ -40,8 +40,7 @@ __weak_reference(__raise, raise);
     __weak_reference(__raise, _raise);
     
     int
    -__raise(s)
    -	int s;
    +__raise(int s)
     {
     	return(kill(getpid(), s));
     }
    diff --git a/lib/libc/gen/rand48.3 b/lib/libc/gen/rand48.3
    index a703ba08813f..8d325a1bff1a 100644
    --- a/lib/libc/gen/rand48.3
    +++ b/lib/libc/gen/rand48.3
    @@ -12,7 +12,7 @@
     .\"     @(#)rand48.3 V1.0 MB 8 Oct 1993
     .\" $FreeBSD$
     .\"
    -.Dd October 8, 1993
    +.Dd February 2, 2010
     .Dt RAND48 3
     .Os
     .Sh NAME
    @@ -57,7 +57,7 @@ The
     particular formula employed is
     r(n+1) = (a * r(n) + c) mod m
     where the default values are
    -for the multiplicand a = 0xfdeece66d = 25214903917 and
    +for the multiplicand a = 0x5deece66d = 25214903917 and
     the addend c = 0xb = 11.
     The modulo is always fixed at m = 2 ** 48.
     r(n) is called the seed of the random number generator.
    diff --git a/lib/libc/gen/scandir.3 b/lib/libc/gen/scandir.3
    index 42ccac2465ca..e32b0d819e8c 100644
    --- a/lib/libc/gen/scandir.3
    +++ b/lib/libc/gen/scandir.3
    @@ -28,7 +28,7 @@
     .\"     @(#)scandir.3	8.1 (Berkeley) 6/4/93
     .\" $FreeBSD$
     .\"
    -.Dd June 4, 1993
    +.Dd January 3, 2010
     .Dt SCANDIR 3
     .Os
     .Sh NAME
    @@ -38,12 +38,11 @@
     .Sh LIBRARY
     .Lb libc
     .Sh SYNOPSIS
    -.In sys/types.h
     .In dirent.h
     .Ft int
    -.Fn scandir "const char *dirname" "struct dirent ***namelist" "int \\*(lp*select\\*(rp\\*(lpstruct dirent *\\*(rp" "int \\*(lp*compar\\*(rp\\*(lpconst void *, const void *\\*(rp"
    +.Fn scandir "const char *dirname" "struct dirent ***namelist" "int \\*(lp*select\\*(rp\\*(lpconst struct dirent *\\*(rp" "int \\*(lp*compar\\*(rp\\*(lpconst struct dirent **, const struct dirent **\\*(rp"
     .Ft int
    -.Fn alphasort "const void *d1" "const void *d2"
    +.Fn alphasort "const struct dirent **d1" "const struct dirent **d2"
     .Sh DESCRIPTION
     The
     .Fn scandir
    @@ -82,7 +81,8 @@ The
     function
     is a routine which can be used for the
     .Fa compar
    -argument to sort the array alphabetically.
    +argument to sort the array alphabetically using
    +.Xr strcoll 3 .
     .Pp
     The memory allocated for the array can be deallocated with
     .Xr free 3 ,
    @@ -95,7 +95,8 @@ cannot allocate enough memory to hold all the data structures.
     .Xr directory 3 ,
     .Xr malloc 3 ,
     .Xr qsort 3 ,
    -.Xr dir 5
    +.Xr dir 5 ,
    +.Xr strcoll 3
     .Sh HISTORY
     The
     .Fn scandir
    diff --git a/lib/libc/gen/scandir.c b/lib/libc/gen/scandir.c
    index 1dae85d12a9c..93bc8523c90d 100644
    --- a/lib/libc/gen/scandir.c
    +++ b/lib/libc/gen/scandir.c
    @@ -46,6 +46,8 @@ __FBSDID("$FreeBSD$");
     #include 
     #include "un-namespace.h"
     
    +static int alphasort_thunk(void *thunk, const void *p1, const void *p2);
    +
     /*
      * The DIRSIZ macro is the minimum record length which will hold the directory
      * entry.  This requires the amount of space in struct dirent without the
    @@ -58,11 +60,9 @@ __FBSDID("$FreeBSD$");
     	    (((dp)->d_namlen + 1 + 3) &~ 3))
     
     int
    -scandir(dirname, namelist, select, dcomp)
    -	const char *dirname;
    -	struct dirent ***namelist;
    -	int (*select)(struct dirent *);
    -	int (*dcomp)(const void *, const void *);
    +scandir(const char *dirname, struct dirent ***namelist,
    +    int (*select)(const struct dirent *), int (*dcomp)(const struct dirent **,
    +	const struct dirent **))
     {
     	struct dirent *d, *p, **names = NULL;
     	size_t nitems = 0;
    @@ -111,26 +111,35 @@ scandir(dirname, namelist, select, dcomp)
     	}
     	closedir(dirp);
     	if (nitems && dcomp != NULL)
    -		qsort(names, nitems, sizeof(struct dirent *), dcomp);
    +		qsort_r(names, nitems, sizeof(struct dirent *),
    +		    &dcomp, alphasort_thunk);
     	*namelist = names;
    -	return(nitems);
    +	return (nitems);
     
     fail:
     	while (nitems > 0)
     		free(names[--nitems]);
     	free(names);
     	closedir(dirp);
    -	return -1;
    +	return (-1);
     }
     
     /*
      * Alphabetic order comparison routine for those who want it.
    + * POSIX 2008 requires that alphasort() uses strcoll().
      */
     int
    -alphasort(d1, d2)
    -	const void *d1;
    -	const void *d2;
    +alphasort(const struct dirent **d1, const struct dirent **d2)
     {
    -	return(strcmp((*(struct dirent **)d1)->d_name,
    -	    (*(struct dirent **)d2)->d_name));
    +
    +	return (strcoll((*d1)->d_name, (*d2)->d_name));
    +}
    +
    +static int
    +alphasort_thunk(void *thunk, const void *p1, const void *p2)
    +{
    +	int (*dc)(const struct dirent **, const struct dirent **);
    +
    +	dc = *(int (**)(const struct dirent **, const struct dirent **))thunk;
    +	return (dc((const struct dirent **)p1, (const struct dirent **)p2));
     }
    diff --git a/lib/libc/gen/sem.c b/lib/libc/gen/sem.c
    index 439f0fe5c41c..628e6509828e 100644
    --- a/lib/libc/gen/sem.c
    +++ b/lib/libc/gen/sem.c
    @@ -1,4 +1,5 @@
     /*
    + * Copyright (C) 2010 David Xu .
      * Copyright (C) 2000 Jason Evans .
      * All rights reserved.
      * 
    @@ -59,34 +60,65 @@
     #include "namespace.h"
     #include 
     #include 
    +#include 
     #include 
    +#include 
    +#include 
    +#include 
     #include 
     #include 
    -#include 
     #include 
     #include 
     #include 
    -#include <_semaphore.h>
     #include "un-namespace.h"
     #include "libc_private.h"
     
    +/*
    + * Old semaphore definitions.
    + */
    +struct sem {
    +#define SEM_MAGIC       ((u_int32_t) 0x09fa4012)
    +        u_int32_t       magic;
    +        pthread_mutex_t lock;
    +        pthread_cond_t  gtzero;
    +        u_int32_t       count;
    +        u_int32_t       nwaiters;
    +#define SEM_USER        (NULL)
    +        semid_t         semid;  /* semaphore id if kernel (shared) semaphore */
    +        int             syssem; /* 1 if kernel (shared) semaphore */
    +        LIST_ENTRY(sem) entry;
    +        struct sem      **backpointer;
    +};
    +
    +typedef struct sem* sem_t;
    +
    +#define SEM_FAILED     ((sem_t *)0)
    +#define SEM_VALUE_MAX  __INT_MAX
    +
    +#define SYM_FB10(sym)                   __CONCAT(sym, _fb10)
    +#define WEAK_REF(sym, alias)            __weak_reference(sym, alias)
    +#define SYM_COMPAT(sym, impl, ver)      __sym_compat(sym, impl, ver)
    + 
    +#define FB10_COMPAT(func, sym)                          \
    +        WEAK_REF(func, SYM_FB10(sym));                  \
    +        SYM_COMPAT(sym, SYM_FB10(sym), FBSD_1.0)
    +
     static sem_t sem_alloc(unsigned int value, semid_t semid, int system_sem);
     static void  sem_free(sem_t sem);
     
    -static LIST_HEAD(, sem) named_sems = LIST_HEAD_INITIALIZER(&named_sems);
    +static LIST_HEAD(, sem) named_sems = LIST_HEAD_INITIALIZER(named_sems);
     static pthread_mutex_t named_sems_mtx = PTHREAD_MUTEX_INITIALIZER;
     
    -__weak_reference(__sem_init, sem_init);
    -__weak_reference(__sem_destroy, sem_destroy);
    -__weak_reference(__sem_open, sem_open);
    -__weak_reference(__sem_close, sem_close);
    -__weak_reference(__sem_unlink, sem_unlink);
    -__weak_reference(__sem_wait, sem_wait);
    -__weak_reference(__sem_trywait, sem_trywait);
    -__weak_reference(__sem_timedwait, sem_timedwait);
    -__weak_reference(__sem_post, sem_post);
    -__weak_reference(__sem_getvalue, sem_getvalue);
    -
    +FB10_COMPAT(_libc_sem_init_compat, sem_init);
    +FB10_COMPAT(_libc_sem_destroy_compat, sem_destroy);
    +FB10_COMPAT(_libc_sem_open_compat, sem_open);
    +FB10_COMPAT(_libc_sem_close_compat, sem_close);
    +FB10_COMPAT(_libc_sem_unlink_compat, sem_unlink);
    +FB10_COMPAT(_libc_sem_wait_compat, sem_wait);
    +FB10_COMPAT(_libc_sem_trywait_compat, sem_trywait);
    +FB10_COMPAT(_libc_sem_timedwait_compat, sem_timedwait);
    +FB10_COMPAT(_libc_sem_post_compat, sem_post);
    +FB10_COMPAT(_libc_sem_getvalue_compat, sem_getvalue);
     
     static inline int
     sem_check_validity(sem_t *sem)
    @@ -104,8 +136,6 @@ static void
     sem_free(sem_t sem)
     {
     
    -	_pthread_mutex_destroy(&sem->lock);
    -	_pthread_cond_destroy(&sem->gtzero);
     	sem->magic = 0;
     	free(sem);
     }
    @@ -131,13 +161,11 @@ sem_alloc(unsigned int value, semid_t semid, int system_sem)
     	sem->magic = SEM_MAGIC;
     	sem->semid = semid;
     	sem->syssem = system_sem;
    -	sem->lock = PTHREAD_MUTEX_INITIALIZER;
    -	sem->gtzero = PTHREAD_COND_INITIALIZER;
     	return (sem);
     }
     
     int
    -__sem_init(sem_t *sem, int pshared, unsigned int value)
    +_libc_sem_init_compat(sem_t *sem, int pshared, unsigned int value)
     {
     	semid_t semid;
     
    @@ -147,26 +175,27 @@ __sem_init(sem_t *sem, int pshared, unsigned int value)
     	 * pthread_cond_wait() is just a stub that doesn't really
     	 * wait.
     	 */
    -	if (ksem_init(&semid, value) != 0)
    +	semid = (semid_t)SEM_USER;
    +	if ((pshared != 0) && ksem_init(&semid, value) != 0)
     		return (-1);
     
    -	(*sem) = sem_alloc(value, semid, 1);
    +	*sem = sem_alloc(value, semid, pshared);
     	if ((*sem) == NULL) {
    -		ksem_destroy(semid);
    +		if (pshared != 0)
    +			ksem_destroy(semid);
     		return (-1);
     	}
     	return (0);
     }
     
     int
    -__sem_destroy(sem_t *sem)
    +_libc_sem_destroy_compat(sem_t *sem)
     {
     	int retval;
     
     	if (sem_check_validity(sem) != 0)
     		return (-1);
     
    -	_pthread_mutex_lock(&(*sem)->lock);
     	/*
     	 * If this is a system semaphore let the kernel track it otherwise
     	 * make sure there are no waiters.
    @@ -181,18 +210,14 @@ __sem_destroy(sem_t *sem)
     		retval = 0;
     		(*sem)->magic = 0;
     	}
    -	_pthread_mutex_unlock(&(*sem)->lock);
     
    -	if (retval == 0) {
    -		_pthread_mutex_destroy(&(*sem)->lock);
    -		_pthread_cond_destroy(&(*sem)->gtzero);
    +	if (retval == 0)
     		sem_free(*sem);
    -	}
     	return (retval);
     }
     
     sem_t *
    -__sem_open(const char *name, int oflag, ...)
    +_libc_sem_open_compat(const char *name, int oflag, ...)
     {
     	sem_t *sem;
     	sem_t s;
    @@ -255,7 +280,7 @@ err:
     }
     
     int
    -__sem_close(sem_t *sem)
    +_libc_sem_close_compat(sem_t *sem)
     {
     
     	if (sem_check_validity(sem) != 0)
    @@ -280,68 +305,156 @@ __sem_close(sem_t *sem)
     }
     
     int
    -__sem_unlink(const char *name)
    +_libc_sem_unlink_compat(const char *name)
     {
     
     	return (ksem_unlink(name));
     }
     
    -int
    -__sem_wait(sem_t *sem)
    +static int
    +enable_async_cancel(void)
     {
    +	int old;
     
    -	if (sem_check_validity(sem) != 0)
    +	_pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old);
    +	return (old);
    +}
    +
    +static void
    +restore_async_cancel(int val)
    +{
    +	_pthread_setcanceltype(val, NULL);
    +}
    +
    +static int
    +_umtx_wait_uint(volatile unsigned *mtx, unsigned id, const struct timespec *timeout)
    +{
    +	if (timeout && (timeout->tv_sec < 0 || (timeout->tv_sec == 0 &&
    +	    timeout->tv_nsec <= 0))) {
    +		errno = ETIMEDOUT;
     		return (-1);
    +	}
    +	return _umtx_op(__DEVOLATILE(void *, mtx),
    +		UMTX_OP_WAIT_UINT_PRIVATE, id, NULL, __DECONST(void*, timeout));
    +}
     
    -	return (ksem_wait((*sem)->semid));
    +static int
    +_umtx_wake(volatile void *mtx)
    +{
    +	return _umtx_op(__DEVOLATILE(void *, mtx), UMTX_OP_WAKE_PRIVATE,
    +			1, NULL, NULL);
    +}
    +
    +#define TIMESPEC_SUB(dst, src, val)                             \
    +        do {                                                    \
    +                (dst)->tv_sec = (src)->tv_sec - (val)->tv_sec;  \
    +                (dst)->tv_nsec = (src)->tv_nsec - (val)->tv_nsec; \
    +                if ((dst)->tv_nsec < 0) {                       \
    +                        (dst)->tv_sec--;                        \
    +                        (dst)->tv_nsec += 1000000000;           \
    +                }                                               \
    +        } while (0)
    +
    +
    +static void
    +sem_cancel_handler(void *arg)
    +{
    +	sem_t *sem = arg;
    +
    +	atomic_add_int(&(*sem)->nwaiters, -1);
    +	if ((*sem)->nwaiters && (*sem)->count)
    +		_umtx_wake(&(*sem)->count);
     }
     
     int
    -__sem_trywait(sem_t *sem)
    +_libc_sem_timedwait_compat(sem_t * __restrict sem,
    +	const struct timespec * __restrict abstime)
     {
    -	int retval;
    +	struct timespec ts, ts2;
    +	int val, retval, saved_cancel;
     
     	if (sem_check_validity(sem) != 0)
     		return (-1);
     
    -	if ((*sem)->syssem != 0)
    - 		retval = ksem_trywait((*sem)->semid);
    -	else {
    -		_pthread_mutex_lock(&(*sem)->lock);
    -		if ((*sem)->count > 0) {
    -			(*sem)->count--;
    -			retval = 0;
    -		} else {
    -			errno = EAGAIN;
    -			retval = -1;
    +	if ((*sem)->syssem != 0) {
    +		saved_cancel = enable_async_cancel();
    +		retval = ksem_wait((*sem)->semid);
    +		restore_async_cancel(saved_cancel);
    +		return (retval);
    +	}
    +
    +	retval = 0;
    +	_pthread_testcancel();
    +	for (;;) {
    +		while ((val = (*sem)->count) > 0) {
    +			if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1))
    +				return (0);
     		}
    -		_pthread_mutex_unlock(&(*sem)->lock);
    +		if (retval)
    +			break;
    +		if (abstime) {
    +			if (abstime->tv_nsec >= 1000000000 || abstime->tv_nsec < 0) {
    +				errno = EINVAL;
    +				return (-1);
    +			}
    +			clock_gettime(CLOCK_REALTIME, &ts);
    +	                TIMESPEC_SUB(&ts2, abstime, &ts);
    +		}
    +		atomic_add_int(&(*sem)->nwaiters, 1);
    +		pthread_cleanup_push(sem_cancel_handler, sem);
    +		saved_cancel = enable_async_cancel();
    +		retval = _umtx_wait_uint(&(*sem)->count, 0, abstime ? &ts2 : NULL);
    +		restore_async_cancel(saved_cancel);
    +		pthread_cleanup_pop(0);
    +		atomic_add_int(&(*sem)->nwaiters, -1);
     	}
     	return (retval);
     }
     
     int
    -__sem_timedwait(sem_t * __restrict sem,
    -    const struct timespec * __restrict abs_timeout)
    +_libc_sem_wait_compat(sem_t *sem)
     {
    -	if (sem_check_validity(sem) != 0)
    -		return (-1);
    -
    -	return (ksem_timedwait((*sem)->semid, abs_timeout));
    +	return _libc_sem_timedwait_compat(sem, NULL);
     }
     
     int
    -__sem_post(sem_t *sem)
    +_libc_sem_trywait_compat(sem_t *sem)
    +{
    +	int val;
    +
    +	if (sem_check_validity(sem) != 0)
    +		return (-1);
    +
    +	if ((*sem)->syssem != 0)
    + 		return ksem_trywait((*sem)->semid);
    +
    +	while ((val = (*sem)->count) > 0) {
    +		if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1))
    +			return (0);
    +	}
    +	errno = EAGAIN;
    +	return (-1);
    +}
    +
    +int
    +_libc_sem_post_compat(sem_t *sem)
     {
     
     	if (sem_check_validity(sem) != 0)
     		return (-1);
     
    -	return (ksem_post((*sem)->semid));
    +	if ((*sem)->syssem != 0)
    +		return ksem_post((*sem)->semid);
    +
    +	atomic_add_rel_int(&(*sem)->count, 1);
    +
    +	if ((*sem)->nwaiters)
    +		return _umtx_wake(&(*sem)->count);
    +	return (0);
     }
     
     int
    -__sem_getvalue(sem_t * __restrict sem, int * __restrict sval)
    +_libc_sem_getvalue_compat(sem_t * __restrict sem, int * __restrict sval)
     {
     	int retval;
     
    @@ -351,10 +464,7 @@ __sem_getvalue(sem_t * __restrict sem, int * __restrict sval)
     	if ((*sem)->syssem != 0)
     		retval = ksem_getvalue((*sem)->semid, sval);
     	else {
    -		_pthread_mutex_lock(&(*sem)->lock);
     		*sval = (int)(*sem)->count;
    -		_pthread_mutex_unlock(&(*sem)->lock);
    -
     		retval = 0;
     	}
     	return (retval);
    diff --git a/lib/libc/gen/sem_init.3 b/lib/libc/gen/sem_init.3
    index d765a574e67b..52bcb75dedf8 100644
    --- a/lib/libc/gen/sem_init.3
    +++ b/lib/libc/gen/sem_init.3
    @@ -27,7 +27,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd February 15, 2000
    +.Dd January 9, 2010
     .Dt SEM_INIT 3
     .Os
     .Sh NAME
    @@ -46,10 +46,19 @@ function initializes the unnamed semaphore pointed to by
     .Fa sem
     to have the value
     .Fa value .
    +.Pp
     A non-zero value for
     .Fa pshared
    -specifies a shared semaphore that can be used by multiple processes, which this
    -implementation is not capable of.
    +specifies a shared semaphore that can be used by multiple processes,
    +the semaphore should be located in shared memory region (see
    +.Xr mmap 2 ,
    +.Xr shm_open 2 ,
    +and
    +.Xr shmget 2 ) ,
    +any process having read and write access to address
    +.Fa sem
    +can perform semaphore operations on
    +.Fa sem .
     .Pp
     Following a successful call to
     .Fn sem_init ,
    @@ -78,8 +87,6 @@ argument exceeds
     .Dv SEM_VALUE_MAX .
     .It Bq Er ENOSPC
     Memory allocation error.
    -.It Bq Er EPERM
    -Unable to initialize a shared semaphore.
     .El
     .Sh SEE ALSO
     .Xr sem_destroy 3 ,
    @@ -93,16 +100,3 @@ The
     .Fn sem_init
     function conforms to
     .St -p1003.1-96 .
    -.Pp
    -This implementation does not support shared semaphores, and reports this fact
    -by setting
    -.Va errno
    -to
    -.Er EPERM .
    -This is perhaps a stretch of the intention of
    -.Tn POSIX ,
    -but is
    -compliant, with the caveat that
    -.Fn sem_init
    -always reports a permissions error when an attempt to create a shared semaphore
    -is made.
    diff --git a/lib/libc/gen/sem_new.c b/lib/libc/gen/sem_new.c
    new file mode 100644
    index 000000000000..ef4ba68400d5
    --- /dev/null
    +++ b/lib/libc/gen/sem_new.c
    @@ -0,0 +1,464 @@
    +/*
    + * Copyright (C) 2010 David Xu .
    + * 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(s), this list of conditions and the following disclaimer as
    + *    the first lines of this file unmodified other than the possible
    + *    addition of one or more copyright notices.
    + * 2. Redistributions in binary form must reproduce the above copyright
    + *    notice(s), 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 COPYRIGHT HOLDER(S) ``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 COPYRIGHT HOLDER(S) 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 "namespace.h"
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include "un-namespace.h"
    +
    +__weak_reference(_sem_close, sem_close);
    +__weak_reference(_sem_destroy, sem_destroy);
    +__weak_reference(_sem_getvalue, sem_getvalue);
    +__weak_reference(_sem_init, sem_init);
    +__weak_reference(_sem_open, sem_open);
    +__weak_reference(_sem_post, sem_post);
    +__weak_reference(_sem_timedwait, sem_timedwait);
    +__weak_reference(_sem_trywait, sem_trywait);
    +__weak_reference(_sem_unlink, sem_unlink);
    +__weak_reference(_sem_wait, sem_wait);
    +
    +#define SEM_PREFIX	"/tmp/SEMD"
    +#define SEM_MAGIC	((u_int32_t)0x73656d31)
    +
    +struct sem_nameinfo {
    +	int open_count;
    +	char *name;
    +	sem_t *sem;
    +	LIST_ENTRY(sem_nameinfo) next;
    +};
    +
    +static pthread_once_t once = PTHREAD_ONCE_INIT;
    +static pthread_mutex_t sem_llock;
    +static LIST_HEAD(,sem_nameinfo) sem_list = LIST_HEAD_INITIALIZER(sem_list);
    +
    +static void
    +sem_prefork()
    +{
    +	
    +	_pthread_mutex_lock(&sem_llock);
    +}
    +
    +static void
    +sem_postfork()
    +{
    +	_pthread_mutex_unlock(&sem_llock);
    +}
    +
    +static void
    +sem_child_postfork()
    +{
    +	_pthread_mutex_unlock(&sem_llock);
    +}
    +
    +static void
    +sem_module_init(void)
    +{
    +	pthread_mutexattr_t ma;
    +
    +	_pthread_mutexattr_init(&ma);
    +	_pthread_mutexattr_settype(&ma,  PTHREAD_MUTEX_RECURSIVE);
    +	_pthread_mutex_init(&sem_llock, &ma);
    +	_pthread_mutexattr_destroy(&ma);
    +	_pthread_atfork(sem_prefork, sem_postfork, sem_child_postfork);
    +}
    +
    +static inline int
    +sem_check_validity(sem_t *sem)
    +{
    +
    +	if (sem->_magic == SEM_MAGIC)
    +		return (0);
    +	else {
    +		errno = EINVAL;
    +		return (-1);
    +	}
    +}
    +
    +int
    +_sem_init(sem_t *sem, int pshared, unsigned int value)
    +{
    +
    +	if (value > SEM_VALUE_MAX) {
    +		errno = EINVAL;
    +		return (-1);
    +	}
    + 
    +	bzero(sem, sizeof(sem_t));
    +	sem->_magic = SEM_MAGIC;
    +	sem->_kern._count = (u_int32_t)value;
    +	sem->_kern._has_waiters = 0;
    +	sem->_kern._flags = pshared ? USYNC_PROCESS_SHARED : 0;
    +	return (0);
    +}
    +
    +sem_t *
    +_sem_open(const char *name, int flags, ...)
    +{
    +	char path[PATH_MAX];
    +
    +	struct stat sb;
    +	va_list ap;
    +	struct sem_nameinfo *ni = NULL;
    +	sem_t *sem = NULL;
    +	int fd = -1, mode, len, errsave;
    +	int value = 0;
    +
    +	if (name[0] != '/') {
    +		errno = EINVAL;
    +		return (SEM_FAILED);
    +	}
    +	name++;
    +
    +	if (flags & ~(O_CREAT|O_EXCL)) {
    +		errno = EINVAL;
    +		return (SEM_FAILED);
    +	}
    +
    +	_pthread_once(&once, sem_module_init);
    +
    +	_pthread_mutex_lock(&sem_llock);
    +	LIST_FOREACH(ni, &sem_list, next) {
    +		if (strcmp(name, ni->name) == 0) {
    +			ni->open_count++;
    +			sem = ni->sem;
    +			_pthread_mutex_unlock(&sem_llock);
    +			return (sem);
    +		}
    +	}
    +
    +	if (flags & O_CREAT) {
    +		va_start(ap, flags);
    +		mode = va_arg(ap, int);
    +		value = va_arg(ap, int);
    +		va_end(ap);
    +	}
    +
    +	len = sizeof(*ni) + strlen(name) + 1;
    +	ni = (struct sem_nameinfo *)malloc(len);
    +	if (ni == NULL) {
    +		errno = ENOSPC;
    +		goto error;
    +	}
    +
    +	ni->name = (char *)(ni+1);
    +	strcpy(ni->name, name);
    +
    +	strcpy(path, SEM_PREFIX);
    +	if (strlcat(path, name, sizeof(path)) >= sizeof(path)) {
    +		errno = ENAMETOOLONG;
    +		goto error;
    +	}
    +
    +	fd = _open(path, flags|O_RDWR, mode);
    +	if (fd == -1)
    +		goto error;
    +	if (flock(fd, LOCK_EX) == -1)
    +		goto error;
    +	if (_fstat(fd, &sb)) {
    +		flock(fd, LOCK_UN);
    +		goto error;
    +	}
    +	if (sb.st_size < sizeof(sem_t)) {
    +		sem_t tmp;
    +
    +		tmp._magic = SEM_MAGIC;
    +		tmp._kern._has_waiters = 0;
    +		tmp._kern._count = value;
    +		tmp._kern._flags = USYNC_PROCESS_SHARED | SEM_NAMED;
    +		if (_write(fd, &tmp, sizeof(tmp)) != sizeof(tmp)) {
    +			flock(fd, LOCK_UN);
    +			goto error;
    +		}
    +	}
    +	flock(fd, LOCK_UN);
    +	sem = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE,
    +		MAP_SHARED|MAP_NOSYNC, fd, 0);
    +	if (sem == MAP_FAILED) {
    +		sem = NULL;
    +		if (errno == ENOMEM)
    +			errno = ENOSPC;
    +		goto error;
    +	}
    +	if (sem->_magic != SEM_MAGIC) {
    +		errno = EINVAL;
    +		goto error;
    +	}
    +	ni->open_count = 1;
    +	ni->sem = sem;
    +	LIST_INSERT_HEAD(&sem_list, ni, next);
    +	_pthread_mutex_unlock(&sem_llock);
    +	_close(fd);
    +	return (sem);
    +
    +error:
    +	errsave = errno;
    +	_pthread_mutex_unlock(&sem_llock);
    +	if (fd != -1)
    +		_close(fd);
    +	if (sem != NULL)
    +		munmap(sem, sizeof(sem_t));
    +	free(ni);
    +	errno = errsave;
    +	return (SEM_FAILED);
    +}
    +
    +int
    +_sem_close(sem_t *sem)
    +{
    +	struct sem_nameinfo *ni;
    +
    +	if (sem_check_validity(sem) != 0)
    +		return (-1);
    +
    +	if (!(sem->_kern._flags & SEM_NAMED)) {
    +		errno = EINVAL;
    +		return (-1);
    +	}
    +
    +	_pthread_once(&once, sem_module_init);
    +
    +	_pthread_mutex_lock(&sem_llock);
    +	LIST_FOREACH(ni, &sem_list, next) {
    +		if (sem == ni->sem) {
    +			if (--ni->open_count > 0) {
    +				_pthread_mutex_unlock(&sem_llock);
    +				return (0);
    +			}
    +			else
    +				break;
    +		}
    +	}
    +
    +	if (ni) {
    +		LIST_REMOVE(ni, next);
    +		_pthread_mutex_unlock(&sem_llock);
    +		munmap(sem, sizeof(*sem));
    +		free(ni);
    +		return (0);
    +	}
    +	_pthread_mutex_unlock(&sem_llock);
    +	errno = EINVAL;
    +	return (-1);
    +}
    +
    +int
    +_sem_unlink(const char *name)
    +{
    +	char path[PATH_MAX];
    +
    +	if (name[0] != '/') {
    +		errno = ENOENT;
    +		return -1;
    +	}
    +	name++;
    +
    +	strcpy(path, SEM_PREFIX);
    +	if (strlcat(path, name, sizeof(path)) >= sizeof(path)) {
    +		errno = ENAMETOOLONG;
    +		return (-1);
    +	}
    +	return unlink(path);
    +}
    +
    +int
    +_sem_destroy(sem_t *sem)
    +{
    +
    +	if (sem_check_validity(sem) != 0)
    +		return (-1);
    +
    +	if (sem->_kern._flags & SEM_NAMED) {
    +		errno = EINVAL;
    +		return (-1);
    +	}
    +	sem->_magic = 0;
    +	return (0);
    +}
    +
    +int
    +_sem_getvalue(sem_t * __restrict sem, int * __restrict sval)
    +{
    +
    +	if (sem_check_validity(sem) != 0)
    +		return (-1);
    +
    +	*sval = (int)sem->_kern._count;
    +	return (0);
    +}
    +
    +static __inline int
    +usem_wake(struct _usem *sem)
    +{
    +	if (!sem->_has_waiters)
    +		return (0);
    +	return _umtx_op(sem, UMTX_OP_SEM_WAKE, 0, NULL, NULL);
    +}
    +
    +static __inline int
    +usem_wait(struct _usem *sem, const struct timespec *timeout)
    +{
    +	if (timeout && (timeout->tv_sec < 0 || (timeout->tv_sec == 0 &&
    +	    timeout->tv_nsec <= 0))) {
    +		errno = ETIMEDOUT;
    +		return (-1);
    +	}
    +	return _umtx_op(sem, UMTX_OP_SEM_WAIT, 0, NULL,
    +			__DECONST(void*, timeout));
    +}
    +
    +int
    +_sem_trywait(sem_t *sem)
    +{
    +	int val;
    +
    +	if (sem_check_validity(sem) != 0)
    +		return (-1);
    +
    +	while ((val = sem->_kern._count) > 0) {
    +		if (atomic_cmpset_acq_int(&sem->_kern._count, val, val - 1))
    +			return (0);
    +	}
    +	errno = EAGAIN;
    +	return (-1);
    +}
    +
    +static void
    +sem_cancel_handler(void *arg)
    +{
    +	sem_t *sem = arg;
    +
    +	if (sem->_kern._has_waiters && sem->_kern._count)
    +		usem_wake(&sem->_kern);
    +}
    +
    +#define TIMESPEC_SUB(dst, src, val)                             \
    +        do {                                                    \
    +                (dst)->tv_sec = (src)->tv_sec - (val)->tv_sec;  \
    +                (dst)->tv_nsec = (src)->tv_nsec - (val)->tv_nsec; \
    +                if ((dst)->tv_nsec < 0) {                       \
    +                        (dst)->tv_sec--;                        \
    +                        (dst)->tv_nsec += 1000000000;           \
    +                }                                               \
    +        } while (0)
    +
    +
    +static __inline int
    +enable_async_cancel(void)
    +{
    +	int old;
    +
    +	_pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old);
    +	return (old);
    +}
    +
    +static __inline void
    +restore_async_cancel(int val)
    +{
    +	_pthread_setcanceltype(val, NULL);
    +}
    +
    +int
    +_sem_timedwait(sem_t * __restrict sem,
    +	const struct timespec * __restrict abstime)
    +{
    +	struct timespec ts, ts2;
    +	int val, retval, saved_cancel;
    +
    +	if (sem_check_validity(sem) != 0)
    +		return (-1);
    +
    +	retval = 0;
    +	for (;;) {
    +		while ((val = sem->_kern._count) > 0) {
    +			if (atomic_cmpset_acq_int(&sem->_kern._count, val, val - 1))
    +				return (0);
    +		}
    +
    +		if (retval)
    +			break;
    +
    +		/*
    +		 * The timeout argument is only supposed to
    +		 * be checked if the thread would have blocked.
    +		 */
    +		if (abstime != NULL) {
    +			if (abstime->tv_nsec >= 1000000000 || abstime->tv_nsec < 0) {
    +				errno = EINVAL;
    +				return (-1);
    +			}
    +			clock_gettime(CLOCK_REALTIME, &ts);
    +			TIMESPEC_SUB(&ts2, abstime, &ts);
    +		}
    +		pthread_cleanup_push(sem_cancel_handler, sem);
    +		saved_cancel = enable_async_cancel();
    +		retval = usem_wait(&sem->_kern, abstime ? &ts2 : NULL);
    +		restore_async_cancel(saved_cancel);
    +		pthread_cleanup_pop(0);
    +	}
    +	return (retval);
    +}
    +
    +int
    +_sem_wait(sem_t *sem)
    +{
    +	return _sem_timedwait(sem, NULL);
    +}
    +
    +/*
    + * POSIX:
    + * The sem_post() interface is reentrant with respect to signals and may be
    + * invoked from a signal-catching function. 
    + * The implementation does not use lock, so it should be safe.
    + */
    +int
    +_sem_post(sem_t *sem)
    +{
    +
    +	if (sem_check_validity(sem) != 0)
    +		return (-1);
    +
    +	atomic_add_rel_int(&sem->_kern._count, 1);
    +	return usem_wake(&sem->_kern);
    +}
    diff --git a/lib/libc/gen/sem_open.3 b/lib/libc/gen/sem_open.3
    index 772bdfb70dac..35276057898f 100644
    --- a/lib/libc/gen/sem_open.3
    +++ b/lib/libc/gen/sem_open.3
    @@ -27,7 +27,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd January 15, 2003
    +.Dd January 9, 2010
     .Dt SEM_OPEN 3
     .Os
     .Sh NAME
    @@ -58,6 +58,12 @@ The returned semaphore may be used in subsequent calls to
     and
     .Fn sem_close .
     .Pp
    +This implementation places strict requirements on the value of
    +.Fa name :
    +it must begin with a slash
    +.Pq Ql /
    +and contain no other slash characters.
    +.Pp
     The following bits may be set in the
     .Fa oflag
     argument:
    @@ -217,11 +223,3 @@ functions conform to
     .Sh HISTORY
     Support for named semaphores first appeared in
     .Fx 5.0 .
    -.Sh BUGS
    -This implementation places strict requirements on the value of
    -.Fa name :
    -it must begin with a slash
    -.Pq Ql / ,
    -contain no other slash characters,
    -and be less than 14 characters in length
    -not including the terminating null character.
    diff --git a/lib/libc/gen/sleep.c b/lib/libc/gen/sleep.c
    index cdf5828404a1..b807c2d1d53e 100644
    --- a/lib/libc/gen/sleep.c
    +++ b/lib/libc/gen/sleep.c
    @@ -41,8 +41,7 @@ __FBSDID("$FreeBSD$");
     #include "un-namespace.h"
     
     unsigned int
    -__sleep(seconds)
    -	unsigned int seconds;
    +__sleep(unsigned int seconds)
     {
     	struct timespec time_to_sleep;
     	struct timespec time_remaining;
    diff --git a/lib/libc/gen/sysconf.c b/lib/libc/gen/sysconf.c
    index 3c342ee89dd8..4618f32b0e94 100644
    --- a/lib/libc/gen/sysconf.c
    +++ b/lib/libc/gen/sysconf.c
    @@ -50,7 +50,7 @@ __FBSDID("$FreeBSD$");
     #include 
     
     #include "../stdlib/atexit.h"
    -#include "../stdtime/tzfile.h"
    +#include "tzfile.h"		/* from ../../../contrib/tzcode/stdtime */
     
     #define	_PATH_ZONEINFO	TZDIR	/* from tzfile.h */
     
    diff --git a/lib/libc/gen/sysctl.3 b/lib/libc/gen/sysctl.3
    index 75f8668b5048..143be16c436a 100644
    --- a/lib/libc/gen/sysctl.3
    +++ b/lib/libc/gen/sysctl.3
    @@ -28,7 +28,7 @@
     .\"	@(#)sysctl.3	8.4 (Berkeley) 5/9/95
     .\" $FreeBSD$
     .\"
    -.Dd January 28, 2009
    +.Dd February 21, 2010
     .Dt SYSCTL 3
     .Os
     .Sh NAME
    @@ -42,9 +42,9 @@
     .In sys/types.h
     .In sys/sysctl.h
     .Ft int
    -.Fn sysctl "int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "void *newp" "size_t newlen"
    +.Fn sysctl "const int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "const void *newp" "size_t newlen"
     .Ft int
    -.Fn sysctlbyname "const char *name" "void *oldp" "size_t *oldlenp" "void *newp" "size_t newlen"
    +.Fn sysctlbyname "const char *name" "void *oldp" "size_t *oldlenp" "const void *newp" "size_t newlen"
     .Ft int
     .Fn sysctlnametomib "const char *name" "int *mibp" "size_t *sizep"
     .Sh DESCRIPTION
    diff --git a/lib/libc/gen/sysctl.c b/lib/libc/gen/sysctl.c
    index eb6418e74640..fbc2c0c286d7 100644
    --- a/lib/libc/gen/sysctl.c
    +++ b/lib/libc/gen/sysctl.c
    @@ -43,15 +43,12 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     
    -extern int __sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
    -    void *newp, size_t newlen);
    +extern int __sysctl(const int *name, u_int namelen, void *oldp,
    +    size_t *oldlenp, const void *newp, size_t newlen);
     
     int
    -sysctl(name, namelen, oldp, oldlenp, newp, newlen)
    -	int *name;
    -	u_int namelen;
    -	void *oldp, *newp;
    -	size_t *oldlenp, newlen;
    +sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp,
    +    const void *newp, size_t newlen)
     {
     	if (name[0] != CTL_USER)
     		return (__sysctl(name, namelen, oldp, oldlenp, newp, newlen));
    diff --git a/lib/libc/gen/sysctlbyname.c b/lib/libc/gen/sysctlbyname.c
    index 4510fe050c9e..a2e0d5f85fdf 100644
    --- a/lib/libc/gen/sysctlbyname.c
    +++ b/lib/libc/gen/sysctlbyname.c
    @@ -13,27 +13,19 @@ __FBSDID("$FreeBSD$");
     
     #include 
     #include 
    -#include 
     
     int
    -sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp,
    -	     size_t newlen)
    +sysctlbyname(const char *name, void *oldp, size_t *oldlenp,
    +    const void *newp, size_t newlen)
     {
    -	int name2oid_oid[2];
     	int real_oid[CTL_MAXNAME+2];
     	int error;
     	size_t oidlen;
     
    -	name2oid_oid[0] = 0;	/* This is magic & undocumented! */
    -	name2oid_oid[1] = 3;
    -
    -	oidlen = sizeof(real_oid);
    -	error = sysctl(name2oid_oid, 2, real_oid, &oidlen, (void *)name,
    -		       strlen(name));
    +	oidlen = sizeof(real_oid) / sizeof(int);
    +	error = sysctlnametomib(name, real_oid, &oidlen);
     	if (error < 0) 
    -		return error;
    -	oidlen /= sizeof (int);
    +		return (error);
     	error = sysctl(real_oid, oidlen, oldp, oldlenp, newp, newlen);
     	return (error);
     }
    -
    diff --git a/lib/libc/gen/sysctlnametomib.c b/lib/libc/gen/sysctlnametomib.c
    index 1515784a5bec..afca95dc3a6c 100644
    --- a/lib/libc/gen/sysctlnametomib.c
    +++ b/lib/libc/gen/sysctlnametomib.c
    @@ -48,8 +48,8 @@ sysctlnametomib(const char *name, int *mibp, size_t *sizep)
     	oid[0] = 0;
     	oid[1] = 3;
     
    -	*sizep *= sizeof (int);
    -	error = sysctl(oid, 2, mibp, sizep, (void *)name, strlen(name));
    -	*sizep /= sizeof (int);
    +	*sizep *= sizeof(int);
    +	error = sysctl(oid, 2, mibp, sizep, name, strlen(name));
    +	*sizep /= sizeof(int);
     	return (error);
     }
    diff --git a/lib/libc/gen/termios.c b/lib/libc/gen/termios.c
    index 85ca4e335d38..fc21757d106f 100644
    --- a/lib/libc/gen/termios.c
    +++ b/lib/libc/gen/termios.c
    @@ -45,18 +45,14 @@ __FBSDID("$FreeBSD$");
     #include "un-namespace.h"
     
     int
    -tcgetattr(fd, t)
    -	int fd;
    -	struct termios *t;
    +tcgetattr(int fd, struct termios *t)
     {
     
     	return (_ioctl(fd, TIOCGETA, t));
     }
     
     int
    -tcsetattr(fd, opt, t)
    -	int fd, opt;
    -	const struct termios *t;
    +tcsetattr(int fd, int opt, const struct termios *t)
     {
     	struct termios localterm;
     
    @@ -88,8 +84,7 @@ tcsetpgrp(int fd, pid_t pgrp)
     }
     
     pid_t
    -tcgetpgrp(fd)
    -	int fd;
    +tcgetpgrp(int fd)
     {
     	int s;
     
    @@ -123,25 +118,21 @@ tcsetsid(int fd, pid_t pid)
     }
     
     speed_t
    -cfgetospeed(t)
    -	const struct termios *t;
    +cfgetospeed(const struct termios *t)
     {
     
     	return (t->c_ospeed);
     }
     
     speed_t
    -cfgetispeed(t)
    -	const struct termios *t;
    +cfgetispeed(const struct termios *t)
     {
     
     	return (t->c_ispeed);
     }
     
     int
    -cfsetospeed(t, speed)
    -	struct termios *t;
    -	speed_t speed;
    +cfsetospeed(struct termios *t, speed_t speed)
     {
     
     	t->c_ospeed = speed;
    @@ -149,9 +140,7 @@ cfsetospeed(t, speed)
     }
     
     int
    -cfsetispeed(t, speed)
    -	struct termios *t;
    -	speed_t speed;
    +cfsetispeed(struct termios *t, speed_t speed)
     {
     
     	t->c_ispeed = speed;
    @@ -159,9 +148,7 @@ cfsetispeed(t, speed)
     }
     
     int
    -cfsetspeed(t, speed)
    -	struct termios *t;
    -	speed_t speed;
    +cfsetspeed(struct termios *t, speed_t speed)
     {
     
     	t->c_ispeed = t->c_ospeed = speed;
    @@ -173,8 +160,7 @@ cfsetspeed(t, speed)
      * mode with no characters interpreted, 8-bit data path.
      */
     void
    -cfmakeraw(t)
    -	struct termios *t;
    +cfmakeraw(struct termios *t)
     {
     
     	t->c_iflag &= ~(IMAXBEL|IXOFF|INPCK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IGNPAR);
    @@ -188,8 +174,7 @@ cfmakeraw(t)
     }
     
     int
    -tcsendbreak(fd, len)
    -	int fd, len;
    +tcsendbreak(int fd, int len __unused)
     {
     	struct timeval sleepytime;
     
    @@ -204,8 +189,7 @@ tcsendbreak(fd, len)
     }
     
     int
    -__tcdrain(fd)
    -	int fd;
    +__tcdrain(int fd)
     {
     	return (_ioctl(fd, TIOCDRAIN, 0));
     }
    @@ -214,8 +198,7 @@ __weak_reference(__tcdrain, tcdrain);
     __weak_reference(__tcdrain, _tcdrain);
     
     int
    -tcflush(fd, which)
    -	int fd, which;
    +tcflush(int fd, int which)
     {
     	int com;
     
    @@ -237,8 +220,7 @@ tcflush(fd, which)
     }
     
     int
    -tcflow(fd, action)
    -	int fd, action;
    +tcflow(int fd, int action)
     {
     	struct termios term;
     	u_char c;
    diff --git a/lib/libc/gen/time.3 b/lib/libc/gen/time.3
    index 2770e49f3860..d022e0611c47 100644
    --- a/lib/libc/gen/time.3
    +++ b/lib/libc/gen/time.3
    @@ -66,6 +66,7 @@ The
     function may fail for any of the reasons described in
     .Xr gettimeofday 2 .
     .Sh SEE ALSO
    +.Xr clock_gettime 2 ,
     .Xr gettimeofday 2 ,
     .Xr ctime 3
     .Sh STANDARDS
    diff --git a/lib/libc/gen/time.c b/lib/libc/gen/time.c
    index 840f9b6b7bcc..214dfce1bb8e 100644
    --- a/lib/libc/gen/time.c
    +++ b/lib/libc/gen/time.c
    @@ -37,13 +37,12 @@ __FBSDID("$FreeBSD$");
     #include 
     
     time_t
    -time(t)
    -	time_t *t;
    +time(time_t *t)
     {
    -	struct timeval tt;
    +	struct timespec tt;
     	time_t retval;
     
    -	if (gettimeofday(&tt, (struct timezone *)0) < 0)
    +	if (clock_gettime(CLOCK_SECOND, &tt) < 0)
     		retval = -1;
     	else
     		retval = tt.tv_sec;
    diff --git a/lib/libc/gen/timezone.c b/lib/libc/gen/timezone.c
    index c59ae6b60877..5f0fa667ea4d 100644
    --- a/lib/libc/gen/timezone.c
    +++ b/lib/libc/gen/timezone.c
    @@ -40,7 +40,7 @@ __FBSDID("$FreeBSD$");
     #include 
     #define TZ_MAX_CHARS 255
     
    -char *_tztab();
    +char *_tztab(int, int);
     
     /*
      * timezone --
    @@ -53,9 +53,7 @@ char *_tztab();
     static char	czone[TZ_MAX_CHARS];		/* space for zone name */
     
     char *
    -timezone(zone, dst)
    -	int	zone,
    -		dst;
    +timezone(int zone, int dst)
     {
     	char	*beg,
     			*end;
    @@ -106,9 +104,7 @@ static struct zone {
      *	STANDARD LIBRARY.
      */
     char *
    -_tztab(zone,dst)
    -	int	zone;
    -	int	dst;
    +_tztab(int zone, int dst)
     {
     	struct zone	*zp;
     	char	sign;
    diff --git a/lib/libc/gen/tls.c b/lib/libc/gen/tls.c
    index 2756e94fc6ff..9d8467997b94 100644
    --- a/lib/libc/gen/tls.c
    +++ b/lib/libc/gen/tls.c
    @@ -137,11 +137,11 @@ __libc_allocate_tls(void *oldtcb, size_t tcbsize, size_t tcbalign __unused)
     	if (oldtcb != NULL && tcbsize == TLS_TCB_SIZE)
     		return (oldtcb);
     
    -	tcb = calloc(1, tls_static_space + tcbsize);
    +	tcb = calloc(1, tls_static_space + tcbsize - TLS_TCB_SIZE);
     	tls = (Elf_Addr **)(tcb + tcbsize - TLS_TCB_SIZE);
     
     	if (oldtcb != NULL) {
    -		memcpy(tls, oldtcb, tls_static_space + TLS_TCB_SIZE);
    +		memcpy(tls, oldtcb, tls_static_space);
     		free(oldtcb);
     
     		/* Adjust the DTV. */
    diff --git a/lib/libc/gen/ttyname.3 b/lib/libc/gen/ttyname.3
    index c7b8cbcd3c84..9420bbe8f9e4 100644
    --- a/lib/libc/gen/ttyname.3
    +++ b/lib/libc/gen/ttyname.3
    @@ -34,8 +34,7 @@
     .Sh NAME
     .Nm ttyname ,
     .Nm ttyname_r ,
    -.Nm isatty ,
    -.Nm ttyslot
    +.Nm isatty
     .Nd get name of associated terminal (tty) from file descriptor
     .Sh LIBRARY
     .Lb libc
    @@ -47,22 +46,8 @@
     .Fn ttyname_r "int fd" "char *buf" "size_t len"
     .Ft int
     .Fn isatty "int fd"
    -.Ft int
    -.Fn ttyslot void
     .Sh DESCRIPTION
    -These functions operate on the system file descriptors for terminal
    -type devices.
    -These descriptors are not related to the standard
    -.Tn I/O
    -.Dv FILE
    -typedef, but refer to the special device files found in
    -.Pa /dev
    -and for which an entry exists
    -in the initialization file
    -.Pa /etc/ttys
    -or pseudo-terminals.
    -(See
    -.Xr ttys 5 . )
    +These functions operate on file descriptors for terminal type devices.
     .Pp
     The
     .Fn isatty
    @@ -89,13 +74,6 @@ The
     .Fn ttyname_r
     function
     takes a buffer and length as arguments to avoid this problem.
    -.Pp
    -The
    -.Fn ttyslot
    -function
    -fetches the current process' control terminal number from the
    -.Xr ttys 5
    -file entry.
     .Sh RETURN VALUES
     The
     .Fn ttyname
    @@ -110,17 +88,6 @@ The
     .Fn ttyname_r
     function returns 0 if successful.
     Otherwise an error number is returned.
    -.Pp
    -The
    -.Fn ttyslot
    -function
    -returns the unit number of the device file if found; otherwise
    -the value zero is returned.
    -.Sh FILES
    -.Bl -tag -width ".Pa /etc/ttys" -compact
    -.It Pa /dev/\(**
    -.It Pa /etc/ttys
    -.El
     .Sh ERRORS
     The
     .Fn ttyname_r
    @@ -138,14 +105,15 @@ argument
     is smaller than the length of the string to be returned.
     .El
     .Sh SEE ALSO
    -.Xr ioctl 2 ,
    -.Xr ttys 5
    +.Xr fdevname 3 ,
    +.Xr ptsname 3 ,
    +.Xr tcgetattr 3 ,
    +.Xr tty 4
     .Sh HISTORY
     The
    -.Fn isatty ,
    -.Fn ttyname ,
    +.Fn isatty
     and
    -.Fn ttyslot
    +.Fn ttyname
     functions
     appeared in
     .At v7 .
    diff --git a/lib/libc/gen/ttyslot.c b/lib/libc/gen/ttyslot.c
    index 31cc15621f33..1de0837e937a 100644
    --- a/lib/libc/gen/ttyslot.c
    +++ b/lib/libc/gen/ttyslot.c
    @@ -33,33 +33,11 @@ static char sccsid[] = "@(#)ttyslot.c	8.1 (Berkeley) 6/4/93";
     #include 
     __FBSDID("$FreeBSD$");
     
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
     int
    -ttyslot()
    +__ttyslot(void)
     {
    -	struct ttyent *ttyp;
    -	int slot;
    -	int cnt;
    -	char *name;
     
    -	setttyent();
    -	for (cnt = 0; cnt < 3; ++cnt)
    -		if ( (name = ttyname(cnt)) ) {
    -			if (strncmp(name, _PATH_DEV, sizeof _PATH_DEV - 1) != 0)
    -				break;
    -			name += sizeof _PATH_DEV - 1;
    -			for (slot = 1; (ttyp = getttyent()); ++slot)
    -				if (!strcmp(ttyp->ty_name, name)) {
    -					endttyent();
    -					return(slot);
    -				}
    -			break;
    -		}
    -	endttyent();
    -	return(0);
    +	return (0);
     }
    +
    +__sym_compat(ttyslot, __ttyslot, FBSD_1.0);
    diff --git a/lib/libc/gen/tzset.3 b/lib/libc/gen/tzset.3
    index 34ca238e1c1e..8d37fcaf9db8 100644
    --- a/lib/libc/gen/tzset.3
    +++ b/lib/libc/gen/tzset.3
    @@ -310,14 +310,14 @@ time zone directory
     rules for
     .Tn POSIX Ns -style
     .Tn TZ Ns 's
    -.It Pa /usr/share/zoneinfo/GMT
    +.It Pa /usr/share/zoneinfo/Etc/GMT
     for
     .Tn UTC
     leap seconds
     .El
     .Pp
     If the file
    -.Pa /usr/share/zoneinfo/GMT
    +.Pa /usr/share/zoneinfo/UTC
     does not exist,
     .Tn UTC
     leap seconds are loaded from
    diff --git a/lib/libc/gen/usleep.c b/lib/libc/gen/usleep.c
    index 0454665b280d..7d6559be22a3 100644
    --- a/lib/libc/gen/usleep.c
    +++ b/lib/libc/gen/usleep.c
    @@ -39,8 +39,7 @@ __FBSDID("$FreeBSD$");
     #include "un-namespace.h"
     
     int
    -__usleep(useconds)
    -	useconds_t useconds;
    +__usleep(useconds_t useconds)
     {
     	struct timespec time_to_sleep;
     
    diff --git a/lib/libc/gen/utxdb.c b/lib/libc/gen/utxdb.c
    new file mode 100644
    index 000000000000..6a85c0587093
    --- /dev/null
    +++ b/lib/libc/gen/utxdb.c
    @@ -0,0 +1,176 @@
    +/*-
    + * Copyright (c) 2010 Ed Schouten 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include "namespace.h"
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include "utxdb.h"
    +#include "un-namespace.h"
    +
    +#define	UTOF_STRING(ut, fu, field) do { \
    +	strncpy((fu)->fu_ ## field, (ut)->ut_ ## field,		\
    +	    MIN(sizeof (fu)->fu_ ## field, sizeof (ut)->ut_ ## field));	\
    +} while (0)
    +#define	UTOF_ID(ut, fu) do { \
    +	memcpy((fu)->fu_id, (ut)->ut_id,				\
    +	    MIN(sizeof (fu)->fu_id, sizeof (ut)->ut_id));		\
    +} while (0)
    +#define	UTOF_PID(ut, fu) do { \
    +	(fu)->fu_pid = htobe32((ut)->ut_pid);				\
    +} while (0)
    +#define	UTOF_TYPE(ut, fu) do { \
    +	(fu)->fu_type = (ut)->ut_type;					\
    +} while (0)
    +#define	UTOF_TV(fu) do { \
    +	struct timeval tv;						\
    +	gettimeofday(&tv, NULL);					\
    +	(fu)->fu_tv = htobe64((uint64_t)tv.tv_sec * 1000000 +		\
    +	    (uint64_t)tv.tv_usec);					\
    +} while (0)
    +
    +void
    +utx_to_futx(const struct utmpx *ut, struct futx *fu)
    +{
    +
    +	memset(fu, 0, sizeof *fu);
    +
    +	switch (ut->ut_type) {
    +	case BOOT_TIME:
    +	case OLD_TIME:
    +	case NEW_TIME:
    +	/* Extension: shutdown time. */
    +	case SHUTDOWN_TIME:
    +		break;
    +	case USER_PROCESS:
    +		UTOF_ID(ut, fu);
    +		UTOF_STRING(ut, fu, user);
    +		UTOF_STRING(ut, fu, line);
    +		/* Extension: host name. */
    +		UTOF_STRING(ut, fu, host);
    +		UTOF_PID(ut, fu);
    +		break;
    +	case INIT_PROCESS:
    +		UTOF_ID(ut, fu);
    +		UTOF_PID(ut, fu);
    +		break;
    +	case LOGIN_PROCESS:
    +		UTOF_ID(ut, fu);
    +		UTOF_STRING(ut, fu, user);
    +		UTOF_STRING(ut, fu, line);
    +		UTOF_PID(ut, fu);
    +		break;
    +	case DEAD_PROCESS:
    +		UTOF_ID(ut, fu);
    +		UTOF_PID(ut, fu);
    +		break;
    +	default:
    +		fu->fu_type = EMPTY;
    +		return;
    +	}
    +
    +	UTOF_TYPE(ut, fu);
    +	UTOF_TV(fu);
    +}
    +
    +#define	FTOU_STRING(fu, ut, field) do { \
    +	strncpy((ut)->ut_ ## field, (fu)->fu_ ## field,		\
    +	    MIN(sizeof (ut)->ut_ ## field - 1, sizeof (fu)->fu_ ## field)); \
    +} while (0)
    +#define	FTOU_ID(fu, ut) do { \
    +	memcpy((ut)->ut_id, (fu)->fu_id,				\
    +	    MIN(sizeof (ut)->ut_id, sizeof (fu)->fu_id));		\
    +} while (0)
    +#define	FTOU_PID(fu, ut) do { \
    +	(ut)->ut_pid = be32toh((fu)->fu_pid);				\
    +} while (0)
    +#define	FTOU_TYPE(fu, ut) do { \
    +	(ut)->ut_type = (fu)->fu_type;					\
    +} while (0)
    +#define	FTOU_TV(fu, ut) do { \
    +	uint64_t t;							\
    +	t = be64toh((fu)->fu_tv);					\
    +	(ut)->ut_tv.tv_sec = t / 1000000;				\
    +	(ut)->ut_tv.tv_usec = t % 1000000;				\
    +} while (0)
    +
    +struct utmpx *
    +futx_to_utx(const struct futx *fu)
    +{
    +	static struct utmpx *ut;
    +
    +	if (ut == NULL) {
    +		ut = calloc(1, sizeof *ut);
    +		if (ut == NULL)
    +			return (NULL);
    +	} else {
    +		memset(ut, 0, sizeof *ut);
    +	}
    +
    +	switch (fu->fu_type) {
    +	case BOOT_TIME:
    +	case OLD_TIME:
    +	case NEW_TIME:
    +	/* Extension: shutdown time. */
    +	case SHUTDOWN_TIME:
    +		break;
    +	case USER_PROCESS:
    +		FTOU_ID(fu, ut);
    +		FTOU_STRING(fu, ut, user);
    +		FTOU_STRING(fu, ut, line);
    +		/* Extension: host name. */
    +		FTOU_STRING(fu, ut, host);
    +		FTOU_PID(fu, ut);
    +		break;
    +	case INIT_PROCESS:
    +		FTOU_ID(fu, ut);
    +		FTOU_PID(fu, ut);
    +		break;
    +	case LOGIN_PROCESS:
    +		FTOU_ID(fu, ut);
    +		FTOU_STRING(fu, ut, user);
    +		FTOU_STRING(fu, ut, line);
    +		FTOU_PID(fu, ut);
    +		break;
    +	case DEAD_PROCESS:
    +		FTOU_ID(fu, ut);
    +		FTOU_PID(fu, ut);
    +		break;
    +	default:
    +		ut->ut_type = EMPTY;
    +		return (ut);
    +	}
    +
    +	FTOU_TYPE(fu, ut);
    +	FTOU_TV(fu, ut);
    +	return (ut);
    +}
    diff --git a/lib/libc/gen/utxdb.h b/lib/libc/gen/utxdb.h
    new file mode 100644
    index 000000000000..d9ebc93e73f2
    --- /dev/null
    +++ b/lib/libc/gen/utxdb.h
    @@ -0,0 +1,61 @@
    +/*-
    + * Copyright (c) 2010 Ed Schouten 
    + * 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$
    + */
    +
    +#ifndef _UTXDB_H_
    +#define	_UTXDB_H_
    +
    +#include 
    +
    +#define	_PATH_UTX_ACTIVE	"/var/run/utx.active"
    +#define	_PATH_UTX_LASTLOGIN	"/var/log/utx.lastlogin"
    +#define	_PATH_UTX_LOG		"/var/log/utx.log"
    +
    +/*
    + * Entries in struct futx are ordered by how often they are used.  In
    + * utx.log only entries will be written until the last non-zero byte,
    + * which means we want to put the hostname at the end. Most primitive
    + * records only store a ut_type and ut_tv, which means we want to store
    + * those at the front.
    + */
    +
    +struct utmpx;
    +
    +struct futx {
    +	uint8_t		fu_type;
    +	uint64_t	fu_tv;
    +	char		fu_id[8];
    +	uint32_t	fu_pid;
    +	char		fu_user[32];
    +	char		fu_line[16];
    +	char		fu_host[128];
    +} __packed;
    +
    +void	utx_to_futx(const struct utmpx *, struct futx *);
    +struct utmpx *futx_to_utx(const struct futx *);
    +
    +#endif /* !_UTXDB_H_ */
    diff --git a/lib/libc/gen/wordexp.c b/lib/libc/gen/wordexp.c
    index a437543bca40..bcab1f5e8154 100644
    --- a/lib/libc/gen/wordexp.c
    +++ b/lib/libc/gen/wordexp.c
    @@ -28,8 +28,10 @@
     #include 
     #include 
     #include 
    +#include 
     #include 
     #include 
    +#include 
     #include 
     #include 
     #include 
    @@ -73,6 +75,24 @@ wordexp(const char * __restrict words, wordexp_t * __restrict we, int flags)
     	return (0);
     }
     
    +static size_t
    +we_read_fully(int fd, char *buffer, size_t len)
    +{
    +	size_t done;
    +	ssize_t nread;
    +
    +	done = 0;
    +	do {
    +		nread = _read(fd, buffer + done, len - done);
    +		if (nread == -1 && errno == EINTR)
    +			continue;
    +		if (nread <= 0)
    +			break;
    +		done += nread;
    +	} while (done != len);
    +	return done;
    +}
    +
     /*
      * we_askshell --
      *	Use the `wordexp' /bin/sh builtin function to do most of the work
    @@ -90,20 +110,31 @@ we_askshell(const char *words, wordexp_t *we, int flags)
     	size_t sofs;			/* Offset into we->we_strings */
     	size_t vofs;			/* Offset into we->we_wordv */
     	pid_t pid;			/* Process ID of child */
    +	pid_t wpid;			/* waitpid return value */
     	int status;			/* Child exit status */
    +	int error;			/* Our return value */
    +	int serrno;			/* errno to return */
     	char *ifs;			/* IFS env. var. */
     	char *np, *p;			/* Handy pointers */
     	char *nstrings;			/* Temporary for realloc() */
     	char **nwv;			/* Temporary for realloc() */
    +	sigset_t newsigblock, oldsigblock;
     
    +	serrno = errno;
     	if ((ifs = getenv("IFS")) == NULL)
     		ifs = " \t\n";
     
     	if (pipe(pdes) < 0)
     		return (WRDE_NOSPACE);	/* XXX */
    +	(void)sigemptyset(&newsigblock);
    +	(void)sigaddset(&newsigblock, SIGCHLD);
    +	(void)_sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock);
     	if ((pid = fork()) < 0) {
    +		serrno = errno;
     		_close(pdes[0]);
     		_close(pdes[1]);
    +		(void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
    +		errno = serrno;
     		return (WRDE_NOSPACE);	/* XXX */
     	}
     	else if (pid == 0) {
    @@ -114,6 +145,7 @@ we_askshell(const char *words, wordexp_t *we, int flags)
     		int devnull;
     		char *cmd;
     
    +		(void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
     		_close(pdes[0]);
     		if (_dup2(pdes[1], STDOUT_FILENO) < 0)
     			_exit(1);
    @@ -139,10 +171,11 @@ we_askshell(const char *words, wordexp_t *we, int flags)
     	 * the expanded words separated by nulls.
     	 */
     	_close(pdes[1]);
    -	if (_read(pdes[0], wbuf, 8) != 8 || _read(pdes[0], bbuf, 8) != 8) {
    -		_close(pdes[0]);
    -		_waitpid(pid, &status, 0);
    -		return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
    +	if (we_read_fully(pdes[0], wbuf, 8) != 8 ||
    +			we_read_fully(pdes[0], bbuf, 8) != 8) {
    +		error = flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX;
    +		serrno = errno;
    +		goto cleanup;
     	}
     	wbuf[8] = bbuf[8] = '\0';
     	nwords = strtol(wbuf, NULL, 16);
    @@ -162,33 +195,38 @@ we_askshell(const char *words, wordexp_t *we, int flags)
     	if ((nwv = realloc(we->we_wordv, (we->we_wordc + 1 +
     	    (flags & WRDE_DOOFFS ?  we->we_offs : 0)) *
     	    sizeof(char *))) == NULL) {
    -		_close(pdes[0]);
    -		_waitpid(pid, &status, 0);
    -		return (WRDE_NOSPACE);
    +		error = WRDE_NOSPACE;
    +		goto cleanup;
     	}
     	we->we_wordv = nwv;
     	if ((nstrings = realloc(we->we_strings, we->we_nbytes)) == NULL) {
    -		_close(pdes[0]);
    -		_waitpid(pid, &status, 0);
    -		return (WRDE_NOSPACE);
    +		error = WRDE_NOSPACE;
    +		goto cleanup;
     	}
     	for (i = 0; i < vofs; i++)
     		if (we->we_wordv[i] != NULL)
     			we->we_wordv[i] += nstrings - we->we_strings;
     	we->we_strings = nstrings;
     
    -	if (_read(pdes[0], we->we_strings + sofs, nbytes) != nbytes) {
    -		_close(pdes[0]);
    -		_waitpid(pid, &status, 0);
    -		return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
    +	if (we_read_fully(pdes[0], we->we_strings + sofs, nbytes) != nbytes) {
    +		error = flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX;
    +		serrno = errno;
    +		goto cleanup;
     	}
     
    -	if (_waitpid(pid, &status, 0) < 0 || !WIFEXITED(status) ||
    -	    WEXITSTATUS(status) != 0) {
    -		_close(pdes[0]);
    -		return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
    -	}
    +	error = 0;
    +cleanup:
     	_close(pdes[0]);
    +	do
    +		wpid = _waitpid(pid, &status, 0);
    +	while (wpid < 0 && errno == EINTR);
    +	(void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL);
    +	if (error != 0) {
    +		errno = serrno;
    +		return (error);
    +	}
    +	if (wpid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0)
    +		return (flags & WRDE_UNDEF ? WRDE_BADVAL : WRDE_SYNTAX);
     
     	/*
     	 * Break the null-terminated expanded word strings out into
    @@ -282,7 +320,7 @@ we_check(const char *words, int flags)
     				if (c == '\0' || level != 0)
     					return (WRDE_SYNTAX);
     			} else
    -				c = *--words;
    +				--words;
     			break;
     		default:
     			break;
    diff --git a/lib/libc/gmon/gmon.c b/lib/libc/gmon/gmon.c
    index dd85eec48c19..fe769e88bdc2 100644
    --- a/lib/libc/gmon/gmon.c
    +++ b/lib/libc/gmon/gmon.c
    @@ -132,7 +132,7 @@ monstartup(lowpc, highpc)
     }
     
     void
    -_mcleanup()
    +_mcleanup(void)
     {
     	int fd;
     	int fromindex;
    diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
    index 50903f3c74fa..cb0b40740f46 100644
    --- a/lib/libc/include/libc_private.h
    +++ b/lib/libc/include/libc_private.h
    @@ -34,6 +34,7 @@
     
     #ifndef _LIBC_PRIVATE_H_
     #define _LIBC_PRIVATE_H_
    +#include 
     
     /*
      * This global flag is non-zero when a process has created one
    @@ -126,6 +127,8 @@ typedef enum {
     	PJT_SETSPECIFIC,
     	PJT_SIGMASK,
     	PJT_TESTCANCEL,
    +	PJT_CLEANUP_POP_IMP,
    +	PJT_CLEANUP_PUSH_IMP,
     	PJT_MAX
     } pjt_index_t;
     
    @@ -146,6 +149,12 @@ int _yp_check(char **);
      */
     void _init_tls(void);
     
    +/*
    + * Provides pthread_once()-like functionality for both single-threaded
    + * and multi-threaded applications.
    + */
    +int _once(pthread_once_t *, void (*)(void));
    +
     /*
      * Set the TLS thread pointer
      */
    diff --git a/lib/libc/include/namespace.h b/lib/libc/include/namespace.h
    index a65b929bbc07..6ba8bab61557 100644
    --- a/lib/libc/include/namespace.h
    +++ b/lib/libc/include/namespace.h
    @@ -80,6 +80,7 @@
     #define		listen				_listen
     #define		nanosleep			_nanosleep
     #define		open				_open
    +#define		openat				_openat
     #define		poll				_poll
     #define		pthread_atfork			_pthread_atfork
     #define		pthread_attr_destroy		_pthread_attr_destroy
    diff --git a/lib/libc/include/un-namespace.h b/lib/libc/include/un-namespace.h
    index 6b7f49a2764b..00f0df27480a 100644
    --- a/lib/libc/include/un-namespace.h
    +++ b/lib/libc/include/un-namespace.h
    @@ -61,6 +61,7 @@
     #undef		listen
     #undef		nanosleep
     #undef		open
    +#undef		openat
     #undef		poll
     #undef		pthread_atfork
     #undef		pthread_attr_destroy
    diff --git a/lib/libc/locale/isblank.3 b/lib/libc/locale/isblank.3
    index 4cc6bbbce80e..6734dcc45235 100644
    --- a/lib/libc/locale/isblank.3
    +++ b/lib/libc/locale/isblank.3
    @@ -50,9 +50,9 @@ For any locale, this includes the following standard characters:
     .It "\&``\et''\t`` ''"
     .El
     .Pp
    -In the "C" locale
    +In the "C" locale, a successful
     .Fn isblank
    -successful test is limited to this characters only.
    +test is limited to these characters only.
     The value of the argument must be representable as an
     .Vt "unsigned char"
     or the value of
    diff --git a/lib/libc/locale/isgraph.3 b/lib/libc/locale/isgraph.3
    index 4ba78e3c4d9e..5e06e2e498de 100644
    --- a/lib/libc/locale/isgraph.3
    +++ b/lib/libc/locale/isgraph.3
    @@ -50,7 +50,7 @@ The
     function tests for any printing character except space
     .Pq Ql "\ "
     and other
    -locale specific space-like characters.
    +locale-specific space-like characters.
     The value of the argument must be representable as an
     .Vt "unsigned char"
     or the value of
    diff --git a/lib/libc/locale/isprint.3 b/lib/libc/locale/isprint.3
    index f3408501c29f..d8adf1da37f3 100644
    --- a/lib/libc/locale/isprint.3
    +++ b/lib/libc/locale/isprint.3
    @@ -47,7 +47,7 @@
     .Sh DESCRIPTION
     The
     .Fn isprint
    -function tests for any printing character including space
    +function tests for any printing character, including space
     .Pq Ql "\ " .
     The value of the argument must be representable as an
     .Vt "unsigned char"
    diff --git a/lib/libc/locale/nl_langinfo.3 b/lib/libc/locale/nl_langinfo.3
    index 8de168206c20..789cac24fd13 100644
    --- a/lib/libc/locale/nl_langinfo.3
    +++ b/lib/libc/locale/nl_langinfo.3
    @@ -53,7 +53,7 @@ with a category corresponding to the category of
     or to the
     category
     .Dv LC_ALL ,
    -may overwrite buffer pointed by the return value.
    +may overwrite the buffer pointed to by the return value.
     .Sh RETURN VALUES
     In a locale where langinfo data is not defined,
     .Fn nl_langinfo
    diff --git a/lib/libc/locale/nl_langinfo.c b/lib/libc/locale/nl_langinfo.c
    index 9bd508214e4b..26ca02544982 100644
    --- a/lib/libc/locale/nl_langinfo.c
    +++ b/lib/libc/locale/nl_langinfo.c
    @@ -93,6 +93,12 @@ nl_langinfo(nl_item item)
     	case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
     		ret = (char*) __get_current_time_locale()->mon[_REL(ABMON_1)];
     		break;
    +	case ALTMON_1: case ALTMON_2: case ALTMON_3: case ALTMON_4:
    +	case ALTMON_5: case ALTMON_6: case ALTMON_7: case ALTMON_8:
    +	case ALTMON_9: case ALTMON_10: case ALTMON_11: case ALTMON_12:
    +		ret = (char*)
    +		    __get_current_time_locale()->alt_month[_REL(ALTMON_1)];
    +		break;
     	case ERA:
     		/* XXX: need to be implemented  */
     		ret = "";
    diff --git a/lib/libc/mips/Symbol.map b/lib/libc/mips/Symbol.map
    index 2bbdd6dd3442..3f24c1149f73 100644
    --- a/lib/libc/mips/Symbol.map
    +++ b/lib/libc/mips/Symbol.map
    @@ -56,9 +56,27 @@ FBSDprivate_1.0 {
     	__siglongjmp;
     	__sys_vfork;
     	_vfork;
    -	end;		/* XXX - Should this be _end (see sys/brk.S)? */
    -	curbrk;
    +	_end;
    +	__curbrk;
     	minbrk;
     	_brk;
     	_sbrk;
    +
    +	/* softfloat */
    +	__addsf3;
    +	__adddf3;
    +	__subsf3;
    +	__subdf3;
    +	__mulsf3;
    +	__muldf3;
    +	__divsf3;
    +	__divdf3;
    +	__floatsisf;
    +	__floatsidf;
    +	__fixsfsi;
    +	__fixdfsi;
    +	__fixunssfsi;
    +	__fixunsdfsi;
    +	__extendsfdf2;
    +	__truncdfsf2;
     };
    diff --git a/lib/libc/mips/gen/fpgetmask.c b/lib/libc/mips/gen/hardfloat/fpgetmask.c
    similarity index 100%
    rename from lib/libc/mips/gen/fpgetmask.c
    rename to lib/libc/mips/gen/hardfloat/fpgetmask.c
    diff --git a/lib/libc/mips/gen/fpgetround.c b/lib/libc/mips/gen/hardfloat/fpgetround.c
    similarity index 100%
    rename from lib/libc/mips/gen/fpgetround.c
    rename to lib/libc/mips/gen/hardfloat/fpgetround.c
    diff --git a/lib/libc/mips/gen/fpgetsticky.c b/lib/libc/mips/gen/hardfloat/fpgetsticky.c
    similarity index 100%
    rename from lib/libc/mips/gen/fpgetsticky.c
    rename to lib/libc/mips/gen/hardfloat/fpgetsticky.c
    diff --git a/lib/libc/mips/gen/fpsetmask.c b/lib/libc/mips/gen/hardfloat/fpsetmask.c
    similarity index 100%
    rename from lib/libc/mips/gen/fpsetmask.c
    rename to lib/libc/mips/gen/hardfloat/fpsetmask.c
    diff --git a/lib/libc/mips/gen/fpsetround.c b/lib/libc/mips/gen/hardfloat/fpsetround.c
    similarity index 100%
    rename from lib/libc/mips/gen/fpsetround.c
    rename to lib/libc/mips/gen/hardfloat/fpsetround.c
    diff --git a/lib/libc/mips/gen/fpsetsticky.c b/lib/libc/mips/gen/hardfloat/fpsetsticky.c
    similarity index 100%
    rename from lib/libc/mips/gen/fpsetsticky.c
    rename to lib/libc/mips/gen/hardfloat/fpsetsticky.c
    diff --git a/lib/libc/mips/sys/brk.S b/lib/libc/mips/sys/brk.S
    index 580d7fa5ed30..aeaf7912f351 100644
    --- a/lib/libc/mips/sys/brk.S
    +++ b/lib/libc/mips/sys/brk.S
    @@ -42,15 +42,12 @@ __FBSDID("$FreeBSD$");
     #endif /* LIBC_SCCS and not lint */
     
     	.globl	_C_LABEL(minbrk)
    -	.globl	_C_LABEL(curbrk)
    +	.globl	_C_LABEL(__curbrk)
     	.globl	_C_LABEL(_end)
     
     	.data
     _C_LABEL(minbrk):
     	.word	_C_LABEL(_end)
    -_C_LABEL(curbrk):
    -	.word	_C_LABEL(_end)
    -	.text
     
     LEAF(__sys_brk)
     	WEAK_ALIAS(brk, __sys_brk)
    @@ -67,7 +64,7 @@ LEAF(__sys_brk)
     	li	v0, SYS_break
     	syscall
     	bne	a3, zero, 2f
    -	sw	a0, _C_LABEL(curbrk)
    +	sw	a0, _C_LABEL(__curbrk)
     	move	v0, zero
     	j	ra
     2:
    diff --git a/lib/libc/mips/sys/ptrace.S b/lib/libc/mips/sys/ptrace.S
    index 86bc1e59caa9..09b82c5255f9 100644
    --- a/lib/libc/mips/sys/ptrace.S
    +++ b/lib/libc/mips/sys/ptrace.S
    @@ -42,14 +42,26 @@ __FBSDID("$FreeBSD$");
     #endif /* LIBC_SCCS and not lint */
     
     LEAF(ptrace)
    +	.frame	sp, 40, ra
    +	.mask	0x80000000, -8
     #ifdef __ABICALLS__
     	.set    noreorder
     	.cpload t9
     	.set    reorder
    +#endif
    +	subu	sp, sp, 40
    +	sw	ra,  32(sp)
    +#ifdef __ABICALLS__
    +	.cprestore 16
     #endif
     	la	t9, _C_LABEL(__error)	# locate address of errno
     	jalr	t9
    +#ifdef __ABICALLS__
    +	lw	gp, 16(sp)
    +#endif
     	sw	zero, 0(v0)
    +	lw	ra, 32(sp)
    +	addu	sp, sp, 40
     	li	v0, SYS_ptrace
     	syscall
     	bne	a3, zero, 1f
    diff --git a/lib/libc/net/gai_strerror.c b/lib/libc/net/gai_strerror.c
    index 5611559cfe0c..4f60f2db3917 100644
    --- a/lib/libc/net/gai_strerror.c
    +++ b/lib/libc/net/gai_strerror.c
    @@ -30,7 +30,17 @@
     #include 
     __FBSDID("$FreeBSD$");
     
    +#include "namespace.h"
     #include 
    +#if defined(NLS)
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include "reentrant.h"
    +#endif
    +#include "un-namespace.h"
     
     /* Entries EAI_ADDRFAMILY (1) and EAI_NODATA (7) are obsoleted, but left */
     /* for backward compatibility with userland code prior to 2553bis-02 */
    @@ -52,9 +62,57 @@ static const char *ai_errlist[] = {
     	"Argument buffer overflow"			/* EAI_OVERFLOW */
     };
     
    +#if defined(NLS)
    +static char		gai_buf[NL_TEXTMAX];
    +static once_t		gai_init_once = ONCE_INITIALIZER;
    +static thread_key_t	gai_key;
    +static int		gai_keycreated = 0;
    +
    +static void
    +gai_keycreate(void)
    +{
    +	gai_keycreated = (thr_keycreate(&gai_key, free) == 0);
    +}
    +#endif
    +
     const char *
     gai_strerror(int ecode)
     {
    +#if defined(NLS)
    +	nl_catd catd;
    +	char *buf;
    +
    +	if (thr_main() != 0)
    +		buf = gai_buf;
    +	else {
    +		if (thr_once(&gai_init_once, gai_keycreate) != 0 ||
    +		    !gai_keycreated)
    +			goto thr_err;
    +		if ((buf = thr_getspecific(gai_key)) == NULL) {
    +			if ((buf = malloc(sizeof(gai_buf))) == NULL)
    +				goto thr_err;
    +			if (thr_setspecific(gai_key, buf) != 0) {
    +				free(buf);
    +				goto thr_err;
    +			}
    +		}
    +	}
    +
    +	catd = catopen("libc", NL_CAT_LOCALE);
    +	if (ecode > 0 && ecode < EAI_MAX)
    +		strlcpy(buf, catgets(catd, 3, ecode, ai_errlist[ecode]),
    +		    sizeof(gai_buf));
    +	else if (ecode == 0)
    +		strlcpy(buf, catgets(catd, 3, NL_MSGMAX - 1, "Success"),
    +		    sizeof(gai_buf));
    +	else
    +		strlcpy(buf, catgets(catd, 3, NL_MSGMAX, "Unknown error"),
    +		    sizeof(gai_buf));
    +	catclose(catd);
    +	return buf;
    +
    +thr_err:
    +#endif
     	if (ecode >= 0 && ecode < EAI_MAX)
     		return ai_errlist[ecode];
     	return "Unknown error";
    diff --git a/lib/libc/net/getnameinfo.c b/lib/libc/net/getnameinfo.c
    index 0b595866adda..ffd34a137ec2 100644
    --- a/lib/libc/net/getnameinfo.c
    +++ b/lib/libc/net/getnameinfo.c
    @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    +#include 
     #include 
     #include 
     #include 
    @@ -385,6 +386,7 @@ getnameinfo_link(const struct sockaddr *sa, socklen_t salen,
     {
     	const struct sockaddr_dl *sdl =
     	    (const struct sockaddr_dl *)(const void *)sa;
    +	const struct fw_hwaddr *iha;
     	int n;
     
     	if (serv != NULL && servlen > 0)
    @@ -400,6 +402,15 @@ getnameinfo_link(const struct sockaddr *sa, socklen_t salen,
     	}
     
     	switch (sdl->sdl_type) {
    +	case IFT_IEEE1394:
    +		if (sdl->sdl_alen < sizeof(iha->sender_unique_ID_hi) +
    +		    sizeof(iha->sender_unique_ID_lo))
    +			return EAI_FAMILY;
    +		iha = (const struct fw_hwaddr *)(const void *)LLADDR(sdl);
    +		return hexname((const u_int8_t *)&iha->sender_unique_ID_hi,
    +		    sizeof(iha->sender_unique_ID_hi) +
    +		    sizeof(iha->sender_unique_ID_lo),
    +		    host, hostlen);
     	/*
     	 * The following have zero-length addresses.
     	 * IFT_ATM	(net/if_atmsubr.c)
    diff --git a/lib/libc/net/ip6opt.c b/lib/libc/net/ip6opt.c
    index 7b65d0607ce0..d999fd48fba9 100644
    --- a/lib/libc/net/ip6opt.c
    +++ b/lib/libc/net/ip6opt.c
    @@ -55,8 +55,7 @@ static void inet6_insert_padopt(u_char *p, int len);
      * byte, the length byte, and the option data.
      */
     int
    -inet6_option_space(nbytes)
    -	int nbytes;
    +inet6_option_space(int nbytes)
     {
     	nbytes += 2;	/* we need space for nxt-hdr and length fields */
     	return(CMSG_SPACE((nbytes + 7) & ~7));
    @@ -68,10 +67,7 @@ inet6_option_space(nbytes)
      * success or -1 on an error.
      */
     int
    -inet6_option_init(bp, cmsgp, type)
    -	void *bp;
    -	struct cmsghdr **cmsgp;
    -	int type;
    +inet6_option_init(void *bp, struct cmsghdr **cmsgp, int type)
     {
     	struct cmsghdr *ch = (struct cmsghdr *)bp;
     
    @@ -98,11 +94,8 @@ inet6_option_init(bp, cmsgp, type)
      * earlier.  It must have a value between 0 and 7, inclusive.
      */
     int
    -inet6_option_append(cmsg, typep, multx, plusy)
    -	struct cmsghdr *cmsg;
    -	const u_int8_t *typep;
    -	int multx;
    -	int plusy;
    +inet6_option_append(struct cmsghdr *cmsg, const u_int8_t *typep, int multx,
    +    int plusy)
     {
     	int padlen, optlen, off;
     	u_char *bp = (u_char *)cmsg + cmsg->cmsg_len;
    @@ -171,11 +164,7 @@ inet6_option_append(cmsg, typep, multx, plusy)
      * 
      */
     u_int8_t *
    -inet6_option_alloc(cmsg, datalen, multx, plusy)
    -	struct cmsghdr *cmsg;
    -	int datalen;
    -	int multx;
    -	int plusy;
    +inet6_option_alloc(struct cmsghdr *cmsg, int datalen, int multx, int plusy)
     {
     	int padlen, off;
     	u_int8_t *bp = (u_char *)cmsg + cmsg->cmsg_len;
    @@ -238,9 +227,7 @@ inet6_option_alloc(cmsg, datalen, multx, plusy)
      * (RFC 2292, 6.3.5)
      */
     int
    -inet6_option_next(cmsg, tptrp)
    -	const struct cmsghdr *cmsg;
    -	u_int8_t **tptrp;
    +inet6_option_next(const struct cmsghdr *cmsg, u_int8_t **tptrp)
     {
     	struct ip6_ext *ip6e;
     	int hdrlen, optlen;
    @@ -296,10 +283,7 @@ inet6_option_next(cmsg, tptrp)
      *       it's a typo. The variable should be type of u_int8_t **.
      */
     int
    -inet6_option_find(cmsg, tptrp, type)
    -	const struct cmsghdr *cmsg;
    -	u_int8_t **tptrp;
    -	int type;
    +inet6_option_find(const struct cmsghdr *cmsg, u_int8_t **tptrp, int type)
     {
     	struct ip6_ext *ip6e;
     	int hdrlen, optlen;
    @@ -352,8 +336,7 @@ inet6_option_find(cmsg, tptrp, type)
      * calculated length and the limitation of the buffer.
      */
     static int
    -ip6optlen(opt, lim)
    -	u_int8_t *opt, *lim;
    +ip6optlen(u_int8_t *opt, u_int8_t *lim)
     {
     	int optlen;
     
    diff --git a/lib/libc/net/sctp_bindx.3 b/lib/libc/net/sctp_bindx.3
    index a2a260008bf3..d0471267f988 100644
    --- a/lib/libc/net/sctp_bindx.3
    +++ b/lib/libc/net/sctp_bindx.3
    @@ -90,7 +90,7 @@ The call returns 0 on success and -1 upon failure.
     .Sh ERRORS
     The
     .Fn sctp_bindx
    -can return the following errors.
    +function can return the following errors:
     .Bl -tag -width Er
     .It Bq Er EINVAL
     This value is returned if the
    diff --git a/lib/libc/net/sctp_connectx.3 b/lib/libc/net/sctp_connectx.3
    index 7b75f4ad300c..d454bb9f5ba6 100644
    --- a/lib/libc/net/sctp_connectx.3
    +++ b/lib/libc/net/sctp_connectx.3
    @@ -44,7 +44,7 @@
     .In sys/socket.h
     .In netinet/sctp.h
     .Ft int
    -.Fn sctp_connectx "int s" "struct sockaddr *" "int addrcnt" "sctp_assoc_t *"
    +.Fn sctp_connectx "int sd" "struct sockaddr *addrs" "int addrcnt" "sctp_assoc_t *id"
     .Sh DESCRIPTION
     The
     .Fn sctp_connectx
    @@ -75,7 +75,7 @@ the extra addresses sent in the
     call will be silently discarded from the association.
     On
     successful completion the provided
    -.Fa "sctp_assoc_t *"
    +.Fa id
     will be
     filled in with the association identification of the newly
     forming association.
    @@ -84,7 +84,7 @@ The call returns 0 on success and -1 upon failure.
     .Sh ERRORS
     The
     .Fn sctp_connectx
    -can return the following errors.
    +function can return the following errors:
     .Bl -tag -width Er
     .It Bq Er EINVAL
     An address listed has an invalid family or no
    diff --git a/lib/libc/net/sctp_getaddrlen.3 b/lib/libc/net/sctp_getaddrlen.3
    index 325e2b0365cd..ac7bfb375ac4 100644
    --- a/lib/libc/net/sctp_getaddrlen.3
    +++ b/lib/libc/net/sctp_getaddrlen.3
    @@ -76,7 +76,7 @@ system expects for the specific address family or -1.
     .Sh ERRORS
     The
     .Fn sctp_getaddrlen
    -function can return the following errors.
    +function can return the following errors:
     .Bl -tag -width Er
     .It Bq Er EINVAL
     The address family specified does NOT exist.
    diff --git a/lib/libc/net/sctp_getassocid.3 b/lib/libc/net/sctp_getassocid.3
    index ee0926a8cbaa..909b9c773442 100644
    --- a/lib/libc/net/sctp_getassocid.3
    +++ b/lib/libc/net/sctp_getassocid.3
    @@ -58,7 +58,7 @@ The call returns the association id upon success and
     .Sh ERRORS
     The
     .Fn sctp_getassocid
    -function can return the following errors.
    +function can return the following errors:
     .Bl -tag -width Er
     .It Bq Er ENOENT
     The address does not have an association setup to it.
    diff --git a/lib/libc/net/sctp_getpaddrs.3 b/lib/libc/net/sctp_getpaddrs.3
    index 9f6d632cd03d..6ad5ea03176b 100644
    --- a/lib/libc/net/sctp_getpaddrs.3
    +++ b/lib/libc/net/sctp_getpaddrs.3
    @@ -33,7 +33,7 @@
     .\" $FreeBSD$
     .\"
     .Dd December 15, 2006
    -.Dt SCTP_GETPADDR 3
    +.Dt SCTP_GETPADDRS 3
     .Os
     .Sh NAME
     .Nm sctp_getpaddrs ,
    @@ -64,7 +64,7 @@ array of socket addresses returned in the argument
     .Fa addrs
     upon success.
     .Pp
    -After the caller is through the function
    +After the caller is finished, the function
     .Fn sctp_freepaddrs
     or
     .Fn sctp_freeladdrs
    @@ -76,7 +76,7 @@ the number of addresses returned in
     .Fa addrs
     upon success.
     .Sh ERRORS
    -The functions can return the following errors.
    +The functions can return the following errors:
     .Bl -tag -width Er
     .It Bq Er EINVAL
     An address listed has an invalid family or no
    diff --git a/lib/libc/net/sctp_opt_info.3 b/lib/libc/net/sctp_opt_info.3
    index 560b3e47051e..f01061336779 100644
    --- a/lib/libc/net/sctp_opt_info.3
    +++ b/lib/libc/net/sctp_opt_info.3
    @@ -45,7 +45,7 @@
     .In sys/socket.h
     .In netinet/sctp.h
     .Ft int
    -.Fn sctp_opt_info "int s" "sctp_assoc_t" "int opt" "void *arg" "socklen_t *size"
    +.Fn sctp_opt_info "int sd" "sctp_assoc_t id" "int opt" "void *arg" "socklen_t *size"
     .Sh DESCRIPTION
     The
     .Fn sctp_opt_info
    @@ -87,10 +87,12 @@ socket options.
     .Dv SCTP_PEER_AUTH_CHUNKS
     .Pp
     .Dv SCTP_LOCAL_AUTH_CHUNKS
    +.Sh RETURN VALUES
    +The call returns 0 on success and -1 upon error.
     .Sh ERRORS
     The
     .Fn sctp_opt_info
    -function can return the following errors.
    +function can return the following errors:
     .Bl -tag -width Er
     .It Bq Er EINVAL
     The argument
    diff --git a/lib/libc/net/sctp_recvmsg.3 b/lib/libc/net/sctp_recvmsg.3
    index b9ccfb8c0d8e..a5926bfe09a6 100644
    --- a/lib/libc/net/sctp_recvmsg.3
    +++ b/lib/libc/net/sctp_recvmsg.3
    @@ -160,7 +160,7 @@ struct sctp_sndrcvinfo {
     .Pp
     The
     .Fa sinfo->sinfo_ppid
    -is an opaque 32 bit value that is passed transparently
    +field is an opaque 32 bit value that is passed transparently
     through the stack from the peer endpoint. 
     Note that the stack passes this value without regard to byte
     order.
    @@ -180,12 +180,13 @@ as soon as possible.
     When this flag is absent the message
     was delivered in order within the stream it was received.
     .Pp
    +The
     .Fa sinfo->sinfo_stream
    -is the SCTP stream that the message was received on. 
    +field is the SCTP stream that the message was received on. 
     Streams in SCTP are reliable (or partially reliable) flows of ordered
     messages.
     .Pp
    -The 
    +The
     .Fa sinfo->sinfo_context
     field is used only if the local application set an association level
     context with the
    @@ -197,7 +198,7 @@ association.
     .Pp
     The
     .Fa sinfo->sinfo_ssn
    -will hold the stream sequence number assigned
    +field will hold the stream sequence number assigned
     by the peer endpoint if the message is
     .Em not
     unordered.
    @@ -205,7 +206,7 @@ For unordered messages this field holds an undefined value.
     .Pp
     The
     .Fa sinfo->sinfo_tsn
    -holds a transport sequence number (TSN) that was assigned
    +field holds a transport sequence number (TSN) that was assigned
     to this message by the peer endpoint.
     For messages that fit in or less
     than the path MTU this will be the only TSN assigned.
    @@ -215,12 +216,12 @@ message.
     .Pp
     The
     .Fa sinfo->sinfo_cumtsn
    -holds the current cumulative acknowledgment point of
    +field holds the current cumulative acknowledgment point of
     the transport association.
     Note that this may be larger
     or smaller than the TSN assigned to the message itself.
     .Pp
    -The 
    +The
     .Fa sinfo->sinfo_assoc_id
     is the unique association identification that was assigned
     to the association.
    @@ -232,10 +233,10 @@ setting various socket options on the specific association
     (see 
     .Xr sctp 4 ) .
     .Pp
    -The 
    +The
     .Fa sinfo->info_timetolive
     field is not used by 
    -.Fa sctp_recvmsg .
    +.Fn sctp_recvmsg .
     .Sh RETURN VALUES
     The call returns the number of characters sent, or -1
     if an error occurred.
    @@ -268,7 +269,7 @@ This generally indicates that the interface has stopped sending,
     but may be caused by transient congestion.
     .It Bq Er EHOSTUNREACH
     The remote host was unreachable.
    -.It Bq Er ENOTCON
    +.It Bq Er ENOTCONN
     On a one-to-one style socket no association exists.
     .It Bq Er ECONNRESET
     An abort was received by the stack while the user was
    diff --git a/lib/libc/net/sctp_send.3 b/lib/libc/net/sctp_send.3
    index 230173024f03..8a4142cc7c2b 100644
    --- a/lib/libc/net/sctp_send.3
    +++ b/lib/libc/net/sctp_send.3
    @@ -111,7 +111,7 @@ The
     argument is an opaque 32 bit value that is passed transparently
     through the stack to the peer endpoint. It will be available on
     reception of a message (see
    -.Xr sctp_recvmsg 2 ) .
    +.Xr sctp_recvmsg 3 ) .
     Note that the stack passes this value without regard to byte
     order.
     .Pp
    @@ -294,7 +294,7 @@ if an error occurred.
     The
     .Fn sctp_send
     system call
    -fail if:
    +fails if:
     .Bl -tag -width Er
     .It Bq Er EBADF
     An invalid descriptor was specified.
    @@ -319,7 +319,7 @@ This generally indicates that the interface has stopped sending,
     but may be caused by transient congestion.
     .It Bq Er EHOSTUNREACH
     The remote host was unreachable.
    -.It Bq Er ENOTCON
    +.It Bq Er ENOTCONN
     On a one-to-one style socket no association exists.
     .It Bq Er ECONNRESET
     An abort was received by the stack while the user was
    diff --git a/lib/libc/net/sctp_sendmsg.3 b/lib/libc/net/sctp_sendmsg.3
    index 61eec224cadd..c54aaefee623 100644
    --- a/lib/libc/net/sctp_sendmsg.3
    +++ b/lib/libc/net/sctp_sendmsg.3
    @@ -103,13 +103,13 @@ is set to
     the message is not transmitted.
     .Pp
     No indication of failure to deliver is implicit in a
    -.Xr sctp_sendmsg 2
    +.Xr sctp_sendmsg 3
     call.
     Locally detected errors are indicated by a return value of -1.
     .Pp
     If no space is available at the socket to hold
     the message to be transmitted, then
    -.Xr sctp_sendmsg 2
    +.Xr sctp_sendmsg 3
     normally blocks, unless the socket has been placed in
     non-blocking I/O mode.
     The
    @@ -123,7 +123,7 @@ argument is an opaque 32 bit value that is passed transparently
     through the stack to the peer endpoint.
     It will be available on
     reception of a message (see
    -.Xr sctp_recvmsg 2 ) .
    +.Xr sctp_recvmsg 3 ) .
     Note that the stack passes this value without regard to byte
     order.
     .Pp
    @@ -271,7 +271,7 @@ if an error occurred.
     The
     .Fn sctp_sendmsg
     system call
    -fail if:
    +fails if:
     .Bl -tag -width Er
     .It Bq Er EBADF
     An invalid descriptor was specified.
    @@ -296,7 +296,7 @@ This generally indicates that the interface has stopped sending,
     but may be caused by transient congestion.
     .It Bq Er EHOSTUNREACH
     The remote host was unreachable.
    -.It Bq Er ENOTCON
    +.It Bq Er ENOTCONN
     On a one-to-one style socket no association exists.
     .It Bq Er ECONNRESET
     An abort was received by the stack while the user was
    @@ -324,7 +324,7 @@ is not connected and is a one-to-one style socket.
     .Xr sendmsg 3 ,
     .Xr sctp 4
     .Sh BUGS
    -Because in the one-to-many style socket the
    +Because in the one-to-many style socket
     .Fn sctp_sendmsg 
     or
     .Fn sctp_sendmsgx
    diff --git a/lib/libc/net/sctp_sys_calls.c b/lib/libc/net/sctp_sys_calls.c
    index 715fcbd797fc..d876293146ac 100644
    --- a/lib/libc/net/sctp_sys_calls.c
    +++ b/lib/libc/net/sctp_sys_calls.c
    @@ -784,7 +784,7 @@ sctp_sendx(int sd, const void *msg, size_t msg_len,
     	free(buf);
     	if (ret != 0) {
     		if (errno == EALREADY) {
    -			no_end_cx = 1;;
    +			no_end_cx = 1;
     			goto continue_send;
     		}
     		return (ret);
    diff --git a/lib/libc/nls/C.msg b/lib/libc/nls/C.msg
    index aa2c4cc881ae..2210df6cc463 100644
    --- a/lib/libc/nls/C.msg
    +++ b/lib/libc/nls/C.msg
    @@ -181,6 +181,16 @@ $ ENOATTR
     87 Attribute not found
     $ EDOOFUS
     88 Programming error
    +$ EBADMSG
    +89 Bad message
    +$ EMULTIHOP
    +90 Multihop attempted
    +$ ENOLINK
    +91 Link has been severed
    +$ EPROTO
    +92 Protocol error
    +$ ENOTCAPABLE
    +93 Capabilities insufficient
     $
     $ strsignal() support catalog
     $
    @@ -247,3 +257,39 @@ $ SIGUSR1
     30 User defined signal 1
     $ SIGUSR2
     31 User defined signal 2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (obsolete)
    +1 Address family for hostname not supported
    +$ EAI_AGAIN
    +2 Temporary failure in name resolution
    +$ EAI_BADFLAGS
    +3 Invalid value for ai_flags
    +$ EAI_FAIL
    +4 Non-recoverable failure in name resolution
    +$ EAI_FAMILY
    +5 ai_family not supported
    +$ EAI_MEMORY
    +6 Memory allocation failure
    +$ 7 (obsolete)
    +7 No address associated with hostname
    +$ EAI_NONAME
    +8 hostname nor servname provided, or not known
    +$ EAI_SERVICE
    +9 servname not supported for ai_socktype
    +$ EAI_SOCKTYPE
    +10 ai_socktype not supported
    +$ EAI_SYSTEM
    +11 System error returned in errno
    +$ EAI_BADHINTS
    +12 Invalid value for hints
    +$ EAI_PROTOCOL
    +13 Resolved protocol is unknown
    +$ EAI_OVERFLOW
    +14 Argument buffer overflow
    +$ 0
    +32766 Success
    +$ NL_MSGMAX
    +32767 Unknown error
    diff --git a/lib/libc/nls/Makefile.inc b/lib/libc/nls/Makefile.inc
    index 9e19e854eba7..f5c6885ae042 100644
    --- a/lib/libc/nls/Makefile.inc
    +++ b/lib/libc/nls/Makefile.inc
    @@ -20,8 +20,11 @@ NLS+=	el_GR.ISO8859-7
     NLS+=	es_ES.ISO8859-1
     NLS+=	fi_FI.ISO8859-1
     NLS+=	fr_FR.ISO8859-1
    +NLS+=	gl_ES.ISO8859-1
     NLS+=	hu_HU.ISO8859-2
     NLS+=	it_IT.ISO8859-15
    +NLS+=	ja_JP.UTF-8
    +NLS+=	ja_JP.eucJP
     NLS+=	ko_KR.UTF-8
     NLS+=	ko_KR.eucKR
     NLS+=	mn_MN.UTF-8
    diff --git a/lib/libc/nls/es_ES.ISO8859-1.msg b/lib/libc/nls/es_ES.ISO8859-1.msg
    index 8fc9c7df2ac7..2687c177fd57 100644
    --- a/lib/libc/nls/es_ES.ISO8859-1.msg
    +++ b/lib/libc/nls/es_ES.ISO8859-1.msg
    @@ -62,7 +62,7 @@ $ EFBIG
     $ ENOSPC
     28 No queda espacio libre en el dispositivo
     $ ESPIPE
    -29 Illegal seek
    +29 Búsqueda ilegal
     $ EROFS
     30 Sistema de ficheros de solo lectura
     $ EMLINK
    @@ -88,7 +88,7 @@ $ EMSGSIZE
     $ EPROTOTYPE
     41 Tipo erróneo de protocolo para el socket
     $ ENOPROTOOPT
    -42 protocolo no disponible
    +42 Protocolo no disponible
     $ EPROTONOSUPPORT
     43 Protocolo no contemplado
     $ ESOCKTNOSUPPORT
    @@ -176,23 +176,33 @@ $ EOVERFLOW
     $ ECANCELED
     85 Operación cancelada
     $ EILSEQ
    -86 Illegal byte sequence
    +86 Secuencia de bytes ilegal
     $ ENOATTR
     87 Atributo no encontrado
     $ EDOOFUS
     88 Error de programación
    +$ EBADMSG
    +89 Mensaje inválido
    +$ EMULTIHOP
    +90 Intento de hop multiple
    +$ ENOLINK
    +91 El enlace se ha roto
    +$ EPROTO
    +92 Fallo de protocolo
    +$ ENOTCAPABLE
    +93 Habilidades insuficientes
     $
     $ strsignal() support catalog
     $
     $set 2
     $ SIGHUP
    -1 Fín de línea (Hangup)
    +1 Fin de línea (Hangup)
     $ SIGINT
     2 Interrumpido
     $ SIGQUIT
     3 Terminado
     $ SIGILL
    -4 Illegal instruction
    +4 Instrucción ilegal
     $ SIGTRAP
     5 Trace/BPT trap
     $ SIGABRT
    @@ -247,3 +257,39 @@ $ SIGUSR1
     30 Señal definida por el usuario n1
     $ SIGUSR2
     31 Señal definida por el usuario n2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (obsoleto)
    +1 Tipo de dirección no contemplado
    +$ EAI_AGAIN
    +2 Error transitorio en la resolución de nombres
    +$ EAI_BADFLAGS
    +3 Valor inválido de ai_flags
    +$ EAI_FAIL
    +4 Error no recuperable en la resolución de nombres
    +$ EAI_FAMILY
    +5 ai_family no contemplado
    +$ EAI_MEMORY
    +6 Error en la asignación de memoria
    +$ 7 (obsoleto)
    +7 No hay dirección asociada con el nombre de máquina
    +$ EAI_NONAME
    +8 No se dispone nombre de máquina, ni nombre de servicio
    +$ EAI_SERVICE
    +9 Nombre de servicio no contemplado en ai_socktype
    +$ EAI_SOCKTYPE
    +10 ai_socktype no contemplado
    +$ EAI_SYSTEM
    +11 Error de sistema devuelto en errno
    +$ EAI_BADHINTS
    +12 Valor inválido de hints
    +$ EAI_PROTOCOL
    +13 Protocolo resuelto desconocido
    +$ EAI_OVERFLOW
    +14 Búfer de argumentos sobrepasado
    +$ 0
    +32766 Éxito
    +$ NL_MSGMAX
    +32767 Error desconocido
    diff --git a/lib/libc/nls/gl_ES.ISO8859-1.msg b/lib/libc/nls/gl_ES.ISO8859-1.msg
    new file mode 100644
    index 000000000000..4255dc8a959a
    --- /dev/null
    +++ b/lib/libc/nls/gl_ES.ISO8859-1.msg
    @@ -0,0 +1,295 @@
    +$ $FreeBSD$
    +$
    +$ Message catalog for gl_ES.ISO8859-1 locale
    +$
    +$ strerror() support catalog
    +$
    +$set 1
    +$ EPERM
    +1 Operación non permitida
    +$ ENOENT
    +2 Ficheiro ou directorio inexistente
    +$ ESRCH
    +3 Proceso inexistente
    +$ EINTR
    +4 Chamada do sistema interrompida
    +$ EIO
    +5 Erro de Entrada/Saída
    +$ ENXIO
    +6 Dispositivo non configurado
    +$ E2BIG
    +7 A lista de argumentos é demasiado larga
    +$ ENOEXEC
    +8 Erro no formato do executable
    +$ EBADF
    +9 Descriptor incorrecto de ficheiro
    +$ ECHILD
    +10 Non hai procesos fillos
    +$ EDEADLK
    +11 Evitouse o bloqueo do recurso
    +$ ENOMEM
    +12 Non se puido asignar memoria
    +$ EACCES
    +13 Permiso denegado
    +$ EFAULT
    +14 Dirección incorrecta
    +$ ENOTBLK
    +15 Precísase un dispositivo de bloques
    +$ EBUSY
    +16 Dispositivo ocupado
    +$ EEXIST
    +17 O ficheiro xa existe
    +$ EXDEV
    +18 Enlace entre dispositivos
    +$ ENODEV
    +19 Operación inadecuada para este dispositivo
    +$ ENOTDIR
    +20 Non é un directorio
    +$ EISDIR
    +21 É un directorio
    +$ EINVAL
    +22 Argumento inadecuado
    +$ ENFILE
    +23 Hai demasiados ficheiros abertos no sistema
    +$ EMFILE
    +24 Hai demasiados ficheiros abertos
    +$ ENOTTY
    +25 ioctl inapropiado para o dispositivo
    +$ ETXTBSY
    +26 Ficheiro de texto ocupado
    +$ EFBIG
    +27 Ficheiro demasiado grande
    +$ ENOSPC
    +28 Non queda espacio libre no dispositivo
    +$ ESPIPE
    +29 seek inválido
    +$ EROFS
    +30 Sistema de ficheiros de só lectura
    +$ EMLINK
    +31 Demasiados enlaces
    +$ EPIPE
    +32 Canal (pipe) roto
    +$ EDOM
    +33 Argumento numérico fóra de rango
    +$ ERANGE
    +34 O resultado é demasiado grande
    +$ EAGAIN, EWOULDBLOCK
    +35 O recurso non está dispoñible temporalmente
    +$ EINPROGRESS
    +36 Operación en proceso
    +$ EALREADY
    +37 A operación xa estase executando
    +$ ENOTSOCK
    +38 Operación de socket inaceptable para o dispositivo
    +$ EDESTADDRREQ
    +39 Precísase unha dirección de destino
    +$ EMSGSIZE
    +40 Mensaxe demasiado largo
    +$ EPROTOTYPE
    +41 Tipo malo de protocolo para o socket
    +$ ENOPROTOOPT
    +42 Protocolo non dispoñible
    +$ EPROTONOSUPPORT
    +43 Protocolo non contemplado
    +$ ESOCKTNOSUPPORT
    +44 Tipo de socket non contemplado
    +$ EOPNOTSUPP
    +45 Operación non contemplada
    +$ EPFNOSUPPORT
    +46 Familia de protocolos non contemplada
    +$ EAFNOSUPPORT
    +47 Familia de direcciones non contemplada pola familia de protocolos
    +$ EADDRINUSE
    +48 A dirección xa está en uso
    +$ EADDRNOTAVAIL
    +49 Non se puido asignar a dirección requerida
    +$ ENETDOWN
    +50 A rede non funciona
    +$ ENETUNREACH
    +51 Non se puido acceder á rede
    +$ ENETRESET
    +52 A conexión de rede interrompiuse ao reinicializar
    +$ ECONNABORTED
    +53 Conexión perdida por problemas no software
    +$ ECONNRESET
    +54 O interlocutor reinicializou a conexión
    +$ ENOBUFS
    +55 Non queda espacio no búfer
    +$ EISCONN
    +56 O socket xa estaba conectado
    +$ ENOTCONN
    +57 O socket non está conectado
    +$ ESHUTDOWN
    +58 Non se pode enviar tras a desconexión do socket
    +$ ETOOMANYREFS
    +59 Demasiadas referencias: non poden unirse
    +$ ETIMEDOUT
    +60 O tempo de conexión expirou
    +$ ECONNREFUSED
    +61 Conexión rexeitada
    +$ ELOOP
    +62 Demasiados niveles de enlaces simbólicos
    +$ ENAMETOOLONG
    +63 Nome de ficheiro demasiado largo
    +$ EHOSTDOWN
    +64 A máquina está fóra de servicio
    +$ EHOSTUNREACH
    +65 Non hai ruta ata a máquina
    +$ ENOTEMPTY
    +66 Directorio non baleiro
    +$ EPROCLIM
    +67 Demasiados procesos
    +$ EUSERS
    +68 Demasiados usuarios
    +$ EDQUOT
    +69 Cuota de disco sobrepasada
    +$ ESTALE
    +70 Descriptor de ficheiro NFS inválido
    +$ EREMOTE
    +71 Ruta con demasiados niveles
    +$ EBADRPC
    +72 A estructura da RPC é mala
    +$ ERPCMISMATCH
    +73 A versión da RPC é mala
    +$ EPROGUNAVAIL
    +74 A RPC non está accesible
    +$ EPROGMISMATCH
    +75 Versión mala do programa
    +$ EPROCUNAVAIL
    +76 Procedemento malo para o programa
    +$ ENOLCK
    +77 Non hai bloqueos dispoñibles
    +$ ENOSYS
    +78 Función non realizada
    +$ EFTYPE
    +79 Tipo de ficheiro ou formato inapropiado
    +$ EAUTH
    +80 Erro de autenticación
    +$ ENEEDAUTH
    +81 Precísase un autenticador
    +$ EIDRM
    +82 Identificador eliminado
    +$ ENOMSG
    +83 Non hai mensaxes do tipo desexado
    +$ EOVERFLOW
    +84 Valor demasiado grande para se almacenar no tipo desexado
    +$ ECANCELED
    +85 Operación cancelada
    +$ EILSEQ
    +86 Secuencia inválida de byte
    +$ ENOATTR
    +87 Atributo non encontrado
    +$ EDOOFUS
    +88 Erro de programación
    +$ EBADMSG
    +89 Mensaxe inválido
    +$ EMULTIHOP
    +90 Intento de Multihop
    +$ ENOLINK
    +91 Enlace fortaleceuse
    +$ EPROTO
    +92 Erro de protocolo
    +$ ENOTCAPABLE
    +93 Habilidades non suficientes
    +$
    +$ strsignal() support catalog
    +$
    +$set 2
    +$ SIGHUP
    +1 Fin de liña (Hangup)
    +$ SIGINT
    +2 Interrompido
    +$ SIGQUIT
    +3 Terminado
    +$ SIGILL
    +4 Instrucción inválida
    +$ SIGTRAP
    +5 Trace/BPT trap
    +$ SIGABRT
    +6 Abort trap
    +$ SIGEMT
    +7 EMT trap
    +$ SIGFPE
    +8 Excepción de coma flotante
    +$ SIGKILL
    +9 Matado
    +$ SIGBUS
    +10 Erro no bus
    +$ SIGSEGV
    +11 Fallo de segmentación
    +$ SIGSYS
    +12 Chamada ao sistema mala
    +$ SIGPIPE
    +13 Canal (pipe) roto
    +$ SIGALRM
    +14 Alarma do reloxo
    +$ SIGTERM
    +15 Terminado
    +$ SIGURG
    +16 Condición urxente de E/S
    +$ SIGSTOP
    +17 Detido (sinal)
    +$ SIGTSTP
    +18 Detido
    +$ SIGCONT
    +19 Continuando
    +$ SIGCHLD
    +20 Proceso fillo terminado
    +$ SIGTTIN
    +21 Detido (entrada tty)
    +$ SIGTTOU
    +22 Detido (sída tty)
    +$ SIGIO
    +23 E/S posible
    +$ SIGXCPU
    +24 Sobrepasouse o tempo límite da CPU
    +$ SIGXFSZ
    +25 Sobrepasouse o límite de tamaño de ficheiro
    +$ SIGVTALRM
    +26 Temporizador virtual caducado
    +$ SIGPROF
    +27 Temporizador de perfilación caducado
    +$ SIGWINCH
    +28 Cambios no tamaño de xanela
    +$ SIGINFO
    +29 Petición de información
    +$ SIGUSR1
    +30 Sinal definida polo usuario no. 1
    +$ SIGUSR2
    +31 Sinal definida polo usuario no. 2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (obsoleto)
    +1 Tipo de dirección non soportado
    +$ EAI_AGAIN
    +2 Erro temporal na resolución de nomes
    +$ EAI_BADFLAGS
    +3 Valor inválido de ai_flags
    +$ EAI_FAIL
    +4 Erro non recuperable na resolución de nomes
    +$ EAI_FAMILY
    +5 ai_family non soportado
    +$ EAI_MEMORY
    +6 Erro na asignación de memoria
    +$ 7 (obsoleto)
    +7 Non hai dirección asociada co nome de máquina
    +$ EAI_NONAME
    +8 Non se dispón nome de máquina, nin nome de servizo
    +$ EAI_SERVICE
    +9 Nome de servizo non soportado en ai_socktype
    +$ EAI_SOCKTYPE
    +10 ai_socktype non soportado
    +$ EAI_SYSTEM
    +11 Erro de sistema devolto en errno
    +$ EAI_BADHINTS
    +12 Valor inválido de hints
    +$ EAI_PROTOCOL
    +13 Protocolo resolto descoñecido
    +$ EAI_OVERFLOW
    +14 Búfer de argumentos excedido
    +$ 0
    +32766 Éxito
    +$ NL_MSGMAX
    +32767 Erro descoñecido
    diff --git a/lib/libc/nls/hu_HU.ISO8859-2.msg b/lib/libc/nls/hu_HU.ISO8859-2.msg
    index 90b597b2c51d..330d486a7b8e 100644
    --- a/lib/libc/nls/hu_HU.ISO8859-2.msg
    +++ b/lib/libc/nls/hu_HU.ISO8859-2.msg
    @@ -181,6 +181,16 @@ $ ENOATTR
     87 Attribútum nem található
     $ EDOOFUS
     88 Programozási hiba
    +$ EBADMSG
    +89 Helytelen üzenet
    +$ EMULTIHOP
    +90 Multihop kísérlet
    +$ ENOLINK
    +91 A kapcsolat szigorítva lett
    +$ EPROTO
    +92 Protokol hiba
    +$ ENOTCAPABLE
    +93 Elégtelen képességek
     $
     $ strsignal() support catalog
     $
    @@ -247,3 +257,39 @@ $ SIGUSR1
     30 Felhasználói szignál 1
     $ SIGUSR2
     31 Felhasználói szignál 2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (elavult)
    +1 A hosztnévhez tartozó címcsalád nem támogatott
    +$ EAI_AGAIN
    +2 Ideiglenes hiba a névfeloldáskor
    +$ EAI_BADFLAGS
    +3 Érvénytelen ai_flags érték
    +$ EAI_FAIL
    +4 Nem helyreállítható hiba a névfeloldásban
    +$ EAI_FAMILY
    +5 ai_family nem támogatott
    +$ EAI_MEMORY
    +6 Memóriafoglalási hiba
    +$ 7 (elavult)
    +7 Nem tartozik cím í hosztnévhez
    +$ EAI_NONAME
    +8 Se hosztnév, se szolgáltatásnév nem áll rendelkezésre
    +$ EAI_SERVICE
    +9 Nem támogatott ai_socktype szolgáltatásnév
    +$ EAI_SOCKTYPE
    +10 ai_socktype nem támogatott
    +$ EAI_SYSTEM
    +11 Rendszerhiba jött vissza az errno változóban
    +$ EAI_BADHINTS
    +12 Érvénytelen hint érték
    +$ EAI_PROTOCOL
    +13 A feloldott protokol ismeretlen
    +$ EAI_OVERFLOW
    +14 Az argumentumok puffere túlcsordult
    +$ 0
    +32766 Siker
    +$ NL_MSGMAX
    +32767 Ismeretlen hiba
    diff --git a/lib/libc/nls/ja_JP.UTF-8.msg b/lib/libc/nls/ja_JP.UTF-8.msg
    new file mode 100644
    index 000000000000..6be65fbb5c0a
    --- /dev/null
    +++ b/lib/libc/nls/ja_JP.UTF-8.msg
    @@ -0,0 +1,295 @@
    +$ $FreeBSD$
    +$
    +$ Message catalog for ja_JP.UTF-8 locale
    +$
    +$ strerror() support catalog
    +$
    +$set 1
    +$ EPERM
    +1 許å¯ã•ã‚Œã¦ã„ãªã„æ“作ã§ã™
    +$ ENOENT
    +2 ãã®ã‚ˆã†ãªãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã‚ã‚Šã¾ã›ã‚“
    +$ ESRCH
    +3 ãã®ã‚ˆã†ãªãƒ—ロセスã¯ã‚ã‚Šã¾ã›ã‚“
    +$ EINTR
    +4 システムコールãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸ
    +$ EIO
    +5 入出力エラーã§ã™
    +$ ENXIO
    +6 デãƒã‚¤ã‚¹ãŒæº–å‚™ã•ã‚Œã¦ã„ã¾ã›ã‚“
    +$ E2BIG
    +7 引数ã®ãƒªã‚¹ãƒˆãŒé•·ã™ãŽã¾ã™
    +$ ENOEXEC
    +8 無効ãªå®Ÿè¡Œå½¢å¼ã§ã™
    +$ EBADF
    +9 無効ãªãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã§ã™
    +$ ECHILD
    +10 å­ãƒ—ロセスãŒã‚ã‚Šã¾ã›ã‚“
    +$ EDEADLK
    +11 リソースデッドロックを回é¿ã—ã¾ã—ãŸ
    +$ ENOMEM
    +12 メモリã®å‰²ã‚Šå½“ã¦ãŒã§ãã¾ã›ã‚“
    +$ EACCES
    +13 パーミッションãŒæ‹’絶ã•ã‚Œã¾ã—ãŸ
    +$ EFAULT
    +14 無効ãªã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™
    +$ ENOTBLK
    +15 ブロックデãƒã‚¤ã‚¹ãŒè¦æ±‚ã•ã‚Œã¦ã„ã¾ã™
    +$ EBUSY
    +16 デãƒã‚¤ã‚¹ãŒãƒ“ジー状態ã§ã™
    +$ EEXIST
    +17 ファイルãŒå­˜åœ¨ã—ã¾ã™
    +$ EXDEV
    +18 デãƒã‚¤ã‚¹ã‚’ã¾ãŸãリンクã§ã™
    +$ ENODEV
    +19 デãƒã‚¤ã‚¹ãŒå¯¾å¿œã—ã¦ãªã„æ“作ã§ã™
    +$ ENOTDIR
    +20 ディレクトリã§ã¯ã‚ã‚Šã¾ã›ã‚“
    +$ EISDIR
    +21 ディレクトリã§ã™
    +$ EINVAL
    +22 無効ãªå¼•æ•°ã§ã™
    +$ ENFILE
    +23 システム内ã§ã‚ªãƒ¼ãƒ—ンã•ã‚Œã¦ã„るファイルãŒå¤šã™ãŽã¾ã™
    +$ EMFILE
    +24 オープンã—ã¦ã„るファイルãŒå¤šã™ãŽã¾ã™
    +$ ENOTTY
    +25 デãƒã‚¤ã‚¹ãŒå¯¾å¿œã—ã¦ã„ãªã„ ioctl ã§ã™
    +$ ETXTBSY
    +26 テキストファイルãŒãƒ“ジー状態ã§ã™
    +$ EFBIG
    +27 ファイルãŒå¤§ãã™ãŽã¾ã™
    +$ ENOSPC
    +28 デãƒã‚¤ã‚¹ã®ç©ºã領域ä¸è¶³ã§ã™
    +$ ESPIPE
    +29 無効ãªã‚·ãƒ¼ã‚¯ã§ã™
    +$ EROFS
    +30 読ã¿è¾¼ã¿å°‚用ファイルシステムã§ã™
    +$ EMLINK
    +31 リンク数ãŒå¤šã™ãŽã¾ã™
    +$ EPIPE
    +32 パイプãŒç ´å£Šã•ã‚Œã¦ã¾ã—ãŸ
    +$ EDOM
    +33 数値引数ãŒç¯„囲外ã§ã™
    +$ ERANGE
    +34 çµæžœãŒå¤§ãéŽãŽã¾ã™
    +$ EAGAIN, EWOULDBLOCK
    +35 リソースãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ãã¾ã›ã‚“
    +$ EINPROGRESS
    +36 æ“作ãŒç¾åœ¨é€²è¡Œä¸­ã§ã™
    +$ EALREADY
    +37 æ“作ã¯æ—¢ã«é€²è¡Œä¸­ã§ã™
    +$ ENOTSOCK
    +38 ソケットã§ãªã„ã‚‚ã®ã«ã¤ã„ã¦ã‚½ã‚±ãƒƒãƒˆæ“作を行ã„ã¾ã—ãŸ
    +$ EDESTADDRREQ
    +39 宛先アドレスãŒè¦æ±‚ã•ã‚Œã¦ã„ã¾ã™
    +$ EMSGSIZE
    +40 メッセージãŒé•·ã™ãŽã¾ã™
    +$ EPROTOTYPE
    +41 ソケットãŒå¯¾å¿œã—ã¦ã„ãªã„プロトコルタイプã§ã™
    +$ ENOPROTOOPT
    +42 利用ã§ããªã„プロトコルã§ã™
    +$ EPROTONOSUPPORT
    +43 対応ã—ã¦ã„ãªã„プロトコルã§ã™
    +$ ESOCKTNOSUPPORT
    +44 対応ã—ã¦ã„ãªã„ソケットタイプã§ã™
    +$ EOPNOTSUPP
    +45 対応ã—ã¦ã„ãªã„æ“作ã§ã™
    +$ EPFNOSUPPORT
    +46 対応ã—ã¦ã„ãªã„プロトコルファミリã§ã™
    +$ EAFNOSUPPORT
    +47 プロトコルファミリãŒå¯¾å¿œã—ã¦ã„ãªã„アドレスファミリãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ
    +$ EADDRINUSE
    +48 アドレスãŒæ—¢ã«ä½¿ç”¨ä¸­ã§ã™
    +$ EADDRNOTAVAIL
    +49 è¦æ±‚ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’割り当ã¦ã§ãã¾ã›ã‚“
    +$ ENETDOWN
    +50 ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒãƒ€ã‚¦ãƒ³ã—ã¦ã„ã¾ã™
    +$ ENETUNREACH
    +51 ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«åˆ°é”ã§ãã¾ã›ã‚“
    +$ ENETRESET
    +52 リセットã«ã‚ˆã‚Šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æŽ¥ç¶šãŒå¤±ã‚ã‚Œã¾ã—ãŸ
    +$ ECONNABORTED
    +53 ソフトウェアã«ã‚ˆã£ã¦æŽ¥ç¶šãŒåˆ‡æ–­ã•ã‚Œã¾ã—ãŸ
    +$ ECONNRESET
    +54 接続ãŒé€šä¿¡ç›¸æ‰‹ã«ã‚ˆã£ã¦ãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã—ãŸ
    +$ ENOBUFS
    +55 ãƒãƒƒãƒ•ã‚¡ã®å®¹é‡ä¸è¶³ã§ã™
    +$ EISCONN
    +56 ソケットã¯æ—¢ã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã™
    +$ ENOTCONN
    +57 ソケットã¯æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“
    +$ ESHUTDOWN
    +58 ソケットã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã®å¾Œã§é€ä¿¡ãŒã§ãã¾ã›ã‚“
    +$ ETOOMANYREFS
    +59 処ç†é™ç•Œã‚’超ãˆã‚‹å¤šé‡å‚ç…§ã§ã™
    +$ ETIMEDOUT
    +60 æ“作ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ
    +$ ECONNREFUSED
    +61 接続ãŒæ‹’絶ã•ã‚Œã¾ã—ãŸ
    +$ ELOOP
    +62 処ç†é™ç•Œã‚’超ãˆã‚‹ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ãƒ¬ãƒ™ãƒ«ã§ã™
    +$ ENAMETOOLONG
    +63 ファイルåãŒé•·ã™ãŽã¾ã™
    +$ EHOSTDOWN
    +64 ホストãŒãƒ€ã‚¦ãƒ³ã—ã¦ã„ã¾ã™
    +$ EHOSTUNREACH
    +65 ホストã¸ã®çµŒè·¯ãŒã‚ã‚Šã¾ã›ã‚“
    +$ ENOTEMPTY
    +66 ディレクトリãŒç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“
    +$ EPROCLIM
    +67 プロセスãŒå¤šã™ãŽã¾ã™
    +$ EUSERS
    +68 ユーザãŒå¤šã™ãŽã¾ã™
    +$ EDQUOT
    +69 ディスククォータãŒè¶…éŽã—ã¾ã—ãŸ
    +$ ESTALE
    +70 失効ã—㟠NFS ファイルãƒãƒ³ãƒ‰ãƒ«ã§ã™
    +$ EREMOTE
    +71 パス中ã®ãƒªãƒ¢ãƒ¼ãƒˆã®ãƒ¬ãƒ™ãƒ«ãŒå¤šã™ãŽã¾ã™
    +$ EBADRPC
    +72 無効㪠RPC 構造体ã§ã™
    +$ ERPCMISMATCH
    +73 RPC ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒé–“é•ã£ã¦ã„ã¾ã™
    +$ EPROGUNAVAIL
    +74 RPC プログラムãŒåˆ©ç”¨ã§ãã¾ã›ã‚“
    +$ EPROGMISMATCH
    +75 プログラムã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆã£ã¦ã„ã¾ã›ã‚“
    +$ EPROCUNAVAIL
    +76 プログラムã§ã¯åˆ©ç”¨ã§ããªã„ procedure ã§ã™
    +$ ENOLCK
    +77 ロックãŒåˆ©ç”¨ã§ãã¾ã›ã‚“
    +$ ENOSYS
    +78 関数ãŒå®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“
    +$ EFTYPE
    +79 ファイルã®åž‹ã¾ãŸã¯å½¢å¼ãŒä¸é©åˆ‡ã§ã™
    +$ EAUTH
    +80 èªè¨¼ã‚¨ãƒ©ãƒ¼ã§ã™
    +$ ENEEDAUTH
    +81 èªè¨¼ç‰©ãŒå¿…è¦ã§ã™
    +$ EIDRM
    +82 識別å­ã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ
    +$ ENOMSG
    +83 è¦æ±‚ã•ã‚ŒãŸåž‹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã›ã‚“
    +$ EOVERFLOW
    +84 データ型ã«æ ¼ç´ã™ã‚‹ã«ã¯å¤§ãã™ãŽã‚‹å€¤ã§ã™
    +$ ECANCELED
    +85 処ç†ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ
    +$ EILSEQ
    +86 ä¸æ­£ãªãƒã‚¤ãƒˆåˆ—ã§ã™
    +$ ENOATTR
    +87 ãã®ã‚ˆã†ãªå±žæ€§ã¯ã‚ã‚Šã¾ã›ã‚“
    +$ EDOOFUS
    +88 プログラミングエラーã§ã™
    +$ EBADMSG
    +89 無効ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™
    +$ EMULTIHOP
    +90 マルãƒãƒ›ãƒƒãƒ—ãŒè©¦ã¿ã‚‰ã‚Œã¾ã—ãŸ
    +$ ENOLINK
    +91 リンクãŒåˆ‡æ–­ã•ã‚Œã¦ã„ã¾ã™
    +$ EPROTO
    +92 プロトコルエラーã§ã™
    +$ ENOTCAPABLE
    +93 ケーパビリティãŒä¸è¶³ã§ã™
    +$
    +$ strsignal() support catalog
    +$
    +$set 2
    +$ SIGHUP
    +1 ãƒãƒ³ã‚°ã‚¢ãƒƒãƒ—
    +$ SIGINT
    +2 割り込ã¿
    +$ SIGQUIT
    +3 中断
    +$ SIGILL
    +4 ä¸æ­£å‘½ä»¤
    +$ SIGTRAP
    +5 トレース/BPT トラップ
    +$ SIGABRT
    +6 アボートトラップ
    +$ SIGEMT
    +7 EMT トラップ
    +$ SIGFPE
    +8 浮動å°æ•°ç‚¹ä¾‹å¤–
    +$ SIGKILL
    +9 Kill ã•ã‚ŒãŸ
    +$ SIGBUS
    +10 ãƒã‚¹ã‚¨ãƒ©ãƒ¼
    +$ SIGSEGV
    +11 セグメンテーションé•å
    +$ SIGSYS
    +12 存在ã—ãªã„システムコール
    +$ SIGPIPE
    +13 パイプ破壊
    +$ SIGALRM
    +14 アラームクロック
    +$ SIGTERM
    +15 終了
    +$ SIGURG
    +16 緊急入出力状æ³
    +$ SIGSTOP
    +17 一時åœæ­¢ (シグナル)
    +$ SIGTSTP
    +18 一時åœæ­¢
    +$ SIGCONT
    +19 継続
    +$ SIGCHLD
    +20 å­ãƒ—ロセスã®çµ‚了
    +$ SIGTTIN
    +21 一時åœæ­¢ (tty 入力)
    +$ SIGTTOU
    +22 一時åœæ­¢ (tty 出力)
    +$ SIGIO
    +23 入出力å¯èƒ½
    +$ SIGXCPU
    +24 CPU 時間ã®åˆ¶é™è¶…éŽ
    +$ SIGXFSZ
    +25 ファイルサイズã®åˆ¶é™è¶…éŽ
    +$ SIGVTALRM
    +26 仮想タイマã®æœŸé™è¶…éŽ
    +$ SIGPROF
    +27 プロファイルタイマã®æœŸé™è¶…éŽ
    +$ SIGWINCH
    +28 ウィンドウサイズã®å¤‰åŒ–
    +$ SIGINFO
    +29 情報è¦æ±‚
    +$ SIGUSR1
    +30 ユーザ定義シグナル 1
    +$ SIGUSR2
    +31 ユーザ定義シグナル 2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (obsolete)
    +1 ホストåã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒ•ã‚¡ãƒŸãƒªãƒ¼ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“
    +$ EAI_AGAIN
    +2 åå‰è§£æ±ºã§ã®ä¸€æ™‚çš„ãªå¤±æ•—
    +$ EAI_BADFLAGS
    +3 ai_flags ã®å€¤ãŒç„¡åŠ¹
    +$ EAI_FAIL
    +4 åå‰è§£æ±ºã§ã®å›žå¾©ä¸èƒ½ãªå¤±æ•—
    +$ EAI_FAMILY
    +5 ai_family ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“
    +$ EAI_MEMORY
    +6 メモリ割り当ã¦å¤±æ•—
    +$ 7 (obsolete)
    +7 ホストåã«å¯¾å¿œã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã‚ã‚Šã¾ã›ã‚“
    +$ EAI_NONAME
    +8 ホストåã‹ã‚µãƒ¼ãƒ“スåãŒæŒ‡å®šã•ã‚Œãªã„ã€ã¾ãŸã¯ä¸æ˜Ž
    +$ EAI_SERVICE
    +9 サービスå㯠ai_socktype ã«å¯¾ã—ã¦ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“
    +$ EAI_SOCKTYPE
    +10 ai_socktype ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“
    +$ EAI_SYSTEM
    +11 システムエラーã€errno å‚ç…§
    +$ EAI_BADHINTS
    +12 hints ã®å€¤ãŒç„¡åŠ¹
    +$ EAI_PROTOCOL
    +13 解決ã•ã‚ŒãŸãƒ—ロトコルã¯ä¸æ˜Žã§ã™
    +$ EAI_OVERFLOW
    +14 引数ãƒãƒƒãƒ•ã‚¡ã‚ªãƒ¼ãƒãƒ•ãƒ­ãƒ¼
    +$ 0
    +32766 æˆåŠŸ
    +$ NL_MSGMAX
    +32767 ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼
    diff --git a/lib/libc/nls/ja_JP.eucJP.msg b/lib/libc/nls/ja_JP.eucJP.msg
    new file mode 100644
    index 000000000000..e3fac48c6a13
    --- /dev/null
    +++ b/lib/libc/nls/ja_JP.eucJP.msg
    @@ -0,0 +1,295 @@
    +$ $FreeBSD$
    +$
    +$ Message catalog for ja_JP.eucJP locale
    +$
    +$ strerror() support catalog
    +$
    +$set 1
    +$ EPERM
    +1 µö²Ä¤µ¤ì¤Æ¤¤¤Ê¤¤Áàºî¤Ç¤¹
    +$ ENOENT
    +2 ¤½¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Ï¤¢¤ê¤Þ¤»¤ó
    +$ ESRCH
    +3 ¤½¤Î¤è¤¦¤Ê¥×¥í¥»¥¹¤Ï¤¢¤ê¤Þ¤»¤ó
    +$ EINTR
    +4 ¥·¥¹¥Æ¥à¥³¡¼¥ë¤¬ÃæÃǤµ¤ì¤Þ¤·¤¿
    +$ EIO
    +5 Æþ½ÐÎÏ¥¨¥é¡¼¤Ç¤¹
    +$ ENXIO
    +6 ¥Ç¥Ð¥¤¥¹¤¬½àÈ÷¤µ¤ì¤Æ¤¤¤Þ¤»¤ó
    +$ E2BIG
    +7 °ú¿ô¤Î¥ê¥¹¥È¤¬Ä¹¤¹¤®¤Þ¤¹
    +$ ENOEXEC
    +8 ̵¸ú¤Ê¼Â¹Ô·Á¼°¤Ç¤¹
    +$ EBADF
    +9 ̵¸ú¤Ê¥Õ¥¡¥¤¥ëµ­½Ò»Ò¤Ç¤¹
    +$ ECHILD
    +10 »Ò¥×¥í¥»¥¹¤¬¤¢¤ê¤Þ¤»¤ó
    +$ EDEADLK
    +11 ¥ê¥½¡¼¥¹¥Ç¥Ã¥É¥í¥Ã¥¯¤ò²óÈò¤·¤Þ¤·¤¿
    +$ ENOMEM
    +12 ¥á¥â¥ê¤Î³ä¤êÅö¤Æ¤¬¤Ç¤­¤Þ¤»¤ó
    +$ EACCES
    +13 ¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¤¬µñÀ䤵¤ì¤Þ¤·¤¿
    +$ EFAULT
    +14 ̵¸ú¤Ê¥¢¥É¥ì¥¹¤Ç¤¹
    +$ ENOTBLK
    +15 ¥Ö¥í¥Ã¥¯¥Ç¥Ð¥¤¥¹¤¬Í׵ᤵ¤ì¤Æ¤¤¤Þ¤¹
    +$ EBUSY
    +16 ¥Ç¥Ð¥¤¥¹¤¬¥Ó¥¸¡¼¾õÂ֤Ǥ¹
    +$ EEXIST
    +17 ¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤¹
    +$ EXDEV
    +18 ¥Ç¥Ð¥¤¥¹¤ò¤Þ¤¿¤°¥ê¥ó¥¯¤Ç¤¹
    +$ ENODEV
    +19 ¥Ç¥Ð¥¤¥¹¤¬Âбþ¤·¤Æ¤Ê¤¤Áàºî¤Ç¤¹
    +$ ENOTDIR
    +20 ¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó
    +$ EISDIR
    +21 ¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹
    +$ EINVAL
    +22 ̵¸ú¤Ê°ú¿ô¤Ç¤¹
    +$ ENFILE
    +23 ¥·¥¹¥Æ¥àÆâ¤Ç¥ª¡¼¥×¥ó¤µ¤ì¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤¬Â¿¤¹¤®¤Þ¤¹
    +$ EMFILE
    +24 ¥ª¡¼¥×¥ó¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤¬Â¿¤¹¤®¤Þ¤¹
    +$ ENOTTY
    +25 ¥Ç¥Ð¥¤¥¹¤¬Âбþ¤·¤Æ¤¤¤Ê¤¤ ioctl ¤Ç¤¹
    +$ ETXTBSY
    +26 ¥Æ¥­¥¹¥È¥Õ¥¡¥¤¥ë¤¬¥Ó¥¸¡¼¾õÂ֤Ǥ¹
    +$ EFBIG
    +27 ¥Õ¥¡¥¤¥ë¤¬Â礭¤¹¤®¤Þ¤¹
    +$ ENOSPC
    +28 ¥Ç¥Ð¥¤¥¹¤Î¶õ¤­ÎΰèÉÔ­¤Ç¤¹
    +$ ESPIPE
    +29 ̵¸ú¤Ê¥·¡¼¥¯¤Ç¤¹
    +$ EROFS
    +30 Æɤ߹þ¤ßÀìÍÑ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤Ç¤¹
    +$ EMLINK
    +31 ¥ê¥ó¥¯¿ô¤¬Â¿¤¹¤®¤Þ¤¹
    +$ EPIPE
    +32 ¥Ñ¥¤¥×¤¬Ç˲õ¤µ¤ì¤Æ¤Þ¤·¤¿
    +$ EDOM
    +33 ¿ôÃÍ°ú¿ô¤¬Èϰϳ°¤Ç¤¹
    +$ ERANGE
    +34 ·ë²Ì¤¬Â礭²á¤®¤Þ¤¹
    +$ EAGAIN, EWOULDBLOCK
    +35 ¥ê¥½¡¼¥¹¤¬°ì»þŪ¤ËÍøÍѤǤ­¤Þ¤»¤ó
    +$ EINPROGRESS
    +36 Áàºî¤¬¸½ºß¿Ê¹ÔÃæ¤Ç¤¹
    +$ EALREADY
    +37 Áàºî¤Ï´û¤Ë¿Ê¹ÔÃæ¤Ç¤¹
    +$ ENOTSOCK
    +38 ¥½¥±¥Ã¥È¤Ç¤Ê¤¤¤â¤Î¤Ë¤Ä¤¤¤Æ¥½¥±¥Ã¥ÈÁàºî¤ò¹Ô¤¤¤Þ¤·¤¿
    +$ EDESTADDRREQ
    +39 °¸À襢¥É¥ì¥¹¤¬Í׵ᤵ¤ì¤Æ¤¤¤Þ¤¹
    +$ EMSGSIZE
    +40 ¥á¥Ã¥»¡¼¥¸¤¬Ä¹¤¹¤®¤Þ¤¹
    +$ EPROTOTYPE
    +41 ¥½¥±¥Ã¥È¤¬Âбþ¤·¤Æ¤¤¤Ê¤¤¥×¥í¥È¥³¥ë¥¿¥¤¥×¤Ç¤¹
    +$ ENOPROTOOPT
    +42 ÍøÍѤǤ­¤Ê¤¤¥×¥í¥È¥³¥ë¤Ç¤¹
    +$ EPROTONOSUPPORT
    +43 Âбþ¤·¤Æ¤¤¤Ê¤¤¥×¥í¥È¥³¥ë¤Ç¤¹
    +$ ESOCKTNOSUPPORT
    +44 Âбþ¤·¤Æ¤¤¤Ê¤¤¥½¥±¥Ã¥È¥¿¥¤¥×¤Ç¤¹
    +$ EOPNOTSUPP
    +45 Âбþ¤·¤Æ¤¤¤Ê¤¤Áàºî¤Ç¤¹
    +$ EPFNOSUPPORT
    +46 Âбþ¤·¤Æ¤¤¤Ê¤¤¥×¥í¥È¥³¥ë¥Õ¥¡¥ß¥ê¤Ç¤¹
    +$ EAFNOSUPPORT
    +47 ¥×¥í¥È¥³¥ë¥Õ¥¡¥ß¥ê¤¬Âбþ¤·¤Æ¤¤¤Ê¤¤¥¢¥É¥ì¥¹¥Õ¥¡¥ß¥ê¤¬»ØÄꤵ¤ì¤Þ¤·¤¿
    +$ EADDRINUSE
    +48 ¥¢¥É¥ì¥¹¤¬´û¤Ë»ÈÍÑÃæ¤Ç¤¹
    +$ EADDRNOTAVAIL
    +49 Í׵ᤵ¤ì¤¿¥¢¥É¥ì¥¹¤ò³ä¤êÅö¤Æ¤Ç¤­¤Þ¤»¤ó
    +$ ENETDOWN
    +50 ¥Í¥Ã¥È¥ï¡¼¥¯¤¬¥À¥¦¥ó¤·¤Æ¤¤¤Þ¤¹
    +$ ENETUNREACH
    +51 ¥Í¥Ã¥È¥ï¡¼¥¯¤ËÅþã¤Ç¤­¤Þ¤»¤ó
    +$ ENETRESET
    +52 ¥ê¥»¥Ã¥È¤Ë¤è¤ê¥Í¥Ã¥È¥ï¡¼¥¯¤ÎÀܳ¤¬¼º¤ï¤ì¤Þ¤·¤¿
    +$ ECONNABORTED
    +53 ¥½¥Õ¥È¥¦¥§¥¢¤Ë¤è¤Ã¤ÆÀܳ¤¬ÀÚÃǤµ¤ì¤Þ¤·¤¿
    +$ ECONNRESET
    +54 Àܳ¤¬ÄÌ¿®Áê¼ê¤Ë¤è¤Ã¤Æ¥ê¥»¥Ã¥È¤µ¤ì¤Þ¤·¤¿
    +$ ENOBUFS
    +55 ¥Ð¥Ã¥Õ¥¡¤ÎÍÆÎÌÉÔ­¤Ç¤¹
    +$ EISCONN
    +56 ¥½¥±¥Ã¥È¤Ï´û¤ËÀܳ¤µ¤ì¤Æ¤¤¤Þ¤¹
    +$ ENOTCONN
    +57 ¥½¥±¥Ã¥È¤ÏÀܳ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó
    +$ ESHUTDOWN
    +58 ¥½¥±¥Ã¥È¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¤Î¸å¤ÇÁ÷¿®¤¬¤Ç¤­¤Þ¤»¤ó
    +$ ETOOMANYREFS
    +59 ½èÍý¸Â³¦¤òĶ¤¨¤ë¿½Å»²¾È¤Ç¤¹
    +$ ETIMEDOUT
    +60 Áàºî¤¬¥¿¥¤¥à¥¢¥¦¥È¤·¤Þ¤·¤¿
    +$ ECONNREFUSED
    +61 Àܳ¤¬µñÀ䤵¤ì¤Þ¤·¤¿
    +$ ELOOP
    +62 ½èÍý¸Â³¦¤òĶ¤¨¤ë¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¥ì¥Ù¥ë¤Ç¤¹
    +$ ENAMETOOLONG
    +63 ¥Õ¥¡¥¤¥ë̾¤¬Ä¹¤¹¤®¤Þ¤¹
    +$ EHOSTDOWN
    +64 ¥Û¥¹¥È¤¬¥À¥¦¥ó¤·¤Æ¤¤¤Þ¤¹
    +$ EHOSTUNREACH
    +65 ¥Û¥¹¥È¤Ø¤Î·ÐÏ©¤¬¤¢¤ê¤Þ¤»¤ó
    +$ ENOTEMPTY
    +66 ¥Ç¥£¥ì¥¯¥È¥ê¤¬¶õ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó
    +$ EPROCLIM
    +67 ¥×¥í¥»¥¹¤¬Â¿¤¹¤®¤Þ¤¹
    +$ EUSERS
    +68 ¥æ¡¼¥¶¤¬Â¿¤¹¤®¤Þ¤¹
    +$ EDQUOT
    +69 ¥Ç¥£¥¹¥¯¥¯¥©¡¼¥¿¤¬Ä¶²á¤·¤Þ¤·¤¿
    +$ ESTALE
    +70 ¼º¸ú¤·¤¿ NFS ¥Õ¥¡¥¤¥ë¥Ï¥ó¥É¥ë¤Ç¤¹
    +$ EREMOTE
    +71 ¥Ñ¥¹Ãæ¤Î¥ê¥â¡¼¥È¤Î¥ì¥Ù¥ë¤¬Â¿¤¹¤®¤Þ¤¹
    +$ EBADRPC
    +72 ̵¸ú¤Ê RPC ¹½Â¤ÂΤǤ¹
    +$ ERPCMISMATCH
    +73 RPC ¥Ð¡¼¥¸¥ç¥ó¤¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹
    +$ EPROGUNAVAIL
    +74 RPC ¥×¥í¥°¥é¥à¤¬ÍøÍѤǤ­¤Þ¤»¤ó
    +$ EPROGMISMATCH
    +75 ¥×¥í¥°¥é¥à¤Î¥Ð¡¼¥¸¥ç¥ó¤¬¹ç¤Ã¤Æ¤¤¤Þ¤»¤ó
    +$ EPROCUNAVAIL
    +76 ¥×¥í¥°¥é¥à¤Ç¤ÏÍøÍѤǤ­¤Ê¤¤ procedure ¤Ç¤¹
    +$ ENOLCK
    +77 ¥í¥Ã¥¯¤¬ÍøÍѤǤ­¤Þ¤»¤ó
    +$ ENOSYS
    +78 ´Ø¿ô¤¬¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó
    +$ EFTYPE
    +79 ¥Õ¥¡¥¤¥ë¤Î·¿¤Þ¤¿¤Ï·Á¼°¤¬ÉÔŬÀڤǤ¹
    +$ EAUTH
    +80 ǧ¾Ú¥¨¥é¡¼¤Ç¤¹
    +$ ENEEDAUTH
    +81 ǧ¾Úʪ¤¬É¬ÍפǤ¹
    +$ EIDRM
    +82 ¼±Ê̻ҤϺï½ü¤µ¤ì¤Þ¤·¤¿
    +$ ENOMSG
    +83 Í׵ᤵ¤ì¤¿·¿¤Î¥á¥Ã¥»¡¼¥¸¤¬¤¢¤ê¤Þ¤»¤ó
    +$ EOVERFLOW
    +84 ¥Ç¡¼¥¿·¿¤Ë³ÊǼ¤¹¤ë¤Ë¤ÏÂ礭¤¹¤®¤ëÃͤǤ¹
    +$ ECANCELED
    +85 ½èÍý¤¬¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤·¤¿
    +$ EILSEQ
    +86 ÉÔÀµ¤Ê¥Ð¥¤¥ÈÎó¤Ç¤¹
    +$ ENOATTR
    +87 ¤½¤Î¤è¤¦¤Ê°À­¤Ï¤¢¤ê¤Þ¤»¤ó
    +$ EDOOFUS
    +88 ¥×¥í¥°¥é¥ß¥ó¥°¥¨¥é¡¼¤Ç¤¹
    +$ EBADMSG
    +89 ̵¸ú¤Ê¥á¥Ã¥»¡¼¥¸¤Ç¤¹
    +$ EMULTIHOP
    +90 ¥Þ¥ë¥Á¥Û¥Ã¥×¤¬»î¤ß¤é¤ì¤Þ¤·¤¿
    +$ ENOLINK
    +91 ¥ê¥ó¥¯¤¬ÀÚÃǤµ¤ì¤Æ¤¤¤Þ¤¹
    +$ EPROTO
    +92 ¥×¥í¥È¥³¥ë¥¨¥é¡¼¤Ç¤¹
    +$ ENOTCAPABLE
    +93 ¥±¡¼¥Ñ¥Ó¥ê¥Æ¥£¤¬ÉÔ­¤Ç¤¹
    +$
    +$ strsignal() support catalog
    +$
    +$set 2
    +$ SIGHUP
    +1 ¥Ï¥ó¥°¥¢¥Ã¥×
    +$ SIGINT
    +2 ³ä¤ê¹þ¤ß
    +$ SIGQUIT
    +3 ̾̂
    +$ SIGILL
    +4 ÉÔÀµÌ¿Îá
    +$ SIGTRAP
    +5 ¥È¥ì¡¼¥¹/BPT ¥È¥é¥Ã¥×
    +$ SIGABRT
    +6 ¥¢¥Ü¡¼¥È¥È¥é¥Ã¥×
    +$ SIGEMT
    +7 EMT ¥È¥é¥Ã¥×
    +$ SIGFPE
    +8 ÉâÆ°¾®¿ôÅÀÎã³°
    +$ SIGKILL
    +9 Kill ¤µ¤ì¤¿
    +$ SIGBUS
    +10 ¥Ð¥¹¥¨¥é¡¼
    +$ SIGSEGV
    +11 ¥»¥°¥á¥ó¥Æ¡¼¥·¥ç¥ó°ãÈ¿
    +$ SIGSYS
    +12 ¸ºß¤·¤Ê¤¤¥·¥¹¥Æ¥à¥³¡¼¥ë
    +$ SIGPIPE
    +13 ¥Ñ¥¤¥×Ç˲õ
    +$ SIGALRM
    +14 ¥¢¥é¡¼¥à¥¯¥í¥Ã¥¯
    +$ SIGTERM
    +15 ½ªÎ»
    +$ SIGURG
    +16 ¶ÛµÞÆþ½ÐÎϾõ¶·
    +$ SIGSTOP
    +17 °ì»þÄä»ß (¥·¥°¥Ê¥ë)
    +$ SIGTSTP
    +18 °ì»þÄä»ß
    +$ SIGCONT
    +19 ·Ñ³
    +$ SIGCHLD
    +20 »Ò¥×¥í¥»¥¹¤Î½ªÎ»
    +$ SIGTTIN
    +21 °ì»þÄä»ß (tty ÆþÎÏ)
    +$ SIGTTOU
    +22 °ì»þÄä»ß (tty ½ÐÎÏ)
    +$ SIGIO
    +23 Æþ½ÐÎϲÄǽ
    +$ SIGXCPU
    +24 CPU »þ´Ö¤ÎÀ©¸ÂĶ²á
    +$ SIGXFSZ
    +25 ¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤ÎÀ©¸ÂĶ²á
    +$ SIGVTALRM
    +26 ²¾ÁÛ¥¿¥¤¥Þ¤Î´ü¸ÂĶ²á
    +$ SIGPROF
    +27 ¥×¥í¥Õ¥¡¥¤¥ë¥¿¥¤¥Þ¤Î´ü¸ÂĶ²á
    +$ SIGWINCH
    +28 ¥¦¥£¥ó¥É¥¦¥µ¥¤¥º¤ÎÊѲ½
    +$ SIGINFO
    +29 ¾ðÊóÍ×µá
    +$ SIGUSR1
    +30 ¥æ¡¼¥¶ÄêµÁ¥·¥°¥Ê¥ë 1
    +$ SIGUSR2
    +31 ¥æ¡¼¥¶ÄêµÁ¥·¥°¥Ê¥ë 2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (obsolete)
    +1 ¥Û¥¹¥È̾¤Î¥¢¥É¥ì¥¹¥Õ¥¡¥ß¥ê¡¼¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó
    +$ EAI_AGAIN
    +2 ̾Á°²ò·è¤Ç¤Î°ì»þŪ¤Ê¼ºÇÔ
    +$ EAI_BADFLAGS
    +3 ai_flags ¤ÎÃͤ¬Ìµ¸ú
    +$ EAI_FAIL
    +4 ̾Á°²ò·è¤Ç¤Î²óÉüÉÔǽ¤Ê¼ºÇÔ
    +$ EAI_FAMILY
    +5 ai_family ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó
    +$ EAI_MEMORY
    +6 ¥á¥â¥ê³ä¤êÅö¤Æ¼ºÇÔ
    +$ 7 (obsolete)
    +7 ¥Û¥¹¥È̾¤ËÂбþ¤¹¤ë¥¢¥É¥ì¥¹¤Ï¤¢¤ê¤Þ¤»¤ó
    +$ EAI_NONAME
    +8 ¥Û¥¹¥È̾¤«¥µ¡¼¥Ó¥¹Ì¾¤¬»ØÄꤵ¤ì¤Ê¤¤¡¢¤Þ¤¿¤ÏÉÔÌÀ
    +$ EAI_SERVICE
    +9 ¥µ¡¼¥Ó¥¹Ì¾¤Ï ai_socktype ¤ËÂФ·¤Æ¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó
    +$ EAI_SOCKTYPE
    +10 ai_socktype ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó
    +$ EAI_SYSTEM
    +11 ¥·¥¹¥Æ¥à¥¨¥é¡¼¡¢errno »²¾È
    +$ EAI_BADHINTS
    +12 hints ¤ÎÃͤ¬Ìµ¸ú
    +$ EAI_PROTOCOL
    +13 ²ò·è¤µ¤ì¤¿¥×¥í¥È¥³¥ë¤ÏÉÔÌÀ¤Ç¤¹
    +$ EAI_OVERFLOW
    +14 °ú¿ô¥Ð¥Ã¥Õ¥¡¥ª¡¼¥Ð¥Õ¥í¡¼
    +$ 0
    +32766 À®¸ù
    +$ NL_MSGMAX
    +32767 ÉÔÌÀ¤Ê¥¨¥é¡¼
    diff --git a/lib/libc/nls/ko_KR.UTF-8.msg b/lib/libc/nls/ko_KR.UTF-8.msg
    index 4fc4e78e624b..60e8a121dfe4 100644
    --- a/lib/libc/nls/ko_KR.UTF-8.msg
    +++ b/lib/libc/nls/ko_KR.UTF-8.msg
    @@ -181,6 +181,16 @@ $ ENOATTR
     87 ì†ì„±ì„ ì°¾ì„ ìˆ˜ 없습니다
     $ EDOOFUS
     88 í”„ë¡œê·¸ëž¨ìƒ ì˜¤ë¥˜ìž…ë‹ˆë‹¤
    +$ EBADMSG
    +89 ìž˜ëª»ëœ ë©”ì‹œì§€ìž…ë‹ˆë‹¤
    +$ EMULTIHOP
    +90 ë©€í‹°í™‰ì´ ì‹œë„ë˜ì—ˆìŠµë‹ˆë‹¤
    +$ ENOLINK
    +91 ì—°ê²°ì´ ëŠê²¼ìŠµë‹ˆë‹¤
    +$ EPROTO
    +92 í”„ë¡œí† ì½œì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤
    +$ ENOTCAPABLE
    +93 ì ‘ê·¼ ëŠ¥ë ¥ì´ ì¶©ë¶„ì¹˜ 않습니다
     $
     $ strsignal() support catalog
     $
    @@ -230,7 +240,7 @@ $ SIGTTIN
     $ SIGTTOU
     22 정지 (í„°ë¯¸ë„ ì¶œë ¥)
     $ SIGIO
    -23 I/O possible
    +23 I/O 가능
     $ SIGXCPU
     24 CPU 사용 시간 초과
     $ SIGXFSZ
    @@ -247,3 +257,39 @@ $ SIGUSR1
     30 ì‚¬ìš©ìž ì •ì˜ ì‹œê·¸ë„ 1
     $ SIGUSR2
     31 ì‚¬ìš©ìž ì •ì˜ ì‹œê·¸ë„ 2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (obsolete)
    +1 호스트 ì´ë¦„ì´ ì§€ì›í•˜ì§€ 않는 주소군입니다
    +$ EAI_AGAIN
    +2 주소 ë³€í™˜ì— ì¼ì‹œì ìœ¼ë¡œ 실패했습니다
    +$ EAI_BADFLAGS
    +3 ìž˜ëª»ëœ ai_flags입니다
    +$ EAI_FAIL
    +4 주소 ë³€í™˜ì— ì™„ì „ížˆ 실패했습니다
    +$ EAI_FAMILY
    +5 지ì›ë˜ì§€ 않는 ai_family입니다
    +$ EAI_MEMORY
    +6 메모리 í• ë‹¹ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤
    +$ 7 (obsolete)
    +7 호스트 ì´ë¦„ê³¼ ì¼ì¹˜í•˜ëŠ” 주소가 없습니다
    +$ EAI_NONAME
    +8 호스트 ì´ë¦„ ë˜ëŠ” 서비스 ì´ë¦„ì´ ì§€ì •ë˜ì§€ 않았거나 ì•Œ 수 없습니다
    +$ EAI_SERVICE
    +9 서비스 ì´ë¦„ì€ ai_socktypeì—ì„œ 지ì›ë˜ì§€ 않습니다
    +$ EAI_SOCKTYPE
    +10 지ì›ë˜ì§€ 않는 ai_socktype입니다
    +$ EAI_SYSTEM
    +11 시스템 오류가 errnoì— ë°˜í™˜ë˜ì—ˆìŠµë‹ˆë‹¤
    +$ EAI_BADHINTS
    +12 ìž˜ëª»ëœ hints입니다
    +$ EAI_PROTOCOL
    +13 ì•Œ 수 없는 í”„ë¡œí† ì½œì´ ë³€í™˜ë˜ì—ˆìŠµë‹ˆë‹¤
    +$ EAI_OVERFLOW
    +14 ì¸ìž ë²„í¼ ê³µê°„ì´ ëª¨ìžëžë‹ˆë‹¤
    +$ 0
    +32766 성공
    +$ NL_MSGMAX
    +32767 알 수 없는 오류
    diff --git a/lib/libc/nls/ko_KR.eucKR.msg b/lib/libc/nls/ko_KR.eucKR.msg
    index c2ca1a06b18c..bb1fa300b164 100644
    --- a/lib/libc/nls/ko_KR.eucKR.msg
    +++ b/lib/libc/nls/ko_KR.eucKR.msg
    @@ -181,6 +181,16 @@ $ ENOATTR
     87 ¼Ó¼ºÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù
     $ EDOOFUS
     88 ÇÁ·Î±×·¥»ó ¿À·ùÀÔ´Ï´Ù
    +$ EBADMSG
    +89 À߸øµÈ ¸Þ½ÃÁöÀÔ´Ï´Ù
    +$ EMULTIHOP
    +90 ¸ÖƼȩÀÌ ½ÃµµµÇ¾ú½À´Ï´Ù
    +$ ENOLINK
    +91 ¿¬°áÀÌ ²÷°å½À´Ï´Ù
    +$ EPROTO
    +92 ÇÁ·ÎÅäÄÝÀÌ À߸øµÇ¾ú½À´Ï´Ù
    +$ ENOTCAPABLE
    +93 Á¢±Ù ´É·ÂÀÌ ÃæºÐÄ¡ ¾Ê½À´Ï´Ù
     $
     $ strsignal() support catalog
     $
    @@ -230,7 +240,7 @@ $ SIGTTIN
     $ SIGTTOU
     22 Á¤Áö (Å͹̳ΠÃâ·Â)
     $ SIGIO
    -23 I/O possible
    +23 I/O °¡´É
     $ SIGXCPU
     24 CPU »ç¿ë ½Ã°£ ÃÊ°ú
     $ SIGXFSZ
    @@ -247,3 +257,39 @@ $ SIGUSR1
     30 »ç¿ëÀÚ Á¤ÀÇ ½Ã±×³Î 1
     $ SIGUSR2
     31 »ç¿ëÀÚ Á¤ÀÇ ½Ã±×³Î 2
    +$
    +$ gai_strerror() support catalog
    +$
    +$set 3
    +$ 1 (obsolete)
    +1 È£½ºÆ® À̸§ÀÌ Áö¿øÇÏÁö ¾Ê´Â ÁÖ¼Ò±ºÀÔ´Ï´Ù
    +$ EAI_AGAIN
    +2 ÁÖ¼Ò º¯È¯¿¡ ÀϽÃÀûÀ¸·Î ½ÇÆÐÇß½À´Ï´Ù
    +$ EAI_BADFLAGS
    +3 À߸øµÈ ai_flagsÀÔ´Ï´Ù
    +$ EAI_FAIL
    +4 ÁÖ¼Ò º¯È¯¿¡ ¿ÏÀüÈ÷ ½ÇÆÐÇß½À´Ï´Ù
    +$ EAI_FAMILY
    +5 Áö¿øµÇÁö ¾Ê´Â ai_familyÀÔ´Ï´Ù
    +$ EAI_MEMORY
    +6 ¸Þ¸ð¸® ÇÒ´ç¿¡ ½ÇÆÐÇß½À´Ï´Ù
    +$ 7 (obsolete)
    +7 È£½ºÆ® À̸§°ú ÀÏÄ¡ÇÏ´Â ÁÖ¼Ò°¡ ¾ø½À´Ï´Ù
    +$ EAI_NONAME
    +8 È£½ºÆ® À̸§ ¶Ç´Â ¼­ºñ½º À̸§ÀÌ ÁöÁ¤µÇÁö ¾Ê¾Ò°Å³ª ¾Ë ¼ö ¾ø½À´Ï´Ù
    +$ EAI_SERVICE
    +9 ¼­ºñ½º À̸§Àº ai_socktype¿¡¼­ Áö¿øµÇÁö ¾Ê½À´Ï´Ù
    +$ EAI_SOCKTYPE
    +10 Áö¿øµÇÁö ¾Ê´Â ai_socktypeÀÔ´Ï´Ù
    +$ EAI_SYSTEM
    +11 ½Ã½ºÅÛ ¿À·ù°¡ errno¿¡ ¹ÝȯµÇ¾ú½À´Ï´Ù
    +$ EAI_BADHINTS
    +12 À߸øµÈ hintsÀÔ´Ï´Ù
    +$ EAI_PROTOCOL
    +13 ¾Ë ¼ö ¾ø´Â ÇÁ·ÎÅäÄÝÀÌ º¯È¯µÇ¾ú½À´Ï´Ù
    +$ EAI_OVERFLOW
    +14 ÀÎÀÚ ¹öÆÛ °ø°£ÀÌ ¸ðÀÚ¶ø´Ï´Ù
    +$ 0
    +32766 ¼º°ø
    +$ NL_MSGMAX
    +32767 ¾Ë ¼ö ¾ø´Â ¿À·ù
    diff --git a/lib/libc/nls/msgcat.c b/lib/libc/nls/msgcat.c
    index 8689b7eaa0e7..4532e909fa6a 100644
    --- a/lib/libc/nls/msgcat.c
    +++ b/lib/libc/nls/msgcat.c
    @@ -1,5 +1,6 @@
     /***********************************************************
     Copyright 1990, by Alfalfa Software Incorporated, Cambridge, Massachusetts.
    +Copyright 2010, Gabor Kovesdan 
     
                             All Rights Reserved
     
    @@ -39,6 +40,7 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    +#include 
     
     #include 		/* for ntohl() */
     
    @@ -47,6 +49,7 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    +#include 
     #include 
     #include 
     #include 
    @@ -57,38 +60,109 @@ __FBSDID("$FreeBSD$");
     
     #define _DEFAULT_NLS_PATH "/usr/share/nls/%L/%N.cat:/usr/share/nls/%N/%L:/usr/local/share/nls/%L/%N.cat:/usr/local/share/nls/%N/%L"
     
    +#define RLOCK(fail)	{ int ret;						\
    +			  if (__isthreaded &&					\
    +			      ((ret = _pthread_rwlock_rdlock(&rwlock)) != 0)) {	\
    +				  errno = ret;					\
    +				  return (fail);				\
    +			  }}
    +#define WLOCK(fail)	{ int ret;						\
    +			  if (__isthreaded &&					\
    +			      ((ret = _pthread_rwlock_wrlock(&rwlock)) != 0)) {	\
    +				  errno = ret;					\
    +				  return (fail);				\
    +			  }}
    +#define UNLOCK		{ if (__isthreaded)					\
    +			      _pthread_rwlock_unlock(&rwlock); }
    +
     #define	NLERR		((nl_catd) -1)
     #define NLRETERR(errc)  { errno = errc; return (NLERR); }
    +#define SAVEFAIL(n, l, e)	{ WLOCK(NLERR);					\
    +				  np = malloc(sizeof(struct catentry));		\
    +				  if (np != NULL) {				\
    +				  	np->name = strdup(n);			\
    +					np->path = NULL;			\
    +					np->lang = (l == NULL) ? NULL :		\
    +					    strdup(l);				\
    +					np->caterrno = e;			\
    +				  	SLIST_INSERT_HEAD(&cache, np, list);	\
    +				  }						\
    +				  UNLOCK;					\
    +				  errno = e;					\
    +				}
     
    -static nl_catd load_msgcat(const char *);
    +static nl_catd load_msgcat(const char *, const char *, const char *);
    +
    +static pthread_rwlock_t		 rwlock = PTHREAD_RWLOCK_INITIALIZER;
    +
    +struct catentry {
    +	SLIST_ENTRY(catentry)	 list;
    +	char			*name;
    +	char			*path;
    +	int			 caterrno;
    +	nl_catd			 catd;
    +	char			*lang;
    +	int			 refcount;
    +};
    +
    +SLIST_HEAD(listhead, catentry) cache =
    +    SLIST_HEAD_INITIALIZER(cache);
     
     nl_catd
     catopen(const char *name, int type)
     {
    -	int             spcleft, saverr;
    -	char            path[PATH_MAX];
    -	char            *nlspath, *lang, *base, *cptr, *pathP, *tmpptr;
    -	char            *cptr1, *plang, *pter, *pcode;
    -	struct stat     sbuf;
    +	struct stat sbuf;
    +	struct catentry *np;
    +	char *base, *cptr, *cptr1, *lang, *nlspath, *pathP, *pcode;
    +	char *plang, *pter, *tmpptr;
    +	int saverr, spcleft;
    +	char path[PATH_MAX];
     
    +	/* sanity checking */
     	if (name == NULL || *name == '\0')
     		NLRETERR(EINVAL);
     
    +	if (strchr(name, '/') != NULL)
    +		/* have a pathname */
    +		lang = NULL;
    +	else {
    +		if (type == NL_CAT_LOCALE)
    +			lang = setlocale(LC_MESSAGES, NULL);
    +		else
    +			lang = getenv("LANG");
    +
    +		if (lang == NULL || *lang == '\0' || strlen(lang) > ENCODING_LEN ||
    +		    (lang[0] == '.' &&
    +		    (lang[1] == '\0' || (lang[1] == '.' && lang[2] == '\0'))) ||
    +		    strchr(lang, '/') != NULL)
    +			lang = "C";
    +	}
    +
    +	/* Try to get it from the cache first */
    +	RLOCK(NLERR);
    +	SLIST_FOREACH(np, &cache, list) {
    +		if ((strcmp(np->name, name) == 0) &&
    +		    ((lang != NULL && np->lang != NULL &&
    +		    strcmp(np->lang, lang) == 0) || (np->lang == lang))) {
    +			if (np->caterrno != 0) {
    +				/* Found cached failing entry */
    +				UNLOCK;
    +				NLRETERR(np->caterrno);
    +			} else {
    +				/* Found cached successful entry */
    +				np->refcount++;
    +				UNLOCK;
    +				return (np->catd);
    +			}
    +		}
    +	}
    +	UNLOCK;
    +
     	/* is it absolute path ? if yes, load immediately */
     	if (strchr(name, '/') != NULL)
    -		return (load_msgcat(name));
    -
    -	if (type == NL_CAT_LOCALE)
    -		lang = setlocale(LC_MESSAGES, NULL);
    -	else
    -		lang = getenv("LANG");
    -
    -	if (lang == NULL || *lang == '\0' || strlen(lang) > ENCODING_LEN ||
    -	    (lang[0] == '.' &&
    -	     (lang[1] == '\0' || (lang[1] == '.' && lang[2] == '\0'))) ||
    -	    strchr(lang, '/') != NULL)
    -		lang = "C";
    +		return (load_msgcat(name, name, lang));
     
    +	/* sanity checking */
     	if ((plang = cptr1 = strdup(lang)) == NULL)
     		return (NLERR);
     	if ((cptr = strchr(cptr1, '@')) != NULL)
    @@ -136,7 +210,7 @@ catopen(const char *name, int type)
     						break;
     					case '%':
     						++nlspath;
    -						/* fallthrough */
    +						/* FALLTHROUGH */
     					default:
     						if (pathP - path >=
     						    sizeof(path) - 1)
    @@ -153,6 +227,7 @@ catopen(const char *name, int type)
     			too_long:
     						free(plang);
     						free(base);
    +						SAVEFAIL(name, lang, ENAMETOOLONG);
     						NLRETERR(ENAMETOOLONG);
     					}
     					pathP += strlen(tmpptr);
    @@ -166,7 +241,7 @@ catopen(const char *name, int type)
     			if (stat(path, &sbuf) == 0) {
     				free(plang);
     				free(base);
    -				return (load_msgcat(path));
    +				return (load_msgcat(path, name, lang));
     			}
     		} else {
     			tmpptr = (char *)name;
    @@ -176,6 +251,7 @@ catopen(const char *name, int type)
     	}
     	free(plang);
     	free(base);
    +	SAVEFAIL(name, lang, ENOENT);
     	NLRETERR(ENOENT);
     }
     
    @@ -183,19 +259,19 @@ char *
     catgets(nl_catd catd, int set_id, int msg_id, const char *s)
     {
     	struct _nls_cat_hdr *cat_hdr;
    -	struct _nls_set_hdr *set_hdr;
     	struct _nls_msg_hdr *msg_hdr;
    -	int l, u, i, r;
    +	struct _nls_set_hdr *set_hdr;
    +	int i, l, r, u;
     
     	if (catd == NULL || catd == NLERR) {
     		errno = EBADF;
     		/* LINTED interface problem */
    -		return (char *) s;
    -}
    +		return ((char *)s);
    +	}
     
    -	cat_hdr = (struct _nls_cat_hdr *)catd->__data; 
    -	set_hdr = (struct _nls_set_hdr *)(void *)((char *)catd->__data
    -			+ sizeof(struct _nls_cat_hdr));
    +	cat_hdr = (struct _nls_cat_hdr *)catd->__data;
    +	set_hdr = (struct _nls_set_hdr *)(void *)((char *)catd->__data +
    +	    sizeof(struct _nls_cat_hdr));
     
     	/* binary search, see knuth algorithm b */
     	l = 0;
    @@ -228,7 +304,7 @@ catgets(nl_catd catd, int set_id, int msg_id, const char *s)
     				} else {
     					l = i + 1;
     				}
    -}
    +			}
     
     			/* not found */
     			goto notfound;
    @@ -238,25 +314,44 @@ catgets(nl_catd catd, int set_id, int msg_id, const char *s)
     		} else {
     			l = i + 1;
     		}
    -}
    +	}
     
     notfound:
     	/* not found */
     	errno = ENOMSG;
     	/* LINTED interface problem */
    -	return (char *) s;
    +	return ((char *)s);
     }
     
     int
     catclose(nl_catd catd)
     {
    +	struct catentry *np;
    +
    +	/* sanity checking */
     	if (catd == NULL || catd == NLERR) {
     		errno = EBADF;
     		return (-1);
     	}
     
    -	munmap(catd->__data, (size_t)catd->__size);
    -	free(catd);
    +	/* Remove from cache if not referenced any more */
    +	WLOCK(-1);
    +	SLIST_FOREACH(np, &cache, list) {
    +		if (catd == np->catd) {
    +			np->refcount--;
    +			if (np->refcount == 0) {
    +				munmap(catd->__data, (size_t)catd->__size);
    +				free(catd);
    +				SLIST_REMOVE(&cache, np, catentry, list);
    +				free(np->name);
    +				free(np->path);
    +				free(np->lang);
    +				free(np);
    +			}
    +			break;
    +		}
    +	}
    +	UNLOCK;
     	return (0);
     }
     
    @@ -265,43 +360,88 @@ catclose(nl_catd catd)
      */
     
     static nl_catd
    -load_msgcat(const char *path)
    +load_msgcat(const char *path, const char *name, const char *lang)
     {
     	struct stat st;
    -	nl_catd catd;
    +	nl_catd	catd;
    +	struct catentry *np;
     	void *data;
     	int fd;
     
    -	/* XXX: path != NULL? */
    +	/* path/name will never be NULL here */
     
    -	if ((fd = _open(path, O_RDONLY)) == -1)
    -		return (NLERR);
    +	/*
    +	 * One more try in cache; if it was not found by name,
    +	 * it might still be found by absolute path.
    +	 */
    +	RLOCK(NLERR);
    +	SLIST_FOREACH(np, &cache, list) {
    +		if ((np->path != NULL) && (strcmp(np->path, path) == 0)) {
    +			np->refcount++;
    +			UNLOCK;
    +			return (np->catd);
    +		}
    +	}
    +	UNLOCK;
    +
    +	if ((fd = _open(path, O_RDONLY)) == -1) {
    +		SAVEFAIL(name, lang, errno);
    +		NLRETERR(errno);
    +	}
     
     	if (_fstat(fd, &st) != 0) {
     		_close(fd);
    -		return (NLERR);
    +		SAVEFAIL(name, lang, EFTYPE);
    +		NLRETERR(EFTYPE);
     	}
     
    -	data = mmap(0, (size_t)st.st_size, PROT_READ, MAP_FILE|MAP_SHARED, fd,
    -	    (off_t)0);
    -	_close(fd);
    +	/*
    +	 * If the file size cannot be held in size_t we cannot mmap()
    +	 * it to the memory.  Probably, this will not be a problem given
    +	 * that catalog files are usually small.
    +	 */
    +	if (st.st_size > SIZE_T_MAX) {
    +		_close(fd);
    +		SAVEFAIL(name, lang, EFBIG);
    +		NLRETERR(EFBIG);
    +	}
     
    -	if (data == MAP_FAILED)
    -		return (NLERR);
    +	if ((data = mmap(0, (size_t)st.st_size, PROT_READ,
    +	    MAP_FILE|MAP_SHARED, fd, (off_t)0)) == MAP_FAILED) {
    +		int saved_errno = errno;
    +		_close(fd);
    +		SAVEFAIL(name, lang, saved_errno);
    +		NLRETERR(saved_errno);
    +	}
    +	_close(fd);
     
     	if (ntohl((u_int32_t)((struct _nls_cat_hdr *)data)->__magic) !=
     	    _NLS_MAGIC) {
     		munmap(data, (size_t)st.st_size);
    -		NLRETERR(EINVAL);
    +		SAVEFAIL(name, lang, EFTYPE);
    +		NLRETERR(EFTYPE);
     	}
     
     	if ((catd = malloc(sizeof (*catd))) == NULL) {
     		munmap(data, (size_t)st.st_size);
    -		return (NLERR);
    +		SAVEFAIL(name, lang, ENOMEM);
    +		NLRETERR(ENOMEM);
     	}
     
     	catd->__data = data;
     	catd->__size = (int)st.st_size;
    +
    +	/* Caching opened catalog */
    +	WLOCK(NLERR);
    +	if ((np = malloc(sizeof(struct catentry))) != NULL) {
    +		np->name = strdup(name);
    +		np->path = strdup(path);
    +		np->catd = catd;
    +		np->lang = (lang == NULL) ? NULL : strdup(lang);
    +		np->refcount = 1;
    +		np->caterrno = 0;
    +		SLIST_INSERT_HEAD(&cache, np, list);
    +	}
    +	UNLOCK;
     	return (catd);
     }
    -
    diff --git a/lib/libc/nls/nl_NL.ISO8859-1.msg b/lib/libc/nls/nl_NL.ISO8859-1.msg
    index 47103d4931c6..2939116fc97c 100644
    --- a/lib/libc/nls/nl_NL.ISO8859-1.msg
    +++ b/lib/libc/nls/nl_NL.ISO8859-1.msg
    @@ -26,7 +26,7 @@ $ EBADF
     $ ECHILD
     10 Geen kindprocessen
     $ EDEADLK
    -11 Een deadlock is vermeden
    +11 Een deadlock op een bron is vermeden
     $ ENOMEM
     12 Kan geen geheugen meer verkrijgen
     $ EACCES
    @@ -40,13 +40,13 @@ $ EBUSY
     $ EEXIST
     17 Bestand bestaat reeds
     $ EXDEV
    -18 Verwijzing tussen bestanden op verschillende bestandssystemen
    +18 Verwijzing tussen verschillende apparaten
     $ ENODEV
     19 Bewerking wordt niet ondersteund door dit apparaat
     $ ENOTDIR
     20 Dit is geen map
     $ EISDIR
    -21 Dit is een map 
    +21 Dit is een map
     $ EINVAL
     22 Ongeldig argument
     $ ENFILE
    @@ -62,7 +62,7 @@ $ EFBIG
     $ ENOSPC
     28 Geen ruimte meer op dit apparaat
     $ ESPIPE
    -29 Onuitvoerbare zoekopdracht
    +29 Ongeldige zoekopdracht
     $ EROFS
     30 Van dit bestandssysteem kan alleen worden gelezen
     $ EMLINK
    @@ -84,7 +84,7 @@ $ ENOTSOCK
     $ EDESTADDRREQ
     39 Een bestemmingsadres is vereist
     $ EMSGSIZE
    -40 Te grote bericht
    +40 Te groot bericht
     $ EPROTOTYPE
     41 Protocol past niet bij dit contactpunt
     $ ENOPROTOOPT
    @@ -116,7 +116,7 @@ $ ECONNRESET
     $ ENOBUFS
     55 Geen bufferruimte meer beschikbaar
     $ EISCONN
    -56 Dit contactpunt is al verbonden
    +56 Contactpunt is al verbonden
     $ ENOTCONN
     57 Contactpunt is niet verbonden
     $ ESHUTDOWN
    @@ -136,9 +136,9 @@ $ EHOSTDOWN
     $ EHOSTUNREACH
     65 Bestemming niet bereikbaar
     $ ENOTEMPTY
    -66 Directory is niet leeg
    +66 Map is niet leeg
     $ EPROCLIM
    -67 Te veel taken
    +67 Te veel processen
     $ EUSERS
     68 Te veel gebruikers
     $ EDQUOT
    @@ -160,7 +160,7 @@ $ EPROCUNAVAIL
     $ ENOLCK
     77 Geen sloten beschikbaar
     $ ENOSYS
    -78 Deze systeemfunctie is niet geimplementeerd
    +78 Systeemfunctie is niet geimplementeerd
     $ EFTYPE
     79 Bestandsformaat niet van toepassing
     $ EAUTH
    @@ -173,30 +173,24 @@ $ ENOMSG
     83 Geen bericht van het gewenste type
     $ EOVERFLOW
     84 Waarde te groot om te bewaren in gegevenstype
    -$ EILSEQ
    -85 Ongeldige bytereeks
    -$ ENOTSUP
    -86 Niet ondersteund
     $ ECANCELED
    -87 Bewerking geannuleerd
    -$ EBADMSG
    -88 Verkeerd of defect bericht
    -$ ENODATA
    -89 Geen bericht beschikbaar
    -$ ENOSR
    -90 Geen STREAM-voorraad
    -$ ENOSTR
    -91 Dit is geen STREAM
    -$ ETIME
    -92 STREAM-ioctl verlopen
    +85 Bewerking geannuleerd
    +$ EILSEQ
    +86 Ongeldige bytereeks
     $ ENOATTR
    -93 Attribuut niet gevonden
    +87 Attribuut niet gevonden
    +$ EDOOFUS
    +88 Programmeerfout
    +$ EBADMSG
    +89 Verkeerd of defect bericht
     $ EMULTIHOP
    -94 Multihopverzoek
    +90 Multihopverzoek
     $ ENOLINK
    -95 Verbinding werd verstoord
    +91 Verbinding werd verstoord
     $ EPROTO
    -96 Protocolfout
    +92 Protocolfout
    +$ ENOTCAPABLE
    +93 Onvoldoende mogelijkheden
     $
     $ strsignal() support catalog
     $
    @@ -263,5 +257,38 @@ $ SIGUSR1
     30 Gebruikersignaal 1
     $ SIGUSR2
     31 Gebruikersignaal 2
    -$ SIGPWR
    -32 Stroomuitval/stroominschakeling
    +$
    +$ gai_strerror() support catalog
    +$set 3
    +$ 1 (obsolete)
    +1 Adresfamilie voor hostnaam niet ondersteund
    +$ EAI_AGAIN
    +2 Tijdelijke fout in naamresolutie
    +$ EAI_BADFLAGS
    +3 Ongeldige waarde voor ai_flags
    +$ EAI_FAIL
    +4 Onherstelbare fout in naamresolutie
    +$ EAI_FAMILY
    +5 ai_familie niet ondersteund
    +$ EAI_MEMORY
    +6 Geheugenallocatiefout
    +$ 7 (obsolete)
    +7 Geen adres met hostnaam geassocieerd
    +$ EAI_NONAME
    +8 hostname noch servname gegeven, of onbekend
    +$ EAI_SERVICE
    +9 servname niet ondersteund voor ai_socktype
    +$ EAI_SOCKTYPE
    +10 ai_socktype niet ondersteund
    +$ EAI_SYSTEM
    +11 Systeemfout geretourneerd in errno
    +$ EAI_BADHINTS
    +12 Ongeldige waarde voor hints
    +$ EAI_PROTOCOL
    +13 Opgelost protocol is onbekend
    +$ EAI_OVERFLOW
    +14 Argumentbuffer overstroomd
    +$ 0
    +32766 Succes
    +$ NL_MSGMAX
    +32767 Onbekende fout
    diff --git a/lib/libc/nls/uk_UA.UTF-8.msg b/lib/libc/nls/uk_UA.UTF-8.msg
    index e6ea2f7748a0..af871d942766 100644
    --- a/lib/libc/nls/uk_UA.UTF-8.msg
    +++ b/lib/libc/nls/uk_UA.UTF-8.msg
    @@ -1,249 +1,259 @@
    -$ $FreeBSD$
    -$
    -$ Message catalog for uk_UA.UTF-8 locale
    -$
    -$ strerror() support catalog
    -$
    -$set 1
    -$ EPERM
    -1 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ дозволена
    -$ ENOENT
    -2 Ðемає такого файлу або каталогу
    -$ ESRCH
    -3 Ðемає такого процеÑу
    -$ EINTR
    -4 Перервано виклик функції
    -$ EIO
    -5 Помилка вводу-виводу
    -$ ENXIO
    -6 Ðемає такого приÑтрою або адреÑи
    -$ E2BIG
    -7 Перелік аргументів надто довгий
    -$ ENOEXEC
    -8 Помилка формату виконуваного файлу
    -$ EBADF
    -9 Ðевірний деÑкриптор файлу
    -$ ECHILD
    -10 Ðемає дочірнього процеÑу
    -$ EDEADLK
    -11 Уникнуто взаємне Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑів
    -$ ENOMEM
    -12 Ðе доÑтатньо пам'ÑÑ‚Ñ–
    -$ EACCES
    -13 Відмова у доÑтупі
    -$ EFAULT
    -14 Ðевірна адреÑа
    -$ ENOTBLK
    -15 Потрібен блочний приÑтрій
    -$ EBUSY
    -16 РеÑÑƒÑ€Ñ Ð·Ð°Ð¹Ð½Ñтий
    -$ EEXIST
    -17 Файл вже Ñ–Ñнує
    -$ EXDEV
    -18 ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð° межі приÑтрою
    -$ ENODEV
    -19 Ðемає такого приÑтрою
    -$ ENOTDIR
    -20 Це не каталог
    -$ EISDIR
    -21 Це каталог
    -$ EINVAL
    -22 Ðедозволений аргумент
    -$ ENFILE
    -23 Забагато відкритих файлів у ÑиÑтемі
    -$ EMFILE
    -24 Забагато відкритих файлів
    -$ ENOTTY
    -25 Це не термінал
    -$ ETXTBSY
    -26 ТекÑтовий файл зайнÑтий
    -$ EFBIG
    -27 Файл надто великий
    -$ ENOSPC
    -28 Ðе залишилоÑÑŒ міÑÑ†Ñ Ð½Ð° приÑтрої
    -$ ESPIPE
    -29 Ðедозволене позиціонуваннÑ
    -$ EROFS
    -30 Файлова ÑиÑтема лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ
    -$ EMLINK
    -31 Забагато поÑилань
    -$ EPIPE
    -32 Канал зруйновано
    -$ EDOM
    -33 Помилка облаÑÑ‚Ñ– визначеннÑ
    -$ ERANGE
    -34 Результат надто великий
    -$ EAGAIN, EWOULDBLOCK
    -35 РеÑÑƒÑ€Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñово не доÑтупний
    -$ EINPROGRESS
    -36 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ñƒ процеÑÑ– виконаннÑ
    -$ EALREADY
    -37 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ð¶Ðµ виконуєтьÑÑ
    -$ ENOTSOCK
    -38 Це не Ñокет
    -$ EDESTADDRREQ
    -39 Ðеобхідна адреÑа призначеннÑ
    -$ EMSGSIZE
    -40 ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ‚Ð¾ довге
    -$ EPROTOTYPE
    -41 Помилковий тип протоколу Ð´Ð»Ñ Ñокету
    -$ ENOPROTOOPT
    -42 Ðемає такого протоколу
    -$ EPROTONOSUPPORT
    -43 Протокол не підтримуєтьÑÑ
    -$ ESOCKTNOSUPPORT
    -44 Цей тип Ñокету не підтримуєтьÑÑ
    -$ EOPNOTSUPP
    -45 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑ
    -$ EPFNOSUPPORT
    -46 Родина протоколів не підтримуєтьÑÑ
    -$ EAFNOSUPPORT
    -47 Родина Ð°Ð´Ñ€ÐµÑ Ð½Ðµ підтримуєтьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð¼
    -$ EADDRINUSE
    -48 ÐдреÑа вже викориÑтовуєтьÑÑ
    -$ EADDRNOTAVAIL
    -49 ÐдреÑа недоÑÑжна
    -$ ENETDOWN
    -50 Мережа не працює
    -$ ENETUNREACH
    -51 Мережа недоÑÑжна
    -$ ENETRESET
    -52 З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾ мережею
    -$ ECONNABORTED
    -53 З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾
    -$ ECONNRESET
    -54 З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾ протилежною Ñтороною
    -$ ENOBUFS
    -55 Ðемає вільних буферів
    -$ EISCONN
    -56 Сокет вже під'єднано
    -$ ENOTCONN
    -57 Сокет не під'єднано
    -$ ESHUTDOWN
    -58 Ðе можу відіÑлати піÑÐ»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñокету протилежною Ñтороною
    -$ ETOOMANYREFS
    -59 Забагато поÑилань: не можу з'єднати
    -$ ETIMEDOUT
    -60 Вийшов ліміт чаÑу Ð´Ð»Ñ Ð·'єднаннÑ
    -$ ECONNREFUSED
    -61 Відмова у з'єднанні
    -$ ELOOP
    -62 Забагато рівнів Ñимволічних поÑилань
    -$ ENAMETOOLONG
    -63 Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ надто довге
    -$ EHOSTDOWN
    -64 ХоÑÑ‚ не працює
    -$ EHOSTUNREACH
    -65 ХоÑÑ‚ недоÑÑжний
    -$ ENOTEMPTY
    -66 Каталог не порожній
    -$ EPROCLIM
    -67 Забагато процеÑів
    -$ EUSERS
    -68 Забагато кориÑтувачів
    -$ EDQUOT
    -69 Перевищена диÑкова квота
    -$ ESTALE
    -70 ЗаÑтарілий деÑкриптор файлу NFS
    -$ EREMOTE
    -71 Віддалений об'єкт
    -$ EBADRPC
    -72 Погана Ñтруктура RPC
    -$ ERPCMISMATCH
    -73 Ðевірна верÑÑ–Ñ RPC
    -$ EPROGUNAVAIL
    -74 Програма RPC недоÑÑжна
    -$ EPROGMISMATCH
    -75 Ðевірна верÑÑ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸
    -$ EPROCUNAVAIL
    -76 Погана процедура Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸
    -$ ENOLCK
    -77 Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ доÑтупне
    -$ ENOSYS
    -78 Функцію не реалізовано
    -$ EFTYPE
    -79 Ðепридатний тип чи формат файлу
    -$ EAUTH
    -80 Помилка аутентифікації
    -$ ENEEDAUTH
    -81 Потрібна аутентифікаціÑ
    -$ EIDRM
    -82 Ідентифікатор вилучено
    -$ ENOMSG
    -83 Ðемає Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±Ð°Ð¶Ð°Ð½Ð¾Ð³Ð¾ типу
    -$ EOVERFLOW
    -84 Завелике Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних
    -$ ECANCELED
    -85 Операцію ÑкаÑовано
    -$ EILSEQ
    -86 Ðедозволена поÑлідовніÑÑ‚ÑŒ байтів
    -$ ENOATTR
    -87 Ðтрибут не знайдено
    -$ EDOOFUS
    -88 Помилка програмуваннÑ
    -$
    -$ strsignal() support catalog
    -$
    -$set 2
    -$ SIGHUP
    -1 ВідключеннÑ
    -$ SIGINT
    -2 ПерериваннÑ
    -$ SIGQUIT
    -3 Вихід
    -$ SIGILL
    -4 ÐеприпуÑтима інÑтрукціÑ
    -$ SIGTRAP
    -5 ПаÑтка траÑуваннÑ
    -$ SIGABRT
    -6 Ðварійне завершеннÑ
    -$ SIGEMT
    -7 ÐŸÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ ÐµÐ¼ÑƒÐ»ÑŒÐ¾Ð²Ð°Ð½Ð¾Ñ— інÑтрукції
    -$ SIGFPE
    -8 Помилка роботи з плаваючою крапкою
    -$ SIGKILL
    -9 Вбито
    -$ SIGBUS
    -10 Помилка шини
    -$ SIGSEGV
    -11 ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ñегментації
    -$ SIGSYS
    -12 Поганий ÑиÑтемний виклик
    -$ SIGPIPE
    -13 Канал зруйновано
    -$ SIGALRM
    -14 Таймер вичерпано
    -$ SIGTERM
    -15 ЗавершеннÑ
    -$ SIGURG
    -16 Ðевідкладний Ñтан на Ñокеті
    -$ SIGSTOP
    -17 Призупинено (Ñигнал)
    -$ SIGTSTP
    -18 Призупинено
    -$ SIGCONT
    -19 ÐŸÑ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸
    -$ SIGCHLD
    -20 Зміна ÑтатуÑу дочірнього процеÑу
    -$ SIGTTIN
    -21 Зупинено (ввід з терміналу)
    -$ SIGTTOU
    -22 Зупинено (вивід на термінал)
    -$ SIGIO
    -23 Ввід-вивід можливий
    -$ SIGXCPU
    -24 Перевищено ліміт процеÑорного чаÑу
    -$ SIGXFSZ
    -25 Перевищено ліміт макÑимального розміру файла
    -$ SIGVTALRM
    -26 Віртуальний таймер вичерпано
    -$ SIGPROF
    -27 Таймер Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð°Ð½Ð¾
    -$ SIGWINCH
    -28 Розмір вікна змінено
    -$ SIGINFO
    -29 Запит інформації
    -$ SIGUSR1
    -30 Сигнал кориÑтувача 1
    -$ SIGUSR2
    -31 Сигнал кориÑтувача 2
    +$ $FreeBSD$
    +$
    +$ Message catalog for uk_UA.UTF-8 locale
    +$
    +$ strerror() support catalog
    +$
    +$set 1
    +$ EPERM
    +1 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ дозволена
    +$ ENOENT
    +2 Ðемає такого файлу або каталогу
    +$ ESRCH
    +3 Ðемає такого процеÑу
    +$ EINTR
    +4 Перервано виклик функції
    +$ EIO
    +5 Помилка вводу-виводу
    +$ ENXIO
    +6 Ðемає такого приÑтрою або адреÑи
    +$ E2BIG
    +7 Перелік аргументів надто довгий
    +$ ENOEXEC
    +8 Помилка формату виконуваного файлу
    +$ EBADF
    +9 Ðевірний деÑкриптор файлу
    +$ ECHILD
    +10 Ðемає дочірнього процеÑу
    +$ EDEADLK
    +11 Уникнуто взаємне Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑів
    +$ ENOMEM
    +12 Ðе доÑтатньо пам'ÑÑ‚Ñ–
    +$ EACCES
    +13 Відмова у доÑтупі
    +$ EFAULT
    +14 Ðевірна адреÑа
    +$ ENOTBLK
    +15 Потрібен блочний приÑтрій
    +$ EBUSY
    +16 РеÑÑƒÑ€Ñ Ð·Ð°Ð¹Ð½Ñтий
    +$ EEXIST
    +17 Файл вже Ñ–Ñнує
    +$ EXDEV
    +18 ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð° межі приÑтрою
    +$ ENODEV
    +19 Ðемає такого приÑтрою
    +$ ENOTDIR
    +20 Це не каталог
    +$ EISDIR
    +21 Це каталог
    +$ EINVAL
    +22 Ðедозволений аргумент
    +$ ENFILE
    +23 Забагато відкритих файлів у ÑиÑтемі
    +$ EMFILE
    +24 Забагато відкритих файлів
    +$ ENOTTY
    +25 Це не термінал
    +$ ETXTBSY
    +26 ТекÑтовий файл зайнÑтий
    +$ EFBIG
    +27 Файл надто великий
    +$ ENOSPC
    +28 Ðе залишилоÑÑŒ міÑÑ†Ñ Ð½Ð° приÑтрої
    +$ ESPIPE
    +29 Ðедозволене позиціонуваннÑ
    +$ EROFS
    +30 Файлова ÑиÑтема лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ
    +$ EMLINK
    +31 Забагато поÑилань
    +$ EPIPE
    +32 Канал зруйновано
    +$ EDOM
    +33 Помилка облаÑÑ‚Ñ– визначеннÑ
    +$ ERANGE
    +34 Результат надто великий
    +$ EAGAIN, EWOULDBLOCK
    +35 РеÑÑƒÑ€Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñово не доÑтупний
    +$ EINPROGRESS
    +36 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ñƒ процеÑÑ– виконаннÑ
    +$ EALREADY
    +37 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ð¶Ðµ виконуєтьÑÑ
    +$ ENOTSOCK
    +38 Це не Ñокет
    +$ EDESTADDRREQ
    +39 Ðеобхідна адреÑа призначеннÑ
    +$ EMSGSIZE
    +40 ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ‚Ð¾ довге
    +$ EPROTOTYPE
    +41 Помилковий тип протоколу Ð´Ð»Ñ Ñокету
    +$ ENOPROTOOPT
    +42 Ðемає такого протоколу
    +$ EPROTONOSUPPORT
    +43 Протокол не підтримуєтьÑÑ
    +$ ESOCKTNOSUPPORT
    +44 Цей тип Ñокету не підтримуєтьÑÑ
    +$ EOPNOTSUPP
    +45 ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑ
    +$ EPFNOSUPPORT
    +46 Родина протоколів не підтримуєтьÑÑ
    +$ EAFNOSUPPORT
    +47 Родина Ð°Ð´Ñ€ÐµÑ Ð½Ðµ підтримуєтьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð¼
    +$ EADDRINUSE
    +48 ÐдреÑа вже викориÑтовуєтьÑÑ
    +$ EADDRNOTAVAIL
    +49 ÐдреÑа недоÑÑжна
    +$ ENETDOWN
    +50 Мережа не працює
    +$ ENETUNREACH
    +51 Мережа недоÑÑжна
    +$ ENETRESET
    +52 З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾ мережею
    +$ ECONNABORTED
    +53 З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾
    +$ ECONNRESET
    +54 З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾ протилежною Ñтороною
    +$ ENOBUFS
    +55 Ðемає вільних буферів
    +$ EISCONN
    +56 Сокет вже під'єднано
    +$ ENOTCONN
    +57 Сокет не під'єднано
    +$ ESHUTDOWN
    +58 Ðе можу відіÑлати піÑÐ»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñокету протилежною Ñтороною
    +$ ETOOMANYREFS
    +59 Забагато поÑилань: не можу з'єднати
    +$ ETIMEDOUT
    +60 Вийшов ліміт чаÑу Ð´Ð»Ñ Ð·'єднаннÑ
    +$ ECONNREFUSED
    +61 Відмова у з'єднанні
    +$ ELOOP
    +62 Забагато рівнів Ñимволічних поÑилань
    +$ ENAMETOOLONG
    +63 Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ надто довге
    +$ EHOSTDOWN
    +64 ХоÑÑ‚ не працює
    +$ EHOSTUNREACH
    +65 ХоÑÑ‚ недоÑÑжний
    +$ ENOTEMPTY
    +66 Каталог не порожній
    +$ EPROCLIM
    +67 Забагато процеÑів
    +$ EUSERS
    +68 Забагато кориÑтувачів
    +$ EDQUOT
    +69 Перевищена диÑкова квота
    +$ ESTALE
    +70 ЗаÑтарілий деÑкриптор файлу NFS
    +$ EREMOTE
    +71 Віддалений об'єкт
    +$ EBADRPC
    +72 Погана Ñтруктура RPC
    +$ ERPCMISMATCH
    +73 Ðевірна верÑÑ–Ñ RPC
    +$ EPROGUNAVAIL
    +74 Програма RPC недоÑÑжна
    +$ EPROGMISMATCH
    +75 Ðевірна верÑÑ–Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸
    +$ EPROCUNAVAIL
    +76 Погана процедура Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸
    +$ ENOLCK
    +77 Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ доÑтупне
    +$ ENOSYS
    +78 Функцію не реалізовано
    +$ EFTYPE
    +79 Ðепридатний тип чи формат файлу
    +$ EAUTH
    +80 Помилка аутентифікації
    +$ ENEEDAUTH
    +81 Потрібна аутентифікаціÑ
    +$ EIDRM
    +82 Ідентифікатор вилучено
    +$ ENOMSG
    +83 Ðемає Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð±Ð°Ð¶Ð°Ð½Ð¾Ð³Ð¾ типу
    +$ EOVERFLOW
    +84 Завелике Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних
    +$ ECANCELED
    +85 Операцію ÑкаÑовано
    +$ EILSEQ
    +86 Ðедозволена поÑлідовніÑÑ‚ÑŒ байтів
    +$ ENOATTR
    +87 Ðтрибут не знайдено
    +$ EDOOFUS
    +88 Помилка програмуваннÑ
    +$ EBADMSG
    +89 Поганий формат повідомленнÑ
    +$ EMULTIHOP XXX
    +90 Спроба мултіхопу
    +$ ENOLINK
    +91 Мережовий канал розірвано
    +$ EPROTO
    +92 Помилка протоколу
    +$ ENOTCAPABLE
    +93 МожливоÑÑ‚Ñ– недоÑтатні
    +$
    +$ strsignal() support catalog
    +$
    +$set 2
    +$ SIGHUP
    +1 ВідключеннÑ
    +$ SIGINT
    +2 ПерериваннÑ
    +$ SIGQUIT
    +3 Вихід
    +$ SIGILL
    +4 ÐеприпуÑтима інÑтрукціÑ
    +$ SIGTRAP
    +5 ПаÑтка траÑуваннÑ
    +$ SIGABRT
    +6 Ðварійне завершеннÑ
    +$ SIGEMT
    +7 ÐŸÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ ÐµÐ¼ÑƒÐ»ÑŒÐ¾Ð²Ð°Ð½Ð¾Ñ— інÑтрукції
    +$ SIGFPE
    +8 Помилка роботи з плаваючою крапкою
    +$ SIGKILL
    +9 Вбито
    +$ SIGBUS
    +10 Помилка шини
    +$ SIGSEGV
    +11 ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ñегментації
    +$ SIGSYS
    +12 Поганий ÑиÑтемний виклик
    +$ SIGPIPE
    +13 Канал зруйновано
    +$ SIGALRM
    +14 Таймер вичерпано
    +$ SIGTERM
    +15 ЗавершеннÑ
    +$ SIGURG
    +16 Ðевідкладний Ñтан на Ñокеті
    +$ SIGSTOP
    +17 Призупинено (Ñигнал)
    +$ SIGTSTP
    +18 Призупинено
    +$ SIGCONT
    +19 ÐŸÑ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸
    +$ SIGCHLD
    +20 Зміна ÑтатуÑу дочірнього процеÑу
    +$ SIGTTIN
    +21 Зупинено (ввід з терміналу)
    +$ SIGTTOU
    +22 Зупинено (вивід на термінал)
    +$ SIGIO
    +23 Ввід-вивід можливий
    +$ SIGXCPU
    +24 Перевищено ліміт процеÑорного чаÑу
    +$ SIGXFSZ
    +25 Перевищено ліміт макÑимального розміру файла
    +$ SIGVTALRM
    +26 Віртуальний таймер вичерпано
    +$ SIGPROF
    +27 Таймер Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð°Ð½Ð¾
    +$ SIGWINCH
    +28 Розмір вікна змінено
    +$ SIGINFO
    +29 Запит інформації
    +$ SIGUSR1
    +30 Сигнал кориÑтувача 1
    +$ SIGUSR2
    +31 Сигнал кориÑтувача 2
    diff --git a/lib/libc/posix1e/Makefile.inc b/lib/libc/posix1e/Makefile.inc
    index c9e78bda89de..30e39864a0ef 100644
    --- a/lib/libc/posix1e/Makefile.inc
    +++ b/lib/libc/posix1e/Makefile.inc
    @@ -119,3 +119,5 @@ MLINKS+=acl_create_entry.3 acl_create_entry_np.3\
     	mac_set.3 mac_set_proc.3		\
     	mac_text.3 mac_from_text.3		\
     	mac_text.3 mac_to_text.3
    +
    +CLEANFILES+=	subr_acl_nfs4.c
    diff --git a/lib/libc/posix1e/acl_delete_entry.c b/lib/libc/posix1e/acl_delete_entry.c
    index 7dd60b82182c..09b450729aa9 100644
    --- a/lib/libc/posix1e/acl_delete_entry.c
    +++ b/lib/libc/posix1e/acl_delete_entry.c
    @@ -75,6 +75,7 @@ int
     acl_delete_entry(acl_t acl, acl_entry_t entry_d)
     {
     	struct acl *acl_int;
    +	struct acl_entry entry_int;
     	int i, j, found = 0;
     
     	if (acl == NULL || entry_d == NULL) {
    @@ -94,8 +95,12 @@ acl_delete_entry(acl_t acl, acl_entry_t entry_d)
     		errno = EINVAL;
     		return (-1);
     	}
    +
    +	/* Use a local copy to prevent deletion of more than this entry */
    +	entry_int = *entry_d;
    +
     	for (i = 0; i < acl->ats_acl.acl_cnt;) {
    -		if (_entry_matches(&(acl->ats_acl.acl_entry[i]), entry_d)) {
    +		if (_entry_matches(&(acl->ats_acl.acl_entry[i]), &entry_int)) {
     			/* ...shift the remaining entries... */
     			for (j = i; j < acl->ats_acl.acl_cnt - 1; ++j)
     				acl->ats_acl.acl_entry[j] =
    diff --git a/lib/libc/posix1e/acl_from_text.c b/lib/libc/posix1e/acl_from_text.c
    index 98c54261d555..c600987f9f6d 100644
    --- a/lib/libc/posix1e/acl_from_text.c
    +++ b/lib/libc/posix1e/acl_from_text.c
    @@ -257,6 +257,7 @@ acl_from_text(const char *buf_p)
     	}
     #endif
     
    +	free(mybuf_p);
     	return(acl);
     
     error_label:
    diff --git a/lib/libc/posix1e/acl_to_text.c b/lib/libc/posix1e/acl_to_text.c
    index 79a950a543c8..e5fd1f79d1ce 100644
    --- a/lib/libc/posix1e/acl_to_text.c
    +++ b/lib/libc/posix1e/acl_to_text.c
    @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    -#include 
     
     #include "acl_support.h"
     
    @@ -58,7 +57,7 @@ _posix1e_acl_to_text(acl_t acl, ssize_t *len_p, int flags)
     {
     	struct acl	*acl_int;
     	char		*buf, *tmpbuf;
    -	char		 name_buf[UT_NAMESIZE+1];
    +	char		 name_buf[MAXLOGNAME];
     	char		 perm_buf[_POSIX1E_ACL_STRING_PERM_MAXSIZE+1],
     			 effective_perm_buf[_POSIX1E_ACL_STRING_PERM_MAXSIZE+1];
     	int		 i, error, len;
    @@ -103,7 +102,7 @@ _posix1e_acl_to_text(acl_t acl, ssize_t *len_p, int flags)
     				goto error_label;
     
     			error = _posix1e_acl_id_to_name(ae_tag, ae_id,
    -			    UT_NAMESIZE+1, name_buf, flags);
    +			    MAXLOGNAME, name_buf, flags);
     			if (error)
     				goto error_label;
     
    @@ -163,7 +162,7 @@ _posix1e_acl_to_text(acl_t acl, ssize_t *len_p, int flags)
     				goto error_label;
     
     			error = _posix1e_acl_id_to_name(ae_tag, ae_id,
    -			    UT_NAMESIZE+1, name_buf, flags);
    +			    MAXLOGNAME, name_buf, flags);
     			if (error)
     				goto error_label;
     
    diff --git a/lib/libc/posix1e/mac.3 b/lib/libc/posix1e/mac.3
    index c570998ba7a1..6499d6bf156b 100644
    --- a/lib/libc/posix1e/mac.3
    +++ b/lib/libc/posix1e/mac.3
    @@ -154,8 +154,8 @@ system objects, but without policy-specific knowledge.
     .Sh STANDARDS
     These APIs are loosely based on the APIs described in POSIX.1e, as described
     in IEEE POSIX.1e draft 17.
    -However, the resemblence of these APIS to the POSIX APIs is loose, as the
    -PSOXI APIS were unable to express some notinos required for flexible and
    +However, the resemblence of these APIs to the POSIX APIs is loose, as the
    +POSIX APIs were unable to express some notions required for flexible and
     extensible access control.
     .Sh HISTORY
     Support for Mandatory Access Control was introduced in
    diff --git a/lib/libc/rpc/clnt_raw.c b/lib/libc/rpc/clnt_raw.c
    index 9d34a3d445cf..cd3a384ea3c1 100644
    --- a/lib/libc/rpc/clnt_raw.c
    +++ b/lib/libc/rpc/clnt_raw.c
    @@ -92,13 +92,13 @@ clnt_raw_create(prog, vers)
     	rpcprog_t prog;
     	rpcvers_t vers;
     {
    -	struct clntraw_private *clp = clntraw_private;
    +	struct clntraw_private *clp;
     	struct rpc_msg call_msg;
    -	XDR *xdrs = &clp->xdr_stream;
    -	CLIENT	*client = &clp->client_object;
    +	XDR *xdrs;
    +	CLIENT	*client;
     
     	mutex_lock(&clntraw_lock);
    -	if (clp == NULL) {
    +	if ((clp = clntraw_private) == NULL) {
     		clp = (struct clntraw_private *)calloc(1, sizeof (*clp));
     		if (clp == NULL) {
     			mutex_unlock(&clntraw_lock);
    @@ -110,6 +110,9 @@ clnt_raw_create(prog, vers)
     		clp->_raw_buf = __rpc_rawcombuf;
     		clntraw_private = clp;
     	}
    +	xdrs = &clp->xdr_stream;
    +	client = &clp->client_object;
    +
     	/*
     	 * pre-serialize the static part of the call msg and stash it away
     	 */
    diff --git a/lib/libc/rpc/getnetconfig.c b/lib/libc/rpc/getnetconfig.c
    index 9baa22495c57..e5db51ac3a36 100644
    --- a/lib/libc/rpc/getnetconfig.c
    +++ b/lib/libc/rpc/getnetconfig.c
    @@ -412,13 +412,13 @@ void *handlep;
          * Noone needs these entries anymore, then frees them.
          * Make sure all info in netconfig_info structure has been reinitialized.
          */
    -    q = p = ni.head;
    +    q = ni.head;
         ni.eof = ni.ref = 0;
         ni.head = NULL;
         ni.tail = NULL;
         mutex_unlock(&ni_lock);
     
    -    while (q) {
    +    while (q != NULL) {
     	p = q->next;
     	if (q->ncp->nc_lookups != NULL) free(q->ncp->nc_lookups);
     	free(q->ncp);
    diff --git a/lib/libc/rpc/getnetpath.c b/lib/libc/rpc/getnetpath.c
    index 0563544df2af..d1ea554aa7b5 100644
    --- a/lib/libc/rpc/getnetpath.c
    +++ b/lib/libc/rpc/getnetpath.c
    @@ -101,7 +101,7 @@ setnetpath()
         if ((np_sessionp->nc_handlep = setnetconfig()) == NULL) {
     	free(np_sessionp);
     	syslog (LOG_ERR, "rpc: failed to open " NETCONFIG);
    -	goto failed;
    +    	return (NULL);
         }
         np_sessionp->valid = NP_VALID;
         np_sessionp->ncp_list = NULL;
    diff --git a/lib/libc/rpc/getrpcent.c b/lib/libc/rpc/getrpcent.c
    index abee480b35f5..1f198fa9a0b6 100644
    --- a/lib/libc/rpc/getrpcent.c
    +++ b/lib/libc/rpc/getrpcent.c
    @@ -698,7 +698,7 @@ rpc_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
     		return (NS_RETURN);
     	}
     
    -	memcpy(&new_rpc, rpc, sizeof(struct rpcent));
    +	new_rpc = *rpc;
     
     	*buffer_size = desired_size;
     	memset(buffer, 0, desired_size);
    diff --git a/lib/libc/rpc/key_call.c b/lib/libc/rpc/key_call.c
    index 615f24d9e867..6cc1139ab526 100644
    --- a/lib/libc/rpc/key_call.c
    +++ b/lib/libc/rpc/key_call.c
    @@ -302,7 +302,7 @@ int	vers;
     	void *localhandle;
     	struct netconfig *nconf;
     	struct netconfig *tpconf;
    -	struct key_call_private *kcp = key_call_private_main;
    +	struct key_call_private *kcp;
     	struct timeval wait_time;
     	struct utsname u;
     	int main_thread;
    diff --git a/lib/libc/rpc/svc.c b/lib/libc/rpc/svc.c
    index d2051218f497..282c2be2e19d 100644
    --- a/lib/libc/rpc/svc.c
    +++ b/lib/libc/rpc/svc.c
    @@ -627,8 +627,8 @@ svc_getreqset(readfds)
     
     	maskp = readfds->fds_bits;
     	for (sock = 0; sock < FD_SETSIZE; sock += NFDBITS) {
    -	    for (mask = *maskp++; (bit = ffs(mask)) != 0;
    -		mask ^= (1 << (bit - 1))) {
    +	    for (mask = *maskp++; (bit = ffsl(mask)) != 0;
    +		mask ^= (1ul << (bit - 1))) {
     		/* sock has input waiting */
     		fd = sock + bit - 1;
     		svc_getreq_common(fd);
    diff --git a/lib/libc/rpc/svc_auth_des.c b/lib/libc/rpc/svc_auth_des.c
    index 84f1e19a1759..de4d1b4069f2 100644
    --- a/lib/libc/rpc/svc_auth_des.c
    +++ b/lib/libc/rpc/svc_auth_des.c
    @@ -449,10 +449,10 @@ cache_spot(key, name, timestamp)
     #define INVALID		-1 	/* grouplen, if cache entry is invalid */
     
     struct bsdcred {
    -	short uid;		/* cached uid */
    -	short gid;		/* cached gid */
    -	short grouplen;	/* length of cached groups */
    -	short groups[NGROUPS];	/* cached groups */
    +	uid_t uid;		/* cached uid */
    +	gid_t gid;		/* cached gid */
    +	int grouplen;	/* length of cached groups */
    +	gid_t groups[NGRPS];	/* cached groups */
     };
     
     /*
    diff --git a/lib/libc/rpc/svc_raw.c b/lib/libc/rpc/svc_raw.c
    index 7492046a8888..67bcba1c8683 100644
    --- a/lib/libc/rpc/svc_raw.c
    +++ b/lib/libc/rpc/svc_raw.c
    @@ -176,9 +176,8 @@ svc_raw_reply(xprt, msg)
     		msg->acpted_rply.ar_results.proc = (xdrproc_t) xdr_void;
     		msg->acpted_rply.ar_results.where = NULL;
     
    -		if (!xdr_replymsg(xdrs, msg) ||
    -		    !SVCAUTH_WRAP(&SVC_AUTH(xprt), xdrs, xdr_proc, xdr_where))
    -			stat = FALSE;
    +		stat = xdr_replymsg(xdrs, msg) &&
    +		    SVCAUTH_WRAP(&SVC_AUTH(xprt), xdrs, xdr_proc, xdr_where);
     	} else {
     		stat = xdr_replymsg(xdrs, msg);
     	}
    diff --git a/lib/libc/stdio/fgetws.c b/lib/libc/stdio/fgetws.c
    index bbc0299d773c..550843dff676 100644
    --- a/lib/libc/stdio/fgetws.c
    +++ b/lib/libc/stdio/fgetws.c
    @@ -89,7 +89,7 @@ fgetws(wchar_t * __restrict ws, int n, FILE * __restrict fp)
     	if (!__mbsinit(&fp->_mbstate))
     		/* Incomplete character */
     		goto error;
    -	*wsp++ = L'\0';
    +	*wsp = L'\0';
     	FUNLOCKFILE(fp);
     
     	return (ws);
    diff --git a/lib/libc/stdio/findfp.c b/lib/libc/stdio/findfp.c
    index 586e15c4f8bb..5bc4af73a35a 100644
    --- a/lib/libc/stdio/findfp.c
    +++ b/lib/libc/stdio/findfp.c
    @@ -168,7 +168,7 @@ __warn_references(f_prealloc,
     	"warning: this program uses f_prealloc(), which is not recommended.");
     
     void
    -f_prealloc()
    +f_prealloc(void)
     {
     	struct glue *g;
     	int n;
    diff --git a/lib/libc/stdio/fread.c b/lib/libc/stdio/fread.c
    index 6253856b9e33..ad3ea29de3e0 100644
    --- a/lib/libc/stdio/fread.c
    +++ b/lib/libc/stdio/fread.c
    @@ -37,6 +37,8 @@ static char sccsid[] = "@(#)fread.c	8.2 (Berkeley) 12/11/93";
     __FBSDID("$FreeBSD$");
     
     #include "namespace.h"
    +#include 
    +#include 
     #include 
     #include 
     #include "un-namespace.h"
    @@ -69,8 +71,27 @@ __fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict fp)
     	/*
     	 * ANSI and SUSv2 require a return value of 0 if size or count are 0.
     	 */
    -	if ((resid = count * size) == 0)
    +	if ((count == 0) || (size == 0))
     		return (0);
    +
    +	/*
    +	 * Check for integer overflow.  As an optimization, first check that
    +	 * at least one of {count, size} is at least 2^16, since if both
    +	 * values are less than that, their product can't possible overflow
    +	 * (size_t is always at least 32 bits on FreeBSD).
    +	 */
    +	if (((count | size) > 0xFFFF) &&
    +	    (count > SIZE_MAX / size)) {
    +		errno = EINVAL;
    +		fp->_flags |= __SERR;
    +		return (0);
    +	}
    +
    +	/*
    +	 * Compute the (now required to not overflow) number of bytes to
    +	 * read and actually do the work.
    +	 */
    +	resid = count * size;
     	ORIENT(fp, -1);
     	if (fp->_r < 0)
     		fp->_r = 0;
    diff --git a/lib/libc/stdio/funopen.c b/lib/libc/stdio/funopen.c
    index 9535340cb262..573589f14d53 100644
    --- a/lib/libc/stdio/funopen.c
    +++ b/lib/libc/stdio/funopen.c
    @@ -42,11 +42,11 @@ __FBSDID("$FreeBSD$");
     #include "local.h"
     
     FILE *
    -funopen(cookie, readfn, writefn, seekfn, closefn)
    -	const void *cookie;
    -	int (*readfn)(), (*writefn)();
    -	fpos_t (*seekfn)(void *cookie, fpos_t off, int whence);
    -	int (*closefn)();
    +funopen(const void *cookie,
    +	int (*readfn)(void *, char *, int),
    +	int (*writefn)(void *, const char *, int),
    +	fpos_t (*seekfn)(void *, fpos_t, int),
    +	int (*closefn)(void *))
     {
     	FILE *fp;
     	int flags;
    diff --git a/lib/libc/stdio/fvwrite.c b/lib/libc/stdio/fvwrite.c
    index fd69eb954208..7206676869e6 100644
    --- a/lib/libc/stdio/fvwrite.c
    +++ b/lib/libc/stdio/fvwrite.c
    @@ -60,7 +60,7 @@ __sfvwrite(fp, uio)
     	char *nl;
     	int nlknown, nldist;
     
    -	if ((len = uio->uio_resid) == 0)
    +	if (uio->uio_resid == 0)
     		return (0);
     	/* make sure we can write */
     	if (prepwrite(fp) != 0)
    diff --git a/lib/libc/stdio/fwrite.c b/lib/libc/stdio/fwrite.c
    index cf52e42f615f..acac94398ea4 100644
    --- a/lib/libc/stdio/fwrite.c
    +++ b/lib/libc/stdio/fwrite.c
    @@ -37,6 +37,8 @@ static char sccsid[] = "@(#)fwrite.c	8.1 (Berkeley) 6/4/93";
     __FBSDID("$FreeBSD$");
     
     #include "namespace.h"
    +#include 
    +#include 
     #include 
     #include "un-namespace.h"
     #include "local.h"
    @@ -60,10 +62,24 @@ fwrite(buf, size, count, fp)
     	/*
     	 * ANSI and SUSv2 require a return value of 0 if size or count are 0.
     	 */
    -	n = count * size;
    -	if (n == 0)
    +	if ((count == 0) || (size == 0))
     		return (0);
     
    +	/*
    +	 * Check for integer overflow.  As an optimization, first check that
    +	 * at least one of {count, size} is at least 2^16, since if both
    +	 * values are less than that, their product can't possible overflow
    +	 * (size_t is always at least 32 bits on FreeBSD).
    +	 */
    +	if (((count | size) > 0xFFFF) &&
    +	    (count > SIZE_MAX / size)) {
    +		errno = EINVAL;
    +		fp->_flags |= __SERR;
    +		return (0);
    +	}
    +
    +	n = count * size;
    +
     	iov.iov_base = (void *)buf;
     	uio.uio_resid = iov.iov_len = n;
     	uio.uio_iov = &iov;
    diff --git a/lib/libc/stdio/getc.3 b/lib/libc/stdio/getc.3
    index c8b938664f28..d0f3c15f0728 100644
    --- a/lib/libc/stdio/getc.3
    +++ b/lib/libc/stdio/getc.3
    @@ -56,7 +56,7 @@
     .Ft int
     .Fn getchar void
     .Ft int
    -.Fn getchar_unlocked "void"
    +.Fn getchar_unlocked void
     .Ft int
     .Fn getw "FILE *stream"
     .Sh DESCRIPTION
    @@ -141,7 +141,7 @@ until the condition is cleared with
     .Sh STANDARDS
     The
     .Fn fgetc ,
    -.Fn getc
    +.Fn getc ,
     and
     .Fn getchar
     functions
    @@ -167,4 +167,3 @@ The size and byte order of an
     varies from one machine to another, and
     .Fn getw
     is not recommended for portable applications.
    -.Pp
    diff --git a/lib/libc/stdio/getdelim.c b/lib/libc/stdio/getdelim.c
    index 7af154f6af51..d7d5627ec92f 100644
    --- a/lib/libc/stdio/getdelim.c
    +++ b/lib/libc/stdio/getdelim.c
    @@ -120,8 +120,8 @@ getdelim(char ** __restrict linep, size_t * __restrict linecapp, int delim,
     		goto error;
     	}
     
    -	if (*linecapp == 0)
    -		*linep = NULL;
    +	if (*linep == NULL)
    +		*linecapp = 0;
     
     	if (fp->_r <= 0 && __srefill(fp)) {
     		/* If fp is at EOF already, we just need space for the NUL. */
    diff --git a/lib/libc/stdio/getline.3 b/lib/libc/stdio/getline.3
    index 0465f9350ee5..a5b39da42515 100644
    --- a/lib/libc/stdio/getline.3
    +++ b/lib/libc/stdio/getline.3
    @@ -78,7 +78,8 @@ and
     .Fn getline
     functions return the number of characters written, excluding the
     terminating
    -.Dv NUL .
    +.Dv NUL 
    +character.
     The value \-1 is returned if an error occurs, or if end-of-file is reached.
     .Sh EXAMPLES
     The following code fragment reads lines from a file and
    diff --git a/lib/libc/stdio/mktemp.c b/lib/libc/stdio/mktemp.c
    index 3f1e699f213e..a30b930354e3 100644
    --- a/lib/libc/stdio/mktemp.c
    +++ b/lib/libc/stdio/mktemp.c
    @@ -116,6 +116,10 @@ _gettemp(path, doopen, domkdir, slen)
     
     	for (trv = path; *trv != '\0'; ++trv)
     		;
    +	if (trv - path >= MAXPATHLEN) {
    +		errno = ENAMETOOLONG;
    +		return (0);
    +	}
     	trv -= slen;
     	suffp = trv;
     	--trv;
    diff --git a/lib/libc/stdio/printf.3 b/lib/libc/stdio/printf.3
    index 27d5bf0d7e05..8de2bb8860bc 100644
    --- a/lib/libc/stdio/printf.3
    +++ b/lib/libc/stdio/printf.3
    @@ -32,7 +32,7 @@
     .\"     @(#)printf.3	8.1 (Berkeley) 6/4/93
     .\" $FreeBSD$
     .\"
    -.Dd March 3, 2009
    +.Dd December 2, 2009
     .Dt PRINTF 3
     .Os
     .Sh NAME
    @@ -55,7 +55,7 @@
     .Ft int
     .Fn asprintf "char **ret" "const char *format" ...
     .Ft int
    -.Fn dprintf "int" "const char * restrict format" ...
    +.Fn dprintf "int fd" "const char * restrict format" ...
     .In stdarg.h
     .Ft int
     .Fn vprintf "const char * restrict format" "va_list ap"
    @@ -812,7 +812,7 @@ available.
     The conversion formats
     .Cm \&%D , \&%O ,
     and
    -.Cm %U
    +.Cm \&%U
     are not standard and
     are provided only for backward compatibility.
     The effect of padding the
    diff --git a/lib/libc/stdio/sprintf.c b/lib/libc/stdio/sprintf.c
    index aaaae5535d2c..b55bd6cfa2cb 100644
    --- a/lib/libc/stdio/sprintf.c
    +++ b/lib/libc/stdio/sprintf.c
    @@ -46,17 +46,9 @@ sprintf(char * __restrict str, char const * __restrict fmt, ...)
     {
     	int ret;
     	va_list ap;
    -	FILE f;
     
    -	f._file = -1;
    -	f._flags = __SWR | __SSTR;
    -	f._bf._base = f._p = (unsigned char *)str;
    -	f._bf._size = f._w = INT_MAX;
    -	f._orientation = 0;
    -	memset(&f._mbstate, 0, sizeof(mbstate_t));
     	va_start(ap, fmt);
    -	ret = __vfprintf(&f, fmt, ap);
    +	ret = vsprintf(str, fmt, ap);
     	va_end(ap);
    -	*f._p = 0;
     	return (ret);
     }
    diff --git a/lib/libc/stdio/sscanf.c b/lib/libc/stdio/sscanf.c
    index 3c792e054ba5..c793b86699cc 100644
    --- a/lib/libc/stdio/sscanf.c
    +++ b/lib/libc/stdio/sscanf.c
    @@ -41,37 +41,14 @@ __FBSDID("$FreeBSD$");
     #include 
     #include "local.h"
     
    -static int eofread(void *, char *, int);
    -
    -/* ARGSUSED */
    -static int
    -eofread(cookie, buf, len)
    -	void *cookie;
    -	char *buf;
    -	int len;
    -{
    -
    -	return (0);
    -}
    -
     int
     sscanf(const char * __restrict str, char const * __restrict fmt, ...)
     {
     	int ret;
     	va_list ap;
    -	FILE f;
     
    -	f._file = -1;
    -	f._flags = __SRD;
    -	f._bf._base = f._p = (unsigned char *)str;
    -	f._bf._size = f._r = strlen(str);
    -	f._read = eofread;
    -	f._ub._base = NULL;
    -	f._lb._base = NULL;
    -	f._orientation = 0;
    -	memset(&f._mbstate, 0, sizeof(mbstate_t));
     	va_start(ap, fmt);
    -	ret = __svfscanf(&f, fmt, ap);
    +	ret = vsscanf(str, fmt, ap);
     	va_end(ap);
     	return (ret);
     }
    diff --git a/lib/libc/stdio/vfwprintf.c b/lib/libc/stdio/vfwprintf.c
    index f3768de8d193..d34f559a8f3b 100644
    --- a/lib/libc/stdio/vfwprintf.c
    +++ b/lib/libc/stdio/vfwprintf.c
    @@ -293,7 +293,7 @@ __mbsconv(char *mbsarg, int prec)
     		 * number of characters to print.
     		 */
     		p = mbsarg;
    -		insize = nchars = 0;
    +		insize = nchars = nconv = 0;
     		mbs = initial_mbs;
     		while (nchars != (size_t)prec) {
     			nconv = mbrlen(p, MB_CUR_MAX, &mbs);
    diff --git a/lib/libc/stdio/vsscanf.c b/lib/libc/stdio/vsscanf.c
    index e5e96917b42f..22b5d2bdac09 100644
    --- a/lib/libc/stdio/vsscanf.c
    +++ b/lib/libc/stdio/vsscanf.c
    @@ -45,20 +45,15 @@ eofread(void *, char *, int);
     
     /* ARGSUSED */
     static int
    -eofread(cookie, buf, len)
    -	void *cookie;
    -	char *buf;
    -	int len;
    +eofread(void *cookie, char *buf, int len)
     {
     
     	return (0);
     }
     
     int
    -vsscanf(str, fmt, ap)
    -	const char * __restrict str;
    -	const char * __restrict fmt;
    -	__va_list ap;
    +vsscanf(const char * __restrict str, const char * __restrict fmt,
    +	__va_list ap)
     {
     	FILE f;
     
    diff --git a/lib/libc/stdio/xprintf_time.c b/lib/libc/stdio/xprintf_time.c
    index 81697f165a43..9d732fe4f415 100644
    --- a/lib/libc/stdio/xprintf_time.c
    +++ b/lib/libc/stdio/xprintf_time.c
    @@ -64,7 +64,6 @@ __printf_render_time(struct __printf_io *io, const struct printf_info *pi, const
     	intmax_t t, tx;
     	int i, prec, nsec;
     
    -	prec = 0;
     	if (pi->is_long) {
     		tv = *((struct timeval **)arg[0]);
     		t = tv->tv_sec;
    @@ -78,6 +77,8 @@ __printf_render_time(struct __printf_io *io, const struct printf_info *pi, const
     	} else {
     		tp = *((time_t **)arg[0]);
     		t = *tp;
    +		nsec = 0;
    +		prec = 0;
     	}
     
     	p = buf;
    diff --git a/lib/libc/stdlib/getenv.3 b/lib/libc/stdlib/getenv.3
    index 33d9c36f3a79..fd7d856f0481 100644
    --- a/lib/libc/stdlib/getenv.3
    +++ b/lib/libc/stdlib/getenv.3
    @@ -107,6 +107,15 @@ function
     deletes all instances of the variable name pointed to by
     .Fa name
     from the list.
    +.Pp
    +If corruption (e.g., a name without a value) is detected while making a copy of
    +environ for internal usage, then
    +.Fn setenv ,
    +.Fn unsetenv
    +and
    +.Fn putenv
    +will output a warning to stderr about the issue, drop the corrupt entry and
    +complete the task without error.
     .Sh RETURN VALUES
     The
     .Fn getenv
    @@ -159,15 +168,6 @@ The function
     or
     .Fn putenv
     failed because they were unable to allocate memory for the environment.
    -.It Bq Er EFAULT
    -The functions
    -.Fn setenv ,
    -.Fn unsetenv
    -or
    -.Fn putenv
    -failed to make a valid copy of the environment due to the environment being
    -corrupt (i.e., a name without a value).  A warning will be output to stderr with
    -information about the issue.
     .El
     .Sh SEE ALSO
     .Xr csh 1 ,
    diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c
    index 2abf7fc7b01e..b7826d72a5d4 100644
    --- a/lib/libc/stdlib/getenv.c
    +++ b/lib/libc/stdlib/getenv.c
    @@ -1,5 +1,5 @@
     /*-
    - * Copyright (c) 2007-2008 Sean C. Farley 
    + * Copyright (c) 2007-2009 Sean C. Farley 
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
    @@ -160,7 +160,7 @@ __findenv(const char *name, size_t nameLen, int *envNdx, bool onlyActive)
     
     	/*
     	 * Find environment variable from end of array (more likely to be
    -	 * active).  A variable created by putenv is always active or it is not
    +	 * active).  A variable created by putenv is always active, or it is not
     	 * tracked in the array.
     	 */
     	for (ndx = *envNdx; ndx >= 0; ndx--)
    @@ -426,13 +426,14 @@ getenv(const char *name)
     	}
     
     	/*
    -	 * An empty environment (environ or its first value) regardless if
    -	 * environ has been copied before will return a NULL.
    +	 * Variable search order:
    +	 * 1. Check for an empty environ.  This allows an application to clear
    +	 *    the environment.
    +	 * 2. Search the external environ array.
    +	 * 3. Search the internal environment.
     	 *
    -	 * If the environment is not empty, find an environment variable via
    -	 * environ if environ has not been copied via an *env() call or been
    -	 * replaced by a running program, otherwise, use the rebuilt
    -	 * environment.
    +	 * Since malloc() depends upon getenv(), getenv() must never cause the
    +	 * internal environment storage to be generated.
     	 */
     	if (environ == NULL || environ[0] == NULL)
     		return (NULL);
    diff --git a/lib/libc/stdlib/malloc.3 b/lib/libc/stdlib/malloc.3
    index 308ba7b3e123..9b9fe96963e3 100644
    --- a/lib/libc/stdlib/malloc.3
    +++ b/lib/libc/stdlib/malloc.3
    @@ -32,7 +32,7 @@
     .\"     @(#)malloc.3	8.1 (Berkeley) 6/4/93
     .\" $FreeBSD$
     .\"
    -.Dd September 26, 2009
    +.Dd January 31, 2010
     .Dt MALLOC 3
     .Os
     .Sh NAME
    @@ -55,9 +55,7 @@
     .Ft const char *
     .Va _malloc_options ;
     .Ft void
    -.Fo \*(lp*_malloc_message\*(rp
    -.Fa "const char *p1" "const char *p2" "const char *p3" "const char *p4"
    -.Fc
    +.Fn \*(lp*_malloc_message\*(rp "const char *p1" "const char *p2" "const char *p3" "const char *p4"
     .In malloc_np.h
     .Ft size_t
     .Fn malloc_usable_size "const void *ptr"
    @@ -124,7 +122,9 @@ will free the passed pointer when the requested memory cannot be allocated.
     This is a
     .Fx
     specific API designed to ease the problems with traditional coding styles
    -for realloc causing memory leaks in libraries.
    +for
    +.Fn realloc
    +causing memory leaks in libraries.
     .Pp
     The
     .Fn free
    @@ -184,18 +184,6 @@ flags being set) become fatal.
     The process will call
     .Xr abort 3
     in these cases.
    -.It B
    -Double/halve the per-arena lock contention threshold at which a thread is
    -randomly re-assigned to an arena.
    -This dynamic load balancing tends to push threads away from highly contended
    -arenas, which avoids worst case contention scenarios in which threads
    -disproportionately utilize arenas.
    -However, due to the highly dynamic load that applications may place on the
    -allocator, it is impossible for the allocator to know in advance how sensitive
    -it should be to contention over arenas.
    -Therefore, some applications may benefit from increasing or decreasing this
    -threshold parameter.
    -This option is not available for some configurations (non-PIC).
     .It C
     Double/halve the size of the maximum size class that is a multiple of the
     cacheline size (64).
    @@ -209,44 +197,62 @@ This option is enabled by default.
     See the
     .Dq M
     option for related information and interactions.
    +.It E
    +Double/halve the size of the maximum medium size class.
    +The valid range is from one page to one half chunk.
    +The default value is 32 KiB.
     .It F
    -Double/halve the per-arena maximum number of dirty unused pages that are
    -allowed to accumulate before informing the kernel about at least half of those
    -pages via
    +Halve/double the per-arena minimum ratio of active to dirty pages.
    +Some dirty unused pages may be allowed to accumulate, within the limit set by
    +the ratio, before informing the kernel about at least half of those pages via
     .Xr madvise 2 .
     This provides the kernel with sufficient information to recycle dirty pages if
     physical memory becomes scarce and the pages remain unused.
    -The default is 512 pages per arena;
    -.Ev MALLOC_OPTIONS=10f
    -will prevent any dirty unused pages from accumulating.
    +The default minimum ratio is 32:1;
    +.Ev MALLOC_OPTIONS=6F
    +will disable dirty page purging.
     .It G
    -When there are multiple threads, use thread-specific caching for objects that
    -are smaller than one page.
    -This option is enabled by default.
    -Thread-specific caching allows many allocations to be satisfied without
    -performing any thread synchronization, at the cost of increased memory use.
    +Double/halve the approximate interval (counted in terms of
    +thread-specific cache allocation/deallocation events) between full
    +thread-specific cache garbage collection sweeps.
    +Garbage collection is actually performed incrementally, one size
    +class at a time, in order to avoid large collection pauses.
    +The default sweep interval is 8192;
    +.Ev JEMALLOC_OPTIONS=14g
    +will disable garbage collection.
    +.It H
    +Double/halve the number of thread-specific cache slots per size
    +class.
    +When there are multiple threads, each thread uses a
    +thread-specific cache for small and medium objects.
    +Thread-specific caching allows many allocations to be satisfied
    +without performing any thread synchronization, at the cost of
    +increased memory use.
     See the
    -.Dq R
    +.Dq G
     option for related tuning information.
    -This option is not available for some configurations (non-PIC).
    +The default number of cache slots is 128;
    +.Ev JEMALLOC_OPTIONS=7h
    +will disable thread-specific caching.
    +Note that one cache slot per size class is not a valid
    +configuration due to implementation details.
     .It J
     Each byte of new memory allocated by
     .Fn malloc ,
    -.Fn realloc
    +.Fn realloc ,
     or
     .Fn reallocf
     will be initialized to 0xa5.
     All memory returned by
     .Fn free ,
    -.Fn realloc
    +.Fn realloc ,
     or
     .Fn reallocf
     will be initialized to 0x5a.
     This is intended for debugging and will impact performance negatively.
     .It K
     Double/halve the virtual memory chunk size.
    -The default chunk size is the maximum of 1 MB and the largest
    -page size that is less than or equal to 4 MB.
    +The default chunk size is 4 MiB.
     .It M
     Use
     .Xr mmap 2
    @@ -279,14 +285,6 @@ Double/halve the size of the maximum size class that is a multiple of the
     quantum (8 or 16 bytes, depending on architecture).
     Above this size, cacheline spacing is used for size classes.
     The default value is 128 bytes.
    -.It R
    -Double/halve magazine size, which approximately doubles/halves the number of
    -rounds in each magazine.
    -Magazines are used by the thread-specific caching machinery to acquire and
    -release objects in bulk.
    -Increasing the magazine size decreases locking overhead, at the expense of
    -increased memory usage.
    -This option is not available for some configurations (non-PIC).
     .It U
     Generate
     .Dq utrace
    @@ -297,8 +295,7 @@ Consult the source for details on this option.
     .It V
     Attempting to allocate zero bytes will return a
     .Dv NULL
    -pointer instead of
    -a valid pointer.
    +pointer instead of a valid pointer.
     (The default behavior is to make a minimal allocation and return a
     pointer to it.)
     This option is provided for System V compatibility.
    @@ -306,21 +303,20 @@ This option is incompatible with the
     .Dq X
     option.
     .It X
    -Rather than return failure for any allocation function,
    -display a diagnostic message on
    -.Dv stderr
    -and cause the program to drop
    -core (using
    +Rather than return failure for any allocation function, display a diagnostic
    +message on
    +.Dv STDERR_FILENO
    +and cause the program to drop core (using
     .Xr abort 3 ) .
    -This option should be set at compile time by including the following in
    -the source code:
    +This option should be set at compile time by including the following in the
    +source code:
     .Bd -literal -offset indent
     _malloc_options = "X";
     .Ed
     .It Z
     Each byte of new memory allocated by
     .Fn malloc ,
    -.Fn realloc
    +.Fn realloc ,
     or
     .Fn reallocf
     will be initialized to 0.
    @@ -378,9 +374,9 @@ improve performance, mainly due to reduced cache performance.
     However, it may make sense to reduce the number of arenas if an application
     does not make much use of the allocation functions.
     .Pp
    -In addition to multiple arenas, this allocator supports thread-specific
    -caching for small objects (smaller than one page), in order to make it
    -possible to completely avoid synchronization for most small allocation requests.
    +In addition to multiple arenas, this allocator supports thread-specific caching
    +for small and medium objects, in order to make it possible to completely avoid
    +synchronization for most small and medium allocation requests.
     Such caching allows very fast allocation in the common case, but it increases
     memory usage and fragmentation, since a bounded number of objects can remain
     allocated in each thread cache.
    @@ -391,23 +387,27 @@ Chunks are always aligned to multiples of the chunk size.
     This alignment makes it possible to find metadata for user objects very
     quickly.
     .Pp
    -User objects are broken into three categories according to size: small, large,
    -and huge.
    +User objects are broken into four categories according to size: small, medium,
    +large, and huge.
     Small objects are smaller than one page.
    +Medium objects range from one page to an upper limit determined at run time (see
    +the
    +.Dq E
    +option).
     Large objects are smaller than the chunk size.
     Huge objects are a multiple of the chunk size.
    -Small and large objects are managed by arenas; huge objects are managed
    +Small, medium, and large objects are managed by arenas; huge objects are managed
     separately in a single data structure that is shared by all threads.
     Huge objects are used by applications infrequently enough that this single
     data structure is not a scalability issue.
     .Pp
     Each chunk that is managed by an arena tracks its contents as runs of
    -contiguous pages (unused, backing a set of small objects, or backing one large
    -object).
    +contiguous pages (unused, backing a set of small or medium objects, or backing
    +one large object).
     The combination of chunk alignment and chunk page maps makes it possible to
     determine all metadata regarding small and large allocations in constant time.
     .Pp
    -Small objects are managed in groups by page runs.
    +Small and medium objects are managed in groups by page runs.
     Each run maintains a bitmap that tracks which regions are in use.
     Allocation requests that are no more than half the quantum (8 or 16, depending
     on architecture) are rounded up to the nearest power of two.
    @@ -419,10 +419,17 @@ Allocation requests that are more than the minumum cacheline-multiple size
     class, but no more than the minimum subpage-multiple size class (see the
     .Dq C
     option) are rounded up to the nearest multiple of the cacheline size (64).
    -Allocation requests that are more than the minimum subpage-multiple size class
    -are rounded up to the nearest multiple of the subpage size (256).
    -Allocation requests that are more than one page, but small enough to fit in
    -an arena-managed chunk (see the
    +Allocation requests that are more than the minimum subpage-multiple size class,
    +but no more than the maximum subpage-multiple size class are rounded up to the
    +nearest multiple of the subpage size (256).
    +Allocation requests that are more than the maximum subpage-multiple size class,
    +but no more than the maximum medium size class (see the
    +.Dq M
    +option) are rounded up to the nearest medium size class; spacing is an
    +automatically determined power of two and ranges from the subpage size to the
    +page size.
    +Allocation requests that are more than the maximum medium size class, but small
    +enough to fit in an arena-managed chunk (see the
     .Dq K
     option), are rounded up to the nearest run size.
     Allocation requests that are too large to fit in an arena-managed chunk are
    @@ -480,13 +487,12 @@ option is set, all warnings are treated as errors.
     .Pp
     The
     .Va _malloc_message
    -variable allows the programmer to override the function which emits
    -the text strings forming the errors and warnings if for some reason
    -the
    -.Dv stderr
    +variable allows the programmer to override the function which emits the text
    +strings forming the errors and warnings if for some reason the
    +.Dv STDERR_FILENO
     file descriptor is not suitable for this.
    -Please note that doing anything which tries to allocate memory in
    -this function is likely to result in a crash or deadlock.
    +Please note that doing anything which tries to allocate memory in this function
    +is likely to result in a crash or deadlock.
     .Pp
     All messages are prefixed by
     .Dq Ao Ar progname Ac Ns Li : (malloc) .
    diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c
    index bdc26b657dcb..295a168f6300 100644
    --- a/lib/libc/stdlib/malloc.c
    +++ b/lib/libc/stdlib/malloc.c
    @@ -1,5 +1,5 @@
     /*-
    - * Copyright (C) 2006-2008 Jason Evans .
    + * Copyright (C) 2006-2010 Jason Evans .
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
    @@ -47,58 +47,67 @@
      *
      * Allocation requests are rounded up to the nearest size class, and no record
      * of the original request size is maintained.  Allocations are broken into
    - * categories according to size class.  Assuming runtime defaults, 4 kB pages
    + * categories according to size class.  Assuming runtime defaults, 4 KiB pages
      * and a 16 byte quantum on a 32-bit system, the size classes in each category
      * are as follows:
      *
    - *   |=======================================|
    - *   | Category | Subcategory      |    Size |
    - *   |=======================================|
    - *   | Small    | Tiny             |       2 |
    - *   |          |                  |       4 |
    - *   |          |                  |       8 |
    - *   |          |------------------+---------|
    - *   |          | Quantum-spaced   |      16 |
    - *   |          |                  |      32 |
    - *   |          |                  |      48 |
    - *   |          |                  |     ... |
    - *   |          |                  |      96 |
    - *   |          |                  |     112 |
    - *   |          |                  |     128 |
    - *   |          |------------------+---------|
    - *   |          | Cacheline-spaced |     192 |
    - *   |          |                  |     256 |
    - *   |          |                  |     320 |
    - *   |          |                  |     384 |
    - *   |          |                  |     448 |
    - *   |          |                  |     512 |
    - *   |          |------------------+---------|
    - *   |          | Sub-page         |     760 |
    - *   |          |                  |    1024 |
    - *   |          |                  |    1280 |
    - *   |          |                  |     ... |
    - *   |          |                  |    3328 |
    - *   |          |                  |    3584 |
    - *   |          |                  |    3840 |
    - *   |=======================================|
    - *   | Large                       |    4 kB |
    - *   |                             |    8 kB |
    - *   |                             |   12 kB |
    - *   |                             |     ... |
    - *   |                             | 1012 kB |
    - *   |                             | 1016 kB |
    - *   |                             | 1020 kB |
    - *   |=======================================|
    - *   | Huge                        |    1 MB |
    - *   |                             |    2 MB |
    - *   |                             |    3 MB |
    - *   |                             |     ... |
    - *   |=======================================|
    + *   |========================================|
    + *   | Category | Subcategory      |     Size |
    + *   |========================================|
    + *   | Small    | Tiny             |        2 |
    + *   |          |                  |        4 |
    + *   |          |                  |        8 |
    + *   |          |------------------+----------|
    + *   |          | Quantum-spaced   |       16 |
    + *   |          |                  |       32 |
    + *   |          |                  |       48 |
    + *   |          |                  |      ... |
    + *   |          |                  |       96 |
    + *   |          |                  |      112 |
    + *   |          |                  |      128 |
    + *   |          |------------------+----------|
    + *   |          | Cacheline-spaced |      192 |
    + *   |          |                  |      256 |
    + *   |          |                  |      320 |
    + *   |          |                  |      384 |
    + *   |          |                  |      448 |
    + *   |          |                  |      512 |
    + *   |          |------------------+----------|
    + *   |          | Sub-page         |      760 |
    + *   |          |                  |     1024 |
    + *   |          |                  |     1280 |
    + *   |          |                  |      ... |
    + *   |          |                  |     3328 |
    + *   |          |                  |     3584 |
    + *   |          |                  |     3840 |
    + *   |========================================|
    + *   | Medium                      |    4 KiB |
    + *   |                             |    6 KiB |
    + *   |                             |    8 KiB |
    + *   |                             |      ... |
    + *   |                             |   28 KiB |
    + *   |                             |   30 KiB |
    + *   |                             |   32 KiB |
    + *   |========================================|
    + *   | Large                       |   36 KiB |
    + *   |                             |   40 KiB |
    + *   |                             |   44 KiB |
    + *   |                             |      ... |
    + *   |                             | 1012 KiB |
    + *   |                             | 1016 KiB |
    + *   |                             | 1020 KiB |
    + *   |========================================|
    + *   | Huge                        |    1 MiB |
    + *   |                             |    2 MiB |
    + *   |                             |    3 MiB |
    + *   |                             |      ... |
    + *   |========================================|
      *
    - * A different mechanism is used for each category:
    + * Different mechanisms are used accoding to category:
      *
    - *   Small : Each size class is segregated into its own set of runs.  Each run
    - *           maintains a bitmap of which regions are free/allocated.
    + *   Small/medium : Each size class is segregated into its own set of runs.
    + *                  Each run maintains a bitmap of which regions are
    + *                  free/allocated.
      *
      *   Large : Each allocation is backed by a dedicated run.  Metadata are stored
      *           in the associated arena chunk header maps.
    @@ -134,18 +143,11 @@
     #define	MALLOC_TINY
     
     /*
    - * MALLOC_MAG enables a magazine-based thread-specific caching layer for small
    + * MALLOC_TCACHE enables a thread-specific caching layer for small and medium
      * objects.  This makes it possible to allocate/deallocate objects without any
      * locking when the cache is in the steady state.
      */
    -#define	MALLOC_MAG
    -
    -/*
    - * MALLOC_BALANCE enables monitoring of arena lock contention and dynamically
    - * re-balances arena load if exponentially averaged contention exceeds a
    - * certain threshold.
    - */
    -#define	MALLOC_BALANCE
    +#define	MALLOC_TCACHE
     
     /*
      * MALLOC_DSS enables use of sbrk(2) to allocate chunks from the data storage
    @@ -166,7 +168,6 @@ __FBSDID("$FreeBSD$");
     #include "namespace.h"
     #include 
     #include 
    -#include 
     #include 
     #include 
     #include 
    @@ -185,6 +186,7 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    +#include 
     #include 
     #include 
     #include 
    @@ -192,18 +194,12 @@ __FBSDID("$FreeBSD$");
     
     #include "un-namespace.h"
     
    -#ifdef MALLOC_DEBUG
    -#  ifdef NDEBUG
    -#    undef NDEBUG
    -#  endif
    -#else
    -#  ifndef NDEBUG
    -#    define NDEBUG
    -#  endif
    -#endif
    -#include 
    -
    +#define	RB_COMPACT
     #include "rb.h"
    +#if (defined(MALLOC_TCACHE) && defined(MALLOC_STATS))
    +#include "qr.h"
    +#include "ql.h"
    +#endif
     
     #ifdef MALLOC_DEBUG
        /* Disable inlining to make debugging easier. */
    @@ -214,55 +210,61 @@ __FBSDID("$FreeBSD$");
     #define	STRERROR_BUF		64
     
     /*
    - * Minimum alignment of allocations is 2^QUANTUM_2POW bytes.
    + * Minimum alignment of allocations is 2^LG_QUANTUM bytes.
      */
     #ifdef __i386__
    -#  define QUANTUM_2POW		4
    -#  define SIZEOF_PTR_2POW	2
    +#  define LG_QUANTUM		4
    +#  define LG_SIZEOF_PTR		2
     #  define CPU_SPINWAIT		__asm__ volatile("pause")
    +#  define TLS_MODEL		__attribute__((tls_model("initial-exec")))
     #endif
     #ifdef __ia64__
    -#  define QUANTUM_2POW		4
    -#  define SIZEOF_PTR_2POW	3
    +#  define LG_QUANTUM		4
    +#  define LG_SIZEOF_PTR		3
    +#  define TLS_MODEL		/* default */
     #endif
     #ifdef __alpha__
    -#  define QUANTUM_2POW		4
    -#  define SIZEOF_PTR_2POW	3
    +#  define LG_QUANTUM		4
    +#  define LG_SIZEOF_PTR		3
     #  define NO_TLS
     #endif
     #ifdef __sparc64__
    -#  define QUANTUM_2POW		4
    -#  define SIZEOF_PTR_2POW	3
    +#  define LG_QUANTUM		4
    +#  define LG_SIZEOF_PTR		3
     #  define NO_TLS
     #endif
     #ifdef __amd64__
    -#  define QUANTUM_2POW		4
    -#  define SIZEOF_PTR_2POW	3
    +#  define LG_QUANTUM		4
    +#  define LG_SIZEOF_PTR		3
     #  define CPU_SPINWAIT		__asm__ volatile("pause")
    +#  define TLS_MODEL		__attribute__((tls_model("initial-exec")))
     #endif
     #ifdef __arm__
    -#  define QUANTUM_2POW		3
    -#  define SIZEOF_PTR_2POW	2
    +#  define LG_QUANTUM		3
    +#  define LG_SIZEOF_PTR		2
     #  define NO_TLS
     #endif
     #ifdef __mips__
    -#  define QUANTUM_2POW		3
    -#  define SIZEOF_PTR_2POW	2
    +#  define LG_QUANTUM		3
    +#  define LG_SIZEOF_PTR		2
     #  define NO_TLS
     #endif
     #ifdef __powerpc__
    -#  define QUANTUM_2POW		4
    -#  define SIZEOF_PTR_2POW	2
    +#  define LG_QUANTUM		4
    +#  define TLS_MODEL		/* default */
    +#endif
    +#ifdef __s390x__
    +#  define LG_QUANTUM		4
     #endif
     
    -#define	QUANTUM			((size_t)(1U << QUANTUM_2POW))
    +#define	QUANTUM			((size_t)(1U << LG_QUANTUM))
     #define	QUANTUM_MASK		(QUANTUM - 1)
     
    -#define	SIZEOF_PTR		(1U << SIZEOF_PTR_2POW)
    +#define	SIZEOF_PTR		(1U << LG_SIZEOF_PTR)
     
    -/* sizeof(int) == (1U << SIZEOF_INT_2POW). */
    -#ifndef SIZEOF_INT_2POW
    -#  define SIZEOF_INT_2POW	2
    +/* sizeof(int) == (1U << LG_SIZEOF_INT). */
    +#ifndef LG_SIZEOF_INT
    +#  define LG_SIZEOF_INT	2
     #endif
     
     /* We can't use TLS in non-PIC programs, since TLS relies on loader magic. */
    @@ -271,13 +273,9 @@ __FBSDID("$FreeBSD$");
     #endif
     
     #ifdef NO_TLS
    -   /* MALLOC_MAG requires TLS. */
    -#  ifdef MALLOC_MAG
    -#    undef MALLOC_MAG
    -#  endif
    -   /* MALLOC_BALANCE requires TLS. */
    -#  ifdef MALLOC_BALANCE
    -#    undef MALLOC_BALANCE
    +   /* MALLOC_TCACHE requires TLS. */
    +#  ifdef MALLOC_TCACHE
    +#    undef MALLOC_TCACHE
     #  endif
     #endif
     
    @@ -285,17 +283,24 @@ __FBSDID("$FreeBSD$");
      * Size and alignment of memory chunks that are allocated by the OS's virtual
      * memory system.
      */
    -#define	CHUNK_2POW_DEFAULT	20
    +#define	LG_CHUNK_DEFAULT	22
     
    -/* Maximum number of dirty pages per arena. */
    -#define	DIRTY_MAX_DEFAULT	(1U << 9)
    +/*
    + * The minimum ratio of active:dirty pages per arena is computed as:
    + *
    + *   (nactive >> opt_lg_dirty_mult) >= ndirty
    + *
    + * So, supposing that opt_lg_dirty_mult is 5, there can be no less than 32
    + * times as many active pages as dirty pages.
    + */
    +#define	LG_DIRTY_MULT_DEFAULT	5
     
     /*
      * Maximum size of L1 cache line.  This is used to avoid cache line aliasing.
      * In addition, this controls the spacing of cacheline-spaced size classes.
      */
    -#define	CACHELINE_2POW		6
    -#define	CACHELINE		((size_t)(1U << CACHELINE_2POW))
    +#define	LG_CACHELINE		6
    +#define	CACHELINE		((size_t)(1U << LG_CACHELINE))
     #define	CACHELINE_MASK		(CACHELINE - 1)
     
     /*
    @@ -305,13 +310,13 @@ __FBSDID("$FreeBSD$");
      * There must be at least 4 subpages per page, due to the way size classes are
      * handled.
      */
    -#define	SUBPAGE_2POW		8
    -#define	SUBPAGE			((size_t)(1U << SUBPAGE_2POW))
    +#define	LG_SUBPAGE		8
    +#define	SUBPAGE			((size_t)(1U << LG_SUBPAGE))
     #define	SUBPAGE_MASK		(SUBPAGE - 1)
     
     #ifdef MALLOC_TINY
        /* Smallest size class to support. */
    -#  define TINY_MIN_2POW		1
    +#  define LG_TINY_MIN		1
     #endif
     
     /*
    @@ -319,14 +324,20 @@ __FBSDID("$FreeBSD$");
      * a power of 2.  Above this size, allocations are rounded up to the nearest
      * power of 2.
      */
    -#define	QSPACE_MAX_2POW_DEFAULT	7
    +#define	LG_QSPACE_MAX_DEFAULT	7
     
     /*
      * Maximum size class that is a multiple of the cacheline, but not (necessarily)
      * a power of 2.  Above this size, allocations are rounded up to the nearest
      * power of 2.
      */
    -#define	CSPACE_MAX_2POW_DEFAULT	9
    +#define	LG_CSPACE_MAX_DEFAULT	9
    +
    +/*
    + * Maximum medium size class.  This must not be more than 1/4 of a chunk
    + * (LG_MEDIUM_MAX_DEFAULT <= LG_CHUNK_DEFAULT - 2).
    + */
    +#define	LG_MEDIUM_MAX_DEFAULT	15
     
     /*
      * RUN_MAX_OVRHD indicates maximum desired run header overhead.  Runs are sized
    @@ -350,7 +361,10 @@ __FBSDID("$FreeBSD$");
     #define	RUN_MAX_OVRHD_RELAX	0x00001800U
     
     /* Put a cap on small object run size.  This overrides RUN_MAX_OVRHD. */
    -#define	RUN_MAX_SMALL	(12 * PAGE_SIZE)
    +#define	RUN_MAX_SMALL							\
    +	(arena_maxclass <= (1U << (CHUNK_MAP_LG_PG_RANGE + PAGE_SHIFT))	\
    +	    ? arena_maxclass : (1U << (CHUNK_MAP_LG_PG_RANGE +		\
    +	    PAGE_SHIFT)))
     
     /*
      * Hyper-threaded CPUs may need a special instruction inside spin loops in
    @@ -366,40 +380,21 @@ __FBSDID("$FreeBSD$");
      * potential for priority inversion deadlock.  Backing off past a certain point
      * can actually waste time.
      */
    -#define	SPIN_LIMIT_2POW		11
    +#define	LG_SPIN_LIMIT		11
     
    -/*
    - * Conversion from spinning to blocking is expensive; we use (1U <<
    - * BLOCK_COST_2POW) to estimate how many more times costly blocking is than
    - * worst-case spinning.
    - */
    -#define	BLOCK_COST_2POW		4
    -
    -#ifdef MALLOC_MAG
    +#ifdef MALLOC_TCACHE
        /*
    -    * Default magazine size, in bytes.  max_rounds is calculated to make
    -    * optimal use of the space, leaving just enough room for the magazine
    -    * header.
    +    * Default number of cache slots for each bin in the thread cache (0:
    +    * disabled).
         */
    -#  define MAG_SIZE_2POW_DEFAULT	9
    -#endif
    -
    -#ifdef MALLOC_BALANCE
    +#  define LG_TCACHE_NSLOTS_DEFAULT	7
        /*
    -    * We use an exponential moving average to track recent lock contention,
    -    * where the size of the history window is N, and alpha=2/(N+1).
    -    *
    -    * Due to integer math rounding, very small values here can cause
    -    * substantial degradation in accuracy, thus making the moving average decay
    -    * faster than it would with precise calculation.
    +    * (1U << opt_lg_tcache_gc_sweep) is the approximate number of
    +    * allocation events between full GC sweeps (-1: disabled).  Integer
    +    * rounding may cause the actual number to be slightly higher, since GC is
    +    * performed incrementally.
         */
    -#  define BALANCE_ALPHA_INV_2POW	9
    -
    -   /*
    -    * Threshold value for the exponential moving contention average at which to
    -    * re-assign a thread.
    -    */
    -#  define BALANCE_THRESHOLD_DEFAULT	(1U << (SPIN_LIMIT_2POW-4))
    +#  define LG_TCACHE_GC_SWEEP_DEFAULT	13
     #endif
     
     /******************************************************************************/
    @@ -426,6 +421,17 @@ static malloc_mutex_t init_lock = {_SPINLOCK_INITIALIZER};
     
     #ifdef MALLOC_STATS
     
    +#ifdef MALLOC_TCACHE
    +typedef struct tcache_bin_stats_s tcache_bin_stats_t;
    +struct tcache_bin_stats_s {
    +	/*
    +	 * Number of allocation requests that corresponded to the size of this
    +	 * bin.
    +	 */
    +	uint64_t	nrequests;
    +};
    +#endif
    +
     typedef struct malloc_bin_stats_s malloc_bin_stats_t;
     struct malloc_bin_stats_s {
     	/*
    @@ -434,9 +440,12 @@ struct malloc_bin_stats_s {
     	 */
     	uint64_t	nrequests;
     
    -#ifdef MALLOC_MAG
    -	/* Number of magazine reloads from this bin. */
    -	uint64_t	nmags;
    +#ifdef MALLOC_TCACHE
    +	/* Number of tcache fills from this bin. */
    +	uint64_t	nfills;
    +
    +	/* Number of tcache flushes to this bin. */
    +	uint64_t	nflushes;
     #endif
     
     	/* Total number of runs created for this bin's size class. */
    @@ -449,10 +458,24 @@ struct malloc_bin_stats_s {
     	uint64_t	reruns;
     
     	/* High-water mark for this bin. */
    -	unsigned long	highruns;
    +	size_t		highruns;
     
     	/* Current number of runs in this bin. */
    -	unsigned long	curruns;
    +	size_t		curruns;
    +};
    +
    +typedef struct malloc_large_stats_s malloc_large_stats_t;
    +struct malloc_large_stats_s {
    +	/*
    +	 * Number of allocation requests that corresponded to this size class.
    +	 */
    +	uint64_t	nrequests;
    +
    +	/* High-water mark for this size class. */
    +	size_t		highruns;
    +
    +	/* Current number of runs of this size class. */
    +	size_t		curruns;
     };
     
     typedef struct arena_stats_s arena_stats_t;
    @@ -474,14 +497,21 @@ struct arena_stats_s {
     	uint64_t	nmalloc_small;
     	uint64_t	ndalloc_small;
     
    +	size_t		allocated_medium;
    +	uint64_t	nmalloc_medium;
    +	uint64_t	ndalloc_medium;
    +
     	size_t		allocated_large;
     	uint64_t	nmalloc_large;
     	uint64_t	ndalloc_large;
     
    -#ifdef MALLOC_BALANCE
    -	/* Number of times this arena reassigned a thread due to contention. */
    -	uint64_t	nbalance;
    -#endif
    +	/*
    +	 * One element for each possible size class, including sizes that
    +	 * overlap with bin size classes.  This is necessary because ipalloc()
    +	 * sometimes has to use such large objects in order to assure proper
    +	 * alignment.
    +	 */
    +	malloc_large_stats_t	*lstats;
     };
     
     typedef struct chunk_stats_s chunk_stats_t;
    @@ -490,14 +520,14 @@ struct chunk_stats_s {
     	uint64_t	nchunks;
     
     	/* High-water mark for number of chunks allocated. */
    -	unsigned long	highchunks;
    +	size_t		highchunks;
     
     	/*
     	 * Current number of chunks allocated.  This value isn't maintained for
     	 * any other purpose, so keep track of it in order to be able to set
     	 * highchunks.
     	 */
    -	unsigned long	curchunks;
    +	size_t		curchunks;
     };
     
     #endif /* #ifdef MALLOC_STATS */
    @@ -550,14 +580,14 @@ struct arena_chunk_map_s {
     	 * Run address (or size) and various flags are stored together.  The bit
     	 * layout looks like (assuming 32-bit system):
     	 *
    -	 *   ???????? ???????? ????---- ---kdzla
    +	 *   ???????? ???????? ????cccc ccccdzla
     	 *
     	 * ? : Unallocated: Run address for first/last pages, unset for internal
     	 *                  pages.
    -	 *     Small: Run address.
    +	 *     Small/medium: Don't care.
     	 *     Large: Run size for first page, unset for trailing pages.
     	 * - : Unused.
    -	 * k : key?
    +	 * c : refcount (could overflow for PAGE_SIZE >= 128 KiB)
     	 * d : dirty?
     	 * z : zeroed?
     	 * l : large?
    @@ -565,7 +595,7 @@ struct arena_chunk_map_s {
     	 *
     	 * Following are example bit patterns for the three types of runs.
     	 *
    -	 * r : run address
    +	 * p : run page offset
     	 * s : run size
     	 * x : don't care
     	 * - : 0
    @@ -576,10 +606,10 @@ struct arena_chunk_map_s {
     	 *     xxxxxxxx xxxxxxxx xxxx---- ----d---
     	 *     ssssssss ssssssss ssss---- -----z--
     	 *
    -	 *   Small:
    -	 *     rrrrrrrr rrrrrrrr rrrr---- -------a
    -	 *     rrrrrrrr rrrrrrrr rrrr---- -------a
    -	 *     rrrrrrrr rrrrrrrr rrrr---- -------a
    +	 *   Small/medium:
    +	 *     pppppppp ppppcccc cccccccc cccc---a
    +	 *     pppppppp ppppcccc cccccccc cccc---a
    +	 *     pppppppp ppppcccc cccccccc cccc---a
     	 *
     	 *   Large:
     	 *     ssssssss ssssssss ssss---- ------la
    @@ -587,11 +617,19 @@ struct arena_chunk_map_s {
     	 *     -------- -------- -------- ------la
     	 */
     	size_t				bits;
    -#define	CHUNK_MAP_KEY		((size_t)0x10U)
    -#define	CHUNK_MAP_DIRTY		((size_t)0x08U)
    -#define	CHUNK_MAP_ZEROED	((size_t)0x04U)
    -#define	CHUNK_MAP_LARGE		((size_t)0x02U)
    -#define	CHUNK_MAP_ALLOCATED	((size_t)0x01U)
    +#define	CHUNK_MAP_PG_MASK	((size_t)0xfff00000U)
    +#define	CHUNK_MAP_PG_SHIFT	20
    +#define	CHUNK_MAP_LG_PG_RANGE	12
    +
    +#define	CHUNK_MAP_RC_MASK	((size_t)0xffff0U)
    +#define	CHUNK_MAP_RC_ONE	((size_t)0x00010U)
    +
    +#define	CHUNK_MAP_FLAGS_MASK	((size_t)0xfU)
    +#define	CHUNK_MAP_DIRTY		((size_t)0x8U)
    +#define	CHUNK_MAP_ZEROED	((size_t)0x4U)
    +#define	CHUNK_MAP_LARGE		((size_t)0x2U)
    +#define	CHUNK_MAP_ALLOCATED	((size_t)0x1U)
    +#define	CHUNK_MAP_KEY		(CHUNK_MAP_DIRTY | CHUNK_MAP_ALLOCATED)
     };
     typedef rb_tree(arena_chunk_map_t) arena_avail_tree_t;
     typedef rb_tree(arena_chunk_map_t) arena_run_tree_t;
    @@ -605,6 +643,13 @@ struct arena_chunk_s {
     	/* Linkage for the arena's chunks_dirty tree. */
     	rb_node(arena_chunk_t) link_dirty;
     
    +	/*
    +	 * True if the chunk is currently in the chunks_dirty tree, due to
    +	 * having at some point contained one or more dirty pages.  Removal
    +	 * from chunks_dirty is lazy, so (dirtied && ndirty == 0) is possible.
    +	 */
    +	bool		dirtied;
    +
     	/* Number of dirty pages. */
     	size_t		ndirty;
     
    @@ -670,6 +715,10 @@ struct arena_bin_s {
     #endif
     };
     
    +#ifdef MALLOC_TCACHE
    +typedef struct tcache_s tcache_t;
    +#endif
    +
     struct arena_s {
     #ifdef MALLOC_DEBUG
     	uint32_t		magic;
    @@ -681,6 +730,13 @@ struct arena_s {
     
     #ifdef MALLOC_STATS
     	arena_stats_t		stats;
    +#  ifdef MALLOC_TCACHE
    +	/*
    +	 * List of tcaches for extant threads associated with this arena.
    +	 * Stats from these are merged incrementally, and at exit.
    +	 */
    +	ql_head(tcache_t)	tcache_ql;
    +#  endif
     #endif
     
     	/* Tree of dirty-page-containing chunks this arena manages. */
    @@ -698,6 +754,9 @@ struct arena_s {
     	 */
     	arena_chunk_t		*spare;
     
    +	/* Number of pages in active runs. */
    +	size_t			nactive;
    +
     	/*
     	 * Current count of pages within unused runs that are potentially
     	 * dirty, and for which madvise(... MADV_FREE) has not been called.  By
    @@ -712,67 +771,77 @@ struct arena_s {
     	 */
     	arena_avail_tree_t	runs_avail;
     
    -#ifdef MALLOC_BALANCE
     	/*
    -	 * The arena load balancing machinery needs to keep track of how much
    -	 * lock contention there is.  This value is exponentially averaged.
    -	 */
    -	uint32_t		contention;
    -#endif
    -
    -	/*
    -	 * bins is used to store rings of free regions of the following sizes,
    -	 * assuming a 16-byte quantum, 4kB page size, and default
    +	 * bins is used to store trees of free regions of the following sizes,
    +	 * assuming a 16-byte quantum, 4 KiB page size, and default
     	 * MALLOC_OPTIONS.
     	 *
    -	 *   bins[i] | size |
    -	 *   --------+------+
    -	 *        0  |    2 |
    -	 *        1  |    4 |
    -	 *        2  |    8 |
    -	 *   --------+------+
    -	 *        3  |   16 |
    -	 *        4  |   32 |
    -	 *        5  |   48 |
    -	 *        6  |   64 |
    -	 *           :      :
    -	 *           :      :
    -	 *       33  |  496 |
    -	 *       34  |  512 |
    -	 *   --------+------+
    -	 *       35  | 1024 |
    -	 *       36  | 2048 |
    -	 *   --------+------+
    +	 *   bins[i] |   size |
    +	 *   --------+--------+
    +	 *        0  |      2 |
    +	 *        1  |      4 |
    +	 *        2  |      8 |
    +	 *   --------+--------+
    +	 *        3  |     16 |
    +	 *        4  |     32 |
    +	 *        5  |     48 |
    +	 *           :        :
    +	 *        8  |     96 |
    +	 *        9  |    112 |
    +	 *       10  |    128 |
    +	 *   --------+--------+
    +	 *       11  |    192 |
    +	 *       12  |    256 |
    +	 *       13  |    320 |
    +	 *       14  |    384 |
    +	 *       15  |    448 |
    +	 *       16  |    512 |
    +	 *   --------+--------+
    +	 *       17  |    768 |
    +	 *       18  |   1024 |
    +	 *       19  |   1280 |
    +	 *           :        :
    +	 *       27  |   3328 |
    +	 *       28  |   3584 |
    +	 *       29  |   3840 |
    +	 *   --------+--------+
    +	 *       30  |  4 KiB |
    +	 *       31  |  6 KiB |
    +	 *       33  |  8 KiB |
    +	 *           :        :
    +	 *       43  | 28 KiB |
    +	 *       44  | 30 KiB |
    +	 *       45  | 32 KiB |
    +	 *   --------+--------+
     	 */
     	arena_bin_t		bins[1]; /* Dynamically sized. */
     };
     
     /******************************************************************************/
     /*
    - * Magazine data structures.
    + * Thread cache data structures.
      */
     
    -#ifdef MALLOC_MAG
    -typedef struct mag_s mag_t;
    -struct mag_s {
    -	size_t		binind; /* Index of associated bin. */
    -	size_t		nrounds;
    -	void		*rounds[1]; /* Dynamically sized. */
    +#ifdef MALLOC_TCACHE
    +typedef struct tcache_bin_s tcache_bin_t;
    +struct tcache_bin_s {
    +#  ifdef MALLOC_STATS
    +	tcache_bin_stats_t tstats;
    +#  endif
    +	unsigned	low_water;	/* Min # cached since last GC. */
    +	unsigned	high_water;	/* Max # cached since last GC. */
    +	unsigned	ncached;	/* # of cached objects. */
    +	void		*slots[1];	/* Dynamically sized. */
     };
     
    -/*
    - * Magazines are lazily allocated, but once created, they remain until the
    - * associated mag_rack is destroyed.
    - */
    -typedef struct bin_mags_s bin_mags_t;
    -struct bin_mags_s {
    -	mag_t	*curmag;
    -	mag_t	*sparemag;
    -};
    -
    -typedef struct mag_rack_s mag_rack_t;
    -struct mag_rack_s {
    -	bin_mags_t	bin_mags[1]; /* Dynamically sized. */
    +struct tcache_s {
    +#  ifdef MALLOC_STATS
    +	ql_elm(tcache_t) link;		/* Used for aggregating stats. */
    +#  endif
    +	arena_t		*arena;		/* This thread's arena. */
    +	unsigned	ev_cnt;		/* Event count since incremental GC. */
    +	unsigned	next_gc_bin;	/* Next bin to GC. */
    +	tcache_bin_t	*tbins[1];	/* Dynamically sized. */
     };
     #endif
     
    @@ -786,14 +855,16 @@ static unsigned		ncpus;
     
     /* Various bin-related settings. */
     #ifdef MALLOC_TINY		/* Number of (2^n)-spaced tiny bins. */
    -#  define		ntbins	((unsigned)(QUANTUM_2POW - TINY_MIN_2POW))
    +#  define		ntbins	((unsigned)(LG_QUANTUM - LG_TINY_MIN))
     #else
     #  define		ntbins	0
     #endif
     static unsigned		nqbins; /* Number of quantum-spaced bins. */
     static unsigned		ncbins; /* Number of cacheline-spaced bins. */
     static unsigned		nsbins; /* Number of subpage-spaced bins. */
    +static unsigned		nmbins; /* Number of medium bins. */
     static unsigned		nbins;
    +static unsigned		mbin0; /* mbin offset (nbins - nmbins). */
     #ifdef MALLOC_TINY
     #  define		tspace_max	((size_t)(QUANTUM >> 1))
     #endif
    @@ -803,13 +874,26 @@ static size_t		cspace_min;
     static size_t		cspace_max;
     static size_t		sspace_min;
     static size_t		sspace_max;
    -#define			bin_maxclass	sspace_max
    +#define			small_maxclass	sspace_max
    +#define			medium_min	PAGE_SIZE
    +static size_t		medium_max;
    +#define			bin_maxclass	medium_max
     
    -static uint8_t const	*size2bin;
     /*
    - * const_size2bin is a static constant lookup table that in the common case can
    - * be used as-is for size2bin.  For dynamically linked programs, this avoids
    - * a page of memory overhead per process.
    + * Soft limit on the number of medium size classes.  Spacing between medium
    + * size classes never exceeds pagesize, which can force more than NBINS_MAX
    + * medium size classes.
    + */
    +#define	NMBINS_MAX	16
    +/* Spacing between medium size classes. */
    +static size_t		lg_mspace;
    +static size_t		mspace_mask;
    +
    +static uint8_t const	*small_size2bin;
    +/*
    + * const_small_size2bin is a static constant lookup table that in the common
    + * case can be used as-is for small_size2bin.  For dynamically linked programs,
    + * this avoids a page of memory overhead per process.
      */
     #define	S2B_1(i)	i,
     #define	S2B_2(i)	S2B_1(i) S2B_1(i)
    @@ -820,9 +904,9 @@ static uint8_t const	*size2bin;
     #define	S2B_64(i)	S2B_32(i) S2B_32(i)
     #define	S2B_128(i)	S2B_64(i) S2B_64(i)
     #define	S2B_256(i)	S2B_128(i) S2B_128(i)
    -static const uint8_t	const_size2bin[PAGE_SIZE - 255] = {
    +static const uint8_t	const_small_size2bin[PAGE_SIZE - 255] = {
     	S2B_1(0xffU)		/*    0 */
    -#if (QUANTUM_2POW == 4)
    +#if (LG_QUANTUM == 4)
     /* 64-bit system ************************/
     #  ifdef MALLOC_TINY
     	S2B_2(0)		/*    2 */
    @@ -923,10 +1007,6 @@ static const uint8_t	const_size2bin[PAGE_SIZE - 255] = {
     #undef S2B_CMIN
     #undef S2B_SMIN
     
    -#ifdef MALLOC_MAG
    -static size_t		max_rounds;
    -#endif
    -
     /* Various chunk-related settings. */
     static size_t		chunksize;
     static size_t		chunksize_mask; /* (chunksize - 1). */
    @@ -1006,31 +1086,46 @@ static size_t		base_mapped;
     static arena_t		**arenas;
     static unsigned		narenas;
     #ifndef NO_TLS
    -#  ifdef MALLOC_BALANCE
    -static unsigned		narenas_2pow;
    -#  else
     static unsigned		next_arena;
    -#  endif
     #endif
     static pthread_mutex_t	arenas_lock; /* Protects arenas initialization. */
     
     #ifndef NO_TLS
     /*
    - * Map of pthread_self() --> arenas[???], used for selecting an arena to use
    + * Map of _pthread_self() --> arenas[???], used for selecting an arena to use
      * for allocations.
      */
    -static __thread arena_t	*arenas_map;
    +static __thread arena_t		*arenas_map TLS_MODEL;
     #endif
     
    -#ifdef MALLOC_MAG
    +#ifdef MALLOC_TCACHE
    +/* Map of thread-specific caches. */
    +static __thread tcache_t	*tcache_tls TLS_MODEL;
    +
     /*
    - * Map of thread-specific magazine racks, used for thread-specific object
    - * caching.
    + * Number of cache slots for each bin in the thread cache, or 0 if tcache is
    + * disabled.
      */
    -static __thread mag_rack_t	*mag_rack;
    +size_t				tcache_nslots;
    +
    +/* Number of tcache allocation/deallocation events between incremental GCs. */
    +unsigned			tcache_gc_incr;
    +#endif
    +
    +/*
    + * Used by chunk_alloc_mmap() to decide whether to attempt the fast path and
    + * potentially avoid some system calls.  We can get away without TLS here,
    + * since the state of mmap_unaligned only affects performance, rather than
    + * correct function.
    + */
    +#ifndef NO_TLS
    +static __thread bool	mmap_unaligned TLS_MODEL;
    +#else
    +static		bool	mmap_unaligned;
     #endif
     
     #ifdef MALLOC_STATS
    +static malloc_mutex_t	chunks_mtx;
     /* Chunk statistics. */
     static chunk_stats_t	stats_chunks;
     #endif
    @@ -1048,22 +1143,20 @@ static bool	opt_junk = true;
     static bool	opt_abort = false;
     static bool	opt_junk = false;
     #endif
    +#ifdef MALLOC_TCACHE
    +static size_t	opt_lg_tcache_nslots = LG_TCACHE_NSLOTS_DEFAULT;
    +static ssize_t	opt_lg_tcache_gc_sweep = LG_TCACHE_GC_SWEEP_DEFAULT;
    +#endif
     #ifdef MALLOC_DSS
     static bool	opt_dss = true;
     static bool	opt_mmap = true;
     #endif
    -#ifdef MALLOC_MAG
    -static bool	opt_mag = true;
    -static size_t	opt_mag_size_2pow = MAG_SIZE_2POW_DEFAULT;
    -#endif
    -static size_t	opt_dirty_max = DIRTY_MAX_DEFAULT;
    -#ifdef MALLOC_BALANCE
    -static uint64_t	opt_balance_threshold = BALANCE_THRESHOLD_DEFAULT;
    -#endif
    -static bool	opt_print_stats = false;
    -static size_t	opt_qspace_max_2pow = QSPACE_MAX_2POW_DEFAULT;
    -static size_t	opt_cspace_max_2pow = CSPACE_MAX_2POW_DEFAULT;
    -static size_t	opt_chunk_2pow = CHUNK_2POW_DEFAULT;
    +static ssize_t	opt_lg_dirty_mult = LG_DIRTY_MULT_DEFAULT;
    +static bool	opt_stats_print = false;
    +static size_t	opt_lg_qspace_max = LG_QSPACE_MAX_DEFAULT;
    +static size_t	opt_lg_cspace_max = LG_CSPACE_MAX_DEFAULT;
    +static size_t	opt_lg_medium_max = LG_MEDIUM_MAX_DEFAULT;
    +static size_t	opt_lg_chunk = LG_CHUNK_DEFAULT;
     static bool	opt_utrace = false;
     static bool	opt_sysv = false;
     static bool	opt_xmalloc = false;
    @@ -1092,12 +1185,15 @@ typedef struct {
     
     static void	malloc_mutex_init(malloc_mutex_t *mutex);
     static bool	malloc_spin_init(pthread_mutex_t *lock);
    +#ifdef MALLOC_TINY
    +static size_t	pow2_ceil(size_t x);
    +#endif
     static void	wrtmessage(const char *p1, const char *p2, const char *p3,
     		const char *p4);
     #ifdef MALLOC_STATS
     static void	malloc_printf(const char *format, ...);
     #endif
    -static char	*umax2s(uintmax_t x, char *s);
    +static char	*umax2s(uintmax_t x, unsigned base, char *s);
     #ifdef MALLOC_DSS
     static bool	base_pages_alloc_dss(size_t minsize);
     #endif
    @@ -1107,17 +1203,15 @@ static void	*base_alloc(size_t size);
     static void	*base_calloc(size_t number, size_t size);
     static extent_node_t *base_node_alloc(void);
     static void	base_node_dealloc(extent_node_t *node);
    -#ifdef MALLOC_STATS
    -static void	stats_print(arena_t *arena);
    -#endif
     static void	*pages_map(void *addr, size_t size);
     static void	pages_unmap(void *addr, size_t size);
     #ifdef MALLOC_DSS
    -static void	*chunk_alloc_dss(size_t size);
    -static void	*chunk_recycle_dss(size_t size, bool zero);
    +static void	*chunk_alloc_dss(size_t size, bool *zero);
    +static void	*chunk_recycle_dss(size_t size, bool *zero);
     #endif
    +static void	*chunk_alloc_mmap_slow(size_t size, bool unaligned);
     static void	*chunk_alloc_mmap(size_t size);
    -static void	*chunk_alloc(size_t size, bool zero);
    +static void	*chunk_alloc(size_t size, bool *zero);
     #ifdef MALLOC_DSS
     static extent_node_t *chunk_dealloc_dss_record(void *chunk, size_t size);
     static bool	chunk_dealloc_dss(void *chunk, size_t size);
    @@ -1142,51 +1236,163 @@ static void	arena_run_trim_tail(arena_t *arena, arena_chunk_t *chunk,
     static arena_run_t *arena_bin_nonfull_run_get(arena_t *arena, arena_bin_t *bin);
     static void	*arena_bin_malloc_hard(arena_t *arena, arena_bin_t *bin);
     static size_t	arena_bin_run_size_calc(arena_bin_t *bin, size_t min_run_size);
    -#ifdef MALLOC_BALANCE
    -static void	arena_lock_balance_hard(arena_t *arena);
    -#endif
    -#ifdef MALLOC_MAG
    -static void	mag_load(mag_t *mag);
    +#ifdef MALLOC_TCACHE
    +static void	tcache_bin_fill(tcache_t *tcache, tcache_bin_t *tbin,
    +    size_t binind);
    +static void	*tcache_alloc_hard(tcache_t *tcache, tcache_bin_t *tbin,
    +    size_t binind);
     #endif
    +static void	*arena_malloc_medium(arena_t *arena, size_t size, bool zero);
     static void	*arena_malloc_large(arena_t *arena, size_t size, bool zero);
     static void	*arena_palloc(arena_t *arena, size_t alignment, size_t size,
         size_t alloc_size);
    +static bool	arena_is_large(const void *ptr);
     static size_t	arena_salloc(const void *ptr);
    -#ifdef MALLOC_MAG
    -static void	mag_unload(mag_t *mag);
    +static void
    +arena_dalloc_bin_run(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run,
    +    arena_bin_t *bin);
    +#ifdef MALLOC_STATS
    +static void	arena_stats_print(arena_t *arena);
    +#endif
    +static void	stats_print_atexit(void);
    +#ifdef MALLOC_TCACHE
    +static void	tcache_bin_flush(tcache_bin_t *tbin, size_t binind,
    +    unsigned rem);
     #endif
     static void	arena_dalloc_large(arena_t *arena, arena_chunk_t *chunk,
         void *ptr);
    +#ifdef MALLOC_TCACHE
    +static void	arena_dalloc_hard(arena_t *arena, arena_chunk_t *chunk,
    +    void *ptr, arena_chunk_map_t *mapelm, tcache_t *tcache);
    +#endif
     static void	arena_ralloc_large_shrink(arena_t *arena, arena_chunk_t *chunk,
         void *ptr, size_t size, size_t oldsize);
     static bool	arena_ralloc_large_grow(arena_t *arena, arena_chunk_t *chunk,
         void *ptr, size_t size, size_t oldsize);
     static bool	arena_ralloc_large(void *ptr, size_t size, size_t oldsize);
     static void	*arena_ralloc(void *ptr, size_t size, size_t oldsize);
    -static bool	arena_new(arena_t *arena);
    +static bool	arena_new(arena_t *arena, unsigned ind);
     static arena_t	*arenas_extend(unsigned ind);
    -#ifdef MALLOC_MAG
    -static mag_t	*mag_create(arena_t *arena, size_t binind);
    -static void	mag_destroy(mag_t *mag);
    -static mag_rack_t *mag_rack_create(arena_t *arena);
    -static void	mag_rack_destroy(mag_rack_t *rack);
    +#ifdef MALLOC_TCACHE
    +static tcache_bin_t	*tcache_bin_create(arena_t *arena);
    +static void	tcache_bin_destroy(tcache_t *tcache, tcache_bin_t *tbin,
    +    unsigned binind);
    +#  ifdef MALLOC_STATS
    +static void	tcache_stats_merge(tcache_t *tcache, arena_t *arena);
    +#  endif
    +static tcache_t	*tcache_create(arena_t *arena);
    +static void	tcache_destroy(tcache_t *tcache);
     #endif
     static void	*huge_malloc(size_t size, bool zero);
     static void	*huge_palloc(size_t alignment, size_t size);
     static void	*huge_ralloc(void *ptr, size_t size, size_t oldsize);
     static void	huge_dalloc(void *ptr);
    -static void	malloc_print_stats(void);
    +static void	malloc_stats_print(void);
     #ifdef MALLOC_DEBUG
    -static void	size2bin_validate(void);
    +static void	small_size2bin_validate(void);
     #endif
    -static bool	size2bin_init(void);
    -static bool	size2bin_init_hard(void);
    +static bool	small_size2bin_init(void);
    +static bool	small_size2bin_init_hard(void);
    +static unsigned	malloc_ncpus(void);
     static bool	malloc_init_hard(void);
     
     /*
      * End function prototypes.
      */
     /******************************************************************************/
    +
    +static void
    +wrtmessage(const char *p1, const char *p2, const char *p3, const char *p4)
    +{
    +
    +	if (_write(STDERR_FILENO, p1, strlen(p1)) < 0
    +	    || _write(STDERR_FILENO, p2, strlen(p2)) < 0
    +	    || _write(STDERR_FILENO, p3, strlen(p3)) < 0
    +	    || _write(STDERR_FILENO, p4, strlen(p4)) < 0)
    +		return;
    +}
    +
    +void	(*_malloc_message)(const char *p1, const char *p2, const char *p3,
    +	    const char *p4) = wrtmessage;
    +
    +/*
    + * We don't want to depend on vsnprintf() for production builds, since that can
    + * cause unnecessary bloat for static binaries.  umax2s() provides minimal
    + * integer printing functionality, so that malloc_printf() use can be limited to
    + * MALLOC_STATS code.
    + */
    +#define	UMAX2S_BUFSIZE	65
    +static char *
    +umax2s(uintmax_t x, unsigned base, char *s)
    +{
    +	unsigned i;
    +
    +	i = UMAX2S_BUFSIZE - 1;
    +	s[i] = '\0';
    +	switch (base) {
    +	case 10:
    +		do {
    +			i--;
    +			s[i] = "0123456789"[x % 10];
    +			x /= 10;
    +		} while (x > 0);
    +		break;
    +	case 16:
    +		do {
    +			i--;
    +			s[i] = "0123456789abcdef"[x & 0xf];
    +			x >>= 4;
    +		} while (x > 0);
    +		break;
    +	default:
    +		do {
    +			i--;
    +			s[i] = "0123456789abcdefghijklmnopqrstuvwxyz"[x % base];
    +			x /= base;
    +		} while (x > 0);
    +	}
    +
    +	return (&s[i]);
    +}
    +
    +/*
    + * Define a custom assert() in order to reduce the chances of deadlock during
    + * assertion failure.
    + */
    +#ifdef MALLOC_DEBUG
    +#  define assert(e) do {						\
    +	if (!(e)) {							\
    +		char line_buf[UMAX2S_BUFSIZE];				\
    +		_malloc_message(_getprogname(), ": (malloc) ",		\
    +		    __FILE__, ":");					\
    +		_malloc_message(umax2s(__LINE__, 10, line_buf),		\
    +		    ": Failed assertion: ", "\"", #e);			\
    +		_malloc_message("\"\n", "", "", "");			\
    +		abort();						\
    +	}								\
    +} while (0)
    +#else
    +#define assert(e)
    +#endif
    +
    +#ifdef MALLOC_STATS
    +/*
    + * Print to stderr in such a way as to (hopefully) avoid memory allocation.
    + */
    +static void
    +malloc_printf(const char *format, ...)
    +{
    +	char buf[4096];
    +	va_list ap;
    +
    +	va_start(ap, format);
    +	vsnprintf(buf, sizeof(buf), format, ap);
    +	va_end(ap);
    +	_malloc_message(buf, "", "", "");
    +}
    +#endif
    +
    +/******************************************************************************/
     /*
      * Begin mutex.  We can't use normal pthread mutexes in all places, because
      * they require malloc()ed memory, which causes bootstrapping issues in some
    @@ -1255,10 +1461,9 @@ malloc_spin_init(pthread_mutex_t *lock)
     	return (false);
     }
     
    -static inline unsigned
    +static inline void
     malloc_spin_lock(pthread_mutex_t *lock)
     {
    -	unsigned ret = 0;
     
     	if (__isthreaded) {
     		if (_pthread_mutex_trylock(lock) != 0) {
    @@ -1267,14 +1472,13 @@ malloc_spin_lock(pthread_mutex_t *lock)
     				unsigned i;
     				volatile unsigned j;
     
    -				for (i = 1; i <= SPIN_LIMIT_2POW; i++) {
    +				for (i = 1; i <= LG_SPIN_LIMIT; i++) {
     					for (j = 0; j < (1U << i); j++) {
    -						ret++;
     						CPU_SPINWAIT;
     					}
     
     					if (_pthread_mutex_trylock(lock) == 0)
    -						return (ret);
    +						return;
     				}
     			}
     
    @@ -1284,12 +1488,8 @@ malloc_spin_lock(pthread_mutex_t *lock)
     			 * inversion.
     			 */
     			_pthread_mutex_lock(lock);
    -			assert((ret << BLOCK_COST_2POW) != 0 || ncpus == 1);
    -			return (ret << BLOCK_COST_2POW);
     		}
     	}
    -
    -	return (ret);
     }
     
     static inline void
    @@ -1332,13 +1532,17 @@ malloc_spin_unlock(pthread_mutex_t *lock)
     #define	SUBPAGE_CEILING(s)						\
     	(((s) + SUBPAGE_MASK) & ~SUBPAGE_MASK)
     
    -/* Return the smallest PAGE_SIZE multiple that is >= s. */
    +/* Return the smallest medium size class that is >= s. */
    +#define	MEDIUM_CEILING(s)						\
    +	(((s) + mspace_mask) & ~mspace_mask)
    +
    +/* Return the smallest pagesize multiple that is >= s. */
     #define	PAGE_CEILING(s)							\
     	(((s) + PAGE_MASK) & ~PAGE_MASK)
     
     #ifdef MALLOC_TINY
     /* Compute the smallest power of 2 that is >= x. */
    -static inline size_t
    +static size_t
     pow2_ceil(size_t x)
     {
     
    @@ -1356,112 +1560,6 @@ pow2_ceil(size_t x)
     }
     #endif
     
    -#ifdef MALLOC_BALANCE
    -/*
    - * Use a simple linear congruential pseudo-random number generator:
    - *
    - *   prn(y) = (a*x + c) % m
    - *
    - * where the following constants ensure maximal period:
    - *
    - *   a == Odd number (relatively prime to 2^n), and (a-1) is a multiple of 4.
    - *   c == Odd number (relatively prime to 2^n).
    - *   m == 2^32
    - *
    - * See Knuth's TAOCP 3rd Ed., Vol. 2, pg. 17 for details on these constraints.
    - *
    - * This choice of m has the disadvantage that the quality of the bits is
    - * proportional to bit position.  For example. the lowest bit has a cycle of 2,
    - * the next has a cycle of 4, etc.  For this reason, we prefer to use the upper
    - * bits.
    - */
    -#  define PRN_DEFINE(suffix, var, a, c)					\
    -static inline void							\
    -sprn_##suffix(uint32_t seed)						\
    -{									\
    -	var = seed;							\
    -}									\
    -									\
    -static inline uint32_t							\
    -prn_##suffix(uint32_t lg_range)						\
    -{									\
    -	uint32_t ret, x;						\
    -									\
    -	assert(lg_range > 0);						\
    -	assert(lg_range <= 32);						\
    -									\
    -	x = (var * (a)) + (c);						\
    -	var = x;							\
    -	ret = x >> (32 - lg_range);					\
    -									\
    -	return (ret);							\
    -}
    -#  define SPRN(suffix, seed)	sprn_##suffix(seed)
    -#  define PRN(suffix, lg_range)	prn_##suffix(lg_range)
    -#endif
    -
    -#ifdef MALLOC_BALANCE
    -/* Define the PRNG used for arena assignment. */
    -static __thread uint32_t balance_x;
    -PRN_DEFINE(balance, balance_x, 1297, 1301)
    -#endif
    -
    -static void
    -wrtmessage(const char *p1, const char *p2, const char *p3, const char *p4)
    -{
    -
    -	_write(STDERR_FILENO, p1, strlen(p1));
    -	_write(STDERR_FILENO, p2, strlen(p2));
    -	_write(STDERR_FILENO, p3, strlen(p3));
    -	_write(STDERR_FILENO, p4, strlen(p4));
    -}
    -
    -void	(*_malloc_message)(const char *p1, const char *p2, const char *p3,
    -	    const char *p4) = wrtmessage;
    -
    -#ifdef MALLOC_STATS
    -/*
    - * Print to stderr in such a way as to (hopefully) avoid memory allocation.
    - */
    -static void
    -malloc_printf(const char *format, ...)
    -{
    -	char buf[4096];
    -	va_list ap;
    -
    -	va_start(ap, format);
    -	vsnprintf(buf, sizeof(buf), format, ap);
    -	va_end(ap);
    -	_malloc_message(buf, "", "", "");
    -}
    -#endif
    -
    -/*
    - * We don't want to depend on vsnprintf() for production builds, since that can
    - * cause unnecessary bloat for static binaries.  umax2s() provides minimal
    - * integer printing functionality, so that malloc_printf() use can be limited to
    - * MALLOC_STATS code.
    - */
    -#define	UMAX2S_BUFSIZE	21
    -static char *
    -umax2s(uintmax_t x, char *s)
    -{
    -	unsigned i;
    -
    -	/* Make sure UMAX2S_BUFSIZE is large enough. */
    -	assert(sizeof(uintmax_t) <= 8);
    -
    -	i = UMAX2S_BUFSIZE - 1;
    -	s[i] = '\0';
    -	do {
    -		i--;
    -		s[i] = "0123456789"[x % 10];
    -		x /= 10;
    -	} while (x > 0);
    -
    -	return (&s[i]);
    -}
    -
     /******************************************************************************/
     
     #ifdef MALLOC_DSS
    @@ -1587,7 +1685,8 @@ base_calloc(size_t number, size_t size)
     	void *ret;
     
     	ret = base_alloc(number * size);
    -	memset(ret, 0, number * size);
    +	if (ret != NULL)
    +		memset(ret, 0, number * size);
     
     	return (ret);
     }
    @@ -1620,93 +1719,6 @@ base_node_dealloc(extent_node_t *node)
     	malloc_mutex_unlock(&base_mtx);
     }
     
    -/******************************************************************************/
    -
    -#ifdef MALLOC_STATS
    -static void
    -stats_print(arena_t *arena)
    -{
    -	unsigned i, gap_start;
    -
    -	malloc_printf("dirty: %zu page%s dirty, %llu sweep%s,"
    -	    " %llu madvise%s, %llu page%s purged\n",
    -	    arena->ndirty, arena->ndirty == 1 ? "" : "s",
    -	    arena->stats.npurge, arena->stats.npurge == 1 ? "" : "s",
    -	    arena->stats.nmadvise, arena->stats.nmadvise == 1 ? "" : "s",
    -	    arena->stats.purged, arena->stats.purged == 1 ? "" : "s");
    -
    -	malloc_printf("            allocated      nmalloc      ndalloc\n");
    -	malloc_printf("small:   %12zu %12llu %12llu\n",
    -	    arena->stats.allocated_small, arena->stats.nmalloc_small,
    -	    arena->stats.ndalloc_small);
    -	malloc_printf("large:   %12zu %12llu %12llu\n",
    -	    arena->stats.allocated_large, arena->stats.nmalloc_large,
    -	    arena->stats.ndalloc_large);
    -	malloc_printf("total:   %12zu %12llu %12llu\n",
    -	    arena->stats.allocated_small + arena->stats.allocated_large,
    -	    arena->stats.nmalloc_small + arena->stats.nmalloc_large,
    -	    arena->stats.ndalloc_small + arena->stats.ndalloc_large);
    -	malloc_printf("mapped:  %12zu\n", arena->stats.mapped);
    -
    -#ifdef MALLOC_MAG
    -	if (__isthreaded && opt_mag) {
    -		malloc_printf("bins:     bin   size regs pgs      mags   "
    -		    "newruns    reruns maxruns curruns\n");
    -	} else {
    -#endif
    -		malloc_printf("bins:     bin   size regs pgs  requests   "
    -		    "newruns    reruns maxruns curruns\n");
    -#ifdef MALLOC_MAG
    -	}
    -#endif
    -	for (i = 0, gap_start = UINT_MAX; i < nbins; i++) {
    -		if (arena->bins[i].stats.nruns == 0) {
    -			if (gap_start == UINT_MAX)
    -				gap_start = i;
    -		} else {
    -			if (gap_start != UINT_MAX) {
    -				if (i > gap_start + 1) {
    -					/* Gap of more than one size class. */
    -					malloc_printf("[%u..%u]\n",
    -					    gap_start, i - 1);
    -				} else {
    -					/* Gap of one size class. */
    -					malloc_printf("[%u]\n", gap_start);
    -				}
    -				gap_start = UINT_MAX;
    -			}
    -			malloc_printf(
    -			    "%13u %1s %4u %4u %3u %9llu %9llu"
    -			    " %9llu %7lu %7lu\n",
    -			    i,
    -			    i < ntbins ? "T" : i < ntbins + nqbins ? "Q" :
    -			    i < ntbins + nqbins + ncbins ? "C" : "S",
    -			    arena->bins[i].reg_size,
    -			    arena->bins[i].nregs,
    -			    arena->bins[i].run_size >> PAGE_SHIFT,
    -#ifdef MALLOC_MAG
    -			    (__isthreaded && opt_mag) ?
    -			    arena->bins[i].stats.nmags :
    -#endif
    -			    arena->bins[i].stats.nrequests,
    -			    arena->bins[i].stats.nruns,
    -			    arena->bins[i].stats.reruns,
    -			    arena->bins[i].stats.highruns,
    -			    arena->bins[i].stats.curruns);
    -		}
    -	}
    -	if (gap_start != UINT_MAX) {
    -		if (i > gap_start + 1) {
    -			/* Gap of more than one size class. */
    -			malloc_printf("[%u..%u]\n", gap_start, i - 1);
    -		} else {
    -			/* Gap of one size class. */
    -			malloc_printf("[%u]\n", gap_start);
    -		}
    -	}
    -}
    -#endif
    -
     /*
      * End Utility functions/macros.
      */
    @@ -1735,7 +1747,7 @@ extent_szad_comp(extent_node_t *a, extent_node_t *b)
     }
     
     /* Wrap red-black tree macros in functions. */
    -rb_wrap(__unused static, extent_tree_szad_, extent_tree_t, extent_node_t,
    +rb_gen(__unused static, extent_tree_szad_, extent_tree_t, extent_node_t,
         link_szad, extent_szad_comp)
     #endif
     
    @@ -1749,7 +1761,7 @@ extent_ad_comp(extent_node_t *a, extent_node_t *b)
     }
     
     /* Wrap red-black tree macros in functions. */
    -rb_wrap(__unused static, extent_tree_ad_, extent_tree_t, extent_node_t, link_ad,
    +rb_gen(__unused static, extent_tree_ad_, extent_tree_t, extent_node_t, link_ad,
         extent_ad_comp)
     
     /*
    @@ -1813,8 +1825,13 @@ pages_unmap(void *addr, size_t size)
     
     #ifdef MALLOC_DSS
     static void *
    -chunk_alloc_dss(size_t size)
    +chunk_alloc_dss(size_t size, bool *zero)
     {
    +	void *ret;
    +
    +	ret = chunk_recycle_dss(size, zero);
    +	if (ret != NULL)
    +		return (ret);
     
     	/*
     	 * sbrk() uses a signed increment argument, so take care not to
    @@ -1833,8 +1850,6 @@ chunk_alloc_dss(size_t size)
     		 * malloc.
     		 */
     		do {
    -			void *ret;
    -
     			/* Get the current end of the DSS. */
     			dss_max = sbrk(0);
     
    @@ -1856,6 +1871,7 @@ chunk_alloc_dss(size_t size)
     				/* Success. */
     				dss_max = (void *)((intptr_t)dss_prev + incr);
     				malloc_mutex_unlock(&dss_mtx);
    +				*zero = true;
     				return (ret);
     			}
     		} while (dss_prev != (void *)-1);
    @@ -1866,7 +1882,7 @@ chunk_alloc_dss(size_t size)
     }
     
     static void *
    -chunk_recycle_dss(size_t size, bool zero)
    +chunk_recycle_dss(size_t size, bool *zero)
     {
     	extent_node_t *node, key;
     
    @@ -1895,7 +1911,7 @@ chunk_recycle_dss(size_t size, bool zero)
     		}
     		malloc_mutex_unlock(&dss_mtx);
     
    -		if (zero)
    +		if (*zero)
     			memset(ret, 0, size);
     		return (ret);
     	}
    @@ -1906,82 +1922,124 @@ chunk_recycle_dss(size_t size, bool zero)
     #endif
     
     static void *
    -chunk_alloc_mmap(size_t size)
    +chunk_alloc_mmap_slow(size_t size, bool unaligned)
     {
     	void *ret;
     	size_t offset;
     
    +	/* Beware size_t wrap-around. */
    +	if (size + chunksize <= size)
    +		return (NULL);
    +
    +	ret = pages_map(NULL, size + chunksize);
    +	if (ret == NULL)
    +		return (NULL);
    +
    +	/* Clean up unneeded leading/trailing space. */
    +	offset = CHUNK_ADDR2OFFSET(ret);
    +	if (offset != 0) {
    +		/* Note that mmap() returned an unaligned mapping. */
    +		unaligned = true;
    +
    +		/* Leading space. */
    +		pages_unmap(ret, chunksize - offset);
    +
    +		ret = (void *)((uintptr_t)ret +
    +		    (chunksize - offset));
    +
    +		/* Trailing space. */
    +		pages_unmap((void *)((uintptr_t)ret + size),
    +		    offset);
    +	} else {
    +		/* Trailing space only. */
    +		pages_unmap((void *)((uintptr_t)ret + size),
    +		    chunksize);
    +	}
    +
    +	/*
    +	 * If mmap() returned an aligned mapping, reset mmap_unaligned so that
    +	 * the next chunk_alloc_mmap() execution tries the fast allocation
    +	 * method.
    +	 */
    +	if (unaligned == false)
    +		mmap_unaligned = false;
    +
    +	return (ret);
    +}
    +
    +static void *
    +chunk_alloc_mmap(size_t size)
    +{
    +	void *ret;
    +
     	/*
     	 * Ideally, there would be a way to specify alignment to mmap() (like
     	 * NetBSD has), but in the absence of such a feature, we have to work
     	 * hard to efficiently create aligned mappings.  The reliable, but
    -	 * expensive method is to create a mapping that is over-sized, then
    -	 * trim the excess.  However, that always results in at least one call
    -	 * to pages_unmap().
    +	 * slow method is to create a mapping that is over-sized, then trim the
    +	 * excess.  However, that always results in at least one call to
    +	 * pages_unmap().
     	 *
     	 * A more optimistic approach is to try mapping precisely the right
     	 * amount, then try to append another mapping if alignment is off.  In
     	 * practice, this works out well as long as the application is not
     	 * interleaving mappings via direct mmap() calls.  If we do run into a
     	 * situation where there is an interleaved mapping and we are unable to
    -	 * extend an unaligned mapping, our best option is to momentarily
    -	 * revert to the reliable-but-expensive method.  This will tend to
    -	 * leave a gap in the memory map that is too small to cause later
    -	 * problems for the optimistic method.
    +	 * extend an unaligned mapping, our best option is to switch to the
    +	 * slow method until mmap() returns another aligned mapping.  This will
    +	 * tend to leave a gap in the memory map that is too small to cause
    +	 * later problems for the optimistic method.
    +	 *
    +	 * Another possible confounding factor is address space layout
    +	 * randomization (ASLR), which causes mmap(2) to disregard the
    +	 * requested address.  mmap_unaligned tracks whether the previous
    +	 * chunk_alloc_mmap() execution received any unaligned or relocated
    +	 * mappings, and if so, the current execution will immediately fall
    +	 * back to the slow method.  However, we keep track of whether the fast
    +	 * method would have succeeded, and if so, we make a note to try the
    +	 * fast method next time.
     	 */
     
    -	ret = pages_map(NULL, size);
    -	if (ret == NULL)
    -		return (NULL);
    +	if (mmap_unaligned == false) {
    +		size_t offset;
     
    -	offset = CHUNK_ADDR2OFFSET(ret);
    -	if (offset != 0) {
    -		/* Try to extend chunk boundary. */
    -		if (pages_map((void *)((uintptr_t)ret + size),
    -		    chunksize - offset) == NULL) {
    -			/*
    -			 * Extension failed.  Clean up, then revert to the
    -			 * reliable-but-expensive method.
    -			 */
    -			pages_unmap(ret, size);
    +		ret = pages_map(NULL, size);
    +		if (ret == NULL)
    +			return (NULL);
     
    -			/* Beware size_t wrap-around. */
    -			if (size + chunksize <= size)
    -				return NULL;
    -
    -			ret = pages_map(NULL, size + chunksize);
    -			if (ret == NULL)
    -				return (NULL);
    -
    -			/* Clean up unneeded leading/trailing space. */
    -			offset = CHUNK_ADDR2OFFSET(ret);
    -			if (offset != 0) {
    -				/* Leading space. */
    -				pages_unmap(ret, chunksize - offset);
    -
    -				ret = (void *)((uintptr_t)ret +
    -				    (chunksize - offset));
    -
    -				/* Trailing space. */
    -				pages_unmap((void *)((uintptr_t)ret + size),
    -				    offset);
    +		offset = CHUNK_ADDR2OFFSET(ret);
    +		if (offset != 0) {
    +			mmap_unaligned = true;
    +			/* Try to extend chunk boundary. */
    +			if (pages_map((void *)((uintptr_t)ret + size),
    +			    chunksize - offset) == NULL) {
    +				/*
    +				 * Extension failed.  Clean up, then revert to
    +				 * the reliable-but-expensive method.
    +				 */
    +				pages_unmap(ret, size);
    +				ret = chunk_alloc_mmap_slow(size, true);
     			} else {
    -				/* Trailing space only. */
    -				pages_unmap((void *)((uintptr_t)ret + size),
    -				    chunksize);
    +				/* Clean up unneeded leading space. */
    +				pages_unmap(ret, chunksize - offset);
    +				ret = (void *)((uintptr_t)ret + (chunksize -
    +				    offset));
     			}
    -		} else {
    -			/* Clean up unneeded leading space. */
    -			pages_unmap(ret, chunksize - offset);
    -			ret = (void *)((uintptr_t)ret + (chunksize - offset));
     		}
    -	}
    +	} else
    +		ret = chunk_alloc_mmap_slow(size, false);
     
     	return (ret);
     }
     
    +/*
    + * If the caller specifies (*zero == false), it is still possible to receive
    + * zeroed memory, in which case *zero is toggled to true.  arena_chunk_alloc()
    + * takes advantage of this to avoid demanding zeroed chunks, but taking
    + * advantage of them if they are returned.
    + */
     static void *
    -chunk_alloc(size_t size, bool zero)
    +chunk_alloc(size_t size, bool *zero)
     {
     	void *ret;
     
    @@ -1993,18 +2051,15 @@ chunk_alloc(size_t size, bool zero)
     #endif
     	{
     		ret = chunk_alloc_mmap(size);
    -		if (ret != NULL)
    +		if (ret != NULL) {
    +			*zero = true;
     			goto RETURN;
    +		}
     	}
     
     #ifdef MALLOC_DSS
     	if (opt_dss) {
    -		ret = chunk_recycle_dss(size, zero);
    -		if (ret != NULL) {
    -			goto RETURN;
    -		}
    -
    -		ret = chunk_alloc_dss(size);
    +		ret = chunk_alloc_dss(size, zero);
     		if (ret != NULL)
     			goto RETURN;
     	}
    @@ -2015,11 +2070,13 @@ chunk_alloc(size_t size, bool zero)
     RETURN:
     #ifdef MALLOC_STATS
     	if (ret != NULL) {
    +		malloc_mutex_lock(&chunks_mtx);
     		stats_chunks.nchunks += (size / chunksize);
     		stats_chunks.curchunks += (size / chunksize);
    +		if (stats_chunks.curchunks > stats_chunks.highchunks)
    +			stats_chunks.highchunks = stats_chunks.curchunks;
    +		malloc_mutex_unlock(&chunks_mtx);
     	}
    -	if (stats_chunks.curchunks > stats_chunks.highchunks)
    -		stats_chunks.highchunks = stats_chunks.curchunks;
     #endif
     
     	assert(CHUNK_ADDR2BASE(ret) == ret);
    @@ -2088,6 +2145,7 @@ chunk_dealloc_dss_record(void *chunk, size_t size)
     static bool
     chunk_dealloc_dss(void *chunk, size_t size)
     {
    +	bool ret;
     
     	malloc_mutex_lock(&dss_mtx);
     	if ((uintptr_t)chunk >= (uintptr_t)dss_base
    @@ -2121,17 +2179,17 @@ chunk_dealloc_dss(void *chunk, size_t size)
     				extent_tree_ad_remove(&dss_chunks_ad, node);
     				base_node_dealloc(node);
     			}
    -			malloc_mutex_unlock(&dss_mtx);
    -		} else {
    -			malloc_mutex_unlock(&dss_mtx);
    +		} else
     			madvise(chunk, size, MADV_FREE);
    -		}
     
    -		return (false);
    +		ret = false;
    +		goto RETURN;
     	}
    -	malloc_mutex_unlock(&dss_mtx);
     
    -	return (true);
    +	ret = true;
    +RETURN:
    +	malloc_mutex_unlock(&dss_mtx);
    +	return (ret);
     }
     #endif
     
    @@ -2152,7 +2210,9 @@ chunk_dealloc(void *chunk, size_t size)
     	assert((size & chunksize_mask) == 0);
     
     #ifdef MALLOC_STATS
    +	malloc_mutex_lock(&chunks_mtx);
     	stats_chunks.curchunks -= (size / chunksize);
    +	malloc_mutex_unlock(&chunks_mtx);
     #endif
     
     #ifdef MALLOC_DSS
    @@ -2259,29 +2319,12 @@ choose_arena_hard(void)
     
     	assert(__isthreaded);
     
    -#ifdef MALLOC_BALANCE
    -	/* Seed the PRNG used for arena load balancing. */
    -	SPRN(balance, (uint32_t)(uintptr_t)(_pthread_self()));
    -#endif
    -
     	if (narenas > 1) {
    -#ifdef MALLOC_BALANCE
    -		unsigned ind;
    -
    -		ind = PRN(balance, narenas_2pow);
    -		if ((ret = arenas[ind]) == NULL) {
    -			malloc_spin_lock(&arenas_lock);
    -			if ((ret = arenas[ind]) == NULL)
    -				ret = arenas_extend(ind);
    -			malloc_spin_unlock(&arenas_lock);
    -		}
    -#else
     		malloc_spin_lock(&arenas_lock);
     		if ((ret = arenas[next_arena]) == NULL)
     			ret = arenas_extend(next_arena);
     		next_arena = (next_arena + 1) % narenas;
     		malloc_spin_unlock(&arenas_lock);
    -#endif
     	} else
     		ret = arenas[0];
     
    @@ -2304,7 +2347,7 @@ arena_chunk_comp(arena_chunk_t *a, arena_chunk_t *b)
     }
     
     /* Wrap red-black tree macros in functions. */
    -rb_wrap(__unused static, arena_chunk_tree_dirty_, arena_chunk_tree_t,
    +rb_gen(__unused static, arena_chunk_tree_dirty_, arena_chunk_tree_t,
         arena_chunk_t, link_dirty, arena_chunk_comp)
     
     static inline int
    @@ -2320,7 +2363,7 @@ arena_run_comp(arena_chunk_map_t *a, arena_chunk_map_t *b)
     }
     
     /* Wrap red-black tree macros in functions. */
    -rb_wrap(__unused static, arena_run_tree_, arena_run_tree_t, arena_chunk_map_t,
    +rb_gen(__unused static, arena_run_tree_, arena_run_tree_t, arena_chunk_map_t,
         link, arena_run_comp)
     
     static inline int
    @@ -2334,7 +2377,7 @@ arena_avail_comp(arena_chunk_map_t *a, arena_chunk_map_t *b)
     	if (ret == 0) {
     		uintptr_t a_mapelm, b_mapelm;
     
    -		if ((a->bits & CHUNK_MAP_KEY) == 0)
    +		if ((a->bits & CHUNK_MAP_KEY) != CHUNK_MAP_KEY)
     			a_mapelm = (uintptr_t)a;
     		else {
     			/*
    @@ -2352,9 +2395,108 @@ arena_avail_comp(arena_chunk_map_t *a, arena_chunk_map_t *b)
     }
     
     /* Wrap red-black tree macros in functions. */
    -rb_wrap(__unused static, arena_avail_tree_, arena_avail_tree_t,
    +rb_gen(__unused static, arena_avail_tree_, arena_avail_tree_t,
         arena_chunk_map_t, link, arena_avail_comp)
     
    +static inline void
    +arena_run_rc_incr(arena_run_t *run, arena_bin_t *bin, const void *ptr)
    +{
    +	arena_chunk_t *chunk;
    +	arena_t *arena;
    +	size_t pagebeg, pageend, i;
    +
    +	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
    +	arena = chunk->arena;
    +	pagebeg = ((uintptr_t)ptr - (uintptr_t)chunk) >> PAGE_SHIFT;
    +	pageend = ((uintptr_t)ptr + (uintptr_t)(bin->reg_size - 1) -
    +	    (uintptr_t)chunk) >> PAGE_SHIFT;
    +
    +	for (i = pagebeg; i <= pageend; i++) {
    +		size_t mapbits = chunk->map[i].bits;
    +
    +		if (mapbits & CHUNK_MAP_DIRTY) {
    +			assert((mapbits & CHUNK_MAP_RC_MASK) == 0);
    +			chunk->ndirty--;
    +			arena->ndirty--;
    +			mapbits ^= CHUNK_MAP_DIRTY;
    +		}
    +		assert((mapbits & CHUNK_MAP_RC_MASK) != CHUNK_MAP_RC_MASK);
    +		mapbits += CHUNK_MAP_RC_ONE;
    +		chunk->map[i].bits = mapbits;
    +	}
    +}
    +
    +static inline void
    +arena_run_rc_decr(arena_run_t *run, arena_bin_t *bin, const void *ptr)
    +{
    +	arena_chunk_t *chunk;
    +	arena_t *arena;
    +	size_t pagebeg, pageend, mapbits, i;
    +	bool dirtier = false;
    +
    +	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
    +	arena = chunk->arena;
    +	pagebeg = ((uintptr_t)ptr - (uintptr_t)chunk) >> PAGE_SHIFT;
    +	pageend = ((uintptr_t)ptr + (uintptr_t)(bin->reg_size - 1) -
    +	    (uintptr_t)chunk) >> PAGE_SHIFT;
    +
    +	/* First page. */
    +	mapbits = chunk->map[pagebeg].bits;
    +	mapbits -= CHUNK_MAP_RC_ONE;
    +	if ((mapbits & CHUNK_MAP_RC_MASK) == 0) {
    +		dirtier = true;
    +		assert((mapbits & CHUNK_MAP_DIRTY) == 0);
    +		mapbits |= CHUNK_MAP_DIRTY;
    +		chunk->ndirty++;
    +		arena->ndirty++;
    +	}
    +	chunk->map[pagebeg].bits = mapbits;
    +
    +	if (pageend - pagebeg >= 1) {
    +		/*
    +		 * Interior pages are completely consumed by the object being
    +		 * deallocated, which means that the pages can be
    +		 * unconditionally marked dirty.
    +		 */
    +		for (i = pagebeg + 1; i < pageend; i++) {
    +			mapbits = chunk->map[i].bits;
    +			mapbits -= CHUNK_MAP_RC_ONE;
    +			assert((mapbits & CHUNK_MAP_RC_MASK) == 0);
    +			dirtier = true;
    +			assert((mapbits & CHUNK_MAP_DIRTY) == 0);
    +			mapbits |= CHUNK_MAP_DIRTY;
    +			chunk->ndirty++;
    +			arena->ndirty++;
    +			chunk->map[i].bits = mapbits;
    +		}
    +
    +		/* Last page. */
    +		mapbits = chunk->map[pageend].bits;
    +		mapbits -= CHUNK_MAP_RC_ONE;
    +		if ((mapbits & CHUNK_MAP_RC_MASK) == 0) {
    +			dirtier = true;
    +			assert((mapbits & CHUNK_MAP_DIRTY) == 0);
    +			mapbits |= CHUNK_MAP_DIRTY;
    +			chunk->ndirty++;
    +			arena->ndirty++;
    +		}
    +		chunk->map[pageend].bits = mapbits;
    +	}
    +
    +	if (dirtier) {
    +		if (chunk->dirtied == false) {
    +			arena_chunk_tree_dirty_insert(&arena->chunks_dirty,
    +			    chunk);
    +			chunk->dirtied = true;
    +		}
    +
    +		/* Enforce opt_lg_dirty_mult. */
    +		if (opt_lg_dirty_mult >= 0 && (arena->nactive >>
    +		    opt_lg_dirty_mult) < arena->ndirty)
    +			arena_purge(arena);
    +	}
    +}
    +
     static inline void *
     arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin)
     {
    @@ -2375,7 +2517,7 @@ arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin)
     		/* Usable allocation found. */
     		bit = ffs((int)mask) - 1;
     
    -		regind = ((i << (SIZEOF_INT_2POW + 3)) + bit);
    +		regind = ((i << (LG_SIZEOF_INT + 3)) + bit);
     		assert(regind < bin->nregs);
     		ret = (void *)(((uintptr_t)run) + bin->reg0_offset
     		    + (bin->reg_size * regind));
    @@ -2384,6 +2526,8 @@ arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin)
     		mask ^= (1U << bit);
     		run->regs_mask[i] = mask;
     
    +		arena_run_rc_incr(run, bin, ret);
    +
     		return (ret);
     	}
     
    @@ -2393,7 +2537,7 @@ arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin)
     			/* Usable allocation found. */
     			bit = ffs((int)mask) - 1;
     
    -			regind = ((i << (SIZEOF_INT_2POW + 3)) + bit);
    +			regind = ((i << (LG_SIZEOF_INT + 3)) + bit);
     			assert(regind < bin->nregs);
     			ret = (void *)(((uintptr_t)run) + bin->reg0_offset
     			    + (bin->reg_size * regind));
    @@ -2408,6 +2552,8 @@ arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin)
     			 */
     			run->regs_minelm = i; /* Low payoff: + (mask == 0); */
     
    +			arena_run_rc_incr(run, bin, ret);
    +
     			return (ret);
     		}
     	}
    @@ -2419,7 +2565,7 @@ arena_run_reg_alloc(arena_run_t *run, arena_bin_t *bin)
     static inline void
     arena_run_reg_dalloc(arena_run_t *run, arena_bin_t *bin, void *ptr, size_t size)
     {
    -	unsigned diff, regind, elm, bit;
    +	unsigned shift, diff, regind, elm, bit;
     
     	assert(run->magic == ARENA_RUN_MAGIC);
     
    @@ -2428,31 +2574,16 @@ arena_run_reg_dalloc(arena_run_t *run, arena_bin_t *bin, void *ptr, size_t size)
     	 * actual division here can reduce allocator throughput by over 20%!
     	 */
     	diff = (unsigned)((uintptr_t)ptr - (uintptr_t)run - bin->reg0_offset);
    -	if ((size & (size - 1)) == 0) {
    -		/*
    -		 * log2_table allows fast division of a power of two in the
    -		 * [1..128] range.
    -		 *
    -		 * (x / divisor) becomes (x >> log2_table[divisor - 1]).
    -		 */
    -		static const unsigned char log2_table[] = {
    -		    0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4,
    -		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
    -		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
    -		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -		    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7
    -		};
     
    -		if (size <= 128)
    -			regind = (diff >> log2_table[size - 1]);
    -		else if (size <= 32768)
    -			regind = diff >> (8 + log2_table[(size >> 8) - 1]);
    -		else
    -			regind = diff / size;
    -	} else if (size < qspace_max) {
    +	/* Rescale (factor powers of 2 out of the numerator and denominator). */
    +	shift = ffs(size) - 1;
    +	diff >>= shift;
    +	size >>= shift;
    +
    +	if (size == 1) {
    +		/* The divisor was a power of 2. */
    +		regind = diff;
    +	} else {
     		/*
     		 * To divide by a number D that is not a power of two we
     		 * multiply by (2^21 / D) and then right shift by 21 positions.
    @@ -2461,87 +2592,43 @@ arena_run_reg_dalloc(arena_run_t *run, arena_bin_t *bin, void *ptr, size_t size)
     		 *
     		 * becomes
     		 *
    -		 *   (X * qsize_invs[(D >> QUANTUM_2POW) - 3])
    -		 *       >> SIZE_INV_SHIFT
    +		 *   (X * size_invs[D - 3]) >> SIZE_INV_SHIFT
     		 *
     		 * We can omit the first three elements, because we never
    -		 * divide by 0, and QUANTUM and 2*QUANTUM are both powers of
    -		 * two, which are handled above.
    +		 * divide by 0, and 1 and 2 are both powers of two, which are
    +		 * handled above.
     		 */
     #define	SIZE_INV_SHIFT 21
    -#define	QSIZE_INV(s) (((1U << SIZE_INV_SHIFT) / (s << QUANTUM_2POW)) + 1)
    -		static const unsigned qsize_invs[] = {
    -		    QSIZE_INV(3),
    -		    QSIZE_INV(4), QSIZE_INV(5), QSIZE_INV(6), QSIZE_INV(7)
    -#if (QUANTUM_2POW < 4)
    -		    ,
    -		    QSIZE_INV(8), QSIZE_INV(9), QSIZE_INV(10), QSIZE_INV(11),
    -		    QSIZE_INV(12),QSIZE_INV(13), QSIZE_INV(14), QSIZE_INV(15)
    -#endif
    +#define	SIZE_INV(s) (((1U << SIZE_INV_SHIFT) / (s)) + 1)
    +		static const unsigned size_invs[] = {
    +		    SIZE_INV(3),
    +		    SIZE_INV(4), SIZE_INV(5), SIZE_INV(6), SIZE_INV(7),
    +		    SIZE_INV(8), SIZE_INV(9), SIZE_INV(10), SIZE_INV(11),
    +		    SIZE_INV(12), SIZE_INV(13), SIZE_INV(14), SIZE_INV(15),
    +		    SIZE_INV(16), SIZE_INV(17), SIZE_INV(18), SIZE_INV(19),
    +		    SIZE_INV(20), SIZE_INV(21), SIZE_INV(22), SIZE_INV(23),
    +		    SIZE_INV(24), SIZE_INV(25), SIZE_INV(26), SIZE_INV(27),
    +		    SIZE_INV(28), SIZE_INV(29), SIZE_INV(30), SIZE_INV(31)
     		};
    -		assert(QUANTUM * (((sizeof(qsize_invs)) / sizeof(unsigned)) + 3)
    -		    >= (1U << QSPACE_MAX_2POW_DEFAULT));
     
    -		if (size <= (((sizeof(qsize_invs) / sizeof(unsigned)) + 2) <<
    -		    QUANTUM_2POW)) {
    -			regind = qsize_invs[(size >> QUANTUM_2POW) - 3] * diff;
    -			regind >>= SIZE_INV_SHIFT;
    -		} else
    +		if (size <= ((sizeof(size_invs) / sizeof(unsigned)) + 2))
    +			regind = (diff * size_invs[size - 3]) >> SIZE_INV_SHIFT;
    +		else
     			regind = diff / size;
    -#undef QSIZE_INV
    -	} else if (size < cspace_max) {
    -#define	CSIZE_INV(s) (((1U << SIZE_INV_SHIFT) / (s << CACHELINE_2POW)) + 1)
    -		static const unsigned csize_invs[] = {
    -		    CSIZE_INV(3),
    -		    CSIZE_INV(4), CSIZE_INV(5), CSIZE_INV(6), CSIZE_INV(7)
    -		};
    -		assert(CACHELINE * (((sizeof(csize_invs)) / sizeof(unsigned)) +
    -		    3) >= (1U << CSPACE_MAX_2POW_DEFAULT));
    -
    -		if (size <= (((sizeof(csize_invs) / sizeof(unsigned)) + 2) <<
    -		    CACHELINE_2POW)) {
    -			regind = csize_invs[(size >> CACHELINE_2POW) - 3] *
    -			    diff;
    -			regind >>= SIZE_INV_SHIFT;
    -		} else
    -			regind = diff / size;
    -#undef CSIZE_INV
    -	} else {
    -#define	SSIZE_INV(s) (((1U << SIZE_INV_SHIFT) / (s << SUBPAGE_2POW)) + 1)
    -		static const unsigned ssize_invs[] = {
    -		    SSIZE_INV(3),
    -		    SSIZE_INV(4), SSIZE_INV(5), SSIZE_INV(6), SSIZE_INV(7),
    -		    SSIZE_INV(8), SSIZE_INV(9), SSIZE_INV(10), SSIZE_INV(11),
    -		    SSIZE_INV(12), SSIZE_INV(13), SSIZE_INV(14), SSIZE_INV(15)
    -#if (PAGE_SHIFT == 13)
    -		    ,
    -		    SSIZE_INV(16), SSIZE_INV(17), SSIZE_INV(18), SSIZE_INV(19),
    -		    SSIZE_INV(20), SSIZE_INV(21), SSIZE_INV(22), SSIZE_INV(23),
    -		    SSIZE_INV(24), SSIZE_INV(25), SSIZE_INV(26), SSIZE_INV(27),
    -		    SSIZE_INV(28), SSIZE_INV(29), SSIZE_INV(29), SSIZE_INV(30)
    -#endif
    -		};
    -		assert(SUBPAGE * (((sizeof(ssize_invs)) / sizeof(unsigned)) + 3)
    -		    >= PAGE_SIZE);
    -
    -		if (size < (((sizeof(ssize_invs) / sizeof(unsigned)) + 2) <<
    -		    SUBPAGE_2POW)) {
    -			regind = ssize_invs[(size >> SUBPAGE_2POW) - 3] * diff;
    -			regind >>= SIZE_INV_SHIFT;
    -		} else
    -			regind = diff / size;
    -#undef SSIZE_INV
    -	}
    +#undef SIZE_INV
     #undef SIZE_INV_SHIFT
    +	}
     	assert(diff == regind * size);
     	assert(regind < bin->nregs);
     
    -	elm = regind >> (SIZEOF_INT_2POW + 3);
    +	elm = regind >> (LG_SIZEOF_INT + 3);
     	if (elm < run->regs_minelm)
     		run->regs_minelm = elm;
    -	bit = regind - (elm << (SIZEOF_INT_2POW + 3));
    +	bit = regind - (elm << (LG_SIZEOF_INT + 3));
     	assert((run->regs_mask[elm] & (1U << bit)) == 0);
     	run->regs_mask[elm] |= (1U << bit);
    +
    +	arena_run_rc_decr(run, bin, ptr);
     }
     
     static void
    @@ -2563,15 +2650,16 @@ arena_run_split(arena_t *arena, arena_run_t *run, size_t size, bool large,
     	rem_pages = total_pages - need_pages;
     
     	arena_avail_tree_remove(&arena->runs_avail, &chunk->map[run_ind]);
    +	arena->nactive += need_pages;
     
     	/* Keep track of trailing unused pages for later use. */
     	if (rem_pages > 0) {
     		chunk->map[run_ind+need_pages].bits = (rem_pages <<
     		    PAGE_SHIFT) | (chunk->map[run_ind+need_pages].bits &
    -		    PAGE_MASK);
    +		    CHUNK_MAP_FLAGS_MASK);
     		chunk->map[run_ind+total_pages-1].bits = (rem_pages <<
     		    PAGE_SHIFT) | (chunk->map[run_ind+total_pages-1].bits &
    -		    PAGE_MASK);
    +		    CHUNK_MAP_FLAGS_MASK);
     		arena_avail_tree_insert(&arena->runs_avail,
     		    &chunk->map[run_ind+need_pages]);
     	}
    @@ -2599,22 +2687,26 @@ arena_run_split(arena_t *arena, arena_run_t *run, size_t size, bool large,
     			chunk->map[run_ind + i].bits = CHUNK_MAP_LARGE
     			    | CHUNK_MAP_ALLOCATED;
     		} else {
    -			chunk->map[run_ind + i].bits = (size_t)run
    +			chunk->map[run_ind + i].bits = (i << CHUNK_MAP_PG_SHIFT)
     			    | CHUNK_MAP_ALLOCATED;
     		}
     	}
     
    -	/*
    -	 * Set the run size only in the first element for large runs.  This is
    -	 * primarily a debugging aid, since the lack of size info for trailing
    -	 * pages only matters if the application tries to operate on an
    -	 * interior pointer.
    -	 */
    -	if (large)
    +	if (large) {
    +		/*
    +		 * Set the run size only in the first element for large runs.
    +		 * This is primarily a debugging aid, since the lack of size
    +		 * info for trailing pages only matters if the application
    +		 * tries to operate on an interior pointer.
    +		 */
     		chunk->map[run_ind].bits |= size;
    -
    -	if (chunk->ndirty == 0 && old_ndirty > 0)
    -		arena_chunk_tree_dirty_remove(&arena->chunks_dirty, chunk);
    +	} else {
    +		/*
    +		 * Initialize the first page's refcount to 1, so that the run
    +		 * header is protected from dirty page purging.
    +		 */
    +		chunk->map[run_ind].bits += CHUNK_MAP_RC_ONE;
    +	}
     }
     
     static arena_chunk_t *
    @@ -2627,7 +2719,11 @@ arena_chunk_alloc(arena_t *arena)
     		chunk = arena->spare;
     		arena->spare = NULL;
     	} else {
    -		chunk = (arena_chunk_t *)chunk_alloc(chunksize, true);
    +		bool zero;
    +		size_t zeroed;
    +
    +		zero = false;
    +		chunk = (arena_chunk_t *)chunk_alloc(chunksize, &zero);
     		if (chunk == NULL)
     			return (NULL);
     #ifdef MALLOC_STATS
    @@ -2635,6 +2731,7 @@ arena_chunk_alloc(arena_t *arena)
     #endif
     
     		chunk->arena = arena;
    +		chunk->dirtied = false;
     
     		/*
     		 * Claim that no pages are in use, since the header is merely
    @@ -2644,15 +2741,16 @@ arena_chunk_alloc(arena_t *arena)
     
     		/*
     		 * Initialize the map to contain one maximal free untouched run.
    +		 * Mark the pages as zeroed iff chunk_alloc() returned a zeroed
    +		 * chunk.
     		 */
    +		zeroed = zero ? CHUNK_MAP_ZEROED : 0;
     		for (i = 0; i < arena_chunk_header_npages; i++)
     			chunk->map[i].bits = 0;
    -		chunk->map[i].bits = arena_maxclass | CHUNK_MAP_ZEROED;
    -		for (i++; i < chunk_npages-1; i++) {
    -			chunk->map[i].bits = CHUNK_MAP_ZEROED;
    -		}
    -		chunk->map[chunk_npages-1].bits = arena_maxclass |
    -		    CHUNK_MAP_ZEROED;
    +		chunk->map[i].bits = arena_maxclass | zeroed;
    +		for (i++; i < chunk_npages-1; i++)
    +			chunk->map[i].bits = zeroed;
    +		chunk->map[chunk_npages-1].bits = arena_maxclass | zeroed;
     	}
     
     	/* Insert the run into the runs_avail tree. */
    @@ -2667,7 +2765,7 @@ arena_chunk_dealloc(arena_t *arena, arena_chunk_t *chunk)
     {
     
     	if (arena->spare != NULL) {
    -		if (arena->spare->ndirty > 0) {
    +		if (arena->spare->dirtied) {
     			arena_chunk_tree_dirty_remove(
     			    &chunk->arena->chunks_dirty, arena->spare);
     			arena->ndirty -= arena->spare->ndirty;
    @@ -2727,6 +2825,18 @@ arena_run_alloc(arena_t *arena, size_t size, bool large, bool zero)
     	return (run);
     }
     
    +#ifdef MALLOC_DEBUG
    +static arena_chunk_t *
    +chunks_dirty_iter_cb(arena_chunk_tree_t *tree, arena_chunk_t *chunk, void *arg)
    +{
    +	size_t *ndirty = (size_t *)arg;
    +
    +	assert(chunk->dirtied);
    +	*ndirty += chunk->ndirty;
    +	return (NULL);
    +}
    +#endif
    +
     static void
     arena_purge(arena_t *arena)
     {
    @@ -2735,13 +2845,11 @@ arena_purge(arena_t *arena)
     #ifdef MALLOC_DEBUG
     	size_t ndirty = 0;
     
    -	rb_foreach_begin(arena_chunk_t, link_dirty, &arena->chunks_dirty,
    -	    chunk) {
    -		ndirty += chunk->ndirty;
    -	} rb_foreach_end(arena_chunk_t, link_dirty, &arena->chunks_dirty, chunk)
    +	arena_chunk_tree_dirty_iter(&arena->chunks_dirty, NULL,
    +	    chunks_dirty_iter_cb, (void *)&ndirty);
     	assert(ndirty == arena->ndirty);
     #endif
    -	assert(arena->ndirty > opt_dirty_max);
    +	assert((arena->nactive >> opt_lg_dirty_mult) < arena->ndirty);
     
     #ifdef MALLOC_STATS
     	arena->stats.npurge++;
    @@ -2753,13 +2861,13 @@ arena_purge(arena_t *arena)
     	 * number of system calls, even if a chunk has only been partially
     	 * purged.
     	 */
    -	while (arena->ndirty > (opt_dirty_max >> 1)) {
    +
    +	while ((arena->nactive >> (opt_lg_dirty_mult + 1)) < arena->ndirty) {
     		chunk = arena_chunk_tree_dirty_last(&arena->chunks_dirty);
     		assert(chunk != NULL);
     
     		for (i = chunk_npages - 1; chunk->ndirty > 0; i--) {
     			assert(i >= arena_chunk_header_npages);
    -
     			if (chunk->map[i].bits & CHUNK_MAP_DIRTY) {
     				chunk->map[i].bits ^= CHUNK_MAP_DIRTY;
     				/* Find adjacent dirty run(s). */
    @@ -2779,7 +2887,8 @@ arena_purge(arena_t *arena)
     				arena->stats.nmadvise++;
     				arena->stats.purged += npages;
     #endif
    -				if (arena->ndirty <= (opt_dirty_max >> 1))
    +				if ((arena->nactive >> (opt_lg_dirty_mult + 1))
    +				    >= arena->ndirty)
     					break;
     			}
     		}
    @@ -2787,6 +2896,7 @@ arena_purge(arena_t *arena)
     		if (chunk->ndirty == 0) {
     			arena_chunk_tree_dirty_remove(&arena->chunks_dirty,
     			    chunk);
    +			chunk->dirtied = false;
     		}
     	}
     }
    @@ -2807,23 +2917,26 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty)
     	else
     		size = run->bin->run_size;
     	run_pages = (size >> PAGE_SHIFT);
    +	arena->nactive -= run_pages;
     
     	/* Mark pages as unallocated in the chunk map. */
     	if (dirty) {
     		size_t i;
     
     		for (i = 0; i < run_pages; i++) {
    +			/*
    +			 * When (dirty == true), *all* pages within the run
    +			 * need to have their dirty bits set, because only
    +			 * small runs can create a mixture of clean/dirty
    +			 * pages, but such runs are passed to this function
    +			 * with (dirty == false).
    +			 */
     			assert((chunk->map[run_ind + i].bits & CHUNK_MAP_DIRTY)
     			    == 0);
    +			chunk->ndirty++;
    +			arena->ndirty++;
     			chunk->map[run_ind + i].bits = CHUNK_MAP_DIRTY;
     		}
    -
    -		if (chunk->ndirty == 0) {
    -			arena_chunk_tree_dirty_insert(&arena->chunks_dirty,
    -			    chunk);
    -		}
    -		chunk->ndirty += run_pages;
    -		arena->ndirty += run_pages;
     	} else {
     		size_t i;
     
    @@ -2833,9 +2946,9 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty)
     		}
     	}
     	chunk->map[run_ind].bits = size | (chunk->map[run_ind].bits &
    -	    PAGE_MASK);
    +	    CHUNK_MAP_FLAGS_MASK);
     	chunk->map[run_ind+run_pages-1].bits = size |
    -	    (chunk->map[run_ind+run_pages-1].bits & PAGE_MASK);
    +	    (chunk->map[run_ind+run_pages-1].bits & CHUNK_MAP_FLAGS_MASK);
     
     	/* Try to coalesce forward. */
     	if (run_ind + run_pages < chunk_npages &&
    @@ -2856,9 +2969,10 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty)
     		assert((chunk->map[run_ind+run_pages-1].bits & ~PAGE_MASK)
     		    == nrun_size);
     		chunk->map[run_ind].bits = size | (chunk->map[run_ind].bits &
    -		    PAGE_MASK);
    +		    CHUNK_MAP_FLAGS_MASK);
     		chunk->map[run_ind+run_pages-1].bits = size |
    -		    (chunk->map[run_ind+run_pages-1].bits & PAGE_MASK);
    +		    (chunk->map[run_ind+run_pages-1].bits &
    +		    CHUNK_MAP_FLAGS_MASK);
     	}
     
     	/* Try to coalesce backward. */
    @@ -2878,25 +2992,45 @@ arena_run_dalloc(arena_t *arena, arena_run_t *run, bool dirty)
     		size += prun_size;
     		run_pages = size >> PAGE_SHIFT;
     
    -		assert((chunk->map[run_ind].bits & ~PAGE_MASK) ==
    -		    prun_size);
    +		assert((chunk->map[run_ind].bits & ~PAGE_MASK) == prun_size);
     		chunk->map[run_ind].bits = size | (chunk->map[run_ind].bits &
    -		    PAGE_MASK);
    +		    CHUNK_MAP_FLAGS_MASK);
     		chunk->map[run_ind+run_pages-1].bits = size |
    -		    (chunk->map[run_ind+run_pages-1].bits & PAGE_MASK);
    +		    (chunk->map[run_ind+run_pages-1].bits &
    +		    CHUNK_MAP_FLAGS_MASK);
     	}
     
     	/* Insert into runs_avail, now that coalescing is complete. */
     	arena_avail_tree_insert(&arena->runs_avail, &chunk->map[run_ind]);
     
    -	/* Deallocate chunk if it is now completely unused. */
    +	/*
    +	 * Deallocate chunk if it is now completely unused.  The bit
    +	 * manipulation checks whether the first run is unallocated and extends
    +	 * to the end of the chunk.
    +	 */
     	if ((chunk->map[arena_chunk_header_npages].bits & (~PAGE_MASK |
     	    CHUNK_MAP_ALLOCATED)) == arena_maxclass)
     		arena_chunk_dealloc(arena, chunk);
     
    -	/* Enforce opt_dirty_max. */
    -	if (arena->ndirty > opt_dirty_max)
    -		arena_purge(arena);
    +	/*
    +	 * It is okay to do dirty page processing even if the chunk was
    +	 * deallocated above, since in that case it is the spare.  Waiting
    +	 * until after possible chunk deallocation to do dirty processing
    +	 * allows for an old spare to be fully deallocated, thus decreasing the
    +	 * chances of spuriously crossing the dirty page purging threshold.
    +	 */
    +	if (dirty) {
    +		if (chunk->dirtied == false) {
    +			arena_chunk_tree_dirty_insert(&arena->chunks_dirty,
    +			    chunk);
    +			chunk->dirtied = true;
    +		}
    +
    +		/* Enforce opt_lg_dirty_mult. */
    +		if (opt_lg_dirty_mult >= 0 && (arena->nactive >>
    +		    opt_lg_dirty_mult) < arena->ndirty)
    +			arena_purge(arena);
    +	}
     }
     
     static void
    @@ -2912,8 +3046,10 @@ arena_run_trim_head(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run,
     	 * Update the chunk map so that arena_run_dalloc() can treat the
     	 * leading run as separately allocated.
     	 */
    +	assert((chunk->map[pageind].bits & CHUNK_MAP_DIRTY) == 0);
     	chunk->map[pageind].bits = (oldsize - newsize) | CHUNK_MAP_LARGE |
     	    CHUNK_MAP_ALLOCATED;
    +	assert((chunk->map[pageind+head_npages].bits & CHUNK_MAP_DIRTY) == 0);
     	chunk->map[pageind+head_npages].bits = newsize | CHUNK_MAP_LARGE |
     	    CHUNK_MAP_ALLOCATED;
     
    @@ -2933,8 +3069,10 @@ arena_run_trim_tail(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run,
     	 * Update the chunk map so that arena_run_dalloc() can treat the
     	 * trailing run as separately allocated.
     	 */
    +	assert((chunk->map[pageind].bits & CHUNK_MAP_DIRTY) == 0);
     	chunk->map[pageind].bits = newsize | CHUNK_MAP_LARGE |
     	    CHUNK_MAP_ALLOCATED;
    +	assert((chunk->map[pageind+npages].bits & CHUNK_MAP_DIRTY) == 0);
     	chunk->map[pageind+npages].bits = (oldsize - newsize) | CHUNK_MAP_LARGE
     	    | CHUNK_MAP_ALLOCATED;
     
    @@ -2952,9 +3090,18 @@ arena_bin_nonfull_run_get(arena_t *arena, arena_bin_t *bin)
     	/* Look for a usable run. */
     	mapelm = arena_run_tree_first(&bin->runs);
     	if (mapelm != NULL) {
    +		arena_chunk_t *chunk;
    +		size_t pageind;
    +
     		/* run is guaranteed to have available space. */
     		arena_run_tree_remove(&bin->runs, mapelm);
    -		run = (arena_run_t *)(mapelm->bits & ~PAGE_MASK);
    +
    +		chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mapelm);
    +		pageind = (((uintptr_t)mapelm - (uintptr_t)chunk->map) /
    +		    sizeof(arena_chunk_map_t));
    +		run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
    +		    ((mapelm->bits & CHUNK_MAP_PG_MASK) >> CHUNK_MAP_PG_SHIFT))
    +		    << PAGE_SHIFT));
     #ifdef MALLOC_STATS
     		bin->stats.reruns++;
     #endif
    @@ -2972,12 +3119,12 @@ arena_bin_nonfull_run_get(arena_t *arena, arena_bin_t *bin)
     
     	for (i = 0; i < bin->regs_mask_nelms - 1; i++)
     		run->regs_mask[i] = UINT_MAX;
    -	remainder = bin->nregs & ((1U << (SIZEOF_INT_2POW + 3)) - 1);
    +	remainder = bin->nregs & ((1U << (LG_SIZEOF_INT + 3)) - 1);
     	if (remainder == 0)
     		run->regs_mask[i] = UINT_MAX;
     	else {
     		/* The last element has spare bits that need to be unset. */
    -		run->regs_mask[i] = (UINT_MAX >> ((1U << (SIZEOF_INT_2POW + 3))
    +		run->regs_mask[i] = (UINT_MAX >> ((1U << (LG_SIZEOF_INT + 3))
     		    - remainder));
     	}
     
    @@ -3034,6 +3181,7 @@ arena_bin_malloc_hard(arena_t *arena, arena_bin_t *bin)
      *   *) bin->run_size <= arena_maxclass
      *   *) bin->run_size <= RUN_MAX_SMALL
      *   *) run header overhead <= RUN_MAX_OVRHD (or header overhead relaxed).
    + *   *) run header size < PAGE_SIZE
      *
      * bin->nregs, bin->regs_mask_nelms, and bin->reg0_offset are
      * also calculated here, since these settings are all interdependent.
    @@ -3064,8 +3212,8 @@ arena_bin_run_size_calc(arena_bin_t *bin, size_t min_run_size)
     	    + 1; /* Counter-act try_nregs-- in loop. */
     	do {
     		try_nregs--;
    -		try_mask_nelms = (try_nregs >> (SIZEOF_INT_2POW + 3)) +
    -		    ((try_nregs & ((1U << (SIZEOF_INT_2POW + 3)) - 1)) ? 1 : 0);
    +		try_mask_nelms = (try_nregs >> (LG_SIZEOF_INT + 3)) +
    +		    ((try_nregs & ((1U << (LG_SIZEOF_INT + 3)) - 1)) ? 1 : 0);
     		try_reg0_offset = try_run_size - (try_nregs * bin->reg_size);
     	} while (sizeof(arena_run_t) + (sizeof(unsigned) * (try_mask_nelms - 1))
     	    > try_reg0_offset);
    @@ -3086,8 +3234,8 @@ arena_bin_run_size_calc(arena_bin_t *bin, size_t min_run_size)
     		    bin->reg_size) + 1; /* Counter-act try_nregs-- in loop. */
     		do {
     			try_nregs--;
    -			try_mask_nelms = (try_nregs >> (SIZEOF_INT_2POW + 3)) +
    -			    ((try_nregs & ((1U << (SIZEOF_INT_2POW + 3)) - 1)) ?
    +			try_mask_nelms = (try_nregs >> (LG_SIZEOF_INT + 3)) +
    +			    ((try_nregs & ((1U << (LG_SIZEOF_INT + 3)) - 1)) ?
     			    1 : 0);
     			try_reg0_offset = try_run_size - (try_nregs *
     			    bin->reg_size);
    @@ -3095,11 +3243,13 @@ arena_bin_run_size_calc(arena_bin_t *bin, size_t min_run_size)
     		    (try_mask_nelms - 1)) > try_reg0_offset);
     	} while (try_run_size <= arena_maxclass && try_run_size <= RUN_MAX_SMALL
     	    && RUN_MAX_OVRHD * (bin->reg_size << 3) > RUN_MAX_OVRHD_RELAX
    -	    && (try_reg0_offset << RUN_BFP) > RUN_MAX_OVRHD * try_run_size);
    +	    && (try_reg0_offset << RUN_BFP) > RUN_MAX_OVRHD * try_run_size
    +	    && (sizeof(arena_run_t) + (sizeof(unsigned) * (try_mask_nelms - 1)))
    +	    < PAGE_SIZE);
     
     	assert(sizeof(arena_run_t) + (sizeof(unsigned) * (good_mask_nelms - 1))
     	    <= good_reg0_offset);
    -	assert((good_mask_nelms << (SIZEOF_INT_2POW + 3)) >= good_nregs);
    +	assert((good_mask_nelms << (LG_SIZEOF_INT + 3)) >= good_nregs);
     
     	/* Copy final settings. */
     	bin->run_size = good_run_size;
    @@ -3110,141 +3260,137 @@ arena_bin_run_size_calc(arena_bin_t *bin, size_t min_run_size)
     	return (good_run_size);
     }
     
    -#ifdef MALLOC_BALANCE
    +#ifdef MALLOC_TCACHE
     static inline void
    -arena_lock_balance(arena_t *arena)
    +tcache_event(tcache_t *tcache)
     {
    -	unsigned contention;
     
    -	contention = malloc_spin_lock(&arena->lock);
    -	if (narenas > 1) {
    -		/*
    -		 * Calculate the exponentially averaged contention for this
    -		 * arena.  Due to integer math always rounding down, this value
    -		 * decays somewhat faster than normal.
    -		 */
    -		arena->contention = (((uint64_t)arena->contention
    -		    * (uint64_t)((1U << BALANCE_ALPHA_INV_2POW)-1))
    -		    + (uint64_t)contention) >> BALANCE_ALPHA_INV_2POW;
    -		if (arena->contention >= opt_balance_threshold)
    -			arena_lock_balance_hard(arena);
    +	if (tcache_gc_incr == 0)
    +		return;
    +
    +	tcache->ev_cnt++;
    +	assert(tcache->ev_cnt <= tcache_gc_incr);
    +	if (tcache->ev_cnt >= tcache_gc_incr) {
    +		size_t binind = tcache->next_gc_bin;
    +		tcache_bin_t *tbin = tcache->tbins[binind];
    +
    +		if (tbin != NULL) {
    +			if (tbin->high_water == 0) {
    +				/*
    +				 * This bin went completely unused for an
    +				 * entire GC cycle, so throw away the tbin.
    +				 */
    +				assert(tbin->ncached == 0);
    +				tcache_bin_destroy(tcache, tbin, binind);
    +				tcache->tbins[binind] = NULL;
    +			} else {
    +				if (tbin->low_water > 0) {
    +					/*
    +					 * Flush (ceiling) half of the objects
    +					 * below the low water mark.
    +					 */
    +					tcache_bin_flush(tbin, binind,
    +					    tbin->ncached - (tbin->low_water >>
    +					    1) - (tbin->low_water & 1));
    +				}
    +				tbin->low_water = tbin->ncached;
    +				tbin->high_water = tbin->ncached;
    +			}
    +		}
    +
    +		tcache->next_gc_bin++;
    +		if (tcache->next_gc_bin == nbins)
    +			tcache->next_gc_bin = 0;
    +		tcache->ev_cnt = 0;
     	}
     }
     
    -static void
    -arena_lock_balance_hard(arena_t *arena)
    -{
    -	uint32_t ind;
    -
    -	arena->contention = 0;
    -#ifdef MALLOC_STATS
    -	arena->stats.nbalance++;
    -#endif
    -	ind = PRN(balance, narenas_2pow);
    -	if (arenas[ind] != NULL)
    -		arenas_map = arenas[ind];
    -	else {
    -		malloc_spin_lock(&arenas_lock);
    -		if (arenas[ind] != NULL)
    -			arenas_map = arenas[ind];
    -		else
    -			arenas_map = arenas_extend(ind);
    -		malloc_spin_unlock(&arenas_lock);
    -	}
    -}
    -#endif
    -
    -#ifdef MALLOC_MAG
     static inline void *
    -mag_alloc(mag_t *mag)
    +tcache_bin_alloc(tcache_bin_t *tbin)
     {
     
    -	if (mag->nrounds == 0)
    +	if (tbin->ncached == 0)
     		return (NULL);
    -	mag->nrounds--;
    -
    -	return (mag->rounds[mag->nrounds]);
    +	tbin->ncached--;
    +	if (tbin->ncached < tbin->low_water)
    +		tbin->low_water = tbin->ncached;
    +	return (tbin->slots[tbin->ncached]);
     }
     
     static void
    -mag_load(mag_t *mag)
    +tcache_bin_fill(tcache_t *tcache, tcache_bin_t *tbin, size_t binind)
     {
     	arena_t *arena;
     	arena_bin_t *bin;
     	arena_run_t *run;
    -	void *round;
    -	size_t i;
    +	void *ptr;
    +	unsigned i;
     
    -	arena = choose_arena();
    -	bin = &arena->bins[mag->binind];
    -#ifdef MALLOC_BALANCE
    -	arena_lock_balance(arena);
    -#else
    +	assert(tbin->ncached == 0);
    +
    +	arena = tcache->arena;
    +	bin = &arena->bins[binind];
     	malloc_spin_lock(&arena->lock);
    -#endif
    -	for (i = mag->nrounds; i < max_rounds; i++) {
    +	for (i = 0; i < (tcache_nslots >> 1); i++) {
     		if ((run = bin->runcur) != NULL && run->nfree > 0)
    -			round = arena_bin_malloc_easy(arena, bin, run);
    +			ptr = arena_bin_malloc_easy(arena, bin, run);
     		else
    -			round = arena_bin_malloc_hard(arena, bin);
    -		if (round == NULL)
    +			ptr = arena_bin_malloc_hard(arena, bin);
    +		if (ptr == NULL)
     			break;
    -		mag->rounds[i] = round;
    +		/*
    +		 * Fill tbin such that the objects lowest in memory are used
    +		 * first.
    +		 */
    +		tbin->slots[(tcache_nslots >> 1) - 1 - i] = ptr;
     	}
     #ifdef MALLOC_STATS
    -	bin->stats.nmags++;
    -	arena->stats.nmalloc_small += (i - mag->nrounds);
    -	arena->stats.allocated_small += (i - mag->nrounds) * bin->reg_size;
    +	bin->stats.nfills++;
    +	bin->stats.nrequests += tbin->tstats.nrequests;
    +	if (bin->reg_size <= small_maxclass) {
    +		arena->stats.nmalloc_small += (i - tbin->ncached);
    +		arena->stats.allocated_small += (i - tbin->ncached) *
    +		    bin->reg_size;
    +		arena->stats.nmalloc_small += tbin->tstats.nrequests;
    +	} else {
    +		arena->stats.nmalloc_medium += (i - tbin->ncached);
    +		arena->stats.allocated_medium += (i - tbin->ncached) *
    +		    bin->reg_size;
    +		arena->stats.nmalloc_medium += tbin->tstats.nrequests;
    +	}
    +	tbin->tstats.nrequests = 0;
     #endif
     	malloc_spin_unlock(&arena->lock);
    -	mag->nrounds = i;
    +	tbin->ncached = i;
    +	if (tbin->ncached > tbin->high_water)
    +		tbin->high_water = tbin->ncached;
     }
     
     static inline void *
    -mag_rack_alloc(mag_rack_t *rack, size_t size, bool zero)
    +tcache_alloc(tcache_t *tcache, size_t size, bool zero)
     {
     	void *ret;
    -	bin_mags_t *bin_mags;
    -	mag_t *mag;
    +	tcache_bin_t *tbin;
     	size_t binind;
     
    -	binind = size2bin[size];
    +	if (size <= small_maxclass)
    +		binind = small_size2bin[size];
    +	else {
    +		binind = mbin0 + ((MEDIUM_CEILING(size) - medium_min) >>
    +		    lg_mspace);
    +	}
     	assert(binind < nbins);
    -	bin_mags = &rack->bin_mags[binind];
    -
    -	mag = bin_mags->curmag;
    -	if (mag == NULL) {
    -		/* Create an initial magazine for this size class. */
    -		assert(bin_mags->sparemag == NULL);
    -		mag = mag_create(choose_arena(), binind);
    -		if (mag == NULL)
    +	tbin = tcache->tbins[binind];
    +	if (tbin == NULL) {
    +		tbin = tcache_bin_create(tcache->arena);
    +		if (tbin == NULL)
     			return (NULL);
    -		bin_mags->curmag = mag;
    -		mag_load(mag);
    +		tcache->tbins[binind] = tbin;
     	}
     
    -	ret = mag_alloc(mag);
    +	ret = tcache_bin_alloc(tbin);
     	if (ret == NULL) {
    -		if (bin_mags->sparemag != NULL) {
    -			if (bin_mags->sparemag->nrounds > 0) {
    -				/* Swap magazines. */
    -				bin_mags->curmag = bin_mags->sparemag;
    -				bin_mags->sparemag = mag;
    -				mag = bin_mags->curmag;
    -			} else {
    -				/* Reload the current magazine. */
    -				mag_load(mag);
    -			}
    -		} else {
    -			/* Create a second magazine. */
    -			mag = mag_create(choose_arena(), binind);
    -			if (mag == NULL)
    -				return (NULL);
    -			mag_load(mag);
    -			bin_mags->sparemag = bin_mags->curmag;
    -			bin_mags->curmag = mag;
    -		}
    -		ret = mag_alloc(mag);
    +		ret = tcache_alloc_hard(tcache, tbin, binind);
     		if (ret == NULL)
     			return (NULL);
     	}
    @@ -3257,6 +3403,21 @@ mag_rack_alloc(mag_rack_t *rack, size_t size, bool zero)
     	} else
     		memset(ret, 0, size);
     
    +#ifdef MALLOC_STATS
    +	tbin->tstats.nrequests++;
    +#endif
    +	tcache_event(tcache);
    +	return (ret);
    +}
    +
    +static void *
    +tcache_alloc_hard(tcache_t *tcache, tcache_bin_t *tbin, size_t binind)
    +{
    +	void *ret;
    +
    +	tcache_bin_fill(tcache, tbin, binind);
    +	ret = tcache_bin_alloc(tbin);
    +
     	return (ret);
     }
     #endif
    @@ -3269,16 +3430,12 @@ arena_malloc_small(arena_t *arena, size_t size, bool zero)
     	arena_run_t *run;
     	size_t binind;
     
    -	binind = size2bin[size];
    -	assert(binind < nbins);
    +	binind = small_size2bin[size];
    +	assert(binind < mbin0);
     	bin = &arena->bins[binind];
     	size = bin->reg_size;
     
    -#ifdef MALLOC_BALANCE
    -	arena_lock_balance(arena);
    -#else
     	malloc_spin_lock(&arena->lock);
    -#endif
     	if ((run = bin->runcur) != NULL && run->nfree > 0)
     		ret = arena_bin_malloc_easy(arena, bin, run);
     	else
    @@ -3290,8 +3447,14 @@ arena_malloc_small(arena_t *arena, size_t size, bool zero)
     	}
     
     #ifdef MALLOC_STATS
    -	bin->stats.nrequests++;
    -	arena->stats.nmalloc_small++;
    +#  ifdef MALLOC_TCACHE
    +	if (__isthreaded == false) {
    +#  endif
    +		bin->stats.nrequests++;
    +		arena->stats.nmalloc_small++;
    +#  ifdef MALLOC_TCACHE
    +	}
    +#  endif
     	arena->stats.allocated_small += size;
     #endif
     	malloc_spin_unlock(&arena->lock);
    @@ -3307,6 +3470,55 @@ arena_malloc_small(arena_t *arena, size_t size, bool zero)
     	return (ret);
     }
     
    +static void *
    +arena_malloc_medium(arena_t *arena, size_t size, bool zero)
    +{
    +	void *ret;
    +	arena_bin_t *bin;
    +	arena_run_t *run;
    +	size_t binind;
    +
    +	size = MEDIUM_CEILING(size);
    +	binind = mbin0 + ((size - medium_min) >> lg_mspace);
    +	assert(binind < nbins);
    +	bin = &arena->bins[binind];
    +	assert(bin->reg_size == size);
    +
    +	malloc_spin_lock(&arena->lock);
    +	if ((run = bin->runcur) != NULL && run->nfree > 0)
    +		ret = arena_bin_malloc_easy(arena, bin, run);
    +	else
    +		ret = arena_bin_malloc_hard(arena, bin);
    +
    +	if (ret == NULL) {
    +		malloc_spin_unlock(&arena->lock);
    +		return (NULL);
    +	}
    +
    +#ifdef MALLOC_STATS
    +#  ifdef MALLOC_TCACHE
    +	if (__isthreaded == false) {
    +#  endif
    +		bin->stats.nrequests++;
    +		arena->stats.nmalloc_medium++;
    +#  ifdef MALLOC_TCACHE
    +	}
    +#  endif
    +	arena->stats.allocated_medium += size;
    +#endif
    +	malloc_spin_unlock(&arena->lock);
    +
    +	if (zero == false) {
    +		if (opt_junk)
    +			memset(ret, 0xa5, size);
    +		else if (opt_zero)
    +			memset(ret, 0, size);
    +	} else
    +		memset(ret, 0, size);
    +
    +	return (ret);
    +}
    +
     static void *
     arena_malloc_large(arena_t *arena, size_t size, bool zero)
     {
    @@ -3314,11 +3526,7 @@ arena_malloc_large(arena_t *arena, size_t size, bool zero)
     
     	/* Large allocation. */
     	size = PAGE_CEILING(size);
    -#ifdef MALLOC_BALANCE
    -	arena_lock_balance(arena);
    -#else
     	malloc_spin_lock(&arena->lock);
    -#endif
     	ret = (void *)arena_run_alloc(arena, size, true, zero);
     	if (ret == NULL) {
     		malloc_spin_unlock(&arena->lock);
    @@ -3327,6 +3535,13 @@ arena_malloc_large(arena_t *arena, size_t size, bool zero)
     #ifdef MALLOC_STATS
     	arena->stats.nmalloc_large++;
     	arena->stats.allocated_large += size;
    +	arena->stats.lstats[(size >> PAGE_SHIFT) - 1].nrequests++;
    +	arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns++;
    +	if (arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns >
    +	    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns) {
    +		arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns =
    +		    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns;
    +	}
     #endif
     	malloc_spin_unlock(&arena->lock);
     
    @@ -3341,30 +3556,35 @@ arena_malloc_large(arena_t *arena, size_t size, bool zero)
     }
     
     static inline void *
    -arena_malloc(arena_t *arena, size_t size, bool zero)
    +arena_malloc(size_t size, bool zero)
     {
     
    -	assert(arena != NULL);
    -	assert(arena->magic == ARENA_MAGIC);
     	assert(size != 0);
     	assert(QUANTUM_CEILING(size) <= arena_maxclass);
     
     	if (size <= bin_maxclass) {
    -#ifdef MALLOC_MAG
    -		if (__isthreaded && opt_mag) {
    -			mag_rack_t *rack = mag_rack;
    -			if (rack == NULL) {
    -				rack = mag_rack_create(arena);
    -				if (rack == NULL)
    +#ifdef MALLOC_TCACHE
    +		if (__isthreaded && tcache_nslots) {
    +			tcache_t *tcache = tcache_tls;
    +			if ((uintptr_t)tcache > (uintptr_t)1)
    +				return (tcache_alloc(tcache, size, zero));
    +			else if (tcache == NULL) {
    +				tcache = tcache_create(choose_arena());
    +				if (tcache == NULL)
     					return (NULL);
    -				mag_rack = rack;
    +				return (tcache_alloc(tcache, size, zero));
     			}
    -			return (mag_rack_alloc(rack, size, zero));
    -		} else
    +		}
     #endif
    -			return (arena_malloc_small(arena, size, zero));
    +		if (size <= small_maxclass) {
    +			return (arena_malloc_small(choose_arena(), size,
    +			    zero));
    +		} else {
    +			return (arena_malloc_medium(choose_arena(),
    +			    size, zero));
    +		}
     	} else
    -		return (arena_malloc_large(arena, size, zero));
    +		return (arena_malloc_large(choose_arena(), size, zero));
     }
     
     static inline void *
    @@ -3374,7 +3594,7 @@ imalloc(size_t size)
     	assert(size != 0);
     
     	if (size <= arena_maxclass)
    -		return (arena_malloc(choose_arena(), size, false));
    +		return (arena_malloc(size, false));
     	else
     		return (huge_malloc(size, false));
     }
    @@ -3384,7 +3604,7 @@ icalloc(size_t size)
     {
     
     	if (size <= arena_maxclass)
    -		return (arena_malloc(choose_arena(), size, true));
    +		return (arena_malloc(size, true));
     	else
     		return (huge_malloc(size, true));
     }
    @@ -3400,11 +3620,7 @@ arena_palloc(arena_t *arena, size_t alignment, size_t size, size_t alloc_size)
     	assert((size & PAGE_MASK) == 0);
     	assert((alignment & PAGE_MASK) == 0);
     
    -#ifdef MALLOC_BALANCE
    -	arena_lock_balance(arena);
    -#else
     	malloc_spin_lock(&arena->lock);
    -#endif
     	ret = (void *)arena_run_alloc(arena, alloc_size, true, false);
     	if (ret == NULL) {
     		malloc_spin_unlock(&arena->lock);
    @@ -3440,6 +3656,13 @@ arena_palloc(arena_t *arena, size_t alignment, size_t size, size_t alloc_size)
     #ifdef MALLOC_STATS
     	arena->stats.nmalloc_large++;
     	arena->stats.allocated_large += size;
    +	arena->stats.lstats[(size >> PAGE_SHIFT) - 1].nrequests++;
    +	arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns++;
    +	if (arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns >
    +	    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns) {
    +		arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns =
    +		    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns;
    +	}
     #endif
     	malloc_spin_unlock(&arena->lock);
     
    @@ -3486,7 +3709,7 @@ ipalloc(size_t alignment, size_t size)
     
     	if (ceil_size <= PAGE_SIZE || (alignment <= PAGE_SIZE
     	    && ceil_size <= arena_maxclass))
    -		ret = arena_malloc(choose_arena(), ceil_size, false);
    +		ret = arena_malloc(ceil_size, false);
     	else {
     		size_t run_size;
     
    @@ -3545,6 +3768,22 @@ ipalloc(size_t alignment, size_t size)
     	return (ret);
     }
     
    +static bool
    +arena_is_large(const void *ptr)
    +{
    +	arena_chunk_t *chunk;
    +	size_t pageind, mapbits;
    +
    +	assert(ptr != NULL);
    +	assert(CHUNK_ADDR2BASE(ptr) != ptr);
    +
    +	chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
    +	pageind = (((uintptr_t)ptr - (uintptr_t)chunk) >> PAGE_SHIFT);
    +	mapbits = chunk->map[pageind].bits;
    +	assert((mapbits & CHUNK_MAP_ALLOCATED) != 0);
    +	return ((mapbits & CHUNK_MAP_LARGE) != 0);
    +}
    +
     /* Return the size of the allocation pointed to by ptr. */
     static size_t
     arena_salloc(const void *ptr)
    @@ -3561,7 +3800,9 @@ arena_salloc(const void *ptr)
     	mapbits = chunk->map[pageind].bits;
     	assert((mapbits & CHUNK_MAP_ALLOCATED) != 0);
     	if ((mapbits & CHUNK_MAP_LARGE) == 0) {
    -		arena_run_t *run = (arena_run_t *)(mapbits & ~PAGE_MASK);
    +		arena_run_t *run = (arena_run_t *)((uintptr_t)chunk +
    +		    (uintptr_t)((pageind - ((mapbits & CHUNK_MAP_PG_MASK) >>
    +		    CHUNK_MAP_PG_SHIFT)) << PAGE_SHIFT));
     		assert(run->magic == ARENA_RUN_MAGIC);
     		ret = run->bin->reg_size;
     	} else {
    @@ -3607,14 +3848,18 @@ isalloc(const void *ptr)
     }
     
     static inline void
    -arena_dalloc_small(arena_t *arena, arena_chunk_t *chunk, void *ptr,
    +arena_dalloc_bin(arena_t *arena, arena_chunk_t *chunk, void *ptr,
         arena_chunk_map_t *mapelm)
     {
    +	size_t pageind;
     	arena_run_t *run;
     	arena_bin_t *bin;
     	size_t size;
     
    -	run = (arena_run_t *)(mapelm->bits & ~PAGE_MASK);
    +	pageind = (((uintptr_t)ptr - (uintptr_t)chunk) >> PAGE_SHIFT);
    +	run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
    +	    ((mapelm->bits & CHUNK_MAP_PG_MASK) >> CHUNK_MAP_PG_SHIFT)) <<
    +	    PAGE_SHIFT));
     	assert(run->magic == ARENA_RUN_MAGIC);
     	bin = run->bin;
     	size = bin->reg_size;
    @@ -3625,30 +3870,9 @@ arena_dalloc_small(arena_t *arena, arena_chunk_t *chunk, void *ptr,
     	arena_run_reg_dalloc(run, bin, ptr, size);
     	run->nfree++;
     
    -	if (run->nfree == bin->nregs) {
    -		/* Deallocate run. */
    -		if (run == bin->runcur)
    -			bin->runcur = NULL;
    -		else if (bin->nregs != 1) {
    -			size_t run_pageind = (((uintptr_t)run -
    -			    (uintptr_t)chunk)) >> PAGE_SHIFT;
    -			arena_chunk_map_t *run_mapelm =
    -			    &chunk->map[run_pageind];
    -			/*
    -			 * This block's conditional is necessary because if the
    -			 * run only contains one region, then it never gets
    -			 * inserted into the non-full runs tree.
    -			 */
    -			arena_run_tree_remove(&bin->runs, run_mapelm);
    -		}
    -#ifdef MALLOC_DEBUG
    -		run->magic = 0;
    -#endif
    -		arena_run_dalloc(arena, run, true);
    -#ifdef MALLOC_STATS
    -		bin->stats.curruns--;
    -#endif
    -	} else if (run->nfree == 1 && run != bin->runcur) {
    +	if (run->nfree == bin->nregs)
    +		arena_dalloc_bin_run(arena, chunk, run, bin);
    +	else if (run->nfree == 1 && run != bin->runcur) {
     		/*
     		 * Make sure that bin->runcur always refers to the lowest
     		 * non-full run, if one exists.
    @@ -3682,67 +3906,297 @@ arena_dalloc_small(arena_t *arena, arena_chunk_t *chunk, void *ptr,
     			arena_run_tree_insert(&bin->runs, run_mapelm);
     		}
     	}
    +
     #ifdef MALLOC_STATS
    -	arena->stats.allocated_small -= size;
    -	arena->stats.ndalloc_small++;
    +	if (size <= small_maxclass) {
    +		arena->stats.allocated_small -= size;
    +		arena->stats.ndalloc_small++;
    +	} else {
    +		arena->stats.allocated_medium -= size;
    +		arena->stats.ndalloc_medium++;
    +	}
     #endif
     }
     
    -#ifdef MALLOC_MAG
     static void
    -mag_unload(mag_t *mag)
    +arena_dalloc_bin_run(arena_t *arena, arena_chunk_t *chunk, arena_run_t *run,
    +    arena_bin_t *bin)
    +{
    +	size_t run_ind;
    +
    +	/* Deallocate run. */
    +	if (run == bin->runcur)
    +		bin->runcur = NULL;
    +	else if (bin->nregs != 1) {
    +		size_t run_pageind = (((uintptr_t)run -
    +		    (uintptr_t)chunk)) >> PAGE_SHIFT;
    +		arena_chunk_map_t *run_mapelm =
    +		    &chunk->map[run_pageind];
    +		/*
    +		 * This block's conditional is necessary because if the
    +		 * run only contains one region, then it never gets
    +		 * inserted into the non-full runs tree.
    +		 */
    +		arena_run_tree_remove(&bin->runs, run_mapelm);
    +	}
    +	/*
    +	 * Mark the first page as dirty.  The dirty bit for every other page in
    +	 * the run is already properly set, which means we can call
    +	 * arena_run_dalloc(..., false), thus potentially avoiding the needless
    +	 * creation of many dirty pages.
    +	 */
    +	run_ind = (size_t)(((uintptr_t)run - (uintptr_t)chunk) >> PAGE_SHIFT);
    +	assert((chunk->map[run_ind].bits & CHUNK_MAP_DIRTY) == 0);
    +	chunk->map[run_ind].bits |= CHUNK_MAP_DIRTY;
    +	chunk->ndirty++;
    +	arena->ndirty++;
    +
    +#ifdef MALLOC_DEBUG
    +	run->magic = 0;
    +#endif
    +	arena_run_dalloc(arena, run, false);
    +#ifdef MALLOC_STATS
    +	bin->stats.curruns--;
    +#endif
    +
    +	if (chunk->dirtied == false) {
    +		arena_chunk_tree_dirty_insert(&arena->chunks_dirty, chunk);
    +		chunk->dirtied = true;
    +	}
    +	/* Enforce opt_lg_dirty_mult. */
    +	if (opt_lg_dirty_mult >= 0 && (arena->nactive >> opt_lg_dirty_mult) <
    +	    arena->ndirty)
    +		arena_purge(arena);
    +}
    +
    +#ifdef MALLOC_STATS
    +static void
    +arena_stats_print(arena_t *arena)
    +{
    +
    +	malloc_printf("dirty pages: %zu:%zu active:dirty, %"PRIu64" sweep%s,"
    +	    " %"PRIu64" madvise%s, %"PRIu64" purged\n",
    +	    arena->nactive, arena->ndirty,
    +	    arena->stats.npurge, arena->stats.npurge == 1 ? "" : "s",
    +	    arena->stats.nmadvise, arena->stats.nmadvise == 1 ? "" : "s",
    +	    arena->stats.purged);
    +
    +	malloc_printf("            allocated      nmalloc      ndalloc\n");
    +	malloc_printf("small:   %12zu %12"PRIu64" %12"PRIu64"\n",
    +	    arena->stats.allocated_small, arena->stats.nmalloc_small,
    +	    arena->stats.ndalloc_small);
    +	malloc_printf("medium:  %12zu %12"PRIu64" %12"PRIu64"\n",
    +	    arena->stats.allocated_medium, arena->stats.nmalloc_medium,
    +	    arena->stats.ndalloc_medium);
    +	malloc_printf("large:   %12zu %12"PRIu64" %12"PRIu64"\n",
    +	    arena->stats.allocated_large, arena->stats.nmalloc_large,
    +	    arena->stats.ndalloc_large);
    +	malloc_printf("total:   %12zu %12"PRIu64" %12"PRIu64"\n",
    +	    arena->stats.allocated_small + arena->stats.allocated_medium +
    +	    arena->stats.allocated_large, arena->stats.nmalloc_small +
    +	    arena->stats.nmalloc_medium + arena->stats.nmalloc_large,
    +	    arena->stats.ndalloc_small + arena->stats.ndalloc_medium +
    +	    arena->stats.ndalloc_large);
    +	malloc_printf("mapped:  %12zu\n", arena->stats.mapped);
    +
    +	if (arena->stats.nmalloc_small + arena->stats.nmalloc_medium > 0) {
    +		unsigned i, gap_start;
    +#ifdef MALLOC_TCACHE
    +		malloc_printf("bins:     bin    size regs pgs  requests    "
    +		    "nfills  nflushes   newruns    reruns maxruns curruns\n");
    +#else
    +		malloc_printf("bins:     bin    size regs pgs  requests   "
    +		    "newruns    reruns maxruns curruns\n");
    +#endif
    +		for (i = 0, gap_start = UINT_MAX; i < nbins; i++) {
    +			if (arena->bins[i].stats.nruns == 0) {
    +				if (gap_start == UINT_MAX)
    +					gap_start = i;
    +			} else {
    +				if (gap_start != UINT_MAX) {
    +					if (i > gap_start + 1) {
    +						/*
    +						 * Gap of more than one size
    +						 * class.
    +						 */
    +						malloc_printf("[%u..%u]\n",
    +						    gap_start, i - 1);
    +					} else {
    +						/* Gap of one size class. */
    +						malloc_printf("[%u]\n",
    +						    gap_start);
    +					}
    +					gap_start = UINT_MAX;
    +				}
    +				malloc_printf(
    +				    "%13u %1s %5u %4u %3u %9"PRIu64" %9"PRIu64
    +#ifdef MALLOC_TCACHE
    +				    " %9"PRIu64" %9"PRIu64
    +#endif
    +				    " %9"PRIu64" %7zu %7zu\n",
    +				    i,
    +				    i < ntbins ? "T" : i < ntbins + nqbins ?
    +				    "Q" : i < ntbins + nqbins + ncbins ? "C" :
    +				    i < ntbins + nqbins + ncbins + nsbins ? "S"
    +				    : "M",
    +				    arena->bins[i].reg_size,
    +				    arena->bins[i].nregs,
    +				    arena->bins[i].run_size >> PAGE_SHIFT,
    +				    arena->bins[i].stats.nrequests,
    +#ifdef MALLOC_TCACHE
    +				    arena->bins[i].stats.nfills,
    +				    arena->bins[i].stats.nflushes,
    +#endif
    +				    arena->bins[i].stats.nruns,
    +				    arena->bins[i].stats.reruns,
    +				    arena->bins[i].stats.highruns,
    +				    arena->bins[i].stats.curruns);
    +			}
    +		}
    +		if (gap_start != UINT_MAX) {
    +			if (i > gap_start + 1) {
    +				/* Gap of more than one size class. */
    +				malloc_printf("[%u..%u]\n", gap_start, i - 1);
    +			} else {
    +				/* Gap of one size class. */
    +				malloc_printf("[%u]\n", gap_start);
    +			}
    +		}
    +	}
    +
    +	if (arena->stats.nmalloc_large > 0) {
    +		size_t i;
    +		ssize_t gap_start;
    +		size_t nlclasses = (chunksize - PAGE_SIZE) >> PAGE_SHIFT;
    +
    +		malloc_printf(
    +		    "large:   size pages nrequests   maxruns   curruns\n");
    +
    +		for (i = 0, gap_start = -1; i < nlclasses; i++) {
    +			if (arena->stats.lstats[i].nrequests == 0) {
    +				if (gap_start == -1)
    +					gap_start = i;
    +			} else {
    +				if (gap_start != -1) {
    +					malloc_printf("[%zu]\n", i - gap_start);
    +					gap_start = -1;
    +				}
    +				malloc_printf(
    +				    "%13zu %5zu %9"PRIu64" %9zu %9zu\n",
    +				    (i+1) << PAGE_SHIFT, i+1,
    +				    arena->stats.lstats[i].nrequests,
    +				    arena->stats.lstats[i].highruns,
    +				    arena->stats.lstats[i].curruns);
    +			}
    +		}
    +		if (gap_start != -1)
    +			malloc_printf("[%zu]\n", i - gap_start);
    +	}
    +}
    +#endif
    +
    +static void
    +stats_print_atexit(void)
    +{
    +
    +#if (defined(MALLOC_TCACHE) && defined(MALLOC_STATS))
    +	unsigned i;
    +
    +	/*
    +	 * Merge stats from extant threads.  This is racy, since individual
    +	 * threads do not lock when recording tcache stats events.  As a
    +	 * consequence, the final stats may be slightly out of date by the time
    +	 * they are reported, if other threads continue to allocate.
    +	 */
    +	for (i = 0; i < narenas; i++) {
    +		arena_t *arena = arenas[i];
    +		if (arena != NULL) {
    +			tcache_t *tcache;
    +
    +			malloc_spin_lock(&arena->lock);
    +			ql_foreach(tcache, &arena->tcache_ql, link) {
    +				tcache_stats_merge(tcache, arena);
    +			}
    +			malloc_spin_unlock(&arena->lock);
    +		}
    +	}
    +#endif
    +	malloc_stats_print();
    +}
    +
    +#ifdef MALLOC_TCACHE
    +static void
    +tcache_bin_flush(tcache_bin_t *tbin, size_t binind, unsigned rem)
     {
     	arena_chunk_t *chunk;
     	arena_t *arena;
    -	void *round;
    -	size_t i, ndeferred, nrounds;
    +	void *ptr;
    +	unsigned i, ndeferred, ncached;
     
    -	for (ndeferred = mag->nrounds; ndeferred > 0;) {
    -		nrounds = ndeferred;
    -		/* Lock the arena associated with the first round. */
    -		chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(mag->rounds[0]);
    +	for (ndeferred = tbin->ncached - rem; ndeferred > 0;) {
    +		ncached = ndeferred;
    +		/* Lock the arena associated with the first object. */
    +		chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(tbin->slots[0]);
     		arena = chunk->arena;
    -#ifdef MALLOC_BALANCE
    -		arena_lock_balance(arena);
    -#else
     		malloc_spin_lock(&arena->lock);
    -#endif
    -		/* Deallocate every round that belongs to the locked arena. */
    -		for (i = ndeferred = 0; i < nrounds; i++) {
    -			round = mag->rounds[i];
    -			chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(round);
    +		/* Deallocate every object that belongs to the locked arena. */
    +		for (i = ndeferred = 0; i < ncached; i++) {
    +			ptr = tbin->slots[i];
    +			chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
     			if (chunk->arena == arena) {
    -				size_t pageind = (((uintptr_t)round -
    +				size_t pageind = (((uintptr_t)ptr -
     				    (uintptr_t)chunk) >> PAGE_SHIFT);
     				arena_chunk_map_t *mapelm =
     				    &chunk->map[pageind];
    -				arena_dalloc_small(arena, chunk, round, mapelm);
    +				arena_dalloc_bin(arena, chunk, ptr, mapelm);
     			} else {
     				/*
    -				 * This round was allocated via a different
    +				 * This object was allocated via a different
     				 * arena than the one that is currently locked.
    -				 * Stash the round, so that it can be handled
    +				 * Stash the object, so that it can be handled
     				 * in a future pass.
     				 */
    -				mag->rounds[ndeferred] = round;
    +				tbin->slots[ndeferred] = ptr;
     				ndeferred++;
     			}
     		}
    +#ifdef MALLOC_STATS
    +		arena->bins[binind].stats.nflushes++;
    +		{
    +			arena_bin_t *bin = &arena->bins[binind];
    +			bin->stats.nrequests += tbin->tstats.nrequests;
    +			if (bin->reg_size <= small_maxclass) {
    +				arena->stats.nmalloc_small +=
    +				    tbin->tstats.nrequests;
    +			} else {
    +				arena->stats.nmalloc_medium +=
    +				    tbin->tstats.nrequests;
    +			}
    +			tbin->tstats.nrequests = 0;
    +		}
    +#endif
     		malloc_spin_unlock(&arena->lock);
     	}
     
    -	mag->nrounds = 0;
    +	if (rem > 0) {
    +		/*
    +		 * Shift the remaining valid pointers to the base of the slots
    +		 * array.
    +		 */
    +		memmove(&tbin->slots[0], &tbin->slots[tbin->ncached - rem],
    +		    rem * sizeof(void *));
    +	}
    +	tbin->ncached = rem;
     }
     
     static inline void
    -mag_rack_dalloc(mag_rack_t *rack, void *ptr)
    +tcache_dalloc(tcache_t *tcache, void *ptr)
     {
     	arena_t *arena;
     	arena_chunk_t *chunk;
     	arena_run_t *run;
     	arena_bin_t *bin;
    -	bin_mags_t *bin_mags;
    -	mag_t *mag;
    +	tcache_bin_t *tbin;
     	size_t pageind, binind;
     	arena_chunk_map_t *mapelm;
     
    @@ -3750,7 +4204,9 @@ mag_rack_dalloc(mag_rack_t *rack, void *ptr)
     	arena = chunk->arena;
     	pageind = (((uintptr_t)ptr - (uintptr_t)chunk) >> PAGE_SHIFT);
     	mapelm = &chunk->map[pageind];
    -	run = (arena_run_t *)(mapelm->bits & ~PAGE_MASK);
    +	run = (arena_run_t *)((uintptr_t)chunk + (uintptr_t)((pageind -
    +	    ((mapelm->bits & CHUNK_MAP_PG_MASK) >> CHUNK_MAP_PG_SHIFT)) <<
    +	    PAGE_SHIFT));
     	assert(run->magic == ARENA_RUN_MAGIC);
     	bin = run->bin;
     	binind = ((uintptr_t)bin - (uintptr_t)&arena->bins) /
    @@ -3760,53 +4216,34 @@ mag_rack_dalloc(mag_rack_t *rack, void *ptr)
     	if (opt_junk)
     		memset(ptr, 0x5a, arena->bins[binind].reg_size);
     
    -	bin_mags = &rack->bin_mags[binind];
    -	mag = bin_mags->curmag;
    -	if (mag == NULL) {
    -		/* Create an initial magazine for this size class. */
    -		assert(bin_mags->sparemag == NULL);
    -		mag = mag_create(choose_arena(), binind);
    -		if (mag == NULL) {
    +	tbin = tcache->tbins[binind];
    +	if (tbin == NULL) {
    +		tbin = tcache_bin_create(choose_arena());
    +		if (tbin == NULL) {
     			malloc_spin_lock(&arena->lock);
    -			arena_dalloc_small(arena, chunk, ptr, mapelm);
    +			arena_dalloc_bin(arena, chunk, ptr, mapelm);
     			malloc_spin_unlock(&arena->lock);
     			return;
     		}
    -		bin_mags->curmag = mag;
    +		tcache->tbins[binind] = tbin;
     	}
     
    -	if (mag->nrounds == max_rounds) {
    -		if (bin_mags->sparemag != NULL) {
    -			if (bin_mags->sparemag->nrounds < max_rounds) {
    -				/* Swap magazines. */
    -				bin_mags->curmag = bin_mags->sparemag;
    -				bin_mags->sparemag = mag;
    -				mag = bin_mags->curmag;
    -			} else {
    -				/* Unload the current magazine. */
    -				mag_unload(mag);
    -			}
    -		} else {
    -			/* Create a second magazine. */
    -			mag = mag_create(choose_arena(), binind);
    -			if (mag == NULL) {
    -				mag = rack->bin_mags[binind].curmag;
    -				mag_unload(mag);
    -			} else {
    -				bin_mags->sparemag = bin_mags->curmag;
    -				bin_mags->curmag = mag;
    -			}
    -		}
    -		assert(mag->nrounds < max_rounds);
    -	}
    -	mag->rounds[mag->nrounds] = ptr;
    -	mag->nrounds++;
    +	if (tbin->ncached == tcache_nslots)
    +		tcache_bin_flush(tbin, binind, (tcache_nslots >> 1));
    +	assert(tbin->ncached < tcache_nslots);
    +	tbin->slots[tbin->ncached] = ptr;
    +	tbin->ncached++;
    +	if (tbin->ncached > tbin->high_water)
    +		tbin->high_water = tbin->ncached;
    +
    +	tcache_event(tcache);
     }
     #endif
     
     static void
     arena_dalloc_large(arena_t *arena, arena_chunk_t *chunk, void *ptr)
     {
    +
     	/* Large allocation. */
     	malloc_spin_lock(&arena->lock);
     
    @@ -3823,12 +4260,11 @@ arena_dalloc_large(arena_t *arena, arena_chunk_t *chunk, void *ptr)
     #endif
     			memset(ptr, 0x5a, size);
     #ifdef MALLOC_STATS
    +		arena->stats.ndalloc_large++;
     		arena->stats.allocated_large -= size;
    +		arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns--;
     #endif
     	}
    -#ifdef MALLOC_STATS
    -	arena->stats.ndalloc_large++;
    -#endif
     
     	arena_run_dalloc(arena, (arena_run_t *)ptr, true);
     	malloc_spin_unlock(&arena->lock);
    @@ -3851,32 +4287,51 @@ arena_dalloc(arena_t *arena, arena_chunk_t *chunk, void *ptr)
     	assert((mapelm->bits & CHUNK_MAP_ALLOCATED) != 0);
     	if ((mapelm->bits & CHUNK_MAP_LARGE) == 0) {
     		/* Small allocation. */
    -#ifdef MALLOC_MAG
    -		if (__isthreaded && opt_mag) {
    -			mag_rack_t *rack = mag_rack;
    -			if (rack == NULL) {
    -				rack = mag_rack_create(arena);
    -				if (rack == NULL) {
    -					malloc_spin_lock(&arena->lock);
    -					arena_dalloc_small(arena, chunk, ptr,
    -					    mapelm);
    -					malloc_spin_unlock(&arena->lock);
    -				}
    -				mag_rack = rack;
    +#ifdef MALLOC_TCACHE
    +		if (__isthreaded && tcache_nslots) {
    +			tcache_t *tcache = tcache_tls;
    +			if ((uintptr_t)tcache > (uintptr_t)1)
    +				tcache_dalloc(tcache, ptr);
    +			else {
    +				arena_dalloc_hard(arena, chunk, ptr, mapelm,
    +				    tcache);
     			}
    -			mag_rack_dalloc(rack, ptr);
     		} else {
     #endif
     			malloc_spin_lock(&arena->lock);
    -			arena_dalloc_small(arena, chunk, ptr, mapelm);
    +			arena_dalloc_bin(arena, chunk, ptr, mapelm);
     			malloc_spin_unlock(&arena->lock);
    -#ifdef MALLOC_MAG
    +#ifdef MALLOC_TCACHE
     		}
     #endif
     	} else
     		arena_dalloc_large(arena, chunk, ptr);
     }
     
    +#ifdef MALLOC_TCACHE
    +static void
    +arena_dalloc_hard(arena_t *arena, arena_chunk_t *chunk, void *ptr,
    +    arena_chunk_map_t *mapelm, tcache_t *tcache)
    +{
    +
    +	if (tcache == NULL) {
    +		tcache = tcache_create(arena);
    +		if (tcache == NULL) {
    +			malloc_spin_lock(&arena->lock);
    +			arena_dalloc_bin(arena, chunk, ptr, mapelm);
    +			malloc_spin_unlock(&arena->lock);
    +		} else
    +			tcache_dalloc(tcache, ptr);
    +	} else {
    +		/* This thread is currently exiting, so directly deallocate. */
    +		assert(tcache == (void *)(uintptr_t)1);
    +		malloc_spin_lock(&arena->lock);
    +		arena_dalloc_bin(arena, chunk, ptr, mapelm);
    +		malloc_spin_unlock(&arena->lock);
    +	}
    +}
    +#endif
    +
     static inline void
     idalloc(void *ptr)
     {
    @@ -3902,15 +4357,23 @@ arena_ralloc_large_shrink(arena_t *arena, arena_chunk_t *chunk, void *ptr,
     	 * Shrink the run, and make trailing pages available for other
     	 * allocations.
     	 */
    -#ifdef MALLOC_BALANCE
    -	arena_lock_balance(arena);
    -#else
     	malloc_spin_lock(&arena->lock);
    -#endif
     	arena_run_trim_tail(arena, chunk, (arena_run_t *)ptr, oldsize, size,
     	    true);
     #ifdef MALLOC_STATS
    -	arena->stats.allocated_large -= oldsize - size;
    +	arena->stats.ndalloc_large++;
    +	arena->stats.allocated_large -= oldsize;
    +	arena->stats.lstats[(oldsize >> PAGE_SHIFT) - 1].curruns--;
    +
    +	arena->stats.nmalloc_large++;
    +	arena->stats.allocated_large += size;
    +	arena->stats.lstats[(size >> PAGE_SHIFT) - 1].nrequests++;
    +	arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns++;
    +	if (arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns >
    +	    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns) {
    +		arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns =
    +		    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns;
    +	}
     #endif
     	malloc_spin_unlock(&arena->lock);
     }
    @@ -3926,11 +4389,7 @@ arena_ralloc_large_grow(arena_t *arena, arena_chunk_t *chunk, void *ptr,
     
     	/* Try to extend the run. */
     	assert(size > oldsize);
    -#ifdef MALLOC_BALANCE
    -	arena_lock_balance(arena);
    -#else
     	malloc_spin_lock(&arena->lock);
    -#endif
     	if (pageind + npages < chunk_npages && (chunk->map[pageind+npages].bits
     	    & CHUNK_MAP_ALLOCATED) == 0 && (chunk->map[pageind+npages].bits &
     	    ~PAGE_MASK) >= size - oldsize) {
    @@ -3949,7 +4408,19 @@ arena_ralloc_large_grow(arena_t *arena, arena_chunk_t *chunk, void *ptr,
     		    CHUNK_MAP_ALLOCATED;
     
     #ifdef MALLOC_STATS
    -		arena->stats.allocated_large += size - oldsize;
    +		arena->stats.ndalloc_large++;
    +		arena->stats.allocated_large -= oldsize;
    +		arena->stats.lstats[(oldsize >> PAGE_SHIFT) - 1].curruns--;
    +
    +		arena->stats.nmalloc_large++;
    +		arena->stats.allocated_large += size;
    +		arena->stats.lstats[(size >> PAGE_SHIFT) - 1].nrequests++;
    +		arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns++;
    +		if (arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns >
    +		    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns) {
    +			arena->stats.lstats[(size >> PAGE_SHIFT) - 1].highruns =
    +			    arena->stats.lstats[(size >> PAGE_SHIFT) - 1].curruns;
    +		}
     #endif
     		malloc_spin_unlock(&arena->lock);
     		return (false);
    @@ -4011,13 +4482,48 @@ arena_ralloc(void *ptr, size_t size, size_t oldsize)
     	void *ret;
     	size_t copysize;
     
    +	/*
    +	 * Try to avoid moving the allocation.
    +	 *
    +	 * posix_memalign() can cause allocation of "large" objects that are
    +	 * smaller than bin_maxclass (in order to meet alignment requirements).
    +	 * Therefore, do not assume that (oldsize <= bin_maxclass) indicates
    +	 * ptr refers to a bin-allocated object.
    +	 */
    +	if (oldsize <= arena_maxclass) {
    +		if (arena_is_large(ptr) == false ) {
    +			if (size <= small_maxclass) {
    +				if (oldsize <= small_maxclass &&
    +				    small_size2bin[size] ==
    +				    small_size2bin[oldsize])
    +					goto IN_PLACE;
    +			} else if (size <= bin_maxclass) {
    +				if (small_maxclass < oldsize && oldsize <=
    +				    bin_maxclass && MEDIUM_CEILING(size) ==
    +				    MEDIUM_CEILING(oldsize))
    +					goto IN_PLACE;
    +			}
    +		} else {
    +			assert(size <= arena_maxclass);
    +			if (size > bin_maxclass) {
    +				if (arena_ralloc_large(ptr, size, oldsize) ==
    +				    false)
    +					return (ptr);
    +			}
    +		}
    +	}
    +
     	/* Try to avoid moving the allocation. */
    -	if (size <= bin_maxclass) {
    -		if (oldsize <= bin_maxclass && size2bin[size] ==
    -		    size2bin[oldsize])
    +	if (size <= small_maxclass) {
    +		if (oldsize <= small_maxclass && small_size2bin[size] ==
    +		    small_size2bin[oldsize])
    +			goto IN_PLACE;
    +	} else if (size <= bin_maxclass) {
    +		if (small_maxclass < oldsize && oldsize <= bin_maxclass &&
    +		    MEDIUM_CEILING(size) == MEDIUM_CEILING(oldsize))
     			goto IN_PLACE;
     	} else {
    -		if (oldsize > bin_maxclass && oldsize <= arena_maxclass) {
    +		if (bin_maxclass < oldsize && oldsize <= arena_maxclass) {
     			assert(size > bin_maxclass);
     			if (arena_ralloc_large(ptr, size, oldsize) == false)
     				return (ptr);
    @@ -4029,7 +4535,7 @@ arena_ralloc(void *ptr, size_t size, size_t oldsize)
     	 * need to move the object.  In that case, fall back to allocating new
     	 * space and copying.
     	 */
    -	ret = arena_malloc(choose_arena(), size, false);
    +	ret = arena_malloc(size, false);
     	if (ret == NULL)
     		return (NULL);
     
    @@ -4063,7 +4569,7 @@ iralloc(void *ptr, size_t size)
     }
     
     static bool
    -arena_new(arena_t *arena)
    +arena_new(arena_t *arena, unsigned ind)
     {
     	unsigned i;
     	arena_bin_t *bin;
    @@ -4074,20 +4580,27 @@ arena_new(arena_t *arena)
     
     #ifdef MALLOC_STATS
     	memset(&arena->stats, 0, sizeof(arena_stats_t));
    +	arena->stats.lstats = (malloc_large_stats_t *)base_alloc(
    +	    sizeof(malloc_large_stats_t) * ((chunksize - PAGE_SIZE) >>
    +	        PAGE_SHIFT));
    +	if (arena->stats.lstats == NULL)
    +		return (true);
    +	memset(arena->stats.lstats, 0, sizeof(malloc_large_stats_t) *
    +	    ((chunksize - PAGE_SIZE) >> PAGE_SHIFT));
    +#  ifdef MALLOC_TCACHE
    +	ql_new(&arena->tcache_ql);
    +#  endif
     #endif
     
     	/* Initialize chunks. */
     	arena_chunk_tree_dirty_new(&arena->chunks_dirty);
     	arena->spare = NULL;
     
    +	arena->nactive = 0;
     	arena->ndirty = 0;
     
     	arena_avail_tree_new(&arena->runs_avail);
     
    -#ifdef MALLOC_BALANCE
    -	arena->contention = 0;
    -#endif
    -
     	/* Initialize bins. */
     	prev_run_size = PAGE_SIZE;
     
    @@ -4099,7 +4612,7 @@ arena_new(arena_t *arena)
     		bin->runcur = NULL;
     		arena_run_tree_new(&bin->runs);
     
    -		bin->reg_size = (1U << (TINY_MIN_2POW + i));
    +		bin->reg_size = (1U << (LG_TINY_MIN + i));
     
     		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
     
    @@ -4115,7 +4628,7 @@ arena_new(arena_t *arena)
     		bin->runcur = NULL;
     		arena_run_tree_new(&bin->runs);
     
    -		bin->reg_size = (i - ntbins + 1) << QUANTUM_2POW;
    +		bin->reg_size = (i - ntbins + 1) << LG_QUANTUM;
     
     		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
     
    @@ -4131,7 +4644,7 @@ arena_new(arena_t *arena)
     		arena_run_tree_new(&bin->runs);
     
     		bin->reg_size = cspace_min + ((i - (ntbins + nqbins)) <<
    -		    CACHELINE_2POW);
    +		    LG_CACHELINE);
     
     		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
     
    @@ -4141,13 +4654,29 @@ arena_new(arena_t *arena)
     	}
     
     	/* Subpage-spaced bins. */
    -	for (; i < nbins; i++) {
    +	for (; i < ntbins + nqbins + ncbins + nsbins; i++) {
     		bin = &arena->bins[i];
     		bin->runcur = NULL;
     		arena_run_tree_new(&bin->runs);
     
     		bin->reg_size = sspace_min + ((i - (ntbins + nqbins + ncbins))
    -		    << SUBPAGE_2POW);
    +		    << LG_SUBPAGE);
    +
    +		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
    +
    +#ifdef MALLOC_STATS
    +		memset(&bin->stats, 0, sizeof(malloc_bin_stats_t));
    +#endif
    +	}
    +
    +	/* Medium bins. */
    +	for (; i < nbins; i++) {
    +		bin = &arena->bins[i];
    +		bin->runcur = NULL;
    +		arena_run_tree_new(&bin->runs);
    +
    +		bin->reg_size = medium_min + ((i - (ntbins + nqbins + ncbins +
    +		    nsbins)) << lg_mspace);
     
     		prev_run_size = arena_bin_run_size_calc(bin, prev_run_size);
     
    @@ -4172,7 +4701,7 @@ arenas_extend(unsigned ind)
     	/* Allocate enough space for trailing bins. */
     	ret = (arena_t *)base_alloc(sizeof(arena_t)
     	    + (sizeof(arena_bin_t) * (nbins - 1)));
    -	if (ret != NULL && arena_new(ret) == false) {
    +	if (ret != NULL && arena_new(ret, ind) == false) {
     		arenas[ind] = ret;
     		return (ret);
     	}
    @@ -4192,92 +4721,166 @@ arenas_extend(unsigned ind)
     	return (arenas[0]);
     }
     
    -#ifdef MALLOC_MAG
    -static mag_t *
    -mag_create(arena_t *arena, size_t binind)
    +#ifdef MALLOC_TCACHE
    +static tcache_bin_t *
    +tcache_bin_create(arena_t *arena)
     {
    -	mag_t *ret;
    +	tcache_bin_t *ret;
    +	size_t tsize;
     
    -	if (sizeof(mag_t) + (sizeof(void *) * (max_rounds - 1)) <=
    -	    bin_maxclass) {
    -		ret = arena_malloc_small(arena, sizeof(mag_t) + (sizeof(void *)
    -		    * (max_rounds - 1)), false);
    -	} else {
    -		ret = imalloc(sizeof(mag_t) + (sizeof(void *) * (max_rounds -
    -		    1)));
    -	}
    +	tsize = sizeof(tcache_bin_t) + (sizeof(void *) * (tcache_nslots - 1));
    +	if (tsize <= small_maxclass)
    +		ret = (tcache_bin_t *)arena_malloc_small(arena, tsize, false);
    +	else if (tsize <= bin_maxclass)
    +		ret = (tcache_bin_t *)arena_malloc_medium(arena, tsize, false);
    +	else
    +		ret = (tcache_bin_t *)imalloc(tsize);
     	if (ret == NULL)
     		return (NULL);
    -	ret->binind = binind;
    -	ret->nrounds = 0;
    +#ifdef MALLOC_STATS
    +	memset(&ret->tstats, 0, sizeof(tcache_bin_stats_t));
    +#endif
    +	ret->low_water = 0;
    +	ret->high_water = 0;
    +	ret->ncached = 0;
     
     	return (ret);
     }
     
     static void
    -mag_destroy(mag_t *mag)
    +tcache_bin_destroy(tcache_t *tcache, tcache_bin_t *tbin, unsigned binind)
     {
     	arena_t *arena;
     	arena_chunk_t *chunk;
    -	size_t pageind;
    +	size_t pageind, tsize;
     	arena_chunk_map_t *mapelm;
     
    -	chunk = CHUNK_ADDR2BASE(mag);
    +	chunk = CHUNK_ADDR2BASE(tbin);
     	arena = chunk->arena;
    -	pageind = (((uintptr_t)mag - (uintptr_t)chunk) >> PAGE_SHIFT);
    +	pageind = (((uintptr_t)tbin - (uintptr_t)chunk) >> PAGE_SHIFT);
     	mapelm = &chunk->map[pageind];
     
    -	assert(mag->nrounds == 0);
    -	if (sizeof(mag_t) + (sizeof(void *) * (max_rounds - 1)) <=
    -	    bin_maxclass) {
    +#ifdef MALLOC_STATS
    +	if (tbin->tstats.nrequests != 0) {
    +		arena_t *arena = tcache->arena;
    +		arena_bin_t *bin = &arena->bins[binind];
     		malloc_spin_lock(&arena->lock);
    -		arena_dalloc_small(arena, chunk, mag, mapelm);
    +		bin->stats.nrequests += tbin->tstats.nrequests;
    +		if (bin->reg_size <= small_maxclass)
    +			arena->stats.nmalloc_small += tbin->tstats.nrequests;
    +		else
    +			arena->stats.nmalloc_medium += tbin->tstats.nrequests;
    +		malloc_spin_unlock(&arena->lock);
    +	}
    +#endif
    +
    +	assert(tbin->ncached == 0);
    +	tsize = sizeof(tcache_bin_t) + (sizeof(void *) * (tcache_nslots - 1));
    +	if (tsize <= bin_maxclass) {
    +		malloc_spin_lock(&arena->lock);
    +		arena_dalloc_bin(arena, chunk, tbin, mapelm);
     		malloc_spin_unlock(&arena->lock);
     	} else
    -		idalloc(mag);
    +		idalloc(tbin);
     }
     
    -static mag_rack_t *
    -mag_rack_create(arena_t *arena)
    +#ifdef MALLOC_STATS
    +static void
    +tcache_stats_merge(tcache_t *tcache, arena_t *arena)
     {
    +	unsigned i;
     
    -	assert(sizeof(mag_rack_t) + (sizeof(bin_mags_t *) * (nbins - 1)) <=
    -	    bin_maxclass);
    -	return (arena_malloc_small(arena, sizeof(mag_rack_t) +
    -	    (sizeof(bin_mags_t) * (nbins - 1)), true));
    +	/* Merge and reset tcache stats. */
    +	for (i = 0; i < mbin0; i++) {
    +		arena_bin_t *bin = &arena->bins[i];
    +		tcache_bin_t *tbin = tcache->tbins[i];
    +		if (tbin != NULL) {
    +			bin->stats.nrequests += tbin->tstats.nrequests;
    +			arena->stats.nmalloc_small += tbin->tstats.nrequests;
    +			tbin->tstats.nrequests = 0;
    +		}
    +	}
    +	for (; i < nbins; i++) {
    +		arena_bin_t *bin = &arena->bins[i];
    +		tcache_bin_t *tbin = tcache->tbins[i];
    +		if (tbin != NULL) {
    +			bin->stats.nrequests += tbin->tstats.nrequests;
    +			arena->stats.nmalloc_medium += tbin->tstats.nrequests;
    +			tbin->tstats.nrequests = 0;
    +		}
    +	}
    +}
    +#endif
    +
    +static tcache_t *
    +tcache_create(arena_t *arena)
    +{
    +	tcache_t *tcache;
    +
    +	if (sizeof(tcache_t) + (sizeof(tcache_bin_t *) * (nbins - 1)) <=
    +	    small_maxclass) {
    +		tcache = (tcache_t *)arena_malloc_small(arena, sizeof(tcache_t)
    +		    + (sizeof(tcache_bin_t *) * (nbins - 1)), true);
    +	} else if (sizeof(tcache_t) + (sizeof(tcache_bin_t *) * (nbins - 1)) <=
    +	    bin_maxclass) {
    +		tcache = (tcache_t *)arena_malloc_medium(arena, sizeof(tcache_t)
    +		    + (sizeof(tcache_bin_t *) * (nbins - 1)), true);
    +	} else {
    +		tcache = (tcache_t *)icalloc(sizeof(tcache_t) +
    +		    (sizeof(tcache_bin_t *) * (nbins - 1)));
    +	}
    +
    +	if (tcache == NULL)
    +		return (NULL);
    +
    +#ifdef MALLOC_STATS
    +	/* Link into list of extant tcaches. */
    +	malloc_spin_lock(&arena->lock);
    +	ql_elm_new(tcache, link);
    +	ql_tail_insert(&arena->tcache_ql, tcache, link);
    +	malloc_spin_unlock(&arena->lock);
    +#endif
    +
    +	tcache->arena = arena;
    +
    +	tcache_tls = tcache;
    +
    +	return (tcache);
     }
     
     static void
    -mag_rack_destroy(mag_rack_t *rack)
    +tcache_destroy(tcache_t *tcache)
     {
    -	arena_t *arena;
    -	arena_chunk_t *chunk;
    -	bin_mags_t *bin_mags;
    -	size_t i, pageind;
    -	arena_chunk_map_t *mapelm;
    +	unsigned i;
    +
    +#ifdef MALLOC_STATS
    +	/* Unlink from list of extant tcaches. */
    +	malloc_spin_lock(&tcache->arena->lock);
    +	ql_remove(&tcache->arena->tcache_ql, tcache, link);
    +	tcache_stats_merge(tcache, tcache->arena);
    +	malloc_spin_unlock(&tcache->arena->lock);
    +#endif
     
     	for (i = 0; i < nbins; i++) {
    -		bin_mags = &rack->bin_mags[i];
    -		if (bin_mags->curmag != NULL) {
    -			assert(bin_mags->curmag->binind == i);
    -			mag_unload(bin_mags->curmag);
    -			mag_destroy(bin_mags->curmag);
    -		}
    -		if (bin_mags->sparemag != NULL) {
    -			assert(bin_mags->sparemag->binind == i);
    -			mag_unload(bin_mags->sparemag);
    -			mag_destroy(bin_mags->sparemag);
    +		tcache_bin_t *tbin = tcache->tbins[i];
    +		if (tbin != NULL) {
    +			tcache_bin_flush(tbin, i, 0);
    +			tcache_bin_destroy(tcache, tbin, i);
     		}
     	}
     
    -	chunk = CHUNK_ADDR2BASE(rack);
    -	arena = chunk->arena;
    -	pageind = (((uintptr_t)rack - (uintptr_t)chunk) >> PAGE_SHIFT);
    -	mapelm = &chunk->map[pageind];
    +	if (arena_salloc(tcache) <= bin_maxclass) {
    +		arena_chunk_t *chunk = CHUNK_ADDR2BASE(tcache);
    +		arena_t *arena = chunk->arena;
    +		size_t pageind = (((uintptr_t)tcache - (uintptr_t)chunk) >>
    +		    PAGE_SHIFT);
    +		arena_chunk_map_t *mapelm = &chunk->map[pageind];
     
    -	malloc_spin_lock(&arena->lock);
    -	arena_dalloc_small(arena, chunk, rack, mapelm);
    -	malloc_spin_unlock(&arena->lock);
    +		malloc_spin_lock(&arena->lock);
    +		arena_dalloc_bin(arena, chunk, tcache, mapelm);
    +		malloc_spin_unlock(&arena->lock);
    +	} else
    +		idalloc(tcache);
     }
     #endif
     
    @@ -4309,7 +4912,7 @@ huge_malloc(size_t size, bool zero)
     	if (node == NULL)
     		return (NULL);
     
    -	ret = chunk_alloc(csize, zero);
    +	ret = chunk_alloc(csize, &zero);
     	if (ret == NULL) {
     		base_node_dealloc(node);
     		return (NULL);
    @@ -4344,6 +4947,7 @@ huge_palloc(size_t alignment, size_t size)
     	void *ret;
     	size_t alloc_size, chunk_size, offset;
     	extent_node_t *node;
    +	bool zero;
     
     	/*
     	 * This allocation requires alignment that is even larger than chunk
    @@ -4367,7 +4971,8 @@ huge_palloc(size_t alignment, size_t size)
     	if (node == NULL)
     		return (NULL);
     
    -	ret = chunk_alloc(alloc_size, false);
    +	zero = false;
    +	ret = chunk_alloc(alloc_size, &zero);
     	if (ret == NULL) {
     		base_node_dealloc(node);
     		return (NULL);
    @@ -4483,271 +5088,279 @@ huge_dalloc(void *ptr)
     }
     
     static void
    -malloc_print_stats(void)
    +malloc_stats_print(void)
     {
    +	char s[UMAX2S_BUFSIZE];
     
    -	if (opt_print_stats) {
    -		char s[UMAX2S_BUFSIZE];
    -		_malloc_message("___ Begin malloc statistics ___\n", "", "",
    -		    "");
    -		_malloc_message("Assertions ",
    +	_malloc_message("___ Begin malloc statistics ___\n", "", "", "");
    +	_malloc_message("Assertions ",
     #ifdef NDEBUG
    -		    "disabled",
    +	    "disabled",
     #else
    -		    "enabled",
    +	    "enabled",
     #endif
    -		    "\n", "");
    -		_malloc_message("Boolean MALLOC_OPTIONS: ",
    -		    opt_abort ? "A" : "a", "", "");
    +	    "\n", "");
    +	_malloc_message("Boolean MALLOC_OPTIONS: ", opt_abort ? "A" : "a", "", "");
     #ifdef MALLOC_DSS
    -		_malloc_message(opt_dss ? "D" : "d", "", "", "");
    +	_malloc_message(opt_dss ? "D" : "d", "", "", "");
     #endif
    -#ifdef MALLOC_MAG
    -		_malloc_message(opt_mag ? "G" : "g", "", "", "");
    -#endif
    -		_malloc_message(opt_junk ? "J" : "j", "", "", "");
    +	_malloc_message(opt_junk ? "J" : "j", "", "", "");
     #ifdef MALLOC_DSS
    -		_malloc_message(opt_mmap ? "M" : "m", "", "", "");
    +	_malloc_message(opt_mmap ? "M" : "m", "", "", "");
     #endif
    -		_malloc_message(opt_utrace ? "PU" : "Pu",
    -		    opt_sysv ? "V" : "v",
    -		    opt_xmalloc ? "X" : "x",
    -		    opt_zero ? "Z\n" : "z\n");
    +	_malloc_message("P", "", "", "");
    +	_malloc_message(opt_utrace ? "U" : "u", "", "", "");
    +	_malloc_message(opt_sysv ? "V" : "v", "", "", "");
    +	_malloc_message(opt_xmalloc ? "X" : "x", "", "", "");
    +	_malloc_message(opt_zero ? "Z" : "z", "", "", "");
    +	_malloc_message("\n", "", "", "");
     
    -		_malloc_message("CPUs: ", umax2s(ncpus, s), "\n", "");
    -		_malloc_message("Max arenas: ", umax2s(narenas, s), "\n", "");
    -#ifdef MALLOC_BALANCE
    -		_malloc_message("Arena balance threshold: ",
    -		    umax2s(opt_balance_threshold, s), "\n", "");
    -#endif
    -		_malloc_message("Pointer size: ", umax2s(sizeof(void *), s),
    -		    "\n", "");
    -		_malloc_message("Quantum size: ", umax2s(QUANTUM, s), "\n", "");
    -		_malloc_message("Cacheline size (assumed): ", umax2s(CACHELINE,
    -		    s), "\n", "");
    +	_malloc_message("CPUs: ", umax2s(ncpus, 10, s), "\n", "");
    +	_malloc_message("Max arenas: ", umax2s(narenas, 10, s), "\n", "");
    +	_malloc_message("Pointer size: ", umax2s(sizeof(void *), 10, s), "\n", "");
    +	_malloc_message("Quantum size: ", umax2s(QUANTUM, 10, s), "\n", "");
    +	_malloc_message("Cacheline size (assumed): ",
    +	    umax2s(CACHELINE, 10, s), "\n", "");
    +	_malloc_message("Subpage spacing: ", umax2s(SUBPAGE, 10, s), "\n", "");
    +	_malloc_message("Medium spacing: ", umax2s((1U << lg_mspace), 10, s), "\n",
    +	    "");
     #ifdef MALLOC_TINY
    -		_malloc_message("Tiny 2^n-spaced sizes: [", umax2s((1U <<
    -		    TINY_MIN_2POW), s), "..", "");
    -		_malloc_message(umax2s((qspace_min >> 1), s), "]\n", "", "");
    +	_malloc_message("Tiny 2^n-spaced sizes: [", umax2s((1U << LG_TINY_MIN), 10,
    +	    s), "..", "");
    +	_malloc_message(umax2s((qspace_min >> 1), 10, s), "]\n", "", "");
     #endif
    -		_malloc_message("Quantum-spaced sizes: [", umax2s(qspace_min,
    -		    s), "..", "");
    -		_malloc_message(umax2s(qspace_max, s), "]\n", "", "");
    -		_malloc_message("Cacheline-spaced sizes: [", umax2s(cspace_min,
    -		    s), "..", "");
    -		_malloc_message(umax2s(cspace_max, s), "]\n", "", "");
    -		_malloc_message("Subpage-spaced sizes: [", umax2s(sspace_min,
    -		    s), "..", "");
    -		_malloc_message(umax2s(sspace_max, s), "]\n", "", "");
    -#ifdef MALLOC_MAG
    -		_malloc_message("Rounds per magazine: ", umax2s(max_rounds, s),
    -		    "\n", "");
    +	_malloc_message("Quantum-spaced sizes: [", umax2s(qspace_min, 10, s), "..",
    +	    "");
    +	_malloc_message(umax2s(qspace_max, 10, s), "]\n", "", "");
    +	_malloc_message("Cacheline-spaced sizes: [",
    +	    umax2s(cspace_min, 10, s), "..", "");
    +	_malloc_message(umax2s(cspace_max, 10, s), "]\n", "", "");
    +	_malloc_message("Subpage-spaced sizes: [", umax2s(sspace_min, 10, s), "..",
    +	    "");
    +	_malloc_message(umax2s(sspace_max, 10, s), "]\n", "", "");
    +	_malloc_message("Medium sizes: [", umax2s(medium_min, 10, s), "..", "");
    +	_malloc_message(umax2s(medium_max, 10, s), "]\n", "", "");
    +	if (opt_lg_dirty_mult >= 0) {
    +		_malloc_message("Min active:dirty page ratio per arena: ",
    +		    umax2s((1U << opt_lg_dirty_mult), 10, s), ":1\n", "");
    +	} else {
    +		_malloc_message("Min active:dirty page ratio per arena: N/A\n", "",
    +		    "", "");
    +	}
    +#ifdef MALLOC_TCACHE
    +	_malloc_message("Thread cache slots per size class: ",
    +	    tcache_nslots ? umax2s(tcache_nslots, 10, s) : "N/A", "\n", "");
    +	_malloc_message("Thread cache GC sweep interval: ",
    +	    (tcache_nslots && tcache_gc_incr > 0) ?
    +	    umax2s((1U << opt_lg_tcache_gc_sweep), 10, s) : "N/A", "", "");
    +	_malloc_message(" (increment interval: ",
    +	    (tcache_nslots && tcache_gc_incr > 0) ?  umax2s(tcache_gc_incr, 10, s)
    +	    : "N/A", ")\n", "");
     #endif
    -		_malloc_message("Max dirty pages per arena: ",
    -		    umax2s(opt_dirty_max, s), "\n", "");
    -
    -		_malloc_message("Chunk size: ", umax2s(chunksize, s), "", "");
    -		_malloc_message(" (2^", umax2s(opt_chunk_2pow, s), ")\n", "");
    +	_malloc_message("Chunk size: ", umax2s(chunksize, 10, s), "", "");
    +	_malloc_message(" (2^", umax2s(opt_lg_chunk, 10, s), ")\n", "");
     
     #ifdef MALLOC_STATS
    -		{
    -			size_t allocated, mapped;
    -#ifdef MALLOC_BALANCE
    -			uint64_t nbalance = 0;
    -#endif
    -			unsigned i;
    -			arena_t *arena;
    +	{
    +		size_t allocated, mapped;
    +		unsigned i;
    +		arena_t *arena;
     
    -			/* Calculate and print allocated/mapped stats. */
    +		/* Calculate and print allocated/mapped stats. */
     
    -			/* arenas. */
    -			for (i = 0, allocated = 0; i < narenas; i++) {
    -				if (arenas[i] != NULL) {
    -					malloc_spin_lock(&arenas[i]->lock);
    -					allocated +=
    -					    arenas[i]->stats.allocated_small;
    -					allocated +=
    -					    arenas[i]->stats.allocated_large;
    -#ifdef MALLOC_BALANCE
    -					nbalance += arenas[i]->stats.nbalance;
    -#endif
    -					malloc_spin_unlock(&arenas[i]->lock);
    -				}
    -			}
    -
    -			/* huge/base. */
    -			malloc_mutex_lock(&huge_mtx);
    -			allocated += huge_allocated;
    -			mapped = stats_chunks.curchunks * chunksize;
    -			malloc_mutex_unlock(&huge_mtx);
    -
    -			malloc_mutex_lock(&base_mtx);
    -			mapped += base_mapped;
    -			malloc_mutex_unlock(&base_mtx);
    -
    -			malloc_printf("Allocated: %zu, mapped: %zu\n",
    -			    allocated, mapped);
    -
    -#ifdef MALLOC_BALANCE
    -			malloc_printf("Arena balance reassignments: %llu\n",
    -			    nbalance);
    -#endif
    -
    -			/* Print chunk stats. */
    -			{
    -				chunk_stats_t chunks_stats;
    -
    -				malloc_mutex_lock(&huge_mtx);
    -				chunks_stats = stats_chunks;
    -				malloc_mutex_unlock(&huge_mtx);
    -
    -				malloc_printf("chunks: nchunks   "
    -				    "highchunks    curchunks\n");
    -				malloc_printf("  %13llu%13lu%13lu\n",
    -				    chunks_stats.nchunks,
    -				    chunks_stats.highchunks,
    -				    chunks_stats.curchunks);
    -			}
    -
    -			/* Print chunk stats. */
    -			malloc_printf(
    -			    "huge: nmalloc      ndalloc    allocated\n");
    -			malloc_printf(" %12llu %12llu %12zu\n",
    -			    huge_nmalloc, huge_ndalloc, huge_allocated);
    -
    -			/* Print stats for each arena. */
    -			for (i = 0; i < narenas; i++) {
    -				arena = arenas[i];
    -				if (arena != NULL) {
    -					malloc_printf(
    -					    "\narenas[%u]:\n", i);
    -					malloc_spin_lock(&arena->lock);
    -					stats_print(arena);
    -					malloc_spin_unlock(&arena->lock);
    -				}
    +		/* arenas. */
    +		for (i = 0, allocated = 0; i < narenas; i++) {
    +			if (arenas[i] != NULL) {
    +				malloc_spin_lock(&arenas[i]->lock);
    +				allocated += arenas[i]->stats.allocated_small;
    +				allocated += arenas[i]->stats.allocated_large;
    +				malloc_spin_unlock(&arenas[i]->lock);
    +			}
    +		}
    +
    +		/* huge/base. */
    +		malloc_mutex_lock(&huge_mtx);
    +		allocated += huge_allocated;
    +		mapped = stats_chunks.curchunks * chunksize;
    +		malloc_mutex_unlock(&huge_mtx);
    +
    +		malloc_mutex_lock(&base_mtx);
    +		mapped += base_mapped;
    +		malloc_mutex_unlock(&base_mtx);
    +
    +		malloc_printf("Allocated: %zu, mapped: %zu\n", allocated,
    +		    mapped);
    +
    +		/* Print chunk stats. */
    +		{
    +			chunk_stats_t chunks_stats;
    +
    +			malloc_mutex_lock(&huge_mtx);
    +			chunks_stats = stats_chunks;
    +			malloc_mutex_unlock(&huge_mtx);
    +
    +			malloc_printf("chunks: nchunks   "
    +			    "highchunks    curchunks\n");
    +			malloc_printf("  %13"PRIu64"%13zu%13zu\n",
    +			    chunks_stats.nchunks, chunks_stats.highchunks,
    +			    chunks_stats.curchunks);
    +		}
    +
    +		/* Print chunk stats. */
    +		malloc_printf(
    +		    "huge: nmalloc      ndalloc    allocated\n");
    +		malloc_printf(" %12"PRIu64" %12"PRIu64" %12zu\n", huge_nmalloc,
    +		    huge_ndalloc, huge_allocated);
    +
    +		/* Print stats for each arena. */
    +		for (i = 0; i < narenas; i++) {
    +			arena = arenas[i];
    +			if (arena != NULL) {
    +				malloc_printf("\narenas[%u]:\n", i);
    +				malloc_spin_lock(&arena->lock);
    +				arena_stats_print(arena);
    +				malloc_spin_unlock(&arena->lock);
     			}
     		}
    -#endif /* #ifdef MALLOC_STATS */
    -		_malloc_message("--- End malloc statistics ---\n", "", "", "");
     	}
    +#endif /* #ifdef MALLOC_STATS */
    +	_malloc_message("--- End malloc statistics ---\n", "", "", "");
     }
     
     #ifdef MALLOC_DEBUG
     static void
    -size2bin_validate(void)
    +small_size2bin_validate(void)
     {
     	size_t i, size, binind;
     
    -	assert(size2bin[0] == 0xffU);
    +	assert(small_size2bin[0] == 0xffU);
     	i = 1;
     #  ifdef MALLOC_TINY
     	/* Tiny. */
    -	for (; i < (1U << TINY_MIN_2POW); i++) {
    -		size = pow2_ceil(1U << TINY_MIN_2POW);
    -		binind = ffs((int)(size >> (TINY_MIN_2POW + 1)));
    -		assert(size2bin[i] == binind);
    +	for (; i < (1U << LG_TINY_MIN); i++) {
    +		size = pow2_ceil(1U << LG_TINY_MIN);
    +		binind = ffs((int)(size >> (LG_TINY_MIN + 1)));
    +		assert(small_size2bin[i] == binind);
     	}
     	for (; i < qspace_min; i++) {
     		size = pow2_ceil(i);
    -		binind = ffs((int)(size >> (TINY_MIN_2POW + 1)));
    -		assert(size2bin[i] == binind);
    +		binind = ffs((int)(size >> (LG_TINY_MIN + 1)));
    +		assert(small_size2bin[i] == binind);
     	}
     #  endif
     	/* Quantum-spaced. */
     	for (; i <= qspace_max; i++) {
     		size = QUANTUM_CEILING(i);
    -		binind = ntbins + (size >> QUANTUM_2POW) - 1;
    -		assert(size2bin[i] == binind);
    +		binind = ntbins + (size >> LG_QUANTUM) - 1;
    +		assert(small_size2bin[i] == binind);
     	}
     	/* Cacheline-spaced. */
     	for (; i <= cspace_max; i++) {
     		size = CACHELINE_CEILING(i);
     		binind = ntbins + nqbins + ((size - cspace_min) >>
    -		    CACHELINE_2POW);
    -		assert(size2bin[i] == binind);
    +		    LG_CACHELINE);
    +		assert(small_size2bin[i] == binind);
     	}
     	/* Sub-page. */
     	for (; i <= sspace_max; i++) {
     		size = SUBPAGE_CEILING(i);
     		binind = ntbins + nqbins + ncbins + ((size - sspace_min)
    -		    >> SUBPAGE_2POW);
    -		assert(size2bin[i] == binind);
    +		    >> LG_SUBPAGE);
    +		assert(small_size2bin[i] == binind);
     	}
     }
     #endif
     
     static bool
    -size2bin_init(void)
    +small_size2bin_init(void)
     {
     
    -	if (opt_qspace_max_2pow != QSPACE_MAX_2POW_DEFAULT
    -	    || opt_cspace_max_2pow != CSPACE_MAX_2POW_DEFAULT)
    -		return (size2bin_init_hard());
    +	if (opt_lg_qspace_max != LG_QSPACE_MAX_DEFAULT
    +	    || opt_lg_cspace_max != LG_CSPACE_MAX_DEFAULT
    +	    || sizeof(const_small_size2bin) != small_maxclass + 1)
    +		return (small_size2bin_init_hard());
     
    -	size2bin = const_size2bin;
    +	small_size2bin = const_small_size2bin;
     #ifdef MALLOC_DEBUG
    -	assert(sizeof(const_size2bin) == bin_maxclass + 1);
    -	size2bin_validate();
    +	assert(sizeof(const_small_size2bin) == small_maxclass + 1);
    +	small_size2bin_validate();
     #endif
     	return (false);
     }
     
     static bool
    -size2bin_init_hard(void)
    +small_size2bin_init_hard(void)
     {
     	size_t i, size, binind;
    -	uint8_t *custom_size2bin;
    +	uint8_t *custom_small_size2bin;
     
    -	assert(opt_qspace_max_2pow != QSPACE_MAX_2POW_DEFAULT
    -	    || opt_cspace_max_2pow != CSPACE_MAX_2POW_DEFAULT);
    +	assert(opt_lg_qspace_max != LG_QSPACE_MAX_DEFAULT
    +	    || opt_lg_cspace_max != LG_CSPACE_MAX_DEFAULT
    +	    || sizeof(const_small_size2bin) != small_maxclass + 1);
     
    -	custom_size2bin = (uint8_t *)base_alloc(bin_maxclass + 1);
    -	if (custom_size2bin == NULL)
    +	custom_small_size2bin = (uint8_t *)base_alloc(small_maxclass + 1);
    +	if (custom_small_size2bin == NULL)
     		return (true);
     
    -	custom_size2bin[0] = 0xffU;
    +	custom_small_size2bin[0] = 0xffU;
     	i = 1;
     #ifdef MALLOC_TINY
     	/* Tiny. */
    -	for (; i < (1U << TINY_MIN_2POW); i++) {
    -		size = pow2_ceil(1U << TINY_MIN_2POW);
    -		binind = ffs((int)(size >> (TINY_MIN_2POW + 1)));
    -		custom_size2bin[i] = binind;
    +	for (; i < (1U << LG_TINY_MIN); i++) {
    +		size = pow2_ceil(1U << LG_TINY_MIN);
    +		binind = ffs((int)(size >> (LG_TINY_MIN + 1)));
    +		custom_small_size2bin[i] = binind;
     	}
     	for (; i < qspace_min; i++) {
     		size = pow2_ceil(i);
    -		binind = ffs((int)(size >> (TINY_MIN_2POW + 1)));
    -		custom_size2bin[i] = binind;
    +		binind = ffs((int)(size >> (LG_TINY_MIN + 1)));
    +		custom_small_size2bin[i] = binind;
     	}
     #endif
     	/* Quantum-spaced. */
     	for (; i <= qspace_max; i++) {
     		size = QUANTUM_CEILING(i);
    -		binind = ntbins + (size >> QUANTUM_2POW) - 1;
    -		custom_size2bin[i] = binind;
    +		binind = ntbins + (size >> LG_QUANTUM) - 1;
    +		custom_small_size2bin[i] = binind;
     	}
     	/* Cacheline-spaced. */
     	for (; i <= cspace_max; i++) {
     		size = CACHELINE_CEILING(i);
     		binind = ntbins + nqbins + ((size - cspace_min) >>
    -		    CACHELINE_2POW);
    -		custom_size2bin[i] = binind;
    +		    LG_CACHELINE);
    +		custom_small_size2bin[i] = binind;
     	}
     	/* Sub-page. */
     	for (; i <= sspace_max; i++) {
     		size = SUBPAGE_CEILING(i);
     		binind = ntbins + nqbins + ncbins + ((size - sspace_min) >>
    -		    SUBPAGE_2POW);
    -		custom_size2bin[i] = binind;
    +		    LG_SUBPAGE);
    +		custom_small_size2bin[i] = binind;
     	}
     
    -	size2bin = custom_size2bin;
    +	small_size2bin = custom_small_size2bin;
     #ifdef MALLOC_DEBUG
    -	size2bin_validate();
    +	small_size2bin_validate();
     #endif
     	return (false);
     }
     
    +static unsigned
    +malloc_ncpus(void)
    +{
    +	unsigned ret;
    +	size_t retlen = sizeof(ret);
    +	int mib[] = {CTL_HW, HW_NCPU};
    +
    +	if (sysctl(mib, sizeof(mib) / sizeof(int), &ret, &retlen,
    +	    (void *)0, 0) == -1) {
    +		/* Error. */
    +		ret = 1;
    +	}
    +
    +	return (ret);
    +}
    +
     /*
      * FreeBSD's pthreads implementation calls malloc(3), so the malloc
      * implementation has to take pains to avoid infinite recursion during
    @@ -4782,18 +5395,7 @@ malloc_init_hard(void)
     	}
     
     	/* Get number of CPUs. */
    -	{
    -		int mib[2];
    -		size_t len;
    -
    -		mib[0] = CTL_HW;
    -		mib[1] = HW_NCPU;
    -		len = sizeof(ncpus);
    -		if (sysctl(mib, 2, &ncpus, &len, (void *) 0, 0) == -1) {
    -			/* Error. */
    -			ncpus = 1;
    -		}
    -	}
    +	ncpus = malloc_ncpus();
     
     	/*
     	 * Increase the chunk size to the largest page size that is greater
    @@ -4806,8 +5408,8 @@ malloc_init_hard(void)
     		nsizes = getpagesizes(pagesizes, MAXPAGESIZES);
     		for (k = 0; k < nsizes; k++)
     			if (pagesizes[k] <= (1LU << 22))
    -				while ((1LU << opt_chunk_2pow) < pagesizes[k])
    -					opt_chunk_2pow++;
    +				while ((1LU << opt_lg_chunk) < pagesizes[k])
    +					opt_lg_chunk++;
     	}
     
     	for (i = 0; i < 3; i++) {
    @@ -4860,6 +5462,8 @@ malloc_init_hard(void)
     		default:
     			/* NOTREACHED */
     			assert(false);
    +			buf[0] = '\0';
    +			opts = buf;
     		}
     
     		for (j = 0; opts[j] != '\0'; j++) {
    @@ -4891,31 +5495,17 @@ MALLOC_OUT:
     				case 'A':
     					opt_abort = true;
     					break;
    -				case 'b':
    -#ifdef MALLOC_BALANCE
    -					opt_balance_threshold >>= 1;
    -#endif
    -					break;
    -				case 'B':
    -#ifdef MALLOC_BALANCE
    -					if (opt_balance_threshold == 0)
    -						opt_balance_threshold = 1;
    -					else if ((opt_balance_threshold << 1)
    -					    > opt_balance_threshold)
    -						opt_balance_threshold <<= 1;
    -#endif
    -					break;
     				case 'c':
    -					if (opt_cspace_max_2pow - 1 >
    -					    opt_qspace_max_2pow &&
    -					    opt_cspace_max_2pow >
    -					    CACHELINE_2POW)
    -						opt_cspace_max_2pow--;
    +					if (opt_lg_cspace_max - 1 >
    +					    opt_lg_qspace_max &&
    +					    opt_lg_cspace_max >
    +					    LG_CACHELINE)
    +						opt_lg_cspace_max--;
     					break;
     				case 'C':
    -					if (opt_cspace_max_2pow < PAGE_SHIFT
    +					if (opt_lg_cspace_max < PAGE_SHIFT
     					    - 1)
    -						opt_cspace_max_2pow++;
    +						opt_lg_cspace_max++;
     					break;
     				case 'd':
     #ifdef MALLOC_DSS
    @@ -4927,21 +5517,42 @@ MALLOC_OUT:
     					opt_dss = true;
     #endif
     					break;
    +				case 'e':
    +					if (opt_lg_medium_max > PAGE_SHIFT)
    +						opt_lg_medium_max--;
    +					break;
    +				case 'E':
    +					if (opt_lg_medium_max + 1 <
    +					    opt_lg_chunk)
    +						opt_lg_medium_max++;
    +					break;
     				case 'f':
    -					opt_dirty_max >>= 1;
    +					if (opt_lg_dirty_mult + 1 <
    +					    (sizeof(size_t) << 3))
    +						opt_lg_dirty_mult++;
     					break;
     				case 'F':
    -					if (opt_dirty_max == 0)
    -						opt_dirty_max = 1;
    -					else if ((opt_dirty_max << 1) != 0)
    -						opt_dirty_max <<= 1;
    +					if (opt_lg_dirty_mult >= 0)
    +						opt_lg_dirty_mult--;
     					break;
    -#ifdef MALLOC_MAG
    +#ifdef MALLOC_TCACHE
     				case 'g':
    -					opt_mag = false;
    +					if (opt_lg_tcache_gc_sweep >= 0)
    +						opt_lg_tcache_gc_sweep--;
     					break;
     				case 'G':
    -					opt_mag = true;
    +					if (opt_lg_tcache_gc_sweep + 1 <
    +					    (sizeof(size_t) << 3))
    +						opt_lg_tcache_gc_sweep++;
    +					break;
    +				case 'h':
    +					if (opt_lg_tcache_nslots > 0)
    +						opt_lg_tcache_nslots--;
    +					break;
    +				case 'H':
    +					if (opt_lg_tcache_nslots + 1 <
    +					    (sizeof(size_t) << 3))
    +						opt_lg_tcache_nslots++;
     					break;
     #endif
     				case 'j':
    @@ -4953,16 +5564,20 @@ MALLOC_OUT:
     				case 'k':
     					/*
     					 * Chunks always require at least one
    -					 * header page, so chunks can never be
    -					 * smaller than two pages.
    +					 * header page, plus enough room to
    +					 * hold a run for the largest medium
    +					 * size class (one page more than the
    +					 * size).
     					 */
    -					if (opt_chunk_2pow > PAGE_SHIFT + 1)
    -						opt_chunk_2pow--;
    +					if ((1U << (opt_lg_chunk - 1)) >=
    +					    (2U << PAGE_SHIFT) + (1U <<
    +					    opt_lg_medium_max))
    +						opt_lg_chunk--;
     					break;
     				case 'K':
    -					if (opt_chunk_2pow + 1 <
    +					if (opt_lg_chunk + 1 <
     					    (sizeof(size_t) << 3))
    -						opt_chunk_2pow++;
    +						opt_lg_chunk++;
     					break;
     				case 'm':
     #ifdef MALLOC_DSS
    @@ -4981,36 +5596,20 @@ MALLOC_OUT:
     					opt_narenas_lshift++;
     					break;
     				case 'p':
    -					opt_print_stats = false;
    +					opt_stats_print = false;
     					break;
     				case 'P':
    -					opt_print_stats = true;
    +					opt_stats_print = true;
     					break;
     				case 'q':
    -					if (opt_qspace_max_2pow > QUANTUM_2POW)
    -						opt_qspace_max_2pow--;
    +					if (opt_lg_qspace_max > LG_QUANTUM)
    +						opt_lg_qspace_max--;
     					break;
     				case 'Q':
    -					if (opt_qspace_max_2pow + 1 <
    -					    opt_cspace_max_2pow)
    -						opt_qspace_max_2pow++;
    +					if (opt_lg_qspace_max + 1 <
    +					    opt_lg_cspace_max)
    +						opt_lg_qspace_max++;
     					break;
    -#ifdef MALLOC_MAG
    -				case 'R':
    -					if (opt_mag_size_2pow + 1 < (8U <<
    -					    SIZEOF_PTR_2POW))
    -						opt_mag_size_2pow++;
    -					break;
    -				case 'r':
    -					/*
    -					 * Make sure there's always at least
    -					 * one round per magazine.
    -					 */
    -					if ((1U << (opt_mag_size_2pow-1)) >=
    -					    sizeof(mag_t))
    -						opt_mag_size_2pow--;
    -					break;
    -#endif
     				case 'u':
     					opt_utrace = false;
     					break;
    @@ -5055,50 +5654,87 @@ MALLOC_OUT:
     	if (opt_dss == false && opt_mmap == false)
     		opt_mmap = true;
     #endif
    -
    -	/* Take care to call atexit() only once. */
    -	if (opt_print_stats) {
    +	if (opt_stats_print) {
     		/* Print statistics at exit. */
    -		atexit(malloc_print_stats);
    +		atexit(stats_print_atexit);
     	}
     
    -#ifdef MALLOC_MAG
    -	/*
    -	 * Calculate the actual number of rounds per magazine, taking into
    -	 * account header overhead.
    -	 */
    -	max_rounds = (1LLU << (opt_mag_size_2pow - SIZEOF_PTR_2POW)) -
    -	    (sizeof(mag_t) >> SIZEOF_PTR_2POW) + 1;
    -#endif
     
    -	/* Set variables according to the value of opt_[qc]space_max_2pow. */
    -	qspace_max = (1U << opt_qspace_max_2pow);
    +	/* Set variables according to the value of opt_lg_[qc]space_max. */
    +	qspace_max = (1U << opt_lg_qspace_max);
     	cspace_min = CACHELINE_CEILING(qspace_max);
     	if (cspace_min == qspace_max)
     		cspace_min += CACHELINE;
    -	cspace_max = (1U << opt_cspace_max_2pow);
    +	cspace_max = (1U << opt_lg_cspace_max);
     	sspace_min = SUBPAGE_CEILING(cspace_max);
     	if (sspace_min == cspace_max)
     		sspace_min += SUBPAGE;
     	assert(sspace_min < PAGE_SIZE);
     	sspace_max = PAGE_SIZE - SUBPAGE;
    +	medium_max = (1U << opt_lg_medium_max);
     
     #ifdef MALLOC_TINY
    -	assert(QUANTUM_2POW >= TINY_MIN_2POW);
    +	assert(LG_QUANTUM >= LG_TINY_MIN);
     #endif
    -	assert(ntbins <= QUANTUM_2POW);
    -	nqbins = qspace_max >> QUANTUM_2POW;
    -	ncbins = ((cspace_max - cspace_min) >> CACHELINE_2POW) + 1;
    -	nsbins = ((sspace_max - sspace_min) >> SUBPAGE_2POW) + 1;
    -	nbins = ntbins + nqbins + ncbins + nsbins;
    +	assert(ntbins <= LG_QUANTUM);
    +	nqbins = qspace_max >> LG_QUANTUM;
    +	ncbins = ((cspace_max - cspace_min) >> LG_CACHELINE) + 1;
    +	nsbins = ((sspace_max - sspace_min) >> LG_SUBPAGE) + 1;
     
    -	if (size2bin_init()) {
    +	/*
    +	 * Compute medium size class spacing and the number of medium size
    +	 * classes.  Limit spacing to no more than pagesize, but if possible
    +	 * use the smallest spacing that does not exceed NMBINS_MAX medium size
    +	 * classes.
    +	 */
    +	lg_mspace = LG_SUBPAGE;
    +	nmbins = ((medium_max - medium_min) >> lg_mspace) + 1;
    +	while (lg_mspace < PAGE_SHIFT && nmbins > NMBINS_MAX) {
    +		lg_mspace = lg_mspace + 1;
    +		nmbins = ((medium_max - medium_min) >> lg_mspace) + 1;
    +	}
    +	mspace_mask = (1U << lg_mspace) - 1U;
    +
    +	mbin0 = ntbins + nqbins + ncbins + nsbins;
    +	nbins = mbin0 + nmbins;
    +	/*
    +	 * The small_size2bin lookup table uses uint8_t to encode each bin
    +	 * index, so we cannot support more than 256 small size classes.  This
    +	 * limit is difficult to exceed (not even possible with 16B quantum and
    +	 * 4KiB pages), and such configurations are impractical, but
    +	 * nonetheless we need to protect against this case in order to avoid
    +	 * undefined behavior.
    +	 */
    +	if (mbin0 > 256) {
    +	    char line_buf[UMAX2S_BUFSIZE];
    +	    _malloc_message(_getprogname(),
    +	        ": (malloc) Too many small size classes (",
    +	        umax2s(mbin0, 10, line_buf), " > max 256)\n");
    +	    abort();
    +	}
    +
    +	if (small_size2bin_init()) {
     		malloc_mutex_unlock(&init_lock);
     		return (true);
     	}
     
    -	/* Set variables according to the value of opt_chunk_2pow. */
    -	chunksize = (1LU << opt_chunk_2pow);
    +#ifdef MALLOC_TCACHE
    +	if (opt_lg_tcache_nslots > 0) {
    +		tcache_nslots = (1U << opt_lg_tcache_nslots);
    +
    +		/* Compute incremental GC event threshold. */
    +		if (opt_lg_tcache_gc_sweep >= 0) {
    +			tcache_gc_incr = ((1U << opt_lg_tcache_gc_sweep) /
    +			    nbins) + (((1U << opt_lg_tcache_gc_sweep) % nbins ==
    +			    0) ? 0 : 1);
    +		} else
    +			tcache_gc_incr = 0;
    +	} else
    +		tcache_nslots = 0;
    +#endif
    +
    +	/* Set variables according to the value of opt_lg_chunk. */
    +	chunksize = (1LU << opt_lg_chunk);
     	chunksize_mask = chunksize - 1;
     	chunk_npages = (chunksize >> PAGE_SHIFT);
     	{
    @@ -5116,9 +5752,10 @@ MALLOC_OUT:
     	arena_maxclass = chunksize - (arena_chunk_header_npages <<
     	    PAGE_SHIFT);
     
    -	UTRACE(0, 0, 0);
    +	UTRACE((void *)(intptr_t)(-1), 0, 0);
     
     #ifdef MALLOC_STATS
    +	malloc_mutex_init(&chunks_mtx);
     	memset(&stats_chunks, 0, sizeof(chunk_stats_t));
     #endif
     
    @@ -5160,10 +5797,27 @@ MALLOC_OUT:
     
     	if (ncpus > 1) {
     		/*
    -		 * For SMP systems, create twice as many arenas as there are
    -		 * CPUs by default.
    +		 * For SMP systems, create more than one arena per CPU by
    +		 * default.
     		 */
    -		opt_narenas_lshift++;
    +#ifdef MALLOC_TCACHE
    +		if (tcache_nslots) {
    +			/*
    +			 * Only large object allocation/deallocation is
    +			 * guaranteed to acquire an arena mutex, so we can get
    +			 * away with fewer arenas than without thread caching.
    +			 */
    +			opt_narenas_lshift += 1;
    +		} else {
    +#endif
    +			/*
    +			 * All allocations must acquire an arena mutex, so use
    +			 * plenty of arenas.
    +			 */
    +			opt_narenas_lshift += 2;
    +#ifdef MALLOC_TCACHE
    +		}
    +#endif
     	}
     
     	/* Determine how many arenas to use. */
    @@ -5184,12 +5838,6 @@ MALLOC_OUT:
     		if (narenas == 0)
     			narenas = 1;
     	}
    -#ifdef MALLOC_BALANCE
    -	assert(narenas != 0);
    -	for (narenas_2pow = 0;
    -	     (narenas >> (narenas_2pow + 1)) != 0;
    -	     narenas_2pow++);
    -#endif
     
     #ifdef NO_TLS
     	if (narenas > 1) {
    @@ -5206,7 +5854,7 @@ MALLOC_OUT:
     		 * spread allocations evenly among the arenas.
     		 */
     		assert((narenas & 1) == 0); /* narenas must be even. */
    -		nprimes = (sizeof(primes) >> SIZEOF_INT_2POW);
    +		nprimes = (sizeof(primes) >> LG_SIZEOF_INT);
     		parenas = primes[nprimes - 1]; /* In case not enough primes. */
     		for (i = 1; i < nprimes; i++) {
     			if (primes[i] > narenas) {
    @@ -5219,9 +5867,7 @@ MALLOC_OUT:
     #endif
     
     #ifndef NO_TLS
    -#  ifndef MALLOC_BALANCE
     	next_arena = 0;
    -#  endif
     #endif
     
     	/* Allocate and initialize arenas. */
    @@ -5253,14 +5899,6 @@ MALLOC_OUT:
     	 */
     	arenas_map = arenas[0];
     #endif
    -	/*
    -	 * Seed here for the initial thread, since choose_arena_hard() is only
    -	 * called for other threads.  The seed value doesn't really matter.
    -	 */
    -#ifdef MALLOC_BALANCE
    -	SPRN(balance, 42);
    -#endif
    -
     	malloc_spin_init(&arenas_lock);
     
     	malloc_initialized = true;
    @@ -5283,13 +5921,19 @@ malloc(size_t size)
     
     	if (malloc_init()) {
     		ret = NULL;
    -		goto RETURN;
    +		goto OOM;
     	}
     
     	if (size == 0) {
     		if (opt_sysv == false)
     			size = 1;
     		else {
    +			if (opt_xmalloc) {
    +				_malloc_message(_getprogname(),
    +				    ": (malloc) Error in malloc(): "
    +				    "invalid size 0\n", "", "");
    +				abort();
    +			}
     			ret = NULL;
     			goto RETURN;
     		}
    @@ -5297,7 +5941,7 @@ malloc(size_t size)
     
     	ret = imalloc(size);
     
    -RETURN:
    +OOM:
     	if (ret == NULL) {
     		if (opt_xmalloc) {
     			_malloc_message(_getprogname(),
    @@ -5308,6 +5952,7 @@ RETURN:
     		errno = ENOMEM;
     	}
     
    +RETURN:
     	UTRACE(0, size, ret);
     	return (ret);
     }
    @@ -5321,6 +5966,24 @@ posix_memalign(void **memptr, size_t alignment, size_t size)
     	if (malloc_init())
     		result = NULL;
     	else {
    +		if (size == 0) {
    +			if (opt_sysv == false)
    +				size = 1;
    +			else {
    +				if (opt_xmalloc) {
    +					_malloc_message(_getprogname(),
    +					    ": (malloc) Error in "
    +					    "posix_memalign(): invalid "
    +					    "size 0\n", "", "");
    +					abort();
    +				}
    +				result = NULL;
    +				*memptr = NULL;
    +				ret = 0;
    +				goto RETURN;
    +			}
    +		}
    +
     		/* Make sure that alignment is a large enough power of 2. */
     		if (((alignment - 1) & alignment) != 0
     		    || alignment < sizeof(void *)) {
    @@ -5335,15 +5998,6 @@ posix_memalign(void **memptr, size_t alignment, size_t size)
     			goto RETURN;
     		}
     
    -		if (size == 0) {
    -			if (opt_sysv == false)
    -				size = 1;
    -			else {
    -				result = NULL;
    -				ret = 0;
    -				goto RETURN;
    -			}
    -		}
     		result = ipalloc(alignment, size);
     	}
     
    @@ -5504,11 +6158,6 @@ malloc_usable_size(const void *ptr)
      * Begin library-private functions.
      */
     
    -/******************************************************************************/
    -/*
    - * Begin thread cache.
    - */
    -
     /*
      * We provide an unpublished interface in order to receive notifications from
      * the pthreads library whenever a thread exits.  This allows us to clean up
    @@ -5518,13 +6167,13 @@ void
     _malloc_thread_cleanup(void)
     {
     
    -#ifdef MALLOC_MAG
    -	if (mag_rack != NULL) {
    -		assert(mag_rack != (void *)-1);
    -		mag_rack_destroy(mag_rack);
    -#ifdef MALLOC_DEBUG
    -		mag_rack = (void *)-1;
    -#endif
    +#ifdef MALLOC_TCACHE
    +	tcache_t *tcache = tcache_tls;
    +
    +	if (tcache != NULL) {
    +		assert(tcache != (void *)(uintptr_t)1);
    +		tcache_destroy(tcache);
    +		tcache_tls = (void *)(uintptr_t)1;
     	}
     #endif
     }
    @@ -5539,41 +6188,14 @@ _malloc_thread_cleanup(void)
     void
     _malloc_prefork(void)
     {
    -	bool again;
    -	unsigned i, j;
    -	arena_t *larenas[narenas], *tarenas[narenas];
    +	unsigned i;
     
     	/* Acquire all mutexes in a safe order. */
    -
    -	/*
    -	 * arenas_lock must be acquired after all of the arena mutexes, in
    -	 * order to avoid potential deadlock with arena_lock_balance[_hard]().
    -	 * Since arenas_lock protects the arenas array, the following code has
    -	 * to race with arenas_extend() callers until it succeeds in locking
    -	 * all arenas before locking arenas_lock.
    -	 */
    -	memset(larenas, 0, sizeof(arena_t *) * narenas);
    -	do {
    -		again = false;
    -
    -		malloc_spin_lock(&arenas_lock);
    -		for (i = 0; i < narenas; i++) {
    -			if (arenas[i] != larenas[i]) {
    -				memcpy(tarenas, arenas, sizeof(arena_t *) *
    -				    narenas);
    -				malloc_spin_unlock(&arenas_lock);
    -				for (j = 0; j < narenas; j++) {
    -					if (larenas[j] != tarenas[j]) {
    -						larenas[j] = tarenas[j];
    -						malloc_spin_lock(
    -						    &larenas[j]->lock);
    -					}
    -				}
    -				again = true;
    -				break;
    -			}
    -		}
    -	} while (again);
    +	malloc_spin_lock(&arenas_lock);
    +	for (i = 0; i < narenas; i++) {
    +		if (arenas[i] != NULL)
    +			malloc_spin_lock(&arenas[i]->lock);
    +	}
     
     	malloc_mutex_lock(&base_mtx);
     
    @@ -5588,7 +6210,6 @@ void
     _malloc_postfork(void)
     {
     	unsigned i;
    -	arena_t *larenas[narenas];
     
     	/* Release all mutexes, now that fork() has completed. */
     
    @@ -5600,12 +6221,11 @@ _malloc_postfork(void)
     
     	malloc_mutex_unlock(&base_mtx);
     
    -	memcpy(larenas, arenas, sizeof(arena_t *) * narenas);
    -	malloc_spin_unlock(&arenas_lock);
     	for (i = 0; i < narenas; i++) {
    -		if (larenas[i] != NULL)
    -			malloc_spin_unlock(&larenas[i]->lock);
    +		if (arenas[i] != NULL)
    +			malloc_spin_unlock(&arenas[i]->lock);
     	}
    +	malloc_spin_unlock(&arenas_lock);
     }
     
     /*
    diff --git a/lib/libc/stdlib/ql.h b/lib/libc/stdlib/ql.h
    new file mode 100644
    index 000000000000..a1bc3abc238f
    --- /dev/null
    +++ b/lib/libc/stdlib/ql.h
    @@ -0,0 +1,122 @@
    +/******************************************************************************
    + *
    + * Copyright (C) 2002 Jason Evans .
    + * 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(s), this list of conditions and the following disclaimer
    + *    unmodified other than the allowable addition of one or more
    + *    copyright notices.
    + * 2. Redistributions in binary form must reproduce the above copyright
    + *    notice(s), 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 COPYRIGHT HOLDER(S) ``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 COPYRIGHT HOLDER(S) 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 QL_H_
    +#define	QL_H_
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +/*
    + * List definitions.
    + */
    +#define ql_head(a_type)							\
    +struct {								\
    +	a_type *qlh_first;						\
    +}
    +
    +#define ql_head_initializer(a_head) {NULL}
    +
    +#define ql_elm(a_type)	qr(a_type)
    +
    +/* List functions. */
    +#define ql_new(a_head) do {						\
    +	(a_head)->qlh_first = NULL;					\
    +} while (0)
    +
    +#define ql_elm_new(a_elm, a_field) qr_new((a_elm), a_field)
    +
    +#define ql_first(a_head) ((a_head)->qlh_first)
    +
    +#define ql_last(a_head, a_field)					\
    +	((ql_first(a_head) != NULL)					\
    +	    ? qr_prev(ql_first(a_head), a_field) : NULL)
    +
    +#define ql_next(a_head, a_elm, a_field)					\
    +	((ql_last(a_head, a_field) != (a_elm))				\
    +	    ? qr_next((a_elm), a_field)	: NULL)
    +
    +#define ql_prev(a_head, a_elm, a_field)					\
    +	((ql_first(a_head) != (a_elm)) ? qr_prev((a_elm), a_field)	\
    +				       : NULL)
    +
    +#define ql_before_insert(a_head, a_qlelm, a_elm, a_field) do {		\
    +	qr_before_insert((a_qlelm), (a_elm), a_field);			\
    +	if (ql_first(a_head) == (a_qlelm)) {				\
    +		ql_first(a_head) = (a_elm);				\
    +	}								\
    +} while (0)
    +
    +#define ql_after_insert(a_qlelm, a_elm, a_field)			\
    +	qr_after_insert((a_qlelm), (a_elm), a_field)
    +
    +#define ql_head_insert(a_head, a_elm, a_field) do {			\
    +	if (ql_first(a_head) != NULL) {					\
    +		qr_before_insert(ql_first(a_head), (a_elm), a_field);	\
    +	}								\
    +	ql_first(a_head) = (a_elm);					\
    +} while (0)
    +
    +#define ql_tail_insert(a_head, a_elm, a_field) do {			\
    +	if (ql_first(a_head) != NULL) {					\
    +		qr_before_insert(ql_first(a_head), (a_elm), a_field);	\
    +	}								\
    +	ql_first(a_head) = qr_next((a_elm), a_field);			\
    +} while (0)
    +
    +#define ql_remove(a_head, a_elm, a_field) do {				\
    +	if (ql_first(a_head) == (a_elm)) {				\
    +		ql_first(a_head) = qr_next(ql_first(a_head), a_field);	\
    +	}								\
    +	if (ql_first(a_head) != (a_elm)) {				\
    +		qr_remove((a_elm), a_field);				\
    +	} else {							\
    +		ql_first(a_head) = NULL;				\
    +	}								\
    +} while (0)
    +
    +#define ql_head_remove(a_head, a_type, a_field) do {			\
    +	a_type *t = ql_first(a_head);					\
    +	ql_remove((a_head), t, a_field);				\
    +} while (0)
    +
    +#define ql_tail_remove(a_head, a_type, a_field) do {			\
    +	a_type *t = ql_last(a_head, a_field);				\
    +	ql_remove((a_head), t, a_field);				\
    +} while (0)
    +
    +#define ql_foreach(a_var, a_head, a_field)				\
    +	qr_foreach((a_var), ql_first(a_head), a_field)
    +
    +#define ql_reverse_foreach(a_var, a_head, a_field)			\
    +	qr_reverse_foreach((a_var), ql_first(a_head), a_field)
    +
    +#endif /* QL_H_ */
    diff --git a/lib/libc/stdlib/qr.h b/lib/libc/stdlib/qr.h
    new file mode 100644
    index 000000000000..6e02321be55c
    --- /dev/null
    +++ b/lib/libc/stdlib/qr.h
    @@ -0,0 +1,106 @@
    +/******************************************************************************
    + *
    + * Copyright (C) 2002 Jason Evans .
    + * 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(s), this list of conditions and the following disclaimer
    + *    unmodified other than the allowable addition of one or more
    + *    copyright notices.
    + * 2. Redistributions in binary form must reproduce the above copyright
    + *    notice(s), 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 COPYRIGHT HOLDER(S) ``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 COPYRIGHT HOLDER(S) 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 QR_H_
    +#define	QR_H_
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +/* Ring definitions. */
    +#define qr(a_type)							\
    +struct {								\
    +	a_type	*qre_next;						\
    +	a_type	*qre_prev;						\
    +}
    +
    +/* Ring functions. */
    +#define qr_new(a_qr, a_field) do {					\
    +	(a_qr)->a_field.qre_next = (a_qr);				\
    +	(a_qr)->a_field.qre_prev = (a_qr);				\
    +} while (0)
    +
    +#define qr_next(a_qr, a_field) ((a_qr)->a_field.qre_next)
    +
    +#define qr_prev(a_qr, a_field) ((a_qr)->a_field.qre_prev)
    +
    +#define qr_before_insert(a_qrelm, a_qr, a_field) do {			\
    +	(a_qr)->a_field.qre_prev = (a_qrelm)->a_field.qre_prev;		\
    +	(a_qr)->a_field.qre_next = (a_qrelm);				\
    +	(a_qr)->a_field.qre_prev->a_field.qre_next = (a_qr);		\
    +	(a_qrelm)->a_field.qre_prev = (a_qr);				\
    +} while (0)
    +
    +#define qr_after_insert(a_qrelm, a_qr, a_field)				\
    +    do									\
    +    {									\
    +	(a_qr)->a_field.qre_next = (a_qrelm)->a_field.qre_next;		\
    +	(a_qr)->a_field.qre_prev = (a_qrelm);				\
    +	(a_qr)->a_field.qre_next->a_field.qre_prev = (a_qr);		\
    +	(a_qrelm)->a_field.qre_next = (a_qr);				\
    +    } while (0)
    +
    +#define qr_meld(a_qr_a, a_qr_b, a_field) do {				\
    +	void *t;							\
    +	(a_qr_a)->a_field.qre_prev->a_field.qre_next = (a_qr_b);	\
    +	(a_qr_b)->a_field.qre_prev->a_field.qre_next = (a_qr_a);	\
    +	t = (a_qr_a)->a_field.qre_prev;					\
    +	(a_qr_a)->a_field.qre_prev = (a_qr_b)->a_field.qre_prev;	\
    +	(a_qr_b)->a_field.qre_prev = t;					\
    +} while (0)
    +
    +/* qr_meld() and qr_split() are functionally equivalent, so there's no need to
    + * have two copies of the code. */
    +#define qr_split(a_qr_a, a_qr_b, a_field)				\
    +	qr_meld((a_qr_a), (a_qr_b), a_field)
    +
    +#define qr_remove(a_qr, a_field) do {					\
    +	(a_qr)->a_field.qre_prev->a_field.qre_next			\
    +	    = (a_qr)->a_field.qre_next;					\
    +	(a_qr)->a_field.qre_next->a_field.qre_prev			\
    +	    = (a_qr)->a_field.qre_prev;					\
    +	(a_qr)->a_field.qre_next = (a_qr);				\
    +	(a_qr)->a_field.qre_prev = (a_qr);				\
    +} while (0)
    +
    +#define qr_foreach(var, a_qr, a_field)					\
    +	for ((var) = (a_qr);						\
    +	    (var) != NULL;						\
    +	    (var) = (((var)->a_field.qre_next != (a_qr))		\
    +	    ? (var)->a_field.qre_next : NULL))
    +
    +#define qr_reverse_foreach(var, a_qr, a_field)				\
    +	for ((var) = ((a_qr) != NULL) ? qr_prev(a_qr, a_field) : NULL;	\
    +	    (var) != NULL;						\
    +	    (var) = (((var) != (a_qr))					\
    +	    ? (var)->a_field.qre_prev : NULL))
    +
    +#endif /* QR_H_ */
    diff --git a/lib/libc/stdlib/rb.h b/lib/libc/stdlib/rb.h
    index 80875b02ae86..baaec7f29c77 100644
    --- a/lib/libc/stdlib/rb.h
    +++ b/lib/libc/stdlib/rb.h
    @@ -1,6 +1,7 @@
    -/******************************************************************************
    +/*-
    + *******************************************************************************
      *
    - * Copyright (C) 2008 Jason Evans .
    + * Copyright (C) 2008-2010 Jason Evans .
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
    @@ -29,40 +30,23 @@
      *
      ******************************************************************************
      *
    - * cpp macro implementation of left-leaning red-black trees.
    + * cpp macro implementation of left-leaning 2-3 red-black trees.  Parent
    + * pointers are not used, and color bits are stored in the least significant
    + * bit of right-child pointers (if RB_COMPACT is defined), thus making node
    + * linkage as compact as is possible for red-black trees.
      *
      * Usage:
      *
    - *   (Optional, see assert(3).)
    - *   #define NDEBUG
    - *
    - *   (Required.)
    + *   #include 
    + *   #include 
    + *   #define NDEBUG // (Optional, see assert(3).)
      *   #include 
    + *   #define RB_COMPACT // (Optional, embed color bits in right-child pointers.)
      *   #include 
      *   ...
      *
    - * All operations are done non-recursively.  Parent pointers are not used, and
    - * color bits are stored in the least significant bit of right-child pointers,
    - * thus making node linkage as compact as is possible for red-black trees.
    - *
    - * Some macros use a comparison function pointer, which is expected to have the
    - * following prototype:
    - *
    - *   int (a_cmp *)(a_type *a_node, a_type *a_other);
    - *                         ^^^^^^
    - *                      or a_key
    - *
    - * Interpretation of comparision function return values:
    - *
    - *   -1 : a_node <  a_other
    - *    0 : a_node == a_other
    - *    1 : a_node >  a_other
    - *
    - * In all cases, the a_node or a_key macro argument is the first argument to the
    - * comparison function, which makes it possible to write comparison functions
    - * that treat the first argument specially.
    - *
    - ******************************************************************************/
    + *******************************************************************************
    + */
     
     #ifndef RB_H_
     #define	RB_H_
    @@ -70,12 +54,21 @@
     #include 
     __FBSDID("$FreeBSD$");
     
    +#ifdef RB_COMPACT
     /* Node structure. */
     #define	rb_node(a_type)							\
     struct {								\
         a_type *rbn_left;							\
         a_type *rbn_right_red;						\
     }
    +#else
    +#define	rb_node(a_type)							\
    +struct {								\
    +    a_type *rbn_left;							\
    +    a_type *rbn_right;							\
    +    bool rbn_red;							\
    +}
    +#endif
     
     /* Root structure. */
     #define	rb_tree(a_type)							\
    @@ -85,863 +78,925 @@ struct {								\
     }
     
     /* Left accessors. */
    -#define	rbp_left_get(a_type, a_field, a_node)				\
    +#define	rbtn_left_get(a_type, a_field, a_node)				\
         ((a_node)->a_field.rbn_left)
    -#define	rbp_left_set(a_type, a_field, a_node, a_left) do {		\
    +#define	rbtn_left_set(a_type, a_field, a_node, a_left) do {		\
         (a_node)->a_field.rbn_left = a_left;				\
     } while (0)
     
    +#ifdef RB_COMPACT
     /* Right accessors. */
    -#define	rbp_right_get(a_type, a_field, a_node)				\
    +#define	rbtn_right_get(a_type, a_field, a_node)				\
         ((a_type *) (((intptr_t) (a_node)->a_field.rbn_right_red)		\
           & ((ssize_t)-2)))
    -#define	rbp_right_set(a_type, a_field, a_node, a_right) do {		\
    +#define	rbtn_right_set(a_type, a_field, a_node, a_right) do {		\
         (a_node)->a_field.rbn_right_red = (a_type *) (((uintptr_t) a_right)	\
           | (((uintptr_t) (a_node)->a_field.rbn_right_red) & ((size_t)1)));	\
     } while (0)
     
     /* Color accessors. */
    -#define	rbp_red_get(a_type, a_field, a_node)				\
    +#define	rbtn_red_get(a_type, a_field, a_node)				\
         ((bool) (((uintptr_t) (a_node)->a_field.rbn_right_red)		\
           & ((size_t)1)))
    -#define	rbp_color_set(a_type, a_field, a_node, a_red) do {		\
    +#define	rbtn_color_set(a_type, a_field, a_node, a_red) do {		\
         (a_node)->a_field.rbn_right_red = (a_type *) ((((intptr_t)		\
           (a_node)->a_field.rbn_right_red) & ((ssize_t)-2))			\
           | ((ssize_t)a_red));						\
     } while (0)
    -#define	rbp_red_set(a_type, a_field, a_node) do {			\
    +#define	rbtn_red_set(a_type, a_field, a_node) do {			\
         (a_node)->a_field.rbn_right_red = (a_type *) (((uintptr_t)		\
           (a_node)->a_field.rbn_right_red) | ((size_t)1));			\
     } while (0)
    -#define	rbp_black_set(a_type, a_field, a_node) do {			\
    +#define	rbtn_black_set(a_type, a_field, a_node) do {			\
         (a_node)->a_field.rbn_right_red = (a_type *) (((intptr_t)		\
           (a_node)->a_field.rbn_right_red) & ((ssize_t)-2));		\
     } while (0)
    +#else
    +/* Right accessors. */
    +#define	rbtn_right_get(a_type, a_field, a_node)				\
    +    ((a_node)->a_field.rbn_right)
    +#define	rbtn_right_set(a_type, a_field, a_node, a_right) do {		\
    +    (a_node)->a_field.rbn_right = a_right;				\
    +} while (0)
    +
    +/* Color accessors. */
    +#define	rbtn_red_get(a_type, a_field, a_node)				\
    +    ((a_node)->a_field.rbn_red)
    +#define	rbtn_color_set(a_type, a_field, a_node, a_red) do {		\
    +    (a_node)->a_field.rbn_red = (a_red);				\
    +} while (0)
    +#define	rbtn_red_set(a_type, a_field, a_node) do {			\
    +    (a_node)->a_field.rbn_red = true;					\
    +} while (0)
    +#define	rbtn_black_set(a_type, a_field, a_node) do {			\
    +    (a_node)->a_field.rbn_red = false;					\
    +} while (0)
    +#endif
     
     /* Node initializer. */
    -#define	rbp_node_new(a_type, a_field, a_tree, a_node) do {		\
    -    rbp_left_set(a_type, a_field, (a_node), &(a_tree)->rbt_nil);	\
    -    rbp_right_set(a_type, a_field, (a_node), &(a_tree)->rbt_nil);	\
    -    rbp_red_set(a_type, a_field, (a_node));				\
    +#define	rbt_node_new(a_type, a_field, a_rbt, a_node) do {		\
    +    rbtn_left_set(a_type, a_field, (a_node), &(a_rbt)->rbt_nil);	\
    +    rbtn_right_set(a_type, a_field, (a_node), &(a_rbt)->rbt_nil);	\
    +    rbtn_red_set(a_type, a_field, (a_node));				\
     } while (0)
     
     /* Tree initializer. */
    -#define	rb_new(a_type, a_field, a_tree) do {				\
    -    (a_tree)->rbt_root = &(a_tree)->rbt_nil;				\
    -    rbp_node_new(a_type, a_field, a_tree, &(a_tree)->rbt_nil);		\
    -    rbp_black_set(a_type, a_field, &(a_tree)->rbt_nil);			\
    +#define	rb_new(a_type, a_field, a_rbt) do {				\
    +    (a_rbt)->rbt_root = &(a_rbt)->rbt_nil;				\
    +    rbt_node_new(a_type, a_field, a_rbt, &(a_rbt)->rbt_nil);		\
    +    rbtn_black_set(a_type, a_field, &(a_rbt)->rbt_nil);			\
     } while (0)
     
    -/* Tree operations. */
    -#define	rbp_black_height(a_type, a_field, a_tree, r_height) do {	\
    -    a_type *rbp_bh_t;							\
    -    for (rbp_bh_t = (a_tree)->rbt_root, (r_height) = 0;			\
    -      rbp_bh_t != &(a_tree)->rbt_nil;					\
    -      rbp_bh_t = rbp_left_get(a_type, a_field, rbp_bh_t)) {		\
    -	if (rbp_red_get(a_type, a_field, rbp_bh_t) == false) {		\
    -	    (r_height)++;						\
    +/* Internal utility macros. */
    +#define	rbtn_first(a_type, a_field, a_rbt, a_root, r_node) do {		\
    +    (r_node) = (a_root);						\
    +    if ((r_node) != &(a_rbt)->rbt_nil) {				\
    +	for (;								\
    +	  rbtn_left_get(a_type, a_field, (r_node)) != &(a_rbt)->rbt_nil;\
    +	  (r_node) = rbtn_left_get(a_type, a_field, (r_node))) {	\
     	}								\
         }									\
     } while (0)
     
    -#define	rbp_first(a_type, a_field, a_tree, a_root, r_node) do {		\
    -    for ((r_node) = (a_root);						\
    -      rbp_left_get(a_type, a_field, (r_node)) != &(a_tree)->rbt_nil;	\
    -      (r_node) = rbp_left_get(a_type, a_field, (r_node))) {		\
    -    }									\
    -} while (0)
    -
    -#define	rbp_last(a_type, a_field, a_tree, a_root, r_node) do {		\
    -    for ((r_node) = (a_root);						\
    -      rbp_right_get(a_type, a_field, (r_node)) != &(a_tree)->rbt_nil;	\
    -      (r_node) = rbp_right_get(a_type, a_field, (r_node))) {		\
    -    }									\
    -} while (0)
    -
    -#define	rbp_next(a_type, a_field, a_cmp, a_tree, a_node, r_node) do {	\
    -    if (rbp_right_get(a_type, a_field, (a_node))			\
    -      != &(a_tree)->rbt_nil) {						\
    -	rbp_first(a_type, a_field, a_tree, rbp_right_get(a_type,	\
    -	  a_field, (a_node)), (r_node));				\
    -    } else {								\
    -	a_type *rbp_n_t = (a_tree)->rbt_root;				\
    -	assert(rbp_n_t != &(a_tree)->rbt_nil);				\
    -	(r_node) = &(a_tree)->rbt_nil;					\
    -	while (true) {							\
    -	    int rbp_n_cmp = (a_cmp)((a_node), rbp_n_t);			\
    -	    if (rbp_n_cmp < 0) {					\
    -		(r_node) = rbp_n_t;					\
    -		rbp_n_t = rbp_left_get(a_type, a_field, rbp_n_t);	\
    -	    } else if (rbp_n_cmp > 0) {					\
    -		rbp_n_t = rbp_right_get(a_type, a_field, rbp_n_t);	\
    -	    } else {							\
    -		break;							\
    -	    }								\
    -	    assert(rbp_n_t != &(a_tree)->rbt_nil);			\
    +#define	rbtn_last(a_type, a_field, a_rbt, a_root, r_node) do {		\
    +    (r_node) = (a_root);						\
    +    if ((r_node) != &(a_rbt)->rbt_nil) {				\
    +	for (; rbtn_right_get(a_type, a_field, (r_node)) !=		\
    +	  &(a_rbt)->rbt_nil; (r_node) = rbtn_right_get(a_type, a_field,	\
    +	  (r_node))) {							\
     	}								\
         }									\
     } while (0)
     
    -#define	rbp_prev(a_type, a_field, a_cmp, a_tree, a_node, r_node) do {	\
    -    if (rbp_left_get(a_type, a_field, (a_node)) != &(a_tree)->rbt_nil) {\
    -	rbp_last(a_type, a_field, a_tree, rbp_left_get(a_type,		\
    -	  a_field, (a_node)), (r_node));				\
    -    } else {								\
    -	a_type *rbp_p_t = (a_tree)->rbt_root;				\
    -	assert(rbp_p_t != &(a_tree)->rbt_nil);				\
    -	(r_node) = &(a_tree)->rbt_nil;					\
    -	while (true) {							\
    -	    int rbp_p_cmp = (a_cmp)((a_node), rbp_p_t);			\
    -	    if (rbp_p_cmp < 0) {					\
    -		rbp_p_t = rbp_left_get(a_type, a_field, rbp_p_t);	\
    -	    } else if (rbp_p_cmp > 0) {					\
    -		(r_node) = rbp_p_t;					\
    -		rbp_p_t = rbp_right_get(a_type, a_field, rbp_p_t);	\
    -	    } else {							\
    -		break;							\
    -	    }								\
    -	    assert(rbp_p_t != &(a_tree)->rbt_nil);			\
    -	}								\
    -    }									\
    +#define	rbtn_rotate_left(a_type, a_field, a_node, r_node) do {		\
    +    (r_node) = rbtn_right_get(a_type, a_field, (a_node));		\
    +    rbtn_right_set(a_type, a_field, (a_node),				\
    +      rbtn_left_get(a_type, a_field, (r_node)));			\
    +    rbtn_left_set(a_type, a_field, (r_node), (a_node));			\
     } while (0)
     
    -#define	rb_first(a_type, a_field, a_tree, r_node) do {			\
    -    rbp_first(a_type, a_field, a_tree, (a_tree)->rbt_root, (r_node));	\
    -    if ((r_node) == &(a_tree)->rbt_nil) {				\
    -	(r_node) = NULL;						\
    -    }									\
    -} while (0)
    -
    -#define	rb_last(a_type, a_field, a_tree, r_node) do {			\
    -    rbp_last(a_type, a_field, a_tree, (a_tree)->rbt_root, r_node);	\
    -    if ((r_node) == &(a_tree)->rbt_nil) {				\
    -	(r_node) = NULL;						\
    -    }									\
    -} while (0)
    -
    -#define	rb_next(a_type, a_field, a_cmp, a_tree, a_node, r_node) do {	\
    -    rbp_next(a_type, a_field, a_cmp, a_tree, (a_node), (r_node));	\
    -    if ((r_node) == &(a_tree)->rbt_nil) {				\
    -	(r_node) = NULL;						\
    -    }									\
    -} while (0)
    -
    -#define	rb_prev(a_type, a_field, a_cmp, a_tree, a_node, r_node) do {	\
    -    rbp_prev(a_type, a_field, a_cmp, a_tree, (a_node), (r_node));	\
    -    if ((r_node) == &(a_tree)->rbt_nil) {				\
    -	(r_node) = NULL;						\
    -    }									\
    -} while (0)
    -
    -#define	rb_search(a_type, a_field, a_cmp, a_tree, a_key, r_node) do {	\
    -    int rbp_se_cmp;							\
    -    (r_node) = (a_tree)->rbt_root;					\
    -    while ((r_node) != &(a_tree)->rbt_nil				\
    -      && (rbp_se_cmp = (a_cmp)((a_key), (r_node))) != 0) {		\
    -	if (rbp_se_cmp < 0) {						\
    -	    (r_node) = rbp_left_get(a_type, a_field, (r_node));		\
    -	} else {							\
    -	    (r_node) = rbp_right_get(a_type, a_field, (r_node));	\
    -	}								\
    -    }									\
    -    if ((r_node) == &(a_tree)->rbt_nil) {				\
    -	(r_node) = NULL;						\
    -    }									\
    +#define	rbtn_rotate_right(a_type, a_field, a_node, r_node) do {		\
    +    (r_node) = rbtn_left_get(a_type, a_field, (a_node));		\
    +    rbtn_left_set(a_type, a_field, (a_node),				\
    +      rbtn_right_get(a_type, a_field, (r_node)));			\
    +    rbtn_right_set(a_type, a_field, (r_node), (a_node));		\
     } while (0)
     
     /*
    - * Find a match if it exists.  Otherwise, find the next greater node, if one
    - * exists.
    + * The rb_proto() macro generates function prototypes that correspond to the
    + * functions generated by an equivalently parameterized call to rb_gen().
      */
    -#define	rb_nsearch(a_type, a_field, a_cmp, a_tree, a_key, r_node) do {	\
    -    a_type *rbp_ns_t = (a_tree)->rbt_root;				\
    -    (r_node) = NULL;							\
    -    while (rbp_ns_t != &(a_tree)->rbt_nil) {				\
    -	int rbp_ns_cmp = (a_cmp)((a_key), rbp_ns_t);			\
    -	if (rbp_ns_cmp < 0) {						\
    -	    (r_node) = rbp_ns_t;					\
    -	    rbp_ns_t = rbp_left_get(a_type, a_field, rbp_ns_t);		\
    -	} else if (rbp_ns_cmp > 0) {					\
    -	    rbp_ns_t = rbp_right_get(a_type, a_field, rbp_ns_t);	\
    +
    +#define	rb_proto(a_attr, a_prefix, a_rbt_type, a_type)			\
    +a_attr void								\
    +a_prefix##new(a_rbt_type *rbtree);					\
    +a_attr a_type *								\
    +a_prefix##first(a_rbt_type *rbtree);					\
    +a_attr a_type *								\
    +a_prefix##last(a_rbt_type *rbtree);					\
    +a_attr a_type *								\
    +a_prefix##next(a_rbt_type *rbtree, a_type *node);			\
    +a_attr a_type *								\
    +a_prefix##prev(a_rbt_type *rbtree, a_type *node);			\
    +a_attr a_type *								\
    +a_prefix##search(a_rbt_type *rbtree, a_type *key);			\
    +a_attr a_type *								\
    +a_prefix##nsearch(a_rbt_type *rbtree, a_type *key);			\
    +a_attr a_type *								\
    +a_prefix##psearch(a_rbt_type *rbtree, a_type *key);			\
    +a_attr void								\
    +a_prefix##insert(a_rbt_type *rbtree, a_type *node);			\
    +a_attr void								\
    +a_prefix##remove(a_rbt_type *rbtree, a_type *node);			\
    +a_attr a_type *								\
    +a_prefix##iter(a_rbt_type *rbtree, a_type *start, a_type *(*cb)(	\
    +  a_rbt_type *, a_type *, void *), void *arg);				\
    +a_attr a_type *								\
    +a_prefix##reverse_iter(a_rbt_type *rbtree, a_type *start,		\
    +  a_type *(*cb)(a_rbt_type *, a_type *, void *), void *arg);
    +
    +/*
    + * The rb_gen() macro generates a type-specific red-black tree implementation,
    + * based on the above cpp macros.
    + *
    + * Arguments:
    + *
    + *   a_attr    : Function attribute for generated functions (ex: static).
    + *   a_prefix  : Prefix for generated functions (ex: extree_).
    + *   a_rb_type : Type for red-black tree data structure (ex: extree_t).
    + *   a_type    : Type for red-black tree node data structure (ex:
    + *               extree_node_t).
    + *   a_field   : Name of red-black tree node linkage (ex: extree_link).
    + *   a_cmp     : Node comparison function name, with the following prototype:
    + *                 int (a_cmp *)(a_type *a_node, a_type *a_other);
    + *                                       ^^^^^^
    + *                                    or a_key
    + *               Interpretation of comparision function return values:
    + *                 -1 : a_node <  a_other
    + *                  0 : a_node == a_other
    + *                  1 : a_node >  a_other
    + *               In all cases, the a_node or a_key macro argument is the first
    + *               argument to the comparison function, which makes it possible
    + *               to write comparison functions that treat the first argument
    + *               specially.
    + *
    + * Assuming the following setup:
    + *
    + *   typedef struct ex_node_s ex_node_t;
    + *   struct ex_node_s {
    + *       rb_node(ex_node_t) ex_link;
    + *   };
    + *   typedef rb(ex_node_t) ex_t;
    + *   rb_gen(static, ex_, ex_t, ex_node_t, ex_link, ex_cmp, 1297, 1301)
    + *
    + * The following API is generated:
    + *
    + *   static void
    + *   ex_new(ex_t *extree);
    + *       Description: Initialize a red-black tree structure.
    + *       Args:
    + *         extree: Pointer to an uninitialized red-black tree object.
    + *
    + *   static ex_node_t *
    + *   ex_first(ex_t *extree);
    + *   static ex_node_t *
    + *   ex_last(ex_t *extree);
    + *       Description: Get the first/last node in extree.
    + *       Args:
    + *         extree: Pointer to an initialized red-black tree object.
    + *       Ret: First/last node in extree, or NULL if extree is empty.
    + *
    + *   static ex_node_t *
    + *   ex_next(ex_t *extree, ex_node_t *node);
    + *   static ex_node_t *
    + *   ex_prev(ex_t *extree, ex_node_t *node);
    + *       Description: Get node's successor/predecessor.
    + *       Args:
    + *         extree: Pointer to an initialized red-black tree object.
    + *         node : A node in extree.
    + *       Ret: node's successor/predecessor in extree, or NULL if node is
    + *            last/first.
    + *
    + *   static ex_node_t *
    + *   ex_search(ex_t *extree, ex_node_t *key);
    + *       Description: Search for node that matches key.
    + *       Args:
    + *         extree: Pointer to an initialized red-black tree object.
    + *         key  : Search key.
    + *       Ret: Node in extree that matches key, or NULL if no match.
    + *
    + *   static ex_node_t *
    + *   ex_nsearch(ex_t *extree, ex_node_t *key);
    + *   static ex_node_t *
    + *   ex_psearch(ex_t *extree, ex_node_t *key);
    + *       Description: Search for node that matches key.  If no match is found,
    + *                    return what would be key's successor/predecessor, were
    + *                    key in extree.
    + *       Args:
    + *         extree: Pointer to an initialized red-black tree object.
    + *         key   : Search key.
    + *       Ret: Node in extree that matches key, or if no match, hypothetical
    + *            node's successor/predecessor (NULL if no successor/predecessor).
    + *
    + *   static void
    + *   ex_insert(ex_t *extree, ex_node_t *node);
    + *       Description: Insert node into extree.
    + *       Args:
    + *         extree: Pointer to an initialized red-black tree object.
    + *         node  : Node to be inserted into extree.
    + *
    + *   static void
    + *   ex_remove(ex_t *extree, ex_node_t *node);
    + *       Description: Remove node from extree.
    + *       Args:
    + *         extree: Pointer to an initialized red-black tree object.
    + *         node  : Node in extree to be removed.
    + *
    + *   static ex_node_t *
    + *   ex_iter(ex_t *extree, ex_node_t *start, ex_node_t *(*cb)(ex_t *,
    + *     ex_node_t *, void *), void *arg);
    + *   static ex_node_t *
    + *   ex_reverse_iter(ex_t *extree, ex_node_t *start, ex_node *(*cb)(ex_t *,
    + *     ex_node_t *, void *), void *arg);
    + *       Description: Iterate forward/backward over extree, starting at node.
    + *                    If extree is modified, iteration must be immediately
    + *                    terminated by the callback function that causes the
    + *                    modification.
    + *       Args:
    + *         extree: Pointer to an initialized red-black tree object.
    + *         start : Node at which to start iteration, or NULL to start at
    + *                 first/last node.
    + *         cb    : Callback function, which is called for each node during
    + *                 iteration.  Under normal circumstances the callback function
    + *                 should return NULL, which causes iteration to continue.  If a
    + *                 callback function returns non-NULL, iteration is immediately
    + *                 terminated and the non-NULL return value is returned by the
    + *                 iterator.  This is useful for re-starting iteration after
    + *                 modifying extree.
    + *         arg   : Opaque pointer passed to cb().
    + *       Ret: NULL if iteration completed, or the non-NULL callback return value
    + *            that caused termination of the iteration.
    + */
    +#define	rb_gen(a_attr, a_prefix, a_rbt_type, a_type, a_field, a_cmp)	\
    +a_attr void								\
    +a_prefix##new(a_rbt_type *rbtree) {					\
    +    rb_new(a_type, a_field, rbtree);					\
    +}									\
    +a_attr a_type *								\
    +a_prefix##first(a_rbt_type *rbtree) {					\
    +    a_type *ret;							\
    +    rbtn_first(a_type, a_field, rbtree, rbtree->rbt_root, ret);		\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = NULL;							\
    +    }									\
    +    return (ret);							\
    +}									\
    +a_attr a_type *								\
    +a_prefix##last(a_rbt_type *rbtree) {					\
    +    a_type *ret;							\
    +    rbtn_last(a_type, a_field, rbtree, rbtree->rbt_root, ret);		\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = NULL;							\
    +    }									\
    +    return (ret);							\
    +}									\
    +a_attr a_type *								\
    +a_prefix##next(a_rbt_type *rbtree, a_type *node) {			\
    +    a_type *ret;							\
    +    if (rbtn_right_get(a_type, a_field, node) != &rbtree->rbt_nil) {	\
    +	rbtn_first(a_type, a_field, rbtree, rbtn_right_get(a_type,	\
    +	  a_field, node), ret);						\
    +    } else {								\
    +	a_type *tnode = rbtree->rbt_root;				\
    +	assert(tnode != &rbtree->rbt_nil);				\
    +	ret = &rbtree->rbt_nil;						\
    +	while (true) {							\
    +	    int cmp = (a_cmp)(node, tnode);				\
    +	    if (cmp < 0) {						\
    +		ret = tnode;						\
    +		tnode = rbtn_left_get(a_type, a_field, tnode);		\
    +	    } else if (cmp > 0) {					\
    +		tnode = rbtn_right_get(a_type, a_field, tnode);		\
    +	    } else {							\
    +		break;							\
    +	    }								\
    +	    assert(tnode != &rbtree->rbt_nil);				\
    +	}								\
    +    }									\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = (NULL);							\
    +    }									\
    +    return (ret);							\
    +}									\
    +a_attr a_type *								\
    +a_prefix##prev(a_rbt_type *rbtree, a_type *node) {			\
    +    a_type *ret;							\
    +    if (rbtn_left_get(a_type, a_field, node) != &rbtree->rbt_nil) {	\
    +	rbtn_last(a_type, a_field, rbtree, rbtn_left_get(a_type,	\
    +	  a_field, node), ret);						\
    +    } else {								\
    +	a_type *tnode = rbtree->rbt_root;				\
    +	assert(tnode != &rbtree->rbt_nil);				\
    +	ret = &rbtree->rbt_nil;						\
    +	while (true) {							\
    +	    int cmp = (a_cmp)(node, tnode);				\
    +	    if (cmp < 0) {						\
    +		tnode = rbtn_left_get(a_type, a_field, tnode);		\
    +	    } else if (cmp > 0) {					\
    +		ret = tnode;						\
    +		tnode = rbtn_right_get(a_type, a_field, tnode);		\
    +	    } else {							\
    +		break;							\
    +	    }								\
    +	    assert(tnode != &rbtree->rbt_nil);				\
    +	}								\
    +    }									\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = (NULL);							\
    +    }									\
    +    return (ret);							\
    +}									\
    +a_attr a_type *								\
    +a_prefix##search(a_rbt_type *rbtree, a_type *key) {			\
    +    a_type *ret;							\
    +    int cmp;								\
    +    ret = rbtree->rbt_root;						\
    +    while (ret != &rbtree->rbt_nil					\
    +      && (cmp = (a_cmp)(key, ret)) != 0) {				\
    +	if (cmp < 0) {							\
    +	    ret = rbtn_left_get(a_type, a_field, ret);			\
     	} else {							\
    -	    (r_node) = rbp_ns_t;					\
    +	    ret = rbtn_right_get(a_type, a_field, ret);			\
    +	}								\
    +    }									\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = (NULL);							\
    +    }									\
    +    return (ret);							\
    +}									\
    +a_attr a_type *								\
    +a_prefix##nsearch(a_rbt_type *rbtree, a_type *key) {			\
    +    a_type *ret;							\
    +    a_type *tnode = rbtree->rbt_root;					\
    +    ret = &rbtree->rbt_nil;						\
    +    while (tnode != &rbtree->rbt_nil) {					\
    +	int cmp = (a_cmp)(key, tnode);					\
    +	if (cmp < 0) {							\
    +	    ret = tnode;						\
    +	    tnode = rbtn_left_get(a_type, a_field, tnode);		\
    +	} else if (cmp > 0) {						\
    +	    tnode = rbtn_right_get(a_type, a_field, tnode);		\
    +	} else {							\
    +	    ret = tnode;						\
     	    break;							\
     	}								\
         }									\
    -} while (0)
    -
    -/*
    - * Find a match if it exists.  Otherwise, find the previous lesser node, if one
    - * exists.
    - */
    -#define	rb_psearch(a_type, a_field, a_cmp, a_tree, a_key, r_node) do {	\
    -    a_type *rbp_ps_t = (a_tree)->rbt_root;				\
    -    (r_node) = NULL;							\
    -    while (rbp_ps_t != &(a_tree)->rbt_nil) {				\
    -	int rbp_ps_cmp = (a_cmp)((a_key), rbp_ps_t);			\
    -	if (rbp_ps_cmp < 0) {						\
    -	    rbp_ps_t = rbp_left_get(a_type, a_field, rbp_ps_t);		\
    -	} else if (rbp_ps_cmp > 0) {					\
    -	    (r_node) = rbp_ps_t;					\
    -	    rbp_ps_t = rbp_right_get(a_type, a_field, rbp_ps_t);	\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = (NULL);							\
    +    }									\
    +    return (ret);							\
    +}									\
    +a_attr a_type *								\
    +a_prefix##psearch(a_rbt_type *rbtree, a_type *key) {			\
    +    a_type *ret;							\
    +    a_type *tnode = rbtree->rbt_root;					\
    +    ret = &rbtree->rbt_nil;						\
    +    while (tnode != &rbtree->rbt_nil) {					\
    +	int cmp = (a_cmp)(key, tnode);					\
    +	if (cmp < 0) {							\
    +	    tnode = rbtn_left_get(a_type, a_field, tnode);		\
    +	} else if (cmp > 0) {						\
    +	    ret = tnode;						\
    +	    tnode = rbtn_right_get(a_type, a_field, tnode);		\
     	} else {							\
    -	    (r_node) = rbp_ps_t;					\
    +	    ret = tnode;						\
     	    break;							\
     	}								\
         }									\
    -} while (0)
    -
    -#define	rbp_rotate_left(a_type, a_field, a_node, r_node) do {		\
    -    (r_node) = rbp_right_get(a_type, a_field, (a_node));		\
    -    rbp_right_set(a_type, a_field, (a_node),				\
    -      rbp_left_get(a_type, a_field, (r_node)));				\
    -    rbp_left_set(a_type, a_field, (r_node), (a_node));			\
    -} while (0)
    -
    -#define	rbp_rotate_right(a_type, a_field, a_node, r_node) do {		\
    -    (r_node) = rbp_left_get(a_type, a_field, (a_node));			\
    -    rbp_left_set(a_type, a_field, (a_node),				\
    -      rbp_right_get(a_type, a_field, (r_node)));			\
    -    rbp_right_set(a_type, a_field, (r_node), (a_node));			\
    -} while (0)
    -
    -#define	rbp_lean_left(a_type, a_field, a_node, r_node) do {		\
    -    bool rbp_ll_red;							\
    -    rbp_rotate_left(a_type, a_field, (a_node), (r_node));		\
    -    rbp_ll_red = rbp_red_get(a_type, a_field, (a_node));		\
    -    rbp_color_set(a_type, a_field, (r_node), rbp_ll_red);		\
    -    rbp_red_set(a_type, a_field, (a_node));				\
    -} while (0)
    -
    -#define	rbp_lean_right(a_type, a_field, a_node, r_node) do {		\
    -    bool rbp_lr_red;							\
    -    rbp_rotate_right(a_type, a_field, (a_node), (r_node));		\
    -    rbp_lr_red = rbp_red_get(a_type, a_field, (a_node));		\
    -    rbp_color_set(a_type, a_field, (r_node), rbp_lr_red);		\
    -    rbp_red_set(a_type, a_field, (a_node));				\
    -} while (0)
    -
    -#define	rbp_move_red_left(a_type, a_field, a_node, r_node) do {		\
    -    a_type *rbp_mrl_t, *rbp_mrl_u;					\
    -    rbp_mrl_t = rbp_left_get(a_type, a_field, (a_node));		\
    -    rbp_red_set(a_type, a_field, rbp_mrl_t);				\
    -    rbp_mrl_t = rbp_right_get(a_type, a_field, (a_node));		\
    -    rbp_mrl_u = rbp_left_get(a_type, a_field, rbp_mrl_t);		\
    -    if (rbp_red_get(a_type, a_field, rbp_mrl_u)) {			\
    -	rbp_rotate_right(a_type, a_field, rbp_mrl_t, rbp_mrl_u);	\
    -	rbp_right_set(a_type, a_field, (a_node), rbp_mrl_u);		\
    -	rbp_rotate_left(a_type, a_field, (a_node), (r_node));		\
    -	rbp_mrl_t = rbp_right_get(a_type, a_field, (a_node));		\
    -	if (rbp_red_get(a_type, a_field, rbp_mrl_t)) {			\
    -	    rbp_black_set(a_type, a_field, rbp_mrl_t);			\
    -	    rbp_red_set(a_type, a_field, (a_node));			\
    -	    rbp_rotate_left(a_type, a_field, (a_node), rbp_mrl_t);	\
    -	    rbp_left_set(a_type, a_field, (r_node), rbp_mrl_t);		\
    -	} else {							\
    -	    rbp_black_set(a_type, a_field, (a_node));			\
    -	}								\
    -    } else {								\
    -	rbp_red_set(a_type, a_field, (a_node));				\
    -	rbp_rotate_left(a_type, a_field, (a_node), (r_node));		\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = (NULL);							\
         }									\
    -} while (0)
    -
    -#define	rbp_move_red_right(a_type, a_field, a_node, r_node) do {	\
    -    a_type *rbp_mrr_t;							\
    -    rbp_mrr_t = rbp_left_get(a_type, a_field, (a_node));		\
    -    if (rbp_red_get(a_type, a_field, rbp_mrr_t)) {			\
    -	a_type *rbp_mrr_u, *rbp_mrr_v;					\
    -	rbp_mrr_u = rbp_right_get(a_type, a_field, rbp_mrr_t);		\
    -	rbp_mrr_v = rbp_left_get(a_type, a_field, rbp_mrr_u);		\
    -	if (rbp_red_get(a_type, a_field, rbp_mrr_v)) {			\
    -	    rbp_color_set(a_type, a_field, rbp_mrr_u,			\
    -	      rbp_red_get(a_type, a_field, (a_node)));			\
    -	    rbp_black_set(a_type, a_field, rbp_mrr_v);			\
    -	    rbp_rotate_left(a_type, a_field, rbp_mrr_t, rbp_mrr_u);	\
    -	    rbp_left_set(a_type, a_field, (a_node), rbp_mrr_u);		\
    -	    rbp_rotate_right(a_type, a_field, (a_node), (r_node));	\
    -	    rbp_rotate_left(a_type, a_field, (a_node), rbp_mrr_t);	\
    -	    rbp_right_set(a_type, a_field, (r_node), rbp_mrr_t);	\
    -	} else {							\
    -	    rbp_color_set(a_type, a_field, rbp_mrr_t,			\
    -	      rbp_red_get(a_type, a_field, (a_node)));			\
    -	    rbp_red_set(a_type, a_field, rbp_mrr_u);			\
    -	    rbp_rotate_right(a_type, a_field, (a_node), (r_node));	\
    -	    rbp_rotate_left(a_type, a_field, (a_node), rbp_mrr_t);	\
    -	    rbp_right_set(a_type, a_field, (r_node), rbp_mrr_t);	\
    -	}								\
    -	rbp_red_set(a_type, a_field, (a_node));				\
    -    } else {								\
    -	rbp_red_set(a_type, a_field, rbp_mrr_t);			\
    -	rbp_mrr_t = rbp_left_get(a_type, a_field, rbp_mrr_t);		\
    -	if (rbp_red_get(a_type, a_field, rbp_mrr_t)) {			\
    -	    rbp_black_set(a_type, a_field, rbp_mrr_t);			\
    -	    rbp_rotate_right(a_type, a_field, (a_node), (r_node));	\
    -	    rbp_rotate_left(a_type, a_field, (a_node), rbp_mrr_t);	\
    -	    rbp_right_set(a_type, a_field, (r_node), rbp_mrr_t);	\
    -	} else {							\
    -	    rbp_rotate_left(a_type, a_field, (a_node), (r_node));	\
    -	}								\
    -    }									\
    -} while (0)
    -
    -#define	rb_insert(a_type, a_field, a_cmp, a_tree, a_node) do {		\
    -    a_type rbp_i_s;							\
    -    a_type *rbp_i_g, *rbp_i_p, *rbp_i_c, *rbp_i_t, *rbp_i_u;		\
    -    int rbp_i_cmp = 0;							\
    -    rbp_i_g = &(a_tree)->rbt_nil;					\
    -    rbp_left_set(a_type, a_field, &rbp_i_s, (a_tree)->rbt_root);	\
    -    rbp_right_set(a_type, a_field, &rbp_i_s, &(a_tree)->rbt_nil);	\
    -    rbp_black_set(a_type, a_field, &rbp_i_s);				\
    -    rbp_i_p = &rbp_i_s;							\
    -    rbp_i_c = (a_tree)->rbt_root;					\
    -    /* Iteratively search down the tree for the insertion point,      */\
    -    /* splitting 4-nodes as they are encountered.  At the end of each */\
    -    /* iteration, rbp_i_g->rbp_i_p->rbp_i_c is a 3-level path down    */\
    -    /* the tree, assuming a sufficiently deep tree.                   */\
    -    while (rbp_i_c != &(a_tree)->rbt_nil) {				\
    -	rbp_i_t = rbp_left_get(a_type, a_field, rbp_i_c);		\
    -	rbp_i_u = rbp_left_get(a_type, a_field, rbp_i_t);		\
    -	if (rbp_red_get(a_type, a_field, rbp_i_t)			\
    -	  && rbp_red_get(a_type, a_field, rbp_i_u)) {			\
    -	    /* rbp_i_c is the top of a logical 4-node, so split it.   */\
    -	    /* This iteration does not move down the tree, due to the */\
    -	    /* disruptiveness of node splitting.                      */\
    -	    /*                                                        */\
    -	    /* Rotate right.                                          */\
    -	    rbp_rotate_right(a_type, a_field, rbp_i_c, rbp_i_t);	\
    -	    /* Pass red links up one level.                           */\
    -	    rbp_i_u = rbp_left_get(a_type, a_field, rbp_i_t);		\
    -	    rbp_black_set(a_type, a_field, rbp_i_u);			\
    -	    if (rbp_left_get(a_type, a_field, rbp_i_p) == rbp_i_c) {	\
    -		rbp_left_set(a_type, a_field, rbp_i_p, rbp_i_t);	\
    -		rbp_i_c = rbp_i_t;					\
    -	    } else {							\
    -		/* rbp_i_c was the right child of rbp_i_p, so rotate  */\
    -		/* left in order to maintain the left-leaning         */\
    -		/* invariant.                                         */\
    -		assert(rbp_right_get(a_type, a_field, rbp_i_p)		\
    -		  == rbp_i_c);						\
    -		rbp_right_set(a_type, a_field, rbp_i_p, rbp_i_t);	\
    -		rbp_lean_left(a_type, a_field, rbp_i_p, rbp_i_u);	\
    -		if (rbp_left_get(a_type, a_field, rbp_i_g) == rbp_i_p) {\
    -		    rbp_left_set(a_type, a_field, rbp_i_g, rbp_i_u);	\
    -		} else {						\
    -		    assert(rbp_right_get(a_type, a_field, rbp_i_g)	\
    -		      == rbp_i_p);					\
    -		    rbp_right_set(a_type, a_field, rbp_i_g, rbp_i_u);	\
    -		}							\
    -		rbp_i_p = rbp_i_u;					\
    -		rbp_i_cmp = (a_cmp)((a_node), rbp_i_p);			\
    -		if (rbp_i_cmp < 0) {					\
    -		    rbp_i_c = rbp_left_get(a_type, a_field, rbp_i_p);	\
    -		} else {						\
    -		    assert(rbp_i_cmp > 0);				\
    -		    rbp_i_c = rbp_right_get(a_type, a_field, rbp_i_p);	\
    -		}							\
    -		continue;						\
    -	    }								\
    -	}								\
    -	rbp_i_g = rbp_i_p;						\
    -	rbp_i_p = rbp_i_c;						\
    -	rbp_i_cmp = (a_cmp)((a_node), rbp_i_c);				\
    -	if (rbp_i_cmp < 0) {						\
    -	    rbp_i_c = rbp_left_get(a_type, a_field, rbp_i_c);		\
    -	} else {							\
    -	    assert(rbp_i_cmp > 0);					\
    -	    rbp_i_c = rbp_right_get(a_type, a_field, rbp_i_c);		\
    -	}								\
    -    }									\
    -    /* rbp_i_p now refers to the node under which to insert.          */\
    -    rbp_node_new(a_type, a_field, a_tree, (a_node));			\
    -    if (rbp_i_cmp > 0) {						\
    -	rbp_right_set(a_type, a_field, rbp_i_p, (a_node));		\
    -	rbp_lean_left(a_type, a_field, rbp_i_p, rbp_i_t);		\
    -	if (rbp_left_get(a_type, a_field, rbp_i_g) == rbp_i_p) {	\
    -	    rbp_left_set(a_type, a_field, rbp_i_g, rbp_i_t);		\
    -	} else if (rbp_right_get(a_type, a_field, rbp_i_g) == rbp_i_p) {\
    -	    rbp_right_set(a_type, a_field, rbp_i_g, rbp_i_t);		\
    -	}								\
    -    } else {								\
    -	rbp_left_set(a_type, a_field, rbp_i_p, (a_node));		\
    -    }									\
    -    /* Update the root and make sure that it is black.                */\
    -    (a_tree)->rbt_root = rbp_left_get(a_type, a_field, &rbp_i_s);	\
    -    rbp_black_set(a_type, a_field, (a_tree)->rbt_root);			\
    -} while (0)
    -
    -#define	rb_remove(a_type, a_field, a_cmp, a_tree, a_node) do {		\
    -    a_type rbp_r_s;							\
    -    a_type *rbp_r_p, *rbp_r_c, *rbp_r_xp, *rbp_r_t, *rbp_r_u;		\
    -    int rbp_r_cmp;							\
    -    rbp_left_set(a_type, a_field, &rbp_r_s, (a_tree)->rbt_root);	\
    -    rbp_right_set(a_type, a_field, &rbp_r_s, &(a_tree)->rbt_nil);	\
    -    rbp_black_set(a_type, a_field, &rbp_r_s);				\
    -    rbp_r_p = &rbp_r_s;							\
    -    rbp_r_c = (a_tree)->rbt_root;					\
    -    rbp_r_xp = &(a_tree)->rbt_nil;					\
    -    /* Iterate down the tree, but always transform 2-nodes to 3- or   */\
    -    /* 4-nodes in order to maintain the invariant that the current    */\
    -    /* node is not a 2-node.  This allows simple deletion once a leaf */\
    -    /* is reached.  Handle the root specially though, since there may */\
    -    /* be no way to convert it from a 2-node to a 3-node.             */\
    -    rbp_r_cmp = (a_cmp)((a_node), rbp_r_c);				\
    -    if (rbp_r_cmp < 0) {						\
    -	rbp_r_t = rbp_left_get(a_type, a_field, rbp_r_c);		\
    -	rbp_r_u = rbp_left_get(a_type, a_field, rbp_r_t);		\
    -	if (rbp_red_get(a_type, a_field, rbp_r_t) == false		\
    -	  && rbp_red_get(a_type, a_field, rbp_r_u) == false) {		\
    -	    /* Apply standard transform to prepare for left move.     */\
    -	    rbp_move_red_left(a_type, a_field, rbp_r_c, rbp_r_t);	\
    -	    rbp_black_set(a_type, a_field, rbp_r_t);			\
    -	    rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);		\
    -	    rbp_r_c = rbp_r_t;						\
    -	} else {							\
    -	    /* Move left.                                             */\
    -	    rbp_r_p = rbp_r_c;						\
    -	    rbp_r_c = rbp_left_get(a_type, a_field, rbp_r_c);		\
    -	}								\
    -    } else {								\
    -	if (rbp_r_cmp == 0) {						\
    -	    assert((a_node) == rbp_r_c);				\
    -	    if (rbp_right_get(a_type, a_field, rbp_r_c)			\
    -	      == &(a_tree)->rbt_nil) {					\
    -		/* Delete root node (which is also a leaf node).      */\
    -		if (rbp_left_get(a_type, a_field, rbp_r_c)		\
    -		  != &(a_tree)->rbt_nil) {				\
    -		    rbp_lean_right(a_type, a_field, rbp_r_c, rbp_r_t);	\
    -		    rbp_right_set(a_type, a_field, rbp_r_t,		\
    -		      &(a_tree)->rbt_nil);				\
    -		} else {						\
    -		    rbp_r_t = &(a_tree)->rbt_nil;			\
    -		}							\
    -		rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);	\
    -	    } else {							\
    -		/* This is the node we want to delete, but we will    */\
    -		/* instead swap it with its successor and delete the  */\
    -		/* successor.  Record enough information to do the    */\
    -		/* swap later.  rbp_r_xp is the a_node's parent.      */\
    -		rbp_r_xp = rbp_r_p;					\
    -		rbp_r_cmp = 1; /* Note that deletion is incomplete.   */\
    -	    }								\
    -	}								\
    -	if (rbp_r_cmp == 1) {						\
    -	    if (rbp_red_get(a_type, a_field, rbp_left_get(a_type,	\
    -	      a_field, rbp_right_get(a_type, a_field, rbp_r_c)))	\
    -	      == false) {						\
    -		rbp_r_t = rbp_left_get(a_type, a_field, rbp_r_c);	\
    -		if (rbp_red_get(a_type, a_field, rbp_r_t)) {		\
    -		    /* Standard transform.                            */\
    -		    rbp_move_red_right(a_type, a_field, rbp_r_c,	\
    -		      rbp_r_t);						\
    -		} else {						\
    -		    /* Root-specific transform.                       */\
    -		    rbp_red_set(a_type, a_field, rbp_r_c);		\
    -		    rbp_r_u = rbp_left_get(a_type, a_field, rbp_r_t);	\
    -		    if (rbp_red_get(a_type, a_field, rbp_r_u)) {	\
    -			rbp_black_set(a_type, a_field, rbp_r_u);	\
    -			rbp_rotate_right(a_type, a_field, rbp_r_c,	\
    -			  rbp_r_t);					\
    -			rbp_rotate_left(a_type, a_field, rbp_r_c,	\
    -			  rbp_r_u);					\
    -			rbp_right_set(a_type, a_field, rbp_r_t,		\
    -			  rbp_r_u);					\
    -		    } else {						\
    -			rbp_red_set(a_type, a_field, rbp_r_t);		\
    -			rbp_rotate_left(a_type, a_field, rbp_r_c,	\
    -			  rbp_r_t);					\
    -		    }							\
    -		}							\
    -		rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);	\
    -		rbp_r_c = rbp_r_t;					\
    -	    } else {							\
    -		/* Move right.                                        */\
    -		rbp_r_p = rbp_r_c;					\
    -		rbp_r_c = rbp_right_get(a_type, a_field, rbp_r_c);	\
    -	    }								\
    -	}								\
    -    }									\
    -    if (rbp_r_cmp != 0) {						\
    -	while (true) {							\
    -	    assert(rbp_r_p != &(a_tree)->rbt_nil);			\
    -	    rbp_r_cmp = (a_cmp)((a_node), rbp_r_c);			\
    -	    if (rbp_r_cmp < 0) {					\
    -		rbp_r_t = rbp_left_get(a_type, a_field, rbp_r_c);	\
    -		if (rbp_r_t == &(a_tree)->rbt_nil) {			\
    -		    /* rbp_r_c now refers to the successor node to    */\
    -		    /* relocate, and rbp_r_xp/a_node refer to the     */\
    -		    /* context for the relocation.                    */\
    -		    if (rbp_left_get(a_type, a_field, rbp_r_xp)		\
    -		      == (a_node)) {					\
    -			rbp_left_set(a_type, a_field, rbp_r_xp,		\
    -			  rbp_r_c);					\
    -		    } else {						\
    -			assert(rbp_right_get(a_type, a_field,		\
    -			  rbp_r_xp) == (a_node));			\
    -			rbp_right_set(a_type, a_field, rbp_r_xp,	\
    -			  rbp_r_c);					\
    -		    }							\
    -		    rbp_left_set(a_type, a_field, rbp_r_c,		\
    -		      rbp_left_get(a_type, a_field, (a_node)));		\
    -		    rbp_right_set(a_type, a_field, rbp_r_c,		\
    -		      rbp_right_get(a_type, a_field, (a_node)));	\
    -		    rbp_color_set(a_type, a_field, rbp_r_c,		\
    -		      rbp_red_get(a_type, a_field, (a_node)));		\
    -		    if (rbp_left_get(a_type, a_field, rbp_r_p)		\
    -		      == rbp_r_c) {					\
    -			rbp_left_set(a_type, a_field, rbp_r_p,		\
    -			  &(a_tree)->rbt_nil);				\
    -		    } else {						\
    -			assert(rbp_right_get(a_type, a_field, rbp_r_p)	\
    -			  == rbp_r_c);					\
    -			rbp_right_set(a_type, a_field, rbp_r_p,		\
    -			  &(a_tree)->rbt_nil);				\
    -		    }							\
    -		    break;						\
    -		}							\
    -		rbp_r_u = rbp_left_get(a_type, a_field, rbp_r_t);	\
    -		if (rbp_red_get(a_type, a_field, rbp_r_t) == false	\
    -		  && rbp_red_get(a_type, a_field, rbp_r_u) == false) {	\
    -		    rbp_move_red_left(a_type, a_field, rbp_r_c,		\
    -		      rbp_r_t);						\
    -		    if (rbp_left_get(a_type, a_field, rbp_r_p)		\
    -		      == rbp_r_c) {					\
    -			rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);\
    -		    } else {						\
    -			rbp_right_set(a_type, a_field, rbp_r_p,		\
    -			  rbp_r_t);					\
    -		    }							\
    -		    rbp_r_c = rbp_r_t;					\
    -		} else {						\
    -		    rbp_r_p = rbp_r_c;					\
    -		    rbp_r_c = rbp_left_get(a_type, a_field, rbp_r_c);	\
    -		}							\
    -	    } else {							\
    -		/* Check whether to delete this node (it has to be    */\
    -		/* the correct node and a leaf node).                 */\
    -		if (rbp_r_cmp == 0) {					\
    -		    assert((a_node) == rbp_r_c);			\
    -		    if (rbp_right_get(a_type, a_field, rbp_r_c)		\
    -		      == &(a_tree)->rbt_nil) {				\
    -			/* Delete leaf node.                          */\
    -			if (rbp_left_get(a_type, a_field, rbp_r_c)	\
    -			  != &(a_tree)->rbt_nil) {			\
    -			    rbp_lean_right(a_type, a_field, rbp_r_c,	\
    -			      rbp_r_t);					\
    -			    rbp_right_set(a_type, a_field, rbp_r_t,	\
    -			      &(a_tree)->rbt_nil);			\
    -			} else {					\
    -			    rbp_r_t = &(a_tree)->rbt_nil;		\
    -			}						\
    -			if (rbp_left_get(a_type, a_field, rbp_r_p)	\
    -			  == rbp_r_c) {					\
    -			    rbp_left_set(a_type, a_field, rbp_r_p,	\
    -			      rbp_r_t);					\
    -			} else {					\
    -			    rbp_right_set(a_type, a_field, rbp_r_p,	\
    -			      rbp_r_t);					\
    -			}						\
    -			break;						\
    -		    } else {						\
    -			/* This is the node we want to delete, but we */\
    -			/* will instead swap it with its successor    */\
    -			/* and delete the successor.  Record enough   */\
    -			/* information to do the swap later.          */\
    -			/* rbp_r_xp is a_node's parent.               */\
    -			rbp_r_xp = rbp_r_p;				\
    -		    }							\
    -		}							\
    -		rbp_r_t = rbp_right_get(a_type, a_field, rbp_r_c);	\
    -		rbp_r_u = rbp_left_get(a_type, a_field, rbp_r_t);	\
    -		if (rbp_red_get(a_type, a_field, rbp_r_u) == false) {	\
    -		    rbp_move_red_right(a_type, a_field, rbp_r_c,	\
    -		      rbp_r_t);						\
    -		    if (rbp_left_get(a_type, a_field, rbp_r_p)		\
    -		      == rbp_r_c) {					\
    -			rbp_left_set(a_type, a_field, rbp_r_p, rbp_r_t);\
    -		    } else {						\
    -			rbp_right_set(a_type, a_field, rbp_r_p,		\
    -			  rbp_r_t);					\
    -		    }							\
    -		    rbp_r_c = rbp_r_t;					\
    -		} else {						\
    -		    rbp_r_p = rbp_r_c;					\
    -		    rbp_r_c = rbp_right_get(a_type, a_field, rbp_r_c);	\
    -		}							\
    -	    }								\
    -	}								\
    -    }									\
    -    /* Update root.                                                   */\
    -    (a_tree)->rbt_root = rbp_left_get(a_type, a_field, &rbp_r_s);	\
    -} while (0)
    -
    -/*
    - * The rb_wrap() macro provides a convenient way to wrap functions around the
    - * cpp macros.  The main benefits of wrapping are that 1) repeated macro
    - * expansion can cause code bloat, especially for rb_{insert,remove)(), and
    - * 2) type, linkage, comparison functions, etc. need not be specified at every
    - * call point.
    - */
    -
    -#define	rb_wrap(a_attr, a_prefix, a_tree_type, a_type, a_field, a_cmp)	\
    -a_attr void								\
    -a_prefix##new(a_tree_type *tree) {					\
    -    rb_new(a_type, a_field, tree);					\
    -}									\
    -a_attr a_type *								\
    -a_prefix##first(a_tree_type *tree) {					\
    -    a_type *ret;							\
    -    rb_first(a_type, a_field, tree, ret);				\
    -    return (ret);							\
    -}									\
    -a_attr a_type *								\
    -a_prefix##last(a_tree_type *tree) {					\
    -    a_type *ret;							\
    -    rb_last(a_type, a_field, tree, ret);				\
    -    return (ret);							\
    -}									\
    -a_attr a_type *								\
    -a_prefix##next(a_tree_type *tree, a_type *node) {			\
    -    a_type *ret;							\
    -    rb_next(a_type, a_field, a_cmp, tree, node, ret);			\
    -    return (ret);							\
    -}									\
    -a_attr a_type *								\
    -a_prefix##prev(a_tree_type *tree, a_type *node) {			\
    -    a_type *ret;							\
    -    rb_prev(a_type, a_field, a_cmp, tree, node, ret);			\
    -    return (ret);							\
    -}									\
    -a_attr a_type *								\
    -a_prefix##search(a_tree_type *tree, a_type *key) {			\
    -    a_type *ret;							\
    -    rb_search(a_type, a_field, a_cmp, tree, key, ret);			\
    -    return (ret);							\
    -}									\
    -a_attr a_type *								\
    -a_prefix##nsearch(a_tree_type *tree, a_type *key) {			\
    -    a_type *ret;							\
    -    rb_nsearch(a_type, a_field, a_cmp, tree, key, ret);			\
    -    return (ret);							\
    -}									\
    -a_attr a_type *								\
    -a_prefix##psearch(a_tree_type *tree, a_type *key) {			\
    -    a_type *ret;							\
    -    rb_psearch(a_type, a_field, a_cmp, tree, key, ret);			\
         return (ret);							\
     }									\
     a_attr void								\
    -a_prefix##insert(a_tree_type *tree, a_type *node) {			\
    -    rb_insert(a_type, a_field, a_cmp, tree, node);			\
    -}									\
    -a_attr void								\
    -a_prefix##remove(a_tree_type *tree, a_type *node) {			\
    -    rb_remove(a_type, a_field, a_cmp, tree, node);			\
    -}
    -
    -/*
    - * The iterators simulate recursion via an array of pointers that store the
    - * current path.  This is critical to performance, since a series of calls to
    - * rb_{next,prev}() would require time proportional to (n lg n), whereas this
    - * implementation only requires time proportional to (n).
    - *
    - * Since the iterators cache a path down the tree, any tree modification may
    - * cause the cached path to become invalid.  In order to continue iteration,
    - * use something like the following sequence:
    - *
    - *   {
    - *       a_type *node, *tnode;
    - *
    - *       rb_foreach_begin(a_type, a_field, a_tree, node) {
    - *           ...
    - *           rb_next(a_type, a_field, a_cmp, a_tree, node, tnode);
    - *           rb_remove(a_type, a_field, a_cmp, a_tree, node);
    - *           rb_foreach_next(a_type, a_field, a_cmp, a_tree, tnode);
    - *           ...
    - *       } rb_foreach_end(a_type, a_field, a_tree, node)
    - *   }
    - *
    - * Note that this idiom is not advised if every iteration modifies the tree,
    - * since in that case there is no algorithmic complexity improvement over a
    - * series of rb_{next,prev}() calls, thus making the setup overhead wasted
    - * effort.
    - */
    -
    -#define	rb_foreach_begin(a_type, a_field, a_tree, a_var) {		\
    -    /* Compute the maximum possible tree depth (3X the black height). */\
    -    unsigned rbp_f_height;						\
    -    rbp_black_height(a_type, a_field, a_tree, rbp_f_height);		\
    -    rbp_f_height *= 3;							\
    -    {									\
    -	/* Initialize the path to contain the left spine.             */\
    -	a_type *rbp_f_path[rbp_f_height];				\
    -	a_type *rbp_f_node;						\
    -	bool rbp_f_synced = false;					\
    -	unsigned rbp_f_depth = 0;					\
    -	if ((a_tree)->rbt_root != &(a_tree)->rbt_nil) {			\
    -	    rbp_f_path[rbp_f_depth] = (a_tree)->rbt_root;		\
    -	    rbp_f_depth++;						\
    -	    while ((rbp_f_node = rbp_left_get(a_type, a_field,		\
    -	      rbp_f_path[rbp_f_depth-1])) != &(a_tree)->rbt_nil) {	\
    -		rbp_f_path[rbp_f_depth] = rbp_f_node;			\
    -		rbp_f_depth++;						\
    -	    }								\
    -	}								\
    -	/* While the path is non-empty, iterate.                      */\
    -	while (rbp_f_depth > 0) {					\
    -	    (a_var) = rbp_f_path[rbp_f_depth-1];
    -
    -/* Only use if modifying the tree during iteration. */
    -#define	rb_foreach_next(a_type, a_field, a_cmp, a_tree, a_node)		\
    -	    /* Re-initialize the path to contain the path to a_node.  */\
    -	    rbp_f_depth = 0;						\
    -	    if (a_node != NULL) {					\
    -		if ((a_tree)->rbt_root != &(a_tree)->rbt_nil) {		\
    -		    rbp_f_path[rbp_f_depth] = (a_tree)->rbt_root;	\
    -		    rbp_f_depth++;					\
    -		    rbp_f_node = rbp_f_path[0];				\
    -		    while (true) {					\
    -			int rbp_f_cmp = (a_cmp)((a_node),		\
    -			  rbp_f_path[rbp_f_depth-1]);			\
    -			if (rbp_f_cmp < 0) {				\
    -			    rbp_f_node = rbp_left_get(a_type, a_field,	\
    -			      rbp_f_path[rbp_f_depth-1]);		\
    -			} else if (rbp_f_cmp > 0) {			\
    -			    rbp_f_node = rbp_right_get(a_type, a_field,	\
    -			      rbp_f_path[rbp_f_depth-1]);		\
    -			} else {					\
    -			    break;					\
    -			}						\
    -			assert(rbp_f_node != &(a_tree)->rbt_nil);	\
    -			rbp_f_path[rbp_f_depth] = rbp_f_node;		\
    -			rbp_f_depth++;					\
    -		    }							\
    -		}							\
    -	    }								\
    -	    rbp_f_synced = true;
    -
    -#define	rb_foreach_end(a_type, a_field, a_tree, a_var)			\
    -	    if (rbp_f_synced) {						\
    -		rbp_f_synced = false;					\
    -		continue;						\
    -	    }								\
    -	    /* Find the successor.                                    */\
    -	    if ((rbp_f_node = rbp_right_get(a_type, a_field,		\
    -	      rbp_f_path[rbp_f_depth-1])) != &(a_tree)->rbt_nil) {	\
    -	        /* The successor is the left-most node in the right   */\
    -		/* subtree.                                           */\
    -		rbp_f_path[rbp_f_depth] = rbp_f_node;			\
    -		rbp_f_depth++;						\
    -		while ((rbp_f_node = rbp_left_get(a_type, a_field,	\
    -		  rbp_f_path[rbp_f_depth-1])) != &(a_tree)->rbt_nil) {	\
    -		    rbp_f_path[rbp_f_depth] = rbp_f_node;		\
    -		    rbp_f_depth++;					\
    -		}							\
    -	    } else {							\
    -		/* The successor is above the current node.  Unwind   */\
    -		/* until a left-leaning edge is removed from the      */\
    -		/* path, or the path is empty.                        */\
    -		for (rbp_f_depth--; rbp_f_depth > 0; rbp_f_depth--) {	\
    -		    if (rbp_left_get(a_type, a_field,			\
    -		      rbp_f_path[rbp_f_depth-1])			\
    -		      == rbp_f_path[rbp_f_depth]) {			\
    -			break;						\
    -		    }							\
    -		}							\
    -	    }								\
    +a_prefix##insert(a_rbt_type *rbtree, a_type *node) {			\
    +    struct {								\
    +	a_type *node;							\
    +	int cmp;							\
    +    } path[sizeof(void *) << 4], *pathp;				\
    +    rbt_node_new(a_type, a_field, rbtree, node);			\
    +    /* Wind. */								\
    +    path->node = rbtree->rbt_root;					\
    +    for (pathp = path; pathp->node != &rbtree->rbt_nil; pathp++) {	\
    +	int cmp = pathp->cmp = a_cmp(node, pathp->node);		\
    +	assert(cmp != 0);						\
    +	if (cmp < 0) {							\
    +	    pathp[1].node = rbtn_left_get(a_type, a_field,		\
    +	      pathp->node);						\
    +	} else {							\
    +	    pathp[1].node = rbtn_right_get(a_type, a_field,		\
    +	      pathp->node);						\
     	}								\
         }									\
    -}
    -
    -#define	rb_foreach_reverse_begin(a_type, a_field, a_tree, a_var) {	\
    -    /* Compute the maximum possible tree depth (3X the black height). */\
    -    unsigned rbp_fr_height;						\
    -    rbp_black_height(a_type, a_field, a_tree, rbp_fr_height);		\
    -    rbp_fr_height *= 3;							\
    -    {									\
    -	/* Initialize the path to contain the right spine.            */\
    -	a_type *rbp_fr_path[rbp_fr_height];				\
    -	a_type *rbp_fr_node;						\
    -	bool rbp_fr_synced = false;					\
    -	unsigned rbp_fr_depth = 0;					\
    -	if ((a_tree)->rbt_root != &(a_tree)->rbt_nil) {			\
    -	    rbp_fr_path[rbp_fr_depth] = (a_tree)->rbt_root;		\
    -	    rbp_fr_depth++;						\
    -	    while ((rbp_fr_node = rbp_right_get(a_type, a_field,	\
    -	      rbp_fr_path[rbp_fr_depth-1])) != &(a_tree)->rbt_nil) {	\
    -		rbp_fr_path[rbp_fr_depth] = rbp_fr_node;		\
    -		rbp_fr_depth++;						\
    +    pathp->node = node;							\
    +    /* Unwind. */							\
    +    for (pathp--; (uintptr_t)pathp >= (uintptr_t)path; pathp--) {	\
    +	a_type *cnode = pathp->node;					\
    +	if (pathp->cmp < 0) {						\
    +	    a_type *left = pathp[1].node;				\
    +	    rbtn_left_set(a_type, a_field, cnode, left);		\
    +	    if (rbtn_red_get(a_type, a_field, left)) {			\
    +		a_type *leftleft = rbtn_left_get(a_type, a_field, left);\
    +		if (rbtn_red_get(a_type, a_field, leftleft)) {		\
    +		    /* Fix up 4-node. */				\
    +		    a_type *tnode;					\
    +		    rbtn_black_set(a_type, a_field, leftleft);		\
    +		    rbtn_rotate_right(a_type, a_field, cnode, tnode);	\
    +		    cnode = tnode;					\
    +		}							\
    +	    } else {							\
    +		return;							\
    +	    }								\
    +	} else {							\
    +	    a_type *right = pathp[1].node;				\
    +	    rbtn_right_set(a_type, a_field, cnode, right);		\
    +	    if (rbtn_red_get(a_type, a_field, right)) {			\
    +		a_type *left = rbtn_left_get(a_type, a_field, cnode);	\
    +		if (rbtn_red_get(a_type, a_field, left)) {		\
    +		    /* Split 4-node. */					\
    +		    rbtn_black_set(a_type, a_field, left);		\
    +		    rbtn_black_set(a_type, a_field, right);		\
    +		    rbtn_red_set(a_type, a_field, cnode);		\
    +		} else {						\
    +		    /* Lean left. */					\
    +		    a_type *tnode;					\
    +		    bool tred = rbtn_red_get(a_type, a_field, cnode);	\
    +		    rbtn_rotate_left(a_type, a_field, cnode, tnode);	\
    +		    rbtn_color_set(a_type, a_field, tnode, tred);	\
    +		    rbtn_red_set(a_type, a_field, cnode);		\
    +		    cnode = tnode;					\
    +		}							\
    +	    } else {							\
    +		return;							\
     	    }								\
     	}								\
    -	/* While the path is non-empty, iterate.                      */\
    -	while (rbp_fr_depth > 0) {					\
    -	    (a_var) = rbp_fr_path[rbp_fr_depth-1];
    -
    -/* Only use if modifying the tree during iteration. */
    -#define	rb_foreach_reverse_prev(a_type, a_field, a_cmp, a_tree, a_node)	\
    -	    /* Re-initialize the path to contain the path to a_node.  */\
    -	    rbp_fr_depth = 0;						\
    -	    if (a_node != NULL) {					\
    -		if ((a_tree)->rbt_root != &(a_tree)->rbt_nil) {		\
    -		    rbp_fr_path[rbp_fr_depth] = (a_tree)->rbt_root;	\
    -		    rbp_fr_depth++;					\
    -		    rbp_fr_node = rbp_fr_path[0];			\
    -		    while (true) {					\
    -			int rbp_fr_cmp = (a_cmp)((a_node),		\
    -			  rbp_fr_path[rbp_fr_depth-1]);			\
    -			if (rbp_fr_cmp < 0) {				\
    -			    rbp_fr_node = rbp_left_get(a_type, a_field,	\
    -			      rbp_fr_path[rbp_fr_depth-1]);		\
    -			} else if (rbp_fr_cmp > 0) {			\
    -			    rbp_fr_node = rbp_right_get(a_type, a_field,\
    -			      rbp_fr_path[rbp_fr_depth-1]);		\
    -			} else {					\
    -			    break;					\
    -			}						\
    -			assert(rbp_fr_node != &(a_tree)->rbt_nil);	\
    -			rbp_fr_path[rbp_fr_depth] = rbp_fr_node;	\
    -			rbp_fr_depth++;					\
    -		    }							\
    +	pathp->node = cnode;						\
    +    }									\
    +    /* Set root, and make it black. */					\
    +    rbtree->rbt_root = path->node;					\
    +    rbtn_black_set(a_type, a_field, rbtree->rbt_root);			\
    +}									\
    +a_attr void								\
    +a_prefix##remove(a_rbt_type *rbtree, a_type *node) {			\
    +    struct {								\
    +	a_type *node;							\
    +	int cmp;							\
    +    } *pathp, *nodep, path[sizeof(void *) << 4];			\
    +    /* Wind. */								\
    +    nodep = NULL; /* Silence compiler warning. */			\
    +    path->node = rbtree->rbt_root;					\
    +    for (pathp = path; pathp->node != &rbtree->rbt_nil; pathp++) {	\
    +	int cmp = pathp->cmp = a_cmp(node, pathp->node);		\
    +	if (cmp < 0) {							\
    +	    pathp[1].node = rbtn_left_get(a_type, a_field,		\
    +	      pathp->node);						\
    +	} else {							\
    +	    pathp[1].node = rbtn_right_get(a_type, a_field,		\
    +	      pathp->node);						\
    +	    if (cmp == 0) {						\
    +	        /* Find node's successor, in preparation for swap. */	\
    +		pathp->cmp = 1;						\
    +		nodep = pathp;						\
    +		for (pathp++; pathp->node != &rbtree->rbt_nil;		\
    +		  pathp++) {						\
    +		    pathp->cmp = -1;					\
    +		    pathp[1].node = rbtn_left_get(a_type, a_field,	\
    +		      pathp->node);					\
     		}							\
    -	    }								\
    -	    rbp_fr_synced = true;
    -
    -#define	rb_foreach_reverse_end(a_type, a_field, a_tree, a_var)		\
    -	    if (rbp_fr_synced) {					\
    -		rbp_fr_synced = false;					\
    -		continue;						\
    -	    }								\
    -	    if (rbp_fr_depth == 0) {					\
    -		/* rb_foreach_reverse_sync() was called with a NULL   */\
    -		/* a_node.                                            */\
     		break;							\
     	    }								\
    -	    /* Find the predecessor.                                  */\
    -	    if ((rbp_fr_node = rbp_left_get(a_type, a_field,		\
    -	      rbp_fr_path[rbp_fr_depth-1])) != &(a_tree)->rbt_nil) {	\
    -	        /* The predecessor is the right-most node in the left */\
    -		/* subtree.                                           */\
    -		rbp_fr_path[rbp_fr_depth] = rbp_fr_node;		\
    -		rbp_fr_depth++;						\
    -		while ((rbp_fr_node = rbp_right_get(a_type, a_field,	\
    -		  rbp_fr_path[rbp_fr_depth-1])) != &(a_tree)->rbt_nil) {\
    -		    rbp_fr_path[rbp_fr_depth] = rbp_fr_node;		\
    -		    rbp_fr_depth++;					\
    +	}								\
    +    }									\
    +    assert(nodep->node == node);					\
    +    pathp--;								\
    +    if (pathp->node != node) {						\
    +	/* Swap node with its successor. */				\
    +	bool tred = rbtn_red_get(a_type, a_field, pathp->node);		\
    +	rbtn_color_set(a_type, a_field, pathp->node,			\
    +	  rbtn_red_get(a_type, a_field, node));				\
    +	rbtn_left_set(a_type, a_field, pathp->node,			\
    +	  rbtn_left_get(a_type, a_field, node));			\
    +	/* If node's successor is its right child, the following code */\
    +	/* will do the wrong thing for the right child pointer.       */\
    +	/* However, it doesn't matter, because the pointer will be    */\
    +	/* properly set when the successor is pruned.                 */\
    +	rbtn_right_set(a_type, a_field, pathp->node,			\
    +	  rbtn_right_get(a_type, a_field, node));			\
    +	rbtn_color_set(a_type, a_field, node, tred);			\
    +	/* The pruned leaf node's child pointers are never accessed   */\
    +	/* again, so don't bother setting them to nil.                */\
    +	nodep->node = pathp->node;					\
    +	pathp->node = node;						\
    +	if (nodep == path) {						\
    +	    rbtree->rbt_root = nodep->node;				\
    +	} else {							\
    +	    if (nodep[-1].cmp < 0) {					\
    +		rbtn_left_set(a_type, a_field, nodep[-1].node,		\
    +		  nodep->node);						\
    +	    } else {							\
    +		rbtn_right_set(a_type, a_field, nodep[-1].node,		\
    +		  nodep->node);						\
    +	    }								\
    +	}								\
    +    } else {								\
    +	a_type *left = rbtn_left_get(a_type, a_field, node);		\
    +	if (left != &rbtree->rbt_nil) {					\
    +	    /* node has no successor, but it has a left child.        */\
    +	    /* Splice node out, without losing the left child.        */\
    +	    assert(rbtn_red_get(a_type, a_field, node) == false);	\
    +	    assert(rbtn_red_get(a_type, a_field, left));		\
    +	    rbtn_black_set(a_type, a_field, left);			\
    +	    if (pathp == path) {					\
    +		rbtree->rbt_root = left;				\
    +	    } else {							\
    +		if (pathp[-1].cmp < 0) {				\
    +		    rbtn_left_set(a_type, a_field, pathp[-1].node,	\
    +		      left);						\
    +		} else {						\
    +		    rbtn_right_set(a_type, a_field, pathp[-1].node,	\
    +		      left);						\
    +		}							\
    +	    }								\
    +	    return;							\
    +	} else if (pathp == path) {					\
    +	    /* The tree only contained one node. */			\
    +	    rbtree->rbt_root = &rbtree->rbt_nil;			\
    +	    return;							\
    +	}								\
    +    }									\
    +    if (rbtn_red_get(a_type, a_field, pathp->node)) {			\
    +	/* Prune red node, which requires no fixup. */			\
    +	assert(pathp[-1].cmp < 0);					\
    +	rbtn_left_set(a_type, a_field, pathp[-1].node,			\
    +	  &rbtree->rbt_nil);						\
    +	return;								\
    +    }									\
    +    /* The node to be pruned is black, so unwind until balance is     */\
    +    /* restored.                                                      */\
    +    pathp->node = &rbtree->rbt_nil;					\
    +    for (pathp--; (uintptr_t)pathp >= (uintptr_t)path; pathp--) {	\
    +	assert(pathp->cmp != 0);					\
    +	if (pathp->cmp < 0) {						\
    +	    rbtn_left_set(a_type, a_field, pathp->node,			\
    +	      pathp[1].node);						\
    +	    assert(rbtn_red_get(a_type, a_field, pathp[1].node)		\
    +	      == false);						\
    +	    if (rbtn_red_get(a_type, a_field, pathp->node)) {		\
    +		a_type *right = rbtn_right_get(a_type, a_field,		\
    +		  pathp->node);						\
    +		a_type *rightleft = rbtn_left_get(a_type, a_field,	\
    +		  right);						\
    +		a_type *tnode;						\
    +		if (rbtn_red_get(a_type, a_field, rightleft)) {		\
    +		    /* In the following diagrams, ||, //, and \\      */\
    +		    /* indicate the path to the removed node.         */\
    +		    /*                                                */\
    +		    /*      ||                                        */\
    +		    /*    pathp(r)                                    */\
    +		    /*  //        \                                   */\
    +		    /* (b)        (b)                                 */\
    +		    /*           /                                    */\
    +		    /*          (r)                                   */\
    +		    /*                                                */\
    +		    rbtn_black_set(a_type, a_field, pathp->node);	\
    +		    rbtn_rotate_right(a_type, a_field, right, tnode);	\
    +		    rbtn_right_set(a_type, a_field, pathp->node, tnode);\
    +		    rbtn_rotate_left(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		} else {						\
    +		    /*      ||                                        */\
    +		    /*    pathp(r)                                    */\
    +		    /*  //        \                                   */\
    +		    /* (b)        (b)                                 */\
    +		    /*           /                                    */\
    +		    /*          (b)                                   */\
    +		    /*                                                */\
    +		    rbtn_rotate_left(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		}							\
    +		/* Balance restored, but rotation modified subtree    */\
    +		/* root.                                              */\
    +		assert((uintptr_t)pathp > (uintptr_t)path);		\
    +		if (pathp[-1].cmp < 0) {				\
    +		    rbtn_left_set(a_type, a_field, pathp[-1].node,	\
    +		      tnode);						\
    +		} else {						\
    +		    rbtn_right_set(a_type, a_field, pathp[-1].node,	\
    +		      tnode);						\
    +		}							\
    +		return;							\
    +	    } else {							\
    +		a_type *right = rbtn_right_get(a_type, a_field,		\
    +		  pathp->node);						\
    +		a_type *rightleft = rbtn_left_get(a_type, a_field,	\
    +		  right);						\
    +		if (rbtn_red_get(a_type, a_field, rightleft)) {		\
    +		    /*      ||                                        */\
    +		    /*    pathp(b)                                    */\
    +		    /*  //        \                                   */\
    +		    /* (b)        (b)                                 */\
    +		    /*           /                                    */\
    +		    /*          (r)                                   */\
    +		    a_type *tnode;					\
    +		    rbtn_black_set(a_type, a_field, rightleft);		\
    +		    rbtn_rotate_right(a_type, a_field, right, tnode);	\
    +		    rbtn_right_set(a_type, a_field, pathp->node, tnode);\
    +		    rbtn_rotate_left(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		    /* Balance restored, but rotation modified        */\
    +		    /* subree root, which may actually be the tree    */\
    +		    /* root.                                          */\
    +		    if (pathp == path) {				\
    +			/* Set root. */					\
    +			rbtree->rbt_root = tnode;			\
    +		    } else {						\
    +			if (pathp[-1].cmp < 0) {			\
    +			    rbtn_left_set(a_type, a_field,		\
    +			      pathp[-1].node, tnode);			\
    +			} else {					\
    +			    rbtn_right_set(a_type, a_field,		\
    +			      pathp[-1].node, tnode);			\
    +			}						\
    +		    }							\
    +		    return;						\
    +		} else {						\
    +		    /*      ||                                        */\
    +		    /*    pathp(b)                                    */\
    +		    /*  //        \                                   */\
    +		    /* (b)        (b)                                 */\
    +		    /*           /                                    */\
    +		    /*          (b)                                   */\
    +		    a_type *tnode;					\
    +		    rbtn_red_set(a_type, a_field, pathp->node);		\
    +		    rbtn_rotate_left(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		    pathp->node = tnode;				\
    +		}							\
    +	    }								\
    +	} else {							\
    +	    a_type *left;						\
    +	    rbtn_right_set(a_type, a_field, pathp->node,		\
    +	      pathp[1].node);						\
    +	    left = rbtn_left_get(a_type, a_field, pathp->node);		\
    +	    if (rbtn_red_get(a_type, a_field, left)) {			\
    +		a_type *tnode;						\
    +		a_type *leftright = rbtn_right_get(a_type, a_field,	\
    +		  left);						\
    +		a_type *leftrightleft = rbtn_left_get(a_type, a_field,	\
    +		  leftright);						\
    +		if (rbtn_red_get(a_type, a_field, leftrightleft)) {	\
    +		    /*      ||                                        */\
    +		    /*    pathp(b)                                    */\
    +		    /*   /        \\                                  */\
    +		    /* (r)        (b)                                 */\
    +		    /*   \                                            */\
    +		    /*   (b)                                          */\
    +		    /*   /                                            */\
    +		    /* (r)                                            */\
    +		    a_type *unode;					\
    +		    rbtn_black_set(a_type, a_field, leftrightleft);	\
    +		    rbtn_rotate_right(a_type, a_field, pathp->node,	\
    +		      unode);						\
    +		    rbtn_rotate_right(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		    rbtn_right_set(a_type, a_field, unode, tnode);	\
    +		    rbtn_rotate_left(a_type, a_field, unode, tnode);	\
    +		} else {						\
    +		    /*      ||                                        */\
    +		    /*    pathp(b)                                    */\
    +		    /*   /        \\                                  */\
    +		    /* (r)        (b)                                 */\
    +		    /*   \                                            */\
    +		    /*   (b)                                          */\
    +		    /*   /                                            */\
    +		    /* (b)                                            */\
    +		    assert(leftright != &rbtree->rbt_nil);		\
    +		    rbtn_red_set(a_type, a_field, leftright);		\
    +		    rbtn_rotate_right(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		    rbtn_black_set(a_type, a_field, tnode);		\
    +		}							\
    +		/* Balance restored, but rotation modified subtree    */\
    +		/* root, which may actually be the tree root.         */\
    +		if (pathp == path) {					\
    +		    /* Set root. */					\
    +		    rbtree->rbt_root = tnode;				\
    +		} else {						\
    +		    if (pathp[-1].cmp < 0) {				\
    +			rbtn_left_set(a_type, a_field, pathp[-1].node,	\
    +			  tnode);					\
    +		    } else {						\
    +			rbtn_right_set(a_type, a_field, pathp[-1].node,	\
    +			  tnode);					\
    +		    }							\
    +		}							\
    +		return;							\
    +	    } else if (rbtn_red_get(a_type, a_field, pathp->node)) {	\
    +		a_type *leftleft = rbtn_left_get(a_type, a_field, left);\
    +		if (rbtn_red_get(a_type, a_field, leftleft)) {		\
    +		    /*        ||                                      */\
    +		    /*      pathp(r)                                  */\
    +		    /*     /        \\                                */\
    +		    /*   (b)        (b)                               */\
    +		    /*   /                                            */\
    +		    /* (r)                                            */\
    +		    a_type *tnode;					\
    +		    rbtn_black_set(a_type, a_field, pathp->node);	\
    +		    rbtn_red_set(a_type, a_field, left);		\
    +		    rbtn_black_set(a_type, a_field, leftleft);		\
    +		    rbtn_rotate_right(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		    /* Balance restored, but rotation modified        */\
    +		    /* subtree root.                                  */\
    +		    assert((uintptr_t)pathp > (uintptr_t)path);		\
    +		    if (pathp[-1].cmp < 0) {				\
    +			rbtn_left_set(a_type, a_field, pathp[-1].node,	\
    +			  tnode);					\
    +		    } else {						\
    +			rbtn_right_set(a_type, a_field, pathp[-1].node,	\
    +			  tnode);					\
    +		    }							\
    +		    return;						\
    +		} else {						\
    +		    /*        ||                                      */\
    +		    /*      pathp(r)                                  */\
    +		    /*     /        \\                                */\
    +		    /*   (b)        (b)                               */\
    +		    /*   /                                            */\
    +		    /* (b)                                            */\
    +		    rbtn_red_set(a_type, a_field, left);		\
    +		    rbtn_black_set(a_type, a_field, pathp->node);	\
    +		    /* Balance restored. */				\
    +		    return;						\
     		}							\
     	    } else {							\
    -		/* The predecessor is above the current node.  Unwind */\
    -		/* until a right-leaning edge is removed from the     */\
    -		/* path, or the path is empty.                        */\
    -		for (rbp_fr_depth--; rbp_fr_depth > 0; rbp_fr_depth--) {\
    -		    if (rbp_right_get(a_type, a_field,			\
    -		      rbp_fr_path[rbp_fr_depth-1])			\
    -		      == rbp_fr_path[rbp_fr_depth]) {			\
    -			break;						\
    +		a_type *leftleft = rbtn_left_get(a_type, a_field, left);\
    +		if (rbtn_red_get(a_type, a_field, leftleft)) {		\
    +		    /*               ||                               */\
    +		    /*             pathp(b)                           */\
    +		    /*            /        \\                         */\
    +		    /*          (b)        (b)                        */\
    +		    /*          /                                     */\
    +		    /*        (r)                                     */\
    +		    a_type *tnode;					\
    +		    rbtn_black_set(a_type, a_field, leftleft);		\
    +		    rbtn_rotate_right(a_type, a_field, pathp->node,	\
    +		      tnode);						\
    +		    /* Balance restored, but rotation modified        */\
    +		    /* subtree root, which may actually be the tree   */\
    +		    /* root.                                          */\
    +		    if (pathp == path) {				\
    +			/* Set root. */					\
    +			rbtree->rbt_root = tnode;			\
    +		    } else {						\
    +			if (pathp[-1].cmp < 0) {			\
    +			    rbtn_left_set(a_type, a_field,		\
    +			      pathp[-1].node, tnode);			\
    +			} else {					\
    +			    rbtn_right_set(a_type, a_field,		\
    +			      pathp[-1].node, tnode);			\
    +			}						\
     		    }							\
    +		    return;						\
    +		} else {						\
    +		    /*               ||                               */\
    +		    /*             pathp(b)                           */\
    +		    /*            /        \\                         */\
    +		    /*          (b)        (b)                        */\
    +		    /*          /                                     */\
    +		    /*        (b)                                     */\
    +		    rbtn_red_set(a_type, a_field, left);		\
     		}							\
     	    }								\
     	}								\
         }									\
    +    /* Set root. */							\
    +    rbtree->rbt_root = path->node;					\
    +    assert(rbtn_red_get(a_type, a_field, rbtree->rbt_root) == false);	\
    +}									\
    +a_attr a_type *								\
    +a_prefix##iter_recurse(a_rbt_type *rbtree, a_type *node,		\
    +  a_type *(*cb)(a_rbt_type *, a_type *, void *), void *arg) {		\
    +    if (node == &rbtree->rbt_nil) {					\
    +	return (&rbtree->rbt_nil);					\
    +    } else {								\
    +	a_type *ret;							\
    +	if ((ret = a_prefix##iter_recurse(rbtree, rbtn_left_get(a_type,	\
    +	  a_field, node), cb, arg)) != &rbtree->rbt_nil			\
    +	  || (ret = cb(rbtree, node, arg)) != NULL) {			\
    +	    return (ret);						\
    +	}								\
    +	return (a_prefix##iter_recurse(rbtree, rbtn_right_get(a_type,	\
    +	  a_field, node), cb, arg));					\
    +    }									\
    +}									\
    +a_attr a_type *								\
    +a_prefix##iter_start(a_rbt_type *rbtree, a_type *start, a_type *node,	\
    +  a_type *(*cb)(a_rbt_type *, a_type *, void *), void *arg) {		\
    +    int cmp = a_cmp(start, node);					\
    +    if (cmp < 0) {							\
    +	a_type *ret;							\
    +	if ((ret = a_prefix##iter_start(rbtree, start,			\
    +	  rbtn_left_get(a_type, a_field, node), cb, arg)) !=		\
    +	  &rbtree->rbt_nil || (ret = cb(rbtree, node, arg)) != NULL) {	\
    +	    return (ret);						\
    +	}								\
    +	return (a_prefix##iter_recurse(rbtree, rbtn_right_get(a_type,	\
    +	  a_field, node), cb, arg));					\
    +    } else if (cmp > 0) {						\
    +	return (a_prefix##iter_start(rbtree, start,			\
    +	  rbtn_right_get(a_type, a_field, node), cb, arg));		\
    +    } else {								\
    +	a_type *ret;							\
    +	if ((ret = cb(rbtree, node, arg)) != NULL) {			\
    +	    return (ret);						\
    +	}								\
    +	return (a_prefix##iter_recurse(rbtree, rbtn_right_get(a_type,	\
    +	  a_field, node), cb, arg));					\
    +    }									\
    +}									\
    +a_attr a_type *								\
    +a_prefix##iter(a_rbt_type *rbtree, a_type *start, a_type *(*cb)(	\
    +  a_rbt_type *, a_type *, void *), void *arg) {				\
    +    a_type *ret;							\
    +    if (start != NULL) {						\
    +	ret = a_prefix##iter_start(rbtree, start, rbtree->rbt_root,	\
    +	  cb, arg);							\
    +    } else {								\
    +	ret = a_prefix##iter_recurse(rbtree, rbtree->rbt_root, cb, arg);\
    +    }									\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = NULL;							\
    +    }									\
    +    return (ret);							\
    +}									\
    +a_attr a_type *								\
    +a_prefix##reverse_iter_recurse(a_rbt_type *rbtree, a_type *node,	\
    +  a_type *(*cb)(a_rbt_type *, a_type *, void *), void *arg) {		\
    +    if (node == &rbtree->rbt_nil) {					\
    +	return (&rbtree->rbt_nil);					\
    +    } else {								\
    +	a_type *ret;							\
    +	if ((ret = a_prefix##reverse_iter_recurse(rbtree,		\
    +	  rbtn_right_get(a_type, a_field, node), cb, arg)) !=		\
    +	  &rbtree->rbt_nil || (ret = cb(rbtree, node, arg)) != NULL) {	\
    +	    return (ret);						\
    +	}								\
    +	return (a_prefix##reverse_iter_recurse(rbtree,			\
    +	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
    +    }									\
    +}									\
    +a_attr a_type *								\
    +a_prefix##reverse_iter_start(a_rbt_type *rbtree, a_type *start,		\
    +  a_type *node, a_type *(*cb)(a_rbt_type *, a_type *, void *),		\
    +  void *arg) {								\
    +    int cmp = a_cmp(start, node);					\
    +    if (cmp > 0) {							\
    +	a_type *ret;							\
    +	if ((ret = a_prefix##reverse_iter_start(rbtree, start,		\
    +	  rbtn_right_get(a_type, a_field, node), cb, arg)) !=		\
    +	  &rbtree->rbt_nil || (ret = cb(rbtree, node, arg)) != NULL) {	\
    +	    return (ret);						\
    +	}								\
    +	return (a_prefix##reverse_iter_recurse(rbtree,			\
    +	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
    +    } else if (cmp < 0) {						\
    +	return (a_prefix##reverse_iter_start(rbtree, start,		\
    +	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
    +    } else {								\
    +	a_type *ret;							\
    +	if ((ret = cb(rbtree, node, arg)) != NULL) {			\
    +	    return (ret);						\
    +	}								\
    +	return (a_prefix##reverse_iter_recurse(rbtree,			\
    +	  rbtn_left_get(a_type, a_field, node), cb, arg));		\
    +    }									\
    +}									\
    +a_attr a_type *								\
    +a_prefix##reverse_iter(a_rbt_type *rbtree, a_type *start,		\
    +  a_type *(*cb)(a_rbt_type *, a_type *, void *), void *arg) {		\
    +    a_type *ret;							\
    +    if (start != NULL) {						\
    +	ret = a_prefix##reverse_iter_start(rbtree, start,		\
    +	  rbtree->rbt_root, cb, arg);					\
    +    } else {								\
    +	ret = a_prefix##reverse_iter_recurse(rbtree, rbtree->rbt_root,	\
    +	  cb, arg);							\
    +    }									\
    +    if (ret == &rbtree->rbt_nil) {					\
    +	ret = NULL;							\
    +    }									\
    +    return (ret);							\
     }
     
     #endif /* RB_H_ */
    diff --git a/lib/libc/stdlib/strfmon.c b/lib/libc/stdlib/strfmon.c
    index f12c8decce5e..6c28254472e7 100644
    --- a/lib/libc/stdlib/strfmon.c
    +++ b/lib/libc/stdlib/strfmon.c
    @@ -413,7 +413,7 @@ __setup_vars(int flags, char *cs_precedes, char *sep_by_space,
     		*cs_precedes = lc->int_n_cs_precedes;
     		*sep_by_space = lc->int_n_sep_by_space;
     		*sign_posn = (flags & PARENTH_POSN) ? 0 : lc->int_n_sign_posn;
    -		*signstr = (lc->negative_sign == '\0') ? "-"
    +		*signstr = (lc->negative_sign[0] == '\0') ? "-"
     		    : lc->negative_sign;
     	} else if (flags & USE_INTL_CURRENCY) {
     		*cs_precedes = lc->int_p_cs_precedes;
    @@ -424,7 +424,7 @@ __setup_vars(int flags, char *cs_precedes, char *sep_by_space,
     		*cs_precedes = lc->n_cs_precedes;
     		*sep_by_space = lc->n_sep_by_space;
     		*sign_posn = (flags & PARENTH_POSN) ? 0 : lc->n_sign_posn;
    -		*signstr = (lc->negative_sign == '\0') ? "-"
    +		*signstr = (lc->negative_sign[0] == '\0') ? "-"
     		    : lc->negative_sign;
     	} else {
     		*cs_precedes = lc->p_cs_precedes;
    diff --git a/lib/libc/stdlib/system.c b/lib/libc/stdlib/system.c
    index 08de63009198..4f47edffe196 100644
    --- a/lib/libc/stdlib/system.c
    +++ b/lib/libc/stdlib/system.c
    @@ -46,8 +46,7 @@ __FBSDID("$FreeBSD$");
     #include "libc_private.h"
     
     int
    -__system(command)
    -	const char *command;
    +__system(const char *command)
     {
     	pid_t pid, savedpid;
     	int pstat;
    diff --git a/lib/libc/stdtime/Makefile.inc b/lib/libc/stdtime/Makefile.inc
    index a58a8a2ae815..a039bc9ab9ab 100644
    --- a/lib/libc/stdtime/Makefile.inc
    +++ b/lib/libc/stdtime/Makefile.inc
    @@ -1,13 +1,16 @@
     #	Makefile.inc,v 1.2 1994/09/13 21:26:01 wollman Exp
     # $FreeBSD$
     
    -.PATH:	${.CURDIR}/stdtime ${.CURDIR}/../locale
    +.PATH:	${.CURDIR}/stdtime ${.CURDIR}/../locale \
    +	${.CURDIR}/../../contrib/tzcode/stdtime
     
     SRCS+=	asctime.c difftime.c localtime.c strftime.c strptime.c timelocal.c \
     	time32.c
     
     SYM_MAPS+= ${.CURDIR}/stdtime/Symbol.map
     
    +CFLAGS+= -I${.CURDIR}/../../contrib/tzcode/stdtime -I${.CURDIR}/stdtime
    +
     MAN+=	ctime.3 strftime.3 strptime.3 time2posix.3
     MAN+=	tzfile.5
     
    diff --git a/lib/libc/stdtime/strptime.3 b/lib/libc/stdtime/strptime.3
    index d763fbcab5d6..763696b0b4ca 100644
    --- a/lib/libc/stdtime/strptime.3
    +++ b/lib/libc/stdtime/strptime.3
    @@ -149,7 +149,7 @@ and 12PM
     is taken as noon.
     .Pp
     The
    -.Fa %U
    +.Fa \&%U
     and
     .Fa %W
     format specifiers accept any value within the range 00 to 53
    diff --git a/lib/libc/string/memccpy.3 b/lib/libc/string/memccpy.3
    index 350f0007c85c..40a25be4361a 100644
    --- a/lib/libc/string/memccpy.3
    +++ b/lib/libc/string/memccpy.3
    @@ -50,7 +50,9 @@ to string
     .Fa dst .
     If the character
     .Fa c
    -(as converted to an unsigned char) occurs in the string
    +(as converted to an
    +.Vt "unsigned char" )
    +occurs in the string
     .Fa src ,
     the copy stops and a pointer to the byte after the copy of
     .Fa c
    diff --git a/lib/libc/string/memchr.3 b/lib/libc/string/memchr.3
    index ae883bf0a266..6e33aef98380 100644
    --- a/lib/libc/string/memchr.3
    +++ b/lib/libc/string/memchr.3
    @@ -52,7 +52,8 @@ The
     function
     locates the first occurrence of
     .Fa c
    -(converted to an unsigned char)
    +(converted to an
    +.Vt "unsigned char" )
     in string
     .Fa b .
     .Pp
    diff --git a/lib/libc/string/memcmp.3 b/lib/libc/string/memcmp.3
    index 507b930cbc6b..88ed9a25934e 100644
    --- a/lib/libc/string/memcmp.3
    +++ b/lib/libc/string/memcmp.3
    @@ -61,7 +61,9 @@ The
     function
     returns zero if the two strings are identical,
     otherwise returns the difference between the first two differing bytes
    -(treated as unsigned char values, so that
    +(treated as
    +.Vt "unsigned char"
    +values, so that
     .Sq Li \e200
     is greater than
     .Sq Li \&\e0 ,
    diff --git a/lib/libc/string/memset.3 b/lib/libc/string/memset.3
    index 1dc287df298b..07bd7aa7d624 100644
    --- a/lib/libc/string/memset.3
    +++ b/lib/libc/string/memset.3
    @@ -52,7 +52,9 @@ writes
     .Fa len
     bytes of value
     .Fa c
    -(converted to an unsigned char) to the string
    +(converted to an
    +.Vt "unsigned char" )
    +to the string
     .Fa b .
     .Sh RETURN VALUES
     The
    diff --git a/lib/libc/string/strcat.3 b/lib/libc/string/strcat.3
    index 029099418a73..4c9fec9acbed 100644
    --- a/lib/libc/string/strcat.3
    +++ b/lib/libc/string/strcat.3
    @@ -32,11 +32,12 @@
     .\"     @(#)strcat.3	8.1 (Berkeley) 6/4/93
     .\" $FreeBSD$
     .\"
    -.Dd June 4, 1993
    +.Dd December 1, 2009
     .Dt STRCAT 3
     .Os
     .Sh NAME
    -.Nm strcat
    +.Nm strcat ,
    +.Nm strncat
     .Nd concatenate strings
     .Sh LIBRARY
     .Lb libc
    diff --git a/lib/libc/string/strcmp.3 b/lib/libc/string/strcmp.3
    index 1e13ed8b5967..74d1a5c4d18d 100644
    --- a/lib/libc/string/strcmp.3
    +++ b/lib/libc/string/strcmp.3
    @@ -75,7 +75,7 @@ The
     .Fn strcmp
     and
     .Fn strncmp
    -return an integer greater than, equal to, or less than 0, according
    +functions return an integer greater than, equal to, or less than 0, according
     as the string
     .Fa s1
     is greater than, equal to, or less than the string
    diff --git a/lib/libc/string/strndup.c b/lib/libc/string/strndup.c
    index 56aa6a83a2e9..abb1e030eeec 100644
    --- a/lib/libc/string/strndup.c
    +++ b/lib/libc/string/strndup.c
    @@ -42,9 +42,7 @@ strndup(const char *str, size_t n)
     	size_t len;
     	char *copy;
     
    -	for (len = 0; len < n && str[len]; len++)
    -		continue;
    -
    +	len = strnlen(str, n);
     	if ((copy = malloc(len + 1)) == NULL)
     		return (NULL);
     	memcpy(copy, str, len);
    diff --git a/lib/libc/string/strsignal.c b/lib/libc/string/strsignal.c
    index e4267a32f011..c51f34da9ebc 100644
    --- a/lib/libc/string/strsignal.c
    +++ b/lib/libc/string/strsignal.c
    @@ -33,22 +33,64 @@ static char sccsid[] = "@(#)strerror.c	8.1 (Berkeley) 6/4/93";
     #include 
     __FBSDID("$FreeBSD$");
     
    +#include "namespace.h"
     #if defined(NLS)
     #include 
     #endif
    -
     #include 
     #include 
    +#include 
     #include 
     #include 
    +#include "reentrant.h"
    +#include "un-namespace.h"
     
     #define	UPREFIX		"Unknown signal"
     
    +static char		sig_ebuf[NL_TEXTMAX];
    +static char		sig_ebuf_err[NL_TEXTMAX];
    +static once_t		sig_init_once = ONCE_INITIALIZER;
    +static thread_key_t	sig_key;
    +static int		sig_keycreated = 0;
    +
    +static void
    +sig_keycreate(void)
    +{
    +	sig_keycreated = (thr_keycreate(&sig_key, free) == 0);
    +}
    +
    +static char *
    +sig_tlsalloc(void)
    +{
    +	char *ebuf = NULL;
    +
    +	if (thr_main() != 0)
    +		ebuf = sig_ebuf;
    +	else {
    +		if (thr_once(&sig_init_once, sig_keycreate) != 0 ||
    +		    !sig_keycreated)
    +			goto thr_err;
    +		if ((ebuf = thr_getspecific(sig_key)) == NULL) {
    +			if ((ebuf = malloc(sizeof(sig_ebuf))) == NULL)
    +				goto thr_err;
    +			if (thr_setspecific(sig_key, ebuf) != 0) {
    +				free(ebuf);
    +				ebuf = NULL;
    +				goto thr_err;
    +			}
    +		}
    +	}
    +thr_err:
    +	if (ebuf == NULL)
    +		ebuf = sig_ebuf_err;
    +	return (ebuf);
    +}
    +
     /* XXX: negative 'num' ? (REGR) */
     char *
     strsignal(int num)
     {
    -	static char ebuf[NL_TEXTMAX];
    +	char *ebuf;
     	char tmp[20];
     	size_t n;
     	int signum;
    @@ -60,6 +102,8 @@ strsignal(int num)
     	catd = catopen("libc", NL_CAT_LOCALE);
     #endif
     
    +	ebuf = sig_tlsalloc();
    +
     	if (num > 0 && num < sys_nsig) {
     		n = strlcpy(ebuf,
     #if defined(NLS)
    @@ -67,7 +111,7 @@ strsignal(int num)
     #else
     			sys_siglist[num],
     #endif
    -			sizeof(ebuf));
    +			sizeof(sig_ebuf));
     	} else {
     		n = strlcpy(ebuf,
     #if defined(NLS)
    @@ -75,7 +119,7 @@ strsignal(int num)
     #else
     			UPREFIX,
     #endif
    -			sizeof(ebuf));
    +			sizeof(sig_ebuf));
     	}
     
     	signum = num;
    diff --git a/lib/libc/sys/Makefile.inc b/lib/libc/sys/Makefile.inc
    index 1e6059da2188..1915c550ebaf 100644
    --- a/lib/libc/sys/Makefile.inc
    +++ b/lib/libc/sys/Makefile.inc
    @@ -83,7 +83,8 @@ MAN+=	abort2.2 accept.2 access.2 acct.2 adjtime.2 \
     	mq_setattr.2 \
     	msgctl.2 msgget.2 msgrcv.2 msgsnd.2 \
     	msync.2 munmap.2 nanosleep.2 nfssvc.2 ntp_adjtime.2 open.2 \
    -	pathconf.2 pipe.2 poll.2 posix_openpt.2 profil.2 ptrace.2 quotactl.2 \
    +	pathconf.2 pipe.2 poll.2 posix_openpt.2 profil.2 \
    +	pselect.2 ptrace.2 quotactl.2 \
     	read.2 readlink.2 reboot.2 recv.2 rename.2 revoke.2 rfork.2 rmdir.2 \
     	rtprio.2
     .if !defined(NO_P1003_1B)
    diff --git a/lib/libc/sys/Symbol.map b/lib/libc/sys/Symbol.map
    index 56d8aaaa4647..ce6f32a675c5 100644
    --- a/lib/libc/sys/Symbol.map
    +++ b/lib/libc/sys/Symbol.map
    @@ -211,6 +211,7 @@ FBSD_1.0 {
     	posix_openpt;
     	preadv;
     	profil;
    +	pselect;
     	ptrace;
     	pwritev;
     	quotactl;
    @@ -769,6 +770,8 @@ FBSDprivate_1.0 {
     	__sys_olio_listio;
     	_open;
     	__sys_open;
    +	_openat;
    +	__sys_openat;
     	_pathconf;
     	__sys_pathconf;
     	_pipe;
    @@ -779,6 +782,8 @@ FBSDprivate_1.0 {
     	__sys_preadv;
     	_profil;
     	__sys_profil;
    +	_pselect;
    +	__sys_pselect;
     	_ptrace;
     	__sys_ptrace;
     	_pwritev;
    diff --git a/lib/libc/sys/__error.c b/lib/libc/sys/__error.c
    index d7b5529f999b..c3f59f8bf828 100644
    --- a/lib/libc/sys/__error.c
    +++ b/lib/libc/sys/__error.c
    @@ -39,7 +39,7 @@ extern int errno;
     __weak_reference(__error_unthreaded, __error);
     
     int *
    -__error_unthreaded()
    +__error_unthreaded(void)
     {
     	return(&errno);
     }
    diff --git a/lib/libc/sys/accept.2 b/lib/libc/sys/accept.2
    index 4387dc65a8fa..df6c0b15d8c9 100644
    --- a/lib/libc/sys/accept.2
    +++ b/lib/libc/sys/accept.2
    @@ -126,6 +126,10 @@ new socket.
     For some applications, performance may be enhanced by using an
     .Xr accept_filter 9
     to pre-process incoming connections.
    +.Pp
    +Portable programs should not rely on the
    +.Dv O_NONBLOCK
    +property being inherited.
     .Sh RETURN VALUES
     The call returns \-1 on error.
     If it succeeds, it returns a non-negative
    diff --git a/lib/libc/sys/clock_gettime.2 b/lib/libc/sys/clock_gettime.2
    index 242af1c702fb..a2fa62490ecc 100644
    --- a/lib/libc/sys/clock_gettime.2
    +++ b/lib/libc/sys/clock_gettime.2
    @@ -29,7 +29,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd November 4, 2006
    +.Dd December 29, 2009
     .Dt CLOCK_GETTIME 2
     .Os
     .Sh NAME
    @@ -59,21 +59,43 @@ used by a clock which is specified by
     The
     .Fa clock_id
     argument
    -can be one of five values:
    -.Dv CLOCK_REALTIME
    +can be one of the following values:
    +.Dv CLOCK_REALTIME ,
    +.Dv CLOCK_REALTIME_PRECISE ,
    +.Dv CLOCK_REALTIME_FAST
     for time that increments as
    -a wall clock should,
    -.Dv CLOCK_MONOTONIC
    -which increments in SI seconds,
    -.Dv CLOCK_UPTIME
    +a wall clock should;
    +.Dv CLOCK_MONOTONIC ,
    +.Dv CLOCK_MONOTONIC_PRECISE ,
    +.Dv CLOCK_MONOTONIC_FAST
    +which increments in SI seconds;
    +.Dv CLOCK_UPTIME ,
    +.Dv CLOCK_UPTIME_PRECISE ,
    +.Dv CLOCK_UPTIME_FAST
     which starts at zero when the kernel boots and increments
    -monotonically in SI seconds while the machine is running,
    +monotonically in SI seconds while the machine is running;
     .Dv CLOCK_VIRTUAL
     for time that increments only when
    -the CPU is running in user mode on behalf of the calling process, or
    +the CPU is running in user mode on behalf of the calling process;
     .Dv CLOCK_PROF
     for time that increments when the CPU is running in user or
    -kernel mode.
    +kernel mode; or
    +.Dv CLOCK_SECOND
    +which returns the current second without performing a full time counter
    +query, using in-kernel cached value of current second.
    +.Pp
    +The clock IDs
    +.Fa CLOCK_REALTIME_FAST ,
    +.Fa CLOCK_MONOTONIC_FAST ,
    +.Fa CLOCK_UPTIME_FAST
    +are analogs of corresponding IDs without _FAST suffix but do not perform
    +a full time counter query, so their accuracy is one timer tick.
    +Similarly,
    +.Fa CLOCK_REALTIME_PRECISE ,
    +.Fa CLOCK_MONOTONIC_PRECISE ,
    +.Fa CLOCK_UPTIME_PRECISE
    +are used to get the most exact value as possible, at the expense of
    +execution time.
     .Pp
     The structure pointed to by
     .Fa tp
    @@ -88,7 +110,8 @@ struct timespec {
     };
     .Ed
     .Pp
    -Only the super-user may set the time of day.
    +Only the super-user may set the time of day, using only
    +.Fa CLOCK_REALTIME .
     If the system securelevel is greater than 1 (see
     .Xr init 8 ) ,
     the time may only be advanced.
    @@ -134,3 +157,13 @@ and
     .Fn clock_getres
     system calls conform to
     .St -p1003.1b-93 .
    +The clock IDs
    +.Fa CLOCK_REALTIME_FAST ,
    +.Fa CLOCK_REALTIME_PRECISE ,
    +.Fa CLOCK_MONOTONIC_FAST ,
    +.Fa CLOCK_MONOTONIC_PRECISE ,
    +.Fa CLOCK_UPTIME ,
    +.Fa CLOCK_UPTIME_FAST ,
    +.Fa CLOCK_UPTIME_PRECISE ,
    +.Fa CLOCK_SECOND
    +are FreeBSD extensions to the POSIX interface.
    diff --git a/lib/libc/sys/cpuset.2 b/lib/libc/sys/cpuset.2
    index c07f8d9a7812..1cdff680f0d9 100644
    --- a/lib/libc/sys/cpuset.2
    +++ b/lib/libc/sys/cpuset.2
    @@ -25,7 +25,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd March 29, 2008
    +.Dd January 8, 2010
     .Dt CPUSET 2
     .Os
     .Sh NAME
    @@ -96,7 +96,7 @@ The
     .Fa which
     argument may have the following values:
     .Bl -column CPU_WHICH_CPUSET -offset indent
    -.It Dv CPU_WHICH_TID Ta "id is lpwid_t (thread id)"
    +.It Dv CPU_WHICH_TID Ta "id is lwpid_t (thread id)"
     .It Dv CPU_WHICH_PID Ta "id is pid_t (process id)"
     .It Dv CPU_WHICH_CPUSET Ta "id is a cpusetid_t (cpuset id)"
     .It Dv CPU_WHICH_IRQ Ta "id is an irq number"
    @@ -209,14 +209,16 @@ The calling process did not have the credentials required to complete the
     operation.
     .It Bq Er ENFILE
     There was no free
    -.Fn cpusetid_t
    +.Ft cpusetid_t
     for allocation.
     .El
     .Sh SEE ALSO
     .Xr cpuset 1 ,
     .Xr cpuset_getaffinity 2 ,
     .Xr cpuset_setaffinity 2 ,
    -.Xr CPU_SET 3
    +.Xr CPU_SET 3 ,
    +.Xr pthread_affinity_np 3 ,
    +.Xr pthread_attr_affinity_np 3
     .Sh HISTORY
     The
     .Nm
    diff --git a/lib/libc/sys/cpuset_getaffinity.2 b/lib/libc/sys/cpuset_getaffinity.2
    index b065ac362da0..c8b272f0aeff 100644
    --- a/lib/libc/sys/cpuset_getaffinity.2
    +++ b/lib/libc/sys/cpuset_getaffinity.2
    @@ -25,7 +25,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd November 29, 2008
    +.Dd January 8, 2010
     .Dt CPUSET 2
     .Os
     .Sh NAME
    @@ -147,7 +147,9 @@ operation.
     .Xr cpuset 2 ,
     .Xr cpuset_getid 2 ,
     .Xr cpuset_setid 2 ,
    -.Xr CPU_SET 3
    +.Xr CPU_SET 3 ,
    +.Xr pthread_affinity_np 3 ,
    +.Xr pthread_attr_affinity_np 3
     .Sh HISTORY
     The
     .Nm
    diff --git a/lib/libc/sys/fcntl.2 b/lib/libc/sys/fcntl.2
    index a16724c9e0b8..250cef46d5d1 100644
    --- a/lib/libc/sys/fcntl.2
    +++ b/lib/libc/sys/fcntl.2
    @@ -28,7 +28,7 @@
     .\"     @(#)fcntl.2	8.2 (Berkeley) 1/12/94
     .\" $FreeBSD$
     .\"
    -.Dd March 8, 2008
    +.Dd September 28, 2009
     .Dt FCNTL 2
     .Os
     .Sh NAME
    @@ -241,6 +241,22 @@ will be interrupted if the signal handler has not specified the
     .Dv SA_RESTART
     (see
     .Xr sigaction 2 ) .
    +.It Dv F_READAHEAD
    +Set or clear the read ahead amount for sequential access to the third
    +argument,
    +.Fa arg ,
    +which is rounded up to the nearest block size.
    +A zero value in
    +.Fa arg
    +turns off read ahead.
    +.It Dv F_RDAHEAD
    +Equivalent to Darwin counterpart which sets read ahead amount of 128KB
    +when the third argument,
    +.Fa arg
    +is non-zero.
    +A zero value in
    +.Fa arg
    +turns off read ahead.
     .El
     .Pp
     When a shared lock has been set on a segment of a file,
    diff --git a/lib/libc/sys/intro.2 b/lib/libc/sys/intro.2
    index 1c01c3937e7a..e5ff9df77d21 100644
    --- a/lib/libc/sys/intro.2
    +++ b/lib/libc/sys/intro.2
    @@ -456,6 +456,17 @@ The specified extended attribute does not exist.
     .It Er 88 EDOOFUS Em "Programming error" .
     A function or API is being abused in a way which could only be detected
     at run-time.
    +.It Er 89 EBADMSG Em "Bad message" .
    +A corrupted message was detected.
    +.It Er 90 EMULTIHOP Em "Multihop attempted" .
    +This error code is unused, but present for compatibility with other systems.
    +.It Er 91 ENOLINK Em "Link has been severed" .
    +This error code is unused, but present for compatibility with other systems.
    +.It Er 92 EPROTO Em "Protocol error" .
    +A device or socket encountered an unrecoverable protocol error.
    +.It Er 93 ENOTCAPABLE Em "Capabilities insufficient" .
    +An operation on a capability file descriptor requires greater privilege than
    +the capability allows.
     .El
     .Sh DEFINITIONS
     .Bl -tag -width Ds
    diff --git a/lib/libc/sys/kqueue.2 b/lib/libc/sys/kqueue.2
    index e899a1befe8f..326632d440aa 100644
    --- a/lib/libc/sys/kqueue.2
    +++ b/lib/libc/sys/kqueue.2
    @@ -438,19 +438,6 @@ There is a system wide limit on the number of timers
     which is controlled by the
     .Va kern.kq_calloutmax
     sysctl.
    -.It Dv EVFILT_NETDEV
    -Takes a descriptor to a network interface as the identifier, and the events to watch for in
    -.Va fflags .
    -It returns, when one or more of the requested events occur on the descriptor.
    -The events to monitor are:
    -.Bl -tag -width XXNOTE_LINKDOWN
    -.It Dv NOTE_LINKUP
    -The link is up.
    -.It Dv NOTE_LINKDOWN
    -The link is down.
    -.It Dv NOTE_LINKINV
    -The link state is invalid.
    -.El
     .Pp
     On return,
     .Va fflags
    @@ -595,13 +582,6 @@ system and this manual page were written by
     .An Jonathan Lemon Aq jlemon@FreeBSD.org .
     .Sh BUGS
     The
    -.Dv EVFILT_NETDEV
    -filter is currently only implemented for devices that use the
    -.Xr miibus 4
    -driver for LINKUP and LINKDOWN operations.
    -Therefore, it will not work with many non-ethernet devices.
    -.Pp
    -The
     .Fa timeout
     value is limited to 24 hours; longer timeouts will be silently
     reinterpreted as 24 hours.
    diff --git a/lib/libc/sys/mmap.2 b/lib/libc/sys/mmap.2
    index e63274808d51..48499731b58b 100644
    --- a/lib/libc/sys/mmap.2
    +++ b/lib/libc/sys/mmap.2
    @@ -28,7 +28,7 @@
     .\"	@(#)mmap.2	8.4 (Berkeley) 5/11/95
     .\" $FreeBSD$
     .\"
    -.Dd July 26, 2009
    +.Dd November 6, 2009
     .Dt MMAP 2
     .Os
     .Sh NAME
    @@ -108,6 +108,10 @@ The
     argument is ignored.
     .\".It Dv MAP_FILE
     .\"Mapped from a regular file or character-special device memory.
    +.It Dv MAP_ANONYMOUS
    +This flag is identical to
    +.Dv MAP_ANON
    +and is provided for compatibility.
     .It Dv MAP_FIXED
     Do not permit the system to select a different address than the one
     specified.
    diff --git a/lib/libc/sys/mount.2 b/lib/libc/sys/mount.2
    index 6ce2d4d2fa74..b65c1b625929 100644
    --- a/lib/libc/sys/mount.2
    +++ b/lib/libc/sys/mount.2
    @@ -28,7 +28,7 @@
     .\"     @(#)mount.2	8.3 (Berkeley) 5/24/95
     .\" $FreeBSD$
     .\"
    -.Dd February 23, 2005
    +.Dd January 26, 2010
     .Dt MOUNT 2
     .Os
     .Sh NAME
    @@ -368,5 +368,9 @@ and
     .Fn unmount
     functions appeared in
     .At v6 .
    +The
    +.Fn nmount
    +system call first appeared in
    +.Fx 5.0 .
     .Sh BUGS
     Some of the error codes need translation to more obvious messages.
    diff --git a/lib/libc/sys/nanosleep.2 b/lib/libc/sys/nanosleep.2
    index 18e4c88af497..f50544b83d69 100644
    --- a/lib/libc/sys/nanosleep.2
    +++ b/lib/libc/sys/nanosleep.2
    @@ -47,7 +47,9 @@
     The
     .Fn nanosleep
     system call
    -causes the process to sleep for the specified time.
    +causes the calling thread to sleep until the time interval specified by
    +.Fa rqtp
    +has elapsed.
     An unmasked signal will
     cause it to terminate the sleep early, regardless of the
     .Dv SA_RESTART
    diff --git a/lib/libc/gen/pselect.3 b/lib/libc/sys/pselect.2
    similarity index 95%
    rename from lib/libc/gen/pselect.3
    rename to lib/libc/sys/pselect.2
    index a56a0a80a884..cf784a5dcd7f 100644
    --- a/lib/libc/gen/pselect.3
    +++ b/lib/libc/sys/pselect.2
    @@ -28,8 +28,8 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd June 16, 2002
    -.Dt PSELECT 3
    +.Dd October 27, 2009
    +.Dt PSELECT 2
     .Os
     .Sh NAME
     .Nm pselect
    @@ -88,11 +88,6 @@ for a more detailed discussion of the semantics of this interface, and
     for macros used to manipulate the
     .Vt "fd_set"
     data type.
    -.Sh IMPLEMENTATION NOTES
    -The
    -.Fn pselect
    -function is implemented in the C library as a wrapper around
    -.Fn select .
     .Sh RETURN VALUES
     The
     .Fn pselect
    @@ -121,7 +116,7 @@ The
     function first appeared in
     .Fx 5.0 .
     .Sh AUTHORS
    -The
    +The first implementation of
     .Fn pselect
     function and this manual page were written by
     .An Garrett Wollman Aq wollman@FreeBSD.org .
    diff --git a/lib/libc/sys/ptrace.2 b/lib/libc/sys/ptrace.2
    index 9d8f5507c41f..8265fb638b46 100644
    --- a/lib/libc/sys/ptrace.2
    +++ b/lib/libc/sys/ptrace.2
    @@ -2,7 +2,7 @@
     .\"	$NetBSD: ptrace.2,v 1.2 1995/02/27 12:35:37 cgd Exp $
     .\"
     .\" This file is in the public domain.
    -.Dd March 27, 2009
    +.Dd February 11, 2010
     .Dt PTRACE 2
     .Os
     .Sh NAME
    @@ -327,6 +327,68 @@ This request will trace the specified process on each system call exit.
     .It PT_SYSCALL
     This request will trace the specified process
     on each system call entry and exit.
    +.It PT_VM_TIMESTAMP
    +This request returns the generation number or timestamp of the memory map of
    +the traced process as the return value from
    +.Fn ptrace .
    +This provides a low-cost way for the tracing process to determine if the
    +VM map changed since the last time this request was made.
    +.It PT_VM_ENTRY
    +This request is used to iterate over the entries of the VM map of the traced
    +process.
    +The
    +.Fa addr
    +argument specifies a pointer to a 
    +.Vt "struct ptrace_vm_entry" ,
    +which is defined as follows:
    +.Bd -literal
    +struct ptrace_vm_entry {
    +	int		pve_entry;
    +	int		pve_timestamp;
    +	u_long		pve_start;
    +	u_long		pve_end;
    +	u_long		pve_offset;
    +	u_int		pve_prot;
    +	u_int		pve_pathlen;
    +	long		pve_fileid;
    +	uint32_t	pve_fsid;
    +	char		*pve_path;
    +};
    +.Ed
    +.Pp
    +The first entry is returned by setting
    +.Va pve_entry
    +to zero.
    +Subsequent entries are returned by leaving
    +.Va pve_entry
    +unmodified from the value returned by previous requests.
    +The
    +.Va pve_timestamp
    +field can be used to detect changes to the VM map while iterating over the
    +entries.
    +The tracing process can then take appropriate action, such as restarting.
    +By setting
    +.Va pve_pathlen
    +to a non-zero value on entry, the pathname of the backing object is returned
    +in the buffer pointed to by
    +.Va pve_path ,
    +provided the entry is backed by a vnode.
    +The
    +.Va pve_pathlen
    +field is updated with the actual length of the pathname (including the
    +terminating null character).
    +The
    +.Va pve_offset
    +field is the offset within the backing object at which the range starts.
    +The range is located in the VM space at
    +.Va pve_start
    +and extends up to
    +.Va pve_end
    +(inclusive).
    +.Pp
    +The
    +.Fa data
    +argument is ignored.
     .El
     .Pp
     Additionally, machine-specific requests can exist.
    @@ -376,6 +438,11 @@ or
     .Dv PT_SETDBREGS
     was attempted on a process with no valid register set.
     (This is normally true only of system processes.)
    +.It
    +.Dv PT_VM_ENTRY
    +was given an invalid value for
    +.Fa pve_entry .
    +This can also be caused by changes to the VM map of the process.
     .El
     .It Bq Er EBUSY
     .Bl -bullet -compact
    @@ -405,6 +472,22 @@ on a process in violation of the requirements listed under
     .Dv PT_ATTACH
     above.
     .El
    +.It Bq Er ENOENT
    +.Bl -bullet -compact
    +.It
    +.Dv PT_VM_ENTRY
    +previously returned the last entry of the memory map.
    +No more entries exist.
    +.El
    +.It Bq Er ENAMETOOLONG
    +.Bl -bullet -compact
    +.It
    +.Dv PT_VM_ENTRY
    +cannot return the pathname of the backing object because the buffer is not big
    +enough.
    +.Fa pve_pathlen
    +holds the minimum buffer size required on return.
    +.El
     .El
     .Sh SEE ALSO
     .Xr execve 2 ,
    diff --git a/lib/libc/sys/sctp_generic_recvmsg.2 b/lib/libc/sys/sctp_generic_recvmsg.2
    index ccdb9db6fade..d6fd1b564de2 100644
    --- a/lib/libc/sys/sctp_generic_recvmsg.2
    +++ b/lib/libc/sys/sctp_generic_recvmsg.2
    @@ -36,7 +36,7 @@
     .Os
     .Sh NAME
     .Nm sctp_generic_recvmsg
    -.Nd receive data from a peer.
    +.Nd receive data from a peer
     .Sh LIBRARY
     .Lb libc
     .Sh SYNOPSIS
    @@ -46,16 +46,20 @@
     .Ft int
     .Fn sctp_generic_recvmsg "int s" "struct iovec *iov" "int iovlen" "struct sockaddr *from" "socklen_t *fromlen" "struct sctp_sndrcvinfo *sinfo" "int *msgflags"
     .Sh DESCRIPTION
    -The
     .Fn sctp_generic_recvmsg
    -is the true system calls used by the
    -.Fn sctp_recvmsg
    -function call. This call is more efficient since it is a
    -true system calls but it is specific to FreeBSD and
    -can be expected NOT to be present on any other Operating
    -System. For detailed useage please see either the
    -.Fn sctp_recvmsg 
    -function call. 
    +is the true system call used by the
    +.Xr sctp_recvmsg 3
    +function call.
    +This call is more efficient since it is a
    +true system call but it is specific to
    +.Fx
    +and can be expected
    +.Em not
    +to be present on any other operating
    +system.
    +For detailed usage please see the
    +.Xr sctp_recvmsg 3
    +function call.
     .Sh RETURN VALUES
     The call returns the number of bytes read on success and -1 upon failure.
     .Sh ERRORS
    diff --git a/lib/libc/sys/sctp_generic_sendmsg.2 b/lib/libc/sys/sctp_generic_sendmsg.2
    index d7050f22fe47..fee4211a9e69 100644
    --- a/lib/libc/sys/sctp_generic_sendmsg.2
    +++ b/lib/libc/sys/sctp_generic_sendmsg.2
    @@ -37,7 +37,7 @@
     .Sh NAME
     .Nm sctp_generic_sendmsg
     .Nm sctp_generic_sendmsg_iov
    -.Nd send data to a peer.
    +.Nd send data to a peer
     .Sh LIBRARY
     .Lb libc
     .Sh SYNOPSIS
    @@ -49,21 +49,25 @@
     .Ft int
     .Fn sctp_generic_sendmsg_iov "int s" "struct iovec *iov" "int iovlen" "struct sockaddr *to" "struct sctp_sndrcvinfo *sinfo" "int flags"
     .Sh DESCRIPTION
    -The
     .Fn sctp_generic_sendmsg
     and
     .Fn sctp_generic_sendmsg_iov
     are the true system calls used by the
    -.Fn sctp_sendmsg
    +.Xr sctp_sendmsg 3
     and 
    -.Fn sctp_send
    -function calls. These are more efficient since they are
    -true system calls but they are specific to FreeBSD and
    -can be expected NOT to be present on any other Operating
    -System. For detailed useage please see either the
    -.Fn sctp_send
    +.Xr sctp_send 3
    +function calls.
    +These are more efficient since they are
    +true system calls but they are specific to
    +.Fx
    +and can be expected
    +.Em not
    +to be present on any other operating
    +system.
    +For detailed usage please see either the
    +.Xr sctp_send 3
     or
    -.Fn sctp_sendmsg
    +.Xr sctp_sendmsg 3
     function calls. 
     .Sh RETURN VALUES
     The call returns the number of bytes written on success and -1 upon failure.
    diff --git a/lib/libc/sys/sctp_peeloff.2 b/lib/libc/sys/sctp_peeloff.2
    index 0ac5be6aa827..c513afaa12b2 100644
    --- a/lib/libc/sys/sctp_peeloff.2
    +++ b/lib/libc/sys/sctp_peeloff.2
    @@ -36,7 +36,7 @@
     .Os
     .Sh NAME
     .Nm sctp_peeloff
    -.Nd detach an association from a one-to-many socket to its on fd
    +.Nd detach an association from a one-to-many socket to its own fd
     .Sh LIBRARY
     .Lb libc
     .Sh SYNOPSIS
    @@ -58,7 +58,7 @@ upon success.
     .Sh ERRORS
     The
     .Fn sctp_peeloff
    -can return the following errors.
    +system call can return the following errors:
     .Bl -tag -width Er
     .It Bq Er ENOTCONN
     The 
    diff --git a/lib/libc/sys/sendfile.2 b/lib/libc/sys/sendfile.2
    index 322971f0080f..d9f8cab56730 100644
    --- a/lib/libc/sys/sendfile.2
    +++ b/lib/libc/sys/sendfile.2
    @@ -25,7 +25,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd November 24, 2006
    +.Dd January 7, 2010
     .Dt SENDFILE 2
     .Os
     .Sh NAME
    @@ -116,9 +116,17 @@ Busy servers may benefit by transferring requests that would
     block to a separate I/O worker thread.
     .It
     .Dv SF_MNOWAIT .
    -(description missing)
    +Do not wait for some kernel resource to become available,
    +in particular,
    +.Vt mbuf
    +and
    +.Vt sf_buf .
    +The flag does not make the
    +.Fn sendfile
    +syscall truly non-blocking, since other resources are still allocated
    +in a blocking fashion.
     .It
    -.Dv SF_SYNC ,
    +.Dv SF_SYNC .
     .Nm
     sleeps until the network stack no longer references the VM pages
     of the file, making subsequent modifications to it safe.
    diff --git a/lib/libc/sys/setpgid.2 b/lib/libc/sys/setpgid.2
    index a56d83123d39..4ad89de3263f 100644
    --- a/lib/libc/sys/setpgid.2
    +++ b/lib/libc/sys/setpgid.2
    @@ -54,6 +54,11 @@ to the specified
     If
     .Fa pid
     is zero, then the call applies to the current process.
    +If
    +.Fa pgrp
    +is zero, then the process id of the process specified by
    +.Fa pid
    +is used instead.
     .Pp
     If the affected process is not the invoking process, then it must be a
     child of the invoking process, it must not have performed an
    diff --git a/lib/libc/sys/shm_open.2 b/lib/libc/sys/shm_open.2
    index 5c5d6947e7e6..a586fe33199b 100644
    --- a/lib/libc/sys/shm_open.2
    +++ b/lib/libc/sys/shm_open.2
    @@ -39,6 +39,7 @@
     .Sh SYNOPSIS
     .In sys/types.h
     .In sys/mman.h
    +.In fcntl.h
     .Ft int
     .Fn shm_open "const char *path" "int flags" "mode_t mode"
     .Ft int
    diff --git a/lib/libc/sys/unlink.2 b/lib/libc/sys/unlink.2
    index 41a2288a5865..141f3d320e59 100644
    --- a/lib/libc/sys/unlink.2
    +++ b/lib/libc/sys/unlink.2
    @@ -114,6 +114,8 @@ succeeds unless:
     .Bl -tag -width Er
     .It Bq Er ENOTDIR
     A component of the path prefix is not a directory.
    +.It Bq Er EISDIR
    +The named file is a directory.
     .It Bq Er ENAMETOOLONG
     A component of a pathname exceeded 255 characters,
     or an entire path name exceeded 1023 characters.
    diff --git a/lib/libc/sys/vfork.2 b/lib/libc/sys/vfork.2
    index 928130b5d78a..3cd33686edc5 100644
    --- a/lib/libc/sys/vfork.2
    +++ b/lib/libc/sys/vfork.2
    @@ -28,12 +28,12 @@
     .\"     @(#)vfork.2	8.1 (Berkeley) 6/4/93
     .\" $FreeBSD$
     .\"
    -.Dd June 4, 1993
    +.Dd November 13, 2009
     .Dt VFORK 2
     .Os
     .Sh NAME
     .Nm vfork
    -.Nd spawn new process in a virtual memory efficient way
    +.Nd create a new process without copying the address space
     .Sh LIBRARY
     .Lb libc
     .Sh SYNOPSIS
    @@ -113,14 +113,6 @@ The
     system call appeared in
     .Bx 2.9 .
     .Sh BUGS
    -This system call will be eliminated when proper system sharing
    -mechanisms are implemented.
    -Users should not depend on the memory
    -sharing semantics of
    -.Fn vfork
    -as it will, in that case, be made synonymous to
    -.Xr fork 2 .
    -.Pp
     To avoid a possible deadlock situation,
     processes that are children in the middle
     of a
    diff --git a/lib/libc/sys/wait.2 b/lib/libc/sys/wait.2
    index c492cd62ebb0..2e084d2686dc 100644
    --- a/lib/libc/sys/wait.2
    +++ b/lib/libc/sys/wait.2
    @@ -44,10 +44,10 @@
     .In sys/wait.h
     .Ft pid_t
     .Fn wait "int *status"
    -.In sys/time.h
    -.In sys/resource.h
     .Ft pid_t
     .Fn waitpid "pid_t wpid" "int *status" "int options"
    +.In sys/time.h
    +.In sys/resource.h
     .Ft pid_t
     .Fn wait3 "int *status" "int options" "struct rusage *rusage"
     .Ft pid_t
    diff --git a/lib/libc/yp/yplib.c b/lib/libc/yp/yplib.c
    index eb5c34c1670b..87d16ddece1f 100644
    --- a/lib/libc/yp/yplib.c
    +++ b/lib/libc/yp/yplib.c
    @@ -241,7 +241,7 @@ static bool_t
     ypmatch_cache_lookup(struct dom_binding *ypdb, char *map, keydat *key,
         valdat *val)
     {
    -	struct ypmatch_ent	*c = ypdb->cache;
    +	struct ypmatch_ent	*c;
     
     	ypmatch_cache_expire(ypdb);
     
    diff --git a/lib/libc_r/Makefile b/lib/libc_r/Makefile
    index 0b286f2161df..a42487645451 100644
    --- a/lib/libc_r/Makefile
    +++ b/lib/libc_r/Makefile
    @@ -10,10 +10,6 @@
     
     .include 
     
    -.if ${DEFAULT_THREAD_LIB} == "libc_r" && ${SHLIBDIR} == "/usr/lib"
    -SHLIBDIR= /lib
    -.endif
    -
     LIB=c_r
     SHLIB_MAJOR= 7
     CFLAGS+=-DPTHREAD_KERNEL 
    @@ -32,16 +28,4 @@ PRECIOUSLIB=
     .include "${.CURDIR}/uthread/Makefile.inc"
     .include "${.CURDIR}/sys/Makefile.inc"
     
    -.if ${DEFAULT_THREAD_LIB} == "libc_r"
    -.if ${MK_INSTALLLIB} != "no"
    -SYMLINKS+=lib${LIB}.a ${LIBDIR}/libpthread.a
    -.endif
    -.if !defined(NO_PIC)
    -SYMLINKS+=lib${LIB}.so ${LIBDIR}/libpthread.so
    -.endif
    -.if ${MK_PROFILE} != "no"
    -SYMLINKS+=lib${LIB}_p.a ${LIBDIR}/libpthread_p.a
    -.endif
    -.endif
    -
     .include 
    diff --git a/lib/libcalendar/Makefile b/lib/libcalendar/Makefile
    index 8bba20b726ba..b0ae002fd5e9 100644
    --- a/lib/libcalendar/Makefile
    +++ b/lib/libcalendar/Makefile
    @@ -1,7 +1,6 @@
     # $FreeBSD$
     
     LIB=	calendar
    -WARNS?=	2
     
     SRCS=	calendar.c easter.c
     INCS=	calendar.h
    diff --git a/lib/libcam/Makefile b/lib/libcam/Makefile
    index 2bbad9ab6fce..1f819d085900 100644
    --- a/lib/libcam/Makefile
    +++ b/lib/libcam/Makefile
    @@ -11,6 +11,7 @@ LDADD=		-lsbuf
     
     MAN=		cam.3 cam_cdbparse.3
     
    +WARNS?=		2
     
     MLINKS+=	cam.3 cam_open_device.3 \
     		cam.3 cam_open_spec_device.3 \
    diff --git a/lib/libcompat/Makefile b/lib/libcompat/Makefile
    index 106bab970af4..2ca46f0eb57b 100644
    --- a/lib/libcompat/Makefile
    +++ b/lib/libcompat/Makefile
    @@ -5,6 +5,8 @@ LIB=compat
     CFLAGS+=-DLIBC_SCCS -DSYSLIBC_SCCS -I${.CURDIR}/../libc/locale
     NO_PIC=
     
    +WARNS?=	1
    +
     .PATH:	${.CURDIR}/4.1/${MACHINE_ARCH} ${.CURDIR}/4.1 \
     	${.CURDIR}/4.3/${MACHINE_ARCH} ${.CURDIR}/4.3 \
     	${.CURDIR}/4.4/${MACHINE_ARCH} ${.CURDIR}/4.4 \
    diff --git a/lib/libcrypt/Makefile b/lib/libcrypt/Makefile
    index be0826dc99e7..285f6728203d 100644
    --- a/lib/libcrypt/Makefile
    +++ b/lib/libcrypt/Makefile
    @@ -33,6 +33,8 @@ SRCS+=		auth.c property.c
     CFLAGS+=	-D${sym}=__${sym}
     .endfor
     
    +WARNS?=		2
    +
     PRECIOUSLIB=
     
     .include 
    diff --git a/lib/libdevinfo/Makefile b/lib/libdevinfo/Makefile
    index 0615195f9385..9e755d73b0d4 100644
    --- a/lib/libdevinfo/Makefile
    +++ b/lib/libdevinfo/Makefile
    @@ -5,4 +5,6 @@ SRCS=	devinfo.c
     INCS=	devinfo.h
     MAN=	devinfo.3
     
    +WARNS?=	3
    +
     .include 
    diff --git a/lib/libdevinfo/devinfo.h b/lib/libdevinfo/devinfo.h
    index 3e580f20d502..2b497431909d 100644
    --- a/lib/libdevinfo/devinfo.h
    +++ b/lib/libdevinfo/devinfo.h
    @@ -32,20 +32,12 @@
     
     #include 
     #include 
    +#include 
     
     typedef __uintptr_t	devinfo_handle_t;
     #define DEVINFO_ROOT_DEVICE	((devinfo_handle_t)0)
     
    -/*
    - * State of the device.
    - */
    -/* XXX not sure if I want a copy here, or expose sys/bus.h */
    -typedef enum devinfo_state {
    -	DIS_NOTPRESENT = 10,		/* not probed or probe failed */
    -	DIS_ALIVE = 20,			/* probe succeeded */
    -	DIS_ATTACHED = 30,		/* attach method called */
    -	DIS_BUSY = 40			/* device is open */
    -} devinfo_state_t;
    +typedef enum device_state devinfo_state_t;
     
     struct devinfo_dev {
     	devinfo_handle_t	dd_handle;	/* device handle */
    diff --git a/lib/libdevstat/Makefile b/lib/libdevstat/Makefile
    index c6233c2331a8..aeb07b9f0647 100644
    --- a/lib/libdevstat/Makefile
    +++ b/lib/libdevstat/Makefile
    @@ -33,6 +33,6 @@ MLINKS+=devstat.3 compute_etime.3
     
     CFLAGS+=-I${.CURDIR}
     
    -WARNS?=	2
    +WARNS?=	3
     
     .include 
    diff --git a/lib/libdwarf/Makefile b/lib/libdwarf/Makefile
    index 9a1a5498efca..1375a92dd450 100644
    --- a/lib/libdwarf/Makefile
    +++ b/lib/libdwarf/Makefile
    @@ -19,12 +19,10 @@ SRCS=	\
     
     INCS=	dwarf.h libdwarf.h
     
    -CFLAGS+=	-I. -I${.CURDIR}
    +CFLAGS+=	-I${.CURDIR}
     
     SHLIB_MAJOR=	2
     
    -WARNS?=	6
    -
    -WITHOUT_MAN=	yes
    +WITHOUT_MAN=
     
     .include 
    diff --git a/lib/libedit/Makefile b/lib/libedit/Makefile
    index ece60329bac8..97c1f920787b 100644
    --- a/lib/libedit/Makefile
    +++ b/lib/libedit/Makefile
    @@ -35,6 +35,8 @@ CFLAGS+= -I. -I${.CURDIR}
     CFLAGS+= #-DDEBUG_TTY -DDEBUG_KEY -DDEBUG_READ -DDEBUG -DDEBUG_REFRESH
     CFLAGS+= #-DDEBUG_PASTE -DDEBUG_EDIT
     
    +WARNS?=	1
    +
     AHDR=	vi.h emacs.h common.h
     ASRC=	${.CURDIR}/vi.c ${.CURDIR}/emacs.c ${.CURDIR}/common.c
     
    diff --git a/lib/libedit/editline.3 b/lib/libedit/editline.3
    index 7ed5e383783b..d5dfff5e7a4b 100644
    --- a/lib/libedit/editline.3
    +++ b/lib/libedit/editline.3
    @@ -13,9 +13,6 @@
     .\" 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. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/lib/libedit/editrc.5 b/lib/libedit/editrc.5
    index 8428fea86d14..4b1d4148b8d8 100644
    --- a/lib/libedit/editrc.5
    +++ b/lib/libedit/editrc.5
    @@ -13,9 +13,6 @@
     .\" 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. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/lib/libedit/read.h b/lib/libedit/read.h
    index 18de818ffbe5..1dcf16429a48 100644
    --- a/lib/libedit/read.h
    +++ b/lib/libedit/read.h
    @@ -13,9 +13,6 @@
      * 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. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/lib/libefi/Makefile b/lib/libefi/Makefile
    new file mode 100644
    index 000000000000..16aa3e7e224b
    --- /dev/null
    +++ b/lib/libefi/Makefile
    @@ -0,0 +1,22 @@
    +# $FreeBSD$
    +
    +.include 
    +
    +LIB=	efi
    +SHLIB_MAJOR= 1
    +
    +SRCS=	libefi.c \
    +	efi_getvar.c \
    +	efi_nextvarname.c \
    +	efi_setvar.c
    +
    +CFLAGS+= -I${.CURDIR}
    +
    +INCS=	libefi.h
    +
    +MAN+=	libefi.3
    +MLINKS+=libefi.3 efi_getvar.3 \
    +	libefi.3 efi_nextvarname.3 \
    +	libefi.3 efi_setvar.3
    +
    +.include 
    diff --git a/lib/libefi/efi_getvar.c b/lib/libefi/efi_getvar.c
    new file mode 100644
    index 000000000000..97e842e7d526
    --- /dev/null
    +++ b/lib/libefi/efi_getvar.c
    @@ -0,0 +1,68 @@
    +/*-
    + * Copyright (c) 2010 Marcel Moolenaar
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +#include 
    +
    +#include "libefi_int.h"
    +
    +/*
    + * EFI_STATUS
    + * GetVariable(
    + *	IN CHAR16	*VariableName,
    + *	IN EFI_GUID	*VendorGuid,
    + *	OUT UINT32	*Attributes OPTIONAL,
    + *	IN OUT UINTN	*DataSize,
    + *	OUT VOID	*Data
    + *   );
    + */
    +
    +int
    +efi_getvar(char *name, uuid_t *vendor, uint32_t *attrib, size_t *datasize,
    +    void *data)
    +{
    +	struct iodev_efivar_req req;
    +	int error;
    +
    +	req.namesize = 0;
    +	error = libefi_utf8_to_ucs2(name, &req.namesize, &req.name);
    +	if (error)
    +		return (error);
    +
    +	req.vendor = *vendor;
    +	req.datasize = *datasize;
    +	req.data = data;
    +	req.access = IODEV_EFIVAR_GETVAR;
    +	error = libefi_efivar(&req);
    +	*datasize = req.datasize;
    +	if (!error && attrib != NULL)
    +		*attrib = req.attrib;
    +	free(req.name);
    +	return (error);
    +}
    diff --git a/lib/libefi/efi_nextvarname.c b/lib/libefi/efi_nextvarname.c
    new file mode 100644
    index 000000000000..e07659fd74f5
    --- /dev/null
    +++ b/lib/libefi/efi_nextvarname.c
    @@ -0,0 +1,66 @@
    +/*-
    + * Copyright (c) 2010 Marcel Moolenaar
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +#include 
    +
    +#include "libefi_int.h"
    +
    +/*
    + * EFI_STATUS
    + * GetNextVariableName(
    + *	IN OUT UINTN	*VariableNameSize,
    + *	IN OUT CHAR16	*VariableName,
    + *	IN OUT EFI_GUID	*VendorGuid
    + *    );
    + */
    +
    +int
    +efi_nextvarname(size_t *namesize, char *name, uuid_t *vendor)
    +{
    +	struct iodev_efivar_req req;
    +	int error;
    +
    +	req.namesize = *namesize;
    +	error = libefi_utf8_to_ucs2(name, &req.namesize, &req.name);
    +	if (error)
    +		return (error);
    +
    +	req.vendor = *vendor;
    +	req.access = IODEV_EFIVAR_NEXTNAME;
    +	error = libefi_efivar(&req);
    +	*namesize = req.namesize;
    +	if (!error) {
    +		error = libefi_ucs2_to_utf8(req.name, namesize, name);
    +		if (!error)
    +			*vendor = req.vendor;
    +	}
    +	free(req.name);
    +	return (error);
    +}
    diff --git a/lib/libefi/efi_setvar.c b/lib/libefi/efi_setvar.c
    new file mode 100644
    index 000000000000..be43694f2104
    --- /dev/null
    +++ b/lib/libefi/efi_setvar.c
    @@ -0,0 +1,66 @@
    +/*-
    + * Copyright (c) 2010 Marcel Moolenaar
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +#include 
    +
    +#include "libefi_int.h"
    +
    +/*
    + * EFI_STATUS
    + * SetVariable(
    + *	IN CHAR16	*VariableName,
    + *	IN EFI_GUID	*VendorGuid,
    + *	IN UINT32	Attributes,
    + *	IN UINTN	DataSize,
    + *	IN VOID		*Data
    + *    );
    + */
    +
    +int
    +efi_setvar(char *name, uuid_t *vendor, uint32_t attrib, size_t datasize,
    +    void *data)
    +{
    +	struct iodev_efivar_req req;
    +	int error;
    +
    +	req.namesize = 0;
    +	error = libefi_utf8_to_ucs2(name, &req.namesize, &req.name);
    +	if (error)
    +		return (error);
    +
    +	req.vendor = *vendor;
    +	req.attrib = attrib;
    +	req.datasize = datasize;
    +	req.data = data;
    +	req.access = IODEV_EFIVAR_SETVAR;
    +	error = libefi_efivar(&req);
    +	free(req.name);
    +	return (error);
    +}
    diff --git a/lib/libefi/libefi.3 b/lib/libefi/libefi.3
    new file mode 100644
    index 000000000000..a8d6128fe0b4
    --- /dev/null
    +++ b/lib/libefi/libefi.3
    @@ -0,0 +1,143 @@
    +.\"-
    +.\" Copyright (c) 2010 Marcel Moolenaar
    +.\" 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$
    +.\"
    +.Dd January 29, 2010
    +.Dt LIBEFI 3
    +.Os
    +.Sh NAME
    +.Nm efi_getvar , efi_nextvarname , efi_setvar
    +.Nd "interface for accessing the EFI variable services"
    +.Sh LIBRARY
    +.Lb libefi
    +.Sh SYNOPSIS
    +.In libefi.h
    +.Ft int
    +.Fo efi_getvar
    +.Fa "char *name" "uuid_t *vendor" "uint32_t *attrib"
    +.Fa "size_t *datasize" "void *data"
    +.Fc
    +.Ft int
    +.Fn efi_nextvarname "size_t *namesize" "char *name" "uuid_t *vendor"
    +.Ft int
    +.Fo efi_setvar
    +.Fa "char *name" "uuid_t *vendor" "uint32_t attrib"
    +.Fa "size_t datasize" "void *data"
    +.Fc
    +.Sh DESCRIPTION
    +The
    +.Nm libefi
    +library provides access to a select set of the runtime services of the
    +Extensible Firmware Interface (EFI).
    +.Pp
    +The
    +.Fn efi_nextvarname
    +function is used to enumerate the variables.
    +The
    +.Fa namesize
    +parameter needs to be set to the size of the buffer pointed to by
    +.Fa name .
    +On return,
    +.Fa namesize
    +is set to the length of the variable name (including the terminating
    +.Ql \e0 )
    +irrespective of whether the buffer was big enough.
    +The buffer pointed to by
    +.Fa name
    +contains the full or partial variable name on return.
    +Only on successful completion of the request is the
    +.Fa vendor
    +updated.
    +The values returned should be passed to successive calls to
    +.Fn efi_nextvarname
    +until all variables have been enumerated.
    +.Pp
    +The variable name and vendor as returned by
    +.Fn efi_nextvarname
    +can be passed to
    +.Fn efi_getvar
    +to obtain the value and attribute of the variable.
    +The buffer that is to contain the value is specified by
    +.Fa data
    +and the size of the buffer is given by
    +.Fa datasize .
    +The attribute pointed to by
    +.Fa attrib
    +consists of the bit values defined by the EFI specification.
    +.Pp
    +Variables can be created, modified and deleted using the
    +.Fn efi_setvar
    +function.
    +All new variables must be non-volatile and runtime accessable in
    +order for the request to succeed.
    +Note that for runtime accessable variables the boottime accessable bit must
    +be set as well.
    +To delete a variable, set
    +.Fa datasize
    +to 0.
    +.Pp
    +The vendor UUID is used to avoid collisions between variable names of
    +different vendors.
    +Variables created for use by
    +.Fx
    +should use the
    +.Dv EFI_FREEBSD_VARIABLE
    +UUID as defined in the
    +.In libefi.h
    +header file.
    +.Sh RETURN VALUES
    +Upon successful completion, these functions return 0.
    +Otherwise, the error number is returned.
    +These functions will fail if:
    +.Bl -tag -width Er
    +.It Bq Er EACCES
    +Insufficient permissions to access the EFI services.
    +.It Bq Er EILSEQ
    +The variable name is not in UTF-8.
    +.It Bq Er EINVAL
    +The request has invalid parameters.
    +.It Bq Er ENOENT
    +The variable does not exist or no more variables exist.
    +.It Bq Er ENOMEM
    +Temporary storage could not be allocated.
    +.It Bq Er EOVERFLOW
    +The variable name is too long or the data is too big to fit in
    +the buffer provided.
    +.El
    +.Sh SEE ALSO
    +.Xr errno 2 ,
    +.Xr uuid 3
    +.Sh HISTORY
    +The
    +.Nm libefi
    +library first appeared in
    +.Fx 9.0
    +for the ia64 architecture.
    +.Sh AUTHORS
    +The
    +.Nm libefi
    +library and this manual page were written by
    +.An Marcel Moolenaar Aq marcel@FreeBSD.org .
    diff --git a/lib/libefi/libefi.c b/lib/libefi/libefi.c
    new file mode 100644
    index 000000000000..c65784f57132
    --- /dev/null
    +++ b/lib/libefi/libefi.c
    @@ -0,0 +1,176 @@
    +/*-
    + * Copyright (c) 2010 Marcel Moolenaar
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +#include "libefi_int.h"
    +
    +static int __iofd = -1;
    +
    +static void
    +iodev_fd_close(void)
    +{
    +
    +	close(__iofd);
    +}
    +
    +static int
    +iodev_fd(int *fd)
    +{
    +
    +	*fd = __iofd;
    +	if (__iofd != -1)
    +		return (0);
    +
    +	__iofd = open("/dev/io", O_RDWR);
    +	if (__iofd == -1)
    +		return (errno);
    +
    +	atexit(iodev_fd_close);
    +	*fd = __iofd;
    +	return (0);
    +}
    +
    +int
    +libefi_ucs2_to_utf8(u_short *nm, size_t *szp, char *name)
    +{
    +	size_t len, sz;
    +	u_short c;
    +
    +	len = 0;
    +	sz = *szp;
    +	while (*nm) {
    +		c = *nm++;
    +		if (c > 0x7ff) {
    +			if (len++ < sz)
    +				*name++ = 0xE0 | (c >> 12);
    +			if (len++ < sz)
    +				*name++ = 0x80 | ((c >> 6) & 0x3f);
    +			if (len++ < sz)
    +				*name++ = 0x80 | (c & 0x3f);
    +		} else if (c > 0x7f) {
    +			if (len++ < sz)
    +				*name++ = 0xC0 | ((c >> 6) & 0x1f);
    +			if (len++ < sz)
    +				*name++ = 0x80 | (c & 0x3f);
    +		} else {
    +			if (len++ < sz)
    +				*name++ = (c & 0x7f);
    +		}
    +	}
    +	if (len++ < sz)
    +		*name++ = 0;
    +
    +	*szp = len;
    +	return ((len <= sz) ? 0 : EOVERFLOW);
    +}
    +
    +int
    +libefi_utf8_to_ucs2(char *name, size_t *szp, u_short **nmp)
    +{
    +	u_short *nm;
    +	size_t sz;
    +	uint32_t ucs4;
    +	int c, bytes;
    +
    +	*szp = sz = (*szp == 0) ? strlen(name) * 2 + 2 : *szp;
    +	*nmp = nm = malloc(sz);
    +
    +	ucs4 = 0;
    +	bytes = 0;
    +	while (sz > 1 && *name != '\0') {
    +		c = *name++;
    +		/*
    +		 * Conditionalize on the two major character types:
    +		 * initial and followup characters.
    +		 */
    +		if ((c & 0xc0) != 0x80) {
    +			/* Initial characters. */
    +			if (bytes != 0) {
    +				free(nm);
    +				return (EILSEQ);
    +			}
    +			if ((c & 0xf8) == 0xf0) {
    +				ucs4 = c & 0x07;
    +				bytes = 3;
    +			} else if ((c & 0xf0) == 0xe0) {
    +				ucs4 = c & 0x0f;
    +				bytes = 2;
    +			} else if ((c & 0xe0) == 0xc0) {
    +				ucs4 = c & 0x1f;
    +				bytes = 1;
    +			} else {
    +				ucs4 = c & 0x7f;
    +				bytes = 0;
    +			}
    +		} else {
    +			/* Followup characters. */
    +			if (bytes > 0) {
    +				ucs4 = (ucs4 << 6) + (c & 0x3f);
    +				bytes--;
    +			} else if (bytes == 0) {
    +				free(nm);
    +				return (EILSEQ);
    +			}
    +		}
    +		if (bytes == 0) {
    +			if (ucs4 > 0xffff) {
    +				free(nm);
    +				return (EILSEQ);
    +			}
    +			*nm++ = (u_short)ucs4;
    +			sz -= 2;
    +		}
    +	}
    +	if (sz < 2) {
    +		free(nm);
    +		return (EDOOFUS);
    +	}
    +	*nm = 0;
    +	return (0);
    +}
    +
    +int
    +libefi_efivar(struct iodev_efivar_req *req)
    +{
    +	int error, fd;
    +
    +	error = iodev_fd(&fd);
    +	if (!error)
    +		error = (ioctl(fd, IODEV_EFIVAR, req) == -1) ? errno : 0;
    +	if (!error)
    +		error = req->result;
    +	return (error);
    +}
    diff --git a/lib/libefi/libefi.h b/lib/libefi/libefi.h
    new file mode 100644
    index 000000000000..56d18ac9074a
    --- /dev/null
    +++ b/lib/libefi/libefi.h
    @@ -0,0 +1,57 @@
    +/*-
    + * Copyright (c) 2010 Marcel Moolenaar
    + * 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$
    + */
    +
    +#ifndef _LIBEFI_H_
    +#define	_LIBEFI_H_
    +
    +#include 
    +#include 
    +#include 
    +
    +/* Attributes. */
    +#define	EFI_ATTR_NV	0x0001	/* Variable stored in NVRAM. */
    +#define	EFI_ATTR_BS	0x0002	/* Boot services accessable. */
    +#define	EFI_ATTR_RT	0x0004	/* Runtime accessable. */
    +#define	EFI_ATTR_HR	0x0008	/* Hardware error record. */
    +#define	EFI_ATTR_WR	0x0010	/* Authenticated write access. */
    +
    +/* Vendor for architecturally defined variables. */
    +#define	EFI_GLOBAL_VARIABLE	\
    +	{0x8be4df61,0x93ca,0x11d2,0xaa,0x0d,{0x00,0xe0,0x98,0x03,0x2b,0x8c}}
    +
    +/* Vendor for FreeBSD-specific variables. */
    +#define	EFI_FREEBSD_VARIABLE	\
    +	{0x13c32014,0x0c9c,0x11df,0xa2,0x38,{0x00,0x17,0xa4,0xab,0x91,0x2d}}
    +
    +__BEGIN_DECLS
    +int	efi_getvar	(char *, uuid_t *, uint32_t *, size_t *, void *);
    +int	efi_nextvarname	(size_t *, char *, uuid_t *);
    +int	efi_setvar	(char *, uuid_t *, uint32_t, size_t, void *);
    +__END_DECLS
    +
    +#endif /* _LIBEFI_H_ */
    diff --git a/sys/ia64/include/sapicreg.h b/lib/libefi/libefi_int.h
    similarity index 73%
    rename from sys/ia64/include/sapicreg.h
    rename to lib/libefi/libefi_int.h
    index 8f7dfbd34a26..28ee822bad47 100644
    --- a/sys/ia64/include/sapicreg.h
    +++ b/lib/libefi/libefi_int.h
    @@ -1,5 +1,5 @@
     /*-
    - * Copyright (c) 2001 Doug Rabson
    + * Copyright (c) 2010 Marcel Moolenaar
      * All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
    @@ -26,23 +26,15 @@
      * $FreeBSD$
      */
     
    -#ifndef _MACHINE_SAPICREG_H_
    -#define _MACHINE_SAPICREG_H_
    +#ifndef _LIBEFI_INT_H_
    +#define	_LIBEFI_INT_H_
     
    -/*
    - * Offsets from the SAPIC base in memory. Most registers are accessed
    - * by indexing using the SAPIC_IO_SELECT register.
    - */
    -#define SAPIC_IO_SELECT		0x00
    -#define SAPIC_IO_WINDOW		0x10
    -#define SAPIC_APIC_EOI		0x40
    +#include 
    +#include 
     
    -/*
    - * Indexed registers.
    - */
    -#define SAPIC_ID		0x00
    -#define SAPIC_VERSION		0x01
    -#define SAPIC_ARBITRATION_ID	0x02
    -#define SAPIC_RTE_BASE		0x10
    +int libefi_ucs2_to_utf8(u_short *, size_t *, char *);
    +int libefi_utf8_to_ucs2(char *, size_t *, u_short **);
     
    -#endif /* ! _MACHINE_SAPICREG_H_ */
    +int libefi_efivar(struct iodev_efivar_req *);
    +
    +#endif /* _LIBEFI_INT_H_ */
    diff --git a/lib/libelf/Makefile b/lib/libelf/Makefile
    index b22148d59713..30e508076a82 100644
    --- a/lib/libelf/Makefile
    +++ b/lib/libelf/Makefile
    @@ -60,8 +60,6 @@ CFLAGS+=	-I. -I${.CURDIR}
     
     SHLIB_MAJOR=	1
     
    -WARNS?=	6
    -
     MAN=	elf.3							\
     	elf_begin.3						\
     	elf_cntl.3						\
    diff --git a/lib/libelf/elf.3 b/lib/libelf/elf.3
    index 0727ba825e04..854e1af1a2f9 100644
    --- a/lib/libelf/elf.3
    +++ b/lib/libelf/elf.3
    @@ -379,7 +379,6 @@ See
     .It Dv SHT_SUNW_move Ta Dv ELF_T_MOVE Ta ELF move records.
     .It Dv SHT_SUNW_syminfo Ta Dv ELF_T_SYMINFO Ta Additional symbol flags.
     .El
    -.TE
     .Ss Functional Grouping
     This section contains a brief overview of the available functionality
     in the ELF library.
    diff --git a/lib/libexpat/Makefile b/lib/libexpat/Makefile
    index e39368497e10..ab9b0e80d689 100644
    --- a/lib/libexpat/Makefile
    +++ b/lib/libexpat/Makefile
    @@ -14,6 +14,8 @@ MAN=		libbsdxml.3
     CFLAGS+= 	-I${.CURDIR} -DHAVE_EXPAT_CONFIG_H
     CLEANFILES=	bsdxml.h bsdxml_external.h
     
    +WARNS?=		2
    +
     # OK, so it is not entirely unadultered: we ammend the COPYING
     # to point people to the right place, get rid of some VMS stuff
     # and use FreeBSD style indempotency #ifndefs. We also want to
    diff --git a/lib/libexpat/libbsdxml.3 b/lib/libexpat/libbsdxml.3
    index 7d7b0e719099..555bc9ae1b40 100644
    --- a/lib/libexpat/libbsdxml.3
    +++ b/lib/libexpat/libbsdxml.3
    @@ -25,7 +25,7 @@
     .\"
     .\" $FreeBSD$
     .\"/
    -.Dd May 5, 2008
    +.Dd December 12, 2009
     .Dt LIBBSDXML 3
     .Os
     .Sh NAME
    @@ -38,6 +38,15 @@ The
     .Nm
     library is a verbatim copy of the eXpat XML library version 2.0.1.
     .Pp
    +The
    +.Nm
    +library is intended to be used within the
    +.Fx
    +base system only.
    +Use of the
    +.Nm
    +library for other purposes is not supported and discouraged.
    +.Pp
     To avoid version and autoconfiguration issues, the library has been
     renamed to
     .Nm
    diff --git a/lib/libfetch/Makefile b/lib/libfetch/Makefile
    index 3576db7b20a6..5091adf7c334 100644
    --- a/lib/libfetch/Makefile
    +++ b/lib/libfetch/Makefile
    @@ -16,8 +16,11 @@ CFLAGS+=	-DINET6
     
     .if ${MK_OPENSSL} != "no"
     CFLAGS+=	-DWITH_SSL
    -DPADD=		${LIBSSL} ${LIBCRYPTO}
    -LDADD=		-lssl -lcrypto
    +DPADD=		${LIBSSL} ${LIBCRYPTO} ${LIBMD}
    +LDADD=		-lssl -lcrypto -lmd
    +.else
    +DPADD=		${LIBMD}
    +LDADD=		-lmd
     .endif
     
     CFLAGS+=	-DFTP_COMBINE_CWDS
    diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c
    index d49336a90ced..c54804bcd8d3 100644
    --- a/lib/libfetch/common.c
    +++ b/lib/libfetch/common.c
    @@ -772,7 +772,7 @@ fetch_no_proxy_match(const char *host)
     				break;
     
     		d_len = q - p;
    -		if (d_len > 0 && h_len > d_len &&
    +		if (d_len > 0 && h_len >= d_len &&
     		    strncasecmp(host + h_len - d_len,
     			p, d_len) == 0) {
     			/* domain name matches */
    diff --git a/lib/libfetch/fetch.3 b/lib/libfetch/fetch.3
    index 9b312b0a1f1f..aaf1a8da4084 100644
    --- a/lib/libfetch/fetch.3
    +++ b/lib/libfetch/fetch.3
    @@ -25,7 +25,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd December 14, 2008
    +.Dd January 26, 2010
     .Dt FETCH 3
     .Os
     .Sh NAME
    @@ -509,9 +509,13 @@ Specifies HTTP authorization parameters as a colon-separated list of
     items.
     The first and second item are the authorization scheme and realm
     respectively; further items are scheme-dependent.
    -Currently, only basic authorization is supported.
    +Currently, the
    +.Dq basic
    +and
    +.Dq digest
    +authorization methods are supported.
     .Pp
    -Basic authorization requires two parameters: the user name and
    +Both methods require two parameters: the user name and
     password, in that order.
     .Pp
     This variable is only used if the server requires authorization and
    @@ -656,12 +660,14 @@ The
     .Nm fetch
     library was mostly written by
     .An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org
    -with numerous suggestions from
    +with numerous suggestions and contributions from
     .An Jordan K. Hubbard Aq jkh@FreeBSD.org ,
    -.An Eugene Skepner Aq eu@qub.com
    -and other
    -.Fx
    -developers.
    +.An Eugene Skepner Aq eu@qub.com ,
    +.An Hajimu Umemoto Aq ume@FreeBSD.org ,
    +.An Henry Whincup Aq henry@techiebod.com ,
    +.An Jukka A. Ukkonen Aq jau@iki.fi ,
    +.An Jean-Fran\(,cois Dockes Aq jf@dockes.org
    +and others.
     It replaces the older
     .Nm ftpio
     library written by
    diff --git a/lib/libfetch/ftp.c b/lib/libfetch/ftp.c
    index d0d597f0f9e0..a0ba5108d824 100644
    --- a/lib/libfetch/ftp.c
    +++ b/lib/libfetch/ftp.c
    @@ -1122,17 +1122,19 @@ ftp_request(struct url *url, const char *op, struct url_stat *us,
     
     	/* change directory */
     	if (ftp_cwd(conn, url->doc) == -1)
    -		return (NULL);
    +		goto errsock;
     
     	/* stat file */
     	if (us && ftp_stat(conn, url->doc, us) == -1
     	    && fetchLastErrCode != FETCH_PROTO
     	    && fetchLastErrCode != FETCH_UNAVAIL)
    -		return (NULL);
    +		goto errsock;
     
     	/* just a stat */
    -	if (strcmp(op, "STAT") == 0)
    +	if (strcmp(op, "STAT") == 0) {
    +		ftp_disconnect(conn);
     		return (FILE *)1; /* bogus return value */
    +	}
     	if (strcmp(op, "STOR") == 0 || strcmp(op, "APPE") == 0)
     		oflag = O_WRONLY;
     	else
    @@ -1140,6 +1142,10 @@ ftp_request(struct url *url, const char *op, struct url_stat *us,
     
     	/* initiate the transfer */
     	return (ftp_transfer(conn, op, url->doc, oflag, url->offset, flags));
    +
    +errsock:
    +	ftp_disconnect(conn);
    +	return (NULL);
     }
     
     /*
    diff --git a/lib/libfetch/http.c b/lib/libfetch/http.c
    index dd983493e392..f44366e6ff26 100644
    --- a/lib/libfetch/http.c
    +++ b/lib/libfetch/http.c
    @@ -76,6 +76,7 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     #include 
    +#include 
     
     #include 
     #include 
    @@ -343,7 +344,8 @@ typedef enum {
     	hdr_last_modified,
     	hdr_location,
     	hdr_transfer_encoding,
    -	hdr_www_authenticate
    +	hdr_www_authenticate,
    +	hdr_proxy_authenticate,
     } hdr_t;
     
     /* Names of interesting headers */
    @@ -357,6 +359,7 @@ static struct {
     	{ hdr_location,			"Location" },
     	{ hdr_transfer_encoding,	"Transfer-Encoding" },
     	{ hdr_www_authenticate,		"WWW-Authenticate" },
    +	{ hdr_proxy_authenticate,	"Proxy-Authenticate" },
     	{ hdr_unknown,			NULL },
     };
     
    @@ -446,21 +449,114 @@ http_match(const char *str, const char *hdr)
     	return (hdr);
     }
     
    -/*
    - * Get the next header and return the appropriate symbolic code.
    - */
    -static hdr_t
    -http_next_header(conn_t *conn, const char **p)
    -{
    -	int i;
     
    -	if (fetch_getln(conn) == -1)
    -		return (hdr_syserror);
    -	while (conn->buflen && isspace((unsigned char)conn->buf[conn->buflen - 1]))
    +/*
    + * Get the next header and return the appropriate symbolic code.  We
    + * need to read one line ahead for checking for a continuation line
    + * belonging to the current header (continuation lines start with
    + * white space). 
    + *
    + * We get called with a fresh line already in the conn buffer, either
    + * from the previous http_next_header() invocation, or, the first
    + * time, from a fetch_getln() performed by our caller.
    + *
    + * This stops when we encounter an empty line (we dont read beyond the header
    + * area).
    + * 
    + * Note that the "headerbuf" is just a place to return the result. Its
    + * contents are not used for the next call. This means that no cleanup
    + * is needed when ie doing another connection, just call the cleanup when
    + * fully done to deallocate memory.
    + */
    +
    +/* Limit the max number of continuation lines to some reasonable value */
    +#define HTTP_MAX_CONT_LINES 10
    +
    +/* Place into which to build a header from one or several lines */
    +typedef struct {
    +	char	*buf;		/* buffer */
    +	size_t	 bufsize;	/* buffer size */
    +	size_t	 buflen;	/* length of buffer contents */
    +} http_headerbuf_t;
    +
    +static void
    +init_http_headerbuf(http_headerbuf_t *buf)
    +{
    +	buf->buf = NULL;
    +	buf->bufsize = 0;
    +	buf->buflen = 0;
    +}
    +
    +static void 
    +clean_http_headerbuf(http_headerbuf_t *buf)
    +{
    +	if (buf->buf)
    +		free(buf->buf);
    +	init_http_headerbuf(buf);
    +}
    +
    +/* Remove whitespace at the end of the buffer */
    +static void 
    +http_conn_trimright(conn_t *conn)
    +{
    +	while (conn->buflen && 
    +	       isspace((unsigned char)conn->buf[conn->buflen - 1]))
     		conn->buflen--;
     	conn->buf[conn->buflen] = '\0';
    +}
    +
    +static hdr_t
    +http_next_header(conn_t *conn, http_headerbuf_t *hbuf, const char **p)
    +{
    +	int i, len;
    +
    +	/* 
    +	 * Have to do the stripping here because of the first line. So
    +	 * it's done twice for the subsequent lines. No big deal 
    +	 */
    +	http_conn_trimright(conn);
     	if (conn->buflen == 0)
     		return (hdr_end);
    +
    +	/* Copy the line to the headerbuf */
    +	if (hbuf->bufsize < conn->buflen + 1) {
    +		if ((hbuf->buf = realloc(hbuf->buf, conn->buflen + 1)) == NULL)
    +			return (hdr_syserror);
    +		hbuf->bufsize = conn->buflen + 1;
    +	}
    +	strcpy(hbuf->buf, conn->buf);
    +	hbuf->buflen = conn->buflen;
    +
    +	/* 
    +	 * Fetch possible continuation lines. Stop at 1st non-continuation
    +	 * and leave it in the conn buffer 
    +         */
    +	for (i = 0; i < HTTP_MAX_CONT_LINES; i++) {
    +		if (fetch_getln(conn) == -1)
    +			return (hdr_syserror);
    +
    +		/* 
    +		 * Note: we carry on the idea from the previous version
    +		 * that a pure whitespace line is equivalent to an empty
    +		 * one (so it's not continuation and will be handled when
    +		 * we are called next) 
    +		 */
    +		http_conn_trimright(conn);
    +		if (conn->buf[0] != ' ' && conn->buf[0] != "\t"[0])
    +			break;
    +
    +		/* Got a continuation line. Concatenate to previous */
    +		len = hbuf->buflen + conn->buflen;
    +		if (hbuf->bufsize < len + 1) {
    +			len *= 2;
    +			if ((hbuf->buf = realloc(hbuf->buf, len + 1)) == NULL)
    +				return (hdr_syserror);
    +			hbuf->bufsize = len + 1;
    +		}
    +		strcpy(hbuf->buf + hbuf->buflen, conn->buf);
    +		hbuf->buflen += conn->buflen;
    +	} 
    +
     	/*
     	 * We could check for malformed headers but we don't really care.
     	 * A valid header starts with a token immediately followed by a
    @@ -468,11 +564,290 @@ http_next_header(conn_t *conn, const char **p)
     	 * characters except "()<>@,;:\\\"{}".
     	 */
     	for (i = 0; hdr_names[i].num != hdr_unknown; i++)
    -		if ((*p = http_match(hdr_names[i].name, conn->buf)) != NULL)
    +		if ((*p = http_match(hdr_names[i].name, hbuf->buf)) != NULL)
     			return (hdr_names[i].num);
    +
     	return (hdr_unknown);
     }
     
    +/**************************
    + * [Proxy-]Authenticate header parsing
    + */
    +
    +/* 
    + * Read doublequote-delimited string into output buffer obuf (allocated 
    + * by caller, whose responsibility it is to ensure that it's big enough)
    + * cp points to the first char after the initial '"'
    + * Handles \ quoting 
    + * Returns pointer to the first char after the terminating double quote, or 
    + * NULL for error.
    + */
    +static const char *
    +http_parse_headerstring(const char *cp, char *obuf)
    +{
    +	for (;;) {
    +		switch (*cp) {
    +		case 0: /* Unterminated string */
    +			*obuf = 0;
    +			return (NULL);
    +		case '"': /* Ending quote */
    +			*obuf = 0;
    +			return (++cp);
    +		case '\\':
    +			if (*++cp == 0) {
    +				*obuf = 0;
    +				return (NULL);
    +			}
    +			/* FALLTHROUGH */
    +		default:
    +			*obuf++ = *cp++;
    +		}
    +	}
    +}
    +
    +/* Http auth challenge schemes */
    +typedef enum {HTTPAS_UNKNOWN, HTTPAS_BASIC,HTTPAS_DIGEST} http_auth_schemes_t;
    +
    +/* Data holder for a Basic or Digest challenge. */
    +typedef struct {
    +	http_auth_schemes_t scheme;
    +	char	*realm;
    +	char	*qop;
    +	char	*nonce;
    +	char	*opaque;
    +	char	*algo;
    +	int	 stale;
    +	int	 nc; /* Nonce count */
    +} http_auth_challenge_t;
    +
    +static void 
    +init_http_auth_challenge(http_auth_challenge_t *b)
    +{
    +	b->scheme = HTTPAS_UNKNOWN;
    +	b->realm = b->qop = b->nonce = b->opaque = b->algo = NULL;
    +	b->stale = b->nc = 0;
    +}
    +
    +static void 
    +clean_http_auth_challenge(http_auth_challenge_t *b)
    +{
    +	if (b->realm) 
    +		free(b->realm);
    +	if (b->qop) 
    +		free(b->qop);
    +	if (b->nonce) 
    +		free(b->nonce);
    +	if (b->opaque) 
    +		free(b->opaque);
    +	if (b->algo) 
    +		free(b->algo);
    +	init_http_auth_challenge(b);
    +}
    +
    +/* Data holder for an array of challenges offered in an http response. */
    +#define MAX_CHALLENGES 10
    +typedef struct {
    +	http_auth_challenge_t *challenges[MAX_CHALLENGES];
    +	int	count; /* Number of parsed challenges in the array */
    +	int	valid; /* We did parse an authenticate header */
    +} http_auth_challenges_t;
    +
    +static void 
    +init_http_auth_challenges(http_auth_challenges_t *cs)
    +{
    +	int i;
    +	for (i = 0; i < MAX_CHALLENGES; i++)
    +		cs->challenges[i] = NULL;
    +	cs->count = cs->valid = 0;
    +}
    +
    +static void 
    +clean_http_auth_challenges(http_auth_challenges_t *cs)
    +{
    +	int i;
    +	/* We rely on non-zero pointers being allocated, not on the count */
    +	for (i = 0; i < MAX_CHALLENGES; i++) {
    +		if (cs->challenges[i] != NULL) {
    +			clean_http_auth_challenge(cs->challenges[i]);
    +			free(cs->challenges[i]);
    +		}
    +	}
    +	init_http_auth_challenges(cs);
    +}
    +
    +/* 
    + * Enumeration for lexical elements. Separators will be returned as their own
    + * ascii value
    + */
    +typedef enum {HTTPHL_WORD=256, HTTPHL_STRING=257, HTTPHL_END=258,
    +	      HTTPHL_ERROR = 259} http_header_lex_t;
    +
    +/* 
    + * Determine what kind of token comes next and return possible value
    + * in buf, which is supposed to have been allocated big enough by
    + * caller. Advance input pointer and return element type. 
    + */
    +static int 
    +http_header_lex(const char **cpp, char *buf)
    +{
    +	size_t l;
    +	/* Eat initial whitespace */
    +	*cpp += strspn(*cpp, " \t");
    +	if (**cpp == 0)
    +		return (HTTPHL_END);
    +
    +	/* Separator ? */
    +	if (**cpp == ',' || **cpp == '=')
    +		return (*((*cpp)++));
    +
    +	/* String ? */
    +	if (**cpp == '"') {
    +		*cpp = http_parse_headerstring(++*cpp, buf);
    +		if (*cpp == NULL)
    +			return (HTTPHL_ERROR);
    +		return (HTTPHL_STRING);
    +	}
    +
    +	/* Read other token, until separator or whitespace */
    +	l = strcspn(*cpp, " \t,=");
    +	memcpy(buf, *cpp, l);
    +	buf[l] = 0;
    +	*cpp += l;
    +	return (HTTPHL_WORD);
    +}
    +
    +/* 
    + * Read challenges from http xxx-authenticate header and accumulate them
    + * in the challenges list structure.
    + *
    + * Headers with multiple challenges are specified by rfc2617, but
    + * servers (ie: squid) often send them in separate headers instead,
    + * which in turn is forbidden by the http spec (multiple headers with
    + * the same name are only allowed for pure comma-separated lists, see
    + * rfc2616 sec 4.2).
    + *
    + * We support both approaches anyway
    + */
    +static int 
    +http_parse_authenticate(const char *cp, http_auth_challenges_t *cs)
    +{
    +	int ret = -1;
    +	http_header_lex_t lex;
    +	char *key = malloc(strlen(cp) + 1);
    +	char *value = malloc(strlen(cp) + 1);
    +	char *buf = malloc(strlen(cp) + 1);
    +
    +	if (key == NULL || value == NULL || buf == NULL) {
    +		fetch_syserr();
    +		goto out;
    +	}
    +
    +	/* In any case we've seen the header and we set the valid bit */
    +	cs->valid = 1;
    +
    +	/* Need word first */
    +	lex = http_header_lex(&cp, key);
    +	if (lex != HTTPHL_WORD)
    +		goto out;
    +
    +	/* Loop on challenges */
    +	for (; cs->count < MAX_CHALLENGES; cs->count++) {
    +		cs->challenges[cs->count] = 
    +			malloc(sizeof(http_auth_challenge_t));
    +		if (cs->challenges[cs->count] == NULL) {
    +			fetch_syserr();
    +			goto out;
    +		}
    +		init_http_auth_challenge(cs->challenges[cs->count]);
    +		if (!strcasecmp(key, "basic")) {
    +			cs->challenges[cs->count]->scheme = HTTPAS_BASIC;
    +		} else if (!strcasecmp(key, "digest")) {
    +			cs->challenges[cs->count]->scheme = HTTPAS_DIGEST;
    +		} else {
    +			cs->challenges[cs->count]->scheme = HTTPAS_UNKNOWN;
    +			/* 
    +                         * Continue parsing as basic or digest may
    +			 * follow, and the syntax is the same for
    +			 * all. We'll just ignore this one when
    +			 * looking at the list
    +			 */
    +		}
    +	
    +		/* Loop on attributes */
    +		for (;;) {
    +			/* Key */
    +			lex = http_header_lex(&cp, key);
    +			if (lex != HTTPHL_WORD)
    +				goto out;
    +
    +			/* Equal sign */
    +			lex = http_header_lex(&cp, buf);
    +			if (lex != '=')
    +				goto out;
    +
    +			/* Value */
    +			lex = http_header_lex(&cp, value);
    +			if (lex != HTTPHL_WORD && lex != HTTPHL_STRING)
    +				goto out;
    +
    +			if (!strcasecmp(key, "realm"))
    +				cs->challenges[cs->count]->realm = 
    +					strdup(value);
    +			else if (!strcasecmp(key, "qop"))
    +				cs->challenges[cs->count]->qop = 
    +					strdup(value);
    +			else if (!strcasecmp(key, "nonce"))
    +				cs->challenges[cs->count]->nonce = 
    +					strdup(value);
    +			else if (!strcasecmp(key, "opaque"))
    +				cs->challenges[cs->count]->opaque = 
    +					strdup(value);
    +			else if (!strcasecmp(key, "algorithm"))
    +				cs->challenges[cs->count]->algo = 
    +					strdup(value);
    +			else if (!strcasecmp(key, "stale"))
    +				cs->challenges[cs->count]->stale = 
    +					strcasecmp(value, "no");
    +			/* Else ignore unknown attributes */
    +
    +			/* Comma or Next challenge or End */
    +			lex = http_header_lex(&cp, key);
    +			/* 
    +                         * If we get a word here, this is the beginning of the
    +			 * next challenge. Break the attributes loop 
    +                         */
    +			if (lex == HTTPHL_WORD)
    +				break;
    +
    +			if (lex == HTTPHL_END) {
    +				/* End while looking for ',' is normal exit */
    +				cs->count++;
    +				ret = 0;
    +				goto out;
    +			}
    +			/* Anything else is an error */
    +			if (lex != ',')
    +				goto out;
    +
    +		} /* End attributes loop */
    +	} /* End challenge loop */
    +
    +	/* 
    +         * Challenges max count exceeded. This really can't happen
    +	 * with normal data, something's fishy -> error 
    +	 */ 
    +
    +out:
    +	if (key)
    +		free(key);
    +	if (value)
    +		free(value);
    +	if (buf)
    +		free(buf);
    +	return (ret);
    +}
    +
    +
     /*
      * Parse a last-modified header
      */
    @@ -618,6 +993,291 @@ http_base64(const char *src)
     	return (str);
     }
     
    +
    +/*
    + * Extract authorization parameters from environment value.
    + * The value is like scheme:realm:user:pass
    + */
    +typedef struct {
    +	char	*scheme;
    +	char	*realm;
    +	char	*user;
    +	char	*password;
    +} http_auth_params_t;
    +
    +static void
    +init_http_auth_params(http_auth_params_t *s)
    +{
    +	s->scheme = s->realm = s->user = s->password = 0;
    +}
    +
    +static void 
    +clean_http_auth_params(http_auth_params_t *s)
    +{
    +	if (s->scheme) 
    +		free(s->scheme);
    +	if (s->realm) 
    +		free(s->realm);
    +	if (s->user) 
    +		free(s->user);
    +	if (s->password) 
    +		free(s->password);
    +	init_http_auth_params(s);
    +}
    +
    +static int
    +http_authfromenv(const char *p, http_auth_params_t *parms)
    +{
    +	int ret = -1;
    +	char *v, *ve;
    +	char *str = strdup(p);
    +
    +	if (str == NULL) {
    +		fetch_syserr();
    +		return (-1);
    +	}
    +	v = str;
    +
    +	if ((ve = strchr(v, ':')) == NULL)
    +		goto out;
    +
    +	*ve = 0;
    +	if ((parms->scheme = strdup(v)) == NULL) {
    +		fetch_syserr();
    +		goto out;
    +	}
    +	v = ve + 1;
    +
    +	if ((ve = strchr(v, ':')) == NULL)
    +		goto out;
    +
    +	*ve = 0;
    +	if ((parms->realm = strdup(v)) == NULL) {
    +		fetch_syserr();
    +		goto out;
    +	}
    +	v = ve + 1;
    +
    +	if ((ve = strchr(v, ':')) == NULL)
    +		goto out;
    +
    +	*ve = 0;
    +	if ((parms->user = strdup(v)) == NULL) {
    +		fetch_syserr();
    +		goto out;
    +	}
    +	v = ve + 1;
    +
    +
    +	if ((parms->password = strdup(v)) == NULL) {
    +		fetch_syserr();
    +		goto out;
    +	}
    +	ret = 0;
    +out:
    +	if (ret == -1) 
    +		clean_http_auth_params(parms);
    +	if (str)
    +		free(str);
    +	return (ret);
    +}
    +
    +
    +/* 
    + * Digest response: the code to compute the digest is taken from the
    + * sample implementation in RFC2616 
    + */
    +#define IN
    +#define OUT
    +
    +#define HASHLEN 16
    +typedef char HASH[HASHLEN];
    +#define HASHHEXLEN 32
    +typedef char HASHHEX[HASHHEXLEN+1];
    +
    +static const char *hexchars = "0123456789abcdef";
    +static void 
    +CvtHex(IN HASH Bin, OUT HASHHEX Hex)
    +{
    +	unsigned short i;
    +	unsigned char j;
    +
    +	for (i = 0; i < HASHLEN; i++) {
    +		j = (Bin[i] >> 4) & 0xf;
    +		Hex[i*2] = hexchars[j];
    +		j = Bin[i] & 0xf;
    +		Hex[i*2+1] = hexchars[j];
    +	};
    +	Hex[HASHHEXLEN] = '\0';
    +};
    +
    +/* calculate H(A1) as per spec */
    +static void 
    +DigestCalcHA1(
    +	IN char * pszAlg,
    +	IN char * pszUserName,
    +	IN char * pszRealm,
    +	IN char * pszPassword,
    +	IN char * pszNonce,
    +	IN char * pszCNonce,
    +	OUT HASHHEX SessionKey
    +	)
    +{
    +	MD5_CTX Md5Ctx;
    +	HASH HA1;
    +
    +	MD5Init(&Md5Ctx);
    +	MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));
    +	MD5Update(&Md5Ctx, ":", 1);
    +	MD5Update(&Md5Ctx, pszRealm, strlen(pszRealm));
    +	MD5Update(&Md5Ctx, ":", 1);
    +	MD5Update(&Md5Ctx, pszPassword, strlen(pszPassword));
    +	MD5Final(HA1, &Md5Ctx);
    +	if (strcasecmp(pszAlg, "md5-sess") == 0) {
    +
    +		MD5Init(&Md5Ctx);
    +		MD5Update(&Md5Ctx, HA1, HASHLEN);
    +		MD5Update(&Md5Ctx, ":", 1);
    +		MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
    +		MD5Update(&Md5Ctx, ":", 1);
    +		MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
    +		MD5Final(HA1, &Md5Ctx);
    +	};
    +	CvtHex(HA1, SessionKey);
    +}
    +
    +/* calculate request-digest/response-digest as per HTTP Digest spec */
    +static void 
    +DigestCalcResponse(
    +	IN HASHHEX HA1,           /* H(A1) */
    +	IN char * pszNonce,       /* nonce from server */
    +	IN char * pszNonceCount,  /* 8 hex digits */
    +	IN char * pszCNonce,      /* client nonce */
    +	IN char * pszQop,         /* qop-value: "", "auth", "auth-int" */
    +	IN char * pszMethod,      /* method from the request */
    +	IN char * pszDigestUri,   /* requested URL */
    +	IN HASHHEX HEntity,       /* H(entity body) if qop="auth-int" */
    +	OUT HASHHEX Response      /* request-digest or response-digest */
    +	)
    +{
    +/*	DEBUG(fprintf(stderr, 
    +		      "Calc: HA1[%s] Nonce[%s] qop[%s] method[%s] URI[%s]\n",
    +		      HA1, pszNonce, pszQop, pszMethod, pszDigestUri));*/
    +	MD5_CTX Md5Ctx;
    +	HASH HA2;
    +	HASH RespHash;
    +	HASHHEX HA2Hex;
    +
    +	// calculate H(A2)
    +	MD5Init(&Md5Ctx);
    +	MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
    +	MD5Update(&Md5Ctx, ":", 1);
    +	MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
    +	if (strcasecmp(pszQop, "auth-int") == 0) {
    +		MD5Update(&Md5Ctx, ":", 1);
    +		MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
    +	};
    +	MD5Final(HA2, &Md5Ctx);
    +	CvtHex(HA2, HA2Hex);
    +
    +	// calculate response
    +	MD5Init(&Md5Ctx);
    +	MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
    +	MD5Update(&Md5Ctx, ":", 1);
    +	MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
    +	MD5Update(&Md5Ctx, ":", 1);
    +	if (*pszQop) {
    +		MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
    +		MD5Update(&Md5Ctx, ":", 1);
    +		MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
    +		MD5Update(&Md5Ctx, ":", 1);
    +		MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
    +		MD5Update(&Md5Ctx, ":", 1);
    +	};
    +	MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
    +	MD5Final(RespHash, &Md5Ctx);
    +	CvtHex(RespHash, Response);
    +}
    +
    +/* 
    + * Generate/Send a Digest authorization header 
    + * This looks like: [Proxy-]Authorization: credentials
    + *
    + *  credentials      = "Digest" digest-response
    + *  digest-response  = 1#( username | realm | nonce | digest-uri
    + *                      | response | [ algorithm ] | [cnonce] |
    + *                      [opaque] | [message-qop] |
    + *                          [nonce-count]  | [auth-param] )
    + *  username         = "username" "=" username-value
    + *  username-value   = quoted-string
    + *  digest-uri       = "uri" "=" digest-uri-value
    + *  digest-uri-value = request-uri   ; As specified by HTTP/1.1
    + *  message-qop      = "qop" "=" qop-value
    + *  cnonce           = "cnonce" "=" cnonce-value
    + *  cnonce-value     = nonce-value
    + *  nonce-count      = "nc" "=" nc-value
    + *  nc-value         = 8LHEX
    + *  response         = "response" "=" request-digest
    + *  request-digest = <"> 32LHEX <">
    + */
    +static int
    +http_digest_auth(conn_t *conn, const char *hdr, http_auth_challenge_t *c,
    +		 http_auth_params_t *parms, struct url *url)
    +{
    +	int r;
    +	char noncecount[10];
    +	char cnonce[40];
    +	char *options = 0;
    +
    +	if (!c->realm || !c->nonce) {
    +		DEBUG(fprintf(stderr, "realm/nonce not set in challenge\n"));
    +		return(-1);
    +	}
    +	if (!c->algo) 
    +		c->algo = strdup("");
    +
    +	if (asprintf(&options, "%s%s%s%s", 
    +		     *c->algo? ",algorithm=" : "", c->algo,
    +		     c->opaque? ",opaque=" : "", c->opaque?c->opaque:"")== -1)
    +		return (-1);
    +
    +	if (!c->qop) {
    +		c->qop = strdup("");
    +		*noncecount = 0;
    +		*cnonce = 0;
    +	} else {
    +		c->nc++;
    +		sprintf(noncecount, "%08x", c->nc);
    +		/* We don't try very hard with the cnonce ... */
    +		sprintf(cnonce, "%x%lx", getpid(), (unsigned long)time(0));
    +	}
    +
    +	HASHHEX HA1;
    +	DigestCalcHA1(c->algo, parms->user, c->realm,
    +		      parms->password, c->nonce, cnonce, HA1);
    +	DEBUG(fprintf(stderr, "HA1: [%s]\n", HA1));
    +	HASHHEX digest;
    +	DigestCalcResponse(HA1, c->nonce, noncecount, cnonce, c->qop,
    +			   "GET", url->doc, "", digest);
    +
    +	if (c->qop[0]) {
    +		r = http_cmd(conn, "%s: Digest username=\"%s\",realm=\"%s\","
    +			     "nonce=\"%s\",uri=\"%s\",response=\"%s\","
    +			     "qop=\"auth\", cnonce=\"%s\", nc=%s%s",
    +			     hdr, parms->user, c->realm, 
    +			     c->nonce, url->doc, digest,
    +			     cnonce, noncecount, options);
    +	} else {
    +		r = http_cmd(conn, "%s: Digest username=\"%s\",realm=\"%s\","
    +			     "nonce=\"%s\",uri=\"%s\",response=\"%s\"%s",
    +			     hdr, parms->user, c->realm, 
    +			     c->nonce, url->doc, digest, options);
    +	}
    +	if (options)
    +		free(options);
    +	return (r);
    +}
    +
     /*
      * Encode username and password
      */
    @@ -627,8 +1287,8 @@ http_basic_auth(conn_t *conn, const char *hdr, const char *usr, const char *pwd)
     	char *upw, *auth;
     	int r;
     
    -	DEBUG(fprintf(stderr, "usr: [%s]\n", usr));
    -	DEBUG(fprintf(stderr, "pwd: [%s]\n", pwd));
    +	DEBUG(fprintf(stderr, "basic: usr: [%s]\n", usr));
    +	DEBUG(fprintf(stderr, "basic: pwd: [%s]\n", pwd));
     	if (asprintf(&upw, "%s:%s", usr, pwd) == -1)
     		return (-1);
     	auth = http_base64(upw);
    @@ -641,33 +1301,49 @@ http_basic_auth(conn_t *conn, const char *hdr, const char *usr, const char *pwd)
     }
     
     /*
    - * Send an authorization header
    + * Chose the challenge to answer and call the appropriate routine to 
    + * produce the header.
      */
     static int
    -http_authorize(conn_t *conn, const char *hdr, const char *p)
    +http_authorize(conn_t *conn, const char *hdr, http_auth_challenges_t *cs,
    +	       http_auth_params_t *parms, struct url *url)
     {
    -	/* basic authorization */
    -	if (strncasecmp(p, "basic:", 6) == 0) {
    -		char *user, *pwd, *str;
    -		int r;
    +	http_auth_challenge_t *basic = NULL;
    +	http_auth_challenge_t *digest = NULL;
    +	int i;
     
    -		/* skip realm */
    -		for (p += 6; *p && *p != ':'; ++p)
    -			/* nothing */ ;
    -		if (!*p || strchr(++p, ':') == NULL)
    -			return (-1);
    -		if ((str = strdup(p)) == NULL)
    -			return (-1); /* XXX */
    -		user = str;
    -		pwd = strchr(str, ':');
    -		*pwd++ = '\0';
    -		r = http_basic_auth(conn, hdr, user, pwd);
    -		free(str);
    -		return (r);
    +	/* If user or pass are null we're not happy */
    +	if (!parms->user || !parms->password) {
    +		DEBUG(fprintf(stderr, "NULL usr or pass\n"));
    +		return (-1);
     	}
    -	return (-1);
    -}
     
    +	/* Look for a Digest and a Basic challenge */
    +	for (i = 0; i < cs->count; i++) {
    +		if (cs->challenges[i]->scheme == HTTPAS_BASIC)
    +			basic = cs->challenges[i];
    +		if (cs->challenges[i]->scheme == HTTPAS_DIGEST)
    +			digest = cs->challenges[i];
    +	}
    +
    +	/* Error if "Digest" was specified and there is no Digest challenge */
    +	if (!digest && (parms->scheme && 
    +			!strcasecmp(parms->scheme, "digest"))) {
    +		DEBUG(fprintf(stderr, 
    +			      "Digest auth in env, not supported by peer\n"));
    +		return (-1);
    +	}
    +	/* 
    +         * If "basic" was specified in the environment, or there is no Digest
    +	 * challenge, do the basic thing. Don't need a challenge for this,
    +	 * so no need to check basic!=NULL 
    +	 */
    +	if (!digest || (parms->scheme && !strcasecmp(parms->scheme,"basic")))
    +		return (http_basic_auth(conn,hdr,parms->user,parms->password));
    +
    +	/* Else, prefer digest. We just checked that it's not NULL */
    +	return (http_digest_auth(conn, hdr, digest, parms, url));
    +}
     
     /*****************************************************************************
      * Helper functions for connecting to a server or proxy
    @@ -797,13 +1473,13 @@ http_print_html(FILE *out, FILE *in)
      */
     FILE *
     http_request(struct url *URL, const char *op, struct url_stat *us,
    -    struct url *purl, const char *flags)
    +	struct url *purl, const char *flags)
     {
     	char timebuf[80];
     	char hbuf[MAXHOSTNAMELEN + 7], *host;
     	conn_t *conn;
     	struct url *url, *new;
    -	int chunked, direct, ims, need_auth, noredirect, verbose;
    +	int chunked, direct, ims, noredirect, verbose;
     	int e, i, n, val;
     	off_t offset, clength, length, size;
     	time_t mtime;
    @@ -811,6 +1487,14 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     	FILE *f;
     	hdr_t h;
     	struct tm *timestruct;
    +	http_headerbuf_t headerbuf;
    +	http_auth_challenges_t server_challenges;
    +	http_auth_challenges_t proxy_challenges;
    +
    +	/* The following calls don't allocate anything */
    +	init_http_headerbuf(&headerbuf); 
    +	init_http_auth_challenges(&server_challenges);
    +	init_http_auth_challenges(&proxy_challenges);
     
     	direct = CHECK_FLAG('d');
     	noredirect = CHECK_FLAG('A');
    @@ -830,7 +1514,6 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     	i = 0;
     
     	e = HTTP_PROTOCOL_ERROR;
    -	need_auth = 0;
     	do {
     		new = NULL;
     		chunked = 0;
    @@ -895,27 +1578,67 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     		/* virtual host */
     		http_cmd(conn, "Host: %s", host);
     
    -		/* proxy authorization */
    -		if (purl) {
    -			if (*purl->user || *purl->pwd)
    -				http_basic_auth(conn, "Proxy-Authorization",
    -				    purl->user, purl->pwd);
    -			else if ((p = getenv("HTTP_PROXY_AUTH")) != NULL && *p != '\0')
    -				http_authorize(conn, "Proxy-Authorization", p);
    +		/* 
    +                 * Proxy authorization: we only send auth after we received
    +		 * a 407 error. We do not first try basic anyway (changed 
    +                 * when support was added for digest-auth)
    +                 */
    +		if (purl && proxy_challenges.valid) {
    +			http_auth_params_t aparams;
    +			init_http_auth_params(&aparams);
    +			if (*purl->user || *purl->pwd) {
    +				aparams.user = purl->user ? 
    +					strdup(purl->user) : strdup("");
    +				aparams.password = purl->pwd?
    +					strdup(purl->pwd) : strdup("");
    +			} else if ((p = getenv("HTTP_PROXY_AUTH")) != NULL && 
    +				   *p != '\0') {
    +				if (http_authfromenv(p, &aparams) < 0) {
    +					http_seterr(HTTP_NEED_PROXY_AUTH);
    +					goto ouch;
    +				}
    +			}
    +			http_authorize(conn, "Proxy-Authorization", 
    +				       &proxy_challenges, &aparams, url);
    +			clean_http_auth_params(&aparams);
     		}
     
    -		/* server authorization */
    -		if (need_auth || *url->user || *url->pwd) {
    -			if (*url->user || *url->pwd)
    -				http_basic_auth(conn, "Authorization", url->user, url->pwd);
    -			else if ((p = getenv("HTTP_AUTH")) != NULL && *p != '\0')
    -				http_authorize(conn, "Authorization", p);
    -			else if (fetchAuthMethod && fetchAuthMethod(url) == 0) {
    -				http_basic_auth(conn, "Authorization", url->user, url->pwd);
    +		/* 
    +                 * Server authorization: we never send "a priori"
    +		 * Basic auth, which used to be done if user/pass were
    +		 * set in the url. This would be weird because we'd send the
    +		 * password in the clear even if Digest is finally to be 
    +		 * used (it would have made more sense for the
    +		 * pre-digest version to do this when Basic was specified 
    +                 * in the environment) 
    +                 */
    +		if (server_challenges.valid) {
    +			http_auth_params_t aparams;
    +			init_http_auth_params(&aparams);
    +			if (*url->user || *url->pwd) {
    +				aparams.user = url->user ? 
    +					strdup(url->user) : strdup("");
    +				aparams.password = url->pwd ? 
    +					strdup(url->pwd) : strdup("");
    +			} else if ((p = getenv("HTTP_AUTH")) != NULL && 
    +				   *p != '\0') {
    +				if (http_authfromenv(p, &aparams) < 0) {
    +					http_seterr(HTTP_NEED_AUTH);
    +					goto ouch;
    +				}
    +			} else if (fetchAuthMethod && 
    +				   fetchAuthMethod(url) == 0) {
    +				aparams.user = url->user ? 
    +					strdup(url->user) : strdup("");
    +				aparams.password = url->pwd ? 
    +					strdup(url->pwd) : strdup("");
     			} else {
     				http_seterr(HTTP_NEED_AUTH);
     				goto ouch;
     			}
    +			http_authorize(conn, "Authorization", 
    +				       &server_challenges, &aparams, url);
    +			clean_http_auth_params(&aparams);
     		}
     
     		/* other headers */
    @@ -965,7 +1688,7 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     			 */
     			break;
     		case HTTP_NEED_AUTH:
    -			if (need_auth) {
    +			if (server_challenges.valid) {
     				/*
     				 * We already sent out authorization code,
     				 * so there's nothing more we can do.
    @@ -978,13 +1701,18 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     				fetch_info("server requires authorization");
     			break;
     		case HTTP_NEED_PROXY_AUTH:
    -			/*
    -			 * If we're talking to a proxy, we already sent
    -			 * our proxy authorization code, so there's
    -			 * nothing more we can do.
    -			 */
    -			http_seterr(conn->err);
    -			goto ouch;
    +			if (proxy_challenges.valid) {
    +				/*
    +				 * We already sent our proxy
    +				 * authorization code, so there's
    +				 * nothing more we can do. */
    +				http_seterr(conn->err);
    +				goto ouch;
    +			}
    +			/* try again, but send the password this time */
    +			if (verbose)
    +				fetch_info("proxy requires authorization");
    +			break;
     		case HTTP_BAD_RANGE:
     			/*
     			 * This can happen if we ask for 0 bytes because
    @@ -1004,9 +1732,13 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     			/* fall through so we can get the full error message */
     		}
     
    -		/* get headers */
    +		/* get headers. http_next_header expects one line readahead */
    +		if (fetch_getln(conn) == -1) {
    +		    fetch_syserr();
    +		    goto ouch;
    +		}
     		do {
    -			switch ((h = http_next_header(conn, &p))) {
    +		    switch ((h = http_next_header(conn, &headerbuf, &p))) {
     			case hdr_syserror:
     				fetch_syserr();
     				goto ouch;
    @@ -1054,7 +1786,12 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     			case hdr_www_authenticate:
     				if (conn->err != HTTP_NEED_AUTH)
     					break;
    -				/* if we were smarter, we'd check the method and realm */
    +				http_parse_authenticate(p, &server_challenges);
    +				break;
    +			case hdr_proxy_authenticate:
    +				if (conn->err != HTTP_NEED_PROXY_AUTH)
    +					break;
    +				http_parse_authenticate(p, &proxy_challenges);
     				break;
     			case hdr_end:
     				/* fall through */
    @@ -1065,9 +1802,17 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     		} while (h > hdr_end);
     
     		/* we need to provide authentication */
    -		if (conn->err == HTTP_NEED_AUTH) {
    +		if (conn->err == HTTP_NEED_AUTH || 
    +		    conn->err == HTTP_NEED_PROXY_AUTH) {
     			e = conn->err;
    -			need_auth = 1;
    +			if ((conn->err == HTTP_NEED_AUTH && 
    +			     !server_challenges.valid) || 
    +			    (conn->err == HTTP_NEED_PROXY_AUTH && 
    +			     !proxy_challenges.valid)) {
    +				/* 401/7 but no www/proxy-authenticate ?? */
    +				DEBUG(fprintf(stderr, "401/7 and no auth header\n"));
    +				goto ouch;
    +			}
     			fetch_close(conn);
     			conn = NULL;
     			continue;
    @@ -1096,7 +1841,7 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     
     		/* all other cases: we got a redirect */
     		e = conn->err;
    -		need_auth = 0;
    +		clean_http_auth_challenges(&server_challenges);
     		fetch_close(conn);
     		conn = NULL;
     		if (!new) {
    @@ -1172,7 +1917,9 @@ http_request(struct url *URL, const char *op, struct url_stat *us,
     		fclose(f);
     		f = NULL;
     	}
    -
    +	clean_http_headerbuf(&headerbuf);
    +	clean_http_auth_challenges(&server_challenges);
    +	clean_http_auth_challenges(&proxy_challenges);
     	return (f);
     
     ouch:
    @@ -1182,6 +1929,9 @@ ouch:
     		fetchFreeURL(purl);
     	if (conn != NULL)
     		fetch_close(conn);
    +	clean_http_headerbuf(&headerbuf);
    +	clean_http_auth_challenges(&server_challenges);
    +	clean_http_auth_challenges(&proxy_challenges);
     	return (NULL);
     }
     
    diff --git a/lib/libftpio/Makefile b/lib/libftpio/Makefile
    index bb9c9eb6e5da..2082ec57b03b 100644
    --- a/lib/libftpio/Makefile
    +++ b/lib/libftpio/Makefile
    @@ -15,6 +15,8 @@ CLEANFILES=	ftperr.c
     CFLAGS+=	-DINET6
     .endif
     
    +WARNS?=		2
    +
     ftperr.c:	ftp.errors
     	@echo '#include ' > ${.TARGET}
     	@echo '#include "ftpio.h"' >> ${.TARGET}
    diff --git a/lib/libgeom/geom_getxml.c b/lib/libgeom/geom_getxml.c
    index b27696d21657..17e04761b8a6 100644
    --- a/lib/libgeom/geom_getxml.c
    +++ b/lib/libgeom/geom_getxml.c
    @@ -36,7 +36,7 @@
     #include "libgeom.h"
     
     char *
    -geom_getxml()
    +geom_getxml(void)
     {
     	char *p;
     	size_t l = 0;
    diff --git a/lib/libgeom/geom_util.c b/lib/libgeom/geom_util.c
    index 539b6c62dbb6..54844c6e451c 100644
    --- a/lib/libgeom/geom_util.c
    +++ b/lib/libgeom/geom_util.c
    @@ -113,6 +113,32 @@ g_sectorsize(int fd)
     	return ((ssize_t)sectorsize);
     }
     
    +/*
    + * Return stripe size of the given provider.
    + */
    +off_t
    +g_stripesize(int fd)
    +{
    +	off_t stripesize;
    +
    +	if (g_ioctl_arg(fd, DIOCGSTRIPESIZE, &stripesize) == -1)
    +		return (-1);
    +	return (stripesize);
    +}
    +
    +/*
    + * Return stripe size of the given provider.
    + */
    +off_t
    +g_stripeoffset(int fd)
    +{
    +	off_t stripeoffset;
    +
    +	if (g_ioctl_arg(fd, DIOCGSTRIPEOFFSET, &stripeoffset) == -1)
    +		return (-1);
    +	return (stripeoffset);
    +}
    +
     /*
      * Return the correct provider name.
      */
    diff --git a/lib/libgeom/geom_xml2tree.c b/lib/libgeom/geom_xml2tree.c
    index 1c7e22b56895..821449b66ca8 100644
    --- a/lib/libgeom/geom_xml2tree.c
    +++ b/lib/libgeom/geom_xml2tree.c
    @@ -230,6 +230,16 @@ EndElement(void *userData, const char *name)
     		free(p);
     		return;
     	}
    +	if (!strcmp(name, "stripesize") && mt->provider != NULL) {
    +		mt->provider->lg_stripesize = strtoumax(p, NULL, 0);
    +		free(p);
    +		return;
    +	}
    +	if (!strcmp(name, "stripeoffset") && mt->provider != NULL) {
    +		mt->provider->lg_stripeoffset = strtoumax(p, NULL, 0);
    +		free(p);
    +		return;
    +	}
     
     	if (!strcmp(name, "config")) {
     		mt->config = NULL;
    diff --git a/lib/libgeom/libgeom.3 b/lib/libgeom/libgeom.3
    index 9272d3b40e45..d5682ab1d5a5 100644
    --- a/lib/libgeom/libgeom.3
    +++ b/lib/libgeom/libgeom.3
    @@ -28,7 +28,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd September 8, 2008
    +.Dd January 16, 2010
     .Dt LIBGEOM 3
     .Os
     .Sh NAME
    @@ -50,6 +50,8 @@
     .Nm g_close ,
     .Nm g_mediasize ,
     .Nm g_sectorsize ,
    +.Nm g_stripeoffset ,
    +.Nm g_stripesize ,
     .Nm g_flush ,
     .Nm g_delete ,
     .Nm g_device_path ,
    @@ -101,6 +103,10 @@
     .Fn g_mediasize "int fd"
     .Ft ssize_t
     .Fn g_sectorsize "int fd"
    +.Ft ssize_t
    +.Fn g_stripeoffset "int fd"
    +.Ft ssize_t
    +.Fn g_stripesize "int fd"
     .Ft int
     .Fn g_flush "int fd"
     .Ft int
    @@ -297,6 +303,14 @@ The
     function returns sector size of the given provider.
     .Pp
     The
    +.Fn g_stripeoffset
    +function returns stripe offset of the given provider.
    +.Pp
    +The
    +.Fn g_stripesize
    +function returns stripe size of the given provider.
    +.Pp
    +The
     .Fn g_flush
     function sends
     .Dv BIO_FLUSH
    diff --git a/lib/libgeom/libgeom.h b/lib/libgeom/libgeom.h
    index 7255bd4a8f31..c951f25babfe 100644
    --- a/lib/libgeom/libgeom.h
    +++ b/lib/libgeom/libgeom.h
    @@ -123,6 +123,8 @@ struct gprovider {
     	char			*lg_mode;
     	off_t			lg_mediasize;
     	u_int			lg_sectorsize;
    +	off_t			lg_stripeoffset;
    +	off_t			lg_stripesize;
     	struct gconf		lg_config;
     };
     
    @@ -149,6 +151,8 @@ int g_open(const char *, int);
     int g_close(int);
     off_t g_mediasize(int);
     ssize_t g_sectorsize(int);
    +off_t g_stripeoffset(int);
    +off_t g_stripesize(int);
     int g_flush(int);
     int g_delete(int, off_t, off_t);
     int g_get_ident(int, char *, size_t);
    diff --git a/lib/libgpib/Makefile b/lib/libgpib/Makefile
    index 5465d8b993ad..80e890bd35ba 100644
    --- a/lib/libgpib/Makefile
    +++ b/lib/libgpib/Makefile
    @@ -5,6 +5,24 @@ SHLIB_MAJOR=	3
     INCS=		gpib.h
     INCSDIR=	${INCLUDEDIR}/gpib
     SRCS=		ibfoo.c
    -WARNS?=		6
    +
    +MAN=		gpib.3
    +
    +# MLINKS are only provided for functions that are actually
    +# implemented; update this if missing pieces have been filled in.
    +MLINKS+=	gpib.3 ibclr.3
    +MLINKS+=	gpib.3 ibdev.3
    +MLINKS+=	gpib.3 ibdma.3
    +MLINKS+=	gpib.3 ibeos.3
    +MLINKS+=	gpib.3 ibeot.3
    +MLINKS+=	gpib.3 ibloc.3
    +MLINKS+=	gpib.3 ibonl.3
    +MLINKS+=	gpib.3 ibpad.3
    +MLINKS+=	gpib.3 ibrd.3
    +MLINKS+=	gpib.3 ibsad.3
    +MLINKS+=	gpib.3 ibsic.3
    +MLINKS+=	gpib.3 ibtmo.3
    +MLINKS+=	gpib.3 ibtrg.3
    +MLINKS+=	gpib.3 ibwrt.3
     
     .include 
    diff --git a/lib/libgpib/gpib.3 b/lib/libgpib/gpib.3
    new file mode 100644
    index 000000000000..a57d3a42e501
    --- /dev/null
    +++ b/lib/libgpib/gpib.3
    @@ -0,0 +1,738 @@
    +.\" Copyright (c) 2010, Joerg Wunsch
    +.\" 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$
    +.\"
    +.Dd February 1, 2010
    +.Dt GPIB 3
    +.Os
    +.Sh NAME
    +.\" .Nm ibask ,
    +.\" .Nm ibbna ,
    +.\" .Nm ibcac ,
    +.Nm ibclr ,
    +.\" .Nm ibcmd ,
    +.\" .Nm ibcmda ,
    +.\" .Nm ibconfig ,
    +.Nm ibdev ,
    +.\" .Nm ibdiag ,
    +.Nm ibdma ,
    +.Nm ibeos ,
    +.Nm ibeot ,
    +.\" .Nm ibevent ,
    +.\" .Nm ibfind ,
    +.\" .Nm ibgts ,
    +.\" .Nm ibist ,
    +.\" .Nm iblines ,
    +.\" .Nm ibllo ,
    +.\" .Nm ibln ,
    +.Nm ibloc ,
    +.Nm ibonl ,
    +.Nm ibpad ,
    +.\" .Nm ibpct ,
    +.\" .Nm ibpoke ,
    +.\" .Nm ibppc ,
    +.Nm ibrd ,
    +.\" .Nm ibrda ,
    +.\" .Nm ibrdf ,
    +.\" .Nm ibrdkey ,
    +.\" .Nm ibrpp ,
    +.\" .Nm ibrsc ,
    +.\" .Nm ibrsp ,
    +.\" .Nm ibrsv ,
    +.Nm ibsad ,
    +.\" .Nm ibsgnl ,
    +.Nm ibsic ,
    +.\" .Nm ibsre ,
    +.\" .Nm ibsrq ,
    +.\" .Nm ibstop ,
    +.Nm ibtmo ,
    +.\" .Nm ibtrap ,
    +.Nm ibtrg ,
    +.\" .Nm ibwait ,
    +.Nm ibwrt
    +.\" .Nm ibwrta ,
    +.\" .Nm ibwrtf ,
    +.\" .Nm ibwrtkey ,
    +.\" .Nm ibxtrc
    +.Nd "GPIB library"
    +.Sh LIBRARY
    +.Lb libgpib
    +.Sh SYNOPSIS
    +.In gpib.h
    +.Pp
    +.Dv extern int ibcnt ,
    +.Dv iberr ,
    +.Dv ibsta ;
    +.Pp
    +.Ft int
    +.Fn ibask "int handle" "int option" "int *retval"
    +.Ft int
    +.Fn ibbna "int handle" "char *bdname"
    +.Ft int
    +.Fn ibcac "int handle" "int v"
    +.Ft int
    +.Fn ibclr "int handle"
    +.Ft int
    +.Fn ibcmd "int handle" "void *buffer" "long cnt"
    +.Ft int
    +.Fn ibcmda "int handle" "void *buffer" "long cnt"
    +.Ft int
    +.Fn ibconfig "int handle" "int option" "int value"
    +.Ft int
    +.Fn ibdev "int boardID" "int pad" "int sad" "int tmo" "int eot" "int eos"
    +.Ft int
    +.Fn ibdiag "int handle" "void *buffer" "long cnt"
    +.Ft int
    +.Fn ibdma "int handle" "int v"
    +.Ft int
    +.Fn ibeos "int handle" "int eos"
    +.Ft int
    +.Fn ibeot "int handle" "int eot"
    +.Ft int
    +.Fn ibevent "int handle" "short *event"
    +.Ft int
    +.Fn ibfind "char *bdname"
    +.Ft int
    +.Fn ibgts "int handle" "int v"
    +.Ft int
    +.Fn ibist "int handle" "int v"
    +.Ft int
    +.Fn iblines "int handle" "short *lines"
    +.Ft int
    +.Fn ibllo "int handle"
    +.Ft int
    +.Fn ibln "int handle" "int padval" "int sadval" "short *listenflag"
    +.Ft int
    +.Fn ibloc "int handle"
    +.Ft int
    +.Fn ibonl "int handle" "int v"
    +.Ft int
    +.Fn ibpad "int handle" "int pad"
    +.Ft int
    +.Fn ibpct "int handle"
    +.Ft int
    +.Fn ibpoke "int handle" "int option" "int value"
    +.Ft int
    +.Fn ibppc "int handle" "int v"
    +.Ft int
    +.Fn ibrd "int handle" "void *buffer" "long cnt"
    +.Ft int
    +.Fn ibrda "int handle" "void *buffer" "long cnt"
    +.Ft int
    +.Fn ibrdf "int handle" "char *flname"
    +.Ft int
    +.Fn ibrdkey "int handle" "void *buffer" "int cnt"
    +.Ft int
    +.Fn ibrpp "int handle" "char *ppr"
    +.Ft int
    +.Fn ibrsc "int handle" "int v"
    +.Ft int
    +.Fn ibrsp "int handle" "char *spr"
    +.Ft int
    +.Fn ibrsv "int handle" "int v"
    +.Ft int
    +.Fn ibsad "int handle" "int sad"
    +.Ft int
    +.Fn ibsgnl "int handle" "int v"
    +.Ft int
    +.Fn ibsic "int handle"
    +.Ft int
    +.Fn ibsre "int handle" "int v"
    +.Ft int
    +.Fn ibsrq "(*func) void)"
    +.Ft int
    +.Fn ibstop "int handle"
    +.Ft int
    +.Fn ibtmo "int handle" "int tmo"
    +.Ft int
    +.Fn ibtrap "int  mask" "int mode"
    +.Ft int
    +.Fn ibtrg "int handle"
    +.Ft int
    +.Fn ibwait "int handle" "int mask"
    +.Ft int
    +.Fn ibwrt "int handle" "const void *buffer" "long cnt"
    +.Ft int
    +.Fn ibwrta "int handle" "const void *buffer" "long cnt"
    +.Ft int
    +.Fn ibwrtf "int handle" "const char *flname"
    +.Ft int
    +.Fn ibwrtkey "int handle" "const void *buffer" "int cnt"
    +.Ft int
    +.Fn ibxtrc "int handle" "void *buffer" "long cnt"
    +.Sh DESCRIPTION
    +The
    +.Nm
    +library provides access to the
    +.Xr gpib 4
    +kernel devices.
    +.Ss Variable Description
    +The variable
    +.Dv ibcnt
    +contains the number of bytes transferred in the most recent call to
    +.Fn ibcmd ,
    +.Fn ibrd ,
    +or
    +.Fn ibwrt .
    +.Pp
    +The name
    +.Dv ibcntl
    +is an alias for
    +.Dv ibcnt ,
    +provided for backwards compatibility.
    +.Pp
    +The variable
    +.Dv iberr
    +provides an error code for the most recent library call.
    +The possible error codes are:
    +.Bl -tag -offset indent -compact
    +.It EDVR
    +System error
    +.It ECIC
    +Not Active Controller
    +.It ENOL
    +Nobody listening
    +.It EADR
    +Controller not addressed
    +.It EARG
    +Invalid argument
    +.It ESAC
    +Not System Controller
    +.It EABO
    +I/O Aborted/Time out
    +.It ENEB
    +No such controller
    +.It EOIP
    +Async I/O in progress
    +.It ECAP
    +No such capability
    +.It EFSO
    +File system error
    +.It EBUS
    +Command byte xfer error
    +.It ESTB
    +Serial poll status byte lost
    +.It ESRQ
    +SRQ line stuck
    +.It ETAB
    +Table problem
    +.El
    +.Pp
    +The variable
    +.Dv ibsta
    +contains the controller status.
    +This is an ORed status value, with the following individual bit names:
    +.Bl -tag -offset indent -compact
    +.It ERR
    +Error
    +.It TIMO
    +Timeout
    +.It END
    +EOI/EOS
    +.It SRQI
    +SRQ
    +.It RQS
    +Device requests service
    +.It SPOLL
    +Serial Poll
    +.It EVENT
    +Event occured
    +.It CMPL
    +I/O complete
    +.It LOK
    +Lockout
    +.It REM
    +Remote
    +.It CIC
    +CIC
    +.It ATN
    +ATN
    +.It TACS
    +Talker
    +.It LACS
    +Listener
    +.It DTAS
    +Device trigger status
    +.It DCAS
    +Device clear state
    +.El
    +.Ss Function Description
    +.Pp
    +The function
    +.Fn ibdev
    +is used to open the GPIB device, and establish the parameters to
    +communicate with a particular bus device. The device is selected
    +by its primary address
    +.Fa pad ,
    +a numerical value between 0 and 30, possibly additionally by its
    +secondary address
    +.Fa sad ,
    +a numerical value between 96 and 126, or 0 to not use secondary
    +addressing.
    +The
    +.Fa tmo
    +value specifies the timeout to use when communicating with the device.
    +This can be any of the constants
    +.Dv TNONE ,
    +.Dv T10us ,
    +.Dv T30us ,
    +.Dv T100us ,
    +.Dv T300us ,
    +.Dv T1ms ,
    +.Dv T3ms ,
    +.Dv T10ms ,
    +.Dv T30ms ,
    +.Dv T100ms ,
    +.Dv T300ms ,
    +.Dv T1s ,
    +.Dv T3s ,
    +.Dv T10s ,
    +.Dv T30s ,
    +.Dv T100s ,
    +.Dv T300s ,
    +or
    +.Dv T1000s .
    +The boolean parameter
    +.Fa eot
    +specifies whether the bus signal
    +.Li EOI
    +(end-or-identify) should be asserted when sending the last byte of a
    +message to the device.
    +Finally, the
    +.Fa eos
    +parameter determines whether any special character should be used to
    +identify the end of a device message when transferring messages on the
    +bus.
    +The lower 8 bits of
    +.Fa eos
    +are interpreted as an end-of-string character,
    +.Li EOS .
    +This character can be ORed with the following values:
    +.Bl -tag -compact -offset indent
    +.It Dv REOS
    +When receiving a message byte on the bus that matches the
    +.Li EOS
    +character, treat it as if the
    +.Li EOI
    +signal were asserted, and stop receiving.
    +.It Dv XEOS
    +When transmitting a message byte on the bus that matches the
    +.Li EOS
    +character, assert the
    +.Li EOI
    +bus signal by the same time, and stop sending.
    +.It Dv BIN
    +If set, include all 8 bits of the
    +.Li EOS
    +character in the comparison; if unset, compare only 7 bit ASCII
    +values.
    +.El
    +Passing 0 as
    +.Fa eos
    +will turn off any special character treatment, allowing for a fully
    +8-bit transparent communications channel to the device.
    +.Pp
    +The function
    +.Fn ibfind
    +is meant to find the
    +.Em board index
    +of a board identified by the name
    +.Fa bdname .
    +.Em This function is currently not implemented.
    +.Pp
    +All remaining functions take the handle returned by calling
    +.Fn ibdev
    +as their first argument
    +.Fa handle .
    +.Pp
    +The function
    +.Fn ibask
    +is used to query configuration values that have been set with
    +.Fn ibconfig .
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibbna
    +is meant to change the access board for the given device to
    +a new one, named
    +.Fa bdname .
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibcac
    +is used to become the active controller on the bus, by asserting the
    +.Li ATN
    +signal line.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibclr
    +is used to transmit a
    +.Em Selected Device Clear
    +command to the device.
    +.Pp
    +The function
    +.Fn ibcmd
    +is used to directly write
    +.Fa cnt
    +GPIB command bytes from a buffer starting at
    +.Fa buffer
    +to the device.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibcmda
    +does the same as
    +.Fn ibcmd
    +except it operates asynchronously, so it returns to the caller
    +immediately.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibconfig
    +is used to set certain configuration parameters.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibdiag
    +is obsolete, and not implemented.
    +.Pp
    +The function
    +.Fn ibdma
    +is used to enable or disable DMA transfers.
    +Parameter
    +.Fa v
    +is a boolean parameter indicating DMA transfers are to be used.
    +Depending on the hardware and operating system configuration, DMA
    +transfers might not be available for a particular access board.
    +.Pp
    +The function
    +.Fn ibeos
    +configures the end-of-string character.
    +See
    +.Fn ibdev
    +for an explanation.
    +.Pp
    +The function
    +.Fn ibeot
    +configures the assertion of the
    +.Li EOI
    +signal line when transmitting the last byte of a message; see
    +.Fn ibdev
    +for an explanation.
    +.Pp
    +The function
    +.Fn ibevent
    +is used to obtain an event from the board's event queue.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibgts
    +makes the current controller the standby controller, by deasserting
    +the
    +.Li ATN
    +signal line.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibist
    +sets the individual status bits of the controller to the value
    +.Fa v .
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn iblines
    +returns the status of the control and handshake bus lines into the
    +area pointed to by
    +.Fa lines .
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibllo
    +is obsolete, and not implemented.
    +.Pp
    +The function
    +.Fn ibln
    +checks for a listener at the primary address
    +.Fa  padval
    +and the optional secondary address
    +.Fa sadval .
    +If a listener was found, the value pointed to by
    +.Fa listenflag
    +will be set to a non-zero value.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibloc
    +turns the device into local mode.
    +.Pp
    +The function
    +.Fn ibonl
    +is used to close or reinitialize a device handle.
    +If parameter
    +.Fa v
    +is passed as zero, the handle will be closed, and cannot be used
    +again.
    +If it is passed as a non-zero value, all parameters of the handle
    +will be returned to their defaults;
    +.Em this functionality is currently unsupported.
    +.Pp
    +The function
    +.Fn ibpad
    +is used to change the primary address of the device being communicated
    +with to
    +.Fa pad .
    +See
    +.Fn ibdev
    +for an explanation.
    +.Pp
    +The function
    +.Fn ibpct
    +is used to make the device associated with the handle the
    +controller-in-charge.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibpoke
    +is obsolete, and not implemented.
    +.Pp
    +The function
    +.Fn ibppc
    +is used to configure the parallel poll response to
    +.Fa v .
    +.Em This function is currently not implemented.
    +.Pp
    +The fucntion
    +.Fn ibrd
    +is used to receive
    +.Fa cnt
    +bytes from the device, and store it to the address passed as
    +.Fa buffer .
    +.Pp
    +The function
    +.Fn ibrda
    +behaves similar to
    +.Fn ibrd
    +except it operates asynchronously, and returns immediately to the
    +caller.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibrdf
    +read data from the device, and appends it to the file with the name
    +.Fa flname .
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibrdkey
    +is obsolete, and not implemented.
    +.Pp
    +The function
    +.Fn ibrpp
    +performs a parallel poll, and stores the result at the location
    +pointed to by
    +.Fa ppr .
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibrsc
    +makes the board specified by the handle the
    +.Em system controller
    +if the argument
    +.Fa v
    +is non-zero.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibrsp
    +conducts a serial poll, and stores the result in the byte pointed
    +to by
    +.Fa spr .
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibrsv
    +sets the serial poll response of the board to
    +.Fa v ,
    +possibly requesting service from the controller if the SRQ bit (0x40)
    +is set.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibsad
    +changes the secondary address of the device being communicated with to
    +.Fa sad .
    +See
    +.Fn ibdev
    +for an explanation.
    +.Pp
    +The function
    +.Fn ibsgnl
    +is obsolete, and not implemented.
    +.Pp
    +The function
    +.Fn ibsic
    +asserts the
    +.Em Interface Clear (IFC)
    +signal line on the bus for at least 100 microseconds.
    +This will make all devices attached to the bus to unlisten and untalk.
    +This function should only be executed on the system controller.
    +.Pp
    +The function
    +.Fn ibsre
    +asserts the
    +.Em Remote Enable (REN)
    +signal line on the bus if argument
    +.Fa v
    +is non-zero, or deasserts it otherwise.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibsrq
    +is obsolete, and not implemented.
    +.Pp
    +The function
    +.Fn ibstop
    +stops or aborts any asynchronous I/O operation.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibtmo
    +reconfigures the communication timeout.
    +See
    +.Fn ibdev
    +for an explanation.
    +.Pp
    +The function
    +.Fn ibtrap
    +is obsolete, and not implemented.
    +.Pp
    +The function
    +.Fn ibtrg
    +sends a
    +.Em Group Execute Trigger (GET)
    +command to the device.
    +.Pp
    +The function
    +.Fn ibwait
    +waits for a status condition as specified by
    +.Fa mask .
    +If
    +.Fa mask
    +is given as zero, it returns immediately.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibwrt
    +is used to send
    +.Fa cnt
    +bytes to the device, starting at the address pointed to by
    +.Fa buffer .
    +.Pp
    +The function
    +.Fn ibwrta
    +performs the same operation as
    +.Fn ibwrt
    +in an asynchronous way, returning immediately to the caller.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibwrtf
    +opens the file named by
    +.Fa flname ,
    +and sends its contents to the device.
    +.Em This function is currently not implemented.
    +.Pp
    +The function
    +.Fn ibwrtkey
    +is obsolete, and not implemented
    +.Pp
    +The function
    +.Fn ibxtrc
    +is obsolete, and not implemented.
    +.Sh RETURN VALUES
    +The function
    +.Fn ibdev
    +returns a handle to be used for the remaining functions.
    +Upon failure, -1 is returned.
    +.Pp
    +All other functions return the value of the variable
    +.Dv ibsta .
    +.Sh DIAGNOSTICS
    +None.
    +.Sh COMPATIBILITY
    +The
    +.Nm
    +library tries to be compatible with the Linux GPIB library,
    +which in turn appears to be compatible with the GPIB library
    +shipped by National Instruments.
    +.Sh ERRORS
    +Errors in the functions above might set
    +.Dv errno
    +to one of these values:
    +.Bl -tag -width Er
    +.It Bq Er ENOENT
    +No such file or directory.
    +.It Bq Er EIO
    +Input/output error.
    +.It Bq Er ENXIO
    +Device not configured.
    +.It Bq Er E2BIG
    +Argument list too long.
    +.It Bq Er ENOMEM
    +Cannot allocate memory.
    +.It Bq Er EACCES
    +Permission denied.
    +.It Bq Er EFAULT
    +Bad address.
    +.It Bq Er EBUSY
    +Device busy.
    +.It Bq Er EINVAL
    +Invalid argument.
    +.It Bq Er ENFILE
    +Too many open files in system.
    +.It Bq Er EMFILE
    +Too many open files.
    +.It Bq Er EOPNOTSUPP
    +Operation not supported.
    +.El
    +.Sh SEE ALSO
    +.Xr gpib 4
    +.Sh HISTORY
    +The
    +.Nm
    +library was written by
    +.An Poul-Henning Kamp
    +and first appeared in
    +.Fx 5.4 .
    +.Sh AUTHORS
    +This manual page was written by
    +.An J\(:org Wunsch .
    +.Sh BUGS
    +Currently, the library can only handle a single
    +.Xr gpib 4
    +device with instance number 0.
    +.Pp
    +Many functions are currently not implemented, see above for details.
    diff --git a/lib/libgssapi/Makefile b/lib/libgssapi/Makefile
    index 63d441c34b93..3f016b49bb73 100644
    --- a/lib/libgssapi/Makefile
    +++ b/lib/libgssapi/Makefile
    @@ -2,7 +2,6 @@
     
     LIB=		gssapi
     SHLIB_MAJOR=	10
    -WARNS=		6
     VERSION_DEF=	${.CURDIR}/../libc/Versions.def
     SYMBOL_MAPS=	${.CURDIR}/Symbol.map
     
    diff --git a/lib/libgssapi/gss_accept_sec_context.3 b/lib/libgssapi/gss_accept_sec_context.3
    index 6b575183553b..8957831e1451 100644
    --- a/lib/libgssapi/gss_accept_sec_context.3
    +++ b/lib/libgssapi/gss_accept_sec_context.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_ACCEPT_SEC_CONTEXT 3 PRM
     .Sh NAME
    @@ -451,7 +451,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_acquire_cred.3 b/lib/libgssapi/gss_acquire_cred.3
    index b43185cbdeaa..c48a46838d09 100644
    --- a/lib/libgssapi/gss_acquire_cred.3
    +++ b/lib/libgssapi/gss_acquire_cred.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_ACQUIRE_CRED 3 PRM
     .Sh NAME
    @@ -205,7 +205,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_add_cred.3 b/lib/libgssapi/gss_add_cred.3
    index 72f2ab0a104e..53df140d5559 100644
    --- a/lib/libgssapi/gss_add_cred.3
    +++ b/lib/libgssapi/gss_add_cred.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_ADD_CRED 3 PRM
     .Sh NAME
    @@ -305,7 +305,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_add_oid_set_member.3 b/lib/libgssapi/gss_add_oid_set_member.3
    index 255050b3b398..fb2119cefe88 100644
    --- a/lib/libgssapi/gss_add_oid_set_member.3
    +++ b/lib/libgssapi/gss_add_oid_set_member.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_ADD_OID_SET_MEMBER 3 PRM
     .Sh NAME
    @@ -97,7 +97,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_canonicalize_name.3 b/lib/libgssapi/gss_canonicalize_name.3
    index b38ca93e3e2f..86957dc05842 100644
    --- a/lib/libgssapi/gss_canonicalize_name.3
    +++ b/lib/libgssapi/gss_canonicalize_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_CANONICALIZE_NAME 3 PRM
     .Sh NAME
    @@ -104,7 +104,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_compare_name.3 b/lib/libgssapi/gss_compare_name.3
    index 561c9944161a..7f69d430b27b 100644
    --- a/lib/libgssapi/gss_compare_name.3
    +++ b/lib/libgssapi/gss_compare_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_COMPARE_NAME PRM
     .Sh NAME
    @@ -89,7 +89,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_context_time.3 b/lib/libgssapi/gss_context_time.3
    index 96f61a9c3f24..9fb43eacab05 100644
    --- a/lib/libgssapi/gss_context_time.3
    +++ b/lib/libgssapi/gss_context_time.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_CONTEXT_TIME 3 PRM
     .Sh NAME
    @@ -75,7 +75,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_create_empty_oid_set.3 b/lib/libgssapi/gss_create_empty_oid_set.3
    index fd6cca6495cf..08d82f6b2baa 100644
    --- a/lib/libgssapi/gss_create_empty_oid_set.3
    +++ b/lib/libgssapi/gss_create_empty_oid_set.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_CREATE_EMPTY_OID_SET 3 PRM
     .Sh NAME
    @@ -78,7 +78,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_delete_sec_context.3 b/lib/libgssapi/gss_delete_sec_context.3
    index d24644ac4bdd..a0c26df7f3ea 100644
    --- a/lib/libgssapi/gss_delete_sec_context.3
    +++ b/lib/libgssapi/gss_delete_sec_context.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_DELETE_SEC_CONTEXT 3 PRM
     .Sh NAME
    @@ -130,7 +130,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_display_name.3 b/lib/libgssapi/gss_display_name.3
    index 4f508700b3ae..2441eef4c490 100644
    --- a/lib/libgssapi/gss_display_name.3
    +++ b/lib/libgssapi/gss_display_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_DISPLAY_NAME 3 PRM
     .Sh NAME
    @@ -118,7 +118,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_display_status.3 b/lib/libgssapi/gss_display_status.3
    index 3b3c3236559a..2b1affd4e351 100644
    --- a/lib/libgssapi/gss_display_status.3
    +++ b/lib/libgssapi/gss_display_status.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_DISPLAY_STATUS 3 PRM
     .Sh NAME
    @@ -177,7 +177,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_duplicate_name.3 b/lib/libgssapi/gss_duplicate_name.3
    index af885bfb229c..334a12684104 100644
    --- a/lib/libgssapi/gss_duplicate_name.3
    +++ b/lib/libgssapi/gss_duplicate_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_DUPLICATE_NAME 3 PRM
     .Sh NAME
    @@ -90,7 +90,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_export_name.3 b/lib/libgssapi/gss_export_name.3
    index c10f472d2ba5..e1feee22bd60 100644
    --- a/lib/libgssapi/gss_export_name.3
    +++ b/lib/libgssapi/gss_export_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_EXPORT_NAME 3 PRM
     .Sh NAME
    @@ -95,7 +95,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_export_sec_context.3 b/lib/libgssapi/gss_export_sec_context.3
    index d8359c8be30a..1f7f01df9d3f 100644
    --- a/lib/libgssapi/gss_export_sec_context.3
    +++ b/lib/libgssapi/gss_export_sec_context.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_EXPORT_SEC_CONTEXT 3 PRM
     .Sh NAME
    @@ -135,7 +135,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_get_mic.3 b/lib/libgssapi/gss_get_mic.3
    index 8f435d6fe083..8892808f022d 100644
    --- a/lib/libgssapi/gss_get_mic.3
    +++ b/lib/libgssapi/gss_get_mic.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_GET_MIC 3 PRM
     .Sh NAME
    @@ -132,7 +132,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_import_name.3 b/lib/libgssapi/gss_import_name.3
    index ed16278b93d6..3119f04534bb 100644
    --- a/lib/libgssapi/gss_import_name.3
    +++ b/lib/libgssapi/gss_import_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_IMPORT_NAME 3 PRM
     .Sh NAME
    @@ -106,7 +106,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_import_sec_context.3 b/lib/libgssapi/gss_import_sec_context.3
    index f4dda843c4ae..a889e2b7fa43 100644
    --- a/lib/libgssapi/gss_import_sec_context.3
    +++ b/lib/libgssapi/gss_import_sec_context.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_IMPORT_SEC_CONTEXT 3 PRM
     .Sh NAME
    @@ -87,7 +87,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_indicate_mechs.3 b/lib/libgssapi/gss_indicate_mechs.3
    index 469ad1db4662..26ffaa601624 100644
    --- a/lib/libgssapi/gss_indicate_mechs.3
    +++ b/lib/libgssapi/gss_indicate_mechs.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_INDICATE_MECHS 3 PRM
     .Sh NAME
    @@ -74,7 +74,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_init_sec_context.3 b/lib/libgssapi/gss_init_sec_context.3
    index 5c39de457df9..787aff327217 100644
    --- a/lib/libgssapi/gss_init_sec_context.3
    +++ b/lib/libgssapi/gss_init_sec_context.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_INIT_SEC_CONTEXT 3 PRM
     .Sh NAME
    @@ -538,7 +538,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_inquire_context.3 b/lib/libgssapi/gss_inquire_context.3
    index 2ecd4d60567f..51fa18db8299 100644
    --- a/lib/libgssapi/gss_inquire_context.3
    +++ b/lib/libgssapi/gss_inquire_context.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_INQUIRE_CONTEXT 3 PRM
     .Sh NAME
    @@ -251,7 +251,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_inquire_cred.3 b/lib/libgssapi/gss_inquire_cred.3
    index 979f96e7ce09..99c20ce01fbb 100644
    --- a/lib/libgssapi/gss_inquire_cred.3
    +++ b/lib/libgssapi/gss_inquire_cred.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_INQUIRE_CRED 3 PRM
     .Sh NAME
    @@ -125,7 +125,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_inquire_cred_by_mech.3 b/lib/libgssapi/gss_inquire_cred_by_mech.3
    index 85b5ecc8e44a..22319bd4613d 100644
    --- a/lib/libgssapi/gss_inquire_cred_by_mech.3
    +++ b/lib/libgssapi/gss_inquire_cred_by_mech.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_INQUIRE_CRED_BY_MECH 3 PRM
     .Sh NAME
    @@ -139,7 +139,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_inquire_mechs_for_name.3 b/lib/libgssapi/gss_inquire_mechs_for_name.3
    index 91d1c81082c6..b56e663a18d8 100644
    --- a/lib/libgssapi/gss_inquire_mechs_for_name.3
    +++ b/lib/libgssapi/gss_inquire_mechs_for_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_INQUIRE_MECHS_FOR_NAME 3 PRM
     .Sh NAME
    @@ -100,7 +100,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_inquire_names_for_mech.3 b/lib/libgssapi/gss_inquire_names_for_mech.3
    index 64d8c9c0940e..8b7f069f9158 100644
    --- a/lib/libgssapi/gss_inquire_names_for_mech.3
    +++ b/lib/libgssapi/gss_inquire_names_for_mech.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_INQUIRE_NAMES_FOR_MECH 3 PRM
     .Sh NAME
    @@ -74,7 +74,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_mech_switch.c b/lib/libgssapi/gss_mech_switch.c
    index feb88f1a68c8..d07db8865d3f 100644
    --- a/lib/libgssapi/gss_mech_switch.c
    +++ b/lib/libgssapi/gss_mech_switch.c
    @@ -42,7 +42,7 @@
     #endif
     
     struct _gss_mech_switch_list _gss_mechs =
    -	SLIST_HEAD_INITIALIZER(&_gss_mechs);
    +	SLIST_HEAD_INITIALIZER(_gss_mechs);
     gss_OID_set _gss_mech_oids;
     
     /*
    diff --git a/lib/libgssapi/gss_process_context_token.3 b/lib/libgssapi/gss_process_context_token.3
    index 884a5568acd4..85e1029aab08 100644
    --- a/lib/libgssapi/gss_process_context_token.3
    +++ b/lib/libgssapi/gss_process_context_token.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_PROCESS_CONTEXT_TOKEN 3 PRM
     .Sh NAME
    @@ -103,7 +103,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_release_buffer.3 b/lib/libgssapi/gss_release_buffer.3
    index 4cc449f9eae4..432d42276c53 100644
    --- a/lib/libgssapi/gss_release_buffer.3
    +++ b/lib/libgssapi/gss_release_buffer.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_RELEASE_BUFFER 3 PRM
     .Sh NAME
    @@ -78,7 +78,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_release_cred.3 b/lib/libgssapi/gss_release_cred.3
    index 2f9fca6cbc32..ca99fc40a8fc 100644
    --- a/lib/libgssapi/gss_release_cred.3
    +++ b/lib/libgssapi/gss_release_cred.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_RELEASE_CRED 3 PRM
     .Sh NAME
    @@ -75,7 +75,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_release_name.3 b/lib/libgssapi/gss_release_name.3
    index a6d858c30e25..7bf1181f22a0 100644
    --- a/lib/libgssapi/gss_release_name.3
    +++ b/lib/libgssapi/gss_release_name.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_RELEASE_NAME 3 PRM
     .Sh NAME
    @@ -71,7 +71,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_release_oid_set.3 b/lib/libgssapi/gss_release_oid_set.3
    index 1e11f44de390..0142e2feec15 100644
    --- a/lib/libgssapi/gss_release_oid_set.3
    +++ b/lib/libgssapi/gss_release_oid_set.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_RELEASE_OID_SET 3 PRM
     .Sh NAME
    @@ -76,7 +76,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_test_oid_set_member.3 b/lib/libgssapi/gss_test_oid_set_member.3
    index 38e5f3fe4534..86e06b35bb7c 100644
    --- a/lib/libgssapi/gss_test_oid_set_member.3
    +++ b/lib/libgssapi/gss_test_oid_set_member.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_TEST_OID_SET_MEMBER 3 PRM
     .Sh NAME
    @@ -83,7 +83,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_unwrap.3 b/lib/libgssapi/gss_unwrap.3
    index 770d9c924afe..4cf3c6d22cb6 100644
    --- a/lib/libgssapi/gss_unwrap.3
    +++ b/lib/libgssapi/gss_unwrap.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_UNWRAP 3 PRM
     .Sh NAME
    @@ -158,7 +158,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_verify_mic.3 b/lib/libgssapi/gss_verify_mic.3
    index e482dbf6d3e3..b72f468ce7d5 100644
    --- a/lib/libgssapi/gss_verify_mic.3
    +++ b/lib/libgssapi/gss_verify_mic.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_VERIFY_MIC 3 PRM
     .Sh NAME
    @@ -139,7 +139,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_wrap.3 b/lib/libgssapi/gss_wrap.3
    index a80cf46edd05..c432b482c1b4 100644
    --- a/lib/libgssapi/gss_wrap.3
    +++ b/lib/libgssapi/gss_wrap.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_WRAP 3 PRM
     .Sh NAME
    @@ -146,7 +146,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gss_wrap_size_limit.3 b/lib/libgssapi/gss_wrap_size_limit.3
    index a3e5a9d1f783..c1d40da014de 100644
    --- a/lib/libgssapi/gss_wrap_size_limit.3
    +++ b/lib/libgssapi/gss_wrap_size_limit.3
    @@ -27,7 +27,7 @@
     .\"	$FreeBSD$
     .\"
     .\" The following commands are required for all man pages.
    -.Dd October 30, 2007
    +.Dd January 26, 2010
     .Os
     .Dt GSS_WRAP_SIZE_LIMIT 3 PRM
     .Sh NAME
    @@ -131,7 +131,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/gssapi.3 b/lib/libgssapi/gssapi.3
    index ce26e7eed4e6..2ed54a9b3c8f 100644
    --- a/lib/libgssapi/gssapi.3
    +++ b/lib/libgssapi/gssapi.3
    @@ -26,7 +26,7 @@
     .\"
     .\"	$FreeBSD$
     .\"
    -.Dd November 30, 2005
    +.Dd January 26, 2010
     .Dt GSSAPI 3
     .Os
     .Sh NAME
    @@ -229,7 +229,7 @@ Generic Security Service API Version 2 : C-bindings
     .Sh HISTORY
     The
     .Nm
    -manual page first appeared in
    +library first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     John Wray, Iris Associates
    diff --git a/lib/libgssapi/mech.5 b/lib/libgssapi/mech.5
    index fd17e3a21b04..6078828e97fc 100644
    --- a/lib/libgssapi/mech.5
    +++ b/lib/libgssapi/mech.5
    @@ -23,7 +23,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd November 14, 2005
    +.Dd January 26, 2010
     .Dt MECH 5
     .Os
     .Sh NAME
    @@ -93,7 +93,7 @@ GSS_KRB5_CONF_C_QOP_DES		0x0100	kerberosv5
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +manual page first appeared in
     .Fx 7.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/libipsec/Makefile b/lib/libipsec/Makefile
    index 5455945ddd79..840aefa54f27 100644
    --- a/lib/libipsec/Makefile
    +++ b/lib/libipsec/Makefile
    @@ -48,6 +48,8 @@ CLEANFILES+=	y.tab.c y.tab.h
     YFLAGS+=-d -p __libipsecyy
     LFLAGS+=-P__libipsecyy
     
    +WARNS?=	2
    +
     MAN=	ipsec_set_policy.3 ipsec_strerror.3
     MLINKS+=ipsec_set_policy.3 ipsec_get_policylen.3 \
     	ipsec_set_policy.3 ipsec_dump_policy.3
    diff --git a/lib/libipx/Makefile b/lib/libipx/Makefile
    index 66f566a4bd04..b816ba306b74 100644
    --- a/lib/libipx/Makefile
    +++ b/lib/libipx/Makefile
    @@ -6,4 +6,6 @@ SRCS=	ipx_addr.c ipx_ntoa.c
     MAN=	ipx.3
     MLINKS+=ipx.3 ipx_addr.3 ipx.3 ipx_ntoa.3
     
    +WARNS?=	2
    +
     .include 
    diff --git a/lib/libjail/Makefile b/lib/libjail/Makefile
    index 678d59e08014..442274ae35dd 100644
    --- a/lib/libjail/Makefile
    +++ b/lib/libjail/Makefile
    @@ -24,6 +24,4 @@ MLINKS+=jail.3 jailparam_free.3
     
     CFLAGS+=-I${.CURDIR}
     
    -WARNS?=	6
    -
     .include 
    diff --git a/lib/libjail/jail.c b/lib/libjail/jail.c
    index 9411b88bdf6b..c82cb114641b 100644
    --- a/lib/libjail/jail.c
    +++ b/lib/libjail/jail.c
    @@ -191,7 +191,7 @@ jailparam_all(struct jailparam **jpp)
     		/* Add the parameter to the list */
     		if (njp >= nlist) {
     			nlist *= 2;
    -			jp = realloc(jp, nlist * sizeof(jp));
    +			jp = realloc(jp, nlist * sizeof(*jp));
     			if (jp == NULL) {
     				jailparam_free(jp, njp);
     				return (-1);
    @@ -532,7 +532,7 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
     	}
     	jp_key = jp_lastjid ? jp_lastjid :
     	    jp_jid && jp_jid->jp_valuelen == sizeof(int) &&
    -	    *(int *)jp_jid->jp_value ? jp_jid : jp_name;
    +	    jp_jid->jp_value && *(int *)jp_jid->jp_value ? jp_jid : jp_name;
     	if (jp_key == NULL || jp_key->jp_value == NULL) {
     		strlcpy(jail_errmsg, "no jail specified", JAIL_ERRMSGLEN);
     		errno = ENOENT;
    diff --git a/lib/libkiconv/Makefile b/lib/libkiconv/Makefile
    index 2a0bd6a42121..4ba860ef903e 100644
    --- a/lib/libkiconv/Makefile
    +++ b/lib/libkiconv/Makefile
    @@ -15,4 +15,6 @@ MLINKS+=	kiconv.3 kiconv_add_xlat16_cspair.3 \
     
     CFLAGS+=	-I${.CURDIR}/../../sys
     
    +WARNS?=		1
    +
     .include 
    diff --git a/lib/libkse/Makefile b/lib/libkse/Makefile
    index 9fe09c564bdf..c4e2b5abc21a 100644
    --- a/lib/libkse/Makefile
    +++ b/lib/libkse/Makefile
    @@ -10,15 +10,7 @@
     
     .include 
     
    -.if ${DEFAULT_THREAD_LIB} == "libkse" || ${MK_LIBTHR} == "no"
    -LIB=kse
    -.if ${SHLIBDIR} == "/usr/lib"
    -SHLIBDIR= /lib
    -.endif
    -.else
     SHLIB=kse
    -.endif
    -
     SHLIB_MAJOR= 4
     CFLAGS+=-DPTHREAD_KERNEL
     CFLAGS+=-I${.CURDIR}/../libc/include -I${.CURDIR}/thread \
    @@ -51,16 +43,4 @@ PRECIOUSLIB=
     .include "${.CURDIR}/sys/Makefile.inc"
     .include "${.CURDIR}/thread/Makefile.inc"
     
    -.if ${DEFAULT_THREAD_LIB} == "libkse" || ${MK_LIBTHR} == "no"
    -.if ${MK_INSTALLLIB} != "no"
    -SYMLINKS+=lib${LIB}.a ${LIBDIR}/libpthread.a
    -.endif
    -.if !defined(NO_PIC)
    -SYMLINKS+=lib${LIB}.so ${LIBDIR}/libpthread.so
    -.endif
    -.if ${MK_PROFILE} != "no"
    -SYMLINKS+=lib${LIB}_p.a ${LIBDIR}/libpthread_p.a
    -.endif
    -.endif
    -
     .include 
    diff --git a/lib/libkvm/Makefile b/lib/libkvm/Makefile
    index 47dc613ab7ed..e62d7cae2913 100644
    --- a/lib/libkvm/Makefile
    +++ b/lib/libkvm/Makefile
    @@ -9,6 +9,8 @@ CFLAGS+=-DLIBC_SCCS -I${.CURDIR}
     CFLAGS+=-DSUN4V
     .endif
     
    +WARNS?=	0
    +
     SRCS=	kvm.c kvm_${MACHINE_ARCH}.c kvm_cptime.c kvm_file.c kvm_getloadavg.c \
     	kvm_getswapinfo.c kvm_pcpu.c kvm_proc.c kvm_vnet.c
     .if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "arm"
    @@ -21,6 +23,7 @@ MAN=	kvm.3 kvm_getcptime.3 kvm_geterr.3 kvm_getfiles.3 kvm_getloadavg.3 \
     	kvm_read.3
     
     MLINKS+=kvm_getpcpu.3 kvm_getmaxcpu.3
    +MLINKS+=kvm_getpcpu.3 kvm_dpcpu_setcpu.3
     MLINKS+=kvm_getprocs.3 kvm_getargv.3 kvm_getprocs.3 kvm_getenvv.3
     MLINKS+=kvm_open.3 kvm_close.3 kvm_open.3 kvm_openfiles.3
     MLINKS+=kvm_read.3 kvm_write.3
    diff --git a/lib/libkvm/kvm.c b/lib/libkvm/kvm.c
    index 50f752aa659d..37f6a724dee1 100644
    --- a/lib/libkvm/kvm.c
    +++ b/lib/libkvm/kvm.c
    @@ -416,6 +416,8 @@ _kvm_nlist(kvm_t *kd, struct nlist *nl, int initialize)
     	struct kld_sym_lookup lookup;
     	int error;
     	char *prefix = "", symname[1024]; /* XXX-BZ symbol name length limit? */
    +	int tried_vnet, tried_dpcpu;
    +
     	/*
     	 * If we can't use the kld symbol lookup, revert to the
     	 * slow library call.
    @@ -429,6 +431,10 @@ _kvm_nlist(kvm_t *kd, struct nlist *nl, int initialize)
     			error = kvm_fdnlist_prefix(kd, nl, error,
     			    VNET_SYMPREFIX, _kvm_vnet_validaddr);
     
    +		if (error > 0 && _kvm_dpcpu_initialized(kd, initialize))
    +			error = kvm_fdnlist_prefix(kd, nl, error,
    +			    "pcpu_entry_", _kvm_dpcpu_validaddr);
    +
     		return (error);
     	}
     
    @@ -437,6 +443,8 @@ _kvm_nlist(kvm_t *kd, struct nlist *nl, int initialize)
     	 * and look it up with a kldsym(2) syscall.
     	 */
     	nvalid = 0;
    +	tried_vnet = 0;
    +	tried_dpcpu = 0;
     again:
     	for (p = nl; p->n_name && p->n_name[0]; ++p) {
     		if (p->n_type != N_UNDF)
    @@ -464,6 +472,10 @@ again:
     			    !strcmp(prefix, VNET_SYMPREFIX))
     				p->n_value =
     				    _kvm_vnet_validaddr(kd, lookup.symvalue);
    +			else if (_kvm_dpcpu_initialized(kd, initialize) &&
    +			    !strcmp(prefix, "pcpu_entry_"))
    +				p->n_value =
    +				    _kvm_dpcpu_validaddr(kd, lookup.symvalue);
     			else
     				p->n_value = lookup.symvalue;
     			++nvalid;
    @@ -473,14 +485,19 @@ again:
     
     	/*
     	 * Check the number of entries that weren't found. If they exist,
    -	 * try again with a prefix for virtualized symbol names.
    +	 * try again with a prefix for virtualized or DPCPU symbol names.
     	 */
     	error = ((p - nl) - nvalid);
    -	if (error && _kvm_vnet_initialized(kd, initialize) &&
    -	    strcmp(prefix, VNET_SYMPREFIX)) {
    +	if (error && _kvm_vnet_initialized(kd, initialize) && !tried_vnet) {
    +		tried_vnet = 1;
     		prefix = VNET_SYMPREFIX;
     		goto again;
     	}
    +	if (error && _kvm_dpcpu_initialized(kd, initialize) && !tried_dpcpu) {
    +		tried_dpcpu = 1;
    +		prefix = "pcpu_entry_";
    +		goto again;
    +	}
     
     	/*
     	 * Return the number of entries that weren't found. If they exist,
    diff --git a/lib/libkvm/kvm.h b/lib/libkvm/kvm.h
    index 0427bd1c027e..6c8fdce4c8b7 100644
    --- a/lib/libkvm/kvm.h
    +++ b/lib/libkvm/kvm.h
    @@ -69,6 +69,7 @@ struct kvm_swap {
     
     __BEGIN_DECLS
     int	  kvm_close(kvm_t *);
    +int	  kvm_dpcpu_setcpu(kvm_t *, unsigned int);
     char	**kvm_getargv(kvm_t *, const struct kinfo_proc *, int);
     int	  kvm_getcptime(kvm_t *, long *);
     char	**kvm_getenvv(kvm_t *, const struct kinfo_proc *, int);
    diff --git a/lib/libkvm/kvm_getpcpu.3 b/lib/libkvm/kvm_getpcpu.3
    index 40f16ac7e53c..f2deda935ad8 100644
    --- a/lib/libkvm/kvm_getpcpu.3
    +++ b/lib/libkvm/kvm_getpcpu.3
    @@ -28,10 +28,11 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd August 19, 2008
    +.Dd February 28, 2010
     .Dt KVM_GETPCPU 3
     .Os
     .Sh NAME
    +.Nm kvm_dpcpu_setcpu
     .Nm kvm_getmaxcpu ,
     .Nm kvm_getpcpu
     .Nd access per-CPU data
    @@ -43,20 +44,30 @@
     .In sys/sysctl.h
     .In kvm.h
     .Ft int
    +.Fn kvm_dpcpu_setcpu "kvm_t *kd" "u_int cpu"
    +.Ft int
     .Fn kvm_getmaxcpu "kvm_t *kd"
     .Ft void *
     .Fn kvm_getpcpu "kvm_t *kd" "int cpu"
     .Sh DESCRIPTION
     The
    -.Fn kvm_getmaxcpu
    +.Fn kvm_dpcpu_setcpu ,
    +.Fn kvm_getmaxcpu ,
     and
     .Fn kvm_getpcpu
     functions are used to access the per-CPU data of active processors in the
     kernel indicated by
     .Fa kd .
    +Per-CPU storage comes in two flavours: data stored directly in a
    +.Vt "struct pcpu"
    +associated with each CPU, and dynamic per-CPU storage (DPCPU), in which a
    +single kernel symbol refers to different data depending on what CPU it is
    +accessed from.
    +.Pp
     The
     .Fn kvm_getmaxcpu
     function returns the maximum number of CPUs supported by the kernel.
    +.Pp
     The
     .Fn kvm_getpcpu
     function returns a buffer holding the per-CPU data for a single CPU.
    @@ -71,8 +82,22 @@ If
     is not active, then
     .Dv NULL
     is returned instead.
    +.Pp
    +Symbols for dynamic per-CPU data are accessed via
    +.Xr kvm_nlist 3
    +as with other symbols.
    +.Nm libkvm
    +maintains a notion of the "current CPU", set by
    +.Xr kvm_dpcpu_setcpu ,
    +which defaults to 0.
    +Once another CPU is selected,
    +.Xr kvm_nlist 3
    +will return pointers to that data on the appropriate CPU.
     .Sh CACHING
    -These functions cache the nlist values for various kernel variables which are
    +.Fn kvm_getmaxcpu
    +and
    +.Vn kvm_getpcpu
    +cache the nlist values for various kernel variables which are
     reused in successive calls.
     You may call either function with
     .Fa kd
    @@ -93,7 +118,11 @@ function returns a pointer to an allocated buffer or
     If an error occurs,
     it returns -1 instead.
     .Pp
    -If either function encounters an error,
    +On success, the
    +.Fn kvm_dpcpu_setcpu
    +call returns 0; if an error occurs, it returns -1 instead.
    +.Pp
    +If any function encounters an error,
     then an error message may be retrieved via
     .Xr kvm_geterr 3.
     .Sh SEE ALSO
    diff --git a/lib/libkvm/kvm_i386.c b/lib/libkvm/kvm_i386.c
    index 303b4af4ac32..ac86ba697c45 100644
    --- a/lib/libkvm/kvm_i386.c
    +++ b/lib/libkvm/kvm_i386.c
    @@ -295,9 +295,9 @@ _kvm_vatop(kvm_t *kd, u_long va, off_t *pa)
     #define	PG_FRAME4M	(~PAGE4M_MASK)
     		pde_pa = ((u_long)pde & PG_FRAME4M) + (va & PAGE4M_MASK);
     		s = _kvm_pa2off(kd, pde_pa, &ofs);
    -		if (s < sizeof pde) {
    -			_kvm_syserr(kd, kd->program,
    -			    "_kvm_vatop: pde_pa not found");
    +		if (s == 0) {
    +			_kvm_err(kd, kd->program,
    +			    "_kvm_vatop: 4MB page address not in dump");
     			goto invalid;
     		}
     		*pa = ofs;
    @@ -391,9 +391,9 @@ _kvm_vatop_pae(kvm_t *kd, u_long va, off_t *pa)
     #define	PG_FRAME2M	(~PAGE2M_MASK)
     		pde_pa = ((u_long)pde & PG_FRAME2M) + (va & PAGE2M_MASK);
     		s = _kvm_pa2off(kd, pde_pa, &ofs);
    -		if (s < sizeof pde) {
    -			_kvm_syserr(kd, kd->program,
    -			    "_kvm_vatop_pae: pde_pa not found");
    +		if (s == 0) {
    +			_kvm_err(kd, kd->program,
    +			    "_kvm_vatop: 2MB page address not in dump");
     			goto invalid;
     		}
     		*pa = ofs;
    diff --git a/lib/libkvm/kvm_pcpu.c b/lib/libkvm/kvm_pcpu.c
    index e4f890984aed..484d2ea48505 100644
    --- a/lib/libkvm/kvm_pcpu.c
    +++ b/lib/libkvm/kvm_pcpu.c
    @@ -1,8 +1,15 @@
     /*-
    + * Copyright (c) 2010 Juniper Networks, Inc.
    + * Copyright (c) 2009 Robert N. M. Watson
    + * Copyright (c) 2009 Bjoern A. Zeeb 
      * Copyright (c) 2008 Yahoo!, Inc.
      * All rights reserved.
    + *
      * Written by: John Baldwin 
      *
    + * This software was developed by Robert N. M. Watson under contract
    + * to Juniper Networks, Inc.
    + *
      * Redistribution and use in source and binary forms, with or without
      * modification, are permitted provided that the following conditions
      * are met:
    @@ -49,6 +56,10 @@ static struct nlist kvm_pcpu_nl[] = {
     /*
      * Kernel per-CPU data state.  We cache this stuff on the first
      * access.	
    + *
    + * XXXRW: Possibly, this (and kvmpcpu_nl) should be per-kvm_t, in case the
    + * consumer has multiple handles in flight to differently configured
    + * kernels/crashdumps.
      */
     static void **pcpu_data;
     static int maxcpu;
    @@ -150,3 +161,132 @@ kvm_getmaxcpu(kvm_t *kd)
     			return (-1);
     	return (maxcpu);
     }
    +
    +static int
    +_kvm_dpcpu_setcpu(kvm_t *kd, u_int cpu, int report_error)
    +{
    +
    +	if (!kd->dpcpu_initialized) {
    +		if (report_error)
    +			_kvm_err(kd, kd->program, "%s: not initialized",
    +			    __func__);
    +		return (-1);
    +	}
    +	if (cpu >= kd->dpcpu_maxcpus) {
    +		if (report_error)
    +			_kvm_err(kd, kd->program, "%s: CPU %u too big",
    +			    __func__, cpu);
    +		return (-1);
    +	}
    +	if (kd->dpcpu_off[cpu] == 0) {
    +		if (report_error)
    +			_kvm_err(kd, kd->program, "%s: CPU %u not found",
    +			    __func__, cpu);
    +		return (-1);
    +	}
    +	kd->dpcpu_curcpu = cpu;
    +	kd->dpcpu_curoff = kd->dpcpu_off[cpu];
    +	return (0);
    +}
    +
    +/*
    + * Set up libkvm to handle dynamic per-CPU memory.
    + */
    +static int
    +_kvm_dpcpu_init(kvm_t *kd)
    +{
    +	struct nlist nl[] = {
    +#define	NLIST_START_SET_PCPU	0
    +		{ "___start_set_pcpu" },
    +#define	NLIST_STOP_SET_PCPU	1
    +		{ "___stop_set_pcpu" },
    +#define	NLIST_DPCPU_OFF		2
    +		{ "_dpcpu_off" },
    +#define	NLIST_MP_MAXCPUS	3
    +		{ "_mp_maxcpus" },
    +		{ NULL },
    +	};
    +	uintptr_t *dpcpu_off_buf;
    +	size_t len;
    +	u_int dpcpu_maxcpus;
    +
    +	/*
    +	 * Locate and cache locations of important symbols using the internal
    +	 * version of _kvm_nlist, turning off initialization to avoid
    +	 * recursion in case of unresolveable symbols.
    +	 */
    +	if (_kvm_nlist(kd, nl, 0) != 0)
    +		return (-1);
    +	if (kvm_read(kd, nl[NLIST_MP_MAXCPUS].n_value, &dpcpu_maxcpus,
    +	    sizeof(dpcpu_maxcpus)) != sizeof(dpcpu_maxcpus))
    +		return (-1);
    +	len = dpcpu_maxcpus * sizeof(*dpcpu_off_buf);
    +	dpcpu_off_buf = malloc(len);
    +	if (dpcpu_off_buf == NULL)
    +		return (-1);
    +	if (kvm_read(kd, nl[NLIST_DPCPU_OFF].n_value, dpcpu_off_buf, len) !=
    +	    len) {
    +		free(dpcpu_off_buf);
    +		return (-1);
    +	}
    +	kd->dpcpu_start = nl[NLIST_START_SET_PCPU].n_value;
    +	kd->dpcpu_stop = nl[NLIST_STOP_SET_PCPU].n_value;
    +	kd->dpcpu_maxcpus = dpcpu_maxcpus;
    +	kd->dpcpu_off = dpcpu_off_buf;
    +	kd->dpcpu_initialized = 1;
    +	(void)_kvm_dpcpu_setcpu(kd, 0, 0);
    +	return (0);
    +}
    +
    +/*
    + * Check whether the dpcpu module has been initialized sucessfully or not,
    + * initialize it if permitted.
    + */
    +int
    +_kvm_dpcpu_initialized(kvm_t *kd, int intialize)
    +{
    +
    +	if (kd->dpcpu_initialized || !intialize)
    +		return (kd->dpcpu_initialized);
    +
    +	(void)_kvm_dpcpu_init(kd);
    +
    +	return (kd->dpcpu_initialized);
    +}
    +
    +/*
    + * Check whether the value is within the dpcpu symbol range and only if so
    + * adjust the offset relative to the current offset.
    + */
    +uintptr_t
    +_kvm_dpcpu_validaddr(kvm_t *kd, uintptr_t value)
    +{
    +
    +	if (value == 0)
    +		return (value);
    +
    +	if (!kd->dpcpu_initialized)
    +		return (value);
    +
    +	if (value < kd->dpcpu_start || value >= kd->dpcpu_stop)
    +		return (value);
    +
    +	return (kd->dpcpu_curoff + value);
    +}
    +
    +int
    +kvm_dpcpu_setcpu(kvm_t *kd, u_int cpu)
    +{
    +	int ret;
    +
    +	if (!kd->dpcpu_initialized) {
    +		ret = _kvm_dpcpu_init(kd);
    +		if (ret != 0) {
    +			_kvm_err(kd, kd->program, "%s: init failed",
    +			    __func__);
    +			return (ret);
    +		}
    +	}
    +
    +	return (_kvm_dpcpu_setcpu(kd, cpu, 1));
    +}
    diff --git a/lib/libkvm/kvm_private.h b/lib/libkvm/kvm_private.h
    index cc073db5fe42..69b1658f8e48 100644
    --- a/lib/libkvm/kvm_private.h
    +++ b/lib/libkvm/kvm_private.h
    @@ -68,6 +68,19 @@ struct __kvm {
     	uintptr_t	vnet_stop;	/* stop of kernel's vnet region */
     	uintptr_t	vnet_current;	/* vnet we're working with */
     	uintptr_t	vnet_base;	/* vnet base of current vnet */
    +
    +	/*
    +	 * Dynamic per-CPU kernel memory.  We translate symbols, on-demand,
    +	 * to the data associated with dpcpu_curcpu, set with
    +	 * kvm_dpcpu_setcpu().
    +	 */
    +	int		dpcpu_initialized;	/* dpcpu fields set up */
    +	uintptr_t	dpcpu_start;	/* start of kernel's dpcpu region */
    +	uintptr_t	dpcpu_stop;	/* stop of kernel's dpcpu region */
    +	u_int		dpcpu_maxcpus;	/* size of base array */
    +	uintptr_t	*dpcpu_off;	/* base array, indexed by CPU ID */
    +	u_int		dpcpu_curcpu;	/* CPU we're currently working with */
    +	uintptr_t	dpcpu_curoff;	/* dpcpu base of current CPU */
     };
     
     /*
    @@ -88,6 +101,8 @@ int	 _kvm_uvatop(kvm_t *, const struct proc *, u_long, u_long *);
     int	 _kvm_vnet_selectpid(kvm_t *, pid_t);
     int	 _kvm_vnet_initialized(kvm_t *, int);
     uintptr_t _kvm_vnet_validaddr(kvm_t *, uintptr_t);
    +int	 _kvm_dpcpu_initialized(kvm_t *, int);
    +uintptr_t _kvm_dpcpu_validaddr(kvm_t *, uintptr_t);
     
     #if defined(__amd64__) || defined(__i386__) || defined(__arm__)
     void	 _kvm_minidump_freevtop(kvm_t *);
    diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
    index 071f859e002d..f8f84830d0a8 100644
    --- a/lib/libkvm/kvm_proc.c
    +++ b/lib/libkvm/kvm_proc.c
    @@ -149,7 +149,7 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
     			if (ucred.cr_ngroups > KI_NGROUPS) {
     				kp->ki_ngroups = KI_NGROUPS;
     				kp->ki_cr_flags |= KI_CRF_GRP_OVERFLOW;
    -			}
    +			} else
     				kp->ki_ngroups = ucred.cr_ngroups;
     			kvm_read(kd, (u_long)ucred.cr_groups, kp->ki_groups,
     			    kp->ki_ngroups * sizeof(gid_t));
    diff --git a/lib/libkvm/kvm_vnet.c b/lib/libkvm/kvm_vnet.c
    index d192c67ced0c..a5c8aad22468 100644
    --- a/lib/libkvm/kvm_vnet.c
    +++ b/lib/libkvm/kvm_vnet.c
    @@ -117,8 +117,8 @@ _kvm_vnet_selectpid(kvm_t *kd, pid_t pid)
     	}
     
     	/*
    -	 * First, find the process for this pid.  If we are workig on a dump,
    -	 * either locate the thread dumptid is refering to or proc0.
    +	 * First, find the process for this pid.  If we are working on a
    +	 * dump, either locate the thread dumptid is refering to or proc0.
     	 * Based on either, take the address of the ucred.
     	 */
     	credp = 0;
    diff --git a/lib/libmagic/Makefile b/lib/libmagic/Makefile
    index 618a6f5b4274..ef7cc2b68032 100644
    --- a/lib/libmagic/Makefile
    +++ b/lib/libmagic/Makefile
    @@ -20,6 +20,8 @@ MAGICPATH?=	/usr/share/misc
     CFLAGS+= -DMAGIC='"${MAGICPATH}/magic"' -DHAVE_CONFIG_H
     CFLAGS+= -I${.CURDIR} -I${CONTRDIR}
     
    +WARNS?=		1
    +
     CLEANFILES+=	magic magic.mgc
     
     FILES=		magic magic.mgc
    diff --git a/lib/libmd/Makefile b/lib/libmd/Makefile
    index cf9d44345430..ba1ebc034175 100644
    --- a/lib/libmd/Makefile
    +++ b/lib/libmd/Makefile
    @@ -8,6 +8,8 @@ SRCS=	md2c.c md4c.c md5c.c md2hl.c md4hl.c md5hl.c \
     	sha256c.c sha256hl.c
     INCS=	md2.h md4.h md5.h ripemd.h sha.h sha256.h
     
    +WARNS?=	0
    +
     MAN+=	md2.3 md4.3 md5.3 ripemd.3 sha.3 sha256.3
     MLINKS+=md2.3 MD2Init.3 md2.3 MD2Update.3 md2.3 MD2Final.3
     MLINKS+=md2.3 MD2End.3  md2.3 MD2File.3   md2.3 MD2FileChunk.3
    diff --git a/lib/libmilter/Makefile b/lib/libmilter/Makefile
    index 75c93333fc5d..0e625d0812a4 100644
    --- a/lib/libmilter/Makefile
    +++ b/lib/libmilter/Makefile
    @@ -27,6 +27,8 @@ SRCS+=	main.c engine.c listener.c handler.c comm.c monitor.c smfi.c \
     	signal.c sm_gethost.c errstring.c strl.c worker.c
     CLEANFILES+=sm_os.h
     
    +WARNS?=	0
    +
     sm_os.h:
     	ln -sf ${SENDMAIL_DIR}/include/sm/os/sm_os_freebsd.h sm_os.h
     
    diff --git a/lib/libmp/Makefile b/lib/libmp/Makefile
    index 6c51c5787f09..a9001a10c375 100644
    --- a/lib/libmp/Makefile
    +++ b/lib/libmp/Makefile
    @@ -8,7 +8,6 @@ MAN=		libmp.3
     INCS=		mp.h
     SRCS=		mpasbn.c
     
    -WARNS?=		6
     CFLAGS+=	-I${.CURDIR}/../../crypto
     
     VERSION_DEF=	${.CURDIR}/../libc/Versions.def
    diff --git a/lib/libncp/Makefile b/lib/libncp/Makefile
    index 1a7ad6b679c8..d7870a029db4 100644
    --- a/lib/libncp/Makefile
    +++ b/lib/libncp/Makefile
    @@ -11,4 +11,6 @@ SRCS=	ncpl_subr.c ncpl_bind.c ncpl_queue.c ncpl_file.c ncpl_misc.c \
     	ncpl_net.c ncpl_rcfile.c ncpl_conn.c ncpl_nls.c ncpl_msg.c \
     	ncpl_rpc.c ncpl_crypt.c ipx.c sap.c
     
    +WARNS?=	0
    +
     .include 
    diff --git a/lib/libngatm/Makefile b/lib/libngatm/Makefile
    index dfa33212eb1d..85294b0471df 100644
    --- a/lib/libngatm/Makefile
    +++ b/lib/libngatm/Makefile
    @@ -5,7 +5,6 @@
     LIB=	ngatm
     SHLIB_MAJOR= 4
     MAN=	libngatm.3 uniaddr.3 unifunc.3 unimsg.3 unisap.3 unistruct.3
    -WARNS?=	6
     
     # source of the library lives in contrib
     SDIR=	${.CURDIR}/../../sys
    diff --git a/lib/libopie/Makefile b/lib/libopie/Makefile
    index 59406df0bc0f..360dddc474ed 100644
    --- a/lib/libopie/Makefile
    +++ b/lib/libopie/Makefile
    @@ -8,15 +8,14 @@ SHLIB_MAJOR=    6
     
     KEYFILE?=	\"/etc/opiekeys\"
     
    -.PATH: ${DIST_DIR} ${OPIE_DIST}/libmissing
    +.PATH: ${DIST_DIR}
     
     LIB=	opie
     SRCS=	atob8.c btoa8.c btoh.c challenge.c getsequence.c hash.c hashlen.c \
     	keycrunch.c lock.c lookup.c newseed.c parsechallenge.c passcheck.c \
     	passwd.c randomchallenge.c readpass.c unlock.c verify.c version.c \
     	btoe.c accessfile.c generator.c insecure.c getutmpentry.c \
    -	readrec.c writerec.c open.c \
    -	getutline.c pututline.c endutent.c setutent.c # from libmissing
    +	readrec.c writerec.c open.c
     SRCS+=	opieextra.c
     INCS=	${OPIE_DIST}/opie.h
     
    @@ -26,6 +25,8 @@ CFLAGS+=-I${.CURDIR} -I${OPIE_DIST} -I${DIST_DIR} \
     ACCESSFILE?=	\"/etc/opieaccess\"
     CFLAGS+=	-DINSECURE_OVERRIDE -DPATH_ACCESS_FILE=${ACCESSFILE}
     
    +WARNS?=	0
    +
     DPADD=	${LIBMD}
     LDADD=	-lmd
     
    diff --git a/lib/libopie/config.h b/lib/libopie/config.h
    index b6ad39bbbf03..ca0c3383a8bf 100644
    --- a/lib/libopie/config.h
    +++ b/lib/libopie/config.h
    @@ -216,7 +216,7 @@
     #define HAVE_GETUSERSHELL 1
     
     /* Define if you have the getutxline function.  */
    -/* #undef HAVE_GETUTXLINE */
    +#define HAVE_GETUTXLINE 1
     
     /* Define if you have the getwd function.  */
     /* #undef HAVE_GETWD */
    @@ -231,7 +231,7 @@
     /* #undef HAVE_ON_EXIT */
     
     /* Define if you have the pututxline function.  */
    -/* #undef HAVE_PUTUTXLINE */
    +#define HAVE_PUTUTXLINE 1
     
     /* Define if you have the rindex function.  */
     /* #undef HAVE_RINDEX */
    @@ -366,7 +366,7 @@
     #define HAVE_UNISTD_H 1
     
     /* Define if you have the  header file.  */
    -/* #undef HAVE_UTMPX_H */
    +#define HAVE_UTMPX_H 1
     
     /* Define if you have the crypt library (-lcrypt).  */
     #define HAVE_LIBCRYPT 1
    diff --git a/lib/libpam/modules/Makefile.inc b/lib/libpam/modules/Makefile.inc
    index 248ad10b6361..c352f42c3f3e 100644
    --- a/lib/libpam/modules/Makefile.inc
    +++ b/lib/libpam/modules/Makefile.inc
    @@ -6,7 +6,7 @@ NO_INSTALLLIB=
     NO_PROFILE=
     
     CFLAGS+= -I${PAMDIR}/include -I${.CURDIR}/../../libpam
    -WARNS?=	4
    +WARNS?=	6
     
     # This is nasty.
     # For the static case, libpam.a depends on the modules.
    diff --git a/lib/libpam/modules/pam_echo/pam_echo.8 b/lib/libpam/modules/pam_echo/pam_echo.8
    index b162b5b1e4b5..3066007dca74 100644
    --- a/lib/libpam/modules/pam_echo/pam_echo.8
    +++ b/lib/libpam/modules/pam_echo/pam_echo.8
    @@ -65,7 +65,7 @@ The current service name
     .It Cm %t
     The name of the controlling tty
     .Pq Dv PAM_TTY .
    -.It Cm %U
    +.It Cm \&%U
     The applicant's user name
     .Pq Dv PAM_RUSER .
     .It Cm %u
    diff --git a/lib/libpam/modules/pam_exec/Makefile b/lib/libpam/modules/pam_exec/Makefile
    index 0cf4268a27a8..143f1a6cd6d2 100644
    --- a/lib/libpam/modules/pam_exec/Makefile
    +++ b/lib/libpam/modules/pam_exec/Makefile
    @@ -4,6 +4,6 @@ LIB=	pam_exec
     SRCS=	pam_exec.c
     MAN=	pam_exec.8
     
    -WARNS?=	0
    +WARNS?=	1
     
     .include 
    diff --git a/lib/libpam/modules/pam_krb5/Makefile b/lib/libpam/modules/pam_krb5/Makefile
    index a376f7e2bcee..500801b84841 100644
    --- a/lib/libpam/modules/pam_krb5/Makefile
    +++ b/lib/libpam/modules/pam_krb5/Makefile
    @@ -29,7 +29,7 @@ SRCS=	pam_krb5.c
     MAN=	pam_krb5.8
     .if defined(_FREEFALL_CONFIG)
     CFLAGS+=-D_FREEFALL_CONFIG
    -WARNS=	0
    +WARNS=	3
     .endif
     
     DPADD=	${LIBKRB5} ${LIBHX509} ${LIBASN1} ${LIBROKEN} ${LIBCOM_ERR} ${LIBCRYPT} ${LIBCRYPTO}
    diff --git a/lib/libpam/modules/pam_lastlog/Makefile b/lib/libpam/modules/pam_lastlog/Makefile
    index f0b96c4d7da7..9f0e07f767ea 100644
    --- a/lib/libpam/modules/pam_lastlog/Makefile
    +++ b/lib/libpam/modules/pam_lastlog/Makefile
    @@ -28,7 +28,4 @@ LIB=	pam_lastlog
     SRCS=	pam_lastlog.c
     MAN=	pam_lastlog.8
     
    -DPADD=	${LIBUTIL}
    -LDADD=	-lutil
    -
     .include 
    diff --git a/lib/libpam/modules/pam_lastlog/pam_lastlog.8 b/lib/libpam/modules/pam_lastlog/pam_lastlog.8
    index 9fc7e452ae6b..8ee5decc3627 100644
    --- a/lib/libpam/modules/pam_lastlog/pam_lastlog.8
    +++ b/lib/libpam/modules/pam_lastlog/pam_lastlog.8
    @@ -65,12 +65,7 @@ and terminate
     sessions.
     The
     .Fn pam_sm_open_session
    -function records the session in the
    -.Xr utmp 5 ,
    -.Xr wtmp 5
    -and
    -.Xr lastlog 5
    -databases.
    +function records the session in the user accounting database.
     The
     .Fn pam_sm_close_session
     function does nothing.
    @@ -90,10 +85,10 @@ Ignore I/O failures.
     .Sh SEE ALSO
     .Xr last 1 ,
     .Xr w 1 ,
    +.Xr getutxent 3 ,
     .Xr login 3 ,
     .Xr logout 3 ,
     .Xr pam.conf 5 ,
    -.Xr utmp 5 ,
     .Xr lastlogin 8 ,
     .Xr pam 8
     .Sh AUTHORS
    diff --git a/lib/libpam/modules/pam_lastlog/pam_lastlog.c b/lib/libpam/modules/pam_lastlog/pam_lastlog.c
    index 9899f8d16faf..14e47b803d2d 100644
    --- a/lib/libpam/modules/pam_lastlog/pam_lastlog.c
    +++ b/lib/libpam/modules/pam_lastlog/pam_lastlog.c
    @@ -46,19 +46,13 @@ __FBSDID("$FreeBSD$");
     
     #define _BSD_SOURCE
     
    -#include 
    -
    -#include 
    -#include 
    -#include 
    +#include 
     #include 
    -#include 
     #include 
     #include 
    -#include 
     #include 
     #include 
    -#include 
    +#include 
     
     #define PAM_SM_SESSION
     
    @@ -66,18 +60,19 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     
    +#define	PAM_UTMPX_ID	"utmpx_id"
    +
     PAM_EXTERN int
     pam_sm_open_session(pam_handle_t *pamh, int flags,
         int argc __unused, const char *argv[] __unused)
     {
     	struct passwd *pwd;
    -	struct utmp utmp;
    -	struct lastlog ll;
    +	struct utmpx *utx, utl;
     	time_t t;
     	const char *user;
     	const void *rhost, *tty;
    -	off_t llpos;
    -	int fd, pam_err;
    +	char *id;
    +	int pam_err;
     
     	pam_err = pam_get_user(pamh, &user, NULL);
     	if (pam_err != PAM_SUCCESS)
    @@ -101,72 +96,51 @@ pam_sm_open_session(pam_handle_t *pamh, int flags,
     		pam_err = PAM_SERVICE_ERR;
     		goto err;
     	}
    -	if (strncmp(tty, _PATH_DEV, strlen(_PATH_DEV)) == 0)
    -		tty = (const char *)tty + strlen(_PATH_DEV);
    -	if (*(const char *)tty == '\0')
    -		return (PAM_SERVICE_ERR);
     
    -	fd = open(_PATH_LASTLOG, O_RDWR|O_CREAT, 0644);
    -	if (fd == -1) {
    -		PAM_LOG("Failed to open %s", _PATH_LASTLOG);
    -		goto file_err;
    -	}
    -
    -	/*
    -	 * Record session in lastlog(5).
    -	 */
    -	llpos = (off_t)(pwd->pw_uid * sizeof(ll));
    -	if (lseek(fd, llpos, L_SET) != llpos)
    -		goto file_err;
     	if ((flags & PAM_SILENT) == 0) {
    -		if (read(fd, &ll, sizeof ll) == sizeof ll && ll.ll_time != 0) {
    -			t = ll.ll_time;
    -			if (*ll.ll_host != '\0')
    -				pam_info(pamh, "Last login: %.*s from %.*s",
    -				    24 - 5, ctime(&t),
    -				    (int)sizeof(ll.ll_host), ll.ll_host);
    -			else
    -				pam_info(pamh, "Last login: %.*s on %.*s",
    -				    24 - 5, ctime(&t),
    -				    (int)sizeof(ll.ll_line), ll.ll_line);
    +		if (setutxdb(UTXDB_LASTLOGIN, NULL) != 0) {
    +			PAM_LOG("Failed to open lastlogin database");
    +		} else {
    +			utx = getutxuser(user);
    +			if (utx != NULL && utx->ut_type == USER_PROCESS) {
    +				t = utx->ut_tv.tv_sec;
    +				if (*utx->ut_host != '\0')
    +					pam_info(pamh, "Last login: %.*s from %s",
    +					    24 - 5, ctime(&t), utx->ut_host);
    +				else
    +					pam_info(pamh, "Last login: %.*s on %s",
    +					    24 - 5, ctime(&t), utx->ut_line);
    +			}
    +			endutxent();
     		}
    -		if (lseek(fd, llpos, L_SET) != llpos)
    -			goto file_err;
     	}
     
    -	bzero(&ll, sizeof(ll));
    -	ll.ll_time = time(NULL);
    +	id = malloc(sizeof utl.ut_id);
    +	if (id == NULL) {
    +		pam_err = PAM_SERVICE_ERR;
    +		goto err;
    +	}
    +	arc4random_buf(id, sizeof utl.ut_id);
     
    -	/* note: does not need to be NUL-terminated */
    -	strncpy(ll.ll_line, tty, sizeof(ll.ll_line));
    -	if (rhost != NULL && *(const char *)rhost != '\0')
    -		/* note: does not need to be NUL-terminated */
    -		strncpy(ll.ll_host, rhost, sizeof(ll.ll_host));
    +	pam_err = pam_set_data(pamh, PAM_UTMPX_ID, id, openpam_free_data);
    +	if (pam_err != PAM_SUCCESS) {
    +		free(id);
    +		goto err;
    +	}
     
    -	if (write(fd, (char *)&ll, sizeof(ll)) != sizeof(ll) || close(fd) != 0)
    -		goto file_err;
    -
    -	PAM_LOG("Login recorded in %s", _PATH_LASTLOG);
    -
    -	/*
    -	 * Record session in utmp(5) and wtmp(5).
    -	 */
    -	bzero(&utmp, sizeof(utmp));
    -	utmp.ut_time = time(NULL);
    -	/* note: does not need to be NUL-terminated */
    -	strncpy(utmp.ut_name, user, sizeof(utmp.ut_name));
    -	if (rhost != NULL && *(const char *)rhost != '\0')
    -		strncpy(utmp.ut_host, rhost, sizeof(utmp.ut_host));
    -	(void)strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line));
    -	login(&utmp);
    +	memset(&utl, 0, sizeof utl);
    +	utl.ut_type = USER_PROCESS;
    +	memcpy(utl.ut_id, id, sizeof utl.ut_id);
    +	strncpy(utl.ut_user, user, sizeof utl.ut_user);
    +	strncpy(utl.ut_line, tty, sizeof utl.ut_line);
    +	if (rhost != NULL)
    +		strncpy(utl.ut_host, rhost, sizeof utl.ut_host);
    +	utl.ut_pid = getpid();
    +	gettimeofday(&utl.ut_tv, NULL);
    +	pututxline(&utl);
     
     	return (PAM_SUCCESS);
     
    -file_err:
    -	syslog(LOG_ERR, "%s: %m", _PATH_LASTLOG);
    -	if (fd != -1)
    -		close(fd);
    -	pam_err = PAM_SYSTEM_ERR;
     err:
     	if (openpam_get_option(pamh, "no_fail"))
     		return (PAM_SUCCESS);
    @@ -174,28 +148,24 @@ err:
     }
     
     PAM_EXTERN int
    -pam_sm_close_session(pam_handle_t *pamh __unused, int flags __unused,
    +pam_sm_close_session(pam_handle_t *pamh, int flags __unused,
         int argc __unused, const char *argv[] __unused)
     {
    -	const void *tty;
    +	struct utmpx utl;
    +	const void *id;
     	int pam_err;
     
    -	pam_err = pam_get_item(pamh, PAM_TTY, (const void **)&tty);
    +	pam_err = pam_get_data(pamh, PAM_UTMPX_ID, (const void **)&id);
     	if (pam_err != PAM_SUCCESS)
     		goto err;
    -	if (tty == NULL) {
    -		PAM_LOG("No PAM_TTY");
    -		pam_err = PAM_SERVICE_ERR;
    -		goto err;
    -	}
    -	if (strncmp(tty, _PATH_DEV, strlen(_PATH_DEV)) == 0)
    -		tty = (const char *)tty + strlen(_PATH_DEV);
    -	if (*(const char *)tty == '\0')
    -		return (PAM_SERVICE_ERR);
    -	if (logout(tty) != 1)
    -		syslog(LOG_ERR, "%s(): no utmp record for %s",
    -		    __func__, (const char *)tty);
    -	logwtmp(tty, "", "");
    +
    +	memset(&utl, 0, sizeof utl);
    +	utl.ut_type = DEAD_PROCESS;
    +	memcpy(utl.ut_id, id, sizeof utl.ut_id);
    +	utl.ut_pid = getpid();
    +	gettimeofday(&utl.ut_tv, NULL);
    +	pututxline(&utl);
    +
     	return (PAM_SUCCESS);
     
      err:
    diff --git a/lib/libpam/modules/pam_radius/Makefile b/lib/libpam/modules/pam_radius/Makefile
    index 88e4357a4b26..2fac8334e20e 100644
    --- a/lib/libpam/modules/pam_radius/Makefile
    +++ b/lib/libpam/modules/pam_radius/Makefile
    @@ -27,7 +27,7 @@
     LIB=	pam_radius
     SRCS=	pam_radius.c
     MAN=	pam_radius.8
    -WARNS=	0
    +WARNS?=	3
     
     DPADD=	${LIBRADIUS}
     LDADD=	-lradius
    diff --git a/lib/libpam/modules/pam_ssh/Makefile b/lib/libpam/modules/pam_ssh/Makefile
    index f7dcd0c5424d..d00652a8c215 100644
    --- a/lib/libpam/modules/pam_ssh/Makefile
    +++ b/lib/libpam/modules/pam_ssh/Makefile
    @@ -7,7 +7,10 @@ LIB=	pam_ssh
     MAN=	pam_ssh.8
     SRCS=	pam_ssh.c
     
    -WARNS?=	0
    +# required when linking with a dynamic libssh
    +SRCS+=	roaming_dummy.c
    +
    +WARNS?=	3
     CFLAGS+= -I${SSHDIR} -include ssh_namespace.h
     
     DPADD=	${LIBSSH} ${LIBCRYPTO} ${LIBCRYPT}
    diff --git a/lib/libpam/modules/pam_unix/pam_unix.8 b/lib/libpam/modules/pam_unix/pam_unix.8
    index eec0e0e20d74..82354d57715f 100644
    --- a/lib/libpam/modules/pam_unix/pam_unix.8
    +++ b/lib/libpam/modules/pam_unix/pam_unix.8
    @@ -105,6 +105,17 @@ sufficient.
     If the password database has no password for the entity being
     authenticated, then this option will forgo password prompting, and
     silently allow authentication to succeed.
    +.Pp
    +.Sy NOTE:
    +If
    +.Nm
    +is invoked by a process that does not have the privileges required to
    +access the password database (in most cases, this means root
    +privileges), the
    +.Cm nullok
    +option may cause
    +.Nm
    +to allow any user to log in with any password.
     .It Cm local_pass
     Use only the local password database, even if NIS is in use.
     This will cause an authentication failure if the system is configured
    diff --git a/lib/libpam/modules/pam_unix/pam_unix.c b/lib/libpam/modules/pam_unix/pam_unix.c
    index ce309a79e234..fdfce3ea924b 100644
    --- a/lib/libpam/modules/pam_unix/pam_unix.c
    +++ b/lib/libpam/modules/pam_unix/pam_unix.c
    @@ -271,10 +271,11 @@ pam_sm_chauthtok(pam_handle_t *pamh, int flags,
     	const void *yp_domain, *yp_server;
     #endif
     	char salt[SALTSIZE + 1];
    -	login_cap_t * lc;
    +	login_cap_t *lc;
     	struct passwd *pwd, *old_pwd;
     	const char *user, *old_pass, *new_pass;
     	char *encrypted;
    +	time_t passwordtime;
     	int pfd, tfd, retval;
     
     	if (openpam_get_option(pamh, PAM_OPT_AUTH_AS_SELF))
    @@ -377,11 +378,17 @@ pam_sm_chauthtok(pam_handle_t *pamh, int flags,
     		if ((old_pwd = pw_dup(pwd)) == NULL)
     			return (PAM_BUF_ERR);
     
    -		pwd->pw_change = 0;
     		lc = login_getclass(pwd->pw_class);
     		if (login_setcryptfmt(lc, password_hash, NULL) == NULL)
     			openpam_log(PAM_LOG_ERROR,
     			    "can't set password cipher, relying on default");
    +		
    +		/* set password expiry date */
    +		pwd->pw_change = 0;
    +		passwordtime = login_getcaptime(lc, "passwordtime", 0, 0);
    +		if (passwordtime > 0)
    +			pwd->pw_change = time(NULL) + passwordtime;
    +		
     		login_close(lc);
     		makesalt(salt);
     		pwd->pw_passwd = crypt(new_pass, salt);
    diff --git a/lib/libpcap/Makefile b/lib/libpcap/Makefile
    index 44ae23cd4b78..42540f565b1b 100644
    --- a/lib/libpcap/Makefile
    +++ b/lib/libpcap/Makefile
    @@ -97,6 +97,8 @@ CFLAGS+=-DINET6
     CFLAGS+=-DHAVE_NET_PFVAR_H
     .endif
     
    +WARNS?=	0
    +
     SHLIB_MAJOR=7
     
     #
    diff --git a/lib/libpmc/Makefile b/lib/libpmc/Makefile
    index 7d97c96a0da6..09a23e3852db 100644
    --- a/lib/libpmc/Makefile
    +++ b/lib/libpmc/Makefile
    @@ -5,8 +5,6 @@ LIB=	pmc
     SRCS=	libpmc.c pmclog.c
     INCS=	pmc.h pmclog.h
     
    -WARNS?=	6
    -
     MAN=	pmc.3
     MAN+=	pmc_allocate.3
     MAN+=	pmc_attach.3
    @@ -24,6 +22,7 @@ MAN+=	pmc_start.3
     MAN+=	pmclog.3
     
     # PMC-dependent manual pages
    +.if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64"
     MAN+=	pmc.atom.3
     MAN+=	pmc.core.3
     MAN+=	pmc.core2.3
    @@ -34,6 +33,9 @@ MAN+=	pmc.p4.3
     MAN+=	pmc.p5.3
     MAN+=	pmc.p6.3
     MAN+=	pmc.tsc.3
    +.elif ${MACHINE_ARCH} == "arm" && ${CPUTYPE} == "xscale"
    +MAN+=	pmc.xscale.3
    +.endif
     
     MLINKS+= \
     	pmc_allocate.3 pmc_release.3 \
    diff --git a/lib/libpmc/libpmc.c b/lib/libpmc/libpmc.c
    index 76bc89d808ae..5526599072d6 100644
    --- a/lib/libpmc/libpmc.c
    +++ b/lib/libpmc/libpmc.c
    @@ -69,6 +69,10 @@ static int p6_allocate_pmc(enum pmc_event _pe, char *_ctrspec,
     static int tsc_allocate_pmc(enum pmc_event _pe, char *_ctrspec,
         struct pmc_op_pmcallocate *_pmc_config);
     #endif
    +#if defined(__XSCALE__)
    +static int xscale_allocate_pmc(enum pmc_event _pe, char *_ctrspec,
    +    struct pmc_op_pmcallocate *_pmc_config);
    +#endif
     
     #define PMC_CALL(cmd, params)				\
     	syscall(pmc_syscall, PMC_OP_##cmd, (params))
    @@ -132,6 +136,7 @@ PMC_CLASSDEP_TABLE(k8, K8);
     PMC_CLASSDEP_TABLE(p4, P4);
     PMC_CLASSDEP_TABLE(p5, P5);
     PMC_CLASSDEP_TABLE(p6, P6);
    +PMC_CLASSDEP_TABLE(xscale, XSCALE);
     
     #undef	__PMC_EV_ALIAS
     #define	__PMC_EV_ALIAS(N,CODE) 	{ N, PMC_EV_##CODE },
    @@ -176,6 +181,7 @@ PMC_MDEP_TABLE(k8, K8, PMC_CLASS_TSC);
     PMC_MDEP_TABLE(p4, P4, PMC_CLASS_TSC);
     PMC_MDEP_TABLE(p5, P5, PMC_CLASS_TSC);
     PMC_MDEP_TABLE(p6, P6, PMC_CLASS_TSC);
    +PMC_MDEP_TABLE(xscale, XSCALE, PMC_CLASS_XSCALE);
     
     static const struct pmc_event_descr tsc_event_table[] =
     {
    @@ -216,6 +222,9 @@ PMC_CLASS_TABLE_DESC(p6, P6, p6, p6);
     #if	defined(__i386__) || defined(__amd64__)
     PMC_CLASS_TABLE_DESC(tsc, TSC, tsc, tsc);
     #endif
    +#if	defined(__XSCALE__)
    +PMC_CLASS_TABLE_DESC(xscale, XSCALE, xscale, xscale);
    +#endif
     
     #undef	PMC_CLASS_TABLE_DESC
     
    @@ -442,6 +451,10 @@ static struct pmc_event_alias core_aliases[] = {
     /*
      * Intel Core2 (Family 6, Model F), Core2Extreme (Family 6, Model 17H)
      * and Atom (Family 6, model 1CH) PMCs.
    + *
    + * We map aliases to events on the fixed-function counters if these
    + * are present.  Note that not all CPUs in this family contain fixed-function
    + * counters.
      */
     
     static struct pmc_event_alias core2_aliases[] = {
    @@ -454,8 +467,22 @@ static struct pmc_event_alias core2_aliases[] = {
     	EV_ALIAS("unhalted-cycles",	"iaf-cpu-clk-unhalted.core"),
     	EV_ALIAS(NULL, NULL)
     };
    -#define	atom_aliases	core2_aliases
    -#define corei7_aliases	core2_aliases
    +
    +static struct pmc_event_alias core2_aliases_without_iaf[] = {
    +	EV_ALIAS("branches",		"iap-br-inst-retired.any"),
    +	EV_ALIAS("branch-mispredicts",	"iap-br-inst-retired.mispred"),
    +	EV_ALIAS("cycles",		"tsc-tsc"),
    +	EV_ALIAS("ic-misses",		"iap-l1i-misses"),
    +	EV_ALIAS("instructions",	"iap-inst-retired.any_p"),
    +	EV_ALIAS("interrupts",		"iap-hw-int-rcv"),
    +	EV_ALIAS("unhalted-cycles",	"iap-cpu-clk-unhalted.core_p"),
    +	EV_ALIAS(NULL, NULL)
    +};
    +
    +#define	atom_aliases			core2_aliases
    +#define	atom_aliases_without_iaf	core2_aliases_without_iaf
    +#define corei7_aliases			core2_aliases
    +#define corei7_aliases_without_iaf	core2_aliases_without_iaf
     
     #define	IAF_KW_OS		"os"
     #define	IAF_KW_USR		"usr"
    @@ -1990,6 +2017,29 @@ tsc_allocate_pmc(enum pmc_event pe, char *ctrspec,
     }
     #endif
     
    +#if	defined(__XSCALE__)
    +
    +static struct pmc_event_alias xscale_aliases[] = {
    +	EV_ALIAS("branches",		"BRANCH_RETIRED"),
    +	EV_ALIAS("branch-mispredicts",	"BRANCH_MISPRED"),
    +	EV_ALIAS("dc-misses",		"DC_MISS"),
    +	EV_ALIAS("ic-misses",		"IC_MISS"),
    +	EV_ALIAS("instructions",	"INSTR_RETIRED"),
    +	EV_ALIAS(NULL, NULL)
    +};
    +static int
    +xscale_allocate_pmc(enum pmc_event pe, char *ctrspec __unused,
    +    struct pmc_op_pmcallocate *pmc_config __unused)
    +{
    +	switch (pe) {
    +	default:
    +		break;
    +	}
    +
    +	return (0);
    +}
    +#endif
    +
     /*
      * Match an event name `name' with its canonical form.
      *
    @@ -2317,6 +2367,10 @@ pmc_event_names_of_class(enum pmc_class cl, const char ***eventnames,
     		ev = p6_event_table;
     		count = PMC_EVENT_TABLE_SIZE(p6);
     		break;
    +	case PMC_CLASS_XSCALE:
    +		ev = xscale_event_table;
    +		count = PMC_EVENT_TABLE_SIZE(xscale);
    +		break;
     	default:
     		errno = EINVAL;
     		return (-1);
    @@ -2379,6 +2433,10 @@ pmc_init(void)
     	uint32_t abi_version;
     	struct module_stat pmc_modstat;
     	struct pmc_op_getcpuinfo op_cpu_info;
    +#if defined(__amd64__) || defined(__i386__)
    +	int cpu_has_iaf_counters;
    +	unsigned int t;
    +#endif
     
     	if (pmc_syscall != -1) /* already inited */
     		return (0);
    @@ -2420,6 +2478,8 @@ pmc_init(void)
     	if (pmc_class_table == NULL)
     		return (-1);
     
    +	for (n = 0; n < PMC_CLASS_TABLE_SIZE; n++)
    +		pmc_class_table[n] = NULL;
     
     	/*
     	 * Fill in the class table.
    @@ -2427,6 +2487,14 @@ pmc_init(void)
     	n = 0;
     #if defined(__amd64__) || defined(__i386__)
     	pmc_class_table[n++] = &tsc_class_table_descr;
    +
    +	/*
    + 	 * Check if this CPU has fixed function counters.
    +	 */
    +	cpu_has_iaf_counters = 0;
    +	for (t = 0; t < cpu_info.pm_nclass; t++)
    +		if (cpu_info.pm_classes[t].pm_class == PMC_CLASS_IAF)
    +			cpu_has_iaf_counters = 1;
     #endif
     
     #define	PMC_MDEP_INIT(C) do {					\
    @@ -2436,6 +2504,16 @@ pmc_init(void)
     		    PMC_TABLE_SIZE(C##_pmc_classes);		\
     	} while (0)
     
    +#define	PMC_MDEP_INIT_INTEL_V2(C) do {					\
    +		PMC_MDEP_INIT(C);					\
    +		if (cpu_has_iaf_counters) 				\
    +			pmc_class_table[n++] = &iaf_class_table_descr;	\
    +		else							\
    +			pmc_mdep_event_aliases =			\
    +				C##_aliases_without_iaf;		\
    +		pmc_class_table[n] = &C##_class_table_descr;		\
    +	} while (0)
    +
     	/* Configure the event name parser. */
     	switch (cpu_info.pm_cputype) {
     #if defined(__i386__)
    @@ -2461,9 +2539,7 @@ pmc_init(void)
     		pmc_class_table[n] = &k8_class_table_descr;
     		break;
     	case PMC_CPU_INTEL_ATOM:
    -		PMC_MDEP_INIT(atom);
    -		pmc_class_table[n++] = &iaf_class_table_descr;
    -		pmc_class_table[n]   = &atom_class_table_descr;
    +		PMC_MDEP_INIT_INTEL_V2(atom);
     		break;
     	case PMC_CPU_INTEL_CORE:
     		PMC_MDEP_INIT(core);
    @@ -2471,20 +2547,22 @@ pmc_init(void)
     		break;
     	case PMC_CPU_INTEL_CORE2:
     	case PMC_CPU_INTEL_CORE2EXTREME:
    -		PMC_MDEP_INIT(core2);
    -		pmc_class_table[n++] = &iaf_class_table_descr;
    -		pmc_class_table[n]   = &core2_class_table_descr;
    +		PMC_MDEP_INIT_INTEL_V2(core2);
     		break;
     	case PMC_CPU_INTEL_COREI7:
    -		PMC_MDEP_INIT(corei7);
    -		pmc_class_table[n++] = &iaf_class_table_descr;
    -		pmc_class_table[n]   = &corei7_class_table_descr;
    +		PMC_MDEP_INIT_INTEL_V2(corei7);
     		break;
     	case PMC_CPU_INTEL_PIV:
     		PMC_MDEP_INIT(p4);
     		pmc_class_table[n] = &p4_class_table_descr;
     		break;
     #endif
    +#if defined(__XSCALE__)
    +	case PMC_CPU_INTEL_XSCALE:
    +		PMC_MDEP_INIT(xscale);
    +		pmc_class_table[n] = &xscale_class_table_descr;
    +		break;
    +#endif
     
     
     	default:
    @@ -2600,6 +2678,9 @@ _pmc_name_of_event(enum pmc_event pe, enum pmc_cputype cpu)
     	} else if (pe >= PMC_EV_P6_FIRST && pe <= PMC_EV_P6_LAST) {
     		ev = p6_event_table;
     		evfence = p6_event_table + PMC_EVENT_TABLE_SIZE(p6);
    +	} else if (pe >= PMC_EV_XSCALE_FIRST && pe <= PMC_EV_XSCALE_LAST) {
    +		ev = xscale_event_table;
    +		evfence = xscale_event_table + PMC_EVENT_TABLE_SIZE(xscale);
     	} else if (pe == PMC_EV_TSC_TSC) {
     		ev = tsc_event_table;
     		evfence = tsc_event_table + PMC_EVENT_TABLE_SIZE(tsc);
    diff --git a/lib/libpmc/pmc.xscale.3 b/lib/libpmc/pmc.xscale.3
    new file mode 100644
    index 000000000000..fc9d16ee430a
    --- /dev/null
    +++ b/lib/libpmc/pmc.xscale.3
    @@ -0,0 +1,39 @@
    +.\" Copyright (c) 2009 Rui Paulo.  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 Joseph Koshy ``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 Joseph Koshy 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$
    +.\"
    +.Dd December 23, 2009
    +.Os
    +.Dt PMC.XSCALE 3
    +.Sh NAME
    +.Nm pmc.xscale
    +.Nd measurement events for
    +.Tn Intel
    +.Tn XScale
    +family CPUs
    +.Sh LIBRARY
    +.Lb libpmc
    +.Sh SYNOPSIS
    +.In pmc.h
    +.Sh DESCRIPTION
    diff --git a/lib/libpmc/pmc_attach.3 b/lib/libpmc/pmc_attach.3
    index 62b0be6b089e..be340a775985 100644
    --- a/lib/libpmc/pmc_attach.3
    +++ b/lib/libpmc/pmc_attach.3
    @@ -23,7 +23,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd November 25 2007
    +.Dd November 25, 2007
     .Os
     .Dt PMC_ATTACH 3
     .Sh NAME
    diff --git a/lib/libproc/Makefile b/lib/libproc/Makefile
    index d6d29b3eaaf4..edb19bbcf5b7 100644
    --- a/lib/libproc/Makefile
    +++ b/lib/libproc/Makefile
    @@ -9,12 +9,10 @@ SRCS=				\
     
     INCS=	libproc.h
     
    -CFLAGS+=	-I. -I${.CURDIR}
    +CFLAGS+=	-I${.CURDIR}
     
     SHLIB_MAJOR=	2
     
    -WARNS?=	6
    -
    -WITHOUT_MAN=	yes
    +WITHOUT_MAN=
     
     .include 
    diff --git a/lib/libradius/Makefile b/lib/libradius/Makefile
    index 5054ea0b9285..f49f65c0cfe0 100644
    --- a/lib/libradius/Makefile
    +++ b/lib/libradius/Makefile
    @@ -33,6 +33,8 @@ CFLAGS+=	-Wall
     SHLIB_MAJOR=	4
     MAN=		libradius.3 radius.conf.5
     
    +WARNS?=		3
    +
     .if ${MK_OPENSSL} == "no"
     DPADD=		${LIBMD}
     LDADD=		-lmd
    diff --git a/lib/libradius/radlib.c b/lib/libradius/radlib.c
    index 8faaf7e12a60..e4e4a9411800 100644
    --- a/lib/libradius/radlib.c
    +++ b/lib/libradius/radlib.c
    @@ -650,17 +650,12 @@ rad_continue_send_request(struct rad_handle *h, int selected, int *fd,
     	n = sendto(h->fd, h->out, h->out_len, 0,
     	    (const struct sockaddr *)&h->servers[h->srv].addr,
     	    sizeof h->servers[h->srv].addr);
    -	if (n != h->out_len) {
    -		if (n == -1)
    -			generr(h, "sendto: %s", strerror(errno));
    -		else
    -			generr(h, "sendto: short write");
    -		return -1;
    -	}
    -
    +	if (n != h->out_len)
    +		tv->tv_sec = 1; /* Do not wait full timeout if send failed. */
    +	else
    +		tv->tv_sec = h->servers[h->srv].timeout;
     	h->try++;
     	h->servers[h->srv].num_tries++;
    -	tv->tv_sec = h->servers[h->srv].timeout;
     	tv->tv_usec = 0;
     	*fd = h->fd;
     
    diff --git a/lib/librpcsec_gss/Makefile b/lib/librpcsec_gss/Makefile
    index 90f7bd7210d9..cc14a7b41731 100644
    --- a/lib/librpcsec_gss/Makefile
    +++ b/lib/librpcsec_gss/Makefile
    @@ -2,7 +2,6 @@
     
     LIB=	rpcsec_gss
     SHLIB_MAJOR= 1
    -WARNS?=	6
     SRCS+=	rpcsec_gss.c rpcsec_gss_prot.c rpcsec_gss_conf.c rpcsec_gss_misc.c \
     	svc_rpcsec_gss.c
     
    diff --git a/lib/librpcsec_gss/rpc_gss_get_error.3 b/lib/librpcsec_gss/rpc_gss_get_error.3
    index e108766322f9..74d2fa0f7db6 100644
    --- a/lib/librpcsec_gss/rpc_gss_get_error.3
    +++ b/lib/librpcsec_gss/rpc_gss_get_error.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_GET_ERROR 3
     .Os
     .Sh NAME
    @@ -50,7 +50,7 @@ A pointer to a structure where the error details will be returned
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_get_mech_info.3 b/lib/librpcsec_gss/rpc_gss_get_mech_info.3
    index a7f7d6b4d46b..945b00bedd6d 100644
    --- a/lib/librpcsec_gss/rpc_gss_get_mech_info.3
    +++ b/lib/librpcsec_gss/rpc_gss_get_mech_info.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_GET_MECH_INFO 3
     .Os
     .Sh NAME
    @@ -60,7 +60,7 @@ otherwise
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_get_mechanisms.3 b/lib/librpcsec_gss/rpc_gss_get_mechanisms.3
    index 4b57ac6fe58a..e18a64874d85 100644
    --- a/lib/librpcsec_gss/rpc_gss_get_mechanisms.3
    +++ b/lib/librpcsec_gss/rpc_gss_get_mechanisms.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_GET_MECHANISMS 3
     .Os
     .Sh NAME
    @@ -47,7 +47,7 @@ terminated list of installed security mechanisms.
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_get_principal_name.3 b/lib/librpcsec_gss/rpc_gss_get_principal_name.3
    index 6f5721259968..19297f65a71d 100644
    --- a/lib/librpcsec_gss/rpc_gss_get_principal_name.3
    +++ b/lib/librpcsec_gss/rpc_gss_get_principal_name.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_GET_PRINCIPAL_NAME 3
     .Os
     .Sh NAME
    @@ -74,7 +74,7 @@ otherwise
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_get_versions.3 b/lib/librpcsec_gss/rpc_gss_get_versions.3
    index f82406677be0..d72cbde791ab 100644
    --- a/lib/librpcsec_gss/rpc_gss_get_versions.3
    +++ b/lib/librpcsec_gss/rpc_gss_get_versions.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_GET_VERSIONS 3
     .Os
     .Sh NAME
    @@ -43,11 +43,11 @@ Return the highest and lowest supported versions of the RPCSEC_GSS protocol.
     .It vers_hi
     The value of
     .Fa *vers_hi
    -is set to the highest suppored protocol version
    +is set to the highest supported protocol version
     .It vers_lo
     The value of
     .Fa *vers_lo
    -is set to the lowest suppored protocol version
    +is set to the lowest supported protocol version
     .El
     .Sh SEE ALSO
     .Xr rpc 3 ,
    @@ -56,7 +56,7 @@ is set to the lowest suppored protocol version
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_getcred.3 b/lib/librpcsec_gss/rpc_gss_getcred.3
    index 2ede33e6ceb7..844e61ee41e5 100644
    --- a/lib/librpcsec_gss/rpc_gss_getcred.3
    +++ b/lib/librpcsec_gss/rpc_gss_getcred.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_GETCRED 3
     .Os
     .Sh NAME
    @@ -77,7 +77,7 @@ otherwise.
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_is_installed.3 b/lib/librpcsec_gss/rpc_gss_is_installed.3
    index 2859ed2e691b..a043c45abb25 100644
    --- a/lib/librpcsec_gss/rpc_gss_is_installed.3
    +++ b/lib/librpcsec_gss/rpc_gss_is_installed.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_IS_INSTALLED 3
     .Os
     .Sh NAME
    @@ -57,7 +57,7 @@ otherwise.
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_max_data_length.3 b/lib/librpcsec_gss/rpc_gss_max_data_length.3
    index 895711921052..0f80a3eb43d0 100644
    --- a/lib/librpcsec_gss/rpc_gss_max_data_length.3
    +++ b/lib/librpcsec_gss/rpc_gss_max_data_length.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_MAX_DATA_LENGTH 3
     .Os
     .Sh NAME
    @@ -43,7 +43,7 @@ given the current service and QoP setting.
     .Sh PARAMETERS
     .Bl -tag
     .It auth
    -A handle to a RPCSEC_GSS security ccontext
    +A handle to a RPCSEC_GSS security context
     .It max_tp_unit_len
     Maximum packet size of the underlying transport protocol
     .El
    @@ -56,7 +56,7 @@ The maximum message size that can be encoded
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_mech_to_oid.3 b/lib/librpcsec_gss/rpc_gss_mech_to_oid.3
    index c1f9f2a32f88..95d0cd7b1051 100644
    --- a/lib/librpcsec_gss/rpc_gss_mech_to_oid.3
    +++ b/lib/librpcsec_gss/rpc_gss_mech_to_oid.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_MECH_TO_OID 3
     .Os
     .Sh NAME
    @@ -60,7 +60,7 @@ is returned, otherwise
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_oid_to_mech.3 b/lib/librpcsec_gss/rpc_gss_oid_to_mech.3
    index 6183f26076e4..c91a2f569afa 100644
    --- a/lib/librpcsec_gss/rpc_gss_oid_to_mech.3
    +++ b/lib/librpcsec_gss/rpc_gss_oid_to_mech.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_OID_TO_MECH 3
     .Os
     .Sh NAME
    @@ -60,7 +60,7 @@ is returned, otherwise
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_qop_to_num.3 b/lib/librpcsec_gss/rpc_gss_qop_to_num.3
    index e58d553e149a..38d2725ac1d6 100644
    --- a/lib/librpcsec_gss/rpc_gss_qop_to_num.3
    +++ b/lib/librpcsec_gss/rpc_gss_qop_to_num.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_QOP_TO_NUM 3
     .Os
     .Sh NAME
    @@ -62,7 +62,7 @@ is returned, otherwise
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_seccreate.3 b/lib/librpcsec_gss/rpc_gss_seccreate.3
    index 0f7dfabb4d8b..f78080da81ab 100644
    --- a/lib/librpcsec_gss/rpc_gss_seccreate.3
    +++ b/lib/librpcsec_gss/rpc_gss_seccreate.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_SECCREATE 3
     .Os
     .Sh NAME
    @@ -75,7 +75,7 @@ RPC headers are integrity protected by a checksum and data is encrypted.
     .El
     .It qop
     Desired	quality of protection or NULL for the default.
    -Available values are lised in /etc/gss/qop
    +Available values are listed in /etc/gss/qop
     .It options_req
     Extra security context options to be passed to the underlying GSS-API
     mechanism.
    @@ -104,7 +104,7 @@ to this value.
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_set_callback.3 b/lib/librpcsec_gss/rpc_gss_set_callback.3
    index 0ad861f89df7..ae77cfc95e74 100644
    --- a/lib/librpcsec_gss/rpc_gss_set_callback.3
    +++ b/lib/librpcsec_gss/rpc_gss_set_callback.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_SET_CALLBACK 3
     .Os
     .Sh NAME
    @@ -66,11 +66,11 @@ values for service and quality of protection will be rejected.
     .It cb
     A structure containing the RPC program and version for this callback
     and a function which will be called when new contexts are created for
    -ths given RPC program and version
    +the given RPC program and version
     .It req
     The RPC request using the new context
     .It deleg
    -GSS-APi delegated credentials (if any)
    +GSS-API delegated credentials (if any)
     .It gss_context
     The GSS-API context
     .It lock
    @@ -100,7 +100,7 @@ otherwise
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_set_defaults.3 b/lib/librpcsec_gss/rpc_gss_set_defaults.3
    index 241cf9ecf647..c4a24cff5e12 100644
    --- a/lib/librpcsec_gss/rpc_gss_set_defaults.3
    +++ b/lib/librpcsec_gss/rpc_gss_set_defaults.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_SET_DEFAULTS 3
     .Os
     .Sh NAME
    @@ -62,7 +62,7 @@ if the values were set
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_set_svc_name.3 b/lib/librpcsec_gss/rpc_gss_set_svc_name.3
    index 9be8fdffae89..96dc4078b739 100644
    --- a/lib/librpcsec_gss/rpc_gss_set_svc_name.3
    +++ b/lib/librpcsec_gss/rpc_gss_set_svc_name.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_SET_SVC_NAME 3
     .Os
     .Sh NAME
    @@ -51,7 +51,7 @@ version.
     .It principal
     A string representing the service principal in the form
     .Qq service@hostname
    -.It mechanim
    +.It mechanism
     The name of the security mechanism
     .It req_time
     The time in seconds that the service credentials should remain
    @@ -79,7 +79,7 @@ otherwise.
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3 b/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3
    index 2445f7553f60..ef4871f4f566 100644
    --- a/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3
    +++ b/lib/librpcsec_gss/rpc_gss_svc_max_data_length.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_SVC_MAX_DATA_LENGTH 3
     .Os
     .Sh NAME
    @@ -56,7 +56,7 @@ The maximum message size that can be encoded
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +function first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpcsec_gss.3 b/lib/librpcsec_gss/rpcsec_gss.3
    index 793f0129d390..dfc95ec972f3 100644
    --- a/lib/librpcsec_gss/rpcsec_gss.3
    +++ b/lib/librpcsec_gss/rpcsec_gss.3
    @@ -24,7 +24,7 @@
     .\" SUCH DAMAGE.
     .\"
     .\" $FreeBSD$
    -.Dd July 4, 2008
    +.Dd January 26, 2010
     .Dt RPC_GSS_SECCREATE 3
     .Os
     .Sh NAME
    @@ -43,7 +43,7 @@ subsequent communication between client and server are properly
     authenticated.
     Optionally, extra protection can be applied to the connection.
     The integrity service uses checksums to ensure that all data sent by
    -a peer is recieved without modification.
    +a peer is received without modification.
     The privacy service uses encryption to ensure that no third party can
     access the data for a connection.
     .Pp
    @@ -111,7 +111,7 @@ typedef struct {
     } *rpc_gss_principal_t;
     .Ed
     .It Vt rpc_gss_rawcred_t
    -This structure is used to access the raw credentions associated with a
    +This structure is used to access the raw credentials associated with a
     security context.
     .Bd -literal
     typedef struct {
    @@ -222,7 +222,7 @@ Calculate maximum server message sizes.
     .Sh HISTORY
     The
     .Nm
    -manual page example first appeared in
    +library first appeared in
     .Fx 8.0 .
     .Sh AUTHORS
     This
    diff --git a/lib/librpcsec_gss/rpcsec_gss_conf.c b/lib/librpcsec_gss/rpcsec_gss_conf.c
    index 4a0349be1522..14e063c60d8f 100644
    --- a/lib/librpcsec_gss/rpcsec_gss_conf.c
    +++ b/lib/librpcsec_gss/rpcsec_gss_conf.c
    @@ -55,7 +55,7 @@ struct mech_info {
     };
     SLIST_HEAD(mech_info_list, mech_info);
     
    -static struct mech_info_list mechs = SLIST_HEAD_INITIALIZER(&mechs);
    +static struct mech_info_list mechs = SLIST_HEAD_INITIALIZER(mechs);
     static const char **mech_names;
     
     struct qop_info {
    @@ -66,7 +66,7 @@ struct qop_info {
     };
     SLIST_HEAD(qop_info_list, qop_info);
     
    -static struct qop_info_list qops = SLIST_HEAD_INITIALIZER(&qops);
    +static struct qop_info_list qops = SLIST_HEAD_INITIALIZER(qops);
     
     static int
     _rpc_gss_string_to_oid(const char* s, gss_OID oid)
    diff --git a/lib/librpcsec_gss/svc_rpcsec_gss.c b/lib/librpcsec_gss/svc_rpcsec_gss.c
    index 276126b59cf0..d0599be03300 100644
    --- a/lib/librpcsec_gss/svc_rpcsec_gss.c
    +++ b/lib/librpcsec_gss/svc_rpcsec_gss.c
    @@ -90,7 +90,7 @@ struct svc_rpc_gss_callback {
     	rpc_gss_callback_t	cb_callback;
     };
     static SLIST_HEAD(svc_rpc_gss_callback_list, svc_rpc_gss_callback)
    -	svc_rpc_gss_callbacks = SLIST_HEAD_INITIALIZER(&svc_rpc_gss_callbacks);
    +	svc_rpc_gss_callbacks = SLIST_HEAD_INITIALIZER(svc_rpc_gss_callbacks);
     
     struct svc_rpc_gss_svc_name {
     	SLIST_ENTRY(svc_rpc_gss_svc_name) sn_link;
    @@ -102,7 +102,7 @@ struct svc_rpc_gss_svc_name {
     	u_int			sn_version;
     };
     static SLIST_HEAD(svc_rpc_gss_svc_name_list, svc_rpc_gss_svc_name)
    -	svc_rpc_gss_svc_names = SLIST_HEAD_INITIALIZER(&svc_rpc_gss_svc_names);
    +	svc_rpc_gss_svc_names = SLIST_HEAD_INITIALIZER(svc_rpc_gss_svc_names);
     
     enum svc_rpc_gss_client_state {
     	CLIENT_NEW,				/* still authenticating */
    diff --git a/lib/librt/Makefile b/lib/librt/Makefile
    index 00d8cda009ea..f98d94e170c8 100644
    --- a/lib/librt/Makefile
    +++ b/lib/librt/Makefile
    @@ -4,6 +4,10 @@ LIB=rt
     SHLIB_MAJOR= 1
     CFLAGS+=-I${.CURDIR}/../libc/include -I${.CURDIR}
     CFLAGS+=-Winline -Wall -g
    +DPADD=	${LIBPTHREAD}
    +LDADD=	-lpthread
    +
    +WARNS?=	2
     
     #MAN=	libthr.3
     
    diff --git a/lib/librt/mq.c b/lib/librt/mq.c
    index 9bdb5037cd4f..f2e01ca0f2b3 100644
    --- a/lib/librt/mq.c
    +++ b/lib/librt/mq.c
    @@ -33,6 +33,7 @@
     
     #include "namespace.h"
     #include 
    +#include 
     #include 
     #include 
     #include 
    @@ -66,15 +67,15 @@ __weak_reference(__mq_getattr, mq_getattr);
     __weak_reference(__mq_getattr, _mq_getattr);
     __weak_reference(__mq_setattr, mq_setattr);
     __weak_reference(__mq_setattr, _mq_setattr);
    -__weak_reference(__mq_timedreceive, mq_timedreceive);
    +__weak_reference(__mq_timedreceive_cancel, mq_timedreceive);
     __weak_reference(__mq_timedreceive, _mq_timedreceive);
    -__weak_reference(__mq_timedsend, mq_timedsend);
    +__weak_reference(__mq_timedsend_cancel, mq_timedsend);
     __weak_reference(__mq_timedsend, _mq_timedsend);
     __weak_reference(__mq_unlink, mq_unlink);
     __weak_reference(__mq_unlink, _mq_unlink);
    -__weak_reference(__mq_send, mq_send);
    +__weak_reference(__mq_send_cancel, mq_send);
     __weak_reference(__mq_send, _mq_send);
    -__weak_reference(__mq_receive, mq_receive);
    +__weak_reference(__mq_receive_cancel, mq_receive);
     __weak_reference(__mq_receive, _mq_receive);
     
     mqd_t
    @@ -195,6 +196,19 @@ __mq_timedreceive(mqd_t mqd, char *buf, size_t len,
     	return __sys_kmq_timedreceive(mqd->oshandle, buf, len, prio, timeout);
     }
     
    +ssize_t
    +__mq_timedreceive_cancel(mqd_t mqd, char *buf, size_t len,
    +	unsigned *prio, const struct timespec *timeout)
    +{
    +	int oldtype;
    +	int ret;
    +
    +	_pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
    +	ret = __sys_kmq_timedreceive(mqd->oshandle, buf, len, prio, timeout);
    +	_pthread_setcanceltype(oldtype, NULL);
    +	return (ret);
    +}
    +
     ssize_t
     __mq_receive(mqd_t mqd, char *buf, size_t len, unsigned *prio)
     {
    @@ -202,6 +216,17 @@ __mq_receive(mqd_t mqd, char *buf, size_t len, unsigned *prio)
     	return __sys_kmq_timedreceive(mqd->oshandle, buf, len, prio, NULL);
     }
     
    +ssize_t
    +__mq_receive_cancel(mqd_t mqd, char *buf, size_t len, unsigned *prio)
    +{
    +	int oldtype;
    +	int ret;
    +
    +	_pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
    +	ret = __sys_kmq_timedreceive(mqd->oshandle, buf, len, prio, NULL);
    +	_pthread_setcanceltype(oldtype, NULL);
    +	return (ret);
    +}
     ssize_t
     __mq_timedsend(mqd_t mqd, char *buf, size_t len,
     	unsigned prio, const struct timespec *timeout)
    @@ -210,6 +235,19 @@ __mq_timedsend(mqd_t mqd, char *buf, size_t len,
     	return __sys_kmq_timedsend(mqd->oshandle, buf, len, prio, timeout);
     }
     
    +ssize_t
    +__mq_timedsend_cancel(mqd_t mqd, char *buf, size_t len,
    +	unsigned prio, const struct timespec *timeout)
    +{
    +	int oldtype;
    +	int ret;
    +
    +	_pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
    +	ret = __sys_kmq_timedsend(mqd->oshandle, buf, len, prio, timeout);
    +	_pthread_setcanceltype(oldtype, NULL);
    +	return (ret);
    +}
    +
     ssize_t
     __mq_send(mqd_t mqd, char *buf, size_t len, unsigned prio)
     {
    @@ -217,6 +255,19 @@ __mq_send(mqd_t mqd, char *buf, size_t len, unsigned prio)
     	return __sys_kmq_timedsend(mqd->oshandle, buf, len, prio, NULL);
     }
     
    +
    +ssize_t
    +__mq_send_cancel(mqd_t mqd, char *buf, size_t len, unsigned prio)
    +{
    +	int oldtype;
    +	int ret;
    +
    +	_pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
    +	ret = __sys_kmq_timedsend(mqd->oshandle, buf, len, prio, NULL);
    +	_pthread_setcanceltype(oldtype, NULL);
    +	return (ret);
    +}
    +
     int
     __mq_unlink(const char *path)
     {
    diff --git a/lib/librt/sigev_thread.c b/lib/librt/sigev_thread.c
    index d2e25959576c..227733069b9b 100644
    --- a/lib/librt/sigev_thread.c
    +++ b/lib/librt/sigev_thread.c
    @@ -439,9 +439,9 @@ worker_routine(void *arg)
     {
     	struct sigev_node *sn = arg;
     
    -	_pthread_cleanup_push(worker_cleanup, sn);
    +	pthread_cleanup_push(worker_cleanup, sn);
     	sn->sn_dispatch(sn);
    -	_pthread_cleanup_pop(1);
    +	pthread_cleanup_pop(1);
     
     	return (0);
     }
    diff --git a/lib/libsbuf/Makefile b/lib/libsbuf/Makefile
    index b166befc287e..5d96c0e983e6 100644
    --- a/lib/libsbuf/Makefile
    +++ b/lib/libsbuf/Makefile
    @@ -3,7 +3,6 @@
     LIB=	sbuf
     SHLIBDIR?= /lib
     SRCS=	subr_sbuf.c 
    -WARNS?= 2
     
     .PATH:	${.CURDIR}/../../sys/kern
     
    diff --git a/lib/libsm/Makefile b/lib/libsm/Makefile
    index 38c780617e7d..ae76e91ccd1c 100644
    --- a/lib/libsm/Makefile
    +++ b/lib/libsm/Makefile
    @@ -15,6 +15,8 @@ CFLAGS+=-DNETINET6
     # User customizations to the sendmail build environment
     CFLAGS+=${SENDMAIL_CFLAGS}
     
    +WARNS?=	2
    +
     LIB=	sm
     
     SRCS+=	sm_os.h
    diff --git a/lib/libsmdb/Makefile b/lib/libsmdb/Makefile
    index b796deb5acd7..976282c5d69f 100644
    --- a/lib/libsmdb/Makefile
    +++ b/lib/libsmdb/Makefile
    @@ -9,6 +9,8 @@ CFLAGS+=-DNEWDB -DNOT_SENDMAIL
     # User customizations to the sendmail build environment
     CFLAGS+=${SENDMAIL_CFLAGS}
     
    +WARNS?=	3
    +
     LIB=	smdb
     
     SRCS+=	sm_os.h
    diff --git a/lib/libsmutil/Makefile b/lib/libsmutil/Makefile
    index 2e835fd76fdd..b7e5a694e4fb 100644
    --- a/lib/libsmutil/Makefile
    +++ b/lib/libsmutil/Makefile
    @@ -9,6 +9,8 @@ CFLAGS+=-DNEWDB -DNIS -DMAP_REGEX -DNOT_SENDMAIL
     # User customizations to the sendmail build environment
     CFLAGS+=${SENDMAIL_CFLAGS}
     
    +WARNS?=	2
    +
     LIB=	smutil
     
     SRCS+=	sm_os.h
    diff --git a/lib/libstand/Makefile b/lib/libstand/Makefile
    index 81b132dc7f81..1e4f9771abab 100644
    --- a/lib/libstand/Makefile
    +++ b/lib/libstand/Makefile
    @@ -15,6 +15,8 @@ NO_PIC=
     INCS=		stand.h
     MAN=		libstand.3
     
    +WARNS?=		0
    +
     CFLAGS+= -ffreestanding -Wformat
     CFLAGS+= -I${.CURDIR}
     
    diff --git a/lib/libstand/bzipfs.c b/lib/libstand/bzipfs.c
    index 47c799f57343..1b2e9ebff13f 100644
    --- a/lib/libstand/bzipfs.c
    +++ b/lib/libstand/bzipfs.c
    @@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
     #ifndef REGRESSION
     #include "stand.h"
     #else
    +#include 
     #include 
     #include 
     #include 
    @@ -42,7 +43,7 @@ struct open_file {
     };
     #define F_READ          0x0001  /* file opened for reading */
     #define EOFFSET (ELAST+8)       /* relative seek not supported */
    -static inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
    +static inline u_int min(u_int a, u_int b) { return(a < b ? a : b); }
     #define panic(x, y) abort()
     #endif
     
    @@ -174,6 +175,8 @@ bzf_open(const char *fname, struct open_file *f)
     
         /* Construct new name */
         bzfname = malloc(strlen(fname) + 5);
    +    if (bzfname == NULL)
    +	return(ENOMEM);
         sprintf(bzfname, "%s.bz2", fname);
     
         /* Try to open the compressed datafile */
    @@ -195,13 +198,14 @@ bzf_open(const char *fname, struct open_file *f)
     
         /* Allocate a bz_file structure, populate it */
         bzf = malloc(sizeof(struct bz_file));
    +    if (bzf == NULL)
    +	return(ENOMEM);
         bzero(bzf, sizeof(struct bz_file));
         bzf->bzf_rawfd = rawfd;
     
    -    /* Verify that the file is bzipped (XXX why do this afterwards?) */
    +    /* Verify that the file is bzipped */
         if (check_header(bzf)) {
     	close(bzf->bzf_rawfd);
    -	BZ2_bzDecompressEnd(&(bzf->bzf_bzstream));
     	free(bzf);
     	return(EFTYPE);
         }
    @@ -247,7 +251,7 @@ bzf_read(struct open_file *f, void *buf, size_t size, size_t *resid)
     	if (bzf->bzf_bzstream.avail_in == 0) {		/* oops, unexpected EOF */
     	    printf("bzf_read: unexpected EOF\n");
     	    if (bzf->bzf_bzstream.avail_out == size)
    -		return (EIO);
    +		return(EIO);
     	    break;
     	}
     
    @@ -266,6 +270,50 @@ bzf_read(struct open_file *f, void *buf, size_t size, size_t *resid)
         return(0);
     }
     
    +static int
    +bzf_rewind(struct open_file *f)
    +{
    +    struct bz_file	*bzf = (struct bz_file *)f->f_fsdata;
    +    struct bz_file	*bzf_tmp;
    +
    +    /*
    +     * Since bzip2 does not have an equivalent inflateReset function a crude
    +     * one needs to be provided.  The functions all called in such a way that
    +     * at any time an error occurs a roll back can be done (effectively making
    +     * this rewind 'atomic', either the reset occurs successfully or not at all,
    +     * with no 'undefined' state happening).
    +     */
    +
    +    /* Allocate a bz_file structure, populate it */
    +    bzf_tmp = malloc(sizeof(struct bz_file));
    +    if (bzf_tmp == NULL)
    +	return(-1);
    +    bzero(bzf_tmp, sizeof(struct bz_file));
    +    bzf_tmp->bzf_rawfd = bzf->bzf_rawfd;
    +
    +    /* Initialise the inflation engine */
    +    if (BZ2_bzDecompressInit(&(bzf_tmp->bzf_bzstream), 0, 1) != BZ_OK) {
    +	free(bzf_tmp);
    +	return(-1);
    +    }
    +
    +    /* Seek back to the beginning of the file */
    +    if (lseek(bzf->bzf_rawfd, 0, SEEK_SET) == -1) {
    +	BZ2_bzDecompressEnd(&(bzf_tmp->bzf_bzstream));
    +	free(bzf_tmp);
    +	return(-1);
    +    }
    +
    +    /* Free old bz_file data */
    +    BZ2_bzDecompressEnd(&(bzf->bzf_bzstream));
    +    free(bzf);
    +
    +    /* Use the new bz_file data */
    +    f->f_fsdata = bzf_tmp;
    +
    +    return(0);
    +}
    +
     static off_t
     bzf_seek(struct open_file *f, off_t offset, int where)
     {
    @@ -284,14 +332,17 @@ bzf_seek(struct open_file *f, off_t offset, int where)
     	target = -1;
         default:
     	errno = EINVAL;
    -	return (-1);
    +	return(-1);
         }
     
         /* Can we get there from here? */
    -    if (target < bzf->bzf_bzstream.total_out_lo32) {
    +    if (target < bzf->bzf_bzstream.total_out_lo32 && bzf_rewind(f) != 0) {
     	errno = EOFFSET;
     	return -1;
    -    } 
    +    }
    +
    +    /* if bzf_rewind was called then bzf has changed */
    +    bzf = (struct bz_file *)f->f_fsdata;
     
         /* skip forwards if required */
         while (target > bzf->bzf_bzstream.total_out_lo32) {
    @@ -301,7 +352,7 @@ bzf_seek(struct open_file *f, off_t offset, int where)
     	    return(-1);
         }
         /* This is where we are (be honest if we overshot) */
    -    return (bzf->bzf_bzstream.total_out_lo32);
    +    return(bzf->bzf_bzstream.total_out_lo32);
     }
     
     static int
    diff --git a/lib/libstand/dosfs.c b/lib/libstand/dosfs.c
    index 161d33008376..5ba10c11adf2 100644
    --- a/lib/libstand/dosfs.c
    +++ b/lib/libstand/dosfs.c
    @@ -47,6 +47,7 @@ static int	dos_close(struct open_file *fd);
     static int	dos_read(struct open_file *fd, void *buf, size_t size, size_t *resid);
     static off_t	dos_seek(struct open_file *fd, off_t offset, int whence);
     static int	dos_stat(struct open_file *fd, struct stat *sb);
    +static int	dos_readdir(struct open_file *fd, struct dirent *d);
     
     struct fs_ops dosfs_fsops = {
     	"dosfs",
    @@ -56,7 +57,7 @@ struct fs_ops dosfs_fsops = {
     	null_write,
     	dos_seek,
     	dos_stat,
    -	null_readdir
    +	dos_readdir
     };
     
     #define SECSIZ  512             /* sector size */
    @@ -354,6 +355,72 @@ dos_stat(struct open_file *fd, struct stat *sb)
         return (0);
     }
     
    +static int
    +dos_readdir(struct open_file *fd, struct dirent *d)
    +{
    +    DOS_FILE *f = (DOS_FILE *)fd->f_fsdata;
    +    u_char fn[261];
    +    DOS_DIR dd;
    +    size_t res;
    +    u_int chk, i, x, xdn;
    +    int err;
    +
    +    x = chk = 0;
    +    while (1) {
    +	xdn = x;
    +	x = 0;
    +	err = dos_read(fd, &dd, sizeof(dd), &res);
    +	if (err)
    +	    return (err);
    +	if (res == sizeof(dd))
    +	    return (ENOENT);
    +	if (dd.de.name[0] == 0)
    +	    return (ENOENT);
    +
    +	/* Skip deleted entries */
    +	if (dd.de.name[0] == 0xe5)
    +	    continue;
    +
    +	/* Skip volume labels */
    +	if (dd.de.attr & FA_LABEL)
    +	    continue;
    +
    +	if ((dd.de.attr & FA_MASK) == FA_XDE) {
    +	    if (dd.xde.seq & 0x40)
    +		chk = dd.xde.chk;
    +	    else if (dd.xde.seq != xdn - 1 || dd.xde.chk != chk)
    +		continue;
    +	    x = dd.xde.seq & ~0x40;
    +	    if (x < 1 || x > 20) {
    +		x = 0;
    +		continue;
    +	    }
    +	    cp_xdnm(fn, &dd.xde);
    +	} else {
    +	    if (xdn == 1) {
    +		x = 0;
    +		for (i = 0; i < 11; i++) {
    +		    x = ((x & 1) << 7) | (x >> 1);
    +		    x += dd.de.name[i];
    +		    x &= 0xff;
    +		}
    +		if (x == chk)
    +		    break;
    +	    } else {
    +		cp_sfn(fn, &dd.de);
    +		break;
    +	    }
    +	    x = 0;
    +	}
    +    }
    +
    +    d->d_fileno = dd.de.clus[1] << 8 + dd.de.clus[0];
    +    d->d_reclen = sizeof(*d);
    +    d->d_type = (dd.de.attr & FA_DIR) ? DT_DIR : DT_REG;
    +    memcpy(d->d_name, fn, sizeof(d->d_name));
    +    return(0);
    +}
    +
     /*
      * Parse DOS boot sector
      */
    diff --git a/lib/libstand/gzipfs.c b/lib/libstand/gzipfs.c
    index 4f40a4ae3b38..9ff7985636b5 100644
    --- a/lib/libstand/gzipfs.c
    +++ b/lib/libstand/gzipfs.c
    @@ -212,10 +212,9 @@ zf_open(const char *fname, struct open_file *f)
         bzero(zf, sizeof(struct z_file));
         zf->zf_rawfd = rawfd;
     
    -    /* Verify that the file is gzipped (XXX why do this afterwards?) */
    +    /* Verify that the file is gzipped */
         if (check_header(zf)) {
     	close(zf->zf_rawfd);
    -	inflateEnd(&(zf->zf_zstream));
     	free(zf);
     	return(EFTYPE);
         }
    @@ -261,7 +260,7 @@ zf_read(struct open_file *f, void *buf, size_t size, size_t *resid)
     	if (zf->zf_zstream.avail_in == 0) {		/* oops, unexpected EOF */
     	    printf("zf_read: unexpected EOF\n");
     	    if (zf->zf_zstream.avail_out == size)
    -		return (EIO);
    +		return(EIO);
     	    break;
     	}
     
    @@ -286,12 +285,13 @@ zf_rewind(struct open_file *f)
         struct z_file	*zf = (struct z_file *)f->f_fsdata;
     
         if (lseek(zf->zf_rawfd, zf->zf_dataoffset, SEEK_SET) == -1)
    -	return -1;
    +	return(-1);
         zf->zf_zstream.avail_in = 0;
         zf->zf_zstream.next_in = NULL;
    +    zf->zf_endseen = 0;
         (void)inflateReset(&zf->zf_zstream);
     
    -    return 0;
    +    return(0);
     }
     
     static off_t
    @@ -312,12 +312,12 @@ zf_seek(struct open_file *f, off_t offset, int where)
     	target = -1;
         default:
     	errno = EINVAL;
    -	return (-1);
    +	return(-1);
         }
     
         /* rewind if required */
         if (target < zf->zf_zstream.total_out && zf_rewind(f) != 0)
    -	return -1;
    +	return(-1);
     
         /* skip forwards if required */
         while (target > zf->zf_zstream.total_out) {
    @@ -327,7 +327,7 @@ zf_seek(struct open_file *f, off_t offset, int where)
     	    return(-1);
         }
         /* This is where we are (be honest if we overshot) */
    -    return (zf->zf_zstream.total_out);
    +    return(zf->zf_zstream.total_out);
     }
     
     
    diff --git a/lib/libstand/open.c b/lib/libstand/open.c
    index acbda1c9ed31..49dc6608ff43 100644
    --- a/lib/libstand/open.c
    +++ b/lib/libstand/open.c
    @@ -113,6 +113,7 @@ open(const char *fname, int mode)
         /* see if we opened a raw device; otherwise, 'file' is the file name. */
         if (file == (char *)0 || *file == '\0') {
     	f->f_flags |= F_RAW;
    +	f->f_rabuf = NULL;
     	return (fd);
         }
     
    diff --git a/lib/libstand/udp.c b/lib/libstand/udp.c
    index a95cedebdf58..194f564531a8 100644
    --- a/lib/libstand/udp.c
    +++ b/lib/libstand/udp.c
    @@ -90,7 +90,7 @@ sendudp(d, pkt, len)
     	ip->ip_hl = sizeof(*ip) >> 2;		/* half-char */
     	ip->ip_len = htons(len);
     	ip->ip_p = IPPROTO_UDP;			/* char */
    -	ip->ip_ttl = IP_TTL;			/* char */
    +	ip->ip_ttl = IPDEFTTL;			/* char */
     	ip->ip_src = d->myip;
     	ip->ip_dst = d->destip;
     	ip->ip_sum = in_cksum(ip, sizeof(*ip));	 /* short, but special */
    diff --git a/lib/libtacplus/Makefile b/lib/libtacplus/Makefile
    index 13ceb4327ef1..617f87737085 100644
    --- a/lib/libtacplus/Makefile
    +++ b/lib/libtacplus/Makefile
    @@ -33,4 +33,6 @@ LDADD=		-lmd
     SHLIB_MAJOR=	4
     MAN=		libtacplus.3 tacplus.conf.5
     
    +WARNS?=		2
    +
     .include 
    diff --git a/lib/libtacplus/libtacplus.3 b/lib/libtacplus/libtacplus.3
    index 9ce6c4a1746b..f76bc9d53e48 100644
    --- a/lib/libtacplus/libtacplus.3
    +++ b/lib/libtacplus/libtacplus.3
    @@ -24,7 +24,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd September 2, 1998
    +.Dd December 11, 2009
     .Dt LIBTACPLUS 3
     .Os
     .Sh NAME
    @@ -44,6 +44,8 @@
     .Fn tac_create_authen "struct tac_handle *h" "int action" "int type" "int service"
     .Ft int
     .Fn tac_create_author "struct tac_handle *h" "int method" "int type" "int service"
    +.Ft int
    +.Fn tac_create_acct "struct tac_handle *h" "int acct" "int action" "int type" "int service"
     .Ft char *
     .Fn tac_get_av "struct tac_handle *h" "u_int index"
     .Ft char *
    @@ -59,6 +61,8 @@
     .Ft int
     .Fn tac_send_author "struct tac_handle *h"
     .Ft int
    +.Fn tac_send_acct "struct tac_handle *h"
    +.Ft int
     .Fn tac_set_av "struct tac_handle *h" "u_int index" "const char *av_pair"
     .Ft int
     .Fn tac_set_data "struct tac_handle *h" "const void *data" "size_t data_len"
    @@ -193,6 +197,20 @@ TACACS+ protocol specification.
     The
     .In taclib.h
     header file contains symbolic constants for these values.
    +.Sh CREATING A TACACS+ ACCOUNTING REQUEST
    +To begin constructing a new accounting request, call
    +.Fn tac_create_acct .
    +The
    +.Va acct ,
    +.Va action ,
    +.Va type ,
    +and
    +.Va service
    +arguments must be set to appropriate values as defined in the
    +TACACS+ protocol specification.
    +The
    +.In taclib.h
    +header file contains symbolic constants for these values.
     .Sh SETTING OPTIONAL PARAMETERS ON A REQUEST
     After creating a request,
     various optional parameters may be attached to it through calls to
    @@ -354,6 +372,29 @@ include:
     .Pp
     The number of AV pairs received is obtained using
     .Fn TAC_AUTHEN_AV_COUNT .
    +.Sh SENDING THE ACCOUNTING REQUEST AND RECEIVING THE RESPONSE
    +After the TACACS+ authorization request has been constructed, it
    +is sent by means of
    +.Fn tac_send_acct .
    +This function connects to a server if not already connected, sends
    +the request, and waits for a reply.
    +On failure,
    +.Fn tac_send_acct
    +returns \-1.
    +Otherwise, it returns the TACACS+ status code 
    +Possible status codes, defined in
    +.In taclib.h ,
    +include:
    +.Pp
    +.Bl -item -compact -offset indent
    +.It
    +.Dv TAC_ACCT_STATUS_SUCCESS
    +.It
    +.Dv TAC_ACCT_STATUS_ERROR
    +.It
    +.Dv TAC_ACCT_STATUS_FOLLOW
    +.El
    +.Pp
     .Sh EXTRACTING INFORMATION FROM THE SERVER'S AUTHORIZATION RESPONSE
     Like an authentication response packet, an authorization
     response packet from the
    @@ -418,10 +459,14 @@ which can be retrieved using
     .It
     .Fn tac_create_author
     .It
    +.Fn tac_create_acct
    +.It
     .Fn tac_send_authen
     .It
     .Fn tac_send_author
     .It
    +.Fn tac_send_acct
    +.It
     .Fn tac_set_av
     .It
     .Fn tac_set_data
    diff --git a/lib/libtacplus/taclib.c b/lib/libtacplus/taclib.c
    index 6ac3c72501c6..d551bfe3d5d5 100644
    --- a/lib/libtacplus/taclib.c
    +++ b/lib/libtacplus/taclib.c
    @@ -211,6 +211,8 @@ protocol_version(int msg_type, int var, int type)
     	    }
             break;
     
    +	case TAC_ACCT:
    +
     	default:
     	    minor = 0;
             break;
    @@ -967,6 +969,23 @@ tac_create_author(struct tac_handle *h, int method, int type, int service)
     	return 0;
     }
     
    +int
    +tac_create_acct(struct tac_handle *h, int acct, int action, int type, int service)
    +{
    +	struct tac_acct_start *as;
    +
    +	create_msg(h, TAC_ACCT, action, type);
    +
    +	as = &h->request.u.acct_start;
    +	as->action = acct;
    +	as->authen_action = action;
    +	as->priv_lvl = TAC_PRIV_LVL_USER;
    +	as->authen_type = type;
    +	as->authen_service = service;
    +
    +	return 0;
    +}
    +
     static void
     create_msg(struct tac_handle *h, int msg_type, int var, int type)
     {
    @@ -1157,6 +1176,49 @@ tac_send_author(struct tac_handle *h)
     	return ares->av_cnt << 8 | ares->status;
     }
     
    +int
    +tac_send_acct(struct tac_handle *h)
    +{
    +	register int i, current;
    +	struct tac_acct_start *as = &h->request.u.acct_start;
    +	struct tac_acct_reply *ar = &h->response.u.acct_reply;
    +
    +	/* start */
    +	as = &h->request.u.acct_start;
    +	h->request.length = htonl(offsetof(struct tac_acct_start, rest[0]));
    +	for (as->av_cnt = 0, i = 0; i < MAXAVPAIRS; i++)
    +		if (h->avs[i].len && h->avs[i].data)
    +			as->av_cnt++;
    +	h->request.length = ntohl(htonl(h->request.length) + as->av_cnt);
    +
    +	if (add_str_8(h, &as->user_len, &h->user) == -1 ||
    +	    add_str_8(h, &as->port_len, &h->port) == -1 ||
    +	    add_str_8(h, &as->rem_addr_len, &h->rem_addr) == -1)
    +		return -1;
    +
    +	for (i = current = 0; i < MAXAVPAIRS; i++)
    +		if (h->avs[i].len && h->avs[i].data)
    +			if (add_str_8(h, &as->rest[current++], &(h->avs[i])) == -1)
    +				return -1;
    +
    +	/* send */
    +	if (send_msg(h) == -1 || recv_msg(h) == -1)
    +		return -1;
    +
    +	/* reply */
    +	h->srvr_pos = offsetof(struct tac_acct_reply, rest[0]);
    +	if (get_srvr_str(h, "msg", &h->srvr_msg, ntohs(ar->msg_len)) == -1 ||
    +	    get_srvr_str(h, "data", &h->srvr_data, ntohs(ar->data_len)) == -1 ||
    +	    get_srvr_end(h) == -1)
    +		return -1;
    +
    +	/* Sanity checks */
    +	if (!h->single_connect)
    +		close_connection(h);
    +
    +	return ar->status;
    +}
    +
     int
     tac_set_rem_addr(struct tac_handle *h, const char *addr)
     {
    @@ -1263,8 +1325,13 @@ tac_get_av_value(struct tac_handle *h, const char *attribute)
     			 *     h->srvr_avs[0] = "foobie=var1"
     			 *     h->srvr_avs[1] = "foo=var2"
     			 * is handled.
    +			 *
    +			 * Note that for empty string attribute values a
    +			 * 0-length string is returned in order to distinguish
    +			 * against unset values.
    +			 * dup_str() will handle srvr.len == 0 correctly.
     			 */
    -			if (found_seperator == 1 && ch != end) {
    +			if (found_seperator == 1) {
     				srvr.len = end - ch;
     				srvr.data = ch;
     				return dup_str(h, &srvr, NULL);
    diff --git a/lib/libtacplus/taclib.h b/lib/libtacplus/taclib.h
    index 2ef36b9efd50..46b9a59d80a4 100644
    --- a/lib/libtacplus/taclib.h
    +++ b/lib/libtacplus/taclib.h
    @@ -103,6 +103,17 @@ struct tac_handle;
     #define TAC_AUTHOR_STATUS_FAIL          0x10
     #define TAC_AUTHOR_STATUS_ERROR         0x11
     
    +/* Accounting actions */
    +#define TAC_ACCT_MORE			0x1
    +#define TAC_ACCT_START			0x2
    +#define TAC_ACCT_STOP			0x4
    +#define TAC_ACCT_WATCHDOG		0x8
    +
    +/* Accounting status */
    +#define TAC_ACCT_STATUS_SUCCESS		0x1
    +#define TAC_ACCT_STATUS_ERROR		0x2
    +#define TAC_ACCT_STATUS_FOLLOW		0x21
    +
     __BEGIN_DECLS
     int			 tac_add_server(struct tac_handle *,
     			    const char *, int, const char *, int, int);
    @@ -127,6 +138,8 @@ int			 tac_set_av(struct tac_handle *, u_int, const char *);
     char			*tac_get_av(struct tac_handle *, u_int);
     char			*tac_get_av_value(struct tac_handle *, const char *);
     void			 tac_clear_avs(struct tac_handle *);
    +int			 tac_create_acct(struct tac_handle *, int, int, int, int);
    +int			 tac_send_acct(struct tac_handle *);
     __END_DECLS
     
     #endif /* _TACLIB_H_ */
    diff --git a/lib/libtacplus/taclib_private.h b/lib/libtacplus/taclib_private.h
    index bbc1990c9269..2730023a632a 100644
    --- a/lib/libtacplus/taclib_private.h
    +++ b/lib/libtacplus/taclib_private.h
    @@ -132,6 +132,26 @@ struct tac_author_response {
     	unsigned char	rest[1];
     };
     
    +struct tac_acct_start {
    +	u_int8_t	action;
    +	u_int8_t	authen_action;
    +	u_int8_t	priv_lvl;
    +	u_int8_t	authen_type;
    +	u_int8_t	authen_service;
    +	u_int8_t	user_len;
    +	u_int8_t	port_len;
    +	u_int8_t	rem_addr_len;
    +	u_int8_t	av_cnt;
    +	unsigned char	rest[1];
    +};
    +
    +struct tac_acct_reply {
    +	u_int16_t	msg_len;
    +	u_int16_t	data_len;
    +	u_int8_t	status;
    +	unsigned char	rest[1];
    +};
    +
     struct tac_msg {
     	u_int8_t	version;
     	u_int8_t	type;
    @@ -145,6 +165,8 @@ struct tac_msg {
     		struct tac_authen_cont authen_cont;
     		struct tac_author_request author_request;
     		struct tac_author_response author_response;
    +		struct tac_acct_start acct_start;
    +		struct tac_acct_reply acct_reply;
     		unsigned char body[BODYSIZE];
     	} u;
     };
    diff --git a/lib/libthr/arch/ia64/Makefile.inc b/lib/libthr/arch/ia64/Makefile.inc
    index 1c0ce94c5122..160cdf64577e 100644
    --- a/lib/libthr/arch/ia64/Makefile.inc
    +++ b/lib/libthr/arch/ia64/Makefile.inc
    @@ -2,4 +2,4 @@
     
     .PATH: ${.CURDIR}/arch/${MACHINE_ARCH}/${MACHINE_ARCH}
     
    -SRCS+= pthread_md.c
    +SRCS+= _umtx_op_err.S pthread_md.c
    diff --git a/lib/libthr/arch/ia64/ia64/_umtx_op_err.S b/lib/libthr/arch/ia64/ia64/_umtx_op_err.S
    new file mode 100644
    index 000000000000..a71221096e62
    --- /dev/null
    +++ b/lib/libthr/arch/ia64/ia64/_umtx_op_err.S
    @@ -0,0 +1,35 @@
    +/*-
    + * Copyright (c) 2009 Marcel Moolenaar
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +
    +ENTRY(_umtx_op_err, 5)
    +	CALLSYS_NOERROR(_umtx_op)
    +	br.ret.sptk.few rp
    +END(_umtx_op_err)
    diff --git a/lib/libthr/arch/ia64/include/pthread_md.h b/lib/libthr/arch/ia64/include/pthread_md.h
    index 0cff7c9c9665..69b3eece4095 100644
    --- a/lib/libthr/arch/ia64/include/pthread_md.h
    +++ b/lib/libthr/arch/ia64/include/pthread_md.h
    @@ -33,6 +33,8 @@
     
     #define	CPU_SPINWAIT
     
    +#define	HAS__UMTX_OP_ERR	1
    +
     #define	DTV_OFFSET		offsetof(struct tcb, tcb_dtv)
     
     /*
    diff --git a/lib/libthr/arch/mips/include/pthread_md.h b/lib/libthr/arch/mips/include/pthread_md.h
    index 34e58c676c4c..24139a3a71f1 100644
    --- a/lib/libthr/arch/mips/include/pthread_md.h
    +++ b/lib/libthr/arch/mips/include/pthread_md.h
    @@ -60,7 +60,8 @@ void		_tcb_dtor(struct tcb *);
     static __inline void
     _tcb_set(struct tcb *tcb)
     {
    -	mips_tcb_set(tcb);
    +
    +	sysarch(MIPS_SET_TLS, tcb);
     }
     
     /*
    @@ -69,7 +70,10 @@ _tcb_set(struct tcb *tcb)
     static __inline struct tcb *
     _tcb_get(void)
     {
    -	return (mips_tcb_get());
    +	void *tcb;
    +
    +	sysarch(MIPS_GET_TLS, &tcb);
    +	return tcb;
     }
     
     extern struct pthread *_thr_initial;
    diff --git a/lib/libthr/pthread.map b/lib/libthr/pthread.map
    index 79bbd4c11a81..6460bec514a5 100644
    --- a/lib/libthr/pthread.map
    +++ b/lib/libthr/pthread.map
    @@ -145,13 +145,6 @@ FBSD_1.0 {
     	recvfrom;
     	recvmsg;
     	select;
    -	sem_destroy;
    -	sem_getvalue;
    -	sem_init;
    -	sem_post;
    -	sem_timedwait;
    -	sem_trywait;
    -	sem_wait;
     	sendmsg;
     	sendto;
     	sigaction;
    @@ -195,6 +188,7 @@ FBSDprivate_1.0 {
     	__msync;
     	__nanosleep;
     	__open;
    +	__openat;
     	__poll;
     	__pthread_cond_timedwait;
     	__pthread_cond_wait;
    @@ -347,13 +341,6 @@ FBSDprivate_1.0 {
     	_pthread_timedjoin_np;
     	_pthread_yield;
     	_raise;
    -	_sem_destroy;
    -	_sem_getvalue;
    -	_sem_init;
    -	_sem_post;
    -	_sem_timedwait;
    -	_sem_trywait;
    -	_sem_wait;
     	_sigaction;
     	_sigprocmask;
     	_sigsuspend;
    @@ -406,3 +393,7 @@ FBSD_1.1 {
     	pthread_mutex_setspinloops_np;
     	pthread_mutex_setyieldloops_np;
     };
    +
    +FBSD_1.2 {
    +	openat;
    +};
    diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c
    index f96bba9c617a..1bfdd287c203 100644
    --- a/lib/libthr/thread/thr_init.c
    +++ b/lib/libthr/thread/thr_init.c
    @@ -246,7 +246,9 @@ static pthread_func_t jmp_table[][2] = {
     	{DUAL_ENTRY(_pthread_setcanceltype)},	/* PJT_SETCANCELTYPE */
     	{DUAL_ENTRY(_pthread_setspecific)},	/* PJT_SETSPECIFIC */
     	{DUAL_ENTRY(_pthread_sigmask)},		/* PJT_SIGMASK */
    -	{DUAL_ENTRY(_pthread_testcancel)}	/* PJT_TESTCANCEL */
    +	{DUAL_ENTRY(_pthread_testcancel)},	/* PJT_TESTCANCEL */
    +	{DUAL_ENTRY(__pthread_cleanup_pop_imp)},/* PJT_CLEANUP_POP_IMP */
    +	{DUAL_ENTRY(__pthread_cleanup_push_imp)}/* PJT_CLEANUP_PUSH_IMP */
     };
     
     static int init_once = 0;
    diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h
    index e336b2cd6645..415c1ecc4ecd 100644
    --- a/lib/libthr/thread/thr_private.h
    +++ b/lib/libthr/thread/thr_private.h
    @@ -52,6 +52,20 @@
     #include 
     #include 
     
    +#define	SYM_FB10(sym)			__CONCAT(sym, _fb10)
    +#define	SYM_FBP10(sym)			__CONCAT(sym, _fbp10)
    +#define	WEAK_REF(sym, alias)		__weak_reference(sym, alias)
    +#define	SYM_COMPAT(sym, impl, ver)	__sym_compat(sym, impl, ver)
    +#define	SYM_DEFAULT(sym, impl, ver)	__sym_default(sym, impl, ver)
    +
    +#define	FB10_COMPAT(func, sym)				\
    +	WEAK_REF(func, SYM_FB10(sym));			\
    +	SYM_COMPAT(sym, SYM_FB10(sym), FBSD_1.0)
    +
    +#define	FB10_COMPAT_PRIVATE(func, sym)			\
    +	WEAK_REF(func, SYM_FBP10(sym));			\
    +	SYM_DEFAULT(sym, SYM_FBP10(sym), FBSDprivate_1.0)
    +
     #ifndef __hidden
     #define __hidden		__attribute__((visibility("hidden")))
     #endif
    @@ -660,6 +674,9 @@ int	_schedparam_to_rtp(int policy, const struct sched_param *param,
     void	_thread_bp_create(void);
     void	_thread_bp_death(void);
     int	_sched_yield(void);
    +void	_thr_sem_prefork(void);
    +void	_thr_sem_postfork(void);
    +void	_thr_sem_child_postfork(void);
     
     void	_pthread_cleanup_push(void (*)(void *), void *);
     void	_pthread_cleanup_pop(int);
    @@ -668,6 +685,7 @@ void	_pthread_cleanup_pop(int);
     #ifdef  _SYS_FCNTL_H_
     int     __sys_fcntl(int, int, ...);
     int     __sys_open(const char *, int, ...);
    +int     __sys_openat(int, const char *, int, ...);
     #endif
     
     /* #include  */
    diff --git a/lib/libthr/thread/thr_sem.c b/lib/libthr/thread/thr_sem.c
    index 0dd5599976f5..f20bde36a333 100644
    --- a/lib/libthr/thread/thr_sem.c
    +++ b/lib/libthr/thread/thr_sem.c
    @@ -36,7 +36,6 @@
     #include 
     #include 
     #include 
    -#include 
     #include 
     #include 
     #include <_semaphore.h>
    @@ -44,248 +43,73 @@
     
     #include "thr_private.h"
     
    +FB10_COMPAT(_sem_init_compat, sem_init);
    +FB10_COMPAT(_sem_destroy_compat, sem_destroy);
    +FB10_COMPAT(_sem_getvalue_compat, sem_getvalue);
    +FB10_COMPAT(_sem_trywait_compat, sem_trywait);
    +FB10_COMPAT(_sem_wait_compat, sem_wait);
    +FB10_COMPAT(_sem_timedwait_compat, sem_timedwait);
    +FB10_COMPAT(_sem_post_compat, sem_post);
     
    -__weak_reference(_sem_init, sem_init);
    -__weak_reference(_sem_destroy, sem_destroy);
    -__weak_reference(_sem_getvalue, sem_getvalue);
    -__weak_reference(_sem_trywait, sem_trywait);
    -__weak_reference(_sem_wait, sem_wait);
    -__weak_reference(_sem_timedwait, sem_timedwait);
    -__weak_reference(_sem_post, sem_post);
    +typedef struct sem *sem_t;
     
    +extern int _libc_sem_init_compat(sem_t *sem, int pshared, unsigned int value);
    +extern int _libc_sem_destroy_compat(sem_t *sem);
    +extern int _libc_sem_getvalue_compat(sem_t * __restrict sem, int * __restrict sval);
    +extern int _libc_sem_trywait_compat(sem_t *sem);
    +extern int _libc_sem_wait_compat(sem_t *sem);
    +extern int _libc_sem_timedwait_compat(sem_t * __restrict sem,
    +    const struct timespec * __restrict abstime);
    +extern int _libc_sem_post_compat(sem_t *sem);
     
    -static inline int
    -sem_check_validity(sem_t *sem)
    +int _sem_init_compat(sem_t *sem, int pshared, unsigned int value);
    +int _sem_destroy_compat(sem_t *sem);
    +int _sem_getvalue_compat(sem_t * __restrict sem, int * __restrict sval);
    +int _sem_trywait_compat(sem_t *sem);
    +int _sem_wait_compat(sem_t *sem);
    +int _sem_timedwait_compat(sem_t * __restrict sem,
    +    const struct timespec * __restrict abstime);
    +int _sem_post_compat(sem_t *sem);
    +
    +int
    +_sem_init_compat(sem_t *sem, int pshared, unsigned int value)
     {
    -
    -	if ((sem != NULL) && ((*sem)->magic == SEM_MAGIC))
    -		return (0);
    -	else {
    -		errno = EINVAL;
    -		return (-1);
    -	}
    -}
    -
    -static sem_t
    -sem_alloc(unsigned int value, semid_t semid, int system_sem)
    -{
    -	sem_t sem;
    -
    -	if (value > SEM_VALUE_MAX) {
    -		errno = EINVAL;
    -		return (NULL);
    -	}
    -
    -	sem = (sem_t)malloc(sizeof(struct sem));
    -	if (sem == NULL) {
    -		errno = ENOSPC;
    -		return (NULL);
    -	}
    -	bzero(sem, sizeof(*sem));
    -	/*
    -	 * Fortunatly count and nwaiters are adjacency, so we can
    -	 * use umtx_wait to wait on it, umtx_wait needs an address
    -	 * can be accessed as a long interger.
    -	 */
    -	sem->count = (u_int32_t)value;
    -	sem->nwaiters = 0;
    -	sem->magic = SEM_MAGIC;
    -	sem->semid = semid;
    -	sem->syssem = system_sem;
    -	return (sem);
    +	return _libc_sem_init_compat(sem, pshared, value);
     }
     
     int
    -_sem_init(sem_t *sem, int pshared, unsigned int value)
    +_sem_destroy_compat(sem_t *sem)
     {
    -	semid_t semid;
    -
    -	semid = (semid_t)SEM_USER;
    -	if ((pshared != 0) && (ksem_init(&semid, value) != 0))
    -		return (-1);
    -
    -	(*sem) = sem_alloc(value, semid, pshared);
    -	if ((*sem) == NULL) {
    -		if (pshared != 0)
    -			ksem_destroy(semid);
    -		return (-1);
    -	}
    -	return (0);
    +	return _libc_sem_destroy_compat(sem);
     }
     
     int
    -_sem_destroy(sem_t *sem)
    +_sem_getvalue_compat(sem_t * __restrict sem, int * __restrict sval)
     {
    -	int retval;
    -
    -	if (sem_check_validity(sem) != 0)
    -		return (-1);
    -
    -	/*
    -	 * If this is a system semaphore let the kernel track it otherwise
    -	 * make sure there are no waiters.
    -	 */
    -	if ((*sem)->syssem != 0)
    -		retval = ksem_destroy((*sem)->semid);
    -	else {
    -		retval = 0;
    -		(*sem)->magic = 0;
    -	}
    -	if (retval == 0)
    -		free(*sem);
    -	return (retval);
    +	return _libc_sem_getvalue_compat(sem, sval);
     }
     
     int
    -_sem_getvalue(sem_t * __restrict sem, int * __restrict sval)
    +_sem_trywait_compat(sem_t *sem)
     {
    -	int retval;
    -
    -	if (sem_check_validity(sem) != 0)
    -		return (-1);
    -
    -	if ((*sem)->syssem != 0)
    -		retval = ksem_getvalue((*sem)->semid, sval);
    -        else {
    -		*sval = (int)(*sem)->count;
    -		retval = 0;
    -	}
    -	return (retval);
    +	return _libc_sem_trywait_compat(sem);
     }
     
     int
    -_sem_trywait(sem_t *sem)
    +_sem_wait_compat(sem_t *sem)
     {
    -	int val;
    -
    -	if (sem_check_validity(sem) != 0)
    -		return (-1);
    -
    -	if ((*sem)->syssem != 0)
    - 		return (ksem_trywait((*sem)->semid));
    -
    -	while ((val = (*sem)->count) > 0) {
    -		if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1))
    -			return (0);
    -	}
    -	errno = EAGAIN;
    -	return (-1);
    -}
    -
    -static void
    -sem_cancel_handler(void *arg)
    -{
    -	sem_t *sem = arg;
    -
    -	atomic_add_int(&(*sem)->nwaiters, -1);
    -	if ((*sem)->nwaiters && (*sem)->count)
    -		_thr_umtx_wake(&(*sem)->count, 1, 0);
    +	return _libc_sem_wait_compat(sem);
     }
     
     int
    -_sem_wait(sem_t *sem)
    -{
    -	struct pthread *curthread;
    -	int val, retval;
    -
    -	if (sem_check_validity(sem) != 0)
    -		return (-1);
    -
    -	curthread = _get_curthread();
    -	if ((*sem)->syssem != 0) {
    -		_thr_cancel_enter(curthread);
    -		retval = ksem_wait((*sem)->semid);
    -		_thr_cancel_leave(curthread);
    -		return (retval);
    -	}
    -
    -	_pthread_testcancel();
    -	do {
    -		while ((val = (*sem)->count) > 0) {
    -			if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1))
    -				return (0);
    -		}
    -		atomic_add_int(&(*sem)->nwaiters, 1);
    -		THR_CLEANUP_PUSH(curthread, sem_cancel_handler, sem);
    -		_thr_cancel_enter(curthread);
    -		retval = _thr_umtx_wait_uint(&(*sem)->count, 0, NULL, 0);
    -		_thr_cancel_leave(curthread);
    -		THR_CLEANUP_POP(curthread, 0);
    -		atomic_add_int(&(*sem)->nwaiters, -1);
    -	} while (retval == 0);
    -	errno = retval;
    -	return (-1);
    -}
    -
    -int
    -_sem_timedwait(sem_t * __restrict sem,
    +_sem_timedwait_compat(sem_t * __restrict sem,
         const struct timespec * __restrict abstime)
     {
    -	struct timespec ts, ts2;
    -	struct pthread *curthread;
    -	int val, retval;
    -
    -	if (sem_check_validity(sem) != 0)
    -		return (-1);
    -
    -	curthread = _get_curthread();
    -	if ((*sem)->syssem != 0) {
    -		_thr_cancel_enter(curthread);
    -		retval = ksem_timedwait((*sem)->semid, abstime);
    -		_thr_cancel_leave(curthread);
    -		return (retval);
    -	}
    -
    -	/*
    -	 * The timeout argument is only supposed to
    -	 * be checked if the thread would have blocked.
    -	 */
    -	_pthread_testcancel();
    -	do {
    -		while ((val = (*sem)->count) > 0) {
    -			if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1))
    -				return (0);
    -		}
    -		if (abstime == NULL) {
    -			errno = EINVAL;
    -			return (-1);
    -		}
    -		clock_gettime(CLOCK_REALTIME, &ts);
    -		TIMESPEC_SUB(&ts2, abstime, &ts);
    -		atomic_add_int(&(*sem)->nwaiters, 1);
    -		THR_CLEANUP_PUSH(curthread, sem_cancel_handler, sem);
    -		_thr_cancel_enter(curthread);
    -		retval = _thr_umtx_wait_uint((uint32_t*)&(*sem)->count, 0, &ts2, 0);
    -		_thr_cancel_leave(curthread);
    -		THR_CLEANUP_POP(curthread, 0);
    -		atomic_add_int(&(*sem)->nwaiters, -1);
    -	} while (retval == 0);
    -	errno = retval;
    -	return (-1);
    +	return _libc_sem_timedwait_compat(sem, abstime);
     }
     
    -/*
    - * sem_post() is required to be safe to call from within
    - * signal handlers, these code should work as that.
    - */
    -
     int
    -_sem_post(sem_t *sem)
    +_sem_post_compat(sem_t *sem)
     {
    -	int retval = 0;
    -	
    -	if (sem_check_validity(sem) != 0)
    -		return (-1);
    -
    -	if ((*sem)->syssem != 0)
    -		return (ksem_post((*sem)->semid));
    -
    -	atomic_add_rel_int(&(*sem)->count, 1);
    -
    -	if ((*sem)->nwaiters) {
    -		retval = _thr_umtx_wake(&(*sem)->count, 1, 0);
    -		if (retval != 0)
    -			retval = -1;
    -	}
    -	return (retval);
    +	return _libc_sem_post_compat(sem);
     }
    diff --git a/lib/libthr/thread/thr_syscalls.c b/lib/libthr/thread/thr_syscalls.c
    index 698c0c3f1155..92670a9a77ad 100644
    --- a/lib/libthr/thread/thr_syscalls.c
    +++ b/lib/libthr/thread/thr_syscalls.c
    @@ -104,6 +104,8 @@ extern int	__sys_accept(int, struct sockaddr *, socklen_t *);
     extern int	__sys_connect(int, const struct sockaddr *, socklen_t);
     extern int	__sys_fsync(int);
     extern int	__sys_msync(void *, size_t, int);
    +extern int	__sys_pselect(int, fd_set *, fd_set *, fd_set *,
    +			const struct timespec *, const sigset_t *);
     extern int	__sys_poll(struct pollfd *, unsigned, int);
     extern ssize_t	__sys_recv(int, void *, size_t, int);
     extern ssize_t	__sys_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
    @@ -139,6 +141,7 @@ int	__fsync(int);
     int	__msync(void *, size_t, int);
     int	__nanosleep(const struct timespec *, struct timespec *);
     int	__open(const char *, int,...);
    +int	__openat(int, const char *, int,...);
     int	__poll(struct pollfd *, unsigned int, int);
     ssize_t	__read(int, void *buf, size_t);
     ssize_t	__readv(int, const struct iovec *, int);
    @@ -341,6 +344,33 @@ __open(const char *path, int flags,...)
     	return ret;
     }
     
    +__weak_reference(__openat, openat);
    +
    +int
    +__openat(int fd, const char *path, int flags, ...)
    +{
    +	struct pthread *curthread = _get_curthread();
    +	int	ret;
    +	int	mode = 0;
    +	va_list	ap;
    +
    +	_thr_cancel_enter(curthread);
    +	
    +	/* Check if the file is being created: */
    +	if (flags & O_CREAT) {
    +		/* Get the creation mode: */
    +		va_start(ap, flags);
    +		mode = va_arg(ap, int);
    +		va_end(ap);
    +	}
    +	
    +	ret = __sys_openat(fd, path, flags, mode);
    +
    +	_thr_cancel_leave(curthread);
    +
    +	return ret;
    +}
    +
     __weak_reference(__poll, poll);
     
     int
    @@ -366,7 +396,7 @@ ___pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
     	int ret;
     
     	_thr_cancel_enter(curthread);
    -	ret = __pselect(count, rfds, wfds, efds, timo, mask);
    +	ret = __sys_pselect(count, rfds, wfds, efds, timo, mask);
     	_thr_cancel_leave(curthread);
     
     	return (ret);
    diff --git a/lib/libthr/thread/thr_umtx.c b/lib/libthr/thread/thr_umtx.c
    index 7c59bb78ccb8..5af923dce4fb 100644
    --- a/lib/libthr/thread/thr_umtx.c
    +++ b/lib/libthr/thread/thr_umtx.c
    @@ -112,10 +112,13 @@ __thr_umutex_timedlock(struct umutex *mtx, uint32_t id,
     int
     __thr_umutex_unlock(struct umutex *mtx, uint32_t id)
     {
    +#ifndef __ia64__
    +	/* XXX this logic has a race-condition on ia64. */
     	if ((mtx->m_flags & (UMUTEX_PRIO_PROTECT | UMUTEX_PRIO_INHERIT)) == 0) {
     		atomic_cmpset_rel_32(&mtx->m_owner, id | UMUTEX_CONTESTED, UMUTEX_CONTESTED);
     		return _umtx_op_err(mtx, UMTX_OP_MUTEX_WAKE, 0, 0, 0);
     	}
    +#endif /* __ia64__ */
     	return _umtx_op_err(mtx, UMTX_OP_MUTEX_UNLOCK, 0, 0, 0);
     }
     
    diff --git a/lib/libthread_db/Makefile b/lib/libthread_db/Makefile
    index 22868c31458f..7aaefd7cfd46 100644
    --- a/lib/libthread_db/Makefile
    +++ b/lib/libthread_db/Makefile
    @@ -9,7 +9,6 @@ SRCS+=	libpthread_md.c
     SRCS+=	libpthread_db.c
     SRCS+=	libthr_db.c
     INCS=	thread_db.h
    -WARNS?= 6
     
     CFLAGS+=-I. -I${.CURDIR}
     SYM_MAPS+=${.CURDIR}/Symbol.map
    diff --git a/lib/libufs/Makefile b/lib/libufs/Makefile
    index 10726e4247e9..c9232ef54ad8 100644
    --- a/lib/libufs/Makefile
    +++ b/lib/libufs/Makefile
    @@ -16,7 +16,7 @@ MLINKS+= ufs_disk_close.3 ufs_disk_fillout.3
     MLINKS+= ufs_disk_close.3 ufs_disk_fillout_blank.3
     MLINKS+= ufs_disk_close.3 ufs_disk_write.3
     
    -WARNS?=	2
    +WARNS?=	3
     
     CFLAGS+= -D_LIBUFS
     .if defined(LIBUFS_DEBUG)
    diff --git a/lib/libufs/cgroup.c b/lib/libufs/cgroup.c
    index 2185682e098f..28e5ea87a430 100644
    --- a/lib/libufs/cgroup.c
    +++ b/lib/libufs/cgroup.c
    @@ -59,7 +59,7 @@ cgread1(struct uufsd *disk, int c)
     
     	fs = &disk->d_fs;
     
    -	if (c >= fs->fs_ncg) {
    +	if ((unsigned)c >= fs->fs_ncg) {
     		return (0);
     	}
     	ccg = fsbtodb(fs, cgtod(fs, c)) * disk->d_bsize;
    diff --git a/lib/libufs/sblock.c b/lib/libufs/sblock.c
    index c9125f28ad34..8986290039fb 100644
    --- a/lib/libufs/sblock.c
    +++ b/lib/libufs/sblock.c
    @@ -93,7 +93,7 @@ int
     sbwrite(struct uufsd *disk, int all)
     {
     	struct fs *fs;
    -	int i;
    +	unsigned i;
     
     	ERROR(disk, NULL);
     
    diff --git a/lib/libugidfw/Makefile b/lib/libugidfw/Makefile
    index 23c5ea7aaf5b..2e0956575522 100644
    --- a/lib/libugidfw/Makefile
    +++ b/lib/libugidfw/Makefile
    @@ -5,6 +5,8 @@ SHLIB_MAJOR=	4
     SRCS=		ugidfw.c
     INCS=		ugidfw.h
     
    +WARNS?=		2
    +
     MAN+=		bsde_get_rule.3 bsde_get_rule_count.3 bsde_parse_rule.3 \
     		bsde_rule_to_string.3 libugidfw.3
     
    diff --git a/lib/libugidfw/ugidfw.c b/lib/libugidfw/ugidfw.c
    index 341ac25f4a6b..49c987dc3f65 100644
    --- a/lib/libugidfw/ugidfw.c
    +++ b/lib/libugidfw/ugidfw.c
    @@ -770,7 +770,6 @@ bsde_parse_fsid(char *spec, struct fsid *fsid, size_t buflen, char *errstr)
     {
     	size_t len;
     	struct statfs buf;
    -	int i;
     
     	if (statfs(spec, &buf) < 0) {
     		len = snprintf(errstr, buflen, "Unable to get id for %s: %s",
    diff --git a/lib/libulog/Makefile b/lib/libulog/Makefile
    new file mode 100644
    index 000000000000..074d9db9f87a
    --- /dev/null
    +++ b/lib/libulog/Makefile
    @@ -0,0 +1,38 @@
    +# $FreeBSD$
    +
    +SHLIBDIR?=/lib
    +
    +.include 
    +
    +LIB=	ulog
    +SHLIB_MAJOR= 0
    +INCS=	ulog.h utempter.h
    +SRCS=	ulog.h ulog_login.c ulog_login_pseudo.c utempter.c
    +
    +MAN=	ulog_login.3 utempter_add_record.3
    +MLINKS+=ulog_login.3 ulog_login_pseudo.3 \
    +	ulog_login.3 ulog_logout.3 \
    +	ulog_login.3 ulog_logout_pseudo.3 \
    +	utempter_add_record.3 utempter_remove_added_record.3 \
    +	utempter_add_record.3 utempter_remove_record.3 \
    +	utempter_add_record.3 addToUtmp.3 \
    +	utempter_remove_added_record.3 removeFromUtmp.3 \
    +	utempter_remove_record.3 removeLineFromUtmp.3
    +
    +DPADD=	${LIBMD}
    +LDADD=	-lmd
    +
    +VERSION_DEF= ${.CURDIR}/../libc/Versions.def
    +SYMBOL_MAPS= ${.CURDIR}/Symbol.map
    +
    +.if ${MK_INSTALLLIB} != "no"
    +SYMLINKS+=libulog.a ${LIBDIR}/libutempter.a
    +.endif
    +.if !defined(NO_PIC)
    +SYMLINKS+=libulog.so ${LIBDIR}/libutempter.so
    +.endif
    +.if ${MK_PROFILE} != "no"
    +SYMLINKS+=libulog_p.a ${LIBDIR}/libutempter_p.a
    +.endif
    +
    +.include 
    diff --git a/lib/libulog/Symbol.map b/lib/libulog/Symbol.map
    new file mode 100644
    index 000000000000..e0375aee5ab3
    --- /dev/null
    +++ b/lib/libulog/Symbol.map
    @@ -0,0 +1,17 @@
    +/*
    + * $FreeBSD$
    + */	
    +
    +FBSD_1.2 {
    +	ulog_login;
    +	ulog_login_pseudo;
    +	ulog_logout;
    +	ulog_logout_pseudo;
    +
    +	addToUtmp;
    +	removeFromUtmp;
    +	removeLineFromUtmp;
    +	utempter_add_record;
    +	utempter_remove_added_record;
    +	utempter_remove_record;
    +};
    diff --git a/lib/libulog/ulog.h b/lib/libulog/ulog.h
    new file mode 100644
    index 000000000000..c5f6fa0cb416
    --- /dev/null
    +++ b/lib/libulog/ulog.h
    @@ -0,0 +1,41 @@
    +/*-
    + * Copyright (c) 2009 Ed Schouten 
    + * 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$
    + */
    +
    +#ifndef _ULOG_H_
    +#define	_ULOG_H_
    +
    +#include 
    +
    +__BEGIN_DECLS
    +void	ulog_login(const char *, const char *, const char *);
    +void	ulog_login_pseudo(int, const char *);
    +void	ulog_logout(const char *);
    +void	ulog_logout_pseudo(int);
    +__END_DECLS
    +
    +#endif /* !_ULOG_H_ */
    diff --git a/lib/libulog/ulog_login.3 b/lib/libulog/ulog_login.3
    new file mode 100644
    index 000000000000..ec397c8c0cd9
    --- /dev/null
    +++ b/lib/libulog/ulog_login.3
    @@ -0,0 +1,99 @@
    +.\" Copyright (c) 2009 Ed Schouten 
    +.\" 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$
    +.\"
    +.Dd December 5, 2009
    +.Os
    +.Dt ULOG_LOGIN 3
    +.Sh NAME
    +.Nm ulog_login ,
    +.Nm ulog_login_pseudo ,
    +.Nm ulog_logout ,
    +.Nm ulog_logout_pseudo
    +.Nd manage user login records
    +.Sh LIBRARY
    +.Lb libulog
    +.Sh SYNOPSIS
    +.In ulog.h
    +.Ft void
    +.Fn ulog_login "const char *line" "const char *user" "const char *host"
    +.Ft void
    +.Fn ulog_login_pseudo "int fd" "const char *host"
    +.Ft void
    +.Fn ulog_logout "const char *line"
    +.Ft void
    +.Fn ulog_logout_pseudo "int fd"
    +.Sh DESCRIPTION
    +The
    +.Fn ulog_login
    +and
    +.Fn ulog_login_pseudo
    +functions register a login session on a TTY.
    +The
    +.Fn ulog_login
    +function adds an entry for TTY
    +.Fa line
    +and username
    +.Fa user .
    +The
    +.Fn ulog_login_pseudo
    +function uses file descriptor to a pseudo-terminal master device
    +.Fa fd
    +to determine the TTY name, while using the username belonging to the
    +real user ID of the calling process.
    +The optional
    +.Fa host
    +argument denotes a remote hostname, in case the login session is
    +provided by a network service.
    +.Pp
    +The
    +.Fn ulog_logout
    +and
    +.Fn ulog_logout_pseudo
    +functions mark the previously registered login session as being
    +terminated.
    +.Pp
    +Because the
    +.Fa line
    +and
    +.Fa user
    +arguments of
    +.Fn ulog_login
    +and
    +.Fn ulog_logout
    +cannot be trusted, these functions require administrative privileges.
    +The
    +.Fn ulog_login_pseudo
    +and
    +.Fn ulog_logout_pseudo
    +functions spawn a privileged process to perform the actual logging.
    +.Sh SEE ALSO
    +.Xr posix_openpt 2 ,
    +.Xr getuid 3 ,
    +.Xr ptsname 3 ,
    +.Xr pututxline 3
    +.Sh HISTORY
    +These functions appeared in
    +.Fx 9.0 .
    diff --git a/lib/libulog/ulog_login.c b/lib/libulog/ulog_login.c
    new file mode 100644
    index 000000000000..3058b9f53399
    --- /dev/null
    +++ b/lib/libulog/ulog_login.c
    @@ -0,0 +1,84 @@
    +/*-
    + * Copyright (c) 2009 Ed Schouten 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include "ulog.h"
    +
    +static void
    +ulog_fill(struct utmpx *utx, const char *line)
    +{
    +	SHA_CTX c;
    +	char id[SHA_DIGEST_LENGTH];
    +
    +	/* Remove /dev/ component. */
    +	if (strncmp(line, _PATH_DEV, sizeof _PATH_DEV - 1) == 0)
    +		line += sizeof _PATH_DEV - 1;
    +
    +	memset(utx, 0, sizeof *utx);
    +
    +	utx->ut_pid = getpid();
    +	gettimeofday(&utx->ut_tv, NULL);
    +	strncpy(utx->ut_line, line, sizeof utx->ut_line);
    +
    +	SHA1_Init(&c);
    +	SHA1_Update(&c, "libulog", 7);
    +	SHA1_Update(&c, utx->ut_line, sizeof utx->ut_line);
    +	SHA_Final(id, &c);
    +
    +	memcpy(utx->ut_id, id, MIN(sizeof utx->ut_id, sizeof id));
    +}
    +
    +void
    +ulog_login(const char *line, const char *user, const char *host)
    +{
    +	struct utmpx utx;
    +
    +	ulog_fill(&utx, line);
    +	utx.ut_type = USER_PROCESS;
    +	strncpy(utx.ut_user, user, sizeof utx.ut_user);
    +	if (host != NULL)
    +		strncpy(utx.ut_host, host, sizeof utx.ut_host);
    +	pututxline(&utx);
    +}
    +
    +void
    +ulog_logout(const char *line)
    +{
    +	struct utmpx utx;
    +
    +	ulog_fill(&utx, line);
    +	utx.ut_type = DEAD_PROCESS;
    +	pututxline(&utx);
    +}
    diff --git a/lib/libulog/ulog_login_pseudo.c b/lib/libulog/ulog_login_pseudo.c
    new file mode 100644
    index 000000000000..c7f306604cfd
    --- /dev/null
    +++ b/lib/libulog/ulog_login_pseudo.c
    @@ -0,0 +1,92 @@
    +/*-
    + * Copyright (c) 2009 Ed Schouten 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include "ulog.h"
    +
    +#define	_PATH_ULOG_HELPER	"/usr/libexec/ulog-helper"
    +
    +/*
    + * Registering login sessions.
    + */
    +
    +static void
    +ulog_exec_helper(int fd, char const * const argv[])
    +{
    +	sigset_t oblock, nblock;
    +	pid_t pid, wpid;
    +	int status;
    +
    +	/* Block SIGCHLD. */
    +	sigemptyset(&nblock);
    +	sigaddset(&nblock, SIGCHLD);
    +	sigprocmask(SIG_BLOCK, &nblock, &oblock);
    +
    +	switch (pid = fork()) {
    +	case -1:
    +		break;
    +	case 0:
    +		/* Execute helper program. */
    +		if (dup2(fd, STDIN_FILENO) == -1)
    +			exit(EX_UNAVAILABLE);
    +		sigprocmask(SIG_SETMASK, &oblock, NULL);
    +		execv(_PATH_ULOG_HELPER, __DECONST(char * const *, argv));
    +		exit(EX_UNAVAILABLE);
    +	default:
    +		/* Wait for helper to finish. */
    +		do {
    +			wpid = waitpid(pid, &status, 0);
    +		} while (wpid == -1 && errno == EINTR);
    +		break;
    +	}
    +
    +	sigprocmask(SIG_SETMASK, &oblock, NULL);
    +}
    +
    +void
    +ulog_login_pseudo(int fd, const char *host)
    +{
    +	char const * const args[4] = { "ulog-helper", "login", host, NULL };
    +
    +	ulog_exec_helper(fd, args);
    +}
    +
    +void
    +ulog_logout_pseudo(int fd)
    +{
    +	char const * const args[3] = { "ulog-helper", "logout", NULL };
    +
    +	ulog_exec_helper(fd, args);
    +}
    diff --git a/lib/libulog/utempter.c b/lib/libulog/utempter.c
    new file mode 100644
    index 000000000000..94495b0c50c9
    --- /dev/null
    +++ b/lib/libulog/utempter.c
    @@ -0,0 +1,84 @@
    +/*-
    + * Copyright (c) 2009 Ed Schouten 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include "ulog.h"
    +#include "utempter.h"
    +
    +static int last_fd = -1;
    +
    +int
    +utempter_add_record(int fd, const char *host)
    +{
    +
    +	ulog_login_pseudo(fd, host);
    +	last_fd = fd;
    +	return (0);
    +}
    +
    +int
    +utempter_remove_added_record(void)
    +{
    +
    +	if (last_fd < 0)
    +		return (0);
    +	ulog_logout_pseudo(last_fd);
    +	last_fd = -1;
    +	return (0);
    +}
    +
    +int
    +utempter_remove_record(int fd)
    +{
    +
    +	ulog_logout_pseudo(fd);
    +	if (last_fd == fd)
    +		last_fd = -1;
    +	return (0);
    +}
    +
    +void
    +addToUtmp(const char *pty __unused, const char *host, int fd)
    +{
    +
    +	utempter_add_record(fd, host);
    +}
    +
    +void
    +removeFromUtmp(void)
    +{
    +
    +	utempter_remove_added_record();
    +}
    +
    +void
    +removeLineFromUtmp(const char *pty __unused, int fd)
    +{
    +
    +	utempter_remove_record(fd);
    +}
    diff --git a/lib/libulog/utempter.h b/lib/libulog/utempter.h
    new file mode 100644
    index 000000000000..0e0274cf04fb
    --- /dev/null
    +++ b/lib/libulog/utempter.h
    @@ -0,0 +1,44 @@
    +/*-
    + * Copyright (c) 2009 Ed Schouten 
    + * 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$
    + */
    +
    +#ifndef _UTEMPTER_H_
    +#define	_UTEMPTER_H_
    +
    +#include 
    +
    +__BEGIN_DECLS
    +int	utempter_add_record(int, const char *);
    +int	utempter_remove_added_record(void);
    +int	utempter_remove_record(int);
    +
    +void	addToUtmp(const char *, const char *, int);
    +void	removeFromUtmp(void);
    +void	removeLineFromUtmp(const char *, int);
    +__END_DECLS
    +
    +#endif /* !_UTEMPTER_H_ */
    diff --git a/lib/libulog/utempter_add_record.3 b/lib/libulog/utempter_add_record.3
    new file mode 100644
    index 000000000000..1553d68c26b1
    --- /dev/null
    +++ b/lib/libulog/utempter_add_record.3
    @@ -0,0 +1,105 @@
    +.\" Copyright (c) 2009 Ed Schouten 
    +.\" 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$
    +.\"
    +.Dd December 6, 2009
    +.Os
    +.Dt UTEMPTER_ADD_RECORD 3
    +.Sh NAME
    +.Nm utempter_add_record ,
    +.Nm utempter_remove_added_record ,
    +.Nm utempter_remove_record ,
    +.Nm addToUtmp ,
    +.Nm removeFromUtmp ,
    +.Nm removeLineFromUtmp
    +.Nd utempter compatibility interface
    +.Sh LIBRARY
    +.Lb libulog
    +.Sh SYNOPSIS
    +.In utempter.h
    +.Ft int
    +.Fn utempter_add_record "int fd" "const char *host"
    +.Ft int
    +.Fn utempter_remove_added_record "void"
    +.Ft int
    +.Fn utempter_remove_record "int fd"
    +.Ft void
    +.Fn addToUtmp "const char *pty" "const char *host" "int fd"
    +.Ft void
    +.Fn removeFromUtmp "void"
    +.Ft void
    +.Fn removeLineFromUtmp "const char *pty" "int fd"
    +.Sh DESCRIPTION
    +The
    +.Fn utempter_add_record
    +and
    +.Fn addToUtmp
    +functions add a login record to the database for the TTY belonging to
    +the pseudo-terminal master file descriptor
    +.Fa fd ,
    +using the username corresponding with the real user ID of the calling
    +process and the optional hostname
    +.Fa host .
    +These functions are equivalent to
    +.Xr ulog_login_pseudo 3 .
    +.Pp
    +The
    +.Fn utempter_remove_record
    +and
    +.Fn removeLineFromUtmp
    +functions mark the login session as being closed for the TTY belonging
    +to the pseudo-terminal master file descriptor
    +.Fa fd .
    +These functions are equivalent to
    +.Xr ulog_logout_pseudo 3 .
    +.Pp
    +The
    +.Fn utempter_remove_added_record
    +and
    +.Fn removeFromUtmp
    +functions have the same properties as the previously mentioned
    +functions, except that they use an internally cached value of the file
    +descriptor passed to the login functions.
    +.Pp
    +The
    +.Fa pty
    +arguments of 
    +.Fn addToUtmp
    +and
    +.Fn removeLineFromUtmp
    +are unused.
    +.Sh RETURN VALUES
    +In this implementation, the
    +.Fn utempter_add_record ,
    +.Fn utempter_remove_added_record
    +and
    +.Fn utempter_remove_record
    +always return a value of 0.
    +.Sh SEE ALSO
    +.Xr pututxline 3 ,
    +.Xr ulog_login_pseudo 3
    +.Sh HISTORY
    +These functions appeared in
    +.Fx 9.0 .
    diff --git a/lib/libusb/Makefile b/lib/libusb/Makefile
    index b06f7746082e..7405ef33054f 100644
    --- a/lib/libusb/Makefile
    +++ b/lib/libusb/Makefile
    @@ -16,6 +16,8 @@ MAN=		libusb.3 libusb20.3
     MKLINT=		no
     NOGCCERROR=
     
    +WARNS?=		2
    +
     MLINKS+=	libusb.3 usb.3
     
     # libusb 0.1 compat
    diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h
    index f65b57a50394..03f03e49de3e 100644
    --- a/lib/libusb/libusb.h
    +++ b/lib/libusb/libusb.h
    @@ -29,13 +29,6 @@
     
     #include 
     #include 
    -#include 
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
     
     #ifdef __cplusplus
     extern	"C" {
    @@ -271,9 +264,11 @@ typedef struct libusb_control_setup {
     	uint16_t wLength;
     }	libusb_control_setup;
     
    +#define	LIBUSB_CONTROL_SETUP_SIZE	8	/* bytes */
    +
     typedef struct libusb_iso_packet_descriptor {
    -	unsigned int length;
    -	unsigned int actual_length;
    +	uint32_t length;
    +	uint32_t actual_length;
     	enum libusb_transfer_status status;
     }	libusb_iso_packet_descriptor __aligned(sizeof(void *));
     
    @@ -282,9 +277,9 @@ typedef void (*libusb_transfer_cb_fn) (struct libusb_transfer *transfer);
     typedef struct libusb_transfer {
     	libusb_device_handle *dev_handle;
     	uint8_t	flags;
    -	unsigned int endpoint;
    +	uint32_t endpoint;
     	uint8_t type;
    -	unsigned int timeout;
    +	uint32_t timeout;
     	enum libusb_transfer_status status;
     	int	length;
     	int	actual_length;
    @@ -320,7 +315,7 @@ int	libusb_get_configuration(libusb_device_handle * devh, int *config);
     int	libusb_set_configuration(libusb_device_handle * devh, int configuration);
     int	libusb_claim_interface(libusb_device_handle * devh, int interface_number);
     int	libusb_release_interface(libusb_device_handle * devh, int interface_number);
    -int	libusb_reset_device(libusb_device_handle * dev);
    +int	libusb_reset_device(libusb_device_handle * devh);
     int 	libusb_kernel_driver_active(libusb_device_handle * devh, int interface);
     int 	libusb_detach_kernel_driver(libusb_device_handle * devh, int interface);
     int 	libusb_attach_kernel_driver(libusb_device_handle * devh, int interface);
    @@ -333,7 +328,8 @@ int	libusb_get_active_config_descriptor(libusb_device * dev, struct libusb_confi
     int	libusb_get_config_descriptor(libusb_device * dev, uint8_t config_index, struct libusb_config_descriptor **config);
     int	libusb_get_config_descriptor_by_value(libusb_device * dev, uint8_t bConfigurationValue, struct libusb_config_descriptor **config);
     void	libusb_free_config_descriptor(struct libusb_config_descriptor *config);
    -int	libusb_get_string_descriptor_ascii(libusb_device_handle * dev, uint8_t desc_index, uint8_t *data, int length);
    +int	libusb_get_string_descriptor_ascii(libusb_device_handle * devh, uint8_t desc_index, uint8_t *data, int length);
    +int	libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, uint8_t desc_index, uint8_t *data, int length);
     
     /* Asynchronous device I/O */
     
    @@ -341,7 +337,16 @@ struct libusb_transfer *libusb_alloc_transfer(int iso_packets);
     void	libusb_free_transfer(struct libusb_transfer *transfer);
     int	libusb_submit_transfer(struct libusb_transfer *transfer);
     int	libusb_cancel_transfer(struct libusb_transfer *transfer);
    -uint8_t *libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, unsigned int packet);
    +uint8_t *libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index);
    +uint8_t *libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index);
    +void	libusb_set_iso_packet_lengths(struct libusb_transfer *transfer, uint32_t length);
    +uint8_t *libusb_control_transfer_get_data(struct libusb_transfer *transfer);
    +struct libusb_control_setup *libusb_control_transfer_get_setup(struct libusb_transfer *transfer);
    +void	libusb_fill_control_setup(uint8_t *buf, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength);
    +void	libusb_fill_control_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t *buf, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
    +void	libusb_fill_bulk_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
    +void	libusb_fill_interrupt_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
    +void	libusb_fill_iso_transfer(struct libusb_transfer *transfer, libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, int length, int npacket, libusb_transfer_cb_fn callback, void *user_data, uint32_t timeout);
     
     /* Polling and timing */
     
    @@ -362,9 +367,14 @@ struct libusb_pollfd **libusb_get_pollfds(libusb_context * ctx);
     
     /* Synchronous device I/O */
     
    -int	libusb_control_transfer(libusb_device_handle * devh, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength, unsigned int timeout);
    -int	libusb_bulk_transfer(libusb_device_handle *devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, unsigned int timeout);
    -int	libusb_interrupt_transfer(libusb_device_handle *devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, unsigned int timeout);
    +int	libusb_control_transfer(libusb_device_handle * devh, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t wLength, uint32_t timeout);
    +int	libusb_bulk_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
    +int	libusb_interrupt_transfer(libusb_device_handle * devh, uint8_t endpoint, uint8_t *data, int length, int *transferred, uint32_t timeout);
    +
    +/* Byte-order */
    +
    +uint16_t libusb_cpu_to_le16(uint16_t x);
    +uint16_t libusb_le16_to_cpu(uint16_t x);
     
     #if 0
     {					/* indent fix */
    diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
    index fa9130d7e53f..9f14eaadfacd 100644
    --- a/lib/libusb/libusb10.c
    +++ b/lib/libusb/libusb10.c
    @@ -25,16 +25,17 @@
      * SUCH DAMAGE.
      */
     
    -#include 
    -#include 
    -#include 
    +#include 
    +#include 
    +#include 
    +
    +#include 
    +#include 
     #include 
     #include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    +#include 
    +#include 
    +#include 
     
     #include "libusb20.h"
     #include "libusb20_desc.h"
    @@ -72,6 +73,7 @@ libusb_init(libusb_context **context)
     {
     	struct libusb_context *ctx;
     	char *debug;
    +	int flag;
     	int ret;
     
     	ctx = malloc(sizeof(*ctx));
    @@ -102,10 +104,12 @@ libusb_init(libusb_context **context)
     		return (LIBUSB_ERROR_OTHER);
     	}
     	/* set non-blocking mode on the control pipe to avoid deadlock */
    -	ret = 1;
    -	ioctl(ctx->ctrl_pipe[0], FIONBIO, &ret);
    -	ret = 1;
    -	ioctl(ctx->ctrl_pipe[1], FIONBIO, &ret);
    +	flag = 1;
    +	ret = fcntl(ctx->ctrl_pipe[0], O_NONBLOCK, &flag);
    +	assert(ret != -1 && "Couldn't set O_NONBLOCK for ctx->ctrl_pipe[0]");
    +	flag = 1;
    +	ret = fcntl(ctx->ctrl_pipe[1], O_NONBLOCK, &flag);
    +	assert(ret != -1 && "Couldn't set O_NONBLOCK for ctx->ctrl_pipe[1]");
     
     	libusb10_add_pollfd(ctx, &ctx->ctx_poll, NULL, ctx->ctrl_pipe[0], POLLIN);
     
    @@ -185,8 +189,6 @@ libusb_get_device_list(libusb_context *ctx, libusb_device ***list)
     	/* create libusb v1.0 compliant devices */
     	i = 0;
     	while ((pdev = libusb20_be_device_foreach(usb_backend, NULL))) {
    -		/* get device into libUSB v1.0 list */
    -		libusb20_be_dequeue_device(usb_backend, pdev);
     
     		dev = malloc(sizeof(*dev));
     		if (dev == NULL) {
    @@ -199,6 +201,10 @@ libusb_get_device_list(libusb_context *ctx, libusb_device ***list)
     			libusb20_be_free(usb_backend);
     			return (LIBUSB_ERROR_NO_MEM);
     		}
    +
    +		/* get device into libUSB v1.0 list */
    +		libusb20_be_dequeue_device(usb_backend, pdev);
    +
     		memset(dev, 0, sizeof(*dev));
     
     		/* init transfer queues */
    @@ -376,8 +382,6 @@ libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id,
     	if ((i = libusb_get_device_list(ctx, &devs)) < 0)
     		return (NULL);
     
    -	pdev = NULL;
    -
     	for (j = 0; j < i; j++) {
     		pdev = devs[j]->os_priv;
     		pdesc = libusb20_dev_get_device_desc(pdev);
    @@ -393,6 +397,8 @@ libusb_open_device_with_vid_pid(libusb_context *ctx, uint16_t vendor_id,
     			break;
     		}
     	}
    +	if (j == i)
    +		pdev = NULL;
     
     	libusb_free_device_list(devs, 1);
     	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open_device_width_vid_pid leave");
    @@ -416,6 +422,8 @@ libusb_close(struct libusb20_device *pdev)
     	libusb10_remove_pollfd(ctx, &dev->dev_poll);
     
     	libusb20_dev_close(pdev);
    +
    +	/* unref will free the "pdev" when the refcount reaches zero */
     	libusb_unref_device(dev);
     
     	/* make sure our event loop detects the closed device */
    @@ -828,8 +836,12 @@ libusb10_complete_transfer(struct libusb20_transfer *pxfer,
     	if (pxfer != NULL)
     		libusb20_tr_set_priv_sc1(pxfer, NULL);
     
    +	/* set transfer status */
     	uxfer->status = status;
     
    +	/* update super transfer state */
    +	sxfer->state = LIBUSB_SUPER_XFER_ST_NONE;
    +
     	dev = libusb_get_device(uxfer->dev_handle);
     
     	TAILQ_INSERT_TAIL(&dev->ctx->tr_done, sxfer, entry);
    @@ -1106,6 +1118,8 @@ libusb10_submit_transfer_sub(struct libusb20_device *pdev, uint8_t endpoint)
     		return;
     	case 2:
     		sxfer = libusb20_tr_get_priv_sc1(pxfer1);
    +		if (sxfer == NULL)
    +			return;		/* cancelling */
     		if (sxfer->rem_len)
     			return;		/* cannot queue another one */
     		/* swap transfers */
    @@ -1113,6 +1127,8 @@ libusb10_submit_transfer_sub(struct libusb20_device *pdev, uint8_t endpoint)
     		break;
     	case 1:
     		sxfer = libusb20_tr_get_priv_sc1(pxfer0);
    +		if (sxfer == NULL)
    +			return;		/* cancelling */
     		if (sxfer->rem_len)
     			return;		/* cannot queue another one */
     		/* swap transfers */
    @@ -1195,7 +1211,7 @@ libusb_submit_transfer(struct libusb_transfer *uxfer)
     	struct libusb20_transfer *pxfer1;
     	struct libusb_super_transfer *sxfer;
     	struct libusb_device *dev;
    -	unsigned int endpoint;
    +	uint32_t endpoint;
     	int err;
     
     	if (uxfer == NULL)
    @@ -1224,12 +1240,18 @@ libusb_submit_transfer(struct libusb_transfer *uxfer)
     	if (pxfer0 == NULL || pxfer1 == NULL) {
     		err = LIBUSB_ERROR_OTHER;
     	} else if ((sxfer->entry.tqe_prev != NULL) ||
    -		    (libusb20_tr_get_priv_sc1(pxfer0) == sxfer) ||
    +	    (libusb20_tr_get_priv_sc1(pxfer0) == sxfer) ||
     	    (libusb20_tr_get_priv_sc1(pxfer1) == sxfer)) {
     		err = LIBUSB_ERROR_BUSY;
     	} else {
    +
    +		/* set pending state */
    +		sxfer->state = LIBUSB_SUPER_XFER_ST_PEND;
    +
    +		/* insert transfer into transfer head list */
     		TAILQ_INSERT_TAIL(&dev->tr_head, sxfer, entry);
     
    +		/* start work transfers */
     		libusb10_submit_transfer_sub(
     		    uxfer->dev_handle, endpoint);
     
    @@ -1252,13 +1274,15 @@ libusb_cancel_transfer(struct libusb_transfer *uxfer)
     	struct libusb20_transfer *pxfer1;
     	struct libusb_super_transfer *sxfer;
     	struct libusb_device *dev;
    -	unsigned int endpoint;
    +	uint32_t endpoint;
    +	int retval;
     
     	if (uxfer == NULL)
     		return (LIBUSB_ERROR_INVALID_PARAM);
     
    +	/* check if not initialised */
     	if (uxfer->dev_handle == NULL)
    -		return (LIBUSB_ERROR_INVALID_PARAM);
    +		return (LIBUSB_ERROR_NOT_FOUND);
     
     	endpoint = uxfer->endpoint;
     
    @@ -1272,39 +1296,50 @@ libusb_cancel_transfer(struct libusb_transfer *uxfer)
     	sxfer = (struct libusb_super_transfer *)(
     	    (uint8_t *)uxfer - sizeof(*sxfer));
     
    +	retval = 0;
    +
     	CTX_LOCK(dev->ctx);
     
     	pxfer0 = libusb10_get_transfer(uxfer->dev_handle, endpoint, 0);
     	pxfer1 = libusb10_get_transfer(uxfer->dev_handle, endpoint, 1);
     
    -	if (sxfer->entry.tqe_prev != NULL) {
    +	if (sxfer->state != LIBUSB_SUPER_XFER_ST_PEND) {
    +		/* only update the transfer status */
    +		uxfer->status = LIBUSB_TRANSFER_CANCELLED;
    +		retval = LIBUSB_ERROR_NOT_FOUND;
    +	} else if (sxfer->entry.tqe_prev != NULL) {
     		/* we are lucky - transfer is on a queue */
     		TAILQ_REMOVE(&dev->tr_head, sxfer, entry);
     		sxfer->entry.tqe_prev = NULL;
    -		libusb10_complete_transfer(NULL, sxfer, LIBUSB_TRANSFER_CANCELLED);
    +		libusb10_complete_transfer(NULL,
    +		    sxfer, LIBUSB_TRANSFER_CANCELLED);
     	} else if (pxfer0 == NULL || pxfer1 == NULL) {
     		/* not started */
    +		retval = LIBUSB_ERROR_NOT_FOUND;
     	} else if (libusb20_tr_get_priv_sc1(pxfer0) == sxfer) {
    -		libusb10_complete_transfer(pxfer0, sxfer, LIBUSB_TRANSFER_CANCELLED);
    +		libusb10_complete_transfer(pxfer0,
    +		    sxfer, LIBUSB_TRANSFER_CANCELLED);
     		libusb20_tr_stop(pxfer0);
     		/* make sure the queue doesn't stall */
     		libusb10_submit_transfer_sub(
     		    uxfer->dev_handle, endpoint);
     	} else if (libusb20_tr_get_priv_sc1(pxfer1) == sxfer) {
    -		libusb10_complete_transfer(pxfer1, sxfer, LIBUSB_TRANSFER_CANCELLED);
    +		libusb10_complete_transfer(pxfer1,
    +		    sxfer, LIBUSB_TRANSFER_CANCELLED);
     		libusb20_tr_stop(pxfer1);
     		/* make sure the queue doesn't stall */
     		libusb10_submit_transfer_sub(
     		    uxfer->dev_handle, endpoint);
     	} else {
     		/* not started */
    +		retval = LIBUSB_ERROR_NOT_FOUND;
     	}
     
     	CTX_UNLOCK(dev->ctx);
     
     	DPRINTF(dev->ctx, LIBUSB_DEBUG_FUNCTION, "libusb_cancel_transfer leave");
     
    -	return (0);
    +	return (retval);
     }
     
     UNEXPORTED void
    @@ -1312,3 +1347,16 @@ libusb10_cancel_all_transfer(libusb_device *dev)
     {
     	/* TODO */
     }
    +
    +uint16_t
    +libusb_cpu_to_le16(uint16_t x)
    +{
    +	return (htole16(x));
    +}
    +
    +uint16_t
    +libusb_le16_to_cpu(uint16_t x)
    +{
    +	return (le16toh(x));
    +}
    +
    diff --git a/lib/libusb/libusb10.h b/lib/libusb/libusb10.h
    index 338c2aab8885..d2a2bd7c150b 100644
    --- a/lib/libusb/libusb10.h
    +++ b/lib/libusb/libusb10.h
    @@ -65,7 +65,9 @@ struct libusb_super_transfer {
     	uint8_t *curr_data;
     	uint32_t rem_len;
     	uint32_t last_len;
    -	uint8_t	flags;
    +	uint8_t	state;
    +#define	LIBUSB_SUPER_XFER_ST_NONE 0
    +#define	LIBUSB_SUPER_XFER_ST_PEND 1
     };
     
     struct libusb_context {
    diff --git a/lib/libusb/libusb10_desc.c b/lib/libusb/libusb10_desc.c
    index c43443af939b..2e9bc203c5d7 100644
    --- a/lib/libusb/libusb10_desc.c
    +++ b/lib/libusb/libusb10_desc.c
    @@ -24,17 +24,19 @@
      * SUCH DAMAGE.
      */
     
    -#include 
    -#include 
    -#include 
     #include 
     
    +#include 
    +#include 
    +
     #include "libusb20.h"
     #include "libusb20_desc.h"
     #include "libusb20_int.h"
     #include "libusb.h"
     #include "libusb10.h"
     
    +#define	N_ALIGN(n) (-((-(n)) & (-8UL)))
    +
     /* USB descriptors */
     
     int
    @@ -114,17 +116,17 @@ libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index,
     
     	nalt = nif = pconf->num_interface;
     	nep = 0;
    -	nextra = pconf->extra.len;
    +	nextra = N_ALIGN(pconf->extra.len);
     
     	for (i = 0; i < nif; i++) {
     
     		pinf = pconf->interface + i;
    -		nextra += pinf->extra.len;
    +		nextra += N_ALIGN(pinf->extra.len);
     		nep += pinf->num_endpoints;
     		k = pinf->num_endpoints;
     		pend = pinf->endpoints;
     		while (k--) {
    -			nextra += pend->extra.len;
    +			nextra += N_ALIGN(pend->extra.len);
     			pend++;
     		}
     
    @@ -132,12 +134,12 @@ libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index,
     		nalt += pinf->num_altsetting;
     		pinf = pinf->altsetting;
     		while (j--) {
    -			nextra += pinf->extra.len;
    +			nextra += N_ALIGN(pinf->extra.len);
     			nep += pinf->num_endpoints;
     			k = pinf->num_endpoints;
     			pend = pinf->endpoints;
     			while (k--) {
    -				nextra += pend->extra.len;
    +				nextra += N_ALIGN(pend->extra.len);
     				pend++;
     			}
     			pinf++;
    @@ -150,17 +152,18 @@ libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index,
     	    (nalt * sizeof(libusb_interface_descriptor)) +
     	    (nep * sizeof(libusb_endpoint_descriptor));
     
    +	nextra = N_ALIGN(nextra);
    +
     	pconfd = malloc(nextra);
     
     	if (pconfd == NULL) {
     		free(pconf);
     		return (LIBUSB_ERROR_NO_MEM);
     	}
    -	/* make sure memory is clean */
    +	/* make sure memory is initialised */
     	memset(pconfd, 0, nextra);
     
    -	pconfd->interface = (libusb_interface *) (pconfd +
    -	    sizeof(libusb_config_descriptor));
    +	pconfd->interface = (libusb_interface *) (pconfd + 1);
     
     	ifd = (libusb_interface_descriptor *) (pconfd->interface + nif);
     	endd = (libusb_endpoint_descriptor *) (ifd + nalt);
    @@ -181,7 +184,7 @@ libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index,
     		pconfd->extra_length = pconf->extra.len;
     		pconfd->extra = pextra;
     		memcpy(pextra, pconf->extra.ptr, pconfd->extra_length);
    -		pextra += pconfd->extra_length;
    +		pextra += N_ALIGN(pconfd->extra_length);
     	}
     	/* setup all interface and endpoint pointers */
     
    @@ -221,7 +224,7 @@ libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index,
     				ifd->extra_length = pinf->extra.len;
     				ifd->extra = pextra;
     				memcpy(pextra, pinf->extra.ptr, pinf->extra.len);
    -				pextra += pinf->extra.len;
    +				pextra += N_ALIGN(pinf->extra.len);
     			}
     			for (k = 0; k < pinf->num_endpoints; k++) {
     				pend = &pinf->endpoints[k];
    @@ -238,7 +241,7 @@ libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index,
     					endd->extra_length = pend->extra.len;
     					endd->extra = pextra;
     					memcpy(pextra, pend->extra.ptr, pend->extra.len);
    -					pextra += pend->extra.len;
    +					pextra += N_ALIGN(pend->extra.len);
     				}
     			}
     		}
    @@ -304,3 +307,12 @@ libusb_get_string_descriptor_ascii(libusb_device_handle *pdev,
     
     	return (LIBUSB_ERROR_OTHER);
     }
    +
    +int
    +libusb_get_descriptor(libusb_device_handle * devh, uint8_t desc_type, 
    +    uint8_t desc_index, uint8_t *data, int length)
    +{
    +	return (libusb_control_transfer(devh, LIBUSB_ENDPOINT_IN,
    +	    LIBUSB_REQUEST_GET_DESCRIPTOR, (desc_type << 8) | desc_index, 0, data,
    +	    length, 1000));
    +}
    diff --git a/lib/libusb/libusb10_io.c b/lib/libusb/libusb10_io.c
    index a5bb85fc5285..47a1b6833e8e 100644
    --- a/lib/libusb/libusb10_io.c
    +++ b/lib/libusb/libusb10_io.c
    @@ -24,14 +24,15 @@
      * SUCH DAMAGE.
      */
     
    -#include 
    -#include 
    -#include 
    +#include 
    +
    +#include 
     #include 
     #include 
    +#include 
    +#include 
     #include 
    -#include 
    -#include 
    +#include 
     
     #include "libusb20.h"
     #include "libusb20_desc.h"
    @@ -148,19 +149,19 @@ libusb10_handle_events_sub(struct libusb_context *ctx, struct timeval *tv)
     		goto do_done;
     	}
     	for (i = 0; i != nfds; i++) {
    -		if (fds[i].revents == 0)
    -			continue;
     		if (ppdev[i] != NULL) {
     			dev = libusb_get_device(ppdev[i]);
     
    -			err = libusb20_dev_process(ppdev[i]);
    +			if (fds[i].revents == 0)
    +				err = 0;	/* nothing to do */
    +			else
    +				err = libusb20_dev_process(ppdev[i]);
    +
     			if (err) {
     				/* cancel all transfers - device is gone */
     				libusb10_cancel_all_transfer(dev);
    -				/*
    -				 * make sure we don't go into an infinite
    -				 * loop
    -				 */
    +
    +				/* remove USB device from polling loop */
     				libusb10_remove_pollfd(dev->ctx, &dev->dev_poll);
     			}
     			CTX_UNLOCK(ctx);
    @@ -573,3 +574,160 @@ libusb_interrupt_transfer(libusb_device_handle *devh,
     	DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_interrupt_transfer leave");
     	return (ret);
     }
    +
    +uint8_t *
    +libusb_get_iso_packet_buffer(struct libusb_transfer *transfer, uint32_t index)
    +{
    +	uint8_t *ptr;
    +	uint32_t n;
    +
    +	if (transfer->num_iso_packets < 0)
    +		return (NULL);
    +
    +	if (index >= (uint32_t)transfer->num_iso_packets)
    +		return (NULL);
    +
    +	ptr = transfer->buffer;
    +	if (ptr == NULL)
    +		return (NULL);
    +
    +	for (n = 0; n != index; n++) {
    +		ptr += transfer->iso_packet_desc[n].length;
    +	}
    +	return (ptr);
    +}
    +
    +uint8_t *
    +libusb_get_iso_packet_buffer_simple(struct libusb_transfer *transfer, uint32_t index)
    +{
    +	uint8_t *ptr;
    +
    +	if (transfer->num_iso_packets < 0)
    +		return (NULL);
    +
    +	if (index >= (uint32_t)transfer->num_iso_packets)
    +		return (NULL);
    +
    +	ptr = transfer->buffer;
    +	if (ptr == NULL)
    +		return (NULL);
    +
    +	ptr += transfer->iso_packet_desc[0].length * index;
    +
    +	return (ptr);
    +}
    +
    +void
    +libusb_set_iso_packet_lengths(struct libusb_transfer *transfer, uint32_t length)
    +{
    +	int n;
    +
    +	if (transfer->num_iso_packets < 0)
    +		return;
    +
    +	for (n = 0; n != transfer->num_iso_packets; n++)
    +		transfer->iso_packet_desc[n].length = length;
    +}
    +
    +uint8_t *
    +libusb_control_transfer_get_data(struct libusb_transfer *transfer)
    +{
    +	if (transfer->buffer == NULL)
    +		return (NULL);
    +
    +	return (transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE);
    +}
    +
    +struct libusb_control_setup *
    +libusb_control_transfer_get_setup(struct libusb_transfer *transfer)
    +{
    +	return ((struct libusb_control_setup *)transfer->buffer);
    +}
    +
    +void
    +libusb_fill_control_setup(uint8_t *buf, uint8_t bmRequestType,
    +    uint8_t bRequest, uint16_t wValue,
    +    uint16_t wIndex, uint16_t wLength)
    +{
    +	struct libusb_control_setup *req = (struct libusb_control_setup *)buf;
    +
    +	/* The alignment is OK for all fields below. */
    +	req->bmRequestType = bmRequestType;
    +	req->bRequest = bRequest;
    +	req->wValue = htole16(wValue);
    +	req->wIndex = htole16(wIndex);
    +	req->wLength = htole16(wLength);
    +}
    +
    +void
    +libusb_fill_control_transfer(struct libusb_transfer *transfer, 
    +    libusb_device_handle *devh, uint8_t *buf,
    +    libusb_transfer_cb_fn callback, void *user_data,
    +    uint32_t timeout)
    +{
    +	struct libusb_control_setup *setup = (struct libusb_control_setup *)buf;
    +
    +	transfer->dev_handle = devh;
    +	transfer->endpoint = 0;
    +	transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL;
    +	transfer->timeout = timeout;
    +	transfer->buffer = buf;
    +	if (setup != NULL)
    +		transfer->length = LIBUSB_CONTROL_SETUP_SIZE
    +			+ le16toh(setup->wLength);
    +	else
    +		transfer->length = 0;
    +	transfer->user_data = user_data;
    +	transfer->callback = callback;
    +
    +}
    +
    +void
    +libusb_fill_bulk_transfer(struct libusb_transfer *transfer, 
    +    libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf, 
    +    int length, libusb_transfer_cb_fn callback, void *user_data,
    +    uint32_t timeout)
    +{
    +	transfer->dev_handle = devh;
    +	transfer->endpoint = endpoint;
    +	transfer->type = LIBUSB_TRANSFER_TYPE_BULK;
    +	transfer->timeout = timeout;
    +	transfer->buffer = buf;
    +	transfer->length = length;
    +	transfer->user_data = user_data;
    +	transfer->callback = callback;
    +}
    +
    +void
    +libusb_fill_interrupt_transfer(struct libusb_transfer *transfer,
    +    libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf,
    +    int length, libusb_transfer_cb_fn callback, void *user_data,
    +    uint32_t timeout)
    +{
    +	transfer->dev_handle = devh;
    +	transfer->endpoint = endpoint;
    +	transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT;
    +	transfer->timeout = timeout;
    +	transfer->buffer = buf;
    +	transfer->length = length;
    +	transfer->user_data = user_data;
    +	transfer->callback = callback;
    +}
    +
    +void
    +libusb_fill_iso_transfer(struct libusb_transfer *transfer, 
    +    libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf,
    +    int length, int npacket, libusb_transfer_cb_fn callback,
    +    void *user_data, uint32_t timeout)
    +{
    +	transfer->dev_handle = devh;
    +	transfer->endpoint = endpoint;
    +	transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS;
    +	transfer->timeout = timeout;
    +	transfer->buffer = buf;
    +	transfer->length = length;
    +	transfer->num_iso_packets = npacket;
    +	transfer->user_data = user_data;
    +	transfer->callback = callback;
    +}
    +
    diff --git a/lib/libusb/libusb20.3 b/lib/libusb/libusb20.3
    index f902883107bd..7896e8f01094 100644
    --- a/lib/libusb/libusb20.3
    +++ b/lib/libusb/libusb20.3
    @@ -26,7 +26,7 @@
     .\"
     .\" $FreeBSD$
     .\"
    -.Dd June 22, 2009
    +.Dd November 18, 2009
     .Dt LIBUSB20 3
     .Os
     .Sh NAME
    @@ -98,6 +98,8 @@ USB access library (libusb -lusb)
     .Fn libusb20_tr_setup_intr "struct libusb20_transfer *xfer" "void *pbuf" "uint32_t length" "uint32_t timeout"
     .Ft void
     .Fn libusb20_tr_setup_isoc "struct libusb20_transfer *xfer" "void *pbuf" "uint32_t length" "uint61_t fr_index"
    +.Ft uint8_t
    +.Fn libusb20_tr_bulk_intr_sync "struct libusb20_transfer *xfer" "void *pbuf" "uint32_t length" "uint32_t *pactlen" "uint32_t timeout"
     .Ft void
     .Fn libusb20_tr_start "struct libusb20_transfer *xfer"
     .Ft void
    @@ -141,6 +143,8 @@ USB access library (libusb -lusb)
     .Ft int
     .Fn libusb20_dev_reset "struct libusb20_device *pdev"
     .Ft int
    +.Fn libusb20_dev_check_connected "struct libusb20_device *pdev"
    +.Ft int
     .Fn libusb20_dev_set_power_mode "struct libusb20_device *pdev" "uint8_t power_mode"
     .Ft uint8_t
     .Fn libusb20_dev_get_power_mode "struct libusb20_device *pdev"
    @@ -451,6 +455,29 @@ is a helper function for setting up a multi frame USB ISOCHRONOUS transfer.
     .
     .Pp
     .
    +.Fn libusb20_tr_bulk_intr_sync
    +will perform a synchronous BULK or INTERRUPT transfer having length given by the
    +.Fa length
    +argument and buffer pointer given by the
    +.Fa pbuf
    +argument on the USB transfer given by the
    +.Fa xfer
    +argument.
    +.
    +If the
    +.Fa pactlen
    +argument is non-NULL the actual transfer length will be stored at the given pointer destination.
    +.
    +If the
    +.Fa timeout
    +argument is non-zero the transfer will timeout after the given value in milliseconds.
    +.
    +This function does not change the transfer flags, like short packet not ok.
    +.
    +This function returns zero on success else a LIBUSB20_TRANSFER_XXX value is returned.
    +.
    +.Pp
    +.
     .Fn libusb20_tr_start
     will get the USB transfer started, if not already
     started.
    @@ -652,6 +679,15 @@ the last set USB configuration.
     This function returns zero on success else a LIBUSB20_ERROR value is
     returned.
     .
    +.
    +.Pp
    +.
    +.Fn libusb20_dev_check_connected
    +will check if an opened USB device is still connected.
    +.
    +This function returns zero if the device is still connected else a LIBUSB20_ERROR value is returned.
    +.
    +.
     .Pp
     .
     .Fn libusb20_dev_set_power_mode
    diff --git a/lib/libusb/libusb20.c b/lib/libusb/libusb20.c
    index 6e0ec476f3d3..3efa9c704841 100644
    --- a/lib/libusb/libusb20.c
    +++ b/lib/libusb/libusb20.c
    @@ -1,6 +1,6 @@
     /* $FreeBSD$ */
     /*-
    - * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
    + * Copyright (c) 2008-2009 Hans Petter Selasky. All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
      * modification, are permitted provided that the following conditions
    @@ -24,12 +24,13 @@
      * SUCH DAMAGE.
      */
     
    +#include 
    +
    +#include 
    +#include 
     #include 
     #include 
     #include 
    -#include 
    -#include 
    -#include 
     
     #include "libusb20.h"
     #include "libusb20_desc.h"
    @@ -67,6 +68,7 @@ dummy_callback(struct libusb20_transfer *xfer)
     #define	dummy_set_config_index (void *)dummy_int
     #define	dummy_set_alt_index (void *)dummy_int
     #define	dummy_reset_device (void *)dummy_int
    +#define	dummy_check_connected (void *)dummy_int
     #define	dummy_set_power_mode (void *)dummy_int
     #define	dummy_get_power_mode (void *)dummy_int
     #define	dummy_kernel_driver_active (void *)dummy_int
    @@ -130,8 +132,19 @@ libusb20_tr_close(struct libusb20_transfer *xfer)
     	if (xfer->ppBuffer) {
     		free(xfer->ppBuffer);
     	}
    -	/* clear some fields */
    +	/* reset variable fields in case the transfer is opened again */
    +	xfer->priv_sc0 = 0;
    +	xfer->priv_sc1 = 0;
     	xfer->is_opened = 0;
    +	xfer->is_pending = 0;
    +	xfer->is_cancel = 0;
    +	xfer->is_draining = 0;
    +	xfer->is_restart = 0;
    +	xfer->status = 0;
    +	xfer->flags = 0;
    +	xfer->nFrames = 0;
    +	xfer->aFrames = 0;
    +	xfer->timeout = 0;
     	xfer->maxFrames = 0;
     	xfer->maxTotalLength = 0;
     	xfer->maxPacketLen = 0;
    @@ -263,6 +276,10 @@ libusb20_tr_get_priv_sc1(struct libusb20_transfer *xfer)
     void
     libusb20_tr_stop(struct libusb20_transfer *xfer)
     {
    +	if (!xfer->is_opened) {
    +		/* transfer is not opened */
    +		return;
    +	}
     	if (!xfer->is_pending) {
     		/* transfer not pending */
     		return;
    @@ -280,6 +297,10 @@ libusb20_tr_stop(struct libusb20_transfer *xfer)
     void
     libusb20_tr_drain(struct libusb20_transfer *xfer)
     {
    +	if (!xfer->is_opened) {
    +		/* transfer is not opened */
    +		return;
    +	}
     	/* make sure that we are cancelling */
     	libusb20_tr_stop(xfer);
     
    @@ -415,9 +436,79 @@ libusb20_tr_setup_isoc(struct libusb20_transfer *xfer, void *pBuf, uint32_t leng
     	return;
     }
     
    +uint8_t
    +libusb20_tr_bulk_intr_sync(struct libusb20_transfer *xfer,
    +    void *pbuf, uint32_t length, uint32_t *pactlen,
    +    uint32_t timeout)
    +{
    +	struct libusb20_device *pdev = xfer->pdev;
    +	uint32_t transfer_max;
    +	uint32_t transfer_act;
    +	uint8_t retval;
    +
    +	/* set some sensible default value */
    +	if (pactlen != NULL)
    +		*pactlen = 0;
    +
    +	/* check for error condition */
    +	if (libusb20_tr_pending(xfer))
    +		return (LIBUSB20_ERROR_OTHER);
    +
    +	do {
    +		/* compute maximum transfer length */
    +		transfer_max = 
    +		    libusb20_tr_get_max_total_length(xfer);
    +
    +		if (transfer_max > length)
    +			transfer_max = length;
    +
    +		/* setup bulk or interrupt transfer */
    +		libusb20_tr_setup_bulk(xfer, pbuf, 
    +		    transfer_max, timeout);
    +
    +		/* start the transfer */
    +		libusb20_tr_start(xfer);
    +
    +		/* wait for transfer completion */
    +		while (libusb20_dev_process(pdev) == 0) {
    +
    +			if (libusb20_tr_pending(xfer) == 0)
    +				break;
    +
    +			libusb20_dev_wait_process(pdev, -1);
    +		}
    +
    +		transfer_act = libusb20_tr_get_actual_length(xfer);
    +
    +		/* update actual length, if any */
    +		if (pactlen != NULL)
    +			pactlen[0] += transfer_act;
    +
    +		/* check transfer status */
    +		retval = libusb20_tr_get_status(xfer);
    +		if (retval)
    +			break;
    +
    +		/* check for short transfer */
    +		if (transfer_act != transfer_max)
    +			break;
    +
    +		/* update buffer pointer and length */
    +		pbuf = ((uint8_t *)pbuf) + transfer_max;
    +		length = length - transfer_max;
    +
    +	} while (length != 0);
    +
    +	return (retval);
    +}
    +
     void
     libusb20_tr_submit(struct libusb20_transfer *xfer)
     {
    +	if (!xfer->is_opened) {
    +		/* transfer is not opened */
    +		return;
    +	}
     	if (xfer->is_pending) {
     		/* should not happen */
     		return;
    @@ -433,6 +524,10 @@ libusb20_tr_submit(struct libusb20_transfer *xfer)
     void
     libusb20_tr_start(struct libusb20_transfer *xfer)
     {
    +	if (!xfer->is_opened) {
    +		/* transfer is not opened */
    +		return;
    +	}
     	if (xfer->is_pending) {
     		if (xfer->is_cancel) {
     			/* cancelling - restart */
    @@ -461,7 +556,14 @@ libusb20_dev_close(struct libusb20_device *pdev)
     	for (x = 0; x != pdev->nTransfer; x++) {
     		xfer = pdev->pTransfer + x;
     
    +		if (!xfer->is_opened) {
    +			/* transfer is not opened */
    +			continue;
    +		}
    +
     		libusb20_tr_drain(xfer);
    +
    +		libusb20_tr_close(xfer);
     	}
     
     	if (pdev->pTransfer != NULL) {
    @@ -572,6 +674,15 @@ libusb20_dev_reset(struct libusb20_device *pdev)
     	return (error);
     }
     
    +int
    +libusb20_dev_check_connected(struct libusb20_device *pdev)
    +{
    +	int error;
    +
    +	error = pdev->methods->check_connected(pdev);
    +	return (error);
    +}
    +
     int
     libusb20_dev_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode)
     {
    @@ -630,6 +741,9 @@ libusb20_dev_req_string_sync(struct libusb20_device *pdev,
     	struct LIBUSB20_CONTROL_SETUP_DECODED req;
     	int error;
     
    +	/* make sure memory is initialised */
    +	memset(ptr, 0, len);
    +
     	if (len < 4) {
     		/* invalid length */
     		return (LIBUSB20_ERROR_INVALID_PARAM);
    @@ -1093,7 +1207,8 @@ libusb20_be_free(struct libusb20_backend *pbe)
     	if (pbe->methods->exit_backend) {
     		pbe->methods->exit_backend(pbe);
     	}
    -	return;
    +	/* free backend */
    +	free(pbe);
     }
     
     void
    @@ -1101,7 +1216,6 @@ libusb20_be_enqueue_device(struct libusb20_backend *pbe, struct libusb20_device
     {
     	pdev->beMethods = pbe->methods;	/* copy backend methods */
     	TAILQ_INSERT_TAIL(&(pbe->usb_devs), pdev, dev_entry);
    -	return;
     }
     
     void
    @@ -1109,5 +1223,4 @@ libusb20_be_dequeue_device(struct libusb20_backend *pbe,
         struct libusb20_device *pdev)
     {
     	TAILQ_REMOVE(&(pbe->usb_devs), pdev, dev_entry);
    -	return;
     }
    diff --git a/lib/libusb/libusb20.h b/lib/libusb/libusb20.h
    index 9f45861f7388..d16c6a628ea6 100644
    --- a/lib/libusb/libusb20.h
    +++ b/lib/libusb/libusb20.h
    @@ -1,6 +1,6 @@
     /* $FreeBSD$ */
     /*-
    - * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
    + * Copyright (c) 2008-2009 Hans Petter Selasky. All rights reserved.
      * Copyright (c) 2007-2008 Daniel Drake.  All rights reserved.
      * Copyright (c) 2001 Johannes Erdfelt.  All rights reserved.
      *
    @@ -29,13 +29,13 @@
     #ifndef _LIBUSB20_H_
     #define	_LIBUSB20_H_
     
    -#include 
    -#include 
    -#include 
    -
    +#include 
     #include 
     #include 
    -#include 
    +
    +#include 
    +#include 
    +#include 
     
     #ifdef __cplusplus
     extern	"C" {
    @@ -226,6 +226,7 @@ void	libusb20_tr_setup_bulk(struct libusb20_transfer *xfer, void *pbuf, uint32_t
     void	libusb20_tr_setup_control(struct libusb20_transfer *xfer, void *psetup, void *pbuf, uint32_t timeout);
     void	libusb20_tr_setup_intr(struct libusb20_transfer *xfer, void *pbuf, uint32_t length, uint32_t timeout);
     void	libusb20_tr_setup_isoc(struct libusb20_transfer *xfer, void *pbuf, uint32_t length, uint16_t fr_index);
    +uint8_t	libusb20_tr_bulk_intr_sync(struct libusb20_transfer *xfer, void *pbuf, uint32_t length, uint32_t *pactlen, uint32_t timeout);
     void	libusb20_tr_start(struct libusb20_transfer *xfer);
     void	libusb20_tr_stop(struct libusb20_transfer *xfer);
     void	libusb20_tr_submit(struct libusb20_transfer *xfer);
    @@ -249,6 +250,7 @@ int	libusb20_dev_request_sync(struct libusb20_device *pdev, struct LIBUSB20_CONT
     int	libusb20_dev_req_string_sync(struct libusb20_device *pdev, uint8_t index, uint16_t langid, void *ptr, uint16_t len);
     int	libusb20_dev_req_string_simple_sync(struct libusb20_device *pdev, uint8_t index, void *ptr, uint16_t len);
     int	libusb20_dev_reset(struct libusb20_device *pdev);
    +int	libusb20_dev_check_connected(struct libusb20_device *pdev);
     int	libusb20_dev_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode);
     uint8_t	libusb20_dev_get_power_mode(struct libusb20_device *pdev);
     int	libusb20_dev_set_alt_index(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index);
    diff --git a/lib/libusb/libusb20_compat01.c b/lib/libusb/libusb20_compat01.c
    index 48a7dd5677b4..b4f476b7a56c 100644
    --- a/lib/libusb/libusb20_compat01.c
    +++ b/lib/libusb/libusb20_compat01.c
    @@ -30,9 +30,9 @@
     
     #include 
     
    -#include 
    -#include 
     #include 
    +#include 
    +#include 
     
     #include "libusb20.h"
     #include "libusb20_desc.h"
    @@ -829,6 +829,7 @@ usb_find_devices(void)
     	struct libusb20_device *pdev;
     	struct usb_device *udev;
     	struct LIBUSB20_DEVICE_DESC_DECODED *ddesc;
    +	int devnum;
     	int err;
     
     	/* cleanup after last device search */
    @@ -855,6 +856,7 @@ usb_find_devices(void)
     	}
     	/* iterate all devices */
     
    +	devnum = 1;
     	pdev = NULL;
     	while ((pdev = libusb20_be_device_foreach(usb_backend, pdev))) {
     		udev = malloc(sizeof(*udev));
    @@ -891,6 +893,7 @@ usb_find_devices(void)
     			/* truncate number of configurations */
     			udev->descriptor.bNumConfigurations = USB_MAXCONFIG;
     		}
    +		udev->devnum = devnum++;
     		/* link together the two structures */
     		udev->dev = pdev;
     		pdev->privLuData = udev;
    diff --git a/lib/libusb/libusb20_desc.c b/lib/libusb/libusb20_desc.c
    index e0d2c54b9080..5ee61b272ad7 100644
    --- a/lib/libusb/libusb20_desc.c
    +++ b/lib/libusb/libusb20_desc.c
    @@ -24,11 +24,11 @@
      * SUCH DAMAGE.
      */
     
    +#include 
    +
     #include 
     #include 
     #include 
    -#include 
    -#include 
     
     #include "libusb20.h"
     #include "libusb20_desc.h"
    @@ -118,6 +118,9 @@ libusb20_parse_config_desc(const void *config_desc)
     	if (lub_config == NULL) {
     		return (NULL);		/* out of memory */
     	}
    +	/* make sure memory is initialised */
    +	memset(lub_config, 0, size);
    +
     	lub_interface = (void *)(lub_config + 1);
     	lub_alt_interface = (void *)(lub_interface + niface_no_alt);
     	lub_endpoint = (void *)(lub_interface + niface);
    diff --git a/lib/libusb/libusb20_int.h b/lib/libusb/libusb20_int.h
    index 004b0cf381d7..b0e0e2dd7f65 100644
    --- a/lib/libusb/libusb20_int.h
    +++ b/lib/libusb/libusb20_int.h
    @@ -101,6 +101,7 @@ typedef int (libusb20_set_power_mode_t)(struct libusb20_device *pdev, uint8_t po
     typedef int (libusb20_get_power_mode_t)(struct libusb20_device *pdev, uint8_t *power_mode);
     typedef int (libusb20_set_alt_index_t)(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index);
     typedef int (libusb20_set_config_index_t)(struct libusb20_device *pdev, uint8_t index);
    +typedef int (libusb20_check_connected_t)(struct libusb20_device *pdev);
     
     /* USB transfer specific */
     typedef int (libusb20_tr_open_t)(struct libusb20_transfer *xfer, uint32_t MaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no);
    @@ -117,6 +118,7 @@ typedef void (libusb20_tr_cancel_async_t)(struct libusb20_transfer *xfer);
       m(n, kernel_driver_active) \
       m(n, process) \
       m(n, reset_device) \
    +  m(n, check_connected) \
       m(n, set_power_mode) \
       m(n, get_power_mode) \
       m(n, set_alt_index) \
    diff --git a/lib/libusb/libusb20_ugen20.c b/lib/libusb/libusb20_ugen20.c
    index 0dee7935b7a0..73daa4099a69 100644
    --- a/lib/libusb/libusb20_ugen20.c
    +++ b/lib/libusb/libusb20_ugen20.c
    @@ -27,13 +27,12 @@
     #include 
     #include 
     
    +#include 
    +#include 
     #include 
     #include 
    -#include 
     #include 
    -#include 
    -#include 
    -#include 
    +#include 
     
     #include "libusb20.h"
     #include "libusb20_desc.h"
    @@ -67,6 +66,7 @@ static libusb20_get_config_index_t ugen20_get_config_index;
     static libusb20_set_config_index_t ugen20_set_config_index;
     static libusb20_set_alt_index_t ugen20_set_alt_index;
     static libusb20_reset_device_t ugen20_reset_device;
    +static libusb20_check_connected_t ugen20_check_connected;
     static libusb20_set_power_mode_t ugen20_set_power_mode;
     static libusb20_get_power_mode_t ugen20_get_power_mode;
     static libusb20_kernel_driver_active_t ugen20_kernel_driver_active;
    @@ -449,6 +449,8 @@ ugen20_get_config_desc_full(struct libusb20_device *pdev,
     	uint16_t len;
     	int error;
     
    +	/* make sure memory is initialised */
    +	memset(&cdesc, 0, sizeof(cdesc));
     	memset(&gen_desc, 0, sizeof(gen_desc));
     
     	gen_desc.ugd_data = &cdesc;
    @@ -468,6 +470,10 @@ ugen20_get_config_desc_full(struct libusb20_device *pdev,
     	if (!ptr) {
     		return (LIBUSB20_ERROR_NO_MEM);
     	}
    +
    +	/* make sure memory is initialised */
    +	memset(ptr, 0, len);
    +
     	gen_desc.ugd_data = ptr;
     	gen_desc.ugd_maxlen = len;
     
    @@ -546,6 +552,25 @@ ugen20_reset_device(struct libusb20_device *pdev)
     	return (ugen20_tr_renew(pdev));
     }
     
    +static int
    +ugen20_check_connected(struct libusb20_device *pdev)
    +{
    +	uint32_t plugtime;
    +	int error = 0;
    +
    +	if (ioctl(pdev->file_ctrl, USB_GET_PLUGTIME, &plugtime)) {
    +		error = LIBUSB20_ERROR_NO_DEVICE;
    +		goto done;
    +	}
    +
    +	if (pdev->session_data.plugtime != plugtime) {
    +		error = LIBUSB20_ERROR_NO_DEVICE;
    +		goto done;
    +	}
    +done:
    +	return (error);
    +}
    +
     static int
     ugen20_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode)
     {
    @@ -800,7 +825,11 @@ ugen20_tr_submit(struct libusb20_transfer *xfer)
     	if (xfer->flags & LIBUSB20_TRANSFER_DO_CLEAR_STALL) {
     		fsep->flags |= USB_FS_FLAG_CLEAR_STALL;
     	}
    -	fsep->timeout = xfer->timeout;
    +	/* NOTE: The "fsep->timeout" variable is 16-bit. */
    +	if (xfer->timeout > 65535)
    +		fsep->timeout = 65535;
    +	else
    +		fsep->timeout = xfer->timeout;
     
     	temp.ep_index = xfer->trIndex;
     
    diff --git a/lib/libusb/usb.h b/lib/libusb/usb.h
    index 3963a9f0355c..a29f48d47349 100644
    --- a/lib/libusb/usb.h
    +++ b/lib/libusb/usb.h
    @@ -27,10 +27,10 @@
     #ifndef _LIBUSB20_COMPAT_01_H_
     #define	_LIBUSB20_COMPAT_01_H_
     
    -#include 
    -#include 
    -#include 
     #include 
    +#include 
    +
    +#include 
     
     /* USB interface class codes */
     
    diff --git a/lib/libutil/Makefile b/lib/libutil/Makefile
    index 6b489d3b9d3c..9dc35c0f9efd 100644
    --- a/lib/libutil/Makefile
    +++ b/lib/libutil/Makefile
    @@ -6,18 +6,16 @@ SHLIBDIR?= /lib
     .include 
     
     LIB=	util
    -SHLIB_MAJOR= 8
    +SHLIB_MAJOR= 9
     
     SRCS=	_secure_path.c auth.c expand_number.c flopen.c fparseln.c gr_util.c \
     	hexdump.c humanize_number.c kinfo_getfile.c kinfo_getvmmap.c kld.c \
    -	login.c login_auth.c login_cap.c \
    +	login_auth.c login_cap.c \
     	login_class.c login_crypt.c login_ok.c login_times.c login_tty.c \
    -	logout.c logwtmp.c pidfile.c property.c pty.c pw_util.c quotafile.c \
    -	realhostname.c stub.c trimdomain.c uucplock.c
    +	pidfile.c property.c pty.c pw_util.c quotafile.c realhostname.c \
    +	stub.c trimdomain.c uucplock.c
     INCS=	libutil.h login_cap.h
     
    -WARNS?=	6
    -
     CFLAGS+= -DLIBC_SCCS
     
     .if ${MK_INET6_SUPPORT} != "no"
    @@ -26,7 +24,7 @@ CFLAGS+= -DINET6
     
     CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../libc/gen/
     
    -MAN+=	kld.3 login.3 login_auth.3 login_tty.3 logout.3 logwtmp.3 pty.3 \
    +MAN+=	kld.3 login_auth.3 login_tty.3 pty.3 \
     	login_cap.3 login_class.3 login_times.3 login_ok.3 \
     	_secure_path.3 uucplock.3 property.3 auth.3 realhostname.3 \
     	realhostname_sa.3 trimdomain.3 fparseln.3 humanize_number.3 \
    diff --git a/lib/libutil/gr_util.c b/lib/libutil/gr_util.c
    index 77e06531f705..633f435eea29 100644
    --- a/lib/libutil/gr_util.c
    +++ b/lib/libutil/gr_util.c
    @@ -117,8 +117,8 @@ gr_make(const struct group *gr)
     	/* Create the group line and fill it. */
     	if ((line = malloc(line_size)) == NULL)
     		return (NULL);
    -	line_size = snprintf(line, line_size, group_line_format, gr->gr_name,
    -	    gr->gr_passwd, (uintmax_t)gr->gr_gid);
    +	snprintf(line, line_size, group_line_format, gr->gr_name, gr->gr_passwd,
    +	    (uintmax_t)gr->gr_gid);
     	if (gr->gr_mem != NULL)
     		for (ndx = 0; gr->gr_mem[ndx] != NULL; ndx++) {
     			strcat(line, gr->gr_mem[ndx]);
    diff --git a/lib/libutil/libutil.h b/lib/libutil/libutil.h
    index 7a4dc5670bcb..5b7ffad0a447 100644
    --- a/lib/libutil/libutil.h
    +++ b/lib/libutil/libutil.h
    @@ -39,6 +39,34 @@
     #ifndef _LIBUTIL_H_
     #define	_LIBUTIL_H_
     
    +#include 
    +#include 
    +
    +#ifndef _GID_T_DECLARED
    +typedef	__gid_t		gid_t;
    +#define	_GID_T_DECLARED
    +#endif
    +
    +#ifndef _INT64_T_DECLARED
    +typedef	__int64_t	int64_t;
    +#define	_INT64_T_DECLARED
    +#endif
    +
    +#ifndef _PID_T_DECLARED
    +typedef	__pid_t		pid_t;
    +#define	_PID_T_DECLARED
    +#endif
    +
    +#ifndef _SIZE_T_DECLARED
    +typedef	__size_t	size_t;
    +#define	_SIZE_T_DECLARED
    +#endif
    +
    +#ifndef _UID_T_DECLARED
    +typedef	__uid_t		uid_t;
    +#define	_UID_T_DECLARED
    +#endif
    +
     #define PROPERTY_MAX_NAME	64
     #define PROPERTY_MAX_VALUE	512
     
    @@ -62,7 +90,6 @@ struct pidfh {
     /* Avoid pulling in all the include files for no need */
     struct termios;
     struct winsize;
    -struct utmp;
     struct in_addr;
     struct kinfo_file;
     struct kinfo_vmentry;
    @@ -74,10 +101,7 @@ int	extattr_namespace_to_string(int _attrnamespace, char **_string);
     int	extattr_string_to_namespace(const char *_string, int *_attrnamespace);
     int	flopen(const char *_path, int _flags, ...);
     void	hexdump(const void *ptr, int length, const char *hdr, int flags);
    -void	login(struct utmp *_ut);
     int	login_tty(int _fd);
    -int	logout(const char *_line);
    -void	logwtmp(const char *_line, const char *_name, const char *_host);
     void	trimdomain(char *_fullhost, int _hostsize);
     int	openpty(int *_amaster, int *_aslave, char *_name,
     		     struct termios *_termp, struct winsize *_winp);
    diff --git a/lib/libutil/login.3 b/lib/libutil/login.3
    deleted file mode 100644
    index d88f719485d2..000000000000
    --- a/lib/libutil/login.3
    +++ /dev/null
    @@ -1,67 +0,0 @@
    -.\"
    -.\" Copyright (c) 1996 Joerg Wunsch
    -.\"
    -.\" 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 DEVELOPERS ``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 DEVELOPERS 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$
    -.\" "
    -.Dd December 29, 1996
    -.Os
    -.Dt LOGIN 3
    -.Sh NAME
    -.Nm login
    -.Nd "log a new login record to the utmp and wtmp files"
    -.Sh LIBRARY
    -.Lb libutil
    -.Sh SYNOPSIS
    -.In sys/types.h
    -.In utmp.h
    -.In libutil.h
    -.Ft void
    -.Fn login "struct utmp *ut"
    -.Sh DESCRIPTION
    -The function
    -.Fn login
    -records the
    -.Ar ut
    -entry being passed into the appropriate slot of the
    -.Xr utmp 5
    -file,
    -and appends it to the
    -.Xr wtmp 5
    -file.
    -The calling process must have permission to write to both files.
    -.Sh RETURN VALUES
    -None.
    -.Sh SEE ALSO
    -.Xr logout 3 ,
    -.Xr ttyslot 3 ,
    -.Xr utmp 5 ,
    -.Xr wtmp 5
    -.Sh BUGS
    -The interface provided by
    -.Fn login
    -is rather crude.
    -The caller must know about the details of a
    -.Va struct utmp .
    -Some better abstraction needs to be worked out.
    diff --git a/lib/libutil/login_tty.c b/lib/libutil/login_tty.c
    index a14e244e45aa..92dc87fe710c 100644
    --- a/lib/libutil/login_tty.c
    +++ b/lib/libutil/login_tty.c
    @@ -50,7 +50,7 @@ login_tty(int fd)
     
     	s = setsid();
     	if (s == -1)
    -		return (-1);
    +		s = getsid(0);
     	if (tcsetsid(fd, s) == -1)
     		return (-1);
     	(void) dup2(fd, 0);
    diff --git a/lib/libutil/logout.3 b/lib/libutil/logout.3
    deleted file mode 100644
    index 426fe087040a..000000000000
    --- a/lib/libutil/logout.3
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -.\"
    -.\" Copyright (c) 1996 Joerg Wunsch
    -.\"
    -.\" 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 DEVELOPERS ``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 DEVELOPERS 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$
    -.\" "
    -.Dd December 29, 1996
    -.Os
    -.Dt LOGOUT 3
    -.Sh NAME
    -.Nm logout
    -.Nd remove an entry from the utmp file
    -.Sh LIBRARY
    -.Lb libutil
    -.Sh SYNOPSIS
    -.In sys/types.h
    -.In libutil.h
    -.Ft int
    -.Fn logout "const char *line"
    -.Sh DESCRIPTION
    -The function
    -.Fn logout
    -searches the
    -.Xr utmp 5
    -file for the slot described by
    -.Ar line
    -(usually a tty name).
    -If such a slot could be found, it will be updated
    -with a record where the
    -.Em name
    -and
    -.Em host
    -fields are empty, and the time stamp field is updated to the current time.
    -.Sh RETURN VALUES
    -The
    -.Fn logout
    -function returns 1 if the slot described by
    -.Ar line
    -has been found and updated, 0 otherwise.
    -.Sh SEE ALSO
    -.Xr login 3 ,
    -.Xr utmp 5 ,
    -.Xr wtmp 5
    -.Sh BUGS
    -The calling interface of
    -.Fn logout
    -is inconsistent with that of
    -.Xr login 3 .
    diff --git a/lib/libutil/logwtmp.3 b/lib/libutil/logwtmp.3
    deleted file mode 100644
    index 16903fbde79b..000000000000
    --- a/lib/libutil/logwtmp.3
    +++ /dev/null
    @@ -1,71 +0,0 @@
    -.\"
    -.\" Copyright (c) 1996 Joerg Wunsch
    -.\"
    -.\" 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 DEVELOPERS ``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 DEVELOPERS 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$
    -.\" "
    -.Dd December 29, 1996
    -.Os
    -.Dt LOGWTMP 3
    -.Sh NAME
    -.Nm logwtmp
    -.Nd append a new record to the wtmp file
    -.Sh LIBRARY
    -.Lb libutil
    -.Sh SYNOPSIS
    -.In sys/types.h
    -.In libutil.h
    -.Ft void
    -.Fn logwtmp "const char *line" "const char *name" "const char *host"
    -.Sh DESCRIPTION
    -The function
    -.Fn logwtmp
    -tries to append a new record to the
    -.Xr wtmp 5
    -file, using the provided arguments
    -.Ar line ,
    -.Ar name ,
    -and
    -.Ar host ,
    -and the current time.
    -.Pp
    -If the length of the hostname string
    -.Ar host
    -is longer than what would fit into the hostname field of the
    -.Xr wtmp 5
    -file, it will first be attempted to convert it into a numerical IP
    -address using
    -.Xr gethostbyname 3 .
    -Failing this, the hostname will be recorded as
    -.Qq invalid hostname .
    -.Pp
    -The calling process must have permission to write to the
    -.Xr wtmp 5
    -file.
    -.Sh RETURN VALUES
    -None.
    -.Sh SEE ALSO
    -.Xr gethostbyname 3 ,
    -.Xr login 3 ,
    -.Xr wtmp 5
    diff --git a/lib/libutil/logwtmp.c b/lib/libutil/logwtmp.c
    deleted file mode 100644
    index 6ae01a7ecfe6..000000000000
    --- a/lib/libutil/logwtmp.c
    +++ /dev/null
    @@ -1,99 +0,0 @@
    -/*-
    - * Copyright (c) 1988, 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.
    - */
    -
    -#include 
    -__FBSDID("$FreeBSD$");
    -
    -#if defined(LIBC_SCCS) && !defined(lint)
    -#if 0
    -static char sccsid[] = "@(#)logwtmp.c	8.1 (Berkeley) 6/4/93";
    -#endif
    -#endif /* LIBC_SCCS and not lint */
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -
    -
    -void
    -logwtmp(const char *line, const char *name, const char *host)
    -{
    -	struct utmp ut;
    -	struct stat buf;
    -	char   fullhost[MAXHOSTNAMELEN];
    -	int fd;
    -	
    -	strlcpy(fullhost, host, sizeof(fullhost));	
    -	trimdomain(fullhost, UT_HOSTSIZE);
    -	host = fullhost;
    -
    -	if (strlen(host) > UT_HOSTSIZE) {
    -		int error;
    -		struct addrinfo hints, *res;
    -
    -		bzero(&hints, sizeof(struct addrinfo));
    -		hints.ai_family = AF_UNSPEC;
    -		hints.ai_flags = AI_CANONNAME;
    -		error = getaddrinfo(host, NULL, &hints, &res);
    -		if (error != 0 || res->ai_addr == NULL)
    -			host = "invalid hostname";
    -		else {
    -			error = getnameinfo(res->ai_addr, res->ai_addrlen,
    -					  fullhost, strlen(fullhost), NULL, 0,
    -					  NI_NUMERICHOST);
    -			if (error != 0) {
    -			  fprintf(stderr, "%d", error);
    -				host = "invalid hostname";
    -			}
    -		}
    -	}
    -
    -	if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0)
    -		return;
    -	if (fstat(fd, &buf) == 0) {
    -		(void) strncpy(ut.ut_line, line, sizeof(ut.ut_line));
    -		(void) strncpy(ut.ut_name, name, sizeof(ut.ut_name));
    -		(void) strncpy(ut.ut_host, host, sizeof(ut.ut_host));
    -		ut.ut_time = _time_to_time32(time(NULL));
    -		if (write(fd, (char *)&ut, sizeof(struct utmp)) !=
    -		    sizeof(struct utmp))
    -			(void) ftruncate(fd, buf.st_size);
    -	}
    -	(void) close(fd);
    -}
    diff --git a/lib/libutil/pw_util.c b/lib/libutil/pw_util.c
    index 69232fb512c2..75459e338b12 100644
    --- a/lib/libutil/pw_util.c
    +++ b/lib/libutil/pw_util.c
    @@ -289,7 +289,7 @@ int
     pw_edit(int notsetuid)
     {
     	struct sigaction sa, sa_int, sa_quit;
    -	sigset_t oldsigset, sigset;
    +	sigset_t oldsigset, nsigset;
     	struct stat st1, st2;
     	const char *editor;
     	int pstat;
    @@ -303,9 +303,9 @@ pw_edit(int notsetuid)
     	sa.sa_flags = 0;
     	sigaction(SIGINT, &sa, &sa_int);
     	sigaction(SIGQUIT, &sa, &sa_quit);
    -	sigemptyset(&sigset);
    -	sigaddset(&sigset, SIGCHLD);
    -	sigprocmask(SIG_BLOCK, &sigset, &oldsigset);
    +	sigemptyset(&nsigset);
    +	sigaddset(&nsigset, SIGCHLD);
    +	sigprocmask(SIG_BLOCK, &nsigset, &oldsigset);
     	switch ((editpid = fork())) {
     	case -1:
     		return (-1);
    diff --git a/lib/libvgl/Makefile b/lib/libvgl/Makefile
    index a379bd0b2938..dfc4e81f33b8 100644
    --- a/lib/libvgl/Makefile
    +++ b/lib/libvgl/Makefile
    @@ -5,6 +5,7 @@ CFLAGS+=-Wall -I${.CURDIR}
     SRCS=	main.c simple.c bitmap.c text.c mouse.c keyboard.c
     INCS=	vgl.h
     MAN=	vgl.3
    +WARNS?=	2
     MLINKS+=	vgl.3 VGLBitmapAllocateBits.3 \
     		vgl.3 VGLBitmapCopy.3 \
     		vgl.3 VGLBitmapCreate.3 \
    diff --git a/lib/libwrap/Makefile b/lib/libwrap/Makefile
    index 456582765f57..2ae6821d7757 100644
    --- a/lib/libwrap/Makefile
    +++ b/lib/libwrap/Makefile
    @@ -28,6 +28,8 @@ CFLAGS+= -DUSE_GETDOMAIN
     CFLAGS+=-DINET6
     .endif
     
    +WARNS?=	0
    +
     SRCS=	clean_exit.c diag.c eval.c fix_options.c fromhost.c \
     	hosts_access.c hosts_ctl.c misc.c myvsyslog.c options.c \
     	percent_m.c percent_x.c refuse.c rfc931.c shell_cmd.c \
    diff --git a/lib/liby/Makefile b/lib/liby/Makefile
    index b7a3aff578d1..34939452dd75 100644
    --- a/lib/liby/Makefile
    +++ b/lib/liby/Makefile
    @@ -1,7 +1,9 @@
     # $FreeBSD$
     
    -LIB=		y
    +LIB=	y
     SRCS=	main.c yyerror.c
     NO_PIC=
     
    +WARNS?=	1
    +
     .include 
    diff --git a/lib/libypclnt/Makefile b/lib/libypclnt/Makefile
    index 53d6a6377542..5a3ecb42aa2c 100644
    --- a/lib/libypclnt/Makefile
    +++ b/lib/libypclnt/Makefile
    @@ -12,7 +12,6 @@ CLEANFILES+= ${GENSRCS}
     INCS= ypclnt.h
     
     CFLAGS+= -I.
    -WARNS?=	5
     
     GENSRCS=yp.h \
     	yp_clnt.c \
    diff --git a/lib/libz/Makefile b/lib/libz/Makefile
    index 63383b4d97b6..595b4f3d5460 100644
    --- a/lib/libz/Makefile
    +++ b/lib/libz/Makefile
    @@ -13,6 +13,8 @@ MAN=		zlib.3
     
     CFLAGS+=	-DHAS_snprintf -DHAS_vsnprintf
     
    +WARNS?=		3
    +
     CLEANFILES+=	example.o example foo.gz minigzip.o minigzip
     
     SRCS = adler32.c compress.c crc32.c gzio.c uncompr.c deflate.c trees.c \
    diff --git a/lib/msun/amd64/fenv.c b/lib/msun/amd64/fenv.c
    index cf07c8ba1f8d..e12607078f35 100644
    --- a/lib/msun/amd64/fenv.c
    +++ b/lib/msun/amd64/fenv.c
    @@ -86,7 +86,7 @@ fegetenv(fenv_t *envp)
     int
     feholdexcept(fenv_t *envp)
     {
    -	int mxcsr;
    +	__uint32_t mxcsr;
     
     	__stmxcsr(&mxcsr);
     	__fnstenv(&envp->__x87);
    @@ -101,7 +101,8 @@ feholdexcept(fenv_t *envp)
     int
     feupdateenv(const fenv_t *envp)
     {
    -	int mxcsr, status;
    +	__uint32_t mxcsr;
    +	__uint16_t status;
     
     	__fnstsw(&status);
     	__stmxcsr(&mxcsr);
    @@ -113,7 +114,8 @@ feupdateenv(const fenv_t *envp)
     int
     __feenableexcept(int mask)
     {
    -	int mxcsr, control, omask;
    +	__uint32_t mxcsr, omask;
    +	__uint16_t control;
     
     	mask &= FE_ALL_EXCEPT;
     	__fnstcw(&control);
    @@ -129,7 +131,8 @@ __feenableexcept(int mask)
     int
     __fedisableexcept(int mask)
     {
    -	int mxcsr, control, omask;
    +	__uint32_t mxcsr, omask;
    +	__uint16_t control;
     
     	mask &= FE_ALL_EXCEPT;
     	__fnstcw(&control);
    diff --git a/lib/msun/amd64/fenv.h b/lib/msun/amd64/fenv.h
    index b4d7379e8ff0..875664affd23 100644
    --- a/lib/msun/amd64/fenv.h
    +++ b/lib/msun/amd64/fenv.h
    @@ -110,7 +110,8 @@ feclearexcept(int __excepts)
     static __inline int
     fegetexceptflag(fexcept_t *__flagp, int __excepts)
     {
    -	int __mxcsr, __status;
    +	__uint32_t __mxcsr;
    +	__uint16_t __status;
     
     	__stmxcsr(&__mxcsr);
     	__fnstsw(&__status);
    @@ -124,7 +125,8 @@ int feraiseexcept(int __excepts);
     static __inline int
     fetestexcept(int __excepts)
     {
    -	int __mxcsr, __status;
    +	__uint32_t __mxcsr;
    +	__uint16_t __status;
     
     	__stmxcsr(&__mxcsr);
     	__fnstsw(&__status);
    @@ -134,7 +136,7 @@ fetestexcept(int __excepts)
     static __inline int
     fegetround(void)
     {
    -	int __control;
    +	__uint16_t __control;
     
     	/*
     	 * We assume that the x87 and the SSE unit agree on the
    @@ -149,7 +151,8 @@ fegetround(void)
     static __inline int
     fesetround(int __round)
     {
    -	int __mxcsr, __control;
    +	__uint32_t __mxcsr;
    +	__uint16_t __control;
     
     	if (__round & ~_ROUND_MASK)
     		return (-1);
    @@ -197,7 +200,7 @@ int fedisableexcept(int __mask);
     static __inline int
     fegetexcept(void)
     {
    -	int __control;
    +	__uint16_t __control;
     
     	/*
     	 * We assume that the masks for the x87 and the SSE unit are
    diff --git a/lib/msun/i387/fenv.c b/lib/msun/i387/fenv.c
    index ace2d323d053..5c996b36bf6f 100644
    --- a/lib/msun/i387/fenv.c
    +++ b/lib/msun/i387/fenv.c
    @@ -87,7 +87,7 @@ int
     fesetexceptflag(const fexcept_t *flagp, int excepts)
     {
     	fenv_t env;
    -	int mxcsr;
    +	__uint32_t mxcsr;
     
     	__fnstenv(&env);
     	env.__status &= ~excepts;
    @@ -117,7 +117,7 @@ feraiseexcept(int excepts)
     int
     fegetenv(fenv_t *envp)
     {
    -	int mxcsr;
    +	__uint32_t mxcsr;
     
     	__fnstenv(envp);
     	/*
    @@ -135,7 +135,7 @@ fegetenv(fenv_t *envp)
     int
     feholdexcept(fenv_t *envp)
     {
    -	int mxcsr;
    +	__uint32_t mxcsr;
     
     	__fnstenv(envp);
     	__fnclex();
    @@ -152,7 +152,8 @@ feholdexcept(fenv_t *envp)
     int
     feupdateenv(const fenv_t *envp)
     {
    -	int mxcsr, status;
    +	__uint32_t mxcsr;
    +	__uint16_t status;
     
     	__fnstsw(&status);
     	if (__HAS_SSE())
    @@ -167,7 +168,8 @@ feupdateenv(const fenv_t *envp)
     int
     __feenableexcept(int mask)
     {
    -	int mxcsr, control, omask;
    +	__uint32_t mxcsr, omask;
    +	__uint16_t control;
     
     	mask &= FE_ALL_EXCEPT;
     	__fnstcw(&control);
    @@ -188,7 +190,8 @@ __feenableexcept(int mask)
     int
     __fedisableexcept(int mask)
     {
    -	int mxcsr, control, omask;
    +	__uint32_t mxcsr, omask;
    +	__uint16_t control;
     
     	mask &= FE_ALL_EXCEPT;
     	__fnstcw(&control);
    diff --git a/lib/msun/i387/fenv.h b/lib/msun/i387/fenv.h
    index c4eab02d9dfc..cc58a92afad0 100644
    --- a/lib/msun/i387/fenv.h
    +++ b/lib/msun/i387/fenv.h
    @@ -114,7 +114,7 @@ static __inline int
     feclearexcept(int __excepts)
     {
     	fenv_t __env;
    -	int __mxcsr;
    +	__uint32_t __mxcsr;
     
     	if (__excepts == FE_ALL_EXCEPT) {
     		__fnclex();
    @@ -134,7 +134,8 @@ feclearexcept(int __excepts)
     static __inline int
     fegetexceptflag(fexcept_t *__flagp, int __excepts)
     {
    -	int __mxcsr, __status;
    +	__uint32_t __mxcsr;
    +	__uint16_t __status;
     
     	__fnstsw(&__status);
     	if (__HAS_SSE())
    @@ -151,7 +152,8 @@ int feraiseexcept(int __excepts);
     static __inline int
     fetestexcept(int __excepts)
     {
    -	int __mxcsr, __status;
    +	__uint32_t __mxcsr;
    +	__uint16_t __status;
     
     	__fnstsw(&__status);
     	if (__HAS_SSE())
    @@ -164,7 +166,7 @@ fetestexcept(int __excepts)
     static __inline int
     fegetround(void)
     {
    -	int __control;
    +	__uint16_t __control;
     
     	/*
     	 * We assume that the x87 and the SSE unit agree on the
    @@ -179,7 +181,8 @@ fegetround(void)
     static __inline int
     fesetround(int __round)
     {
    -	int __mxcsr, __control;
    +	__uint32_t __mxcsr;
    +	__uint16_t __control;
     
     	if (__round & ~_ROUND_MASK)
     		return (-1);
    @@ -206,7 +209,7 @@ static __inline int
     fesetenv(const fenv_t *__envp)
     {
     	fenv_t __env = *__envp;
    -	int __mxcsr;
    +	__uint32_t __mxcsr;
     
     	__mxcsr = __get_mxcsr(__env);
     	__set_mxcsr(__env, 0xffffffff);
    @@ -234,7 +237,7 @@ int fedisableexcept(int __mask);
     static __inline int
     fegetexcept(void)
     {
    -	int __control;
    +	__uint16_t __control;
     
     	/*
     	 * We assume that the masks for the x87 and the SSE unit are
    diff --git a/lib/ncurses/Makefile.inc b/lib/ncurses/Makefile.inc
    index 89c6348a5d85..5c1487cbc760 100644
    --- a/lib/ncurses/Makefile.inc
    +++ b/lib/ncurses/Makefile.inc
    @@ -2,4 +2,6 @@
     
     # This is to include src/lib/Makefile.inc
     
    +WARNS?=	3
    +
     .include "../Makefile.inc"
    diff --git a/libexec/Makefile b/libexec/Makefile
    index 26a8ff236a2b..78953b4e26a0 100644
    --- a/libexec/Makefile
    +++ b/libexec/Makefile
    @@ -29,6 +29,7 @@ SUBDIR=	${_atrun} \
     	${_telnetd} \
     	tftpd \
     	${_tftp-proxy} \
    +	ulog-helper \
     	${_ypxfr}
     
     .if ${MK_AT} != "no"
    diff --git a/libexec/Makefile.inc b/libexec/Makefile.inc
    index 05deedc6127f..7b6a65fc7172 100644
    --- a/libexec/Makefile.inc
    +++ b/libexec/Makefile.inc
    @@ -2,4 +2,6 @@
     # $FreeBSD$
     
     BINDIR?=	/usr/libexec
    +
    +WARNS?=		6
     WFORMAT?=	1
    diff --git a/libexec/atrun/Makefile b/libexec/atrun/Makefile
    index 4e3d4ccace58..273055997c0b 100644
    --- a/libexec/atrun/Makefile
    +++ b/libexec/atrun/Makefile
    @@ -13,6 +13,8 @@ CLEANFILES= ${MAN}
     
     CFLAGS+=-I${MAINSRC} -I${.CURDIR}
     CFLAGS+=-DLOGIN_CAP -DPAM
    +
    +WARNS?=	2
     WFORMAT=0
     
     DPADD=	${LIBPAM} ${LIBUTIL}
    diff --git a/libexec/atrun/atrun.c b/libexec/atrun/atrun.c
    index a7cef873eeef..e4fc625fe3ee 100644
    --- a/libexec/atrun/atrun.c
    +++ b/libexec/atrun/atrun.c
    @@ -49,7 +49,6 @@ static const char rcsid[] =
     #include 
     #include 
     #include 
    -#include 
     #ifdef __FreeBSD__
     #include 
     #else
    @@ -63,12 +62,6 @@ static const char rcsid[] =
     #include 
     #endif
     
    -#if (MAXLOGNAME-1) > UT_NAMESIZE
    -#define LOGNAMESIZE UT_NAMESIZE
    -#else
    -#define LOGNAMESIZE (MAXLOGNAME-1)
    -#endif
    -
     /* Local headers */
     
     #include "gloadavg.h"
    @@ -130,7 +123,7 @@ run_file(const char *filename, uid_t uid, gid_t gid)
         pid_t pid;
         int fd_out, fd_in;
         int queue;
    -    char mailbuf[LOGNAMESIZE + 1], fmt[49];
    +    char mailbuf[MAXLOGNAME], fmt[49];
         char *mailname = NULL;
         FILE *stream;
         int send_mail = 0;
    @@ -231,7 +224,7 @@ run_file(const char *filename, uid_t uid, gid_t gid)
     
         snprintf(fmt, sizeof(fmt),
     	"#!/bin/sh\n# atrun uid=%%ld gid=%%ld\n# mail %%%ds %%d",
    -                          LOGNAMESIZE);
    +                          MAXLOGNAME - 1);
     
         if (fscanf(stream, fmt, &nuid, &ngid, mailbuf, &send_mail) != 4)
     	perrx("File %s is in wrong format - aborting", filename);
    diff --git a/libexec/bootpd/Makefile b/libexec/bootpd/Makefile
    index 830577a57def..6f02477d4667 100644
    --- a/libexec/bootpd/Makefile
    +++ b/libexec/bootpd/Makefile
    @@ -5,6 +5,8 @@ PROG=	bootpd
     CFLAGS+= -DETC_ETHERS
     CFLAGS+= -DSYSLOG -DDEBUG -DVEND_CMU
     
    +WARNS?=	2
    +
     SUBDIR= bootpgw tools
     
     SRCS=	bootpd.c dovend.c readfile.c hash.c dumptab.c \
    diff --git a/libexec/bootpd/Makefile.inc b/libexec/bootpd/Makefile.inc
    index 829da300445d..899c9b53689d 100644
    --- a/libexec/bootpd/Makefile.inc
    +++ b/libexec/bootpd/Makefile.inc
    @@ -1,3 +1,5 @@
     # $FreeBSD$
     
     BINDIR?=	/usr/libexec
    +
    +WARNS?=		1
    diff --git a/libexec/bootpd/tools/Makefile.inc b/libexec/bootpd/tools/Makefile.inc
    index 4d7876162d28..f4a306f1a320 100644
    --- a/libexec/bootpd/tools/Makefile.inc
    +++ b/libexec/bootpd/tools/Makefile.inc
    @@ -2,3 +2,5 @@
     # $FreeBSD$
     
     BINDIR=		/usr/sbin
    +
    +WARNS?=		1
    diff --git a/libexec/comsat/comsat.8 b/libexec/comsat/comsat.8
    index 50b6b113b1d9..1f35cff9a0c6 100644
    --- a/libexec/comsat/comsat.8
    +++ b/libexec/comsat/comsat.8
    @@ -91,7 +91,7 @@ If
     omitted, standard mailbox assumed.
     .Sh FILES
     .Bl -tag -width ".Pa /var/mail/user" -compact
    -.It Pa /var/run/utmp
    +.It Pa /var/run/utx.active
     to find out who is logged on and on what terminals
     .It Pa /var/mail/user
     standard mailbox
    diff --git a/libexec/comsat/comsat.c b/libexec/comsat/comsat.c
    index fd7cc8d4dc36..d0ff7a43dbd6 100644
    --- a/libexec/comsat/comsat.c
    +++ b/libexec/comsat/comsat.c
    @@ -66,7 +66,7 @@ static const char rcsid[] =
     #include 
     #include 
     #include 
    -#include 
    +#include 
     
     int	debug = 0;
     #define	dsyslog	if (debug) syslog
    @@ -74,18 +74,14 @@ int	debug = 0;
     #define MAXIDLE	120
     
     char	hostname[MAXHOSTNAMELEN];
    -struct	utmp *utmp = NULL;
    -time_t	lastmsgtime;
    -int	nutmp, uf;
     
     void jkfprintf(FILE *, char[], char[], off_t);
     void mailfor(char *);
    -void notify(struct utmp *, char[], off_t, int);
    -void onalrm(int);
    +void notify(struct utmpx *, char[], off_t, int);
     void reapchildren(int);
     
     int
    -main(int argc, char *argv[])
    +main(int argc __unused, char *argv[] __unused)
     {
     	struct sockaddr_in from;
     	socklen_t fromlen;
    @@ -102,15 +98,7 @@ main(int argc, char *argv[])
     		(void) recv(0, msgbuf, sizeof(msgbuf) - 1, 0);
     		exit(1);
     	}
    -	if ((uf = open(_PATH_UTMP, O_RDONLY, 0)) < 0) {
    -		syslog(LOG_ERR, "open: %s: %m", _PATH_UTMP);
    -		(void) recv(0, msgbuf, sizeof(msgbuf) - 1, 0);
    -		exit(1);
    -	}
    -	(void)time(&lastmsgtime);
     	(void)gethostname(hostname, sizeof(hostname));
    -	onalrm(0);
    -	(void)signal(SIGALRM, onalrm);
     	(void)signal(SIGTTOU, SIG_IGN);
     	(void)signal(SIGCHLD, reapchildren);
     	for (;;) {
    @@ -121,57 +109,28 @@ main(int argc, char *argv[])
     			errno = 0;
     			continue;
     		}
    -		if (!nutmp)		/* no one has logged in yet */
    -			continue;
    -		sigblock(sigmask(SIGALRM));
     		msgbuf[cc] = '\0';
    -		(void)time(&lastmsgtime);
     		mailfor(msgbuf);
     		sigsetmask(0L);
     	}
     }
     
     void
    -reapchildren(int signo)
    +reapchildren(int signo __unused)
     {
     	while (wait3(NULL, WNOHANG, NULL) > 0);
     }
     
    -void
    -onalrm(int signo)
    -{
    -	static u_int utmpsize;		/* last malloced size for utmp */
    -	static u_int utmpmtime;		/* last modification time for utmp */
    -	struct stat statbf;
    -
    -	if (time(NULL) - lastmsgtime >= MAXIDLE)
    -		exit(0);
    -	(void)alarm((u_int)15);
    -	(void)fstat(uf, &statbf);
    -	if (statbf.st_mtime > utmpmtime) {
    -		utmpmtime = statbf.st_mtime;
    -		if (statbf.st_size > utmpsize) {
    -			utmpsize = statbf.st_size + 10 * sizeof(struct utmp);
    -			if ((utmp = realloc(utmp, utmpsize)) == NULL) {
    -				syslog(LOG_ERR, "%s", strerror(errno));
    -				exit(1);
    -			}
    -		}
    -		(void)lseek(uf, (off_t)0, SEEK_SET);
    -		nutmp = read(uf, utmp, (size_t)statbf.st_size)/sizeof(struct utmp);
    -	}
    -}
    -
     void
     mailfor(char *name)
     {
    -	struct utmp *utp = &utmp[nutmp];
    +	struct utmpx *utp;
     	char *cp;
     	char *file;
     	off_t offset;
     	int folder;
    -	char buf[sizeof(_PATH_MAILDIR) + sizeof(utmp[0].ut_name) + 1];
    -	char buf2[sizeof(_PATH_MAILDIR) + sizeof(utmp[0].ut_name) + 1];
    +	char buf[sizeof(_PATH_MAILDIR) + sizeof(utp->ut_user) + 1];
    +	char buf2[sizeof(_PATH_MAILDIR) + sizeof(utp->ut_user) + 1];
     
     	if (!(cp = strchr(name, '@')))
     		return;
    @@ -181,33 +140,35 @@ mailfor(char *name)
     		file = name;
     	else
     		file = cp + 1;
    -	sprintf(buf, "%s/%.*s", _PATH_MAILDIR, (int)sizeof(utmp[0].ut_name),
    +	sprintf(buf, "%s/%.*s", _PATH_MAILDIR, (int)sizeof(utp->ut_user),
     	    name);
     	if (*file != '/') {
     		sprintf(buf2, "%s/%.*s", _PATH_MAILDIR,
    -		    (int)sizeof(utmp[0].ut_name), file);
    +		    (int)sizeof(utp->ut_user), file);
     		file = buf2;
     	}
     	folder = strcmp(buf, file);
    -	while (--utp >= utmp)
    -		if (!strncmp(utp->ut_name, name, sizeof(utmp[0].ut_name)))
    +	setutxent();
    +	while ((utp = getutxent()) != NULL)
    +		if (utp->ut_type == USER_PROCESS && !strcmp(utp->ut_user, name))
     			notify(utp, file, offset, folder);
    +	endutxent();
     }
     
    -static char *cr;
    +static const char *cr;
     
     void
    -notify(struct utmp *utp, char file[], off_t offset, int folder)
    +notify(struct utmpx *utp, char file[], off_t offset, int folder)
     {
     	FILE *tp;
     	struct stat stb;
     	struct termios tio;
    -	char tty[20], name[sizeof(utmp[0].ut_name) + 1];
    -	const char *cr = utp->ut_line;
    +	char tty[20];
    +	const char *s = utp->ut_line;
     
    -	if (strncmp(cr, "pts/", 4) == 0)
    -		cr += 4;
    -	if (strchr(cr, '/')) {
    +	if (strncmp(s, "pts/", 4) == 0)
    +		s += 4;
    +	if (strchr(s, '/')) {
     		/* A slash is an attempt to break security... */
     		syslog(LOG_AUTH | LOG_NOTICE, "Unexpected `/' in `%s'",
     		    utp->ut_line);
    @@ -216,10 +177,10 @@ notify(struct utmp *utp, char file[], off_t offset, int folder)
     	(void)snprintf(tty, sizeof(tty), "%s%.*s",
     	    _PATH_DEV, (int)sizeof(utp->ut_line), utp->ut_line);
     	if (stat(tty, &stb) == -1 || !(stb.st_mode & (S_IXUSR | S_IXGRP))) {
    -		dsyslog(LOG_DEBUG, "%s: wrong mode on %s", utp->ut_name, tty);
    +		dsyslog(LOG_DEBUG, "%s: wrong mode on %s", utp->ut_user, tty);
     		return;
     	}
    -	dsyslog(LOG_DEBUG, "notify %s on %s\n", utp->ut_name, tty);
    +	dsyslog(LOG_DEBUG, "notify %s on %s\n", utp->ut_user, tty);
     	switch (fork()) {
     	case -1:
     		syslog(LOG_NOTICE, "fork failed (%m)");
    @@ -229,25 +190,21 @@ notify(struct utmp *utp, char file[], off_t offset, int folder)
     	default:
     		return;
     	}
    -	(void)signal(SIGALRM, SIG_DFL);
    -	(void)alarm((u_int)30);
     	if ((tp = fopen(tty, "w")) == NULL) {
     		dsyslog(LOG_ERR, "%s: %s", tty, strerror(errno));
     		_exit(1);
     	}
     	(void)tcgetattr(fileno(tp), &tio);
     	cr = ((tio.c_oflag & (OPOST|ONLCR)) == (OPOST|ONLCR)) ?  "\n" : "\n\r";
    -	(void)strncpy(name, utp->ut_name, sizeof(utp->ut_name));
    -	name[sizeof(name) - 1] = '\0';
     	switch (stb.st_mode & (S_IXUSR | S_IXGRP)) {
     	case S_IXUSR:
     	case (S_IXUSR | S_IXGRP):
     		(void)fprintf(tp, 
     		    "%s\007New mail for %s@%.*s\007 has arrived%s%s%s:%s----%s",
    -		    cr, name, (int)sizeof(hostname), hostname,
    +		    cr, utp->ut_user, (int)sizeof(hostname), hostname,
     		    folder ? cr : "", folder ? "to " : "", folder ? file : "",
     		    cr, cr);
    -		jkfprintf(tp, name, file, offset);
    +		jkfprintf(tp, utp->ut_user, file, offset);
     		break;
     	case S_IXGRP:
     		(void)fprintf(tp, "\007");
    diff --git a/libexec/fingerd/Makefile b/libexec/fingerd/Makefile
    index ae92564cda96..b6382ad79706 100644
    --- a/libexec/fingerd/Makefile
    +++ b/libexec/fingerd/Makefile
    @@ -5,8 +5,8 @@ PROG=	fingerd
     DPADD=	${LIBUTIL}
     LDADD=	-lutil
     MAN=	fingerd.8
    -WARNS?=	2
     
    +WARNS?=	2
     WFORMAT=0
     
     .include 
    diff --git a/libexec/ftpd/ftpd.8 b/libexec/ftpd/ftpd.8
    index 9334bd931fdd..d7e5deb776c7 100644
    --- a/libexec/ftpd/ftpd.8
    +++ b/libexec/ftpd/ftpd.8
    @@ -219,8 +219,7 @@ This option may be overridden by
     A synonym for
     .Fl d .
     .It Fl W
    -Do not log FTP sessions to
    -.Pa /var/log/wtmp .
    +Do not log FTP sessions to the user accounting database.
     .El
     .Pp
     The file
    diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c
    index 32c15f8df1d1..119c57543105 100644
    --- a/libexec/ftpd/ftpd.c
    +++ b/libexec/ftpd/ftpd.c
    @@ -173,8 +173,7 @@ static struct ftphost {
     char	remotehost[NI_MAXHOST];
     char	*ident = NULL;
     
    -static char	ttyline[20];
    -char		*tty = ttyline;		/* for klogin */
    +static char	wtmpid[20];
     
     #ifdef USE_PAM
     static int	auth_pam(struct passwd**, const char*);
    @@ -584,8 +583,7 @@ gotchild:
     
     	data_source.su_port = htons(ntohs(ctrl_addr.su_port) - 1);
     
    -	/* set this here so klogin can use it... */
    -	(void)snprintf(ttyline, sizeof(ttyline), "ftp%d", getpid());
    +	(void)snprintf(wtmpid, sizeof(wtmpid), "%xftpd", getpid());
     
     	/* Try to handle urgent data inline */
     #ifdef SO_OOBINLINE
    @@ -1181,7 +1179,7 @@ end_login(void)
     
     	(void) seteuid(0);
     	if (logged_in && dowtmp)
    -		ftpd_logwtmp(ttyline, "", NULL);
    +		ftpd_logwtmp(wtmpid, NULL, NULL);
     	pw = NULL;
     #ifdef	LOGIN_CAP
     	setusercontext(NULL, getpwuid(0), 0,
    @@ -1476,9 +1474,19 @@ skip:
     	}
     #endif
     
    -	/* open wtmp before chroot */
    +	dochroot =
    +		checkuser(_PATH_FTPCHROOT, pw->pw_name, 1, &residue)
    +#ifdef	LOGIN_CAP	/* Allow login.conf configuration as well */
    +		|| login_getcapbool(lc, "ftp-chroot", 0)
    +#endif
    +	;
    +	chrootdir = NULL;
    +
    +	/* Disable wtmp logging when chrooting. */
    +	if (dochroot || guest)
    +		dowtmp = 0;
     	if (dowtmp)
    -		ftpd_logwtmp(ttyline, pw->pw_name,
    +		ftpd_logwtmp(wtmpid, pw->pw_name,
     		    (struct sockaddr *)&his_addr);
     	logged_in = 1;
     
    @@ -1491,13 +1499,6 @@ skip:
     		if (statfd < 0)
     			stats = 0;
     
    -	dochroot =
    -		checkuser(_PATH_FTPCHROOT, pw->pw_name, 1, &residue)
    -#ifdef	LOGIN_CAP	/* Allow login.conf configuration as well */
    -		|| login_getcapbool(lc, "ftp-chroot", 0)
    -#endif
    -	;
    -	chrootdir = NULL;
     	/*
     	 * For a chrooted local user,
     	 * a) see whether ftpchroot(5) specifies a chroot directory,
    @@ -2734,7 +2735,7 @@ dologout(int status)
     
     	if (logged_in && dowtmp) {
     		(void) seteuid(0);
    -		ftpd_logwtmp(ttyline, "", NULL);
    +		ftpd_logwtmp(wtmpid, NULL, NULL);
     	}
     	/* beware of flushing buffers after a SIGPIPE */
     	_exit(status);
    diff --git a/libexec/ftpd/logwtmp.c b/libexec/ftpd/logwtmp.c
    index 29bea5cef0d0..711234f7d448 100644
    --- a/libexec/ftpd/logwtmp.c
    +++ b/libexec/ftpd/logwtmp.c
    @@ -46,47 +46,36 @@ __FBSDID("$FreeBSD$");
     #include 
     #include 
     
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    -#include 
    +#include 
     #include 
     #include 
    -#include 
    +#include 
    +#include 
     #include "extern.h"
     
    -static int fd = -1;
    -
    -/*
    - * Modified version of logwtmp that holds wtmp file open
    - * after first call, for use with ftp (which may chroot
    - * after login, but before logout).
    - */
     void
    -ftpd_logwtmp(line, name, addr)
    -	char *line, *name;
    -	struct sockaddr *addr;
    +ftpd_logwtmp(char *id, char *user, struct sockaddr *addr)
     {
    -	struct utmp ut;
    -	struct stat buf;
    -	char host[UT_HOSTSIZE];
    +	struct utmpx ut;
     
    -	if (addr == NULL)
    -		host[0] = '\0';
    -	else
    -		realhostname_sa(host, sizeof(host), addr, addr->sa_len);
    +	memset(&ut, 0, sizeof(ut));
     
    -	if (fd < 0 && (fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) < 0)
    -		return;
    -	if (fstat(fd, &buf) == 0) {
    -		(void)strncpy(ut.ut_line, line, sizeof(ut.ut_line));
    -		(void)strncpy(ut.ut_name, name, sizeof(ut.ut_name));
    -		(void)strncpy(ut.ut_host, host, sizeof(ut.ut_host));
    -		ut.ut_time = _time_to_time32(time(NULL));
    -		if (write(fd, &ut, sizeof(struct utmp)) !=
    -		    sizeof(struct utmp))
    -			(void)ftruncate(fd, buf.st_size);
    +	if (user != NULL) {
    +		/* Log in. */
    +		ut.ut_type = USER_PROCESS;
    +		(void)strncpy(ut.ut_user, user, sizeof(ut.ut_user));
    +		if (addr != NULL)
    +			realhostname_sa(ut.ut_host, sizeof(ut.ut_host),
    +			    addr, addr->sa_len);
    +	} else {
    +		/* Log out. */
    +		ut.ut_type = DEAD_PROCESS;
     	}
    +
    +	ut.ut_pid = getpid();
    +	gettimeofday(&ut.ut_tv, NULL);
    +	(void)strncpy(ut.ut_id, id, sizeof(ut.ut_id));
    +	(void)strncpy(ut.ut_line, "ftpd", sizeof(ut.ut_line));
    +
    +	pututxline(&ut);
     }
    diff --git a/libexec/getty/Makefile b/libexec/getty/Makefile
    index 697e81ae0bb4..f9679586a487 100644
    --- a/libexec/getty/Makefile
    +++ b/libexec/getty/Makefile
    @@ -6,6 +6,8 @@ SRCS=	main.c init.c subr.c chat.c
     DPADD=	${LIBUTIL}
     LDADD=	-lutil
     MAN=	gettytab.5 ttys.5 getty.8
    +
    +WARNS?=	1
     WFORMAT=0
     
     .include 
    diff --git a/libexec/getty/ttys.5 b/libexec/getty/ttys.5
    index cf2423a9320d..18151c9855fe 100644
    --- a/libexec/getty/ttys.5
    +++ b/libexec/getty/ttys.5
    @@ -158,7 +158,6 @@ ttyp1	none	network	off	group=pty
     .Sh SEE ALSO
     .Xr login 1 ,
     .Xr getttyent 3 ,
    -.Xr ttyslot 3 ,
     .Xr gettytab 5 ,
     .Xr login.conf 5 ,
     .Xr termcap 5 ,
    diff --git a/libexec/mail.local/Makefile b/libexec/mail.local/Makefile
    index 57837d11166b..3e59609e893e 100644
    --- a/libexec/mail.local/Makefile
    +++ b/libexec/mail.local/Makefile
    @@ -8,6 +8,8 @@ PROG=	mail.local
     SRCS=	mail.local.c
     MAN=	mail.local.8
     CFLAGS+=-I${SENDMAIL_DIR}/include -I.
    +
    +WARNS?=	2
     WFORMAT=0
     
     LIBSMDIR=	${.OBJDIR}/../../lib/libsm
    diff --git a/libexec/mknetid/Makefile b/libexec/mknetid/Makefile
    index 6941b8fde414..5ca066213765 100644
    --- a/libexec/mknetid/Makefile
    +++ b/libexec/mknetid/Makefile
    @@ -5,4 +5,6 @@ SRCS=	mknetid.c hash.c parse_group.c
     
     MAN=	netid.5 mknetid.8
     
    +WARNS?=	2
    +
     .include 
    diff --git a/libexec/pppoed/Makefile b/libexec/pppoed/Makefile
    index 0f0c78eda4f1..1ffaffe3eed2 100644
    --- a/libexec/pppoed/Makefile
    +++ b/libexec/pppoed/Makefile
    @@ -5,6 +5,7 @@ DPADD=	${LIBNETGRAPH}
     LDADD=	-lnetgraph
     MAN=	pppoed.8
     
    +WARNS?=	1
     WFORMAT=0
     
     .include 
    diff --git a/libexec/rbootd/Makefile b/libexec/rbootd/Makefile
    index 3a4099e4a8be..70b6555c9644 100644
    --- a/libexec/rbootd/Makefile
    +++ b/libexec/rbootd/Makefile
    @@ -5,6 +5,7 @@ PROG=	rbootd
     SRCS=	bpf.c conf.c parseconf.c rbootd.c rmpproto.c utils.c
     MAN=	rbootd.8
     
    +WARNS?=	1
     WFORMAT=0
     
     .include 
    diff --git a/libexec/revnetgroup/Makefile b/libexec/revnetgroup/Makefile
    index 708837141347..d3b36fa98b13 100644
    --- a/libexec/revnetgroup/Makefile
    +++ b/libexec/revnetgroup/Makefile
    @@ -5,4 +5,6 @@ SRCS=	revnetgroup.c hash.c parse_netgroup.c
     
     MAN= revnetgroup.8
     
    +WARNS?=	2
    +
     .include 
    diff --git a/libexec/rlogind/rlogind.c b/libexec/rlogind/rlogind.c
    index c4db3c7ae6bf..5831a2515b70 100644
    --- a/libexec/rlogind/rlogind.c
    +++ b/libexec/rlogind/rlogind.c
    @@ -479,18 +479,7 @@ protocol(int f, int p)
     void
     cleanup(int signo)
     {
    -	char *p;
     
    -	p = line + sizeof(_PATH_DEV) - 1;
    -	if (logout(p))
    -		logwtmp(p, "", "");
    -	(void)chflags(line, 0);
    -	(void)chmod(line, 0666);
    -	(void)chown(line, 0, 0);
    -	*p = 'p';
    -	(void)chflags(line, 0);
    -	(void)chmod(line, 0666);
    -	(void)chown(line, 0, 0);
     	shutdown(netf, SHUT_RDWR);
     	exit(1);
     }
    diff --git a/libexec/rpc.rquotad/Makefile b/libexec/rpc.rquotad/Makefile
    index fb3f38bc90cc..95d4415e538b 100644
    --- a/libexec/rpc.rquotad/Makefile
    +++ b/libexec/rpc.rquotad/Makefile
    @@ -4,8 +4,6 @@ PROG =	rpc.rquotad
     SRCS =	rquotad.c
     MAN  =	rpc.rquotad.8
     
    -WARNS ?= 6
    -
     DPADD=	${LIBRPCSVC} ${LIBUTIL}
     LDADD=	-lrpcsvc -lutil
     
    diff --git a/libexec/rpc.rstatd/Makefile b/libexec/rpc.rstatd/Makefile
    index 1083447dd399..a42225f9e1ca 100644
    --- a/libexec/rpc.rstatd/Makefile
    +++ b/libexec/rpc.rstatd/Makefile
    @@ -4,7 +4,9 @@ PROG =	rpc.rstatd
     SRCS =	rstatd.c rstat_proc.c
     MAN =	rpc.rstatd.8
     
    -DPADD=	${LIBRPCSVC} ${LIBUTIL} ${LIBDEVSTAT}
    -LDADD=	-lrpcsvc -lutil -ldevstat
    +DPADD=	${LIBRPCSVC} ${LIBUTIL} ${LIBDEVSTAT} ${LIBKVM}
    +LDADD=	-lrpcsvc -lutil -ldevstat -lkvm
    +
    +WARNS?=	1
     
     .include 
    diff --git a/libexec/rpc.rusersd/Makefile b/libexec/rpc.rusersd/Makefile
    index af43bd3e7cf3..6305343ff9f9 100644
    --- a/libexec/rpc.rusersd/Makefile
    +++ b/libexec/rpc.rusersd/Makefile
    @@ -12,5 +12,4 @@ LDADD=	-lrpcsvc -lutil
     #LDADD+= -L/usr/X11R6/lib -lXext -lX11
     #.endif
     
    -
     .include 
    diff --git a/libexec/rpc.rusersd/rusers_proc.c b/libexec/rpc.rusersd/rusers_proc.c
    index 8bd96924b29a..6b34fa72cd28 100644
    --- a/libexec/rpc.rusersd/rusers_proc.c
    +++ b/libexec/rpc.rusersd/rusers_proc.c
    @@ -45,56 +45,28 @@ static const char rcsid[] =
     #include 
     #include 
     #include 
    -#include 
    +#include 
     #ifdef XIDLE
     #include 
     #include 
     #include 
     #endif
    -#define utmp rutmp
     #include 
    -#undef utmp
    -
    -#define	IGNOREUSER	"sleeper"
    -
    -#ifdef OSF
    -#define _PATH_UTMP UTMP_FILE
    -#endif
    -
    -#ifndef _PATH_UTMP
    -#define _PATH_UTMP "/etc/utmp"
    -#endif
     
     #ifndef _PATH_DEV
     #define _PATH_DEV "/dev"
     #endif
     
    -#ifndef UT_LINESIZE
    -#define UT_LINESIZE sizeof(((struct utmp *)0)->ut_line)
    -#endif
    -#ifndef UT_NAMESIZE
    -#define UT_NAMESIZE sizeof(((struct utmp *)0)->ut_name)
    -#endif
    -#ifndef UT_HOSTSIZE
    -#define UT_HOSTSIZE sizeof(((struct utmp *)0)->ut_host)
    -#endif
    -
    -typedef char ut_line_t[UT_LINESIZE+1];
    -typedef char ut_name_t[UT_NAMESIZE+1];
    -typedef char ut_host_t[UT_HOSTSIZE+1];
    -
    -utmpidle utmp_idle[MAXUSERS];
    -rutmp old_utmp[MAXUSERS];
    -ut_line_t line[MAXUSERS];
    -ut_name_t name[MAXUSERS];
    -ut_host_t host[MAXUSERS];
    +static utmpidle utmp_idle[MAXUSERS];
    +static utmp old_utmp[MAXUSERS];
    +static struct utmpx utmp_list[MAXUSERS];
     
     extern int from_inetd;
     
    -FILE *ufp;
    +void rusers_service(struct svc_req *, SVCXPRT *);
     
     #ifdef XIDLE
    -Display *dpy;
    +static Display *dpy;
     
     static jmp_buf openAbort;
     
    @@ -106,211 +78,187 @@ abortOpen(void)
     
     XqueryIdle(char *display)
     {
    -        int first_event, first_error;
    -        Time IdleTime;
    +	int first_event, first_error;
    +	Time IdleTime;
     
    -        (void) signal (SIGALRM, abortOpen);
    -        (void) alarm ((unsigned) 10);
    -        if (!setjmp (openAbort)) {
    -                if (!(dpy= XOpenDisplay(display))) {
    -                        syslog(LOG_ERR, "Cannot open display %s", display);
    -                        return(-1);
    -                }
    -                if (XidleQueryExtension(dpy, &first_event, &first_error)) {
    -                        if (!XGetIdleTime(dpy, &IdleTime)) {
    -                                syslog(LOG_ERR, "%s: unable to get idle time", display);
    -                                return(-1);
    -                        }
    -                }
    -                else {
    -                        syslog(LOG_ERR, "%s: Xidle extension not loaded", display);
    -                        return(-1);
    -                }
    -                XCloseDisplay(dpy);
    -        }
    -        else {
    -                syslog(LOG_ERR, "%s: server grabbed for over 10 seconds", display);
    -                return(-1);
    -        }
    -        (void) signal (SIGALRM, SIG_DFL);
    -        (void) alarm ((unsigned) 0);
    +	(void) signal (SIGALRM, abortOpen);
    +	(void) alarm ((unsigned) 10);
    +	if (!setjmp (openAbort)) {
    +		if (!(dpy= XOpenDisplay(display))) {
    +			syslog(LOG_ERR, "Cannot open display %s", display);
    +			return(-1);
    +		}
    +		if (XidleQueryExtension(dpy, &first_event, &first_error)) {
    +			if (!XGetIdleTime(dpy, &IdleTime)) {
    +				syslog(LOG_ERR, "%s: unable to get idle time", display);
    +				return(-1);
    +			}
    +		} else {
    +			syslog(LOG_ERR, "%s: Xidle extension not loaded", display);
    +			return(-1);
    +		}
    +		XCloseDisplay(dpy);
    +	} else {
    +		syslog(LOG_ERR, "%s: server grabbed for over 10 seconds", display);
    +		return(-1);
    +	}
    +	(void) signal (SIGALRM, SIG_DFL);
    +	(void) alarm ((unsigned) 0);
     
    -        IdleTime /= 1000;
    -        return((IdleTime + 30) / 60);
    +	IdleTime /= 1000;
    +	return((IdleTime + 30) / 60);
     }
     #endif
     
     static u_int
    -getidle(char *tty, char *display)
    +getidle(const char *tty, const char *display __unused)
     {
    -        struct stat st;
    -        char devname[PATH_MAX];
    -        time_t now;
    -        u_long idle;
    +	struct stat st;
    +	char ttyname[PATH_MAX];
    +	time_t now;
    +	u_long idle;
     
    -        /*
    -         * If this is an X terminal or console, then try the
    -         * XIdle extension
    -         */
    +	/*
    +	 * If this is an X terminal or console, then try the
    +	 * XIdle extension
    +	 */
     #ifdef XIDLE
    -        if (display && *display && (idle = XqueryIdle(display)) >= 0)
    -                return(idle);
    +	if (display && *display && (idle = XqueryIdle(display)) >= 0)
    +		return(idle);
     #endif
    -        idle = 0;
    -        if (*tty == 'X') {
    -                u_long kbd_idle, mouse_idle;
    +	idle = 0;
    +	if (*tty == 'X') {
    +		u_long kbd_idle, mouse_idle;
     #if	!defined(__FreeBSD__)
    -                kbd_idle = getidle("kbd", NULL);
    +		kbd_idle = getidle("kbd", NULL);
     #else
    -                kbd_idle = getidle("vga", NULL);
    +		kbd_idle = getidle("vga", NULL);
     #endif
    -                mouse_idle = getidle("mouse", NULL);
    -                idle = (kbd_idle < mouse_idle)?kbd_idle:mouse_idle;
    -        }
    -        else {
    -                sprintf(devname, "%s/%s", _PATH_DEV, tty);
    -                if (stat(devname, &st) < 0) {
    +		mouse_idle = getidle("mouse", NULL);
    +		idle = (kbd_idle < mouse_idle)?kbd_idle:mouse_idle;
    +	} else {
    +		sprintf(ttyname, "%s/%s", _PATH_DEV, tty);
    +		if (stat(ttyname, &st) < 0) {
     #ifdef DEBUG
    -                        printf("%s: %s\n", devname, strerror(errno));
    +			printf("%s: %s\n", ttyname, strerror(errno));
     #endif
    -                        return(-1);
    -                }
    -                time(&now);
    +			return(-1);
    +		}
    +		time(&now);
     #ifdef DEBUG
    -                printf("%s: now=%d atime=%d\n", devname, now,
    -                       st.st_atime);
    +		printf("%s: now=%d atime=%d\n", ttyname, now,
    +		       st.st_atime);
     #endif
    -                idle = now - st.st_atime;
    -                idle = (idle + 30) / 60; /* secs->mins */
    -        }
    -        if (idle < 0) idle = 0;
    +		idle = now - st.st_atime;
    +		idle = (idle + 30) / 60; /* secs->mins */
    +	}
     
    -        return(idle);
    +	return(idle);
     }
     
     static utmpidlearr *
    -do_names_2(int all)
    +do_names_2(void)
     {
    -        static utmpidlearr ut;
    -	struct utmp usr;
    -        int nusers = 0;
    +	static utmpidlearr ut;
    +	struct utmpx *usr;
    +	int nusers = 0;
     
    -        bzero((char *)&ut, sizeof(ut));
    -        ut.utmpidlearr_val = &utmp_idle[0];
    +	memset(&ut, 0, sizeof(ut));
    +	ut.utmpidlearr_val = &utmp_idle[0];
     
    -	ufp = fopen(_PATH_UTMP, "r");
    -        if (!ufp) {
    -                syslog(LOG_ERR, "%m");
    -                return(&ut);
    -        }
    +	setutxent();
    +	while ((usr = getutxent()) != NULL && nusers < MAXUSERS) {
    +		if (usr->ut_type != USER_PROCESS)
    +			continue;
     
    -        /* only entries with both name and line fields */
    -        while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1 &&
    -               nusers < MAXUSERS)
    -                if (*usr.ut_name && *usr.ut_line &&
    -		    strncmp(usr.ut_name, IGNOREUSER,
    -                            sizeof(usr.ut_name))
    -#ifdef OSF
    -                    && usr.ut_type == USER_PROCESS
    -#endif
    -                    ) {
    -                        utmp_idle[nusers].ui_utmp.ut_time =
    -                                usr.ut_time;
    -                        utmp_idle[nusers].ui_idle =
    -                                getidle(usr.ut_line, usr.ut_host);
    -                        utmp_idle[nusers].ui_utmp.ut_line = line[nusers];
    -                        strncpy(line[nusers], usr.ut_line, UT_LINESIZE);
    -                        utmp_idle[nusers].ui_utmp.ut_name = name[nusers];
    -                        strncpy(name[nusers], usr.ut_name, UT_NAMESIZE);
    -                        utmp_idle[nusers].ui_utmp.ut_host = host[nusers];
    -                        strncpy(host[nusers], usr.ut_host, UT_HOSTSIZE);
    +		memcpy(&utmp_list[nusers], usr, sizeof(*usr));
    +		utmp_idle[nusers].ui_utmp.ut_time = usr->ut_tv.tv_sec;
    +		utmp_idle[nusers].ui_idle =
    +		    getidle(usr->ut_line, usr->ut_host);
    +		utmp_idle[nusers].ui_utmp.ut_line =
    +		    utmp_list[nusers].ut_line;
    +		utmp_idle[nusers].ui_utmp.ut_name =
    +		    utmp_list[nusers].ut_user;
    +		utmp_idle[nusers].ui_utmp.ut_host =
    +		    utmp_list[nusers].ut_host;
     
    -			/* Make sure entries are NUL terminated */
    -			line[nusers][UT_LINESIZE] =
    -			name[nusers][UT_NAMESIZE] =
    -			host[nusers][UT_HOSTSIZE] = '\0';
    -                        nusers++;
    -                }
    +		nusers++;
    +	}
    +	endutxent();
     
    -        ut.utmpidlearr_len = nusers;
    -        fclose(ufp);
    -        return(&ut);
    +	ut.utmpidlearr_len = nusers;
    +	return(&ut);
     }
     
    -int *
    -rusers_num(void)
    +static int *
    +rusers_num(void *argp __unused, struct svc_req *rqstp __unused)
     {
    -        static int num_users = 0;
    -	struct utmp usr;
    -
    -        ufp = fopen(_PATH_UTMP, "r");
    -        if (!ufp) {
    -                syslog(LOG_ERR, "%m");
    -                return(NULL);
    -        }
    -
    -        /* only entries with both name and line fields */
    -        while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1)
    -                if (*usr.ut_name && *usr.ut_line &&
    -		    strncmp(usr.ut_name, IGNOREUSER,
    -                            sizeof(usr.ut_name))
    -#ifdef OSF
    -                    && usr.ut_type == USER_PROCESS
    -#endif
    -                    ) {
    -                        num_users++;
    -                }
    -
    -        fclose(ufp);
    -        return(&num_users);
    +	static int num_users = 0;
    +	struct utmpx *usr;
    + 
    +	setutxent();
    +	while ((usr = getutxent()) != NULL) {
    +		if (usr->ut_type != USER_PROCESS)
    +			continue;
    +		num_users++;
    +	}
    +	endutxent();
    + 
    +	return(&num_users);
     }
     
     static utmparr *
    -do_names_1(int all)
    +do_names_1(void)
     {
    -        utmpidlearr *utidle;
    -        static utmparr ut;
    -        int i;
    +	utmpidlearr *utidle;
    +	static utmparr ut;
    +	unsigned int i;
     
    -        bzero((char *)&ut, sizeof(ut));
    +	bzero((char *)&ut, sizeof(ut));
     
    -        utidle = do_names_2(all);
    -        if (utidle) {
    -                ut.utmparr_len = utidle->utmpidlearr_len;
    -                ut.utmparr_val = &old_utmp[0];
    -                for (i = 0; i < ut.utmparr_len; i++)
    -                        bcopy(&utmp_idle[i].ui_utmp, &old_utmp[i],
    -                              sizeof(old_utmp[0]));
    +	utidle = do_names_2();
    +	if (utidle) {
    +		ut.utmparr_len = utidle->utmpidlearr_len;
    +		ut.utmparr_val = &old_utmp[0];
    +		for (i = 0; i < ut.utmparr_len; i++)
    +			bcopy(&utmp_idle[i].ui_utmp, &old_utmp[i],
    +			      sizeof(old_utmp[0]));
     
    -        }
    +	}
     
    -        return(&ut);
    +	return(&ut);
     }
     
     utmpidlearr *
    -rusersproc_names_2_svc(void *argp, struct svc_req *rqstp)
    +rusersproc_names_2_svc(void *argp __unused, struct svc_req *rqstp __unused)
     {
    -        return(do_names_2(0));
    +
    +	return (do_names_2());
     }
     
     utmpidlearr *
    -rusersproc_allnames_2_svc(void *argp, struct svc_req *rqstp)
    +rusersproc_allnames_2_svc(void *argp __unused, struct svc_req *rqstp __unused)
     {
    -        return(do_names_2(1));
    +
    +	return (do_names_2());
     }
     
     utmparr *
    -rusersproc_names_1_svc(void *argp, struct svc_req *rqstp)
    +rusersproc_names_1_svc(void *argp __unused, struct svc_req *rqstp __unused)
     {
    -	return(do_names_1(0));
    +
    +	return (do_names_1());
     }
     
     utmparr *
    -rusersproc_allnames_1_svc(void *argp, struct svc_req *rqstp)
    +rusersproc_allnames_1_svc(void *argp __unused, struct svc_req *rqstp __unused)
     {
    -        return(do_names_1(1));
    +
    +	return (do_names_1());
     }
     
    +typedef void *(*rusersproc_t)(void *, struct svc_req *);
    +
     void
     rusers_service(struct svc_req *rqstp, SVCXPRT *transp)
     {
    @@ -318,8 +266,8 @@ rusers_service(struct svc_req *rqstp, SVCXPRT *transp)
     		int fill;
     	} argument;
     	char *result;
    -	bool_t (*xdr_argument)(), (*xdr_result)();
    -	char *(*local)();
    +	xdrproc_t xdr_argument, xdr_result;
    +	rusersproc_t local;
     
     	switch (rqstp->rq_proc) {
     	case NULLPROC:
    @@ -327,43 +275,43 @@ rusers_service(struct svc_req *rqstp, SVCXPRT *transp)
     		goto leave;
     
     	case RUSERSPROC_NUM:
    -		xdr_argument = xdr_void;
    -		xdr_result = xdr_int;
    -                local = (char *(*)()) rusers_num;
    +		xdr_argument = (xdrproc_t)xdr_void;
    +		xdr_result = (xdrproc_t)xdr_int;
    +		local = (rusersproc_t)rusers_num;
     		break;
     
     	case RUSERSPROC_NAMES:
    -		xdr_argument = xdr_void;
    -		xdr_result = xdr_utmpidlearr;
    -                switch (rqstp->rq_vers) {
    -                case RUSERSVERS_ORIG:
    -                        local = (char *(*)()) rusersproc_names_1_svc;
    -                        break;
    -                case RUSERSVERS_IDLE:
    -                        local = (char *(*)()) rusersproc_names_2_svc;
    -                        break;
    -                default:
    -                        svcerr_progvers(transp, RUSERSVERS_ORIG, RUSERSVERS_IDLE);
    -                        goto leave;
    -                        /*NOTREACHED*/
    -                }
    +		xdr_argument = (xdrproc_t)xdr_void;
    +		xdr_result = (xdrproc_t)xdr_utmpidlearr;
    +		switch (rqstp->rq_vers) {
    +		case RUSERSVERS_ORIG:
    +			local = (rusersproc_t)rusersproc_names_1_svc;
    +			break;
    +		case RUSERSVERS_IDLE:
    +			local = (rusersproc_t)rusersproc_names_2_svc;
    +			break;
    +		default:
    +			svcerr_progvers(transp, RUSERSVERS_ORIG, RUSERSVERS_IDLE);
    +			goto leave;
    +			/*NOTREACHED*/
    +		}
     		break;
     
     	case RUSERSPROC_ALLNAMES:
    -		xdr_argument = xdr_void;
    -		xdr_result = xdr_utmpidlearr;
    -                switch (rqstp->rq_vers) {
    -                case RUSERSVERS_ORIG:
    -                        local = (char *(*)()) rusersproc_allnames_1_svc;
    -                        break;
    -                case RUSERSVERS_IDLE:
    -                        local = (char *(*)()) rusersproc_allnames_2_svc;
    -                        break;
    -                default:
    -                        svcerr_progvers(transp, RUSERSVERS_ORIG, RUSERSVERS_IDLE);
    -                        goto leave;
    -                        /*NOTREACHED*/
    -                }
    +		xdr_argument = (xdrproc_t)xdr_void;
    +		xdr_result = (xdrproc_t)xdr_utmpidlearr;
    +		switch (rqstp->rq_vers) {
    +		case RUSERSVERS_ORIG:
    +			local = (rusersproc_t)rusersproc_allnames_1_svc;
    +			break;
    +		case RUSERSVERS_IDLE:
    +			local = (rusersproc_t)rusersproc_allnames_2_svc;
    +			break;
    +		default:
    +			svcerr_progvers(transp, RUSERSVERS_ORIG, RUSERSVERS_IDLE);
    +			goto leave;
    +			/*NOTREACHED*/
    +		}
     		break;
     
     	default:
    @@ -385,6 +333,6 @@ rusers_service(struct svc_req *rqstp, SVCXPRT *transp)
     		exit(1);
     	}
     leave:
    -        if (from_inetd)
    -                exit(0);
    +	if (from_inetd)
    +		exit(0);
     }
    diff --git a/libexec/rpc.rusersd/rusersd.c b/libexec/rpc.rusersd/rusersd.c
    index 1835e8e27aeb..009bbfde85e4 100644
    --- a/libexec/rpc.rusersd/rusersd.c
    +++ b/libexec/rpc.rusersd/rusersd.c
    @@ -41,50 +41,48 @@ static const char rcsid[] =
     #include 
     #include 
     #include 
    -#define utmp rutmp
     #include 
    -#undef utmp
     
     extern void rusers_service(struct svc_req *, SVCXPRT *);
     
     int from_inetd = 1;
     
    -void
    +static void
     cleanup(int sig __unused)
     {
    -        (void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
    -        (void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
    -        exit(0);
    +	(void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
    +	(void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
    +	exit(0);
     }
     
     int
    -main(int argc, char *argv[])
    +main(int argc __unused, char *argv[] __unused)
     {
    -	SVCXPRT *transp;
    +	SVCXPRT *transp = NULL; /* Keep compiler happy. */
     	int ok;
     	struct sockaddr_storage from;
     	socklen_t fromlen;
     
    -        /*
    -         * See if inetd started us
    -         */
    +	/*
    +	 * See if inetd started us
    +	 */
     	fromlen = sizeof(from);
    -        if (getsockname(0, (struct sockaddr *)&from, &fromlen) < 0) {
    -                from_inetd = 0;
    -        }
    +	if (getsockname(0, (struct sockaddr *)&from, &fromlen) < 0) {
    +		from_inetd = 0;
    +	}
     
    -        if (!from_inetd) {
    -                daemon(0, 0);
    +	if (!from_inetd) {
    +		daemon(0, 0);
     
    -                (void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
    -                (void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
    +		(void) rpcb_unset(RUSERSPROG, RUSERSVERS_IDLE, NULL);
    +		(void) rpcb_unset(RUSERSPROG, RUSERSVERS_ORIG, NULL);
     
     		(void) signal(SIGINT, cleanup);
     		(void) signal(SIGTERM, cleanup);
     		(void) signal(SIGHUP, cleanup);
    -        }
    +	}
     
    -        openlog("rpc.rusersd", LOG_CONS|LOG_PID, LOG_DAEMON);
    +	openlog("rpc.rusersd", LOG_CONS|LOG_PID, LOG_DAEMON);
     
     	if (from_inetd) {
     		transp = svc_tli_create(0, NULL, NULL, 0, 0);
    @@ -112,7 +110,7 @@ main(int argc, char *argv[])
     		exit(1);
     	}
     
    -        svc_run();
    +	svc_run();
     	syslog(LOG_ERR, "svc_run returned");
     	exit(1);
     }
    diff --git a/libexec/rpc.rwalld/Makefile b/libexec/rpc.rwalld/Makefile
    index 83182e904b3e..b09d66358556 100644
    --- a/libexec/rpc.rwalld/Makefile
    +++ b/libexec/rpc.rwalld/Makefile
    @@ -7,4 +7,6 @@ MAN =	rpc.rwalld.8
     DPADD=	${LIBUTIL}
     LDADD=	-lutil
     
    +WARNS?=	2
    +
     .include 
    diff --git a/libexec/rpc.sprayd/Makefile b/libexec/rpc.sprayd/Makefile
    index 1dd582de0082..5b1cb241c258 100644
    --- a/libexec/rpc.sprayd/Makefile
    +++ b/libexec/rpc.sprayd/Makefile
    @@ -7,5 +7,6 @@ MAN =	rpc.sprayd.8
     DPADD=	${LIBRPCSVC}
     LDADD=	-lrpcsvc
     
    -.include 
    +WARNS?=	2
     
    +.include 
    diff --git a/libexec/rshd/Makefile b/libexec/rshd/Makefile
    index 155314ad611f..f6881e8e1c57 100644
    --- a/libexec/rshd/Makefile
    +++ b/libexec/rshd/Makefile
    @@ -4,6 +4,7 @@
     PROG=	rshd
     MAN=	rshd.8
     
    +WARNS?=	3
     WFORMAT=0
     
     DPADD=	${LIBUTIL} ${LIBPAM}
    diff --git a/libexec/rtld-aout/shlib.c b/libexec/rtld-aout/shlib.c
    index 39ec792a72c9..f2c74a4e9a8c 100644
    --- a/libexec/rtld-aout/shlib.c
    +++ b/libexec/rtld-aout/shlib.c
    @@ -82,8 +82,7 @@ add_search_dir(const char *name)
     }
     
     void
    -add_search_path(path)
    -char	*path;
    +add_search_path(char *path)
     {
     	register char	*cp, *dup;
     
    @@ -98,7 +97,7 @@ char	*path;
     }
     
     void
    -std_search_path()
    +std_search_path(void)
     {
     	int	i, n;
     
    @@ -115,9 +114,7 @@ std_search_path()
      */
     
     int
    -getdewey(dewey, cp)
    -int	dewey[];
    -char	*cp;
    +getdewey(int dewey[], char *cp)
     {
     	int	i, n;
     
    @@ -142,9 +139,7 @@ char	*cp;
      * Return  0 if equal.
      */
     int
    -cmpndewey(d1, n1, d2, n2)
    -int	d1[], d2[];
    -int	n1, n2;
    +cmpndewey(int d1[], int n1, int d2[], int n2)
     {
     	register int	i;
     
    @@ -185,10 +180,7 @@ int	n1, n2;
      */
     
     char *
    -findshlib(name, majorp, minorp, do_dot_a)
    -char	*name;
    -int	*majorp, *minorp;
    -int	do_dot_a;
    +findshlib(char *name, int *majorp, int *minorp, int do_dot_a)
     {
     	int		i;
     
    @@ -212,8 +204,7 @@ int	do_dot_a;
      */
     
     char *
    -find_lib_file(name)
    -	const char	*name;
    +find_lib_file(const char *name)
     {
     	int		i;
     
    @@ -261,12 +252,7 @@ find_lib_file(name)
      */
     
     char *
    -search_lib_dir(dir, name, majorp, minorp, do_dot_a)
    -	char		*dir;
    -	char		*name;
    -	int		*majorp;
    -	int		*minorp;
    -	int		do_dot_a;
    +search_lib_dir(char *dir, char *name, int *majorp, int *minorp, int do_dot_a)
     {
     	size_t		namelen;
     	DIR		*dd;
    diff --git a/libexec/rtld-aout/support.c b/libexec/rtld-aout/support.c
    index 71a84ffa1299..eb8bd29673ec 100644
    --- a/libexec/rtld-aout/support.c
    +++ b/libexec/rtld-aout/support.c
    @@ -38,8 +38,7 @@
     #include "support.h"
     
     char *
    -concat(s1, s2, s3)
    -	const char *s1, *s2, *s3;
    +concat(const char *s1, const char *s2, const char *s3)
     {
     	int len = 1;
     	char *s;
    @@ -61,8 +60,7 @@ concat(s1, s2, s3)
     }
     
     void *
    -xmalloc(n)
    -	size_t n;
    +xmalloc(size_t n)
     {
     	char *p = malloc(n);
     
    @@ -73,9 +71,7 @@ xmalloc(n)
     }
     
     void *
    -xrealloc(p, n)
    -	void *p;
    -	size_t n;
    +xrealloc(void *p, size_t n)
     {
     	p = realloc(p, n);
     
    diff --git a/libexec/rtld-elf/Makefile b/libexec/rtld-elf/Makefile
    index 5e9729c68bde..d6df617d424d 100644
    --- a/libexec/rtld-elf/Makefile
    +++ b/libexec/rtld-elf/Makefile
    @@ -12,6 +12,7 @@ CSTD?=		gnu99
     CFLAGS+=	-Wall -DFREEBSD_ELF -DIN_RTLD
     CFLAGS+=	-I${.CURDIR}/${MACHINE_ARCH} -I${.CURDIR}
     LDFLAGS+=	-nostdlib -e .rtld_start
    +WARNS?=		2
     INSTALLFLAGS=	-C -b
     PRECIOUSPROG=
     BINDIR=		/libexec
    diff --git a/libexec/rtld-elf/arm/rtld_start.S b/libexec/rtld-elf/arm/rtld_start.S
    index da22c57317ea..b9de767d362e 100644
    --- a/libexec/rtld-elf/arm/rtld_start.S
    +++ b/libexec/rtld-elf/arm/rtld_start.S
    @@ -15,13 +15,6 @@
      * 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. All advertising materials mentioning features or use of this software
    - *    must display the following acknowledgement:
    - *        This product includes software developed by the NetBSD
    - *        Foundation, Inc. and its contributors.
    - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
      * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c
    index 6de0c9e1a3d0..d231830b351d 100644
    --- a/libexec/rtld-elf/map_object.c
    +++ b/libexec/rtld-elf/map_object.c
    @@ -273,7 +273,7 @@ get_elf_header (int fd, const char *path)
         } u;
         ssize_t nbytes;
     
    -    if ((nbytes = read(fd, u.buf, PAGE_SIZE)) == -1) {
    +    if ((nbytes = pread(fd, u.buf, PAGE_SIZE, 0)) == -1) {
     	_rtld_error("%s: read error: %s", path, strerror(errno));
     	return NULL;
         }
    diff --git a/libexec/rtld-elf/powerpc/reloc.c b/libexec/rtld-elf/powerpc/reloc.c
    index 22524283bc18..ccdcd90de244 100644
    --- a/libexec/rtld-elf/powerpc/reloc.c
    +++ b/libexec/rtld-elf/powerpc/reloc.c
    @@ -47,6 +47,13 @@
                             ((u_int32_t)(x) + 0x10000) : (u_int32_t)(x)) >> 16)
     #define _ppc_la(x) ((u_int32_t)(x) & 0xffff)
     
    +#define min(a,b) (((a) < (b)) ? (a) : (b))
    +#define max(a,b) (((a) > (b)) ? (a) : (b))
    +
    +#define PLT_EXTENDED_BEGIN	(1 << 13)
    +#define JMPTAB_BASE(N)		(18 + N*2 + ((N > PLT_EXTENDED_BEGIN) ? \
    +				    (N - PLT_EXTENDED_BEGIN)*2 : 0))
    +
     /*
      * Process the R_PPC_COPY relocations
      */
    @@ -313,7 +320,6 @@ done:
     	return (r);
     }
     
    -
     /*
      * Initialise a PLT slot to the resolving trampoline
      */
    @@ -321,27 +327,43 @@ static int
     reloc_plt_object(Obj_Entry *obj, const Elf_Rela *rela)
     {
     	Elf_Word *where = (Elf_Word *)(obj->relocbase + rela->r_offset);
    -	Elf_Addr *pltresolve;
    +	Elf_Addr *pltresolve, *pltlongresolve, *jmptab;
     	Elf_Addr distance;
    +	int N = obj->pltrelasize / sizeof(Elf_Rela);
     	int reloff;
     
     	reloff = rela - obj->pltrela;
     
    -	if ((reloff < 0) || (reloff >= 0x8000)) {
    +	if (reloff < 0)
     		return (-1);
    -	}
     
    -	pltresolve = obj->pltgot + 8;
    +	pltlongresolve = obj->pltgot + 5;
    +	pltresolve = pltlongresolve + 5;
     
     	distance = (Elf_Addr)pltresolve - (Elf_Addr)(where + 1);
     
     	dbg(" reloc_plt_object: where=%p,pltres=%p,reloff=%x,distance=%x",
     	    (void *)where, (void *)pltresolve, reloff, distance);
     
    -	/* li   r11,reloff  */
    -	/* b    pltresolve  */
    -	where[0] = 0x39600000 | reloff;
    -	where[1] = 0x48000000 | (distance & 0x03fffffc);
    +	if (reloff < PLT_EXTENDED_BEGIN) {
    +		/* li   r11,reloff  */
    +		/* b    pltresolve  */
    +		where[0] = 0x39600000 | reloff;
    +		where[1] = 0x48000000 | (distance & 0x03fffffc);
    +	} else {
    +		jmptab = obj->pltgot + JMPTAB_BASE(N);
    +		jmptab[reloff] = (u_int)pltlongresolve;
    +
    +		/* lis	r11,jmptab[reloff]@ha */
    +		/* lwzu	r12,jmptab[reloff]@l(r11) */
    +		/* mtctr r12 */
    +		/* bctr */
    +		where[0] = 0x3d600000 | _ppc_ha(&jmptab[reloff]);
    +		where[1] = 0x858b0000 | _ppc_la(&jmptab[reloff]);
    +		where[2] = 0x7d8903a6;
    +		where[3] = 0x4e800420;
    +	}
    +		
     
     	/*
     	 * The icache will be sync'd in init_pltgot, which is called
    @@ -453,25 +475,28 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
     		int N = obj->pltrelasize / sizeof(Elf_Rela);
     		int reloff = rela - obj->pltrela;
     
    -		if ((reloff < 0) || (reloff >= 0x8000)) {
    +		if (reloff < 0)
     			return (-1);
    -		}
     
     		pltcall = obj->pltgot;
     
    -		dbg(" reloc_jmpslot: indir, reloff=%d, N=%d\n",
    +		dbg(" reloc_jmpslot: indir, reloff=%x, N=%x\n",
     		    reloff, N);
     
    -		jmptab = obj->pltgot + 18 + N * 2;
    +		jmptab = obj->pltgot + JMPTAB_BASE(N);
     		jmptab[reloff] = target;
     
    -		distance = (Elf_Addr)pltcall - (Elf_Addr)(wherep + 1);
    +		if (reloff < PLT_EXTENDED_BEGIN) {
    +			/* for extended PLT entries, we keep the old code */
     
    -		/* li   r11,reloff */
    -		/* b    pltcall  # use indirect pltcall routine */
    -		wherep[0] = 0x39600000 | reloff;
    -		wherep[1] = 0x48000000 | (distance & 0x03fffffc);
    -		__syncicache(wherep, 8);
    +			distance = (Elf_Addr)pltcall - (Elf_Addr)(wherep + 1);
    +
    +			/* li   r11,reloff */
    +			/* b    pltcall  # use indirect pltcall routine */
    +			wherep[0] = 0x39600000 | reloff;
    +			wherep[1] = 0x48000000 | (distance & 0x03fffffc);
    +			__syncicache(wherep, 8);
    +		}
     	}
     
     	return (target);
    @@ -481,13 +506,14 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *defobj,
     /*
      * Setup the plt glue routines.
      */
    -#define PLTCALL_SIZE    20
    -#define PLTRESOLVE_SIZE 24
    +#define PLTCALL_SIZE	   	20
    +#define PLTLONGRESOLVE_SIZE	20
    +#define PLTRESOLVE_SIZE		24
     
     void
     init_pltgot(Obj_Entry *obj)
     {
    -	Elf_Word *pltcall, *pltresolve;
    +	Elf_Word *pltcall, *pltresolve, *pltlongresolve;
     	Elf_Word *jmptab;
     	int N = obj->pltrelasize / sizeof(Elf_Rela);
     
    @@ -524,18 +550,27 @@ init_pltgot(Obj_Entry *obj)
     	 * of the jumptable into the absolute-call assembler code so it
     	 * can determine this address.
     	 */
    -	jmptab = pltcall + 18 + N * 2;
    +	jmptab = obj->pltgot + JMPTAB_BASE(N);
     	pltcall[1] |= _ppc_ha(jmptab);	   /* addis 11,11,jmptab@ha */
     	pltcall[2] |= _ppc_la(jmptab);     /* lwz   11,jmptab@l(11) */
     
     	/*
    -	 * Skip down 32 bytes into the initial reserved area and copy
    +	 * Skip down 20 bytes into the initial reserved area and copy
     	 * in the standard resolving assembler call. Into this assembler,
     	 * insert the absolute address of the _rtld_bind_start routine
     	 * and the address of the relocation object.
    +	 *
    +	 * We place pltlongresolve first, so it can fix up its arguments
    +	 * and then fall through to the regular PLT resolver.
     	 */
    -	pltresolve = obj->pltgot + 8;
    +	pltlongresolve = obj->pltgot + 5;
     
    +	memcpy(pltlongresolve, _rtld_powerpc_pltlongresolve,
    +	    PLTLONGRESOLVE_SIZE);
    +	pltlongresolve[0] |= _ppc_ha(jmptab);	/* lis	12,jmptab@ha	*/
    +	pltlongresolve[1] |= _ppc_la(jmptab);	/* addi	12,12,jmptab@l	*/
    +
    +	pltresolve = pltlongresolve + PLTLONGRESOLVE_SIZE/sizeof(uint32_t);
     	memcpy(pltresolve, _rtld_powerpc_pltresolve, PLTRESOLVE_SIZE);
     	pltresolve[0] |= _ppc_ha(_rtld_bind_start);
     	pltresolve[1] |= _ppc_la(_rtld_bind_start);
    diff --git a/libexec/rtld-elf/powerpc/rtld_machdep.h b/libexec/rtld-elf/powerpc/rtld_machdep.h
    index f5f21a41fad8..bf589c5728f6 100644
    --- a/libexec/rtld-elf/powerpc/rtld_machdep.h
    +++ b/libexec/rtld-elf/powerpc/rtld_machdep.h
    @@ -57,6 +57,7 @@ void _rtld_bind_start(void);
      * PLT functions. Not really correct prototypes, but the
      * symbol values are needed.
      */
    +void _rtld_powerpc_pltlongresolve(void);
     void _rtld_powerpc_pltresolve(void);
     void _rtld_powerpc_pltcall(void);
     
    diff --git a/libexec/rtld-elf/powerpc/rtld_start.S b/libexec/rtld-elf/powerpc/rtld_start.S
    index 86f76e6d282a..00692d284e93 100644
    --- a/libexec/rtld-elf/powerpc/rtld_start.S
    +++ b/libexec/rtld-elf/powerpc/rtld_start.S
    @@ -163,6 +163,12 @@ _ENTRY(_rtld_bind_start)
      * The ELF object is shifted into %r11, and _rtld_bind_start is called
      * to complete the binding.
      */
    +_ENTRY(_rtld_powerpc_pltlongresolve)
    +	lis	%r12,0			# lis	12,jmptab@ha
    +	addi    %r12,%r12,0		# addi  12,12,jmptab@l
    +	subf	%r11,%r12,%r11		# reloff
    +	li	%r12,2
    +	srw	%r11,%r11,%r12		# index = reloff/sizeof(Elf_Addr)
     _ENTRY(_rtld_powerpc_pltresolve)
             lis     %r12,0			# lis   12,_rtld_bind_start@ha
             addi    %r12,%r12,0		# addi  12,12,_rtld_bind_start@l
    diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
    index 721fe8967eb6..d91dcee51a71 100644
    --- a/libexec/rtld-elf/rtld.c
    +++ b/libexec/rtld-elf/rtld.c
    @@ -87,7 +87,7 @@ static void die(void) __dead2;
     static void digest_dynamic(Obj_Entry *, int);
     static Obj_Entry *digest_phdr(const Elf_Phdr *, int, caddr_t, const char *);
     static Obj_Entry *dlcheck(void *);
    -static Obj_Entry *do_load_object(int, const char *, char *, struct stat *);
    +static Obj_Entry *do_load_object(int, const char *, char *, struct stat *, int);
     static int do_search_info(const Obj_Entry *obj, int, struct dl_serinfo *);
     static bool donelist_check(DoneList *, const Obj_Entry *);
     static void errmsg_restore(char *);
    @@ -103,7 +103,7 @@ static void initlist_add_objects(Obj_Entry *, Obj_Entry **, Objlist *);
     static bool is_exported(const Elf_Sym *);
     static void linkmap_add(Obj_Entry *);
     static void linkmap_delete(Obj_Entry *);
    -static int load_needed_objects(Obj_Entry *);
    +static int load_needed_objects(Obj_Entry *, int);
     static int load_preload_objects(void);
     static Obj_Entry *load_object(const char *, const Obj_Entry *, int);
     static Obj_Entry *obj_from_addr(const void *);
    @@ -366,12 +366,12 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
          * future processes to honor the potentially un-safe variables.
          */
         if (!trust) {
    -        unsetenv(LD_ "PRELOAD");
    -        unsetenv(LD_ "LIBMAP");
    -        unsetenv(LD_ "LIBRARY_PATH");
    -        unsetenv(LD_ "LIBMAP_DISABLE");
    -        unsetenv(LD_ "DEBUG");
    -        unsetenv(LD_ "ELF_HINTS_PATH");
    +        if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP") ||
    +	    unsetenv(LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||
    +	    unsetenv(LD_ "DEBUG") || unsetenv(LD_ "ELF_HINTS_PATH")) {
    +		_rtld_error("environment corrupt; aborting");
    +		die();
    +	}
         }
         ld_debug = getenv(LD_ "DEBUG");
         libmap_disable = getenv(LD_ "LIBMAP_DISABLE") != NULL;
    @@ -474,6 +474,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
         /* Initialize a fake symbol for resolving undefined weak references. */
         sym_zero.st_info = ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE);
         sym_zero.st_shndx = SHN_UNDEF;
    +    sym_zero.st_value = -(uintptr_t)obj_main->relocbase;
     
         if (!libmap_disable)
             libmap_disable = (bool)lm_init(libmap_override);
    @@ -484,7 +485,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
         preload_tail = obj_tail;
     
         dbg("loading needed objects");
    -    if (load_needed_objects(obj_main) == -1)
    +    if (load_needed_objects(obj_main, 0) == -1)
     	die();
     
         /* Make a list of all objects loaded at startup. */
    @@ -897,7 +898,7 @@ digest_dynamic(Obj_Entry *obj, int early)
     #endif
     
     	case DT_FLAGS:
    -		if ((dynp->d_un.d_val & DF_1_ORIGIN) && trust)
    +		if ((dynp->d_un.d_val & DF_ORIGIN) && trust)
     		    obj->z_origin = true;
     		if (dynp->d_un.d_val & DF_SYMBOLIC)
     		    obj->symbolic = true;
    @@ -931,6 +932,8 @@ digest_dynamic(Obj_Entry *obj, int early)
     #endif
     
     	case DT_FLAGS_1:
    +		if (dynp->d_un.d_val & DF_1_NOOPEN)
    +		    obj->z_noopen = true;
     		if ((dynp->d_un.d_val & DF_1_ORIGIN) && trust)
     		    obj->z_origin = true;
     		if (dynp->d_un.d_val & DF_1_GLOBAL)
    @@ -990,27 +993,27 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
         int nsegs = 0;
     
         obj = obj_new();
    +    for (ph = phdr;  ph < phlimit;  ph++) {
    +	if (ph->p_type != PT_PHDR)
    +	    continue;
    +
    +	obj->phdr = phdr;
    +	obj->phsize = ph->p_memsz;
    +	obj->relocbase = (caddr_t)phdr - ph->p_vaddr;
    +	break;
    +    }
    +
         for (ph = phdr;  ph < phlimit;  ph++) {
     	switch (ph->p_type) {
     
    -	case PT_PHDR:
    -	    if ((const Elf_Phdr *)ph->p_vaddr != phdr) {
    -		_rtld_error("%s: invalid PT_PHDR", path);
    -		return NULL;
    -	    }
    -	    obj->phdr = (const Elf_Phdr *) ph->p_vaddr;
    -	    obj->phsize = ph->p_memsz;
    -	    break;
    -
     	case PT_INTERP:
    -	    obj->interp = (const char *) ph->p_vaddr;
    +	    obj->interp = (const char *)(ph->p_vaddr + obj->relocbase);
     	    break;
     
     	case PT_LOAD:
     	    if (nsegs == 0) {	/* First load segment */
     		obj->vaddrbase = trunc_page(ph->p_vaddr);
    -		obj->mapbase = (caddr_t) obj->vaddrbase;
    -		obj->relocbase = obj->mapbase - obj->vaddrbase;
    +		obj->mapbase = obj->vaddrbase + obj->relocbase;
     		obj->textsize = round_page(ph->p_vaddr + ph->p_memsz) -
     		  obj->vaddrbase;
     	    } else {		/* Last load segment */
    @@ -1021,7 +1024,7 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
     	    break;
     
     	case PT_DYNAMIC:
    -	    obj->dynamic = (const Elf_Dyn *) ph->p_vaddr;
    +	    obj->dynamic = (const Elf_Dyn *)(ph->p_vaddr + obj->relocbase);
     	    break;
     
     	case PT_TLS:
    @@ -1029,7 +1032,7 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path)
     	    obj->tlssize = ph->p_memsz;
     	    obj->tlsalign = ph->p_align;
     	    obj->tlsinitsize = ph->p_filesz;
    -	    obj->tlsinit = (void*) ph->p_vaddr;
    +	    obj->tlsinit = (void*)(ph->p_vaddr + obj->relocbase);
     	    break;
     	}
         }
    @@ -1424,7 +1427,7 @@ is_exported(const Elf_Sym *def)
      * returns -1 on failure.
      */
     static int
    -load_needed_objects(Obj_Entry *first)
    +load_needed_objects(Obj_Entry *first, int flags)
     {
         Obj_Entry *obj, *obj1;
     
    @@ -1433,7 +1436,7 @@ load_needed_objects(Obj_Entry *first)
     
     	for (needed = obj->needed;  needed != NULL;  needed = needed->next) {
     	    obj1 = needed->obj = load_object(obj->strtab + needed->name, obj,
    -		false);
    +		flags & ~RTLD_LO_NOLOAD);
     	    if (obj1 == NULL && !ld_tracing)
     		return -1;
     	    if (obj1 != NULL && obj1->z_nodelete && !obj1->ref_nodel) {
    @@ -1464,7 +1467,7 @@ load_preload_objects(void)
     
     	savech = p[len];
     	p[len] = '\0';
    -	if (load_object(p, NULL, false) == NULL)
    +	if (load_object(p, NULL, 0) == NULL)
     	    return -1;	/* XXX - cleanup */
     	p[len] = savech;
     	p += len;
    @@ -1481,7 +1484,7 @@ load_preload_objects(void)
      * on failure.
      */
     static Obj_Entry *
    -load_object(const char *name, const Obj_Entry *refobj, int noload)
    +load_object(const char *name, const Obj_Entry *refobj, int flags)
     {
         Obj_Entry *obj;
         int fd = -1;
    @@ -1527,11 +1530,11 @@ load_object(const char *name, const Obj_Entry *refobj, int noload)
     	close(fd);
     	return obj;
         }
    -    if (noload)
    +    if (flags & RTLD_LO_NOLOAD)
     	return (NULL);
     
         /* First use of this object, so we must map it in */
    -    obj = do_load_object(fd, name, path, &sb);
    +    obj = do_load_object(fd, name, path, &sb, flags);
         if (obj == NULL)
     	free(path);
         close(fd);
    @@ -1540,7 +1543,8 @@ load_object(const char *name, const Obj_Entry *refobj, int noload)
     }
     
     static Obj_Entry *
    -do_load_object(int fd, const char *name, char *path, struct stat *sbp)
    +do_load_object(int fd, const char *name, char *path, struct stat *sbp,
    +  int flags)
     {
         Obj_Entry *obj;
         struct statfs fs;
    @@ -1567,6 +1571,14 @@ do_load_object(int fd, const char *name, char *path, struct stat *sbp)
         object_add_name(obj, name);
         obj->path = path;
         digest_dynamic(obj, 0);
    +    if (obj->z_noopen && (flags & (RTLD_LO_DLOPEN | RTLD_LO_TRACE)) ==
    +      RTLD_LO_DLOPEN) {
    +	dbg("refusing to load non-loadable \"%s\"", obj->path);
    +	_rtld_error("Cannot dlopen non-loadable %s", obj->path);
    +	munmap(obj->mapbase, obj->mapsize);
    +	obj_free(obj);
    +	return (NULL);
    +    }
     
         *obj_tail = obj;
         obj_tail = &obj->next;
    @@ -1985,14 +1997,18 @@ dlopen(const char *name, int mode)
         Obj_Entry **old_obj_tail;
         Obj_Entry *obj;
         Objlist initlist;
    -    int result, lockstate, nodelete, noload;
    +    int result, lockstate, nodelete, lo_flags;
     
         LD_UTRACE(UTRACE_DLOPEN_START, NULL, NULL, 0, mode, name);
         ld_tracing = (mode & RTLD_TRACE) == 0 ? NULL : "1";
         if (ld_tracing != NULL)
     	environ = (char **)*get_program_var_addr("environ");
         nodelete = mode & RTLD_NODELETE;
    -    noload = mode & RTLD_NOLOAD;
    +    lo_flags = RTLD_LO_DLOPEN;
    +    if (mode & RTLD_NOLOAD)
    +	    lo_flags |= RTLD_LO_NOLOAD;
    +    if (ld_tracing != NULL)
    +	    lo_flags |= RTLD_LO_TRACE;
     
         objlist_init(&initlist);
     
    @@ -2005,7 +2021,7 @@ dlopen(const char *name, int mode)
     	obj = obj_main;
     	obj->refcount++;
         } else {
    -	obj = load_object(name, obj_main, noload);
    +	obj = load_object(name, obj_main, lo_flags);
         }
     
         if (obj) {
    @@ -2015,7 +2031,7 @@ dlopen(const char *name, int mode)
     	mode &= RTLD_MODEMASK;
     	if (*old_obj_tail != NULL) {		/* We loaded something new. */
     	    assert(*old_obj_tail == obj);
    -	    result = load_needed_objects(obj);
    +	    result = load_needed_objects(obj, RTLD_LO_DLOPEN);
     	    init_dag(obj);
     	    if (result != -1)
     		result = rtld_verify_versions(&obj->dagmembers);
    @@ -3135,13 +3151,13 @@ allocate_tls(Obj_Entry *objs, void *oldtcb, size_t tcbsize, size_t tcbalign)
     	dtv[1] = tls_max_index;
     
     	for (obj = objs; obj; obj = obj->next) {
    -	    if (obj->tlsoffset) {
    +	    if (obj->tlsoffset > 0) {
     		addr = (Elf_Addr)tls + obj->tlsoffset;
    -		memset((void*) (addr + obj->tlsinitsize),
    -		       0, obj->tlssize - obj->tlsinitsize);
    -		if (obj->tlsinit)
    -		    memcpy((void*) addr, obj->tlsinit,
    -			   obj->tlsinitsize);
    +		if (obj->tlsinitsize > 0)
    +		    memcpy((void*) addr, obj->tlsinit, obj->tlsinitsize);
    +		if (obj->tlssize > obj->tlsinitsize)
    +		    memset((void*) (addr + obj->tlsinitsize), 0,
    +			   obj->tlssize - obj->tlsinitsize);
     		dtv[obj->tlsindex + 1] = addr;
     	    }
     	}
    @@ -3341,21 +3357,18 @@ allocate_tls_offset(Obj_Entry *obj)
     void
     free_tls_offset(Obj_Entry *obj)
     {
    -#if defined(__i386__) || defined(__amd64__) || defined(__sparc64__) || \
    -    defined(__arm__) || defined(__mips__)
    +
         /*
          * If we were the last thing to allocate out of the static TLS
          * block, we give our space back to the 'allocator'. This is a
          * simplistic workaround to allow libGL.so.1 to be loaded and
    -     * unloaded multiple times. We only handle the Variant II
    -     * mechanism for now - this really needs a proper allocator.
    +     * unloaded multiple times.
          */
         if (calculate_tls_end(obj->tlsoffset, obj->tlssize)
     	== calculate_tls_end(tls_last_offset, tls_last_size)) {
     	tls_last_offset -= obj->tlssize;
     	tls_last_size = 0;
         }
    -#endif
     }
     
     void *
    @@ -3424,7 +3437,7 @@ locate_dependency(const Obj_Entry *obj, const char *name)
     	if (object_match_name(needed->obj, name))
     	    return needed->obj;
         }
    -    _rtld_error("%s: Unexpected  inconsistency: dependency %s not found",
    +    _rtld_error("%s: Unexpected inconsistency: dependency %s not found",
     	obj->path, name);
         die();
     }
    diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h
    index 06086b4b92e3..875e84bc7e63 100644
    --- a/libexec/rtld-elf/rtld.h
    +++ b/libexec/rtld-elf/rtld.h
    @@ -218,6 +218,7 @@ typedef struct Struct_Obj_Entry {
         bool phdr_alloc : 1;	/* Phdr is allocated and needs to be freed. */
         bool z_origin : 1;		/* Process rpath and soname tokens */
         bool z_nodelete : 1;	/* Do not unload the object and dependencies */
    +    bool z_noopen : 1;		/* Do not load on dlopen */
         bool ref_nodel : 1;		/* Refcount increased to prevent dlclose */
         bool init_scanned: 1;	/* Object is already on init list. */
         bool on_fini_list: 1;	/* Object is already on fini list. */
    @@ -240,6 +241,11 @@ typedef struct Struct_Obj_Entry {
     #define SYMLOOK_DLSYM	0x02	/* Return newes versioned symbol. Used by
     				   dlsym. */
     
    +/* Flags for load_object(). */
    +#define	RTLD_LO_NOLOAD	0x01	/* dlopen() specified RTLD_NOLOAD. */
    +#define	RTLD_LO_DLOPEN	0x02	/* Load_object() called from dlopen(). */
    +#define	RTLD_LO_TRACE	0x04	/* Only tracing. */
    +
     /*
      * Symbol cache entry used during relocation to avoid multiple lookups
      * of the same symbol.
    diff --git a/libexec/smrsh/Makefile b/libexec/smrsh/Makefile
    index 6fd2801f780d..ae86155d0d00 100644
    --- a/libexec/smrsh/Makefile
    +++ b/libexec/smrsh/Makefile
    @@ -15,6 +15,8 @@ LIBSM=		${LIBSMDIR}/libsm.a
     DPADD=	${LIBSM}
     LDADD=	${LIBSM}
     
    +WARNS?=	2
    +
     SRCS+=	sm_os.h
     CLEANFILES+=sm_os.h
     
    diff --git a/libexec/talkd/Makefile b/libexec/talkd/Makefile
    index aa6df1bb9b67..cc0c5977fb7d 100644
    --- a/libexec/talkd/Makefile
    +++ b/libexec/talkd/Makefile
    @@ -6,6 +6,5 @@ SRCS=	talkd.c announce.c process.c table.c print.c ttymsg.c
     .PATH:  ${.CURDIR}/../../usr.bin/wall
     MAN=	talkd.8
     CFLAGS+=-I${.CURDIR}/../../usr.bin/wall
    -WFORMAT=0
     
     .include 
    diff --git a/libexec/talkd/process.c b/libexec/talkd/process.c
    index d77f8a168bf4..18ddc42aff1f 100644
    --- a/libexec/talkd/process.c
    +++ b/libexec/talkd/process.c
    @@ -59,6 +59,7 @@ static const char rcsid[] =
     #include 
     #include 
     #include 
    +#include 
     
     #include "extern.h"
     
    @@ -153,8 +154,8 @@ do_announce(CTL_MSG *mp, CTL_RESPONSE *rp)
     		rp->answer = result;
     		return;
     	}
    -#define	satosin(sa)	((struct sockaddr_in *)(sa))
    -	hp = gethostbyaddr((char *)&satosin(&mp->ctl_addr)->sin_addr,
    +#define	satosin(sa)	((struct sockaddr_in *)(void *)(sa))
    +	hp = gethostbyaddr(&satosin(&mp->ctl_addr)->sin_addr,
     		sizeof (struct in_addr), AF_INET);
     	if (hp == (struct hostent *)0) {
     		rp->answer = MACHINE_UNKNOWN;
    @@ -181,55 +182,46 @@ do_announce(CTL_MSG *mp, CTL_RESPONSE *rp)
     	}
     }
     
    -#include 
    -
     /*
      * Search utmp for the local user
      */
     int
     find_user(const char *name, char *tty)
     {
    -	struct utmp ubuf;
    +	struct utmpx *ut;
     	int status;
    -	FILE *fd;
     	struct stat statb;
     	time_t best = 0;
    -	char line[sizeof(ubuf.ut_line) + 1];
    -	char ftty[sizeof(_PATH_DEV) - 1 + sizeof(line)];
    +	char ftty[sizeof(_PATH_DEV) - 1 + sizeof(ut->ut_line)];
     
    -	if ((fd = fopen(_PATH_UTMP, "r")) == NULL) {
    -		warnx("can't read %s", _PATH_UTMP);
    -		return (FAILED);
    -	}
    -#define SCMPN(a, b)	strncmp(a, b, sizeof (a))
    +	setutxent();
     	status = NOT_HERE;
     	(void) strcpy(ftty, _PATH_DEV);
    -	while (fread((char *) &ubuf, sizeof ubuf, 1, fd) == 1)
    -		if (SCMPN(ubuf.ut_name, name) == 0) {
    -			strncpy(line, ubuf.ut_line, sizeof(ubuf.ut_line));
    -			line[sizeof(ubuf.ut_line)] = '\0';
    +	while ((ut = getutxent()) != NULL)
    +		if (ut->ut_type == USER_PROCESS &&
    +		    strcmp(ut->ut_user, name) == 0) {
     			if (*tty == '\0' || best != 0) {
     				if (best == 0)
     					status = PERMISSION_DENIED;
     				/* no particular tty was requested */
     				(void) strcpy(ftty + sizeof(_PATH_DEV) - 1,
    -				    line);
    +				    ut->ut_line);
     				if (stat(ftty, &statb) == 0) {
     					if (!(statb.st_mode & 020))
     						continue;
     					if (statb.st_atime > best) {
     						best = statb.st_atime;
    -						(void) strcpy(tty, line);
    +						(void) strcpy(tty, ut->ut_line);
     						status = SUCCESS;
     						continue;
     					}
     				}
     			}
    -			if (strcmp(line, tty) == 0) {
    +			if (strcmp(ut->ut_line, tty) == 0) {
     				status = SUCCESS;
     				break;
     			}
     		}
    -	fclose(fd);
    +	endutxent();
     	return (status);
     }
    diff --git a/libexec/tcpd/Makefile b/libexec/tcpd/Makefile
    index 6bb6080e3a33..e707a4e334e8 100644
    --- a/libexec/tcpd/Makefile
    +++ b/libexec/tcpd/Makefile
    @@ -18,4 +18,6 @@ CFLAGS+=-DINET6
     DPADD=	${LIBWRAP}
     LDADD=	-lwrap
     
    +WARNS?=	1
    +
     .include 
    diff --git a/libexec/tftp-proxy/Makefile b/libexec/tftp-proxy/Makefile
    index 45d806857ef8..d8541c4b818e 100644
    --- a/libexec/tftp-proxy/Makefile
    +++ b/libexec/tftp-proxy/Makefile
    @@ -6,4 +6,6 @@ PROG=	tftp-proxy
     SRCS=	tftp-proxy.c filter.c
     MAN=	tftp-proxy.8
     
    +WARNS?=	3
    +
     .include 
    diff --git a/libexec/tftpd/Makefile b/libexec/tftpd/Makefile
    index 6036d4c0df44..6c29243a6663 100644
    --- a/libexec/tftpd/Makefile
    +++ b/libexec/tftpd/Makefile
    @@ -5,7 +5,10 @@ PROG=	tftpd
     SRCS=	tftpd.c tftpsubs.c
     DPADD=	${LIBUTIL}
     LDADD=	-lutil
    +
    +WARNS?=	1
     WFORMAT=0
    +
     MAN=	tftpd.8
     CFLAGS+=-I${.CURDIR}/../../usr.bin/tftp
     .PATH:	${.CURDIR}/../../usr.bin/tftp
    diff --git a/libexec/ulog-helper/Makefile b/libexec/ulog-helper/Makefile
    new file mode 100644
    index 000000000000..3c1770cc51c7
    --- /dev/null
    +++ b/libexec/ulog-helper/Makefile
    @@ -0,0 +1,11 @@
    +# $FreeBSD$
    +
    +PROG=	ulog-helper
    +BINOWN=	root
    +BINMODE=4555
    +NO_MAN=
    +
    +DPADD=	${LIBULOG} ${LIBMD}
    +LDADD=	-lulog -lmd
    +
    +.include 
    diff --git a/libexec/ulog-helper/ulog-helper.c b/libexec/ulog-helper/ulog-helper.c
    new file mode 100644
    index 000000000000..eaef7780854e
    --- /dev/null
    +++ b/libexec/ulog-helper/ulog-helper.c
    @@ -0,0 +1,79 @@
    +/*-
    + * Copyright (c) 2009 Ed Schouten 
    + * 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.
    + */
    +
    +#include 
    +__FBSDID("$FreeBSD$");
    +
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +#include 
    +
    +/*
    + * This setuid helper utility writes user login records to disk.
    + * Unprivileged processes are not capable of writing records to utmp,
    + * wtmp and lastlog, but we do want to allow this for pseudo-terminals.
    + * Because a file descriptor to a pseudo-terminal master device can only
    + * be obtained by processes using the pseudo-terminal, we expect such a
    + * descriptor on stdin.
    + *
    + * It uses the real user ID of the calling process to determine the
    + * username.  It does allow users to log arbitrary hostnames.
    + */
    +
    +int
    +main(int argc, char *argv[])
    +{
    +	const char *line;
    +
    +	/* Device line name. */
    +	if ((line = ptsname(STDIN_FILENO)) == NULL)
    +		return (EX_USAGE);
    +
    +	if ((argc == 2 || argc == 3) && strcmp(argv[1], "login") == 0) {
    +		struct passwd *pwd;
    +		const char *host = NULL;
    +
    +		/* Username. */
    +		pwd = getpwuid(getuid());
    +		if (pwd == NULL)
    +			return (EX_OSERR);
    +
    +		/* Hostname. */
    +		if (argc == 3)
    +			host = argv[2];
    +
    +		ulog_login(line, pwd->pw_name, host);
    +		return (EX_OK);
    +	} else if (argc == 2 && strcmp(argv[1], "logout") == 0) {
    +		ulog_logout(line);
    +		return (EX_OK);
    +	}
    +
    +	return (EX_USAGE);
    +}
    diff --git a/libexec/ypxfr/Makefile b/libexec/ypxfr/Makefile
    index 72978eb17d94..91a42eff1776 100644
    --- a/libexec/ypxfr/Makefile
    +++ b/libexec/ypxfr/Makefile
    @@ -12,7 +12,10 @@ GENSRCS=yp.h yp_clnt.c ypxfr_clnt.c
     MAN=	ypxfr.8
     
     CFLAGS+= -I.
    +
    +WARNS?=	2
     WFORMAT=0
    +
     DPADD=	${LIBRPCSVC}
     LDADD=	-lrpcsvc
     
    diff --git a/release/Makefile b/release/Makefile
    index d2f0dbcba3eb..53b53a7ea370 100644
    --- a/release/Makefile
    +++ b/release/Makefile
    @@ -1128,36 +1128,36 @@ iso.1:
     .if defined(CD_BOOT)
     	@sh ${.CURDIR}/${TARGET_ARCH}/mkisoimages.sh ${BOOTABLE} \
     	    FreeBSD_bootonly \
    -	    ${CD}/${BUILDNAME}-${TARGET}-bootonly.iso ${CD_BOOT}
    +	    ${CD}/FreeBSD-${BUILDNAME}-${TARGET}-bootonly.iso ${CD_BOOT}
     .endif
     	@sh ${.CURDIR}/${TARGET_ARCH}/mkisoimages.sh ${BOOTABLE} \
     	    FreeBSD_Install \
    -	    ${CD}/${BUILDNAME}-${TARGET}-disc1.iso ${CD_DISC1} \
    +	    ${CD}/FreeBSD-${BUILDNAME}-${TARGET}-disc1.iso ${CD_DISC1} \
     	    ${CD_DISC1_PKGS}
     	@sh ${.CURDIR}/${TARGET_ARCH}/mkisoimages.sh \
     	    FreeBSD_Packages \
    -	    ${CD}/${BUILDNAME}-${TARGET}-disc2.iso ${CD_DISC2} \
    +	    ${CD}/FreeBSD-${BUILDNAME}-${TARGET}-disc2.iso ${CD_DISC2} \
     	    ${CD_DISC2_PKGS}
     .if defined(MAKE_DVD)
     	@sh ${.CURDIR}/${TARGET_ARCH}/mkisoimages.sh ${BOOTABLE} \
     	    FreeBSD_Install \
    -	    ${CD}/${BUILDNAME}-${TARGET}-dvd1.iso ${CD_DVD1} \
    +	    ${CD}/FreeBSD-${BUILDNAME}-${TARGET}-dvd1.iso ${CD_DVD1} \
     	    ${CD_DVD1_PKGS}
     .endif
     .if !defined(NODOC)
     	@sh ${.CURDIR}/${TARGET_ARCH}/mkisoimages.sh \
     	    FreeBSD_Documentation \
    -	    ${CD}/${BUILDNAME}-${TARGET}-disc3.iso ${CD_DOCS} \
    +	    ${CD}/FreeBSD-${BUILDNAME}-${TARGET}-disc3.iso ${CD_DOCS} \
     	    ${CD_DOCS_PKGS}
     .endif
     .if defined(SEPARATE_LIVEFS)
     	@sh ${.CURDIR}/${TARGET_ARCH}/mkisoimages.sh ${BOOTABLE} \
     	    FreeBSD_LiveFS \
    -	    ${CD}/${BUILDNAME}-${TARGET}-livefs.iso ${CD_LIVEFS}
    +	    ${CD}/FreeBSD-${BUILDNAME}-${TARGET}-livefs.iso ${CD_LIVEFS}
     .endif
     	@echo "Generating MD5 and SHA256 sums..."
    -	@(cd ${CD} && md5 *.iso > ${BUILDNAME}-${TARGET}-iso.CHECKSUM.MD5)
    -	@(cd ${CD} && sha256 *.iso > ${BUILDNAME}-${TARGET}-iso.CHECKSUM.SHA256)
    +	@(cd ${CD} && md5 *.iso > FreeBSD-${BUILDNAME}-${TARGET}-iso.CHECKSUM.MD5)
    +	@(cd ${CD} && sha256 *.iso > FreeBSD-${BUILDNAME}-${TARGET}-iso.CHECKSUM.SHA256)
     	touch ${.TARGET}
     .else
     	@echo "Do not know how to create an ISO for ${TARGET_ARCH}."
    @@ -1347,7 +1347,7 @@ buildBootFloppy:
     	@mkdir ${IMAGEDIR}
     	@echo "Setting up /boot directory for ${FSIMAGE} floppy"
     	@mkdir -p ${IMAGEDIR}/boot
    -.if ${TARGET} == "i386"
    +.if ${TARGET_ARCH} == "i386"
     	@${WMAKEENV} kgzip -v -l ${RD}/trees/base/usr/lib/kgzldr.o -o \
     	    ${IMAGEDIR}/boot/loader ${BOOTDIR}/loader
     .else
    diff --git a/release/amd64/boot_crunch.conf b/release/amd64/boot_crunch.conf
    index 887a1735cf02..94ccedb2caa8 100644
    --- a/release/amd64/boot_crunch.conf
    +++ b/release/amd64/boot_crunch.conf
    @@ -20,7 +20,6 @@ progs mount_nfs
     progs newfs
     progs route
     progs rtsol
    -progs slattach
     progs tunefs
     ln fsck_ffs fsck_4.2bsd
     ln fsck_ffs fsck_ufs
    diff --git a/release/doc/README b/release/doc/README
    index 6ed0291f225b..b57b10a671d5 100644
    --- a/release/doc/README
    +++ b/release/doc/README
    @@ -99,9 +99,10 @@ element will be included.  For example:
     
     	SPARC64-specific text
     
    -The currently-supported architectures are i386, sparc64, and
    -ia64.  An element may appear for multiple architectures by specifying
    -a comma-separated list of architectures (i.e. arch="sparc64,ia64").
    +The currently-supported architectures are amd64, arm, i386, ia64,
    +pc98, powerpc, and sparc64.  An element may appear for multiple
    +architectures by specifying a comma-separated list of architectures
    +(i.e. arch="sparc64,ia64").
     
     When creating a translation, make a new directory under this
     directory with a language code (paralleling the DocProj directory
    diff --git a/release/doc/en_US.ISO8859-1/errata/article.sgml b/release/doc/en_US.ISO8859-1/errata/article.sgml
    index a765881d722e..edb454306b79 100644
    --- a/release/doc/en_US.ISO8859-1/errata/article.sgml
    +++ b/release/doc/en_US.ISO8859-1/errata/article.sgml
    @@ -16,7 +16,6 @@
     
     
     %release;
    -
     ]>
     
     
    diff --git a/release/doc/en_US.ISO8859-1/hardware/article.sgml b/release/doc/en_US.ISO8859-1/hardware/article.sgml index 53302c660279..cdc66650a61a 100644 --- a/release/doc/en_US.ISO8859-1/hardware/article.sgml +++ b/release/doc/en_US.ISO8859-1/hardware/article.sgml @@ -316,8 +316,51 @@ powerpc - The information for this paragraph has yet to be - compiled. + This section describes the systems currently known to be + supported by &os; on the PowerPC platform. This list is not + exhaustive. + + In general, all New World architecture Apple hardware + is supported, as well a limited selection of non-Apple + machines. + + All systems listed below are fully supported, with the + exception that software fan control is currently missing on + the Power Macintosh G5. SMP is supported on all systems with + more than 1 processor. + + + + Apple iMac + + + Apple Power Macintosh G3 (Blue & White) + + + Apple Power Macintosh G4 + + + Apple Power Macintosh G5 (non-970MP models) + + + Apple iBook + + + Apple PowerBook G4 + + + Apple XServe G4 + + + Apple XServe G5 + + + Apple Mac Mini + + + Embedded boards based on MPC85XX + + @@ -514,6 +557,10 @@ &sun.fire; V210 + + &sun.fire; V215 (support first appeared in 7.3-RELEASE) + + &sun.fire; V250 @@ -523,6 +570,11 @@ appeared in 8.0-RELEASE) + + &sun.fire; V480 (501-6780 and 501-6790 centerplanes only, for + which support first appeared in 7.3-RELEASE) + + &sun.fire; V880 @@ -543,6 +595,10 @@ &sun.fire; V240 + + + &sun.fire; V245 (support first appeared in 7.3-RELEASE) + @@ -966,138 +1022,6 @@ &hwlist.cm; - - ISDN Interfaces - - [&arch.i386;] AcerISDN P10 ISA PnP (experimental) - - [&arch.i386;] Asuscom ISDNlink 128K ISA - - [&arch.i386;] ASUSCOM P-IN100-ST-D (and other Winbond - W6692-based cards) - - [&arch.i386;] AVM - - - - A1 - - - - B1 ISA (tested with V2.0) - - - - B1 PCI (tested with V4.0) - - - - Fritz!Card classic - - - - Fritz!Card PnP - - - - Fritz!Card PCI - - - - Fritz!Card PCI, Version 2 - - - - T1 - - - - [&arch.i386;] Creatix - - - - ISDN-S0 - - - - ISDN-S0 P&P - - - - [&arch.i386;] Compaq Microcom 610 ISDN (Compaq series - PSB2222I) ISA PnP - - [&arch.i386;] Dr. Neuhaus Niccy Go@ and compatibles - - [&arch.i386;] Dynalink IS64PPH and IS64PPH+ - - [&arch.i386;] Eicon Diehl DIVA 2.0 and 2.02 - - [&arch.i386;] ELSA - - - - ELSA PCC-16 - - - - QuickStep 1000pro ISA - - - - MicroLink ISDN/PCI - - - - QuickStep 1000pro PCI - - - - [&arch.i386;] ITK ix1 Micro ( < V.3, non-PnP version - ) - - [&arch.i386;] Sedlbauer Win Speed - - [&arch.i386;] Siemens I-Surf 2.0 - - [&arch.i386;] TELEINT ISDN SPEED No.1 - (experimental) - - [&arch.i386;] Teles - - - - S0/8 - - - - S0/16 - - - - S0/16.3 - - - - S0/16.3 PnP - - - - 16.3c ISA PnP (experimental) - - - - Teles PCI-TJ - - - - [&arch.i386;] Traverse Technologies NETjet-S PCI - - [&arch.i386;] USRobotics Sportster ISDN TA intern - - [&arch.i386;] Winbond W6692 based PCI cards - - Serial Interfaces diff --git a/release/doc/en_US.ISO8859-1/relnotes/article.sgml b/release/doc/en_US.ISO8859-1/relnotes/article.sgml index a80d7cef34bf..303b0782b6ac 100644 --- a/release/doc/en_US.ISO8859-1/relnotes/article.sgml +++ b/release/doc/en_US.ISO8859-1/relnotes/article.sgml @@ -468,7 +468,7 @@ Figwort release to the Hydrangea release. sendmail has been updated from - 8.14.1 to 8.14.3. + 8.14.1 to 8.14.4. The timezone database has been updated from the tzdata2008h release to diff --git a/release/doc/share/misc/dev.archlist.txt b/release/doc/share/misc/dev.archlist.txt index af6d1c4cae23..65dce6681822 100644 --- a/release/doc/share/misc/dev.archlist.txt +++ b/release/doc/share/misc/dev.archlist.txt @@ -107,7 +107,6 @@ rum i386,amd64 safe i386,pc98,amd64 sbp i386,sparc64,ia64,amd64 sis i386,pc98,ia64,amd64 -sk i386,sparc64,pc98,amd64 sn i386,amd64 snc pc98 snd_ad1816 i386,amd64 @@ -135,13 +134,11 @@ snd_neomagic i386,amd64 snd_sbc i386,amd64 snd_solo i386,amd64 snd_spicds i386,amd64 -snd_t4dwave i386,amd64 +snd_t4dwave i386,amd64,sparc64 snd_via8233 i386,amd64 snd_via82c686 i386,amd64 snd_vibes i386,amd64 -ste i386,pc98,amd64 stg i386,pc98 -stge i386,amd64,sparc64 ti i386,pc98,amd64,sparc64 tl i386,pc98,amd64 trm i386,amd64 @@ -162,7 +159,6 @@ ural i386,amd64 urio i386,pc98,amd64,powerpc uvisor i386,pc98,amd64 uvscom i386,pc98,amd64 -vge i386,pc98,amd64 vpo i386 vx i386,pc98,ia64,amd64 wb i386,pc98,amd64 diff --git a/release/doc/share/misc/man2hwnotes.pl b/release/doc/share/misc/man2hwnotes.pl index b5ec96971a1a..2fbc06601f34 100644 --- a/release/doc/share/misc/man2hwnotes.pl +++ b/release/doc/share/misc/man2hwnotes.pl @@ -252,6 +252,10 @@ sub parse { $txt =~ s/ Ta /\t/g; $txt =~ s/([^\t]+)\t.*/$1/; } + + # Remove Li commands + $txt =~ s/^Li //g; + parabuf_addline(\%mdocvars, normalize($txt)); } elsif (/^Bl/) { $mdocvars{isin_list} = 1; diff --git a/release/doc/share/mk/doc.relnotes.mk b/release/doc/share/mk/doc.relnotes.mk index 95d1e4957872..d05e35923ea8 100644 --- a/release/doc/share/mk/doc.relnotes.mk +++ b/release/doc/share/mk/doc.relnotes.mk @@ -10,23 +10,6 @@ EXTRA_CATALOGS+= ${RELN_ROOT}/share/sgml/catalog DSLHTML?= ${RELN_ROOT}/share/sgml/default.dsl DSLPRINT?= ${RELN_ROOT}/share/sgml/default.dsl -# -# Tweakable Makefile variables -# -# INCLUDE_HISTORIC Used by relnotes document only. When set, -# causes all release notes entries to be printed, -# even those marked as "historic". If not set -# (the default), only print "non-historic" -# release note entries. To designate a release -# note entry as "historic", add a role="historic" -# attribute to the applicable element(s). -# -.if defined(INCLUDE_HISTORIC) -JADEFLAGS+= -iinclude.historic -.else -JADEFLAGS+= -ino.include.historic -.endif - # # Automatic device list generation: # diff --git a/release/doc/share/sgml/release.dsl b/release/doc/share/sgml/release.dsl index dd6ac3e1dfe6..66e9ae24a412 100644 --- a/release/doc/share/sgml/release.dsl +++ b/release/doc/share/sgml/release.dsl @@ -3,8 +3,6 @@ - - %release.ent; @@ -14,14 +12,6 @@ -; Configure behavior of this stylesheet - - - ; String manipulation functions (define (split-string-to-list STR) ;; return list of STR separated with char #\ or #\, @@ -54,36 +44,6 @@ ((equal? STR (car s)) #t) (else (loop (cdr s)))))) -; Deal with conditional inclusion of text via entities. -(default - (let* ((role (attribute-string (normalize "role"))) - (for-arch (entity-text "arch"))) - (cond - - ;; If role=historic, and we're not printing historic things, then - ;; don't output this element. - ((and (equal? role "historic") - (not %include-historic%)) - (empty-sosofo)) - - ;; None of the above - (else (next-match))))) - -(mode qandatoc - (default - (let* ((role (attribute-string (normalize "role"))) - (for-arch (entity-text "arch"))) - (cond - - ;; If role=historic, and we're not printing historic things, then - ;; don't output this element. - ((and (equal? role "historic") - (not %include-historic%)) - (empty-sosofo)) - - ;; None of the above - (else (next-match)))))) - ; We might have some sect1 level elements where the modification times ; are significant. An example of this is the "What's New" section in ; the release notes. We enable the printing of pubdate entry in @@ -198,7 +158,6 @@ (u (string-append "&release.man.url;?query=" (data r) "&" "sektion=" (data m)))) (case v - (("xfree86") (string-append u "&" "manpath=XFree86+&release.manpath.xfree86;" )) (("xorg") (string-append u "&" "manpath=Xorg+&release.manpath.xorg;" )) (("netbsd") (string-append u "&" "manpath=NetBSD+&release.manpath.netbsd;")) (("ports") (string-append u "&" "manpath=FreeBSD+&release.manpath.freebsd-ports;")) diff --git a/release/doc/share/sgml/release.ent b/release/doc/share/sgml/release.ent index 03017d589943..c6a60dc465f0 100644 --- a/release/doc/share/sgml/release.ent +++ b/release/doc/share/sgml/release.ent @@ -6,23 +6,23 @@ - + - + - + - + - + @@ -36,11 +36,10 @@ - - - + + - + diff --git a/release/i386/boot_crunch.conf b/release/i386/boot_crunch.conf index 887a1735cf02..94ccedb2caa8 100644 --- a/release/i386/boot_crunch.conf +++ b/release/i386/boot_crunch.conf @@ -20,7 +20,6 @@ progs mount_nfs progs newfs progs route progs rtsol -progs slattach progs tunefs ln fsck_ffs fsck_4.2bsd ln fsck_ffs fsck_ufs diff --git a/release/pc98/boot_crunch.conf b/release/pc98/boot_crunch.conf index 2939daa198d4..2164dd645e8f 100644 --- a/release/pc98/boot_crunch.conf +++ b/release/pc98/boot_crunch.conf @@ -20,7 +20,6 @@ progs mount_nfs progs newfs progs route progs rtsol -progs slattach progs tunefs ln fsck_ffs fsck_4.2bsd ln fsck_ffs fsck_ufs diff --git a/release/picobsd/bridge/PICOBSD b/release/picobsd/bridge/PICOBSD index 150a44d38e7d..47f889632650 100644 --- a/release/picobsd/bridge/PICOBSD +++ b/release/picobsd/bridge/PICOBSD @@ -11,11 +11,14 @@ hints "PICOBSD.hints" # values accessible through getenv() # env "PICOBSD.env" -cpu I486_CPU +#cpu I486_CPU cpu I586_CPU cpu I686_CPU ident PICOBSD +options SMP +device apic + options SCHED_4BSD # mandatory to have one scheduler #options MATH_EMULATE #Support for x87 emulation options INET #InterNETworking @@ -43,6 +46,8 @@ options IPDIVERT # divert (for natd) # Support for bridging and bandwidth limiting options DUMMYNET device if_bridge +# Running with less than 1000 seems to give poor timing on +# qemu, so we set HZ explicitly. options HZ=1000 device random # used by ssh diff --git a/release/picobsd/bridge/crunch.conf b/release/picobsd/bridge/crunch.conf index aa3f45b5e473..2a64021fad9d 100644 --- a/release/picobsd/bridge/crunch.conf +++ b/release/picobsd/bridge/crunch.conf @@ -98,13 +98,15 @@ progs cat tail tee progs test ln test [ +progs less +ln less more progs mount progs minigzip ln minigzip gzip progs kill progs df progs ps -progs ns # this is the +progs ns # this is the picobsd version ln ns netstat progs vm progs hostname diff --git a/release/picobsd/build/mfs.mtree b/release/picobsd/build/mfs.mtree index 5c8e70ce6b20..9d6748adf529 100644 --- a/release/picobsd/build/mfs.mtree +++ b/release/picobsd/build/mfs.mtree @@ -58,6 +58,8 @@ var db .. + empty + .. run .. spool diff --git a/release/picobsd/build/picobsd b/release/picobsd/build/picobsd index 9bc08df947f8..c9e8fc7296fe 100755 --- a/release/picobsd/build/picobsd +++ b/release/picobsd/build/picobsd @@ -167,7 +167,7 @@ create_includes_and_libraries2() { # opt_dir opt_target local no log "create_includes_and_libraries2() for ${SRC}" if [ ${OSVERSION} -ge 600000 ] ; then - no="-DNO_CLEAN -DNO_PROFILE -DNO_GAMES -DNO_LIBC_R" + no="-DNO_CLEAN -DNO_PROFILE -DNO_GAMES -DNO_LIBC_R" # WITHOUT_CDDL=1" else no="-DNOCLEAN -DNOPROFILE -DNOGAMES -DNOLIBC_R" fi @@ -568,10 +568,17 @@ do_links() { # rootdir varname # find_progs is a helper function to locate the named programs # or libraries in ${o_objdir} or ${_SHLIBDIRPREFIX}, # and return the full pathnames. -# Sets ${u_progs} to the list of programs, and ${u_libs} +# Called as "find_progs [-L libpath] [-P binpath] prog1 prog2 ... " +# On return it sets ${u_progs} to the list of programs, and ${u_libs} # to the list of shared libraries used. +# +# '-L path' can be used to specify a search path for libraries +# (which searches in $path/lib:$path/usr/lib:$path/usr/local/lib +# '-P binpath' can be used to specify a search path for programs +# (which searches in a lot of places in the subtree) +# -L must be the first, followed by -P # -# You can use it e.g. in a local configuration file by writing +# You can use it e.g. in a local confign file by writing # # do_copyfiles_user() { # local dst=$1 @@ -580,40 +587,61 @@ do_links() { # rootdir varname # cp -p ${u_libs} ${dst}/lib # mkdir -p ${dst}/libexec # find_progs ld-elf.so.1 -# cp -p ${u_progs} ${dst}/libexec +# cp -p ${u_progs} ${dst}/libexec # ignore errors # } find_progs() { # programs local i + local oo=${o_objdir:-${_SHLIBDIRPREFIX}} # default objdir + local lp=$oo/lib # default lib.prefix + local o="" # additional objdir + if [ x"$1" = "x-L" -a -d "$2" ] ; then # set lib search path + o=$2; shift; shift + lp="$lp:$o/lib:$o/usr/lib:$o/usr/local/lib" + o="-P $o" + fi + u_libs="" u_progs="`find_progs_helper $*`" - local o=${o_objdir:-${_SHLIBDIRPREFIX}} + log "looking for libs for <$u_progs> in $lp" [ -z "${u_progs}" ] && return 1 # not found, error - i="`ldd ${u_progs} | grep -v '^/' | awk '{print $1}' | sort | uniq`" - u_libs="`find_progs_helper $i`" + i="`( LD_LIBRARY_PATH=$lp ldd ${u_progs} ) | \ + grep -v '^/' | awk '{print $1}' | sort | uniq`" + u_libs="`find_progs_helper $o $i`" return 0 } find_progs_helper() { # programs + local dir=${o_objdir:-${_SHLIBDIRPREFIX}/..} + local ldir="" + if [ x"$1" = "x-P" -a -d "$2" ] ; then # set path + ldir=$2; shift; shift + fi local progs="$*" - local i o places names - local subdirs="bin sbin usr.bin usr.sbin libexec lib \ + local subdirs=". local/bin local/sbin local/lib local/libexec \ + bin sbin usr.bin usr.sbin libexec lib \ gnu/usr.bin gnu/lib \ secure/usr.bin secure/usr.sbin secure/libexec secure/lib" - names="" # files to search - o="" + local names="" # files to search + local o="" + local i for i in $progs ; do - # plain programs come out verbatim + # full pathnames are just listed [ -f "$i" ] && echo $i && continue names="${names} ${o} -name $i" o="-o" done [ -z "${names}" ] && return 0 - places="" # places to search - o=${o_objdir:-${_SHLIBDIRPREFIX}/..} + local places="" # places to search for i in $subdirs ; do - [ -d "${o}/${i}" ] && places="${places} ${o}/${i}" + [ -d "${dir}/${i}" ] && places="${places} ${dir}/${i}" done - find ${places} -type f \( ${names} \) + if [ -n "${ldir}" ] ; then + for i in $subdirs ; do + [ -d "${ldir}/${i}" ] && places="${places} ${ldir}/${i}" + done + fi + # use maxdepth 3 because some libs are way down + find ${places} -maxdepth 3 -type f \( ${names} \) } # Populate the memory filesystem with binaries and non-variable @@ -719,8 +747,7 @@ populate_mfs_tree() { (cd ${dst}; chown -R root . ) fi - # If we are building a shared 'crunch', take the libraries - # and the dynamic loader as well + log "for a shared 'crunch' take libraries and dynamic loader as well" find_progs ${dst}/stand/crunch if [ -n "${u_libs}" ] ; then mkdir -p ${dst}/lib && cp -p ${u_libs} ${dst}/lib @@ -862,7 +889,7 @@ fill_floppy_image() { if [ ${mfs_start} -gt 0 -a ${mfs_size} -ge ${imgsize} ] ; then mfs_ofs=$((${mfs_start} + 8192)) log "Preload kernel with file ${c_fs} at ${mfs_ofs}" - logverbose "`ls -l ${c_fs}` to fit in ${mfs_size}" + log "`ls -l ${c_fs}` to fit in ${mfs_size}" dd if=${c_fs} ibs=8192 iseek=1 of=kernel obs=${mfs_ofs} \ oseek=1 conv=notrunc # 2> /dev/null else @@ -917,7 +944,7 @@ fill_floppy_image() { ls -l ${c_img} ${c_label} -f `pwd`/${c_img} - logverbose "after disklabel" + log "after disklabel" ) echo "BUILDDIR ${BUILDDIR}" @@ -931,7 +958,7 @@ fill_floppy_image() { dd if=${b2} iseek=1 ibs=276 2> /dev/null | \ dd of=${BUILDDIR}/${c_img} oseek=1 obs=788 conv=notrunc 2>/dev/null - logverbose "done floppy image" + log "done disk image" # XXX (log "Fixing permissions"; cd ${dst}; chown -R root *) rm -rf ${BUILDDIR}/floppy.tree || true # cleanup # df -ik ${dst} | colrm 70 > .build.reply diff --git a/release/picobsd/floppy.tree/etc/master.passwd b/release/picobsd/floppy.tree/etc/master.passwd index e9bb1cee3bd1..e649b84d8475 100644 --- a/release/picobsd/floppy.tree/etc/master.passwd +++ b/release/picobsd/floppy.tree/etc/master.passwd @@ -1,3 +1,4 @@ +# $FreeBSD$ root:$1$xOOaGnKU$U9QdsCI40XXcCUMBN.7Az.:0:0::0:0:Charlie &:/root:/bin/sh toor:*:0:0::0:0:Bourne-again Superuser:/root: daemon:*:1:1::0:0:Owner of many system processes:/root:/nonexistent @@ -5,4 +6,5 @@ operator:*:2:20::0:0:System &:/usr/guest/operator:/bin/csh bin:*:3:7::0:0:Binaries Commands and Source,,,:/:/nonexistent tty:*:4:65533::0:0:Tty Sandbox:/:/nonexistent nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/nonexistent +_dhcp:*:65:65::0:0:dhcp programs:/var/empty:/usr/sbin/nologin user:*:1002:1002:Sample User:0:0:user:/home/user:/bin/sh diff --git a/release/picobsd/floppy.tree/etc/ttys b/release/picobsd/floppy.tree/etc/ttys index dcfac7a9c9b9..09f42fb2ef89 100644 --- a/release/picobsd/floppy.tree/etc/ttys +++ b/release/picobsd/floppy.tree/etc/ttys @@ -8,19 +8,19 @@ # This entry needed for asking password when init goes to single-user mode # If you want to be asked for password, change "secure" to "insecure" here #console none unknown off secure -vga none cons25 off secure +vga none xterm off secure # -ttyv0 "/usr/libexec/getty Pc" cons25 on secure +ttyv0 "/usr/libexec/getty Pc" xterm on secure # Virtual terminals -ttyv1 "/usr/libexec/getty Pc" cons25 on secure -ttyv2 "/usr/libexec/getty Pc" cons25 on secure -ttyv3 "/usr/libexec/getty Pc" cons25 on secure -ttyv4 "/usr/libexec/getty Pc" cons25 on secure -ttyv5 "/usr/libexec/getty Pc" cons25 on secure -ttyv6 "/usr/libexec/getty Pc" cons25 on secure -ttyv7 "/usr/libexec/getty Pc" cons25 on secure -#ttyv8 "/usr/libexec/getty Pc" cons25 on secure -#ttyv9 "/usr/libexec/getty Pc" cons25 on secure +ttyv1 "/usr/libexec/getty Pc" xterm on secure +ttyv2 "/usr/libexec/getty Pc" xterm on secure +ttyv3 "/usr/libexec/getty Pc" xterm on secure +ttyv4 "/usr/libexec/getty Pc" xterm on secure +ttyv5 "/usr/libexec/getty Pc" xterm on secure +ttyv6 "/usr/libexec/getty Pc" xterm on secure +ttyv7 "/usr/libexec/getty Pc" xterm on secure +#ttyv8 "/usr/libexec/getty Pc" xterm on secure +#ttyv9 "/usr/libexec/getty Pc" xterm on secure # Pseudo terminals ttyp0 none network secure ttyp1 none network secure diff --git a/release/picobsd/floppy.tree/sbin/dhclient-script b/release/picobsd/floppy.tree/sbin/dhclient-script new file mode 100755 index 000000000000..c457bf465303 --- /dev/null +++ b/release/picobsd/floppy.tree/sbin/dhclient-script @@ -0,0 +1,384 @@ +#!/bin/sh +# +# $OpenBSD: dhclient-script,v 1.6 2004/05/06 18:22:41 claudio Exp $ +# $FreeBSD$ +# +# Copyright (c) 2003 Kenneth R Westerback +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# +# + +ARP=/usr/sbin/arp +HOSTNAME=/bin/hostname +IFCONFIG='/sbin/ifconfig -n' + +LOCALHOST=127.0.0.1 + +if [ -x /usr/bin/logger ]; then + LOGGER="/usr/bin/logger -s -p user.notice -t dhclient" +else + LOGGER=echo +fi + +# +# Helper functions that implement common actions. +# + +check_hostname() { + current_hostname=`$HOSTNAME` + if [ -z "$current_hostname" ]; then + $LOGGER "New Hostname ($interface): $new_host_name" + $HOSTNAME $new_host_name + elif [ "$current_hostname" = "$old_host_name" -a \ + "$new_host_name" != "$old_host_name" ]; then + $LOGGER "New Hostname ($interface): $new_host_name" + $HOSTNAME $new_host_name + fi +} + +arp_flush() { + arp -an -i $interface | \ + sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' | \ + sh >/dev/null 2>&1 +} + +delete_old_address() { + eval "$IFCONFIG $interface inet -alias $old_ip_address $medium" +} + +add_new_address() { + eval "$IFCONFIG $interface \ + inet $new_ip_address \ + netmask $new_subnet_mask \ + broadcast $new_broadcast_address \ + $medium" + + $LOGGER "New IP Address ($interface): $new_ip_address" + $LOGGER "New Subnet Mask ($interface): $new_subnet_mask" + $LOGGER "New Broadcast Address ($interface): $new_broadcast_address" + $LOGGER "New Routers ($interface): $new_routers" +} + +delete_old_alias() { + if [ -n "$alias_ip_address" ]; then + $IFCONFIG $interface inet -alias $alias_ip_address > /dev/null 2>&1 + #route delete $alias_ip_address $LOCALHOST > /dev/null 2>&1 + fi +} + +add_new_alias() { + if [ -n "$alias_ip_address" ]; then + $IFCONFIG $interface inet alias $alias_ip_address netmask \ + $alias_subnet_mask + #route add $alias_ip_address $LOCALHOST + fi +} + +fill_classless_routes() { + set $1 + while [ $# -ge 5 ]; do + if [ $1 -eq 0 ]; then + route="default" + elif [ $1 -le 8 ]; then + route="$2.0.0.0/$1" + shift + elif [ $1 -le 16 ]; then + route="$2.$3.0.0/$1" + shift; shift + elif [ $1 -le 24 ]; then + route="$2.$3.$4.0/$1" + shift; shift; shift + else + route="$2.$3.$4.$5/$1" + shift; shift; shift; shift + fi + shift + router="$1.$2.$3.$4" + classless_routes="$classless_routes $route $router" + shift; shift; shift; shift + done +} + +delete_old_routes() { + #route delete "$old_ip_address" $LOCALHOST >/dev/null 2>&1 + if [ -n "$old_classless_routes" ]; then + fill_classless_routes "$old_classless_routes" + set $classless_routes + while [ $# -gt 1 ]; do + route delete "$1" "$2" + shift; shift + done + return 0; + fi + + # If we supported multiple default routes, we'd be removing each + # one here. We don't so just delete the default route if it's + # through our interface. + if is_default_interface; then + route delete default >/dev/null 2>&1 + fi + + if [ -n "$old_static_routes" ]; then + set $old_static_routes + while [ $# -gt 1 ]; do + route delete "$1" "$2" + shift; shift + done + fi + + arp_flush +} + +add_new_routes() { + #route add $new_ip_address $LOCALHOST >/dev/null 2>&1 + + # RFC 3442: If the DHCP server returns both a Classless Static + # Routes option and a Router option, the DHCP client MUST ignore + # the Router option. + # + # DHCP clients that support this option (Classless Static Routes) + # MUST NOT install the routes specified in the Static Routes + # option (option code 33) if both a Static Routes option and the + # Classless Static Routes option are provided. + + if [ -n "$new_classless_routes" ]; then + fill_classless_routes "$new_classless_routes" + $LOGGER "New Classless Static Routes ($interface): $classless_routes" + set $classless_routes + while [ $# -gt 1 ]; do + if [ "0.0.0.0" = "$2" ]; then + route add "$1" -iface "$interface" + else + route add "$1" "$2" + fi + shift; shift + done + return + fi + + for router in $new_routers; do + if is_default_interface; then + + if [ "$new_ip_address" = "$router" ]; then + route add default -iface $router >/dev/null 2>&1 + else + route add default $router >/dev/null 2>&1 + fi + fi + # 2nd and subsequent default routers error out, so explicitly + # stop processing the list after the first one. + break + done + + if [ -n "$new_static_routes" ]; then + $LOGGER "New Static Routes ($interface): $new_static_routes" + set $new_static_routes + while [ $# -gt 1 ]; do + route add $1 $2 + shift; shift + done + fi +} + +add_new_resolv_conf() { + # XXX Old code did not create/update resolv.conf unless both + # $new_domain_name and $new_domain_name_servers were provided. PR + # #3135 reported some ISP's only provide $new_domain_name_servers and + # thus broke the script. This code creates the resolv.conf if either + # are provided. + + local tmpres=/var/run/resolv.conf.${interface} + rm -f $tmpres + + if [ -n "$new_domain_name" ]; then + echo "search $new_domain_name" >>$tmpres + fi + + if [ -n "$new_domain_name_servers" ]; then + for nameserver in $new_domain_name_servers; do + echo "nameserver $nameserver" >>$tmpres + done + fi + + if [ -f $tmpres ]; then + if [ -f /etc/resolv.conf.tail ]; then + cat /etc/resolv.conf.tail >>$tmpres + fi + + # When resolv.conf is not changed actually, we don't + # need to update it. + # If /usr is not mounted yet, we cannot use cmp, then + # the following test fails. In such case, we simply + # ignore an error and do update resolv.conf. + if cmp -s $tmpres /etc/resolv.conf; then + rm -f $tmpres + return 0 + fi 2>/dev/null + + # In case (e.g. during OpenBSD installs) /etc/resolv.conf + # is a symbolic link, take care to preserve the link and write + # the new data in the correct location. + + if [ -f /etc/resolv.conf ]; then + cat /etc/resolv.conf > /etc/resolv.conf.save + fi + cat $tmpres > /etc/resolv.conf + rm -f $tmpres + + # Try to ensure correct ownership and permissions. + chown -RL root:wheel /etc/resolv.conf + chmod -RL 644 /etc/resolv.conf + + return 0 + fi + + return 1 +} + +# Must be used on exit. Invokes the local dhcp client exit hooks, if any. +exit_with_hooks() { + exit_status=$1 + if [ -f /etc/dhclient-exit-hooks ]; then + . /etc/dhclient-exit-hooks + fi + # probably should do something with exit status of the local script + exit $exit_status +} + +# Get the interface with the current ipv4 default route on it using only +# commands that are available prior to /usr being mounted. +is_default_interface() +{ + routeget="`route -n get -inet default`" + oldifs="$IFS" + IFS=" +" + defif= + for line in $routeget ; do + case $line in + *interface:*) + defif=${line##*: } + ;; + esac + done + IFS=${oldifs} + + if [ -z "$defif" -o "$defif" = "$interface" ]; then + return 0 + else + return 1 + fi +} + +# +# Start of active code. +# + +# Invoke the local dhcp client enter hooks, if they exist. +if [ -f /etc/dhclient-enter-hooks ]; then + exit_status=0 + . /etc/dhclient-enter-hooks + # allow the local script to abort processing of this state + # local script must set exit_status variable to nonzero. + if [ $exit_status -ne 0 ]; then + exit $exit_status + fi +fi + +case $reason in +MEDIUM) + eval "$IFCONFIG $interface $medium" + eval "$IFCONFIG $interface inet -alias 0.0.0.0 $medium" >/dev/null 2>&1 + sleep 1 + ;; + +PREINIT) + delete_old_alias + $IFCONFIG $interface inet alias 0.0.0.0 netmask 0.0.0.0 broadcast 255.255.255.255 up + ;; + +ARPCHECK|ARPSEND) + ;; + +BOUND|RENEW|REBIND|REBOOT) + check_hostname + if [ -n "$old_ip_address" ]; then + if [ "$old_ip_address" != "$alias_ip_address" ]; then + delete_old_alias + fi + if [ "$old_ip_address" != "$new_ip_address" ]; then + delete_old_address + delete_old_routes + fi + fi + if [ "$reason" = BOUND ] || \ + [ "$reason" = REBOOT ] || \ + [ -z "$old_ip_address" ] || \ + [ "$old_ip_address" != "$new_ip_address" ]; then + add_new_address + add_new_routes + fi + if [ "$new_ip_address" != "$alias_ip_address" ]; then + add_new_alias + fi + if is_default_interface; then + add_new_resolv_conf + fi + ;; + +EXPIRE|FAIL) + delete_old_alias + if [ -n "$old_ip_address" ]; then + delete_old_address + delete_old_routes + fi + if [ -x $ARP ]; then + $ARP -d -a -i $interface + fi + # XXX Why add alias we just deleted above? + add_new_alias + if is_default_interface; then + if [ -f /etc/resolv.conf.save ]; then + cat /etc/resolv.conf.save > /etc/resolv.conf + fi + fi + ;; + +TIMEOUT) + delete_old_alias + add_new_address + sleep 1 + if [ -n "$new_routers" ]; then + $LOGGER "New Routers ($interface): $new_routers" + set "$new_routers" + if ping -q -c 1 -t 1 "$1"; then + if [ "$new_ip_address" != "$alias_ip_address" ]; then + add_new_alias + fi + add_new_routes + if ! is_default_interface; then + exit_with_hooks 0 + fi + if add_new_resolv_conf; then + exit_with_hooks 0 + fi + fi + fi + eval "$IFCONFIG $interface inet -alias $new_ip_address $medium" + delete_old_routes + exit_with_hooks 1 + ;; +esac + +exit_with_hooks 0 diff --git a/release/picobsd/qemu/PICOBSD b/release/picobsd/qemu/PICOBSD new file mode 100644 index 000000000000..837e902d7977 --- /dev/null +++ b/release/picobsd/qemu/PICOBSD @@ -0,0 +1,122 @@ +# +# $FreeBSD$ +# A configuration file to run tests on qemu. +# We disable SMP because it does not work well with qemu, and set HZ=1000 +# to avoid it being overridden. +# +# Line starting with #PicoBSD contains PicoBSD build parameters +#marker def_sz init MFS_inodes floppy_inodes +#PicoBSD 18000 init 8192 32768 +options MD_ROOT_SIZE=18000 # same as def_sz + +hints "PICOBSD.hints" + +# values accessible through getenv() +# env "PICOBSD.env" + +#cpu I486_CPU +cpu I586_CPU +cpu I686_CPU +ident PICOBSD + +#options SMP +#device apic + +options SCHED_4BSD # mandatory to have one scheduler +#options MATH_EMULATE #Support for x87 emulation +options INET #InterNETworking +#options INET6 +options FFS #Berkeley Fast Filesystem +#options BOOTP #Use BOOTP to obtain IP address/hostname +options MD_ROOT #MD is a potential root device + +#options NFS #Network Filesystem +#options NFS_ROOT #NFS usable as root device, NFS required + +#options MSDOSFS #MSDOS Filesystem +#options CD9660 #ISO 9660 Filesystem +#options CD9660_ROOT #CD-ROM usable as root, CD9660 required +#options DEVFS #Device Filesystem +#options PROCFS #Process filesystem +options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!] + +options KDB +options DDB + +options IPFIREWALL +options IPFIREWALL_DEFAULT_TO_ACCEPT +options IPDIVERT # divert (for natd) + +# Support for bridging and bandwidth limiting +options DUMMYNET +device if_bridge +# Running with less than 1000 seems to give poor timing on +# qemu, so we set HZ explicitly. +options HZ=1000 + +device random # used by ssh +device pci + +# Floppy drives +device fdc + +# ATA and ATAPI devices +#device ata +#device atadisk # ATA disk drives +#device atapicd # ATAPI CDROM drives +#options ATA_STATIC_ID #Static device numbering + +# atkbdc0 controls both the keyboard and the PS/2 mouse +device atkbdc # At keyboard controller +device atkbd +#device psm # do we need the mouse ?? + +device vga # VGA screen + +# syscons is the default console driver, resembling an SCO console +device sc + +# Serial (COM) ports +device uart + +# Audio support +#device pcm + +# PCCARD (PCMCIA) support +#device card # pccard bus +#device pcic # PCMCIA bridge + +# Parallel port +#device ppc +#device ppbus # Parallel port bus (required) +#device lpt # Printer +#device plip # TCP/IP over parallel +#device ppi # Parallel port interface device + +# +# The following Ethernet NICs are all PCI devices. +# +device miibus +device fxp # Intel EtherExpress PRO/100B (82557, 82558) +device nfe # nVidia nForce MCP on-board Ethernet +#device xl # 3Com +device rl # RealTek 8129/8139 +device re # RealTek 8139C+/8169/8169S/8110S +device sis # National/SiS +device dc # DEC/Intel 21143 and various workalikes +device ed + +device loop # Network loopback +device ether # Ethernet support +device tun # Packet tunnel. +device pty # Pseudo-ttys (telnet etc) +device md # Memory "disks" +#device gif 4 # IPv6 and IPv4 tunneling +#device faith 1 # IPv6-to-IPv4 relaying (translation) +device tap + +#options DEVICE_POLLING + +# The `bpf' device enables the Berkeley Packet Filter. +# Be aware of the administrative consequences of enabling this! +device bpf # Berkeley packet filter diff --git a/release/picobsd/qemu/PICOBSD.hints b/release/picobsd/qemu/PICOBSD.hints new file mode 100644 index 000000000000..4f1b40380e55 --- /dev/null +++ b/release/picobsd/qemu/PICOBSD.hints @@ -0,0 +1,39 @@ +# $FreeBSD$ +hint.fdc.0.at="isa" +hint.fdc.0.port="0x3F0" +hint.fdc.0.irq="6" +hint.fdc.0.drq="2" +hint.fd.0.at="fdc0" +hint.fd.0.drive="0" +hint.ata.0.at="isa" +hint.ata.0.port="0x1F0" +hint.ata.0.irq="14" +hint.ata.1.at="isa" +hint.ata.1.port="0x170" +hint.ata.1.irq="15" +hint.atkbdc.0.at="isa" +hint.atkbdc.0.port="0x060" +hint.atkbd.0.at="atkbdc" +hint.atkbd.0.irq="1" +hint.psm.0.at="atkbdc" +hint.psm.0.irq="12" +hint.vga.0.at="isa" +hint.sc.0.at="isa" +hint.npx.0.at="nexus" +hint.npx.0.port="0x0F0" +hint.npx.0.irq="13" +hint.uart.0.at="isa" +hint.uart.0.port="0x3F8" +hint.uart.0.flags="0x10" +hint.uart.0.irq="4" +hint.uart.1.at="isa" +hint.uart.1.port="0x2F8" +hint.uart.1.irq="3" +hint.ed.0.at="isa" +hint.ed.0.port="0x280" +hint.ed.0.irq="5" +hint.ed.0.maddr="0xd8000" +hint.ed.1.at="isa" +hint.ed.1.port="0x300" +hint.ed.1.irq="5" +hint.ed.1.maddr="0xd0000" diff --git a/release/picobsd/qemu/config b/release/picobsd/qemu/config new file mode 100644 index 000000000000..88f1954d7ab7 --- /dev/null +++ b/release/picobsd/qemu/config @@ -0,0 +1,26 @@ +# configuration for picobsd build script. +# $FreeBSD$ +# it should only contain variable definitions -- it is sourced +# by the shell much like rc.conf* files + +fd_size="8192" + +# To copy individual files you can use the function do_copyfiles_user +# as below (find_progs locates the programs and their libraries, +# then you manually copy them. +#copy_files=" +#" +do_copyfiles_user() { + local dst=$1 # the destination root + log "--- put the libraries in /usr/lib to avoid conflicts" + mkdir -p ${dst}/usr/lib + log "-- import dropbear from its build directory --" + find_progs -L / -P /usr/ports/security/dropbear/work/dropbear-0.52 \ + dbclient dropbear + cp -p ${u_progs} ${dst}/bin + cp -p ${u_libs} ${dst}/usr/lib + log "--- also import ssh, scp and sshd ---" + find_progs -L / /usr/bin/ssh /usr/bin/scp /usr/sbin/sshd + cp -p ${u_progs} ${dst}/bin + cp -p ${u_libs} ${dst}/usr/lib +} diff --git a/release/picobsd/qemu/crunch.conf b/release/picobsd/qemu/crunch.conf new file mode 100644 index 000000000000..d6566ae70563 --- /dev/null +++ b/release/picobsd/qemu/crunch.conf @@ -0,0 +1,191 @@ +# +# $FreeBSD$ +# +# Configuration file for "qemu" images.. +# +# Depending on your needs, you will almost surely need to +# add/remove/change programs according to your needs. +# Remember that some programs require matching kernel options to +# enable device drivers etc. +# +# To figure out how much space is used by each program, do +# +# size build_dir-bridge/crunch/*lo +# +# Remember that programs require libraries, which add up to the +# total size. The final binary is build_dir-bridge/mfs.tree/stand/crunch +# and you can check which libraries it uses with +# +# ldd build_dir-bridge/mfs.tree/stand/crunch + +# crunchgen configuration to build the crunched binary, see "man crunchgen" +# We need to specify generic build options, the places where to look +# for sources, and the list of program and libraries we want to put +# in the crunched binary. +# +# NOTE: the string "/usr/src" below will be automatically replaced with +# the path set in the 'build' script. + +# Default build options. Basically tell the Makefiles +# that to use the most compact possible version of the code. + +buildopts -DNO_PAM -DRELEASE_CRUNCH -DPPP_NO_NETGRAPH +buildopts -DTRACEROUTE_NO_IPSEC -DNO_INET6 +buildopts -DWITHOUT_IPX + +# Directories where to look for sources of various binaries. +# @__CWD__@ is a magic keyword in the picobsd's (Makefile.conf) +# which is replaced with the directory with the picobsd configuration +# corresponding to your image. This way you can have custom sources +# in that directory overriding system programs. + +srcdirs @__CWD__@/src + +# Some programs are especially written for PicoBSD and reside in +# release/picobsd/tinyware. +# Put this entry near the head of the list to override standard binaries. + +srcdirs /usr/src/release/picobsd/tinyware + +# Other standard locations for sources. +# If a program uses its own source directory, add + +srcdirs /usr/src/bin +srcdirs /usr/src/sbin/i386 +srcdirs /usr/src/sbin +srcdirs /usr/src/usr.bin +srcdirs /usr/src/gnu/usr.bin +srcdirs /usr/src/usr.sbin +srcdirs /usr/src/libexec + +# For programs that reside in different places, the best option +# is to use the command "special XXX srcdir YYY" where XXX is the +# program name and YYY is the directory path. +# "special XXX ..." can be used to specify more options, see again +# the crunchgen manpage. + +#--- Basic configuraton +# init is always necessary (unless you have a replacement, oinit) +progs init + +# fsck is almost always necessary, unless you have everything on the +# image and use 'tar' or something similar to read/write raw blocks +# from the floppy. + +progs fsck + +# ifconfig is needed if you want to configure interfaces. +progs ifconfig + +# You will also need a shell and a bunch of utilities. +# The standard shell is not that large, but you need many +# external programs. In fact most of them do not take much space +# as they merely issue a system call, and print the result. +# For a more compact version of shell and utilities, you could +# try busybox, however most system management commands in busybox +# will not work as they use linux-specific interfaces. + +progs sh +ln sh -sh + +# the small utilities +progs echo +progs pwd mkdir rmdir +progs chmod chown +ln chown chgrp +progs mv ln cp rm ls +progs cat tail tee +progs test +ln test [ + +progs less +ln less more +progs mount +progs minigzip +ln minigzip gzip +progs kill +progs df +progs ps +progs ns # this is the picobsd version +ln ns netstat +progs vm +progs hostname +progs login +progs getty +progs stty +progs w +progs msg +ln msg dmesg +progs reboot + +progs sysctl +progs swapon +progs pwd_mkdb +progs umount +progs du +progs passwd + +progs route + +# If you want to run natd, remember the alias library +progs natd +libs_so -lalias # natd +progs tcpdump +special tcpdump srcdir /usr/src/usr.sbin/tcpdump/tcpdump +libs_so -lpcap # used by tcpdump + +# ppp is rather large. Note that as of Jan.01, RELEASE_CRUNCH +# makes ppp not use libalias, so you cannot have aliasing. +#progs ppp + +# You need an editor. ee is relatively small, though there are +# smaller ones. vi is much larger. +# The editor also usually need a curses library. +progs ee + +progs arp + +# these require libgeom +# progs bsdlabel fdisk mdconfig + +progs kldload kldunload kldstat +progs kldxref +progs grep +libs_so -lgnuregex -lbz2 +# dhclient-script requires 'sed' +progs dhclient +progs sed +progs date +progs time +progs ping +#progs routed +progs ipfw +progs traceroute +progs mdmfs +ln mdmfs mount_mfs +# Various filesystem support -- remember to enable the kernel parts +# progs mount_msdosfs +progs mount_nfs +# progs mount_cd9660 +ln mount_nfs nfs +ln mount_cd9660 cd9660 +#progs newfs +#ln newfs mount_mfs +# ln mount_msdosfs msdos + +# For a small ssh client/server use dropbear + +# Now the libraries +libs_so -lc # the C library +libs_so -ll # used by sh (really ?) +libs_so -lufs # used by mount +### ee uses ncurses but as a dependency +#libs_so -lncurses +libs_so -lm +libs_so -ledit -lutil +libs_so -lcrypt +libs_so -lkvm +libs_so -lz +libs_so -lbsdxml +libs_so -lsbuf +libs_so -ljail # used by ifconfig diff --git a/release/picobsd/qemu/floppy.tree.exclude b/release/picobsd/qemu/floppy.tree.exclude new file mode 100644 index 000000000000..adfc6cc75420 --- /dev/null +++ b/release/picobsd/qemu/floppy.tree.exclude @@ -0,0 +1,2 @@ +etc/snmpd.conf +etc/ppp diff --git a/release/picobsd/tinyware/login/pico-login.c b/release/picobsd/tinyware/login/pico-login.c index 2f333a439188..b03dad529aa1 100644 --- a/release/picobsd/tinyware/login/pico-login.c +++ b/release/picobsd/tinyware/login/pico-login.c @@ -76,7 +76,7 @@ static const char rcsid[] = #include #include #include -#include +#include #ifdef USE_PAM #include @@ -119,7 +119,6 @@ static char **environ_pam; #endif static int auth_traditional(void); -extern void login(struct utmp *); static void usage(void); #define TTYGRPNAME "tty" /* name of group to own ttys */ @@ -152,7 +151,7 @@ main(argc, argv) struct group *gr; struct stat st; struct timeval tp; - struct utmp utmp; + struct utmpx utmp; int rootok, retries, backoff; int ask, ch, cnt, fflag, hflag, pflag, quietlog, rootlogin, rval; int changepass; @@ -164,6 +163,8 @@ main(argc, argv) char tname[sizeof(_PATH_TTY) + 10]; const char *shell = NULL; login_cap_t *lc = NULL; + int UT_HOSTSIZE = sizeof(utmp.ut_host); + int UT_NAMESIZE = sizeof(utmp.ut_user); #ifdef USE_PAM pid_t pid; int e; @@ -508,14 +509,18 @@ main(argc, argv) refused("Permission denied", "ACCESS", 1); #endif /* LOGIN_ACCESS */ +#if 1 + ulog_login(tty, username, hostname); +#else /* Nothing else left to fail -- really log in. */ memset((void *)&utmp, 0, sizeof(utmp)); - (void)time(&utmp.ut_time); - (void)strncpy(utmp.ut_name, username, sizeof(utmp.ut_name)); + (void)gettimeofday(&utmp.ut_tv, NULL); + (void)strncpy(utmp.ut_user, username, sizeof(utmp.ut_user)); if (hostname) (void)strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host)); (void)strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line)); login(&utmp); +#endif dolastlog(quietlog); @@ -903,7 +908,7 @@ usage() * Allow for authentication style and/or kerberos instance */ -#define NBUFSIZ UT_NAMESIZE + 64 +#define NBUFSIZ 128 // XXX was UT_NAMESIZE + 64 void getloginname() @@ -985,6 +990,7 @@ void dolastlog(quiet) int quiet; { +#if 0 /* XXX not implemented after utmp->utmpx change */ struct lastlog ll; int fd; @@ -1016,6 +1022,7 @@ dolastlog(quiet) } else { syslog(LOG_ERR, "cannot open %s: %m", _PATH_LASTLOG); } +#endif } void diff --git a/release/picobsd/tinyware/oinit/oinit.c b/release/picobsd/tinyware/oinit/oinit.c index b02434a7132b..7715f3e67a5b 100644 --- a/release/picobsd/tinyware/oinit/oinit.c +++ b/release/picobsd/tinyware/oinit/oinit.c @@ -116,7 +116,7 @@ struct command bltins[]={ {"cd","Change working directory","cd [dir]","cd /etc",cd}, {"pwd","Print current directory","pwd","pwd",pwd}, {"exit","Exit from shell()","exit","exit",xit}, - {"set","Set environment variable","set [VAR=value]","set TERM=cons25",set}, + {"set","Set environment variable","set [VAR=value]","set TERM=xterm",set}, {"unset","Unset environment variable","unset VAR","unset EDITOR",unset}, {"echo","Echo arguments on stdout","echo arg1 arg2 ...","echo Hello World!",echo}, {"env","Print all environment variables","env","env",env}, @@ -572,7 +572,7 @@ start_session(int vty, int argc, char **argv) if(fd>2) close(fd); login_tty(fd); setpgid(0,getpid()); - putenv("TERM=cons25"); + putenv("TERM=xterm"); putenv("HOME=/"); putenv("PATH=/stand:/bin:/usr/bin:/sbin:."); signal(SIGHUP,SIG_DFL); diff --git a/release/powerpc/boot_crunch.conf b/release/powerpc/boot_crunch.conf index fb5a40ebd373..9f7a3010b11e 100644 --- a/release/powerpc/boot_crunch.conf +++ b/release/powerpc/boot_crunch.conf @@ -22,7 +22,6 @@ progs newfs progs newfs_msdos progs route progs rtsol -progs slattach progs tunefs ln fsck_ffs fsck_4.2bsd ln fsck_ffs fsck_ufs diff --git a/release/scripts/make-memstick.sh b/release/scripts/make-memstick.sh new file mode 100755 index 000000000000..18f9cf1d8d55 --- /dev/null +++ b/release/scripts/make-memstick.sh @@ -0,0 +1,83 @@ +#!/bin/sh +# +# This script generates a "memstick image" (image that can be copied to a +# USB memory stick) from a directory tree. Note that the script does not +# clean up after itself very well for error conditions on purpose so the +# problem can be diagnosed (full filesystem most likely but ...). +# +# Usage: make-memstick.sh +# +# $FreeBSD$ +# + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +export PATH + +BLOCKSIZE=10240 + +if [ $# -ne 2 ]; then + echo "make-memstick.sh /path/to/directory /path/to/image/file" + exit 1 +fi + +tempfile="${2}.$$" + +if [ ! -d ${1} ]; then + echo "${1} must be a directory" + exit 1 +fi + +if [ -e ${2} ]; then + echo "won't overwrite ${2}" + exit 1 +fi + +rm -f ${tempfile} +makefs ${tempfile} ${1} +if [ $? -ne 0 ]; then + echo "makefs failed" + exit 1 +fi + +# +# Use $BLOCKSIZE for transfers to improve efficiency. When calculating +# how many blocks to transfer "+ 2" is to account for truncation in the +# division and to provide space for the label. +# + +filesize=`stat -f "%z" ${tempfile}` +blocks=$(($filesize / ${BLOCKSIZE} + 2)) +dd if=/dev/zero of=${2} bs=${BLOCKSIZE} count=${blocks} +if [ $? -ne 0 ]; then + echo "creation of image file failed" + exit 1 +fi + +unit=`mdconfig -a -t vnode -f ${2}` +if [ $? -ne 0 ]; then + echo "mdconfig failed" + exit 1 +fi + +fdisk -BIq /dev/${unit} +if [ $? -ne 0 ]; then + echo "fdisk failed" + exit 1 +fi + +bsdlabel -B -w /dev/${unit} +if [ $? -ne 0 ]; then + echo "bsdlabel failed" + exit 1 +fi + +dd if=${tempfile} of=/dev/${unit}a bs=$BLOCKSIZE conv=sync +if [ $? -ne 0 ]; then + echo "copying filesystem into image file failed" + exit 1 +fi + +mdconfig -d -u ${unit} + +rm -f ${tempfile} + diff --git a/release/scripts/package-split.py b/release/scripts/package-split.py index 6d895297c168..727262b05386 100644 --- a/release/scripts/package-split.py +++ b/release/scripts/package-split.py @@ -51,50 +51,53 @@ def disc1_packages(): 'misc/freebsd-doc-zh_tw'] if doing_dvd: - pkgs.extend(['lang/perl5.8', - 'x11/xorg', - 'devel/imake', - 'emulators/linux_base-fc4', - 'x11/gnome2', - 'x11/kde4', - 'x11-wm/afterstep', - 'x11-wm/windowmaker', - 'x11-wm/fvwm2', - 'archivers/unzip', + pkgs.extend(['archivers/unzip', 'astro/xearth', 'devel/gmake', + 'devel/imake', 'editors/emacs', 'editors/vim-lite', + 'emulators/linux_base-f10', 'emulators/mtools', 'graphics/png', 'graphics/xv', 'irc/xchat', + 'lang/perl5.8', + 'mail/alpine', 'mail/exim', 'mail/fetchmail', 'mail/mutt', - 'mail/alpine', 'mail/popd', - 'mail/xfmail', 'mail/postfix', + 'mail/xfmail', 'net/cvsup-without-gui', 'net/rsync', 'net/samba3', 'news/slrn', 'news/tin', + 'ports-mgmt/p5-FreeBSD-Portindex', + 'ports-mgmt/portaudit', + 'ports-mgmt/portmaster', 'ports-mgmt/portupgrade', 'print/a2ps-letter', 'print/apsfilter', 'print/ghostscript7-nox11', - 'print/gv', 'print/psutils-letter', + 'print/gv', 'shells/bash', 'shells/pdksh', 'shells/zsh', 'security/sudo', + 'sysutils/screen', 'www/links', 'www/lynx', + 'x11/gnome2', + 'x11/kde4', 'x11/rxvt', - 'ports-mgmt/portaudit']) + 'x11/xorg', + 'x11-wm/afterstep', + 'x11-wm/fvwm2', + 'x11-wm/windowmaker']) return pkgs # The list of desired packages diff --git a/release/sparc64/boot_crunch.conf b/release/sparc64/boot_crunch.conf index 93f6c9361622..ef9f3e1ecd0a 100644 --- a/release/sparc64/boot_crunch.conf +++ b/release/sparc64/boot_crunch.conf @@ -20,7 +20,6 @@ progs mount_nfs progs newfs progs route progs rtsol -progs slattach progs tunefs ln fsck_ffs fsck_4.2bsd ln fsck_ffs fsck_ufs diff --git a/release/sun4v/boot_crunch.conf b/release/sun4v/boot_crunch.conf index 93f6c9361622..ef9f3e1ecd0a 100644 --- a/release/sun4v/boot_crunch.conf +++ b/release/sun4v/boot_crunch.conf @@ -20,7 +20,6 @@ progs mount_nfs progs newfs progs route progs rtsol -progs slattach progs tunefs ln fsck_ffs fsck_4.2bsd ln fsck_ffs fsck_ufs diff --git a/sbin/Makefile b/sbin/Makefile index 8ece390460d0..72f4bff7782d 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -36,6 +36,8 @@ SUBDIR= adjkerntz \ ggate \ growfs \ gvinum \ + hastctl \ + hastd \ ifconfig \ init \ ${_ipf} \ diff --git a/sbin/Makefile.inc b/sbin/Makefile.inc index 70d658416ea9..e506f9c56cee 100644 --- a/sbin/Makefile.inc +++ b/sbin/Makefile.inc @@ -4,7 +4,7 @@ .include BINDIR?= /sbin -WARNS?= 2 +WARNS?= 6 .if ${MK_DYNAMICROOT} == "no" NO_SHARED?= YES diff --git a/sbin/atacontrol/Makefile b/sbin/atacontrol/Makefile index 73b916080d42..9881273c2117 100644 --- a/sbin/atacontrol/Makefile +++ b/sbin/atacontrol/Makefile @@ -2,6 +2,5 @@ PROG= atacontrol MAN= atacontrol.8 -WARNS?= 6 .include diff --git a/sbin/atacontrol/atacontrol.c b/sbin/atacontrol/atacontrol.c index f68596c9981d..4354ddfb7633 100644 --- a/sbin/atacontrol/atacontrol.c +++ b/sbin/atacontrol/atacontrol.c @@ -42,28 +42,41 @@ static const char * mode2str(int mode) { - switch (mode) { + switch (mode & 0xff) { case ATA_PIO: return "BIOSPIO"; case ATA_PIO0: return "PIO0"; case ATA_PIO1: return "PIO1"; case ATA_PIO2: return "PIO2"; case ATA_PIO3: return "PIO3"; case ATA_PIO4: return "PIO4"; + case ATA_WDMA0: return "WDMA0"; + case ATA_WDMA1: return "WDMA1"; case ATA_WDMA2: return "WDMA2"; + case ATA_UDMA0: return "UDMA0"; + case ATA_UDMA1: return "UDMA1"; case ATA_UDMA2: return "UDMA33"; + case ATA_UDMA3: return "UDMA44"; case ATA_UDMA4: return "UDMA66"; case ATA_UDMA5: return "UDMA100"; case ATA_UDMA6: return "UDMA133"; - case ATA_SA150: return "SATA150"; - case ATA_SA300: return "SATA300"; - case ATA_USB: return "USB"; - case ATA_USB1: return "USB1"; - case ATA_USB2: return "USB2"; case ATA_DMA: return "BIOSDMA"; default: return "???"; } } +static const char * +satarev2str(int mode) +{ + switch ((mode & 0xff00) >> 8) { + case 0: return ""; + case 1: return "SATA 1.5Gb/s"; + case 2: return "SATA 3Gb/s"; + case 3: return "SATA 6Gb/s"; + case 0xff: return "SATA"; + default: return "???"; + } +} + static int str2mode(char *str) { @@ -73,20 +86,23 @@ str2mode(char *str) if (!strcasecmp(str, "PIO2")) return ATA_PIO2; if (!strcasecmp(str, "PIO3")) return ATA_PIO3; if (!strcasecmp(str, "PIO4")) return ATA_PIO4; + if (!strcasecmp(str, "WDMA0")) return ATA_WDMA0; + if (!strcasecmp(str, "WDMA1")) return ATA_WDMA1; if (!strcasecmp(str, "WDMA2")) return ATA_WDMA2; + if (!strcasecmp(str, "UDMA0")) return ATA_UDMA0; + if (!strcasecmp(str, "UDMA16")) return ATA_UDMA0; + if (!strcasecmp(str, "UDMA1")) return ATA_UDMA1; + if (!strcasecmp(str, "UDMA25")) return ATA_UDMA1; if (!strcasecmp(str, "UDMA2")) return ATA_UDMA2; if (!strcasecmp(str, "UDMA33")) return ATA_UDMA2; + if (!strcasecmp(str, "UDMA3")) return ATA_UDMA3; + if (!strcasecmp(str, "UDMA44")) return ATA_UDMA3; if (!strcasecmp(str, "UDMA4")) return ATA_UDMA4; if (!strcasecmp(str, "UDMA66")) return ATA_UDMA4; if (!strcasecmp(str, "UDMA5")) return ATA_UDMA5; if (!strcasecmp(str, "UDMA100")) return ATA_UDMA5; if (!strcasecmp(str, "UDMA6")) return ATA_UDMA6; if (!strcasecmp(str, "UDMA133")) return ATA_UDMA6; - if (!strcasecmp(str, "SATA150")) return ATA_SA150; - if (!strcasecmp(str, "SATA300")) return ATA_SA300; - if (!strcasecmp(str, "USB")) return ATA_USB; - if (!strcasecmp(str, "USB1")) return ATA_USB1; - if (!strcasecmp(str, "USB2")) return ATA_USB2; if (!strcasecmp(str, "BIOSDMA")) return ATA_DMA; return -1; } @@ -377,7 +393,8 @@ main(int argc, char **argv) if (argc == 3 || argc == 4) { if (ioctl(fd, IOCATAGMODE, &mode) < 0) err(1, "ioctl(IOCATAGMODE)"); - printf("current mode = %s\n", mode2str(mode)); + printf("current mode = %s %s\n", + mode2str(mode), satarev2str(mode)); } exit(EX_OK); } diff --git a/sbin/atm/atmconfig/Makefile b/sbin/atm/atmconfig/Makefile index 1db0fa46dc00..8564d355efbb 100644 --- a/sbin/atm/atmconfig/Makefile +++ b/sbin/atm/atmconfig/Makefile @@ -29,8 +29,6 @@ CLEANFILES+= oid.h .if ${MACHINE_ARCH} == "arm" WARNS?= 3 -.else -WARNS?= 6 .endif FILES= atmconfig.help atmconfig_device.help diff --git a/sbin/badsect/Makefile b/sbin/badsect/Makefile index a39227716b77..b6cb545e09f5 100644 --- a/sbin/badsect/Makefile +++ b/sbin/badsect/Makefile @@ -5,5 +5,6 @@ PROG= badsect DPADD= ${LIBUFS} LDADD= -lufs MAN= badsect.8 +WARNS?= 2 .include diff --git a/sbin/bsdlabel/Makefile b/sbin/bsdlabel/Makefile index 562b0f38c1a4..b60bbd03addb 100644 --- a/sbin/bsdlabel/Makefile +++ b/sbin/bsdlabel/Makefile @@ -13,6 +13,7 @@ LINKS= ${BINDIR}/bsdlabel ${BINDIR}/disklabel MLINKS= bsdlabel.8 disklabel.8 .endif +WARNS?= 2 DPADD= ${LIBGEOM} ${LIBBSDXML} ${LIBSBUF} LDADD= -lgeom -lbsdxml -lsbuf diff --git a/sbin/camcontrol/Makefile b/sbin/camcontrol/Makefile index 7a3d4213cbac..31bbd46f4a52 100644 --- a/sbin/camcontrol/Makefile +++ b/sbin/camcontrol/Makefile @@ -9,8 +9,6 @@ CFLAGS+= -DMINIMALISTIC .endif .if ${MACHINE_ARCH} == "arm" WARNS?= 3 -.else -WARNS?= 6 .endif DPADD= ${LIBCAM} ${LIBSBUF} ${LIBUTIL} LDADD= -lcam -lsbuf -lutil diff --git a/sbin/camcontrol/camcontrol.8 b/sbin/camcontrol/camcontrol.8 index b987cad2e072..d1e9587ab951 100644 --- a/sbin/camcontrol/camcontrol.8 +++ b/sbin/camcontrol/camcontrol.8 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 4, 2009 +.Dd January 20, 2010 .Dt CAMCONTROL 8 .Os .Sh NAME @@ -62,6 +62,7 @@ .Ic identify .Op device id .Op generic args +.Op Fl v .Nm .Ic reportluns .Op device id @@ -149,6 +150,7 @@ .Op generic args .Op Fl c .Op Fl D Ar enable|disable +.Op Fl M Ar mode .Op Fl O Ar offset .Op Fl q .Op Fl R Ar syncrate @@ -165,6 +167,20 @@ .Op Fl w .Op Fl y .Nm +.Ic idle +.Op device id +.Op generic args +.Op Fl t Ar time +.Nm +.Ic standby +.Op device id +.Op generic args +.Op Fl t Ar time +.Nm +.Ic sleep +.Op device id +.Op generic args +.Nm .Ic help .Sh DESCRIPTION The @@ -691,6 +707,8 @@ Show or set current negotiation settings. This is the default. .It Fl D Ar enable|disable Enable or disable disconnection. +.It Fl M Ar mode +Set ATA mode. .It Fl O Ar offset Set the command delay offset. .It Fl q @@ -821,6 +839,15 @@ The user will not be asked about the timeout if a timeout is specified on the command line. .El +.It Ic idle +Put ATA device into IDLE state. Optional parameter specifies automatic +idle timer value in seconds. +.It Ic standby +Put ATA device into STANDBY state. Optional parameter specifies automatic +standby timer value in seconds. +.It Ic sleep +Put ATA device into SLEEP state. Note that the only way get device out of +this state may be reset. .It Ic help Print out verbose usage information. .El diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c index 7da0200e8291..8e0605f6de21 100644 --- a/sbin/camcontrol/camcontrol.c +++ b/sbin/camcontrol/camcontrol.c @@ -74,7 +74,10 @@ typedef enum { CAM_CMD_DETACH = 0x00000010, CAM_CMD_REPORTLUNS = 0x00000011, CAM_CMD_READCAP = 0x00000012, - CAM_CMD_IDENTIFY = 0x00000013 + CAM_CMD_IDENTIFY = 0x00000013, + CAM_CMD_IDLE = 0x00000014, + CAM_CMD_STANDBY = 0x00000015, + CAM_CMD_SLEEP = 0x00000016 } cam_cmdmask; typedef enum { @@ -122,7 +125,7 @@ struct camcontrol_opts { #ifndef MINIMALISTIC static const char scsicmd_opts[] = "a:c:i:o:r"; static const char readdefect_opts[] = "f:GP"; -static const char negotiate_opts[] = "acD:O:qR:T:UW:"; +static const char negotiate_opts[] = "acD:M:O:qR:T:UW:"; #endif struct camcontrol_opts option_table[] = { @@ -154,6 +157,9 @@ struct camcontrol_opts option_table[] = { {"rate", CAM_CMD_RATE, CAM_ARG_NONE, negotiate_opts}, {"debug", CAM_CMD_DEBUG, CAM_ARG_NONE, "IPTSXc"}, {"format", CAM_CMD_FORMAT, CAM_ARG_NONE, "qrwy"}, + {"idle", CAM_CMD_IDLE, CAM_ARG_NONE, "t:"}, + {"standby", CAM_CMD_STANDBY, CAM_ARG_NONE, "t:"}, + {"sleep", CAM_CMD_SLEEP, CAM_ARG_NONE, ""}, #endif /* MINIMALISTIC */ {"help", CAM_CMD_USAGE, CAM_ARG_NONE, NULL}, {"-?", CAM_CMD_USAGE, CAM_ARG_NONE, NULL}, @@ -186,7 +192,7 @@ static int scsidoinquiry(struct cam_device *device, int argc, char **argv, char *combinedopt, int retry_count, int timeout); static int scsiinquiry(struct cam_device *device, int retry_count, int timeout); static int scsiserial(struct cam_device *device, int retry_count, int timeout); -static int scsixferrate(struct cam_device *device); +static int camxferrate(struct cam_device *device); #endif /* MINIMALISTIC */ static int parse_btl(char *tstr, int *bus, int *target, int *lun, cam_argmask *arglst); @@ -217,7 +223,15 @@ static int scsireportluns(struct cam_device *device, int argc, char **argv, char *combinedopt, int retry_count, int timeout); static int scsireadcapacity(struct cam_device *device, int argc, char **argv, char *combinedopt, int retry_count, int timeout); +static int atapm(struct cam_device *device, int argc, char **argv, + char *combinedopt, int retry_count, int timeout); #endif /* MINIMALISTIC */ +#ifndef min +#define min(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef max +#define max(a,b) (((a)>(b))?(a):(b)) +#endif camcontrol_optret getoption(char *arg, cam_cmdmask *cmdnum, cam_argmask *argnum, @@ -663,7 +677,7 @@ scsidoinquiry(struct cam_device *device, int argc, char **argv, return(error); if (arglist & CAM_ARG_GET_XFERRATE) - error = scsixferrate(device); + error = camxferrate(device); return(error); } @@ -873,14 +887,18 @@ scsiserial(struct cam_device *device, int retry_count, int timeout) } static int -scsixferrate(struct cam_device *device) +camxferrate(struct cam_device *device) { + struct ccb_pathinq cpi; u_int32_t freq = 0; u_int32_t speed = 0; union ccb *ccb; u_int mb; int retval = 0; + if ((retval = get_cpi(device, &cpi)) != 0) + return (1); + ccb = cam_getccb(device); if (ccb == NULL) { @@ -913,6 +931,8 @@ scsixferrate(struct cam_device *device) } + speed = cpi.base_transfer_speed; + freq = 0; if (ccb->cts.transport == XPORT_SPI) { struct ccb_trans_settings_spi *spi = &ccb->cts.xport_specific.spi; @@ -920,35 +940,54 @@ scsixferrate(struct cam_device *device) if ((spi->valid & CTS_SPI_VALID_SYNC_RATE) != 0) { freq = scsi_calc_syncsrate(spi->sync_period); speed = freq; - } else { - struct ccb_pathinq cpi; - - retval = get_cpi(device, &cpi); - if (retval == 0) { - speed = cpi.base_transfer_speed; - freq = 0; - } } - - fprintf(stdout, "%s%d: ", device->device_name, - device->dev_unit_num); - if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0) { speed *= (0x01 << spi->bus_width); } + } else if (ccb->cts.transport == XPORT_FC) { + struct ccb_trans_settings_fc *fc = + &ccb->cts.xport_specific.fc; - mb = speed / 1000; + if (fc->valid & CTS_FC_VALID_SPEED) + speed = fc->bitrate; + } else if (ccb->cts.transport == XPORT_SAS) { + struct ccb_trans_settings_sas *sas = + &ccb->cts.xport_specific.sas; - if (mb > 0) - fprintf(stdout, "%d.%03dMB/s transfers ", - mb, speed % 1000); - else - fprintf(stdout, "%dKB/s transfers ", - speed); + if (sas->valid & CTS_SAS_VALID_SPEED) + speed = sas->bitrate; + } else if (ccb->cts.transport == XPORT_ATA) { + struct ccb_trans_settings_ata *ata = + &ccb->cts.xport_specific.ata; + + if (ata->valid & CTS_ATA_VALID_MODE) + speed = ata_mode2speed(ata->mode); + } else if (ccb->cts.transport == XPORT_SATA) { + struct ccb_trans_settings_sata *sata = + &ccb->cts.xport_specific.sata; + + if (sata->valid & CTS_SATA_VALID_REVISION) + speed = ata_revision2speed(sata->revision); + } + + mb = speed / 1000; + if (mb > 0) { + fprintf(stdout, "%s%d: %d.%03dMB/s transfers", + device->device_name, device->dev_unit_num, + mb, speed % 1000); + } else { + fprintf(stdout, "%s%d: %dKB/s transfers", + device->device_name, device->dev_unit_num, + speed); + } + + if (ccb->cts.transport == XPORT_SPI) { + struct ccb_trans_settings_spi *spi = + &ccb->cts.xport_specific.spi; if (((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) != 0) && (spi->sync_offset != 0)) - fprintf(stdout, "(%d.%03dMHz, offset %d", freq / 1000, + fprintf(stdout, " (%d.%03dMHz, offset %d", freq / 1000, freq % 1000, spi->sync_offset); if (((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0) @@ -964,25 +1003,34 @@ scsixferrate(struct cam_device *device) && (spi->sync_offset != 0)) { fprintf(stdout, ")"); } - } else { - struct ccb_pathinq cpi; + } else if (ccb->cts.transport == XPORT_ATA) { + struct ccb_trans_settings_ata *ata = + &ccb->cts.xport_specific.ata; - retval = get_cpi(device, &cpi); + printf(" ("); + if (ata->valid & CTS_ATA_VALID_MODE) + printf("%s, ", ata_mode2string(ata->mode)); + if ((ata->valid & CTS_ATA_VALID_ATAPI) && ata->atapi != 0) + printf("ATAPI %dbytes, ", ata->atapi); + if (ata->valid & CTS_ATA_VALID_BYTECOUNT) + printf("PIO %dbytes", ata->bytecount); + printf(")"); + } else if (ccb->cts.transport == XPORT_SATA) { + struct ccb_trans_settings_sata *sata = + &ccb->cts.xport_specific.sata; - if (retval != 0) - goto xferrate_bailout; - - speed = cpi.base_transfer_speed; - freq = 0; - - mb = speed / 1000; - - if (mb > 0) - fprintf(stdout, "%d.%03dMB/s transfers ", - mb, speed % 1000); + printf(" ("); + if (sata->valid & CTS_SATA_VALID_REVISION) + printf("SATA %d.x, ", sata->revision); else - fprintf(stdout, "%dKB/s transfers ", - speed); + printf("SATA, "); + if (sata->valid & CTS_SATA_VALID_MODE) + printf("%s, ", ata_mode2string(sata->mode)); + if ((sata->valid & CTS_SATA_VALID_ATAPI) && sata->atapi != 0) + printf("ATAPI %dbytes, ", sata->atapi); + if (sata->valid & CTS_SATA_VALID_BYTECOUNT) + printf("PIO %dbytes", sata->bytecount); + printf(")"); } if (ccb->cts.protocol == PROTO_SCSI) { @@ -1019,22 +1067,36 @@ atacapprint(struct ata_params *parm) printf("protocol "); printf("ATA/ATAPI-%d", ata_version(parm->version_major)); if (parm->satacapabilities && parm->satacapabilities != 0xffff) { - if (parm->satacapabilities & ATA_SATA_GEN2) + if (parm->satacapabilities & ATA_SATA_GEN3) + printf(" SATA 3.x\n"); + else if (parm->satacapabilities & ATA_SATA_GEN2) printf(" SATA 2.x\n"); else if (parm->satacapabilities & ATA_SATA_GEN1) printf(" SATA 1.x\n"); else - printf(" SATA x.x\n"); + printf(" SATA\n"); } else printf("\n"); printf("device model %.40s\n", parm->model); - printf("serial number %.20s\n", parm->serial); printf("firmware revision %.8s\n", parm->revision); + printf("serial number %.20s\n", parm->serial); + if (parm->enabled.extension & ATA_SUPPORT_64BITWWN) { + printf("WWN %02x%02x%02x%02x\n", + parm->wwn[0], parm->wwn[1], parm->wwn[2], parm->wwn[3]); + } + if (parm->enabled.extension & ATA_SUPPORT_MEDIASN) { + printf("media serial number %.30s\n", + parm->media_serial); + } printf("cylinders %d\n", parm->cylinders); printf("heads %d\n", parm->heads); printf("sectors/track %d\n", parm->sectors); + printf("sector size logical %u, physical %lu, offset %lu\n", + ata_logical_sector_size(parm), + (unsigned long)ata_physical_sector_size(parm), + (unsigned long)ata_logical_sector_offset(parm)); if (parm->config == ATA_PROTO_CFA || (parm->support.command2 & ATA_SUPPORT_CFA)) @@ -1071,6 +1133,8 @@ atacapprint(struct ata_params *parm) default: printf("0"); } + if ((parm->capabilities1 & ATA_SUPPORT_IORDY) == 0) + printf(" w/o IORDY"); printf("\n"); printf("DMA%ssupported ", @@ -1108,56 +1172,61 @@ atacapprint(struct ata_params *parm) } printf("\n"); - printf("overlap%ssupported\n", - parm->capabilities1 & ATA_SUPPORT_OVERLAP ? " " : " not "); + if (parm->media_rotation_rate == 1) { + printf("media RPM non-rotating\n"); + } else if (parm->media_rotation_rate >= 0x0401 && + parm->media_rotation_rate <= 0xFFFE) { + printf("media RPM %d\n", + parm->media_rotation_rate); + } printf("\nFeature " "Support Enable Value Vendor\n"); - - printf("write cache %s %s\n", - parm->support.command1 & ATA_SUPPORT_WRITECACHE ? "yes" : "no", - parm->enabled.command1 & ATA_SUPPORT_WRITECACHE ? "yes" : "no"); - printf("read ahead %s %s\n", parm->support.command1 & ATA_SUPPORT_LOOKAHEAD ? "yes" : "no", parm->enabled.command1 & ATA_SUPPORT_LOOKAHEAD ? "yes" : "no"); - - if (parm->satacapabilities && parm->satacapabilities != 0xffff) { - printf("Native Command Queuing (NCQ) %s " - " %d/0x%02X\n", - parm->satacapabilities & ATA_SUPPORT_NCQ ? - "yes" : "no", - (parm->satacapabilities & ATA_SUPPORT_NCQ) ? - ATA_QUEUE_LEN(parm->queue) : 0, - (parm->satacapabilities & ATA_SUPPORT_NCQ) ? - ATA_QUEUE_LEN(parm->queue) : 0); - } - printf("Tagged Command Queuing (TCQ) %s %s %d/0x%02X\n", + printf("write cache %s %s\n", + parm->support.command1 & ATA_SUPPORT_WRITECACHE ? "yes" : "no", + parm->enabled.command1 & ATA_SUPPORT_WRITECACHE ? "yes" : "no"); + printf("flush cache %s %s\n", + parm->support.command2 & ATA_SUPPORT_FLUSHCACHE ? "yes" : "no", + parm->enabled.command2 & ATA_SUPPORT_FLUSHCACHE ? "yes" : "no"); + printf("overlap %s\n", + parm->capabilities1 & ATA_SUPPORT_OVERLAP ? "yes" : "no"); + printf("Tagged Command Queuing (TCQ) %s %s", parm->support.command2 & ATA_SUPPORT_QUEUED ? "yes" : "no", - parm->enabled.command2 & ATA_SUPPORT_QUEUED ? "yes" : "no", - ATA_QUEUE_LEN(parm->queue), ATA_QUEUE_LEN(parm->queue)); - + parm->enabled.command2 & ATA_SUPPORT_QUEUED ? "yes" : "no"); + if (parm->support.command2 & ATA_SUPPORT_QUEUED) { + printf(" %d tags\n", + ATA_QUEUE_LEN(parm->queue) + 1); + } else + printf("\n"); + if (parm->satacapabilities && parm->satacapabilities != 0xffff) { + printf("Native Command Queuing (NCQ) %s ", + parm->satacapabilities & ATA_SUPPORT_NCQ ? + "yes" : "no"); + if (parm->satacapabilities & ATA_SUPPORT_NCQ) { + printf(" %d tags\n", + ATA_QUEUE_LEN(parm->queue) + 1); + } else + printf("\n"); + } printf("SMART %s %s\n", parm->support.command1 & ATA_SUPPORT_SMART ? "yes" : "no", parm->enabled.command1 & ATA_SUPPORT_SMART ? "yes" : "no"); - printf("microcode download %s %s\n", parm->support.command2 & ATA_SUPPORT_MICROCODE ? "yes" : "no", parm->enabled.command2 & ATA_SUPPORT_MICROCODE ? "yes" : "no"); - printf("security %s %s\n", parm->support.command1 & ATA_SUPPORT_SECURITY ? "yes" : "no", parm->enabled.command1 & ATA_SUPPORT_SECURITY ? "yes" : "no"); - printf("power management %s %s\n", parm->support.command1 & ATA_SUPPORT_POWERMGT ? "yes" : "no", parm->enabled.command1 & ATA_SUPPORT_POWERMGT ? "yes" : "no"); - printf("advanced power management %s %s %d/0x%02X\n", parm->support.command2 & ATA_SUPPORT_APM ? "yes" : "no", parm->enabled.command2 & ATA_SUPPORT_APM ? "yes" : "no", parm->apm_value, parm->apm_value); - printf("automatic acoustic management %s %s " "%d/0x%02X %d/0x%02X\n", parm->support.command2 & ATA_SUPPORT_AUTOACOUSTIC ? "yes" :"no", @@ -1166,6 +1235,24 @@ atacapprint(struct ata_params *parm) ATA_ACOUSTIC_CURRENT(parm->acoustic), ATA_ACOUSTIC_VENDOR(parm->acoustic), ATA_ACOUSTIC_VENDOR(parm->acoustic)); + printf("media status notification %s %s\n", + parm->support.command2 & ATA_SUPPORT_NOTIFY ? "yes" : "no", + parm->enabled.command2 & ATA_SUPPORT_NOTIFY ? "yes" : "no"); + printf("power-up in Standby %s %s\n", + parm->support.command2 & ATA_SUPPORT_STANDBY ? "yes" : "no", + parm->enabled.command2 & ATA_SUPPORT_STANDBY ? "yes" : "no"); + printf("write-read-verify %s %s %d/0x%x\n", + parm->support2 & ATA_SUPPORT_WRITEREADVERIFY ? "yes" : "no", + parm->enabled2 & ATA_SUPPORT_WRITEREADVERIFY ? "yes" : "no", + parm->wrv_mode, parm->wrv_mode); + printf("unload %s %s\n", + parm->support.extension & ATA_SUPPORT_UNLOAD ? "yes" : "no", + parm->enabled.extension & ATA_SUPPORT_UNLOAD ? "yes" : "no"); + printf("free-fall %s %s\n", + parm->support2 & ATA_SUPPORT_FREEFALL ? "yes" : "no", + parm->enabled2 & ATA_SUPPORT_FREEFALL ? "yes" : "no"); + printf("data set management (TRIM) %s\n", + parm->support_dsm & ATA_SUPPORT_DSM_TRIM ? "yes" : "no"); } @@ -1252,8 +1339,18 @@ ataidentify(struct cam_device *device, int retry_count, int timeout) for (i = 0; i < sizeof(struct ata_params) / 2; i++) ptr[i] = le16toh(ptr[i]); + if (arglist & CAM_ARG_VERBOSE) { + fprintf(stdout, "%s%d: Raw identify data:\n", + device->device_name, device->dev_unit_num); + for (i = 0; i < sizeof(struct ata_params) / 2; i++) { + if ((i % 8) == 0) + fprintf(stdout, " %3d: ", i); + fprintf(stdout, "%04x ", (uint16_t)ptr[i]); + if ((i % 8) == 7) + fprintf(stdout, "\n"); + } + } ident_buf = (struct ata_params *)ptr; - if (strncmp(ident_buf->model, "FX", 2) && strncmp(ident_buf->model, "NEC", 3) && strncmp(ident_buf->model, "Pioneer", 7) && @@ -1261,6 +1358,7 @@ ataidentify(struct cam_device *device, int retry_count, int timeout) ata_bswap(ident_buf->model, sizeof(ident_buf->model)); ata_bswap(ident_buf->revision, sizeof(ident_buf->revision)); ata_bswap(ident_buf->serial, sizeof(ident_buf->serial)); + ata_bswap(ident_buf->media_serial, sizeof(ident_buf->media_serial)); } ata_btrim(ident_buf->model, sizeof(ident_buf->model)); ata_bpack(ident_buf->model, ident_buf->model, sizeof(ident_buf->model)); @@ -1268,10 +1366,14 @@ ataidentify(struct cam_device *device, int retry_count, int timeout) ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision)); ata_btrim(ident_buf->serial, sizeof(ident_buf->serial)); ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial)); + ata_btrim(ident_buf->media_serial, sizeof(ident_buf->media_serial)); + ata_bpack(ident_buf->media_serial, ident_buf->media_serial, + sizeof(ident_buf->media_serial)); fprintf(stdout, "%s%d: ", device->device_name, device->dev_unit_num); ata_print_ident(ident_buf); + camxferrate(device); atacapprint(ident_buf); free(ident_buf); @@ -2206,6 +2308,7 @@ scsicmd(struct cam_device *device, int argc, char **argv, char *combinedopt, error = 1; goto scsicmd_bailout; } + bzero(data_ptr, data_bytes); /* * If the user supplied "-" instead of a format, he * wants the data to be read from stdin. @@ -2695,7 +2798,52 @@ cts_print(struct cam_device *device, struct ccb_trans_settings *cts) "enabled" : "disabled"); } } + if (cts->transport == XPORT_ATA) { + struct ccb_trans_settings_ata *ata = + &cts->xport_specific.ata; + if ((ata->valid & CTS_ATA_VALID_MODE) != 0) { + fprintf(stdout, "%sATA mode: %s\n", pathstr, + ata_mode2string(ata->mode)); + } + if ((ata->valid & CTS_ATA_VALID_ATAPI) != 0) { + fprintf(stdout, "%sATAPI packet length: %d\n", pathstr, + ata->atapi); + } + if ((ata->valid & CTS_ATA_VALID_BYTECOUNT) != 0) { + fprintf(stdout, "%sPIO transaction length: %d\n", + pathstr, ata->bytecount); + } + } + if (cts->transport == XPORT_SATA) { + struct ccb_trans_settings_sata *sata = + &cts->xport_specific.sata; + + if ((sata->valid & CTS_SATA_VALID_REVISION) != 0) { + fprintf(stdout, "%sSATA revision: %d.x\n", pathstr, + sata->revision); + } + if ((sata->valid & CTS_SATA_VALID_MODE) != 0) { + fprintf(stdout, "%sATA mode: %s\n", pathstr, + ata_mode2string(sata->mode)); + } + if ((sata->valid & CTS_SATA_VALID_ATAPI) != 0) { + fprintf(stdout, "%sATAPI packet length: %d\n", pathstr, + sata->atapi); + } + if ((sata->valid & CTS_SATA_VALID_BYTECOUNT) != 0) { + fprintf(stdout, "%sPIO transaction length: %d\n", + pathstr, sata->bytecount); + } + if ((sata->valid & CTS_SATA_VALID_PM) != 0) { + fprintf(stdout, "%sPMP presence: %d\n", pathstr, + sata->pm_present); + } + if ((sata->valid & CTS_SATA_VALID_TAGS) != 0) { + fprintf(stdout, "%sNumber of tags: %d\n", pathstr, + sata->tags); + } + } if (cts->protocol == PROTO_SCSI) { struct ccb_trans_settings_scsi *scsi= &cts->proto_specific.scsi; @@ -2995,6 +3143,7 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, int user_settings = 0; int retval = 0; int disc_enable = -1, tag_enable = -1; + int mode = -1; int offset = -1; double syncrate = -1; int bus_width = -1; @@ -3003,12 +3152,10 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, struct ccb_pathinq cpi; ccb = cam_getccb(device); - if (ccb == NULL) { warnx("ratecontrol: error allocating ccb"); return(1); } - while ((c = getopt(argc, argv, combinedopt)) != -1) { switch(c){ case 'a': @@ -3029,6 +3176,15 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, } change_settings = 1; break; + case 'M': + mode = ata_string2mode(optarg); + if (mode < 0) { + warnx("unknown mode '%s'", optarg); + retval = 1; + goto ratecontrol_bailout; + } + change_settings = 1; + break; case 'O': offset = strtol(optarg, NULL, 0); if (offset < 0) { @@ -3043,7 +3199,6 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, break; case 'R': syncrate = atof(optarg); - if (syncrate < 0) { warnx("sync rate %f is < 0", syncrate); retval = 1; @@ -3079,17 +3234,14 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, break; } } - bzero(&(&ccb->ccb_h)[1], sizeof(struct ccb_pathinq) - sizeof(struct ccb_hdr)); - /* * Grab path inquiry information, so we can determine whether * or not the initiator is capable of the things that the user * requests. */ ccb->ccb_h.func_code = XPT_PATH_INQ; - if (cam_send_ccb(device, ccb) < 0) { perror("error sending XPT_PATH_INQ CCB"); if (arglist & CAM_ARG_VERBOSE) { @@ -3099,7 +3251,6 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, retval = 1; goto ratecontrol_bailout; } - if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { warnx("XPT_PATH_INQ CCB failed"); if (arglist & CAM_ARG_VERBOSE) { @@ -3109,17 +3260,14 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, retval = 1; goto ratecontrol_bailout; } - bcopy(&ccb->cpi, &cpi, sizeof(struct ccb_pathinq)); - bzero(&(&ccb->ccb_h)[1], sizeof(struct ccb_trans_settings) - sizeof(struct ccb_hdr)); - - if (quiet == 0) - fprintf(stdout, "Current Parameters:\n"); - + if (quiet == 0) { + fprintf(stdout, "%s parameters:\n", + user_settings ? "User" : "Current"); + } retval = get_print_cts(device, user_settings, quiet, &ccb->cts); - if (retval != 0) goto ratecontrol_bailout; @@ -3129,16 +3277,20 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, if (change_settings) { int didsettings = 0; struct ccb_trans_settings_spi *spi = NULL; + struct ccb_trans_settings_ata *ata = NULL; + struct ccb_trans_settings_sata *sata = NULL; struct ccb_trans_settings_scsi *scsi = NULL; - if (ccb->cts.transport == XPORT_SPI) { + if (ccb->cts.transport == XPORT_SPI) spi = &ccb->cts.xport_specific.spi; - spi->valid = 0; - } - if (ccb->cts.protocol == PROTO_SCSI) { + if (ccb->cts.transport == XPORT_ATA) + ata = &ccb->cts.xport_specific.ata; + if (ccb->cts.transport == XPORT_SATA) + sata = &ccb->cts.xport_specific.sata; + if (ccb->cts.protocol == PROTO_SCSI) scsi = &ccb->cts.proto_specific.scsi; - scsi->valid = 0; - } + ccb->cts.xport_specific.valid = 0; + ccb->cts.proto_specific.valid = 0; if (spi && disc_enable != -1) { spi->valid |= CTS_SPI_VALID_DISC; if (disc_enable == 0) @@ -3146,7 +3298,6 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, else spi->flags |= CTS_SPI_FLAGS_DISC_ENB; } - if (scsi && tag_enable != -1) { if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0) { warnx("HBA does not support tagged queueing, " @@ -3154,21 +3305,16 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, retval = 1; goto ratecontrol_bailout; } - scsi->valid |= CTS_SCSI_VALID_TQ; - if (tag_enable == 0) scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; else scsi->flags |= CTS_SCSI_FLAGS_TAG_ENB; didsettings++; } - if (spi && offset != -1) { if ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0) { - warnx("HBA at %s%d is not cable of changing " - "offset", cpi.dev_name, - cpi.unit_number); + warnx("HBA is not capable of changing offset"); retval = 1; goto ratecontrol_bailout; } @@ -3176,28 +3322,23 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, spi->sync_offset = offset; didsettings++; } - if (spi && syncrate != -1) { int prelim_sync_period; u_int freq; if ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0) { - warnx("HBA at %s%d is not cable of changing " - "transfer rates", cpi.dev_name, - cpi.unit_number); + warnx("HBA is not capable of changing " + "transfer rates"); retval = 1; goto ratecontrol_bailout; } - spi->valid |= CTS_SPI_VALID_SYNC_RATE; - /* * The sync rate the user gives us is in MHz. * We need to translate it into KHz for this * calculation. */ syncrate *= 1000; - /* * Next, we calculate a "preliminary" sync period * in tenths of a nanosecond. @@ -3206,14 +3347,43 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, prelim_sync_period = 0; else prelim_sync_period = 10000000 / syncrate; - spi->sync_period = scsi_calc_syncparam(prelim_sync_period); - freq = scsi_calc_syncsrate(spi->sync_period); didsettings++; } - + if (sata && syncrate != -1) { + if ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0) { + warnx("HBA is not capable of changing " + "transfer rates"); + retval = 1; + goto ratecontrol_bailout; + } + sata->revision = ata_speed2revision(syncrate * 100); + if (sata->revision < 0) { + warnx("Invalid rate %f", syncrate); + retval = 1; + goto ratecontrol_bailout; + } + sata->valid |= CTS_SATA_VALID_REVISION; + didsettings++; + } + if ((ata || sata) && mode != -1) { + if ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0) { + warnx("HBA is not capable of changing " + "transfer rates"); + retval = 1; + goto ratecontrol_bailout; + } + if (ata) { + ata->mode = mode; + ata->valid |= CTS_ATA_VALID_MODE; + } else { + sata->mode = mode; + sata->valid |= CTS_SATA_VALID_MODE; + } + didsettings++; + } /* * The bus_width argument goes like this: * 0 == 8 bit @@ -3224,7 +3394,6 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, * number. */ if (spi && bus_width != -1) { - /* * We might as well validate things here with a * decipherable error message, rather than what @@ -3248,17 +3417,19 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, retval = 1; goto ratecontrol_bailout; } - spi->valid |= CTS_SPI_VALID_BUS_WIDTH; spi->bus_width = bus_width >> 4; didsettings++; } - if (didsettings == 0) { goto ratecontrol_bailout; } + if (!user_settings && (ata || sata)) { + warnx("You can modify only user settings for ATA/SATA"); + retval = 1; + goto ratecontrol_bailout; + } ccb->ccb_h.func_code = XPT_SET_TRAN_SETTINGS; - if (cam_send_ccb(device, ccb) < 0) { perror("error sending XPT_SET_TRAN_SETTINGS CCB"); if (arglist & CAM_ARG_VERBOSE) { @@ -3268,7 +3439,6 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, retval = 1; goto ratecontrol_bailout; } - if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { warnx("XPT_SET_TRANS_SETTINGS CCB failed"); if (arglist & CAM_ARG_VERBOSE) { @@ -3279,11 +3449,9 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, goto ratecontrol_bailout; } } - if (send_tur) { retval = testunitready(device, retry_count, timeout, (arglist & CAM_ARG_VERBOSE) ? 0 : 1); - /* * If the TUR didn't succeed, just bail. */ @@ -3292,7 +3460,6 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, fprintf(stderr, "Test Unit Ready failed\n"); goto ratecontrol_bailout; } - /* * If the user wants things quiet, there's no sense in * getting the transfer settings, if we're not going @@ -3300,13 +3467,11 @@ ratecontrol(struct cam_device *device, int retry_count, int timeout, */ if (quiet != 0) goto ratecontrol_bailout; - - fprintf(stdout, "New Parameters:\n"); + fprintf(stdout, "New parameters:\n"); retval = get_print_cts(device, user_settings, 0, NULL); } ratecontrol_bailout: - cam_freeccb(ccb); return(retval); } @@ -4074,6 +4239,91 @@ bailout: return (retval); } +static int +atapm(struct cam_device *device, int argc, char **argv, + char *combinedopt, int retry_count, int timeout) +{ + union ccb *ccb; + int retval = 0; + int t = -1; + int c; + u_char cmd, sc; + + ccb = cam_getccb(device); + + if (ccb == NULL) { + warnx("%s: error allocating ccb", __func__); + return (1); + } + + while ((c = getopt(argc, argv, combinedopt)) != -1) { + switch (c) { + case 't': + t = atoi(optarg); + break; + default: + break; + } + } + if (strcmp(argv[1], "idle") == 0) { + if (t == -1) + cmd = ATA_IDLE_IMMEDIATE; + else + cmd = ATA_IDLE_CMD; + } else if (strcmp(argv[1], "standby") == 0) { + if (t == -1) + cmd = ATA_STANDBY_IMMEDIATE; + else + cmd = ATA_STANDBY_CMD; + } else { + cmd = ATA_SLEEP; + t = -1; + } + if (t < 0) + sc = 0; + else if (t <= (240 * 5)) + sc = t / 5; + else if (t <= (11 * 30 * 60)) + sc = t / (30 * 60) + 241; + else + sc = 253; + cam_fill_ataio(&ccb->ataio, + retry_count, + NULL, + /*flags*/CAM_DIR_NONE, + MSG_SIMPLE_Q_TAG, + /*data_ptr*/NULL, + /*dxfer_len*/0, + timeout ? timeout : 30 * 1000); + ata_28bit_cmd(&ccb->ataio, cmd, 0, 0, sc); + + /* Disable freezing the device queue */ + ccb->ccb_h.flags |= CAM_DEV_QFRZDIS; + + if (arglist & CAM_ARG_ERR_RECOVER) + ccb->ccb_h.flags |= CAM_PASS_ERR_RECOVER; + + if (cam_send_ccb(device, ccb) < 0) { + warn("error sending command"); + + if (arglist & CAM_ARG_VERBOSE) + cam_error_print(device, ccb, CAM_ESF_ALL, + CAM_EPF_ALL, stderr); + + retval = 1; + goto bailout; + } + + if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + cam_error_print(device, ccb, CAM_ESF_ALL, CAM_EPF_ALL, stderr); + retval = 1; + goto bailout; + } +bailout: + cam_freeccb(ccb); + return (retval); +} + #endif /* MINIMALISTIC */ void @@ -4086,7 +4336,7 @@ usage(int verbose) " camcontrol periphlist [dev_id][-n dev_name] [-u unit]\n" " camcontrol tur [dev_id][generic args]\n" " camcontrol inquiry [dev_id][generic args] [-D] [-S] [-R]\n" -" camcontrol identify [dev_id][generic args]\n" +" camcontrol identify [dev_id][generic args] [-v]\n" " camcontrol reportluns [dev_id][generic args] [-c] [-l] [-r report]\n" " camcontrol readcap [dev_id][generic args] [-b] [-h] [-H] [-N]\n" " [-q] [-s]\n" @@ -4108,10 +4358,13 @@ usage(int verbose) " \n" " camcontrol tags [dev_id][generic args] [-N tags] [-q] [-v]\n" " camcontrol negotiate [dev_id][generic args] [-a][-c]\n" -" [-D ][-O offset][-q]\n" -" [-R syncrate][-v][-T ]\n" +" [-D ][-M mode][-O offset]\n" +" [-q][-R syncrate][-v][-T ]\n" " [-U][-W bus_width]\n" " camcontrol format [dev_id][generic args][-q][-r][-w][-y]\n" +" camcontrol idle [dev_id][generic args][-t time]\n" +" camcontrol standby [dev_id][generic args][-t time]\n" +" camcontrol sleep [dev_id][generic args]\n" #endif /* MINIMALISTIC */ " camcontrol help\n"); if (!verbose) @@ -4139,6 +4392,9 @@ usage(int verbose) "tags report or set the number of transaction slots for a device\n" "negotiate report or set device negotiation parameters\n" "format send the SCSI FORMAT UNIT command to the named device\n" +"idle send the ATA IDLE command to the named device\n" +"standby send the ATA STANDBY command to the named device\n" +"sleep send the ATA SLEEP command to the named device\n" "help this message\n" "Device Identifiers:\n" "bus:target specify the bus and target, lun defaults to 0\n" @@ -4194,6 +4450,7 @@ usage(int verbose) "-a send a test unit ready after negotiation\n" "-c report/set current negotiation settings\n" "-D \"enable\" or \"disable\" disconnection\n" +"-M mode set ATA mode\n" "-O offset set command delay offset\n" "-q be quiet, don't report anything\n" "-R syncrate synchronization rate in MHz\n" @@ -4205,7 +4462,9 @@ usage(int verbose) "-q be quiet, don't print status messages\n" "-r run in report only mode\n" "-w don't send immediate format command\n" -"-y don't ask any questions\n"); +"-y don't ask any questions\n" +"idle/standby arguments:\n" +"-t number of seconds before respective state.\n"); #endif /* MINIMALISTIC */ } @@ -4501,6 +4760,13 @@ main(int argc, char **argv) combinedopt, retry_count, timeout); break; + case CAM_CMD_IDLE: + case CAM_CMD_STANDBY: + case CAM_CMD_SLEEP: + error = atapm(cam_dev, argc, argv, + combinedopt, retry_count, + timeout); + break; #endif /* MINIMALISTIC */ case CAM_CMD_USAGE: usage(1); diff --git a/sbin/ccdconfig/Makefile b/sbin/ccdconfig/Makefile index ac7558409ed6..0feca5426dec 100644 --- a/sbin/ccdconfig/Makefile +++ b/sbin/ccdconfig/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG= ccdconfig -WARNS?= 6 MAN= ccdconfig.8 DPADD= ${LIBGEOM} diff --git a/sbin/clri/Makefile b/sbin/clri/Makefile index c68c312f269b..1ae0cf45e731 100644 --- a/sbin/clri/Makefile +++ b/sbin/clri/Makefile @@ -3,5 +3,6 @@ PROG= clri MAN= clri.8 +WARNS?= 2 .include diff --git a/sbin/comcontrol/Makefile b/sbin/comcontrol/Makefile index a7720d81b41e..d8757565b1a0 100644 --- a/sbin/comcontrol/Makefile +++ b/sbin/comcontrol/Makefile @@ -3,6 +3,5 @@ PROG= comcontrol MAN= comcontrol.8 -WARNS?= 6 .include diff --git a/sbin/comcontrol/comcontrol.c b/sbin/comcontrol/comcontrol.c index 753ded36d1a9..a7c696ce6794 100644 --- a/sbin/comcontrol/comcontrol.c +++ b/sbin/comcontrol/comcontrol.c @@ -43,7 +43,7 @@ __FBSDID("$FreeBSD$"); static void usage(void); static void -usage() +usage(void) { fprintf(stderr, "usage: comcontrol [dtrwait ] [drainwait ]\n"); diff --git a/sbin/conscontrol/Makefile b/sbin/conscontrol/Makefile index ddd2434e6cc5..9014d80ad556 100644 --- a/sbin/conscontrol/Makefile +++ b/sbin/conscontrol/Makefile @@ -2,5 +2,6 @@ PROG= conscontrol MAN= conscontrol.8 +WARNS?= 2 .include diff --git a/sbin/ddb/ddb_capture.c b/sbin/ddb/ddb_capture.c index 9f83acbb03a5..370fc0058ba9 100644 --- a/sbin/ddb/ddb_capture.c +++ b/sbin/ddb/ddb_capture.c @@ -95,24 +95,24 @@ kread_symbol(kvm_t *kvm, int index, void *address, size_t size, static void ddb_capture_print_kvm(kvm_t *kvm) { - u_int db_capture_bufsize; + u_int db_capture_bufoff; char *buffer, *db_capture_buf; if (kread_symbol(kvm, X_DB_CAPTURE_BUF, &db_capture_buf, sizeof(db_capture_buf), 0) < 0) errx(-1, "kvm: unable to read db_capture_buf"); - if (kread_symbol(kvm, X_DB_CAPTURE_BUFSIZE, &db_capture_bufsize, - sizeof(db_capture_bufsize), 0) < 0) - errx(-1, "kvm: unable to read db_capture_bufsize"); + if (kread_symbol(kvm, X_DB_CAPTURE_BUFOFF, &db_capture_bufoff, + sizeof(db_capture_bufoff), 0) < 0) + errx(-1, "kvm: unable to read db_capture_bufoff"); - buffer = malloc(db_capture_bufsize + 1); + buffer = malloc(db_capture_bufoff + 1); if (buffer == NULL) - err(-1, "malloc: db_capture_bufsize (%u)", - db_capture_bufsize); - bzero(buffer, db_capture_bufsize + 1); + err(-1, "malloc: db_capture_bufoff (%u)", + db_capture_bufoff); + bzero(buffer, db_capture_bufoff + 1); - if (kread(kvm, db_capture_buf, buffer, db_capture_bufsize, 0) < 0) + if (kread(kvm, db_capture_buf, buffer, db_capture_bufoff, 0) < 0) errx(-1, "kvm: unable to read buffer"); printf("%s\n", buffer); @@ -161,7 +161,7 @@ ddb_capture_status_kvm(kvm_t *kvm) errx(-1, "kvm: unable to read db_capture_bufsize"); if (kread_symbol(kvm, X_DB_CAPTURE_INPROGRESS, &db_capture_inprogress, sizeof(db_capture_inprogress), 0) < 0) - err(-1, "kvm: unable to read db_capture_inpgoress"); + err(-1, "kvm: unable to read db_capture_inprogress"); printf("%u/%u bytes used\n", db_capture_bufoff, db_capture_bufsize); if (db_capture_inprogress) printf("capture is on\n"); @@ -204,6 +204,7 @@ ddb_capture(int argc, char *argv[]) mflag = NULL; nflag = NULL; + kvm = NULL; while ((ch = getopt(argc, argv, "M:N:")) != -1) { switch (ch) { case 'M': diff --git a/sbin/devd/Makefile b/sbin/devd/Makefile index 43990b41af6f..c53f094918bd 100644 --- a/sbin/devd/Makefile +++ b/sbin/devd/Makefile @@ -4,8 +4,7 @@ PROG_CXX=devd SRCS= devd.cc token.l parse.y y.tab.h MAN= devd.8 devd.conf.5 -WARNS= 0 -#WARNS?= 4 +WARNS?= 3 NO_SHARED?=YES diff --git a/sbin/devfs/Makefile b/sbin/devfs/Makefile index 95d2540272e6..29b0f54fbc5f 100644 --- a/sbin/devfs/Makefile +++ b/sbin/devfs/Makefile @@ -3,6 +3,5 @@ PROG= devfs SRCS= devfs.c rule.c MAN= devfs.8 -WARNS?= 5 .include diff --git a/sbin/devfs/devfs.8 b/sbin/devfs/devfs.8 index 62e10d942552..7a744d437e07 100644 --- a/sbin/devfs/devfs.8 +++ b/sbin/devfs/devfs.8 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 27, 2008 +.Dd February 21, 2010 .Dt DEVFS 8 .Os .Sh NAME @@ -196,6 +196,9 @@ Apply all the rules in ruleset number to the node. This does not necessarily result in any changes to the node (e.g., if none of the rules in the included ruleset match). +Include commands in the referenced +.Ar ruleset +are not resolved. .It Cm mode Ar filemode Set the file mode to .Ar filemode , @@ -243,7 +246,9 @@ configuration file. .It Pa /etc/devfs.rules Local .Nm -configuration file. +configuration file. Rulesets in here override those in +.Pa /etc/defaults/devfs.rules +with the same ruleset number, otherwise the two files are effectively merged. .It Pa /etc/devfs.conf Boot-time .Nm diff --git a/sbin/dhclient/Makefile b/sbin/dhclient/Makefile index 7e32326ff00a..434335b5a070 100644 --- a/sbin/dhclient/Makefile +++ b/sbin/dhclient/Makefile @@ -40,4 +40,6 @@ SCRIPTS=dhclient-script MAN= dhclient.8 dhclient.conf.5 dhclient.leases.5 dhcp-options.5 \ dhclient-script.8 +WARNS?= 2 + .include diff --git a/sbin/dhclient/bpf.c b/sbin/dhclient/bpf.c index 8a669e1befb3..9f8e45fbfd21 100644 --- a/sbin/dhclient/bpf.c +++ b/sbin/dhclient/bpf.c @@ -90,11 +90,23 @@ if_register_bpf(struct interface_info *info) void if_register_send(struct interface_info *info) { + int sock, on = 1; + /* * If we're using the bpf API for sending and receiving, we * don't need to register this interface twice. */ info->wfdesc = info->rfdesc; + + /* + * Use raw socket for unicast send. + */ + if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)) == -1) + error("socket(SOCK_RAW): %m"); + if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &on, + sizeof(on)) == -1) + error("setsockopt(IP_HDRINCL): %m"); + info->ufdesc = sock; } /* @@ -244,35 +256,32 @@ send_packet(struct interface_info *interface, struct dhcp_packet *raw, { unsigned char buf[256]; struct iovec iov[2]; + struct msghdr msg; int result, bufp = 0; - int sock; - - if (to->sin_addr.s_addr != INADDR_BROADCAST) { - note("SENDING DIRECT"); - /* We know who the server is, send the packet via - normal socket interface */ - - if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) >= 0) { - result = sendto (sock, (char *)raw, len, 0, - (struct sockaddr *)to, sizeof *to); - close(sock); - if (result > 0) - return result; - } - } /* Assemble the headers... */ - assemble_hw_header(interface, buf, &bufp, hto); + if (to->sin_addr.s_addr == INADDR_BROADCAST) + assemble_hw_header(interface, buf, &bufp, hto); assemble_udp_ip_header(buf, &bufp, from.s_addr, to->sin_addr.s_addr, to->sin_port, (unsigned char *)raw, len); - /* Fire it off */ iov[0].iov_base = (char *)buf; iov[0].iov_len = bufp; iov[1].iov_base = (char *)raw; iov[1].iov_len = len; - result = writev(interface->wfdesc, iov, 2); + /* Fire it off */ + if (to->sin_addr.s_addr == INADDR_BROADCAST) + result = writev(interface->wfdesc, iov, 2); + else { + memset(&msg, 0, sizeof(msg)); + msg.msg_name = (struct sockaddr *)to; + msg.msg_namelen = sizeof(*to); + msg.msg_iov = iov; + msg.msg_iovlen = 2; + result = sendmsg(interface->ufdesc, &msg, 0); + } + if (result < 0) warning("send_packet: %m"); return (result); diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h index 8097f14b1de1..bd4c9c0b5e15 100644 --- a/sbin/dhclient/dhcpd.h +++ b/sbin/dhclient/dhcpd.h @@ -37,6 +37,8 @@ * Enterprises. To learn more about the Internet Software Consortium, * see ``http://www.vix.com/isc''. To learn more about Vixie * Enterprises, see ``http://www.vix.com''. + * + * $FreeBSD$ */ #include @@ -194,6 +196,7 @@ struct interface_info { char name[IFNAMSIZ]; int rfdesc; int wfdesc; + int ufdesc; unsigned char *rbuf; size_t rbuf_max; size_t rbuf_offset; diff --git a/sbin/dhclient/packet.c b/sbin/dhclient/packet.c index 484953ca2d98..2e90cc85a8de 100644 --- a/sbin/dhclient/packet.c +++ b/sbin/dhclient/packet.c @@ -135,6 +135,17 @@ assemble_udp_ip_header(unsigned char *buf, int *bufix, u_int32_t from, ip.ip_dst.s_addr = to; ip.ip_sum = wrapsum(checksum((unsigned char *)&ip, sizeof(ip), 0)); + + /* + * While the BPF -- used for broadcasts -- expects a "true" IP header + * with all the bytes in network byte order, the raw socket interface + * which is used for unicasts expects the ip_len field to be in host + * byte order. In both cases, the checksum has to be correct, so this + * is as good a place as any to turn the bytes around again. + */ + if (to != INADDR_BROADCAST) + ip.ip_len = ntohs(ip.ip_len); + memcpy(&buf[*bufix], &ip, sizeof(ip)); *bufix += sizeof(ip); diff --git a/sbin/dmesg/Makefile b/sbin/dmesg/Makefile index 8472f56c461f..266551be5765 100644 --- a/sbin/dmesg/Makefile +++ b/sbin/dmesg/Makefile @@ -4,8 +4,6 @@ PROG= dmesg MAN= dmesg.8 -WARNS?= 6 - LDADD= -lkvm DPADD= ${LIBKVM} diff --git a/sbin/dump/Makefile b/sbin/dump/Makefile index 608162aa570e..e3d9aef61518 100644 --- a/sbin/dump/Makefile +++ b/sbin/dump/Makefile @@ -19,5 +19,6 @@ CFLAGS+=-DRDUMP SRCS= itime.c main.c optr.c dumprmt.c tape.c traverse.c unctime.c cache.c MAN= dump.8 MLINKS= dump.8 rdump.8 +WARNS?= 2 .include diff --git a/sbin/dump/itime.c b/sbin/dump/itime.c index 1f1a3e587118..4cac87b41a1b 100644 --- a/sbin/dump/itime.c +++ b/sbin/dump/itime.c @@ -106,8 +106,10 @@ readdumptimes(FILE *df) for (;;) { dtwalk = (struct dumptime *)calloc(1, sizeof (struct dumptime)); - if (getrecord(df, &(dtwalk->dt_value)) < 0) + if (getrecord(df, &(dtwalk->dt_value)) < 0) { + free(dtwalk); break; + } nddates++; SLIST_INSERT_HEAD(&dthead, dtwalk, dt_list); } diff --git a/sbin/dump/main.c b/sbin/dump/main.c index 7a99522783fc..e344887de145 100644 --- a/sbin/dump/main.c +++ b/sbin/dump/main.c @@ -767,7 +767,8 @@ obsolete(int *argcp, char **argvp[]) if (flags) { *p = '\0'; *nargv++ = flagsp; - } + } else + free(flagsp); /* Copy remaining arguments. */ while ((*nargv++ = *argv++)); diff --git a/sbin/dumpfs/Makefile b/sbin/dumpfs/Makefile index 99faa77ad725..fe464e03f7be 100644 --- a/sbin/dumpfs/Makefile +++ b/sbin/dumpfs/Makefile @@ -2,6 +2,7 @@ # $FreeBSD$ PROG= dumpfs +WARNS?= 2 DPADD= ${LIBUFS} LDADD= -lufs MAN= dumpfs.8 diff --git a/sbin/dumpfs/dumpfs.c b/sbin/dumpfs/dumpfs.c index 2f577d9bee29..e4b599504012 100644 --- a/sbin/dumpfs/dumpfs.c +++ b/sbin/dumpfs/dumpfs.c @@ -160,7 +160,7 @@ dumpfs(const char *name) fstime = afs.fs_old_time; printf("magic\t%x (UFS1)\ttime\t%s", afs.fs_magic, ctime(&fstime)); - printf("id\t[ %x %x ]\n", afs.fs_id[0], afs.fs_id[1]); + printf("id\t[ %08x %08x ]\n", afs.fs_id[0], afs.fs_id[1]); printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); break; @@ -251,8 +251,11 @@ dumpfs(const char *name) printf("gjournal "); if (fsflags & FS_FLAGS_UPDATED) printf("fs_flags expanded "); + if (fsflags & FS_NFS4ACLS) + printf("nfsv4acls "); fsflags &= ~(FS_UNCLEAN | FS_DOSOFTDEP | FS_NEEDSFSCK | FS_INDEXDIRS | - FS_ACLS | FS_MULTILABEL | FS_GJOURNAL | FS_FLAGS_UPDATED); + FS_ACLS | FS_MULTILABEL | FS_GJOURNAL | FS_FLAGS_UPDATED | + FS_NFS4ACLS); if (fsflags != 0) printf("unknown flags (%#x)", fsflags); putchar('\n'); @@ -413,7 +416,7 @@ marshal(const char *name) break; } /* -p..r unimplemented */ - printf("-s %jd ", (intmax_t)fs->fs_size); + printf("-s %jd ", (intmax_t)fsbtodb(fs, fs->fs_size)); printf("%s ", disk.d_name); printf("\n"); diff --git a/sbin/dumpon/Makefile b/sbin/dumpon/Makefile index c273f93470a2..d11ccc761127 100644 --- a/sbin/dumpon/Makefile +++ b/sbin/dumpon/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG= dumpon -WARNS?= 6 MAN= dumpon.8 .include diff --git a/sbin/ffsinfo/Makefile b/sbin/ffsinfo/Makefile index a1ffef7989a0..88b267dbe49d 100644 --- a/sbin/ffsinfo/Makefile +++ b/sbin/ffsinfo/Makefile @@ -11,7 +11,7 @@ PROG= ffsinfo SRCS= ffsinfo.c debug.c MAN= ffsinfo.8 -WARNS?= 0 +WARNS?= 1 CFLAGS+=-DFS_DEBUG -I${GROWFS} DPADD= ${LIBUFS} LDADD= -lufs diff --git a/sbin/fsck/fsck.c b/sbin/fsck/fsck.c index 13eb9f06e067..24c4e13124ae 100644 --- a/sbin/fsck/fsck.c +++ b/sbin/fsck/fsck.c @@ -543,8 +543,10 @@ getfslab(const char *str) if ((fd = open(str, O_RDONLY)) == -1) err(1, "cannot open `%s'", str); - if (ioctl(fd, DIOCGDINFO, &dl) == -1) + if (ioctl(fd, DIOCGDINFO, &dl) == -1) { + (void) close(fd); return(NULL); + } (void) close(fd); diff --git a/sbin/fsck_ffs/fsutil.c b/sbin/fsck_ffs/fsutil.c index 4ce2ef20dac2..68d113a3f618 100644 --- a/sbin/fsck_ffs/fsutil.c +++ b/sbin/fsck_ffs/fsutil.c @@ -436,7 +436,7 @@ check_cgmagic(int cg, struct cg *cgp) ((sblock.fs_magic == FS_UFS1_MAGIC && cgp->cg_old_niblk == sblock.fs_ipg && cgp->cg_ndblk <= sblock.fs_fpg && - cgp->cg_old_ncyl == sblock.fs_old_cpg) || + cgp->cg_old_ncyl <= sblock.fs_old_cpg) || (sblock.fs_magic == FS_UFS2_MAGIC && cgp->cg_niblk == sblock.fs_ipg && cgp->cg_ndblk <= sblock.fs_fpg && diff --git a/sbin/fsck_ffs/gjournal.c b/sbin/fsck_ffs/gjournal.c index 903763ddea22..bd887cab850d 100644 --- a/sbin/fsck_ffs/gjournal.c +++ b/sbin/fsck_ffs/gjournal.c @@ -86,7 +86,7 @@ struct cgchain { #define MAX_CACHED_CGS 1024 static unsigned ncgs = 0; -static LIST_HEAD(, cgchain) cglist = LIST_HEAD_INITIALIZER(&cglist); +static LIST_HEAD(, cgchain) cglist = LIST_HEAD_INITIALIZER(cglist); static const char *devnam; static struct uufsd *disk = NULL; diff --git a/sbin/fsck_ffs/main.c b/sbin/fsck_ffs/main.c index 0366e456ba11..66edd63e21f1 100644 --- a/sbin/fsck_ffs/main.c +++ b/sbin/fsck_ffs/main.c @@ -406,7 +406,10 @@ checkfilesys(char *filesys) */ if (duplist) { if (preen || usedsoftdep) - pfatal("INTERNAL ERROR: dups with -p"); + pfatal("INTERNAL ERROR: dups with %s%s%s", + preen ? "-p" : "", + (preen && usedsoftdep) ? " and " : "", + usedsoftdep ? "softupdates" : ""); printf("** Phase 1b - Rescan For More DUPS\n"); pass1b(); } diff --git a/sbin/fsck_ffs/pass1.c b/sbin/fsck_ffs/pass1.c index 73b64195c2cc..fa30bb2018ca 100644 --- a/sbin/fsck_ffs/pass1.c +++ b/sbin/fsck_ffs/pass1.c @@ -98,10 +98,16 @@ pass1(void) rebuildcg = 1; if (!rebuildcg && sblock.fs_magic == FS_UFS2_MAGIC) { inosused = cgrp.cg_initediblk; - if (inosused > sblock.fs_ipg) + if (inosused > sblock.fs_ipg) { + pfatal("%s (%d > %d) %s %d\nReset to %d\n", + "Too many initialized inodes", inosused, + sblock.fs_ipg, "in cylinder group", c, + sblock.fs_ipg); inosused = sblock.fs_ipg; - } else + } + } else { inosused = sblock.fs_ipg; + } if (got_siginfo) { printf("%s: phase 1: cyl group %d of %d (%d%%)\n", cdevname, c, sblock.fs_ncg, diff --git a/sbin/fsck_ffs/pass2.c b/sbin/fsck_ffs/pass2.c index 59a7a84c7d94..a4f73b3e391b 100644 --- a/sbin/fsck_ffs/pass2.c +++ b/sbin/fsck_ffs/pass2.c @@ -36,12 +36,14 @@ static const char sccsid[] = "@(#)pass2.c 8.9 (Berkeley) 4/28/95"; __FBSDID("$FreeBSD$"); #include +#include #include #include #include #include +#include #include #include @@ -49,6 +51,8 @@ __FBSDID("$FreeBSD$"); #define MINDIRSIZE (sizeof (struct dirtemplate)) +static int fix_extraneous(struct inoinfo *, struct inodesc *); +static int deleteentry(struct inodesc *); static int blksort(const void *, const void *); static int pass2check(struct inodesc *); @@ -212,9 +216,48 @@ pass2(void) inoinfo(inp->i_parent)->ino_linkcnt--; continue; } - fileerror(inp->i_parent, inp->i_number, - "BAD INODE NUMBER FOR '..'"); - if (reply("FIX") == 0) + /* + * Here we have: + * inp->i_number is directory with bad ".." in it. + * inp->i_dotdot is current value of "..". + * inp->i_parent is directory to which ".." should point. + */ + getpathname(pathbuf, inp->i_parent, inp->i_number); + printf("BAD INODE NUMBER FOR '..' in DIR I=%d (%s)\n", + inp->i_number, pathbuf); + getpathname(pathbuf, inp->i_dotdot, inp->i_dotdot); + printf("CURRENTLY POINTS TO I=%d (%s), ", inp->i_dotdot, + pathbuf); + getpathname(pathbuf, inp->i_parent, inp->i_parent); + printf("SHOULD POINT TO I=%d (%s)", inp->i_parent, pathbuf); + if (cursnapshot != 0) { + /* + * We need to: + * setcwd(inp->i_number); + * setdotdot(inp->i_dotdot, inp->i_parent); + */ + cmd.value = inp->i_number; + if (sysctlbyname("vfs.ffs.setcwd", 0, 0, + &cmd, sizeof cmd) == -1) { + /* kernel lacks support for these functions */ + printf(" (IGNORED)\n"); + continue; + } + cmd.value = inp->i_dotdot; /* verify same value */ + cmd.size = inp->i_parent; /* new parent */ + if (sysctlbyname("vfs.ffs.setdotdot", 0, 0, + &cmd, sizeof cmd) == -1) { + printf(" (FIX FAILED: %s)\n", strerror(errno)); + continue; + } + printf(" (FIXED)\n"); + inoinfo(inp->i_parent)->ino_linkcnt--; + inp->i_dotdot = inp->i_parent; + continue; + } + if (preen) + printf(" (FIXED)\n"); + else if (reply("FIX") == 0) continue; inoinfo(inp->i_dotdot)->ino_linkcnt++; inoinfo(inp->i_parent)->ino_linkcnt--; @@ -236,8 +279,6 @@ pass2check(struct inodesc *idesc) union dinode *dp; const char *errmsg; struct direct proto; - char namebuf[MAXPATHLEN + 1]; - char pathbuf[MAXPATHLEN + 1]; /* * check for "." @@ -416,27 +457,12 @@ again: case DFOUND: inp = getinoinfo(dirp->d_ino); - if (inp->i_parent != 0 && idesc->id_entryno > 2) { - getpathname(pathbuf, idesc->id_number, - idesc->id_number); - getpathname(namebuf, dirp->d_ino, dirp->d_ino); - pwarn("%s%s%s %s %s\n", pathbuf, - (strcmp(pathbuf, "/") == 0 ? "" : "/"), - dirp->d_name, - "IS AN EXTRANEOUS HARD LINK TO DIRECTORY", - namebuf); - if (cursnapshot != 0) - break; - if (preen) { - printf(" (REMOVED)\n"); - n = 1; - break; - } - if ((n = reply("REMOVE")) == 1) + if (idesc->id_entryno > 2) { + if (inp->i_parent == 0) + inp->i_parent = idesc->id_number; + else if ((n = fix_extraneous(inp, idesc)) == 1) break; } - if (idesc->id_entryno > 2) - inp->i_parent = idesc->id_number; /* FALLTHROUGH */ case FSTATE: @@ -462,6 +488,143 @@ again: return (ret|KEEPON|ALTERED); } +static int +fix_extraneous(struct inoinfo *inp, struct inodesc *idesc) +{ + char *cp; + struct inodesc dotdesc; + char oldname[MAXPATHLEN + 1]; + char newname[MAXPATHLEN + 1]; + + /* + * If we have not yet found "..", look it up now so we know + * which inode the directory itself believes is its parent. + */ + if (inp->i_dotdot == 0) { + memset(&dotdesc, 0, sizeof(struct inodesc)); + dotdesc.id_type = DATA; + dotdesc.id_number = idesc->id_dirp->d_ino; + dotdesc.id_func = findino; + dotdesc.id_name = strdup(".."); + if ((ckinode(ginode(dotdesc.id_number), &dotdesc) & FOUND)) + inp->i_dotdot = dotdesc.id_parent; + } + /* + * We have the previously found old name (inp->i_parent) and the + * just found new name (idesc->id_number). We have five cases: + * 1) ".." is missing - can remove either name, choose to delete + * new one and let fsck create ".." pointing to old name. + * 2) Both new and old are in same directory, choose to delete + * the new name and let fsck fix ".." if it is wrong. + * 3) ".." does not point to the new name, so delete it and let + * fsck fix ".." to point to the old one if it is wrong. + * 4) ".." points to the old name only, so delete the new one. + * 5) ".." points to the new name only, so delete the old one. + * + * For cases 1-4 we eliminate the new name; + * for case 5 we eliminate the old name. + */ + if (inp->i_dotdot == 0 || /* Case 1 */ + idesc->id_number == inp->i_parent || /* Case 2 */ + inp->i_dotdot != idesc->id_number || /* Case 3 */ + inp->i_dotdot == inp->i_parent) { /* Case 4 */ + getpathname(newname, idesc->id_number, idesc->id_number); + if (strcmp(newname, "/") != 0) + strcat (newname, "/"); + strcat(newname, idesc->id_dirp->d_name); + getpathname(oldname, inp->i_number, inp->i_number); + pwarn("%s IS AN EXTRANEOUS HARD LINK TO DIRECTORY %s", + newname, oldname); + if (cursnapshot != 0) { + /* + * We need to + * setcwd(idesc->id_number); + * unlink(idesc->id_dirp->d_name); + */ + cmd.value = idesc->id_number; + if (sysctlbyname("vfs.ffs.setcwd", 0, 0, + &cmd, sizeof cmd) == -1) { + printf(" (IGNORED)\n"); + return (0); + } + cmd.value = (intptr_t)idesc->id_dirp->d_name; + cmd.size = inp->i_number; /* verify same name */ + if (sysctlbyname("vfs.ffs.unlink", 0, 0, + &cmd, sizeof cmd) == -1) { + printf(" (UNLINK FAILED: %s)\n", + strerror(errno)); + return (0); + } + printf(" (REMOVED)\n"); + return (0); + } + if (preen) { + printf(" (REMOVED)\n"); + return (1); + } + return (reply("REMOVE")); + } + /* + * None of the first four cases above, so must be case (5). + * Eliminate the old name and make the new the name the parent. + */ + getpathname(oldname, inp->i_parent, inp->i_number); + getpathname(newname, inp->i_number, inp->i_number); + pwarn("%s IS AN EXTRANEOUS HARD LINK TO DIRECTORY %s", oldname, + newname); + if (cursnapshot != 0) { + /* + * We need to + * setcwd(inp->i_parent); + * unlink(last component of oldname pathname); + */ + cmd.value = inp->i_parent; + if (sysctlbyname("vfs.ffs.setcwd", 0, 0, + &cmd, sizeof cmd) == -1) { + printf(" (IGNORED)\n"); + return (0); + } + if ((cp = rindex(oldname, '/')) == NULL) { + printf(" (IGNORED)\n"); + return (0); + } + cmd.value = (intptr_t)(cp + 1); + cmd.size = inp->i_number; /* verify same name */ + if (sysctlbyname("vfs.ffs.unlink", 0, 0, + &cmd, sizeof cmd) == -1) { + printf(" (UNLINK FAILED: %s)\n", + strerror(errno)); + return (0); + } + printf(" (REMOVED)\n"); + inp->i_parent = idesc->id_number; /* reparent to correct dir */ + return (0); + } + if (!preen && !reply("REMOVE")) + return (0); + memset(&dotdesc, 0, sizeof(struct inodesc)); + dotdesc.id_type = DATA; + dotdesc.id_number = inp->i_parent; /* directory in which name appears */ + dotdesc.id_parent = inp->i_number; /* inode number in entry to delete */ + dotdesc.id_func = deleteentry; + if ((ckinode(ginode(dotdesc.id_number), &dotdesc) & FOUND) && preen) + printf(" (REMOVED)\n"); + inp->i_parent = idesc->id_number; /* reparent to correct directory */ + inoinfo(inp->i_number)->ino_linkcnt++; /* name gone, return reference */ + return (0); +} + +static int +deleteentry(struct inodesc *idesc) +{ + struct direct *dirp = idesc->id_dirp; + + if (idesc->id_entryno++ < 2 || dirp->d_ino != idesc->id_parent) + return (KEEPON); + dirp->d_ino = 0; + return (ALTERED|STOP|FOUND); +} + /* * Routine to sort disk blocks. */ diff --git a/sbin/fsck_msdosfs/boot.c b/sbin/fsck_msdosfs/boot.c index ae786e73edd6..b777d086f31d 100644 --- a/sbin/fsck_msdosfs/boot.c +++ b/sbin/fsck_msdosfs/boot.c @@ -10,13 +10,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Martin Husemann - * and Wolfgang Solfrank. - * 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -40,7 +33,6 @@ static const char rcsid[] = #include #include -#include #include #include @@ -48,16 +40,15 @@ static const char rcsid[] = #include "fsutil.h" int -readboot(dosfs, boot) - int dosfs; - struct bootblock *boot; +readboot(int dosfs, struct bootblock *boot) { u_char block[DOSBOOTBLOCKSIZE]; u_char fsinfo[2 * DOSBOOTBLOCKSIZE]; u_char backup[DOSBOOTBLOCKSIZE]; int ret = FSOK; + int i; - if (read(dosfs, block, sizeof block) < sizeof block) { + if ((size_t)read(dosfs, block, sizeof block) != sizeof block) { perror("could not read boot block"); return FSFATAL; } @@ -71,22 +62,22 @@ readboot(dosfs, boot) boot->ValidFat = -1; /* decode bios parameter block */ - boot->BytesPerSec = block[11] + (block[12] << 8); - boot->SecPerClust = block[13]; - boot->ResSectors = block[14] + (block[15] << 8); - boot->FATs = block[16]; - boot->RootDirEnts = block[17] + (block[18] << 8); - boot->Sectors = block[19] + (block[20] << 8); - boot->Media = block[21]; - boot->FATsmall = block[22] + (block[23] << 8); + boot->bpbBytesPerSec = block[11] + (block[12] << 8); + boot->bpbSecPerClust = block[13]; + boot->bpbResSectors = block[14] + (block[15] << 8); + boot->bpbFATs = block[16]; + boot->bpbRootDirEnts = block[17] + (block[18] << 8); + boot->bpbSectors = block[19] + (block[20] << 8); + boot->bpbMedia = block[21]; + boot->bpbFATsmall = block[22] + (block[23] << 8); boot->SecPerTrack = block[24] + (block[25] << 8); - boot->Heads = block[26] + (block[27] << 8); - boot->HiddenSecs = block[28] + (block[29] << 8) + (block[30] << 16) + (block[31] << 24); - boot->HugeSectors = block[32] + (block[33] << 8) + (block[34] << 16) + (block[35] << 24); + boot->bpbHeads = block[26] + (block[27] << 8); + boot->bpbHiddenSecs = block[28] + (block[29] << 8) + (block[30] << 16) + (block[31] << 24); + boot->bpbHugeSectors = block[32] + (block[33] << 8) + (block[34] << 16) + (block[35] << 24); - boot->FATsecs = boot->FATsmall; + boot->FATsecs = boot->bpbFATsmall; - if (!boot->RootDirEnts) + if (!boot->bpbRootDirEnts) boot->flags |= FAT32; if (boot->flags & FAT32) { boot->FATsecs = block[36] + (block[37] << 8) @@ -101,13 +92,13 @@ readboot(dosfs, boot) block[43], block[42]); return FSFATAL; } - boot->RootCl = block[44] + (block[45] << 8) + boot->bpbRootClust = block[44] + (block[45] << 8) + (block[46] << 16) + (block[47] << 24); - boot->FSInfo = block[48] + (block[49] << 8); - boot->Backup = block[50] + (block[51] << 8); + boot->bpbFSInfo = block[48] + (block[49] << 8); + boot->bpbBackup = block[50] + (block[51] << 8); - if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET) - != boot->FSInfo * boot->BytesPerSec + if (lseek(dosfs, boot->bpbFSInfo * boot->bpbBytesPerSec, SEEK_SET) + != boot->bpbFSInfo * boot->bpbBytesPerSec || read(dosfs, fsinfo, sizeof fsinfo) != sizeof fsinfo) { perror("could not read fsinfo block"); @@ -133,18 +124,18 @@ readboot(dosfs, boot) fsinfo[0x3fc] = fsinfo[0x3fd] = 0; fsinfo[0x3fe] = 0x55; fsinfo[0x3ff] = 0xaa; - if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET) - != boot->FSInfo * boot->BytesPerSec + if (lseek(dosfs, boot->bpbFSInfo * boot->bpbBytesPerSec, SEEK_SET) + != boot->bpbFSInfo * boot->bpbBytesPerSec || write(dosfs, fsinfo, sizeof fsinfo) != sizeof fsinfo) { - perror("Unable to write FSInfo"); + perror("Unable to write bpbFSInfo"); return FSFATAL; } ret = FSBOOTMOD; } else - boot->FSInfo = 0; + boot->bpbFSInfo = 0; } - if (boot->FSInfo) { + if (boot->bpbFSInfo) { boot->FSFree = fsinfo[0x1e8] + (fsinfo[0x1e9] << 8) + (fsinfo[0x1ea] << 16) + (fsinfo[0x1eb] << 24); @@ -153,44 +144,54 @@ readboot(dosfs, boot) + (fsinfo[0x1ef] << 24); } - if (lseek(dosfs, boot->Backup * boot->BytesPerSec, SEEK_SET) - != boot->Backup * boot->BytesPerSec + if (lseek(dosfs, boot->bpbBackup * boot->bpbBytesPerSec, SEEK_SET) + != boot->bpbBackup * boot->bpbBytesPerSec || read(dosfs, backup, sizeof backup) != sizeof backup) { perror("could not read backup bootblock"); return FSFATAL; } backup[65] = block[65]; /* XXX */ if (memcmp(block + 11, backup + 11, 79)) { - /* Correct? XXX */ - pfatal("backup doesn't compare to primary bootblock"); - if (alwaysno) - pfatal("\n"); - else - return FSFATAL; + /* + * XXX We require a reference that explains + * that these bytes need to match, or should + * drop the check. gdt@NetBSD has observed + * filesystems that work fine under Windows XP + * and NetBSD that do not match, so the + * requirement is suspect. For now, just + * print out useful information and continue. + */ + pfatal("backup (block %d) mismatch with primary bootblock:\n", + boot->bpbBackup); + for (i = 11; i < 11 + 90; i++) { + if (block[i] != backup[i]) + pfatal("\ti=%d\tprimary 0x%02x\tbackup 0x%02x\n", + i, block[i], backup[i]); + } } - /* Check backup FSInfo? XXX */ + /* Check backup bpbFSInfo? XXX */ } - boot->ClusterOffset = (boot->RootDirEnts * 32 + boot->BytesPerSec - 1) - / boot->BytesPerSec - + boot->ResSectors - + boot->FATs * boot->FATsecs - - CLUST_FIRST * boot->SecPerClust; + boot->ClusterOffset = (boot->bpbRootDirEnts * 32 + boot->bpbBytesPerSec - 1) + / boot->bpbBytesPerSec + + boot->bpbResSectors + + boot->bpbFATs * boot->FATsecs + - CLUST_FIRST * boot->bpbSecPerClust; - if (boot->BytesPerSec % DOSBOOTBLOCKSIZE != 0) { - pfatal("Invalid sector size: %u", boot->BytesPerSec); + if (boot->bpbBytesPerSec % DOSBOOTBLOCKSIZE != 0) { + pfatal("Invalid sector size: %u", boot->bpbBytesPerSec); return FSFATAL; } - if (boot->SecPerClust == 0) { - pfatal("Invalid cluster size: %u", boot->SecPerClust); + if (boot->bpbSecPerClust == 0) { + pfatal("Invalid cluster size: %u", boot->bpbSecPerClust); return FSFATAL; } - if (boot->Sectors) { - boot->HugeSectors = 0; - boot->NumSectors = boot->Sectors; + if (boot->bpbSectors) { + boot->bpbHugeSectors = 0; + boot->NumSectors = boot->bpbSectors; } else - boot->NumSectors = boot->HugeSectors; - boot->NumClusters = (boot->NumSectors - boot->ClusterOffset) / boot->SecPerClust; + boot->NumSectors = boot->bpbHugeSectors; + boot->NumClusters = (boot->NumSectors - boot->ClusterOffset) / boot->bpbSecPerClust; if (boot->flags&FAT32) boot->ClustMask = CLUST32_MASK; @@ -206,13 +207,13 @@ readboot(dosfs, boot) switch (boot->ClustMask) { case CLUST32_MASK: - boot->NumFatEntries = (boot->FATsecs * boot->BytesPerSec) / 4; + boot->NumFatEntries = (boot->FATsecs * boot->bpbBytesPerSec) / 4; break; case CLUST16_MASK: - boot->NumFatEntries = (boot->FATsecs * boot->BytesPerSec) / 2; + boot->NumFatEntries = (boot->FATsecs * boot->bpbBytesPerSec) / 2; break; default: - boot->NumFatEntries = (boot->FATsecs * boot->BytesPerSec * 2) / 3; + boot->NumFatEntries = (boot->FATsecs * boot->bpbBytesPerSec * 2) / 3; break; } @@ -221,7 +222,7 @@ readboot(dosfs, boot) boot->NumClusters, boot->FATsecs); return FSFATAL; } - boot->ClusterSize = boot->BytesPerSec * boot->SecPerClust; + boot->ClusterSize = boot->bpbBytesPerSec * boot->bpbSecPerClust; boot->NumFiles = 1; boot->NumFree = 0; @@ -230,14 +231,12 @@ readboot(dosfs, boot) } int -writefsinfo(dosfs, boot) - int dosfs; - struct bootblock *boot; +writefsinfo(int dosfs, struct bootblock *boot) { u_char fsinfo[2 * DOSBOOTBLOCKSIZE]; - if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET) - != boot->FSInfo * boot->BytesPerSec + if (lseek(dosfs, boot->bpbFSInfo * boot->bpbBytesPerSec, SEEK_SET) + != boot->bpbFSInfo * boot->bpbBytesPerSec || read(dosfs, fsinfo, sizeof fsinfo) != sizeof fsinfo) { perror("could not read fsinfo block"); return FSFATAL; @@ -250,11 +249,11 @@ writefsinfo(dosfs, boot) fsinfo[0x1ed] = (u_char)(boot->FSNext >> 8); fsinfo[0x1ee] = (u_char)(boot->FSNext >> 16); fsinfo[0x1ef] = (u_char)(boot->FSNext >> 24); - if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET) - != boot->FSInfo * boot->BytesPerSec + if (lseek(dosfs, boot->bpbFSInfo * boot->bpbBytesPerSec, SEEK_SET) + != boot->bpbFSInfo * boot->bpbBytesPerSec || write(dosfs, fsinfo, sizeof fsinfo) != sizeof fsinfo) { - perror("Unable to write FSInfo"); + perror("Unable to write bpbFSInfo"); return FSFATAL; } /* diff --git a/sbin/fsck_msdosfs/check.c b/sbin/fsck_msdosfs/check.c index 48ae5ca20eb1..a762f8ab90b2 100644 --- a/sbin/fsck_msdosfs/check.c +++ b/sbin/fsck_msdosfs/check.c @@ -10,13 +10,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Martin Husemann - * and Wolfgang Solfrank. - * 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -40,7 +33,6 @@ static const char rcsid[] = #include #include -#include #include #include #include @@ -54,7 +46,8 @@ checkfilesys(const char *fname) int dosfs; struct bootblock boot; struct fatEntry *fat = NULL; - int i, finish_dosdirsection=0; + int finish_dosdirsection=0; + u_int i; int mod = 0; int ret = 8; @@ -105,7 +98,7 @@ checkfilesys(const char *fname) } if (boot.ValidFat < 0) - for (i = 1; i < (int)boot.FATs; i++) { + for (i = 1; i < (int)boot.bpbFATs; i++) { struct fatEntry *currentFat; mod |= readfat(dosfs, &boot, i, ¤tFat); diff --git a/sbin/fsck_msdosfs/dir.c b/sbin/fsck_msdosfs/dir.c index b87a916c17ff..181fa37be594 100644 --- a/sbin/fsck_msdosfs/dir.c +++ b/sbin/fsck_msdosfs/dir.c @@ -12,13 +12,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Martin Husemann - * and Wolfgang Solfrank. - * 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -44,7 +37,6 @@ static const char rcsid[] = #include #include #include -#include #include #include @@ -227,26 +219,38 @@ resetDosDirSection(struct bootblock *boot, struct fatEntry *fat) cl_t cl; int ret = FSOK; - b1 = boot->RootDirEnts * 32; - b2 = boot->SecPerClust * boot->BytesPerSec; + b1 = boot->bpbRootDirEnts * 32; + b2 = boot->bpbSecPerClust * boot->bpbBytesPerSec; - if (!(buffer = malloc(b1 > b2 ? b1 : b2)) - || !(delbuf = malloc(b2)) - || !(rootDir = newDosDirEntry())) { - perror("No space for directory"); + if ((buffer = malloc( b1 > b2 ? b1 : b2)) == NULL) { + perror("No space for directory buffer"); return FSFATAL; } + + if ((delbuf = malloc(b2)) == NULL) { + free(buffer); + perror("No space for directory delbuf"); + return FSFATAL; + } + + if ((rootDir = newDosDirEntry()) == NULL) { + free(buffer); + free(delbuf); + perror("No space for directory entry"); + return FSFATAL; + } + memset(rootDir, 0, sizeof *rootDir); if (boot->flags & FAT32) { - if (boot->RootCl < CLUST_FIRST || boot->RootCl >= boot->NumClusters) { + if (boot->bpbRootClust < CLUST_FIRST || boot->bpbRootClust >= boot->NumClusters) { pfatal("Root directory starts with cluster out of range(%u)", - boot->RootCl); + boot->bpbRootClust); return FSFATAL; } - cl = fat[boot->RootCl].next; + cl = fat[boot->bpbRootClust].next; if (cl < CLUST_FIRST || (cl >= CLUST_RSRVD && cl< CLUST_EOFS) - || fat[boot->RootCl].head != boot->RootCl) { + || fat[boot->bpbRootClust].head != boot->bpbRootClust) { if (cl == CLUST_FREE) pwarn("Root directory starts with free cluster\n"); else if (cl >= CLUST_RSRVD) @@ -257,14 +261,14 @@ resetDosDirSection(struct bootblock *boot, struct fatEntry *fat) return FSFATAL; } if (ask(1, "Fix")) { - fat[boot->RootCl].next = CLUST_FREE; + fat[boot->bpbRootClust].next = CLUST_FREE; ret = FSFATMOD; } else ret = FSFATAL; } - fat[boot->RootCl].flags |= FAT_USED; - rootDir->head = boot->RootCl; + fat[boot->bpbRootClust].flags |= FAT_USED; + rootDir->head = boot->bpbRootClust; } return ret; @@ -309,7 +313,7 @@ delete(int f, struct bootblock *boot, struct fatEntry *fat, cl_t startcl, { u_char *s, *e; off_t off; - int clsz = boot->SecPerClust * boot->BytesPerSec; + int clsz = boot->bpbSecPerClust * boot->bpbBytesPerSec; s = delbuf + startoff; e = delbuf + clsz; @@ -319,8 +323,8 @@ delete(int f, struct bootblock *boot, struct fatEntry *fat, cl_t startcl, break; e = delbuf + endoff; } - off = startcl * boot->SecPerClust + boot->ClusterOffset; - off *= boot->BytesPerSec; + off = startcl * boot->bpbSecPerClust + boot->ClusterOffset; + off *= boot->bpbBytesPerSec; if (lseek(f, off, SEEK_SET) != off || read(f, delbuf, clsz) != clsz) { perror("Unable to read directory"); @@ -367,7 +371,8 @@ removede(int f, struct bootblock *boot, struct fatEntry *fat, u_char *start, return FSFATAL; start = buffer; } - if (endcl == curcl) + /* startcl is < CLUST_FIRST for !fat32 root */ + if ((endcl == curcl) || (startcl < CLUST_FIRST)) for (; start < end; start += 32) *start = SLOT_DELETED; return FSDIRMOD; @@ -385,7 +390,7 @@ checksize(struct bootblock *boot, struct fatEntry *fat, u_char *p, /* * Check size on ordinary files */ - int32_t physicalSize; + u_int32_t physicalSize; if (dir->head == CLUST_FREE) physicalSize = 0; @@ -456,14 +461,14 @@ readDosDirSection(int f, struct bootblock *boot, struct fatEntry *fat, vallfn = invlfn = empty = NULL; do { if (!(boot->flags & FAT32) && !dir->parent) { - last = boot->RootDirEnts * 32; - off = boot->ResSectors + boot->FATs * boot->FATsecs; + last = boot->bpbRootDirEnts * 32; + off = boot->bpbResSectors + boot->bpbFATs * boot->FATsecs; } else { - last = boot->SecPerClust * boot->BytesPerSec; - off = cl * boot->SecPerClust + boot->ClusterOffset; + last = boot->bpbSecPerClust * boot->bpbBytesPerSec; + off = cl * boot->bpbSecPerClust + boot->ClusterOffset; } - off *= boot->BytesPerSec; + off *= boot->bpbBytesPerSec; if (lseek(f, off, SEEK_SET) != off || read(f, buffer, last) != last) { perror("Unable to read directory"); @@ -644,7 +649,8 @@ readDosDirSection(int f, struct bootblock *boot, struct fatEntry *fat, dirent.head |= (p[20] << 16) | (p[21] << 24); dirent.size = p[28] | (p[29] << 8) | (p[30] << 16) | (p[31] << 24); if (vallfn) { - strcpy(dirent.lname, longName); + strlcpy(dirent.lname, longName, + sizeof(dirent.lname)); longName[0] = '\0'; shortSum = -1; } @@ -832,6 +838,10 @@ readDosDirSection(int f, struct bootblock *boot, struct fatEntry *fat, } boot->NumFiles++; } + + if (!(boot->flags & FAT32) && !dir->parent) + break; + if (mod & THISMOD) { last *= 32; if (lseek(f, off, SEEK_SET) != off @@ -847,6 +857,19 @@ readDosDirSection(int f, struct bootblock *boot, struct fatEntry *fat, invlfn ? invlfn : vallfn, p, invlfn ? invcl : valcl, -1, 0, fullpath(dir), 1); + + /* The root directory of non fat32 filesystems is in a special + * area and may have been modified above without being written out. + */ + if ((mod & FSDIRMOD) && !(boot->flags & FAT32) && !dir->parent) { + last *= 32; + if (lseek(f, off, SEEK_SET) != off + || write(f, buffer, last) != last) { + perror("Unable to write directory"); + return FSFATAL; + } + mod &= ~THISMOD; + } return mod & ~THISMOD; } @@ -934,9 +957,9 @@ reconnect(int dosfs, struct bootblock *boot, struct fatEntry *fat, cl_t head) return FSERROR; } lfoff = lfcl * boot->ClusterSize - + boot->ClusterOffset * boot->BytesPerSec; + + boot->ClusterOffset * boot->bpbBytesPerSec; if (lseek(dosfs, lfoff, SEEK_SET) != lfoff - || read(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) { + || (size_t)read(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) { perror("could not read LOST.DIR"); return FSFATAL; } @@ -966,7 +989,7 @@ reconnect(int dosfs, struct bootblock *boot, struct fatEntry *fat, cl_t head) p[31] = (u_char)(d.size >> 24); fat[head].flags |= FAT_USED; if (lseek(dosfs, lfoff, SEEK_SET) != lfoff - || write(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) { + || (size_t)write(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) { perror("could not write LOST.DIR"); return FSFATAL; } diff --git a/sbin/fsck_msdosfs/dosfs.h b/sbin/fsck_msdosfs/dosfs.h index 3a5d4394c506..bd01b2423119 100644 --- a/sbin/fsck_msdosfs/dosfs.h +++ b/sbin/fsck_msdosfs/dosfs.h @@ -12,13 +12,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Martin Husemann - * and Wolfgang Solfrank. - * 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -46,21 +39,21 @@ typedef u_int32_t cl_t; /* type holding a cluster number */ * FAT boot block. */ struct bootblock { - u_int BytesPerSec; /* bytes per sector */ - u_int SecPerClust; /* sectors per cluster */ - u_int ResSectors; /* number of reserved sectors */ - u_int FATs; /* number of FATs */ - u_int RootDirEnts; /* number of root directory entries */ - u_int Media; /* media descriptor */ - u_int FATsmall; /* number of sectors per FAT */ + u_int bpbBytesPerSec; /* bytes per sector */ + u_int bpbSecPerClust; /* sectors per cluster */ + u_int bpbResSectors; /* number of reserved sectors */ + u_int bpbFATs; /* number of bpbFATs */ + u_int bpbRootDirEnts; /* number of root directory entries */ + u_int32_t bpbSectors; /* total number of sectors */ + u_int bpbMedia; /* media descriptor */ + u_int bpbFATsmall; /* number of sectors per FAT */ u_int SecPerTrack; /* sectors per track */ - u_int Heads; /* number of heads */ - u_int32_t Sectors; /* total number of sectors */ - u_int32_t HiddenSecs; /* # of hidden sectors */ - u_int32_t HugeSectors; /* # of sectors if bpbSectors == 0 */ - u_int FSInfo; /* FSInfo sector */ - u_int Backup; /* Backup of Bootblocks */ - cl_t RootCl; /* Start of Root Directory */ + u_int bpbHeads; /* number of heads */ + u_int32_t bpbHiddenSecs; /* # of hidden sectors */ + u_int32_t bpbHugeSectors; /* # of sectors if bpbbpbSectors == 0 */ + cl_t bpbRootClust; /* Start of Root Directory */ + u_int bpbFSInfo; /* FSInfo sector */ + u_int bpbBackup; /* Backup of Bootblocks */ cl_t FSFree; /* Number of free clusters acc. FSInfo */ cl_t FSNext; /* Next free cluster acc. FSInfo */ diff --git a/sbin/fsck_msdosfs/ext.h b/sbin/fsck_msdosfs/ext.h index 53127cf44ab4..a4fd19b8cd72 100644 --- a/sbin/fsck_msdosfs/ext.h +++ b/sbin/fsck_msdosfs/ext.h @@ -10,13 +10,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Martin Husemann - * and Wolfgang Solfrank. - * 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -77,12 +70,12 @@ int checkfilesys(const char *); #define FSDIRMOD 2 /* Some directory was modified */ #define FSFATMOD 4 /* The FAT was modified */ #define FSERROR 8 /* Some unrecovered error remains */ -#define FSFATAL 16 /* Some unrecoverable error occured */ +#define FSFATAL 16 /* Some unrecoverable error occurred */ #define FSDIRTY 32 /* File system is dirty */ #define FSFIXFAT 64 /* Fix file system FAT */ /* - * read a boot block in a machine independend fashion and translate + * read a boot block in a machine independent fashion and translate * it into our struct bootblock. */ int readboot(int, struct bootblock *); @@ -96,13 +89,13 @@ int writefsinfo(int, struct bootblock *); * Read one of the FAT copies and return a pointer to the new * allocated array holding our description of it. */ -int readfat(int, struct bootblock *, int, struct fatEntry **); +int readfat(int, struct bootblock *, u_int, struct fatEntry **); /* * Check two FAT copies for consistency and merge changes into the - * first if neccessary. + * first if necessary. */ -int comparefat(struct bootblock *, struct fatEntry *, struct fatEntry *, int); +int comparefat(struct bootblock *, struct fatEntry *, struct fatEntry *, u_int); /* * Check a FAT diff --git a/sbin/fsck_msdosfs/fat.c b/sbin/fsck_msdosfs/fat.c index e509717a7062..126c3ef7870e 100644 --- a/sbin/fsck_msdosfs/fat.c +++ b/sbin/fsck_msdosfs/fat.c @@ -10,13 +10,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Martin Husemann - * and Wolfgang Solfrank. - * 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -47,10 +40,10 @@ static const char rcsid[] = #include "ext.h" #include "fsutil.h" -static int checkclnum(struct bootblock *, int, cl_t, cl_t *); -static int clustdiffer(cl_t, cl_t *, cl_t *, int); +static int checkclnum(struct bootblock *, u_int, cl_t, cl_t *); +static int clustdiffer(cl_t, cl_t *, cl_t *, u_int); static int tryclear(struct bootblock *, struct fatEntry *, cl_t, cl_t *); -static int _readfat(int, struct bootblock *, int, u_char **); +static int _readfat(int, struct bootblock *, u_int, u_char **); /*- * The first 2 FAT entries contain pseudo-cluster numbers with the following @@ -80,10 +73,10 @@ checkdirty(int fs, struct bootblock *boot) if (boot->ClustMask != CLUST16_MASK && boot->ClustMask != CLUST32_MASK) return 0; - off = boot->ResSectors; - off *= boot->BytesPerSec; + off = boot->bpbResSectors; + off *= boot->bpbBytesPerSec; - buffer = malloc(boot->BytesPerSec); + buffer = malloc(boot->bpbBytesPerSec); if (buffer == NULL) { perror("No space for FAT"); return 1; @@ -94,7 +87,7 @@ checkdirty(int fs, struct bootblock *boot) goto err; } - if (read(fs, buffer, boot->BytesPerSec) != boot->BytesPerSec) { + if (read(fs, buffer, boot->bpbBytesPerSec) != boot->bpbBytesPerSec) { perror("Unable to read FAT"); goto err; } @@ -103,7 +96,7 @@ checkdirty(int fs, struct bootblock *boot) * If we don't understand the FAT, then the file system must be * assumed to be unclean. */ - if (buffer[0] != boot->Media || buffer[1] != 0xff) + if (buffer[0] != boot->bpbMedia || buffer[1] != 0xff) goto err; if (boot->ClustMask == CLUST16_MASK) { if ((buffer[2] & 0xf8) != 0xf8 || (buffer[3] & 0x3f) != 0x3f) @@ -135,7 +128,7 @@ err: * Check a cluster number for valid value */ static int -checkclnum(struct bootblock *boot, int fat, cl_t cl, cl_t *next) +checkclnum(struct bootblock *boot, u_int fat, cl_t cl, cl_t *next) { if (*next >= (CLUST_RSRVD&boot->ClustMask)) *next |= ~boot->ClustMask; @@ -166,26 +159,26 @@ checkclnum(struct bootblock *boot, int fat, cl_t cl, cl_t *next) * Read a FAT from disk. Returns 1 if successful, 0 otherwise. */ static int -_readfat(int fs, struct bootblock *boot, int no, u_char **buffer) +_readfat(int fs, struct bootblock *boot, u_int no, u_char **buffer) { off_t off; - *buffer = malloc(boot->FATsecs * boot->BytesPerSec); + *buffer = malloc(boot->FATsecs * boot->bpbBytesPerSec); if (*buffer == NULL) { perror("No space for FAT"); return 0; } - off = boot->ResSectors + no * boot->FATsecs; - off *= boot->BytesPerSec; + off = boot->bpbResSectors + no * boot->FATsecs; + off *= boot->bpbBytesPerSec; if (lseek(fs, off, SEEK_SET) != off) { perror("Unable to read FAT"); goto err; } - if (read(fs, *buffer, boot->FATsecs * boot->BytesPerSec) - != boot->FATsecs * boot->BytesPerSec) { + if ((size_t)read(fs, *buffer, boot->FATsecs * boot->bpbBytesPerSec) + != boot->FATsecs * boot->bpbBytesPerSec) { perror("Unable to read FAT"); goto err; } @@ -201,26 +194,28 @@ _readfat(int fs, struct bootblock *boot, int no, u_char **buffer) * Read a FAT and decode it into internal format */ int -readfat(int fs, struct bootblock *boot, int no, struct fatEntry **fp) +readfat(int fs, struct bootblock *boot, u_int no, struct fatEntry **fp) { struct fatEntry *fat; u_char *buffer, *p; cl_t cl; int ret = FSOK; + size_t len; boot->NumFree = boot->NumBad = 0; if (!_readfat(fs, boot, no, &buffer)) return FSFATAL; - fat = calloc(boot->NumClusters, sizeof(struct fatEntry)); + fat = malloc(len = boot->NumClusters * sizeof(struct fatEntry)); if (fat == NULL) { perror("No space for FAT"); free(buffer); return FSFATAL; } + (void)memset(fat, 0, len); - if (buffer[0] != boot->Media + if (buffer[0] != boot->bpbMedia || buffer[1] != 0xff || buffer[2] != 0xff || (boot->ClustMask == CLUST16_MASK && buffer[3] != 0xff) || (boot->ClustMask == CLUST32_MASK @@ -234,7 +229,7 @@ readfat(int fs, struct bootblock *boot, int no, struct fatEntry **fp) * file system is dirty if it doesn't reboot cleanly. * Check this special condition before errorring out. */ - if (buffer[0] == boot->Media && buffer[1] == 0xff + if (buffer[0] == boot->bpbMedia && buffer[1] == 0xff && buffer[2] == 0xff && ((boot->ClustMask == CLUST16_MASK && buffer[3] == 0x7f) || (boot->ClustMask == CLUST32_MASK @@ -311,7 +306,11 @@ readfat(int fs, struct bootblock *boot, int no, struct fatEntry **fp) } free(buffer); - *fp = fat; + if (ret & FSFATAL) { + free(fat); + *fp = NULL; + } else + *fp = fat; return ret; } @@ -331,7 +330,7 @@ rsrvdcltype(cl_t cl) } static int -clustdiffer(cl_t cl, cl_t *cp1, cl_t *cp2, int fatnum) +clustdiffer(cl_t cl, cl_t *cp1, cl_t *cp2, u_int fatnum) { if (*cp1 == CLUST_FREE || *cp1 >= CLUST_RSRVD) { if (*cp2 == CLUST_FREE || *cp2 >= CLUST_RSRVD) { @@ -346,13 +345,13 @@ clustdiffer(cl_t cl, cl_t *cp1, cl_t *cp2, int fatnum) } return FSFATAL; } - pwarn("Cluster %u is marked %s in FAT 0, %s in FAT %d\n", + pwarn("Cluster %u is marked %s in FAT 0, %s in FAT %u\n", cl, rsrvdcltype(*cp1), rsrvdcltype(*cp2), fatnum); if (ask(0, "Use FAT 0's entry")) { *cp2 = *cp1; return FSFATMOD; } - if (ask(0, "Use FAT %d's entry", fatnum)) { + if (ask(0, "Use FAT %u's entry", fatnum)) { *cp1 = *cp2; return FSFATMOD; } @@ -360,7 +359,7 @@ clustdiffer(cl_t cl, cl_t *cp1, cl_t *cp2, int fatnum) } pwarn("Cluster %u is marked %s in FAT 0, but continues with cluster %u in FAT %d\n", cl, rsrvdcltype(*cp1), *cp2, fatnum); - if (ask(0, "Use continuation from FAT %d", fatnum)) { + if (ask(0, "Use continuation from FAT %u", fatnum)) { *cp1 = *cp2; return FSFATMOD; } @@ -371,7 +370,7 @@ clustdiffer(cl_t cl, cl_t *cp1, cl_t *cp2, int fatnum) return FSFATAL; } if (*cp2 == CLUST_FREE || *cp2 >= CLUST_RSRVD) { - pwarn("Cluster %u continues with cluster %u in FAT 0, but is marked %s in FAT %d\n", + pwarn("Cluster %u continues with cluster %u in FAT 0, but is marked %s in FAT %u\n", cl, *cp1, rsrvdcltype(*cp2), fatnum); if (ask(0, "Use continuation from FAT 0")) { *cp2 = *cp1; @@ -383,13 +382,13 @@ clustdiffer(cl_t cl, cl_t *cp1, cl_t *cp2, int fatnum) } return FSERROR; } - pwarn("Cluster %u continues with cluster %u in FAT 0, but with cluster %u in FAT %d\n", + pwarn("Cluster %u continues with cluster %u in FAT 0, but with cluster %u in FAT %u\n", cl, *cp1, *cp2, fatnum); if (ask(0, "Use continuation from FAT 0")) { *cp2 = *cp1; return FSFATMOD; } - if (ask(0, "Use continuation from FAT %d", fatnum)) { + if (ask(0, "Use continuation from FAT %u", fatnum)) { *cp1 = *cp2; return FSFATMOD; } @@ -401,8 +400,8 @@ clustdiffer(cl_t cl, cl_t *cp1, cl_t *cp2, int fatnum) * into the first one. */ int -comparefat(struct bootblock *boot, struct fatEntry *first, - struct fatEntry *second, int fatnum) +comparefat(struct bootblock *boot, struct fatEntry *first, + struct fatEntry *second, u_int fatnum) { cl_t cl; int ret = FSOK; @@ -542,12 +541,12 @@ writefat(int fs, struct bootblock *boot, struct fatEntry *fat, int correct_fat) { u_char *buffer, *p; cl_t cl; - int i; - u_int32_t fatsz; + u_int i; + size_t fatsz; off_t off; int ret = FSOK; - buffer = malloc(fatsz = boot->FATsecs * boot->BytesPerSec); + buffer = malloc(fatsz = boot->FATsecs * boot->bpbBytesPerSec); if (buffer == NULL) { perror("No space for FAT"); return FSFATAL; @@ -556,7 +555,7 @@ writefat(int fs, struct bootblock *boot, struct fatEntry *fat, int correct_fat) boot->NumFree = 0; p = buffer; if (correct_fat) { - *p++ = (u_char)boot->Media; + *p++ = (u_char)boot->bpbMedia; *p++ = 0xff; *p++ = 0xff; switch (boot->ClustMask) { @@ -629,11 +628,11 @@ writefat(int fs, struct bootblock *boot, struct fatEntry *fat, int correct_fat) break; } } - for (i = 0; i < boot->FATs; i++) { - off = boot->ResSectors + i * boot->FATsecs; - off *= boot->BytesPerSec; + for (i = 0; i < boot->bpbFATs; i++) { + off = boot->bpbResSectors + i * boot->FATsecs; + off *= boot->bpbBytesPerSec; if (lseek(fs, off, SEEK_SET) != off - || write(fs, buffer, fatsz) != fatsz) { + || (size_t)write(fs, buffer, fatsz) != fatsz) { perror("Unable to write FAT"); ret = FSFATAL; /* Return immediately? XXX */ } @@ -673,7 +672,7 @@ checklost(int dosfs, struct bootblock *boot, struct fatEntry *fat) } finishlf(); - if (boot->FSInfo) { + if (boot->bpbFSInfo) { ret = 0; if (boot->FSFree != boot->NumFree) { pwarn("Free space in FSInfo block (%d) not correct (%d)\n", @@ -683,17 +682,6 @@ checklost(int dosfs, struct bootblock *boot, struct fatEntry *fat) ret = 1; } } - if (boot->NumFree && fat[boot->FSNext].next != CLUST_FREE) { - pwarn("Next free cluster in FSInfo block (%u) not free\n", - boot->FSNext); - if (ask(1, "Fix")) - for (head = CLUST_FIRST; head < boot->NumClusters; head++) - if (fat[head].next == CLUST_FREE) { - boot->FSNext = head; - ret = 1; - break; - } - } if (ret) mod |= writefsinfo(dosfs, boot); } diff --git a/sbin/fsck_msdosfs/fsck_msdosfs.8 b/sbin/fsck_msdosfs/fsck_msdosfs.8 index 3bc22b120f39..6099e55f57b2 100644 --- a/sbin/fsck_msdosfs/fsck_msdosfs.8 +++ b/sbin/fsck_msdosfs/fsck_msdosfs.8 @@ -11,13 +11,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by Martin Husemann -.\" and Wolfgang Solfrank. -.\" 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES diff --git a/sbin/fsck_msdosfs/main.c b/sbin/fsck_msdosfs/main.c index c09abd521512..9ec15ca2b500 100644 --- a/sbin/fsck_msdosfs/main.c +++ b/sbin/fsck_msdosfs/main.c @@ -10,13 +10,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Martin Husemann - * and Wolfgang Solfrank. - * 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 AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -40,7 +33,6 @@ static const char rcsid[] = #include #include -#include #include #include #include diff --git a/sbin/gbde/Makefile b/sbin/gbde/Makefile index 87058028533e..0faa6ba6d397 100644 --- a/sbin/gbde/Makefile +++ b/sbin/gbde/Makefile @@ -9,9 +9,7 @@ SRCS+= g_bde_lock.c # rijndael-fst.c does evil casting things which results in warnings on # 64 bit machines, the test-vectors check out however, so it works right. -.if ${MACHINE_ARCH} == "i386" -WARNS?= 5 -.else +.if ${MACHINE_ARCH} != "i386" WARNS?= 3 .endif diff --git a/sbin/geom/Makefile b/sbin/geom/Makefile index fffb889bc2cf..88b82404e107 100644 --- a/sbin/geom/Makefile +++ b/sbin/geom/Makefile @@ -11,6 +11,7 @@ PROG= geom SRCS= geom.c geom_label.c geom_part.c subr.c NO_MAN= +WARNS?= 2 CFLAGS+=-I${.CURDIR} -I${.CURDIR}/core -DSTATIC_GEOM_CLASSES DPADD= ${LIBGEOM} ${LIBSBUF} ${LIBBSDXML} ${LIBUTIL} diff --git a/sbin/geom/Makefile.inc b/sbin/geom/Makefile.inc index 94ca09f3889c..bf9f05ed66af 100644 --- a/sbin/geom/Makefile.inc +++ b/sbin/geom/Makefile.inc @@ -1,6 +1,5 @@ # $FreeBSD$ -WARNS?= 6 CLASS_DIR?=/lib/geom .include "../Makefile.inc" diff --git a/sbin/geom/class/Makefile b/sbin/geom/class/Makefile index 7b556a8f2d33..591f79f78373 100644 --- a/sbin/geom/class/Makefile +++ b/sbin/geom/class/Makefile @@ -10,6 +10,7 @@ SUBDIR+=eli SUBDIR+=journal SUBDIR+=label SUBDIR+=mirror +SUBDIR+=mountver SUBDIR+=multipath SUBDIR+=nop SUBDIR+=part diff --git a/sbin/geom/class/cache/Makefile b/sbin/geom/class/cache/Makefile index 6ca37e6c05e8..615c927588ca 100644 --- a/sbin/geom/class/cache/Makefile +++ b/sbin/geom/class/cache/Makefile @@ -3,6 +3,5 @@ .PATH: ${.CURDIR}/../../misc CLASS= cache -NO_MAN= # notyet .include diff --git a/sbin/geom/class/cache/gcache.8 b/sbin/geom/class/cache/gcache.8 new file mode 100644 index 000000000000..d3f782c9a3d5 --- /dev/null +++ b/sbin/geom/class/cache/gcache.8 @@ -0,0 +1,192 @@ +.\"- +.\" Copyright (c) 2010 Edward Tomasz Napierala +.\" 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 THE VOICES IN HIS HEAD 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$ +.\" +.Dd January 3, 2010 +.Dt GCACHE 8 +.Os +.Sh NAME +.Nm gcache +.Nd "control utility for CACHE GEOM class" +.Sh SYNOPSIS +.Nm +.Cm create +.Op Fl v +.Op Fl b Ar blocksize +.Op Fl s Ar size +.Ar name +.Ar prov +.Nm +.Cm configure +.Op Fl v +.Op Fl b Ar blocksize +.Op Fl s Ar size +.Ar name +.Nm +.Cm destroy +.Op Fl fv +.Ar name +.Nm +.Cm label +.Op Fl v +.Op Fl b Ar blocksize +.Op Fl s Ar size +.Ar name +.Ar prov +.Nm +.Cm stop +.Op Fl fv +.Ar name ... +.Nm +.Cm clear +.Op Fl v +.Ar prov ... +.Nm +.Cm dump +.Ar prov ... +.Nm +.Cm list +.Nm +.Cm status +.Op Fl s Ar name +.Nm +.Cm load +.Op Fl v +.Nm +.Cm unload +.Op Fl v +.Sh DESCRIPTION +The +.Nm +utility is used to control GEOM cache, which can +speed up read performance by sending fixed size +read requests to its consumer. It has been developed to address +the problem of a horrible read performance of a 64k blocksize FS +residing on a RAID3 array with 8 data components, where a single +disk component would only get 8k read requests, thus effectively +killing disk performance under high load. +.Pp +Caching can be configured using two different methods: +.Dq manual +or +.Dq automatic . +When using the +.Dq manual +method, no metadata are stored on the devices, so the cached +device has to be configured by hand every time it is needed. +The +.Dq automatic +method uses on-disk metadata to detect devices. +Once devices are labeled, they will be automatically detected and +configured. +.Pp +The first argument to +.Nm +indicates an action to be performed: +.Bl -tag -width ".Cm destroy" +.It Cm create +Cache the given devices with specified +.Ar name . +This is the +.Dq manual +method. +The kernel module +.Pa geom_cache.ko +will be loaded if it is not loaded already. +.It Cm label +Cache the given devices with the specified +.Ar name . +This is the +.Dq automatic +method, where metadata are stored in every device's last sector. +The kernel module +.Pa geom_cache.ko +will be loaded if it is not loaded already. +.It Cm stop +Turn off existing cache device by its +.Ar name . +This command does not touch on-disk metadata! +.It Cm destroy +Same as +.Cm stop . +.It Cm clear +Clear metadata on the given devices. +.It Cm dump +Dump metadata stored on the given devices. +.It Cm list +See +.Xr geom 8 . +.It Cm status +See +.Xr geom 8 . +.It Cm load +See +.Xr geom 8 . +.It Cm unload +See +.Xr geom 8 . +.El +.Pp +Additional options: +.Bl -tag -width indent +.It Fl f +Force the removal of the specified cache device. +.It Fl v +Be more verbose. +.El +.Sh SYSCTL VARIABLES +The following +.Xr sysctl 8 +variables can be used to control the behavior of the +.Nm CACHE +GEOM class. +The default value is shown next to each variable. +.Bl -tag -width indent +.It Va kern.geom.cache.used_hi : No 20 +.It Va kern.geom.cache.used_lo : No 5 +.It Va kern.geom.cache.idletime : No 5 +.It Va kern.geom.cache.timeout : No 10 +.It Va kern.geom.cache.enable : No 1 +.It Va kern.geom.cache.debug : No 0 +Debug level of the +.Nm CACHE +GEOM class. +This can be set to a number between 0 and 3 inclusive. +If set to 0 minimal debug information is printed, and if set to 3 the +maximum amount of debug information is printed. +.El +.Sh EXIT STATUS +Exit status is 0 on success, and 1 if the command fails. +.Sh SEE ALSO +.Xr geom 4 , +.Xr geom 8 +.Sh HISTORY +The +.Nm +utility appeared in +.Fx 7.0 . +.Sh AUTHORS +.An Ruslan Ermilov Aq ru@FreeBSD.org diff --git a/sbin/geom/class/mirror/geom_mirror.c b/sbin/geom/class/mirror/geom_mirror.c index 6ac4fb9a775a..cf15c60af9d3 100644 --- a/sbin/geom/class/mirror/geom_mirror.c +++ b/sbin/geom/class/mirror/geom_mirror.c @@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$"); uint32_t lib_version = G_LIB_VERSION; uint32_t version = G_MIRROR_VERSION; -static char label_balance[] = "split", configure_balance[] = "none"; +static char label_balance[] = "load", configure_balance[] = "none"; static intmax_t label_slice = 4096, configure_slice = -1; static intmax_t insert_priority = 0, configure_priority = -1; diff --git a/sbin/geom/class/mirror/gmirror.8 b/sbin/geom/class/mirror/gmirror.8 index ea0cb9a865a3..baaa827daf20 100644 --- a/sbin/geom/class/mirror/gmirror.8 +++ b/sbin/geom/class/mirror/gmirror.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 1, 2009 +.Dd December 8, 2009 .Dt GMIRROR 8 .Os .Sh NAME @@ -135,6 +135,7 @@ Specifies balance algorithm to use, one of: .Bl -tag -width ".Cm round-robin" .It Cm load Read from the component with the lowest load. +This is the default balance algorithm. .It Cm prefer Read from the component with the biggest priority. .It Cm round-robin @@ -142,7 +143,6 @@ Use round-robin algorithm when choosing component to read. .It Cm split Split read requests, which are bigger than or equal to slice size on N pieces, where N is the number of active components. -This is the default balance algorithm. .El .It Fl F Do not synchronize after a power failure or system crash. diff --git a/sbin/geom/class/mountver/Makefile b/sbin/geom/class/mountver/Makefile new file mode 100644 index 000000000000..d7105d0d611d --- /dev/null +++ b/sbin/geom/class/mountver/Makefile @@ -0,0 +1,7 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../misc + +CLASS= mountver + +.include diff --git a/sbin/geom/class/mountver/geom_mountver.c b/sbin/geom/class/mountver/geom_mountver.c new file mode 100644 index 000000000000..fa276ca3e880 --- /dev/null +++ b/sbin/geom/class/mountver/geom_mountver.c @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2010 Edward Tomasz Napierala + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include "core/geom.h" + + +uint32_t lib_version = G_LIB_VERSION; +uint32_t version = G_MOUNTVER_VERSION; + +struct g_command class_commands[] = { + { "create", G_FLAG_VERBOSE | G_FLAG_LOADKLD, NULL, + { + G_OPT_SENTINEL + }, + NULL, "[-v] dev ..." + }, + { "destroy", G_FLAG_VERBOSE, NULL, + { + { 'f', "force", NULL, G_TYPE_BOOL }, + G_OPT_SENTINEL + }, + NULL, "[-fv] prov ..." + }, + G_CMD_SENTINEL +}; diff --git a/sbin/geom/class/mountver/gmountver.8 b/sbin/geom/class/mountver/gmountver.8 new file mode 100644 index 000000000000..c7a8f044aec9 --- /dev/null +++ b/sbin/geom/class/mountver/gmountver.8 @@ -0,0 +1,130 @@ +.\"- +.\" Copyright (c) 2010 Edward Tomasz Napierala +.\" 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 THE VOICES IN HIS HEAD 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$ +.\" +.Dd January 14, 2010 +.Dt GMOUNTVER 8 +.Os +.Sh NAME +.Nm gmountver +.Nd "control utility for disk mount verification GEOM class" +.Sh SYNOPSIS +.Nm +.Cm create +.Op Fl v +.Ar dev ... +.Nm +.Cm destroy +.Op Fl fv +.Ar prov ... +.Nm +.Cm list +.Nm +.Cm status +.Op Fl s Ar name +.Nm +.Cm load +.Op Fl v +.Nm +.Cm unload +.Op Fl v +.Sh DESCRIPTION +The +.Nm +utility is used to control the mount verification GEOM class. +When configured, it passes all the I/O requests to the underlying provider. +When the underlying provider disappears - for example because the disk device +got disconnected - it queues all the I/O requests and waits for the provider +to reappear. +When that happens, it attaches to it and sends the queued requests. +.Pp +The first argument to +.Nm +indicates an action to be performed: +.Bl -tag -width ".Cm destroy" +.It Cm create +Cache the given devices with specified +.Ar name . +The kernel module +.Pa geom_mountver.ko +will be loaded if it is not loaded already. +.It Cm destroy +Destroy +.Ar name . +.It Cm list +See +.Xr geom 8 . +.It Cm status +See +.Xr geom 8 . +.It Cm load +See +.Xr geom 8 . +.It Cm unload +See +.Xr geom 8 . +.El +.Pp +Additional options: +.Bl -tag -width indent +.It Fl f +Force the removal of the specified mountver device. +.It Fl v +Be more verbose. +.El +.Sh SYSCTL VARIABLES +The following +.Xr sysctl 8 +variables can be used to control the behavior of the +.Nm MOUNTVER +GEOM class. +The default value is shown next to each variable. +.Bl -tag -width indent +.It Va kern.geom.mountver.debug : No 0 +Debug level of the +.Nm MOUNTVER +GEOM class. +This can be set to a number between 0 and 3 inclusive. +If set to 0 minimal debug information is printed, and if set to 3 the +maximum amount of debug information is printed. +.It Va kern.geom.mountver.check.check_ident : No 1 +This can be set to 0 or 1. +If set to 0, +.Nm +will reattach to the device even if the device reports a different disk ID. +.El +.Sh EXIT STATUS +Exit status is 0 on success, and 1 if the command fails. +.Sh SEE ALSO +.Xr geom 4 , +.Xr geom 8 +.Sh HISTORY +The +.Nm +utility appeared in +.Fx 9.0 . +.Sh AUTHORS +.An Edward Tomasz Napierala Aq trasz@FreeBSD.org diff --git a/sbin/geom/class/multipath/geom_multipath.c b/sbin/geom/class/multipath/geom_multipath.c index 1bb3f32239a2..4319d0421c2a 100644 --- a/sbin/geom/class/multipath/geom_multipath.c +++ b/sbin/geom/class/multipath/geom_multipath.c @@ -54,6 +54,10 @@ struct g_command class_commands[] = { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, mp_main, G_NULL_OPTS, NULL, "[-v] name prov ..." }, + { + "destroy", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + NULL, "[-v] prov ..." + }, { "clear", G_FLAG_VERBOSE, mp_main, G_NULL_OPTS, NULL, "[-v] prov ..." diff --git a/sbin/geom/class/part/Makefile b/sbin/geom/class/part/Makefile index 36227162a1f4..7fe221a6f3d4 100644 --- a/sbin/geom/class/part/Makefile +++ b/sbin/geom/class/part/Makefile @@ -4,8 +4,7 @@ CLASS= part +DPADD= ${LIBUTIL} LDADD= -lutil -WARNS?= 4 - .include diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c index db3c5e9515ee..e2a045e3cfae 100644 --- a/sbin/geom/class/part/geom_part.c +++ b/sbin/geom/class/part/geom_part.c @@ -192,6 +192,7 @@ find_provider(struct ggeom *gp, unsigned long long minsector) unsigned long long sector, bestsector; bestpp = NULL; + bestsector = 0; LIST_FOREACH(pp, &gp->lg_provider, lg_provider) { s = find_provcfg(pp, "start"); if (s == NULL) { diff --git a/sbin/geom/class/part/gpart.8 b/sbin/geom/class/part/gpart.8 index 6deea8cd2ab3..3de658c775b7 100644 --- a/sbin/geom/class/part/gpart.8 +++ b/sbin/geom/class/part/gpart.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd Nov 18, 2008 +.Dd November 18, 2008 .Dt GPART 8 .Os .Sh NAME @@ -43,20 +43,34 @@ lines in your kernel configuration file: .Cd "options GEOM_PART_VTOC8" .Ed .Pp -The GEOM_PART_APM option adds support for the Apple Partition Map (APM) +The +.Dv GEOM_PART_APM +option adds support for the Apple Partition Map (APM) found on Apple Macintosh computers. -The GEOM_PART_BSD option adds support for the traditional BSD disklabel. -The GEOM_PART_GPT option adds support for the GUID Partition Table (GPT) +The +.Dv GEOM_PART_BSD +option adds support for the traditional +.Bx +disklabel. +The +.Dv GEOM_PART_GPT +option adds support for the GUID Partition Table (GPT) found on Intel Itanium computers and Intel-based Macintosh computers. -The GEOM_PART_MBR option adds support for the Master Boot Record (MBR) +The +.Dv GEOM_PART_MBR +option adds support for the Master Boot Record (MBR) found on PCs and used on many removable media. -The GEOM_PART_PC98 option adds support for the MBR variant as used on +The +.Dv GEOM_PART_PC98 +option adds support for the MBR variant as used on NEC PC-98 computers. -The GEOM_PART_VTOC8 option adds support for Sun's SMI VTOC8 label as +The +.Dv GEOM_PART_VTOC8 +option adds support for Sun's SMI VTOC8 label as found on UltraSPARC-based computers. .Pp Usage of the -.Xr gpart 8 +.Ns Nm utility: .Pp .\" ==== ADD ==== @@ -123,7 +137,7 @@ utility: .Ar geom .\" ==== UNSET ==== .Nm -.Cm unset +.Cm unset .Fl a Ar attrib .Fl i Ar index .Op Fl f Ar flags @@ -134,7 +148,7 @@ The .Nm utility is used to partition GEOM providers, normally disks. The first argument of which is the action to be taken: -.Bl -tag -width ".Cm wwwwwww" +.Bl -tag -width ".Cm bootcode" .\" ==== ADD ==== .It Cm add Add a new partition to the partitioning scheme given by @@ -148,13 +162,15 @@ option. The type of the partition is given by the .Fl t Ar type option. -Partition types are discussed in the section entitled "Partition Types". +Partition types are discussed below in the section entitled +.Sx "PARTITION TYPES" . .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl i Ar index The index in the partition table at which the new partition is to be -placed. The index determines the name of the device special file used +placed. +The index determines the name of the device special file used to represent the partition. .It Fl l Ar label The label attached to the partition. @@ -162,7 +178,9 @@ This option is only valid when used on partitioning schemes that support partition labels. .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .\" ==== BOOTCODE ==== @@ -185,7 +203,7 @@ The option specifies a file that contains the bootstrap code. The contents and size of the file are determined by the partitioning scheme. -For the MBR scheme, it's a 512 byte file of which the first 446 bytes +For the MBR scheme, it is a 512 byte file of which the first 446 bytes are installed as bootstrap code. The .Fl p Ar partcode @@ -196,11 +214,13 @@ The partition is specified by the option. The size of the file must be smaller than the size of the partition. .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .\" ==== COMMIT ==== @@ -229,8 +249,8 @@ option determines the scheme to use. The kernel needs to have support for a particular scheme before that scheme can be used to partition a disk. .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl n Ar entries The number of entries in the partition table. Every partitioning scheme has a minimum and a maximum number of entries @@ -242,7 +262,9 @@ By default, partition tables are created with the minimum number of entries. .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .\" ==== DELETE ==== @@ -254,11 +276,13 @@ and further identified by the option. The partition cannot be actively used by the kernel. .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .\" ==== DESTROY ==== @@ -266,11 +290,13 @@ about its use. Destroy the partitioning scheme as implemented by geom .Ar geom . .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .\" ==== MODIFY ==== @@ -290,22 +316,26 @@ option. Not all partitioning schemes support labels and it is invalid to try to change a partition label in such cases. .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .\" ==== SET ==== .It Cm set Set the named attribute on the partition entry. .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .\" ==== SHOW ==== @@ -314,7 +344,8 @@ Show the current partition information of the specified geoms or all geoms if none are specified. .\" ==== UNDO ==== .It Cm undo -Revert any pending changes. +Revert any pending changes for geom +.Ar geom . This action is the opposite of the .Cm commit action and can be used to undo any changes that have not been committed. @@ -322,11 +353,13 @@ action and can be used to undo any changes that have not been committed. .It Cm unset Clear the named attribute on the partition entry. .Pp -Addition options include: -.Bl -tag -width ".Fl w Ar wwwwwww" +Additional options include: +.Bl -tag -width 10n .It Fl f Ar flags Additional operational flags. -See the section entitled "Operational flags" below for a discussion +See the section entitled +.Sx "OPERATIONAL FLAGS" +below for a discussion about its use. .El .El @@ -338,47 +371,82 @@ utility uses symbolic names for common partition types to avoid that the user needs to know what the partitioning scheme in question is and what the actual number or identification needs to be used for a particular type. -the +The .Nm utility also allows the user to specify scheme-specific partition types -for partition types that don't have symbol names. +for partition types that do not have symbol names. The symbolic names currently understood are: -.Bl -tag -width "wwwwwwwwwwwww" -.It efi +.Bl -tag -width ".Cm freebsd-vinum" +.It Cm efi The system partition for computers that use the Extensible Firmware Interface (EFI). In such cases, the GPT partitioning scheme is being used and the actual partition type for the system partition can also be specified as -"!c12a7328-f81f-11d2-ba4b-00a0c93ec93ab". -.It freebsd -A FreeBSD partition that uses the BSD disklabel to sub-divide the +.Qq Li "!c12a7328-f81f-11d2-ba4b-00a0c93ec93ab" . +.It Cm freebsd +A +.Fx +partition that uses the +.Bx +disklabel to sub-divide the partition into file systems. This is a legacy partition type and should not be used for the APM or GPT schemes. -The scheme-specific types are "!165" for MBR, "!FreeBSD" for APM, and -"!516e7cb4-6ecf-11d6-8ff8-00022d09712b" for GPT. -.It freebsd-boot -A FreeBSD partition dedicated to bootstrap code. -The scheme-specific type is "!83bd6b9d-7f41-11dc-be0b-001560b84f0f" for GPT. -.It freebsd-swap -A FreeBSD partition dedicated to swap space. -The scheme-specific types are "!FreeBSD-swap" for APM, and -"!516e7cb5-6ecf-11d6-8ff8-00022d09712b" for GPT. -.It freebsd-ufs -A FreeBSD partition that contains a UFS or UFS2 file system. -the scheme-specific types are "!FreeBSD-UFS" for APM, and -"!516e7cb6-6ecf-11d6-8ff8-00022d09712b" for GPT. -.It freebsd-vinum -A FreeBSD partition that contains a Vinum volume. -The scheme-specific types are "!FreeBSD-Vinum" for APM, and -"!516e7cb8-6ecf-11d6-8ff8-00022d09712b" for GPT. -.It freebsd-zfs -A FreeBSD partition that contains a ZFS volume. -The scheme-specific types are "!FreeBSD-ZFS" for APM, and -"!516e7cba-6ecf-11d6-8ff8-00022d09712b" for GPT. -.It mbr +The scheme-specific types are +.Qq Li "!165" +for MBR, +.Qq Li "!FreeBSD" +for APM, and +.Qq Li "!516e7cb4-6ecf-11d6-8ff8-00022d09712b" +for GPT. +.It Cm freebsd-boot +A +.Fx +partition dedicated to bootstrap code. +The scheme-specific type is +.Qq Li "!83bd6b9d-7f41-11dc-be0b-001560b84f0f" +for GPT. +.It Cm freebsd-swap +A +.Fx +partition dedicated to swap space. +The scheme-specific types are +.Qq Li "!FreeBSD-swap" +for APM, and +.Qq Li "!516e7cb5-6ecf-11d6-8ff8-00022d09712b" +for GPT. +.It Cm freebsd-ufs +A +.Fx +partition that contains a UFS or UFS2 file system. +The scheme-specific types are +.Qq Li "!FreeBSD-UFS" +for APM, and +.Qq Li "!516e7cb6-6ecf-11d6-8ff8-00022d09712b" +for GPT. +.It Cm freebsd-vinum +A +.Fx +partition that contains a Vinum volume. +The scheme-specific types are +.Qq Li "!FreeBSD-Vinum" +for APM, and +.Qq Li "!516e7cb8-6ecf-11d6-8ff8-00022d09712b" +for GPT. +.It Cm freebsd-zfs +A +.Fx +partition that contains a ZFS volume. +The scheme-specific types are +.Qq Li "!FreeBSD-ZFS" +for APM, and +.Qq Li "!516e7cba-6ecf-11d6-8ff8-00022d09712b" +for GPT. +.It Cm mbr A partition that is sub-partitioned by a master boot record (MBR). -This type is known as "!024dee41-33e7-11d3-9d69-0008c781f39f" by GPT. +This type is known as +.Qq Li "!024dee41-33e7-11d3-9d69-0008c781f39f" +by GPT. .El .Sh OPERATIONAL FLAGS Actions other than the @@ -391,10 +459,12 @@ option. This option is used to specify action-specific operational flags. By default, the .Nm -utility defines the 'C' flag so that the action is immediately +utility defines the +.Ql C +flag so that the action is immediately committed. The user can specify -.Fl f Ar x +.Dq Fl f Cm x to have the action result in a pending change that can later, with other pending changes, be committed as a single compound change with the @@ -417,31 +487,33 @@ Embed GPT bootstrap code into protective MBR. .Ed .Pp Create a dedicated -.Pa freebsd-boot -partition that can boot FreeBSD from a -.Pa freebsd-ufs +.Cm freebsd-boot +partition that can boot +.Fx +from a +.Cm freebsd-ufs partition, and install bootstrap code into it. This partition must be larger than .Pa /boot/gptboot , or the GPT boot you are planning to write. A size of 15 blocks (7680 bytes) would be sufficient for -booting from UFS but lets use 128 blocks (64 KB) here in +booting from UFS but let's use 128 blocks (64 KB) here in this example, in order to reserve some space for potential -future need (e.g. from a ZFS partition). +future need (e.g.\& from a ZFS partition). .Bd -literal -offset indent /sbin/gpart add -b 34 -s 128 -t freebsd-boot ad0 /sbin/gpart bootcode -p /boot/gptboot -i 1 ad0 .Ed .Pp Create a 512MB-sized -.Pa freebsd-ufs +.Cm freebsd-ufs partition that would contain UFS where the system boot from. .Bd -literal -offset indent /sbin/gpart add -b 162 -s 1048576 -t freebsd-ufs ad0 .Ed .Sh SEE ALSO .Xr geom 4 , -.Xr geom 8 , +.Xr geom 8 .Sh HISTORY The .Nm diff --git a/sbin/geom/class/raid3/geom_raid3.c b/sbin/geom/class/raid3/geom_raid3.c index 4a2dbe201ef2..89ce1689ba83 100644 --- a/sbin/geom/class/raid3/geom_raid3.c +++ b/sbin/geom/class/raid3/geom_raid3.c @@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$"); uint32_t lib_version = G_LIB_VERSION; uint32_t version = G_RAID3_VERSION; +static intmax_t default_blocksize = 0; + static void raid3_main(struct gctl_req *req, unsigned f); static void raid3_clear(struct gctl_req *req); static void raid3_dump(struct gctl_req *req); @@ -87,10 +89,11 @@ struct g_command class_commands[] = { { 'F', "nofailsync", NULL, G_TYPE_BOOL }, { 'n', "noautosync", NULL, G_TYPE_BOOL }, { 'r', "round_robin", NULL, G_TYPE_BOOL }, + { 's', "blocksize", &default_blocksize, G_TYPE_NUMBER }, { 'w', "verify", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - NULL, "[-hFnrvw] name prov prov prov ..." + NULL, "[-hFnrvw] [-s blocksize] name prov prov prov ..." }, { "rebuild", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov" @@ -190,7 +193,7 @@ raid3_label(struct gctl_req *req) * sectorsizes of every disk and find the smallest mediasize. */ mediasize = 0; - sectorsize = 0; + sectorsize = gctl_get_intmax(req, "blocksize"); for (i = 1; i < nargs; i++) { str = gctl_get_ascii(req, "arg%d", i); msize = g_get_mediasize(str); diff --git a/sbin/geom/class/raid3/graid3.8 b/sbin/geom/class/raid3/graid3.8 index 21c6f181e773..f9ea0cace592 100644 --- a/sbin/geom/class/raid3/graid3.8 +++ b/sbin/geom/class/raid3/graid3.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 1, 2006 +.Dd January 5, 2010 .Dt GRAID3 8 .Os .Sh NAME @@ -34,6 +34,7 @@ .Nm .Cm label .Op Fl Fhnrvw +.Op Fl s Ar blocksize .Ar name .Ar prov prov prov ... .Nm @@ -113,6 +114,12 @@ but sequential reads are slower. One cannot use this option if the .Fl w option is also specified. +.It Fl s +Manually specify array block size. Block size will be set equal to least +common multiple of all component's sector sizes and specified value. +Note that array sector size calculated as multiple of block size and number +of regular data components. Big values may decrease performance and compatibility, +as all I/O requests have to be multiple of sector size. .It Fl w Use verify reading feature. When reading from a device in a complete state, also read data from the parity component diff --git a/sbin/geom/class/stripe/geom_stripe.c b/sbin/geom/class/stripe/geom_stripe.c index 13243c7505a5..16808cc7afdd 100644 --- a/sbin/geom/class/stripe/geom_stripe.c +++ b/sbin/geom/class/stripe/geom_stripe.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); uint32_t lib_version = G_LIB_VERSION; uint32_t version = G_STRIPE_VERSION; -static intmax_t default_stripesize = 4096; +static intmax_t default_stripesize = 65536; static void stripe_main(struct gctl_req *req, unsigned flags); static void stripe_clear(struct gctl_req *req); diff --git a/sbin/geom/core/geom.8 b/sbin/geom/core/geom.8 index 8477205244b6..79504684a22c 100644 --- a/sbin/geom/core/geom.8 +++ b/sbin/geom/core/geom.8 @@ -166,12 +166,13 @@ geom md unload .Sh SEE ALSO .Xr libgeom 3 , .Xr geom 4 , -.\" .Xr gcache 8 , +.Xr gcache 8 , .Xr gconcat 8 , .Xr geli 8 , .Xr gjournal 8 , .Xr glabel 8 , .Xr gmirror 8 , +.Xr gmountver 8 , .Xr gmultipath 8 , .Xr gnop 8 , .Xr gpart 8 , diff --git a/sbin/geom/core/geom.c b/sbin/geom/core/geom.c index 7f2a281be992..66f2a8f3874a 100644 --- a/sbin/geom/core/geom.c +++ b/sbin/geom/core/geom.c @@ -772,6 +772,10 @@ list_one_provider(struct gprovider *pp, const char *prefix) printf("%sMediasize: %jd (%s)\n", prefix, (intmax_t)pp->lg_mediasize, buf); printf("%sSectorsize: %u\n", prefix, pp->lg_sectorsize); + if (pp->lg_stripesize > 0 || pp->lg_stripeoffset > 0) { + printf("%sStripesize: %ju\n", prefix, pp->lg_stripesize); + printf("%sStripeoffset: %ju\n", prefix, pp->lg_stripeoffset); + } printf("%sMode: %s\n", prefix, pp->lg_mode); LIST_FOREACH(conf, &pp->lg_config, lg_config) { printf("%s%s: %s\n", prefix, conf->lg_name, conf->lg_val); @@ -796,6 +800,10 @@ list_one_consumer(struct gconsumer *cp, const char *prefix) printf("%sMediasize: %jd (%s)\n", prefix, (intmax_t)pp->lg_mediasize, buf); printf("%sSectorsize: %u\n", prefix, pp->lg_sectorsize); + if (pp->lg_stripesize > 0 || pp->lg_stripeoffset > 0) { + printf("%sStripesize: %ju\n", prefix, pp->lg_stripesize); + printf("%sStripeoffset: %ju\n", prefix, pp->lg_stripeoffset); + } printf("%sMode: %s\n", prefix, cp->lg_mode); } LIST_FOREACH(conf, &cp->lg_config, lg_config) { diff --git a/sbin/ggate/Makefile.inc b/sbin/ggate/Makefile.inc index e55271f7ddc5..265f86d1ed55 100644 --- a/sbin/ggate/Makefile.inc +++ b/sbin/ggate/Makefile.inc @@ -1,5 +1,3 @@ # $FreeBSD$ -WARNS?= 6 - .include "../Makefile.inc" diff --git a/sbin/ggate/ggatec/ggatec.c b/sbin/ggate/ggatec/ggatec.c index e421614dc6a3..660bd8ab469b 100644 --- a/sbin/ggate/ggatec/ggatec.c +++ b/sbin/ggate/ggatec/ggatec.c @@ -59,7 +59,7 @@ enum { UNSET, CREATE, DESTROY, LIST, RESCUE } action = UNSET; static const char *path = NULL; static const char *host = NULL; -static int unit = -1; +static int unit = G_GATE_UNIT_AUTO; static unsigned flags = 0; static int force = 0; static unsigned queue_size = G_GATE_QUEUE_SIZE; diff --git a/sbin/ggate/ggated/ggated.c b/sbin/ggate/ggated/ggated.c index 52d2428a0528..2997a9cf2c69 100644 --- a/sbin/ggate/ggated/ggated.c +++ b/sbin/ggate/ggated/ggated.c @@ -10,7 +10,7 @@ * 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 AUTHORS 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 @@ -99,8 +99,8 @@ static TAILQ_HEAD(, ggd_request) outqueue = TAILQ_HEAD_INITIALIZER(outqueue); pthread_mutex_t inqueue_mtx, outqueue_mtx; pthread_cond_t inqueue_cond, outqueue_cond; -static SLIST_HEAD(, ggd_export) exports = SLIST_HEAD_INITIALIZER(&exports); -static LIST_HEAD(, ggd_connection) connections = LIST_HEAD_INITIALIZER(&connection); +static SLIST_HEAD(, ggd_export) exports = SLIST_HEAD_INITIALIZER(exports); +static LIST_HEAD(, ggd_connection) connections = LIST_HEAD_INITIALIZER(connections); static void *recv_thread(void *arg); static void *disk_thread(void *arg); diff --git a/sbin/ggate/ggatel/ggatel.c b/sbin/ggate/ggatel/ggatel.c index 03979c3f9f72..6a3f26e3b899 100644 --- a/sbin/ggate/ggatel/ggatel.c +++ b/sbin/ggate/ggatel/ggatel.c @@ -50,7 +50,7 @@ enum { UNSET, CREATE, DESTROY, LIST, RESCUE } action = UNSET; static const char *path = NULL; -static int unit = -1; +static int unit = G_GATE_UNIT_AUTO; static unsigned flags = 0; static int force = 0; static unsigned queue_size = G_GATE_QUEUE_SIZE; diff --git a/sbin/ggate/shared/ggate.c b/sbin/ggate/shared/ggate.c index dd40790120d1..cf9b9ca1574f 100644 --- a/sbin/ggate/shared/ggate.c +++ b/sbin/ggate/shared/ggate.c @@ -10,7 +10,7 @@ * 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 AUTHORS 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 @@ -159,7 +159,7 @@ g_gate_sectorsize(int fd) g_gate_xlog("fstat(): %s.", strerror(errno)); if (S_ISCHR(sb.st_mode)) { if (ioctl(fd, DIOCGSECTORSIZE, &secsize) == -1) { - g_gate_xlog("Can't get sector size: %s.", + g_gate_xlog("Can't get sector size: %s.", strerror(errno)); } } else if (S_ISREG(sb.st_mode)) { @@ -174,7 +174,7 @@ void g_gate_open_device(void) { - g_gate_devfd = open("/dev/" G_GATE_CTL_NAME, O_RDWR, 0); + g_gate_devfd = open("/dev/" G_GATE_CTL_NAME, O_RDWR); if (g_gate_devfd == -1) err(EXIT_FAILURE, "open(/dev/%s)", G_GATE_CTL_NAME); } @@ -281,7 +281,7 @@ g_gate_socket_settings(int sfd) /* Socket settings. */ on = 1; if (nagle) { - if (setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &on, + if (setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) == -1) { g_gate_xlog("setsockopt() error: %s.", strerror(errno)); } diff --git a/sbin/growfs/Makefile b/sbin/growfs/Makefile index a5e9937e8f16..a875ce554c12 100644 --- a/sbin/growfs/Makefile +++ b/sbin/growfs/Makefile @@ -10,8 +10,6 @@ PROG= growfs SRCS= growfs.c MAN= growfs.8 -WARNS?= 6 - .if defined(GFSDBG) SRCS+= debug.c .endif diff --git a/sbin/growfs/growfs.c b/sbin/growfs/growfs.c index 89b14dac27f6..5e950fccd112 100644 --- a/sbin/growfs/growfs.c +++ b/sbin/growfs/growfs.c @@ -174,10 +174,9 @@ static void growfs(int fsi, int fso, unsigned int Nflag) { DBG_FUNC("growfs") - int i; - int cylno, j; time_t utime; - int width; + uint cylno; + int i, j, width; char tmpbuf[100]; #ifdef FSIRAND static int randinit=0; @@ -373,11 +372,11 @@ initcg(int cylno, time_t utime, int fso, unsigned int Nflag) { DBG_FUNC("initcg") static void *iobuf; - long d, dlower, dupper, blkno, start; + long blkno, start; ufs2_daddr_t i, cbase, dmax; struct ufs1_dinode *dp1; - struct ufs2_dinode *dp2; struct csum *cs; + uint d, dupper, dlower; if (iobuf == NULL && (iobuf = malloc(sblock.fs_bsize)) == NULL) { errx(37, "panic: cannot allocate I/O buffer"); @@ -397,11 +396,17 @@ initcg(int cylno, time_t utime, int fso, unsigned int Nflag) dupper += howmany(sblock.fs_cssize, sblock.fs_fsize); cs = &fscs[cylno]; memset(&acg, 0, sblock.fs_cgsize); + /* + * Note that we do not set cg_initediblk at all. + * In this extension of a previous filesystem + * we have no inodes initialized for the cylinder + * group at all. The first access to that cylinder + * group will do the correct initialization. + */ acg.cg_time = utime; acg.cg_magic = CG_MAGIC; acg.cg_cgx = cylno; acg.cg_niblk = sblock.fs_ipg; - acg.cg_initediblk = sblock.fs_ipg; acg.cg_ndblk = dmax - cbase; if (sblock.fs_contigsumsize > 0) acg.cg_nclusterblks = acg.cg_ndblk / sblock.fs_frag; @@ -414,7 +419,6 @@ initcg(int cylno, time_t utime, int fso, unsigned int Nflag) acg.cg_time = 0; acg.cg_old_niblk = acg.cg_niblk; acg.cg_niblk = 0; - acg.cg_initediblk = 0; acg.cg_old_btotoff = start; acg.cg_old_boff = acg.cg_old_btotoff + sblock.fs_old_cpg * sizeof(int32_t); @@ -432,7 +436,7 @@ initcg(int cylno, time_t utime, int fso, unsigned int Nflag) acg.cg_nextfreeoff = acg.cg_clusteroff + howmany(fragstoblks(&sblock, sblock.fs_fpg), CHAR_BIT); } - if (acg.cg_nextfreeoff > sblock.fs_cgsize) { + if (acg.cg_nextfreeoff > (unsigned)sblock.fs_cgsize) { /* * This should never happen as we would have had that panic * already on file system creation @@ -446,25 +450,18 @@ initcg(int cylno, time_t utime, int fso, unsigned int Nflag) acg.cg_cs.cs_nifree--; } /* - * XXX Newfs writes out two blocks of initialized inodes - * unconditionally. Should we check here to make sure that they - * were actually written? + * For the old file system, we have to initialize all the inodes. */ if (sblock.fs_magic == FS_UFS1_MAGIC) { bzero(iobuf, sblock.fs_bsize); - for (i = 2 * sblock.fs_frag; i < sblock.fs_ipg / INOPF(&sblock); + for (i = 0; i < sblock.fs_ipg / INOPF(&sblock); i += sblock.fs_frag) { dp1 = (struct ufs1_dinode *)iobuf; - dp2 = (struct ufs2_dinode *)iobuf; #ifdef FSIRAND - for (j = 0; j < INOPB(&sblock); j++) - if (sblock.fs_magic == FS_UFS1_MAGIC) { - dp1->di_gen = random(); - dp1++; - } else { - dp2->di_gen = random(); - dp2++; - } + for (j = 0; j < INOPB(&sblock); j++) { + dp1->di_gen = random(); + dp1++; + } #endif wtfs(fsbtodb(&sblock, cgimin(&sblock, cylno) + i), sblock.fs_bsize, iobuf, fso, Nflag); @@ -752,7 +749,7 @@ updjcg(int cylno, time_t utime, int fsi, int fso, unsigned int Nflag) * needed, update the free space in the superblock. */ acg.cg_time = utime; - if (cylno == sblock.fs_ncg - 1) { + if ((unsigned)cylno == sblock.fs_ncg - 1) { /* * This is still the last cylinder group. */ @@ -946,8 +943,8 @@ updcsloc(time_t utime, int fsi, int fso, unsigned int Nflag) int ocscg, ncscg; int blocks; ufs2_daddr_t cbase, dupper, odupper, d, f, g; - int ind; - int cylno, inc; + int ind, inc; + uint cylno; struct gfs_bpp *bp; int i, l; int lcs=0; @@ -2217,6 +2214,7 @@ main(int argc, char **argv) printf("Warning: %jd sector(s) cannot be allocated.\n", (intmax_t)fsbtodb(&sblock, sblock.fs_size % sblock.fs_fpg)); sblock.fs_size = sblock.fs_ncg * sblock.fs_fpg; + maxino -= sblock.fs_ipg; } /* diff --git a/sbin/gvinum/Makefile b/sbin/gvinum/Makefile index 6d414974dba1..e4bf4a714490 100644 --- a/sbin/gvinum/Makefile +++ b/sbin/gvinum/Makefile @@ -4,6 +4,7 @@ PROG= gvinum SRCS= gvinum.c gvinum.h geom_vinum_share.c MAN= gvinum.8 +WARNS?= 2 CFLAGS+= -I${.CURDIR}/../../sys DPADD= ${LIBREADLINE} ${LIBTERMCAP} ${LIBDEVSTAT} ${LIBKVM} ${LIBGEOM} diff --git a/sbin/hastctl/Makefile b/sbin/hastctl/Makefile new file mode 100644 index 000000000000..43c8c201b171 --- /dev/null +++ b/sbin/hastctl/Makefile @@ -0,0 +1,36 @@ +# $FreeBSD$ + +.include + +.PATH: ${.CURDIR}/../hastd + +PROG= hastctl +SRCS= activemap.c +SRCS+= ebuf.c +SRCS+= hast_proto.c hastctl.c +SRCS+= metadata.c +SRCS+= nv.c +SRCS+= parse.y pjdlog.c +SRCS+= proto.c proto_common.c proto_tcp4.c proto_uds.c +SRCS+= token.l +SRCS+= subr.c +SRCS+= y.tab.h +WARNS?= 6 +MAN= hastctl.8 + +CFLAGS+=-I${.CURDIR}/../hastd +CFLAGS+=-DINET +.if ${MK_INET6_SUPPORT} != "no" +CFLAGS+=-DINET6 +.endif +# This is needed to have WARNS > 1. +CFLAGS+=-DYY_NO_UNPUT + +DPADD= ${LIBCRYPTO} ${LIBL} +LDADD= -lcrypto -ll + +YFLAGS+=-v + +CLEANFILES=y.tab.c y.tab.h y.output + +.include diff --git a/sbin/hastctl/hastctl.8 b/sbin/hastctl/hastctl.8 new file mode 100644 index 000000000000..bf03c2eb5a26 --- /dev/null +++ b/sbin/hastctl/hastctl.8 @@ -0,0 +1,217 @@ +.\" Copyright (c) 2010 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This software was developed by Pawel Jakub Dawidek under sponsorship from +.\" the FreeBSD Foundation. +.\" +.\" 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 AUTHORS 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 AUTHORS 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$ +.\" +.Dd February 1, 2010 +.Dt HASTCTL 8 +.Os +.Sh NAME +.Nm hastctl +.Nd "Highly Available Storage control utility" +.Sh SYNOPSIS +.Nm +.Cm create +.Op Fl d +.Op Fl c Ar config +.Op Fl e Ar extentsize +.Op Fl k Ar keepdirty +.Op Fl m Ar mediasize +.Ar name ... +.Nm +.Cm role +.Op Fl d +.Op Fl c Ar config +.Aq init | primary | secondary +.Ar all | name ... +.Nm +.Cm status +.Op Fl d +.Op Fl c Ar config +.Op Ar all | name ... +.Nm +.Cm dump +.Op Fl d +.Op Fl c Ar config +.Op Ar all | name ... +.Sh DESCRIPTION +The +.Nm +utility is used to control the behaviour of the +.Xr hastd 8 +daemon. +.Pp +This utility should be used by HA software like +.Nm heartbeat +or +.Nm ucarp +to setup HAST resources role when changing from primary mode to +secondary or vice versa. +Be aware that if a file system like UFS exists on HAST provider and +primary node dies, file system has to be checked for inconsistencies +with the +.Xr fsck 8 +utility after switching secondary node to primary role. +.Pp +The first argument to +.Nm +indicates an action to be performed: +.Bl -tag -width ".Cm create" +.It Cm create +Initialize local provider configured for the given resource. +Additional options include: +.Bl -tag -width ".Fl e Ar extentsize" +.It Fl e Ar extentsize +Size of an extent. +Extent is a block which is used for synchronization. +.Nm +maintains a map of dirty extents and extent is the smallest region that +can be marked as dirty. +If any part of an extent is modified, entire extent will be synchronized +when nodes connect. +If extent size is too small, there will be too much disk activity +related to dirty map updates, which will degrade performance of the +given resource. +If extent size is too large, synchronization, even in case of short +outage, can take a long time increasing the risk of loosing up-to-date +node before synchronization process is completed. +The default extent size is +.Va 2MB . +.It Fl k Ar keepdirty +Maximum number of dirty extents to keep dirty all the time. +Most recently used extents are kept dirty to reduce number of metadata +updates. +The default numer of most recently used extents which will be kept +dirty is +.Va 64 . +.It Fl m Ar mediasize +Size of the smaller provider used as backend storage on both nodes. +This option can be omitted if node providers have the same size on both +sides. +.El +.It Cm role +Change role of the given resource. +The role can be one of: +.Bl -tag -width ".Cm secondary" +.It Cm init +Resource is turned off. +.It Cm primary +Local +.Xr hastd 8 +daemon will act as primary node for the given resource. +System on which resource role is set to primary can use +.Pa /dev/hast/ +GEOM provider. +.It Cm secondary +Local +.Xr hastd 8 +daemon will act as secondary node for the given resource - it will wait +for connection from the primary node and will handle I/O requests +received from it. +GEOM provider +.Pa /dev/hast/ +will not be created on secondary node. +.El +.It Cm status +Present status of the configured resources. +.It Cm dump +Dump metadata stored on local component for the configured resources. +.El +.Pp +In addition, every subcommand can be followed by the following options: +.Bl -tag -width ".Fl c Ar config" +.It Fl c Ar config +Specify alternative location of the configuration file. +The default location is +.Pa /etc/hast.conf . +.It Fl d +Print debugging information. +This option can be specified multiple times to raise the verbosity +level. +.El +.Sh EXIT STATUS +Exit status is 0 on success, or one of the values described in +.Xr sysexits 3 +on failure. +.Sh EXAMPLES +Initialize HAST provider, create file system on it and mount it. +.Bd -literal -offset indent +nodeB# hastctl create shared +nodeB# hastd +nodeB# hastctl role secondary shared + +nodeB# hastctl create shared +nodeA# hastd +nodeA# hastctl role primary shared +nodeA# newfs -U /dev/hast/shared +nodeA# mount -o noatime /dev/hast/shared /shared +nodeA# application_start +.Ed +.Pp +Switch roles for the +.Nm shared +HAST resource. +.Bd -literal -offset indent +nodeA# application_stop +nodeA# umount -f /shared +nodeA# hastctl role secondary shared + +nodeB# hastctl role primary shared +nodeB# fsck -t ufs /dev/hast/shared +nodeB# mount -o noatime /dev/hast/shared /shared +nodeB# application_start +.Ed +.Sh FILES +.Bl -tag -width ".Pa /var/run/hastctl" -compact +.It Pa /etc/hast.conf +Configuration file for +.Nm +and +.Xr hastd 8 . +.It Pa /var/run/hastctl +Control socket used by +.Nm +to communicate with the +.Xr hastd 8 +daemon. +.El +.Sh SEE ALSO +.Xr sysexits 3 , +.Xr geom 4 , +.Xr hast.conf 5 , +.Xr fsck 8 , +.Xr ggatec 8 , +.Xr ggatel 8 , +.Xr hastd 8 , +.Xr mount 8 , +.Xr newfs 8 . +.Sh AUTHORS +The +.Nm +was developed by +.An Pawel Jakub Dawidek Aq pjd@FreeBSD.org +under sponsorship of the FreeBSD Foundation. diff --git a/sbin/hastctl/hastctl.c b/sbin/hastctl/hastctl.c new file mode 100644 index 000000000000..8499528f9867 --- /dev/null +++ b/sbin/hastctl/hastctl.c @@ -0,0 +1,526 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "hast.h" +#include "hast_proto.h" +#include "metadata.h" +#include "nv.h" +#include "pjdlog.h" +#include "proto.h" +#include "subr.h" + +/* Path to configuration file. */ +static const char *cfgpath = HAST_CONFIG; +/* Hastd configuration. */ +static struct hastd_config *cfg; +/* Control connection. */ +static struct proto_conn *controlconn; + +enum { + CMD_INVALID, + CMD_CREATE, + CMD_ROLE, + CMD_STATUS, + CMD_DUMP +}; + +static __dead2 void +usage(void) +{ + + fprintf(stderr, + "usage: %s create [-d] [-c config] [-e extentsize] [-k keepdirty]\n" + "\t\t[-m mediasize] name ...\n", + getprogname()); + fprintf(stderr, + " %s role [-d] [-c config] all | name ...\n", + getprogname()); + fprintf(stderr, + " %s status [-d] [-c config] [all | name ...]\n", + getprogname()); + fprintf(stderr, + " %s dump [-d] [-c config] [all | name ...]\n", + getprogname()); + exit(EX_USAGE); +} + +static int +create_one(struct hast_resource *res, intmax_t mediasize, intmax_t extentsize, + intmax_t keepdirty) +{ + unsigned char *buf; + size_t mapsize; + int ec; + + ec = 0; + pjdlog_prefix_set("[%s] ", res->hr_name); + + if (provinfo(res, true) < 0) { + ec = EX_NOINPUT; + goto end; + } + if (mediasize == 0) + mediasize = res->hr_local_mediasize; + else if (mediasize > res->hr_local_mediasize) { + pjdlog_error("Provided mediasize is larger than provider %s size.", + res->hr_localpath); + ec = EX_DATAERR; + goto end; + } + if (!powerof2(res->hr_local_sectorsize)) { + pjdlog_error("Sector size of provider %s is not power of 2 (%u).", + res->hr_localpath, res->hr_local_sectorsize); + ec = EX_DATAERR; + goto end; + } + if (extentsize == 0) + extentsize = HAST_EXTENTSIZE; + if (extentsize < res->hr_local_sectorsize) { + pjdlog_error("Extent size (%jd) is less than sector size (%u).", + (intmax_t)extentsize, res->hr_local_sectorsize); + ec = EX_DATAERR; + goto end; + } + if ((extentsize % res->hr_local_sectorsize) != 0) { + pjdlog_error("Extent size (%jd) is not multiple of sector size (%u).", + (intmax_t)extentsize, res->hr_local_sectorsize); + ec = EX_DATAERR; + goto end; + } + mapsize = activemap_calc_ondisk_size(mediasize - METADATA_SIZE, + extentsize, res->hr_local_sectorsize); + if (keepdirty == 0) + keepdirty = HAST_KEEPDIRTY; + res->hr_datasize = mediasize - METADATA_SIZE - mapsize; + res->hr_extentsize = extentsize; + res->hr_keepdirty = keepdirty; + + res->hr_localoff = METADATA_SIZE + mapsize; + + if (metadata_write(res) < 0) { + ec = EX_IOERR; + goto end; + } + buf = calloc(1, mapsize); + if (buf == NULL) { + pjdlog_error("Unable to allocate %zu bytes of memory for initial bitmap.", + mapsize); + ec = EX_TEMPFAIL; + goto end; + } + if (pwrite(res->hr_localfd, buf, mapsize, METADATA_SIZE) != + (ssize_t)mapsize) { + pjdlog_errno(LOG_ERR, "Unable to store initial bitmap on %s", + res->hr_localpath); + free(buf); + ec = EX_IOERR; + goto end; + } + free(buf); +end: + if (res->hr_localfd >= 0) + close(res->hr_localfd); + pjdlog_prefix_set("%s", ""); + return (ec); +} + +static void +control_create(int argc, char *argv[], intmax_t mediasize, intmax_t extentsize, + intmax_t keepdirty) +{ + struct hast_resource *res; + int ec, ii, ret; + + /* Initialize the given resources. */ + if (argc < 1) + usage(); + ec = 0; + for (ii = 0; ii < argc; ii++) { + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (strcmp(argv[ii], res->hr_name) == 0) + break; + } + if (res == NULL) { + pjdlog_error("Unknown resource %s.", argv[ii]); + if (ec == 0) + ec = EX_DATAERR; + continue; + } + ret = create_one(res, mediasize, extentsize, keepdirty); + if (ret != 0 && ec == 0) + ec = ret; + } + exit(ec); +} + +static int +dump_one(struct hast_resource *res) +{ + int ret; + + ret = metadata_read(res, false); + if (ret != 0) + return (ret); + + printf("resource: %s\n", res->hr_name); + printf(" datasize: %ju\n", (uintmax_t)res->hr_datasize); + printf(" extentsize: %d\n", res->hr_extentsize); + printf(" keepdirty: %d\n", res->hr_keepdirty); + printf(" localoff: %ju\n", (uintmax_t)res->hr_localoff); + printf(" resuid: %ju\n", (uintmax_t)res->hr_resuid); + printf(" localcnt: %ju\n", (uintmax_t)res->hr_primary_localcnt); + printf(" remotecnt: %ju\n", (uintmax_t)res->hr_primary_remotecnt); + printf(" prevrole: %s\n", role2str(res->hr_previous_role)); + + return (0); +} + +static void +control_dump(int argc, char *argv[]) +{ + struct hast_resource *res; + int ec, ret; + + /* Dump metadata of the given resource(s). */ + + ec = 0; + if (argc == 0 || (argc == 1 && strcmp(argv[0], "all") == 0)) { + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + ret = dump_one(res); + if (ret != 0 && ec == 0) + ec = ret; + } + } else { + int ii; + + for (ii = 0; ii < argc; ii++) { + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (strcmp(argv[ii], res->hr_name) == 0) + break; + } + if (res == NULL) { + pjdlog_error("Unknown resource %s.", argv[ii]); + if (ec == 0) + ec = EX_DATAERR; + continue; + } + ret = dump_one(res); + if (ret != 0 && ec == 0) + ec = ret; + } + } + exit(ec); +} + +static int +control_set_role(struct nv *nv, const char *newrole) +{ + const char *res, *oldrole; + unsigned int ii; + int error, ret; + + ret = 0; + + for (ii = 0; ; ii++) { + res = nv_get_string(nv, "resource%u", ii); + if (res == NULL) + break; + pjdlog_prefix_set("[%s] ", res); + error = nv_get_int16(nv, "error%u", ii); + if (error != 0) { + if (ret == 0) + ret = error; + pjdlog_warning("Received error %d from hastd.", error); + continue; + } + oldrole = nv_get_string(nv, "role%u", ii); + if (strcmp(oldrole, newrole) == 0) + pjdlog_debug(2, "Role unchanged (%s).", oldrole); + else { + pjdlog_debug(1, "Role changed from %s to %s.", oldrole, + newrole); + } + } + pjdlog_prefix_set("%s", ""); + return (ret); +} + +static int +control_status(struct nv *nv) +{ + unsigned int ii; + const char *str; + int error, ret; + + ret = 0; + + for (ii = 0; ; ii++) { + str = nv_get_string(nv, "resource%u", ii); + if (str == NULL) + break; + printf("%s:\n", str); + error = nv_get_int16(nv, "error%u", ii); + if (error != 0) { + if (ret == 0) + ret = error; + printf(" error: %d\n", error); + continue; + } + printf(" role: %s\n", nv_get_string(nv, "role%u", ii)); + printf(" provname: %s\n", + nv_get_string(nv, "provname%u", ii)); + printf(" localpath: %s\n", + nv_get_string(nv, "localpath%u", ii)); + printf(" extentsize: %u\n", + (unsigned int)nv_get_uint32(nv, "extentsize%u", ii)); + printf(" keepdirty: %u\n", + (unsigned int)nv_get_uint32(nv, "keepdirty%u", ii)); + printf(" remoteaddr: %s\n", + nv_get_string(nv, "remoteaddr%u", ii)); + printf(" replication: %s\n", + nv_get_string(nv, "replication%u", ii)); + str = nv_get_string(nv, "status%u", ii); + if (str != NULL) + printf(" status: %s\n", str); + printf(" dirty: %ju bytes\n", + (uintmax_t)nv_get_uint64(nv, "dirty%u", ii)); + } + return (ret); +} + +static int +numfromstr(const char *str, intmax_t *nump) +{ + intmax_t num; + char *suffix; + int rerrno; + + rerrno = errno; + errno = 0; + num = strtoimax(str, &suffix, 0); + if (errno == 0 && *suffix != '\0') + errno = EINVAL; + if (errno != 0) + return (-1); + *nump = num; + errno = rerrno; + return (0); +} + +int +main(int argc, char *argv[]) +{ + struct nv *nv; + intmax_t mediasize, extentsize, keepdirty; + int cmd, debug, error, ii; + const char *optstr; + + debug = 0; + mediasize = extentsize = keepdirty = 0; + + if (argc == 1) + usage(); + + if (strcmp(argv[1], "create") == 0) { + cmd = CMD_CREATE; + optstr = "c:de:k:m:h"; + } else if (strcmp(argv[1], "role") == 0) { + cmd = CMD_ROLE; + optstr = "c:dh"; + } else if (strcmp(argv[1], "status") == 0) { + cmd = CMD_STATUS; + optstr = "c:dh"; + } else if (strcmp(argv[1], "dump") == 0) { + cmd = CMD_DUMP; + optstr = "c:dh"; + } else + usage(); + + argc--; + argv++; + + for (;;) { + int ch; + + ch = getopt(argc, argv, optstr); + if (ch == -1) + break; + switch (ch) { + case 'c': + cfgpath = optarg; + break; + case 'd': + debug++; + break; + case 'e': + if (numfromstr(optarg, &extentsize) < 0) + err(1, "Invalid extentsize"); + break; + case 'k': + if (numfromstr(optarg, &keepdirty) < 0) + err(1, "Invalid keepdirty"); + break; + case 'm': + if (numfromstr(optarg, &mediasize) < 0) + err(1, "Invalid mediasize"); + break; + case 'h': + default: + usage(); + } + } + argc -= optind; + argv += optind; + + switch (cmd) { + case CMD_CREATE: + case CMD_ROLE: + if (argc == 0) + usage(); + break; + } + + pjdlog_debug_set(debug); + + cfg = yy_config_parse(cfgpath); + assert(cfg != NULL); + + switch (cmd) { + case CMD_CREATE: + control_create(argc, argv, mediasize, extentsize, keepdirty); + /* NOTREACHED */ + assert(!"What are we doing here?!"); + break; + case CMD_DUMP: + /* Dump metadata from local component of the given resource. */ + control_dump(argc, argv); + /* NOTREACHED */ + assert(!"What are we doing here?!"); + break; + case CMD_ROLE: + /* Change role for the given resources. */ + if (argc < 2) + usage(); + nv = nv_alloc(); + nv_add_uint8(nv, HASTCTL_CMD_SETROLE, "cmd"); + if (strcmp(argv[0], "init") == 0) + nv_add_uint8(nv, HAST_ROLE_INIT, "role"); + else if (strcmp(argv[0], "primary") == 0) + nv_add_uint8(nv, HAST_ROLE_PRIMARY, "role"); + else if (strcmp(argv[0], "secondary") == 0) + nv_add_uint8(nv, HAST_ROLE_SECONDARY, "role"); + else + usage(); + for (ii = 0; ii < argc - 1; ii++) + nv_add_string(nv, argv[ii + 1], "resource%d", ii); + break; + case CMD_STATUS: + /* Obtain status of the given resources. */ + nv = nv_alloc(); + nv_add_uint8(nv, HASTCTL_CMD_STATUS, "cmd"); + if (argc == 0) + nv_add_string(nv, "all", "resource%d", 0); + else { + for (ii = 0; ii < argc; ii++) + nv_add_string(nv, argv[ii], "resource%d", ii); + } + break; + default: + assert(!"Impossible role!"); + } + + /* Setup control connection... */ + if (proto_client(cfg->hc_controladdr, &controlconn) < 0) { + pjdlog_exit(EX_OSERR, + "Unable to setup control connection to %s", + cfg->hc_controladdr); + } + /* ...and connect to hastd. */ + if (proto_connect(controlconn) < 0) { + pjdlog_exit(EX_OSERR, "Unable to connect to hastd via %s", + cfg->hc_controladdr); + } + /* Send the command to the server... */ + if (hast_proto_send(NULL, controlconn, nv, NULL, 0) < 0) { + pjdlog_exit(EX_UNAVAILABLE, + "Unable to send command to hastd via %s", + cfg->hc_controladdr); + } + nv_free(nv); + /* ...and receive reply. */ + if (hast_proto_recv(NULL, controlconn, &nv, NULL, 0) < 0) { + pjdlog_exit(EX_UNAVAILABLE, + "cannot receive reply from hastd via %s", + cfg->hc_controladdr); + } + + error = nv_get_int16(nv, "error"); + if (error != 0) { + pjdlog_exitx(EX_SOFTWARE, "Error %d received from hastd.", + error); + } + nv_set_error(nv, 0); + + switch (cmd) { + case CMD_ROLE: + error = control_set_role(nv, argv[0]); + break; + case CMD_STATUS: + error = control_status(nv); + break; + default: + assert(!"Impossible role!"); + } + + exit(error); +} diff --git a/sbin/hastd/Makefile b/sbin/hastd/Makefile new file mode 100644 index 000000000000..43118075e94b --- /dev/null +++ b/sbin/hastd/Makefile @@ -0,0 +1,38 @@ +# $FreeBSD$ + +.include + +PROG= hastd +SRCS= activemap.c +SRCS+= control.c +SRCS+= ebuf.c +SRCS+= hast_proto.c hastd.c hooks.c +SRCS+= metadata.c +SRCS+= nv.c +SRCS+= secondary.c +SRCS+= parse.y pjdlog.c primary.c +SRCS+= proto.c proto_common.c proto_socketpair.c proto_tcp4.c proto_uds.c +SRCS+= rangelock.c +SRCS+= subr.c +SRCS+= token.l +SRCS+= y.tab.h +WARNS?= 6 +MAN= hastd.8 hast.conf.5 + +CFLAGS+=-I${.CURDIR} +CFLAGS+=-DINET +.if ${MK_INET6_SUPPORT} != "no" +CFLAGS+=-DINET6 +.endif +# This is needed to have WARNS > 1. +CFLAGS+=-DYY_NO_UNPUT + +DPADD= ${LIBCRYPTO} ${LIBGEOM} ${LIBBSDXML} ${LIBSBUF} ${LIBL} \ + ${LIBPTHREAD} ${LIBUTIL} +LDADD= -lcrypto -lgeom -lbsdxml -lsbuf -ll -lpthread -lutil + +YFLAGS+=-v + +CLEANFILES=y.tab.c y.tab.h y.output + +.include diff --git a/sbin/hastd/activemap.c b/sbin/hastd/activemap.c new file mode 100644 index 000000000000..10eb64103057 --- /dev/null +++ b/sbin/hastd/activemap.c @@ -0,0 +1,691 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include /* powerof2() */ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define ACTIVEMAP_MAGIC 0xac71e4 +struct activemap { + int am_magic; /* Magic value. */ + off_t am_mediasize; /* Media size in bytes. */ + uint32_t am_extentsize; /* Extent size in bytes, + must be power of 2. */ + uint8_t am_extentshift;/* 2 ^ extentbits == extentsize */ + int am_nextents; /* Number of extents. */ + size_t am_mapsize; /* Bitmap size in bytes. */ + uint16_t *am_memtab; /* An array that holds number of pending + writes per extent. */ + bitstr_t *am_diskmap; /* On-disk bitmap of dirty extents. */ + bitstr_t *am_memmap; /* In-memory bitmap of dirty extents. */ + size_t am_diskmapsize; /* Map size rounded up to sector size. */ + uint64_t am_ndirty; /* Number of dirty regions. */ + bitstr_t *am_syncmap; /* Bitmap of extents to sync. */ + off_t am_syncoff; /* Next synchronization offset. */ + TAILQ_HEAD(skeepdirty, keepdirty) am_keepdirty; /* List of extents that + we keep dirty to reduce bitmap + updates. */ + int am_nkeepdirty; /* Number of am_keepdirty elements. */ + int am_nkeepdirty_limit; /* Maximum number of am_keepdirty + elements. */ +}; + +struct keepdirty { + int kd_extent; + TAILQ_ENTRY(keepdirty) kd_next; +}; + +/* + * Helper function taken from sys/systm.h to calculate extentshift. + */ +static uint32_t +bitcount32(uint32_t x) +{ + + x = (x & 0x55555555) + ((x & 0xaaaaaaaa) >> 1); + x = (x & 0x33333333) + ((x & 0xcccccccc) >> 2); + x = (x + (x >> 4)) & 0x0f0f0f0f; + x = (x + (x >> 8)); + x = (x + (x >> 16)) & 0x000000ff; + return (x); +} + +static __inline int +off2ext(const struct activemap *amp, off_t offset) +{ + int extent; + + assert(offset >= 0 && offset < amp->am_mediasize); + extent = (offset >> amp->am_extentshift); + assert(extent >= 0 && extent < amp->am_nextents); + return (extent); +} + +static __inline off_t +ext2off(const struct activemap *amp, int extent) +{ + off_t offset; + + assert(extent >= 0 && extent < amp->am_nextents); + offset = ((off_t)extent << amp->am_extentshift); + assert(offset >= 0 && offset < amp->am_mediasize); + return (offset); +} + +/* + * Function calculates number of requests needed to synchronize the given + * extent. + */ +static __inline int +ext2reqs(const struct activemap *amp, int ext) +{ + off_t left; + + if (ext < amp->am_nextents - 1) + return (((amp->am_extentsize - 1) / MAXPHYS) + 1); + + assert(ext == amp->am_nextents - 1); + left = amp->am_mediasize % amp->am_extentsize; + if (left == 0) + left = amp->am_extentsize; + return (((left - 1) / MAXPHYS) + 1); +} + +/* + * Initialize activemap structure and allocate memory for internal needs. + * Function returns 0 on success and -1 if any of the allocations failed. + */ +int +activemap_init(struct activemap **ampp, uint64_t mediasize, uint32_t extentsize, + uint32_t sectorsize, uint32_t keepdirty) +{ + struct activemap *amp; + + assert(ampp != NULL); + assert(mediasize > 0); + assert(extentsize > 0); + assert(powerof2(extentsize)); + assert(sectorsize > 0); + assert(powerof2(sectorsize)); + assert(keepdirty > 0); + + amp = malloc(sizeof(*amp)); + if (amp == NULL) + return (-1); + + amp->am_mediasize = mediasize; + amp->am_nkeepdirty_limit = keepdirty; + amp->am_extentsize = extentsize; + amp->am_extentshift = bitcount32(extentsize - 1); + amp->am_nextents = ((mediasize - 1) / extentsize) + 1; + amp->am_mapsize = sizeof(bitstr_t) * bitstr_size(amp->am_nextents); + amp->am_diskmapsize = roundup2(amp->am_mapsize, sectorsize); + amp->am_ndirty = 0; + amp->am_syncoff = -2; + TAILQ_INIT(&->am_keepdirty); + amp->am_nkeepdirty = 0; + + amp->am_memtab = calloc(amp->am_nextents, sizeof(amp->am_memtab[0])); + amp->am_diskmap = calloc(1, amp->am_diskmapsize); + amp->am_memmap = bit_alloc(amp->am_nextents); + amp->am_syncmap = bit_alloc(amp->am_nextents); + + /* + * Check to see if any of the allocations above failed. + */ + if (amp->am_memtab == NULL || amp->am_diskmap == NULL || + amp->am_memmap == NULL || amp->am_syncmap == NULL) { + if (amp->am_memtab != NULL) + free(amp->am_memtab); + if (amp->am_diskmap != NULL) + free(amp->am_diskmap); + if (amp->am_memmap != NULL) + free(amp->am_memmap); + if (amp->am_syncmap != NULL) + free(amp->am_syncmap); + amp->am_magic = 0; + free(amp); + errno = ENOMEM; + return (-1); + } + + amp->am_magic = ACTIVEMAP_MAGIC; + *ampp = amp; + + return (0); +} + +static struct keepdirty * +keepdirty_find(struct activemap *amp, int extent) +{ + struct keepdirty *kd; + + TAILQ_FOREACH(kd, &->am_keepdirty, kd_next) { + if (kd->kd_extent == extent) + break; + } + return (kd); +} + +static void +keepdirty_add(struct activemap *amp, int extent) +{ + struct keepdirty *kd; + + kd = keepdirty_find(amp, extent); + if (kd != NULL) { + /* + * Only move element at the begining. + */ + TAILQ_REMOVE(&->am_keepdirty, kd, kd_next); + TAILQ_INSERT_HEAD(&->am_keepdirty, kd, kd_next); + return; + } + /* + * Add new element, but first remove the most unused one if + * we have too many. + */ + if (amp->am_nkeepdirty >= amp->am_nkeepdirty_limit) { + kd = TAILQ_LAST(&->am_keepdirty, skeepdirty); + assert(kd != NULL); + TAILQ_REMOVE(&->am_keepdirty, kd, kd_next); + amp->am_nkeepdirty--; + assert(amp->am_nkeepdirty > 0); + } + if (kd == NULL) + kd = malloc(sizeof(*kd)); + /* We can ignore allocation failure. */ + if (kd != NULL) { + kd->kd_extent = extent; + amp->am_nkeepdirty++; + TAILQ_INSERT_HEAD(&->am_keepdirty, kd, kd_next); + } +} + +static void +keepdirty_fill(struct activemap *amp) +{ + struct keepdirty *kd; + + TAILQ_FOREACH(kd, &->am_keepdirty, kd_next) + bit_set(amp->am_diskmap, kd->kd_extent); +} + +static void +keepdirty_free(struct activemap *amp) +{ + struct keepdirty *kd; + + while ((kd = TAILQ_FIRST(&->am_keepdirty)) != NULL) { + TAILQ_REMOVE(&->am_keepdirty, kd, kd_next); + amp->am_nkeepdirty--; + free(kd); + } + assert(amp->am_nkeepdirty == 0); +} + +/* + * Function frees resources allocated by activemap_init() function. + */ +void +activemap_free(struct activemap *amp) +{ + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + amp->am_magic = 0; + + keepdirty_free(amp); + free(amp->am_memtab); + free(amp->am_diskmap); + free(amp->am_memmap); + free(amp->am_syncmap); +} + +/* + * Function should be called before we handle write requests. It updates + * internal structures and returns true if on-disk metadata should be updated. + */ +bool +activemap_write_start(struct activemap *amp, off_t offset, off_t length) +{ + bool modified; + off_t end; + int ext; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + assert(length > 0); + + modified = false; + end = offset + length - 1; + + for (ext = off2ext(amp, offset); ext <= off2ext(amp, end); ext++) { + /* + * If the number of pending writes is increased from 0, + * we have to mark the extent as dirty also in on-disk bitmap. + * By returning true we inform the caller that on-disk bitmap + * was modified and has to be flushed to disk. + */ + if (amp->am_memtab[ext]++ == 0) { + assert(!bit_test(amp->am_memmap, ext)); + bit_set(amp->am_memmap, ext); + amp->am_ndirty++; + modified = true; + } + keepdirty_add(amp, ext); + } + + return (modified); +} + +/* + * Function should be called after receiving write confirmation. It updates + * internal structures and returns true if on-disk metadata should be updated. + */ +bool +activemap_write_complete(struct activemap *amp, off_t offset, off_t length) +{ + bool modified; + off_t end; + int ext; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + assert(length > 0); + + modified = false; + end = offset + length - 1; + + for (ext = off2ext(amp, offset); ext <= off2ext(amp, end); ext++) { + /* + * If the number of pending writes goes down to 0, we have to + * mark the extent as clean also in on-disk bitmap. + * By returning true we inform the caller that on-disk bitmap + * was modified and has to be flushed to disk. + */ + assert(amp->am_memtab[ext] > 0); + assert(bit_test(amp->am_memmap, ext)); + if (--amp->am_memtab[ext] == 0) { + bit_clear(amp->am_memmap, ext); + amp->am_ndirty--; + modified = true; + } + } + + return (modified); +} + +/* + * Function should be called after finishing synchronization of one extent. + * It returns true if on-disk metadata should be updated. + */ +bool +activemap_extent_complete(struct activemap *amp, int extent) +{ + bool modified; + int reqs; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + assert(extent >= 0 && extent < amp->am_nextents); + + modified = false; + + reqs = ext2reqs(amp, extent); + assert(amp->am_memtab[extent] >= reqs); + amp->am_memtab[extent] -= reqs; + assert(bit_test(amp->am_memmap, extent)); + if (amp->am_memtab[extent] == 0) { + bit_clear(amp->am_memmap, extent); + amp->am_ndirty--; + modified = true; + } + + return (modified); +} + +/* + * Function returns number of dirty regions. + */ +uint64_t +activemap_ndirty(const struct activemap *amp) +{ + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + return (amp->am_ndirty); +} + +/* + * Function compare on-disk bitmap and in-memory bitmap and returns true if + * they differ and should be flushed to the disk. + */ +bool +activemap_differ(const struct activemap *amp) +{ + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + return (memcmp(amp->am_diskmap, amp->am_memmap, + amp->am_mapsize) != 0); +} + +/* + * Function returns number of bytes used by bitmap. + */ +size_t +activemap_size(const struct activemap *amp) +{ + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + return (amp->am_mapsize); +} + +/* + * Function returns number of bytes needed for storing on-disk bitmap. + * This is the same as activemap_size(), but rounded up to sector size. + */ +size_t +activemap_ondisk_size(const struct activemap *amp) +{ + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + return (amp->am_diskmapsize); +} + +/* + * Function copies the given buffer read from disk to the internal bitmap. + */ +void +activemap_copyin(struct activemap *amp, const unsigned char *buf, size_t size) +{ + int ext; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + assert(size >= amp->am_mapsize); + + memcpy(amp->am_diskmap, buf, amp->am_mapsize); + memcpy(amp->am_memmap, buf, amp->am_mapsize); + memcpy(amp->am_syncmap, buf, amp->am_mapsize); + + bit_ffs(amp->am_memmap, amp->am_nextents, &ext); + if (ext == -1) { + /* There are no dirty extents, so we can leave now. */ + return; + } + /* + * Set synchronization offset to the first dirty extent. + */ + activemap_sync_rewind(amp); + /* + * We have dirty extents and we want them to stay that way until + * we synchronize, so we set number of pending writes to number + * of requests needed to synchronize one extent. + */ + amp->am_ndirty = 0; + for (; ext < amp->am_nextents; ext++) { + if (bit_test(amp->am_memmap, ext)) { + amp->am_memtab[ext] = ext2reqs(amp, ext); + amp->am_ndirty++; + } + } +} + +/* + * Function merges the given bitmap with existng one. + */ +void +activemap_merge(struct activemap *amp, const unsigned char *buf, size_t size) +{ + bitstr_t *remmap = __DECONST(bitstr_t *, buf); + int ext; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + assert(size >= amp->am_mapsize); + + bit_ffs(remmap, amp->am_nextents, &ext); + if (ext == -1) { + /* There are no dirty extents, so we can leave now. */ + return; + } + /* + * We have dirty extents and we want them to stay that way until + * we synchronize, so we set number of pending writes to number + * of requests needed to synchronize one extent. + */ + for (; ext < amp->am_nextents; ext++) { + /* Local extent already dirty. */ + if (bit_test(amp->am_syncmap, ext)) + continue; + /* Remote extent isn't dirty. */ + if (!bit_test(remmap, ext)) + continue; + bit_set(amp->am_syncmap, ext); + bit_set(amp->am_memmap, ext); + bit_set(amp->am_diskmap, ext); + if (amp->am_memtab[ext] == 0) + amp->am_ndirty++; + amp->am_memtab[ext] = ext2reqs(amp, ext); + } + /* + * Set synchronization offset to the first dirty extent. + */ + activemap_sync_rewind(amp); +} + +/* + * Function returns pointer to internal bitmap that should be written to disk. + */ +const unsigned char * +activemap_bitmap(struct activemap *amp, size_t *sizep) +{ + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + if (sizep != NULL) + *sizep = amp->am_diskmapsize; + memcpy(amp->am_diskmap, amp->am_memmap, amp->am_mapsize); + keepdirty_fill(amp); + return ((const unsigned char *)amp->am_diskmap); +} + +/* + * Function calculates size needed to store bitmap on disk. + */ +size_t +activemap_calc_ondisk_size(uint64_t mediasize, uint32_t extentsize, + uint32_t sectorsize) +{ + uint64_t nextents, mapsize; + + assert(mediasize > 0); + assert(extentsize > 0); + assert(powerof2(extentsize)); + assert(sectorsize > 0); + assert(powerof2(sectorsize)); + + nextents = ((mediasize - 1) / extentsize) + 1; + mapsize = sizeof(bitstr_t) * bitstr_size(nextents); + return (roundup2(mapsize, sectorsize)); +} + +/* + * Set synchronization offset to the first dirty extent. + */ +void +activemap_sync_rewind(struct activemap *amp) +{ + int ext; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + bit_ffs(amp->am_syncmap, amp->am_nextents, &ext); + if (ext == -1) { + /* There are no extents to synchronize. */ + amp->am_syncoff = -2; + return; + } + /* + * Mark that we want to start synchronization from the begining. + */ + amp->am_syncoff = -1; +} + +/* + * Return next offset of where we should synchronize. + */ +off_t +activemap_sync_offset(struct activemap *amp, off_t *lengthp, int *syncextp) +{ + off_t syncoff, left; + int ext; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + assert(lengthp != NULL); + assert(syncextp != NULL); + + *syncextp = -1; + + if (amp->am_syncoff == -2) + return (-1); + + if (amp->am_syncoff >= 0 && + (amp->am_syncoff + MAXPHYS >= amp->am_mediasize || + off2ext(amp, amp->am_syncoff) != + off2ext(amp, amp->am_syncoff + MAXPHYS))) { + /* + * We are about to change extent, so mark previous one as clean. + */ + ext = off2ext(amp, amp->am_syncoff); + bit_clear(amp->am_syncmap, ext); + *syncextp = ext; + amp->am_syncoff = -1; + } + + if (amp->am_syncoff == -1) { + /* + * Let's find first extent to synchronize. + */ + bit_ffs(amp->am_syncmap, amp->am_nextents, &ext); + if (ext == -1) { + amp->am_syncoff = -2; + return (-1); + } + amp->am_syncoff = ext2off(amp, ext); + } else { + /* + * We don't change extent, so just increase offset. + */ + amp->am_syncoff += MAXPHYS; + if (amp->am_syncoff >= amp->am_mediasize) { + amp->am_syncoff = -2; + return (-1); + } + } + + syncoff = amp->am_syncoff; + left = ext2off(amp, off2ext(amp, syncoff)) + + amp->am_extentsize - syncoff; + if (syncoff + left > amp->am_mediasize) + left = amp->am_mediasize - syncoff; + if (left > MAXPHYS) + left = MAXPHYS; + + assert(left >= 0 && left <= MAXPHYS); + assert(syncoff >= 0 && syncoff < amp->am_mediasize); + assert(syncoff + left >= 0 && syncoff + left <= amp->am_mediasize); + + *lengthp = left; + return (syncoff); +} + +/* + * Mark extent(s) containing the given region for synchronization. + * Most likely one of the components is unavailable. + */ +bool +activemap_need_sync(struct activemap *amp, off_t offset, off_t length) +{ + bool modified; + off_t end; + int ext; + + assert(amp->am_magic == ACTIVEMAP_MAGIC); + + modified = false; + end = offset + length - 1; + + for (ext = off2ext(amp, offset); ext <= off2ext(amp, end); ext++) { + if (bit_test(amp->am_syncmap, ext)) { + /* Already marked for synchronization. */ + assert(bit_test(amp->am_memmap, ext)); + continue; + } + bit_set(amp->am_syncmap, ext); + if (!bit_test(amp->am_memmap, ext)) { + bit_set(amp->am_memmap, ext); + amp->am_ndirty++; + } + amp->am_memtab[ext] += ext2reqs(amp, ext); + modified = true; + } + + return (modified); +} + +void +activemap_dump(const struct activemap *amp) +{ + int bit; + + printf("M: "); + for (bit = 0; bit < amp->am_nextents; bit++) + printf("%d", bit_test(amp->am_memmap, bit) ? 1 : 0); + printf("\n"); + printf("D: "); + for (bit = 0; bit < amp->am_nextents; bit++) + printf("%d", bit_test(amp->am_diskmap, bit) ? 1 : 0); + printf("\n"); + printf("S: "); + for (bit = 0; bit < amp->am_nextents; bit++) + printf("%d", bit_test(amp->am_syncmap, bit) ? 1 : 0); + printf("\n"); +} diff --git a/sbin/hastd/activemap.h b/sbin/hastd/activemap.h new file mode 100644 index 000000000000..42f0221dc49d --- /dev/null +++ b/sbin/hastd/activemap.h @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _ACTIVEMAP_H_ +#define _ACTIVEMAP_H_ + +#include +#include + +struct activemap; + +int activemap_init(struct activemap **ampp, uint64_t mediasize, + uint32_t extentsize, uint32_t sectorsize, uint32_t keepdirty); +void activemap_free(struct activemap *amp); + +bool activemap_write_start(struct activemap *amp, off_t offset, off_t length); +bool activemap_write_complete(struct activemap *amp, off_t offset, + off_t length); +bool activemap_extent_complete(struct activemap *amp, int extent); +uint64_t activemap_ndirty(const struct activemap *amp); + +bool activemap_differ(const struct activemap *amp); +size_t activemap_size(const struct activemap *amp); +size_t activemap_ondisk_size(const struct activemap *amp); +void activemap_copyin(struct activemap *amp, const unsigned char *buf, + size_t size); +void activemap_merge(struct activemap *amp, const unsigned char *buf, + size_t size); +const unsigned char *activemap_bitmap(struct activemap *amp, size_t *sizep); + +size_t activemap_calc_ondisk_size(uint64_t mediasize, uint32_t extentsize, + uint32_t sectorsize); + +void activemap_sync_rewind(struct activemap *amp); +off_t activemap_sync_offset(struct activemap *amp, off_t *lengthp, + int *syncextp); +bool activemap_need_sync(struct activemap *amp, off_t offset, off_t length); + +void activemap_dump(const struct activemap *amp); + +#endif /* !_ACTIVEMAP_H_ */ diff --git a/sbin/hastd/control.c b/sbin/hastd/control.c new file mode 100644 index 000000000000..0ad39b40d001 --- /dev/null +++ b/sbin/hastd/control.c @@ -0,0 +1,426 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "hast.h" +#include "hastd.h" +#include "hast_proto.h" +#include "nv.h" +#include "pjdlog.h" +#include "proto.h" +#include "subr.h" + +#include "control.h" + +static void +control_set_role(struct hastd_config *cfg, struct nv *nvout, uint8_t role, + struct hast_resource *res, const char *name, unsigned int no) +{ + + assert(cfg != NULL); + assert(nvout != NULL); + assert(name != NULL); + + /* Name is always needed. */ + nv_add_string(nvout, name, "resource%u", no); + + if (res == NULL) { + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (strcmp(res->hr_name, name) == 0) + break; + } + if (res == NULL) { + nv_add_int16(nvout, EHAST_NOENTRY, "error%u", no); + return; + } + } + assert(res != NULL); + + /* Send previous role back. */ + nv_add_string(nvout, role2str(res->hr_role), "role%u", no); + + /* Nothing changed, return here. */ + if (role == res->hr_role) + return; + + pjdlog_prefix_set("[%s] (%s) ", res->hr_name, role2str(res->hr_role)); + pjdlog_info("Role changed to %s.", role2str(role)); + + /* Change role to the new one. */ + res->hr_role = role; + pjdlog_prefix_set("[%s] (%s) ", res->hr_name, role2str(res->hr_role)); + + /* + * If previous role was primary or secondary we have to kill process + * doing that work. + */ + if (res->hr_workerpid != 0) { + if (kill(res->hr_workerpid, SIGTERM) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to kill worker process %u", + (unsigned int)res->hr_workerpid); + } else if (waitpid(res->hr_workerpid, NULL, 0) != + res->hr_workerpid) { + pjdlog_errno(LOG_WARNING, + "Error while waiting for worker process %u", + (unsigned int)res->hr_workerpid); + } else { + pjdlog_debug(1, "Worker process %u stopped.", + (unsigned int)res->hr_workerpid); + } + res->hr_workerpid = 0; + } + + /* Start worker process if we are changing to primary. */ + if (role == HAST_ROLE_PRIMARY) + hastd_primary(res); + pjdlog_prefix_set("%s", ""); +} + +static void +control_status_worker(struct hast_resource *res, struct nv *nvout, + unsigned int no) +{ + struct nv *cnvin, *cnvout; + const char *str; + int error; + + cnvin = cnvout = NULL; + error = 0; + + /* + * Prepare and send command to worker process. + */ + cnvout = nv_alloc(); + nv_add_uint8(cnvout, HASTCTL_STATUS, "cmd"); + error = nv_error(cnvout); + if (error != 0) { + /* LOG */ + goto end; + } + if (hast_proto_send(res, res->hr_ctrl, cnvout, NULL, 0) < 0) { + error = errno; + /* LOG */ + goto end; + } + + /* + * Receive response. + */ + if (hast_proto_recv_hdr(res->hr_ctrl, &cnvin) < 0) { + error = errno; + /* LOG */ + goto end; + } + + error = nv_get_int64(cnvin, "error"); + if (error != 0) + goto end; + + if ((str = nv_get_string(cnvin, "status")) == NULL) { + error = ENOENT; + /* LOG */ + goto end; + } + nv_add_string(nvout, str, "status%u", no); + nv_add_uint64(nvout, nv_get_uint64(cnvin, "dirty"), "dirty%u", no); + nv_add_uint32(nvout, nv_get_uint32(cnvin, "extentsize"), + "extentsize%u", no); + nv_add_uint32(nvout, nv_get_uint32(cnvin, "keepdirty"), + "keepdirty%u", no); +end: + if (cnvin != NULL) + nv_free(cnvin); + if (cnvout != NULL) + nv_free(cnvout); + if (error != 0) + nv_add_int16(nvout, error, "error"); +} + +static void +control_status(struct hastd_config *cfg, struct nv *nvout, + struct hast_resource *res, const char *name, unsigned int no) +{ + + assert(cfg != NULL); + assert(nvout != NULL); + assert(name != NULL); + + /* Name is always needed. */ + nv_add_string(nvout, name, "resource%u", no); + + if (res == NULL) { + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (strcmp(res->hr_name, name) == 0) + break; + } + if (res == NULL) { + nv_add_int16(nvout, EHAST_NOENTRY, "error%u", no); + return; + } + } + assert(res != NULL); + nv_add_string(nvout, res->hr_provname, "provname%u", no); + nv_add_string(nvout, res->hr_localpath, "localpath%u", no); + nv_add_string(nvout, res->hr_remoteaddr, "remoteaddr%u", no); + switch (res->hr_replication) { + case HAST_REPLICATION_FULLSYNC: + nv_add_string(nvout, "fullsync", "replication%u", no); + break; + case HAST_REPLICATION_MEMSYNC: + nv_add_string(nvout, "memsync", "replication%u", no); + break; + case HAST_REPLICATION_ASYNC: + nv_add_string(nvout, "async", "replication%u", no); + break; + default: + nv_add_string(nvout, "unknown", "replication%u", no); + break; + } + nv_add_string(nvout, role2str(res->hr_role), "role%u", no); + + switch (res->hr_role) { + case HAST_ROLE_PRIMARY: + assert(res->hr_workerpid != 0); + /* FALLTHROUGH */ + case HAST_ROLE_SECONDARY: + if (res->hr_workerpid != 0) + break; + /* FALLTHROUGH */ + default: + return; + } + + /* + * If we are here, it means that we have a worker process, which we + * want to ask some questions. + */ + control_status_worker(res, nvout, no); +} + +void +control_handle(struct hastd_config *cfg) +{ + struct proto_conn *conn; + struct nv *nvin, *nvout; + unsigned int ii; + const char *str; + uint8_t cmd, role; + int error; + + if (proto_accept(cfg->hc_controlconn, &conn) < 0) { + pjdlog_errno(LOG_ERR, "Unable to accept control connection"); + return; + } + + nvin = nvout = NULL; + role = HAST_ROLE_UNDEF; + + if (hast_proto_recv_hdr(conn, &nvin) < 0) { + pjdlog_errno(LOG_ERR, "Unable to receive control header"); + nvin = NULL; + goto close; + } + + /* Obtain command code. 0 means that nv_get_uint8() failed. */ + cmd = nv_get_uint8(nvin, "cmd"); + if (cmd == 0) { + pjdlog_error("Control header is missing 'cmd' field."); + error = EHAST_INVALID; + goto close; + } + + /* Allocate outgoing nv structure. */ + nvout = nv_alloc(); + if (nvout == NULL) { + pjdlog_error("Unable to allocate header for control response."); + error = EHAST_NOMEMORY; + goto close; + } + + error = 0; + + str = nv_get_string(nvin, "resource0"); + if (str == NULL) { + pjdlog_error("Control header is missing 'resource0' field."); + error = EHAST_INVALID; + goto fail; + } + if (cmd == HASTCTL_SET_ROLE) { + role = nv_get_uint8(nvin, "role"); + switch (role) { + case HAST_ROLE_INIT: /* Is that valid to set, hmm? */ + case HAST_ROLE_PRIMARY: + case HAST_ROLE_SECONDARY: + break; + default: + pjdlog_error("Invalid role received (%hhu).", role); + error = EHAST_INVALID; + goto fail; + } + } + if (strcmp(str, "all") == 0) { + struct hast_resource *res; + + /* All configured resources. */ + + ii = 0; + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + switch (cmd) { + case HASTCTL_SET_ROLE: + control_set_role(cfg, nvout, role, res, + res->hr_name, ii++); + break; + case HASTCTL_STATUS: + control_status(cfg, nvout, res, res->hr_name, + ii++); + break; + default: + pjdlog_error("Invalid command received (%hhu).", + cmd); + error = EHAST_UNIMPLEMENTED; + goto fail; + } + } + } else { + /* Only selected resources. */ + + for (ii = 0; ; ii++) { + str = nv_get_string(nvin, "resource%u", ii); + if (str == NULL) + break; + switch (cmd) { + case HASTCTL_SET_ROLE: + control_set_role(cfg, nvout, role, NULL, str, + ii); + break; + case HASTCTL_STATUS: + control_status(cfg, nvout, NULL, str, ii); + break; + default: + pjdlog_error("Invalid command received (%hhu).", + cmd); + error = EHAST_UNIMPLEMENTED; + goto fail; + } + } + } + if (nv_error(nvout) != 0) + goto close; +fail: + if (error != 0) + nv_add_int16(nvout, error, "error"); + + if (hast_proto_send(NULL, conn, nvout, NULL, 0) < 0) + pjdlog_errno(LOG_ERR, "Unable to send control response"); +close: + if (nvin != NULL) + nv_free(nvin); + if (nvout != NULL) + nv_free(nvout); + proto_close(conn); +} + +/* + * Thread handles control requests from the parent. + */ +void * +ctrl_thread(void *arg) +{ + struct hast_resource *res = arg; + struct nv *nvin, *nvout; + uint8_t cmd; + + for (;;) { + if (hast_proto_recv_hdr(res->hr_ctrl, &nvin) < 0) { + if (sigexit_received) + pthread_exit(NULL); + pjdlog_errno(LOG_ERR, + "Unable to receive control message"); + continue; + } + cmd = nv_get_uint8(nvin, "cmd"); + if (cmd == 0) { + pjdlog_error("Control message is missing 'cmd' field."); + nv_free(nvin); + continue; + } + nv_free(nvin); + nvout = nv_alloc(); + switch (cmd) { + case HASTCTL_STATUS: + if (res->hr_remotein != NULL && + res->hr_remoteout != NULL) { + nv_add_string(nvout, "complete", "status"); + } else { + nv_add_string(nvout, "degraded", "status"); + } + nv_add_uint32(nvout, (uint32_t)res->hr_extentsize, + "extentsize"); + if (res->hr_role == HAST_ROLE_PRIMARY) { + nv_add_uint32(nvout, + (uint32_t)res->hr_keepdirty, "keepdirty"); + nv_add_uint64(nvout, + (uint64_t)(activemap_ndirty(res->hr_amp) * + res->hr_extentsize), "dirty"); + } else { + nv_add_uint32(nvout, (uint32_t)0, "keepdirty"); + nv_add_uint64(nvout, (uint64_t)0, "dirty"); + } + break; + default: + nv_add_int16(nvout, EINVAL, "error"); + break; + } + if (nv_error(nvout) != 0) { + pjdlog_error("Unable to create answer on control message."); + nv_free(nvout); + continue; + } + if (hast_proto_send(NULL, res->hr_ctrl, nvout, NULL, 0) < 0) { + pjdlog_errno(LOG_ERR, + "Unable to send reply to control message"); + } + nv_free(nvout); + } + /* NOTREACHED */ + return (NULL); +} diff --git a/sbin/hastd/control.h b/sbin/hastd/control.h new file mode 100644 index 000000000000..15ea290ea557 --- /dev/null +++ b/sbin/hastd/control.h @@ -0,0 +1,44 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _CONTROL_H_ +#define _CONTROL_H_ + +#define HASTCTL_SET_ROLE 1 +#define HASTCTL_STATUS 2 + +struct hastd_config; + +void control_handle(struct hastd_config *cfg); + +void *ctrl_thread(void *arg); + +#endif /* !_CONTROL_H_ */ diff --git a/sbin/hastd/ebuf.c b/sbin/hastd/ebuf.c new file mode 100644 index 000000000000..47b7530e2ea6 --- /dev/null +++ b/sbin/hastd/ebuf.c @@ -0,0 +1,252 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include + +#include "ebuf.h" + +#define EBUF_MAGIC 0xeb0f41c +struct ebuf { + /* Magic to assert the caller uses valid structure. */ + int eb_magic; + /* Address where we did the allocation. */ + unsigned char *eb_start; + /* Allocation end address. */ + unsigned char *eb_end; + /* Start of real data. */ + unsigned char *eb_used; + /* Size of real data. */ + size_t eb_size; +}; + +static int ebuf_head_extent(struct ebuf *eb, size_t size); +static int ebuf_tail_extent(struct ebuf *eb, size_t size); + +struct ebuf * +ebuf_alloc(size_t size) +{ + struct ebuf *eb; + int rerrno; + + eb = malloc(sizeof(*eb)); + if (eb == NULL) + return (NULL); + size += PAGE_SIZE; + eb->eb_start = malloc(size); + if (eb->eb_start == NULL) { + rerrno = errno; + free(eb); + errno = rerrno; + return (NULL); + } + eb->eb_end = eb->eb_start + size; + /* + * We set start address for real data not at the first entry, because + * we want to be able to add data at the front. + */ + eb->eb_used = eb->eb_start + PAGE_SIZE / 4; + eb->eb_size = 0; + eb->eb_magic = EBUF_MAGIC; + + return (eb); +} + +void +ebuf_free(struct ebuf *eb) +{ + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + + eb->eb_magic = 0; + + free(eb->eb_start); + free(eb); +} + +int +ebuf_add_head(struct ebuf *eb, const void *data, size_t size) +{ + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + + if (size > (size_t)(eb->eb_used - eb->eb_start)) { + /* + * We can't add more entries at the front, so we have to extend + * our buffer. + */ + if (ebuf_head_extent(eb, size) < 0) + return (-1); + } + assert(size <= (size_t)(eb->eb_used - eb->eb_start)); + + eb->eb_size += size; + eb->eb_used -= size; + /* + * If data is NULL the caller just wants to reserve place. + */ + if (data != NULL) + bcopy(data, eb->eb_used, size); + + return (0); +} + +int +ebuf_add_tail(struct ebuf *eb, const void *data, size_t size) +{ + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + + if (size > (size_t)(eb->eb_end - (eb->eb_used + eb->eb_size))) { + /* + * We can't add more entries at the back, so we have to extend + * our buffer. + */ + if (ebuf_tail_extent(eb, size) < 0) + return (-1); + } + assert(size <= (size_t)(eb->eb_end - (eb->eb_used + eb->eb_size))); + + /* + * If data is NULL the caller just wants to reserve place. + */ + if (data != NULL) + bcopy(data, eb->eb_used + eb->eb_size, size); + eb->eb_size += size; + + return (0); +} + +void +ebuf_del_head(struct ebuf *eb, size_t size) +{ + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + assert(size <= eb->eb_size); + + eb->eb_used += size; + eb->eb_size -= size; +} + +void +ebuf_del_tail(struct ebuf *eb, size_t size) +{ + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + assert(size <= eb->eb_size); + + eb->eb_size -= size; +} + +/* + * Return pointer to the data and data size. + */ +void * +ebuf_data(struct ebuf *eb, size_t *sizep) +{ + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + + if (sizep != NULL) + *sizep = eb->eb_size; + return (eb->eb_size > 0 ? eb->eb_used : NULL); +} + +/* + * Return data size. + */ +size_t +ebuf_size(struct ebuf *eb) +{ + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + + return (eb->eb_size); +} + +/* + * Function adds size + (PAGE_SIZE / 4) bytes at the front of the buffer.. + */ +static int +ebuf_head_extent(struct ebuf *eb, size_t size) +{ + unsigned char *newstart, *newused; + size_t newsize; + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + + newsize = eb->eb_end - eb->eb_start + (PAGE_SIZE / 4) + size; + + newstart = malloc(newsize); + if (newstart == NULL) + return (-1); + newused = + newstart + (PAGE_SIZE / 4) + size + (eb->eb_used - eb->eb_start); + + bcopy(eb->eb_used, newused, eb->eb_size); + + eb->eb_start = newstart; + eb->eb_used = newused; + eb->eb_end = newstart + newsize; + + return (0); +} + +/* + * Function adds size + ((3 * PAGE_SIZE) / 4) bytes at the back. + */ +static int +ebuf_tail_extent(struct ebuf *eb, size_t size) +{ + unsigned char *newstart; + size_t newsize; + + assert(eb != NULL && eb->eb_magic == EBUF_MAGIC); + + newsize = eb->eb_end - eb->eb_start + size + ((3 * PAGE_SIZE) / 4); + + newstart = realloc(eb->eb_start, newsize); + if (newstart == NULL) + return (-1); + + eb->eb_used = newstart + (eb->eb_used - eb->eb_start); + eb->eb_start = newstart; + eb->eb_end = newstart + newsize; + + return (0); +} diff --git a/sbin/hastd/ebuf.h b/sbin/hastd/ebuf.h new file mode 100644 index 000000000000..06275e7c9095 --- /dev/null +++ b/sbin/hastd/ebuf.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _EBUF_H_ +#define _EBUF_H_ + +#include /* size_t */ + +struct ebuf; + +struct ebuf *ebuf_alloc(size_t size); +void ebuf_free(struct ebuf *eb); + +int ebuf_add_head(struct ebuf *eb, const void *data, size_t size); +int ebuf_add_tail(struct ebuf *eb, const void *data, size_t size); + +void ebuf_del_head(struct ebuf *eb, size_t size); +void ebuf_del_tail(struct ebuf *eb, size_t size); + +void *ebuf_data(struct ebuf *eb, size_t *sizep); +size_t ebuf_size(struct ebuf *eb); + +#endif /* !_EBUF_H_ */ diff --git a/sbin/hastd/hast.conf.5 b/sbin/hastd/hast.conf.5 new file mode 100644 index 000000000000..5734ee8ef3d2 --- /dev/null +++ b/sbin/hastd/hast.conf.5 @@ -0,0 +1,267 @@ +.\" Copyright (c) 2010 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This software was developed by Pawel Jakub Dawidek under sponsorship from +.\" the FreeBSD Foundation. +.\" +.\" 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 AUTHORS 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 AUTHORS 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$ +.\" +.Dd February 1, 2010 +.Dt HAST.CONF 5 +.Os +.Sh NAME +.Nm hast.conf +.Nd configuration file for the +.Xr hastd 8 +deamon and the +.Xr hastctl 8 +utility. +.Sh DESCRIPTION +The +.Nm +file is used by both +.Xr hastd 8 +daemon +and +.Xr hastctl 8 +control utility. +Configuration file is designed in a way that exactly the same file can be +(and should be) used on both HAST nodes. +Every line starting with # is treated as comment and ignored. +.Sh CONFIGURATION FILE SYNTAX +General syntax of the +.Nm +file is following: +.Bd -literal -offset indent +# Global section +control +listen +replication + +on { + # Node section + control + listen +} + +on { + # Node section + control + listen +} + +resource { + # Resource section + replication + name + local + + on { + # Resource-node section + name + # Required + local + # Required + remote + } + on { + # Resource-node section + name + # Required + local + # Required + remote + } +} +.Ed +.Pp +Most of the various available configuration parameters are optional. +If parameter is not defined in the particular section, it will be +inherited from the parent section. +For example, if the +.Ic listen +parameter is not defined in the node section, it will be inherited from +the global section. +In case the global section does not define the +.Ic listen +parameter at all, the default value will be used. +.Sh CONFIGURATION FILE DESCRIPTION +The +.Aq node +argument can be replaced either by a full hostname as obtained by +.Xr gethostname 3 , +only first part of the hostname, or by node's UUID as found in the +.Va kern.hostuuid +.Xr sysctl 8 +variable. +.Pp +The following statements are available: +.Bl -tag -width ".Ic xxxx" +.It Ic control Aq addr +.Pp +Address for communication with +.Xr hastctl 8 . +Each of the following examples defines the same control address: +.Bd -literal -offset indent +uds:///var/run/hastctl +unix:///var/run/hastctl +/var/run/hastctl +.Ed +.Pp +The default value is +.Pa uds:///var/run/hastctl . +.It Ic listen Aq addr +.Pp +Address to listen on in form of: +.Bd -literal -offset indent +protocol://protocol-specific-address +.Ed +.Pp +Each of the following examples defines the same listen address: +.Bd -literal -offset indent +0.0.0.0 +0.0.0.0:8457 +tcp://0.0.0.0 +tcp://0.0.0.0:8457 +tcp4://0.0.0.0 +tcp4://0.0.0.0:8457 +.Ed +.Pp +The default value is +.Pa tcp4://0.0.0.0:8457 . +.It Ic replication Aq mode +.Pp +Replication mode should be one of the following: +.Bl -tag -width ".Ic xxxx" +.It Ic memsync +.Pp +Report the write operation as completed when local write completes and +when the remote node acknowledges the data receipt, but before it +actually stores the data. +The data on remote node will be stored directly after sending +acknowledgement. +This mode is intended to reduce latency, but still provides a very good +reliability. +The only situation where some small amount of data could be lost is when +the data is stored on primary node and sent to the secondary. +Secondary node then acknowledges data receipt and primary reports +success to an application. +However, it may happen that the seconderay goes down before the received +data is really stored locally. +Before secondary node returns, primary node dies entirely. +When the secondary node comes back to life it becomes the new primary. +Unfortunately some small amount of data which was confirmed to be stored +to the application was lost. +The risk of such a situation is very small, which is the reason for this +mode to be the default. +.It Ic fullsync +.Pp +Mark the write operation as completed when local as well as remote +write completes. +This is the safest and the slowest replication mode. +The +.Ic fullsync +replication mode is currently not implemented. +.It Ic async +.Pp +The write operation is reported as complete right after the local write +completes. +This is the fastest and the most dangerous replication mode. +This mode should be used when replicating to a distant node where +latency is too high for other modes. +The +.Ic async +replication mode is currently not implemented. +.El +.It Ic name Aq name +.Pp +GEOM provider name that will appear as +.Pa /dev/hast/ . +If name is not defined, resource name will be used as provider name. +.It Ic local Aq path +.Pp +Path to the local component which will be used as backend provider for +the resource. +This can be either GEOM provider or regular file. +.It Ic remote Aq addr +.Pp +Address of the remote +.Nm hastd +daemon. +Format is the same as for the +.Ic listen +statement. +When operating as a primary node this address will be used to connect to +the secondary node. +When operating as a secondary node only connections from this address +will be accepted. +.El +.Sh EXAMPLES +The example configuration file can look as follows: +.Bd -literal -offset indent +resource shared { + local /dev/da0 + + on hasta { + remote tcp4://10.0.0.2 + } + on hastb { + remote tcp4://10.0.0.1 + } +} +resource tank { + on hasta { + local /dev/mirror/tanka + remote tcp4://10.0.0.2 + } + on hastb { + local /dev/mirror/tankb + remote tcp4://10.0.0.1 + } +} +.Ed +.Sh FILES +.Bl -tag -width ".Pa /var/run/hastctl" -compact +.It Pa /etc/hast.conf +The default +.Nm +configuration file. +.It Pa /var/run/hastctl +Control socket used by the +.Xr hastctl 8 +control utility to communicate with the +.Xr hastd 8 +daemon. +.El +.Sh SEE ALSO +.Xr gethostname 3 , +.Xr geom 4 , +.Xr hastctl 8 , +.Xr hastd 8 . +.Sh AUTHORS +The +.Nm +was written by +.An Pawel Jakub Dawidek Aq pjd@FreeBSD.org +under sponsorship of the FreeBSD Foundation. diff --git a/sbin/hastd/hast.h b/sbin/hastd/hast.h new file mode 100644 index 000000000000..c5220b53be9b --- /dev/null +++ b/sbin/hastd/hast.h @@ -0,0 +1,190 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _HAST_H_ +#define _HAST_H_ + +#include +#include + +#include + +#include + +#include +#include +#include +#include + +#include + +#include "proto.h" + +#define HAST_PROTO_VERSION 0 + +#define EHAST_OK 0 +#define EHAST_NOENTRY 1 +#define EHAST_INVALID 2 +#define EHAST_NOMEMORY 3 +#define EHAST_UNIMPLEMENTED 4 + +#define HASTCTL_CMD_UNKNOWN 0 +#define HASTCTL_CMD_SETROLE 1 +#define HASTCTL_CMD_STATUS 2 + +#define HAST_ROLE_UNDEF 0 +#define HAST_ROLE_INIT 1 +#define HAST_ROLE_PRIMARY 2 +#define HAST_ROLE_SECONDARY 3 + +#define HAST_SYNCSRC_UNDEF 0 +#define HAST_SYNCSRC_PRIMARY 1 +#define HAST_SYNCSRC_SECONDARY 2 + +#define HIO_UNDEF 0 +#define HIO_READ 1 +#define HIO_WRITE 2 +#define HIO_DELETE 3 +#define HIO_FLUSH 4 + +#define HAST_CONFIG "/etc/hast.conf" +#define HAST_CONTROL "/var/run/hastctl" +#define HASTD_PORT 8457 +#define HASTD_LISTEN "tcp4://0.0.0.0:8457" +#define HASTD_PIDFILE "/var/run/hastd.pid" + +/* Default extent size. */ +#define HAST_EXTENTSIZE 2097152 +/* Default maximum number of extents that are kept dirty. */ +#define HAST_KEEPDIRTY 64 + +#define HAST_ADDRSIZE 1024 +#define HAST_TOKEN_SIZE 16 + +struct hastd_config { + /* Address to communicate with hastctl(8). */ + char hc_controladdr[HAST_ADDRSIZE]; + /* Protocol-specific data. */ + struct proto_conn *hc_controlconn; + /* Address to listen on. */ + char hc_listenaddr[HAST_ADDRSIZE]; + /* Protocol-specific data. */ + struct proto_conn *hc_listenconn; + /* List of resources. */ + TAILQ_HEAD(, hast_resource) hc_resources; +}; + +#define HAST_REPLICATION_FULLSYNC 0 +#define HAST_REPLICATION_MEMSYNC 1 +#define HAST_REPLICATION_ASYNC 2 + +/* + * Structure that describes single resource. + */ +struct hast_resource { + /* Resource name. */ + char hr_name[NAME_MAX]; + /* Replication mode (HAST_REPLICATION_*). */ + int hr_replication; + /* Provider name that will appear in /dev/hast/. */ + char hr_provname[NAME_MAX]; + /* Synchronization extent size. */ + int hr_extentsize; + /* Maximum number of extents that are kept dirty. */ + int hr_keepdirty; + + /* Path to local component. */ + char hr_localpath[PATH_MAX]; + /* Descriptor to access local component. */ + int hr_localfd; + /* Offset into local component. */ + off_t hr_localoff; + /* Size of usable space. */ + off_t hr_datasize; + /* Size of entire local provider. */ + off_t hr_local_mediasize; + /* Sector size of local provider. */ + unsigned int hr_local_sectorsize; + + /* Descriptor for /dev/ggctl communication. */ + int hr_ggatefd; + /* Unit number for ggate communication. */ + int hr_ggateunit; + + /* Address of the remote component. */ + char hr_remoteaddr[HAST_ADDRSIZE]; + /* Connection for incoming data. */ + struct proto_conn *hr_remotein; + /* Connection for outgoing data. */ + struct proto_conn *hr_remoteout; + /* Token to verify both in and out connection are coming from + the same node (not necessarily from the same address). */ + unsigned char hr_token[HAST_TOKEN_SIZE]; + + /* Resource unique identifier. */ + uint64_t hr_resuid; + /* Primary's local modification count. */ + uint64_t hr_primary_localcnt; + /* Primary's remote modification count. */ + uint64_t hr_primary_remotecnt; + /* Secondary's local modification count. */ + uint64_t hr_secondary_localcnt; + /* Secondary's remote modification count. */ + uint64_t hr_secondary_remotecnt; + /* Synchronization source. */ + uint8_t hr_syncsrc; + + /* Resource role: HAST_ROLE_{INIT,PRIMARY,SECONDARY}. */ + int hr_role; + /* Previous resource role: HAST_ROLE_{INIT,PRIMARY,SECONDARY}. */ + int hr_previous_role; + /* PID of child worker process. 0 - no child. */ + pid_t hr_workerpid; + /* Control connection between parent and child. */ + struct proto_conn *hr_ctrl; + + /* Activemap structure. */ + struct activemap *hr_amp; + /* Locked used to synchronize access to hr_amp. */ + pthread_mutex_t hr_amp_lock; + + /* Next resource. */ + TAILQ_ENTRY(hast_resource) hr_next; +}; + +struct hastd_config *yy_config_parse(const char *config); +void yy_config_free(struct hastd_config *config); + +void yyerror(const char *); +int yylex(void); +int yyparse(void); + +#endif /* !_HAST_H_ */ diff --git a/sbin/hastd/hast_proto.c b/sbin/hastd/hast_proto.c new file mode 100644 index 000000000000..6e660069ef95 --- /dev/null +++ b/sbin/hastd/hast_proto.c @@ -0,0 +1,401 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include "hast_proto.h" + +struct hast_main_header { + /* Protocol version. */ + uint8_t version; + /* Size of nv headers. */ + uint32_t size; +} __packed; + +typedef int hps_send_t(struct hast_resource *, struct nv *nv, void **, size_t *, bool *); +typedef int hps_recv_t(struct hast_resource *, struct nv *nv, void **, size_t *, bool *); + +struct hast_pipe_stage { + const char *hps_name; + hps_send_t *hps_send; + hps_recv_t *hps_recv; +}; + +static int compression_send(struct hast_resource *res, struct nv *nv, + void **datap, size_t *sizep, bool *freedatap); +static int compression_recv(struct hast_resource *res, struct nv *nv, + void **datap, size_t *sizep, bool *freedatap); +static int checksum_send(struct hast_resource *res, struct nv *nv, + void **datap, size_t *sizep, bool *freedatap); +static int checksum_recv(struct hast_resource *res, struct nv *nv, + void **datap, size_t *sizep, bool *freedatap); + +static struct hast_pipe_stage pipeline[] = { + { "compression", compression_send, compression_recv }, + { "checksum", checksum_send, checksum_recv } +}; + +static int +compression_send(struct hast_resource *res, struct nv *nv, void **datap, + size_t *sizep, bool *freedatap) +{ + unsigned char *newbuf; + + res = res; /* TODO */ + + /* + * TODO: For now we emulate compression. + * At 80% probability we succeed to compress data, which means we + * allocate new buffer, copy the data over set *freedatap to true. + */ + + if (arc4random_uniform(100) < 80) { + uint32_t *origsize; + + /* + * Compression succeeded (but we will grow by 4 bytes, not + * shrink for now). + */ + newbuf = malloc(sizeof(uint32_t) + *sizep); + if (newbuf == NULL) + return (-1); + origsize = (void *)newbuf; + *origsize = htole32((uint32_t)*sizep); + nv_add_string(nv, "null", "compression"); + if (nv_error(nv) != 0) { + free(newbuf); + errno = nv_error(nv); + return (-1); + } + bcopy(*datap, newbuf + sizeof(uint32_t), *sizep); + if (*freedatap) + free(*datap); + *freedatap = true; + *datap = newbuf; + *sizep = sizeof(uint32_t) + *sizep; + } else { + /* + * Compression failed, so we leave everything as it was. + * It is not critical for compression to succeed. + */ + } + + return (0); +} + +static int +compression_recv(struct hast_resource *res, struct nv *nv, void **datap, + size_t *sizep, bool *freedatap) +{ + unsigned char *newbuf; + const char *algo; + size_t origsize; + + res = res; /* TODO */ + + /* + * TODO: For now we emulate compression. + */ + + algo = nv_get_string(nv, "compression"); + if (algo == NULL) + return (0); /* No compression. */ + if (strcmp(algo, "null") != 0) { + pjdlog_error("Unknown compression algorithm '%s'.", algo); + return (-1); /* Unknown compression algorithm. */ + } + + origsize = le32toh(*(uint32_t *)*datap); + newbuf = malloc(origsize); + if (newbuf == NULL) + return (-1); + bcopy((unsigned char *)*datap + sizeof(uint32_t), newbuf, origsize); + if (*freedatap) + free(*datap); + *freedatap = true; + *datap = newbuf; + *sizep = origsize; + + return (0); +} + +static int +checksum_send(struct hast_resource *res, struct nv *nv, void **datap, + size_t *sizep, bool *freedatap __unused) +{ + unsigned char hash[SHA256_DIGEST_LENGTH]; + SHA256_CTX ctx; + + res = res; /* TODO */ + + SHA256_Init(&ctx); + SHA256_Update(&ctx, *datap, *sizep); + SHA256_Final(hash, &ctx); + + nv_add_string(nv, "sha256", "checksum"); + nv_add_uint8_array(nv, hash, sizeof(hash), "hash"); + + return (0); +} + +static int +checksum_recv(struct hast_resource *res, struct nv *nv, void **datap, + size_t *sizep, bool *freedatap __unused) +{ + unsigned char chash[SHA256_DIGEST_LENGTH]; + const unsigned char *rhash; + SHA256_CTX ctx; + const char *algo; + size_t size; + + res = res; /* TODO */ + + algo = nv_get_string(nv, "checksum"); + if (algo == NULL) + return (0); /* No checksum. */ + if (strcmp(algo, "sha256") != 0) { + pjdlog_error("Unknown checksum algorithm '%s'.", algo); + return (-1); /* Unknown checksum algorithm. */ + } + rhash = nv_get_uint8_array(nv, &size, "hash"); + if (rhash == NULL) { + pjdlog_error("Checksum algorithm is present, but hash is missing."); + return (-1); /* Hash not found. */ + } + if (size != sizeof(chash)) { + pjdlog_error("Invalid hash size (%zu) for %s, should be %zu.", + size, algo, sizeof(chash)); + return (-1); /* Different hash size. */ + } + + SHA256_Init(&ctx); + SHA256_Update(&ctx, *datap, *sizep); + SHA256_Final(chash, &ctx); + + if (bcmp(rhash, chash, sizeof(chash)) != 0) { + pjdlog_error("Hash mismatch."); + return (-1); /* Hash mismatch. */ + } + + return (0); +} + +/* + * Send the given nv structure via conn. + * We keep headers in nv structure and pass data in separate argument. + * There can be no data at all (data is NULL then). + */ +int +hast_proto_send(struct hast_resource *res, struct proto_conn *conn, + struct nv *nv, const void *data, size_t size) +{ + struct hast_main_header hdr; + struct ebuf *eb; + bool freedata; + void *dptr, *hptr; + size_t hsize; + int ret; + + dptr = (void *)(uintptr_t)data; + freedata = false; + ret = -1; + + if (data != NULL) { +if (false) { + unsigned int ii; + + for (ii = 0; ii < sizeof(pipeline) / sizeof(pipeline[0]); + ii++) { + ret = pipeline[ii].hps_send(res, nv, &dptr, &size, + &freedata); + if (ret == -1) + goto end; + } + ret = -1; +} + nv_add_uint32(nv, size, "size"); + if (nv_error(nv) != 0) { + errno = nv_error(nv); + goto end; + } + } + + eb = nv_hton(nv); + if (eb == NULL) + goto end; + + hdr.version = HAST_PROTO_VERSION; + hdr.size = htole32((uint32_t)ebuf_size(eb)); + if (ebuf_add_head(eb, &hdr, sizeof(hdr)) < 0) + goto end; + + hptr = ebuf_data(eb, &hsize); + if (proto_send(conn, hptr, hsize) < 0) + goto end; + if (data != NULL && proto_send(conn, dptr, size) < 0) + goto end; + + ret = 0; +end: + if (freedata) + free(dptr); + return (ret); +} + +int +hast_proto_recv_hdr(struct proto_conn *conn, struct nv **nvp) +{ + struct hast_main_header hdr; + struct nv *nv; + struct ebuf *eb; + void *hptr; + + eb = NULL; + nv = NULL; + + if (proto_recv(conn, &hdr, sizeof(hdr)) < 0) + goto fail; + + if (hdr.version != HAST_PROTO_VERSION) { + errno = ERPCMISMATCH; + goto fail; + } + + hdr.size = le32toh(hdr.size); + + eb = ebuf_alloc(hdr.size); + if (eb == NULL) + goto fail; + if (ebuf_add_tail(eb, NULL, hdr.size) < 0) + goto fail; + hptr = ebuf_data(eb, NULL); + assert(hptr != NULL); + if (proto_recv(conn, hptr, hdr.size) < 0) + goto fail; + nv = nv_ntoh(eb); + if (nv == NULL) + goto fail; + + *nvp = nv; + return (0); +fail: + if (nv != NULL) + nv_free(nv); + else if (eb != NULL) + ebuf_free(eb); + return (-1); +} + +int +hast_proto_recv_data(struct hast_resource *res, struct proto_conn *conn, + struct nv *nv, void *data, size_t size) +{ + unsigned int ii; + bool freedata; + size_t dsize; + void *dptr; + int ret; + + assert(data != NULL); + assert(size > 0); + + ret = -1; + freedata = false; + dptr = data; + + dsize = nv_get_uint32(nv, "size"); + if (dsize == 0) + (void)nv_set_error(nv, 0); + else { + if (proto_recv(conn, data, dsize) < 0) + goto end; +if (false) { + for (ii = sizeof(pipeline) / sizeof(pipeline[0]); ii > 0; + ii--) { + assert(!"to be verified"); + ret = pipeline[ii - 1].hps_recv(res, nv, &dptr, + &dsize, &freedata); + if (ret == -1) + goto end; + } + ret = -1; + if (dsize < size) + goto end; + /* TODO: 'size' doesn't seem right here. It is maximum data size. */ + if (dptr != data) + bcopy(dptr, data, dsize); +} + } + + ret = 0; +end: +if (ret < 0) printf("%s:%u %s\n", __func__, __LINE__, strerror(errno)); + if (freedata) + free(dptr); + return (ret); +} + +int +hast_proto_recv(struct hast_resource *res, struct proto_conn *conn, + struct nv **nvp, void *data, size_t size) +{ + struct nv *nv; + size_t dsize; + int ret; + + ret = hast_proto_recv_hdr(conn, &nv); + if (ret < 0) + return (ret); + dsize = nv_get_uint32(nv, "size"); + if (dsize == 0) + (void)nv_set_error(nv, 0); + else + ret = hast_proto_recv_data(res, conn, nv, data, size); + if (ret < 0) + nv_free(nv); + else + *nvp = nv; + return (ret); +} diff --git a/sbin/hastd/hast_proto.h b/sbin/hastd/hast_proto.h new file mode 100644 index 000000000000..3894e3838089 --- /dev/null +++ b/sbin/hastd/hast_proto.h @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _HAST_PROTO_H_ +#define _HAST_PROTO_H_ + +#include /* size_t */ + +#include +#include + +int hast_proto_send(struct hast_resource *res, struct proto_conn *conn, + struct nv *nv, const void *data, size_t size); +int hast_proto_recv(struct hast_resource *res, struct proto_conn *conn, + struct nv **nvp, void *data, size_t size); +int hast_proto_recv_hdr(struct proto_conn *conn, struct nv **nvp); +int hast_proto_recv_data(struct hast_resource *res, struct proto_conn *conn, + struct nv *nv, void *data, size_t size); + +#endif /* !_HAST_PROTO_H_ */ diff --git a/sbin/hastd/hastd.8 b/sbin/hastd/hastd.8 new file mode 100644 index 000000000000..276b3d301ab4 --- /dev/null +++ b/sbin/hastd/hastd.8 @@ -0,0 +1,232 @@ +.\" Copyright (c) 2010 The FreeBSD Foundation +.\" All rights reserved. +.\" +.\" This software was developed by Pawel Jakub Dawidek under sponsorship from +.\" the FreeBSD Foundation. +.\" +.\" 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 AUTHORS 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 AUTHORS 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$ +.\" +.Dd February 1, 2010 +.Dt HASTD 8 +.Os +.Sh NAME +.Nm hastd +.Nd "Highly Available Storage daemon" +.Sh SYNOPSIS +.Nm +.Op Fl dFh +.Op Fl c Ar config +.Op Fl P Ar pidfile +.Sh DESCRIPTION +The +.Nm +daemon is responsible for managing highly available GEOM providers. +.Pp +.Nm +allows to transparently store data on two physically separated machines +connected over the TCP/IP network. +Only one machine (cluster node) can actively use storage provided by +.Nm . +This machine is called primary. +The +.Nm +daemon operates on block level, which makes it transparent for file +systems and applications. +.Pp +There is one main +.Nm +daemon which starts new worker process as soon as a role for the given +resource is changed to primary or as soon as a role for the given +resource is changed to secondary and remote (primary) node will +successfully connect to it. +Every worker process gets a new process title (see +.Xr setproctitle 3 ) , +which describes its role and resource it controls. +The exact format is: +.Bd -literal -offset indent +hastd: () +.Ed +.Pp +When (and only when) +.Nm +operates in primary role for the given resource, corresponding +.Pa /dev/hast/ +disk-like device (GEOM provider) is created. +File systems and applications can use this provider to send I/O +requests to. +Every write, delete and flush operation +.Dv ( BIO_WRITE , BIO_DELETE , BIO_FLUSH ) +is send to local component and synchronously replicated +to the remote (secondary) node if it is available. +Read operations +.Dv ( BIO_READ ) +are handled locally unless I/O error occurs or local version of the data +is not up-to-date yet (synchronization is in progress). +.Pp +The +.Nm +daemon uses the GEOM Gate class to receive I/O requests from the +in-kernel GEOM infrastructure. +The +.Nm geom_gate.ko +module is loaded automatically if the kernel was not compiled with the +following option: +.Bd -ragged -offset indent +.Cd "options GEOM_GATE" +.Ed +.Pp +The connection between two +.Nm +daemons is always initiated from the one running as primary to the one +running as secondary. +When primary +.Nm +is unable to connect or connection fails, it will try to re-establish +connection every few seconds. +Once connection is established, primary +.Nm +will synchronize every extent that was modified during connection outage +to the secondary +.Nm . +.Pp +It is possible that in case of connection outage between the nodes +.Nm +primary role for the given resource will be configured on both nodes. +This in turn leads to incompatible data modifications. +Such condition is called split-brain and cannot be automatically +resolved by the +.Nm +daemon as this will lead most likely to data corruption or lost of +important changes. +Even though it cannot be fixed by +.Nm +itself, it will be detected and further connection between independently +modified nodes will not be possible. +Once this situation is manually resolved by an administrator, resource +on one of the nodes can be initialized (erasing local data), which makes +connection to the remote node possible again. +Connection of freshly initialized component will trigger full resource +synchronization. +.Pp +The +.Nm +daemon itself never picks his role up automatically. +The role has to be configured with the +.Xr hastctl 8 +control utility by additional software like +.Nm ucarp +or +.Nm heartbeat +that can reliably manage role separation and switch secondary node to +primary role in case of original primary failure. +.Pp +The +.Nm +daemon can be started with the following command line arguments: +.Bl -tag -width ".Fl P Ar pidfile" +.It Fl c Ar config +Specify alternative location of the configuration file. +The default location is +.Pa /etc/hast.conf . +.It Fl d +Print or log debugging information. +This option can be specified multiple times to raise the verbosity +level. +.It Fl F +Start the +.Nm +daemon in the foreground. +By default +.Nm +starts in the background. +.It Fl h +Print the +.Nm +usage message. +.It Fl P Ar pidfile +Specify alternative location of a file where main process PID will be +stored. +The default location is +.Pa /var/run/hastd.pid . +.El +.Sh EXIT STATUS +Exit status is 0 on success, or one of the values described in +.Xr sysexits 3 +on failure. +.Sh EXAMPLES +Launch +.Nm +on both nodes. +Set role for resource +.Nm shared +to primary on +.Nm nodeA +and to secondary on +.Nm nodeB . +Create file system on +.Pa /dev/hast/shared +provider and mount it. +.Bd -literal -offset indent +nodeB# hastd +nodeB# hastctl role secondary shared + +nodeA# hastd +nodeA# hastctl role primary shared +nodeA# newfs -U /dev/hast/shared +nodeA# mount -o noatime /dev/hast/shared /shared +.Ed +.Sh FILES +.Bl -tag -width ".Pa /var/run/hastctl" -compact +.It Pa /etc/hast.conf +The configuration file for +.Nm +and +.Xr hastctl 8 . +.It Pa /var/run/hastctl +Control socket used by the +.Xr hastctl 8 +control utility to communicate with +.Nm . +.It Pa /var/run/hastd.pid +The default location of the +.Nm +PID file. +.El +.Sh SEE ALSO +.Xr sysexits 3 , +.Xr geom 4 , +.Xr hast.conf 5 , +.Xr ggatec 8 , +.Xr ggated 8 , +.Xr ggatel 8 , +.Xr hastctl 8 , +.Xr mount 8 , +.Xr newfs 8 , +.Xr g_bio 9 . +.Sh AUTHORS +The +.Nm +was developed by +.An Pawel Jakub Dawidek Aq pjd@FreeBSD.org +under sponsorship of the FreeBSD Foundation. diff --git a/sbin/hastd/hastd.c b/sbin/hastd/hastd.c new file mode 100644 index 000000000000..19f08936c2dc --- /dev/null +++ b/sbin/hastd/hastd.c @@ -0,0 +1,522 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "control.h" +#include "hast.h" +#include "hast_proto.h" +#include "hastd.h" +#include "subr.h" + +/* Path to configuration file. */ +static const char *cfgpath = HAST_CONFIG; +/* Hastd configuration. */ +static struct hastd_config *cfg; +/* Was SIGCHLD signal received? */ +static bool sigchld_received = false; +/* Was SIGHUP signal received? */ +static bool sighup_received = false; +/* Was SIGINT or SIGTERM signal received? */ +bool sigexit_received = false; +/* PID file handle. */ +struct pidfh *pfh; + +static void +usage(void) +{ + + errx(EX_USAGE, "[-dFh] [-c config] [-P pidfile]"); +} + +static void +sighandler(int sig) +{ + + switch (sig) { + case SIGCHLD: + sigchld_received = true; + break; + case SIGHUP: + sighup_received = true; + break; + default: + assert(!"invalid condition"); + } +} + +static void +g_gate_load(void) +{ + + if (modfind("g_gate") == -1) { + /* Not present in kernel, try loading it. */ + if (kldload("geom_gate") == -1 || modfind("g_gate") == -1) { + if (errno != EEXIST) { + pjdlog_exit(EX_OSERR, + "Unable to load geom_gate module"); + } + } + } +} + +static void +child_exit(void) +{ + struct hast_resource *res; + int status; + pid_t pid; + + while ((pid = wait3(&status, WNOHANG, NULL)) > 0) { + /* Find resource related to the process that just exited. */ + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (pid == res->hr_workerpid) + break; + } + if (res == NULL) { + /* + * This can happen when new connection arrives and we + * cancel child responsible for the old one. + */ + continue; + } + pjdlog_prefix_set("[%s] (%s) ", res->hr_name, + role2str(res->hr_role)); + if (WEXITSTATUS(status) == 0) { + pjdlog_debug(1, + "Worker process exited gracefully (pid=%u).", + (unsigned int)pid); + } else { + pjdlog_error("Worker process failed (pid=%u, status=%d).", + (unsigned int)pid, WEXITSTATUS(status)); + } + res->hr_workerpid = 0; + if (res->hr_role == HAST_ROLE_PRIMARY) { + sleep(1); + pjdlog_info("Restarting worker process."); + hastd_primary(res); + } + pjdlog_prefix_set("%s", ""); + } +} + +static void +hastd_reload(void) +{ + + /* TODO */ + pjdlog_warning("Configuration reload is not implemented."); +} + +static void +listen_accept(void) +{ + struct hast_resource *res; + struct proto_conn *conn; + struct nv *nvin, *nvout, *nverr; + const char *resname; + const unsigned char *token; + char laddr[256], raddr[256]; + size_t size; + pid_t pid; + int status; + + proto_local_address(cfg->hc_listenconn, laddr, sizeof(laddr)); + pjdlog_debug(1, "Accepting connection to %s.", laddr); + + if (proto_accept(cfg->hc_listenconn, &conn) < 0) { + pjdlog_errno(LOG_ERR, "Unable to accept connection %s", laddr); + return; + } + + proto_local_address(conn, laddr, sizeof(laddr)); + proto_remote_address(conn, raddr, sizeof(raddr)); + pjdlog_info("Connection from %s to %s.", laddr, raddr); + + nvin = nvout = nverr = NULL; + + /* + * Before receiving any data see if remote host have access to any + * resource. + */ + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (proto_address_match(conn, res->hr_remoteaddr)) + break; + } + if (res == NULL) { + pjdlog_error("Client %s isn't known.", raddr); + goto close; + } + /* Ok, remote host can access at least one resource. */ + + if (hast_proto_recv_hdr(conn, &nvin) < 0) { + pjdlog_errno(LOG_ERR, "Unable to receive header from %s", + raddr); + goto close; + } + + resname = nv_get_string(nvin, "resource"); + if (resname == NULL) { + pjdlog_error("No 'resource' field in the header received from %s.", + raddr); + goto close; + } + pjdlog_debug(2, "%s: resource=%s", raddr, resname); + token = nv_get_uint8_array(nvin, &size, "token"); + /* + * NULL token means that this is first conection. + */ + if (token != NULL && size != sizeof(res->hr_token)) { + pjdlog_error("Received token of invalid size from %s (expected %zu, got %zu).", + raddr, sizeof(res->hr_token), size); + goto close; + } + + /* + * From now on we want to send errors to the remote node. + */ + nverr = nv_alloc(); + + /* Find resource related to this connection. */ + TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { + if (strcmp(resname, res->hr_name) == 0) + break; + } + /* Have we found the resource? */ + if (res == NULL) { + pjdlog_error("No resource '%s' as requested by %s.", + resname, raddr); + nv_add_stringf(nverr, "errmsg", "Resource not configured."); + goto fail; + } + + /* Now that we know resource name setup log prefix. */ + pjdlog_prefix_set("[%s] (%s) ", res->hr_name, role2str(res->hr_role)); + + /* Does the remote host have access to this resource? */ + if (!proto_address_match(conn, res->hr_remoteaddr)) { + pjdlog_error("Client %s has no access to the resource.", raddr); + nv_add_stringf(nverr, "errmsg", "No access to the resource."); + goto fail; + } + /* Is the resource marked as secondary? */ + if (res->hr_role != HAST_ROLE_SECONDARY) { + pjdlog_error("We act as %s for the resource and not as %s as requested by %s.", + role2str(res->hr_role), role2str(HAST_ROLE_SECONDARY), + raddr); + nv_add_stringf(nverr, "errmsg", + "Remote node acts as %s for the resource and not as %s.", + role2str(res->hr_role), role2str(HAST_ROLE_SECONDARY)); + goto fail; + } + /* Does token (if exists) match? */ + if (token != NULL && memcmp(token, res->hr_token, + sizeof(res->hr_token)) != 0) { + pjdlog_error("Token received from %s doesn't match.", raddr); + nv_add_stringf(nverr, "errmsg", "Toke doesn't match."); + goto fail; + } + /* + * If there is no token, but we have half-open connection + * (only remotein) or full connection (worker process is running) + * we have to cancel those and accept the new connection. + */ + if (token == NULL) { + assert(res->hr_remoteout == NULL); + pjdlog_debug(1, "Initial connection from %s.", raddr); + if (res->hr_workerpid != 0) { + assert(res->hr_remotein == NULL); + pjdlog_debug(1, + "Worker process exists (pid=%u), stopping it.", + (unsigned int)res->hr_workerpid); + /* Stop child process. */ + if (kill(res->hr_workerpid, SIGINT) < 0) { + pjdlog_errno(LOG_ERR, + "Unable to stop worker process (pid=%u)", + (unsigned int)res->hr_workerpid); + /* + * Other than logging the problem we + * ignore it - nothing smart to do. + */ + } + /* Wait for it to exit. */ + else if ((pid = waitpid(res->hr_workerpid, + &status, 0)) != res->hr_workerpid) { + pjdlog_errno(LOG_ERR, + "Waiting for worker process (pid=%u) failed", + (unsigned int)res->hr_workerpid); + /* See above. */ + } else if (status != 0) { + pjdlog_error("Worker process (pid=%u) exited ungracefully: status=%d.", + (unsigned int)res->hr_workerpid, status); + /* See above. */ + } else { + pjdlog_debug(1, + "Worker process (pid=%u) exited gracefully.", + (unsigned int)res->hr_workerpid); + } + res->hr_workerpid = 0; + } else if (res->hr_remotein != NULL) { + char oaddr[256]; + + proto_remote_address(conn, oaddr, sizeof(oaddr)); + pjdlog_debug(1, + "Canceling half-open connection from %s on connection from %s.", + oaddr, raddr); + proto_close(res->hr_remotein); + res->hr_remotein = NULL; + } + } + + /* + * Checks and cleanups are done. + */ + + if (token == NULL) { + arc4random_buf(res->hr_token, sizeof(res->hr_token)); + nvout = nv_alloc(); + nv_add_uint8_array(nvout, res->hr_token, + sizeof(res->hr_token), "token"); + if (nv_error(nvout) != 0) { + pjdlog_common(LOG_ERR, 0, nv_error(nvout), + "Unable to prepare return header for %s", raddr); + nv_add_stringf(nverr, "errmsg", + "Remote node was unable to prepare return header: %s.", + strerror(nv_error(nvout))); + goto fail; + } + if (hast_proto_send(NULL, conn, nvout, NULL, 0) < 0) { + int error = errno; + + pjdlog_errno(LOG_ERR, "Unable to send response to %s", + raddr); + nv_add_stringf(nverr, "errmsg", + "Remote node was unable to send response: %s.", + strerror(error)); + goto fail; + } + res->hr_remotein = conn; + pjdlog_debug(1, "Incoming connection from %s configured.", + raddr); + } else { + res->hr_remoteout = conn; + pjdlog_debug(1, "Outgoing connection to %s configured.", raddr); + hastd_secondary(res, nvin); + } + nv_free(nvin); + nv_free(nvout); + nv_free(nverr); + pjdlog_prefix_set("%s", ""); + return; +fail: + if (nv_error(nverr) != 0) { + pjdlog_common(LOG_ERR, 0, nv_error(nverr), + "Unable to prepare error header for %s", raddr); + goto close; + } + if (hast_proto_send(NULL, conn, nverr, NULL, 0) < 0) { + pjdlog_errno(LOG_ERR, "Unable to send error to %s", raddr); + goto close; + } +close: + if (nvin != NULL) + nv_free(nvin); + if (nvout != NULL) + nv_free(nvout); + if (nverr != NULL) + nv_free(nverr); + proto_close(conn); + pjdlog_prefix_set("%s", ""); +} + +static void +main_loop(void) +{ + fd_set rfds, wfds; + int fd, maxfd, ret; + + for (;;) { + if (sigchld_received) { + sigchld_received = false; + child_exit(); + } + if (sighup_received) { + sighup_received = false; + hastd_reload(); + } + + maxfd = 0; + FD_ZERO(&rfds); + FD_ZERO(&wfds); + + /* Setup descriptors for select(2). */ +#define SETUP_FD(conn) do { \ + fd = proto_descriptor(conn); \ + if (fd >= 0) { \ + maxfd = fd > maxfd ? fd : maxfd; \ + FD_SET(fd, &rfds); \ + FD_SET(fd, &wfds); \ + } \ +} while (0) + SETUP_FD(cfg->hc_controlconn); + SETUP_FD(cfg->hc_listenconn); +#undef SETUP_FD + + ret = select(maxfd + 1, &rfds, &wfds, NULL, NULL); + if (ret == -1) { + if (errno == EINTR) + continue; + KEEP_ERRNO((void)pidfile_remove(pfh)); + pjdlog_exit(EX_OSERR, "select() failed"); + } + +#define ISSET_FD(conn) \ + (FD_ISSET((fd = proto_descriptor(conn)), &rfds) || FD_ISSET(fd, &wfds)) + if (ISSET_FD(cfg->hc_controlconn)) + control_handle(cfg); + if (ISSET_FD(cfg->hc_listenconn)) + listen_accept(); +#undef ISSET_FD + } +} + +int +main(int argc, char *argv[]) +{ + const char *pidfile; + pid_t otherpid; + bool foreground; + int debuglevel; + + g_gate_load(); + + foreground = false; + debuglevel = 0; + pidfile = HASTD_PIDFILE; + + for (;;) { + int ch; + + ch = getopt(argc, argv, "c:dFhP:"); + if (ch == -1) + break; + switch (ch) { + case 'c': + cfgpath = optarg; + break; + case 'd': + debuglevel++; + break; + case 'F': + foreground = true; + break; + case 'P': + pidfile = optarg; + break; + case 'h': + default: + usage(); + } + } + argc -= optind; + argv += optind; + + pjdlog_debug_set(debuglevel); + + pfh = pidfile_open(pidfile, 0600, &otherpid); + if (pfh == NULL) { + if (errno == EEXIST) { + pjdlog_exitx(EX_TEMPFAIL, + "Another hastd is already running, pid: %jd.", + (intmax_t)otherpid); + } + /* If we cannot create pidfile from other reasons, only warn. */ + pjdlog_errno(LOG_WARNING, "Cannot open or create pidfile"); + } + + cfg = yy_config_parse(cfgpath); + assert(cfg != NULL); + + signal(SIGHUP, sighandler); + signal(SIGCHLD, sighandler); + + /* Listen on control address. */ + if (proto_server(cfg->hc_controladdr, &cfg->hc_controlconn) < 0) { + KEEP_ERRNO((void)pidfile_remove(pfh)); + pjdlog_exit(EX_OSERR, "Unable to listen on control address %s", + cfg->hc_controladdr); + } + /* Listen for remote connections. */ + if (proto_server(cfg->hc_listenaddr, &cfg->hc_listenconn) < 0) { + KEEP_ERRNO((void)pidfile_remove(pfh)); + pjdlog_exit(EX_OSERR, "Unable to listen on address %s", + cfg->hc_listenaddr); + } + + if (!foreground) { + if (daemon(0, 0) < 0) { + KEEP_ERRNO((void)pidfile_remove(pfh)); + pjdlog_exit(EX_OSERR, "Unable to daemonize"); + } + + /* Start logging to syslog. */ + pjdlog_mode_set(PJDLOG_MODE_SYSLOG); + + /* Write PID to a file. */ + if (pidfile_write(pfh) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to write PID to a file"); + } + } + + main_loop(); + + exit(0); +} diff --git a/sbin/hastd/hastd.h b/sbin/hastd/hastd.h new file mode 100644 index 000000000000..199de8c94d5c --- /dev/null +++ b/sbin/hastd/hastd.h @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _HASTD_H_ +#define _HASTD_H_ + +#include +#include + +#include + +#include "hast.h" + +extern bool sigexit_received; +extern struct pidfh *pfh; + +void hastd_primary(struct hast_resource *res); +void hastd_secondary(struct hast_resource *res, struct nv *nvin); + +#endif /* !_HASTD_H_ */ diff --git a/sbin/hastd/hooks.c b/sbin/hastd/hooks.c new file mode 100644 index 000000000000..1fdeb7500859 --- /dev/null +++ b/sbin/hastd/hooks.c @@ -0,0 +1,148 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "hooks.h" + +static void +descriptors(void) +{ + long maxfd; + int fd; + + /* + * Close all descriptors. + */ + maxfd = sysconf(_SC_OPEN_MAX); + if (maxfd < 0) { + pjdlog_errno(LOG_WARNING, "sysconf(_SC_OPEN_MAX) failed"); + maxfd = 1024; + } + for (fd = 0; fd <= maxfd; fd++) + close(fd); + /* + * Redirect stdin, stdout and stderr to /dev/null. + */ + fd = open(_PATH_DEVNULL, O_RDONLY); + if (fd < 0) { + pjdlog_errno(LOG_WARNING, "Unable to open %s for reading", + _PATH_DEVNULL); + } else if (fd != STDIN_FILENO) { + if (dup2(fd, STDIN_FILENO) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to duplicate descriptor for stdin"); + } + close(fd); + } + fd = open(_PATH_DEVNULL, O_WRONLY); + if (fd < 0) { + pjdlog_errno(LOG_WARNING, "Unable to open %s for writing", + _PATH_DEVNULL); + } else { + if (fd != STDOUT_FILENO && dup2(fd, STDOUT_FILENO) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to duplicate descriptor for stdout"); + } + if (fd != STDERR_FILENO && dup2(fd, STDERR_FILENO) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to duplicate descriptor for stderr"); + } + if (fd != STDOUT_FILENO && fd != STDERR_FILENO) + close(fd); + } +} + +int +hook_exec(const char *path, ...) +{ + va_list ap; + int ret; + + va_start(ap, path); + ret = hook_execv(path, ap); + va_end(ap); + return (ret); +} + +int +hook_execv(const char *path, va_list ap) +{ + char *args[64]; + unsigned int ii; + pid_t pid, wpid; + int status; + + if (path == NULL || path[0] == '\0') + return (0); + + memset(args, 0, sizeof(args)); + args[0] = basename(path); + for (ii = 1; ii < sizeof(args) / sizeof(args[0]); ii++) { + args[ii] = va_arg(ap, char *); + if (args[ii] == NULL) + break; + } + assert(ii < sizeof(args) / sizeof(args[0])); + + pid = fork(); + switch (pid) { + case -1: /* Error. */ + pjdlog_errno(LOG_ERR, "Unable to fork %s", path); + return (-1); + case 0: /* Child. */ + descriptors(); + execv(path, args); + pjdlog_errno(LOG_ERR, "Unable to execute %s", path); + exit(EX_SOFTWARE); + default: /* Parent. */ + break; + } + + wpid = waitpid(pid, &status, 0); + assert(wpid == pid); + + return (WEXITSTATUS(status)); +} diff --git a/sbin/hastd/hooks.h b/sbin/hastd/hooks.h new file mode 100644 index 000000000000..799b781d319f --- /dev/null +++ b/sbin/hastd/hooks.h @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _HOOKS_H_ +#define _HOOKS_H_ + +#include + +int hook_exec(const char *path, ...); +int hook_execv(const char *path, va_list ap); + +#endif /* !_HOOKS_H_ */ diff --git a/sbin/hastd/metadata.c b/sbin/hastd/metadata.c new file mode 100644 index 000000000000..9bca66bbbe16 --- /dev/null +++ b/sbin/hastd/metadata.c @@ -0,0 +1,222 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "metadata.h" + +int +metadata_read(struct hast_resource *res, bool openrw) +{ + unsigned char *buf; + struct ebuf *eb; + struct nv *nv; + ssize_t done; + const char *str; + int rerrno; + bool opened_here; + + opened_here = false; + rerrno = 0; + + /* + * Is this first metadata_read() call for this resource? + */ + if (res->hr_localfd == -1) { + if (provinfo(res, openrw) < 0) { + rerrno = errno; + goto fail; + } + opened_here = true; + pjdlog_debug(1, "Obtained info about %s.", res->hr_localpath); + if (openrw) { + if (flock(res->hr_localfd, LOCK_EX | LOCK_NB) < 0) { + rerrno = errno; + if (errno == EOPNOTSUPP) { + pjdlog_warning("Unable to lock %s (operation not supported), but continuing.", + res->hr_localpath); + } else { + pjdlog_errno(LOG_ERR, + "Unable to lock %s", + res->hr_localpath); + goto fail; + } + } + pjdlog_debug(1, "Locked %s.", res->hr_localpath); + } + } + + eb = ebuf_alloc(METADATA_SIZE); + if (eb == NULL) { + rerrno = errno; + pjdlog_errno(LOG_ERR, + "Unable to allocate memory to read metadata"); + goto fail; + } + if (ebuf_add_tail(eb, NULL, METADATA_SIZE) < 0) { + rerrno = errno; + pjdlog_errno(LOG_ERR, + "Unable to allocate memory to read metadata"); + goto fail; + } + buf = ebuf_data(eb, NULL); + assert(buf != NULL); + done = pread(res->hr_localfd, buf, METADATA_SIZE, 0); + if (done < 0 || done != METADATA_SIZE) { + rerrno = errno; + pjdlog_errno(LOG_ERR, "Unable to read metadata"); + ebuf_free(eb); + goto fail; + } + nv = nv_ntoh(eb); + if (nv == NULL) { + rerrno = errno; + pjdlog_errno(LOG_ERR, "Metadata read from %s is invalid", + res->hr_localpath); + ebuf_free(eb); + goto fail; + } + + str = nv_get_string(nv, "resource"); + if (strcmp(str, res->hr_name) != 0) { + pjdlog_error("Provider %s is not part of resource %s.", + res->hr_localpath, res->hr_name); + nv_free(nv); + goto fail; + } + + res->hr_datasize = nv_get_uint64(nv, "datasize"); + res->hr_extentsize = (int)nv_get_uint32(nv, "extentsize"); + res->hr_keepdirty = (int)nv_get_uint32(nv, "keepdirty"); + res->hr_localoff = nv_get_uint64(nv, "offset"); + res->hr_resuid = nv_get_uint64(nv, "resuid"); + if (res->hr_role != HAST_ROLE_PRIMARY) { + /* Secondary or init role. */ + res->hr_secondary_localcnt = nv_get_uint64(nv, "localcnt"); + res->hr_secondary_remotecnt = nv_get_uint64(nv, "remotecnt"); + } + if (res->hr_role != HAST_ROLE_SECONDARY) { + /* Primary or init role. */ + res->hr_primary_localcnt = nv_get_uint64(nv, "localcnt"); + res->hr_primary_remotecnt = nv_get_uint64(nv, "remotecnt"); + } + str = nv_get_string(nv, "prevrole"); + if (str != NULL) { + if (strcmp(str, "primary") == 0) + res->hr_previous_role = HAST_ROLE_PRIMARY; + else if (strcmp(str, "secondary") == 0) + res->hr_previous_role = HAST_ROLE_SECONDARY; + } + + if (nv_error(nv) != 0) { + errno = rerrno = nv_error(nv); + pjdlog_errno(LOG_ERR, "Unable to read metadata from %s", + res->hr_localpath); + nv_free(nv); + goto fail; + } + return (0); +fail: + if (opened_here) { + close(res->hr_localfd); + res->hr_localfd = -1; + } + errno = rerrno; + return (-1); +} + +int +metadata_write(struct hast_resource *res) +{ + struct ebuf *eb; + struct nv *nv; + unsigned char *buf, *ptr; + size_t size; + ssize_t done; + + buf = calloc(1, METADATA_SIZE); + if (buf == NULL) { + pjdlog_error("Unable to allocate %zu bytes for metadata.", + (size_t)METADATA_SIZE); + return (-1); + } + + nv = nv_alloc(); + nv_add_string(nv, res->hr_name, "resource"); + nv_add_uint64(nv, (uint64_t)res->hr_datasize, "datasize"); + nv_add_uint32(nv, (uint32_t)res->hr_extentsize, "extentsize"); + nv_add_uint32(nv, (uint32_t)res->hr_keepdirty, "keepdirty"); + nv_add_uint64(nv, (uint64_t)res->hr_localoff, "offset"); + nv_add_uint64(nv, res->hr_resuid, "resuid"); + if (res->hr_role == HAST_ROLE_PRIMARY || + res->hr_role == HAST_ROLE_INIT) { + nv_add_uint64(nv, res->hr_primary_localcnt, "localcnt"); + nv_add_uint64(nv, res->hr_primary_remotecnt, "remotecnt"); + } else /* if (res->hr_role == HAST_ROLE_SECONDARY) */ { + assert(res->hr_role == HAST_ROLE_SECONDARY); + nv_add_uint64(nv, res->hr_secondary_localcnt, "localcnt"); + nv_add_uint64(nv, res->hr_secondary_remotecnt, "remotecnt"); + } + nv_add_string(nv, role2str(res->hr_role), "prevrole"); + if (nv_error(nv) != 0) { + pjdlog_error("Unable to create metadata."); + goto fail; + } + res->hr_previous_role = res->hr_role; + eb = nv_hton(nv); + assert(eb != NULL); + ptr = ebuf_data(eb, &size); + assert(ptr != NULL); + assert(size < METADATA_SIZE); + bcopy(ptr, buf, size); + done = pwrite(res->hr_localfd, buf, METADATA_SIZE, 0); + if (done < 0 || done != METADATA_SIZE) { + pjdlog_errno(LOG_ERR, "Unable to write metadata"); + goto fail; + } + + return (0); +fail: + free(buf); + nv_free(nv); + return (-1); +} diff --git a/sbin/hastd/metadata.h b/sbin/hastd/metadata.h new file mode 100644 index 000000000000..83d35f4c2f23 --- /dev/null +++ b/sbin/hastd/metadata.h @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _METADATA_H_ +#define _METADATA_H_ + +#include + +#include + +/* + * Maximum size of metadata. + * XXX: We should take sector size into account. + */ +#define METADATA_SIZE 4096 + +int metadata_read(struct hast_resource *res, bool openrw); +int metadata_write(struct hast_resource *res); + +#endif /* !_METADATA_H_ */ diff --git a/sbin/hastd/nv.c b/sbin/hastd/nv.c new file mode 100644 index 000000000000..0b4e362c9e44 --- /dev/null +++ b/sbin/hastd/nv.c @@ -0,0 +1,882 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define NV_MAGIC 0xaea1e +struct nv { + int nv_magic; + int nv_error; + struct ebuf *nv_ebuf; +}; + +struct nvhdr { + uint8_t nvh_type; + uint8_t nvh_namesize; + uint32_t nvh_dsize; + char nvh_name[0]; +} __packed; +#define NVH_DATA(nvh) ((unsigned char *)nvh + NVH_HSIZE(nvh)) +#define NVH_HSIZE(nvh) \ + (sizeof(struct nvhdr) + roundup2((nvh)->nvh_namesize, 8)) +#define NVH_DSIZE(nvh) \ + (((nvh)->nvh_type & NV_ORDER_MASK) == NV_ORDER_HOST ? \ + (nvh)->nvh_dsize : \ + le32toh((nvh)->nvh_dsize)) +#define NVH_SIZE(nvh) (NVH_HSIZE(nvh) + roundup2(NVH_DSIZE(nvh), 8)) + +#define NV_CHECK(nv) do { \ + assert((nv) != NULL); \ + assert((nv)->nv_magic == NV_MAGIC); \ +} while (0) + +static void nv_add(struct nv *nv, const unsigned char *value, size_t vsize, + int type, const char *name); +static void nv_addv(struct nv *nv, const unsigned char *value, size_t vsize, + int type, const char *namefmt, va_list nameap); +static struct nvhdr *nv_find(struct nv *nv, int type, const char *namefmt, + va_list nameap); +static void nv_swap(struct nvhdr *nvh, bool tohost); + +/* + * Allocate and initialize new nv structure. + * Return NULL in case of malloc(3) failure. + */ +struct nv * +nv_alloc(void) +{ + struct nv *nv; + + nv = malloc(sizeof(*nv)); + if (nv == NULL) + return (NULL); + nv->nv_ebuf = ebuf_alloc(0); + if (nv->nv_ebuf == NULL) { + free(nv); + return (NULL); + } + nv->nv_error = 0; + nv->nv_magic = NV_MAGIC; + return (nv); +} + +/* + * Free the given nv structure. + */ +void +nv_free(struct nv *nv) +{ + + if (nv == NULL) + return; + + NV_CHECK(nv); + + nv->nv_magic = 0; + ebuf_free(nv->nv_ebuf); + free(nv); +} + +/* + * Return error for the given nv structure. + */ +int +nv_error(const struct nv *nv) +{ + + if (nv == NULL) + return (ENOMEM); + + NV_CHECK(nv); + + return (nv->nv_error); +} + +/* + * Set error for the given nv structure and return previous error. + */ +int +nv_set_error(struct nv *nv, int error) +{ + int preverr; + + if (nv == NULL) + return (ENOMEM); + + NV_CHECK(nv); + + preverr = nv->nv_error; + nv->nv_error = error; + return (preverr); +} + +/* + * Validate correctness of the entire nv structure and all its elements. + * If extrap is not NULL, store number of extra bytes at the end of the buffer. + */ +int +nv_validate(struct nv *nv, size_t *extrap) +{ + struct nvhdr *nvh; + unsigned char *data, *ptr; + size_t dsize, size, vsize; + int error; + + if (nv == NULL) { + errno = ENOMEM; + return (-1); + } + + NV_CHECK(nv); + assert(nv->nv_error == 0); + + /* TODO: Check that names are unique? */ + + error = 0; + ptr = ebuf_data(nv->nv_ebuf, &size); + while (size > 0) { + /* + * Zeros at the end of the buffer are acceptable. + */ + if (ptr[0] == '\0') + break; + /* + * Minimum size at this point is size of nvhdr structure, one + * character long name plus terminating '\0'. + */ + if (size < sizeof(*nvh) + 2) { + error = EINVAL; + break; + } + nvh = (struct nvhdr *)ptr; + if (size < NVH_HSIZE(nvh)) { + error = EINVAL; + break; + } + if (nvh->nvh_name[nvh->nvh_namesize - 1] != '\0') { + error = EINVAL; + break; + } + if (strlen(nvh->nvh_name) != + (size_t)(nvh->nvh_namesize - 1)) { + error = EINVAL; + break; + } + if ((nvh->nvh_type & NV_TYPE_MASK) < NV_TYPE_FIRST || + (nvh->nvh_type & NV_TYPE_MASK) > NV_TYPE_LAST) { + error = EINVAL; + break; + } + dsize = NVH_DSIZE(nvh); + if (dsize == 0) { + error = EINVAL; + break; + } + if (size < NVH_SIZE(nvh)) { + error = EINVAL; + break; + } + vsize = 0; + switch (nvh->nvh_type & NV_TYPE_MASK) { + case NV_TYPE_INT8: + case NV_TYPE_UINT8: + if (vsize == 0) + vsize = 1; + /* FALLTHOUGH */ + case NV_TYPE_INT16: + case NV_TYPE_UINT16: + if (vsize == 0) + vsize = 2; + /* FALLTHOUGH */ + case NV_TYPE_INT32: + case NV_TYPE_UINT32: + if (vsize == 0) + vsize = 4; + /* FALLTHOUGH */ + case NV_TYPE_INT64: + case NV_TYPE_UINT64: + if (vsize == 0) + vsize = 8; + if (dsize != vsize) { + error = EINVAL; + break; + } + break; + case NV_TYPE_INT8_ARRAY: + case NV_TYPE_UINT8_ARRAY: + break; + case NV_TYPE_INT16_ARRAY: + case NV_TYPE_UINT16_ARRAY: + if (vsize == 0) + vsize = 2; + /* FALLTHOUGH */ + case NV_TYPE_INT32_ARRAY: + case NV_TYPE_UINT32_ARRAY: + if (vsize == 0) + vsize = 4; + /* FALLTHOUGH */ + case NV_TYPE_INT64_ARRAY: + case NV_TYPE_UINT64_ARRAY: + if (vsize == 0) + vsize = 8; + if ((dsize % vsize) != 0) { + error = EINVAL; + break; + } + break; + case NV_TYPE_STRING: + data = NVH_DATA(nvh); + if (data[dsize - 1] != '\0') { + error = EINVAL; + break; + } + if (strlen((char *)data) != dsize - 1) { + error = EINVAL; + break; + } + break; + default: + assert(!"invalid condition"); + } + if (error != 0) + break; + ptr += NVH_SIZE(nvh); + size -= NVH_SIZE(nvh); + } + if (error != 0) { + errno = error; + if (nv->nv_error == 0) + nv->nv_error = error; + return (-1); + } + if (extrap != NULL) + *extrap = size; + return (0); +} + +/* + * Convert the given nv structure to network byte order and return ebuf + * structure. + */ +struct ebuf * +nv_hton(struct nv *nv) +{ + struct nvhdr *nvh; + unsigned char *ptr; + size_t size; + + NV_CHECK(nv); + assert(nv->nv_error == 0); + + ptr = ebuf_data(nv->nv_ebuf, &size); + while (size > 0) { + /* + * Minimum size at this point is size of nvhdr structure, + * one character long name plus terminating '\0'. + */ + assert(size >= sizeof(*nvh) + 2); + nvh = (struct nvhdr *)ptr; + assert(NVH_SIZE(nvh) <= size); + nv_swap(nvh, false); + ptr += NVH_SIZE(nvh); + size -= NVH_SIZE(nvh); + } + + return (nv->nv_ebuf); +} + +/* + * Create nv structure based on ebuf received from the network. + */ +struct nv * +nv_ntoh(struct ebuf *eb) +{ + struct nv *nv; + size_t extra; + int rerrno; + + assert(eb != NULL); + + nv = malloc(sizeof(*nv)); + if (nv == NULL) + return (NULL); + nv->nv_error = 0; + nv->nv_ebuf = eb; + nv->nv_magic = NV_MAGIC; + + if (nv_validate(nv, &extra) < 0) { + rerrno = errno; + nv->nv_magic = 0; + free(nv); + errno = rerrno; + return (NULL); + } + /* + * Remove extra zeros at the end of the buffer. + */ + ebuf_del_tail(eb, extra); + + return (nv); +} + +#define NV_DEFINE_ADD(type, TYPE) \ +void \ +nv_add_##type(struct nv *nv, type##_t value, const char *namefmt, ...) \ +{ \ + va_list nameap; \ + \ + va_start(nameap, namefmt); \ + nv_addv(nv, (unsigned char *)&value, sizeof(value), \ + NV_TYPE_##TYPE, namefmt, nameap); \ + va_end(nameap); \ +} + +NV_DEFINE_ADD(int8, INT8) +NV_DEFINE_ADD(uint8, UINT8) +NV_DEFINE_ADD(int16, INT16) +NV_DEFINE_ADD(uint16, UINT16) +NV_DEFINE_ADD(int32, INT32) +NV_DEFINE_ADD(uint32, UINT32) +NV_DEFINE_ADD(int64, INT64) +NV_DEFINE_ADD(uint64, UINT64) + +#undef NV_DEFINE_ADD + +#define NV_DEFINE_ADD_ARRAY(type, TYPE) \ +void \ +nv_add_##type##_array(struct nv *nv, const type##_t *value, \ + size_t nsize, const char *namefmt, ...) \ +{ \ + va_list nameap; \ + \ + va_start(nameap, namefmt); \ + nv_addv(nv, (const unsigned char *)value, \ + sizeof(value[0]) * nsize, NV_TYPE_##TYPE##_ARRAY, namefmt, \ + nameap); \ + va_end(nameap); \ +} + +NV_DEFINE_ADD_ARRAY(int8, INT8) +NV_DEFINE_ADD_ARRAY(uint8, UINT8) +NV_DEFINE_ADD_ARRAY(int16, INT16) +NV_DEFINE_ADD_ARRAY(uint16, UINT16) +NV_DEFINE_ADD_ARRAY(int32, INT32) +NV_DEFINE_ADD_ARRAY(uint32, UINT32) +NV_DEFINE_ADD_ARRAY(int64, INT64) +NV_DEFINE_ADD_ARRAY(uint64, UINT64) + +#undef NV_DEFINE_ADD_ARRAY + +void +nv_add_string(struct nv *nv, const char *value, const char *namefmt, ...) +{ + va_list nameap; + size_t size; + + size = strlen(value) + 1; + + va_start(nameap, namefmt); + nv_addv(nv, (const unsigned char *)value, size, NV_TYPE_STRING, + namefmt, nameap); + va_end(nameap); +} + +void +nv_add_stringf(struct nv *nv, const char *name, const char *valuefmt, ...) +{ + va_list valueap; + + va_start(valueap, valuefmt); + nv_add_stringv(nv, name, valuefmt, valueap); + va_end(valueap); +} + +void +nv_add_stringv(struct nv *nv, const char *name, const char *valuefmt, + va_list valueap) +{ + char *value; + ssize_t size; + + size = vasprintf(&value, valuefmt, valueap); + if (size < 0) { + if (nv->nv_error == 0) + nv->nv_error = ENOMEM; + return; + } + size++; + nv_add(nv, (const unsigned char *)value, size, NV_TYPE_STRING, name); + free(value); +} + +#define NV_DEFINE_GET(type, TYPE) \ +type##_t \ +nv_get_##type(struct nv *nv, const char *namefmt, ...) \ +{ \ + struct nvhdr *nvh; \ + va_list nameap; \ + type##_t value; \ + \ + va_start(nameap, namefmt); \ + nvh = nv_find(nv, NV_TYPE_##TYPE, namefmt, nameap); \ + va_end(nameap); \ + if (nvh == NULL) \ + return (0); \ + assert((nvh->nvh_type & NV_ORDER_MASK) == NV_ORDER_HOST); \ + assert(sizeof(value) == nvh->nvh_dsize); \ + bcopy(NVH_DATA(nvh), &value, sizeof(value)); \ + \ + return (value); \ +} + +NV_DEFINE_GET(int8, INT8) +NV_DEFINE_GET(uint8, UINT8) +NV_DEFINE_GET(int16, INT16) +NV_DEFINE_GET(uint16, UINT16) +NV_DEFINE_GET(int32, INT32) +NV_DEFINE_GET(uint32, UINT32) +NV_DEFINE_GET(int64, INT64) +NV_DEFINE_GET(uint64, UINT64) + +#undef NV_DEFINE_GET + +#define NV_DEFINE_GET_ARRAY(type, TYPE) \ +const type##_t * \ +nv_get_##type##_array(struct nv *nv, size_t *sizep, \ + const char *namefmt, ...) \ +{ \ + struct nvhdr *nvh; \ + va_list nameap; \ + \ + va_start(nameap, namefmt); \ + nvh = nv_find(nv, NV_TYPE_##TYPE##_ARRAY, namefmt, nameap); \ + va_end(nameap); \ + if (nvh == NULL) \ + return (NULL); \ + assert((nvh->nvh_type & NV_ORDER_MASK) == NV_ORDER_HOST); \ + assert((nvh->nvh_dsize % sizeof(type##_t)) == 0); \ + if (sizep != NULL) \ + *sizep = nvh->nvh_dsize / sizeof(type##_t); \ + return ((type##_t *)(void *)NVH_DATA(nvh)); \ +} + +NV_DEFINE_GET_ARRAY(int8, INT8) +NV_DEFINE_GET_ARRAY(uint8, UINT8) +NV_DEFINE_GET_ARRAY(int16, INT16) +NV_DEFINE_GET_ARRAY(uint16, UINT16) +NV_DEFINE_GET_ARRAY(int32, INT32) +NV_DEFINE_GET_ARRAY(uint32, UINT32) +NV_DEFINE_GET_ARRAY(int64, INT64) +NV_DEFINE_GET_ARRAY(uint64, UINT64) + +#undef NV_DEFINE_GET_ARRAY + +const char * +nv_get_string(struct nv *nv, const char *namefmt, ...) +{ + struct nvhdr *nvh; + va_list nameap; + char *str; + + va_start(nameap, namefmt); + nvh = nv_find(nv, NV_TYPE_STRING, namefmt, nameap); + va_end(nameap); + if (nvh == NULL) + return (NULL); + assert((nvh->nvh_type & NV_ORDER_MASK) == NV_ORDER_HOST); + assert(nvh->nvh_dsize >= 1); + str = NVH_DATA(nvh); + assert(str[nvh->nvh_dsize - 1] == '\0'); + assert(strlen(str) == nvh->nvh_dsize - 1); + return (str); +} + +/* + * Dump content of the nv structure. + */ +void +nv_dump(struct nv *nv) +{ + struct nvhdr *nvh; + unsigned char *data, *ptr; + size_t dsize, size; + unsigned int ii; + bool swap; + + if (nv_validate(nv, NULL) < 0) { + printf("error: %d\n", errno); + return; + } + + NV_CHECK(nv); + assert(nv->nv_error == 0); + + ptr = ebuf_data(nv->nv_ebuf, &size); + while (size > 0) { + assert(size >= sizeof(*nvh) + 2); + nvh = (struct nvhdr *)ptr; + assert(size >= NVH_SIZE(nvh)); + swap = ((nvh->nvh_type & NV_ORDER_MASK) == NV_ORDER_NETWORK); + dsize = NVH_DSIZE(nvh); + data = NVH_DATA(nvh); + printf(" %s", nvh->nvh_name); + switch (nvh->nvh_type & NV_TYPE_MASK) { + case NV_TYPE_INT8: + printf("(int8): %jd", (intmax_t)(*(int8_t *)data)); + break; + case NV_TYPE_UINT8: + printf("(uint8): %ju", (uintmax_t)(*(uint8_t *)data)); + break; + case NV_TYPE_INT16: + printf("(int16): %jd", swap ? + (intmax_t)le16toh(*(int16_t *)(void *)data) : + (intmax_t)*(int16_t *)(void *)data); + break; + case NV_TYPE_UINT16: + printf("(uint16): %ju", swap ? + (uintmax_t)le16toh(*(uint16_t *)(void *)data) : + (uintmax_t)*(uint16_t *)(void *)data); + break; + case NV_TYPE_INT32: + printf("(int32): %jd", swap ? + (intmax_t)le32toh(*(int32_t *)(void *)data) : + (intmax_t)*(int32_t *)(void *)data); + break; + case NV_TYPE_UINT32: + printf("(uint32): %ju", swap ? + (uintmax_t)le32toh(*(uint32_t *)(void *)data) : + (uintmax_t)*(uint32_t *)(void *)data); + break; + case NV_TYPE_INT64: + printf("(int64): %jd", swap ? + (intmax_t)le64toh(*(int64_t *)(void *)data) : + (intmax_t)*(int64_t *)(void *)data); + break; + case NV_TYPE_UINT64: + printf("(uint64): %ju", swap ? + (uintmax_t)le64toh(*(uint64_t *)(void *)data) : + (uintmax_t)*(uint64_t *)(void *)data); + break; + case NV_TYPE_INT8_ARRAY: + printf("(int8 array):"); + for (ii = 0; ii < dsize; ii++) + printf(" %jd", (intmax_t)((int8_t *)data)[ii]); + break; + case NV_TYPE_UINT8_ARRAY: + printf("(uint8 array):"); + for (ii = 0; ii < dsize; ii++) + printf(" %ju", (uintmax_t)((uint8_t *)data)[ii]); + break; + case NV_TYPE_INT16_ARRAY: + printf("(int16 array):"); + for (ii = 0; ii < dsize / 2; ii++) { + printf(" %jd", swap ? + (intmax_t)le16toh(((int16_t *)(void *)data)[ii]) : + (intmax_t)((int16_t *)(void *)data)[ii]); + } + break; + case NV_TYPE_UINT16_ARRAY: + printf("(uint16 array):"); + for (ii = 0; ii < dsize / 2; ii++) { + printf(" %ju", swap ? + (uintmax_t)le16toh(((uint16_t *)(void *)data)[ii]) : + (uintmax_t)((uint16_t *)(void *)data)[ii]); + } + break; + case NV_TYPE_INT32_ARRAY: + printf("(int32 array):"); + for (ii = 0; ii < dsize / 4; ii++) { + printf(" %jd", swap ? + (intmax_t)le32toh(((int32_t *)(void *)data)[ii]) : + (intmax_t)((int32_t *)(void *)data)[ii]); + } + break; + case NV_TYPE_UINT32_ARRAY: + printf("(uint32 array):"); + for (ii = 0; ii < dsize / 4; ii++) { + printf(" %ju", swap ? + (uintmax_t)le32toh(((uint32_t *)(void *)data)[ii]) : + (uintmax_t)((uint32_t *)(void *)data)[ii]); + } + break; + case NV_TYPE_INT64_ARRAY: + printf("(int64 array):"); + for (ii = 0; ii < dsize / 8; ii++) { + printf(" %ju", swap ? + (uintmax_t)le64toh(((uint64_t *)(void *)data)[ii]) : + (uintmax_t)((uint64_t *)(void *)data)[ii]); + } + break; + case NV_TYPE_UINT64_ARRAY: + printf("(uint64 array):"); + for (ii = 0; ii < dsize / 8; ii++) { + printf(" %ju", swap ? + (uintmax_t)le64toh(((uint64_t *)(void *)data)[ii]) : + (uintmax_t)((uint64_t *)(void *)data)[ii]); + } + break; + case NV_TYPE_STRING: + printf("(string): %s", (char *)data); + break; + default: + assert(!"invalid condition"); + } + printf("\n"); + ptr += NVH_SIZE(nvh); + size -= NVH_SIZE(nvh); + } +} + +/* + * Local routines below. + */ + +static void +nv_add(struct nv *nv, const unsigned char *value, size_t vsize, int type, + const char *name) +{ + static unsigned char align[7]; + struct nvhdr *nvh; + size_t namesize; + + if (nv == NULL) { + errno = ENOMEM; + return; + } + + NV_CHECK(nv); + + namesize = strlen(name) + 1; + + nvh = malloc(sizeof(*nvh) + roundup2(namesize, 8)); + if (nvh == NULL) { + if (nv->nv_error == 0) + nv->nv_error = ENOMEM; + return; + } + nvh->nvh_type = NV_ORDER_HOST | type; + nvh->nvh_namesize = (uint8_t)namesize; + nvh->nvh_dsize = (uint32_t)vsize; + bcopy(name, nvh->nvh_name, namesize); + + /* Add header first. */ + if (ebuf_add_tail(nv->nv_ebuf, nvh, NVH_HSIZE(nvh)) < 0) { + assert(errno != 0); + if (nv->nv_error == 0) + nv->nv_error = errno; + return; + } + /* Add the actual data. */ + if (ebuf_add_tail(nv->nv_ebuf, value, vsize) < 0) { + assert(errno != 0); + if (nv->nv_error == 0) + nv->nv_error = errno; + return; + } + /* Align the data (if needed). */ + vsize = roundup2(vsize, 8) - vsize; + if (vsize == 0) + return; + assert(vsize > 0 && vsize <= sizeof(align)); + if (ebuf_add_tail(nv->nv_ebuf, align, vsize) < 0) { + assert(errno != 0); + if (nv->nv_error == 0) + nv->nv_error = errno; + return; + } +} + +static void +nv_addv(struct nv *nv, const unsigned char *value, size_t vsize, int type, + const char *namefmt, va_list nameap) +{ + char name[255]; + size_t namesize; + + namesize = vsnprintf(name, sizeof(name), namefmt, nameap); + assert(namesize > 0 && namesize < sizeof(name)); + + nv_add(nv, value, vsize, type, name); +} + +static struct nvhdr * +nv_find(struct nv *nv, int type, const char *namefmt, va_list nameap) +{ + char name[255]; + struct nvhdr *nvh; + unsigned char *ptr; + size_t size, namesize; + + if (nv == NULL) { + errno = ENOMEM; + return (NULL); + } + + NV_CHECK(nv); + + namesize = vsnprintf(name, sizeof(name), namefmt, nameap); + assert(namesize > 0 && namesize < sizeof(name)); + namesize++; + + ptr = ebuf_data(nv->nv_ebuf, &size); + while (size > 0) { + assert(size >= sizeof(*nvh) + 2); + nvh = (struct nvhdr *)ptr; + assert(size >= NVH_SIZE(nvh)); + nv_swap(nvh, true); + if (strcmp(nvh->nvh_name, name) == 0) { + if ((nvh->nvh_type & NV_TYPE_MASK) != type) { + errno = EINVAL; + if (nv->nv_error == 0) + nv->nv_error = EINVAL; + return (NULL); + } + return (nvh); + } + ptr += NVH_SIZE(nvh); + size -= NVH_SIZE(nvh); + } + errno = ENOENT; + if (nv->nv_error == 0) + nv->nv_error = ENOENT; + return (NULL); +} + +static void +nv_swap(struct nvhdr *nvh, bool tohost) +{ + unsigned char *data, *end, *p; + size_t vsize; + + data = NVH_DATA(nvh); + if (tohost) { + if ((nvh->nvh_type & NV_ORDER_MASK) == NV_ORDER_HOST) + return; + nvh->nvh_dsize = le32toh(nvh->nvh_dsize); + end = data + nvh->nvh_dsize; + nvh->nvh_type &= ~NV_ORDER_MASK; + nvh->nvh_type |= NV_ORDER_HOST; + } else { + if ((nvh->nvh_type & NV_ORDER_MASK) == NV_ORDER_NETWORK) + return; + end = data + nvh->nvh_dsize; + nvh->nvh_dsize = htole32(nvh->nvh_dsize); + nvh->nvh_type &= ~NV_ORDER_MASK; + nvh->nvh_type |= NV_ORDER_NETWORK; + } + + vsize = 0; + + switch (nvh->nvh_type & NV_TYPE_MASK) { + case NV_TYPE_INT8: + case NV_TYPE_UINT8: + case NV_TYPE_INT8_ARRAY: + case NV_TYPE_UINT8_ARRAY: + break; + case NV_TYPE_INT16: + case NV_TYPE_UINT16: + case NV_TYPE_INT16_ARRAY: + case NV_TYPE_UINT16_ARRAY: + if (vsize == 0) + vsize = 2; + /* FALLTHOUGH */ + case NV_TYPE_INT32: + case NV_TYPE_UINT32: + case NV_TYPE_INT32_ARRAY: + case NV_TYPE_UINT32_ARRAY: + if (vsize == 0) + vsize = 4; + /* FALLTHOUGH */ + case NV_TYPE_INT64: + case NV_TYPE_UINT64: + case NV_TYPE_INT64_ARRAY: + case NV_TYPE_UINT64_ARRAY: + if (vsize == 0) + vsize = 8; + for (p = data; p < end; p += vsize) { + if (tohost) { + switch (vsize) { + case 2: + *(uint16_t *)(void *)p = + le16toh(*(uint16_t *)(void *)p); + break; + case 4: + *(uint32_t *)(void *)p = + le32toh(*(uint32_t *)(void *)p); + break; + case 8: + *(uint64_t *)(void *)p = + le64toh(*(uint64_t *)(void *)p); + break; + default: + assert(!"invalid condition"); + } + } else { + switch (vsize) { + case 2: + *(uint16_t *)(void *)p = + htole16(*(uint16_t *)(void *)p); + break; + case 4: + *(uint32_t *)(void *)p = + htole32(*(uint32_t *)(void *)p); + break; + case 8: + *(uint64_t *)(void *)p = + htole64(*(uint64_t *)(void *)p); + break; + default: + assert(!"invalid condition"); + } + } + } + break; + case NV_TYPE_STRING: + break; + default: + assert(!"unrecognized type"); + } +} diff --git a/sbin/hastd/nv.h b/sbin/hastd/nv.h new file mode 100644 index 000000000000..16775480b026 --- /dev/null +++ b/sbin/hastd/nv.h @@ -0,0 +1,158 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _NV_H_ +#define _NV_H_ + +#include + +#include +#include +#include +#include + +#include + +#define NV_TYPE_INT8 1 +#define NV_TYPE_UINT8 2 +#define NV_TYPE_INT16 3 +#define NV_TYPE_UINT16 4 +#define NV_TYPE_INT32 5 +#define NV_TYPE_UINT32 6 +#define NV_TYPE_INT64 7 +#define NV_TYPE_UINT64 8 +#define NV_TYPE_INT8_ARRAY 9 +#define NV_TYPE_UINT8_ARRAY 10 +#define NV_TYPE_INT16_ARRAY 11 +#define NV_TYPE_UINT16_ARRAY 12 +#define NV_TYPE_INT32_ARRAY 13 +#define NV_TYPE_UINT32_ARRAY 14 +#define NV_TYPE_INT64_ARRAY 15 +#define NV_TYPE_UINT64_ARRAY 16 +#define NV_TYPE_STRING 17 + +#define NV_TYPE_MASK 0x7f +#define NV_TYPE_FIRST NV_TYPE_INT8 +#define NV_TYPE_LAST NV_TYPE_STRING + +#define NV_ORDER_NETWORK 0x00 +#define NV_ORDER_HOST 0x80 + +#define NV_ORDER_MASK 0x80 + +struct nv; + +struct nv *nv_alloc(void); +void nv_free(struct nv *nv); +int nv_error(const struct nv *nv); +int nv_set_error(struct nv *nv, int error); +int nv_validate(struct nv *nv, size_t *extrap); + +struct ebuf *nv_hton(struct nv *nv); +struct nv *nv_ntoh(struct ebuf *eb); + +void nv_add_int8(struct nv *nv, int8_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_uint8(struct nv *nv, uint8_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_int16(struct nv *nv, int16_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_uint16(struct nv *nv, uint16_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_int32(struct nv *nv, int32_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_uint32(struct nv *nv, uint32_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_int64(struct nv *nv, int64_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_uint64(struct nv *nv, uint64_t value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_int8_array(struct nv *nv, const int8_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_uint8_array(struct nv *nv, const uint8_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_int16_array(struct nv *nv, const int16_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_uint16_array(struct nv *nv, const uint16_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_int32_array(struct nv *nv, const int32_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_uint32_array(struct nv *nv, const uint32_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_int64_array(struct nv *nv, const int64_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_uint64_array(struct nv *nv, const uint64_t *value, size_t size, + const char *namefmt, ...) __printflike(4, 5); +void nv_add_string(struct nv *nv, const char *value, const char *namefmt, ...) + __printflike(3, 4); +void nv_add_stringf(struct nv *nv, const char *name, const char *valuefmt, ...) + __printflike(3, 4); +void nv_add_stringv(struct nv *nv, const char *name, const char *valuefmt, + va_list valueap) __printflike(3, 0); + +int8_t nv_get_int8(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +uint8_t nv_get_uint8(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +int16_t nv_get_int16(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +uint16_t nv_get_uint16(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +int32_t nv_get_int32(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +uint32_t nv_get_uint32(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +int64_t nv_get_int64(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +uint64_t nv_get_uint64(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); +const int8_t *nv_get_int8_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const uint8_t *nv_get_uint8_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const int16_t *nv_get_int16_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const uint16_t *nv_get_uint16_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const int32_t *nv_get_int32_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const uint32_t *nv_get_uint32_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const int64_t *nv_get_int64_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const uint64_t *nv_get_uint64_array(struct nv *nv, size_t *sizep, + const char *namefmt, ...) __printflike(3, 4); +const char *nv_get_string(struct nv *nv, const char *namefmt, ...) + __printflike(2, 3); + +void nv_dump(struct nv *nv); + +#endif /* !_NV_H_ */ diff --git a/sbin/hastd/parse.y b/sbin/hastd/parse.y new file mode 100644 index 000000000000..67553208ac6f --- /dev/null +++ b/sbin/hastd/parse.y @@ -0,0 +1,507 @@ +%{ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 /* MAXHOSTNAMELEN */ +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "hast.h" + +extern int depth; +extern int lineno; + +extern FILE *yyin; +extern char *yytext; + +static struct hastd_config lconfig; +static struct hast_resource *curres; +static bool mynode; + +static char depth0_control[HAST_ADDRSIZE]; +static char depth0_listen[HAST_ADDRSIZE]; +static int depth0_replication; + +static char depth1_provname[PATH_MAX]; +static char depth1_localpath[PATH_MAX]; + +static bool +isitme(const char *name) +{ + char buf[MAXHOSTNAMELEN]; + char *pos; + size_t bufsize; + + /* + * First check if the give name matches our full hostname. + */ + if (gethostname(buf, sizeof(buf)) < 0) + err(EX_OSERR, "gethostname() failed"); + if (strcmp(buf, name) == 0) + return (true); + + /* + * Now check if it matches first part of the host name. + */ + pos = strchr(buf, '.'); + if (pos != NULL && pos != buf && strncmp(buf, name, pos - buf) == 0) + return (true); + + /* + * At the end check if name is equal to our host's UUID. + */ + bufsize = sizeof(buf); + if (sysctlbyname("kern.hostuuid", buf, &bufsize, NULL, 0) < 0) + err(EX_OSERR, "sysctlbyname(kern.hostuuid) failed"); + if (strcasecmp(buf, name) == 0) + return (true); + + /* + * Looks like this isn't about us. + */ + return (false); +} + +void +yyerror(const char *str) +{ + + fprintf(stderr, "error at line %d near '%s': %s\n", + lineno, yytext, str); +} + +struct hastd_config * +yy_config_parse(const char *config) +{ + int ret; + + curres = NULL; + mynode = false; + + depth0_replication = HAST_REPLICATION_MEMSYNC; + strlcpy(depth0_control, HAST_CONTROL, sizeof(depth0_control)); + strlcpy(depth0_listen, HASTD_LISTEN, sizeof(depth0_listen)); + + TAILQ_INIT(&lconfig.hc_resources); + + yyin = fopen(config, "r"); + if (yyin == NULL) + err(EX_OSFILE, "cannot open configuration file %s", config); + ret = yyparse(); + fclose(yyin); + if (ret != 0) { + yy_config_free(&lconfig); + exit(EX_CONFIG); + } + + /* + * Let's see if everything is set up. + */ + if (lconfig.hc_controladdr[0] == '\0') { + strlcpy(lconfig.hc_controladdr, depth0_control, + sizeof(lconfig.hc_controladdr)); + } + if (lconfig.hc_listenaddr[0] == '\0') { + strlcpy(lconfig.hc_listenaddr, depth0_listen, + sizeof(lconfig.hc_listenaddr)); + } + TAILQ_FOREACH(curres, &lconfig.hc_resources, hr_next) { + assert(curres->hr_provname[0] != '\0'); + assert(curres->hr_localpath[0] != '\0'); + assert(curres->hr_remoteaddr[0] != '\0'); + + if (curres->hr_replication == -1) { + /* + * Replication is not set at resource-level. + * Use global or default setting. + */ + curres->hr_replication = depth0_replication; + } + } + + return (&lconfig); +} + +void +yy_config_free(struct hastd_config *config) +{ + struct hast_resource *res; + + while ((res = TAILQ_FIRST(&config->hc_resources)) != NULL) { + TAILQ_REMOVE(&config->hc_resources, res, hr_next); + free(res); + } +} +%} + +%token CONTROL LISTEN PORT REPLICATION EXTENTSIZE RESOURCE NAME LOCAL REMOTE ON +%token FULLSYNC MEMSYNC ASYNC +%token NUM STR OB CB + +%type replication_type + +%union +{ + int num; + char *str; +} + +%token NUM +%token STR + +%% + +statements: + | + statements statement + ; + +statement: + control_statement + | + listen_statement + | + replication_statement + | + node_statement + | + resource_statement + ; + +control_statement: CONTROL STR + { + switch (depth) { + case 0: + if (strlcpy(depth0_control, $2, + sizeof(depth0_control)) >= + sizeof(depth0_control)) { + errx(EX_CONFIG, "control argument too long"); + } + break; + case 1: + if (mynode) { + if (strlcpy(lconfig.hc_controladdr, $2, + sizeof(lconfig.hc_controladdr)) >= + sizeof(lconfig.hc_controladdr)) { + errx(EX_CONFIG, + "control argument too long"); + } + } + break; + default: + assert(!"control at wrong depth level"); + } + } + ; + +listen_statement: LISTEN STR + { + switch (depth) { + case 0: + if (strlcpy(depth0_listen, $2, + sizeof(depth0_listen)) >= + sizeof(depth0_listen)) { + errx(EX_CONFIG, "listen argument too long"); + } + break; + case 1: + if (mynode) { + if (strlcpy(lconfig.hc_listenaddr, $2, + sizeof(lconfig.hc_listenaddr)) >= + sizeof(lconfig.hc_listenaddr)) { + errx(EX_CONFIG, + "listen argument too long"); + } + } + break; + default: + assert(!"listen at wrong depth level"); + } + } + ; + +replication_statement: REPLICATION replication_type + { + switch (depth) { + case 0: + depth0_replication = $2; + break; + case 1: + if (curres != NULL) + curres->hr_replication = $2; + break; + default: + assert(!"replication at wrong depth level"); + } + } + ; + +replication_type: + FULLSYNC { $$ = HAST_REPLICATION_FULLSYNC; } + | + MEMSYNC { $$ = HAST_REPLICATION_MEMSYNC; } + | + ASYNC { $$ = HAST_REPLICATION_ASYNC; } + ; + +node_statement: ON node_start OB node_entries CB + { + mynode = false; + } + ; + +node_start: STR + { + if (isitme($1)) + mynode = true; + } + ; + +node_entries: + | + node_entries node_entry + ; + +node_entry: + control_statement + | + listen_statement + ; + +resource_statement: RESOURCE resource_start OB resource_entries CB + { + if (curres != NULL) { + /* + * Let's see there are some resource-level settings + * that we can use for node-level settings. + */ + if (curres->hr_provname[0] == '\0' && + depth1_provname[0] != '\0') { + /* + * Provider name is not set at node-level, + * but is set at resource-level, use it. + */ + strlcpy(curres->hr_provname, depth1_provname, + sizeof(curres->hr_provname)); + } + if (curres->hr_localpath[0] == '\0' && + depth1_localpath[0] != '\0') { + /* + * Path to local provider is not set at + * node-level, but is set at resource-level, + * use it. + */ + strlcpy(curres->hr_localpath, depth1_localpath, + sizeof(curres->hr_localpath)); + } + + /* + * If provider name is not given, use resource name + * as provider name. + */ + if (curres->hr_provname[0] == '\0') { + strlcpy(curres->hr_provname, curres->hr_name, + sizeof(curres->hr_provname)); + } + + /* + * Remote address has to be configured at this point. + */ + if (curres->hr_remoteaddr[0] == '\0') { + errx(EX_CONFIG, + "remote address not configured for resource %s", + curres->hr_name); + } + /* + * Path to local provider has to be configured at this + * point. + */ + if (curres->hr_localpath[0] == '\0') { + errx(EX_CONFIG, + "path local component not configured for resource %s", + curres->hr_name); + } + + /* Put it onto resource list. */ + TAILQ_INSERT_TAIL(&lconfig.hc_resources, curres, hr_next); + curres = NULL; + } + } + ; + +resource_start: STR + { + /* + * Clear those, so we can tell if they were set at + * resource-level or not. + */ + depth1_provname[0] = '\0'; + depth1_localpath[0] = '\0'; + + curres = calloc(1, sizeof(*curres)); + if (curres == NULL) { + errx(EX_TEMPFAIL, + "cannot allocate memory for resource"); + } + if (strlcpy(curres->hr_name, $1, + sizeof(curres->hr_name)) >= + sizeof(curres->hr_name)) { + errx(EX_CONFIG, + "resource name (%s) too long", $1); + } + curres->hr_role = HAST_ROLE_INIT; + curres->hr_previous_role = HAST_ROLE_INIT; + curres->hr_replication = -1; + curres->hr_provname[0] = '\0'; + curres->hr_localpath[0] = '\0'; + curres->hr_localfd = -1; + curres->hr_remoteaddr[0] = '\0'; + curres->hr_ggateunit = -1; + } + ; + +resource_entries: + | + resource_entries resource_entry + ; + +resource_entry: + replication_statement + | + name_statement + | + local_statement + | + resource_node_statement + ; + +name_statement: NAME STR + { + switch (depth) { + case 1: + if (strlcpy(depth1_provname, $2, + sizeof(depth1_provname)) >= + sizeof(depth1_provname)) { + errx(EX_CONFIG, "name argument too long"); + } + break; + case 2: + if (mynode) { + assert(curres != NULL); + if (strlcpy(curres->hr_provname, $2, + sizeof(curres->hr_provname)) >= + sizeof(curres->hr_provname)) { + errx(EX_CONFIG, + "name argument too long"); + } + } + break; + default: + assert(!"name at wrong depth level"); + } + } + ; + +local_statement: LOCAL STR + { + switch (depth) { + case 1: + if (strlcpy(depth1_localpath, $2, + sizeof(depth1_localpath)) >= + sizeof(depth1_localpath)) { + errx(EX_CONFIG, "local argument too long"); + } + break; + case 2: + if (mynode) { + assert(curres != NULL); + if (strlcpy(curres->hr_localpath, $2, + sizeof(curres->hr_localpath)) >= + sizeof(curres->hr_localpath)) { + errx(EX_CONFIG, + "local argument too long"); + } + } + break; + default: + assert(!"local at wrong depth level"); + } + } + ; + +resource_node_statement:ON resource_node_start OB resource_node_entries CB + { + mynode = false; + } + ; + +resource_node_start: STR + { + if (curres != NULL && isitme($1)) + mynode = true; + } + ; + +resource_node_entries: + | + resource_node_entries resource_node_entry + ; + +resource_node_entry: + name_statement + | + local_statement + | + remote_statement + ; + +remote_statement: REMOTE STR + { + assert(depth == 2); + if (mynode) { + assert(curres != NULL); + if (strlcpy(curres->hr_remoteaddr, $2, + sizeof(curres->hr_remoteaddr)) >= + sizeof(curres->hr_remoteaddr)) { + errx(EX_CONFIG, "remote argument too long"); + } + } + } + ; diff --git a/sbin/hastd/pjdlog.c b/sbin/hastd/pjdlog.c new file mode 100644 index 000000000000..38c5539ad0cf --- /dev/null +++ b/sbin/hastd/pjdlog.c @@ -0,0 +1,367 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include "pjdlog.h" + +static int pjdlog_mode = PJDLOG_MODE_STD; +static int pjdlog_debug_level = 0; +static char pjdlog_prefix[128]; + +/* + * Configure where the logs should go. + * By default they are send to stdout/stderr, but after going into background + * (eg. by calling daemon(3)) application is responsible for changing mode to + * PJDLOG_MODE_SYSLOG, so logs will be send to syslog. + */ +void +pjdlog_mode_set(int mode) +{ + + assert(mode == PJDLOG_MODE_STD || mode == PJDLOG_MODE_SYSLOG); + + pjdlog_mode = mode; +} + +/* + * Return current mode. + */ +int +pjdlog_mode_get(void) +{ + + return (pjdlog_mode); +} + +/* + * Set debug level. All the logs above the level specified here will be + * ignored. + */ +void +pjdlog_debug_set(int level) +{ + + assert(level >= 0); + + pjdlog_debug_level = level; +} + +/* + * Return current debug level. + */ +int +pjdlog_debug_get(void) +{ + + return (pjdlog_debug_level); +} + +/* + * Set prefix that will be used before each log. + * Setting prefix to NULL will remove it. + */ +void +pjdlog_prefix_set(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlog_prefix_setv(fmt, ap); + va_end(ap); +} + +/* + * Set prefix that will be used before each log. + * Setting prefix to NULL will remove it. + */ +void +pjdlog_prefix_setv(const char *fmt, va_list ap) +{ + + assert(fmt != NULL); + + vsnprintf(pjdlog_prefix, sizeof(pjdlog_prefix), fmt, ap); +} + +/* + * Convert log level into string. + */ +static const char * +pjdlog_level_string(int loglevel) +{ + + switch (loglevel) { + case LOG_EMERG: + return ("EMERG"); + case LOG_ALERT: + return ("ALERT"); + case LOG_CRIT: + return ("CRIT"); + case LOG_ERR: + return ("ERROR"); + case LOG_WARNING: + return ("WARNING"); + case LOG_NOTICE: + return ("NOTICE"); + case LOG_INFO: + return ("INFO"); + case LOG_DEBUG: + return ("DEBUG"); + } + assert(!"Invalid log level."); + abort(); /* XXX: gcc */ +} + +/* + * Common log routine. + */ +void +pjdlog_common(int loglevel, int debuglevel, int error, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlogv_common(loglevel, debuglevel, error, fmt, ap); + va_end(ap); +} + +/* + * Common log routine, which can handle regular log level as well as debug + * level. We decide here where to send the logs (stdout/stderr or syslog). + */ +void +pjdlogv_common(int loglevel, int debuglevel, int error, const char *fmt, + va_list ap) +{ + + assert(loglevel == LOG_EMERG || loglevel == LOG_ALERT || + loglevel == LOG_CRIT || loglevel == LOG_ERR || + loglevel == LOG_WARNING || loglevel == LOG_NOTICE || + loglevel == LOG_INFO || loglevel == LOG_DEBUG); + assert(loglevel != LOG_DEBUG || debuglevel > 0); + assert(error >= -1); + + /* Ignore debug above configured level. */ + if (loglevel == LOG_DEBUG && debuglevel > pjdlog_debug_level) + return; + + switch (pjdlog_mode) { + case PJDLOG_MODE_STD: + { + FILE *out; + + /* + * We send errors and warning to stderr and the rest to stdout. + */ + switch (loglevel) { + case LOG_EMERG: + case LOG_ALERT: + case LOG_CRIT: + case LOG_ERR: + case LOG_WARNING: + out = stderr; + break; + case LOG_NOTICE: + case LOG_INFO: + case LOG_DEBUG: + out = stdout; + break; + default: + assert(!"Invalid loglevel."); + abort(); /* XXX: gcc */ + } + + fprintf(out, "[%s]", pjdlog_level_string(loglevel)); + /* Attach debuglevel if this is debug log. */ + if (loglevel == LOG_DEBUG) + fprintf(out, "[%d]", debuglevel); + fprintf(out, " "); + fprintf(out, "%s", pjdlog_prefix); + vfprintf(out, fmt, ap); + if (error != -1) + fprintf(out, ": %s.", strerror(error)); + fprintf(out, "\n"); + break; + } + case PJDLOG_MODE_SYSLOG: + { + char log[1024]; + int len; + + len = snprintf(log, sizeof(log), "%s", pjdlog_prefix); + if ((size_t)len < sizeof(log)) + len = vsnprintf(log + len, sizeof(log) - len, fmt, ap); + if (error != -1 && (size_t)len < sizeof(log)) { + (void)snprintf(log + len, sizeof(log) - len, ": %s.", + strerror(error)); + } + syslog(loglevel, "%s", log); + break; + } + default: + assert(!"Invalid mode."); + } +} + +/* + * Regular logs. + */ +void +pjdlogv(int loglevel, const char *fmt, va_list ap) +{ + + /* LOG_DEBUG is invalid here, pjdlogv?_debug() should be used. */ + assert(loglevel == LOG_EMERG || loglevel == LOG_ALERT || + loglevel == LOG_CRIT || loglevel == LOG_ERR || + loglevel == LOG_WARNING || loglevel == LOG_NOTICE || + loglevel == LOG_INFO); + + pjdlogv_common(loglevel, 0, -1, fmt, ap); +} + +/* + * Regular logs. + */ +void +pjdlog(int loglevel, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlogv(loglevel, fmt, ap); + va_end(ap); +} + +/* + * Debug logs. + */ +void +pjdlogv_debug(int debuglevel, const char *fmt, va_list ap) +{ + + pjdlogv_common(LOG_DEBUG, debuglevel, -1, fmt, ap); +} + +/* + * Debug logs. + */ +void +pjdlog_debug(int debuglevel, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlogv_debug(debuglevel, fmt, ap); + va_end(ap); +} + +/* + * Error logs with errno logging. + */ +void +pjdlogv_errno(int loglevel, const char *fmt, va_list ap) +{ + + pjdlogv_common(loglevel, 0, errno, fmt, ap); +} + +/* + * Error logs with errno logging. + */ +void +pjdlog_errno(int loglevel, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlogv_errno(loglevel, fmt, ap); + va_end(ap); +} + +/* + * Log error, errno and exit. + */ +void +pjdlogv_exit(int exitcode, const char *fmt, va_list ap) +{ + + pjdlogv_errno(LOG_ERR, fmt, ap); + exit(exitcode); +} + +/* + * Log error, errno and exit. + */ +void +pjdlog_exit(int exitcode, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlogv_exit(exitcode, fmt, ap); + /* NOTREACHED */ + va_end(ap); +} + +/* + * Log error and exit. + */ +void +pjdlogv_exitx(int exitcode, const char *fmt, va_list ap) +{ + + pjdlogv(LOG_ERR, fmt, ap); + exit(exitcode); +} + +/* + * Log error and exit. + */ +void +pjdlog_exitx(int exitcode, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlogv_exitx(exitcode, fmt, ap); + /* NOTREACHED */ + va_end(ap); +} diff --git a/sbin/hastd/pjdlog.h b/sbin/hastd/pjdlog.h new file mode 100644 index 000000000000..2136b12f42ae --- /dev/null +++ b/sbin/hastd/pjdlog.h @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _PJDLOG_H_ +#define _PJDLOG_H_ + +#include + +#include +#include +#include + +#define PJDLOG_MODE_STD 0 +#define PJDLOG_MODE_SYSLOG 1 + +void pjdlog_mode_set(int mode); +int pjdlog_mode_get(void); + +void pjdlog_debug_set(int level); +int pjdlog_debug_get(void); + +void pjdlog_prefix_set(const char *fmt, ...) __printflike(1, 2); +void pjdlog_prefix_setv(const char *fmt, va_list ap) __printflike(1, 0); + +void pjdlog_common(int loglevel, int debuglevel, int error, const char *fmt, + ...) __printflike(4, 5); +void pjdlogv_common(int loglevel, int debuglevel, int error, const char *fmt, + va_list ap) __printflike(4, 0); + +void pjdlog(int loglevel, const char *fmt, ...) __printflike(2, 3); +void pjdlogv(int loglevel, const char *fmt, va_list ap) __printflike(2, 0); + +#define pjdlogv_emergency(fmt, ap) pjdlogv(LOG_EMERG, (fmt), (ap)) +#define pjdlog_emergency(...) pjdlog(LOG_EMERG, __VA_ARGS__) +#define pjdlogv_alert(fmt, ap) pjdlogv(LOG_ALERT, (fmt), (ap)) +#define pjdlog_alert(...) pjdlog(LOG_ALERT, __VA_ARGS__) +#define pjdlogv_critical(fmt, ap) pjdlogv(LOG_CRIT, (fmt), (ap)) +#define pjdlog_critical(...) pjdlog(LOG_CRIT, __VA_ARGS__) +#define pjdlogv_error(fmt, ap) pjdlogv(LOG_ERR, (fmt), (ap)) +#define pjdlog_error(...) pjdlog(LOG_ERR, __VA_ARGS__) +#define pjdlogv_warning(fmt, ap) pjdlogv(LOG_WARNING, (fmt), (ap)) +#define pjdlog_warning(...) pjdlog(LOG_WARNING, __VA_ARGS__) +#define pjdlogv_notice(fmt, ap) pjdlogv(LOG_NOTICE, (fmt), (ap)) +#define pjdlog_notice(...) pjdlog(LOG_NOTICE, __VA_ARGS__) +#define pjdlogv_info(fmt, ap) pjdlogv(LOG_INFO, (fmt), (ap)) +#define pjdlog_info(...) pjdlog(LOG_INFO, __VA_ARGS__) + +void pjdlog_debug(int debuglevel, const char *fmt, ...) __printflike(2, 3); +void pjdlogv_debug(int debuglevel, const char *fmt, va_list ap) __printflike(2, 0); + +void pjdlog_errno(int loglevel, const char *fmt, ...) __printflike(2, 3); +void pjdlogv_errno(int loglevel, const char *fmt, va_list ap) __printflike(2, 0); + +void pjdlog_exit(int exitcode, const char *fmt, ...) __printflike(2, 3) __dead2; +void pjdlogv_exit(int exitcode, const char *fmt, va_list ap) __printflike(2, 0) __dead2; + +void pjdlog_exitx(int exitcode, const char *fmt, ...) __printflike(2, 3) __dead2; +void pjdlogv_exitx(int exitcode, const char *fmt, va_list ap) __printflike(2, 0) __dead2; + +#endif /* !_PJDLOG_H_ */ diff --git a/sbin/hastd/primary.c b/sbin/hastd/primary.c new file mode 100644 index 000000000000..ed6e91ca8b86 --- /dev/null +++ b/sbin/hastd/primary.c @@ -0,0 +1,1769 @@ +/*- + * Copyright (c) 2009 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "control.h" +#include "hast.h" +#include "hast_proto.h" +#include "hastd.h" +#include "metadata.h" +#include "proto.h" +#include "pjdlog.h" +#include "subr.h" +#include "synch.h" + +struct hio { + /* + * Number of components we are still waiting for. + * When this field goes to 0, we can send the request back to the + * kernel. Each component has to decrease this counter by one + * even on failure. + */ + unsigned int hio_countdown; + /* + * Each component has a place to store its own error. + * Once the request is handled by all components we can decide if the + * request overall is successful or not. + */ + int *hio_errors; + /* + * Structure used to comunicate with GEOM Gate class. + */ + struct g_gate_ctl_io hio_ggio; + TAILQ_ENTRY(hio) *hio_next; +}; +#define hio_free_next hio_next[0] +#define hio_done_next hio_next[0] + +/* + * Free list holds unused structures. When free list is empty, we have to wait + * until some in-progress requests are freed. + */ +static TAILQ_HEAD(, hio) hio_free_list; +static pthread_mutex_t hio_free_list_lock; +static pthread_cond_t hio_free_list_cond; +/* + * There is one send list for every component. One requests is placed on all + * send lists - each component gets the same request, but each component is + * responsible for managing his own send list. + */ +static TAILQ_HEAD(, hio) *hio_send_list; +static pthread_mutex_t *hio_send_list_lock; +static pthread_cond_t *hio_send_list_cond; +/* + * There is one recv list for every component, although local components don't + * use recv lists as local requests are done synchronously. + */ +static TAILQ_HEAD(, hio) *hio_recv_list; +static pthread_mutex_t *hio_recv_list_lock; +static pthread_cond_t *hio_recv_list_cond; +/* + * Request is placed on done list by the slowest component (the one that + * decreased hio_countdown from 1 to 0). + */ +static TAILQ_HEAD(, hio) hio_done_list; +static pthread_mutex_t hio_done_list_lock; +static pthread_cond_t hio_done_list_cond; +/* + * Structure below are for interaction with sync thread. + */ +static bool sync_inprogress; +static pthread_mutex_t sync_lock; +static pthread_cond_t sync_cond; +/* + * The lock below allows to synchornize access to remote connections. + */ +static pthread_rwlock_t *hio_remote_lock; +static pthread_mutex_t hio_guard_lock; +static pthread_cond_t hio_guard_cond; + +/* + * Lock to synchronize metadata updates. Also synchronize access to + * hr_primary_localcnt and hr_primary_remotecnt fields. + */ +static pthread_mutex_t metadata_lock; + +/* + * Maximum number of outstanding I/O requests. + */ +#define HAST_HIO_MAX 256 +/* + * Number of components. At this point there are only two components: local + * and remote, but in the future it might be possible to use multiple local + * and remote components. + */ +#define HAST_NCOMPONENTS 2 +/* + * Number of seconds to sleep before next reconnect try. + */ +#define RECONNECT_SLEEP 5 + +#define ISCONNECTED(res, no) \ + ((res)->hr_remotein != NULL && (res)->hr_remoteout != NULL) + +#define QUEUE_INSERT1(hio, name, ncomp) do { \ + bool _wakeup; \ + \ + mtx_lock(&hio_##name##_list_lock[(ncomp)]); \ + _wakeup = TAILQ_EMPTY(&hio_##name##_list[(ncomp)]); \ + TAILQ_INSERT_TAIL(&hio_##name##_list[(ncomp)], (hio), \ + hio_next[(ncomp)]); \ + mtx_unlock(&hio_##name##_list_lock[ncomp]); \ + if (_wakeup) \ + cv_signal(&hio_##name##_list_cond[(ncomp)]); \ +} while (0) +#define QUEUE_INSERT2(hio, name) do { \ + bool _wakeup; \ + \ + mtx_lock(&hio_##name##_list_lock); \ + _wakeup = TAILQ_EMPTY(&hio_##name##_list); \ + TAILQ_INSERT_TAIL(&hio_##name##_list, (hio), hio_##name##_next);\ + mtx_unlock(&hio_##name##_list_lock); \ + if (_wakeup) \ + cv_signal(&hio_##name##_list_cond); \ +} while (0) +#define QUEUE_TAKE1(hio, name, ncomp) do { \ + mtx_lock(&hio_##name##_list_lock[(ncomp)]); \ + while (((hio) = TAILQ_FIRST(&hio_##name##_list[(ncomp)])) == NULL) { \ + cv_wait(&hio_##name##_list_cond[(ncomp)], \ + &hio_##name##_list_lock[(ncomp)]); \ + } \ + TAILQ_REMOVE(&hio_##name##_list[(ncomp)], (hio), \ + hio_next[(ncomp)]); \ + mtx_unlock(&hio_##name##_list_lock[(ncomp)]); \ +} while (0) +#define QUEUE_TAKE2(hio, name) do { \ + mtx_lock(&hio_##name##_list_lock); \ + while (((hio) = TAILQ_FIRST(&hio_##name##_list)) == NULL) { \ + cv_wait(&hio_##name##_list_cond, \ + &hio_##name##_list_lock); \ + } \ + TAILQ_REMOVE(&hio_##name##_list, (hio), hio_##name##_next); \ + mtx_unlock(&hio_##name##_list_lock); \ +} while (0) + +#define SYNCREQ(hio) do { (hio)->hio_ggio.gctl_unit = -1; } while (0) +#define ISSYNCREQ(hio) ((hio)->hio_ggio.gctl_unit == -1) +#define SYNCREQDONE(hio) do { (hio)->hio_ggio.gctl_unit = -2; } while (0) +#define ISSYNCREQDONE(hio) ((hio)->hio_ggio.gctl_unit == -2) + +static struct hast_resource *gres; + +static pthread_mutex_t range_lock; +static struct rangelocks *range_regular; +static bool range_regular_wait; +static pthread_cond_t range_regular_cond; +static struct rangelocks *range_sync; +static bool range_sync_wait; +static pthread_cond_t range_sync_cond; + +static void *ggate_recv_thread(void *arg); +static void *local_send_thread(void *arg); +static void *remote_send_thread(void *arg); +static void *remote_recv_thread(void *arg); +static void *ggate_send_thread(void *arg); +static void *sync_thread(void *arg); +static void *guard_thread(void *arg); + +static void sighandler(int sig); + +static void +cleanup(struct hast_resource *res) +{ + int rerrno; + + /* Remember errno. */ + rerrno = errno; + + /* + * Close descriptor to /dev/hast/ + * to work-around race in the kernel. + */ + close(res->hr_localfd); + + /* Destroy ggate provider if we created one. */ + if (res->hr_ggateunit >= 0) { + struct g_gate_ctl_destroy ggiod; + + ggiod.gctl_version = G_GATE_VERSION; + ggiod.gctl_unit = res->hr_ggateunit; + ggiod.gctl_force = 1; + if (ioctl(res->hr_ggatefd, G_GATE_CMD_DESTROY, &ggiod) < 0) { + pjdlog_warning("Unable to destroy hast/%s device", + res->hr_provname); + } + res->hr_ggateunit = -1; + } + + /* Restore errno. */ + errno = rerrno; +} + +static void +primary_exit(int exitcode, const char *fmt, ...) +{ + va_list ap; + + assert(exitcode != EX_OK); + va_start(ap, fmt); + pjdlogv_errno(LOG_ERR, fmt, ap); + va_end(ap); + cleanup(gres); + exit(exitcode); +} + +static void +primary_exitx(int exitcode, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + pjdlogv(exitcode == EX_OK ? LOG_INFO : LOG_ERR, fmt, ap); + va_end(ap); + cleanup(gres); + exit(exitcode); +} + +static int +hast_activemap_flush(struct hast_resource *res) +{ + const unsigned char *buf; + size_t size; + + buf = activemap_bitmap(res->hr_amp, &size); + assert(buf != NULL); + assert((size % res->hr_local_sectorsize) == 0); + if (pwrite(res->hr_localfd, buf, size, METADATA_SIZE) != + (ssize_t)size) { + KEEP_ERRNO(pjdlog_errno(LOG_ERR, + "Unable to flush activemap to disk")); + return (-1); + } + return (0); +} + +static void +init_environment(struct hast_resource *res __unused) +{ + struct hio *hio; + unsigned int ii, ncomps; + + /* + * In the future it might be per-resource value. + */ + ncomps = HAST_NCOMPONENTS; + + /* + * Allocate memory needed by lists. + */ + hio_send_list = malloc(sizeof(hio_send_list[0]) * ncomps); + if (hio_send_list == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for send lists.", + sizeof(hio_send_list[0]) * ncomps); + } + hio_send_list_lock = malloc(sizeof(hio_send_list_lock[0]) * ncomps); + if (hio_send_list_lock == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for send list locks.", + sizeof(hio_send_list_lock[0]) * ncomps); + } + hio_send_list_cond = malloc(sizeof(hio_send_list_cond[0]) * ncomps); + if (hio_send_list_cond == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for send list condition variables.", + sizeof(hio_send_list_cond[0]) * ncomps); + } + hio_recv_list = malloc(sizeof(hio_recv_list[0]) * ncomps); + if (hio_recv_list == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for recv lists.", + sizeof(hio_recv_list[0]) * ncomps); + } + hio_recv_list_lock = malloc(sizeof(hio_recv_list_lock[0]) * ncomps); + if (hio_recv_list_lock == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for recv list locks.", + sizeof(hio_recv_list_lock[0]) * ncomps); + } + hio_recv_list_cond = malloc(sizeof(hio_recv_list_cond[0]) * ncomps); + if (hio_recv_list_cond == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for recv list condition variables.", + sizeof(hio_recv_list_cond[0]) * ncomps); + } + hio_remote_lock = malloc(sizeof(hio_remote_lock[0]) * ncomps); + if (hio_remote_lock == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for remote connections locks.", + sizeof(hio_remote_lock[0]) * ncomps); + } + + /* + * Initialize lists, their locks and theirs condition variables. + */ + TAILQ_INIT(&hio_free_list); + mtx_init(&hio_free_list_lock); + cv_init(&hio_free_list_cond); + for (ii = 0; ii < HAST_NCOMPONENTS; ii++) { + TAILQ_INIT(&hio_send_list[ii]); + mtx_init(&hio_send_list_lock[ii]); + cv_init(&hio_send_list_cond[ii]); + TAILQ_INIT(&hio_recv_list[ii]); + mtx_init(&hio_recv_list_lock[ii]); + cv_init(&hio_recv_list_cond[ii]); + rw_init(&hio_remote_lock[ii]); + } + TAILQ_INIT(&hio_done_list); + mtx_init(&hio_done_list_lock); + cv_init(&hio_done_list_cond); + mtx_init(&hio_guard_lock); + cv_init(&hio_guard_cond); + mtx_init(&metadata_lock); + + /* + * Allocate requests pool and initialize requests. + */ + for (ii = 0; ii < HAST_HIO_MAX; ii++) { + hio = malloc(sizeof(*hio)); + if (hio == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for hio request.", + sizeof(*hio)); + } + hio->hio_countdown = 0; + hio->hio_errors = malloc(sizeof(hio->hio_errors[0]) * ncomps); + if (hio->hio_errors == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable allocate %zu bytes of memory for hio errors.", + sizeof(hio->hio_errors[0]) * ncomps); + } + hio->hio_next = malloc(sizeof(hio->hio_next[0]) * ncomps); + if (hio->hio_next == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable allocate %zu bytes of memory for hio_next field.", + sizeof(hio->hio_next[0]) * ncomps); + } + hio->hio_ggio.gctl_version = G_GATE_VERSION; + hio->hio_ggio.gctl_data = malloc(MAXPHYS); + if (hio->hio_ggio.gctl_data == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate %zu bytes of memory for gctl_data.", + MAXPHYS); + } + hio->hio_ggio.gctl_length = MAXPHYS; + hio->hio_ggio.gctl_error = 0; + TAILQ_INSERT_HEAD(&hio_free_list, hio, hio_free_next); + } + + /* + * Turn on signals handling. + */ + signal(SIGINT, sighandler); + signal(SIGTERM, sighandler); +} + +static void +init_local(struct hast_resource *res) +{ + unsigned char *buf; + size_t mapsize; + + if (metadata_read(res, true) < 0) + exit(EX_NOINPUT); + mtx_init(&res->hr_amp_lock); + if (activemap_init(&res->hr_amp, res->hr_datasize, res->hr_extentsize, + res->hr_local_sectorsize, res->hr_keepdirty) < 0) { + primary_exit(EX_TEMPFAIL, "Unable to create activemap"); + } + mtx_init(&range_lock); + cv_init(&range_regular_cond); + if (rangelock_init(&range_regular) < 0) + primary_exit(EX_TEMPFAIL, "Unable to create regular range lock"); + cv_init(&range_sync_cond); + if (rangelock_init(&range_sync) < 0) + primary_exit(EX_TEMPFAIL, "Unable to create sync range lock"); + mapsize = activemap_ondisk_size(res->hr_amp); + buf = calloc(1, mapsize); + if (buf == NULL) { + primary_exitx(EX_TEMPFAIL, + "Unable to allocate buffer for activemap."); + } + if (pread(res->hr_localfd, buf, mapsize, METADATA_SIZE) != + (ssize_t)mapsize) { + primary_exit(EX_NOINPUT, "Unable to read activemap"); + } + activemap_copyin(res->hr_amp, buf, mapsize); + if (res->hr_resuid != 0) + return; + /* + * We're using provider for the first time, so we have to generate + * resource unique identifier and initialize local and remote counts. + */ + arc4random_buf(&res->hr_resuid, sizeof(res->hr_resuid)); + res->hr_primary_localcnt = 1; + res->hr_primary_remotecnt = 0; + if (metadata_write(res) < 0) + exit(EX_NOINPUT); +} + +static void +init_remote(struct hast_resource *res) +{ + struct nv *nvout, *nvin; + const unsigned char *token; + unsigned char *map; + const char *errmsg; + int32_t extentsize; + int64_t datasize; + uint32_t mapsize; + size_t size; + + /* Prepare outgoing connection with remote node. */ + if (proto_client(res->hr_remoteaddr, &res->hr_remoteout) < 0) { + primary_exit(EX_OSERR, "Unable to create connection to %s", + res->hr_remoteaddr); + } + /* Try to connect, but accept failure. */ + if (proto_connect(res->hr_remoteout) < 0) { + pjdlog_errno(LOG_WARNING, "Unable to connect to %s", + res->hr_remoteaddr); + goto close; + } + /* + * First handshake step. + * Setup outgoing connection with remote node. + */ + nvout = nv_alloc(); + nv_add_string(nvout, res->hr_name, "resource"); + if (nv_error(nvout) != 0) { + pjdlog_common(LOG_WARNING, 0, nv_error(nvout), + "Unable to allocate header for connection with %s", + res->hr_remoteaddr); + nv_free(nvout); + goto close; + } + if (hast_proto_send(res, res->hr_remoteout, nvout, NULL, 0) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to send handshake header to %s", + res->hr_remoteaddr); + nv_free(nvout); + goto close; + } + nv_free(nvout); + if (hast_proto_recv_hdr(res->hr_remoteout, &nvin) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to receive handshake header from %s", + res->hr_remoteaddr); + goto close; + } + errmsg = nv_get_string(nvin, "errmsg"); + if (errmsg != NULL) { + pjdlog_warning("%s", errmsg); + nv_free(nvin); + goto close; + } + token = nv_get_uint8_array(nvin, &size, "token"); + if (token == NULL) { + pjdlog_warning("Handshake header from %s has no 'token' field.", + res->hr_remoteaddr); + nv_free(nvin); + goto close; + } + if (size != sizeof(res->hr_token)) { + pjdlog_warning("Handshake header from %s contains 'token' of wrong size (got %zu, expected %zu).", + res->hr_remoteaddr, size, sizeof(res->hr_token)); + nv_free(nvin); + goto close; + } + bcopy(token, res->hr_token, sizeof(res->hr_token)); + nv_free(nvin); + + /* + * Second handshake step. + * Setup incoming connection with remote node. + */ + if (proto_client(res->hr_remoteaddr, &res->hr_remotein) < 0) { + pjdlog_errno(LOG_WARNING, "Unable to create connection to %s", + res->hr_remoteaddr); + } + /* Try to connect, but accept failure. */ + if (proto_connect(res->hr_remotein) < 0) { + pjdlog_errno(LOG_WARNING, "Unable to connect to %s", + res->hr_remoteaddr); + goto close; + } + nvout = nv_alloc(); + nv_add_string(nvout, res->hr_name, "resource"); + nv_add_uint8_array(nvout, res->hr_token, sizeof(res->hr_token), + "token"); + nv_add_uint64(nvout, res->hr_resuid, "resuid"); + nv_add_uint64(nvout, res->hr_primary_localcnt, "localcnt"); + nv_add_uint64(nvout, res->hr_primary_remotecnt, "remotecnt"); + if (nv_error(nvout) != 0) { + pjdlog_common(LOG_WARNING, 0, nv_error(nvout), + "Unable to allocate header for connection with %s", + res->hr_remoteaddr); + nv_free(nvout); + goto close; + } + if (hast_proto_send(res, res->hr_remotein, nvout, NULL, 0) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to send handshake header to %s", + res->hr_remoteaddr); + nv_free(nvout); + goto close; + } + nv_free(nvout); + if (hast_proto_recv_hdr(res->hr_remoteout, &nvin) < 0) { + pjdlog_errno(LOG_WARNING, + "Unable to receive handshake header from %s", + res->hr_remoteaddr); + goto close; + } + errmsg = nv_get_string(nvin, "errmsg"); + if (errmsg != NULL) { + pjdlog_warning("%s", errmsg); + nv_free(nvin); + goto close; + } + datasize = nv_get_int64(nvin, "datasize"); + if (datasize != res->hr_datasize) { + pjdlog_warning("Data size differs between nodes (local=%jd, remote=%jd).", + (intmax_t)res->hr_datasize, (intmax_t)datasize); + nv_free(nvin); + goto close; + } + extentsize = nv_get_int32(nvin, "extentsize"); + if (extentsize != res->hr_extentsize) { + pjdlog_warning("Extent size differs between nodes (local=%zd, remote=%zd).", + (ssize_t)res->hr_extentsize, (ssize_t)extentsize); + nv_free(nvin); + goto close; + } + res->hr_secondary_localcnt = nv_get_uint64(nvin, "localcnt"); + res->hr_secondary_remotecnt = nv_get_uint64(nvin, "remotecnt"); + res->hr_syncsrc = nv_get_uint8(nvin, "syncsrc"); + map = NULL; + mapsize = nv_get_uint32(nvin, "mapsize"); + if (mapsize > 0) { + map = malloc(mapsize); + if (map == NULL) { + pjdlog_error("Unable to allocate memory for remote activemap (mapsize=%ju).", + (uintmax_t)mapsize); + nv_free(nvin); + goto close; + } + /* + * Remote node have some dirty extents on its own, lets + * download its activemap. + */ + if (hast_proto_recv_data(res, res->hr_remoteout, nvin, map, + mapsize) < 0) { + pjdlog_errno(LOG_ERR, + "Unable to receive remote activemap"); + nv_free(nvin); + free(map); + goto close; + } + /* + * Merge local and remote bitmaps. + */ + activemap_merge(res->hr_amp, map, mapsize); + free(map); + /* + * Now that we merged bitmaps from both nodes, flush it to the + * disk before we start to synchronize. + */ + (void)hast_activemap_flush(res); + } + pjdlog_info("Connected to %s.", res->hr_remoteaddr); + mtx_lock(&sync_lock); + sync_inprogress = true; + mtx_unlock(&sync_lock); + cv_signal(&sync_cond); + return; +close: + proto_close(res->hr_remoteout); + res->hr_remoteout = NULL; + if (res->hr_remotein != NULL) { + proto_close(res->hr_remotein); + res->hr_remotein = NULL; + } +} + +static void +init_ggate(struct hast_resource *res) +{ + struct g_gate_ctl_create ggiocreate; + struct g_gate_ctl_cancel ggiocancel; + + /* + * We communicate with ggate via /dev/ggctl. Open it. + */ + res->hr_ggatefd = open("/dev/" G_GATE_CTL_NAME, O_RDWR); + if (res->hr_ggatefd < 0) + primary_exit(EX_OSFILE, "Unable to open /dev/" G_GATE_CTL_NAME); + /* + * Create provider before trying to connect, as connection failure + * is not critical, but may take some time. + */ + ggiocreate.gctl_version = G_GATE_VERSION; + ggiocreate.gctl_mediasize = res->hr_datasize; + ggiocreate.gctl_sectorsize = res->hr_local_sectorsize; + ggiocreate.gctl_flags = 0; + ggiocreate.gctl_maxcount = 128; + ggiocreate.gctl_timeout = 0; + ggiocreate.gctl_unit = G_GATE_NAME_GIVEN; + snprintf(ggiocreate.gctl_name, sizeof(ggiocreate.gctl_name), "hast/%s", + res->hr_provname); + bzero(ggiocreate.gctl_info, sizeof(ggiocreate.gctl_info)); + if (ioctl(res->hr_ggatefd, G_GATE_CMD_CREATE, &ggiocreate) == 0) { + pjdlog_info("Device hast/%s created.", res->hr_provname); + res->hr_ggateunit = ggiocreate.gctl_unit; + return; + } + if (errno != EEXIST) { + primary_exit(EX_OSERR, "Unable to create hast/%s device", + res->hr_provname); + } + pjdlog_debug(1, + "Device hast/%s already exists, we will try to take it over.", + res->hr_provname); + /* + * If we received EEXIST, we assume that the process who created the + * provider died and didn't clean up. In that case we will start from + * where he left of. + */ + ggiocancel.gctl_version = G_GATE_VERSION; + ggiocancel.gctl_unit = G_GATE_NAME_GIVEN; + snprintf(ggiocancel.gctl_name, sizeof(ggiocancel.gctl_name), "hast/%s", + res->hr_provname); + if (ioctl(res->hr_ggatefd, G_GATE_CMD_CANCEL, &ggiocancel) == 0) { + pjdlog_info("Device hast/%s recovered.", res->hr_provname); + res->hr_ggateunit = ggiocancel.gctl_unit; + return; + } + primary_exit(EX_OSERR, "Unable to take over hast/%s device", + res->hr_provname); +} + +void +hastd_primary(struct hast_resource *res) +{ + pthread_t td; + pid_t pid; + int error; + + gres = res; + + /* + * Create communication channel between parent and child. + */ + if (proto_client("socketpair://", &res->hr_ctrl) < 0) { + KEEP_ERRNO((void)pidfile_remove(pfh)); + primary_exit(EX_OSERR, + "Unable to create control sockets between parent and child"); + } + + pid = fork(); + if (pid < 0) { + KEEP_ERRNO((void)pidfile_remove(pfh)); + primary_exit(EX_OSERR, "Unable to fork"); + } + + if (pid > 0) { + /* This is parent. */ + res->hr_workerpid = pid; + return; + } + (void)pidfile_close(pfh); + + setproctitle("%s (primary)", res->hr_name); + + init_local(res); + init_remote(res); + init_ggate(res); + init_environment(res); + error = pthread_create(&td, NULL, ggate_recv_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, local_send_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, remote_send_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, remote_recv_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, ggate_send_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, sync_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, ctrl_thread, res); + assert(error == 0); + (void)guard_thread(res); +} + +static void +reqlog(int loglevel, int debuglevel, struct g_gate_ctl_io *ggio, const char *fmt, ...) +{ + char msg[1024]; + va_list ap; + int len; + + va_start(ap, fmt); + len = vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + if ((size_t)len < sizeof(msg)) { + switch (ggio->gctl_cmd) { + case BIO_READ: + (void)snprintf(msg + len, sizeof(msg) - len, + "READ(%ju, %ju).", (uintmax_t)ggio->gctl_offset, + (uintmax_t)ggio->gctl_length); + break; + case BIO_DELETE: + (void)snprintf(msg + len, sizeof(msg) - len, + "DELETE(%ju, %ju).", (uintmax_t)ggio->gctl_offset, + (uintmax_t)ggio->gctl_length); + break; + case BIO_FLUSH: + (void)snprintf(msg + len, sizeof(msg) - len, "FLUSH."); + break; + case BIO_WRITE: + (void)snprintf(msg + len, sizeof(msg) - len, + "WRITE(%ju, %ju).", (uintmax_t)ggio->gctl_offset, + (uintmax_t)ggio->gctl_length); + break; + default: + (void)snprintf(msg + len, sizeof(msg) - len, + "UNKNOWN(%u).", (unsigned int)ggio->gctl_cmd); + break; + } + } + pjdlog_common(loglevel, debuglevel, -1, "%s", msg); +} + +static void +remote_close(struct hast_resource *res, int ncomp) +{ + + rw_wlock(&hio_remote_lock[ncomp]); + /* + * A race is possible between dropping rlock and acquiring wlock - + * another thread can close connection in-between. + */ + if (!ISCONNECTED(res, ncomp)) { + assert(res->hr_remotein == NULL); + assert(res->hr_remoteout == NULL); + rw_unlock(&hio_remote_lock[ncomp]); + return; + } + + assert(res->hr_remotein != NULL); + assert(res->hr_remoteout != NULL); + + pjdlog_debug(2, "Closing old incoming connection to %s.", + res->hr_remoteaddr); + proto_close(res->hr_remotein); + res->hr_remotein = NULL; + pjdlog_debug(2, "Closing old outgoing connection to %s.", + res->hr_remoteaddr); + proto_close(res->hr_remoteout); + res->hr_remoteout = NULL; + + rw_unlock(&hio_remote_lock[ncomp]); + + /* + * Stop synchronization if in-progress. + */ + mtx_lock(&sync_lock); + if (sync_inprogress) + sync_inprogress = false; + mtx_unlock(&sync_lock); + + /* + * Wake up guard thread, so it can immediately start reconnect. + */ + mtx_lock(&hio_guard_lock); + cv_signal(&hio_guard_cond); + mtx_unlock(&hio_guard_lock); +} + +/* + * Thread receives ggate I/O requests from the kernel and passes them to + * appropriate threads: + * WRITE - always goes to both local_send and remote_send threads + * READ (when the block is up-to-date on local component) - + * only local_send thread + * READ (when the block isn't up-to-date on local component) - + * only remote_send thread + * DELETE - always goes to both local_send and remote_send threads + * FLUSH - always goes to both local_send and remote_send threads + */ +static void * +ggate_recv_thread(void *arg) +{ + struct hast_resource *res = arg; + struct g_gate_ctl_io *ggio; + struct hio *hio; + unsigned int ii, ncomp, ncomps; + int error; + + ncomps = HAST_NCOMPONENTS; + + for (;;) { + pjdlog_debug(2, "ggate_recv: Taking free request."); + QUEUE_TAKE2(hio, free); + pjdlog_debug(2, "ggate_recv: (%p) Got free request.", hio); + ggio = &hio->hio_ggio; + ggio->gctl_unit = res->hr_ggateunit; + ggio->gctl_length = MAXPHYS; + ggio->gctl_error = 0; + pjdlog_debug(2, + "ggate_recv: (%p) Waiting for request from the kernel.", + hio); + if (ioctl(res->hr_ggatefd, G_GATE_CMD_START, ggio) < 0) { + if (sigexit_received) + pthread_exit(NULL); + primary_exit(EX_OSERR, "G_GATE_CMD_START failed"); + } + error = ggio->gctl_error; + switch (error) { + case 0: + break; + case ECANCELED: + /* Exit gracefully. */ + if (!sigexit_received) { + pjdlog_debug(2, + "ggate_recv: (%p) Received cancel from the kernel.", + hio); + pjdlog_info("Received cancel from the kernel, exiting."); + } + pthread_exit(NULL); + case ENOMEM: + /* + * Buffer too small? Impossible, we allocate MAXPHYS + * bytes - request can't be bigger than that. + */ + /* FALLTHROUGH */ + case ENXIO: + default: + primary_exitx(EX_OSERR, "G_GATE_CMD_START failed: %s.", + strerror(error)); + } + for (ii = 0; ii < ncomps; ii++) + hio->hio_errors[ii] = EINVAL; + reqlog(LOG_DEBUG, 2, ggio, + "ggate_recv: (%p) Request received from the kernel: ", + hio); + /* + * Inform all components about new write request. + * For read request prefer local component unless the given + * range is out-of-date, then use remote component. + */ + switch (ggio->gctl_cmd) { + case BIO_READ: + pjdlog_debug(2, + "ggate_recv: (%p) Moving request to the send queue.", + hio); + refcount_init(&hio->hio_countdown, 1); + mtx_lock(&metadata_lock); + if (res->hr_syncsrc == HAST_SYNCSRC_UNDEF || + res->hr_syncsrc == HAST_SYNCSRC_PRIMARY) { + /* + * This range is up-to-date on local component, + * so handle request locally. + */ + /* Local component is 0 for now. */ + ncomp = 0; + } else /* if (res->hr_syncsrc == + HAST_SYNCSRC_SECONDARY) */ { + assert(res->hr_syncsrc == + HAST_SYNCSRC_SECONDARY); + /* + * This range is out-of-date on local component, + * so send request to the remote node. + */ + /* Remote component is 1 for now. */ + ncomp = 1; + } + mtx_unlock(&metadata_lock); + QUEUE_INSERT1(hio, send, ncomp); + break; + case BIO_WRITE: + for (;;) { + mtx_lock(&range_lock); + if (rangelock_islocked(range_sync, + ggio->gctl_offset, ggio->gctl_length)) { + pjdlog_debug(2, + "regular: Range offset=%jd length=%zu locked.", + (intmax_t)ggio->gctl_offset, + (size_t)ggio->gctl_length); + range_regular_wait = true; + cv_wait(&range_regular_cond, &range_lock); + range_regular_wait = false; + mtx_unlock(&range_lock); + continue; + } + if (rangelock_add(range_regular, + ggio->gctl_offset, ggio->gctl_length) < 0) { + mtx_unlock(&range_lock); + pjdlog_debug(2, + "regular: Range offset=%jd length=%zu is already locked, waiting.", + (intmax_t)ggio->gctl_offset, + (size_t)ggio->gctl_length); + sleep(1); + continue; + } + mtx_unlock(&range_lock); + break; + } + mtx_lock(&res->hr_amp_lock); + if (activemap_write_start(res->hr_amp, + ggio->gctl_offset, ggio->gctl_length)) { + (void)hast_activemap_flush(res); + } + mtx_unlock(&res->hr_amp_lock); + /* FALLTHROUGH */ + case BIO_DELETE: + case BIO_FLUSH: + pjdlog_debug(2, + "ggate_recv: (%p) Moving request to the send queues.", + hio); + refcount_init(&hio->hio_countdown, ncomps); + for (ii = 0; ii < ncomps; ii++) + QUEUE_INSERT1(hio, send, ii); + break; + } + } + /* NOTREACHED */ + return (NULL); +} + +/* + * Thread reads from or writes to local component. + * If local read fails, it redirects it to remote_send thread. + */ +static void * +local_send_thread(void *arg) +{ + struct hast_resource *res = arg; + struct g_gate_ctl_io *ggio; + struct hio *hio; + unsigned int ncomp, rncomp; + ssize_t ret; + + /* Local component is 0 for now. */ + ncomp = 0; + /* Remote component is 1 for now. */ + rncomp = 1; + + for (;;) { + pjdlog_debug(2, "local_send: Taking request."); + QUEUE_TAKE1(hio, send, ncomp); + pjdlog_debug(2, "local_send: (%p) Got request.", hio); + ggio = &hio->hio_ggio; + switch (ggio->gctl_cmd) { + case BIO_READ: + ret = pread(res->hr_localfd, ggio->gctl_data, + ggio->gctl_length, + ggio->gctl_offset + res->hr_localoff); + if (ret == ggio->gctl_length) + hio->hio_errors[ncomp] = 0; + else { + /* + * If READ failed, try to read from remote node. + */ + QUEUE_INSERT1(hio, send, rncomp); + continue; + } + break; + case BIO_WRITE: + ret = pwrite(res->hr_localfd, ggio->gctl_data, + ggio->gctl_length, + ggio->gctl_offset + res->hr_localoff); + if (ret < 0) + hio->hio_errors[ncomp] = errno; + else if (ret != ggio->gctl_length) + hio->hio_errors[ncomp] = EIO; + else + hio->hio_errors[ncomp] = 0; + break; + case BIO_DELETE: + ret = g_delete(res->hr_localfd, + ggio->gctl_offset + res->hr_localoff, + ggio->gctl_length); + if (ret < 0) + hio->hio_errors[ncomp] = errno; + else + hio->hio_errors[ncomp] = 0; + break; + case BIO_FLUSH: + ret = g_flush(res->hr_localfd); + if (ret < 0) + hio->hio_errors[ncomp] = errno; + else + hio->hio_errors[ncomp] = 0; + break; + } + if (refcount_release(&hio->hio_countdown)) { + if (ISSYNCREQ(hio)) { + mtx_lock(&sync_lock); + SYNCREQDONE(hio); + mtx_unlock(&sync_lock); + cv_signal(&sync_cond); + } else { + pjdlog_debug(2, + "local_send: (%p) Moving request to the done queue.", + hio); + QUEUE_INSERT2(hio, done); + } + } + } + /* NOTREACHED */ + return (NULL); +} + +/* + * Thread sends request to secondary node. + */ +static void * +remote_send_thread(void *arg) +{ + struct hast_resource *res = arg; + struct g_gate_ctl_io *ggio; + struct hio *hio; + struct nv *nv; + unsigned int ncomp; + bool wakeup; + uint64_t offset, length; + uint8_t cmd; + void *data; + + /* Remote component is 1 for now. */ + ncomp = 1; + + for (;;) { + pjdlog_debug(2, "remote_send: Taking request."); + QUEUE_TAKE1(hio, send, ncomp); + pjdlog_debug(2, "remote_send: (%p) Got request.", hio); + ggio = &hio->hio_ggio; + switch (ggio->gctl_cmd) { + case BIO_READ: + cmd = HIO_READ; + data = NULL; + offset = ggio->gctl_offset; + length = ggio->gctl_length; + break; + case BIO_WRITE: + cmd = HIO_WRITE; + data = ggio->gctl_data; + offset = ggio->gctl_offset; + length = ggio->gctl_length; + break; + case BIO_DELETE: + cmd = HIO_DELETE; + data = NULL; + offset = ggio->gctl_offset; + length = ggio->gctl_length; + break; + case BIO_FLUSH: + cmd = HIO_FLUSH; + data = NULL; + offset = 0; + length = 0; + break; + default: + assert(!"invalid condition"); + abort(); + } + nv = nv_alloc(); + nv_add_uint8(nv, cmd, "cmd"); + nv_add_uint64(nv, (uint64_t)ggio->gctl_seq, "seq"); + nv_add_uint64(nv, offset, "offset"); + nv_add_uint64(nv, length, "length"); + if (nv_error(nv) != 0) { + hio->hio_errors[ncomp] = nv_error(nv); + pjdlog_debug(2, + "remote_send: (%p) Unable to prepare header to send.", + hio); + reqlog(LOG_ERR, 0, ggio, + "Unable to prepare header to send (%s): ", + strerror(nv_error(nv))); + /* Move failed request immediately to the done queue. */ + goto done_queue; + } + pjdlog_debug(2, + "remote_send: (%p) Moving request to the recv queue.", + hio); + /* + * Protect connection from disappearing. + */ + rw_rlock(&hio_remote_lock[ncomp]); + if (!ISCONNECTED(res, ncomp)) { + rw_unlock(&hio_remote_lock[ncomp]); + hio->hio_errors[ncomp] = ENOTCONN; + goto done_queue; + } + /* + * Move the request to recv queue before sending it, because + * in different order we can get reply before we move request + * to recv queue. + */ + mtx_lock(&hio_recv_list_lock[ncomp]); + wakeup = TAILQ_EMPTY(&hio_recv_list[ncomp]); + TAILQ_INSERT_TAIL(&hio_recv_list[ncomp], hio, hio_next[ncomp]); + mtx_unlock(&hio_recv_list_lock[ncomp]); + if (hast_proto_send(res, res->hr_remoteout, nv, data, + data != NULL ? length : 0) < 0) { + hio->hio_errors[ncomp] = errno; + rw_unlock(&hio_remote_lock[ncomp]); + remote_close(res, ncomp); + pjdlog_debug(2, + "remote_send: (%p) Unable to send request.", hio); + reqlog(LOG_ERR, 0, ggio, + "Unable to send request (%s): ", + strerror(hio->hio_errors[ncomp])); + /* + * Take request back from the receive queue and move + * it immediately to the done queue. + */ + mtx_lock(&hio_recv_list_lock[ncomp]); + TAILQ_REMOVE(&hio_recv_list[ncomp], hio, hio_next[ncomp]); + mtx_unlock(&hio_recv_list_lock[ncomp]); + goto done_queue; + } + rw_unlock(&hio_remote_lock[ncomp]); + nv_free(nv); + if (wakeup) + cv_signal(&hio_recv_list_cond[ncomp]); + continue; +done_queue: + nv_free(nv); + if (ISSYNCREQ(hio)) { + if (!refcount_release(&hio->hio_countdown)) + continue; + mtx_lock(&sync_lock); + SYNCREQDONE(hio); + mtx_unlock(&sync_lock); + cv_signal(&sync_cond); + continue; + } + if (ggio->gctl_cmd == BIO_WRITE) { + mtx_lock(&res->hr_amp_lock); + if (activemap_need_sync(res->hr_amp, ggio->gctl_offset, + ggio->gctl_length)) { + (void)hast_activemap_flush(res); + } + mtx_unlock(&res->hr_amp_lock); + } + if (!refcount_release(&hio->hio_countdown)) + continue; + pjdlog_debug(2, + "remote_send: (%p) Moving request to the done queue.", + hio); + QUEUE_INSERT2(hio, done); + } + /* NOTREACHED */ + return (NULL); +} + +/* + * Thread receives answer from secondary node and passes it to ggate_send + * thread. + */ +static void * +remote_recv_thread(void *arg) +{ + struct hast_resource *res = arg; + struct g_gate_ctl_io *ggio; + struct hio *hio; + struct nv *nv; + unsigned int ncomp; + uint64_t seq; + int error; + + /* Remote component is 1 for now. */ + ncomp = 1; + + for (;;) { + /* Wait until there is anything to receive. */ + mtx_lock(&hio_recv_list_lock[ncomp]); + while (TAILQ_EMPTY(&hio_recv_list[ncomp])) { + pjdlog_debug(2, "remote_recv: No requests, waiting."); + cv_wait(&hio_recv_list_cond[ncomp], + &hio_recv_list_lock[ncomp]); + } + mtx_unlock(&hio_recv_list_lock[ncomp]); + rw_rlock(&hio_remote_lock[ncomp]); + if (!ISCONNECTED(res, ncomp)) { + rw_unlock(&hio_remote_lock[ncomp]); + /* + * Connection is dead, so move all pending requests to + * the done queue (one-by-one). + */ + mtx_lock(&hio_recv_list_lock[ncomp]); + hio = TAILQ_FIRST(&hio_recv_list[ncomp]); + assert(hio != NULL); + TAILQ_REMOVE(&hio_recv_list[ncomp], hio, + hio_next[ncomp]); + mtx_unlock(&hio_recv_list_lock[ncomp]); + goto done_queue; + } + if (hast_proto_recv_hdr(res->hr_remotein, &nv) < 0) { + pjdlog_errno(LOG_ERR, + "Unable to receive reply header"); + rw_unlock(&hio_remote_lock[ncomp]); + remote_close(res, ncomp); + continue; + } + rw_unlock(&hio_remote_lock[ncomp]); + seq = nv_get_uint64(nv, "seq"); + if (seq == 0) { + pjdlog_error("Header contains no 'seq' field."); + nv_free(nv); + continue; + } + mtx_lock(&hio_recv_list_lock[ncomp]); + TAILQ_FOREACH(hio, &hio_recv_list[ncomp], hio_next[ncomp]) { + if (hio->hio_ggio.gctl_seq == seq) { + TAILQ_REMOVE(&hio_recv_list[ncomp], hio, + hio_next[ncomp]); + break; + } + } + mtx_unlock(&hio_recv_list_lock[ncomp]); + if (hio == NULL) { + pjdlog_error("Found no request matching received 'seq' field (%ju).", + (uintmax_t)seq); + nv_free(nv); + continue; + } + error = nv_get_int16(nv, "error"); + if (error != 0) { + /* Request failed on remote side. */ + hio->hio_errors[ncomp] = 0; + nv_free(nv); + goto done_queue; + } + ggio = &hio->hio_ggio; + switch (ggio->gctl_cmd) { + case BIO_READ: + rw_rlock(&hio_remote_lock[ncomp]); + if (!ISCONNECTED(res, ncomp)) { + rw_unlock(&hio_remote_lock[ncomp]); + nv_free(nv); + goto done_queue; + } + if (hast_proto_recv_data(res, res->hr_remotein, nv, + ggio->gctl_data, ggio->gctl_length) < 0) { + hio->hio_errors[ncomp] = errno; + pjdlog_errno(LOG_ERR, + "Unable to receive reply data"); + rw_unlock(&hio_remote_lock[ncomp]); + nv_free(nv); + remote_close(res, ncomp); + goto done_queue; + } + rw_unlock(&hio_remote_lock[ncomp]); + break; + case BIO_WRITE: + case BIO_DELETE: + case BIO_FLUSH: + break; + default: + assert(!"invalid condition"); + abort(); + } + hio->hio_errors[ncomp] = 0; + nv_free(nv); +done_queue: + if (refcount_release(&hio->hio_countdown)) { + if (ISSYNCREQ(hio)) { + mtx_lock(&sync_lock); + SYNCREQDONE(hio); + mtx_unlock(&sync_lock); + cv_signal(&sync_cond); + } else { + pjdlog_debug(2, + "remote_recv: (%p) Moving request to the done queue.", + hio); + QUEUE_INSERT2(hio, done); + } + } + } + /* NOTREACHED */ + return (NULL); +} + +/* + * Thread sends answer to the kernel. + */ +static void * +ggate_send_thread(void *arg) +{ + struct hast_resource *res = arg; + struct g_gate_ctl_io *ggio; + struct hio *hio; + unsigned int ii, ncomp, ncomps; + + ncomps = HAST_NCOMPONENTS; + + for (;;) { + pjdlog_debug(2, "ggate_send: Taking request."); + QUEUE_TAKE2(hio, done); + pjdlog_debug(2, "ggate_send: (%p) Got request.", hio); + ggio = &hio->hio_ggio; + for (ii = 0; ii < ncomps; ii++) { + if (hio->hio_errors[ii] == 0) { + /* + * One successful request is enough to declare + * success. + */ + ggio->gctl_error = 0; + break; + } + } + if (ii == ncomps) { + /* + * None of the requests were successful. + * Use first error. + */ + ggio->gctl_error = hio->hio_errors[0]; + } + if (ggio->gctl_error == 0 && ggio->gctl_cmd == BIO_WRITE) { + mtx_lock(&res->hr_amp_lock); + activemap_write_complete(res->hr_amp, + ggio->gctl_offset, ggio->gctl_length); + mtx_unlock(&res->hr_amp_lock); + } + if (ggio->gctl_cmd == BIO_WRITE) { + /* + * Unlock range we locked. + */ + mtx_lock(&range_lock); + rangelock_del(range_regular, ggio->gctl_offset, + ggio->gctl_length); + if (range_sync_wait) + cv_signal(&range_sync_cond); + mtx_unlock(&range_lock); + /* + * Bump local count if this is first write after + * connection failure with remote node. + */ + ncomp = 1; + rw_rlock(&hio_remote_lock[ncomp]); + if (!ISCONNECTED(res, ncomp)) { + mtx_lock(&metadata_lock); + if (res->hr_primary_localcnt == + res->hr_secondary_remotecnt) { + res->hr_primary_localcnt++; + pjdlog_debug(1, + "Increasing localcnt to %ju.", + (uintmax_t)res->hr_primary_localcnt); + (void)metadata_write(res); + } + mtx_unlock(&metadata_lock); + } + rw_unlock(&hio_remote_lock[ncomp]); + } + if (ioctl(res->hr_ggatefd, G_GATE_CMD_DONE, ggio) < 0) + primary_exit(EX_OSERR, "G_GATE_CMD_DONE failed"); + pjdlog_debug(2, + "ggate_send: (%p) Moving request to the free queue.", hio); + QUEUE_INSERT2(hio, free); + } + /* NOTREACHED */ + return (NULL); +} + +/* + * Thread synchronize local and remote components. + */ +static void * +sync_thread(void *arg __unused) +{ + struct hast_resource *res = arg; + struct hio *hio; + struct g_gate_ctl_io *ggio; + unsigned int ii, ncomp, ncomps; + off_t offset, length, synced; + bool dorewind; + int syncext; + + ncomps = HAST_NCOMPONENTS; + dorewind = true; + synced = 0; + + for (;;) { + mtx_lock(&sync_lock); + while (!sync_inprogress) { + dorewind = true; + synced = 0; + cv_wait(&sync_cond, &sync_lock); + } + mtx_unlock(&sync_lock); + /* + * Obtain offset at which we should synchronize. + * Rewind synchronization if needed. + */ + mtx_lock(&res->hr_amp_lock); + if (dorewind) + activemap_sync_rewind(res->hr_amp); + offset = activemap_sync_offset(res->hr_amp, &length, &syncext); + if (syncext != -1) { + /* + * We synchronized entire syncext extent, we can mark + * it as clean now. + */ + if (activemap_extent_complete(res->hr_amp, syncext)) + (void)hast_activemap_flush(res); + } + mtx_unlock(&res->hr_amp_lock); + if (dorewind) { + dorewind = false; + if (offset < 0) + pjdlog_info("Nodes are in sync."); + else { + pjdlog_info("Synchronization started. %ju bytes to go.", + (uintmax_t)(res->hr_extentsize * + activemap_ndirty(res->hr_amp))); + } + } + if (offset < 0) { + mtx_lock(&sync_lock); + sync_inprogress = false; + mtx_unlock(&sync_lock); + pjdlog_debug(1, "Nothing to synchronize."); + /* + * Synchronization complete, make both localcnt and + * remotecnt equal. + */ + ncomp = 1; + rw_rlock(&hio_remote_lock[ncomp]); + if (ISCONNECTED(res, ncomp)) { + if (synced > 0) { + pjdlog_info("Synchronization complete. " + "%jd bytes synchronized.", + (intmax_t)synced); + } + mtx_lock(&metadata_lock); + res->hr_syncsrc = HAST_SYNCSRC_UNDEF; + res->hr_primary_localcnt = + res->hr_secondary_localcnt; + res->hr_primary_remotecnt = + res->hr_secondary_remotecnt; + pjdlog_debug(1, + "Setting localcnt to %ju and remotecnt to %ju.", + (uintmax_t)res->hr_primary_localcnt, + (uintmax_t)res->hr_secondary_localcnt); + (void)metadata_write(res); + mtx_unlock(&metadata_lock); + } else if (synced > 0) { + pjdlog_info("Synchronization interrupted. " + "%jd bytes synchronized so far.", + (intmax_t)synced); + } + rw_unlock(&hio_remote_lock[ncomp]); + continue; + } + pjdlog_debug(2, "sync: Taking free request."); + QUEUE_TAKE2(hio, free); + pjdlog_debug(2, "sync: (%p) Got free request.", hio); + /* + * Lock the range we are going to synchronize. We don't want + * race where someone writes between our read and write. + */ + for (;;) { + mtx_lock(&range_lock); + if (rangelock_islocked(range_regular, offset, length)) { + pjdlog_debug(2, + "sync: Range offset=%jd length=%jd locked.", + (intmax_t)offset, (intmax_t)length); + range_sync_wait = true; + cv_wait(&range_sync_cond, &range_lock); + range_sync_wait = false; + mtx_unlock(&range_lock); + continue; + } + if (rangelock_add(range_sync, offset, length) < 0) { + mtx_unlock(&range_lock); + pjdlog_debug(2, + "sync: Range offset=%jd length=%jd is already locked, waiting.", + (intmax_t)offset, (intmax_t)length); + sleep(1); + continue; + } + mtx_unlock(&range_lock); + break; + } + /* + * First read the data from synchronization source. + */ + SYNCREQ(hio); + ggio = &hio->hio_ggio; + ggio->gctl_cmd = BIO_READ; + ggio->gctl_offset = offset; + ggio->gctl_length = length; + ggio->gctl_error = 0; + for (ii = 0; ii < ncomps; ii++) + hio->hio_errors[ii] = EINVAL; + reqlog(LOG_DEBUG, 2, ggio, "sync: (%p) Sending sync request: ", + hio); + pjdlog_debug(2, "sync: (%p) Moving request to the send queue.", + hio); + mtx_lock(&metadata_lock); + if (res->hr_syncsrc == HAST_SYNCSRC_PRIMARY) { + /* + * This range is up-to-date on local component, + * so handle request locally. + */ + /* Local component is 0 for now. */ + ncomp = 0; + } else /* if (res->hr_syncsrc == HAST_SYNCSRC_SECONDARY) */ { + assert(res->hr_syncsrc == HAST_SYNCSRC_SECONDARY); + /* + * This range is out-of-date on local component, + * so send request to the remote node. + */ + /* Remote component is 1 for now. */ + ncomp = 1; + } + mtx_unlock(&metadata_lock); + refcount_init(&hio->hio_countdown, 1); + QUEUE_INSERT1(hio, send, ncomp); + + /* + * Let's wait for READ to finish. + */ + mtx_lock(&sync_lock); + while (!ISSYNCREQDONE(hio)) + cv_wait(&sync_cond, &sync_lock); + mtx_unlock(&sync_lock); + + if (hio->hio_errors[ncomp] != 0) { + pjdlog_error("Unable to read synchronization data: %s.", + strerror(hio->hio_errors[ncomp])); + goto free_queue; + } + + /* + * We read the data from synchronization source, now write it + * to synchronization target. + */ + SYNCREQ(hio); + ggio->gctl_cmd = BIO_WRITE; + for (ii = 0; ii < ncomps; ii++) + hio->hio_errors[ii] = EINVAL; + reqlog(LOG_DEBUG, 2, ggio, "sync: (%p) Sending sync request: ", + hio); + pjdlog_debug(2, "sync: (%p) Moving request to the send queue.", + hio); + mtx_lock(&metadata_lock); + if (res->hr_syncsrc == HAST_SYNCSRC_PRIMARY) { + /* + * This range is up-to-date on local component, + * so we update remote component. + */ + /* Remote component is 1 for now. */ + ncomp = 1; + } else /* if (res->hr_syncsrc == HAST_SYNCSRC_SECONDARY) */ { + assert(res->hr_syncsrc == HAST_SYNCSRC_SECONDARY); + /* + * This range is out-of-date on local component, + * so we update it. + */ + /* Local component is 0 for now. */ + ncomp = 0; + } + mtx_unlock(&metadata_lock); + + pjdlog_debug(2, "sync: (%p) Moving request to the send queues.", + hio); + refcount_init(&hio->hio_countdown, 1); + QUEUE_INSERT1(hio, send, ncomp); + + /* + * Let's wait for WRITE to finish. + */ + mtx_lock(&sync_lock); + while (!ISSYNCREQDONE(hio)) + cv_wait(&sync_cond, &sync_lock); + mtx_unlock(&sync_lock); + + if (hio->hio_errors[ncomp] != 0) { + pjdlog_error("Unable to write synchronization data: %s.", + strerror(hio->hio_errors[ncomp])); + goto free_queue; + } +free_queue: + mtx_lock(&range_lock); + rangelock_del(range_sync, offset, length); + if (range_regular_wait) + cv_signal(&range_regular_cond); + mtx_unlock(&range_lock); + + synced += length; + + pjdlog_debug(2, "sync: (%p) Moving request to the free queue.", + hio); + QUEUE_INSERT2(hio, free); + } + /* NOTREACHED */ + return (NULL); +} + +static void +sighandler(int sig) +{ + bool unlock; + + switch (sig) { + case SIGINT: + case SIGTERM: + sigexit_received = true; + break; + default: + assert(!"invalid condition"); + } + /* + * XXX: Racy, but if we cannot obtain hio_guard_lock here, we don't + * want to risk deadlock. + */ + unlock = mtx_trylock(&hio_guard_lock); + cv_signal(&hio_guard_cond); + if (unlock) + mtx_unlock(&hio_guard_lock); +} + +/* + * Thread guards remote connections and reconnects when needed, handles + * signals, etc. + */ +static void * +guard_thread(void *arg) +{ + struct hast_resource *res = arg; + unsigned int ii, ncomps; + int timeout; + + ncomps = HAST_NCOMPONENTS; + /* The is only one remote component for now. */ +#define ISREMOTE(no) ((no) == 1) + + for (;;) { + if (sigexit_received) { + primary_exitx(EX_OK, + "Termination signal received, exiting."); + } + /* + * If all the connection will be fine, we will sleep until + * someone wakes us up. + * If any of the connections will be broken and we won't be + * able to connect, we will sleep only for RECONNECT_SLEEP + * seconds so we can retry soon. + */ + timeout = 0; + pjdlog_debug(2, "remote_guard: Checking connections."); + mtx_lock(&hio_guard_lock); + for (ii = 0; ii < ncomps; ii++) { + if (!ISREMOTE(ii)) + continue; + rw_rlock(&hio_remote_lock[ii]); + if (ISCONNECTED(res, ii)) { + assert(res->hr_remotein != NULL); + assert(res->hr_remoteout != NULL); + rw_unlock(&hio_remote_lock[ii]); + pjdlog_debug(2, + "remote_guard: Connection to %s is ok.", + res->hr_remoteaddr); + } else { + assert(res->hr_remotein == NULL); + assert(res->hr_remoteout == NULL); + /* + * Upgrade the lock. It doesn't have to be + * atomic as no other thread can change + * connection status from disconnected to + * connected. + */ + rw_unlock(&hio_remote_lock[ii]); + rw_wlock(&hio_remote_lock[ii]); + assert(res->hr_remotein == NULL); + assert(res->hr_remoteout == NULL); + pjdlog_debug(2, + "remote_guard: Reconnecting to %s.", + res->hr_remoteaddr); + init_remote(res); + if (ISCONNECTED(res, ii)) { + pjdlog_info("Successfully reconnected to %s.", + res->hr_remoteaddr); + } else { + /* Both connections should be NULL. */ + assert(res->hr_remotein == NULL); + assert(res->hr_remoteout == NULL); + pjdlog_debug(2, + "remote_guard: Reconnect to %s failed.", + res->hr_remoteaddr); + timeout = RECONNECT_SLEEP; + } + rw_unlock(&hio_remote_lock[ii]); + } + } + (void)cv_timedwait(&hio_guard_cond, &hio_guard_lock, timeout); + mtx_unlock(&hio_guard_lock); + } +#undef ISREMOTE + /* NOTREACHED */ + return (NULL); +} diff --git a/sbin/hastd/proto.c b/sbin/hastd/proto.c new file mode 100644 index 000000000000..103f20ce9fd7 --- /dev/null +++ b/sbin/hastd/proto.c @@ -0,0 +1,261 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include + +#include "proto.h" +#include "proto_impl.h" + +#define PROTO_CONN_MAGIC 0x907041c +struct proto_conn { + int pc_magic; + struct hast_proto *pc_proto; + void *pc_ctx; + int pc_side; +#define PROTO_SIDE_CLIENT 0 +#define PROTO_SIDE_SERVER_LISTEN 1 +#define PROTO_SIDE_SERVER_WORK 2 +}; + +static LIST_HEAD(, hast_proto) protos = LIST_HEAD_INITIALIZER(protos); + +void +proto_register(struct hast_proto *proto) +{ + + LIST_INSERT_HEAD(&protos, proto, hp_next); +} + +static int +proto_common_setup(const char *addr, struct proto_conn **connp, int side) +{ + struct hast_proto *proto; + struct proto_conn *conn; + void *ctx; + int ret; + + assert(side == PROTO_SIDE_CLIENT || side == PROTO_SIDE_SERVER_LISTEN); + + conn = malloc(sizeof(*conn)); + if (conn == NULL) + return (-1); + + LIST_FOREACH(proto, &protos, hp_next) { + if (side == PROTO_SIDE_CLIENT) + ret = proto->hp_client(addr, &ctx); + else /* if (side == PROTO_SIDE_SERVER_LISTEN) */ + ret = proto->hp_server(addr, &ctx); + /* + * ret == 0 - success + * ret == -1 - addr is not for this protocol + * ret > 0 - right protocol, but an error occured + */ + if (ret >= 0) + break; + } + if (proto == NULL) { + /* Unrecognized address. */ + free(conn); + errno = EINVAL; + return (-1); + } + if (ret > 0) { + /* An error occured. */ + free(conn); + errno = ret; + return (-1); + } + conn->pc_proto = proto; + conn->pc_ctx = ctx; + conn->pc_side = side; + conn->pc_magic = PROTO_CONN_MAGIC; + *connp = conn; + return (0); +} + +int +proto_client(const char *addr, struct proto_conn **connp) +{ + + return (proto_common_setup(addr, connp, PROTO_SIDE_CLIENT)); +} + +int +proto_connect(struct proto_conn *conn) +{ + int ret; + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_side == PROTO_SIDE_CLIENT); + assert(conn->pc_proto != NULL); + + ret = conn->pc_proto->hp_connect(conn->pc_ctx); + if (ret != 0) { + errno = ret; + return (-1); + } + + return (0); +} + +int +proto_server(const char *addr, struct proto_conn **connp) +{ + + return (proto_common_setup(addr, connp, PROTO_SIDE_SERVER_LISTEN)); +} + +int +proto_accept(struct proto_conn *conn, struct proto_conn **newconnp) +{ + struct proto_conn *newconn; + int ret; + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_side == PROTO_SIDE_SERVER_LISTEN); + assert(conn->pc_proto != NULL); + + newconn = malloc(sizeof(*newconn)); + if (newconn == NULL) + return (-1); + + ret = conn->pc_proto->hp_accept(conn->pc_ctx, &newconn->pc_ctx); + if (ret != 0) { + free(newconn); + errno = ret; + return (-1); + } + + newconn->pc_proto = conn->pc_proto; + newconn->pc_side = PROTO_SIDE_SERVER_WORK; + newconn->pc_magic = PROTO_CONN_MAGIC; + *newconnp = newconn; + + return (0); +} + +int +proto_send(struct proto_conn *conn, const void *data, size_t size) +{ + int ret; + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_proto != NULL); + + ret = conn->pc_proto->hp_send(conn->pc_ctx, data, size); + if (ret != 0) { + errno = ret; + return (-1); + } + return (0); +} + +int +proto_recv(struct proto_conn *conn, void *data, size_t size) +{ + int ret; + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_proto != NULL); + + ret = conn->pc_proto->hp_recv(conn->pc_ctx, data, size); + if (ret != 0) { + errno = ret; + return (-1); + } + return (0); +} + +int +proto_descriptor(const struct proto_conn *conn) +{ + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_proto != NULL); + + return (conn->pc_proto->hp_descriptor(conn->pc_ctx)); +} + +bool +proto_address_match(const struct proto_conn *conn, const char *addr) +{ + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_proto != NULL); + + return (conn->pc_proto->hp_address_match(conn->pc_ctx, addr)); +} + +void +proto_local_address(const struct proto_conn *conn, char *addr, size_t size) +{ + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_proto != NULL); + + conn->pc_proto->hp_local_address(conn->pc_ctx, addr, size); +} + +void +proto_remote_address(const struct proto_conn *conn, char *addr, size_t size) +{ + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_proto != NULL); + + conn->pc_proto->hp_remote_address(conn->pc_ctx, addr, size); +} + +void +proto_close(struct proto_conn *conn) +{ + + assert(conn != NULL); + assert(conn->pc_magic == PROTO_CONN_MAGIC); + assert(conn->pc_proto != NULL); + + conn->pc_proto->hp_close(conn->pc_ctx); + conn->pc_magic = 0; + free(conn); +} diff --git a/sbin/hastd/proto.h b/sbin/hastd/proto.h new file mode 100644 index 000000000000..cb196d8da866 --- /dev/null +++ b/sbin/hastd/proto.h @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _PROTO_H_ +#define _PROTO_H_ + +#include /* bool */ +#include /* size_t */ + +struct proto_conn; + +int proto_client(const char *addr, struct proto_conn **connp); +int proto_connect(struct proto_conn *conn); +int proto_server(const char *addr, struct proto_conn **connp); +int proto_accept(struct proto_conn *conn, struct proto_conn **newconnp); +int proto_send(struct proto_conn *conn, const void *data, size_t size); +int proto_recv(struct proto_conn *conn, void *data, size_t size); +int proto_descriptor(const struct proto_conn *conn); +bool proto_address_match(const struct proto_conn *conn, const char *addr); +void proto_local_address(const struct proto_conn *conn, char *addr, + size_t size); +void proto_remote_address(const struct proto_conn *conn, char *addr, + size_t size); +void proto_close(struct proto_conn *conn); + +#endif /* !_PROTO_H_ */ diff --git a/sbin/hastd/proto_common.c b/sbin/hastd/proto_common.c new file mode 100644 index 000000000000..22102d86e823 --- /dev/null +++ b/sbin/hastd/proto_common.c @@ -0,0 +1,85 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include + +#include "proto_impl.h" + +/* Maximum size of packet we want to use when sending data. */ +#ifndef MAX_SEND_SIZE +//#define MAX_SEND_SIZE 32768 +#define MAX_SEND_SIZE 131072 +#endif + +int +proto_common_send(int fd, const unsigned char *data, size_t size) +{ + ssize_t done; + size_t sendsize; + + do { + sendsize = size < MAX_SEND_SIZE ? size : MAX_SEND_SIZE; + done = send(fd, data, sendsize, MSG_NOSIGNAL); + if (done == 0) + return (ENOTCONN); + else if (done < 0) { + if (errno == EAGAIN) + continue; + return (errno); + } + data += done; + size -= done; + } while (size > 0); + + return (0); +} + +int +proto_common_recv(int fd, unsigned char *data, size_t size) +{ + ssize_t done; + + do { + done = recv(fd, data, size, MSG_WAITALL); + } while (done == -1 && errno == EAGAIN); + if (done == 0) + return (ENOTCONN); + else if (done < 0) + return (errno); + return (0); +} diff --git a/sbin/hastd/proto_impl.h b/sbin/hastd/proto_impl.h new file mode 100644 index 000000000000..ea6548d58042 --- /dev/null +++ b/sbin/hastd/proto_impl.h @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _PROTO_IMPL_H_ +#define _PROTO_IMPL_H_ + +#include + +#include /* bool */ +#include /* size_t */ + +#define __constructor __attribute__((constructor)) + +typedef int hp_client_t(const char *, void **); +typedef int hp_connect_t(void *); +typedef int hp_server_t(const char *, void **); +typedef int hp_accept_t(void *, void **); +typedef int hp_send_t(void *, const unsigned char *, size_t); +typedef int hp_recv_t(void *, unsigned char *, size_t); +typedef int hp_descriptor_t(const void *); +typedef bool hp_address_match_t(const void *, const char *); +typedef void hp_local_address_t(const void *, char *, size_t); +typedef void hp_remote_address_t(const void *, char *, size_t); +typedef void hp_close_t(void *); + +struct hast_proto { + const char *hp_name; + hp_client_t *hp_client; + hp_connect_t *hp_connect; + hp_server_t *hp_server; + hp_accept_t *hp_accept; + hp_send_t *hp_send; + hp_recv_t *hp_recv; + hp_descriptor_t *hp_descriptor; + hp_address_match_t *hp_address_match; + hp_local_address_t *hp_local_address; + hp_remote_address_t *hp_remote_address; + hp_close_t *hp_close; + LIST_ENTRY(hast_proto) hp_next; +}; + +void proto_register(struct hast_proto *proto); + +int proto_common_send(int fd, const unsigned char *data, size_t size); +int proto_common_recv(int fd, unsigned char *data, size_t size); + +#endif /* !_PROTO_IMPL_H_ */ diff --git a/sbin/hastd/proto_socketpair.c b/sbin/hastd/proto_socketpair.c new file mode 100644 index 000000000000..08d0c667a069 --- /dev/null +++ b/sbin/hastd/proto_socketpair.c @@ -0,0 +1,275 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "hast.h" +#include "proto_impl.h" + +#define SP_CTX_MAGIC 0x50c3741 +struct sp_ctx { + int sp_magic; + int sp_fd[2]; + int sp_side; +#define SP_SIDE_UNDEF 0 +#define SP_SIDE_CLIENT 1 +#define SP_SIDE_SERVER 2 +}; + +static void sp_close(void *ctx); + +static int +sp_client(const char *addr, void **ctxp) +{ + struct sp_ctx *spctx; + int ret; + + if (strcmp(addr, "socketpair://") != 0) + return (-1); + + spctx = malloc(sizeof(*spctx)); + if (spctx == NULL) + return (errno); + + if (socketpair(PF_UNIX, SOCK_STREAM, 0, spctx->sp_fd) < 0) { + ret = errno; + free(spctx); + return (ret); + } + + spctx->sp_side = SP_SIDE_UNDEF; + spctx->sp_magic = SP_CTX_MAGIC; + *ctxp = spctx; + + return (0); +} + +static int +sp_connect(void *ctx __unused) +{ + + assert(!"proto_connect() not supported on socketpairs"); + abort(); +} + +static int +sp_server(const char *addr, void **ctxp __unused) +{ + + if (strcmp(addr, "socketpair://") != 0) + return (-1); + + assert(!"proto_server() not supported on socketpairs"); + abort(); +} + +static int +sp_accept(void *ctx __unused, void **newctxp __unused) +{ + + assert(!"proto_server() not supported on socketpairs"); + abort(); +} + +static int +sp_send(void *ctx, const unsigned char *data, size_t size) +{ + struct sp_ctx *spctx = ctx; + int fd; + + assert(spctx != NULL); + assert(spctx->sp_magic == SP_CTX_MAGIC); + + switch (spctx->sp_side) { + case SP_SIDE_UNDEF: + /* + * If the first operation done by the caller is proto_send(), + * we assume this the client. + */ + /* FALLTHROUGH */ + spctx->sp_side = SP_SIDE_CLIENT; + /* Close other end. */ + close(spctx->sp_fd[1]); + case SP_SIDE_CLIENT: + assert(spctx->sp_fd[0] >= 0); + fd = spctx->sp_fd[0]; + break; + case SP_SIDE_SERVER: + assert(spctx->sp_fd[1] >= 0); + fd = spctx->sp_fd[1]; + break; + default: + abort(); + } + + return (proto_common_send(fd, data, size)); +} + +static int +sp_recv(void *ctx, unsigned char *data, size_t size) +{ + struct sp_ctx *spctx = ctx; + int fd; + + assert(spctx != NULL); + assert(spctx->sp_magic == SP_CTX_MAGIC); + + switch (spctx->sp_side) { + case SP_SIDE_UNDEF: + /* + * If the first operation done by the caller is proto_recv(), + * we assume this the server. + */ + /* FALLTHROUGH */ + spctx->sp_side = SP_SIDE_SERVER; + /* Close other end. */ + close(spctx->sp_fd[0]); + case SP_SIDE_SERVER: + assert(spctx->sp_fd[1] >= 0); + fd = spctx->sp_fd[1]; + break; + case SP_SIDE_CLIENT: + assert(spctx->sp_fd[0] >= 0); + fd = spctx->sp_fd[0]; + break; + default: + abort(); + } + + return (proto_common_recv(fd, data, size)); +} + +static int +sp_descriptor(const void *ctx) +{ + const struct sp_ctx *spctx = ctx; + + assert(spctx != NULL); + assert(spctx->sp_magic == SP_CTX_MAGIC); + assert(spctx->sp_side == SP_SIDE_CLIENT || + spctx->sp_side == SP_SIDE_SERVER); + + switch (spctx->sp_side) { + case SP_SIDE_CLIENT: + assert(spctx->sp_fd[0] >= 0); + return (spctx->sp_fd[0]); + case SP_SIDE_SERVER: + assert(spctx->sp_fd[1] >= 0); + return (spctx->sp_fd[1]); + } + + abort(); +} + +static bool +sp_address_match(const void *ctx __unused, const char *addr __unused) +{ + + assert(!"proto_address_match() not supported on socketpairs"); + abort(); +} + +static void +sp_local_address(const void *ctx __unused, char *addr __unused, + size_t size __unused) +{ + + assert(!"proto_local_address() not supported on socketpairs"); + abort(); +} + +static void +sp_remote_address(const void *ctx __unused, char *addr __unused, + size_t size __unused) +{ + + assert(!"proto_remote_address() not supported on socketpairs"); + abort(); +} + +static void +sp_close(void *ctx) +{ + struct sp_ctx *spctx = ctx; + + assert(spctx != NULL); + assert(spctx->sp_magic == SP_CTX_MAGIC); + + switch (spctx->sp_side) { + case SP_SIDE_UNDEF: + close(spctx->sp_fd[0]); + close(spctx->sp_fd[1]); + break; + case SP_SIDE_CLIENT: + close(spctx->sp_fd[0]); + break; + case SP_SIDE_SERVER: + close(spctx->sp_fd[1]); + break; + default: + abort(); + } + + spctx->sp_magic = 0; + free(spctx); +} + +static struct hast_proto sp_proto = { + .hp_name = "socketpair", + .hp_client = sp_client, + .hp_connect = sp_connect, + .hp_server = sp_server, + .hp_accept = sp_accept, + .hp_send = sp_send, + .hp_recv = sp_recv, + .hp_descriptor = sp_descriptor, + .hp_address_match = sp_address_match, + .hp_local_address = sp_local_address, + .hp_remote_address = sp_remote_address, + .hp_close = sp_close +}; + +static __constructor void +sp_ctor(void) +{ + + proto_register(&sp_proto); +} diff --git a/sbin/hastd/proto_tcp4.c b/sbin/hastd/proto_tcp4.c new file mode 100644 index 000000000000..2fba9967e400 --- /dev/null +++ b/sbin/hastd/proto_tcp4.c @@ -0,0 +1,447 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include /* MAXHOSTNAMELEN */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hast.h" +#include "pjdlog.h" +#include "proto_impl.h" + +#define TCP4_CTX_MAGIC 0x7c441c +struct tcp4_ctx { + int tc_magic; + struct sockaddr_in tc_sin; + int tc_fd; + int tc_side; +#define TCP4_SIDE_CLIENT 0 +#define TCP4_SIDE_SERVER_LISTEN 1 +#define TCP4_SIDE_SERVER_WORK 2 +}; + +static void tcp4_close(void *ctx); + +static in_addr_t +str2ip(const char *str) +{ + struct hostent *hp; + in_addr_t ip; + + ip = inet_addr(str); + if (ip != INADDR_NONE) { + /* It is a valid IP address. */ + return (ip); + } + /* Check if it is a valid host name. */ + hp = gethostbyname(str); + if (hp == NULL) + return (INADDR_NONE); + return (((struct in_addr *)(void *)hp->h_addr)->s_addr); +} + +/* + * Function converts the given string to unsigned number. + */ +static int +numfromstr(const char *str, intmax_t minnum, intmax_t maxnum, intmax_t *nump) +{ + intmax_t digit, num; + + if (str[0] == '\0') + goto invalid; /* Empty string. */ + num = 0; + for (; *str != '\0'; str++) { + if (*str < '0' || *str > '9') + goto invalid; /* Non-digit character. */ + digit = *str - '0'; + if (num > num * 10 + digit) + goto invalid; /* Overflow. */ + num = num * 10 + digit; + if (num > maxnum) + goto invalid; /* Too big. */ + } + if (num < minnum) + goto invalid; /* Too small. */ + *nump = num; + return (0); +invalid: + errno = EINVAL; + return (-1); +} + +static int +tcp4_addr(const char *addr, struct sockaddr_in *sinp) +{ + char iporhost[MAXHOSTNAMELEN]; + const char *pp; + size_t size; + in_addr_t ip; + + if (addr == NULL) + return (-1); + + if (strncasecmp(addr, "tcp4://", 7) == 0) + addr += 7; + else if (strncasecmp(addr, "tcp://", 6) == 0) + addr += 6; + else if (addr[0] != '/' && /* If this is not path... */ + strstr(addr, "://") == NULL)/* ...and has no prefix... */ + ; /* ...tcp4 is the default. */ + else + return (-1); + + sinp->sin_family = AF_INET; + sinp->sin_len = sizeof(*sinp); + /* Extract optional port. */ + pp = strrchr(addr, ':'); + if (pp == NULL) { + /* Port not given, use the default. */ + sinp->sin_port = htons(HASTD_PORT); + } else { + intmax_t port; + + if (numfromstr(pp + 1, 1, 65535, &port) < 0) + return (errno); + sinp->sin_port = htons(port); + } + /* Extract host name or IP address. */ + if (pp == NULL) { + size = sizeof(iporhost); + if (strlcpy(iporhost, addr, size) >= size) + return (ENAMETOOLONG); + } else { + size = (size_t)(pp - addr + 1); + if (size > sizeof(iporhost)) + return (ENAMETOOLONG); + strlcpy(iporhost, addr, size); + } + /* Convert string (IP address or host name) to in_addr_t. */ + ip = str2ip(iporhost); + if (ip == INADDR_NONE) + return (EINVAL); + sinp->sin_addr.s_addr = ip; + + return (0); +} + +static int +tcp4_common_setup(const char *addr, void **ctxp, int side) +{ + struct tcp4_ctx *tctx; + int ret, val; + + tctx = malloc(sizeof(*tctx)); + if (tctx == NULL) + return (errno); + + /* Parse given address. */ + if ((ret = tcp4_addr(addr, &tctx->tc_sin)) != 0) { + free(tctx); + return (ret); + } + + tctx->tc_fd = socket(AF_INET, SOCK_STREAM, 0); + if (tctx->tc_fd == -1) { + ret = errno; + free(tctx); + return (ret); + } + + /* Socket settings. */ + val = 1; + if (setsockopt(tctx->tc_fd, IPPROTO_TCP, TCP_NODELAY, &val, + sizeof(val)) == -1) { + pjdlog_warning("Unable to set TCP_NOELAY on %s", addr); + } + val = 131072; + if (setsockopt(tctx->tc_fd, SOL_SOCKET, SO_SNDBUF, &val, + sizeof(val)) == -1) { + pjdlog_warning("Unable to set send buffer size on %s", addr); + } + val = 131072; + if (setsockopt(tctx->tc_fd, SOL_SOCKET, SO_RCVBUF, &val, + sizeof(val)) == -1) { + pjdlog_warning("Unable to set receive buffer size on %s", addr); + } + + tctx->tc_side = side; + tctx->tc_magic = TCP4_CTX_MAGIC; + *ctxp = tctx; + + return (0); +} + +static int +tcp4_client(const char *addr, void **ctxp) +{ + + return (tcp4_common_setup(addr, ctxp, TCP4_SIDE_CLIENT)); +} + +static int +tcp4_connect(void *ctx) +{ + struct tcp4_ctx *tctx = ctx; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + assert(tctx->tc_side == TCP4_SIDE_CLIENT); + assert(tctx->tc_fd >= 0); + + if (connect(tctx->tc_fd, (struct sockaddr *)&tctx->tc_sin, + sizeof(tctx->tc_sin)) < 0) { + return (errno); + } + + return (0); +} + +static int +tcp4_server(const char *addr, void **ctxp) +{ + struct tcp4_ctx *tctx; + int ret, val; + + ret = tcp4_common_setup(addr, ctxp, TCP4_SIDE_SERVER_LISTEN); + if (ret != 0) + return (ret); + + tctx = *ctxp; + + val = 1; + /* Ignore failure. */ + (void)setsockopt(tctx->tc_fd, SOL_SOCKET, SO_REUSEADDR, &val, + sizeof(val)); + + if (bind(tctx->tc_fd, (struct sockaddr *)&tctx->tc_sin, + sizeof(tctx->tc_sin)) < 0) { + ret = errno; + tcp4_close(tctx); + return (ret); + } + if (listen(tctx->tc_fd, 8) < 0) { + ret = errno; + tcp4_close(tctx); + return (ret); + } + + return (0); +} + +static int +tcp4_accept(void *ctx, void **newctxp) +{ + struct tcp4_ctx *tctx = ctx; + struct tcp4_ctx *newtctx; + socklen_t fromlen; + int ret; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + assert(tctx->tc_side == TCP4_SIDE_SERVER_LISTEN); + assert(tctx->tc_fd >= 0); + + newtctx = malloc(sizeof(*newtctx)); + if (newtctx == NULL) + return (errno); + + fromlen = sizeof(tctx->tc_sin); + newtctx->tc_fd = accept(tctx->tc_fd, (struct sockaddr *)&tctx->tc_sin, + &fromlen); + if (newtctx->tc_fd < 0) { + ret = errno; + free(newtctx); + return (ret); + } + + newtctx->tc_side = TCP4_SIDE_SERVER_WORK; + newtctx->tc_magic = TCP4_CTX_MAGIC; + *newctxp = newtctx; + + return (0); +} + +static int +tcp4_send(void *ctx, const unsigned char *data, size_t size) +{ + struct tcp4_ctx *tctx = ctx; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + assert(tctx->tc_fd >= 0); + + return (proto_common_send(tctx->tc_fd, data, size)); +} + +static int +tcp4_recv(void *ctx, unsigned char *data, size_t size) +{ + struct tcp4_ctx *tctx = ctx; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + assert(tctx->tc_fd >= 0); + + return (proto_common_recv(tctx->tc_fd, data, size)); +} + +static int +tcp4_descriptor(const void *ctx) +{ + const struct tcp4_ctx *tctx = ctx; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + + return (tctx->tc_fd); +} + +static void +sin2str(struct sockaddr_in *sinp, char *addr, size_t size) +{ + in_addr_t ip; + unsigned int port; + + assert(addr != NULL); + assert(sinp->sin_family == AF_INET); + + ip = ntohl(sinp->sin_addr.s_addr); + port = ntohs(sinp->sin_port); + snprintf(addr, size, "tcp4://%u.%u.%u.%u:%u", ((ip >> 24) & 0xff), + ((ip >> 16) & 0xff), ((ip >> 8) & 0xff), (ip & 0xff), port); +} + +static bool +tcp4_address_match(const void *ctx, const char *addr) +{ + const struct tcp4_ctx *tctx = ctx; + struct sockaddr_in sin; + socklen_t sinlen; + in_addr_t ip1, ip2; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + + if (tcp4_addr(addr, &sin) != 0) + return (false); + ip1 = sin.sin_addr.s_addr; + + sinlen = sizeof(sin); + if (getpeername(tctx->tc_fd, (struct sockaddr *)&sin, &sinlen) < 0) + return (false); + ip2 = sin.sin_addr.s_addr; + + return (ip1 == ip2); +} + +static void +tcp4_local_address(const void *ctx, char *addr, size_t size) +{ + const struct tcp4_ctx *tctx = ctx; + struct sockaddr_in sin; + socklen_t sinlen; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + + sinlen = sizeof(sin); + if (getsockname(tctx->tc_fd, (struct sockaddr *)&sin, &sinlen) < 0) { + strlcpy(addr, "N/A", size); + return; + } + sin2str(&sin, addr, size); +} + +static void +tcp4_remote_address(const void *ctx, char *addr, size_t size) +{ + const struct tcp4_ctx *tctx = ctx; + struct sockaddr_in sin; + socklen_t sinlen; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + + sinlen = sizeof(sin); + if (getpeername(tctx->tc_fd, (struct sockaddr *)&sin, &sinlen) < 0) { + strlcpy(addr, "N/A", size); + return; + } + sin2str(&sin, addr, size); +} + +static void +tcp4_close(void *ctx) +{ + struct tcp4_ctx *tctx = ctx; + + assert(tctx != NULL); + assert(tctx->tc_magic == TCP4_CTX_MAGIC); + + if (tctx->tc_fd >= 0) + close(tctx->tc_fd); + tctx->tc_magic = 0; + free(tctx); +} + +static struct hast_proto tcp4_proto = { + .hp_name = "tcp4", + .hp_client = tcp4_client, + .hp_connect = tcp4_connect, + .hp_server = tcp4_server, + .hp_accept = tcp4_accept, + .hp_send = tcp4_send, + .hp_recv = tcp4_recv, + .hp_descriptor = tcp4_descriptor, + .hp_address_match = tcp4_address_match, + .hp_local_address = tcp4_local_address, + .hp_remote_address = tcp4_remote_address, + .hp_close = tcp4_close +}; + +static __constructor void +tcp4_ctor(void) +{ + + proto_register(&tcp4_proto); +} diff --git a/sbin/hastd/proto_uds.c b/sbin/hastd/proto_uds.c new file mode 100644 index 000000000000..0fac82f24d06 --- /dev/null +++ b/sbin/hastd/proto_uds.c @@ -0,0 +1,330 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +/* UDS - UNIX Domain Socket */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "hast.h" +#include "proto_impl.h" + +#define UDS_CTX_MAGIC 0xd541c +struct uds_ctx { + int uc_magic; + struct sockaddr_un uc_sun; + int uc_fd; + int uc_side; +#define UDS_SIDE_CLIENT 0 +#define UDS_SIDE_SERVER_LISTEN 1 +#define UDS_SIDE_SERVER_WORK 2 +}; + +static void uds_close(void *ctx); + +static int +uds_addr(const char *addr, struct sockaddr_un *sunp) +{ + + if (addr == NULL) + return (-1); + + if (strncasecmp(addr, "uds://", 6) == 0) + addr += 6; + else if (strncasecmp(addr, "unix://", 7) == 0) + addr += 7; + else if (addr[0] == '/' && /* If it starts from /... */ + strstr(addr, "://") == NULL)/* ...and there is no prefix... */ + ; /* ...we assume its us. */ + else + return (-1); + + sunp->sun_family = AF_UNIX; + if (strlcpy(sunp->sun_path, addr, sizeof(sunp->sun_path)) >= + sizeof(sunp->sun_path)) { + return (ENAMETOOLONG); + } + sunp->sun_len = SUN_LEN(sunp); + + return (0); +} + +static int +uds_common_setup(const char *addr, void **ctxp, int side) +{ + struct uds_ctx *uctx; + int ret; + + uctx = malloc(sizeof(*uctx)); + if (uctx == NULL) + return (errno); + + /* Parse given address. */ + if ((ret = uds_addr(addr, &uctx->uc_sun)) != 0) { + free(uctx); + return (ret); + } + + uctx->uc_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (uctx->uc_fd == -1) { + ret = errno; + free(uctx); + return (ret); + } + + uctx->uc_side = side; + uctx->uc_magic = UDS_CTX_MAGIC; + *ctxp = uctx; + + return (0); +} + +static int +uds_client(const char *addr, void **ctxp) +{ + + return (uds_common_setup(addr, ctxp, UDS_SIDE_CLIENT)); +} + +static int +uds_connect(void *ctx) +{ + struct uds_ctx *uctx = ctx; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + assert(uctx->uc_side == UDS_SIDE_CLIENT); + assert(uctx->uc_fd >= 0); + + if (connect(uctx->uc_fd, (struct sockaddr *)&uctx->uc_sun, + sizeof(uctx->uc_sun)) < 0) { + return (errno); + } + + return (0); +} + +static int +uds_server(const char *addr, void **ctxp) +{ + struct uds_ctx *uctx; + int ret; + + ret = uds_common_setup(addr, ctxp, UDS_SIDE_SERVER_LISTEN); + if (ret != 0) + return (ret); + + uctx = *ctxp; + + unlink(uctx->uc_sun.sun_path); + if (bind(uctx->uc_fd, (struct sockaddr *)&uctx->uc_sun, + sizeof(uctx->uc_sun)) < 0) { + ret = errno; + uds_close(uctx); + return (ret); + } + if (listen(uctx->uc_fd, 8) < 0) { + ret = errno; + uds_close(uctx); + return (ret); + } + + return (0); +} + +static int +uds_accept(void *ctx, void **newctxp) +{ + struct uds_ctx *uctx = ctx; + struct uds_ctx *newuctx; + socklen_t fromlen; + int ret; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + assert(uctx->uc_side == UDS_SIDE_SERVER_LISTEN); + assert(uctx->uc_fd >= 0); + + newuctx = malloc(sizeof(*newuctx)); + if (newuctx == NULL) + return (errno); + + fromlen = sizeof(uctx->uc_sun); + newuctx->uc_fd = accept(uctx->uc_fd, (struct sockaddr *)&uctx->uc_sun, + &fromlen); + if (newuctx->uc_fd < 0) { + ret = errno; + free(newuctx); + return (ret); + } + + newuctx->uc_side = UDS_SIDE_SERVER_WORK; + newuctx->uc_magic = UDS_CTX_MAGIC; + *newctxp = newuctx; + + return (0); +} + +static int +uds_send(void *ctx, const unsigned char *data, size_t size) +{ + struct uds_ctx *uctx = ctx; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + assert(uctx->uc_fd >= 0); + + return (proto_common_send(uctx->uc_fd, data, size)); +} + +static int +uds_recv(void *ctx, unsigned char *data, size_t size) +{ + struct uds_ctx *uctx = ctx; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + assert(uctx->uc_fd >= 0); + + return (proto_common_recv(uctx->uc_fd, data, size)); +} + +static int +uds_descriptor(const void *ctx) +{ + const struct uds_ctx *uctx = ctx; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + + return (uctx->uc_fd); +} + +static bool +uds_address_match(const void *ctx __unused, const char *addr __unused) +{ + + assert(!"proto_address_match() not supported on UNIX domain sockets"); + abort(); +} + +static void +uds_local_address(const void *ctx, char *addr, size_t size) +{ + const struct uds_ctx *uctx = ctx; + struct sockaddr_un sun; + socklen_t sunlen; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + assert(addr != NULL); + + sunlen = sizeof(sun); + if (getsockname(uctx->uc_fd, (struct sockaddr *)&sun, &sunlen) < 0) { + strlcpy(addr, "N/A", size); + return; + } + assert(sun.sun_family == AF_UNIX); + if (sun.sun_path[0] == '\0') { + strlcpy(addr, "N/A", size); + return; + } + snprintf(addr, size, "uds://%s", sun.sun_path); +} + +static void +uds_remote_address(const void *ctx, char *addr, size_t size) +{ + const struct uds_ctx *uctx = ctx; + struct sockaddr_un sun; + socklen_t sunlen; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + assert(addr != NULL); + + sunlen = sizeof(sun); + if (getpeername(uctx->uc_fd, (struct sockaddr *)&sun, &sunlen) < 0) { + strlcpy(addr, "N/A", size); + return; + } + assert(sun.sun_family == AF_UNIX); + if (sun.sun_path[0] == '\0') { + strlcpy(addr, "N/A", size); + return; + } + snprintf(addr, size, "uds://%s", sun.sun_path); +} + +static void +uds_close(void *ctx) +{ + struct uds_ctx *uctx = ctx; + + assert(uctx != NULL); + assert(uctx->uc_magic == UDS_CTX_MAGIC); + + if (uctx->uc_fd >= 0) + close(uctx->uc_fd); + unlink(uctx->uc_sun.sun_path); + uctx->uc_magic = 0; + free(uctx); +} + +static struct hast_proto uds_proto = { + .hp_name = "uds", + .hp_client = uds_client, + .hp_connect = uds_connect, + .hp_server = uds_server, + .hp_accept = uds_accept, + .hp_send = uds_send, + .hp_recv = uds_recv, + .hp_descriptor = uds_descriptor, + .hp_address_match = uds_address_match, + .hp_local_address = uds_local_address, + .hp_remote_address = uds_remote_address, + .hp_close = uds_close +}; + +static __constructor void +uds_ctor(void) +{ + + proto_register(&uds_proto); +} diff --git a/sbin/hastd/rangelock.c b/sbin/hastd/rangelock.c new file mode 100644 index 000000000000..02247d6e3b41 --- /dev/null +++ b/sbin/hastd/rangelock.c @@ -0,0 +1,137 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include + +#include "rangelock.h" + +#define RANGELOCKS_MAGIC 0x94310c +struct rangelocks { + int rls_magic; /* Magic value. */ + TAILQ_HEAD(, rlock) rls_locks; /* List of locked ranges. */ +}; + +struct rlock { + off_t rl_start; + off_t rl_end; + TAILQ_ENTRY(rlock) rl_next; +}; + +int +rangelock_init(struct rangelocks **rlsp) +{ + struct rangelocks *rls; + + assert(rlsp != NULL); + + rls = malloc(sizeof(*rls)); + if (rls == NULL) + return (-1); + + TAILQ_INIT(&rls->rls_locks); + + rls->rls_magic = RANGELOCKS_MAGIC; + *rlsp = rls; + + return (0); +} + +void +rangelock_free(struct rangelocks *rls) +{ + struct rlock *rl; + + assert(rls->rls_magic == RANGELOCKS_MAGIC); + + rls->rls_magic = 0; + + while ((rl = TAILQ_FIRST(&rls->rls_locks)) != NULL) { + TAILQ_REMOVE(&rls->rls_locks, rl, rl_next); + free(rl); + } + free(rls); +} + +int +rangelock_add(struct rangelocks *rls, off_t offset, off_t length) +{ + struct rlock *rl; + + assert(rls->rls_magic == RANGELOCKS_MAGIC); + + rl = malloc(sizeof(*rl)); + if (rl == NULL) + return (-1); + rl->rl_start = offset; + rl->rl_end = offset + length; + TAILQ_INSERT_TAIL(&rls->rls_locks, rl, rl_next); + return (0); +} + +void +rangelock_del(struct rangelocks *rls, off_t offset, off_t length) +{ + struct rlock *rl; + + assert(rls->rls_magic == RANGELOCKS_MAGIC); + + TAILQ_FOREACH(rl, &rls->rls_locks, rl_next) { + if (rl->rl_start == offset && rl->rl_end == offset + length) + break; + } + assert(rl != NULL); + TAILQ_REMOVE(&rls->rls_locks, rl, rl_next); + free(rl); +} + +bool +rangelock_islocked(struct rangelocks *rls, off_t offset, off_t length) +{ + struct rlock *rl; + + assert(rls->rls_magic == RANGELOCKS_MAGIC); + + TAILQ_FOREACH(rl, &rls->rls_locks, rl_next) { + if (rl->rl_start >= offset && rl->rl_start < offset + length) + break; + else if (rl->rl_end > offset && rl->rl_end <= offset + length) + break; + else if (rl->rl_start < offset && rl->rl_end > offset + length) + break; + } + return (rl != NULL); +} diff --git a/sbin/hastd/rangelock.h b/sbin/hastd/rangelock.h new file mode 100644 index 000000000000..2ad9895c5079 --- /dev/null +++ b/sbin/hastd/rangelock.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _RANGELOCK_H_ +#define _RANGELOCK_H_ + +#include +#include + +struct rangelocks; + +int rangelock_init(struct rangelocks **rlsp); +void rangelock_free(struct rangelocks *rls); +int rangelock_add(struct rangelocks *rls, off_t offset, off_t length); +void rangelock_del(struct rangelocks *rls, off_t offset, off_t length); +bool rangelock_islocked(struct rangelocks *rls, off_t offset, off_t length); + +#endif /* !_RANGELOCK_H_ */ diff --git a/sbin/hastd/secondary.c b/sbin/hastd/secondary.c new file mode 100644 index 000000000000..6af95b5d69e0 --- /dev/null +++ b/sbin/hastd/secondary.c @@ -0,0 +1,697 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "control.h" +#include "hast.h" +#include "hast_proto.h" +#include "hastd.h" +#include "metadata.h" +#include "proto.h" +#include "subr.h" +#include "synch.h" + +struct hio { + uint64_t hio_seq; + int hio_error; + struct nv *hio_nv; + void *hio_data; + uint8_t hio_cmd; + uint64_t hio_offset; + uint64_t hio_length; + TAILQ_ENTRY(hio) hio_next; +}; + +/* + * Free list holds unused structures. When free list is empty, we have to wait + * until some in-progress requests are freed. + */ +static TAILQ_HEAD(, hio) hio_free_list; +static pthread_mutex_t hio_free_list_lock; +static pthread_cond_t hio_free_list_cond; +/* + * Disk thread (the one that do I/O requests) takes requests from this list. + */ +static TAILQ_HEAD(, hio) hio_disk_list; +static pthread_mutex_t hio_disk_list_lock; +static pthread_cond_t hio_disk_list_cond; +/* + * There is one recv list for every component, although local components don't + * use recv lists as local requests are done synchronously. + */ +static TAILQ_HEAD(, hio) hio_send_list; +static pthread_mutex_t hio_send_list_lock; +static pthread_cond_t hio_send_list_cond; + +/* + * Maximum number of outstanding I/O requests. + */ +#define HAST_HIO_MAX 256 + +static void *recv_thread(void *arg); +static void *disk_thread(void *arg); +static void *send_thread(void *arg); + +static void +init_environment(void) +{ + struct hio *hio; + unsigned int ii; + + /* + * Initialize lists, their locks and theirs condition variables. + */ + TAILQ_INIT(&hio_free_list); + mtx_init(&hio_free_list_lock); + cv_init(&hio_free_list_cond); + TAILQ_INIT(&hio_disk_list); + mtx_init(&hio_disk_list_lock); + cv_init(&hio_disk_list_cond); + TAILQ_INIT(&hio_send_list); + mtx_init(&hio_send_list_lock); + cv_init(&hio_send_list_cond); + + /* + * Allocate requests pool and initialize requests. + */ + for (ii = 0; ii < HAST_HIO_MAX; ii++) { + hio = malloc(sizeof(*hio)); + if (hio == NULL) { + errx(EX_TEMPFAIL, "cannot allocate %zu bytes of memory " + "for hio request", sizeof(*hio)); + } + hio->hio_error = 0; + hio->hio_data = malloc(MAXPHYS); + if (hio->hio_data == NULL) { + errx(EX_TEMPFAIL, "cannot allocate %zu bytes of memory " + "for gctl_data", (size_t)MAXPHYS); + } + TAILQ_INSERT_HEAD(&hio_free_list, hio, hio_next); + } +} + +static void +init_local(struct hast_resource *res) +{ + + if (metadata_read(res, true) < 0) + exit(EX_NOINPUT); +} + +static void +init_remote(struct hast_resource *res, struct nv *nvin) +{ + uint64_t resuid; + struct nv *nvout; + unsigned char *map; + size_t mapsize; + + map = NULL; + mapsize = 0; + nvout = nv_alloc(); + nv_add_int64(nvout, (int64_t)res->hr_datasize, "datasize"); + nv_add_int32(nvout, (int32_t)res->hr_extentsize, "extentsize"); + resuid = nv_get_uint64(nvin, "resuid"); + res->hr_primary_localcnt = nv_get_uint64(nvin, "localcnt"); + res->hr_primary_remotecnt = nv_get_uint64(nvin, "remotecnt"); + nv_add_uint64(nvout, res->hr_secondary_localcnt, "localcnt"); + nv_add_uint64(nvout, res->hr_secondary_remotecnt, "remotecnt"); + mapsize = activemap_calc_ondisk_size(res->hr_local_mediasize - + METADATA_SIZE, res->hr_extentsize, res->hr_local_sectorsize); + map = malloc(mapsize); + if (map == NULL) { + pjdlog_exitx(EX_TEMPFAIL, + "Unable to allocate memory (%zu bytes) for activemap.", + mapsize); + } + nv_add_uint32(nvout, (uint32_t)mapsize, "mapsize"); + /* + * When we work as primary and secondary is missing we will increase + * localcnt in our metadata. When secondary is connected and synced + * we make localcnt be equal to remotecnt, which means nodes are more + * or less in sync. + * Split-brain condition is when both nodes are not able to communicate + * and are both configured as primary nodes. In turn, they can both + * make incompatible changes to the data and we have to detect that. + * Under split-brain condition we will increase our localcnt on first + * write and remote node will increase its localcnt on first write. + * When we connect we can see that primary's localcnt is greater than + * our remotecnt (primary was modified while we weren't watching) and + * our localcnt is greater than primary's remotecnt (we were modified + * while primary wasn't watching). + * There are many possible combinations which are all gathered below. + * Don't pay too much attention to exact numbers, the more important + * is to compare them. We compare secondary's local with primary's + * remote and secondary's remote with primary's local. + * Note that every case where primary's localcnt is smaller than + * secondary's remotecnt and where secondary's localcnt is smaller than + * primary's remotecnt should be impossible in practise. We will perform + * full synchronization then. Those cases are marked with an asterisk. + * Regular synchronization means that only extents marked as dirty are + * synchronized (regular synchronization). + * + * SECONDARY METADATA PRIMARY METADATA + * local=3 remote=3 local=2 remote=2* ?! Full sync from secondary. + * local=3 remote=3 local=2 remote=3* ?! Full sync from primary. + * local=3 remote=3 local=2 remote=4* ?! Full sync from primary. + * local=3 remote=3 local=3 remote=2 Primary is out-of-date, + * regular sync from secondary. + * local=3 remote=3 local=3 remote=3 Regular sync just in case. + * local=3 remote=3 local=3 remote=4* ?! Full sync from primary. + * local=3 remote=3 local=4 remote=2 Split-brain condition. + * local=3 remote=3 local=4 remote=3 Secondary out-of-date, + * regular sync from primary. + * local=3 remote=3 local=4 remote=4* ?! Full sync from primary. + */ + if (res->hr_resuid == 0) { + /* + * Provider is used for the first time. Initialize everything. + */ + assert(res->hr_secondary_localcnt == 0); + res->hr_resuid = resuid; + if (metadata_write(res) < 0) + exit(EX_NOINPUT); + memset(map, 0xff, mapsize); + nv_add_uint8(nvout, HAST_SYNCSRC_PRIMARY, "syncsrc"); + } else if ( + /* Is primary is out-of-date? */ + (res->hr_secondary_localcnt > res->hr_primary_remotecnt && + res->hr_secondary_remotecnt == res->hr_primary_localcnt) || + /* Node are more or less in sync? */ + (res->hr_secondary_localcnt == res->hr_primary_remotecnt && + res->hr_secondary_remotecnt == res->hr_primary_localcnt) || + /* Is secondary is out-of-date? */ + (res->hr_secondary_localcnt == res->hr_primary_remotecnt && + res->hr_secondary_remotecnt < res->hr_primary_localcnt)) { + /* + * Nodes are more or less in sync or one of the nodes is + * out-of-date. + * It doesn't matter at this point which one, we just have to + * send out local bitmap to the remote node. + */ + if (pread(res->hr_localfd, map, mapsize, METADATA_SIZE) != + (ssize_t)mapsize) { + pjdlog_exit(LOG_ERR, "Unable to read activemap"); + } + if (res->hr_secondary_localcnt > res->hr_primary_remotecnt && + res->hr_secondary_remotecnt == res->hr_primary_localcnt) { + /* Primary is out-of-date, sync from secondary. */ + nv_add_uint8(nvout, HAST_SYNCSRC_SECONDARY, "syncsrc"); + } else { + /* + * Secondary is out-of-date or counts match. + * Sync from primary. + */ + nv_add_uint8(nvout, HAST_SYNCSRC_PRIMARY, "syncsrc"); + } + } else if (res->hr_secondary_localcnt > res->hr_primary_remotecnt && + res->hr_primary_localcnt > res->hr_secondary_remotecnt) { + /* + * Not good, we have split-brain condition. + */ + pjdlog_error("Split-brain detected, exiting."); + nv_add_string(nvout, "Split-brain condition!", "errmsg"); + free(map); + map = NULL; + mapsize = 0; + } else /* if (res->hr_secondary_localcnt < res->hr_primary_remotecnt || + res->hr_primary_localcnt < res->hr_secondary_remotecnt) */ { + /* + * This should never happen in practise, but we will perform + * full synchronization. + */ + assert(res->hr_secondary_localcnt < res->hr_primary_remotecnt || + res->hr_primary_localcnt < res->hr_secondary_remotecnt); + mapsize = activemap_calc_ondisk_size(res->hr_local_mediasize - + METADATA_SIZE, res->hr_extentsize, + res->hr_local_sectorsize); + memset(map, 0xff, mapsize); + if (res->hr_secondary_localcnt > res->hr_primary_remotecnt) { + /* In this one of five cases sync from secondary. */ + nv_add_uint8(nvout, HAST_SYNCSRC_SECONDARY, "syncsrc"); + } else { + /* For the rest four cases sync from primary. */ + nv_add_uint8(nvout, HAST_SYNCSRC_PRIMARY, "syncsrc"); + } + pjdlog_warning("This should never happen, asking for full synchronization (primary(local=%ju, remote=%ju), secondary(local=%ju, remote=%ju)).", + (uintmax_t)res->hr_primary_localcnt, + (uintmax_t)res->hr_primary_remotecnt, + (uintmax_t)res->hr_secondary_localcnt, + (uintmax_t)res->hr_secondary_remotecnt); + } + if (hast_proto_send(res, res->hr_remotein, nvout, map, mapsize) < 0) { + pjdlog_errno(LOG_WARNING, "Unable to send activemap to %s", + res->hr_remoteaddr); + nv_free(nvout); + exit(EX_TEMPFAIL); + } + if (res->hr_secondary_localcnt > res->hr_primary_remotecnt && + res->hr_primary_localcnt > res->hr_secondary_remotecnt) { + /* Exit on split-brain. */ + exit(EX_CONFIG); + } +} + +void +hastd_secondary(struct hast_resource *res, struct nv *nvin) +{ + pthread_t td; + pid_t pid; + int error; + + /* + * Create communication channel between parent and child. + */ + if (proto_client("socketpair://", &res->hr_ctrl) < 0) { + KEEP_ERRNO((void)pidfile_remove(pfh)); + pjdlog_exit(EX_OSERR, + "Unable to create control sockets between parent and child"); + } + + pid = fork(); + if (pid < 0) { + KEEP_ERRNO((void)pidfile_remove(pfh)); + pjdlog_exit(EX_OSERR, "Unable to fork"); + } + + if (pid > 0) { + /* This is parent. */ + proto_close(res->hr_remotein); + res->hr_remotein = NULL; + proto_close(res->hr_remoteout); + res->hr_remoteout = NULL; + res->hr_workerpid = pid; + return; + } + (void)pidfile_close(pfh); + + setproctitle("%s (secondary)", res->hr_name); + + init_local(res); + init_remote(res, nvin); + init_environment(); + + error = pthread_create(&td, NULL, recv_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, disk_thread, res); + assert(error == 0); + error = pthread_create(&td, NULL, send_thread, res); + assert(error == 0); + (void)ctrl_thread(res); +} + +static void +reqlog(int loglevel, int debuglevel, int error, struct hio *hio, const char *fmt, ...) +{ + char msg[1024]; + va_list ap; + int len; + + va_start(ap, fmt); + len = vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); + if ((size_t)len < sizeof(msg)) { + switch (hio->hio_cmd) { + case HIO_READ: + (void)snprintf(msg + len, sizeof(msg) - len, + "READ(%ju, %ju).", (uintmax_t)hio->hio_offset, + (uintmax_t)hio->hio_length); + break; + case HIO_DELETE: + (void)snprintf(msg + len, sizeof(msg) - len, + "DELETE(%ju, %ju).", (uintmax_t)hio->hio_offset, + (uintmax_t)hio->hio_length); + break; + case HIO_FLUSH: + (void)snprintf(msg + len, sizeof(msg) - len, "FLUSH."); + break; + case HIO_WRITE: + (void)snprintf(msg + len, sizeof(msg) - len, + "WRITE(%ju, %ju).", (uintmax_t)hio->hio_offset, + (uintmax_t)hio->hio_length); + break; + default: + (void)snprintf(msg + len, sizeof(msg) - len, + "UNKNOWN(%u).", (unsigned int)hio->hio_cmd); + break; + } + } + pjdlog_common(loglevel, debuglevel, error, "%s", msg); +} + +static int +requnpack(struct hast_resource *res, struct hio *hio) +{ + + hio->hio_cmd = nv_get_uint8(hio->hio_nv, "cmd"); + if (hio->hio_cmd == 0) { + pjdlog_error("Header contains no 'cmd' field."); + hio->hio_error = EINVAL; + goto end; + } + switch (hio->hio_cmd) { + case HIO_READ: + case HIO_WRITE: + case HIO_DELETE: + hio->hio_offset = nv_get_uint64(hio->hio_nv, "offset"); + if (nv_error(hio->hio_nv) != 0) { + pjdlog_error("Header is missing 'offset' field."); + hio->hio_error = EINVAL; + goto end; + } + hio->hio_length = nv_get_uint64(hio->hio_nv, "length"); + if (nv_error(hio->hio_nv) != 0) { + pjdlog_error("Header is missing 'length' field."); + hio->hio_error = EINVAL; + goto end; + } + if (hio->hio_length == 0) { + pjdlog_error("Data length is zero."); + hio->hio_error = EINVAL; + goto end; + } + if (hio->hio_length > MAXPHYS) { + pjdlog_error("Data length is too large (%ju > %ju).", + (uintmax_t)hio->hio_length, (uintmax_t)MAXPHYS); + hio->hio_error = EINVAL; + goto end; + } + if ((hio->hio_offset % res->hr_local_sectorsize) != 0) { + pjdlog_error("Offset %ju is not multiple of sector size.", + (uintmax_t)hio->hio_offset); + hio->hio_error = EINVAL; + goto end; + } + if ((hio->hio_length % res->hr_local_sectorsize) != 0) { + pjdlog_error("Length %ju is not multiple of sector size.", + (uintmax_t)hio->hio_length); + hio->hio_error = EINVAL; + goto end; + } + if (hio->hio_offset + hio->hio_length > + (uint64_t)res->hr_datasize) { + pjdlog_error("Data offset is too large (%ju > %ju).", + (uintmax_t)(hio->hio_offset + hio->hio_length), + (uintmax_t)res->hr_datasize); + hio->hio_error = EINVAL; + goto end; + } + break; + default: + pjdlog_error("Header contains invalid 'cmd' (%hhu).", + hio->hio_cmd); + hio->hio_error = EINVAL; + goto end; + } + hio->hio_error = 0; +end: + return (hio->hio_error); +} + +/* + * Thread receives requests from the primary node. + */ +static void * +recv_thread(void *arg) +{ + struct hast_resource *res = arg; + struct hio *hio; + bool wakeup; + + for (;;) { + pjdlog_debug(2, "recv: Taking free request."); + mtx_lock(&hio_free_list_lock); + while ((hio = TAILQ_FIRST(&hio_free_list)) == NULL) { + pjdlog_debug(2, "recv: No free requests, waiting."); + cv_wait(&hio_free_list_cond, &hio_free_list_lock); + } + TAILQ_REMOVE(&hio_free_list, hio, hio_next); + mtx_unlock(&hio_free_list_lock); + pjdlog_debug(2, "recv: (%p) Got request.", hio); + if (hast_proto_recv_hdr(res->hr_remotein, &hio->hio_nv) < 0) { + pjdlog_exit(EX_TEMPFAIL, + "Unable to receive request header"); + } + if (requnpack(res, hio) != 0) + goto send_queue; + reqlog(LOG_DEBUG, 2, -1, hio, + "recv: (%p) Got request header: ", hio); + if (hio->hio_cmd == HIO_WRITE) { + if (hast_proto_recv_data(res, res->hr_remotein, + hio->hio_nv, hio->hio_data, MAXPHYS) < 0) { + pjdlog_exit(EX_TEMPFAIL, + "Unable to receive reply data"); + } + } + pjdlog_debug(2, "recv: (%p) Moving request to the disk queue.", + hio); + mtx_lock(&hio_disk_list_lock); + wakeup = TAILQ_EMPTY(&hio_disk_list); + TAILQ_INSERT_TAIL(&hio_disk_list, hio, hio_next); + mtx_unlock(&hio_disk_list_lock); + if (wakeup) + cv_signal(&hio_disk_list_cond); + continue; +send_queue: + pjdlog_debug(2, "recv: (%p) Moving request to the send queue.", + hio); + mtx_lock(&hio_send_list_lock); + wakeup = TAILQ_EMPTY(&hio_send_list); + TAILQ_INSERT_TAIL(&hio_send_list, hio, hio_next); + mtx_unlock(&hio_send_list_lock); + if (wakeup) + cv_signal(&hio_send_list_cond); + } + /* NOTREACHED */ + return (NULL); +} + +/* + * Thread reads from or writes to local component and also handles DELETE and + * FLUSH requests. + */ +static void * +disk_thread(void *arg) +{ + struct hast_resource *res = arg; + struct hio *hio; + ssize_t ret; + bool clear_activemap, wakeup; + + clear_activemap = true; + + for (;;) { + pjdlog_debug(2, "disk: Taking request."); + mtx_lock(&hio_disk_list_lock); + while ((hio = TAILQ_FIRST(&hio_disk_list)) == NULL) { + pjdlog_debug(2, "disk: No requests, waiting."); + cv_wait(&hio_disk_list_cond, &hio_disk_list_lock); + } + TAILQ_REMOVE(&hio_disk_list, hio, hio_next); + mtx_unlock(&hio_disk_list_lock); + while (clear_activemap) { + unsigned char *map; + size_t mapsize; + + /* + * When first request is received, it means that primary + * already received our activemap, merged it and stored + * locally. We can now safely clear our activemap. + */ + mapsize = + activemap_calc_ondisk_size(res->hr_local_mediasize - + METADATA_SIZE, res->hr_extentsize, + res->hr_local_sectorsize); + map = calloc(1, mapsize); + if (map == NULL) { + pjdlog_warning("Unable to allocate memory to clear local activemap."); + break; + } + if (pwrite(res->hr_localfd, map, mapsize, + METADATA_SIZE) != (ssize_t)mapsize) { + pjdlog_errno(LOG_WARNING, + "Unable to store cleared activemap"); + free(map); + break; + } + free(map); + clear_activemap = false; + pjdlog_debug(1, "Local activemap cleared."); + } + reqlog(LOG_DEBUG, 2, -1, hio, "disk: (%p) Got request: ", hio); + /* Handle the actual request. */ + switch (hio->hio_cmd) { + case HIO_READ: + ret = pread(res->hr_localfd, hio->hio_data, + hio->hio_length, + hio->hio_offset + res->hr_localoff); + if (ret < 0) + hio->hio_error = errno; + else if (ret != (int64_t)hio->hio_length) + hio->hio_error = EIO; + else + hio->hio_error = 0; + break; + case HIO_WRITE: + ret = pwrite(res->hr_localfd, hio->hio_data, + hio->hio_length, + hio->hio_offset + res->hr_localoff); + if (ret < 0) + hio->hio_error = errno; + else if (ret != (int64_t)hio->hio_length) + hio->hio_error = EIO; + else + hio->hio_error = 0; + break; + case HIO_DELETE: + ret = g_delete(res->hr_localfd, + hio->hio_offset + res->hr_localoff, + hio->hio_length); + if (ret < 0) + hio->hio_error = errno; + else + hio->hio_error = 0; + break; + case HIO_FLUSH: + ret = g_flush(res->hr_localfd); + if (ret < 0) + hio->hio_error = errno; + else + hio->hio_error = 0; + break; + } + if (hio->hio_error != 0) { + reqlog(LOG_ERR, 0, hio->hio_error, hio, + "Request failed: "); + } + pjdlog_debug(2, "disk: (%p) Moving request to the send queue.", + hio); + mtx_lock(&hio_send_list_lock); + wakeup = TAILQ_EMPTY(&hio_send_list); + TAILQ_INSERT_TAIL(&hio_send_list, hio, hio_next); + mtx_unlock(&hio_send_list_lock); + if (wakeup) + cv_signal(&hio_send_list_cond); + } + /* NOTREACHED */ + return (NULL); +} + +/* + * Thread sends requests back to primary node. + */ +static void * +send_thread(void *arg) +{ + struct hast_resource *res = arg; + struct nv *nvout; + struct hio *hio; + void *data; + size_t length; + bool wakeup; + + for (;;) { + pjdlog_debug(2, "send: Taking request."); + mtx_lock(&hio_send_list_lock); + while ((hio = TAILQ_FIRST(&hio_send_list)) == NULL) { + pjdlog_debug(2, "send: No requests, waiting."); + cv_wait(&hio_send_list_cond, &hio_send_list_lock); + } + TAILQ_REMOVE(&hio_send_list, hio, hio_next); + mtx_unlock(&hio_send_list_lock); + reqlog(LOG_DEBUG, 2, -1, hio, "send: (%p) Got request: ", hio); + nvout = nv_alloc(); + /* Copy sequence number. */ + nv_add_uint64(nvout, nv_get_uint64(hio->hio_nv, "seq"), "seq"); + switch (hio->hio_cmd) { + case HIO_READ: + if (hio->hio_error == 0) { + data = hio->hio_data; + length = hio->hio_length; + break; + } + /* + * We send no data in case of an error. + */ + /* FALLTHROUGH */ + case HIO_DELETE: + case HIO_FLUSH: + case HIO_WRITE: + data = NULL; + length = 0; + break; + default: + abort(); + break; + } + if (hio->hio_error != 0) + nv_add_int16(nvout, hio->hio_error, "error"); + if (hast_proto_send(res, res->hr_remoteout, nvout, data, + length) < 0) { + pjdlog_exit(EX_TEMPFAIL, "Unable to send reply."); + } + nv_free(nvout); + pjdlog_debug(2, "disk: (%p) Moving request to the free queue.", + hio); + nv_free(hio->hio_nv); + hio->hio_error = 0; + mtx_lock(&hio_free_list_lock); + wakeup = TAILQ_EMPTY(&hio_free_list); + TAILQ_INSERT_TAIL(&hio_free_list, hio, hio_next); + mtx_unlock(&hio_free_list_lock); + if (wakeup) + cv_signal(&hio_free_list_cond); + } + /* NOTREACHED */ + return (NULL); +} diff --git a/sbin/hastd/subr.c b/sbin/hastd/subr.c new file mode 100644 index 000000000000..16ea93f12e21 --- /dev/null +++ b/sbin/hastd/subr.c @@ -0,0 +1,118 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "hast.h" +#include "subr.h" + +int +provinfo(struct hast_resource *res, bool dowrite) +{ + struct stat sb; + + assert(res->hr_localpath != NULL && res->hr_localpath[0] != '\0'); + + if (res->hr_localfd == -1) { + res->hr_localfd = open(res->hr_localpath, + dowrite ? O_RDWR : O_RDONLY); + if (res->hr_localfd < 0) { + KEEP_ERRNO(pjdlog_errno(LOG_ERR, "Unable to open %s", + res->hr_localpath)); + return (-1); + } + } + if (fstat(res->hr_localfd, &sb) < 0) { + KEEP_ERRNO(pjdlog_errno(LOG_ERR, "Unable to stat %s", + res->hr_localpath)); + return (-1); + } + if (S_ISCHR(sb.st_mode)) { + /* + * If this is character device, it is most likely GEOM provider. + */ + if (ioctl(res->hr_localfd, DIOCGMEDIASIZE, + &res->hr_local_mediasize) < 0) { + KEEP_ERRNO(pjdlog_errno(LOG_ERR, + "Unable obtain provider %s mediasize", + res->hr_localpath)); + return (-1); + } + if (ioctl(res->hr_localfd, DIOCGSECTORSIZE, + &res->hr_local_sectorsize) < 0) { + KEEP_ERRNO(pjdlog_errno(LOG_ERR, + "Unable obtain provider %s sectorsize", + res->hr_localpath)); + return (-1); + } + } else if (S_ISREG(sb.st_mode)) { + /* + * We also support regular files for which we hardcode + * sector size of 512 bytes. + */ + res->hr_local_mediasize = sb.st_size; + res->hr_local_sectorsize = 512; + } else { + /* + * We support no other file types. + */ + pjdlog_error("%s is neither GEOM provider nor regular file.", + res->hr_localpath); + errno = EFTYPE; + return (-1); + } + return (0); +} + +const char * +role2str(int role) +{ + + switch (role) { + case HAST_ROLE_INIT: + return ("init"); + case HAST_ROLE_PRIMARY: + return ("primary"); + case HAST_ROLE_SECONDARY: + return ("secondary"); + } + return ("unknown"); +} diff --git a/sbin/hastd/subr.h b/sbin/hastd/subr.h new file mode 100644 index 000000000000..c486f5c608da --- /dev/null +++ b/sbin/hastd/subr.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _SUBR_H_ +#define _SUBR_H_ + +#include +#include + +#include "hast.h" + +#define KEEP_ERRNO(work) do { \ + int _rerrno; \ + \ + _rerrno = errno; \ + work; \ + errno = _rerrno; \ +} while (0) + +int provinfo(struct hast_resource *res, bool dowrite); +const char *role2str(int role); + +#endif /* !_SUBR_H_ */ diff --git a/sbin/hastd/synch.h b/sbin/hastd/synch.h new file mode 100644 index 000000000000..7269aea6607a --- /dev/null +++ b/sbin/hastd/synch.h @@ -0,0 +1,162 @@ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _SYNCH_H_ +#define _SYNCH_H_ + +#include +#include +#include +#include + +static __inline void +mtx_init(pthread_mutex_t *lock) +{ + int error; + + error = pthread_mutex_init(lock, NULL); + assert(error == 0); +} +static __inline void +mtx_lock(pthread_mutex_t *lock) +{ + int error; + + error = pthread_mutex_lock(lock); + assert(error == 0); +} +static __inline bool +mtx_trylock(pthread_mutex_t *lock) +{ + int error; + + error = pthread_mutex_trylock(lock); + assert(error == 0 || error == EBUSY); + return (error == 0); +} +static __inline void +mtx_unlock(pthread_mutex_t *lock) +{ + int error; + + error = pthread_mutex_unlock(lock); + assert(error == 0); +} + +static __inline void +rw_init(pthread_rwlock_t *lock) +{ + int error; + + error = pthread_rwlock_init(lock, NULL); + assert(error == 0); +} +static __inline void +rw_rlock(pthread_rwlock_t *lock) +{ + int error; + + error = pthread_rwlock_rdlock(lock); + assert(error == 0); +} +static __inline void +rw_wlock(pthread_rwlock_t *lock) +{ + int error; + + error = pthread_rwlock_wrlock(lock); + assert(error == 0); +} +static __inline void +rw_unlock(pthread_rwlock_t *lock) +{ + int error; + + error = pthread_rwlock_unlock(lock); + assert(error == 0); +} + +static __inline void +cv_init(pthread_cond_t *cv) +{ + pthread_condattr_t attr; + int error; + + error = pthread_condattr_init(&attr); + assert(error == 0); + error = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); + assert(error == 0); + error = pthread_cond_init(cv, &attr); + assert(error == 0); +} +static __inline void +cv_wait(pthread_cond_t *cv, pthread_mutex_t *lock) +{ + int error; + + error = pthread_cond_wait(cv, lock); + assert(error == 0); +} +static __inline bool +cv_timedwait(pthread_cond_t *cv, pthread_mutex_t *lock, int timeout) +{ + struct timespec ts; + int error; + + if (timeout == 0) { + cv_wait(cv, lock); + return (false); + } + + error = clock_gettime(CLOCK_MONOTONIC, &ts); + assert(error == 0); + ts.tv_sec += timeout; + error = pthread_cond_timedwait(cv, lock, &ts); + assert(error == 0 || error == ETIMEDOUT); + return (error == ETIMEDOUT); +} +static __inline void +cv_signal(pthread_cond_t *cv) +{ + int error; + + error = pthread_cond_signal(cv); + assert(error == 0); +} +static __inline void +cv_broadcast(pthread_cond_t *cv) +{ + int error; + + error = pthread_cond_broadcast(cv); + assert(error == 0); +} +#endif /* !_SYNCH_H_ */ diff --git a/sbin/hastd/token.l b/sbin/hastd/token.l new file mode 100644 index 000000000000..7b80384e28bc --- /dev/null +++ b/sbin/hastd/token.l @@ -0,0 +1,66 @@ +%{ +/*- + * Copyright (c) 2009-2010 The FreeBSD Foundation + * All rights reserved. + * + * This software was developed by Pawel Jakub Dawidek under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHORS 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 AUTHORS 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 +#include + +#include "hast.h" + +#include "y.tab.h" + +int depth; +int lineno; + +#define DP do { } while (0) +%} + +%% +control { DP; return CONTROL; } +listen { DP; return LISTEN; } +port { DP; return PORT; } +replication { DP; return REPLICATION; } +resource { DP; return RESOURCE; } +name { DP; return NAME; } +local { DP; return LOCAL; } +remote { DP; return REMOTE; } +on { DP; return ON; } +fullsync { DP; return FULLSYNC; } +memsync { DP; return MEMSYNC; } +async { DP; return ASYNC; } +[0-9]+ { DP; yylval.num = atoi(yytext); return NUM; } +[a-zA-Z0-9\.\-_/\:]+ { DP; yylval.str = strdup(yytext); return STR; } +\{ { DP; depth++; return OB; } +\} { DP; depth--; return CB; } +#.*$ /* ignore comments */; +\n { lineno++; } +[ \t]+ /* ignore whitespace */; +%% diff --git a/sbin/ifconfig/Makefile b/sbin/ifconfig/Makefile index 367ad9c3bc15..77491f25207f 100644 --- a/sbin/ifconfig/Makefile +++ b/sbin/ifconfig/Makefile @@ -28,7 +28,7 @@ SRCS+= ifgre.c # GRE keys etc SRCS+= ifgif.c # GIF reversed header workaround SRCS+= ifieee80211.c regdomain.c # SIOC[GS]IEEE80211 support -DPADD+= ${LIBBSDXML} ${LIBSBUF} ${LIBJAIL} +DPADD+= ${LIBBSDXML} ${LIBJAIL} ${LIBSBUF} LDADD+= -lbsdxml -ljail -lsbuf SRCS+= ifcarp.c # SIOC[GS]VH support @@ -47,6 +47,6 @@ LDADD+= -lipx MAN= ifconfig.8 CFLAGS+= -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wnested-externs -WARNS?= 0 +WARNS?= 2 .include diff --git a/sbin/ifconfig/af_inet.c b/sbin/ifconfig/af_inet.c index 2c75b01cded8..2e27114af13a 100644 --- a/sbin/ifconfig/af_inet.c +++ b/sbin/ifconfig/af_inet.c @@ -37,6 +37,7 @@ static const char rcsid[] = #include #include +#include #include #include #include @@ -110,15 +111,18 @@ in_getaddr(const char *s, int which) char *p = NULL; if((p = strrchr(s, '/')) != NULL) { + const char *errstr; /* 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)) { + if (!isdigit(*(p + 1))) + errstr = "invalid"; + else + masklen = (int)strtonum(p + 1, 0, 32, &errstr); + if (errstr != NULL) { *p = '/'; - errx(1, "%s: bad value", s); + errx(1, "%s: bad value (width %s)", s, errstr); } min->sin_len = sizeof(*min); min->sin_addr.s_addr = htonl(~((1LL << (32 - masklen)) - 1) & diff --git a/sbin/ifconfig/af_nd6.c b/sbin/ifconfig/af_nd6.c index 4fde0c4a0fdf..e6b920af7bd4 100644 --- a/sbin/ifconfig/af_nd6.c +++ b/sbin/ifconfig/af_nd6.c @@ -56,17 +56,9 @@ static const char rcsid[] = #include "ifconfig.h" #define MAX_SYSCTL_TRY 5 - -static struct nd6_opt_list { - const char *label; - u_int mask; -} nd6_opts[] = { - { "IFDISABLED", ND6_IFF_IFDISABLED, }, - { "PERFORMNUD", ND6_IFF_PERFORMNUD, }, - { "ACCEPT_RTADV", ND6_IFF_ACCEPT_RTADV, }, - { "PREFER_SOURCE", ND6_IFF_PREFER_SOURCE, }, - { "AUTO_LINKLOCAL", ND6_IFF_AUTO_LINKLOCAL, }, -}; +#define ND6BITS "\020\001PERFORMNUD\002ACCEPT_RTADV\003PREFER_SOURCE" \ + "\004IFDISABLED\005DONT_SET_IFROUTE\006AUTO_LINKLOCAL" \ + "\020DEFAULTIF" static int isnd6defif(int); void setnd6flags(const char *, int, int, const struct afswtch *); @@ -153,9 +145,8 @@ nd6_status(int s) char *buf, *next; int mib[6], ntry; int s6; - int i, error; + int error; int isinet6, isdefif; - int nopts; /* Check if the interface has at least one IPv6 address. */ mib[0] = CTL_NET; @@ -220,22 +211,9 @@ nd6_status(int s) close(s6); if (nd.ndi.flags == 0 && !isdefif) return; - - nopts = 0; - printf("\tnd6 options=%d<", nd.ndi.flags); - for (i=0; i < sizeof(nd6_opts)/sizeof(nd6_opts[0]); i++) { - if (nd.ndi.flags & nd6_opts[i].mask) { - if (nopts++) - printf(","); - printf("%s", nd6_opts[i].label); - } - } - if (isdefif) { - if (nopts) - printf(","); - printf("DEFAULTIF"); - } - printf(">\n"); + printb("\tnd6 options", + (unsigned int)(nd.ndi.flags | (isdefif << 15)), ND6BITS); + putchar('\n'); } static struct afswtch af_nd6 = { diff --git a/sbin/ifconfig/ifcarp.c b/sbin/ifconfig/ifcarp.c index 36f1bb6a47b7..2306717e63b8 100644 --- a/sbin/ifconfig/ifcarp.c +++ b/sbin/ifconfig/ifcarp.c @@ -96,6 +96,7 @@ setcarp_passwd(const char *val, int d, int s, const struct afswtch *afp) if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1) err(1, "SIOCGVH"); + memset(carpr.carpr_key, 0, sizeof(carpr.carpr_key)); /* XXX Should hash the password into the key here, perhaps? */ strlcpy(carpr.carpr_key, val, CARP_KEY_LEN); diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8 index 220bd9f415ce..eafd5d82ada6 100644 --- a/sbin/ifconfig/ifconfig.8 +++ b/sbin/ifconfig/ifconfig.8 @@ -28,7 +28,7 @@ .\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94 .\" $FreeBSD$ .\" -.Dd September 23, 2009 +.Dd February 20, 2010 .Dt IFCONFIG 8 .Os .Sh NAME @@ -258,6 +258,12 @@ Disable permanently promiscuous mode. Another name for the .Fl alias parameter. +.It Cm description Ar value , Cm descr Ar value +Specify a description of the interface. +This can be used to label interfaces in situations where they may +otherwise be difficult to distinguish. +.It Cm -description , Cm -descr +Clear the interface description. .It Cm down Mark an interface .Dq down . @@ -402,20 +408,20 @@ they support in their capabilities. is a synonym for enabling all available WOL mechanisms. To disable WOL use .Fl wol . -.It Cm vlanmtu , vlanhwtag, vlanhwfilter +.It Cm vlanmtu , vlanhwtag, vlanhwfilter, vlanhwtso If the driver offers user-configurable VLAN support, enable -reception of extended frames, tag processing in hardware, or -frame filtering in hardware, +reception of extended frames, tag processing in hardware, +frame filtering in hardware, or TSO on VLAN, respectively. Note that this must be issued on a physical interface associated with .Xr vlan 4 , not on a .Xr vlan 4 interface itself. -.It Fl vlanmtu , vlanhwtag, vlanhwfilter +.It Fl vlanmtu , vlanhwtag, vlanhwfilter, vlanhwtso If the driver offers user-configurable VLAN support, disable -reception of extended frames, tag processing in hardware, or -frame filtering in hardware, +reception of extended frames, tag processing in hardware, +frame filtering in hardware, or TSO on VLAN, respectively. .It Cm vnet Ar jail Move the interface to the @@ -2512,6 +2518,10 @@ Configure the interface to use 100baseTX, full duplex Ethernet media options: .Dl # ifconfig xl0 media 100baseTX mediaopt full-duplex .Pp +Label the em0 interface as an uplink: +.Pp +.Dl # ifconfig em0 description \&"Uplink to Gigabit Switch 2\&" +.Pp Create the software network interface .Li gif1 : .Dl # ifconfig gif1 create diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index f05374cf4c44..aebcdc028db3 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -44,7 +44,6 @@ static const char rcsid[] = #include #include #include -#include #include #include #include @@ -83,6 +82,8 @@ static const char rcsid[] = struct ifreq ifr; char name[IFNAMSIZ]; +char *descr = NULL; +size_t descrlen = 64; int setaddr; int setmask; int doalias; @@ -147,7 +148,7 @@ main(int argc, char *argv[]) struct ifaddrs *ifap, *ifa; struct ifreq paifr; const struct sockaddr_dl *sdl; - char options[1024], *cp; + char options[1024], *cp, *namecp = NULL; const char *ifname; struct option *p; size_t iflen; @@ -294,7 +295,7 @@ main(int argc, char *argv[]) sdl = (const struct sockaddr_dl *) ifa->ifa_addr; else sdl = NULL; - if (cp != NULL && strcmp(cp, ifa->ifa_name) == 0) + if (cp != NULL && strcmp(cp, ifa->ifa_name) == 0 && !namesonly) continue; iflen = strlcpy(name, ifa->ifa_name, sizeof(name)); if (iflen >= sizeof(name)) { @@ -308,16 +309,32 @@ main(int argc, char *argv[]) continue; if (uponly && (ifa->ifa_flags & IFF_UP) == 0) continue; - ifindex++; /* * Are we just listing the interfaces? */ if (namesonly) { + if (namecp == cp) + continue; + if (afp != NULL) { + /* special case for "ether" address family */ + if (!strcmp(afp->af_name, "ether")) { + if (sdl == NULL || + sdl->sdl_type != IFT_ETHER || + sdl->sdl_alen != ETHER_ADDR_LEN) + continue; + } else { + if (ifa->ifa_addr->sa_family != afp->af_af) + continue; + } + } + namecp = cp; + ifindex++; if (ifindex > 1) printf(" "); fputs(name, stdout); continue; } + ifindex++; if (argc > 0) ifconfig(argc, argv, 0, afp); @@ -822,6 +839,40 @@ setifname(const char *val, int dummy __unused, int s, free(newname); } +/* ARGSUSED */ +static void +setifdescr(const char *val, int dummy __unused, int s, + const struct afswtch *afp) +{ + char *newdescr; + + ifr.ifr_buffer.length = strlen(val) + 1; + if (ifr.ifr_buffer.length == 1) { + ifr.ifr_buffer.buffer = newdescr = NULL; + ifr.ifr_buffer.length = 0; + } else { + newdescr = strdup(val); + ifr.ifr_buffer.buffer = newdescr; + if (newdescr == NULL) { + warn("no memory to set ifdescr"); + return; + } + } + + if (ioctl(s, SIOCSIFDESCR, (caddr_t)&ifr) < 0) + warn("ioctl (set descr)"); + + free(newdescr); +} + +/* ARGSUSED */ +static void +unsetifdescr(const char *val, int value, int s, const struct afswtch *afp) +{ + + setifdescr("", 0, s, 0); +} + #define IFFBITS \ "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6SMART\7RUNNING" \ "\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \ @@ -830,7 +881,7 @@ setifname(const char *val, int dummy __unused, int s, #define IFCAPBITS \ "\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU\7POLLING" \ "\10VLAN_HWCSUM\11TSO4\12TSO6\13LRO\14WOL_UCAST\15WOL_MCAST\16WOL_MAGIC" \ -"\21VLAN_HWFILTER" +"\21VLAN_HWFILTER\23VLAN_HWTSO" /* * Print the status of the interface. If an address family was @@ -866,6 +917,25 @@ status(const struct afswtch *afp, const struct sockaddr_dl *sdl, printf(" mtu %d", ifr.ifr_mtu); putchar('\n'); + for (;;) { + if ((descr = reallocf(descr, descrlen)) != NULL) { + ifr.ifr_buffer.buffer = descr; + ifr.ifr_buffer.length = descrlen; + if (ioctl(s, SIOCGIFDESCR, &ifr) == 0) { + if (strlen(descr) > 0) + printf("\tdescription: %s\n", descr); + break; + } else if (errno == ENAMETOOLONG) + descrlen = ifr.ifr_buffer.length; + else + break; + } else { + warn("unable to allocate memory for interface" + "description"); + break; + } + }; + if (ioctl(s, SIOCGIFCAP, (caddr_t)&ifr) == 0) { if (ifr.ifr_curcap != 0) { printb("\toptions", ifr.ifr_curcap, IFCAPBITS); @@ -1035,6 +1105,10 @@ static struct cmd basic_cmds[] = { DEF_CMD("-arp", IFF_NOARP, setifflags), DEF_CMD("debug", IFF_DEBUG, setifflags), DEF_CMD("-debug", -IFF_DEBUG, setifflags), + DEF_CMD_ARG("description", setifdescr), + DEF_CMD_ARG("descr", setifdescr), + DEF_CMD("-description", 0, unsetifdescr), + DEF_CMD("-descr", 0, unsetifdescr), DEF_CMD("promisc", IFF_PPROMISC, setifflags), DEF_CMD("-promisc", -IFF_PPROMISC, setifflags), DEF_CMD("add", IFF_UP, notealias), diff --git a/sbin/ifconfig/ifieee80211.c b/sbin/ifconfig/ifieee80211.c index 10fb83d83995..07092429b6a4 100644 --- a/sbin/ifconfig/ifieee80211.c +++ b/sbin/ifconfig/ifieee80211.c @@ -43,13 +43,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -2624,25 +2617,31 @@ do { \ if (verbose) { const struct ieee80211_meshconf_ie *mconf = (const struct ieee80211_meshconf_ie *)ie; - const uint8_t null[4] = IEEE80211_MESHCONF_NULL; - const uint8_t hwmp[4] = IEEE80211_MESHCONF_HWMP; - const uint8_t airtime[4] = IEEE80211_MESHCONF_AIRTIME; - const uint8_t ccsig[4] = IEEE80211_MESHCONF_CCSIG; - const uint8_t sae[4] = IEEE80211_MESHCONF_SAE; - const uint8_t neighoff[4] = IEEE80211_MESHCONF_SAE; - printf("conf_ver); - MATCHOUI(mconf->conf_pselid, hwmp, "HWMP"); + printf("conf_pselid == IEEE80211_MESHCONF_PATH_HWMP) + printf("HWMP"); + else + printf("UNKNOWN"); printf(" LINK:"); - MATCHOUI(mconf->conf_pmetid, airtime, "AIRTIME"); + if (mconf->conf_pmetid == IEEE80211_MESHCONF_METRIC_AIRTIME) + printf("AIRTIME"); + else + printf("UNKNOWN"); printf(" CONGESTION:"); - MATCHOUI(mconf->conf_ccid, ccsig, "SIG"); - MATCHOUI(mconf->conf_ccid, null, "NULL"); + if (mconf->conf_ccid == IEEE80211_MESHCONF_CC_DISABLED) + printf("DISABLED"); + else + printf("UNKNOWN"); printf(" SYNC:"); - MATCHOUI(mconf->conf_syncid, neighoff, "NEIGHOFF"); - MATCHOUI(mconf->conf_syncid, null, "NULL"); + if (mconf->conf_syncid == IEEE80211_MESHCONF_SYNC_NEIGHOFF) + printf("NEIGHOFF"); + else + printf("UNKNOWN"); printf(" AUTH:"); - MATCHOUI(mconf->conf_authid, sae, "SAE"); - MATCHOUI(mconf->conf_authid, null, "NULL"); + if (mconf->conf_authid == IEEE80211_MESHCONF_AUTH_DISABLED) + printf("DISABLED"); + else + printf("UNKNOWN"); printf(" FORM:0x%x CAPS:0x%x>", mconf->conf_form, mconf->conf_cap); } @@ -3423,9 +3422,9 @@ get_chaninfo(const struct ieee80211_channel *c, int precise, else if (IEEE80211_IS_CHAN_B(c)) strlcat(buf, " 11b", bsize); if (IEEE80211_IS_CHAN_HALF(c)) - strlcat(buf, "/10Mhz", bsize); + strlcat(buf, "/10MHz", bsize); if (IEEE80211_IS_CHAN_QUARTER(c)) - strlcat(buf, "/5Mhz", bsize); + strlcat(buf, "/5MHz", bsize); if (IEEE80211_IS_CHAN_TURBO(c)) strlcat(buf, " Turbo", bsize); if (precise) { @@ -3447,7 +3446,7 @@ print_chaninfo(const struct ieee80211_channel *c, int verb) { char buf[14]; - printf("Channel %3u : %u%c Mhz%-14.14s", + printf("Channel %3u : %u%c MHz%-14.14s", ieee80211_mhz2ieee(c->ic_freq, c->ic_flags), c->ic_freq, IEEE80211_IS_CHAN_PASSIVE(c) ? '*' : ' ', get_chaninfo(c, verb, buf, sizeof(buf))); @@ -3556,7 +3555,7 @@ list_channels(int s, int allchans) static void print_txpow(const struct ieee80211_channel *c) { - printf("Channel %3u : %u Mhz %3.1f reg %2d ", + printf("Channel %3u : %u MHz %3.1f reg %2d ", c->ic_ieee, c->ic_freq, c->ic_maxpower/2., c->ic_maxregpower); } @@ -4238,7 +4237,7 @@ ieee80211_status(int s) c = getcurchan(s); if (c->ic_freq != IEEE80211_CHAN_ANY) { char buf[14]; - printf(" channel %d (%u Mhz%s)", c->ic_ieee, c->ic_freq, + printf(" channel %d (%u MHz%s)", c->ic_ieee, c->ic_freq, get_chaninfo(c, 1, buf, sizeof(buf))); } else if (verbose) printf(" channel UNDEF"); diff --git a/sbin/ifconfig/ifvlan.c b/sbin/ifconfig/ifvlan.c index c59cac11e54d..30005852f166 100644 --- a/sbin/ifconfig/ifvlan.c +++ b/sbin/ifconfig/ifvlan.c @@ -181,6 +181,8 @@ static struct cmd vlan_cmds[] = { DEF_CMD("-vlanhwtag", -IFCAP_VLAN_HWTAGGING, setifcap), DEF_CMD("vlanhwfilter", IFCAP_VLAN_HWFILTER, setifcap), DEF_CMD("-vlanhwfilter", -IFCAP_VLAN_HWFILTER, setifcap), + DEF_CMD("-vlanhwtso", -IFCAP_VLAN_HWTSO, setifcap), + DEF_CMD("vlanhwtso", IFCAP_VLAN_HWTSO, setifcap), }; static struct afswtch af_vlan = { .af_name = "af_vlan", diff --git a/sbin/ifconfig/regdomain.c b/sbin/ifconfig/regdomain.c index a06ba552d8cf..414028958e5f 100644 --- a/sbin/ifconfig/regdomain.c +++ b/sbin/ifconfig/regdomain.c @@ -694,8 +694,11 @@ lib80211_country_findbyname(const struct regdata *rdp, const char *name) len = strlen(name); LIST_FOREACH(cp, &rdp->countries, next) { - if (strcasecmp(cp->isoname, name) == 0 || - strncasecmp(cp->name, name, len) == 0) + if (strcasecmp(cp->isoname, name) == 0) + return cp; + } + LIST_FOREACH(cp, &rdp->countries, next) { + if (strncasecmp(cp->name, name, len) == 0) return cp; } return NULL; diff --git a/sbin/init/Makefile b/sbin/init/Makefile index 58a9e0ad0d2e..7497a4b54fd7 100644 --- a/sbin/init/Makefile +++ b/sbin/init/Makefile @@ -5,7 +5,6 @@ PROG= init MAN= init.8 PRECIOUSPROG= INSTALLFLAGS=-b -B.bak -WARNS?= 6 CFLAGS+=-DDEBUGSHELL -DSECURE -DLOGIN_CAP -DCOMPAT_SYSV_INIT DPADD= ${LIBUTIL} ${LIBCRYPT} LDADD= -lutil -lcrypt diff --git a/sbin/init/init.8 b/sbin/init/init.8 index bd21b48d2144..abf07ad3c712 100644 --- a/sbin/init/init.8 +++ b/sbin/init/init.8 @@ -148,12 +148,9 @@ dies, either because the user logged out or an abnormal termination occurred (a signal), the .Nm -utility wakes up, deletes the user -from the -.Xr utmp 5 -file of current users and records the logout in the -.Xr wtmp 5 -file. +utility wakes up and records the logout in the the user accounting +database (see +.Xr getutxent 3 ). The cycle is then restarted by .Nm @@ -207,13 +204,6 @@ If a line is commented out or deleted from .Xr ttys 5 , .Nm will not do anything at all to that line. -However, it will complain that the relationship between lines -in the -.Xr ttys 5 -file and records in the -.Xr utmp 5 -file is out of sync, -so this practice is not recommended. .Pp The .Nm @@ -316,9 +306,9 @@ system console device .It Pa /dev/tty* terminal ports found in .Xr ttys 5 -.It Pa /var/run/utmp +.It Pa /var/run/utx.active record of current users on the system -.It Pa /var/log/wtmp +.It Pa /var/log/utx.log record of all logins and logouts .It Pa /etc/ttys the terminal initialization information file diff --git a/sbin/init/init.c b/sbin/init/init.c index 8629b90890cf..e14619983e75 100644 --- a/sbin/init/init.c +++ b/sbin/init/init.c @@ -66,6 +66,7 @@ static const char rcsid[] = #include #include #include +#include #include #include @@ -567,12 +568,13 @@ transition(state_t s) * NB: should send a message to the session logger to avoid blocking. */ static void -clear_session_logs(session_t *sp) +clear_session_logs(session_t *sp __unused) { - char *line = sp->se_device + sizeof(_PATH_DEV) - 1; - if (logout(line)) - logwtmp(line, "", ""); + /* + * XXX: Use getutxline() and call pututxline() for each entry. + * Is this safe to do this here? Is it really required anyway? + */ } /* @@ -775,6 +777,7 @@ single_user(void) static state_func_t runcom(void) { + struct utmpx utx; state_func_t next_transition; if ((next_transition = run_script(_PATH_RUNCOM)) != 0) @@ -782,7 +785,9 @@ runcom(void) runcom_mode = AUTOBOOT; /* the default */ /* NB: should send a message to the session logger to avoid blocking. */ - logwtmp("~", "reboot", ""); + utx.ut_type = BOOT_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); return (state_func_t) read_ttys; } @@ -1487,13 +1492,16 @@ alrm_handler(int sig) static state_func_t death(void) { + struct utmpx utx; session_t *sp; int i; pid_t pid; static const int death_sigs[2] = { SIGTERM, SIGKILL }; /* NB: should send a message to the session logger to avoid blocking. */ - logwtmp("~", "shutdown", ""); + utx.ut_type = SHUTDOWN_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); /* * Also revoke the TTY here. Because runshutdown() may reopen diff --git a/sbin/ipf/Makefile.inc b/sbin/ipf/Makefile.inc index 3373b557bd8c..0065ce7550c4 100644 --- a/sbin/ipf/Makefile.inc +++ b/sbin/ipf/Makefile.inc @@ -1,5 +1,7 @@ # $FreeBSD$ +WARNS?= 2 + CFLAGS+= -I${.CURDIR}/../../../contrib/ipfilter CFLAGS+= -I${.CURDIR}/../../../contrib/ipfilter/tools CFLAGS+= -I${.CURDIR}/../../../sys diff --git a/sbin/ipfw/Makefile b/sbin/ipfw/Makefile index c09ebca32e87..b25f38ca2e8b 100644 --- a/sbin/ipfw/Makefile +++ b/sbin/ipfw/Makefile @@ -3,6 +3,7 @@ PROG= ipfw SRCS= ipfw2.c dummynet.c ipv6.c main.c nat.c altq.c WARNS?= 2 +DPADD= ${LIBUTIL} LDADD= -lutil MAN= ipfw.8 diff --git a/sbin/ipfw/dummynet.c b/sbin/ipfw/dummynet.c index 147328460eba..490aa53fd87b 100644 --- a/sbin/ipfw/dummynet.c +++ b/sbin/ipfw/dummynet.c @@ -78,7 +78,7 @@ static struct _s_x dummynet_params[] = { }; static int -sort_q(const void *pa, const void *pb) +sort_q(void *arg, const void *pa, const void *pb) { int rev = (co.do_sort < 0); int field = rev ? -co.do_sort : co.do_sort; @@ -121,7 +121,7 @@ list_queues(struct dn_flow_set *fs, struct dn_flow_queue *q) return; if (co.do_sort != 0) - heapsort(q, fs->rq_elements, sizeof *q, sort_q); + qsort_r(q, fs->rq_elements, sizeof *q, NULL, sort_q); /* Print IPv4 flows */ index_printed = 0; @@ -486,7 +486,7 @@ is_valid_number(const char *s) * and return the numeric bandwidth value. * set clocking interface or bandwidth value */ -void +static void read_bandwidth(char *arg, int *bandwidth, char *if_name, int namelen) { if (*bandwidth != -1) @@ -530,7 +530,7 @@ struct point { double delay; }; -int +static int compare_points(const void *vp1, const void *vp2) { const struct point *p1 = vp1; @@ -650,6 +650,8 @@ load_extra_delays(const char *filename, struct dn_pipe *p) } } + fclose (f); + if (samples == -1) { warnx("'%s' not found, assuming 100", ED_TOK_SAMPLES); samples = 100; @@ -948,7 +950,7 @@ end_mask: errx(EX_DATAERR, "burst only valid for pipes"); NEED1("burst needs argument\n"); errno = 0; - if (expand_number(av[0], &p.burst) < 0) + if (expand_number(av[0], (int64_t *)&p.burst) < 0) if (errno != ERANGE) errx(EX_DATAERR, "burst: invalid argument"); diff --git a/sbin/ipfw/ipfw.8 b/sbin/ipfw/ipfw.8 index f8b0746a25ab..fc83ecc34a91 100644 --- a/sbin/ipfw/ipfw.8 +++ b/sbin/ipfw/ipfw.8 @@ -1002,6 +1002,7 @@ The second format with multiple addresses) is provided for convenience only and its use is discouraged. .It Ar addr : Oo Cm not Oc Bro +.Bl -tag -width indent .Cm any | me | me6 | .Cm table Ns Pq Ar number Ns Op , Ns Ar value .Ar | addr-list | addr-set @@ -1023,6 +1024,7 @@ is also specified, an entry will match only if it has this value. See the .Sx LOOKUP TABLES section below for more information on lookup tables. +.El .It Ar addr-list : ip-addr Ns Op Ns , Ns Ar addr-list .It Ar ip-addr : A host or subnet address specified in one of the following ways: @@ -1389,6 +1391,20 @@ of source and destination addresses and ports can be specified. Currently, only IPv4 flows are supported. +.It Cm lookup Bro Cm dst-ip | dst-port | src-ip | src-port | uid | jail Brc Ar N +Search an entry in lookup table +.Ar N +that matches the field specified as argument. +If not found, the match fails. +Otherwise, the match succeeds and +.Cm tablearg +is set to the value extracted from the table. +.Br +This option can be useful to quickly dispatch traffic based on +certain packet fields. +See the +.Sx LOOKUP TABLES +section below for more information on lookup tables. .It Cm { MAC | mac } Ar dst-mac src-mac Match packets with a given .Ar dst-mac diff --git a/sbin/ipfw/ipfw2.c b/sbin/ipfw/ipfw2.c index 58094a18e972..d4740c9f8552 100644 --- a/sbin/ipfw/ipfw2.c +++ b/sbin/ipfw/ipfw2.c @@ -224,6 +224,15 @@ static struct _s_x rule_action_params[] = { { NULL, 0 } /* terminator */ }; +/* + * The 'lookup' instruction accepts one of the following arguments. + * -1 is a terminator for the list. + * Arguments are passed as v[1] in O_DST_LOOKUP options. + */ +static int lookup_key[] = { + TOK_DSTIP, TOK_SRCIP, TOK_DSTPORT, TOK_SRCPORT, + TOK_UID, TOK_JAIL, -1 }; + static struct _s_x rule_options[] = { { "tagged", TOK_TAGGED }, { "uid", TOK_UID }, @@ -290,6 +299,7 @@ static struct _s_x rule_options[] = { { "dst-ip6", TOK_DSTIP6}, { "src-ipv6", TOK_SRCIP6}, { "src-ip6", TOK_SRCIP6}, + { "lookup", TOK_LOOKUP}, { "//", TOK_COMMENT }, { "not", TOK_NOT }, /* pseudo option */ @@ -742,6 +752,16 @@ print_ip(ipfw_insn_ip *cmd, char const *s) int len = F_LEN((ipfw_insn *)cmd); uint32_t *a = ((ipfw_insn_u32 *)cmd)->d; + if (cmd->o.opcode == O_IP_DST_LOOKUP && len > F_INSN_SIZE(ipfw_insn_u32)) { + uint32_t d = a[1]; + const char *arg = ""; + + if (d < sizeof(lookup_key)/sizeof(lookup_key[0])) + arg = match_value(rule_options, lookup_key[d]); + printf("%s lookup %s %d", cmd->o.len & F_NOT ? " not": "", + arg, cmd->o.arg1); + return; + } printf("%s%s ", cmd->o.len & F_NOT ? " not": "", s); if (cmd->o.opcode == O_IP_SRC_ME || cmd->o.opcode == O_IP_DST_ME) { @@ -2740,9 +2760,11 @@ chkarg: /* * In the kernel we assume AF_INET and use only - * sin_port and sin_addr. + * sin_port and sin_addr. Remember to set sin_len as + * the routing code seems to use it too. */ p->sa.sin_family = AF_INET; + p->sa.sin_len = sizeof(struct sockaddr_in); p->sa.sin_port = 0; /* * locate the address-port separator (':' or ',') @@ -3477,6 +3499,31 @@ read_options: ac--; av++; break; + case TOK_LOOKUP: { + ipfw_insn_u32 *c = (ipfw_insn_u32 *)cmd; + char *p; + int j; + + if (ac < 2) + errx(EX_USAGE, "format: lookup argument tablenum"); + cmd->opcode = O_IP_DST_LOOKUP; + cmd->len |= F_INSN_SIZE(ipfw_insn) + 2; + i = match_token(rule_options, *av); + for (j = 0; lookup_key[j] >= 0 ; j++) { + if (i == lookup_key[j]) + break; + } + if (lookup_key[j] <= 0) + errx(EX_USAGE, "format: cannot lookup on %s", *av); + c->d[1] = j; // i converted to option + ac--; av++; + cmd->arg1 = strtoul(*av, &p, 0); + if (p && *p) + errx(EX_USAGE, "format: lookup argument tablenum"); + ac--; av++; + } + break; + default: errx(EX_USAGE, "unrecognised option [%d] %s\n", i, s); } diff --git a/sbin/ipfw/ipfw2.h b/sbin/ipfw/ipfw2.h index d3ce7fb6e08a..b393a7d62fe7 100644 --- a/sbin/ipfw/ipfw2.h +++ b/sbin/ipfw/ipfw2.h @@ -186,6 +186,7 @@ enum tokens { TOK_FIB, TOK_SETFIB, + TOK_LOOKUP, }; /* * the following macro returns an error message if we run out of diff --git a/sbin/iscontrol/Makefile b/sbin/iscontrol/Makefile index 2b09fa9aa371..446a5f48ab54 100644 --- a/sbin/iscontrol/Makefile +++ b/sbin/iscontrol/Makefile @@ -5,6 +5,7 @@ PROG= iscontrol DPADD= ${LIBCAM} ${LIBMD} LDADD= -lcam -lmd +WARNS?= 2 CFLAGS += -I${.CURDIR}/../../sys/dev/iscsi/initiator #CFLAGS += -g -DDEBUG diff --git a/sbin/iscontrol/iscontrol.h b/sbin/iscontrol/iscontrol.h index a89d7afd5f30..5ab296d0a5c9 100644 --- a/sbin/iscontrol/iscontrol.h +++ b/sbin/iscontrol/iscontrol.h @@ -144,7 +144,6 @@ int addText(pdu_t *pp, char *fmt, ...); void freePDU(pdu_t *pp); int xmitpdu(isess_t *sess, pdu_t *pp); int recvpdu(isess_t *sess, pdu_t *pp); -void pukeText(char *it, pdu_t *pp); int lookup(token_t *tbl, char *m); diff --git a/sbin/iscontrol/pdu.c b/sbin/iscontrol/pdu.c index 980d20a41049..444c1f11ab21 100644 --- a/sbin/iscontrol/pdu.c +++ b/sbin/iscontrol/pdu.c @@ -46,6 +46,8 @@ __FBSDID("$FreeBSD$"); #include "iscsi.h" #include "iscontrol.h" +static void pukeText(char *it, pdu_t *pp); + int xmitpdu(isess_t *sess, pdu_t *pp) { @@ -153,7 +155,7 @@ freePDU(pdu_t *pp) pp->ds_size = pp->ds_len = 0; } -void +static void pukeText(char *it, pdu_t *pp) { char *ptr; diff --git a/sbin/kldconfig/Makefile b/sbin/kldconfig/Makefile index e92daf6c6f7c..a478c4b619d0 100644 --- a/sbin/kldconfig/Makefile +++ b/sbin/kldconfig/Makefile @@ -28,6 +28,5 @@ PROG= kldconfig MAN= kldconfig.8 -WARNS?= 5 .include diff --git a/sbin/kldload/Makefile b/sbin/kldload/Makefile index da597d4594f9..05ad5bab82c0 100644 --- a/sbin/kldload/Makefile +++ b/sbin/kldload/Makefile @@ -28,6 +28,5 @@ PROG= kldload MAN= kldload.8 -WARNS?= 5 .include diff --git a/sbin/kldstat/Makefile b/sbin/kldstat/Makefile index b602a3edfb1f..e4145d7c3c41 100644 --- a/sbin/kldstat/Makefile +++ b/sbin/kldstat/Makefile @@ -28,6 +28,5 @@ PROG= kldstat MAN= kldstat.8 -WARNS?= 5 .include diff --git a/sbin/kldunload/Makefile b/sbin/kldunload/Makefile index 48e5c035ccdc..1a25a02351be 100644 --- a/sbin/kldunload/Makefile +++ b/sbin/kldunload/Makefile @@ -28,6 +28,5 @@ PROG= kldunload MAN= kldunload.8 -WARNS?= 6 .include diff --git a/sbin/ldconfig/Makefile b/sbin/ldconfig/Makefile index 442ae6350713..15c3808520ba 100644 --- a/sbin/ldconfig/Makefile +++ b/sbin/ldconfig/Makefile @@ -3,7 +3,6 @@ PROG= ldconfig SRCS= elfhints.c ldconfig.c shlib.c support.c LDDIR?= ${.CURDIR}/../../libexec/rtld-aout -WARNS?= 6 CFLAGS+=-I${LDDIR} -DFREEBSD_AOUT MAN= ldconfig.8 diff --git a/sbin/ldconfig/ldconfig.c b/sbin/ldconfig/ldconfig.c index 6364653880c4..7fc64818d286 100644 --- a/sbin/ldconfig/ldconfig.c +++ b/sbin/ldconfig/ldconfig.c @@ -222,7 +222,7 @@ main(int argc, char **argv) } static void -usage() +usage(void) { fprintf(stderr, "usage: ldconfig [-32] [-aout | -elf] [-Rimrsv] [-f hints_file] [directory | file ...]\n"); @@ -230,9 +230,7 @@ usage() } int -dofile(fname, silent) -char *fname; -int silent; +dofile(char *fname, int silent) { FILE *hfp; char buf[MAXPATHLEN]; @@ -269,9 +267,7 @@ int silent; } int -dodir(dir, silent) -char *dir; -int silent; +dodir(char *dir, int silent) { DIR *dd; struct dirent *dp; @@ -328,9 +324,7 @@ int silent; } static void -enter(dir, file, name, dewey, ndewey) -char *dir, *file, *name; -int dewey[], ndewey; +enter(char *dir, char *file, char *name, int dewey[], int ndewey) { struct shlib_list *shp; @@ -391,7 +385,7 @@ hinthash(char *cp, int vmajor) } int -buildhints() +buildhints(void) { struct hints_header hdr; struct hints_bucket *blist; @@ -523,7 +517,7 @@ buildhints() } static int -readhints() +readhints(void) { int fd; void *addr; @@ -623,7 +617,7 @@ readhints() } static void -listhints() +listhints(void) { struct shlib_list *shp; int i; diff --git a/sbin/md5/Makefile b/sbin/md5/Makefile index 07c4109e0d79..7df4d859c93b 100644 --- a/sbin/md5/Makefile +++ b/sbin/md5/Makefile @@ -11,7 +11,6 @@ MLINKS= md5.1 rmd160.1 \ md5.1 sha1.1 \ md5.1 sha256.1 -WARNS?= 6 WFORMAT?= 1 DPADD= ${LIBMD} diff --git a/sbin/mdconfig/mdconfig.c b/sbin/mdconfig/mdconfig.c index 107a25975097..a5644848a4d9 100644 --- a/sbin/mdconfig/mdconfig.c +++ b/sbin/mdconfig/mdconfig.c @@ -41,7 +41,7 @@ static void usage(void); static int md_find(char *, const char *); static int md_query(char *name); static int md_list(char *units, int opt); -static char *geom_config_get(struct gconf *g, char *name); +static char *geom_config_get(struct gconf *g, const char *name); static void md_prthumanval(char *length); #define OPT_VERBOSE 0x01 @@ -52,7 +52,7 @@ static void md_prthumanval(char *length); #define CLASS_NAME_MD "MD" static void -usage() +usage(void) { fprintf(stderr, "usage: mdconfig -a -t type [-n] [-o [no]option] ... [-f file]\n" @@ -74,7 +74,7 @@ main(int argc, char **argv) int ch, fd, i, vflag; char *p; int cmdline = 0; - char *mdunit; + char *mdunit = NULL; bzero(&mdio, sizeof(mdio)); mdio.md_file = malloc(PATH_MAX); @@ -379,10 +379,9 @@ md_list(char *units, int opt) if (strcmp(type, "vnode") == 0) file = geom_config_get(gc, "file"); length = geom_config_get(gc, "length"); - if (length == NULL) - length = ""; printf("\t%s\t", type); - md_prthumanval(length); + if (length != NULL) + md_prthumanval(length); if (file != NULL) { printf("\t%s", file); file = NULL; @@ -409,7 +408,7 @@ md_list(char *units, int opt) * Returns value of 'name' from gconfig structure. */ static char * -geom_config_get(struct gconf *g, char *name) +geom_config_get(struct gconf *g, const char *name) { struct gconfig *gce; @@ -454,14 +453,15 @@ static void md_prthumanval(char *length) { char buf[6]; - uint64_t bytes; + uintmax_t bytes; char *endptr; - bytes = strtoul(length, &endptr, 10); - if (bytes == (unsigned)ULONG_MAX || *endptr != '\0') + errno = 0; + bytes = strtoumax(length, &endptr, 10); + if (errno != 0 || *endptr != '\0' || bytes > INT64_MAX) return; - humanize_number(buf, sizeof(buf) - (bytes < 0 ? 0 : 1), - bytes, "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); + humanize_number(buf, sizeof(buf), (int64_t)bytes, "", + HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); (void)printf("%6s", buf); } diff --git a/sbin/mdmfs/Makefile b/sbin/mdmfs/Makefile index 1ef708454267..999793f0e103 100644 --- a/sbin/mdmfs/Makefile +++ b/sbin/mdmfs/Makefile @@ -4,6 +4,5 @@ PROG= mdmfs LINKS= ${BINDIR}/${PROG} ${BINDIR}/mount_mfs MAN= mdmfs.8 MLINKS+= mdmfs.8 mount_mfs.8 -WARNS?= 6 .include diff --git a/sbin/mknod/Makefile b/sbin/mknod/Makefile index d28d3a595377..63235b2ce6e4 100644 --- a/sbin/mknod/Makefile +++ b/sbin/mknod/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= mknod -WARNS?= 0 MAN= mknod.8 .include diff --git a/sbin/mknod/mknod.8 b/sbin/mknod/mknod.8 index 54b544153c97..22efbd1280fe 100644 --- a/sbin/mknod/mknod.8 +++ b/sbin/mknod/mknod.8 @@ -28,7 +28,7 @@ .\" @(#)mknod.8 8.2 (Berkeley) 12/11/93 .\" $FreeBSD$ .\" -.Dd December 15, 2004 +.Dd January 31, 2010 .Dt MKNOD 8 .Os .Sh NAME @@ -37,6 +37,8 @@ .Sh SYNOPSIS .Nm .Ar name +.Nm +.Ar name .Op Cm b | c .Ar major minor .Op Ar owner : Ns Ar group @@ -52,14 +54,14 @@ systems. The .Nm utility creates device special files. -To make nodes manually, the four required arguments are: +To make nodes manually, the arguments are: .Pp .Bl -tag -width indent .It Ar name Device name, for example -.Dq sd -for a SCSI disk on an HP300 or a -.Dq pty +.Pa /dev/da0 +for a SCSI disk or +.Pa /dev/pts/0 for pseudo-terminals. .It Cm b | c Type of device. @@ -74,9 +76,6 @@ and pseudo devices, and are type .It Ar major The major device number is an integer number which tells the kernel which device driver entry point to use. -To learn what -major device number to use for a particular device, check -.Pa /usr/src/sys/conf/majors . .It Ar minor The minor device number tells the kernel which subunit the node corresponds to on the device; for example, @@ -113,13 +112,13 @@ The .Nm utility can be used to recreate deleted device nodes under a .Xr devfs 5 -mount point by invoking it using dummy arguments. +mount point by invoking it with only a filename as an argument. Example: .Pp -.Dl "mknod cd0 c 0 0" +.Dl "mknod /dev/cd0" .Pp where -.Dq Li cd0 +.Pa /dev/cd0 is the name of the deleted device node. .Sh COMPATIBILITY The diff --git a/sbin/mknod/mknod.c b/sbin/mknod/mknod.c index 4c6c399d3fd4..6905cae0a66f 100644 --- a/sbin/mknod/mknod.c +++ b/sbin/mknod/mknod.c @@ -61,7 +61,8 @@ usage(void) { (void)fprintf(stderr, - "usage: mknod name [b | c] major minor [owner:group]\n"); + "usage: mknod name\n" + " mknod name [b | c] major minor [owner:group]\n"); exit(1); } @@ -115,31 +116,36 @@ main(int argc, char **argv) char *cp, *endp; long mymajor, myminor; - if (argc != 5 && argc != 6) + if (argc != 2 && argc != 5 && argc != 6) usage(); - mode = 0666; - if (argv[2][0] == 'c') - mode |= S_IFCHR; - else if (argv[2][0] == 'b') - mode |= S_IFBLK; - else - errx(1, "node must be type 'b' or 'c'"); + if (argc >= 5) { + mode = 0666; + if (argv[2][0] == 'c') + mode |= S_IFCHR; + else if (argv[2][0] == 'b') + mode |= S_IFBLK; + else + errx(1, "node must be type 'b' or 'c'"); - errno = 0; - mymajor = (long)strtoul(argv[3], &endp, 0); - if (endp == argv[3] || *endp != '\0') - errx(1, "%s: non-numeric major number", argv[3]); - range_error = errno; - errno = 0; - myminor = (long)strtoul(argv[4], &endp, 0); - if (endp == argv[4] || *endp != '\0') - errx(1, "%s: non-numeric minor number", argv[4]); - range_error |= errno; - dev = makedev(mymajor, myminor); - if (range_error || major(dev) != (u_int) mymajor || - (long)(u_int)minor(dev) != myminor) - errx(1, "major or minor number too large"); + errno = 0; + mymajor = (long)strtoul(argv[3], &endp, 0); + if (endp == argv[3] || *endp != '\0') + errx(1, "%s: non-numeric major number", argv[3]); + range_error = errno; + errno = 0; + myminor = (long)strtoul(argv[4], &endp, 0); + if (endp == argv[4] || *endp != '\0') + errx(1, "%s: non-numeric minor number", argv[4]); + range_error |= errno; + dev = makedev(mymajor, myminor); + if (range_error || major(dev) != (u_int) mymajor || + (long)(u_int)minor(dev) != myminor) + errx(1, "major or minor number too large"); + } else { + mode = 0666 | S_IFCHR; + dev = 0; + } uid = gid = -1; if (6 == argc) { diff --git a/sbin/mksnap_ffs/Makefile b/sbin/mksnap_ffs/Makefile index 40b56b445da2..9247cb278edb 100644 --- a/sbin/mksnap_ffs/Makefile +++ b/sbin/mksnap_ffs/Makefile @@ -6,6 +6,7 @@ PROG= mksnap_ffs SRCS= mksnap_ffs.c getmntopts.c MAN= mksnap_ffs.8 +WARNS?= 2 CFLAGS+=-I${.CURDIR}/../mount .if defined(NOSUID) diff --git a/sbin/mount/Makefile b/sbin/mount/Makefile index 4186f00f6fd1..8f6299af3ff5 100644 --- a/sbin/mount/Makefile +++ b/sbin/mount/Makefile @@ -3,7 +3,6 @@ PROG= mount SRCS= mount.c mount_fs.c getmntopts.c vfslist.c -WARNS?= 6 MAN= mount.8 # We do NOT install the getmntopts.3 man page. diff --git a/sbin/mount/mntopts.h b/sbin/mount/mntopts.h index 2fcbbddbbc11..2903d553f4ef 100644 --- a/sbin/mount/mntopts.h +++ b/sbin/mount/mntopts.h @@ -54,6 +54,7 @@ struct mntopt { #define MOPT_SNAPSHOT { "snapshot", 0, MNT_SNAPSHOT, 0 } #define MOPT_MULTILABEL { "multilabel", 0, MNT_MULTILABEL, 0 } #define MOPT_ACLS { "acls", 0, MNT_ACLS, 0 } +#define MOPT_NFS4ACLS { "nfsv4acls", 0, MNT_NFS4ACLS, 0 } /* Control flags. */ #define MOPT_FORCE { "force", 0, MNT_FORCE, 0 } @@ -87,7 +88,8 @@ struct mntopt { MOPT_NOCLUSTERR, \ MOPT_NOCLUSTERW, \ MOPT_MULTILABEL, \ - MOPT_ACLS + MOPT_ACLS, \ + MOPT_NFS4ACLS void getmntopts(const char *, const struct mntopt *, int *, int *); void rmslashes(char *, char *); diff --git a/sbin/mount/mount.8 b/sbin/mount/mount.8 index 104b248f2708..d3f6717bf375 100644 --- a/sbin/mount/mount.8 +++ b/sbin/mount/mount.8 @@ -28,7 +28,7 @@ .\" @(#)mount.8 8.8 (Berkeley) 6/16/94 .\" $FreeBSD$ .\" -.Dd March 11, 2008 +.Dd February 10, 2010 .Dt MOUNT 8 .Os .Sh NAME @@ -120,11 +120,14 @@ takes effect. The following options are available: .Bl -tag -width indent .It Cm acls -Enable Access Control Lists, or ACLS, which can be customized via the +Enable POSIX.1e Access Control Lists, or ACLs, which can be customized via the .Xr setfacl 1 and .Xr getfacl 1 commands. +This flag is mutually exclusive with +.Cm nfsv4acls +flag. .It Cm async All .Tn I/O @@ -186,6 +189,15 @@ See .Xr mac 4 for more information, which cause the multilabel mount flag to be set automatically at mount-time. +.It Cm nfsv4acls +Enable NFSv4 ACLs, which can be customized via the +.Xr setfacl 1 +and +.Xr getfacl 1 +commands. +This flag is mutually exclusive with +.Cm acls +flag. .It Cm noasync Metadata I/O should be done synchronously, while data I/O should be done asynchronously. @@ -421,8 +433,8 @@ However, for the following file system types: .Cm cd9660 , .Cm mfs , .Cm msdosfs , +.Cm newnfs , .Cm nfs , -.Cm nfs4 , .Cm ntfs , .Cm nwfs , .Cm nullfs , @@ -527,7 +539,9 @@ support for a particular file system might be provided either on a static .Xr mount_smbfs 8 , .Xr mount_udf 8 , .Xr mount_unionfs 8 , -.Xr umount 8 +.Xr umount 8 , +.Xr zfs 8 , +.Xr zpool 8 .Sh CAVEATS After a successful .Nm , diff --git a/sbin/mount/mount.c b/sbin/mount/mount.c index 0bd553377bb0..907f7541bf73 100644 --- a/sbin/mount/mount.c +++ b/sbin/mount/mount.c @@ -111,6 +111,7 @@ static struct opt { { MNT_SOFTDEP, "soft-updates" }, { MNT_MULTILABEL, "multilabel" }, { MNT_ACLS, "acls" }, + { MNT_NFS4ACLS, "nfsv4acls" }, { MNT_GJOURNAL, "gjournal" }, { 0, NULL } }; @@ -918,6 +919,7 @@ flags2opts(int flags) if (flags & MNT_SUIDDIR) res = catopt(res, "suiddir"); if (flags & MNT_MULTILABEL) res = catopt(res, "multilabel"); if (flags & MNT_ACLS) res = catopt(res, "acls"); + if (flags & MNT_NFS4ACLS) res = catopt(res, "nfsv4acls"); return (res); } diff --git a/sbin/mount/vfslist.c b/sbin/mount/vfslist.c index f95a76efdb24..fa5fdf6d9540 100644 --- a/sbin/mount/vfslist.c +++ b/sbin/mount/vfslist.c @@ -44,9 +44,7 @@ __FBSDID("$FreeBSD$"); static int skipvfs; int -checkvfsname(vfsname, vfslist) - const char *vfsname; - const char **vfslist; +checkvfsname(const char *vfsname, const char **vfslist) { if (vfslist == NULL) @@ -60,8 +58,7 @@ checkvfsname(vfsname, vfslist) } const char ** -makevfslist(fslist) - char *fslist; +makevfslist(char *fslist) { const char **av; int i; diff --git a/sbin/mount_autofs/Makefile b/sbin/mount_autofs/Makefile index e7d040d4d08c..b05d9613df71 100644 --- a/sbin/mount_autofs/Makefile +++ b/sbin/mount_autofs/Makefile @@ -4,5 +4,6 @@ PROG=mount_autofs MAN=mount_autofs.8 BINDIR?=/sbin +WARNS?= 2 .include diff --git a/sbin/mount_cd9660/Makefile b/sbin/mount_cd9660/Makefile index 0602d9bbd29c..b889174ffa05 100644 --- a/sbin/mount_cd9660/Makefile +++ b/sbin/mount_cd9660/Makefile @@ -9,7 +9,6 @@ LDADD= -lkiconv MOUNT= ${.CURDIR}/../mount CFLAGS+= -I${MOUNT} -WARNS?= 6 # Needs to be dynamically linked for optional dlopen() access to # userland libiconv diff --git a/sbin/mount_cd9660/mount_cd9660.c b/sbin/mount_cd9660/mount_cd9660.c index 9a9bd9d04554..922f6cf73211 100644 --- a/sbin/mount_cd9660/mount_cd9660.c +++ b/sbin/mount_cd9660/mount_cd9660.c @@ -251,8 +251,10 @@ set_charset(struct iovec **iov, int *iovlen, const char *localcs) if ((cs_disk = malloc(ICONV_CSNMAXLEN)) == NULL) return (-1); - if ((cs_local = malloc(ICONV_CSNMAXLEN)) == NULL) + if ((cs_local = malloc(ICONV_CSNMAXLEN)) == NULL) { + free(cs_disk); return (-1); + } strncpy(cs_disk, ENCODING_UNICODE, ICONV_CSNMAXLEN); strncpy(cs_local, kiconv_quirkcs(localcs, KICONV_VENDOR_MICSFT), ICONV_CSNMAXLEN); diff --git a/sbin/mount_ext2fs/Makefile b/sbin/mount_ext2fs/Makefile index 3eefb92eb8c0..08a0c3c7e5a5 100644 --- a/sbin/mount_ext2fs/Makefile +++ b/sbin/mount_ext2fs/Makefile @@ -5,6 +5,7 @@ PROG= mount_ext2fs SRCS= mount_ext2fs.c getmntopts.c MAN= mount_ext2fs.8 +WARNS?= 2 MOUNT= ${.CURDIR}/../mount CFLAGS+= -I${MOUNT} diff --git a/sbin/mount_hpfs/Makefile b/sbin/mount_hpfs/Makefile index 084377407787..9e65b8e1833d 100644 --- a/sbin/mount_hpfs/Makefile +++ b/sbin/mount_hpfs/Makefile @@ -7,8 +7,7 @@ SRCS= mount_hpfs.c getmntopts.c MAN= mount_hpfs.8 MOUNT= ${.CURDIR}/../mount -CFLAGS+=-I${MOUNT} -DHPFS -WARNS?= 0 +CFLAGS+= -I${MOUNT} -DHPFS .PATH: ${MOUNT} diff --git a/sbin/mount_hpfs/mount_hpfs.c b/sbin/mount_hpfs/mount_hpfs.c index a9a87e238881..0106377c7454 100644 --- a/sbin/mount_hpfs/mount_hpfs.c +++ b/sbin/mount_hpfs/mount_hpfs.c @@ -60,9 +60,7 @@ static void usage(void) __dead2; static void load_u2wtable(struct hpfs_args *, char *); int -main(argc, argv) - int argc; - char **argv; +main(int argc, char *argv[]) { struct hpfs_args args; struct stat sb; @@ -150,8 +148,7 @@ main(argc, argv) } gid_t -a_gid(s) - char *s; +a_gid(char *s) { struct group *gr; char *gname; @@ -170,8 +167,7 @@ a_gid(s) } uid_t -a_uid(s) - char *s; +a_uid(char *s) { struct passwd *pw; char *uname; @@ -190,8 +186,7 @@ a_uid(s) } mode_t -a_mask(s) - char *s; +a_mask(char *s) { int done, rv=0; char *ep; @@ -207,16 +202,14 @@ a_mask(s) } void -usage() +usage(void) { fprintf(stderr, "usage: mount_hpfs [-u user] [-g group] [-m mask] bdev dir\n"); exit(EX_USAGE); } void -load_u2wtable (pargs, name) - struct hpfs_args *pargs; - char *name; +load_u2wtable (struct hpfs_args *pargs, char *name) { FILE *f; int i, code; diff --git a/sbin/mount_msdosfs/Makefile b/sbin/mount_msdosfs/Makefile index 8752f0d848a8..c3e416af21fc 100644 --- a/sbin/mount_msdosfs/Makefile +++ b/sbin/mount_msdosfs/Makefile @@ -10,7 +10,6 @@ LDADD= -lkiconv MOUNT= ${.CURDIR}/../mount CFLAGS+= -I${MOUNT} -WARNS?= 6 # Needs to be dynamically linked for optional dlopen() access to # userland libiconv diff --git a/sbin/mount_msdosfs/mount_msdosfs.8 b/sbin/mount_msdosfs/mount_msdosfs.8 index 857899b392a0..9a3be1377ebe 100644 --- a/sbin/mount_msdosfs/mount_msdosfs.8 +++ b/sbin/mount_msdosfs/mount_msdosfs.8 @@ -205,14 +205,6 @@ The use of the flag could result in damaged file systems, albeit the damage is in part taken care of by procedures similar to the ones used in Win'95. -.Pp -.Fx 2.1 -and earlier versions could not handle cluster sizes larger than 16K. -Just mounting an MS-DOS file system could cause corruption to any -mounted file system. -Cluster sizes larger than 16K are unavoidable for file system sizes -larger than 1G, and also occur when file systems larger than 1G are -shrunk to smaller than 1G using FIPS. .Sh HISTORY The .Nm diff --git a/sbin/mount_msdosfs/mount_msdosfs.c b/sbin/mount_msdosfs/mount_msdosfs.c index 096f04a683a2..3ba67ea60eb3 100644 --- a/sbin/mount_msdosfs/mount_msdosfs.c +++ b/sbin/mount_msdosfs/mount_msdosfs.c @@ -229,8 +229,7 @@ main(int argc, char **argv) } gid_t -a_gid(s) - char *s; +a_gid(char *s) { struct group *gr; char *gname; @@ -249,8 +248,7 @@ a_gid(s) } uid_t -a_uid(s) - char *s; +a_uid(char *s) { struct passwd *pw; char *uname; @@ -269,8 +267,7 @@ a_uid(s) } mode_t -a_mask(s) - char *s; +a_mask(char *s) { int done, rv; char *ep; @@ -287,7 +284,7 @@ a_mask(s) } void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n%s\n", "usage: mount_msdosfs [-9ls] [-D DOS_codepage] [-g gid] [-L locale]", diff --git a/sbin/mount_nfs/mount_nfs.8 b/sbin/mount_nfs/mount_nfs.8 index 3d8c4d653c24..39334306112f 100644 --- a/sbin/mount_nfs/mount_nfs.8 +++ b/sbin/mount_nfs/mount_nfs.8 @@ -151,6 +151,10 @@ Force the mount protocol to use UDP transport, even for TCP NFS mounts. (Necessary for some old .Bx servers.) +.It Cm negnametimeo Ns = Ns Aq Ar value +Override the default of NFS_DEFAULT_NEGNAMETIMEO for the timeout (in seconds) +for negative name cache entries. If this is set to 0 it disables negative +name caching for the mount point. .It Cm nfsv2 Use the NFS Version 2 protocol (the default is to try version 3 first then version 2). diff --git a/sbin/mount_nfs/mount_nfs.c b/sbin/mount_nfs/mount_nfs.c index 7d4f3f65e1c7..5e722a00936b 100644 --- a/sbin/mount_nfs/mount_nfs.c +++ b/sbin/mount_nfs/mount_nfs.c @@ -130,20 +130,19 @@ enum tryret { TRYRET_LOCALERR /* Local failure. */ }; -int fallback_mount(struct iovec *iov, int iovlen, int mntflags); -int sec_name_to_num(char *sec); -char *sec_num_to_name(int num); -int getnfsargs(char *, struct iovec **iov, int *iovlen); +static int fallback_mount(struct iovec *iov, int iovlen, int mntflags); +static int sec_name_to_num(char *sec); +static char *sec_num_to_name(int num); +static int getnfsargs(char *, struct iovec **iov, int *iovlen); /* void set_rpc_maxgrouplist(int); */ -struct netconfig *getnetconf_cached(const char *netid); -const char *netidbytype(int af, int sotype); -void usage(void) __dead2; -int xdr_dir(XDR *, char *); -int xdr_fh(XDR *, struct nfhret *); -enum tryret nfs_tryproto(struct addrinfo *ai, char *hostp, char *spec, +static struct netconfig *getnetconf_cached(const char *netid); +static const char *netidbytype(int af, int sotype); +static void usage(void) __dead2; +static int xdr_dir(XDR *, char *); +static int xdr_fh(XDR *, struct nfhret *); +static enum tryret nfs_tryproto(struct addrinfo *ai, char *hostp, char *spec, char **errstr, struct iovec **iov, int *iovlen); -enum tryret returncode(enum clnt_stat stat, struct rpc_err *rpcerr); -extern int getosreldate(void); +static enum tryret returncode(enum clnt_stat stat, struct rpc_err *rpcerr); int main(int argc, char *argv[]) @@ -232,16 +231,16 @@ main(int argc, char *argv[]) char *pnextopt = NULL; char *val = ""; pass_flag_to_nmount = 1; - pval = strchr(opt, '='); pnextopt = strchr(opt, ','); + if (pnextopt != NULL) { + *pnextopt = '\0'; + pnextopt++; + } + pval = strchr(opt, '='); if (pval != NULL) { *pval = '\0'; val = pval + 1; } - if (pnextopt) { - *pnextopt = '\0'; - pnextopt++; - } if (strcmp(opt, "bg") == 0) { opflags |= BGRND; pass_flag_to_nmount=0; @@ -476,7 +475,7 @@ copyopt(struct iovec **newiov, int *newiovlen, * passing NFS mount options to nmount() as individual * parameters. It should be eventually be removed. */ -int +static int fallback_mount(struct iovec *iov, int iovlen, int mntflags) { struct nfs_args args = { @@ -663,7 +662,7 @@ fallback_mount(struct iovec *iov, int iovlen, int mntflags) return nmount(newiov, newiovlen, mntflags); } -int +static int sec_name_to_num(char *sec) { if (!strcmp(sec, "krb5")) @@ -677,7 +676,7 @@ sec_name_to_num(char *sec) return (-1); } -char * +static char * sec_num_to_name(int flavor) { switch (flavor) { @@ -693,17 +692,22 @@ sec_num_to_name(int flavor) return (NULL); } -int +static int getnfsargs(char *spec, struct iovec **iov, int *iovlen) { struct addrinfo hints, *ai_nfs, *ai; enum tryret ret; - int ecode, speclen, remoteerr; + int ecode, speclen, remoteerr, offset, have_bracket = 0; char *hostp, *delimp, *errstr; size_t len; static char nam[MNAMELEN + 1], pname[MAXHOSTNAMELEN + 5]; - if ((delimp = strrchr(spec, ':')) != NULL) { + if (*spec == '[' && (delimp = strchr(spec + 1, ']')) != NULL && + *(delimp + 1) == ':') { + hostp = spec + 1; + spec = delimp + 2; + have_bracket = 1; + } else if ((delimp = strrchr(spec, ':')) != NULL) { hostp = spec; spec = delimp + 1; } else if ((delimp = strrchr(spec, '@')) != NULL) { @@ -731,10 +735,15 @@ getnfsargs(char *spec, struct iovec **iov, int *iovlen) /* Make both '@' and ':' notations equal */ if (*hostp != '\0') { len = strlen(hostp); - memmove(nam, hostp, len); - nam[len] = ':'; - memmove(nam + len + 1, spec, speclen); - nam[len + speclen + 1] = '\0'; + offset = 0; + if (have_bracket) + nam[offset++] = '['; + memmove(nam + offset, hostp, len); + if (have_bracket) + nam[len + offset++] = ']'; + nam[len + offset++] = ':'; + memmove(nam + len + offset, spec, speclen); + nam[len + speclen + offset] = '\0'; } /* @@ -839,7 +848,7 @@ getnfsargs(char *spec, struct iovec **iov, int *iovlen) * In all error cases, *errstr will be set to a statically-allocated string * describing the error. */ -enum tryret +static enum tryret nfs_tryproto(struct addrinfo *ai, char *hostp, char *spec, char **errstr, struct iovec **iov, int *iovlen) { @@ -1061,7 +1070,7 @@ tryagain: * Catagorise a RPC return status and error into an `enum tryret' * return code. */ -enum tryret +static enum tryret returncode(enum clnt_stat stat, struct rpc_err *rpcerr) { switch (stat) { @@ -1096,7 +1105,7 @@ returncode(enum clnt_stat stat, struct rpc_err *rpcerr) * * XXX there should be a library function for this. */ -const char * +static const char * netidbytype(int af, int sotype) { struct nc_protos *p; @@ -1116,7 +1125,7 @@ netidbytype(int af, int sotype) * Otherwise it behaves just like getnetconfigent(), so nc_*error() * work on failure. */ -struct netconfig * +static struct netconfig * getnetconf_cached(const char *netid) { static struct nc_entry { @@ -1144,13 +1153,13 @@ getnetconf_cached(const char *netid) /* * xdr routines for mount rpc's */ -int +static int xdr_dir(XDR *xdrsp, char *dirp) { return (xdr_string(xdrsp, &dirp, MNTPATHLEN)); } -int +static int xdr_fh(XDR *xdrsp, struct nfhret *np) { int i; @@ -1196,8 +1205,8 @@ xdr_fh(XDR *xdrsp, struct nfhret *np) return (0); } -void -usage() +static void +usage(void) { (void)fprintf(stderr, "%s\n%s\n%s\n%s\n", "usage: mount_nfs [-23bcdiLlNPsTU] [-a maxreadahead] [-D deadthresh]", diff --git a/sbin/mount_ntfs/Makefile b/sbin/mount_ntfs/Makefile index 5938b0dd52a6..416f1ac8ab24 100644 --- a/sbin/mount_ntfs/Makefile +++ b/sbin/mount_ntfs/Makefile @@ -9,8 +9,7 @@ DPADD= ${LIBKICONV} LDADD= -lkiconv MOUNT= ${.CURDIR}/../mount -CFLAGS+=-I${MOUNT} -WARNS?= 0 +CFLAGS+= -I${MOUNT} # Needs to be dynamically linked for optional dlopen() access to # userland libiconv diff --git a/sbin/mount_ntfs/mount_ntfs.c b/sbin/mount_ntfs/mount_ntfs.c index 4bd118f2b527..80fcab02e16b 100644 --- a/sbin/mount_ntfs/mount_ntfs.c +++ b/sbin/mount_ntfs/mount_ntfs.c @@ -69,9 +69,7 @@ static void usage(void) __dead2; static int set_charset(struct ntfs_args *); int -main(argc, argv) - int argc; - char **argv; +main(int argc, char *argv[]) { struct ntfs_args args; struct stat sb; @@ -193,8 +191,7 @@ main(argc, argv) } gid_t -a_gid(s) - char *s; +a_gid(char *s) { struct group *gr; char *gname; @@ -213,8 +210,7 @@ a_gid(s) } uid_t -a_uid(s) - char *s; +a_uid(char *s) { struct passwd *pw; char *uname; @@ -233,8 +229,7 @@ a_uid(s) } mode_t -a_mask(s) - char *s; +a_mask(char *s) { int done, rv=0; char *ep; @@ -250,7 +245,7 @@ a_mask(s) } void -usage() +usage(void) { #ifdef TRANSITION_PERIOD_HACK fprintf(stderr, "%s\n%s\n", diff --git a/sbin/mount_nullfs/Makefile b/sbin/mount_nullfs/Makefile index 5e92c5b5c264..0b2ecc5834c0 100644 --- a/sbin/mount_nullfs/Makefile +++ b/sbin/mount_nullfs/Makefile @@ -7,7 +7,6 @@ MAN= mount_nullfs.8 MOUNT= ${.CURDIR}/../mount CFLAGS+=-I${MOUNT} -WARNS?= 6 .PATH: ${MOUNT} diff --git a/sbin/mount_nullfs/mount_nullfs.c b/sbin/mount_nullfs/mount_nullfs.c index a0ad5f681908..abca9fabe068 100644 --- a/sbin/mount_nullfs/mount_nullfs.c +++ b/sbin/mount_nullfs/mount_nullfs.c @@ -116,9 +116,7 @@ main(int argc, char *argv[]) } int -subdir(p, dir) - const char *p; - const char *dir; +subdir(const char *p, const char *dir) { int l; @@ -133,7 +131,7 @@ subdir(p, dir) } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: mount_nullfs [-o options] target mount-point\n"); diff --git a/sbin/mount_reiserfs/Makefile b/sbin/mount_reiserfs/Makefile index bd11a4b8ac64..686629fe1843 100644 --- a/sbin/mount_reiserfs/Makefile +++ b/sbin/mount_reiserfs/Makefile @@ -7,7 +7,6 @@ MAN = mount_reiserfs.8 # mount_reiserfs needs mntopts.h and getmntopts.c from src/sbin/mount/ MOUNT ?= ${.CURDIR}/../mount CFLAGS += -I${MOUNT} -WARNS ?= 6 .PATH: ${MOUNT} diff --git a/sbin/mount_std/Makefile b/sbin/mount_std/Makefile index 110a5256cf22..44ff9ef6eb64 100644 --- a/sbin/mount_std/Makefile +++ b/sbin/mount_std/Makefile @@ -11,7 +11,7 @@ MLINKS= mount_std.8 mount_devfs.8 \ MOUNT= ${.CURDIR}/../mount CFLAGS+= -I${MOUNT} -WARNS?= 0 +WARNS?= 3 .PATH: ${MOUNT} diff --git a/sbin/mount_unionfs/Makefile b/sbin/mount_unionfs/Makefile index 35158ab92378..276fc7467d13 100644 --- a/sbin/mount_unionfs/Makefile +++ b/sbin/mount_unionfs/Makefile @@ -7,7 +7,6 @@ MAN= mount_unionfs.8 MOUNT= ${.CURDIR}/../mount CFLAGS+=-I${MOUNT} -WARNS?= 6 .PATH: ${MOUNT} diff --git a/sbin/natd/Makefile b/sbin/natd/Makefile index c6bf3267a7cf..7d8b3e49eae1 100644 --- a/sbin/natd/Makefile +++ b/sbin/natd/Makefile @@ -2,7 +2,7 @@ PROG = natd SRCS = natd.c icmp.c -WARNS?= 0 +WARNS?= 3 LDADD = -lalias DPADD = ${LIBALIAS} MAN = natd.8 diff --git a/sbin/natd/natd.c b/sbin/natd/natd.c index 445077f4fbe0..184de51ffb93 100644 --- a/sbin/natd/natd.c +++ b/sbin/natd/natd.c @@ -68,7 +68,7 @@ struct instance { int divertInOut; }; -static LIST_HEAD(, instance) root = LIST_HEAD_INITIALIZER(&root); +static LIST_HEAD(, instance) root = LIST_HEAD_INITIALIZER(root); struct libalias *mla; struct instance *mip; @@ -444,7 +444,7 @@ int main (int argc, char** argv) return 0; } -static void DaemonMode () +static void DaemonMode(void) { FILE* pidFile; @@ -1558,7 +1558,7 @@ void ReadConfigFile (const char* fileName) fclose (file); } -static void Usage () +static void Usage(void) { int i; int max; diff --git a/sbin/newfs/Makefile b/sbin/newfs/Makefile index 9454e5301444..f89499e5da0b 100644 --- a/sbin/newfs/Makefile +++ b/sbin/newfs/Makefile @@ -8,7 +8,7 @@ DPADD= ${LIBUFS} LDADD= -lufs SRCS= newfs.c mkfs.c geom_bsd_enc.c -WARNS?= 2 +WARNS?= 3 MAN= newfs.8 .include diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index f99cb14c5d37..6663b18f1d3e 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -114,10 +114,13 @@ void mkfs(struct partition *pp, char *fsys) { int fragsperinode, optimalfpg, origdensity, minfpg, lastminfpg; - long i, j, cylno, csfrags; + long i, j, csfrags; + uint cg; time_t utime; quad_t sizepb; int width; + ino_t maxinum; + int minfragsperinode; /* minimum ratio of frags to inodes */ char tmpbuf[100]; /* XXX this will break in about 2,500 years */ union { struct fs fdummy; @@ -170,6 +173,8 @@ mkfs(struct partition *pp, char *fsys) if (sblock.fs_avgfpdir <= 0) printf("illegal expected number of files per directory %d\n", sblock.fs_avgfpdir), exit(15); + +restart: /* * collect and verify the block and fragment sizes */ @@ -216,6 +221,8 @@ mkfs(struct partition *pp, char *fsys) sblock.fs_fsize, MAXFRAG, sblock.fs_bsize / MAXFRAG); sblock.fs_fsize = sblock.fs_bsize / MAXFRAG; } + if (maxbsize == 0) + maxbsize = bsize; if (maxbsize < bsize || !POWEROF2(maxbsize)) { sblock.fs_maxbsize = sblock.fs_bsize; printf("Extent size set to %d\n", sblock.fs_maxbsize); @@ -225,6 +232,14 @@ mkfs(struct partition *pp, char *fsys) } else { sblock.fs_maxbsize = maxbsize; } + /* + * Maxcontig sets the default for the maximum number of blocks + * that may be allocated sequentially. With file system clustering + * it is possible to allocate contiguous blocks up to the maximum + * transfer size permitted by the controller or buffering. + */ + if (maxcontig == 0) + maxcontig = MAX(1, MAXPHYS / bsize); sblock.fs_maxcontig = maxcontig; if (sblock.fs_maxcontig < sblock.fs_maxbsize / sblock.fs_bsize) { sblock.fs_maxcontig = sblock.fs_maxbsize / sblock.fs_bsize; @@ -315,9 +330,26 @@ mkfs(struct partition *pp, char *fsys) * can put into each cylinder group. If this is too big, we reduce * the density until it fits. */ + maxinum = (((int64_t)(1)) << 32) - INOPB(&sblock); + minfragsperinode = 1 + fssize / maxinum; + if (density == 0) { + density = MAX(NFPI, minfragsperinode) * fsize; + } else if (density < minfragsperinode * fsize) { + origdensity = density; + density = minfragsperinode * fsize; + fprintf(stderr, "density increased from %d to %d\n", + origdensity, density); + } origdensity = density; for (;;) { fragsperinode = MAX(numfrags(&sblock, density), 1); + if (fragsperinode < minfragsperinode) { + bsize <<= 1; + fsize <<= 1; + printf("Block size too small for a file system %s %d\n", + "of this size. Increasing blocksize to", bsize); + goto restart; + } minfpg = fragsperinode * INOPB(&sblock); if (minfpg > sblock.fs_size) minfpg = sblock.fs_size; @@ -406,7 +438,10 @@ mkfs(struct partition *pp, char *fsys) if (sblock.fs_sbsize > SBLOCKSIZE) sblock.fs_sbsize = SBLOCKSIZE; sblock.fs_minfree = minfree; - sblock.fs_maxbpg = maxbpg; + if (maxbpg == 0) + sblock.fs_maxbpg = MAXBLKPG(sblock.fs_bsize); + else + sblock.fs_maxbpg = maxbpg; sblock.fs_optim = opt; sblock.fs_cgrotor = 0; sblock.fs_pendingblocks = 0; @@ -476,9 +511,9 @@ mkfs(struct partition *pp, char *fsys) fsdummy.fs_magic = 0; bwrite(&disk, part_ofs + SBLOCK_UFS1 / disk.d_bsize, chdummy, SBLOCKSIZE); - for (i = 0; i < fsdummy.fs_ncg; i++) + for (cg = 0; cg < fsdummy.fs_ncg; cg++) bwrite(&disk, part_ofs + fsbtodb(&fsdummy, - cgsblock(&fsdummy, i)), chdummy, SBLOCKSIZE); + cgsblock(&fsdummy, cg)), chdummy, SBLOCKSIZE); } } if (!Nflag) @@ -516,11 +551,11 @@ mkfs(struct partition *pp, char *fsys) * writing out in each cylinder group. */ bcopy((char *)&sblock, iobuf, SBLOCKSIZE); - for (cylno = 0; cylno < sblock.fs_ncg; cylno++) { - initcg(cylno, utime); + for (cg = 0; cg < sblock.fs_ncg; cg++) { + initcg(cg, utime); j = snprintf(tmpbuf, sizeof(tmpbuf), " %jd%s", - (intmax_t)fsbtodb(&sblock, cgsblock(&sblock, cylno)), - cylno < (sblock.fs_ncg-1) ? "," : ""); + (intmax_t)fsbtodb(&sblock, cgsblock(&sblock, cg)), + cg < (sblock.fs_ncg-1) ? "," : ""); if (j < 0) tmpbuf[j = 0] = '\0'; if (i + j >= width) { @@ -557,7 +592,7 @@ mkfs(struct partition *pp, char *fsys) sblock.fs_cssize - i : sblock.fs_bsize, ((char *)fscs) + i); /* - * Update information about this partion in pack + * Update information about this partition in pack * label, to that it may be updated on disk. */ if (pp != NULL) { @@ -574,7 +609,8 @@ mkfs(struct partition *pp, char *fsys) void initcg(int cylno, time_t utime) { - long i, j, d, dlower, dupper, blkno, start; + long blkno, start; + uint i, j, d, dlower, dupper; ufs2_daddr_t cbase, dmax; struct ufs1_dinode *dp1; struct ufs2_dinode *dp2; @@ -631,7 +667,7 @@ initcg(int cylno, time_t utime) acg.cg_nextfreeoff = acg.cg_clusteroff + howmany(fragstoblks(&sblock, sblock.fs_fpg), CHAR_BIT); } - if (acg.cg_nextfreeoff > sblock.fs_cgsize) { + if (acg.cg_nextfreeoff > (unsigned)sblock.fs_cgsize) { printf("Panic: cylinder group too big\n"); exit(37); } @@ -880,7 +916,8 @@ makedir(struct direct *protodir, int entries) ufs2_daddr_t alloc(int size, int mode) { - int i, d, blkno, frag; + int i, blkno, frag; + uint d; bread(&disk, part_ofs + fsbtodb(&sblock, cgtod(&sblock, 0)), (char *)&acg, sblock.fs_cgsize); diff --git a/sbin/newfs/newfs.c b/sbin/newfs/newfs.c index 776b45df4f38..886730679d2e 100644 --- a/sbin/newfs/newfs.c +++ b/sbin/newfs/newfs.c @@ -79,38 +79,6 @@ __FBSDID("$FreeBSD$"); #include "newfs.h" -/* - * The following two constants set the default block and fragment sizes. - * Both constants must be a power of 2 and meet the following constraints: - * MINBSIZE <= DESBLKSIZE <= MAXBSIZE - * sectorsize <= DESFRAGSIZE <= DESBLKSIZE - * DESBLKSIZE / DESFRAGSIZE <= 8 - */ -#define DFL_FRAGSIZE 2048 -#define DFL_BLKSIZE 16384 - -/* - * Cylinder groups may have up to MAXBLKSPERCG blocks. The actual - * number used depends upon how much information can be stored - * in a cylinder group map which must fit in a single file system - * block. The default is to use as many as possible blocks per group. - */ -#define MAXBLKSPERCG 0x7fffffff /* desired fs_fpg ("infinity") */ - -/* - * MAXBLKPG determines the maximum number of data blocks which are - * placed in a single cylinder group. The default is one indirect - * block worth of data blocks. - */ -#define MAXBLKPG(bsize) ((bsize) / sizeof(ufs2_daddr_t)) - -/* - * Each file system has a number of inodes statically allocated. - * We allocate one inode slot per NFPI fragments, expecting this - * to be far more than we will ever need. - */ -#define NFPI 4 - int Eflag; /* Erase previous disk contents */ int Lflag; /* add a volume label */ int Nflag; /* run without writing file system */ @@ -387,25 +355,11 @@ main(int argc, char *argv[]) fsize = MAX(DFL_FRAGSIZE, sectorsize); if (bsize <= 0) bsize = MIN(DFL_BLKSIZE, 8 * fsize); - if (maxbsize == 0) - maxbsize = bsize; - /* - * Maxcontig sets the default for the maximum number of blocks - * that may be allocated sequentially. With file system clustering - * it is possible to allocate contiguous blocks up to the maximum - * transfer size permitted by the controller or buffering. - */ - if (maxcontig == 0) - maxcontig = MAX(1, MAXPHYS / bsize); - if (density == 0) - density = NFPI * fsize; if (minfree < MINFREE && opt != FS_OPTSPACE) { fprintf(stderr, "Warning: changing optimization to space "); fprintf(stderr, "because minfree is less than %d%%\n", MINFREE); opt = FS_OPTSPACE; } - if (maxbpg == 0) - maxbpg = MAXBLKPG(bsize); realsectorsize = sectorsize; if (sectorsize != DEV_BSIZE) { /* XXX */ int secperblk = sectorsize / DEV_BSIZE; @@ -499,13 +453,13 @@ usage() getprogname(), " [device-type]"); fprintf(stderr, "where fsoptions are:\n"); - fprintf(stderr, "\t-E Erase previuos disk content\n"); + fprintf(stderr, "\t-E Erase previous disk content\n"); fprintf(stderr, "\t-J Enable journaling via gjournal\n"); fprintf(stderr, "\t-L volume label to add to superblock\n"); fprintf(stderr, "\t-N do not create file system, just print out parameters\n"); fprintf(stderr, "\t-O file system format: 1 => UFS1, 2 => UFS2\n"); - fprintf(stderr, "\t-R regression test, supress random factors\n"); + fprintf(stderr, "\t-R regression test, suppress random factors\n"); fprintf(stderr, "\t-S sector size\n"); fprintf(stderr, "\t-T disktype\n"); fprintf(stderr, "\t-U enable soft updates\n"); diff --git a/sbin/newfs/newfs.h b/sbin/newfs/newfs.h index 0d7cb62379dc..9da3226a7756 100644 --- a/sbin/newfs/newfs.h +++ b/sbin/newfs/newfs.h @@ -40,6 +40,38 @@ #include +/* + * The following two constants set the default block and fragment sizes. + * Both constants must be a power of 2 and meet the following constraints: + * MINBSIZE <= DESBLKSIZE <= MAXBSIZE + * sectorsize <= DESFRAGSIZE <= DESBLKSIZE + * DESBLKSIZE / DESFRAGSIZE <= 8 + */ +#define DFL_FRAGSIZE 2048 +#define DFL_BLKSIZE 16384 + +/* + * Cylinder groups may have up to MAXBLKSPERCG blocks. The actual + * number used depends upon how much information can be stored + * in a cylinder group map which must fit in a single file system + * block. The default is to use as many as possible blocks per group. + */ +#define MAXBLKSPERCG 0x7fffffff /* desired fs_fpg ("infinity") */ + +/* + * MAXBLKPG determines the maximum number of data blocks which are + * placed in a single cylinder group. The default is one indirect + * block worth of data blocks. + */ +#define MAXBLKPG(bsize) ((bsize) / sizeof(ufs2_daddr_t)) + +/* + * Each file system has a number of inodes statically allocated. + * We allocate one inode slot per NFPI fragments, expecting this + * to be far more than we will ever need. + */ +#define NFPI 4 + /* * variables set up by front end. */ diff --git a/sbin/newfs_msdos/Makefile b/sbin/newfs_msdos/Makefile index 5ee8277d42a9..558f673edea4 100644 --- a/sbin/newfs_msdos/Makefile +++ b/sbin/newfs_msdos/Makefile @@ -5,8 +5,6 @@ MAN= newfs_msdos.8 .if ${MACHINE_ARCH} == "arm" WARNS?= 3 -.else -WARNS?= 6 .endif .include diff --git a/sbin/newfs_msdos/newfs_msdos.8 b/sbin/newfs_msdos/newfs_msdos.8 index c96e5f5df0e9..1c63a743f25d 100644 --- a/sbin/newfs_msdos/newfs_msdos.8 +++ b/sbin/newfs_msdos/newfs_msdos.8 @@ -38,14 +38,14 @@ .Op Fl B Ar boot .Op Fl C Ar create-size .Op Fl F Ar FAT-type -.Op Fl I Ar volid +.Op Fl I Ar VolumeId .Op Fl L Ar label .Op Fl O Ar OEM .Op Fl S Ar sector-size .Op Fl a Ar FAT-size .Op Fl b Ar block-size .Op Fl c Ar cluster-size -.Op Fl e Ar dirents +.Op Fl e Ar DirEnts .Op Fl f Ar format .Op Fl h Ar heads .Op Fl i Ar info @@ -103,7 +103,7 @@ If the file system supports sparse files, the space occupied on disk may be smaller than the size specified as parameter. .It Fl F Ar FAT-type FAT type (one of 12, 16, or 32). -.It Fl I Ar volid +.It Fl I Ar VolumeID Volume ID, a 32 bit number in decimal or hexadecimal (0x...) format. .It Fl L Ar label Volume label (up to 11 characters). @@ -116,7 +116,7 @@ The default is .It Fl S Ar sector-size Number of bytes per sector. Acceptable values are powers of 2 -in the range 128 through 32768. +in the range 512 through 32768. .It Fl a Ar FAT-size Number of sectors per FAT. .It Fl b Ar block-size @@ -130,7 +130,7 @@ Acceptable values are powers of 2 in the range If the block or cluster size are not specified, the code uses a cluster between 512 bytes and 32K depending on the filesystem size. -.It Fl e Ar dirents +.It Fl e Ar DirEnts Number of root directory entries (FAT12 and FAT16 only). .It Fl f Ar format Specify a standard (floppy disk) format. diff --git a/sbin/newfs_msdos/newfs_msdos.c b/sbin/newfs_msdos/newfs_msdos.c index f09578a9afa1..955c3a54d971 100644 --- a/sbin/newfs_msdos/newfs_msdos.c +++ b/sbin/newfs_msdos/newfs_msdos.c @@ -62,12 +62,12 @@ static const char rcsid[] = #define DEFBLK16 2048 /* default block size FAT16 */ #define DEFRDE 512 /* default root directory entries */ #define RESFTE 2 /* reserved FAT entries */ -#define MINCLS12 1 /* minimum FAT12 clusters */ -#define MINCLS16 0x1000 /* minimum FAT16 clusters */ -#define MINCLS32 2 /* minimum FAT32 clusters */ -#define MAXCLS12 0xfed /* maximum FAT12 clusters */ -#define MAXCLS16 0xfff5 /* maximum FAT16 clusters */ -#define MAXCLS32 0xffffff5 /* maximum FAT32 clusters */ +#define MINCLS12 1U /* minimum FAT12 clusters */ +#define MINCLS16 0x1000U /* minimum FAT16 clusters */ +#define MINCLS32 2U /* minimum FAT32 clusters */ +#define MAXCLS12 0xfedU /* maximum FAT12 clusters */ +#define MAXCLS16 0xfff5U /* maximum FAT16 clusters */ +#define MAXCLS32 0xffffff5U /* maximum FAT32 clusters */ #define mincls(fat) ((fat) == 12 ? MINCLS12 : \ (fat) == 16 ? MINCLS16 : \ @@ -96,89 +96,92 @@ static const char rcsid[] = #define argtox(arg, lo, msg) argtou(arg, lo, UINT_MAX, msg) struct bs { - u_int8_t jmp[3]; /* bootstrap entry point */ - u_int8_t oem[8]; /* OEM name and version */ + u_int8_t bsJump[3]; /* bootstrap entry point */ + u_int8_t bsOemName[8]; /* OEM name and version */ }; struct bsbpb { - u_int8_t bps[2]; /* bytes per sector */ - u_int8_t spc; /* sectors per cluster */ - u_int8_t res[2]; /* reserved sectors */ - u_int8_t nft; /* number of FATs */ - u_int8_t rde[2]; /* root directory entries */ - u_int8_t sec[2]; /* total sectors */ - u_int8_t mid; /* media descriptor */ - u_int8_t spf[2]; /* sectors per FAT */ - u_int8_t spt[2]; /* sectors per track */ - u_int8_t hds[2]; /* drive heads */ - u_int8_t hid[4]; /* hidden sectors */ - u_int8_t bsec[4]; /* big total sectors */ + u_int8_t bpbBytesPerSec[2]; /* bytes per sector */ + u_int8_t bpbSecPerClust; /* sectors per cluster */ + u_int8_t bpbResSectors[2]; /* reserved sectors */ + u_int8_t bpbFATs; /* number of FATs */ + u_int8_t bpbRootDirEnts[2]; /* root directory entries */ + u_int8_t bpbSectors[2]; /* total sectors */ + u_int8_t bpbMedia; /* media descriptor */ + u_int8_t bpbFATsecs[2]; /* sectors per FAT */ + u_int8_t bpbSecPerTrack[2]; /* sectors per track */ + u_int8_t bpbHeads[2]; /* drive heads */ + u_int8_t bpbHiddenSecs[4]; /* hidden sectors */ + u_int8_t bpbHugeSectors[4]; /* big total sectors */ }; struct bsxbpb { - u_int8_t bspf[4]; /* big sectors per FAT */ - u_int8_t xflg[2]; /* FAT control flags */ - u_int8_t vers[2]; /* file system version */ - u_int8_t rdcl[4]; /* root directory start cluster */ - u_int8_t infs[2]; /* file system info sector */ - u_int8_t bkbs[2]; /* backup boot sector */ - u_int8_t rsvd[12]; /* reserved */ + u_int8_t bpbBigFATsecs[4]; /* big sectors per FAT */ + u_int8_t bpbExtFlags[2]; /* FAT control flags */ + u_int8_t bpbFSVers[2]; /* file system version */ + u_int8_t bpbRootClust[4]; /* root directory start cluster */ + u_int8_t bpbFSInfo[2]; /* file system info sector */ + u_int8_t bpbBackup[2]; /* backup boot sector */ + u_int8_t bpbReserved[12]; /* reserved */ }; struct bsx { - u_int8_t drv; /* drive number */ - u_int8_t rsvd; /* reserved */ - u_int8_t sig; /* extended boot signature */ - u_int8_t volid[4]; /* volume ID number */ - u_int8_t label[11]; /* volume label */ - u_int8_t type[8]; /* file system type */ + u_int8_t exDriveNumber; /* drive number */ + u_int8_t exReserved1; /* reserved */ + u_int8_t exBootSignature; /* extended boot signature */ + u_int8_t exVolumeID[4]; /* volume ID number */ + u_int8_t exVolumeLabel[11]; /* volume label */ + u_int8_t exFileSysType[8]; /* file system type */ }; struct de { - u_int8_t namext[11]; /* name and extension */ - u_int8_t attr; /* attributes */ + u_int8_t deName[11]; /* name and extension */ + u_int8_t deAttributes; /* attributes */ u_int8_t rsvd[10]; /* reserved */ - u_int8_t time[2]; /* creation time */ - u_int8_t date[2]; /* creation date */ - u_int8_t clus[2]; /* starting cluster */ - u_int8_t size[4]; /* size */ + u_int8_t deMTime[2]; /* creation time */ + u_int8_t deMDate[2]; /* creation date */ + u_int8_t deStartCluster[2]; /* starting cluster */ + u_int8_t deFileSize[4]; /* size */ }; struct bpb { - u_int bps; /* bytes per sector */ - u_int spc; /* sectors per cluster */ - u_int res; /* reserved sectors */ - u_int nft; /* number of FATs */ - u_int rde; /* root directory entries */ - u_int sec; /* total sectors */ - u_int mid; /* media descriptor */ - u_int spf; /* sectors per FAT */ - u_int spt; /* sectors per track */ - u_int hds; /* drive heads */ - u_int hid; /* hidden sectors */ - u_int bsec; /* big total sectors */ - u_int bspf; /* big sectors per FAT */ - u_int rdcl; /* root directory start cluster */ - u_int infs; /* file system info sector */ - u_int bkbs; /* backup boot sector */ + u_int bpbBytesPerSec; /* bytes per sector */ + u_int bpbSecPerClust; /* sectors per cluster */ + u_int bpbResSectors; /* reserved sectors */ + u_int bpbFATs; /* number of FATs */ + u_int bpbRootDirEnts; /* root directory entries */ + u_int bpbSectors; /* total sectors */ + u_int bpbMedia; /* media descriptor */ + u_int bpbFATsecs; /* sectors per FAT */ + u_int bpbSecPerTrack; /* sectors per track */ + u_int bpbHeads; /* drive heads */ + u_int bpbHiddenSecs; /* hidden sectors */ + u_int bpbHugeSectors; /* big total sectors */ + u_int bpbBigFATsecs; /* big sectors per FAT */ + u_int bpbRootClust; /* root directory start cluster */ + u_int bpbFSInfo; /* file system info sector */ + u_int bpbBackup; /* backup boot sector */ }; #define BPBGAP 0, 0, 0, 0, 0, 0 +#define INIT(a, b, c, d, e, f, g, h, i, j) \ + { .bpbBytesPerSec = a, .bpbSecPerClust = b, .bpbResSectors = c, .bpbFATs = d, .bpbRootDirEnts = e, \ + .bpbSectors = f, .bpbMedia = g, .bpbFATsecs = h, .bpbSecPerTrack = i, .bpbHeads = j, } static struct { const char *name; struct bpb bpb; } const stdfmt[] = { - {"160", {512, 1, 1, 2, 64, 320, 0xfe, 1, 8, 1, BPBGAP}}, - {"180", {512, 1, 1, 2, 64, 360, 0xfc, 2, 9, 1, BPBGAP}}, - {"320", {512, 2, 1, 2, 112, 640, 0xff, 1, 8, 2, BPBGAP}}, - {"360", {512, 2, 1, 2, 112, 720, 0xfd, 2, 9, 2, BPBGAP}}, - {"640", {512, 2, 1, 2, 112, 1280, 0xfb, 2, 8, 2, BPBGAP}}, - {"720", {512, 2, 1, 2, 112, 1440, 0xf9, 3, 9, 2, BPBGAP}}, - {"1200", {512, 1, 1, 2, 224, 2400, 0xf9, 7, 15, 2, BPBGAP}}, - {"1232", {1024,1, 1, 2, 192, 1232, 0xfe, 2, 8, 2, BPBGAP}}, - {"1440", {512, 1, 1, 2, 224, 2880, 0xf0, 9, 18, 2, BPBGAP}}, - {"2880", {512, 2, 1, 2, 240, 5760, 0xf0, 9, 36, 2, BPBGAP}} + {"160", INIT(512, 1, 1, 2, 64, 320, 0xfe, 1, 8, 1)}, + {"180", INIT(512, 1, 1, 2, 64, 360, 0xfc, 2, 9, 1)}, + {"320", INIT(512, 2, 1, 2, 112, 640, 0xff, 1, 8, 2)}, + {"360", INIT(512, 2, 1, 2, 112, 720, 0xfd, 2, 9, 2)}, + {"640", INIT(512, 2, 1, 2, 112, 1280, 0xfb, 2, 8, 2)}, + {"720", INIT(512, 2, 1, 2, 112, 1440, 0xf9, 3, 9, 2)}, + {"1200", INIT(512, 1, 1, 2, 224, 2400, 0xf9, 7, 15, 2)}, + {"1232", INIT(1024,1, 1, 2, 192, 1232, 0xfe, 2, 8, 2)}, + {"1440", INIT(512, 1, 1, 2, 224, 2880, 0xf0, 9, 18, 2)}, + {"2880", INIT(512, 2, 1, 2, 240, 5760, 0xf0, 9, 36, 2)} }; static const u_int8_t bootcode[] = { @@ -381,49 +384,49 @@ main(int argc, char *argv[]) memset(&bpb, 0, sizeof(bpb)); if (opt_f) { getstdfmt(opt_f, &bpb); - bpb.bsec = bpb.sec; - bpb.sec = 0; - bpb.bspf = bpb.spf; - bpb.spf = 0; + bpb.bpbHugeSectors = bpb.bpbSectors; + bpb.bpbSectors = 0; + bpb.bpbBigFATsecs = bpb.bpbFATsecs; + bpb.bpbFATsecs = 0; } if (opt_h) - bpb.hds = opt_h; + bpb.bpbHeads = opt_h; if (opt_u) - bpb.spt = opt_u; + bpb.bpbSecPerTrack = opt_u; if (opt_S) - bpb.bps = opt_S; + bpb.bpbBytesPerSec = opt_S; if (opt_s) - bpb.bsec = opt_s; + bpb.bpbHugeSectors = opt_s; if (oflag) - bpb.hid = opt_o; + bpb.bpbHiddenSecs = opt_o; if (!(opt_f || (opt_h && opt_u && opt_S && opt_s && oflag))) { off_t delta; getdiskinfo(fd, fname, dtype, oflag, &bpb); - bpb.bsec -= (opt_ofs / bpb.bps); - delta = bpb.bsec % bpb.spt; + bpb.bpbHugeSectors -= (opt_ofs / bpb.bpbBytesPerSec); + delta = bpb.bpbHugeSectors % bpb.bpbSecPerTrack; if (delta != 0) { warnx("trim %d sectors to adjust to a multiple of %d", - (int)delta, bpb.spt); - bpb.bsec -= delta; + (int)delta, bpb.bpbSecPerTrack); + bpb.bpbHugeSectors -= delta; } - if (bpb.spc == 0) { /* set defaults */ - if (bpb.bsec <= 6000) /* about 3MB -> 512 bytes */ - bpb.spc = 1; - else if (bpb.bsec <= (1<<17)) /* 64M -> 4k */ - bpb.spc = 8; - else if (bpb.bsec <= (1<<19)) /* 256M -> 8k */ - bpb.spc = 16; - else if (bpb.bsec <= (1<<21)) /* 1G -> 16k */ - bpb.spc = 32; + if (bpb.bpbSecPerClust == 0) { /* set defaults */ + if (bpb.bpbHugeSectors <= 6000) /* about 3MB -> 512 bytes */ + bpb.bpbSecPerClust = 1; + else if (bpb.bpbHugeSectors <= (1<<17)) /* 64M -> 4k */ + bpb.bpbSecPerClust = 8; + else if (bpb.bpbHugeSectors <= (1<<19)) /* 256M -> 8k */ + bpb.bpbSecPerClust = 16; + else if (bpb.bpbHugeSectors <= (1<<21)) /* 1G -> 16k */ + bpb.bpbSecPerClust = 32; else - bpb.spc = 64; /* otherwise 32k */ + bpb.bpbSecPerClust = 64; /* otherwise 32k */ } } - if (!powerof2(bpb.bps)) - errx(1, "bytes/sector (%u) is not a power of 2", bpb.bps); - if (bpb.bps < MINBPS) + if (!powerof2(bpb.bpbBytesPerSec)) + errx(1, "bytes/sector (%u) is not a power of 2", bpb.bpbBytesPerSec); + if (bpb.bpbBytesPerSec < MINBPS) errx(1, "bytes/sector (%u) is too small; minimum is %u", - bpb.bps, MINBPS); + bpb.bpbBytesPerSec, MINBPS); if (!(fat = opt_F)) { if (opt_f) fat = 12; @@ -435,44 +438,44 @@ main(int argc, char *argv[]) fat == 32 ? 'e' : opt_i ? 'i' : 'k', fat == 32 ? "32" : "12/16"); if (opt_f && fat == 32) - bpb.rde = 0; + bpb.bpbRootDirEnts = 0; if (opt_b) { if (!powerof2(opt_b)) errx(1, "block size (%u) is not a power of 2", opt_b); - if (opt_b < bpb.bps) + if (opt_b < bpb.bpbBytesPerSec) errx(1, "block size (%u) is too small; minimum is %u", - opt_b, bpb.bps); - if (opt_b > bpb.bps * MAXSPC) + opt_b, bpb.bpbBytesPerSec); + if (opt_b > bpb.bpbBytesPerSec * MAXSPC) errx(1, "block size (%u) is too large; maximum is %u", - opt_b, bpb.bps * MAXSPC); - bpb.spc = opt_b / bpb.bps; + opt_b, bpb.bpbBytesPerSec * MAXSPC); + bpb.bpbSecPerClust = opt_b / bpb.bpbBytesPerSec; } if (opt_c) { if (!powerof2(opt_c)) errx(1, "sectors/cluster (%u) is not a power of 2", opt_c); - bpb.spc = opt_c; + bpb.bpbSecPerClust = opt_c; } if (opt_r) - bpb.res = opt_r; + bpb.bpbResSectors = opt_r; if (opt_n) { if (opt_n > MAXNFT) errx(1, "number of FATs (%u) is too large; maximum is %u", opt_n, MAXNFT); - bpb.nft = opt_n; + bpb.bpbFATs = opt_n; } if (opt_e) - bpb.rde = opt_e; + bpb.bpbRootDirEnts = opt_e; if (mflag) { if (opt_m < 0xf0) errx(1, "illegal media descriptor (%#x)", opt_m); - bpb.mid = opt_m; + bpb.bpbMedia = opt_m; } if (opt_a) - bpb.bspf = opt_a; + bpb.bpbBigFATsecs = opt_a; if (opt_i) - bpb.infs = opt_i; + bpb.bpbFSInfo = opt_i; if (opt_k) - bpb.bkbs = opt_k; + bpb.bpbBackup = opt_k; bss = 1; bname = NULL; fd1 = -1; @@ -485,87 +488,87 @@ main(int argc, char *argv[]) } if ((fd1 = open(bname, O_RDONLY)) == -1 || fstat(fd1, &sb)) err(1, "%s", bname); - if (!S_ISREG(sb.st_mode) || sb.st_size % bpb.bps || - sb.st_size < bpb.bps || sb.st_size > bpb.bps * MAXU16) + if (!S_ISREG(sb.st_mode) || sb.st_size % bpb.bpbBytesPerSec || + sb.st_size < bpb.bpbBytesPerSec || sb.st_size > bpb.bpbBytesPerSec * MAXU16) errx(1, "%s: inappropriate file type or format", bname); - bss = sb.st_size / bpb.bps; + bss = sb.st_size / bpb.bpbBytesPerSec; } - if (!bpb.nft) - bpb.nft = 2; + if (!bpb.bpbFATs) + bpb.bpbFATs = 2; if (!fat) { - if (bpb.bsec < (bpb.res ? bpb.res : bss) + - howmany((RESFTE + (bpb.spc ? MINCLS16 : MAXCLS12 + 1)) * - ((bpb.spc ? 16 : 12) / BPN), bpb.bps * NPB) * - bpb.nft + - howmany(bpb.rde ? bpb.rde : DEFRDE, - bpb.bps / sizeof(struct de)) + - (bpb.spc ? MINCLS16 : MAXCLS12 + 1) * - (bpb.spc ? bpb.spc : howmany(DEFBLK, bpb.bps))) + if (bpb.bpbHugeSectors < (bpb.bpbResSectors ? bpb.bpbResSectors : bss) + + howmany((RESFTE + (bpb.bpbSecPerClust ? MINCLS16 : MAXCLS12 + 1)) * + ((bpb.bpbSecPerClust ? 16 : 12) / BPN), bpb.bpbBytesPerSec * NPB) * + bpb.bpbFATs + + howmany(bpb.bpbRootDirEnts ? bpb.bpbRootDirEnts : DEFRDE, + bpb.bpbBytesPerSec / sizeof(struct de)) + + (bpb.bpbSecPerClust ? MINCLS16 : MAXCLS12 + 1) * + (bpb.bpbSecPerClust ? bpb.bpbSecPerClust : howmany(DEFBLK, bpb.bpbBytesPerSec))) fat = 12; - else if (bpb.rde || bpb.bsec < - (bpb.res ? bpb.res : bss) + - howmany((RESFTE + MAXCLS16) * 2, bpb.bps) * bpb.nft + - howmany(DEFRDE, bpb.bps / sizeof(struct de)) + + else if (bpb.bpbRootDirEnts || bpb.bpbHugeSectors < + (bpb.bpbResSectors ? bpb.bpbResSectors : bss) + + howmany((RESFTE + MAXCLS16) * 2, bpb.bpbBytesPerSec) * bpb.bpbFATs + + howmany(DEFRDE, bpb.bpbBytesPerSec / sizeof(struct de)) + (MAXCLS16 + 1) * - (bpb.spc ? bpb.spc : howmany(8192, bpb.bps))) + (bpb.bpbSecPerClust ? bpb.bpbSecPerClust : howmany(8192, bpb.bpbBytesPerSec))) fat = 16; else fat = 32; } x = bss; if (fat == 32) { - if (!bpb.infs) { - if (x == MAXU16 || x == bpb.bkbs) + if (!bpb.bpbFSInfo) { + if (x == MAXU16 || x == bpb.bpbBackup) errx(1, "no room for info sector"); - bpb.infs = x; + bpb.bpbFSInfo = x; } - if (bpb.infs != MAXU16 && x <= bpb.infs) - x = bpb.infs + 1; - if (!bpb.bkbs) { + if (bpb.bpbFSInfo != MAXU16 && x <= bpb.bpbFSInfo) + x = bpb.bpbFSInfo + 1; + if (!bpb.bpbBackup) { if (x == MAXU16) errx(1, "no room for backup sector"); - bpb.bkbs = x; - } else if (bpb.bkbs != MAXU16 && bpb.bkbs == bpb.infs) + bpb.bpbBackup = x; + } else if (bpb.bpbBackup != MAXU16 && bpb.bpbBackup == bpb.bpbFSInfo) errx(1, "backup sector would overwrite info sector"); - if (bpb.bkbs != MAXU16 && x <= bpb.bkbs) - x = bpb.bkbs + 1; + if (bpb.bpbBackup != MAXU16 && x <= bpb.bpbBackup) + x = bpb.bpbBackup + 1; } - if (!bpb.res) - bpb.res = fat == 32 ? MAX(x, MAX(16384 / bpb.bps, 4)) : x; - else if (bpb.res < x) - errx(1, "too few reserved sectors"); - if (fat != 32 && !bpb.rde) - bpb.rde = DEFRDE; - rds = howmany(bpb.rde, bpb.bps / sizeof(struct de)); - if (!bpb.spc) - for (bpb.spc = howmany(fat == 16 ? DEFBLK16 : DEFBLK, bpb.bps); - bpb.spc < MAXSPC && - bpb.res + + if (!bpb.bpbResSectors) + bpb.bpbResSectors = fat == 32 ? MAX(x, MAX(16384 / bpb.bpbBytesPerSec, 4)) : x; + else if (bpb.bpbResSectors < x) + errx(1, "too few reserved sectors (need %d have %d)", x, bpb.bpbResSectors); + if (fat != 32 && !bpb.bpbRootDirEnts) + bpb.bpbRootDirEnts = DEFRDE; + rds = howmany(bpb.bpbRootDirEnts, bpb.bpbBytesPerSec / sizeof(struct de)); + if (!bpb.bpbSecPerClust) + for (bpb.bpbSecPerClust = howmany(fat == 16 ? DEFBLK16 : DEFBLK, bpb.bpbBytesPerSec); + bpb.bpbSecPerClust < MAXSPC && + bpb.bpbResSectors + howmany((RESFTE + maxcls(fat)) * (fat / BPN), - bpb.bps * NPB) * bpb.nft + + bpb.bpbBytesPerSec * NPB) * bpb.bpbFATs + rds + - (u_int64_t)(maxcls(fat) + 1) * bpb.spc <= bpb.bsec; - bpb.spc <<= 1); - if (fat != 32 && bpb.bspf > MAXU16) + (u_int64_t)(maxcls(fat) + 1) * bpb.bpbSecPerClust <= bpb.bpbHugeSectors; + bpb.bpbSecPerClust <<= 1); + if (fat != 32 && bpb.bpbBigFATsecs > MAXU16) errx(1, "too many sectors/FAT for FAT12/16"); - x1 = bpb.res + rds; - x = bpb.bspf ? bpb.bspf : 1; - if (x1 + (u_int64_t)x * bpb.nft > bpb.bsec) + x1 = bpb.bpbResSectors + rds; + x = bpb.bpbBigFATsecs ? bpb.bpbBigFATsecs : 1; + if (x1 + (u_int64_t)x * bpb.bpbFATs > bpb.bpbHugeSectors) errx(1, "meta data exceeds file system size"); - x1 += x * bpb.nft; - x = (u_int64_t)(bpb.bsec - x1) * bpb.bps * NPB / - (bpb.spc * bpb.bps * NPB + fat / BPN * bpb.nft); + x1 += x * bpb.bpbFATs; + x = (u_int64_t)(bpb.bpbHugeSectors - x1) * bpb.bpbBytesPerSec * NPB / + (bpb.bpbSecPerClust * bpb.bpbBytesPerSec * NPB + fat / BPN * bpb.bpbFATs); x2 = howmany((RESFTE + MIN(x, maxcls(fat))) * (fat / BPN), - bpb.bps * NPB); - if (!bpb.bspf) { - bpb.bspf = x2; - x1 += (bpb.bspf - 1) * bpb.nft; + bpb.bpbBytesPerSec * NPB); + if (!bpb.bpbBigFATsecs) { + bpb.bpbBigFATsecs = x2; + x1 += (bpb.bpbBigFATsecs - 1) * bpb.bpbFATs; } - cls = (bpb.bsec - x1) / bpb.spc; - x = (u_int64_t)bpb.bspf * bpb.bps * NPB / (fat / BPN) - RESFTE; + cls = (bpb.bpbHugeSectors - x1) / bpb.bpbSecPerClust; + x = (u_int64_t)bpb.bpbBigFATsecs * bpb.bpbBytesPerSec * NPB / (fat / BPN) - RESFTE; if (cls > x) cls = x; - if (bpb.bspf < x2) + if (bpb.bpbBigFATsecs < x2) warnx("warning: sectors/FAT limits file system to %u clusters", cls); if (cls < mincls(fat)) @@ -573,79 +576,79 @@ main(int argc, char *argv[]) mincls(fat)); if (cls > maxcls(fat)) { cls = maxcls(fat); - bpb.bsec = x1 + (cls + 1) * bpb.spc - 1; + bpb.bpbHugeSectors = x1 + (cls + 1) * bpb.bpbSecPerClust - 1; warnx("warning: FAT type limits file system to %u sectors", - bpb.bsec); + bpb.bpbHugeSectors); } printf("%s: %u sector%s in %u FAT%u cluster%s " - "(%u bytes/cluster)\n", fname, cls * bpb.spc, - cls * bpb.spc == 1 ? "" : "s", cls, fat, - cls == 1 ? "" : "s", bpb.bps * bpb.spc); - if (!bpb.mid) - bpb.mid = !bpb.hid ? 0xf0 : 0xf8; + "(%u bytes/cluster)\n", fname, cls * bpb.bpbSecPerClust, + cls * bpb.bpbSecPerClust == 1 ? "" : "s", cls, fat, + cls == 1 ? "" : "s", bpb.bpbBytesPerSec * bpb.bpbSecPerClust); + if (!bpb.bpbMedia) + bpb.bpbMedia = !bpb.bpbHiddenSecs ? 0xf0 : 0xf8; if (fat == 32) - bpb.rdcl = RESFTE; - if (bpb.hid + bpb.bsec <= MAXU16) { - bpb.sec = bpb.bsec; - bpb.bsec = 0; + bpb.bpbRootClust = RESFTE; + if (bpb.bpbHiddenSecs + bpb.bpbHugeSectors <= MAXU16) { + bpb.bpbSectors = bpb.bpbHugeSectors; + bpb.bpbHugeSectors = 0; } if (fat != 32) { - bpb.spf = bpb.bspf; - bpb.bspf = 0; + bpb.bpbFATsecs = bpb.bpbBigFATsecs; + bpb.bpbBigFATsecs = 0; } print_bpb(&bpb); if (!opt_N) { gettimeofday(&tv, NULL); now = tv.tv_sec; tm = localtime(&now); - if (!(img = malloc(bpb.bps))) + if (!(img = malloc(bpb.bpbBytesPerSec))) err(1, NULL); - dir = bpb.res + (bpb.spf ? bpb.spf : bpb.bspf) * bpb.nft; - for (lsn = 0; lsn < dir + (fat == 32 ? bpb.spc : rds); lsn++) { + dir = bpb.bpbResSectors + (bpb.bpbFATsecs ? bpb.bpbFATsecs : bpb.bpbBigFATsecs) * bpb.bpbFATs; + for (lsn = 0; lsn < dir + (fat == 32 ? bpb.bpbSecPerClust : rds); lsn++) { x = lsn; if (opt_B && - fat == 32 && bpb.bkbs != MAXU16 && - bss <= bpb.bkbs && x >= bpb.bkbs) { - x -= bpb.bkbs; + fat == 32 && bpb.bpbBackup != MAXU16 && + bss <= bpb.bpbBackup && x >= bpb.bpbBackup) { + x -= bpb.bpbBackup; if (!x && lseek(fd1, opt_ofs, SEEK_SET)) err(1, "%s", bname); } if (opt_B && x < bss) { - if ((n = read(fd1, img, bpb.bps)) == -1) + if ((n = read(fd1, img, bpb.bpbBytesPerSec)) == -1) err(1, "%s", bname); - if ((unsigned)n != bpb.bps) + if ((unsigned)n != bpb.bpbBytesPerSec) errx(1, "%s: can't read sector %u", bname, x); } else - memset(img, 0, bpb.bps); + memset(img, 0, bpb.bpbBytesPerSec); if (!lsn || - (fat == 32 && bpb.bkbs != MAXU16 && lsn == bpb.bkbs)) { + (fat == 32 && bpb.bpbBackup != MAXU16 && lsn == bpb.bpbBackup)) { x1 = sizeof(struct bs); bsbpb = (struct bsbpb *)(img + x1); - mk2(bsbpb->bps, bpb.bps); - mk1(bsbpb->spc, bpb.spc); - mk2(bsbpb->res, bpb.res); - mk1(bsbpb->nft, bpb.nft); - mk2(bsbpb->rde, bpb.rde); - mk2(bsbpb->sec, bpb.sec); - mk1(bsbpb->mid, bpb.mid); - mk2(bsbpb->spf, bpb.spf); - mk2(bsbpb->spt, bpb.spt); - mk2(bsbpb->hds, bpb.hds); - mk4(bsbpb->hid, bpb.hid); - mk4(bsbpb->bsec, bpb.bsec); + mk2(bsbpb->bpbBytesPerSec, bpb.bpbBytesPerSec); + mk1(bsbpb->bpbSecPerClust, bpb.bpbSecPerClust); + mk2(bsbpb->bpbResSectors, bpb.bpbResSectors); + mk1(bsbpb->bpbFATs, bpb.bpbFATs); + mk2(bsbpb->bpbRootDirEnts, bpb.bpbRootDirEnts); + mk2(bsbpb->bpbSectors, bpb.bpbSectors); + mk1(bsbpb->bpbMedia, bpb.bpbMedia); + mk2(bsbpb->bpbFATsecs, bpb.bpbFATsecs); + mk2(bsbpb->bpbSecPerTrack, bpb.bpbSecPerTrack); + mk2(bsbpb->bpbHeads, bpb.bpbHeads); + mk4(bsbpb->bpbHiddenSecs, bpb.bpbHiddenSecs); + mk4(bsbpb->bpbHugeSectors, bpb.bpbHugeSectors); x1 += sizeof(struct bsbpb); if (fat == 32) { bsxbpb = (struct bsxbpb *)(img + x1); - mk4(bsxbpb->bspf, bpb.bspf); - mk2(bsxbpb->xflg, 0); - mk2(bsxbpb->vers, 0); - mk4(bsxbpb->rdcl, bpb.rdcl); - mk2(bsxbpb->infs, bpb.infs); - mk2(bsxbpb->bkbs, bpb.bkbs); + mk4(bsxbpb->bpbBigFATsecs, bpb.bpbBigFATsecs); + mk2(bsxbpb->bpbExtFlags, 0); + mk2(bsxbpb->bpbFSVers, 0); + mk4(bsxbpb->bpbRootClust, bpb.bpbRootClust); + mk2(bsxbpb->bpbFSInfo, bpb.bpbFSInfo); + mk2(bsxbpb->bpbBackup, bpb.bpbBackup); x1 += sizeof(struct bsxbpb); } bsx = (struct bsx *)(img + x1); - mk1(bsx->sig, 0x29); + mk1(bsx->exBootSignature, 0x29); if (Iflag) x = opt_I; else @@ -656,52 +659,52 @@ main(int argc, char *argv[]) ((u_int)(1900 + tm->tm_year) + ((u_int)tm->tm_hour << 8 | (u_int)tm->tm_min)); - mk4(bsx->volid, x); - mklabel(bsx->label, opt_L ? opt_L : "NO NAME"); + mk4(bsx->exVolumeID, x); + mklabel(bsx->exVolumeLabel, opt_L ? opt_L : "NO_NAME"); sprintf(buf, "FAT%u", fat); - setstr(bsx->type, buf, sizeof(bsx->type)); + setstr(bsx->exFileSysType, buf, sizeof(bsx->exFileSysType)); if (!opt_B) { x1 += sizeof(struct bsx); bs = (struct bs *)img; - mk1(bs->jmp[0], 0xeb); - mk1(bs->jmp[1], x1 - 2); - mk1(bs->jmp[2], 0x90); - setstr(bs->oem, opt_O ? opt_O : "BSD 4.4", - sizeof(bs->oem)); + mk1(bs->bsJump[0], 0xeb); + mk1(bs->bsJump[1], x1 - 2); + mk1(bs->bsJump[2], 0x90); + setstr(bs->bsOemName, opt_O ? opt_O : "BSD4.4 ", + sizeof(bs->bsOemName)); memcpy(img + x1, bootcode, sizeof(bootcode)); mk2(img + MINBPS - 2, DOSMAGIC); } - } else if (fat == 32 && bpb.infs != MAXU16 && - (lsn == bpb.infs || - (bpb.bkbs != MAXU16 && - lsn == bpb.bkbs + bpb.infs))) { + } else if (fat == 32 && bpb.bpbFSInfo != MAXU16 && + (lsn == bpb.bpbFSInfo || + (bpb.bpbBackup != MAXU16 && + lsn == bpb.bpbBackup + bpb.bpbFSInfo))) { mk4(img, 0x41615252); mk4(img + MINBPS - 28, 0x61417272); mk4(img + MINBPS - 24, 0xffffffff); - mk4(img + MINBPS - 20, bpb.rdcl); + mk4(img + MINBPS - 20, bpb.bpbRootClust); mk2(img + MINBPS - 2, DOSMAGIC); - } else if (lsn >= bpb.res && lsn < dir && - !((lsn - bpb.res) % - (bpb.spf ? bpb.spf : bpb.bspf))) { - mk1(img[0], bpb.mid); + } else if (lsn >= bpb.bpbResSectors && lsn < dir && + !((lsn - bpb.bpbResSectors) % + (bpb.bpbFATsecs ? bpb.bpbFATsecs : bpb.bpbBigFATsecs))) { + mk1(img[0], bpb.bpbMedia); for (x = 1; x < fat * (fat == 32 ? 3 : 2) / 8; x++) mk1(img[x], fat == 32 && x % 4 == 3 ? 0x0f : 0xff); } else if (lsn == dir && opt_L) { de = (struct de *)img; - mklabel(de->namext, opt_L); - mk1(de->attr, 050); + mklabel(de->deName, opt_L); + mk1(de->deAttributes, 050); x = (u_int)tm->tm_hour << 11 | (u_int)tm->tm_min << 5 | (u_int)tm->tm_sec >> 1; - mk2(de->time, x); + mk2(de->deMTime, x); x = (u_int)(tm->tm_year - 80) << 9 | (u_int)(tm->tm_mon + 1) << 5 | (u_int)tm->tm_mday; - mk2(de->date, x); + mk2(de->deMDate, x); } - if ((n = write(fd, img, bpb.bps)) == -1) + if ((n = write(fd, img, bpb.bpbBytesPerSec)) == -1) err(1, "%s", fname); - if ((unsigned)n != bpb.bps) + if ((unsigned)n != bpb.bpbBytesPerSec) errx(1, "%s: can't write sector %u", fname, lsn); } } @@ -794,18 +797,19 @@ getdiskinfo(int fd, const char *fname, const char *dtype, __unused int oflag, /* Maybe it's a fixed drive */ if (lp == NULL) { + if (bpb->bpbBytesPerSec) + dlp.d_secsize = bpb->bpbBytesPerSec; if (ioctl(fd, DIOCGDINFO, &dlp) == -1) { - if (bpb->bps == 0 && ioctl(fd, DIOCGSECTORSIZE, &dlp.d_secsize) == -1) + if (bpb->bpbBytesPerSec == 0 && ioctl(fd, DIOCGSECTORSIZE, &dlp.d_secsize) == -1) errx(1, "Cannot get sector size, %s", strerror(errno)); - /* XXX Should we use bpb->bps if it's set? */ dlp.d_secperunit = ms / dlp.d_secsize; - if (bpb->spt == 0 && ioctl(fd, DIOCGFWSECTORS, &dlp.d_nsectors) == -1) { + if (bpb->bpbSecPerTrack == 0 && ioctl(fd, DIOCGFWSECTORS, &dlp.d_nsectors) == -1) { warnx("Cannot get number of sectors per track, %s", strerror(errno)); dlp.d_nsectors = 63; } - if (bpb->hds == 0 && ioctl(fd, DIOCGFWHEADS, &dlp.d_ntracks) == -1) { + if (bpb->bpbHeads == 0 && ioctl(fd, DIOCGFWHEADS, &dlp.d_ntracks) == -1) { warnx("Cannot get number of heads, %s", strerror(errno)); if (dlp.d_secperunit <= 63*1*1024) dlp.d_ntracks = 1; @@ -820,16 +824,16 @@ getdiskinfo(int fd, const char *fname, const char *dtype, __unused int oflag, lp = &dlp; } - if (bpb->bps == 0) - bpb->bps = ckgeom(fname, lp->d_secsize, "bytes/sector"); - if (bpb->spt == 0) - bpb->spt = ckgeom(fname, lp->d_nsectors, "sectors/track"); - if (bpb->hds == 0) - bpb->hds = ckgeom(fname, lp->d_ntracks, "drive heads"); - if (bpb->bsec == 0) - bpb->bsec = lp->d_secperunit; - if (bpb->hid == 0) - bpb->hid = hs; + if (bpb->bpbBytesPerSec == 0) + bpb->bpbBytesPerSec = ckgeom(fname, lp->d_secsize, "bytes/sector"); + if (bpb->bpbSecPerTrack == 0) + bpb->bpbSecPerTrack = ckgeom(fname, lp->d_nsectors, "sectors/track"); + if (bpb->bpbHeads == 0) + bpb->bpbHeads = ckgeom(fname, lp->d_ntracks, "drive heads"); + if (bpb->bpbHugeSectors == 0) + bpb->bpbHugeSectors = lp->d_secperunit; + if (bpb->bpbHiddenSecs == 0) + bpb->bpbHiddenSecs = hs; } /* @@ -838,24 +842,24 @@ getdiskinfo(int fd, const char *fname, const char *dtype, __unused int oflag, static void print_bpb(struct bpb *bpb) { - printf("bps=%u spc=%u res=%u nft=%u", bpb->bps, bpb->spc, bpb->res, - bpb->nft); - if (bpb->rde) - printf(" rde=%u", bpb->rde); - if (bpb->sec) - printf(" sec=%u", bpb->sec); - printf(" mid=%#x", bpb->mid); - if (bpb->spf) - printf(" spf=%u", bpb->spf); - printf(" spt=%u hds=%u hid=%u", bpb->spt, bpb->hds, bpb->hid); - if (bpb->bsec) - printf(" bsec=%u", bpb->bsec); - if (!bpb->spf) { - printf(" bspf=%u rdcl=%u", bpb->bspf, bpb->rdcl); - printf(" infs="); - printf(bpb->infs == MAXU16 ? "%#x" : "%u", bpb->infs); - printf(" bkbs="); - printf(bpb->bkbs == MAXU16 ? "%#x" : "%u", bpb->bkbs); + printf("BytesPerSec=%u SecPerClust=%u ResSectors=%u FATs=%u", bpb->bpbBytesPerSec, bpb->bpbSecPerClust, bpb->bpbResSectors, + bpb->bpbFATs); + if (bpb->bpbRootDirEnts) + printf(" RootDirEnts=%u", bpb->bpbRootDirEnts); + if (bpb->bpbSectors) + printf(" Sectors=%u", bpb->bpbSectors); + printf(" Media=%#x", bpb->bpbMedia); + if (bpb->bpbFATsecs) + printf(" FATsecs=%u", bpb->bpbFATsecs); + printf(" SecPerTrack=%u Heads=%u HiddenSecs=%u", bpb->bpbSecPerTrack, bpb->bpbHeads, bpb->bpbHiddenSecs); + if (bpb->bpbHugeSectors) + printf(" HugeSectors=%u", bpb->bpbHugeSectors); + if (!bpb->bpbFATsecs) { + printf(" FATsecs=%u RootCluster=%u", bpb->bpbBigFATsecs, bpb->bpbRootClust); + printf(" FSInfo="); + printf(bpb->bpbFSInfo == MAXU16 ? "%#x" : "%u", bpb->bpbFSInfo); + printf(" Backup="); + printf(bpb->bpbBackup == MAXU16 ? "%#x" : "%u", bpb->bpbBackup); } printf("\n"); } diff --git a/sbin/nfsiod/Makefile b/sbin/nfsiod/Makefile index 22717c576f42..47cd290ec78e 100644 --- a/sbin/nfsiod/Makefile +++ b/sbin/nfsiod/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= nfsiod -WARNS?= 6 MAN= nfsiod.8 .include diff --git a/sbin/nfsiod/nfsiod.8 b/sbin/nfsiod/nfsiod.8 index 44bf1af28ad2..20a2c9db8e9c 100644 --- a/sbin/nfsiod/nfsiod.8 +++ b/sbin/nfsiod/nfsiod.8 @@ -28,7 +28,7 @@ .\" From: @(#)nfsiod.8 8.2 (Berkeley) 2/22/94 .\" $FreeBSD$ .\" -.Dd September 22, 1994 +.Dd December 26, 2009 .Dt NFSIOD 8 .Os .Sh NAME @@ -42,33 +42,39 @@ asynchronous I/O server .Sh DESCRIPTION The .Nm -utility is a kernel process which runs on an +utility controls the maximum number of +.Nm +kernel processes which run on an .Tn NFS client machine to service asynchronous I/O requests to its server. -It improves performance but is not required for correct operation. +Having +.Nm +kernel processes +improves performance but is not required for correct operation. .Pp -This program controls the maximum number of processes that the kernel runs. -.Pp -The options are as follows: +The option is as follows: .Bl -tag -width indent .It Fl n -Specify how many servers are permitted to be started. +Specify how many processes are permitted to be started. .El .Pp -A client should run enough daemons to handle its maximum +Without an option, +.Nm +displays the current settings. +A client should allow enough number of processes to handle its maximum level of concurrency, typically four to six. .Pp If .Nm detects that the running kernel does not include .Tn NFS -support, it will attempt to load a loadable kernel module containing +support, it will attempt to load a kernel module containing .Tn NFS code, using .Xr kldload 2 . If this fails, or no .Tn NFS -KLD was available, +module was available, .Nm exits with an error. .Sh EXIT STATUS @@ -85,3 +91,10 @@ The .Nm utility first appeared in .Bx 4.4 . +.Pp +Starting with +.Fx 5.0 , +the utility no longer starts daemons, but only serves as a vfs +loader and +.Xr sysctl 3 +wrapper. diff --git a/sbin/nfsiod/nfsiod.c b/sbin/nfsiod/nfsiod.c index 31559cc61bd7..b1db1f1615b9 100644 --- a/sbin/nfsiod/nfsiod.c +++ b/sbin/nfsiod/nfsiod.c @@ -89,12 +89,12 @@ main(int argc, char *argv[]) case 'n': num_servers = atoi(optarg); if (num_servers < 1) { - warnx("nfsiod count %d; reset to %d", + warnx("nfsiod count %u; reset to %d", num_servers, 1); num_servers = 1; } if (num_servers > MAXNFSDCNT) { - warnx("nfsiod count %d; reset to %d", + warnx("nfsiod count %u; reset to %d", num_servers, MAXNFSDCNT); num_servers = MAXNFSDCNT; } @@ -109,9 +109,6 @@ main(int argc, char *argv[]) if (argc > 0) usage(); - if (num_servers == 0) - exit(0); /* no change */ - len = sizeof iodmin; error = sysctlbyname("vfs.nfs.iodmin", &iodmin, &len, NULL, 0); if (error < 0) @@ -120,6 +117,11 @@ main(int argc, char *argv[]) error = sysctlbyname("vfs.nfs.iodmax", &iodmax, &len, NULL, 0); if (error < 0) err(1, "sysctlbyname(\"vfs.nfs.iodmax\")"); + if (num_servers == 0) { /* no change */ + printf("vfs.nfs.iodmin=%u\nvfs.nfs.iodmax=%u\n", + iodmin, iodmax); + exit(0); + } /* Catch the case where we're lowering num_servers below iodmin */ if (iodmin > num_servers) { iodmin = num_servers; diff --git a/sbin/pfctl/Makefile b/sbin/pfctl/Makefile index ee5705197e56..2475baf94818 100644 --- a/sbin/pfctl/Makefile +++ b/sbin/pfctl/Makefile @@ -12,6 +12,7 @@ SRCS+= pfctl_osfp.c pfctl_radix.c pfctl_table.c pfctl_qstats.c SRCS+= pfctl_optimize.c SRCS+= pf_ruleset.c +WARNS?= 2 CFLAGS+= -Wall -Wmissing-prototypes -Wno-uninitialized CFLAGS+= -Wstrict-prototypes -I${.CURDIR}/../../contrib/pf/pfctl diff --git a/sbin/rcorder/Makefile b/sbin/rcorder/Makefile index 2ca64cc90b5f..b71aa4b83d37 100644 --- a/sbin/rcorder/Makefile +++ b/sbin/rcorder/Makefile @@ -8,7 +8,6 @@ MAN= rcorder.8 LDADD= -lutil DPADD= ${LIBUTIL} -WARNS?= 6 # XXX hack for make's hash.[ch] CFLAGS+= -DORDER -I. diff --git a/sbin/rcorder/ealloc.c b/sbin/rcorder/ealloc.c index a7cf6bc4a713..997119315531 100644 --- a/sbin/rcorder/ealloc.c +++ b/sbin/rcorder/ealloc.c @@ -58,7 +58,7 @@ static void enomem(void); * die when out of memory. */ static void -enomem() +enomem(void) { errx(2, "Cannot allocate memory."); } @@ -68,8 +68,7 @@ enomem() * malloc, but die on error. */ void * -emalloc(len) - size_t len; +emalloc(size_t len) { void *p; @@ -83,8 +82,7 @@ emalloc(len) * strdup, but die on error. */ char * -estrdup(str) - const char *str; +estrdup(const char *str) { char *p; @@ -98,9 +96,7 @@ estrdup(str) * realloc, but die on error. */ void * -erealloc(ptr, size) - void *ptr; - size_t size; +erealloc(void *ptr, size_t size) { if ((ptr = realloc(ptr, size)) == NULL) enomem(); @@ -112,9 +108,7 @@ erealloc(ptr, size) * calloc, but die on error. */ void * -ecalloc(nmemb, size) - size_t nmemb; - size_t size; +ecalloc(size_t nmemb, size_t size) { void *ptr; diff --git a/sbin/rcorder/hash.c b/sbin/rcorder/hash.c index bc882b92d6bd..34b95ce82f7a 100644 --- a/sbin/rcorder/hash.c +++ b/sbin/rcorder/hash.c @@ -103,9 +103,9 @@ static void RebuildTable(Hash_Table *); */ void -Hash_InitTable(t, numBuckets) - register Hash_Table *t; /* Structure to use to hold table. */ - int numBuckets; /* How many buckets to create for starters. +Hash_InitTable( + register Hash_Table *t, /* Structure to use to hold table. */ + int numBuckets) /* How many buckets to create for starters. * This number is rounded up to a power of * two. If <= 0, a reasonable default is * chosen. The table will grow in size later @@ -150,8 +150,7 @@ Hash_InitTable(t, numBuckets) */ void -Hash_DeleteTable(t) - Hash_Table *t; +Hash_DeleteTable(Hash_Table *t) { register struct Hash_Entry **hp, *h, *nexth = NULL; register int i; @@ -190,9 +189,9 @@ Hash_DeleteTable(t) */ Hash_Entry * -Hash_FindEntry(t, key) - Hash_Table *t; /* Hash table to search. */ - char *key; /* A hash key. */ +Hash_FindEntry( + Hash_Table *t, /* Hash table to search. */ + char *key) /* A hash key. */ { register Hash_Entry *e; register unsigned h; @@ -227,10 +226,10 @@ Hash_FindEntry(t, key) */ Hash_Entry * -Hash_CreateEntry(t, key, newPtr) - register Hash_Table *t; /* Hash table to search. */ - char *key; /* A hash key. */ - Boolean *newPtr; /* Filled in with TRUE if new entry created, +Hash_CreateEntry( + register Hash_Table *t, /* Hash table to search. */ + char *key, /* A hash key. */ + Boolean *newPtr) /* Filled in with TRUE if new entry created, * FALSE otherwise. */ { register Hash_Entry *e; @@ -294,9 +293,7 @@ Hash_CreateEntry(t, key, newPtr) */ void -Hash_DeleteEntry(t, e) - Hash_Table *t; - Hash_Entry *e; +Hash_DeleteEntry(Hash_Table *t, Hash_Entry *e) { register Hash_Entry **hp, *p; @@ -335,9 +332,9 @@ Hash_DeleteEntry(t, e) */ Hash_Entry * -Hash_EnumFirst(t, searchPtr) - Hash_Table *t; /* Table to be searched. */ - register Hash_Search *searchPtr;/* Area in which to keep state +Hash_EnumFirst( + Hash_Table *t, /* Table to be searched. */ + register Hash_Search *searchPtr)/* Area in which to keep state * about search.*/ { searchPtr->tablePtr = t; @@ -365,8 +362,8 @@ Hash_EnumFirst(t, searchPtr) */ Hash_Entry * -Hash_EnumNext(searchPtr) - register Hash_Search *searchPtr; /* Area used to keep state about +Hash_EnumNext( + register Hash_Search *searchPtr) /* Area used to keep state about search. */ { register Hash_Entry *e; @@ -411,8 +408,7 @@ Hash_EnumNext(searchPtr) */ static void -RebuildTable(t) - register Hash_Table *t; +RebuildTable(register Hash_Table *t) { register Hash_Entry *e, *next = NULL, **hp, **xp; register int i, mask; diff --git a/sbin/rcorder/rcorder.c b/sbin/rcorder/rcorder.c index bf8e9fbd5c0c..9a9959b62558 100644 --- a/sbin/rcorder/rcorder.c +++ b/sbin/rcorder/rcorder.c @@ -153,9 +153,7 @@ void generate_ordering(void); int main(int, char *[]); int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { int ch; @@ -199,7 +197,7 @@ main(argc, argv) * initialise various variables. */ void -initialize() +initialize(void) { fn_head = &fn_head_s; @@ -210,10 +208,7 @@ initialize() /* generic function to insert a new strnodelist element */ void -strnode_add(listp, s, fnode) - strnodelist **listp; - char *s; - filenode *fnode; +strnode_add(strnodelist **listp, char *s, filenode *fnode) { strnodelist *ent; @@ -235,8 +230,7 @@ strnode_add(listp, s, fnode) * fill in the bits, and put it in the filenode linked list */ filenode * -filenode_new(filename) - char *filename; +filenode_new(char *filename) { filenode *temp; @@ -264,9 +258,7 @@ filenode_new(filename) * add a requirement to a filenode. */ void -add_require(fnode, s) - filenode *fnode; - char *s; +add_require(filenode *fnode, char *s) { Hash_Entry *entry; f_reqnode *rnode; @@ -286,9 +278,7 @@ add_require(fnode, s) * have a head node, create one here. */ void -add_provide(fnode, s) - filenode *fnode; - char *s; +add_provide(filenode *fnode, char *s) { Hash_Entry *entry; f_provnode *f_pnode; @@ -367,9 +357,7 @@ add_provide(fnode, s) * put the BEFORE: lines to a list and handle them later. */ void -add_before(fnode, s) - filenode *fnode; - char *s; +add_before(filenode *fnode, char *s) { strnodelist *bf_ent; @@ -384,9 +372,7 @@ add_before(fnode, s) * add a key to a filenode. */ void -add_keyword(fnode, s) - filenode *fnode; - char *s; +add_keyword(filenode *fnode, char *s) { strnode_add(&fnode->keyword_list, s, fnode); @@ -397,9 +383,7 @@ add_keyword(fnode, s) * add_require() to do the real work. */ void -parse_require(node, buffer) - filenode *node; - char *buffer; +parse_require(filenode *node, char *buffer) { char *s; @@ -413,9 +397,7 @@ parse_require(node, buffer) * add_provide() to do the real work. */ void -parse_provide(node, buffer) - filenode *node; - char *buffer; +parse_provide(filenode *node, char *buffer) { char *s; @@ -429,9 +411,7 @@ parse_provide(node, buffer) * add_before() to do the real work. */ void -parse_before(node, buffer) - filenode *node; - char *buffer; +parse_before(filenode *node, char *buffer) { char *s; @@ -445,9 +425,7 @@ parse_before(node, buffer) * add_keyword() to do the real work. */ void -parse_keywords(node, buffer) - filenode *node; - char *buffer; +parse_keywords(filenode *node, char *buffer) { char *s; @@ -461,8 +439,7 @@ parse_keywords(node, buffer) * for provision and requirement lines, building the graphs as needed. */ void -crunch_file(filename) - char *filename; +crunch_file(char *filename) { FILE *fp; char *buf; @@ -534,8 +511,7 @@ crunch_file(filename) } Hash_Entry * -make_fake_provision(node) - filenode *node; +make_fake_provision(filenode *node) { Hash_Entry *entry; f_provnode *f_pnode; @@ -581,7 +557,7 @@ make_fake_provision(node) * that provisions filenode for P. */ void -insert_before() +insert_before(void) { Hash_Entry *entry, *fake_prov_entry; provnode *pnode; @@ -619,7 +595,7 @@ insert_before() * lines into graph(s). */ void -crunch_all_files() +crunch_all_files(void) { int i; @@ -644,9 +620,7 @@ crunch_all_files() * provision. */ void -satisfy_req(rnode, filename) - f_reqnode *rnode; - char *filename; +satisfy_req(f_reqnode *rnode, char *filename) { Hash_Entry *entry; provnode *head; @@ -687,8 +661,7 @@ satisfy_req(rnode, filename) } int -skip_ok(fnode) - filenode *fnode; +skip_ok(filenode *fnode) { strnodelist *s; strnodelist *k; @@ -702,8 +675,7 @@ skip_ok(fnode) } int -keep_ok(fnode) - filenode *fnode; +keep_ok(filenode *fnode) { strnodelist *s; strnodelist *k; @@ -728,8 +700,7 @@ keep_ok(fnode) * Circular dependancies will cause problems if we do. */ void -do_file(fnode) - filenode *fnode; +do_file(filenode *fnode) { f_reqnode *r, *r_tmp; f_provnode *p, *p_tmp; @@ -812,7 +783,7 @@ do_file(fnode) } void -generate_ordering() +generate_ordering(void) { /* diff --git a/sbin/reboot/Makefile b/sbin/reboot/Makefile index 42f086887eb7..aa41e30438a6 100644 --- a/sbin/reboot/Makefile +++ b/sbin/reboot/Makefile @@ -2,9 +2,6 @@ # $FreeBSD$ PROG= reboot -WARNS?= 6 -DPADD= ${LIBUTIL} -LDADD= -lutil MAN= reboot.8 nextboot.8 MLINKS= reboot.8 halt.8 reboot.8 fastboot.8 reboot.8 fasthalt.8 diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8 index b9baf344d79d..3e846cb054fc 100644 --- a/sbin/reboot/reboot.8 +++ b/sbin/reboot/reboot.8 @@ -61,9 +61,8 @@ a (and subsequently a .Dv SIGKILL ) and, respectively, halt or restart the system. -The action is logged, including entering a shutdown record into the -.Xr wtmp 5 -file. +The action is logged, including entering a shutdown record into the user +accounting database. .Pp The options are as follows: .Bl -tag -width indent diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c index 3a4d20cb4586..9e5dab8e78c3 100644 --- a/sbin/reboot/reboot.c +++ b/sbin/reboot/reboot.c @@ -42,19 +42,20 @@ static char sccsid[] = "@(#)reboot.c 8.1 (Berkeley) 6/5/93"; __FBSDID("$FreeBSD$"); #include +#include #include #include #include #include #include #include -#include #include #include #include #include #include #include +#include static void usage(void); static u_int get_pageins(void); @@ -64,6 +65,7 @@ int dohalt; int main(int argc, char *argv[]) { + struct utmpx utx; const struct passwd *pw; int ch, howto, i, fd, lflag, nflag, qflag, sverrno; u_int pageins; @@ -140,7 +142,9 @@ main(int argc, char *argv[]) syslog(LOG_CRIT, "rebooted by %s", user); } } - logwtmp("~", "shutdown", ""); + utx.ut_type = SHUTDOWN_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); /* * Do a sync early on, so disks start transfers while we're off @@ -216,15 +220,17 @@ restart: } static void -usage() +usage(void) { - (void)fprintf(stderr, "usage: %s [-%slnpq] [-k kernel]\n", - getprogname(), dohalt ? "" : "d"); + + (void)fprintf(stderr, dohalt ? + "usage: halt [-lnpq] [-k kernel]\n" : + "usage: reboot [-dlnpq] [-k kernel]\n"); exit(1); } static u_int -get_pageins() +get_pageins(void) { u_int pageins; size_t len; diff --git a/sbin/recoverdisk/Makefile b/sbin/recoverdisk/Makefile index 6733a4f8fa20..136e570eb5a3 100644 --- a/sbin/recoverdisk/Makefile +++ b/sbin/recoverdisk/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG= recoverdisk -WARNS?= 6 .include diff --git a/sbin/restore/Makefile b/sbin/restore/Makefile index 8097190d5d59..c462f51a8dd3 100644 --- a/sbin/restore/Makefile +++ b/sbin/restore/Makefile @@ -5,11 +5,11 @@ PROG= restore LINKS= ${BINDIR}/restore ${BINDIR}/rrestore -CFLAGS+=-DRRESTORE -D_ACL_PRIVATE -WARNS?= 0 -SRCS= main.c interactive.c restore.c dirs.c symtab.c tape.c utilities.c \ - dumprmt.c MAN= restore.8 MLINKS= restore.8 rrestore.8 +SRCS= main.c interactive.c restore.c dirs.c symtab.c tape.c utilities.c \ + dumprmt.c +WARNS?= 2 +CFLAGS+= -DRRESTORE -D_ACL_PRIVATE .include diff --git a/sbin/restore/dirs.c b/sbin/restore/dirs.c index 91bdcd48940e..203d97702f14 100644 --- a/sbin/restore/dirs.c +++ b/sbin/restore/dirs.c @@ -53,6 +53,7 @@ static const char rcsid[] = #include #include #include +#include #include #include #include @@ -139,9 +140,9 @@ extractdirs(int genmode) vprintf(stdout, "Extract directories from tape\n"); if ((tmpdir = getenv("TMPDIR")) == NULL || tmpdir[0] == '\0') tmpdir = _PATH_TMP; - (void) sprintf(dirfile, "%s/rstdir%ld", tmpdir, dumpdate); + (void) sprintf(dirfile, "%s/rstdir%jd", tmpdir, (intmax_t)dumpdate); if (command != 'r' && command != 'R') { - (void *) strcat(dirfile, "-XXXXXX"); + (void) strcat(dirfile, "-XXXXXX"); fd = mkstemp(dirfile); } else fd = open(dirfile, O_RDWR|O_CREAT|O_EXCL, 0666); @@ -152,9 +153,10 @@ extractdirs(int genmode) done(1); } if (genmode != 0) { - (void) sprintf(modefile, "%s/rstmode%ld", tmpdir, dumpdate); + (void) sprintf(modefile, "%s/rstmode%jd", tmpdir, + (intmax_t)dumpdate); if (command != 'r' && command != 'R') { - (void *) strcat(modefile, "-XXXXXX"); + (void) strcat(modefile, "-XXXXXX"); fd = mkstemp(modefile); } else fd = open(modefile, O_RDWR|O_CREAT|O_EXCL, 0666); @@ -257,8 +259,8 @@ treescan(char *pname, ino_t ino, long (*todo)(char *, ino_t, int)) while (dp != NULL) { locname[namelen] = '\0'; if (namelen + dp->d_namlen >= sizeof(locname)) { - fprintf(stderr, "%s%s: name exceeds %d char\n", - locname, dp->d_name, sizeof(locname) - 1); + fprintf(stderr, "%s%s: name exceeds %zu char\n", + locname, dp->d_name, sizeof(locname) - 1); } else { (void)strlcat(locname, dp->d_name, sizeof(locname)); treescan(locname, dp->d_ino, todo); @@ -354,7 +356,7 @@ putdir(char *buf, long size) "reclen not multiple of 4 "); if (dp->d_reclen < DIRSIZ(0, dp)) vprintf(stdout, - "reclen less than DIRSIZ (%d < %d) ", + "reclen less than DIRSIZ (%d < %zu) ", dp->d_reclen, DIRSIZ(0, dp)); #if NAME_MAX < 255 if (dp->d_namlen > NAME_MAX) @@ -566,7 +568,8 @@ setdirmodes(int flags) if ((tmpdir = getenv("TMPDIR")) == NULL || tmpdir[0] == '\0') tmpdir = _PATH_TMP; if (command == 'r' || command == 'R') - (void) sprintf(modefile, "%s/rstmode%ld", tmpdir, dumpdate); + (void) sprintf(modefile, "%s/rstmode%jd", tmpdir, + (intmax_t)dumpdate); if (modefile[0] == '#') { panic("modefile not defined\n"); fprintf(stderr, "directory mode, owner, and times not set\n"); diff --git a/sbin/restore/extern.h b/sbin/restore/extern.h index cbecc86bd476..7b744e2b4a16 100644 --- a/sbin/restore/extern.h +++ b/sbin/restore/extern.h @@ -34,7 +34,7 @@ struct entry *addentry(char *, ino_t, int); long addfile(char *, ino_t, int); int addwhiteout(char *); void badentry(struct entry *, char *); -void canon(char *, char *, int); +void canon(char *, char *, size_t); void checkrestore(void); void closemt(void); void createfiles(void); diff --git a/sbin/restore/interactive.c b/sbin/restore/interactive.c index c977df169b9c..3cd311daca97 100644 --- a/sbin/restore/interactive.c +++ b/sbin/restore/interactive.c @@ -83,7 +83,7 @@ struct arglist { static char *copynext(char *, char *); static int fcmp(const void *, const void *); static void formatf(struct afile *, int); -static void getcmd(char *, char *, char *, int, struct arglist *); +static void getcmd(char *, char *, char *, size_t, struct arglist *); struct dirent *glob_readdir(void *); static int glob_stat(const char *, struct stat *); static void mkentry(char *, struct direct *, struct afile *); @@ -301,7 +301,7 @@ loop: * eliminate any embedded ".." components. */ static void -getcmd(char *curdir, char *cmd, char *name, int size, struct arglist *ap) +getcmd(char *curdir, char *cmd, char *name, size_t size, struct arglist *ap) { char *cp; static char input[BUFSIZ]; @@ -441,7 +441,7 @@ copynext(char *input, char *output) * remove any embedded "." and ".." components. */ void -canon(char *rawname, char *canonname, int len) +canon(char *rawname, char *canonname, size_t len) { char *cp, *np; diff --git a/sbin/restore/restore.h b/sbin/restore/restore.h index 8c6a87b8b2f7..5d02bdfd9578 100644 --- a/sbin/restore/restore.h +++ b/sbin/restore/restore.h @@ -41,7 +41,7 @@ extern int bflag; /* set input block size */ extern int dflag; /* print out debugging info */ extern int Dflag; /* degraded mode - try hard to get stuff back */ -extern int hflag; /* restore heirarchies */ +extern int hflag; /* restore hierarchies */ extern int mflag; /* restore by name instead of inode number */ extern int Nflag; /* do not write the disk */ extern int uflag; /* unlink symlink targets */ diff --git a/sbin/restore/tape.c b/sbin/restore/tape.c index debed5ff4111..a566c5acf339 100644 --- a/sbin/restore/tape.c +++ b/sbin/restore/tape.c @@ -227,7 +227,7 @@ setup(void) volno = 1; setdumpnum(); FLUSHTAPEBUF(); - if (!pipein && !bflag) + if (!pipein && !pipecmdin && !bflag) findtapeblksize(); if (gethead(&spcl) == FAIL) { fprintf(stderr, "Tape is not a dump tape\n"); @@ -333,10 +333,6 @@ getvol(long nextvol) } if (volno == 1) return; - if (pipecmdin) { - closemt(); - goto getpipecmdhdr; - } goto gethdr; } again: @@ -400,8 +396,7 @@ again: if (pipecmdin) { char volno[sizeof("2147483647")]; -getpipecmdhdr: - (void)sprintf(volno, "%d", newvol); + (void)sprintf(volno, "%ld", newvol); if (setenv("RESTORE_VOLUME", volno, 1) == -1) { fprintf(stderr, "Cannot set $RESTORE_VOLUME: %s\n", strerror(errno)); @@ -433,7 +428,8 @@ gethdr: goto again; } if (tmpbuf.c_volume != volno) { - fprintf(stderr, "Wrong volume (%ld)\n", tmpbuf.c_volume); + fprintf(stderr, "Wrong volume (%jd)\n", + (intmax_t)tmpbuf.c_volume); volno = 0; goto again; } @@ -454,8 +450,8 @@ gethdr: * If coming to this volume at random, skip to the beginning * of the next record. */ - dprintf(stdout, "last rec %qd, tape starts with %qd\n", prevtapea, - tmpbuf.c_tapea); + dprintf(stdout, "last rec %jd, tape starts with %jd\n", + (intmax_t)prevtapea, (intmax_t)tmpbuf.c_tapea); if (tmpbuf.c_type == TS_TAPE) { if (curfile.action != USING) { /* @@ -554,8 +550,8 @@ printdumpinfo(void) (spcl.c_ddate == 0) ? "the epoch\n" : ctime(&t)); if (spcl.c_host[0] == '\0') return; - fprintf(stderr, "Level %ld dump of %s on %s:%s\n", - spcl.c_level, spcl.c_filesys, spcl.c_host, spcl.c_dev); + fprintf(stderr, "Level %jd dump of %s on %s:%s\n", + (intmax_t)spcl.c_level, spcl.c_filesys, spcl.c_host, spcl.c_dev); fprintf(stderr, "Label: %s\n", spcl.c_label); } @@ -1204,17 +1200,17 @@ getmore: * Check for mid-tape short read error. * If found, skip rest of buffer and start with the next. */ - if (!pipein && numtrec < ntrec && i > 0) { + if (!pipein && !pipecmdin && numtrec < ntrec && i > 0) { dprintf(stdout, "mid-media short read error.\n"); numtrec = ntrec; } /* * Handle partial block read. */ - if (pipein && i == 0 && rd > 0) + if ((pipein || pipecmdin) && i == 0 && rd > 0) i = rd; else if (i > 0 && i != ntrec * TP_BSIZE) { - if (pipein) { + if (pipein || pipecmdin) { rd += i; cnt -= i; if (cnt > 0) @@ -1282,7 +1278,7 @@ getmore: return; } if (rd % TP_BSIZE != 0) - panic("partial block read: %d should be %d\n", + panic("partial block read: %ld should be %ld\n", rd, ntrec * TP_BSIZE); terminateinput(); memmove(&tapebuf[rd], &endoftapemark, (long)TP_BSIZE); @@ -1465,8 +1461,8 @@ accthdr(struct s_spcl *header) if (header->c_type == TS_TAPE) { fprintf(stderr, "Volume header "); if (header->c_firstrec) - fprintf(stderr, "begins with record %qd", - header->c_firstrec); + fprintf(stderr, "begins with record %jd", + (intmax_t)header->c_firstrec); fprintf(stderr, "\n"); previno = 0x7fffffff; return; diff --git a/sbin/route/Makefile b/sbin/route/Makefile index ef56dfd9286a..0f4cd67e41ed 100644 --- a/sbin/route/Makefile +++ b/sbin/route/Makefile @@ -6,7 +6,7 @@ PROG= route MAN= route.8 SRCS= route.c keywords.h -WARNS?= 0 +WARNS?= 3 CLEANFILES+=keywords.h _keywords.tmp CFLAGS+= -DNS diff --git a/sbin/route/route.c b/sbin/route/route.c index 4380f42196a4..f0bb07bca87d 100644 --- a/sbin/route/route.c +++ b/sbin/route/route.c @@ -70,7 +70,7 @@ __FBSDID("$FreeBSD$"); #include struct keytab { - char *kt_cp; + const char *kt_cp; int kt_i; } keywords[] = { #include "keywords.h" @@ -100,39 +100,39 @@ struct rt_metrics rt_metrics; u_long rtm_inits; uid_t uid; -int atalk_aton(const char *, struct at_addr *); -char *atalk_ntoa(struct at_addr); -void bprintf(FILE *, int, u_char *); -void flushroutes(int argc, char *argv[]); -int getaddr(int, char *, struct hostent **); -int keyword(char *); -void inet_makenetandmask(u_long, struct sockaddr_in *, u_long); +static int atalk_aton(const char *, struct at_addr *); +static char *atalk_ntoa(struct at_addr); +static void bprintf(FILE *, int, u_char *); +static void flushroutes(int argc, char *argv[]); +static int getaddr(int, char *, struct hostent **); +static int keyword(const char *); +static void inet_makenetandmask(u_long, struct sockaddr_in *, u_long); #ifdef INET6 -static int inet6_makenetandmask(struct sockaddr_in6 *, char *); +static int inet6_makenetandmask(struct sockaddr_in6 *, const char *); #endif -void interfaces(void); -void mask_addr(void); -void monitor(void); -const char *netname(struct sockaddr *); -void newroute(int, char **); -void pmsg_addrs(char *, int); -void pmsg_common(struct rt_msghdr *); -int prefixlen(char *); -void print_getmsg(struct rt_msghdr *, int); -void print_rtmsg(struct rt_msghdr *, int); -const char *routename(struct sockaddr *); -int rtmsg(int, int); -void set_metric(char *, int); -void sockaddr(char *, struct sockaddr *); -void sodump(sup, char *); -extern char *iso_ntoa(); +static void interfaces(void); +static void mask_addr(void); +static void monitor(void); +static const char *netname(struct sockaddr *); +static void newroute(int, char **); +static void pmsg_addrs(char *, int); +static void pmsg_common(struct rt_msghdr *); +static int prefixlen(const char *); +static void print_getmsg(struct rt_msghdr *, int); +static void print_rtmsg(struct rt_msghdr *, int); +static const char *routename(struct sockaddr *); +static int rtmsg(int, int); +static void set_metric(char *, int); +static void sockaddr(char *, struct sockaddr *); +static void sodump(sup, const char *); +extern char *iso_ntoa(void); -void usage(const char *) __dead2; +static void usage(const char *) __dead2; void usage(const char *cp) { - if (cp) + if (cp != NULL) warnx("bad keyword: %s", cp); (void) fprintf(stderr, "usage: route [-dnqtv] command [[modifiers] args]\n"); @@ -146,7 +146,7 @@ main(int argc, char **argv) int ch; if (argc < 2) - usage((char *)NULL); + usage(NULL); while ((ch = getopt(argc, argv, "nqdtv")) != -1) switch(ch) { @@ -167,7 +167,7 @@ main(int argc, char **argv) break; case '?': default: - usage((char *)NULL); + usage(NULL); } argc -= optind; argv += optind; @@ -180,7 +180,7 @@ main(int argc, char **argv) s = socket(PF_ROUTE, SOCK_RAW, 0); if (s < 0) err(EX_OSERR, "socket"); - if (*argv) + if (*argv != NULL) switch (keyword(*argv)) { case K_GET: case K_SHOW: @@ -211,7 +211,7 @@ main(int argc, char **argv) * Purge all entries in the routing tables not * associated with network interfaces. */ -void +static void flushroutes(int argc, char *argv[]) { size_t needed; @@ -219,7 +219,7 @@ flushroutes(int argc, char *argv[]) char *buf, *next, *lim; struct rt_msghdr *rtm; - if (uid && !debugonly) { + if (uid != 0 && !debugonly) { errx(EX_NOPERM, "must be root to alter routing table"); } shutdown(s, SHUT_RD); /* Don't want to read back our messages */ @@ -259,7 +259,7 @@ retry: errx(EX_OSERR, "malloc failed"); if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { if (errno == ENOMEM && count++ < 10) { - warnx("Routing table grew, retrying"); + warnx("Routing table grew, retrying"); sleep(1); free(buf); goto retry; @@ -276,7 +276,7 @@ retry: print_rtmsg(rtm, rtm->rtm_msglen); if ((rtm->rtm_flags & RTF_GATEWAY) == 0) continue; - if (af) { + if (af != 0) { struct sockaddr *sa = (struct sockaddr *)(rtm + 1); if (sa->sa_family != af) @@ -315,7 +315,7 @@ retry: const char * routename(struct sockaddr *sa) { - char *cp; + const char *cp; static char line[MAXHOSTNAMELEN + 1]; struct hostent *hp; static char domain[MAXHOSTNAMELEN + 1]; @@ -339,20 +339,22 @@ routename(struct sockaddr *sa) { struct in_addr in; in = ((struct sockaddr_in *)sa)->sin_addr; - cp = 0; + cp = NULL; if (in.s_addr == INADDR_ANY || sa->sa_len < 4) cp = "default"; - if (cp == 0 && !nflag) { + if (cp == NULL && !nflag) { hp = gethostbyaddr((char *)&in, sizeof (struct in_addr), AF_INET); - if (hp) { - if ((cp = strchr(hp->h_name, '.')) && - !strcmp(cp + 1, domain)) - *cp = 0; + if (hp != NULL) { + char *cptr; + cptr = strchr(hp->h_name, '.'); + if (cptr != NULL && + strcmp(cptr + 1, domain) == 0) + *cptr = '\0'; cp = hp->h_name; } } - if (cp) { + if (cp != NULL) { strncpy(line, cp, sizeof(line) - 1); line[sizeof(line) - 1] = '\0'; } else @@ -400,16 +402,17 @@ routename(struct sockaddr *sa) return (link_ntoa((struct sockaddr_dl *)sa)); default: - { u_short *s = (u_short *)sa; - u_short *slim = s + ((sa->sa_len + 1) >> 1); - char *cp = line + sprintf(line, "(%d)", sa->sa_family); + { + u_short *sp = (u_short *)sa; + u_short *splim = sp + ((sa->sa_len + 1) >> 1); + char *cps = line + sprintf(line, "(%d)", sa->sa_family); char *cpe = line + sizeof(line); - while (++s < slim && cp < cpe) /* start with sa->sa_data */ - if ((n = snprintf(cp, cpe - cp, " %x", *s)) > 0) - cp += n; + while (++sp < splim && cps < cpe) /* start with sa->sa_data */ + if ((n = snprintf(cps, cpe - cps, " %x", *sp)) > 0) + cps += n; else - *cp = '\0'; + *cps = '\0'; break; } } @@ -423,9 +426,9 @@ routename(struct sockaddr *sa) const char * netname(struct sockaddr *sa) { - char *cp = 0; + const char *cp = NULL; static char line[MAXHOSTNAMELEN + 1]; - struct netent *np = 0; + struct netent *np = NULL; u_long net, mask; u_long i; int n, subnetshift; @@ -462,11 +465,11 @@ netname(struct sockaddr *sa) while ((mask & 1) == 0) mask >>= 1, net >>= 1; np = getnetbyaddr(net, AF_INET); - if (np) + if (np != NULL) cp = np->n_name; } #define C(x) (unsigned)((x) & 0xff) - if (cp) + if (cp != NULL) strncpy(line, cp, sizeof(line)); else if ((in.s_addr & 0xffffff) == 0) (void) sprintf(line, "%u", C(in.s_addr >> 24)); @@ -525,23 +528,24 @@ netname(struct sockaddr *sa) default: - { u_short *s = (u_short *)sa->sa_data; - u_short *slim = s + ((sa->sa_len + 1)>>1); - char *cp = line + sprintf(line, "af %d:", sa->sa_family); + { + u_short *sp = (u_short *)sa->sa_data; + u_short *splim = sp + ((sa->sa_len + 1)>>1); + char *cps = line + sprintf(line, "af %d:", sa->sa_family); char *cpe = line + sizeof(line); - while (s < slim && cp < cpe) - if ((n = snprintf(cp, cpe - cp, " %x", *s++)) > 0) - cp += n; + while (sp < splim && cps < cpe) + if ((n = snprintf(cps, cpe - cps, " %x", *sp++)) > 0) + cps += n; else - *cp = '\0'; + *cps = '\0'; break; } } return (line); } -void +static void set_metric(char *value, int key) { int flag = 0; @@ -567,15 +571,16 @@ set_metric(char *value, int key) *valp = atoi(value); } -void +static void newroute(int argc, char **argv) { - char *cmd, *dest = "", *gateway = "", *errmsg; + char *cmd; + const char *dest = "", *gateway = "", *errmsg; int ishost = 0, proxy = 0, ret, attempts, oerrno, flags = RTF_STATIC; int key; struct hostent *hp = 0; - if (uid) { + if (uid != 0) { errx(EX_NOPERM, "must be root to alter routing table"); } cmd = argv[0]; @@ -652,33 +657,33 @@ newroute(int argc, char **argv) break; case K_IFA: if (!--argc) - usage((char *)NULL); + usage(NULL); (void) getaddr(RTA_IFA, *++argv, 0); break; case K_IFP: if (!--argc) - usage((char *)NULL); + usage(NULL); (void) getaddr(RTA_IFP, *++argv, 0); break; case K_GENMASK: if (!--argc) - usage((char *)NULL); + usage(NULL); (void) getaddr(RTA_GENMASK, *++argv, 0); break; case K_GATEWAY: if (!--argc) - usage((char *)NULL); + usage(NULL); (void) getaddr(RTA_GATEWAY, *++argv, 0); break; case K_DST: if (!--argc) - usage((char *)NULL); + usage(NULL); ishost = getaddr(RTA_DST, *++argv, &hp); dest = *argv; break; case K_NETMASK: if (!--argc) - usage((char *)NULL); + usage(NULL); (void) getaddr(RTA_NETMASK, *++argv, 0); /* FALLTHROUGH */ case K_NET: @@ -686,7 +691,7 @@ newroute(int argc, char **argv) break; case K_PREFIXLEN: if (!--argc) - usage((char *)NULL); + usage(NULL); if (prefixlen(*++argv) == -1) { forcenet = 0; ishost = 1; @@ -705,7 +710,7 @@ newroute(int argc, char **argv) case K_RTTVAR: case K_WEIGHT: if (!--argc) - usage((char *)NULL); + usage(NULL); set_metric(*++argv, key); break; default: @@ -729,9 +734,9 @@ newroute(int argc, char **argv) #ifdef INET6 if (af == AF_INET6) { rtm_addrs &= ~RTA_NETMASK; - memset((void *)&so_mask, 0, sizeof(so_mask)); + memset((void *)&so_mask, 0, sizeof(so_mask)); } -#endif +#endif } if (forcenet) ishost = 0; @@ -750,10 +755,12 @@ newroute(int argc, char **argv) break; if (errno != ENETUNREACH && errno != ESRCH) break; - if (af == AF_INET && *gateway && hp && hp->h_addr_list[1]) { + if (af == AF_INET && *gateway != '\0' && + hp != NULL && hp->h_addr_list[1] != NULL) { hp->h_addr_list++; memmove(&so_gate.sin.sin_addr, hp->h_addr_list[0], - MIN(hp->h_length, sizeof(so_gate.sin.sin_addr))); + MIN((size_t)hp->h_length, + sizeof(so_gate.sin.sin_addr))); } else break; } @@ -798,14 +805,14 @@ newroute(int argc, char **argv) exit(ret != 0); } -void +static void inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits) { u_long addr, mask = 0; char *cp; rtm_addrs |= RTA_NETMASK; - /* + /* * XXX: This approach unable to handle 0.0.0.1/32 correctly * as inet_network() converts 0.0.0.1 and 1 equally. */ @@ -818,7 +825,7 @@ inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits) else addr = net; /* - * If no /xx was specified we must cacluate the + * If no /xx was specified we must calculate the * CIDR address. */ if ((bits == 0) && (addr != 0)) { @@ -851,11 +858,11 @@ inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits) * XXX the function may need more improvement... */ static int -inet6_makenetandmask(struct sockaddr_in6 *sin6, char *plen) +inet6_makenetandmask(struct sockaddr_in6 *sin6, const char *plen) { struct in6_addr in6; - if (!plen) { + if (plen == NULL) { if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) && sin6->sin6_scope_id == 0) { plen = "0"; @@ -868,11 +875,11 @@ inet6_makenetandmask(struct sockaddr_in6 *sin6, char *plen) } } - if (!plen || strcmp(plen, "128") == 0) - return 1; + if (plen == NULL || strcmp(plen, "128") == 0) + return (1); rtm_addrs |= RTA_NETMASK; - (void)prefixlen(plen); - return 0; + prefixlen(plen); + return (0); } #endif @@ -880,8 +887,8 @@ inet6_makenetandmask(struct sockaddr_in6 *sin6, char *plen) * Interpret an argument as a network address of some kind, * returning 1 if a host address, 0 if a network address. */ -int -getaddr(int which, char *s, struct hostent **hpp) +static int +getaddr(int which, char *str, struct hostent **hpp) { sup su; struct hostent *hp; @@ -909,17 +916,17 @@ getaddr(int which, char *s, struct hostent **hpp) if (getifaddrs(&ifap)) err(1, "getifaddrs"); - for (ifa = ifap; ifa; ifa = ifa->ifa_next) { + for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr->sa_family != AF_LINK) continue; - if (strcmp(s, ifa->ifa_name)) + if (strcmp(str, ifa->ifa_name) != 0) continue; sdl = (struct sockaddr_dl *)ifa->ifa_addr; } /* If we found it, then use it */ - if (sdl) { + if (sdl != NULL) { /* * Copy is safe since we have a * sockaddr_storage member in sockunion{}. @@ -929,7 +936,7 @@ getaddr(int which, char *s, struct hostent **hpp) memcpy(&su->sdl, sdl, sdl->sdl_len); } freeifaddrs(ifap); - if (sdl) + if (sdl != NULL) return(1); } break; @@ -952,9 +959,9 @@ getaddr(int which, char *s, struct hostent **hpp) } su->sa.sa_len = aflen; su->sa.sa_family = afamily; /* cases that don't want it have left already */ - if (strcmp(s, "default") == 0) { + if (strcmp(str, "default") == 0) { /* - * Default is net 0.0.0.0/0 + * Default is net 0.0.0.0/0 */ switch (which) { case RTA_DST: @@ -962,7 +969,7 @@ getaddr(int which, char *s, struct hostent **hpp) #if 0 bzero(su, sizeof(*su)); /* for readability */ #endif - (void) getaddr(RTA_NETMASK, s, 0); + getaddr(RTA_NETMASK, str, 0); break; #if 0 case RTA_NETMASK: @@ -980,15 +987,15 @@ getaddr(int which, char *s, struct hostent **hpp) int ecode; q = NULL; - if (which == RTA_DST && (q = strchr(s, '/')) != NULL) + if (which == RTA_DST && (q = strchr(str, '/')) != NULL) *q = '\0'; memset(&hints, 0, sizeof(hints)); hints.ai_family = afamily; /*AF_INET6*/ hints.ai_socktype = SOCK_DGRAM; /*dummy*/ - ecode = getaddrinfo(s, NULL, &hints, &res); + ecode = getaddrinfo(str, NULL, &hints, &res); if (ecode != 0 || res->ai_family != AF_INET6 || res->ai_addrlen != sizeof(su->sin6)) { - (void) fprintf(stderr, "%s: %s\n", s, + (void) fprintf(stderr, "%s: %s\n", str, gai_strerror(ecode)); exit(1); } @@ -1012,19 +1019,19 @@ getaddr(int which, char *s, struct hostent **hpp) #endif /* INET6 */ case AF_APPLETALK: - if (!atalk_aton(s, &su->sat.sat_addr)) - errx(EX_NOHOST, "bad address: %s", s); + if (!atalk_aton(str, &su->sat.sat_addr)) + errx(EX_NOHOST, "bad address: %s", str); rtm_addrs |= RTA_NETMASK; return(forcehost || su->sat.sat_addr.s_node != 0); case AF_LINK: - link_addr(s, &su->sdl); + link_addr(str, &su->sdl); return (1); case PF_ROUTE: su->sa.sa_len = sizeof(*su); - sockaddr(s, &su->sa); + sockaddr(str, &su->sa); return (1); case AF_INET: @@ -1036,10 +1043,10 @@ getaddr(int which, char *s, struct hostent **hpp) hpp = &hp; *hpp = NULL; - q = strchr(s,'/'); - if (q && which == RTA_DST) { + q = strchr(str,'/'); + if (q != NULL && which == RTA_DST) { *q = '\0'; - if ((val = inet_network(s)) != INADDR_NONE) { + if ((val = inet_network(str)) != INADDR_NONE) { inet_makenetandmask( val, &su->sin, strtoul(q+1, 0, 0)); return (0); @@ -1047,7 +1054,7 @@ getaddr(int which, char *s, struct hostent **hpp) *q = '/'; } if ((which != RTA_DST || forcenet == 0) && - inet_aton(s, &su->sin.sin_addr)) { + inet_aton(str, &su->sin.sin_addr)) { val = su->sin.sin_addr.s_addr; if (which != RTA_DST || forcehost || inet_lnaof(su->sin.sin_addr) != INADDR_ANY) @@ -1058,27 +1065,27 @@ getaddr(int which, char *s, struct hostent **hpp) } } if (which == RTA_DST && forcehost == 0 && - ((val = inet_network(s)) != INADDR_NONE || - ((np = getnetbyname(s)) != NULL && (val = np->n_net) != 0))) { + ((val = inet_network(str)) != INADDR_NONE || + ((np = getnetbyname(str)) != NULL && (val = np->n_net) != 0))) { netdone: inet_makenetandmask(val, &su->sin, 0); return (0); } - hp = gethostbyname(s); - if (hp) { + hp = gethostbyname(str); + if (hp != NULL) { *hpp = hp; su->sin.sin_family = hp->h_addrtype; memmove((char *)&su->sin.sin_addr, hp->h_addr, - MIN(hp->h_length, sizeof(su->sin.sin_addr))); + MIN((size_t)hp->h_length, sizeof(su->sin.sin_addr))); return (1); } - errx(EX_NOHOST, "bad address: %s", s); + errx(EX_NOHOST, "bad address: %s", str); } -int -prefixlen(char *s) +static int +prefixlen(const char *str) { - int len = atoi(s), q, r; + int len = atoi(str), q, r; int max; char *p; @@ -1095,13 +1102,12 @@ prefixlen(char *s) p = (char *)&so_mask.sin.sin_addr; break; default: - (void) fprintf(stderr, "prefixlen not supported in this af\n"); + fprintf(stderr, "prefixlen not supported in this af\n"); exit(1); - /*NOTREACHED*/ } if (len < 0 || max < len) { - (void) fprintf(stderr, "%s: bad value\n", s); + fprintf(stderr, "%s: bad value\n", str); exit(1); } @@ -1115,12 +1121,12 @@ prefixlen(char *s) if (r > 0) *((u_char *)p + q) = (0xff00 >> r) & 0xff; if (len == max) - return -1; + return (-1); else - return len; + return (len); } -void +static void interfaces(void) { size_t needed; @@ -1155,7 +1161,7 @@ retry2: } } -void +static void monitor(void) { int n; @@ -1166,7 +1172,7 @@ monitor(void) interfaces(); exit(0); } - for(;;) { + for (;;) { time_t now; n = read(s, msg, 2048); now = time(NULL); @@ -1180,7 +1186,7 @@ struct { char m_space[512]; } m_rtmsg; -int +static int rtmsg(int cmd, int flags) { static int seq; @@ -1250,7 +1256,7 @@ rtmsg(int cmd, int flags) return (0); } -void +static void mask_addr(void) { int olen = so_mask.sa.sa_len; @@ -1281,7 +1287,7 @@ mask_addr(void) *--cp1 &= *--cp2; } -char *msgtypes[] = { +const char *msgtypes[] = { "", "RTM_ADD: Add Route", "RTM_DELETE: Delete Route", @@ -1318,8 +1324,8 @@ char ifnetflags[] = char addrnames[] = "\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR\010BRD"; -void -print_rtmsg(struct rt_msghdr *rtm, int msglen) +static void +print_rtmsg(struct rt_msghdr *rtm, int msglen __unused) { struct if_msghdr *ifm; struct ifa_msghdr *ifam; @@ -1327,7 +1333,7 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen) struct ifma_msghdr *ifmam; #endif struct if_announcemsghdr *ifan; - char *state; + const char *state; if (verbose == 0) return; @@ -1399,7 +1405,7 @@ print_rtmsg(struct rt_msghdr *rtm, int msglen) } } -void +static void print_getmsg(struct rt_msghdr *rtm, int msglen) { struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL; @@ -1493,7 +1499,7 @@ print_getmsg(struct rt_msghdr *rtm, int msglen) #undef RTA_IGN } -void +static void pmsg_common(struct rt_msghdr *rtm) { (void) printf("\nlocks: "); @@ -1503,7 +1509,7 @@ pmsg_common(struct rt_msghdr *rtm) pmsg_addrs(((char *)(rtm + 1)), rtm->rtm_addrs); } -void +static void pmsg_addrs(char *cp, int addrs) { struct sockaddr *sa; @@ -1516,7 +1522,7 @@ pmsg_addrs(char *cp, int addrs) (void) printf("\nsockaddrs: "); bprintf(stdout, addrs, addrnames); (void) putchar('\n'); - for (i = 1; i; i <<= 1) + for (i = 1; i != 0; i <<= 1) if (i & addrs) { sa = (struct sockaddr *)cp; (void) printf(" %s", routename(sa)); @@ -1526,15 +1532,15 @@ pmsg_addrs(char *cp, int addrs) (void) fflush(stdout); } -void -bprintf(FILE *fp, int b, u_char *s) +static void +bprintf(FILE *fp, int b, u_char *str) { int i; int gotsome = 0; if (b == 0) return; - while ((i = *s++) != 0) { + while ((i = *str++) != 0) { if (b & (1 << (i-1))) { if (gotsome == 0) i = '<'; @@ -1542,28 +1548,28 @@ bprintf(FILE *fp, int b, u_char *s) i = ','; (void) putc(i, fp); gotsome = 1; - for (; (i = *s) > 32; s++) + for (; (i = *str) > 32; str++) (void) putc(i, fp); } else - while (*s > 32) - s++; + while (*str > 32) + str++; } if (gotsome) (void) putc('>', fp); } int -keyword(char *cp) +keyword(const char *cp) { struct keytab *kt = keywords; - while (kt->kt_cp && strcmp(kt->kt_cp, cp)) + while (kt->kt_cp != NULL && strcmp(kt->kt_cp, cp) != 0) kt++; - return kt->kt_i; + return (kt->kt_i); } -void -sodump(sup su, char *which) +static void +sodump(sup su, const char *which) { switch (su->sa.sa_family) { case AF_LINK: @@ -1591,7 +1597,7 @@ sodump(sup su, char *which) #define END (4*1) #define DELIM (4*2) -void +static void sockaddr(char *addr, struct sockaddr *sa) { char *cp = (char *)sa; @@ -1608,7 +1614,7 @@ sockaddr(char *addr, struct sockaddr *sa) new = *addr - 'a' + 10; } else if ((*addr >= 'A') && (*addr <= 'F')) { new = *addr - 'A' + 10; - } else if (*addr == 0) + } else if (*addr == '\0') state |= END; else state |= DELIM; @@ -1633,7 +1639,7 @@ sockaddr(char *addr, struct sockaddr *sa) sa->sa_len = cp - (char *)sa; } -int +static int atalk_aton(const char *text, struct at_addr *addr) { u_int net, node; @@ -1646,7 +1652,7 @@ atalk_aton(const char *text, struct at_addr *addr) return(1); } -char * +static char * atalk_ntoa(struct at_addr at) { static char buf[20]; diff --git a/sbin/routed/Makefile b/sbin/routed/Makefile index 99b07f595674..8f2a8193318e 100644 --- a/sbin/routed/Makefile +++ b/sbin/routed/Makefile @@ -1,16 +1,13 @@ # Make `routed` for FreeBSD # $FreeBSD$ -PROG= routed -SRCS= if.c input.c main.c output.c parms.c radix.c rdisc.c table.c trace.c -MAN= routed.8 -SUBDIR= rtquery -LDADD= -lmd +PROG= routed +MAN= routed.8 +SRCS= if.c input.c main.c output.c parms.c radix.c rdisc.c table.c trace.c +WARNS?= 3 DPADD= ${LIBMD} -.if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64" -WARNS?= 6 -.else -WARNS?= 0 -.endif +LDADD= -lmd + +SUBDIR= rtquery .include diff --git a/sbin/routed/if.c b/sbin/routed/if.c index 61ac412b2e1c..9160e6f2bb13 100644 --- a/sbin/routed/if.c +++ b/sbin/routed/if.c @@ -29,6 +29,8 @@ * $FreeBSD$ */ +#include + #include "defs.h" #include "pathnames.h" @@ -42,7 +44,7 @@ __RCSID("$Revision: 2.27 $"); #endif struct ifhead ifnet = LIST_HEAD_INITIALIZER(ifnet); /* all interfaces */ -struct ifhead remote_if = LIST_HEAD_INITIALIZER(ifnet); /* remote interfaces */ +struct ifhead remote_if = LIST_HEAD_INITIALIZER(remote_if); /* remote interfaces */ /* hash table for all interfaces, big enough to tolerate ridiculous * numbers of IP aliases. Crazy numbers of aliases such as 7000 @@ -948,9 +950,9 @@ ifinit(void) } else if (now.tv_sec>(ifp->int_data.ts + CHECK_BAD_INTERVAL)) { trace_act("interface %s has been off" - " %ld seconds; forget it", + " %jd seconds; forget it", ifp->int_name, - (long)now.tv_sec- + (intmax_t)now.tv_sec - ifp->int_data.ts); ifdel(ifp); } diff --git a/sbin/routed/rtquery/Makefile b/sbin/routed/rtquery/Makefile index 7076158727f6..458d1caa594f 100644 --- a/sbin/routed/rtquery/Makefile +++ b/sbin/routed/rtquery/Makefile @@ -6,6 +6,6 @@ PROG= rtquery MAN= rtquery.8 LDADD= -lmd DPADD= ${LIBMD} -WARNS?= 0 +WARNS?= 3 .include diff --git a/sbin/rtsol/Makefile b/sbin/rtsol/Makefile index 2086c68d5f29..413b6d59dd29 100644 --- a/sbin/rtsol/Makefile +++ b/sbin/rtsol/Makefile @@ -21,8 +21,8 @@ SRCDIR= ${.CURDIR}/../../usr.sbin/rtsold PROG= rtsol SRCS= rtsold.c rtsol.c if.c probe.c rtsock.c NO_MAN= -WARNS?= 0 +WARNS?= 3 CFLAGS+= -DHAVE_ARC4RANDOM -DHAVE_POLL_H -DSMALL .include diff --git a/sbin/savecore/Makefile b/sbin/savecore/Makefile index 525f281b598c..f25745826029 100644 --- a/sbin/savecore/Makefile +++ b/sbin/savecore/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG= savecore -WARNS?= 6 DPADD= ${LIBZ} LDADD= -lz MAN= savecore.8 diff --git a/sbin/sconfig/Makefile b/sbin/sconfig/Makefile index 5923692aad47..9698c04ddbad 100644 --- a/sbin/sconfig/Makefile +++ b/sbin/sconfig/Makefile @@ -4,5 +4,6 @@ PROG= sconfig MAN= sconfig.8 MANSUBDIR= /i386 +WARNS?= 2 .include diff --git a/sbin/setkey/setkey.8 b/sbin/setkey/setkey.8 index 12c9cc2dc710..ffb911504f36 100644 --- a/sbin/setkey/setkey.8 +++ b/sbin/setkey/setkey.8 @@ -707,7 +707,7 @@ add 10.1.10.34 10.1.10.36 tcp 0x1000 -A tcp-md5 "TCP-MD5 BGP secret" ; .Xr sysctl 8 .Rs .%T "Changed manual key configuration for IPsec" -.%O "http://www.kame.net/newsletter/19991007/" +.%U http://www.kame.net/newsletter/19991007/ .%D "October 1999" .Re .\" diff --git a/sbin/shutdown/Makefile b/sbin/shutdown/Makefile index b7f232d090b5..09b0b3ebf01d 100644 --- a/sbin/shutdown/Makefile +++ b/sbin/shutdown/Makefile @@ -4,8 +4,6 @@ PROG= shutdown MAN= shutdown.8 -WARNS?= 6 - BINOWN= root BINGRP= operator BINMODE=4550 diff --git a/sbin/shutdown/shutdown.c b/sbin/shutdown/shutdown.c index c4f3f41e6c51..9032866f9451 100644 --- a/sbin/shutdown/shutdown.c +++ b/sbin/shutdown/shutdown.c @@ -92,15 +92,15 @@ static int dohalt, dopower, doreboot, killflg, mbuflen, oflag; static char mbuf[BUFSIZ]; static const char *nosync, *whom; -void badtime(void); -void die_you_gravy_sucking_pig_dog(void); -void finish(int); -void getoffset(char *); -void loop(void); -void nolog(void); -void timeout(int); -void timewarn(int); -void usage(const char *); +static void badtime(void); +static void perform_shutdown(void); +static void finish(int); +static void getoffset(char *); +static void loop(void); +static void nolog(void); +static void timeout(int); +static void timewarn(int); +static void usage(const char *); extern const char **environ; @@ -219,8 +219,8 @@ main(int argc, char **argv) return(0); } -void -loop() +static void +loop(void) { struct interval *tp; u_int sltime; @@ -258,7 +258,7 @@ loop() if (!tp->timeleft) break; } - die_you_gravy_sucking_pig_dog(); + perform_shutdown(); } static jmp_buf alarmbuf; @@ -268,7 +268,7 @@ static const char *restricted_environ[] = { NULL }; -void +static void timewarn(int timeleft) { static int first; @@ -318,14 +318,14 @@ timewarn(int timeleft) } } -void +static void timeout(int signo __unused) { longjmp(alarmbuf, 1); } -void -die_you_gravy_sucking_pig_dog() +static void +perform_shutdown(void) { char *empty_environ[] = { NULL }; @@ -385,7 +385,7 @@ die_you_gravy_sucking_pig_dog() #define ATOI2(p) (p[0] - '0') * 10 + (p[1] - '0'); p += 2; -void +static void getoffset(char *timearg) { struct tm *lt; @@ -468,8 +468,8 @@ getoffset(char *timearg) } #define NOMSG "\n\nNO LOGINS: System going down at " -void -nolog() +static void +nolog(void) { int logfd; char *ct; @@ -490,7 +490,7 @@ nolog() } } -void +static void finish(int signo __unused) { if (!killflg) @@ -498,13 +498,13 @@ finish(int signo __unused) exit(0); } -void -badtime() +static void +badtime(void) { errx(1, "bad time format"); } -void +static void usage(const char *cp) { if (cp != NULL) diff --git a/sbin/spppcontrol/Makefile b/sbin/spppcontrol/Makefile index b394c39a4e83..3287fcf24126 100644 --- a/sbin/spppcontrol/Makefile +++ b/sbin/spppcontrol/Makefile @@ -2,5 +2,6 @@ PROG= spppcontrol MAN= spppcontrol.8 +WARNS?= 2 .include diff --git a/sbin/sunlabel/Makefile b/sbin/sunlabel/Makefile index 143b6c72bb0f..9eb1a3257091 100644 --- a/sbin/sunlabel/Makefile +++ b/sbin/sunlabel/Makefile @@ -11,8 +11,6 @@ LINKS= ${BINDIR}/sunlabel ${BINDIR}/disklabel MLINKS= sunlabel.8 disklabel.8 .endif -WARNS?= 5 - DPADD= ${LIBGEOM} LDADD= -lgeom diff --git a/sbin/swapon/Makefile b/sbin/swapon/Makefile index 6f8e8df2e5a6..74422811b4a5 100644 --- a/sbin/swapon/Makefile +++ b/sbin/swapon/Makefile @@ -8,6 +8,7 @@ LINKS+= ${BINDIR}/swapon ${BINDIR}/swapctl MLINKS= swapon.8 swapoff.8 MLINKS+=swapon.8 swapctl.8 +WARNS?= 3 DPADD= ${LIBUTIL} LDADD= -lutil diff --git a/sbin/sysctl/Makefile b/sbin/sysctl/Makefile index 381f19918be3..06ff9b482d69 100644 --- a/sbin/sysctl/Makefile +++ b/sbin/sysctl/Makefile @@ -2,7 +2,7 @@ # $FreeBSD$ PROG= sysctl -WARNS?= 0 +WARNS?= 3 MAN= sysctl.8 .include diff --git a/sbin/sysctl/sysctl.8 b/sbin/sysctl/sysctl.8 index 4084290284e1..1f5c8e6af773 100644 --- a/sbin/sysctl/sysctl.8 +++ b/sbin/sysctl/sysctl.8 @@ -28,7 +28,7 @@ .\" From: @(#)sysctl.8 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd November 28, 2007 +.Dd February 6, 2010 .Dt SYSCTL 8 .Os .Sh NAME @@ -36,7 +36,7 @@ .Nd get or set kernel state .Sh SYNOPSIS .Nm -.Op Fl bdehNnoqx +.Op Fl bdehiNnoqx .Ar name Ns Op = Ns Ar value .Ar ... .Nm @@ -82,6 +82,12 @@ or is specified, or a variable is being set. .It Fl h Format output for human, rather than machine, readability. +.It Fl i +Ignore unknown OIDs. +The purpose is to make use of +.Nm +for collecting data from a variety of machines (not all of which +are necessarily running exactly the same software) easier. .It Fl N Show only variable names, not their values. This is particularly useful with shells that offer programmable diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c index 4140fb3a586f..5d0025bbcb1c 100644 --- a/sbin/sysctl/sysctl.c +++ b/sbin/sysctl/sysctl.c @@ -58,8 +58,8 @@ static const char rcsid[] = #include #include -static int aflag, bflag, dflag, eflag, hflag, Nflag, nflag, oflag; -static int qflag, xflag, warncount; +static int aflag, bflag, dflag, eflag, hflag, iflag; +static int Nflag, nflag, oflag, qflag, xflag, warncount; static int oidfmt(int *, int, char *, u_int *); static void parse(char *); @@ -68,14 +68,14 @@ static int sysctl_all(int *oid, int len); static int name2oid(char *, int *); static void set_T_dev_t(char *, void **, size_t *); -static int set_IK(char *, int *); +static int set_IK(const char *, int *); static void usage(void) { (void)fprintf(stderr, "%s\n%s\n", - "usage: sysctl [-bdehNnoqx] name[=value] ...", + "usage: sysctl [-bdehiNnoqx] name[=value] ...", " sysctl [-bdehNnoqx] -a"); exit(1); } @@ -89,7 +89,7 @@ main(int argc, char **argv) setbuf(stdout,0); setbuf(stderr,0); - while ((ch = getopt(argc, argv, "AabdehNnoqwxX")) != -1) { + while ((ch = getopt(argc, argv, "AabdehiNnoqwxX")) != -1) { switch (ch) { case 'A': /* compatibility */ @@ -110,6 +110,9 @@ main(int argc, char **argv) case 'h': hflag = 1; break; + case 'i': + iflag = 1; + break; case 'N': Nflag = 1; break; @@ -187,6 +190,8 @@ parse(char *string) len = name2oid(bufp, mib); if (len < 0) { + if (iflag) + return; if (qflag) exit(1); else @@ -274,7 +279,10 @@ parse(char *string) case CTLTYPE_STRING: break; case CTLTYPE_QUAD: - sscanf(newval, "%qd", &quadval); + quadval = strtoq(newval, &endptr, 0); + if (endptr == newval || *endptr != '\0') + errx(1, "invalid quad integer" + " '%s'", (char *)newval); newval = &quadval; newsize = sizeof(quadval); break; @@ -329,7 +337,7 @@ S_clockinfo(int l2, void *p) struct clockinfo *ci = (struct clockinfo*)p; if (l2 != sizeof(*ci)) { - warnx("S_clockinfo %d != %d", l2, sizeof(*ci)); + warnx("S_clockinfo %d != %zu", l2, sizeof(*ci)); return (1); } printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : @@ -344,7 +352,7 @@ S_loadavg(int l2, void *p) struct loadavg *tv = (struct loadavg*)p; if (l2 != sizeof(*tv)) { - warnx("S_loadavg %d != %d", l2, sizeof(*tv)); + warnx("S_loadavg %d != %zu", l2, sizeof(*tv)); return (1); } printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", @@ -362,7 +370,7 @@ S_timeval(int l2, void *p) char *p1, *p2; if (l2 != sizeof(*tv)) { - warnx("S_timeval %d != %d", l2, sizeof(*tv)); + warnx("S_timeval %d != %zu", l2, sizeof(*tv)); return (1); } printf(hflag ? "{ sec = %'jd, usec = %'ld } " : @@ -384,7 +392,7 @@ S_vmtotal(int l2, void *p) int pageKilo = getpagesize() / 1024; if (l2 != sizeof(*v)) { - warnx("S_vmtotal %d != %d", l2, sizeof(*v)); + warnx("S_vmtotal %d != %zu", l2, sizeof(*v)); return (1); } @@ -416,17 +424,10 @@ T_dev_t(int l2, void *p) dev_t *d = (dev_t *)p; if (l2 != sizeof(*d)) { - warnx("T_dev_T %d != %d", l2, sizeof(*d)); + warnx("T_dev_T %d != %zu", l2, sizeof(*d)); return (1); } - if ((int)(*d) != -1) { - if (minor(*d) > 255 || minor(*d) < 0) - printf("{ major = %d, minor = 0x%x }", - major(*d), minor(*d)); - else - printf("{ major = %d, minor = %d }", - major(*d), minor(*d)); - } + printf("%s", devname(*d, S_IFCHR)); return (0); } @@ -452,19 +453,19 @@ set_T_dev_t(char *path, void **val, size_t *size) } static int -set_IK(char *str, int *val) +set_IK(const char *str, int *val) { float temp; int len, kelv; - char *p, *endptr; + const char *p; + char *endptr; if ((len = strlen(str)) == 0) return (0); p = &str[len - 1]; if (*p == 'C' || *p == 'F') { - *p = '\0'; temp = strtof(str, &endptr); - if (endptr == str || *endptr != '\0') + if (endptr == str || endptr != p) return (0); if (*p == 'F') temp = (temp - 32) * 5 / 9; @@ -520,7 +521,7 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind) j = sizeof(buf); i = sysctl(qoid, len + 2, buf, &j, 0, 0); if (i) - err(1, "sysctl fmt %d %d %d", i, j, errno); + err(1, "sysctl fmt %d %zu %d", i, j, errno); if (kind) *kind = *(u_int *)buf; @@ -553,6 +554,9 @@ show_var(int *oid, int nlen) u_int kind; int (*func)(int, void *); + /* Silence GCC. */ + umv = mv = intlen = 0; + bzero(buf, BUFSIZ); bzero(name, BUFSIZ); qoid[0] = 0; @@ -562,7 +566,7 @@ show_var(int *oid, int nlen) j = sizeof(name); i = sysctl(qoid, nlen + 2, name, &j, 0, 0); if (i || !j) - err(1, "sysctl name %d %d %d", i, j, errno); + err(1, "sysctl name %d %zu %d", i, j, errno); if (Nflag) { printf("%s", name); @@ -613,7 +617,7 @@ show_var(int *oid, int nlen) case 'A': if (!nflag) printf("%s%s", name, sep); - printf("%.*s", len, p); + printf("%.*s", (int)len, p); free(oval); return (0); @@ -700,7 +704,7 @@ show_var(int *oid, int nlen) } if (!nflag) printf("%s%s", name, sep); - printf("Format:%s Length:%d Dump:0x", fmt, len); + printf("Format:%s Length:%zu Dump:0x", fmt, len); while (len-- && (xflag || p < val + 16)) printf("%02x", *p++); if (!xflag && len > 16) @@ -736,7 +740,7 @@ sysctl_all(int *oid, int len) if (errno == ENOENT) return (0); else - err(1, "sysctl(getnext) %d %d", j, l2); + err(1, "sysctl(getnext) %d %zu", j, l2); } l2 /= sizeof(int); diff --git a/sbin/tunefs/tunefs.8 b/sbin/tunefs/tunefs.8 index 06e47cae8647..53e463cfc705 100644 --- a/sbin/tunefs/tunefs.8 +++ b/sbin/tunefs/tunefs.8 @@ -28,7 +28,7 @@ .\" @(#)tunefs.8 8.2 (Berkeley) 12/11/93 .\" $FreeBSD$ .\" -.Dd August 13, 2007 +.Dd October 21, 2009 .Dt TUNEFS 8 .Os .Sh NAME @@ -44,6 +44,7 @@ .Op Fl L Ar volname .Op Fl l Cm enable | disable .Op Fl m Ar minfree +.Op Fl N Cm enable | disable .Op Fl n Cm enable | disable .Op Fl o Cm space | time .Op Fl p @@ -70,7 +71,7 @@ this option will cause all backups to be modified as well as the primary super-block. This is potentially dangerous - use with caution. .It Fl a Cm enable | disable -Turn on/off the administrative ACL enable flag. +Turn on/off the administrative POSIX.1e ACL enable flag. .It Fl e Ar maxbpg Indicate the maximum number of blocks any single file can allocate out of a cylinder group before it is forced to begin @@ -114,6 +115,8 @@ factor of three over the performance obtained at a 10% threshold. If the value is raised above the current usage level, users will be unable to allocate files until enough files have been deleted to get under the higher threshold. +.It Fl N Cm enable | disable +Turn on/off the administrative NFSv4 ACL enable flag. .It Fl n Cm enable | disable Turn on/off soft updates. .It Fl o Cm space | time @@ -165,7 +168,7 @@ The utility appeared in .Bx 4.2 . .Sh BUGS -This utility should work on active file systems. +This utility does not work on active file systems. To change the root file system, the system must be rebooted after the file system is tuned. .\" Take this out and a Unix Daemon will dog your steps from now until diff --git a/sbin/tunefs/tunefs.c b/sbin/tunefs/tunefs.c index 2b263bb343c8..e4adb5267eb3 100644 --- a/sbin/tunefs/tunefs.c +++ b/sbin/tunefs/tunefs.c @@ -76,12 +76,12 @@ void printfs(void); int main(int argc, char *argv[]) { - char *avalue, *Jvalue, *Lvalue, *lvalue, *nvalue; + char *avalue, *Jvalue, *Lvalue, *lvalue, *Nvalue, *nvalue; const char *special, *on; const char *name; int active; int Aflag, aflag, eflag, evalue, fflag, fvalue, Jflag, Lflag, lflag; - int mflag, mvalue, nflag, oflag, ovalue, pflag, sflag, svalue; + int mflag, mvalue, Nflag, nflag, oflag, ovalue, pflag, sflag, svalue; int ch, found_arg, i; const char *chg[2]; struct ufs_args args; @@ -90,12 +90,12 @@ main(int argc, char *argv[]) if (argc < 3) usage(); Aflag = aflag = eflag = fflag = Jflag = Lflag = lflag = mflag = 0; - nflag = oflag = pflag = sflag = 0; - avalue = Jvalue = Lvalue = lvalue = nvalue = NULL; + Nflag = nflag = oflag = pflag = sflag = 0; + avalue = Jvalue = Lvalue = lvalue = Nvalue = nvalue = NULL; evalue = fvalue = mvalue = ovalue = svalue = 0; active = 0; found_arg = 0; /* At least one arg is required. */ - while ((ch = getopt(argc, argv, "Aa:e:f:J:L:l:m:n:o:ps:")) != -1) + while ((ch = getopt(argc, argv, "Aa:e:f:J:L:l:m:N:n:o:ps:")) != -1) switch (ch) { case 'A': @@ -105,7 +105,7 @@ main(int argc, char *argv[]) case 'a': found_arg = 1; - name = "ACLs"; + name = "POSIX.1e ACLs"; avalue = optarg; if (strcmp(avalue, "enable") && strcmp(avalue, "disable")) { @@ -187,6 +187,18 @@ main(int argc, char *argv[]) mflag = 1; break; + case 'N': + found_arg = 1; + name = "NFSv4 ACLs"; + Nvalue = optarg; + if (strcmp(Nvalue, "enable") && + strcmp(Nvalue, "disable")) { + errx(10, "bad %s (options are %s)", + name, "`enable' or `disable'"); + } + Nflag = 1; + break; + case 'n': found_arg = 1; name = "soft updates"; @@ -255,10 +267,13 @@ main(int argc, char *argv[]) strlcpy(sblock.fs_volname, Lvalue, MAXVOLLEN); } if (aflag) { - name = "ACLs"; + name = "POSIX.1e ACLs"; if (strcmp(avalue, "enable") == 0) { if (sblock.fs_flags & FS_ACLS) { warnx("%s remains unchanged as enabled", name); + } else if (sblock.fs_flags & FS_NFS4ACLS) { + warnx("%s and NFSv4 ACLs are mutually " + "exclusive", name); } else { sblock.fs_flags |= FS_ACLS; warnx("%s set", name); @@ -286,7 +301,7 @@ main(int argc, char *argv[]) } if (fflag) { name = "average file size"; - if (sblock.fs_avgfilesize == fvalue) { + if (sblock.fs_avgfilesize == (unsigned)fvalue) { warnx("%s remains unchanged as %d", name, fvalue); } else { @@ -349,6 +364,29 @@ main(int argc, char *argv[]) warnx(OPTWARN, "space", "<", MINFREE); } } + if (Nflag) { + name = "NFSv4 ACLs"; + if (strcmp(Nvalue, "enable") == 0) { + if (sblock.fs_flags & FS_NFS4ACLS) { + warnx("%s remains unchanged as enabled", name); + } else if (sblock.fs_flags & FS_ACLS) { + warnx("%s and POSIX.1e ACLs are mutually " + "exclusive", name); + } else { + sblock.fs_flags |= FS_NFS4ACLS; + warnx("%s set", name); + } + } else if (strcmp(Nvalue, "disable") == 0) { + if ((~sblock.fs_flags & FS_NFS4ACLS) == + FS_NFS4ACLS) { + warnx("%s remains unchanged as disabled", + name); + } else { + sblock.fs_flags &= ~FS_NFS4ACLS; + warnx("%s cleared", name); + } + } + } if (nflag) { name = "soft updates"; if (strcmp(nvalue, "enable") == 0) { @@ -389,7 +427,7 @@ main(int argc, char *argv[]) } if (sflag) { name = "expected number of files per directory"; - if (sblock.fs_avgfpdir == svalue) { + if (sblock.fs_avgfpdir == (unsigned)svalue) { warnx("%s remains unchanged as %d", name, svalue); } else { @@ -423,16 +461,18 @@ usage(void) fprintf(stderr, "%s\n%s\n%s\n%s\n", "usage: tunefs [-A] [-a enable | disable] [-e maxbpg] [-f avgfilesize]", " [-J enable | disable ] [-L volname] [-l enable | disable]", -" [-m minfree] [-n enable | disable] [-o space | time] [-p]", -" [-s avgfpdir] special | filesystem"); +" [-m minfree] [-N enable | disable] [-n enable | disable]", +" [-o space | time] [-p] [-s avgfpdir] special | filesystem"); exit(2); } void printfs(void) { - warnx("ACLs: (-a) %s", + warnx("POSIX.1e ACLs: (-a) %s", (sblock.fs_flags & FS_ACLS)? "enabled" : "disabled"); + warnx("NFSv4 ACLs: (-N) %s", + (sblock.fs_flags & FS_NFS4ACLS)? "enabled" : "disabled"); warnx("MAC multilabel: (-l) %s", (sblock.fs_flags & FS_MULTILABEL)? "enabled" : "disabled"); warnx("soft updates: (-n) %s", diff --git a/sbin/umount/Makefile b/sbin/umount/Makefile index 70ccc5a06624..e472b41de493 100644 --- a/sbin/umount/Makefile +++ b/sbin/umount/Makefile @@ -4,7 +4,6 @@ PROG= umount SRCS= umount.c vfslist.c mounttab.c -WARNS?= 0 MAN= umount.8 MOUNT= ${.CURDIR}/../mount diff --git a/sbin/umount/umount.c b/sbin/umount/umount.c index cbacb4bcb25c..c42b4bbf6030 100644 --- a/sbin/umount/umount.c +++ b/sbin/umount/umount.c @@ -75,7 +75,7 @@ char **makevfslist (const char *); size_t mntinfo (struct statfs **); int namematch (struct addrinfo *); int parsehexfsid(const char *hex, fsid_t *fsid); -int sacmp (struct sockaddr *, struct sockaddr *); +int sacmp (void *, void *); int umountall (char **); int checkname (char *, char **); int umountfs(struct statfs *sfs); @@ -225,7 +225,7 @@ umountall(char **typelist) * Do magic checks on mountpoint/device/fsid, and then call unmount(2). */ int -checkname(char *name, char **typelist) +checkname(char *mntname, char **typelist) { char buf[MAXPATHLEN]; struct statfs sfsbuf; @@ -238,25 +238,25 @@ checkname(char *name, char **typelist) /* * 1. Check if the name exists in the mounttable. */ - sfs = checkmntlist(name); + sfs = checkmntlist(mntname); /* * 2. Remove trailing slashes if there are any. After that * we look up the name in the mounttable again. */ if (sfs == NULL) { - len = strlen(name); - while (len > 1 && name[len - 1] == '/') - name[--len] = '\0'; - sfs = checkmntlist(name); + len = strlen(mntname); + while (len > 1 && mntname[len - 1] == '/') + mntname[--len] = '\0'; + sfs = checkmntlist(mntname); } /* * 3. Check if the deprecated NFS syntax with an '@' has been used * and translate it to the ':' syntax. Look up the name in the * mount table again. */ - if (sfs == NULL && (delimp = strrchr(name, '@')) != NULL) { - snprintf(buf, sizeof(buf), "%s:%.*s", delimp + 1, delimp - name, - name); + if (sfs == NULL && (delimp = strrchr(mntname, '@')) != NULL) { + snprintf(buf, sizeof(buf), "%s:%.*s", delimp + 1, + (int)(delimp - mntname), mntname); len = strlen(buf); while (len > 1 && buf[len - 1] == '/') buf[--len] = '\0'; @@ -271,28 +271,28 @@ checkname(char *name, char **typelist) * mount list and reality. * We also do this if an ambiguous mount point was specified. */ - if (sfs == NULL || (getmntentry(NULL, name, NULL, FIND) != NULL && - getmntentry(NULL, name, NULL, CHECKUNIQUE) == NULL)) { - if (statfs(name, &sfsbuf) != 0) { - warn("%s: statfs", name); - } else if (stat(name, &sb) != 0) { - warn("%s: stat", name); + if (sfs == NULL || (getmntentry(NULL, mntname, NULL, FIND) != NULL && + getmntentry(NULL, mntname, NULL, CHECKUNIQUE) == NULL)) { + if (statfs(mntname, &sfsbuf) != 0) { + warn("%s: statfs", mntname); + } else if (stat(mntname, &sb) != 0) { + warn("%s: stat", mntname); } else if (S_ISDIR(sb.st_mode)) { - /* Check that `name' is the root directory. */ + /* Check that `mntname' is the root directory. */ dev = sb.st_dev; - snprintf(buf, sizeof(buf), "%s/..", name); + snprintf(buf, sizeof(buf), "%s/..", mntname); if (stat(buf, &sb) != 0) { warn("%s: stat", buf); } else if (sb.st_dev == dev) { warnx("%s: not a file system root directory", - name); + mntname); return (1); } else sfs = &sfsbuf; } } if (sfs == NULL) { - warnx("%s: unknown file system", name); + warnx("%s: unknown file system", mntname); return (1); } if (checkvfsname(sfs->f_fstypename, typelist)) @@ -325,14 +325,21 @@ umountfs(struct statfs *sfs) if ((nfsdirname = strdup(sfs->f_mntfromname)) == NULL) err(1, "strdup"); orignfsdirname = nfsdirname; - if ((delimp = strrchr(nfsdirname, ':')) != NULL) { - *delimp = '\0'; + if (*nfsdirname == '[' && + (delimp = strchr(nfsdirname + 1, ']')) != NULL && + *(delimp + 1) == ':') { + hostp = nfsdirname + 1; + nfsdirname = delimp + 2; + } else if ((delimp = strrchr(nfsdirname, ':')) != NULL) { hostp = nfsdirname; + nfsdirname = delimp + 1; + } + if (hostp != NULL) { + *delimp = '\0'; getaddrinfo(hostp, NULL, &hints, &ai); if (ai == NULL) { warnx("can't get net id for host"); } - nfsdirname = delimp + 1; } /* @@ -469,15 +476,16 @@ getmntentry(const char *fromname, const char *onname, fsid_t *fsid, dowhat what) } int -sacmp(struct sockaddr *sa1, struct sockaddr *sa2) +sacmp(void *sa1, void *sa2) { void *p1, *p2; int len; - if (sa1->sa_family != sa2->sa_family) + if (((struct sockaddr *)sa1)->sa_family != + ((struct sockaddr *)sa2)->sa_family) return (1); - switch (sa1->sa_family) { + switch (((struct sockaddr *)sa1)->sa_family) { case AF_INET: p1 = &((struct sockaddr_in *)sa1)->sin_addr; p2 = &((struct sockaddr_in *)sa2)->sin_addr; @@ -520,18 +528,18 @@ namematch(struct addrinfo *ai) } struct statfs * -checkmntlist(char *name) +checkmntlist(char *mntname) { struct statfs *sfs; fsid_t fsid; sfs = NULL; - if (parsehexfsid(name, &fsid) == 0) + if (parsehexfsid(mntname, &fsid) == 0) sfs = getmntentry(NULL, NULL, &fsid, FIND); if (sfs == NULL) - sfs = getmntentry(NULL, name, NULL, FIND); + sfs = getmntentry(NULL, mntname, NULL, FIND); if (sfs == NULL) - sfs = getmntentry(name, NULL, NULL, FIND); + sfs = getmntentry(mntname, NULL, NULL, FIND); return (sfs); } @@ -587,7 +595,7 @@ xdr_dir(XDR *xdrsp, char *dirp) } void -usage() +usage(void) { (void)fprintf(stderr, "%s\n%s\n", diff --git a/secure/Makefile b/secure/Makefile index 7a78d947c556..7342709e1f7f 100644 --- a/secure/Makefile +++ b/secure/Makefile @@ -7,8 +7,7 @@ SUBDIR= lib libexec usr.bin usr.sbin # These are the programs which depend on crypto, but not Kerberos. SPROGS= lib/libfetch lib/libpam lib/libradius lib/libtelnet \ bin/ed libexec/telnetd usr.bin/fetch usr.bin/telnet \ - usr.sbin/pkg_install usr.sbin/ppp usr.sbin/pppd \ - usr.sbin/tcpdump/tcpdump + usr.sbin/pkg_install usr.sbin/ppp usr.sbin/tcpdump/tcpdump .if ${MK_SENDMAIL} != "no" SPROGS+=usr.sbin/sendmail .endif diff --git a/secure/Makefile.inc b/secure/Makefile.inc index 7b9cb987e719..0bd84f1c02e6 100644 --- a/secure/Makefile.inc +++ b/secure/Makefile.inc @@ -15,3 +15,5 @@ CFLAGS+= -DNO_IDEA .if ${MK_OPENSSH} != "no" SSHDIR= ${.CURDIR}/../../../crypto/openssh .endif + +WARNS?= 0 diff --git a/secure/lib/libssh/Makefile b/secure/lib/libssh/Makefile index ecc1a928165e..32b5069b751d 100644 --- a/secure/lib/libssh/Makefile +++ b/secure/lib/libssh/Makefile @@ -19,7 +19,7 @@ SRCS= acss.c authfd.c authfile.c bufaux.c bufbn.c buffer.c \ # compiled directly into sshd instead. # Portability layer -SRCS+= bsd-misc.c fmt_scaled.c getrrsetbyname.c \ +SRCS+= bsd-misc.c fmt_scaled.c getrrsetbyname.c glob.c \ openssl-compat.c port-tun.c strtonum.c vis.c xcrypt.c xmmap.c # FreeBSD additions SRCS+= version.c diff --git a/secure/libexec/sftp-server/Makefile b/secure/libexec/sftp-server/Makefile index 22ce649452f1..7069cff90159 100644 --- a/secure/libexec/sftp-server/Makefile +++ b/secure/libexec/sftp-server/Makefile @@ -5,8 +5,11 @@ SRCS= sftp-server.c sftp-common.c sftp-server-main.c MAN= sftp-server.8 CFLAGS+=-I${SSHDIR} -include ssh_namespace.h +# required when linking with a dynamic libssh +SRCS+= roaming_dummy.c + DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} -LDADD= -lssh -lcrypt -lcrypto -lz +LDADD= -lssh -lcrypt -lcrypto -lz .include diff --git a/secure/libexec/ssh-keysign/Makefile b/secure/libexec/ssh-keysign/Makefile index 6018b948265b..75f1b6c4c28d 100644 --- a/secure/libexec/ssh-keysign/Makefile +++ b/secure/libexec/ssh-keysign/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ PROG= ssh-keysign -SRCS= ssh-keysign.c readconf.c +SRCS= ssh-keysign.c readconf.c roaming_dummy.c MAN= ssh-keysign.8 CFLAGS+=-I${SSHDIR} -include ssh_namespace.h .if defined(ENABLE_SUID_SSH) diff --git a/secure/usr.bin/bdes/bdes.c b/secure/usr.bin/bdes/bdes.c index 22df57af7c7f..cbab5d765656 100644 --- a/secure/usr.bin/bdes/bdes.c +++ b/secure/usr.bin/bdes/bdes.c @@ -170,11 +170,11 @@ main(int argc, char *argv[]) int i; /* counter in a for loop */ char *p; /* used to obtain the key */ DES_cblock msgbuf; /* I/O buffer */ - int kflag; /* command-line encryptiooon key */ + int kflag; /* command-line encryption key */ setproctitle("-"); /* Hide command-line arguments */ - /* initialize the initialization vctor */ + /* initialize the initialization vector */ MEMZERO(ivec, 8); /* process the argument list */ diff --git a/secure/usr.bin/scp/Makefile b/secure/usr.bin/scp/Makefile index ddb2b0930154..8a558c77b951 100644 --- a/secure/usr.bin/scp/Makefile +++ b/secure/usr.bin/scp/Makefile @@ -1,8 +1,12 @@ # $FreeBSD$ PROG= scp +SRCS= scp.c CFLAGS+=-I${SSHDIR} -include ssh_namespace.h +# required when linking with a dynamic libssh +SRCS+= roaming_dummy.c + DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz diff --git a/secure/usr.bin/sftp/Makefile b/secure/usr.bin/sftp/Makefile index 29c435272094..dce01048429d 100644 --- a/secure/usr.bin/sftp/Makefile +++ b/secure/usr.bin/sftp/Makefile @@ -4,6 +4,9 @@ PROG= sftp SRCS= sftp.c sftp-client.c sftp-common.c sftp-glob.c progressmeter.c CFLAGS+=-I${SSHDIR} -include ssh_namespace.h +# required when linking with a dynamic libssh +SRCS+= roaming_dummy.c + DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} ${LIBEDIT} ${LIBNCURSES} LDADD= -lssh -lcrypt -lcrypto -lz -ledit -lncurses diff --git a/secure/usr.bin/ssh-add/Makefile b/secure/usr.bin/ssh-add/Makefile index 34d66a6a771a..0cbcbcb1a9b2 100644 --- a/secure/usr.bin/ssh-add/Makefile +++ b/secure/usr.bin/ssh-add/Makefile @@ -1,8 +1,12 @@ # $FreeBSD$ PROG= ssh-add +SRCS+= ssh-add.c CFLAGS+=-I${SSHDIR} -include ssh_namespace.h +# required when linking with a dynamic libssh +SRCS+= roaming_dummy.c + DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz diff --git a/secure/usr.bin/ssh-agent/Makefile b/secure/usr.bin/ssh-agent/Makefile index ed99a01ced3e..a93a1c64776c 100644 --- a/secure/usr.bin/ssh-agent/Makefile +++ b/secure/usr.bin/ssh-agent/Makefile @@ -1,8 +1,12 @@ # $FreeBSD$ PROG= ssh-agent +SRCS= ssh-agent.c CFLAGS+=-I${SSHDIR} -include ssh_namespace.h +# required when linking with a dynamic libssh +SRCS+= roaming_dummy.c + DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz diff --git a/secure/usr.bin/ssh-keygen/Makefile b/secure/usr.bin/ssh-keygen/Makefile index 30adcf214795..0c250331023c 100644 --- a/secure/usr.bin/ssh-keygen/Makefile +++ b/secure/usr.bin/ssh-keygen/Makefile @@ -1,8 +1,12 @@ # $FreeBSD$ PROG= ssh-keygen +SRCS= ssh-keygen.c CFLAGS+=-I${SSHDIR} -include ssh_namespace.h +# required when linking with a dynamic libssh +SRCS+= roaming_dummy.c + DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz diff --git a/secure/usr.bin/ssh-keyscan/Makefile b/secure/usr.bin/ssh-keyscan/Makefile index f59542e55fb9..8d3f6c6b4e81 100644 --- a/secure/usr.bin/ssh-keyscan/Makefile +++ b/secure/usr.bin/ssh-keyscan/Makefile @@ -1,6 +1,7 @@ # $FreeBSD$ PROG= ssh-keyscan +SRCS= ssh-keyscan.c roaming_dummy.c CFLAGS+=-I${SSHDIR} -include ssh_namespace.h DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} diff --git a/secure/usr.bin/ssh/Makefile b/secure/usr.bin/ssh/Makefile index 11ab8633f645..6944ac5ac29c 100644 --- a/secure/usr.bin/ssh/Makefile +++ b/secure/usr.bin/ssh/Makefile @@ -11,7 +11,10 @@ MLINKS= ssh.1 slogin.1 SRCS= ssh.c readconf.c clientloop.c sshtty.c \ sshconnect.c sshconnect1.c sshconnect2.c mux.c \ - gss-genr.c + roaming_common.c + +# gss-genr.c really belongs in libssh; see src/secure/lib/libssh/Makefile +SRCS+= gss-genr.c DPADD= ${LIBSSH} ${LIBUTIL} ${LIBZ} LDADD= -lssh -lutil -lz diff --git a/secure/usr.sbin/sshd/Makefile b/secure/usr.sbin/sshd/Makefile index 282a40239b0e..d7a37a363123 100644 --- a/secure/usr.sbin/sshd/Makefile +++ b/secure/usr.sbin/sshd/Makefile @@ -15,9 +15,10 @@ SRCS= sshd.c auth-rhosts.c auth-passwd.c auth-rsa.c auth-rh-rsa.c \ auth2-gss.c gss-serv.c gss-serv-krb5.c \ loginrec.c auth-pam.c auth-shadow.c auth-sia.c md5crypt.c \ audit.c audit-bsm.c platform.c sftp-server.c sftp-common.c \ - gss-genr.c + roaming_common.c # gss-genr.c really belongs in libssh; see src/secure/lib/libssh/Makefile +SRCS+= gss-genr.c MAN= sshd.8 sshd_config.5 CFLAGS+=-I${SSHDIR} -include ssh_namespace.h @@ -33,8 +34,8 @@ LDADD+= -lbsm .if ${MK_KERBEROS_SUPPORT} != "no" CFLAGS+= -DGSSAPI -DHAVE_GSSAPI_GSSAPI_H=1 -DHAVE_GSSAPI_GSSAPI_KRB5_H=1 -DKRB5 -DHEIMDAL -DPADD+= ${LIBGSSAPI} ${LIBGSSAPI_KRB5} -LDADD+= -lgssapi -lgssapi_krb5 +DPADD+= ${LIBGSSAPI_KRB5} ${LIBGSSAPI} ${LIBKRB5} ${LIBASN1} +LDADD+= -lgssapi_krb5 -lgssapi -lkrb5 -lasn1 .endif .if defined(X11BASE) diff --git a/share/doc/usd/05.dc/Makefile b/share/doc/usd/05.dc/Makefile new file mode 100644 index 000000000000..2b01e0c0f51a --- /dev/null +++ b/share/doc/usd/05.dc/Makefile @@ -0,0 +1,9 @@ +# @(#)Makefile 8.1 (Berkeley) 6/8/93 +# $FreeBSD$ + +VOLUME= usd/05.dc +SRCS= dc +MACROS= -ms +SRCDIR= ${.CURDIR}/../../../../usr.bin/dc/USD.doc + +.include diff --git a/share/doc/usd/06.bc/Makefile b/share/doc/usd/06.bc/Makefile new file mode 100644 index 000000000000..12dfedde0842 --- /dev/null +++ b/share/doc/usd/06.bc/Makefile @@ -0,0 +1,9 @@ +# @(#)Makefile 8.1 (Berkeley) 6/8/93 +# $FreeBSD$ + +VOLUME= usd/06.bc +SRCS= bc +MACROS= -ms +SRCDIR= ${.CURDIR}/../../../../usr.bin/bc/USD.doc + +.include diff --git a/share/doc/usd/Makefile b/share/doc/usd/Makefile index e7939feb6630..5fcb6b305017 100644 --- a/share/doc/usd/Makefile +++ b/share/doc/usd/Makefile @@ -7,6 +7,8 @@ SUBDIR= title \ contents \ 04.csh \ + 05.dc \ + 06.bc \ 07.mail \ 10.exref \ 11.vitut \ diff --git a/share/examples/Makefile b/share/examples/Makefile index b5e2ab3ac0a4..99d92c0d99a0 100644 --- a/share/examples/Makefile +++ b/share/examples/Makefile @@ -13,6 +13,7 @@ LDIRS= BSD_daemon \ drivers \ etc \ find_interface \ + hast \ ibcs2 \ ipfw \ kld \ @@ -24,13 +25,9 @@ LDIRS= BSD_daemon \ portal \ ppi \ ppp \ - pppd \ printing \ ses \ scsi_target \ - slattach \ - sliplogin \ - startslip \ sunrpc XFILES= BSD_daemon/FreeBSD.pfa \ @@ -73,6 +70,11 @@ XFILES= BSD_daemon/FreeBSD.pfa \ find_interface/Makefile \ find_interface/README \ find_interface/find_interface.c \ + hast/ucarp.sh \ + hast/ucarp_down.sh \ + hast/ucarp_up.sh \ + hast/vip-down.sh \ + hast/vip-up.sh \ ibcs2/README \ ibcs2/hello.uu \ ipfw/change_rules.sh \ @@ -88,6 +90,12 @@ XFILES= BSD_daemon/FreeBSD.pfa \ kld/dyn_sysctl/Makefile \ kld/dyn_sysctl/README \ kld/dyn_sysctl/dyn_sysctl.c \ + kld/firmware/Makefile \ + kld/firmware/README \ + kld/firmware/fwconsumer/Makefile \ + kld/firmware/fwconsumer/fw_consumer.c \ + kld/firmware/fwimage/Makefile \ + kld/firmware/fwimage/firmware.img \ kld/syscall/Makefile \ kld/syscall/module/Makefile \ kld/syscall/module/syscall.c \ @@ -129,16 +137,6 @@ XFILES= BSD_daemon/FreeBSD.pfa \ ppp/ppp.secret.sample \ ppp/ppp.secret.span-isp \ ppp/ppp.secret.span-isp.working \ - pppd/auth-down.sample \ - pppd/auth-up.sample \ - pppd/chap-secrets.sample \ - pppd/chat.sh.sample \ - pppd/ip-down.sample \ - pppd/ip-up.sample \ - pppd/options.sample \ - pppd/pap-secrets.sample \ - pppd/ppp.deny.sample \ - pppd/ppp.shells.sample \ printing/README \ printing/diablo-if-net \ printing/hpdf \ @@ -181,14 +179,6 @@ XFILES= BSD_daemon/FreeBSD.pfa \ scsi_target/scsi_target.h \ scsi_target/scsi_target.8 \ scsi_target/scsi_cmds.c \ - slattach/unit-command.sh \ - sliplogin/slip.hosts \ - sliplogin/slip.login \ - sliplogin/slip.logout \ - sliplogin/slip.slparms \ - startslip/sldown.sh \ - startslip/slip.sh \ - startslip/slup.sh \ sunrpc/Makefile \ sunrpc/dir/Makefile \ sunrpc/dir/dir.x \ diff --git a/share/examples/etc/make.conf b/share/examples/etc/make.conf index 1e08f79c8a9f..631610acf0a2 100644 --- a/share/examples/etc/make.conf +++ b/share/examples/etc/make.conf @@ -36,7 +36,6 @@ # pentium3m pentium3 pentium-m pentium2 # pentiumpro pentium-mmx pentium i486 i386 # (Via CPUs) c3 c3-2 -# Alpha/AXP architecture: ev67 ev6 pca56 ev56 ev5 ev45 ev4 # AMD64 architecture: opteron, athlon64, nocona, prescott, core2 # Intel ia64 architecture: itanium2, itanium # diff --git a/share/examples/hast/ucarp.sh b/share/examples/hast/ucarp.sh new file mode 100755 index 000000000000..6a02c89fe977 --- /dev/null +++ b/share/examples/hast/ucarp.sh @@ -0,0 +1,69 @@ +#!/bin/sh +# +# Copyright (c) 2010 The FreeBSD Foundation +# All rights reserved. +# +# This software was developed by Pawel Jakub Dawidek under sponsorship from +# the FreeBSD Foundation. +# +# 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 AUTHORS 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 AUTHORS 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$ + +# Shared IP address, unused for now. +addr="10.99.0.3" +# Password for UCARP communication. +pass="password" +# First node IP and interface for UCARP communication. +nodea_srcip="10.99.0.1" +nodea_ifnet="bge0" +# Second node IP and interface for UCARP communication. +nodeb_srcip="10.99.0.2" +nodeb_ifnet="em3" + +export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin + +vhid="1" +upscript="/root/hast/sbin/hastd/vip-up.sh" +downscript="/root/hast/sbin/hastd/vip-down.sh" + +ifconfig "${nodea_ifnet}" 2>/dev/null | grep -q "inet ${nodea_srcip} " +if [ $? -eq 0 ]; then + srcip="${nodea_srcip}" + ifnet="${nodea_ifnet}" + node="node A" +fi +ifconfig "${nodeb_ifnet}" 2>/dev/null | grep -q "inet ${nodeb_srcip} " +if [ $? -eq 0 ]; then + if [ -n "${srcip}" -o -n "${ifnet}" ]; then + echo "Unable to determine which node is this (both match)." >/dev/stderr + exit 1 + fi + srcip="${nodeb_srcip}" + ifnet="${nodeb_ifnet}" + node="node B" +fi +if [ -z "${srcip}" -o -z "${ifnet}" ]; then + echo "Unable to determine which node is this (none match)." >/dev/stderr + exit 1 +fi +ucarp -i ${ifnet} -s ${srcip} -v ${vhid} -a ${addr} -p ${pass} -u "${upscript}" -d "${downscript}" diff --git a/share/examples/hast/ucarp_down.sh b/share/examples/hast/ucarp_down.sh new file mode 100755 index 000000000000..a5b34281e3b0 --- /dev/null +++ b/share/examples/hast/ucarp_down.sh @@ -0,0 +1,98 @@ +#!/bin/sh +# +# Copyright (c) 2010 The FreeBSD Foundation +# All rights reserved. +# +# This software was developed by Pawel Jakub Dawidek under sponsorship from +# the FreeBSD Foundation. +# +# 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 AUTHORS 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 AUTHORS 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$ + +# Resource name as defined in /etc/hast.conf. +resource="test" +# Supported file system types: UFS, ZFS +fstype="UFS" +# ZFS pool name. Required only when fstype == ZFS. +pool="test" +# File system mount point. Required only when fstype == UFS. +mountpoint="/mnt/test" +# Name of HAST provider as defined in /etc/hast.conf. +# Required only when fstype == UFS. +device="/dev/hast/${resource}" + +export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin + +# KIll UP script if it still runs in the background. +sig="TERM" +for i in `jot 30`; do + pgid=`pgrep -f ucarp_up.sh | head -1` + [ -n "${pgid}" ] || break + kill -${sig} -- -${pgid} + sig="KILL" + sleep 1 +done +if [ -n "${pgid}" ]; then + logger -p local0.error -t hast "UCARP UP process for resource ${resource} is still running after 30 seconds." + exit 1 +fi +logger -p local0.debug -t hast "UCARP UP is not running." + +case "${fstype}" in +UFS) + mount | egrep -q "^${device} on " + if [ $? -eq 0 ]; then + # Forcibly unmount file system. + out=`umount -f "${mountpoint}" 2>&1` + if [ $? -ne 0 ]; then + logger -p local0.error -t hast "Unable to unmount file system for resource ${resource}: ${out}." + exit 1 + fi + logger -p local0.debug -t hast "File system for resource ${resource} unmounted." + fi + ;; +ZFS) + zpool list | egrep -q "^${pool} " + if [ $? -eq 0 ]; then + # Forcibly export file pool. + out=`zpool export -f "${pool}" 2>&1` + if [ $? -ne 0 ]; then + logger -p local0.error -t hast "Unable to export pool for resource ${resource}: ${out}." + exit 1 + fi + logger -p local0.debug -t hast "ZFS pool for resource ${resource} exported." + fi + ;; +esac + +# Change role to secondary for our resource. +out=`hastctl role secondary "${resource}" 2>&1` +if [ $? -ne 0 ]; then + logger -p local0.error -t hast "Unable to change to role to secondary for resource ${resource}: ${out}." + exit 1 +fi +logger -p local0.debug -t hast "Role for resource ${resource} changed to secondary." + +logger -p local0.info -t hast "Successfully switched to secondary for resource ${resource}." + +exit 0 diff --git a/share/examples/hast/ucarp_up.sh b/share/examples/hast/ucarp_up.sh new file mode 100755 index 000000000000..9e56040bebdc --- /dev/null +++ b/share/examples/hast/ucarp_up.sh @@ -0,0 +1,105 @@ +#!/bin/sh +# +# Copyright (c) 2010 The FreeBSD Foundation +# All rights reserved. +# +# This software was developed by Pawel Jakub Dawidek under sponsorship from +# the FreeBSD Foundation. +# +# 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 AUTHORS 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 AUTHORS 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$ + +# Resource name as defined in /etc/hast.conf. +resource="test" +# Supported file system types: UFS, ZFS +fstype="UFS" +# ZFS pool name. Required only when fstype == ZFS. +pool="test" +# File system mount point. Required only when fstype == UFS. +mountpoint="/mnt/test" +# Name of HAST provider as defined in /etc/hast.conf. +device="/dev/hast/${resource}" + +export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin + +# If there is secondary worker process, it means that remote primary process is +# still running. We have to wait for it to terminate. +for i in `jot 30`; do + pgrep -f "hastd: ${resource} \(secondary\)" >/dev/null 2>&1 || break + sleep 1 +done +if pgrep -f "hastd: ${resource} \(secondary\)" >/dev/null 2>&1; then + logger -p local0.error -t hast "Secondary process for resource ${resource} is still running after 30 seconds." + exit 1 +fi +logger -p local0.debug -t hast "Secondary process in not running." + +# Change role to primary for our resource. +out=`hastctl role primary "${resource}" 2>&1` +if [ $? -ne 0 ]; then + logger -p local0.error -t hast "Unable to change to role to primary for resource ${resource}: ${out}." + exit 1 +fi +# Wait few seconds for provider to appear. +for i in `jot 50`; do + [ -c "${device}" ] && break + sleep 0.1 +done +if [ ! -c "${device}" ]; then + logger -p local0.error -t hast "Device ${device} didn't appear." + exit 1 +fi +logger -p local0.debug -t hast "Role for resource ${resource} changed to primary." + +case "${fstype}" in +UFS) + # Check the file system. + fsck -y -t ufs "${device}" >/dev/null 2>&1 + if [ $? -ne 0 ]; then + logger -p local0.error -t hast "File system check for resource ${resource} failed." + exit 1 + fi + logger -p local0.debug -t hast "File system check for resource ${resource} finished." + # Mount the file system. + out=`mount -t ufs "${device}" "${mountpoint}" 2>&1` + if [ $? -ne 0 ]; then + logger -p local0.error -t hast "File system mount for resource ${resource} failed: ${out}." + exit 1 + fi + logger -p local0.debug -t hast "File system for resource ${resource} mounted." + ;; +ZFS) + # Import ZFS pool. Do it forcibly as it remembers hostid of + # the other cluster node. + out=`zpool import -f "${pool}" 2>&1` + if [ $? -ne 0 ]; then + logger -p local0.error -t hast "ZFS pool import for resource ${resource} failed: ${out}." + exit 1 + fi + logger -p local0.debug -t hast "ZFS pool for resource ${resource} imported." + ;; +esac + +logger -p local0.info -t hast "Successfully switched to primary for resource ${resource}." + +exit 0 diff --git a/share/examples/hast/vip-down.sh b/share/examples/hast/vip-down.sh new file mode 100755 index 000000000000..5e47609d9e9e --- /dev/null +++ b/share/examples/hast/vip-down.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# $FreeBSD$ + +/root/hast/sbin/hastd/ucarp_down.sh +exit 0 diff --git a/share/examples/hast/vip-up.sh b/share/examples/hast/vip-up.sh new file mode 100755 index 000000000000..61dabe9c3daa --- /dev/null +++ b/share/examples/hast/vip-up.sh @@ -0,0 +1,7 @@ +#!/bin/sh +# $FreeBSD$ + +set -m +/root/hast/sbin/hastd/ucarp_up.sh & +set +m +exit 0 diff --git a/share/examples/kld/cdev/test/Makefile b/share/examples/kld/cdev/test/Makefile index 333cdcb8c42a..ad0c0fcd08d0 100644 --- a/share/examples/kld/cdev/test/Makefile +++ b/share/examples/kld/cdev/test/Makefile @@ -68,6 +68,7 @@ # PROG= testcdev NO_MAN= +WARNS?= 5 MODSTAT= /sbin/kldstat diff --git a/share/examples/kld/cdev/test/testcdev.c b/share/examples/kld/cdev/test/testcdev.c index 0a6118103c03..50b5ef89fd36 100644 --- a/share/examples/kld/cdev/test/testcdev.c +++ b/share/examples/kld/cdev/test/testcdev.c @@ -70,13 +70,15 @@ * * $FreeBSD$ */ +#include +#include #include +#include #include #include #include -#include -#include +#include #define CDEV_IOCTL1 _IOR('C', 1, u_int) #define CDEV_DEVICE "cdev" @@ -85,7 +87,7 @@ static char writestr[] = "Hello kernel!"; static char buf[512+1]; int -main(int argc, char *argv[]) +main(int argc __unused, char *argv[] __unused) { int kernel_fd; int one; diff --git a/share/examples/kld/firmware/fwconsumer/fw_consumer.c b/share/examples/kld/firmware/fwconsumer/fw_consumer.c index 97ab99aa0f7a..6a51737846e9 100644 --- a/share/examples/kld/firmware/fwconsumer/fw_consumer.c +++ b/share/examples/kld/firmware/fwconsumer/fw_consumer.c @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include -static struct firmware *fp; +static const struct firmware *fp; static int fw_consumer_modevent(module_t mod, int type, void *unused) diff --git a/share/examples/kld/syscall/test/Makefile b/share/examples/kld/syscall/test/Makefile index 83ad954eb35b..09d535bf686c 100644 --- a/share/examples/kld/syscall/test/Makefile +++ b/share/examples/kld/syscall/test/Makefile @@ -3,5 +3,6 @@ PROG= call NO_MAN= +WARNS?= 5 .include diff --git a/share/examples/kld/syscall/test/call.c b/share/examples/kld/syscall/test/call.c index 9183997821cd..1a97259ca9d2 100644 --- a/share/examples/kld/syscall/test/call.c +++ b/share/examples/kld/syscall/test/call.c @@ -26,24 +26,17 @@ * $FreeBSD$ */ -#include -#include #include #include +#include -static void usage (void); - -static void -usage (void) -{ - fprintf (stderr, "call syscall-number\n"); - exit (1); -} +#include +#include +#include int -main(int argc, char **argv) +main(int argc __unused, char **argv __unused) { - char *endptr; int syscall_num; struct module_stat stat; diff --git a/share/examples/pppd/auth-down.sample b/share/examples/pppd/auth-down.sample deleted file mode 100644 index b2da150dc040..000000000000 --- a/share/examples/pppd/auth-down.sample +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# -# Example for /etc/ppp/auth-down file. - -/usr/bin/logger -p daemon.notice -t pppd "User $2 is logged off" diff --git a/share/examples/pppd/auth-up.sample b/share/examples/pppd/auth-up.sample deleted file mode 100644 index 3d9c07e80344..000000000000 --- a/share/examples/pppd/auth-up.sample +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# -# Example for /etc/ppp/auth-up file. - -/usr/bin/logger -p daemon.notice -t pppd "User $2 is logged in" diff --git a/share/examples/pppd/chap-secrets.sample b/share/examples/pppd/chap-secrets.sample deleted file mode 100644 index 40d5dfdc86e3..000000000000 --- a/share/examples/pppd/chap-secrets.sample +++ /dev/null @@ -1,17 +0,0 @@ -# $FreeBSD$ -# -# Example for /etc/ppp/chap-secrets file. -# -# This file should be owned by root and not readable or -# writable by any other user. -# -# Dialin format: -# -joe server password 192.168.0.0/24 192.168.2.2 -lisa server l1z4 * !192.168.0.1 -mike server secret * -luser server nopass - -# -# Dialout format: -# -jane isp password diff --git a/share/examples/pppd/chat.sh.sample b/share/examples/pppd/chat.sh.sample deleted file mode 100644 index 6418ebfdf6a4..000000000000 --- a/share/examples/pppd/chat.sh.sample +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# -# Example for chat.sh file. - -INIT='at&f' - -dial(){ - /usr/bin/chat -v \ - ABORT "ERROR" \ - ABORT "NO DIALTONE" \ - TIMEOUT 5 \ - "" "AT" \ - "OK" "${INIT}" \ - "OK"-"+++"-"" "ATH" \ - ABORT "BUSY" \ - ABORT "NO ANSWER" \ - ABORT "NO CARRIER" \ - "OK" "ATDP$1" \ - TIMEOUT 70 \ - "ogin:" "username" \ - "word:" "pasword" \ - TIMEOUT 50 \ - "PPP" "\c" - - [ $? -eq 0 ] && exit 0 - - echo "$1 failed" 1>&2 - exit 1 -} - -dial 1234567 diff --git a/share/examples/pppd/ip-down.sample b/share/examples/pppd/ip-down.sample deleted file mode 100644 index 45b8eb45675d..000000000000 --- a/share/examples/pppd/ip-down.sample +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# -# Example for /etc/ppp/ip-down file. - -/usr/bin/logger -p daemon.notice -t pppd "$1 is down" diff --git a/share/examples/pppd/ip-up.sample b/share/examples/pppd/ip-up.sample deleted file mode 100644 index a0fc1b02aaaf..000000000000 --- a/share/examples/pppd/ip-up.sample +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# -# $FreeBSD$ -# -# Example for /etc/ppp/ip-up file. - -/usr/bin/logger -p daemon.notice -t pppd "$1 is up" -/usr/sbin/ntpdate ntpserver diff --git a/share/examples/pppd/options.sample b/share/examples/pppd/options.sample deleted file mode 100644 index fd0a927c57c8..000000000000 --- a/share/examples/pppd/options.sample +++ /dev/null @@ -1,16 +0,0 @@ -# $FreeBSD$ -# -# Example for /etc/ppp/options file. -# -/dev/cuad4 -115200 -modem -crtscts -asyncmap 0 -connect '/etc/ppp/chat.sh' -defaultroute -noipdefault -persist -holdoff 5 -mtu 250 -mru 250 diff --git a/share/examples/pppd/pap-secrets.sample b/share/examples/pppd/pap-secrets.sample deleted file mode 100644 index 8896bdd7a65f..000000000000 --- a/share/examples/pppd/pap-secrets.sample +++ /dev/null @@ -1,17 +0,0 @@ -# $FreeBSD$ -# -# Example for /etc/ppp/pap-secrets file. -# -# This file should be owned by root and not readable or -# writable by any other user. -# -# Dialin format: -# -joe server password 192.168.0.1/24 192.168.2.2 -lisa server l1z4 * !192.168.0.1 -mike server secret * -luser server nopass - -# -# Dialout format: -# -jane isp password diff --git a/share/examples/pppd/ppp.deny.sample b/share/examples/pppd/ppp.deny.sample deleted file mode 100644 index 948e11527cd4..000000000000 --- a/share/examples/pppd/ppp.deny.sample +++ /dev/null @@ -1,27 +0,0 @@ -# $FreeBSD$ -# -# list of users disallowed any pppd access via 'system -# password login'. -# read by pppd(8). -root -toor -daemon -operator -bin -tty -kmem -games -news -man -sshd -smmsp -mailnull -bind -proxy -_pflogd -_dhcp -ftp -uucp -pop -www -nobody diff --git a/share/examples/pppd/ppp.shells.sample b/share/examples/pppd/ppp.shells.sample deleted file mode 100644 index 93b68406c216..000000000000 --- a/share/examples/pppd/ppp.shells.sample +++ /dev/null @@ -1,14 +0,0 @@ -# $FreeBSD$ -# -# List of acceptable shells for pppd(8). -# Pppd will not accept a system password login -# by a user whose shell is not listed below. - -/bin/sh -/bin/csh -/bin/tcsh -/usr/local/bin/ksh -/usr/local/bin/zsh -/usr/local/bin/bash -/usr/local/bin/tcsh -/usr/local/bin/ppplogin.sh diff --git a/share/examples/ses/srcs/chpmon.c b/share/examples/ses/srcs/chpmon.c index 1b537c7ba11e..cb78f062f354 100644 --- a/share/examples/ses/srcs/chpmon.c +++ b/share/examples/ses/srcs/chpmon.c @@ -47,9 +47,7 @@ #define BADSTAT \ (SES_ENCSTAT_UNRECOV|SES_ENCSTAT_CRITICAL|SES_ENCSTAT_NONCRITICAL) int -main(a, v) - int a; - char **v; +main(int a, char **v) { int fd, delay, dev; ses_encstat stat, *carray; diff --git a/share/examples/ses/srcs/eltsub.c b/share/examples/ses/srcs/eltsub.c index 5fae6653d41f..2acf982d2eb0 100644 --- a/share/examples/ses/srcs/eltsub.c +++ b/share/examples/ses/srcs/eltsub.c @@ -38,9 +38,10 @@ #include #include SESINC +#include "eltsub.h" + char * -geteltnm(type) - int type; +geteltnm(int type) { static char rbuf[132]; @@ -116,8 +117,7 @@ geteltnm(type) } static char * -scode2ascii(code) - u_char code; +scode2ascii(u_char code) { static char rbuf[32]; switch (code & 0xf) { @@ -154,9 +154,7 @@ scode2ascii(code) char * -stat2ascii(eletype, cstat) - int eletype; - u_char *cstat; +stat2ascii(int eletype __unused, u_char *cstat) { static char ebuf[256], *scode; diff --git a/share/examples/ses/srcs/eltsub.h b/share/examples/ses/srcs/eltsub.h new file mode 100644 index 000000000000..3d98572352e9 --- /dev/null +++ b/share/examples/ses/srcs/eltsub.h @@ -0,0 +1,36 @@ +/* $FreeBSD$ */ +/* + * Copyright (c) 2000 by Matthew Jacob + * 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, + * without modification, immediately at the beginning of the file. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * the GNU Public License ("GPL"). + * + * 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. + * + * Matthew Jacob + * Feral Software + * mjacob@feral.com + */ + +char * geteltnm(int); +char * stat2ascii(int, u_char *); diff --git a/share/examples/ses/srcs/getencstat.c b/share/examples/ses/srcs/getencstat.c index bf45e576fb72..3514fe4e77cb 100644 --- a/share/examples/ses/srcs/getencstat.c +++ b/share/examples/ses/srcs/getencstat.c @@ -35,17 +35,15 @@ #include #include #include +#include #include #include #include SESINC -extern char *geteltnm __P((int)); -extern char *stat2ascii __P((int, u_char *)); +#include "eltsub.h" int -main(a, v) - int a; - char **v; +main(int a, char **v) { ses_object *objp; ses_objstat ob; diff --git a/share/examples/ses/srcs/getnobj.c b/share/examples/ses/srcs/getnobj.c index 680a6cdbc173..17a26c62bd9d 100644 --- a/share/examples/ses/srcs/getnobj.c +++ b/share/examples/ses/srcs/getnobj.c @@ -41,9 +41,7 @@ #include SESINC int -main(argc, argv) - int argc; - char **argv; +main(int argc, char **argv) { unsigned int nobj; int fd; diff --git a/share/examples/ses/srcs/getobjmap.c b/share/examples/ses/srcs/getobjmap.c index 7f4d1b783745..9798b4c87ba2 100644 --- a/share/examples/ses/srcs/getobjmap.c +++ b/share/examples/ses/srcs/getobjmap.c @@ -39,12 +39,10 @@ #include #include SESINC -extern char *geteltnm __P((int)); +#include "eltsub.h" int -main(a, v) - int a; - char **v; +main(int a, char **v) { ses_object *objp; int nobj, fd, i; diff --git a/share/examples/ses/srcs/getobjstat.c b/share/examples/ses/srcs/getobjstat.c index bf703cf47ff4..99fb1854238b 100644 --- a/share/examples/ses/srcs/getobjstat.c +++ b/share/examples/ses/srcs/getobjstat.c @@ -39,9 +39,7 @@ #include SESINC int -main(a, v) - int a; - char **v; +main(int a, char **v) { int fd; int i; diff --git a/share/examples/ses/srcs/inienc.c b/share/examples/ses/srcs/inienc.c index d6fb262ef7ee..7d6cc220b51f 100644 --- a/share/examples/ses/srcs/inienc.c +++ b/share/examples/ses/srcs/inienc.c @@ -40,9 +40,7 @@ #include SESINC int -main(a, v) - int a; - char **v; +main(int a, char **v) { int fd; diff --git a/share/examples/ses/srcs/sesd.c b/share/examples/ses/srcs/sesd.c index 5262b639bfd4..0793077d2101 100644 --- a/share/examples/ses/srcs/sesd.c +++ b/share/examples/ses/srcs/sesd.c @@ -49,13 +49,11 @@ */ int -main(a, v) - int a; - char **v; +main(int a, char **v) { - static char *usage = + static const char *usage = "usage: %s [ -d ] [ -t pollinterval ] device [ device ]\n"; - int fd, polltime, dev, devbase, nodaemon, bpri; + int fd, polltime, dev, devbase, nodaemon; ses_encstat stat, *carray; if (a < 2) { @@ -115,7 +113,6 @@ main(a, v) for (;;) { for (dev = devbase; dev < a; dev++) { - char buf[128]; fd = open(v[dev], O_RDWR); if (fd < 0) { syslog(LOG_ERR, "%s: %m", v[dev]); diff --git a/share/examples/ses/srcs/setencstat.c b/share/examples/ses/srcs/setencstat.c index 58e0dafc1879..127f68fa4cf5 100644 --- a/share/examples/ses/srcs/setencstat.c +++ b/share/examples/ses/srcs/setencstat.c @@ -40,9 +40,7 @@ #include SESINC int -main(a, v) - int a; - char **v; +main(int a, char **v) { int fd; long val; diff --git a/share/examples/ses/srcs/setobjstat.c b/share/examples/ses/srcs/setobjstat.c index 34e8ea65d97a..08fdb7b48223 100644 --- a/share/examples/ses/srcs/setobjstat.c +++ b/share/examples/ses/srcs/setobjstat.c @@ -40,9 +40,7 @@ #include SESINC int -main(a, v) - int a; - char **v; +main(int a, char **v) { int fd; int i; diff --git a/share/examples/slattach/unit-command.sh b/share/examples/slattach/unit-command.sh deleted file mode 100755 index 9e97ffdcd696..000000000000 --- a/share/examples/slattach/unit-command.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -old_unit=$1 -new_unit=$2 - -if [ $old_unit != -1 ]; then - ifconfig sl$old_unit delete down - if [ $new_unit == -1 ]; then - route delete default - fi -fi - -if [ $new_unit != -1 ]; then - ifconfig sl$new_unit - if [ $old_unit == -1 ]; then - route add default - fi -fi diff --git a/share/examples/sliplogin/slip.hosts b/share/examples/sliplogin/slip.hosts deleted file mode 100644 index b20d7c8b416f..000000000000 --- a/share/examples/sliplogin/slip.hosts +++ /dev/null @@ -1,16 +0,0 @@ -# @(#)slip.hosts 8.1 (Berkeley) 6/6/93 -# -# option(s) consist of the following: (see the sliplogin man page) -# normal - no header compression -# compress - compress headers -# autocomp - compress headers if remote end allows it -# noicmp - disable ICMP packets (such as 'ping' or 'traceroute' packets) -# -#login local-address remote-address netmask option(s) -#------ ---------- ----------- ------- --------- -Schez vangogh chez 0xffffff00 compress -Sjun vangogh 128.32.130.36 0xffffff00 normal -Sleconte vangogh leconte 0xffffff00 compress -Sleeb vangogh leeb 0xffffff00 compress -Smjk vangogh pissaro-sl 0xffffff00 noicmp -Soxford vangogh oxford 0xffffff00 autocomp diff --git a/share/examples/sliplogin/slip.login b/share/examples/sliplogin/slip.login deleted file mode 100644 index 81102280acba..000000000000 --- a/share/examples/sliplogin/slip.login +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -# -# @(#)slip.login 8.1 (Berkeley) 6/6/93 - -# -# generic login file for a slip line. sliplogin invokes this with -# the parameters: -# 1 2 3 4 5 6 7-n -# slipunit ttyspeed loginname local-addr remote-addr mask opt-args -# -# Delete any arp table entries for this site, just in case -/usr/sbin/arp -d $5 -# Bringup the line -/sbin/ifconfig sl$1 inet $4 $5 netmask $6 -# Answer ARP request for the SLIP client with our Ethernet addr -# XXX - Must be filled in with the ethernet address of the local machine -# /usr/sbin/arp -s $5 00:00:c0:50:b9:0a pub -exit diff --git a/share/examples/sliplogin/slip.logout b/share/examples/sliplogin/slip.logout deleted file mode 100644 index b27fe09d0999..000000000000 --- a/share/examples/sliplogin/slip.logout +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -# -# slip.logout - -# -# logout file for a slip line. sliplogin invokes this with -# the parameters: -# 1 2 3 4 5 6 7-n -# slipunit ttyspeed loginname local-addr remote-addr mask opt-args -# -/sbin/ifconfig sl$1 delete -# Remove the ARP table entry for the host -/usr/sbin/arp -d $5 -exit diff --git a/share/examples/sliplogin/slip.slparms b/share/examples/sliplogin/slip.slparms deleted file mode 100644 index a87c7c3cc7ba..000000000000 --- a/share/examples/sliplogin/slip.slparms +++ /dev/null @@ -1,12 +0,0 @@ -# -# Additional SLIP configuration (for all login names). -# Use slip.slparms. for particular login. -# -# Format: -# keepalive [outfill [slunit]] -# (seconds) (seconds) (number) -# -# Default values: -# 0 0 -# -600 300 diff --git a/share/examples/startslip/sldown.sh b/share/examples/startslip/sldown.sh deleted file mode 100755 index 1f342a47b0c9..000000000000 --- a/share/examples/startslip/sldown.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -/sbin/ifconfig $1 $2 -/sbin/route delete default diff --git a/share/examples/startslip/slip.sh b/share/examples/startslip/slip.sh deleted file mode 100755 index 2b4254e88f60..000000000000 --- a/share/examples/startslip/slip.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -# $FreeBSD$ -startslip -b 57600 -U ./slup.sh -D ./sldown.sh \ - -s atd -s atd -s atd \ - -h -t 60 -w 2 -W 20 /dev/cuad1 diff --git a/share/examples/startslip/slup.sh b/share/examples/startslip/slup.sh deleted file mode 100755 index 79cded339558..000000000000 --- a/share/examples/startslip/slup.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -myname= -gateway= -netmask=255.255.255.248 -tune1="link0 -link2" # force headers compression -tune2="mtu 296" # for FreeBSD 1.x host - -case $LINE in - 0) tune=$tune1;; # 1st phone connected - 1) tune=$tune2;; # 2nd phone connected - *) tune=;; # others -esac - -/sbin/ifconfig $1 $2 $tune -/sbin/ifconfig $1 inet $myname $gateway netmask $netmask -/sbin/route add default $gateway diff --git a/share/man/man3/Makefile b/share/man/man3/Makefile index d93a689b50c2..ad176aa946e1 100644 --- a/share/man/man3/Makefile +++ b/share/man/man3/Makefile @@ -155,8 +155,10 @@ MLINKS+= tree.3 RB_EMPTY.3 \ .if ${MK_LIBTHR} != "no" PTHREAD_MAN= pthread.3 \ + pthread_affinity_np.3 \ pthread_atfork.3 \ pthread_attr.3 \ + pthread_attr_affinity_np.3 \ pthread_attr_get_np.3 \ pthread_attr_setcreatesuspend_np.3 \ pthread_barrierattr.3 \ @@ -218,7 +220,9 @@ PTHREAD_MAN= pthread.3 \ pthread_testcancel.3 \ pthread_yield.3 -PTHREAD_MLINKS= pthread_attr.3 pthread_attr_destroy.3 \ +PTHREAD_MLINKS= pthread_affinity_np.3 pthread_getaffinity_np.3 \ + pthread_affinity_np.3 pthread_setaffinity_np.3 +PTHREAD_MLINKS+=pthread_attr.3 pthread_attr_destroy.3 \ pthread_attr.3 pthread_attr_getdetachstate.3 \ pthread_attr.3 pthread_attr_getguardsize.3 \ pthread_attr.3 pthread_attr_getinheritsched.3 \ @@ -238,6 +242,8 @@ PTHREAD_MLINKS= pthread_attr.3 pthread_attr_destroy.3 \ pthread_attr.3 pthread_attr_setstack.3 \ pthread_attr.3 pthread_attr_setstackaddr.3 \ pthread_attr.3 pthread_attr_setstacksize.3 +PTHREAD_MLINKS+=pthread_attr_affinity_np.3 pthread_attr_getaffinity_np.3 \ + pthread_attr_affinity_np.3 pthread_attr_setaffinity_np.3 PTHREAD_MLINKS+=pthread_barrierattr.3 pthread_barrierattr_destroy.3 \ pthread_barrierattr.3 pthread_barrierattr_getpshared.3 \ pthread_barrierattr.3 pthread_barrierattr_init.3 \ diff --git a/share/man/man3/pthread.3 b/share/man/man3/pthread.3 index 5fe2afdb0fa6..caa7f7412e3e 100644 --- a/share/man/man3/pthread.3 +++ b/share/man/man3/pthread.3 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 1, 2009 +.Dd January 8, 2010 .Dt PTHREAD 3 .Os .Sh NAME @@ -478,7 +478,9 @@ functions and the thread functions. Threaded applications are linked with this library. .Sh SEE ALSO .Xr libthr 3 , +.Xr pthread_affinity_np 3 , .Xr pthread_atfork 3 , +.Xr pthread_attr 3 , .Xr pthread_cancel 3 , .Xr pthread_cleanup_pop 3 , .Xr pthread_cleanup_push 3 , diff --git a/share/man/man3/pthread_affinity_np.3 b/share/man/man3/pthread_affinity_np.3 new file mode 100644 index 000000000000..a04ba97b4838 --- /dev/null +++ b/share/man/man3/pthread_affinity_np.3 @@ -0,0 +1,156 @@ +.\"- +.\" Copyright (c) 2010 Xin LI +.\" 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$ +.\" +.Dd January 12, 2010 +.Dt PTHREAD_AFFINITY_NP 3 +.Os +.Sh NAME +.Nm pthread_getaffinity_np , +.Nm pthread_setaffinity_np +.Nd manage CPU affinity +.Sh LIBRARY +.Lb libpthread +.Sh SYNOPSIS +.In pthread_np.h +.Ft int +.Fn pthread_getaffinity_np "pthread_t td" "size_t cpusetsize" "cpuset_t *cpusetp" +.Ft int +.Fn pthread_setaffinity_np "pthread_t td" "size_t cpusetsize" "const cpuset_t *cpusetp" +.Sh DESCRIPTION +.Fn pthread_getaffinity_np +and +.Fn pthread_setaffinity_np +allow the manipulation of sets of CPUs available to the specified thread. +.Pp +Masks of type +.Ft cpuset_t +are composed using the +.Xr CPU_SET 3 +macros. +The kernel tolerates large sets as long as all CPUs specified +in the set exist. +Sets smaller than the kernel uses generate an error on calls to +.Fn pthread_getaffinity_np +even if the result set would fit within the user supplied set. +Calls to +.Fn pthread_setaffinity_np +tolerate small sets with no restrictions. +.Pp +The supplied mask should have a size of +.Fa cpusetsize +bytes. +This size is usually provided by calling +.Li sizeof(cpuset_t) +which is ultimately determined by the value of +.Dv CPU_SETSIZE +as defined in +.In sys/cpuset.h . +.Pp +.Fn pthread_getaffinity_np +retrieves the +mask from the thread specified by +.Fa td , +and stores it in the space provided by +.Fa cpusetp . +.Pp +.Fn pthread_setaffinity_np +attempts to set the mask for the thread specified by +.Fa td +to the value in +.Fa cpusetp . +.Sh RETURN VALUES +If successful, the +.Fn pthread_getaffinity_np +and +.Fn pthread_setaffinity_np +functions will return zero. +Otherwise an error number will be returned +to indicate the error. +.Sh ERRORS +The +.Fn pthread_getaffinity_np +and +.Fn pthread_setaffinity_np +functions may fail if: +.Bl -tag -width Er +.It Bq Er EDEADLK +The +.Fn pthread_setaffinity_np +call would leave a thread without a valid CPU to run on because the set +does not overlap with the thread's anonymous mask. +.It Bq Er EFAULT +The +.Fa cpusetp +pointer passed was invalid. +.It Bq Er ESRCH +The thread specified by the +.Fa td +argument could not be found. +.It Bq Er ERANGE +The +.Fa cpusetsize +was either preposterously large or smaller than the kernel set size. +.It Bq Er EPERM +The calling thread did not have the credentials required to complete the +operation. +.El +.Sh SEE ALSO +.Xr cpuset 1 , +.Xr cpuset 2 , +.Xr cpuset_getid 2 , +.Xr cpuset_setid 2 , +.Xr CPU_SET 3 , +.Xr pthread 3 , +.Xr pthread_attr_get_affinity_np 3 , +.Xr pthread_attr_set_affinity_np 3 +.Sh STANDARDS +The +.Nm pthread_getaffinity_np +and +.Nm pthread_setaffinity_np +functions are non-standard +.Fx +extensions and may be not available on other operating systems. +.Sh HISTORY +The +.Nm pthread_getaffinity_np +and +.Nm pthread_setaffinity_np +function first appeared in +.Fx 7.2 . +.Sh AUTHORS +.An -nosplit +The +.Nm pthread_getaffinity_np +and +.Nm pthread_setaffinity_np +functions were written by +.An David Xu +.Aq davidxu@FreeBSD.org , +and this manpage was written by +.An Xin LI +.Aq delphij@FreeBSD.org . diff --git a/share/man/man3/pthread_attr.3 b/share/man/man3/pthread_attr.3 index 3253b176cf0b..a99d32d626cc 100644 --- a/share/man/man3/pthread_attr.3 +++ b/share/man/man3/pthread_attr.3 @@ -26,7 +26,7 @@ .\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" $FreeBSD$ -.Dd April 28, 2000 +.Dd January 8, 2010 .Dt PTHREAD_ATTR 3 .Os .Sh NAME @@ -209,9 +209,9 @@ Invalid or unsupported value for .El .Sh SEE ALSO .Xr pthread_attr_get_np 3 , +.Xr pthread_attr_affinity_np 3 , .Xr pthread_create 3 .Sh STANDARDS -The .Fn pthread_attr_init , .Fn pthread_attr_destroy , .Fn pthread_attr_setstacksize , diff --git a/share/man/man3/pthread_attr_affinity_np.3 b/share/man/man3/pthread_attr_affinity_np.3 new file mode 100644 index 000000000000..c61f69988fb7 --- /dev/null +++ b/share/man/man3/pthread_attr_affinity_np.3 @@ -0,0 +1,152 @@ +.\"- +.\" Copyright (c) 2010 Xin LI +.\" 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$ +.\" +.Dd January 8, 2010 +.Dt PTHREAD_ATTR_AFFINITY_NP 3 +.Os +.Sh NAME +.Nm pthread_attr_getaffinity_np , +.Nm pthread_attr_setaffinity_np +.Nd manage CPU affinity in thread attribute objects +.Sh LIBRARY +.Lb libpthread +.Sh SYNOPSIS +.In pthread_np.h +.Ft int +.Fn pthread_attr_getaffinity_np "const pthread_attr_t *pattr" "size_t cpusetsize" "cpuset_t *cpusetp" +.Ft int +.Fn pthread_attr_setaffinity_np "pthread_attr_t *pattr" "size_t cpusetsize" "const cpuset_t *cpusetp" +.Sh DESCRIPTION +The +.Fn pthread_attr_getaffinity_np +and +.Fn pthread_attr_setaffinity_np +functions allow the manipulation of sets of CPUs available to the specified thread attribute object. +.Pp +Masks of type +.Ft cpuset_t +are composed using the +.Xr CPU_SET 3 +macros. +The kernel tolerates large sets as long as all CPUs specified +in the set exist. +Sets smaller than the kernel uses generate an error on calls to +.Fn pthread_attr_getaffinity_np +even if the result set would fit within the user supplied set. +Calls to +.Fn pthread_attr_setaffinity_np +tolerate small sets with no restrictions. +.Pp +The supplied mask should have a size of +.Fa cpusetsize +bytes. +This size is usually provided by calling +.Li sizeof(cpuset_t) +which is ultimately determined by the value of +.Dv CPU_SETSIZE +as defined in +.In sys/cpuset.h . +.Pp +.Fn pthread_attr_getaffinity_np +retrieves the +mask from the thread attribute object specified by +.Fa pattr , +and stores it in the space provided by +.Fa cpusetp . +.Pp +.Fn pthread_attr_setaffinity_np +sets the mask for the thread attribute object specified by +.Fa pattr +to the value in +.Fa cpusetp . +.Sh RETURN VALUES +If successful, the +.Fn pthread_attr_getaffinity_np +and +.Fn pthread_attr_setaffinity_np +functions will return zero. +Otherwise an error number will be returned +to indicate the error. +.Sh ERRORS +The +.Fn pthread_attr_getaffinity_np +and +.Fn pthread_attr_setaffinity_np +functions will fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The +.Fa pattr +or the attribute specified by it is +.Dv NULL . +.El +.Pp +The +.Fn pthread_attr_setaffinity_np +function will fail if: +.Bl -tag -width Er +.It Bq Er EINVAL +The +.Fa pattr +or the attribute specified by it is +.Dv NULL . +.It Bq Er ENOMEM +Insufficient memory exists to store the cpuset mask. +.El +.Sh SEE ALSO +.Xr cpuset 1 , +.Xr cpuset 2 , +.Xr cpuset_getid 2 , +.Xr cpuset_setid 2 , +.Xr CPU_SET 3 , +.Xr pthread_get_affinity_np 3 , +.Xr pthread_set_affinity_np 3 +.Sh STANDARDS +The +.Nm pthread_attr_getaffinity_np +and +.Nm pthread_attr_setaffinity_np +functions are non-standard +.Fx +extensions and may be not available on other operating systems. +.Sh HISTORY +The +.Nm pthread_attr_getaffinity_np +and +.Nm pthread_attr_setaffinity_np +functions first appeared in +.Fx 7.2 . +.Sh AUTHORS +.An -nosplit +The +.Nm pthread_attr_getaffinity_np +and +.Nm pthread_attr_setaffinity_np +functions were written by +.An David Xu Aq davidxu@FreeBSD.org , +and this manpage was written by +.An Xin LI Aq delphij@FreeBSD.org . diff --git a/share/man/man3/pthread_join.3 b/share/man/man3/pthread_join.3 index 1aa593222b4c..b01069a6b612 100644 --- a/share/man/man3/pthread_join.3 +++ b/share/man/man3/pthread_join.3 @@ -30,11 +30,12 @@ .\" .\" $FreeBSD$ .\" -.Dd April 4, 1996 +.Dd January 23, 2010 .Dt PTHREAD_JOIN 3 .Os .Sh NAME -.Nm pthread_join +.Nm pthread_join , +.Nm pthread_timedjoin_np .Nd wait for thread termination .Sh LIBRARY .Lb libpthread @@ -42,6 +43,8 @@ .In pthread.h .Ft int .Fn pthread_join "pthread_t thread" "void **value_ptr" +.Ft int +.Fn pthread_timedjoin_np "pthread_t thread" "void **value_ptr" "const struct timespec *abstime" .Sh DESCRIPTION The .Fn pthread_join @@ -70,18 +73,30 @@ If the thread calling .Fn pthread_join is cancelled, then the target thread is not detached. .Pp +The +.Fn pthread_timedjoin_np +function is equivalent to the +.Fn pthread_join +function except it will return +.Er ETIMEDOUT +if target thread does not exit before specified absolute time passes. +.Pp A thread that has exited but remains unjoined counts against [_POSIX_THREAD_THREADS_MAX]. .Sh RETURN VALUES If successful, the .Fn pthread_join -function will return zero. +and +.Fn pthread_timedjoin_np +functions will return zero. Otherwise an error number will be returned to indicate the error. .Sh ERRORS The .Fn pthread_join -function will fail if: +and +.Fn pthread_timedjoin_np +functions will fail if: .Bl -tag -width Er .It Bq Er EINVAL The implementation has detected that the value specified by @@ -95,6 +110,19 @@ thread ID, A deadlock was detected or the value of .Fa thread specifies the calling thread. +.It Bq Er EOPNOTSUPP +The implementation detected that another caller is already waiting on +.Fa thread . +.El +.Pp +Additionally, the +.Fn pthread_join +function will fail if: +.Bl -tag -width Er +.It Bq Er ETIMEDOUT +The specified absolute time passed while +.Fn pthread_timedjoin_np +waited for thread exit. .El .Sh SEE ALSO .Xr wait 2 , @@ -104,3 +132,9 @@ The .Fn pthread_join function conforms to .St -p1003.1-96 . +The +.Fn pthread_timedjoin_np +is +.Fx +extension, first appeared in +.Fx 6.1 . diff --git a/share/man/man3/queue.3 b/share/man/man3/queue.3 index 763ae42ed8da..234da6801715 100644 --- a/share/man/man3/queue.3 +++ b/share/man/man3/queue.3 @@ -233,7 +233,7 @@ O(1) removal of any entry in the list. However: .Bl -enum -compact -offset indent .It -Each elements requires two pointers rather than one. +Each element requires two pointers rather than one. .It Code size and execution time of operations (except for removal) is about twice that of the singly-linked data-structures. diff --git a/share/man/man3/sysexits.3 b/share/man/man3/sysexits.3 index b7c006a1390a..4661c9d90178 100644 --- a/share/man/man3/sysexits.3 +++ b/share/man/man3/sysexits.3 @@ -97,7 +97,7 @@ does not exist in the passwd file. .It Sy EX_OSFILE Pq 72 Some system file (e.g., .Pa /etc/passwd , -.Pa /var/run/utmp , +.Pa /var/run/utx.active , etc.) does not exist, cannot be opened, or has some sort of error (e.g., syntax error). .It Sy EX_CANTCREAT Pq 73 diff --git a/share/man/man3/tree.3 b/share/man/man3/tree.3 index aa53eb134c73..46efbbba305c 100644 --- a/share/man/man3/tree.3 +++ b/share/man/man3/tree.3 @@ -384,7 +384,7 @@ macros, but should be used only once. Finally, the .Fa CMP -argument is the name of a function used to compare tree noded +argument is the name of a function used to compare tree nodes with each other. The function takes two arguments of type .Vt "struct TYPE *" . diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index 74d0c3d8b1d1..4c499847a026 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -15,6 +15,7 @@ MAN= aac.4 \ ${_acpi_toshiba.4} \ acpi_video.4 \ ${_acpi_wmi.4} \ + ada.4 \ adv.4 \ adw.4 \ ae.4 \ @@ -28,10 +29,13 @@ MAN= aac.4 \ aio.4 \ alc.4 \ ale.4 \ + alpm.4 \ altq.4 \ amd.4 \ - ${_amdtemp.4} \ + amdpm.4 \ + ${_amdsbwd.4} \ ${_amdsmb.4} \ + ${_amdtemp.4} \ amr.4 \ an.4 \ arcmsr.4 \ @@ -44,6 +48,7 @@ MAN= aac.4 \ ath_hal.4 \ atkbd.4 \ atkbdc.4 \ + ${_atp.4} \ audit.4 \ auditpipe.4 \ aue.4 \ @@ -57,6 +62,7 @@ MAN= aac.4 \ bridge.4 \ bt.4 \ bwi.4 \ + bwn.4 \ cardbus.4 \ carp.4 \ cas.4 \ @@ -117,6 +123,7 @@ MAN= aac.4 \ geom_linux_lvm.4 \ geom_uzip.4 \ gif.4 \ + gpib.4 \ gre.4 \ harp.4 \ hatm.4 \ @@ -153,10 +160,12 @@ MAN= aac.4 \ ips.4 \ ipsec.4 \ ipw.4 \ + ipwfw.4 \ iscsi_initiator.4 \ isp.4 \ ispfw.4 \ iwi.4 \ + iwifw.4 \ iwn.4 \ iwnfw.4 \ ixgb.4 \ @@ -193,11 +202,13 @@ MAN= aac.4 \ mac_stub.4 \ mac_test.4 \ malo.4 \ + mcd.4 \ md.4 \ mem.4 \ meteor.4 \ mfi.4 \ miibus.4 \ + mk48txx.4 \ mld.4 \ mlx.4 \ mly.4 \ @@ -286,16 +297,20 @@ MAN= aac.4 \ nsp.4 \ null.4 \ ${_nve.4} \ + ${_nvram.4} \ ${_nxge.4} \ ohci.4 \ orm.4 \ + ${_padlock.4} \ pass.4 \ patm.4 \ pccard.4 \ pccbb.4 \ + pcf.4 \ pci.4 \ pcib.4 \ pcic.4 \ + pcii.4 \ pcm.4 \ pcn.4 \ pim.4 \ @@ -319,11 +334,13 @@ MAN= aac.4 \ rp.4 \ rue.4 \ rum.4 \ + run.4 \ sa.4 \ safe.4 \ sbp.4 \ sbp_targ.4 \ scc.4 \ + scd.4 \ sched_4bsd.4 \ sched_ule.4 \ screen.4 \ @@ -334,6 +351,7 @@ MAN= aac.4 \ ses.4 \ sf.4 \ si.4 \ + siba.4 \ sio.4 \ siis.4 \ sis.4 \ @@ -393,6 +411,7 @@ MAN= aac.4 \ textdump.4 \ ti.4 \ tl.4 \ + tnt4882.4 \ trm.4 \ tty.4 \ tun.4 \ @@ -420,6 +439,7 @@ MAN= aac.4 \ ugen.4 \ uhci.4 \ uhid.4 \ + uhso.4 \ uipaq.4 \ ukbd.4 \ ulpt.4 \ @@ -440,6 +460,7 @@ MAN= aac.4 \ uvscom.4 \ vga.4 \ vge.4 \ + viapm.4 \ vinum.4 \ vkbd.4 \ vlan.4 \ @@ -608,9 +629,11 @@ _acpi_panasonic.4=acpi_panasonic.4 _acpi_sony.4= acpi_sony.4 _acpi_toshiba.4=acpi_toshiba.4 _acpi_wmi.4= acpi_wmi.4 +_amdsbwd.4= amdsbwd.4 _amdsmb.4= amdsmb.4 _amdtemp.4= amdtemp.4 _asmc.4= asmc.4 +_atp.4= atp.4 _coretemp.4= coretemp.4 _cpuctl.4= cpuctl.4 _dpms.4= dpms.4 @@ -632,7 +655,9 @@ _ndis.4= ndis.4 _nfe.4= nfe.4 _nfsmb.4= nfsmb.4 _nve.4= nve.4 +_nvram.4= nvram.4 _nxge.4= nxge.4 +_padlock.4= padlock.4 _rr232x.4= rr232x.4 _speaker.4= speaker.4 _spkr.4= spkr.4 @@ -642,6 +667,10 @@ _wpi.4= wpi.4 MLINKS+=lindev.4 full.4 .endif +.if ${MACHINE_ARCH} == "powerpc" +_atp.4= atp.4 +.endif + .if exists(${.CURDIR}/man4.${MACHINE_ARCH}) SUBDIR= man4.${MACHINE_ARCH} .endif diff --git a/share/man/man4/acpi.4 b/share/man/man4/acpi.4 index ed97c9855a83..a1fef87748a9 100644 --- a/share/man/man4/acpi.4 +++ b/share/man/man4/acpi.4 @@ -559,7 +559,7 @@ ACPI is only found and supported on i386/ia32, ia64, and amd64. .%A "Toshiba Corporation" .%D August 25, 2003 .%T "Advanced Configuration and Power Interface Specification" -.%O http://acpi.info/spec.htm +.%U http://acpi.info/spec.htm .Re .Sh AUTHORS .An -nosplit diff --git a/share/man/man4/acpi_asus.4 b/share/man/man4/acpi_asus.4 index a966d7effa70..f3b99daf5227 100644 --- a/share/man/man4/acpi_asus.4 +++ b/share/man/man4/acpi_asus.4 @@ -25,8 +25,8 @@ .\" .\" $FreeBSD$ .\" -.Dd December 17, 2008 -.Dt ACPI_ASUS 4 i386 +.Dd February 8, 2010 +.Dt ACPI_ASUS 4 .Os .Sh NAME .Nm acpi_asus @@ -162,7 +162,7 @@ which is parsed at boot-time. .Xr sysctl 8 .Rs .%T The acpi4asus Project -.%O http://sourceforge.net/projects/acpi4asus/ +.%U http://sourceforge.net/projects/acpi4asus/ .Re .Sh HISTORY The diff --git a/share/man/man4/acpi_fujitsu.4 b/share/man/man4/acpi_fujitsu.4 index 1959bf6a52c1..ef72fee4ba00 100644 --- a/share/man/man4/acpi_fujitsu.4 +++ b/share/man/man4/acpi_fujitsu.4 @@ -25,8 +25,8 @@ .\" .\" $FreeBSD$ .\" -.Dd March 20, 2005 -.Dt ACPI_FUJITSU 4 i386 +.Dd February 8, 2010 +.Dt ACPI_FUJITSU 4 .Os .Sh NAME .Nm acpi_fujitsu diff --git a/share/man/man4/acpi_hp.4 b/share/man/man4/acpi_hp.4 index 02a0a8d7f7dd..94828d71b0c2 100644 --- a/share/man/man4/acpi_hp.4 +++ b/share/man/man4/acpi_hp.4 @@ -24,8 +24,8 @@ .\" .\" $FreeBSD$ .\" -.Dd June 30, 2009 -.Dt ACPI_HP 4 i386 +.Dd February 8, 2010 +.Dt ACPI_HP 4 .Os .Sh NAME .Nm acpi_hp @@ -256,7 +256,7 @@ sysctl dev.acpi_hp.0.cmi_detail=7 The .Nm device driver first appeared in -.Fx CURRENT . +.Fx 8.0 . .Sh AUTHORS .An -nosplit The @@ -279,7 +279,7 @@ http://www.microsoft.com/whdc/system/pnppwr/wmi/wmi-acpi.mspx This manual page was written by .An Michael Gmelin Aq freebsd@grem.de .Sh BUGS -This driver is experimental and has only been tested on CURRENT i386 on an +This driver is experimental and has only been tested on i386 on an HP Compaq 8510p which featured all supported wireless devices (WWAN/BT/WLAN). Expect undefined results when operating on different hardware. .Pp diff --git a/share/man/man4/acpi_ibm.4 b/share/man/man4/acpi_ibm.4 index f0c165d1aeb3..376b64d109c1 100644 --- a/share/man/man4/acpi_ibm.4 +++ b/share/man/man4/acpi_ibm.4 @@ -25,8 +25,8 @@ .\" .\" $FreeBSD$ .\" -.Dd January 14, 2006 -.Dt ACPI_IBM 4 i386 +.Dd February 8, 2010 +.Dt ACPI_IBM 4 .Os .Sh NAME .Nm acpi_ibm diff --git a/share/man/man4/acpi_panasonic.4 b/share/man/man4/acpi_panasonic.4 index 5d8c86ae353a..4bd7038e3ac1 100644 --- a/share/man/man4/acpi_panasonic.4 +++ b/share/man/man4/acpi_panasonic.4 @@ -25,8 +25,8 @@ .\" .\" $FreeBSD$ .\" -.Dd September 17, 2009 -.Dt ACPI_PANASONIC 4 i386 +.Dd February 8, 2010 +.Dt ACPI_PANASONIC 4 .Os .Sh NAME .Nm acpi_panasonic diff --git a/share/man/man4/acpi_sony.4 b/share/man/man4/acpi_sony.4 index 52a7fbe2fd9b..f0fb0e0835f1 100644 --- a/share/man/man4/acpi_sony.4 +++ b/share/man/man4/acpi_sony.4 @@ -24,8 +24,8 @@ .\" .\" $FreeBSD$ .\" -.Dd September 14, 2005 -.Dt ACPI_SONY 4 i386 +.Dd February 8, 2010 +.Dt ACPI_SONY 4 .Os .Sh NAME .Nm acpi_sony @@ -48,15 +48,24 @@ acpi_sony_load="YES" The .Nm driver provides support for the notebook controller in Sony laptops. +Note that not all features will work on all laptop models. .Sh SYSCTLS -The following sysctl is currently implemented: +The following sysctl nodes are currently implemented: .Bl -tag -width indent .It Va dev.acpi_sony.0.brightness Current brightness level of the display. +.It Va dev.acpi_sony.0.brightness_default +Default brightness level of the display (survives reboot). +.It Va dev.acpi_sony.0.contrast +Current contrast level of the display. +.It Va dev.acpi_sony.0.bass_gain +Enable or disable the Bass Gain feature. .It Va dev.acpi_sony.0.cdp Turns the CD power on or off. .It Va dev.acpi_sony.0.azp Turns the audio power on or off. +.It Va dev.acpi_sony.0.lnp +Turns the wired network interface power on or off. .El .Sh SEE ALSO .Xr acpi 4 , diff --git a/share/man/man4/acpi_toshiba.4 b/share/man/man4/acpi_toshiba.4 index cb26842566a9..134ecc8d302d 100644 --- a/share/man/man4/acpi_toshiba.4 +++ b/share/man/man4/acpi_toshiba.4 @@ -25,8 +25,8 @@ .\" .\" $FreeBSD$ .\" -.Dd February 19, 2004 -.Dt ACPI_TOSHIBA 4 i386 +.Dd February 8, 2010 +.Dt ACPI_TOSHIBA 4 .Os .Sh NAME .Nm acpi_toshiba diff --git a/share/man/man4/acpi_wmi.4 b/share/man/man4/acpi_wmi.4 index d9bcbd4bd8a5..cc61527a1dc0 100644 --- a/share/man/man4/acpi_wmi.4 +++ b/share/man/man4/acpi_wmi.4 @@ -24,8 +24,8 @@ .\" .\" $FreeBSD$ .\" -.Dd June 30, 2009 -.Dt ACPI_WMI 4 i386 +.Dd February 8, 2010 +.Dt ACPI_WMI 4 .Os .Sh NAME .Nm acpi_wmi @@ -79,7 +79,7 @@ GUID INST EXPE METH STR EVENT OID The .Nm device driver first appeared in -.Fx CURRENT . +.Fx 8.0 . .Sh AUTHORS .An -nosplit The diff --git a/share/man/man4/ada.4 b/share/man/man4/ada.4 new file mode 100644 index 000000000000..65cd53fc699f --- /dev/null +++ b/share/man/man4/ada.4 @@ -0,0 +1,138 @@ +.\" Copyright (c) 2009 Alexander Motin +.\" 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$ +.\" +.Dd November 19, 2009 +.Dt ADA 4 +.Os +.Sh NAME +.Nm ada +.Nd ATA Direct Access device driver +.Sh SYNOPSIS +.Cd device ada +.Sh DESCRIPTION +The +.Nm +driver provides support for direct access devices, implementing the +.Tn ATA +command protocol, that are attached to the system through a host adapter +supported by the CAM subsystem. +.Pp +The host adapter must also be separately configured into the system before an +.Tn ATA +direct access device can be configured. +.Sh COMMAND QUEUING +Command queueing allows the device to process multiple transactions +concurrently, often re-ordering them to reduce the number and length of +seeks. +.Tn ATA +defines two types of queueing: +.Tn TCQ (Tagged Command Queueing, PATA legacy) +and +.Tn NCQ (Native Command Queueing, SATA) . +The +.Nm +device driver takes full advantage of NCQ, when supported. +To ensure that transactions to distant parts of the media, +which may be deferred indefinitely by servicing requests closer to the current +head position, are completed in a timely fashion, an ordered +transaction is sent every 7 seconds during continuous device operation. +.Sh CACHE EFFECTS +Many direct access devices are equipped with read and/or write caches. +Parameters affecting the device's cache are reported in device IDENTIFY data +and can be examined and modified via the +.Xr camcontrol 8 +utility. +.Pp +The read cache is used to store data from device-initiated read ahead +operations as well as frequently used data. +The read cache is transparent +to the user and can be enabled without any adverse effect. +Most devices +with a read cache come from the factory with it enabled. +.Pp +The write cache can greatly decrease the latency of write operations +and allows the device to reorganize writes to increase efficiency and +performance. +This performance gain comes at a price. +Should the device +lose power while its cache contains uncommitted write operations, these +writes will be lost. +The effect of a loss of write transactions on +a file system is non-deterministic and can cause corruption. +Most +devices age write transactions to limit the vulnerability to a few transactions +recently reported as complete, but it is nonetheless recommended that +systems with write cache enabled devices reside on an Uninterruptible +Power Supply (UPS). +The +.Nm +device driver ensures that the cache and media are synchronized upon +final close of the device or an unexpected shutdown (panic) event. +This ensures that it is safe to disconnect power once the operating system +has reported that it has halted. +.Sh SYSCTL VARIABLES +The following variables are available as both +.Xr sysctl 8 +variables and +.Xr loader 8 +tunables: +.Bl -tag -width 12 +.It kern.cam.ada.retry_count +.Pp +This variable determines how many times the +.Nm +driver will retry a READ or WRITE command. +This does not affect the number of retries used during probe time or for +the +.Nm +driver dump routine. +This value currently defaults to 4. +.It kern.cam.ada.default_timeout +.Pp +This variable determines how long the +.Nm +driver will wait before timing out an outstanding command. +The units for this value are seconds, and the default is currently 30 +seconds. +.El +.Sh FILES +.Bl -tag -width ".Pa /dev/ada*" -compact +.It Pa /dev/ada* +ATA device nodes +.El +.Sh SEE ALSO +.Xr ad 4 , +.Xr ahci 4 , +.Xr da 4 , +.Xr siis 4 +.Sh HISTORY +The +.Nm +driver first appeared in +.Fx 8.0 . +.Sh AUTHORS +.An Alexander Motin Aq mav@FreeBSD.org diff --git a/share/man/man4/ahci.4 b/share/man/man4/ahci.4 index 46660d3a2739..675bab65bf69 100644 --- a/share/man/man4/ahci.4 +++ b/share/man/man4/ahci.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 24, 2009 +.Dd January 28, 2010 .Dt AHCI 4 .Os .Sh NAME @@ -48,9 +48,10 @@ module at boot time, place the following line in ahci_load="YES" .Ed .Pp -The following tunables are settable from the loader: +The following tunables are settable from the +.Xr loader 8 : .Bl -ohang -.It Va hint.ahci.X.msi +.It Va hint.ahci. Ns Ar X Ns Va .msi controls Message Signaled Interrupts (MSI) usage by the specified controller .Bl -tag -compact .It 0 @@ -60,15 +61,15 @@ single MSI vector used, if supported (default); .It 2 multiple MSI vectors used, if supported; .El -.It Va hint.ahci.X.ccc +.It Va hint.ahci. Ns Ar X Ns Va .ccc controls Command Completion Coalescing (CCC) usage by the specified controller. Non-zero value enables CCC and defines maximum time (in ms), request can wait for interrupt, if there are some more requests present on controller queue. CCC reduces number of context switches on systems with many parallel requests, but it can decrease disk performance on some workloads due to additional command latency. -.It Va hint.ahcich.X.pm_level -controls SATA interface Power Management for specified channel, +.It Va hint.ahcich. Ns Ar X Ns Va .pm_level +controls SATA interface Power Management for the specified channel, allowing some power to be saved at the cost of additional command latency. Possible values: @@ -92,18 +93,20 @@ Because of artificial entering latency, performance degradation in modes .Pp Note that interface Power Management is not compatible with device presence detection. -You will have to reset bus manually on device hot-plug. -.It Va hint.ahcich.X.sata_rev +A manual bus reset is needed on device hot-plug. +.It Va hint.ahcich. Ns Ar X Ns Va .sata_rev setting to nonzero value limits maximum SATA revision (speed). Values 1, 2 and 3 are respectively 1.5, 3 and 6Gbps. .El .Sh DESCRIPTION -This driver provides the CAM subsystem with native access to the +This driver provides the +.Xr CAM 4 +subsystem with native access to the .Tn SATA ports of AHCI-compatible controllers. Each SATA port found is represented to CAM as a separate bus with one target, or, if HBA supports Port Multipliers, 16 targets. -Most of the bus-management details are handled by the SATA-specific +Most of the bus-management details are handled by the SATA-specific transport of CAM. Connected ATA disks are handled by the ATA protocol disk peripheral driver .Xr ada 4 . @@ -114,30 +117,32 @@ ATAPI devices are handled by the SCSI protocol peripheral drivers etc. .Pp Driver features include support for Serial ATA and ATAPI devices, -Port Multipliers, hardware command queues (up to 32 commands per port), +Port Multipliers (including FIS-based switching, when supported), +hardware command queues (up to 32 commands per port), Native Command Queuing, SATA interface Power Management, device hot-plug and Message Signaled Interrupts. .Pp -The Port Multiplier FIS Based Switching feature added in the AHCI 1.2 -specification, which is required for effective parallel operation of devices -behind Port Multipliers, is not yet supported. -.Pp AHCI hardware is also supported by ataahci driver from .Xr ata 4 -subsystem. If both drivers are loaded at the same time, this one will be +subsystem. +If both drivers are loaded at the same time, this one will be given precedence as the more functional of the two. .Sh HARDWARE The .Nm driver supports AHCI compatible controllers having PCI class 1 (mass storage), subclass 6 (SATA) and programming interface 1 (AHCI). +.Pp +Also, in cooperation with atamarvell and atajmicron drivers of ata(4), +it supports AHCI part of legacy-PATA + AHCI-SATA combined controllers, +such as JMicron JMB36x and Marvell 88SX61xx. .Sh SEE ALSO .Xr ada 4 , +.Xr ata 4 , .Xr cd 4 , .Xr da 4 , .Xr sa 4 , -.Xr scsi 4 , -.Xr ata 4 +.Xr scsi 4 .Sh HISTORY The .Nm diff --git a/share/man/man4/man4.i386/alpm.4 b/share/man/man4/alpm.4 similarity index 99% rename from share/man/man4/man4.i386/alpm.4 rename to share/man/man4/alpm.4 index f288b72c42f9..43ee4596178e 100644 --- a/share/man/man4/man4.i386/alpm.4 +++ b/share/man/man4/alpm.4 @@ -25,7 +25,7 @@ .\" $FreeBSD$ .\" .Dd February 13, 1999 -.Dt ALPM 4 i386 +.Dt ALPM 4 .Os .Sh NAME .Nm alpm diff --git a/share/man/man4/man4.i386/amdpm.4 b/share/man/man4/amdpm.4 similarity index 99% rename from share/man/man4/man4.i386/amdpm.4 rename to share/man/man4/amdpm.4 index f8937b314ae8..f791a28ba283 100644 --- a/share/man/man4/man4.i386/amdpm.4 +++ b/share/man/man4/amdpm.4 @@ -26,7 +26,7 @@ .\" $FreeBSD$ .\" .Dd December 31, 2005 -.Dt AMDPM 4 i386 +.Dt AMDPM 4 .Os .Sh NAME .Nm amdpm diff --git a/share/man/man4/amdsbwd.4 b/share/man/man4/amdsbwd.4 new file mode 100644 index 000000000000..370cfa8220c0 --- /dev/null +++ b/share/man/man4/amdsbwd.4 @@ -0,0 +1,72 @@ +.\"- +.\" Copyright (c) 2009 Andriy Gapon +.\" 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$ +.\" +.Dd November 30, 2009 +.Dt AMDSBWD 4 +.Os +.Sh NAME +.Nm amdsbwd +.Nd device driver for the AMD SB600/SB700/SB710/SB750 watchdog timer +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device amdsbwd" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +amdsbwd_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides +.Xr watchdog 4 +support for the watchdog timers present on +AMD SB600 and SB7xx south bridge chips. +.Sh SEE ALSO +.Xr watchdog 4 , +.Xr watchdog 8 , +.Xr watchdogd 8 , +.Xr watchdog 9 +.Sh HISTORY +The +.Nm +driver first appeared in +.Fx 9.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Andiry Gapon Aq avg@FreeBSD.org . +This manual page was written by +.An Andiry Gapon Aq avg@FreeBSD.org . diff --git a/share/man/man4/ata.4 b/share/man/man4/ata.4 index a4cdfee29dca..303e63291bb5 100644 --- a/share/man/man4/ata.4 +++ b/share/man/man4/ata.4 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 24, 2009 +.Dd November 23, 2009 .Dt ATA 4 .Os .Sh NAME @@ -129,7 +129,7 @@ M5229, M5281, M5287, M5288, M5289. .It AMD: AMD756, AMD766, AMD768, AMD8111, CS5536. .It ATI: -IXP200, IXP300, IXP400. +IXP200, IXP300, IXP400, IXP600, IXP700, IXP800. .It CMD: CMD646, CMD646U2, CMD648, CMD649. .It Cypress: @@ -145,13 +145,15 @@ IT8211F, IT8212F, IT8213F. .It JMicron: JMB360, JMB361, JMB363, JMB365, JMB366, JMB368. .It Marvell -88SX5040, 88SX5041, 88SX5080, 88SX5081, 88SX6041, 88SX6081, 88SX6101, 88SX6141. +88SX5040, 88SX5041, 88SX5080, 88SX5081, 88SX6041, 88SX6042, 88SX6081, 88SX6101, +88SX6102, 88SX6111, 88SX6121, 88SX6141, 88SX6145, 88SX7042. .It National: SC1100. .It NetCell: NC3000, NC5000. .It nVidia: -nForce, nForce2, nForce2 MCP, nForce3, nForce3 MCP, nForce3 Pro, nForce4. +nForce, nForce2, nForce2 MCP, nForce3, nForce3 MCP, nForce3 Pro, nForce4, +MCP51, MCP55, MCP61, MCP65, MCP67, MCP73, MCP77, MCP79, MCP89. .It Promise: PDC20246, PDC20262, PDC20263, PDC20265, PDC20267, PDC20268, PDC20269, PDC20270, PDC20271, PDC20275, PDC20276, PDC20277, PDC20318, PDC20319, PDC20371, PDC20375, PDC20376, PDC20377, PDC20378, PDC20379, PDC20571, PDC20575, PDC20579, PDC20580, PDC20617, PDC20618, PDC20619, PDC20620, PDC20621, PDC20622, PDC40518, PDC40519, PDC40718, PDC40719. .It ServerWorks: diff --git a/share/man/man4/atapicam.4 b/share/man/man4/atapicam.4 index 830a4dd3e56a..5f083d017e71 100644 --- a/share/man/man4/atapicam.4 +++ b/share/man/man4/atapicam.4 @@ -27,14 +27,28 @@ .\" .\" $FreeBSD$ .\" -.Dd October 23, 2002 +.Dd October 22, 2009 .Dt ATAPICAM 4 .Os .Sh NAME .Nm atapicam .Nd CAM XPT (transport) module for ATAPI devices .Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device scbus" +.Cd "device ata" .Cd "device atapicam" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +atapicam_load="YES" +.Ed .Sh DESCRIPTION The ATAPI/CAM module allows ATAPI devices (CD-ROM, CD-RW, DVD drives, floppy drives such as Iomega Zip, tape drives) to be accessed through diff --git a/share/man/man4/ath.4 b/share/man/man4/ath.4 index cfc256c84d83..c2344cba4195 100644 --- a/share/man/man4/ath.4 +++ b/share/man/man4/ath.4 @@ -249,7 +249,7 @@ This should not happen. An invalid transmit rate was specified for an outgoing frame. The frame is discarded. This should not happen. -.It "ath%d: ath_chan_set: unable to reset channel %u (%u Mhz)" +.It "ath%d: ath_chan_set: unable to reset channel %u (%u MHz)" The Atheros Hardware Access Layer was unable to reset the hardware when switching channels during scanning. This should not happen. diff --git a/share/man/man4/atp.4 b/share/man/man4/atp.4 new file mode 100644 index 000000000000..670080253b01 --- /dev/null +++ b/share/man/man4/atp.4 @@ -0,0 +1,180 @@ +.\" Copyright (c) 2009 Rohit Grover . +.\" 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. +.\" 3. Neither the name of the author nor the names of any co-contributors +.\" may 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. +.\" +.\" $FreeBSD$ +.\" +.Dd November 12, 2009 +.Dt ATP 4 +.Os +.Sh NAME +.Nm atp +.Nd Apple touchpad driver +.Sh SYNOPSIS +To compile this driver into the kernel, place the following lines into +your kernel configuration file: +.Bd -ragged -offset indent +.Cd "device atp" +.Cd "device usb" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +atp_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for the Apple Internal Trackpad +device found in many Apple laptops. +.Pp +The driver simulates a three\-button mouse using multi\-finger tap +detection. +. +A single\-finger tap generates a left button click; +two\-finger tap maps to the middle button; whereas a three\-finger tap +gets treated as a right button click. +. +A double\-tap followed by a drag is treated as a selection gesture; a +virtual left\-button click is assumed for the lifespan of the drag. +. +.Nm +attempts to filter away activity at the horizontal edges of the +trackpad\-\-this is to keep unintentional palm movement from being +considered as user input. +. +.Pp +.Nm +supports dynamic reconfiguration using +.Xr sysctl 8 ; +through nodes under +.Nm hw.usb.atp . +Pointer sensitivity can be controlled using the sysctl tunable +.Nm hw.usb.atp.scale_factor . +. +.Sh HARDWARE +The +.Nm +driver provides support for the following Product IDs: +.Pp +.Bl -bullet -compact +.It +Core Duo MacBook & MacBook Pro (IDs: 0x0217, 0x0218, 0x0219) +.It +Core2 Duo MacBook & MacBook Pro (IDs: 0x021a, 0x021b, 0x021c) +.It +Core2 Duo MacBook3,1 (IDs: 0x0229, 0x022a, 0x022b) +.It +12 inch PowerBook and iBook (IDs: 0x030a, 0x030b) +.It +15 inch PowerBook (IDs: 0x020e, 0x020f, 0x0215) +.It +17 inch PowerBook (ID: 0x020d) +.El +.Pp +To discover the product\-id of a touchpad, search for 'Trackpad' in the +output of +.Xr lshal 1 +and look up the property +.Nm usb_device.product_id . +.Sh FILES +.Nm +creates a blocking pseudo\-device file, +.Pa /dev/atp0 , +which presents the mouse as a +.Ar sysmouse +or +.Ar mousesystems +type device\-\-see +.Xr moused 8 +for an explanation of these mouse +types. +.Xr moused 8 +can be configured to read touchpad data from +.Pa /dev/atp0 +and pass it along to the +.Xr sysmouse 4 +driver so that any process wanting to utilize mouse operation (such as +an X server) may fetch it from +.Pa /dev/sysmouse ; +alternatively, +.Pa /dev/atp0 +may be manipulated via +.Xr read 2 +and +.Xr ioctl 2 +calls to get mouse data directly. +.Sh EXAMPLES +To use a compatible Apple Trackpad as your console mouse: +.Pp +.Dl moused -p /dev/atp0 -t auto +.Pp +To launch +.Xr moused 8 +automatically upon boot, add the following to +.Pa /etc/rc.conf : +.Pp +.Dl moused_enable="YES" +.Dl moused_type="auto" +.Dl moused_port="/dev/atp0" +.Pp +If you want +.Xr moused 8 +to also probe for external USB mice or other devices, then add the +following to +.Pa /etc/rc.conf : +.Pp +.Dl moused_nondefault_enable="YES" +.Dl moused_ums0_enable="YES" +.Dl moused_ums1_enable="YES" +.Pp +To be able to use the trackpad under X, change the "Pointer" section in +.Nm xorg.conf +to the following: +.Pp +.Dl Device "/dev/atp0" +.Dl Protocol "Auto" +.Pp +Better still, if you want to be able to use the mouse in both virtual +consoles as well as in X change it to: +.Pp +.Dl Device "/dev/sysmouse" +.Dl Protocol "Auto" +.Sh SEE ALSO +.Xr sysmouse 4 , +.Xr usb 4 , +.Xr loader.conf 5 , +.Xr xorg.conf 5 Pq Pa ports/x11/xorg , +.Xr moused 8 , +.Xr sysctl 8 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Rohit Grover Aq rgrover1@gmail.com diff --git a/share/man/man4/aue.4 b/share/man/man4/aue.4 index fdb5fb5e4429..3737f2449586 100644 --- a/share/man/man4/aue.4 +++ b/share/man/man4/aue.4 @@ -193,7 +193,7 @@ The driver failed to allocate an mbuf for the receiver ring. .Xr ifconfig 8 .Rs .%T ADMtek AN986 data sheet -.%O http://www.admtek.com.tw +.%U http://www.admtek.com.tw .Re .Sh HISTORY The diff --git a/share/man/man4/axe.4 b/share/man/man4/axe.4 index b33112692e28..f3c0c753a66c 100644 --- a/share/man/man4/axe.4 +++ b/share/man/man4/axe.4 @@ -199,7 +199,7 @@ The driver failed to allocate an mbuf for the receiver ring. .Xr ifconfig 8 .Rs .%T "ASIX AX88172 AX88178 and AX88772 data sheets" -.%O http://www.asix.com.tw +.%U http://www.asix.com.tw .Re .Sh HISTORY The diff --git a/share/man/man4/bce.4 b/share/man/man4/bce.4 index 41c9fe9202a0..0bca57b3d2fe 100644 --- a/share/man/man4/bce.4 +++ b/share/man/man4/bce.4 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 7, 2009 +.Dd October 7, 2009 .Dt BCE 4 .Os .Sh NAME @@ -165,6 +165,8 @@ Dell PowerEdge 1950 integrated BCM5708 NIC .It Dell PowerEdge 2950 integrated BCM5708 NIC .It +Dell PowerEdge R710 integrated BCM5709 NIC +.It HP NC370F Multifunction Gigabit Server Adapter .It HP NC370T Multifunction Gigabit Server Adapter diff --git a/share/man/man4/bge.4 b/share/man/man4/bge.4 index d4cc265237b7..45c7156cbc60 100644 --- a/share/man/man4/bge.4 +++ b/share/man/man4/bge.4 @@ -31,12 +31,12 @@ .\" .\" $FreeBSD$ .\" -.Dd May 19, 2009 +.Dd October 7, 2009 .Dt BGE 4 .Os .Sh NAME .Nm bge -.Nd "Broadcom BCM570x/5714/5721/5722/5750/5751/5752/5789 PCI Gigabit Ethernet adapter driver" +.Nd "Broadcom BCM570x/5714/5721/5722/5750/5751/5752/5761/5784/5789/57780 PCI Gigabit Ethernet adapter driver" .Sh SYNOPSIS To compile this driver into the kernel, place the following lines in your @@ -56,8 +56,8 @@ if_bge_load="YES" The .Nm driver provides support for various NICs based on the Broadcom BCM570x, -5714, 5721, 5722, 5750, 5751, 5752 and 5789 families of Gigabit Ethernet -controller chips. +5714, 5721, 5722, 5750, 5751, 5752, 5761, 5784, 5789 and 57780 families +of Gigabit Ethernet controller chips. .Pp All of these NICs are capable of 10, 100 and 1000Mbps speeds over CAT5 copper cable, except for the SysKonnect SK-9D41 which supports only diff --git a/share/man/man4/bridge.4 b/share/man/man4/bridge.4 index a31891a0cdbb..7d45356b974f 100644 --- a/share/man/man4/bridge.4 +++ b/share/man/man4/bridge.4 @@ -35,7 +35,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 8, 2009 +.Dd January 9, 2010 .Dt IF_BRIDGE 4 .Os .Sh NAME @@ -111,7 +111,7 @@ by-default. A bridge can be used to provide several services, such as a simple 802.11-to-Ethernet bridge for wireless hosts, and traffic isolation. .Pp -A bridge works like a hub, forwarding traffic from one interface +A bridge works like a switch, forwarding traffic from one interface to another. Multicast and broadcast packets are always forwarded to all interfaces that are part of the bridge. diff --git a/share/man/man4/bwn.4 b/share/man/man4/bwn.4 new file mode 100644 index 000000000000..1293c36ca1fc --- /dev/null +++ b/share/man/man4/bwn.4 @@ -0,0 +1,136 @@ +.\" Copyright (c) 2009 Christian Brueffer +.\" 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$ +.\" +.Dd February 25, 2010 +.Dt BWN 4 +.Os +.Sh NAME +.Nm bwn +.Nd Broadcom BCM43xx IEEE 802.11b/g wireless network driver +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device siba_bwn" +.Cd "device bwn" +.Cd "device wlan" +.Cd "device wlan_amrr" +.Cd "device firmware" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +if_bwn_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for Broadcom BCM43xx based +PCI/CardBus network adapters. +.Pp +It supports +.Cm station +and +.Cm monitor +mode operation. +Only one virtual interface may be configured at any time. +For more information on configuring this device, see +.Xr ifconfig 8 . +.Pp +This driver requires firmware to be loaded before it will work. +The +.Pa ports/net/bwn-firmware-kmod +port needs to be installed before +.Xr ifconfig 8 +will work. +Most cases you need to use bwn_v4_ucode module but if you are a +LP (low power) PHY user please uses bwn_v4_lp_ucode module. +.Sh HARDWARE +The +.Nm +driver supports Broadcom BCM43xx based wireless devices, including: +.Pp +.Bl -column -compact "Apple Airport Extreme" "BCM4306" "Mini PCI" "a/b/g" -offset 6n +.It Em "Card Chip Bus Standard" +.It "Apple Airport Extreme BCM4306 PCI b/g" +.It "Apple Airport Extreme BCM4318 PCI b/g" +.It "ASUS WL-138g BCM4318 PCI b/g" +.It "Buffalo WLI-CB-G54S BCM4318 CardBus b/g" +.It "Buffalo WLI-PCI-G54S BCM4306 PCI b/g" +.It "Compaq R4035 onboard BCM4306 PCI b/g" +.It "Dell Wireless 1470 BCM4318 Mini PCI b/g" +.It "Dell Truemobile 1400 BCM4309 Mini PCI b/g" +.It "HP nx6125 BCM4319 PCI b/g" +.It "Linksys WPC54G Ver 3 BCM4318 CardBus b/g" +.It "Linksys WPC54GS Ver 2 BCM4318 CardBus b/g" +.It "TRENDnet TEW-401PCplus BCM4306 CardBus b/g" +.It "US Robotics 5411 BCM4318 CardBus b/g" +.El +.Sh EXAMPLES +Join an existing BSS network (i.e., connect to an access point): +.Pp +.Bd -literal -offset indent +ifconfig wlan create wlandev bwn0 inet 192.168.0.20 \e + netmask 0xffffff00 +.Ed +.Pp +Join a specific BSS network with network name +.Dq Li my_net : +.Pp +.Dl "ifconfig wlan create wlandev bwn0 ssid my_net up" +.Pp +Join a specific BSS network with 64-bit WEP encryption: +.Bd -literal -offset indent +ifconfig wlan create wlandev bwn0 ssid my_net \e + wepmode on wepkey 0x1234567890 weptxkey 1 up +.Ed +.Sh SEE ALSO +.Xr arp 4 , +.Xr cardbus 4 , +.Xr intro 4 , +.Xr pci 4 , +.Xr wlan 4 , +.Xr wlan_amrr 4 , +.Xr ifconfig 8 , +.Xr wpa_supplicant 8 +.Sh HISTORY +The +.Nm +driver first appeared in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Weongyo Jeong +.Aq weongyo@FreeBSD.org . +.\".Sh BUGS +.\"Some card based on the BCM4306 and BCM4309 chips do not work properly +.\"on channel 1, 2 and 3. diff --git a/share/man/man4/carp.4 b/share/man/man4/carp.4 index 8333b4a08849..a985fb8a9d83 100644 --- a/share/man/man4/carp.4 +++ b/share/man/man4/carp.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 6, 2006 +.Dd January 5, 2010 .Dt CARP 4 .Os .Sh NAME @@ -118,12 +118,12 @@ See also the first example. Disabled by default. .It Va net.inet.carp.log Value of 0 disables any logging. -Value of 1 enables logging of bad -.Nm -packets. -Values above 1 enable logging state changes of +Value of 1 enables logging state changes of .Nm interfaces. +Values above 1 enable logging of bad +.Nm +packets. Default value is 1. .It Va net.inet.carp.arpbalance Balance local traffic using ARP (see below). diff --git a/share/man/man4/cdce.4 b/share/man/man4/cdce.4 index d284425857ba..e055e1b96f62 100644 --- a/share/man/man4/cdce.4 +++ b/share/man/man4/cdce.4 @@ -120,11 +120,11 @@ is running low on mbufs. .Xr ifconfig 8 .Rs .%T "Universal Serial Bus Class Definitions for Communication Devices" -.%O http://www.usb.org/developers/devclass_docs/usbcdc11.pdf +.%U http://www.usb.org/developers/devclass_docs/usbcdc11.pdf .Re .Rs .%T "Data sheet Prolific PL-2501 Host-to-Host Bridge/Network Controller" -.%O http://tech.prolific.com.tw/visitor/fcabdl.asp?fid=20679530 +.%U http://tech.prolific.com.tw/visitor/fcabdl.asp?fid=20679530 .Re .Sh HISTORY The diff --git a/share/man/man4/cpufreq.4 b/share/man/man4/cpufreq.4 index aa1da043fc42..bd6885eb4f5b 100644 --- a/share/man/man4/cpufreq.4 +++ b/share/man/man4/cpufreq.4 @@ -234,7 +234,7 @@ The driver should set unknown or irrelevant values to All the following elements for each setting should be returned: .Bd -literal struct cf_setting { - int freq; /* CPU clock in Mhz or 100ths of a percent. */ + int freq; /* CPU clock in MHz or 100ths of a percent. */ int volts; /* Voltage in mV. */ int power; /* Power consumed in mW. */ int lat; /* Transition latency in us. */ diff --git a/share/man/man4/dc.4 b/share/man/man4/dc.4 index 351624544286..fa77a8441220 100644 --- a/share/man/man4/dc.4 +++ b/share/man/man4/dc.4 @@ -351,27 +351,27 @@ the card should be configured correctly. .Xr ifconfig 8 .Rs .%T ADMtek AL981, AL983 and AL985 data sheets -.%O http://www.admtek.com.tw +.%U http://www.admtek.com.tw .Re .Rs .%T ASIX Electronics AX88140A and AX88141 data sheets -.%O http://www.asix.com.tw +.%U http://www.asix.com.tw .Re .Rs .%T Davicom DM9102 data sheet -.%O http://www.davicom8.com +.%U http://www.davicom8.com .Re .Rs .%T Intel 21143 Hardware Reference Manual -.%O http://developer.intel.com +.%U http://developer.intel.com .Re .Rs .%T Macronix 98713/A, 98715/A and 98725 data sheets -.%O http://www.macronix.com +.%U http://www.macronix.com .Re .Rs .%T Macronix 98713/A and 98715/A app notes -.%O http://www.macronix.com +.%U http://www.macronix.com .Re .Sh HISTORY The diff --git a/share/man/man4/de.4 b/share/man/man4/de.4 index eeca37665f4a..28287ef3c116 100644 --- a/share/man/man4/de.4 +++ b/share/man/man4/de.4 @@ -88,7 +88,7 @@ setup utility and are not changeable. .Pp Use the .Xr ifconfig 8 -command an in particular the +command and in particular the .Fl m flag to list the supported media types for your particular card. .Pp diff --git a/share/man/man4/epair.4 b/share/man/man4/epair.4 index 8b4d1401dec4..715fffe26f9b 100644 --- a/share/man/man4/epair.4 +++ b/share/man/man4/epair.4 @@ -104,7 +104,7 @@ support on top of it. .Xr bpf 4 , .Xr if_bridge 4 , .Xr vlan 4 , -.Xr loader.conf 5, +.Xr loader.conf 5 , .Xr rc.conf 5 , .Xr ifconfig 8 .Sh HISTORY diff --git a/share/man/man4/faith.4 b/share/man/man4/faith.4 index 3f13cd662554..b98ba3945604 100644 --- a/share/man/man4/faith.4 +++ b/share/man/man4/faith.4 @@ -58,15 +58,15 @@ variable in .Xr rc.conf 5 . .Pp Special action will be taken when IPv6 TCP traffic is seen on a router, -and routing table suggests to route it to +and the routing table suggests to route it to the .Nm interface. In this case, the packet will be accepted by the router, -regardless of list of IPv6 interface addresses assigned to the router. -The packet will be captured by an IPv6 TCP socket, if it has +regardless of the list of IPv6 interface addresses assigned to the router. +The packet will be captured by an IPv6 TCP socket, if it has the .Dv IN6P_FAITH -flag turned on and it has matching address/port pairs. -In result, +flag turned on and matching address/port pairs. +As a result, .Nm will let you capture IPv6 TCP traffic to some specific destination addresses. Userland programs, such as @@ -79,43 +79,42 @@ and perform application-specific address mapping to relay IPv6 TCP to IPv4 TCP. .Pp The .Dv IN6P_FAITH -flag on IPv6 TCP socket can be set by using +flag on a IPv6 TCP socket can be set by using .Xr setsockopt 2 , -with level equals to +with level .Dv IPPROTO_IPV6 -and optname equals to +and optname .Dv IPv6_FAITH . .Pp -To handle error reports by ICMPv6, some of ICMPv6 packets routed to +To handle error reports by ICMPv6, some ICMPv6 packets routed to an .Nm interface will be delivered to IPv6 TCP, as well. .Pp To understand how .Nm -can be used, take a look at source code of +can be used, take a look at the source code of .Xr faithd 8 . .Pp -As +As the .Nm -interface implements potentially dangerous operation, -great care must be taken when configuring -.Nm -interface. -To avoid possible misuse, +interface implements potentially dangerous operations, +great care must be taken when configuring it. +To avoid possible misuse, the .Xr sysctl 8 variable .Li net.inet6.ip6.keepfaith must be set to .Li 1 -prior to the use of the interface. +prior to using the interface. When .Li net.inet6.ip6.keepfaith is .Li 0 , -no packet will be captured by +no packets will be captured by the .Nm interface. .Pp +The .Nm interface is intended to be used on routers, not on hosts. .\" @@ -130,5 +129,5 @@ interface is intended to be used on routers, not on hosts. .%O RFC3142 .Re .Sh HISTORY -The FAITH IPv6-to-IPv4 TCP relay translator was first appeared in +The FAITH IPv6-to-IPv4 TCP relay translator first appeared in the WIDE hydrangea IPv6 stack. diff --git a/share/man/man4/gem.4 b/share/man/man4/gem.4 index 1a6ea4bec0f0..314d95f81d05 100644 --- a/share/man/man4/gem.4 +++ b/share/man/man4/gem.4 @@ -33,7 +33,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 14, 2009 +.Dd December 25, 2009 .Dt GEM 4 .Os .Sh NAME @@ -150,7 +150,7 @@ by .Aq tmm@FreeBSD.org and later on improved by .An Marius Strobl -.Aq marus@FreeBSD.org . +.Aq marius@FreeBSD.org . The man page was written by .An Thomas Klausner .Aq wiz@NetBSD.org . diff --git a/share/man/man4/gif.4 b/share/man/man4/gif.4 index a70db083b6c8..43605dfa7fdf 100644 --- a/share/man/man4/gif.4 +++ b/share/man/man4/gif.4 @@ -198,7 +198,7 @@ to 1. .%B RFC2893 .%T Transition Mechanisms for IPv6 Hosts and Routers .%D August 2000 -.%O ftp://ftp.isi.edu/in-notes/rfc2893.txt +.%U ftp://ftp.isi.edu/in-notes/rfc2893.txt .Re .Rs .%A Sally Floyd diff --git a/share/man/man4/gpib.4 b/share/man/man4/gpib.4 new file mode 100644 index 000000000000..6e0f341c9608 --- /dev/null +++ b/share/man/man4/gpib.4 @@ -0,0 +1,100 @@ +.\" Copyright (c) 2010, Joerg Wunsch +.\" 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$ +.\" +.Dd January 24, 2010 +.Dt GPIB 4 +.Os +.Sh NAME +.Nm gpib +.Nd General-Purpose Instrument Bus (GPIB) driver +.Sh SYNOPSIS +Either of the +.Xr pcii 4 +or +.Xr tnt4882 4 +drivers use this driver as the backend. +.Sh DESCRIPTION +The +.Nm +driver provides support for driving an IEEE-488 bus, also called +IEC-625 (or just "IEC bus"), or HP-IB (Hewlett Packard Instrument +Bus), or GPIB (General Purpose Instrument Bus). +The device can become either a listener, talker, controller, and +in particular a master controller on the bus. +.Ss Example +The following example code queries the device provided as +.Va argv[1] +for its identification response. +.Bd -literal +/* compile with: cc -O -o ibtest ibtest.c -lgpib */ + +#include +#include +#include +#include + +#include + +int +main(int argc, char **argv) +{ + int dmm; + unsigned char buf[100]; + char vbuf[sizeof buf * 4]; + + /* DVM */ + dmm = ibdev(0, (argc > 1? atoi(argv[1]): 7), 0, + T10s, 1, 0); + if (dmm < 0) + errx(1, "ibdev = %d\\n", dmm); + ibwrt(dmm, "*IDN?\\r\\n", 7); + ibrd(dmm, buf, sizeof buf - 1); + strvisx(vbuf, buf, ibcnt, VIS_WHITE | VIS_CSTYLE); + printf("%s\\n", vbuf); + return (0); +} +.Ed +.Sh FILES +.Bl -tag -width /dev/gpibNNib +.It Pa /dev/gpib Ns Em N Ns "ib" +Main device node to access the driver. +.It Pa /dev/gpib Ns Em N Ns "l" +Listen-only entry to the driver. +When opening, an instrument can send data to this device on the +bus in an unaddressed mode, for example hard-copy printer data. +.El +.Sh SEE ALSO +.Xr gpib 3 , +.Xr pcii 4 , +.Xr tnt4882 4 +.Sh HISTORY +The +.Nm +driver was written by Poul-Henning Kamp, and first appeared in +.Fx 5.4 . +.Sh AUTHORS +This manual page was written by +.An J\(:org Wunsch . diff --git a/share/man/man4/hifn.4 b/share/man/man4/hifn.4 index 9aeccfaf5f3d..02b8e32b4432 100644 --- a/share/man/man4/hifn.4 +++ b/share/man/man4/hifn.4 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 1, 2006 +.Dd October 19, 2009 .Dt HIFN 4 .Os .Sh NAME @@ -85,17 +85,11 @@ Came as 128KB SRAM model, or 2MB DRAM model. .It Hifn 7751 Reference board with 512KB SRAM. .It PowerCrypt -See -.Pa http://www.powercrypt.com/ . Comes with 512KB SRAM. .It XL-Crypt -See -.Pa http://www.powercrypt.com/ . Only board based on 7811 (which is faster than 7751 and has a random number generator). .It NetSec 7751 -See -.Pa http://www.netsec.net/ . Supports the most IPsec sessions, with 1MB SRAM. .It Soekris Engineering vpn1201 and vpn1211 See diff --git a/share/man/man4/hme.4 b/share/man/man4/hme.4 index 24be9bfcc44c..47a27c9b6f10 100644 --- a/share/man/man4/hme.4 +++ b/share/man/man4/hme.4 @@ -139,7 +139,7 @@ except the single-port SBus versions. .%T "STP2002QFP Fast Ethernet, Parallel Port, SCSI (FEPS) User's Guide" .%D April 1996 .%A Sun Microelectronics -.%O http://mediacast.sun.com/users/Barton808/media/STP2002QFP-FEPs_UG.pdf +.%U http://mediacast.sun.com/users/Barton808/media/STP2002QFP-FEPs_UG.pdf .Re .Sh HISTORY The diff --git a/share/man/man4/hptrr.4 b/share/man/man4/hptrr.4 index 24943445ce59..847d86db7c02 100644 --- a/share/man/man4/hptrr.4 +++ b/share/man/man4/hptrr.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 14, 2007 +.Dd November 8, 2009 .Dt HPTRR 4 .Os .Sh NAME @@ -46,6 +46,14 @@ module at boot time, place the following line in .Bd -literal -offset indent hptrr_load="YES" .Ed +.Pp +The following tunables are settable from the loader: +.Bl -ohang +.It Va hw.hptrr.attach_generic +set to 0 to deny driver attach to chips with generic Marvell (non-HighPoint) +PCI identification. These chips are also supported by ata(4). +Some vendors are using same chips, but without providing RAID BIOS. +.El .Sh DESCRIPTION The .Nm @@ -101,6 +109,7 @@ manual page for details on support. .Pp This driver supersedes the older rr232x driver. .Sh SEE ALSO +.Xr ata 4 , .Xr cam 4 , .Xr hptmv 4 , .Xr loader 8 diff --git a/share/man/man4/ichwd.4 b/share/man/man4/ichwd.4 index f9998dcddfc9..497712c7c5de 100644 --- a/share/man/man4/ichwd.4 +++ b/share/man/man4/ichwd.4 @@ -66,7 +66,7 @@ it believes the WDT is disabled. .Sh SEE ALSO .Xr watchdog 4 , .Xr watchdog 8 , -.Xr watchdogd 8, +.Xr watchdogd 8 , .Xr watchdog 9 .Rs .%T Using the Intel ICH Family Watchdog Timer (WDT) diff --git a/share/man/man4/ifmib.4 b/share/man/man4/ifmib.4 index 3cffbeab1816..3d12a96bea07 100644 --- a/share/man/man4/ifmib.4 +++ b/share/man/man4/ifmib.4 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 15, 1996 +.Dd October 28, 2009 .Dt IFMIB 4 .Os .Sh NAME @@ -165,12 +165,6 @@ interfaces, the structure is called and implements a superset of the .Tn "RFC 1650" MIB for Ethernet-like networks. -.\" This will eventually be defined in an ethermib(4) page. -For -.Dv IFT_SLIP , -the structure is a -.Dq Li struct sl_softc -.Pq In net/if_slvar.h . .Sh SEE ALSO .Xr sysctl 3 , .Xr intro 4 , diff --git a/share/man/man4/io.4 b/share/man/man4/io.4 index 15c0c4d4170c..a54b9fd3a574 100644 --- a/share/man/man4/io.4 +++ b/share/man/man4/io.4 @@ -27,8 +27,8 @@ .\" .\" $FreeBSD$ .\" -.Dd October 3, 2004 -.Dt IO 4 i386 +.Dd February 8, 2010 +.Dt IO 4 .Os .Sh NAME .Nm io diff --git a/share/man/man4/ipsec.4 b/share/man/man4/ipsec.4 index 47ccdb1082b5..112fadb95220 100644 --- a/share/man/man4/ipsec.4 +++ b/share/man/man4/ipsec.4 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 23, 2009 +.Dd November 29, 2009 .Dt IPSEC 4 .Os .Sh NAME @@ -215,7 +215,7 @@ To selectively enable/disable protocols, use .It Sy "Name Default" .It "net.inet.esp.esp_enable On" .It "net.inet.ah.ah_enable On" -.It "net.inet.ipcomp.ipcomp_enable Off" +.It "net.inet.ipcomp.ipcomp_enable On" .El .Pp In addition the following variables are accessible via @@ -408,6 +408,8 @@ size may alleviate this problem. .Pp The .Tn IPcomp -protocol support is currently broken. +protocol may occasionally error because of +.Xr zlib 3 +problems. .Pp This documentation needs more review. diff --git a/share/man/man4/ipwfw.4 b/share/man/man4/ipwfw.4 new file mode 100644 index 000000000000..b901de8c0ee3 --- /dev/null +++ b/share/man/man4/ipwfw.4 @@ -0,0 +1,75 @@ +.\" Copyright (c) 2009 Sam Leffler, Errno Consulting +.\" 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. 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 ``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 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$ +.\" +.Dd January 14, 2010 +.Dt IPWFW 4 +.Os +.Sh NAME +.Nm ipwfw +.Nd "Firmware Module for Intel PRO/Wireless 2100 driver" +.Sh SYNOPSIS +To compile this module into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device ipwfw" +.Ed +.Pp +This will include three firmware images inside the kernel. +If you want to pick only the firmware image for the mode you want to operate +your network adapter in choose one of the following: +.Bd -ragged -offset indent +.Cd "device ipwbssfw" +.Cd "device ipwibssfw" +.Cd "device ipwmonitorfw" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following lines in +.Xr loader.conf 5 : +.Bd -literal -offset indent +ipw_bss_load="YES" +ipw_ibss_load="YES" +ipw_monitor_load="YES" +.Ed +.Sh DESCRIPTION +This module provides access to firmware sets for the +Intel PRO/Wireless 2100 series of IEEE 802.11 adapters. +It may be statically linked into the kernel, or loaded as a module. +.Pp +For the loaded firmware to be enabled for use the license at +.Pa /usr/share/doc/legal/intel_ipw/LICENSE +must be agreed to by adding the following line to +.Xr loader.conf 5 : +.Pp +.Dl "legal.intel_ipw.license_ack=1" +.Sh FILES +.Bl -tag -width ".Pa /usr/share/doc/legal/intel_ipw/LICENSE" -compact +.It Pa /usr/share/doc/legal/intel_ipw/LICENSE +.Nm +firmware license +.El +.Sh SEE ALSO +.Xr ipw 4 , +.Xr firmware 9 diff --git a/share/man/man4/iwifw.4 b/share/man/man4/iwifw.4 new file mode 100644 index 000000000000..7effd3db7170 --- /dev/null +++ b/share/man/man4/iwifw.4 @@ -0,0 +1,75 @@ +.\" Copyright (c) 2009 Sam Leffler, Errno Consulting +.\" 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. 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 ``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 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$ +.\" +.Dd January 14, 2010 +.Dt IWIFW 4 +.Os +.Sh NAME +.Nm iwifw +.Nd "Firmware Module for Intel PRO/Wireless 2200BG/2225BG/2915ABG driver" +.Sh SYNOPSIS +To compile this module into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device iwifw" +.Ed +.Pp +This will include three firmware images inside the kernel. +If you want to pick only the firmware image for the mode you want to operate +your network adapter in choose one of the following: +.Bd -ragged -offset indent +.Cd "device iwibssfw" +.Cd "device iwiibssfw" +.Cd "device iwimonitorfw" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following lines in +.Xr loader.conf 5 : +.Bd -literal -offset indent +iwi_bss_load="YES" +iwi_ibss_load="YES" +iwi_monitor_load="YES" +.Ed +.Sh DESCRIPTION +This module provides access to firmware sets for the +Intel PRO/Wireless 2200BG/2225BG/2915ABG series of IEEE 802.11 adapters. +It may be statically linked into the kernel, or loaded as a module. +.Pp +For the loaded firmware to be enabled for use the license at +.Pa /usr/share/doc/legal/intel_iwi/LICENSE +must be agreed to by adding the following line to +.Xr loader.conf 5 : +.Pp +.Dl "legal.intel_iwi.license_ack=1" +.Sh FILES +.Bl -tag -width ".Pa /usr/share/doc/legal/intel_iwi/LICENSE" -compact +.It Pa /usr/share/doc/legal/intel_iwi/LICENSE +.Nm +firmware license +.El +.Sh SEE ALSO +.Xr iwi 4 , +.Xr firmware 9 diff --git a/share/man/man4/iwn.4 b/share/man/man4/iwn.4 index 7ddded24fab4..b73331a04b57 100644 --- a/share/man/man4/iwn.4 +++ b/share/man/man4/iwn.4 @@ -25,36 +25,59 @@ .\" .\" $FreeBSD$ .\" -.Dd April 13, 2008 +.Dd February 8, 2010 .Os .Dt IWN 4 .Sh NAME .Nm iwn -.Nd "Intel Wireless WiFi Link 4965AGN IEEE 802.11n driver" +.Nd Intel Wireless WiFi Link 4965/1000/5000/5150/5300/6000/6050 +IEEE 802.11n driver .Sh SYNOPSIS To compile this driver into the kernel, include the following lines in your kernel configuration file: .Bd -ragged -offset indent .Cd "device iwn" -.Cd "device iwnfw" .Cd "device pci" .Cd "device wlan" .Cd "device firmware" .Ed .Pp +You also need to select a firmware for your device. +Choose one from: +.Bd -ragged -offset indent +.Cd "device iwn4965fw" +.Cd "device iwn1000fw" +.Cd "device iwn5000fw" +.Cd "device iwn5150fw" +.Cd "device iwn6000fw" +.Ed +.Pp +Or you can use +.Bd -ragged -offset indent +.Cd "device iwnfw" +.Ed +.Pp +to include them all. +.Pp Alternatively, to load the driver as a -module at boot time, place the following line in +module at boot time, place the following lines in .Xr loader.conf 5 : .Bd -literal -offset indent if_iwn_load="YES" +iwn4965fw_load="YES" +iwn1000fw_load="YES" +iwn5000fw_load="YES" +iwn5150fw_load="YES" +iwn6000fw_load="YES" .Ed .Sh DESCRIPTION The .Nm driver provides support for .Tn Intel -Wireless WiFi Link 4965AGN PCI-Express network adapters. +Wireless WiFi Link 4965, 1000, 5000 and 6000 series of +PCI-Express network adapters. .Nm supports .Cm station , diff --git a/share/man/man4/iwnfw.4 b/share/man/man4/iwnfw.4 index 1f9faa9c89cf..b0450c6345c2 100644 --- a/share/man/man4/iwnfw.4 +++ b/share/man/man4/iwnfw.4 @@ -22,7 +22,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 9, 2009 +.Dd February 7, 2010 .Dt IWNFW 4 .Os .Sh NAME @@ -36,17 +36,33 @@ kernel configuration file: .Cd "device iwnfw" .Ed .Pp +This will include three firmware images inside the kernel. +If you want to pick only the firmware image for your network adapter choose one +of the following: +.Bd -ragged -offset indent +.Cd "device iwn4965fw" +.Cd "device iwn1000fw" +.Cd "device iwn5000fw" +.Cd "device iwn5150fw" +.Cd "device iwn6000fw" +.Ed +.Pp Alternatively, to load the driver as a module at boot time, place the following line in .Xr loader.conf 5 : .Bd -literal -offset indent -iwnfw_load="YES" +iwn4965fw_load="YES" +iwn1000fw_load="YES" +iwn5000fw_load="YES" +iwn5150fw_load="YES" +iwn6000fw_load="YES" .Ed .Sh DESCRIPTION This module provides access to firmware sets for the -Intel Wireless WiFi Link 4965AGN IEEE 802.11n adapters. +Intel Wireless WiFi Link 4965, 1000, 5000 and 6000 series of +IEEE 802.11n adapters. It may be statically linked into the kernel, or loaded as a module. .Sh SEE ALSO .Xr iwn 4 , -.Xr firmware 8 +.Xr firmware 9 diff --git a/share/man/man4/lge.4 b/share/man/man4/lge.4 index 41010b9dfc97..89510f2c2146 100644 --- a/share/man/man4/lge.4 +++ b/share/man/man4/lge.4 @@ -143,7 +143,7 @@ the network connection (cable). .Xr ifconfig 8 .Rs .%T Level 1 LXT1001 Programming Manual -.%O http://www.FreeBSD.org/~wpaul/Level1/LXT1001SRM.pdf +.%U http://www.FreeBSD.org/~wpaul/Level1/LXT1001SRM.pdf .Re .Sh HISTORY The diff --git a/share/man/man4/lindev.4 b/share/man/man4/lindev.4 index b2dc60efc80b..199bd8d6fd15 100644 --- a/share/man/man4/lindev.4 +++ b/share/man/man4/lindev.4 @@ -30,7 +30,7 @@ .Os .Sh NAME .Nm lindev -.Nd the lindev module +.Nd Linux-specific pseudo devices support .Sh SYNOPSIS To compile this collection of linux-specific pseudo devices into the kernel, place the following line in your kernel configuration file: diff --git a/share/man/man4/linux.4 b/share/man/man4/linux.4 index 8c368b3c971f..f89b14bde27d 100644 --- a/share/man/man4/linux.4 +++ b/share/man/man4/linux.4 @@ -24,8 +24,8 @@ .\" .\" $FreeBSD$ .\" -.Dd March 17, 2008 -.Dt LINUX 4 i386 +.Dd February 8, 2010 +.Dt LINUX 4 .Os .Sh NAME .Nm linux diff --git a/share/man/man4/mac.4 b/share/man/man4/mac.4 index 10bc93a7c6fa..82d7a165aa1b 100644 --- a/share/man/man4/mac.4 +++ b/share/man/man4/mac.4 @@ -219,7 +219,7 @@ man page. .Rs .%B "The FreeBSD Handbook" .%T "Mandatory Access Control" -.%O http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/mac.html +.%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/mac.html .Re .Sh HISTORY The diff --git a/share/man/man4/mac_mls.4 b/share/man/man4/mac_mls.4 index 95e66be18c55..921781adf1ea 100644 --- a/share/man/man4/mac_mls.4 +++ b/share/man/man4/mac_mls.4 @@ -212,7 +212,6 @@ allow the superuser to bypass MLS protections. .Xr mac_bsdextended 4 , .Xr mac_ifoff 4 , .Xr mac_lomac 4 , -.Xr mac_mls 4 , .Xr mac_none 4 , .Xr mac_partition 4 , .Xr mac_portacl 4 , diff --git a/share/man/man4/malo.4 b/share/man/man4/malo.4 index 60c9e3d89d90..f0545f44b4e7 100644 --- a/share/man/man4/malo.4 +++ b/share/man/man4/malo.4 @@ -31,7 +31,7 @@ .\" .\" $FreeBSD$ .\"/ -.Dd March 26, 2009 +.Dd October 21, 2009 .Dt MALO 4 .Os .Sh NAME @@ -71,14 +71,19 @@ For more information on configuring this device, see .Pp This driver requires the .Nm malofw -be installed before it will work. +firmware kernel module be installed before it will work. The firmware files are not publicly available. -A package of the firmware which can be installed via -.Xr pkg_add 1 -with: +A port of the firmware can be found at: .Bd -literal -offset indent http://weongyo.org/project/malo/malo-firmware-1.4.tar.gz .Ed +.Pp +The firmware kernel module can be installed by extracting +the archive and running +.Ql make install clean +in the +.Pa malo-firmware-1.4 +directory. .Sh HARDWARE The following cards are among those supported by the .Nm diff --git a/share/man/man4/man4.i386/Makefile b/share/man/man4/man4.i386/Makefile index c47439998c04..0134d5783889 100644 --- a/share/man/man4/man4.i386/Makefile +++ b/share/man/man4/man4.i386/Makefile @@ -1,8 +1,6 @@ # $FreeBSD$ MAN= aic.4 \ - alpm.4 \ - amdpm.4 \ apm.4 \ ce.4 \ cp.4 \ @@ -17,23 +15,18 @@ MAN= aic.4 \ glxsb.4 \ ie.4 \ longrun.4 \ - mcd.4 \ mse.4 \ npx.4 \ - padlock.4 \ pae.4 \ pbio.4 \ - pcf.4 \ perfmon.4 \ pnp.4 \ pnpbios.4 \ sbni.4 \ - scd.4 \ smapi.4 \ snc.4 \ streams.4 \ svr4.4 \ - viapm.4 \ vpd.4 \ vx.4 \ wl.4 diff --git a/share/man/man4/man4.i386/vpd.4 b/share/man/man4/man4.i386/vpd.4 index 222925e12729..7ed2063a6fa9 100644 --- a/share/man/man4/man4.i386/vpd.4 +++ b/share/man/man4/man4.i386/vpd.4 @@ -76,7 +76,7 @@ Motherboard Serial Number. .%T "TP General - Using the BIOS Build ID to identify IBM ThinkPad systems" .%N "Reference #: MIGR-45120" .%D "November 22, 2002" -.%O "http://www.ibm.com/support/docview.wss?uid=psg1MIGR-45120" +.%U "http://www.ibm.com/support/docview.wss?uid=psg1MIGR-45120" .Re .Sh HISTORY The diff --git a/share/man/man4/man4.powerpc/Makefile b/share/man/man4/man4.powerpc/Makefile index 8d9977186c06..57196a3b92b1 100644 --- a/share/man/man4/man4.powerpc/Makefile +++ b/share/man/man4/man4.powerpc/Makefile @@ -1,8 +1,13 @@ # $FreeBSD$ -MAN= bm.4 \ +MAN= adb.4 \ + akbd.4 \ + ams.4 \ + bm.4 \ + cuda.4 \ pmu.4 \ powermac_nvram.4 \ + smu.4 \ snd_ai2s.4 \ snd_davbus.4 \ tsec.4 diff --git a/share/man/man4/man4.powerpc/adb.4 b/share/man/man4/man4.powerpc/adb.4 new file mode 100644 index 000000000000..eb34ecaf0c4e --- /dev/null +++ b/share/man/man4/man4.powerpc/adb.4 @@ -0,0 +1,70 @@ +.\"- +.\" Copyright (c) 2009 Nathan Whitehorn +.\" 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 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$ +.\" +.Dd December 3, 2009 +.Dt ADB 4 +.Os +.Sh NAME +.Nm adb +.Nd Apple Desktop Bus +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device adb" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for the Apple Desktop Bus, which is a simple +multi-drop bus used in general for input peripherals in older Apple +Macintosh hardware. +.Pp +The Apple Desktop Bus provides attachment for up to 16 devices, +including multiple devices of a single type, but not does support +hot-plugging. +.Sh SEE ALSO +Apple Tech Note HW01: ADB - The Untold Story: Space Aliens Ate My Mouse: +.Pa http://developer.apple.com/legacy/mac/library/technotes/hw/hw_01.html +.Pp +.Xr akbd 4 , +.Xr ams 4 , +.Xr cuda 4 , +.Xr pmu 4 +.Sh HISTORY +The +.Nm +device driver appeared in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Nathan Whitehorn +.Aq nwhitehorn@FreeBSD.org . diff --git a/share/man/man4/man4.powerpc/akbd.4 b/share/man/man4/man4.powerpc/akbd.4 new file mode 100644 index 000000000000..aea2fa01f504 --- /dev/null +++ b/share/man/man4/man4.powerpc/akbd.4 @@ -0,0 +1,76 @@ +.\"- +.\" Copyright (c) 2009 Nathan Whitehorn +.\" 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 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$ +.\" +.Dd December 3, 2009 +.Dt AKBD 4 +.Os +.Sh NAME +.Nm akbd +.Nd ADB Keyboard Driver +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device adb" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for all keyboards attached to the Apple Desktop +Bus (ADB). +.Sh HARDWARE +Devices supported by the +.Nm +driver include: +.Pp +.Bl -bullet -compact +.It +Apple Extended Keyboard +.It +Apple Keyboard II +.It +Apple iBook Keyboard +.It +Apple PowerBook Keyboard +.El +.Sh SEE ALSO +.Xr adb 4 , +.Xr cuda 4 , +.Xr pmu 4 +.Sh HISTORY +The +.Nm +device driver appeared in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Nathan Whitehorn +.Aq nwhitehorn@FreeBSD.org . diff --git a/share/man/man4/man4.powerpc/ams.4 b/share/man/man4/man4.powerpc/ams.4 new file mode 100644 index 000000000000..15560cf3d9ed --- /dev/null +++ b/share/man/man4/man4.powerpc/ams.4 @@ -0,0 +1,87 @@ +.\"- +.\" Copyright (c) 2009 Nathan Whitehorn +.\" 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 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$ +.\" +.Dd December 3, 2009 +.Dt AMS 4 +.Os +.Sh NAME +.Nm ams +.Nd ADB Mouse Driver +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device adb" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for mice and trackpads attached to the Apple Desktop +Bus (ADB) implementing both the base and extended ADB mouse protocols. +.Sh HARDWARE +Devices supported by the +.Nm +driver include: +.Pp +.Bl -bullet -compact +.It +Apple Mouse +.It +ADB Extended Mouse +.It +MacAlly 2-Button Mouse +.It +Apple iBook Trackpad +.It +Apple PowerBook Trackpad +.El +.Sh SYSCTL VARIABLES +.Bl -tag -width indent +.It Va dev.ams.%d.tapping +On ADB trackpads, setting this sysctl to 1 causes taps on the trackpad to +be interpreted as button clicks. +.El +.Sh SEE ALSO +Apple Tech Note HW01: ADB - The Untold Story: Space Aliens Ate My Mouse: +.Pa http://developer.apple.com/legacy/mac/library/technotes/hw/hw_01.html +.Pp +.Xr adb 4 , +.Xr cuda 4 , +.Xr pmu 4 +.Sh HISTORY +The +.Nm +device driver appeared in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Nathan Whitehorn +.Aq nwhitehorn@FreeBSD.org . diff --git a/share/man/man4/man4.powerpc/cuda.4 b/share/man/man4/man4.powerpc/cuda.4 new file mode 100644 index 000000000000..4b4b2180ccea --- /dev/null +++ b/share/man/man4/man4.powerpc/cuda.4 @@ -0,0 +1,79 @@ +.\"- +.\" Copyright (c) 2009 Nathan Whitehorn +.\" 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 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$ +.\" +.Dd December 3, 2009 +.Dt CUDA 4 +.Os +.Sh NAME +.Nm cuda +.Nd Apple CUDA I/O Controller Driver +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device adb" +.Cd "device cuda" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for the CUDA VIA (Versatile Interface Attachment) +chip found in pre-Core99 Apple hardware, such as the Power Macintosh G3. +.Pp +The Apple CUDA controller is a multi-purpose ASIC that provides power +control and an +.Xr adb 4 +interface. +.Sh HARDWARE +Chips supported by the +.Nm +driver include: +.Pp +.Bl -bullet -compact +.It +Apple CUDA I/O Controller +.El +.Sh SEE ALSO +.Xr adb 4 +.Sh HISTORY +The +.Nm +device driver appeared in +.Nx 4.0 , +and then in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Michael Lorenz +.Aq macallan@NetBSD.org +and ported to FreeBSD by +.An Nathan Whitehorn +.Aq nwhitehorn@FreeBSD.org . diff --git a/share/man/man4/man4.powerpc/pmu.4 b/share/man/man4/man4.powerpc/pmu.4 index 872f8ac3d9c9..ab998772a6f9 100644 --- a/share/man/man4/man4.powerpc/pmu.4 +++ b/share/man/man4/man4.powerpc/pmu.4 @@ -95,7 +95,8 @@ Current fraction of the battery's maximum charge, in percent. .El .Sh SEE ALSO .Xr acpi 4 , -.Xr adb 4 +.Xr adb 4 , +.Xr led 4 .Sh HISTORY The .Nm diff --git a/share/man/man4/man4.powerpc/smu.4 b/share/man/man4/man4.powerpc/smu.4 new file mode 100644 index 000000000000..893522c9c365 --- /dev/null +++ b/share/man/man4/man4.powerpc/smu.4 @@ -0,0 +1,125 @@ +.\"- +.\" Copyright (c) 2010 Nathan Whitehorn +.\" 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 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$ +.\" +.Dd February 22, 2010 +.Dt SMU 4 +.Os +.Sh NAME +.Nm smu +.Nd Apple System Management Unit Driver +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device smu" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for the System Management Unit (SMU) found in many +Apple G5 systems. +This includes most Power Macintosh G5 and all iMac G5 systems. +.Pp +The Apple SMU controller provides software power management and thermal +control functionality, and is responsible for managing system cooling +devices. +.Sh HARDWARE +Chips supported by the +.Nm +driver include: +.Pp +.Bl -bullet -compact +.It +Apple System Management Unit +.El +.Sh THERMAL MANAGEMENT +The +.Nm +driver provides basic automatic thermal management. Without a userspace +daemon providing more advanced control, the driver will attempt to maintain +system temperatures in a conservative range through coarse-grained control of +system cooling devices (see below). Automatic kernel-level thermal control +will take over if more than 3 seconds elapses between userspace cooling +setting adjustments. +.Sh SYSCTL VARIABLES +The +.Nm +driver provides power management services and thermal readout through a +sysctl interface. +The following sysctls can be used to control the +power management behavior and to examine current system power and +thermal conditions. +.Bl -tag -width indent +.It Va dev.smu.%d.server_mode +Restart after power failure behavior (1 causes system to reboot after power +cut, 0 causes system to remain off). +.It Va dev.smu.%d.target_temp +Target system temperature, in degrees Celsius. The +.Nm +driver will attempt to adjust fans to maintain the temperature of the +warmest component in the system at or below this level. +.It Va dev.smu.%d.critical_temp +System critical temperature, in degrees Celsius. If any component in +the system exceeds this temperature, the machine will be shut down within +500 ms. +.It Va dev.smu.%d.fans.%s.minrpm +Minimum allowed speed for this fan. +.It Va dev.smu.%d.fans.%s.maxrpm +Maximum allowed speed for this fan. +.It Va dev.smu.%d.fans.%s.rpm +Current speed for this fan. The fan speed can be adjusted by changing this +sysctl. If more than 3 seconds elapses between fan speed adjustments, the +kernel will resume automatic control of the fan. +.It Va dev.smu.%d.sensors.%s +Current reading from this sensor. Four sensor types are supported. Temperature +sensors are in units of degrees Celsius, current sensors in milliamps, voltage +sensors in millivolts, and power sensors in milliwatts. +.El +.Sh LED INTERFACE +The +.Nm +driver provides an +.Xr led 4 +annunciator interface at +.Pa /dev/led/sleepled . +.Sh SEE ALSO +.Xr acpi 4 , +.Xr pmu 4 , +.Xr led 4 +.Sh HISTORY +The +.Nm +device driver appeared in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Nathan Whitehorn +.Aq nwhitehorn@FreeBSD.org . diff --git a/share/man/man4/man4.sparc64/ebus.4 b/share/man/man4/man4.sparc64/ebus.4 index d61cc2b5de17..2dd9807a200d 100644 --- a/share/man/man4/man4.sparc64/ebus.4 +++ b/share/man/man4/man4.sparc64/ebus.4 @@ -99,7 +99,7 @@ DMA. .%T "Peripheral Component Interconnect Input Output Controller" .%V "Part No.: 802-7837-01" .%D "March 1997" -.%O "http://www.sun.com/oem/products/manuals/802-7837.pdf" +.%U "http://www.sun.com/oem/products/manuals/802-7837.pdf" .Re .Sh HISTORY The diff --git a/share/man/man4/man4.i386/mcd.4 b/share/man/man4/mcd.4 similarity index 99% rename from share/man/man4/man4.i386/mcd.4 rename to share/man/man4/mcd.4 index a4a93ddb5d4a..8efa7db6f841 100644 --- a/share/man/man4/man4.i386/mcd.4 +++ b/share/man/man4/mcd.4 @@ -27,7 +27,7 @@ .\" $FreeBSD$ .\" .Dd December 8, 1994 -.Dt MCD 4 i386 +.Dt MCD 4 .Os .Sh NAME .Nm mcd diff --git a/share/man/man4/mfi.4 b/share/man/man4/mfi.4 index 8ab8d9381005..d34eb273f245 100644 --- a/share/man/man4/mfi.4 +++ b/share/man/man4/mfi.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 15, 2009 +.Dd January 2, 2010 .Dt MFI 4 .Os .Sh NAME @@ -79,15 +79,21 @@ driver supports the following hardware: .Pp .Bl -bullet -compact .It +LSI MegaRAID SAS 1078 +.It LSI MegaRAID SAS 8408E .It LSI MegaRAID SAS 8480E .It -LSI MegaRAID SAS 1078 +LSI MegaRAID SAS 9260 .It Dell PERC5 .It Dell PERC6 +.It +IBM ServeRAID-MR10i +.It +Intel RAID Controller SROMBSAS18E .El .Sh FILES .Bl -tag -width ".Pa /dev/mfid?" -compact diff --git a/share/man/man4/mk48txx.4 b/share/man/man4/mk48txx.4 new file mode 100644 index 000000000000..5706924bfcf9 --- /dev/null +++ b/share/man/man4/mk48txx.4 @@ -0,0 +1,230 @@ +.\" $NetBSD: mk48txx.4,v 1.16 2009/04/10 17:14:07 joerg Exp $ +.\" +.\" Copyright (c) 2000, 2002 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by Paul Kranenburg. +.\" +.\" 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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$ +.\" +.Dd December 25, 2009 +.Dt MK48TXX 4 +.Os +.Sh NAME +.Nm mk48txx +.Nd +.Tn Mostek +time-of-day clock driver +.Sh SYNOPSIS +.In sys/eventhandler.h +.In sys/lock.h +.In sys/mutex.h +.In dev/mk48txx/mk48txxvar.h +.Pp +To compile this driver into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device mk48txx" +.Ed +.Sh DESCRIPTION +The +.Nm +driver is a back-end for several models of +.Tn Mostek +time-of-day clock chips. +It provides access methods to retrieve and set date and time for use with the +.Dq Li clock +KOBJ interface. +.Pp +To tie an instance of this device to the system, use the +.Fn mk48txx_attach +function and the mk48txx_softc structure defined as follows: +.Pp +.Ft "int" +.Fn mk48txx_attach "device_t dev" +.Pp +.Bd -literal +typedef uint8_t (*mk48txx_nvrd_t)(device_t dev, int off); +typedef void (*mk48txx_nvwr_t)(device_t dev, int off, uint8_t v); +.Ed +.Bd -literal +struct mk48txx_softc { + struct resource sc_res; + struct mtx sc_mtx; + eventhandler_tag sc_wet; + const char *sc_model; + bus_size_t sc_nvramsz; + bus_size_t sc_clkoffset; + u_int sc_year0; + u_int sc_flag; + mk48txx_nvrd_t sc_nvrd; + mk48txx_nvwr_t sc_nvwr; +}; +.Ed +.Pp +.Bl -tag -width indent +.It Fa sc_res +The bus resource used for accessing the chip's non-volatile memory +.Pq including the clock registers , +which must be supplied by the front-end when using the default access methods +.Pq see below . +Otherwise this member is optional. +.It Fa sc_mtx +The hardware mutex used when accessing the chip's non-volatile memory +.Pq including the clock registers , +which must be initialized with +.Dv MTX_DEF +by the front-end. +.It Fa sc_wet +The event handler tag for the watchdog functionality, +which is registered by the +.Fn mk48txx_attach +function if supported by the chip and specified as part of the +machine-dependent features +.Pq see below . +.It Fa sc_model +The chip model which this instance should serve. +This member must be set to one of +.Dq mk48t02 , +.Dq mk48t08 , +.Dq mk48t18 , +or +.Dq mk48t59 +by the front-end. +.It Fa sc_nvramsz +The size of the non-volatile RAM in the +.Tn Mostek +chip, +which is set by the +.Fn mk48txx_attach +function. +.It Fa sc_clkoffset +The offset into the control registers of the +.Tn Mostek +chip, +which is set by the the +.Fn mk48txx_attach +function. +.It Fa sc_year0 +The year offset to be used with the +.Sq year +counter of the clock, +which must be set by the front-end. +This value is generally dependent on the system configuration in which +the clock device is mounted. +For instance, on +.Tn Sun Microsystems +machines the convention is to have clock's two-digit year represent +the year since 1968. +.It Fa sc_flag +This flag is used to specify machine-dependent features. +The following flags are supported: +.Bl -tag -width ".Dv MK48TXX_WDOG_ENABLE_WDS" +.It Dv MK48TXX_NO_CENT_ADJUST +If the resulting date retrieved with the +.Dq Li clock_gettime() method +would be earlier than January 1, 1970, +the driver will assume that the chip's year counter actually represents a +year in the 21st century. +This behavior can be overridden by setting this flag, +which causes the +.Nm +driver to respect the clock's century bit instead. +.It Dv MK48TXX_WDOG_REGISTER +When this flag is set, +the +.Nm +driver will register as a watchdog via the interface defined in +.Xr 9 watchdog +if supported by the specific chip model. +.It Dv MK48TXX_WDOG_ENABLE_WDS +When this flag is set, +the +.Nm +driver will set the watchdog steering +.Pq WDS +bit when enabling the watchdog functionality of the chip. +enabled +.Pq see the chip documentation for further information regarding the WDS bit . +.El +.It Fa sc_nvread +.It Fa sc_nvwrite +These members specify the access methods for reading respectively writing +clock device registers. +The default, +when +.Dv NULL +is passed as an access method, +is to access the chip memory +.Pq and clock registers +as if they were direct-mapped using the specified bus resource. +.Pp +Otherwise, the driver will call the respective function supplied by the +front-end to perform the access, +passing it the offset +.Va off +of the chip memory +.Pq or clock register +location to be read from or written to, respectively. +.El +.Sh HARDWARE +The following models are supported: +.Pp +.Bl -tag -width indent -offset indent -compact +.It Tn Mostek MK48T02 +.It Tn Mostek MK48T08 +.It Tn Mostek MK48T18 +.It Tn Mostek MK48T59 +.El +.Sh SEE ALSO +.Xr intro 4 , +.Xr watchdog 9 +.Sh HISTORY +The +.Nm mk48txx +driver appeared in +.Nx 1.5 . +The first +.Fx +version to include it was +.Fx 5.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written for +.Nx +by +.An Paul Kranenburg +.Aq pk@NetBSD.org . +It was ported to +.Fx +by +.An Thomas Moestl +.Aq tmm@FreeBSD.org +and later on improved by +.An Marius Strobl +.Aq marius@FreeBSD.org . diff --git a/share/man/man4/mpt.4 b/share/man/man4/mpt.4 index 9a38f29e27ea..a90dcffb7a80 100644 --- a/share/man/man4/mpt.4 +++ b/share/man/man4/mpt.4 @@ -159,7 +159,7 @@ can take on - no separate compilation is required. .Xr gmultipath 8 .Rs .%T "LSI Logic Website" -.%O http://www.lsilogic.com/ +.%U http://www.lsilogic.com/ .Re .Sh HISTORY The diff --git a/share/man/man4/msk.4 b/share/man/man4/msk.4 index d98a5faadf5d..7a842f5ecfd6 100644 --- a/share/man/man4/msk.4 +++ b/share/man/man4/msk.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 2, 2009 +.Dd March 1, 2010 .Dt MSK 4 .Os .Sh NAME @@ -158,6 +158,8 @@ Yukon II based Gigabit Ethernet controller chips, including: .It D-Link 550SX Gigabit Ethernet .It +D-Link 560SX Gigabit Ethernet +.It D-Link 560T Gigabit Ethernet .It Marvell Yukon 88E8021CU Gigabit Ethernet @@ -188,6 +190,8 @@ Marvell Yukon 88E8040 Fast Ethernet .It Marvell Yukon 88E8040T Fast Ethernet .It +Marvell Yukon 88E8042 Fast Ethernet +.It Marvell Yukon 88E8048 Fast Ethernet .It Marvell Yukon 88E8050 Gigabit Ethernet @@ -200,6 +204,8 @@ Marvell Yukon 88E8055 Gigabit Ethernet .It Marvell Yukon 88E8056 Gigabit Ethernet .It +Marvell Yukon 88E8057 Gigabit Ethernet +.It Marvell Yukon 88E8058 Gigabit Ethernet .It Marvell Yukon 88E8070 Gigabit Ethernet @@ -229,6 +235,12 @@ variables and .Xr loader 8 tunables: .Bl -tag -width indent +.It Va dev.mskc.%d.int_holdoff +Maximum number of time to delay interrupts. +The valid range is 0 to 34359738 for 125MHz clock in units of 1us, +the default is 100 (100us). +The interface need to be brought down and up again before a change +takes effect. .It Va dev.mskc.%d.process_limit Maximum amount of Rx events to be processed in the event loop before rescheduling a taskqueue. diff --git a/share/man/man4/mwlfw.4 b/share/man/man4/mwlfw.4 index e2a9c5362ef5..5e557bfc3073 100644 --- a/share/man/man4/mwlfw.4 +++ b/share/man/man4/mwlfw.4 @@ -49,4 +49,4 @@ It may be statically linked into the kernel, or loaded as a module. .Sh SEE ALSO .Xr mwl 4 , -.Xr firmware 8 +.Xr firmware 9 diff --git a/share/man/man4/ndis.4 b/share/man/man4/ndis.4 index 107001a6a304..71377ad04cf3 100644 --- a/share/man/man4/ndis.4 +++ b/share/man/man4/ndis.4 @@ -30,8 +30,8 @@ .\" .\" $FreeBSD$ .\" -.Dd October 13, 2006 -.Dt NDIS 4 i386 +.Dd February 8, 2010 +.Dt NDIS 4 .Os .Sh NAME .Nm ndis @@ -137,7 +137,7 @@ before a timeout expired. .Xr ndisgen 8 .Rs .%T "NDIS 5.1 specification" -.%O http://www.microsoft.com +.%U http://www.microsoft.com .Re .Sh HISTORY The diff --git a/share/man/man4/netintro.4 b/share/man/man4/netintro.4 index f5d479bc18cf..348a13e68fd8 100644 --- a/share/man/man4/netintro.4 +++ b/share/man/man4/netintro.4 @@ -32,7 +32,7 @@ .\" @(#)netintro.4 8.2 (Berkeley) 11/30/93 .\" $FreeBSD$ .\" -.Dd June 18, 2004 +.Dd January 26, 2010 .Dt NETINTRO 4 .Os .Sh NAME @@ -204,6 +204,7 @@ struct ifreq { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; + struct ifreq_buffer ifru_buffer; short ifru_flags[2]; short ifru_index; int ifru_metric; @@ -216,6 +217,7 @@ struct ifreq { #define ifr_addr ifr_ifru.ifru_addr /* address */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_buffer ifr_ifru.ifru_buffer /* user supplied buffer with its length */ #define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */ #define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */ #define ifr_metric ifr_ifru.ifru_metric /* metric */ @@ -277,6 +279,33 @@ and fields of the .Vt ifreq structure, respectively. +.It Dv SIOCGIFDESCR +Get the interface description, returned in the +.Va buffer +field of +.Va ifru_buffer +struct. +The user supplied buffer length should be defined in the +.Va length +field of +.Va ifru_buffer +struct passed in as parameter, and the length would include +the terminating nul character. +If there is not enough space to hold the interface length, +no copy would be done and an +error would be returned. +The kernel will store the buffer length in the +.Va length +field upon return, regardless whether the buffer itself is +sufficient to hold the data. +.It Dv SIOCSIFDESCR +Set the interface description to the value of the +.Va buffer +field of +.Va ifru_buffer +struct, with +.Va length +field specifying its length (counting the terminating nul). .It Dv SIOCSIFFLAGS Set interface flags field. If the interface is marked down, @@ -404,6 +433,13 @@ struct if_clonereq { char *ifcr_buffer; /* buffer for cloner names */ }; .Ed +.Bd -literal +/* Structure used in SIOCGIFDESCR and SIOCSIFDESCR requests */ +struct ifreq_buffer { + size_t length; /* length of the buffer */ + void *buffer; /* pointer to userland space buffer */ +}; +.Ed .Sh SEE ALSO .Xr ioctl 2 , .Xr socket 2 , diff --git a/share/man/man4/ng_ipfw.4 b/share/man/man4/ng_ipfw.4 index a1249dbd4412..9a9099efd75c 100644 --- a/share/man/man4/ng_ipfw.4 +++ b/share/man/man4/ng_ipfw.4 @@ -24,13 +24,14 @@ .\" .\" $FreeBSD$ .\" -.Dd June 10, 2009 +.Dd March 2, 2010 .Dt NG_IPFW 4 .Os .Sh NAME .Nm ng_ipfw .Nd interface between netgraph and IP firewall .Sh SYNOPSIS +.In netinet/ip_var.h .In netgraph/ng_ipfw.h .Sh DESCRIPTION The @@ -73,30 +74,18 @@ If no hook matches, packets are discarded. Packets injected via the .Cm netgraph command are tagged with -.Vt "struct ng_ipfw_tag" . +.Vt "struct ipfw_rule_ref" . This tag contains information that helps the packet to re-enter .Xr ipfw 4 processing, should the packet come back from .Xr netgraph 4 to .Xr ipfw 4 . -.Bd -literal -offset 4n -struct ng_ipfw_tag { - struct m_tag mt; /* tag header */ - struct ip_fw *rule; /* matching rule */ - uint32_t rule_id; /* matching rule id */ - uint32_t chain_id; /* ruleset id */ - struct ifnet *ifp; /* interface, for ip_output */ - int dir; /* packet direction */ -#define NG_IPFW_OUT 0 -#define NG_IPFW_IN 1 -}; -.Ed .Pp Packets received by a node from .Xr netgraph 4 -must be tagged with -.Vt "struct ng_ipfw_tag" +subsystem must be tagged with +.Vt "struct ipfw_rule_ref" tag. Packets re-enter IP firewall processing at the next rule. If no tag is supplied, packets are discarded. diff --git a/share/man/man4/nge.4 b/share/man/man4/nge.4 index fac9bd0c46e3..7c692474115d 100644 --- a/share/man/man4/nge.4 +++ b/share/man/man4/nge.4 @@ -230,11 +230,11 @@ the network connection (cable). .Xr ifconfig 8 .Rs .%T National Semiconductor DP83820 datasheet -.%O http://www.national.com +.%U http://www.national.com .Re .Rs .%T National Semiconductor DP83861 datasheet -.%O http://www.national.com +.%U http://www.national.com .Re .Sh HISTORY The diff --git a/share/man/man4/nvram.4 b/share/man/man4/nvram.4 new file mode 100644 index 000000000000..25d6852b46bb --- /dev/null +++ b/share/man/man4/nvram.4 @@ -0,0 +1,93 @@ +.\" +.\"Copyright (c) 2010 iXsystems, Inc. +.\"All rights reserved. +.\" written by: Xin LI +.\" +.\"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$ +.\" +.Dd February 8, 2010 +.Dt NVRAM 4 +.Os +.Sh NAME +.Nm nvram +.Nd "non-volatile RAM" +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device nvram" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +nvram_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides access to BIOS configuration NVRAM on i386 and amd64 +systems. +.Pp +PC motherboard uses a small non-volatile memory to store BIOS settings +which is usually part of its clock chip and sometimes referred as +.Dq CMOS SRAM . +This driver exposes bytes 14 through 128 of the NVRAM, or a total of +114 bytes, at offset zero of the device file +.Pa /dev/nvram . +.Pp +This driver is useful for cloning machines that shares the same hardware +configuration and need same BIOS setting tweaks. +.Sh IMPLEMENTATION NOTES +The BIOS NVRAM's bytes 16 through 31 are checksummed at byte 32. +This driver +.Em does not +take care for these checksums. +.Sh EXAMPLES +Backup existing BIOS NVRAM to +.Pa nvram.bin : +.Pp +.Dl dd if=/dev/nvram of=nvram.bin +.Pp +Restore BIOS NVRAM from +.Pa nvram.bin : +.Pp +.Dl dd if=nvram.bin of=/dev/nvram +.Sh SEE ALSO +.Xr dd 1 +.Sh HISTORY +The +.Nm +device driver first appeared in +.Fx 6.4 . +.Sh AUTHORS +.An -nosplit +The +.Nm +device driver was written by +.An Peter Wemm . +This manual page was written by +.An Xin LI . diff --git a/share/man/man4/man4.i386/padlock.4 b/share/man/man4/padlock.4 similarity index 98% rename from share/man/man4/man4.i386/padlock.4 rename to share/man/man4/padlock.4 index e93d3d9fe216..2a74f63939c0 100644 --- a/share/man/man4/man4.i386/padlock.4 +++ b/share/man/man4/padlock.4 @@ -24,8 +24,8 @@ .\" .\" $FreeBSD$ .\" -.Dd August 1, 2007 -.Dt PADLOCK 4 i386 +.Dd February 8, 2010 +.Dt PADLOCK 4 .Os .Sh NAME .Nm padlock diff --git a/share/man/man4/man4.i386/pcf.4 b/share/man/man4/pcf.4 similarity index 99% rename from share/man/man4/man4.i386/pcf.4 rename to share/man/man4/pcf.4 index f5e9088454c5..cc8915fa1222 100644 --- a/share/man/man4/man4.i386/pcf.4 +++ b/share/man/man4/pcf.4 @@ -25,7 +25,7 @@ .\" $FreeBSD$ .\" .Dd August 6, 1998 -.Dt PCF 4 i386 +.Dt PCF 4 .Os .Sh NAME .Nm pcf diff --git a/share/man/man4/pcii.4 b/share/man/man4/pcii.4 new file mode 100644 index 000000000000..d496113f2a67 --- /dev/null +++ b/share/man/man4/pcii.4 @@ -0,0 +1,97 @@ +.\" Copyright (c) 2010, Joerg Wunsch +.\" 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$ +.\" +.Dd January 24, 2010 +.Dt PCII 4 +.Os +.Sh NAME +.Nm pcii +.Nd National Instruments PCIIA GPIB controller driver +.Sh SYNOPSIS +.Cd "device pcii" +.Pp +In +.Pa /boot/device.hints : +.Cd hint.pcii.0.at="isa" +.Cd hint.pcii.0.port="0x2e1" +.Cd hint.pcii.0.irq="7" +.Cd hint.pcii.0.drq="1" +.Sh DESCRIPTION +The +.Nm +driver provides support for driving an IEEE-488 bus, also called +IEC-625 (or just "IEC bus"), or HP-IB (Hewlett Packard Instrument +Bus), or GPIB (General Purpose Instrument Bus). +The driver supports National Instruments PCIIA cards (sometimes +also refered to as PC2A) and compatibles. +These cards use a NEC \(mcPD7210 controller IC as the main +interface between the host computer and the instrument bus. +.Ss IO memory space layout +The PCIIA cards use a very specific IO memory space allocation layout. +The address bits A0 through A9 (which have traditionally been the only +address bits evaluated on IBM PC XT extension cards) are hardwired to +address 0x2e1. +Bits A10 through A12 are used by the \(mcPD7210 register select lines. +This makes the individual 7210 registers being 0x400 bytes apart in the +ISA bus address space. +Address bits A13 and A14 are compared to a DIP switch setting on the +card, allowing for up to 4 different cards being installed (at base +addresses 0x2e1, 0x22e1, 0x42e1, and 0x62e1, respectively). +A15 has been used to select an optional on-board time-of-day clock +chip (MM58167A) on the original PCIIA rather than the \(mcPD7210 +(which is not implemented on later boards and clones). +Finally, the IO addresses 0x2f0 ... 0x2f7 are used for a +.Em special interrupt handling feature +(re-enable interrupts so the IRQ can be shared), where actually only +address 0x2f0 plus the actual IRQ level is required for each card. +Some clones do not appear to require this special IRQ handling, and +are thus likely to not support the shared IRQ feature. +.Pp +Only the base address of the card needs to be specified in the ISA +device hints; the driver takes care to derive all other IO addresses +needed during the probe phase. +.Ss Supported cards +The following cards are known to be supported: +.Bl -bullet -offset indent +.It +B&C Microsystems PC488A-0 +.It +National Instruments GPIB-PCII/PCIIA (in PCIIa mode) +.It +Axiom AX5488 +.El +.Sh SEE ALSO +.Xr gpib 3 , +.Xr gpib 4 , +.Xr device.hints 5 +.Sh HISTORY +The +.Nm +driver was written by Poul-Henning Kamp, and first appeared in +.Fx 5.4 . +.Sh AUTHORS +This manual page was written by +.An J\(:org Wunsch . diff --git a/share/man/man4/pcm.4 b/share/man/man4/pcm.4 index ec09085f0a61..4fce593bb7ab 100644 --- a/share/man/man4/pcm.4 +++ b/share/man/man4/pcm.4 @@ -633,19 +633,19 @@ A device node is not created properly. .Xr sysctl 8 .Rs .%T "Cookbook formulae for audio EQ biquad filter coefficients, by Robert Bristow-Johnson" -.%O "http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt" +.%U "http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt" .Re .Rs .%T "Julius O'Smith's Digital Audio Resampling" -.%O "http://ccrma.stanford.edu/~jos/resample/" +.%U "http://ccrma.stanford.edu/~jos/resample/" .Re .Rs .%T "Polynomial Interpolators for High-Quality Resampling of Oversampled Audio, by Olli Niemitalo" -.%O "http://www.student.oulu.fi/~oniemita/dsp/deip.pdf" +.%U "http://www.student.oulu.fi/~oniemita/dsp/deip.pdf" .Re .Rs .%T "The OSS API" -.%O "http://www.opensound.com/pguide/oss.pdf" +.%U "http://www.opensound.com/pguide/oss.pdf" .Re .Sh HISTORY The diff --git a/share/man/man4/pcn.4 b/share/man/man4/pcn.4 index 38639ad73848..af0fdeee9d69 100644 --- a/share/man/man4/pcn.4 +++ b/share/man/man4/pcn.4 @@ -179,7 +179,7 @@ the card should be configured correctly. .Xr ifconfig 8 .Rs .%T AMD PCnet/FAST, PCnet/FAST+ and PCnet/Home datasheets -.%O http://www.amd.com +.%U http://www.amd.com .Re .Sh HISTORY The diff --git a/share/man/man4/psm.4 b/share/man/man4/psm.4 index 01cbd9c0e038..b61a4d30ae01 100644 --- a/share/man/man4/psm.4 +++ b/share/man/man4/psm.4 @@ -359,6 +359,18 @@ at boot-time. This will enable .Nm to handle packets from guest devices (sticks) and extra buttons. +.Pp +Tap and drag gestures can be disabled by setting +.Va hw.psm.tap_enabled +to +.Em 0 +at boot-time. +Currently, this is only supported on Synaptics touchpads with Extended +support disabled. The behaviour may be changed after boot by setting +the sysctl with the same name and by restarting +.Xr moused 8 +using +.Pa /etc/rc.d/moused . .Sh IOCTLS There are a few .Xr ioctl 2 @@ -846,7 +858,7 @@ Clicking any button without moving the mouse may also work. .Xr syslogd 8 .Rs .%T Synaptics TouchPad Interfacing Guide -.%O http://www.synaptics.com/ +.%U http://www.synaptics.com/ .Re .\".Sh HISTORY .Sh AUTHORS diff --git a/share/man/man4/pts.4 b/share/man/man4/pts.4 index d0e8832b9598..88eb29c615b4 100644 --- a/share/man/man4/pts.4 +++ b/share/man/man4/pts.4 @@ -136,12 +136,6 @@ This should not be used directly. It is used to implement routines like .Xr grantpt 3 . .El -.Pp -The maximum number of pseudo-terminals is limited to 1000. -It is not possible to use more than 1000 pseudo-terminals, as all software -which use -.Xr utmp 5 -will not be able to handle pseudo-terminals with number superior to 999. .Sh FILES The files used by this pseudo-terminals implementation are: @@ -150,26 +144,6 @@ pseudo-terminals implementation are: .It Pa /dev/pts/[num] Pseudo-terminal slave devices. .El -.Sh SYSCTL VARIABLES -The following -.Xr sysctl 8 -variables can be used to modify or monitor -.Nm -behavior. -.Bl -tag -width indent -.It Va kern.pts_maxdev -Highest pseudo-terminal unit number to be allocated. -Because -.Xr utmp 5 -is restricted to an 8-byte line name size, -.Nm -will not create any pseudo-terminals with a unit number above 999 by -default. -After increasing -.Dv UT_LINESIZE , -this variable can be changed to allow more than 1000 pseudo-terminals to -be allocated simultaneously. -.El .Sh DIAGNOSTICS None. .Sh SEE ALSO diff --git a/share/man/man4/ral.4 b/share/man/man4/ral.4 index ef8f8b2f5bbc..2fd8e3355cbc 100644 --- a/share/man/man4/ral.4 +++ b/share/man/man4/ral.4 @@ -242,7 +242,7 @@ This should not happen. .Xr wpa_supplicant 8 . .Rs .%T "Ralink Technology" -.%O http://www.ralinktech.com/ +.%U http://www.ralinktech.com/ .Re .Sh HISTORY The diff --git a/share/man/man4/re.4 b/share/man/man4/re.4 index c269403cd419..7911014a7dbb 100644 --- a/share/man/man4/re.4 +++ b/share/man/man4/re.4 @@ -212,7 +212,7 @@ the network connection (cable). .Xr ifconfig 8 .Rs .%T RealTek Semiconductor RTL8139C+, RTL8169, RTL8169S and RTL8110S datasheets -.%O http://www.realtek.com.tw/ +.%U http://www.realtek.com.tw/ .Re .Sh HISTORY The diff --git a/share/man/man4/rl.4 b/share/man/man4/rl.4 index a8ff68b40a2e..1897b08b584f 100644 --- a/share/man/man4/rl.4 +++ b/share/man/man4/rl.4 @@ -255,7 +255,7 @@ the card should be configured correctly. .Xr ifconfig 8 .Rs .%B The RealTek 8129, 8139 and 8139C+ datasheets -.%O http://www.realtek.com.tw +.%U http://www.realtek.com.tw .Re .Sh HISTORY The diff --git a/share/man/man4/rue.4 b/share/man/man4/rue.4 index 7522575f5d1d..e8f69ecd8b4d 100644 --- a/share/man/man4/rue.4 +++ b/share/man/man4/rue.4 @@ -140,7 +140,7 @@ The driver failed to allocate an mbuf for the receiver ring. .Xr ifconfig 8 .Rs .%T "ReakTek RTL8150 data sheet" -.%O ftp://ftp.realtek.com.tw/lancard/data_sheet/8150/ +.%U ftp://ftp.realtek.com.tw/lancard/data_sheet/8150/ .Re .Sh HISTORY The diff --git a/share/man/man4/rum.4 b/share/man/man4/rum.4 index 2fb3bbfc485a..cbbbcd0962b5 100644 --- a/share/man/man4/rum.4 +++ b/share/man/man4/rum.4 @@ -167,7 +167,7 @@ This should not happen. .Xr wpa_supplicant 8 . .Rs .%T "Ralink Technology" -.%O http://www.ralinktech.com/ +.%U http://www.ralinktech.com/ .Re .Sh HISTORY The diff --git a/share/man/man4/run.4 b/share/man/man4/run.4 new file mode 100644 index 000000000000..e613649e853d --- /dev/null +++ b/share/man/man4/run.4 @@ -0,0 +1,219 @@ +.\" $OpenBSD: run.4,v 1.22 2009/11/23 06:16:32 jmc Exp $ +.\" +.\" Copyright (c) 2008 Damien Bergamini +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.\" $FreeBSD$ +.\" +.Dd January 29, 2010 +.Os +.Dt RUN 4 +.Sh NAME +.Nm run +.Nd Ralink Technology USB IEEE 802.11a/g/n wireless network device +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device ehci" +.Cd "device uhci" +.Cd "device ohci" +.Cd "device usb" +.Cd "device run" +.Cd "device wlan" +.Cd "device wlan_amrr" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +if_run_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver supports USB 2.0 wireless adapters based on the Ralink RT2700U, +RT2800U and RT3000U chipsets. +.Pp +The RT2700U chipset consists of two integrated chips, an RT2770 MAC/BBP and +an RT2720 (1T2R) or RT2750 (dual-band 1T2R) radio transceiver. +.Pp +The RT2800U chipset consists of two integrated chips, an RT2870 MAC/BBP and +an RT2820 (2T3R) or RT2850 (dual-band 2T3R) radio transceiver. +.Pp +The RT3000U is a single-chip solution based on an RT3070 MAC/BBP and +an RT3020 (1T1R), RT3021 (1T2R) or RT3022 (2T2R) single-band radio +transceiver. +.Pp +These are the modes the +.Nm +driver can operate in: +.Bl -tag -width "IBSS-masterXX" +.It BSS mode +Also known as +.Em infrastructure +mode, this is used when associating with an access point, through +which all traffic passes. +This mode is the default. +.It monitor mode +In this mode the driver is able to receive packets without +associating with an access point. +This disables the internal receive filter and enables the card to +capture packets from networks which it wouldn't normally have access to, +or to scan for access points. +.El +.Pp +The +.Nm +driver can be configured to use +Wired Equivalent Privacy (WEP) or +Wi-Fi Protected Access (WPA-PSK and WPA2-PSK). +WPA is the de facto encryption standard for wireless networks. +It is strongly recommended that WEP +not be used as the sole mechanism +to secure wireless communication, +due to serious weaknesses in it. +The +.Nm +driver offloads both encryption and decryption of data frames to the +hardware for the WEP40, WEP104, TKIP(+MIC) and CCMP ciphers. +.Pp +The +.Nm +driver can be configured at runtime with +.Xr ifconfig 8 +or on boot with +.Xr hostname.if 5 . +.Sh HARDWARE +The following adapters should work: +.Pp +.Bl -tag -width Ds -offset indent -compact +.It Airlink101 AWLL6090 +.It ASUS USB-N11 +.It ASUS USB-N13 +.It ASUS WL-160N +.It Belkin F5D8051 ver 3000 +.It Belkin F5D8053 +.It Belkin F5D8055 +.It Belkin F6D4050 ver 1 +.It Buffalo WLI-UC-AG300N +.It Buffalo WLI-UC-G300N +.It Buffalo WLI-UC-GN +.It Corega CG-WLUSB2GNL +.It Corega CG-WLUSB2GNR +.It Corega CG-WLUSB300AGN +.It Corega CG-WLUSB300GNM +.It D-Link DWA-130 rev B1 +.It D-Link DWA-140 +.It DrayTek Vigor N61 +.It Edimax EW-7711UAn +.It Edimax EW-7711UTn +.It Edimax EW-7717Un +.It Edimax EW-7718Un +.It Gigabyte GN-WB30N +.It Gigabyte GN-WB31N +.It Gigabyte GN-WB32L +.It Hawking HWDN1 +.It Hawking HWUN1 +.It Hawking HWUN2 +.It Hercules HWNU-300 +.It Linksys WUSB54GC v3 +.It Linksys WUSB600N +.It Mvix Nubbin MS-811N +.It Planex GW-USMicroN +.It Planex GW-US300MiniS +.It Sitecom WL-182 +.It Sitecom WL-188 +.It Sitecom WL-301 +.It Sitecom WL-302 +.It Sitecom WL-315 +.It SMC SMCWUSBS-N2 +.It Sweex LW303 +.It Sweex LW313 +.It Unex DNUR-81 +.It Unex DNUR-82 +.It ZyXEL NWD210N +.It ZyXEL NWD270N +.El +.Sh EXAMPLES +Join an existing BSS network (i.e., connect to an access point): +.Pp +.Bd -literal -offset indent +ifconfig wlan create wlandev run0 inet 192.168.0.20 \e + netmask 0xffffff00 +.Ed +.Pp +Join a specific BSS network with network name +.Dq Li my_net : +.Pp +.Dl "ifconfig wlan create wlandev run0 ssid my_net up" +.Pp +Join a specific BSS network with 64-bit WEP encryption: +.Bd -literal -offset indent +ifconfig wlan create wlandev run0 ssid my_net \e + wepmode on wepkey 0x1234567890 weptxkey 1 up +.Ed +.Pp +Join a specific BSS network with 128-bit WEP encryption: +.Bd -literal -offset indent +ifconfig wlan create wlandev run0 wlanmode adhoc ssid my_net \e + wepmode on wepkey 0x01020304050607080910111213 weptxkey 1 +.Ed +.Sh DIAGNOSTICS +.Bl -diag +.It "run%d: error %d, could not read firmware %s" +For some reason, the driver was unable to read the microcode file from the +filesystem. +The file might be missing or corrupted. +.It "run%d: could not load 8051 microcode" +An error occurred while attempting to upload the microcode to the onboard 8051 +microcontroller unit. +.It "run%d: device timeout" +A frame dispatched to the hardware for transmission did not complete in time. +The driver will reset the hardware. +This should not happen. +.El +.Sh SEE ALSO +.Xr intro 4 , +.Xr netintro 4 , +.Xr usb 4 , +.Xr wlan 4 , +.Xr wlan_amrr 4 , +.Xr wlan_ccmp 4 , +.Xr wlan_tkip 4 , +.Xr wlan_wep 4 , +.Xr wlan_xauth 4 , +.Xr ifconfig 8 , +.Xr hostapd 8 , +.Xr wpa_supplicant 8 . +.Pp +Ralink Technology: +.Pa http://www.ralinktech.com/ +.Sh HISTORY +The +.Nm +driver first appeared in +.Ox 4.5 . +.Sh AUTHORS +The +.Nm +driver was written by +.An Damien Bergamini Aq damien@openbsd.org . +.Sh CAVEATS +The +.Nm +driver does not support any of the 802.11n capabilities offered by the +RT2800 and RT3000 chipsets. diff --git a/share/man/man4/sbp_targ.4 b/share/man/man4/sbp_targ.4 index 112838074831..f9c58ef366c5 100644 --- a/share/man/man4/sbp_targ.4 +++ b/share/man/man4/sbp_targ.4 @@ -38,16 +38,24 @@ .Nm sbp_targ .Nd Serial Bus Protocol 2 (SBP-2) Target Mode devices driver .Sh SYNOPSIS -.Cd "kldload firewire" -.Cd "kldload cam" -.Cd "kldload sbp_targ" -.Pp -or -.Pp +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent .Cd "device sbp_targ" .Cd "device firewire" .Cd "device scbus" .Cd "device targ" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following lines in +.Xr loader.conf 5 : +.Bd -literal -offset indent +firewire_load="YES" +cam_load="YES" +sbp_targ_load"YES" +.Ed .Sh DESCRIPTION The .Nm diff --git a/share/man/man4/man4.i386/scd.4 b/share/man/man4/scd.4 similarity index 99% rename from share/man/man4/man4.i386/scd.4 rename to share/man/man4/scd.4 index daefa3c259d6..dbbb18f35133 100644 --- a/share/man/man4/man4.i386/scd.4 +++ b/share/man/man4/scd.4 @@ -27,7 +27,7 @@ .\" $FreeBSD$ .\" .Dd March 17, 2008 -.Dt SCD 4 i386 +.Dt SCD 4 .Os .Sh NAME .Nm scd diff --git a/share/man/man4/sctp.4 b/share/man/man4/sctp.4 index d5f4d3c5b318..975192c44ada 100644 --- a/share/man/man4/sctp.4 +++ b/share/man/man4/sctp.4 @@ -154,8 +154,8 @@ also supports the following extensions: This extension allows one to have message be skipped and not delivered based on some user specified parameters. .It "sctp dynamic addressing" - This extension allows addresses to be added and deleted -dynammically from an existing association. +This extension allows addresses to be added and deleted +dynamically from an existing association. .It "sctp authentication" This extension allows the user to authenticate specific peer chunks (including data) to validate that the peer @@ -164,7 +164,7 @@ association. A shared key option is also provided for so that two stacks can pre-share keys. .It "packet drop" - Some routers support a special satellite protocol that +Some routers support a special satellite protocol that will report losses due to corruption. This allows retransmissions without subsequent loss in bandwidth utilization. @@ -179,7 +179,7 @@ supports a number of socket options which can be set with and tested with .Xr getsockopt 2 or -.Xr sctp_opt_info 2 : +.Xr sctp_opt_info 3 : .Bl -tag -width ".Dv SCTP_SET_PEER_PRIMARY_ADDR" .It Dv SCTP_NODELAY Under most circumstances, diff --git a/share/man/man4/sf.4 b/share/man/man4/sf.4 index 520e4aeb14b0..ce943f8ad40f 100644 --- a/share/man/man4/sf.4 +++ b/share/man/man4/sf.4 @@ -197,7 +197,7 @@ the network connection (cable). .Xr ifconfig 8 .Rs .%T The Adaptec AIC-6915 Programmer's Manual -.%O http://download.adaptec.com/pdfs/user_guides/aic6915_pg.pdf +.%U http://download.adaptec.com/pdfs/user_guides/aic6915_pg.pdf .Re .Sh HISTORY The diff --git a/share/man/man4/siba.4 b/share/man/man4/siba.4 new file mode 100644 index 000000000000..288a13f1a145 --- /dev/null +++ b/share/man/man4/siba.4 @@ -0,0 +1,90 @@ +.\" Copyright (c) 2010 Weongyo Jeong +.\" 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$ +.\" +.Dd January 8, 2010 +.Dt SIBA 4 +.Os +.Sh NAME +.Nm siba +.Nd Sonic Inc. Silicon Backplane driver +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your kernel configuration file: +.Bd -ragged -offset indent +.Cd "device siba" +.Ed +.Pp +Alternatively, to load the driver as a module at boot time, +place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +siba_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver supports the Sonic Inc. Silicon Backplane, the interblock +communications architecture that can be found in most Broadcom +wireless NICs. +.Pp +A bus connects all of the Silicon Backplane's functional blocks. +These functional blocks, known as cores, use the Open Core Protocol +(OCP) interface to communicate with agents attached to the Silicon +Backplane. +.Pp +Each NIC uses a chip from the same chip family. +Each member of the family contains a different set of cores, but +shares basic architectural features such as address space definition, +interrupt and error architecture, and backplane register definitions. +.Pp +Each core can have an initiator agent that passes read and write +requests onto the system backplane and a target agent that returns +responses to those requests. +Not all cores contain both an initiator and a target agent. +Initiator agents are present in cores that contain +host interfaces (PCI, PCMCIA), embedded processors (MIPS), +or DMA processors associated with communications cores. +.Pp +All cores other than PCMCIA have a target agent. +.Sh SEE ALSO +.Xr bwn 4 +.Sh HISTORY +The +.Nm +device driver first appeared in +.Fx 8.0 . +.Sh AUTHORS +.An -nosplit +The +.Nm +driver was written by +.An Bruce M. Simpson +.Aq bms@FreeBSD.org +and +.An Weongyo Jeong +.Aq weongyo@FreeBSD.org . +.Sh CAVEATS +Host mode is not supported at this moment. diff --git a/share/man/man4/siis.4 b/share/man/man4/siis.4 index ab67cbca4c65..8f70839492f7 100644 --- a/share/man/man4/siis.4 +++ b/share/man/man4/siis.4 @@ -48,12 +48,13 @@ module at boot time, place the following line in siis_load="YES" .Ed .Pp -The following tunables are settable from the loader: +The following tunables are settable from the +.Xr loader 8 : .Bl -ohang -.It Va hint.siis.X.msi +.It Va hint.siis. Ns Ar X Ns Va .msi controls Message Signaled Interrupts (MSI) usage by the specified controller. -.It Va hint.siisch.X.pm_level -controls SATA interface Power Management for specified channel, +.It Va hint.siisch. Ns Ar X Ns Va .pm_level +controls SATA interface Power Management for the specified channel, allowing some power to be saved at the cost of additional command latency. Possible values: @@ -65,13 +66,15 @@ device is allowed to initiate PM state change, host is passive. .El Note that interface Power Management is not compatible with device presence detection. -You will have to reset bus manually on device hot-plug. -.It Va hint.siisch.X.sata_rev +A manual bus reset is needed on device hot-plug. +.It Va hint.siisch. Ns Ar X Ns Va .sata_rev setting to nonzero value limits maximum SATA revision (speed). Values 1, 2 and 3 are respectively 1.5, 3 and 6Gbps. .El .Sh DESCRIPTION -This driver provides the CAM subsystem native access to the +This driver provides the +.Xr CAM 4 +subsystem with native access to the .Tn SATA ports of controller. Each SATA port is represented to CAM as a separate bus with 16 targets. @@ -90,14 +93,15 @@ Port Multipliers (including FIS-based switching), hardware command queues (31 command per port), Native Command Queuing, SATA interface Power Management, device hot-plug and Message Signaled Interrupts. .Pp -Same hardware is also supported by atasiliconimage driver from +Same hardware is also supported by the atasiliconimage driver from .Xr ata 4 -subsystem. If both drivers are loaded at the same time, this one will be +subsystem. +If both drivers are loaded at the same time, this one will be given precedence as the more functional of the two. .Sh HARDWARE The .Nm -driver supports following controllers: +driver supports the following controllers: .Bl -bullet -compact .It SiI3124 @@ -108,11 +112,11 @@ SiI3531 .El .Sh SEE ALSO .Xr ada 4 , +.Xr ata 4 , .Xr cd 4 , .Xr da 4 , .Xr sa 4 , -.Xr scsi 4 , -.Xr ata 4 +.Xr scsi 4 .Sh HISTORY The .Nm diff --git a/share/man/man4/sis.4 b/share/man/man4/sis.4 index a9129412b145..6ee0c6af012d 100644 --- a/share/man/man4/sis.4 +++ b/share/man/man4/sis.4 @@ -193,11 +193,11 @@ the card should be configured correctly. .Xr ifconfig 8 .Rs .%T SiS 900 and SiS 7016 datasheets -.%O http://www.sis.com.tw +.%U http://www.sis.com.tw .Re .Rs .%T NatSemi DP83815 datasheet -.%O http://www.national.com +.%U http://www.national.com .Re .Sh HISTORY The diff --git a/share/man/man4/sk.4 b/share/man/man4/sk.4 index 6501905780ae..d25c439d1058 100644 --- a/share/man/man4/sk.4 +++ b/share/man/man4/sk.4 @@ -247,11 +247,11 @@ the network connection (cable). .Xr ifconfig 8 .Rs .%T XaQti XMAC II datasheet -.%O http://www.xaqti.com +.%U http://www.xaqti.com .Re .Rs .%T SysKonnect GEnesis programming manual -.%O http://www.syskonnect.com +.%U http://www.syskonnect.com .Re .Sh HISTORY The diff --git a/share/man/man4/smbus.4 b/share/man/man4/smbus.4 index 9dda4646b743..1d23117f0ac6 100644 --- a/share/man/man4/smbus.4 +++ b/share/man/man4/smbus.4 @@ -67,7 +67,7 @@ between the internal SMB devices and external ACCESS bus devices. .Xr smb 4 .Rs .%T The SMBus specification -.%O http://www.smbus.org/specs/ +.%U http://www.smbus.org/specs/ .Re .Sh HISTORY The diff --git a/share/man/man4/snd_hda.4 b/share/man/man4/snd_hda.4 index dacc5146be70..cdb1503c1cd7 100644 --- a/share/man/man4/snd_hda.4 +++ b/share/man/man4/snd_hda.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 7, 2009 +.Dd January 22, 2010 .Dt SND_HDA 4 .Os .Sh NAME @@ -59,7 +59,7 @@ driver that allows the generic audio driver, to be used with this hardware. Only audio functions are supported by .Nm . -Modem, HDMI and other possible functions are not implemented. +Modem and other possible functions are not implemented. .Pp The .Nm @@ -125,12 +125,14 @@ such as .Dq Li nofixedrate , will do the opposite and takes precedence. Options can be separated by whitespace and commas. +.Pp .Dq Li GPIO Ns s are a codec's General Purpose I/O pins which system integrators sometimes use to control external muters, amplifiers and so on. If you have no sound, or sound volume is not adequate, you may have to experiment a bit with the GPIO setup to find the optimal setup for your system. +.Pp The .Dq Li ivref Ns Ar X and @@ -178,6 +180,11 @@ A unique, per-association number used to order pins inside the particular association. Sequence numbers can be specified as numeric values from 0 to 15. .Pp +For output assotiations sequence numbers encode speaker pairs positions: +0 - Front, 1 - Center/LFE, 2 - Back, 3 - Front Wide Center, 4 - Side. +Standard combinations are: (0) - Stereo; (0, 2), (0, 4) - Quadro; +(0, 1, 2), (0, 1, 4) - 5.1; (0, 1, 2, 4) - 7.1. +.Pp The sequence number 15 has a special meaning for output associations. Output pins with this number and device type .Dq Ar Headphones @@ -452,6 +459,42 @@ mic and line-in) and headset (headphones and mic) at front connectors. .Li pcm1 for internal speaker playback. On headphones connection rear connectors will be muted. +.Sh MIXER CONTROLS +Depending on codec configuration, these controls and signal sources could be +reported to +.Xr sound 4 : +.Pp +.Bl -tag -width ".Va speaker" -offset indent +.It Va vol +overall output level (volume) +.It Va rec +overall recording level +.It Va igain +input-to-output monitoring loopback level +.It Va ogain +external amplifier control +.It Va pcm +PCM playback +.It Va mix +input mix +.It Va mic +first external or second internal microphone input +.It Va monitor +first internal or second external microphone input +.It Va line , Va line1 , Va line2, Va line3 +analog (line) inputs +.It Va dig1 , Va dig2 , Va dig3 +digital (S/PDIF, HDMI or DisplayPort) inputs +.It Va cd +CD input +.It Va speaker +PC speaker input +.It Va phin , Va phout , Va radio . Va video +other random inputs +.El +.Pp +Controls have different precision. Some could be just an on/off triggers. +Most of controls use logarithmic scale. .Sh HARDWARE The .Nm @@ -500,6 +543,14 @@ nVidia MCP68 .It nVidia MCP69 .It +nVidia MCP73 +.It +nVidia MCP78 +.It +nVidia MCP79 +.It +nVidia MCP89 +.It SiS 966 .It VIA VT8251/8237A @@ -626,5 +677,8 @@ trying to fix problem that way, make sure that problem is really exists and the PCM audio device you are using really corresponds to expected audio connector. .Pp -Due to OSS limitation multichannel (not multidevice) playback is not -supported. +Some vendors use non-standardized General Purpose I/O (GPIO) pins of codec +to control external amplifiers. In some cases setting proper combination of +GPIO bits may be needed to make sound work on specific device. +.Pp +HDMI and DisplayPort audio may also require support from video driver. diff --git a/share/man/man4/snd_uaudio.4 b/share/man/man4/snd_uaudio.4 index 3cc9d124af19..d05019c3a18d 100644 --- a/share/man/man4/snd_uaudio.4 +++ b/share/man/man4/snd_uaudio.4 @@ -78,7 +78,7 @@ for more information. .Xr usb 4 .Rs .%T "USB Audio Class Specifications" -.%O http://www.usb.org/developers/devclass_docs/ +.%U http://www.usb.org/developers/devclass_docs/ .Re .Sh HISTORY The diff --git a/share/man/man4/ste.4 b/share/man/man4/ste.4 index 1e652df8df6f..fabef6d19842 100644 --- a/share/man/man4/ste.4 +++ b/share/man/man4/ste.4 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 16, 2005 +.Dd December 24, 2009 .Dt STE 4 .Os .Sh NAME @@ -126,6 +126,23 @@ D-Link DFE-550TX .It D-Link DFE-580TX .El +.Sh SYSCTL VARIABLES +The following variables are available as both +.Xr sysctl 8 +variables and +.Xr loader 8 +tunables: +.Bl -tag -width "xxxxxx" +.It Va dev.ste.%d.int_rx_mod +Maximum number of time to delay RX interrupts. +The valid range is 0 to 209712 in units of 1us, the default is +150 (150us). +The value 0 effectively disables the RX interrupt moderation. +The resolution of of timer is about 3.2us so finer tuning than +3.2us wouldn't be available. +The interface does not need to be brought down and up again before +a change takes effect. +.El .Sh DIAGNOSTICS .Bl -diag .It "ste%d: couldn't map ports/memory" @@ -171,10 +188,11 @@ the card should be configured correctly. .Xr netintro 4 , .Xr ng_ether 4 , .Xr polling 4 , +.Xr vlan 4 , .Xr ifconfig 8 .Rs .%T Sundance ST201 data sheet -.%O http://www.sundanceti.com +.%U http://www.sundanceti.com .Re .Sh HISTORY The diff --git a/share/man/man4/sysmouse.4 b/share/man/man4/sysmouse.4 index f4392582df96..50392a101355 100644 --- a/share/man/man4/sysmouse.4 +++ b/share/man/man4/sysmouse.4 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 3, 1997 +.Dd January 16, 2010 .Dt SYSMOUSE 4 .Os .Sh NAME @@ -467,7 +467,7 @@ virtual consoles .Sh HISTORY The .Nm -manual page example first appeared in +driver first appeared in .Fx 2.2 . .Sh AUTHORS .An -nosplit diff --git a/share/man/man4/targ.4 b/share/man/man4/targ.4 index a1fa449d0f07..5e78200993f1 100644 --- a/share/man/man4/targ.4 +++ b/share/man/man4/targ.4 @@ -31,7 +31,12 @@ .Nm targ .Nd SCSI target emulator driver .Sh SYNOPSIS -.Cd device targ +To compile this driver into the kernel, +place the following line in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device targ" +.Ed .Sh DESCRIPTION The .Nm @@ -128,7 +133,7 @@ are the control devices. .Xr scsi 4 .Rs .%T "FreeBSD Target Information" -.%O http://www.root.org/~nate/freebsd/ +.%U http://www.root.org/~nate/freebsd/ .Re .Sh AUTHORS .An -nosplit diff --git a/share/man/man4/termios.4 b/share/man/man4/termios.4 index cda167312353..5e589b102ff9 100644 --- a/share/man/man4/termios.4 +++ b/share/man/man4/termios.4 @@ -32,7 +32,7 @@ .\" @(#)termios.4 8.4 (Berkeley) 4/19/94 .\" $FreeBSD$ .\" -.Dd August 20, 2008 +.Dd December 26, 2009 .Dt TERMIOS 4 .Os .Sh NAME @@ -1577,3 +1577,10 @@ after is set according to the values in the header .In sys/ttydefaults.h . +.Sh SEE ALSO +.Xr stty 1 , +.Xr tcgetsid 3 , +.Xr tcsendbreak 3 , +.Xr tcsetattr 3 , +.Xr tcsetsid 3 , +.Xr tty 4 diff --git a/share/man/man4/tnt4882.4 b/share/man/man4/tnt4882.4 new file mode 100644 index 000000000000..d95ff8981cf2 --- /dev/null +++ b/share/man/man4/tnt4882.4 @@ -0,0 +1,55 @@ +.\" Copyright (c) 2010, Joerg Wunsch +.\" 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$ +.\" +.Dd January 24, 2010 +.Dt TNT4882 4 +.Os +.Sh NAME +.Nm tnt4882 +.Nd National Instruments TNT4882A GPIB controller driver +.Sh SYNOPSIS +.Cd "device tnt4882" +.Sh DESCRIPTION +The +.Nm +driver provides support for driving an IEEE-488 bus, also called +IEC-625 (or just "IEC bus"), or HP-IB (Hewlett Packard Instrument +Bus), or GPIB (General Purpose Instrument Bus). +The driver supports National Instruments PCI GPIB cards using +the TNT4882 bus interface chip. +This chip emulates a NEC \(mcPD7210 controller IC as the main +interface between the host computer and the instrument bus. +.Sh SEE ALSO +.Xr gpib 3 , +.Xr gpib 4 , +.Sh HISTORY +The +.Nm +driver was written by Poul-Henning Kamp, and first appeared in +.Fx 5.4 . +.Sh AUTHORS +This manual page was written by +.An J\(:org Wunsch . diff --git a/share/man/man4/tty.4 b/share/man/man4/tty.4 index ba0379eb09a2..6e7c8527684f 100644 --- a/share/man/man4/tty.4 +++ b/share/man/man4/tty.4 @@ -32,7 +32,7 @@ .\" @(#)tty.4 8.3 (Berkeley) 4/19/94 .\" $FreeBSD$ .\" -.Dd Jun 27, 2007 +.Dd December 26, 2009 .Dt TTY 4 .Os .Sh NAME @@ -88,47 +88,6 @@ The remainder of this man page is concerned with describing details of using and controlling terminal devices at a low level, such as that possibly required by a program wishing to provide features similar to those provided by the system. -.Ss Line disciplines -A terminal file is used like any other file in the system in that -it can be opened, read, and written to using standard system -calls. -For each existing terminal file, there is a software processing module -called a -.Em "line discipline" -is associated with it. -The -.Em "line discipline" -essentially glues the low level device driver code with the high -level generic interface routines (such as -.Xr read 2 -and -.Xr write 2 ) , -and is responsible for implementing the semantics associated -with the device. -When a terminal file is first opened by a program, the default -.Em "line discipline" -called the -.Dv termios -line discipline is associated with the file. -This is the primary -line discipline that is used in most cases and provides the semantics -that users normally associate with a terminal. -When the -.Dv termios -line discipline is in effect, the terminal file behaves and is -operated according to the rules described in -.Xr termios 4 . -Please refer to that man page for a full description of the terminal -semantics. -The operations described here -generally represent features common -across all -.Em "line disciplines" , -however some of these calls may not -make sense in conjunction with a line discipline other than -.Dv termios , -and some may not be supported by the underlying -hardware (or lack thereof, as in the case of ptys). .Ss Terminal File Operations All of the following operations are invoked using the .Xr ioctl 2 @@ -154,39 +113,24 @@ parameter (if any) are listed. For example, the first entry says .Pp -.D1 Em "TIOCSETD int *ldisc" +.D1 Em "TIOCSPGRP int *tpgrp" .Pp and would be called on the terminal associated with file descriptor zero by the following code fragment: .Bd -literal - int ldisc; + int pgrp; - ldisc = TTYDISC; - ioctl(0, TIOCSETD, &ldisc); + pgrp = getpgrp(); + ioctl(0, TIOCSPGRP, &pgrp); .Ed .Ss Terminal File Request Descriptions .Bl -tag -width TIOCGWINSZ .It Dv TIOCSETD Fa int *ldisc -Change to the new line discipline pointed to by +This call is obsolete but left for compatibility. +Before +.Fx 8.0 , +it would change to the new line discipline pointed to by .Fa ldisc . -The available line disciplines are listed in -.In sys/ttycom.h -and currently are: -.Pp -.Bl -tag -width NETGRAPHDISC -compact -.It TTYDISC -Termios interactive line discipline. -.It TABLDISC -Tablet line discipline. -.It SLIPDISC -Serial IP line discipline. -.It PPPDISC -PPP line discipline. -.It NETGRAPHDISC -Netgraph -.Xr ng_tty 4 -line discipline. -.El .Pp .It Dv TIOCGETD Fa int *ldisc Return the current line discipline in the integer pointed to by diff --git a/share/man/man4/u3g.4 b/share/man/man4/u3g.4 index 2b63c5e124cf..47a34a117aee 100644 --- a/share/man/man4/u3g.4 +++ b/share/man/man4/u3g.4 @@ -76,7 +76,7 @@ Sierra MC875U, MC8775U, etc. for the complete list of supported cards for each vendor mentioned above.) .Pp -The supported 3G cards provide the necessary modem port for ppp, pppd, or mpd +The supported 3G cards provide the necessary modem port for ppp, or mpd connections as well as extra ports (depending on the specific device) to provide other functions (additional command port, diagnostic port, SIM toolkit port). diff --git a/share/man/man4/uart.4 b/share/man/man4/uart.4 index be9d70031d5f..7bd4732f0139 100644 --- a/share/man/man4/uart.4 +++ b/share/man/man4/uart.4 @@ -28,11 +28,9 @@ .Dd March 12, 2008 .Dt UART 4 .Os -.\" .Sh NAME .Nm uart .Nd driver for Universal Asynchronous Receiver/Transmitter (UART) devices -.\" .Sh SYNOPSIS .Cd "device uart" .Pp @@ -42,7 +40,6 @@ .Cd "device scc" .Cd "device uart" .Pp -.Bd -ragged offset -compact In .Pa /boot/device.hints : .Cd hint.uart.0.disabled="1" diff --git a/share/man/man4/ucom.4 b/share/man/man4/ucom.4 index 5d531e43c7b2..c060cacace6e 100644 --- a/share/man/man4/ucom.4 +++ b/share/man/man4/ucom.4 @@ -68,7 +68,7 @@ driver shows a behavior like a This means that normal programs such as .Xr tip 1 or -.Xr pppd 8 +.Xr ppp 8 can be used to access the device. .Pp The diff --git a/share/man/man4/udav.4 b/share/man/man4/udav.4 index dcd0b8bf6834..d970143ac745 100644 --- a/share/man/man4/udav.4 +++ b/share/man/man4/udav.4 @@ -87,7 +87,7 @@ For more information on configuring this device, see .Xr ifconfig 8 .Rs .%T "Davicom DM9601 data sheet" -.%O http://www.davicom.com.tw/big5/download/Data%20Sheet/DM9601-DS-P01-930914.pdf +.%U http://www.davicom.com.tw/big5/download/Data%20Sheet/DM9601-DS-P01-930914.pdf .Re .Sh HISTORY The diff --git a/share/man/man4/uhso.4 b/share/man/man4/uhso.4 new file mode 100644 index 000000000000..7f10c6212a37 --- /dev/null +++ b/share/man/man4/uhso.4 @@ -0,0 +1,126 @@ +.\" Copyright (c) 2009 Fredrik Lindberg +.\" 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 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$ +.\" +.Dd January 14, 2010 +.Os +.Dt UHSO 4 +.Sh NAME +.Nm uhso +.Nd support for several HSxPA devices from Option N.V. +.Sh SYNOPSIS +The module can be loaded at boot time by placing the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +uhso_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +driver provides support for several HSxPA devices from Option N.V. that are +based on their packet interface. +Each device has a set of serial ports and a raw IP packet interface. +The serial ports of the device are accessed through the +.Xr ucom 4 +driver which makes them behave like a +.Xr tty 4 . +The packet interface is exposed as a network interface. +.Pp +Establishing a connection on the packet interface is achieved by using the +proprietary AT commands +.Dq Li AT_OWANCALL +and +.Dq Li AT_OWANDATA +on any of the available serial ports. +.Pp +The network interface must be configured manually using the data obtain from +these calls. +.Pp +Each device usually have at least two or more serial ports, their individual purpose +can be identified through +.Xr sysctl 8 . +.Sh HARDWARE +The +.Nm +driver supports at least the following cards +.Pp +.Bl -bullet -compact +.It +Option GlobeSurfer iCON 7.2 (new firmware) +.It +Option iCON 225 +.It +Option iCON 505 +.El +.Pp +The device features a mass storage device referred to as +.Dq Zero-CD +which contains drivers for Microsoft Windows; this is the default +mode for the device. +The +.Nm +driver automatically switches the device from +.Dq Zero-CD +mode to modem mode. +This behavior can be disabled by setting +.Va hw.usb.uhso.auto_switch +to 0 using +.Xr sysctl 8 +.Sh EXAMPLES +Establishing a packet interface connection +.Bd -literal -offset indent +AT+CGDCONT=1,,"apn.provider" +AT_OWANCALL=1,1,1 +OK +_OWANCALL=1,1 + +AT_OWANDATA=1 +_OWANDATA: 1, 10.11.12.13, 0.0.0.0, 10.2.3.4, 10.2.3.5, \e + 0.0.0.0, 0.0.0.0, 72000 +.Ed +.Pp +Configuring the interface +.Bd -literal -offset indent +ifconfig uhso0 10.11.12.13 up +route add default -interface uhso0 +echo "nameserver 10.2.3.4" > /etc/resolv.conf +echo "nameserver 10.2.3.5" >> /etc/resolv.conf +.Ed +.Pp +The connection can be terminated with +.Bd -literal -offset indent +AT_OWANCALL=1,0,1 +.Ed +.Sh FILES +.Bl -tag -width "XXXXXX" +.It Pa /dev/cuaU?.? +.El +.Sh SEE ALSO +.Xr ucom 4 , +.Xr usb 4 +.Sh AUTHORS +The +.Nm +driver was written by +.An Fredrik Lindberg Aq fli@shapeshifter.se . diff --git a/share/man/man4/umass.4 b/share/man/man4/umass.4 index e1949caf8e54..56094cd57e0c 100644 --- a/share/man/man4/umass.4 +++ b/share/man/man4/umass.4 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 22, 2006 +.Dd October 22, 2009 .Dt UMASS 4 .Os .Sh NAME @@ -38,6 +38,8 @@ To compile this driver into the kernel, place the following line in your kernel configuration file: .Bd -ragged -offset indent +.Cd "device scbus" +.Cd "device usb" .Cd "device umass" .Ed .Pp diff --git a/share/man/man4/unix.4 b/share/man/man4/unix.4 index 89944ce7a7e2..97e797c2f9e2 100644 --- a/share/man/man4/unix.4 +++ b/share/man/man4/unix.4 @@ -32,7 +32,7 @@ .\" @(#)unix.4 8.1 (Berkeley) 6/9/93 .\" $FreeBSD$ .\" -.Dd July 15, 2001 +.Dd October 5, 2009 .Dt UNIX 4 .Os .Sh NAME @@ -52,7 +52,8 @@ mechanisms. The .Ux Ns -domain family supports the -.Dv SOCK_STREAM +.Dv SOCK_STREAM , +.Dv SOCK_SEQPACKET , and .Dv SOCK_DGRAM socket types and uses @@ -127,11 +128,14 @@ The .Ux Ns -domain protocol family is comprised of simple transport protocols that support the -.Dv SOCK_STREAM +.Dv SOCK_STREAM , +.Dv SOCK_SEQPACKET , and .Dv SOCK_DGRAM abstractions. .Dv SOCK_STREAM +and +.Dv SOCK_SEQPACKET sockets also support the communication of .Ux file descriptors through the use of the @@ -206,8 +210,9 @@ and tested with .Xr getsockopt 2 : .Bl -tag -width ".Dv LOCAL_CONNWAIT" .It Dv LOCAL_CREDS -This option may be enabled on a -.Dv SOCK_DGRAM +This option may be enabled on +.Dv SOCK_DGRAM , +.Dv SOCK_SEQPACKET , or a .Dv SOCK_STREAM socket. diff --git a/share/man/man4/ural.4 b/share/man/man4/ural.4 index c7251bca6fa3..053ae704a3c4 100644 --- a/share/man/man4/ural.4 +++ b/share/man/man4/ural.4 @@ -148,7 +148,7 @@ This should not happen. .Xr wpa_supplicant 8 . .Rs .%T "Ralink Technology" -.%O http://www.ralinktech.com/ +.%U http://www.ralinktech.com/ .Re .Sh HISTORY The diff --git a/share/man/man4/urio.4 b/share/man/man4/urio.4 index d42ff2a7fae6..7620deb659ee 100644 --- a/share/man/man4/urio.4 +++ b/share/man/man4/urio.4 @@ -106,7 +106,7 @@ section): .Xr usb 4 .Rs .%T The Rio 500 SourceForge Project Web Page -.%O http://rio500.sourceforge.net/ +.%U http://rio500.sourceforge.net/ .Re .Pp The Rio500 tools from SourceForge diff --git a/share/man/man4/urtw.4 b/share/man/man4/urtw.4 index c5a3ac5f4196..a3f27a017973 100644 --- a/share/man/man4/urtw.4 +++ b/share/man/man4/urtw.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 25, 2009 +.Dd October 17, 2009 .Dt URTW 4 .Os .Sh NAME @@ -70,9 +70,16 @@ driver supports Realtek RTL8187B/L based wireless network devices, including: .Pp .Bl -column "Shuttle XPC Accessory PN20" "RTL8225" "USB" -compact -offset 6n .It Em "Card Radio Bus" +.It "Belkin F5D7050E RTL8225 USB" +.It "Linksys WUSB54GCv2 RTL8225 USB" .It "Netgear WG111v2 RTL8225 USB" +.It "Netgear WG111v3 RTL8225 USB" .It "Safehome WLG-1500SMA5 RTL8225 USB" .It "Shuttle XPC Accessory PN20 RTL8225 USB" +.It "Sitecom WL168v1 RTL8225 USB" +.It "Sitecom WL168v4 RTL8225 USB" +.It "SureCom EP-9001-g(2A) RTL8225 USB" +.It "TRENDnet TEW-424UB V3.xR RTL8225 USB" .El .Sh EXAMPLES Join an existing BSS network (i.e., connect to an access point): @@ -104,7 +111,7 @@ ifconfig wlan create wlandev urtw0 ssid my_net \e .Xr wpa_supplicant 8 .Rs .%T Realtek -.%O http://www.realtek.com.tw +.%U http://www.realtek.com.tw .Re .Sh HISTORY The diff --git a/share/man/man4/vge.4 b/share/man/man4/vge.4 index 2e9c7a574889..f6ce47c85b99 100644 --- a/share/man/man4/vge.4 +++ b/share/man/man4/vge.4 @@ -30,12 +30,12 @@ .\" .\" $FreeBSD$ .\" -.Dd February 21, 2007 +.Dd December 18, 2009 .Dt VGE 4 .Os .Sh NAME .Nm vge -.Nd "VIA Networking Technologies VT6122 PCI Gigabit Ethernet adapter driver" +.Nd "VIA Networking Technologies Velocity Gigabit Ethernet adapter driver" .Sh SYNOPSIS To compile this driver into the kernel, place the following lines in your @@ -55,22 +55,23 @@ if_vge_load="YES" The .Nm driver provides support for various NICs and embedded Ethernet interfaces -based on the VIA Networking Technologies VT6122 Gigabit Ethernet -controller chips. +based on the VIA Technologies VT6120, VT6122, VT6130 and VT6132 Velocity +Family Gigabit Ethernet controller chips. .Pp -The VT6122 is a 33/66Mhz 64-bit PCI device which combines a tri-speed MAC with -an integrated 10/100/1000 copper PHY. +The VT6120/VT6122 is a 33/66MHz 64-bit PCI device which combines a tri-speed +MAC with an integrated 10/100/1000 copper PHY. (Some older cards use an external PHY.) +The VT6130/VT6132 is the PCI express version of Velocity family. The MAC supports TCP/IP hardware checksums (IPv4 only), TCP large send, VLAN tag insertion and stripping, as well as VLAN filtering, a 64-entry CAM filter and a 64-entry VLAN filter, 64-bit multicast hash filter, 4 separate transmit DMA queues, flow control and jumbo frames up to 16K in size. -The VT6122 has a 16K receive FIFO and 48K transmit FIFO. +The Velocity family controllers have a 16K receive FIFO and 48K transmit FIFO. .Pp The .Nm -driver takes advantage of the VT6122's checksum offload and VLAN +driver takes advantage of the controller's checksum offload and VLAN tagging features, as well as the jumbo frame and CAM filter support. The CAM filter is used for multicast address filtering to provide 64 perfect multicast address filter support. @@ -162,7 +163,7 @@ For more information on configuring this device, see .Sh HARDWARE The .Nm -driver supports VIA Networking VT3119 and VT6122 based +driver supports VIA Networking VT6120, VT6122, VT6130 and VT6132 based Gigabit Ethernet adapters including: .Pp .Bl -bullet -compact @@ -173,6 +174,38 @@ ZyXEL GN650-T 64-bit PCI Gigabit Ethernet NIC (ZX1701) .It ZyXEL GN670-T 32-bit PCI Gigabit Ethernet NIC (ZX1702) .El +.Sh LOADER TUNABLES +Tunables can be set at the +.Xr loader 8 +prompt before booting the kernel or stored in +.Xr loader.conf 5 . +.Bl -tag -width "xxxxxx" +.It Va hw.vge.msi_disable +This tunable disables MSI support on the Ethernet hardware. +The default value is 0. +.El +.Sh SYSCTL VARIABLES +The following variables are available as both +.Xr sysctl 8 +variables and +.Xr loader 8 +tunables: +.Bl -tag -width "xxxxxx" +.It Va dev.vge.%d.int_holdoff +Maximum number of time to delay interrupts. +The valid range is 0 to 5100 in units of 1us, the default is +150 (150us). +The resolution of of timer is about 20us so finer tuning than +20us wouldn't be available. +The interface should be brought down and up again before a change +takes effect. +.It Va dev.vge.%d.rx_coal_pkt +Maximum number of packets to fire Rx completion interrupt. +The valid range is 1 to 255, the default is 64. +.It Va dev.vge.%d.tx_coal_pkt +Maximum number of packets to fire Tx completion interrupt. +The valid range is 1 to 255, the default is 128. +.El .Sh DIAGNOSTICS .Bl -diag .It "vge%d: couldn't map memory" diff --git a/share/man/man4/man4.i386/viapm.4 b/share/man/man4/viapm.4 similarity index 99% rename from share/man/man4/man4.i386/viapm.4 rename to share/man/man4/viapm.4 index 7457952950f1..851c1fc79229 100644 --- a/share/man/man4/man4.i386/viapm.4 +++ b/share/man/man4/viapm.4 @@ -25,7 +25,7 @@ .\" $FreeBSD$ .\" .Dd April 20, 2002 -.Dt VIAPM 4 i386 +.Dt VIAPM 4 .Os .Sh NAME .Nm viapm diff --git a/share/man/man4/vr.4 b/share/man/man4/vr.4 index c1ec7d1e81f7..4839c30a3100 100644 --- a/share/man/man4/vr.4 +++ b/share/man/man4/vr.4 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 11, 2008 +.Dd February 7, 2010 .Dt VR 4 .Os .Sh NAME @@ -130,6 +130,8 @@ Fast Ethernet adapters including: .It AOpen/Acer ALN-320 .It +D-Link DFE520-TX +.It D-Link DFE530-TX .It Hawking Technologies PN102TX @@ -192,7 +194,7 @@ the card should be configured correctly. .Xr ifconfig 8 .Rs .%T The VIA Technologies VT86C100A data sheet -.%O http://www.via.com.tw +.%U http://www.via.com.tw .Re .Sh HISTORY The diff --git a/share/man/man4/watchdog.4 b/share/man/man4/watchdog.4 index f19f3a60f6ea..b0a52b179901 100644 --- a/share/man/man4/watchdog.4 +++ b/share/man/man4/watchdog.4 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 25, 2003 +.Dd December 21, 2009 .Dt WATCHDOG 4 .Os .Sh NAME @@ -62,8 +62,10 @@ The .Xr ioctl 2 call will return success if just one of the available .Xr watchdog 9 -implementations supports setting the timeout to the specified timeout. This -means that at least one watchdog is armed. If the call fails, for instance if +implementations supports setting the timeout to the specified timeout. +This +means that at least one watchdog is armed. +If the call fails, for instance if none of .Xr watchdog 9 implementations support the timeout length, all watchdogs are disabled and must @@ -71,19 +73,20 @@ be explicitly re-enabled. .Pp To disable the watchdogs pass .Dv WD_TO_NEVER . -If disarming the watchdog(s) failed an error is returned. The watchdog might +If disarming the watchdog(s) failed an error is returned. +The watchdog might still be armed! .Sh RETURN VALUES The ioctl returns zero on success and non-zero on failure. .Bl -tag -width Er .It Bq Er EOPNOTSUPP -No watchdog present in the kernel (timeout value other than 0). +No watchdog present in the kernel or +none of the watchdogs supports the requested timeout value +(timeout value other than 0). .It Bq Er EOPNOTSUPP Watchdog could not be disabled (timeout value of 0). -.It Bq Er EINVALID +.It Bq Er EINVAL Invalid flag combination passed. -.It Bq Er EINVALID -None of the watchdogs supports the requested timeout value. .El .Sh EXAMPLES .Bd -literal -offset indent @@ -94,7 +97,7 @@ None of the watchdogs supports the requested timeout value. int wdfd = -1; static void -wd_init(void) +wd_init(void) { wdfd = open(WDPATH, O_RDWR); if (wdfd == -1) @@ -116,9 +119,7 @@ wd_reset(WD_TO_NEVER); .Pp Enables a watchdog to recover from a potentially freezing piece of code. .Pp -.Bd -literal -offset indent -options SW_WATCHDOG -.Ed +.Dl "options SW_WATCHDOG" .Pp in your kernel config adds a software watchdog in the kernel, dropping to KDB or panic-ing when firing. @@ -130,10 +131,6 @@ The .Nm code first appeared in .Fx 5.1 . -.Sh BUGS -The -.Dv WD_PASSIVE -option has not yet been implemented. .Sh AUTHORS .An -nosplit The @@ -144,3 +141,7 @@ The software watchdog code and this manual page were written by .An Sean Kelly Aq smkelly@FreeBSD.org . Some contributions were made by .An Jeff Roberson Aq jeff@FreeBSD.org . +.Sh BUGS +The +.Dv WD_PASSIVE +option has not yet been implemented. diff --git a/share/man/man4/wi.4 b/share/man/man4/wi.4 index 68479aeea113..1c43b373575d 100644 --- a/share/man/man4/wi.4 +++ b/share/man/man4/wi.4 @@ -253,6 +253,7 @@ Join a specific BSS network with network name .Bd -literal -offset indent ifconfig wlan create wlandev wi0 inet 192.168.0.20 \e netmask 0xffffff00 ssid my_net +.Ed .Pp Join a specific BSS network with WEP encryption: .Bd -literal -offset indent @@ -320,7 +321,7 @@ command. .Xr wpa_supplicant 8 . .Rs .%T HCF Light programming specification -.%O http://www.wavelan.com +.%U http://www.wavelan.com .Re .Sh HISTORY The diff --git a/share/man/man4/wlan.4 b/share/man/man4/wlan.4 index c3a2b1663037..b685f34d5720 100644 --- a/share/man/man4/wlan.4 +++ b/share/man/man4/wlan.4 @@ -130,7 +130,10 @@ Similarly there is an authenticator framework for defining 802.11 authentication services and a framework for integrating access control mechanisms specific to the 802.11 protocol. .Sh DEBUGGING -Debugging controls are available using: +If the +.Dv IEEE80211_DEBUG +option is included in the kernel configuration, +debugging controls are available using: .Pp .Dl "sysctl net.wlan.X.debug=mask" .Pp diff --git a/share/man/man4/zyd.4 b/share/man/man4/zyd.4 index 15c63921674d..ba8f5737df6b 100644 --- a/share/man/man4/zyd.4 +++ b/share/man/man4/zyd.4 @@ -32,7 +32,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF .\" THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd November 1, 2008 +.Dd October 2, 2009 .Dt ZYD 4 .Os .Sh NAME @@ -113,7 +113,7 @@ driver: .It Sweex wireless USB 54 Mbps .It Tekram/Siemens USB adapter .It Telegent TG54USB -.It Trendnet TEW-424UB +.It Trendnet TEW-424UB rev A .It Trendnet TEW-429UB .It TwinMOS G240 .It Unicorn WL-54G diff --git a/share/man/man5/Makefile b/share/man/man5/Makefile index 615ebf1bc4a7..1216fc4491cc 100644 --- a/share/man/man5/Makefile +++ b/share/man/man5/Makefile @@ -68,7 +68,6 @@ MAN= acct.5 \ style.Makefile.5 \ sysctl.conf.5 \ tmpfs.5 \ - utmp.5 \ xfs.5 MLINKS= dir.5 dirent.5 @@ -79,7 +78,6 @@ MLINKS+=passwd.5 master.passwd.5 MLINKS+=quota.user.5 quota.group.5 MLINKS+=rc.conf.5 rc.conf.local.5 MLINKS+=resolver.5 resolv.conf.5 -MLINKS+=utmp.5 lastlog.5 utmp.5 wtmp.5 .if ${MK_HESIOD} != "no" MAN+= hesiod.conf.5 diff --git a/share/man/man5/ar.5 b/share/man/man5/ar.5 index 1796795398d0..58d2d788701b 100644 --- a/share/man/man5/ar.5 +++ b/share/man/man5/ar.5 @@ -23,7 +23,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 07, 2007 +.Dd September 7, 2007 .Os .Dt AR 5 .Sh NAME diff --git a/share/man/man5/devfs.rules.5 b/share/man/man5/devfs.rules.5 index cc641ec6e66a..8a7b3d665ab2 100644 --- a/share/man/man5/devfs.rules.5 +++ b/share/man/man5/devfs.rules.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 30, 2006 +.Dd February 21, 2010 .Dt DEVFS.RULES 5 .Os .Sh NAME @@ -83,8 +83,16 @@ devfs_system_ruleset="localrules" .Ed .Sh FILES .Bl -tag -compact -.It Pa /etc/devfs.rules .It Pa /etc/defaults/devfs.rules +Default +.Nm +configuration file. +.It Pa /etc/devfs.rules +Local +.Nm +configuration file. Rulesets in here override those in +.Pa /etc/defaults/devfs.rules +with the same ruleset number, otherwise the two files are effectively merged. .El .Sh EXAMPLES To make all the partitions of @@ -100,13 +108,15 @@ The first line declares and starts a new ruleset, with the name .Va localrules and the number 10. .Pp -To make all the -.Xr ulpt 4 -devices accessible to their owner and the +To give +.Xr usbconfig 8 +and +.Xr libusb 3 +enabled applications permission to all usb devices for their owner and the .Dq Li usb group, a similar rule may be used: .Pp -.Dl "add path 'ulpt*' mode 0660 group usb" +.Dl "add path 'usb/*' mode 0660 group usb" .Sh SEE ALSO .Xr glob 3 , .Xr devfs 5 , diff --git a/share/man/man5/make.conf.5 b/share/man/man5/make.conf.5 index a1428013e262..a6a32593e36d 100644 --- a/share/man/man5/make.conf.5 +++ b/share/man/man5/make.conf.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 1, 2009 +.Dd December 15, 2009 .Dt MAKE.CONF 5 .Os .Sh NAME @@ -318,6 +318,14 @@ Set this to use .Xr cvsup 1 to update your ports with .Dq Li "make update" . +.It Va WWWSUPFILE +.Pq Vt str +The www +.Ar supfile +to use when doing a +.Dq Li "make update" +This defaults to +.Pa /usr/share/examples/cvsup/www\-supfile . .El .Ss "BUILDING THE KERNEL" The following list provides a name and short description for variables @@ -361,6 +369,12 @@ It defaults to .It Va MODULES_OVERRIDE .Pq Vt str Set to a list of modules to build instead of all of them. +.It Va NO_KERNELCLEAN +.Pq Vt bool +Set this to skip running +.Dq Li "${MAKE} clean" +during +.Dq Li "${MAKE} buildkernel" . .It Va NO_KERNELCONFIG .Pq Vt bool Set this to skip running @@ -373,6 +387,12 @@ Set this to skip running .Dq Li "${MAKE} depend" during .Dq Li "${MAKE} buildkernel" . +.It Va NO_KERNELOBJ +.Pq Vt bool +Set this to skip running +.Dq Li "${MAKE} obj" +during +.Dq Li "${MAKE} buildkernel" . .It Va NO_MODULES .Pq Vt bool Set to not build modules with the kernel. diff --git a/share/man/man5/msdosfs.5 b/share/man/man5/msdosfs.5 index 9dd679c1b0c8..933577aeb5a2 100644 --- a/share/man/man5/msdosfs.5 +++ b/share/man/man5/msdosfs.5 @@ -2,7 +2,7 @@ .\" Written by Tom Rhodes .\" This file is in the public domain. .\" -.Dd Aug 22, 2007 +.Dd August 22, 2007 .Dt MSDOSFS 5 .Os .Sh NAME diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5 index bacd362a3c35..96f64d3928dc 100644 --- a/share/man/man5/rc.conf.5 +++ b/share/man/man5/rc.conf.5 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 23, 2009 +.Dd February 12, 2010 .Dt RC.CONF 5 .Os .Sh NAME @@ -351,6 +351,9 @@ If .Xr dhclient 8 is used to set the hostname via DHCP, this variable should be set to an empty string. +If this value remains unset when the system is done booting +your console login will display the default hostname of +.Dq Amnesiac. .It Va nisdomainname .Pq Vt str The NIS domain name of this host, or @@ -393,7 +396,7 @@ variable for interface .Ar iface only. .It Va synchronous_dhclient -.Pq Bt bool +.Pq Vt bool Set to .Dq Li YES to start @@ -504,6 +507,10 @@ specifies a filename. .Pq Vt str The IPv6 equivalent of .Va firewall_flags . +.It Va firewall_coscripts +.Pq Vt str +List of executables and/or rc scripts to run after firewall starts/stops. +Default is empty. .\" ----- firewall_nat_enable setting -------------------------------- .It Va firewall_nat_enable .Pq Vt bool @@ -1153,6 +1160,45 @@ and variables. .Pp If a +.Va vlans_ Ns Aq Ar interface +variable is set, +a +.Xr vlan 4 +interface will be created for each item in the list with the +.Ar vlandev +argument set to +.Ar interface . +If a vlan interface's name is a number, +then that number is used as the vlan tag and the new vlan interface is +named +.Ar interface . Ns Ar tag . +Otherwise, +the vlan tag must be specified via a +.Va vlan +parameter in the +.Va create_args_ Ns Aq Ar interface +variable. +.Pp +To create a vlan device named +.Li em0.101 +on +.Li em0 +with the vlan tag 101: +.Bd -literal +vlans_em0="101" +.Ed +.Pp +To create a vlan device named +.Li myvlan +on +.Li em0 +with the vlan tag 102: +.Bd -literal +vlans_em0="myvlan" +create_args_myvlan="vlan 102" +.Ed +.Pp +If a .Va wlans_ Ns Aq Ar interface variable is set, an @@ -1219,7 +1265,7 @@ Finally, you can add options in this variable, in addition to the .Pa /etc/start_if. Ns Aq Ar interface file. -For instance, configure an +For instance, to configure an .Xr ath 4 wireless device in station mode with an address obtained via DHCP, using WPA authentication and 802.11b mode, it is @@ -1241,7 +1287,7 @@ This is intended to replace the no longer supported .Va pccard_ifconfig variable. .Pp -It is also possible to rename interface by doing: +It is also possible to rename an interface by doing: .Bd -literal ifconfig_ed0_name="net0" ifconfig_net0="inet 192.0.2.1 netmask 0xffffff00" @@ -1352,6 +1398,12 @@ the IPv6-preferred one is used. Default is IPv4-preferred. .It Va cloned_interfaces .Pq Vt str Set to the list of clonable network interfaces to create on this host. +Further cloning arguments may be passed to the +.Xr ifconfig 8 +.Cm create +command for each interface by setting the +.Va create_args_ Ns Aq Ar interface +variable. Entries in .Va cloned_interfaces are automatically appended to @@ -1694,6 +1746,27 @@ is set to .Dq Li YES , these are the flags to pass to .Xr inetd 8 . +.It Va hastd_enable +.Pq Vt bool +If set to +.Dq Li YES , +run the +.Xr hastd 8 +daemon. +.It Va hastd_program +.Pq Vt str +Path to +.Xr hastd 8 +(default +.Pa /sbin/hastd ) . +.It Va hastd_flags +.Pq Vt str +If +.Va hastd_enable +is set to +.Dq Li YES , +these are the flags to pass to +.Xr hastd 8 . .It Va named_enable .Pq Vt bool If set to diff --git a/share/man/man5/regdomain.5 b/share/man/man5/regdomain.5 index f46a4afe835c..495f4b70f1f7 100644 --- a/share/man/man5/regdomain.5 +++ b/share/man/man5/regdomain.5 @@ -23,7 +23,7 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD$ -.Dd Apri 13, 2008 +.Dd April 13, 2008 .Dt REGDOMAIN 5 .Os .Sh NAME @@ -44,5 +44,5 @@ This file should be changed only to reflect changes in regulations. XML database of 802.11 regulatory constraints .El .Sh SEE ALSO -.Xr wlan 4 -.Xr ifconfig 8 , +.Xr wlan 4 , +.Xr ifconfig 8 diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5 index 7cacc67ad529..241d1018e5d8 100644 --- a/share/man/man5/src.conf.5 +++ b/share/man/man5/src.conf.5 @@ -1,7 +1,7 @@ .\" DO NOT EDIT-- this file is automatically generated. .\" from FreeBSD: head/tools/build/options/makeman 188848 2009-02-20 11:09:55Z mtm .\" $FreeBSD$ -.Dd June 1, 2009 +.Dd January 16, 2010 .Dt SRC.CONF 5 .Os .Sh NAME @@ -584,6 +584,10 @@ When set, it also enforces the following options: .Pp .Bl -item -compact .It +.Va WITHOUT_ATM +.It +.Va WITHOUT_BLUETOOTH +.It .Va WITHOUT_NETGRAPH_SUPPORT .El .It Va WITHOUT_NETGRAPH_SUPPORT diff --git a/share/man/man5/tmpfs.5 b/share/man/man5/tmpfs.5 index 12f392a8fd1e..4d66f5db87b8 100644 --- a/share/man/man5/tmpfs.5 +++ b/share/man/man5/tmpfs.5 @@ -1,4 +1,4 @@ -.\" +.\"- .\" Copyright (c) 2007 Xin LI .\" All rights reserved. .\" @@ -10,8 +10,6 @@ .\" 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 DOCUMENTATION IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -24,9 +22,34 @@ .\" (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) 2005, 2006 The NetBSD Foundation, Inc. +.\" 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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$ .\" -.Dd June 12, 2008 +.Dd February 16, 2010 .Dt TMPFS 5 .Os .Sh NAME @@ -61,15 +84,28 @@ mounting file systems: .Bl -tag -width indent .It Cm gid -root group id. +Specifies the group ID of the root inode of the file system. +Defaults to the mount point's GID. .It Cm uid -root user id. +Specifies the user ID of the root inode of the file system. +Defaults to the mount point's UID. .It Cm mode -permissions in octal format. +Specifies the mode (in octal notation) of the root inode of the file system. +Defaults to the mount point's mode. .It Cm inodes -maximum number of inodes. +Specifies the maximum number of nodes available to the file system. +If not specified, the file system chooses a reasonable maximum based on +the file system size, which can be limited with the +.Cm size +option. .It Cm size -maximum size (in bytes) for the file system. +Specifies the total file system size in bytes. +If zero (the default) or a value larger than SIZE_MAX - PAGE_SIZE +is given, the available amount of memory (including +main memory and swap space) will be used. +.It Cm maxfilesize +Specifies the maximum file size in bytes. +Defaults to the maximum possible value. .El .Sh EXAMPLES To mount a @@ -81,6 +117,7 @@ memory file system: .Xr nmount 2 , .Xr unmount 2 , .Xr fstab 5 , +.Xr mdmfs 8 , .Xr mount 8 .Sh HISTORY The diff --git a/share/man/man5/utmp.5 b/share/man/man5/utmp.5 deleted file mode 100644 index c34204187415..000000000000 --- a/share/man/man5/utmp.5 +++ /dev/null @@ -1,267 +0,0 @@ -.\" Copyright (c) 1980, 1991, 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. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 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. -.\" -.\" @(#)utmp.5 8.2 (Berkeley) 3/17/94 -.\" $FreeBSD$ -.\" -.Dd November 14, 2001 -.Dt UTMP 5 -.Os -.Sh NAME -.Nm utmp , -.Nm wtmp , -.Nm lastlog -.Nd login records -.Sh SYNOPSIS -.In sys/types.h -.In utmp.h -.Sh DESCRIPTION -The file -.In utmp.h -declares the structures used to record information about current -users in the file -.Nm , -logins and logouts in the file -.Nm wtmp , -and last logins in the file -.Nm lastlog . -The time stamps of date changes, shutdowns and reboots are also logged in -the -.Nm wtmp -file. -.Bd -literal -offset indent -#define _PATH_UTMP "/var/run/utmp" -#define _PATH_WTMP "/var/log/wtmp" -#define _PATH_LASTLOG "/var/log/lastlog" - -#define UT_NAMESIZE 16 -#define UT_LINESIZE 8 -#define UT_HOSTSIZE 16 - -struct lastlog { - int32_t ll_time; /* When user logged in */ - char ll_line[UT_LINESIZE]; /* Terminal line name */ - char ll_host[UT_HOSTSIZE]; /* Host user came from */ -}; - -struct utmp { - char ut_line[UT_LINESIZE]; /* Terminal line name */ - char ut_name[UT_NAMESIZE]; /* User's login name */ - char ut_host[UT_HOSTSIZE]; /* Host user came from */ - int32_t ut_time; /* When user logged in */ -}; -.Ed -.Pp -The -.Nm lastlog -file is a linear array of -.Vt lastlog -structures indexed by a user's -.Tn UID . -The -.Nm -file is a linear array of -.Vt utmp -structures indexed by a terminal line number -(see -.Xr ttyslot 3 ) . -The -.Nm wtmp -file consists of -.Vt utmp -structures and is a binary log file, -that is, grows linearly at its end. -.Pp -By default, each time a user logs in, the -.Xr pam_lastlog 8 -program looks up the user's -.Tn UID -in the file -.Nm lastlog . -If it is found, the timestamp of the last time the user logged -in, the terminal line and the hostname -are written to the standard output. -The -.Xr pam_lastlog 8 -program then records the new login time in the file -.Nm lastlog . -.Pp -After the new -.Vt lastlog -record is written, -.\" the -.\" .Xr libutil 3 -.\" routine -the file -.Nm -is opened and the -.Vt utmp -record for the user is inserted. -This record remains there until -the user logs out at which time it is deleted. -The -.Nm -file is used by the programs -.Xr rwho 1 , -.Xr users 1 , -.Xr w 1 , -and -.Xr who 1 . -.Pp -Next, the -.Xr pam_lastlog 8 -program opens the file -.Nm wtmp , -and appends the user's -.Vt utmp -record. -The user's subsequent logout from the terminal -line is marked by a special -.Vt utmp -record with -.Va ut_line -set accordingly, -.Va ut_time -updated, but -.Va ut_name -and -.Va ut_host -both empty -(see -.Xr init 8 ) . -The -.Nm wtmp -file is used by the programs -.Xr last 1 -and -.Xr ac 8 . -.Pp -In the event of a date change, a shutdown or reboot, the -following items are logged in the -.Nm wtmp -file. -.Pp -.Bl -tag -width ".Li shutdown" -compact -.It Li reboot -.It Li shutdown -A system reboot or shutdown has been initiated. -The character -.Ql \&~ -is placed in the field -.Va ut_line , -and -.Li reboot -or -.Li shutdown -in the field -.Va ut_name -(see -.Xr shutdown 8 -and -.Xr reboot 8 ) . -.Pp -.It Li date -The system time has been manually or automatically updated -(see -.Xr date 1 ) . -The command name -.Li date -is recorded in the field -.Va ut_name . -In the field -.Va ut_line , -the character -.Ql \&| -indicates the time prior to the change, and the character -.Ql \&{ -indicates the new time. -.El -.Sh NOTES -The -.Nm wtmp -file can grow rapidly on busy systems, so daily or weekly rotation -is recommended. -It is maintained by -.Xr newsyslog 8 . -.Pp -If any one of these files does not exist, it is not created by -.Xr pam_lastlog 8 . -The files must be created manually. -.Pp -The supplied -.Xr login 3 , -.Xr logout 3 , -and -.Xr logwtmp 3 -utility functions should be used to perform -the standard actions on the -.Nm -and -.Nm wtmp -files in order to maintain the portability across -systems with different formats of those files. -.Sh FILES -.Bl -tag -width ".Pa /var/log/lastlog" -compact -.It Pa /var/run/utmp -The -.Nm -file. -.It Pa /var/log/wtmp -The -.Nm wtmp -file. -.It Pa /var/log/lastlog -The -.Nm lastlog -file. -.El -.Sh SEE ALSO -.Xr last 1 , -.Xr w 1 , -.Xr who 1 , -.Xr login 3 , -.Xr logout 3 , -.Xr logwtmp 3 , -.Xr ttyslot 3 , -.Xr ac 8 , -.Xr init 8 , -.Xr pam_lastlog 8 -.Sh HISTORY -A -.Nm -and -.Nm wtmp -file format appeared in -.At v6 . -The -.Nm lastlog -file format appeared in -.Bx 3.0 . diff --git a/share/man/man7/adding_user.7 b/share/man/man7/adding_user.7 index 1b467714a37b..499bd481615e 100644 --- a/share/man/man7/adding_user.7 +++ b/share/man/man7/adding_user.7 @@ -32,7 +32,7 @@ .\" @(#)adduser.8 8.1 (Berkeley) 6/5/93 .\" $FreeBSD$ .\" -.Dd Jan 30, 2009 +.Dd January 30, 2009 .Dt ADDING_USER 8 .Os .Sh NAME diff --git a/share/man/man7/build.7 b/share/man/man7/build.7 index 4a94a0ab434c..28151b687ce6 100644 --- a/share/man/man7/build.7 +++ b/share/man/man7/build.7 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 23, 2009 +.Dd December 15, 2009 .Dt BUILD 7 .Os .Sh NAME @@ -345,9 +345,10 @@ If set, the build target .Cm buildkernel defaults to setting .Va NO_KERNELCLEAN , -.Va NO_KERNELCONFIG +.Va NO_KERNELCONFIG , +.Va NO_KERNELDEPEND and -.Va NO_KERNELDEPEND . +.Va NO_KERNELOBJ . When set to a value other than .Cm 1 then @@ -444,6 +445,12 @@ If set, the build process does not run as part of the .Cm buildkernel target. +.It Va NO_KERNELOBJ +If set, the build process does not run +.Dq make obj +as part of the +.Cm buildkernel +target. .It Va NO_DOCUPDATE If set, the update process does not update the source of the .Fx diff --git a/share/man/man7/hier.7 b/share/man/man7/hier.7 index 40c2d0c378ab..25d29eca2e76 100644 --- a/share/man/man7/hier.7 +++ b/share/man/man7/hier.7 @@ -735,10 +735,14 @@ kerberos server databases; see miscellaneous system log files .Pp .Bl -tag -width Fl -compact -.It Pa wtmp +.It Pa utx.lastlogin +last login log; +see +.Xr getutxent 3 +.It Pa utx.log login/logout log; see -.Xr wtmp 5 +.Xr getutxent 3 .El .Pp .It Pa mail/ @@ -769,10 +773,10 @@ writable by the .Dq network group for command connection sockets; see .Xr ppp 8 -.It Pa utmp +.It Pa utx.active database of current users; see -.Xr utmp 5 +.Xr getutxent 3 .El .Pp .It Pa rwho/ diff --git a/share/man/man7/release.7 b/share/man/man7/release.7 index 68c431cfded4..8e512c2f52fa 100644 --- a/share/man/man7/release.7 +++ b/share/man/man7/release.7 @@ -518,15 +518,15 @@ make release CHROOTDIR=/local3/release BUILDNAME=6.0-CURRENT \\ .Xr sysctl 8 .Rs .%T "FreeBSD Release Engineering" -.%O http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/releng/ +.%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/releng/ .Re .Rs .%T "FreeBSD Release Engineering of Third Party Packages" -.%O http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/releng-packages/ +.%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/releng-packages/ .Re .Rs .%T "FreeBSD Developers' Handbook" -.%O http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/ +.%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/ .Re .Sh HISTORY .Fx diff --git a/share/man/man7/security.7 b/share/man/man7/security.7 index 9a4a4afcd57d..cbb4db813575 100644 --- a/share/man/man7/security.7 +++ b/share/man/man7/security.7 @@ -23,7 +23,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 8, 2006 +.Dd January 7, 2010 .Dt SECURITY 7 .Os .Sh NAME @@ -88,7 +88,7 @@ incur on the system under adverse conditions. Brute-force network attacks are harder to deal with. A spoofed-packet attack, for example, is nearly impossible to stop short of cutting your system off from the Internet. -It may not be able to take your machine down, but it can fill up Internet +It may not be able to take your machine down, but it can fill up your Internet pipe. .Pp A user account compromise is even more common than a DoS attack. @@ -175,7 +175,7 @@ outside of the console or possibly even with a .Xr su 1 utility. For example, make sure that your PTYs are specified as being -.Dq Li unsecure +.Dq Li insecure in the .Pa /etc/ttys file diff --git a/share/man/man7/tuning.7 b/share/man/man7/tuning.7 index 34c8ac37c188..a87df572245e 100644 --- a/share/man/man7/tuning.7 +++ b/share/man/man7/tuning.7 @@ -407,22 +407,27 @@ The .Va vm.overcommit sysctl defines the overcommit behaviour of the vm subsystem. The virtual memory system always does accounting of the swap space -reservation, both total for system and per-user. Corresponding values +reservation, both total for system and per-user. +Corresponding values are available through sysctl -.Va vm.swap_total, +.Va vm.swap_total , that gives the total bytes available for swapping, and -.Va vm.swap_reserved, +.Va vm.swap_reserved , that gives number of bytes that may be needed to back all currently allocated anonymous memory. .Pp Setting bit 0 of the .Va vm.overcommit sysctl causes the virtual memory system to return failure -to the process when allocation of memory causes vm.swap_reserved -to exceed vm.swap_total. -Bit 1 of the sysctl enforces RLIMIT_SWAP limit +to the process when allocation of memory causes +.Va vm.swap_reserved +to exceed +.Va vm.swap_total . +Bit 1 of the sysctl enforces +.Dv RLIMIT_SWAP +limit (see -.Xr getrlimit 2 ). +.Xr getrlimit 2 ) . Root is exempt from this limit. Bit 2 allows to count most of the physical memory as allocatable, except wired and free reserved pages diff --git a/share/man/man8/Makefile b/share/man/man8/Makefile index 0b1654443fb1..279a87403ef5 100644 --- a/share/man/man8/Makefile +++ b/share/man/man8/Makefile @@ -16,7 +16,6 @@ MAN= crash.8 \ MLINKS= rc.8 rc.atm.8 \ rc.8 rc.d.8 \ - rc.8 rc.early.8 \ rc.8 rc.firewall.8 \ rc.8 rc.local.8 \ rc.8 rc.network.8 \ diff --git a/share/man/man8/rc.8 b/share/man/man8/rc.8 index aa607beb554d..4f24a3639807 100644 --- a/share/man/man8/rc.8 +++ b/share/man/man8/rc.8 @@ -35,7 +35,7 @@ .\" @(#)rc.8 8.2 (Berkeley) 12/11/93 .\" $FreeBSD$ .\" -.Dd May 18, 2007 +.Dd November 17, 2009 .Dt RC 8 .Os .Sh NAME @@ -394,20 +394,6 @@ is not set, when going from single-user to multi-user mode for example, the script does not do anything. .Pp The -.Nm rc.early -script is run very early in the startup process, immediately before the -file system check. -The -.Nm rc.early -script is deprecated. -Any commands in this -file should be separated out into -.Nm rc.d/ -style scripts and integrated into the -.Nm -system. -.Pp -The .Pa /etc/rc.d/local script can execute scripts from multiple .Nm rc.d/ diff --git a/share/man/man8/rc.subr.8 b/share/man/man8/rc.subr.8 index 2c78590c5840..9f6c7fa2bc96 100644 --- a/share/man/man8/rc.subr.8 +++ b/share/man/man8/rc.subr.8 @@ -14,13 +14,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -101,38 +94,9 @@ be rewritten to make use of it. The .Nm functions were mostly imported from -.Nx -and it is intended that they remain synced between the -two projects. -With that in mind there are several variable -definitions that can help in this regard. -They are: -.Bl -tag -width 4n -.It Va OSTYPE -Its value will be either -.Qq Li FreeBSD -or -.Qq Li NetBSD , -depending on which OS it is running on. -.It Va SYSCTL -The path to the -.Xr sysctl 8 -command. -.It Va SYSCTL_N -The path and argument list to display only the -.Xr sysctl 8 -values instead of a -.Ar name Ns = Ns Ar value -pair. -.It Va SYSCTL_W -The path and argument to write or modify -.Xr sysctl 8 -values. -.El +.Nx . .Pp -The -.Nm -functions are accessed by sourcing +They are accessed by sourcing .Pa /etc/rc.subr into the current shell. .Pp diff --git a/share/man/man9/BUF_ISLOCKED.9 b/share/man/man9/BUF_ISLOCKED.9 index 7344869f6db9..d55f2f5d0056 100644 --- a/share/man/man9/BUF_ISLOCKED.9 +++ b/share/man/man9/BUF_ISLOCKED.9 @@ -57,6 +57,7 @@ An exclusive lock is held by someone other than curthread A shared lock is held. .It Li 0 The lock is not held by anyone. +.El .Sh SEE ALSO .Xr lockstatus 9 , .Xr buf 9 , diff --git a/share/man/man9/BUF_RECURSED.9 b/share/man/man9/BUF_RECURSED.9 index dfe818f1c4a9..2e369ea69e0b 100644 --- a/share/man/man9/BUF_RECURSED.9 +++ b/share/man/man9/BUF_RECURSED.9 @@ -54,6 +54,7 @@ The buffer linked to the lock. See .Xr lockmgr_recursed 9 for details. +.El .Sh SEE ALSO .Xr buf 9 , .Xr BUF_LOCK 9 , diff --git a/share/man/man9/BUS_BIND_INTR.9 b/share/man/man9/BUS_BIND_INTR.9 new file mode 100644 index 000000000000..2e22dea9ae10 --- /dev/null +++ b/share/man/man9/BUS_BIND_INTR.9 @@ -0,0 +1,98 @@ +.\" -*- nroff -*- +.\" +.\" Copyright (c) 2009 Advanced Computing Technologies LLC +.\" Written by: John H. Baldwin +.\" 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$ +.\" +.Dd October 14, 2009 +.Dt BUS_BIND_INTR 9 +.Os +.Sh NAME +.Nm BUS_BIND_INTR , +.Nm bus_bind_intr +.Nd "bind an interrupt resource to a specific CPU" +.Sh SYNOPSIS +.In sys/param.h +.In sys/bus.h +.Ft int +.Fo BUS_BIND_INTR +.Fa "device_t dev" "device_t child" "struct resource *irq" "int cpu" +.Fc +.Ft int +.Fn bus_bind_intr "device_t dev" "struct resource *irq" "int cpu" +.Sh DESCRIPTION +The +.Fn BUS_BIND_INTR +method allows an interrupt resource to be pinned to a specific CPU. +The interrupt resource must have an interrupt handler attached via +.Xr BUS_SETUP_INTR 9 . +The +.Fa cpu +parameter corresponds to the ID of a valid CPU in the system. +Binding an interrupt restricts the +.Xr cpuset 2 +of any associated interrupt threads to only include the specified CPU. +It may also direct the low-level interrupt handling of the interrupt to the +specified CPU as well, +but this behavior is platform-dependent. +If the value +.Dv NOCPU +is used for +.Fa cpu , +then the interrupt will be +.Dq unbound +which restores any associated interrupt threads back to the default cpuset. +.Pp +Non-sleepable locks such as mutexes should not be held across calls to these +functions. +.Pp +The +.Fn bus_bind_intr +function is a simple wrapper around +.Fn BUS_BIND_INTR . +.Pp +Note that currently there is no attempt made to arbitrate between +multiple bind requests for the same interrupt from either the same +device or multiple devices. +There is also no arbitration between interrupt binding requests submitted +by userland via +.Xr cpuset 2 +and +.Fn BUS_BIND_INTR . +The most recent binding request is the one that will be in effect. +.Sh RETURN VALUES +Zero is returned on success, otherwise an appropriate error is returned. +.Sh SEE ALSO +.Xr BUS_SETUP_INTR 9 , +.Xr cpuset 2 , +.Xr device 9 +.Sh HISTORY +The +.Fn BUS_BIND_INTR +method and +.Fn bus_bind_intr +functions first appeared in +.Fx 7.2 . diff --git a/share/man/man9/BUS_DESCRIBE_INTR.9 b/share/man/man9/BUS_DESCRIBE_INTR.9 new file mode 100644 index 000000000000..989780fdc609 --- /dev/null +++ b/share/man/man9/BUS_DESCRIBE_INTR.9 @@ -0,0 +1,104 @@ +.\" -*- nroff -*- +.\" +.\" Copyright (c) 2009 Advanced Computing Technologies LLC +.\" Written by: John H. Baldwin +.\" 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$ +.\" +.Dd October 14, 2009 +.Dt BUS_DESCRIBE_INTR 9 +.Os +.Sh NAME +.Nm BUS_DESCRIBE_INTR , +.Nm bus_describe_intr +.Nd "associate a description with an active interrupt handler" +.Sh SYNOPSIS +.In sys/param.h +.In sys/bus.h +.Ft int +.Fo BUS_BIND_INTR +.Fa "device_t dev" "device_t child" "struct resource *irq" "void *cookie" +.Fa "const char *descr" +.Fc +.Ft int +.Fo bus_describe_intr +.Fa "device_t dev" "struct resource *irq" "void *cookie" "const char *fmt" +.Fa ... +.Fc +.Sh DESCRIPTION +The +.Fn BUS_DESCRIBE_INTR +method associates a description with an active interrupt handler. +The +.Fa cookie +parameter must be the value returned by a successful call to +.Xr BUS_SETUP_INTR 9 +for the interrupt +.Fa irq . +.Pp +The +.Fn bus_describe_intr +function is a simple wrapper around +.Fn BUS_DESCRIBE_INTR . +As a convenience, +.Fn bus_describe_intr +allows the caller to use +.Xr printf 9 +style formatting to build the description string using +.Fa fmt . +.Pp +When an interrupt handler is established by +.Xr BUS_SETUP_INTR 9 , +the handler is named after the device the handler is established for. +This name is then used in various places such as interrupt statistics +displayed by +.Xr systat 1 +and +.Xr vmstat 8 . +For devices that use a single interrupt, +the device name is sufficiently unique to identify the interrupt handler. +However, for devices that use multiple interrupts it can be useful to +distinguish the interrupt handlers. +When a description is set for an active interrupt handler, +a colon followed by the description is appended to the device name to form +the interrupt handler name. +.Sh RETURN VALUES +Zero is returned on success, otherwise an appropriate error is returned. +.Sh SEE ALSO +.Xr BUS_SETUP_INTR 9 , +.Xr systat 1 , +.Xr vmstat 8 , +.Xr device 9 , +.Xr printf 9 +.Sh HISTORY +The +.Fn BUS_DESCRIBE_INTR +method and +.Fn bus_describe_intr +functions first appeared in +.Fx 9.0 . +.Sh BUGS +It is not currently possible to remove a description from an active interrupt +handler. diff --git a/share/man/man9/DEVICE_PROBE.9 b/share/man/man9/DEVICE_PROBE.9 index b159fd22206d..7b400e7fd601 100644 --- a/share/man/man9/DEVICE_PROBE.9 +++ b/share/man/man9/DEVICE_PROBE.9 @@ -127,6 +127,7 @@ The driver expects its parent to tell it which children to manage and no probing is really done. The device only matches if its parent bus specifically said to use this driver. +.El .Sh SEE ALSO .Xr device 9 , .Xr DEVICE_ATTACH 9 , diff --git a/share/man/man9/LOCK_PROFILING.9 b/share/man/man9/LOCK_PROFILING.9 index 23aba541d3ff..cdb78b315a21 100644 --- a/share/man/man9/LOCK_PROFILING.9 +++ b/share/man/man9/LOCK_PROFILING.9 @@ -114,6 +114,8 @@ The columns are as follows, from left to right: .Bl -tag -width ".Va cnt_hold" .It Va max The longest continuous hold time in microseconds. +.It Va wait_max +The longest continuous wait time in microseconds. .It Va total The total (accumulated) hold time in microseconds. .It Va wait_total diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index 7adf4d7f1e6d..4e8b0cedd6f4 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -23,8 +23,10 @@ MAN= accept_filter.9 \ bus_activate_resource.9 \ BUS_ADD_CHILD.9 \ bus_alloc_resource.9 \ + BUS_BIND_INTR.9 \ bus_child_present.9 \ BUS_CONFIG_INTR.9 \ + BUS_DESCRIBE_INTR.9 \ bus_dma.9 \ bus_generic_attach.9 \ bus_generic_detach.9 \ @@ -392,17 +394,19 @@ MLINKS+=atomic.9 atomic_add.9 \ atomic.9 atomic_set.9 \ atomic.9 atomic_store.9 \ atomic.9 atomic_subtract.9 -MLINKS+=bpf.9 bpf_filter.9 \ +MLINKS+=bpf.9 bpfattach.9 \ + bpf.9 bpfattach2.9 \ + bpf.9 bpfdetach.9 \ + bpf.9 bpf_filter.9 \ bpf.9 bpf_mtap.9 \ bpf.9 bpf_mtap2.9 \ bpf.9 bpf_tap.9 \ - bpf.9 bpf_validate.9 \ - bpf.9 bpfattach.9 \ - bpf.9 bpfattach2.9 \ - bpf.9 bpfdetach.9 + bpf.9 bpf_validate.9 MLINKS+=buf.9 bp.9 MLINKS+=bus_activate_resource.9 bus_deactivate_resource.9 MLINKS+=bus_alloc_resource.9 bus_alloc_resource_any.9 +MLINKS+=BUS_BIND_INTR.9 bus_bind_intr.9 +MLINKS+=BUS_DESCRIBE_INTR.9 bus_describe_intr.9 MLINKS+=bus_dma.9 busdma.9 \ bus_dma.9 bus_dmamap_create.9 \ bus_dma.9 bus_dmamap_destroy.9 \ @@ -559,11 +563,11 @@ MLINKS+=crypto.9 crypto_dispatch.9 \ crypto.9 crypto_unblock.9 \ crypto.9 crypto_unregister.9 \ crypto.9 crypto_unregister_all.9 -MLINKS+=DB_COMMAND.9 DB_SHOW_COMMAND.9 \ - DB_COMMAND.9 DB_SHOW_ALL_COMMAND.9 +MLINKS+=DB_COMMAND.9 DB_SHOW_ALL_COMMAND.9 \ + DB_COMMAND.9 DB_SHOW_COMMAND.9 MLINKS+=dev_clone.9 drain_dev_clone_events.9 -MLINKS+=devfs_set_cdevpriv.9 devfs_get_cdevpriv.9 \ - devfs_set_cdevpriv.9 devfs_clear_cdevpriv.9 +MLINKS+=devfs_set_cdevpriv.9 devfs_clear_cdevpriv.9 \ + devfs_set_cdevpriv.9 devfs_get_cdevpriv.9 MLINKS+=device_add_child.9 device_add_child_ordered.9 MLINKS+=device_enable.9 device_disable.9 \ device_enable.9 device_is_enabled.9 @@ -587,8 +591,8 @@ MLINKS+=devstat.9 devicestat.9 \ devstat.9 devstat_start_transaction.9 MLINKS+=disk.9 disk_alloc.9 \ disk.9 disk_create.9 \ - disk.9 disk_gone.9 \ - disk.9 disk_destroy.9 + disk.9 disk_destroy.9 \ + disk.9 disk_gone.9 MLINKS+=domain.9 DOMAIN_SET.9 \ domain.9 net_add_domain.9 \ domain.9 pfctlinput.9 \ @@ -606,8 +610,10 @@ MLINKS+=EVENTHANDLER.9 EVENTHANDLER_DECLARE.9 \ EVENTHANDLER.9 eventhandler_register.9 MLINKS+=fetch.9 fubyte.9 \ fetch.9 fuswintr.9 \ - fetch.9 fusword.9 \ - fetch.9 fuword.9 + fetch.9 fuword.9 \ + fetch.9 fuword16.9 \ + fetch.9 fuword32.9 \ + fetch.9 fuword64.9 MLINKS+=g_attach.9 g_detach.9 MLINKS+=g_bio.9 g_clone_bio.9 \ g_bio.9 g_destroy_bio.9 \ @@ -636,60 +642,60 @@ MLINKS+=hashinit.9 hashdestroy.9 \ hashinit.9 phashinit.9 MLINKS+=ieee80211.9 ieee80211_ifattach.9 \ ieee80211.9 ieee80211_ifdetach.9 -MLINKS+=ieee80211_amrr.9 ieee80211_amrr_init.9 \ - ieee80211_amrr.9 ieee80211_amrr_cleanup.9 \ - ieee80211_amrr.9 ieee80211_amrr_setinterval.9 \ +MLINKS+=ieee80211_amrr.9 ieee80211_amrr_cleanup.9 \ + ieee80211_amrr.9 ieee80211_amrr_init.9 \ ieee80211_amrr.9 ieee80211_amrr_node_init.9 \ + ieee80211_amrr.9 ieee80211_amrr_setinterval.9 \ ieee80211_amrr.9 ieee80211_amrr_tx_complete.9 \ ieee80211_amrr.9 ieee80211_amrr_tx_update.9 MLINKS+=ieee80211_beacon.9 ieee80211_beacon_alloc.9 \ - ieee80211_beacon.9 ieee80211_beacon_update.9 \ - ieee80211_beacon.9 ieee80211_beacon_notify.9 + ieee80211_beacon.9 ieee80211_beacon_notify.9 \ + ieee80211_beacon.9 ieee80211_beacon_update.9 MLINKS+=ieee80211_bmiss.9 ieee80211_beacon_miss.9 -MLINKS+=ieee80211_crypto.9 ieee80211_key_update_begin.9 \ - ieee80211_crypto.9 ieee80211_key_update_end.9 \ - ieee80211_crypto.9 ieee80211_crypto_newkey.9 \ - ieee80211_crypto.9 ieee80211_crypto_setkey.9 \ - ieee80211_crypto.9 ieee80211_crypto_delglobalkeys.9 \ - ieee80211_crypto.9 ieee80211_crypto_reload_keys.9 \ +MLINKS+=ieee80211_crypto.9 ieee80211_crypto_available.9 \ ieee80211_crypto.9 ieee80211_crypto_decap.9 \ - ieee80211_crypto.9 ieee80211_crypto_encap.9 \ + ieee80211_crypto.9 ieee80211_crypto_delglobalkeys.9 \ ieee80211_crypto.9 ieee80211_crypto_demic.9 \ + ieee80211_crypto.9 ieee80211_crypto_encap.9 \ ieee80211_crypto.9 ieee80211_crypto_enmic.9 \ - ieee80211_crypto.9 ieee80211_notify_michael_failure.9 \ - ieee80211_crypto.9 ieee80211_notify_replay_failure.9 \ + ieee80211_crypto.9 ieee80211_crypto_newkey.9 \ ieee80211_crypto.9 ieee80211_crypto_register.9 \ + ieee80211_crypto.9 ieee80211_crypto_reload_keys.9 \ + ieee80211_crypto.9 ieee80211_crypto_setkey.9 \ ieee80211_crypto.9 ieee80211_crypto_unregister.9 \ - ieee80211_crypto.9 ieee80211_crypto_available.9 + ieee80211_crypto.9 ieee80211_key_update_begin.9 \ + ieee80211_crypto.9 ieee80211_key_update_end.9 \ + ieee80211_crypto.9 ieee80211_notify_michael_failure.9 \ + ieee80211_crypto.9 ieee80211_notify_replay_failure.9 MLINKS+=ieee80211_input.9 ieee80211_input_all.9 -MLINKS+=ieee80211_node.9 ieee80211_find_rxnode.9 \ +MLINKS+=ieee80211_node.9 ieee80211_dump_node.9 \ + ieee80211_node.9 ieee80211_dump_nodes.9 \ + ieee80211_node.9 ieee80211_find_rxnode.9 \ ieee80211_node.9 ieee80211_find_rxnode_withkey.9 \ - ieee80211_node.9 ieee80211_ref_node.9 \ - ieee80211_node.9 ieee80211_unref_node.9 \ ieee80211_node.9 ieee80211_free_node.9 \ ieee80211_node.9 ieee80211_iterate_nodes.9 \ - ieee80211_node.9 ieee80211_dump_node.9 \ - ieee80211_node.9 ieee80211_dump_nodes.9 -MLINKS+=ieee80211_output.9 M_WME_GETAC.9 \ + ieee80211_node.9 ieee80211_ref_node.9 \ + ieee80211_node.9 ieee80211_unref_node.9 +MLINKS+=ieee80211_output.9 ieee80211_process_callback.9 \ ieee80211_output.9 M_SEQNO_GET.9 \ - ieee80211_output.9 ieee80211_process_callback.9 + ieee80211_output.9 M_WME_GETAC.9 MLINKS+=ieee80211_proto.9 ieee80211_new_state.9 \ + ieee80211_proto.9 ieee80211_resume_all.9 \ ieee80211_proto.9 ieee80211_start_all.9 \ ieee80211_proto.9 ieee80211_stop_all.9 \ ieee80211_proto.9 ieee80211_suspend_all.9 \ - ieee80211_proto.9 ieee80211_resume_all.9 \ ieee80211_proto.9 ieee80211_waitfor_parent.9 -MLINKS+=ieee80211_radiotap.9 radiotap.9 \ - ieee80211_radiotap.9 ieee80211_radiotap_attach.9 \ +MLINKS+=ieee80211_radiotap.9 ieee80211_radiotap_active.9 \ ieee80211_radiotap.9 ieee80211_radiotap_active_vap.9 \ - ieee80211_radiotap.9 ieee80211_radiotap_active.9 \ - ieee80211_radiotap.9 ieee80211_radiotap_tx.9 -MLINKS+=ieee80211_regdomain.9 ieee80211_init_channels.9 \ - ieee80211_regdomain.9 ieee80211_sort_channels.9 \ - ieee80211_regdomain.9 ieee80211_alloc_countryie.9 -MLINKS+=ieee80211_vap.9 ieee80211_vap_setup.9 \ - ieee80211_vap.9 ieee80211_vap_attach.9 \ - ieee80211_vap.9 ieee80211_vap_detach.9 + ieee80211_radiotap.9 ieee80211_radiotap_attach.9 \ + ieee80211_radiotap.9 ieee80211_radiotap_tx.9 \ + ieee80211_radiotap.9 radiotap.9 +MLINKS+=ieee80211_regdomain.9 ieee80211_alloc_countryie.9 \ + ieee80211_regdomain.9 ieee80211_init_channels.9 \ + ieee80211_regdomain.9 ieee80211_sort_channels.9 +MLINKS+=ieee80211_vap.9 ieee80211_vap_attach.9 \ + ieee80211_vap.9 ieee80211_vap_detach.9 \ + ieee80211_vap.9 ieee80211_vap_setup.9 MLINKS+=ifnet.9 ifaddr.9 \ ifnet.9 if_data.9 \ ifnet.9 ifqueue.9 @@ -714,13 +720,13 @@ MLINKS+=kobj.9 DEFINE_CLASS.9 \ kobj.9 kobj_delete.9 \ kobj.9 kobj_init.9 MLINKS+=kproc.9 kproc_create.9 \ - kproc.9 kthread_create.9 \ kproc.9 kproc_exit.9 \ kproc.9 kproc_resume.9 \ kproc.9 kproc_shutdown.9 \ kproc.9 kproc_start.9 \ kproc.9 kproc_suspend.9 \ - kproc.9 kproc_suspend_check.9 + kproc.9 kproc_suspend_check.9 \ + kproc.9 kthread_create.9 MLINKS+=kqueue.9 knlist_add.9 \ kqueue.9 knlist_clear.9 \ kqueue.9 knlist_delete.9 \ @@ -897,6 +903,7 @@ MLINKS+=mutex.9 mtx_assert.9 \ mutex.9 mtx_unlock_spin.9 \ mutex.9 mtx_unlock_spin_flags.9 MLINKS+=namei.9 NDFREE.9 \ + namei.9 NDHASGIANT.9 \ namei.9 NDINIT.9 MLINKS+=pbuf.9 getpbuf.9 \ pbuf.9 relpbuf.9 \ @@ -1142,8 +1149,10 @@ MLINKS+=stack.9 stack_copy.9 \ stack.9 stack_zero.9 MLINKS+=store.9 subyte.9 \ store.9 suswintr.9 \ - store.9 susword.9 \ - store.9 suword.9 + store.9 suword.9 \ + store.9 suword16.9 \ + store.9 suword32.9 \ + store.9 suword64.9 MLINKS+=swi.9 swi_add.9 \ swi.9 swi_sched.9 MLINKS+=sx.9 sx_assert.9 \ @@ -1214,6 +1223,7 @@ MLINKS+=timeout.9 callout.9 \ timeout.9 callout_init_rw.9 \ timeout.9 callout_pending.9 \ timeout.9 callout_reset.9 \ + timeout.9 callout_schedule.9 \ timeout.9 callout_stop.9 \ timeout.9 untimeout.9 MLINKS+=ucred.9 crcopy.9 \ @@ -1228,23 +1238,7 @@ MLINKS+=uidinfo.9 uifind.9 \ uidinfo.9 uihashinit.9 \ uidinfo.9 uihold.9 MLINKS+=uio.9 uiomove.9 -MLINKS+=usbdi.9 usb_fifo_alloc_buffer.9 \ - usbdi.9 usb_fifo_attach.9 \ - usbdi.9 usb_fifo_detach.9 \ - usbdi.9 usb_fifo_free_buffer.9 \ - usbdi.9 usb_fifo_get_data.9 \ - usbdi.9 usb_fifo_get_data_buffer.9 \ - usbdi.9 usb_fifo_get_data_error.9 \ - usbdi.9 usb_fifo_get_data_linear.9 \ - usbdi.9 usb_fifo_put_bytes_max.9 \ - usbdi.9 usb_fifo_put_data.9 \ - usbdi.9 usb_fifo_put_data_buffer.9 \ - usbdi.9 usb_fifo_put_data_error.9 \ - usbdi.9 usb_fifo_put_data_linear.9 \ - usbdi.9 usb_fifo_reset.9 \ - usbdi.9 usb_fifo_softc.9 \ - usbdi.9 usb_fifo_wakeup.9 \ - usbdi.9 usbd_do_request.9 \ +MLINKS+=usbdi.9 usbd_do_request.9 \ usbdi.9 usbd_do_request_flags.9 \ usbdi.9 usbd_errstr.9 \ usbdi.9 usbd_lookup_id_by_info.9 \ @@ -1278,8 +1272,23 @@ MLINKS+=usbdi.9 usb_fifo_alloc_buffer.9 \ usbdi.9 usbd_xfer_set_timeout.9 \ usbdi.9 usbd_xfer_softc.9 \ usbdi.9 usbd_xfer_state.9 \ - usbdi.9 usbd_xfer_state.9 \ - usbdi.9 usbd_xfer_status.9 + usbdi.9 usbd_xfer_status.9 \ + usbdi.9 usb_fifo_alloc_buffer.9 \ + usbdi.9 usb_fifo_attach.9 \ + usbdi.9 usb_fifo_detach.9 \ + usbdi.9 usb_fifo_free_buffer.9 \ + usbdi.9 usb_fifo_get_data.9 \ + usbdi.9 usb_fifo_get_data_buffer.9 \ + usbdi.9 usb_fifo_get_data_error.9 \ + usbdi.9 usb_fifo_get_data_linear.9 \ + usbdi.9 usb_fifo_put_bytes_max.9 \ + usbdi.9 usb_fifo_put_data.9 \ + usbdi.9 usb_fifo_put_data_buffer.9 \ + usbdi.9 usb_fifo_put_data_error.9 \ + usbdi.9 usb_fifo_put_data_linear.9 \ + usbdi.9 usb_fifo_reset.9 \ + usbdi.9 usb_fifo_softc.9 \ + usbdi.9 usb_fifo_wakeup.9 MLINKS+=vcount.9 count_dev.9 MLINKS+=vfsconf.9 vfs_modevent.9 \ vfsconf.9 vfs_register.9 \ @@ -1295,8 +1304,8 @@ MLINKS+=vfs_getopt.9 vfs_copyopt.9 \ MLINKS+=VFS_LOCK_GIANT.9 VFS_UNLOCK_GIANT.9 MLINKS+=vgone.9 vgonel.9 MLINKS+=vhold.9 vdrop.9 \ - vhold.9 vholdl.9 \ - vhold.9 vdropl.9 + vhold.9 vdropl.9 \ + vhold.9 vholdl.9 MLINKS+=vm_map_lock.9 vm_map_lock_downgrade.9 \ vm_map_lock.9 vm_map_lock_read.9 \ vm_map_lock.9 vm_map_lock_upgrade.9 \ diff --git a/share/man/man9/VFS.9 b/share/man/man9/VFS.9 index 21e609e82697..30f89189bf26 100644 --- a/share/man/man9/VFS.9 +++ b/share/man/man9/VFS.9 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 24, 1996 +.Dd February 9, 2010 .Os .Dt VFS 9 .Sh NAME @@ -53,7 +53,6 @@ rather than implementing empty functions or casting to .Xr VFS_SYNC 9 , .Xr VFS_UNMOUNT 9 , .Xr VFS_VGET 9 , -.Xr VFS_VPTOFH 9 , .Xr vnode 9 .Sh AUTHORS This manual page was written by diff --git a/share/man/man9/VFS_CHECKEXP.9 b/share/man/man9/VFS_CHECKEXP.9 index a3afd2e0e455..92afda86d69c 100644 --- a/share/man/man9/VFS_CHECKEXP.9 +++ b/share/man/man9/VFS_CHECKEXP.9 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 7, 2005 +.Dd January 4, 2010 .Os .Dt VFS_CHECKEXP 9 .Sh NAME @@ -81,7 +81,7 @@ and .Sh SEE ALSO .Xr VFS 9 , .Xr VFS_FHTOVP 9 , -.Xr VFS_VPTOFH 9 , +.Xr VOP_VPTOFH 9 , .Xr vnode 9 .Sh AUTHORS This manual page was written by diff --git a/share/man/man9/VFS_FHTOVP.9 b/share/man/man9/VFS_FHTOVP.9 index e17133e5ce2f..f6f88d204ee3 100644 --- a/share/man/man9/VFS_FHTOVP.9 +++ b/share/man/man9/VFS_FHTOVP.9 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 7, 2005 +.Dd January 4, 2010 .Os .Dt VFS_FHTOVP 9 .Sh NAME @@ -76,7 +76,7 @@ The locked vnode for the file will be returned in .Sh SEE ALSO .Xr VFS 9 , .Xr VFS_CHECKEXP 9 , -.Xr VFS_VPTOFH 9 , +.Xr VOP_VPTOFH 9 , .Xr vnode 9 .Sh AUTHORS This manual page was written by diff --git a/share/man/man9/VOP_LOCK.9 b/share/man/man9/VOP_LOCK.9 index cdf1714fed5e..6c54a38df5ba 100644 --- a/share/man/man9/VOP_LOCK.9 +++ b/share/man/man9/VOP_LOCK.9 @@ -114,6 +114,7 @@ directly. .Fn vn_lock also does not want a thread specified as argument but it assumes curthread to be used. +.El .Sh RETURN VALUES Zero is returned on success, otherwise an error is returned. .Sh SEE ALSO diff --git a/share/man/man9/VOP_OPENCLOSE.9 b/share/man/man9/VOP_OPENCLOSE.9 index 58e601b51aa2..7430da70f3ef 100644 --- a/share/man/man9/VOP_OPENCLOSE.9 +++ b/share/man/man9/VOP_OPENCLOSE.9 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 5, 2007 +.Dd December 2, 2009 .Os .Dt VOP_OPEN 9 .Sh NAME @@ -55,6 +55,8 @@ The arguments are: The vnode of the file. .It Fa mode The access mode required by the calling process. +.It Fa cred +The caller's credentials. .It Fa td The thread which is accessing the file. .It Fa fp diff --git a/share/man/man9/alloc_unr.9 b/share/man/man9/alloc_unr.9 index ee805a3bda57..2ba93e6f984e 100644 --- a/share/man/man9/alloc_unr.9 +++ b/share/man/man9/alloc_unr.9 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 23, 2005 +.Dd February 7, 2010 .Dt ALLOC_UNR 9 .Os .Sh NAME @@ -81,7 +81,7 @@ is returned. Same as .Fn alloc_unr except that mutex is assumed to be already locked and thus is not used. -.It Fn free_unr uh +.It Fn free_unr uh item Free a previously allocated unit number. This function may require allocating memory, and thus it can sleep. There is no pre-locked variant. diff --git a/share/man/man9/devfs_set_cdevpriv.9 b/share/man/man9/devfs_set_cdevpriv.9 index 934e4947f754..0896d4de0810 100644 --- a/share/man/man9/devfs_set_cdevpriv.9 +++ b/share/man/man9/devfs_set_cdevpriv.9 @@ -108,7 +108,7 @@ The private driver data was not associated with current filedescriptor, or .Fn devfs_clear_cdevpriv was called. -.Pp +.El .Sh SEE ALSO .Xr open 2 , .Xr close 2 , diff --git a/share/man/man9/fetch.9 b/share/man/man9/fetch.9 index 7de3ff7fbb99..ccf68668d3d8 100644 --- a/share/man/man9/fetch.9 +++ b/share/man/man9/fetch.9 @@ -34,29 +34,35 @@ .\" .\" $FreeBSD$ .\" -.Dd January 7, 1996 +.Dd October 5, 2009 .Dt FETCH 9 .Os .Sh NAME .Nm fetch , .Nm fubyte , -.Nm fusword , .Nm fuswintr , -.Nm fuword +.Nm fuword , +.Nm fuword16 , +.Nm fuword32 , +.Nm fuword64 .Nd fetch data from user-space .Sh SYNOPSIS .In sys/types.h .In sys/time.h .In sys/systm.h -.In sys/resourcevar.h .Ft int .Fn fubyte "const void *base" -.Ft int -.Fn fusword "void *base" -.Ft int -.Fn fuswintr "void *base" .Ft long .Fn fuword "const void *base" +.Ft int +.Fn fuword16 "void *base" +.Ft int32_t +.Fn fuword32 "const void *base" +.Ft int64_t +.Fn fuword64 "const void *base" +.In sys/resourcevar.h +.Ft int +.Fn fuswintr "void *base" .Sh DESCRIPTION The .Nm @@ -69,16 +75,22 @@ routines provide the following functionality: .It Fn fubyte Fetches a byte of data from the user-space address .Pa base . -.It Fn fusword -Fetches a short word of data from the user-space address +.It Fn fuword +Fetches a word of data from the user-space address +.Pa base . +.It Fn fuword16 +Fetches 16 bits of data from the user-space address +.Pa base . +.It Fn fuword32 +Fetches 32 bits of data from the user-space address +.Pa base . +.It Fn fuword64 +Fetches 64 bits of data from the user-space address .Pa base . .It Fn fuswintr Fetches a short word of data from the user-space address .Pa base . This function is safe to call during an interrupt context. -.It Fn fuword -Fetches a word of data from the user-space address -.Pa base . .El .Sh RETURN VALUES The diff --git a/share/man/man9/get_cyclecount.9 b/share/man/man9/get_cyclecount.9 index c67311173135..e3be78e59d21 100644 --- a/share/man/man9/get_cyclecount.9 +++ b/share/man/man9/get_cyclecount.9 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 20, 2000 +.Dd October 24, 2009 .Dt GET_CYCLECOUNT 9 .Os .Sh NAME @@ -65,10 +65,10 @@ do not have such a register, so .Fn get_cyclecount on these platforms -returns the number of nanoseconds +returns a (non-monotonic) combination of numbers represented by the structure returned by -.Xr nanotime 9 . +.Xr binuptime 9 . .Pp The .Tn Pentium @@ -77,18 +77,12 @@ processors all use the register. .Pp The -.Tn Alpha -processors use the -.Li PCC -register. -.Pp -The .Tn IA64 processors use the .Li AR.ITC register. .Sh SEE ALSO -.Xr nanotime 9 +.Xr binuptime 9 .Sh HISTORY The .Fn get_cyclecount diff --git a/share/man/man9/ieee80211_scan.9 b/share/man/man9/ieee80211_scan.9 index 7ac41bdb9035..018f70f8d748 100644 --- a/share/man/man9/ieee80211_scan.9 +++ b/share/man/man9/ieee80211_scan.9 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 4, 2009 +.Dd February 20, 2010 .Dt IEEE80211_SCAN 9 .Os .Sh NAME @@ -177,8 +177,8 @@ Scanning is not tied to the state machine that governs vaps except for linkage to the .Dv IEEE80211_S_SCAN state. -One one vap at a time may be scanning; this scheduling policy -is handle in +Only one vap at a time may be scanning; this scheduling policy +is handled in .Fn ieee80211_new_state and is transparent to scanning code. .Pp diff --git a/share/man/man9/ifnet.9 b/share/man/man9/ifnet.9 index 532f6cd6e411..7a3a3d9d9e94 100644 --- a/share/man/man9/ifnet.9 +++ b/share/man/man9/ifnet.9 @@ -28,7 +28,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 14, 2007 +.Dd December 1, 2009 .Os .Dt IFNET 9 .Sh NAME @@ -237,11 +237,15 @@ The name of the interface, .Dq Li fxp0 or .Dq Li lo0 ) . -(Initialized by driver.) +(Initialized by driver +(usually via +.Fn if_initname ) . ) .It Va if_dname .Pq Vt "const char *" The name of the driver. -(Initialized by driver.) +(Initialized by driver +(usually via +.Fn if_initname ) . ) .It Va if_dunit .Pq Vt int A unique number assigned to each interface managed by a particular @@ -249,7 +253,9 @@ driver. Drivers may choose to set this to .Dv IF_DUNIT_NONE if a unit number is not associated with the device. -(Initialized by driver.) +(Initialized by driver +(usually via +.Fn if_initname ) . ) .It Va if_addrhead .Pq Vt "struct ifaddrhead" The head of the @@ -279,17 +285,14 @@ to refer to a particular interface by index .Xr link_addr 3 ) . (Initialized by .Fn if_alloc . ) -.It Va if_timer -.Pq Vt short -Number of seconds until the watchdog timer -.Fn if_watchdog -is called, or zero if the timer is disabled. -(Set by driver, -decremented by generic watchdog code.) .It Va if_flags .Pq Vt int Flags describing operational parameters of this interface (see below). -(Manipulated by both driver and generic code.) +(Manipulated by generic code.) +.It Va if_drv_flags +.Pq Vt int +Flags describing operational status of this interface (see below). +(Manipulated by driver.) .It Va if_capabilities .Pq Vt int Flags describing the capabilities the interface supports (see below). @@ -356,18 +359,26 @@ Output a packet on interface or queue it on the output queue if the interface is already active. .It Fn if_transmit Transmit a packet on an interface or queue it if the interface is -in use. This function will return +in use. +This function will return .Dv ENOBUFS -if the devices software and hardware queues are both full. This -function must be installed after +if the devices software and hardware queues are both full. +This function must be installed after +.Fn if_attach +to override the default implementation. +This function is exposed in order to allow drivers to manage their own queues +and to reduce the latency caused by a frequently gratuitous enqueue / dequeue +pair to ifq. +The suggested internal software queueing mechanism is buf_ring. .It Fn if_qflush Free mbufs in internally managed queues when the interface is marked down. This function must be installed after .Fn if_attach -to override the default implementation. This function is exposed in order -to allow drivers to manage their own queues and to reduce the latency -caused by a frequently gratuitous enqueue / dequeue pair to ifq. The -suggested internal software queueing mechanism is buf_ring. +to override the default implementation. +This function is exposed in order to allow drivers to manage their own queues +and to reduce the latency caused by a frequently gratuitous enqueue / dequeue +pair to ifq. +The suggested internal software queueing mechanism is buf_ring. .It Fn if_start Start queued output on an interface. This function is exposed in @@ -376,10 +387,10 @@ order to provide for some interface classes to share a among all drivers. .Fn if_start may only be called when the -.Dv IFF_OACTIVE +.Dv IFF_DRV_OACTIVE flag is not set. (Thus, -.Dv IFF_OACTIVE +.Dv IFF_DRV_OACTIVE does not literally mean that output is active, but rather that the device's internal output queue is full.) Please note that this function will soon be deprecated. @@ -401,11 +412,6 @@ flags and flushing queues. See the description of .Fn ifioctl below for more information. -.It Fn if_watchdog -Routine called by the generic code when the watchdog timer, -.Va if_timer , -expires. -Usually this will reset the interface. .\" .It Fn if_poll_recv .\" .It Fn if_poll_xmit .\" .It Fn if_poll_slowinput @@ -415,10 +421,10 @@ Usually this will reset the interface. .\" section, below. .It Fn if_init Initialize and bring up the hardware, -e.g., reset the chip and the watchdog timer and enable the receiver unit. +e.g., reset the chip and enable the receiver unit. Should mark the interface running, but not active -.Dv ( IFF_RUNNING , ~IIF_OACTIVE ) . +.Dv ( IFF_DRV_RUNNING , ~IIF_DRV_OACTIVE ) . .It Fn if_resolvemulti Check the requested multicast group membership, .Fa addr , @@ -437,6 +443,12 @@ Flags of the former kind are marked .Aq S in this table; the latter are marked .Aq D . +Flags which begin with +.Dq IFF_DRV_ +are stored in +.Va if_drv_flags ; +all other flags are stored in +.Va if_flags . .Pp The macro .Dv IFF_CANTCHANGE @@ -466,7 +478,7 @@ The interface is a loopback device. The interface is point-to-point; .Dq broadcast address is actually the address of the other end. -.It Dv IFF_RUNNING +.It Dv IFF_DRV_RUNNING .Aq D* The interface has been configured and dynamic resources were successfully allocated. @@ -485,7 +497,7 @@ This interface is in the permanently promiscuous mode (implies .It Dv IFF_ALLMULTI .Aq D* This interface is in all-multicasts mode (used by multicast routers). -.It Dv IFF_OACTIVE +.It Dv IFF_DRV_OACTIVE .Aq D* The interface's hardware output queue (if any) is full; output packets are to be queued. diff --git a/share/man/man9/kthread.9 b/share/man/man9/kthread.9 index ffb5179614db..d2c770b95197 100644 --- a/share/man/man9/kthread.9 +++ b/share/man/man9/kthread.9 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 26, 2009 +.Dd January 24, 2010 .Dt KTHREAD 9 .Os .Sh NAME @@ -50,7 +50,7 @@ .Ft int .Fn kthread_suspend "struct thread *td" "int timo" .Ft void -.Fn kthread_suspend_check "struct thread *td" +.Fn kthread_suspend_check "void" .In sys/unistd.h .Ft int .Fo kthread_add @@ -208,12 +208,9 @@ functions are used to suspend and resume a kernel thread. During the main loop of its execution, a kernel thread that wishes to allow itself to be suspended should call .Fn kthread_suspend_check -passing in -.Va curthread -as the only argument. -This function checks to see if the kernel thread has been asked to suspend. +in order to check if the it has been asked to suspend. If it has, it will -.Xr tsleep 9 +.Xr msleep 9 until it is told to resume. Once it has been told to resume it will return allowing execution of the kernel thread to continue. diff --git a/share/man/man9/locking.9 b/share/man/man9/locking.9 index 825eb7f097a0..8457e25c134b 100644 --- a/share/man/man9/locking.9 +++ b/share/man/man9/locking.9 @@ -24,108 +24,52 @@ .\" .\" $FreeBSD$ .\" -.Dd March 14, 2007 +.Dd February 15, 2010 .Dt LOCKING 9 .Os .Sh NAME .Nm locking .Nd kernel synchronization primitives -.Sh SYNOPSIS -All sorts of stuff to go here. -.Pp .Sh DESCRIPTION The .Em FreeBSD kernel is written to run across multiple CPUs and as such requires several different synchronization primitives to allow the developers to safely access and manipulate the many data types required. -.Pp -These include: -.Bl -enum -.It -Spin Mutexes -.It -Sleep Mutexes -.It -pool Mutexes -.It -Shared-Exclusive locks -.It -Reader-Writer locks -.It -Read-Mostly locks -.It -Turnstiles -.It -Semaphores -.It -Condition variables -.It -Sleep/wakeup -.It -Giant -.It -Lockmanager locks -.El -.Pp -The primitives interact and have a number of rules regarding how -they can and can not be combined. -There are too many for the average -human mind and they keep changing. -(if you disagree, please write replacement text) :-) -.Pp -Some of these primitives may be used at the low (interrupt) level and -some may not. -.Pp -There are strict ordering requirements and for some of the types this -is checked using the -.Xr witness 4 -code. -.Pp -.Ss SPIN Mutexes -Mutexes are the basic primitive. -You either hold it or you don't. -If you don't own it then you just spin, waiting for the holder (on -another CPU) to release it. -Hopefully they are doing something fast. -You -.Em must not -do anything that deschedules the thread while you -are holding a SPIN mutex. .Ss Mutexes -Basically (regular) mutexes will deschedule the thread if the -mutex can not be acquired. -A non-spin mutex can be considered to be equivalent -to getting a write lock on an -.Em rw_lock -(see below), and in fact non-spin mutexes and rw_locks may soon become the same thing. -As in spin mutexes, you either get it or you don't. -You may only call the -.Xr sleep 9 -call via -.Fn msleep -or the new -.Fn mtx_sleep -variant. -These will atomically drop the mutex and reacquire it -as part of waking up. -This is often however a -.Em BAD -idea because it generally relies on you having -such a good knowledge of all the call graph above you -and what assumptions it is making that there are a lot -of ways to make hard-to-find mistakes. -For example you MUST re-test all the assumptions you made before, -all the way up the call graph to where you got the lock. -You can not just assume that mtx_sleep can be inserted anywhere. -If any caller above you has any mutex or -rwlock, your sleep, will cause a panic. -If the sleep only happens rarely it may be years before the -bad code path is found. -.Ss Pool Mutexes -A variant of regular mutexes where the allocation of the mutex is handled -more by the system. -.Ss Rw_locks +Mutexes (also called "sleep mutexes") are the most commonly used +synchronization primitive in the kernel. +Thread acquires (locks) a mutex before accessing data shared with other +threads (including interrupt threads), and releases (unlocks) it afterwards. +If the mutex cannot be acquired, the thread requesting it will sleep. +Mutexes fully support priority propagation. +.Pp +See +.Xr mutex 9 +for details. +.Ss Spin mutexes +Spin mutexes are variation of basic mutexes; the main difference between +the two is that spin mutexes never sleep - instead, they spin, waiting +for the thread holding the lock, which runs on another CPU, to release it. +Differently from ordinary mutex, spin mutexes disable interrupts when acquired. +Since disabling interrupts is expensive, they are also generally slower. +Spin mutexes should be used only when neccessary, e.g. to protect data shared +with interrupt filter code (see +.Xr bus_setup_intr 9 +for details). +.Ss Pool mutexes +With most synchronisaton primitives, such as mutexes, programmer must +provide a piece of allocated memory to hold the primitive. +For example, a mutex may be embedded inside the structure it protects. +Pool mutex is a variant of mutex without this requirement - to lock or unlock +a pool mutex, one uses address of the structure being protected with it, +not the mutex itself. +Pool mutexes are seldom used. +.Pp +See +.Xr mtx_pool 9 +for details. +.Ss Reader/writer locks Reader/writer locks allow shared access to protected data by multiple threads, or exclusive access by a single thread. The threads with shared access are known as @@ -135,23 +79,12 @@ A thread with exclusive access is known as a .Em writer since it may modify protected data. .Pp -Although reader/writer locks look very similar to -.Xr sx 9 -(see below) locks, their usage pattern is different. Reader/writer locks can be treated as mutexes (see above and .Xr mutex 9 ) with shared/exclusive semantics. More specifically, regular mutexes can be considered to be equivalent to a write-lock on an .Em rw_lock. -In the future this may in fact -become literally the fact. -An -.Em rw_lock -can be locked while holding a regular mutex, but -can -.Em not -be held while sleeping. The .Em rw_lock locks have priority propagation like mutexes, but priority @@ -163,54 +96,49 @@ Another important property is that shared holders of can recurse, but exclusive locks are not allowed to recurse. This ability should not be used lightly and .Em may go away. -Users of recursion in any locks should be prepared to -defend their decision against vigorous criticism. -.Ss Rm_locks +.Pp +See +.Xr rwlock 9 +for details. +.Ss Read-mostly locks Mostly reader locks are similar to -.Em Reader/write -locks but optimized for very infrequent -.Em writer -locking. -.Em rm_lock +.Em reader/writer +locks but optimized for very infrequent write locking. +.Em Read-mostly locks implement full priority propagation by tracking shared owners -using a lock user supplied +using a caller-supplied .Em tracker data structure. -.Ss Sx_locks -Shared/exclusive locks are used to protect data that are read far more often -than they are written. -Mutexes are inherently more efficient than shared/exclusive locks, so -shared/exclusive locks should be used prudently. -The main reason for using an -.Em sx_lock -is that a thread may hold a shared or exclusive lock on an -.Em sx_lock -lock while sleeping. -As a consequence of this however, an -.Em sx_lock -lock may not be acquired while holding a mutex. -The reason for this is that, if one thread slept while holding an -.Em sx_lock -lock while another thread blocked on the same -.Em sx_lock -lock after acquiring a mutex, then the second thread would effectively -end up sleeping while holding a mutex, which is not allowed. -The -.Em sx_lock -should be considered to be closely related to +.Pp +See +.Xr rmlock 9 +for details. +.Ss Shared/exclusive locks +Shared/exclusive locks are similar to reader/writer locks; the main difference +between them is that shared/exclusive locks may be held during unbounded sleep +(and may thus perform an unbounded sleep). +They are inherently less efficient than mutexes, reader/writer locks +and read-mostly locks. +They don't support priority propagation. +They should be considered to be closely related to .Xr sleep 9 . In fact it could in some cases be considered a conditional sleep. -.Ss Turnstiles -Turnstiles are used to hold a queue of threads blocked on -non-sleepable locks. -Sleepable locks use condition variables to implement their queues. -Turnstiles differ from a sleep queue in that turnstile queue's -are assigned to a lock held by an owning thread. -Thus, when one thread is enqueued onto a turnstile, it can lend its -priority to the owning thread. -If this sounds confusing, we need to describe it better. -.Ss Semaphores +.Pp +See +.Xr sx 9 +for details. +.Ss Counting semaphores +Counting semaphores provide a mechanism for synchronizing access +to a pool of resources. +Unlike mutexes, semaphores do not have the concept of an owner, +so they can be useful in situations where one thread needs +to acquire a resource, and another thread needs to release it. +They are largely deprecated. +.Pp +See +.Xr sema 9 +for details. .Ss Condition variables Condition variables are used in conjunction with mutexes to wait for conditions to occur. @@ -220,24 +148,30 @@ functions. When a thread waits on a condition, the mutex is atomically released before the thread is blocked, then reacquired before the function call returns. +.Pp +See +.Xr condvar 9 +for details. .Ss Giant -Giant is a special instance of a sleep lock. -It has several special characteristics. +Giant is an instance of a mutex, with some special characteristics: .Bl -enum .It It is recursive. .It -Drivers can request that Giant be locked around them, but this is -going away. -.It -You can sleep while it has recursed, but other recursive locks cannot. +Drivers and filesystems can request that Giant be locked around them +by not marking themselves MPSAFE. +Note that infrastructure to do this is slowly going away as non-MPSAFE +drivers either became properly locked or disappear. .It Giant must be locked first before other locks. .It +It is OK to hold Giant while performing unbounded sleep; in such case, +Giant will be dropped before sleeping and picked up after wakeup. +.It There are places in the kernel that drop Giant and pick it back up again. Sleep locks will do this before sleeping. -Parts of the Network or VM code may do this as well, depending on the +Parts of the network or VM code may do this as well, depending on the setting of a sysctl. This means that you cannot count on Giant keeping other code from running if your code sleeps, even if you want it to. @@ -298,26 +232,76 @@ while the thread is suspended and will reacquire the .Va Giant mutex before the function returns. .Pp -.Ss lockmanager locks -Largely deprecated. -See the +See +.Xr sleep 9 +for details. +.Pp +.Ss Lockmanager locks +Shared/exclusive locks, used mostly in +.Xr VFS 9 , +in particular as a +.Xr vnode 9 +lock. +They have features other lock types don't have, such as sleep timeout, +writer starvation avoidance, draining, and interlock mutex, but this makes them +complicated to implement; for this reason, they are deprecated. +.Pp +See .Xr lock 9 -page for more information. -I don't know what the downsides are but I'm sure someone will fill in this part. -.Sh Usage tables. -.Ss Interaction table. -The following table shows what you can and can not do if you hold -one of the synchronization primitives discussed here: -(someone who knows what they are talking about should write this table) -.Bl -column ".Ic xxxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXX" -offset indent +for details. +.Sh INTERACTIONS +The primitives interact and have a number of rules regarding how +they can and can not be combined. +Many of these rules are checked using the +.Xr witness 4 +code. +.Ss Bounded vs. unbounded sleep +The following primitives perform bounded sleep: mutexes, pool mutexes, +reader/writer locks and read-mostly locks. +.Pp +The following primitives block (perform unbounded sleep): shared/exclusive locks, +counting semaphores, condition variables, sleep/wakeup and lockmanager locks. +.Pp +It is an error to do any operation that could result in any kind of sleep while +holding spin mutex. +.Pp +As a general rule, it is an error to do any operation that could result +in unbounded sleep while holding any primitive from the 'bounded sleep' group. +For example, it is an error to try to acquire shared/exclusive lock while +holding mutex, or to try to allocate memory with M_WAITOK while holding +read-write lock. +.Pp +As a special case, it is possible to call +.Fn sleep +or +.Fn mtx_sleep +while holding a single mutex. +It will atomically drop that mutex and reacquire it as part of waking up. +This is often a bad idea because it generally relies on the programmer having +good knowledge of all of the call graph above the place where +.Fn mtx_sleep +is being called and assumptions the calling code has made. +Because the lock gets dropped during sleep, one one must re-test all +the assumptions that were made before, all the way up the call graph to the +place where the lock was acquired. +.Pp +It is an error to do any operation that could result in any kind of sleep when +running inside an interrupt filter. +.Pp +It is an error to do any operation that could result in unbounded sleep when +running inside an interrupt thread. +.Ss Interaction table +The following table shows what you can and can not do while holding +one of the synchronization primitives discussed: +.Bl -column ".Ic xxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXX" -offset indent .It Xo -.Em "You have: You want:" Ta Spin_mtx Ta Slp_mtx Ta sx_lock Ta rw_lock Ta rm_lock Ta sleep +.Em "You have: You want:" Ta spin mtx Ta mutex Ta sx Ta rwlock Ta rmlock Ta sleep .Xc -.It Ic SPIN mutex Ta \&ok-1 Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no-3 -.It Ic Sleep mutex Ta \&ok Ta \&ok-1 Ta \&no Ta \&ok Ta \&ok Ta \&no-3 -.It Ic sx_lock Ta \&ok Ta \&ok Ta \&ok-2 Ta \&ok Ta \&ok Ta \&ok-4 -.It Ic rw_lock Ta \&ok Ta \&ok Ta \&no Ta \&ok-2 Ta \&ok Ta \&no-3 -.It Ic rm_lock Ta \&ok Ta \&ok Ta \&no Ta \&ok Ta \&ok-2 Ta \&no +.It spin mtx Ta \&ok-1 Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no-3 +.It mutex Ta \&ok Ta \&ok-1 Ta \&no Ta \&ok Ta \&ok Ta \&no-3 +.It sx Ta \&ok Ta \&ok Ta \&ok-2 Ta \&ok Ta \&ok Ta \&ok-4 +.It rwlock Ta \&ok Ta \&ok Ta \&no Ta \&ok-2 Ta \&ok Ta \&no-3 +.It rmlock Ta \&ok Ta \&ok Ta \&no Ta \&ok Ta \&ok-2 Ta \&no .El .Pp .Em *1 @@ -325,11 +309,11 @@ Recursion is defined per lock. Lock order is important. .Pp .Em *2 -readers can recurse though writers can not. +Readers can recurse though writers can not. Lock order is important. .Pp .Em *3 -There are calls atomically release this primitive when going to sleep +There are calls that atomically release this primitive when going to sleep and reacquire it on wakeup (e.g. .Fn mtx_sleep , .Fn rw_sleep @@ -340,19 +324,22 @@ and .Em *4 Though one can sleep holding an sx lock, one can also use .Fn sx_sleep -which atomically release this primitive when going to sleep and +which will atomically release this primitive when going to sleep and reacquire it on wakeup. -.Ss Context mode table. +.Ss Context mode table The next table shows what can be used in different contexts. At this time this is a rather easy to remember table. -.Bl -column ".Ic Xxxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXX" -offset indent +.Bl -column ".Ic Xxxxxxxxxxxxxxxxxxx" ".Xr XXXXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXXX" ".Xr XXXXXX" -offset indent .It Xo -.Em "Context:" Ta Spin_mtx Ta Slp_mtx Ta sx_lock Ta rw_lock Ta rm_lock Ta sleep +.Em "Context:" Ta spin mtx Ta mutex Ta sx Ta rwlock Ta rmlock Ta sleep .Xc -.It interrupt: Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no -.It idle: Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no +.It interrupt filter: Ta \&ok Ta \&no Ta \&no Ta \&no Ta \&no Ta \&no +.It ithread: Ta \&ok Ta \&ok Ta \&no Ta \&ok Ta \&ok Ta \&no +.It callout: Ta \&ok Ta \&ok Ta \&no Ta \&ok Ta \&no Ta \&no +.It syscall: Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok Ta \&ok .El .Sh SEE ALSO +.Xr witness 4 , .Xr condvar 9 , .Xr lock 9 , .Xr mtx_pool 9 , @@ -362,11 +349,12 @@ At this time this is a rather easy to remember table. .Xr sema 9 , .Xr sleep 9 , .Xr sx 9 , -.Xr LOCK_PROFILING 9 , -.Xr WITNESS 9 +.Xr LOCK_PROFILING 9 .Sh HISTORY These functions appeared in .Bsx 4.1 through .Fx 7.0 +.Sh BUGS +There are too many locking primitives to choose from. diff --git a/share/man/man9/mac.9 b/share/man/man9/mac.9 index 395f7a089ff7..cc05c5a1f323 100644 --- a/share/man/man9/mac.9 +++ b/share/man/man9/mac.9 @@ -173,7 +173,7 @@ for information on the MAC Framework APIs. .Xr VFS 9 .Rs .%T "The FreeBSD Architecture Handbook" -.%O "http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/arch-handbook/" +.%U "http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/arch-handbook/" .Re .Sh HISTORY The diff --git a/share/man/man9/mtx_pool.9 b/share/man/man9/mtx_pool.9 index e289f3c18363..ab2cc8b31b11 100644 --- a/share/man/man9/mtx_pool.9 +++ b/share/man/man9/mtx_pool.9 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 25, 2002 +.Dd February 6, 2010 .Dt MTX_POOL 9 .Os .Sh NAME @@ -177,7 +177,7 @@ on each mutex in the specified pool, deallocates the memory associated with the pool, and assigns NULL to the pool pointer. .Sh SEE ALSO -.Xr locking 9 +.Xr locking 9 , .Xr mutex 9 .Sh HISTORY These routines first appeared in diff --git a/share/man/man9/namei.9 b/share/man/man9/namei.9 index 19516651949f..0325c36fa58f 100644 --- a/share/man/man9/namei.9 +++ b/share/man/man9/namei.9 @@ -44,7 +44,7 @@ .Nd pathname translation and lookup operations .Sh SYNOPSIS .In sys/param.h -.In sys/proc.h +.In sys/fcntl.h .In sys/namei.h .Ft int .Fn namei "struct nameidata *ndp" @@ -315,6 +315,34 @@ flag can be passed to the .Fn NDFREE function. .El +.Sh RETURN VALUES +If successful, +.Fn namei +will return 0, otherwise it will return an error. +.Sh ERRORS +Errors which +.Fn namei +may return: +.Bl -tag -width Er +.It Bq Er ENOTDIR +A component of the specified pathname is not a directory when a directory is +expected. +.It Bq Er ENAMETOOLONG +A component of a pathname exceeded 255 characters, +or an entire pathname exceeded 1023 characters. +.It Bq Er ENOENT +A component of the specified pathname does not exist, +or the pathname is an empty string. +.It Bq Er EACCES +An attempt is made to access a file in a way forbidden by its file access +permissions. +.It Bq Er ELOOP +Too many symbolic links were encountered in translating the pathname. +.It Bq Er EISDIR +An attempt is made to open a directory with write mode specified. +.It Bq Er EROFS +An attempt is made to modify a file or directory on a read-only file system. +.El .Sh FILES .Bl -tag .It Pa src/sys/kern/vfs_lookup.c diff --git a/share/man/man9/netisr.9 b/share/man/man9/netisr.9 index ed2a84ef764f..37fd367cb38d 100644 --- a/share/man/man9/netisr.9 +++ b/share/man/man9/netisr.9 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 26, 2009 +.Dd February 22, 2010 .Dt NETISR 9 .Os .Sh NAME @@ -66,6 +66,8 @@ The .Nm kernel interface suite allows device drivers (and other packet sources) to direct packets to protocols for directly dispatched or deferred processing. +Protocol registration and work stream statistics may be monitored using +.Xr netstat 1 . .Ss Protocol registration Protocols register and unregister handlers using .Fn netisr_register @@ -209,6 +211,7 @@ IPv6 .It Dv NETISR_NATM ATM .It Dv NETISR_EPAIR +.Xr netstat 1 , .Xr epair 4 .El .Sh AUTHORS diff --git a/share/man/man9/pci.9 b/share/man/man9/pci.9 index 0890d582c47d..d8ed6240e45d 100644 --- a/share/man/man9/pci.9 +++ b/share/man/man9/pci.9 @@ -257,7 +257,7 @@ space on the target architecture. .Rs .%B FreeBSD Developers' Handbook .%T NewBus -.%O http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/ +.%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/developers-handbook/ .Re .Rs .%A Shanley diff --git a/share/man/man9/sleep.9 b/share/man/man9/sleep.9 index a9f087351510..8fb7f88a3200 100644 --- a/share/man/man9/sleep.9 +++ b/share/man/man9/sleep.9 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 4, 2008 +.Dd December 12, 2009 .Os .Dt SLEEP 9 .Sh NAME @@ -97,6 +97,7 @@ when it resumes. should never be used, as it is for compatibility only. A new priority of 0 means to use the thread's current priority when it is made runnable again. +.Pp If .Fa priority includes the @@ -113,6 +114,17 @@ possible, and is returned if the system call should be interrupted by the signal (return .Er EINTR ) . +If +.Dv PBDRY +flag is specified in addition to +.Dv PCATCH , +then the sleeping thread is not stopped while sleeping upon delivery of +.Dv SIGSTOP +or other stop action. +Instead, it is waken up, assuming that stop occurs on reaching a stop +point when returning to usermode. +The flag should be used when sleeping thread owns resources, for instance +vnode locks, that should be freed timely. .Pp The parameter .Fa wmesg diff --git a/share/man/man9/sleepqueue.9 b/share/man/man9/sleepqueue.9 index e2e3a4b41501..3c0e9a5206e9 100644 --- a/share/man/man9/sleepqueue.9 +++ b/share/man/man9/sleepqueue.9 @@ -23,7 +23,7 @@ .\" .\" $FreeBSD$ .\" -.Dd August 13, 2007 +.Dd January 8, 2010 .Dt SLEEPQUEUE 9 .Os .Sh NAME @@ -41,8 +41,10 @@ .Nm sleepq_remove , .Nm sleepq_signal , .Nm sleepq_set_timeout , +.Nm sleepq_sleepcnt , .Nm sleepq_timedwait , .Nm sleepq_timedwait_sig , +.Nm sleepq_type , .Nm sleepq_wait , .Nm sleepq_wait_sig .Nd manage the queues of sleeping threads @@ -77,10 +79,14 @@ .Fn sleepq_signal "void *wchan" "int flags" "int pri" "int queue" .Ft void .Fn sleepq_set_timeout "void *wchan" "int timo" +.Ft u_int +.Fn sleepq_sleepcnt "void *wchan" "int queue" .Ft int .Fn sleepq_timedwait "void *wchan" .Ft int .Fn sleepq_timedwait_sig "void *wchan" "int signal_caught" +.Ft int +.Fn sleepq_type "void *wchan" .Ft void .Fn sleepq_wait "void *wchan" .Ft int @@ -195,12 +201,19 @@ A sleep queue used to implement .Xr pause 9 . .El .Pp -There is currently only one optional flag: +There are currently two optional flag: .Pp .Bl -tag -width ".Dv SLEEPQ_INTERRUPTIBLE" -compact .It Dv SLEEPQ_INTERRUPTIBLE The current thread is entering an interruptible sleep. .El +.Bl -tag -width ".Dv SLEEPQ_STOP_ON_BDRY" -compact +.It Dv SLEEPQ_STOP_ON_BDRY +When thread is entering an interruptible sleep, do not stop it upon +arrival of stop action, like +.Dv SIGSTOP . +Wake it up instead. +.El .Pp A timeout on the sleep may be specified by calling .Fn sleepq_set_timeout @@ -348,6 +361,20 @@ One possible use is waking up a specific thread from a widely shared sleep channel. .Pp The +.Fn sleepq_sleepcnt +function offer a simple way to retrieve the number of threads sleeping for +the specified +.Fa queue , +given a +.Fa wchan . +.Pp +The +.Fn sleepq_type +function returns the type of +.Fa wchan +associated to a sleepqueue. +.Pp +The .Fn sleepq_abort , .Fn sleepq_broadcast , and diff --git a/share/man/man9/store.9 b/share/man/man9/store.9 index 4438d84ca5aa..e3297e1fb134 100644 --- a/share/man/man9/store.9 +++ b/share/man/man9/store.9 @@ -34,13 +34,12 @@ .\" .\" $FreeBSD$ .\" -.Dd January 7, 1996 +.Dd October 5, 2009 .Dt STORE 9 .Os .Sh NAME .Nm store , .Nm subyte , -.Nm susword , .Nm suswintr , .Nm suword .Nd store data to user-space @@ -48,15 +47,19 @@ .In sys/types.h .In sys/time.h .In sys/systm.h -.In sys/resourcevar.h .Ft int .Fn subyte "void *base" "int byte" .Ft int -.Fn susword "void *base" "int word" +.Fn suword "void *base" "long word" +.Ft int +.Fn suword16 "void *base" "int word" +.Ft int +.Fn suword32 "void *base" "int32_t word" +.Ft int +.Fn suword64 "void *base" "int64_t word" +.In sys/resourcevar.h .Ft int .Fn suswintr "void *base" "int word" -.Ft int -.Fn suword "void *base" "long word" .Sh DESCRIPTION The .Nm @@ -69,16 +72,22 @@ routines provide the following functionality: .It Fn subyte Stores a byte of data to the user-space address .Pa base . -.It Fn susword -Stores a short word of data to the user-space address +.It Fn suword +Stores a word of data to the user-space address +.Pa base . +.It Fn suword16 +Stores 16 bits of of data to the user-space address +.Pa base . +.It Fn suword32 +Stores 32 bits of of data to the user-space address +.Pa base . +.It Fn suword64 +Stores 64 bits of of data to the user-space address .Pa base . .It Fn suswintr Stores a short word of data to the user-space address .Pa base . This function is safe to call during an interrupt context. -.It Fn suword -Stores a word of data to the user-space address -.Pa base . .El .Sh RETURN VALUES The diff --git a/share/man/man9/sysctl.9 b/share/man/man9/sysctl.9 index 547c8cc940e0..ff2b93876d22 100644 --- a/share/man/man9/sysctl.9 +++ b/share/man/man9/sysctl.9 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd November 23, 2006 +.Dd January 16, 2010 .Dt SYSCTL 9 .Os .Sh NAME @@ -282,6 +282,7 @@ A temporary sysctl node that should not be relied upon must be designated as such by a leading underscore character in its name. For example: .Va _dirty_hack . .Sh SEE ALSO +.Xr sysctl 3 , .Xr sysctl 8 , .Xr sysctl_add_oid 9 , .Xr sysctl_ctx_free 9 , diff --git a/share/man/man9/usbdi.9 b/share/man/man9/usbdi.9 index d58e59940583..100c53c439ba 100644 --- a/share/man/man9/usbdi.9 +++ b/share/man/man9/usbdi.9 @@ -78,7 +78,6 @@ .Nm usbd_xfer_set_timeout , .Nm usbd_xfer_softc , .Nm usbd_xfer_state , -.Nm usbd_xfer_state , .Nm usbd_xfer_status .Nd Universal Serial Bus driver programming interface .Sh SYNOPSIS diff --git a/share/man/man9/vm_page_alloc.9 b/share/man/man9/vm_page_alloc.9 index 02e2b939b486..81070d665ef4 100644 --- a/share/man/man9/vm_page_alloc.9 +++ b/share/man/man9/vm_page_alloc.9 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 13, 2001 +.Dd February 27, 2010 .Dt VM_PAGE_ALLOC 9 .Os .Sh NAME @@ -48,16 +48,26 @@ within .Fa object . It is assumed that a page has not already been allocated at .Fa pindex . -The page returned is inserted into the object, but is not inserted -into the pmap. +The page returned is inserted into the object, unless +.Dv VM_ALLOC_NOOBJ +is specified in the +.Fa page_req , +but is not inserted into a pmap. +The page may exists in the vm object cache, in which case it will +be reactivated instead, moving from the cache into the object page list. .Pp .Fn vm_page_alloc -will not block. +will not sleep. .Pp Its arguments are: .Bl -tag -width ".Fa page_req" .It Fa object The VM object to allocate the page for. +The +.Fa object +must be locked if +.Dv VM_ALLOC_NOOBJ +is not specified. .It Fa pindex The index into the object at which the page should be inserted. .It Fa page_req @@ -82,12 +92,24 @@ than zero. .It Dv VM_ALLOC_ZERO Indicate a preference for a pre-zeroed page. There is no guarantee that the page thus returned will be zeroed, but -it will be marked as such. +it will be marked by +.Dv PG_ZERO +flag if it is zeroed. .It Dv VM_ALLOC_NOOBJ -The page is associated with an unmanaged memory region, that is, there -is no backing VM object. -This is typically used to allocate pages within the kernel virtual -address space. +Do not associate the allocated page with a vm object. +The +.Fa object +argument is ignored. +.It Dv VM_ALLOC_NOBUSY +The page returned will not be busied. +.It Dv VM_ALLOC_WIRED +The returned page is wired. +.It Dv VM_ALLOC_IFNOTCACHED +Only allocate the page if it is not cached in the +.Fa object . +If the page at the specified +.Fa pindex +is cached, NULL is returned instead. .El .El .Sh RETURN VALUES diff --git a/share/man/man9/vm_page_bits.9 b/share/man/man9/vm_page_bits.9 index 991c7637e53b..fdee5afd2950 100644 --- a/share/man/man9/vm_page_bits.9 +++ b/share/man/man9/vm_page_bits.9 @@ -94,7 +94,7 @@ is zero and .Fa size is one page, the modified bit in the page map is cleared; as well, the -.Dv PG_NOSYNC +.Dv VPO_NOSYNC flag is cleared. .Pp .Fn vm_page_clear_dirty diff --git a/share/man/man9/vnode.9 b/share/man/man9/vnode.9 index b55b19b650bf..49a2cc77d1c1 100644 --- a/share/man/man9/vnode.9 +++ b/share/man/man9/vnode.9 @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 20, 2003 +.Dd February 13, 2010 .Os .Dt VNODE 9 .Sh NAME @@ -137,7 +137,7 @@ Advisory locking will not work on this. A FIFO (named pipe). Advisory locking will not work on this. .It Dv VBAD -An old style bad sector map +Indicates that the vnode has been reclaimed. .El .Sh IMPLEMENTATION NOTES VFIFO uses the "struct fileops" from @@ -161,6 +161,38 @@ interlock, will cause a LOR (Lock Order Reversal) due to the intertwining of VM Objects and Vnodes. .Sh SEE ALSO .Xr malloc 9 , +.Xr VOP_ACCESS 9 , +.Xr VOP_ACLCHECK 9 , +.Xr VOP_ADVLOCK 9 , +.Xr VOP_ATTRIB 9 , +.Xr VOP_BWRITE 9 , +.Xr VOP_CREATE 9 , +.Xr VOP_FSYNC 9 , +.Xr VOP_GETACL 9 , +.Xr VOP_GETEXTATTR 9 , +.Xr VOP_GETPAGES 9 , +.Xr VOP_GETVOBJECT 9 , +.Xr VOP_INACTIVE 9 , +.Xr VOP_IOCTL 9 , +.Xr VOP_LINK 9 , +.Xr VOP_LISTEXTATTR 9 , +.Xr VOP_LOCK 9 , +.Xr VOP_LOOKUP 9 , +.Xr VOP_OPENCLOSE 9 , +.Xr VOP_PATHCONF 9 , +.Xr VOP_PRINT 9 , +.Xr VOP_RDWR 9 , +.Xr VOP_READDIR 9 , +.Xr VOP_READLINK 9 , +.Xr VOP_REALLOCBLKS 9 , +.Xr VOP_REMOVE 9 , +.Xr VOP_RENAME 9 , +.Xr VOP_REVOKE 9 , +.Xr VOP_SETACL 9 , +.Xr VOP_SETEXTATTR 9 , +.Xr VOP_STRATEGY 9 , +.Xr VOP_VPTOCNP 9 , +.Xr VOP_VPTOFH 9 , .Xr VFS 9 .Sh AUTHORS This manual page was written by diff --git a/share/misc/bsd-family-tree b/share/misc/bsd-family-tree index 5482dce357ad..6fb2742f1b24 100644 --- a/share/misc/bsd-family-tree +++ b/share/misc/bsd-family-tree @@ -230,9 +230,14 @@ FreeBSD 5.2 | | | | | FreeBSD 7.2 | NetBSD 5.0 OpenBSD 4.5 | | | | | | | | | | | | DragonFly 2.4.0 + | V | | OpenBSD 4.6 | + | | | | | + *--FreeBSD | | | | + | 8.0 | | | | + | | | | | | | V | | | | | | | | | -FreeBSD 8 -current | NetBSD -current OpenBSD -current | +FreeBSD 9 -current | NetBSD -current OpenBSD -current | | | | | | v v v v v @@ -504,6 +509,8 @@ NetBSD 5.0 2009-04-29 [NBD] OpenBSD 4.5 2009-05-01 [OBD] FreeBSD 7.2 2009-05-04 [FBD] DragonFly 2.4.0 2009-09-16 [DFB] +OpenBSD 4.6 2009-10-18 [OBD] +FreeBSD 8.0 2009-11-26 [FBD] Bibliography ------------------------ @@ -536,7 +543,7 @@ Andreas Klemm, Lars K Die freien BSD-Varianten von Unix. c't April 1997, page 368ff. BSD Release Announcements collection. -URL: http://www.de.FreeBSD.org/de/ftp/releases/ +URL: http://www.FreeBSD.org/releases/ BSD Hypertext Man Pages URL: http://www.FreeBSD.org/cgi/man.cgi diff --git a/share/misc/committers-doc.dot b/share/misc/committers-doc.dot index 083800feef42..b9bef23441f5 100644 --- a/share/misc/committers-doc.dot +++ b/share/misc/committers-doc.dot @@ -35,6 +35,7 @@ node [color=lightblue2, style=filled, bgcolor=black]; ache [label="Andrey Chernov\nache@FreeBSD.org\n1997/06/13"] ale [label="Alex Dupre\nale@FreeBSD.org\n2003/12/22"] +bcr [label="Benedict Reuschling\nbcr@FreeBSD.org\n2009/12/24"] blackend [label="Marc Fonvieille\nblackend@FreeBSD.org\n2002/06/16"] bmah [label="Bruce A. Mah\nbmah@FreeBSD.org\n2000/08/22"] brd [label="Brad Davis\nbrd@FreeBSD.org\n2005/06/01"] @@ -98,6 +99,7 @@ jesusr -> jcamou jim -> trhodes jkois -> miwi +jkois -> bcr keramida -> blackend keramida -> danger diff --git a/share/misc/committers-ports.dot b/share/misc/committers-ports.dot index 4d6b8c591015..d5db227f76bd 100644 --- a/share/misc/committers-ports.dot +++ b/share/misc/committers-ports.dot @@ -51,6 +51,7 @@ amdmi3 [label="Dmitry Marakasov\namdmi3@FreeBSD.org\n2008/06/19"] anray [label="Andrey Slusar\nanray@FreeBSD.org\n2005/12/11"] araujo [label="Marcelo Araujo\naraujo@FreeBSD.org\n2007/04/26"] arved [label="Tilman Linneweh\narved@FreeBSD.org\n2002/10/15"] +avilla [label="Alberto Villa\navilla@FreeBSD.org\n2010/01/24"] avl [label="Alexander Logvinov\navl@FreeBSD.org\n2009/05/27"] az [label="Andrej Zverev\naz@FreeBSD.org\n2005/10/03"] beat [label="Beat Gaetzi\nbeat@FreeBSD.org\n2009/01/28"] @@ -109,7 +110,8 @@ lth [label="Lars Thegler\nlth@FreeBSD.org\n2004/05/04"] lwhsu [label="Li-Wen Hsu\nlwhsu@FreeBSD.org\n2007/04/03"] lx [label="David Thiel\nlx@FreeBSD.org\n2006/11/29"] maho [label="Maho Nakata\nmaho@FreeBSD.org\n2002/10/17"] -makc [label="Max Brazhnikov\makc@FreeBSD.org\n2008/08/25"] +makc [label="Max Brazhnikov\nmakc@FreeBSD.org\n2008/08/25"] +mandree [label="Matthias Andree\nmandree@FreeBSD.org\n2009/11/18"] marcus [label="Joe Marcus Clarke\nmarcus@FreeBSD.org\n2002/04/05"] markus [label="Markus Brueffer\nmarkus@FreeBSD.org\n2004/02/21"] mat [label="Mathieu Arnold\nmat@FreeBSD.org\n2003/08/15"] @@ -133,6 +135,7 @@ philip [label="Philip Paeps\nphilip@FreeBSD.org\n2005/10/19"] pgollucci [label="Philip M. Gollucci\npgollucci@FreeBSD.org\n2008/07/21"] rafan [label="Rong-En Fan\nrafan@FreeBSD.org\n2006/06/23"] rnoland [label="Robert Noland\nrnoland@FreeBSD.org\n2008/07/21"] +romain [label="Romain Tartiere\nromain@FreeBSD.org\n2010/01/24"] sat [label="Andrew Pantyukhin\nsat@FreeBSD.org\n2006/05/06"] sem [label="Sergey Matveychuk\nsem@FreeBSD.org\n2004/07/07"] sergei [label="Sergei Kolobov\nsergei@FreeBSD.org\n2003/10/21"] @@ -219,12 +222,14 @@ fjoe -> osa flz -> garga flz -> johans flz -> laszlof +flz -> romain gabor -> lippe gabor -> pgj garga -> acm garga -> alepulver +garga -> mandree garga -> mm garga -> rnoland garga -> vd @@ -276,10 +281,12 @@ mat -> thierry mezz -> tmclaugh miwi -> amdmi3 +miwi -> avilla miwi -> beat miwi -> farrokhi miwi -> gahr miwi -> makc +miwi -> mandree miwi -> mva miwi -> nox miwi -> tabthorpe @@ -328,6 +335,7 @@ stas -> araujo steve -> netchild +tabthorpe -> avilla tabthorpe -> avl tabthorpe -> jadawin tabthorpe -> pgj diff --git a/share/misc/committers-src.dot b/share/misc/committers-src.dot index 2673305f284c..a52aa272a54f 100644 --- a/share/misc/committers-src.dot +++ b/share/misc/committers-src.dot @@ -67,8 +67,10 @@ bmilekic [label="Bosko Milekic\nbmilekic@FreeBSD.org\n????/??/??"] bms [label="Bruce M Simpson\nbms@FreeBSD.org\n2003/08/06"] brian [label="Brian Somers\nbrian@FreeBSD.org\n1996/12/16"] brooks [label="Brooks Davis\nbrooks@FreeBSD.org\n2001/06/21"] +brucec [label="Bruce Cran\nbrucec@FreeBSD.org\n2010/01/29"] brueffer [label="Christian Brueffer\nbrueffer@FreeBSD.org\n2006/02/28"] bruno [label="Bruno Ducrot\nbruno@FreeBSD.org\n2005/07/18"] +bschmidt [label="Bernhard Schmidt\nbschmidt@FreeBSD.org\n2010/02/06"] bz [label="Bjoern A. Zeeb\nbz@FreeBSD.org\n2004/07/27"] ceri [label="Ceri Davies\nceri@FreeBSD.org\n2006/11/07"] cokane [label="Coleman Kane\ncokane@FreeBSD.org\n2000/06/19"] @@ -92,8 +94,10 @@ fabient [label="Fabien Thomas\nfabient@FreeBSD.org\n2009/03/16"] fanf [label="Tony Finch\nfanf@FreeBSD.org\n2002/05/05"] fjoe [label="Max Khon\nfjoe@FreeBSD.org\n2001/08/06"] flz [label="Florent Thoumie\nflz@FreeBSD.org\n2006/03/30"] +gabor [label="Gabor Kovesdan\ngabor@FreeBSD.org\n2010/02/02"] gad [label="Garance A. Drosehn\ngad@FreeBSD.org\n2000/10/27"] gallatin [label="Andrew Gallatin\ngallatin@FreeBSD.org\n????/??/??"] +gavin [label="Gavin Atkinson\ngavin@FreeBSD.org\n2009/12/07"] gibbs [label="Justin T. Gibbs\ngibbs@FreeBSD.org\n????/??/??"] glebius [label="Gleb Smirnoff\nglebius@FreeBSD.org\n2004/07/14"] gnn [label="George V. Neville-Neil\ngnn@FreeBSD.org\n2004/10/11"] @@ -106,6 +110,7 @@ ivoras [label="Ivan Voras\nivoras@FreeBSD.org\n2008/06/10"] jake [label="Jake Burkholder\njake@FreeBSD.org\n2000/05/16"] jamie [label="Jamie Gritton\njamie@FreeBSD.org\n2009/01/28"] jayanth [label="Jayanth Vijayaraghavan\njayanth@FreeBSD.org\n2000/05/08"] +jh [label="Jaakko Heinonen\njh@FreeBSD.org\n2009/10/02"] jilles [label="Jilles Tjoelker\njilles@FreeBSD.org\n2009/05/22"] jinmei [label="JINMEI Tatuya\njinmei@FreeBSD.org\n2007/03/17"] jdp [label="John Polstra\njdp@FreeBSD.org\n????/??/??"] @@ -121,6 +126,7 @@ julian [label="Julian Elischer\njulian@FreeBSD.org\n1993/??/??"] kaiw [label="Kai Wang\nkaiw@FreeBSD.org\n2007/09/26"] kensmith [label="Ken Smith\nkensmith@FreeBSD.org\n2004/01/23"] kevlo [label="Kevin Lo\nkevlo@FreeBSD.org\n2006/07/23"] +kib [label="Konstantin Belousov\nkib@FreeBSD.org\n2006/06/03"] kmacy [label="Kip Macy\nkmacy@FreeBSD.org\n2005/06/01"] le [label="Lukas Ertl\nle@FreeBSD.org\n2004/02/02"] linimon [label="Mark Linimon\nlinimon@FreeBSD.org\n2006/09/30"] @@ -137,6 +143,7 @@ mjacob [label="Matt Jacob\nmjacob@FreeBSD.org\n1997/08/13"] mlaier [label="Max Laier\nmlaier@FreeBSD.org\n2004/02/10"] mr [label="Michael Reifenberger\nmr@FreeBSD.org\n2001/09/30"] murray [label="Murray Stokely\nmurray@FreeBSD.org\n2000/04/05"] +neel [label="Neel Natu\nneel@FreeBSD.org\n2009/09/20"] netchild [label="Alexander Leidinger\nnetchild@FreeBSD.org\n2005/03/31"] njl [label="Nate Lawson\nnjl@FreeBSD.org\n2002/08/07"] nork [label="Norikatsu Shigemura\nnork@FreeBSD.org\n2009/06/09"] @@ -149,7 +156,7 @@ peadar [label="Peter Edwards\npeadar@FreeBSD.org\n2004/03/08"] peter [label="Peter Wemm\npeter@FreeBSD.org\n????/??/??"] philip [label="Philip Paeps\nphilip@FreBSD.org\n2004/01/21"] phk [label="Poul-Henning Kamp\nphk@FreeBSD.org\n1994/02/21"] -pho [label="Peter Holm \npho@FreeBSD.org\n2008/11/16"] +pho [label="Peter Holm\npho@FreeBSD.org\n2008/11/16"] pjd [label="Pawel Jakub Dawidek\npjd@FreeBSD.org\n2004/02/02"] ps [label="Paul Saab\nps@FreeBSD.org\n2000/02/23"] qingli [label="Qing Li\nqingli@FreeBSD.org\n2005/04/13"] @@ -183,6 +190,7 @@ trasz [label="Edward Tomasz Napierala\ntrasz@FreeBSD.org\n2008/08/22"] trhodes [label="Tom Rhodes\ntrhodes@FreeBSD.org\n2002/05/28"] tuexen [label="Michael Tuexen\ntuexen@FreeBSD.org\n2009/06/06"] ume [label="Hajimu UMEMOTO\nume@FreeBSD.org\n2000/02/26"] +uqs [label="Ulrich Spoerlein\nuqs@FreeBSD.org\n2010/01/28"] vanhu [label="Yvan Vanhullebus\nvanhu@FreeBSD.org\n2008/07/21"] versus [label="Konrad Jankowski\nversus@FreeBSD.org\n2008/10/27"] weongyo [label="Weongyo Jeong\nweongyo@FreeBSD.org\n2007/12/21"] @@ -238,6 +246,7 @@ cperciva -> simon csjp -> bushman +delphij -> gabor delphij -> rafan des -> anholt @@ -252,7 +261,10 @@ dwmalone -> fanf dwmalone -> peadar dwmalone -> snb +ed -> gavin ed -> jilles +ed -> rdivacky +ed -> uqs eivind -> des eivind -> rwatson @@ -288,6 +300,7 @@ imp -> jon imp -> keichii imp -> mb imp -> mr +imp -> neel imp -> non imp -> nork imp -> onoe @@ -342,7 +355,14 @@ julian -> archie julian -> adrian julian -> zec +kan -> kib + +kib -> dchagin kib -> lulf +kib -> pho +kib -> rdivacky +kib -> rmacklem +kib -> stas kmacy -> lstewart @@ -381,15 +401,20 @@ peter -> asmodai peter -> jayanth peter -> ps +philip -> ed philip -> jls philip -> matteo +philip -> uqs +pjd -> kib pjd -> lulf rgrimes -> markm rpaulo -> avg +rpaulo -> bschmidt +rrs -> brucec rrs -> tuexen ru -> ceri @@ -406,9 +431,11 @@ rwatson -> bz rwatson -> cperciva rwatson -> emaste rwatson -> gnn +rwatson -> jh rwatson -> kensmith rwatson -> kmacy rwatson -> linimon +rwatson -> rmacklem rwatson -> shafeeq rwatson -> tmm rwatson -> trasz @@ -435,6 +462,8 @@ sos -> marcel thompsa -> weongyo thompsa -> eri +trasz -> jh + ume -> jinmei ume -> suz ume -> tshiozak diff --git a/share/misc/iso3166 b/share/misc/iso3166 index 8d06e7cd121c..70ca84f497bc 100644 --- a/share/misc/iso3166 +++ b/share/misc/iso3166 @@ -1,5 +1,8 @@ # $FreeBSD$ # +# Please consult with http://www.FreeBSD.org/internal/i18n.html before +# making changes to this file. +# # ISO 3166 country codes # This includes many places that are not legally independent countries, # but which is it convenient to refer to separately from their @@ -230,7 +233,7 @@ SZ SWZ 748 Swaziland SE SWE 752 Sweden CH CHE 756 Switzerland SY SYR 760 Syrian Arab Republic -TW TWN 158 Taiwan, Province of China +TW TWN 158 Taiwan TJ TJK 762 Tajikistan TZ TZA 834 Tanzania, United Republic of TH THA 764 Thailand diff --git a/share/misc/organization.dot b/share/misc/organization.dot index 5b65bed42f54..891097dee53a 100644 --- a/share/misc/organization.dot +++ b/share/misc/organization.dot @@ -28,7 +28,7 @@ _misc [label="Miscellaneous Hats"] core [label="Core Team\ncore@FreeBSD.org\nwilko, brooks, keramida, imp,\ngnn, wes, hrs, murray,\nrwatson"] coresecretary [label="Core Team Secretary\ncore-secretary@FreeBSD.org\njoel"] doccommitters [label="Doc/www Committers\ndoc-committers@FreeBSD.org"] -doceng [label="Documentation Engineering Team\ndoceng@FreeBSD.org\nnik, blackend, hrs,\nmurray"] +doceng [label="Documentation Engineering Team\ndoceng@FreeBSD.org\nnik, blackend, hrs,\nkeramida"] portscommitters [label="Ports Committers\nports-committers@FreeBSD.org"] portmgr [label="Port Management Team\nportmgr@FreeBSD.org\nmarcus, kris, erwin,\nlinimon, pav, krion"] portmgrsecretary [label="Port Management Team Secretary\nportmgr-secretary@FreeBSD.org\nerwin"] diff --git a/share/mk/bsd.cpu.mk b/share/mk/bsd.cpu.mk index 8278d47c582b..35661b30807d 100644 --- a/share/mk/bsd.cpu.mk +++ b/share/mk/bsd.cpu.mk @@ -203,14 +203,12 @@ LD += -EB .if ${MACHINE_ARCH} == "mips" . if defined(TARGET_BIG_ENDIAN) CFLAGS += -EB -LDFLAGS += -Wl,-EB LD += -EB . else CFLAGS += -EL -LDFLAGS += -Wl,-EL LD += -EL . endif -CFLAGS += -msoft-float -G0 -mno-dsp -mabicalls +CFLAGS += -G0 .endif # NB: COPTFLAGS is handled in /usr/src/sys/conf/kern.pre.mk diff --git a/share/mk/bsd.dep.mk b/share/mk/bsd.dep.mk index cdcadb034b44..7711d80ed0b7 100644 --- a/share/mk/bsd.dep.mk +++ b/share/mk/bsd.dep.mk @@ -58,14 +58,14 @@ DEPENDFILE?= .depend # Keep `tags' here, before SRCS are mangled below for `depend'. .if !target(tags) && defined(SRCS) && !defined(NO_TAGS) tags: ${SRCS} -.if ${CTAGS:T} == "ctags" - @${CTAGS} ${CTAGSFLAGS} -f /dev/stdout \ - ${.ALLSRC:N*.h} | sed "s;${.CURDIR}/;;" > ${.TARGET} -.elif ${CTAGS:T} == "gtags" +.if ${CTAGS:T} == "gtags" @cd ${.CURDIR} && ${CTAGS} ${GTAGSFLAGS} ${.OBJDIR} .if defined(HTML) @cd ${.CURDIR} && htags ${HTAGSFLAGS} -d ${.OBJDIR} ${.OBJDIR} .endif +.else + @${CTAGS} ${CTAGSFLAGS} -f /dev/stdout \ + ${.ALLSRC:N*.h} | sed "s;${.CURDIR}/;;" > ${.TARGET} .endif .endif @@ -175,13 +175,13 @@ afterdepend: .if !target(cleandepend) cleandepend: .if defined(SRCS) -.if ${CTAGS:T} == "ctags" - rm -f ${DEPENDFILE} tags -.elif ${CTAGS:T} == "gtags" +.if ${CTAGS:T} == "gtags" rm -f ${DEPENDFILE} GPATH GRTAGS GSYMS GTAGS .if defined(HTML) rm -rf HTML .endif +.else + rm -f ${DEPENDFILE} tags .endif .endif .endif diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk index 982ff50cfc48..470d9d4da766 100644 --- a/share/mk/bsd.lib.mk +++ b/share/mk/bsd.lib.mk @@ -67,7 +67,7 @@ PO_FLAG=-pg .endif .c.po: - ${CC} ${PO_FLAG} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET} + ${CC} ${PO_FLAG} ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET} .if defined(CTFCONVERT) ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} .endif @@ -79,7 +79,7 @@ PO_FLAG=-pg .endif .cc.po .C.po .cpp.po .cxx.po: - ${CXX} ${PO_FLAG} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET} + ${CXX} ${PO_FLAG} ${PO_CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET} .cc.So .C.So .cpp.So .cxx.So: ${CXX} ${PICFLAG} -DPIC ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET} @@ -115,7 +115,7 @@ PO_FLAG=-pg .endif .asm.po: - ${CC} -x assembler-with-cpp -DPROF ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET} + ${CC} -x assembler-with-cpp -DPROF ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET} .if defined(CTFCONVERT) ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} .endif @@ -128,7 +128,7 @@ PO_FLAG=-pg .endif .S.po: - ${CC} -DPROF ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET} + ${CC} -DPROF ${PO_CFLAGS} -c ${.IMPSRC} -o ${.TARGET} .if defined(CTFCONVERT) ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} .endif diff --git a/share/mk/bsd.libnames.mk b/share/mk/bsd.libnames.mk index 3a3fd8646255..c80fe2342796 100644 --- a/share/mk/bsd.libnames.mk +++ b/share/mk/bsd.libnames.mk @@ -135,6 +135,8 @@ LIBRADIUS?= ${DESTDIR}${LIBDIR}/libradius.a LIBREADLINE?= ${DESTDIR}${LIBDIR}/libreadline.a LIBROKEN?= ${DESTDIR}${LIBDIR}/libroken.a LIBRPCSVC?= ${DESTDIR}${LIBDIR}/librpcsvc.a +LIBRPCSEC_GSS?= ${DESTDIR}${LIBDIR}/librpcsec_gss.a +LIBRT?= ${DESTDIR}${LIBDIR}/librt.a LIBSBUF?= ${DESTDIR}${LIBDIR}/libsbuf.a LIBSDP?= ${DESTDIR}${LIBDIR}/libsdp.a LIBSMB?= ${DESTDIR}${LIBDIR}/libsmb.a @@ -150,7 +152,8 @@ LIBUFS?= ${DESTDIR}${LIBDIR}/libufs.a LIBUGIDFW?= ${DESTDIR}${LIBDIR}/libugidfw.a LIBUMEM?= ${DESTDIR}${LIBDIR}/libumem.a LIBUSBHID?= ${DESTDIR}${LIBDIR}/libusbhid.a -LIBUSB20?= ${DESTDIR}${LIBDIR}/libusb20.a +LIBUSB?= ${DESTDIR}${LIBDIR}/libusb.a +LIBULOG?= ${DESTDIR}${LIBDIR}/libulog.a LIBUTIL?= ${DESTDIR}${LIBDIR}/libutil.a LIBUUTIL?= ${DESTDIR}${LIBDIR}/libuutil.a LIBVGL?= ${DESTDIR}${LIBDIR}/libvgl.a diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk index 4206969b19ad..84ae433b16b3 100644 --- a/share/mk/bsd.own.mk +++ b/share/mk/bsd.own.mk @@ -468,6 +468,11 @@ MK_MAILWRAPPER:= no MK_SENDMAIL:= no .endif +.if ${MK_NETGRAPH} == "no" +MK_ATM:= no +MK_BLUETOOTH:= no +.endif + .if ${MK_OPENSSL} == "no" MK_OPENSSH:= no MK_KERBEROS:= no diff --git a/share/mk/bsd.prog.mk b/share/mk/bsd.prog.mk index c8f2f723c834..4de78cb921e2 100644 --- a/share/mk/bsd.prog.mk +++ b/share/mk/bsd.prog.mk @@ -17,6 +17,7 @@ NO_WERROR= .if defined(DEBUG_FLAGS) CFLAGS+=${DEBUG_FLAGS} +CXXFLAGS+=${DEBUG_FLAGS} .if !defined(NO_CTF) && (${DEBUG_FLAGS:M-g} != "") CTFFLAGS+= -g diff --git a/share/mk/bsd.subdir.mk b/share/mk/bsd.subdir.mk index 4753f64f2940..dc5af72ff175 100644 --- a/share/mk/bsd.subdir.mk +++ b/share/mk/bsd.subdir.mk @@ -24,9 +24,9 @@ # This is a variant of install, which will # put the stuff into the right "distribution". # -# afterinstall, all, all-man, beforeinstall, checkdpadd, -# clean, cleandepend, cleandir, depend, install, lint, maninstall, -# manlint, obj, objlink, realinstall, regress, tags +# afterinstall, all, all-man, beforeinstall, checkdpadd, clean, +# cleandepend, cleandir, cleanilinks depend, install, lint, +# maninstall, manlint, obj, objlink, realinstall, regress, tags # .include @@ -66,9 +66,8 @@ ${SUBDIR}: .PHONY ${MAKE} all .for __target in all all-man checkdpadd clean cleandepend cleandir \ - depend distribute lint maninstall manlint \ - obj objlink realinstall regress tags \ - ${SUBDIR_TARGETS} + cleanilinks depend distribute lint maninstall manlint obj objlink \ + realinstall regress tags ${SUBDIR_TARGETS} ${__target}: _SUBDIR .endfor diff --git a/share/mk/bsd.sys.mk b/share/mk/bsd.sys.mk index 34e04f8cf267..97860f2bd856 100644 --- a/share/mk/bsd.sys.mk +++ b/share/mk/bsd.sys.mk @@ -11,7 +11,7 @@ # the default is gnu99 for now CSTD ?= gnu99 -.if !defined(NO_WARNS) && ${CC} != "icc" +.if ${CC} != "icc" . if ${CSTD} == "k&r" CFLAGS += -traditional . elif ${CSTD} == "c89" || ${CSTD} == "c90" @@ -23,6 +23,8 @@ CFLAGS += -std=iso9899:1999 . else CFLAGS += -std=${CSTD} . endif +.endif +.if !defined(NO_WARNS) && ${CC} != "icc" # -pedantic is problematic because it also imposes namespace restrictions #CFLAGS += -pedantic . if defined(WARNS) @@ -41,20 +43,22 @@ CWARNFLAGS += -W -Wno-unused-parameter -Wstrict-prototypes\ . endif . if ${WARNS} >= 4 CWARNFLAGS += -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch\ - -Wshadow -Wcast-align -Wunused-parameter + -Wshadow -Wunused-parameter +. if !defined(NO_WCAST_ALIGN) +CWARNFLAGS += -Wcast-align +. endif . endif # BDECFLAGS . if ${WARNS} >= 6 -CWARNFLAGS += -Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls +CWARNFLAGS += -Wchar-subscripts -Winline -Wnested-externs\ + -Wredundant-decls -Wold-style-definition . endif . if ${WARNS} >= 2 && ${WARNS} <= 4 # XXX Delete -Wuninitialized by default for now -- the compiler doesn't # XXX always get it right. CWARNFLAGS += -Wno-uninitialized . endif -. if !defined(WITH_GCC3) CWARNFLAGS += -Wno-pointer-sign -. endif . endif . if defined(FORMAT_AUDIT) diff --git a/share/mk/sys.mk b/share/mk/sys.mk index c469a0354cec..51ec0393791a 100644 --- a/share/mk/sys.mk +++ b/share/mk/sys.mk @@ -44,6 +44,7 @@ CFLAGS ?= -O2 -pipe CFLAGS += -fno-strict-aliasing .endif .endif +PO_CFLAGS ?= ${CFLAGS} # Turn CTF conversion off by default for now. This default could be # changed later if DTrace becomes popular. @@ -65,7 +66,8 @@ CFLAGS += -g .endif CXX ?= c++ -CXXFLAGS ?= ${CFLAGS:N-std=*:N-Wnested-externs:N-W*-prototypes:N-Wno-pointer-sign} +CXXFLAGS ?= ${CFLAGS:N-std=*:N-Wnested-externs:N-W*-prototypes:N-Wno-pointer-sign:N-Wold-style-definition} +PO_CXXFLAGS ?= ${CXXFLAGS} CPP ?= cpp diff --git a/share/security/lomac-policy.contexts b/share/security/lomac-policy.contexts index e01bd2842c60..6529d082878e 100644 --- a/share/security/lomac-policy.contexts +++ b/share/security/lomac-policy.contexts @@ -25,5 +25,5 @@ (/mnt)?/cdrom(/.*)? lomac/high (/usr)?/home/(ftp|samba)(/.*)? lomac/high /var/log/sendmail\.st lomac/low -/var/run/utmp lomac/equal -/var/log/(lastlog|wtmp) lomac/equal +/var/run/utx.active lomac/equal +/var/log/utx.(lastlogin|log) lomac/equal diff --git a/share/skel/dot.profile b/share/skel/dot.profile index 3a8bd3eb5d70..34398ad60acd 100644 --- a/share/skel/dot.profile +++ b/share/skel/dot.profile @@ -11,8 +11,7 @@ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:$HO # Setting TERM is normally done through /etc/ttys. Do only override # if you're sure that you'll never log in via telnet or xterm or a # serial line. -# Use cons25l1 for iso-* fonts -# TERM=cons25; export TERM +# TERM=xterm; export TERM BLOCKSIZE=K; export BLOCKSIZE EDITOR=vi; export EDITOR diff --git a/share/syscons/keymaps/fr.dvorak.acc.kbd b/share/syscons/keymaps/fr.dvorak.acc.kbd index ba5fa9dd05af..5e9eb92b9ac5 100644 --- a/share/syscons/keymaps/fr.dvorak.acc.kbd +++ b/share/syscons/keymaps/fr.dvorak.acc.kbd @@ -146,4 +146,4 @@ ( 'y' 255 ) ( 'Y' 190 ) dacu '´' ( 'a' 'á' ) ( 'e' 'é' ) ( 'i' 237 ) ( 'o' 'ó') ( 'u' 'ú' ) ( 'A' 'Á' ) ( 'E' 'É' ) ( 'I' 'Í' ) ( 'O' 'Ó' ) ( 'U' 'Ú' ) - ( 'Y' 221 ) ( 'y' 253 ) \ No newline at end of file + ( 'Y' 221 ) ( 'y' 253 ) diff --git a/share/termcap/termcap.5 b/share/termcap/termcap.5 index bb5b5123c34e..87a0c6e48f1f 100644 --- a/share/termcap/termcap.5 +++ b/share/termcap/termcap.5 @@ -53,7 +53,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 16, 1994 +.Dd December 13, 2009 .Dt TERMCAP 5 .Os .Sh NAME @@ -1999,6 +1999,25 @@ Unfortunately, due to lack of a definition for string parameters in only .Xr terminfo 5 supports these capabilities. +.Pp +For the +.Xr xterm 1 +terminal emulator the traditional behavior in +.Fx +when exiting a pager such as +.Xr less 1 +or +.Xr more 1 , +or an editor such as +.Xr vi 1 +is +.Em NOT +to clear the screen after the program exits. +If you prefer to clear the screen there are a number of +.Dq xterm-clear +entries that add this capability in the +.Nm +file that you can use directly, or as examples. .Ss Glitches and Braindamage Hazeltine terminals, which do not allow `~' characters to be displayed, should indicate @@ -2105,6 +2124,7 @@ Hash database file containing terminal descriptions (see .Xr tset 1 , .Xr ul 1 , .Xr vi 1 , +.Xr xterm 1 , .Xr ncurses 3 , .Xr printf 3 , .Xr termcap 3 , diff --git a/share/termcap/termcap.src b/share/termcap/termcap.src index 0df0244b4e65..4741088e0007 100644 --- a/share/termcap/termcap.src +++ b/share/termcap/termcap.src @@ -2784,48 +2784,51 @@ SH|screen-s|VT 100/ANSI X3.64 virtual terminal with hardstatus line:\ :ts=\E_:fs=\E\\:ds=\E_\E\\:tc=screen: SW|screen-w|VT 100/ANSI X3.64 virtual terminal with 132 cols:\ :co#132:tc=screen: -# $Xorg: termcap,v 1.3 2000/08/17 19:55:10 cpqbld Exp $ +# $XTermId: termcap,v 1.78 2009/11/09 00:24:26 tom Exp $ # # Note: # termcap format is limited to 1023 characters. This set of descriptions # is a subset of the terminfo, since not all features can be fit into # that limit. The 'xterm' description supports color. The monochrome -# 'xtermm' drops color in favor of additional function keys. If you need -# both, use terminfo. +# 'xterm-mono' drops color in favor of additional function keys. If you +# need both, use terminfo. # # The 1023-character limit applies to each entry after resolving the # "tc=" strings. Some implementations may discount all or part of the # formatting characters in the entry (i.e., the backslash newline tab # colon). GNU termcap does not have this limit. # -# I checked the limits using ncurses "captoinfo -CrTv", which prints +# I checked the limits using ncurses "captoinfo -CrTUvx", which prints # the resolved length of each entry in a comment at the end - T.Dickey + +# Add the capability to "clear the screen" after exiting vi, more/less, etc. # -# $XFree86: xc/programs/xterm/termcap,v 3.28 2001/01/17 23:46:39 dawes Exp $ -# -xterm-xfree86|XFree86 xterm:\ - :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\ - :k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:\ - :k9=\E[20~:k;=\E[21~:F1=\E[23~:F2=\E[24~:\ - :@7=\EOF:@8=\EOM:kI=\E[2~:\ - :kh=\EOH:kP=\E[5~:kN=\E[6~:\ - :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:Km=\E[M:tc=xterm-basic: +xterm-clear:\ + :te=\E[?1049l:ti=\E[?1049h:\ + :tc=xterm-new: +xterm-new|modern xterm:\ + :@7=\EOF:@8=\EOM:F1=\E[23~:F2=\E[24~:K2=\EOE:Km=\E[M:\ + :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\ + :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kI=\E[2~:\ + :kN=\E[6~:kP=\E[5~:kd=\EOB:kh=\EOH:kl=\EOD:kr=\EOC:ku=\EOA:\ + :tc=xterm-basic: # # This chunk is used for building the VT220/Sun/PC keyboard variants. -xterm-basic|xterm common (XFree86):\ - :li#24:co#80:am:kn#12:km:mi:ms:xn:AX:bl=^G:\ - :is=\E[!p\E[?3;4l\E[4l\E>:rs=\E[!p\E[?3;4l\E[4l\E>:le=^H:\ - :AL=\E[%dL:DL=\E[%dM:DC=\E[%dP:al=\E[L:dc=\E[P:dl=\E[M:\ - :UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\ - :ho=\E[H:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:\ - :im=\E[4h:ei=\E[4l:ks=\E[?1h\E=:ke=\E[?1l\E>:kD=\E[3~:kb=^H:\ - :sf=\n:sr=\EM:st=\EH:ct=\E[3g:sc=\E7:rc=\E8:\ - :eA=\E(B\E)0:as=\E(0:ae=\E(B:ml=\El:mu=\Em:up=\E[A:nd=\E[C:\ - :md=\E[1m:me=\E[m:mr=\E[7m:so=\E[7m:se=\E[27m:us=\E[4m:ue=\E[24m:\ - :ti=\E[?1049h:te=\E[?1049l:vi=\E[?25l:ve=\E[?25h:\ - :ut:Co#8:pa#64:op=\E[39;49m:AB=\E[4%dm:AF=\E[3%dm: +xterm-basic|modern xterm common:\ + :am:bs:km:mi:ms:ut:xn:AX:\ + :Co#8:co#80:kn#12:li#24:pa#64:\ + :AB=\E[4%dm:AF=\E[3%dm:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\ + :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\E[L:\ + :as=\E(0:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\ + :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:\ + :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>:\ + :kD=\E[3~:kb=^H:ke=\E[?1l\E>:ks=\E[?1h\E=:le=^H:md=\E[1m:\ + :me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:op=\E[39;49m:\ + :rc=\E8:rs=\E[!p\E[?3;4l\E[4l\E>:sc=\E7:se=\E[27m:sf=^J:\ + :so=\E[7m:sr=\EM:st=\EH:\ + :ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?12l\E[?25h:vi=\E[?25l:vs=\E[?12;25h: -# The xterm-xfree86 description has all of the features, but is not completely +# The xterm-new description has all of the features, but is not completely # compatible with vt220. If you are using a Sun or PC keyboard, set the # sunKeyboard resource to true: # + maps the editing keypad @@ -2835,68 +2838,97 @@ xterm-basic|xterm common (XFree86):\ # + uses DEC-style control sequences for the application keypad. # xterm-vt220|xterm emulating vt220:\ - :kH=\E[4~::@7=\E[4~:*6=\E[4~:kh=\E[1~:Km=\E[M:tc=xterm-basic: + :*6=\E[4~:@7=\E[4~:K2=\EOu:Km=\E[M:kH=\E[4~:kh=\E[1~:\ + :tc=xterm-basic: xterm-24|xterms|vs100|24x80 xterm:\ - :li#24:\ - :tc=xterm: + :li#24:tc=xterm-old: xterm-65|65x80 xterm:\ - :li#65:tc=xterm: + :li#65:tc=xterm-old: xterm-bold|xterm with bold for underline:\ - :so=\E[7m:us=\E[1m:tc=xterm: + :so=\E[7m:us=\E[1m:tc=xterm-old: xterm-boldso|xterm with bold for standout:\ - :se=\E[m:so=\E[1m:tc=xterm: + :se=\E[m:so=\E[1m:tc=xterm-old: xterm-mono|monochrome xterm:\ - :kn#20:\ - :st@:ut@:Co@:NC@:op@:AB@:AF@:pa@:Sf@:Sb@:tc=xterm: + :ut@:\ + :Co@:NC@:kn#20:pa@:\ + :AB@:AF@:Sb@:Sf@:op@:st@:tc=xterm-old: # # Alternate terminal description that "works" for interactive shells such as # tcsh and bash. xterm-noapp|xterm with cursor keys in normal mode:\ - :kl=\E[D:kd=\E[B:kr=\E[C:ku=\E[A:ks=\E=:ke=\E>:ti@:te@:tc=xterm: + :kd=\E[B:ke=\E>:kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:te@:ti@:\ + :tc=xterm: +# +# This should work for the commonly used "color xterm" variations (XFree86 +# xterm, color_xterm, nxterm, rxvt). Note that it does not set 'bce', so for +# XFree86 and rxvt, some applications that use colors will be less efficient, +# and in a few special cases (with "smart" optimization) the wrong color will +# be painted in spots. +xterm-color|generic "ANSI" color xterm:\ + :Co#8:NC@:pa#64:\ + :AB=\E[4%dm:AF=\E[3%dm:ac=:op=\E[m:tc=xterm-r6: # # These aliases are for compatibility with the terminfo; termcap cannot provide -# the extra features, but termcap applications still want the names. -xterm-16color|xterm alias 1:tc=xterm-xfree86: -xterm-88color|xterm alias 2:tc=xterm-256color: -xterm-256color|xterm alias 3:tc=xterm-xfree86: -xterm-nrc|xterm alias 4:tc=xterm: -xterm-rep|xterm alias 5:tc=xterm: -xterm-xmc|xterm alias 6:sg#1:tc=xterm: +# the extra features such as color initialization, but termcap applications +# still want the names. +xterm-16color|xterm alias 1:\ + :tc=xterm-new: + +xterm-88color|xterm alias 2:\ + :Co#88:pa#7744:tc=xterm-256color: + +xterm-256color|xterm alias 3:\ + :Co#256:pa#32767:\ + :AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-new: + +xterm-nrc|xterm alias 4:\ + :tc=xterm: +xterm-rep|xterm alias 5:\ + :tc=xterm: +xterm-xmc|xterm alias 6:\ + :sg#1:tc=xterm: # # An 8-bit description is doable with termcap, but there are probably no # termcap (or BSD curses) applications that are able to use it. +# +# Add the capability to "clear the screen" after exiting vi, more/less, etc. +# +xterm-8bit-clear:\ + :te=\233?1049l:ti=\233?1049h:ue=\23324m:\ + :tc=xterm-8bit: xterm-8bit|xterm terminal emulator 8-bit controls (X Window System):\ - :co#80:li#24:\ - :it#8:am:km:mi:ms:xn:\ - :AL=\233%dL:DC=\233%dP:DL=\233%dM:DO=\233%dB:IC=\233%d@:LE=\233%dD:\ - :RI=\233%dC:UP=\233%dA:ae=^O:al=\233L:as=^N:bl=^G:bt=\233Z:\ - :cd=\233J:ce=\233K:cl=\233H\2332J:cm=\233%i%d;%dH:cr=^M:\ - :cs=\233%i%d;%dr:ct=\2333g:dc=\233P:dl=\233M:do=^J:up=\233A:nd=\233C:\ - :ei=\2334l:ho=\233H:im=\2334h:\ + :am:km:mi:ms:xn:\ + :co#80:it#8:li#24:\ + :AL=\233%dL:DC=\233%dP:DL=\233%dM:DO=\233%dB:IC=\233%d@:\ + :K2=\217y:Km=\233M:LE=\233%dD:RI=\233%dC:UP=\233%dA:\ + :ae=\E(B:al=\233L:as=\E(0:bl=^G:bt=\233Z:cd=\233J:ce=\233K:\ + :cl=\233H\2332J:cm=\233%i%d;%dH:cr=^M:cs=\233%i%d;%dr:\ + :ct=\2333g:dc=\233P:dl=\233M:do=^J:ei=\2334l:ho=\233H:\ + :im=\2334h:\ :is=\E[62"p\E G\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r\E8:\ :k1=\23311~:k2=\23312~:k3=\23313~:k4=\23314~:k5=\23315~:\ :k6=\23317~:k7=\23318~:k8=\23319~:k9=\23320~:kD=\2333~:\ :kI=\2332~:kN=\2336~:kP=\2335~:kb=^H:kd=\217B:\ :ke=\233?1l\E>:kh=\2331~:kl=\217D:kr=\217C:ks=\233?1h\E=:\ - :ku=\217A:le=^H:mb=\2335m:md=\2331m:me=\233m^O:mr=\2337m:\ - :rc=\E8:sc=\E7:se=\23327m:sf=^J:so=\2337m:sr=\215:\ - :st=\210:ta=^I:te=\233?1049l:ti=\233?1049h:ue=\23324m:us=\2334m:\ - :vb=\233?5h\233?5l:ve=\233?25h:vi=\233?25l:Km=\233M: + :ku=\217A:le=^H:mb=\2335m:md=\2331m:me=\233m:mr=\2337m:\ + :nd=\233C:rc=\E8:sc=\E7:se=\23327m:sf=^J:so=\2337m:sr=\215:\ + :st=\210:ta=^I:ue=\23324m:\ + :up=\233A:us=\2334m:vb=\233?5h\233?5l:ve=\233?25l\233?25h:\ + :vs=\233?12;25h:vi=\233?25l: # -xterm-hp|XFree86 xterm with hpterm function keys:\ - :k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:\ - :kC=\EJ:kD=\EP:@7=\EF:kI=\EQ:kN=\ES:kP=\ET:kh=\Eh:\ - :kd=\EB:kl=\ED:kr=\EC:ku=\EA:tc=xterm-basic: +xterm-hp|xterm with hpterm function keys:\ + :@7=\EF:k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:\ + :k8=\Ew:kC=\EJ:kD=\EP:kI=\EQ:kN=\ES:kP=\ET:kd=\EB:kh=\Eh:\ + :kl=\ED:kr=\EC:ku=\EA:tc=xterm-basic: # -xterm-sco|XFree86 xterm with SCO function keys:\ - :kl=\E[D:kd=\E[B:kr=\E[C:ku=\E[A:@7=\E[F:\ - :k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:k5=\E[Q:\ - :k6=\E[R:k7=\E[S:k8=\E[T:k9=\E[U:k;=\E[V:\ - :F1=\E[W:F2=\E[X:F3=\E[Y:F5=\E[a:F6=\E[b:\ - :F7=\E[c:F8=\E[d:F9=\E[e:FA=\E[f:FB=\E[g:\ - :FC=\E[h:FD=\E[i:FE=\E[j:FF=\E[k:\ - :kh=\E[H:kI=\E[L:kN=\E[G:kP=\E[I:ac@:tc=xterm-basic: +xterm-sco|xterm with SCO function keys:\ + :@7=\E[F:F1=\E[W:F2=\E[X:F3=\E[Y:F5=\E[a:F6=\E[b:F7=\E[c:\ + :F8=\E[d:F9=\E[e:FA=\E[f:FB=\E[g:FC=\E[h:FD=\E[i:FE=\E[j:\ + :FF=\E[k:ac=:k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:k5=\E[Q:\ + :k6=\E[R:k7=\E[S:k8=\E[T:k9=\E[U:k;=\E[V:kD=\177:kI=\E[L:\ + :kN=\E[G:kP=\E[I:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\ + :tc=xterm-basic: # xterm-vt52|xterm emulating vt52:\ :bs:\ @@ -2906,63 +2938,77 @@ xterm-vt52|xterm emulating vt52:\ :le=\ED:nd=\EC:nw=^M^J:sf=^J:sr=\EI:ta=^I:up=\EA: # xterm-sun|xterm with Sun functionkeys:\ - :k1=\E[224z:k2=\E[225z:k3=\E[226z:k4=\E[227z:\ - :k5=\E[228z:k6=\E[229z:k7=\E[230z:k8=\E[231z:\ - :k9=\E[232z:k;=\E[233z:F1=\E[192z:F2=\E[193z:\ - :%1=\E[196z:&8=\E[195z:@0=\E[200z:kI=\E[2z:\ - :kN=\E[222z:kP=\E[216z:kh=\E[214z:kD=^?:\ - :Km=\E[M:@5=\E[197z::@7=\E[220z:\ + :%1=\E[196z:&8=\E[195z:@0=\E[200z:@5=\E[197z:@7=\E[220z:\ + :F1=\E[192z:F2=\E[193z:K2=\E[218z:Km=\E[M:k1=\E[224z:\ + :k2=\E[225z:k3=\E[226z:k4=\E[227z:k5=\E[228z:k6=\E[229z:\ + :k7=\E[230z:k8=\E[231z:k9=\E[232z:k;=\E[233z:kD=\E[3z:\ + :kI=\E[2z:kN=\E[222z:kP=\E[216z:kh=\E[214z:\ :tc=xterm-basic: # # vi may work better with this entry, because vi doesn't use insert mode much. -# |xterm-ic|xterm-vi|xterm with insert character instead of insert mode: +# |xterm-ic|xterm-vi|xterm with insert character instead of insert mode:\ xterm-ic|xterm-vi|xterm with insert char:\ - :im@:ei@:mi@:ic=\E[@:IC=\E[%d@:tc=xterm: + :mi@:\ + :IC=\E[%d@:ei@:ic=\E[@:im@:tc=xterm: # # Compatible with the X11R6.3 xterm +# +# Add the capability to "clear the screen" after exiting vi, more/less, etc. +# +xterm-r6-clear:\ + :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:ue=\E[m:\ + :tc=xterm-r6: xterm-r6|xterm-old|X11R6 xterm:\ + :am:bs:km:mi:ms:pt:xn:\ + :co#80:kn#20:li#24:\ + :*6=\E[4~:@0=\E[1~:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\ + :DO=\E[%dB:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:\ + :F5=\E[28~:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:\ + :FA=\E[34~:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:\ + :as=^N:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\ + :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:eA=\E)0:ei=\E[4l:\ + :ho=\E[H:im=\E[4h:\ :is=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:\ - :rs=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:\ - :AL=\E[%dL:DL=\E[%dM:DC=\E[%dP:DO=\E[%dB:UP=\E[%dA:\ - :LE=\E[%dD:RI=\E[%dC:al=\E[L:am:bl=^G:\ - :bs:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:co#80:\ - :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:ho=\E[H:\ - :im=\E[4h:ei=\E[4l:mi:ks=\E[?1h\E=:ke=\E[?1l\E>:@7=\E[4~:kh=\E[1~:\ :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:\ :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\ - :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\ - :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\ - :kn#20:km:@0=\E[1~:kI=\E[2~:kD=^?:*6=\E[4~:kP=\E[5~:kN=\E[6~:\ - :kb=^H:ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:\ - :li#24:md=\E[1m:me=\E[m:mr=\E[7m:ms:nd=\E[C:pt:\ - :eA=\E)0:as=^N:ae=^O:ml=\El:mu=\Em:\ - :sc=\E7:rc=\E8:sf=\n:so=\E[7m:se=\E[m:sr=\EM:\ - :ti=\E7\E[?47h:te=\E[2J\E[?47l\E8:up=\E[A:us=\E[4m:ue=\E[m:xn: + :kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:\ + :ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\ + :ku=\EOA:md=\E[1m:me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:\ + :rc=\E8:rs=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:\ + :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\ + :ue=\E[m:up=\E[A:us=\E[4m: # # Compatible with the R5 xterm +# +# Add the capability to "clear the screen" after exiting vi, more/less, etc. +# +xterm-r5-clear:\ + :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:ue=\E[m:\ + :tc=xterm-r5: xterm-r5|X11R5 xterm X11R5:\ - :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:UP=\E[%dA:\ - :al=\E[L:am:\ - :bs:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:co#80:\ - :cs=\E[%i%d;%dr:ct=\E[3g:\ - :dc=\E[P:dl=\E[M:\ - :im=\E[4h:ei=\E[4l:mi:\ - :ho=\E[H:\ + :am:bs:km:mi:ms:pt:xn:\ + :co#80:kn#4:li#24:\ + :@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\ + :IC=\E[%d@:UP=\E[%dA:al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\ + :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:\ + :ei=\E[4l:ho=\E[H:im=\E[4h:\ :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l:\ + :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:kb=^H:kd=\EOB:\ + :ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\ + :ku=\EOA:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:rc=\E8:\ :rs=\E>\E[?1;3;4;5;6l\E[4l\E[?7h\E[m\E[r\E[2J\E[H:\ - :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:kb=^H:kd=\EOB:ke=\E[?1l\E>:\ - :kl=\EOD:km:kn#4:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:\ - :@7=\E[4~:kh=\E[1~:\ - :li#24:md=\E[1m:me=\E[m:mr=\E[7m:ms:nd=\E[C:pt:\ - :sc=\E7:rc=\E8:sf=\n:so=\E[7m:se=\E[m:sr=\EM:\ - :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:\ - :up=\E[A:us=\E[4m:ue=\E[m:xn: + :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\ + :up=\E[A:us=\E[4m: +# +# Customization begins here. +xterm-xfree86|xterm terminal emulator (XFree86):\ + :tc=xterm-new: # # This is the only entry which you should have to customize, since "xterm" # is widely used for a variety of incompatible terminal emulations including # color_xterm and rxvt. -xterm|xterm-color|X11 terminal emulator:\ - :ti@:te@:tc=xterm-xfree86: +xterm|X11 terminal emulator:\ + :tc=xterm-new: # :tc=xterm-r6: # dtterm termcap entry - Obtained from Xinside's CDE with permission # from Thomas Roell diff --git a/share/timedef/ja_JP.SJIS.src b/share/timedef/ja_JP.SJIS.src index 8a1de08bb95b..ca6702dc588c 100644 --- a/share/timedef/ja_JP.SJIS.src +++ b/share/timedef/ja_JP.SJIS.src @@ -5,18 +5,18 @@ # # Short month names # - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 + 1ŒŽ + 2ŒŽ + 3ŒŽ + 4ŒŽ + 5ŒŽ + 6ŒŽ + 7ŒŽ + 8ŒŽ + 9ŒŽ +10ŒŽ +11ŒŽ +12ŒŽ # # Long month names (as in a date) # @@ -65,7 +65,7 @@ # # just following tradition... # %a %b %e %H:%M:%S %Y -%a %b/%e %T %Y +%a %_m/%e %T %Y # # am # diff --git a/share/timedef/ja_JP.UTF-8.src b/share/timedef/ja_JP.UTF-8.src index 9ee39a5286fe..21d0eb50d199 100644 --- a/share/timedef/ja_JP.UTF-8.src +++ b/share/timedef/ja_JP.UTF-8.src @@ -4,18 +4,18 @@ # WARNING: empty lines are essential too # # Short month names - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 +10月 +11月 +12月 # # Long month names (as in a date) # @@ -64,7 +64,7 @@ # # just following tradition... # %a %b %e %H:%M:%S %Y -%a %b/%e %T %Y +%a %_m/%e %T %Y # # am # diff --git a/share/timedef/ja_JP.eucJP.src b/share/timedef/ja_JP.eucJP.src index 299f1a7a32bf..155d227c4c58 100644 --- a/share/timedef/ja_JP.eucJP.src +++ b/share/timedef/ja_JP.eucJP.src @@ -4,18 +4,18 @@ # WARNING: empty lines are essential too # # Short month names - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -10 -11 -12 + 1·î + 2·î + 3·î + 4·î + 5·î + 6·î + 7·î + 8·î + 9·î +10·î +11·î +12·î # # Long month names (as in a date) # @@ -64,7 +64,7 @@ # # just following tradition... # %a %b %e %H:%M:%S %Y -%a %b/%e %T %Y +%a %_m/%e %T %Y # # am # diff --git a/share/zoneinfo/Makefile b/share/zoneinfo/Makefile index e25427779794..6de8ef5f9346 100644 --- a/share/zoneinfo/Makefile +++ b/share/zoneinfo/Makefile @@ -29,6 +29,8 @@ # CLEANFILES+= yearistype +CONTRIBDIR= ${.CURDIR}/../../contrib/tzdata/ +.PATH: ${CONTRIBDIR} .if defined(LEAPSECONDS) LEAPFILE= -L leapseconds @@ -44,6 +46,8 @@ POSIXRULES= America/New_York TZFILES+= backward systemv .endif +TZFILES:= ${TZFILES:S/^/${CONTRIBDIR}/} + all: yearistype beforeinstall: @@ -52,6 +56,26 @@ beforeinstall: -u ${BINOWN} -g ${BINGRP} -m ${NOBINMODE} \ ${LEAPFILE} -y ${.OBJDIR}/yearistype ${TZFILES} ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${NOBINMODE} \ - ${.CURDIR}/zone.tab ${DESTDIR}/usr/share/zoneinfo/ + ${CONTRIBDIR}/zone.tab ${DESTDIR}/usr/share/zoneinfo/ + +afterinstall: +# +# If the file /var/db/zoneinfo exists, and it is owned by root:wheel, +# and the contents of it exists in /usr/share/zoneinfo, then reinstall +# it. +# + @if [ -f ${DESTDIR}/var/db/zoneinfo -a -O ${DESTDIR}/var/db/zoneinfo \ + -a -G ${DESTDIR}/var/db/zoneinfo ]; then \ + zf=$$(cat ${DESTDIR}/var/db/zoneinfo); \ + if [ -f ${DESTDIR}/usr/share/zoneinfo/$${zf} ]; then \ + if [ ! -z "${DESTDIR}" ]; then \ + optC="-C ${DESTDIR}"; \ + fi; \ + echo "Updating /etc/localtime"; \ + tzsetup $${optC} -r; \ + fi; \ + else \ + echo "Run tzsetup(8) manually to update /etc/localtime."; \ + fi .include diff --git a/sys/amd64/acpica/acpi_machdep.c b/sys/amd64/acpica/acpi_machdep.c index 0d866e898328..7e7a01aef50c 100644 --- a/sys/amd64/acpica/acpi_machdep.c +++ b/sys/amd64/acpica/acpi_machdep.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include + #include #include @@ -43,6 +44,24 @@ __FBSDID("$FreeBSD$"); #include +/* + * APM driver emulation + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + SYSCTL_DECL(_debug_acpi); int acpi_resume_beep; @@ -54,7 +73,432 @@ int acpi_reset_video; TUNABLE_INT("hw.acpi.reset_video", &acpi_reset_video); static int intr_model = ACPI_INTR_PIC; -static struct apm_clone_data acpi_clone; +static int apm_active; +static struct clonedevs *apm_clones; + +MALLOC_DEFINE(M_APMDEV, "apmdev", "APM device emulation"); + +static d_open_t apmopen; +static d_close_t apmclose; +static d_write_t apmwrite; +static d_ioctl_t apmioctl; +static d_poll_t apmpoll; +static d_kqfilter_t apmkqfilter; +static void apmreadfiltdetach(struct knote *kn); +static int apmreadfilt(struct knote *kn, long hint); +static struct filterops apm_readfiltops = { + .f_isfd = 1, + .f_detach = apmreadfiltdetach, + .f_event = apmreadfilt, +}; + +static struct cdevsw apm_cdevsw = { + .d_version = D_VERSION, + .d_flags = D_TRACKCLOSE | D_NEEDMINOR, + .d_open = apmopen, + .d_close = apmclose, + .d_write = apmwrite, + .d_ioctl = apmioctl, + .d_poll = apmpoll, + .d_name = "apm", + .d_kqfilter = apmkqfilter +}; + +static int +acpi_capm_convert_battstate(struct acpi_battinfo *battp) +{ + int state; + + state = APM_UNKNOWN; + + if (battp->state & ACPI_BATT_STAT_DISCHARG) { + if (battp->cap >= 50) + state = 0; /* high */ + else + state = 1; /* low */ + } + if (battp->state & ACPI_BATT_STAT_CRITICAL) + state = 2; /* critical */ + if (battp->state & ACPI_BATT_STAT_CHARGING) + state = 3; /* charging */ + + /* If still unknown, determine it based on the battery capacity. */ + if (state == APM_UNKNOWN) { + if (battp->cap >= 50) + state = 0; /* high */ + else + state = 1; /* low */ + } + + return (state); +} + +static int +acpi_capm_convert_battflags(struct acpi_battinfo *battp) +{ + int flags; + + flags = 0; + + if (battp->cap >= 50) + flags |= APM_BATT_HIGH; + else { + if (battp->state & ACPI_BATT_STAT_CRITICAL) + flags |= APM_BATT_CRITICAL; + else + flags |= APM_BATT_LOW; + } + if (battp->state & ACPI_BATT_STAT_CHARGING) + flags |= APM_BATT_CHARGING; + if (battp->state == ACPI_BATT_STAT_NOT_PRESENT) + flags = APM_BATT_NOT_PRESENT; + + return (flags); +} + +static int +acpi_capm_get_info(apm_info_t aip) +{ + int acline; + struct acpi_battinfo batt; + + aip->ai_infoversion = 1; + aip->ai_major = 1; + aip->ai_minor = 2; + aip->ai_status = apm_active; + aip->ai_capabilities= 0xff00; /* unknown */ + + if (acpi_acad_get_acline(&acline)) + aip->ai_acline = APM_UNKNOWN; /* unknown */ + else + aip->ai_acline = acline; /* on/off */ + + if (acpi_battery_get_battinfo(NULL, &batt) != 0) { + aip->ai_batt_stat = APM_UNKNOWN; + aip->ai_batt_life = APM_UNKNOWN; + aip->ai_batt_time = -1; /* unknown */ + aip->ai_batteries = ~0U; /* unknown */ + } else { + aip->ai_batt_stat = acpi_capm_convert_battstate(&batt); + aip->ai_batt_life = batt.cap; + aip->ai_batt_time = (batt.min == -1) ? -1 : batt.min * 60; + aip->ai_batteries = acpi_battery_get_units(); + } + + return (0); +} + +static int +acpi_capm_get_pwstatus(apm_pwstatus_t app) +{ + device_t dev; + int acline, unit, error; + struct acpi_battinfo batt; + + if (app->ap_device != PMDV_ALLDEV && + (app->ap_device < PMDV_BATT0 || app->ap_device > PMDV_BATT_ALL)) + return (1); + + if (app->ap_device == PMDV_ALLDEV) + error = acpi_battery_get_battinfo(NULL, &batt); + else { + unit = app->ap_device - PMDV_BATT0; + dev = devclass_get_device(devclass_find("battery"), unit); + if (dev != NULL) + error = acpi_battery_get_battinfo(dev, &batt); + else + error = ENXIO; + } + if (error) + return (1); + + app->ap_batt_stat = acpi_capm_convert_battstate(&batt); + app->ap_batt_flag = acpi_capm_convert_battflags(&batt); + app->ap_batt_life = batt.cap; + app->ap_batt_time = (batt.min == -1) ? -1 : batt.min * 60; + + if (acpi_acad_get_acline(&acline)) + app->ap_acline = APM_UNKNOWN; + else + app->ap_acline = acline; /* on/off */ + + return (0); +} + +/* Create single-use devices for /dev/apm and /dev/apmctl. */ +static void +apm_clone(void *arg, struct ucred *cred, char *name, int namelen, + struct cdev **dev) +{ + int ctl_dev, unit; + + if (*dev != NULL) + return; + if (strcmp(name, "apmctl") == 0) + ctl_dev = TRUE; + else if (strcmp(name, "apm") == 0) + ctl_dev = FALSE; + else + return; + + /* Always create a new device and unit number. */ + unit = -1; + if (clone_create(&apm_clones, &apm_cdevsw, &unit, dev, 0)) { + if (ctl_dev) { + *dev = make_dev(&apm_cdevsw, unit, + UID_ROOT, GID_OPERATOR, 0660, "apmctl%d", unit); + } else { + *dev = make_dev(&apm_cdevsw, unit, + UID_ROOT, GID_OPERATOR, 0664, "apm%d", unit); + } + if (*dev != NULL) { + dev_ref(*dev); + (*dev)->si_flags |= SI_CHEAPCLONE; + } + } +} + +/* Create a struct for tracking per-device suspend notification. */ +static struct apm_clone_data * +apm_create_clone(struct cdev *dev, struct acpi_softc *acpi_sc) +{ + struct apm_clone_data *clone; + + clone = malloc(sizeof(*clone), M_APMDEV, M_WAITOK); + clone->cdev = dev; + clone->acpi_sc = acpi_sc; + clone->notify_status = APM_EV_NONE; + bzero(&clone->sel_read, sizeof(clone->sel_read)); + knlist_init_mtx(&clone->sel_read.si_note, &acpi_mutex); + + /* + * The acpi device is always managed by devd(8) and is considered + * writable (i.e., ack is required to allow suspend to proceed.) + */ + if (strcmp("acpi", devtoname(dev)) == 0) + clone->flags = ACPI_EVF_DEVD | ACPI_EVF_WRITE; + else + clone->flags = ACPI_EVF_NONE; + + ACPI_LOCK(acpi); + STAILQ_INSERT_TAIL(&acpi_sc->apm_cdevs, clone, entries); + ACPI_UNLOCK(acpi); + return (clone); +} + +static int +apmopen(struct cdev *dev, int flag, int fmt, struct thread *td) +{ + struct acpi_softc *acpi_sc; + struct apm_clone_data *clone; + + acpi_sc = devclass_get_softc(devclass_find("acpi"), 0); + clone = apm_create_clone(dev, acpi_sc); + dev->si_drv1 = clone; + + /* If the device is opened for write, record that. */ + if ((flag & FWRITE) != 0) + clone->flags |= ACPI_EVF_WRITE; + + return (0); +} + +static int +apmclose(struct cdev *dev, int flag, int fmt, struct thread *td) +{ + struct apm_clone_data *clone; + struct acpi_softc *acpi_sc; + + clone = dev->si_drv1; + acpi_sc = clone->acpi_sc; + + /* We are about to lose a reference so check if suspend should occur */ + if (acpi_sc->acpi_next_sstate != 0 && + clone->notify_status != APM_EV_ACKED) + acpi_AckSleepState(clone, 0); + + /* Remove this clone's data from the list and free it. */ + ACPI_LOCK(acpi); + STAILQ_REMOVE(&acpi_sc->apm_cdevs, clone, apm_clone_data, entries); + knlist_destroy(&clone->sel_read.si_note); + ACPI_UNLOCK(acpi); + free(clone, M_APMDEV); + destroy_dev_sched(dev); + return (0); +} + +static int +apmioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td) +{ + int error; + struct apm_clone_data *clone; + struct acpi_softc *acpi_sc; + struct apm_info info; + struct apm_event_info *ev_info; + apm_info_old_t aiop; + + error = 0; + clone = dev->si_drv1; + acpi_sc = clone->acpi_sc; + + switch (cmd) { + case APMIO_SUSPEND: + if ((flag & FWRITE) == 0) + return (EPERM); + if (acpi_sc->acpi_next_sstate == 0) { + if (acpi_sc->acpi_suspend_sx != ACPI_STATE_S5) { + error = acpi_ReqSleepState(acpi_sc, + acpi_sc->acpi_suspend_sx); + } else { + printf( + "power off via apm suspend not supported\n"); + error = ENXIO; + } + } else + error = acpi_AckSleepState(clone, 0); + break; + case APMIO_STANDBY: + if ((flag & FWRITE) == 0) + return (EPERM); + if (acpi_sc->acpi_next_sstate == 0) { + if (acpi_sc->acpi_standby_sx != ACPI_STATE_S5) { + error = acpi_ReqSleepState(acpi_sc, + acpi_sc->acpi_standby_sx); + } else { + printf( + "power off via apm standby not supported\n"); + error = ENXIO; + } + } else + error = acpi_AckSleepState(clone, 0); + break; + case APMIO_NEXTEVENT: + printf("apm nextevent start\n"); + ACPI_LOCK(acpi); + if (acpi_sc->acpi_next_sstate != 0 && clone->notify_status == + APM_EV_NONE) { + ev_info = (struct apm_event_info *)addr; + if (acpi_sc->acpi_next_sstate <= ACPI_STATE_S3) + ev_info->type = PMEV_STANDBYREQ; + else + ev_info->type = PMEV_SUSPENDREQ; + ev_info->index = 0; + clone->notify_status = APM_EV_NOTIFIED; + printf("apm event returning %d\n", ev_info->type); + } else + error = EAGAIN; + ACPI_UNLOCK(acpi); + break; + case APMIO_GETINFO_OLD: + if (acpi_capm_get_info(&info)) + error = ENXIO; + aiop = (apm_info_old_t)addr; + aiop->ai_major = info.ai_major; + aiop->ai_minor = info.ai_minor; + aiop->ai_acline = info.ai_acline; + aiop->ai_batt_stat = info.ai_batt_stat; + aiop->ai_batt_life = info.ai_batt_life; + aiop->ai_status = info.ai_status; + break; + case APMIO_GETINFO: + if (acpi_capm_get_info((apm_info_t)addr)) + error = ENXIO; + break; + case APMIO_GETPWSTATUS: + if (acpi_capm_get_pwstatus((apm_pwstatus_t)addr)) + error = ENXIO; + break; + case APMIO_ENABLE: + if ((flag & FWRITE) == 0) + return (EPERM); + apm_active = 1; + break; + case APMIO_DISABLE: + if ((flag & FWRITE) == 0) + return (EPERM); + apm_active = 0; + break; + case APMIO_HALTCPU: + break; + case APMIO_NOTHALTCPU: + break; + case APMIO_DISPLAY: + if ((flag & FWRITE) == 0) + return (EPERM); + break; + case APMIO_BIOS: + if ((flag & FWRITE) == 0) + return (EPERM); + bzero(addr, sizeof(struct apm_bios_arg)); + break; + default: + error = EINVAL; + break; + } + + return (error); +} + +static int +apmwrite(struct cdev *dev, struct uio *uio, int ioflag) +{ + return (uio->uio_resid); +} + +static int +apmpoll(struct cdev *dev, int events, struct thread *td) +{ + struct apm_clone_data *clone; + int revents; + + revents = 0; + ACPI_LOCK(acpi); + clone = dev->si_drv1; + if (clone->acpi_sc->acpi_next_sstate) + revents |= events & (POLLIN | POLLRDNORM); + else + selrecord(td, &clone->sel_read); + ACPI_UNLOCK(acpi); + return (revents); +} + +static int +apmkqfilter(struct cdev *dev, struct knote *kn) +{ + struct apm_clone_data *clone; + + ACPI_LOCK(acpi); + clone = dev->si_drv1; + kn->kn_hook = clone; + kn->kn_fop = &apm_readfiltops; + knlist_add(&clone->sel_read.si_note, kn, 0); + ACPI_UNLOCK(acpi); + return (0); +} + +static void +apmreadfiltdetach(struct knote *kn) +{ + struct apm_clone_data *clone; + + ACPI_LOCK(acpi); + clone = kn->kn_hook; + knlist_remove(&clone->sel_read.si_note, kn, 0); + ACPI_UNLOCK(acpi); +} + +static int +apmreadfilt(struct knote *kn, long hint) +{ + struct apm_clone_data *clone; + int sleeping; + + ACPI_LOCK(acpi); + clone = kn->kn_hook; + sleeping = clone->acpi_sc->acpi_next_sstate ? 1 : 0; + ACPI_UNLOCK(acpi); + return (sleeping); +} int acpi_machdep_init(device_t dev) @@ -63,15 +507,11 @@ acpi_machdep_init(device_t dev) sc = devclass_get_softc(devclass_find("acpi"), 0); - /* Create a fake clone for /dev/acpi. */ + /* Create a clone for /dev/acpi also. */ STAILQ_INIT(&sc->apm_cdevs); - acpi_clone.cdev = sc->acpi_dev_t; - acpi_clone.acpi_sc = sc; - ACPI_LOCK(acpi); - STAILQ_INSERT_TAIL(&sc->apm_cdevs, &acpi_clone, entries); - ACPI_UNLOCK(acpi); - sc->acpi_clone = &acpi_clone; - acpi_install_wakeup_handler(sc); + sc->acpi_clone = apm_create_clone(sc->acpi_dev_t, sc); + clone_setup(&apm_clones); + EVENTHANDLER_REGISTER(dev_clone, apm_clone, 0, 1000); if (intr_model != ACPI_INTR_PIC) acpi_SetIntrModel(intr_model); @@ -361,13 +801,20 @@ nexus_acpi_probe(device_t dev) static int nexus_acpi_attach(device_t dev) { + device_t acpi_dev; + int error; nexus_init_resources(); bus_generic_probe(dev); - if (BUS_ADD_CHILD(dev, 10, "acpi", 0) == NULL) + acpi_dev = BUS_ADD_CHILD(dev, 10, "acpi", 0); + if (acpi_dev == NULL) panic("failed to add acpi0 device"); - return (bus_generic_attach(dev)); + error = bus_generic_attach(dev); + if (error == 0) + acpi_install_wakeup_handler(device_get_softc(acpi_dev)); + + return (error); } static device_method_t nexus_acpi_methods[] = { diff --git a/sys/amd64/acpica/acpi_switch.S b/sys/amd64/acpica/acpi_switch.S index 892dd11c47a5..39f18e53a212 100644 --- a/sys/amd64/acpica/acpi_switch.S +++ b/sys/amd64/acpica/acpi_switch.S @@ -34,20 +34,7 @@ #include "acpi_wakedata.h" #include "assym.s" -#define WAKEUP_DECL(member) \ - .set WAKEUP_ ## member, wakeup_ ## member - wakeup_ctx - - WAKEUP_DECL(xpcb) - WAKEUP_DECL(gdt) - WAKEUP_DECL(efer) - WAKEUP_DECL(pat) - WAKEUP_DECL(star) - WAKEUP_DECL(lstar) - WAKEUP_DECL(cstar) - WAKEUP_DECL(sfmask) - WAKEUP_DECL(cpu) - -#define WAKEUP_CTX(member) WAKEUP_ ## member (%rdi) +#define WAKEUP_CTX(member) wakeup_ ## member - wakeup_ctx(%rdi) #define WAKEUP_PCB(member) PCB_ ## member(%r11) #define WAKEUP_XPCB(member) XPCB_ ## member(%r11) diff --git a/sys/amd64/acpica/acpi_wakecode.S b/sys/amd64/acpica/acpi_wakecode.S index 4e82f53196af..94a34f782ded 100644 --- a/sys/amd64/acpica/acpi_wakecode.S +++ b/sys/amd64/acpica/acpi_wakecode.S @@ -54,18 +54,17 @@ .data /* So we can modify it */ ALIGN_TEXT -wakeup_start: .code16 +wakeup_start: /* * Set up segment registers for real mode, a small stack for * any calls we make, and clear any flags. */ cli /* make sure no interrupts */ - cld mov %cs, %ax /* copy %cs to %ds. Remember these */ mov %ax, %ds /* are offsets rather than selectors */ mov %ax, %ss - movw $PAGE_SIZE - 8, %sp + movw $PAGE_SIZE, %sp xorw %ax, %ax pushw %ax popfw @@ -89,6 +88,11 @@ wakeup_start: movb $0, reset_video - wakeup_start lcall $0xc000, $3 + /* When we reach here, int 0x10 should be ready. Hide cursor. */ + movb $0x01, %ah + movb $0x20, %ch + int $0x10 + /* Re-start in case the previous BIOS call clobbers them. */ jmp wakeup_start 1: @@ -129,6 +133,7 @@ wakeup_sw32: /* * At this point, we are running in 32 bit legacy protected mode. */ + ALIGN_TEXT .code32 wakeup_32: diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/amd64/acpica/acpi_wakeup.c index bcc405fca0a3..d53d8bb659ee 100644 --- a/sys/amd64/acpica/acpi_wakeup.c +++ b/sys/amd64/acpica/acpi_wakeup.c @@ -31,13 +31,11 @@ __FBSDID("$FreeBSD$"); #include -#include #include #include #include #include #include -#include #include #include @@ -46,11 +44,11 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #ifdef SMP #include #include +#include #endif #include @@ -63,23 +61,19 @@ __FBSDID("$FreeBSD$"); /* Make sure the code is less than a page and leave room for the stack. */ CTASSERT(sizeof(wakecode) < PAGE_SIZE - 1024); -#ifndef _SYS_CDEFS_H_ -#error this file needs sys/cdefs.h as a prerequisite -#endif - extern int acpi_resume_beep; extern int acpi_reset_video; #ifdef SMP -extern struct xpcb *stopxpcbs; +extern struct xpcb **stopxpcbs; #else -static struct xpcb *stopxpcbs; +static struct xpcb **stopxpcbs; #endif int acpi_restorecpu(struct xpcb *, vm_offset_t); int acpi_savecpu(struct xpcb *); -static void acpi_alloc_wakeup_handler(void); +static void *acpi_alloc_wakeup_handler(void); static void acpi_stop_beep(void *); #ifdef SMP @@ -110,10 +104,10 @@ acpi_wakeup_ap(struct acpi_softc *sc, int cpu) int apic_id = cpu_apic_ids[cpu]; int ms; - WAKECODE_FIXUP(wakeup_xpcb, struct xpcb *, &stopxpcbs[cpu]); - WAKECODE_FIXUP(wakeup_gdt, uint16_t, stopxpcbs[cpu].xpcb_gdt.rd_limit); + WAKECODE_FIXUP(wakeup_xpcb, struct xpcb *, stopxpcbs[cpu]); + WAKECODE_FIXUP(wakeup_gdt, uint16_t, stopxpcbs[cpu]->xpcb_gdt.rd_limit); WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, - stopxpcbs[cpu].xpcb_gdt.rd_base); + stopxpcbs[cpu]->xpcb_gdt.rd_base); WAKECODE_FIXUP(wakeup_cpu, int, cpu); /* do an INIT IPI: assert RESET */ @@ -251,8 +245,8 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state) cr3 = rcr3(); load_cr3(KPML4phys); - stopfpu = &stopxpcbs[0].xpcb_pcb.pcb_save; - if (acpi_savecpu(&stopxpcbs[0])) { + stopfpu = &stopxpcbs[0]->xpcb_pcb.pcb_save; + if (acpi_savecpu(stopxpcbs[0])) { fpugetregs(curthread, stopfpu); #ifdef SMP @@ -267,11 +261,11 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state) WAKECODE_FIXUP(resume_beep, uint8_t, (acpi_resume_beep != 0)); WAKECODE_FIXUP(reset_video, uint8_t, (acpi_reset_video != 0)); - WAKECODE_FIXUP(wakeup_xpcb, struct xpcb *, &stopxpcbs[0]); + WAKECODE_FIXUP(wakeup_xpcb, struct xpcb *, stopxpcbs[0]); WAKECODE_FIXUP(wakeup_gdt, uint16_t, - stopxpcbs[0].xpcb_gdt.rd_limit); + stopxpcbs[0]->xpcb_gdt.rd_limit); WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, - stopxpcbs[0].xpcb_gdt.rd_base); + stopxpcbs[0]->xpcb_gdt.rd_base); WAKECODE_FIXUP(wakeup_cpu, int, 0); /* Call ACPICA to enter the desired sleep state */ @@ -322,49 +316,48 @@ out: return (ret); } -static vm_offset_t acpi_wakeaddr; - -static void +static void * acpi_alloc_wakeup_handler(void) { void *wakeaddr; - - if (!cold) - return; + int i; /* * Specify the region for our wakeup code. We want it in the low 1 MB - * region, excluding video memory and above (0xa0000). We ask for - * it to be page-aligned, just to be safe. + * region, excluding real mode IVT (0-0x3ff), BDA (0x400-0x4ff), EBDA + * (less than 128KB, below 0xa0000, must be excluded by SMAP and DSDT), + * and ROM area (0xa0000 and above). The temporary page tables must be + * page-aligned. */ - wakeaddr = contigmalloc(4 * PAGE_SIZE, M_DEVBUF, M_NOWAIT, 0, 0x9ffff, - PAGE_SIZE, 0ul); + wakeaddr = contigmalloc(4 * PAGE_SIZE, M_DEVBUF, M_NOWAIT, 0x500, + 0xa0000, PAGE_SIZE, 0ul); if (wakeaddr == NULL) { printf("%s: can't alloc wake memory\n", __func__); - return; + return (NULL); } - stopxpcbs = malloc(mp_ncpus * sizeof(*stopxpcbs), M_DEVBUF, M_NOWAIT); - if (stopxpcbs == NULL) { - contigfree(wakeaddr, 4 * PAGE_SIZE, M_DEVBUF); - printf("%s: can't alloc CPU state memory\n", __func__); - return; - } - acpi_wakeaddr = (vm_offset_t)wakeaddr; -} + stopxpcbs = malloc(mp_ncpus * sizeof(*stopxpcbs), M_DEVBUF, M_WAITOK); + for (i = 0; i < mp_ncpus; i++) + stopxpcbs[i] = malloc(sizeof(**stopxpcbs), M_DEVBUF, M_WAITOK); -SYSINIT(acpiwakeup, SI_SUB_KMEM, SI_ORDER_ANY, acpi_alloc_wakeup_handler, 0); + return (wakeaddr); +} void acpi_install_wakeup_handler(struct acpi_softc *sc) { + static void *wakeaddr = NULL; uint64_t *pt4, *pt3, *pt2; int i; - if (acpi_wakeaddr == 0ul) + if (wakeaddr != NULL) return; - sc->acpi_wakeaddr = acpi_wakeaddr; - sc->acpi_wakephys = vtophys(acpi_wakeaddr); + wakeaddr = acpi_alloc_wakeup_handler(); + if (wakeaddr == NULL) + return; + + sc->acpi_wakeaddr = (vm_offset_t)wakeaddr; + sc->acpi_wakephys = vtophys(wakeaddr); bcopy(wakecode, (void *)WAKECODE_VADDR(sc), sizeof(wakecode)); @@ -390,7 +383,7 @@ acpi_install_wakeup_handler(struct acpi_softc *sc) WAKECODE_FIXUP(wakeup_sfmask, uint64_t, rdmsr(MSR_SF_MASK)); /* Build temporary page tables below realmode code. */ - pt4 = (uint64_t *)acpi_wakeaddr; + pt4 = wakeaddr; pt3 = pt4 + (PAGE_SIZE) / sizeof(uint64_t); pt2 = pt3 + (PAGE_SIZE) / sizeof(uint64_t); diff --git a/sys/amd64/amd64/amd64_mem.c b/sys/amd64/amd64/amd64_mem.c index d7959fd45fb7..e50d3e72828b 100644 --- a/sys/amd64/amd64/amd64_mem.c +++ b/sys/amd64/amd64/amd64_mem.c @@ -707,11 +707,8 @@ amd64_mem_drvinit(void *unused) switch (cpu_vendor_id) { case CPU_VENDOR_INTEL: case CPU_VENDOR_AMD: - break; case CPU_VENDOR_CENTAUR: - if (cpu_exthigh >= 0x80000008) - break; - /* FALLTHROUGH */ + break; default: return; } diff --git a/sys/amd64/isa/atpic_vector.S b/sys/amd64/amd64/atpic_vector.S similarity index 100% rename from sys/amd64/isa/atpic_vector.S rename to sys/amd64/amd64/atpic_vector.S diff --git a/sys/amd64/amd64/bpf_jit_machdep.c b/sys/amd64/amd64/bpf_jit_machdep.c index 4991a5b39beb..6a5793eb81a7 100644 --- a/sys/amd64/amd64/bpf_jit_machdep.c +++ b/sys/amd64/amd64/bpf_jit_machdep.c @@ -1,6 +1,6 @@ /*- * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (C) 2005-2008 Jung-uk Kim + * Copyright (C) 2005-2009 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,6 +42,9 @@ __FBSDID("$FreeBSD$"); #include #else #include +#include +#include +#include #endif #include @@ -51,21 +54,22 @@ __FBSDID("$FreeBSD$"); #include -bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, int *); +bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, size_t *); /* - * emit routine to update the jump table + * Emit routine to update the jump table. */ static void emit_length(bpf_bin_stream *stream, __unused u_int value, u_int len) { - (stream->refs)[stream->bpf_pc] += len; + if (stream->refs != NULL) + (stream->refs)[stream->bpf_pc] += len; stream->cur_ip += len; } /* - * emit routine to output the actual binary code + * Emit routine to output the actual binary code. */ static void emit_code(bpf_bin_stream *stream, u_int value, u_int len) @@ -92,53 +96,120 @@ emit_code(bpf_bin_stream *stream, u_int value, u_int len) } /* - * Function that does the real stuff + * Scan the filter program and find possible optimization. + */ +static int +bpf_jit_optimize(struct bpf_insn *prog, u_int nins) +{ + int flags; + u_int i; + + /* Do we return immediately? */ + if (BPF_CLASS(prog[0].code) == BPF_RET) + return (BPF_JIT_FRET); + + for (flags = 0, i = 0; i < nins; i++) { + switch (prog[i].code) { + case BPF_LD|BPF_W|BPF_ABS: + case BPF_LD|BPF_H|BPF_ABS: + case BPF_LD|BPF_B|BPF_ABS: + case BPF_LD|BPF_W|BPF_IND: + case BPF_LD|BPF_H|BPF_IND: + case BPF_LD|BPF_B|BPF_IND: + case BPF_LDX|BPF_MSH|BPF_B: + flags |= BPF_JIT_FPKT; + break; + case BPF_LD|BPF_MEM: + case BPF_LDX|BPF_MEM: + case BPF_ST: + case BPF_STX: + flags |= BPF_JIT_FMEM; + break; + case BPF_LD|BPF_W|BPF_LEN: + case BPF_LDX|BPF_W|BPF_LEN: + flags |= BPF_JIT_FLEN; + break; + case BPF_JMP|BPF_JA: + case BPF_JMP|BPF_JGT|BPF_K: + case BPF_JMP|BPF_JGE|BPF_K: + case BPF_JMP|BPF_JEQ|BPF_K: + case BPF_JMP|BPF_JSET|BPF_K: + case BPF_JMP|BPF_JGT|BPF_X: + case BPF_JMP|BPF_JGE|BPF_X: + case BPF_JMP|BPF_JEQ|BPF_X: + case BPF_JMP|BPF_JSET|BPF_X: + flags |= BPF_JIT_FJMP; + break; + } + if (flags == BPF_JIT_FLAG_ALL) + break; + } + + return (flags); +} + +/* + * Function that does the real stuff. */ bpf_filter_func -bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) +bpf_jit_compile(struct bpf_insn *prog, u_int nins, size_t *size) { - struct bpf_insn *ins; - u_int i, pass; bpf_bin_stream stream; + struct bpf_insn *ins; + int flags, fret, fpkt, fmem, fjmp, flen; + u_int i, pass; /* - * NOTE: do not modify the name of this variable, as it's used by + * NOTE: Do not modify the name of this variable, as it's used by * the macros to emit code. */ emit_func emitm; - /* Allocate the reference table for the jumps */ + flags = bpf_jit_optimize(prog, nins); + fret = (flags & BPF_JIT_FRET) != 0; + fpkt = (flags & BPF_JIT_FPKT) != 0; + fmem = (flags & BPF_JIT_FMEM) != 0; + fjmp = (flags & BPF_JIT_FJMP) != 0; + flen = (flags & BPF_JIT_FLEN) != 0; + + if (fret) + nins = 1; + + memset(&stream, 0, sizeof(stream)); + + /* Allocate the reference table for the jumps. */ + if (fjmp) { #ifdef _KERNEL - stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int), - M_BPFJIT, M_NOWAIT); + stream.refs = malloc((nins + 1) * sizeof(u_int), M_BPFJIT, + M_NOWAIT | M_ZERO); #else - stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int)); + stream.refs = calloc(nins + 1, sizeof(u_int)); #endif - if (stream.refs == NULL) - return (NULL); - - /* Reset the reference table */ - for (i = 0; i < nins + 1; i++) - stream.refs[i] = 0; - - stream.cur_ip = 0; - stream.bpf_pc = 0; + if (stream.refs == NULL) + return (NULL); + } /* - * the first pass will emit the lengths of the instructions - * to create the reference table + * The first pass will emit the lengths of the instructions + * to create the reference table. */ emitm = emit_length; - pass = 0; - for (;;) { + for (pass = 0; pass < 2; pass++) { ins = prog; - /* create the procedure header */ - MOVrq2(RBX, R8); - MOVrq(RDI, RBX); - MOVrd2(ESI, R9D); - MOVrd(EDX, EDI); + /* Create the procedure header. */ + if (fmem) { + PUSH(RBP); + MOVrq(RSP, RBP); + SUBib(BPF_MEMWORDS * sizeof(uint32_t), RSP); + } + if (flen) + MOVrd2(ESI, R9D); + if (fpkt) { + MOVrq2(RDI, R8); + MOVrd(EDX, EDI); + } for (i = 0; i < nins; i++) { stream.bpf_pc++; @@ -153,12 +224,14 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_RET|BPF_K: MOVid(ins->k, EAX); - MOVrq3(R8, RBX); + if (fmem) + LEAVE(); RET(); break; case BPF_RET|BPF_A: - MOVrq3(R8, RBX); + if (fmem) + LEAVE(); RET(); break; @@ -169,11 +242,17 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) MOVrd(EDI, ECX); SUBrd(ESI, ECX); CMPid(sizeof(int32_t), ECX); - JAEb(6); - ZEROrd(EAX); - MOVrq3(R8, RBX); + if (fmem) { + JAEb(4); + ZEROrd(EAX); + LEAVE(); + } else { + JAEb(3); + ZEROrd(EAX); + } RET(); - MOVobd(RBX, RSI, EAX); + MOVrq3(R8, RCX); + MOVobd(RCX, RSI, EAX); BSWAP(EAX); break; @@ -185,10 +264,14 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) MOVrd(EDI, ECX); SUBrd(ESI, ECX); CMPid(sizeof(int16_t), ECX); - JAEb(4); - MOVrq3(R8, RBX); + if (fmem) { + JAEb(2); + LEAVE(); + } else + JAEb(1); RET(); - MOVobw(RBX, RSI, AX); + MOVrq3(R8, RCX); + MOVobw(RCX, RSI, AX); SWAP_AX(); break; @@ -196,10 +279,14 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) ZEROrd(EAX); MOVid(ins->k, ESI); CMPrd(EDI, ESI); - JBb(4); - MOVrq3(R8, RBX); + if (fmem) { + JBb(2); + LEAVE(); + } else + JBb(1); RET(); - MOVobb(RBX, RSI, AL); + MOVrq3(R8, RCX); + MOVobb(RCX, RSI, AL); break; case BPF_LD|BPF_W|BPF_LEN: @@ -222,11 +309,17 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) MOVrd(EDI, ECX); SUBrd(ESI, ECX); CMPid(sizeof(int32_t), ECX); - JAEb(6); - ZEROrd(EAX); - MOVrq3(R8, RBX); + if (fmem) { + JAEb(4); + ZEROrd(EAX); + LEAVE(); + } else { + JAEb(3); + ZEROrd(EAX); + } RET(); - MOVobd(RBX, RSI, EAX); + MOVrq3(R8, RCX); + MOVobd(RCX, RSI, EAX); BSWAP(EAX); break; @@ -243,10 +336,14 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) MOVrd(EDI, ECX); SUBrd(ESI, ECX); CMPid(sizeof(int16_t), ECX); - JAEb(4); - MOVrq3(R8, RBX); + if (fmem) { + JAEb(2); + LEAVE(); + } else + JAEb(1); RET(); - MOVobw(RBX, RSI, AX); + MOVrq3(R8, RCX); + MOVobw(RCX, RSI, AX); SWAP_AX(); break; @@ -258,22 +355,32 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) MOVrd(EDI, ECX); SUBrd(EDX, ECX); CMPrd(ESI, ECX); - JAb(4); - MOVrq3(R8, RBX); + if (fmem) { + JAb(2); + LEAVE(); + } else + JAb(1); RET(); + MOVrq3(R8, RCX); ADDrd(EDX, ESI); - MOVobb(RBX, RSI, AL); + MOVobb(RCX, RSI, AL); break; case BPF_LDX|BPF_MSH|BPF_B: MOVid(ins->k, ESI); CMPrd(EDI, ESI); - JBb(6); - ZEROrd(EAX); - MOVrq3(R8, RBX); + if (fmem) { + JBb(4); + ZEROrd(EAX); + LEAVE(); + } else { + JBb(3); + ZEROrd(EAX); + } RET(); ZEROrd(EDX); - MOVobb(RBX, RSI, DL); + MOVrq3(R8, RCX); + MOVobb(RCX, RSI, DL); ANDib(0x0f, DL); SHLib(2, EDX); break; @@ -287,15 +394,13 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_MEM: - MOViq((uintptr_t)mem, RCX); - MOVid(ins->k * 4, ESI); - MOVobd(RCX, RSI, EAX); + MOVid(ins->k * sizeof(uint32_t), ESI); + MOVobd(RSP, RSI, EAX); break; case BPF_LDX|BPF_MEM: - MOViq((uintptr_t)mem, RCX); - MOVid(ins->k * 4, ESI); - MOVobd(RCX, RSI, EDX); + MOVid(ins->k * sizeof(uint32_t), ESI); + MOVobd(RSP, RSI, EDX); break; case BPF_ST: @@ -304,15 +409,13 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) * be optimized if the previous instruction * was already of this type */ - MOViq((uintptr_t)mem, RCX); - MOVid(ins->k * 4, ESI); - MOVomd(EAX, RCX, RSI); + MOVid(ins->k * sizeof(uint32_t), ESI); + MOVomd(EAX, RSP, RSI); break; case BPF_STX: - MOViq((uintptr_t)mem, RCX); - MOVid(ins->k * 4, ESI); - MOVomd(EDX, RCX, RSI); + MOVid(ins->k * sizeof(uint32_t), ESI); + MOVomd(EDX, RSP, RSI); break; case BPF_JMP|BPF_JA: @@ -392,9 +495,14 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_ALU|BPF_DIV|BPF_X: TESTrd(EDX, EDX); - JNEb(6); - ZEROrd(EAX); - MOVrq3(R8, RBX); + if (fmem) { + JNEb(4); + ZEROrd(EAX); + LEAVE(); + } else { + JNEb(3); + ZEROrd(EAX); + } RET(); MOVrd(EDX, ECX); ZEROrd(EDX); @@ -474,47 +582,56 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) ins++; } - pass++; - if (pass == 2) - break; + if (pass > 0) + continue; + *size = stream.cur_ip; #ifdef _KERNEL - stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT); - if (stream.ibuf == NULL) { - free(stream.refs, M_BPFJIT); - return (NULL); - } + stream.ibuf = malloc(*size, M_BPFJIT, M_NOWAIT); + if (stream.ibuf == NULL) + break; #else - stream.ibuf = (char *)malloc(stream.cur_ip); - if (stream.ibuf == NULL) { - free(stream.refs); - return (NULL); + stream.ibuf = mmap(NULL, *size, PROT_READ | PROT_WRITE, + MAP_ANON, -1, 0); + if (stream.ibuf == MAP_FAILED) { + stream.ibuf = NULL; + break; } #endif /* - * modify the reference table to contain the offsets and - * not the lengths of the instructions + * Modify the reference table to contain the offsets and + * not the lengths of the instructions. */ - for (i = 1; i < nins + 1; i++) - stream.refs[i] += stream.refs[i - 1]; + if (fjmp) + for (i = 1; i < nins + 1; i++) + stream.refs[i] += stream.refs[i - 1]; - /* Reset the counters */ + /* Reset the counters. */ stream.cur_ip = 0; stream.bpf_pc = 0; - /* the second pass creates the actual code */ + /* The second pass creates the actual code. */ emitm = emit_code; } /* - * the reference table is needed only during compilation, - * now we can free it + * The reference table is needed only during compilation, + * now we can free it. */ + if (fjmp) #ifdef _KERNEL - free(stream.refs, M_BPFJIT); + free(stream.refs, M_BPFJIT); #else - free(stream.refs); + free(stream.refs); +#endif + +#ifndef _KERNEL + if (stream.ibuf != NULL && + mprotect(stream.ibuf, *size, PROT_READ | PROT_EXEC) != 0) { + munmap(stream.ibuf, *size); + stream.ibuf = NULL; + } #endif return ((bpf_filter_func)stream.ibuf); diff --git a/sys/amd64/amd64/bpf_jit_machdep.h b/sys/amd64/amd64/bpf_jit_machdep.h index 2f91ff6dc33f..aa7f342fb631 100644 --- a/sys/amd64/amd64/bpf_jit_machdep.h +++ b/sys/amd64/amd64/bpf_jit_machdep.h @@ -1,6 +1,6 @@ /*- * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (C) 2005-2008 Jung-uk Kim + * Copyright (C) 2005-2009 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -85,7 +85,17 @@ #define DL 2 #define BL 3 -/* A stream of native binary code.*/ +/* Optimization flags */ +#define BPF_JIT_FRET 0x01 +#define BPF_JIT_FPKT 0x02 +#define BPF_JIT_FMEM 0x04 +#define BPF_JIT_FJMP 0x08 +#define BPF_JIT_FLEN 0x10 + +#define BPF_JIT_FLAG_ALL \ + (BPF_JIT_FPKT | BPF_JIT_FMEM | BPF_JIT_FJMP | BPF_JIT_FLEN) + +/* A stream of native binary code */ typedef struct bpf_bin_stream { /* Current native instruction pointer. */ int cur_ip; @@ -117,7 +127,7 @@ typedef struct bpf_bin_stream { typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* - * native Instruction Macros + * Native instruction macros */ /* movl i32,r32 */ @@ -215,8 +225,18 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, 0xc486, 2); \ } while (0) -/* ret */ -#define RET() do { \ +/* pushq r64 */ +#define PUSH(r64) do { \ + emitm(&stream, (5 << 4) | (0 << 3) | (r64 & 0x7), 1); \ +} while (0) + +/* leaveq */ +#define LEAVE() do { \ + emitm(&stream, 0xc9, 1); \ +} while (0) + +/* retq */ +#define RET() do { \ emitm(&stream, 0xc3, 1); \ } while (0) @@ -253,6 +273,13 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, i32, 4); \ } while (0) +/* subq i8,r64 */ +#define SUBib(i8, r64) do { \ + emitm(&stream, 0x8348, 2); \ + emitm(&stream, (29 << 3) | (r64 & 0x7), 1); \ + emitm(&stream, i8, 1); \ +} while (0) + /* mull r32 */ #define MULrd(r32) do { \ emitm(&stream, 0xf7, 1); \ diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c index 3197d154960c..fae6ef36687b 100644 --- a/sys/amd64/amd64/busdma_machdep.c +++ b/sys/amd64/amd64/busdma_machdep.c @@ -239,8 +239,7 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, newtag->alignment = alignment; newtag->boundary = boundary; newtag->lowaddr = trunc_page((vm_paddr_t)lowaddr) + (PAGE_SIZE - 1); - newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + - (PAGE_SIZE - 1); + newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + (PAGE_SIZE - 1); newtag->filter = filter; newtag->filterarg = filterarg; newtag->maxsize = maxsize; @@ -605,13 +604,18 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, vendaddr = (vm_offset_t)buf + buflen; while (vaddr < vendaddr) { + bus_size_t sg_len; + + sg_len = PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK); if (pmap) paddr = pmap_extract(pmap, vaddr); else paddr = pmap_kextract(vaddr); - if (run_filter(dmat, paddr) != 0) + if (run_filter(dmat, paddr) != 0) { + sg_len = roundup2(sg_len, dmat->alignment); map->pagesneeded++; - vaddr += (PAGE_SIZE - ((vm_offset_t)vaddr & PAGE_MASK)); + } + vaddr += sg_len; } CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded); } @@ -644,6 +648,8 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bmask = ~(dmat->boundary - 1); for (seg = *segp; buflen > 0 ; ) { + bus_size_t max_sgsize; + /* * Get the physical address for this segment. */ @@ -655,11 +661,15 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, /* * Compute the segment size, and adjust counts. */ - sgsize = PAGE_SIZE - ((u_long)curaddr & PAGE_MASK); - if (sgsize > dmat->maxsegsz) - sgsize = dmat->maxsegsz; - if (buflen < sgsize) - sgsize = buflen; + max_sgsize = MIN(buflen, dmat->maxsegsz); + sgsize = PAGE_SIZE - ((vm_offset_t)curaddr & PAGE_MASK); + if (map->pagesneeded != 0 && run_filter(dmat, curaddr)) { + sgsize = roundup2(sgsize, dmat->alignment); + sgsize = MIN(sgsize, max_sgsize); + curaddr = add_bounce_page(dmat, map, vaddr, sgsize); + } else { + sgsize = MIN(sgsize, max_sgsize); + } /* * Make sure we don't cross any boundaries. @@ -670,9 +680,6 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat, sgsize = (baddr - curaddr); } - if (map->pagesneeded != 0 && run_filter(dmat, curaddr)) - curaddr = add_bounce_page(dmat, map, vaddr, sgsize); - /* * Insert chunk into a segment, coalescing with * previous segment if possible. diff --git a/sys/amd64/amd64/elf_machdep.c b/sys/amd64/amd64/elf_machdep.c index d5e7a6ead787..dc7c8b9ed8a6 100644 --- a/sys/amd64/amd64/elf_machdep.c +++ b/sys/amd64/amd64/elf_machdep.c @@ -89,7 +89,7 @@ static Elf64_Brandinfo freebsd_brand_info = { .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE }; -SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t) elf64_insert_brand_entry, &freebsd_brand_info); diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 3d1a20ee2013..16d50c590148 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -595,7 +595,7 @@ MCOUNT_LABEL(bintr) .text SUPERALIGN_TEXT -#include +#include #endif .text diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c index 766977df23df..aecec7a96662 100644 --- a/sys/amd64/amd64/identcpu.c +++ b/sys/amd64/amd64/identcpu.c @@ -61,7 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include /* XXX - should be in header file: */ void printcpuinfo(void); @@ -259,7 +259,7 @@ printcpuinfo(void) "\024SSE4.1" "\025SSE4.2" "\026x2APIC" /* xAPIC Extensions */ - "\027" + "\027MOVBE" "\030POPCNT" "\031" "\032" @@ -607,6 +607,21 @@ print_AMD_info(void) printf(", %d lines/tag", (regs[2] >> 8) & 0x0f); print_AMD_l2_assoc((regs[2] >> 12) & 0x0f); } + + /* + * Opteron Rev E shows a bug as in very rare occasions a read memory + * barrier is not performed as expected if it is followed by a + * non-atomic read-modify-write instruction. + * As long as that bug pops up very rarely (intensive machine usage + * on other operating systems generally generates one unexplainable + * crash any 2 months) and as long as a model specific fix would be + * impratical at this stage, print out a warning string if the broken + * model and family are identified. + */ + if (CPUID_TO_FAMILY(cpu_id) == 0xf && CPUID_TO_MODEL(cpu_id) >= 0x20 && + CPUID_TO_MODEL(cpu_id) <= 0x3f) + printf("WARNING: This architecture revision has known SMP " + "hardware bugs which may cause random instability\n"); } static void diff --git a/sys/amd64/amd64/initcpu.c b/sys/amd64/amd64/initcpu.c index 4376dd057026..c97ad3dbbb19 100644 --- a/sys/amd64/amd64/initcpu.c +++ b/sys/amd64/amd64/initcpu.c @@ -47,6 +47,12 @@ __FBSDID("$FreeBSD$"); static int hw_instruction_sse; SYSCTL_INT(_hw, OID_AUTO, instruction_sse, CTLFLAG_RD, &hw_instruction_sse, 0, "SIMD/MMX2 instructions available in CPU"); +/* + * -1: automatic (default) + * 0: keep enable CLFLUSH + * 1: force disable CLFLUSH + */ +static int hw_clflush_disable = -1; int cpu; /* Are we 386, 386sx, 486, etc? */ u_int cpu_feature; /* Feature flags */ @@ -157,6 +163,11 @@ initializecpu(void) CPUID_TO_FAMILY(cpu_id) == 0x6 && CPUID_TO_MODEL(cpu_id) >= 0xf) init_via(); +} + +void +initializecpucache() +{ /* * CPUID with %eax = 1, %ebx returns @@ -165,4 +176,19 @@ initializecpu(void) */ if ((cpu_feature & CPUID_CLFSH) != 0) cpu_clflush_line_size = ((cpu_procinfo >> 8) & 0xff) * 8; + /* + * XXXKIB: (temporary) hack to work around traps generated when + * CLFLUSHing APIC registers window. + */ + TUNABLE_INT_FETCH("hw.clflush_disable", &hw_clflush_disable); + if (cpu_vendor_id == CPU_VENDOR_INTEL && !(cpu_feature & CPUID_SS) && + hw_clflush_disable == -1) + cpu_feature &= ~CPUID_CLFSH; + /* + * Allow to disable CLFLUSH feature manually by + * hw.clflush_disable tunable. This may help Xen guest on some AMD + * CPUs. + */ + if (hw_clflush_disable == 1) + cpu_feature &= ~CPUID_CLFSH; } diff --git a/sys/amd64/amd64/intr_machdep.c b/sys/amd64/amd64/intr_machdep.c index 212ac0d7b267..8360aca05632 100644 --- a/sys/amd64/amd64/intr_machdep.c +++ b/sys/amd64/amd64/intr_machdep.c @@ -62,8 +62,8 @@ #include #include #include -#include -#include +#include +#include #endif #define MAX_STRAY_LOG 5 @@ -400,6 +400,23 @@ atpic_reset(void) } #endif +/* Add a description to an active interrupt handler. */ +int +intr_describe(u_int vector, void *ih, const char *descr) +{ + struct intsrc *isrc; + int error; + + isrc = intr_lookup_source(vector); + if (isrc == NULL) + return (EINVAL); + error = intr_event_describe_handler(isrc->is_event, ih, descr); + if (error) + return (error); + intrcnt_updatename(isrc); + return (0); +} + #ifdef DDB /* * Dump data about interrupt handlers diff --git a/sys/amd64/amd64/io.c b/sys/amd64/amd64/io.c index 02d9c8dab230..09d6e8965822 100644 --- a/sys/amd64/amd64/io.c +++ b/sys/amd64/amd64/io.c @@ -76,3 +76,12 @@ ioclose(struct cdev *dev __unused, int flags __unused, int fmt __unused, return (0); } + +/* ARGSUSED */ +int +ioioctl(struct cdev *dev __unused, u_long cmd __unused, caddr_t data __unused, + int fflag __unused, struct thread *td __unused) +{ + + return (ENXIO); +} diff --git a/sys/amd64/amd64/local_apic.c b/sys/amd64/amd64/local_apic.c index 87bec91b6c4f..0d04bbd4a696 100644 --- a/sys/amd64/amd64/local_apic.c +++ b/sys/amd64/amd64/local_apic.c @@ -160,6 +160,9 @@ static uint32_t lvt_mode(struct lapic *la, u_int pin, uint32_t value); struct pic lapic_pic = { .pic_resume = lapic_resume }; +static int lapic_allclocks; +TUNABLE_INT("machdep.lapic_allclocks", &lapic_allclocks); + static uint32_t lvt_mode(struct lapic *la, u_int pin, uint32_t value) { @@ -415,10 +418,11 @@ lapic_disable_pmc(void) /* * Called by cpu_initclocks() on the BSP to setup the local APIC timer so * that it can drive hardclock, statclock, and profclock. This function - * returns true if it is able to use the local APIC timer to drive the - * clocks and false if it is not able. + * returns a positive integer if it is convenient to use the local APIC + * for all the clocks, a negative integer if it is convenient to use the + * local APIC only for the hardclock and 0 if none of them can be handled. */ -int +enum lapic_clock lapic_setup_clock(void) { u_long value; @@ -426,10 +430,10 @@ lapic_setup_clock(void) /* Can't drive the timer without a local APIC. */ if (lapic == NULL) - return (0); + return (LAPIC_CLOCK_NONE); if (resource_int_value("apic", 0, "clock", &i) == 0 && i == 0) - return (0); + return (LAPIC_CLOCK_NONE); /* Start off with a divisor of 2 (power on reset default). */ lapic_timer_divisor = 2; @@ -448,7 +452,7 @@ lapic_setup_clock(void) panic("lapic: Divisor too big"); value /= 2; if (bootverbose) - printf("lapic: Divisor %lu, Frequency %lu hz\n", + printf("lapic: Divisor %lu, Frequency %lu Hz\n", lapic_timer_divisor, value); /* @@ -461,19 +465,27 @@ lapic_setup_clock(void) * (and profhz) run at hz. If 'hz' is below 1500 but above * 750, then we let the lapic timer run at 2 * 'hz'. If 'hz' * is below 750 then we let the lapic timer run at 4 * 'hz'. + * + * Please note that stathz and profhz are set only if all the + * clocks are handled through the local APIC. */ - if (hz >= 1500) + if (lapic_allclocks != 0) { + if (hz >= 1500) + lapic_timer_hz = hz; + else if (hz >= 750) + lapic_timer_hz = hz * 2; + else + lapic_timer_hz = hz * 4; + } else lapic_timer_hz = hz; - else if (hz >= 750) - lapic_timer_hz = hz * 2; - else - lapic_timer_hz = hz * 4; - if (lapic_timer_hz < 128) - stathz = lapic_timer_hz; - else - stathz = lapic_timer_hz / (lapic_timer_hz / 128); - profhz = lapic_timer_hz; lapic_timer_period = value / lapic_timer_hz; + if (lapic_allclocks != 0) { + if (lapic_timer_hz < 128) + stathz = lapic_timer_hz; + else + stathz = lapic_timer_hz / (lapic_timer_hz / 128); + profhz = lapic_timer_hz; + } /* * Start up the timer on the BSP. The APs will kick off their @@ -481,7 +493,7 @@ lapic_setup_clock(void) */ lapic_timer_periodic(lapic_timer_period); lapic_timer_enable_intr(); - return (1); + return (lapic_allclocks == 0 ? LAPIC_CLOCK_HARDCLOCK : LAPIC_CLOCK_ALL); } void @@ -784,20 +796,23 @@ lapic_handle_timer(struct trapframe *frame) else hardclock_cpu(TRAPF_USERMODE(frame)); } + if (lapic_allclocks != 0) { - /* Fire statclock at stathz. */ - la->la_stat_ticks += stathz; - if (la->la_stat_ticks >= lapic_timer_hz) { - la->la_stat_ticks -= lapic_timer_hz; - statclock(TRAPF_USERMODE(frame)); - } + /* Fire statclock at stathz. */ + la->la_stat_ticks += stathz; + if (la->la_stat_ticks >= lapic_timer_hz) { + la->la_stat_ticks -= lapic_timer_hz; + statclock(TRAPF_USERMODE(frame)); + } - /* Fire profclock at profhz, but only when needed. */ - la->la_prof_ticks += profhz; - if (la->la_prof_ticks >= lapic_timer_hz) { - la->la_prof_ticks -= lapic_timer_hz; - if (profprocs != 0) - profclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); + /* Fire profclock at profhz, but only when needed. */ + la->la_prof_ticks += profhz; + if (la->la_prof_ticks >= lapic_timer_hz) { + la->la_prof_ticks -= lapic_timer_hz; + if (profprocs != 0) + profclock(TRAPF_USERMODE(frame), + TRAPF_PC(frame)); + } } critical_exit(); } diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index 95db5d2d6053..231897509a36 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -128,7 +128,7 @@ __FBSDID("$FreeBSD$"); #endif #ifdef DEV_ATPIC -#include +#include #else #include #endif @@ -157,6 +157,8 @@ SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); extern vm_offset_t ksym_start, ksym_end; #endif +struct msgbuf *msgbufp; + /* Intel ICH registers */ #define ICH_PMBASE 0x400 #define ICH_SMI_EN ICH_PMBASE + 0x30 @@ -415,7 +417,7 @@ sigreturn(td, uap) ucontext_t uc; struct proc *p = td->td_proc; struct trapframe *regs; - const ucontext_t *ucp; + ucontext_t *ucp; long rflags; int cs, error, ret; ksiginfo_t ksi; @@ -478,7 +480,6 @@ sigreturn(td, uap) td->td_pcb->pcb_fsbase = ucp->uc_mcontext.mc_fsbase; td->td_pcb->pcb_gsbase = ucp->uc_mcontext.mc_gsbase; - PROC_LOCK(p); #if defined(COMPAT_43) if (ucp->uc_mcontext.mc_onstack & 1) td->td_sigstk.ss_flags |= SS_ONSTACK; @@ -486,10 +487,7 @@ sigreturn(td, uap) td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); td->td_pcb->pcb_flags |= PCB_FULLCTX; td->td_pcb->pcb_full_iret = 1; return (EJUSTRETURN); @@ -1279,7 +1277,7 @@ add_smap_entry(struct bios_smap *smap, vm_paddr_t *physmap, int *physmap_idxp) static void getmemsize(caddr_t kmdp, u_int64_t first) { - int i, off, physmap_idx, pa_indx, da_indx; + int i, physmap_idx, pa_indx, da_indx; vm_paddr_t pa, physmap[PHYSMAP_SIZE]; u_long physmem_tunable; pt_entry_t *pte; @@ -1512,9 +1510,7 @@ do_next: phys_avail[pa_indx] -= round_page(MSGBUF_SIZE); /* Map the message buffer. */ - for (off = 0; off < round_page(MSGBUF_SIZE); off += PAGE_SIZE) - pmap_kenter((vm_offset_t)msgbufp + off, phys_avail[pa_indx] + - off); + msgbufp = (struct msgbuf *)PHYS_TO_DMAP(phys_avail[pa_indx]); } u_int64_t @@ -1667,6 +1663,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree) identify_cpu(); /* Final stage of CPU initialization */ initializecpu(); /* Initialize CPU registers */ + initializecpucache(); /* make an initial tss so cpu can get interrupt stack on syscall! */ common_tss[0].tss_rsp0 = thread0.td_kstack + \ diff --git a/sys/amd64/amd64/mca.c b/sys/amd64/amd64/mca.c index d291d009ee23..b0e842a778ba 100644 --- a/sys/amd64/amd64/mca.c +++ b/sys/amd64/amd64/mca.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -117,48 +118,6 @@ sysctl_mca_records(SYSCTL_HANDLER_ARGS) return (SYSCTL_OUT(req, &record, sizeof(record))); } -static struct mca_record * -mca_record_entry(int bank) -{ - struct mca_internal *rec; - uint64_t status; - u_int p[4]; - - status = rdmsr(MSR_MC_STATUS(bank)); - if (!(status & MC_STATUS_VAL)) - return (NULL); - - rec = malloc(sizeof(*rec), M_MCA, M_NOWAIT | M_ZERO); - if (rec == NULL) { - printf("MCA: Unable to allocate space for an event.\n"); - return (NULL); - } - - /* Save exception information. */ - rec->rec.mr_status = status; - if (status & MC_STATUS_ADDRV) - rec->rec.mr_addr = rdmsr(MSR_MC_ADDR(bank)); - if (status & MC_STATUS_MISCV) - rec->rec.mr_misc = rdmsr(MSR_MC_MISC(bank)); - rec->rec.mr_tsc = rdtsc(); - rec->rec.mr_apic_id = PCPU_GET(apic_id); - - /* - * Clear machine check. Don't do this for uncorrectable - * errors so that the BIOS can see them. - */ - if (!(rec->rec.mr_status & (MC_STATUS_PCC | MC_STATUS_UC))) { - wrmsr(MSR_MC_STATUS(bank), 0); - do_cpuid(0, p); - } - - mtx_lock_spin(&mca_lock); - STAILQ_INSERT_TAIL(&mca_records, rec, link); - mca_count++; - mtx_unlock_spin(&mca_lock); - return (&rec->rec); -} - static const char * mca_error_ttype(uint16_t mca_error) { @@ -219,11 +178,13 @@ mca_error_request(uint16_t mca_error) } /* Dump details about a single machine check. */ -static void -mca_log(struct mca_record *rec) +static void __nonnull(1) +mca_log(const struct mca_record *rec) { uint16_t mca_error; + printf("MCA: bank %d, status 0x%016llx\n", rec->mr_bank, + (long long)rec->mr_status); printf("MCA: CPU %d ", rec->mr_apic_id); if (rec->mr_status & MC_STATUS_UC) printf("UNCOR "); @@ -327,6 +288,61 @@ mca_log(struct mca_record *rec) printf("\n"); if (rec->mr_status & MC_STATUS_ADDRV) printf("MCA: Address 0x%llx\n", (long long)rec->mr_addr); + if (rec->mr_status & MC_STATUS_MISCV) + printf("MCA: Misc 0x%llx\n", (long long)rec->mr_misc); +} + +static int __nonnull(2) +mca_check_status(int bank, struct mca_record *rec) +{ + uint64_t status; + u_int p[4]; + + status = rdmsr(MSR_MC_STATUS(bank)); + if (!(status & MC_STATUS_VAL)) + return (0); + + /* Save exception information. */ + rec->mr_status = status; + rec->mr_bank = bank; + rec->mr_addr = 0; + if (status & MC_STATUS_ADDRV) + rec->mr_addr = rdmsr(MSR_MC_ADDR(bank)); + rec->mr_misc = 0; + if (status & MC_STATUS_MISCV) + rec->mr_misc = rdmsr(MSR_MC_MISC(bank)); + rec->mr_tsc = rdtsc(); + rec->mr_apic_id = PCPU_GET(apic_id); + + /* + * Clear machine check. Don't do this for uncorrectable + * errors so that the BIOS can see them. + */ + if (!(rec->mr_status & (MC_STATUS_PCC | MC_STATUS_UC))) { + wrmsr(MSR_MC_STATUS(bank), 0); + do_cpuid(0, p); + } + return (1); +} + +static void __nonnull(1) +mca_record_entry(const struct mca_record *record) +{ + struct mca_internal *rec; + + rec = malloc(sizeof(*rec), M_MCA, M_NOWAIT); + if (rec == NULL) { + printf("MCA: Unable to allocate space for an event.\n"); + mca_log(record); + return; + } + + rec->rec = *record; + rec->logged = 0; + mtx_lock_spin(&mca_lock); + STAILQ_INSERT_TAIL(&mca_records, rec, link); + mca_count++; + mtx_unlock_spin(&mca_lock); } /* @@ -341,7 +357,7 @@ mca_log(struct mca_record *rec) static int mca_scan(int mcip) { - struct mca_record *rec; + struct mca_record rec; uint64_t mcg_cap, ucmask; int count, i, recoverable; @@ -354,13 +370,13 @@ mca_scan(int mcip) ucmask |= MC_STATUS_OVER; mcg_cap = rdmsr(MSR_MCG_CAP); for (i = 0; i < (mcg_cap & MCG_CAP_COUNT); i++) { - rec = mca_record_entry(i); - if (rec != NULL) { + if (mca_check_status(i, &rec)) { count++; - if (rec->mr_status & ucmask) { + if (rec.mr_status & ucmask) { recoverable = 0; - mca_log(rec); + mca_log(&rec); } + mca_record_entry(&rec); } } return (mcip ? recoverable : count); @@ -465,6 +481,8 @@ void mca_init(void) { uint64_t mcg_cap; + uint64_t ctl; + int skip; int i; /* MCE is required. */ @@ -482,15 +500,26 @@ mca_init(void) wrmsr(MSR_MCG_CTL, MCG_CTL_ENABLE); for (i = 0; i < (mcg_cap & MCG_CAP_COUNT); i++) { - /* - * Enable logging of all errors. For P6 - * processors, MC0_CTL is always enabled. - * - * XXX: Better CPU test needed here? - */ - if (!(i == 0 && (cpu_id & 0xf00) == 0x600)) - wrmsr(MSR_MC_CTL(i), 0xffffffffffffffffUL); + /* By default enable logging of all errors. */ + ctl = 0xffffffffffffffffUL; + skip = 0; + if (cpu_vendor_id == CPU_VENDOR_INTEL) { + /* + * For P6 models before Nehalem MC0_CTL is + * always enabled and reserved. + */ + if (i == 0 && CPUID_TO_FAMILY(cpu_id) == 0x6 + && CPUID_TO_MODEL(cpu_id) < 0x1a) + skip = 1; + } else if (cpu_vendor_id == CPU_VENDOR_AMD) { + /* BKDG for Family 10h: unset GartTblWkEn. */ + if (i == 4 && CPUID_TO_FAMILY(cpu_id) >= 0xf) + ctl &= ~(1UL << 10); + } + + if (!skip) + wrmsr(MSR_MC_CTL(i), ctl); /* Clear all errors. */ wrmsr(MSR_MC_STATUS(i), 0); } diff --git a/sys/amd64/amd64/mem.c b/sys/amd64/amd64/mem.c index 7cac98d87534..3a968bbc6abd 100644 --- a/sys/amd64/amd64/mem.c +++ b/sys/amd64/amd64/mem.c @@ -144,8 +144,8 @@ kmemphys: */ /* ARGSUSED */ int -memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, - int prot __unused) +memmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot __unused, vm_memattr_t *memattr __unused) { if (dev2unit(dev) == CDEV_MINOR_MEM) *paddr = offset; diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 0ef80173b28b..337c02805093 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -98,14 +98,8 @@ char *doublefault_stack; char *nmi_stack; void *dpcpu; -/* Hotwire a 0->4MB V==P mapping */ -extern pt_entry_t *KPTphys; - -/* SMP page table page */ -extern pt_entry_t *SMPpt; - struct pcb stoppcbs[MAXCPU]; -struct xpcb *stopxpcbs = NULL; +struct xpcb **stopxpcbs = NULL; /* Variables needed for SMP tlb shootdown. */ vm_offset_t smp_tlb_addr1; @@ -1256,8 +1250,8 @@ cpususpend_handler(void) rf = intr_disable(); cr3 = rcr3(); - stopfpu = &stopxpcbs[cpu].xpcb_pcb.pcb_save; - if (savectx2(&stopxpcbs[cpu])) { + stopfpu = &stopxpcbs[cpu]->xpcb_pcb.pcb_save; + if (savectx2(stopxpcbs[cpu])) { fpugetregs(curthread, stopfpu); wbinvd(); atomic_set_int(&stopped_cpus, cpumask); diff --git a/sys/amd64/amd64/msi.c b/sys/amd64/amd64/msi.c index 91a8cbbd004f..6745ce2f5990 100644 --- a/sys/amd64/amd64/msi.c +++ b/sys/amd64/amd64/msi.c @@ -288,7 +288,7 @@ msi_init(void) mtx_init(&msi_lock, "msi", NULL, MTX_DEF); } -void +static void msi_create_source(void) { struct msi_intsrc *msi; diff --git a/sys/amd64/amd64/nexus.c b/sys/amd64/amd64/nexus.c index 5eafd3baf973..4c701a0e9d34 100644 --- a/sys/amd64/amd64/nexus.c +++ b/sys/amd64/amd64/nexus.c @@ -69,7 +69,7 @@ __FBSDID("$FreeBSD$"); #ifdef DEV_ISA #include -#include +#include #endif #include @@ -92,6 +92,9 @@ static int nexus_bind_intr(device_t, device_t, struct resource *, int); #endif static int nexus_config_intr(device_t, int, enum intr_trigger, enum intr_polarity); +static int nexus_describe_intr(device_t dev, device_t child, + struct resource *irq, void *cookie, + const char *descr); static int nexus_activate_resource(device_t, device_t, int, int, struct resource *); static int nexus_deactivate_resource(device_t, device_t, int, int, @@ -135,6 +138,7 @@ static device_method_t nexus_methods[] = { DEVMETHOD(bus_bind_intr, nexus_bind_intr), #endif DEVMETHOD(bus_config_intr, nexus_config_intr), + DEVMETHOD(bus_describe_intr, nexus_describe_intr), DEVMETHOD(bus_get_resource_list, nexus_get_reslist), DEVMETHOD(bus_set_resource, nexus_set_resource), DEVMETHOD(bus_get_resource, nexus_get_resource), @@ -479,6 +483,14 @@ nexus_config_intr(device_t dev, int irq, enum intr_trigger trig, return (intr_config_intr(irq, trig, pol)); } +static int +nexus_describe_intr(device_t dev, device_t child, struct resource *irq, + void *cookie, const char *descr) +{ + + return (intr_describe(rman_get_start(irq), cookie, descr)); +} + static struct resource_list * nexus_get_reslist(device_t dev, device_t child) { diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 1f377651e43c..07db5d1692bc 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -105,7 +105,6 @@ __FBSDID("$FreeBSD$"); * and to when physical maps must be made correct. */ -#include "opt_msgbuf.h" #include "opt_pmap.h" #include "opt_vm.h" @@ -116,7 +115,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -153,7 +151,11 @@ __FBSDID("$FreeBSD$"); #endif #if !defined(DIAGNOSTIC) -#define PMAP_INLINE __gnu89_inline +#ifdef __GNUC_GNU_INLINE__ +#define PMAP_INLINE inline +#else +#define PMAP_INLINE extern inline +#endif #else #define PMAP_INLINE #endif @@ -183,7 +185,7 @@ static int pat_works = 0; /* Is page attribute table sane? */ SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); static int pg_ps_enabled = 1; -SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RD, &pg_ps_enabled, 0, +SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0, "Are large page mappings enabled?"); static u_int64_t KPTphys; /* phys addr of kernel level 1 */ @@ -206,7 +208,6 @@ static int shpgperproc = PMAP_SHPGPERPROC; */ pt_entry_t *CMAP1 = 0; caddr_t CADDR1 = 0; -struct msgbuf *msgbufp = 0; /* * Crashdump maps. @@ -442,7 +443,7 @@ create_pagetables(vm_paddr_t *firstaddr) if (ndmpdp < 4) /* Minimum 4GB of dirmap */ ndmpdp = 4; DMPDPphys = allocpages(firstaddr, NDMPML4E); - if ((amd_feature & AMDID_PAGE1GB) == 0) + if (TRUE || (amd_feature & AMDID_PAGE1GB) == 0) DMPDphys = allocpages(firstaddr, ndmpdp); dmaplimit = (vm_paddr_t)ndmpdp << PDPSHIFT; @@ -476,7 +477,7 @@ create_pagetables(vm_paddr_t *firstaddr) /* Now set up the direct map space using either 2MB or 1GB pages */ /* Preset PG_M and PG_A because demotion expects it */ - if ((amd_feature & AMDID_PAGE1GB) == 0) { + if (TRUE || (amd_feature & AMDID_PAGE1GB) == 0) { for (i = 0; i < NPDEPG * ndmpdp; i++) { ((pd_entry_t *)DMPDphys)[i] = (vm_paddr_t)i << PDRSHIFT; ((pd_entry_t *)DMPDphys)[i] |= PG_RW | PG_V | PG_PS | @@ -570,15 +571,8 @@ pmap_bootstrap(vm_paddr_t *firstaddr) */ SYSMAP(caddr_t, unused, crashdumpmap, MAXDUMPPGS) - /* - * msgbufp is used to map the system message buffer. - */ - SYSMAP(struct msgbuf *, unused, msgbufp, atop(round_page(MSGBUF_SIZE))) - virtual_avail = va; - *CMAP1 = 0; - invltlb(); /* Initialize the PAT MSR. */ @@ -664,7 +658,6 @@ pmap_page_init(vm_page_t m) void pmap_init(void) { - pd_entry_t *pd; vm_page_t mpte; vm_size_t s; int i, pv_npg; @@ -673,18 +666,13 @@ pmap_init(void) * Initialize the vm page array entries for the kernel pmap's * page table pages. */ - pd = pmap_pde(kernel_pmap, KERNBASE); for (i = 0; i < NKPT; i++) { - if ((pd[i] & (PG_PS | PG_V)) == (PG_PS | PG_V)) - continue; - KASSERT((pd[i] & PG_V) != 0, - ("pmap_init: page table page is missing")); - mpte = PHYS_TO_VM_PAGE(pd[i] & PG_FRAME); + mpte = PHYS_TO_VM_PAGE(KPTphys + (i << PAGE_SHIFT)); KASSERT(mpte >= vm_page_array && mpte < &vm_page_array[vm_page_array_size], ("pmap_init: page table page is out of range")); mpte->pindex = pmap_pde_pindex(KERNBASE) + i; - mpte->phys_addr = pd[i] & PG_FRAME; + mpte->phys_addr = KPTphys + (i << PAGE_SHIFT); } /* @@ -697,6 +685,15 @@ pmap_init(void) TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max); pv_entry_high_water = 9 * (pv_entry_max / 10); + /* + * Disable large page mappings by default if the kernel is running in + * a virtual machine on an AMD Family 10h processor. This is a work- + * around for Erratum 383. + */ + if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD && + CPUID_TO_FAMILY(cpu_id) == 0x10) + pg_ps_enabled = 0; + /* * Are large page mappings enabled? */ @@ -4810,6 +4807,11 @@ if (oldpmap) /* XXX FIXME */ critical_exit(); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/amd64/amd64/sys_machdep.c b/sys/amd64/amd64/sys_machdep.c index 1cba8a21c21f..bb81664a3ed3 100644 --- a/sys/amd64/amd64/sys_machdep.c +++ b/sys/amd64/amd64/sys_machdep.c @@ -420,13 +420,14 @@ user_ldt_alloc(struct proc *p, int force) return (pldt); } - mdp->md_ldt = new_ldt; if (pldt != NULL) { bcopy(pldt->ldt_base, new_ldt->ldt_base, max_ldt_segment * sizeof(struct user_segment_descriptor)); user_ldt_derefl(pldt); } ssdtosyssd(&sldt, &p->p_md.md_ldt_sd); + atomic_store_rel_ptr((volatile uintptr_t *)&mdp->md_ldt, + (uintptr_t)new_ldt); if (p == curproc) set_user_ldt(mdp); diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index c97985d44947..bd7ee6358969 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -750,9 +750,7 @@ trap_pfault(frame, usermode) PROC_UNLOCK(p); /* Fault in the user page: */ - rv = vm_fault(map, va, ftype, - (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY - : VM_FAULT_NORMAL); + rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); PROC_LOCK(p); --p->p_lock; @@ -887,6 +885,73 @@ dblfault_handler(struct trapframe *frame) panic("double fault"); } +struct syscall_args { + u_int code; + struct sysent *callp; + register_t args[8]; + register_t *argp; + int narg; +}; + +static int +fetch_syscall_args(struct thread *td, struct syscall_args *sa) +{ + struct proc *p; + struct trapframe *frame; + caddr_t params; + int reg, regcnt, error; + + p = td->td_proc; + frame = td->td_frame; + reg = 0; + regcnt = 6; + + params = (caddr_t)frame->tf_rsp + sizeof(register_t); + sa->code = frame->tf_rax; + + if (p->p_sysent->sv_prepsyscall) { + (*p->p_sysent->sv_prepsyscall)(frame, (int *)sa->args, + &sa->code, ¶ms); + } else { + if (sa->code == SYS_syscall || sa->code == SYS___syscall) { + sa->code = frame->tf_rdi; + reg++; + regcnt--; + } + } + if (p->p_sysent->sv_mask) + sa->code &= p->p_sysent->sv_mask; + + if (sa->code >= p->p_sysent->sv_size) + sa->callp = &p->p_sysent->sv_table[0]; + else + sa->callp = &p->p_sysent->sv_table[sa->code]; + + sa->narg = sa->callp->sy_narg; + KASSERT(sa->narg <= sizeof(sa->args) / sizeof(sa->args[0]), + ("Too many syscall arguments!")); + error = 0; + sa->argp = &frame->tf_rdi; + sa->argp += reg; + bcopy(sa->argp, sa->args, sizeof(sa->args[0]) * regcnt); + if (sa->narg > regcnt) { + KASSERT(params != NULL, ("copyin args with no params!")); + error = copyin(params, &sa->args[regcnt], + (sa->narg - regcnt) * sizeof(sa->args[0])); + } + sa->argp = &sa->args[0]; + + /* + * This may result in two records if debugger modified + * registers or memory during sleep at stop/ptrace point. + */ +#ifdef KTRACE + if (KTRPOINT(td, KTR_SYSCALL)) + ktrsyscall(sa->code, sa->narg, sa->argp); +#endif + return (error); +} + /* * syscall - system call request C handler * @@ -895,20 +960,17 @@ dblfault_handler(struct trapframe *frame) void syscall(struct trapframe *frame) { - caddr_t params; - struct sysent *callp; - struct thread *td = curthread; - struct proc *p = td->td_proc; + struct thread *td; + struct proc *p; + struct syscall_args sa; register_t orig_tf_rflags; int error; - int narg; - register_t args[8]; - register_t *argp; - u_int code; - int reg, regcnt; ksiginfo_t ksi; PCPU_INC(cnt.v_syscall); + td = curthread; + p = td->td_proc; + td->td_syscalls++; #ifdef DIAGNOSTIC if (ISPL(frame->tf_cs) != SEL_UPL) { @@ -917,65 +979,37 @@ syscall(struct trapframe *frame) } #endif - reg = 0; - regcnt = 6; td->td_pticks = 0; td->td_frame = frame; if (td->td_ucred != p->p_ucred) cred_update_thread(td); - params = (caddr_t)frame->tf_rsp + sizeof(register_t); - code = frame->tf_rax; orig_tf_rflags = frame->tf_rflags; - - if (p->p_sysent->sv_prepsyscall) { - (*p->p_sysent->sv_prepsyscall)(frame, (int *)args, &code, ¶ms); - } else { - if (code == SYS_syscall || code == SYS___syscall) { - code = frame->tf_rdi; - reg++; - regcnt--; - } + if (p->p_flag & P_TRACED) { + PROC_LOCK(p); + td->td_dbgflags &= ~TDB_USERWR; + PROC_UNLOCK(p); } - - if (p->p_sysent->sv_mask) - code &= p->p_sysent->sv_mask; - - if (code >= p->p_sysent->sv_size) - callp = &p->p_sysent->sv_table[0]; - else - callp = &p->p_sysent->sv_table[code]; - - narg = callp->sy_narg; - KASSERT(narg <= sizeof(args) / sizeof(args[0]), - ("Too many syscall arguments!")); - error = 0; - argp = &frame->tf_rdi; - argp += reg; - bcopy(argp, args, sizeof(args[0]) * regcnt); - if (narg > regcnt) { - KASSERT(params != NULL, ("copyin args with no params!")); - error = copyin(params, &args[regcnt], - (narg - regcnt) * sizeof(args[0])); - } - argp = &args[0]; - -#ifdef KTRACE - if (KTRPOINT(td, KTR_SYSCALL)) - ktrsyscall(code, narg, argp); -#endif + error = fetch_syscall_args(td, &sa); CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td, - td->td_proc->p_pid, td->td_name, code); - - td->td_syscalls++; + td->td_proc->p_pid, td->td_name, sa.code); if (error == 0) { td->td_retval[0] = 0; td->td_retval[1] = frame->tf_rdx; - STOPEVENT(p, S_SCE, narg); - + STOPEVENT(p, S_SCE, sa.narg); PTRACESTOP_SC(p, td, S_PT_SCE); + if (td->td_dbgflags & TDB_USERWR) { + /* + * Reread syscall number and arguments if + * debugger modified registers or memory. + */ + error = fetch_syscall_args(td, &sa); + if (error != 0) + goto retval; + td->td_retval[1] = frame->tf_rdx; + } #ifdef KDTRACE_HOOKS /* @@ -983,13 +1017,13 @@ syscall(struct trapframe *frame) * callback and if there is a probe active for the * syscall 'entry', process the probe. */ - if (systrace_probe_func != NULL && callp->sy_entry != 0) - (*systrace_probe_func)(callp->sy_entry, code, callp, - args); + if (systrace_probe_func != NULL && sa.callp->sy_entry != 0) + (*systrace_probe_func)(sa.callp->sy_entry, sa.code, + sa.callp, sa.args); #endif - AUDIT_SYSCALL_ENTER(code, td); - error = (*callp->sy_call)(td, argp); + AUDIT_SYSCALL_ENTER(sa.code, td); + error = (*sa.callp->sy_call)(td, sa.argp); AUDIT_SYSCALL_EXIT(error, td); /* Save the latest error return value. */ @@ -1001,45 +1035,13 @@ syscall(struct trapframe *frame) * callback and if there is a probe active for the * syscall 'return', process the probe. */ - if (systrace_probe_func != NULL && callp->sy_return != 0) - (*systrace_probe_func)(callp->sy_return, code, callp, - args); + if (systrace_probe_func != NULL && sa.callp->sy_return != 0) + (*systrace_probe_func)(sa.callp->sy_return, sa.code, + sa.callp, sa.args); #endif } - - switch (error) { - case 0: - frame->tf_rax = td->td_retval[0]; - frame->tf_rdx = td->td_retval[1]; - frame->tf_rflags &= ~PSL_C; - break; - - case ERESTART: - /* - * Reconstruct pc, we know that 'syscall' is 2 bytes. - * We have to do a full context restore so that %r10 - * (which was holding the value of %rcx) is restored for - * the next iteration. - */ - frame->tf_rip -= frame->tf_err; - frame->tf_r10 = frame->tf_rcx; - td->td_pcb->pcb_flags |= PCB_FULLCTX; - break; - - case EJUSTRETURN: - break; - - default: - if (p->p_sysent->sv_errsize) { - if (error >= p->p_sysent->sv_errsize) - error = -1; /* XXX */ - else - error = p->p_sysent->sv_errtbl[error]; - } - frame->tf_rax = error; - frame->tf_rflags |= PSL_C; - break; - } + retval: + cpu_set_syscall_retval(td, error); /* * Traced syscall. @@ -1057,14 +1059,16 @@ syscall(struct trapframe *frame) * Check for misbehavior. */ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???"); KASSERT(td->td_critnest == 0, ("System call %s returning in a critical section", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???")); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???")); KASSERT(td->td_locks == 0, ("System call %s returning with %d locks held", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???", - td->td_locks)); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???", td->td_locks)); /* * Handle reschedule and other end-of-syscall issues @@ -1072,11 +1076,11 @@ syscall(struct trapframe *frame) userret(td, frame); CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td, - td->td_proc->p_pid, td->td_name, code); + td->td_proc->p_pid, td->td_name, sa.code); #ifdef KTRACE if (KTRPOINT(td, KTR_SYSRET)) - ktrsysret(code, error, td->td_retval[0]); + ktrsysret(sa.code, error, td->td_retval[0]); #endif /* @@ -1084,7 +1088,7 @@ syscall(struct trapframe *frame) * register set. If we ever support an emulation where this * is not the case, this code will need to be revisited. */ - STOPEVENT(p, S_SCX, code); + STOPEVENT(p, S_SCX, sa.code); PTRACESTOP_SC(p, td, S_PT_SCX); } diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c index 51d1d6218b10..2c670a4e86a9 100644 --- a/sys/amd64/amd64/vm_machdep.c +++ b/sys/amd64/amd64/vm_machdep.c @@ -80,7 +80,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include static void cpu_reset_real(void); #ifdef SMP @@ -317,6 +317,49 @@ cpu_thread_free(struct thread *td) cpu_thread_clean(td); } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + + switch (error) { + case 0: + td->td_frame->tf_rax = td->td_retval[0]; + td->td_frame->tf_rdx = td->td_retval[1]; + td->td_frame->tf_rflags &= ~PSL_C; + break; + + case ERESTART: + /* + * Reconstruct pc, we know that 'syscall' is 2 bytes, + * lcall $X,y is 7 bytes, int 0x80 is 2 bytes. + * We saved this in tf_err. + * We have to do a full context restore so that %r10 + * (which was holding the value of %rcx) is restored + * for the next iteration. + * r10 restore is only required for freebsd/amd64 processes, + * but shall be innocent for any ia32 ABI. + */ + td->td_frame->tf_rip -= td->td_frame->tf_err; + td->td_frame->tf_r10 = td->td_frame->tf_rcx; + td->td_pcb->pcb_flags |= PCB_FULLCTX; + break; + + case EJUSTRETURN: + break; + + default: + if (td->td_proc->p_sysent->sv_errsize) { + if (error >= td->td_proc->p_sysent->sv_errsize) + error = -1; /* XXX */ + else + error = td->td_proc->p_sysent->sv_errtbl[error]; + } + td->td_frame->tf_rax = error; + td->td_frame->tf_rflags |= PSL_C; + break; + } +} + /* * Initialize machine state (pcb and trap frame) for a new thread about to * upcall. Put enough state in the new thread's PCB to get it to go back diff --git a/sys/amd64/conf/DEFAULTS b/sys/amd64/conf/DEFAULTS index 78952eef63b5..1fb52b34e0c2 100644 --- a/sys/amd64/conf/DEFAULTS +++ b/sys/amd64/conf/DEFAULTS @@ -20,4 +20,3 @@ options GEOM_PART_BSD options GEOM_PART_EBR options GEOM_PART_EBR_COMPAT options GEOM_PART_MBR - diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC index a49f7bca10cb..a9eb19c63c8a 100644 --- a/sys/amd64/conf/GENERIC +++ b/sys/amd64/conf/GENERIC @@ -21,15 +21,6 @@ cpu HAMMER ident GENERIC -# To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" # Default places to look for devices. - -# Use the following to compile in values accessible to the kernel -# through getenv() (or kenv(1) in userland). The format of the file -# is 'variable=value', see kenv(1) -# -# env "GENERIC.env" - makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols options SCHED_ULE # ULE scheduler @@ -75,11 +66,13 @@ options MAC # TrustedBSD MAC Framework options FLOWTABLE # per-cpu routing cache #options KDTRACE_FRAME # Ensure frames are compiled in #options KDTRACE_HOOKS # Kernel DTrace hooks +options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging for use in -current options KDB # Enable kernel debugger support. options DDB # Support DDB. options GDB # Support remote GDB. +options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS options WITNESS # Enable checks to detect deadlocks and cycles @@ -257,7 +250,7 @@ device xe # Xircom pccard Ethernet device wlan # 802.11 support options IEEE80211_DEBUG # enable debug msgs options IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's -options IEEE80211_SUPPORT_MESH # enable 802.11s D3.0 support +options IEEE80211_SUPPORT_MESH # enable 802.11s draft support device wlan_wep # 802.11 WEP support device wlan_ccmp # 802.11 CCMP support device wlan_tkip # 802.11 TKIP support @@ -274,6 +267,7 @@ device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs. device loop # Network loopback device random # Entropy device device ether # Ethernet support +device vlan # 802.1Q VLAN support device tun # Packet tunnel. device pty # BSD-style compatibility pseudo ttys device md # Memory "disks" @@ -297,10 +291,6 @@ device ukbd # Keyboard device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da device ums # Mouse -device rum # Ralink Technology RT2501USB wireless NICs -device uath # Atheros AR5523 wireless NICs -device ural # Ralink Technology RT2500USB wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs device urio # Diamond Rio 500 MP3 player # USB Serial devices device uark # Technologies ARK3116 based serial adapters @@ -319,6 +309,11 @@ device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet device udav # Davicom DM9601E USB +# USB Wireless +device rum # Ralink Technology RT2501USB wireless NICs +device uath # Atheros AR5523 wireless NICs +device ural # Ralink Technology RT2500USB wireless NICs +device zyd # ZyDAS zb1211/zb1211b wireless NICs # FireWire support device firewire # FireWire bus code diff --git a/sys/amd64/conf/Makefile b/sys/amd64/conf/Makefile index 2c006e9c2c80..1d2513f2abfb 100644 --- a/sys/amd64/conf/Makefile +++ b/sys/amd64/conf/Makefile @@ -1,3 +1,5 @@ # $FreeBSD$ +TARGET=amd64 + .include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES index d213643e58f8..8b56e54288db 100644 --- a/sys/amd64/conf/NOTES +++ b/sys/amd64/conf/NOTES @@ -263,6 +263,7 @@ device radeondrm # ATI Radeon device savagedrm # S3 Savage3D, Savage4 device sisdrm # SiS 300/305, 540, 630 device tdfxdrm # 3dfx Voodoo 3/4/5 and Banshee +device viadrm # VIA options DRM_DEBUG # Include debug printfs (slow) # @@ -273,31 +274,68 @@ options DRM_DEBUG # Include debug printfs (slow) # HP PC Lan+, various PC Card devices # (requires miibus) # ipw: Intel PRO/Wireless 2100 IEEE 802.11 adapter +# Requires the ipw firmware module # iwi: Intel PRO/Wireless 2200BG/2225BG/2915ABG IEEE 802.11 adapters -# iwn: Intel Wireless WiFi Link 4965AGN 802.11 network adapters +# Requires the iwi firmware module +# iwn: Intel Wireless WiFi Link 4965/1000/5000/6000 802.11 network adapters +# Requires the iwn firmware module +# mwl: Marvell 88W8363 IEEE 802.11 adapter +# Requires the mwl firmware module # nfe: nVidia nForce MCP on-board Ethernet Networking (BSD open source) # nve: nVidia nForce MCP on-board Ethernet Networking -# ral: Ralink Technology IEEE 802.11 wireless adapter # wpi: Intel 3945ABG Wireless LAN controller +# Requires the wpi firmware module device ed options ED_3C503 options ED_HPP options ED_SIC +device ipw device iwi device iwn -device ipw +device mwl device nfe device nve -device ral device wpi -device ath # Atheros pci/cardbus NIC's -device ath_hal # pci/cardbus chip support -options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors -device ath_rate_sample # SampleRate tx rate control for ath -#device ath_rate_amrr # AMRR rate control for ath driver -#device ath_rate_onoe # Onoe rate control for ath driver +# IEEE 802.11 adapter firmware modules + +# Intel PRO/Wireless 2100 firmware: +# ipwfw: BSS/IBSS/monitor mode firmware +# ipwbssfw: BSS mode firmware +# ipwibssfw: IBSS mode firmware +# ipwmonitorfw: Monitor mode firmware +# Intel PRO/Wireless 2200BG/2225BG/2915ABG firmware: +# iwifw: BSS/IBSS/monitor mode firmware +# iwibssfw: BSS mode firmware +# iwiibssfw: IBSS mode firmware +# iwimonitorfw: Monitor mode firmware +# Intel Wireless WiFi Link 4965/1000/5000/6000 series firmware: +# iwnfw: Single module to support the 4965/1000/5000/5150/6000 +# iwn4965fw: Specific module for the 4965 only +# iwn1000fw: Specific module for the 1000 only +# iwn5000fw: Specific module for the 5000 only +# iwn5150fw: Specific module for the 5150 only +# iwn6000fw: Specific module for the 6000 only +# mwlfw: Marvell 88W8363 firmware +# wpifw: Intel 3945ABG Wireless LAN Controller firmware + +device iwifw +device iwibssfw +device iwiibssfw +device iwimonitorfw +device ipwfw +device ipwbssfw +device ipwibssfw +device ipwmonitorfw +device iwnfw +device iwn4965fw +device iwn1000fw +device iwn5000fw +device iwn5150fw +device iwn6000fw +device mwlfw +device wpifw # #XXX this stores pointers in a 32bit field that is defined by the hardware @@ -399,8 +437,10 @@ device asmc # Hardware watchdog timers: # # ichwd: Intel ICH watchdog timer +# amdsbwd: AMD SB7xx watchdog timer # device ichwd +device amdsbwd # # Temperature sensors: diff --git a/sys/amd64/conf/XENHVM b/sys/amd64/conf/XENHVM index 1536e3c74b6e..7bfb8e2dde50 100644 --- a/sys/amd64/conf/XENHVM +++ b/sys/amd64/conf/XENHVM @@ -19,16 +19,7 @@ # $FreeBSD$ cpu HAMMER -ident GENERIC - -# To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" # Default places to look for devices. - -# Use the following to compile in values accessible to the kernel -# through getenv() (or kenv(1) in userland). The format of the file -# is 'variable=value', see kenv(1) -# -# env "GENERIC.env" +ident XENHVM makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols makeoptions MODULES_OVERRIDE="" @@ -79,6 +70,7 @@ options NO_ADAPTIVE_RWLOCKS options KDB # Enable kernel debugger support. options DDB # Support DDB. options GDB # Support remote GDB. +options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS options WITNESS # Enable checks to detect deadlocks and cycles diff --git a/sys/amd64/ia32/ia32_reg.c b/sys/amd64/ia32/ia32_reg.c index 83f6783e55c8..da5190f0db98 100644 --- a/sys/amd64/ia32/ia32_reg.c +++ b/sys/amd64/ia32/ia32_reg.c @@ -213,8 +213,6 @@ fill_dbregs32(struct thread *td, struct dbreg32 *regs) err = fill_dbregs(td, &dr); for (i = 0; i < 8; i++) regs->dr[i] = dr.dr[i]; - for (i = 8; i < 16; i++) - regs->dr[i] = 0; return (err); } diff --git a/sys/amd64/ia32/ia32_signal.c b/sys/amd64/ia32/ia32_signal.c index d7c1dd5c6f90..10ec641bc61d 100644 --- a/sys/amd64/ia32/ia32_signal.c +++ b/sys/amd64/ia32/ia32_signal.c @@ -244,10 +244,8 @@ freebsd32_setcontext(struct thread *td, struct freebsd32_setcontext_args *uap) if (ret == 0) { ret = ia32_set_mcontext(td, &uc.uc_mcontext); if (ret == 0) { - SIG_CANTMASK(uc.uc_sigmask); - PROC_LOCK(td->td_proc); - td->td_sigmask = uc.uc_sigmask; - PROC_UNLOCK(td->td_proc); + kern_sigprocmask(td, SIG_SETMASK, + &uc.uc_sigmask, NULL, 0); } } } @@ -273,10 +271,8 @@ freebsd32_swapcontext(struct thread *td, struct freebsd32_swapcontext_args *uap) if (ret == 0) { ret = ia32_set_mcontext(td, &uc.uc_mcontext); if (ret == 0) { - SIG_CANTMASK(uc.uc_sigmask); - PROC_LOCK(td->td_proc); - td->td_sigmask = uc.uc_sigmask; - PROC_UNLOCK(td->td_proc); + kern_sigprocmask(td, SIG_SETMASK, + &uc.uc_sigmask, NULL, 0); } } } @@ -544,9 +540,8 @@ freebsd4_freebsd32_sigreturn(td, uap) } */ *uap; { struct ia32_ucontext4 uc; - struct proc *p = td->td_proc; struct trapframe *regs; - const struct ia32_ucontext4 *ucp; + struct ia32_ucontext4 *ucp; int cs, eflags, error; ksiginfo_t ksi; @@ -610,11 +605,7 @@ freebsd4_freebsd32_sigreturn(td, uap) regs->tf_fs = ucp->uc_mcontext.mc_fs; regs->tf_gs = ucp->uc_mcontext.mc_gs; - PROC_LOCK(p); - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); td->td_pcb->pcb_full_iret = 1; return (EJUSTRETURN); } @@ -631,9 +622,8 @@ freebsd32_sigreturn(td, uap) } */ *uap; { struct ia32_ucontext uc; - struct proc *p = td->td_proc; struct trapframe *regs; - const struct ia32_ucontext *ucp; + struct ia32_ucontext *ucp; int cs, eflags, error, ret; ksiginfo_t ksi; @@ -702,11 +692,7 @@ freebsd32_sigreturn(td, uap) regs->tf_gs = ucp->uc_mcontext.mc_gs; regs->tf_flags = TF_HASSEGS; - PROC_LOCK(p); - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); td->td_pcb->pcb_full_iret = 1; return (EJUSTRETURN); } diff --git a/sys/amd64/ia32/ia32_syscall.c b/sys/amd64/ia32/ia32_syscall.c index 480724864062..aa1ae6cbd719 100644 --- a/sys/amd64/ia32/ia32_syscall.c +++ b/sys/amd64/ia32/ia32_syscall.c @@ -88,130 +88,137 @@ extern const char *freebsd32_syscallnames[]; void ia32_syscall(struct trapframe *frame); /* Called from asm code */ -void -ia32_syscall(struct trapframe *frame) -{ - caddr_t params; - int i; - struct sysent *callp; - struct thread *td = curthread; - struct proc *p = td->td_proc; - register_t orig_tf_rflags; - int error; - int narg; - u_int32_t args[8]; - u_int64_t args64[8]; +struct ia32_syscall_args { u_int code; - ksiginfo_t ksi; + caddr_t params; + struct sysent *callp; + u_int64_t args64[8]; + int narg; +}; - PCPU_INC(cnt.v_syscall); - td->td_pticks = 0; - td->td_frame = frame; - if (td->td_ucred != p->p_ucred) - cred_update_thread(td); - params = (caddr_t)frame->tf_rsp + sizeof(u_int32_t); - code = frame->tf_rax; - orig_tf_rflags = frame->tf_rflags; +static int +fetch_ia32_syscall_args(struct thread *td, struct ia32_syscall_args *sa) +{ + struct proc *p; + struct trapframe *frame; + u_int32_t args[8]; + int error, i; + + p = td->td_proc; + frame = td->td_frame; + + sa->params = (caddr_t)frame->tf_rsp + sizeof(u_int32_t); + sa->code = frame->tf_rax; if (p->p_sysent->sv_prepsyscall) { /* * The prep code is MP aware. */ - (*p->p_sysent->sv_prepsyscall)(frame, args, &code, ¶ms); + (*p->p_sysent->sv_prepsyscall)(frame, args, &sa->code, + &sa->params); } else { /* * Need to check if this is a 32 bit or 64 bit syscall. * fuword is MP aware. */ - if (code == SYS_syscall) { + if (sa->code == SYS_syscall) { /* * Code is first argument, followed by actual args. */ - code = fuword32(params); - params += sizeof(int); - } else if (code == SYS___syscall) { + sa->code = fuword32(sa->params); + sa->params += sizeof(int); + } else if (sa->code == SYS___syscall) { /* * Like syscall, but code is a quad, so as to maintain * quad alignment for the rest of the arguments. * We use a 32-bit fetch in case params is not * aligned. */ - code = fuword32(params); - params += sizeof(quad_t); + sa->code = fuword32(sa->params); + sa->params += sizeof(quad_t); } } - if (p->p_sysent->sv_mask) - code &= p->p_sysent->sv_mask; - - if (code >= p->p_sysent->sv_size) - callp = &p->p_sysent->sv_table[0]; + sa->code &= p->p_sysent->sv_mask; + if (sa->code >= p->p_sysent->sv_size) + sa->callp = &p->p_sysent->sv_table[0]; else - callp = &p->p_sysent->sv_table[code]; + sa->callp = &p->p_sysent->sv_table[sa->code]; + sa->narg = sa->callp->sy_narg; - narg = callp->sy_narg; - - /* - * copyin and the ktrsyscall()/ktrsysret() code is MP-aware - */ - if (params != NULL && narg != 0) - error = copyin(params, (caddr_t)args, - (u_int)(narg * sizeof(int))); + if (sa->params != NULL && sa->narg != 0) + error = copyin(sa->params, (caddr_t)args, + (u_int)(sa->narg * sizeof(int))); else error = 0; - for (i = 0; i < narg; i++) - args64[i] = args[i]; + for (i = 0; i < sa->narg; i++) + sa->args64[i] = args[i]; #ifdef KTRACE if (KTRPOINT(td, KTR_SYSCALL)) - ktrsyscall(code, narg, args64); + ktrsyscall(sa->code, sa->narg, sa->args64); #endif + + return (error); +} + +void +ia32_syscall(struct trapframe *frame) +{ + struct thread *td; + struct proc *p; + struct ia32_syscall_args sa; + register_t orig_tf_rflags; + int error; + ksiginfo_t ksi; + + PCPU_INC(cnt.v_syscall); + td = curthread; + p = td->td_proc; + td->td_syscalls++; + + td->td_pticks = 0; + td->td_frame = frame; + if (td->td_ucred != p->p_ucred) + cred_update_thread(td); + orig_tf_rflags = frame->tf_rflags; + if (p->p_flag & P_TRACED) { + PROC_LOCK(p); + td->td_dbgflags &= ~TDB_USERWR; + PROC_UNLOCK(p); + } + error = fetch_ia32_syscall_args(td, &sa); + CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td, - td->td_proc->p_pid, td->td_proc->p_comm, code); + td->td_proc->p_pid, td->td_name, sa.code); if (error == 0) { td->td_retval[0] = 0; td->td_retval[1] = frame->tf_rdx; - STOPEVENT(p, S_SCE, narg); - + STOPEVENT(p, S_SCE, sa.narg); PTRACESTOP_SC(p, td, S_PT_SCE); - - AUDIT_SYSCALL_ENTER(code, td); - error = (*callp->sy_call)(td, args64); - AUDIT_SYSCALL_EXIT(error, td); - } - - switch (error) { - case 0: - frame->tf_rax = td->td_retval[0]; - frame->tf_rdx = td->td_retval[1]; - frame->tf_rflags &= ~PSL_C; - break; - - case ERESTART: - /* - * Reconstruct pc, assuming lcall $X,y is 7 bytes, - * int 0x80 is 2 bytes. We saved this in tf_err. - */ - frame->tf_rip -= frame->tf_err; - break; - - case EJUSTRETURN: - break; - - default: - if (p->p_sysent->sv_errsize) { - if (error >= p->p_sysent->sv_errsize) - error = -1; /* XXX */ - else - error = p->p_sysent->sv_errtbl[error]; + if (td->td_dbgflags & TDB_USERWR) { + /* + * Reread syscall number and arguments if + * debugger modified registers or memory. + */ + error = fetch_ia32_syscall_args(td, &sa); + if (error != 0) + goto retval; + td->td_retval[1] = frame->tf_rdx; } - frame->tf_rax = error; - frame->tf_rflags |= PSL_C; - break; + + AUDIT_SYSCALL_ENTER(sa.code, td); + error = (*sa.callp->sy_call)(td, sa.args64); + AUDIT_SYSCALL_EXIT(error, td); + + /* Save the latest error return value. */ + td->td_errno = error; } + retval: + cpu_set_syscall_retval(td, error); /* * Traced syscall. @@ -229,14 +236,16 @@ ia32_syscall(struct trapframe *frame) * Check for misbehavior. */ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", - (code >= 0 && code < SYS_MAXSYSCALL) ? freebsd32_syscallnames[code] : "???"); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + freebsd32_syscallnames[sa.code] : "???"); KASSERT(td->td_critnest == 0, ("System call %s returning in a critical section", - (code >= 0 && code < SYS_MAXSYSCALL) ? freebsd32_syscallnames[code] : "???")); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + freebsd32_syscallnames[sa.code] : "???")); KASSERT(td->td_locks == 0, ("System call %s returning with %d locks held", - (code >= 0 && code < SYS_MAXSYSCALL) ? freebsd32_syscallnames[code] : "???", - td->td_locks)); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + freebsd32_syscallnames[sa.code] : "???", td->td_locks)); /* * Handle reschedule and other end-of-syscall issues @@ -244,10 +253,10 @@ ia32_syscall(struct trapframe *frame) userret(td, frame); CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td, - td->td_proc->p_pid, td->td_proc->p_comm, code); + td->td_proc->p_pid, td->td_proc->p_comm, sa.code); #ifdef KTRACE if (KTRPOINT(td, KTR_SYSRET)) - ktrsysret(code, error, td->td_retval[0]); + ktrsysret(sa.code, error, td->td_retval[0]); #endif /* @@ -255,7 +264,7 @@ ia32_syscall(struct trapframe *frame) * register set. If we ever support an emulation where this * is not the case, this code will need to be revisited. */ - STOPEVENT(p, S_SCX, code); + STOPEVENT(p, S_SCX, sa.code); PTRACESTOP_SC(p, td, S_PT_SCX); } diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h index 9d6d538de1d8..8f15d84a1ac3 100644 --- a/sys/amd64/include/apicvar.h +++ b/sys/amd64/include/apicvar.h @@ -157,6 +157,12 @@ #define APIC_BUS_PCI 2 #define APIC_BUS_MAX APIC_BUS_PCI +enum lapic_clock { + LAPIC_CLOCK_NONE, + LAPIC_CLOCK_HARDCLOCK, + LAPIC_CLOCK_ALL +}; + /* * An APIC enumerator is a psuedo bus driver that enumerates APIC's including * CPU's and I/O APIC's. @@ -224,7 +230,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt, enum intr_trigger trigger); void lapic_set_tpr(u_int vector); void lapic_setup(int boot); -int lapic_setup_clock(void); +enum lapic_clock lapic_setup_clock(void); #endif /* !LOCORE */ #endif /* _MACHINE_APICVAR_H_ */ diff --git a/sys/amd64/include/apm_bios.h b/sys/amd64/include/apm_bios.h new file mode 100644 index 000000000000..424852d59683 --- /dev/null +++ b/sys/amd64/include/apm_bios.h @@ -0,0 +1,264 @@ +/*- + * APM (Advanced Power Management) BIOS Device Driver + * + * Copyright (c) 1994-1995 by HOSOKAWA, Tatsumi + * + * This software may be used, modified, copied, and distributed, in + * both source and binary form provided that the above copyright and + * these terms are retained. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with its + * use. + * + * Aug, 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_APM_BIOS_H_ +#define _MACHINE_APM_BIOS_H_ + +#ifndef _KERNEL +#include +#endif +#include + +/* BIOS id */ +#define APM_BIOS 0x53 +#define APM_INT 0x15 + +/* APM flags */ +#define APM_16BIT_SUPPORT 0x01 +#define APM_32BIT_SUPPORT 0x02 +#define APM_CPUIDLE_SLOW 0x04 +#define APM_DISABLED 0x08 +#define APM_DISENGAGED 0x10 + +/* APM initializer physical address */ +#define APM_OURADDR 0x00080000 + +/* APM functions */ +#define APM_INSTCHECK 0x00 +#define APM_REALCONNECT 0x01 +#define APM_PROT16CONNECT 0x02 +#define APM_PROT32CONNECT 0x03 +#define APM_DISCONNECT 0x04 +#define APM_CPUIDLE 0x05 +#define APM_CPUBUSY 0x06 +#define APM_SETPWSTATE 0x07 +#define APM_ENABLEDISABLEPM 0x08 +#define APM_RESTOREDEFAULT 0x09 +#define APM_GETPWSTATUS 0x0a +#define APM_GETPMEVENT 0x0b +#define APM_GETPWSTATE 0x0c +#define APM_ENABLEDISABLEDPM 0x0d +#define APM_DRVVERSION 0x0e +#define APM_ENGAGEDISENGAGEPM 0x0f +#define APM_GETCAPABILITIES 0x10 +#define APM_RESUMETIMER 0x11 +#define APM_RESUMEONRING 0x12 +#define APM_TIMERREQUESTS 0x13 +#define APM_OEMFUNC 0x80 + +/* error code */ +#define APME_OK 0x00 +#define APME_PMDISABLED 0x01 +#define APME_REALESTABLISHED 0x02 +#define APME_NOTCONNECTED 0x03 +#define APME_PROT16ESTABLISHED 0x05 +#define APME_PROT16NOTSUPPORTED 0x06 +#define APME_PROT32ESTABLISHED 0x07 +#define APME_PROT32NOTDUPPORTED 0x08 +#define APME_UNKNOWNDEVICEID 0x09 +#define APME_OUTOFRANGE 0x0a +#define APME_NOTENGAGED 0x0b +#define APME_CANTENTERSTATE 0x60 +#define APME_NOPMEVENT 0x80 +#define APME_NOAPMPRESENT 0x86 + + +/* device code */ +#define PMDV_APMBIOS 0x0000 +#define PMDV_ALLDEV 0x0001 +#define PMDV_DISP0 0x0100 +#define PMDV_DISP1 0x0101 +#define PMDV_DISPALL 0x01ff +#define PMDV_2NDSTORAGE0 0x0200 +#define PMDV_2NDSTORAGE1 0x0201 +#define PMDV_2NDSTORAGE2 0x0202 +#define PMDV_2NDSTORAGE3 0x0203 +#define PMDV_PARALLEL0 0x0300 +#define PMDV_PARALLEL1 0x0301 +#define PMDV_SERIAL0 0x0400 +#define PMDV_SERIAL1 0x0401 +#define PMDV_SERIAL2 0x0402 +#define PMDV_SERIAL3 0x0403 +#define PMDV_SERIAL4 0x0404 +#define PMDV_SERIAL5 0x0405 +#define PMDV_SERIAL6 0x0406 +#define PMDV_SERIAL7 0x0407 +#define PMDV_NET0 0x0500 +#define PMDV_NET1 0x0501 +#define PMDV_NET2 0x0502 +#define PMDV_NET3 0x0503 +#define PMDV_PCMCIA0 0x0600 +#define PMDV_PCMCIA1 0x0601 +#define PMDV_PCMCIA2 0x0602 +#define PMDV_PCMCIA3 0x0603 +/* 0x0700 - 0x7fff Reserved */ +#define PMDV_BATT_BASE 0x8000 +#define PMDV_BATT0 0x8001 +#define PMDV_BATT1 0x8002 +#define PMDV_BATT_ALL 0x80ff +/* 0x8100 - 0xdfff Reserved */ +/* 0xe000 - 0xefff OEM-defined power device IDs */ +/* 0xf000 - 0xffff Reserved */ + +/* Power state */ +#define PMST_APMENABLED 0x0000 +#define PMST_STANDBY 0x0001 +#define PMST_SUSPEND 0x0002 +#define PMST_OFF 0x0003 +#define PMST_LASTREQNOTIFY 0x0004 +#define PMST_LASTREQREJECT 0x0005 +/* 0x0006 - 0x001f Reserved system states */ +/* 0x0020 - 0x003f OEM-defined system states */ +/* 0x0040 - 0x007f OEM-defined device states */ +/* 0x0080 - 0xffff Reserved device states */ + +#if !defined(ASSEMBLER) && !defined(INITIALIZER) + +/* C definitions */ +struct apmhook { + struct apmhook *ah_next; + int (*ah_fun)(void *ah_arg); + void *ah_arg; + const char *ah_name; + int ah_order; +}; +#define APM_HOOK_NONE (-1) +#define APM_HOOK_SUSPEND 0 +#define APM_HOOK_RESUME 1 +#define NAPM_HOOK 2 + +#ifdef _KERNEL + +void apm_suspend(int state); +struct apmhook *apm_hook_establish (int apmh, struct apmhook *); +void apm_hook_disestablish (int apmh, struct apmhook *); +void apm_cpu_idle(void); +void apm_cpu_busy(void); + +#endif + +#endif /* !ASSEMBLER && !INITIALIZER */ + +#define APM_MIN_ORDER 0x00 +#define APM_MID_ORDER 0x80 +#define APM_MAX_ORDER 0xff + +/* power management event code */ +#define PMEV_NOEVENT 0x0000 +#define PMEV_STANDBYREQ 0x0001 +#define PMEV_SUSPENDREQ 0x0002 +#define PMEV_NORMRESUME 0x0003 +#define PMEV_CRITRESUME 0x0004 +#define PMEV_BATTERYLOW 0x0005 +#define PMEV_POWERSTATECHANGE 0x0006 +#define PMEV_UPDATETIME 0x0007 +#define PMEV_CRITSUSPEND 0x0008 +#define PMEV_USERSTANDBYREQ 0x0009 +#define PMEV_USERSUSPENDREQ 0x000a +#define PMEV_STANDBYRESUME 0x000b +#define PMEV_CAPABILITIESCHANGE 0x000c +/* 0x000d - 0x00ff Reserved system events */ +/* 0x0100 - 0x01ff Reserved device events */ +/* 0x0200 - 0x02ff OEM-defined APM events */ +/* 0x0300 - 0xffff Reserved */ +#define PMEV_DEFAULT 0xffffffff /* used for customization */ + +#if !defined(ASSEMBLER) && !defined(INITIALIZER) + +/* + * Old apm_info structure, returned by the APMIO_GETINFO_OLD ioctl. This + * is for backward compatibility with old executables. + */ +typedef struct apm_info_old { + u_int ai_major; /* APM major version */ + u_int ai_minor; /* APM minor version */ + u_int ai_acline; /* AC line status */ + u_int ai_batt_stat; /* Battery status */ + u_int ai_batt_life; /* Remaining battery life */ + u_int ai_status; /* Status of APM support (enabled/disabled) */ +} *apm_info_old_t; + +/* + * Structure returned by the APMIO_GETINFO ioctl. + * + * In the comments below, the parenthesized numbers indicate the minimum + * value of ai_infoversion for which each field is valid. + */ +typedef struct apm_info { + u_int ai_infoversion; /* Indicates which fields are valid */ + u_int ai_major; /* APM major version (0) */ + u_int ai_minor; /* APM minor version (0) */ + u_int ai_acline; /* AC line status (0) */ + u_int ai_batt_stat; /* Battery status (0) */ + u_int ai_batt_life; /* Remaining battery life in percent (0) */ + int ai_batt_time; /* Remaining battery time in seconds (0) */ + u_int ai_status; /* True if enabled (0) */ + u_int ai_batteries; /* Number of batteries (1) */ + u_int ai_capabilities;/* APM Capabilities (1) */ + u_int ai_spare[6]; /* For future expansion */ +} *apm_info_t; + +/* Battery flag */ +#define APM_BATT_HIGH 0x01 +#define APM_BATT_LOW 0x02 +#define APM_BATT_CRITICAL 0x04 +#define APM_BATT_CHARGING 0x08 +#define APM_BATT_NOT_PRESENT 0x10 +#define APM_BATT_NO_SYSTEM 0x80 + +typedef struct apm_pwstatus { + u_int ap_device; /* Device code of battery */ + u_int ap_acline; /* AC line status (0) */ + u_int ap_batt_stat; /* Battery status (0) */ + u_int ap_batt_flag; /* Battery flag (0) */ + u_int ap_batt_life; /* Remaining battery life in percent (0) */ + int ap_batt_time; /* Remaining battery time in seconds (0) */ +} *apm_pwstatus_t; + +struct apm_bios_arg { + uint32_t eax; + uint32_t ebx; + uint32_t ecx; + uint32_t edx; + uint32_t esi; + uint32_t edi; +}; + +struct apm_event_info { + u_int type; + u_int index; + u_int spare[8]; +}; + +#define APMIO_SUSPEND _IO('P', 1) +#define APMIO_GETINFO_OLD _IOR('P', 2, struct apm_info_old) +#define APMIO_ENABLE _IO('P', 5) +#define APMIO_DISABLE _IO('P', 6) +#define APMIO_HALTCPU _IO('P', 7) +#define APMIO_NOTHALTCPU _IO('P', 8) +#define APMIO_DISPLAY _IOW('P', 9, int) +#define APMIO_BIOS _IOWR('P', 10, struct apm_bios_arg) +#define APMIO_GETINFO _IOR('P', 11, struct apm_info) +#define APMIO_STANDBY _IO('P', 12) +#define APMIO_GETPWSTATUS _IOWR('P', 13, struct apm_pwstatus) +/* for /dev/apmctl */ +#define APMIO_NEXTEVENT _IOR('A', 100, struct apm_event_info) +#define APMIO_REJECTLASTREQ _IO('P', 101) + +#endif /* !ASSEMBLER && !INITIALIZER */ + +#endif /* !_MACHINE_APM_BIOS_H_ */ diff --git a/sys/amd64/include/atomic.h b/sys/amd64/include/atomic.h index d2a3846172d9..a2bd93002e8b 100644 --- a/sys/amd64/include/atomic.h +++ b/sys/amd64/include/atomic.h @@ -32,9 +32,9 @@ #error this file needs sys/cdefs.h as a prerequisite #endif -#define mb() __asm__ __volatile__ ("mfence;": : :"memory") -#define wmb() __asm__ __volatile__ ("sfence;": : :"memory") -#define rmb() __asm__ __volatile__ ("lfence;": : :"memory") +#define mb() __asm __volatile("mfence;" : : : "memory") +#define wmb() __asm __volatile("sfence;" : : : "memory") +#define rmb() __asm __volatile("lfence;" : : : "memory") /* * Various simple operations on memory, each of which is atomic in the @@ -73,7 +73,8 @@ */ #if defined(KLD_MODULE) || !defined(__GNUCLIKE_ASM) #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ -void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v) +void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v); \ +void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v) int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src); int atomic_cmpset_long(volatile u_long *dst, u_long exp, u_long src); @@ -97,8 +98,9 @@ void atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v) #endif /* - * The assembly is volatilized to demark potential before-and-after side - * effects if an interrupt or SMP collision were to occur. + * The assembly is volatilized to avoid code chunk removal by the compiler. + * GCC aggressively reorders operations and memory clobbering is necessary + * in order to avoid that for memory barriers. */ #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ static __inline void \ @@ -107,6 +109,15 @@ atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ __asm __volatile(MPLOCKED OP \ : "=m" (*p) \ : CONS (V), "m" (*p)); \ +} \ + \ +static __inline void \ +atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ +{ \ + __asm __volatile(MPLOCKED OP \ + : "=m" (*p) \ + : CONS (V), "m" (*p) \ + : "memory"); \ } \ struct __hack @@ -205,18 +216,23 @@ atomic_fetchadd_long(volatile u_long *p, u_long v) * PentiumPro or higher, reads may pass writes, so for that case we have * to use a serializing instruction (i.e. with LOCK) to do the load in * SMP kernels. For UP kernels, however, the cache of the single processor - * is always consistent, so we don't need any memory barriers. + * is always consistent, so we only need to take care of compiler. */ #define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ static __inline u_##TYPE \ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ { \ - return (*p); \ + u_##TYPE tmp; \ + \ + tmp = *p; \ + __asm __volatile ("" : : : "memory"); \ + return (tmp); \ } \ \ static __inline void \ atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ { \ + __asm __volatile ("" : : : "memory"); \ *p = v; \ } \ struct __hack @@ -247,7 +263,8 @@ atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ __asm __volatile(SOP \ : "=m" (*p), /* 0 */ \ "+r" (v) /* 1 */ \ - : "m" (*p)); /* 2 */ \ + : "m" (*p) /* 2 */ \ + : "memory"); \ } \ struct __hack @@ -327,44 +344,43 @@ u_long atomic_readandclear_long(volatile u_long *addr); #endif /* __GNUCLIKE_ASM */ -/* Acquire and release variants are identical to the normal ones. */ -#define atomic_set_acq_char atomic_set_char -#define atomic_set_rel_char atomic_set_char -#define atomic_clear_acq_char atomic_clear_char -#define atomic_clear_rel_char atomic_clear_char -#define atomic_add_acq_char atomic_add_char -#define atomic_add_rel_char atomic_add_char -#define atomic_subtract_acq_char atomic_subtract_char -#define atomic_subtract_rel_char atomic_subtract_char +#define atomic_set_acq_char atomic_set_barr_char +#define atomic_set_rel_char atomic_set_barr_char +#define atomic_clear_acq_char atomic_clear_barr_char +#define atomic_clear_rel_char atomic_clear_barr_char +#define atomic_add_acq_char atomic_add_barr_char +#define atomic_add_rel_char atomic_add_barr_char +#define atomic_subtract_acq_char atomic_subtract_barr_char +#define atomic_subtract_rel_char atomic_subtract_barr_char -#define atomic_set_acq_short atomic_set_short -#define atomic_set_rel_short atomic_set_short -#define atomic_clear_acq_short atomic_clear_short -#define atomic_clear_rel_short atomic_clear_short -#define atomic_add_acq_short atomic_add_short -#define atomic_add_rel_short atomic_add_short -#define atomic_subtract_acq_short atomic_subtract_short -#define atomic_subtract_rel_short atomic_subtract_short +#define atomic_set_acq_short atomic_set_barr_short +#define atomic_set_rel_short atomic_set_barr_short +#define atomic_clear_acq_short atomic_clear_barr_short +#define atomic_clear_rel_short atomic_clear_barr_short +#define atomic_add_acq_short atomic_add_barr_short +#define atomic_add_rel_short atomic_add_barr_short +#define atomic_subtract_acq_short atomic_subtract_barr_short +#define atomic_subtract_rel_short atomic_subtract_barr_short -#define atomic_set_acq_int atomic_set_int -#define atomic_set_rel_int atomic_set_int -#define atomic_clear_acq_int atomic_clear_int -#define atomic_clear_rel_int atomic_clear_int -#define atomic_add_acq_int atomic_add_int -#define atomic_add_rel_int atomic_add_int -#define atomic_subtract_acq_int atomic_subtract_int -#define atomic_subtract_rel_int atomic_subtract_int +#define atomic_set_acq_int atomic_set_barr_int +#define atomic_set_rel_int atomic_set_barr_int +#define atomic_clear_acq_int atomic_clear_barr_int +#define atomic_clear_rel_int atomic_clear_barr_int +#define atomic_add_acq_int atomic_add_barr_int +#define atomic_add_rel_int atomic_add_barr_int +#define atomic_subtract_acq_int atomic_subtract_barr_int +#define atomic_subtract_rel_int atomic_subtract_barr_int #define atomic_cmpset_acq_int atomic_cmpset_int #define atomic_cmpset_rel_int atomic_cmpset_int -#define atomic_set_acq_long atomic_set_long -#define atomic_set_rel_long atomic_set_long -#define atomic_clear_acq_long atomic_clear_long -#define atomic_clear_rel_long atomic_clear_long -#define atomic_add_acq_long atomic_add_long -#define atomic_add_rel_long atomic_add_long -#define atomic_subtract_acq_long atomic_subtract_long -#define atomic_subtract_rel_long atomic_subtract_long +#define atomic_set_acq_long atomic_set_barr_long +#define atomic_set_rel_long atomic_set_barr_long +#define atomic_clear_acq_long atomic_clear_barr_long +#define atomic_clear_rel_long atomic_clear_barr_long +#define atomic_add_acq_long atomic_add_barr_long +#define atomic_add_rel_long atomic_add_barr_long +#define atomic_subtract_acq_long atomic_subtract_barr_long +#define atomic_subtract_rel_long atomic_subtract_barr_long #define atomic_cmpset_acq_long atomic_cmpset_long #define atomic_cmpset_rel_long atomic_cmpset_long diff --git a/sys/amd64/include/cpufunc.h b/sys/amd64/include/cpufunc.h index eb264aec77a6..123e2faea811 100644 --- a/sys/amd64/include/cpufunc.h +++ b/sys/amd64/include/cpufunc.h @@ -190,28 +190,28 @@ inl(u_int port) } static __inline void -insb(u_int port, void *addr, size_t cnt) +insb(u_int port, void *addr, size_t count) { __asm __volatile("cld; rep; insb" - : "+D" (addr), "+c" (cnt) + : "+D" (addr), "+c" (count) : "d" (port) : "memory"); } static __inline void -insw(u_int port, void *addr, size_t cnt) +insw(u_int port, void *addr, size_t count) { __asm __volatile("cld; rep; insw" - : "+D" (addr), "+c" (cnt) + : "+D" (addr), "+c" (count) : "d" (port) : "memory"); } static __inline void -insl(u_int port, void *addr, size_t cnt) +insl(u_int port, void *addr, size_t count) { __asm __volatile("cld; rep; insl" - : "+D" (addr), "+c" (cnt) + : "+D" (addr), "+c" (count) : "d" (port) : "memory"); } @@ -244,26 +244,26 @@ outl(u_int port, u_int data) } static __inline void -outsb(u_int port, const void *addr, size_t cnt) +outsb(u_int port, const void *addr, size_t count) { __asm __volatile("cld; rep; outsb" - : "+S" (addr), "+c" (cnt) + : "+S" (addr), "+c" (count) : "d" (port)); } static __inline void -outsw(u_int port, const void *addr, size_t cnt) +outsw(u_int port, const void *addr, size_t count) { __asm __volatile("cld; rep; outsw" - : "+S" (addr), "+c" (cnt) + : "+S" (addr), "+c" (count) : "d" (port)); } static __inline void -outsl(u_int port, const void *addr, size_t cnt) +outsl(u_int port, const void *addr, size_t count) { __asm __volatile("cld; rep; outsl" - : "+S" (addr), "+c" (cnt) + : "+S" (addr), "+c" (count) : "d" (port)); } @@ -277,7 +277,7 @@ static __inline void mfence(void) { - __asm__ __volatile("mfence" : : : "memory"); + __asm __volatile("mfence" : : : "memory"); } static __inline void @@ -457,14 +457,14 @@ load_es(u_int sel) __asm __volatile("mov %0,%%es" : : "rm" (sel)); } -static inline void +static __inline void cpu_monitor(const void *addr, int extensions, int hints) { __asm __volatile("monitor;" : :"a" (addr), "c" (extensions), "d"(hints)); } -static inline void +static __inline void cpu_mwait(int extensions, int hints) { __asm __volatile("mwait;" : :"a" (hints), "c" (extensions)); @@ -670,9 +670,9 @@ void halt(void); void ia32_pause(void); u_char inb(u_int port); u_int inl(u_int port); -void insb(u_int port, void *addr, size_t cnt); -void insl(u_int port, void *addr, size_t cnt); -void insw(u_int port, void *addr, size_t cnt); +void insb(u_int port, void *addr, size_t count); +void insl(u_int port, void *addr, size_t count); +void insw(u_int port, void *addr, size_t count); register_t intr_disable(void); void intr_restore(register_t rf); void invd(void); @@ -697,9 +697,9 @@ void load_gs(u_int sel); void ltr(u_short sel); void outb(u_int port, u_char data); void outl(u_int port, u_int data); -void outsb(u_int port, const void *addr, size_t cnt); -void outsl(u_int port, const void *addr, size_t cnt); -void outsw(u_int port, const void *addr, size_t cnt); +void outsb(u_int port, const void *addr, size_t count); +void outsl(u_int port, const void *addr, size_t count); +void outsw(u_int port, const void *addr, size_t count); void outw(u_int port, u_short data); u_long rcr0(void); u_long rcr2(void); diff --git a/sys/amd64/include/elf.h b/sys/amd64/include/elf.h index e5c95f785078..88f439805ba1 100644 --- a/sys/amd64/include/elf.h +++ b/sys/amd64/include/elf.h @@ -106,4 +106,10 @@ __ElfType(Auxinfo); #define ELF_TARG_MACH EM_X86_64 #define ELF_TARG_VER 1 +#if __ELF_WORD_SIZE == 32 +#define ET_DYN_LOAD_ADDR 0x01001000 +#else +#define ET_DYN_LOAD_ADDR 0x01021000 +#endif + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/amd64/include/intr_machdep.h b/sys/amd64/include/intr_machdep.h index 634db19c5a5c..6cd4eee6664c 100644 --- a/sys/amd64/include/intr_machdep.h +++ b/sys/amd64/include/intr_machdep.h @@ -151,6 +151,7 @@ int intr_bind(u_int vector, u_char cpu); #endif int intr_config_intr(int vector, enum intr_trigger trig, enum intr_polarity pol); +int intr_describe(u_int vector, void *ih, const char *descr); void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame); u_int intr_next_cpu(void); struct intsrc *intr_lookup_source(int vector); diff --git a/sys/amd64/include/iodev.h b/sys/amd64/include/iodev.h index 4b35d8b03fa2..1a0a17a9561e 100644 --- a/sys/amd64/include/iodev.h +++ b/sys/amd64/include/iodev.h @@ -28,3 +28,4 @@ d_open_t ioopen; d_close_t ioclose; +d_ioctl_t ioioctl; diff --git a/sys/amd64/include/mca.h b/sys/amd64/include/mca.h index c43d98953e42..ddc3aeb649a8 100644 --- a/sys/amd64/include/mca.h +++ b/sys/amd64/include/mca.h @@ -36,6 +36,7 @@ struct mca_record { uint64_t mr_misc; uint64_t mr_tsc; int mr_apic_id; + int mr_bank; }; #ifdef _KERNEL diff --git a/sys/amd64/include/md_var.h b/sys/amd64/include/md_var.h index c66fc9fdb367..15df851ee312 100644 --- a/sys/amd64/include/md_var.h +++ b/sys/amd64/include/md_var.h @@ -89,6 +89,7 @@ void gs_load_fault(void) __asm(__STRING(gs_load_fault)); void dump_add_page(vm_paddr_t); void dump_drop_page(vm_paddr_t); void initializecpu(void); +void initializecpucache(void); void fillw(int /*u_short*/ pat, void *base, size_t cnt); void fpstate_drop(struct thread *td); int is_physical_memory(vm_paddr_t addr); diff --git a/sys/amd64/include/param.h b/sys/amd64/include/param.h index 3ede6014adcc..c940597efa18 100644 --- a/sys/amd64/include/param.h +++ b/sys/amd64/include/param.h @@ -105,7 +105,7 @@ #define NPML4EPG (PAGE_SIZE/(sizeof (pml4_entry_t))) #define NPML4EPGSHIFT 9 /* LOG2(NPML4EPG) */ #define PML4SHIFT 39 /* LOG2(NBPML4) */ -#define NBPML4 (1ul< + #define I386_GET_LDT 0 #define I386_SET_LDT 1 #define LDT_AUTO_ALLOC 0xffffffff @@ -68,8 +70,6 @@ struct i386_ioperm_args { }; #ifndef _KERNEL -#include - __BEGIN_DECLS int amd64_get_fsbase(void **); int amd64_get_gsbase(void **); diff --git a/sys/amd64/isa/atpic.c b/sys/amd64/isa/atpic.c deleted file mode 100644 index 7edaba259830..000000000000 --- a/sys/amd64/isa/atpic.c +++ /dev/null @@ -1,613 +0,0 @@ -/*- - * Copyright (c) 2003 John Baldwin - * 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. - * 3. Neither the name of the author nor the names of any co-contributors - * may 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. - */ - -/* - * PIC driver for the 8259A Master and Slave PICs in PC/AT machines. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include "opt_auto_eoi.h" -#include "opt_isa.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#define MASTER 0 -#define SLAVE 1 - -/* - * PC-AT machines wire the slave PIC to pin 2 on the master PIC. - */ -#define ICU_SLAVEID 2 - -/* - * Determine the base master and slave modes not including auto EOI support. - * All machines that FreeBSD supports use 8086 mode. - */ -#define BASE_MASTER_MODE ICW4_8086 -#define BASE_SLAVE_MODE ICW4_8086 - -/* Enable automatic EOI if requested. */ -#ifdef AUTO_EOI_1 -#define MASTER_MODE (BASE_MASTER_MODE | ICW4_AEOI) -#else -#define MASTER_MODE BASE_MASTER_MODE -#endif -#ifdef AUTO_EOI_2 -#define SLAVE_MODE (BASE_SLAVE_MODE | ICW4_AEOI) -#else -#define SLAVE_MODE BASE_SLAVE_MODE -#endif - -#define IRQ_MASK(irq) (1 << (irq)) -#define IMEN_MASK(ai) (IRQ_MASK((ai)->at_irq)) - -#define NUM_ISA_IRQS 16 - -static void atpic_init(void *dummy); - -unsigned int imen; /* XXX */ - -inthand_t - IDTVEC(atpic_intr0), IDTVEC(atpic_intr1), IDTVEC(atpic_intr2), - IDTVEC(atpic_intr3), IDTVEC(atpic_intr4), IDTVEC(atpic_intr5), - IDTVEC(atpic_intr6), IDTVEC(atpic_intr7), IDTVEC(atpic_intr8), - IDTVEC(atpic_intr9), IDTVEC(atpic_intr10), IDTVEC(atpic_intr11), - IDTVEC(atpic_intr12), IDTVEC(atpic_intr13), IDTVEC(atpic_intr14), - IDTVEC(atpic_intr15); - -#define IRQ(ap, ai) ((ap)->at_irqbase + (ai)->at_irq) - -#define ATPIC(io, base, eoi, imenptr) \ - { { atpic_enable_source, atpic_disable_source, (eoi), \ - atpic_enable_intr, atpic_disable_intr, atpic_vector, \ - atpic_source_pending, NULL, atpic_resume, atpic_config_intr,\ - atpic_assign_cpu }, (io), (base), IDT_IO_INTS + (base), \ - (imenptr) } - -#define INTSRC(irq) \ - { { &atpics[(irq) / 8].at_pic }, IDTVEC(atpic_intr ## irq ), \ - (irq) % 8 } - -struct atpic { - struct pic at_pic; - int at_ioaddr; - int at_irqbase; - uint8_t at_intbase; - uint8_t *at_imen; -}; - -struct atpic_intsrc { - struct intsrc at_intsrc; - inthand_t *at_intr; - int at_irq; /* Relative to PIC base. */ - enum intr_trigger at_trigger; - u_long at_count; - u_long at_straycount; -}; - -static void atpic_enable_source(struct intsrc *isrc); -static void atpic_disable_source(struct intsrc *isrc, int eoi); -static void atpic_eoi_master(struct intsrc *isrc); -static void atpic_eoi_slave(struct intsrc *isrc); -static void atpic_enable_intr(struct intsrc *isrc); -static void atpic_disable_intr(struct intsrc *isrc); -static int atpic_vector(struct intsrc *isrc); -static void atpic_resume(struct pic *pic); -static int atpic_source_pending(struct intsrc *isrc); -static int atpic_config_intr(struct intsrc *isrc, enum intr_trigger trig, - enum intr_polarity pol); -static int atpic_assign_cpu(struct intsrc *isrc, u_int apic_id); -static void i8259_init(struct atpic *pic, int slave); - -static struct atpic atpics[] = { - ATPIC(IO_ICU1, 0, atpic_eoi_master, (uint8_t *)&imen), - ATPIC(IO_ICU2, 8, atpic_eoi_slave, ((uint8_t *)&imen) + 1) -}; - -static struct atpic_intsrc atintrs[] = { - INTSRC(0), - INTSRC(1), - INTSRC(2), - INTSRC(3), - INTSRC(4), - INTSRC(5), - INTSRC(6), - INTSRC(7), - INTSRC(8), - INTSRC(9), - INTSRC(10), - INTSRC(11), - INTSRC(12), - INTSRC(13), - INTSRC(14), - INTSRC(15), -}; - -CTASSERT(sizeof(atintrs) / sizeof(atintrs[0]) == NUM_ISA_IRQS); - -static __inline void -_atpic_eoi_master(struct intsrc *isrc) -{ - - KASSERT(isrc->is_pic == &atpics[MASTER].at_pic, - ("%s: mismatched pic", __func__)); -#ifndef AUTO_EOI_1 - outb(atpics[MASTER].at_ioaddr, OCW2_EOI); -#endif -} - -/* - * The data sheet says no auto-EOI on slave, but it sometimes works. - * So, if AUTO_EOI_2 is enabled, we use it. - */ -static __inline void -_atpic_eoi_slave(struct intsrc *isrc) -{ - - KASSERT(isrc->is_pic == &atpics[SLAVE].at_pic, - ("%s: mismatched pic", __func__)); -#ifndef AUTO_EOI_2 - outb(atpics[SLAVE].at_ioaddr, OCW2_EOI); -#ifndef AUTO_EOI_1 - outb(atpics[MASTER].at_ioaddr, OCW2_EOI); -#endif -#endif -} - -static void -atpic_enable_source(struct intsrc *isrc) -{ - struct atpic_intsrc *ai = (struct atpic_intsrc *)isrc; - struct atpic *ap = (struct atpic *)isrc->is_pic; - - spinlock_enter(); - if (*ap->at_imen & IMEN_MASK(ai)) { - *ap->at_imen &= ~IMEN_MASK(ai); - outb(ap->at_ioaddr + ICU_IMR_OFFSET, *ap->at_imen); - } - spinlock_exit(); -} - -static void -atpic_disable_source(struct intsrc *isrc, int eoi) -{ - struct atpic_intsrc *ai = (struct atpic_intsrc *)isrc; - struct atpic *ap = (struct atpic *)isrc->is_pic; - - spinlock_enter(); - if (ai->at_trigger != INTR_TRIGGER_EDGE) { - *ap->at_imen |= IMEN_MASK(ai); - outb(ap->at_ioaddr + ICU_IMR_OFFSET, *ap->at_imen); - } - - /* - * Take care to call these functions directly instead of through - * a function pointer. All of the referenced variables should - * still be hot in the cache. - */ - if (eoi == PIC_EOI) { - if (isrc->is_pic == &atpics[MASTER].at_pic) - _atpic_eoi_master(isrc); - else - _atpic_eoi_slave(isrc); - } - - spinlock_exit(); -} - -static void -atpic_eoi_master(struct intsrc *isrc) -{ -#ifndef AUTO_EOI_1 - spinlock_enter(); - _atpic_eoi_master(isrc); - spinlock_exit(); -#endif -} - -static void -atpic_eoi_slave(struct intsrc *isrc) -{ -#ifndef AUTO_EOI_2 - spinlock_enter(); - _atpic_eoi_slave(isrc); - spinlock_exit(); -#endif -} - -static void -atpic_enable_intr(struct intsrc *isrc) -{ -} - -static void -atpic_disable_intr(struct intsrc *isrc) -{ -} - - -static int -atpic_vector(struct intsrc *isrc) -{ - struct atpic_intsrc *ai = (struct atpic_intsrc *)isrc; - struct atpic *ap = (struct atpic *)isrc->is_pic; - - return (IRQ(ap, ai)); -} - -static int -atpic_source_pending(struct intsrc *isrc) -{ - struct atpic_intsrc *ai = (struct atpic_intsrc *)isrc; - struct atpic *ap = (struct atpic *)isrc->is_pic; - - return (inb(ap->at_ioaddr) & IMEN_MASK(ai)); -} - -static void -atpic_resume(struct pic *pic) -{ - struct atpic *ap = (struct atpic *)pic; - - i8259_init(ap, ap == &atpics[SLAVE]); - if (ap == &atpics[SLAVE] && elcr_found) - elcr_resume(); -} - -static int -atpic_config_intr(struct intsrc *isrc, enum intr_trigger trig, - enum intr_polarity pol) -{ - struct atpic_intsrc *ai = (struct atpic_intsrc *)isrc; - u_int vector; - - /* Map conforming values to edge/hi and sanity check the values. */ - if (trig == INTR_TRIGGER_CONFORM) - trig = INTR_TRIGGER_EDGE; - if (pol == INTR_POLARITY_CONFORM) - pol = INTR_POLARITY_HIGH; - vector = atpic_vector(isrc); - if ((trig == INTR_TRIGGER_EDGE && pol == INTR_POLARITY_LOW) || - (trig == INTR_TRIGGER_LEVEL && pol == INTR_POLARITY_HIGH)) { - printf( - "atpic: Mismatched config for IRQ%u: trigger %s, polarity %s\n", - vector, trig == INTR_TRIGGER_EDGE ? "edge" : "level", - pol == INTR_POLARITY_HIGH ? "high" : "low"); - return (EINVAL); - } - - /* If there is no change, just return. */ - if (ai->at_trigger == trig) - return (0); - - /* - * Certain IRQs can never be level/lo, so don't try to set them - * that way if asked. At least some ELCR registers ignore setting - * these bits as well. - */ - if ((vector == 0 || vector == 1 || vector == 2 || vector == 13) && - trig == INTR_TRIGGER_LEVEL) { - if (bootverbose) - printf( - "atpic: Ignoring invalid level/low configuration for IRQ%u\n", - vector); - return (EINVAL); - } - if (!elcr_found) { - if (bootverbose) - printf("atpic: No ELCR to configure IRQ%u as %s\n", - vector, trig == INTR_TRIGGER_EDGE ? "edge/high" : - "level/low"); - return (ENXIO); - } - if (bootverbose) - printf("atpic: Programming IRQ%u as %s\n", vector, - trig == INTR_TRIGGER_EDGE ? "edge/high" : "level/low"); - spinlock_enter(); - elcr_write_trigger(atpic_vector(isrc), trig); - ai->at_trigger = trig; - spinlock_exit(); - return (0); -} - -static int -atpic_assign_cpu(struct intsrc *isrc, u_int apic_id) -{ - - /* - * 8259A's are only used in UP in which case all interrupts always - * go to the sole CPU and this function shouldn't even be called. - */ - panic("%s: bad cookie", __func__); -} - -static void -i8259_init(struct atpic *pic, int slave) -{ - int imr_addr; - - /* Reset the PIC and program with next four bytes. */ - spinlock_enter(); - outb(pic->at_ioaddr, ICW1_RESET | ICW1_IC4); - imr_addr = pic->at_ioaddr + ICU_IMR_OFFSET; - - /* Start vector. */ - outb(imr_addr, pic->at_intbase); - - /* - * Setup slave links. For the master pic, indicate what line - * the slave is configured on. For the slave indicate - * which line on the master we are connected to. - */ - if (slave) - outb(imr_addr, ICU_SLAVEID); - else - outb(imr_addr, IRQ_MASK(ICU_SLAVEID)); - - /* Set mode. */ - if (slave) - outb(imr_addr, SLAVE_MODE); - else - outb(imr_addr, MASTER_MODE); - - /* Set interrupt enable mask. */ - outb(imr_addr, *pic->at_imen); - - /* Reset is finished, default to IRR on read. */ - outb(pic->at_ioaddr, OCW3_SEL | OCW3_RR); - - /* OCW2_L1 sets priority order to 3-7, 0-2 (com2 first). */ - if (!slave) - outb(pic->at_ioaddr, OCW2_R | OCW2_SL | OCW2_L1); - spinlock_exit(); -} - -void -atpic_startup(void) -{ - struct atpic_intsrc *ai; - int i; - - /* Start off with all interrupts disabled. */ - imen = 0xffff; - i8259_init(&atpics[MASTER], 0); - i8259_init(&atpics[SLAVE], 1); - atpic_enable_source((struct intsrc *)&atintrs[ICU_SLAVEID]); - - /* Install low-level interrupt handlers for all of our IRQs. */ - for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) { - if (i == ICU_SLAVEID) - continue; - ai->at_intsrc.is_count = &ai->at_count; - ai->at_intsrc.is_straycount = &ai->at_straycount; - setidt(((struct atpic *)ai->at_intsrc.is_pic)->at_intbase + - ai->at_irq, ai->at_intr, SDT_SYSIGT, SEL_KPL, 0); - } - - /* - * Look for an ELCR. If we find one, update the trigger modes. - * If we don't find one, assume that IRQs 0, 1, 2, and 13 are - * edge triggered and that everything else is level triggered. - * We only use the trigger information to reprogram the ELCR if - * we have one and as an optimization to avoid masking edge - * triggered interrupts. For the case that we don't have an ELCR, - * it doesn't hurt to mask an edge triggered interrupt, so we - * assume level trigger for any interrupt that we aren't sure is - * edge triggered. - */ - if (elcr_found) { - for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) - ai->at_trigger = elcr_read_trigger(i); - } else { - for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) - switch (i) { - case 0: - case 1: - case 2: - case 8: - case 13: - ai->at_trigger = INTR_TRIGGER_EDGE; - break; - default: - ai->at_trigger = INTR_TRIGGER_LEVEL; - break; - } - } -} - -static void -atpic_init(void *dummy __unused) -{ - struct atpic_intsrc *ai; - int i; - - /* - * Register our PICs, even if we aren't going to use any of their - * pins so that they are suspended and resumed. - */ - if (intr_register_pic(&atpics[0].at_pic) != 0 || - intr_register_pic(&atpics[1].at_pic) != 0) - panic("Unable to register ATPICs"); - - /* - * If any of the ISA IRQs have an interrupt source already, then - * assume that the APICs are being used and don't register any - * of our interrupt sources. This makes sure we don't accidentally - * use mixed mode. The "accidental" use could otherwise occur on - * machines that route the ACPI SCI interrupt to a different ISA - * IRQ (at least one machines routes it to IRQ 13) thus disabling - * that APIC ISA routing and allowing the ATPIC source for that IRQ - * to leak through. We used to depend on this feature for routing - * IRQ0 via mixed mode, but now we don't use mixed mode at all. - */ - for (i = 0; i < NUM_ISA_IRQS; i++) - if (intr_lookup_source(i) != NULL) - return; - - /* Loop through all interrupt sources and add them. */ - for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) { - if (i == ICU_SLAVEID) - continue; - intr_register_source(&ai->at_intsrc); - } -} -SYSINIT(atpic_init, SI_SUB_INTR, SI_ORDER_SECOND + 1, atpic_init, NULL); - -void -atpic_handle_intr(u_int vector, struct trapframe *frame) -{ - struct intsrc *isrc; - - KASSERT(vector < NUM_ISA_IRQS, ("unknown int %u\n", vector)); - isrc = &atintrs[vector].at_intsrc; - - /* - * If we don't have an event, see if this is a spurious - * interrupt. - */ - if (isrc->is_event == NULL && (vector == 7 || vector == 15)) { - int port, isr; - - /* - * Read the ISR register to see if IRQ 7/15 is really - * pending. Reset read register back to IRR when done. - */ - port = ((struct atpic *)isrc->is_pic)->at_ioaddr; - spinlock_enter(); - outb(port, OCW3_SEL | OCW3_RR | OCW3_RIS); - isr = inb(port); - outb(port, OCW3_SEL | OCW3_RR); - spinlock_exit(); - if ((isr & IRQ_MASK(7)) == 0) - return; - } - intr_execute_handlers(isrc, frame); -} - -#ifdef DEV_ISA -/* - * Bus attachment for the ISA PIC. - */ -static struct isa_pnp_id atpic_ids[] = { - { 0x0000d041 /* PNP0000 */, "AT interrupt controller" }, - { 0 } -}; - -static int -atpic_probe(device_t dev) -{ - int result; - - result = ISA_PNP_PROBE(device_get_parent(dev), dev, atpic_ids); - if (result <= 0) - device_quiet(dev); - return (result); -} - -/* - * We might be granted IRQ 2, as this is typically consumed by chaining - * between the two PIC components. If we're using the APIC, however, - * this may not be the case, and as such we should free the resource. - * (XXX untested) - * - * The generic ISA attachment code will handle allocating any other resources - * that we don't explicitly claim here. - */ -static int -atpic_attach(device_t dev) -{ - struct resource *res; - int rid; - - /* Try to allocate our IRQ and then free it. */ - rid = 0; - res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, 0); - if (res != NULL) - bus_release_resource(dev, SYS_RES_IRQ, rid, res); - return (0); -} - -static device_method_t atpic_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, atpic_probe), - DEVMETHOD(device_attach, atpic_attach), - DEVMETHOD(device_detach, bus_generic_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), - { 0, 0 } -}; - -static driver_t atpic_driver = { - "atpic", - atpic_methods, - 1, /* no softc */ -}; - -static devclass_t atpic_devclass; - -DRIVER_MODULE(atpic, isa, atpic_driver, atpic_devclass, 0, 0); -DRIVER_MODULE(atpic, acpi, atpic_driver, atpic_devclass, 0, 0); - -/* - * Return a bitmap of the current interrupt requests. This is 8259-specific - * and is only suitable for use at probe time. - */ -intrmask_t -isa_irq_pending(void) -{ - u_char irr1; - u_char irr2; - - irr1 = inb(IO_ICU1); - irr2 = inb(IO_ICU2); - return ((irr2 << 8) | irr1); -} -#endif /* DEV_ISA */ diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c deleted file mode 100644 index adc174358955..000000000000 --- a/sys/amd64/isa/clock.c +++ /dev/null @@ -1,664 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz and Don Ahn. - * - * 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. - * - * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * Routines to handle clock hardware. - */ - -#include "opt_clock.h" -#include "opt_isa.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#ifdef DEV_ISA -#include -#include -#endif - -#define TIMER_DIV(x) ((i8254_freq + (x) / 2) / (x)) - -int clkintr_pending; -static int pscnt = 1; -static int psdiv = 1; -#ifndef TIMER_FREQ -#define TIMER_FREQ 1193182 -#endif -u_int i8254_freq = TIMER_FREQ; -TUNABLE_INT("hw.i8254.freq", &i8254_freq); -int i8254_max_count; -static int i8254_real_max_count; - -struct mtx clock_lock; -static struct intsrc *i8254_intsrc; -static u_int32_t i8254_lastcount; -static u_int32_t i8254_offset; -static int (*i8254_pending)(struct intsrc *); -static int i8254_ticked; -static int using_atrtc_timer; -static int using_lapic_timer; - -/* Values for timerX_state: */ -#define RELEASED 0 -#define RELEASE_PENDING 1 -#define ACQUIRED 2 -#define ACQUIRE_PENDING 3 - -static u_char timer2_state; - -static unsigned i8254_get_timecount(struct timecounter *tc); -static unsigned i8254_simple_get_timecount(struct timecounter *tc); -static void set_i8254_freq(u_int freq, int intr_freq); - -static struct timecounter i8254_timecounter = { - i8254_get_timecount, /* get_timecount */ - 0, /* no poll_pps */ - ~0u, /* counter_mask */ - 0, /* frequency */ - "i8254", /* name */ - 0 /* quality */ -}; - -int -hardclockintr(struct trapframe *frame) -{ - - if (PCPU_GET(cpuid) == 0) - hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); - else - hardclock_cpu(TRAPF_USERMODE(frame)); - return (FILTER_HANDLED); -} - -int -statclockintr(struct trapframe *frame) -{ - - profclockintr(frame); - statclock(TRAPF_USERMODE(frame)); - return (FILTER_HANDLED); -} - -int -profclockintr(struct trapframe *frame) -{ - - if (!using_atrtc_timer) - hardclockintr(frame); - if (profprocs != 0) - profclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); - return (FILTER_HANDLED); -} - -static int -clkintr(struct trapframe *frame) -{ - - if (timecounter->tc_get_timecount == i8254_get_timecount) { - mtx_lock_spin(&clock_lock); - if (i8254_ticked) - i8254_ticked = 0; - else { - i8254_offset += i8254_max_count; - i8254_lastcount = 0; - } - clkintr_pending = 0; - mtx_unlock_spin(&clock_lock); - } - KASSERT(!using_lapic_timer, ("clk interrupt enabled with lapic timer")); - - if (using_atrtc_timer) { -#ifdef SMP - if (smp_started) - ipi_all_but_self(IPI_HARDCLOCK); -#endif - hardclockintr(frame); - } else { - if (--pscnt <= 0) { - pscnt = psratio; -#ifdef SMP - if (smp_started) - ipi_all_but_self(IPI_STATCLOCK); -#endif - statclockintr(frame); - } else { -#ifdef SMP - if (smp_started) - ipi_all_but_self(IPI_PROFCLOCK); -#endif - profclockintr(frame); - } - } - - return (FILTER_HANDLED); -} - -int -timer_spkr_acquire(void) -{ - int mode; - - mode = TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT; - - if (timer2_state != RELEASED) - return (-1); - timer2_state = ACQUIRED; - - /* - * This access to the timer registers is as atomic as possible - * because it is a single instruction. We could do better if we - * knew the rate. Use of splclock() limits glitches to 10-100us, - * and this is probably good enough for timer2, so we aren't as - * careful with it as with timer0. - */ - outb(TIMER_MODE, TIMER_SEL2 | (mode & 0x3f)); - ppi_spkr_on(); /* enable counter2 output to speaker */ - return (0); -} - -int -timer_spkr_release(void) -{ - - if (timer2_state != ACQUIRED) - return (-1); - timer2_state = RELEASED; - outb(TIMER_MODE, TIMER_SEL2 | TIMER_SQWAVE | TIMER_16BIT); - ppi_spkr_off(); /* disable counter2 output to speaker */ - return (0); -} - -void -timer_spkr_setfreq(int freq) -{ - - freq = i8254_freq / freq; - mtx_lock_spin(&clock_lock); - outb(TIMER_CNTR2, freq & 0xff); - outb(TIMER_CNTR2, freq >> 8); - mtx_unlock_spin(&clock_lock); -} - -/* - * This routine receives statistical clock interrupts from the RTC. - * As explained above, these occur at 128 interrupts per second. - * When profiling, we receive interrupts at a rate of 1024 Hz. - * - * This does not actually add as much overhead as it sounds, because - * when the statistical clock is active, the hardclock driver no longer - * needs to keep (inaccurate) statistics on its own. This decouples - * statistics gathering from scheduling interrupts. - * - * The RTC chip requires that we read status register C (RTC_INTR) - * to acknowledge an interrupt, before it will generate the next one. - * Under high interrupt load, rtcintr() can be indefinitely delayed and - * the clock can tick immediately after the read from RTC_INTR. In this - * case, the mc146818A interrupt signal will not drop for long enough - * to register with the 8259 PIC. If an interrupt is missed, the stat - * clock will halt, considerably degrading system performance. This is - * why we use 'while' rather than a more straightforward 'if' below. - * Stat clock ticks can still be lost, causing minor loss of accuracy - * in the statistics, but the stat clock will no longer stop. - */ -static int -rtcintr(struct trapframe *frame) -{ - int flag = 0; - - while (rtcin(RTC_INTR) & RTCIR_PERIOD) { - flag = 1; - if (--pscnt <= 0) { - pscnt = psdiv; -#ifdef SMP - if (smp_started) - ipi_all_but_self(IPI_STATCLOCK); -#endif - statclockintr(frame); - } else { -#ifdef SMP - if (smp_started) - ipi_all_but_self(IPI_PROFCLOCK); -#endif - profclockintr(frame); - } - } - return(flag ? FILTER_HANDLED : FILTER_STRAY); -} - -static int -getit(void) -{ - int high, low; - - mtx_lock_spin(&clock_lock); - - /* Select timer0 and latch counter value. */ - outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH); - - low = inb(TIMER_CNTR0); - high = inb(TIMER_CNTR0); - - mtx_unlock_spin(&clock_lock); - return ((high << 8) | low); -} - -/* - * Wait "n" microseconds. - * Relies on timer 1 counting down from (i8254_freq / hz) - * Note: timer had better have been programmed before this is first used! - */ -void -DELAY(int n) -{ - int delta, prev_tick, tick, ticks_left; - -#ifdef DELAYDEBUG - int getit_calls = 1; - int n1; - static int state = 0; -#endif - - if (tsc_freq != 0 && !tsc_is_broken) { - uint64_t start, end, now; - - sched_pin(); - start = rdtsc(); - end = start + (tsc_freq * n) / 1000000; - do { - cpu_spinwait(); - now = rdtsc(); - } while (now < end || (now > start && end < start)); - sched_unpin(); - return; - } -#ifdef DELAYDEBUG - if (state == 0) { - state = 1; - for (n1 = 1; n1 <= 10000000; n1 *= 10) - DELAY(n1); - state = 2; - } - if (state == 1) - printf("DELAY(%d)...", n); -#endif - /* - * Read the counter first, so that the rest of the setup overhead is - * counted. Guess the initial overhead is 20 usec (on most systems it - * takes about 1.5 usec for each of the i/o's in getit(). The loop - * takes about 6 usec on a 486/33 and 13 usec on a 386/20. The - * multiplications and divisions to scale the count take a while). - * - * However, if ddb is active then use a fake counter since reading - * the i8254 counter involves acquiring a lock. ddb must not do - * locking for many reasons, but it calls here for at least atkbd - * input. - */ -#ifdef KDB - if (kdb_active) - prev_tick = 1; - else -#endif - prev_tick = getit(); - n -= 0; /* XXX actually guess no initial overhead */ - /* - * Calculate (n * (i8254_freq / 1e6)) without using floating point - * and without any avoidable overflows. - */ - if (n <= 0) - ticks_left = 0; - else if (n < 256) - /* - * Use fixed point to avoid a slow division by 1000000. - * 39099 = 1193182 * 2^15 / 10^6 rounded to nearest. - * 2^15 is the first power of 2 that gives exact results - * for n between 0 and 256. - */ - ticks_left = ((u_int)n * 39099 + (1 << 15) - 1) >> 15; - else - /* - * Don't bother using fixed point, although gcc-2.7.2 - * generates particularly poor code for the long long - * division, since even the slow way will complete long - * before the delay is up (unless we're interrupted). - */ - ticks_left = ((u_int)n * (long long)i8254_freq + 999999) - / 1000000; - - while (ticks_left > 0) { -#ifdef KDB - if (kdb_active) { - inb(0x84); - tick = prev_tick - 1; - if (tick <= 0) - tick = i8254_max_count; - } else -#endif - tick = getit(); -#ifdef DELAYDEBUG - ++getit_calls; -#endif - delta = prev_tick - tick; - prev_tick = tick; - if (delta < 0) { - delta += i8254_max_count; - /* - * Guard against i8254_max_count being wrong. - * This shouldn't happen in normal operation, - * but it may happen if set_i8254_freq() is - * traced. - */ - if (delta < 0) - delta = 0; - } - ticks_left -= delta; - } -#ifdef DELAYDEBUG - if (state == 1) - printf(" %d calls to getit() at %d usec each\n", - getit_calls, (n + 5) / getit_calls); -#endif -} - -static void -set_i8254_freq(u_int freq, int intr_freq) -{ - int new_i8254_real_max_count; - - i8254_timecounter.tc_frequency = freq; - mtx_lock_spin(&clock_lock); - i8254_freq = freq; - if (using_lapic_timer) - new_i8254_real_max_count = 0x10000; - else - new_i8254_real_max_count = TIMER_DIV(intr_freq); - if (new_i8254_real_max_count != i8254_real_max_count) { - i8254_real_max_count = new_i8254_real_max_count; - if (i8254_real_max_count == 0x10000) - i8254_max_count = 0xffff; - else - i8254_max_count = i8254_real_max_count; - outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT); - outb(TIMER_CNTR0, i8254_real_max_count & 0xff); - outb(TIMER_CNTR0, i8254_real_max_count >> 8); - } - mtx_unlock_spin(&clock_lock); -} - -static void -i8254_restore(void) -{ - - mtx_lock_spin(&clock_lock); - outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT); - outb(TIMER_CNTR0, i8254_real_max_count & 0xff); - outb(TIMER_CNTR0, i8254_real_max_count >> 8); - mtx_unlock_spin(&clock_lock); -} - -/* This is separate from startrtclock() so that it can be called early. */ -void -i8254_init(void) -{ - - mtx_init(&clock_lock, "clk", NULL, MTX_SPIN | MTX_NOPROFILE); - set_i8254_freq(i8254_freq, hz); -} - -void -startrtclock() -{ - - atrtc_start(); - - set_i8254_freq(i8254_freq, hz); - tc_init(&i8254_timecounter); - - init_TSC(); -} - -/* - * Start both clocks running. - */ -void -cpu_initclocks() -{ - - using_lapic_timer = lapic_setup_clock(); - /* - * If we aren't using the local APIC timer to drive the kernel - * clocks, setup the interrupt handler for the 8254 timer 0 so - * that it can drive hardclock(). Otherwise, change the 8254 - * timecounter to user a simpler algorithm. - */ - if (!using_lapic_timer) { - intr_add_handler("clk", 0, (driver_filter_t *)clkintr, NULL, - NULL, INTR_TYPE_CLK, NULL); - i8254_intsrc = intr_lookup_source(0); - if (i8254_intsrc != NULL) - i8254_pending = - i8254_intsrc->is_pic->pic_source_pending; - } else { - i8254_timecounter.tc_get_timecount = - i8254_simple_get_timecount; - i8254_timecounter.tc_counter_mask = 0xffff; - set_i8254_freq(i8254_freq, hz); - } - - /* Initialize RTC. */ - atrtc_start(); - - /* - * If the separate statistics clock hasn't been explicility disabled - * and we aren't already using the local APIC timer to drive the - * kernel clocks, then setup the RTC to periodically interrupt to - * drive statclock() and profclock(). - */ - if (!using_lapic_timer) { - using_atrtc_timer = atrtc_setup_clock(); - if (using_atrtc_timer) { - /* Enable periodic interrupts from the RTC. */ - intr_add_handler("rtc", 8, - (driver_filter_t *)rtcintr, NULL, NULL, - INTR_TYPE_CLK, NULL); - atrtc_enable_intr(); - } else { - profhz = hz; - if (hz < 128) - stathz = hz; - else - stathz = hz / (hz / 128); - } - } - - init_TSC_tc(); -} - -void -cpu_startprofclock(void) -{ - - if (using_lapic_timer || !using_atrtc_timer) - return; - atrtc_rate(RTCSA_PROF); - psdiv = pscnt = psratio; -} - -void -cpu_stopprofclock(void) -{ - - if (using_lapic_timer || !using_atrtc_timer) - return; - atrtc_rate(RTCSA_NOPROF); - psdiv = pscnt = 1; -} - -static int -sysctl_machdep_i8254_freq(SYSCTL_HANDLER_ARGS) -{ - int error; - u_int freq; - - /* - * Use `i8254' instead of `timer' in external names because `timer' - * is is too generic. Should use it everywhere. - */ - freq = i8254_freq; - error = sysctl_handle_int(oidp, &freq, 0, req); - if (error == 0 && req->newptr != NULL) - set_i8254_freq(freq, hz); - return (error); -} - -SYSCTL_PROC(_machdep, OID_AUTO, i8254_freq, CTLTYPE_INT | CTLFLAG_RW, - 0, sizeof(u_int), sysctl_machdep_i8254_freq, "IU", ""); - -static unsigned -i8254_simple_get_timecount(struct timecounter *tc) -{ - - return (i8254_max_count - getit()); -} - -static unsigned -i8254_get_timecount(struct timecounter *tc) -{ - u_int count; - u_int high, low; - u_long rflags; - - rflags = read_rflags(); - mtx_lock_spin(&clock_lock); - - /* Select timer0 and latch counter value. */ - outb(TIMER_MODE, TIMER_SEL0 | TIMER_LATCH); - - low = inb(TIMER_CNTR0); - high = inb(TIMER_CNTR0); - count = i8254_max_count - ((high << 8) | low); - if (count < i8254_lastcount || - (!i8254_ticked && (clkintr_pending || - ((count < 20 || (!(rflags & PSL_I) && - count < i8254_max_count / 2u)) && - i8254_pending != NULL && i8254_pending(i8254_intsrc))))) { - i8254_ticked = 1; - i8254_offset += i8254_max_count; - } - i8254_lastcount = count; - count += i8254_offset; - mtx_unlock_spin(&clock_lock); - return (count); -} - -#ifdef DEV_ISA -/* - * Attach to the ISA PnP descriptors for the timer - */ -static struct isa_pnp_id attimer_ids[] = { - { 0x0001d041 /* PNP0100 */, "AT timer" }, - { 0 } -}; - -static int -attimer_probe(device_t dev) -{ - int result; - - result = ISA_PNP_PROBE(device_get_parent(dev), dev, attimer_ids); - if (result <= 0) - device_quiet(dev); - return(result); -} - -static int -attimer_attach(device_t dev) -{ - return(0); -} - -static int -attimer_resume(device_t dev) -{ - - i8254_restore(); - return(0); -} - -static device_method_t attimer_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, attimer_probe), - DEVMETHOD(device_attach, attimer_attach), - DEVMETHOD(device_detach, bus_generic_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, attimer_resume), - { 0, 0 } -}; - -static driver_t attimer_driver = { - "attimer", - attimer_methods, - 1, /* no softc */ -}; - -static devclass_t attimer_devclass; - -DRIVER_MODULE(attimer, isa, attimer_driver, attimer_devclass, 0, 0); -DRIVER_MODULE(attimer, acpi, attimer_driver, attimer_devclass, 0, 0); - -#endif /* DEV_ISA */ diff --git a/sys/amd64/isa/isa.c b/sys/amd64/isa/isa.c deleted file mode 100644 index 1f202262528c..000000000000 --- a/sys/amd64/isa/isa.c +++ /dev/null @@ -1,167 +0,0 @@ -/*- - * Copyright (c) 1998 Doug Rabson - * 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. - */ - -#include -__FBSDID("$FreeBSD$"); - -/*- - * Modifications for Intel architecture by Garrett A. Wollman. - * Copyright 1998 Massachusetts Institute of Technology - * - * Permission to use, copy, modify, and distribute this software and - * its documentation for any purpose and without fee is hereby - * granted, provided that both the above copyright notice and this - * permission notice appear in all copies, that both the above - * copyright notice and this permission notice appear in all - * supporting documentation, and that the name of M.I.T. not be used - * in advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. M.I.T. makes - * no representations about the suitability of this software for any - * purpose. It is provided "as is" without express or implied - * warranty. - * - * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS - * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT - * SHALL M.I.T. 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 -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -void -isa_init(device_t dev) -{ -} - -/* - * This implementation simply passes the request up to the parent - * bus, which in our case is the special i386 nexus, substituting any - * configured values if the caller defaulted. We can get away with - * this because there is no special mapping for ISA resources on an Intel - * platform. When porting this code to another architecture, it may be - * necessary to interpose a mapping layer here. - */ -struct resource * -isa_alloc_resource(device_t bus, device_t child, int type, int *rid, - u_long start, u_long end, u_long count, u_int flags) -{ - /* - * Consider adding a resource definition. - */ - int passthrough = (device_get_parent(child) != bus); - int isdefault = (start == 0UL && end == ~0UL); - struct isa_device* idev = DEVTOISA(child); - struct resource_list *rl = &idev->id_resources; - struct resource_list_entry *rle; - - if (!passthrough && !isdefault) { - rle = resource_list_find(rl, type, *rid); - if (!rle) { - if (*rid < 0) - return 0; - switch (type) { - case SYS_RES_IRQ: - if (*rid >= ISA_NIRQ) - return 0; - break; - case SYS_RES_DRQ: - if (*rid >= ISA_NDRQ) - return 0; - break; - case SYS_RES_MEMORY: - if (*rid >= ISA_NMEM) - return 0; - break; - case SYS_RES_IOPORT: - if (*rid >= ISA_NPORT) - return 0; - break; - default: - return 0; - } - resource_list_add(rl, type, *rid, start, end, count); - } - } - - return resource_list_alloc(rl, bus, child, type, rid, - start, end, count, flags); -} - -int -isa_release_resource(device_t bus, device_t child, int type, int rid, - struct resource *r) -{ - struct isa_device* idev = DEVTOISA(child); - struct resource_list *rl = &idev->id_resources; - - return resource_list_release(rl, bus, child, type, rid, r); -} - -/* - * We can't use the bus_generic_* versions of these methods because those - * methods always pass the bus param as the requesting device, and we need - * to pass the child (the i386 nexus knows about this and is prepared to - * deal). - */ -int -isa_setup_intr(device_t bus, device_t child, struct resource *r, int flags, - driver_filter_t *filter, void (*ihand)(void *), void *arg, - void **cookiep) -{ - return (BUS_SETUP_INTR(device_get_parent(bus), child, r, flags, - filter, ihand, arg, cookiep)); -} - -int -isa_teardown_intr(device_t bus, device_t child, struct resource *r, - void *cookie) -{ - return (BUS_TEARDOWN_INTR(device_get_parent(bus), child, r, cookie)); -} - -/* - * On this platform, isa can also attach to the legacy bus. - */ -DRIVER_MODULE(isa, legacy, isa_driver, isa_devclass, 0, 0); diff --git a/sys/amd64/isa/isa.h b/sys/amd64/isa/isa.h deleted file mode 100644 index 3c58e6c600ca..000000000000 --- a/sys/amd64/isa/isa.h +++ /dev/null @@ -1,80 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * 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. - * - * from: @(#)isa.h 5.7 (Berkeley) 5/9/91 - * $FreeBSD$ - */ - -#ifndef _I386_ISA_ISA_H_ -#define _I386_ISA_ISA_H_ - -/* BEWARE: Included in both assembler and C code */ - -/* - * ISA Bus conventions - */ - -/* - * Input / Output Port Assignments - */ -#ifndef IO_ISABEGIN -#define IO_ISABEGIN 0x000 /* 0x000 - Beginning of I/O Registers */ - - /* CPU Board */ -#define IO_ICU1 0x020 /* 8259A Interrupt Controller #1 */ -#define IO_PMP1 0x026 /* 82347 Power Management Peripheral */ -#define IO_KBD 0x060 /* 8042 Keyboard */ -#define IO_RTC 0x070 /* RTC */ -#define IO_NMI IO_RTC /* NMI Control */ -#define IO_ICU2 0x0A0 /* 8259A Interrupt Controller #2 */ - - /* Cards */ -#define IO_VGA 0x3C0 /* E/VGA Ports */ -#define IO_CGA 0x3D0 /* CGA Ports */ -#define IO_MDA 0x3B0 /* Monochome Adapter */ - -#define IO_ISAEND 0x3FF /* End (actually Max) of I/O Regs */ -#endif /* !IO_ISABEGIN */ - -/* - * Input / Output Port Sizes - these are from several sources, and tend - * to be the larger of what was found. - */ -#ifndef IO_ISASIZES -#define IO_ISASIZES - -#define IO_CGASIZE 12 /* CGA controllers */ -#define IO_MDASIZE 12 /* Monochrome display controllers */ -#define IO_VGASIZE 16 /* VGA controllers */ - -#endif /* !IO_ISASIZES */ - -#endif /* !_I386_ISA_ISA_H_ */ diff --git a/sys/amd64/isa/nmi.c b/sys/amd64/isa/nmi.c deleted file mode 100644 index 887879a31998..000000000000 --- a/sys/amd64/isa/nmi.c +++ /dev/null @@ -1,99 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * 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. - * - * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 - */ - -#include -__FBSDID("$FreeBSD$"); - -#include "opt_mca.h" - -#include -#include -#include - -#include - -#define NMI_PARITY (1 << 7) -#define NMI_IOCHAN (1 << 6) -#define ENMI_WATCHDOG (1 << 7) -#define ENMI_BUSTIMER (1 << 6) -#define ENMI_IOSTATUS (1 << 5) - -/* - * Handle a NMI, possibly a machine check. - * return true to panic system, false to ignore. - */ -int -isa_nmi(int cd) -{ - int retval = 0; - int isa_port = inb(0x61); - int eisa_port = inb(0x461); - - log(LOG_CRIT, "NMI ISA %x, EISA %x\n", isa_port, eisa_port); - - if (isa_port & NMI_PARITY) { - log(LOG_CRIT, "RAM parity error, likely hardware failure."); - retval = 1; - } - - if (isa_port & NMI_IOCHAN) { - log(LOG_CRIT, "I/O channel check, likely hardware failure."); - retval = 1; - } - - /* - * On a real EISA machine, this will never happen. However it can - * happen on ISA machines which implement XT style floating point - * error handling (very rare). Save them from a meaningless panic. - */ - if (eisa_port == 0xff) - return(retval); - - if (eisa_port & ENMI_WATCHDOG) { - log(LOG_CRIT, "EISA watchdog timer expired, likely hardware failure."); - retval = 1; - } - - if (eisa_port & ENMI_BUSTIMER) { - log(LOG_CRIT, "EISA bus timeout, likely hardware failure."); - retval = 1; - } - - if (eisa_port & ENMI_IOSTATUS) { - log(LOG_CRIT, "EISA I/O port status error."); - retval = 1; - } - - return(retval); -} diff --git a/sys/amd64/linux32/linux32_machdep.c b/sys/amd64/linux32/linux32_machdep.c index 42ea0700f8b6..46119b67df69 100644 --- a/sys/amd64/linux32/linux32_machdep.c +++ b/sys/amd64/linux32/linux32_machdep.c @@ -91,6 +91,10 @@ linux_to_bsd_sigaltstack(int lsa) return (bsa); } +static int linux_mmap_common(struct thread *td, l_uintptr_t addr, + l_size_t len, l_int prot, l_int flags, l_int fd, + l_loff_t pos); + int bsd_to_linux_sigaltstack(int bsa) { @@ -759,12 +763,9 @@ linux_clone(struct thread *td, struct linux_clone_args *args) #define STACK_SIZE (2 * 1024 * 1024) #define GUARD_SIZE (4 * PAGE_SIZE) -static int linux_mmap_common(struct thread *, struct l_mmap_argv *); - int linux_mmap2(struct thread *td, struct linux_mmap2_args *args) { - struct l_mmap_argv linux_args; #ifdef DEBUG if (ldebug(mmap2)) @@ -773,14 +774,9 @@ linux_mmap2(struct thread *td, struct linux_mmap2_args *args) args->flags, args->fd, args->pgoff); #endif - linux_args.addr = PTROUT(args->addr); - linux_args.len = args->len; - linux_args.prot = args->prot; - linux_args.flags = args->flags; - linux_args.fd = args->fd; - linux_args.pgoff = args->pgoff; - - return (linux_mmap_common(td, &linux_args)); + return (linux_mmap_common(td, PTROUT(args->addr), args->len, args->prot, + args->flags, args->fd, (uint64_t)(uint32_t)args->pgoff * + PAGE_SIZE)); } int @@ -799,15 +795,15 @@ linux_mmap(struct thread *td, struct linux_mmap_args *args) linux_args.addr, linux_args.len, linux_args.prot, linux_args.flags, linux_args.fd, linux_args.pgoff); #endif - if ((linux_args.pgoff % PAGE_SIZE) != 0) - return (EINVAL); - linux_args.pgoff /= PAGE_SIZE; - return (linux_mmap_common(td, &linux_args)); + return (linux_mmap_common(td, linux_args.addr, linux_args.len, + linux_args.prot, linux_args.flags, linux_args.fd, + (uint32_t)linux_args.pgoff)); } static int -linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) +linux_mmap_common(struct thread *td, l_uintptr_t addr, l_size_t len, l_int prot, + l_int flags, l_int fd, l_loff_t pos) { struct proc *p = td->td_proc; struct mmap_args /* { @@ -830,21 +826,20 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * Linux mmap(2): * You must specify exactly one of MAP_SHARED and MAP_PRIVATE */ - if (! ((linux_args->flags & LINUX_MAP_SHARED) ^ - (linux_args->flags & LINUX_MAP_PRIVATE))) + if (!((flags & LINUX_MAP_SHARED) ^ (flags & LINUX_MAP_PRIVATE))) return (EINVAL); - if (linux_args->flags & LINUX_MAP_SHARED) + if (flags & LINUX_MAP_SHARED) bsd_args.flags |= MAP_SHARED; - if (linux_args->flags & LINUX_MAP_PRIVATE) + if (flags & LINUX_MAP_PRIVATE) bsd_args.flags |= MAP_PRIVATE; - if (linux_args->flags & LINUX_MAP_FIXED) + if (flags & LINUX_MAP_FIXED) bsd_args.flags |= MAP_FIXED; - if (linux_args->flags & LINUX_MAP_ANON) + if (flags & LINUX_MAP_ANON) bsd_args.flags |= MAP_ANON; else bsd_args.flags |= MAP_NOSYNC; - if (linux_args->flags & LINUX_MAP_GROWSDOWN) + if (flags & LINUX_MAP_GROWSDOWN) bsd_args.flags |= MAP_STACK; /* @@ -852,12 +847,12 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * on Linux/i386. We do this to ensure maximum compatibility. * Linux/ia64 does the same in i386 emulation mode. */ - bsd_args.prot = linux_args->prot; + bsd_args.prot = prot; if (bsd_args.prot & (PROT_READ | PROT_WRITE | PROT_EXEC)) bsd_args.prot |= PROT_READ | PROT_EXEC; /* Linux does not check file descriptor when MAP_ANONYMOUS is set. */ - bsd_args.fd = (bsd_args.flags & MAP_ANON) ? -1 : linux_args->fd; + bsd_args.fd = (bsd_args.flags & MAP_ANON) ? -1 : fd; if (bsd_args.fd != -1) { /* * Linux follows Solaris mmap(2) description: @@ -882,7 +877,7 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) fdrop(fp, td); } - if (linux_args->flags & LINUX_MAP_GROWSDOWN) { + if (flags & LINUX_MAP_GROWSDOWN) { /* * The Linux MAP_GROWSDOWN option does not limit auto * growth of the region. Linux mmap with this option @@ -905,8 +900,7 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * fixed size of (STACK_SIZE - GUARD_SIZE). */ - if ((caddr_t)PTRIN(linux_args->addr) + linux_args->len > - p->p_vmspace->vm_maxsaddr) { + if ((caddr_t)PTRIN(addr) + len > p->p_vmspace->vm_maxsaddr) { /* * Some Linux apps will attempt to mmap * thread stacks near the top of their @@ -937,19 +931,19 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * we map the full stack, since we don't have a way * to autogrow it. */ - if (linux_args->len > STACK_SIZE - GUARD_SIZE) { - bsd_args.addr = (caddr_t)PTRIN(linux_args->addr); - bsd_args.len = linux_args->len; + if (len > STACK_SIZE - GUARD_SIZE) { + bsd_args.addr = (caddr_t)PTRIN(addr); + bsd_args.len = len; } else { - bsd_args.addr = (caddr_t)PTRIN(linux_args->addr) - - (STACK_SIZE - GUARD_SIZE - linux_args->len); + bsd_args.addr = (caddr_t)PTRIN(addr) - + (STACK_SIZE - GUARD_SIZE - len); bsd_args.len = STACK_SIZE - GUARD_SIZE; } } else { - bsd_args.addr = (caddr_t)PTRIN(linux_args->addr); - bsd_args.len = linux_args->len; + bsd_args.addr = (caddr_t)PTRIN(addr); + bsd_args.len = len; } - bsd_args.pos = (off_t)linux_args->pgoff * PAGE_SIZE; + bsd_args.pos = pos; #ifdef DEBUG if (ldebug(mmap)) diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c index 54a04eea5810..6e3e32622bf0 100644 --- a/sys/amd64/linux32/linux32_sysvec.c +++ b/sys/amd64/linux32/linux32_sysvec.c @@ -565,9 +565,9 @@ linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) int linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args) { - struct proc *p = td->td_proc; struct l_sigframe frame; struct trapframe *regs; + sigset_t bmask; l_sigset_t lmask; int eflags, i; ksiginfo_t ksi; @@ -623,11 +623,8 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args) lmask.__bits[0] = frame.sf_sc.sc_mask; for (i = 0; i < (LINUX_NSIG_WORDS-1); i++) lmask.__bits[i+1] = frame.sf_extramask[i]; - PROC_LOCK(p); - linux_to_bsd_sigset(&lmask, &td->td_sigmask); - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + linux_to_bsd_sigset(&lmask, &bmask); + kern_sigprocmask(td, SIG_SETMASK, &bmask, NULL, 0); /* * Restore signal context. @@ -666,9 +663,9 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args) int linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args) { - struct proc *p = td->td_proc; struct l_ucontext uc; struct l_sigcontext *context; + sigset_t bmask; l_stack_t *lss; stack_t ss; struct trapframe *regs; @@ -725,11 +722,8 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args) return(EINVAL); } - PROC_LOCK(p); - linux_to_bsd_sigset(&uc.uc_sigmask, &td->td_sigmask); - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + linux_to_bsd_sigset(&uc.uc_sigmask, &bmask); + kern_sigprocmask(td, SIG_SETMASK, &bmask, NULL, 0); /* * Restore signal context diff --git a/sys/arm/arm/busdma_machdep.c b/sys/arm/arm/busdma_machdep.c index cf4873f50945..708067146b9f 100644 --- a/sys/arm/arm/busdma_machdep.c +++ b/sys/arm/arm/busdma_machdep.c @@ -555,12 +555,12 @@ int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) { - _busdma_free_dmamap(map); if (STAILQ_FIRST(&map->bpages) != NULL) { CTR3(KTR_BUSDMA, "%s: tag %p error %d", __func__, dmat, EBUSY); return (EBUSY); } + _busdma_free_dmamap(map); if (dmat->bounce_zone) dmat->bounce_zone->map_count--; dmat->map_count--; diff --git a/sys/arm/arm/cpufunc.c b/sys/arm/arm/cpufunc.c index 583293355a9c..2f4c3a1f58a9 100644 --- a/sys/arm/arm/cpufunc.c +++ b/sys/arm/arm/cpufunc.c @@ -83,15 +83,6 @@ __FBSDID("$FreeBSD$"); #include #endif -#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ - defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) -#include -#endif - -#if defined(PERFCTRS) -struct arm_pmc_funcs *arm_pmc; -#endif - /* PRIMARY CACHE VARIABLES */ int arm_picache_size; int arm_picache_line_size; @@ -790,6 +781,73 @@ struct cpu_functions xscalec3_cpufuncs = { xscale_setup /* cpu setup */ }; #endif /* CPU_XSCALE_81342 */ + + +#if defined(CPU_FA526) +struct cpu_functions fa526_cpufuncs = { + /* CPU functions */ + + .cf_id = cpufunc_id, + .cf_cpwait = cpufunc_nullop, + + /* MMU functions */ + + .cf_control = cpufunc_control, + .cf_domains = cpufunc_domains, + .cf_setttb = fa526_setttb, + .cf_faultstatus = cpufunc_faultstatus, + .cf_faultaddress = cpufunc_faultaddress, + + /* TLB functions */ + + .cf_tlb_flushID = armv4_tlb_flushID, + .cf_tlb_flushID_SE = fa526_tlb_flushID_SE, + .cf_tlb_flushI = armv4_tlb_flushI, + .cf_tlb_flushI_SE = fa526_tlb_flushI_SE, + .cf_tlb_flushD = armv4_tlb_flushD, + .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, + + /* Cache operations */ + + .cf_icache_sync_all = fa526_icache_sync_all, + .cf_icache_sync_range = fa526_icache_sync_range, + + .cf_dcache_wbinv_all = fa526_dcache_wbinv_all, + .cf_dcache_wbinv_range = fa526_dcache_wbinv_range, + .cf_dcache_inv_range = fa526_dcache_inv_range, + .cf_dcache_wb_range = fa526_dcache_wb_range, + + .cf_idcache_wbinv_all = fa526_idcache_wbinv_all, + .cf_idcache_wbinv_range = fa526_idcache_wbinv_range, + + + .cf_l2cache_wbinv_all = cpufunc_nullop, + .cf_l2cache_wbinv_range = (void *)cpufunc_nullop, + .cf_l2cache_inv_range = (void *)cpufunc_nullop, + .cf_l2cache_wb_range = (void *)cpufunc_nullop, + + + /* Other functions */ + + .cf_flush_prefetchbuf = fa526_flush_prefetchbuf, + .cf_drain_writebuf = armv4_drain_writebuf, + .cf_flush_brnchtgt_C = cpufunc_nullop, + .cf_flush_brnchtgt_E = fa526_flush_brnchtgt_E, + + .cf_sleep = fa526_cpu_sleep, + + /* Soft functions */ + + .cf_dataabt_fixup = cpufunc_null_fixup, + .cf_prefetchabt_fixup = cpufunc_null_fixup, + + .cf_context_switch = fa526_context_switch, + + .cf_setup = fa526_setup +}; +#endif /* CPU_FA526 */ + + /* * Global constants also used by locore.s */ @@ -802,6 +860,7 @@ u_int cpu_reset_needs_v4_MMU_disable; /* flag used in locore.s */ defined (CPU_ARM9E) || defined (CPU_ARM10) || \ defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ + defined(CPU_FA526) || \ defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) static void get_cachetype_cp15(void); @@ -1082,6 +1141,19 @@ set_cpufuncs() goto out; } #endif /* CPU_SA1110 */ +#ifdef CPU_FA526 + if (cputype == CPU_ID_FA526) { + cpufuncs = fa526_cpufuncs; + cpu_reset_needs_v4_MMU_disable = 1; /* SA needs it */ + get_cachetype_cp15(); + pmap_pte_init_generic(); + + /* Use powersave on this CPU. */ + cpu_do_powersave = 1; + + goto out; + } +#endif /* CPU_FA526 */ #ifdef CPU_IXP12X0 if (cputype == CPU_ID_IXP1200) { cpufuncs = ixp12x0_cpufuncs; @@ -1097,18 +1169,6 @@ set_cpufuncs() i80200_icu_init(); - /* - * Reset the Performance Monitoring Unit to a - * pristine state: - * - CCNT, PMN0, PMN1 reset to 0 - * - overflow indications cleared - * - all counters disabled - */ - __asm __volatile("mcr p14, 0, %0, c0, c0, 0" - : - : "r" (PMNC_P|PMNC_C|PMNC_PMN0_IF|PMNC_PMN1_IF| - PMNC_CC_IF)); - #if defined(XSCALE_CCLKCFG) /* * Crank CCLKCFG to maximum legal value. @@ -1128,10 +1188,6 @@ set_cpufuncs() : "r" (BCUCTL_E0|BCUCTL_E1|BCUCTL_EV)); cpufuncs = xscale_cpufuncs; -#if defined(PERFCTRS) - xscale_pmu_init(); -#endif - /* * i80200 errata: Step-A0 and A1 have a bug where * D$ dirty bits are not cleared on "invalidate by @@ -1152,23 +1208,7 @@ set_cpufuncs() if (cputype == CPU_ID_80321_400 || cputype == CPU_ID_80321_600 || cputype == CPU_ID_80321_400_B0 || cputype == CPU_ID_80321_600_B0 || cputype == CPU_ID_80219_400 || cputype == CPU_ID_80219_600) { - /* - * Reset the Performance Monitoring Unit to a - * pristine state: - * - CCNT, PMN0, PMN1 reset to 0 - * - overflow indications cleared - * - all counters disabled - */ - __asm __volatile("mcr p14, 0, %0, c0, c0, 0" - : - : "r" (PMNC_P|PMNC_C|PMNC_PMN0_IF|PMNC_PMN1_IF| - PMNC_CC_IF)); - cpufuncs = xscale_cpufuncs; -#if defined(PERFCTRS) - xscale_pmu_init(); -#endif - cpu_reset_needs_v4_MMU_disable = 1; /* XScale needs it */ get_cachetype_cp15(); pmap_pte_init_xscale(); @@ -1179,10 +1219,6 @@ set_cpufuncs() #if defined(CPU_XSCALE_81342) if (cputype == CPU_ID_81342) { cpufuncs = xscalec3_cpufuncs; -#if defined(PERFCTRS) - xscale_pmu_init(); -#endif - cpu_reset_needs_v4_MMU_disable = 1; /* XScale needs it */ get_cachetype_cp15(); pmap_pte_init_xscale(); @@ -1196,10 +1232,6 @@ set_cpufuncs() (cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA210) { cpufuncs = xscale_cpufuncs; -#if defined(PERFCTRS) - xscale_pmu_init(); -#endif - cpu_reset_needs_v4_MMU_disable = 1; /* XScale needs it */ get_cachetype_cp15(); pmap_pte_init_xscale(); @@ -1215,10 +1247,6 @@ set_cpufuncs() cputype == CPU_ID_IXP425_266 || cputype == CPU_ID_IXP435) { cpufuncs = xscale_cpufuncs; -#if defined(PERFCTRS) - xscale_pmu_init(); -#endif - cpu_reset_needs_v4_MMU_disable = 1; /* XScale needs it */ get_cachetype_cp15(); pmap_pte_init_xscale(); @@ -1600,7 +1628,8 @@ late_abort_fixup(arg) defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) || \ - defined(CPU_ARM10) || defined(CPU_ARM11) + defined(CPU_ARM10) || defined(CPU_ARM11) || \ + defined(CPU_FA526) #define IGN 0 #define OR 1 @@ -2066,6 +2095,63 @@ sa11x0_setup(args) } #endif /* CPU_SA1100 || CPU_SA1110 */ +#if defined(CPU_FA526) +struct cpu_option fa526_options[] = { +#ifdef COMPAT_12 + { "nocache", IGN, BIC, (CPU_CONTROL_IC_ENABLE | + CPU_CONTROL_DC_ENABLE) }, + { "nowritebuf", IGN, BIC, CPU_CONTROL_WBUF_ENABLE }, +#endif /* COMPAT_12 */ + { "cpu.cache", BIC, OR, (CPU_CONTROL_IC_ENABLE | + CPU_CONTROL_DC_ENABLE) }, + { "cpu.nocache", OR, BIC, (CPU_CONTROL_IC_ENABLE | + CPU_CONTROL_DC_ENABLE) }, + { "cpu.writebuf", BIC, OR, CPU_CONTROL_WBUF_ENABLE }, + { "cpu.nowritebuf", OR, BIC, CPU_CONTROL_WBUF_ENABLE }, + { NULL, IGN, IGN, 0 } +}; + +void +fa526_setup(char *args) +{ + int cpuctrl, cpuctrlmask; + + cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE + | CPU_CONTROL_32BD_ENABLE | CPU_CONTROL_SYST_ENABLE + | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE + | CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_LABT_ENABLE + | CPU_CONTROL_BPRD_ENABLE; + cpuctrlmask = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE + | CPU_CONTROL_32BD_ENABLE | CPU_CONTROL_SYST_ENABLE + | CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE + | CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_ROM_ENABLE + | CPU_CONTROL_BEND_ENABLE | CPU_CONTROL_AFLT_ENABLE + | CPU_CONTROL_LABT_ENABLE | CPU_CONTROL_BPRD_ENABLE + | CPU_CONTROL_CPCLK | CPU_CONTROL_VECRELOC; + +#ifndef ARM32_DISABLE_ALIGNMENT_FAULTS + cpuctrl |= CPU_CONTROL_AFLT_ENABLE; +#endif + + cpuctrl = parse_cpu_options(args, fa526_options, cpuctrl); + +#ifdef __ARMEB__ + cpuctrl |= CPU_CONTROL_BEND_ENABLE; +#endif + + if (vector_page == ARM_VECTORS_HIGH) + cpuctrl |= CPU_CONTROL_VECRELOC; + + /* Clear out the cache */ + cpu_idcache_wbinv_all(); + + /* Set the control register */ + ctrl = cpuctrl; + cpu_control(0xffffffff, cpuctrl); +} +#endif /* CPU_FA526 */ + + #if defined(CPU_IXP12X0) struct cpu_option ixp12x0_options[] = { { "cpu.cache", BIC, OR, (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) }, diff --git a/sys/arm/arm/cpufunc_asm_fa526.S b/sys/arm/arm/cpufunc_asm_fa526.S new file mode 100644 index 000000000000..d68d7a6f26b3 --- /dev/null +++ b/sys/arm/arm/cpufunc_asm_fa526.S @@ -0,0 +1,209 @@ +/* $NetBSD: cpufunc_asm_fa526.S,v 1.3 2008/10/15 16:56:49 matt Exp $*/ +/*- + * Copyright (c) 2008 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Matt Thomas + * + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 +__FBSDID("$FreeBSD$"); + +#define CACHELINE_SIZE 16 + +ENTRY(fa526_setttb) + mov r1, #0 + mcr p15, 0, r1, c7, c14, 0 /* clean and invalidate D$ */ + mcr p15, 0, r1, c7, c5, 0 /* invalidate I$ */ + mcr p15, 0, r1, c7, c5, 6 /* invalidate BTB */ + mcr p15, 0, r1, c7, c10, 4 /* drain write and fill buffer */ + + mcr p15, 0, r0, c2, c0, 0 /* Write the TTB */ + + /* If we have updated the TTB we must flush the TLB */ + mcr p15, 0, r1, c8, c7, 0 /* invalidate I+D TLB */ + + /* Make sure that pipeline is emptied */ + mov r0, r0 + mov r0, r0 + mov pc, lr + +/* + * TLB functions + */ +ENTRY(fa526_tlb_flushID_SE) + mcr p15, 0, r0, c8, c7, 1 /* flush Utlb single entry */ + mov pc, lr + +/* + * TLB functions + */ +ENTRY(fa526_tlb_flushI_SE) + mcr p15, 0, r0, c8, c5, 1 /* flush Itlb single entry */ + mov pc, lr + +ENTRY(fa526_cpu_sleep) + mov r0, #0 +/* nop + nop*/ + mcr p15, 0, r0, c7, c0, 4 /* Wait for interrupt*/ + mov pc, lr + +ENTRY(fa526_flush_prefetchbuf) + mov r0, #0 + mcr p15, 0, r0, c7, c5, 4 /* Pre-fetch flush */ + mov pc, lr + +/* + * Cache functions + */ +ENTRY(fa526_idcache_wbinv_all) + mov r0, #0 + mcr p15, 0, r0, c7, c14, 0 /* clean and invalidate D$ */ + mcr p15, 0, r0, c7, c5, 0 /* invalidate I$ */ + mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ + mov pc, lr + +ENTRY(fa526_icache_sync_all) + mov r0, #0 + mcr p15, 0, r0, c7, c5, 0 /* invalidate I$ */ + mov pc, lr + +ENTRY(fa526_dcache_wbinv_all) + mov r0, #0 + mcr p15, 0, r0, c7, c14, 0 /* clean and invalidate D$ */ + mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ + mov pc, lr + +/* + * Soft functions + */ +ENTRY(fa526_dcache_wbinv_range) + cmp r1, #0x4000 + bhs _C_LABEL(fa526_dcache_wbinv_all) + + and r2, r0, #(CACHELINE_SIZE - 1) + add r1, r1, r2 + bic r0, r0, #(CACHELINE_SIZE - 1) + +1: mcr p15, 0, r0, c7, c14, 1 /* clean and invalidate D$ entry */ + add r0, r0, #CACHELINE_SIZE + subs r1, r1, #CACHELINE_SIZE + bhi 1b + + mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ + mov pc, lr + +ENTRY(fa526_dcache_wb_range) + cmp r1, #0x4000 + bls 1f + + mov r0, #0 + mcr p15, 0, r0, c7, c10, 0 /* clean entire D$ */ + b 3f + +1: and r2, r0, #(CACHELINE_SIZE - 1) + add r1, r1, r2 + bic r0, r0, #(CACHELINE_SIZE - 1) + +2: mcr p15, 0, r0, c7, c10, 1 /* clean D$ entry */ + add r0, r0, #CACHELINE_SIZE + subs r1, r1, #CACHELINE_SIZE + bhi 2b + +3: mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ + mov pc, lr + +ENTRY(fa526_dcache_inv_range) + and r2, r0, #(CACHELINE_SIZE - 1) + add r1, r1, r2 + bic r0, r0, #(CACHELINE_SIZE - 1) + +1: mcr p15, 0, r0, c7, c6, 1 /* invalidate D$ single entry */ + add r0, r0, #CACHELINE_SIZE + subs r1, r1, #CACHELINE_SIZE + bhi 1b + + mov pc, lr + +ENTRY(fa526_idcache_wbinv_range) + cmp r1, #0x4000 + bhs _C_LABEL(fa526_idcache_wbinv_all) + + and r2, r0, #(CACHELINE_SIZE - 1) + add r1, r1, r2 + bic r0, r0, #(CACHELINE_SIZE - 1) + +1: mcr p15, 0, r0, c7, c14, 1 /* clean and invalidate D$ entry */ + mcr p15, 0, r0, c7, c5, 1 /* invalidate I$ entry */ + add r0, r0, #CACHELINE_SIZE + subs r1, r1, #CACHELINE_SIZE + bhi 1b + +2: mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ + mov pc, lr + +ENTRY(fa526_icache_sync_range) + cmp r1, #0x4000 + bhs _C_LABEL(fa526_icache_sync_all) + + and r2, r0, #(CACHELINE_SIZE - 1) + add r1, r1, r2 + bic r0, r0, #(CACHELINE_SIZE - 1) + +1: mcr p15, 0, r0, c7, c10, 1 /* clean D$ entry */ + mcr p15, 0, r0, c7, c5, 1 /* invalidate I$ entry */ + add r0, r0, #CACHELINE_SIZE + subs r1, r1, #CACHELINE_SIZE + bhi 1b + +2: mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ + mov pc, lr + +ENTRY(fa526_flush_brnchtgt_E) + mov r0, #0 + mcr p15, 0, r0, c7, c5, 6 /* invalidate BTB cache */ + mov pc, lr + +ENTRY(fa526_context_switch) + /* + * CF_CACHE_PURGE_ID will *ALWAYS* be called prior to this. + * Thus the data cache will contain only kernel data and the + * instruction cache will contain only kernel code, and all + * kernel mappings are shared by all processes. + */ + + mcr p15, 0, r0, c2, c0, 0 /* Write the TTB */ + + /* If we have updated the TTB we must flush the TLB */ + mov r0, #0 + mcr p15, 0, r0, c8, c7, 0 /* flush the I+D tlb */ + + /* Make sure that pipeline is emptied */ + mov r0, r0 + mov r0, r0 + mov pc, lr + diff --git a/sys/arm/arm/db_trace.c b/sys/arm/arm/db_trace.c index 6913df69bebb..a83f49d5d582 100644 --- a/sys/arm/arm/db_trace.c +++ b/sys/arm/arm/db_trace.c @@ -194,18 +194,18 @@ db_md_set_watchpoint(db_expr_t addr, db_expr_t size) int db_trace_thread(struct thread *thr, int count) { - uint32_t addr; + struct pcb *ctx; - if (thr == curthread) - addr = (uint32_t)__builtin_frame_address(0); - else - addr = thr->td_pcb->un_32.pcb32_r11; - db_stack_trace_cmd(addr, -1); + ctx = kdb_thr_ctx(thr); + db_stack_trace_cmd(ctx->un_32.pcb32_r11, -1); return (0); } void db_trace_self(void) { - db_trace_thread(curthread, -1); + db_addr_t addr; + + addr = (db_addr_t)__builtin_frame_address(0); + db_stack_trace_cmd(addr, -1); } diff --git a/sys/arm/arm/elf_machdep.c b/sys/arm/arm/elf_machdep.c index 8b6105315d33..d77e7d49a980 100644 --- a/sys/arm/arm/elf_machdep.c +++ b/sys/arm/arm/elf_machdep.c @@ -88,7 +88,7 @@ static Elf32_Brandinfo freebsd_brand_info = { .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE }; -SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t) elf32_insert_brand_entry, &freebsd_brand_info); diff --git a/sys/arm/arm/elf_trampoline.c b/sys/arm/arm/elf_trampoline.c index 2755f81881dd..6addbc387d5e 100644 --- a/sys/arm/arm/elf_trampoline.c +++ b/sys/arm/arm/elf_trampoline.c @@ -57,6 +57,8 @@ void __startC(void); #define cpu_idcache_wbinv_all arm8_cache_purgeID #elif defined(CPU_ARM9) #define cpu_idcache_wbinv_all arm9_idcache_wbinv_all +#elif defined(CPU_FA526) +#define cpu_idcache_wbinv_all fa526_idcache_wbinv_all #elif defined(CPU_ARM9E) #define cpu_idcache_wbinv_all armv5_ec_idcache_wbinv_all #elif defined(CPU_ARM10) diff --git a/sys/arm/arm/gdb_machdep.c b/sys/arm/arm/gdb_machdep.c index a6fa7675e306..eefb046ef901 100644 --- a/sys/arm/arm/gdb_machdep.c +++ b/sys/arm/arm/gdb_machdep.c @@ -53,12 +53,15 @@ gdb_cpu_getreg(int regnum, size_t *regsz) *regsz = gdb_cpu_regsz(regnum); - if (kdb_thread == curthread) { - if (regnum < 16) - return (&kdb_frame->tf_r0 + 4 * regnum); + if (kdb_thread == curthread) { + if (regnum < 15) + return (&kdb_frame->tf_r0 + regnum); + if (regnum == 15) + return (&kdb_frame->tf_pc); if (regnum == 25) return (&kdb_frame->tf_spsr); } + switch (regnum) { case 8: return (&kdb_thrctx->un_32.pcb32_r8); case 9: return (&kdb_thrctx->un_32.pcb32_r9); @@ -78,6 +81,7 @@ gdb_cpu_getreg(int regnum, size_t *regsz) return (&kdb_thrctx->un_32.pcb32_pc); } } + return (NULL); } diff --git a/sys/arm/arm/identcpu.c b/sys/arm/arm/identcpu.c index 294d5a99dbbc..55e342fb7543 100644 --- a/sys/arm/arm/identcpu.c +++ b/sys/arm/arm/identcpu.c @@ -220,6 +220,9 @@ const struct cpuidtab cpuids[] = { generic_steppings }, { CPU_ID_ARM966ESR1, CPU_CLASS_ARM9ES, "ARM966E-S", generic_steppings }, + { CPU_ID_FA526, CPU_CLASS_ARM9, "FA526", + generic_steppings }, + { CPU_ID_TI925T, CPU_CLASS_ARM9TDMI, "TI ARM925T", generic_steppings }, @@ -317,6 +320,7 @@ const struct cpu_classtab cpu_classes[] = { { "ARM7", "CPU_ARM7" }, /* CPU_CLASS_ARM7 */ { "ARM7TDMI", "CPU_ARM7TDMI" }, /* CPU_CLASS_ARM7TDMI */ { "ARM8", "CPU_ARM8" }, /* CPU_CLASS_ARM8 */ + { "ARM9", "CPU_ARM9" }, /* CPU_CLASS_ARM9 */ { "ARM9TDMI", "CPU_ARM9TDMI" }, /* CPU_CLASS_ARM9TDMI */ { "ARM9E-S", "CPU_ARM9E" }, /* CPU_CLASS_ARM9ES */ { "ARM9EJ-S", "CPU_ARM9E" }, /* CPU_CLASS_ARM9EJS */ diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c index 597cdf541063..49af8e2cdf48 100644 --- a/sys/arm/arm/machdep.c +++ b/sys/arm/arm/machdep.c @@ -77,7 +77,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -605,7 +604,6 @@ sigreturn(td, uap) const struct __ucontext *sigcntxp; } */ *uap; { - struct proc *p = td->td_proc; struct sigframe sf; struct trapframe *tf; int spsr; @@ -627,11 +625,7 @@ sigreturn(td, uap) set_mcontext(td, &sf.sf_uc.uc_mcontext); /* Restore signal mask. */ - PROC_LOCK(p); - td->td_sigmask = sf.sf_uc.uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &sf.sf_uc.uc_sigmask, NULL, 0); return (EJUSTRETURN); } diff --git a/sys/arm/arm/mem.c b/sys/arm/arm/mem.c index abad8aeeebf0..a77ad900b4b4 100644 --- a/sys/arm/arm/mem.c +++ b/sys/arm/arm/mem.c @@ -153,8 +153,8 @@ memrw(struct cdev *dev, struct uio *uio, int flags) /* ARGSUSED */ int -memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, - int prot __unused) +memmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot __unused, vm_memattr_t *memattr __unused) { if (dev2unit(dev) == CDEV_MINOR_MEM) *paddr = offset; diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c index 1b9bf81f174a..ce4efae2d778 100644 --- a/sys/arm/arm/pmap.c +++ b/sys/arm/arm/pmap.c @@ -77,13 +77,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -203,7 +196,6 @@ static void pmap_enter_locked(pmap_t, vm_offset_t, vm_page_t, static void pmap_fix_cache(struct vm_page *, pmap_t, vm_offset_t); static void pmap_alloc_l1(pmap_t); static void pmap_free_l1(pmap_t); -static void pmap_use_l1(pmap_t); static int pmap_clearbit(struct vm_page *, u_int); @@ -829,47 +821,6 @@ pmap_free_l1(pmap_t pm) mtx_unlock(&l1_lru_lock); } -static PMAP_INLINE void -pmap_use_l1(pmap_t pm) -{ - struct l1_ttable *l1; - - /* - * Do nothing if we're in interrupt context. - * Access to an L1 by the kernel pmap must not affect - * the LRU list. - */ - if (pm == pmap_kernel()) - return; - - l1 = pm->pm_l1; - - /* - * If the L1 is not currently on the LRU list, just return - */ - if (l1->l1_domain_use_count == PMAP_DOMAINS) - return; - - mtx_lock(&l1_lru_lock); - - /* - * Check the use count again, now that we've acquired the lock - */ - if (l1->l1_domain_use_count == PMAP_DOMAINS) { - mtx_unlock(&l1_lru_lock); - return; - } - - /* - * Move the L1 to the back of the LRU list - */ - TAILQ_REMOVE(&l1_lru_list, l1, l1_lru); - TAILQ_INSERT_TAIL(&l1_lru_list, l1, l1_lru); - - mtx_unlock(&l1_lru_lock); -} - - /* * Returns a pointer to the L2 bucket associated with the specified pmap * and VA, or NULL if no L2 bucket exists for the address. @@ -1199,79 +1150,38 @@ pmap_tlb_flushD(pmap_t pm) cpu_tlb_flushD(); } -static PMAP_INLINE void -pmap_l2cache_wbinv_range(pmap_t pm, vm_offset_t va, vm_size_t len) +static int +pmap_has_valid_mapping(pmap_t pm, vm_offset_t va) { - vm_size_t rest; pd_entry_t *pde; pt_entry_t *ptep; - rest = MIN(PAGE_SIZE - (va & PAGE_MASK), len); + if (pmap_get_pde_pte(pm, va, &pde, &ptep) && + ptep && ((*ptep & L2_TYPE_MASK) != L2_TYPE_INV)) + return (1); - while (len > 0) { - CTR4(KTR_PMAP, "pmap_l2cache_wbinv_range: pmap %p is_kernel %d " - "va 0x%08x len 0x%x ", pm, pm == pmap_kernel(), va, rest); - if (pmap_get_pde_pte(pm, va, &pde, &ptep) && l2pte_valid(*ptep)) - cpu_l2cache_wbinv_range(va, rest); - - len -= rest; - va += rest; - - rest = MIN(PAGE_SIZE, len); - } + return (0); } static PMAP_INLINE void pmap_idcache_wbinv_range(pmap_t pm, vm_offset_t va, vm_size_t len) -{ - - if (pmap_is_current(pm)) { - cpu_idcache_wbinv_range(va, len); - pmap_l2cache_wbinv_range(pm, va, len); - } -} - -static PMAP_INLINE void -pmap_l2cache_wb_range(pmap_t pm, vm_offset_t va, vm_size_t len) { vm_size_t rest; - pd_entry_t *pde; - pt_entry_t *ptep; - rest = MIN(PAGE_SIZE - (va & PAGE_MASK), len); + CTR4(KTR_PMAP, "pmap_dcache_wbinv_range: pmap %p is_kernel %d va 0x%08x" + " len 0x%x ", pm, pm == pmap_kernel(), va, len); - while (len > 0) { - CTR4(KTR_PMAP, "pmap_l2cache_wb_range: pmap %p is_kernel %d " - "va 0x%08x len 0x%x ", pm, pm == pmap_kernel(), va, rest); - if (pmap_get_pde_pte(pm, va, &pde, &ptep) && l2pte_valid(*ptep)) - cpu_l2cache_wb_range(va, rest); - - len -= rest; - va += rest; - - rest = MIN(PAGE_SIZE, len); - } -} - -static PMAP_INLINE void -pmap_l2cache_inv_range(pmap_t pm, vm_offset_t va, vm_size_t len) -{ - vm_size_t rest; - pd_entry_t *pde; - pt_entry_t *ptep; - - rest = MIN(PAGE_SIZE - (va & PAGE_MASK), len); - - while (len > 0) { - CTR4(KTR_PMAP, "pmap_l2cache_wb_range: pmap %p is_kernel %d " - "va 0x%08x len 0x%x ", pm, pm == pmap_kernel(), va, rest); - if (pmap_get_pde_pte(pm, va, &pde, &ptep) && l2pte_valid(*ptep)) - cpu_l2cache_inv_range(va, rest); - - len -= rest; - va += rest; - - rest = MIN(PAGE_SIZE, len); + if (pmap_is_current(pm) || pm == pmap_kernel()) { + rest = MIN(PAGE_SIZE - (va & PAGE_MASK), len); + while (len > 0) { + if (pmap_has_valid_mapping(pm, va)) { + cpu_idcache_wbinv_range(va, rest); + cpu_l2cache_wbinv_range(va, rest); + } + len -= rest; + va += rest; + rest = MIN(PAGE_SIZE, len); + } } } @@ -1279,24 +1189,31 @@ static PMAP_INLINE void pmap_dcache_wb_range(pmap_t pm, vm_offset_t va, vm_size_t len, boolean_t do_inv, boolean_t rd_only) { + vm_size_t rest; CTR4(KTR_PMAP, "pmap_dcache_wb_range: pmap %p is_kernel %d va 0x%08x " "len 0x%x ", pm, pm == pmap_kernel(), va, len); CTR2(KTR_PMAP, " do_inv %d rd_only %d", do_inv, rd_only); if (pmap_is_current(pm)) { - if (do_inv) { - if (rd_only) { - cpu_dcache_inv_range(va, len); - pmap_l2cache_inv_range(pm, va, len); + rest = MIN(PAGE_SIZE - (va & PAGE_MASK), len); + while (len > 0) { + if (pmap_has_valid_mapping(pm, va)) { + if (do_inv && rd_only) { + cpu_dcache_inv_range(va, rest); + cpu_l2cache_inv_range(va, rest); + } else if (do_inv) { + cpu_dcache_wbinv_range(va, rest); + cpu_l2cache_wbinv_range(va, rest); + } else if (!rd_only) { + cpu_dcache_wb_range(va, rest); + cpu_l2cache_wb_range(va, rest); + } } - else { - cpu_dcache_wbinv_range(va, len); - pmap_l2cache_wbinv_range(pm, va, len); - } - } else if (!rd_only) { - cpu_dcache_wb_range(va, len); - pmap_l2cache_wb_range(pm, va, len); + len -= rest; + va += rest; + + rest = MIN(PAGE_SIZE, len); } } } @@ -1311,6 +1228,7 @@ pmap_idcache_wbinv_all(pmap_t pm) } } +#ifdef notyet static PMAP_INLINE void pmap_dcache_wbinv_all(pmap_t pm) { @@ -1320,6 +1238,7 @@ pmap_dcache_wbinv_all(pmap_t pm) cpu_l2cache_wbinv_all(); } } +#endif /* * PTE_SYNC_CURRENT: @@ -1914,7 +1833,7 @@ pmap_init(void) { int shpgperproc = PMAP_SHPGPERPROC; - PDEBUG(1, printf("pmap_init: phys_start = %08x\n")); + PDEBUG(1, printf("pmap_init: phys_start = %08x\n", PHYSADDR)); /* * init the pv free list @@ -2373,8 +2292,8 @@ pmap_bootstrap(vm_offset_t firstaddr, vm_offset_t lastaddr, struct pv_addr *l1pt vm_size_t size; int l1idx, l2idx, l2next = 0; - PDEBUG(1, printf("firstaddr = %08x, loadaddr = %08x\n", - firstaddr, loadaddr)); + PDEBUG(1, printf("firstaddr = %08x, lastaddr = %08x\n", + firstaddr, lastaddr)); virtual_avail = firstaddr; kernel_pmap->pm_l1 = l1; @@ -2903,14 +2822,14 @@ pmap_kenter_internal(vm_offset_t va, vm_offset_t pa, int flags) if (pvzone != NULL && (m = vm_phys_paddr_to_vm_page(pa))) { vm_page_lock_queues(); if (!TAILQ_EMPTY(&m->md.pv_list) || m->md.pv_kva) { - /* release vm_page lock for pv_entry UMA */ + /* release vm_page lock for pv_entry UMA */ vm_page_unlock_queues(); if ((pve = pmap_get_pv_entry()) == NULL) panic("pmap_kenter_internal: no pv entries"); vm_page_lock_queues(); PMAP_LOCK(pmap_kernel()); pmap_enter_pv(m, pve, pmap_kernel(), va, - PVF_WRITE | PVF_UNMAN); + PVF_WRITE | PVF_UNMAN); pmap_fix_cache(m, pmap_kernel(), va); PMAP_UNLOCK(pmap_kernel()); } else { @@ -3225,7 +3144,8 @@ pmap_remove_all(vm_page_t m) */ if (pmap_is_current(pv->pv_pmap)) { cpu_dcache_inv_range(pv->pv_va, PAGE_SIZE); - cpu_l2cache_inv_range(pv->pv_va, PAGE_SIZE); + if (pmap_has_valid_mapping(pv->pv_pmap, pv->pv_va)) + cpu_l2cache_inv_range(pv->pv_va, PAGE_SIZE); } if (pv->pv_flags & PVF_UNMAN) { @@ -3512,9 +3432,10 @@ do_l2b_alloc: if (pmap_is_current(pmap) && (oflags & PVF_NC) == 0 && (opte & L2_S_PROT_W) != 0 && - (prot & VM_PROT_WRITE) == 0) { + (prot & VM_PROT_WRITE) == 0 && + (opte & L2_TYPE_MASK) != L2_TYPE_INV) { cpu_dcache_wb_range(va, PAGE_SIZE); - pmap_l2cache_wb_range(pmap, va, PAGE_SIZE); + cpu_l2cache_wb_range(va, PAGE_SIZE); } } else { /* @@ -4251,7 +4172,7 @@ pmap_zero_page_idle(vm_page_t m) * pmap_clean_page() * * This is a local function used to work out the best strategy to clean - * a single page referenced by its entry in the PV table. It's used by + * a single page referenced by its entry in the PV table. It should be used by * pmap_copy_page, pmap_zero page and maybe some others later on. * * Its policy is effectively: @@ -4266,6 +4187,8 @@ pmap_zero_page_idle(vm_page_t m) * mapped at 0x00000000 a whole cache clean will be performed rather than * just the 1 page. Since this should not occur in everyday use and if it does * it will just result in not the most efficient clean for the page. + * + * We don't yet use this function but may want to. */ static int pmap_clean_page(struct pv_entry *pv, boolean_t is_src) @@ -4605,6 +4528,12 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr) } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/arm/arm/support.S b/sys/arm/arm/support.S index 13f37f563332..2c88f229946f 100644 --- a/sys/arm/arm/support.S +++ b/sys/arm/arm/support.S @@ -72,13 +72,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/arm/trap.c b/sys/arm/arm/trap.c index e6150c03961e..284e79790162 100644 --- a/sys/arm/arm/trap.c +++ b/sys/arm/arm/trap.c @@ -425,8 +425,7 @@ data_abort_handler(trapframe_t *tf) p->p_lock++; PROC_UNLOCK(p); } - error = vm_fault(map, va, ftype, (ftype & VM_PROT_WRITE) ? - VM_FAULT_DIRTY : VM_FAULT_NORMAL); + error = vm_fault(map, va, ftype, VM_FAULT_NORMAL); pcb->pcb_onfault = onfault; if (map != kernel_map) { @@ -932,43 +931,8 @@ syscall(struct thread *td, trapframe_t *frame, u_int32_t insn) KASSERT(td->td_ar == NULL, ("returning from syscall with td_ar set!")); } - switch (error) { - case 0: -#ifdef __ARMEB__ - if ((insn & 0x000fffff) == SYS___syscall && - code != SYS_freebsd6_lseek && code != SYS_lseek) { - /* - * 64-bit return, 32-bit syscall. Fixup byte order - */ - frame->tf_r0 = 0; - frame->tf_r1 = td->td_retval[0]; - } else { - frame->tf_r0 = td->td_retval[0]; - frame->tf_r1 = td->td_retval[1]; - } -#else - frame->tf_r0 = td->td_retval[0]; - frame->tf_r1 = td->td_retval[1]; -#endif - - frame->tf_spsr &= ~PSR_C_bit; /* carry bit */ - break; - - case ERESTART: - /* - * Reconstruct the pc to point at the swi. - */ - frame->tf_pc -= INSN_SIZE; - break; - case EJUSTRETURN: - /* nothing to do */ - break; - default: bad: - frame->tf_r0 = error; - frame->tf_spsr |= PSR_C_bit; /* carry bit */ - break; - } + cpu_set_syscall_retval(td, error); WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); diff --git a/sys/arm/arm/vm_machdep.c b/sys/arm/arm/vm_machdep.c index 6bd57999d3a1..95b9ca8fc9a3 100644 --- a/sys/arm/arm/vm_machdep.c +++ b/sys/arm/arm/vm_machdep.c @@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include @@ -261,6 +263,57 @@ done: #endif } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + trapframe_t *frame; + int fixup; +#ifdef __ARMEB__ + uint32_t insn; +#endif + + frame = td->td_frame; + fixup = 0; + +#ifdef __ARMEB__ + insn = *(u_int32_t *)(frame->tf_pc - INSN_SIZE); + if ((insn & 0x000fffff) == SYS___syscall) { + register_t *ap = &frame->tf_r0; + register_t code = ap[_QUAD_LOWWORD]; + if (td->td_proc->p_sysent->sv_mask) + code &= td->td_proc->p_sysent->sv_mask; + fixup = (code != SYS_freebsd6_lseek && code != SYS_lseek) + ? 1 : 0; + } +#endif + + switch (error) { + case 0: + if (fixup) { + frame->tf_r0 = 0; + frame->tf_r1 = td->td_retval[0]; + } else { + frame->tf_r0 = td->td_retval[0]; + frame->tf_r1 = td->td_retval[1]; + } + frame->tf_spsr &= ~PSR_C_bit; /* carry bit */ + break; + case ERESTART: + /* + * Reconstruct the pc to point at the swi. + */ + frame->tf_pc -= INSN_SIZE; + break; + case EJUSTRETURN: + /* nothing to do */ + break; + default: + frame->tf_r0 = error; + frame->tf_spsr |= PSR_C_bit; /* carry bit */ + break; + } +} + /* * Initialize machine state (pcb and trap frame) for a new thread about to * upcall. Put enough state in the new thread's PCB to get it to go back diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c index 8235000738cf..1e63ee6a9cae 100644 --- a/sys/arm/at91/at91_machdep.c +++ b/sys/arm/at91/at91_machdep.c @@ -79,7 +79,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/arm/at91/if_ate.c b/sys/arm/at91/if_ate.c index ec4771c81aca..2f6b741cc10c 100644 --- a/sys/arm/at91/if_ate.c +++ b/sys/arm/at91/if_ate.c @@ -75,8 +75,7 @@ __FBSDID("$FreeBSD$"); /* * Driver-specific flags. */ -#define ATE_FLAG_DETACHING 0x01 -#define ATE_FLAG_MULTICAST 0x02 +#define ATE_FLAG_MULTICAST 0x01 struct ate_softc { @@ -196,6 +195,7 @@ ate_attach(device_t dev) sc = device_get_softc(dev); sc->dev = dev; ATE_LOCK_INIT(sc); + callout_init_mtx(&sc->tick_ch, &sc->sc_mtx, 0); /* * Allocate resources. @@ -233,7 +233,6 @@ ate_attach(device_t dev) ATE_LOCK(sc); atestop(sc); ATE_UNLOCK(sc); - callout_init_mtx(&sc->tick_ch, &sc->sc_mtx, 0); if ((err = ate_get_mac(sc, eaddr)) != 0) { /* @@ -276,7 +275,6 @@ ate_attach(device_t dev) IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); - ifp->if_timer = 0; ifp->if_linkmib = &sc->mibdata; ifp->if_linkmiblen = sizeof(sc->mibdata); sc->mibdata.dot3Compliance = DOT3COMPLIANCE_COLLS; @@ -311,12 +309,11 @@ ate_detach(device_t dev) KASSERT(sc != NULL, ("[ate: %d]: sc is NULL", __LINE__)); ifp = sc->ifp; if (device_is_attached(dev)) { + ether_ifdetach(ifp); ATE_LOCK(sc); - sc->flags |= ATE_FLAG_DETACHING; - atestop(sc); + atestop(sc); ATE_UNLOCK(sc); callout_drain(&sc->tick_ch); - ether_ifdetach(ifp); } if (sc->miibus != NULL) { device_delete_child(dev, sc->miibus); @@ -383,6 +380,16 @@ ate_load_rx_buf(void *arg, bus_dma_segment_t *segs, int nsegs, int error) bus_dmamap_sync(sc->rxtag, sc->rx_map[i], BUS_DMASYNC_PREREAD); } +static uint32_t +ate_mac_hash(const uint8_t *buf) +{ + uint32_t index = 0; + for (int i = 0; i < 48; i++) { + index ^= ((buf[i >> 3] >> (i & 7)) & 1) << (i % 6); + } + return (index); +} + /* * Compute the multicast filter for this device using the standard * algorithm. I wonder why this isn't in ether somewhere as a lot @@ -417,8 +424,8 @@ ate_setmcast(struct ate_softc *sc) TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - index = ether_crc32_be(LLADDR((struct sockaddr_dl *) - ifma->ifma_addr), ETHER_ADDR_LEN) >> 26; + index = ate_mac_hash(LLADDR((struct sockaddr_dl *) + ifma->ifma_addr)); af[index >> 3] |= 1 << (index & 7); } if_maddr_runlock(ifp); @@ -999,7 +1006,6 @@ atestop(struct ate_softc *sc) ATE_ASSERT_LOCKED(sc); ifp = sc->ifp; if (ifp) { - ifp->if_timer = 0; ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); } @@ -1109,11 +1115,9 @@ ateioctl(struct ifnet *ifp, u_long cmd, caddr_t data) & (IFF_PROMISC | IFF_ALLMULTI)) != 0) ate_rxfilter(sc); } else { - if ((sc->flags & ATE_FLAG_DETACHING) == 0) - ateinit_locked(sc); + ateinit_locked(sc); } } else if ((drv_flags & IFF_DRV_RUNNING) != 0) { - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; atestop(sc); } sc->if_flags = flags; diff --git a/sys/arm/conf/AVILA b/sys/arm/conf/AVILA index 7019bc7a3893..49b8ed927664 100644 --- a/sys/arm/conf/AVILA +++ b/sys/arm/conf/AVILA @@ -39,6 +39,7 @@ options DEVICE_POLLING options KDB #options GDB options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver options INVARIANTS #Enable calls of extra sanity checking options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles @@ -61,6 +62,10 @@ options BOOTP_COMPAT #options PREEMPTION #options VERBOSE_SYSINIT +# Hardware performance counters +options HWPMC_HOOKS +device hwpmc + #device saarm device pci @@ -132,6 +137,7 @@ device ath_rf5413 device ath_ar5416 options AH_SUPPORT_AR5416 device ath_ar9160 +device ath_ar9280 device usb #options USB_DEBUG diff --git a/sys/arm/conf/BWCT b/sys/arm/conf/BWCT index b92e626fb56d..0fb3b872cba6 100644 --- a/sys/arm/conf/BWCT +++ b/sys/arm/conf/BWCT @@ -63,7 +63,7 @@ options SYSVSHM #SYSV-style shared memory options SYSVMSG #SYSV-style message queues options SYSVSEM #SYSV-style semaphores options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions -#options SYSCTL_OMIT_DESCR +#options NO_SYSCTL_DESCR options MUTEX_NOINLINE options RWLOCK_NOINLINE options NO_FFS_SNAPSHOT @@ -79,6 +79,7 @@ device mii device rlswitch # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/conf/CAMBRIA b/sys/arm/conf/CAMBRIA index bd22118416ad..174a7c785a8f 100644 --- a/sys/arm/conf/CAMBRIA +++ b/sys/arm/conf/CAMBRIA @@ -39,6 +39,7 @@ options DEVICE_POLLING options KDB #options GDB options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver options INVARIANTS #Enable calls of extra sanity checking options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles @@ -58,6 +59,10 @@ options BOOTP_NFSV3 options BOOTP_WIRED_TO=npe0 options BOOTP_COMPAT +# Hardware performance counters +options HWPMC_HOOKS +device hwpmc + #options VERBOSE_SYSINIT options VERBOSE_INIT_ARM @@ -135,11 +140,8 @@ device ath_rf5413 # #device ath_ar5416 #options AH_SUPPORT_AR5416 # NB: for 11n descriptor format -#device ath_rf2133 #device ath_ar9160 #device ath_ar9280 -#device ath_rf9280 -#device ath_ar9285 # NB: 2 USB 2.0 ports standard device usb diff --git a/sys/arm/conf/CNS11XXNAS b/sys/arm/conf/CNS11XXNAS new file mode 100644 index 000000000000..76db42b4e363 --- /dev/null +++ b/sys/arm/conf/CNS11XXNAS @@ -0,0 +1,125 @@ +# CNS11XXNAS - StarSemi STR9104/Cavium CNS1102 NAS +# kernel configuration file for FreeBSD/arm +# +# For more information on this file, please read the handbook section on +# Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +ident CNS11XXNAS + +#options PHYSADDR=0x10000000 +#options KERNPHYSADDR=0x10200000 +#options KERNVIRTADDR=0xc0200000 # Used in ldscript.arm +#options FLASHADDR=0x50000000 +#options LOADERRAMADDR=0x00000000 +#options STARTUP_PAGETABLE_ADDR=0x10000000 + +include "../econa/std.econa" + +makeoptions MODULES_OVERRIDE="" + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols +options HZ=100 +options DEVICE_POLLING + +# Debugging for use in -current +options KDB +#options GDB +options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver +#options INVARIANTS #Enable calls of extra sanity checking +#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +##options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed +#options DIAGNOSTIC + + +#options COMPAT_FREEBSD5 +#options COMPAT_FREEBSD6 +#options COMPAT_FREEBSD7 + + +options SCHED_ULE #ULE scheduler +#options SCHED_4BSD #4BSD scheduler +options GEOM_PART_GPT # GUID Partition Tables. +#options GEOM_PART_EBR +#options GEOM_PART_EBR_COMPAT +options GEOM_LABEL # Provides labelization + + +options INET #InterNETworking +options INET6 #IPv6 communications protocols +options FFS #Berkeley Fast Filesystem +options SOFTUPDATES #Enable FFS soft updates support +options UFS_ACL #Support for access control lists +options UFS_DIRHASH #Improve performance on big directories +options NFSCLIENT #Network Filesystem Client +#options NFSSERVER #Network Filesystem Server +#options NFSLOCKD #Network Lock Manager +options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options MSDOSFS #MSDOS Filesystem +#options CD9660 #ISO 9660 Filesystem +#options PROCFS #Process filesystem (requires PSEUDOFS) +options PSEUDOFS #Pseudo-filesystem framework +options SCSI_DELAY=5000 #Delay (in ms) before probing SCSI +options KTRACE #ktrace(1) support +options SYSVSHM #SYSV-style shared memory +options SYSVMSG #SYSV-style message queues +options SYSVSEM #SYSV-style semaphores +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions +options MUTEX_NOINLINE #Mutex inlines are space hogs +options RWLOCK_NOINLINE #rwlock inlines are space hogs +options SX_NOINLINE #sx inliens are space hogs +#options BOOTP +#options BOOTP_NFSROOT +#options BOOTP_NFSV3 +#options BOOTP_WIRED_TO=npe0 +#options BOOTP_COMPAT + +#device pci +device uart + + +device firmware +device mii # Minimal mii routines +device ether +device bpf + +device pty +device loop + +device md +device random # Entropy device + +#options ARM_USE_SMALL_ALLOC + +device usb +#options USB_DEBUG +device ohci +device ehci +device umass +device scbus # SCSI bus (required for SCSI) +device da # Direct Access (disks) +device pass +device cfi + +#device udav # Davicom DM9601E USB + +device geom_label +device geom_journal +device geom_part_bsd + +options ROOTDEVNAME=\"ufs:da0s1a\" diff --git a/sys/arm/conf/CRB b/sys/arm/conf/CRB index ef0265fa4cb6..2afd080aebca 100644 --- a/sys/arm/conf/CRB +++ b/sys/arm/conf/CRB @@ -26,8 +26,6 @@ options KERNVIRTADDR=0xc0200000 # Used in ldscript.arm options COUNTS_PER_SEC=400000000 options STARTUP_PAGETABLE_ADDR=0x00000000 include "../xscale/i8134x/std.crb" -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" #Default places to look for devices. makeoptions MODULES_OVERRIDE="" #makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols @@ -95,6 +93,7 @@ device pty # Debugging for use in -current options KDB options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/conf/DB-78XXX b/sys/arm/conf/DB-78XXX index afa6ec9a97a6..939ae2b96c51 100644 --- a/sys/arm/conf/DB-78XXX +++ b/sys/arm/conf/DB-78XXX @@ -39,6 +39,7 @@ options NO_SWAPPING # Debugging options ALT_BREAK_TO_DEBUGGER options DDB +#options DEADLKRES #Enable the deadlock resolver options DIAGNOSTIC #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS diff --git a/sys/arm/conf/DB-88F5XXX b/sys/arm/conf/DB-88F5XXX index 1297229a2aaa..41f32b1586a5 100644 --- a/sys/arm/conf/DB-88F5XXX +++ b/sys/arm/conf/DB-88F5XXX @@ -39,6 +39,7 @@ options NO_SWAPPING # Debugging options ALT_BREAK_TO_DEBUGGER options DDB +#options DEADLKRES #Enable the deadlock resolver options DIAGNOSTIC #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS diff --git a/sys/arm/conf/DB-88F6XXX b/sys/arm/conf/DB-88F6XXX index cbf7abd296c2..c0857fda6246 100644 --- a/sys/arm/conf/DB-88F6XXX +++ b/sys/arm/conf/DB-88F6XXX @@ -39,6 +39,7 @@ options NO_SWAPPING # Debugging options ALT_BREAK_TO_DEBUGGER options DDB +#options DEADLKRES #Enable the deadlock resolver options DIAGNOSTIC #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS diff --git a/sys/arm/conf/EP80219 b/sys/arm/conf/EP80219 index 65121bc50733..3c2c1aa9903f 100644 --- a/sys/arm/conf/EP80219 +++ b/sys/arm/conf/EP80219 @@ -26,8 +26,6 @@ options KERNVIRTADDR=0xc0200000 # Used in ldscript.arm options STARTUP_PAGETABLE_ADDR=0xa0000000 #options ARM32_NEW_VM_LAYOUT include "../xscale/i80321/std.ep80219" -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" #Default places to look for devices. makeoptions MODULES_OVERRIDE="" makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols @@ -91,6 +89,7 @@ device dma # I80321 DMA Controller # Debugging for use in -current options KDB options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/conf/GUMSTIX b/sys/arm/conf/GUMSTIX index 864a4f5caf70..e7900f5660c9 100644 --- a/sys/arm/conf/GUMSTIX +++ b/sys/arm/conf/GUMSTIX @@ -32,8 +32,6 @@ options KERNVIRTADDR=0xc0200000 # Used in ldscript.arm options STARTUP_PAGETABLE_ADDR=0xa0000000 include "../xscale/pxa/std.pxa" -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" #Default places to look for devices. makeoptions MODULES_OVERRIDE="" makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols @@ -82,6 +80,7 @@ device pty # Debugging for use in -current options KDB options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/conf/HL200 b/sys/arm/conf/HL200 index 61f74cf6287f..f50f64cd622f 100644 --- a/sys/arm/conf/HL200 +++ b/sys/arm/conf/HL200 @@ -59,7 +59,7 @@ options SYSVSHM #SYSV-style shared memory options SYSVMSG #SYSV-style message queues options SYSVSEM #SYSV-style semaphores options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions -#options SYSCTL_OMIT_DESCR +#options NO_SYSCTL_DESCR options MUTEX_NOINLINE options RWLOCK_NOINLINE options NO_FFS_SNAPSHOT @@ -74,6 +74,7 @@ device mii device lxtphy # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles @@ -100,9 +101,17 @@ device usb # USB Bus (required) device uhid # "Human Interface Devices" device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da -device ural # Ralink Technology RT2500USB wireless NICs -device rum # Ralink Technology RT2501USB wireless NICs device urio # Diamond Rio 500 MP3 player +# USB Serial devices +device uark # Technologies ARK3116 based serial adapters +device ubsa # Belkin F5U103 and compatible serial adapters +#device ubser # not yet converted. +device uftdi # For FTDI usb serial adapters +device uipaq # Some WinCE based devices +device uplcom # Prolific PL-2303 serial adapters +device uslcom # SI Labs CP2101/CP2102 serial adapters +device uvisor # Visor and Palm devices +device uvscom # USB serial support for DDI pocket's PHS # USB Ethernet, requires miibus device miibus device aue # ADMtek USB Ethernet @@ -111,16 +120,12 @@ device cdce # Generic USB over Ethernet device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet -device udav -# usb serial -device uark -device ubsa -#device ubser # not yet converted. -device uftdi -device uipaq -device uplcom -device uvisor -device uvscom +device udav # Davicom DM9601E USB +# USB Wireless +device rum # Ralink Technology RT2501USB wireless NICs +device uath # Atheros AR5523 wireless NICs +device ural # Ralink Technology RT2500USB wireless NICs +device zyd # ZyDAS zb1211/zb1211b wireless NICs # SCSI peripherals device scbus # SCSI bus (required for SCSI) device da # Direct Access (disks) diff --git a/sys/arm/conf/IQ31244 b/sys/arm/conf/IQ31244 index e8ed9e872338..8b794975431f 100644 --- a/sys/arm/conf/IQ31244 +++ b/sys/arm/conf/IQ31244 @@ -27,8 +27,6 @@ options LOADERRAMADDR=0x00000000 options STARTUP_PAGETABLE_ADDR=0xa0000000 include "../xscale/i80321/std.iq31244" -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" #Default places to look for devices. makeoptions MODULES_OVERRIDE="" #makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols @@ -96,6 +94,7 @@ device "iq31244_7seg" # IQ31244 7 seg # Debugging for use in -current options KDB options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/conf/KB920X b/sys/arm/conf/KB920X index 31f009622445..8d5274dfe23a 100644 --- a/sys/arm/conf/KB920X +++ b/sys/arm/conf/KB920X @@ -57,7 +57,7 @@ options SYSVSHM #SYSV-style shared memory options SYSVMSG #SYSV-style message queues options SYSVSEM #SYSV-style semaphores options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions -#options SYSCTL_OMIT_DESCR +#options NO_SYSCTL_DESCR # Disable the inlining of mutex, rwlock and sx locks. These eat up a lot # of space. options MUTEX_NOINLINE @@ -75,6 +75,7 @@ device mii device lxtphy # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles @@ -101,9 +102,16 @@ device usb # USB Bus (required) device uhid # "Human Interface Devices" device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da -device ural # Ralink Technology RT2500USB wireless NICs -device rum # Ralink Technology RT2501USB wireless NICs device urio # Diamond Rio 500 MP3 player +# USB Serial devices +device uark # Technologies ARK3116 based serial adapters +device ubsa # Belkin F5U103 and compatible serial adapters +device uftdi # For FTDI usb serial adapters +device uipaq # Some WinCE based devices +device uplcom # Prolific PL-2303 serial adapters +device uslcom # SI Labs CP2101/CP2102 serial adapters +device uvisor # Visor and Palm devices +device uvscom # USB serial support for DDI pocket's PHS # USB Ethernet, requires miibus device miibus device aue # ADMtek USB Ethernet @@ -112,15 +120,12 @@ device cdce # Generic USB over Ethernet device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet -device udav -# usb serial -device uark -device ubsa -device uftdi -device uipaq -device uplcom -device uvisor -device uvscom +device udav # Davicom DM9601E USB +# USB Wireless +device rum # Ralink Technology RT2501USB wireless NICs +device uath # Atheros AR5523 wireless NICs +device ural # Ralink Technology RT2500USB wireless NICs +device zyd # ZyDAS zb1211/zb1211b wireless NICs # SCSI peripherals device scbus # SCSI bus (required for SCSI) device da # Direct Access (disks) diff --git a/sys/arm/conf/NSLU b/sys/arm/conf/NSLU index f14a77969197..d921e3490244 100644 --- a/sys/arm/conf/NSLU +++ b/sys/arm/conf/NSLU @@ -44,6 +44,7 @@ options DEVICE_POLLING options KDB #options GDB options DDB #Enable the kernel debugger +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/conf/SIMICS b/sys/arm/conf/SIMICS index e225795f689b..229c60f9cdea 100644 --- a/sys/arm/conf/SIMICS +++ b/sys/arm/conf/SIMICS @@ -23,8 +23,6 @@ options KERNPHYSADDR=0xc0000000 options KERNVIRTADDR=0xc0000000 options PHYSADDR=0xc0000000 include "../sa11x0/std.sa11x0" -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" #Default places to look for devices. makeoptions MODULES_OVERRIDE="" makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols @@ -63,6 +61,7 @@ device rl device uart # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/conf/SKYEYE b/sys/arm/conf/SKYEYE index 56fa39c738d0..b3aad2a67a00 100644 --- a/sys/arm/conf/SKYEYE +++ b/sys/arm/conf/SKYEYE @@ -24,8 +24,6 @@ options KERNPHYSADDR=0xc0000000 options KERNVIRTADDR=0xc0000000 options PHYSADDR=0xc0000000 include "../at91/std.kb920x" -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" #Default places to look for devices. makeoptions MODULES_OVERRIDE="" makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols @@ -70,6 +68,7 @@ device uart # output. Adds ~215k to driver. # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/arm/econa/cfi_bus_econa.c b/sys/arm/econa/cfi_bus_econa.c new file mode 100644 index 000000000000..88b689931565 --- /dev/null +++ b/sys/arm/econa/cfi_bus_econa.c @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho + * 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +static int +cfi_econa_probe(device_t dev) +{ + + return cfi_probe(dev); +} + +static device_method_t cfi_econa_methods[] = { + /* device interface */ + DEVMETHOD(device_probe, cfi_econa_probe), + DEVMETHOD(device_attach, cfi_attach), + DEVMETHOD(device_detach, cfi_detach), + + {0, 0} +}; + +static driver_t cfi_econa_driver = { + cfi_driver_name, + cfi_econa_methods, + sizeof(struct cfi_softc), +}; +DRIVER_MODULE(cfi, econaarm, cfi_econa_driver, cfi_devclass, 0, 0); diff --git a/sys/arm/econa/econa.c b/sys/arm/econa/econa.c new file mode 100644 index 000000000000..eb6d04e5fcbb --- /dev/null +++ b/sys/arm/econa/econa.c @@ -0,0 +1,758 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho + * 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 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define _ARM32_BUS_DMA_PRIVATE +#include +#include +#include + +#include "econa_reg.h" +#include "econa_var.h" + +static struct econa_softc *econa_softc; + +unsigned int CPU_clock = 200000000; +unsigned int AHB_clock; +unsigned int APB_clock; + +bs_protos(generic); +bs_protos(generic_armv4); + +struct bus_space econa_bs_tag = { + /* cookie */ + (void *) 0, + + /* mapping/unmapping */ + generic_bs_map, + generic_bs_unmap, + generic_bs_subregion, + + /* allocation/deallocation */ + generic_bs_alloc, + generic_bs_free, + + /* barrier */ + generic_bs_barrier, + + /* read (single) */ + generic_bs_r_1, + generic_armv4_bs_r_2, + generic_bs_r_4, + NULL, + + /* read multiple */ + generic_bs_rm_1, + generic_armv4_bs_rm_2, + generic_bs_rm_4, + NULL, + + /* read region */ + generic_bs_rr_1, + generic_armv4_bs_rr_2, + generic_bs_rr_4, + NULL, + + /* write (single) */ + generic_bs_w_1, + generic_armv4_bs_w_2, + generic_bs_w_4, + NULL, + + /* write multiple */ + generic_bs_wm_1, + generic_armv4_bs_wm_2, + generic_bs_wm_4, + NULL, + + /* write region */ + NULL, + NULL, + NULL, + NULL, + + /* set multiple */ + NULL, + NULL, + NULL, + NULL, + + /* set region */ + NULL, + NULL, + NULL, + NULL, + + /* copy */ + NULL, + NULL, + NULL, + NULL, + + /* read (single) stream */ + NULL, + NULL, + NULL, + NULL, + + /* read multiple stream */ + NULL, + generic_armv4_bs_rm_2, + NULL, + NULL, + + /* read region stream */ + NULL, + NULL, + NULL, + NULL, + + /* write (single) stream */ + NULL, + NULL, + NULL, + NULL, + + /* write multiple stream */ + NULL, + generic_armv4_bs_wm_2, + NULL, + NULL, + + /* write region stream */ + NULL, + NULL, + NULL, + NULL +}; + +bus_space_tag_t obio_tag = &econa_bs_tag; + +static int +econa_probe(device_t dev) +{ + + device_set_desc(dev, "ECONA device bus"); + return (0); +} + +static void +econa_identify(driver_t *drv, device_t parent) +{ + + BUS_ADD_CHILD(parent, 0, "econaarm", 0); +} + +struct arm32_dma_range * +bus_dma_get_range(void) +{ + + return (NULL); +} + +int +bus_dma_get_range_nb(void) +{ + + return (0); +} + +extern void irq_entry(void); + +static void +econa_add_child(device_t dev, int prio, const char *name, int unit, + bus_addr_t addr, bus_size_t size, + int irq0, int irq1, + int irq2, int irq3, int irq4) +{ + device_t kid; + struct econa_ivar *ivar; + + kid = device_add_child_ordered(dev, prio, name, unit); + if (kid == NULL) { + printf("Can't add child %s%d ordered\n", name, unit); + return; + } + ivar = malloc(sizeof(*ivar), M_DEVBUF, M_NOWAIT | M_ZERO); + if (ivar == NULL) { + device_delete_child(dev, kid); + return; + } + device_set_ivars(kid, ivar); + resource_list_init(&ivar->resources); + if (irq0 != -1) + bus_set_resource(kid, SYS_RES_IRQ, 0, irq0, 1); + if (irq1 != 0) + bus_set_resource(kid, SYS_RES_IRQ, 1, irq1, 1); + if (irq2 != 0) + bus_set_resource(kid, SYS_RES_IRQ, 2, irq2, 1); + if (irq3 != 0) + bus_set_resource(kid, SYS_RES_IRQ, 3, irq3, 1); + if (irq4 != 0) + bus_set_resource(kid, SYS_RES_IRQ, 4, irq4, 1); + + if (addr != 0) + bus_set_resource(kid, SYS_RES_MEMORY, 0, addr, size); + +} + +struct cpu_devs +{ + const char *name; + int unit; + bus_addr_t mem_base; + bus_size_t mem_len; + int irq0; + int irq1; + int irq2; + int irq3; + int irq4; +}; + +struct cpu_devs econarm_devs[] = +{ + { + "econa_ic", 0, + ECONA_IO_BASE + ECONA_PIC_BASE, ECONA_PIC_SIZE, + 0 + }, + { + "system", 0, + ECONA_IO_BASE + ECONA_SYSTEM_BASE, ECONA_SYSTEM_SIZE, + 0 + }, + { + "uart", 0, + ECONA_IO_BASE + ECONA_UART_BASE, ECONA_UART_SIZE, + ECONA_IRQ_UART + }, + { + "timer", 0, + ECONA_IO_BASE + ECONA_TIMER_BASE, ECONA_TIMER_SIZE, + ECONA_IRQ_TIMER_1, ECONA_IRQ_TIMER_2 + }, + { + "ohci", 0, + ECONA_OHCI_VBASE, ECONA_OHCI_SIZE, + ECONA_IRQ_OHCI + }, + { + "ehci", 0, + ECONA_EHCI_VBASE, ECONA_EHCI_SIZE, + ECONA_IRQ_EHCI + }, + { + "cfi", 0, + ECONA_CFI_VBASE, ECONA_CFI_SIZE, + 0 + }, + { + "ece", 0, + ECONA_IO_BASE + ECONA_NET_BASE, ECONA_NET_SIZE, + ECONA_IRQ_STATUS, + ECONA_IRQ_TSTC, ECONA_IRQ_FSRC, + ECONA_IRQ_TSQE, ECONA_IRQ_FSQF, + }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } +}; + +static void +econa_cpu_add_builtin_children(device_t dev, struct econa_softc *sc) +{ + int i; + struct cpu_devs *walker; + + for (i = 0, walker = econarm_devs; walker->name; i++, walker++) { + econa_add_child(dev, i, walker->name, walker->unit, + walker->mem_base, walker->mem_len, + walker->irq0,walker->irq1, walker->irq2, + walker->irq3, walker->irq4); + } + +} + +struct intc_trigger_t { + int mode; + int level; +}; + +static struct intc_trigger_t intc_trigger_table[] = { + {INTC_EDGE_TRIGGER, INTC_RISING_EDGE}, + {INTC_EDGE_TRIGGER, INTC_RISING_EDGE}, + {INTC_EDGE_TRIGGER, INTC_FALLING_EDGE}, + {INTC_EDGE_TRIGGER, INTC_RISING_EDGE}, + {INTC_TRIGGER_UNKNOWN, INTC_TRIGGER_UNKNOWN}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_LOW}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_LOW}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_HIGH}, + {INTC_TRIGGER_UNKNOWN, INTC_TRIGGER_UNKNOWN}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_HIGH}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_HIGH}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_HIGH}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_HIGH}, + {INTC_TRIGGER_UNKNOWN, INTC_TRIGGER_UNKNOWN}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_HIGH}, + {INTC_EDGE_TRIGGER, INTC_FALLING_EDGE}, + {INTC_TRIGGER_UNKNOWN, INTC_TRIGGER_UNKNOWN}, + {INTC_TRIGGER_UNKNOWN, INTC_TRIGGER_UNKNOWN}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_HIGH}, + {INTC_EDGE_TRIGGER, INTC_RISING_EDGE}, + {INTC_EDGE_TRIGGER, INTC_RISING_EDGE}, + {INTC_EDGE_TRIGGER, INTC_RISING_EDGE}, + {INTC_EDGE_TRIGGER, INTC_RISING_EDGE}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_LOW}, + {INTC_LEVEL_TRIGGER, INTC_ACTIVE_LOW}, +}; + +static inline uint32_t +read_4(struct econa_softc *sc, bus_size_t off) +{ + + return bus_space_read_4(sc->ec_st, sc->ec_sys_sh, off); +} + +static inline void +write_4(struct econa_softc *sc, bus_size_t off, uint32_t val) +{ + + return bus_space_write_4(sc->ec_st, sc->ec_sys_sh, off, val); +} + +static inline uint32_t +system_read_4(struct econa_softc *sc, bus_size_t off) +{ + + return bus_space_read_4(sc->ec_st, sc->ec_system_sh, off); +} + +static inline void +system_write_4(struct econa_softc *sc, bus_size_t off, uint32_t val) +{ + + return bus_space_write_4(sc->ec_st, sc->ec_system_sh, off, val); +} + + + +static inline void +econa_set_irq_mode(struct econa_softc * sc, unsigned int irq, + unsigned int mode) +{ + unsigned int val; + + if ((mode != INTC_LEVEL_TRIGGER) && (mode != INTC_EDGE_TRIGGER)) + return; + + val = read_4(sc, INTC_INTERRUPT_TRIGGER_MODE_REG_OFFSET); + + if (mode == INTC_LEVEL_TRIGGER) { + if (val & (1UL << irq)) { + val &= ~(1UL << irq); + write_4(sc, INTC_INTERRUPT_TRIGGER_MODE_REG_OFFSET, + val); + } + } else { + if (!(val & (1UL << irq))) { + val |= (1UL << irq); + write_4(sc, INTC_INTERRUPT_TRIGGER_MODE_REG_OFFSET, + val); + } + } +} + +/* + * Configure interrupt trigger level to be Active High/Low + * or Rising/Falling Edge + */ +static inline void +econa_set_irq_level(struct econa_softc * sc, + unsigned int irq, unsigned int level) +{ + unsigned int val; + + if ((level != INTC_ACTIVE_HIGH) && + (level != INTC_ACTIVE_LOW) && + (level != INTC_RISING_EDGE) && + (level != INTC_FALLING_EDGE)) { + return; + } + + val = read_4(sc, INTC_INTERRUPT_TRIGGER_LEVEL_REG_OFFSET); + + if ((level == INTC_ACTIVE_HIGH) || (level == INTC_RISING_EDGE)) { + if (val & (1UL << irq)) { + val &= ~(1UL << irq); + write_4(sc, INTC_INTERRUPT_TRIGGER_LEVEL_REG_OFFSET, + val); + } + } else { + if (!(val & (1UL << irq))) { + val |= (1UL << irq); + write_4(sc, INTC_INTERRUPT_TRIGGER_LEVEL_REG_OFFSET, + val); + } + } +} + +static void +get_system_clock(void) +{ + uint32_t sclock = system_read_4(econa_softc, SYSTEM_CLOCK); + + sclock = (sclock >> 6) & 0x03; + + switch (sclock) { + case 0: + CPU_clock = 175000000; + break; + case 1: + CPU_clock = 200000000; + break; + case 2: + CPU_clock = 225000000; + break; + case 3: + CPU_clock = 250000000; + break; + } + AHB_clock = CPU_clock >> 1; + APB_clock = AHB_clock >> 1; +} + +static int +econa_attach(device_t dev) +{ + struct econa_softc *sc = device_get_softc(dev); + int i; + + econa_softc = sc; + sc->ec_st = &econa_bs_tag; + sc->ec_sh = ECONA_IO_BASE; + sc->dev = dev; + if (bus_space_subregion(sc->ec_st, sc->ec_sh, ECONA_PIC_BASE, + ECONA_PIC_SIZE, &sc->ec_sys_sh) != 0) + panic("Unable to map IRQ registers"); + + if (bus_space_subregion(sc->ec_st, sc->ec_sh, ECONA_SYSTEM_BASE, + ECONA_SYSTEM_SIZE, &sc->ec_system_sh) != 0) + panic("Unable to map IRQ registers"); + + sc->ec_irq_rman.rm_type = RMAN_ARRAY; + sc->ec_irq_rman.rm_descr = "ECONA IRQs"; + sc->ec_mem_rman.rm_type = RMAN_ARRAY; + sc->ec_mem_rman.rm_descr = "ECONA Memory"; + if (rman_init(&sc->ec_irq_rman) != 0 || + rman_manage_region(&sc->ec_irq_rman, 0, 31) != 0) + panic("econa_attach: failed to set up IRQ rman"); + if (rman_init(&sc->ec_mem_rman) != 0 || + rman_manage_region(&sc->ec_mem_rman, 0, + ~0) != 0) + panic("econa_attach: failed to set up memory rman"); + + write_4(sc, INTC_INTERRUPT_CLEAR_EDGE_TRIGGER_REG_OFFSET, 0xffffffff); + + write_4(sc, INTC_INTERRUPT_MASK_REG_OFFSET, 0xffffffff); + + write_4(sc, INTC_FIQ_MODE_SELECT_REG_OFFSET, 0); + + /*initialize irq*/ + for (i = 0; i < 32; i++) { + if (intc_trigger_table[i].mode != INTC_TRIGGER_UNKNOWN) { + econa_set_irq_mode(sc,i, intc_trigger_table[i].mode); + econa_set_irq_level(sc, i, intc_trigger_table[i].level); + } + } + + get_system_clock(); + + econa_cpu_add_builtin_children(dev, sc); + + bus_generic_probe(dev); + bus_generic_attach(dev); + enable_interrupts(I32_bit | F32_bit); + + return (0); +} + +static struct resource * +econa_alloc_resource(device_t dev, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct econa_softc *sc = device_get_softc(dev); + struct resource_list_entry *rle; + struct econa_ivar *ivar = device_get_ivars(child); + struct resource_list *rl = &ivar->resources; + + if (device_get_parent(child) != dev) + return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child, + type, rid, start, end, count, flags)); + + rle = resource_list_find(rl, type, *rid); + if (rle == NULL) { + return (NULL); + } + if (rle->res) + panic("Resource rid %d type %d already in use", *rid, type); + if (start == 0UL && end == ~0UL) { + start = rle->start; + count = ulmax(count, rle->count); + end = ulmax(rle->end, start + count - 1); + } + switch (type) + { + case SYS_RES_IRQ: + rle->res = rman_reserve_resource(&sc->ec_irq_rman, + start, end, count, flags, child); + break; + case SYS_RES_MEMORY: + rle->res = rman_reserve_resource(&sc->ec_mem_rman, + start, end, count, flags, child); + if (rle->res != NULL) { + rman_set_bustag(rle->res, &econa_bs_tag); + rman_set_bushandle(rle->res, start); + } + break; + } + if (rle->res) { + rle->start = rman_get_start(rle->res); + rle->end = rman_get_end(rle->res); + rle->count = count; + rman_set_rid(rle->res, *rid); + } + return (rle->res); +} + +static struct resource_list * +econa_get_resource_list(device_t dev, device_t child) +{ + struct econa_ivar *ivar; + ivar = device_get_ivars(child); + return (&(ivar->resources)); +} + +static int +econa_release_resource(device_t dev, device_t child, int type, + int rid, struct resource *r) +{ + struct resource_list *rl; + struct resource_list_entry *rle; + + rl = econa_get_resource_list(dev, child); + if (rl == NULL) + return (EINVAL); + rle = resource_list_find(rl, type, rid); + if (rle == NULL) + return (EINVAL); + rman_release_resource(r); + rle->res = NULL; + return (0); +} + +static int +econa_setup_intr(device_t dev, device_t child, + struct resource *ires, int flags, driver_filter_t *filt, + driver_intr_t *intr, void *arg, void **cookiep) +{ + + if (rman_get_start(ires) == ECONA_IRQ_SYSTEM && filt == NULL) + panic("All system interrupt ISRs must be FILTER"); + + BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, + intr, arg, cookiep); + + arm_unmask_irq(rman_get_start(ires)); + + return (0); +} + +static int +econa_teardown_intr(device_t dev, device_t child, struct resource *res, + void *cookie) +{ + + return (BUS_TEARDOWN_INTR(device_get_parent(dev), child, res, cookie)); +} + +static int +econa_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + return (rman_activate_resource(r)); +} + +static int +econa_print_child(device_t dev, device_t child) +{ + struct econa_ivar *ivars; + struct resource_list *rl; + int retval = 0; + + ivars = device_get_ivars(child); + rl = &ivars->resources; + + retval += bus_print_child_header(dev, child); + + retval += resource_list_print_type(rl, "port", SYS_RES_IOPORT, "%#lx"); + retval += resource_list_print_type(rl, "mem", SYS_RES_MEMORY, "%#lx"); + retval += resource_list_print_type(rl, "irq", SYS_RES_IRQ, "%ld"); + if (device_get_flags(dev)) + retval += printf(" flags %#x", device_get_flags(dev)); + + retval += bus_print_child_footer(dev, child); + + return (retval); +} + +void +arm_mask_irq(uintptr_t nb) +{ + unsigned int value; + + value = read_4(econa_softc,INTC_INTERRUPT_MASK_REG_OFFSET) | 1< + * Copyright (c) 1994-1998 Mark Brinicombe. + * Copyright (c) 1994 Brini. + * All rights reserved. + * + * This code is derived from software written for Brini by Mark Brinicombe + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Brini. + * 4. The name of the company nor the name of the author may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRINI ``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 BRINI 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 "opt_msgbuf.h" + +#include +__FBSDID("$FreeBSD$"); + +#define _ARM32_BUS_DMA_PRIVATE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "econa_reg.h" + +/* Page table for mapping proc0 zero page */ +#define KERNEL_PT_SYS 0 +#define KERNEL_PT_KERN 1 +#define KERNEL_PT_KERN_NUM 22 +/* L2 table for mapping after kernel */ +#define KERNEL_PT_AFKERNEL KERNEL_PT_KERN + KERNEL_PT_KERN_NUM +#define KERNEL_PT_AFKERNEL_NUM 5 + +/* this should be evenly divisable by PAGE_SIZE / L2_TABLE_SIZE_REAL (or 4) */ +#define NUM_KERNEL_PTS (KERNEL_PT_AFKERNEL + KERNEL_PT_AFKERNEL_NUM) + +/* Define various stack sizes in pages */ +#define IRQ_STACK_SIZE 1 +#define ABT_STACK_SIZE 1 +#define UND_STACK_SIZE 1 + +extern u_int data_abort_handler_address; +extern u_int prefetch_abort_handler_address; +extern u_int undefined_handler_address; + +struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; + +extern void *_end; + +extern int *end; + +struct pcpu __pcpu; +struct pcpu *pcpup = &__pcpu; + +/* Physical and virtual addresses for some global pages */ + +vm_paddr_t phys_avail[10]; +vm_paddr_t dump_avail[4]; +vm_offset_t physical_pages; + +struct pv_addr systempage; +struct pv_addr msgbufpv; +struct pv_addr irqstack; +struct pv_addr undstack; +struct pv_addr abtstack; +struct pv_addr kernelstack; + +static void *boot_arg1; +static void *boot_arg2; + +static struct trapframe proc0_tf; + +/* Static device mappings. */ +static const struct pmap_devmap econa_devmap[] = { + { + /* + * This maps DDR SDRAM + */ + ECONA_SDRAM_BASE, /*virtual*/ + ECONA_SDRAM_BASE, /*physical*/ + ECONA_SDRAM_SIZE, /*size*/ + VM_PROT_READ|VM_PROT_WRITE, + PTE_NOCACHE, + }, + /* + * Map the on-board devices VA == PA so that we can access them + * with the MMU on or off. + */ + { + /* + * This maps the interrupt controller, the UART + * and the timer. + */ + ECONA_IO_BASE, /*virtual*/ + ECONA_IO_BASE, /*physical*/ + ECONA_IO_SIZE, /*size*/ + VM_PROT_READ|VM_PROT_WRITE, + PTE_NOCACHE, + }, + { + /* + * OHCI + EHCI + */ + ECONA_OHCI_VBASE, /*virtual*/ + ECONA_OHCI_PBASE, /*physical*/ + ECONA_USB_SIZE, /*size*/ + VM_PROT_READ|VM_PROT_WRITE, + PTE_NOCACHE, + }, + { + /* + * CFI + */ + ECONA_CFI_VBASE, /*virtual*/ + ECONA_CFI_PBASE, /*physical*/ + ECONA_CFI_SIZE, + VM_PROT_READ|VM_PROT_WRITE, + PTE_NOCACHE, + }, + { + 0, + 0, + 0, + 0, + 0, + } +}; + + +void * +initarm(void *arg, void *arg2) +{ + struct pv_addr kernel_l1pt; + volatile uint32_t * ddr = (uint32_t *)0x4000000C; + int loop, i; + u_int l1pagetable; + vm_offset_t afterkern; + vm_offset_t freemempos; + vm_offset_t lastaddr; + uint32_t memsize; + int mem_info; + + + boot_arg1 = arg; + boot_arg2 = arg2; + boothowto = RB_VERBOSE; + + set_cpufuncs(); + lastaddr = fake_preload_metadata(); + pcpu_init(pcpup, 0, sizeof(struct pcpu)); + PCPU_SET(curthread, &thread0); + + + freemempos = (lastaddr + PAGE_MASK) & ~PAGE_MASK; + /* Define a macro to simplify memory allocation */ +#define valloc_pages(var, np) \ + alloc_pages((var).pv_va, (np)); \ + (var).pv_pa = (var).pv_va + (KERNPHYSADDR - KERNVIRTADDR); + +#define alloc_pages(var, np) \ + (var) = freemempos; \ + freemempos += (np * PAGE_SIZE); \ + memset((char *)(var), 0, ((np) * PAGE_SIZE)); + + while (((freemempos - L1_TABLE_SIZE) & (L1_TABLE_SIZE - 1)) != 0) + freemempos += PAGE_SIZE; + valloc_pages(kernel_l1pt, L1_TABLE_SIZE / PAGE_SIZE); + for (loop = 0; loop < NUM_KERNEL_PTS; ++loop) { + if (!(loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL))) { + valloc_pages(kernel_pt_table[loop], + L2_TABLE_SIZE / PAGE_SIZE); + } else { + kernel_pt_table[loop].pv_va = freemempos - + (loop % (PAGE_SIZE / L2_TABLE_SIZE_REAL)) * + L2_TABLE_SIZE_REAL; + kernel_pt_table[loop].pv_pa = + kernel_pt_table[loop].pv_va - KERNVIRTADDR + + KERNPHYSADDR; + } + i++; + } + /* + * Allocate a page for the system page mapped to V0x00000000 + * This page will just contain the system vectors and can be + * shared by all processes. + */ + valloc_pages(systempage, 1); + + /* Allocate stacks for all modes */ + valloc_pages(irqstack, IRQ_STACK_SIZE); + valloc_pages(abtstack, ABT_STACK_SIZE); + valloc_pages(undstack, UND_STACK_SIZE); + valloc_pages(kernelstack, KSTACK_PAGES); + valloc_pages(msgbufpv, round_page(MSGBUF_SIZE) / PAGE_SIZE); + + /* + * Now we start construction of the L1 page table + * We start by mapping the L2 page tables into the L1. + * This means that we can replace L1 mappings later on if necessary + */ + l1pagetable = kernel_l1pt.pv_va; + + /* Map the L2 pages tables in the L1 page table */ + pmap_link_l2pt(l1pagetable, ARM_VECTORS_HIGH, + &kernel_pt_table[KERNEL_PT_SYS]); + for (i = 0; i < KERNEL_PT_KERN_NUM; i++) + pmap_link_l2pt(l1pagetable, KERNBASE + i * L1_S_SIZE, + &kernel_pt_table[KERNEL_PT_KERN + i]); + pmap_map_chunk(l1pagetable, KERNBASE, PHYSADDR, + (((uint32_t)lastaddr - KERNBASE) + PAGE_SIZE) & ~(PAGE_SIZE - 1), + VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + afterkern = round_page((lastaddr + L1_S_SIZE) & ~(L1_S_SIZE - 1)); + for (i = 0; i < KERNEL_PT_AFKERNEL_NUM; i++) { + pmap_link_l2pt(l1pagetable, afterkern + i * L1_S_SIZE, + &kernel_pt_table[KERNEL_PT_AFKERNEL + i]); + } + + /* Map the vector page. */ + pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH, systempage.pv_pa, + VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + + + /* Map the stack pages */ + pmap_map_chunk(l1pagetable, irqstack.pv_va, irqstack.pv_pa, + IRQ_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + pmap_map_chunk(l1pagetable, abtstack.pv_va, abtstack.pv_pa, + ABT_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + pmap_map_chunk(l1pagetable, undstack.pv_va, undstack.pv_pa, + UND_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + pmap_map_chunk(l1pagetable, kernelstack.pv_va, kernelstack.pv_pa, + KSTACK_PAGES * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + + pmap_map_chunk(l1pagetable, kernel_l1pt.pv_va, kernel_l1pt.pv_pa, + L1_TABLE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE); + pmap_map_chunk(l1pagetable, msgbufpv.pv_va, msgbufpv.pv_pa, + MSGBUF_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + + for (loop = 0; loop < NUM_KERNEL_PTS; ++loop) { + pmap_map_chunk(l1pagetable, kernel_pt_table[loop].pv_va, + kernel_pt_table[loop].pv_pa, L2_TABLE_SIZE, + VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE); + } + + pmap_devmap_bootstrap(l1pagetable, econa_devmap); + cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT); + setttb(kernel_l1pt.pv_pa); + cpu_tlb_flushID(); + cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)); + cninit(); + mem_info = ((*ddr) >> 4) & 0x3; + memsize = (8<pcb_flags = 0; + thread0.td_frame = &proc0_tf; + pcpup->pc_curpcb = thread0.td_pcb; + + arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL); + + pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1); + + /* + * ARM_USE_SMALL_ALLOC uses dump_avail, so it must be filled before + * calling pmap_bootstrap. + */ + dump_avail[0] = PHYSADDR; + dump_avail[1] = PHYSADDR + memsize; + dump_avail[2] = 0; + dump_avail[3] = 0; + + pmap_bootstrap(freemempos, + KERNVIRTADDR + 3 * memsize, + &kernel_l1pt); + + msgbufp = (void*)msgbufpv.pv_va; + msgbufinit(msgbufp, MSGBUF_SIZE); + + mutex_init(); + + i = 0; +#if PHYSADDR != KERNPHYSADDR + phys_avail[i++] = PHYSADDR; + phys_avail[i++] = KERNPHYSADDR; +#endif + phys_avail[i++] = virtual_avail - KERNVIRTADDR + KERNPHYSADDR; + + phys_avail[i++] = PHYSADDR + memsize; + phys_avail[i++] = 0; + phys_avail[i++] = 0; + /* Do basic tuning, hz etc */ + init_param1(); + init_param2(physmem); + kdb_init(); + + return ((void *)(kernelstack.pv_va + USPACE_SVC_STACK_TOP - + sizeof(struct pcb))); +} diff --git a/sys/arm/econa/econa_reg.h b/sys/arm/econa/econa_reg.h new file mode 100644 index 000000000000..06501943befc --- /dev/null +++ b/sys/arm/econa/econa_reg.h @@ -0,0 +1,180 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho + * 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 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 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$ + */ +#ifndef _ARM_ECONA_REG_H +#define _ARM_ECONA_REG_H + +#define ECONA_SRAM_SIZE 0x10000000 +#define ECONA_DRAM_BASE 0x00000000 /* DRAM (via DDR Control Module) */ + +#define ECONA_SDRAM_BASE 0x40000000 +#define ECONA_SDRAM_SIZE 0x1000000 + + +#define ECONA_IO_BASE 0x70000000 +#define ECONA_IO_SIZE 0x0E000000 +#define ECONA_PIC_BASE 0x0D000000 +#define ECONA_PIC_SIZE 0x01000000 + +#define ECONA_UART_BASE 0x08000000 +#define ECONA_UART_SIZE 0x01000000 +#define ECONA_IRQ_UART 0xA + +#define ECONA_TIMER_BASE 0x09000000 +#define ECONA_TIMER_SIZE 0x01000000 +#define ECONA_IRQ_TIMER_1 0 +#define ECONA_IRQ_TIMER_2 1 +#define ECONA_IRQ_OHCI 23 +#define ECONA_IRQ_EHCI 24 + +#define ECONA_NET_BASE 0x00000000 + +#define ECONA_SYSTEM_BASE 0x07000000 +#define ECONA_SYSTEM_SIZE 0x01000000 + +#define ECONA_NET_SIZE 0x01000000 + +#define ECONA_CFI_PBASE 0x10000000 +#define ECONA_CFI_VBASE 0xD0000000 +#define ECONA_CFI_SIZE 0x10000000 + +#define ECONA_IRQ_STATUS 18 +#define ECONA_IRQ_TSTC 19 +#define ECONA_IRQ_FSRC 20 +#define ECONA_IRQ_TSQE 21 +#define ECONA_IRQ_FSQF 22 + +#define ECONA_IRQ_SYSTEM 0 + +#define ECONA_EHCI_PBASE 0xC8000000 +#define ECONA_EHCI_VBASE 0xF8000000 +#define ECONA_EHCI_SIZE 0x8000000 + +#define ECONA_OHCI_PBASE 0xC0000000 +#define ECONA_OHCI_VBASE 0xF0000000 +#define ECONA_OHCI_SIZE 0x8000000 + +#define ECONA_USB_SIZE 0xf000000 + +/*Interrupt controller*/ +#define INTC_LEVEL_TRIGGER 0 +#define INTC_EDGE_TRIGGER 1 +#define INTC_ACTIVE_HIGH 0 +#define INTC_ACTIVE_LOW 1 +/* + * define rising/falling edge for edge trigger mode + */ +#define INTC_RISING_EDGE 0 +#define INTC_FALLING_EDGE 1 + +#define INTC_INTERRUPT_SOURCE_REG_OFFSET 0x00 +#define INTC_INTERRUPT_MASK_REG_OFFSET 0x04 +#define INTC_INTERRUPT_CLEAR_EDGE_TRIGGER_REG_OFFSET 0x08 +#define INTC_INTERRUPT_TRIGGER_MODE_REG_OFFSET 0x0C +#define INTC_INTERRUPT_TRIGGER_LEVEL_REG_OFFSET 0x10 +#define INTC_INTERRUPT_STATUS_REG_OFFSET 0x14 +#define INTC_FIQ_MODE_SELECT_REG_OFFSET 0x18 +#define INTC_SOFTWARE_INTERRUPT_REG_OFFSET 0x1C + + +/* + * define rising/falling edge for edge trigger mode + */ +#define INTC_RISING_EDGE 0 +#define INTC_FALLING_EDGE 1 + + +#define TIMER_TM1_COUNTER_REG 0x00 +#define TIMER_TM1_LOAD_REG 0x04 +#define TIMER_TM1_MATCH1_REG 0x08 +#define TIMER_TM1_MATCH2_REG 0x0C + +#define TIMER_TM2_COUNTER_REG 0x10 +#define TIMER_TM2_LOAD_REG 0x14 +#define TIMER_TM2_MATCH1_REG 0x18 +#define TIMER_TM2_MATCH2_REG 0x1C + +#define TIMER_TM_CR_REG 0x30 +#define TIMER_TM_INTR_STATUS_REG 0x34 +#define TIMER_TM_INTR_MASK_REG 0x38 + +#define TIMER_TM_REVISION_REG 0x3C + + +#define INTC_TIMER1_BIT_INDEX 0 + +#define TIMER1_UP_DOWN_COUNT (1<<9) +#define TIMER2_UP_DOWN_COUNT (1<<10) + +#define TIMER1_MATCH1_INTR (1<<0) +#define TIMER1_MATCH2_INTR (1<<1) +#define TIMER1_OVERFLOW_INTR (1<<2) + + +#define TIMER2_MATCH1_INTR (1<<3) +#define TIMER2_MATCH2_INTR (1<<4) +#define TIMER2_OVERFLOW_INTR (1<<5) + + +#define TIMER_CLOCK_SOURCE_PCLK 0 +#define TIMER_CLOCK_SOURCE_EXT_CLK 1 + +/* + * define interrupt trigger mode + */ +#define INTC_LEVEL_TRIGGER 0 +#define INTC_EDGE_TRIGGER 1 + + +#define INTC_TRIGGER_UNKNOWN -1 + +#define TIMER1_OVERFLOW_INTERRUPT (1<<2) +#define TIMER2_OVERFLOW_INTERRUPT (1<<5) +#define TIMER_INTERRUPT_STATUS_REG 0x34 + + +#define TIMER1_ENABLE (1<<0) +#define TIMER1_CLOCK_SOURCE (1<<1) +#define TIMER1_OVERFLOW_ENABLE (1<<2) + + +#define TIMER2_ENABLE (1<<3) +#define TIMER2_CLOCK_SOURCE (1<<4) +#define TIMER2_OVERFLOW_ENABLE (1<<5) + + +#define TIMER_1 1 + +#define EC_UART_CLOCK 14769200 +#define EC_UART_REGSHIFT 2 + +#define SYSTEM_CLOCK 0x14 +#define RESET_CONTROL 0x4 +#define GLOBAL_RESET 0x1 +#define NET_INTERFACE_RESET (0x1 << 4) + +#endif diff --git a/sys/arm/econa/econa_var.h b/sys/arm/econa/econa_var.h new file mode 100644 index 000000000000..044dcb7fbe07 --- /dev/null +++ b/sys/arm/econa/econa_var.h @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho . + * 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 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 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$ + */ + +#ifndef _ARM_ECONA_VAR_H +#define _ARM_ECONA_VAR_H + +extern bus_space_tag_t obio_tag; + +struct econa_softc { + device_t dev; + bus_space_tag_t ec_st; + bus_space_handle_t ec_sh; + bus_space_handle_t ec_sys_sh; + bus_space_handle_t ec_system_sh; + struct rman ec_irq_rman; + struct rman ec_mem_rman; +}; + +struct econa_ivar { + struct resource_list resources; +}; + +void power_on_network_interface (void); +unsigned int get_tclk (void); + + +#endif diff --git a/sys/arm/econa/ehci_ebus.c b/sys/arm/econa/ehci_ebus.c new file mode 100644 index 000000000000..7b492258200d --- /dev/null +++ b/sys/arm/econa/ehci_ebus.c @@ -0,0 +1,300 @@ +/*- + * Copyright (C) 2009 Yohanes Nugroho + * based on ehci_mbus.c + * Copyright (C) 2008 MARVELL INTERNATIONAL LTD. + * 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. + * 3. Neither the name of MARVELL nor the names of contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY 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 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 +__FBSDID("$FreeBSD$"); + +#include "opt_bus.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + + +static device_attach_t ehci_ebus_attach; +static device_detach_t ehci_ebus_detach; +static device_shutdown_t ehci_ebus_shutdown; +static device_suspend_t ehci_ebus_suspend; +static device_resume_t ehci_ebus_resume; + + +static void *ih_err; + +#define EHCI_HC_DEVSTR "CNS11XX USB EHCI" +#define USB_BRIDGE_INTR_MASK 0x214 + +static int +ehci_ebus_suspend(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + int err; + + err = bus_generic_suspend(self); + if (err) + return (err); + ehci_suspend(sc); + return (0); +} + +static int +ehci_ebus_resume(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + + ehci_resume(sc); + + bus_generic_resume(self); + + return (0); +} + +static int +ehci_ebus_shutdown(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + int err; + + err = bus_generic_shutdown(self); + if (err) + return (err); + ehci_shutdown(sc); + + return (0); +} + +static int +ehci_ebus_probe(device_t self) +{ + + device_set_desc(self, EHCI_HC_DEVSTR); + + return (BUS_PROBE_DEFAULT); +} + +static int +ehci_ebus_attach(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + bus_space_handle_t bsh; + int err; + int rid; + + /* initialise some bus fields */ + sc->sc_bus.parent = self; + sc->sc_bus.devices = sc->sc_devices; + sc->sc_bus.devices_max = EHCI_MAX_DEVICES; + + /* get all DMA memory */ + if (usb_bus_mem_alloc_all(&sc->sc_bus, + USB_GET_DMA_TAG(self), &ehci_iterate_hw_softc)) { + return (ENOMEM); + } + + sc->sc_bus.usbrev = USB_REV_2_0; + + rid = 0; + sc->sc_io_res = bus_alloc_resource_any(self, SYS_RES_MEMORY, + &rid, RF_ACTIVE); + if (!sc->sc_io_res) { + device_printf(self, "Could not map memory\n"); + goto error; + } + sc->sc_io_tag = rman_get_bustag(sc->sc_io_res); + bsh = rman_get_bushandle(sc->sc_io_res); + + /*magic, undocumented initialization*/ + bus_space_write_4((sc)->sc_io_tag, bsh, 0x04, 0x106); + + bus_space_write_4((sc)->sc_io_tag, bsh, 0x40, (3 << 5)|0x2000); + + DELAY(1000); + + sc->sc_io_size = 4096; + + if (bus_space_subregion(sc->sc_io_tag, bsh, 0x4000000, + sc->sc_io_size, &sc->sc_io_hdl) != 0) + panic("%s: unable to subregion USB host registers", + device_get_name(self)); + + rid = 0; + sc->sc_irq_res = bus_alloc_resource_any(self, SYS_RES_IRQ, &rid, + RF_SHAREABLE | RF_ACTIVE); + if (sc->sc_irq_res == NULL) { + device_printf(self, "Could not allocate irq\n"); + ehci_ebus_detach(self); + return (ENXIO); + } + + sc->sc_bus.bdev = device_add_child(self, "usbus", -1); + if (!sc->sc_bus.bdev) { + device_printf(self, "Could not add USB device\n"); + goto error; + } + device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus); + device_set_desc(sc->sc_bus.bdev, EHCI_HC_DEVSTR); + + sprintf(sc->sc_vendor, "Cavium"); + + err = bus_setup_intr(self,sc->sc_irq_res, + INTR_TYPE_BIO | INTR_MPSAFE, NULL, + (driver_intr_t *)ehci_interrupt, sc, + &sc->sc_intr_hdl); + if (err) { + device_printf(self, "Could not setup error irq, %d\n", err); + ih_err = NULL; + goto error; + } + + err = ehci_init(sc); + if (!err) { + err = device_probe_and_attach(sc->sc_bus.bdev); + } + if (err) { + device_printf(self, "USB init failed err=%d\n", err); + goto error; + } + return (0); + +error: + ehci_ebus_detach(self); + return (ENXIO); +} + +static int +ehci_ebus_detach(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + device_t bdev; + int err; + + if (sc->sc_bus.bdev) { + bdev = sc->sc_bus.bdev; + device_detach(bdev); + device_delete_child(self, bdev); + } + /* during module unload there are lots of children leftover */ + device_delete_all_children(self); + + /* + * disable interrupts that might have been switched on in ehci_init + */ + if (sc->sc_io_res) { + EWRITE4(sc, EHCI_USBINTR, 0); + EWRITE4(sc, USB_BRIDGE_INTR_MASK, 0); + } + if (sc->sc_irq_res && sc->sc_intr_hdl) { + /* + * only call ehci_detach() after ehci_init() + */ + ehci_detach(sc); + + err = bus_teardown_intr(self, sc->sc_irq_res, sc->sc_intr_hdl); + + if (err) + /* XXX or should we panic? */ + device_printf(self, "Could not tear down irq, %d\n", + err); + sc->sc_intr_hdl = NULL; + } + if (sc->sc_irq_res) { + bus_release_resource(self, SYS_RES_IRQ, 1, sc->sc_irq_res); + sc->sc_irq_res = NULL; + } + if (sc->sc_io_res) { + bus_release_resource(self, SYS_RES_MEMORY, 0, + sc->sc_io_res); + sc->sc_io_res = NULL; + } + usb_bus_mem_free_all(&sc->sc_bus, &ehci_iterate_hw_softc); + + return (0); +} + +static device_method_t ehci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ehci_ebus_probe), + DEVMETHOD(device_attach, ehci_ebus_attach), + DEVMETHOD(device_detach, ehci_ebus_detach), + DEVMETHOD(device_suspend, ehci_ebus_suspend), + DEVMETHOD(device_resume, ehci_ebus_resume), + DEVMETHOD(device_shutdown, ehci_ebus_shutdown), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + + {0, 0} +}; + +static driver_t ehci_driver = { + "ehci", + ehci_methods, + sizeof(ehci_softc_t), +}; + +static devclass_t ehci_devclass; + +DRIVER_MODULE(ehci, econaarm, ehci_driver, ehci_devclass, 0, 0); +MODULE_DEPEND(ehci, usb, 1, 1, 1); diff --git a/sys/arm/econa/files.econa b/sys/arm/econa/files.econa new file mode 100644 index 000000000000..1adb9c1ca81c --- /dev/null +++ b/sys/arm/econa/files.econa @@ -0,0 +1,14 @@ +# $FreeBSD$ +arm/arm/cpufunc_asm_fa526.S standard +arm/econa/econa_machdep.c standard +arm/econa/econa.c standard +arm/econa/timer.c standard +arm/econa/uart_bus_ec.c optional uart +arm/econa/uart_cpu_ec.c optional uart +dev/uart/uart_dev_ns8250.c optional uart +arm/arm/irq_dispatch.S standard +arm/arm/bus_space_generic.c standard +arm/econa/ehci_ebus.c standard ehci +arm/econa/ohci_ec.c standard ohci +arm/econa/if_ece.c standard +arm/econa/cfi_bus_econa.c optional cfi diff --git a/sys/arm/econa/if_ece.c b/sys/arm/econa/if_ece.c new file mode 100644 index 000000000000..136860c4aa09 --- /dev/null +++ b/sys/arm/econa/if_ece.c @@ -0,0 +1,1948 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho + * 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 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef INET +#include +#include +#include +#include +#endif + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +/* "device miibus" required. See GENERIC if you get errors here. */ +#include "miibus_if.h" + +static uint8_t +vlan0_mac[ETHER_ADDR_LEN] = {0x00, 0xaa, 0xbb, 0xcc, 0xdd, 0x19}; + +/* + * Boot loader expects the hardware state to be the same when we + * restart the device (warm boot), so we need to save the initial + * config values. + */ +int initial_switch_config; +int initial_cpu_config; +int initial_port0_config; +int initial_port1_config; + +static inline uint32_t +read_4(struct ece_softc *sc, bus_size_t off) +{ + + return (bus_read_4(sc->mem_res, off)); +} + +static inline void +write_4(struct ece_softc *sc, bus_size_t off, uint32_t val) +{ + + bus_write_4(sc->mem_res, off, val); +} + +#define ECE_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) +#define ECE_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) +#define ECE_LOCK_INIT(_sc) \ + mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), \ + MTX_NETWORK_LOCK, MTX_DEF) + +#define ECE_TXLOCK(_sc) mtx_lock(&(_sc)->sc_mtx_tx) +#define ECE_TXUNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx_tx) +#define ECE_TXLOCK_INIT(_sc) \ + mtx_init(&_sc->sc_mtx_tx, device_get_nameunit(_sc->dev), \ + "ECE TX Lock", MTX_DEF) + +#define ECE_CLEANUPLOCK(_sc) mtx_lock(&(_sc)->sc_mtx_cleanup) +#define ECE_CLEANUPUNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx_cleanup) +#define ECE_CLEANUPLOCK_INIT(_sc) \ + mtx_init(&_sc->sc_mtx_cleanup, device_get_nameunit(_sc->dev), \ + "ECE cleanup Lock", MTX_DEF) + +#define ECE_RXLOCK(_sc) mtx_lock(&(_sc)->sc_mtx_rx) +#define ECE_RXUNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx_rx) +#define ECE_RXLOCK_INIT(_sc) \ + mtx_init(&_sc->sc_mtx_rx, device_get_nameunit(_sc->dev), \ + "ECE RX Lock", MTX_DEF) + +#define ECE_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); +#define ECE_TXLOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx_tx); +#define ECE_RXLOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx_rx); +#define ECE_CLEANUPLOCK_DESTROY(_sc) \ + mtx_destroy(&_sc->sc_mtx_cleanup); + +#define ECE_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); +#define ECE_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); + +static devclass_t ece_devclass; + +/* ifnet entry points */ + +static void eceinit_locked(void *); +static void ecestart_locked(struct ifnet *); + +static void eceinit(void *); +static void ecestart(struct ifnet *); +static void ecestop(struct ece_softc *); +static int eceioctl(struct ifnet * ifp, u_long, caddr_t); + +/* bus entry points */ + +static int ece_probe(device_t dev); +static int ece_attach(device_t dev); +static int ece_detach(device_t dev); +static void ece_intr(void *); +static void ece_intr_qf(void *); +static void ece_intr_status(void *xsc); + +/* helper routines */ +static int ece_activate(device_t dev); +static void ece_deactivate(device_t dev); +static int ece_ifmedia_upd(struct ifnet *ifp); +static void ece_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr); +static int ece_get_mac(struct ece_softc *sc, u_char *eaddr); +static void ece_set_mac(struct ece_softc *sc, u_char *eaddr); +static int configure_cpu_port(struct ece_softc *sc); +static int configure_lan_port(struct ece_softc *sc, int phy_type); +static void set_pvid(struct ece_softc *sc, int port0, int port1, int cpu); +static void set_vlan_vid(struct ece_softc *sc, int vlan); +static void set_vlan_member(struct ece_softc *sc, int vlan); +static void set_vlan_tag(struct ece_softc *sc, int vlan); +static int hardware_init(struct ece_softc *sc); +static void ece_intr_rx_locked(struct ece_softc *sc, int count); + +static void ece_free_desc_dma_tx(struct ece_softc *sc); +static void ece_free_desc_dma_rx(struct ece_softc *sc); + +static void ece_intr_task(void *arg, int pending __unused); +static void ece_tx_task(void *arg, int pending __unused); +static void ece_cleanup_task(void *arg, int pending __unused); + +static int ece_allocate_dma(struct ece_softc *sc); + +static void ece_intr_tx(void *xsc); + +static void clear_mac_entries(struct ece_softc *ec, int include_this_mac); + +static uint32_t read_mac_entry(struct ece_softc *ec, + uint8_t *mac_result, + int first); + +/*PHY related functions*/ +static inline int +phy_read(struct ece_softc *sc, int phy, int reg) +{ + int val; + int ii; + int status; + + write_4(sc, PHY_CONTROL, PHY_RW_OK); + write_4(sc, PHY_CONTROL, + (PHY_ADDRESS(phy)|PHY_READ_COMMAND | + PHY_REGISTER(reg))); + + for (ii = 0; ii < 0x1000; ii++) { + status = read_4(sc, PHY_CONTROL); + if (status & PHY_RW_OK) { + /* Clear the rw_ok status, and clear other + * bits value. */ + write_4(sc, PHY_CONTROL, PHY_RW_OK); + val = PHY_GET_DATA(status); + return (val); + } + } + return (0); +} + +static inline void +phy_write(struct ece_softc *sc, int phy, int reg, int data) +{ + int ii; + + write_4(sc, PHY_CONTROL, PHY_RW_OK); + write_4(sc, PHY_CONTROL, + PHY_ADDRESS(phy) | PHY_REGISTER(reg) | + PHY_WRITE_COMMAND | PHY_DATA(data)); + for (ii = 0; ii < 0x1000; ii++) { + if (read_4(sc, PHY_CONTROL) & PHY_RW_OK) { + /* Clear the rw_ok status, and clear other + * bits value. + */ + write_4(sc, PHY_CONTROL, PHY_RW_OK); + return; + } + } +} + +static int get_phy_type(struct ece_softc *sc) +{ + uint16_t phy0_id = 0, phy1_id = 0; + + /* + * Use SMI (MDC/MDIO) to read Link Partner's PHY Identifier + * Register 1. + */ + phy0_id = phy_read(sc, 0, 0x2); + phy1_id = phy_read(sc, 1, 0x2); + + if ((phy0_id == 0xFFFF) && (phy1_id == 0x000F)) + return (ASIX_GIGA_PHY); + else if ((phy0_id == 0x0243) && (phy1_id == 0x0243)) + return (TWO_SINGLE_PHY); + else if ((phy0_id == 0xFFFF) && (phy1_id == 0x0007)) + return (VSC8601_GIGA_PHY); + else if ((phy0_id == 0x0243) && (phy1_id == 0xFFFF)) + return (IC_PLUS_PHY); + + return (NOT_FOUND_PHY); +} + +static int +ece_probe(device_t dev) +{ + + device_set_desc(dev, "Econa Ethernet Controller"); + return (0); +} + + +static int +ece_attach(device_t dev) +{ + struct ece_softc *sc; + struct ifnet *ifp = NULL; + struct sysctl_ctx_list *sctx; + struct sysctl_oid *soid; + u_char eaddr[ETHER_ADDR_LEN]; + int err; + int i, rid; + uint32_t rnd; + + err = 0; + + sc = device_get_softc(dev); + + sc->dev = dev; + + rid = 0; + sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (sc->mem_res == NULL) + goto out; + + power_on_network_interface(); + + rid = 0; + sc->irq_res_status = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (sc->irq_res_status == NULL) + goto out; + + rid = 1; + /*TSTC: Fm-Switch-Tx-Complete*/ + sc->irq_res_tx = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (sc->irq_res_tx == NULL) + goto out; + + rid = 2; + /*FSRC: Fm-Switch-Rx-Complete*/ + sc->irq_res_rec = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (sc->irq_res_rec == NULL) + goto out; + + rid = 4; + /*FSQF: Fm-Switch-Queue-Full*/ + sc->irq_res_qf = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (sc->irq_res_qf == NULL) + goto out; + + err = ece_activate(dev); + if (err) + goto out; + + /* Sysctls */ + sctx = device_get_sysctl_ctx(dev); + soid = device_get_sysctl_tree(dev); + + ECE_LOCK_INIT(sc); + + callout_init_mtx(&sc->tick_ch, &sc->sc_mtx, 0); + + if ((err = ece_get_mac(sc, eaddr)) != 0) { + /* No MAC address configured. Generate the random one. */ + if (bootverbose) + device_printf(dev, + "Generating random ethernet address.\n"); + rnd = arc4random(); + + /*from if_ae.c/if_ate.c*/ + /* + * Set OUI to convenient locally assigned address. 'b' + * is 0x62, which has the locally assigned bit set, and + * the broadcast/multicast bit clear. + */ + eaddr[0] = 'b'; + eaddr[1] = 's'; + eaddr[2] = 'd'; + eaddr[3] = (rnd >> 16) & 0xff; + eaddr[4] = (rnd >> 8) & 0xff; + eaddr[5] = rnd & 0xff; + + for (i = 0; i < ETHER_ADDR_LEN; i++) + eaddr[i] = vlan0_mac[i]; + } + ece_set_mac(sc, eaddr); + sc->ifp = ifp = if_alloc(IFT_ETHER); + if (mii_phy_probe(dev, &sc->miibus, ece_ifmedia_upd, + ece_ifmedia_sts)) { + device_printf(dev, "Cannot find my PHY.\n"); + err = ENXIO; + goto out; + } + ifp->if_softc = sc; + if_initname(ifp, device_get_name(dev), device_get_unit(dev)); + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + + ifp->if_capabilities = IFCAP_HWCSUM; + + ifp->if_hwassist = (CSUM_IP | CSUM_TCP | CSUM_UDP); + ifp->if_capenable = ifp->if_capabilities; + ifp->if_start = ecestart; + ifp->if_ioctl = eceioctl; + ifp->if_init = eceinit; + ifp->if_snd.ifq_drv_maxlen = ECE_MAX_TX_BUFFERS - 1; + IFQ_SET_MAXLEN(&ifp->if_snd, ECE_MAX_TX_BUFFERS - 1); + IFQ_SET_READY(&ifp->if_snd); + + /* Create local taskq. */ + + TASK_INIT(&sc->sc_intr_task, 0, ece_intr_task, sc); + TASK_INIT(&sc->sc_tx_task, 1, ece_tx_task, ifp); + TASK_INIT(&sc->sc_cleanup_task, 2, ece_cleanup_task, sc); + sc->sc_tq = taskqueue_create_fast("ece_taskq", M_WAITOK, + taskqueue_thread_enqueue, + &sc->sc_tq); + if (sc->sc_tq == NULL) { + device_printf(sc->dev, "could not create taskqueue\n"); + goto out; + } + + ether_ifattach(ifp, eaddr); + + /* + * Activate interrupts + */ + err = bus_setup_intr(dev, sc->irq_res_rec, INTR_TYPE_NET | INTR_MPSAFE, + NULL, ece_intr, sc, &sc->intrhand); + if (err) { + ether_ifdetach(ifp); + ECE_LOCK_DESTROY(sc); + goto out; + } + + err = bus_setup_intr(dev, sc->irq_res_status, + INTR_TYPE_NET | INTR_MPSAFE, + NULL, ece_intr_status, sc, &sc->intrhand_status); + if (err) { + ether_ifdetach(ifp); + ECE_LOCK_DESTROY(sc); + goto out; + } + + err = bus_setup_intr(dev, sc->irq_res_qf, INTR_TYPE_NET | INTR_MPSAFE, + NULL,ece_intr_qf, sc, &sc->intrhand_qf); + + if (err) { + ether_ifdetach(ifp); + ECE_LOCK_DESTROY(sc); + goto out; + } + + err = bus_setup_intr(dev, sc->irq_res_tx, INTR_TYPE_NET | INTR_MPSAFE, + NULL, ece_intr_tx, sc, &sc->intrhand_tx); + + if (err) { + ether_ifdetach(ifp); + ECE_LOCK_DESTROY(sc); + goto out; + } + + ECE_TXLOCK_INIT(sc); + ECE_RXLOCK_INIT(sc); + ECE_CLEANUPLOCK_INIT(sc); + + /* Enable all interrupt sources. */ + write_4(sc, INTERRUPT_MASK, 0x00000000); + + /* Enable port 0. */ + write_4(sc, PORT_0_CONFIG, read_4(sc, PORT_0_CONFIG) & ~(PORT_DISABLE)); + + taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, "%s taskq", + device_get_nameunit(sc->dev)); + +out:; + if (err) + ece_deactivate(dev); + if (err && ifp) + if_free(ifp); + return (err); +} + +static int +ece_detach(device_t dev) +{ + struct ece_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->ifp; + + ecestop(sc); + if (ifp != NULL) { + ether_ifdetach(ifp); + if_free(ifp); + } + ece_deactivate(dev); + return (0); +} + +static void +ece_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + u_int32_t *paddr; + KASSERT(nsegs == 1, ("wrong number of segments, should be 1")); + paddr = arg; + *paddr = segs->ds_addr; +} + +static int +ece_alloc_desc_dma_tx(struct ece_softc *sc) +{ + int i; + int error; + + /* Allocate a busdma tag and DMA safe memory for TX/RX descriptors. */ + error = bus_dma_tag_create(sc->sc_parent_tag, /* parent */ + 16, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filtfunc, filtfuncarg */ + sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS, /* max size */ + 1, /*nsegments */ + sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS, + 0, /* flags */ + NULL, NULL, /* lockfunc, lockfuncarg */ + &sc->dmatag_data_tx); /* dmat */ + + /* Allocate memory for TX ring. */ + error = bus_dmamem_alloc(sc->dmatag_data_tx, + (void**)&(sc->desc_tx), + BUS_DMA_NOWAIT | BUS_DMA_ZERO | + BUS_DMA_COHERENT, + &(sc->dmamap_ring_tx)); + + if (error) { + if_printf(sc->ifp, "failed to allocate DMA memory\n"); + bus_dma_tag_destroy(sc->dmatag_data_tx); + sc->dmatag_data_tx = 0; + return (ENXIO); + } + + /* Load Ring DMA. */ + error = bus_dmamap_load(sc->dmatag_data_tx, sc->dmamap_ring_tx, + sc->desc_tx, + sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS, + ece_getaddr, + &(sc->ring_paddr_tx), BUS_DMA_NOWAIT); + + if (error) { + if_printf(sc->ifp, "can't load descriptor\n"); + bus_dmamem_free(sc->dmatag_data_tx, sc->desc_tx, + sc->dmamap_ring_tx); + sc->desc_tx = NULL; + bus_dma_tag_destroy(sc->dmatag_data_tx); + sc->dmatag_data_tx = 0; + return (ENXIO); + } + + /* Allocate a busdma tag for mbufs. Alignment is 2 bytes */ + error = bus_dma_tag_create(sc->sc_parent_tag, /* parent */ + 1, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filtfunc, filtfuncarg */ + MCLBYTES*MAX_FRAGMENT, /* maxsize */ + MAX_FRAGMENT, /* nsegments */ + MCLBYTES, 0, /* maxsegsz, flags */ + NULL, NULL, /* lockfunc, lockfuncarg */ + &sc->dmatag_ring_tx); /* dmat */ + + if (error) { + if_printf(sc->ifp, "failed to create busdma tag for mbufs\n"); + return (ENXIO); + } + + for (i = 0; i < ECE_MAX_TX_BUFFERS; i++) { + /* Create dma map for each descriptor. */ + error = bus_dmamap_create(sc->dmatag_ring_tx, 0, + &(sc->tx_desc[i].dmamap)); + if (error) { + if_printf(sc->ifp, "failed to create map for mbuf\n"); + return (ENXIO); + } + } + return (0); +} + +static void +ece_free_desc_dma_tx(struct ece_softc *sc) +{ + int i; + + for (i = 0; i < ECE_MAX_TX_BUFFERS; i++) { + if (sc->tx_desc[i].buff) { + m_freem(sc->tx_desc[i].buff); + sc->tx_desc[i].buff= 0; + } + } + + if (sc->dmamap_ring_tx) { + bus_dmamap_unload(sc->dmatag_data_tx, sc->dmamap_ring_tx); + if (sc->desc_tx) { + bus_dmamem_free(sc->dmatag_data_tx, + sc->desc_tx, sc->dmamap_ring_tx); + } + sc->dmamap_ring_tx = 0; + } + + if (sc->dmatag_data_tx) { + bus_dma_tag_destroy(sc->dmatag_data_tx); + sc->dmatag_data_tx = 0; + } + + if (sc->dmatag_ring_tx) { + for (i = 0; idmatag_ring_tx, + sc->tx_desc[i].dmamap); + sc->tx_desc[i].dmamap = 0; + } + bus_dma_tag_destroy(sc->dmatag_ring_tx); + sc->dmatag_ring_tx = 0; + } +} + +static int +ece_alloc_desc_dma_rx(struct ece_softc *sc) +{ + int error; + int i; + + /* Allocate a busdma tag and DMA safe memory for RX descriptors. */ + error = bus_dma_tag_create(sc->sc_parent_tag, /* parent */ + 16, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filtfunc, filtfuncarg */ + /* maxsize, nsegments */ + sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, 1, + /* maxsegsz, flags */ + sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, 0, + NULL, NULL, /* lockfunc, lockfuncarg */ + &sc->dmatag_data_rx); /* dmat */ + + /* Allocate RX ring. */ + error = bus_dmamem_alloc(sc->dmatag_data_rx, + (void**)&(sc->desc_rx), + BUS_DMA_NOWAIT | BUS_DMA_ZERO | + BUS_DMA_COHERENT, + &(sc->dmamap_ring_rx)); + + if (error) { + if_printf(sc->ifp, "failed to allocate DMA memory\n"); + return (ENXIO); + } + + /* Load dmamap. */ + error = bus_dmamap_load(sc->dmatag_data_rx, sc->dmamap_ring_rx, + sc->desc_rx, + sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, + ece_getaddr, + &(sc->ring_paddr_rx), BUS_DMA_NOWAIT); + + if (error) { + if_printf(sc->ifp, "can't load descriptor\n"); + bus_dmamem_free(sc->dmatag_data_rx, sc->desc_rx, + sc->dmamap_ring_rx); + bus_dma_tag_destroy(sc->dmatag_data_rx); + sc->desc_rx = NULL; + return (ENXIO); + } + + /* Allocate a busdma tag for mbufs. */ + error = bus_dma_tag_create(sc->sc_parent_tag,/* parent */ + 16, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filtfunc, filtfuncarg */ + MCLBYTES, 1, /* maxsize, nsegments */ + MCLBYTES, 0, /* maxsegsz, flags */ + NULL, NULL, /* lockfunc, lockfuncarg */ + &sc->dmatag_ring_rx); /* dmat */ + + if (error) { + if_printf(sc->ifp, "failed to create busdma tag for mbufs\n"); + return (ENXIO); + } + + for (i = 0; idmatag_ring_rx, 0, + &sc->rx_desc[i].dmamap); + if (error) { + if_printf(sc->ifp, "failed to create map for mbuf\n"); + return (ENXIO); + } + } + + error = bus_dmamap_create(sc->dmatag_ring_rx, 0, &sc->rx_sparemap); + if (error) { + if_printf(sc->ifp, "failed to create spare map\n"); + return (ENXIO); + } + + return (0); +} + +static void +ece_free_desc_dma_rx(struct ece_softc *sc) +{ + int i; + + for (i = 0; i < ECE_MAX_RX_BUFFERS; i++) { + if (sc->rx_desc[i].buff) { + m_freem(sc->rx_desc[i].buff); + sc->rx_desc[i].buff= 0; + } + } + + if (sc->dmatag_data_rx) { + bus_dmamap_unload(sc->dmatag_data_rx, sc->dmamap_ring_rx); + bus_dmamem_free(sc->dmatag_data_rx, sc->desc_rx, + sc->dmamap_ring_rx); + bus_dma_tag_destroy(sc->dmatag_data_rx); + sc->dmatag_data_rx = 0; + sc->dmamap_ring_rx = 0; + sc->desc_rx = 0; + } + + if (sc->dmatag_ring_rx) { + for (i = 0; i < ECE_MAX_RX_BUFFERS; i++) + bus_dmamap_destroy(sc->dmatag_ring_rx, + sc->rx_desc[i].dmamap); + bus_dmamap_destroy(sc->dmatag_ring_rx, sc->rx_sparemap); + bus_dma_tag_destroy(sc->dmatag_ring_rx); + sc->dmatag_ring_rx = 0; + } +} + +static int +ece_new_rxbuf(struct ece_softc *sc, struct rx_desc_info* descinfo) +{ + struct mbuf *new_mbuf; + bus_dma_segment_t seg[1]; + bus_dmamap_t map; + int error; + int nsegs; + bus_dma_tag_t tag; + + tag = sc->dmatag_ring_rx; + + new_mbuf = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + + if (new_mbuf == NULL) + return (ENOBUFS); + + new_mbuf->m_len = new_mbuf->m_pkthdr.len = MCLBYTES; + + error = bus_dmamap_load_mbuf_sg(tag, sc->rx_sparemap, new_mbuf, + seg, &nsegs, BUS_DMA_NOWAIT); + + KASSERT(nsegs == 1, ("Too many segments returned!")); + + if (nsegs != 1 || error) { + m_free(new_mbuf); + return (ENOBUFS); + } + + if (descinfo->buff != NULL) { + bus_dmamap_sync(tag, descinfo->dmamap, BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(tag, descinfo->dmamap); + } + + map = descinfo->dmamap; + descinfo->dmamap = sc->rx_sparemap; + sc->rx_sparemap = map; + + bus_dmamap_sync(tag, descinfo->dmamap, BUS_DMASYNC_PREREAD); + + descinfo->buff = new_mbuf; + descinfo->desc->data_ptr = seg->ds_addr; + descinfo->desc->length = seg->ds_len - 2; + + return (0); +} + +static int +ece_allocate_dma(struct ece_softc *sc) +{ + eth_tx_desc_t *desctx; + eth_rx_desc_t *descrx; + int i; + int error; + + /* Create parent tag for tx and rx */ + error = bus_dma_tag_create( + bus_get_dma_tag(sc->dev),/* parent */ + 1, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BUS_SPACE_MAXSIZE_32BIT, 0,/* maxsize, nsegments */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->sc_parent_tag); + + ece_alloc_desc_dma_tx(sc); + + for (i = 0; i < ECE_MAX_TX_BUFFERS; i++) { + desctx = (eth_tx_desc_t *)(&sc->desc_tx[i]); + memset(desctx, 0, sizeof(eth_tx_desc_t)); + desctx->length = MAX_PACKET_LEN; + desctx->cown = 1; + if (i == ECE_MAX_TX_BUFFERS - 1) + desctx->eor = 1; + } + + ece_alloc_desc_dma_rx(sc); + + for (i = 0; i < ECE_MAX_RX_BUFFERS; i++) { + descrx = &(sc->desc_rx[i]); + memset(descrx, 0, sizeof(eth_rx_desc_t)); + sc->rx_desc[i].desc = descrx; + sc->rx_desc[i].buff = 0; + ece_new_rxbuf(sc, &(sc->rx_desc[i])); + + if (i == ECE_MAX_RX_BUFFERS - 1) + descrx->eor = 1; + } + sc->tx_prod = 0; + sc->tx_cons = 0; + sc->last_rx = 0; + sc->desc_curr_tx = 0; + + return (0); +} + +static int +ece_activate(device_t dev) +{ + struct ece_softc *sc; + int err; + uint32_t mac_port_config; + struct ifnet *ifp; + + sc = device_get_softc(dev); + ifp = sc->ifp; + + initial_switch_config = read_4(sc, SWITCH_CONFIG); + initial_cpu_config = read_4(sc, CPU_PORT_CONFIG); + initial_port0_config = read_4(sc, MAC_PORT_0_CONFIG); + initial_port1_config = read_4(sc, MAC_PORT_1_CONFIG); + + /* Disable Port 0 */ + mac_port_config = read_4(sc, MAC_PORT_0_CONFIG); + mac_port_config |= (PORT_DISABLE); + write_4(sc, MAC_PORT_0_CONFIG, mac_port_config); + + /* Disable Port 1 */ + mac_port_config = read_4(sc, MAC_PORT_1_CONFIG); + mac_port_config |= (PORT_DISABLE); + write_4(sc, MAC_PORT_1_CONFIG, mac_port_config); + + err = ece_allocate_dma(sc); + if (err) { + if_printf(sc->ifp, "failed allocating dma\n"); + goto out; + } + + write_4(sc, TS_DESCRIPTOR_POINTER, sc->ring_paddr_tx); + write_4(sc, TS_DESCRIPTOR_BASE_ADDR, sc->ring_paddr_tx); + + write_4(sc, FS_DESCRIPTOR_POINTER, sc->ring_paddr_rx); + write_4(sc, FS_DESCRIPTOR_BASE_ADDR, sc->ring_paddr_rx); + + write_4(sc, FS_DMA_CONTROL, 1); + + return (0); +out: + return (ENXIO); + +} + +static void +ece_deactivate(device_t dev) +{ + struct ece_softc *sc; + + sc = device_get_softc(dev); + + if (sc->intrhand) + bus_teardown_intr(dev, sc->irq_res_rec, sc->intrhand); + + sc->intrhand = 0; + + if (sc->intrhand_qf) + bus_teardown_intr(dev, sc->irq_res_qf, sc->intrhand_qf); + + sc->intrhand_qf = 0; + + bus_generic_detach(sc->dev); + if (sc->miibus) + device_delete_child(sc->dev, sc->miibus); + if (sc->mem_res) + bus_release_resource(dev, SYS_RES_IOPORT, + rman_get_rid(sc->mem_res), sc->mem_res); + sc->mem_res = 0; + + if (sc->irq_res_rec) + bus_release_resource(dev, SYS_RES_IRQ, + rman_get_rid(sc->irq_res_rec), sc->irq_res_rec); + + if (sc->irq_res_qf) + bus_release_resource(dev, SYS_RES_IRQ, + rman_get_rid(sc->irq_res_qf), sc->irq_res_qf); + + if (sc->irq_res_qf) + bus_release_resource(dev, SYS_RES_IRQ, + rman_get_rid(sc->irq_res_status), sc->irq_res_status); + + sc->irq_res_rec = 0; + sc->irq_res_qf = 0; + sc->irq_res_status = 0; + ECE_TXLOCK_DESTROY(sc); + ECE_RXLOCK_DESTROY(sc); + + ece_free_desc_dma_tx(sc); + ece_free_desc_dma_rx(sc); + + return; +} + +/* + * Change media according to request. + */ +static int +ece_ifmedia_upd(struct ifnet *ifp) +{ + struct ece_softc *sc = ifp->if_softc; + struct mii_data *mii; + int error; + + mii = device_get_softc(sc->miibus); + ECE_LOCK(sc); + error = mii_mediachg(mii); + ECE_UNLOCK(sc); + return (error); +} + +/* + * Notify the world which media we're using. + */ +static void +ece_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + struct ece_softc *sc = ifp->if_softc; + struct mii_data *mii; + + mii = device_get_softc(sc->miibus); + ECE_LOCK(sc); + mii_pollstat(mii); + ifmr->ifm_active = mii->mii_media_active; + ifmr->ifm_status = mii->mii_media_status; + ECE_UNLOCK(sc); +} + +static void +ece_tick(void *xsc) +{ + struct ece_softc *sc = xsc; + struct mii_data *mii; + int active; + + mii = device_get_softc(sc->miibus); + active = mii->mii_media_active; + mii_tick(mii); + + /* + * Schedule another timeout one second from now. + */ + callout_reset(&sc->tick_ch, hz, ece_tick, sc); +} + +static uint32_t +read_mac_entry(struct ece_softc *ec, + uint8_t *mac_result, + int first) +{ + uint32_t ii; + struct arl_table_entry_t entry; + uint32_t *entry_val; + write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0); + write_4(ec, ARL_TABLE_ACCESS_CONTROL_1, 0); + write_4(ec, ARL_TABLE_ACCESS_CONTROL_2, 0); + if (first) + write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0x1); + else + write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0x2); + + for (ii = 0; ii < 0x1000; ii++) + if (read_4(ec, ARL_TABLE_ACCESS_CONTROL_1) & (0x1)) + break; + + entry_val = (uint32_t*) (&entry); + entry_val[0] = read_4(ec, ARL_TABLE_ACCESS_CONTROL_1); + entry_val[1] = read_4(ec, ARL_TABLE_ACCESS_CONTROL_2); + + if (mac_result) + memcpy(mac_result, entry.mac_addr, ETHER_ADDR_LEN); + + return (entry.table_end); +} + +static uint32_t +write_arl_table_entry(struct ece_softc *ec, + uint32_t filter, + uint32_t vlan_mac, + uint32_t vlan_gid, + uint32_t age_field, + uint32_t port_map, + const uint8_t *mac_addr) +{ + uint32_t ii; + uint32_t *entry_val; + struct arl_table_entry_t entry; + + memset(&entry, 0, sizeof(entry)); + + entry.filter = filter; + entry.vlan_mac = vlan_mac; + entry.vlan_gid = vlan_gid; + entry.age_field = age_field; + entry.port_map = port_map; + memcpy(entry.mac_addr, mac_addr, ETHER_ADDR_LEN); + + entry_val = (uint32_t*) (&entry); + + write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, 0); + write_4(ec, ARL_TABLE_ACCESS_CONTROL_1, 0); + write_4(ec, ARL_TABLE_ACCESS_CONTROL_2, 0); + + write_4(ec, ARL_TABLE_ACCESS_CONTROL_1, entry_val[0]); + write_4(ec, ARL_TABLE_ACCESS_CONTROL_2, entry_val[1]); + + write_4(ec, ARL_TABLE_ACCESS_CONTROL_0, ARL_WRITE_COMMAND); + + for (ii = 0; ii < 0x1000; ii++) + if (read_4(ec, ARL_TABLE_ACCESS_CONTROL_1) & + ARL_COMMAND_COMPLETE) + return (1); /* Write OK. */ + + /* Write failed. */ + return (0); +} + +static void +remove_mac_entry(struct ece_softc *sc, + uint8_t *mac) +{ + + /* Invalid age_field mean erase this entry. */ + write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID, + INVALID_ENTRY, VLAN0_GROUP, + mac); +} + +static void +add_mac_entry(struct ece_softc *sc, + uint8_t *mac) +{ + + write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID, + NEW_ENTRY, VLAN0_GROUP, + mac); +} + +/** + * The behavior of ARL table reading and deletion is not well defined + * in the documentation. To be safe, all mac addresses are put to a + * list, then deleted. + * + */ +static void +clear_mac_entries(struct ece_softc *ec, int include_this_mac) +{ + int table_end; + struct mac_list * temp; + struct mac_list * mac_list_header; + struct mac_list * current; + char mac[ETHER_ADDR_LEN]; + + current = 0; + mac_list_header = 0; + + table_end = read_mac_entry(ec, mac, 1); + while (!table_end) { + if (!include_this_mac && + memcmp(mac, vlan0_mac, ETHER_ADDR_LEN) == 0) { + /* Read next entry. */ + table_end = read_mac_entry(ec, mac, 0); + continue; + } + + temp = (struct mac_list*)malloc(sizeof(struct mac_list), + M_DEVBUF, + M_NOWAIT | M_ZERO); + memcpy(temp->mac_addr, mac, ETHER_ADDR_LEN); + temp->next = 0; + if (mac_list_header) { + current->next = temp; + current = temp; + } else { + mac_list_header = temp; + current = temp; + } + /* Read next Entry */ + table_end = read_mac_entry(ec, mac, 0); + } + + current = mac_list_header; + + while (current) { + remove_mac_entry(ec, current->mac_addr); + temp = current; + current = current->next; + free(temp, M_DEVBUF); + } +} + +static int +configure_lan_port(struct ece_softc *sc, int phy_type) +{ + uint32_t sw_config; + uint32_t mac_port_config; + + /* + * Configure switch + */ + sw_config = read_4(sc, SWITCH_CONFIG); + /* Enable fast aging. */ + sw_config |= FAST_AGING; + /* Enable IVL learning. */ + sw_config |= IVL_LEARNING; + /* Disable hardware NAT. */ + sw_config &= ~(HARDWARE_NAT); + + sw_config |= SKIP_L2_LOOKUP_PORT_0 | SKIP_L2_LOOKUP_PORT_1| NIC_MODE; + + write_4(sc, SWITCH_CONFIG, sw_config); + + sw_config = read_4(sc, SWITCH_CONFIG); + + mac_port_config = read_4(sc, MAC_PORT_0_CONFIG); + + if (!(mac_port_config & 0x1) || (mac_port_config & 0x2)) + if_printf(sc->ifp, "Link Down\n"); + else + write_4(sc, MAC_PORT_0_CONFIG, mac_port_config); + return (0); +} + +static void +set_pvid(struct ece_softc *sc, int port0, int port1, int cpu) +{ + uint32_t val; + val = read_4(sc, VLAN_PORT_PVID) & (~(0x7 << 0)); + write_4(sc, VLAN_PORT_PVID, val); + val = read_4(sc, VLAN_PORT_PVID) | ((port0) & 0x07); + write_4(sc, VLAN_PORT_PVID, val); + val = read_4(sc, VLAN_PORT_PVID) & (~(0x7 << 4)); + write_4(sc, VLAN_PORT_PVID, val); + val = read_4(sc, VLAN_PORT_PVID) | (((port1) & 0x07) << 4); + write_4(sc, VLAN_PORT_PVID, val); + + val = read_4(sc, VLAN_PORT_PVID) & (~(0x7 << 8)); + write_4(sc, VLAN_PORT_PVID, val); + val = read_4(sc, VLAN_PORT_PVID) | (((cpu) & 0x07) << 8); + write_4(sc, VLAN_PORT_PVID, val); + +} + +/* VLAN related functions */ +static void +set_vlan_vid(struct ece_softc *sc, int vlan) +{ + const uint32_t regs[] = { + VLAN_VID_0_1, + VLAN_VID_0_1, + VLAN_VID_2_3, + VLAN_VID_2_3, + VLAN_VID_4_5, + VLAN_VID_4_5, + VLAN_VID_6_7, + VLAN_VID_6_7 + }; + + const int vids[] = { + VLAN0_VID, + VLAN1_VID, + VLAN2_VID, + VLAN3_VID, + VLAN4_VID, + VLAN5_VID, + VLAN6_VID, + VLAN7_VID + }; + + uint32_t val; + uint32_t reg; + int vid; + + reg = regs[vlan]; + vid = vids[vlan]; + + if (vlan & 1) { + val = read_4(sc, reg); + write_4(sc, reg, val & (~(0xFFF << 0))); + val = read_4(sc, reg); + write_4(sc, reg, val|((vid & 0xFFF) << 0)); + } else { + val = read_4(sc, reg); + write_4(sc, reg, val & (~(0xFFF << 12))); + val = read_4(sc, reg); + write_4(sc, reg, val|((vid & 0xFFF) << 12)); + } +} + +static void +set_vlan_member(struct ece_softc *sc, int vlan) +{ + unsigned char shift; + uint32_t val; + int group; + const int groups[] = { + VLAN0_GROUP, + VLAN1_GROUP, + VLAN2_GROUP, + VLAN3_GROUP, + VLAN4_GROUP, + VLAN5_GROUP, + VLAN6_GROUP, + VLAN7_GROUP + }; + + group = groups[vlan]; + + shift = vlan*3; + val = read_4(sc, VLAN_MEMBER_PORT_MAP) & (~(0x7 << shift)); + write_4(sc, VLAN_MEMBER_PORT_MAP, val); + val = read_4(sc, VLAN_MEMBER_PORT_MAP); + write_4(sc, VLAN_MEMBER_PORT_MAP, val | ((group & 0x7) << shift)); +} + +static void +set_vlan_tag(struct ece_softc *sc, int vlan) +{ + unsigned char shift; + uint32_t val; + + int tag = 0; + + shift = vlan*3; + val = read_4(sc, VLAN_TAG_PORT_MAP) & (~(0x7 << shift)); + write_4(sc, VLAN_TAG_PORT_MAP, val); + val = read_4(sc, VLAN_TAG_PORT_MAP); + write_4(sc, VLAN_TAG_PORT_MAP, val | ((tag & 0x7) << shift)); +} + +static int +configure_cpu_port(struct ece_softc *sc) +{ + uint32_t cpu_port_config; + int i; + + cpu_port_config = read_4(sc, CPU_PORT_CONFIG); + /* SA learning Disable */ + cpu_port_config |= (SA_LEARNING_DISABLE); + /* set data offset + 2 */ + cpu_port_config &= ~(1 << 31); + + write_4(sc, CPU_PORT_CONFIG, cpu_port_config); + + if (!write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID, + STATIC_ENTRY, VLAN0_GROUP, + vlan0_mac)) + return (1); + + set_pvid(sc, PORT0_PVID, PORT1_PVID, CPU_PORT_PVID); + + for (i = 0; i < 8; i++) { + set_vlan_vid(sc, i); + set_vlan_member(sc, i); + set_vlan_tag(sc, i); + } + + /* disable all interrupt status sources */ + write_4(sc, INTERRUPT_MASK, 0xffff1fff); + + /* clear previous interrupt sources */ + write_4(sc, INTERRUPT_STATUS, 0x00001FFF); + + write_4(sc, TS_DMA_CONTROL, 0); + write_4(sc, FS_DMA_CONTROL, 0); + return (0); +} + +static int +hardware_init(struct ece_softc *sc) +{ + int status = 0; + static int gw_phy_type; + + gw_phy_type = get_phy_type(sc); + /* Currently only ic_plus phy is supported. */ + if (gw_phy_type != IC_PLUS_PHY) { + device_printf(sc->dev, "PHY type is not supported (%d)\n", + gw_phy_type); + return (-1); + } + status = configure_lan_port(sc, gw_phy_type); + configure_cpu_port(sc); + return (0); +} + +static void +set_mac_address(struct ece_softc *sc, const char *mac, int mac_len) +{ + + /* Invalid age_field mean erase this entry. */ + write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID, + INVALID_ENTRY, VLAN0_GROUP, + mac); + memcpy(vlan0_mac, mac, ETHER_ADDR_LEN); + + write_arl_table_entry(sc, 0, 1, VLAN0_GROUP_ID, + STATIC_ENTRY, VLAN0_GROUP, + mac); +} + +static void +ece_set_mac(struct ece_softc *sc, u_char *eaddr) +{ + memcpy(vlan0_mac, eaddr, ETHER_ADDR_LEN); + set_mac_address(sc, eaddr, ETHER_ADDR_LEN); +} + +/* + * TODO: the device doesn't have MAC stored, we should read the + * configuration stored in FLASH, but the format depends on the + * bootloader used.* + */ +static int +ece_get_mac(struct ece_softc *sc, u_char *eaddr) +{ + return (ENXIO); +} + +static void +ece_intr_rx_locked(struct ece_softc *sc, int count) +{ + struct ifnet *ifp = sc->ifp; + struct mbuf *mb; + struct rx_desc_info *rxdesc; + eth_rx_desc_t *desc; + + int fssd_curr; + int fssd; + int i; + int idx; + int rxcount; + uint32_t status; + + fssd_curr = read_4(sc, FS_DESCRIPTOR_POINTER); + + fssd = (fssd_curr - (uint32_t)sc->ring_paddr_rx)>>4; + + desc = sc->rx_desc[sc->last_rx].desc; + + /* Prepare to read the data in the ring. */ + bus_dmamap_sync(sc->dmatag_ring_rx, + sc->dmamap_ring_rx, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + if (fssd > sc->last_rx) + rxcount = fssd - sc->last_rx; + else if (fssd < sc->last_rx) + rxcount = (ECE_MAX_RX_BUFFERS - sc->last_rx) + fssd; + else { + if (desc->cown == 0) + return; + else + rxcount = ECE_MAX_RX_BUFFERS; + } + + for (i= 0; i < rxcount; i++) { + status = desc->cown; + if (!status) + break; + + idx = sc->last_rx; + rxdesc = &sc->rx_desc[idx]; + mb = rxdesc->buff; + + if (desc->length < ETHER_MIN_LEN - ETHER_CRC_LEN || + desc->length > ETHER_MAX_LEN - ETHER_CRC_LEN + + ETHER_VLAN_ENCAP_LEN) { + ifp->if_ierrors++; + desc->cown = 0; + desc->length = MCLBYTES - 2; + /* Invalid packet, skip and process next + * packet. + */ + continue; + } + + if (ece_new_rxbuf(sc, rxdesc) != 0) { + ifp->if_iqdrops++; + desc->cown = 0; + desc->length = MCLBYTES - 2; + break; + } + + /** + * The device will write to addrress + 2 So we need to adjust + * the address after the packet is received. + */ + mb->m_data += 2; + mb->m_len = mb->m_pkthdr.len = desc->length; + + mb->m_flags |= M_PKTHDR; + mb->m_pkthdr.rcvif = ifp; + if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) { + /*check for valid checksum*/ + if ( (!desc->l4f) && (desc->prot != 3)) { + mb->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; + mb->m_pkthdr.csum_flags |= CSUM_IP_VALID; + mb->m_pkthdr.csum_data = 0xffff; + } + } + ECE_RXUNLOCK(sc); + (*ifp->if_input)(ifp, mb); + ECE_RXLOCK(sc); + + desc->cown = 0; + desc->length = MCLBYTES - 2; + + bus_dmamap_sync(sc->dmatag_ring_rx, + sc->dmamap_ring_rx, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + + if (sc->last_rx == ECE_MAX_RX_BUFFERS - 1) + sc->last_rx = 0; + else + sc->last_rx++; + + desc = sc->rx_desc[sc->last_rx].desc; + } + + /* Sync updated flags. */ + bus_dmamap_sync(sc->dmatag_ring_rx, + sc->dmamap_ring_rx, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + + return; +} + +static void +ece_intr_task(void *arg, int pending __unused) +{ + struct ece_softc *sc = arg; + ECE_RXLOCK(sc); + ece_intr_rx_locked(sc, -1); + ECE_RXUNLOCK(sc); +} + +static void +ece_intr(void *xsc) +{ + struct ece_softc *sc = xsc; + struct ifnet *ifp = sc->ifp; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + write_4(sc, FS_DMA_CONTROL, 0); + return; + } + + taskqueue_enqueue(sc->sc_tq, &sc->sc_intr_task); + + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + taskqueue_enqueue(sc->sc_tq, &sc->sc_tx_task); +} + +static void +ece_intr_status(void *xsc) +{ + struct ece_softc *sc = xsc; + struct ifnet *ifp = sc->ifp; + int stat; + + stat = read_4(sc, INTERRUPT_STATUS); + + write_4(sc, INTERRUPT_STATUS, stat); + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + if ((stat & ERROR_MASK) != 0) + ifp->if_iqdrops++; + } +} + +static void +ece_cleanup_locked(struct ece_softc *sc) +{ + eth_tx_desc_t *desc; + + if (sc->tx_cons == sc->tx_prod) return; + + /* Prepare to read the ring (owner bit). */ + bus_dmamap_sync(sc->dmatag_ring_tx, + sc->dmamap_ring_tx, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + while (sc->tx_cons != sc->tx_prod) { + desc = sc->tx_desc[sc->tx_cons].desc; + if (desc->cown != 0) { + struct tx_desc_info *td = &(sc->tx_desc[sc->tx_cons]); + /* We are finished with this descriptor ... */ + bus_dmamap_sync(sc->dmatag_data_tx, td->dmamap, + BUS_DMASYNC_POSTWRITE); + /* ... and unload, so we can reuse. */ + bus_dmamap_unload(sc->dmatag_data_tx, td->dmamap); + m_freem(td->buff); + td->buff = 0; + sc->tx_cons = (sc->tx_cons + 1) % ECE_MAX_TX_BUFFERS; + } else { + break; + } + } + +} + +static void +ece_cleanup_task(void *arg, int pending __unused) +{ + struct ece_softc *sc = arg; + ECE_CLEANUPLOCK(sc); + ece_cleanup_locked(sc); + ECE_CLEANUPUNLOCK(sc); +} + +static void +ece_intr_tx(void *xsc) +{ + struct ece_softc *sc = xsc; + struct ifnet *ifp = sc->ifp; + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + /* This should not happen, stop DMA. */ + write_4(sc, FS_DMA_CONTROL, 0); + return; + } + taskqueue_enqueue(sc->sc_tq, &sc->sc_cleanup_task); +} + +static void +ece_intr_qf(void *xsc) +{ + struct ece_softc *sc = xsc; + struct ifnet *ifp = sc->ifp; + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + /* This should not happen, stop DMA. */ + write_4(sc, FS_DMA_CONTROL, 0); + return; + } + taskqueue_enqueue(sc->sc_tq, &sc->sc_intr_task); + write_4(sc, FS_DMA_CONTROL, 1); +} + +/* + * Reset and initialize the chip + */ +static void +eceinit_locked(void *xsc) +{ + struct ece_softc *sc = xsc; + struct ifnet *ifp = sc->ifp; + struct mii_data *mii; + uint32_t cfg_reg; + uint32_t cpu_port_config; + uint32_t mac_port_config; + + while (1) { + cfg_reg = read_4(sc, BIST_RESULT_TEST_0); + if ((cfg_reg & (1<<17))) + break; + DELAY(100); + } + /* Set to default values. */ + write_4(sc, SWITCH_CONFIG, 0x007AA7A1); + write_4(sc, MAC_PORT_0_CONFIG, 0x00423D00); + write_4(sc, MAC_PORT_1_CONFIG, 0x00423D80); + write_4(sc, CPU_PORT_CONFIG, 0x004C0000); + + hardware_init(sc); + + mac_port_config = read_4(sc, MAC_PORT_0_CONFIG); + + /* Enable Port 0 */ + mac_port_config &= (~(PORT_DISABLE)); + write_4(sc, MAC_PORT_0_CONFIG, mac_port_config); + + cpu_port_config = read_4(sc, CPU_PORT_CONFIG); + /* Enable CPU. */ + cpu_port_config &= ~(PORT_DISABLE); + write_4(sc, CPU_PORT_CONFIG, cpu_port_config); + + /* + * Set 'running' flag, and clear output active flag + * and attempt to start the output + */ + ifp->if_drv_flags |= IFF_DRV_RUNNING; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + + mii = device_get_softc(sc->miibus); + mii_pollstat(mii); + /* Enable DMA. */ + write_4(sc, FS_DMA_CONTROL, 1); + + callout_reset(&sc->tick_ch, hz, ece_tick, sc); +} + +static inline int +ece_encap(struct ece_softc *sc, struct mbuf *m0) +{ + struct ifnet *ifp; + bus_dma_segment_t segs[MAX_FRAGMENT]; + bus_dmamap_t mapp; + eth_tx_desc_t *desc = 0; + int csum_flags; + int desc_no; + int error; + int nsegs; + int seg; + + ifp = sc->ifp; + + /* Fetch unused map */ + mapp = sc->tx_desc[sc->tx_prod].dmamap; + + error = bus_dmamap_load_mbuf_sg(sc->dmatag_ring_tx, mapp, + m0, segs, &nsegs, + BUS_DMA_NOWAIT); + + if (error != 0) { + bus_dmamap_unload(sc->dmatag_ring_tx, mapp); + return ((error != 0) ? error : -1); + } + + desc = &(sc->desc_tx[sc->desc_curr_tx]); + sc->tx_desc[sc->tx_prod].desc = desc; + sc->tx_desc[sc->tx_prod].buff = m0; + desc_no = sc->desc_curr_tx; + + for (seg = 0; seg < nsegs; seg++) { + if (desc->cown == 0 ) { + if_printf(ifp, "ERROR: descriptor is still used\n"); + return (-1); + } + + desc->length = segs[seg].ds_len; + desc->data_ptr = segs[seg].ds_addr; + + if (seg == 0) { + desc->fs = 1; + } else { + desc->fs = 0; + } + if (seg == nsegs - 1) { + desc->ls = 1; + } else { + desc->ls = 0; + } + + csum_flags = m0->m_pkthdr.csum_flags; + + desc->fr = 1; + desc->pmap = 1; + desc->insv = 0; + desc->ico = 0; + desc->tco = 0; + desc->uco = 0; + desc->interrupt = 1; + + if (csum_flags & CSUM_IP) { + desc->ico = 1; + if (csum_flags & CSUM_TCP) + desc->tco = 1; + if (csum_flags & CSUM_UDP) + desc->uco = 1; + } + + desc++; + sc->desc_curr_tx = (sc->desc_curr_tx + 1) % ECE_MAX_TX_BUFFERS; + if (sc->desc_curr_tx == 0) { + desc = (eth_tx_desc_t *)&(sc->desc_tx[0]); + } + } + + desc = sc->tx_desc[sc->tx_prod].desc; + + sc->tx_prod = (sc->tx_prod + 1) % ECE_MAX_TX_BUFFERS; + + /* + * After all descriptors are set, we set the flags to start the + * sending proces. + */ + for (seg = 0; seg < nsegs; seg++) { + desc->cown = 0; + desc++; + desc_no = (desc_no + 1) % ECE_MAX_TX_BUFFERS; + if (desc_no == 0) + desc = (eth_tx_desc_t *)&(sc->desc_tx[0]); + } + + bus_dmamap_sync(sc->dmatag_data_tx, mapp, BUS_DMASYNC_PREWRITE); + return (0); +} + +/* + * dequeu packets and transmit + */ +static void +ecestart_locked(struct ifnet *ifp) +{ + struct ece_softc *sc; + struct mbuf *m0; + uint32_t queued = 0; + + sc = ifp->if_softc; + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING) + return; + + bus_dmamap_sync(sc->dmatag_ring_tx, + sc->dmamap_ring_tx, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + for (;;) { + /* Get packet from the queue */ + IF_DEQUEUE(&ifp->if_snd, m0); + if (m0 == NULL) + break; + if (ece_encap(sc, m0)) { + IF_PREPEND(&ifp->if_snd, m0); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } + queued++; + BPF_MTAP(ifp, m0); + } + if (queued) { + bus_dmamap_sync(sc->dmatag_ring_tx, sc->dmamap_ring_tx, + BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); + write_4(sc, TS_DMA_CONTROL, 1); + } +} + +static void +eceinit(void *xsc) +{ + struct ece_softc *sc = xsc; + ECE_LOCK(sc); + eceinit_locked(sc); + ECE_UNLOCK(sc); +} + +static void +ece_tx_task(void *arg, int pending __unused) +{ + struct ifnet *ifp; + ifp = (struct ifnet *)arg; + ecestart(ifp); +} + +static void +ecestart(struct ifnet *ifp) +{ + struct ece_softc *sc = ifp->if_softc; + ECE_TXLOCK(sc); + ecestart_locked(ifp); + ECE_TXUNLOCK(sc); +} + +/* + * Turn off interrupts, and stop the nic. Can be called with sc->ifp + * NULL so be careful. + */ +static void +ecestop(struct ece_softc *sc) +{ + struct ifnet *ifp = sc->ifp; + uint32_t mac_port_config; + + write_4(sc, TS_DMA_CONTROL, 0); + write_4(sc, FS_DMA_CONTROL, 0); + + if (ifp) + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + + callout_stop(&sc->tick_ch); + + /*Disable Port 0 */ + mac_port_config = read_4(sc, MAC_PORT_0_CONFIG); + mac_port_config |= (PORT_DISABLE); + write_4(sc, MAC_PORT_0_CONFIG, mac_port_config); + + /*Disable Port 1 */ + mac_port_config = read_4(sc, MAC_PORT_1_CONFIG); + mac_port_config |= (PORT_DISABLE); + write_4(sc, MAC_PORT_1_CONFIG, mac_port_config); + + /* Disable all interrupt status sources. */ + write_4(sc, INTERRUPT_MASK, 0x00001FFF); + + /* Clear previous interrupt sources. */ + write_4(sc, INTERRUPT_STATUS, 0x00001FFF); + + write_4(sc, SWITCH_CONFIG, initial_switch_config); + write_4(sc, CPU_PORT_CONFIG, initial_cpu_config); + write_4(sc, MAC_PORT_0_CONFIG, initial_port0_config); + write_4(sc, MAC_PORT_1_CONFIG, initial_port1_config); + + clear_mac_entries(sc, 1); +} + +static void +ece_restart(struct ece_softc *sc) +{ + struct ifnet *ifp = sc->ifp; + + ifp->if_drv_flags |= IFF_DRV_RUNNING; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + /* Enable port 0. */ + write_4(sc, PORT_0_CONFIG, + read_4(sc, PORT_0_CONFIG) & ~(PORT_DISABLE)); + write_4(sc, INTERRUPT_MASK, 0x00000000); + write_4(sc, FS_DMA_CONTROL, 1); + callout_reset(&sc->tick_ch, hz, ece_tick, sc); +} + +static void +set_filter(struct ece_softc *sc) +{ + struct ifnet *ifp; + struct ifmultiaddr *ifma; + uint32_t mac_port_config; + + ifp = sc->ifp; + + clear_mac_entries(sc, 0); + if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { + mac_port_config = read_4(sc, MAC_PORT_0_CONFIG); + mac_port_config &= ~(DISABLE_BROADCAST_PACKET); + mac_port_config &= ~(DISABLE_MULTICAST_PACKET); + write_4(sc, MAC_PORT_0_CONFIG, mac_port_config); + return; + } + if_maddr_rlock(ifp); + TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { + if (ifma->ifma_addr->sa_family != AF_LINK) + continue; + add_mac_entry(sc, + LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); + } + if_maddr_runlock(ifp); +} + +static int +eceioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct ece_softc *sc = ifp->if_softc; + struct mii_data *mii; + struct ifreq *ifr = (struct ifreq *)data; + int mask, error = 0; + + switch (cmd) { + case SIOCSIFFLAGS: + ECE_LOCK(sc); + if ((ifp->if_flags & IFF_UP) == 0 && + ifp->if_drv_flags & IFF_DRV_RUNNING) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + ecestop(sc); + } else { + /* Reinitialize card on any parameter change. */ + if ((ifp->if_flags & IFF_UP) && + !(ifp->if_drv_flags & IFF_DRV_RUNNING)) + ece_restart(sc); + } + ECE_UNLOCK(sc); + break; + + case SIOCADDMULTI: + case SIOCDELMULTI: + ECE_LOCK(sc); + set_filter(sc); + ECE_UNLOCK(sc); + break; + + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + mii = device_get_softc(sc->miibus); + error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); + break; + case SIOCSIFCAP: + mask = ifp->if_capenable ^ ifr->ifr_reqcap; + if (mask & IFCAP_VLAN_MTU) { + ECE_LOCK(sc); + ECE_UNLOCK(sc); + } + default: + error = ether_ioctl(ifp, cmd, data); + break; + } + return (error); +} + +static void +ece_child_detached(device_t dev, device_t child) +{ + struct ece_softc *sc; + + sc = device_get_softc(dev); + if (child == sc->miibus) + sc->miibus = NULL; +} + +/* + * MII bus support routines. + */ +static int +ece_miibus_readreg(device_t dev, int phy, int reg) +{ + struct ece_softc *sc; + /* Only one phy in this device. */ + if (phy>0) + return (0); + sc = device_get_softc(dev); + return (phy_read(sc, phy, reg)); +} + +static int +ece_miibus_writereg(device_t dev, int phy, int reg, int data) +{ + struct ece_softc *sc; + sc = device_get_softc(dev); + phy_write(sc, phy, reg, data); + return (0); +} + +static device_method_t ece_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ece_probe), + DEVMETHOD(device_attach, ece_attach), + DEVMETHOD(device_detach, ece_detach), + + /* Bus interface */ + DEVMETHOD(bus_child_detached, ece_child_detached), + + /* MII interface */ + DEVMETHOD(miibus_readreg, ece_miibus_readreg), + DEVMETHOD(miibus_writereg, ece_miibus_writereg), + + { 0, 0 } +}; + +static driver_t ece_driver = { + "ece", + ece_methods, + sizeof(struct ece_softc), +}; + +DRIVER_MODULE(ece, econaarm, ece_driver, ece_devclass, 0, 0); +DRIVER_MODULE(miibus, ece, miibus_driver, miibus_devclass, 0, 0); +MODULE_DEPEND(ece, miibus, 1, 1, 1); +MODULE_DEPEND(ece, ether, 1, 1, 1); diff --git a/sys/arm/econa/if_ecereg.h b/sys/arm/econa/if_ecereg.h new file mode 100644 index 000000000000..23929e01a449 --- /dev/null +++ b/sys/arm/econa/if_ecereg.h @@ -0,0 +1,154 @@ +/*- + * Copyright (c) 2009, Yohanes Nugroho + * 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 unmodified, 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$ + */ + +#ifndef _IF_ECEREG_H +#define _IF_ECEREG_H + +#define ETH_CFG 0x08 +#define ETH_CFG_RMII (1 << 15) +#define PHY_CONTROL 0x00 +#define PHY_RW_OK (1<<15) + +#define PHY_ADDRESS(x) ((x) & 0x1) +#define PHY_REGISTER(r) (((r) & 0x1F) << 8) +#define PHY_WRITE_COMMAND (1<<13) +#define PHY_READ_COMMAND (1<<14) +#define PHY_GET_DATA(d) (((d) >> 16) & 0xFFFF) +#define PHY_DATA(d) (((d) & 0xFFFF) << 16) + +#define PORT_0_CONFIG 0x08 + +#define ARL_TABLE_ACCESS_CONTROL_0 0x050 +#define ARL_TABLE_ACCESS_CONTROL_1 0x054 +#define ARL_TABLE_ACCESS_CONTROL_2 0x058 + +#define ARL_WRITE_COMMAND (1<<3) +#define ARL_LOOKUP_COMMAND (1<<2) +#define ARL_COMMAND_COMPLETE (1) + + +#define PORT0 (1 << 0) +#define PORT1 (1 << 1) +#define CPU_PORT (1 << 2) + + +#define VLAN0_GROUP_ID (0) +#define VLAN1_GROUP_ID (1) +#define VLAN2_GROUP_ID (2) +#define VLAN3_GROUP_ID (3) +#define VLAN4_GROUP_ID (4) +#define VLAN5_GROUP_ID (5) +#define VLAN6_GROUP_ID (6) +#define VLAN7_GROUP_ID (7) + +#define PORT0_PVID (VLAN1_GROUP_ID) +#define PORT1_PVID (VLAN2_GROUP_ID) +#define CPU_PORT_PVID (VLAN0_GROUP_ID) + +#define VLAN0_VID (0x111) +#define VLAN1_VID (0x222) +#define VLAN2_VID (0x333) +#define VLAN3_VID (0x444) +#define VLAN4_VID (0x555) +#define VLAN5_VID (0x666) +#define VLAN6_VID (0x777) +#define VLAN7_VID (0x888) + +#define VLAN0_GROUP (PORT0 | PORT1 | CPU_PORT) +#define VLAN1_GROUP (PORT0 | CPU_PORT) +#define VLAN2_GROUP (PORT1 | CPU_PORT) +#define VLAN3_GROUP (0) +#define VLAN4_GROUP (0) +#define VLAN5_GROUP (0) +#define VLAN6_GROUP (0) +#define VLAN7_GROUP (0) + +#define SWITCH_CONFIG 0x004 +#define MAC_PORT_0_CONFIG 0x008 +#define MAC_PORT_1_CONFIG 0x00C +#define CPU_PORT_CONFIG 0x010 +#define BIST_RESULT_TEST_0 0x094 + +#define FS_DMA_CONTROL 0x104 +#define TS_DMA_CONTROL 0x100 + +#define INTERRUPT_MASK 0x08C +#define INTERRUPT_STATUS 0x088 + +#define TS_DESCRIPTOR_POINTER 0x108 +#define TS_DESCRIPTOR_BASE_ADDR 0x110 +#define FS_DESCRIPTOR_POINTER 0x10C +#define FS_DESCRIPTOR_BASE_ADDR 0x114 + + +#define VLAN_VID_0_1 0x060 +#define VLAN_VID_2_3 0x064 +#define VLAN_VID_4_5 0x068 +#define VLAN_VID_6_7 0x06C + +#define VLAN_PORT_PVID 0x05C +#define VLAN_MEMBER_PORT_MAP 0x070 +#define VLAN_TAG_PORT_MAP 0x074 + + +#define ASIX_GIGA_PHY 1 +#define TWO_SINGLE_PHY 2 +#define AGERE_GIGA_PHY 3 +#define VSC8601_GIGA_PHY 4 +#define IC_PLUS_PHY 5 +#define NOT_FOUND_PHY (-1) + +#define MAX_PACKET_LEN (1536) + +#define INVALID_ENTRY 0 +#define NEW_ENTRY 0x1 +#define STATIC_ENTRY 0x7 + +/*mask status except for link change*/ +#define ERROR_MASK 0xFFFFFF7F + +/*hardware interface flags*/ + +#define FAST_AGING (0xf) +#define IVL_LEARNING (0x1 << 22) +/*hardware NAT accelerator*/ +#define HARDWARE_NAT (0x1 << 23) +/*aging time setting*/ + +/*skip lookup*/ +#define SKIP_L2_LOOKUP_PORT_1 (1 << 29) +#define SKIP_L2_LOOKUP_PORT_0 (1 << 28) + +#define NIC_MODE (1 << 30) +#define PORT_DISABLE (1 << 18) +#define SA_LEARNING_DISABLE (1 << 19) +#define DISABLE_BROADCAST_PACKET (1 << 27) +#define DISABLE_MULTICAST_PACKET ( 1 << 26) + +#endif diff --git a/sys/arm/econa/if_ecevar.h b/sys/arm/econa/if_ecevar.h new file mode 100644 index 000000000000..00278ce20064 --- /dev/null +++ b/sys/arm/econa/if_ecevar.h @@ -0,0 +1,193 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho + * 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 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 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$ + */ + +#ifndef _IFECEVAR_H +#define _IFECEVAR_H + +#define ECE_MAX_TX_BUFFERS 128 +#define ECE_MAX_RX_BUFFERS 128 +#define MAX_FRAGMENT 32 + +typedef struct { + /* 1st 32Bits */ + uint32_t data_ptr; + /* 2nd 32Bits*/ + uint32_t length:16; + + uint32_t tco:1; /*tcp checksum offload*/ + uint32_t uco:1; /*udp checksum offload*/ + uint32_t ico:1; /*ip checksum offload*/ + /* force_route_port_map*/ + uint32_t pmap:3; + /* force_route */ + uint32_t fr:1; + /* force_priority_value */ + uint32_t pri:3; + /* force_priority */ + uint32_t fp:1; + /*interrupt_bit*/ + uint32_t interrupt:1; + /*last_seg*/ + uint32_t ls:1; + /*first_seg*/ + uint32_t fs:1; + /* end_bit */ + uint32_t eor:1; + /* c_bit */ + uint32_t cown:1; + /* 3rd 32Bits*/ + /*vid_index*/ + uint32_t vid:3; + /*insert_vid_tag*/ + uint32_t insv:1; + /*pppoe_section_index*/ + uint32_t sid:3; + /*insert_pppoe_section*/ + uint32_t inss:1; + uint32_t unused:24; + /* 4th 32Bits*/ + uint32_t unused2; + +} eth_tx_desc_t; + +typedef struct{ + uint32_t data_ptr; + uint32_t length:16; + uint32_t l4f:1; + uint32_t ipf:1; + uint32_t prot:2; + uint32_t hr:6; + uint32_t sp:2; + uint32_t ls:1; + uint32_t fs:1; + uint32_t eor:1; + uint32_t cown:1; + uint32_t unused; + uint32_t unused2; +} eth_rx_desc_t; + + +struct rx_desc_info { + struct mbuf*buff; + bus_dmamap_t dmamap; + eth_rx_desc_t *desc; +}; + +struct tx_desc_info { + struct mbuf*buff; + bus_dmamap_t dmamap; + eth_tx_desc_t *desc; +}; + + +struct ece_softc +{ + struct ifnet *ifp; /* ifnet pointer */ + struct mtx sc_mtx; /* global mutex */ + struct mtx sc_mtx_tx; /* tx mutex */ + struct mtx sc_mtx_rx; /* rx mutex */ + struct mtx sc_mtx_cleanup; /* rx mutex */ + + bus_dma_tag_t sc_parent_tag; /* parent bus DMA tag */ + + device_t dev; /* Myself */ + device_t miibus; /* My child miibus */ + void *intrhand; /* Interrupt handle */ + void *intrhand_qf; /* queue full */ + void *intrhand_tx; /* tx complete */ + void *intrhand_status; /* error status */ + + struct resource *irq_res_tx; /* transmit */ + struct resource *irq_res_rec; /* receive */ + struct resource *irq_res_qf; /* queue full */ + struct resource *irq_res_status; /* status */ + + struct resource *mem_res; /* Memory resource */ + + struct callout tick_ch; /* Tick callout */ + + struct taskqueue *sc_tq; + struct task sc_intr_task; + struct task sc_cleanup_task; + struct task sc_tx_task; + + bus_dmamap_t dmamap_ring_tx; + bus_dmamap_t dmamap_ring_rx; + bus_dmamap_t rx_sparemap; + + /*dma tag for ring*/ + bus_dma_tag_t dmatag_ring_tx; + bus_dma_tag_t dmatag_ring_rx; + + /*dma tag for data*/ + bus_dma_tag_t dmatag_data_tx; + bus_dma_tag_t dmatag_data_rx; + + /*the ring*/ + eth_tx_desc_t* desc_tx; + eth_rx_desc_t* desc_rx; + + /*ring physical address*/ + bus_addr_t ring_paddr_tx; + bus_addr_t ring_paddr_rx; + + /*index of last received descriptor*/ + uint32_t last_rx; + struct rx_desc_info rx_desc[ECE_MAX_RX_BUFFERS]; + + /* tx producer index */ + uint32_t tx_prod; + /* tx consumer index */ + uint32_t tx_cons; + /* tx ring index*/ + uint32_t desc_curr_tx; + + struct tx_desc_info tx_desc[ECE_MAX_TX_BUFFERS]; +}; + + +struct arl_table_entry_t { + uint32_t cmd_complete: 1; + uint32_t table_end: 1; + uint32_t search_match: 1; + uint32_t filter:1; /*if set, packet will be dropped */ + uint32_t vlan_mac:1; /*indicates that this is the gateway mac address*/ + uint32_t vlan_gid:3; /*vlan id*/ + uint32_t age_field:3; + uint32_t port_map:3; + /*48 bit mac address*/ + uint8_t mac_addr[6]; + uint8_t pad[2]; +}; + +struct mac_list{ + char mac_addr[6]; + struct mac_list *next; +}; + +#endif diff --git a/sys/arm/econa/ohci_ec.c b/sys/arm/econa/ohci_ec.c new file mode 100644 index 000000000000..6bff37629831 --- /dev/null +++ b/sys/arm/econa/ohci_ec.c @@ -0,0 +1,241 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho + * 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include + +#define MEM_RID 0 + +static device_probe_t ohci_ec_probe; +static device_attach_t ohci_ec_attach; +static device_detach_t ohci_ec_detach; + +struct ec_ohci_softc { + struct ohci_softc sc_ohci; /* must be first */ +}; + +static int +ohci_ec_probe(device_t dev) +{ + device_set_desc(dev, "Econa integrated OHCI controller"); + return (BUS_PROBE_DEFAULT); +} + +static int +ohci_ec_attach(device_t dev) +{ + struct ec_ohci_softc *sc = device_get_softc(dev); + bus_space_handle_t bsh; + int err; + int rid; + + /* initialise some bus fields */ + sc->sc_ohci.sc_bus.parent = dev; + sc->sc_ohci.sc_bus.devices = sc->sc_ohci.sc_devices; + sc->sc_ohci.sc_bus.devices_max = OHCI_MAX_DEVICES; + + /* get all DMA memory */ + if (usb_bus_mem_alloc_all(&sc->sc_ohci.sc_bus, + USB_GET_DMA_TAG(dev), &ohci_iterate_hw_softc)) { + return (ENOMEM); + } + sc->sc_ohci.sc_dev = dev; + + rid = MEM_RID; + + sc->sc_ohci.sc_io_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, + &rid, RF_ACTIVE); + + if (!(sc->sc_ohci.sc_io_res)) { + err = ENOMEM; + goto error; + } + sc->sc_ohci.sc_io_tag = rman_get_bustag(sc->sc_ohci.sc_io_res); + bsh = rman_get_bushandle(sc->sc_ohci.sc_io_res); + /* Undocumented magic initialization */ + bus_space_write_4((sc)->sc_ohci.sc_io_tag, bsh,0x04, 0x146); + + bus_space_write_4((sc)->sc_ohci.sc_io_tag, bsh,0x44, 0x0200); + + DELAY(1000); + + sc->sc_ohci.sc_io_size = rman_get_size(sc->sc_ohci.sc_io_res); + + if (bus_space_subregion(sc->sc_ohci.sc_io_tag, bsh, 0x4000000, + sc->sc_ohci.sc_io_size, &sc->sc_ohci.sc_io_hdl) != 0) + panic("%s: unable to subregion USB host registers", + device_get_name(dev)); + + rid = 0; + sc->sc_ohci.sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (!(sc->sc_ohci.sc_irq_res)) { + goto error; + } + sc->sc_ohci.sc_bus.bdev = device_add_child(dev, "usbus", -1); + if (!(sc->sc_ohci.sc_bus.bdev)) { + goto error; + } + device_set_ivars(sc->sc_ohci.sc_bus.bdev, &sc->sc_ohci.sc_bus); + + strlcpy(sc->sc_ohci.sc_vendor, "Cavium", + sizeof(sc->sc_ohci.sc_vendor)); + +#if (__FreeBSD_version >= 700031) + err = bus_setup_intr(dev, sc->sc_ohci.sc_irq_res, + INTR_TYPE_BIO | INTR_MPSAFE, NULL, + (driver_intr_t *)ohci_interrupt, sc, + &sc->sc_ohci.sc_intr_hdl); +#else + err = bus_setup_intr(dev, sc->sc_ohci.sc_irq_res, + INTR_TYPE_BIO | INTR_MPSAFE, + (driver_intr_t *)ohci_interrupt, sc, + &sc->sc_ohci.sc_intr_hdl); +#endif + if (err) { + sc->sc_ohci.sc_intr_hdl = NULL; + goto error; + } + + bus_space_write_4(sc->sc_ohci.sc_io_tag, sc->sc_ohci.sc_io_hdl, + OHCI_CONTROL, 0); + + err = ohci_init(&sc->sc_ohci); + if (!err) { + err = device_probe_and_attach(sc->sc_ohci.sc_bus.bdev); + } + if (err) { + goto error; + } + return (0); + +error: + ohci_ec_detach(dev); + return (ENXIO); +} + +static int +ohci_ec_detach(device_t dev) +{ + struct ec_ohci_softc *sc = device_get_softc(dev); + device_t bdev; + int err; + + if (sc->sc_ohci.sc_bus.bdev) { + bdev = sc->sc_ohci.sc_bus.bdev; + device_detach(bdev); + device_delete_child(dev, bdev); + } + /* during module unload there are lots of children leftover */ + device_delete_all_children(dev); + + bus_space_write_4(sc->sc_ohci.sc_io_tag, sc->sc_ohci.sc_io_hdl, + OHCI_CONTROL, 0); + + if (sc->sc_ohci.sc_irq_res && sc->sc_ohci.sc_intr_hdl) { + /* + * only call ohci_detach() after ohci_init() + */ + ohci_detach(&sc->sc_ohci); + + err = bus_teardown_intr(dev, sc->sc_ohci.sc_irq_res, + sc->sc_ohci.sc_intr_hdl); + sc->sc_ohci.sc_intr_hdl = NULL; + } + if (sc->sc_ohci.sc_irq_res) { + bus_release_resource(dev, SYS_RES_IRQ, 0, + sc->sc_ohci.sc_irq_res); + sc->sc_ohci.sc_irq_res = NULL; + } + if (sc->sc_ohci.sc_io_res) { + bus_release_resource(dev, SYS_RES_MEMORY, MEM_RID, + sc->sc_ohci.sc_io_res); + sc->sc_ohci.sc_io_res = NULL; + } + usb_bus_mem_free_all(&sc->sc_ohci.sc_bus, &ohci_iterate_hw_softc); + + return (0); +} + +static device_method_t ohci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ohci_ec_probe), + DEVMETHOD(device_attach, ohci_ec_attach), + DEVMETHOD(device_detach, ohci_ec_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + + {0, 0} +}; + +static driver_t ohci_driver = { + "ohci", + ohci_methods, + sizeof(struct ec_ohci_softc), +}; + +static devclass_t ohci_devclass; + +DRIVER_MODULE(ohci, econaarm, ohci_driver, ohci_devclass, 0, 0); +MODULE_DEPEND(ohci, usb, 1, 1, 1); diff --git a/sys/arm/econa/std.econa b/sys/arm/econa/std.econa new file mode 100644 index 000000000000..660648da8c10 --- /dev/null +++ b/sys/arm/econa/std.econa @@ -0,0 +1,14 @@ +# $FreeBSD$ + +files "../econa/files.econa" +cpu CPU_FA526 +makeoptions CONF_CFLAGS=-march=armv4 +options PHYSADDR=0x00000000 +makeoptions KERNPHYSADDR=0x01000000 +makeoptions KERNVIRTADDR=0xc1000000 + +options KERNPHYSADDR=0x01000000 +options KERNVIRTADDR=0xc1000000 # Used in ldscript.arm +options FLASHADDR=0xD0000000 +options LOADERRAMADDR=0x00000000 +options STARTUP_PAGETABLE_ADDR=0x00100000 diff --git a/sys/arm/econa/timer.c b/sys/arm/econa/timer.c new file mode 100644 index 000000000000..e7cca790d2d0 --- /dev/null +++ b/sys/arm/econa/timer.c @@ -0,0 +1,382 @@ +/*- + * Copyright (c) 2009 Yohanes Nugroho . + * 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 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "econa_reg.h" +#include "econa_var.h" + +#define INITIAL_TIMECOUNTER (0xffffffff) + +static int timers_initialized = 0; + +#define HZ 100 + +extern unsigned int CPU_clock; +extern unsigned int AHB_clock; +extern unsigned int APB_clock; + +static unsigned long timer_counter = 0; + +struct ec_timer_softc { + struct resource * timer_res[3]; + bus_space_tag_t timer_bst; + bus_space_handle_t timer_bsh; + struct mtx timer_mtx; +}; + +static struct resource_spec ec_timer_spec[] = { + { SYS_RES_MEMORY, 0, RF_ACTIVE }, + { SYS_RES_IRQ, 0, RF_ACTIVE }, + { SYS_RES_IRQ, 1, RF_ACTIVE }, + { -1, 0 } +}; + +static unsigned ec_timer_get_timecount(struct timecounter *); + +static struct timecounter ec_timecounter = { + .tc_get_timecount = ec_timer_get_timecount, + .tc_name = "CPU Timer", + /* This is assigned on the fly in the init sequence */ + .tc_frequency = 0, + .tc_counter_mask = ~0u, + .tc_quality = 1000, +}; + +static struct ec_timer_softc *timer_softc = NULL; + +static inline +void write_4(unsigned int val, unsigned int addr) +{ + bus_space_write_4(timer_softc->timer_bst, + timer_softc->timer_bsh, addr, val); + +} + +static inline +unsigned int read_4(unsigned int addr) +{ + + return bus_space_read_4(timer_softc->timer_bst, + timer_softc->timer_bsh, addr); +} + +#define uSECS_PER_TICK (1000000 / APB_clock) +#define TICKS2USECS(x) ((x) * uSECS_PER_TICK) + +static unsigned +read_timer_counter_noint(void) +{ + + arm_mask_irq(0); + unsigned int v = read_4(TIMER_TM1_COUNTER_REG); + arm_unmask_irq(0); + return v; +} + +void +DELAY(int usec) +{ + uint32_t val, val_temp; + int nticks; + + if (!timers_initialized) { + for (; usec > 0; usec--) + for (val = 100; val > 0; val--) + ; + return; + } + + val = read_timer_counter_noint(); + nticks = (((APB_clock / 1000) * usec) / 1000) + 100; + + while (nticks > 0) { + val_temp = read_timer_counter_noint(); + if (val > val_temp) + nticks -= (val - val_temp); + else + nticks -= (val + (timer_counter - val_temp)); + + val = val_temp; + } + +} + +/* + * Setup timer + */ +static inline void +setup_timer(unsigned int counter_value) +{ + unsigned int control_value; + unsigned int mask_value; + + control_value = read_4(TIMER_TM_CR_REG); + + mask_value = read_4(TIMER_TM_INTR_MASK_REG); + write_4(counter_value, TIMER_TM1_COUNTER_REG); + write_4(counter_value, TIMER_TM1_LOAD_REG); + write_4(0, TIMER_TM1_MATCH1_REG); + write_4(0,TIMER_TM1_MATCH2_REG); + + control_value &= ~(TIMER1_CLOCK_SOURCE); + control_value |= TIMER1_UP_DOWN_COUNT; + + write_4(0, TIMER_TM2_COUNTER_REG); + write_4(0, TIMER_TM2_LOAD_REG); + write_4(~0u, TIMER_TM2_MATCH1_REG); + write_4(~0u,TIMER_TM2_MATCH2_REG); + + control_value &= ~(TIMER2_CLOCK_SOURCE); + control_value &= ~(TIMER2_UP_DOWN_COUNT); + + mask_value &= ~(63); + + write_4(control_value, TIMER_TM_CR_REG); + write_4(mask_value, TIMER_TM_INTR_MASK_REG); +} + +/* + * Enable timer + */ +static inline void +timer_enable(void) +{ + unsigned int control_value; + + control_value = read_4(TIMER_TM_CR_REG); + + control_value |= TIMER1_OVERFLOW_ENABLE; + control_value |= TIMER1_ENABLE; + control_value |= TIMER2_OVERFLOW_ENABLE; + control_value |= TIMER2_ENABLE; + + write_4(control_value, TIMER_TM_CR_REG); +} + +static inline unsigned int +read_second_timer_counter(void) +{ + + return read_4(TIMER_TM2_COUNTER_REG); +} + +/* + * Get timer interrupt status + */ +static inline unsigned int +read_timer_interrupt_status(void) +{ + + return read_4(TIMER_TM_INTR_STATUS_REG); +} + +/* + * Clear timer interrupt status + */ +static inline void +clear_timer_interrupt_status(unsigned int irq) +{ + unsigned int interrupt_status; + + interrupt_status = read_4(TIMER_TM_INTR_STATUS_REG); + if (irq == 0) { + if (interrupt_status & (TIMER1_MATCH1_INTR)) + interrupt_status &= ~(TIMER1_MATCH1_INTR); + if (interrupt_status & (TIMER1_MATCH2_INTR)) + interrupt_status &= ~(TIMER1_MATCH2_INTR); + if (interrupt_status & (TIMER1_OVERFLOW_INTR)) + interrupt_status &= ~(TIMER1_OVERFLOW_INTR); + } + if (irq == 1) { + if (interrupt_status & (TIMER2_MATCH1_INTR)) + interrupt_status &= ~(TIMER2_MATCH1_INTR); + if (interrupt_status & (TIMER2_MATCH2_INTR)) + interrupt_status &= ~(TIMER2_MATCH2_INTR); + if (interrupt_status & (TIMER2_OVERFLOW_INTR)) + interrupt_status &= ~(TIMER2_OVERFLOW_INTR); + } + + write_4(interrupt_status, TIMER_TM_INTR_STATUS_REG); +} + +static unsigned +ec_timer_get_timecount(struct timecounter *a) +{ + unsigned int ticks1; + arm_mask_irq(1); + ticks1 = read_second_timer_counter(); + arm_unmask_irq(1); + return ticks1; +} + +/* + * Setup timer + */ +static inline void +do_setup_timer(void) +{ + + timer_counter = APB_clock/HZ; + /* + * setup timer-related values + */ + setup_timer(timer_counter); +} + +void +cpu_initclocks(void) +{ + + ec_timecounter.tc_frequency = APB_clock; + tc_init(&ec_timecounter); + timer_enable(); + timers_initialized = 1; +} + +void +cpu_startprofclock(void) +{ + +} + +void +cpu_stopprofclock(void) +{ + +} + +static int +ec_timer_probe(device_t dev) +{ + + device_set_desc(dev, "Econa CPU Timer"); + return (0); +} + +static int +ec_reset(void *arg) +{ + + arm_mask_irq(1); + clear_timer_interrupt_status(1); + arm_unmask_irq(1); + return (FILTER_HANDLED); +} + +static int +ec_hardclock(void *arg) +{ + struct trapframe *frame; + unsigned int val; + /*clear timer interrupt status*/ + + arm_mask_irq(0); + + val = read_4(TIMER_INTERRUPT_STATUS_REG); + val &= ~(TIMER1_OVERFLOW_INTERRUPT); + write_4(val, TIMER_INTERRUPT_STATUS_REG); + + frame = (struct trapframe *)arg; + hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); + + arm_unmask_irq(0); + + return (FILTER_HANDLED); +} + +static int +ec_timer_attach(device_t dev) +{ + struct ec_timer_softc *sc; + int error; + void *ihl; + + + if (timer_softc != NULL) + return (ENXIO); + + sc = (struct ec_timer_softc *)device_get_softc(dev); + + timer_softc = sc; + + error = bus_alloc_resources(dev, ec_timer_spec, sc->timer_res); + if (error) { + device_printf(dev, "could not allocate resources\n"); + return (ENXIO); + } + + sc->timer_bst = rman_get_bustag(sc->timer_res[0]); + sc->timer_bsh = rman_get_bushandle(sc->timer_res[0]); + + do_setup_timer(); + + if (bus_setup_intr(dev, sc->timer_res[1], INTR_TYPE_CLK, + ec_hardclock, NULL, NULL, &ihl) != 0) { + bus_release_resources(dev, ec_timer_spec, sc->timer_res); + device_printf(dev, "could not setup hardclock interrupt\n"); + return (ENXIO); + } + + if (bus_setup_intr(dev, sc->timer_res[2], INTR_TYPE_CLK, + ec_reset, NULL, NULL, &ihl) != 0) { + bus_release_resources(dev, ec_timer_spec, sc->timer_res); + device_printf(dev, "could not setup timer interrupt\n"); + return (ENXIO); + } + + return (0); +} + +static device_method_t ec_timer_methods[] = { + DEVMETHOD(device_probe, ec_timer_probe), + DEVMETHOD(device_attach, ec_timer_attach), + { 0, 0 } +}; + +static driver_t ec_timer_driver = { + "timer", + ec_timer_methods, + sizeof(struct ec_timer_softc), +}; + +static devclass_t ec_timer_devclass; + +DRIVER_MODULE(timer, econaarm, ec_timer_driver, ec_timer_devclass, 0, 0); diff --git a/lib/libutil/login.c b/sys/arm/econa/uart_bus_ec.c similarity index 50% rename from lib/libutil/login.c rename to sys/arm/econa/uart_bus_ec.c index 12fc348755e3..1a40e7f1be33 100644 --- a/lib/libutil/login.c +++ b/sys/arm/econa/uart_bus_ec.c @@ -1,6 +1,7 @@ /*- - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. + * Copyright (C) 2009 Yohanes Nugroho + * All rights reserved. + * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,14 +11,14 @@ * 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 + * 3. Neither the name of MARVELL nor the names of 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 + * THIS SOFTWARE IS PROVIDED BY 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 REGENTS OR CONTRIBUTORS BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL 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) @@ -27,45 +28,52 @@ * SUCH DAMAGE. */ - #include __FBSDID("$FreeBSD$"); -#if defined(LIBC_SCCS) && !defined(lint) -#if 0 -static char sccsid[] = "@(#)login.c 8.1 (Berkeley) 6/4/93"; -#endif -#endif /* LIBC_SCCS and not lint */ +#include +#include +#include +#include +#include +#include -#include +#include +#include +#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include -void -login(struct utmp *ut) +#include + +static int uart_ec_probe(device_t dev); + +static device_method_t uart_ec_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, uart_ec_probe), + DEVMETHOD(device_attach, uart_bus_attach), + DEVMETHOD(device_detach, uart_bus_detach), + { 0, 0 } +}; + +static driver_t uart_ec_driver = { + uart_driver_name, + uart_ec_methods, + sizeof(struct uart_softc), +}; + +static int +uart_ec_probe(device_t dev) { - struct ttyent *ty; - int fd; - int tty; + struct uart_softc *sc; + int status; - setttyent(); - for (tty = 1; (ty = getttyent()) != NULL; ++tty) - if (strcmp(ty->ty_name, ut->ut_line) == 0) - break; - endttyent(); - if (tty > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) { - (void)lseek(fd, (off_t)(tty * sizeof(struct utmp)), L_SET); - (void)write(fd, ut, sizeof(struct utmp)); - (void)close(fd); - } - if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) { - (void)write(fd, ut, sizeof(struct utmp)); - (void)close(fd); - } + sc = device_get_softc(dev); + sc->sc_class = &uart_ns8250_class; + status = uart_bus_probe(dev, EC_UART_REGSHIFT, EC_UART_CLOCK, 0, 0); + return (status); } + +DRIVER_MODULE(uart, econaarm, uart_ec_driver, uart_devclass, 0, 0); diff --git a/sys/arm/econa/uart_cpu_ec.c b/sys/arm/econa/uart_cpu_ec.c new file mode 100644 index 000000000000..3d42cda0f9e3 --- /dev/null +++ b/sys/arm/econa/uart_cpu_ec.c @@ -0,0 +1,87 @@ +/*- + * Copyright (C) 2009 Yohanes Nugroho + * All rights reserved. + * + * Developed by Semihalf. + * + * 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. Neither the name of MARVELL nor the names of contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY 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 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 "opt_uart.h" + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +#include +#include + +#include + +#include +#include + +bus_space_tag_t uart_bus_space_io; +bus_space_tag_t uart_bus_space_mem; + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + +int +uart_cpu_getdev(int devtype, struct uart_devinfo *di) +{ + struct uart_class *class = &uart_ns8250_class; + + di->ops = uart_getops(class); + di->bas.chan = 0; + di->bas.bst = obio_tag; + + if (bus_space_map(di->bas.bst, ECONA_IO_BASE + ECONA_UART_BASE, + ECONA_UART_SIZE, + 0, &di->bas.bsh) != 0) { + return (ENXIO); + } + + di->baudrate = 0; + di->bas.regshft = EC_UART_REGSHIFT; + di->bas.rclk = EC_UART_CLOCK ; + di->databits = 8; + di->stopbits = 1; + di->parity = UART_PARITY_NONE; + uart_bus_space_mem = obio_tag; + uart_bus_space_io = NULL; + + return (0); +} diff --git a/sys/arm/include/_inttypes.h b/sys/arm/include/_inttypes.h index 7da589d8a771..ca70a7a95785 100644 --- a/sys/arm/include/_inttypes.h +++ b/sys/arm/include/_inttypes.h @@ -13,13 +13,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/include/_stdint.h b/sys/arm/include/_stdint.h index 0d8aedfff5d6..45c0605c3349 100644 --- a/sys/arm/include/_stdint.h +++ b/sys/arm/include/_stdint.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/include/armreg.h b/sys/arm/include/armreg.h index 0f8026696fc9..0d42ae4cd5ac 100644 --- a/sys/arm/include/armreg.h +++ b/sys/arm/include/armreg.h @@ -152,6 +152,7 @@ #define CPU_ID_MV88FR571_VD 0x56155710 /* Marvell Feroceon 88FR571-VD Core (ID from datasheet) */ #define CPU_ID_MV88FR571_41 0x41159260 /* Marvell Feroceon 88FR571-VD Core (actual ID from CPU reg) */ #define CPU_ID_FA526 0x66015260 +#define CPU_ID_FA626TE 0x66056260 #define CPU_ID_SA1110 0x6901b110 #define CPU_ID_IXP1200 0x6901c120 #define CPU_ID_80200 0x69052000 diff --git a/sys/arm/include/bus.h b/sys/arm/include/bus.h index e9963a6cb086..4080c3371355 100644 --- a/sys/arm/include/bus.h +++ b/sys/arm/include/bus.h @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/include/bus_dma.h b/sys/arm/include/bus_dma.h index 55edee9feebb..98803efd6b7f 100644 --- a/sys/arm/include/bus_dma.h +++ b/sys/arm/include/bus_dma.h @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/include/cpuconf.h b/sys/arm/include/cpuconf.h index 458507a9265b..942b59169334 100644 --- a/sys/arm/include/cpuconf.h +++ b/sys/arm/include/cpuconf.h @@ -61,6 +61,7 @@ defined(CPU_XSCALE_80200) + \ defined(CPU_XSCALE_80321) + \ defined(CPU_XSCALE_PXA2X0) + \ + defined(CPU_FA526) + \ defined(CPU_XSCALE_IXP425)) /* @@ -68,7 +69,7 @@ */ #if (defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) || \ defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \ - defined(CPU_IXP12X0) || defined(CPU_XSCALE_IXP425)) + defined(CPU_IXP12X0) || defined(CPU_XSCALE_IXP425) || defined(CPU_FA526)) #define ARM_ARCH_4 1 #else #define ARM_ARCH_4 0 @@ -125,7 +126,7 @@ #if (defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) || \ defined(CPU_ARM8) || defined(CPU_ARM9) || defined(CPU_ARM9E) || \ - defined(CPU_ARM10) || defined(CPU_ARM11)) + defined(CPU_ARM10) || defined(CPU_ARM11) || defined(CPU_FA526)) #define ARM_MMU_GENERIC 1 #else #define ARM_MMU_GENERIC 0 diff --git a/sys/arm/include/cpufunc.h b/sys/arm/include/cpufunc.h index 74f21e41188d..849496685351 100644 --- a/sys/arm/include/cpufunc.h +++ b/sys/arm/include/cpufunc.h @@ -283,6 +283,28 @@ void arm8_setup (char *string); u_int arm8_clock_config (u_int, u_int); #endif + +#ifdef CPU_FA526 +void fa526_setup (char *arg); +void fa526_setttb (u_int ttb); +void fa526_context_switch (void); +void fa526_cpu_sleep (int); +void fa526_tlb_flushI_SE (u_int); +void fa526_tlb_flushID_SE (u_int); +void fa526_flush_prefetchbuf (void); +void fa526_flush_brnchtgt_E (u_int); + +void fa526_icache_sync_all (void); +void fa526_icache_sync_range(vm_offset_t start, vm_size_t end); +void fa526_dcache_wbinv_all (void); +void fa526_dcache_wbinv_range(vm_offset_t start, vm_size_t end); +void fa526_dcache_inv_range (vm_offset_t start, vm_size_t end); +void fa526_dcache_wb_range (vm_offset_t start, vm_size_t end); +void fa526_idcache_wbinv_all(void); +void fa526_idcache_wbinv_range(vm_offset_t start, vm_size_t end); +#endif + + #ifdef CPU_SA110 void sa110_setup (char *string); void sa110_context_switch (void); @@ -445,6 +467,7 @@ extern unsigned armv5_dcache_index_inc; #if defined(CPU_ARM9) || defined(CPU_ARM9E) || defined(CPU_ARM10) || \ defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \ defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ + defined(CPU_FA526) || \ defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425) || \ defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) diff --git a/sys/arm/include/elf.h b/sys/arm/include/elf.h index ee2843fb1354..0660ba6bea6a 100644 --- a/sys/arm/include/elf.h +++ b/sys/arm/include/elf.h @@ -97,4 +97,7 @@ __ElfType(Auxinfo); * value. */ #define MAGIC_TRAMP_NUMBER 0x5c000003 + +#define ET_DYN_LOAD_ADDR 0x12000 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/arm/include/md_var.h b/sys/arm/include/md_var.h index 1f622e2471c9..7a19d33c865e 100644 --- a/sys/arm/include/md_var.h +++ b/sys/arm/include/md_var.h @@ -57,6 +57,7 @@ enum cpu_class { CPU_CLASS_ARM7, CPU_CLASS_ARM7TDMI, CPU_CLASS_ARM8, + CPU_CLASS_ARM9, CPU_CLASS_ARM9TDMI, CPU_CLASS_ARM9ES, CPU_CLASS_ARM9EJS, diff --git a/sys/arm/include/pmc_mdep.h b/sys/arm/include/pmc_mdep.h index 9c719cbfa813..115d4fe14811 100644 --- a/sys/arm/include/pmc_mdep.h +++ b/sys/arm/include/pmc_mdep.h @@ -1,5 +1,27 @@ /*- - * This file is in the public domain. + * Copyright (c) 2009 Rui Paulo + * 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 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$ */ @@ -7,6 +29,14 @@ #ifndef _MACHINE_PMC_MDEP_H_ #define _MACHINE_PMC_MDEP_H_ +#define PMC_MDEP_CLASS_INDEX_XSCALE 0 +/* + * On the ARM platform we support the following PMCs. + * + * XSCALE Intel XScale processors + */ +#include + union pmc_md_op_pmcallocate { uint64_t __pad[4]; }; @@ -15,14 +45,20 @@ union pmc_md_op_pmcallocate { #define PMCLOG_READADDR PMCLOG_READ32 #define PMCLOG_EMITADDR PMCLOG_EMIT32 -#if _KERNEL +#ifdef _KERNEL union pmc_md_pmc { + struct pmc_md_xscale_pmc pm_xscale; }; -#define PMC_TRAPFRAME_TO_PC(TF) (0) /* Stubs */ -#define PMC_TRAPFRAME_TO_FP(TF) (0) -#define PMC_TRAPFRAME_TO_SP(TF) (0) +#define PMC_TRAPFRAME_TO_PC(TF) ((TF)->tf_pc) +#define PMC_TRAPFRAME_TO_FP(TF) ((TF)->tf_usr_lr) +#define PMC_TRAPFRAME_TO_SP(TF) ((TF)->tf_usr_sp) -#endif +/* + * Prototypes + */ +struct pmc_mdep *pmc_xscale_initialize(void); +void pmc_xscale_finalize(struct pmc_mdep *_md); +#endif /* _KERNEL */ #endif /* !_MACHINE_PMC_MDEP_H_ */ diff --git a/sys/arm/include/ucontext.h b/sys/arm/include/ucontext.h index b1f1d63e56c8..cebf2ada2c25 100644 --- a/sys/arm/include/ucontext.h +++ b/sys/arm/include/ucontext.h @@ -15,13 +15,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/mv/mv_machdep.c b/sys/arm/mv/mv_machdep.c index 2dc20ceb08ea..479a105ef0f8 100644 --- a/sys/arm/mv/mv_machdep.c +++ b/sys/arm/mv/mv_machdep.c @@ -72,7 +72,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -407,8 +406,7 @@ initarm(void *mdp, void *unused __unused) } availmem_regions_sz = i; } else { - /* Fall back to hardcoded boothowto flags and metadata. */ - boothowto = RB_VERBOSE | RB_SINGLE; + /* Fall back to hardcoded metadata. */ lastaddr = fake_preload_metadata(); /* diff --git a/sys/arm/mv/mv_sata.c b/sys/arm/mv/mv_sata.c index 13372526ccef..01713daa27cb 100644 --- a/sys/arm/mv/mv_sata.c +++ b/sys/arm/mv/mv_sata.c @@ -136,7 +136,8 @@ static int sata_channel_detach(device_t dev); static int sata_channel_begin_transaction(struct ata_request *request); static int sata_channel_end_transaction(struct ata_request *request); static int sata_channel_status(device_t dev); -static void sata_channel_setmode(device_t parent, device_t dev); +static int sata_channel_setmode(device_t dev, int target, int mode); +static int sata_channel_getrev(device_t dev, int target); static void sata_channel_reset(device_t dev); static void sata_channel_dmasetprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); @@ -423,7 +424,7 @@ sata_channel_attach(device_t dev) ch->dev = dev; ch->unit = device_get_unit(dev); - ch->flags |= ATA_USE_16BIT | ATA_NO_SLAVE; + ch->flags |= ATA_USE_16BIT | ATA_NO_SLAVE | ATA_SATA; /* Set legacy ATA resources. */ for (i = ATA_DATA; i <= ATA_COMMAND; i++) { @@ -548,14 +549,16 @@ sata_channel_begin_transaction(struct ata_request *request) uint32_t req_in; int error, slot; - sc = device_get_softc(GRANDPARENT(request->dev)); + sc = device_get_softc(device_get_parent(request->parent)); ch = device_get_softc(request->parent); mtx_assert(&ch->state_mtx, MA_OWNED); /* Only DMA R/W goes through the EDMA machine. */ if (request->u.ata.command != ATA_READ_DMA && - request->u.ata.command != ATA_WRITE_DMA) { + request->u.ata.command != ATA_WRITE_DMA && + request->u.ata.command != ATA_READ_DMA48 && + request->u.ata.command != ATA_WRITE_DMA48) { /* Disable EDMA before accessing legacy registers */ if (sata_edma_is_running(request->parent)) { @@ -569,12 +572,9 @@ sata_channel_begin_transaction(struct ata_request *request) return (ata_begin_transaction(request)); } - /* Check for 48 bit access and convert if needed */ - ata_modify_if_48bit(request); - /* Prepare data for DMA */ if ((error = ch->dma.load(request, NULL, NULL))) { - device_printf(request->dev, "setting up DMA failed!\n"); + device_printf(request->parent, "setting up DMA failed!\n"); request->result = error; return ATA_OP_FINISHED; } @@ -633,7 +633,7 @@ sata_channel_end_transaction(struct ata_request *request) uint32_t res_in, res_out, icr; int slot; - sc = device_get_softc(GRANDPARENT(request->dev)); + sc = device_get_softc(device_get_parent(request->parent)); ch = device_get_softc(request->parent); mtx_assert(&ch->state_mtx, MA_OWNED); @@ -749,19 +749,22 @@ sata_channel_reset(device_t dev) SATA_OUTL(sc, SATA_EDMA_IEMR(ch->unit), 0xFFFFFFFF); } -static void -sata_channel_setmode(device_t parent, device_t dev) +static int +sata_channel_setmode(device_t parent, int target, int mode) { - struct ata_device *atadev; - - atadev = device_get_softc(dev); /* Disable EDMA before using legacy registers */ sata_edma_ctrl(parent, 0); + return (ata_sata_setmode(parent, target, mode)); +} - ata_sata_setmode(dev, ATA_PIO_MAX); - if (atadev->mode >= ATA_DMA) - ata_sata_setmode(dev, atadev->mode); +static int +sata_channel_getrev(device_t parent, int target) +{ + + /* Disable EDMA before using legacy registers */ + sata_edma_ctrl(parent, 0); + return (ata_sata_getrev(parent, target)); } static void @@ -850,6 +853,7 @@ static device_method_t sata_channel_methods[] = { /* ATA channel interface */ DEVMETHOD(ata_reset, sata_channel_reset), DEVMETHOD(ata_setmode, sata_channel_setmode), + DEVMETHOD(ata_getrev, sata_channel_getrev), { 0, 0 } }; diff --git a/sys/arm/sa11x0/assabet_machdep.c b/sys/arm/sa11x0/assabet_machdep.c index 521f3c309e69..c02595ffed6a 100644 --- a/sys/arm/sa11x0/assabet_machdep.c +++ b/sys/arm/sa11x0/assabet_machdep.c @@ -82,7 +82,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/arm/sa11x0/sa11x0.c b/sys/arm/sa11x0/sa11x0.c index 90ed918c10db..bfffe6a6df60 100644 --- a/sys/arm/sa11x0/sa11x0.c +++ b/sys/arm/sa11x0/sa11x0.c @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. */ /*- * Copyright (c) 1999 diff --git a/sys/arm/sa11x0/sa11x0_dmacreg.h b/sys/arm/sa11x0/sa11x0_dmacreg.h index 9112e2104f38..a4b5fb72362c 100644 --- a/sys/arm/sa11x0/sa11x0_dmacreg.h +++ b/sys/arm/sa11x0/sa11x0_dmacreg.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 diff --git a/sys/arm/sa11x0/sa11x0_gpioreg.h b/sys/arm/sa11x0/sa11x0_gpioreg.h index 9f46e9d18d81..c43a6c1ebd80 100644 --- a/sys/arm/sa11x0/sa11x0_gpioreg.h +++ b/sys/arm/sa11x0/sa11x0_gpioreg.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/sa11x0/sa11x0_irq.S b/sys/arm/sa11x0/sa11x0_irq.S index 3b6d23ea91a4..30f250cfc25e 100644 --- a/sys/arm/sa11x0/sa11x0_irq.S +++ b/sys/arm/sa11x0/sa11x0_irq.S @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Mark Brinicombe - * for the NetBSD Project. - * 4. The name of the company nor the name of the author may be used to - * endorse or promote products derived from this software without specific - * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF diff --git a/sys/arm/sa11x0/sa11x0_irqhandler.c b/sys/arm/sa11x0/sa11x0_irqhandler.c index e423055728ba..30446fa78534 100644 --- a/sys/arm/sa11x0/sa11x0_irqhandler.c +++ b/sys/arm/sa11x0/sa11x0_irqhandler.c @@ -19,13 +19,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/sa11x0/sa11x0_ostreg.h b/sys/arm/sa11x0/sa11x0_ostreg.h index c03aea1827fe..92039aec9020 100644 --- a/sys/arm/sa11x0/sa11x0_ostreg.h +++ b/sys/arm/sa11x0/sa11x0_ostreg.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/sa11x0/sa11x0_ppcreg.h b/sys/arm/sa11x0/sa11x0_ppcreg.h index 52c129a3a29d..2c171504e811 100644 --- a/sys/arm/sa11x0/sa11x0_ppcreg.h +++ b/sys/arm/sa11x0/sa11x0_ppcreg.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 diff --git a/sys/arm/sa11x0/sa11x0_reg.h b/sys/arm/sa11x0/sa11x0_reg.h index 2bd065aff7cd..8f747231d85c 100644 --- a/sys/arm/sa11x0/sa11x0_reg.h +++ b/sys/arm/sa11x0/sa11x0_reg.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/arm/sa11x0/sa11x0_var.h b/sys/arm/sa11x0/sa11x0_var.h index 8a566d84fe82..8c5929a9e3ea 100644 --- a/sys/arm/sa11x0/sa11x0_var.h +++ b/sys/arm/sa11x0/sa11x0_var.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 diff --git a/sys/arm/xscale/i80321/i80321_timer.c b/sys/arm/xscale/i80321/i80321_timer.c index 7b2fdcb5d049..78492b81f1af 100644 --- a/sys/arm/xscale/i80321/i80321_timer.c +++ b/sys/arm/xscale/i80321/i80321_timer.c @@ -66,8 +66,6 @@ __FBSDID("$FreeBSD$"); definitions overrides the ones from i80321reg.h */ #endif -#include - #include "opt_timer.h" void (*i80321_hardclock_hook)(void) = NULL; diff --git a/sys/arm/xscale/ixp425/cambria_fled.c b/sys/arm/xscale/ixp425/cambria_fled.c index ede1577c2263..7f678c898963 100644 --- a/sys/arm/xscale/ixp425/cambria_fled.c +++ b/sys/arm/xscale/ixp425/cambria_fled.c @@ -74,6 +74,8 @@ fled_attach(device_t dev) sc->sc_led = led_create(fled_cb, dev, "front"); + fled_cb(sc, 1); /* Turn on LED */ + return 0; } diff --git a/sys/arm/xscale/ixp425/files.ixp425 b/sys/arm/xscale/ixp425/files.ixp425 index 2ac7aca83ae2..13d5f52a5423 100644 --- a/sys/arm/xscale/ixp425/files.ixp425 +++ b/sys/arm/xscale/ixp425/files.ixp425 @@ -16,6 +16,7 @@ arm/xscale/ixp425/uart_bus_ixp425.c optional uart arm/xscale/ixp425/ixp425_a4x_space.c optional uart arm/xscale/ixp425/ixp425_a4x_io.S optional uart dev/cfi/cfi_bus_ixp4xx.c optional cfi +dev/hwpmc/hwpmc_xscale.c optional hwpmc dev/uart/uart_dev_ns8250.c optional uart # # NPE-based Ethernet support (requires qmgr also). diff --git a/sys/arm/xscale/xscalereg.h b/sys/arm/xscale/xscalereg.h deleted file mode 100644 index 85e64d194cdc..000000000000 --- a/sys/arm/xscale/xscalereg.h +++ /dev/null @@ -1,73 +0,0 @@ -/* $NetBSD: xscalereg.h,v 1.2 2002/08/07 05:15:02 briggs Exp $ */ - -/*- - * Copyright (c) 2001 Wasabi Systems, Inc. - * All rights reserved. - * - * Written by Jason R. Thorpe for Wasabi Systems, Inc. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed for the NetBSD Project by - * Wasabi Systems, Inc. - * 4. The name of Wasabi Systems, Inc. may not be used to endorse - * or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC - * 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$ - */ - -#ifndef _ARM_XSCALE_XSCALEREG_H_ -#define _ARM_XSCALE_XSCALEREG_H_ - -/* - * Register definitions for the Intel XScale processor core. - */ - -/* - * Performance Monitoring Unit (CP14) - * - * CP14.0 Performance Monitor Control Register - * CP14.1 Clock Counter - * CP14.2 Performance Counter Register 0 - * CP14.3 Performance Counter Register 1 - */ - -#define PMNC_E 0x00000001 /* enable counters */ -#define PMNC_P 0x00000002 /* reset both PMNs to 0 */ -#define PMNC_C 0x00000004 /* clock counter reset */ -#define PMNC_D 0x00000008 /* clock counter / 64 */ -#define PMNC_PMN0_IE 0x00000010 /* enable PMN0 interrupt */ -#define PMNC_PMN1_IE 0x00000020 /* enable PMN1 interrupt */ -#define PMNC_CC_IE 0x00000040 /* enable clock counter interrupt */ -#define PMNC_PMN0_IF 0x00000100 /* PMN0 overflow/interrupt */ -#define PMNC_PMN1_IF 0x00000200 /* PMN1 overflow/interrupt */ -#define PMNC_CC_IF 0x00000400 /* clock counter overflow/interrupt */ -#define PMNC_EVCNT0_MASK 0x000ff000 /* event to count for PMN0 */ -#define PMNC_EVCNT0_SHIFT 12 -#define PMNC_EVCNT1_MASK 0x0ff00000 /* event to count for PMN1 */ -#define PMNC_EVCNT1_SHIFT 20 - -void xscale_pmu_init(void); - -#endif /* _ARM_XSCALE_XSCALEREG_H_ */ diff --git a/sys/boot/Makefile b/sys/boot/Makefile index 02c767df0d2d..056dc68d6c49 100644 --- a/sys/boot/Makefile +++ b/sys/boot/Makefile @@ -22,7 +22,7 @@ SUBDIR+= ofw SUBDIR+= uboot .endif -.if defined(LOADER_ZFS_SUPPORT) +.if ${MACHINE_ARCH} == "amd64" || ${MACHINE} == "i386" SUBDIR+= zfs .endif diff --git a/sys/boot/common/Makefile.inc b/sys/boot/common/Makefile.inc index 9ede3866fb3b..bb0d12098601 100644 --- a/sys/boot/common/Makefile.inc +++ b/sys/boot/common/Makefile.inc @@ -23,6 +23,11 @@ SRCS+= dev_net.c SRCS+= bcache.c .endif +.if defined(MD_IMAGE_SIZE) +CFLAGS+= -DMD_IMAGE_SIZE=${MD_IMAGE_SIZE} +SRCS+= md.c +.endif + # Machine-independant ISA PnP .if defined(HAVE_ISABUS) SRCS+= isapnp.c @@ -38,4 +43,8 @@ MAN+= ../forth/loader.conf.5 MAN+= ../forth/loader.4th.8 .endif +.if defined(BOOT_PROMPT_123) +CFLAGS+= -DBOOT_PROMPT_123 +.endif + MAN+= loader.8 diff --git a/sys/boot/common/boot.c b/sys/boot/common/boot.c index 315c039b4666..c6ab6812da72 100644 --- a/sys/boot/common/boot.c +++ b/sys/boot/common/boot.c @@ -162,6 +162,9 @@ autoboot(int timeout, char *prompt) int c, yes; char *argv[2], *cp, *ep; char *kernelname; +#ifdef BOOT_PROMPT_123 + const char *seq = "123", *p = seq; +#endif autoboot_tried = 1; @@ -192,14 +195,29 @@ autoboot(int timeout, char *prompt) yes = 0; +#ifdef BOOT_PROMPT_123 + printf("%s\n", (prompt == NULL) ? "Hit [Enter] to boot immediately, or " + "1 2 3 sequence for command prompt." : prompt); +#else printf("%s\n", (prompt == NULL) ? "Hit [Enter] to boot immediately, or any other key for command prompt." : prompt); +#endif for (;;) { if (ischar()) { c = getchar(); +#ifdef BOOT_PROMPT_123 + if ((c == '\r') || (c == '\n')) { + yes = 1; + break; + } else if (c != *p++) + p = seq; + if (*p == 0) + break; +#else if ((c == '\r') || (c == '\n')) yes = 1; break; +#endif } ntime = time(NULL); if (ntime >= when) { diff --git a/sys/boot/common/bootstrap.h b/sys/boot/common/bootstrap.h index 5f0848089f43..ff8f45924fee 100644 --- a/sys/boot/common/bootstrap.h +++ b/sys/boot/common/bootstrap.h @@ -45,6 +45,7 @@ struct devdesc #define DEVT_CD 3 #define DEVT_ZFS 4 int d_unit; + void *d_opendata; }; /* Commands and return values; nonzero return sets command_errmsg != NULL */ diff --git a/sys/boot/common/commands.c b/sys/boot/common/commands.c index 0559d1558c4d..7fba019153b7 100644 --- a/sys/boot/common/commands.c +++ b/sys/boot/common/commands.c @@ -150,6 +150,7 @@ command_help(int argc, char *argv[]) break; default: command_errmsg = "usage is 'help []"; + close(hfd); return(CMD_ERROR); } diff --git a/sys/boot/common/dev_net.c b/sys/boot/common/dev_net.c index 5dc1dc33fe4a..147a809325a5 100644 --- a/sys/boot/common/dev_net.c +++ b/sys/boot/common/dev_net.c @@ -1,6 +1,4 @@ -/* - * $NetBSD: dev_net.c,v 1.12 1997/12/10 20:38:37 gwr Exp $ - */ +/* $NetBSD: dev_net.c,v 1.23 2008/04/28 20:24:06 martin Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -17,13 +15,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -76,14 +67,18 @@ __FBSDID("$FreeBSD$"); #include "dev_net.h" #include "bootstrap.h" +#ifdef NETIF_DEBUG int debug = 0; +#endif +static char *netdev_name; static int netdev_sock = -1; static int netdev_opens; static int net_init(void); static int net_open(struct open_file *, ...); static int net_close(struct open_file *); +static void net_cleanup(void); static int net_strategy(); static void net_print(int); @@ -97,10 +92,11 @@ struct devsw netdev = { net_open, net_close, noioctl, - net_print + net_print, + net_cleanup }; -int +static int net_init(void) { @@ -112,7 +108,7 @@ net_init(void) * This opens the low-level device and sets f->f_devdata. * This is declared with variable arguments... */ -int +static int net_open(struct open_file *f, ...) { va_list args; @@ -123,6 +119,12 @@ net_open(struct open_file *f, ...) devname = va_arg(args, char*); va_end(args); +#ifdef NETIF_OPEN_CLOSE_ONCE + /* Before opening another interface, close the previous one first. */ + if (netdev_sock >= 0 && strcmp(devname, netdev_name) != 0) + net_cleanup(); +#endif + /* On first open, do netif open, mount, etc. */ if (netdev_opens == 0) { /* Find network interface. */ @@ -132,56 +134,75 @@ net_open(struct open_file *f, ...) printf("net_open: netif_open() failed\n"); return (ENXIO); } + netdev_name = strdup(devname); +#ifdef NETIF_DEBUG if (debug) - printf("net_open: netif_open() succeeded\n"); + printf("net_open: netif_open() succeeded\n"); +#endif } if (rootip.s_addr == 0) { /* Get root IP address, and path, etc. */ error = net_getparams(netdev_sock); if (error) { /* getparams makes its own noise */ + free(netdev_name); netif_close(netdev_sock); netdev_sock = -1; return (error); } } -#if defined(__sparc64__) - netdev_opens++; -#endif } netdev_opens++; f->f_devdata = &netdev_sock; return (error); } -int +static int net_close(struct open_file *f) { + #ifdef NETIF_DEBUG if (debug) printf("net_close: opens=%d\n", netdev_opens); #endif - /* On last close, do netif close, etc. */ f->f_devdata = NULL; + +#ifndef NETIF_OPEN_CLOSE_ONCE /* Extra close call? */ if (netdev_opens <= 0) return (0); netdev_opens--; /* Not last close? */ if (netdev_opens > 0) - return(0); - rootip.s_addr = 0; - if (netdev_sock >= 0) { - if (debug) - printf("net_close: calling netif_close()\n"); - netif_close(netdev_sock); - netdev_sock = -1; - } + return (0); + /* On last close, do netif close, etc. */ +#ifdef NETIF_DEBUG + if (debug) + printf("net_close: calling net_cleanup()\n"); +#endif + net_cleanup(); +#endif return (0); } -int +static void +net_cleanup(void) +{ + + if (netdev_sock >= 0) { +#ifdef NETIF_DEBUG + if (debug) + printf("net_cleanup: calling netif_close()\n"); +#endif + rootip.s_addr = 0; + free(netdev_name); + netif_close(netdev_sock); + netdev_sock = -1; + } +} + +static int net_strategy() { @@ -227,8 +248,10 @@ net_getparams(int sock) bootp(sock, BOOTP_NONE); if (myip.s_addr != 0) goto exit; +#ifdef NETIF_DEBUG if (debug) printf("net_open: BOOTP failed, trying RARP/RPC...\n"); +#endif #endif /* @@ -246,8 +269,10 @@ net_getparams(int sock) printf("net_open: bootparam/whoami RPC failed\n"); return (EIO); } +#ifdef NETIF_DEBUG if (debug) printf("net_open: client name: %s\n", hostname); +#endif /* * Ignore the gateway from whoami (unreliable). @@ -261,11 +286,15 @@ net_getparams(int sock) } if (smask) { netmask = smask; +#ifdef NETIF_DEBUG if (debug) - printf("net_open: subnet mask: %s\n", intoa(netmask)); + printf("net_open: subnet mask: %s\n", intoa(netmask)); +#endif } +#ifdef NETIF_DEBUG if (gateip.s_addr && debug) printf("net_open: net gateway: %s\n", inet_ntoa(gateip)); +#endif /* Get the root server and pathname. */ if (bp_getfile(sock, "root", &rootip, rootpath)) { @@ -288,10 +317,12 @@ exit: bcopy(&rootpath[i], &temp[0], strlen(&rootpath[i])+1); bcopy(&temp[0], &rootpath[0], strlen(&rootpath[i])+1); } +#ifdef NETIF_DEBUG if (debug) { printf("net_open: server addr: %s\n", inet_ntoa(rootip)); printf("net_open: server path: %s\n", rootpath); } +#endif d = socktodesc(sock); sprintf(temp, "%6D", d->myea, ":"); diff --git a/sys/boot/common/md.c b/sys/boot/common/md.c new file mode 100644 index 000000000000..6d2d2b455748 --- /dev/null +++ b/sys/boot/common/md.c @@ -0,0 +1,151 @@ +/*- + * Copyright (c) 2009 Marcel Moolenaar + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include "bootstrap.h" + +#define MD_BLOCK_SIZE 512 + +#ifndef MD_IMAGE_SIZE +#error Must be compiled with MD_IMAGE_SIZE defined +#endif +#if (MD_IMAGE_SIZE == 0 || MD_IMAGE_SIZE % MD_BLOCK_SIZE) +#error Image size must be a multiple of 512. +#endif + +/* + * Preloaded image gets put here. + * Applications that patch the object with the image can determine + * the size looking at the start and end markers (strings), + * so we want them contiguous. + */ +static struct { + u_char start[MD_IMAGE_SIZE]; + u_char end[128]; +} md_image = { + .start = "MFS Filesystem goes here", + .end = "MFS Filesystem had better STOP here", +}; + +/* devsw I/F */ +static int md_init(void); +static int md_strategy(void *, int, daddr_t, size_t, char *, size_t *); +static int md_open(struct open_file *, ...); +static int md_close(struct open_file *); +static void md_print(int); + +struct devsw md_dev = { + "md", + DEVT_DISK, + md_init, + md_strategy, + md_open, + md_close, + noioctl, + md_print +}; + +static int +md_init(void) +{ + + return (0); +} + +static int +md_strategy(void *devdata, int rw, daddr_t blk, size_t size, char *buf, + size_t *rsize) +{ + struct devdesc *dev = (struct devdesc *)devdata; + size_t ofs; + + if (dev->d_unit != 0) + return (ENXIO); + + if (blk < 0 || blk >= (MD_IMAGE_SIZE / MD_BLOCK_SIZE)) + return (EIO); + + if (size % MD_BLOCK_SIZE) + return (EIO); + + ofs = blk * MD_BLOCK_SIZE; + if ((ofs + size) > MD_IMAGE_SIZE) + size = MD_IMAGE_SIZE - ofs; + + if (rsize != 0) + *rsize = size; + + switch (rw) { + case F_READ: + bcopy(md_image.start + ofs, buf, size); + return (0); + case F_WRITE: + bcopy(buf, md_image.start + ofs, size); + return (0); + } + + return (ENODEV); +} + +static int +md_open(struct open_file *f, ...) +{ + va_list ap; + struct devdesc *dev; + + va_start(ap, f); + dev = va_arg(ap, struct devdesc *); + va_end(ap); + + if (dev->d_unit != 0) + return (ENXIO); + + return (0); +} + +static int +md_close(struct open_file *f) +{ + struct devdesc *dev; + + dev = (struct devdesc *)(f->f_devdata); + return ((dev->d_unit != 0) ? ENXIO : 0); +} + +static void +md_print(int verbose) +{ + + printf("MD (%u bytes)\n", MD_IMAGE_SIZE); +} diff --git a/sys/boot/common/module.c b/sys/boot/common/module.c index 098e39ad938b..18ba1b550e21 100644 --- a/sys/boot/common/module.c +++ b/sys/boot/common/module.c @@ -351,6 +351,9 @@ file_loadraw(char *type, char *name) char *cp; int fd, got; vm_offset_t laddr; +#ifdef PC98 + struct stat st; +#endif /* We can't load first */ if ((file_findfile(NULL, NULL)) == NULL) { @@ -372,6 +375,14 @@ file_loadraw(char *type, char *name) return(CMD_ERROR); } +#ifdef PC98 + /* We cannot use 15M-16M area on pc98. */ + if (loadaddr < 0x1000000 && + fstat(fd, &st) == 0 && + (st.st_size == -1 || loadaddr + st.st_size > 0xf00000)) + loadaddr = 0x1000000; +#endif + laddr = loadaddr; for (;;) { /* read in 4k chunks; size is not really important */ @@ -477,6 +488,14 @@ mod_loadkld(const char *kldname, int argc, char *argv[]) ; do { +#ifdef PC98 + /* We cannot use 15M-16M area on pc98. */ + struct stat st; + if (loadaddr < 0x1000000 && + stat(filename, &st) == 0 && + (st.st_size == -1 || loadaddr + st.st_size > 0xf00000)) + loadaddr = 0x1000000; +#endif err = file_load(filename, loadaddr, &fp); if (err) break; diff --git a/sys/boot/efi/include/efilib.h b/sys/boot/efi/include/efilib.h index 220e01a68976..cf825a623cb4 100644 --- a/sys/boot/efi/include/efilib.h +++ b/sys/boot/efi/include/efilib.h @@ -34,9 +34,7 @@ extern EFI_SYSTEM_TABLE *ST; extern EFI_BOOT_SERVICES *BS; extern EFI_RUNTIME_SERVICES *RS; -extern struct devsw efifs_dev; -extern struct fs_ops efifs_fsops; - +extern struct devsw efipart_dev; extern struct devsw efinet_dev; extern struct netif_driver efinetif; diff --git a/sys/boot/efi/libefi/Makefile b/sys/boot/efi/libefi/Makefile index 5c504a3fac81..55053e1042f7 100644 --- a/sys/boot/efi/libefi/Makefile +++ b/sys/boot/efi/libefi/Makefile @@ -3,8 +3,8 @@ LIB= efi INTERNALLIB= -SRCS= delay.c efi_console.c efifs.c efinet.c errno.c handles.c libefi.c \ - time.c +SRCS= delay.c efi_console.c efinet.c efipart.c errno.c handles.c \ + libefi.c time.c CFLAGS+= -I${.CURDIR}/../include CFLAGS+= -I${.CURDIR}/../include/${MACHINE_ARCH:S/amd64/i386/} diff --git a/sys/boot/efi/libefi/efifs.c b/sys/boot/efi/libefi/efifs.c deleted file mode 100644 index 716102cf1d04..000000000000 --- a/sys/boot/efi/libefi/efifs.c +++ /dev/null @@ -1,441 +0,0 @@ -/*- - * Copyright (c) 2001 Doug Rabson - * Copyright (c) 2006 Marcel Moolenaar - * 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. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include - -#include - -#include -#include -#include - -/* Perform I/O in blocks of size EFI_BLOCK_SIZE. */ -#define EFI_BLOCK_SIZE (1024 * 1024) - -union fileinfo { - EFI_FILE_INFO info; - char bytes[sizeof(EFI_FILE_INFO) + 508]; -}; - -static EFI_GUID sfs_guid = SIMPLE_FILE_SYSTEM_PROTOCOL; -static EFI_GUID fs_guid = EFI_FILE_SYSTEM_INFO_ID; -static EFI_GUID fi_guid = EFI_FILE_INFO_ID; - -static int -efifs_open(const char *upath, struct open_file *f) -{ - struct devdesc *dev = f->f_devdata; - EFI_FILE_IO_INTERFACE *fsif; - EFI_FILE *file, *root; - EFI_HANDLE h; - EFI_STATUS status; - CHAR16 *cp, *path; - - if (f->f_dev != &efifs_dev || dev->d_unit < 0) - return (EINVAL); - - h = efi_find_handle(f->f_dev, dev->d_unit); - if (h == NULL) - return (EINVAL); - - status = BS->HandleProtocol(h, &sfs_guid, (VOID **)&fsif); - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - - /* Get the root directory. */ - status = fsif->OpenVolume(fsif, &root); - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - - while (*upath == '/') - upath++; - - /* Special case: opening the root directory. */ - if (*upath == '\0') { - f->f_fsdata = root; - return (0); - } - - path = malloc((strlen(upath) + 1) * sizeof(CHAR16)); - if (path == NULL) { - root->Close(root); - return (ENOMEM); - } - - cp = path; - while (*upath != '\0') { - if (*upath == '/') { - *cp = '\\'; - while (upath[1] == '/') - upath++; - } else - *cp = *upath; - upath++; - cp++; - } - *cp = 0; - - /* Open the file. */ - status = root->Open(root, &file, path, - EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0); - if (status == EFI_ACCESS_DENIED || status == EFI_WRITE_PROTECTED) - status = root->Open(root, &file, path, EFI_FILE_MODE_READ, 0); - free(path); - root->Close(root); - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - - f->f_fsdata = file; - return (0); -} - -static int -efifs_close(struct open_file *f) -{ - EFI_FILE *file = f->f_fsdata; - - if (file == NULL) - return (EBADF); - - file->Close(file); - f->f_fsdata = NULL; - return (0); -} - -static int -efifs_read(struct open_file *f, void *buf, size_t size, size_t *resid) -{ - EFI_FILE *file = f->f_fsdata; - EFI_STATUS status; - UINTN sz = size; - char *bufp; - - if (file == NULL) - return (EBADF); - - bufp = buf; - while (size > 0) { - sz = size; - if (sz > EFI_BLOCK_SIZE) - sz = EFI_BLOCK_SIZE; - status = file->Read(file, &sz, bufp); - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - if (sz == 0) - break; - size -= sz; - bufp += sz; - } - if (resid) - *resid = size; - return (0); -} - -static int -efifs_write(struct open_file *f, void *buf, size_t size, size_t *resid) -{ - EFI_FILE *file = f->f_fsdata; - EFI_STATUS status; - UINTN sz = size; - char *bufp; - - if (file == NULL) - return (EBADF); - - bufp = buf; - while (size > 0) { - sz = size; - if (sz > EFI_BLOCK_SIZE) - sz = EFI_BLOCK_SIZE; - status = file->Write(file, &sz, bufp); - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - if (sz == 0) - break; - size -= sz; - bufp += sz; - } - if (resid) - *resid = size; - return (0); -} - -static off_t -efifs_seek(struct open_file *f, off_t offset, int where) -{ - EFI_FILE *file = f->f_fsdata; - EFI_STATUS status; - UINT64 base; - - if (file == NULL) - return (EBADF); - - switch (where) { - case SEEK_SET: - break; - - case SEEK_END: - status = file->SetPosition(file, ~0ULL); - if (EFI_ERROR(status)) - return (-1); - /* FALLTHROUGH */ - - case SEEK_CUR: - status = file->GetPosition(file, &base); - if (EFI_ERROR(status)) - return (-1); - offset = (off_t)(base + offset); - break; - - default: - return (-1); - } - if (offset < 0) - return (-1); - - status = file->SetPosition(file, (UINT64)offset); - return (EFI_ERROR(status) ? -1 : offset); -} - -static int -efifs_stat(struct open_file *f, struct stat *sb) -{ - EFI_FILE *file = f->f_fsdata; - union fileinfo fi; - EFI_STATUS status; - UINTN sz; - - if (file == NULL) - return (EBADF); - - bzero(sb, sizeof(*sb)); - - sz = sizeof(fi); - status = file->GetInfo(file, &fi_guid, &sz, &fi); - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - - sb->st_mode = S_IRUSR | S_IRGRP | S_IROTH; - if ((fi.info.Attribute & EFI_FILE_READ_ONLY) == 0) - sb->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; - if (fi.info.Attribute & EFI_FILE_DIRECTORY) - sb->st_mode |= S_IFDIR; - else - sb->st_mode |= S_IFREG; - sb->st_nlink = 1; - sb->st_atime = efi_time(&fi.info.LastAccessTime); - sb->st_mtime = efi_time(&fi.info.ModificationTime); - sb->st_ctime = efi_time(&fi.info.CreateTime); - sb->st_size = fi.info.FileSize; - sb->st_blocks = fi.info.PhysicalSize / S_BLKSIZE; - sb->st_blksize = S_BLKSIZE; - sb->st_birthtime = sb->st_ctime; - return (0); -} - -static int -efifs_readdir(struct open_file *f, struct dirent *d) -{ - EFI_FILE *file = f->f_fsdata; - union fileinfo fi; - EFI_STATUS status; - UINTN sz; - int i; - - if (file == NULL) - return (EBADF); - - sz = sizeof(fi); - status = file->Read(file, &sz, &fi); - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - if (sz == 0) - return (ENOENT); - - d->d_fileno = 0; - d->d_reclen = sizeof(*d); - if (fi.info.Attribute & EFI_FILE_DIRECTORY) - d->d_type = DT_DIR; - else - d->d_type = DT_REG; - for (i = 0; fi.info.FileName[i] != 0; i++) - d->d_name[i] = fi.info.FileName[i]; - d->d_name[i] = 0; - d->d_namlen = i; - return (0); -} - -struct fs_ops efifs_fsops = { - .fs_name = "efifs", - .fo_open = efifs_open, - .fo_close = efifs_close, - .fo_read = efifs_read, - .fo_write = efifs_write, - .fo_seek = efifs_seek, - .fo_stat = efifs_stat, - .fo_readdir = efifs_readdir -}; - -static int -efifs_dev_init(void) -{ - EFI_HANDLE *handles; - EFI_STATUS status; - UINTN sz; - int err; - - sz = 0; - status = BS->LocateHandle(ByProtocol, &sfs_guid, 0, &sz, 0); - if (status == EFI_BUFFER_TOO_SMALL) { - handles = (EFI_HANDLE *)malloc(sz); - status = BS->LocateHandle(ByProtocol, &sfs_guid, 0, &sz, - handles); - if (EFI_ERROR(status)) - free(handles); - } - if (EFI_ERROR(status)) - return (efi_status_to_errno(status)); - err = efi_register_handles(&efifs_dev, handles, - sz / sizeof(EFI_HANDLE)); - free(handles); - return (err); -} - -/* - * Print information about disks - */ -static void -efifs_dev_print(int verbose) -{ - union { - EFI_FILE_SYSTEM_INFO info; - char buffer[1024]; - } fi; - char line[80]; - EFI_FILE_IO_INTERFACE *fsif; - EFI_FILE *volume; - EFI_HANDLE h; - EFI_STATUS status; - UINTN sz; - int i, unit; - - for (unit = 0, h = efi_find_handle(&efifs_dev, 0); - h != NULL; h = efi_find_handle(&efifs_dev, ++unit)) { - sprintf(line, " %s%d: ", efifs_dev.dv_name, unit); - pager_output(line); - - status = BS->HandleProtocol(h, &sfs_guid, (VOID **)&fsif); - if (EFI_ERROR(status)) - goto err; - - status = fsif->OpenVolume(fsif, &volume); - if (EFI_ERROR(status)) - goto err; - - sz = sizeof(fi); - status = volume->GetInfo(volume, &fs_guid, &sz, &fi); - volume->Close(volume); - if (EFI_ERROR(status)) - goto err; - - if (fi.info.ReadOnly) - pager_output("[RO] "); - else - pager_output(" "); - for (i = 0; fi.info.VolumeLabel[i] != 0; i++) - fi.buffer[i] = fi.info.VolumeLabel[i]; - fi.buffer[i] = 0; - if (fi.buffer[0] != 0) - pager_output(fi.buffer); - else - pager_output("EFI filesystem"); - pager_output("\n"); - continue; - - err: - sprintf(line, "[--] error %d: unable to obtain information\n", - efi_status_to_errno(status)); - pager_output(line); - } -} - -/* - * Attempt to open the disk described by (dev) for use by (f). - * - * Note that the philosophy here is "give them exactly what - * they ask for". This is necessary because being too "smart" - * about what the user might want leads to complications. - * (eg. given no slice or partition value, with a disk that is - * sliced - are they after the first BSD slice, or the DOS - * slice before it?) - */ -static int -efifs_dev_open(struct open_file *f, ...) -{ - va_list args; - struct devdesc *dev; - - va_start(args, f); - dev = va_arg(args, struct devdesc*); - va_end(args); - - if (dev->d_unit < 0) - return(ENXIO); - return (0); -} - -static int -efifs_dev_close(struct open_file *f) -{ - - return (0); -} - -static int -efifs_dev_strategy(void *devdata, int rw, daddr_t dblk, size_t size, char *buf, size_t *rsize) -{ - - return (ENOSYS); -} - -struct devsw efifs_dev = { - .dv_name = "fs", - .dv_type = DEVT_DISK, - .dv_init = efifs_dev_init, - .dv_strategy = efifs_dev_strategy, - .dv_open = efifs_dev_open, - .dv_close = efifs_dev_close, - .dv_ioctl = noioctl, - .dv_print = efifs_dev_print, - .dv_cleanup = NULL -}; diff --git a/sys/boot/efi/libefi/efipart.c b/sys/boot/efi/libefi/efipart.c new file mode 100644 index 000000000000..4c8c170f0d96 --- /dev/null +++ b/sys/boot/efi/libefi/efipart.c @@ -0,0 +1,265 @@ +/*- + * Copyright (c) 2010 Marcel Moolenaar + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +#include +#include +#include + +static EFI_GUID blkio_guid = BLOCK_IO_PROTOCOL; + +static int efipart_init(void); +static int efipart_strategy(void *, int, daddr_t, size_t, char *, size_t *); +static int efipart_open(struct open_file *, ...); +static int efipart_close(struct open_file *); +static void efipart_print(int); + +struct devsw efipart_dev = { + .dv_name = "part", + .dv_type = DEVT_DISK, + .dv_init = efipart_init, + .dv_strategy = efipart_strategy, + .dv_open = efipart_open, + .dv_close = efipart_close, + .dv_ioctl = noioctl, + .dv_print = efipart_print, + .dv_cleanup = NULL +}; + +static int +efipart_init(void) +{ + EFI_BLOCK_IO *blkio; + EFI_HANDLE *hin, *hout; + EFI_STATUS status; + UINTN sz; + u_int n, nin, nout; + int err; + + sz = 0; + status = BS->LocateHandle(ByProtocol, &blkio_guid, 0, &sz, 0); + if (status == EFI_BUFFER_TOO_SMALL) { + hin = (EFI_HANDLE *)malloc(sz * 2); + status = BS->LocateHandle(ByProtocol, &blkio_guid, 0, &sz, + hin); + if (EFI_ERROR(status)) + free(hin); + } + if (EFI_ERROR(status)) + return (efi_status_to_errno(status)); + + /* Filter handles to only include FreeBSD partitions. */ + nin = sz / sizeof(EFI_HANDLE); + hout = hin + nin; + nout = 0; + + for (n = 0; n < nin; n++) { + status = BS->HandleProtocol(hin[n], &blkio_guid, &blkio); + if (EFI_ERROR(status)) + continue; + if (!blkio->Media->LogicalPartition) + continue; + hout[nout] = hin[n]; + nout++; + } + + err = efi_register_handles(&efipart_dev, hout, nout); + free(hin); + return (err); +} + +static void +efipart_print(int verbose) +{ + char line[80]; + EFI_BLOCK_IO *blkio; + EFI_HANDLE h; + EFI_STATUS status; + u_int unit; + + for (unit = 0, h = efi_find_handle(&efipart_dev, 0); + h != NULL; h = efi_find_handle(&efipart_dev, ++unit)) { + sprintf(line, " %s%d:", efipart_dev.dv_name, unit); + pager_output(line); + + status = BS->HandleProtocol(h, &blkio_guid, &blkio); + if (!EFI_ERROR(status)) { + sprintf(line, " %llu blocks", + (unsigned long long)(blkio->Media->LastBlock + 1)); + pager_output(line); + if (blkio->Media->RemovableMedia) + pager_output(" (removable)"); + } + pager_output("\n"); + } +} + +static int +efipart_open(struct open_file *f, ...) +{ + va_list args; + struct devdesc *dev; + EFI_BLOCK_IO *blkio; + EFI_HANDLE h; + EFI_STATUS status; + + va_start(args, f); + dev = va_arg(args, struct devdesc*); + va_end(args); + + h = efi_find_handle(&efipart_dev, dev->d_unit); + if (h == NULL) + return (EINVAL); + + status = BS->HandleProtocol(h, &blkio_guid, &blkio); + if (EFI_ERROR(status)) + return (efi_status_to_errno(status)); + + if (!blkio->Media->MediaPresent) + return (EAGAIN); + + dev->d_opendata = blkio; + return (0); +} + +static int +efipart_close(struct open_file *f) +{ + struct devdesc *dev; + + dev = (struct devdesc *)(f->f_devdata); + if (dev->d_opendata == NULL) + return (EINVAL); + + dev->d_opendata = NULL; + return (0); +} + +/* + * efipart_readwrite() + * Internal equivalent of efipart_strategy(), which operates on the + * media-native block size. This function expects all I/O requests + * to be within the media size and returns an error if such is not + * the case. + */ +static int +efipart_readwrite(EFI_BLOCK_IO *blkio, int rw, daddr_t blk, daddr_t nblks, + char *buf) +{ + EFI_STATUS status; + + if (blkio == NULL) + return (ENXIO); + if (blk < 0 || blk > blkio->Media->LastBlock) + return (EIO); + if ((blk + nblks - 1) > blkio->Media->LastBlock) + return (EIO); + + switch (rw) { + case F_READ: + status = blkio->ReadBlocks(blkio, blkio->Media->MediaId, blk, + nblks * blkio->Media->BlockSize, buf); + break; + case F_WRITE: + if (blkio->Media->ReadOnly) + return (EROFS); + status = blkio->WriteBlocks(blkio, blkio->Media->MediaId, blk, + nblks * blkio->Media->BlockSize, buf); + break; + default: + return (ENOSYS); + } + + if (EFI_ERROR(status)) + printf("%s: rw=%d, status=%lu\n", __func__, rw, status); + return (efi_status_to_errno(status)); +} + +static int +efipart_strategy(void *devdata, int rw, daddr_t blk, size_t size, char *buf, + size_t *rsize) +{ + struct devdesc *dev = (struct devdesc *)devdata; + EFI_BLOCK_IO *blkio; + off_t off; + char *blkbuf; + size_t blkoff, blksz; + int error; + + if (dev == NULL || blk < 0) + return (EINVAL); + + blkio = dev->d_opendata; + if (blkio == NULL) + return (ENXIO); + + if (size == 0 || (size % 512) != 0) + return (EIO); + + if (rsize != NULL) + *rsize = size; + + if (blkio->Media->BlockSize == 512) + return (efipart_readwrite(blkio, rw, blk, size / 512, buf)); + + /* + * The block size of the media is not 512B per sector. + */ + blkbuf = malloc(blkio->Media->BlockSize); + if (blkbuf == NULL) + return (ENOMEM); + + error = 0; + off = blk * 512; + blk = off / blkio->Media->BlockSize; + blkoff = off % blkio->Media->BlockSize; + blksz = blkio->Media->BlockSize - blkoff; + while (size > 0) { + error = efipart_readwrite(blkio, rw, blk, 1, blkbuf); + if (error) + break; + if (size < blksz) + blksz = size; + bcopy(blkbuf + blkoff, buf, blksz); + buf += blksz; + size -= blksz; + blk++; + blkoff = 0; + blksz = blkio->Media->BlockSize; + } + + free(blkbuf); + return (error); +} diff --git a/sys/boot/forth/loader.conf b/sys/boot/forth/loader.conf index 44eef5fb9b1e..d7f1323be9bd 100644 --- a/sys/boot/forth/loader.conf +++ b/sys/boot/forth/loader.conf @@ -101,6 +101,7 @@ module_path="/boot/modules" # Set the module search path #kern.maxusers="32" # Set size of various static tables #kern.nbuf="" # Set the number of buffer headers #kern.ncallout="" # Set the maximum # of timer events +#kern.ngroups="1023" # Set the maximum # of supplemental groups #kern.sgrowsiz="" # Set the amount to grow stack #kern.cam.scsi_delay="2000" # Delay (in ms) before probing SCSI #kern.ipc.maxsockets="" # Set the maximum number of sockets avaliable @@ -154,6 +155,7 @@ geom_label_load="NO" # File system labels (see glabel(8)) geom_md_load="NO" # Memory disk driver (vnode/swap/malloc) (see # md(4), mdconfig(8)) geom_mirror_load="NO" # RAID1 disk driver (see gmirror(8)) +geom_mountver_load="NO" # Mount verification disk driver geom_nop_load="NO" # Transparent disk driver (see gnop(8)) geom_raid3_load="NO" # RAID3 disk driver (see graid3(8)) geom_shsec_load="NO" # Shared secret disk driver (see gshsec(8)) @@ -223,6 +225,7 @@ if_axe_load="NO" # ASIX Electronics AX88172 USB Ethernet if_bce_load="NO" # Broadcom NetXtreme II Gigabit Ethernet if_bfe_load="NO" # Broadcom BCM4401 if_bge_load="NO" # Broadcom BCM570x PCI Gigabit Ethernet +if_bwn_load="NO" # Broadcom BCM43xx IEEE 802.11 wireless NICs if_cas_load="NO" # Sun Cassini/Cassini+ and NS DP83065 Saturn if_cm_load="NO" # SMC (90c26, 90c56, 90c66) if_cs_load="NO" # Crystal Semiconductor CS8920 diff --git a/sys/boot/forth/loader.conf.5 b/sys/boot/forth/loader.conf.5 index b7e8af26d247..df2183f1c41c 100644 --- a/sys/boot/forth/loader.conf.5 +++ b/sys/boot/forth/loader.conf.5 @@ -180,10 +180,15 @@ serial port speed setting. .Dq comconsole selects serial console, .Dq vidconsole -selects the video console, and +selects the video console, .Dq nullconsole selects a mute console -(useful for systems with neither a video console nor a serial port). +(useful for systems with neither a video console nor a serial port), and +.Dq spinconsole +selects the video console which prevents any input and hides all output +replacing it with +.Dq spinning +character (useful for embedded products and such). .It Va kernel .Pq Dq Pa /boot/kernel/kernel .It Va loader_conf_files diff --git a/sys/boot/i386/Makefile b/sys/boot/i386/Makefile index 912714fe2a29..3c05759fcf09 100644 --- a/sys/boot/i386/Makefile +++ b/sys/boot/i386/Makefile @@ -1,9 +1,15 @@ # $FreeBSD$ -SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot zfsboot \ - gptzfsboot kgzldr libi386 libfirewire loader +.include + +SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot kgzldr \ + libi386 libfirewire loader # special boot programs, 'self-extracting boot2+loader' SUBDIR+= pxeldr +.if ${MK_ZFS} != "no" +SUBDIR+= zfsboot gptzfsboot zfsloader +.endif + .include diff --git a/sys/boot/i386/gptboot/gptboot.c b/sys/boot/i386/gptboot/gptboot.c index 89df2ecb104c..96efea6a1d5e 100644 --- a/sys/boot/i386/gptboot/gptboot.c +++ b/sys/boot/i386/gptboot/gptboot.c @@ -642,8 +642,8 @@ bcmp(const void *b1, const void *b2, size_t length) static struct { uint16_t len; uint16_t count; - uint16_t seg; uint16_t off; + uint16_t seg; uint64_t lba; } packet; @@ -656,8 +656,8 @@ drvread(void *buf, daddr_t lba, unsigned nblk) printf("%c\b", c = c << 8 | c >> 24); packet.len = 0x10; packet.count = nblk; - packet.seg = VTOPOFF(buf); - packet.off = VTOPSEG(buf); + packet.off = VTOPOFF(buf); + packet.seg = VTOPSEG(buf); packet.lba = lba; v86.ctl = V86_FLAGS; v86.addr = 0x13; diff --git a/sys/boot/i386/libi386/Makefile b/sys/boot/i386/libi386/Makefile index c1bbb52c80b4..f1a461a88c4e 100644 --- a/sys/boot/i386/libi386/Makefile +++ b/sys/boot/i386/libi386/Makefile @@ -8,7 +8,7 @@ SRCS= biosacpi.c bioscd.c biosdisk.c biosmem.c biospnp.c \ comconsole.c devicename.c elf32_freebsd.c \ elf64_freebsd.c \ i386_copy.c i386_module.c nullconsole.c pxe.c pxetramp.s \ - smbios.c time.c vidconsole.c amd64_tramp.S + smbios.c time.c vidconsole.c amd64_tramp.S spinconsole.c # Enable PXE TFTP or NFS support, not both. .if defined(LOADER_TFTP_SUPPORT) diff --git a/sys/boot/i386/libi386/biosacpi.c b/sys/boot/i386/libi386/biosacpi.c index 081598394ea2..e9e2436b47cd 100644 --- a/sys/boot/i386/libi386/biosacpi.c +++ b/sys/boot/i386/libi386/biosacpi.c @@ -125,10 +125,8 @@ biosacpi_search_rsdp(char *base, int length) sum = 0; for (idx = 0; idx < RSDP_CHECKSUM_LENGTH; idx++) sum += *(cp + idx); - if (sum != 0) { - printf("acpi: bad RSDP checksum (%d)\n", sum); + if (sum != 0) continue; - } return(rsdp); } } diff --git a/sys/boot/i386/libi386/biosdisk.c b/sys/boot/i386/libi386/biosdisk.c index 7e1fa19369d0..cf0b03353ea7 100644 --- a/sys/boot/i386/libi386/biosdisk.c +++ b/sys/boot/i386/libi386/biosdisk.c @@ -1266,11 +1266,11 @@ bd_io(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest, int write) } if (write) - DEBUG("%d sectors from %lld to %p (0x%x) %s", x, dblk, p, VTOP(p), - result ? "failed" : "ok"); + DEBUG("Write %d sector(s) from %p (0x%x) to %lld %s", x, + p, VTOP(p), dblk, result ? "failed" : "ok"); else - DEBUG("%d sectors from %p (0x%x) to %lld %s", x, p, VTOP(p), dblk, - result ? "failed" : "ok"); + DEBUG("Read %d sector(s) from %lld to %p (0x%x) %s", x, + dblk, p, VTOP(p), result ? "failed" : "ok"); if (result) { return(-1); } diff --git a/sys/boot/i386/libi386/biosmem.c b/sys/boot/i386/libi386/biosmem.c index 3c2205ed46c2..bae68131b87b 100644 --- a/sys/boot/i386/libi386/biosmem.c +++ b/sys/boot/i386/libi386/biosmem.c @@ -35,14 +35,20 @@ __FBSDID("$FreeBSD$"); #include "libi386.h" #include "btxv86.h" -vm_offset_t memtop, memtop_copyin; -u_int32_t bios_basemem, bios_extmem; +vm_offset_t memtop, memtop_copyin, high_heap_base; +uint32_t bios_basemem, bios_extmem, high_heap_size; static struct bios_smap smap; +/* + * The minimum amount of memory to reserve in bios_extmem for the heap. + */ +#define HEAP_MIN (3 * 1024 * 1024) + void bios_getmem(void) { + uint64_t size; /* Parse system memory map */ v86.ebx = 0; @@ -65,6 +71,26 @@ bios_getmem(void) if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base == 0x100000)) { bios_extmem = smap.length; } + + /* + * Look for the largest segment in 'extended' memory beyond + * 1MB but below 4GB. + */ + if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base > 0x100000) && + (smap.base < 0x100000000ull)) { + size = smap.length; + + /* + * If this segment crosses the 4GB boundary, truncate it. + */ + if (smap.base + size > 0x100000000ull) + size = 0x100000000ull - smap.base; + + if (size > high_heap_size) { + high_heap_size = size; + high_heap_base = smap.base; + } + } } while (v86.ebx != 0); /* Fall back to the old compatibility function for base memory */ @@ -97,5 +123,13 @@ bios_getmem(void) /* Set memtop to actual top of memory */ memtop = memtop_copyin = 0x100000 + bios_extmem; + /* + * If we have extended memory and did not find a suitable heap + * region in the SMAP, use the last 3MB of 'extended' memory as a + * high heap candidate. + */ + if (bios_extmem >= HEAP_MIN && high_heap_size < HEAP_MIN) { + high_heap_size = HEAP_MIN; + high_heap_base = memtop - HEAP_MIN; + } } - diff --git a/sys/boot/i386/libi386/elf32_freebsd.c b/sys/boot/i386/libi386/elf32_freebsd.c index 5f66622add9d..641e2733c3a2 100644 --- a/sys/boot/i386/libi386/elf32_freebsd.c +++ b/sys/boot/i386/libi386/elf32_freebsd.c @@ -59,7 +59,7 @@ elf32_exec(struct preloaded_file *fp) int boothowto, err, bootdev; if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) - return(EFTYPE); /* XXX actually EFUCKUP */ + return(EFTYPE); ehdr = (Elf_Ehdr *)&(md->md_data); err = bi_load32(fp->f_args, &boothowto, &bootdev, &bootinfop, &modulep, &kernend); diff --git a/sys/boot/i386/libi386/elf64_freebsd.c b/sys/boot/i386/libi386/elf64_freebsd.c index 8fb13b74a373..627d41624a3a 100644 --- a/sys/boot/i386/libi386/elf64_freebsd.c +++ b/sys/boot/i386/libi386/elf64_freebsd.c @@ -78,7 +78,7 @@ elf64_exec(struct preloaded_file *fp) int i; if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) - return(EFTYPE); /* XXX actually EFUCKUP */ + return(EFTYPE); ehdr = (Elf_Ehdr *)&(md->md_data); err = bi_load64(fp->f_args, &modulep, &kernend); diff --git a/sys/boot/i386/libi386/libi386.h b/sys/boot/i386/libi386/libi386.h index 4ac5cb569fb2..ebf1b4ce9494 100644 --- a/sys/boot/i386/libi386/libi386.h +++ b/sys/boot/i386/libi386/libi386.h @@ -78,9 +78,9 @@ int bc_add(int biosdev); /* Register CD booted from. */ int bc_getdev(struct i386_devdesc *dev); /* return dev_t for (dev) */ int bc_bios2unit(int biosdev); /* xlate BIOS device -> bioscd unit */ int bc_unit2bios(int unit); /* xlate bioscd unit -> BIOS device */ -u_int32_t bd_getbigeom(int bunit); /* return geometry in bootinfo format */ -int bd_bios2unit(int biosdev); /* xlate BIOS device -> biosdisk unit */ -int bd_unit2bios(int unit); /* xlate biosdisk unit -> BIOS device */ +uint32_t bd_getbigeom(int bunit); /* return geometry in bootinfo format */ +int bd_bios2unit(int biosdev); /* xlate BIOS device -> biosdisk unit */ +int bd_unit2bios(int unit); /* xlate biosdisk unit -> BIOS device */ int bd_getdev(struct i386_devdesc *dev); /* return dev_t for (dev) */ ssize_t i386_copyin(const void *src, vm_offset_t dest, const size_t len); @@ -92,12 +92,15 @@ void bios_addsmapdata(struct preloaded_file *); void bios_getsmap(void); void bios_getmem(void); -extern u_int32_t bios_basemem; /* base memory in bytes */ -extern u_int32_t bios_extmem; /* extended memory in bytes */ +extern uint32_t bios_basemem; /* base memory in bytes */ +extern uint32_t bios_extmem; /* extended memory in bytes */ extern vm_offset_t memtop; /* last address of physical memory + 1 */ extern vm_offset_t memtop_copyin; /* memtop less heap size for the cases */ - /* when heap is at the top of extended memory */ - /* for other cases - just the same as memtop */ + /* when heap is at the top of */ + /* extended memory; for other cases */ + /* just the same as memtop */ +extern uint32_t high_heap_size; /* extended memory region available */ +extern vm_offset_t high_heap_base; /* for use as the heap */ int biospci_find_devclass(uint32_t class, int index, uint32_t *locator); int biospci_write_config(uint32_t locator, int offset, int width, uint32_t val); diff --git a/sys/boot/i386/libi386/spinconsole.c b/sys/boot/i386/libi386/spinconsole.c new file mode 100644 index 000000000000..752c29f5d4d5 --- /dev/null +++ b/sys/boot/i386/libi386/spinconsole.c @@ -0,0 +1,106 @@ +/*- + * spinconsole.c + * + * Author: Maksym Sobolyev + * Copyright (c) 2009 Sippy Software, Inc. + * All rights reserved. + * + * Subject to the following obligations and disclaimer of warranty, use and + * redistribution of this software, in source or object code forms, with or + * without modifications are expressly permitted by Whistle Communications; + * provided, however, that: + * 1. Any and all reproductions of the source or object code must include the + * copyright notice above and the following disclaimer of warranties; and + * 2. No rights are granted, in any manner or form, to use Whistle + * Communications, Inc. trademarks, including the mark "WHISTLE + * COMMUNICATIONS" on advertising, endorsements, or otherwise except as + * such appears in the above copyright notice or in the software. + * + * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO + * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE, + * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. + * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY + * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS + * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE. + * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES + * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING + * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER 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 WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +extern void get_pos(int *x, int *y); +extern void curs_move(int *_x, int *_y, int x, int y); +extern void vidc_biosputchar(int c); + +static void spinc_probe(struct console *cp); +static int spinc_init(int arg); +static void spinc_putchar(int c); +static int spinc_getchar(void); +static int spinc_ischar(void); + +struct console spinconsole = { + "spinconsole", + "spin port", + 0, + spinc_probe, + spinc_init, + spinc_putchar, + spinc_getchar, + spinc_ischar +}; + +static void +spinc_probe(struct console *cp) +{ + cp->c_flags |= (C_PRESENTIN | C_PRESENTOUT); +} + +static int +spinc_init(int arg) +{ + return(0); +} + +static void +spinc_putchar(int c) +{ + static int curx, cury; + static unsigned tw_chars = 0x5C2D2F7C; /* "\-/|" */ + static time_t lasttime; + time_t now; + + now = time(NULL); + if (now < (lasttime + 1)) + return; + lasttime = now; + get_pos(&curx, &cury); + if (curx > 0) + curs_move(&curx, &cury, curx - 1, cury); + vidc_biosputchar((char)tw_chars); + tw_chars = (tw_chars >> 8) | ((tw_chars & (unsigned long)0xFF) << 24); +} + +static int +spinc_getchar(void) +{ + return(-1); +} + +static int +spinc_ischar(void) +{ + return(0); +} diff --git a/sys/boot/i386/libi386/vidconsole.c b/sys/boot/i386/libi386/vidconsole.c index 1f411006e0a9..1b1e64884552 100644 --- a/sys/boot/i386/libi386/vidconsole.c +++ b/sys/boot/i386/libi386/vidconsole.c @@ -57,8 +57,8 @@ static int vidc_started; void end_term(void); void bail_out(int c); void vidc_term_emu(int c); -void get_pos(void); -void curs_move(int x, int y); +void get_pos(int *x, int *y); +void curs_move(int *_x, int *_y, int x, int y); void write_char(int c, int fg, int bg); void scroll_up(int rows, int fg, int bg); void CD(void); @@ -110,8 +110,8 @@ vidc_init(int arg) #ifdef TERM_EMU /* Init terminal emulator */ end_term(); - get_pos(); - curs_move(curx, cury); + get_pos(&curx, &cury); + curs_move(&curx, &cury, curx, cury); fg_c = DEFAULT_FGCOLOR; bg_c = DEFAULT_BGCOLOR; #endif @@ -120,7 +120,7 @@ vidc_init(int arg) return (0); /* XXX reinit? */ } -static void +void vidc_biosputchar(int c) { @@ -151,7 +151,7 @@ vidc_rawputchar(int c) return; case '\r': curx = 0; - curs_move(curx, cury); + curs_move(&curx, &cury, curx, cury); return; case '\n': cury++; @@ -159,13 +159,13 @@ vidc_rawputchar(int c) scroll_up(1, fg_c, bg_c); cury--; } else { - curs_move(curx, cury); + curs_move(&curx, &cury, curx, cury); } return; case '\b': if (curx > 0) { curx--; - curs_move(curx, cury); + curs_move(&curx, &cury, curx, cury); /* write_char(' ', fg_c, bg_c); XXX destructive(!) */ return; } @@ -183,7 +183,7 @@ vidc_rawputchar(int c) cury--; } } - curs_move(curx, cury); + curs_move(&curx, &cury, curx, cury); #endif } } @@ -194,7 +194,7 @@ vidc_rawputchar(int c) * curx and cury appropriately. */ void -get_pos(void) +get_pos(int *x, int *y) { v86.ctl = 0; @@ -202,13 +202,13 @@ get_pos(void) v86.eax = 0x0300; v86.ebx = 0x0; v86int(); - curx = v86.edx & 0x00ff; - cury = (v86.edx & 0xff00) >> 8; + *x = v86.edx & 0x00ff; + *y = (v86.edx & 0xff00) >> 8; } /* Move cursor to x rows and y cols (0-based). */ void -curs_move(int x, int y) +curs_move(int *_x, int *_y, int x, int y) { v86.ctl = 0; @@ -217,8 +217,8 @@ curs_move(int x, int y) v86.ebx = 0x0; v86.edx = ((0x00ff & y) << 8) + (0x00ff & x); v86int(); - curx = x; - cury = y; + *_x = x; + *_y = y; /* If there is ctrl char at this position, cursor would be invisible. * Make it a space instead. */ @@ -277,7 +277,7 @@ void CD(void) { - get_pos(); + get_pos(&curx, &cury); if (curx > 0) { v86.ctl = 0; v86.addr = 0x10; @@ -312,7 +312,7 @@ CM(void) args[0]--; if (args[1] > 0) args[1]--; - curs_move(args[1], args[0]); + curs_move(&curx, &cury, args[1], args[0]); end_term(); } diff --git a/sys/boot/i386/loader/Makefile b/sys/boot/i386/loader/Makefile index 8f3480ae241e..719e28dd73a9 100644 --- a/sys/boot/i386/loader/Makefile +++ b/sys/boot/i386/loader/Makefile @@ -3,9 +3,10 @@ .include MK_SSP= no -PROG= loader.sym +LOADER?= loader +PROG= ${LOADER}.sym INTERNALPROG= -NEWVERSWHAT= "bootstrap loader" i386 +NEWVERSWHAT?= "bootstrap loader" i386 # architecture-specific loader code SRCS= main.c conf.c vers.c @@ -16,7 +17,7 @@ CFLAGS+= -DLOADER_FIREWIRE_SUPPORT LIBFIREWIRE= ${.OBJDIR}/../libfirewire/libfirewire.a .endif -# Put LOADER_ZFS_SUPPORT=yes in /etc/make.conf for ZFS support +# Set by zfsloader Makefile .if defined(LOADER_ZFS_SUPPORT) CFLAGS+= -DLOADER_ZFS_SUPPORT LIBZFS= ${.OBJDIR}/../../zfs/libzfsboot.a @@ -61,7 +62,7 @@ CFLAGS+= -DLOADER_GPT_SUPPORT CFLAGS+= -I${.CURDIR}/../../common CFLAGS+= -I. -CLEANFILES= vers.c loader loader.bin loader.help +CLEANFILES= vers.c ${LOADER} ${LOADER}.bin loader.help CFLAGS+= -Wall LDFLAGS= -static -Ttext 0x0 @@ -80,30 +81,35 @@ CFLAGS+= -I${.CURDIR}/../btx/lib # Pick up ../Makefile.inc early. .include -vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version - sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT} +vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/../loader/version + sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/../loader/version \ + ${NEWVERSWHAT} -loader: loader.bin ${BTXLDR} ${BTXKERN} +${LOADER}: ${LOADER}.bin ${BTXLDR} ${BTXKERN} btxld -v -f aout -e ${LOADER_ADDRESS} -o ${.TARGET} -l ${BTXLDR} \ - -b ${BTXKERN} loader.bin + -b ${BTXKERN} ${LOADER}.bin -loader.bin: loader.sym +${LOADER}.bin: ${LOADER}.sym cp ${.ALLSRC} ${.TARGET} strip -R .comment -R .note ${.TARGET} loader.help: help.common help.i386 cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET} -.PATH: ${.CURDIR}/../../forth -FILES= loader loader.help loader.4th support.4th loader.conf -FILES+= screen.4th frames.4th beastie.4th +FILES= ${LOADER} # XXX INSTALLFLAGS_loader= -b -FILESMODE_loader= ${BINMODE} -b +FILESMODE_${LOADER}= ${BINMODE} -b + +.if !defined(LOADER_ONLY) +.PATH: ${.CURDIR}/../../forth +FILES+= loader.help loader.4th support.4th loader.conf +FILES+= screen.4th frames.4th beastie.4th FILESDIR_loader.conf= /boot/defaults .if !exists(${DESTDIR}/boot/loader.rc) FILES+= loader.rc .endif +.endif # XXX crt0.o needs to be first for pxeboot(8) to work OBJS= ${BTXCRT} diff --git a/sys/boot/i386/loader/conf.c b/sys/boot/i386/loader/conf.c index 05c9a9e95f3c..bd14f47079de 100644 --- a/sys/boot/i386/loader/conf.c +++ b/sys/boot/i386/loader/conf.c @@ -128,6 +128,7 @@ extern struct console comconsole; extern struct console dconsole; #endif extern struct console nullconsole; +extern struct console spinconsole; struct console *consoles[] = { &vidconsole, @@ -136,6 +137,7 @@ struct console *consoles[] = { &dconsole, #endif &nullconsole, + &spinconsole, NULL }; diff --git a/sys/boot/i386/loader/main.c b/sys/boot/i386/loader/main.c index 701dd3a12228..75d5dbcb6ec5 100644 --- a/sys/boot/i386/loader/main.c +++ b/sys/boot/i386/loader/main.c @@ -102,14 +102,19 @@ main(void) */ bios_getmem(); -#if defined(LOADER_BZIP2_SUPPORT) || defined(LOADER_FIREWIRE_SUPPORT) || defined(LOADER_GPT_SUPPORT) || defined(LOADER_ZFS_SUPPORT) - heap_top = PTOV(memtop_copyin); - memtop_copyin -= 0x300000; - heap_bottom = PTOV(memtop_copyin); -#else - heap_top = (void *)bios_basemem; - heap_bottom = (void *)end; +#if defined(LOADER_BZIP2_SUPPORT) || defined(LOADER_FIREWIRE_SUPPORT) || \ + defined(LOADER_GPT_SUPPORT) || defined(LOADER_ZFS_SUPPORT) + if (high_heap_size > 0) { + heap_top = PTOV(high_heap_base + high_heap_size); + heap_bottom = PTOV(high_heap_base); + if (high_heap_base < memtop_copyin) + memtop_copyin = high_heap_base; + } else #endif + { + heap_top = (void *)PTOV(bios_basemem); + heap_bottom = (void *)end; + } setheap(heap_bottom, heap_top); /* diff --git a/sys/boot/i386/zfsboot/zfsboot.c b/sys/boot/i386/zfsboot/zfsboot.c index ca035683dd74..07ade3ac61d7 100644 --- a/sys/boot/i386/zfsboot/zfsboot.c +++ b/sys/boot/i386/zfsboot/zfsboot.c @@ -27,6 +27,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -84,14 +85,12 @@ __FBSDID("$FreeBSD$"); #define KARGS_FLAGS_ZFS 0x4 #define PATH_CONFIG "/boot.config" -#define PATH_BOOT3 "/boot/loader" +#define PATH_BOOT3 "/boot/zfsloader" #define PATH_KERNEL "/boot/kernel/kernel" #define ARGS 0x900 #define NOPT 14 #define NDEV 3 -#define MEM_BASE 0x12 -#define MEM_EXT 0x15 #define V86_CY(x) ((x) & 1) #define V86_ZR(x) ((x) & 0x40) @@ -138,8 +137,8 @@ struct dsk { unsigned unit; unsigned slice; unsigned part; - unsigned start; int init; + daddr_t start; }; static char cmd[512]; static char kname[1024]; @@ -149,6 +148,19 @@ static struct bootinfo bootinfo; static uint32_t bootdev; static uint8_t ioctrl = IO_KEYBOARD; +vm_offset_t high_heap_base; +uint32_t bios_basemem, bios_extmem, high_heap_size; + +static struct bios_smap smap; + +/* + * The minimum amount of memory to reserve in bios_extmem for the heap. + */ +#define HEAP_MIN (3 * 1024 * 1024) + +static char *heap_next; +static char *heap_end; + /* Buffers that must not span a 64k boundary. */ #define READ_BUF_SIZE 8192 struct dmadat { @@ -162,8 +174,8 @@ static void load(void); static int parse(void); static void printf(const char *,...); static void putchar(int); -static uint32_t memsize(void); -static int drvread(struct dsk *, void *, unsigned, unsigned); +static void bios_getmem(void); +static int drvread(struct dsk *, void *, daddr_t, unsigned); static int keyhit(unsigned); static int xputc(int); static int xgetc(int); @@ -237,14 +249,6 @@ memset(void *p, char val, size_t n) static void * malloc(size_t n) { - static char *heap_next; - static char *heap_end; - - if (!heap_next) { - heap_next = (char *) dmadat + sizeof(*dmadat); - heap_end = (char *) (640*1024); - } - char *p = heap_next; if (p + n > heap_end) { printf("malloc failure\n"); @@ -310,7 +314,8 @@ static int vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes) { char *p; - unsigned int lba, nb; + daddr_t lba; + unsigned int nb; struct dsk *dsk = (struct dsk *) priv; if ((off & (DEV_BSIZE - 1)) || (bytes & (DEV_BSIZE - 1))) @@ -343,14 +348,91 @@ xfsread(const dnode_phys_t *dnode, off_t *offp, void *buf, size_t nbyte) return 0; } -static inline uint32_t -memsize(void) +static void +bios_getmem(void) { - v86.addr = MEM_EXT; - v86.eax = 0x8800; - v86int(); - return v86.eax; -} + uint64_t size; + + /* Parse system memory map */ + v86.ebx = 0; + do { + v86.ctl = V86_FLAGS; + v86.addr = 0x15; /* int 0x15 function 0xe820*/ + v86.eax = 0xe820; + v86.ecx = sizeof(struct bios_smap); + v86.edx = SMAP_SIG; + v86.es = VTOPSEG(&smap); + v86.edi = VTOPOFF(&smap); + v86int(); + if ((v86.efl & 1) || (v86.eax != SMAP_SIG)) + break; + /* look for a low-memory segment that's large enough */ + if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base == 0) && + (smap.length >= (512 * 1024))) + bios_basemem = smap.length; + /* look for the first segment in 'extended' memory */ + if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base == 0x100000)) { + bios_extmem = smap.length; + } + + /* + * Look for the largest segment in 'extended' memory beyond + * 1MB but below 4GB. + */ + if ((smap.type == SMAP_TYPE_MEMORY) && (smap.base > 0x100000) && + (smap.base < 0x100000000ull)) { + size = smap.length; + + /* + * If this segment crosses the 4GB boundary, truncate it. + */ + if (smap.base + size > 0x100000000ull) + size = 0x100000000ull - smap.base; + + if (size > high_heap_size) { + high_heap_size = size; + high_heap_base = smap.base; + } + } + } while (v86.ebx != 0); + + /* Fall back to the old compatibility function for base memory */ + if (bios_basemem == 0) { + v86.ctl = 0; + v86.addr = 0x12; /* int 0x12 */ + v86int(); + + bios_basemem = (v86.eax & 0xffff) * 1024; + } + + /* Fall back through several compatibility functions for extended memory */ + if (bios_extmem == 0) { + v86.ctl = V86_FLAGS; + v86.addr = 0x15; /* int 0x15 function 0xe801*/ + v86.eax = 0xe801; + v86int(); + if (!(v86.efl & 1)) { + bios_extmem = ((v86.ecx & 0xffff) + ((v86.edx & 0xffff) * 64)) * 1024; + } + } + if (bios_extmem == 0) { + v86.ctl = 0; + v86.addr = 0x15; /* int 0x15 function 0x88*/ + v86.eax = 0x8800; + v86int(); + bios_extmem = (v86.eax & 0xffff) * 1024; + } + + /* + * If we have extended memory and did not find a suitable heap + * region in the SMAP, use the last 3MB of 'extended' memory as a + * high heap candidate. + */ + if (bios_extmem >= HEAP_MIN && high_heap_size < HEAP_MIN) { + high_heap_size = HEAP_MIN; + high_heap_base = bios_extmem + 0x100000 - HEAP_MIN; + } +} static inline void getstr(void) @@ -474,6 +556,7 @@ probe_drive(struct dsk *dsk, spa_t **spap) slba = hdr.hdr_lba_table; elba = slba + hdr.hdr_entries / entries_per_sec; while (slba < elba) { + dsk->start = 0; if (drvread(dsk, sec, slba, 1)) return; for (part = 0; part < entries_per_sec; part++) { @@ -494,7 +577,6 @@ probe_drive(struct dsk *dsk, spa_t **spap) */ dsk = copy_dsk(dsk); } - break; } } slba++; @@ -535,6 +617,16 @@ main(void) off_t off; struct dsk *dsk; + bios_getmem(); + + if (high_heap_size > 0) { + heap_end = PTOV(high_heap_base + high_heap_size); + heap_next = PTOV(high_heap_base); + } else { + heap_next = (char *) dmadat + sizeof(*dmadat); + heap_end = (char *) PTOV(bios_basemem); + } + dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); v86.ctl = V86_FLAGS; @@ -549,8 +641,8 @@ main(void) bootinfo.bi_version = BOOTINFO_VERSION; bootinfo.bi_size = sizeof(bootinfo); - bootinfo.bi_basemem = 0; /* XXX will be filled by loader or kernel */ - bootinfo.bi_extmem = memsize(); + bootinfo.bi_basemem = bios_basemem / 1024; + bootinfo.bi_extmem = bios_extmem / 1024; bootinfo.bi_memsizes_valid++; bootinfo.bi_bios_dev = dsk->drive; @@ -609,7 +701,7 @@ main(void) if (zfs_lookup(spa, PATH_CONFIG, &dn) == 0) { off = 0; - xfsread(&dn, &off, cmd, sizeof(cmd)); + zfs_read(spa, &dn, &off, cmd, sizeof(cmd)); } if (*cmd) { @@ -857,12 +949,13 @@ static void printf(const char *fmt,...) { va_list ap; - char buf[10]; + char buf[20]; char *s; - unsigned u; + unsigned long long u; int c; int minus; int prec; + int l; int len; int pad; @@ -871,6 +964,7 @@ printf(const char *fmt,...) if (c == '%') { minus = 0; prec = 0; + l = 0; nextfmt: c = *fmt++; switch (c) { @@ -892,6 +986,9 @@ printf(const char *fmt,...) case 'c': putchar(va_arg(ap, int)); continue; + case 'l': + l++; + goto nextfmt; case 's': s = va_arg(ap, char *); if (prec) { @@ -914,7 +1011,17 @@ printf(const char *fmt,...) } continue; case 'u': - u = va_arg(ap, unsigned); + switch (l) { + case 2: + u = va_arg(ap, unsigned long long); + break; + case 1: + u = va_arg(ap, unsigned long); + break; + default: + u = va_arg(ap, unsigned); + break; + } s = buf; do *s++ = '0' + u % 10U; @@ -942,14 +1049,14 @@ putchar(int c) static struct { uint16_t len; uint16_t count; - uint16_t seg; uint16_t off; + uint16_t seg; uint64_t lba; } packet; #endif static int -drvread(struct dsk *dsk, void *buf, unsigned lba, unsigned nblk) +drvread(struct dsk *dsk, void *buf, daddr_t lba, unsigned nblk) { #ifdef GPT static unsigned c = 0x2d5c7c2f; @@ -958,8 +1065,8 @@ drvread(struct dsk *dsk, void *buf, unsigned lba, unsigned nblk) printf("%c\b", c = c << 8 | c >> 24); packet.len = 0x10; packet.count = nblk; - packet.seg = VTOPOFF(buf); - packet.off = VTOPSEG(buf); + packet.off = VTOPOFF(buf); + packet.seg = VTOPSEG(buf); packet.lba = lba + dsk->start; v86.ctl = V86_FLAGS; v86.addr = 0x13; @@ -984,7 +1091,7 @@ drvread(struct dsk *dsk, void *buf, unsigned lba, unsigned nblk) v86.es = VTOPSEG(buf); v86.eax = lba; v86.ebx = VTOPOFF(buf); - v86.ecx = lba >> 16; + v86.ecx = lba >> 32; v86.edx = nblk << 8 | dsk->drive; v86int(); v86.ctl = V86_FLAGS; diff --git a/sys/boot/i386/zfsboot/zfsldr.S b/sys/boot/i386/zfsboot/zfsldr.S index a256d30276df..64e384349e69 100644 --- a/sys/boot/i386/zfsboot/zfsldr.S +++ b/sys/boot/i386/zfsboot/zfsldr.S @@ -83,7 +83,7 @@ ebpb: .byte 0 # BIOS physical drive number (W) * Trampoline used by boot2 to call read to read data from the disk via * the BIOS. Call with: * - * %cx:%ax - long - LBA to read in + * %ecx:%eax - long - LBA to read in * %es:(%bx) - caddr_t - buffer to read data into * %dl - byte - drive to read from * %dh - byte - num sectors to read @@ -94,10 +94,8 @@ xread: push %ss # Address /* * Setup an EDD disk packet and pass it to read */ -xread.1: # Starting - pushl $0x0 # absolute - push %cx # block - push %ax # number +xread.1: pushl %ecx # Starting absolute block + pushl %eax # block number push %es # Address of push %bx # transfer buffer xor %ax,%ax # Number of @@ -195,7 +193,7 @@ main.4: xor %dx,%dx # Partition:drive */ main.5: mov %dx,MEM_ARG # Save args movb $NSECT,%dh # Sector count - movw $1024,%ax # Offset to boot2 + movl $1024,%eax # Offset to boot2 callw nread.1 # Read disk main.6: mov $MEM_BUF,%si # BTX (before reloc) mov 0xa(%si),%bx # Get BTX length and set @@ -245,10 +243,11 @@ seta20.3: sti # Enable interrupts /* * Trampoline used to call read from within boot1. */ -nread: xor %ax,%ax # Sector offset in partition +nread: xor %eax,%eax # Sector offset in partition nread.1: mov $MEM_BUF,%bx # Transfer buffer - add 0x8(%si),%ax # Get - mov 0xa(%si),%cx # LBA + xor %ecx,%ecx # Get + addl 0x8(%si),%eax # LBA + adc $0,%ecx push %cs # Read from callw xread.1 # disk jnc return # If success, return diff --git a/sys/boot/i386/zfsloader/Makefile b/sys/boot/i386/zfsloader/Makefile new file mode 100644 index 000000000000..51338e17f82b --- /dev/null +++ b/sys/boot/i386/zfsloader/Makefile @@ -0,0 +1,12 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../loader + +LOADER= zfsloader +NEWVERSWHAT= "ZFS enabled bootstrap loader" i386 +LOADER_ZFS_SUPPORT=yes +LOADER_ONLY= yes +NO_MAN= yes + +.include "${.CURDIR}/../loader/Makefile" + diff --git a/sys/boot/ia64/efi/conf.c b/sys/boot/ia64/efi/conf.c index a72f79fd8254..69d0927131c5 100644 --- a/sys/boot/ia64/efi/conf.c +++ b/sys/boot/ia64/efi/conf.c @@ -49,15 +49,16 @@ __FBSDID("$FreeBSD$"); /* Exported for libstand */ struct devsw *devsw[] = { - &efifs_dev, + &efipart_dev, &efinet_dev, NULL }; struct fs_ops *file_system[] = { - &efifs_fsops, - &nfs_fsops, + &dosfs_fsops, &ufs_fsops, + &cd9660_fsops, + &nfs_fsops, &gzipfs_fsops, NULL }; diff --git a/sys/boot/ia64/efi/main.c b/sys/boot/ia64/efi/main.c index 9419903e3337..3f0b07123bbc 100644 --- a/sys/boot/ia64/efi/main.c +++ b/sys/boot/ia64/efi/main.c @@ -50,7 +50,6 @@ extern char bootprog_rev[]; extern char bootprog_date[]; extern char bootprog_maker[]; -struct devdesc currdev; /* our current device */ struct arch_switch archsw; /* MI/MD interface boundary */ extern u_int64_t ia64_pal_entry; @@ -101,10 +100,49 @@ find_pal_proc(void) return; } +static int +usc2cmp(CHAR16 *s1, CHAR16 *s2) +{ + + while (*s1 == *s2++) { + if (*s1++ == 0) + return (0); + } + return (*s1 - *(s2 - 1)); +} + +static char * +get_dev_option(int argc, CHAR16 *argv[]) +{ + static char dev[32]; + CHAR16 *arg; + char *devp; + int i, j; + + devp = NULL; + for (i = 0; i < argc; i++) { + if (usc2cmp(argv[i], L"-dev") == 0 && i < argc - 1) { + arg = argv[i + 1]; + j = 0; + while (j < sizeof(dev) && *arg != 0) + dev[j++] = *arg++; + if (j == sizeof(dev)) + j--; + dev[j] = '\0'; + devp = dev; + break; + } + } + + return (devp); +} + EFI_STATUS main(int argc, CHAR16 *argv[]) { + struct devdesc currdev; EFI_LOADED_IMAGE *img; + char *dev; int i; /* @@ -115,6 +153,10 @@ main(int argc, CHAR16 *argv[]) */ cons_probe(); + printf("\n"); + printf("%s, Revision %s\n", bootprog_name, bootprog_rev); + printf("(%s, %s)\n", bootprog_maker, bootprog_date); + find_pal_proc(); /* @@ -124,18 +166,6 @@ main(int argc, CHAR16 *argv[]) if (devsw[i]->dv_init != NULL) (devsw[i]->dv_init)(); - /* Get our loaded image protocol interface structure. */ - BS->HandleProtocol(IH, &imgid, (VOID**)&img); - - printf("Image base: 0x%016lx\n", (u_long)img->ImageBase); - - printf("\n"); - printf("%s, Revision %s\n", bootprog_name, bootprog_rev); - printf("(%s, %s)\n", bootprog_maker, bootprog_date); - - efi_handle_lookup(img->DeviceHandle, &currdev.d_dev, &currdev.d_unit); - currdev.d_type = currdev.d_dev->dv_type; - /* * Disable the watchdog timer. By default the boot manager sets * the timer to 5 minutes before invoking a boot option. If we @@ -147,13 +177,24 @@ main(int argc, CHAR16 *argv[]) */ BS->SetWatchdogTimer(0, 0, 0, NULL); - env_setenv("currdev", EV_VOLATILE, ia64_fmtdev(&currdev), - ia64_setcurrdev, env_nounset); + /* Get our loaded image protocol interface structure. */ + BS->HandleProtocol(IH, &imgid, (VOID**)&img); + + bzero(&currdev, sizeof(currdev)); + efi_handle_lookup(img->DeviceHandle, &currdev.d_dev, &currdev.d_unit); + currdev.d_type = currdev.d_dev->dv_type; + env_setenv("loaddev", EV_VOLATILE, ia64_fmtdev(&currdev), env_noset, env_nounset); + dev = get_dev_option(argc, argv); + if (dev == NULL) + dev = ia64_fmtdev(&currdev); + + env_setenv("currdev", EV_VOLATILE, dev, ia64_setcurrdev, env_nounset); + setenv("LINES", "24", 1); /* optional */ - + archsw.arch_autoload = ia64_autoload; archsw.arch_getdev = ia64_getdev; archsw.arch_copyin = ia64_copyin; diff --git a/sys/boot/ia64/efi/version b/sys/boot/ia64/efi/version index 7d7f56651601..148ed4c59805 100644 --- a/sys/boot/ia64/efi/version +++ b/sys/boot/ia64/efi/version @@ -3,6 +3,10 @@ $FreeBSD$ NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this file is important. Make sure the current version number is on line 6. +2.1: Add support for "-dev " argument parsing. +2.0: Provide devices based on the block I/O protocol, rather than the + simple file services protocol. Use the FreeBSD file system code + on top of those devices to access files. 1.2: Restructured. Has some user visible differences. 1.1: Pass the HCDP table address to the kernel via bootinfo if one is present in the EFI system table. diff --git a/sys/boot/ofw/libofw/ofw_disk.c b/sys/boot/ofw/libofw/ofw_disk.c index c3649841c5e0..aaad196eefde 100644 --- a/sys/boot/ofw/libofw/ofw_disk.c +++ b/sys/boot/ofw/libofw/ofw_disk.c @@ -67,7 +67,7 @@ struct opened_dev { SLIST_ENTRY(opened_dev) link; }; -SLIST_HEAD(, opened_dev) opened_devs = SLIST_HEAD_INITIALIZER(opened_dev); +SLIST_HEAD(, opened_dev) opened_devs = SLIST_HEAD_INITIALIZER(opened_devs); static int ofwd_init(void) diff --git a/sys/boot/pc98/Makefile.inc b/sys/boot/pc98/Makefile.inc index 54d4431e9365..641fbca88e67 100644 --- a/sys/boot/pc98/Makefile.inc +++ b/sys/boot/pc98/Makefile.inc @@ -7,7 +7,7 @@ BINDIR?= /boot LOADER_ADDRESS?=0x200000 CFLAGS+= -ffreestanding -mpreferred-stack-boundary=2 \ -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 \ - -Os + -Os -DPC98 LDFLAGS+= -nostdlib # BTX components diff --git a/sys/boot/pc98/boot0.5/selector.s b/sys/boot/pc98/boot0.5/selector.s index 26b5f93fdc66..9d98ef866d17 100644 --- a/sys/boot/pc98/boot0.5/selector.s +++ b/sys/boot/pc98/boot0.5/selector.s @@ -35,7 +35,7 @@ # Display partition table. # showpartitions: - # Clear partion table area + # Clear partition table area movw $16, %cx clear_part: push %cx diff --git a/sys/boot/pc98/boot2/Makefile b/sys/boot/pc98/boot2/Makefile index f5da55d31ed8..63f364c2261a 100644 --- a/sys/boot/pc98/boot2/Makefile +++ b/sys/boot/pc98/boot2/Makefile @@ -1,113 +1,104 @@ # $FreeBSD$ -# -PROG= boot -# Order is very important on the SRCS line for this prog -SRCS= start.S table.c boot2.S boot.c asm.S bios.S serial.S -SRCS+= probe_keyboard.c io.c disk.c sys.c +FILES= boot boot1 boot2 -BINMODE= 444 -CFLAGS= -Os -mrtd \ - -fno-guess-branch-probability \ - -fno-unit-at-a-time \ - -D_KERNEL -DBOOTWAIT=${BOOTWAIT} -DTIMEOUT=${TIMEOUT} -CFLAGS+= -DBOOTSEG=${BOOTSEG} -DBOOTSTACK=${BOOTSTACK} -CFLAGS+= -I${.CURDIR}/../../.. -I. +NM?= nm -# By default, if a serial port is going to be used as console, use COM1 -# (aka /dev/ttyd0). -#BOOT_COMCONSOLE_PORT?=0x30 -BOOT_COMCONSOLE_PORT?=0x238 -BOOT_COMCONSOLE_CLK?=16 -BOOT_COMCONSOLE_MODE=0x0c -CFLAGS+= -DCOMCONSOLE=${BOOT_COMCONSOLE_PORT} \ - -DCOMCONSOLE_CLK=${BOOT_COMCONSOLE_CLK} \ - -DCOMCONSOLE_MODE=${BOOT_COMCONSOLE_MODE} +BOOT_COMCONSOLE_PORT?= 0x238 +BOOT_COMCONSOLE_SPEED?= 9600 +B2SIOFMT?= 0x3 -# feature not implemented -BOOT_COMCONSOLE_SPEED?=9600 -CFLAGS+= -DCOMSPEED=${BOOT_COMCONSOLE_SPEED} +REL1= 0x700 +ORG1= 0 +ORG2= 0x2000 -# Enable code to take the default boot string from a fixed location on the -# disk. See nextboot(8) and README.386BSD for more info. -#CFLAGS+= -DNAMEBLOCK -#CFLAGS+= -DNAMEBLOCK_WRITEBACK +# Decide level of UFS support. +BOOT2_UFS?= UFS1_AND_UFS2 +#BOOT2_UFS?= UFS2_ONLY +#BOOT2_UFS?= UFS1_ONLY -# Bias the conversion from the BIOS drive number to the FreeBSD unit number -# for hard disks. This may be useful for people booting in a mixed IDE/SCSI -# environment (set BOOT_HD_BIAS to the number of IDE drives). -#CFLAGS+= -DBOOT_HD_BIAS=1 -# -# Details: this only applies if BOOT_HD_BIAS > 0. If the BIOS drive number -# for the boot drive is >= BOOT_HD_BIAS, then the boot drive is assumed to -# be SCSI and have unit number (BIOS_drive_number - BOOT_HD_BIAS). E.g., -# BOOT_HD_BIAS=1 makes BIOS drive 1 correspond to 1:da(0,a) instead of -# 1:wd(1,a). If `da' is given explicitly, then the drive is assumed to be -# SCSI and have BIOS drive number (da_unit_number + BOOT_HD_BIAS). E.g., -# BOOT_HD_BIAS=1 makes da(0,a) correspond to 1:da(0,a) instead of 0:da(0,a). +CFLAGS= -Os \ + -fno-guess-branch-probability \ + -fomit-frame-pointer \ + -fno-unit-at-a-time \ + -mno-align-long-strings \ + -mrtd \ + -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 \ + -D${BOOT2_UFS} \ + -DFLAGS=${BOOT_BOOT1_FLAGS} \ + -DSIOPRT=${BOOT_COMCONSOLE_PORT} \ + -DSIOFMT=${B2SIOFMT} \ + -DSIOSPD=${BOOT_COMCONSOLE_SPEED} \ + -I${.CURDIR}/../../.. \ + -I${.CURDIR}/../../i386/boot2 \ + -I${.CURDIR}/../../common \ + -I${.CURDIR}/../btx/lib -I. \ + -Wall -Waggregate-return -Wbad-function-cast -Wcast-align \ + -Wmissing-declarations -Wmissing-prototypes -Wnested-externs \ + -Wpointer-arith -Wshadow -Wstrict-prototypes -Wwrite-strings \ + -Winline --param max-inline-insns-single=100 -CLEANFILES+= boot.nohdr boot.strip boot.ldr boot1 boot2 sizetest -LDFLAGS+= -N -Ttext 0 -e start -NO_SHARED= YES -NO_MAN= -STRIP= +# Set machine type to PC98_SYSTEM_PARAMETER +#CFLAGS+= -DSET_MACHINE_TYPE -# tunable timeout parameter, waiting for keypress, calibrated in ms -BOOTWAIT?= 5000 -# tunable timeout during string input, calibrated in ms -#TIMEOUT?= 30000 +# Initialize the bi_bios_geom using the BIOS geometry +#CFLAGS+= -DGET_BIOSGEOM -# Location that boot2 is loaded at -BOOTSEG= 0x1000 +LDFLAGS=-static -N --gc-sections -# Offset in BOOTSEG for the top of the stack, keep this 16 byte aligned -BOOTSTACK= 0xFFF0 +# Pick up ../Makefile.inc early. +.include -boot.nohdr: boot - objcopy -S -O binary boot boot.nohdr - ls -l boot.nohdr +.PATH: ${.CURDIR}/../../i386/boot2 -boot.ldr: boot.nohdr - dd if=boot.nohdr of=boot.ldr bs=8192 count=1 conv=sync +CLEANFILES= boot -boot1: boot.nohdr - dd if=boot.nohdr of=boot1 bs=512 count=1 +boot: boot1 boot2 + cat boot1 boot2 > boot -boot2: boot.nohdr - dd if=boot.nohdr of=boot2 bs=512 skip=1 - @dd if=boot2 skip=14 of=sizetest 2> /dev/null - @if [ -s sizetest ] ; then \ - echo "boot2 is too big" >&2 ; \ - rm boot2 ; \ - exit 2 ; \ - fi +CLEANFILES+= boot1 boot1.out boot1.o -all: boot.ldr boot1 boot2 +boot1: boot1.out + objcopy -S -O binary boot1.out ${.TARGET} -install: - ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ - boot.ldr ${DESTDIR}${BINDIR}/boot - ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ - boot1 boot2 ${DESTDIR}${BINDIR} +boot1.out: boot1.o + ${LD} ${LDFLAGS} -e start -Ttext ${ORG1} -o ${.TARGET} boot1.o -# If it's not there, don't consider it a target -.if exists(${.CURDIR}/../../../pc98/include) -beforedepend ${OBJS}: machine +CLEANFILES+= boot2 boot2.ld boot2.ldr boot2.bin boot2.out boot2.o \ + boot2.s boot2.s.tmp boot2.h sio.o -machine: - ln -sf ${.CURDIR}/../../../pc98/include machine +boot2: boot2.ld + @set -- `ls -l boot2.ld`; x=$$((7680-$$5)); \ + echo "$$x bytes available"; test $$x -ge 0 + dd if=boot2.ld of=${.TARGET} obs=7680 conv=osync -.endif +boot2.ld: boot2.ldr boot2.bin ${BTXKERN} + btxld -v -E ${ORG2} -f bin -b ${BTXKERN} -l boot2.ldr \ + -o ${.TARGET} -P 1 boot2.bin -.if exists(${.CURDIR}/../../../i386/include) -beforedepend ${OBJS}: i386 +boot2.ldr: + dd if=/dev/zero of=${.TARGET} bs=276 count=1 -i386: - ln -sf ${.CURDIR}/../../../i386/include i386 +boot2.bin: boot2.out + objcopy -S -O binary boot2.out ${.TARGET} -.endif +boot2.out: ${BTXCRT} boot2.o sio.o + ${LD} ${LDFLAGS} -Ttext ${ORG2} -o ${.TARGET} ${.ALLSRC} -CLEANFILES+= machine i386 +boot2.o: boot2.s + +SRCS= boot2.c boot2.h + +boot2.s: boot2.c boot2.h ${.CURDIR}/../../common/ufsread.c + ${CC} ${CFLAGS} -S -o boot2.s.tmp ${.CURDIR}/boot2.c + sed -e '/align/d' -e '/nop/d' < boot2.s.tmp > boot2.s + rm -f boot2.s.tmp + +boot2.h: boot1.out + ${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T (read|putc)/ \ + { x = $$1 - ORG1; \ + printf("#define %sORG %#x\n", toupper($$3), REL1 + x) }' \ + ORG1=`printf "%d" ${ORG1}` \ + REL1=`printf "%d" ${REL1}` > ${.TARGET} -CWARNFLAGS!= ${MAKE} -f bsd.own.mk -f ${.CURDIR}/../../../conf/kern.mk -V CWARNFLAGS .include diff --git a/sys/boot/pc98/boot2/asm.S b/sys/boot/pc98/boot2/asm.S deleted file mode 100644 index de51618f162e..000000000000 --- a/sys/boot/pc98/boot2/asm.S +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:34:13 rpd - * $FreeBSD$ - */ - - -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - - .file "asm.s" - -#include "asm.h" - - -CR0_PE_ON = 0x1 -CR0_PE_OFF = 0xfffffffe - .code16 - .text - -/* - * - * real_to_prot() - * transfer from real mode to protected mode. - */ - -ENTRY(real_to_prot) - /* guarantee that interrupt is disabled when in prot mode */ - cli - - /* load the gdtr */ - .code32 - addr32 - data32 - lgdt EXT(Gdtr) - .code16 - - /* set the PE bit of CR0 */ - mov %cr0, %eax - - or $CR0_PE_ON, %eax - mov %eax, %cr0 - - /* - * make intrasegment jump to flush the processor pipeline and - * reload CS register - */ - .code32 - data32 - ljmp $0x18, $xprot - .code16 -xprot: - - /* - * we are in USE32 mode now - * set up the protected mode segment registers : DS, SS, ES, FS - */ - data32 - movw $0x20, %ax /* data segment */ - mov %ax, %ds /* gas would waste a prefix byte for movw */ - mov %ax, %ss - mov %ax, %es - data32 - movw $0x10, %ax /* flat segment */ - mov %ax, %fs - -#ifdef BDE_DEBUGGER - /* load idtr so we can debug */ - lidt EXT(Idtr_prot) -#endif - - ret - -/* - * - * prot_to_real() - * transfer from protected mode to real mode - * - */ - -ENTRY(prot_to_real) - - /* Prepare %ax while we're still in a mode that gas understands. */ - data32 - movw $0x30, %ax - - /* Change to use16 mode. */ - .code32 - ljmp $0x28, $x16 - .code16 -x16: - - mov %ax, %ds - mov %ax, %ss - mov %ax, %es - mov %ax, %fs - - /* clear the PE bit of CR0 */ - mov %cr0, %eax - and $CR0_PE_OFF, %eax - mov %eax, %cr0 - - /* - * make intersegment jmp to flush the processor pipeline - * and reload CS register - */ - .code32 - data32 - ljmp $BOOTSEG, $xreal - .code16 -xreal: - - /* - * we are in real mode now - * set up the real mode segment registers : DS, SS, ES, FS - */ - mov %cs, %ax - mov %ax, %ds - mov %ax, %ss - mov %ax, %es - mov %ax, %fs - -#ifdef BDE_DEBUGGER - /* load idtr so we can debug */ - addr32 - data32 - lidt EXT(Idtr_real) -#endif - - data32 - ret - -/* - * startprog(phyaddr) - * start the program on protected mode where phyaddr is the entry point - * - * XXX This whole mess should go away and we should run the boot code in - * flat 32 bit mode with it linked -T BOOTSEG. See the netboot code for - * how this is done. - */ - -ENTRY(startprog) - .code32 - push %ebp - mov %esp, %ebp - movl %esp, %eax /* Use eax as the old stack pointer */ - - /* convert the current stack to a 32 bit flat model */ - movw $0x10, %bx - data32 - mov %bx, %ss - addl $(BOOTSEG<<4),%esp - - /* copy the arguments from the old stack to the new stack */ - pushl 0x14(%eax) /* &bootinfo */ - pushl $0 /* was &nfsdiskless */ - pushl $0 /* was esym */ - pushl $0 /* was cyloffset */ - pushl 0x10(%eax) /* bootdev */ - pushl 0x0C(%eax) /* howto */ - movl $(ourreturn),%ebx - addl $(BOOTSEG<<4),%ebx /* Fix it up for flat segments */ - pushl %ebx /* our return address */ - - /* push on our entry address */ - pushl $0x08 /* segment selector */ - pushl 0x08(%eax) /* kernel entry address */ - - /* convert over the other data segs */ - movw $0x10, %bx - data32 - mov %bx, %ds - data32 - mov %bx, %es - - /* convert the PC (and code seg) */ - lret -ourreturn: - /* For now there is not much we can do, just lock in a loop */ - jmp ourreturn - -/* - * pcpy(src, dst, cnt) - * where src is a virtual address and dst is a physical address - */ - -ENTRY(pcpy) - .code32 - push %ebp - mov %esp, %ebp - push %es - push %esi - push %edi - push %ecx - - cld - - /* set %es to point at the flat segment */ - movw $0x10, %ax - mov %ax, %es - - mov 0x8(%ebp), %esi /* source */ - mov 0xc(%ebp), %edi /* destination */ - mov 0x10(%ebp), %ecx /* count */ - - rep - movsb - - pop %ecx - pop %edi - pop %esi - pop %es - pop %ebp - - ret diff --git a/sys/boot/pc98/boot2/asm.h b/sys/boot/pc98/boot2/asm.h deleted file mode 100644 index 914014dea7b8..000000000000 --- a/sys/boot/pc98/boot2/asm.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.7 92/02/29 15:33:41 rpd - * $FreeBSD$ - */ - -#define S_ARG0 4(%esp) -#define S_ARG1 8(%esp) -#define S_ARG2 12(%esp) -#define S_ARG3 16(%esp) - -#define FRAME pushl %ebp; movl %esp, %ebp -#define EMARF leave - -#define B_ARG0 8(%ebp) -#define B_ARG1 12(%ebp) -#define B_ARG2 16(%ebp) -#define B_ARG3 20(%ebp) - -#ifdef wheeze - -#define ALIGN 4 -#define EXT(x) x -#define LEXT(x) x: -#define LCL(x) ./**/x - -#define LB(x,n) ./**/x -#define LBb(x,n) ./**/x -#define LBf(x,n) ./**/x - -#define SVC lcall $7,$0 - -#define String .string -#define Value .value -#define Times(a,b) [a\*b] -#define Divide(a,b) [a\\b] - -#define INB inb (%dx) -#define OUTB outb (%dx) -#define INL inl (%dx) -#define OUTL outl (%dx) - -#else /* wheeze */ - -#define ALIGN -#define LCL(x) x - -#define LB(x,n) n -#ifdef __STDC__ -#define EXT(x) x -#define LEXT(x) .type EXT(x),@function; EXT(x): -#define LBb(x,n) n ## b -#define LBf(x,n) n ## f -#else /* __STDC__ */ -#define EXT(x) _/**/x -#define LEXT(x) .type EXT(x),@function; EXT(x)/**/: -#define LBb(x,n) n/**/b -#define LBf(x,n) n/**/f -#endif /* __STDC__ */ -#define SVC .byte 0x9a; .long 0; .word 0x7 - -#define String .ascii -#define Value .word -#define Times(a,b) (a*b) -#define Divide(a,b) (a/b) - -#define INB inb %dx, %al -#define OUTB outb %al, %dx -#define INL inl %dx, %eax -#define OUTL outl %eax, %dx - -#endif /* wheeze */ - -#define addr32 .byte 0x67 -#define data32 .byte 0x66 - -#ifdef GPROF -#ifdef __STDC__ - -#define MCOUNT .data; LB(x, 9); .long 0; .text; lea LBb(x, 9),%edx; call mcount -#define ENTRY(x) .globl EXT(x); .align ALIGN; LEXT(x) ; \ - pushl %ebp; movl %esp, %ebp; MCOUNT; popl %ebp; -#define ENTRY2(x,y) .globl EXT(x); .globl EXT(y); \ - .align ALIGN; LEXT(x) LEXT(y) ; \ - pushl %ebp; movl %esp, %ebp; MCOUNT; popl %ebp; -#define ASENTRY(x) .globl x; .align ALIGN; x ## : ; \ - pushl %ebp; movl %esp, %ebp; MCOUNT; popl %ebp; - -#else /* __STDC__ */ - -#define MCOUNT .data; LB(x, 9): .long 0; .text; lea LBb(x, 9),%edx; call mcount -#define ENTRY(x) .globl EXT(x); .align ALIGN; LEXT(x) ; \ - pushl %ebp; movl %esp, %ebp; MCOUNT; popl %ebp; -#define ENTRY2(x,y) .globl EXT(x); .globl EXT(y); \ - .align ALIGN; LEXT(x) LEXT(y) -#define ASENTRY(x) .globl x; .align ALIGN; x: ; \ - pushl %ebp; movl %esp, %ebp; MCOUNT; popl %ebp; - -#endif /* __STDC__ */ -#else /* GPROF */ -#ifdef __STDC__ - -#define MCOUNT -#define ENTRY(x) .globl EXT(x); .align ALIGN; LEXT(x) -#define ENTRY2(x,y) .globl EXT(x); .globl EXT(y); \ - .align ALIGN; LEXT(x) LEXT(y) -#define ASENTRY(x) .globl x; .align ALIGN; x ## : - -#else /* __STDC__ */ - -#define MCOUNT -#define ENTRY(x) .globl EXT(x); .align ALIGN; LEXT(x) -#define ENTRY2(x,y) .globl EXT(x); .globl EXT(y); \ - .align ALIGN; LEXT(x) LEXT(y) -#define ASENTRY(x) .globl x; .align ALIGN; x: - -#endif /* __STDC__ */ -#endif /* GPROF */ - -#define Entry(x) .globl EXT(x); .align ALIGN; LEXT(x) -#define DATA(x) .globl EXT(x); .align ALIGN; LEXT(x) diff --git a/sys/boot/pc98/boot2/bios.S b/sys/boot/pc98/boot2/bios.S deleted file mode 100644 index 8a884d6342dc..000000000000 --- a/sys/boot/pc98/boot2/bios.S +++ /dev/null @@ -1,502 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:34:26 rpd - * $FreeBSD$ - */ - -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -/* - * Ported to PC-9801 by Yoshio Kimura - */ - -/* - * Extensions for El Torito CD-ROM booting: - * - * Copyright © 1997 Pluto Technologies International, Inc. Boulder CO - * Copyright © 1997 interface business GmbH, Dresden. - * All rights reserved. - * - * This code has been written by Jörg Wunsch, Dresden. - * Direct comments to . - * - * 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(S) ``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(S) 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. - * - */ - - .file "bios.s" - -#include "asm.h" - .text - -#ifndef CDBOOT - -/* - * PC-9801/PC-9821 SCSI MO booting - * 2002/06/05-07/03 Kawanobe Koh - * - */ -scsi_hd: - .code16 - push %cx - push %ds - mov %bl, %cl /* UA */ - and $0x0F, %cl - xor %ax, %ax - mov %ax, %ds - mov (0x0482), %al /* SCSI HD equipment bits */ - shr %cl, %al - pop %ds - pop %cx - test $1, %al - ret - -/* - * biosread(dev, cyl, head, sec, nsec, offset) - * Read "nsec" sectors from disk to offset "offset" in boot segment - * BIOS call "INT 0x1B Function 0xn6" to read sectors from disk into memory - * Call with %ah = 0xd6(for floppy disk) or 0x06(for hard disk) - * %al = DA/UA - * %bx = data length - * %ch = sector size(for floppy) or cylinder(for hard) - * %cl = cylinder - * %dh = head - * %dl = sector - * %es:%bp = segment:offset of buffer - * Return: - * %al = 0x0 on success; err code on failure - */ - -ENTRY(biosread) - .code32 - push %ebp - mov %esp, %ebp - - push %ebx - push %esi - push %edi - - mov 0x08(%ebp), %bl /* (byte) DA/UA */ - mov 0x0C(%ebp), %ecx /* (word) cylinder */ - mov 0x10(%ebp), %dh /* (byte) head */ - mov 0x14(%ebp), %dl /* (byte) sector */ - mov 0x18(%ebp), %esi /* (byte) number of sectors */ - mov 0x1C(%ebp), %edi /* (word) destination offset */ - - /* prot_to_real will set %es to BOOTSEG */ - call EXT(prot_to_real) /* enter real mode */ - .code16 - mov $0x06, %bh /* read data function */ - mov %bl, %al /* DA */ - and $0xF0, %al - cmp $0x30, %al /* 1440KB FD */ - jz read_floppy - cmp $0x90, %al /* 1200KB FD */ - jz read_floppy - cmp $0xA0, %al /* SCSI HD or MO */ - jnz read_next - call scsi_hd - jnz read_next -read_linear: - mov %dh, %al /* change to linear sector */ - shl $5, %al /* multiply by 32 sector per track */ - add %dl, %al - xor %dh, %dh /* higher 16 bits into %dx */ - mov %ch, %dl - mov %cl, %ch /* lower 16 bits into %cx */ - mov %al, %cl - and $0x7F, %bl /* linear access DA/UA */ - jmp read_next -read_floppy: - inc %dx /* sector address begins from one */ - mov $0x02, %ch /* 512 bytes sector */ - mov $0xD6, %bh /* MT MFM retry seek */ -read_next: - mov %si, %ax /* number of sectors */ - shl $9, %ax /* multiply by 512 bytes */ - xchg %bx, %ax - mov %di, %bp /* destination offset */ - int $0x1B /* disk bios call */ - jc read_end - xor %ax, %ax -read_end: - mov %ax, %bx /* save return value */ - - .code32 - data32 - call EXT(real_to_prot) /* back to protected mode */ - - xor %eax, %eax - mov %bh, %al /* return value in %eax */ - - pop %edi - pop %esi - pop %ebx - pop %ebp - - ret - -#else /* CDBOOT */ - - -/* - * int - * getbootspec(struct specpacket *offset) - * - * Read CD-ROM boot specification packet to "offset". - */ -ENTRY(getbootspec) - push %ebp - mov %esp, %ebp - - push %esi - push %ebx - - movw 0x8(%ebp), %si - mov $0x7f, %edx - - /* prot_to_real will set %es to BOOTSEG */ - call EXT(prot_to_real) /* enter real mode */ - movw $0x4b01, %ax /* (do not) terminate disk emulation */ - movb $0x7f, %dl /* any drive */ - - sti - int $0x13 - cli - - /* save return value (actually movw %ax, %bx) */ - mov %eax, %ebx - - data32 - call EXT(real_to_prot) /* back to protected mode */ - - xor %eax, %eax - movb %bh, %al /* return value in %ax */ - - pop %ebx - pop %esi - pop %ebp - - ret - - -/* - * int - * biosreadlba(struct daddrpacket *daddr) - * Read sectors using the BIOS "read extended" function - * BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory - * Call with %ah = 0x42 - * %dl = drive (0x0 for floppy disk, or emulated CD) - * %ds:%si = ptr to disk address packet - * Return: - * %ah = 0x0 on success; err code on failure - */ - -ENTRY(biosreadlba) - push %ebp - mov %esp, %ebp - - push %ebx - push %esi - - movw 8(%ebp), %si - movl $0, %edx /* emulated CD is always drive 0 */ - - /* prot_to_real will set %es to BOOTSEG */ - call EXT(prot_to_real) /* enter real mode */ - movw $0x4200, %ax /* subfunction */ - movb $0, %dl - - sti - int $0x13 - cli - - /* save return value (actually movw %ax, %bx) */ - mov %eax, %ebx - - data32 - call EXT(real_to_prot) /* back to protected mode */ - - xor %eax, %eax - movb %bh, %al /* return value in %ax */ - - pop %esi - pop %ebx - pop %ebp - - ret - -#endif /* !CDBOOT */ - -/* - * getc() - * BIOS call "INT 18H Function 00H" to read character from keyboard - * Call with %ah = 0x0 - * Return: %ah = keyboard scan code - * %al = ASCII character - */ - -ENTRY(getc) - .code32 - push %ebp - mov %esp, %ebp - push %ebx /* save %ebx */ - push %esi - push %edi - - call EXT(prot_to_real) - .code16 - - movb $0x0, %ah - int $0x18 - - movb %al, %bl /* real_to_prot uses %eax */ - - .code32 - data32 - call EXT(real_to_prot) - - xor %eax, %eax - movb %bl, %al - - pop %edi - pop %esi - pop %ebx - pop %ebp - ret -/* - * ischar() - * if there is a character pending, return it; otherwise return 0 - * BIOS call "INT 18H Function 01H" to check whether a character is pending - * Call with %ah = 0x1 - * Return: - * If key waiting to be input: - * %ah = keyboard scan code - * %al = ASCII character - * %bh = 1 - * else - * %bh = 0 - */ -ENTRY(ischar) - .code32 - push %ebp - mov %esp, %ebp - push %ebx - push %esi - push %edi - - call EXT(prot_to_real) /* enter real mode */ - - xor %ebx, %ebx - .code16 - movb $0x1, %ah - int $0x18 - andb %bh, %bh - data32 - jz nochar - movb %al, %bl - -nochar: - .code32 - data32 - call EXT(real_to_prot) - - xor %eax, %eax - movb %bl, %al - - pop %edi - pop %esi - pop %ebx - pop %ebp - ret - -/* - * - * get_diskinfo(): return a word that represents the - * max number of sectors and heads and drives for this device - * - */ - -ENTRY(get_diskinfo) - .code32 - push %ebp - mov %esp, %ebp - push %ebx - - mov 0x08(%ebp), %bl /* (byte) DA/UA */ - - call EXT(prot_to_real) /* enter real mode */ - .code16 - mov %bl, %al /* DA */ - and $0xf0, %al - mov $18, %dl /* 1440KB FD sectors per track */ - cmp $0x30, %al - jz floppy - mov $15, %dl /* 1200KB FD sectors per track */ - cmp $0x90, %al - jz floppy - cmp $0xA0, %al /* SCSI HD or MO */ - jnz sense - call scsi_hd - jnz sense - - push %ds /* SCSI MO or CD ? */ - xor %ax, %ax - mov %ax, %ds - and $0x0F, %bx /* UA */ - shl $2, %bx /* parameter offset */ - add $0x0460, %bx - mov (%bx), %al /* SCSI equipment parameter[0] */ - and $0x1F, %al /* peripheral device type */ - cmp $7, %al /* SCSI MO */ - jnz good - add $3, %bx - mov (%bx), %al /* SCSI equipment parameter[3] */ - test $0x30, %al /* sector length from 256 to 2048 */ - jnz good - or $0x10, %al /* forced set 512 bytes sector */ - mov %al, (%bx) - mov $0xA100, %dx /* refered by C language */ - mov %dx, %ds - mov %al, (%bx) -good: - pop %ds - - mov $0xFFFE, %cx /* virtual 65535 cylinders setting */ - mov $0x0820, %dx /* standard 8 heads and 32 sectors */ - jmp ok -sense: - mov $0x84, %ah /* ask for disk info */ - mov %bl, %al - int $0x1b - jnc ok /* use %cx and %dx after */ - /* - * Urk. Call failed. It is not supported for floppies by old BIOS's. - * Guess it's a 15-sector floppy. - */ -floppy: - mov $79, %cx /* 80 cylinders 1200K and 1440K FD */ - mov $2, %dh /* 2 heads as double side */ -ok: - .code32 - data32 - call EXT(real_to_prot) /* back to protected mode */ - - /* - * form a longword representing all this gunk: - * 16 bit cylinder - * 8 bit head - * 8 bit sector - */ - mov %ecx, %eax - sal $16, %eax /* max cylinder number from zero */ - mov %dx, %ax /* number of heads and sectors */ - - pop %ebx - pop %ebp - ret - -/* - * - * memsize(i) : return the memory size in KB. i == 0 for conventional memory, - * i == 1 for extended memory - * Both have the return value in AX. - * - */ - -ENTRY(memsize) - .code32 - push %ebp - mov %esp, %ebp - push %ebx - push %esi - push %edi - - mov 8(%ebp), %ebx - - xor %eax, %eax - cmpb $0x01, %bl - jnz memcnv -memext: - movb 0xA1401 - BOOTSEG * 0x10, %al - shll $7, %eax - xorl %ebx, %ebx - movw 0xA1594 - BOOTSEG * 0x10, %bx - shll $10, %ebx - addl %ebx, %eax - jmp xdone - -memcnv: - movb 0xA1501 - BOOTSEG * 0x10, %al - andb $0x07, %al - incl %eax - shll $7, %eax - -xdone: - pop %edi - pop %esi - pop %ebx - pop %ebp - ret diff --git a/sys/boot/pc98/boot2/boot.c b/sys/boot/pc98/boot2/boot.c deleted file mode 100644 index 4bdfbef7b14e..000000000000 --- a/sys/boot/pc98/boot2/boot.c +++ /dev/null @@ -1,405 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, [92/04/03 16:51:14 rvb] - */ -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#include -__FBSDID("$FreeBSD$"); - -#include "boot.h" -#include -#include -#include - -#define ouraddr (BOOTSEG << 4) /* XXX */ - -#define BOOT_CONFIG_SIZE 512 -#define BOOT_HELP_SIZE 2048 -#define KERNEL_CONFIG_SIZE 512 -#define NAMEBUF_LEN 1024 /* oversized to defend against gets() */ - -static char boot_config[BOOT_CONFIG_SIZE]; -static char boot_help[BOOT_HELP_SIZE]; -char *name; -static char kernel_config[KERNEL_CONFIG_SIZE]; -static char kernel_config_namebuf[NAMEBUF_LEN + sizeof "config"]; -static char linebuf[NAMEBUF_LEN]; -static char namebuf[NAMEBUF_LEN]; -struct bootinfo bootinfo; -int loadflags; - -static void getbootdev(char *ptr, int *howto); -static void loadprog(void); -static void readfile(char *path, char *buf, size_t nbytes); - -/* NORETURN */ -void -boot(int drive) -{ - int i, ret; - unsigned char disk_equips; - - /* Pick up the story from the Bios on geometry of disks */ - - for(ret = 0; ret < 2; ret ++) { - if (*(unsigned char*)V(0xA155d) & (1 << ret)) { - bootinfo.bi_bios_geom[ret] = get_diskinfo(ret + 0x80); - } - } - - bootinfo.bi_basemem = memsize(0); - bootinfo.bi_extmem = memsize(1); - bootinfo.bi_memsizes_valid = 1; - - gateA20(); - - /* set machine type to PC98_SYSTEM_PARAMETER */ - machine_check(); - - /* - * The default boot device is the first partition in the - * compatibility slice on the boot drive. - */ - dosdev = drive; - maj = (drive&0x70) >> 3; /* a good first bet */ - if (maj == 4) { /* da */ - disk_equips = *(unsigned char *)V(0xA1482); - unit = 0; - for (i=0; i<(drive&0x0f); i++) { - int media = ((unsigned *)V(0xA1460))[i] & 0x1F; - - if ((disk_equips >> i) & 1) /* HD */ - unit++; - else if (media == 7) /* MO */ - unit++; - } - } else { - unit = drive & 0x0f; - } - readfile("boot.config", boot_config, BOOT_CONFIG_SIZE); - name = "/boot/loader"; - if (boot_config[0] != '\0') { - getbootdev(boot_config, &loadflags); - printf("boot.config: %s", boot_config); - if (openrd() != 0) - name = "kernel"; - } -loadstart: - /* print this all each time.. (saves space to do so) */ - /* If we have looped, use the previous entries as defaults */ - printf("\r \n>> FreeBSD BOOT @ 0x%x: %d/%d k of memory, %s%s console\n" - "Boot default: %d:%s(%d,%c)%s\n" - "%s\n" - "boot: ", - ouraddr, bootinfo.bi_basemem, bootinfo.bi_extmem, - (loadflags & RB_SERIAL) ? "serial" : "internal", - (loadflags & RB_DUAL) ? "/dual" : "", - dosdev & 0x0f, devs[maj], unit, 'a' + part, - name ? name : "*specify_a_kernel_name*", - boot_help); - - /* - * Ignore flags from previous attempted boot, if any. - * XXX this is now too strict. Settings given in boot.config should - * not be changed. - */ - loadflags &= (RB_DUAL | RB_SERIAL); - - /* - * Be paranoid and make doubly sure that the input buffer is empty. - */ - if (loadflags & (RB_DUAL | RB_SERIAL)) - init_serial(); - - if (!gets(linebuf)) - putchar('\n'); - else - getbootdev(linebuf, &loadflags); - if (name == NULL) - goto loadstart; - ret = openrd(); - if (ret != 0) { - if (ret > 0) - printf("Can't find %s\n", name); - goto loadstart; - } -/* if (inode.i_mode&IEXEC) - loadflags |= RB_KDB; -*/ - loadprog(); - goto loadstart; -} - -static void -loadprog(void) -{ - struct exec head; - int startaddr; - int addr; /* physical address.. not directly useable */ - int bootdev; - int i; - unsigned pad; - char *s, *t; - - read((void *)&head, sizeof(head)); - if ( N_BADMAG(head)) { - printf("Invalid format!\n"); - return; - } - - poff = N_TXTOFF(head); - /*if(poff==0) - poff = 32;*/ - - /* - * We assume that the entry address is the same as the lowest text - * address and that the kernel startup code handles relocation by - * this address rounded down to a multiple of 16M. - */ - startaddr = head.a_entry & 0x00FFFFFF; - addr = startaddr; - printf("Booting %d:%s(%d,%c)%s @ 0x%x\n" - , dosdev & 0x0f - , devs[maj] - , unit - , 'a'+part - , name - , addr); - if(addr < 0x00100000) - { - /* - * Bail out, instead of risking to damage the BIOS - * variables, the loader, or the adapter memory area. - * We don't support loading below 1 MB any more. - */ - printf("Start address too low\n"); - return; - } - printf("text=0x%x ", head.a_text); - /********************************************************/ - /* LOAD THE TEXT SEGMENT */ - /********************************************************/ - xread((void *)addr, head.a_text); - addr += head.a_text; - - /********************************************************/ - /* Load the Initialised data after the text */ - /********************************************************/ - while (addr & PAGE_MASK) - *(char *)addr++ = 0; - - printf("data=0x%x ", head.a_data); - xread((void *)addr, head.a_data); - addr += head.a_data; - - /********************************************************/ - /* Skip over the uninitialised data */ - /* (but clear it) */ - /********************************************************/ - printf("bss=0x%x ", head.a_bss); - -/* - * XXX however, we should be checking that we don't load ... into - * nonexistent memory. A full symbol table is unlikely to fit on 4MB - * machines. - */ - /* kzip & kernel will zero their own bss */ - addr += head.a_bss; - - /* Pad to a page boundary. */ - pad = (unsigned)addr & PAGE_MASK; - if (pad != 0) { - pad = PAGE_SIZE - pad; - addr += pad; - } - bootinfo.bi_symtab = addr; - - /********************************************************/ - /* Copy the symbol table size */ - /********************************************************/ - pcpy(&head.a_syms, (void *)addr, sizeof(head.a_syms)); - addr += sizeof(head.a_syms); - - /********************************************************/ - /* Load the symbol table */ - /********************************************************/ - printf("symbols=[+0x%x+0x%x+0x%x", pad, sizeof(head.a_syms), - head.a_syms); - xread((void *)addr, head.a_syms); - addr += head.a_syms; - - /********************************************************/ - /* Load the string table size */ - /********************************************************/ - read((void *)&i, sizeof(int)); - pcpy(&i, (void *)addr, sizeof(int)); - i -= sizeof(int); - addr += sizeof(int); - - /********************************************************/ - /* Load the string table */ - /********************************************************/ - printf("+0x%x+0x%x]\n", sizeof(int), i); - xread((void *)addr, i); - addr += i; - - bootinfo.bi_esymtab = addr; - - /* - * For backwards compatibility, use the previously-unused adaptor - * and controller bitfields to hold the slice number. - */ - bootdev = MAKEBOOTDEV(maj, slice, unit, part); - - bootinfo.bi_version = BOOTINFO_VERSION; - bootinfo.bi_kernelname = (u_int32_t)(name + ouraddr); - bootinfo.bi_nfs_diskless = 0; - bootinfo.bi_size = sizeof(bootinfo); - bootinfo.bi_bios_dev = dosdev; - - /* - * Load the kernel config file (if any). Its name is given by - * appending ".config" to the kernel name. Build the name inline - * because no str*() functions are available. The file has to be - * copied to &disklabel for userconfig. It can't be loaded there - * directly because the label is used late in readfile() in some - * unusual cases. - */ - s = name; - t = kernel_config_namebuf; - do - ; - while ((*t++ = *s++) != '\0'); - s = ".config"; - --t; - do - ; - while ((*t++ = *s++) != '\0'); - readfile(kernel_config_namebuf, kernel_config, KERNEL_CONFIG_SIZE); - pcpy(kernel_config, (char *)&disklabel + ouraddr, KERNEL_CONFIG_SIZE); - - printf("total=0x%x entry point=0x%x\n", addr, startaddr); - startprog(startaddr, loadflags | RB_BOOTINFO, bootdev, - (unsigned)&bootinfo + ouraddr); -} - -static void -readfile(char *path, char *buf, size_t nbytes) -{ - int openstatus; - - buf[0] = '\0'; - name = path; - openstatus = openrd(); - if (openstatus == 0) { - /* XXX no way to determine file size. */ - read(buf, nbytes); - } - buf[nbytes - 1] = '\0'; -} - -static void -getbootdev(char *ptr, int *howto) -{ - char c; - int f; - char *p; - - /* Copy the flags to save some bytes. */ - f = *howto; - - c = *ptr; - for (;;) { -nextarg: - while (c == ' ' || c == '\n') - c = *++ptr; - if (c == '-') - while ((c = *++ptr) != '\0') { - if (c == ' ' || c == '\n') - goto nextarg; - if (c == 'a') - f |= RB_ASKNAME; - if (c == 'C') - f |= RB_CDROM; - if (c == 'D') - f ^= RB_DUAL; - if (c == 'd') - f |= RB_KDB; - if (c == 'g') - f |= RB_GDB; - if (c == 'h') - f ^= RB_SERIAL; - if (c == 'P') - f |= RB_PROBEKBD; - if (c == 'r') - f |= RB_DFLTROOT; - if (c == 's') - f |= RB_SINGLE; - if (c == 'v') - f |= RB_VERBOSE; - } - if (c == '\0') - break; - p = name = namebuf; - while (c != '\0' && c != ' ' && c != '\n') { - *p++ = c; - c = *++ptr; - } - *p = '\0'; - } - if (f & RB_PROBEKBD) { - if (probe_keyboard()) { - f |= RB_DUAL | RB_SERIAL; - printf("No keyboard found\n"); - } else - printf("Keyboard found\n"); - } - if (f & (RB_DUAL | RB_SERIAL)) - init_serial(); - *howto = f; -} diff --git a/sys/boot/pc98/boot2/boot.h b/sys/boot/pc98/boot2/boot.h deleted file mode 100644 index e39fee53d1e8..000000000000 --- a/sys/boot/pc98/boot2/boot.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:35:03 rpd - * $FreeBSD$ - */ - -#include -#include - -typedef int32_t ufs_daddr_t; - -#define MAXFRAG 8 - -#include "quota.h" -#include "inode.h" -#include "fs.h" - -#define RB_DUAL 0x40000 /* XXX */ -#define RB_PROBEKBD 0x80000 /* XXX */ - -extern char *devs[]; -extern char *name; -extern struct fs *fs; -extern struct inode inode; -extern int dosdev, unit, slice, part, maj, boff, poff; -extern unsigned tw_chars; -extern int loadflags; -extern struct disklabel disklabel; - -/* asm.S */ -#if ASM_ONLY -void real_to_prot(void); -void prot_to_real(void); -#endif -void startprog(unsigned int physaddr, int howto, int bootdev, - /* XXX struct bootinfo * */ unsigned int bootinfo); -void pcpy(const void *src, void *dst, size_t count); - -/* bios.S */ -int biosread(int dev, int cyl, int head, int sec, int nsec, void *offset); -void putc(int c); -int getc(void); -int ischar(void); -int get_diskinfo(int drive); -int memsize(int extended); - -/* boot.c */ -void boot(int drive); - -/* boot2.S */ -void boot2(void); - -/* disk.c */ -int devopen(void); -void devread(char *iodest, int sector, int cnt); - -/* io.c */ -void gateA20(void); -void printf(const char *format, ...); -void putchar(int c); -void delay1ms(void); -int gets(char *buf); -int strcmp(const char *s1, const char *s2); -#ifdef CDBOOT -int strcasecmp(const char *s1, const char *s2); -#endif /* !CDBOOT */ -void memcpy(const void *from, void *to, size_t len); -void twiddle(void); -void machine_check(void); - -/* probe_keyboard.c */ -int probe_keyboard(void); - -/* serial.S */ -void serial_putc(int ch); -int serial_getc(void); -int serial_ischar(void); -void init_serial(void); - -/* sys.c */ -void xread(char *addr, int size); -void read(char *buffer, int count); -int openrd(void); - -#define V(ra) (ra - BOOTSEG * 0x10) diff --git a/sys/boot/pc98/boot2/boot1.S b/sys/boot/pc98/boot2/boot1.S new file mode 100644 index 000000000000..e4f48eb1a261 --- /dev/null +++ b/sys/boot/pc98/boot2/boot1.S @@ -0,0 +1,395 @@ +/*- + * Copyright (c) 2008-2009 TAKAHASHI Yoshihiro + * 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$ + */ + +/* Memory Locations */ + .set STACK_OFF,0x6000 # Stack offset + .set LOAD_SIZE,8192 # Load size + .set DAUA,0x0584 # DA/UA + .set MEM_REL,0x700 # Relocation address + .set MEM_ARG,0x900 # Arguments + .set MEM_BUF,0x8cec # Load area + .set MEM_BTX,0x9000 # BTX start + .set MEM_JMP,0x9010 # BTX entry point + .set MEM_USR,0xa000 # Client start + +/* PC98 machine type from sys/pc98/pc98/pc98_machdep.h */ + .set MEM_SYS, 0xa100 # System common area segment + .set PC98_MACHINE_TYPE, 0x0620 # PC98 machine type + .set EPSON_ID, 0x0624 # EPSON machine id + + .set M_NEC_PC98, 0x0001 + .set M_EPSON_PC98, 0x0002 + .set M_NOT_H98, 0x0010 + .set M_H98, 0x0020 + .set M_NOTE, 0x0040 + .set M_NORMAL, 0x1000 + .set M_8M, 0x8000 + +/* Partition Constants */ + .set PRT_OFF,0x1be # Partition offset + +/* Misc. Constants */ + .set SIZ_PAG,0x1000 # Page size + .set SIZ_SEC,0x200 # Sector size + + .set NSECT,0x10 + + .globl start + .globl read + .globl putc + .code16 + +start: jmp main + +boot_cyl: .org 4 + .ascii "IPL1 " + +main: cld + + /* Setup the stack */ + xor %si,%si + mov %si,%ss + mov $STACK_OFF,%sp + + push %cx + + /* Relocate ourself to MEM_REL */ + push %cs + pop %ds + mov %si,%es + mov $MEM_REL,%di + mov $SIZ_SEC,%cx + rep + movsb + + /* Transfer PC-9801 system common area */ + xor %ax,%ax + mov %ax,%si + mov %ax,%ds + mov %ax,%di + mov $MEM_SYS,%ax + mov %ax,%es + mov $0x0600,%cx + rep + movsb + + /* Transfer EPSON machine type */ + mov $0xfd00,%ax + mov %ax,%ds + mov (0x804),%eax + and $0x00ffffff,%eax + mov %eax,%es:(EPSON_ID) + + /* Set machine type to PC98_SYSTEM_PARAMETER */ +#ifdef SET_MACHINE_TYPE + call set_machine_type +#else + mov $M_NEC_PC98+M_NOT_H98,%eax + mov %eax,%es:(PC98_MACHINE_TYPE) +#endif + + /* Setup graphic screen */ + mov $0x42,%ah /* 640x400 */ + mov $0xc0,%ch + int $0x18 + mov $0x40,%ah /* graph on */ + int $0x18 + + /* Setup text screen */ + mov $0x0a00,%ax /* 80x25 */ + int $0x18 + mov $0x0c,%ah /* text on */ + int $0x18 + mov $0x13,%ah /* cursor home */ + xor %dx,%dx + int $0x18 + mov $0x11,%ah /* cursor on */ + int $0x18 + + /* Setup keyboard */ + mov $0x03,%ah + int $0x18 + + pop %cx + + /* bootstrap passes */ + xor %edi,%edi + mov %di,%ds + mov %di,%es + mov %cs,%bx + cmp $0x1fe0,%bx + jz boot_fd + cmp $0x1fc0,%bx + jnz boot_hd + xor %cx,%cx + mov (DAUA),%al + and $0xf0,%al + cmp $0x30,%al + jz boot_fd + cmp $0x90,%al + jnz boot_hd +boot_fd: xor %cx,%cx + jmp boot_load +boot_hd: test %cx,%cx + jnz boot_load + mov %cs:(boot_cyl),%cx +boot_load: mov %cx,MEM_ARG /* Save cylinder number */ + mov %cx,%di + xor %dx,%dx + mov $LOAD_SIZE,%bx + mov $MEM_BUF,%bp + push %cs + callw read + jc error + + /* Transfer boot2.bin */ + mov $MEM_BTX,%bx + mov 0xa(%bx),%si /* BTX size */ + add %bx,%si /* start of boot2.bin */ + mov $MEM_USR+SIZ_PAG*2,%di + mov $MEM_BTX+(NSECT-1)*SIZ_SEC,%cx + sub %si,%cx + rep + movsb + + /* Enable A20 */ + xor %ax,%ax + outb %al,$0xf2 + mov $0x02,%al + outb %al,$0xf6 + + /* Start BTX */ + ljmp $0x0000,$MEM_JMP + +/* + * Reads sectors from the disk. + * Call with: + * + * %bx - bytes to read + * %cx - cylinder + * %dh - head + * %dl - sector + * %edi - lba + * %es:(%bp) - buffer to read data into + */ +read: xor %ax,%ax + mov %ax,%ds + mov $0x06,%ah + mov (DAUA),%al + mov %ax,%si + and $0xf0,%al + cmp $0x30,%al /* 1.44MB FDD */ + jz read_fd + cmp $0x90,%al /* 1MB FDD */ + jz read_fd + cmp $0xa0,%al /* Is SCSI device? */ + jnz read_load + push %cx + mov %si,%cx + and $0x0f,%cl + inc %cl + mov (0x482),%ah + shr %cl,%ah /* Is SCSI HDD? */ + pop %cx + jc read_load + and $0xff7f,%si /* SCSI MO */ + mov %di,%cx + shr $16,%di + mov %di,%dx + jmp read_load +read_fd: or $0xd000,%si + or $0x0200,%cx + inc %dx +read_load: mov %si,%ax + int $0x1b + lret + +/* + * Print out the error message, wait for a keypress, and then reboot + * the machine. + */ +error: push %cs + pop %ds + mov $msg_eread,%si + call putstr + xor %ax,%ax /* Get keypress */ + int $0x18 + xor %ax,%ax /* CPU reset */ + outb %al,$0xf0 +halt: hlt + jmp halt /* Spin */ + +/* + * Display a null-terminated string. + */ +putstr.0: push %cs + callw putc +putstr: lodsb + test %al,%al + jne putstr.0 + ret + +/* + * Display a single char. + */ +putc: pusha + xor %dx,%dx + mov %dx,%ds + mov MEM_REL+cursor-start,%di + mov $0xa000,%bx + mov %bx,%es + mov $(80*2),%cx + + cmp $0x08,%al + je putc.bs + cmp $0x0d,%al + je putc.cr + cmp $0x0a,%al + je putc.lf + cmp $0x5c,%al /* \ */ + jne 1f + mov $0xfc,%al +1: movb $0xe1,%es:0x2000(%di) + stosw + jmp putc.scr +putc.bs: test %di,%di + jz putc.move + dec %di + dec %di + movb $0xe1,%es:0x2000(%di) + movw $0x20,%es:(%di) + jmp putc.move +putc.cr: mov %di,%ax + div %cx + sub %dx,%di + jmp putc.move +putc.lf: add %cx,%di +putc.scr: cmp $(80*2*25),%di /* Scroll screen */ + jb putc.move + push %ds + mov %bx,%ds + mov $(80*2),%si + xor %di,%di + mov $(80*24/2),%cx + rep + movsl + xor %ax,%ax + mov $0x20,%al + mov $80,%cl + rep + stosw + pop %ds + mov $(80*24*2),%di +putc.move: mov %di,MEM_REL+cursor-start /* Move cursor */ + mov $0x13,%ah + mov %di,%dx + int $0x18 + popa + lret + +cursor: .word 0 + +#ifdef SET_MACHINE_TYPE +/* + * Set machine type to PC98_SYSTEM_PARAMETER. + */ +set_machine_type: + xor %edx,%edx + mov %dx,%ds +// mov $MEM_SYS,%ax +// mov %ax,%es + + /* Wait V-SYNC */ +vsync.1: inb $0x60,%al + test $0x20,%al + jnz vsync.1 +vsync.2: inb $0x60,%al + test $0x20,%al + jz vsync.2 + + /* ANK 'A' font */ + xor %al,%al + outb %al,$0xa1 + mov $0x41,%al + outb %al,$0xa3 + + /* Get 'A' font from CG window */ + push %ds + mov $0xa400,%ax + mov %ax,%ds + xor %eax,%eax + xor %bx,%bx + mov $4,%cx +font.1: add (%bx),%eax + add $4,%bx + loop font.1 + pop %ds + cmp $0x6efc58fc,%eax + jnz m_epson + +m_pc98: or $M_NEC_PC98,%edx + mov $0x0458,%bx + mov (%bx),%al + test $0x80,%al + jz m_not_h98 + or $M_H98,%edx + jmp 1f +m_epson: or $M_EPSON_PC98,%edx +m_not_h98: or $M_NOT_H98,%edx + +1: inb $0x42,%al + test $0x20,%al + jz 1f + or $M_8M,%edx + +1: mov $0x0400,%bx + mov (%bx),%al + test $0x80,%al + jz 1f + or $M_NOTE,%edx + +1: mov $PC98_MACHINE_TYPE,%bx + mov %edx,%es:(%bx) + ret +#endif + +/* Messages */ + +msg_eread: .asciz "Error\r\n" + + .org PRT_OFF,0x90 + +/* Partition table */ + + .fill 0x30,0x1,0x0 + .byte 0x80, 0x00, 0x01, 0x00 + .byte 0xa5, 0xff, 0xff, 0xff + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x50, 0xc3, 0x00, 0x00 + + .word 0xaa55 # Magic number diff --git a/sys/boot/pc98/boot2/boot2.S b/sys/boot/pc98/boot2/boot2.S deleted file mode 100644 index be85030b0895..000000000000 --- a/sys/boot/pc98/boot2/boot2.S +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:35:26 rpd - * boot2.S,v 1.6 1995/01/25 21:37:40 bde Exp - * $FreeBSD$ - */ -/* - * Ported to PC-9801 by Yoshio Kimura - */ - -#include "asm.h" - -/* Conventional GDT indexes. */ -#define BOOT_CS_INDEX 3 -#define BOOT_CS16_INDEX 5 -#define BOOT_DS_INDEX 4 - -#ifdef BDE_DEBUGGER -#define DB_CS_INDEX 14 -#define DB_CS16_INDEX 15 -#define DB_DS_INDEX 16 -#define GDT_INDEX 17 -#endif - -/* Vector numbers. */ -#define BREAKPOINT_VECTOR 3 -#define DEBUG_VECTOR 1 - -/* - * boot2() -- second stage boot - * SP points to default string if found - */ - .code16 -ENTRY(boot2) - subl %eax, %eax - mov %cs, %ax - mov %ax, %ds - mov %ax, %es - shll $4, %eax - - /* fix up GDT entries for bootstrap */ -#define FIXUP(gdt_index) \ - .code32; \ - addr32; \ - movl %eax, EXT(Gdt)+(8*gdt_index)+2; /* actually movw %ax */ \ - addr32; \ - movb %bl, EXT(Gdt)+(8*gdt_index)+4; \ - .code16 - - shld $16, %eax, %ebx - FIXUP(BOOT_CS_INDEX) - FIXUP(BOOT_CS16_INDEX) - FIXUP(BOOT_DS_INDEX) - - /* fix up GDT pointer */ - movl %eax, %ecx - addl $ EXT(Gdt), %eax - .code32 - addr32 - data32 - movl %eax, EXT(Gdtr)+2 - .code16 - -#ifdef BDE_DEBUGGER - /* fix up GDT entry for GDT */ - data32 - shld $16, %eax, %ebx - FIXUP(GDT_INDEX) - - /* fix up IDT pointer */ - data32 - addl $ EXT(Idt), %ecx - addr32 - data32 - movl %ecx, EXT(Idtr_prot)+2 - - /* %es = vector table segment for a while */ - push %es - data32 - subl %eax, %eax - mov %ax, %es - - /* fix up GDT entries for bdb */ - data32 - movl $4*DEBUG_VECTOR, %esi - addr32 - movl %es: 2(%esi), %eax /* actually movw to %ax */ - data32 - shll $4, %eax - data32 - shld $16, %eax, %ebx - FIXUP(DB_CS_INDEX) - FIXUP(DB_CS16_INDEX) - FIXUP(DB_DS_INDEX) - - /* Fetch entry points of bdb's protected mode trap handlers. These - * are stored at 2 before the corresponding entry points for real mode. - */ - data32 - subl %ebx, %ebx - addr32 - movl %es: (%esi), %ebx /* actually movw to %bx */ - data32 - subl %ecx, %ecx - addr32 - movl %es: 4*(BREAKPOINT_VECTOR-DEBUG_VECTOR)(%esi), %ecx - /* actually movw to %cx */ - - /* %es = bdb segment for a while */ - data32 - shrl $4, %eax - mov %ax, %es - - /* fix up IDT entries for bdb */ - data32 - subl $2, %ebx /* calculate EA to check it */ - jb 1f /* give up if it would trap */ - addr32 - movl %es: (%ebx), %eax /* actually movw to %ax */ - addr32 - movl %eax, EXT(Idt)+8*DEBUG_VECTOR /* actually movw %ax */ -1: - data32 - subl $2, %ecx - jb 1f - addr32 - movl %es: (%ecx), %eax /* actually movw to %ax */ - addr32 - movl %eax, EXT(Idt)+8*BREAKPOINT_VECTOR /* actually movw %ax */ -1: - - /* finished with groping in real mode segments */ - pop %es -#endif /* BDE_DEBUGGER */ - - /* change to protected mode */ - .code32 - data32 - call EXT(real_to_prot) - - /* clear the bss */ - movl $ EXT(edata), %edi /* no EXT(_edata) - krufty ld */ - movl $ EXT(end), %ecx /* or EXT(_end) */ - subl %edi, %ecx - subb %al, %al - rep - stosb - -#ifdef NAMEBLOCK - movl %esp, EXT(dflt_name) -#endif - - movb 0xA1584 - BOOTSEG * 0x10, %dl - movzbl %dl, %edx /* discard head (%dh) and random high bits */ - pushl %edx - call EXT(boot) -oops: - hlt - jmp oops diff --git a/sys/boot/pc98/boot2/boot2.c b/sys/boot/pc98/boot2/boot2.c new file mode 100644 index 000000000000..8c833ba02d82 --- /dev/null +++ b/sys/boot/pc98/boot2/boot2.c @@ -0,0 +1,842 @@ +/*- + * Copyright (c) 2008-2009 TAKAHASHI Yoshihiro + * Copyright (c) 1998 Robert Nordier + * All rights reserved. + * + * Redistribution and use in source and binary forms are freely + * permitted provided that the above copyright notice and this + * paragraph and the following disclaimer are duplicated in all + * such forms. + * + * This software is provided "AS IS" and without any express or + * implied warranties, including, without limitation, the implied + * warranties of merchantability and fitness for a particular + * purpose. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include + +#include + +#include "boot2.h" +#include "lib.h" + +#define IO_KEYBOARD 1 +#define IO_SERIAL 2 + +#define SECOND 1 /* Circa that many ticks in a second. */ + +#define RBX_ASKNAME 0x0 /* -a */ +#define RBX_SINGLE 0x1 /* -s */ +/* 0x2 is reserved for log2(RB_NOSYNC). */ +/* 0x3 is reserved for log2(RB_HALT). */ +/* 0x4 is reserved for log2(RB_INITNAME). */ +#define RBX_DFLTROOT 0x5 /* -r */ +#define RBX_KDB 0x6 /* -d */ +/* 0x7 is reserved for log2(RB_RDONLY). */ +/* 0x8 is reserved for log2(RB_DUMP). */ +/* 0x9 is reserved for log2(RB_MINIROOT). */ +#define RBX_CONFIG 0xa /* -c */ +#define RBX_VERBOSE 0xb /* -v */ +#define RBX_SERIAL 0xc /* -h */ +#define RBX_CDROM 0xd /* -C */ +/* 0xe is reserved for log2(RB_POWEROFF). */ +#define RBX_GDB 0xf /* -g */ +#define RBX_MUTE 0x10 /* -m */ +/* 0x11 is reserved for log2(RB_SELFTEST). */ +/* 0x12 is reserved for boot programs. */ +/* 0x13 is reserved for boot programs. */ +#define RBX_PAUSE 0x14 /* -p */ +#define RBX_QUIET 0x15 /* -q */ +#define RBX_NOINTR 0x1c /* -n */ +/* 0x1d is reserved for log2(RB_MULTIPLE) and is just misnamed here. */ +#define RBX_DUAL 0x1d /* -D */ +/* 0x1f is reserved for log2(RB_BOOTINFO). */ + +/* pass: -a, -s, -r, -d, -c, -v, -h, -C, -g, -m, -p, -D */ +#define RBX_MASK (OPT_SET(RBX_ASKNAME) | OPT_SET(RBX_SINGLE) | \ + OPT_SET(RBX_DFLTROOT) | OPT_SET(RBX_KDB ) | \ + OPT_SET(RBX_CONFIG) | OPT_SET(RBX_VERBOSE) | \ + OPT_SET(RBX_SERIAL) | OPT_SET(RBX_CDROM) | \ + OPT_SET(RBX_GDB ) | OPT_SET(RBX_MUTE) | \ + OPT_SET(RBX_PAUSE) | OPT_SET(RBX_DUAL)) + +#define PATH_CONFIG "/boot.config" +#define PATH_BOOT3 "/boot/loader" +#define PATH_KERNEL "/boot/kernel/kernel" + +#define ARGS 0x900 +#define NOPT 14 +#define NDEV 3 +#define V86_CY(x) ((x) & PSL_C) +#define V86_ZR(x) ((x) & PSL_Z) + +#define DRV_DISK 0xf0 +#define DRV_UNIT 0x0f + +#define TYPE_AD 0 +#define TYPE_DA 1 +#define TYPE_FD 2 + +#define OPT_SET(opt) (1 << (opt)) +#define OPT_CHECK(opt) ((opts) & OPT_SET(opt)) + +extern uint32_t _end; + +static const char optstr[NOPT] = "DhaCcdgmnpqrsv"; /* Also 'P', 'S' */ +static const unsigned char flags[NOPT] = { + RBX_DUAL, + RBX_SERIAL, + RBX_ASKNAME, + RBX_CDROM, + RBX_CONFIG, + RBX_KDB, + RBX_GDB, + RBX_MUTE, + RBX_NOINTR, + RBX_PAUSE, + RBX_QUIET, + RBX_DFLTROOT, + RBX_SINGLE, + RBX_VERBOSE +}; + +static const char *const dev_nm[NDEV] = {"ad", "da", "fd"}; +static const unsigned char dev_maj[NDEV] = {30, 4, 2}; +static const unsigned char dev_daua[NDEV] = {0x80, 0xa0, 0x90}; + +static struct dsk { + unsigned daua; + unsigned type; + unsigned disk; + unsigned unit; + unsigned head; + unsigned sec; + unsigned slice; + unsigned part; + unsigned start; +} dsk; +static char cmd[512], cmddup[512]; +static char kname[1024]; +static uint32_t opts; +static int comspeed = SIOSPD; +static struct bootinfo bootinfo; +static uint8_t ioctrl = IO_KEYBOARD; + +void exit(int); +static void load(void); +static int parse(void); +static int xfsread(ino_t, void *, size_t); +static int dskread(void *, unsigned, unsigned); +static void printf(const char *,...); +static void putchar(int); +static uint32_t memsize(void); +static int drvread(void *, unsigned); +static int keyhit(unsigned); +static int xputc(int); +static int xgetc(int); +static int getc(int); + +static void memcpy(void *, const void *, int); +static void +memcpy(void *dst, const void *src, int len) +{ + const char *s = src; + char *d = dst; + + while (len--) + *d++ = *s++; +} + +static inline int +strcmp(const char *s1, const char *s2) +{ + for (; *s1 == *s2 && *s1; s1++, s2++); + return (unsigned char)*s1 - (unsigned char)*s2; +} + +#define UFS_SMALL_CGBASE +#include "ufsread.c" + +static inline int +xfsread(ino_t inode, void *buf, size_t nbyte) +{ + if ((size_t)fsread(inode, buf, nbyte) != nbyte) { + printf("Invalid %s\n", "format"); + return -1; + } + return 0; +} + +static inline uint32_t +memsize(void) +{ + u_char *p = (u_char *)PTOV(0); + + return *(p + 0x401) * 128 * 1024 + *(u_int16_t *)(p + 0x594) * 1024 * 1024; +} + +static inline void +getstr(void) +{ + char *s; + int c; + + s = cmd; + for (;;) { + switch (c = xgetc(0)) { + case 0: + break; + case '\177': + case '\b': + if (s > cmd) { + s--; + printf("\b \b"); + } + break; + case '\n': + case '\r': + *s = 0; + return; + default: + if (s - cmd < sizeof(cmd) - 1) + *s++ = c; + putchar(c); + } + } +} + +static inline void +putc(int c) +{ + + v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS; + v86.addr = PUTCORG; /* call to putc in boot1 */ + v86.eax = c; + v86int(); + v86.ctl = V86_FLAGS; +} + +static inline int +is_scsi_hd(void) +{ + + if ((*(u_char *)PTOV(0x482) >> dsk.unit) & 0x01) + return 1; + + return 0; +} + +static inline void +fix_sector_size(void) +{ + u_char *p; + + p = (u_char *)PTOV(0x460 + dsk.unit * 4); /* SCSI equipment parameter */ + + if ((p[0] & 0x1f) == 7) { /* SCSI MO */ + if (!(p[3] & 0x30)) { /* 256B / sector */ + p[3] |= 0x10; /* forced set 512B / sector */ + p[3 + 0xa1000] |= 0x10; + } + } +} + +static inline uint32_t +get_diskinfo(void) +{ + + if (dsk.disk == 0x30) { /* 1440KB FD */ + /* 80 cylinders, 2 heads, 18 sectors */ + return (80 << 16) | (2 << 8) | 18; + } else if (dsk.disk == 0x90) { /* 1200KB FD */ + /* 80 cylinders, 2 heads, 15 sectors */ + return (80 << 16) | (2 << 8) | 15; + } else if (dsk.disk == 0x80 || is_scsi_hd()) { /* IDE or SCSI HDD */ + v86.addr = 0x1b; + v86.eax = 0x8400 | dsk.daua; + v86int(); + return (v86.ecx << 16) | v86.edx; + } + + /* SCSI MO or CD */ + fix_sector_size(); /* SCSI MO */ + + /* other SCSI devices */ + return (65535 << 16) | (8 << 8) | 32; +} + +static void +set_dsk(void) +{ + uint32_t di; + + di = get_diskinfo(); + + dsk.head = (di >> 8) & 0xff; + dsk.sec = di & 0xff; + dsk.start = 0; +} + +#ifdef GET_BIOSGEOM +static uint32_t +bd_getbigeom(int bunit) +{ + int hds = 0; + int unit = 0x80; /* IDE HDD */ + u_int addr = 0x55d; + + while (unit < 0xa7) { + if (*(u_char *)PTOV(addr) & (1 << (unit & 0x0f))) + if (hds++ == bunit) + break; + + if (unit >= 0xA0) { + int media = ((unsigned *)PTOV(0x460))[unit & 0x0F] & 0x1F; + + if (media == 7 && hds++ == bunit) /* SCSI MO */ + return(0xFFFE0820); /* C:65535 H:8 S:32 */ + } + if (++unit == 0x84) { + unit = 0xA0; /* SCSI HDD */ + addr = 0x482; + } + } + if (unit == 0xa7) + return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */ + v86.addr = 0x1b; + v86.eax = 0x8400 | unit; + v86int(); + if (v86.efl & 0x1) + return 0x4F020F; /* 1200KB FD C:80 H:2 S:15 */ + return ((v86.ecx & 0xffff) << 16) | (v86.edx & 0xffff); +} +#endif + +static int +check_slice(void) +{ + struct pc98_partition *dp; + char *sec; + unsigned i, cyl; + + sec = dmadat->secbuf; + cyl = *(uint16_t *)PTOV(ARGS); + set_dsk(); + + if (dsk.type == TYPE_FD) + return (WHOLE_DISK_SLICE); + if (drvread(sec, DOSBBSECTOR + 1)) + return (WHOLE_DISK_SLICE); /* Read error */ + dp = (void *)(sec + DOSPARTOFF); + for (i = 0; i < NDOSPART; i++) { + if (dp[i].dp_mid == DOSMID_386BSD) { + if (dp[i].dp_scyl <= cyl && cyl <= dp[i].dp_ecyl) + return (BASE_SLICE + i); + } + } + + return (WHOLE_DISK_SLICE); +} + +int +main(void) +{ +#ifdef GET_BIOSGEOM + int i; +#endif + int autoboot; + ino_t ino; + + dmadat = (void *)(roundup2(__base + (int32_t)&_end, 0x10000) - __base); + v86.ctl = V86_FLAGS; + v86.efl = PSL_RESERVED_DEFAULT | PSL_I; + dsk.daua = *(uint8_t *)PTOV(0x584); + dsk.disk = dsk.daua & DRV_DISK; + dsk.unit = dsk.daua & DRV_UNIT; + if (dsk.disk == 0x80) + dsk.type = TYPE_AD; + else if (dsk.disk == 0xa0) + dsk.type = TYPE_DA; + else /* if (dsk.disk == 0x30 || dsk.disk == 0x90) */ + dsk.type = TYPE_FD; + dsk.slice = check_slice(); +#ifdef GET_BIOSGEOM + for (i = 0; i < N_BIOS_GEOM; i++) + bootinfo.bi_bios_geom[i] = bd_getbigeom(i); +#endif + bootinfo.bi_version = BOOTINFO_VERSION; + bootinfo.bi_size = sizeof(bootinfo); + bootinfo.bi_basemem = 0; /* XXX will be filled by loader or kernel */ + bootinfo.bi_extmem = memsize(); + bootinfo.bi_memsizes_valid++; + + /* Process configuration file */ + + autoboot = 1; + + if ((ino = lookup(PATH_CONFIG))) + fsread(ino, cmd, sizeof(cmd)); + + if (*cmd) { + memcpy(cmddup, cmd, sizeof(cmd)); + if (parse()) + autoboot = 0; + if (!OPT_CHECK(RBX_QUIET)) + printf("%s: %s", PATH_CONFIG, cmddup); + /* Do not process this command twice */ + *cmd = 0; + } + + /* + * Try to exec stage 3 boot loader. If interrupted by a keypress, + * or in case of failure, try to load a kernel directly instead. + */ + + if (autoboot && !*kname) { + memcpy(kname, PATH_BOOT3, sizeof(PATH_BOOT3)); + if (!keyhit(3*SECOND)) { + load(); + memcpy(kname, PATH_KERNEL, sizeof(PATH_KERNEL)); + } + } + + /* Present the user with the boot2 prompt. */ + + for (;;) { + if (!autoboot || !OPT_CHECK(RBX_QUIET)) + printf("\nFreeBSD/pc98 boot\n" + "Default: %u:%s(%u,%c)%s\n" + "boot: ", + dsk.unit, dev_nm[dsk.type], dsk.unit, + 'a' + dsk.part, kname); + if (ioctrl & IO_SERIAL) + sio_flush(); + if (!autoboot || keyhit(5*SECOND)) + getstr(); + else if (!autoboot || !OPT_CHECK(RBX_QUIET)) + putchar('\n'); + autoboot = 0; + if (parse()) + putchar('\a'); + else + load(); + } +} + +/* XXX - Needed for btxld to link the boot2 binary; do not remove. */ +void +exit(int x) +{ +} + +static void +load(void) +{ + union { + struct exec ex; + Elf32_Ehdr eh; + } hdr; + static Elf32_Phdr ep[2]; + static Elf32_Shdr es[2]; + caddr_t p; + ino_t ino; + uint32_t addr, x; + int fmt, i, j; + + if (!(ino = lookup(kname))) { + if (!ls) + printf("No %s\n", kname); + return; + } + if (xfsread(ino, &hdr, sizeof(hdr))) + return; + if (N_GETMAGIC(hdr.ex) == ZMAGIC) + fmt = 0; + else if (IS_ELF(hdr.eh)) + fmt = 1; + else { + printf("Invalid %s\n", "format"); + return; + } + if (fmt == 0) { + addr = hdr.ex.a_entry & 0xffffff; + p = PTOV(addr); + fs_off = PAGE_SIZE; + if (xfsread(ino, p, hdr.ex.a_text)) + return; + p += roundup2(hdr.ex.a_text, PAGE_SIZE); + if (xfsread(ino, p, hdr.ex.a_data)) + return; + p += hdr.ex.a_data + roundup2(hdr.ex.a_bss, PAGE_SIZE); + bootinfo.bi_symtab = VTOP(p); + memcpy(p, &hdr.ex.a_syms, sizeof(hdr.ex.a_syms)); + p += sizeof(hdr.ex.a_syms); + if (hdr.ex.a_syms) { + if (xfsread(ino, p, hdr.ex.a_syms)) + return; + p += hdr.ex.a_syms; + if (xfsread(ino, p, sizeof(int))) + return; + x = *(uint32_t *)p; + p += sizeof(int); + x -= sizeof(int); + if (xfsread(ino, p, x)) + return; + p += x; + } + } else { + fs_off = hdr.eh.e_phoff; + for (j = i = 0; i < hdr.eh.e_phnum && j < 2; i++) { + if (xfsread(ino, ep + j, sizeof(ep[0]))) + return; + if (ep[j].p_type == PT_LOAD) + j++; + } + for (i = 0; i < 2; i++) { + p = PTOV(ep[i].p_paddr & 0xffffff); + fs_off = ep[i].p_offset; + if (xfsread(ino, p, ep[i].p_filesz)) + return; + } + p += roundup2(ep[1].p_memsz, PAGE_SIZE); + bootinfo.bi_symtab = VTOP(p); + if (hdr.eh.e_shnum == hdr.eh.e_shstrndx + 3) { + fs_off = hdr.eh.e_shoff + sizeof(es[0]) * + (hdr.eh.e_shstrndx + 1); + if (xfsread(ino, &es, sizeof(es))) + return; + for (i = 0; i < 2; i++) { + memcpy(p, &es[i].sh_size, sizeof(es[i].sh_size)); + p += sizeof(es[i].sh_size); + fs_off = es[i].sh_offset; + if (xfsread(ino, p, es[i].sh_size)) + return; + p += es[i].sh_size; + } + } + addr = hdr.eh.e_entry & 0xffffff; + } + bootinfo.bi_esymtab = VTOP(p); + bootinfo.bi_kernelname = VTOP(kname); + bootinfo.bi_bios_dev = dsk.daua; + __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK), + MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part), + 0, 0, 0, VTOP(&bootinfo)); +} + +static int +parse() +{ + char *arg = cmd; + char *ep, *p, *q; + const char *cp; + unsigned int drv; + int c, i, j; + + while ((c = *arg++)) { + if (c == ' ' || c == '\t' || c == '\n') + continue; + for (p = arg; *p && *p != '\n' && *p != ' ' && *p != '\t'; p++); + ep = p; + if (*p) + *p++ = 0; + if (c == '-') { + while ((c = *arg++)) { + if (c == 'P') { + if (*(uint8_t *)PTOV(0x481) & 0x48) { + cp = "yes"; + } else { + opts |= OPT_SET(RBX_DUAL) | OPT_SET(RBX_SERIAL); + cp = "no"; + } + printf("Keyboard: %s\n", cp); + continue; + } else if (c == 'S') { + j = 0; + while ((unsigned int)(i = *arg++ - '0') <= 9) + j = j * 10 + i; + if (j > 0 && i == -'0') { + comspeed = j; + break; + } + /* Fall through to error below ('S' not in optstr[]). */ + } + for (i = 0; c != optstr[i]; i++) + if (i == NOPT - 1) + return -1; + opts ^= OPT_SET(flags[i]); + } + ioctrl = OPT_CHECK(RBX_DUAL) ? (IO_SERIAL|IO_KEYBOARD) : + OPT_CHECK(RBX_SERIAL) ? IO_SERIAL : IO_KEYBOARD; + if (ioctrl & IO_SERIAL) + sio_init(115200 / comspeed); + } else { + for (q = arg--; *q && *q != '('; q++); + if (*q) { + drv = -1; + if (arg[1] == ':') { + drv = *arg - '0'; + if (drv > 9) + return (-1); + arg += 2; + } + if (q - arg != 2) + return -1; + for (i = 0; arg[0] != dev_nm[i][0] || + arg[1] != dev_nm[i][1]; i++) + if (i == NDEV - 1) + return -1; + dsk.type = i; + arg += 3; + dsk.unit = *arg - '0'; + if (arg[1] != ',' || dsk.unit > 9) + return -1; + arg += 2; + dsk.slice = WHOLE_DISK_SLICE; + if (arg[1] == ',') { + dsk.slice = *arg - '0' + 1; + if (dsk.slice > NDOSPART + 1) + return -1; + arg += 2; + } + if (arg[1] != ')') + return -1; + dsk.part = *arg - 'a'; + if (dsk.part > 7) + return (-1); + arg += 2; + if (drv == -1) + drv = dsk.unit; + dsk.disk = dev_daua[dsk.type]; + dsk.daua = dsk.disk | dsk.unit; + dsk_meta = 0; + } + if ((i = ep - arg)) { + if ((size_t)i >= sizeof(kname)) + return -1; + memcpy(kname, arg, i + 1); + } + } + arg = p; + } + return 0; +} + +static int +dskread(void *buf, unsigned lba, unsigned nblk) +{ + struct pc98_partition *dp; + struct disklabel *d; + char *sec; + unsigned sl, i; + u_char *p; + + if (!dsk_meta) { + sec = dmadat->secbuf; + set_dsk(); + if (dsk.type == TYPE_FD) + goto unsliced; + if (drvread(sec, DOSBBSECTOR + 1)) + return -1; + dp = (void *)(sec + DOSPARTOFF); + sl = dsk.slice; + if (sl < BASE_SLICE) { + for (i = 0; i < NDOSPART; i++) + if (dp[i].dp_mid == DOSMID_386BSD) { + sl = BASE_SLICE + i; + break; + } + dsk.slice = sl; + } + if (sl != WHOLE_DISK_SLICE) { + dp += sl - BASE_SLICE; + if (dp->dp_mid != DOSMID_386BSD) { + printf("Invalid %s\n", "slice"); + return -1; + } + dsk.start = dp->dp_scyl * dsk.head * dsk.sec + + dp->dp_shd * dsk.sec + dp->dp_ssect; + } + if (drvread(sec, dsk.start + LABELSECTOR)) + return -1; + d = (void *)(sec + LABELOFFSET); + if (d->d_magic != DISKMAGIC || d->d_magic2 != DISKMAGIC) { + if (dsk.part != RAW_PART) { + printf("Invalid %s\n", "label"); + return -1; + } + } else { + if (dsk.part >= d->d_npartitions || + !d->d_partitions[dsk.part].p_size) { + printf("Invalid %s\n", "partition"); + return -1; + } + dsk.start += d->d_partitions[dsk.part].p_offset; + dsk.start -= d->d_partitions[RAW_PART].p_offset; + } + unsliced: ; + } + for (p = buf; nblk; p += 512, lba++, nblk--) { + if ((i = drvread(p, dsk.start + lba))) + return i; + } + return 0; +} + +static void +printf(const char *fmt,...) +{ + va_list ap; + char buf[10]; + char *s; + unsigned u; + int c; + + va_start(ap, fmt); + while ((c = *fmt++)) { + if (c == '%') { + c = *fmt++; + switch (c) { + case 'c': + putchar(va_arg(ap, int)); + continue; + case 's': + for (s = va_arg(ap, char *); *s; s++) + putchar(*s); + continue; + case 'u': + u = va_arg(ap, unsigned); + s = buf; + do + *s++ = '0' + u % 10U; + while (u /= 10U); + while (--s >= buf) + putchar(*s); + continue; + } + } + putchar(c); + } + va_end(ap); + return; +} + +static void +putchar(int c) +{ + if (c == '\n') + xputc('\r'); + xputc(c); +} + +static int +drvread(void *buf, unsigned lba) +{ + static unsigned c = 0x2d5c7c2f; + unsigned bpc, x, cyl, head, sec; + + bpc = dsk.sec * dsk.head; + cyl = lba / bpc; + x = lba % bpc; + head = x / dsk.sec; + sec = x % dsk.sec; + + if (!OPT_CHECK(RBX_QUIET)) + printf("%c\b", c = c << 8 | c >> 24); + v86.ctl = V86_ADDR | V86_CALLF | V86_FLAGS; + v86.addr = READORG; /* call to read in boot1 */ + v86.ecx = cyl; + v86.edx = (head << 8) | sec; + v86.edi = lba; + v86.ebx = 512; + v86.es = VTOPSEG(buf); + v86.ebp = VTOPOFF(buf); + v86int(); + v86.ctl = V86_FLAGS; + if (V86_CY(v86.efl)) { + printf("error %u c/h/s %u/%u/%u lba %u\n", v86.eax >> 8 & 0xff, + cyl, head, sec, lba); + return -1; + } + return 0; +} + +static inline void +delay(void) +{ + int i; + + i = 800; + do { + outb(0x5f, 0); /* about 600ns */ + } while (--i >= 0); +} + +static int +keyhit(unsigned sec) +{ + unsigned i; + + if (OPT_CHECK(RBX_NOINTR)) + return 0; + for (i = 0; i < sec * 1000; i++) { + if (xgetc(1)) + return 1; + delay(); + } + return 0; +} + +static int +xputc(int c) +{ + if (ioctrl & IO_KEYBOARD) + putc(c); + if (ioctrl & IO_SERIAL) + sio_putc(c); + return c; +} + +static int +xgetc(int fn) +{ + if (OPT_CHECK(RBX_NOINTR)) + return 0; + for (;;) { + if (ioctrl & IO_KEYBOARD && getc(1)) + return fn ? 1 : getc(0); + if (ioctrl & IO_SERIAL && sio_ischar()) + return fn ? 1 : sio_getc(); + if (fn) + return 0; + } +} + +static int +getc(int fn) +{ + v86.addr = 0x18; + v86.eax = fn << 8; + v86int(); + if (fn) + return (v86.ebx >> 8) & 0x01; + else + return v86.eax & 0xff; +} diff --git a/sys/boot/pc98/boot2/dinode.h b/sys/boot/pc98/boot2/dinode.h deleted file mode 100644 index 2a78f344d40c..000000000000 --- a/sys/boot/pc98/boot2/dinode.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 1982, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * 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. - * - * @(#)dinode.h 8.3 (Berkeley) 1/21/94 - * %FreeBSD: src/sys/ufs/ufs/dinode.h,v 1.7 1999/08/28 00:52:27 peter Exp % - * $FreeBSD$ - */ - -#ifndef _UFS_UFS_DINODE_H_ -#define _UFS_UFS_DINODE_H_ - -/* - * The root inode is the root of the file system. Inode 0 can't be used for - * normal purposes and historically bad blocks were linked to inode 1, thus - * the root inode is 2. (Inode 1 is no longer used for this purpose, however - * numerous dump tapes make this assumption, so we are stuck with it). - */ -#define ROOTINO ((ino_t)2) - -/* - * The Whiteout inode# is a dummy non-zero inode number which will - * never be allocated to a real file. It is used as a place holder - * in the directory entry which has been tagged as a DT_W entry. - * See the comments about ROOTINO above. - */ -#define WINO ((ino_t)1) - -/* - * A dinode contains all the meta-data associated with a UFS file. - * This structure defines the on-disk format of a dinode. Since - * this structure describes an on-disk structure, all its fields - * are defined by types with precise widths. - */ - -/* typedef int32_t ufs_daddr_t; */ -#define NDADDR 12 /* Direct addresses in inode. */ -#define NIADDR 3 /* Indirect addresses in inode. */ - -struct dinode { - u_int16_t di_mode; /* 0: IFMT, permissions; see below. */ - int16_t di_nlink; /* 2: File link count. */ - union { - u_int16_t oldids[2]; /* 4: Ffs: old user and group ids. */ - int32_t inumber; /* 4: Lfs: inode number. */ - } di_u; - u_int64_t di_size; /* 8: File byte count. */ - int32_t di_atime; /* 16: Last access time. */ - int32_t di_atimensec; /* 20: Last access time. */ - int32_t di_mtime; /* 24: Last modified time. */ - int32_t di_mtimensec; /* 28: Last modified time. */ - int32_t di_ctime; /* 32: Last inode change time. */ - int32_t di_ctimensec; /* 36: Last inode change time. */ - ufs_daddr_t di_db[NDADDR]; /* 40: Direct disk blocks. */ - ufs_daddr_t di_ib[NIADDR]; /* 88: Indirect disk blocks. */ - u_int32_t di_flags; /* 100: Status flags (chflags). */ - int32_t di_blocks; /* 104: Blocks actually held. */ - int32_t di_gen; /* 108: Generation number. */ - u_int32_t di_uid; /* 112: File owner. */ - u_int32_t di_gid; /* 116: File group. */ - int32_t di_spare[2]; /* 120: Reserved; currently unused */ -}; - -/* - * The di_db fields may be overlaid with other information for - * file types that do not have associated disk storage. Block - * and character devices overlay the first data block with their - * dev_t value. Short symbolic links place their path in the - * di_db area. - */ -#define di_inumber di_u.inumber -#define di_ogid di_u.oldids[1] -#define di_ouid di_u.oldids[0] -#define di_rdev di_db[0] -#define di_shortlink di_db -#define MAXSYMLINKLEN ((NDADDR + NIADDR) * sizeof(ufs_daddr_t)) - -/* File permissions. */ -#define IEXEC 0000100 /* Executable. */ -#define IWRITE 0000200 /* Writeable. */ -#define IREAD 0000400 /* Readable. */ -#define ISVTX 0001000 /* Sticky bit. */ -#define ISGID 0002000 /* Set-gid. */ -#define ISUID 0004000 /* Set-uid. */ - -/* File types. */ -#define IFMT 0170000 /* Mask of file type. */ -#define IFIFO 0010000 /* Named pipe (fifo). */ -#define IFCHR 0020000 /* Character device. */ -#define IFDIR 0040000 /* Directory file. */ -#define IFBLK 0060000 /* Block device. */ -#define IFREG 0100000 /* Regular file. */ -#define IFLNK 0120000 /* Symbolic link. */ -#define IFSOCK 0140000 /* UNIX domain socket. */ -#define IFWHT 0160000 /* Whiteout. */ - -#endif diff --git a/sys/boot/pc98/boot2/disk.c b/sys/boot/pc98/boot2/disk.c deleted file mode 100644 index f9706cad3e00..000000000000 --- a/sys/boot/pc98/boot2/disk.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:35:49 rpd - */ -/* - * Ported to PC-9801 by Yoshio Kimura - */ - -/* - * 93/10/08 bde - * If there is no 386BSD partition, initialize the label sector with - * LABELSECTOR instead of with garbage. - * - * 93/08/22 bde - * Fixed reading of bad sector table. It is at the end of the 'c' - * partition, which is not always at the end of the disk. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include "boot.h" -#include -#include -#include - -#define BIOS_DEV_FLOPPY 0x0 -#define BIOS_DEV_WIN 0x80 - -#define BPS 512 -#define SPT(di) ((di)&0xff) -#define HEADS(di) (((di)>>8)&0xff) - - -static int spt, spc; - -struct fs *fs; -struct inode inode; -int dosdev, unit, slice, part, maj, boff; - -/*#define EMBEDDED_DISKLABEL 1*/ - -/* Read ahead buffer large enough for one track on a 1440K floppy. For - * reading from floppies, the bootstrap has to be loaded on a 64K boundary - * to ensure that this buffer doesn't cross a 64K DMA boundary. - */ -#define RA_SECTORS 18 -static char ra_buf[RA_SECTORS * BPS]; -static int ra_dev; -static int ra_end; -static int ra_first; - -static char *Bread(int dosdev, int sector); - -int -devopen(void) -{ - struct pc98_partition *dptr; - struct disklabel *dl; - char *p; - int i, sector = 0, di, dosdev_copy; - - dosdev_copy = dosdev; - di = get_diskinfo(dosdev_copy); - spc = (spt = SPT(di)) * HEADS(di); - -#ifndef RAWBOOT - if ((dosdev_copy & 0xf0) == 0x90) - { - boff = 0; - part = (spt == 15 ? 0 : 1); - } - else - { -#ifdef EMBEDDED_DISKLABEL - dl = &disklabel; -#else /* EMBEDDED_DISKLABEL */ - p = Bread(dosdev_copy, 1); - dptr = (struct pc98_partition *)p; - slice = WHOLE_DISK_SLICE; - for (i = 0; i < NDOSPART; i++, dptr++) - if (dptr->dp_mid == DOSMID_386BSD) { - slice = BASE_SLICE + i; - sector = dptr->dp_scyl * spc; - break; - } - p = Bread(dosdev, sector + LABELSECTOR); - dl=((struct disklabel *)p); - disklabel = *dl; /* structure copy (maybe useful later)*/ -#endif /* EMBEDDED_DISKLABEL */ - if (dl->d_magic != DISKMAGIC) { - printf("bad disklabel\n"); - return 1; - } - /* This little trick is for OnTrack DiskManager disks */ - boff = dl->d_partitions[part].p_offset - - dl->d_partitions[2].p_offset + sector; - } -#endif /* RAWBOOT */ - return 0; -} - - -/* - * Be aware that cnt is rounded up to N*BPS - */ -void -devread(char *iodest, int sector, int cnt) -{ - int offset; - char *p; - int dosdev_copy; - - for (offset = 0; offset < cnt; offset += BPS) - { - dosdev_copy = dosdev; - p = Bread(dosdev_copy, sector++); - memcpy(p, iodest+offset, BPS); - } -} - - -static char * -Bread(int dosdev, int sector) -{ - if (dosdev != ra_dev || sector < ra_first || sector >= ra_end) - { - int cyl, head, sec, nsec; - - cyl = sector/spc; - head = (sector % spc) / spt; - sec = sector % spt; - nsec = spt - sec; - if (nsec > RA_SECTORS) - nsec = RA_SECTORS; - twiddle(); - if (biosread(dosdev, cyl, head, sec, nsec, ra_buf) != 0) - { - nsec = 1; - twiddle(); - while (biosread(dosdev, cyl, head, sec, nsec, ra_buf) != 0) { - printf("Error: D:0x%x C:%d H:%d S:%d\n", - dosdev, cyl, head, sec); - twiddle(); - } - } - ra_dev = dosdev; - ra_first = sector; - ra_end = sector + nsec; - } - return (ra_buf + (sector - ra_first) * BPS); -} diff --git a/sys/boot/pc98/boot2/fs.h b/sys/boot/pc98/boot2/fs.h deleted file mode 100644 index 8ac77da6d099..000000000000 --- a/sys/boot/pc98/boot2/fs.h +++ /dev/null @@ -1,551 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 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. - * - * @(#)fs.h 8.13 (Berkeley) 3/21/95 - * %FreeBSD: src/sys/ufs/ffs/fs.h,v 1.14.2.3 2001/09/21 19:15:22 dillon Exp % - * $FreeBSD$ - */ - -#ifndef _UFS_FFS_FS_H_ -#define _UFS_FFS_FS_H_ - -/* - * Each disk drive contains some number of file systems. - * A file system consists of a number of cylinder groups. - * Each cylinder group has inodes and data. - * - * A file system is described by its super-block, which in turn - * describes the cylinder groups. The super-block is critical - * data and is replicated in each cylinder group to protect against - * catastrophic loss. This is done at `newfs' time and the critical - * super-block data does not change, so the copies need not be - * referenced further unless disaster strikes. - * - * For file system fs, the offsets of the various blocks of interest - * are given in the super block as: - * [fs->fs_sblkno] Super-block - * [fs->fs_cblkno] Cylinder group block - * [fs->fs_iblkno] Inode blocks - * [fs->fs_dblkno] Data blocks - * The beginning of cylinder group cg in fs, is given by - * the ``cgbase(fs, cg)'' macro. - * - * The first boot and super blocks are given in absolute disk addresses. - * The byte-offset forms are preferred, as they don't imply a sector size. - */ -#define BBSIZE 8192 -#define SBSIZE 8192 -#define BBOFF ((off_t)(0)) -#define SBOFF ((off_t)(BBOFF + BBSIZE)) -#define BBLOCK ((ufs_daddr_t)(0)) -#define SBLOCK ((ufs_daddr_t)(BBLOCK + BBSIZE / DEV_BSIZE)) - -/* - * Addresses stored in inodes are capable of addressing fragments - * of `blocks'. File system blocks of at most size MAXBSIZE can - * be optionally broken into 2, 4, or 8 pieces, each of which is - * addressable; these pieces may be DEV_BSIZE, or some multiple of - * a DEV_BSIZE unit. - * - * Large files consist of exclusively large data blocks. To avoid - * undue wasted disk space, the last data block of a small file may be - * allocated as only as many fragments of a large block as are - * necessary. The file system format retains only a single pointer - * to such a fragment, which is a piece of a single large block that - * has been divided. The size of such a fragment is determinable from - * information in the inode, using the ``blksize(fs, ip, lbn)'' macro. - * - * The file system records space availability at the fragment level; - * to determine block availability, aligned fragments are examined. - */ - -/* - * MINBSIZE is the smallest allowable block size. - * In order to insure that it is possible to create files of size - * 2^32 with only two levels of indirection, MINBSIZE is set to 4096. - * MINBSIZE must be big enough to hold a cylinder group block, - * thus changes to (struct cg) must keep its size within MINBSIZE. - * Note that super blocks are always of size SBSIZE, - * and that both SBSIZE and MAXBSIZE must be >= MINBSIZE. - */ -#define MINBSIZE 4096 - -/* - * The path name on which the file system is mounted is maintained - * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in - * the super block for this name. - */ -#define MAXMNTLEN 512 - -/* - * There is a 128-byte region in the superblock reserved for in-core - * pointers to summary information. Originally this included an array - * of pointers to blocks of struct csum; now there are just three - * pointers and the remaining space is padded with fs_ocsp[]. - * - * NOCSPTRS determines the size of this padding. One pointer (fs_csp) - * is taken away to point to a contiguous array of struct csum for - * all cylinder groups; a second (fs_maxcluster) points to an array - * of cluster sizes that is computed as cylinder groups are inspected, - * and the third points to an array that tracks the creation of new - * directories. - */ -#define NOCSPTRS ((128 / sizeof(void *)) - 3) - -/* - * A summary of contiguous blocks of various sizes is maintained - * in each cylinder group. Normally this is set by the initial - * value of fs_maxcontig. To conserve space, a maximum summary size - * is set by FS_MAXCONTIG. - */ -#define FS_MAXCONTIG 16 - -/* - * MINFREE gives the minimum acceptable percentage of file system - * blocks which may be free. If the freelist drops below this level - * only the superuser may continue to allocate blocks. This may - * be set to 0 if no reserve of free blocks is deemed necessary, - * however throughput drops by fifty percent if the file system - * is run at between 95% and 100% full; thus the minimum default - * value of fs_minfree is 5%. However, to get good clustering - * performance, 10% is a better choice. hence we use 10% as our - * default value. With 10% free space, fragmentation is not a - * problem, so we choose to optimize for time. - */ -#define MINFREE 8 -#define DEFAULTOPT FS_OPTTIME - -/* - * Grigoriy Orlov has done some extensive work to fine - * tune the layout preferences for directories within a filesystem. - * His algorithm can be tuned by adjusting the following parameters - * which tell the system the average file size and the average number - * of files per directory. These defaults are well selected for typical - * filesystems, but may need to be tuned for odd cases like filesystems - * being used for sqiud caches or news spools. - */ -#define AVFILESIZ 16384 /* expected average file size */ -#define AFPDIR 64 /* expected number of files per directory */ - -/* - * The maximum number of snapshot nodes that can be associated - * with each filesystem. This limit affects only the number of - * snapshot files that can be recorded within the superblock so - * that they can be found when the filesystem is mounted. However, - * maintaining too many will slow the filesystem performance, so - * having this limit is a good idea. - * - * VALUE NOT IMPLEMENTED IN 4.x YET, RESERVED FROM -CURRENT SO SUPERBLOCKS - * REMAIN COMPATIBLE. - */ -#define FSMAXSNAP 20 - -/* - * Per cylinder group information; summarized in blocks allocated - * from first cylinder group data blocks. These blocks have to be - * read in from fs_csaddr (size fs_cssize) in addition to the - * super block. - */ -struct csum { - int32_t cs_ndir; /* number of directories */ - int32_t cs_nbfree; /* number of free blocks */ - int32_t cs_nifree; /* number of free inodes */ - int32_t cs_nffree; /* number of free frags */ -}; - -/* - * Super block for an FFS file system. - */ -struct fs { - int32_t fs_firstfield; /* historic file system linked list, */ - int32_t fs_unused_1; /* used for incore super blocks */ - ufs_daddr_t fs_sblkno; /* addr of super-block in filesys */ - ufs_daddr_t fs_cblkno; /* offset of cyl-block in filesys */ - ufs_daddr_t fs_iblkno; /* offset of inode-blocks in filesys */ - ufs_daddr_t fs_dblkno; /* offset of first data after cg */ - int32_t fs_cgoffset; /* cylinder group offset in cylinder */ - int32_t fs_cgmask; /* used to calc mod fs_ntrak */ - time_t fs_time; /* last time written */ - int32_t fs_size; /* number of blocks in fs */ - int32_t fs_dsize; /* number of data blocks in fs */ - int32_t fs_ncg; /* number of cylinder groups */ - int32_t fs_bsize; /* size of basic blocks in fs */ - int32_t fs_fsize; /* size of frag blocks in fs */ - int32_t fs_frag; /* number of frags in a block in fs */ -/* these are configuration parameters */ - int32_t fs_minfree; /* minimum percentage of free blocks */ - int32_t fs_rotdelay; /* num of ms for optimal next block */ - int32_t fs_rps; /* disk revolutions per second */ -/* these fields can be computed from the others */ - int32_t fs_bmask; /* ``blkoff'' calc of blk offsets */ - int32_t fs_fmask; /* ``fragoff'' calc of frag offsets */ - int32_t fs_bshift; /* ``lblkno'' calc of logical blkno */ - int32_t fs_fshift; /* ``numfrags'' calc number of frags */ -/* these are configuration parameters */ - int32_t fs_maxcontig; /* max number of contiguous blks */ - int32_t fs_maxbpg; /* max number of blks per cyl group */ -/* these fields can be computed from the others */ - int32_t fs_fragshift; /* block to frag shift */ - int32_t fs_fsbtodb; /* fsbtodb and dbtofsb shift constant */ - int32_t fs_sbsize; /* actual size of super block */ - int32_t fs_csmask; /* csum block offset (now unused) */ - int32_t fs_csshift; /* csum block number (now unused) */ - int32_t fs_nindir; /* value of NINDIR */ - int32_t fs_inopb; /* value of INOPB */ - int32_t fs_nspf; /* value of NSPF */ -/* yet another configuration parameter */ - int32_t fs_optim; /* optimization preference, see below */ -/* these fields are derived from the hardware */ - int32_t fs_npsect; /* # sectors/track including spares */ - int32_t fs_interleave; /* hardware sector interleave */ - int32_t fs_trackskew; /* sector 0 skew, per track */ -/* fs_id takes the space of the unused fs_headswitch and fs_trkseek fields */ - int32_t fs_id[2]; /* unique filesystem id */ -/* sizes determined by number of cylinder groups and their sizes */ - ufs_daddr_t fs_csaddr; /* blk addr of cyl grp summary area */ - int32_t fs_cssize; /* size of cyl grp summary area */ - int32_t fs_cgsize; /* cylinder group size */ -/* these fields are derived from the hardware */ - int32_t fs_ntrak; /* tracks per cylinder */ - int32_t fs_nsect; /* sectors per track */ - int32_t fs_spc; /* sectors per cylinder */ -/* this comes from the disk driver partitioning */ - int32_t fs_ncyl; /* cylinders in file system */ -/* these fields can be computed from the others */ - int32_t fs_cpg; /* cylinders per group */ - int32_t fs_ipg; /* inodes per group */ - int32_t fs_fpg; /* blocks per group * fs_frag */ -/* this data must be re-computed after crashes */ - struct csum fs_cstotal; /* cylinder summary information */ -/* these fields are cleared at mount time */ - int8_t fs_fmod; /* super block modified flag */ - int8_t fs_clean; /* file system is clean flag */ - int8_t fs_ronly; /* mounted read-only flag */ - int8_t fs_flags; /* see FS_ flags below */ - u_char fs_fsmnt[MAXMNTLEN]; /* name mounted on */ -/* these fields retain the current block allocation info */ - int32_t fs_cgrotor; /* last cg searched */ - void *fs_ocsp[NOCSPTRS]; /* padding; was list of fs_cs buffers */ - u_int8_t *fs_contigdirs; /* # of contiguously allocated dirs */ - struct csum *fs_csp; /* cg summary info buffer for fs_cs */ - int32_t *fs_maxcluster; /* max cluster in each cyl group */ - int32_t fs_cpc; /* cyl per cycle in postbl */ - int16_t fs_opostbl[16][8]; /* old rotation block list head */ - int32_t fs_snapinum[FSMAXSNAP];/* RESERVED FROM 5.x */ - int32_t fs_avgfilesize; /* expected average file size */ - int32_t fs_avgfpdir; /* expected # of files per directory */ - int32_t fs_sparecon[26]; /* reserved for future constants */ - int32_t fs_pendingblocks; /* RESERVED FROM 5.x */ - int32_t fs_pendinginodes; /* RESERVED FROM 5.x */ - int32_t fs_contigsumsize; /* size of cluster summary array */ - int32_t fs_maxsymlinklen; /* max length of an internal symlink */ - int32_t fs_inodefmt; /* format of on-disk inodes */ - u_int64_t fs_maxfilesize; /* maximum representable file size */ - int64_t fs_qbmask; /* ~fs_bmask for use with 64-bit size */ - int64_t fs_qfmask; /* ~fs_fmask for use with 64-bit size */ - int32_t fs_state; /* validate fs_clean field */ - int32_t fs_postblformat; /* format of positional layout tables */ - int32_t fs_nrpos; /* number of rotational positions */ - int32_t fs_postbloff; /* (u_int16) rotation block list head */ - int32_t fs_rotbloff; /* (u_int8) blocks for each rotation */ - int32_t fs_magic; /* magic number */ - u_int8_t fs_space[1]; /* list of blocks for each rotation */ -/* actually longer */ -}; - -/* - * Filesystem identification - */ -#define FS_MAGIC 0x011954 /* the fast filesystem magic number */ -#define FS_OKAY 0x7c269d38 /* superblock checksum */ -#define FS_42INODEFMT -1 /* 4.2BSD inode format */ -#define FS_44INODEFMT 2 /* 4.4BSD inode format */ - -/* - * Preference for optimization. - */ -#define FS_OPTTIME 0 /* minimize allocation time */ -#define FS_OPTSPACE 1 /* minimize disk fragmentation */ - -/* - * Filesystem flags. - */ -#define FS_UNCLEAN 0x01 /* filesystem not clean at mount */ -#define FS_DOSOFTDEP 0x02 /* filesystem using soft dependencies */ - -/* - * Rotational layout table format types - */ -#define FS_42POSTBLFMT -1 /* 4.2BSD rotational table format */ -#define FS_DYNAMICPOSTBLFMT 1 /* dynamic rotational table format */ -/* - * Macros for access to superblock array structures - */ -#define fs_postbl(fs, cylno) \ - (((fs)->fs_postblformat == FS_42POSTBLFMT) \ - ? ((fs)->fs_opostbl[cylno]) \ - : ((int16_t *)((u_int8_t *)(fs) + \ - (fs)->fs_postbloff) + (cylno) * (fs)->fs_nrpos)) -#define fs_rotbl(fs) \ - (((fs)->fs_postblformat == FS_42POSTBLFMT) \ - ? ((fs)->fs_space) \ - : ((u_int8_t *)((u_int8_t *)(fs) + (fs)->fs_rotbloff))) - -/* - * The size of a cylinder group is calculated by CGSIZE. The maximum size - * is limited by the fact that cylinder groups are at most one block. - * Its size is derived from the size of the maps maintained in the - * cylinder group and the (struct cg) size. - */ -#define CGSIZE(fs) \ - /* base cg */ (sizeof(struct cg) + sizeof(int32_t) + \ - /* blktot size */ (fs)->fs_cpg * sizeof(int32_t) + \ - /* blks size */ (fs)->fs_cpg * (fs)->fs_nrpos * sizeof(int16_t) + \ - /* inode map */ howmany((fs)->fs_ipg, NBBY) + \ - /* block map */ howmany((fs)->fs_cpg * (fs)->fs_spc / NSPF(fs), NBBY) +\ - /* if present */ ((fs)->fs_contigsumsize <= 0 ? 0 : \ - /* cluster sum */ (fs)->fs_contigsumsize * sizeof(int32_t) + \ - /* cluster map */ howmany((fs)->fs_cpg * (fs)->fs_spc / NSPB(fs), NBBY))) - -/* - * Convert cylinder group to base address of its global summary info. - */ -#define fs_cs(fs, indx) fs_csp[indx] - -/* - * Cylinder group block for a file system. - */ -#define CG_MAGIC 0x090255 -struct cg { - int32_t cg_firstfield; /* historic cyl groups linked list */ - int32_t cg_magic; /* magic number */ - time_t cg_time; /* time last written */ - int32_t cg_cgx; /* we are the cgx'th cylinder group */ - int16_t cg_ncyl; /* number of cyl's this cg */ - int16_t cg_niblk; /* number of inode blocks this cg */ - int32_t cg_ndblk; /* number of data blocks this cg */ - struct csum cg_cs; /* cylinder summary information */ - int32_t cg_rotor; /* position of last used block */ - int32_t cg_frotor; /* position of last used frag */ - int32_t cg_irotor; /* position of last used inode */ - int32_t cg_frsum[MAXFRAG]; /* counts of available frags */ - int32_t cg_btotoff; /* (int32) block totals per cylinder */ - int32_t cg_boff; /* (u_int16) free block positions */ - int32_t cg_iusedoff; /* (u_int8) used inode map */ - int32_t cg_freeoff; /* (u_int8) free block map */ - int32_t cg_nextfreeoff; /* (u_int8) next available space */ - int32_t cg_clustersumoff; /* (u_int32) counts of avail clusters */ - int32_t cg_clusteroff; /* (u_int8) free cluster map */ - int32_t cg_nclusterblks; /* number of clusters this cg */ - int32_t cg_sparecon[13]; /* reserved for future use */ - u_int8_t cg_space[1]; /* space for cylinder group maps */ -/* actually longer */ -}; - -/* - * Macros for access to cylinder group array structures - */ -#define cg_blktot(cgp) \ - (((cgp)->cg_magic != CG_MAGIC) \ - ? (((struct ocg *)(cgp))->cg_btot) \ - : ((int32_t *)((u_int8_t *)(cgp) + (cgp)->cg_btotoff))) -#define cg_blks(fs, cgp, cylno) \ - (((cgp)->cg_magic != CG_MAGIC) \ - ? (((struct ocg *)(cgp))->cg_b[cylno]) \ - : ((int16_t *)((u_int8_t *)(cgp) + \ - (cgp)->cg_boff) + (cylno) * (fs)->fs_nrpos)) -#define cg_inosused(cgp) \ - (((cgp)->cg_magic != CG_MAGIC) \ - ? (((struct ocg *)(cgp))->cg_iused) \ - : ((u_int8_t *)((u_int8_t *)(cgp) + (cgp)->cg_iusedoff))) -#define cg_blksfree(cgp) \ - (((cgp)->cg_magic != CG_MAGIC) \ - ? (((struct ocg *)(cgp))->cg_free) \ - : ((u_int8_t *)((u_int8_t *)(cgp) + (cgp)->cg_freeoff))) -#define cg_chkmagic(cgp) \ - ((cgp)->cg_magic == CG_MAGIC || ((struct ocg *)(cgp))->cg_magic == CG_MAGIC) -#define cg_clustersfree(cgp) \ - ((u_int8_t *)((u_int8_t *)(cgp) + (cgp)->cg_clusteroff)) -#define cg_clustersum(cgp) \ - ((int32_t *)((u_int8_t *)(cgp) + (cgp)->cg_clustersumoff)) - -/* - * The following structure is defined - * for compatibility with old file systems. - */ -struct ocg { - int32_t cg_firstfield; /* historic linked list of cyl groups */ - int32_t cg_unused_1; /* used for incore cyl groups */ - time_t cg_time; /* time last written */ - int32_t cg_cgx; /* we are the cgx'th cylinder group */ - int16_t cg_ncyl; /* number of cyl's this cg */ - int16_t cg_niblk; /* number of inode blocks this cg */ - int32_t cg_ndblk; /* number of data blocks this cg */ - struct csum cg_cs; /* cylinder summary information */ - int32_t cg_rotor; /* position of last used block */ - int32_t cg_frotor; /* position of last used frag */ - int32_t cg_irotor; /* position of last used inode */ - int32_t cg_frsum[8]; /* counts of available frags */ - int32_t cg_btot[32]; /* block totals per cylinder */ - int16_t cg_b[32][8]; /* positions of free blocks */ - u_int8_t cg_iused[256]; /* used inode map */ - int32_t cg_magic; /* magic number */ - u_int8_t cg_free[1]; /* free block map */ -/* actually longer */ -}; - -/* - * Turn file system block numbers into disk block addresses. - * This maps file system blocks to device size blocks. - */ -#define fsbtodb(fs, b) ((b) << (fs)->fs_fsbtodb) -#define dbtofsb(fs, b) ((b) >> (fs)->fs_fsbtodb) - -/* - * Cylinder group macros to locate things in cylinder groups. - * They calc file system addresses of cylinder group data structures. - */ -#define cgbase(fs, c) ((ufs_daddr_t)((fs)->fs_fpg * (c))) -#define cgdmin(fs, c) (cgstart(fs, c) + (fs)->fs_dblkno) /* 1st data */ -#define cgimin(fs, c) (cgstart(fs, c) + (fs)->fs_iblkno) /* inode blk */ -#define cgsblock(fs, c) (cgstart(fs, c) + (fs)->fs_sblkno) /* super blk */ -#define cgtod(fs, c) (cgstart(fs, c) + (fs)->fs_cblkno) /* cg block */ -#define cgstart(fs, c) \ - (cgbase(fs, c) + (fs)->fs_cgoffset * ((c) & ~((fs)->fs_cgmask))) - -/* - * Macros for handling inode numbers: - * inode number to file system block offset. - * inode number to cylinder group number. - * inode number to file system block address. - */ -#define ino_to_cg(fs, x) ((x) / (fs)->fs_ipg) -#define ino_to_fsba(fs, x) \ - ((ufs_daddr_t)(cgimin(fs, ino_to_cg(fs, x)) + \ - (blkstofrags((fs), (((x) % (fs)->fs_ipg) / INOPB(fs)))))) -#define ino_to_fsbo(fs, x) ((x) % INOPB(fs)) - -/* - * Give cylinder group number for a file system block. - * Give cylinder group block number for a file system block. - */ -#define dtog(fs, d) ((d) / (fs)->fs_fpg) -#define dtogd(fs, d) ((d) % (fs)->fs_fpg) - -/* - * Extract the bits for a block from a map. - * Compute the cylinder and rotational position of a cyl block addr. - */ -#define blkmap(fs, map, loc) \ - (((map)[(loc) / NBBY] >> ((loc) % NBBY)) & (0xff >> (NBBY - (fs)->fs_frag))) -#define cbtocylno(fs, bno) \ - ((bno) * NSPF(fs) / (fs)->fs_spc) -#define cbtorpos(fs, bno) \ - (((bno) * NSPF(fs) % (fs)->fs_spc / (fs)->fs_nsect * (fs)->fs_trackskew + \ - (bno) * NSPF(fs) % (fs)->fs_spc % (fs)->fs_nsect * (fs)->fs_interleave) % \ - (fs)->fs_nsect * (fs)->fs_nrpos / (fs)->fs_npsect) - -/* - * The following macros optimize certain frequently calculated - * quantities by using shifts and masks in place of divisions - * modulos and multiplications. - */ -#define blkoff(fs, loc) /* calculates (loc % fs->fs_bsize) */ \ - ((loc) & (fs)->fs_qbmask) -#define fragoff(fs, loc) /* calculates (loc % fs->fs_fsize) */ \ - ((loc) & (fs)->fs_qfmask) -#define lblktosize(fs, blk) /* calculates ((off_t)blk * fs->fs_bsize) */ \ - ((off_t)(blk) << (fs)->fs_bshift) -/* Use this only when `blk' is known to be small, e.g., < NDADDR. */ -#define smalllblktosize(fs, blk) /* calculates (blk * fs->fs_bsize) */ \ - ((blk) << (fs)->fs_bshift) -#define lblkno(fs, loc) /* calculates (loc / fs->fs_bsize) */ \ - ((loc) >> (fs)->fs_bshift) -#define numfrags(fs, loc) /* calculates (loc / fs->fs_fsize) */ \ - ((loc) >> (fs)->fs_fshift) -#define blkroundup(fs, size) /* calculates roundup(size, fs->fs_bsize) */ \ - (((size) + (fs)->fs_qbmask) & (fs)->fs_bmask) -#define fragroundup(fs, size) /* calculates roundup(size, fs->fs_fsize) */ \ - (((size) + (fs)->fs_qfmask) & (fs)->fs_fmask) -#define fragstoblks(fs, frags) /* calculates (frags / fs->fs_frag) */ \ - ((frags) >> (fs)->fs_fragshift) -#define blkstofrags(fs, blks) /* calculates (blks * fs->fs_frag) */ \ - ((blks) << (fs)->fs_fragshift) -#define fragnum(fs, fsb) /* calculates (fsb % fs->fs_frag) */ \ - ((fsb) & ((fs)->fs_frag - 1)) -#define blknum(fs, fsb) /* calculates rounddown(fsb, fs->fs_frag) */ \ - ((fsb) &~ ((fs)->fs_frag - 1)) - -/* - * Determine the number of available frags given a - * percentage to hold in reserve. - */ -#define freespace(fs, percentreserved) \ - (blkstofrags((fs), (fs)->fs_cstotal.cs_nbfree) + \ - (fs)->fs_cstotal.cs_nffree - \ - ((off_t)((fs)->fs_dsize) * (percentreserved) / 100)) - -/* - * Determining the size of a file block in the file system. - */ -#define blksize(fs, ip, lbn) \ - (((lbn) >= NDADDR || (ip)->i_size >= smalllblktosize(fs, (lbn) + 1)) \ - ? (fs)->fs_bsize \ - : (fragroundup(fs, blkoff(fs, (ip)->i_size)))) -#define dblksize(fs, dip, lbn) \ - (((lbn) >= NDADDR || (dip)->di_size >= smalllblktosize(fs, (lbn) + 1)) \ - ? (fs)->fs_bsize \ - : (fragroundup(fs, blkoff(fs, (dip)->di_size)))) -#define sblksize(fs, size, lbn) \ - (((lbn) >= NDADDR || (size) >= ((lbn) + 1) << (fs)->fs_bshift) \ - ? (fs)->fs_bsize \ - : (fragroundup(fs, blkoff(fs, (size))))) - - -/* - * Number of disk sectors per block/fragment; assumes DEV_BSIZE byte - * sector size. - */ -#define NSPB(fs) ((fs)->fs_nspf << (fs)->fs_fragshift) -#define NSPF(fs) ((fs)->fs_nspf) - -/* - * Number of inodes in a secondary storage block/fragment. - */ -#define INOPB(fs) ((fs)->fs_inopb) -#define INOPF(fs) ((fs)->fs_inopb >> (fs)->fs_fragshift) - -/* - * Number of indirects in a file system block. - */ -#define NINDIR(fs) ((fs)->fs_nindir) - -extern int inside[], around[]; -extern u_char *fragtbl[]; - -#endif diff --git a/sys/boot/pc98/boot2/inode.h b/sys/boot/pc98/boot2/inode.h deleted file mode 100644 index add9bb9f9abd..000000000000 --- a/sys/boot/pc98/boot2/inode.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 1982, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * 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. - * - * @(#)inode.h 8.9 (Berkeley) 5/14/95 - * %FreeBSD: src/sys/ufs/ufs/inode.h,v 1.28.2.2 2001/09/29 12:52:52 iedowse Exp % - * $FreeBSD$ - */ - -#ifndef _UFS_UFS_INODE_H_ -#define _UFS_UFS_INODE_H_ - -#include -#include -#include -#include "dinode.h" - -/* - * The size of a logical block number. - */ -typedef long ufs_lbn_t; - -/* - * This must agree with the definition in . - */ -#define doff_t int32_t - -/* - * The inode is used to describe each active (or recently active) file in the - * UFS filesystem. It is composed of two types of information. The first part - * is the information that is needed only while the file is active (such as - * the identity of the file and linkage to speed its lookup). The second part - * is the permanent meta-data associated with the file which is read in - * from the permanent dinode from long term storage when the file becomes - * active, and is put back when the file is no longer being used. - */ -struct inode { - struct lock i_lock; /* Inode lock. >Keep this first< */ - LIST_ENTRY(inode) i_hash;/* Hash chain. */ - struct vnode *i_vnode;/* Vnode associated with this inode. */ - struct vnode *i_devvp;/* Vnode for block I/O. */ - u_int32_t i_flag; /* flags, see below */ - dev_t i_dev; /* Device associated with the inode. */ - ino_t i_number; /* The identity of the inode. */ - int i_effnlink; /* i_nlink when I/O completes */ - - union { /* Associated filesystem. */ - struct fs *fs; /* FFS */ - struct ext2_sb_info *e2fs; /* EXT2FS */ - } inode_u; -#define i_fs inode_u.fs -#define i_e2fs inode_u.e2fs - struct dquot *i_dquot[MAXQUOTAS]; /* Dquot structures. */ - u_quad_t i_modrev; /* Revision level for NFS lease. */ - struct lockf *i_lockf;/* Head of byte-level lock list. */ - /* - * Side effects; used during directory lookup. - */ - int32_t i_count; /* Size of free slot in directory. */ - doff_t i_endoff; /* End of useful stuff in directory. */ - doff_t i_diroff; /* Offset in dir, where we found last entry. */ - doff_t i_offset; /* Offset of free space in directory. */ - ino_t i_ino; /* Inode number of found directory. */ - u_int32_t i_reclen; /* Size of found directory entry. */ - u_int32_t i_spare[3]; /* XXX actually non-spare (for ext2fs). */ - - struct dirhash *i_dirhash; /* Hashing for large directories */ - /* - * The on-disk dinode itself. - */ - struct dinode i_din; /* 128 bytes of the on-disk dinode. */ -}; - -#define i_atime i_din.di_atime -#define i_atimensec i_din.di_atimensec -#define i_blocks i_din.di_blocks -#define i_ctime i_din.di_ctime -#define i_ctimensec i_din.di_ctimensec -#define i_db i_din.di_db -#define i_flags i_din.di_flags -#define i_gen i_din.di_gen -#define i_gid i_din.di_gid -#define i_ib i_din.di_ib -#define i_mode i_din.di_mode -#define i_mtime i_din.di_mtime -#define i_mtimensec i_din.di_mtimensec -#define i_nlink i_din.di_nlink -#define i_rdev i_din.di_rdev -#define i_shortlink i_din.di_shortlink -#define i_size i_din.di_size -#define i_uid i_din.di_uid - -/* These flags are kept in i_flag. */ -#define IN_ACCESS 0x0001 /* Access time update request. */ -#define IN_CHANGE 0x0002 /* Inode change time update request. */ -#define IN_UPDATE 0x0004 /* Modification time update request. */ -#define IN_MODIFIED 0x0008 /* Inode has been modified. */ -#define IN_RENAME 0x0010 /* Inode is being renamed. */ -#define IN_SHLOCK 0x0020 /* File has shared lock. */ -#define IN_EXLOCK 0x0040 /* File has exclusive lock. */ -#define IN_HASHED 0x0080 /* Inode is on hash list */ -#define IN_LAZYMOD 0x0100 /* Modified, but don't write yet. */ - -#ifdef _KERNEL -/* - * Structure used to pass around logical block paths generated by - * ufs_getlbns and used by truncate and bmap code. - */ -struct indir { - ufs_daddr_t in_lbn; /* Logical block number. */ - int in_off; /* Offset in buffer. */ - int in_exists; /* Flag if the block exists. */ -}; - -/* Convert between inode pointers and vnode pointers. */ -#define VTOI(vp) ((struct inode *)(vp)->v_data) -#define ITOV(ip) ((ip)->i_vnode) - -/* Determine if soft dependencies are being done */ -#define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP) -#define DOINGASYNC(vp) ((vp)->v_mount->mnt_kern_flag & MNTK_ASYNC) - -/* This overlays the fid structure (see mount.h). */ -struct ufid { - u_int16_t ufid_len; /* Length of structure. */ - u_int16_t ufid_pad; /* Force 32-bit alignment. */ - ino_t ufid_ino; /* File number (ino). */ - int32_t ufid_gen; /* Generation number. */ -}; -#endif /* _KERNEL */ - -#endif /* !_UFS_UFS_INODE_H_ */ diff --git a/sys/boot/pc98/boot2/io.c b/sys/boot/pc98/boot2/io.c deleted file mode 100644 index a6b9bdce697b..000000000000 --- a/sys/boot/pc98/boot2/io.c +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:35:57 rpd - */ - -#include -__FBSDID("$FreeBSD$"); - -#include "boot.h" -#include -#include -#include - -static int getchar(int in_buf); - -/* - * Gate A20 for high memory - */ -void -gateA20(void) -{ - outb(0xf2, 0x00); - outb(0xf6, 0x02); -} - -/* printf - only handles %d as decimal, %c as char, %s as string */ - -void -printf(const char *format, ...) -{ - int *dataptr = (void *)&format; - char c; - - dataptr++; - while ((c = *format++)) - if (c != '%') - putchar(c); - else - switch (c = *format++) { - case 'd': { - int num = *dataptr++; - char buf[10], *ptr = buf; - if (num<0) { - num = -num; - putchar('-'); - } - do - *ptr++ = '0'+num%10; - while (num /= 10); - do - putchar(*--ptr); - while (ptr != buf); - break; - } - case 'x': { - unsigned int num = *dataptr++, dig; - char buf[8], *ptr = buf; - do - *ptr++ = (dig=(num&0xf)) > 9? - 'a' + dig - 10 : - '0' + dig; - while (num >>= 4); - do - putchar(*--ptr); - while (ptr != buf); - break; - } - case 'c': putchar((*dataptr++)&0xff); break; - case 's': { - char *ptr = (char *)*dataptr++; - while ((c = *ptr++)) - putchar(c); - break; - } - } -} - -void -putchar(int c) -{ - if (c == '\n') - putchar('\r'); - if (loadflags & RB_DUAL) { - putc(c); - serial_putc(c); - } else if (loadflags & RB_SERIAL) - serial_putc(c); - else - putc(c); -} - -static int -getchar(int in_buf) -{ - int c; - -loop: - if (loadflags & RB_DUAL) { - if (ischar()) - c = getc(); - else if (serial_ischar()) - c = serial_getc(); - else - goto loop; - } else if (loadflags & RB_SERIAL) - c = serial_getc(); - else - c = getc(); - if (c == '\r') - c = '\n'; - if (c == '\b') { - if (in_buf != 0) { - putchar('\b'); - putchar(' '); - } else { - goto loop; - } - } - putchar(c); - return(c); -} - -/* - * This routine uses an inb to an unused port, the time to execute that - * inb is approximately 1.25uS. This value is pretty constant across - * all CPU's and all buses, with the exception of some PCI implentations - * that do not forward this I/O address to the ISA bus as they know it - * is not a valid ISA bus address, those machines execute this inb in - * 60 nS :-(. - * - * XXX this should be converted to use bios_tick. - */ -void -delay1ms(void) -{ - int i = 800; - - while (--i >= 0) - (void)outb(0x5f,0); /* about 600ns */ -} - -static __inline int -isch(void) -{ - int isc; - - /* - * Checking the keyboard has the side effect of enabling clock - * interrupts so that bios_tick works. Check the keyboard to - * get this side effect even if we only want the serial status. - */ - isc = ischar(); - - if (loadflags & RB_DUAL) { - if (isc != 0) - return (isc); - } else if (!(loadflags & RB_SERIAL)) - return (isc); - return (serial_ischar()); -} - -static __inline unsigned -pword(unsigned physaddr) -{ - static int counter = 0; - int i; - - for (i = 0; i < 512; i++) - (void)outb(0x5f, 0); - - return (counter++); -} - -int -gets(char *buf) -{ -#define bios_tick pword(0x46c) -#define BIOS_TICK_MS 1 - unsigned initial_bios_tick; - char *ptr=buf; - -#if BOOTWAIT - for (initial_bios_tick = bios_tick; - bios_tick - initial_bios_tick < BOOTWAIT / BIOS_TICK_MS;) -#endif - if (isch()) - for (;;) { - switch(*ptr = getchar(ptr - buf) & 0xff) { - case '\n': - case '\r': - *ptr = '\0'; - return 1; - case '\b': - if (ptr > buf) ptr--; - continue; - default: - ptr++; - } -#if TIMEOUT + 0 -#if !BOOTWAIT -#error "TIMEOUT without BOOTWAIT" -#endif - for (initial_bios_tick = bios_tick;;) { - if (isch()) - break; - if (bios_tick - initial_bios_tick >= - TIMEOUT / BIOS_TICK_MS) - return 0; - } -#endif - } - return 0; -} - -int -strcmp(const char *s1, const char *s2) -{ - while (*s1 == *s2) { - if (!*s1++) - return 0; - s2++; - } - return 1; -} - -#ifdef CDBOOT -int -strcasecmp(const char *s1, const char *s2) -{ - /* - * We only consider ASCII chars and don't anticipate - * control characters (they are invalid in filenames - * anyway). - */ - while ((*s1 & 0x5f) == (*s2 & 0x5f)) { - if (!*s1++) - return 0; - s2++; - } - return 1; -} -#endif /* !CDBOOT */ - -void -memcpy(const void *from, void *to, size_t len) -{ - const char *fp = (const char *)from; - char *tp = (char *)to; - - while (len-- > 0) - *tp++ = *fp++; -} - -/* To quote Ken: "You are not expected to understand this." :) */ - -void -twiddle(void) -{ - putchar((char)tw_chars); - tw_chars = (tw_chars >> 8) | ((tw_chars & (unsigned long)0xFF) << 24); - putchar('\b'); -} - -static unsigned short *Crtat = (unsigned short *)0; -static int row; -static int col; - -void putc(int c) -{ - static unsigned short *crtat; - unsigned char sys_type; - unsigned short *cp; - int i, pos; - - if (Crtat == 0) { - sys_type = *(unsigned char *)V(0xA1501); - if (sys_type & 0x08) { - Crtat = (unsigned short *)V(0xE0000); - crtat = Crtat; - row = 31; - col = 80; - } else { - Crtat = (unsigned short *)V(0xA0000); - crtat = Crtat; - row = 25; - col = 80; - } - } - - switch(c) { - case '\t': - do { - putc(' '); - } while ((int)crtat % 16); - break; - case '\b': - crtat--; - break; - case '\r': - crtat -= (crtat - Crtat) % col; - break; - case '\n': - crtat += col; - break; - default: - *crtat = (c == 0x5c ? 0xfc : c); - *(crtat++ + 0x1000) = 0xe1; - break; - } - - if (crtat >= Crtat + col * row) { - cp = Crtat; - for (i = 1; i < row; i++) { - memcpy((void *)(cp+col), (void *)cp, col*2); - cp += col; - } - for (i = 0; i < col; i++) { - *cp++ = ' '; - } - crtat -= col; - } - pos = crtat - Crtat; - while((inb(0x60) & 0x04) == 0) {} - outb(0x62, 0x49); - outb(0x60, pos & 0xff); - outb(0x60, pos >> 8); -} - -void machine_check(void) -{ - int ret; - int i; - int data = 0; - - /* PC98_SYSTEM_PARAMETER(0x501) */ - ret = ((*(unsigned char*)V(0xA1501)) & 0x08) >> 3; - - /* Wait V-SYNC */ - while (inb(0x60) & 0x20) {} - while (!(inb(0x60) & 0x20)) {} - - /* ANK 'A' font */ - outb(0xa1, 0x00); - outb(0xa3, 0x41); - - /* M_NORMAL, use CG window (all NEC OK) */ - /* sum */ - for (i = 0; i < 4; i++) { - data += *((unsigned long*)V(0xA4000) + i);/* 0xa4000 */ - } - if (data == 0x6efc58fc) { /* DA data */ - ret |= M_NEC_PC98; - } else { - ret |= M_EPSON_PC98; - } - ret |= (inb(0x42) & 0x20) ? M_8M : 0; - - /* PC98_SYSTEM_PARAMETER(0x400) */ - if ((*(unsigned char*)V(0xA1400)) & 0x80) { - ret |= M_NOTE; - } - if (ret & M_NEC_PC98) { - /* PC98_SYSTEM_PARAMETER(0x458) */ - if ((*(unsigned char*)V(0xA1458)) & 0x80) { - ret |= M_H98; - } else { - ret |= M_NOT_H98; - } - } else - ret |= M_NOT_H98; - - (*(unsigned long *)V(0xA1620)) = ret; -} diff --git a/sys/boot/pc98/boot2/quota.h b/sys/boot/pc98/boot2/quota.h deleted file mode 100644 index 324131acf561..000000000000 --- a/sys/boot/pc98/boot2/quota.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (c) 1982, 1986, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Robert Elz at The University of Melbourne. - * - * 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. - * - * @(#)quota.h 8.3 (Berkeley) 8/19/94 - * %FreeBSD: src/sys/ufs/ufs/quota.h,v 1.15 1999/12/29 04:55:05 peter Exp % - * $FreeBSD$ - */ - -#ifndef _UFS_UFS_QUOTA_H_ -#define _UFS_UFS_QUOTA_H_ - -/* - * Definitions for disk quotas imposed on the average user - * (big brother finally hits UNIX). - * - * The following constants define the amount of time given a user before the - * soft limits are treated as hard limits (usually resulting in an allocation - * failure). The timer is started when the user crosses their soft limit, it - * is reset when they go below their soft limit. - */ -#define MAX_IQ_TIME (7*24*60*60) /* seconds in 1 week */ -#define MAX_DQ_TIME (7*24*60*60) /* seconds in 1 week */ - -/* - * The following constants define the usage of the quota file array in the - * ufsmount structure and dquot array in the inode structure. The semantics - * of the elements of these arrays are defined in the routine getinoquota; - * the remainder of the quota code treats them generically and need not be - * inspected when changing the size of the array. - */ -#define MAXQUOTAS 2 -#define USRQUOTA 0 /* element used for user quotas */ -#define GRPQUOTA 1 /* element used for group quotas */ - -/* - * Definitions for the default names of the quotas files. - */ -#define INITQFNAMES { \ - "user", /* USRQUOTA */ \ - "group", /* GRPQUOTA */ \ - "undefined", \ -} -#define QUOTAFILENAME "quota" -#define QUOTAGROUP "operator" - -/* - * Command definitions for the 'quotactl' system call. The commands are - * broken into a main command defined below and a subcommand that is used - * to convey the type of quota that is being manipulated (see above). - */ -#define SUBCMDMASK 0x00ff -#define SUBCMDSHIFT 8 -#define QCMD(cmd, type) (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK)) - -#define Q_QUOTAON 0x0100 /* enable quotas */ -#define Q_QUOTAOFF 0x0200 /* disable quotas */ -#define Q_GETQUOTA 0x0300 /* get limits and usage */ -#define Q_SETQUOTA 0x0400 /* set limits and usage */ -#define Q_SETUSE 0x0500 /* set usage */ -#define Q_SYNC 0x0600 /* sync disk copy of a filesystems quotas */ - -/* - * The following structure defines the format of the disk quota file - * (as it appears on disk) - the file is an array of these structures - * indexed by user or group number. The setquota system call establishes - * the vnode for each quota file (a pointer is retained in the ufsmount - * structure). - */ -struct dqblk { - u_int32_t dqb_bhardlimit; /* absolute limit on disk blks alloc */ - u_int32_t dqb_bsoftlimit; /* preferred limit on disk blks */ - u_int32_t dqb_curblocks; /* current block count */ - u_int32_t dqb_ihardlimit; /* maximum # allocated inodes + 1 */ - u_int32_t dqb_isoftlimit; /* preferred inode limit */ - u_int32_t dqb_curinodes; /* current # allocated inodes */ - time_t dqb_btime; /* time limit for excessive disk use */ - time_t dqb_itime; /* time limit for excessive files */ -}; - -#ifdef _KERNEL - -#include - -/* - * The following structure records disk usage for a user or group on a - * filesystem. There is one allocated for each quota that exists on any - * filesystem for the current user or group. A cache is kept of recently - * used entries. - */ -struct dquot { - LIST_ENTRY(dquot) dq_hash; /* hash list */ - TAILQ_ENTRY(dquot) dq_freelist; /* free list */ - u_int16_t dq_flags; /* flags, see below */ - u_int16_t dq_cnt; /* count of active references */ - u_int16_t dq_spare; /* unused spare padding */ - u_int16_t dq_type; /* quota type of this dquot */ - u_int32_t dq_id; /* identifier this applies to */ - struct ufsmount *dq_ump; /* filesystem that this is taken from */ - struct dqblk dq_dqb; /* actual usage & quotas */ -}; -/* - * Flag values. - */ -#define DQ_LOCK 0x01 /* this quota locked (no MODS) */ -#define DQ_WANT 0x02 /* wakeup on unlock */ -#define DQ_MOD 0x04 /* this quota modified since read */ -#define DQ_FAKE 0x08 /* no limits here, just usage */ -#define DQ_BLKS 0x10 /* has been warned about blk limit */ -#define DQ_INODS 0x20 /* has been warned about inode limit */ -/* - * Shorthand notation. - */ -#define dq_bhardlimit dq_dqb.dqb_bhardlimit -#define dq_bsoftlimit dq_dqb.dqb_bsoftlimit -#define dq_curblocks dq_dqb.dqb_curblocks -#define dq_ihardlimit dq_dqb.dqb_ihardlimit -#define dq_isoftlimit dq_dqb.dqb_isoftlimit -#define dq_curinodes dq_dqb.dqb_curinodes -#define dq_btime dq_dqb.dqb_btime -#define dq_itime dq_dqb.dqb_itime - -/* - * If the system has never checked for a quota for this file, then it is - * set to NODQUOT. Once a write attempt is made the inode pointer is set - * to reference a dquot structure. - */ -#define NODQUOT NULL - -/* - * Flags to chkdq() and chkiq() - */ -#define FORCE 0x01 /* force usage changes independent of limits */ -#define CHOWN 0x02 /* (advisory) change initiated by chown */ - -/* - * Macros to avoid subroutine calls to trivial functions. - */ -#ifdef DIAGNOSTIC -#define DQREF(dq) dqref(dq) -#else -#define DQREF(dq) (dq)->dq_cnt++ -#endif - -struct inode; -struct mount; -struct proc; -struct ucred; -struct vnode; - -int chkdq __P((struct inode *, long, struct ucred *, int)); -int chkiq __P((struct inode *, long, struct ucred *, int)); -void dqinit __P((void)); -void dqrele __P((struct vnode *, struct dquot *)); -int getinoquota __P((struct inode *)); -int getquota __P((struct mount *, u_long, int, caddr_t)); -int qsync __P((struct mount *mp)); -int quotaoff __P((struct proc *, struct mount *, int)); -int quotaon __P((struct proc *, struct mount *, int, caddr_t)); -int setquota __P((struct mount *, u_long, int, caddr_t)); -int setuse __P((struct mount *, u_long, int, caddr_t)); -int ufs_quotactl __P((struct mount *, int, uid_t, caddr_t, struct proc *)); - -#else /* !_KERNEL */ - -#include - -__BEGIN_DECLS -int quotactl __P((const char *, int, int, void *)); -__END_DECLS - -#endif /* _KERNEL */ - -#endif /* !_UFS_UFS_QUOTA_H_ */ diff --git a/sys/boot/pc98/boot2/serial.S b/sys/boot/pc98/boot2/serial.S deleted file mode 100644 index ea7b98aac4e3..000000000000 --- a/sys/boot/pc98/boot2/serial.S +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:34:26 rpd - * $FreeBSD$ - */ - -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#if COMCONSOLE == 0x238 -#include "serial_16550.S" -#else -#include "serial_8251.S" -#endif diff --git a/sys/boot/pc98/boot2/serial_16550.S b/sys/boot/pc98/boot2/serial_16550.S deleted file mode 100644 index 114a369c8c98..000000000000 --- a/sys/boot/pc98/boot2/serial_16550.S +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:34:26 rpd - * $FreeBSD$ - */ - -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -/* - * Serial bootblock interface routines - * Copyright (c) 1994, J"org Wunsch - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - */ - - .file "serial.S" - -#include -#include "asm.h" - - .text - -/* - * The serial port interface routines implement a simple polled i/o - * interface to a standard serial port. Due to the space restrictions - * for the boot blocks, no BIOS support is used (since BIOS requires - * expensive real/protected mode switches), instead the rudimentary - * BIOS support is duplicated here. - * - * The base address and speed for the i/o port are passed from the - * Makefile in the COMCONSOLE and COMSPEED preprocessor macros. The - * line control parameters are currently hard-coded to 8 bits, no - * parity, 1 stop bit (8N1). This can be changed in init_serial(). - */ - -/* - * void serial_putc(int ch); - * Write character `ch' to port COMCONSOLE. - */ -ENTRY(serial_putc) - movl $10000, %ecx # timeout - movl $COMCONSOLE + 5, %edx # line status reg -1: - decl %ecx - je 2f - inb %dx, %al - testb $0x20, %al - je 1b # TX buffer not empty - - movb 4(%esp), %al - - subl $5, %edx # TX output reg - outb %al, %dx # send this one - -2: - ret - -/* - * int serial_getc(void); - * Read a character from port COMCONSOLE. - */ -ENTRY(serial_getc) - mov $COMCONSOLE + 5, %edx # line status reg -1: - inb %dx, %al - testb $0x01, %al - je 1b # no rx char available - - xorl %eax, %eax - subl $5, %edx # rx buffer reg - inb %dx, %al # fetch (first) character - - andb $0x7F, %al # remove any parity bits we get - cmpb $0x7F, %al # make DEL... - jne 2f - movb $0x08, %al # look like BS -2: - ret - -/* - * int serial_ischar(void); - * If there is a character in the input buffer of port COMCONSOLE, - * return nonzero; otherwise return 0. - */ -ENTRY(serial_ischar) - xorl %eax, %eax - movl $COMCONSOLE + 5, %edx # line status reg - inb %dx, %al - andb $0x01, %al # rx char available? - ret - -/* - * void init_serial(void); - * Initialize port COMCONSOLE to speed COMSPEED, line settings 8N1. - */ -ENTRY(init_serial) - movl $COMCONSOLE + 3, %edx # line control reg - movb $0x80, %al - outb %al, %dx # enable DLAB - - subl $3, %edx # divisor latch, low byte - movb (1843200 / (16*(COMSPEED))) & 0xff, %al - outb %al, %dx - incl %edx # divisor latch, high byte - movb (1843200 / (16*(COMSPEED))) >> 8, %al - outb %al, %dx - - incl %edx # fifo control register (if any) - xorl %eax,%eax - outb %al, %dx # disable fifo to reduce worst-case busy-wait - - incl %edx # line control reg - movb $0x03, %al - outb %al, %dx # 8N1 - - incl %edx # modem control reg - outb %al, %dx # enable DTR/RTS - - /* Flush the input buffer. */ - incl %edx # line status reg -1: - subl $5, %edx # rx buffer reg - inb %dx, %al # throw away (unconditionally the first time) - addl $5, %edx # line status reg - inb %dx, %al - testb $0x01, %al - jne 1b # more - - ret diff --git a/sys/boot/pc98/boot2/serial_8251.S b/sys/boot/pc98/boot2/serial_8251.S deleted file mode 100644 index 217dbdb17698..000000000000 --- a/sys/boot/pc98/boot2/serial_8251.S +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:34:26 rpd - * $FreeBSD$ - */ - -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -/* - * Serial bootblock interface routines - * Copyright (c) 1994, J"org Wunsch - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * THE AUTHOR ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. THE AUTHOR DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - */ - -/* - * modified for PC-98 by KATO T. of Nagoya University - */ - - .file "serial.S" - -#include -#include "asm.h" - - .text - -/* - * The serial port interface routines implement a simple polled i/o - * interface to a standard serial port. Due to the space restrictions - * for the boot blocks, no BIOS support is used (since BIOS requires - * expensive real/protected mode switches), instead the rudimentary - * BIOS support is duplicated here. - * - * The base address for the i/o port is passed from the Makefile in - * the COMCONSOLE preprocessor macro. Console parameters are currently - * hard-coded to 9600 Bd, 8 bit. This can be changed in the - * init_serial() function. - */ - -/* - * void serial_putc(char ch) - * send ch to serial port - * - */ - -ENTRY(serial_putc) - mov $COMCONSOLE + 2, %edx # line status reg -1: inb %dx, %al - testb $0x01, %al - jz 1b # TX buffer not empty - - movb 0x4(%esp), %al - - sub $2, %edx # TX output reg - outb %al, %dx # send this one - - ret - -/* - * int serial_getc(void) - * read a character from serial port - */ - -ENTRY(serial_getc) - mov $COMCONSOLE + 2, %edx # line status reg -1: - inb %dx, %al - testb $0x02, %al - jz 1b # no RX char available - - xorb %eax, %eax - subb $2, %edx # RX buffer reg - inb %dx, %al # fetch (first) character - - cmp $0x7F, %eax # make DEL... - jne 2f - movb $0x08, %eax # look like BS -2: - ret - -/* - * int serial_ischar(void) - * if there is a character pending, return true; otherwise return 0 - */ -ENTRY(serial_ischar) - xorl %eax, %eax - movl $COMCONSOLE + 2, %edx # line status reg - inb %dx, %al - andb $0x02, %al # RX char available? - - ret - -/* - * void init_serial(void) - * initialize the serial console port to 9600 Bd, 8 bpc - */ -ENTRY(init_serial) - /* set 8253 */ - movb 0xb6, %al - outb %al, $0x77 - movl $COMCONSOLE_CLK, %eax - outb %al, $0x75 - inb $0x5f, %al - movb %ah, %al - outb %al, $0x75 - - /* inhibit com int */ - inb $0x35, %al - andb $0xf8, %al - movb %al, %ah - inb $0x5f, %al - movb %ah, %al - outb %al, $0x35 - - inb $0x02, %al - orb $0x10, %al - outb %al, $0x02 - - /* dummy command */ - xorb %al,%al - movl $COMCONSOLE + 2, %edx - outb %al, %dx - inb $0x5f, %al - xorb %al,%al - outb %al, %dx - inb $0x5f, %al - xorb %al,%al - outb %al, %dx - inb $0x5f, %al - - /* RESET 8251 */ - movb $0x40, %al - outb %al, %dx - - movb $COMCONSOLE_MODE , %al - andb $0xfc, %al - orb $0x02, %al /* factor = 1/16 */ - outb %al, %dx - inb $0x5f, %al - - /* start RS-232C */ - movb $0x37, %al - outb %al, %dx - - ret - diff --git a/sys/boot/pc98/boot2/start.S b/sys/boot/pc98/boot2/start.S deleted file mode 100644 index 2a9bcbb7a1b2..000000000000 --- a/sys/boot/pc98/boot2/start.S +++ /dev/null @@ -1,475 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:36:29 rpd - * $FreeBSD$ - */ - -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -/* - * Ported to PC-9801 by Yoshio Kimura - */ - -#include "asm.h" - - .file "start.S" - -SIGNATURE= 0xaa55 -LOADSZ= 8192 /* size of unix boot */ - -NAMEBLOCKMAGIC= 0xfadefeed /* value of magicnumebr for block2 */ - -/* - * This DEBUGMSG(msg) macro may be useful for debugging. Its use is - * restricted to this file since it only works in real mode. - */ -#define DEBUGMSG(msg) \ - data32 ; \ - mov $msg, %esi ; \ - data32 ; \ - call message - - .code16 - .text - .globl start - -start: - jmp main -boot_cyl: - .word 0 - String "IPL1 " - -main: - /* set up %ds */ - xor %ax, %ax - mov %ax, %ds - - /* set up %ss and %esp */ - mov $BOOTSEG, %eax - mov %ax, %ss - /* - * make a little room on the stack for - * us to save the default bootstring we might find.. - * effectively, we push the bootstring. - */ - mov $BOOTSTACK-64, %esp - - /* set up %es, (where we will load boot2 to) */ - mov %ax, %es - - push %es - push %ecx - push %dx - - mov $0xa000, %eax - mov %ax, %es - - /* set up graphic screen */ - movb $0x42, %ah - movb $0xc0, %ch - int $0x18 - movb $0x40, %ah - int $0x18 - - mov $0x0a00, %eax /* 80 x 25 mode */ - - int $0x18 - movb $0x0c, %ah /* text on */ - int $0x18 - - /* cursor home and on */ - xor %dx, %dx - movb $0x13, %ah - int $0x18 - movb $0x11, %ah - int $0x18 - - /* keyboad reset */ - movb $0x03, %ah - int $0x18 - - /* transfer PC-9801 system common area to 0xa1000 */ - mov $0x0000, %esi - mov $0x1000, %edi - mov $0x0630, %ecx - cld - rep - movsb - - /* transfer EPSON machine type to 0xa1200 */ - push %ds - mov $0xfd00, %eax - mov %ax, %ds - mov 0x804, %eax - and $0x00ffffff, %eax - mov %eax, %es: (0x1624) - - pop %ds - pop %dx - pop %ecx - pop %es - - /* bootstrap passes */ - mov %cs, %bx - cmp $0x1fe0, %bx - jz fd - cmp $0x1fc0, %bx - jnz hd - xor %cx, %cx - movb 0x584, %al - andb $0xf0, %al - cmpb $0x30, %al - jz fd - cmpb $0x90, %al - jnz hd -fd: - mov $0x0200, %cx - mov $0x0001, %dx - movb $0xd6, %ah - jmp load -hd: - and %cx, %cx - jnz 1f - .code32 - addr32 - mov %cs: (boot_cyl), %ecx /* actualy %cx in real mode */ - .code16 -1: - xor %dx, %dx - movb $0x06, %ah - -/* - * BIOS call "INT 0x1B Function 0xn6" to read sectors from disk into memory - * Call with %ah = 0xd6(for floppy disk) or 0x06(for hard disk) - * %al = DA/UA - * %bx = data length - * %ch = sector size(for floppy) or cylinder(for hard) - * %cl = cylinder - * %dh = head - * %dl = sector - * %es:%bp = segment:offset of buffer - * Return: - * %ah = 0x0 on success; err code on failure - */ - -load: -#ifdef NAMEBLOCK -/* - * Load the second sector and see if it is a boot instruction block. - * If it is then scan the contents for the first valid string and copy it to - * the location of the default boot string.. then zero it out. - * Finally write the block back to disk with the zero'd out entry.. - * I hate writing at this stage but we need this to be persistant. - * If the boot fails, then the next boot will get the next string. - * /etc/rc will regenerate a complete block2 iff the boot succeeds. - * - * Format of block 2 is: - * [NAMEBLOCKMAGIC] <--0xdeafc0de - * [nulls] - * [bootstring]NULL <---e.g. 0:wd(0,a)/kernel.experimental - * [bootstring]NULL <---e.g. 0:wd(0,a)/kernel.old - * .... - * [bootstring]NULL <---e.g. 0:wd(0,f)/kernel - * FF FF FF - */ -where: - /* - * save things we might smash - * (that are not smashed immedatly after us anyway.) - */ - data32 - push %ecx /* preserve 'cyl,sector ' */ - data32 - push %edx -/* - * Load the second sector - * BIOS call "INT 0x13 Function 0x2" to read sectors from disk into memory - * Call with %ah = 0x2 - * %al = number of sectors - * %ch = cylinder - * %cl = sector - * %dh = head - * %dl = drive (0x80 for hard disk, 0x0 for floppy disk) - * %es:%bx = segment:offset of buffer - * Return: - * %al = 0x0 on success; err code on failure - */ - data32 - movl $0x0201, %eax /function 2 (read) 1 sector */ - xor %ebx, %ebx /* %bx = 0 */ /* buffer address (ES:0) */ - data32 - movl $0x0002, %ecx /* sector 2, cylinder 0 */ - data32 - andl $0x00ff, %edx /* head 0, drive N */ - int $0x13 - data32 - jb read_error - /* - * confirm that it is one for us - */ - data32 - xorl %ebx, %ebx /* magic number at start of buffer */ - data32 - addr32 - movl %es:(%ebx), %eax - data32 - cmpl $NAMEBLOCKMAGIC, %eax - data32 - jne notours /* not ours so return to caller */ - /* - * scan for a bootstring - * Skip the magic number, and scan till we find a non-null, - * or a -1 - */ - incl %ebx /* quicker and smaller */ - incl %ebx - incl %ebx -scan: - incl %ebx - addr32 - movb %es:(%ebx), %al /* load the next byte */ - testb %al, %al /* and if it is null */ - data32 /* keep scanning (past deleted entries) */ - jz scan - incb %al /* now look for -1 */ - data32 - jz notours /* if we reach the 0xFF then we have finished */ - - /* - * save our settings.. we need them twice.. - */ - data32 - push %ebx - /* - * copy it to the default string location - * which is just above the stack for 64 bytes. - */ - data32 - movl $BOOTSTACK-64, %ecx /* 64 bytes at the top of the stack */ -nxtbyte: - addr32 - movb %es:(%ebx), %al /* get the next byte in */ - addr32 - movb %al, %es:(%ecx) /* and transfer it to the name buffer */ - incl %ebx /* get on with the next byte */ - incl %ecx /* get on with the next byte */ - testb %al, %al /* if it was 0 then quit this */ - data32 - jnz nxtbyte /* and looop if more to do */ - - /* - * restore the saved settings and - * zero it out so next time we don't try it again - */ - data32 - pop %ebx /* get back our starting location */ -#ifdef NAMEBLOCK_WRITEBACK -nxtbyte2: - addr32 - movb %es:(%ebx), %al /* get the byte */ - addr32 - movb $0, %es:(%ebx) /* zero it out */ - data32 - incl %ebx /* point to the next byte */ - testb %al, %al /* check if we have finished.. */ - data32 - jne nxtbyte2 -/* - * Write the second sector back - * Load the second sector - * BIOS call "INT 0x13 Function 0x3" to write sectors from memory to disk - * Call with %ah = 0x3 - * %al = number of sectors - * %ch = cylinder - * %cl = sector - * %dh = head - * %dl = drive (0x80 for hard disk, 0x0 for floppy disk) - * %es:%bx = segment:offset of buffer - * Return: - * %al = 0x0 on success; err code on failure - */ - data32 - movl $0x0301, %eax /* write 1 sector */ - xor %ebx, %ebx /* buffer is at offset 0 */ - data32 - movl $0x0002, %ecx /* block 2 */ - data32 - andl $0xff, %edx /* head 0 */ - int $0x13 - data32 - jnb notours - data32 - mov $eread, %esi - jmp err_stop -#endif /* NAMEBLOCK_WRITEBACK */ - /* - * return to the main-line - */ -notours: - data32 - pop %edx - data32 - pop %ecx -#endif - mov $LOADSZ, %ebx - movb 0x584, %al - xor %bp, %bp /* %bp = 0, put it at 0 in the BOOTSEG */ - int $0x1b - jc read_error - - /* - * ljmp to the second stage boot loader (boot2). - * After ljmp, %cs is BOOTSEG and boot1 (512 bytes) will be used - * as an internal buffer "intbuf". - */ - - .code32 - data32 - ljmp $BOOTSEG, $ EXT(boot2) - .code16 - -/* - * read_error - */ -read_error: - mov $eread, %esi -err_stop: - call message - jmp stop - -/* - * message: write the error message in %ds:%esi to console - */ -message: - - push %eax - push %ebx - push %ds - push %es - mov $0xe000, %dx - mov 0x501, %al - testb $0x08, %al - jnz 1f - mov $0xa000, %dx -1: - mov %dx, %es - mov %cs, %ax - mov %ax, %ds - mov vram, %di - mov $0x00e1, %bx - mov $160, %cx - cld - -nextb: - lodsb /* load a byte into %al */ - cmpb $0x0, %al - je done - cmpb $0x0d, %al - je cr_code - cmpb $0x0a, %al - je lf_code - movb %bl, %es:0x2000(%di) - stosb - inc %di - jmp move_cursor -lf_code: - add %cx, %di - jmp move_cursor -cr_code: - xor %dx, %dx - mov %di, %ax - div %cx - sub %dx, %di -move_cursor: - mov %di, %dx - movb $0x13, %ah - int $0x18 - jmp nextb -done: - mov %di, vram - pop %es - pop %ds - pop %ebx - pop %eax - ret - -stop: hlt - jmp stop /* halt doesnt actually halt forever */ - -vram: - .word 0 - -/* error messages */ - - -#ifdef DEBUG -one: String "1-\0" -two: String "2-\0" -three: String "3-\0" -four: String "4-\0" -#endif /* DEBUG */ -#ifdef NAMEBLOCK_WRITEBACK -ewrite: String "Write error\r\n\0" -#endif /* NAMEBLOCK_WRITEBACK */ -eread: String "Read error\r\n\0" -enoboot: String "No bootable partition\r\n\0" -endofcode: - - . = EXT(start) + 0x1be - -/* Partition table */ - - .fill 0x30,0x1,0x0 - .byte 0x80, 0x00, 0x01, 0x00 - .byte 0xa5, 0xff, 0xff, 0xff - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x50, 0xc3, 0x00, 0x00 - -/* the last 2 bytes in the sector 0 contain the signature */ - .value SIGNATURE - -ENTRY(disklabel) - . = EXT(start) + 0x400 diff --git a/sys/boot/pc98/boot2/sys.c b/sys/boot/pc98/boot2/sys.c deleted file mode 100644 index c8d4304bd318..000000000000 --- a/sys/boot/pc98/boot2/sys.c +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:36:34 rpd - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * Ported to PC-9801 by Yoshio Kimura - */ - -#include "boot.h" -#include - -#if 0 -/* #define BUFSIZE 4096 */ -#define BUFSIZE MAXBSIZE -static char buf[BUFSIZE], fsbuf[SBSIZE], iobuf[MAXBSIZE]; -#endif - -static char biosdrivedigit; - -#define BUFSIZE 8192 -#define MAPBUFSIZE BUFSIZE -static char buf[BUFSIZE], fsbuf[BUFSIZE], iobuf[BUFSIZE]; - -static char mapbuf[MAPBUFSIZE]; -static int mapblock; - -int poff; - -#ifdef RAWBOOT -#define STARTBYTE 8192 /* Where on the media the kernel starts */ -#endif - -static int block_map(int file_block); -static int find(char *path); - -void -xread(char *addr, int size) -{ - int count = BUFSIZE; - while (size > 0) { - if (BUFSIZE > size) - count = size; - read(buf, count); - pcpy(buf, addr, count); - size -= count; - addr += count; - } -} - -#ifndef RAWBOOT -void -read(char *buffer, int count) -{ - int logno, off, size; - int cnt2, bnum2; - struct fs *fs_copy; - - while (count > 0 && poff < inode.i_size) { - fs_copy = fs; - off = blkoff(fs_copy, poff); - logno = lblkno(fs_copy, poff); - cnt2 = size = blksize(fs_copy, &inode, logno); - bnum2 = fsbtodb(fs_copy, block_map(logno)) + boff; - if ( (!off) && (size <= count)) { - devread(buffer, bnum2, cnt2); - } else { - size -= off; - if (size > count) - size = count; - devread(iobuf, bnum2, cnt2); - memcpy(iobuf+off, buffer, size); - } - buffer += size; - count -= size; - poff += size; - } -} -#else -void -read(char *buffer, int count) -{ - int cnt, bnum, off, size; - - off = STARTBYTE + poff; - poff += count; - - /* Read any unaligned bit at the front */ - cnt = off & 511; - if (cnt) { - size = 512-cnt; - if (count < size) - size = count; - devread(iobuf, off >> 9, 512); - memcpy(iobuf+cnt, buffer, size); - count -= size; - off += size; - buffer += size; - } - size = count & (~511); - if (size && (off & (~511))) { - devread(buffer, off >> 9, size); - off += size; - count -= size; - buffer += size; - } - if (count) { - devread(iobuf, off >> 9, 512); - memcpy(iobuf, buffer, count); - } -} -#endif - -static int -find(char *path) -{ - char *rest, ch; - int block, off, loc, ino = ROOTINO; - struct direct *dp; - char list_only; - - list_only = (path[0] == '?' && path[1] == '\0'); -loop: - devread(iobuf, fsbtodb(fs, ino_to_fsba(fs, ino)) + boff, fs->fs_bsize); - memcpy((void *)&((struct dinode *)iobuf)[ino % fs->fs_inopb], - (void *)&inode.i_din, - sizeof (struct dinode)); - if (!*path) - return 1; - while (*path == '/') - path++; - if (!inode.i_size || ((inode.i_mode&IFMT) != IFDIR)) - return 0; - for (rest = path; (ch = *rest) && ch != '/'; rest++) ; - *rest = 0; - loc = 0; - do { - if (loc >= inode.i_size) { - if (list_only) { - putchar('\n'); - return -1; - } else { - return 0; - } - } - if (!(off = blkoff(fs, loc))) { - block = lblkno(fs, loc); - devread(iobuf, fsbtodb(fs, block_map(block)) + boff, - blksize(fs, &inode, block)); - } - dp = (struct direct *)(iobuf + off); - loc += dp->d_reclen; - if (dp->d_ino && list_only) - printf("%s ", dp->d_name); - } while (!dp->d_ino || strcmp(path, dp->d_name)); - ino = dp->d_ino; - *(path = rest) = ch; - goto loop; -} - - -static int -block_map(int file_block) -{ - int bnum; - if (file_block < NDADDR) - return(inode.i_db[file_block]); - if ((bnum=fsbtodb(fs, inode.i_ib[0])+boff) != mapblock) { - devread(mapbuf, bnum, fs->fs_bsize); - mapblock = bnum; - } - return (((int *)mapbuf)[(file_block - NDADDR) % NINDIR(fs)]); -} - - -int -openrd(void) -{ - char **devp, *name0 = name, *cp = name0; - int biosdrive, dosdev_copy, ret; - - /*******************************************************\ - * If bracket given look for preceding device name * - \*******************************************************/ - while (*cp && *cp!='(') - cp++; - if (!*cp) - { - cp = name0; - } - else - { - /* - * Look for a BIOS drive number (a leading digit followed - * by a colon). - */ - biosdrivedigit = '\0'; - if (*(name0 + 1) == ':' && *name0 >= '0' && *name0 <= '9') { - biosdrivedigit = *name0; - name0 += 2; - } - - if (cp++ != name0) - { - for (devp = devs; *devp; devp++) - if (name0[0] == (*devp)[0] && - name0[1] == (*devp)[1]) - break; - if (!*devp) - { - printf("Unknown device\n"); - return 1; - } - maj = devp-devs; - } - /*******************************************************\ - * Look inside brackets for unit number, and partition * - \*******************************************************/ - /* - * Allow any valid digit as the unit number, as the BIOS - * will complain if the unit number is out of range. - * Restricting the range here prevents the possibilty of using - * BIOSes that support more than 2 units. - * XXX Bad values may cause strange errors, need to check if - * what happens when a value out of range is supplied. - */ - if (*cp >= '0' && *cp <= '9') - unit = *cp++ - '0'; - if (!*cp || (*cp == ',' && !*++cp)) - return 1; - if (*cp >= 'a' && *cp <= 'p') - part = *cp++ - 'a'; - while (*cp && *cp++!=')') ; - if (!*cp) - return 1; - } - biosdrive = biosdrivedigit - '0'; - if (biosdrivedigit == '\0') { - biosdrive = dosdev & 0x0f; -#if BOOT_HD_BIAS > 0 - /* XXX */ - if (maj == 4) - biosdrive += BOOT_HD_BIAS; -#endif - } - switch(maj) - { - case 4: /* da */ - dosdev_copy = biosdrive | 0xA0; /* SCSI HD or MO */ - break; - case 0: /* wd */ - case 2: /* 1200KB fd */ - dosdev_copy = (maj << 3) | unit | 0x80; - break; - case 6: /* 1440KB fd */ - dosdev_copy = (maj << 3) | unit; - break; - default: - printf("Unknown device\n"); - return 1; - } - dosdev = dosdev_copy; -#if 0 - /* XXX this is useful, but misplaced. */ - printf("dosdev= %x, biosdrive = %d, unit = %d, maj = %d\n", - dosdev_copy, biosdrive, unit, maj); -#endif - - /***********************************************\ - * Now we know the disk unit and part, * - * Load disk info, (open the device) * - \***********************************************/ - if (devopen()) - return 1; - -#ifndef RAWBOOT - /***********************************************\ - * Load Filesystem info (mount the device) * - \***********************************************/ - devread((char *)(fs = (struct fs *)fsbuf), SBLOCK + boff, SBSIZE); - /***********************************************\ - * Find the actual FILE on the mounted device * - \***********************************************/ - ret = find(cp); - name = cp; - if (ret == 0) - return 1; - if (ret < 0) { - name = NULL; - return -1; - } - poff = 0; -#endif /* RAWBOOT */ - return 0; -} diff --git a/sys/boot/pc98/boot2/table.c b/sys/boot/pc98/boot2/table.c deleted file mode 100644 index e8e6dea521b0..000000000000 --- a/sys/boot/pc98/boot2/table.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - * - * from: Mach, Revision 2.2 92/04/04 11:36:43 rpd - */ -/* - Copyright 1988, 1989, 1990, 1991, 1992 - by Intel Corporation, Santa Clara, California. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appears in all -copies and that both the copyright notice and this permission notice -appear in supporting documentation, and that the name of Intel -not be used in advertising or publicity pertaining to distribution -of the software without specific, written prior permission. - -INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, -IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, -NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION -WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ - -#include -__FBSDID("$FreeBSD$"); - -#include "boot.h" - -/* Segment Descriptor - * - * 31 24 19 16 7 0 - * ------------------------------------------------------------ - * | | |B| |A| | | |1|0|E|W|A| | - * | BASE 31..24 |G|/|0|V| LIMIT |P|DPL| TYPE | BASE 23:16 | - * | | |D| |L| 19..16| | |1|1|C|R|A| | - * ------------------------------------------------------------ - * | | | - * | BASE 15..0 | LIMIT 15..0 | - * | | | - * ------------------------------------------------------------ - */ - -struct seg_desc { - unsigned short limit_15_0; - unsigned short base_15_0; - unsigned char base_23_16; - unsigned char p_dpl_type; - unsigned char g_b_a_limit; - unsigned char base_31_24; - }; - -#define RUN 0 /* not really 0, but filled in at boot time */ - -struct seg_desc Gdt[] = { - {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* 0x0 : null */ - {0xFFFF, 0x0, 0x0, 0x9F, 0xCF, 0x0}, /* 0x08 : kernel code */ - /* 0x9E? */ - {0xFFFF, 0x0, 0x0, 0x93, 0xCF, 0x0}, /* 0x10 : kernel data */ - /* 0x92? */ - {0xFFFF, RUN, RUN, 0x9E, 0x40, 0x0}, /* 0x18 : boot code */ - /* - * The limit of boot data should be more than or equal to 0x9FFFF - * for saving BIOS parameter and EPSON machine ID into 2'nd T-VRAM, - * because base address is normally 0x10000. - */ - {0xFFFF, RUN, RUN, 0x92, 0x4F, 0x0}, /* 0x20 : boot data */ - {0xFFFF, RUN, RUN, 0x9E, 0x0, 0x0}, /* 0x28 : boot code, 16 bits */ - {0xFFFF, 0x0, 0x0, 0x92, 0x0, 0x0}, /* 0x30 : boot data, 16 bits */ -#ifdef BDE_DEBUGGER - /* More for bdb. */ - {}, /* BIOS_TMP_INDEX = 7 : null */ - {}, /* TSS_INDEX = 8 : null */ - {0xFFFF, 0x0, 0x0, 0xB2, 0x40, 0x0}, /* DS_286_INDEX = 9 */ - {0xFFFF, 0x0, 0x0, 0xB2, 0x40, 0x0}, /* ES_286_INDEX = 10 */ - {}, /* Unused = 11 : null */ - {0x7FFF, 0x8000, 0xB, 0xB2, 0x40, 0x0}, /* COLOR_INDEX = 12 */ - {0x7FFF, 0x0, 0xB, 0xB2, 0x40, 0x0}, /* MONO_INDEX = 13 */ - {0xFFFF, RUN, RUN, 0x9A, 0x40, 0x0}, /* DB_CS_INDEX = 14 */ - {0xFFFF, RUN, RUN, 0x9A, 0x0, 0x0}, /* DB_CS16_INDEX = 15 */ - {0xFFFF, RUN, RUN, 0x92, 0x40, 0x0}, /* DB_DS_INDEX = 16 */ - {8*18-1, RUN, RUN, 0x92, 0x40, 0x0}, /* GDT_INDEX = 17 */ -#endif /* BDE_DEBUGGER */ -}; - -#ifdef BDE_DEBUGGER -struct idt_desc { - unsigned short entry_15_0; - unsigned short selector; - unsigned char padding; - unsigned char p_dpl_type; - unsigned short entry_31_16; -}; - -struct idt_desc Idt[] = { - {}, /* Null (int 0) */ - {RUN, 0x70, 0, 0x8E, 0}, /* DEBUG_VECTOR = 1 */ - {}, /* Null (int 2) */ - {RUN, 0x70, 0, 0xEE, 0}, /* BREAKPOINT_VECTOR = 3 */ -}; -#endif /* BDE_DEBUGGER */ - -struct pseudo_desc { - unsigned short limit; - unsigned short base_low; - unsigned short base_high; - }; - -struct pseudo_desc Gdtr = { sizeof Gdt - 1, RUN, RUN }; -#ifdef BDE_DEBUGGER -struct pseudo_desc Idtr_prot = { sizeof Idt - 1, RUN, RUN }; -struct pseudo_desc Idtr_real = { 0x400 - 1, 0x0, 0x0 }; -#endif - -/* - * All initialized data is defined in one file to reduce space wastage from - * fragmentation. - */ -char *devs[] = { "wd", "dk", "fd", "wt", "da", "dk", "fd", 0 }; -unsigned tw_chars = 0x5C2D2F7C; /* "\-/|" */ diff --git a/sys/boot/pc98/btx/btx/btx.S b/sys/boot/pc98/btx/btx/btx.S index 7d22b27fbdbe..95788d4f8fae 100644 --- a/sys/boot/pc98/btx/btx/btx.S +++ b/sys/boot/pc98/btx/btx/btx.S @@ -21,11 +21,11 @@ .set MEM_BTX,0x1000 # Start of BTX memory .set MEM_ESP0,0x1800 # Supervisor stack .set MEM_BUF,0x1800 # Scratch buffer - .set MEM_ESP1,0x1e00 # Link stack - .set MEM_IDT,0x1e00 # IDT - .set MEM_TSS,0x1f98 # TSS - .set MEM_MAP,0x2000 # I/O bit map - .set MEM_TSS_END,0x3fff # Page directory + .set MEM_ESPR,0x5e00 # Real mode stack + .set MEM_IDT,0x5e00 # IDT + .set MEM_TSS,0x5f98 # TSS + .set MEM_MAP,0x6000 # I/O bit map + .set MEM_TSS_END,0x7fff # End of TSS .set MEM_ORG,0x9000 # BTX code .set MEM_USR,0xa000 # Start of user memory /* @@ -33,6 +33,14 @@ */ .set PAG_SIZ,0x1000 # Page size .set PAG_CNT,0x1000 # Pages to map +/* + * Fields in %eflags. + */ + .set PSL_RESERVED_DEFAULT,0x00000002 + .set PSL_T,0x00000100 # Trap flag + .set PSL_I,0x00000200 # Interrupt enable flag + .set PSL_VM,0x00020000 # Virtual 8086 mode flag + .set PSL_AC,0x00040000 # Alignment check flag /* * Segment selectors. */ @@ -48,7 +56,6 @@ */ .set TSS_ESP0,0x4 # PL 0 ESP .set TSS_SS0,0x8 # PL 0 SS - .set TSS_ESP1,0xc # PL 1 ESP .set TSS_MAP,0x66 # I/O bit map base /* * System calls. @@ -56,10 +63,20 @@ .set SYS_EXIT,0x0 # Exit .set SYS_EXEC,0x1 # Exec /* - * V86 constants. + * Fields in V86 interface structure. */ - .set V86_FLG,0x208eff # V86 flag mask - .set V86_STK,0x400 # V86 stack allowance + .set V86_CTL,0x0 # Control flags + .set V86_ADDR,0x4 # Int number/address + .set V86_ES,0x8 # V86 ES + .set V86_DS,0xc # V86 DS + .set V86_FS,0x10 # V86 FS + .set V86_GS,0x14 # V86 GS +/* + * V86 control flags. + */ + .set V86F_ADDR,0x10000 # Segment:offset address + .set V86F_CALLF,0x20000 # Emulate far call + .set V86F_FLAGS,0x40000 # Return flags /* * Dump format control bytes. */ @@ -77,13 +94,11 @@ * BIOS Data Area locations. */ .set BDA_MEM,0x501 # Free memory - .set BDA_KEYFLAGS,0x53a # Keyboard shift-state flags .set BDA_POS,0x53e # Cursor position /* * Derivations, for brevity. */ .set _ESP0H,MEM_ESP0>>0x8 # Byte 1 of ESP0 - .set _ESP1H,MEM_ESP1>>0x8 # Byte 1 of ESP1 .set _TSSIO,MEM_MAP-MEM_TSS # TSS I/O base .set _TSSLM,MEM_TSS_END-MEM_TSS # TSS limit .set _IDTLM,MEM_TSS-MEM_IDT-1 # IDT limit @@ -100,7 +115,7 @@ btx_hdr: .byte 0xeb # Machine ID .byte 0xe # Header size .ascii "BTX" # Magic .byte 0x1 # Major version - .byte 0x1 # Minor version + .byte 0x2 # Minor version .byte BTX_FLAGS # Flags .word PAG_CNT-MEM_ORG>>0xc # Paging control .word break-start # Text size @@ -121,13 +136,24 @@ init: cli # Disable interrupts */ mov $MEM_IDT,%di # Memory to initialize mov $(MEM_ORG-MEM_IDT)/2,%cx # Words to zero - push %di # Save rep # Zero-fill stosw # memory - pop %di # Restore +/* + * Update real mode IDT for reflecting hardware interrupts. + */ + mov $intr20,%bx # Address first handler + mov $0x10,%cx # Number of handlers + mov $0x20*4,%di # First real mode IDT entry +init.0: mov %bx,(%di) # Store IP + inc %di # Address next + inc %di # entry + stosw # Store CS + add $4,%bx # Next handler + loop init.0 # Next IRQ /* * Create IDT. */ + mov $MEM_IDT,%di mov $idtctl,%si # Control string init.1: lodsb # Get entry cbw # count @@ -153,7 +179,6 @@ init.3: lea 0x8(%di),%di # Next entry */ init.4: movb $_ESP0H,TSS_ESP0+1(%di) # Set ESP0 movb $SEL_SDATA,TSS_SS0(%di) # Set SS0 - movb $_ESP1H,TSS_ESP1+1(%di) # Set ESP1 movb $_TSSIO,TSS_MAP(%di) # Set I/O bit map base /* * Bring up the system. @@ -253,8 +278,8 @@ exit.2: xor %ax,%ax # Real mode segment exit.3: jz exit.3 # No movb $0xa0,%al outb %al,$0x35 - movb 0,%al - outb %al,$0xf0 + movb $0x00,%al + outb %al,$0xf0 # reboot the machine exit.4: jmp exit.4 /* * Set IRQ offsets by reprogramming 8259A PICs. @@ -284,10 +309,6 @@ setpic: in $0x02,%al # Save master outb %al,$0x02 # IMR retw # To caller .code32 -/* - * Initiate return from V86 mode to user mode. - */ -inthlt: hlt # To supervisor mode /* * Exception jump table. */ @@ -314,17 +335,11 @@ intx00: push $0x0 # Int 0x0: #DE push $0xc # Int 0xc: #SS jmp except # Stack segment fault push $0xd # Int 0xd: #GP - jmp ex_v86 # General protection + jmp except # General protection push $0xe # Int 0xe: #PF jmp except # Page fault intx10: push $0x10 # Int 0x10: #MF jmp ex_noc # Floating-point error -/* - * Handle #GP exception. - */ -ex_v86: testb $0x2,0x12(%esp,1) # V86 mode? - jz except # No - jmp v86mon # To monitor /* * Save a zero error code. */ @@ -337,24 +352,17 @@ except: cld # String ops inc pushl %ds # Save pushl %es # most pusha # registers - movb $0x6,%al # Push loop count - testb $0x2,0x3a(%esp,1) # V86 mode? - jnz except.1 # Yes pushl %gs # Set GS pushl %fs # Set FS pushl %ds # Set DS pushl %es # Set ES - movb $0x2,%al # Push loop count cmpw $SEL_SCODE,0x44(%esp,1) # Supervisor mode? jne except.1 # No pushl %ss # Set SS - leal 0x50(%esp,1),%eax # Set - pushl %eax # ESP jmp except.2 # Join common code -except.1: pushl 0x50(%esp,1) # Set GS, FS, DS, ES - decb %al # (if V86 mode), and - jne except.1 # SS, ESP -except.2: push $SEL_SDATA # Set up +except.1: pushl 0x50(%esp,1) # Set SS +except.2: pushl 0x50(%esp,1) # Set ESP + push $SEL_SDATA # Set up popl %ds # to pushl %ds # address popl %es # data @@ -363,14 +371,12 @@ except.2: push $SEL_SDATA # Set up movl $MEM_BUF,%edi # Buffer pushl %eax pushl %edx -wait.1: - inb $0x60,%al +wait.1: inb $0x60,%al testb $0x04,%al jz wait.1 movb $0xe0,%al outb %al,$0x62 -wait.2: - inb $0x60,%al +wait.2: inb $0x60,%al testb $0x01,%al jz wait.2 xorl %edx,%edx @@ -399,237 +405,11 @@ wait.2: je except.3 # Yes cmpb $0x1,(%esp,1) # Debug? jne except.2a # No - testl $0x100,0x10(%esp,1) # Trap flag set? + testl $PSL_T,0x10(%esp,1) # Trap flag set? jnz except.3 # Yes except.2a: jmp exit # Exit except.3: leal 0x8(%esp,1),%esp # Discard err, int no iret # From interrupt -/* - * Return to user mode from V86 mode. - */ -intrtn: cld # String ops inc - pushl %ds # Address - popl %es # data - leal 0x3c(%ebp),%edx # V86 Segment registers - movl MEM_TSS+TSS_ESP1,%esi # Link stack pointer - lodsl # INT_V86 args pointer - movl %esi,%ebx # Saved exception frame - testl %eax,%eax # INT_V86 args? - jz intrtn.2 # No - movl $MEM_USR,%edi # User base - movl 0x1c(%esi),%ebx # User ESP - movl %eax,(%edi,%ebx,1) # Restore to user stack - leal 0x8(%edi,%eax,1),%edi # Arg segment registers - testb $0x4,-0x6(%edi) # Return flags? - jz intrtn.1 # No - movl 0x30(%ebp),%eax # Get V86 flags - movw %ax,0x18(%esi) # Set user flags -intrtn.1: leal 0x10(%esi),%ebx # Saved exception frame - xchgl %edx,%esi # Segment registers - movb $0x4,%cl # Update seg regs - rep # in INT_V86 - movsl # args -intrtn.2: xchgl %edx,%esi # Segment registers - leal 0x28(%ebp),%edi # Set up seg - movb $0x4,%cl # regs for - rep # later - movsl # pop - xchgl %ebx,%esi # Restore exception - movb $0x5,%cl # frame to - rep # supervisor - movsl # stack - movl %esi,MEM_TSS+TSS_ESP1 # Link stack pointer - popa # Restore - leal 0x8(%esp,1),%esp # Discard err, int no - popl %es # Restore - popl %ds # user - popl %fs # segment - popl %gs # registers - iret # To user mode -/* - * V86 monitor. - */ -v86mon: cld # String ops inc - pushl $SEL_SDATA # Set up for - popl %ds # flat addressing - pusha # Save registers - movl %esp,%ebp # Address stack frame - movzwl 0x2c(%ebp),%edi # Load V86 CS - shll $0x4,%edi # To linear - movl 0x28(%ebp),%esi # Load V86 IP - addl %edi,%esi # Code pointer - xorl %ecx,%ecx # Zero - movb $0x2,%cl # 16-bit operands - xorl %eax,%eax # Zero -v86mon.1: lodsb # Get opcode - cmpb $0x66,%al # Operand size prefix? - jne v86mon.2 # No - movb $0x4,%cl # 32-bit operands - jmp v86mon.1 # Continue -v86mon.2: cmpb $0xf4,%al # HLT? - jne v86mon.3 # No - cmpl $inthlt+0x1,%esi # Is inthlt? - jne v86mon.7 # No (ignore) - jmp intrtn # Return to user mode -v86mon.3: cmpb $0xf,%al # Prefixed instruction? - jne v86mon.4 # No - cmpb $0x09,(%esi) # Is it a WBINVD? - je v86wbinvd # Yes - cmpb $0x30,(%esi) # Is it a WRMSR? - je v86wrmsr # Yes - cmpb $0x32,(%esi) # Is it a RDMSR? - je v86rdmsr # Yes - cmpb $0x20,(%esi) # Is this a MOV reg,CRx? - je v86mov # Yes -v86mon.4: cmpb $0xfa,%al # CLI? - je v86cli # Yes - cmpb $0xfb,%al # STI? - je v86sti # Yes - movzwl 0x38(%ebp),%ebx # Load V86 SS - shll $0x4,%ebx # To offset - pushl %ebx # Save - addl 0x34(%ebp),%ebx # Add V86 SP - movl 0x30(%ebp),%edx # Load V86 flags - cmpb $0x9c,%al # PUSHF/PUSHFD? - je v86pushf # Yes - cmpb $0x9d,%al # POPF/POPFD? - je v86popf # Yes - cmpb $0xcd,%al # INT imm8? - je v86intn # Yes - cmpb $0xcf,%al # IRET/IRETD? - je v86iret # Yes - popl %ebx # Restore - popa # Restore - jmp except # Handle exception -v86mon.5: movl %edx,0x30(%ebp) # Save V86 flags -v86mon.6: popl %edx # V86 SS adjustment - subl %edx,%ebx # Save V86 - movl %ebx,0x34(%ebp) # SP -v86mon.7: subl %edi,%esi # From linear - movl %esi,0x28(%ebp) # Save V86 IP - popa # Restore - leal 0x8(%esp,1),%esp # Discard int no, error - iret # To V86 mode -/* - * Emulate MOV reg,CRx. - */ -v86mov: movb 0x1(%esi),%bl # Fetch Mod R/M byte - testb $0x10,%bl # Read CR2 or CR3? - jnz v86mov.1 # Yes - movl %cr0,%eax # Read CR0 - testb $0x20,%bl # Read CR4 instead? - jz v86mov.2 # No - movl %cr4,%eax # Read CR4 - jmp v86mov.2 -v86mov.1: movl %cr2,%eax # Read CR2 - testb $0x08,%bl # Read CR3 instead? - jz v86mov.2 # No - movl %cr3,%eax # Read CR3 -v86mov.2: andl $0x7,%ebx # Compute offset in - shl $2,%ebx # frame of destination - neg %ebx # register - movl %eax,0x1c(%ebp,%ebx,1) # Store CR to reg - incl %esi # Adjust IP -/* - * Return from emulating a 0x0f prefixed instruction - */ -v86preret: incl %esi # Adjust IP - jmp v86mon.7 # Finish up -/* - * Emulate WBINVD - */ -v86wbinvd: wbinvd # Write back and invalidate - # cache - jmp v86preret # Finish up -/* - * Emulate WRMSR - */ -v86wrmsr: movl 0x18(%ebp),%ecx # Get user's %ecx (MSR to write) - movl 0x14(%ebp),%edx # Load the value - movl 0x1c(%ebp),%eax # to write - wrmsr # Write MSR - jmp v86preret # Finish up -/* - * Emulate RDMSR - */ -v86rdmsr: movl 0x18(%ebp),%ecx # MSR to read - rdmsr # Read the MSR - movl %eax,0x1c(%ebp) # Return the value of - movl %edx,0x14(%ebp) # the MSR to the user - jmp v86preret # Finish up -/* - * Emulate CLI. - */ -v86cli: andb $~0x2,0x31(%ebp) # Clear IF - jmp v86mon.7 # Finish up -/* - * Emulate STI. - */ -v86sti: orb $0x2,0x31(%ebp) # Set IF - jmp v86mon.7 # Finish up -/* - * Emulate PUSHF/PUSHFD. - */ -v86pushf: subl %ecx,%ebx # Adjust SP - cmpb $0x4,%cl # 32-bit - je v86pushf.1 # Yes - data16 # 16-bit -v86pushf.1: movl %edx,(%ebx) # Save flags - jmp v86mon.6 # Finish up -/* - * Emulate IRET/IRETD. - */ -v86iret: movzwl (%ebx),%esi # Load V86 IP - movzwl 0x2(%ebx),%edi # Load V86 CS - leal 0x4(%ebx),%ebx # Adjust SP - movl %edi,0x2c(%ebp) # Save V86 CS - xorl %edi,%edi # No ESI adjustment -/* - * Emulate POPF/POPFD (and remainder of IRET/IRETD). - */ -v86popf: cmpb $0x4,%cl # 32-bit? - je v86popf.1 # Yes - movl %edx,%eax # Initialize - data16 # 16-bit -v86popf.1: movl (%ebx),%eax # Load flags - addl %ecx,%ebx # Adjust SP - andl $V86_FLG,%eax # Merge - andl $~V86_FLG,%edx # the - orl %eax,%edx # flags - jmp v86mon.5 # Finish up -/* - * trap int 15, function 87 - * reads %es:%si from saved registers on stack to find a GDT containing - * source and destination locations - * reads count of words from saved %cx - * returns success by setting %ah to 0 - */ -int15_87: pushl %esi # Save - pushl %edi # registers - movl 0x3C(%ebp),%edi # Load ES - movzwl 0x4(%ebp),%eax # Load user's SI - shll $0x4,%edi # EDI = (ES << 4) + - addl %eax,%edi # SI - movl 0x11(%edi),%eax # Read base of - movb 0x17(%edi),%al # GDT entry - ror $8,%eax # for source - xchgl %eax,%esi # into %esi - movl 0x19(%edi),%eax # Read base of - movb 0x1f(%edi),%al # GDT entry for - ror $8,%eax # destination - xchgl %eax,%edi # into %edi - pushl %ds # Make: - popl %es # es = ds - movzwl 0x18(%ebp),%ecx # Get user's CX - shll $0x1,%ecx # Convert count from words - rep # repeat... - movsb # perform copy. - popl %edi # Restore - popl %esi # registers - movb $0x0,0x1d(%ebp) # set ah = 0 to indicate - # success - andb $0xfe,%dl # clear CF - jmp v86mon.5 # Finish up /* * Reboot the machine by setting the reboot flag and exiting @@ -638,36 +418,7 @@ reboot: orb $0x1,btx_hdr+0x7 # Set the reboot flag jmp exit # Terminate BTX and reboot /* - * Emulate INT imm8... also make sure to check if it's int 15/87 - */ -v86intn: lodsb # Get int no - cmpb $0x19,%al # is it int 19? - je reboot # yes, reboot the machine - cmpb $0x15,%al # is it int 15? - jne v86intn.1 # no, skip parse - cmpb $0x87,0x1d(%ebp) # is it the memcpy subfunction? - je int15_87 # yes - cmpw $0x4f53,0x1c(%ebp) # is it the delete key callout? - jne v86intn.1 # no, handle the int normally - movb BDA_KEYFLAGS,%ch # get the shift key state - andb $0x18,%ch # mask off just Ctrl and Alt - cmpb $0x18,%ch # are both Ctrl and Alt down? - je reboot # yes, reboot the machine -v86intn.1: subl %edi,%esi # From - shrl $0x4,%edi # linear - movw %dx,-0x2(%ebx) # Save flags - movw %di,-0x4(%ebx) # Save CS - leal -0x6(%ebx),%ebx # Adjust SP - movw %si,(%ebx) # Save IP - shll $0x2,%eax # Scale - movzwl (%eax),%esi # Load IP - movzwl 0x2(%eax),%edi # Load CS - movl %edi,0x2c(%ebp) # Save CS - xorl %edi,%edi # No ESI adjustment - andb $~0x1,%dh # Clear TF - jmp v86mon.5 # Finish up -/* - * Hardware interrupt jump table. + * Protected Mode Hardware interrupt jump table. */ intx20: push $0x8 # Int 0x20: IRQ0 jmp int_hw # V86 int 0x8 @@ -701,127 +452,267 @@ intx20: push $0x8 # Int 0x20: IRQ0 jmp int_hw # V86 int 0x16 push $0x17 # Int 0x2f: IRQ15 jmp int_hw # V86 int 0x17 + /* - * Reflect hardware interrupts. + * Invoke real mode interrupt/function call from user mode with arguments. */ -int_hw: testb $0x2,0xe(%esp,1) # V86 mode? - jz intusr # No - pushl $SEL_SDATA # Address - popl %ds # data - xchgl %eax,(%esp,1) # Swap EAX, int no - pushl %ebp # Address - movl %esp,%ebp # stack frame - pushl %ebx # Save - shll $0x2,%eax # Get int - movl (%eax),%eax # vector - subl $0x6,0x14(%ebp) # Adjust V86 ESP - movzwl 0x18(%ebp),%ebx # V86 SS - shll $0x4,%ebx # * 0x10 - addl 0x14(%ebp),%ebx # + V86 ESP - xchgw %ax,0x8(%ebp) # Swap V86 IP - rorl $0x10,%eax # Swap words - xchgw %ax,0xc(%ebp) # Swap V86 CS - roll $0x10,%eax # Swap words - movl %eax,(%ebx) # CS:IP for IRET - movl 0x10(%ebp),%eax # V86 flags - movw %ax,0x4(%ebx) # Flags for IRET - andb $~0x3,0x11(%ebp) # Clear IF, TF - popl %ebx # Restore - popl %ebp # saved - popl %eax # registers - iret # To V86 mode +intx31: pushl $-1 # Dummy int no for btx_v86 /* - * Invoke V86 interrupt from user mode, with arguments. + * Invoke real mode interrupt/function call from protected mode. + * + * We place a trampoline on the user stack that will return to rret_tramp + * which will reenter protected mode and then finally return to the user + * client. + * + * Kernel frame %esi points to: Real mode stack frame at MEM_ESPR: + * + * -0x00 user %ss -0x04 kernel %esp (with full frame) + * -0x04 user %esp -0x08 btx_v86 pointer + * -0x08 user %eflags -0x0c flags (only used if interrupt) + * -0x0c user %cs -0x10 real mode CS:IP return trampoline + * -0x10 user %eip -0x12 real mode flags + * -0x14 int no -0x16 real mode CS:IP (target) + * -0x18 %eax + * -0x1c %ecx + * -0x20 %edx + * -0x24 %ebx + * -0x28 %esp + * -0x2c %ebp + * -0x30 %esi + * -0x34 %edi + * -0x38 %gs + * -0x3c %fs + * -0x40 %ds + * -0x44 %es + * -0x48 zero %eax (hardware int only) + * -0x4c zero %ecx (hardware int only) + * -0x50 zero %edx (hardware int only) + * -0x54 zero %ebx (hardware int only) + * -0x58 zero %esp (hardware int only) + * -0x5c zero %ebp (hardware int only) + * -0x60 zero %esi (hardware int only) + * -0x64 zero %edi (hardware int only) + * -0x68 zero %gs (hardware int only) + * -0x6c zero %fs (hardware int only) + * -0x70 zero %ds (hardware int only) + * -0x74 zero %es (hardware int only) */ -intx31: stc # Have btx_v86 - pushl %eax # Missing int no -/* - * Invoke V86 interrupt from user mode. - */ -intusr: std # String ops dec - pushl %eax # Expand - pushl %eax # stack - pushl %eax # frame - pusha # Save +int_hw: cld # String ops inc + pusha # Save gp regs pushl %gs # Save - movl %esp,%eax # seg regs - pushl %fs # and - pushl %ds # point - pushl %es # to them + pushl %fs # seg + pushl %ds # regs + pushl %es push $SEL_SDATA # Set up popl %ds # to pushl %ds # address popl %es # data + leal 0x44(%esp,1),%esi # Base of frame + movl %esp,MEM_ESPR-0x04 # Save kernel stack pointer + movl -0x14(%esi),%eax # Get Int no + cmpl $-1,%eax # Hardware interrupt? + jne intusr.1 # Yes +/* + * v86 calls save the btx_v86 pointer on the real mode stack and read + * the address and flags from the btx_v86 structure. For interrupt + * handler invocations (VM86 INTx requests), disable interrupts, + * tracing, and alignment checking while the handler runs. + */ movl $MEM_USR,%ebx # User base movl %ebx,%edx # address - jc intusr.1 # If btx_v86 - xorl %edx,%edx # Control flags - xorl %ebp,%ebp # btx_v86 pointer -intusr.1: leal 0x50(%esp,1),%esi # Base of frame - pushl %esi # Save addl -0x4(%esi),%ebx # User ESP - movl MEM_TSS+TSS_ESP1,%edi # Link stack pointer - leal -0x4(%edi),%edi # Adjust for push - xorl %ecx,%ecx # Zero - movb $0x5,%cl # Push exception - rep # frame on - movsl # link stack - xchgl %eax,%esi # Saved seg regs - movl 0x40(%esp,1),%eax # Get int no - testl %edx,%edx # Have btx_v86? - jz intusr.2 # No movl (%ebx),%ebp # btx_v86 pointer - movb $0x4,%cl # Count - addl %ecx,%ebx # Adjust for pop - rep # Push saved seg regs - movsl # on link stack addl %ebp,%edx # Flatten btx_v86 ptr - leal 0x14(%edx),%esi # Seg regs pointer - movl 0x4(%edx),%eax # Get int no/address - movzwl 0x2(%edx),%edx # Get control flags -intusr.2: movl %ebp,(%edi) # Push btx_v86 and - movl %edi,MEM_TSS+TSS_ESP1 # save link stack ptr - popl %edi # Base of frame - xchgl %eax,%ebp # Save intno/address - movl 0x48(%esp,1),%eax # Get flags - testb $0x2,%dl # Simulate CALLF? - jnz intusr.3 # Yes - decl %ebx # Push flags - decl %ebx # on V86 - movw %ax,(%ebx) # stack -intusr.3: movb $0x4,%cl # Count - subl %ecx,%ebx # Push return address - movl $inthlt,(%ebx) # on V86 stack - rep # Copy seg regs to - movsl # exception frame - xchgl %eax,%ecx # Save flags - movl %ebx,%eax # User ESP - subl $V86_STK,%eax # Less bytes - ja intusr.4 # to - xorl %eax,%eax # keep -intusr.4: shrl $0x4,%eax # Gives segment - stosl # Set SS - shll $0x4,%eax # To bytes - xchgl %eax,%ebx # Swap - subl %ebx,%eax # Gives offset - stosl # Set ESP - xchgl %eax,%ecx # Get flags - btsl $0x11,%eax # Set VM - andb $~0x1,%ah # Clear TF - stosl # Set EFL - xchgl %eax,%ebp # Get int no/address - testb $0x1,%dl # Address? - jnz intusr.5 # Yes - shll $0x2,%eax # Scale + movl %edx,MEM_ESPR-0x08 # Save btx_v86 ptr + movl V86_ADDR(%edx),%eax # Get int no/address + movl V86_CTL(%edx),%edx # Get control flags + movl -0x08(%esi),%ebx # Save user flags in %ebx + testl $V86F_ADDR,%edx # Segment:offset? + jnz intusr.4 # Yes + andl $~(PSL_I|PSL_T|PSL_AC),%ebx # Disable interrupts, tracing, + # and alignment checking for + # interrupt handler + jmp intusr.3 # Skip hardware interrupt +/* + * Hardware interrupts store a NULL btx_v86 pointer and use the + * address (interrupt number) from the stack with empty flags. Also, + * push a dummy frame of zeros onto the stack for all the general + * purpose and segment registers and clear %eflags. This gives the + * hardware interrupt handler a clean slate. + */ +intusr.1: xorl %edx,%edx # Control flags + movl %edx,MEM_ESPR-0x08 # NULL btx_v86 ptr + movl $12,%ecx # Frame is 12 dwords +intusr.2: pushl $0x0 # Fill frame + loop intusr.2 # with zeros + movl $PSL_RESERVED_DEFAULT,%ebx # Set clean %eflags +/* + * Look up real mode IDT entry for hardware interrupts and VM86 INTx + * requests. + */ +intusr.3: shll $0x2,%eax # Scale movl (%eax),%eax # Load int vector -intusr.5: movl %eax,%ecx # Save - shrl $0x10,%eax # Gives segment - stosl # Set CS - movw %cx,%ax # Restore - stosl # Set EIP - leal 0x10(%esp,1),%esp # Discard seg regs - popa # Restore - iret # To V86 mode + jmp intusr.5 # Skip CALLF test +/* + * Panic if V86F_CALLF isn't set with V86F_ADDR. + */ +intusr.4: testl $V86F_CALLF,%edx # Far call? + jnz intusr.5 # Ok + movl %edx,0x30(%esp,1) # Place VM86 flags in int no + movl $badvm86,%esi # Display bad + call putstr # VM86 call + popl %es # Restore + popl %ds # seg + popl %fs # regs + popl %gs + popal # Restore gp regs + jmp ex_noc # Panic +/* + * %eax now holds the segment:offset of the function. + * %ebx now holds the %eflags to pass to real mode. + * %edx now holds the V86F_* flags. + */ +intusr.5: movw %bx,MEM_ESPR-0x12 # Pass user flags to real mode + # target +/* + * If this is a v86 call, copy the seg regs out of the btx_v86 structure. + */ + movl MEM_ESPR-0x08,%ecx # Get btx_v86 ptr + jecxz intusr.6 # Skip for hardware ints + leal -0x44(%esi),%edi # %edi => kernel stack seg regs + pushl %esi # Save + leal V86_ES(%ecx),%esi # %esi => btx_v86 seg regs + movl $4,%ecx # Copy seg regs + rep # from btx_v86 + movsl # to kernel stack + popl %esi # Restore +intusr.6: movl -0x08(%esi),%ebx # Copy user flags to real + movl %ebx,MEM_ESPR-0x0c # mode return trampoline + movl $rret_tramp,%ebx # Set return trampoline + movl %ebx,MEM_ESPR-0x10 # CS:IP + movl %eax,MEM_ESPR-0x16 # Real mode target CS:IP + ljmpw $SEL_RCODE,$intusr.7 # Change to 16-bit segment + .code16 +intusr.7: movl %cr0,%eax # Leave + dec %al # protected + movl %eax,%cr0 # mode + ljmpw $0x0,$intusr.8 +intusr.8: xorw %ax,%ax # Reset %ds + movw %ax,%ds # and + movw %ax,%ss # %ss + lidt ivtdesc # Set IVT + popl %es # Restore + popl %ds # seg + popl %fs # regs + popl %gs + popal # Restore gp regs + movw $MEM_ESPR-0x16,%sp # Switch to real mode stack + iret # Call target routine +/* + * For the return to real mode we setup a stack frame like this on the real + * mode stack. Note that callf calls won't pop off the flags, but we just + * ignore that by repositioning %sp to be just above the btx_v86 pointer + * so it is aligned. The stack is relative to MEM_ESPR. + * + * -0x04 kernel %esp + * -0x08 btx_v86 + * -0x0c %eax + * -0x10 %ecx + * -0x14 %edx + * -0x18 %ebx + * -0x1c %esp + * -0x20 %ebp + * -0x24 %esi + * -0x28 %edi + * -0x2c %gs + * -0x30 %fs + * -0x34 %ds + * -0x38 %es + * -0x3c %eflags + */ +rret_tramp: movw $MEM_ESPR-0x08,%sp # Reset stack pointer + pushal # Save gp regs + pushl %gs # Save + pushl %fs # seg + pushl %ds # regs + pushl %es + pushfl # Save %eflags + cli # Disable interrupts + std # String ops dec + xorw %ax,%ax # Reset seg + movw %ax,%ds # regs + movw %ax,%es # (%ss is already 0) + lidt idtdesc # Set IDT + lgdt gdtdesc # Set GDT + mov %cr0,%eax # Switch to protected + inc %ax # mode + mov %eax,%cr0 # + ljmp $SEL_SCODE,$rret_tramp.1 # To 32-bit code + .code32 +rret_tramp.1: xorl %ecx,%ecx # Zero + movb $SEL_SDATA,%cl # Setup + movw %cx,%ss # 32-bit + movw %cx,%ds # seg + movw %cx,%es # regs + movl MEM_ESPR-0x04,%esp # Switch to kernel stack + leal 0x44(%esp,1),%esi # Base of frame + andb $~0x2,tss_desc+0x5 # Clear TSS busy + movb $SEL_TSS,%cl # Set task + ltr %cx # register +/* + * Now we are back in protected mode. The kernel stack frame set up + * before entering real mode is still intact. For hardware interrupts, + * leave the frame unchanged. + */ + cmpl $0,MEM_ESPR-0x08 # Leave saved regs unchanged + jz rret_tramp.3 # for hardware ints +/* + * For V86 calls, copy the registers off of the real mode stack onto + * the kernel stack as we want their updated values. Also, initialize + * the segment registers on the kernel stack. + * + * Note that the %esp in the kernel stack after this is garbage, but popa + * ignores it, so we don't have to fix it up. + */ + leal -0x18(%esi),%edi # Kernel stack GP regs + pushl %esi # Save + movl $MEM_ESPR-0x0c,%esi # Real mode stack GP regs + movl $8,%ecx # Copy GP regs from + rep # real mode stack + movsl # to kernel stack + movl $SEL_UDATA,%eax # Selector for data seg regs + movl $4,%ecx # Initialize %ds, + rep # %es, %fs, and + stosl # %gs +/* + * For V86 calls, copy the saved seg regs on the real mode stack back + * over to the btx_v86 structure. Also, conditionally update the + * saved eflags on the kernel stack based on the flags from the user. + */ + movl MEM_ESPR-0x08,%ecx # Get btx_v86 ptr + leal V86_GS(%ecx),%edi # %edi => btx_v86 seg regs + leal MEM_ESPR-0x2c,%esi # %esi => real mode seg regs + xchgl %ecx,%edx # Save btx_v86 ptr + movl $4,%ecx # Copy seg regs + rep # from real mode stack + movsl # to btx_v86 + popl %esi # Restore + movl V86_CTL(%edx),%edx # Read V86 control flags + testl $V86F_FLAGS,%edx # User wants flags? + jz rret_tramp.3 # No + movl MEM_ESPR-0x3c,%eax # Read real mode flags + movw %ax,-0x08(%esi) # Update user flags (low 16) +/* + * Return to the user task + */ +rret_tramp.3: popl %es # Restore + popl %ds # seg + popl %fs # regs + popl %gs + popal # Restore gp regs + addl $4,%esp # Discard int no + iret # Return to user mode + /* * System Call. */ @@ -869,7 +760,7 @@ dump.1: testb $DMP_X32,%ch # Dump long? dump.2: testb $DMP_MEM,%ch # Dump memory? jz dump.8 # No pushl %ds # Save - testb $0x2,0x52(%ebx) # V86 mode? + testl $PSL_VM,0x50(%ebx) # V86 mode? jnz dump.3 # Yes verr 0x4(%esi) # Readable selector? jnz dump.3 # No @@ -1060,6 +951,61 @@ putchr.4: movw %dx,(%ebx) # Update position ret # To caller #endif + .code16 +/* + * Real Mode Hardware interrupt jump table. + */ +intr20: push $0x8 # Int 0x20: IRQ0 + jmp int_hwr # V86 int 0x8 + push $0x9 # Int 0x21: IRQ1 + jmp int_hwr # V86 int 0x9 + push $0xa # Int 0x22: IRQ2 + jmp int_hwr # V86 int 0xa + push $0xb # Int 0x23: IRQ3 + jmp int_hwr # V86 int 0xb + push $0xc # Int 0x24: IRQ4 + jmp int_hwr # V86 int 0xc + push $0xd # Int 0x25: IRQ5 + jmp int_hwr # V86 int 0xd + push $0xe # Int 0x26: IRQ6 + jmp int_hwr # V86 int 0xe + push $0xf # Int 0x27: IRQ7 + jmp int_hwr # V86 int 0xf + push $0x10 # Int 0x28: IRQ8 + jmp int_hwr # V86 int 0x10 + push $0x11 # Int 0x29: IRQ9 + jmp int_hwr # V86 int 0x11 + push $0x12 # Int 0x2a: IRQ10 + jmp int_hwr # V86 int 0x12 + push $0x13 # Int 0x2b: IRQ11 + jmp int_hwr # V86 int 0x13 + push $0x14 # Int 0x2c: IRQ12 + jmp int_hwr # V86 int 0x14 + push $0x15 # Int 0x2d: IRQ13 + jmp int_hwr # V86 int 0x15 + push $0x16 # Int 0x2e: IRQ14 + jmp int_hwr # V86 int 0x16 + push $0x17 # Int 0x2f: IRQ15 + jmp int_hwr # V86 int 0x17 +/* + * Reflect hardware interrupts in real mode. + */ +int_hwr: push %ax # Save + push %ds # Save + push %bp # Save + mov %sp,%bp # Address stack frame + xchg %bx,6(%bp) # Swap BX, int no + xor %ax,%ax # Set %ds:%bx to + shl $2,%bx # point to + mov %ax,%ds # IDT entry + mov (%bx),%ax # Load IP + mov 2(%bx),%bx # Load CS + xchg %ax,4(%bp) # Swap saved %ax,%bx with + xchg %bx,6(%bp) # CS:IP of handler + pop %bp # Restore + pop %ds # Restore + lret # Jump to handler + .p2align 4 /* * Global descriptor table. @@ -1071,7 +1017,7 @@ gdt: .word 0x0,0x0,0x0,0x0 # Null entry .word 0xffff,0x0,0x9200,0x0 # SEL_RDATA .word 0xffff,MEM_USR,0xfa00,0xcf# SEL_UCODE .word 0xffff,MEM_USR,0xf200,0xcf# SEL_UDATA - .word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS +tss_desc: .word _TSSLM,MEM_TSS,0x8900,0x0 # SEL_TSS gdt.1: /* * Pseudo-descriptors. @@ -1139,6 +1085,11 @@ dmpfmt: .byte '\n' # "\n" .ascii "ss:esp" # "ss:esp=" .byte 0x80|DMP_MEM|DMP_EOL,0x0 # "00 00 ... 00 00\n" .asciz "BTX halted\n" # End +/* + * Bad VM86 call panic + */ +badvm86: .asciz "Invalid VM86 Request\n" + /* * End of BTX memory. */ diff --git a/sys/boot/pc98/kgzldr/crt.s b/sys/boot/pc98/kgzldr/crt.s index e028bc8e6722..35c1fc2dfe73 100644 --- a/sys/boot/pc98/kgzldr/crt.s +++ b/sys/boot/pc98/kgzldr/crt.s @@ -75,5 +75,15 @@ crt_putchr.3: cmpw $SCR_ROW*SCR_COL*2,%dx stosw # line movw $(SCR_ROW-1)*SCR_COL*2,%dx crt_putchr.4: movw %dx,(%ebx) # Update position + shrw $1,%dx +crt_putchr.5: inb $0x60,%al # Move cursor + testb $0x04,%al + jz crt_putchr.5 + movb $0x49,%al + outb %al,$0x62 + movb %dl,%al + outb %al,$0x60 + movb %dh,%al + outb %al,$0x60 popa # Restore ret # To caller diff --git a/sys/boot/pc98/libpc98/Makefile b/sys/boot/pc98/libpc98/Makefile index 1a28b6b9a258..6c6ce892fddc 100644 --- a/sys/boot/pc98/libpc98/Makefile +++ b/sys/boot/pc98/libpc98/Makefile @@ -8,7 +8,7 @@ INTERNALLIB= SRCS= bioscd.c biosdisk.c biosmem.c biospnp.c \ biospci.c biossmap.c bootinfo.c bootinfo32.c \ comconsole.c devicename.c elf32_freebsd.c \ - i386_copy.c i386_module.c nullconsole.c pxe.c pxetramp.s \ + i386_copy.c i386_module.c nullconsole.c pc98_sys.c pxe.c pxetramp.s \ time.c vidconsole.c # Enable PXE TFTP or NFS support, not both. diff --git a/sys/boot/pc98/libpc98/biosdisk.c b/sys/boot/pc98/libpc98/biosdisk.c index 2f18285a50d2..c2e7d6618cd3 100644 --- a/sys/boot/pc98/libpc98/biosdisk.c +++ b/sys/boot/pc98/libpc98/biosdisk.c @@ -906,11 +906,11 @@ bd_io(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest, int write) } if (write) - DEBUG("%d sectors from %lld to %p (0x%x) %s", x, dblk, p, VTOP(p), - result ? "failed" : "ok"); + DEBUG("Write %d sector(s) from %p (0x%x) to %lld %s", x, + p, VTOP(p), dblk, result ? "failed" : "ok"); else - DEBUG("%d sectors from %p (0x%x) to %lld %s", x, p, VTOP(p), dblk, - result ? "failed" : "ok"); + DEBUG("Read %d sector(s) from %lld to %p (0x%x) %s", x, + dblk, p, VTOP(p), result ? "failed" : "ok"); if (result) { return(-1); } diff --git a/sys/boot/pc98/libpc98/biosmem.c b/sys/boot/pc98/libpc98/biosmem.c index b450922e3d2c..a25d8c2d9e93 100644 --- a/sys/boot/pc98/libpc98/biosmem.c +++ b/sys/boot/pc98/libpc98/biosmem.c @@ -34,8 +34,13 @@ __FBSDID("$FreeBSD$"); #include "libi386.h" #include "btxv86.h" -vm_offset_t memtop, memtop_copyin; -u_int32_t bios_basemem, bios_extmem; +vm_offset_t memtop, memtop_copyin, high_heap_base; +uint32_t bios_basemem, bios_extmem, high_heap_size; + +/* + * The minimum amount of memory to reserve in bios_extmem for the heap. + */ +#define HEAP_MIN (3 * 1024 * 1024) void bios_getmem(void) @@ -48,5 +53,12 @@ bios_getmem(void) /* Set memtop to actual top of memory */ memtop = memtop_copyin = 0x100000 + bios_extmem; + /* + * If we have extended memory, use the last 3MB of 'extended' memory + * as a high heap candidate. + */ + if (bios_extmem >= HEAP_MIN) { + high_heap_size = HEAP_MIN; + high_heap_base = memtop - HEAP_MIN; + } } - diff --git a/sys/boot/pc98/libpc98/libpc98.h b/sys/boot/pc98/libpc98/libpc98.h new file mode 100644 index 000000000000..78b07a10ffa3 --- /dev/null +++ b/sys/boot/pc98/libpc98/libpc98.h @@ -0,0 +1,29 @@ +/*- + * Copyright (c) 2009 TAKAHASHI Yoshihiro + * 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$ + */ + +void set_machine_type(void); diff --git a/sys/boot/pc98/libpc98/pc98_sys.c b/sys/boot/pc98/libpc98/pc98_sys.c new file mode 100644 index 000000000000..7f66d02c630f --- /dev/null +++ b/sys/boot/pc98/libpc98/pc98_sys.c @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 2009 TAKAHASHI Yoshihiro + * 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. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#define _KERNEL +#include + +/* + * Set machine type to PC98_SYSTEM_PARAMETER. + */ +void +set_machine_type(void) +{ + int i; + u_long ret, data; + + /* PC98_SYSTEM_PARAMETER (0x501) */ + ret = ((*(u_char *)PTOV(0xA1501)) & 0x08) >> 3; + + /* Wait V-SYNC */ + while (inb(0x60) & 0x20) {} + while (!(inb(0x60) & 0x20)) {} + + /* ANK 'A' font */ + outb(0xa1, 0x00); + outb(0xa3, 0x41); + + /* M_NORMAL, use CG window (all NEC OK) */ + for (i = data = 0; i < 4; i++) + data += *((u_long *)PTOV(0xA4000) + i); /* 0xa4000 */ + if (data == 0x6efc58fc) /* DA data */ + ret |= M_NEC_PC98; + else + ret |= M_EPSON_PC98; + ret |= (inb(0x42) & 0x20) ? M_8M : 0; + + /* PC98_SYSTEM_PARAMETER(0x400) */ + if ((*(u_char *)PTOV(0xA1400)) & 0x80) + ret |= M_NOTE; + if (ret & M_NEC_PC98) { + /* PC98_SYSTEM_PARAMETER(0x458) */ + if ((*(u_char *)PTOV(0xA1458)) & 0x80) + ret |= M_H98; + else + ret |= M_NOT_H98; + } else + ret |= M_NOT_H98; + + (*(u_long *)PTOV(0xA1620)) = ret; +} diff --git a/sys/boot/pc98/loader/main.c b/sys/boot/pc98/loader/main.c index 6573990faa36..da14d0bcf8ff 100644 --- a/sys/boot/pc98/loader/main.c +++ b/sys/boot/pc98/loader/main.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include "bootstrap.h" #include "libi386/libi386.h" +#include "libpc98/libpc98.h" #include "btxv86.h" #define KARGS_FLAGS_CD 0x1 @@ -81,6 +82,9 @@ main(void) { int i; + /* Set machine type to PC98_SYSTEM_PARAMETER. */ + set_machine_type(); + /* Pick up arguments */ kargs = (void *)__args; initial_howto = kargs->howto; @@ -96,14 +100,18 @@ main(void) */ bios_getmem(); -#ifdef LOADER_BZIP2_SUPPORT - heap_top = PTOV(memtop_copyin); - memtop_copyin -= 0x300000; - heap_bottom = PTOV(memtop_copyin); -#else - heap_top = (void *)bios_basemem; - heap_bottom = (void *)end; +#if defined(LOADER_BZIP2_SUPPORT) + if (high_heap_size > 0) { + heap_top = PTOV(high_heap_base + high_heap_size); + heap_bottom = PTOV(high_heap_base); + if (high_heap_base < memtop_copyin) + memtop_copyin = high_heap_base; + } else #endif + { + heap_top = (void *)PTOV(bios_basemem); + heap_bottom = (void *)end; + } setheap(heap_bottom, heap_top); /* diff --git a/sys/boot/powerpc/ofw/Makefile b/sys/boot/powerpc/ofw/Makefile index dfc80db04752..d42fa927ce5c 100644 --- a/sys/boot/powerpc/ofw/Makefile +++ b/sys/boot/powerpc/ofw/Makefile @@ -56,6 +56,11 @@ CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/powerpc LIBFICL= ${.OBJDIR}/../../ficl/libficl.a .endif +# Avoid the open-close-dance for every file access as some firmwares perform +# an auto-negotiation on every open of the network interface and thus causes +# netbooting to take horribly long. +CFLAGS+= -DNETIF_OPEN_CLOSE_ONCE + # Always add MI sources .PATH: ${.CURDIR}/../../common .include "${.CURDIR}/../../common/Makefile.inc" diff --git a/sys/boot/powerpc/uboot/Makefile b/sys/boot/powerpc/uboot/Makefile index efb401e9cef9..62a286831ce6 100644 --- a/sys/boot/powerpc/uboot/Makefile +++ b/sys/boot/powerpc/uboot/Makefile @@ -9,8 +9,8 @@ NO_MAN= # Architecture-specific loader code SRCS= start.S conf.c vers.c -LOADER_DISK_SUPPORT?= no -LOADER_UFS_SUPPORT?= no +LOADER_DISK_SUPPORT?= yes +LOADER_UFS_SUPPORT?= yes LOADER_CD9660_SUPPORT?= no LOADER_EXT2FS_SUPPORT?= no LOADER_NET_SUPPORT?= yes @@ -85,11 +85,11 @@ LDADD= ${LIBFICL} ${LIBUBOOT} -lstand vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT} -${PROG}.help: help.common help.uboot +loader.help: help.common help.uboot cat ${.ALLSRC} | \ awk -f ${.CURDIR}/../../common/merge_help.awk > ${.TARGET} .PATH: ${.CURDIR}/../../forth -FILES= ${PROG}.help +FILES= loader.help .include diff --git a/sys/boot/powerpc/uboot/conf.c b/sys/boot/powerpc/uboot/conf.c index 5a9515a452d6..35305371ce6b 100644 --- a/sys/boot/powerpc/uboot/conf.c +++ b/sys/boot/powerpc/uboot/conf.c @@ -47,7 +47,7 @@ __FBSDID("$FreeBSD$"); /* Exported for libstand */ struct devsw *devsw[] = { #if defined(LOADER_DISK_SUPPORT) || defined(LOADER_CD9660_SUPPORT) - &uboot_disk, + &uboot_storage, #endif #if defined(LOADER_NET_SUPPORT) &netdev, diff --git a/sys/boot/sparc64/loader/Makefile b/sys/boot/sparc64/loader/Makefile index 0d7161c715e6..46c6baaee3a8 100644 --- a/sys/boot/sparc64/loader/Makefile +++ b/sys/boot/sparc64/loader/Makefile @@ -51,11 +51,15 @@ CFLAGS+= -DBOOT_FORTH -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/sparc64 LIBFICL= ${.OBJDIR}/../../ficl/libficl.a .endif -# Always add MI sources +# Always add MI sources .PATH: ${.CURDIR}/../../common .include "${.CURDIR}/../../common/Makefile.inc" CFLAGS+= -I${.CURDIR}/../../common CFLAGS+= -I. +# Avoid the open-close-dance for every file access as some firmwares perform +# an auto-negotiation on every open of the network interface and thus causes +# netbooting to take horribly long. +CFLAGS+= -DNETIF_OPEN_CLOSE_ONCE CLEANFILES+= vers.c loader.help diff --git a/sys/boot/sparc64/loader/main.c b/sys/boot/sparc64/loader/main.c index 3a899a862e0f..2afbfeeb75e3 100644 --- a/sys/boot/sparc64/loader/main.c +++ b/sys/boot/sparc64/loader/main.c @@ -46,16 +46,19 @@ __FBSDID("$FreeBSD$"); */ #include -#include #include -#include +#include #include +#include #include #include #include +#include #include #include +#include +#include #include #include #include @@ -68,6 +71,12 @@ __FBSDID("$FreeBSD$"); #include "libofw.h" #include "dev_net.h" +#ifndef CTASSERT +#define CTASSERT(x) _CTASSERT(x, __LINE__) +#define _CTASSERT(x, y) __CTASSERT(x, y) +#define __CTASSERT(x, y) typedef char __assert ## y[(x) ? 1 : -1] +#endif + extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[]; enum { @@ -76,6 +85,9 @@ enum { LOADSZ = 0x1000000 /* for kernel and modules */ }; +/* At least Sun Fire V1280 require page sized allocations to be claimed. */ +CTASSERT(HEAPSZ % PAGE_SIZE == 0); + static struct mmu_ops { void (*tlb_init)(void); int (*mmu_mapin)(vm_offset_t va, vm_size_t len); @@ -84,11 +96,11 @@ static struct mmu_ops { typedef void kernel_entry_t(vm_offset_t mdp, u_long o1, u_long o2, u_long o3, void *openfirmware); -static inline u_long dtlb_get_data_sun4u(int slot); -static void dtlb_enter_sun4u(u_long vpn, u_long data); +static inline u_long dtlb_get_data_sun4u(u_int); +static int dtlb_enter_sun4u(u_int, u_long data, vm_offset_t); static vm_offset_t dtlb_va_to_pa_sun4u(vm_offset_t); -static inline u_long itlb_get_data_sun4u(int slot); -static void itlb_enter_sun4u(u_long vpn, u_long data); +static inline u_long itlb_get_data_sun4u(u_int); +static int itlb_enter_sun4u(u_int, u_long data, vm_offset_t); static vm_offset_t itlb_va_to_pa_sun4u(vm_offset_t); static void itlb_relocate_locked0_sun4u(void); extern vm_offset_t md_load(char *, vm_offset_t *); @@ -104,6 +116,9 @@ static int __elfN(exec)(struct preloaded_file *); static int mmu_mapin_sun4u(vm_offset_t, vm_size_t); static int mmu_mapin_sun4v(vm_offset_t, vm_size_t); static vm_offset_t init_heap(void); +static phandle_t find_bsp_sun4u(phandle_t, uint32_t); +const char *cpu_cpuid_prop_sun4u(void); +uint32_t cpu_get_mid_sun4u(void); static void tlb_init_sun4u(void); static void tlb_init_sun4v(void); @@ -120,11 +135,11 @@ static struct mmu_ops mmu_ops_sun4v = { tlb_init_sun4v, mmu_mapin_sun4v }; /* sun4u */ struct tlb_entry *dtlb_store; struct tlb_entry *itlb_store; -int dtlb_slot; -int itlb_slot; -int cpu_impl; -static int dtlb_slot_max; -static int itlb_slot_max; +u_int dtlb_slot; +u_int itlb_slot; +static int cpu_impl; +static u_int dtlb_slot_max; +static u_int itlb_slot_max; /* sun4v */ static struct tlb_entry *tlb_store; @@ -261,7 +276,6 @@ static int sparc64_autoload(void) { - setenv("hw.ata.atapi_dma", "0", 0); return (0); } @@ -387,6 +401,8 @@ __elfN(exec)(struct preloaded_file *fp) pmap_print_tlb_sun4u(); #endif + dev_cleanup(); + entry = e->e_entry; OF_release((void *)heapva, HEAPSZ); @@ -397,7 +413,7 @@ __elfN(exec)(struct preloaded_file *fp) } static inline u_long -dtlb_get_data_sun4u(int slot) +dtlb_get_data_sun4u(u_int slot) { /* @@ -409,7 +425,7 @@ dtlb_get_data_sun4u(int slot) } static inline u_long -itlb_get_data_sun4u(int slot) +itlb_get_data_sun4u(u_int slot) { /* @@ -466,55 +482,24 @@ itlb_va_to_pa_sun4u(vm_offset_t va) return (-1); } -static void -dtlb_enter_sun4u(u_long vpn, u_long data) +static int +dtlb_enter_sun4u(u_int index, u_long data, vm_offset_t virt) { - u_long reg; - reg = rdpr(pstate); - wrpr(pstate, reg & ~PSTATE_IE, 0); - stxa(AA_DMMU_TAR, ASI_DMMU, - TLB_TAR_VA(vpn) | TLB_TAR_CTX(TLB_CTX_KERNEL)); - stxa(0, ASI_DTLB_DATA_IN_REG, data); - membar(Sync); - wrpr(pstate, reg, 0); + return (OF_call_method("SUNW,dtlb-load", mmu, 3, 0, index, data, + virt)); } -static void -itlb_enter_sun4u(u_long vpn, u_long data) +static int +itlb_enter_sun4u(u_int index, u_long data, vm_offset_t virt) { - u_long reg; - int i; - reg = rdpr(pstate); - wrpr(pstate, reg & ~PSTATE_IE, 0); - - if (cpu_impl == CPU_IMPL_ULTRASPARCIIIp) { - /* - * Search an unused slot != 0 and explicitly enter the data - * and tag there in order to avoid Cheetah+ erratum 34. - */ - for (i = 1; i < itlb_slot_max; i++) { - if ((itlb_get_data_sun4u(i) & TD_V) != 0) - continue; - - stxa(AA_IMMU_TAR, ASI_IMMU, - TLB_TAR_VA(vpn) | TLB_TAR_CTX(TLB_CTX_KERNEL)); - stxa(TLB_DAR_SLOT(i), ASI_ITLB_DATA_ACCESS_REG, data); - flush(PROMBASE); - break; - } - wrpr(pstate, reg, 0); - if (i == itlb_slot_max) - panic("%s: could not find an unused slot", __func__); - return; - } - - stxa(AA_IMMU_TAR, ASI_IMMU, - TLB_TAR_VA(vpn) | TLB_TAR_CTX(TLB_CTX_KERNEL)); - stxa(0, ASI_ITLB_DATA_IN_REG, data); - flush(PROMBASE); - wrpr(pstate, reg, 0); + if (cpu_impl == CPU_IMPL_ULTRASPARCIIIp && index == 0 && + (data & TD_L) != 0) + panic("%s: won't enter locked TLB entry at index 0 on USIII+", + __func__); + return (OF_call_method("SUNW,itlb-load", mmu, 3, 0, index, data, + virt)); } static void @@ -564,6 +549,7 @@ mmu_mapin_sun4u(vm_offset_t va, vm_size_t len) { vm_offset_t pa, mva; u_long data; + u_int index; if (va + len > curkva) curkva = va + len; @@ -601,12 +587,20 @@ mmu_mapin_sun4u(vm_offset_t va, vm_size_t len) TD_CV | TD_P | TD_W; dtlb_store[dtlb_slot].te_pa = pa; dtlb_store[dtlb_slot].te_va = va; + index = dtlb_slot_max - dtlb_slot - 1; + if (dtlb_enter_sun4u(index, data, va) < 0) + panic("%s: can't enter dTLB slot %d data " + "%#lx va %#lx", __func__, index, data, + va); + dtlb_slot++; itlb_store[itlb_slot].te_pa = pa; itlb_store[itlb_slot].te_va = va; - dtlb_slot++; + index = itlb_slot_max - itlb_slot - 1; + if (itlb_enter_sun4u(index, data, va) < 0) + panic("%s: can't enter iTLB slot %d data " + "%#lx va %#lxd", __func__, index, data, + va); itlb_slot++; - dtlb_enter_sun4u(va, data); - itlb_enter_sun4u(va, data); pa = (vm_offset_t)-1; } len -= len > PAGE_SIZE_4M ? PAGE_SIZE_4M : len; @@ -667,33 +661,98 @@ init_heap(void) return (heapva); } +static phandle_t +find_bsp_sun4u(phandle_t node, uint32_t bspid) +{ + char type[sizeof("cpu")]; + phandle_t child; + uint32_t cpuid; + + for (; node > 0; node = OF_peer(node)) { + child = OF_child(node); + if (child > 0) { + child = find_bsp_sun4u(child, bspid); + if (child > 0) + return (child); + } else { + if (OF_getprop(node, "device_type", type, + sizeof(type)) <= 0) + continue; + if (strcmp(type, "cpu") != 0) + continue; + if (OF_getprop(node, cpu_cpuid_prop_sun4u(), &cpuid, + sizeof(cpuid)) <= 0) + continue; + if (cpuid == bspid) + return (node); + } + } + return (0); +} + +const char * +cpu_cpuid_prop_sun4u(void) +{ + + switch (cpu_impl) { + case CPU_IMPL_SPARC64: + case CPU_IMPL_ULTRASPARCI: + case CPU_IMPL_ULTRASPARCII: + case CPU_IMPL_ULTRASPARCIIi: + case CPU_IMPL_ULTRASPARCIIe: + return ("upa-portid"); + case CPU_IMPL_ULTRASPARCIII: + case CPU_IMPL_ULTRASPARCIIIp: + case CPU_IMPL_ULTRASPARCIIIi: + case CPU_IMPL_ULTRASPARCIIIip: + return ("portid"); + case CPU_IMPL_ULTRASPARCIV: + case CPU_IMPL_ULTRASPARCIVp: + return ("cpuid"); + default: + return (""); + } +} + +uint32_t +cpu_get_mid_sun4u(void) +{ + + switch (cpu_impl) { + case CPU_IMPL_SPARC64: + case CPU_IMPL_ULTRASPARCI: + case CPU_IMPL_ULTRASPARCII: + case CPU_IMPL_ULTRASPARCIIi: + case CPU_IMPL_ULTRASPARCIIe: + return (UPA_CR_GET_MID(ldxa(0, ASI_UPA_CONFIG_REG))); + case CPU_IMPL_ULTRASPARCIII: + case CPU_IMPL_ULTRASPARCIIIp: + return (FIREPLANE_CR_GET_AID(ldxa(AA_FIREPLANE_CONFIG, + ASI_FIREPLANE_CONFIG_REG))); + case CPU_IMPL_ULTRASPARCIIIi: + case CPU_IMPL_ULTRASPARCIIIip: + return (JBUS_CR_GET_JID(ldxa(0, ASI_JBUS_CONFIG_REG))); + case CPU_IMPL_ULTRASPARCIV: + case CPU_IMPL_ULTRASPARCIVp: + return (INTR_ID_GET_ID(ldxa(AA_INTR_ID, ASI_INTR_ID))); + default: + return (0); + } +} + static void tlb_init_sun4u(void) { - phandle_t child; - char buf[128]; - u_int bootcpu; - u_int cpu; + phandle_t bsp; cpu_impl = VER_IMPL(rdpr(ver)); - bootcpu = UPA_CR_GET_MID(ldxa(0, ASI_UPA_CONFIG_REG)); - for (child = OF_child(root); child != 0; child = OF_peer(child)) { - if (OF_getprop(child, "device_type", buf, sizeof(buf)) <= 0) - continue; - if (strcmp(buf, "cpu") != 0) - continue; - if (OF_getprop(child, cpu_impl < CPU_IMPL_ULTRASPARCIII ? - "upa-portid" : "portid", &cpu, sizeof(cpu)) <= 0) - continue; - if (cpu == bootcpu) - break; - } - if (cpu != bootcpu) + bsp = find_bsp_sun4u(OF_child(root), cpu_get_mid_sun4u()); + if (bsp == 0) panic("%s: no node for bootcpu?!?!", __func__); - if (OF_getprop(child, "#dtlb-entries", &dtlb_slot_max, + if (OF_getprop(bsp, "#dtlb-entries", &dtlb_slot_max, sizeof(dtlb_slot_max)) == -1 || - OF_getprop(child, "#itlb-entries", &itlb_slot_max, + OF_getprop(bsp, "#itlb-entries", &itlb_slot_max, sizeof(itlb_slot_max)) == -1) panic("%s: can't get TLB slot max.", __func__); @@ -748,14 +807,15 @@ main(int (*openfirm)(void *)) archsw.arch_autoload = sparc64_autoload; archsw.arch_maphint = sparc64_maphint; - init_heap(); - setheap((void *)heapva, (void *)(heapva + HEAPSZ)); - /* * Probe for a console. */ cons_probe(); + if (init_heap() == (vm_offset_t)-1) + panic("%s: can't claim heap", __func__); + setheap((void *)heapva, (void *)(heapva + HEAPSZ)); + if ((root = OF_peer(0)) == -1) panic("%s: can't get root phandle", __func__); OF_getprop(root, "compatible", compatible, sizeof(compatible)); diff --git a/sys/boot/uboot/common/main.c b/sys/boot/uboot/common/main.c index 1ebb09750f67..7d068ee9617b 100644 --- a/sys/boot/uboot/common/main.c +++ b/sys/boot/uboot/common/main.c @@ -117,6 +117,7 @@ main(void) { struct api_signature *sig = NULL; int i; + struct open_file f; if (!api_search_sig(&sig)) return (-1); @@ -168,18 +169,28 @@ main(void) printf("(%s, %s)\n", bootprog_maker, bootprog_date); meminfo(); - /* XXX only support netbooting for now */ - for (i = 0; devsw[i] != NULL; i++) + for (i = 0; devsw[i] != NULL; i++) { + printf("\nDevice %d: %s\n", i, devsw[i]->dv_name); + + currdev.d_dev = devsw[i]; + currdev.d_type = currdev.d_dev->dv_type; + currdev.d_unit = 0; + + if (strncmp(devsw[i]->dv_name, "disk", + strlen(devsw[i]->dv_name)) == 0) { + f.f_devdata = &currdev; + currdev.d_disk.pnum = 0; + if (devsw[i]->dv_open(&f,&currdev) == 0) + break; + } + if (strncmp(devsw[i]->dv_name, "net", strlen(devsw[i]->dv_name)) == 0) break; + } if (devsw[i] == NULL) - panic("no network devices?!"); - - currdev.d_dev = devsw[i]; - currdev.d_type = currdev.d_dev->dv_type; - currdev.d_unit = 0; + panic("No boot device found!"); env_setenv("currdev", EV_VOLATILE, uboot_fmtdev(&currdev), uboot_setcurrdev, env_nounset); diff --git a/sys/boot/uboot/common/metadata.c b/sys/boot/uboot/common/metadata.c index 9c8ce94d4f3d..e5f4b04c37bf 100644 --- a/sys/boot/uboot/common/metadata.c +++ b/sys/boot/uboot/common/metadata.c @@ -231,6 +231,7 @@ md_copymodules(vm_offset_t addr) struct preloaded_file *fp; struct file_metadata *md; int c; + vm_offset_t a; c = addr != 0; /* start with the first module on the list, should be the kernel */ @@ -240,7 +241,8 @@ md_copymodules(vm_offset_t addr) MOD_TYPE(addr, fp->f_type, c); if (fp->f_args) MOD_ARGS(addr, fp->f_args, c); - MOD_ADDR(addr, fp->f_addr, c); + a = fp->f_addr - __elfN(relocation_offset); + MOD_ADDR(addr, a, c); MOD_SIZE(addr, fp->f_size, c); for (md = fp->f_metadata; md != NULL; md = md->md_next) { if (!(md->md_type & MODINFOMD_NOCOPY)) diff --git a/sys/boot/uboot/lib/disk.c b/sys/boot/uboot/lib/disk.c index 4cbdbea445fe..3af4c7956942 100644 --- a/sys/boot/uboot/lib/disk.c +++ b/sys/boot/uboot/lib/disk.c @@ -376,6 +376,14 @@ stor_open_gpt(struct open_dev *od, struct uboot_devdesc *dev) } dev->d_disk.ptype = PTYPE_GPT; + /* + * If index of partition to open (dev->d_disk.pnum) is not defined + * we set it to the index of the first existing partition. This + * handles cases when only a disk device is specified (without full + * partition information) by the caller. + */ + if ((od->od_nparts > 0) && (dev->d_disk.pnum == 0)) + dev->d_disk.pnum = od->od_partitions[0].gp_index; for (i = 0; i < od->od_nparts; i++) if (od->od_partitions[i].gp_index == dev->d_disk.pnum) diff --git a/sys/boot/uboot/lib/glue.c b/sys/boot/uboot/lib/glue.c index 3945b05750e1..5483732881a0 100644 --- a/sys/boot/uboot/lib/glue.c +++ b/sys/boot/uboot/lib/glue.c @@ -467,7 +467,7 @@ ub_stor_type(int type) if (type & DT_STOR_USB) return ("USB"); - if (type & DT_STOR_MMC); + if (type & DT_STOR_MMC) return ("MMC"); return ("Unknown"); @@ -568,24 +568,18 @@ ub_env_enum(const char *last) const char *env, *str; int i; - env = NULL; - /* * It's OK to pass only the name piece as last (and not the whole * 'name=val' string), since the API_ENUM_ENV call uses envmatch() * internally, which handles such case */ - if (!syscall(API_ENV_ENUM, NULL, (uint32_t)last, (uint32_t)&env)) + env = NULL; + if (syscall(API_ENV_ENUM, NULL, (uint32_t)last, (uint32_t)&env) != 0) return (NULL); - if (!env) + if (env == NULL) /* no more env. variables to enumerate */ return (NULL); -#if 0 - if (last && strncmp(env, last, strlen(last)) == 0); - /* error, trying to enumerate non existing env. variable */ - return NULL; -#endif /* next enumerated env var */ memset(env_name, 0, 256); diff --git a/sys/boot/uboot/lib/time.c b/sys/boot/uboot/lib/time.c index b7c3fe8ca4da..9083675b75d7 100644 --- a/sys/boot/uboot/lib/time.c +++ b/sys/boot/uboot/lib/time.c @@ -48,7 +48,7 @@ time(time_t *tloc) } int -getsecs() +getsecs(void) { return (time(NULL)); diff --git a/sys/boot/zfs/zfs.c b/sys/boot/zfs/zfs.c index 9784ef97d504..99bb60a0696e 100644 --- a/sys/boot/zfs/zfs.c +++ b/sys/boot/zfs/zfs.c @@ -100,7 +100,7 @@ zfs_open(const char *upath, struct open_file *f) f->f_fsdata = (void *)fp; if (spa->spa_root_objset.os_type != DMU_OST_ZFS) { - printf("Unexpected object set type %lld\n", + printf("Unexpected object set type %llu\n", spa->spa_root_objset.os_type); rc = EIO; goto out; @@ -397,7 +397,7 @@ zfs_dev_init(void) /* * Open all the disks we can find and see if we can reconstruct * ZFS pools from them. Bogusly assumes that the disks are named - * diskN or diskNsM. + * diskN, diskNpM or diskNsM. */ zfs_init(); for (unit = 0; unit < 32 /* XXX */; unit++) { @@ -413,7 +413,7 @@ zfs_dev_init(void) if (vdev_probe(vdev_read, (void*) (uintptr_t) fd, 0)) close(fd); - for (slice = 1; slice <= 4; slice++) { + for (slice = 1; slice <= 128; slice++) { sprintf(devname, "disk%dp%d:", unit, slice); fd = open(devname, O_RDONLY); if (fd == -1) { diff --git a/sys/boot/zfs/zfsimpl.c b/sys/boot/zfs/zfsimpl.c index ff567a462ef3..1407eb5d9c71 100644 --- a/sys/boot/zfs/zfsimpl.c +++ b/sys/boot/zfs/zfsimpl.c @@ -51,7 +51,9 @@ static char *dnode_cache_buf; static char *zap_scratch; static char *zfs_temp_buf, *zfs_temp_end, *zfs_temp_ptr; -#define TEMP_SIZE (1*SPA_MAXBLOCKSIZE) +#define TEMP_SIZE (1024 * 1024) + +static int zio_read(spa_t *spa, const blkptr_t *bp, void *buf); static void zfs_init(void) @@ -402,7 +404,7 @@ vdev_create(uint64_t guid, vdev_read_t *read) } static int -vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t **vdevp) +vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t **vdevp, int is_newer) { int rc; uint64_t guid, id, ashift, nparity; @@ -410,7 +412,8 @@ vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t **vdevp) const char *path; vdev_t *vdev, *kid; const unsigned char *kids; - int nkids, i; + int nkids, i, is_new; + uint64_t is_offline, is_faulted, is_degraded, is_removed; if (nvlist_find(nvlist, ZPOOL_CONFIG_GUID, DATA_TYPE_UINT64, 0, &guid) @@ -422,17 +425,6 @@ vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t **vdevp) return (ENOENT); } - /* - * Assume that if we've seen this vdev tree before, this one - * will be identical. - */ - vdev = vdev_find(guid); - if (vdev) { - if (vdevp) - *vdevp = vdev; - return (0); - } - if (strcmp(type, VDEV_TYPE_MIRROR) && strcmp(type, VDEV_TYPE_DISK) && strcmp(type, VDEV_TYPE_RAIDZ)) { @@ -440,44 +432,92 @@ vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t **vdevp) return (EIO); } - if (!strcmp(type, VDEV_TYPE_MIRROR)) - vdev = vdev_create(guid, vdev_mirror_read); - else if (!strcmp(type, VDEV_TYPE_RAIDZ)) - vdev = vdev_create(guid, vdev_raidz_read); - else - vdev = vdev_create(guid, vdev_disk_read); + is_offline = is_removed = is_faulted = is_degraded = 0; - vdev->v_id = id; - if (nvlist_find(nvlist, ZPOOL_CONFIG_ASHIFT, - DATA_TYPE_UINT64, 0, &ashift) == 0) - vdev->v_ashift = ashift; - else - vdev->v_ashift = 0; - if (nvlist_find(nvlist, ZPOOL_CONFIG_NPARITY, - DATA_TYPE_UINT64, 0, &nparity) == 0) - vdev->v_nparity = nparity; - else - vdev->v_nparity = 0; - if (nvlist_find(nvlist, ZPOOL_CONFIG_PATH, - DATA_TYPE_STRING, 0, &path) == 0) { - if (strlen(path) > 5 - && path[0] == '/' - && path[1] == 'd' - && path[2] == 'e' - && path[3] == 'v' - && path[4] == '/') - path += 5; - vdev->v_name = strdup(path); - } else { - if (!strcmp(type, "raidz")) { - if (vdev->v_nparity == 1) - vdev->v_name = "raidz1"; - else - vdev->v_name = "raidz2"; + nvlist_find(nvlist, ZPOOL_CONFIG_OFFLINE, DATA_TYPE_UINT64, 0, + &is_offline); + nvlist_find(nvlist, ZPOOL_CONFIG_REMOVED, DATA_TYPE_UINT64, 0, + &is_removed); + nvlist_find(nvlist, ZPOOL_CONFIG_FAULTED, DATA_TYPE_UINT64, 0, + &is_faulted); + nvlist_find(nvlist, ZPOOL_CONFIG_DEGRADED, DATA_TYPE_UINT64, 0, + &is_degraded); + + vdev = vdev_find(guid); + if (!vdev) { + is_new = 1; + + if (!strcmp(type, VDEV_TYPE_MIRROR)) + vdev = vdev_create(guid, vdev_mirror_read); + else if (!strcmp(type, VDEV_TYPE_RAIDZ)) + vdev = vdev_create(guid, vdev_raidz_read); + else + vdev = vdev_create(guid, vdev_disk_read); + + vdev->v_id = id; + if (nvlist_find(nvlist, ZPOOL_CONFIG_ASHIFT, + DATA_TYPE_UINT64, 0, &ashift) == 0) + vdev->v_ashift = ashift; + else + vdev->v_ashift = 0; + if (nvlist_find(nvlist, ZPOOL_CONFIG_NPARITY, + DATA_TYPE_UINT64, 0, &nparity) == 0) + vdev->v_nparity = nparity; + else + vdev->v_nparity = 0; + if (nvlist_find(nvlist, ZPOOL_CONFIG_PATH, + DATA_TYPE_STRING, 0, &path) == 0) { + if (strlen(path) > 5 + && path[0] == '/' + && path[1] == 'd' + && path[2] == 'e' + && path[3] == 'v' + && path[4] == '/') + path += 5; + vdev->v_name = strdup(path); } else { - vdev->v_name = strdup(type); + if (!strcmp(type, "raidz")) { + if (vdev->v_nparity == 1) + vdev->v_name = "raidz1"; + else + vdev->v_name = "raidz2"; + } else { + vdev->v_name = strdup(type); + } + } + + if (is_offline) + vdev->v_state = VDEV_STATE_OFFLINE; + else if (is_removed) + vdev->v_state = VDEV_STATE_REMOVED; + else if (is_faulted) + vdev->v_state = VDEV_STATE_FAULTED; + else if (is_degraded) + vdev->v_state = VDEV_STATE_DEGRADED; + else + vdev->v_state = VDEV_STATE_HEALTHY; + } else { + is_new = 0; + + if (is_newer) { + /* + * We've already seen this vdev, but from an older + * vdev label, so let's refresh its state from the + * newer label. + */ + if (is_offline) + vdev->v_state = VDEV_STATE_OFFLINE; + else if (is_removed) + vdev->v_state = VDEV_STATE_REMOVED; + else if (is_faulted) + vdev->v_state = VDEV_STATE_FAULTED; + else if (is_degraded) + vdev->v_state = VDEV_STATE_DEGRADED; + else + vdev->v_state = VDEV_STATE_HEALTHY; } } + rc = nvlist_find(nvlist, ZPOOL_CONFIG_CHILDREN, DATA_TYPE_NVLIST_ARRAY, &nkids, &kids); /* @@ -486,10 +526,12 @@ vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t **vdevp) if (rc == 0) { vdev->v_nchildren = nkids; for (i = 0; i < nkids; i++) { - rc = vdev_init_from_nvlist(kids, &kid); + rc = vdev_init_from_nvlist(kids, &kid, is_newer); if (rc) return (rc); - STAILQ_INSERT_TAIL(&vdev->v_children, kid, v_childlink); + if (is_new) + STAILQ_INSERT_TAIL(&vdev->v_children, kid, + v_childlink); kids = nvlist_next(kids); } } else { @@ -591,7 +633,9 @@ state_name(vdev_state_t state) "UNKNOWN", "CLOSED", "OFFLINE", + "REMOVED", "CANT_OPEN", + "FAULTED", "DEGRADED", "ONLINE" }; @@ -709,7 +753,7 @@ vdev_probe(vdev_phys_read_t *read, void *read_priv, spa_t **spap) uint64_t pool_txg, pool_guid; const char *pool_name; const unsigned char *vdevs; - int i, rc; + int i, rc, is_newer; char upbuf[1024]; const struct uberblock *up; @@ -791,12 +835,15 @@ vdev_probe(vdev_phys_read_t *read, void *read_priv, spa_t **spap) spa = spa_create(pool_guid); spa->spa_name = strdup(pool_name); } - if (pool_txg > spa->spa_txg) + if (pool_txg > spa->spa_txg) { spa->spa_txg = pool_txg; + is_newer = 1; + } else + is_newer = 0; /* * Get the vdev tree and create our in-core copy of it. - * If we already have a healthy vdev with this guid, this must + * If we already have a vdev with this guid, this must * be some kind of alias (overlapping slices, dangerously dedicated * disks etc). */ @@ -806,16 +853,16 @@ vdev_probe(vdev_phys_read_t *read, void *read_priv, spa_t **spap) return (EIO); } vdev = vdev_find(guid); - if (vdev && vdev->v_state == VDEV_STATE_HEALTHY) { + if (vdev && vdev->v_phys_read) /* Has this vdev already been inited? */ return (EIO); - } if (nvlist_find(nvlist, ZPOOL_CONFIG_VDEV_TREE, DATA_TYPE_NVLIST, 0, &vdevs)) { return (EIO); } - rc = vdev_init_from_nvlist(vdevs, &top_vdev); + + rc = vdev_init_from_nvlist(vdevs, &top_vdev, is_newer); if (rc) return (rc); @@ -836,7 +883,6 @@ vdev_probe(vdev_phys_read_t *read, void *read_priv, spa_t **spap) if (vdev) { vdev->v_phys_read = read; vdev->v_read_priv = read_priv; - vdev->v_state = VDEV_STATE_HEALTHY; } else { printf("ZFS: inconsistent nvlist contents\n"); return (EIO); @@ -896,6 +942,33 @@ ilog2(int n) return -1; } +static int +zio_read_gang(spa_t *spa, const blkptr_t *bp, const dva_t *dva, void *buf) +{ + zio_gbh_phys_t zio_gb; + vdev_t *vdev; + int vdevid; + off_t offset; + int i; + + vdevid = DVA_GET_VDEV(dva); + offset = DVA_GET_OFFSET(dva); + STAILQ_FOREACH(vdev, &spa->spa_vdevs, v_childlink) + if (vdev->v_id == vdevid) + break; + if (!vdev || !vdev->v_read) + return (EIO); + if (vdev->v_read(vdev, bp, &zio_gb, offset, SPA_GANGBLOCKSIZE)) + return (EIO); + + for (i = 0; i < SPA_GBH_NBLKPTRS; i++) { + if (zio_read(spa, &zio_gb.zg_blkptr[i], buf)) + return (EIO); + } + + return (0); +} + static int zio_read(spa_t *spa, const blkptr_t *bp, void *buf) { @@ -920,20 +993,27 @@ zio_read(spa_t *spa, const blkptr_t *bp, void *buf) if (!dva->dva_word[0] && !dva->dva_word[1]) continue; - vdevid = DVA_GET_VDEV(dva); - offset = DVA_GET_OFFSET(dva); - STAILQ_FOREACH(vdev, &spa->spa_vdevs, v_childlink) - if (vdev->v_id == vdevid) - break; - if (!vdev || !vdev->v_read) - continue; - if (vdev->v_read(vdev, bp, pbuf, offset, psize)) - continue; + if (DVA_GET_GANG(dva)) { + printf("ZFS: gang block detected!\n"); + if (zio_read_gang(spa, bp, dva, buf)) + return (EIO); + } else { + vdevid = DVA_GET_VDEV(dva); + offset = DVA_GET_OFFSET(dva); + STAILQ_FOREACH(vdev, &spa->spa_vdevs, v_childlink) + if (vdev->v_id == vdevid) + break; + if (!vdev || !vdev->v_read) { + continue; + } + if (vdev->v_read(vdev, bp, pbuf, offset, psize)) + continue; - if (cpfunc != ZIO_COMPRESS_OFF) { - if (zio_decompress_data(cpfunc, pbuf, psize, - buf, lsize)) - return (EIO); + if (cpfunc != ZIO_COMPRESS_OFF) { + if (zio_decompress_data(cpfunc, pbuf, psize, + buf, lsize)) + return (EIO); + } } return (0); @@ -1331,13 +1411,13 @@ zfs_mount_dataset(spa_t *spa, uint64_t objnum, objset_phys_t *objset) dsl_dataset_phys_t *ds; if (objset_get_dnode(spa, &spa->spa_mos, objnum, &dataset)) { - printf("ZFS: can't find dataset %lld\n", objnum); + printf("ZFS: can't find dataset %llu\n", objnum); return (EIO); } ds = (dsl_dataset_phys_t *) &dataset.dn_bonus; if (zio_read(spa, &ds->ds_bp, objset)) { - printf("ZFS: can't read object set for dataset %lld\n", objnum); + printf("ZFS: can't read object set for dataset %llu\n", objnum); return (EIO); } @@ -1367,7 +1447,8 @@ zfs_mount_root(spa_t *spa, objset_phys_t *objset) */ if (zap_lookup(spa, &dir, DMU_POOL_PROPS, &props) == 0 && objset_get_dnode(spa, &spa->spa_mos, props, &propdir) == 0 - && zap_lookup(spa, &propdir, "bootfs", &bootfs) == 0) + && zap_lookup(spa, &propdir, "bootfs", &bootfs) == 0 + && bootfs != 0) return zfs_mount_dataset(spa, bootfs, objset); /* @@ -1425,7 +1506,7 @@ zfs_lookup(spa_t *spa, const char *upath, dnode_phys_t *dnode) int symlinks_followed = 0; if (spa->spa_root_objset.os_type != DMU_OST_ZFS) { - printf("ZFS: unexpected object set type %lld\n", + printf("ZFS: unexpected object set type %llu\n", spa->spa_root_objset.os_type); return (EIO); } diff --git a/sys/bsm/audit_kevents.h b/sys/bsm/audit_kevents.h index 495ae2358d58..f4f77a55163b 100644 --- a/sys/bsm/audit_kevents.h +++ b/sys/bsm/audit_kevents.h @@ -598,6 +598,10 @@ #define AUE_FSCTL 43194 /* Darwin. */ #define AUE_FFSCTL 43195 /* Darwin. */ #define AUE_LPATHCONF 43196 /* FreeBSD. */ +#define AUE_PDFORK 43197 /* FreeBSD. */ +#define AUE_PDKILL 43198 /* FreeBSD. */ +#define AUE_PDGETPID 43199 /* FreeBSD. */ +#define AUE_PDWAIT 43200 /* FreeBSD. */ /* * Darwin BSM uses a number of AUE_O_* definitions, which are aliased to the diff --git a/sys/cam/ata/ata_all.c b/sys/cam/ata/ata_all.c index e75c109f7eea..2271747dda01 100644 --- a/sys/cam/ata/ata_all.c +++ b/sys/cam/ata/ata_all.c @@ -68,6 +68,193 @@ ata_version(int ver) return 0; } +char * +ata_op_string(struct ata_cmd *cmd) +{ + + switch (cmd->command) { + case 0x00: return ("NOP"); + case 0x03: return ("CFA_REQUEST_EXTENDED_ERROR"); + case 0x06: + switch (cmd->features) { + case 0x01: return ("DSM TRIM"); + } + return "DSM"; + case 0x08: return ("DEVICE_RESET"); + case 0x20: return ("READ"); + case 0x24: return ("READ48"); + case 0x25: return ("READ_DMA48"); + case 0x26: return ("READ_DMA_QUEUED48"); + case 0x27: return ("READ_NATIVE_MAX_ADDRESS48"); + case 0x29: return ("READ_MUL48"); + case 0x2a: return ("READ_STREAM_DMA48"); + case 0x2b: return ("READ_STREAM48"); + case 0x2f: return ("READ_LOG_EXT"); + case 0x30: return ("WRITE"); + case 0x34: return ("WRITE48"); + case 0x35: return ("WRITE_DMA48"); + case 0x36: return ("WRITE_DMA_QUEUED48"); + case 0x37: return ("SET_MAX_ADDRESS48"); + case 0x39: return ("WRITE_MUL48"); + case 0x3a: return ("WRITE_STREAM_DMA48"); + case 0x3b: return ("WRITE_STREAM48"); + case 0x3d: return ("WRITE_DMA_FUA48"); + case 0x3e: return ("WRITE_DMA_QUEUED_FUA48"); + case 0x3f: return ("WRITE_LOG_EXT"); + case 0x40: return ("READ_VERIFY"); + case 0x42: return ("READ_VERIFY48"); + case 0x51: return ("CONFIGURE_STREAM"); + case 0x60: return ("READ_FPDMA_QUEUED"); + case 0x61: return ("WRITE_FPDMA_QUEUED"); + case 0x70: return ("SEEK"); + case 0x87: return ("CFA_TRANSLATE_SECTOR"); + case 0x90: return ("EXECUTE_DEVICE_DIAGNOSTIC"); + case 0x92: return ("DOWNLOAD_MICROCODE"); + case 0xa0: return ("PACKET"); + case 0xa1: return ("ATAPI_IDENTIFY"); + case 0xa2: return ("SERVICE"); + case 0xb0: return ("SMART"); + case 0xb1: return ("DEVICE CONFIGURATION"); + case 0xc0: return ("CFA_ERASE"); + case 0xc4: return ("READ_MUL"); + case 0xc5: return ("WRITE_MUL"); + case 0xc6: return ("SET_MULTI"); + case 0xc7: return ("READ_DMA_QUEUED"); + case 0xc8: return ("READ_DMA"); + case 0xca: return ("WRITE_DMA"); + case 0xcc: return ("WRITE_DMA_QUEUED"); + case 0xcd: return ("CFA_WRITE_MULTIPLE_WITHOUT_ERASE"); + case 0xce: return ("WRITE_MUL_FUA48"); + case 0xd1: return ("CHECK_MEDIA_CARD_TYPE"); + case 0xda: return ("GET_MEDIA_STATUS"); + case 0xde: return ("MEDIA_LOCK"); + case 0xdf: return ("MEDIA_UNLOCK"); + case 0xe0: return ("STANDBY_IMMEDIATE"); + case 0xe1: return ("IDLE_IMMEDIATE"); + case 0xe2: return ("STANDBY"); + case 0xe3: return ("IDLE"); + case 0xe4: return ("READ_BUFFER/PM"); + case 0xe5: return ("CHECK_POWER_MODE"); + case 0xe6: return ("SLEEP"); + case 0xe7: return ("FLUSHCACHE"); + case 0xe8: return ("WRITE_PM"); + case 0xea: return ("FLUSHCACHE48"); + case 0xec: return ("ATA_IDENTIFY"); + case 0xed: return ("MEDIA_EJECT"); + case 0xef: + switch (cmd->features) { + case 0x03: return ("SETFEATURES SET TRANSFER MODE"); + case 0x02: return ("SETFEATURES ENABLE WCACHE"); + case 0x82: return ("SETFEATURES DISABLE WCACHE"); + case 0x06: return ("SETFEATURES ENABLE PUIS"); + case 0x86: return ("SETFEATURES DISABLE PUIS"); + case 0x07: return ("SETFEATURES SPIN-UP"); + case 0xaa: return ("SETFEATURES ENABLE RCACHE"); + case 0x55: return ("SETFEATURES DISABLE RCACHE"); + } + return "SETFEATURES"; + case 0xf1: return ("SECURITY_SET_PASSWORD"); + case 0xf2: return ("SECURITY_UNLOCK"); + case 0xf3: return ("SECURITY_ERASE_PREPARE"); + case 0xf4: return ("SECURITY_ERASE_UNIT"); + case 0xf5: return ("SECURITY_FREE_LOCK"); + case 0xf6: return ("SECURITY DISABLE PASSWORD"); + case 0xf8: return ("READ_NATIVE_MAX_ADDRESS"); + case 0xf9: return ("SET_MAX_ADDRESS"); + } + return "UNKNOWN"; +} + +char * +ata_cmd_string(struct ata_cmd *cmd, char *cmd_string, size_t len) +{ + + snprintf(cmd_string, len, "%02x %02x %02x %02x " + "%02x %02x %02x %02x %02x %02x %02x %02x", + cmd->command, cmd->features, + cmd->lba_low, cmd->lba_mid, cmd->lba_high, cmd->device, + cmd->lba_low_exp, cmd->lba_mid_exp, cmd->lba_high_exp, + cmd->features_exp, cmd->sector_count, cmd->sector_count_exp); + + return(cmd_string); +} + +char * +ata_res_string(struct ata_res *res, char *res_string, size_t len) +{ + + snprintf(res_string, len, "%02x %02x %02x %02x " + "%02x %02x %02x %02x %02x %02x %02x", + res->status, res->error, + res->lba_low, res->lba_mid, res->lba_high, res->device, + res->lba_low_exp, res->lba_mid_exp, res->lba_high_exp, + res->sector_count, res->sector_count_exp); + + return(res_string); +} + +/* + * ata_command_sbuf() returns 0 for success and -1 for failure. + */ +int +ata_command_sbuf(struct ccb_ataio *ataio, struct sbuf *sb) +{ + char cmd_str[(12 * 3) + 1]; + + sbuf_printf(sb, "%s. ACB: %s", + ata_op_string(&ataio->cmd), + ata_cmd_string(&ataio->cmd, cmd_str, sizeof(cmd_str))); + + return(0); +} + +/* + * ata_status_abuf() returns 0 for success and -1 for failure. + */ +int +ata_status_sbuf(struct ccb_ataio *ataio, struct sbuf *sb) +{ + + sbuf_printf(sb, "ATA status: %02x (%s%s%s%s%s%s%s%s)", + ataio->res.status, + (ataio->res.status & 0x80) ? "BSY " : "", + (ataio->res.status & 0x40) ? "DRDY " : "", + (ataio->res.status & 0x20) ? "DF " : "", + (ataio->res.status & 0x10) ? "SERV " : "", + (ataio->res.status & 0x08) ? "DRQ " : "", + (ataio->res.status & 0x04) ? "CORR " : "", + (ataio->res.status & 0x02) ? "IDX " : "", + (ataio->res.status & 0x01) ? "ERR" : ""); + if (ataio->res.status & 1) { + sbuf_printf(sb, ", error: %02x (%s%s%s%s%s%s%s%s)", + ataio->res.error, + (ataio->res.error & 0x80) ? "ICRC " : "", + (ataio->res.error & 0x40) ? "UNC " : "", + (ataio->res.error & 0x20) ? "MC " : "", + (ataio->res.error & 0x10) ? "IDNF " : "", + (ataio->res.error & 0x08) ? "MCR " : "", + (ataio->res.error & 0x04) ? "ABRT " : "", + (ataio->res.error & 0x02) ? "NM " : "", + (ataio->res.error & 0x01) ? "ILI" : ""); + } + + return(0); +} + +/* + * ata_res_sbuf() returns 0 for success and -1 for failure. + */ +int +ata_res_sbuf(struct ccb_ataio *ataio, struct sbuf *sb) +{ + char res_str[(11 * 3) + 1]; + + sbuf_printf(sb, "RES: %s", + ata_res_string(&ataio->res, res_str, sizeof(res_str))); + + return(0); +} + void ata_print_ident(struct ata_params *ident_data) { @@ -77,10 +264,14 @@ ata_print_ident(struct ata_params *ident_data) sizeof(product)); cam_strvis(revision, ident_data->revision, sizeof(ident_data->revision), sizeof(revision)); - printf("<%s %s> ATA/ATAPI-%d", - product, revision, ata_version(ident_data->version_major)); + printf("<%s %s> %s-%d", + product, revision, + (ident_data->config & ATA_PROTO_ATAPI) ? "ATAPI" : "ATA", + ata_version(ident_data->version_major)); if (ident_data->satacapabilities && ident_data->satacapabilities != 0xffff) { - if (ident_data->satacapabilities & ATA_SATA_GEN2) + if (ident_data->satacapabilities & ATA_SATA_GEN3) + printf(" SATA 3.x"); + else if (ident_data->satacapabilities & ATA_SATA_GEN2) printf(" SATA 2.x"); else if (ident_data->satacapabilities & ATA_SATA_GEN1) printf(" SATA 1.x"); @@ -90,12 +281,49 @@ ata_print_ident(struct ata_params *ident_data) printf(" device\n"); } +uint32_t +ata_logical_sector_size(struct ata_params *ident_data) +{ + if ((ident_data->pss & 0xc000) == 0x4000 && + (ident_data->pss & ATA_PSS_LSSABOVE512)) { + return ((u_int32_t)ident_data->lss_1 | + ((u_int32_t)ident_data->lss_2 << 16)); + } + return (512); +} + +uint64_t +ata_physical_sector_size(struct ata_params *ident_data) +{ + if ((ident_data->pss & 0xc000) == 0x4000 && + (ident_data->pss & ATA_PSS_MULTLS)) { + return ((uint64_t)ata_logical_sector_size(ident_data) * + (1 << (ident_data->pss & ATA_PSS_LSPPS))); + } + return (512); +} + +uint64_t +ata_logical_sector_offset(struct ata_params *ident_data) +{ + if ((ident_data->lsalign & 0xc000) == 0x4000) { + return ((uint64_t)ata_logical_sector_size(ident_data) * + (ident_data->lsalign & 0x3fff)); + } + return (0); +} + void ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features, uint32_t lba, uint8_t sector_count) { bzero(&ataio->cmd, sizeof(ataio->cmd)); ataio->cmd.flags = 0; + if (cmd == ATA_READ_DMA || + cmd == ATA_READ_DMA_QUEUED || + cmd == ATA_WRITE_DMA || + cmd == ATA_WRITE_DMA_QUEUED) + ataio->cmd.flags |= CAM_ATAIO_DMA; ataio->cmd.command = cmd; ataio->cmd.features = features; ataio->cmd.lba_low = lba; @@ -111,6 +339,16 @@ ata_48bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint16_t features, { bzero(&ataio->cmd, sizeof(ataio->cmd)); ataio->cmd.flags = CAM_ATAIO_48BIT; + if (cmd == ATA_READ_DMA48 || + cmd == ATA_READ_DMA_QUEUED48 || + cmd == ATA_READ_STREAM_DMA48 || + cmd == ATA_WRITE_DMA48 || + cmd == ATA_WRITE_DMA_FUA48 || + cmd == ATA_WRITE_DMA_QUEUED48 || + cmd == ATA_WRITE_DMA_QUEUED_FUA48 || + cmd == ATA_WRITE_STREAM_DMA48 || + cmd == ATA_DATA_SET_MANAGEMENT) + ataio->cmd.flags |= CAM_ATAIO_DMA; ataio->cmd.command = cmd; ataio->cmd.features = features; ataio->cmd.lba_low = lba; @@ -155,30 +393,24 @@ void ata_pm_read_cmd(struct ccb_ataio *ataio, int reg, int port) { bzero(&ataio->cmd, sizeof(ataio->cmd)); - ataio->cmd.flags = CAM_ATAIO_48BIT | CAM_ATAIO_NEEDRESULT; + ataio->cmd.flags = CAM_ATAIO_NEEDRESULT; ataio->cmd.command = ATA_READ_PM; ataio->cmd.features = reg; - ataio->cmd.features_exp = reg >> 8; ataio->cmd.device = port & 0x0f; } void -ata_pm_write_cmd(struct ccb_ataio *ataio, int reg, int port, uint64_t val) +ata_pm_write_cmd(struct ccb_ataio *ataio, int reg, int port, uint32_t val) { bzero(&ataio->cmd, sizeof(ataio->cmd)); - ataio->cmd.flags = CAM_ATAIO_48BIT | CAM_ATAIO_NEEDRESULT; + ataio->cmd.flags = 0; ataio->cmd.command = ATA_WRITE_PM; ataio->cmd.features = reg; + ataio->cmd.sector_count = val; ataio->cmd.lba_low = val >> 8; ataio->cmd.lba_mid = val >> 16; ataio->cmd.lba_high = val >> 24; ataio->cmd.device = port & 0x0f; - ataio->cmd.lba_low_exp = val >> 40; - ataio->cmd.lba_mid_exp = val >> 48; - ataio->cmd.lba_high_exp = val >> 56; - ataio->cmd.features_exp = reg >> 8; - ataio->cmd.sector_count = val; - ataio->cmd.sector_count_exp = val >> 32; } void @@ -284,21 +516,177 @@ ata_max_umode(struct ata_params *ap) } int -ata_max_mode(struct ata_params *ap, int mode, int maxmode) +ata_max_mode(struct ata_params *ap, int maxmode) { - if (maxmode && mode > maxmode) - mode = maxmode; - - if (mode >= ATA_UDMA0 && ata_max_umode(ap) > 0) - return (min(mode, ata_max_umode(ap))); - - if (mode >= ATA_WDMA0 && ata_max_wmode(ap) > 0) - return (min(mode, ata_max_wmode(ap))); - - if (mode > ata_max_pmode(ap)) - return (min(mode, ata_max_pmode(ap))); - - return (mode); + if (maxmode == 0) + maxmode = ATA_DMA_MAX; + if (maxmode >= ATA_UDMA0 && ata_max_umode(ap) > 0) + return (min(maxmode, ata_max_umode(ap))); + if (maxmode >= ATA_WDMA0 && ata_max_wmode(ap) > 0) + return (min(maxmode, ata_max_wmode(ap))); + return (min(maxmode, ata_max_pmode(ap))); } +char * +ata_mode2string(int mode) +{ + switch (mode) { + case -1: return "UNSUPPORTED"; + case 0: return "NONE"; + case ATA_PIO0: return "PIO0"; + case ATA_PIO1: return "PIO1"; + case ATA_PIO2: return "PIO2"; + case ATA_PIO3: return "PIO3"; + case ATA_PIO4: return "PIO4"; + case ATA_WDMA0: return "WDMA0"; + case ATA_WDMA1: return "WDMA1"; + case ATA_WDMA2: return "WDMA2"; + case ATA_UDMA0: return "UDMA0"; + case ATA_UDMA1: return "UDMA1"; + case ATA_UDMA2: return "UDMA2"; + case ATA_UDMA3: return "UDMA3"; + case ATA_UDMA4: return "UDMA4"; + case ATA_UDMA5: return "UDMA5"; + case ATA_UDMA6: return "UDMA6"; + default: + if (mode & ATA_DMA_MASK) + return "BIOSDMA"; + else + return "BIOSPIO"; + } +} + +int +ata_string2mode(char *str) +{ + if (!strcasecmp(str, "PIO0")) return (ATA_PIO0); + if (!strcasecmp(str, "PIO1")) return (ATA_PIO1); + if (!strcasecmp(str, "PIO2")) return (ATA_PIO2); + if (!strcasecmp(str, "PIO3")) return (ATA_PIO3); + if (!strcasecmp(str, "PIO4")) return (ATA_PIO4); + if (!strcasecmp(str, "WDMA0")) return (ATA_WDMA0); + if (!strcasecmp(str, "WDMA1")) return (ATA_WDMA1); + if (!strcasecmp(str, "WDMA2")) return (ATA_WDMA2); + if (!strcasecmp(str, "UDMA0")) return (ATA_UDMA0); + if (!strcasecmp(str, "UDMA16")) return (ATA_UDMA0); + if (!strcasecmp(str, "UDMA1")) return (ATA_UDMA1); + if (!strcasecmp(str, "UDMA25")) return (ATA_UDMA1); + if (!strcasecmp(str, "UDMA2")) return (ATA_UDMA2); + if (!strcasecmp(str, "UDMA33")) return (ATA_UDMA2); + if (!strcasecmp(str, "UDMA3")) return (ATA_UDMA3); + if (!strcasecmp(str, "UDMA44")) return (ATA_UDMA3); + if (!strcasecmp(str, "UDMA4")) return (ATA_UDMA4); + if (!strcasecmp(str, "UDMA66")) return (ATA_UDMA4); + if (!strcasecmp(str, "UDMA5")) return (ATA_UDMA5); + if (!strcasecmp(str, "UDMA100")) return (ATA_UDMA5); + if (!strcasecmp(str, "UDMA6")) return (ATA_UDMA6); + if (!strcasecmp(str, "UDMA133")) return (ATA_UDMA6); + return (-1); +} + + +u_int +ata_mode2speed(int mode) +{ + switch (mode) { + case ATA_PIO0: + default: + return (3300); + case ATA_PIO1: + return (5200); + case ATA_PIO2: + return (8300); + case ATA_PIO3: + return (11100); + case ATA_PIO4: + return (16700); + case ATA_WDMA0: + return (4200); + case ATA_WDMA1: + return (13300); + case ATA_WDMA2: + return (16700); + case ATA_UDMA0: + return (16700); + case ATA_UDMA1: + return (25000); + case ATA_UDMA2: + return (33300); + case ATA_UDMA3: + return (44400); + case ATA_UDMA4: + return (66700); + case ATA_UDMA5: + return (100000); + case ATA_UDMA6: + return (133000); + } +} + +u_int +ata_revision2speed(int revision) +{ + switch (revision) { + case 1: + default: + return (150000); + case 2: + return (300000); + case 3: + return (600000); + } +} + +int +ata_speed2revision(u_int speed) +{ + switch (speed) { + case 0: + return (0); + case 150000: + return (1); + case 300000: + return (2); + case 600000: + return (3); + default: + return (-1); + } +} + +int +ata_identify_match(caddr_t identbuffer, caddr_t table_entry) +{ + struct scsi_inquiry_pattern *entry; + struct ata_params *ident; + + entry = (struct scsi_inquiry_pattern *)table_entry; + ident = (struct ata_params *)identbuffer; + + if ((cam_strmatch(ident->model, entry->product, + sizeof(ident->model)) == 0) + && (cam_strmatch(ident->revision, entry->revision, + sizeof(ident->revision)) == 0)) { + return (0); + } + return (-1); +} + +int +ata_static_identify_match(caddr_t identbuffer, caddr_t table_entry) +{ + struct scsi_static_inquiry_pattern *entry; + struct ata_params *ident; + + entry = (struct scsi_static_inquiry_pattern *)table_entry; + ident = (struct ata_params *)identbuffer; + + if ((cam_strmatch(ident->model, entry->product, + sizeof(ident->model)) == 0) + && (cam_strmatch(ident->revision, entry->revision, + sizeof(ident->revision)) == 0)) { + return (0); + } + return (-1); +} diff --git a/sys/cam/ata/ata_all.h b/sys/cam/ata/ata_all.h index 748035f86021..2e838fdc7b40 100644 --- a/sys/cam/ata/ata_all.h +++ b/sys/cam/ata/ata_all.h @@ -41,6 +41,7 @@ struct ata_cmd { #define CAM_ATAIO_FPDMA 0x02 /* FPDMA command */ #define CAM_ATAIO_CONTROL 0x04 /* Control, not a command */ #define CAM_ATAIO_NEEDRESULT 0x08 /* Request requires result. */ +#define CAM_ATAIO_DMA 0x10 /* DMA command */ u_int8_t command; u_int8_t features; @@ -81,8 +82,20 @@ struct ata_res { }; int ata_version(int ver); + +char * ata_op_string(struct ata_cmd *cmd); +char * ata_cmd_string(struct ata_cmd *cmd, char *cmd_string, size_t len); +char * ata_res_string(struct ata_res *res, char *res_string, size_t len); +int ata_command_sbuf(struct ccb_ataio *ataio, struct sbuf *sb); +int ata_status_sbuf(struct ccb_ataio *ataio, struct sbuf *sb); +int ata_res_sbuf(struct ccb_ataio *ataio, struct sbuf *sb); + void ata_print_ident(struct ata_params *ident_data); +uint32_t ata_logical_sector_size(struct ata_params *ident_data); +uint64_t ata_physical_sector_size(struct ata_params *ident_data); +uint64_t ata_logical_sector_offset(struct ata_params *ident_data); + void ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features, uint32_t lba, uint8_t sector_count); void ata_48bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint16_t features, @@ -91,7 +104,7 @@ void ata_ncq_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint64_t lba, uint16_t sector_count); void ata_reset_cmd(struct ccb_ataio *ataio); void ata_pm_read_cmd(struct ccb_ataio *ataio, int reg, int port); -void ata_pm_write_cmd(struct ccb_ataio *ataio, int reg, int port, uint64_t val); +void ata_pm_write_cmd(struct ccb_ataio *ataio, int reg, int port, uint32_t val); void ata_bswap(int8_t *buf, int len); void ata_btrim(int8_t *buf, int len); @@ -100,6 +113,15 @@ void ata_bpack(int8_t *src, int8_t *dst, int len); int ata_max_pmode(struct ata_params *ap); int ata_max_wmode(struct ata_params *ap); int ata_max_umode(struct ata_params *ap); -int ata_max_mode(struct ata_params *ap, int mode, int maxmode); +int ata_max_mode(struct ata_params *ap, int maxmode); + +char * ata_mode2string(int mode); +int ata_string2mode(char *str); +u_int ata_mode2speed(int mode); +u_int ata_revision2speed(int revision); +int ata_speed2revision(u_int speed); + +int ata_identify_match(caddr_t identbuffer, caddr_t table_entry); +int ata_static_identify_match(caddr_t identbuffer, caddr_t table_entry); #endif diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c index 7d7230b154f1..6cb4f2e55091 100644 --- a/sys/cam/ata/ata_da.c +++ b/sys/cam/ata/ata_da.c @@ -70,30 +70,26 @@ typedef enum { ADA_FLAG_PACK_INVALID = 0x001, ADA_FLAG_CAN_48BIT = 0x002, ADA_FLAG_CAN_FLUSHCACHE = 0x004, - ADA_FLAG_CAN_NCQ = 0x008, - ADA_FLAG_TAGGED_QUEUING = 0x010, + ADA_FLAG_CAN_NCQ = 0x008, + ADA_FLAG_CAN_DMA = 0x010, ADA_FLAG_NEED_OTAG = 0x020, ADA_FLAG_WENT_IDLE = 0x040, - ADA_FLAG_RETRY_UA = 0x080, + ADA_FLAG_CAN_TRIM = 0x080, ADA_FLAG_OPEN = 0x100, - ADA_FLAG_SCTX_INIT = 0x200 + ADA_FLAG_SCTX_INIT = 0x200, + ADA_FLAG_CAN_CFA = 0x400 } ada_flags; typedef enum { - ADA_Q_NONE = 0x00, - ADA_Q_NO_SYNC_CACHE = 0x01, - ADA_Q_NO_6_BYTE = 0x02, - ADA_Q_NO_PREVENT = 0x04 + ADA_Q_NONE = 0x00 } ada_quirks; typedef enum { - ADA_CCB_PROBE = 0x01, - ADA_CCB_PROBE2 = 0x02, ADA_CCB_BUFFER_IO = 0x03, ADA_CCB_WAITING = 0x04, ADA_CCB_DUMP = 0x05, + ADA_CCB_TRIM = 0x06, ADA_CCB_TYPE_MASK = 0x0F, - ADA_CCB_RETRY_UA = 0x10 } ada_ccb_state; /* Offsets into our private area for storing information */ @@ -102,28 +98,36 @@ typedef enum { struct disk_params { u_int8_t heads; - u_int32_t cylinders; u_int8_t secs_per_track; - u_int32_t secsize; /* Number of bytes/sector */ - u_int64_t sectors; /* total number sectors */ + u_int32_t cylinders; + u_int32_t secsize; /* Number of bytes/logical sector */ + u_int64_t sectors; /* Total number sectors */ +}; + +#define TRIM_MAX_BLOCKS 4 +#define TRIM_MAX_RANGES TRIM_MAX_BLOCKS * 64 +struct trim_request { + uint8_t data[TRIM_MAX_RANGES * 8]; + struct bio *bps[TRIM_MAX_RANGES]; }; struct ada_softc { struct bio_queue_head bio_queue; - SLIST_ENTRY(ada_softc) links; - LIST_HEAD(, ccb_hdr) pending_ccbs; + struct bio_queue_head trim_queue; ada_state state; ada_flags flags; ada_quirks quirks; int ordered_tag_count; int outstanding_cmds; + int trim_max_ranges; + int trim_running; struct disk_params params; struct disk *disk; - union ccb saved_ccb; struct task sysctl_task; struct sysctl_ctx_list sysctl_ctx; struct sysctl_oid *sysctl_tree; struct callout sendordered_c; + struct trim_request trim_req; }; struct ada_quirk_entry { @@ -131,9 +135,17 @@ struct ada_quirk_entry { ada_quirks quirks; }; -//static struct ada_quirk_entry ada_quirk_table[] = -//{ -//}; +static struct ada_quirk_entry ada_quirk_table[] = +{ + { + /* Default */ + { + T_ANY, SIP_MEDIA_REMOVABLE|SIP_MEDIA_FIXED, + /*vendor*/"*", /*product*/"*", /*revision*/"*" + }, + /*quirks*/0 + }, +}; static disk_strategy_t adastrategy; static dumper_t adadump; @@ -149,7 +161,7 @@ static void adadone(struct cam_periph *periph, union ccb *done_ccb); static int adaerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags); -static void adasetgeom(struct cam_periph *periph, +static void adagetparams(struct cam_periph *periph, struct ccb_getdev *cgd); static timeout_t adasendorderedtag; static void adashutdown(void *arg, int howto); @@ -274,7 +286,7 @@ adaclose(struct disk *dp) /* We only sync the cache if the drive is capable of it. */ if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) { - ccb = cam_periph_getccb(periph, /*priority*/1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); cam_fill_ataio(&ccb->ataio, 1, adadone, @@ -289,8 +301,7 @@ adaclose(struct disk *dp) else ata_28bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0); cam_periph_runccb(ccb, /*error_routine*/NULL, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA, - softc->disk->d_devstat); + /*sense_flags*/0, softc->disk->d_devstat); if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) xpt_print(periph->path, "Synchronize cache failed\n"); @@ -311,6 +322,18 @@ adaclose(struct disk *dp) return (0); } +static void +adaschedule(struct cam_periph *periph) +{ + struct ada_softc *softc = (struct ada_softc *)periph->softc; + + if (bioq_first(&softc->bio_queue) || + (!softc->trim_running && bioq_first(&softc->trim_queue))) { + /* Have more work to do, so ensure we stay scheduled */ + xpt_schedule(periph, CAM_PRIORITY_NORMAL); + } +} + /* * Actually translate the requested transfer into one the physical driver * can understand. The transfer is described by a buf and will include @@ -331,19 +354,6 @@ adastrategy(struct bio *bp) cam_periph_lock(periph); -#if 0 - /* - * check it's not too big a transfer for our adapter - */ - scsi_minphys(bp,&sd_switch); -#endif - - /* - * Mask interrupts so that the pack cannot be invalidated until - * after we are in the queue. Otherwise, we might not properly - * clean up one of the buffers. - */ - /* * If the device has been made invalid, error out */ @@ -356,12 +366,16 @@ adastrategy(struct bio *bp) /* * Place it in the queue of disk activities for this disk */ - bioq_disksort(&softc->bio_queue, bp); + if (bp->bio_cmd == BIO_DELETE && + (softc->flags & ADA_FLAG_CAN_TRIM)) + bioq_disksort(&softc->trim_queue, bp); + else + bioq_disksort(&softc->bio_queue, bp); /* * Schedule ourselves for performing the work. */ - xpt_schedule(periph, /* XXX priority */1); + adaschedule(periph); cam_periph_unlock(periph); return; @@ -394,8 +408,7 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len } if (length > 0) { - periph->flags |= CAM_PERIPH_POLLED; - xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccb.ccb_h.ccb_state = ADA_CCB_DUMP; cam_fill_ataio(&ccb.ataio, 0, @@ -426,7 +439,7 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len } if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) { - xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccb.ccb_h.ccb_state = ADA_CCB_DUMP; cam_fill_ataio(&ccb.ataio, @@ -454,7 +467,6 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len /*timeout*/0, /*getcount_only*/0); } - periph->flags &= ~CAM_PERIPH_POLLED; cam_periph_unlock(periph); return (0); } @@ -502,6 +514,7 @@ adaoninvalidate(struct cam_periph *periph) * with XPT_ABORT_CCB. */ bioq_flush(&softc->bio_queue, NULL, ENXIO); + bioq_flush(&softc->trim_queue, NULL, ENXIO); disk_gone(softc->disk); xpt_print(periph->path, "lost device\n"); @@ -551,11 +564,6 @@ adaasync(void *callback_arg, u_int32_t code, if (cgd->protocol != PROTO_ATA) break; -// if (SID_TYPE(&cgd->inq_data) != T_DIRECT -// && SID_TYPE(&cgd->inq_data) != T_RBC -// && SID_TYPE(&cgd->inq_data) != T_OPTICAL) -// break; - /* * Allocate a peripheral instance for * this device and start the probe @@ -573,22 +581,6 @@ adaasync(void *callback_arg, u_int32_t code, "due to status 0x%x\n", status); break; } - case AC_SENT_BDR: - case AC_BUS_RESET: - { - struct ada_softc *softc; - struct ccb_hdr *ccbh; - - softc = (struct ada_softc *)periph->softc; - /* - * Don't fail on the expected unit attention - * that will occur. - */ - softc->flags |= ADA_FLAG_RETRY_UA; - LIST_FOREACH(ccbh, &softc->pending_ccbs, periph_links.le) - ccbh->ccb_state |= ADA_CCB_RETRY_UA; - /* FALLTHROUGH*/ - } default: cam_periph_async(periph, code, path, arg); break; @@ -651,35 +643,44 @@ adaregister(struct cam_periph *periph, void *arg) if (softc == NULL) { printf("adaregister: Unable to probe new device. " - "Unable to allocate softc\n"); + "Unable to allocate softc\n"); return(CAM_REQ_CMP_ERR); } - LIST_INIT(&softc->pending_ccbs); - softc->state = ADA_STATE_NORMAL; bioq_init(&softc->bio_queue); + bioq_init(&softc->trim_queue); + if (cgd->ident_data.capabilities1 & ATA_SUPPORT_DMA) + softc->flags |= ADA_FLAG_CAN_DMA; if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) softc->flags |= ADA_FLAG_CAN_48BIT; if (cgd->ident_data.support.command2 & ATA_SUPPORT_FLUSHCACHE) softc->flags |= ADA_FLAG_CAN_FLUSHCACHE; if (cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ && - cgd->ident_data.queue >= 31) + cgd->inq_flags & SID_CmdQue) softc->flags |= ADA_FLAG_CAN_NCQ; -// if ((cgd->inq_data.flags & SID_CmdQue) != 0) -// softc->flags |= ADA_FLAG_TAGGED_QUEUING; + if (cgd->ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) { + softc->flags |= ADA_FLAG_CAN_TRIM; + softc->trim_max_ranges = TRIM_MAX_RANGES; + if (cgd->ident_data.max_dsm_blocks != 0) { + softc->trim_max_ranges = + min(cgd->ident_data.max_dsm_blocks * 64, + softc->trim_max_ranges); + } + } + if (cgd->ident_data.support.command2 & ATA_SUPPORT_CFA) + softc->flags |= ADA_FLAG_CAN_CFA; + softc->state = ADA_STATE_NORMAL; periph->softc = softc; /* * See if this device has any quirks. */ -// match = cam_quirkmatch((caddr_t)&cgd->inq_data, -// (caddr_t)ada_quirk_table, -// sizeof(ada_quirk_table)/sizeof(*ada_quirk_table), -// sizeof(*ada_quirk_table), scsi_inquiry_match); - match = NULL; - + match = cam_quirkmatch((caddr_t)&cgd->ident_data, + (caddr_t)ada_quirk_table, + sizeof(ada_quirk_table)/sizeof(*ada_quirk_table), + sizeof(*ada_quirk_table), ata_identify_match); if (match != NULL) softc->quirks = ((struct ada_quirk_entry *)match)->quirks; else @@ -687,7 +688,7 @@ adaregister(struct cam_periph *periph, void *arg) /* Check if the SIM does not want queued commands */ bzero(&cpi, sizeof(cpi)); - xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); if (cpi.ccb_h.status != CAM_REQ_CMP || @@ -700,6 +701,7 @@ adaregister(struct cam_periph *periph, void *arg) * Register this media as a disk */ mtx_unlock(periph->sim->mtx); + adagetparams(periph, cgd); softc->disk = disk_alloc(); softc->disk->d_open = adaopen; softc->disk->d_close = adaclose; @@ -712,24 +714,36 @@ adaregister(struct cam_periph *periph, void *arg) maxio = DFLTPHYS; /* traditional default */ else if (maxio > MAXPHYS) maxio = MAXPHYS; /* for safety */ - if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) - maxio = min(maxio, 65535 * 512); + if (softc->flags & ADA_FLAG_CAN_48BIT) + maxio = min(maxio, 65536 * softc->params.secsize); else /* 28bit ATA command limit */ - maxio = min(maxio, 255 * 512); + maxio = min(maxio, 256 * softc->params.secsize); softc->disk->d_maxsize = maxio; softc->disk->d_unit = periph->unit_number; softc->disk->d_flags = 0; if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE; + if ((softc->flags & ADA_FLAG_CAN_TRIM) || + ((softc->flags & ADA_FLAG_CAN_CFA) && + !(softc->flags & ADA_FLAG_CAN_48BIT))) + softc->disk->d_flags |= DISKFLAG_CANDELETE; + strlcpy(softc->disk->d_ident, cgd->serial_num, + MIN(sizeof(softc->disk->d_ident), cgd->serial_num_len + 1)); - adasetgeom(periph, cgd); softc->disk->d_sectorsize = softc->params.secsize; - softc->disk->d_mediasize = softc->params.secsize * (off_t)softc->params.sectors; + softc->disk->d_mediasize = (off_t)softc->params.sectors * + softc->params.secsize; + if (ata_physical_sector_size(&cgd->ident_data) != + softc->params.secsize) { + softc->disk->d_stripesize = + ata_physical_sector_size(&cgd->ident_data); + softc->disk->d_stripeoffset = (softc->disk->d_stripesize - + ata_logical_sector_offset(&cgd->ident_data)) % + softc->disk->d_stripesize; + } /* XXX: these are not actually "firmware" values, so they may be wrong */ softc->disk->d_fwsectors = softc->params.secs_per_track; softc->disk->d_fwheads = softc->params.heads; -// softc->disk->d_devstat->block_size = softc->params.secsize; -// softc->disk->d_devstat->flags &= ~DEVSTAT_BS_UNAVAILABLE; disk_create(softc->disk, DISK_VERSION); mtx_lock(periph->sim->mtx); @@ -743,11 +757,6 @@ adaregister(struct cam_periph *periph, void *arg) dp->secsize, dp->heads, dp->secs_per_track, dp->cylinders); xpt_announce_periph(periph, announce_buf); - if (softc->flags & ADA_FLAG_CAN_NCQ) { - printf("%s%d: Native Command Queueing enabled\n", - periph->periph_name, periph->unit_number); - } - /* * Add async callbacks for bus reset and * bus device reset calls. I don't bother @@ -756,17 +765,9 @@ adaregister(struct cam_periph *periph, void *arg) * them and the only alternative would be to * not attach the device on failure. */ - xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE, + xpt_register_async(AC_LOST_DEVICE, adaasync, periph, periph->path); - /* - * Take an exclusive refcount on the periph while adastart is called - * to finish the probe. The reference will be dropped in adadone at - * the end of probe. - */ -// (void)cam_periph_hold(periph, PRIBIO); -// xpt_schedule(periph, /*priority*/5); - /* * Schedule a periodic event to occasionally send an * ordered tag to a device. @@ -782,20 +783,16 @@ adaregister(struct cam_periph *periph, void *arg) static void adastart(struct cam_periph *periph, union ccb *start_ccb) { - struct ada_softc *softc; - - softc = (struct ada_softc *)periph->softc; + struct ada_softc *softc = (struct ada_softc *)periph->softc; + struct ccb_ataio *ataio = &start_ccb->ataio; switch (softc->state) { case ADA_STATE_NORMAL: { - /* Pull a buffer from the queue and get going on it */ struct bio *bp; + u_int8_t tag_code; - /* - * See if there is a buf with work for us to do.. - */ - bp = bioq_first(&softc->bio_queue); + /* Execute immediate CCB if waiting. */ if (periph->immediate_priority <= periph->pinfo.priority) { CAM_DEBUG_PRINT(CAM_DEBUG_SUBTRACE, ("queuing for immediate ccb\n")); @@ -804,49 +801,106 @@ adastart(struct cam_periph *periph, union ccb *start_ccb) periph_links.sle); periph->immediate_priority = CAM_PRIORITY_NONE; wakeup(&periph->ccb_list); - } else if (bp == NULL) { + /* Have more work to do, so ensure we stay scheduled */ + adaschedule(periph); + break; + } + /* Run TRIM if not running yet. */ + if (!softc->trim_running && + (bp = bioq_first(&softc->trim_queue)) != 0) { + struct trim_request *req = &softc->trim_req; + struct bio *bp1; + int bps = 0, ranges = 0; + + softc->trim_running = 1; + bzero(req, sizeof(*req)); + bp1 = bp; + do { + uint64_t lba = bp1->bio_pblkno; + int count = bp1->bio_bcount / + softc->params.secsize; + + bioq_remove(&softc->trim_queue, bp1); + while (count > 0) { + int c = min(count, 0xffff); + int off = ranges * 8; + + req->data[off + 0] = lba & 0xff; + req->data[off + 1] = (lba >> 8) & 0xff; + req->data[off + 2] = (lba >> 16) & 0xff; + req->data[off + 3] = (lba >> 24) & 0xff; + req->data[off + 4] = (lba >> 32) & 0xff; + req->data[off + 5] = (lba >> 40) & 0xff; + req->data[off + 6] = c & 0xff; + req->data[off + 7] = (c >> 8) & 0xff; + lba += c; + count -= c; + ranges++; + } + req->bps[bps++] = bp1; + bp1 = bioq_first(&softc->trim_queue); + if (bp1 == NULL || + bp1->bio_bcount / softc->params.secsize > + (softc->trim_max_ranges - ranges) * 0xffff) + break; + } while (1); + cam_fill_ataio(ataio, + ada_retry_count, + adadone, + CAM_DIR_OUT, + 0, + req->data, + ((ranges + 63) / 64) * 512, + ada_default_timeout * 1000); + ata_48bit_cmd(ataio, ATA_DATA_SET_MANAGEMENT, + ATA_DSM_TRIM, 0, (ranges + 63) / 64); + start_ccb->ccb_h.ccb_state = ADA_CCB_TRIM; + goto out; + } + /* Run regular command. */ + bp = bioq_first(&softc->bio_queue); + if (bp == NULL) { xpt_release_ccb(start_ccb); + break; + } + bioq_remove(&softc->bio_queue, bp); + + if ((softc->flags & ADA_FLAG_NEED_OTAG) != 0) { + softc->flags &= ~ADA_FLAG_NEED_OTAG; + softc->ordered_tag_count++; + tag_code = 0; } else { - struct ccb_ataio *ataio = &start_ccb->ataio; - u_int8_t tag_code; + tag_code = 1; + } + switch (bp->bio_cmd) { + case BIO_READ: + case BIO_WRITE: + { + uint64_t lba = bp->bio_pblkno; + uint16_t count = bp->bio_bcount / softc->params.secsize; - bioq_remove(&softc->bio_queue, bp); + cam_fill_ataio(ataio, + ada_retry_count, + adadone, + bp->bio_cmd == BIO_READ ? + CAM_DIR_IN : CAM_DIR_OUT, + tag_code, + bp->bio_data, + bp->bio_bcount, + ada_default_timeout*1000); - if ((softc->flags & ADA_FLAG_NEED_OTAG) != 0) { - softc->flags &= ~ADA_FLAG_NEED_OTAG; - softc->ordered_tag_count++; - tag_code = 0;//MSG_ORDERED_Q_TAG; - } else { - tag_code = 0;//MSG_SIMPLE_Q_TAG; - } - switch (bp->bio_cmd) { - case BIO_READ: - case BIO_WRITE: - { - uint64_t lba = bp->bio_pblkno; - uint16_t count = bp->bio_bcount / softc->params.secsize; - - cam_fill_ataio(ataio, - ada_retry_count, - adadone, - bp->bio_cmd == BIO_READ ? - CAM_DIR_IN : CAM_DIR_OUT, - tag_code, - bp->bio_data, - bp->bio_bcount, - ada_default_timeout*1000); - - if (softc->flags & ADA_FLAG_CAN_NCQ) { - if (bp->bio_cmd == BIO_READ) { - ata_ncq_cmd(ataio, ATA_READ_FPDMA_QUEUED, - lba, count); - } else { - ata_ncq_cmd(ataio, ATA_WRITE_FPDMA_QUEUED, - lba, count); - } - } else if ((softc->flags & ADA_FLAG_CAN_48BIT) && - (lba + count >= ATA_MAX_28BIT_LBA || - count >= 256)) { + if ((softc->flags & ADA_FLAG_CAN_NCQ) && tag_code) { + if (bp->bio_cmd == BIO_READ) { + ata_ncq_cmd(ataio, ATA_READ_FPDMA_QUEUED, + lba, count); + } else { + ata_ncq_cmd(ataio, ATA_WRITE_FPDMA_QUEUED, + lba, count); + } + } else if ((softc->flags & ADA_FLAG_CAN_48BIT) && + (lba + count >= ATA_MAX_28BIT_LBA || + count > 256)) { + if (softc->flags & ADA_FLAG_CAN_DMA) { if (bp->bio_cmd == BIO_READ) { ata_48bit_cmd(ataio, ATA_READ_DMA48, 0, lba, count); @@ -855,6 +909,18 @@ adastart(struct cam_periph *periph, union ccb *start_ccb) 0, lba, count); } } else { + if (bp->bio_cmd == BIO_READ) { + ata_48bit_cmd(ataio, ATA_READ_MUL48, + 0, lba, count); + } else { + ata_48bit_cmd(ataio, ATA_WRITE_MUL48, + 0, lba, count); + } + } + } else { + if (count == 256) + count = 0; + if (softc->flags & ADA_FLAG_CAN_DMA) { if (bp->bio_cmd == BIO_READ) { ata_28bit_cmd(ataio, ATA_READ_DMA, 0, lba, count); @@ -862,51 +928,61 @@ adastart(struct cam_periph *periph, union ccb *start_ccb) ata_28bit_cmd(ataio, ATA_WRITE_DMA, 0, lba, count); } + } else { + if (bp->bio_cmd == BIO_READ) { + ata_28bit_cmd(ataio, ATA_READ_MUL, + 0, lba, count); + } else { + ata_28bit_cmd(ataio, ATA_WRITE_MUL, + 0, lba, count); + } } } - break; - case BIO_FLUSH: - cam_fill_ataio(ataio, - 1, - adadone, - CAM_DIR_NONE, - tag_code, - NULL, - 0, - ada_default_timeout*1000); - - if (softc->flags & ADA_FLAG_CAN_48BIT) - ata_48bit_cmd(ataio, ATA_FLUSHCACHE48, 0, 0, 0); - else - ata_28bit_cmd(ataio, ATA_FLUSHCACHE, 0, 0, 0); - break; - } - start_ccb->ccb_h.ccb_state = ADA_CCB_BUFFER_IO; - - /* - * Block out any asyncronous callbacks - * while we touch the pending ccb list. - */ - LIST_INSERT_HEAD(&softc->pending_ccbs, - &start_ccb->ccb_h, periph_links.le); - softc->outstanding_cmds++; - - /* We expect a unit attention from this device */ - if ((softc->flags & ADA_FLAG_RETRY_UA) != 0) { - start_ccb->ccb_h.ccb_state |= ADA_CCB_RETRY_UA; - softc->flags &= ~ADA_FLAG_RETRY_UA; - } - - start_ccb->ccb_h.ccb_bp = bp; - bp = bioq_first(&softc->bio_queue); - - xpt_action(start_ccb); + break; } - - if (bp != NULL) { - /* Have more work to do, so ensure we stay scheduled */ - xpt_schedule(periph, /* XXX priority */1); + case BIO_DELETE: + { + uint64_t lba = bp->bio_pblkno; + uint16_t count = bp->bio_bcount / softc->params.secsize; + + cam_fill_ataio(ataio, + ada_retry_count, + adadone, + CAM_DIR_NONE, + 0, + NULL, + 0, + ada_default_timeout*1000); + + if (count >= 256) + count = 0; + ata_28bit_cmd(ataio, ATA_CFA_ERASE, 0, lba, count); + break; } + case BIO_FLUSH: + cam_fill_ataio(ataio, + 1, + adadone, + CAM_DIR_NONE, + 0, + NULL, + 0, + ada_default_timeout*1000); + + if (softc->flags & ADA_FLAG_CAN_48BIT) + ata_48bit_cmd(ataio, ATA_FLUSHCACHE48, 0, 0, 0); + else + ata_28bit_cmd(ataio, ATA_FLUSHCACHE, 0, 0, 0); + break; + } + start_ccb->ccb_h.ccb_state = ADA_CCB_BUFFER_IO; +out: + start_ccb->ccb_h.ccb_bp = bp; + softc->outstanding_cmds++; + xpt_action(start_ccb); + + /* May have more work to do, so ensure we stay scheduled */ + adaschedule(periph); break; } } @@ -922,6 +998,7 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) ataio = &done_ccb->ataio; switch (ataio->ccb_h.ccb_state & ADA_CCB_TYPE_MASK) { case ADA_CCB_BUFFER_IO: + case ADA_CCB_TRIM: { struct bio *bp; @@ -929,16 +1006,12 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { int error; - error = adaerror(done_ccb, CAM_RETRY_SELTO, 0); + error = adaerror(done_ccb, 0, 0); if (error == ERESTART) { - /* - * A retry was scheuled, so - * just return. - */ + /* A retry was scheduled, so just return. */ return; } if (error != 0) { - if (error == ENXIO) { /* * Catastrophic error. Mark our pack as @@ -952,13 +1025,6 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) "Invalidating pack\n"); softc->flags |= ADA_FLAG_PACK_INVALID; } - - /* - * return all queued I/O with EIO, so that - * the client can retry these I/Os in the - * proper order should it attempt to recover. - */ - bioq_flush(&softc->bio_queue, NULL, EIO); bp->bio_error = error; bp->bio_resid = bp->bio_bcount; bp->bio_flags |= BIO_ERROR; @@ -981,17 +1047,30 @@ adadone(struct cam_periph *periph, union ccb *done_ccb) if (ataio->resid > 0) bp->bio_flags |= BIO_ERROR; } - - /* - * Block out any asyncronous callbacks - * while we touch the pending ccb list. - */ - LIST_REMOVE(&done_ccb->ccb_h, periph_links.le); softc->outstanding_cmds--; if (softc->outstanding_cmds == 0) softc->flags |= ADA_FLAG_WENT_IDLE; + if ((ataio->ccb_h.ccb_state & ADA_CCB_TYPE_MASK) == + ADA_CCB_TRIM) { + struct trim_request *req = + (struct trim_request *)ataio->data_ptr; + int i; - biodone(bp); + for (i = 1; i < softc->trim_max_ranges && + req->bps[i]; i++) { + struct bio *bp1 = req->bps[i]; + + bp1->bio_resid = bp->bio_resid; + bp1->bio_error = bp->bio_error; + if (bp->bio_flags & BIO_ERROR) + bp1->bio_flags |= BIO_ERROR; + biodone(bp1); + } + softc->trim_running = 0; + biodone(bp); + adaschedule(periph); + } else + biodone(bp); break; } case ADA_CCB_WAITING: @@ -1018,19 +1097,18 @@ adaerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags) periph = xpt_path_periph(ccb->ccb_h.path); softc = (struct ada_softc *)periph->softc; - return(cam_periph_error(ccb, cam_flags, sense_flags, - &softc->saved_ccb)); + return(cam_periph_error(ccb, cam_flags, sense_flags, NULL)); } static void -adasetgeom(struct cam_periph *periph, struct ccb_getdev *cgd) +adagetparams(struct cam_periph *periph, struct ccb_getdev *cgd) { struct ada_softc *softc = (struct ada_softc *)periph->softc; struct disk_params *dp = &softc->params; u_int64_t lbasize48; u_int32_t lbasize; - dp->secsize = 512; + dp->secsize = ata_logical_sector_size(&cgd->ident_data); if ((cgd->ident_data.atavalid & ATA_FLAG_54_58) && cgd->ident_data.current_heads && cgd->ident_data.current_sectors) { dp->heads = cgd->ident_data.current_heads; @@ -1047,10 +1125,6 @@ adasetgeom(struct cam_periph *periph, struct ccb_getdev *cgd) lbasize = (u_int32_t)cgd->ident_data.lba_size_1 | ((u_int32_t)cgd->ident_data.lba_size_2 << 16); - /* does this device need oldstyle CHS addressing */ -// if (!ad_version(cgd->ident_data.version_major) || !lbasize) -// atadev->flags |= ATA_D_USE_CHS; - /* use the 28bit LBA size if valid or bigger than the CHS mapping */ if (cgd->ident_data.cylinders == 16383 || dp->sectors < lbasize) dp->sectors = lbasize; @@ -1099,6 +1173,9 @@ adashutdown(void * arg, int howto) TAILQ_FOREACH(periph, &adadriver.units, unit_links) { union ccb ccb; + /* If we paniced with lock held - not recurse here. */ + if (cam_periph_owned(periph)) + continue; cam_periph_lock(periph); softc = (struct ada_softc *)periph->softc; /* @@ -1111,7 +1188,7 @@ adashutdown(void * arg, int howto) continue; } - xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccb.ccb_h.ccb_state = ADA_CCB_DUMP; cam_fill_ataio(&ccb.ataio, diff --git a/sys/cam/ata/ata_pmp.c b/sys/cam/ata/ata_pmp.c new file mode 100644 index 000000000000..b60a4a7596b1 --- /dev/null +++ b/sys/cam/ata/ata_pmp.c @@ -0,0 +1,759 @@ +/*- + * Copyright (c) 2009 Alexander Motin + * 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, + * without modification, immediately at the beginning of the file. + * 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 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 +__FBSDID("$FreeBSD$"); + +#include + +#ifdef _KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif /* _KERNEL */ + +#ifndef _KERNEL +#include +#include +#endif /* _KERNEL */ + +#include +#include +#include +#include +#include +#include + +#include + +#ifdef _KERNEL + +typedef enum { + PMP_STATE_NORMAL, + PMP_STATE_PORTS, + PMP_STATE_PRECONFIG, + PMP_STATE_RESET, + PMP_STATE_CONNECT, + PMP_STATE_CHECK, + PMP_STATE_CLEAR, + PMP_STATE_CONFIG, + PMP_STATE_SCAN +} pmp_state; + +typedef enum { + PMP_FLAG_SCTX_INIT = 0x200 +} pmp_flags; + +typedef enum { + PMP_CCB_PROBE = 0x01, +} pmp_ccb_state; + +/* Offsets into our private area for storing information */ +#define ccb_state ppriv_field0 +#define ccb_bp ppriv_ptr1 + +struct pmp_softc { + SLIST_ENTRY(pmp_softc) links; + pmp_state state; + pmp_flags flags; + uint32_t pm_pid; + uint32_t pm_prv; + int pm_ports; + int pm_step; + int pm_try; + int found; + int reset; + int frozen; + int restart; + int events; +#define PMP_EV_RESET 1 +#define PMP_EV_RESCAN 2 + struct task sysctl_task; + struct sysctl_ctx_list sysctl_ctx; + struct sysctl_oid *sysctl_tree; +}; + +static periph_init_t pmpinit; +static void pmpasync(void *callback_arg, u_int32_t code, + struct cam_path *path, void *arg); +static void pmpsysctlinit(void *context, int pending); +static periph_ctor_t pmpregister; +static periph_dtor_t pmpcleanup; +static periph_start_t pmpstart; +static periph_oninv_t pmponinvalidate; +static void pmpdone(struct cam_periph *periph, + union ccb *done_ccb); + +#ifndef PMP_DEFAULT_TIMEOUT +#define PMP_DEFAULT_TIMEOUT 30 /* Timeout in seconds */ +#endif + +#ifndef PMP_DEFAULT_RETRY +#define PMP_DEFAULT_RETRY 1 +#endif + +static int pmp_retry_count = PMP_DEFAULT_RETRY; +static int pmp_default_timeout = PMP_DEFAULT_TIMEOUT; + +SYSCTL_NODE(_kern_cam, OID_AUTO, pmp, CTLFLAG_RD, 0, + "CAM Direct Access Disk driver"); +SYSCTL_INT(_kern_cam_pmp, OID_AUTO, retry_count, CTLFLAG_RW, + &pmp_retry_count, 0, "Normal I/O retry count"); +TUNABLE_INT("kern.cam.pmp.retry_count", &pmp_retry_count); +SYSCTL_INT(_kern_cam_pmp, OID_AUTO, default_timeout, CTLFLAG_RW, + &pmp_default_timeout, 0, "Normal I/O timeout (in seconds)"); +TUNABLE_INT("kern.cam.pmp.default_timeout", &pmp_default_timeout); + +static struct periph_driver pmpdriver = +{ + pmpinit, "pmp", + TAILQ_HEAD_INITIALIZER(pmpdriver.units), /* generation */ 0, + CAM_PERIPH_DRV_EARLY +}; + +PERIPHDRIVER_DECLARE(pmp, pmpdriver); + +MALLOC_DEFINE(M_ATPMP, "ata_pmp", "ata_pmp buffers"); + +static void +pmpinit(void) +{ + cam_status status; + + /* + * Install a global async callback. This callback will + * receive async callbacks like "new device found". + */ + status = xpt_register_async(AC_FOUND_DEVICE, pmpasync, NULL, NULL); + + if (status != CAM_REQ_CMP) { + printf("pmp: Failed to attach master async callback " + "due to status 0x%x!\n", status); + } +} + +static void +pmpfreeze(struct cam_periph *periph, int mask) +{ + struct pmp_softc *softc = (struct pmp_softc *)periph->softc; + struct cam_path *dpath; + int i; + + mask &= ~softc->frozen; + for (i = 0; i < 15; i++) { + if ((mask & (1 << i)) == 0) + continue; + if (xpt_create_path(&dpath, periph, + xpt_path_path_id(periph->path), + i, 0) == CAM_REQ_CMP) { + softc->frozen |= (1 << i); + xpt_acquire_device(dpath->device); + cam_freeze_devq_arg(dpath, + RELSIM_RELEASE_RUNLEVEL, CAM_RL_BUS + 1); + xpt_free_path(dpath); + } + } +} + +static void +pmprelease(struct cam_periph *periph, int mask) +{ + struct pmp_softc *softc = (struct pmp_softc *)periph->softc; + struct cam_path *dpath; + int i; + + mask &= softc->frozen; + for (i = 0; i < 15; i++) { + if ((mask & (1 << i)) == 0) + continue; + if (xpt_create_path(&dpath, periph, + xpt_path_path_id(periph->path), + i, 0) == CAM_REQ_CMP) { + softc->frozen &= ~(1 << i); + cam_release_devq(dpath, + RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_BUS + 1, FALSE); + xpt_release_device(dpath->device); + xpt_free_path(dpath); + } + } +} + +static void +pmponinvalidate(struct cam_periph *periph) +{ + struct pmp_softc *softc; + struct cam_path *dpath; + int i; + + softc = (struct pmp_softc *)periph->softc; + + /* + * De-register any async callbacks. + */ + xpt_register_async(0, pmpasync, periph, periph->path); + + for (i = 0; i < 15; i++) { + if (xpt_create_path(&dpath, periph, + xpt_path_path_id(periph->path), + i, 0) == CAM_REQ_CMP) { + xpt_async(AC_LOST_DEVICE, dpath, NULL); + xpt_free_path(dpath); + } + } + pmprelease(periph, -1); + xpt_print(periph->path, "lost device\n"); +} + +static void +pmpcleanup(struct cam_periph *periph) +{ + struct pmp_softc *softc; + + softc = (struct pmp_softc *)periph->softc; + + xpt_print(periph->path, "removing device entry\n"); + cam_periph_unlock(periph); + + /* + * If we can't free the sysctl tree, oh well... + */ + if ((softc->flags & PMP_FLAG_SCTX_INIT) != 0 + && sysctl_ctx_free(&softc->sysctl_ctx) != 0) { + xpt_print(periph->path, "can't remove sysctl context\n"); + } + + free(softc, M_DEVBUF); + cam_periph_lock(periph); +} + +static void +pmpasync(void *callback_arg, u_int32_t code, + struct cam_path *path, void *arg) +{ + struct cam_periph *periph; + struct pmp_softc *softc; + + periph = (struct cam_periph *)callback_arg; + switch (code) { + case AC_FOUND_DEVICE: + { + struct ccb_getdev *cgd; + cam_status status; + + cgd = (struct ccb_getdev *)arg; + if (cgd == NULL) + break; + + if (cgd->protocol != PROTO_SATAPM) + break; + + /* + * Allocate a peripheral instance for + * this device and start the probe + * process. + */ + status = cam_periph_alloc(pmpregister, pmponinvalidate, + pmpcleanup, pmpstart, + "pmp", CAM_PERIPH_BIO, + cgd->ccb_h.path, pmpasync, + AC_FOUND_DEVICE, cgd); + + if (status != CAM_REQ_CMP + && status != CAM_REQ_INPROG) + printf("pmpasync: Unable to attach to new device " + "due to status 0x%x\n", status); + break; + } + case AC_SCSI_AEN: + case AC_SENT_BDR: + case AC_BUS_RESET: + softc = (struct pmp_softc *)periph->softc; + cam_periph_async(periph, code, path, arg); + if (code == AC_SCSI_AEN) + softc->events |= PMP_EV_RESCAN; + else + softc->events |= PMP_EV_RESET; + if (code == AC_SCSI_AEN && softc->state != PMP_STATE_NORMAL) + break; + xpt_hold_boot(); + pmpfreeze(periph, softc->found); + if (code == AC_SENT_BDR || code == AC_BUS_RESET) + softc->found = 0; /* We have to reset everything. */ + if (softc->state == PMP_STATE_NORMAL) { + softc->state = PMP_STATE_PRECONFIG; + cam_periph_acquire(periph); + xpt_schedule(periph, CAM_PRIORITY_DEV); + } else + softc->restart = 1; + break; + default: + cam_periph_async(periph, code, path, arg); + break; + } +} + +static void +pmpsysctlinit(void *context, int pending) +{ + struct cam_periph *periph; + struct pmp_softc *softc; + char tmpstr[80], tmpstr2[80]; + + periph = (struct cam_periph *)context; + if (cam_periph_acquire(periph) != CAM_REQ_CMP) + return; + + softc = (struct pmp_softc *)periph->softc; + snprintf(tmpstr, sizeof(tmpstr), "CAM PMP unit %d", periph->unit_number); + snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number); + + sysctl_ctx_init(&softc->sysctl_ctx); + softc->flags |= PMP_FLAG_SCTX_INIT; + softc->sysctl_tree = SYSCTL_ADD_NODE(&softc->sysctl_ctx, + SYSCTL_STATIC_CHILDREN(_kern_cam_pmp), OID_AUTO, tmpstr2, + CTLFLAG_RD, 0, tmpstr); + if (softc->sysctl_tree == NULL) { + printf("pmpsysctlinit: unable to allocate sysctl tree\n"); + cam_periph_release(periph); + return; + } + + cam_periph_release(periph); +} + +static cam_status +pmpregister(struct cam_periph *periph, void *arg) +{ + struct pmp_softc *softc; + struct ccb_getdev *cgd; + + cgd = (struct ccb_getdev *)arg; + if (periph == NULL) { + printf("pmpregister: periph was NULL!!\n"); + return(CAM_REQ_CMP_ERR); + } + + if (cgd == NULL) { + printf("pmpregister: no getdev CCB, can't register device\n"); + return(CAM_REQ_CMP_ERR); + } + + softc = (struct pmp_softc *)malloc(sizeof(*softc), M_DEVBUF, + M_NOWAIT|M_ZERO); + + if (softc == NULL) { + printf("pmpregister: Unable to probe new device. " + "Unable to allocate softc\n"); + return(CAM_REQ_CMP_ERR); + } + periph->softc = softc; + + softc->pm_pid = ((uint32_t *)&cgd->ident_data)[0]; + softc->pm_prv = ((uint32_t *)&cgd->ident_data)[1]; + TASK_INIT(&softc->sysctl_task, 0, pmpsysctlinit, periph); + + xpt_announce_periph(periph, NULL); + + /* + * Add async callbacks for bus reset and + * bus device reset calls. I don't bother + * checking if this fails as, in most cases, + * the system will function just fine without + * them and the only alternative would be to + * not attach the device on failure. + */ + xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE | + AC_SCSI_AEN, pmpasync, periph, periph->path); + + /* + * Take an exclusive refcount on the periph while pmpstart is called + * to finish the probe. The reference will be dropped in pmpdone at + * the end of probe. + */ + (void)cam_periph_acquire(periph); + xpt_hold_boot(); + softc->state = PMP_STATE_PORTS; + softc->events = PMP_EV_RESCAN; + xpt_schedule(periph, CAM_PRIORITY_DEV); + + return(CAM_REQ_CMP); +} + +static void +pmpstart(struct cam_periph *periph, union ccb *start_ccb) +{ + struct ccb_trans_settings cts; + struct ccb_ataio *ataio; + struct pmp_softc *softc; + struct cam_path *dpath; + int revision = 0; + + softc = (struct pmp_softc *)periph->softc; + ataio = &start_ccb->ataio; + + if (softc->restart) { + softc->restart = 0; + softc->state = min(softc->state, PMP_STATE_PRECONFIG); + } + /* Fetch user wanted device speed. */ + if (softc->state == PMP_STATE_RESET || + softc->state == PMP_STATE_CONNECT) { + if (xpt_create_path(&dpath, periph, + xpt_path_path_id(periph->path), + softc->pm_step, 0) == CAM_REQ_CMP) { + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, dpath, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_USER_SETTINGS; + xpt_action((union ccb *)&cts); + if (cts.xport_specific.sata.valid & CTS_SATA_VALID_REVISION) + revision = cts.xport_specific.sata.revision; + xpt_free_path(dpath); + } + } + switch (softc->state) { + case PMP_STATE_PORTS: + cam_fill_ataio(ataio, + pmp_retry_count, + pmpdone, + /*flags*/CAM_DIR_NONE, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + pmp_default_timeout * 1000); + ata_pm_read_cmd(ataio, 2, 15); + break; + case PMP_STATE_PRECONFIG: + cam_fill_ataio(ataio, + pmp_retry_count, + pmpdone, + /*flags*/CAM_DIR_NONE, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + pmp_default_timeout * 1000); + ata_pm_write_cmd(ataio, 0x60, 15, 0x0); + break; + case PMP_STATE_RESET: + cam_fill_ataio(ataio, + pmp_retry_count, + pmpdone, + /*flags*/CAM_DIR_NONE, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + pmp_default_timeout * 1000); + ata_pm_write_cmd(ataio, 2, softc->pm_step, + (revision << 4) | + ((softc->found & (1 << softc->pm_step)) ? 0 : 1)); + break; + case PMP_STATE_CONNECT: + cam_fill_ataio(ataio, + pmp_retry_count, + pmpdone, + /*flags*/CAM_DIR_NONE, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + pmp_default_timeout * 1000); + ata_pm_write_cmd(ataio, 2, softc->pm_step, + (revision << 4)); + break; + case PMP_STATE_CHECK: + cam_fill_ataio(ataio, + pmp_retry_count, + pmpdone, + /*flags*/CAM_DIR_NONE, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + pmp_default_timeout * 1000); + ata_pm_read_cmd(ataio, 0, softc->pm_step); + break; + case PMP_STATE_CLEAR: + softc->reset = 0; + cam_fill_ataio(ataio, + pmp_retry_count, + pmpdone, + /*flags*/CAM_DIR_NONE, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + pmp_default_timeout * 1000); + ata_pm_write_cmd(ataio, 1, softc->pm_step, 0xFFFFFFFF); + break; + case PMP_STATE_CONFIG: + cam_fill_ataio(ataio, + pmp_retry_count, + pmpdone, + /*flags*/CAM_DIR_NONE, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + pmp_default_timeout * 1000); + ata_pm_write_cmd(ataio, 0x60, 15, 0xf); + break; + default: + break; + } + xpt_action(start_ccb); +} + +static void +pmpdone(struct cam_periph *periph, union ccb *done_ccb) +{ + struct ccb_trans_settings cts; + struct pmp_softc *softc; + struct ccb_ataio *ataio; + struct cam_path *path, *dpath; + u_int32_t priority, res; + int i; + + softc = (struct pmp_softc *)periph->softc; + ataio = &done_ccb->ataio; + + CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("pmpdone\n")); + + path = done_ccb->ccb_h.path; + priority = done_ccb->ccb_h.pinfo.priority; + + if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { + if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) { + return; + } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { + cam_release_devq(done_ccb->ccb_h.path, + /*relsim_flags*/0, + /*reduction*/0, + /*timeout*/0, + /*getcount_only*/0); + } + goto done; + } + + if (softc->restart) { + softc->restart = 0; + xpt_release_ccb(done_ccb); + softc->state = min(softc->state, PMP_STATE_PRECONFIG); + xpt_schedule(periph, priority); + return; + } + + switch (softc->state) { + case PMP_STATE_PORTS: + softc->pm_ports = (done_ccb->ataio.res.lba_high << 24) + + (done_ccb->ataio.res.lba_mid << 16) + + (done_ccb->ataio.res.lba_low << 8) + + done_ccb->ataio.res.sector_count; + /* This PMP declares 6 ports, while only 5 of them are real. + * Port 5 is enclosure management bridge port, which has implementation + * problems, causing probe faults. Hide it for now. */ + if (softc->pm_pid == 0x37261095 && softc->pm_ports == 6) + softc->pm_ports = 5; + /* This PMP declares 7 ports, while only 5 of them are real. + * Port 5 is some fake "Config Disk" with 640 sectors size, + * port 6 is enclosure management bridge port. + * Both fake ports has implementation problems, causing + * probe faults. Hide them for now. */ + if (softc->pm_pid == 0x47261095 && softc->pm_ports == 7) + softc->pm_ports = 5; + /* These PMPs declare one more port then actually have, + * for configuration purposes. Hide it for now. */ + if (softc->pm_pid == 0x57231095 || softc->pm_pid == 0x57331095 || + softc->pm_pid == 0x57341095 || softc->pm_pid == 0x57441095) + softc->pm_ports--; + printf("%s%d: %d fan-out ports\n", + periph->periph_name, periph->unit_number, + softc->pm_ports); + softc->state = PMP_STATE_PRECONFIG; + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PMP_STATE_PRECONFIG: + softc->pm_step = 0; + softc->state = PMP_STATE_RESET; + softc->reset |= ~softc->found; + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PMP_STATE_RESET: + softc->pm_step++; + if (softc->pm_step >= softc->pm_ports) { + softc->pm_step = 0; + cam_freeze_devq(periph->path); + cam_release_devq(periph->path, + RELSIM_RELEASE_AFTER_TIMEOUT, + /*reduction*/0, + /*timeout*/5, + /*getcount_only*/0); + softc->state = PMP_STATE_CONNECT; + } + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PMP_STATE_CONNECT: + softc->pm_step++; + if (softc->pm_step >= softc->pm_ports) { + softc->pm_step = 0; + softc->pm_try = 0; + cam_freeze_devq(periph->path); + cam_release_devq(periph->path, + RELSIM_RELEASE_AFTER_TIMEOUT, + /*reduction*/0, + /*timeout*/10, + /*getcount_only*/0); + softc->state = PMP_STATE_CHECK; + } + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PMP_STATE_CHECK: + res = (done_ccb->ataio.res.lba_high << 24) + + (done_ccb->ataio.res.lba_mid << 16) + + (done_ccb->ataio.res.lba_low << 8) + + done_ccb->ataio.res.sector_count; + if ((res & 0xf0f) == 0x103 && (res & 0x0f0) != 0) { + if (bootverbose) { + printf("%s%d: port %d status: %08x\n", + periph->periph_name, periph->unit_number, + softc->pm_step, res); + } + /* Report device speed. */ + if (xpt_create_path(&dpath, periph, + xpt_path_path_id(periph->path), + softc->pm_step, 0) == CAM_REQ_CMP) { + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, dpath, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + cts.xport_specific.sata.revision = (res & 0x0f0) >> 4; + cts.xport_specific.sata.valid = CTS_SATA_VALID_REVISION; + xpt_action((union ccb *)&cts); + xpt_free_path(dpath); + } + softc->found |= (1 << softc->pm_step); + softc->pm_step++; + } else { + if (softc->pm_try < 10) { + cam_freeze_devq(periph->path); + cam_release_devq(periph->path, + RELSIM_RELEASE_AFTER_TIMEOUT, + /*reduction*/0, + /*timeout*/10, + /*getcount_only*/0); + softc->pm_try++; + } else { + if (bootverbose) { + printf("%s%d: port %d status: %08x\n", + periph->periph_name, periph->unit_number, + softc->pm_step, res); + } + softc->found &= ~(1 << softc->pm_step); + if (xpt_create_path(&dpath, periph, + done_ccb->ccb_h.path_id, + softc->pm_step, 0) == CAM_REQ_CMP) { + xpt_async(AC_LOST_DEVICE, dpath, NULL); + xpt_free_path(dpath); + } + softc->pm_step++; + } + } + if (softc->pm_step >= softc->pm_ports) { + if (softc->reset & softc->found) { + cam_freeze_devq(periph->path); + cam_release_devq(periph->path, + RELSIM_RELEASE_AFTER_TIMEOUT, + /*reduction*/0, + /*timeout*/1000, + /*getcount_only*/0); + } + softc->state = PMP_STATE_CLEAR; + softc->pm_step = 0; + } + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PMP_STATE_CLEAR: + softc->pm_step++; + if (softc->pm_step >= softc->pm_ports) { + softc->state = PMP_STATE_CONFIG; + softc->pm_step = 0; + } + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PMP_STATE_CONFIG: + for (i = 0; i < softc->pm_ports; i++) { + union ccb *ccb; + + if ((softc->found & (1 << i)) == 0) + continue; + if (xpt_create_path(&dpath, periph, + xpt_path_path_id(periph->path), + i, 0) != CAM_REQ_CMP) { + printf("pmpdone: xpt_create_path failed" + ", bus scan halted\n"); + xpt_free_ccb(done_ccb); + goto done; + } + /* If we did hard reset to this device, inform XPT. */ + if ((softc->reset & softc->found & (1 << i)) != 0) + xpt_async(AC_SENT_BDR, dpath, NULL); + /* If rescan requested, scan this device. */ + if (softc->events & PMP_EV_RESCAN) { + ccb = xpt_alloc_ccb_nowait(); + if (ccb == NULL) { + xpt_free_path(dpath); + goto done; + } + xpt_setup_ccb(&ccb->ccb_h, dpath, CAM_PRIORITY_XPT); + xpt_rescan(ccb); + } else + xpt_free_path(dpath); + } + break; + default: + break; + } +done: + xpt_release_ccb(done_ccb); + softc->state = PMP_STATE_NORMAL; + softc->events = 0; + xpt_release_boot(); + pmprelease(periph, -1); + cam_periph_release_locked(periph); +} + +#endif /* _KERNEL */ diff --git a/sys/cam/ata/ata_xpt.c b/sys/cam/ata/ata_xpt.c index 5acb9a35d0c5..d5e0b32a49b1 100644 --- a/sys/cam/ata/ata_xpt.c +++ b/sys/cam/ata/ata_xpt.c @@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -62,29 +61,24 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include /* for xpt_print below */ #include "opt_cam.h" -struct scsi_quirk_entry { +struct ata_quirk_entry { struct scsi_inquiry_pattern inq_pat; u_int8_t quirks; -#define CAM_QUIRK_NOLUNS 0x01 -#define CAM_QUIRK_NOSERIAL 0x02 -#define CAM_QUIRK_HILUNS 0x04 -#define CAM_QUIRK_NOHILUNS 0x08 - u_int mintags; +#define CAM_QUIRK_MAXTAGS 0x01 u_int maxtags; }; -#define SCSI_QUIRK(dev) ((struct scsi_quirk_entry *)((dev)->quirk)) static periph_init_t probe_periph_init; static struct periph_driver probe_driver = { probe_periph_init, "aprobe", - TAILQ_HEAD_INITIALIZER(probe_driver.units) + TAILQ_HEAD_INITIALIZER(probe_driver.units), /* generation */ 0, + CAM_PERIPH_DRV_EARLY }; PERIPHDRIVER_DECLARE(aprobe, probe_driver); @@ -92,32 +86,26 @@ PERIPHDRIVER_DECLARE(aprobe, probe_driver); typedef enum { PROBE_RESET, PROBE_IDENTIFY, + PROBE_SPINUP, PROBE_SETMODE, + PROBE_SET_MULTI, PROBE_INQUIRY, PROBE_FULL_INQUIRY, PROBE_PM_PID, PROBE_PM_PRV, - PROBE_PM_PORTS, - PROBE_PM_RESET, - PROBE_PM_CONNECT, - PROBE_PM_CHECK, - PROBE_PM_CLEAR, PROBE_INVALID } probe_action; static char *probe_action_text[] = { "PROBE_RESET", "PROBE_IDENTIFY", + "PROBE_SPINUP", "PROBE_SETMODE", + "PROBE_SET_MULTI", "PROBE_INQUIRY", "PROBE_FULL_INQUIRY", "PROBE_PM_PID", "PROBE_PM_PRV", - "PROBE_PM_PORTS", - "PROBE_PM_RESET", - "PROBE_PM_CONNECT", - "PROBE_PM_CHECK", - "PROBE_PM_CLEAR", "PROBE_INVALID" }; @@ -137,19 +125,17 @@ typedef enum { typedef struct { TAILQ_HEAD(, ccb_hdr) request_ccbs; + struct ata_params ident_data; probe_action action; - union ccb saved_ccb; probe_flags flags; - u_int8_t digest[16]; uint32_t pm_pid; uint32_t pm_prv; - int pm_ports; - int pm_step; - int pm_try; + int restart; + int spinup; struct cam_periph *periph; } probe_softc; -static struct scsi_quirk_entry scsi_quirk_table[] = +static struct ata_quirk_entry ata_quirk_table[] = { { /* Default tagged queuing parameters for all devices */ @@ -157,12 +143,12 @@ static struct scsi_quirk_entry scsi_quirk_table[] = T_ANY, SIP_MEDIA_REMOVABLE|SIP_MEDIA_FIXED, /*vendor*/"*", /*product*/"*", /*revision*/"*" }, - /*quirks*/0, /*mintags*/2, /*maxtags*/32 + /*quirks*/0, /*maxtags*/0 }, }; -static const int scsi_quirk_table_size = - sizeof(scsi_quirk_table) / sizeof(*scsi_quirk_table); +static const int ata_quirk_table_size = + sizeof(ata_quirk_table) / sizeof(*ata_quirk_table); static cam_status proberegister(struct cam_periph *periph, void *arg); @@ -173,7 +159,7 @@ static void probestart(struct cam_periph *periph, union ccb *start_ccb); // struct cam_ed *device); static void probedone(struct cam_periph *periph, union ccb *done_ccb); static void probecleanup(struct cam_periph *periph); -static void scsi_find_quirk(struct cam_ed *device); +static void ata_find_quirk(struct cam_ed *device); static void ata_scan_bus(struct cam_periph *periph, union ccb *ccb); static void ata_scan_lun(struct cam_periph *periph, struct cam_path *path, cam_flags flags, @@ -183,21 +169,22 @@ static struct cam_ed * ata_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id); static void ata_device_transport(struct cam_path *path); -static void scsi_set_transfer_settings(struct ccb_trans_settings *cts, +static void ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, int async_update); -static void scsi_toggle_tags(struct cam_path *path); static void ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, struct cam_ed *device, void *async_arg); static void ata_action(union ccb *start_ccb); +static void ata_announce_periph(struct cam_periph *periph); static struct xpt_xport ata_xport = { .alloc_device = ata_alloc_device, .action = ata_action, .async = ata_dev_async, + .announce = ata_announce_periph, }; struct xpt_xport * @@ -230,7 +217,7 @@ proberegister(struct cam_periph *periph, void *arg) return(CAM_REQ_CMP_ERR); } - softc = (probe_softc *)malloc(sizeof(*softc), M_CAMXPT, M_NOWAIT); + softc = (probe_softc *)malloc(sizeof(*softc), M_CAMXPT, M_ZERO | M_NOWAIT); if (softc == NULL) { printf("proberegister: Unable to probe new device. " @@ -248,15 +235,11 @@ proberegister(struct cam_periph *periph, void *arg) if (status != CAM_REQ_CMP) { return (status); } - - /* - * Ensure we've waited at least a bus settle - * delay before attempting to probe the device. - * For HBAs that don't do bus resets, this won't make a difference. + * Ensure nobody slip in until probe finish. */ - cam_periph_freeze_after_event(periph, &periph->path->bus->last_reset, - scsi_delay); + cam_freeze_devq_arg(periph->path, + RELSIM_RELEASE_RUNLEVEL, CAM_RL_XPT + 1); probeschedule(periph); return(CAM_REQ_CMP); } @@ -264,21 +247,15 @@ proberegister(struct cam_periph *periph, void *arg) static void probeschedule(struct cam_periph *periph) { - struct ccb_pathinq cpi; union ccb *ccb; probe_softc *softc; softc = (probe_softc *)periph->softc; ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs); - xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1); - cpi.ccb_h.func_code = XPT_PATH_INQ; - xpt_action((union ccb *)&cpi); - - if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) + if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) || + periph->path->device->protocol == PROTO_SATAPM) PROBE_SET_ACTION(softc, PROBE_RESET); - else if (periph->path->device->protocol == PROTO_SATAPM) - PROBE_SET_ACTION(softc, PROBE_PM_PID); else PROBE_SET_ACTION(softc, PROBE_IDENTIFY); @@ -287,86 +264,124 @@ probeschedule(struct cam_periph *periph) else softc->flags &= ~PROBE_NO_ANNOUNCE; - xpt_schedule(periph, ccb->ccb_h.pinfo.priority); + xpt_schedule(periph, CAM_PRIORITY_XPT); } static void probestart(struct cam_periph *periph, union ccb *start_ccb) { - /* Probe the device that our peripheral driver points to */ + struct ccb_trans_settings cts; struct ccb_ataio *ataio; struct ccb_scsiio *csio; - struct ccb_trans_settings cts; probe_softc *softc; + struct cam_path *path; + struct ata_params *ident_buf; CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("probestart\n")); softc = (probe_softc *)periph->softc; + path = start_ccb->ccb_h.path; ataio = &start_ccb->ataio; csio = &start_ccb->csio; + ident_buf = &periph->path->device->ident_data; + if (softc->restart) { + softc->restart = 0; + if ((path->device->flags & CAM_DEV_UNCONFIGURED) || + path->device->protocol == PROTO_SATAPM) + softc->action = PROBE_RESET; + else + softc->action = PROBE_IDENTIFY; + } switch (softc->action) { case PROBE_RESET: - if (start_ccb->ccb_h.target_id == 15) { - /* Report SIM that we have no knowledge about PM presence. */ - bzero(&cts, sizeof(cts)); - xpt_setup_ccb(&cts.ccb_h, start_ccb->ccb_h.path, 1); - cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; - cts.type = CTS_TYPE_CURRENT_SETTINGS; - cts.xport_specific.sata.pm_present = 0; - cts.xport_specific.sata.valid = CTS_SATA_VALID_PM; - xpt_action((union ccb *)&cts); - } cam_fill_ataio(ataio, 0, probedone, /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, + 0, /*data_ptr*/NULL, /*dxfer_len*/0, - (start_ccb->ccb_h.target_id == 15 ? 3 : 15) * 1000); + 15 * 1000); ata_reset_cmd(ataio); break; case PROBE_IDENTIFY: - { - struct ata_params *ident_buf = - &periph->path->device->ident_data; - - if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) { - /* Prepare check that it is the same device. */ - MD5_CTX context; - - MD5Init(&context); - MD5Update(&context, - (unsigned char *)ident_buf->model, - sizeof(ident_buf->model)); - MD5Update(&context, - (unsigned char *)ident_buf->revision, - sizeof(ident_buf->revision)); - MD5Update(&context, - (unsigned char *)ident_buf->serial, - sizeof(ident_buf->serial)); - MD5Final(softc->digest, &context); - } cam_fill_ataio(ataio, 1, probedone, /*flags*/CAM_DIR_IN, - MSG_SIMPLE_Q_TAG, - /*data_ptr*/(u_int8_t *)ident_buf, - /*dxfer_len*/sizeof(struct ata_params), + 0, + /*data_ptr*/(u_int8_t *)&softc->ident_data, + /*dxfer_len*/sizeof(softc->ident_data), 30 * 1000); if (periph->path->device->protocol == PROTO_ATA) ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0); else ata_28bit_cmd(ataio, ATA_ATAPI_IDENTIFY, 0, 0, 0); break; - } + case PROBE_SPINUP: + if (bootverbose) + xpt_print(path, "Spinning up device\n"); + cam_fill_ataio(ataio, + 1, + probedone, + /*flags*/CAM_DIR_NONE | CAM_HIGH_POWER, + 0, + /*data_ptr*/NULL, + /*dxfer_len*/0, + 30 * 1000); + ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_PUIS_SPINUP, 0, 0); + break; case PROBE_SETMODE: { - struct ata_params *ident_buf = - &periph->path->device->ident_data; + int mode, wantmode; + mode = 0; + /* Fetch user modes from SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_USER_SETTINGS; + xpt_action((union ccb *)&cts); + if (path->device->transport == XPORT_ATA) { + if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE) + mode = cts.xport_specific.ata.mode; + } else { + if (cts.xport_specific.sata.valid & CTS_SATA_VALID_MODE) + mode = cts.xport_specific.sata.mode; + } +negotiate: + /* Honor device capabilities. */ + wantmode = mode = ata_max_mode(ident_buf, mode); + /* Report modes to SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + if (path->device->transport == XPORT_ATA) { + cts.xport_specific.ata.mode = mode; + cts.xport_specific.ata.valid = CTS_ATA_VALID_MODE; + } else { + cts.xport_specific.sata.mode = mode; + cts.xport_specific.sata.valid = CTS_SATA_VALID_MODE; + } + xpt_action((union ccb *)&cts); + /* Fetch current modes from SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + xpt_action((union ccb *)&cts); + if (path->device->transport == XPORT_ATA) { + if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE) + mode = cts.xport_specific.ata.mode; + } else { + if (cts.xport_specific.ata.valid & CTS_SATA_VALID_MODE) + mode = cts.xport_specific.sata.mode; + } + /* If SIM disagree - renegotiate. */ + if (mode != wantmode) + goto negotiate; cam_fill_ataio(ataio, 1, probedone, @@ -375,11 +390,111 @@ probestart(struct cam_periph *periph, union ccb *start_ccb) /*data_ptr*/NULL, /*dxfer_len*/0, 30 * 1000); - ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0, - ata_max_mode(ident_buf, ATA_UDMA6, ATA_UDMA6)); + ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); + break; + } + case PROBE_SET_MULTI: + { + u_int sectors, bytecount; + + bytecount = 8192; /* SATA maximum */ + /* Fetch user bytecount from SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_USER_SETTINGS; + xpt_action((union ccb *)&cts); + if (path->device->transport == XPORT_ATA) { + if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT) + bytecount = cts.xport_specific.ata.bytecount; + } else { + if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT) + bytecount = cts.xport_specific.sata.bytecount; + } + /* Honor device capabilities. */ + sectors = max(1, min(ident_buf->sectors_intr & 0xff, + bytecount / ata_logical_sector_size(ident_buf))); + /* Report bytecount to SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + if (path->device->transport == XPORT_ATA) { + cts.xport_specific.ata.bytecount = sectors * + ata_logical_sector_size(ident_buf); + cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT; + } else { + cts.xport_specific.sata.bytecount = sectors * + ata_logical_sector_size(ident_buf); + cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT; + } + xpt_action((union ccb *)&cts); + /* Fetch current bytecount from SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + xpt_action((union ccb *)&cts); + if (path->device->transport == XPORT_ATA) { + if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT) + bytecount = cts.xport_specific.ata.bytecount; + } else { + if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT) + bytecount = cts.xport_specific.sata.bytecount; + } + sectors = bytecount / ata_logical_sector_size(ident_buf); + + cam_fill_ataio(ataio, + 1, + probedone, + CAM_DIR_NONE, + 0, + NULL, + 0, + 30*1000); + ata_28bit_cmd(ataio, ATA_SET_MULTI, 0, 0, sectors); break; } case PROBE_INQUIRY: + { + u_int bytecount; + + bytecount = 8192; /* SATA maximum */ + /* Fetch user bytecount from SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_USER_SETTINGS; + xpt_action((union ccb *)&cts); + if (path->device->transport == XPORT_ATA) { + if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT) + bytecount = cts.xport_specific.ata.bytecount; + } else { + if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT) + bytecount = cts.xport_specific.sata.bytecount; + } + /* Honor device capabilities. */ + bytecount &= ~1; + bytecount = max(2, min(65534, bytecount)); + if (ident_buf->satacapabilities != 0x0000 && + ident_buf->satacapabilities != 0xffff) { + bytecount = min(8192, bytecount); + } + /* Report bytecount to SIM. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + if (path->device->transport == XPORT_ATA) { + cts.xport_specific.ata.bytecount = bytecount; + cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT; + } else { + cts.xport_specific.sata.bytecount = bytecount; + cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT; + } + xpt_action((union ccb *)&cts); + /* FALLTHROUGH */ + } case PROBE_FULL_INQUIRY: { u_int inquiry_len; @@ -414,7 +529,7 @@ probestart(struct cam_periph *periph, union ccb *start_ccb) 1, probedone, /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, + 0, /*data_ptr*/NULL, /*dxfer_len*/0, 10 * 1000); @@ -425,76 +540,14 @@ probestart(struct cam_periph *periph, union ccb *start_ccb) 1, probedone, /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, + 0, /*data_ptr*/NULL, /*dxfer_len*/0, 10 * 1000); ata_pm_read_cmd(ataio, 1, 15); break; - case PROBE_PM_PORTS: - cam_fill_ataio(ataio, - 1, - probedone, - /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, - /*data_ptr*/NULL, - /*dxfer_len*/0, - 10 * 1000); - ata_pm_read_cmd(ataio, 2, 15); - break; - case PROBE_PM_RESET: - { - struct ata_params *ident_buf = - &periph->path->device->ident_data; - cam_fill_ataio(ataio, - 1, - probedone, - /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, - /*data_ptr*/NULL, - /*dxfer_len*/0, - 10 * 1000); - ata_pm_write_cmd(ataio, 2, softc->pm_step, - (ident_buf->cylinders & (1 << softc->pm_step)) ? 0 : 1); -printf("PM RESET %d %04x %d\n", softc->pm_step, ident_buf->cylinders, - (ident_buf->cylinders & (1 << softc->pm_step)) ? 0 : 1); - break; - } - case PROBE_PM_CONNECT: - cam_fill_ataio(ataio, - 1, - probedone, - /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, - /*data_ptr*/NULL, - /*dxfer_len*/0, - 10 * 1000); - ata_pm_write_cmd(ataio, 2, softc->pm_step, 0); - break; - case PROBE_PM_CHECK: - cam_fill_ataio(ataio, - 1, - probedone, - /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, - /*data_ptr*/NULL, - /*dxfer_len*/0, - 10 * 1000); - ata_pm_read_cmd(ataio, 0, softc->pm_step); - break; - case PROBE_PM_CLEAR: - cam_fill_ataio(ataio, - 1, - probedone, - /*flags*/CAM_DIR_NONE, - MSG_SIMPLE_Q_TAG, - /*data_ptr*/NULL, - /*dxfer_len*/0, - 10 * 1000); - ata_pm_write_cmd(ataio, 1, softc->pm_step, 0xFFFFFFFF); - break; case PROBE_INVALID: - CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_INFO, + CAM_DEBUG(path, CAM_DEBUG_INFO, ("probestart: invalid action state\n")); default: break; @@ -507,7 +560,7 @@ proberequestdefaultnegotiation(struct cam_periph *periph) { struct ccb_trans_settings cts; - xpt_setup_ccb(&cts.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE); cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; cts.type = CTS_TYPE_USER_SETTINGS; xpt_action((union ccb *)&cts); @@ -529,7 +582,7 @@ proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) struct ccb_trans_settings_spi *spi; memset(&cts, 0, sizeof (cts)); - xpt_setup_ccb(&cts.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE); cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; cts.type = CTS_TYPE_CURRENT_SETTINGS; xpt_action((union ccb *)&cts); @@ -627,11 +680,12 @@ proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) static void probedone(struct cam_periph *periph, union ccb *done_ccb) { + struct ccb_trans_settings cts; struct ata_params *ident_buf; probe_softc *softc; struct cam_path *path; u_int32_t priority; - int found = 0; + int found = 1; CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("probedone\n")); @@ -640,139 +694,20 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) priority = done_ccb->ccb_h.pinfo.priority; ident_buf = &path->device->ident_data; - switch (softc->action) { - case PROBE_RESET: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - int sign = (done_ccb->ataio.res.lba_high << 8) + - done_ccb->ataio.res.lba_mid; - xpt_print(path, "SIGNATURE: %04x\n", sign); - if (sign == 0x0000 && - done_ccb->ccb_h.target_id != 15) { - path->device->protocol = PROTO_ATA; - PROBE_SET_ACTION(softc, PROBE_IDENTIFY); - } else if (sign == 0x9669 && - done_ccb->ccb_h.target_id == 15) { - struct ccb_trans_settings cts; - - /* Report SIM that PM is present. */ - bzero(&cts, sizeof(cts)); - xpt_setup_ccb(&cts.ccb_h, path, 1); - cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; - cts.type = CTS_TYPE_CURRENT_SETTINGS; - cts.xport_specific.sata.pm_present = 1; - cts.xport_specific.sata.valid = CTS_SATA_VALID_PM; - xpt_action((union ccb *)&cts); - path->device->protocol = PROTO_SATAPM; - PROBE_SET_ACTION(softc, PROBE_PM_PID); - } else if (sign == 0xeb14 && - done_ccb->ccb_h.target_id != 15) { - path->device->protocol = PROTO_SCSI; - PROBE_SET_ACTION(softc, PROBE_IDENTIFY); - } else { - if (done_ccb->ccb_h.target_id != 15) { - xpt_print(path, - "Unexpected signature 0x%04x\n", sign); - } - xpt_release_ccb(done_ccb); - break; - } - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { + if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { +device_fail: if ((!softc->restart) && + cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) { return; } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { /* Don't wedge the queue */ xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, /*run_queue*/TRUE); } - goto device_fail; - case PROBE_IDENTIFY: - { - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - int16_t *ptr; - - for (ptr = (int16_t *)ident_buf; - ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) { - *ptr = le16toh(*ptr); - } - if (strncmp(ident_buf->model, "FX", 2) && - strncmp(ident_buf->model, "NEC", 3) && - strncmp(ident_buf->model, "Pioneer", 7) && - strncmp(ident_buf->model, "SHARP", 5)) { - ata_bswap(ident_buf->model, sizeof(ident_buf->model)); - ata_bswap(ident_buf->revision, sizeof(ident_buf->revision)); - ata_bswap(ident_buf->serial, sizeof(ident_buf->serial)); - } - ata_btrim(ident_buf->model, sizeof(ident_buf->model)); - ata_bpack(ident_buf->model, ident_buf->model, sizeof(ident_buf->model)); - ata_btrim(ident_buf->revision, sizeof(ident_buf->revision)); - ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision)); - ata_btrim(ident_buf->serial, sizeof(ident_buf->serial)); - ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial)); - - if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) { - /* Check that it is the same device. */ - MD5_CTX context; - u_int8_t digest[16]; - - MD5Init(&context); - MD5Update(&context, - (unsigned char *)ident_buf->model, - sizeof(ident_buf->model)); - MD5Update(&context, - (unsigned char *)ident_buf->revision, - sizeof(ident_buf->revision)); - MD5Update(&context, - (unsigned char *)ident_buf->serial, - sizeof(ident_buf->serial)); - MD5Final(digest, &context); - if (bcmp(digest, softc->digest, sizeof(digest))) { - /* Device changed. */ - xpt_async(AC_LOST_DEVICE, path, NULL); - } - xpt_release_ccb(done_ccb); - break; - } - - /* Clean up from previous instance of this device */ - if (path->device->serial_num != NULL) { - free(path->device->serial_num, M_CAMXPT); - path->device->serial_num = NULL; - path->device->serial_num_len = 0; - } - path->device->serial_num = - (u_int8_t *)malloc((sizeof(ident_buf->serial) + 1), - M_CAMXPT, M_NOWAIT); - if (path->device->serial_num != NULL) { - bcopy(ident_buf->serial, - path->device->serial_num, - sizeof(ident_buf->serial)); - path->device->serial_num[sizeof(ident_buf->serial)] - = '\0'; - path->device->serial_num_len = - strlen(path->device->serial_num); - } - - path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID; - - scsi_find_quirk(path->device); - ata_device_transport(path); - - PROBE_SET_ACTION(softc, PROBE_SETMODE); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); - } -device_fail: + /* Old PIO2 devices may not support mode setting. */ + if (softc->action == PROBE_SETMODE && + ata_max_pmode(ident_buf) <= ATA_PIO2 && + (ident_buf->capabilities1 & ATA_SUPPORT_IORDY) == 0) + goto noerror; /* * If we get to this point, we got an error status back * from the inquiry and the error status doesn't require @@ -784,311 +719,275 @@ device_fail: * drivers that this device is no more. */ if ((path->device->flags & CAM_DEV_UNCONFIGURED) == 0) - /* Send the async notification. */ xpt_async(AC_LOST_DEVICE, path, NULL); - - xpt_release_ccb(done_ccb); - break; + found = 0; + goto done; } - case PROBE_SETMODE: +noerror: + if (softc->restart) + goto done; + switch (softc->action) { + case PROBE_RESET: { - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - if (path->device->protocol == PROTO_ATA) { - path->device->flags &= ~CAM_DEV_UNCONFIGURED; - done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action(done_ccb); - xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, - done_ccb); - xpt_release_ccb(done_ccb); - break; - } else { - PROBE_SET_ACTION(softc, PROBE_INQUIRY); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; + int sign = (done_ccb->ataio.res.lba_high << 8) + + done_ccb->ataio.res.lba_mid; + if (bootverbose) + xpt_print(path, "SIGNATURE: %04x\n", sign); + if (sign == 0x0000 && + done_ccb->ccb_h.target_id != 15) { + path->device->protocol = PROTO_ATA; + PROBE_SET_ACTION(softc, PROBE_IDENTIFY); + } else if (sign == 0x9669 && + done_ccb->ccb_h.target_id == 15) { + /* Report SIM that PM is present. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + cts.xport_specific.sata.pm_present = 1; + cts.xport_specific.sata.valid = CTS_SATA_VALID_PM; + xpt_action((union ccb *)&cts); + path->device->protocol = PROTO_SATAPM; + PROBE_SET_ACTION(softc, PROBE_PM_PID); + } else if (sign == 0xeb14 && + done_ccb->ccb_h.target_id != 15) { + path->device->protocol = PROTO_SCSI; + PROBE_SET_ACTION(softc, PROBE_IDENTIFY); + } else { + if (done_ccb->ccb_h.target_id != 15) { + xpt_print(path, + "Unexpected signature 0x%04x\n", sign); } - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); + goto device_fail; } - goto device_fail; + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; } + case PROBE_IDENTIFY: + { + int16_t *ptr; + + ident_buf = &softc->ident_data; + for (ptr = (int16_t *)ident_buf; + ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; ptr++) { + *ptr = le16toh(*ptr); + } + if (strncmp(ident_buf->model, "FX", 2) && + strncmp(ident_buf->model, "NEC", 3) && + strncmp(ident_buf->model, "Pioneer", 7) && + strncmp(ident_buf->model, "SHARP", 5)) { + ata_bswap(ident_buf->model, sizeof(ident_buf->model)); + ata_bswap(ident_buf->revision, sizeof(ident_buf->revision)); + ata_bswap(ident_buf->serial, sizeof(ident_buf->serial)); + } + ata_btrim(ident_buf->model, sizeof(ident_buf->model)); + ata_bpack(ident_buf->model, ident_buf->model, sizeof(ident_buf->model)); + ata_btrim(ident_buf->revision, sizeof(ident_buf->revision)); + ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision)); + ata_btrim(ident_buf->serial, sizeof(ident_buf->serial)); + ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial)); + /* Device may need spin-up before IDENTIFY become valid. */ + if ((ident_buf->specconf == 0x37c8 || + ident_buf->specconf == 0x738c) && + ((ident_buf->config & ATA_RESP_INCOMPLETE) || + softc->spinup == 0)) { + PROBE_SET_ACTION(softc, PROBE_SPINUP); + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + } + ident_buf = &path->device->ident_data; + if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) { + /* Check that it is the same device. */ + if (bcmp(softc->ident_data.model, ident_buf->model, + sizeof(ident_buf->model)) || + bcmp(softc->ident_data.revision, ident_buf->revision, + sizeof(ident_buf->revision)) || + bcmp(softc->ident_data.serial, ident_buf->serial, + sizeof(ident_buf->serial))) { + /* Device changed. */ + xpt_async(AC_LOST_DEVICE, path, NULL); + } else + bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params)); + } else { + bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params)); + /* Clean up from previous instance of this device */ + if (path->device->serial_num != NULL) { + free(path->device->serial_num, M_CAMXPT); + path->device->serial_num = NULL; + path->device->serial_num_len = 0; + } + path->device->serial_num = + (u_int8_t *)malloc((sizeof(ident_buf->serial) + 1), + M_CAMXPT, M_NOWAIT); + if (path->device->serial_num != NULL) { + bcopy(ident_buf->serial, + path->device->serial_num, + sizeof(ident_buf->serial)); + path->device->serial_num[sizeof(ident_buf->serial)] + = '\0'; + path->device->serial_num_len = + strlen(path->device->serial_num); + } + + path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID; + } + if (ident_buf->satacapabilities & ATA_SUPPORT_NCQ) { + path->device->mintags = path->device->maxtags = + ATA_QUEUE_LEN(ident_buf->queue) + 1; + } + ata_find_quirk(path->device); + if (path->device->mintags != 0 && + path->bus->sim->max_tagged_dev_openings != 0) { + /* Report SIM which tags are allowed. */ + bzero(&cts, sizeof(cts)); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); + cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + cts.xport_specific.sata.tags = path->device->maxtags; + cts.xport_specific.sata.valid = CTS_SATA_VALID_TAGS; + xpt_action((union ccb *)&cts); + /* Reconfigure queues for tagged queueing. */ + xpt_start_tags(path); + } + ata_device_transport(path); + PROBE_SET_ACTION(softc, PROBE_SETMODE); + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + } + case PROBE_SPINUP: + if (bootverbose) + xpt_print(path, "Spin-up done\n"); + softc->spinup = 1; + PROBE_SET_ACTION(softc, PROBE_IDENTIFY); + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PROBE_SETMODE: + if (path->device->protocol == PROTO_ATA) { + PROBE_SET_ACTION(softc, PROBE_SET_MULTI); + } else { + PROBE_SET_ACTION(softc, PROBE_INQUIRY); + } + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; + case PROBE_SET_MULTI: + if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) { + path->device->flags &= ~CAM_DEV_UNCONFIGURED; + xpt_acquire_device(path->device); + done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action(done_ccb); + xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, + done_ccb); + } + break; case PROBE_INQUIRY: case PROBE_FULL_INQUIRY: { - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - struct scsi_inquiry_data *inq_buf; - u_int8_t periph_qual; + struct scsi_inquiry_data *inq_buf; + u_int8_t periph_qual, len; - path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID; - inq_buf = &path->device->inq_data; + path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID; + inq_buf = &path->device->inq_data; - periph_qual = SID_QUAL(inq_buf); + periph_qual = SID_QUAL(inq_buf); - if (periph_qual == SID_QUAL_LU_CONNECTED) { - u_int8_t len; + if (periph_qual != SID_QUAL_LU_CONNECTED) + break; - /* - * We conservatively request only - * SHORT_INQUIRY_LEN bytes of inquiry - * information during our first try - * at sending an INQUIRY. If the device - * has more information to give, - * perform a second request specifying - * the amount of information the device - * is willing to give. - */ - len = inq_buf->additional_length - + offsetof(struct scsi_inquiry_data, - additional_length) + 1; - if (softc->action == PROBE_INQUIRY - && len > SHORT_INQUIRY_LENGTH) { - PROBE_SET_ACTION(softc, PROBE_FULL_INQUIRY); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } - - scsi_find_quirk(path->device); - -// scsi_devise_transport(path); - path->device->flags &= ~CAM_DEV_UNCONFIGURED; - done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action(done_ccb); - xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, - done_ccb); - xpt_release_ccb(done_ccb); - break; - } - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { + /* + * We conservatively request only + * SHORT_INQUIRY_LEN bytes of inquiry + * information during our first try + * at sending an INQUIRY. If the device + * has more information to give, + * perform a second request specifying + * the amount of information the device + * is willing to give. + */ + len = inq_buf->additional_length + + offsetof(struct scsi_inquiry_data, additional_length) + 1; + if (softc->action == PROBE_INQUIRY + && len > SHORT_INQUIRY_LENGTH) { + PROBE_SET_ACTION(softc, PROBE_FULL_INQUIRY); + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); } - goto device_fail; + + ata_device_transport(path); + if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) { + path->device->flags &= ~CAM_DEV_UNCONFIGURED; + xpt_acquire_device(path->device); + done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action(done_ccb); + xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, done_ccb); + } + break; } case PROBE_PM_PID: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) == 0) - bzero(ident_buf, sizeof(*ident_buf)); - softc->pm_pid = (done_ccb->ataio.res.lba_high << 24) + - (done_ccb->ataio.res.lba_mid << 16) + - (done_ccb->ataio.res.lba_low << 8) + - done_ccb->ataio.res.sector_count; - printf("PM Product ID: %08x\n", softc->pm_pid); - snprintf(ident_buf->model, sizeof(ident_buf->model), - "Port Multiplier %08x", softc->pm_pid); - PROBE_SET_ACTION(softc, PROBE_PM_PRV); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); - } - goto device_fail; + if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) == 0) + bzero(ident_buf, sizeof(*ident_buf)); + softc->pm_pid = (done_ccb->ataio.res.lba_high << 24) + + (done_ccb->ataio.res.lba_mid << 16) + + (done_ccb->ataio.res.lba_low << 8) + + done_ccb->ataio.res.sector_count; + ((uint32_t *)ident_buf)[0] = softc->pm_pid; + snprintf(ident_buf->model, sizeof(ident_buf->model), + "Port Multiplier %08x", softc->pm_pid); + PROBE_SET_ACTION(softc, PROBE_PM_PRV); + xpt_release_ccb(done_ccb); + xpt_schedule(periph, priority); + return; case PROBE_PM_PRV: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - softc->pm_prv = (done_ccb->ataio.res.lba_high << 24) + - (done_ccb->ataio.res.lba_mid << 16) + - (done_ccb->ataio.res.lba_low << 8) + - done_ccb->ataio.res.sector_count; - printf("PM Revision: %08x\n", softc->pm_prv); - snprintf(ident_buf->revision, sizeof(ident_buf->revision), - "%04x", softc->pm_prv); - PROBE_SET_ACTION(softc, PROBE_PM_PORTS); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); + softc->pm_prv = (done_ccb->ataio.res.lba_high << 24) + + (done_ccb->ataio.res.lba_mid << 16) + + (done_ccb->ataio.res.lba_low << 8) + + done_ccb->ataio.res.sector_count; + ((uint32_t *)ident_buf)[1] = softc->pm_prv; + snprintf(ident_buf->revision, sizeof(ident_buf->revision), + "%04x", softc->pm_prv); + path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID; + if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) { + path->device->flags &= ~CAM_DEV_UNCONFIGURED; + xpt_acquire_device(path->device); + done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action(done_ccb); + xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, + done_ccb); + } else { + done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action(done_ccb); + xpt_async(AC_SCSI_AEN, done_ccb->ccb_h.path, done_ccb); } - goto device_fail; - case PROBE_PM_PORTS: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - softc->pm_ports = (done_ccb->ataio.res.lba_high << 24) + - (done_ccb->ataio.res.lba_mid << 16) + - (done_ccb->ataio.res.lba_low << 8) + - done_ccb->ataio.res.sector_count; - /* This PM declares 6 ports, while only 5 of them are real. - * Port 5 is enclosure management bridge port, which has implementation - * problems, causing probe faults. Hide it for now. */ - if (softc->pm_pid == 0x37261095 && softc->pm_ports == 6) - softc->pm_ports = 5; - /* This PM declares 7 ports, while only 5 of them are real. - * Port 5 is some fake "Config Disk" with 640 sectors size, - * port 6 is enclosure management bridge port. - * Both fake ports has implementation problems, causing - * probe faults. Hide them for now. */ - if (softc->pm_pid == 0x47261095 && softc->pm_ports == 7) - softc->pm_ports = 5; - printf("PM ports: %d\n", softc->pm_ports); - ident_buf->config = softc->pm_ports; - path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID; - softc->pm_step = 0; - PROBE_SET_ACTION(softc, PROBE_PM_RESET); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); - } - goto device_fail; - case PROBE_PM_RESET: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - softc->pm_step++; - if (softc->pm_step < softc->pm_ports) { - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else { - softc->pm_step = 0; - DELAY(5000); - printf("PM reset done\n"); - PROBE_SET_ACTION(softc, PROBE_PM_CONNECT); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); - } - goto device_fail; - case PROBE_PM_CONNECT: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - softc->pm_step++; - if (softc->pm_step < softc->pm_ports) { - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else { - softc->pm_step = 0; - softc->pm_try = 0; - printf("PM connect done\n"); - PROBE_SET_ACTION(softc, PROBE_PM_CHECK); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); - } - goto device_fail; - case PROBE_PM_CHECK: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - int res = (done_ccb->ataio.res.lba_high << 24) + - (done_ccb->ataio.res.lba_mid << 16) + - (done_ccb->ataio.res.lba_low << 8) + - done_ccb->ataio.res.sector_count; - if ((res & 0xf0f) == 0x103 && (res & 0x0f0) != 0) { - printf("PM status: %d - %08x\n", softc->pm_step, res); - ident_buf->cylinders |= (1 << softc->pm_step); - softc->pm_step++; - } else { - if (softc->pm_try < 100) { - DELAY(10000); - softc->pm_try++; - } else { - printf("PM status: %d - %08x\n", softc->pm_step, res); - ident_buf->cylinders &= ~(1 << softc->pm_step); - softc->pm_step++; - } - } - if (softc->pm_step < softc->pm_ports) { - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } else { - softc->pm_step = 0; - PROBE_SET_ACTION(softc, PROBE_PM_CLEAR); - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); - } - goto device_fail; - case PROBE_PM_CLEAR: - if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - softc->pm_step++; - if (softc->pm_step < softc->pm_ports) { - xpt_release_ccb(done_ccb); - xpt_schedule(periph, priority); - return; - } - found = ident_buf->cylinders | 0x8000; - if (path->device->flags & CAM_DEV_UNCONFIGURED) { - path->device->flags &= ~CAM_DEV_UNCONFIGURED; - done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action(done_ccb); - xpt_async(AC_FOUND_DEVICE, done_ccb->ccb_h.path, - done_ccb); - xpt_release_ccb(done_ccb); - } - break; - } else if (cam_periph_error(done_ccb, 0, 0, - &softc->saved_ccb) == ERESTART) { - return; - } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { - /* Don't wedge the queue */ - xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); - } - goto device_fail; + break; case PROBE_INVALID: CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_INFO, ("probedone: invalid action state\n")); default: break; } - done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs); - TAILQ_REMOVE(&softc->request_ccbs, &done_ccb->ccb_h, periph_links.tqe); - done_ccb->ccb_h.status = CAM_REQ_CMP; - done_ccb->ccb_h.ppriv_field1 = found; - xpt_done(done_ccb); - if (TAILQ_FIRST(&softc->request_ccbs) == NULL) { - cam_periph_invalidate(periph); - cam_periph_release_locked(periph); - } else { +done: + if (softc->restart) { + softc->restart = 0; + xpt_release_ccb(done_ccb); probeschedule(periph); + return; } + xpt_release_ccb(done_ccb); + while ((done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs))) { + TAILQ_REMOVE(&softc->request_ccbs, + &done_ccb->ccb_h, periph_links.tqe); + done_ccb->ccb_h.status = found ? CAM_REQ_CMP : CAM_REQ_CMP_ERR; + xpt_done(done_ccb); + } + cam_release_devq(periph->path, + RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_XPT + 1, FALSE); + cam_periph_invalidate(periph); + cam_periph_release_locked(periph); } static void @@ -1098,31 +997,29 @@ probecleanup(struct cam_periph *periph) } static void -scsi_find_quirk(struct cam_ed *device) +ata_find_quirk(struct cam_ed *device) { - struct scsi_quirk_entry *quirk; + struct ata_quirk_entry *quirk; caddr_t match; - match = cam_quirkmatch((caddr_t)&device->inq_data, - (caddr_t)scsi_quirk_table, - sizeof(scsi_quirk_table) / - sizeof(*scsi_quirk_table), - sizeof(*scsi_quirk_table), scsi_inquiry_match); + match = cam_quirkmatch((caddr_t)&device->ident_data, + (caddr_t)ata_quirk_table, + ata_quirk_table_size, + sizeof(*ata_quirk_table), ata_identify_match); if (match == NULL) panic("xpt_find_quirk: device didn't match wildcard entry!!"); - quirk = (struct scsi_quirk_entry *)match; + quirk = (struct ata_quirk_entry *)match; device->quirk = quirk; - device->mintags = quirk->mintags; - device->maxtags = quirk->maxtags; + if (quirk->quirks & CAM_QUIRK_MAXTAGS) + device->mintags = device->maxtags = quirk->maxtags; } typedef struct { union ccb *request_ccb; struct ccb_pathinq *cpi; int counter; - int found; } ata_scan_bus_info; /* @@ -1135,7 +1032,7 @@ ata_scan_bus(struct cam_periph *periph, union ccb *request_ccb) { struct cam_path *path; ata_scan_bus_info *scan_info; - union ccb *work_ccb; + union ccb *work_ccb, *reset_ccb; cam_status status; CAM_DEBUG(request_ccb->ccb_h.path, CAM_DEBUG_TRACE, @@ -1160,6 +1057,26 @@ ata_scan_bus(struct cam_periph *periph, union ccb *request_ccb) return; } + /* We may need to reset bus first, if we haven't done it yet. */ + if ((work_ccb->cpi.hba_inquiry & + (PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE)) && + !(work_ccb->cpi.hba_misc & PIM_NOBUSRESET) && + !timevalisset(&request_ccb->ccb_h.path->bus->last_reset)) { + reset_ccb = xpt_alloc_ccb_nowait(); + xpt_setup_ccb(&reset_ccb->ccb_h, request_ccb->ccb_h.path, + CAM_PRIORITY_NONE); + reset_ccb->ccb_h.func_code = XPT_RESET_BUS; + xpt_action(reset_ccb); + if (reset_ccb->ccb_h.status != CAM_REQ_CMP) { + request_ccb->ccb_h.status = reset_ccb->ccb_h.status; + xpt_free_ccb(reset_ccb); + xpt_free_ccb(work_ccb); + xpt_done(request_ccb); + return; + } + xpt_free_ccb(reset_ccb); + } + /* Save some state for use while we probe for devices */ scan_info = (ata_scan_bus_info *) malloc(sizeof(ata_scan_bus_info), M_CAMXPT, M_NOWAIT); @@ -1170,11 +1087,11 @@ ata_scan_bus(struct cam_periph *periph, union ccb *request_ccb) } scan_info->request_ccb = request_ccb; scan_info->cpi = &work_ccb->cpi; - scan_info->found = 0x8001; - scan_info->counter = 0; /* If PM supported, probe it first. */ if (scan_info->cpi->hba_inquiry & PI_SATAPM) - scan_info->counter = 15; + scan_info->counter = scan_info->cpi->max_target; + else + scan_info->counter = 0; work_ccb = xpt_alloc_ccb_nowait(); if (work_ccb == NULL) { @@ -1190,11 +1107,12 @@ ata_scan_bus(struct cam_periph *periph, union ccb *request_ccb) scan_info = (ata_scan_bus_info *)work_ccb->ccb_h.ppriv_ptr0; /* Free the current request path- we're done with it. */ xpt_free_path(work_ccb->ccb_h.path); - /* If there is PM... */ - if (scan_info->counter == 15) { - if (work_ccb->ccb_h.ppriv_field1 != 0) { - /* Save PM probe result. */ - scan_info->found = work_ccb->ccb_h.ppriv_field1; + /* If there is PMP... */ + if ((scan_info->cpi->hba_inquiry & PI_SATAPM) && + (scan_info->counter == scan_info->cpi->max_target)) { + if (work_ccb->ccb_h.status == CAM_REQ_CMP) { + /* everything else willbe probed by it */ + goto done; } else { struct ccb_trans_settings cts; @@ -1209,10 +1127,10 @@ ata_scan_bus(struct cam_periph *periph, union ccb *request_ccb) xpt_action((union ccb *)&cts); } } -take_next: - /* Take next device. Wrap from 15 (PM) to 0. */ - scan_info->counter = (scan_info->counter + 1 ) & 0x0f; - if (scan_info->counter >= scan_info->cpi->max_target+1) { + if (scan_info->counter == + ((scan_info->cpi->hba_inquiry & PI_SATAPM) ? + 0 : scan_info->cpi->max_target)) { +done: xpt_free_ccb(work_ccb); xpt_free_ccb((union ccb *)scan_info->cpi); request_ccb = scan_info->request_ccb; @@ -1221,6 +1139,9 @@ take_next: xpt_done(request_ccb); break; } + /* Take next device. Wrap from max (PMP) to 0. */ + scan_info->counter = (scan_info->counter + 1 ) % + (scan_info->cpi->max_target + 1); scan_next: status = xpt_create_path(&path, xpt_periph, scan_info->request_ccb->ccb_h.path_id, @@ -1237,11 +1158,6 @@ scan_next: xpt_done(request_ccb); break; } - if ((scan_info->found & (1 << scan_info->counter)) == 0) { - xpt_async(AC_LOST_DEVICE, path, NULL); - xpt_free_path(path); - goto take_next; - } xpt_setup_ccb(&work_ccb->ccb_h, path, scan_info->request_ccb->ccb_h.pinfo.priority); work_ccb->ccb_h.func_code = XPT_SCAN_LUN; @@ -1264,10 +1180,9 @@ ata_scan_lun(struct cam_periph *periph, struct cam_path *path, struct cam_path *new_path; struct cam_periph *old_periph; - CAM_DEBUG(request_ccb->ccb_h.path, CAM_DEBUG_TRACE, - ("xpt_scan_lun\n")); + CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_scan_lun\n")); - xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -1305,7 +1220,7 @@ ata_scan_lun(struct cam_periph *periph, struct cam_path *path, free(new_path, M_CAMXPT); return; } - xpt_setup_ccb(&request_ccb->ccb_h, new_path, /*priority*/ 1); + xpt_setup_ccb(&request_ccb->ccb_h, new_path, CAM_PRIORITY_XPT); request_ccb->ccb_h.cbfcnp = xptscandone; request_ccb->ccb_h.func_code = XPT_SCAN_LUN; request_ccb->crcn.flags = flags; @@ -1317,6 +1232,7 @@ ata_scan_lun(struct cam_periph *periph, struct cam_path *path, softc = (probe_softc *)old_periph->softc; TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->ccb_h, periph_links.tqe); + softc->restart = 1; } else { status = cam_periph_alloc(proberegister, NULL, probecleanup, probestart, "aprobe", @@ -1345,7 +1261,7 @@ static struct cam_ed * ata_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id) { struct cam_path path; - struct scsi_quirk_entry *quirk; + struct ata_quirk_entry *quirk; struct cam_ed *device; struct cam_ed *cur_device; @@ -1357,10 +1273,10 @@ ata_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id) * Take the default quirk entry until we have inquiry * data and can determine a better quirk to use. */ - quirk = &scsi_quirk_table[scsi_quirk_table_size - 1]; + quirk = &ata_quirk_table[ata_quirk_table_size - 1]; device->quirk = (void *)quirk; - device->mintags = quirk->mintags; - device->maxtags = quirk->maxtags; + device->mintags = 0; + device->maxtags = 0; bzero(&device->inq_data, sizeof(device->inq_data)); device->inq_flags = 0; device->queue_flags = 0; @@ -1399,71 +1315,32 @@ static void ata_device_transport(struct cam_path *path) { struct ccb_pathinq cpi; -// struct ccb_trans_settings cts; - struct scsi_inquiry_data *inq_buf; + struct ccb_trans_settings cts; + struct scsi_inquiry_data *inq_buf = NULL; + struct ata_params *ident_buf = NULL; /* Get transport information from the SIM */ - xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); - inq_buf = NULL; -// if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0) -// inq_buf = &path->device->inq_data; -// path->device->protocol = cpi.protocol; -// path->device->protocol_version = -// inq_buf != NULL ? SID_ANSI_REV(inq_buf) : cpi.protocol_version; path->device->transport = cpi.transport; - path->device->transport_version = cpi.transport_version; -#if 0 - /* - * Any device not using SPI3 features should - * be considered SPI2 or lower. - */ - if (inq_buf != NULL) { - if (path->device->transport == XPORT_SPI - && (inq_buf->spi3data & SID_SPI_MASK) == 0 - && path->device->transport_version > 2) - path->device->transport_version = 2; - } else { - struct cam_ed* otherdev; - - for (otherdev = TAILQ_FIRST(&path->target->ed_entries); - otherdev != NULL; - otherdev = TAILQ_NEXT(otherdev, links)) { - if (otherdev != path->device) - break; - } - - if (otherdev != NULL) { - /* - * Initially assume the same versioning as - * prior luns for this target. - */ - path->device->protocol_version = - otherdev->protocol_version; - path->device->transport_version = - otherdev->transport_version; - } else { - /* Until we know better, opt for safty */ - path->device->protocol_version = 2; - if (path->device->transport == XPORT_SPI) - path->device->transport_version = 2; - else - path->device->transport_version = 0; - } + if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0) + inq_buf = &path->device->inq_data; + if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) != 0) + ident_buf = &path->device->ident_data; + if (path->device->protocol == PROTO_ATA) { + path->device->protocol_version = ident_buf ? + ata_version(ident_buf->version_major) : cpi.protocol_version; + } else if (path->device->protocol == PROTO_SCSI) { + path->device->protocol_version = inq_buf ? + SID_ANSI_REV(inq_buf) : cpi.protocol_version; } - - /* - * XXX - * For a device compliant with SPC-2 we should be able - * to determine the transport version supported by - * scrutinizing the version descriptors in the - * inquiry buffer. - */ + path->device->transport_version = ident_buf ? + ata_version(ident_buf->version_major) : cpi.transport_version; /* Tell the controller what we think */ - xpt_setup_ccb(&cts.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; cts.type = CTS_TYPE_CURRENT_SETTINGS; cts.transport = path->device->transport; @@ -1471,9 +1348,21 @@ ata_device_transport(struct cam_path *path) cts.protocol = path->device->protocol; cts.protocol_version = path->device->protocol_version; cts.proto_specific.valid = 0; - cts.xport_specific.valid = 0; + if (ident_buf) { + if (path->device->transport == XPORT_ATA) { + cts.xport_specific.ata.atapi = + ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 : + ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0; + cts.xport_specific.ata.valid = CTS_ATA_VALID_ATAPI; + } else { + cts.xport_specific.sata.atapi = + ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 : + ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0; + cts.xport_specific.sata.valid = CTS_SATA_VALID_ATAPI; + } + } else + cts.xport_specific.valid = 0; xpt_action((union ccb *)&cts); -#endif } static void @@ -1483,7 +1372,7 @@ ata_action(union ccb *start_ccb) switch (start_ccb->ccb_h.func_code) { case XPT_SET_TRAN_SETTINGS: { - scsi_set_transfer_settings(&start_ccb->cts, + ata_set_transfer_settings(&start_ccb->cts, start_ccb->ccb_h.path->device, /*async_update*/FALSE); break; @@ -1504,6 +1393,27 @@ ata_action(union ccb *start_ccb) (*(sim->sim_action))(sim, start_ccb); break; } + case XPT_SCSI_IO: + { + struct cam_ed *device; + u_int maxlen = 0; + + device = start_ccb->ccb_h.path->device; + if (device->protocol == PROTO_SCSI && + (device->flags & CAM_DEV_IDENTIFY_DATA_VALID)) { + uint16_t p = + device->ident_data.config & ATA_PROTO_MASK; + + maxlen = (p == ATA_PROTO_ATAPI_16) ? 16 : + (p == ATA_PROTO_ATAPI_12) ? 12 : 0; + } + if (start_ccb->csio.cdb_len > maxlen) { + start_ccb->ccb_h.status = CAM_REQ_INVALID; + xpt_done(start_ccb); + break; + } + /* FALLTHROUGH */ + } default: xpt_action_default(start_ccb); break; @@ -1511,7 +1421,7 @@ ata_action(union ccb *start_ccb) } static void -scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, +ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, int async_update) { struct ccb_pathinq cpi; @@ -1592,7 +1502,7 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device inq_data = &device->inq_data; scsi = &cts->proto_specific.scsi; - xpt_setup_ccb(&cpi.ccb_h, cts->ccb_h.path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -1613,7 +1523,7 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device * Perform sanity checking against what the * controller and device can do. */ - xpt_setup_ccb(&cur_cts.ccb_h, cts->ccb_h.path, /*priority*/1); + xpt_setup_ccb(&cur_cts.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE); cur_cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; cur_cts.type = cts->type; xpt_action((union ccb *)&cur_cts); @@ -1629,114 +1539,6 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; } - /* SPI specific sanity checking */ - if (cts->transport == XPORT_SPI && async_update == FALSE) { - u_int spi3caps; - struct ccb_trans_settings_spi *spi; - struct ccb_trans_settings_spi *cur_spi; - - spi = &cts->xport_specific.spi; - - cur_spi = &cur_cts.xport_specific.spi; - - /* Fill in any gaps in what the user gave us */ - if ((spi->valid & CTS_SPI_VALID_SYNC_RATE) == 0) - spi->sync_period = cur_spi->sync_period; - if ((cur_spi->valid & CTS_SPI_VALID_SYNC_RATE) == 0) - spi->sync_period = 0; - if ((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) == 0) - spi->sync_offset = cur_spi->sync_offset; - if ((cur_spi->valid & CTS_SPI_VALID_SYNC_OFFSET) == 0) - spi->sync_offset = 0; - if ((spi->valid & CTS_SPI_VALID_PPR_OPTIONS) == 0) - spi->ppr_options = cur_spi->ppr_options; - if ((cur_spi->valid & CTS_SPI_VALID_PPR_OPTIONS) == 0) - spi->ppr_options = 0; - if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) == 0) - spi->bus_width = cur_spi->bus_width; - if ((cur_spi->valid & CTS_SPI_VALID_BUS_WIDTH) == 0) - spi->bus_width = 0; - if ((spi->valid & CTS_SPI_VALID_DISC) == 0) { - spi->flags &= ~CTS_SPI_FLAGS_DISC_ENB; - spi->flags |= cur_spi->flags & CTS_SPI_FLAGS_DISC_ENB; - } - if ((cur_spi->valid & CTS_SPI_VALID_DISC) == 0) - spi->flags &= ~CTS_SPI_FLAGS_DISC_ENB; - if (((device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0 - && (inq_data->flags & SID_Sync) == 0 - && cts->type == CTS_TYPE_CURRENT_SETTINGS) - || ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0)) { - /* Force async */ - spi->sync_period = 0; - spi->sync_offset = 0; - } - - switch (spi->bus_width) { - case MSG_EXT_WDTR_BUS_32_BIT: - if (((device->flags & CAM_DEV_INQUIRY_DATA_VALID) == 0 - || (inq_data->flags & SID_WBus32) != 0 - || cts->type == CTS_TYPE_USER_SETTINGS) - && (cpi.hba_inquiry & PI_WIDE_32) != 0) - break; - /* Fall Through to 16-bit */ - case MSG_EXT_WDTR_BUS_16_BIT: - if (((device->flags & CAM_DEV_INQUIRY_DATA_VALID) == 0 - || (inq_data->flags & SID_WBus16) != 0 - || cts->type == CTS_TYPE_USER_SETTINGS) - && (cpi.hba_inquiry & PI_WIDE_16) != 0) { - spi->bus_width = MSG_EXT_WDTR_BUS_16_BIT; - break; - } - /* Fall Through to 8-bit */ - default: /* New bus width?? */ - case MSG_EXT_WDTR_BUS_8_BIT: - /* All targets can do this */ - spi->bus_width = MSG_EXT_WDTR_BUS_8_BIT; - break; - } - - spi3caps = cpi.xport_specific.spi.ppr_options; - if ((device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0 - && cts->type == CTS_TYPE_CURRENT_SETTINGS) - spi3caps &= inq_data->spi3data; - - if ((spi3caps & SID_SPI_CLOCK_DT) == 0) - spi->ppr_options &= ~MSG_EXT_PPR_DT_REQ; - - if ((spi3caps & SID_SPI_IUS) == 0) - spi->ppr_options &= ~MSG_EXT_PPR_IU_REQ; - - if ((spi3caps & SID_SPI_QAS) == 0) - spi->ppr_options &= ~MSG_EXT_PPR_QAS_REQ; - - /* No SPI Transfer settings are allowed unless we are wide */ - if (spi->bus_width == 0) - spi->ppr_options = 0; - - if ((spi->valid & CTS_SPI_VALID_DISC) - && ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) == 0)) { - /* - * Can't tag queue without disconnection. - */ - scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; - scsi->valid |= CTS_SCSI_VALID_TQ; - } - - /* - * If we are currently performing tagged transactions to - * this device and want to change its negotiation parameters, - * go non-tagged for a bit to give the controller a chance to - * negotiate unhampered by tag messages. - */ - if (cts->type == CTS_TYPE_CURRENT_SETTINGS - && (device->inq_flags & SID_CmdQue) != 0 - && (scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0 - && (spi->flags & (CTS_SPI_VALID_SYNC_RATE| - CTS_SPI_VALID_SYNC_OFFSET| - CTS_SPI_VALID_BUS_WIDTH)) != 0) - scsi_toggle_tags(cts->ccb_h.path); - } - if (cts->type == CTS_TYPE_CURRENT_SETTINGS && (scsi->valid & CTS_SCSI_VALID_TQ) != 0) { int device_tagenb; @@ -1771,24 +1573,7 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device device->tag_delay_count = CAM_TAG_DELAY_COUNT; device->flags |= CAM_DEV_TAG_AFTER_COUNT; } else { - struct ccb_relsim crs; - - xpt_freeze_devq(cts->ccb_h.path, /*count*/1); - device->inq_flags &= ~SID_CmdQue; - xpt_dev_ccbq_resize(cts->ccb_h.path, - sim->max_dev_openings); - device->flags &= ~CAM_DEV_TAG_AFTER_COUNT; - device->tag_delay_count = 0; - - xpt_setup_ccb(&crs.ccb_h, cts->ccb_h.path, - /*priority*/1); - crs.ccb_h.func_code = XPT_REL_SIMQ; - crs.release_flags = RELSIM_RELEASE_AFTER_QEMPTY; - crs.openings - = crs.release_timeout - = crs.qfrozen_cnt - = 0; - xpt_action((union ccb *)&crs); + xpt_stop_tags(cts->ccb_h.path); } } } @@ -1796,39 +1581,6 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device (*(sim->sim_action))(sim, (union ccb *)cts); } -static void -scsi_toggle_tags(struct cam_path *path) -{ - struct cam_ed *dev; - - /* - * Give controllers a chance to renegotiate - * before starting tag operations. We - * "toggle" tagged queuing off then on - * which causes the tag enable command delay - * counter to come into effect. - */ - dev = path->device; - if ((dev->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 - || ((dev->inq_flags & SID_CmdQue) != 0 - && (dev->inq_flags & (SID_Sync|SID_WBus16|SID_WBus32)) != 0)) { - struct ccb_trans_settings cts; - - xpt_setup_ccb(&cts.ccb_h, path, 1); - cts.protocol = PROTO_SCSI; - cts.protocol_version = PROTO_VERSION_UNSPECIFIED; - cts.transport = XPORT_UNSPECIFIED; - cts.transport_version = XPORT_VERSION_UNSPECIFIED; - cts.proto_specific.scsi.flags = 0; - cts.proto_specific.scsi.valid = CTS_SCSI_VALID_TQ; - scsi_set_transfer_settings(&cts, path->device, - /*async_update*/TRUE); - cts.proto_specific.scsi.flags = CTS_SCSI_FLAGS_TAG_ENB; - scsi_set_transfer_settings(&cts, path->device, - /*async_update*/TRUE); - } -} - /* * Handle any per-device event notifications that require action by the XPT. */ @@ -1861,15 +1613,6 @@ ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, status = CAM_REQ_CMP_ERR; if (status == CAM_REQ_CMP) { - - /* - * Allow transfer negotiation to occur in a - * tag free environment. - */ - if (async_code == AC_SENT_BDR - || async_code == AC_BUS_RESET) - scsi_toggle_tags(&newpath); - if (async_code == AC_INQ_CHANGED) { /* * We've sent a start unit command, or @@ -1880,16 +1623,101 @@ ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, */ ata_scan_lun(newpath.periph, &newpath, CAM_EXPECT_INQ_CHANGE, NULL); + } else { + /* We need to reinitialize device after reset. */ + ata_scan_lun(newpath.periph, &newpath, + 0, NULL); } xpt_release_path(&newpath); - } else if (async_code == AC_LOST_DEVICE) { + } else if (async_code == AC_LOST_DEVICE && + (device->flags & CAM_DEV_UNCONFIGURED) == 0) { device->flags |= CAM_DEV_UNCONFIGURED; + xpt_release_device(device); } else if (async_code == AC_TRANSFER_NEG) { struct ccb_trans_settings *settings; settings = (struct ccb_trans_settings *)async_arg; - scsi_set_transfer_settings(settings, device, + ata_set_transfer_settings(settings, device, /*async_update*/TRUE); } } +static void +ata_announce_periph(struct cam_periph *periph) +{ + struct ccb_pathinq cpi; + struct ccb_trans_settings cts; + struct cam_path *path = periph->path; + u_int speed; + u_int mb; + + mtx_assert(periph->sim->mtx, MA_OWNED); + + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + xpt_action((union ccb*)&cts); + if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) + return; + /* Ask the SIM for its base transfer speed */ + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NORMAL); + cpi.ccb_h.func_code = XPT_PATH_INQ; + xpt_action((union ccb *)&cpi); + /* Report connection speed */ + speed = cpi.base_transfer_speed; + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_ATA) { + struct ccb_trans_settings_ata *ata = + &cts.xport_specific.ata; + + if (ata->valid & CTS_ATA_VALID_MODE) + speed = ata_mode2speed(ata->mode); + } + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) { + struct ccb_trans_settings_sata *sata = + &cts.xport_specific.sata; + + if (sata->valid & CTS_SATA_VALID_REVISION) + speed = ata_revision2speed(sata->revision); + } + mb = speed / 1000; + if (mb > 0) + printf("%s%d: %d.%03dMB/s transfers", + periph->periph_name, periph->unit_number, + mb, speed % 1000); + else + printf("%s%d: %dKB/s transfers", periph->periph_name, + periph->unit_number, speed); + /* Report additional information about connection */ + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_ATA) { + struct ccb_trans_settings_ata *ata = + &cts.xport_specific.ata; + + printf(" ("); + if (ata->valid & CTS_ATA_VALID_MODE) + printf("%s, ", ata_mode2string(ata->mode)); + if ((ata->valid & CTS_ATA_VALID_ATAPI) && ata->atapi != 0) + printf("ATAPI %dbytes, ", ata->atapi); + if (ata->valid & CTS_ATA_VALID_BYTECOUNT) + printf("PIO %dbytes", ata->bytecount); + printf(")"); + } + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) { + struct ccb_trans_settings_sata *sata = + &cts.xport_specific.sata; + + printf(" ("); + if (sata->valid & CTS_SATA_VALID_REVISION) + printf("SATA %d.x, ", sata->revision); + else + printf("SATA, "); + if (sata->valid & CTS_SATA_VALID_MODE) + printf("%s, ", ata_mode2string(sata->mode)); + if ((sata->valid & CTS_ATA_VALID_ATAPI) && sata->atapi != 0) + printf("ATAPI %dbytes, ", sata->atapi); + if (sata->valid & CTS_SATA_VALID_BYTECOUNT) + printf("PIO %dbytes", sata->bytecount); + printf(")"); + } + printf("\n"); +} + diff --git a/sys/cam/cam.c b/sys/cam/cam.c index 120050a52772..88271b0684bc 100644 --- a/sys/cam/cam.c +++ b/sys/cam/cam.c @@ -165,8 +165,12 @@ cam_strmatch(const u_int8_t *str, const u_int8_t *pattern, int str_len) str++; str_len--; } - while (str_len > 0 && *str++ == ' ') + while (str_len > 0 && *str == ' ') { + str++; str_len--; + } + if (str_len > 0 && *str == 0) + str_len = 0; return (str_len); } @@ -229,6 +233,21 @@ cam_error_string(struct cam_device *device, union ccb *ccb, char *str, return(NULL); switch (ccb->ccb_h.func_code) { + case XPT_ATA_IO: + switch (proto_flags & CAM_EPF_LEVEL_MASK) { + case CAM_EPF_NONE: + break; + case CAM_EPF_ALL: + case CAM_EPF_NORMAL: + proto_flags |= CAM_EAF_PRINT_RESULT; + /* FALLTHROUGH */ + case CAM_EPF_MINIMAL: + proto_flags |= CAM_EAF_PRINT_STATUS; + /* FALLTHROUGH */ + default: + break; + } + break; case XPT_SCSI_IO: switch (proto_flags & CAM_EPF_LEVEL_MASK) { case CAM_EPF_NONE: @@ -256,10 +275,12 @@ cam_error_string(struct cam_device *device, union ccb *ccb, char *str, sbuf_new(&sb, str, str_len, 0); if (flags & CAM_ESF_COMMAND) { - sbuf_cat(&sb, path_str); - switch (ccb->ccb_h.func_code) { + case XPT_ATA_IO: + ata_command_sbuf(&ccb->ataio, &sb); + sbuf_printf(&sb, "\n"); + break; case XPT_SCSI_IO: #ifdef _KERNEL scsi_command_string(&ccb->csio, &sb); @@ -267,7 +288,6 @@ cam_error_string(struct cam_device *device, union ccb *ccb, char *str, scsi_command_string(device, &ccb->csio, &sb); #endif /* _KERNEL/!_KERNEL */ sbuf_printf(&sb, "\n"); - break; default: break; @@ -285,16 +305,32 @@ cam_error_string(struct cam_device *device, union ccb *ccb, char *str, entry = cam_fetch_status_entry(status); if (entry == NULL) - sbuf_printf(&sb, "CAM Status: Unknown (%#x)\n", + sbuf_printf(&sb, "CAM status: Unknown (%#x)\n", ccb->ccb_h.status); else - sbuf_printf(&sb, "CAM Status: %s\n", + sbuf_printf(&sb, "CAM status: %s\n", entry->status_text); } if (flags & CAM_ESF_PROTO_STATUS) { switch (ccb->ccb_h.func_code) { + case XPT_ATA_IO: + if ((ccb->ccb_h.status & CAM_STATUS_MASK) != + CAM_ATA_STATUS_ERROR) + break; + if (proto_flags & CAM_EAF_PRINT_STATUS) { + sbuf_cat(&sb, path_str); + ata_status_sbuf(&ccb->ataio, &sb); + sbuf_printf(&sb, "\n"); + } + if (proto_flags & CAM_EAF_PRINT_RESULT) { + sbuf_cat(&sb, path_str); + ata_res_sbuf(&ccb->ataio, &sb); + sbuf_printf(&sb, "\n"); + } + + break; case XPT_SCSI_IO: if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_SCSI_STATUS_ERROR) @@ -302,11 +338,7 @@ cam_error_string(struct cam_device *device, union ccb *ccb, char *str, if (proto_flags & CAM_ESF_PRINT_STATUS) { sbuf_cat(&sb, path_str); - /* - * Print out the SCSI status byte as long as - * the user wants some protocol output. - */ - sbuf_printf(&sb, "SCSI Status: %s\n", + sbuf_printf(&sb, "SCSI status: %s\n", scsi_status_string(&ccb->csio)); } diff --git a/sys/cam/cam.h b/sys/cam/cam.h index 36ad88a77cf3..2b3b98cba603 100644 --- a/sys/cam/cam.h +++ b/sys/cam/cam.h @@ -60,13 +60,29 @@ typedef u_int lun_id_t; struct cam_periph; /* - * Priority information for a CAM structure. The generation number is - * incremented everytime a new entry is entered into the queue giving round - * robin per priority level scheduling. + * Priority information for a CAM structure. + */ +typedef enum { + CAM_RL_HOST, + CAM_RL_BUS, + CAM_RL_XPT, + CAM_RL_DEV, + CAM_RL_NORMAL, + CAM_RL_VALUES +} cam_rl; +/* + * The generation number is incremented everytime a new entry is entered into + * the queue giving round robin per priority level scheduling. */ typedef struct { u_int32_t priority; +#define CAM_PRIORITY_HOST ((CAM_RL_HOST << 8) + 0x80) +#define CAM_PRIORITY_BUS ((CAM_RL_BUS << 8) + 0x80) +#define CAM_PRIORITY_XPT ((CAM_RL_XPT << 8) + 0x80) +#define CAM_PRIORITY_DEV ((CAM_RL_DEV << 8) + 0x80) +#define CAM_PRIORITY_NORMAL ((CAM_RL_NORMAL << 8) + 0x80) #define CAM_PRIORITY_NONE (u_int32_t)-1 +#define CAM_PRIORITY_TO_RL(x) ((x) >> 8) u_int32_t generation; int index; #define CAM_UNQUEUED_INDEX -1 @@ -181,6 +197,12 @@ typedef enum { CAM_ESF_PRINT_SENSE = 0x20 } cam_error_scsi_flags; +typedef enum { + CAM_EAF_PRINT_NONE = 0x00, + CAM_EAF_PRINT_STATUS = 0x10, + CAM_EAF_PRINT_RESULT = 0x20 +} cam_error_ata_flags; + struct cam_status_entry { cam_status status_code; diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h index a750d935f43f..2810c545f71a 100644 --- a/sys/cam/cam_ccb.h +++ b/sys/cam/cam_ccb.h @@ -126,7 +126,7 @@ typedef enum { XPT_PATH_INQ = 0x04, /* Path routing inquiry */ XPT_REL_SIMQ = 0x05, - /* Release a frozen SIM queue */ + /* Release a frozen device queue */ XPT_SASYNC_CB = 0x06, /* Set Asynchronous Callback Parameters */ XPT_SDEV_TYPE = 0x07, @@ -142,6 +142,8 @@ typedef enum { /* Path statistics (error counts, etc.) */ XPT_GDEV_STATS = 0x0c, /* Device statistics (error counts, etc.) */ + XPT_FREEZE_QUEUE = 0x0d, + /* Freeze device queue */ /* SCSI Control Functions: 0x10->0x1F */ XPT_ABORT = 0x10, /* Abort the specified CCB */ @@ -307,7 +309,7 @@ struct ccb_getdev { struct scsi_inquiry_data inq_data; struct ata_params ident_data; u_int8_t serial_num[252]; - u_int8_t reserved; + u_int8_t inq_flags; u_int8_t serial_num_len; }; @@ -685,8 +687,9 @@ struct ccb_relsim { #define RELSIM_RELEASE_AFTER_TIMEOUT 0x02 #define RELSIM_RELEASE_AFTER_CMDCMPLT 0x04 #define RELSIM_RELEASE_AFTER_QEMPTY 0x08 +#define RELSIM_RELEASE_RUNLEVEL 0x10 u_int32_t openings; - u_int32_t release_timeout; + u_int32_t release_timeout; /* Abstract argument. */ u_int32_t qfrozen_cnt; }; @@ -816,12 +819,30 @@ struct ccb_trans_settings_sas { u_int32_t bitrate; /* Mbps */ }; +struct ccb_trans_settings_ata { + u_int valid; /* Which fields to honor */ +#define CTS_ATA_VALID_MODE 0x01 +#define CTS_ATA_VALID_BYTECOUNT 0x02 +#define CTS_ATA_VALID_ATAPI 0x20 + int mode; /* Mode */ + u_int bytecount; /* Length of PIO transaction */ + u_int atapi; /* Length of ATAPI CDB */ +}; + struct ccb_trans_settings_sata { u_int valid; /* Which fields to honor */ -#define CTS_SATA_VALID_SPEED 0x01 -#define CTS_SATA_VALID_PM 0x02 - u_int32_t bitrate; /* Mbps */ +#define CTS_SATA_VALID_MODE 0x01 +#define CTS_SATA_VALID_BYTECOUNT 0x02 +#define CTS_SATA_VALID_REVISION 0x04 +#define CTS_SATA_VALID_PM 0x08 +#define CTS_SATA_VALID_TAGS 0x10 +#define CTS_SATA_VALID_ATAPI 0x20 + int mode; /* Legacy PATA mode */ + u_int bytecount; /* Length of PIO transaction */ + int revision; /* SATA revision */ u_int pm_present; /* PM is present (XPT->SIM) */ + u_int tags; /* Number of allowed tags */ + u_int atapi; /* Length of ATAPI CDB */ }; /* Get/Set transfer rate/width/disconnection/tag queueing settings */ @@ -841,6 +862,7 @@ struct ccb_trans_settings { struct ccb_trans_settings_spi spi; struct ccb_trans_settings_fc fc; struct ccb_trans_settings_sas sas; + struct ccb_trans_settings_ata ata; struct ccb_trans_settings_sata sata; } xport_specific; }; diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c index 9137c55d1061..4c7502ae877e 100644 --- a/sys/cam/cam_periph.c +++ b/sys/cam/cam_periph.c @@ -71,19 +71,20 @@ static void camperiphfree(struct cam_periph *periph); static int camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, u_int32_t sense_flags, - union ccb *save_ccb, int *openings, u_int32_t *relsim_flags, - u_int32_t *timeout); + u_int32_t *timeout, + const char **action_string); static int camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, u_int32_t sense_flags, - union ccb *save_ccb, int *openings, u_int32_t *relsim_flags, - u_int32_t *timeout); + u_int32_t *timeout, + const char **action_string); static int nperiph_drivers; +static int initialized = 0; struct periph_driver **periph_drivers; MALLOC_DEFINE(M_CAMPERIPH, "CAM periph", "CAM peripheral buffers"); @@ -99,6 +100,7 @@ TUNABLE_INT("kern.cam.periph_busy_delay", &periph_busy_delay); void periphdriver_register(void *data) { + struct periph_driver *drv = (struct periph_driver *)data; struct periph_driver **newdrivers, **old; int ndrivers; @@ -108,13 +110,30 @@ periphdriver_register(void *data) if (periph_drivers) bcopy(periph_drivers, newdrivers, sizeof(*newdrivers) * nperiph_drivers); - newdrivers[nperiph_drivers] = (struct periph_driver *)data; + newdrivers[nperiph_drivers] = drv; newdrivers[nperiph_drivers + 1] = NULL; old = periph_drivers; periph_drivers = newdrivers; if (old) free(old, M_CAMPERIPH); nperiph_drivers++; + /* If driver marked as early or it is late now, initialize it. */ + if (((drv->flags & CAM_PERIPH_DRV_EARLY) != 0 && initialized > 0) || + initialized > 1) + (*drv->init)(); +} + +void +periphdriver_init(int level) +{ + int i, early; + + initialized = max(initialized, level); + for (i = 0; periph_drivers[i] != NULL; i++) { + early = (periph_drivers[i]->flags & CAM_PERIPH_DRV_EARLY) ? 1 : 2; + if (early == initialized) + (*periph_drivers[i]->init)(); + } } cam_status @@ -534,13 +553,13 @@ camperiphfree(struct cam_periph *periph) switch (periph->deferred_ac) { case AC_FOUND_DEVICE: ccb.ccb_h.func_code = XPT_GDEV_TYPE; - xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/ 1); + xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); xpt_action(&ccb); arg = &ccb; break; case AC_PATH_REGISTERED: ccb.ccb_h.func_code = XPT_PATH_INQ; - xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/ 1); + xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); xpt_action(&ccb); arg = &ccb; break; @@ -831,10 +850,10 @@ cam_periph_ioctl(struct cam_periph *periph, u_long cmd, caddr_t addr, switch(cmd){ case CAMGETPASSTHRU: - ccb = cam_periph_getccb(periph, /* priority */ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path, - /*priority*/1); + CAM_PRIORITY_NORMAL); ccb->ccb_h.func_code = XPT_GDEVLIST; /* @@ -898,7 +917,8 @@ cam_periph_runccb(union ccb *ccb, * If the user has supplied a stats structure, and if we understand * this particular type of ccb, record the transaction start. */ - if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO)) + if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO || + ccb->ccb_h.func_code == XPT_ATA_IO)) devstat_start_transaction(ds, NULL); xpt_action(ccb); @@ -914,22 +934,36 @@ cam_periph_runccb(union ccb *ccb, } while (error == ERESTART); - if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) + if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { cam_release_devq(ccb->ccb_h.path, /* relsim_flags */0, /* openings */0, /* timeout */0, /* getcount_only */ FALSE); + ccb->ccb_h.status &= ~CAM_DEV_QFRZN; + } - if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO)) - devstat_end_transaction(ds, + if (ds != NULL) { + if (ccb->ccb_h.func_code == XPT_SCSI_IO) { + devstat_end_transaction(ds, ccb->csio.dxfer_len, - ccb->csio.tag_action & 0xf, + ccb->csio.tag_action & 0x3, ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE) ? DEVSTAT_NO_DATA : (ccb->ccb_h.flags & CAM_DIR_OUT) ? DEVSTAT_WRITE : DEVSTAT_READ, NULL, NULL); + } else if (ccb->ccb_h.func_code == XPT_ATA_IO) { + devstat_end_transaction(ds, + ccb->ataio.dxfer_len, + ccb->ataio.tag_action & 0x3, + ((ccb->ccb_h.flags & CAM_DIR_MASK) == + CAM_DIR_NONE) ? DEVSTAT_NO_DATA : + (ccb->ccb_h.flags & CAM_DIR_OUT) ? + DEVSTAT_WRITE : + DEVSTAT_READ, NULL, NULL); + } + } return(error); } @@ -937,67 +971,137 @@ cam_periph_runccb(union ccb *ccb, void cam_freeze_devq(struct cam_path *path) { - struct ccb_hdr ccb_h; - xpt_setup_ccb(&ccb_h, path, /*priority*/1); - ccb_h.func_code = XPT_NOOP; - ccb_h.flags = CAM_DEV_QFREEZE; - xpt_action((union ccb *)&ccb_h); + cam_freeze_devq_arg(path, 0, 0); +} + +void +cam_freeze_devq_arg(struct cam_path *path, uint32_t flags, uint32_t arg) +{ + struct ccb_relsim crs; + + xpt_setup_ccb(&crs.ccb_h, path, CAM_PRIORITY_NONE); + crs.ccb_h.func_code = XPT_FREEZE_QUEUE; + crs.release_flags = flags; + crs.openings = arg; + crs.release_timeout = arg; + xpt_action((union ccb *)&crs); } u_int32_t cam_release_devq(struct cam_path *path, u_int32_t relsim_flags, - u_int32_t openings, u_int32_t timeout, + u_int32_t openings, u_int32_t arg, int getcount_only) { struct ccb_relsim crs; - xpt_setup_ccb(&crs.ccb_h, path, - /*priority*/1); + xpt_setup_ccb(&crs.ccb_h, path, CAM_PRIORITY_NORMAL); crs.ccb_h.func_code = XPT_REL_SIMQ; crs.ccb_h.flags = getcount_only ? CAM_DEV_QFREEZE : 0; crs.release_flags = relsim_flags; crs.openings = openings; - crs.release_timeout = timeout; + crs.release_timeout = arg; xpt_action((union ccb *)&crs); return (crs.qfrozen_cnt); } #define saved_ccb_ptr ppriv_ptr0 +#define recovery_depth ppriv_field1 +static void +camperiphsensedone(struct cam_periph *periph, union ccb *done_ccb) +{ + union ccb *saved_ccb = (union ccb *)done_ccb->ccb_h.saved_ccb_ptr; + cam_status status; + int frozen = 0; + u_int sense_key; + int depth = done_ccb->ccb_h.recovery_depth; + + status = done_ccb->ccb_h.status; + if (status & CAM_DEV_QFRZN) { + frozen = 1; + /* + * Clear freeze flag now for case of retry, + * freeze will be dropped later. + */ + done_ccb->ccb_h.status &= ~CAM_DEV_QFRZN; + } + status &= CAM_STATUS_MASK; + switch (status) { + case CAM_REQ_CMP: + { + /* + * If we manually retrieved sense into a CCB and got + * something other than "NO SENSE" send the updated CCB + * back to the client via xpt_done() to be processed via + * the error recovery code again. + */ + sense_key = saved_ccb->csio.sense_data.flags; + sense_key &= SSD_KEY; + if (sense_key != SSD_KEY_NO_SENSE) { + saved_ccb->ccb_h.status |= + CAM_AUTOSNS_VALID; + } else { + saved_ccb->ccb_h.status &= + ~CAM_STATUS_MASK; + saved_ccb->ccb_h.status |= + CAM_AUTOSENSE_FAIL; + } + bcopy(saved_ccb, done_ccb, sizeof(union ccb)); + xpt_free_ccb(saved_ccb); + break; + } + default: + bcopy(saved_ccb, done_ccb, sizeof(union ccb)); + xpt_free_ccb(saved_ccb); + done_ccb->ccb_h.status &= ~CAM_STATUS_MASK; + done_ccb->ccb_h.status |= CAM_AUTOSENSE_FAIL; + break; + } + periph->flags &= ~CAM_PERIPH_SENSE_INPROG; + /* + * If it is the end of recovery, drop freeze, taken due to + * CAM_DEV_QFREEZE flag, set on recovery request. + */ + if (depth == 0) { + cam_release_devq(done_ccb->ccb_h.path, + /*relsim_flags*/0, + /*openings*/0, + /*timeout*/0, + /*getcount_only*/0); + } + /* + * Copy frozen flag from recovery request if it is set there + * for some reason. + */ + if (frozen != 0) + done_ccb->ccb_h.status |= CAM_DEV_QFRZN; + (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb); +} + static void camperiphdone(struct cam_periph *periph, union ccb *done_ccb) { - union ccb *saved_ccb; + union ccb *saved_ccb, *save_ccb; cam_status status; - int frozen; - int sense; + int frozen = 0; struct scsi_start_stop_unit *scsi_cmd; u_int32_t relsim_flags, timeout; - u_int32_t qfrozen_cnt; - int xpt_done_ccb; - xpt_done_ccb = FALSE; status = done_ccb->ccb_h.status; - frozen = (status & CAM_DEV_QFRZN) != 0; - sense = (status & CAM_AUTOSNS_VALID) != 0; - status &= CAM_STATUS_MASK; + if (status & CAM_DEV_QFRZN) { + frozen = 1; + /* + * Clear freeze flag now for case of retry, + * freeze will be dropped later. + */ + done_ccb->ccb_h.status &= ~CAM_DEV_QFRZN; + } timeout = 0; relsim_flags = 0; saved_ccb = (union ccb *)done_ccb->ccb_h.saved_ccb_ptr; - /* - * Unfreeze the queue once if it is already frozen.. - */ - if (frozen != 0) { - qfrozen_cnt = cam_release_devq(done_ccb->ccb_h.path, - /*relsim_flags*/0, - /*openings*/0, - /*timeout*/0, - /*getcount_only*/0); - } - - switch (status) { + switch (status & CAM_STATUS_MASK) { case CAM_REQ_CMP: { /* @@ -1006,57 +1110,19 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb) * the inquiry information. Many devices (mostly disks) * don't properly report their inquiry information unless * they are spun up. - * - * If we manually retrieved sense into a CCB and got - * something other than "NO SENSE" send the updated CCB - * back to the client via xpt_done() to be processed via - * the error recovery code again. */ - if (done_ccb->ccb_h.func_code == XPT_SCSI_IO) { - scsi_cmd = (struct scsi_start_stop_unit *) - &done_ccb->csio.cdb_io.cdb_bytes; + scsi_cmd = (struct scsi_start_stop_unit *) + &done_ccb->csio.cdb_io.cdb_bytes; - if (scsi_cmd->opcode == START_STOP_UNIT) - xpt_async(AC_INQ_CHANGED, - done_ccb->ccb_h.path, NULL); - if (scsi_cmd->opcode == REQUEST_SENSE) { - u_int sense_key; - - sense_key = saved_ccb->csio.sense_data.flags; - sense_key &= SSD_KEY; - if (sense_key != SSD_KEY_NO_SENSE) { - saved_ccb->ccb_h.status |= - CAM_AUTOSNS_VALID; -#if 0 - xpt_print(saved_ccb->ccb_h.path, - "Recovered Sense\n"); - scsi_sense_print(&saved_ccb->csio); - cam_error_print(saved_ccb, CAM_ESF_ALL, - CAM_EPF_ALL); -#endif - } else { - saved_ccb->ccb_h.status &= - ~CAM_STATUS_MASK; - saved_ccb->ccb_h.status |= - CAM_AUTOSENSE_FAIL; - } - xpt_done_ccb = TRUE; - } - } - bcopy(done_ccb->ccb_h.saved_ccb_ptr, done_ccb, - sizeof(union ccb)); - - periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; - - if (xpt_done_ccb == FALSE) - xpt_action(done_ccb); - - break; + if (scsi_cmd->opcode == START_STOP_UNIT) + xpt_async(AC_INQ_CHANGED, + done_ccb->ccb_h.path, NULL); + goto final; } case CAM_SCSI_STATUS_ERROR: scsi_cmd = (struct scsi_start_stop_unit *) &done_ccb->csio.cdb_io.cdb_bytes; - if (sense != 0) { + if (status & CAM_AUTOSNS_VALID) { struct ccb_getdev cgd; struct scsi_sense_data *sense; int error_code, sense_key, asc, ascq; @@ -1065,17 +1131,15 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb) sense = &done_ccb->csio.sense_data; scsi_extract_sense(sense, &error_code, &sense_key, &asc, &ascq); - /* * Grab the inquiry data for this device. */ xpt_setup_ccb(&cgd.ccb_h, done_ccb->ccb_h.path, - /*priority*/ 1); + CAM_PRIORITY_NORMAL); cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); err_action = scsi_error_action(&done_ccb->csio, &cgd.inq_data, 0); - /* * If the error is "invalid field in CDB", * and the load/eject flag is set, turn the @@ -1085,7 +1149,6 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb) * the load/eject flag by default for * removable media. */ - /* XXX KDM * Should we check to see what the specific * scsi status is?? Or does it not matter @@ -1100,9 +1163,7 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb) (done_ccb->ccb_h.retry_count > 0)) { scsi_cmd->how &= ~SSS_LOEJ; - xpt_action(done_ccb); - } else if ((done_ccb->ccb_h.retry_count > 1) && ((err_action & SS_MASK) != SS_FAIL)) { @@ -1113,53 +1174,51 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb) * it another try unless this is an * unretryable error. */ - /* set the timeout to .5 sec */ relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT; timeout = 500; - xpt_action(done_ccb); - break; - } else { /* * Perform the final retry with the original * CCB so that final error processing is * performed by the owner of the CCB. */ - bcopy(done_ccb->ccb_h.saved_ccb_ptr, - done_ccb, sizeof(union ccb)); - - periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; - - xpt_action(done_ccb); + goto final; } } else { + save_ccb = xpt_alloc_ccb_nowait(); + if (save_ccb == NULL) + goto final; + bcopy(done_ccb, save_ccb, sizeof(*save_ccb)); + periph->flags |= CAM_PERIPH_SENSE_INPROG; /* - * Eh?? The command failed, but we don't - * have any sense. What's up with that? - * Fire the CCB again to return it to the - * caller. + * Send a Request Sense to the device. We + * assume that we are in a contingent allegiance + * condition so we do not tag this request. */ - bcopy(done_ccb->ccb_h.saved_ccb_ptr, - done_ccb, sizeof(union ccb)); - - periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; - + scsi_request_sense(&done_ccb->csio, /*retries*/1, + camperiphsensedone, + &save_ccb->csio.sense_data, + sizeof(save_ccb->csio.sense_data), + CAM_TAG_ACTION_NONE, + /*sense_len*/SSD_FULL_SIZE, + /*timeout*/5000); + done_ccb->ccb_h.pinfo.priority--; + done_ccb->ccb_h.flags |= CAM_DEV_QFREEZE; + done_ccb->ccb_h.saved_ccb_ptr = save_ccb; + done_ccb->ccb_h.recovery_depth++; xpt_action(done_ccb); - } break; default: - bcopy(done_ccb->ccb_h.saved_ccb_ptr, done_ccb, - sizeof(union ccb)); - +final: + bcopy(saved_ccb, done_ccb, sizeof(*done_ccb)); + xpt_free_ccb(saved_ccb); periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG; - xpt_action(done_ccb); - break; } @@ -1173,14 +1232,23 @@ camperiphdone(struct cam_periph *periph, union ccb *done_ccb) */ if (done_ccb->ccb_h.retry_count > 0) done_ccb->ccb_h.retry_count--; - - qfrozen_cnt = cam_release_devq(done_ccb->ccb_h.path, - /*relsim_flags*/relsim_flags, - /*openings*/0, - /*timeout*/timeout, - /*getcount_only*/0); - if (xpt_done_ccb == TRUE) - (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb); + /* + * Drop freeze taken due to CAM_DEV_QFREEZE flag set on recovery + * request. + */ + cam_release_devq(done_ccb->ccb_h.path, + /*relsim_flags*/relsim_flags, + /*openings*/0, + /*timeout*/timeout, + /*getcount_only*/0); + /* Drop freeze taken, if this recovery request got error. */ + if (frozen != 0) { + cam_release_devq(done_ccb->ccb_h.path, + /*relsim_flags*/0, + /*openings*/0, + /*timeout*/0, + /*getcount_only*/0); + } } /* @@ -1196,12 +1264,6 @@ cam_periph_async(struct cam_periph *periph, u_int32_t code, case AC_LOST_DEVICE: cam_periph_invalidate(periph); break; - case AC_SENT_BDR: - case AC_BUS_RESET: - { - cam_periph_bus_settle(periph, scsi_delay); - break; - } default: break; } @@ -1212,7 +1274,7 @@ cam_periph_bus_settle(struct cam_periph *periph, u_int bus_settle) { struct ccb_getdevstats cgds; - xpt_setup_ccb(&cgds.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cgds.ccb_h, periph->path, CAM_PRIORITY_NORMAL); cgds.ccb_h.func_code = XPT_GDEV_STATS; xpt_action((union ccb *)&cgds); cam_periph_freeze_after_event(periph, &cgds.last_reset, bus_settle); @@ -1246,9 +1308,9 @@ cam_periph_freeze_after_event(struct cam_periph *periph, static int camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, - u_int32_t sense_flags, union ccb *save_ccb, + u_int32_t sense_flags, int *openings, u_int32_t *relsim_flags, - u_int32_t *timeout) + u_int32_t *timeout, const char **action_string) { int error; @@ -1261,13 +1323,15 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, break; case SCSI_STATUS_CMD_TERMINATED: case SCSI_STATUS_CHECK_COND: + if (bootverbose) + xpt_print(ccb->ccb_h.path, "SCSI status error\n"); error = camperiphscsisenseerror(ccb, camflags, sense_flags, - save_ccb, openings, relsim_flags, - timeout); + timeout, + action_string); break; case SCSI_STATUS_QUEUE_FULL: { @@ -1280,7 +1344,7 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, */ xpt_setup_ccb(&cgds.ccb_h, ccb->ccb_h.path, - /*priority*/1); + CAM_PRIORITY_NORMAL); cgds.ccb_h.func_code = XPT_GDEV_STATS; xpt_action((union ccb *)&cgds); @@ -1322,7 +1386,7 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, *timeout = 0; error = ERESTART; if (bootverbose) { - xpt_print(ccb->ccb_h.path, "Queue Full\n"); + xpt_print(ccb->ccb_h.path, "Queue full\n"); } break; } @@ -1334,7 +1398,7 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, * command completes or a 1 second timeout. */ if (bootverbose) { - xpt_print(ccb->ccb_h.path, "Device Busy\n"); + xpt_print(ccb->ccb_h.path, "Device busy\n"); } if (ccb->ccb_h.retry_count > 0) { ccb->ccb_h.retry_count--; @@ -1347,11 +1411,11 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, } break; case SCSI_STATUS_RESERV_CONFLICT: - xpt_print(ccb->ccb_h.path, "Reservation Conflict\n"); + xpt_print(ccb->ccb_h.path, "Reservation conflict\n"); error = EIO; break; default: - xpt_print(ccb->ccb_h.path, "SCSI Status 0x%x\n", + xpt_print(ccb->ccb_h.path, "SCSI status 0x%x\n", ccb->csio.scsi_status); error = EIO; break; @@ -1361,16 +1425,17 @@ camperiphscsistatuserror(union ccb *ccb, cam_flags camflags, static int camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, - u_int32_t sense_flags, union ccb *save_ccb, + u_int32_t sense_flags, int *openings, u_int32_t *relsim_flags, - u_int32_t *timeout) + u_int32_t *timeout, const char **action_string) { struct cam_periph *periph; + union ccb *orig_ccb = ccb; int error; periph = xpt_path_periph(ccb->ccb_h.path); - if (periph->flags & CAM_PERIPH_RECOVERY_INPROG) { - + if (periph->flags & + (CAM_PERIPH_RECOVERY_INPROG | CAM_PERIPH_SENSE_INPROG)) { /* * If error recovery is already in progress, don't attempt * to process this error, but requeue it unconditionally @@ -1388,22 +1453,11 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, } else { scsi_sense_action err_action; struct ccb_getdev cgd; - const char *action_string; - union ccb* print_ccb; - - /* A description of the error recovery action performed */ - action_string = NULL; - - /* - * The location of the orignal ccb - * for sense printing purposes. - */ - print_ccb = ccb; /* * Grab the inquiry data for this device. */ - xpt_setup_ccb(&cgd.ccb_h, ccb->ccb_h.path, /*priority*/ 1); + xpt_setup_ccb(&cgd.ccb_h, ccb->ccb_h.path, CAM_PRIORITY_NORMAL); cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); @@ -1426,7 +1480,7 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, if (ccb->ccb_h.retry_count > 0) ccb->ccb_h.retry_count--; else { - action_string = "Retries Exhausted"; + *action_string = "Retries exhausted"; goto sense_error_done; } } @@ -1436,26 +1490,30 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, * Do common portions of commands that * use recovery CCBs. */ - if (save_ccb == NULL) { - action_string = "No recovery CCB supplied"; + orig_ccb = xpt_alloc_ccb_nowait(); + if (orig_ccb == NULL) { + *action_string = "Can't allocate recovery CCB"; goto sense_error_done; } - bcopy(ccb, save_ccb, sizeof(*save_ccb)); - print_ccb = save_ccb; - periph->flags |= CAM_PERIPH_RECOVERY_INPROG; + /* + * Clear freeze flag for original request here, as + * this freeze will be dropped as part of ERESTART. + */ + ccb->ccb_h.status &= ~CAM_DEV_QFRZN; + bcopy(ccb, orig_ccb, sizeof(*orig_ccb)); } switch (err_action & SS_MASK) { case SS_NOP: - action_string = "No Recovery Action Needed"; + *action_string = "No recovery action needed"; error = 0; break; case SS_RETRY: - action_string = "Retrying Command (per Sense Data)"; + *action_string = "Retrying command (per sense data)"; error = ERESTART; break; case SS_FAIL: - action_string = "Unretryable error"; + *action_string = "Unretryable error"; break; case SS_START: { @@ -1465,7 +1523,8 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, * Send a start unit command to the device, and * then retry the command. */ - action_string = "Attempting to Start Unit"; + *action_string = "Attempting to start unit"; + periph->flags |= CAM_PERIPH_RECOVERY_INPROG; /* * Check for removable media and set @@ -1500,12 +1559,13 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, int retries; if ((err_action & SSQ_MANY) != 0) { - action_string = "Polling device for readiness"; + *action_string = "Polling device for readiness"; retries = 120; } else { - action_string = "Testing device for readiness"; + *action_string = "Testing device for readiness"; retries = 1; } + periph->flags |= CAM_PERIPH_RECOVERY_INPROG; scsi_test_unit_ready(&ccb->csio, retries, camperiphdone, @@ -1523,15 +1583,17 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, } case SS_REQSENSE: { + *action_string = "Requesting SCSI sense data"; + periph->flags |= CAM_PERIPH_SENSE_INPROG; /* * Send a Request Sense to the device. We * assume that we are in a contingent allegiance * condition so we do not tag this request. */ scsi_request_sense(&ccb->csio, /*retries*/1, - camperiphdone, - &save_ccb->csio.sense_data, - sizeof(save_ccb->csio.sense_data), + camperiphsensedone, + &orig_ccb->csio.sense_data, + sizeof(orig_ccb->csio.sense_data), CAM_TAG_ACTION_NONE, /*sense_len*/SSD_FULL_SIZE, /*timeout*/5000); @@ -1543,28 +1605,24 @@ camperiphscsisenseerror(union ccb *ccb, cam_flags camflags, if ((err_action & SS_MASK) >= SS_START) { /* - * Drop the priority to 0 so that the recovery + * Drop the priority, so that the recovery * CCB is the first to execute. Freeze the queue * after this command is sent so that we can * restore the old csio and have it queued in * the proper order before we release normal * transactions to the device. */ - ccb->ccb_h.pinfo.priority = 0; + ccb->ccb_h.pinfo.priority--; ccb->ccb_h.flags |= CAM_DEV_QFREEZE; - ccb->ccb_h.saved_ccb_ptr = save_ccb; + ccb->ccb_h.saved_ccb_ptr = orig_ccb; + ccb->ccb_h.recovery_depth = 0; error = ERESTART; } sense_error_done: if ((err_action & SSQ_PRINT_SENSE) != 0 - && (ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0) { - cam_error_print(print_ccb, CAM_ESF_ALL, CAM_EPF_ALL); - xpt_print_path(ccb->ccb_h.path); - if (bootverbose) - scsi_sense_print(&print_ccb->csio); - printf("%s\n", action_string); - } + && (ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0) + cam_error_print(orig_ccb, CAM_ESF_ALL, CAM_EPF_ALL); } return (error); } @@ -1600,19 +1658,19 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, error = camperiphscsistatuserror(ccb, camflags, sense_flags, - save_ccb, &openings, &relsim_flags, - &timeout); + &timeout, + &action_string); break; case CAM_AUTOSENSE_FAIL: - xpt_print(ccb->ccb_h.path, "AutoSense Failed\n"); + xpt_print(ccb->ccb_h.path, "AutoSense failed\n"); error = EIO; /* we have to kill the command */ break; case CAM_ATA_STATUS_ERROR: if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, - "Request completed with CAM_ATA_STATUS_ERROR\n"); + xpt_print(ccb->ccb_h.path, "ATA status error\n"); + cam_error_print(ccb, CAM_ESF_ALL, CAM_EPF_ALL); printed++; } /* FALLTHROUGH */ @@ -1638,13 +1696,13 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, case CAM_UNCOR_PARITY: if (bootverbose && printed == 0) { xpt_print(ccb->ccb_h.path, - "Uncorrected Parity Error\n"); + "Uncorrected parity error\n"); printed++; } /* FALLTHROUGH */ case CAM_DATA_RUN_ERR: if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "Data Overrun\n"); + xpt_print(ccb->ccb_h.path, "Data overrun\n"); printed++; } error = EIO; /* we have to kill the command */ @@ -1653,7 +1711,7 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, ccb->ccb_h.retry_count--; error = ERESTART; } else { - action_string = "Retries Exhausted"; + action_string = "Retries exhausted"; error = EIO; } break; @@ -1674,7 +1732,7 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, error = ERESTART; if (bootverbose && printed == 0) { xpt_print(ccb->ccb_h.path, - "Selection Timeout\n"); + "Selection timeout\n"); printed++; } @@ -1736,7 +1794,7 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, /* Unconditional requeue */ error = ERESTART; if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "Request Requeued\n"); + xpt_print(ccb->ccb_h.path, "Request requeued\n"); printed++; } break; @@ -1757,49 +1815,46 @@ cam_periph_error(union ccb *ccb, cam_flags camflags, ccb->ccb_h.retry_count--; error = ERESTART; if (bootverbose && printed == 0) { - xpt_print(ccb->ccb_h.path, "CAM Status 0x%x\n", + xpt_print(ccb->ccb_h.path, "CAM status 0x%x\n", status); printed++; } } else { error = EIO; - action_string = "Retries Exhausted"; + action_string = "Retries exhausted"; } break; } - /* Attempt a retry */ - if (error == ERESTART || error == 0) { - if (frozen != 0) - ccb->ccb_h.status &= ~CAM_DEV_QFRZN; - - if (error == ERESTART) { - action_string = "Retrying Command"; - xpt_action(ccb); - } - - if (frozen != 0) - cam_release_devq(ccb->ccb_h.path, - relsim_flags, - openings, - timeout, - /*getcount_only*/0); - } - /* * If we have and error and are booting verbosely, whine * *unless* this was a non-retryable selection timeout. */ if (error != 0 && bootverbose && !(status == CAM_SEL_TIMEOUT && (camflags & CAM_RETRY_SELTO) == 0)) { - - - if (action_string == NULL) - action_string = "Unretryable Error"; if (error != ERESTART) { - xpt_print(ccb->ccb_h.path, "error %d\n", error); - } - xpt_print(ccb->ccb_h.path, "%s\n", action_string); + if (action_string == NULL) + action_string = "Unretryable error"; + xpt_print(ccb->ccb_h.path, "Error %d, %s\n", + error, action_string); + } else if (action_string != NULL) + xpt_print(ccb->ccb_h.path, "%s\n", action_string); + else + xpt_print(ccb->ccb_h.path, "Retrying command\n"); + } + + /* Attempt a retry */ + if (error == ERESTART || error == 0) { + if (frozen != 0) + ccb->ccb_h.status &= ~CAM_DEV_QFRZN; + if (error == ERESTART) + xpt_action(ccb); + if (frozen != 0) + cam_release_devq(ccb->ccb_h.path, + relsim_flags, + openings, + timeout, + /*getcount_only*/0); } return (error); diff --git a/sys/cam/cam_periph.h b/sys/cam/cam_periph.h index f95a94f81b83..33e9f7584355 100644 --- a/sys/cam/cam_periph.h +++ b/sys/cam/cam_periph.h @@ -42,6 +42,7 @@ extern struct cam_periph *xpt_periph; extern struct periph_driver **periph_drivers; void periphdriver_register(void *); +void periphdriver_init(int level); #include #define PERIPHDRIVER_DECLARE(name, driver) \ @@ -79,6 +80,8 @@ struct periph_driver { char *driver_name; TAILQ_HEAD(,cam_periph) units; u_int generation; + u_int flags; +#define CAM_PERIPH_DRV_EARLY 0x01 }; typedef enum { @@ -115,7 +118,7 @@ struct cam_periph { #define CAM_PERIPH_INVALID 0x08 #define CAM_PERIPH_NEW_DEV_FOUND 0x10 #define CAM_PERIPH_RECOVERY_INPROG 0x20 -#define CAM_PERIPH_POLLED 0x40 +#define CAM_PERIPH_SENSE_INPROG 0x40 u_int32_t immediate_priority; u_int32_t refcount; SLIST_HEAD(, ccb_hdr) ccb_list; /* For "immediate" requests */ @@ -164,8 +167,10 @@ int cam_periph_ioctl(struct cam_periph *periph, u_long cmd, cam_flags camflags, u_int32_t sense_flags)); void cam_freeze_devq(struct cam_path *path); +void cam_freeze_devq_arg(struct cam_path *path, u_int32_t flags, + uint32_t arg); u_int32_t cam_release_devq(struct cam_path *path, u_int32_t relsim_flags, - u_int32_t opening_reduction, u_int32_t timeout, + u_int32_t opening_reduction, u_int32_t arg, int getcount_only); void cam_periph_async(struct cam_periph *periph, u_int32_t code, struct cam_path *path, void *arg); @@ -189,5 +194,11 @@ cam_periph_unlock(struct cam_periph *periph) mtx_unlock(periph->sim->mtx); } +static __inline int +cam_periph_owned(struct cam_periph *periph) +{ + return (mtx_owned(periph->sim->mtx)); +} + #endif /* _KERNEL */ #endif /* _CAM_CAM_PERIPH_H */ diff --git a/sys/cam/cam_queue.c b/sys/cam/cam_queue.c index 1e756d2e89a8..328f0b802a75 100644 --- a/sys/cam/cam_queue.c +++ b/sys/cam/cam_queue.c @@ -289,7 +289,7 @@ void cam_ccbq_free(struct cam_ccbq *ccbq) { if (ccbq) { - camq_fini(&ccbq->queue); + cam_ccbq_fini(ccbq); free(ccbq, M_CAMCCBQ); } } @@ -334,10 +334,16 @@ cam_ccbq_init(struct cam_ccbq *ccbq, int openings) } ccbq->devq_openings = openings; ccbq->dev_openings = openings; - TAILQ_INIT(&ccbq->active_ccbs); return (0); } +void +cam_ccbq_fini(struct cam_ccbq *ccbq) +{ + + camq_fini(&ccbq->queue); +} + /* * Heap routines for manipulating CAM queues. */ diff --git a/sys/cam/cam_queue.h b/sys/cam/cam_queue.h index d2990ad26e94..dd9f9a7306e7 100644 --- a/sys/cam/cam_queue.h +++ b/sys/cam/cam_queue.h @@ -34,6 +34,7 @@ #ifdef _KERNEL #include +#include /* * This structure implements a heap based priority queue. The queue @@ -47,7 +48,7 @@ struct camq { int array_size; int entries; u_int32_t generation; - u_int32_t qfrozen_cnt; + u_int32_t qfrozen_cnt[CAM_RL_VALUES]; }; TAILQ_HEAD(ccb_hdr_tailq, ccb_hdr); @@ -60,7 +61,6 @@ struct cam_ccbq { int dev_openings; int dev_active; int held; - struct ccb_hdr_tailq active_ccbs; }; struct cam_ed; @@ -141,6 +141,10 @@ cam_pinfo *camq_remove(struct camq *queue, int index); /* Index the first element in the heap */ #define CAMQ_GET_HEAD(camq) ((camq)->queue_array[CAMQ_HEAD]) +/* Get the first element priority. */ +#define CAMQ_GET_PRIO(camq) (((camq)->entries > 0) ? \ + ((camq)->queue_array[CAMQ_HEAD]->priority) : 0) + /* * camq_change_priority: Raise or lower the priority of an entry * maintaining queue order. @@ -154,10 +158,10 @@ cam_ccbq_pending_ccb_count(struct cam_ccbq *ccbq); static __inline void cam_ccbq_take_opening(struct cam_ccbq *ccbq); -static __inline void +static __inline int cam_ccbq_insert_ccb(struct cam_ccbq *ccbq, union ccb *new_ccb); -static __inline void +static __inline int cam_ccbq_remove_ccb(struct cam_ccbq *ccbq, union ccb *ccb); static __inline union ccb * @@ -186,17 +190,31 @@ cam_ccbq_take_opening(struct cam_ccbq *ccbq) ccbq->held++; } -static __inline void +static __inline int cam_ccbq_insert_ccb(struct cam_ccbq *ccbq, union ccb *new_ccb) { ccbq->held--; camq_insert(&ccbq->queue, &new_ccb->ccb_h.pinfo); + if (ccbq->queue.qfrozen_cnt[CAM_PRIORITY_TO_RL( + new_ccb->ccb_h.pinfo.priority)] > 0) { + ccbq->devq_openings++; + ccbq->held++; + return (1); + } else + return (0); } -static __inline void +static __inline int cam_ccbq_remove_ccb(struct cam_ccbq *ccbq, union ccb *ccb) { camq_remove(&ccbq->queue, ccb->ccb_h.pinfo.index); + if (ccbq->queue.qfrozen_cnt[CAM_PRIORITY_TO_RL( + ccb->ccb_h.pinfo.priority)] > 0) { + ccbq->devq_openings--; + ccbq->held--; + return (1); + } else + return (0); } static __inline union ccb * @@ -209,9 +227,6 @@ static __inline void cam_ccbq_send_ccb(struct cam_ccbq *ccbq, union ccb *send_ccb) { - TAILQ_INSERT_TAIL(&ccbq->active_ccbs, - &(send_ccb->ccb_h), - xpt_links.tqe); send_ccb->ccb_h.pinfo.index = CAM_ACTIVE_INDEX; ccbq->dev_active++; ccbq->dev_openings--; @@ -220,8 +235,7 @@ cam_ccbq_send_ccb(struct cam_ccbq *ccbq, union ccb *send_ccb) static __inline void cam_ccbq_ccb_done(struct cam_ccbq *ccbq, union ccb *done_ccb) { - TAILQ_REMOVE(&ccbq->active_ccbs, &done_ccb->ccb_h, - xpt_links.tqe); + ccbq->dev_active--; ccbq->dev_openings++; ccbq->held++; @@ -234,5 +248,81 @@ cam_ccbq_release_opening(struct cam_ccbq *ccbq) ccbq->devq_openings++; } +static __inline int +cam_ccbq_freeze(struct cam_ccbq *ccbq, cam_rl rl, u_int32_t cnt) +{ + int i, frozen = 0; + cam_rl p, n; + + /* Find pevious run level. */ + for (p = 0; p < CAM_RL_VALUES && ccbq->queue.qfrozen_cnt[p] == 0; p++); + /* Find new run level. */ + n = min(rl, p); + /* Apply new run level. */ + for (i = rl; i < CAM_RL_VALUES; i++) + ccbq->queue.qfrozen_cnt[i] += cnt; + /* Update ccbq statistics. */ + if (n == p) + return (0); + for (i = CAMQ_HEAD; i <= ccbq->queue.entries; i++) { + cam_rl rrl = + CAM_PRIORITY_TO_RL(ccbq->queue.queue_array[i]->priority); + if (rrl < n) + continue; + if (rrl >= p) + break; + ccbq->devq_openings++; + ccbq->held++; + frozen++; + } + return (frozen); +} + +static __inline int +cam_ccbq_release(struct cam_ccbq *ccbq, cam_rl rl, u_int32_t cnt) +{ + int i, released = 0; + cam_rl p, n; + + /* Apply new run level. */ + for (i = rl; i < CAM_RL_VALUES; i++) + ccbq->queue.qfrozen_cnt[i] -= cnt; + /* Find new run level. */ + for (n = 0; n < CAM_RL_VALUES && ccbq->queue.qfrozen_cnt[n] == 0; n++); + /* Find previous run level. */ + p = min(rl, n); + /* Update ccbq statistics. */ + if (n == p) + return (0); + for (i = CAMQ_HEAD; i <= ccbq->queue.entries; i++) { + cam_rl rrl = + CAM_PRIORITY_TO_RL(ccbq->queue.queue_array[i]->priority); + if (rrl < p) + continue; + if (rrl >= n) + break; + ccbq->devq_openings--; + ccbq->held--; + released++; + } + return (released); +} + +static __inline u_int32_t +cam_ccbq_frozen(struct cam_ccbq *ccbq, cam_rl rl) +{ + + return (ccbq->queue.qfrozen_cnt[rl]); +} + +static __inline u_int32_t +cam_ccbq_frozen_top(struct cam_ccbq *ccbq) +{ + cam_rl rl; + + rl = CAM_PRIORITY_TO_RL(CAMQ_GET_PRIO(&ccbq->queue)); + return (ccbq->queue.qfrozen_cnt[rl]); +} + #endif /* _KERNEL */ #endif /* _CAM_CAM_QUEUE_H */ diff --git a/sys/cam/cam_sim.c b/sys/cam/cam_sim.c index adccfa8593ec..59148a9a4267 100644 --- a/sys/cam/cam_sim.c +++ b/sys/cam/cam_sim.c @@ -69,7 +69,7 @@ cam_sim_alloc(sim_action_func sim_action, sim_poll_func sim_poll, return (NULL); sim = (struct cam_sim *)malloc(sizeof(struct cam_sim), - M_CAMSIM, M_NOWAIT); + M_CAMSIM, M_ZERO | M_NOWAIT); if (sim == NULL) return (NULL); @@ -86,6 +86,7 @@ cam_sim_alloc(sim_action_func sim_action, sim_poll_func sim_poll, sim->flags = 0; sim->refcount = 1; sim->devq = queue; + sim->max_ccbs = 8; /* Reserve for management purposes. */ sim->mtx = mtx; if (mtx == &Giant) { sim->flags |= 0; diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 39b25dfa97c5..4871e85b7972 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include #include @@ -102,6 +102,8 @@ struct xpt_softc { /* queue for handling async rescan requests. */ TAILQ_HEAD(, ccb_hdr) ccb_scanq; + int buses_to_config; + int buses_config_done; /* Registered busses */ TAILQ_HEAD(,cam_eb) xpt_busses; @@ -109,6 +111,9 @@ struct xpt_softc { struct intr_config_hook *xpt_config_hook; + int boot_delay; + struct callout boot_callout; + struct mtx xpt_topo_lock; struct mtx xpt_lock; }; @@ -145,6 +150,14 @@ typedef int xpt_pdrvfunc_t (struct periph_driver **pdrv, void *arg); /* Transport layer configuration information */ static struct xpt_softc xsoftc; +TUNABLE_INT("kern.cam.boot_delay", &xsoftc.boot_delay); +SYSCTL_INT(_kern_cam, OID_AUTO, boot_delay, CTLFLAG_RDTUN, + &xsoftc.boot_delay, 0, "Bus registration wait time"); +static int xpt_power_down = 0; +TUNABLE_INT("kern.cam.power_down", &xpt_power_down); +SYSCTL_INT(_kern_cam, OID_AUTO, power_down, CTLFLAG_RW, + &xpt_power_down, 0, "Power down devices on shutdown"); + /* Queues for our software interrupt handler */ typedef TAILQ_HEAD(cam_isrq, ccb_hdr) cam_isrq_t; typedef TAILQ_HEAD(cam_simq, cam_sim) cam_simq_t; @@ -161,7 +174,8 @@ static periph_init_t xpt_periph_init; static struct periph_driver xpt_driver = { xpt_periph_init, "xpt", - TAILQ_HEAD_INITIALIZER(xpt_driver.units) + TAILQ_HEAD_INITIALIZER(xpt_driver.units), /* generation */ 0, + CAM_PERIPH_DRV_EARLY }; PERIPHDRIVER_DECLARE(xpt, xpt_driver); @@ -209,27 +223,24 @@ static path_id_t xptnextfreepathid(void); static path_id_t xptpathid(const char *sim_name, int sim_unit, int sim_bus); static union ccb *xpt_get_ccb(struct cam_ed *device); static void xpt_run_dev_allocq(struct cam_eb *bus); +static void xpt_run_dev_sendq(struct cam_eb *bus); static timeout_t xpt_release_devq_timeout; static void xpt_release_simq_timeout(void *arg) __unused; static void xpt_release_bus(struct cam_eb *bus); -static void xpt_release_devq_device(struct cam_ed *dev, u_int count, - int run_queue); +static void xpt_release_devq_device(struct cam_ed *dev, cam_rl rl, + u_int count, int run_queue); static struct cam_et* xpt_alloc_target(struct cam_eb *bus, target_id_t target_id); -static void xpt_release_target(struct cam_eb *bus, struct cam_et *target); -static void xpt_release_device(struct cam_eb *bus, struct cam_et *target, - struct cam_ed *device); +static void xpt_release_target(struct cam_et *target); static struct cam_eb* xpt_find_bus(path_id_t path_id); static struct cam_et* xpt_find_target(struct cam_eb *bus, target_id_t target_id); static struct cam_ed* xpt_find_device(struct cam_et *target, lun_id_t lun_id); -static xpt_busfunc_t xptconfigbuscountfunc; -static xpt_busfunc_t xptconfigfunc; static void xpt_config(void *arg); static xpt_devicefunc_t xptpassannouncefunc; -static void xpt_finishconfig(struct cam_periph *periph, union ccb *ccb); +static void xpt_shutdown(void *arg, int howto); static void xptaction(struct cam_sim *sim, union ccb *work_ccb); static void xptpoll(struct cam_sim *sim); static void camisr(void *); @@ -271,6 +282,7 @@ static xpt_busfunc_t xptdefbusfunc; static xpt_targetfunc_t xptdeftargetfunc; static xpt_devicefunc_t xptdefdevicefunc; static xpt_periphfunc_t xptdefperiphfunc; +static void xpt_finishconfig_task(void *context, int pending); static int xpt_for_all_busses(xpt_busfunc_t *tr_func, void *arg); static int xpt_for_all_devices(xpt_devicefunc_t *tr_func, void *arg); @@ -286,26 +298,19 @@ static xpt_devicefunc_t xptsetasyncfunc; static xpt_busfunc_t xptsetasyncbusfunc; static cam_status xptregister(struct cam_periph *periph, void *arg); -static void xpt_start_tags(struct cam_path *path); -static __inline int xpt_schedule_dev_allocq(struct cam_eb *bus, - struct cam_ed *dev); static __inline int periph_is_queued(struct cam_periph *periph); static __inline int device_is_alloc_queued(struct cam_ed *device); static __inline int device_is_send_queued(struct cam_ed *device); -static __inline int dev_allocq_is_runnable(struct cam_devq *devq); static __inline int xpt_schedule_dev_allocq(struct cam_eb *bus, struct cam_ed *dev) { int retval; - if (dev->ccbq.devq_openings > 0) { - if ((dev->flags & CAM_DEV_RESIZE_QUEUE_NEEDED) != 0) { - cam_ccbq_resize(&dev->ccbq, - dev->ccbq.dev_openings - + dev->ccbq.dev_active); - dev->flags &= ~CAM_DEV_RESIZE_QUEUE_NEEDED; - } + if ((dev->drvq.entries > 0) && + (dev->ccbq.devq_openings > 0) && + (cam_ccbq_frozen(&dev->ccbq, CAM_PRIORITY_TO_RL( + CAMQ_GET_PRIO(&dev->drvq))) == 0)) { /* * The priority of a device waiting for CCB resources * is that of the the highest priority peripheral driver @@ -313,7 +318,7 @@ xpt_schedule_dev_allocq(struct cam_eb *bus, struct cam_ed *dev) */ retval = xpt_schedule_dev(&bus->sim->devq->alloc_queue, &dev->alloc_ccb_entry.pinfo, - CAMQ_GET_HEAD(&dev->drvq)->priority); + CAMQ_GET_PRIO(&dev->drvq)); } else { retval = 0; } @@ -321,6 +326,29 @@ xpt_schedule_dev_allocq(struct cam_eb *bus, struct cam_ed *dev) return (retval); } +static __inline int +xpt_schedule_dev_sendq(struct cam_eb *bus, struct cam_ed *dev) +{ + int retval; + + if ((dev->ccbq.queue.entries > 0) && + (dev->ccbq.dev_openings > 0) && + (cam_ccbq_frozen_top(&dev->ccbq) == 0)) { + /* + * The priority of a device waiting for controller + * resources is that of the the highest priority CCB + * enqueued. + */ + retval = + xpt_schedule_dev(&bus->sim->devq->send_queue, + &dev->send_ccb_entry.pinfo, + CAMQ_GET_PRIO(&dev->ccbq.queue)); + } else { + retval = 0; + } + return (retval); +} + static __inline int periph_is_queued(struct cam_periph *periph) { @@ -339,19 +367,6 @@ device_is_send_queued(struct cam_ed *device) return (device->send_ccb_entry.pinfo.index != CAM_UNQUEUED_INDEX); } -static __inline int -dev_allocq_is_runnable(struct cam_devq *devq) -{ - /* - * Have work to do. - * Have space to do more work. - * Allowed to do work. - */ - return ((devq->alloc_queue.qfrozen_cnt == 0) - && (devq->alloc_queue.entries > 0) - && (devq->alloc_openings > 0)); -} - static void xpt_periph_init() { @@ -452,7 +467,34 @@ xptioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td ccb = xpt_alloc_ccb(); CAM_SIM_LOCK(bus->sim); - + /* Ensure passed in target/lun supported on this bus. */ + if ((inccb->ccb_h.target_id != CAM_TARGET_WILDCARD) || + (inccb->ccb_h.target_lun != CAM_LUN_WILDCARD)) { + if (xpt_create_path(&ccb->ccb_h.path, + xpt_periph, + inccb->ccb_h.path_id, + CAM_TARGET_WILDCARD, + CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + error = EINVAL; + CAM_SIM_UNLOCK(bus->sim); + xpt_free_ccb(ccb); + break; + } + xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path, + inccb->ccb_h.pinfo.priority); + ccb->ccb_h.func_code = XPT_PATH_INQ; + xpt_action(ccb); + xpt_free_path(ccb->ccb_h.path); + if ((inccb->ccb_h.target_id != CAM_TARGET_WILDCARD && + inccb->ccb_h.target_id > ccb->cpi.max_target) || + (inccb->ccb_h.target_lun != CAM_LUN_WILDCARD && + inccb->ccb_h.target_lun > ccb->cpi.max_lun)) { + error = EINVAL; + CAM_SIM_UNLOCK(bus->sim); + xpt_free_ccb(ccb); + break; + } + } /* * Create a path using the bus, target, and lun the * user passed in. @@ -778,45 +820,42 @@ cam_module_event_handler(module_t mod, int what, void *arg) return 0; } +static void +xpt_rescan_done(struct cam_periph *periph, union ccb *done_ccb) +{ + + if (done_ccb->ccb_h.ppriv_ptr1 == NULL) { + xpt_free_path(done_ccb->ccb_h.path); + xpt_free_ccb(done_ccb); + } else { + done_ccb->ccb_h.cbfcnp = done_ccb->ccb_h.ppriv_ptr1; + (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb); + } + xpt_release_boot(); +} + /* thread to handle bus rescans */ static void xpt_scanner_thread(void *dummy) { - cam_isrq_t queue; union ccb *ccb; struct cam_sim *sim; + xpt_lock_buses(); for (;;) { - /* - * Wait for a rescan request to come in. When it does, splice - * it onto a queue from local storage so that the xpt lock - * doesn't need to be held while the requests are being - * processed. - */ - xpt_lock_buses(); if (TAILQ_EMPTY(&xsoftc.ccb_scanq)) msleep(&xsoftc.ccb_scanq, &xsoftc.xpt_topo_lock, PRIBIO, "ccb_scanq", 0); - TAILQ_INIT(&queue); - TAILQ_CONCAT(&queue, &xsoftc.ccb_scanq, sim_links.tqe); - xpt_unlock_buses(); - - while ((ccb = (union ccb *)TAILQ_FIRST(&queue)) != NULL) { - TAILQ_REMOVE(&queue, &ccb->ccb_h, sim_links.tqe); + if ((ccb = (union ccb *)TAILQ_FIRST(&xsoftc.ccb_scanq)) != NULL) { + TAILQ_REMOVE(&xsoftc.ccb_scanq, &ccb->ccb_h, sim_links.tqe); + xpt_unlock_buses(); sim = ccb->ccb_h.path->bus->sim; CAM_SIM_LOCK(sim); - - if( ccb->ccb_h.path->target->target_id == CAM_TARGET_WILDCARD ) - ccb->ccb_h.func_code = XPT_SCAN_BUS; - else - ccb->ccb_h.func_code = XPT_SCAN_LUN; - ccb->ccb_h.cbfcnp = xptdone; - xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path, 1); - cam_periph_runccb(ccb, NULL, 0, 0, NULL); - xpt_free_path(ccb->ccb_h.path); - xpt_free_ccb(ccb); + xpt_action(ccb); CAM_SIM_UNLOCK(sim); + + xpt_lock_buses(); } } } @@ -826,21 +865,31 @@ xpt_rescan(union ccb *ccb) { struct ccb_hdr *hdr; - /* - * Don't make duplicate entries for the same paths. - */ + /* Prepare request */ + if (ccb->ccb_h.path->target->target_id == CAM_TARGET_WILDCARD || + ccb->ccb_h.path->device->lun_id == CAM_LUN_WILDCARD) + ccb->ccb_h.func_code = XPT_SCAN_BUS; + else + ccb->ccb_h.func_code = XPT_SCAN_LUN; + ccb->ccb_h.ppriv_ptr1 = ccb->ccb_h.cbfcnp; + ccb->ccb_h.cbfcnp = xpt_rescan_done; + xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path, CAM_PRIORITY_XPT); + /* Don't make duplicate entries for the same paths. */ xpt_lock_buses(); - TAILQ_FOREACH(hdr, &xsoftc.ccb_scanq, sim_links.tqe) { - if (xpt_path_comp(hdr->path, ccb->ccb_h.path) == 0) { - wakeup(&xsoftc.ccb_scanq); - xpt_unlock_buses(); - xpt_print(ccb->ccb_h.path, "rescan already queued\n"); - xpt_free_path(ccb->ccb_h.path); - xpt_free_ccb(ccb); - return; + if (ccb->ccb_h.ppriv_ptr1 == NULL) { + TAILQ_FOREACH(hdr, &xsoftc.ccb_scanq, sim_links.tqe) { + if (xpt_path_comp(hdr->path, ccb->ccb_h.path) == 0) { + wakeup(&xsoftc.ccb_scanq); + xpt_unlock_buses(); + xpt_print(ccb->ccb_h.path, "rescan already queued\n"); + xpt_free_path(ccb->ccb_h.path); + xpt_free_ccb(ccb); + return; + } } } TAILQ_INSERT_TAIL(&xsoftc.ccb_scanq, &ccb->ccb_h, sim_links.tqe); + xsoftc.buses_to_config++; wakeup(&xsoftc.ccb_scanq); xpt_unlock_buses(); } @@ -883,10 +932,9 @@ xpt_init(void *dummy) if (xpt_sim == NULL) return (ENOMEM); - xpt_sim->max_ccbs = 16; - mtx_lock(&xsoftc.xpt_lock); if ((status = xpt_bus_register(xpt_sim, NULL, 0)) != CAM_SUCCESS) { + mtx_unlock(&xsoftc.xpt_lock); printf("xpt_init: xpt_bus_register failed with status %#x," " failing attach\n", status); return (EINVAL); @@ -900,6 +948,7 @@ xpt_init(void *dummy) if ((status = xpt_create_path(&path, NULL, CAM_XPT_PATH_ID, CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD)) != CAM_REQ_CMP) { + mtx_unlock(&xsoftc.xpt_lock); printf("xpt_init: xpt_create_path failed with status %#x," " failing attach\n", status); return (EINVAL); @@ -909,7 +958,8 @@ xpt_init(void *dummy) path, NULL, 0, xpt_sim); xpt_free_path(path); mtx_unlock(&xsoftc.xpt_lock); - + /* Install our software interrupt handlers */ + swi_add(NULL, "cambio", camisr, NULL, SWI_CAMBIO, INTR_MPSAFE, &cambio_ih); /* * Register a callback for when interrupts are enabled. */ @@ -921,7 +971,6 @@ xpt_init(void *dummy) "- failing attach\n"); return (ENOMEM); } - xsoftc.xpt_config_hook->ich_func = xpt_config; if (config_intrhook_establish(xsoftc.xpt_config_hook) != 0) { free (xsoftc.xpt_config_hook, M_CAMXPT); @@ -929,13 +978,6 @@ xpt_init(void *dummy) "- failing attach\n"); } - /* fire up rescan thread */ - if (kproc_create(xpt_scanner_thread, NULL, NULL, 0, 0, "xpt_thrd")) { - printf("xpt_init: failed to create rescan thread\n"); - } - /* Install our software interrupt handlers */ - swi_add(NULL, "cambio", camisr, NULL, SWI_CAMBIO, INTR_MPSAFE, &cambio_ih); - return (0); } @@ -1024,20 +1066,10 @@ xpt_remove_periph(struct cam_periph *periph) void xpt_announce_periph(struct cam_periph *periph, char *announce_string) { - struct ccb_pathinq cpi; - struct ccb_trans_settings cts; - struct cam_path *path; - u_int speed; - u_int freq; - u_int mb; + struct cam_path *path = periph->path; mtx_assert(periph->sim->mtx, MA_OWNED); - path = periph->path; - /* - * To ensure that this is printed in one piece, - * mask out CAM interrupts. - */ printf("%s%d at %s%d bus %d scbus%d target %d lun %d\n", periph->periph_name, periph->unit_number, path->bus->sim->sim_name, @@ -1048,116 +1080,26 @@ xpt_announce_periph(struct cam_periph *periph, char *announce_string) path->device->lun_id); printf("%s%d: ", periph->periph_name, periph->unit_number); if (path->device->protocol == PROTO_SCSI) - scsi_print_inquiry(&path->device->inq_data); + scsi_print_inquiry(&path->device->inq_data); else if (path->device->protocol == PROTO_ATA || path->device->protocol == PROTO_SATAPM) ata_print_ident(&path->device->ident_data); else - printf("Unknown protocol device\n"); + printf("Unknown protocol device\n"); if (bootverbose && path->device->serial_num_len > 0) { /* Don't wrap the screen - print only the first 60 chars */ printf("%s%d: Serial Number %.60s\n", periph->periph_name, periph->unit_number, path->device->serial_num); } - xpt_setup_ccb(&cts.ccb_h, path, /*priority*/1); - cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; - cts.type = CTS_TYPE_CURRENT_SETTINGS; - xpt_action((union ccb*)&cts); - if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { - return; - } - - /* Ask the SIM for its base transfer speed */ - xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); - cpi.ccb_h.func_code = XPT_PATH_INQ; - xpt_action((union ccb *)&cpi); - - speed = cpi.base_transfer_speed; - freq = 0; - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SPI) { - struct ccb_trans_settings_spi *spi; - - spi = &cts.xport_specific.spi; - if ((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) != 0 - && spi->sync_offset != 0) { - freq = scsi_calc_syncsrate(spi->sync_period); - speed = freq; - } - - if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0) - speed *= (0x01 << spi->bus_width); - } - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_FC) { - struct ccb_trans_settings_fc *fc = &cts.xport_specific.fc; - if (fc->valid & CTS_FC_VALID_SPEED) - speed = fc->bitrate; - } - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SAS) { - struct ccb_trans_settings_sas *sas = &cts.xport_specific.sas; - if (sas->valid & CTS_SAS_VALID_SPEED) - speed = sas->bitrate; - } - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) { - struct ccb_trans_settings_sata *sata = &cts.xport_specific.sata; - if (sata->valid & CTS_SATA_VALID_SPEED) - speed = sata->bitrate; - } - - mb = speed / 1000; - if (mb > 0) - printf("%s%d: %d.%03dMB/s transfers", - periph->periph_name, periph->unit_number, - mb, speed % 1000); - else - printf("%s%d: %dKB/s transfers", periph->periph_name, - periph->unit_number, speed); - /* Report additional information about SPI connections */ - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SPI) { - struct ccb_trans_settings_spi *spi; - - spi = &cts.xport_specific.spi; - if (freq != 0) { - printf(" (%d.%03dMHz%s, offset %d", freq / 1000, - freq % 1000, - (spi->ppr_options & MSG_EXT_PPR_DT_REQ) != 0 - ? " DT" : "", - spi->sync_offset); - } - if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0 - && spi->bus_width > 0) { - if (freq != 0) { - printf(", "); - } else { - printf(" ("); - } - printf("%dbit)", 8 * (0x01 << spi->bus_width)); - } else if (freq != 0) { - printf(")"); - } - } - if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_FC) { - struct ccb_trans_settings_fc *fc; - - fc = &cts.xport_specific.fc; - if (fc->valid & CTS_FC_VALID_WWNN) - printf(" WWNN 0x%llx", (long long) fc->wwnn); - if (fc->valid & CTS_FC_VALID_WWPN) - printf(" WWPN 0x%llx", (long long) fc->wwpn); - if (fc->valid & CTS_FC_VALID_PORT) - printf(" PortID 0x%x", fc->port); - } - + /* Announce transport details. */ + (*(path->bus->xport->announce))(periph); + /* Announce command queueing. */ if (path->device->inq_flags & SID_CmdQue || path->device->flags & CAM_DEV_TAG_AFTER_COUNT) { - printf("\n%s%d: Command Queueing enabled", + printf("%s%d: Command Queueing enabled\n", periph->periph_name, periph->unit_number); } - printf("\n"); - - /* - * We only want to print the caller's announce string if they've - * passed one in.. - */ + /* Announce caller's details if they've passed in. */ if (announce_string != NULL) printf("%s%d: %s\n", periph->periph_name, periph->unit_number, announce_string); @@ -2317,9 +2259,7 @@ xptsetasyncfunc(struct cam_ed *device, void *arg) { struct cam_path path; struct ccb_getdev cgd; - struct async_node *cur_entry; - - cur_entry = (struct async_node *)arg; + struct ccb_setasync *csa = (struct ccb_setasync *)arg; /* * Don't report unconfigured devices (Wildcard devs, @@ -2335,10 +2275,10 @@ xptsetasyncfunc(struct cam_ed *device, void *arg) device->target->bus->path_id, device->target->target_id, device->lun_id); - xpt_setup_ccb(&cgd.ccb_h, &path, /*priority*/1); + xpt_setup_ccb(&cgd.ccb_h, &path, CAM_PRIORITY_NORMAL); cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); - cur_entry->callback(cur_entry->callback_arg, + csa->callback(csa->callback_arg, AC_FOUND_DEVICE, &path, &cgd); xpt_release_path(&path); @@ -2351,18 +2291,16 @@ xptsetasyncbusfunc(struct cam_eb *bus, void *arg) { struct cam_path path; struct ccb_pathinq cpi; - struct async_node *cur_entry; - - cur_entry = (struct async_node *)arg; + struct ccb_setasync *csa = (struct ccb_setasync *)arg; xpt_compile_path(&path, /*periph*/NULL, bus->sim->path_id, CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD); - xpt_setup_ccb(&cpi.ccb_h, &path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, &path, CAM_PRIORITY_NORMAL); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); - cur_entry->callback(cur_entry->callback_arg, + csa->callback(csa->callback_arg, AC_PATH_REGISTERED, &path, &cpi); xpt_release_path(&path); @@ -2370,35 +2308,6 @@ xptsetasyncbusfunc(struct cam_eb *bus, void *arg) return(1); } -static void -xpt_action_sasync_cb(void *context, int pending) -{ - struct async_node *cur_entry; - struct xpt_task *task; - uint32_t added; - - task = (struct xpt_task *)context; - cur_entry = (struct async_node *)task->data1; - added = task->data2; - - if ((added & AC_FOUND_DEVICE) != 0) { - /* - * Get this peripheral up to date with all - * the currently existing devices. - */ - xpt_for_all_devices(xptsetasyncfunc, cur_entry); - } - if ((added & AC_PATH_REGISTERED) != 0) { - /* - * Get this peripheral up to date with all - * the currently existing busses. - */ - xpt_for_all_busses(xptsetasyncbusfunc, cur_entry); - } - - free(task, M_CAMXPT); -} - void xpt_action(union ccb *start_ccb) { @@ -2406,6 +2315,9 @@ xpt_action(union ccb *start_ccb) CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_action\n")); start_ccb->ccb_h.status = CAM_REQ_INPROG; + /* Compatibility for RL-unaware code. */ + if (CAM_PRIORITY_TO_RL(start_ccb->ccb_h.pinfo.priority) == 0) + start_ccb->ccb_h.pinfo.priority += CAM_PRIORITY_NORMAL - 1; (*(start_ccb->ccb_h.path->bus->xport->action))(start_ccb); } @@ -2471,17 +2383,14 @@ xpt_action_default(union ccb *start_ccb) case XPT_RESET_DEV: case XPT_ENG_EXEC: { - struct cam_path *path; - int runq; + struct cam_path *path = start_ccb->ccb_h.path; + int frozen; - path = start_ccb->ccb_h.path; - - cam_ccbq_insert_ccb(&path->device->ccbq, start_ccb); - if (path->device->ccbq.queue.qfrozen_cnt == 0) - runq = xpt_schedule_dev_sendq(path->bus, path->device); - else - runq = 0; - if (runq != 0) + frozen = cam_ccbq_insert_ccb(&path->device->ccbq, start_ccb); + path->device->sim->devq->alloc_openings += frozen; + if (frozen > 0) + xpt_run_dev_allocq(path->bus); + if (xpt_schedule_dev_sendq(path->bus, path->device)) xpt_run_dev_sendq(path->bus); break; } @@ -2526,9 +2435,12 @@ xpt_action_default(union ccb *start_ccb) if (abort_ccb->ccb_h.pinfo.index >= 0) { struct cam_ccbq *ccbq; + struct cam_ed *device; - ccbq = &abort_ccb->ccb_h.path->device->ccbq; - cam_ccbq_remove_ccb(ccbq, abort_ccb); + device = abort_ccb->ccb_h.path->device; + ccbq = &device->ccbq; + device->sim->devq->alloc_openings -= + cam_ccbq_remove_ccb(ccbq, abort_ccb); abort_ccb->ccb_h.status = CAM_REQ_ABORTED|CAM_DEV_QFRZN; xpt_freeze_devq(abort_ccb->ccb_h.path, 1); @@ -2613,6 +2525,7 @@ xpt_action_default(union ccb *start_ccb) cgd->protocol = dev->protocol; cgd->inq_data = dev->inq_data; cgd->ident_data = dev->ident_data; + cgd->inq_flags = dev->inq_flags; cgd->ccb_h.status = CAM_REQ_CMP; cgd->serial_num_len = dev->serial_num_len; if ((dev->serial_num_len > 0) @@ -2806,11 +2719,12 @@ xpt_action_default(union ccb *start_ccb) if (csa->event_enable == 0) { SLIST_REMOVE(async_head, cur_entry, async_node, links); - csa->ccb_h.path->device->refcount--; + xpt_release_device(csa->ccb_h.path->device); free(cur_entry, M_CAMXPT); } else { cur_entry->event_enable = csa->event_enable; } + csa->event_enable = added; } else { cur_entry = malloc(sizeof(*cur_entry), M_CAMXPT, M_NOWAIT); @@ -2822,29 +2736,8 @@ xpt_action_default(union ccb *start_ccb) cur_entry->callback_arg = csa->callback_arg; cur_entry->callback = csa->callback; SLIST_INSERT_HEAD(async_head, cur_entry, links); - csa->ccb_h.path->device->refcount++; + xpt_acquire_device(csa->ccb_h.path->device); } - - /* - * Need to decouple this operation via a taqskqueue so that - * the locking doesn't become a mess. - */ - if ((added & (AC_FOUND_DEVICE | AC_PATH_REGISTERED)) != 0) { - struct xpt_task *task; - - task = malloc(sizeof(struct xpt_task), M_CAMXPT, - M_NOWAIT); - if (task == NULL) { - csa->ccb_h.status = CAM_RESRC_UNAVAIL; - break; - } - - TASK_INIT(&task->task, 0, xpt_action_sasync_cb, task); - task->data1 = cur_entry; - task->data2 = added; - taskqueue_enqueue(taskqueue_thread, &task->task); - } - start_ccb->ccb_h.status = CAM_REQ_CMP; break; } @@ -2932,11 +2825,12 @@ xpt_action_default(union ccb *start_ccb) } if ((start_ccb->ccb_h.flags & CAM_DEV_QFREEZE) == 0) { - - xpt_release_devq(crs->ccb_h.path, /*count*/1, - /*run_queue*/TRUE); + xpt_release_devq_rl(crs->ccb_h.path, /*runlevel*/ + (crs->release_flags & RELSIM_RELEASE_RUNLEVEL) ? + crs->release_timeout : 0, + /*count*/1, /*run_queue*/TRUE); } - start_ccb->crs.qfrozen_cnt = dev->ccbq.queue.qfrozen_cnt; + start_ccb->crs.qfrozen_cnt = dev->ccbq.queue.qfrozen_cnt[0]; start_ccb->ccb_h.status = CAM_REQ_CMP; break; } @@ -2973,6 +2867,16 @@ xpt_action_default(union ccb *start_ccb) #endif /* CAMDEBUG */ break; } + case XPT_FREEZE_QUEUE: + { + struct ccb_relsim *crs = &start_ccb->crs; + + xpt_freeze_devq_rl(crs->ccb_h.path, /*runlevel*/ + (crs->release_flags & RELSIM_RELEASE_RUNLEVEL) ? + crs->release_timeout : 0, /*count*/1); + start_ccb->ccb_h.status = CAM_REQ_CMP; + break; + } case XPT_NOOP: if ((start_ccb->ccb_h.flags & CAM_DEV_QFREEZE) != 0) xpt_freeze_devq(start_ccb->ccb_h.path, 1); @@ -3053,7 +2957,7 @@ void xpt_schedule(struct cam_periph *perph, u_int32_t new_priority) { struct cam_ed *device; - int runq; + int runq = 0; mtx_assert(perph->sim->mtx, MA_OWNED); @@ -3067,8 +2971,8 @@ xpt_schedule(struct cam_periph *perph, u_int32_t new_priority) camq_change_priority(&device->drvq, perph->pinfo.index, new_priority); + runq = xpt_schedule_dev_allocq(perph->path->bus, device); } - runq = 0; } else { /* New entry on the queue */ CAM_DEBUG(perph->path, CAM_DEBUG_SUBTRACE, @@ -3116,8 +3020,9 @@ xpt_schedule_dev(struct camq *queue, cam_pinfo *pinfo, CAM_DEBUG_PRINT(CAM_DEBUG_XPT, ("changed priority to %d\n", new_priority)); - } - retval = 0; + retval = 1; + } else + retval = 0; } else { /* New entry on the queue */ if (new_priority < old_priority) @@ -3143,15 +3048,15 @@ xpt_run_dev_allocq(struct cam_eb *bus) CAM_DEBUG_PRINT(CAM_DEBUG_XPT, (" qfrozen_cnt == 0x%x, entries == %d, " "openings == %d, active == %d\n", - devq->alloc_queue.qfrozen_cnt, + devq->alloc_queue.qfrozen_cnt[0], devq->alloc_queue.entries, devq->alloc_openings, devq->alloc_active)); - devq->alloc_queue.qfrozen_cnt++; + devq->alloc_queue.qfrozen_cnt[0]++; while ((devq->alloc_queue.entries > 0) && (devq->alloc_openings > 0) - && (devq->alloc_queue.qfrozen_cnt <= 1)) { + && (devq->alloc_queue.qfrozen_cnt[0] <= 1)) { struct cam_ed_qinfo *qinfo; struct cam_ed *device; union ccb *work_ccb; @@ -3161,7 +3066,6 @@ xpt_run_dev_allocq(struct cam_eb *bus) qinfo = (struct cam_ed_qinfo *)camq_remove(&devq->alloc_queue, CAMQ_HEAD); device = qinfo->device; - CAM_DEBUG_PRINT(CAM_DEBUG_XPT, ("running device %p\n", device)); @@ -3195,15 +3099,13 @@ xpt_run_dev_allocq(struct cam_eb *bus) break; } - if (drvq->entries > 0) { - /* We have more work. Attempt to reschedule */ - xpt_schedule_dev_allocq(bus, device); - } + /* We may have more work. Attempt to reschedule. */ + xpt_schedule_dev_allocq(bus, device); } - devq->alloc_queue.qfrozen_cnt--; + devq->alloc_queue.qfrozen_cnt[0]--; } -void +static void xpt_run_dev_sendq(struct cam_eb *bus) { struct cam_devq *devq; @@ -3212,30 +3114,18 @@ xpt_run_dev_sendq(struct cam_eb *bus) devq = bus->sim->devq; - devq->send_queue.qfrozen_cnt++; + devq->send_queue.qfrozen_cnt[0]++; while ((devq->send_queue.entries > 0) - && (devq->send_openings > 0)) { + && (devq->send_openings > 0) + && (devq->send_queue.qfrozen_cnt[0] <= 1)) { struct cam_ed_qinfo *qinfo; struct cam_ed *device; union ccb *work_ccb; struct cam_sim *sim; - if (devq->send_queue.qfrozen_cnt > 1) { - break; - } - qinfo = (struct cam_ed_qinfo *)camq_remove(&devq->send_queue, CAMQ_HEAD); device = qinfo->device; - - /* - * If the device has been "frozen", don't attempt - * to run it. - */ - if (device->ccbq.queue.qfrozen_cnt > 0) { - continue; - } - CAM_DEBUG_PRINT(CAM_DEBUG_XPT, ("running device %p\n", device)); @@ -3255,7 +3145,7 @@ xpt_run_dev_sendq(struct cam_eb *bus) * the device queue until we have a slot * available. */ - device->ccbq.queue.qfrozen_cnt++; + xpt_freeze_devq(work_ccb->ccb_h.path, 1); STAILQ_INSERT_TAIL(&xsoftc.highpowerq, &work_ccb->ccb_h, xpt_links.stqe); @@ -3271,23 +3161,20 @@ xpt_run_dev_sendq(struct cam_eb *bus) } mtx_unlock(&xsoftc.xpt_lock); } - devq->active_dev = device; cam_ccbq_remove_ccb(&device->ccbq, work_ccb); - cam_ccbq_send_ccb(&device->ccbq, work_ccb); devq->send_openings--; devq->send_active++; - if (device->ccbq.queue.entries > 0) - xpt_schedule_dev_sendq(bus, device); + xpt_schedule_dev_sendq(bus, device); if (work_ccb && (work_ccb->ccb_h.flags & CAM_DEV_QFREEZE) != 0){ /* * The client wants to freeze the queue * after this CCB is sent. */ - device->ccbq.queue.qfrozen_cnt++; + xpt_freeze_devq(work_ccb->ccb_h.path, 1); } /* In Target mode, the peripheral driver knows best... */ @@ -3311,10 +3198,8 @@ xpt_run_dev_sendq(struct cam_eb *bus) */ sim = work_ccb->ccb_h.path->bus->sim; (*(sim->sim_action))(sim, work_ccb); - - devq->active_dev = NULL; } - devq->send_queue.qfrozen_cnt--; + devq->send_queue.qfrozen_cnt[0]--; } /* @@ -3475,9 +3360,9 @@ xpt_compile_path(struct cam_path *new_path, struct cam_periph *perph, CAM_DEBUG(new_path, CAM_DEBUG_TRACE, ("xpt_compile_path\n")); } else { if (device != NULL) - xpt_release_device(bus, target, device); + xpt_release_device(device); if (target != NULL) - xpt_release_target(bus, target); + xpt_release_target(target); if (bus != NULL) xpt_release_bus(bus); } @@ -3489,11 +3374,11 @@ xpt_release_path(struct cam_path *path) { CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_release_path\n")); if (path->device != NULL) { - xpt_release_device(path->bus, path->target, path->device); + xpt_release_device(path->device); path->device = NULL; } if (path->target != NULL) { - xpt_release_target(path->bus, path->target); + xpt_release_target(path->target); path->target = NULL; } if (path->bus != NULL) { @@ -3703,6 +3588,11 @@ xpt_release_ccb(union ccb *free_ccb) mtx_assert(sim->mtx, MA_OWNED); cam_ccbq_release_opening(&device->ccbq); + if (device->flags & CAM_DEV_RESIZE_QUEUE_NEEDED) { + device->flags &= ~CAM_DEV_RESIZE_QUEUE_NEEDED; + cam_ccbq_resize(&device->ccbq, + device->ccbq.dev_openings + device->ccbq.dev_active); + } if (sim->ccb_count > sim->max_ccbs) { xpt_free_ccb(free_ccb); sim->ccb_count--; @@ -3715,13 +3605,9 @@ xpt_release_ccb(union ccb *free_ccb) } sim->devq->alloc_openings++; sim->devq->alloc_active--; - /* XXX Turn this into an inline function - xpt_run_device?? */ - if ((device_is_alloc_queued(device) == 0) - && (device->drvq.entries > 0)) { + if (device_is_alloc_queued(device) == 0) xpt_schedule_dev_allocq(bus, device); - } - if (dev_allocq_is_runnable(sim->devq)) - xpt_run_dev_allocq(bus); + xpt_run_dev_allocq(bus); } /* Functions accessed by SIM drivers */ @@ -3747,7 +3633,7 @@ xpt_bus_register(struct cam_sim *sim, device_t parent, u_int32_t bus) struct cam_eb *new_bus; struct cam_eb *old_bus; struct ccb_pathinq cpi; - struct cam_path path; + struct cam_path *path; cam_status status; mtx_assert(sim->mtx, MA_OWNED); @@ -3759,6 +3645,11 @@ xpt_bus_register(struct cam_sim *sim, device_t parent, u_int32_t bus) /* Couldn't satisfy request */ return (CAM_RESRC_UNAVAIL); } + path = (struct cam_path *)malloc(sizeof(*path), M_CAMXPT, M_NOWAIT); + if (path == NULL) { + free(new_bus, M_CAMXPT); + return (CAM_RESRC_UNAVAIL); + } if (strcmp(sim->sim_name, "xpt") != 0) { sim->path_id = @@ -3793,13 +3684,12 @@ xpt_bus_register(struct cam_sim *sim, device_t parent, u_int32_t bus) */ new_bus->xport = &xport_default; - bzero(&path, sizeof(path)); - status = xpt_compile_path(&path, /*periph*/NULL, sim->path_id, + status = xpt_compile_path(path, /*periph*/NULL, sim->path_id, CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD); if (status != CAM_REQ_CMP) printf("xpt_compile_path returned %d\n", status); - xpt_setup_ccb(&cpi.ccb_h, &path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NORMAL); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -3825,9 +3715,17 @@ xpt_bus_register(struct cam_sim *sim, device_t parent, u_int32_t bus) /* Notify interested parties */ if (sim->path_id != CAM_XPT_PATH_ID) { - xpt_async(AC_PATH_REGISTERED, &path, &cpi); - } - xpt_release_path(&path); + union ccb *scan_ccb; + + xpt_async(AC_PATH_REGISTERED, path, &cpi); + /* Initiate bus rescan. */ + scan_ccb = xpt_alloc_ccb_nowait(); + scan_ccb->ccb_h.path = path; + scan_ccb->ccb_h.func_code = XPT_SCAN_BUS; + scan_ccb->crcn.flags = 0; + xpt_rescan(scan_ccb); + } else + xpt_free_path(path); return (CAM_SUCCESS); } @@ -3978,13 +3876,19 @@ xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg) && path->device->lun_id != CAM_LUN_WILDCARD && device->lun_id != CAM_LUN_WILDCARD) continue; - + /* + * The async callback could free the device. + * If it is a broadcast async, it doesn't hold + * device reference, so take our own reference. + */ + xpt_acquire_device(device); (*(bus->xport->async))(async_code, bus, target, device, async_arg); xpt_async_bcast(&device->asyncs, async_code, path, async_arg); + xpt_release_device(device); } } @@ -4030,48 +3934,43 @@ xpt_dev_async_default(u_int32_t async_code, struct cam_eb *bus, } u_int32_t -xpt_freeze_devq(struct cam_path *path, u_int count) +xpt_freeze_devq_rl(struct cam_path *path, cam_rl rl, u_int count) { - struct ccb_hdr *ccbh; + struct cam_ed *dev = path->device; mtx_assert(path->bus->sim->mtx, MA_OWNED); + dev->sim->devq->alloc_openings += + cam_ccbq_freeze(&dev->ccbq, rl, count); + /* Remove frozen device from allocq. */ + if (device_is_alloc_queued(dev) && + cam_ccbq_frozen(&dev->ccbq, CAM_PRIORITY_TO_RL( + CAMQ_GET_PRIO(&dev->drvq)))) { + camq_remove(&dev->sim->devq->alloc_queue, + dev->alloc_ccb_entry.pinfo.index); + } + /* Remove frozen device from sendq. */ + if (device_is_send_queued(dev) && + cam_ccbq_frozen_top(&dev->ccbq)) { + camq_remove(&dev->sim->devq->send_queue, + dev->send_ccb_entry.pinfo.index); + } + return (dev->ccbq.queue.qfrozen_cnt[rl]); +} - path->device->ccbq.queue.qfrozen_cnt += count; +u_int32_t +xpt_freeze_devq(struct cam_path *path, u_int count) +{ - /* - * Mark the last CCB in the queue as needing - * to be requeued if the driver hasn't - * changed it's state yet. This fixes a race - * where a ccb is just about to be queued to - * a controller driver when it's interrupt routine - * freezes the queue. To completly close the - * hole, controller drives must check to see - * if a ccb's status is still CAM_REQ_INPROG - * just before they queue - * the CCB. See ahc_action/ahc_freeze_devq for - * an example. - */ - ccbh = TAILQ_LAST(&path->device->ccbq.active_ccbs, ccb_hdr_tailq); - if (ccbh && ccbh->status == CAM_REQ_INPROG) - ccbh->status = CAM_REQUEUE_REQ; - return (path->device->ccbq.queue.qfrozen_cnt); + return (xpt_freeze_devq_rl(path, 0, count)); } u_int32_t xpt_freeze_simq(struct cam_sim *sim, u_int count) { + mtx_assert(sim->mtx, MA_OWNED); - - sim->devq->send_queue.qfrozen_cnt += count; - if (sim->devq->active_dev != NULL) { - struct ccb_hdr *ccbh; - - ccbh = TAILQ_LAST(&sim->devq->active_dev->ccbq.active_ccbs, - ccb_hdr_tailq); - if (ccbh && ccbh->status == CAM_REQ_INPROG) - ccbh->status = CAM_REQUEUE_REQ; - } - return (sim->devq->send_queue.qfrozen_cnt); + sim->devq->send_queue.qfrozen_cnt[0] += count; + return (sim->devq->send_queue.qfrozen_cnt[0]); } static void @@ -4081,7 +3980,7 @@ xpt_release_devq_timeout(void *arg) device = (struct cam_ed *)arg; - xpt_release_devq_device(device, /*count*/1, /*run_queue*/TRUE); + xpt_release_devq_device(device, /*rl*/0, /*count*/1, /*run_queue*/TRUE); } void @@ -4089,51 +3988,59 @@ xpt_release_devq(struct cam_path *path, u_int count, int run_queue) { mtx_assert(path->bus->sim->mtx, MA_OWNED); - xpt_release_devq_device(path->device, count, run_queue); + xpt_release_devq_device(path->device, /*rl*/0, count, run_queue); +} + +void +xpt_release_devq_rl(struct cam_path *path, cam_rl rl, u_int count, int run_queue) +{ + mtx_assert(path->bus->sim->mtx, MA_OWNED); + + xpt_release_devq_device(path->device, rl, count, run_queue); } static void -xpt_release_devq_device(struct cam_ed *dev, u_int count, int run_queue) +xpt_release_devq_device(struct cam_ed *dev, cam_rl rl, u_int count, int run_queue) { - int rundevq; - rundevq = 0; - if (dev->ccbq.queue.qfrozen_cnt > 0) { - - count = (count > dev->ccbq.queue.qfrozen_cnt) ? - dev->ccbq.queue.qfrozen_cnt : count; - dev->ccbq.queue.qfrozen_cnt -= count; - if (dev->ccbq.queue.qfrozen_cnt == 0) { - - /* - * No longer need to wait for a successful - * command completion. - */ - dev->flags &= ~CAM_DEV_REL_ON_COMPLETE; - - /* - * Remove any timeouts that might be scheduled - * to release this queue. - */ - if ((dev->flags & CAM_DEV_REL_TIMEOUT_PENDING) != 0) { - callout_stop(&dev->callout); - dev->flags &= ~CAM_DEV_REL_TIMEOUT_PENDING; - } - - /* - * Now that we are unfrozen schedule the - * device so any pending transactions are - * run. - */ - if ((dev->ccbq.queue.entries > 0) - && (xpt_schedule_dev_sendq(dev->target->bus, dev)) - && (run_queue != 0)) { - rundevq = 1; - } - } + if (count > dev->ccbq.queue.qfrozen_cnt[rl]) { +#ifdef INVARIANTS + printf("xpt_release_devq(%d): requested %u > present %u\n", + rl, count, dev->ccbq.queue.qfrozen_cnt[rl]); +#endif + count = dev->ccbq.queue.qfrozen_cnt[rl]; + } + dev->sim->devq->alloc_openings -= + cam_ccbq_release(&dev->ccbq, rl, count); + if (cam_ccbq_frozen(&dev->ccbq, CAM_PRIORITY_TO_RL( + CAMQ_GET_PRIO(&dev->drvq))) == 0) { + if (xpt_schedule_dev_allocq(dev->target->bus, dev)) + xpt_run_dev_allocq(dev->target->bus); + } + if (cam_ccbq_frozen_top(&dev->ccbq) == 0) { + /* + * No longer need to wait for a successful + * command completion. + */ + dev->flags &= ~CAM_DEV_REL_ON_COMPLETE; + /* + * Remove any timeouts that might be scheduled + * to release this queue. + */ + if ((dev->flags & CAM_DEV_REL_TIMEOUT_PENDING) != 0) { + callout_stop(&dev->callout); + dev->flags &= ~CAM_DEV_REL_TIMEOUT_PENDING; + } + if (run_queue == 0) + return; + /* + * Now that we are unfrozen schedule the + * device so any pending transactions are + * run. + */ + if (xpt_schedule_dev_sendq(dev->target->bus, dev)) + xpt_run_dev_sendq(dev->target->bus); } - if (rundevq != 0) - xpt_run_dev_sendq(dev->target->bus); } void @@ -4142,31 +4049,32 @@ xpt_release_simq(struct cam_sim *sim, int run_queue) struct camq *sendq; mtx_assert(sim->mtx, MA_OWNED); - sendq = &(sim->devq->send_queue); - if (sendq->qfrozen_cnt > 0) { - - sendq->qfrozen_cnt--; - if (sendq->qfrozen_cnt == 0) { + if (sendq->qfrozen_cnt[0] <= 0) { +#ifdef INVARIANTS + printf("xpt_release_simq: requested 1 > present %u\n", + sendq->qfrozen_cnt[0]); +#endif + } else + sendq->qfrozen_cnt[0]--; + if (sendq->qfrozen_cnt[0] == 0) { + /* + * If there is a timeout scheduled to release this + * sim queue, remove it. The queue frozen count is + * already at 0. + */ + if ((sim->flags & CAM_SIM_REL_TIMEOUT_PENDING) != 0){ + callout_stop(&sim->callout); + sim->flags &= ~CAM_SIM_REL_TIMEOUT_PENDING; + } + if (run_queue) { struct cam_eb *bus; /* - * If there is a timeout scheduled to release this - * sim queue, remove it. The queue frozen count is - * already at 0. + * Now that we are unfrozen run the send queue. */ - if ((sim->flags & CAM_SIM_REL_TIMEOUT_PENDING) != 0){ - callout_stop(&sim->callout); - sim->flags &= ~CAM_SIM_REL_TIMEOUT_PENDING; - } bus = xpt_find_bus(sim->path_id); - - if (run_queue) { - /* - * Now that we are unfrozen run the send queue. - */ - xpt_run_dev_sendq(bus); - } + xpt_run_dev_sendq(bus); xpt_release_bus(bus); } } @@ -4188,6 +4096,7 @@ void xpt_done(union ccb *done_ccb) { struct cam_sim *sim; + int first; CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_done\n")); if ((done_ccb->ccb_h.func_code & XPT_FC_QUEUED) != 0) { @@ -4196,25 +4105,17 @@ xpt_done(union ccb *done_ccb) * any of the "non-immediate" type of ccbs. */ sim = done_ccb->ccb_h.path->bus->sim; - switch (done_ccb->ccb_h.path->periph->type) { - case CAM_PERIPH_BIO: - TAILQ_INSERT_TAIL(&sim->sim_doneq, &done_ccb->ccb_h, - sim_links.tqe); - done_ccb->ccb_h.pinfo.index = CAM_DONEQ_INDEX; - if ((sim->flags & CAM_SIM_ON_DONEQ) == 0) { - mtx_lock(&cam_simq_lock); - TAILQ_INSERT_TAIL(&cam_simq, sim, - links); - mtx_unlock(&cam_simq_lock); - sim->flags |= CAM_SIM_ON_DONEQ; - if ((done_ccb->ccb_h.path->periph->flags & - CAM_PERIPH_POLLED) == 0) - swi_sched(cambio_ih, 0); - } - break; - default: - panic("unknown periph type %d", - done_ccb->ccb_h.path->periph->type); + TAILQ_INSERT_TAIL(&sim->sim_doneq, &done_ccb->ccb_h, + sim_links.tqe); + done_ccb->ccb_h.pinfo.index = CAM_DONEQ_INDEX; + if ((sim->flags & CAM_SIM_ON_DONEQ) == 0) { + mtx_lock(&cam_simq_lock); + first = TAILQ_EMPTY(&cam_simq); + TAILQ_INSERT_TAIL(&cam_simq, sim, links); + mtx_unlock(&cam_simq_lock); + sim->flags |= CAM_SIM_ON_DONEQ; + if (first) + swi_sched(cambio_ih, 0); } } } @@ -4329,15 +4230,15 @@ xpt_alloc_target(struct cam_eb *bus, target_id_t target_id) } static void -xpt_release_target(struct cam_eb *bus, struct cam_et *target) +xpt_release_target(struct cam_et *target) { if ((--target->refcount == 0) && (TAILQ_FIRST(&target->ed_entries) == NULL)) { - TAILQ_REMOVE(&bus->et_entries, target, links); - bus->generation++; + TAILQ_REMOVE(&target->bus->et_entries, target, links); + target->bus->generation++; + xpt_release_bus(target->bus); free(target, M_CAMXPT); - xpt_release_bus(bus); } } @@ -4353,7 +4254,7 @@ xpt_alloc_device_default(struct cam_eb *bus, struct cam_et *target, device->mintags = 1; device->maxtags = 1; - bus->sim->max_ccbs = device->ccbq.devq_openings; + bus->sim->max_ccbs += device->ccbq.devq_openings; cur_device = TAILQ_FIRST(&target->ed_entries); while (cur_device != NULL && cur_device->lun_id < lun_id) cur_device = TAILQ_NEXT(cur_device, links); @@ -4424,13 +4325,18 @@ xpt_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id) return (device); } -static void -xpt_release_device(struct cam_eb *bus, struct cam_et *target, - struct cam_ed *device) +void +xpt_acquire_device(struct cam_ed *device) { - if ((--device->refcount == 0) - && ((device->flags & CAM_DEV_UNCONFIGURED) != 0)) { + device->refcount++; +} + +void +xpt_release_device(struct cam_ed *device) +{ + + if (--device->refcount == 0) { struct cam_devq *devq; if (device->alloc_ccb_entry.pinfo.index != CAM_UNQUEUED_INDEX @@ -4440,16 +4346,16 @@ xpt_release_device(struct cam_eb *bus, struct cam_et *target, if ((device->flags & CAM_DEV_REL_TIMEOUT_PENDING) != 0) callout_stop(&device->callout); - TAILQ_REMOVE(&target->ed_entries, device,links); - target->generation++; - bus->sim->max_ccbs -= device->ccbq.devq_openings; + TAILQ_REMOVE(&device->target->ed_entries, device,links); + device->target->generation++; + device->target->bus->sim->max_ccbs -= device->ccbq.devq_openings; /* Release our slot in the devq */ - devq = bus->sim->devq; + devq = device->target->bus->sim->devq; cam_devq_resize(devq, devq->alloc_queue.array_size - 1); camq_fini(&device->drvq); - camq_fini(&device->ccbq.queue); + cam_ccbq_fini(&device->ccbq); + xpt_release_target(device->target); free(device, M_CAMXPT); - xpt_release_target(bus, target); } } @@ -4525,7 +4431,7 @@ xpt_find_device(struct cam_et *target, lun_id_t lun_id) return (device); } -static void +void xpt_start_tags(struct cam_path *path) { struct ccb_relsim crs; @@ -4544,7 +4450,7 @@ xpt_start_tags(struct cam_path *path) newopenings = min(device->maxtags, sim->max_tagged_dev_openings); xpt_dev_ccbq_resize(path, newopenings); - xpt_setup_ccb(&crs.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&crs.ccb_h, path, CAM_PRIORITY_NORMAL); crs.ccb_h.func_code = XPT_REL_SIMQ; crs.release_flags = RELSIM_RELEASE_AFTER_QEMPTY; crs.openings @@ -4554,96 +4460,35 @@ xpt_start_tags(struct cam_path *path) xpt_action((union ccb *)&crs); } -static int busses_to_config; -static int busses_to_reset; - -static int -xptconfigbuscountfunc(struct cam_eb *bus, void *arg) +void +xpt_stop_tags(struct cam_path *path) { + struct ccb_relsim crs; + struct cam_ed *device; + struct cam_sim *sim; - mtx_assert(bus->sim->mtx, MA_OWNED); - - if (bus->path_id != CAM_XPT_PATH_ID) { - struct cam_path path; - struct ccb_pathinq cpi; - int can_negotiate; - - busses_to_config++; - xpt_compile_path(&path, NULL, bus->path_id, - CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD); - xpt_setup_ccb(&cpi.ccb_h, &path, /*priority*/1); - cpi.ccb_h.func_code = XPT_PATH_INQ; - xpt_action((union ccb *)&cpi); - can_negotiate = cpi.hba_inquiry; - can_negotiate &= (PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE); - if ((cpi.hba_misc & PIM_NOBUSRESET) == 0 - && can_negotiate) - busses_to_reset++; - xpt_release_path(&path); - } - - return(1); + device = path->device; + sim = path->bus->sim; + device->flags &= ~CAM_DEV_TAG_AFTER_COUNT; + device->tag_delay_count = 0; + xpt_freeze_devq(path, /*count*/1); + device->inq_flags &= ~SID_CmdQue; + xpt_dev_ccbq_resize(path, sim->max_dev_openings); + xpt_setup_ccb(&crs.ccb_h, path, CAM_PRIORITY_NORMAL); + crs.ccb_h.func_code = XPT_REL_SIMQ; + crs.release_flags = RELSIM_RELEASE_AFTER_QEMPTY; + crs.openings + = crs.release_timeout + = crs.qfrozen_cnt + = 0; + xpt_action((union ccb *)&crs); } -static int -xptconfigfunc(struct cam_eb *bus, void *arg) +static void +xpt_boot_delay(void *arg) { - struct cam_path *path; - union ccb *work_ccb; - mtx_assert(bus->sim->mtx, MA_OWNED); - - if (bus->path_id != CAM_XPT_PATH_ID) { - cam_status status; - int can_negotiate; - - work_ccb = xpt_alloc_ccb_nowait(); - if (work_ccb == NULL) { - busses_to_config--; - xpt_finishconfig(xpt_periph, NULL); - return(0); - } - if ((status = xpt_create_path(&path, xpt_periph, bus->path_id, - CAM_TARGET_WILDCARD, - CAM_LUN_WILDCARD)) !=CAM_REQ_CMP){ - printf("xptconfigfunc: xpt_create_path failed with " - "status %#x for scbus%d\n", status, bus->path_id); - printf("xptconfigfunc: halting bus configuration\n"); - xpt_free_ccb(work_ccb); - busses_to_config--; - xpt_finishconfig(xpt_periph, NULL); - return(0); - } - xpt_setup_ccb(&work_ccb->ccb_h, path, /*priority*/1); - work_ccb->ccb_h.func_code = XPT_PATH_INQ; - xpt_action(work_ccb); - if (work_ccb->ccb_h.status != CAM_REQ_CMP) { - printf("xptconfigfunc: CPI failed on scbus%d " - "with status %d\n", bus->path_id, - work_ccb->ccb_h.status); - xpt_finishconfig(xpt_periph, work_ccb); - return(1); - } - - can_negotiate = work_ccb->cpi.hba_inquiry; - can_negotiate &= (PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE); - if ((work_ccb->cpi.hba_misc & PIM_NOBUSRESET) == 0 - && (can_negotiate != 0)) { - xpt_setup_ccb(&work_ccb->ccb_h, path, /*priority*/1); - work_ccb->ccb_h.func_code = XPT_RESET_BUS; - work_ccb->ccb_h.cbfcnp = NULL; - CAM_DEBUG(path, CAM_DEBUG_SUBTRACE, - ("Resetting Bus\n")); - xpt_action(work_ccb); - xpt_finishconfig(xpt_periph, work_ccb); - } else { - /* Act as though we performed a successful BUS RESET */ - work_ccb->ccb_h.func_code = XPT_RESET_BUS; - xpt_finishconfig(xpt_periph, work_ccb); - } - } - - return(1); + xpt_release_boot(); } static void @@ -4682,21 +4527,49 @@ xpt_config(void *arg) #endif /* CAM_DEBUG_BUS */ #endif /* CAMDEBUG */ - /* - * Scan all installed busses. - */ - xpt_for_all_busses(xptconfigbuscountfunc, NULL); - - if (busses_to_config == 0) { - /* Call manually because we don't have any busses */ - xpt_finishconfig(xpt_periph, NULL); - } else { - if (busses_to_reset > 0 && scsi_delay >= 2000) { - printf("Waiting %d seconds for SCSI " - "devices to settle\n", scsi_delay/1000); - } - xpt_for_all_busses(xptconfigfunc, NULL); + /* Register our shutdown event handler */ + if ((EVENTHANDLER_REGISTER(shutdown_final, xpt_shutdown, + NULL, SHUTDOWN_PRI_FIRST)) == NULL) { + printf("xpt_config: failed to register shutdown event.\n"); } + + periphdriver_init(1); + xpt_hold_boot(); + callout_init(&xsoftc.boot_callout, 1); + callout_reset(&xsoftc.boot_callout, hz * xsoftc.boot_delay / 1000, + xpt_boot_delay, NULL); + /* Fire up rescan thread. */ + if (kproc_create(xpt_scanner_thread, NULL, NULL, 0, 0, "xpt_thrd")) { + printf("xpt_config: failed to create rescan thread.\n"); + } +} + +void +xpt_hold_boot(void) +{ + xpt_lock_buses(); + xsoftc.buses_to_config++; + xpt_unlock_buses(); +} + +void +xpt_release_boot(void) +{ + xpt_lock_buses(); + xsoftc.buses_to_config--; + if (xsoftc.buses_to_config == 0 && xsoftc.buses_config_done == 0) { + struct xpt_task *task; + + xsoftc.buses_config_done = 1; + xpt_unlock_buses(); + /* Call manually because we don't have any busses */ + task = malloc(sizeof(struct xpt_task), M_CAMXPT, M_NOWAIT); + if (task != NULL) { + TASK_INIT(&task->task, 0, xpt_finishconfig_task, task); + taskqueue_enqueue(taskqueue_thread, &task->task); + } + } else + xpt_unlock_buses(); } /* @@ -4724,69 +4597,102 @@ xptpassannouncefunc(struct cam_ed *device, void *arg) static void xpt_finishconfig_task(void *context, int pending) { - struct periph_driver **p_drv; - int i; - if (busses_to_config == 0) { - /* Register all the peripheral drivers */ - /* XXX This will have to change when we have loadable modules */ - p_drv = periph_drivers; - for (i = 0; p_drv[i] != NULL; i++) { - (*p_drv[i]->init)(); - } + periphdriver_init(2); + /* + * Check for devices with no "standard" peripheral driver + * attached. For any devices like that, announce the + * passthrough driver so the user will see something. + */ + xpt_for_all_devices(xptpassannouncefunc, NULL); - /* - * Check for devices with no "standard" peripheral driver - * attached. For any devices like that, announce the - * passthrough driver so the user will see something. - */ - xpt_for_all_devices(xptpassannouncefunc, NULL); - - /* Release our hook so that the boot can continue. */ - config_intrhook_disestablish(xsoftc.xpt_config_hook); - free(xsoftc.xpt_config_hook, M_CAMXPT); - xsoftc.xpt_config_hook = NULL; - } + /* Release our hook so that the boot can continue. */ + config_intrhook_disestablish(xsoftc.xpt_config_hook); + free(xsoftc.xpt_config_hook, M_CAMXPT); + xsoftc.xpt_config_hook = NULL; free(context, M_CAMXPT); } +/* + * Power down all devices when we are going to power down the system. + */ static void -xpt_finishconfig(struct cam_periph *periph, union ccb *done_ccb) +xpt_shutdown_dev_done(struct cam_periph *periph, union ccb *done_ccb) { - struct xpt_task *task; - if (done_ccb != NULL) { - CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, - ("xpt_finishconfig\n")); - switch(done_ccb->ccb_h.func_code) { - case XPT_RESET_BUS: - if (done_ccb->ccb_h.status == CAM_REQ_CMP) { - done_ccb->ccb_h.func_code = XPT_SCAN_BUS; - done_ccb->ccb_h.cbfcnp = xpt_finishconfig; - done_ccb->crcn.flags = 0; - xpt_action(done_ccb); - return; - } - /* FALLTHROUGH */ - case XPT_SCAN_BUS: - default: - xpt_free_path(done_ccb->ccb_h.path); - busses_to_config--; - break; - } + /* No-op. We're polling. */ + return; +} + +static int +xpt_shutdown_dev(struct cam_ed *device, void *arg) +{ + union ccb ccb; + struct cam_path path; + + if (device->flags & CAM_DEV_UNCONFIGURED) + return (1); + + if (device->protocol == PROTO_ATA) { + /* Only power down device if it supports power management. */ + if ((device->ident_data.support.command1 & + ATA_SUPPORT_POWERMGT) == 0) + return (1); + } else if (device->protocol != PROTO_SCSI) + return (1); + + xpt_compile_path(&path, + NULL, + device->target->bus->path_id, + device->target->target_id, + device->lun_id); + xpt_setup_ccb(&ccb.ccb_h, &path, CAM_PRIORITY_NORMAL); + if (device->protocol == PROTO_ATA) { + cam_fill_ataio(&ccb.ataio, + 1, + xpt_shutdown_dev_done, + CAM_DIR_NONE, + 0, + NULL, + 0, + 30*1000); + ata_28bit_cmd(&ccb.ataio, ATA_SLEEP, 0, 0, 0); + } else { + scsi_start_stop(&ccb.csio, + /*retries*/1, + xpt_shutdown_dev_done, + MSG_SIMPLE_Q_TAG, + /*start*/FALSE, + /*load/eject*/FALSE, + /*immediate*/TRUE, + SSD_FULL_SIZE, + /*timeout*/50*1000); } + xpt_polled_action(&ccb); - if (busses_to_config == 0) { - task = malloc(sizeof(struct xpt_task), M_CAMXPT, M_NOWAIT); - if (task != NULL) { - TASK_INIT(&task->task, 0, xpt_finishconfig_task, task); - taskqueue_enqueue(taskqueue_thread, &task->task); - } - } + if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) + xpt_print(&path, "Device power down failed\n"); + if ((ccb.ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(ccb.ccb_h.path, + /*relsim_flags*/0, + /*reduction*/0, + /*timeout*/0, + /*getcount_only*/0); + xpt_release_path(&path); + return (1); +} - if (done_ccb != NULL) - xpt_free_ccb(done_ccb); +static void +xpt_shutdown(void * arg, int howto) +{ + + if (!xpt_power_down) + return; + if ((howto & RB_POWEROFF) == 0) + return; + + xpt_for_all_devices(xpt_shutdown_dev, NULL); } cam_status @@ -4808,7 +4714,7 @@ xpt_register_async(int event, ac_callback_t *cbfunc, void *cbarg, xptpath = 1; } - xpt_setup_ccb(&csa.ccb_h, path, /*priority*/5); + xpt_setup_ccb(&csa.ccb_h, path, CAM_PRIORITY_NORMAL); csa.ccb_h.func_code = XPT_SASYNC_CB; csa.event_enable = event; csa.callback = cbfunc; @@ -4818,6 +4724,23 @@ xpt_register_async(int event, ac_callback_t *cbfunc, void *cbarg, if (xptpath) { xpt_free_path(path); mtx_unlock(&xsoftc.xpt_lock); + + if ((status == CAM_REQ_CMP) && + (csa.event_enable & AC_FOUND_DEVICE)) { + /* + * Get this peripheral up to date with all + * the currently existing devices. + */ + xpt_for_all_devices(xptsetasyncfunc, &csa); + } + if ((status == CAM_REQ_CMP) && + (csa.event_enable & AC_PATH_REGISTERED)) { + /* + * Get this peripheral up to date with all + * the currently existing busses. + */ + xpt_for_all_busses(xptsetasyncbusfunc, &csa); + } } return (status); } @@ -4961,26 +4884,19 @@ camisr_runqueue(void *V_queue) cam_ccbq_ccb_done(&dev->ccbq, (union ccb *)ccb_h); ccb_h->path->bus->sim->devq->send_active--; ccb_h->path->bus->sim->devq->send_openings++; + runq = TRUE; if (((dev->flags & CAM_DEV_REL_ON_COMPLETE) != 0 && (ccb_h->status&CAM_STATUS_MASK) != CAM_REQUEUE_REQ) || ((dev->flags & CAM_DEV_REL_ON_QUEUE_EMPTY) != 0 && (dev->ccbq.dev_active == 0))) { - xpt_release_devq(ccb_h->path, /*count*/1, - /*run_queue*/TRUE); + /*run_queue*/FALSE); } if ((dev->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 && (--dev->tag_delay_count == 0)) xpt_start_tags(ccb_h->path); - - if ((dev->ccbq.queue.entries > 0) - && (dev->ccbq.queue.qfrozen_cnt == 0) - && (device_is_send_queued(dev) == 0)) { - runq = xpt_schedule_dev_sendq(ccb_h->path->bus, - dev); - } } if (ccb_h->status & CAM_RELEASE_SIMQ) { diff --git a/sys/cam/cam_xpt.h b/sys/cam/cam_xpt.h index 283cad1c34e6..61a7f3f02d20 100644 --- a/sys/cam/cam_xpt.h +++ b/sys/cam/cam_xpt.h @@ -87,6 +87,9 @@ SLIST_HEAD(periph_list, cam_periph); void xpt_action(union ccb *new_ccb); void xpt_action_default(union ccb *new_ccb); +union ccb *xpt_alloc_ccb(void); +union ccb *xpt_alloc_ccb_nowait(void); +void xpt_free_ccb(union ccb *free_ccb); void xpt_setup_ccb(struct ccb_hdr *ccb_h, struct cam_path *path, u_int32_t priority); @@ -115,6 +118,8 @@ struct cam_periph *xpt_path_periph(struct cam_path *path); void xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg); void xpt_rescan(union ccb *ccb); +void xpt_hold_boot(void); +void xpt_release_boot(void); void xpt_lock_buses(void); void xpt_unlock_buses(void); cam_status xpt_register_async(int event, ac_callback_t *cbfunc, diff --git a/sys/cam/cam_xpt_internal.h b/sys/cam/cam_xpt_internal.h index e40cde84b57f..5fa4b5e6e681 100644 --- a/sys/cam/cam_xpt_internal.h +++ b/sys/cam/cam_xpt_internal.h @@ -37,17 +37,14 @@ struct cam_ed; typedef struct cam_ed * (*xpt_alloc_device_func)(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id); -typedef void (*xpt_release_device_func)(struct cam_eb *bus, - struct cam_et *target, - struct cam_ed *device); +typedef void (*xpt_release_device_func)(struct cam_ed *device); typedef void (*xpt_action_func)(union ccb *start_ccb); typedef void (*xpt_dev_async_func)(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, struct cam_ed *device, void *async_arg); -typedef void (*xpt_announce_periph_func)(struct cam_periph *periph, - char *announce_string); +typedef void (*xpt_announce_periph_func)(struct cam_periph *periph); struct xpt_xport { xpt_alloc_device_func alloc_device; @@ -116,6 +113,7 @@ struct cam_ed { #define CAM_DEV_INQUIRY_DATA_VALID 0x40 #define CAM_DEV_IN_DV 0x80 #define CAM_DEV_DV_HIT_BOTTOM 0x100 +#define CAM_DEV_IDENTIFY_DATA_VALID 0x200 u_int32_t tag_delay_count; #define CAM_TAG_DELAY_COUNT 5 u_int32_t tag_saved_openings; @@ -171,33 +169,13 @@ struct xpt_xport * ata_get_xport(void); struct cam_ed * xpt_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id); -void xpt_run_dev_sendq(struct cam_eb *bus); +void xpt_acquire_device(struct cam_ed *device); +void xpt_release_device(struct cam_ed *device); int xpt_schedule_dev(struct camq *queue, cam_pinfo *dev_pinfo, u_int32_t new_priority); u_int32_t xpt_dev_ccbq_resize(struct cam_path *path, int newopenings); - - - -static __inline int -xpt_schedule_dev_sendq(struct cam_eb *bus, struct cam_ed *dev) -{ - int retval; - - if (dev->ccbq.dev_openings > 0) { - /* - * The priority of a device waiting for controller - * resources is that of the the highest priority CCB - * enqueued. - */ - retval = - xpt_schedule_dev(&bus->sim->devq->send_queue, - &dev->send_ccb_entry.pinfo, - CAMQ_GET_HEAD(&dev->ccbq.queue)->priority); - } else { - retval = 0; - } - return (retval); -} +void xpt_start_tags(struct cam_path *path); +void xpt_stop_tags(struct cam_path *path); MALLOC_DECLARE(M_CAMXPT); diff --git a/sys/cam/cam_xpt_periph.h b/sys/cam/cam_xpt_periph.h index dbfb55eb7576..867b1c1d3813 100644 --- a/sys/cam/cam_xpt_periph.h +++ b/sys/cam/cam_xpt_periph.h @@ -39,9 +39,6 @@ /* Functions accessed by the peripheral drivers */ #ifdef _KERNEL void xpt_polled_action(union ccb *ccb); -union ccb *xpt_alloc_ccb(void); -union ccb *xpt_alloc_ccb_nowait(void); -void xpt_free_ccb(union ccb *free_ccb); void xpt_release_ccb(union ccb *released_ccb); void xpt_schedule(struct cam_periph *perph, u_int32_t new_priority); int32_t xpt_add_periph(struct cam_periph *periph); diff --git a/sys/cam/cam_xpt_sim.h b/sys/cam/cam_xpt_sim.h index e64c67c16fa1..323f786c813f 100644 --- a/sys/cam/cam_xpt_sim.h +++ b/sys/cam/cam_xpt_sim.h @@ -43,8 +43,12 @@ int32_t xpt_bus_deregister(path_id_t path_id); u_int32_t xpt_freeze_simq(struct cam_sim *sim, u_int count); void xpt_release_simq(struct cam_sim *sim, int run_queue); u_int32_t xpt_freeze_devq(struct cam_path *path, u_int count); -void xpt_release_devq(struct cam_path *path, u_int count, - int run_queue); +u_int32_t xpt_freeze_devq_rl(struct cam_path *path, cam_rl rl, + u_int count); +void xpt_release_devq(struct cam_path *path, + u_int count, int run_queue); +void xpt_release_devq_rl(struct cam_path *path, cam_rl rl, + u_int count, int run_queue); int xpt_sim_opened(struct cam_sim *sim); void xpt_done(union ccb *done_ccb); #endif diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c index d4db50bee4c7..d40a53659ecd 100644 --- a/sys/cam/scsi/scsi_all.c +++ b/sys/cam/scsi/scsi_all.c @@ -2880,7 +2880,7 @@ scsi_error_action(struct ccb_scsiio *csio, struct scsi_inquiry_data *inq_data, } } } -#ifdef KERNEL +#ifdef _KERNEL if (bootverbose) sense_flags |= SF_PRINT_ALWAYS; #endif @@ -2995,27 +2995,29 @@ scsi_command_string(struct cam_device *device, struct ccb_scsiio *csio, struct scsi_inquiry_data *inq_data; char cdb_str[(SCSI_MAX_CDBLEN * 3) + 1]; #ifdef _KERNEL - struct ccb_getdev cgd; + struct ccb_getdev *cgd; #endif /* _KERNEL */ #ifdef _KERNEL + if ((cgd = (struct ccb_getdev*)xpt_alloc_ccb_nowait()) == NULL) + return(-1); /* * Get the device information. */ - xpt_setup_ccb(&cgd.ccb_h, + xpt_setup_ccb(&cgd->ccb_h, csio->ccb_h.path, - /*priority*/ 1); - cgd.ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action((union ccb *)&cgd); + CAM_PRIORITY_NORMAL); + cgd->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action((union ccb *)cgd); /* * If the device is unconfigured, just pretend that it is a hard * drive. scsi_op_desc() needs this. */ - if (cgd.ccb_h.status == CAM_DEV_NOT_THERE) - cgd.inq_data.device = T_DIRECT; + if (cgd->ccb_h.status == CAM_DEV_NOT_THERE) + cgd->inq_data.device = T_DIRECT; - inq_data = &cgd.inq_data; + inq_data = &cgd->inq_data; #else /* !_KERNEL */ @@ -3055,7 +3057,7 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, struct scsi_sense_data *sense; struct scsi_inquiry_data *inq_data; #ifdef _KERNEL - struct ccb_getdev cgd; + struct ccb_getdev *cgd; #endif /* _KERNEL */ u_int32_t info; int error_code; @@ -3083,23 +3085,25 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, #endif /* _KERNEL/!_KERNEL */ #ifdef _KERNEL + if ((cgd = (struct ccb_getdev*)xpt_alloc_ccb_nowait()) == NULL) + return(-1); /* * Get the device information. */ - xpt_setup_ccb(&cgd.ccb_h, + xpt_setup_ccb(&cgd->ccb_h, csio->ccb_h.path, - /*priority*/ 1); - cgd.ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action((union ccb *)&cgd); + CAM_PRIORITY_NORMAL); + cgd->ccb_h.func_code = XPT_GDEV_TYPE; + xpt_action((union ccb *)cgd); /* * If the device is unconfigured, just pretend that it is a hard * drive. scsi_op_desc() needs this. */ - if (cgd.ccb_h.status == CAM_DEV_NOT_THERE) - cgd.inq_data.device = T_DIRECT; + if (cgd->ccb_h.status == CAM_DEV_NOT_THERE) + cgd->inq_data.device = T_DIRECT; - inq_data = &cgd.inq_data; + inq_data = &cgd->inq_data; #else /* !_KERNEL */ @@ -3125,9 +3129,12 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, * If the sense data is a physical pointer, forget it. */ if (csio->ccb_h.flags & CAM_SENSE_PTR) { - if (csio->ccb_h.flags & CAM_SENSE_PHYS) + if (csio->ccb_h.flags & CAM_SENSE_PHYS) { +#ifdef _KERNEL + xpt_free_ccb((union ccb*)cgd); +#endif /* _KERNEL/!_KERNEL */ return(-1); - else { + } else { /* * bcopy the pointer to avoid unaligned access * errors on finicky architectures. We don't @@ -3145,9 +3152,12 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, * dumped on one of the bogus pointer deferences above * already.) */ - if (csio->ccb_h.flags & CAM_SENSE_PHYS) + if (csio->ccb_h.flags & CAM_SENSE_PHYS) { +#ifdef _KERNEL + xpt_free_ccb((union ccb*)cgd); +#endif /* _KERNEL/!_KERNEL */ return(-1); - else + } else sense = &csio->sense_data; } @@ -3157,9 +3167,10 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, error_code = sense->error_code & SSD_ERRCODE; sense_key = sense->flags & SSD_KEY; + sbuf_printf(sb, "SCSI sense: "); switch (error_code) { case SSD_DEFERRED_ERROR: - sbuf_printf(sb, "Deferred Error: "); + sbuf_printf(sb, "Deferred error: "); /* FALLTHROUGH */ case SSD_CURRENT_ERROR: @@ -3212,8 +3223,7 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, } } - sbuf_printf(sb, " asc:%x,%x\n%s%s", asc, ascq, - path_str, asc_desc); + sbuf_printf(sb, " asc:%x,%x (%s)", asc, ascq, asc_desc); if (sense->extra_len >= 7 && sense->fru) { sbuf_printf(sb, " field replaceable unit: %x", @@ -3265,7 +3275,7 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, } default: - sbuf_printf(sb, "Sense Error Code 0x%x", sense->error_code); + sbuf_printf(sb, "Error code 0x%x", sense->error_code); if (sense->error_code & SSD_ERRCODE_VALID) { sbuf_printf(sb, " at block no. %d (decimal)", info = scsi_4btoul(sense->info)); @@ -3274,6 +3284,9 @@ scsi_sense_sbuf(struct cam_device *device, struct ccb_scsiio *csio, sbuf_printf(sb, "\n"); +#ifdef _KERNEL + xpt_free_ccb((union ccb*)cgd); +#endif /* _KERNEL/!_KERNEL */ return(0); } diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c index 52f73113d645..1e5be3c58866 100644 --- a/sys/cam/scsi/scsi_cd.c +++ b/sys/cam/scsi/scsi_cd.c @@ -433,7 +433,7 @@ cdcleanup(struct cam_periph *periph) callout_stop(&softc->changer->short_handle); softc->changer->flags &= ~CHANGER_SHORT_TMOUT_SCHED; } - softc->changer->devq.qfrozen_cnt--; + softc->changer->devq.qfrozen_cnt[0]--; softc->changer->flags |= CHANGER_MANUAL_CALL; cdrunchangerqueue(softc->changer); } @@ -638,15 +638,14 @@ cdregister(struct cam_periph *periph, void *arg) return(CAM_REQ_CMP_ERR); } - softc = (struct cd_softc *)malloc(sizeof(*softc),M_DEVBUF,M_NOWAIT); - + softc = (struct cd_softc *)malloc(sizeof(*softc),M_DEVBUF, + M_NOWAIT | M_ZERO); if (softc == NULL) { printf("cdregister: Unable to probe new device. " "Unable to allocate softc\n"); return(CAM_REQ_CMP_ERR); } - bzero(softc, sizeof(*softc)); LIST_INIT(&softc->pending_ccbs); STAILQ_INIT(&softc->mode_queue); softc->state = CD_STATE_PROBE; @@ -673,7 +672,8 @@ cdregister(struct cam_periph *periph, void *arg) softc->quirks = CD_Q_NONE; /* Check if the SIM does not want 6 byte commands */ - xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1); + bzero(&cpi, sizeof(cpi)); + xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NORMAL); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); if (cpi.ccb_h.status == CAM_REQ_CMP && (cpi.hba_misc & PIM_NO_6_BYTE)) @@ -726,6 +726,12 @@ cdregister(struct cam_periph *periph, void *arg) softc->disk->d_name = "cd"; softc->disk->d_unit = periph->unit_number; softc->disk->d_drv1 = periph; + if (cpi.maxio == 0) + softc->disk->d_maxsize = DFLTPHYS; /* traditional default */ + else if (cpi.maxio > MAXPHYS) + softc->disk->d_maxsize = MAXPHYS; /* for safety */ + else + softc->disk->d_maxsize = cpi.maxio; softc->disk->d_flags = 0; disk_create(softc->disk, DISK_VERSION); cam_periph_lock(periph); @@ -854,8 +860,7 @@ cdregister(struct cam_periph *periph, void *arg) */ else { nchanger = malloc(sizeof(struct cdchanger), - M_DEVBUF, M_NOWAIT); - + M_DEVBUF, M_NOWAIT | M_ZERO); if (nchanger == NULL) { softc->flags &= ~CD_FLAG_CHANGER; printf("cdregister: unable to malloc " @@ -868,10 +873,6 @@ cdregister(struct cam_periph *periph, void *arg) */ goto cdregisterexit; } - - /* zero the structure */ - bzero(nchanger, sizeof(struct cdchanger)); - if (camq_init(&nchanger->devq, 1) != 0) { softc->flags &= ~CD_FLAG_CHANGER; printf("cdregister: changer support " @@ -965,9 +966,9 @@ cdregisterexit: (void)cam_periph_hold(periph, PRIBIO); if ((softc->flags & CD_FLAG_CHANGER) == 0) - xpt_schedule(periph, /*priority*/5); + xpt_schedule(periph, CAM_PRIORITY_DEV); else - cdschedule(periph, /*priority*/ 5); + cdschedule(periph, CAM_PRIORITY_DEV); return(CAM_REQ_CMP); } @@ -1105,7 +1106,7 @@ cdschedule(struct cam_periph *periph, int priority) * We don't do anything with the priority here. * This is strictly a fifo queue. */ - softc->pinfo.priority = 1; + softc->pinfo.priority = CAM_PRIORITY_NORMAL; softc->pinfo.generation = ++softc->changer->devq.generation; camq_insert(&softc->changer->devq, (cam_pinfo *)softc); @@ -1160,13 +1161,13 @@ cdrunchangerqueue(void *arg) * If the changer queue is frozen, that means we have an active * device. */ - if (changer->devq.qfrozen_cnt > 0) { + if (changer->devq.qfrozen_cnt[0] > 0) { /* * We always need to reset the frozen count and clear the * active flag. */ - changer->devq.qfrozen_cnt--; + changer->devq.qfrozen_cnt[0]--; changer->cur_device->flags &= ~CD_FLAG_ACTIVE; changer->cur_device->flags &= ~CD_FLAG_SCHED_ON_COMP; @@ -1201,12 +1202,12 @@ cdrunchangerqueue(void *arg) changer->cur_device = softc; - changer->devq.qfrozen_cnt++; + changer->devq.qfrozen_cnt[0]++; softc->flags |= CD_FLAG_ACTIVE; /* Just in case this device is waiting */ wakeup(&softc->changer); - xpt_schedule(softc->periph, /*priority*/ 1); + xpt_schedule(softc->periph, CAM_PRIORITY_NORMAL); /* * Get rid of any pending timeouts, and set a flag to schedule new @@ -1344,7 +1345,7 @@ cdgetccb(struct cam_periph *periph, u_int32_t priority) * If this changer isn't already queued, queue it up. */ if (softc->pinfo.index == CAM_UNQUEUED_INDEX) { - softc->pinfo.priority = 1; + softc->pinfo.priority = CAM_PRIORITY_NORMAL; softc->pinfo.generation = ++softc->changer->devq.generation; camq_insert(&softc->changer->devq, @@ -1421,9 +1422,9 @@ cdstrategy(struct bio *bp) * differently for changers. */ if ((softc->flags & CD_FLAG_CHANGER) == 0) - xpt_schedule(periph, /* XXX priority */1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); else - cdschedule(periph, /* priority */ 1); + cdschedule(periph, CAM_PRIORITY_NORMAL); cam_periph_unlock(periph); return; @@ -1457,10 +1458,8 @@ cdstart(struct cam_periph *periph, union ccb *start_ccb) } else { bioq_remove(&softc->bio_queue, bp); - devstat_start_transaction_bio(softc->disk->d_devstat, bp); - scsi_read_write(&start_ccb->csio, - /*retries*/cd_retry_count, + /*retries*/ cd_retry_count, /* cbfcnp */ cddone, MSG_SIMPLE_Q_TAG, /* read */bp->bio_cmd == BIO_READ, @@ -1493,7 +1492,7 @@ cdstart(struct cam_periph *periph, union ccb *start_ccb) } if (bp != NULL) { /* Have more work to do, so ensure we stay scheduled */ - xpt_schedule(periph, /* XXX priority */1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); } break; } @@ -1501,8 +1500,7 @@ cdstart(struct cam_periph *periph, union ccb *start_ccb) { rcap = (struct scsi_read_capacity_data *)malloc(sizeof(*rcap), - M_SCSICD, - M_NOWAIT); + M_SCSICD, M_NOWAIT | M_ZERO); if (rcap == NULL) { xpt_print(periph->path, "cdstart: Couldn't malloc read_capacity data\n"); @@ -1511,7 +1509,7 @@ cdstart(struct cam_periph *periph, union ccb *start_ccb) } csio = &start_ccb->csio; scsi_read_capacity(csio, - /*retries*/1, + /*retries*/ cd_retry_count, cddone, MSG_SIMPLE_Q_TAG, rcap, @@ -1570,7 +1568,8 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) bp->bio_resid = bp->bio_bcount; bp->bio_error = error; bp->bio_flags |= BIO_ERROR; - cam_release_devq(done_ccb->ccb_h.path, + if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(done_ccb->ccb_h.path, /*relsim_flags*/0, /*reduction*/0, /*timeout*/0, @@ -1658,7 +1657,8 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) struct ccb_getdev cgd; /* Don't wedge this device's queue */ - cam_release_devq(done_ccb->ccb_h.path, + if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(done_ccb->ccb_h.path, /*relsim_flags*/0, /*reduction*/0, /*timeout*/0, @@ -1668,7 +1668,7 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) xpt_setup_ccb(&cgd.ccb_h, done_ccb->ccb_h.path, - /* priority */ 1); + CAM_PRIORITY_NORMAL); cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); @@ -2066,7 +2066,7 @@ cdioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td) u_int32_t len = args->data_len; data = malloc(sizeof(struct cd_sub_channel_info), - M_SCSICD, M_WAITOK); + M_SCSICD, M_WAITOK | M_ZERO); cam_periph_lock(periph); CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, @@ -2118,7 +2118,7 @@ cdioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td) struct ioc_toc_header *th; th = malloc(sizeof(struct ioc_toc_header), M_SCSICD, - M_WAITOK); + M_WAITOK | M_ZERO); cam_periph_lock(periph); CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, @@ -2155,8 +2155,8 @@ cdioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td) u_int32_t len, readlen, idx, num; u_int32_t starting_track = te->starting_track; - data = malloc(sizeof(*data), M_SCSICD, M_WAITOK); - lead = malloc(sizeof(*lead), M_SCSICD, M_WAITOK); + data = malloc(sizeof(*data), M_SCSICD, M_WAITOK | M_ZERO); + lead = malloc(sizeof(*lead), M_SCSICD, M_WAITOK | M_ZERO); cam_periph_lock(periph); CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, @@ -2284,7 +2284,7 @@ cdioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td) struct ioc_toc_header *th; u_int32_t track; - data = malloc(sizeof(*data), M_SCSICD, M_WAITOK); + data = malloc(sizeof(*data), M_SCSICD, M_WAITOK | M_ZERO); cam_periph_lock(periph); CAM_DEBUG(periph->path, CAM_DEBUG_SUBTRACE, @@ -2671,12 +2671,10 @@ cdioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td) authinfo = (struct dvd_authinfo *)addr; - cam_periph_lock(periph); if (cmd == DVDIOCREPORTKEY) error = cdreportkey(periph, authinfo); else error = cdsendkey(periph, authinfo); - cam_periph_unlock(periph); break; } case DVDIOCREADSTRUCTURE: { @@ -2684,9 +2682,7 @@ cdioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td) dvdstruct = (struct dvd_struct *)addr; - cam_periph_lock(periph); error = cdreaddvdstructure(periph, dvdstruct); - cam_periph_unlock(periph); break; } @@ -2727,10 +2723,10 @@ cdprevent(struct cam_periph *periph, int action) return; } - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); scsi_prevent(&ccb->csio, - /*retries*/ 1, + /*retries*/ cd_retry_count, cddone, MSG_SIMPLE_Q_TAG, action, @@ -2766,7 +2762,6 @@ cdcheckmedia(struct cam_periph *periph) softc = (struct cd_softc *)periph->softc; cdprevent(periph, PR_PREVENT); - softc->disk->d_maxsize = DFLTPHYS; softc->disk->d_sectorsize = 2048; softc->disk->d_mediasize = 0; @@ -2868,7 +2863,6 @@ cdcheckmedia(struct cam_periph *periph) } softc->flags |= CD_FLAG_VALID_TOC; - softc->disk->d_maxsize = DFLTPHYS; softc->disk->d_sectorsize = softc->params.blksize; softc->disk->d_mediasize = (off_t)softc->params.blksize * softc->params.disksize; @@ -2901,16 +2895,16 @@ cdsize(struct cam_periph *periph, u_int32_t *size) softc = (struct cd_softc *)periph->softc; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); /* XXX Should be M_WAITOK */ rcap_buf = malloc(sizeof(struct scsi_read_capacity_data), - M_SCSICD, M_NOWAIT); + M_SCSICD, M_NOWAIT | M_ZERO); if (rcap_buf == NULL) return (ENOMEM); scsi_read_capacity(&ccb->csio, - /*retries*/ 1, + /*retries*/ cd_retry_count, cddone, MSG_SIMPLE_Q_TAG, rcap_buf, @@ -2924,6 +2918,9 @@ cdsize(struct cam_periph *periph, u_int32_t *size) softc->params.disksize = scsi_4btoul(rcap_buf->addr) + 1; softc->params.blksize = scsi_4btoul(rcap_buf->length); + /* Make sure we got at least some block size. */ + if (error == 0 && softc->params.blksize == 0) + error = EIO; /* * SCSI-3 mandates that the reported blocksize shall be 2048. * Older drives sometimes report funny values, trim it down to @@ -3153,12 +3150,12 @@ cdreadtoc(struct cam_periph *periph, u_int32_t mode, u_int32_t start, ntoc = len; error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; cam_fill_csio(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* flags */ CAM_DIR_IN, /* tag_action */ MSG_SIMPLE_Q_TAG, @@ -3200,12 +3197,12 @@ cdreadsubchannel(struct cam_periph *periph, u_int32_t mode, error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; cam_fill_csio(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* flags */ CAM_DIR_IN, /* tag_action */ MSG_SIMPLE_Q_TAG, @@ -3252,7 +3249,7 @@ cdgetmode(struct cam_periph *periph, struct cd_mode_params *data, softc = (struct cd_softc *)periph->softc; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; @@ -3266,7 +3263,7 @@ cdgetmode(struct cam_periph *periph, struct cd_mode_params *data, param_len = min(param_len, data->alloc_len); scsi_mode_sense_len(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* tag_action */ MSG_SIMPLE_Q_TAG, /* dbd */ 0, @@ -3351,7 +3348,7 @@ cdsetmode(struct cam_periph *periph, struct cd_mode_params *data) softc = (struct cd_softc *)periph->softc; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; @@ -3409,7 +3406,7 @@ cdsetmode(struct cam_periph *periph, struct cd_mode_params *data) param_len = min(param_len, data->alloc_len); scsi_mode_select_len(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* tag_action */ MSG_SIMPLE_Q_TAG, /* scsi_page_fmt */ 1, @@ -3443,7 +3440,7 @@ cdplay(struct cam_periph *periph, u_int32_t blk, u_int32_t len) u_int8_t cdb_len; error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; /* * Use the smallest possible command to perform the operation. @@ -3471,7 +3468,7 @@ cdplay(struct cam_periph *periph, u_int32_t blk, u_int32_t len) cdb_len = sizeof(*scsi_cmd); } cam_fill_csio(csio, - /*retries*/2, + /*retries*/ cd_retry_count, cddone, /*flags*/CAM_DIR_NONE, MSG_SIMPLE_Q_TAG, @@ -3500,12 +3497,12 @@ cdplaymsf(struct cam_periph *periph, u_int32_t startm, u_int32_t starts, error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; cam_fill_csio(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* flags */ CAM_DIR_NONE, /* tag_action */ MSG_SIMPLE_Q_TAG, @@ -3546,12 +3543,12 @@ cdplaytracks(struct cam_periph *periph, u_int32_t strack, u_int32_t sindex, error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; cam_fill_csio(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* flags */ CAM_DIR_NONE, /* tag_action */ MSG_SIMPLE_Q_TAG, @@ -3588,12 +3585,12 @@ cdpause(struct cam_periph *periph, u_int32_t go) error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; cam_fill_csio(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* flags */ CAM_DIR_NONE, /* tag_action */ MSG_SIMPLE_Q_TAG, @@ -3625,10 +3622,10 @@ cdstartunit(struct cam_periph *periph, int load) error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); scsi_start_stop(&ccb->csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* tag_action */ MSG_SIMPLE_Q_TAG, /* start */ TRUE, @@ -3653,10 +3650,10 @@ cdstopunit(struct cam_periph *periph, u_int32_t eject) error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); scsi_start_stop(&ccb->csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* tag_action */ MSG_SIMPLE_Q_TAG, /* start */ FALSE, @@ -3682,7 +3679,7 @@ cdsetspeed(struct cam_periph *periph, u_int32_t rdspeed, u_int32_t wrspeed) int error; error = 0; - ccb = cdgetccb(periph, /* priority */ 1); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; /* Preserve old behavior: units in multiples of CDROM speed */ @@ -3692,7 +3689,7 @@ cdsetspeed(struct cam_periph *periph, u_int32_t rdspeed, u_int32_t wrspeed) wrspeed *= 177; cam_fill_csio(csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* flags */ CAM_DIR_NONE, /* tag_action */ MSG_SIMPLE_Q_TAG, @@ -3730,8 +3727,6 @@ cdreportkey(struct cam_periph *periph, struct dvd_authinfo *authinfo) databuf = NULL; lba = 0; - ccb = cdgetccb(periph, /* priority */ 1); - switch (authinfo->format) { case DVD_REPORT_AGID: length = sizeof(struct scsi_report_key_data_agid); @@ -3757,9 +3752,7 @@ cdreportkey(struct cam_periph *periph, struct dvd_authinfo *authinfo) length = 0; break; default: - error = EINVAL; - goto bailout; - break; /* NOTREACHED */ + return (EINVAL); } if (length != 0) { @@ -3767,9 +3760,11 @@ cdreportkey(struct cam_periph *periph, struct dvd_authinfo *authinfo) } else databuf = NULL; + cam_periph_lock(periph); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); scsi_report_key(&ccb->csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* tag_action */ MSG_SIMPLE_Q_TAG, /* lba */ lba, @@ -3867,12 +3862,14 @@ cdreportkey(struct cam_periph *periph, struct dvd_authinfo *authinfo) goto bailout; break; /* NOTREACHED */ } + bailout: + xpt_release_ccb(ccb); + cam_periph_unlock(periph); + if (databuf != NULL) free(databuf, M_DEVBUF); - xpt_release_ccb(ccb); - return(error); } @@ -3887,8 +3884,6 @@ cdsendkey(struct cam_periph *periph, struct dvd_authinfo *authinfo) error = 0; databuf = NULL; - ccb = cdgetccb(periph, /* priority */ 1); - switch(authinfo->format) { case DVD_SEND_CHALLENGE: { struct scsi_report_key_data_challenge *challenge_data; @@ -3940,13 +3935,14 @@ cdsendkey(struct cam_periph *periph, struct dvd_authinfo *authinfo) break; } default: - error = EINVAL; - goto bailout; - break; /* NOTREACHED */ + return (EINVAL); } + cam_periph_lock(periph); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); + scsi_send_key(&ccb->csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* tag_action */ MSG_SIMPLE_Q_TAG, /* agid */ authinfo->agid, @@ -3959,13 +3955,12 @@ cdsendkey(struct cam_periph *periph, struct dvd_authinfo *authinfo) error = cdrunccb(ccb, cderror, /*cam_flags*/CAM_RETRY_SELTO, /*sense_flags*/SF_RETRY_UA); -bailout: + xpt_release_ccb(ccb); + cam_periph_unlock(periph); if (databuf != NULL) free(databuf, M_DEVBUF); - xpt_release_ccb(ccb); - return(error); } @@ -3983,8 +3978,6 @@ cdreaddvdstructure(struct cam_periph *periph, struct dvd_struct *dvdstruct) /* The address is reserved for many of the formats */ address = 0; - ccb = cdgetccb(periph, /* priority */ 1); - switch(dvdstruct->format) { case DVD_STRUCT_PHYSICAL: length = sizeof(struct scsi_read_dvd_struct_data_physical); @@ -4002,13 +3995,7 @@ cdreaddvdstructure(struct cam_periph *periph, struct dvd_struct *dvdstruct) length = sizeof(struct scsi_read_dvd_struct_data_manufacturer); break; case DVD_STRUCT_CMI: - error = ENODEV; - goto bailout; -#ifdef notyet - length = sizeof(struct scsi_read_dvd_struct_data_copy_manage); - address = dvdstruct->address; -#endif - break; /* NOTREACHED */ + return (ENODEV); case DVD_STRUCT_PROTDISCID: length = sizeof(struct scsi_read_dvd_struct_data_prot_discid); break; @@ -4025,21 +4012,9 @@ cdreaddvdstructure(struct cam_periph *periph, struct dvd_struct *dvdstruct) length = sizeof(struct scsi_read_dvd_struct_data_spare_area); break; case DVD_STRUCT_RMD_LAST: - error = ENODEV; - goto bailout; -#ifdef notyet - length = sizeof(struct scsi_read_dvd_struct_data_rmd_borderout); - address = dvdstruct->address; -#endif - break; /* NOTREACHED */ + return (ENODEV); case DVD_STRUCT_RMD_RMA: - error = ENODEV; - goto bailout; -#ifdef notyet - length = sizeof(struct scsi_read_dvd_struct_data_rmd); - address = dvdstruct->address; -#endif - break; /* NOTREACHED */ + return (ENODEV); case DVD_STRUCT_PRERECORDED: length = sizeof(struct scsi_read_dvd_struct_data_leadin); break; @@ -4047,13 +4022,7 @@ cdreaddvdstructure(struct cam_periph *periph, struct dvd_struct *dvdstruct) length = sizeof(struct scsi_read_dvd_struct_data_disc_id); break; case DVD_STRUCT_DCB: - error = ENODEV; - goto bailout; -#ifdef notyet - length = sizeof(struct scsi_read_dvd_struct_data_dcb); - address = dvdstruct->address; -#endif - break; /* NOTREACHED */ + return (ENODEV); case DVD_STRUCT_LIST: /* * This is the maximum allocation length for the READ DVD @@ -4065,9 +4034,7 @@ cdreaddvdstructure(struct cam_periph *periph, struct dvd_struct *dvdstruct) length = 65535; break; default: - error = EINVAL; - goto bailout; - break; /* NOTREACHED */ + return (EINVAL); } if (length != 0) { @@ -4075,8 +4042,11 @@ cdreaddvdstructure(struct cam_periph *periph, struct dvd_struct *dvdstruct) } else databuf = NULL; + cam_periph_lock(periph); + ccb = cdgetccb(periph, CAM_PRIORITY_NORMAL); + scsi_read_dvd_structure(&ccb->csio, - /* retries */ 1, + /* retries */ cd_retry_count, /* cbfcnp */ cddone, /* tag_action */ MSG_SIMPLE_Q_TAG, /* lba */ address, @@ -4162,13 +4132,14 @@ cdreaddvdstructure(struct cam_periph *periph, struct dvd_struct *dvdstruct) min(sizeof(dvdstruct->data), dvdstruct->length)); break; } + bailout: + xpt_release_ccb(ccb); + cam_periph_unlock(periph); if (databuf != NULL) free(databuf, M_DEVBUF); - xpt_release_ccb(ccb); - return(error); } diff --git a/sys/cam/scsi/scsi_ch.c b/sys/cam/scsi/scsi_ch.c index f8f39aba57c5..107f22b2ed9f 100644 --- a/sys/cam/scsi/scsi_ch.c +++ b/sys/cam/scsi/scsi_ch.c @@ -376,7 +376,7 @@ chregister(struct cam_periph *periph, void *arg) * This first call can't block */ (void)cam_periph_hold(periph, PRIBIO); - xpt_schedule(periph, /*priority*/5); + xpt_schedule(periph, CAM_PRIORITY_DEV); return(CAM_REQ_CMP); } @@ -606,7 +606,8 @@ chdone(struct cam_periph *periph, union ccb *done_ccb) retry_scheduled = 0; /* Don't wedge this device's queue */ - cam_release_devq(done_ccb->ccb_h.path, + if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) + cam_release_devq(done_ccb->ccb_h.path, /*relsim_flags*/0, /*reduction*/0, /*timeout*/0, @@ -809,7 +810,7 @@ chmove(struct cam_periph *periph, struct changer_move *cm) fromelem = softc->sc_firsts[cm->cm_fromtype] + cm->cm_fromunit; toelem = softc->sc_firsts[cm->cm_totype] + cm->cm_tounit; - ccb = cam_periph_getccb(periph, /*priority*/ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_move_medium(&ccb->csio, /* retries */ 1, @@ -868,7 +869,7 @@ chexchange(struct cam_periph *periph, struct changer_exchange *ce) dst1 = softc->sc_firsts[ce->ce_fdsttype] + ce->ce_fdstunit; dst2 = softc->sc_firsts[ce->ce_sdsttype] + ce->ce_sdstunit; - ccb = cam_periph_getccb(periph, /*priority*/ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_exchange_medium(&ccb->csio, /* retries */ 1, @@ -918,7 +919,7 @@ chposition(struct cam_periph *periph, struct changer_position *cp) */ dst = softc->sc_firsts[cp->cp_type] + cp->cp_unit; - ccb = cam_periph_getccb(periph, /*priority*/ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_position_to_element(&ccb->csio, /* retries */ 1, @@ -1075,7 +1076,7 @@ chgetelemstatus(struct cam_periph *periph, data = (caddr_t)malloc(1024, M_DEVBUF, M_WAITOK); cam_periph_lock(periph); - ccb = cam_periph_getccb(periph, /*priority*/ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_read_element_status(&ccb->csio, /* retries */ 1, @@ -1201,7 +1202,7 @@ chielem(struct cam_periph *periph, error = 0; softc = (struct ch_softc *)periph->softc; - ccb = cam_periph_getccb(periph, /*priority*/ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_initialize_element_status(&ccb->csio, /* retries */ 1, @@ -1285,7 +1286,7 @@ chsetvoltag(struct cam_periph *periph, min(strlen(csvr->csvr_voltag.cv_volid), sizeof(ssvtp.vitf))); scsi_ulto2b(csvr->csvr_voltag.cv_serial, ssvtp.minvsn); - ccb = cam_periph_getccb(periph, /*priority*/ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_send_volume_tag(&ccb->csio, /* retries */ 1, @@ -1323,7 +1324,7 @@ chgetparams(struct cam_periph *periph) softc = (struct ch_softc *)periph->softc; - ccb = cam_periph_getccb(periph, /*priority*/ 1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); /* * The scsi_mode_sense_data structure is just a convenience diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index e3ad7e1abfac..77652b2dc949 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -729,7 +729,7 @@ daclose(struct disk *dp) if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { union ccb *ccb; - ccb = cam_periph_getccb(periph, /*priority*/1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_synchronize_cache(&ccb->csio, /*retries*/1, @@ -813,19 +813,6 @@ dastrategy(struct bio *bp) cam_periph_lock(periph); -#if 0 - /* - * check it's not too big a transfer for our adapter - */ - scsi_minphys(bp,&sd_switch); -#endif - - /* - * Mask interrupts so that the pack cannot be invalidated until - * after we are in the queue. Otherwise, we might not properly - * clean up one of the buffers. - */ - /* * If the device has been made invalid, error out */ @@ -843,7 +830,7 @@ dastrategy(struct bio *bp) /* * Schedule ourselves for performing the work. */ - xpt_schedule(periph, /* XXX priority */1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); cam_periph_unlock(periph); return; @@ -872,8 +859,7 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng } if (length > 0) { - periph->flags |= CAM_PERIPH_POLLED; - xpt_setup_ccb(&csio.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); csio.ccb_h.ccb_state = DA_CCB_DUMP; scsi_read_write(&csio, /*retries*/1, @@ -898,7 +884,6 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng else printf("status == 0x%x, scsi status == 0x%x\n", csio.ccb_h.status, csio.scsi_status); - periph->flags |= CAM_PERIPH_POLLED; return(EIO); } cam_periph_unlock(periph); @@ -910,7 +895,7 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng */ if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { - xpt_setup_ccb(&csio.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); csio.ccb_h.ccb_state = DA_CCB_DUMP; scsi_synchronize_cache(&csio, /*retries*/1, @@ -942,7 +927,6 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng } } } - periph->flags &= ~CAM_PERIPH_POLLED; cam_periph_unlock(periph); return (0); } @@ -1207,7 +1191,7 @@ daregister(struct cam_periph *periph, void *arg) /* Check if the SIM does not want 6 byte commands */ bzero(&cpi, sizeof(cpi)); - xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NORMAL); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); if (cpi.ccb_h.status == CAM_REQ_CMP && (cpi.hba_misc & PIM_NO_6_BYTE)) @@ -1288,7 +1272,7 @@ daregister(struct cam_periph *periph, void *arg) * the end of probe. */ (void)cam_periph_hold(periph, PRIBIO); - xpt_schedule(periph, /*priority*/5); + xpt_schedule(periph, CAM_PRIORITY_DEV); /* * Schedule a periodic event to occasionally send an @@ -1394,7 +1378,7 @@ dastart(struct cam_periph *periph, union ccb *start_ccb) if (bp != NULL) { /* Have more work to do, so ensure we stay scheduled */ - xpt_schedule(periph, /* XXX priority */1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); } break; } @@ -1504,8 +1488,10 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) { struct da_softc *softc; struct ccb_scsiio *csio; + u_int32_t priority; softc = (struct da_softc *)periph->softc; + priority = done_ccb->ccb_h.pinfo.priority; csio = &done_ccb->csio; switch (csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK) { case DA_CCB_BUFFER_IO: @@ -1623,7 +1609,7 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) softc->state = DA_STATE_PROBE2; free(rdcap, M_SCSIDA); xpt_release_ccb(done_ccb); - xpt_schedule(periph, /*priority*/5); + xpt_schedule(periph, priority); return; } } else { @@ -1691,7 +1677,7 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) xpt_setup_ccb(&cgd.ccb_h, done_ccb->ccb_h.path, - /* priority */ 1); + CAM_PRIORITY_NORMAL); cgd.ccb_h.func_code = XPT_GDEV_TYPE; xpt_action((union ccb *)&cgd); @@ -1845,7 +1831,7 @@ daprevent(struct cam_periph *periph, int action) return; } - ccb = cam_periph_getccb(periph, /*priority*/1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_prevent(&ccb->csio, /*retries*/1, @@ -1895,7 +1881,7 @@ dagetcapacity(struct cam_periph *periph) if (rcap == NULL) return (ENOMEM); - ccb = cam_periph_getccb(periph, /*priority*/1); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); scsi_read_capacity(&ccb->csio, /*retries*/4, /*cbfncp*/dadone, @@ -1959,8 +1945,15 @@ dagetcapacity(struct cam_periph *periph) done: - if (error == 0) - dasetgeom(periph, block_len, maxsector); + if (error == 0) { + if (block_len >= MAXPHYS || block_len == 0) { + xpt_print(periph->path, + "unsupportable block size %ju\n", + (uintmax_t) block_len); + error = EINVAL; + } else + dasetgeom(periph, block_len, maxsector); + } xpt_release_ccb(ccb); @@ -1989,7 +1982,7 @@ dasetgeom(struct cam_periph *periph, uint32_t block_len, uint64_t maxsector) * up with something that will make this a bootable * device. */ - xpt_setup_ccb(&ccg.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccg.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccg.ccb_h.func_code = XPT_CALC_GEOMETRY; ccg.block_size = dp->secsize; ccg.volume_size = dp->sectors; @@ -2063,7 +2056,7 @@ dashutdown(void * arg, int howto) continue; } - xpt_setup_ccb(&ccb.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccb.ccb_h.ccb_state = DA_CCB_DUMP; scsi_synchronize_cache(&ccb.csio, diff --git a/sys/cam/scsi/scsi_low.c b/sys/cam/scsi/scsi_low.c index 57054a23e931..1b2f4f601edb 100644 --- a/sys/cam/scsi/scsi_low.c +++ b/sys/cam/scsi/scsi_low.c @@ -638,7 +638,10 @@ scsi_low_attach_xs(slp) return ENOMEM; splp = SCSI_LOW_MALLOC(sizeof(*splp)); if (splp == NULL) + { + SCSI_LOW_FREE(sap); return ENOMEM; + } SCSI_LOW_BZERO(sap, sizeof(*sap)); SCSI_LOW_BZERO(splp, sizeof(*splp)); @@ -892,8 +895,6 @@ scsi_low_target_open(link, cf) #define SCSI_LOW_ALLOC_CCB(flags) scsi_low_get_ccb() static void scsi_low_poll_cam(struct cam_sim *); -static void scsi_low_cam_rescan_callback(struct cam_periph *, union ccb *); -static void scsi_low_rescan_bus_cam(struct scsi_low_softc *); void scsi_low_scsi_action_cam(struct cam_sim *, union ccb *); static int scsi_low_attach_cam(struct scsi_low_softc *); @@ -951,38 +952,6 @@ scsi_low_poll_cam(sim) } } -static void -scsi_low_cam_rescan_callback(periph, ccb) - struct cam_periph *periph; - union ccb *ccb; -{ - - xpt_free_path(ccb->ccb_h.path); - xpt_free_ccb(ccb); -} - -static void -scsi_low_rescan_bus_cam(slp) - struct scsi_low_softc *slp; -{ - struct cam_path *path; - union ccb *ccb; - cam_status status; - - status = xpt_create_path(&path, xpt_periph, - cam_sim_path(slp->sl_si.sim), -1, 0); - if (status != CAM_REQ_CMP) - return; - - ccb = xpt_alloc_ccb(); - bzero(ccb, sizeof(union ccb)); - xpt_setup_ccb(&ccb->ccb_h, path, 5); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = scsi_low_cam_rescan_callback; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); -} - void scsi_low_scsi_action_cam(sim, ccb) struct cam_sim *sim; @@ -1373,8 +1342,6 @@ scsi_low_world_start_cam(slp) struct scsi_low_softc *slp; { - if (!cold) - scsi_low_rescan_bus_cam(slp); return 0; } diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c index 755189183754..9464ca21ce38 100644 --- a/sys/cam/scsi/scsi_pass.c +++ b/sys/cam/scsi/scsi_pass.c @@ -563,12 +563,10 @@ passsendccb(struct cam_periph *periph, union ccb *ccb, union ccb *inccb) * that request. Otherwise, it's up to the user to perform any * error recovery. */ - error = cam_periph_runccb(ccb, - (ccb->ccb_h.flags & CAM_PASS_ERR_RECOVER) ? - passerror : NULL, - /* cam_flags */ CAM_RETRY_SELTO, - /* sense_flags */SF_RETRY_UA, - softc->device_stats); + cam_periph_runccb(ccb, + (ccb->ccb_h.flags & CAM_PASS_ERR_RECOVER) ? passerror : NULL, + /* cam_flags */ CAM_RETRY_SELTO, /* sense_flags */SF_RETRY_UA, + softc->device_stats); if (need_unmap != 0) cam_periph_unmapmem(ccb, &mapinfo); @@ -577,7 +575,7 @@ passsendccb(struct cam_periph *periph, union ccb *ccb, union ccb *inccb) ccb->ccb_h.periph_priv = inccb->ccb_h.periph_priv; bcopy(ccb, inccb, sizeof(union ccb)); - return(error); + return(0); } static int diff --git a/sys/cam/scsi/scsi_pt.c b/sys/cam/scsi/scsi_pt.c index 183293fc7c7a..34217509ac64 100644 --- a/sys/cam/scsi/scsi_pt.c +++ b/sys/cam/scsi/scsi_pt.c @@ -224,7 +224,7 @@ ptstrategy(struct bio *bp) /* * Schedule ourselves for performing the work. */ - xpt_schedule(periph, /* XXX priority */1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); cam_periph_unlock(periph); return; @@ -464,7 +464,7 @@ ptstart(struct cam_periph *periph, union ccb *start_ccb) if (bp != NULL) { /* Have more work to do, so ensure we stay scheduled */ - xpt_schedule(periph, /* XXX priority */1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); } } } diff --git a/sys/cam/scsi/scsi_sa.c b/sys/cam/scsi/scsi_sa.c index 254f2ba692ff..13871b97d47c 100644 --- a/sys/cam/scsi/scsi_sa.c +++ b/sys/cam/scsi/scsi_sa.c @@ -786,7 +786,7 @@ sastrategy(struct bio *bp) /* * Schedule ourselves for performing the work. */ - xpt_schedule(periph, 1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); cam_periph_unlock(periph); return; @@ -1689,7 +1689,7 @@ again: if (bp != NULL) { /* Have more work to do, so ensure we stay scheduled */ - xpt_schedule(periph, 1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); } break; } diff --git a/sys/cam/scsi/scsi_ses.c b/sys/cam/scsi/scsi_ses.c index 825b883c17ca..2275654c141e 100644 --- a/sys/cam/scsi/scsi_ses.c +++ b/sys/cam/scsi/scsi_ses.c @@ -1555,7 +1555,7 @@ ses_encode(char *b, int amt, uint8_t *ep, int elt, int elm, SesComStat *sp) */ static int safte_getconfig(ses_softc_t *); -static int safte_rdstat(ses_softc_t *, int);; +static int safte_rdstat(ses_softc_t *, int); static int set_objstat_sel(ses_softc_t *, ses_objstat *, int); static int wrbuf16(ses_softc_t *, uint8_t, uint8_t, uint8_t, uint8_t, int); static void wrslot_stat(ses_softc_t *, int); @@ -2257,7 +2257,7 @@ safte_rdstat(ses_softc_t *ssc, int slpflg) ssc->ses_objmap[oid].encstat[0] = SES_OBJSTAT_NOTAVAIL; ssc->ses_objmap[oid].encstat[1] = 0; ssc->ses_objmap[oid].encstat[2] = sdata[r]; - ssc->ses_objmap[oid].encstat[3] = 0;; + ssc->ses_objmap[oid].encstat[3] = 0; ssc->ses_objmap[oid++].svalid = 1; r++; } diff --git a/sys/cam/scsi/scsi_sg.c b/sys/cam/scsi/scsi_sg.c index 4ab038bc2ee9..d47e6e9adb3a 100644 --- a/sys/cam/scsi/scsi_sg.c +++ b/sys/cam/scsi/scsi_sg.c @@ -510,7 +510,7 @@ sgioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) break; } - ccb = cam_periph_getccb(periph, /*priority*/5); + ccb = cam_periph_getccb(periph, CAM_PRIORITY_NORMAL); csio = &ccb->csio; error = copyin(req.cmdp, &csio->cdb_io.cdb_bytes, @@ -729,7 +729,7 @@ sgwrite(struct cdev *dev, struct uio *uio, int ioflag) cam_periph_lock(periph); sc = periph->softc; - xpt_setup_ccb(&ccb->ccb_h, periph->path, /*priority*/5); + xpt_setup_ccb(&ccb->ccb_h, periph->path, CAM_PRIORITY_NORMAL); cam_fill_csio(csio, /*retries*/1, sgdone, diff --git a/sys/cam/scsi/scsi_targ_bh.c b/sys/cam/scsi/scsi_targ_bh.c index e8ec51f41d59..b8c2379ff911 100644 --- a/sys/cam/scsi/scsi_targ_bh.c +++ b/sys/cam/scsi/scsi_targ_bh.c @@ -240,7 +240,7 @@ targbhenlun(struct cam_periph *periph) if ((softc->flags & TARGBH_FLAG_LUN_ENABLED) != 0) return (CAM_REQ_CMP); - xpt_setup_ccb(&immed_ccb.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&immed_ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); immed_ccb.ccb_h.func_code = XPT_EN_LUN; /* Don't need support for any vendor specific commands */ @@ -280,7 +280,7 @@ targbhenlun(struct cam_periph *periph) break; } - xpt_setup_ccb(&atio->ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&atio->ccb_h, periph->path, CAM_PRIORITY_NORMAL); atio->ccb_h.func_code = XPT_ACCEPT_TARGET_IO; atio->ccb_h.cbfcnp = targbhdone; xpt_action((union ccb *)atio); @@ -318,7 +318,7 @@ targbhenlun(struct cam_periph *periph) break; } - xpt_setup_ccb(&inot->ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&inot->ccb_h, periph->path, CAM_PRIORITY_NORMAL); inot->ccb_h.func_code = XPT_IMMED_NOTIFY; inot->ccb_h.cbfcnp = targbhdone; xpt_action((union ccb *)inot); @@ -361,7 +361,7 @@ targbhdislun(struct cam_periph *periph) softc->accept_tio_list = ((struct targbh_cmd_desc*)atio->ccb_h.ccb_descr)->atio_link; - xpt_setup_ccb(&ccb.cab.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccb.cab.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccb.cab.ccb_h.func_code = XPT_ABORT; ccb.cab.abort_ccb = (union ccb *)atio; xpt_action(&ccb); @@ -369,7 +369,7 @@ targbhdislun(struct cam_periph *periph) while ((ccb_h = SLIST_FIRST(&softc->immed_notify_slist)) != NULL) { SLIST_REMOVE_HEAD(&softc->immed_notify_slist, periph_links.sle); - xpt_setup_ccb(&ccb.cab.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccb.cab.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccb.cab.ccb_h.func_code = XPT_ABORT; ccb.cab.abort_ccb = (union ccb *)ccb_h; xpt_action(&ccb); @@ -378,7 +378,7 @@ targbhdislun(struct cam_periph *periph) /* * Dissable this lun. */ - xpt_setup_ccb(&ccb.cel.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&ccb.cel.ccb_h, periph->path, CAM_PRIORITY_NORMAL); ccb.cel.ccb_h.func_code = XPT_EN_LUN; ccb.cel.enable = 0; xpt_action(&ccb); @@ -429,7 +429,7 @@ targbhdtor(struct cam_periph *periph) switch (softc->init_level) { case 0: - panic("targdtor - impossible init level");; + panic("targdtor - impossible init level"); case 1: /* FALLTHROUGH */ default: @@ -528,7 +528,7 @@ targbhstart(struct cam_periph *periph, union ccb *start_ccb) ccbh = TAILQ_FIRST(&softc->work_queue); } if (ccbh != NULL) - xpt_schedule(periph, /*priority*/1); + xpt_schedule(periph, CAM_PRIORITY_NORMAL); } static void @@ -647,7 +647,7 @@ targbhdone(struct cam_periph *periph, union ccb *done_ccb) } else { TAILQ_INSERT_TAIL(&softc->work_queue, &atio->ccb_h, periph_links.tqe); - priority = 1; + priority = CAM_PRIORITY_NORMAL; } xpt_schedule(periph, priority); break; diff --git a/sys/cam/scsi/scsi_target.c b/sys/cam/scsi/scsi_target.c index 939e3f70189b..de2ef7f177a4 100644 --- a/sys/cam/scsi/scsi_target.c +++ b/sys/cam/scsi/scsi_target.c @@ -319,7 +319,7 @@ targioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *t else cdbg.flags = CAM_DEBUG_NONE; cam_periph_lock(softc->periph); - xpt_setup_ccb(&cdbg.ccb_h, softc->path, /*priority*/0); + xpt_setup_ccb(&cdbg.ccb_h, softc->path, CAM_PRIORITY_NORMAL); cdbg.ccb_h.func_code = XPT_DEBUG; cdbg.ccb_h.cbfcnp = targdone; @@ -410,7 +410,7 @@ targendislun(struct cam_path *path, int enable, int grp6_len, int grp7_len) cam_status status; /* Tell the lun to begin answering selects */ - xpt_setup_ccb(&en_ccb.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&en_ccb.ccb_h, path, CAM_PRIORITY_NORMAL); en_ccb.ccb_h.func_code = XPT_EN_LUN; /* Don't need support for any vendor specific commands */ en_ccb.grp6_len = grp6_len; @@ -438,7 +438,7 @@ targenable(struct targ_softc *softc, struct cam_path *path, int grp6_len, return (CAM_LUN_ALRDY_ENA); /* Make sure SIM supports target mode */ - xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NORMAL); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); status = cpi.ccb_h.status & CAM_STATUS_MASK; @@ -586,7 +586,7 @@ targwrite(struct cdev *dev, struct uio *uio, int ioflag) break; } priority = fuword32(&user_ccb->ccb_h.pinfo.priority); - if (priority == -1) { + if (priority == CAM_PRIORITY_NONE) { error = EINVAL; break; } @@ -1100,7 +1100,7 @@ abort_all_pending(struct targ_softc *softc) * Then abort all pending CCBs. * targdone() will return the aborted CCB via user_ccb_queue */ - xpt_setup_ccb(&cab.ccb_h, softc->path, /*priority*/0); + xpt_setup_ccb(&cab.ccb_h, softc->path, CAM_PRIORITY_NORMAL); cab.ccb_h.func_code = XPT_ABORT; cab.ccb_h.status = CAM_REQ_CMP_ERR; TAILQ_FOREACH(ccb_h, &softc->pending_ccb_queue, periph_links.tqe) { diff --git a/sys/cam/scsi/scsi_xpt.c b/sys/cam/scsi/scsi_xpt.c index 5249d5fcd6b4..b907965a062e 100644 --- a/sys/cam/scsi/scsi_xpt.c +++ b/sys/cam/scsi/scsi_xpt.c @@ -110,7 +110,8 @@ static periph_init_t probe_periph_init; static struct periph_driver probe_driver = { probe_periph_init, "probe", - TAILQ_HEAD_INITIALIZER(probe_driver.units) + TAILQ_HEAD_INITIALIZER(probe_driver.units), /* generation */ 0, + CAM_PERIPH_DRV_EARLY }; PERIPHDRIVER_DECLARE(probe, probe_driver); @@ -551,11 +552,13 @@ static void scsi_dev_async(u_int32_t async_code, struct cam_ed *device, void *async_arg); static void scsi_action(union ccb *start_ccb); +static void scsi_announce_periph(struct cam_periph *periph); static struct xpt_xport scsi_xport = { .alloc_device = scsi_alloc_device, .action = scsi_action, .async = scsi_dev_async, + .announce = scsi_announce_periph, }; struct xpt_xport * @@ -615,6 +618,11 @@ proberegister(struct cam_periph *periph, void *arg) */ cam_periph_freeze_after_event(periph, &periph->path->bus->last_reset, scsi_delay); + /* + * Ensure nobody slip in until probe finish. + */ + cam_freeze_devq_arg(periph->path, + RELSIM_RELEASE_RUNLEVEL, CAM_RL_XPT + 1); probeschedule(periph); return(CAM_REQ_CMP); } @@ -629,7 +637,7 @@ probeschedule(struct cam_periph *periph) softc = (probe_softc *)periph->softc; ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs); - xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -667,7 +675,7 @@ probeschedule(struct cam_periph *periph) else softc->flags &= ~PROBE_NO_ANNOUNCE; - xpt_schedule(periph, ccb->ccb_h.pinfo.priority); + xpt_schedule(periph, CAM_PRIORITY_XPT); } static void @@ -880,7 +888,7 @@ proberequestdefaultnegotiation(struct cam_periph *periph) { struct ccb_trans_settings cts; - xpt_setup_ccb(&cts.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE); cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; cts.type = CTS_TYPE_USER_SETTINGS; xpt_action((union ccb *)&cts); @@ -902,7 +910,7 @@ proberequestbackoff(struct cam_periph *periph, struct cam_ed *device) struct ccb_trans_settings_spi *spi; memset(&cts, 0, sizeof (cts)); - xpt_setup_ccb(&cts.ccb_h, periph->path, /*priority*/1); + xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE); cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; cts.type = CTS_TYPE_CURRENT_SETTINGS; xpt_action((union ccb *)&cts); @@ -1075,8 +1083,10 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) else PROBE_SET_ACTION(softc, PROBE_SERIAL_NUM_0); - path->device->flags &= ~CAM_DEV_UNCONFIGURED; - + if (path->device->flags & CAM_DEV_UNCONFIGURED) { + path->device->flags &= ~CAM_DEV_UNCONFIGURED; + xpt_acquire_device(path->device); + } xpt_release_ccb(done_ccb); xpt_schedule(periph, priority); return; @@ -1335,8 +1345,12 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) CAM_DEBUG(periph->path, CAM_DEBUG_INFO, ("Leave Domain Validation\n")); } + if (path->device->flags & CAM_DEV_UNCONFIGURED) { + path->device->flags &= ~CAM_DEV_UNCONFIGURED; + xpt_acquire_device(path->device); + } path->device->flags &= - ~(CAM_DEV_UNCONFIGURED|CAM_DEV_IN_DV|CAM_DEV_DV_HIT_BOTTOM); + ~(CAM_DEV_IN_DV|CAM_DEV_DV_HIT_BOTTOM); if ((softc->flags & PROBE_NO_ANNOUNCE) == 0) { /* Inform the XPT that a new device has been found */ done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; @@ -1386,8 +1400,12 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) CAM_DEBUG(periph->path, CAM_DEBUG_INFO, ("Leave Domain Validation Successfully\n")); } + if (path->device->flags & CAM_DEV_UNCONFIGURED) { + path->device->flags &= ~CAM_DEV_UNCONFIGURED; + xpt_acquire_device(path->device); + } path->device->flags &= - ~(CAM_DEV_UNCONFIGURED|CAM_DEV_IN_DV|CAM_DEV_DV_HIT_BOTTOM); + ~(CAM_DEV_IN_DV|CAM_DEV_DV_HIT_BOTTOM); if ((softc->flags & PROBE_NO_ANNOUNCE) == 0) { /* Inform the XPT that a new device has been found */ done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; @@ -1409,6 +1427,8 @@ probedone(struct cam_periph *periph, union ccb *done_ccb) done_ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(done_ccb); if (TAILQ_FIRST(&softc->request_ccbs) == NULL) { + cam_release_devq(periph->path, + RELSIM_RELEASE_RUNLEVEL, 0, CAM_RL_XPT + 1, FALSE); cam_periph_invalidate(periph); cam_periph_release_locked(periph); } else { @@ -1480,7 +1500,7 @@ scsi_scan_bus(struct cam_periph *periph, union ccb *request_ccb) case XPT_SCAN_BUS: { scsi_scan_bus_info *scan_info; - union ccb *work_ccb; + union ccb *work_ccb, *reset_ccb; struct cam_path *path; u_int i; u_int max_target; @@ -1515,6 +1535,26 @@ scsi_scan_bus(struct cam_periph *periph, union ccb *request_ccb) return; } + /* We may need to reset bus first, if we haven't done it yet. */ + if ((work_ccb->cpi.hba_inquiry & + (PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE)) && + !(work_ccb->cpi.hba_misc & PIM_NOBUSRESET) && + !timevalisset(&request_ccb->ccb_h.path->bus->last_reset)) { + reset_ccb = xpt_alloc_ccb_nowait(); + xpt_setup_ccb(&reset_ccb->ccb_h, request_ccb->ccb_h.path, + CAM_PRIORITY_NONE); + reset_ccb->ccb_h.func_code = XPT_RESET_BUS; + xpt_action(reset_ccb); + if (reset_ccb->ccb_h.status != CAM_REQ_CMP) { + request_ccb->ccb_h.status = reset_ccb->ccb_h.status; + xpt_free_ccb(reset_ccb); + xpt_free_ccb(work_ccb); + xpt_done(request_ccb); + return; + } + xpt_free_ccb(reset_ccb); + } + /* Save some state for use while we probe for devices */ scan_info = (scsi_scan_bus_info *) malloc(sizeof(scsi_scan_bus_info), M_CAMXPT, M_NOWAIT); @@ -1745,10 +1785,9 @@ scsi_scan_lun(struct cam_periph *periph, struct cam_path *path, struct cam_path *new_path; struct cam_periph *old_periph; - CAM_DEBUG(request_ccb->ccb_h.path, CAM_DEBUG_TRACE, - ("scsi_scan_lun\n")); + CAM_DEBUG(path, CAM_DEBUG_TRACE, ("scsi_scan_lun\n")); - xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -1798,7 +1837,7 @@ scsi_scan_lun(struct cam_periph *periph, struct cam_path *path, free(new_path, M_CAMXPT); return; } - xpt_setup_ccb(&request_ccb->ccb_h, new_path, /*priority*/ 1); + xpt_setup_ccb(&request_ccb->ccb_h, new_path, CAM_PRIORITY_XPT); request_ccb->ccb_h.cbfcnp = xptscandone; request_ccb->ccb_h.func_code = XPT_SCAN_LUN; request_ccb->crcn.flags = flags; @@ -1896,7 +1935,7 @@ scsi_devise_transport(struct cam_path *path) struct scsi_inquiry_data *inq_buf; /* Get transport information from the SIM */ - xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -1956,7 +1995,7 @@ scsi_devise_transport(struct cam_path *path) */ /* Tell the controller what we think */ - xpt_setup_ccb(&cts.ccb_h, path, /*priority*/1); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS; cts.type = CTS_TYPE_CURRENT_SETTINGS; cts.transport = path->device->transport; @@ -2084,7 +2123,7 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device inq_data = &device->inq_data; scsi = &cts->proto_specific.scsi; - xpt_setup_ccb(&cpi.ccb_h, cts->ccb_h.path, /*priority*/1); + xpt_setup_ccb(&cpi.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); @@ -2105,7 +2144,7 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device * Perform sanity checking against what the * controller and device can do. */ - xpt_setup_ccb(&cur_cts.ccb_h, cts->ccb_h.path, /*priority*/1); + xpt_setup_ccb(&cur_cts.ccb_h, cts->ccb_h.path, CAM_PRIORITY_NONE); cur_cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; cur_cts.type = cts->type; xpt_action((union ccb *)&cur_cts); @@ -2263,24 +2302,7 @@ scsi_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device device->tag_delay_count = CAM_TAG_DELAY_COUNT; device->flags |= CAM_DEV_TAG_AFTER_COUNT; } else { - struct ccb_relsim crs; - - xpt_freeze_devq(cts->ccb_h.path, /*count*/1); - device->inq_flags &= ~SID_CmdQue; - xpt_dev_ccbq_resize(cts->ccb_h.path, - sim->max_dev_openings); - device->flags &= ~CAM_DEV_TAG_AFTER_COUNT; - device->tag_delay_count = 0; - - xpt_setup_ccb(&crs.ccb_h, cts->ccb_h.path, - /*priority*/1); - crs.ccb_h.func_code = XPT_REL_SIMQ; - crs.release_flags = RELSIM_RELEASE_AFTER_QEMPTY; - crs.openings - = crs.release_timeout - = crs.qfrozen_cnt - = 0; - xpt_action((union ccb *)&crs); + xpt_stop_tags(cts->ccb_h.path); } } } @@ -2306,7 +2328,7 @@ scsi_toggle_tags(struct cam_path *path) && (dev->inq_flags & (SID_Sync|SID_WBus16|SID_WBus32)) != 0)) { struct ccb_trans_settings cts; - xpt_setup_ccb(&cts.ccb_h, path, 1); + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE); cts.protocol = PROTO_SCSI; cts.protocol_version = PROTO_VERSION_UNSPECIFIED; cts.transport = XPORT_UNSPECIFIED; @@ -2356,11 +2378,18 @@ scsi_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, /* * Allow transfer negotiation to occur in a - * tag free environment. + * tag free environment and after settle delay. */ if (async_code == AC_SENT_BDR - || async_code == AC_BUS_RESET) + || async_code == AC_BUS_RESET) { + cam_freeze_devq(&newpath); + cam_release_devq(&newpath, + RELSIM_RELEASE_AFTER_TIMEOUT, + /*reduction*/0, + /*timeout*/scsi_delay, + /*getcount_only*/0); scsi_toggle_tags(&newpath); + } if (async_code == AC_INQ_CHANGED) { /* @@ -2374,8 +2403,10 @@ scsi_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, CAM_EXPECT_INQ_CHANGE, NULL); } xpt_release_path(&newpath); - } else if (async_code == AC_LOST_DEVICE) { + } else if (async_code == AC_LOST_DEVICE && + (device->flags & CAM_DEV_UNCONFIGURED) == 0) { device->flags |= CAM_DEV_UNCONFIGURED; + xpt_release_device(device); } else if (async_code == AC_TRANSFER_NEG) { struct ccb_trans_settings *settings; @@ -2385,3 +2416,100 @@ scsi_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, } } +static void +scsi_announce_periph(struct cam_periph *periph) +{ + struct ccb_pathinq cpi; + struct ccb_trans_settings cts; + struct cam_path *path = periph->path; + u_int speed; + u_int freq; + u_int mb; + + mtx_assert(periph->sim->mtx, MA_OWNED); + + xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL); + cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cts.type = CTS_TYPE_CURRENT_SETTINGS; + xpt_action((union ccb*)&cts); + if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) + return; + /* Ask the SIM for its base transfer speed */ + xpt_setup_ccb(&cpi.ccb_h, path, CAM_PRIORITY_NORMAL); + cpi.ccb_h.func_code = XPT_PATH_INQ; + xpt_action((union ccb *)&cpi); + /* Report connection speed */ + speed = cpi.base_transfer_speed; + freq = 0; + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SPI) { + struct ccb_trans_settings_spi *spi = + &cts.xport_specific.spi; + + if ((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) != 0 + && spi->sync_offset != 0) { + freq = scsi_calc_syncsrate(spi->sync_period); + speed = freq; + } + if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0) + speed *= (0x01 << spi->bus_width); + } + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_FC) { + struct ccb_trans_settings_fc *fc = + &cts.xport_specific.fc; + + if (fc->valid & CTS_FC_VALID_SPEED) + speed = fc->bitrate; + } + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SAS) { + struct ccb_trans_settings_sas *sas = + &cts.xport_specific.sas; + + if (sas->valid & CTS_SAS_VALID_SPEED) + speed = sas->bitrate; + } + mb = speed / 1000; + if (mb > 0) + printf("%s%d: %d.%03dMB/s transfers", + periph->periph_name, periph->unit_number, + mb, speed % 1000); + else + printf("%s%d: %dKB/s transfers", periph->periph_name, + periph->unit_number, speed); + /* Report additional information about SPI connections */ + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SPI) { + struct ccb_trans_settings_spi *spi; + + spi = &cts.xport_specific.spi; + if (freq != 0) { + printf(" (%d.%03dMHz%s, offset %d", freq / 1000, + freq % 1000, + (spi->ppr_options & MSG_EXT_PPR_DT_REQ) != 0 + ? " DT" : "", + spi->sync_offset); + } + if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0 + && spi->bus_width > 0) { + if (freq != 0) { + printf(", "); + } else { + printf(" ("); + } + printf("%dbit)", 8 * (0x01 << spi->bus_width)); + } else if (freq != 0) { + printf(")"); + } + } + if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_FC) { + struct ccb_trans_settings_fc *fc; + + fc = &cts.xport_specific.fc; + if (fc->valid & CTS_FC_VALID_WWNN) + printf(" WWNN 0x%llx", (long long) fc->wwnn); + if (fc->valid & CTS_FC_VALID_WWPN) + printf(" WWPN 0x%llx", (long long) fc->wwpn); + if (fc->valid & CTS_FC_VALID_PORT) + printf(" PortID 0x%x", fc->port); + } + printf("\n"); +} + diff --git a/sys/cddl/boot/zfs/zfsimpl.h b/sys/cddl/boot/zfs/zfsimpl.h index a0b7b72c9293..ef13487a8e0d 100644 --- a/sys/cddl/boot/zfs/zfsimpl.h +++ b/sys/cddl/boot/zfs/zfsimpl.h @@ -374,6 +374,24 @@ typedef struct vdev_label { #define VDEV_LABEL_END_SIZE (2 * sizeof (vdev_label_t)) #define VDEV_LABELS 4 +/* + * Gang block headers are self-checksumming and contain an array + * of block pointers. + */ +#define SPA_GANGBLOCKSIZE SPA_MINBLOCKSIZE +#define SPA_GBH_NBLKPTRS ((SPA_GANGBLOCKSIZE - \ + sizeof (zio_block_tail_t)) / sizeof (blkptr_t)) +#define SPA_GBH_FILLER ((SPA_GANGBLOCKSIZE - \ + sizeof (zio_block_tail_t) - \ + (SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\ + sizeof (uint64_t)) + +typedef struct zio_gbh { + blkptr_t zg_blkptr[SPA_GBH_NBLKPTRS]; + uint64_t zg_filler[SPA_GBH_FILLER]; + zio_block_tail_t zg_tail; +} zio_gbh_phys_t; + enum zio_checksum { ZIO_CHECKSUM_INHERIT = 0, ZIO_CHECKSUM_ON, @@ -461,13 +479,14 @@ typedef enum { #define SPA_VERSION_11 11ULL #define SPA_VERSION_12 12ULL #define SPA_VERSION_13 13ULL +#define SPA_VERSION_14 14ULL /* * When bumping up SPA_VERSION, make sure GRUB ZFS understand the on-disk * format change. Go to usr/src/grub/grub-0.95/stage2/{zfs-include/, fsys_zfs*}, * and do the appropriate changes. */ -#define SPA_VERSION SPA_VERSION_13 -#define SPA_VERSION_STRING "13" +#define SPA_VERSION SPA_VERSION_14 +#define SPA_VERSION_STRING "14" /* * Symbolic names for the changes that caused a SPA_VERSION switch. @@ -502,6 +521,7 @@ typedef enum { #define SPA_VERSION_DSL_SCRUB SPA_VERSION_11 #define SPA_VERSION_SNAP_PROPS SPA_VERSION_12 #define SPA_VERSION_USED_BREAKDOWN SPA_VERSION_13 +#define SPA_VERSION_PASSTHROUGH_X SPA_VERSION_14 /* * The following are configuration names used in the nvlist describing a pool's @@ -528,7 +548,6 @@ typedef enum { #define ZPOOL_CONFIG_DTL "DTL" #define ZPOOL_CONFIG_STATS "stats" #define ZPOOL_CONFIG_WHOLE_DISK "whole_disk" -#define ZPOOL_CONFIG_OFFLINE "offline" #define ZPOOL_CONFIG_ERRCOUNT "error_count" #define ZPOOL_CONFIG_NOT_PRESENT "not_present" #define ZPOOL_CONFIG_SPARES "spares" @@ -538,6 +557,16 @@ typedef enum { #define ZPOOL_CONFIG_HOSTNAME "hostname" #define ZPOOL_CONFIG_TIMESTAMP "timestamp" /* not stored on disk */ +/* + * The persistent vdev state is stored as separate values rather than a single + * 'vdev_state' entry. This is because a device can be in multiple states, such + * as offline and degraded. + */ +#define ZPOOL_CONFIG_OFFLINE "offline" +#define ZPOOL_CONFIG_FAULTED "faulted" +#define ZPOOL_CONFIG_DEGRADED "degraded" +#define ZPOOL_CONFIG_REMOVED "removed" + #define VDEV_TYPE_ROOT "root" #define VDEV_TYPE_MIRROR "mirror" #define VDEV_TYPE_REPLACING "replacing" @@ -570,7 +599,9 @@ typedef enum vdev_state { VDEV_STATE_UNKNOWN = 0, /* Uninitialized vdev */ VDEV_STATE_CLOSED, /* Not currently open */ VDEV_STATE_OFFLINE, /* Not allowed to open */ + VDEV_STATE_REMOVED, /* Explicitly removed from system */ VDEV_STATE_CANT_OPEN, /* Tried to open, but failed */ + VDEV_STATE_FAULTED, /* External request to fault device */ VDEV_STATE_DEGRADED, /* Replicated vdev with unhealthy kids */ VDEV_STATE_HEALTHY /* Presumed good */ } vdev_state_t; diff --git a/sys/cddl/boot/zfs/zfssubr.c b/sys/cddl/boot/zfs/zfssubr.c index fb4444f242eb..25d349b1ce42 100644 --- a/sys/cddl/boot/zfs/zfssubr.c +++ b/sys/cddl/boot/zfs/zfssubr.c @@ -454,7 +454,7 @@ vdev_raidz_reconstruct_q(raidz_col_t *cols, int nparity, int acols, int x) static void vdev_raidz_reconstruct_pq(raidz_col_t *cols, int nparity, int acols, - int x, int y) + int x, int y, void *temp_p, void *temp_q) { uint8_t *p, *q, *pxy, *qxy, *xd, *yd, tmp, a, b, aexp, bexp; void *pdata, *qdata; @@ -478,10 +478,8 @@ vdev_raidz_reconstruct_pq(raidz_col_t *cols, int nparity, int acols, xsize = cols[x].rc_size; ysize = cols[y].rc_size; - cols[VDEV_RAIDZ_P].rc_data = - zfs_alloc_temp(cols[VDEV_RAIDZ_P].rc_size); - cols[VDEV_RAIDZ_Q].rc_data = - zfs_alloc_temp(cols[VDEV_RAIDZ_Q].rc_size); + cols[VDEV_RAIDZ_P].rc_data = temp_p; + cols[VDEV_RAIDZ_Q].rc_data = temp_q; cols[x].rc_size = 0; cols[y].rc_size = 0; @@ -550,9 +548,13 @@ vdev_raidz_read(vdev_t *vdev, const blkptr_t *bp, void *buf, uint64_t s = psize >> unit_shift; uint64_t f = b % dcols; uint64_t o = (b / dcols) << unit_shift; - int q, r, c, c1, bc, col, acols, coff, devidx, asize, n; + uint64_t q, r, coff; + int c, c1, bc, col, acols, devidx, asize, n, max_rc_size; static raidz_col_t cols[16]; raidz_col_t *rc, *rc1; + void *orig, *orig1, *temp_p, *temp_q; + + orig = orig1 = temp_p = temp_q = NULL; q = s / (dcols - nparity); r = s - q * (dcols - nparity); @@ -560,6 +562,7 @@ vdev_raidz_read(vdev_t *vdev, const blkptr_t *bp, void *buf, acols = (q == 0 ? bc : dcols); asize = 0; + max_rc_size = 0; for (c = 0; c < acols; c++) { col = f + c; @@ -576,6 +579,8 @@ vdev_raidz_read(vdev_t *vdev, const blkptr_t *bp, void *buf, cols[c].rc_tried = 0; cols[c].rc_skipped = 0; asize += cols[c].rc_size; + if (cols[c].rc_size > max_rc_size) + max_rc_size = cols[c].rc_size; } asize = roundup(asize, (nparity + 1) << unit_shift); @@ -776,8 +781,13 @@ reconstruct: //ASSERT(c != acols); //ASSERT(!rc->rc_skipped || rc->rc_error == ENXIO || rc->rc_error == ESTALE); + if (temp_p == NULL) + temp_p = zfs_alloc_temp(max_rc_size); + if (temp_q == NULL) + temp_q = zfs_alloc_temp(max_rc_size); + vdev_raidz_reconstruct_pq(cols, nparity, acols, - c1, c); + c1, c, temp_p, temp_q); if (zio_checksum_error(bp, buf) == 0) return (0); @@ -844,18 +854,12 @@ reconstruct: return (EIO); } - asize = 0; - for (c = 0; c < acols; c++) { - rc = &cols[c]; - if (rc->rc_size > asize) - asize = rc->rc_size; - } if (cols[VDEV_RAIDZ_P].rc_error == 0) { /* * Attempt to reconstruct the data from parity P. */ - void *orig; - orig = zfs_alloc_temp(asize); + if (orig == NULL) + orig = zfs_alloc_temp(max_rc_size); for (c = nparity; c < acols; c++) { rc = &cols[c]; @@ -873,8 +877,8 @@ reconstruct: /* * Attempt to reconstruct the data from parity Q. */ - void *orig; - orig = zfs_alloc_temp(asize); + if (orig == NULL) + orig = zfs_alloc_temp(max_rc_size); for (c = nparity; c < acols; c++) { rc = &cols[c]; @@ -894,9 +898,14 @@ reconstruct: /* * Attempt to reconstruct the data from both P and Q. */ - void *orig, *orig1; - orig = zfs_alloc_temp(asize); - orig1 = zfs_alloc_temp(asize); + if (orig == NULL) + orig = zfs_alloc_temp(max_rc_size); + if (orig1 == NULL) + orig1 = zfs_alloc_temp(max_rc_size); + if (temp_p == NULL) + temp_p = zfs_alloc_temp(max_rc_size); + if (temp_q == NULL) + temp_q = zfs_alloc_temp(max_rc_size); for (c = nparity; c < acols - 1; c++) { rc = &cols[c]; @@ -908,7 +917,7 @@ reconstruct: memcpy(orig1, rc1->rc_data, rc1->rc_size); vdev_raidz_reconstruct_pq(cols, nparity, - acols, c, c1); + acols, c, c1, temp_p, temp_q); if (zio_checksum_error(bp, buf) == 0) return (0); diff --git a/sys/cddl/compat/opensolaris/kern/opensolaris_policy.c b/sys/cddl/compat/opensolaris/kern/opensolaris_policy.c index cedf335257d6..865fba337f5a 100644 --- a/sys/cddl/compat/opensolaris/kern/opensolaris_policy.c +++ b/sys/cddl/compat/opensolaris/kern/opensolaris_policy.c @@ -78,12 +78,11 @@ secpolicy_fs_owner(struct mount *mp, struct ucred *cred) if (zfs_super_owner) { if (cred->cr_uid == mp->mnt_cred->cr_uid && - (!jailed(cred) || - cred->cr_prison == mp->mnt_cred->cr_prison)) { + cred->cr_prison == mp->mnt_cred->cr_prison) { return (0); } } - return (priv_check_cred(cred, PRIV_VFS_MOUNT_OWNER, 0)); + return (EPERM); } /* @@ -359,8 +358,11 @@ secpolicy_fs_mount_clearopts(cred_t *cr, struct mount *vfsp) * Check privileges for setting xvattr attributes */ int -secpolicy_xvattr(xvattr_t *xvap, uid_t owner, cred_t *cr, vtype_t vtype) +secpolicy_xvattr(struct vnode *vp, xvattr_t *xvap, uid_t owner, cred_t *cr, + vtype_t vtype) { + if (secpolicy_fs_owner(vp->v_mount, cr) == 0) + return (0); return (priv_check_cred(cr, PRIV_VFS_SYSFLAGS, 0)); } diff --git a/sys/cddl/compat/opensolaris/sys/policy.h b/sys/cddl/compat/opensolaris/sys/policy.h index 08db5ca763d7..6731d7cbcd4c 100644 --- a/sys/cddl/compat/opensolaris/sys/policy.h +++ b/sys/cddl/compat/opensolaris/sys/policy.h @@ -70,7 +70,8 @@ int secpolicy_setid_setsticky_clear(struct vnode *vp, struct vattr *vap, int secpolicy_fs_owner(struct mount *vfsp, struct ucred *cred); int secpolicy_fs_mount(cred_t *cr, vnode_t *mvp, struct mount *vfsp); void secpolicy_fs_mount_clearopts(cred_t *cr, struct mount *vfsp); -int secpolicy_xvattr(xvattr_t *xvap, uid_t owner, cred_t *cr, vtype_t vtype); +int secpolicy_xvattr(struct vnode *vp, xvattr_t *xvap, uid_t owner, + cred_t *cr, vtype_t vtype); #endif /* _KERNEL */ diff --git a/sys/cddl/compat/opensolaris/sys/time.h b/sys/cddl/compat/opensolaris/sys/time.h index 0bf1e9bf6b82..4275790bebe5 100644 --- a/sys/cddl/compat/opensolaris/sys/time.h +++ b/sys/cddl/compat/opensolaris/sys/time.h @@ -40,8 +40,13 @@ typedef longlong_t hrtime_t; #define LBOLT ((gethrtime() * hz) / NANOSEC) +#if defined(__i386__) || defined(__powerpc__) #define TIMESPEC_OVERFLOW(ts) \ ((ts)->tv_sec < INT32_MIN || (ts)->tv_sec > INT32_MAX) +#else +#define TIMESPEC_OVERFLOW(ts) \ + ((ts)->tv_sec < INT64_MIN || (ts)->tv_sec > INT64_MAX) +#endif #ifdef _KERNEL #define lbolt64 (int64_t)(LBOLT) diff --git a/sys/cddl/compat/opensolaris/sys/vnode.h b/sys/cddl/compat/opensolaris/sys/vnode.h index 7611a3f82011..7296635cc15b 100644 --- a/sys/cddl/compat/opensolaris/sys/vnode.h +++ b/sys/cddl/compat/opensolaris/sys/vnode.h @@ -57,6 +57,8 @@ typedef struct vop_vector vnodeops_t; #define v_count v_usecount +#define V_APPEND VAPPEND + static __inline int vn_is_readonly(vnode_t *vp) { diff --git a/sys/cddl/contrib/opensolaris/common/atomic/ia64/opensolaris_atomic.S b/sys/cddl/contrib/opensolaris/common/atomic/ia64/opensolaris_atomic.S index 409d759b784f..1b7c580c3b2c 100644 --- a/sys/cddl/contrib/opensolaris/common/atomic/ia64/opensolaris_atomic.S +++ b/sys/cddl/contrib/opensolaris/common/atomic/ia64/opensolaris_atomic.S @@ -76,7 +76,7 @@ ENTRY(atomic_or_8_nv, 2) END(atomic_or_8_nv) ENTRY(membar_producer, 0) - mf.a + mf ;; br.ret.sptk rp END(membar_producer) diff --git a/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c b/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c index fef05abf3ce2..70c08adc78a0 100644 --- a/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c +++ b/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c @@ -97,6 +97,7 @@ zfs_prop_init(void) { "restricted", ZFS_ACL_RESTRICTED }, { "passthrough", ZFS_ACL_PASSTHROUGH }, { "secure", ZFS_ACL_RESTRICTED }, /* bkwrd compatability */ + { "passthrough-x", ZFS_ACL_PASSTHROUGH_X }, { NULL } }; @@ -173,7 +174,7 @@ zfs_prop_init(void) "discard | groupmask | passthrough", "ACLMODE", acl_mode_table); register_index(ZFS_PROP_ACLINHERIT, "aclinherit", ZFS_ACL_RESTRICTED, PROP_INHERIT, ZFS_TYPE_FILESYSTEM, - "discard | noallow | restricted | passthrough", + "discard | noallow | restricted | passthrough | passthrough-x", "ACLINHERIT", acl_inherit_table); register_index(ZFS_PROP_COPIES, "copies", 1, PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c index 64fded4712ea..83a4c97f8afb 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c @@ -1821,6 +1821,12 @@ arc_reclaim_needed(void) #endif #ifdef _KERNEL + if (needfree) + return (1); + if (arc_size > arc_c_max) + return (1); + if (arc_size <= arc_c_min) + return (0); /* * If pages are needed or we're within 2048 pages @@ -1829,9 +1835,6 @@ arc_reclaim_needed(void) if (vm_pages_needed || (vm_paging_target() > -2048)) return (1); - if (needfree) - return (1); - #if 0 /* * take 'desfree' extra pages, so we reclaim sooner, rather than later diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c index 1b9247d66e65..25dfafd4f2c1 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include #include #include @@ -108,19 +106,51 @@ dmu_object_claim(objset_t *os, uint64_t object, dmu_object_type_t ot, int dmu_object_reclaim(objset_t *os, uint64_t object, dmu_object_type_t ot, - int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) + int blocksize, dmu_object_type_t bonustype, int bonuslen) { dnode_t *dn; + dmu_tx_t *tx; + int nblkptr; int err; - if (object == DMU_META_DNODE_OBJECT && !dmu_tx_private_ok(tx)) + if (object == DMU_META_DNODE_OBJECT) return (EBADF); err = dnode_hold_impl(os->os, object, DNODE_MUST_BE_ALLOCATED, FTAG, &dn); if (err) return (err); + + if (dn->dn_type == ot && dn->dn_datablksz == blocksize && + dn->dn_bonustype == bonustype && dn->dn_bonuslen == bonuslen) { + /* nothing is changing, this is a noop */ + dnode_rele(dn, FTAG); + return (0); + } + + tx = dmu_tx_create(os); + dmu_tx_hold_bonus(tx, object); + err = dmu_tx_assign(tx, TXG_WAIT); + if (err) { + dmu_tx_abort(tx); + dnode_rele(dn, FTAG); + return (err); + } + + nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT); + + /* + * If we are losing blkptrs or changing the block size this must + * be a new file instance. We must clear out the previous file + * contents before we can change this type of metadata in the dnode. + */ + if (dn->dn_nblkptr > nblkptr || dn->dn_datablksz != blocksize) + dmu_free_long_range(os, object, 0, DMU_OBJECT_END); + dnode_reallocate(dn, ot, blocksize, bonustype, bonuslen, tx); + + dmu_tx_commit(tx); + dnode_rele(dn, FTAG); return (0); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c index 15bb65d6a44e..5c97cd788d25 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c @@ -828,11 +828,7 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro) { int err; dmu_tx_t *tx; - - err = dmu_object_info(os, drro->drr_object, NULL); - - if (err != 0 && err != ENOENT) - return (EINVAL); + void *data = NULL; if (drro->drr_type == DMU_OT_NONE || drro->drr_type >= DMU_OT_NUMTYPES || @@ -846,12 +842,21 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro) return (EINVAL); } - tx = dmu_tx_create(os); + err = dmu_object_info(os, drro->drr_object, NULL); + + if (err != 0 && err != ENOENT) + return (EINVAL); + + if (drro->drr_bonuslen) { + data = restore_read(ra, P2ROUNDUP(drro->drr_bonuslen, 8)); + if (ra->err) + return (ra->err); + } if (err == ENOENT) { /* currently free, want to be allocated */ + tx = dmu_tx_create(os); dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT); - dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, 1); err = dmu_tx_assign(tx, TXG_WAIT); if (err) { dmu_tx_abort(tx); @@ -860,45 +865,34 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro) err = dmu_object_claim(os, drro->drr_object, drro->drr_type, drro->drr_blksz, drro->drr_bonustype, drro->drr_bonuslen, tx); + dmu_tx_commit(tx); } else { /* currently allocated, want to be allocated */ - dmu_tx_hold_bonus(tx, drro->drr_object); - /* - * We may change blocksize and delete old content, - * so need to hold_write and hold_free. - */ - dmu_tx_hold_write(tx, drro->drr_object, 0, 1); - dmu_tx_hold_free(tx, drro->drr_object, 0, DMU_OBJECT_END); - err = dmu_tx_assign(tx, TXG_WAIT); - if (err) { - dmu_tx_abort(tx); - return (err); - } - err = dmu_object_reclaim(os, drro->drr_object, drro->drr_type, drro->drr_blksz, - drro->drr_bonustype, drro->drr_bonuslen, tx); + drro->drr_bonustype, drro->drr_bonuslen); } - if (err) { - dmu_tx_commit(tx); + if (err) return (EINVAL); + + tx = dmu_tx_create(os); + dmu_tx_hold_bonus(tx, drro->drr_object); + err = dmu_tx_assign(tx, TXG_WAIT); + if (err) { + dmu_tx_abort(tx); + return (err); } dmu_object_set_checksum(os, drro->drr_object, drro->drr_checksum, tx); dmu_object_set_compress(os, drro->drr_object, drro->drr_compress, tx); - if (drro->drr_bonuslen) { + if (data != NULL) { dmu_buf_t *db; - void *data; + VERIFY(0 == dmu_bonus_hold(os, drro->drr_object, FTAG, &db)); dmu_buf_will_dirty(db, tx); ASSERT3U(db->db_size, >=, drro->drr_bonuslen); - data = restore_read(ra, P2ROUNDUP(drro->drr_bonuslen, 8)); - if (data == NULL) { - dmu_tx_commit(tx); - return (ra->err); - } bcopy(data, db->db_data, drro->drr_bonuslen); if (ra->byteswap) { dmu_ot[drro->drr_bonustype].ot_byteswap(db->db_data, diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c index 604d52d8bb59..3fe95b08d28e 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c @@ -415,8 +415,7 @@ void dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) { - int i, nblkptr; - dmu_buf_impl_t *db = NULL; + int nblkptr; ASSERT3U(blocksize, >=, SPA_MINBLOCKSIZE); ASSERT3U(blocksize, <=, SPA_MAXBLOCKSIZE); @@ -428,42 +427,25 @@ dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, ASSERT3U(bonustype, <, DMU_OT_NUMTYPES); ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN); - for (i = 0; i < TXG_SIZE; i++) - ASSERT(!list_link_active(&dn->dn_dirty_link[i])); - /* clean up any unreferenced dbufs */ dnode_evict_dbufs(dn); - ASSERT3P(list_head(&dn->dn_dbufs), ==, NULL); - /* - * XXX I should really have a generation number to tell if we - * need to do this... - */ - if (blocksize != dn->dn_datablksz || - dn->dn_bonustype != bonustype || dn->dn_bonuslen != bonuslen) { - /* free all old data */ - dnode_free_range(dn, 0, -1ULL, tx); - } - - nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT); - - /* change blocksize */ rw_enter(&dn->dn_struct_rwlock, RW_WRITER); - if (blocksize != dn->dn_datablksz && - (!BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) || - list_head(&dn->dn_dbufs) != NULL)) { - db = dbuf_hold(dn, 0, FTAG); - dbuf_new_size(db, blocksize, tx); - } - dnode_setdblksz(dn, blocksize); dnode_setdirty(dn, tx); - dn->dn_next_bonuslen[tx->tx_txg&TXG_MASK] = bonuslen; - dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = blocksize; + if (dn->dn_datablksz != blocksize) { + /* change blocksize */ + ASSERT(dn->dn_maxblkid == 0 && + (BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) || + dnode_block_freed(dn, 0))); + dnode_setdblksz(dn, blocksize); + dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = blocksize; + } + if (dn->dn_bonuslen != bonuslen) + dn->dn_next_bonuslen[tx->tx_txg&TXG_MASK] = bonuslen; + nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT); if (dn->dn_nblkptr != nblkptr) dn->dn_next_nblkptr[tx->tx_txg&TXG_MASK] = nblkptr; rw_exit(&dn->dn_struct_rwlock); - if (db) - dbuf_rele(db, FTAG); /* change type */ dn->dn_type = ot; @@ -1187,11 +1169,6 @@ dnode_block_freed(dnode_t *dn, uint64_t blkid) if (dn->dn_free_txg) return (TRUE); - /* - * If dn_datablkshift is not set, then there's only a single - * block, in which case there will never be a free range so it - * won't matter. - */ range_tofind.fr_blkid = blkid; mutex_enter(&dn->dn_mtx); for (i = 0; i < TXG_SIZE; i++) { diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c index 163b21572247..90861bab4c73 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c @@ -62,6 +62,14 @@ #include "zfs_prop.h" #include "zfs_comutil.h" +/* Check hostid on import? */ +static int check_hostid = 1; + +SYSCTL_DECL(_vfs_zfs); +TUNABLE_INT("vfs.zfs.check_hostid", &check_hostid); +SYSCTL_INT(_vfs_zfs, OID_AUTO, check_hostid, CTLFLAG_RW, &check_hostid, 0, + "Check hostid on import?"); + int zio_taskq_threads[ZIO_TYPES][ZIO_TASKQ_TYPES] = { /* ISSUE INTR */ { 1, 1 }, /* ZIO_TYPE_NULL */ @@ -1168,7 +1176,7 @@ spa_load(spa_t *spa, nvlist_t *config, spa_load_state_t state, int mosconfig) ZPOOL_CONFIG_HOSTNAME, &hostname) == 0); (void) ddi_strtoul(hw_serial, NULL, 10, &myhostid); - if (hostid != 0 && myhostid != 0 && + if (check_hostid && hostid != 0 && myhostid != 0 && (unsigned long)hostid != myhostid) { cmn_err(CE_WARN, "pool '%s' could not be " "loaded as it was last accessed by " diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h index 4535c6864074..7befe96bc323 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -237,7 +237,7 @@ uint64_t dmu_object_alloc(objset_t *os, dmu_object_type_t ot, int dmu_object_claim(objset_t *os, uint64_t object, dmu_object_type_t ot, int blocksize, dmu_object_type_t bonus_type, int bonus_len, dmu_tx_t *tx); int dmu_object_reclaim(objset_t *os, uint64_t object, dmu_object_type_t ot, - int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx); + int blocksize, dmu_object_type_t bonustype, int bonuslen); /* * Free an object from this objset. diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h index df148c624945..f87823c5d0fe 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h @@ -26,8 +26,6 @@ #ifndef _SYS_FS_ZFS_ACL_H #define _SYS_FS_ZFS_ACL_H -#pragma ident "%Z%%M% %I% %E% SMI" - #ifdef _KERNEL #include #endif @@ -180,6 +178,7 @@ typedef struct zfs_acl { #define ZFS_ACL_GROUPMASK 2 #define ZFS_ACL_PASSTHROUGH 3 #define ZFS_ACL_RESTRICTED 4 +#define ZFS_ACL_PASSTHROUGH_X 5 struct znode; struct zfsvfs; diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h index 4d02d14f7075..5212aafceae3 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -56,9 +56,15 @@ typedef struct zil_header { uint64_t zh_replay_seq; /* highest replayed sequence number */ blkptr_t zh_log; /* log chain */ uint64_t zh_claim_seq; /* highest claimed sequence number */ - uint64_t zh_pad[5]; + uint64_t zh_flags; /* header flags */ + uint64_t zh_pad[4]; } zil_header_t; +/* + * zh_flags bit settings + */ +#define ZIL_REPLAY_NEEDED 0x1 /* replay needed - internal only */ + /* * Log block trailer - structure at the end of the header and each log block * diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c index b4bec95f5fb0..d5c57e7110b9 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c @@ -102,7 +102,7 @@ vdev_geom_orphan(struct g_consumer *cp) } static struct g_consumer * -vdev_geom_attach(struct g_provider *pp, int write) +vdev_geom_attach(struct g_provider *pp) { struct g_geom *gp; struct g_consumer *cp; @@ -126,7 +126,7 @@ vdev_geom_attach(struct g_provider *pp, int write) g_wither_geom(gp, ENXIO); return (NULL); } - if (g_access(cp, 1, write, 1) != 0) { + if (g_access(cp, 1, 0, 1) != 0) { g_wither_geom(gp, ENXIO); return (NULL); } @@ -145,14 +145,14 @@ vdev_geom_attach(struct g_provider *pp, int write) g_destroy_consumer(cp); return (NULL); } - if (g_access(cp, 1, write, 1) != 0) { + if (g_access(cp, 1, 0, 1) != 0) { g_detach(cp); g_destroy_consumer(cp); return (NULL); } ZFS_LOG(1, "Created consumer for %s.", pp->name); } else { - if (g_access(cp, 1, cp->acw > 0 ? 0 : write, 1) != 0) + if (g_access(cp, 1, 0, 1) != 0) return (NULL); ZFS_LOG(1, "Used existing consumer for %s.", pp->name); } @@ -293,11 +293,16 @@ vdev_geom_read_guid(struct g_consumer *cp) uint64_t psize; off_t offset, size; uint64_t guid; - int error, l, len; + int error, l, len, iszvol; g_topology_assert_not(); pp = cp->provider; + ZFS_LOG(1, "Reading guid from %s...", pp->name); + if (g_getattr("ZFS::iszvol", cp, &iszvol) == 0 && iszvol) { + ZFS_LOG(1, "Skipping ZVOL-based provider %s.", pp->name); + return (0); + } psize = pp->mediasize; psize = P2ALIGN(psize, (uint64_t)sizeof(vdev_label_t)); @@ -316,8 +321,7 @@ vdev_geom_read_guid(struct g_consumer *cp) if ((offset % pp->sectorsize) != 0) continue; - error = vdev_geom_io(cp, BIO_READ, label, offset, size); - if (error != 0) + if (vdev_geom_io(cp, BIO_READ, label, offset, size) != 0) continue; buf = label->vl_vdev_phys.vp_nvlist; @@ -338,7 +342,6 @@ vdev_geom_read_guid(struct g_consumer *cp) struct vdev_geom_find { uint64_t guid; - int write; struct g_consumer *cp; }; @@ -390,10 +393,10 @@ vdev_geom_attach_by_guid_event(void *arg, int flags __unused) g_detach(zcp); if (guid != ap->guid) continue; - ap->cp = vdev_geom_attach(pp, ap->write); + ap->cp = vdev_geom_attach(pp); if (ap->cp == NULL) { - printf("ZFS WARNING: Cannot open %s " - "for writting.\n", pp->name); + printf("ZFS WARNING: Unable to attach to %s.", + pp->name); continue; } goto end; @@ -407,14 +410,13 @@ end: } static struct g_consumer * -vdev_geom_attach_by_guid(uint64_t guid, int write) +vdev_geom_attach_by_guid(uint64_t guid) { struct vdev_geom_find *ap; struct g_consumer *cp; ap = kmem_zalloc(sizeof(*ap), KM_SLEEP); ap->guid = guid; - ap->write = write; g_waitfor_event(vdev_geom_attach_by_guid_event, ap, M_WAITOK, NULL); cp = ap->cp; kmem_free(ap, sizeof(*ap)); @@ -429,11 +431,11 @@ vdev_geom_open_by_guid(vdev_t *vd) size_t len; ZFS_LOG(1, "Searching by guid [%ju].", (uintmax_t)vd->vdev_guid); - cp = vdev_geom_attach_by_guid(vd->vdev_guid, !!(spa_mode & FWRITE)); + cp = vdev_geom_attach_by_guid(vd->vdev_guid); if (cp != NULL) { len = strlen(cp->provider->name) + strlen("/dev/") + 1; buf = kmem_alloc(len, KM_SLEEP); - + snprintf(buf, len, "/dev/%s", cp->provider->name); spa_strfree(vd->vdev_path); vd->vdev_path = buf; @@ -460,7 +462,7 @@ vdev_geom_open_by_path(vdev_t *vd, int check_guid) pp = g_provider_by_name(vd->vdev_path + sizeof("/dev/") - 1); if (pp != NULL) { ZFS_LOG(1, "Found provider by name %s.", vd->vdev_path); - cp = vdev_geom_attach(pp, !!(spa_mode & FWRITE)); + cp = vdev_geom_attach(pp); if (cp != NULL && check_guid) { g_topology_unlock(); guid = vdev_geom_read_guid(cp); @@ -488,7 +490,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) vdev_geom_ctx_t *ctx; struct g_provider *pp; struct g_consumer *cp; - int owned; + int error, owned; /* * We must have a pathname, and it must be absolute. @@ -502,7 +504,8 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) if ((owned = mtx_owned(&Giant))) mtx_unlock(&Giant); - cp = vdev_geom_open_by_path(vd, 0); + error = 0; + cp = vdev_geom_open_by_path(vd, 1); if (cp == NULL) { /* * The device at vd->vdev_path doesn't have the expected guid. @@ -512,16 +515,27 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift) cp = vdev_geom_open_by_guid(vd); } if (cp == NULL) - cp = vdev_geom_open_by_path(vd, 1); + cp = vdev_geom_open_by_path(vd, 0); if (cp == NULL) { ZFS_LOG(1, "Provider %s not found.", vd->vdev_path); - vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED; - if (owned) - mtx_lock(&Giant); - return (EACCES); + error = ENOENT; + } else if (cp->acw == 0 && (spa_mode & FWRITE) != 0) { + g_topology_lock(); + error = g_access(cp, 0, 1, 0); + if (error != 0) { + printf("ZFS WARNING: Unable to open %s for writing (error=%d).", + vd->vdev_path, error); + vdev_geom_detach(cp, 0); + cp = NULL; + } + g_topology_unlock(); } if (owned) mtx_lock(&Giant); + if (cp == NULL) { + vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED; + return (error); + } cp->private = vd; @@ -662,26 +676,6 @@ sendreq: static void vdev_geom_io_done(zio_t *zio) { - - /* - * If the device returned ENXIO, then attempt we should verify if GEOM - * provider has been removed. If this is the case, then we trigger an - * asynchronous removal of the device. - */ - if (zio->io_error == ENXIO) { - vdev_t *vd = zio->io_vd; - vdev_geom_ctx_t *ctx; - struct g_provider *pp = NULL; - - ctx = vd->vdev_tsd; - if (ctx != NULL && ctx->gc_consumer != NULL) - pp = ctx->gc_consumer->provider; - - if (pp == NULL || (pp->flags & G_PF_ORPHAN)) { - vd->vdev_remove_wanted = B_TRUE; - spa_async_request(zio->io_spa, SPA_ASYNC_REMOVE); - } - } } vdev_ops_t vdev_geom_ops = { diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c index a43d85c709ea..eb93721e1675 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c @@ -1663,7 +1663,8 @@ zfs_ace_can_use(znode_t *zp, uint16_t acep_flags) * inherit inheritable ACEs from parent */ static zfs_acl_t * -zfs_acl_inherit(znode_t *zp, zfs_acl_t *paclp, boolean_t *need_chmod) +zfs_acl_inherit(znode_t *zp, zfs_acl_t *paclp, uint64_t mode, + boolean_t *need_chmod) { zfsvfs_t *zfsvfs = zp->z_zfsvfs; void *pacep; @@ -1676,112 +1677,123 @@ zfs_acl_inherit(znode_t *zp, zfs_acl_t *paclp, boolean_t *need_chmod) size_t ace_size; void *data1, *data2; size_t data1sz, data2sz; - enum vtype vntype = ZTOV(zp)->v_type; + boolean_t vdir = ZTOV(zp)->v_type == VDIR; + boolean_t vreg = ZTOV(zp)->v_type == VREG; + boolean_t passthrough, passthrough_x, noallow; + + passthrough_x = + zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH_X; + passthrough = passthrough_x || + zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH; + noallow = + zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW; *need_chmod = B_TRUE; pacep = NULL; aclp = zfs_acl_alloc(paclp->z_version); - if (zfsvfs->z_acl_inherit != ZFS_ACL_DISCARD) { - while (pacep = zfs_acl_next_ace(paclp, pacep, &who, - &access_mask, &iflags, &type)) { + if (zfsvfs->z_acl_inherit == ZFS_ACL_DISCARD) + return (aclp); + while (pacep = zfs_acl_next_ace(paclp, pacep, &who, + &access_mask, &iflags, &type)) { - /* - * don't inherit bogus ACEs - */ - if (!zfs_acl_valid_ace_type(type, iflags)) - continue; + /* + * don't inherit bogus ACEs + */ + if (!zfs_acl_valid_ace_type(type, iflags)) + continue; - if (zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW && - type == ALLOW) - continue; + if (noallow && type == ALLOW) + continue; - ace_size = aclp->z_ops.ace_size(pacep); + ace_size = aclp->z_ops.ace_size(pacep); - if (!zfs_ace_can_use(zp, iflags)) - continue; + if (!zfs_ace_can_use(zp, iflags)) + continue; - /* - * If owner@, group@, or everyone@ inheritable - * then zfs_acl_chmod() isn't needed. - */ - if (zfsvfs->z_acl_inherit == - ZFS_ACL_PASSTHROUGH && - ((iflags & (ACE_OWNER|ACE_EVERYONE)) || - ((iflags & OWNING_GROUP) == - OWNING_GROUP)) && (vntype == VREG || - (vntype == VDIR && - (iflags & ACE_DIRECTORY_INHERIT_ACE)))) - *need_chmod = B_FALSE; + /* + * If owner@, group@, or everyone@ inheritable + * then zfs_acl_chmod() isn't needed. + */ + if (passthrough && + ((iflags & (ACE_OWNER|ACE_EVERYONE)) || + ((iflags & OWNING_GROUP) == + OWNING_GROUP)) && (vreg || (vdir && (iflags & + ACE_DIRECTORY_INHERIT_ACE)))) { + *need_chmod = B_FALSE; - aclnode = zfs_acl_node_alloc(ace_size); - list_insert_tail(&aclp->z_acl, aclnode); - acep = aclnode->z_acldata; - zfs_set_ace(aclp, acep, access_mask, type, - who, iflags|ACE_INHERITED_ACE); + if (!vdir && passthrough_x && + ((mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0)) { + access_mask &= ~ACE_EXECUTE; + } + } + + aclnode = zfs_acl_node_alloc(ace_size); + list_insert_tail(&aclp->z_acl, aclnode); + acep = aclnode->z_acldata; + + zfs_set_ace(aclp, acep, access_mask, type, + who, iflags|ACE_INHERITED_ACE); + + /* + * Copy special opaque data if any + */ + if ((data1sz = paclp->z_ops.ace_data(pacep, &data1)) != 0) { + VERIFY((data2sz = aclp->z_ops.ace_data(acep, + &data2)) == data1sz); + bcopy(data1, data2, data2sz); + } + aclp->z_acl_count++; + aclnode->z_ace_count++; + aclp->z_acl_bytes += aclnode->z_size; + newflags = aclp->z_ops.ace_flags_get(acep); + + if (vdir) + aclp->z_hints |= ZFS_INHERIT_ACE; + + if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) { + newflags &= ~ALL_INHERIT; + aclp->z_ops.ace_flags_set(acep, + newflags|ACE_INHERITED_ACE); + zfs_restricted_update(zfsvfs, aclp, acep); + continue; + } + + ASSERT(vdir); + + newflags = aclp->z_ops.ace_flags_get(acep); + if ((iflags & (ACE_FILE_INHERIT_ACE | + ACE_DIRECTORY_INHERIT_ACE)) != + ACE_FILE_INHERIT_ACE) { + aclnode2 = zfs_acl_node_alloc(ace_size); + list_insert_tail(&aclp->z_acl, aclnode2); + acep2 = aclnode2->z_acldata; + zfs_set_ace(aclp, acep2, + access_mask, type, who, + iflags|ACE_INHERITED_ACE); + newflags |= ACE_INHERIT_ONLY_ACE; + aclp->z_ops.ace_flags_set(acep, newflags); + newflags &= ~ALL_INHERIT; + aclp->z_ops.ace_flags_set(acep2, + newflags|ACE_INHERITED_ACE); /* * Copy special opaque data if any */ - if ((data1sz = paclp->z_ops.ace_data(pacep, + if ((data1sz = aclp->z_ops.ace_data(acep, &data1)) != 0) { - VERIFY((data2sz = aclp->z_ops.ace_data(acep, + VERIFY((data2sz = + aclp->z_ops.ace_data(acep2, &data2)) == data1sz); - bcopy(data1, data2, data2sz); + bcopy(data1, data2, data1sz); } aclp->z_acl_count++; - aclnode->z_ace_count++; + aclnode2->z_ace_count++; aclp->z_acl_bytes += aclnode->z_size; - newflags = aclp->z_ops.ace_flags_get(acep); - - if (vntype == VDIR) - aclp->z_hints |= ZFS_INHERIT_ACE; - - if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || - (vntype != VDIR)) { - newflags &= ~ALL_INHERIT; - aclp->z_ops.ace_flags_set(acep, - newflags|ACE_INHERITED_ACE); - zfs_restricted_update(zfsvfs, aclp, acep); - continue; - } - - ASSERT(vntype == VDIR); - - newflags = aclp->z_ops.ace_flags_get(acep); - if ((iflags & (ACE_FILE_INHERIT_ACE | - ACE_DIRECTORY_INHERIT_ACE)) != - ACE_FILE_INHERIT_ACE) { - aclnode2 = zfs_acl_node_alloc(ace_size); - list_insert_tail(&aclp->z_acl, aclnode2); - acep2 = aclnode2->z_acldata; - zfs_set_ace(aclp, acep2, - access_mask, type, who, - iflags|ACE_INHERITED_ACE); - newflags |= ACE_INHERIT_ONLY_ACE; - aclp->z_ops.ace_flags_set(acep, newflags); - newflags &= ~ALL_INHERIT; - aclp->z_ops.ace_flags_set(acep2, - newflags|ACE_INHERITED_ACE); - - /* - * Copy special opaque data if any - */ - if ((data1sz = aclp->z_ops.ace_data(acep, - &data1)) != 0) { - VERIFY((data2sz = - aclp->z_ops.ace_data(acep2, - &data2)) == data1sz); - bcopy(data1, data2, data1sz); - } - aclp->z_acl_count++; - aclnode2->z_ace_count++; - aclp->z_acl_bytes += aclnode->z_size; - zfs_restricted_update(zfsvfs, aclp, acep2); - } else { - newflags |= ACE_INHERIT_ONLY_ACE; - aclp->z_ops.ace_flags_set(acep, - newflags|ACE_INHERITED_ACE); - } + zfs_restricted_update(zfsvfs, aclp, acep2); + } else { + newflags |= ACE_INHERIT_ONLY_ACE; + aclp->z_ops.ace_flags_set(acep, + newflags|ACE_INHERITED_ACE); } } return (aclp); @@ -1876,7 +1888,7 @@ zfs_perm_init(znode_t *zp, znode_t *parent, int flag, mutex_enter(&parent->z_acl_lock); VERIFY(0 == zfs_acl_node_read(parent, &paclp, B_FALSE)); mutex_exit(&parent->z_acl_lock); - aclp = zfs_acl_inherit(zp, paclp, &need_chmod); + aclp = zfs_acl_inherit(zp, paclp, mode, &need_chmod); zfs_acl_free(paclp); } else { aclp = zfs_acl_alloc(zfs_acl_version_zp(zp)); diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c index 10d3b8671083..77511bd9f671 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c @@ -557,9 +557,6 @@ zfs_rmnode(znode_t *zp) dmu_tx_t *tx; uint64_t acl_obj; int error; - int vfslocked; - - vfslocked = VFS_LOCK_GIANT(zfsvfs->z_vfs); ASSERT(zp->z_phys->zp_links == 0); @@ -593,7 +590,6 @@ zfs_rmnode(znode_t *zp) */ zfs_znode_dmu_fini(zp); zfs_znode_free(zp); - VFS_UNLOCK_GIANT(vfslocked); return; } } @@ -666,7 +662,6 @@ zfs_rmnode(znode_t *zp) out: if (xzp) VN_RELE(ZTOV(xzp)); - VFS_UNLOCK_GIANT(vfslocked); } static uint64_t diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c index 080643a94c18..00e446b82e93 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c @@ -1491,6 +1491,14 @@ zfs_set_prop_nvlist(const char *name, nvlist_t *nvl) if (zpl_earlier_version(name, ZPL_VERSION_FUID)) return (ENOTSUP); break; + + case ZFS_PROP_ACLINHERIT: + if (nvpair_type(elem) == DATA_TYPE_UINT64 && + nvpair_value_uint64(elem, &intval) == 0) + if (intval == ZFS_ACL_PASSTHROUGH_X && + zfs_earlier_version(name, + SPA_VERSION_PASSTHROUGH_X)) + return (ENOTSUP); } } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c index 573a82c98e19..658e53998c9c 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c @@ -60,10 +60,14 @@ zfs_init_vattr(vattr_t *vap, uint64_t mask, uint64_t mode, { VATTR_NULL(vap); vap->va_mask = (uint_t)mask; - vap->va_type = IFTOVT(mode); - vap->va_mode = mode & MODEMASK; - vap->va_uid = (uid_t)(IS_EPHEMERAL(uid)) ? -1 : uid; - vap->va_gid = (gid_t)(IS_EPHEMERAL(gid)) ? -1 : gid; + if (mask & AT_TYPE) + vap->va_type = IFTOVT(mode); + if (mask & AT_MODE) + vap->va_mode = mode & MODEMASK; + if (mask & AT_UID) + vap->va_uid = (uid_t)(IS_EPHEMERAL(uid)) ? -1 : uid; + if (mask & AT_GID) + vap->va_gid = (gid_t)(IS_EPHEMERAL(gid)) ? -1 : gid; vap->va_rdev = zfs_cmpldev(rdev); vap->va_nodeid = nodeid; } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c index 08996ee2a5bf..ad8165b31575 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c @@ -214,7 +214,7 @@ blksz_changed_cb(void *arg, uint64_t newval) newval = SPA_MAXBLOCKSIZE; zfsvfs->z_max_blksz = newval; - zfsvfs->z_vfs->vfs_bsize = newval; + zfsvfs->z_vfs->mnt_stat.f_iosize = newval; } static void @@ -577,7 +577,8 @@ zfs_domount(vfs_t *vfsp, char *osname) if (error = dsl_prop_get_integer(osname, "recordsize", &recordsize, NULL)) goto out; - zfsvfs->z_vfs->vfs_bsize = recordsize; + zfsvfs->z_vfs->vfs_bsize = SPA_MINBLOCKSIZE; + zfsvfs->z_vfs->mnt_stat.f_iosize = recordsize; vfsp->vfs_data = zfsvfs; vfsp->mnt_flag |= MNT_LOCAL; @@ -817,8 +818,8 @@ zfs_statfs(vfs_t *vfsp, struct statfs *statp) * We report the fragsize as the smallest block size we support, * and we report our blocksize as the filesystem's maximum blocksize. */ - statp->f_bsize = zfsvfs->z_vfs->vfs_bsize; - statp->f_iosize = zfsvfs->z_vfs->vfs_bsize; + statp->f_bsize = SPA_MINBLOCKSIZE; + statp->f_iosize = zfsvfs->z_vfs->mnt_stat.f_iosize; /* * The following report "total" blocks of various kinds in the @@ -826,7 +827,7 @@ zfs_statfs(vfs_t *vfsp, struct statfs *statp) * "fragment" size. */ - statp->f_blocks = (refdbytes + availbytes) / statp->f_bsize; + statp->f_blocks = (refdbytes + availbytes) >> SPA_MINBLOCKSHIFT; statp->f_bfree = availbytes / statp->f_bsize; statp->f_bavail = statp->f_bfree; /* no root reservation */ @@ -1388,7 +1389,7 @@ void zfs_init(void) { - printf("ZFS filesystem version " SPA_VERSION_STRING "\n"); + printf("ZFS filesystem version " ZPL_VERSION_STRING "\n"); /* * Initialize znode cache, vnode ops, etc... diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c index a761c81da8b7..4f61f5f3f5ef 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c @@ -1306,7 +1306,7 @@ zfs_create(vnode_t *dvp, char *name, vattr_t *vap, int excl, int mode, } if (vap->va_mask & AT_XVATTR) { - if ((error = secpolicy_xvattr((xvattr_t *)vap, + if ((error = secpolicy_xvattr(dvp, (xvattr_t *)vap, crgetuid(cr), cr, vap->va_type)) != 0) { ZFS_EXIT(zfsvfs); return (error); @@ -1758,7 +1758,7 @@ zfs_mkdir(vnode_t *dvp, char *dirname, vattr_t *vap, vnode_t **vpp, cred_t *cr, zf |= ZCILOOK; if (vap->va_mask & AT_XVATTR) - if ((error = secpolicy_xvattr((xvattr_t *)vap, + if ((error = secpolicy_xvattr(dvp, (xvattr_t *)vap, crgetuid(cr), cr, vap->va_type)) != 0) { ZFS_EXIT(zfsvfs); return (error); @@ -2538,6 +2538,7 @@ zfs_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr, vattr_t oldva; uint_t mask = vap->va_mask; uint_t saved_mask; + uint64_t saved_mode; int trim_mask = 0; uint64_t new_mode; znode_t *attrzp; @@ -2766,6 +2767,13 @@ top: if (trim_mask) { saved_mask = vap->va_mask; vap->va_mask &= ~trim_mask; + if (trim_mask & AT_MODE) { + /* + * Save the mode, as secpolicy_vnode_setattr() + * will overwrite it with ova.va_mode. + */ + saved_mode = vap->va_mode; + } } err = secpolicy_vnode_setattr(cr, vp, vap, &oldva, flags, (int (*)(void *, int, cred_t *))zfs_zaccess_unix, zp); @@ -2774,8 +2782,16 @@ top: return (err); } - if (trim_mask) + if (trim_mask) { vap->va_mask |= saved_mask; + if (trim_mask & AT_MODE) { + /* + * Recover the mode after + * secpolicy_vnode_setattr(). + */ + vap->va_mode = saved_mode; + } + } } /* @@ -3973,21 +3989,33 @@ zfs_freebsd_access(ap) struct thread *a_td; } */ *ap; { + accmode_t accmode; + int error = 0; /* - * ZFS itself only knowns about VREAD, VWRITE and VEXEC, the rest - * we have to handle by calling vaccess(). + * ZFS itself only knowns about VREAD, VWRITE, VEXEC and VAPPEND, */ - if ((ap->a_accmode & ~(VREAD|VWRITE|VEXEC)) != 0) { - vnode_t *vp = ap->a_vp; - znode_t *zp = VTOZ(vp); - znode_phys_t *zphys = zp->z_phys; + accmode = ap->a_accmode & (VREAD|VWRITE|VEXEC|VAPPEND); + if (accmode != 0) + error = zfs_access(ap->a_vp, accmode, 0, ap->a_cred, NULL); - return (vaccess(vp->v_type, zphys->zp_mode, zphys->zp_uid, - zphys->zp_gid, ap->a_accmode, ap->a_cred, NULL)); + /* + * VADMIN has to be handled by vaccess(). + */ + if (error == 0) { + accmode = ap->a_accmode & ~(VREAD|VWRITE|VEXEC|VAPPEND); + if (accmode != 0) { + vnode_t *vp = ap->a_vp; + znode_t *zp = VTOZ(vp); + znode_phys_t *zphys = zp->z_phys; + + error = vaccess(vp->v_type, zphys->zp_mode, + zphys->zp_uid, zphys->zp_gid, accmode, ap->a_cred, + NULL); + } } - return (zfs_access(ap->a_vp, ap->a_accmode, 0, ap->a_cred, NULL)); + return (error); } static int @@ -4180,17 +4208,15 @@ zfs_freebsd_setattr(ap) zflags = VTOZ(vp)->z_phys->zp_flags; if (vap->va_flags != VNOVAL) { + zfsvfs_t *zfsvfs = VTOZ(vp)->z_zfsvfs; int error; + if (zfsvfs->z_use_fuids == B_FALSE) + return (EOPNOTSUPP); + fflags = vap->va_flags; if ((fflags & ~(SF_IMMUTABLE|SF_APPEND|SF_NOUNLINK|UF_NODUMP)) != 0) return (EOPNOTSUPP); - /* - * Callers may only modify the file flags on objects they - * have VADMIN rights for. - */ - if ((error = VOP_ACCESS(vp, VADMIN, cred, curthread)) != 0) - return (error); /* * Unprivileged processes are not permitted to unset system * flags, or modify flags if any system flags are set. @@ -4201,14 +4227,21 @@ zfs_freebsd_setattr(ap) * is non-zero; otherwise, they behave like unprivileged * processes. */ - if (priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0) == 0) { + if (secpolicy_fs_owner(vp->v_mount, cred) == 0 || + priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0) == 0) { if (zflags & (ZFS_IMMUTABLE | ZFS_APPENDONLY | ZFS_NOUNLINK)) { error = securelevel_gt(cred, 0); - if (error) + if (error != 0) return (error); } } else { + /* + * Callers may only modify the file flags on objects they + * have VADMIN rights for. + */ + if ((error = VOP_ACCESS(vp, VADMIN, cred, curthread)) != 0) + return (error); if (zflags & (ZFS_IMMUTABLE | ZFS_APPENDONLY | ZFS_NOUNLINK)) { return (EPERM); @@ -4976,7 +5009,7 @@ struct vop_vector zfs_vnodeops = { struct vop_vector zfs_fifoops = { .vop_default = &fifo_specops, - .vop_fsync = VOP_PANIC, + .vop_fsync = zfs_freebsd_fsync, .vop_access = zfs_freebsd_access, .vop_getattr = zfs_freebsd_getattr, .vop_inactive = zfs_freebsd_inactive, diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c index c43a8500818a..900087b8b329 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c @@ -143,16 +143,19 @@ zfs_znode_cache_constructor(void *buf, void *arg, int kmflags) POINTER_INVALIDATE(&zp->z_zfsvfs); ASSERT(!POINTER_IS_VALID(zp->z_zfsvfs)); - ASSERT(vfsp != NULL); - error = getnewvnode("zfs", vfsp, &zfs_vnodeops, &vp); - if (error != 0 && (kmflags & KM_NOSLEEP)) - return (-1); - ASSERT(error == 0); - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - zp->z_vnode = vp; - vp->v_data = (caddr_t)zp; - VN_LOCK_AREC(vp); + if (vfsp != NULL) { + error = getnewvnode("zfs", vfsp, &zfs_vnodeops, &vp); + if (error != 0 && (kmflags & KM_NOSLEEP)) + return (-1); + ASSERT(error == 0); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + zp->z_vnode = vp; + vp->v_data = (caddr_t)zp; + VN_LOCK_AREC(vp); + } else { + zp->z_vnode = NULL; + } list_link_init(&zp->z_link_node); @@ -1014,6 +1017,7 @@ zfs_zinactive(znode_t *zp) vnode_t *vp = ZTOV(zp); zfsvfs_t *zfsvfs = zp->z_zfsvfs; uint64_t z_id = zp->z_id; + int vfslocked; ASSERT(zp->z_dbuf && zp->z_phys); @@ -1046,7 +1050,9 @@ zfs_zinactive(znode_t *zp) ZFS_OBJ_HOLD_EXIT(zfsvfs, z_id); ASSERT(vp->v_count == 0); vrecycle(vp, curthread); + vfslocked = VFS_LOCK_GIANT(zfsvfs->z_vfs); zfs_rmnode(zp); + VFS_UNLOCK_GIANT(vfslocked); return; } mutex_exit(&zp->z_lock); @@ -1435,7 +1441,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx) nvpair_t *elem; int error; znode_t *rootzp = NULL; - vnode_t *vp; + vnode_t vnode; vattr_t vattr; znode_t *zp; @@ -1504,13 +1510,13 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx) vattr.va_gid = crgetgid(cr); rootzp = kmem_cache_alloc(znode_cache, KM_SLEEP); - zfs_znode_cache_constructor(rootzp, &zfsvfs, 0); + zfs_znode_cache_constructor(rootzp, NULL, 0); rootzp->z_unlinked = 0; rootzp->z_atime_dirty = 0; - vp = ZTOV(rootzp); - vp->v_type = VDIR; - VN_LOCK_ASHARE(vp); + vnode.v_type = VDIR; + vnode.v_data = rootzp; + rootzp->z_vnode = &vnode; bzero(&zfsvfs, sizeof (zfsvfs_t)); @@ -1539,16 +1545,10 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx) ASSERT(error == 0); POINTER_INVALIDATE(&rootzp->z_zfsvfs); - VI_LOCK(vp); - ZTOV(rootzp)->v_data = NULL; - ZTOV(rootzp)->v_count = 0; - ZTOV(rootzp)->v_holdcnt = 0; - rootzp->z_vnode = NULL; - VOP_UNLOCK(vp, 0); - vdestroy(vp); dmu_buf_rele(rootzp->z_dbuf, NULL); rootzp->z_dbuf = NULL; mutex_destroy(&zfsvfs.z_znodes_lock); + rootzp->z_vnode = NULL; kmem_cache_free(znode_cache, rootzp); } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c index a7c2b377ebcc..4455fb86bd18 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c @@ -502,6 +502,25 @@ zil_rollback_destroy(zilog_t *zilog, dmu_tx_t *tx) tx, zh->zh_claim_txg); } +/* + * return true if the initial log block is not valid + */ +static boolean_t +zil_empty(zilog_t *zilog) +{ + const zil_header_t *zh = zilog->zl_header; + arc_buf_t *abuf = NULL; + + if (BP_IS_HOLE(&zh->zh_log)) + return (B_TRUE); + + if (zil_read_log_block(zilog, &zh->zh_log, &abuf) != 0) + return (B_TRUE); + + VERIFY(arc_buf_remove_ref(abuf, &abuf) == 1); + return (B_FALSE); +} + int zil_claim(char *osname, void *txarg) { @@ -521,6 +540,21 @@ zil_claim(char *osname, void *txarg) zilog = dmu_objset_zil(os); zh = zil_header_in_syncing_context(zilog); + /* + * Record here whether the zil has any records to replay. + * If the header block pointer is null or the block points + * to the stubby then we know there are no valid log records. + * We use the header to store this state as the the zilog gets + * freed later in dmu_objset_close(). + * The flags (and the rest of the header fields) are cleared in + * zil_sync() as a result of a zil_destroy(), after replaying the log. + * + * Note, the intent log can be empty but still need the + * stubby to be claimed. + */ + if (!zil_empty(zilog)) + zh->zh_flags |= ZIL_REPLAY_NEEDED; + /* * Claim all log blocks if we haven't already done so, and remember * the highest claimed sequence number. This ensures that if we can @@ -1344,25 +1378,6 @@ zil_free(zilog_t *zilog) kmem_free(zilog, sizeof (zilog_t)); } -/* - * return true if the initial log block is not valid - */ -static boolean_t -zil_empty(zilog_t *zilog) -{ - const zil_header_t *zh = zilog->zl_header; - arc_buf_t *abuf = NULL; - - if (BP_IS_HOLE(&zh->zh_log)) - return (B_TRUE); - - if (zil_read_log_block(zilog, &zh->zh_log, &abuf) != 0) - return (B_TRUE); - - VERIFY(arc_buf_remove_ref(abuf, &abuf) == 1); - return (B_FALSE); -} - /* * Open an intent log. */ @@ -1418,7 +1433,7 @@ zil_suspend(zilog_t *zilog) const zil_header_t *zh = zilog->zl_header; mutex_enter(&zilog->zl_lock); - if (zh->zh_claim_txg != 0) { /* unplayed log */ + if (zh->zh_flags & ZIL_REPLAY_NEEDED) { /* unplayed log */ mutex_exit(&zilog->zl_lock); return (EBUSY); } @@ -1645,7 +1660,7 @@ zil_replay(objset_t *os, void *arg, uint64_t *txgp, const zil_header_t *zh = zilog->zl_header; zil_replay_arg_t zr; - if (zil_empty(zilog)) { + if ((zh->zh_flags & ZIL_REPLAY_NEEDED) == 0) { zil_destroy(zilog, B_TRUE); return; } diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c index e9b00cbbb681..b07a8c11da4b 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c +++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c @@ -335,8 +335,11 @@ zvol_start(struct bio *bp) wakeup_one(&zv->zv_queue); mtx_unlock(&zv->zv_queue_mtx); break; - case BIO_DELETE: case BIO_GETATTR: + if (g_handleattr_int(bp, "ZFS::iszvol", 1)) + break; + /* FALLTHROUGH */ + case BIO_DELETE: default: g_io_deliver(bp, EOPNOTSUPP); break; diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/dkio.h b/sys/cddl/contrib/opensolaris/uts/common/sys/dkio.h deleted file mode 100644 index 18f49e513aff..000000000000 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/dkio.h +++ /dev/null @@ -1,497 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _SYS_DKIO_H -#define _SYS_DKIO_H - -#include /* Needed for NDKMAP define */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Structures and definitions for disk io control commands - */ - -/* - * Structures used as data by ioctl calls. - */ - -#define DK_DEVLEN 16 /* device name max length, including */ - /* unit # & NULL (ie - "xyc1") */ - -/* - * Used for controller info - */ -struct dk_cinfo { - char dki_cname[DK_DEVLEN]; /* controller name (no unit #) */ - ushort_t dki_ctype; /* controller type */ - ushort_t dki_flags; /* flags */ - ushort_t dki_cnum; /* controller number */ - uint_t dki_addr; /* controller address */ - uint_t dki_space; /* controller bus type */ - uint_t dki_prio; /* interrupt priority */ - uint_t dki_vec; /* interrupt vector */ - char dki_dname[DK_DEVLEN]; /* drive name (no unit #) */ - uint_t dki_unit; /* unit number */ - uint_t dki_slave; /* slave number */ - ushort_t dki_partition; /* partition number */ - ushort_t dki_maxtransfer; /* max. transfer size in DEV_BSIZE */ -}; - -/* - * Controller types - */ -#define DKC_UNKNOWN 0 -#define DKC_CDROM 1 /* CD-ROM, SCSI or otherwise */ -#define DKC_WDC2880 2 -#define DKC_XXX_0 3 /* unassigned */ -#define DKC_XXX_1 4 /* unassigned */ -#define DKC_DSD5215 5 -#define DKC_ACB4000 7 -#define DKC_MD21 8 -#define DKC_XXX_2 9 /* unassigned */ -#define DKC_NCRFLOPPY 10 -#define DKC_SMSFLOPPY 12 -#define DKC_SCSI_CCS 13 /* SCSI CCS compatible */ -#define DKC_INTEL82072 14 /* native floppy chip */ -#define DKC_MD 16 /* meta-disk (virtual-disk) driver */ -#define DKC_INTEL82077 19 /* 82077 floppy disk controller */ -#define DKC_DIRECT 20 /* Intel direct attached device i.e. IDE */ -#define DKC_PCMCIA_MEM 21 /* PCMCIA memory disk-like type */ -#define DKC_PCMCIA_ATA 22 /* PCMCIA AT Attached type */ -#define DKC_VBD 23 /* virtual block device */ - -/* - * Sun reserves up through 1023 - */ - -#define DKC_CUSTOMER_BASE 1024 - -/* - * Flags - */ -#define DKI_BAD144 0x01 /* use DEC std 144 bad sector fwding */ -#define DKI_MAPTRK 0x02 /* controller does track mapping */ -#define DKI_FMTTRK 0x04 /* formats only full track at a time */ -#define DKI_FMTVOL 0x08 /* formats only full volume at a time */ -#define DKI_FMTCYL 0x10 /* formats only full cylinders at a time */ -#define DKI_HEXUNIT 0x20 /* unit number is printed as 3 hex digits */ -#define DKI_PCMCIA_PFD 0x40 /* PCMCIA pseudo-floppy memory card */ - -/* - * Used for all partitions - */ -struct dk_allmap { - struct dk_map dka_map[NDKMAP]; -}; - -#if defined(_SYSCALL32) -struct dk_allmap32 { - struct dk_map32 dka_map[NDKMAP]; -}; -#endif /* _SYSCALL32 */ - -/* - * Definition of a disk's geometry - */ -struct dk_geom { - unsigned short dkg_ncyl; /* # of data cylinders */ - unsigned short dkg_acyl; /* # of alternate cylinders */ - unsigned short dkg_bcyl; /* cyl offset (for fixed head area) */ - unsigned short dkg_nhead; /* # of heads */ - unsigned short dkg_obs1; /* obsolete */ - unsigned short dkg_nsect; /* # of data sectors per track */ - unsigned short dkg_intrlv; /* interleave factor */ - unsigned short dkg_obs2; /* obsolete */ - unsigned short dkg_obs3; /* obsolete */ - unsigned short dkg_apc; /* alternates per cyl (SCSI only) */ - unsigned short dkg_rpm; /* revolutions per minute */ - unsigned short dkg_pcyl; /* # of physical cylinders */ - unsigned short dkg_write_reinstruct; /* # sectors to skip, writes */ - unsigned short dkg_read_reinstruct; /* # sectors to skip, reads */ - unsigned short dkg_extra[7]; /* for compatible expansion */ -}; - -/* - * These defines are for historic compatibility with old drivers. - */ -#define dkg_bhead dkg_obs1 /* used to be head offset */ -#define dkg_gap1 dkg_obs2 /* used to be gap1 */ -#define dkg_gap2 dkg_obs3 /* used to be gap2 */ - -/* - * Disk io control commands - * Warning: some other ioctls with the DIOC prefix exist elsewhere. - * The Generic DKIOC numbers are from 0 - 50. - * The Floppy Driver uses 51 - 100. - * The Hard Disk (except SCSI) 101 - 106. (these are obsolete) - * The CDROM Driver 151 - 200. - * The USCSI ioctl 201 - 250. - */ -#define DKIOC (0x04 << 8) - -/* - * The following ioctls are generic in nature and need to be - * suported as appropriate by all disk drivers - */ -#define DKIOCGGEOM (DKIOC|1) /* Get geometry */ -#define DKIOCINFO (DKIOC|3) /* Get info */ -#define DKIOCEJECT (DKIOC|6) /* Generic 'eject' */ -#define DKIOCGVTOC (DKIOC|11) /* Get VTOC */ -#define DKIOCSVTOC (DKIOC|12) /* Set VTOC & Write to Disk */ - -#define DKIOCGEXTVTOC (DKIOC|23) /* Get extended VTOC */ -#define DKIOCSEXTVTOC (DKIOC|24) /* Set extended VTOC, Write to Disk */ - -/* - * Disk Cache Controls. These ioctls should be supported by - * all disk drivers. - * - * DKIOCFLUSHWRITECACHE when used from user-mode ignores the ioctl - * argument, but it should be passed as NULL to allow for future - * reinterpretation. From user-mode, this ioctl request is synchronous. - * - * When invoked from within the kernel, the arg can be NULL to indicate - * a synchronous request or can be the address of a struct dk_callback - * to request an asynchronous callback when the flush request is complete. - * In this case, the flag to the ioctl must include FKIOCTL and the - * dkc_callback field of the pointed to struct must be non-null or the - * request is made synchronously. - * - * In the callback case: if the ioctl returns 0, a callback WILL be performed. - * If the ioctl returns non-zero, a callback will NOT be performed. - * NOTE: In some cases, the callback may be done BEFORE the ioctl call - * returns. The caller's locking strategy should be prepared for this case. - */ -#define DKIOCFLUSHWRITECACHE (DKIOC|34) /* flush cache to phys medium */ - -struct dk_callback { - void (*dkc_callback)(void *dkc_cookie, int error); - void *dkc_cookie; - int dkc_flag; -}; - -/* bit flag definitions for dkc_flag */ -#define FLUSH_VOLATILE 0x1 /* Bit 0: if set, only flush */ - /* volatile cache; otherwise, flush */ - /* volatile and non-volatile cache */ - -#define DKIOCGETWCE (DKIOC|36) /* Get current write cache */ - /* enablement status */ -#define DKIOCSETWCE (DKIOC|37) /* Enable/Disable write cache */ - -/* - * The following ioctls are used by Sun drivers to communicate - * with their associated format routines. Support of these ioctls - * is not required of foreign drivers - */ -#define DKIOCSGEOM (DKIOC|2) /* Set geometry */ -#define DKIOCSAPART (DKIOC|4) /* Set all partitions */ -#define DKIOCGAPART (DKIOC|5) /* Get all partitions */ -#define DKIOCG_PHYGEOM (DKIOC|32) /* get physical geometry */ -#define DKIOCG_VIRTGEOM (DKIOC|33) /* get virtual geometry */ - -/* - * The following ioctl's are removable media support - */ -#define DKIOCLOCK (DKIOC|7) /* Generic 'lock' */ -#define DKIOCUNLOCK (DKIOC|8) /* Generic 'unlock' */ -#define DKIOCSTATE (DKIOC|13) /* Inquire insert/eject state */ -#define DKIOCREMOVABLE (DKIOC|16) /* is media removable */ - - -/* - * ioctl for hotpluggable devices - */ -#define DKIOCHOTPLUGGABLE (DKIOC|35) /* is hotpluggable */ - -/* - * Ioctl to force driver to re-read the alternate partition and rebuild - * the internal defect map. - */ -#define DKIOCADDBAD (DKIOC|20) /* Re-read the alternate map (IDE) */ -#define DKIOCGETDEF (DKIOC|21) /* read defect list (IDE) */ - -/* - * Used by applications to get disk defect information from IDE - * drives. - */ -#ifdef _SYSCALL32 -struct defect_header32 { - int head; - caddr32_t buffer; -}; -#endif /* _SYSCALL32 */ - -struct defect_header { - int head; - caddr_t buffer; -}; - -#define DKIOCPARTINFO (DKIOC|22) /* Get partition or slice parameters */ -#define DKIOCEXTPARTINFO (DKIOC|19) /* Get extended partition or slice */ - /* parameters */ - - -/* - * Used by applications to get partition or slice information - */ -#ifdef _SYSCALL32 -struct part_info32 { - daddr32_t p_start; - int p_length; -}; -#endif /* _SYSCALL32 */ - -struct part_info { - daddr_t p_start; - int p_length; -}; - -struct extpart_info { - diskaddr_t p_start; - diskaddr_t p_length; -}; - -/* The following ioctls are for Optical Memory Device */ -#define DKIOC_EBP_ENABLE (DKIOC|40) /* enable by pass erase on write */ -#define DKIOC_EBP_DISABLE (DKIOC|41) /* disable by pass erase on write */ - -/* - * This state enum is the argument passed to the DKIOCSTATE ioctl. - */ -enum dkio_state { DKIO_NONE, DKIO_EJECTED, DKIO_INSERTED, DKIO_DEV_GONE }; - -#define DKIOCGMEDIAINFO (DKIOC|42) /* get information about the media */ - -/* - * ioctls to read/write mboot info. - */ -#define DKIOCGMBOOT (DKIOC|43) /* get mboot info */ -#define DKIOCSMBOOT (DKIOC|44) /* set mboot info */ - -/* - * ioctl to get the device temperature. - */ -#define DKIOCGTEMPERATURE (DKIOC|45) /* get temperature */ - -/* - * Used for providing the temperature. - */ - -struct dk_temperature { - uint_t dkt_flags; /* Flags */ - short dkt_cur_temp; /* Current disk temperature */ - short dkt_ref_temp; /* reference disk temperature */ -}; - -#define DKT_BYPASS_PM 0x1 -#define DKT_INVALID_TEMP 0xFFFF - - -/* - * Used for Media info or the current profile info - */ -struct dk_minfo { - uint_t dki_media_type; /* Media type or profile info */ - uint_t dki_lbsize; /* Logical blocksize of media */ - diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */ -}; - -/* - * Media types or profiles known - */ -#define DK_UNKNOWN 0x00 /* Media inserted - type unknown */ - - -/* - * SFF 8090 Specification Version 3, media types 0x01 - 0xfffe are retained to - * maintain compatibility with SFF8090. The following define the - * optical media type. - */ -#define DK_REMOVABLE_DISK 0x02 /* Removable Disk */ -#define DK_MO_ERASABLE 0x03 /* MO Erasable */ -#define DK_MO_WRITEONCE 0x04 /* MO Write once */ -#define DK_AS_MO 0x05 /* AS MO */ -#define DK_CDROM 0x08 /* CDROM */ -#define DK_CDR 0x09 /* CD-R */ -#define DK_CDRW 0x0A /* CD-RW */ -#define DK_DVDROM 0x10 /* DVD-ROM */ -#define DK_DVDR 0x11 /* DVD-R */ -#define DK_DVDRAM 0x12 /* DVD_RAM or DVD-RW */ - -/* - * Media types for other rewritable magnetic media - */ -#define DK_FIXED_DISK 0x10001 /* Fixed disk SCSI or otherwise */ -#define DK_FLOPPY 0x10002 /* Floppy media */ -#define DK_ZIP 0x10003 /* IOMEGA ZIP media */ -#define DK_JAZ 0x10004 /* IOMEGA JAZ media */ - -#define DKIOCSETEFI (DKIOC|17) /* Set EFI info */ -#define DKIOCGETEFI (DKIOC|18) /* Get EFI info */ - -#define DKIOCPARTITION (DKIOC|9) /* Get partition info */ - -/* - * Ioctls to get/set volume capabilities related to Logical Volume Managers. - * They include the ability to get/set capabilities and to issue a read to a - * specific underlying device of a replicated device. - */ - -#define DKIOCGETVOLCAP (DKIOC | 25) /* Get volume capabilities */ -#define DKIOCSETVOLCAP (DKIOC | 26) /* Set volume capabilities */ -#define DKIOCDMR (DKIOC | 27) /* Issue a directed read */ - -#define DKIOCDUMPINIT (DKIOC | 28) /* Dumpify a zvol */ -#define DKIOCDUMPFINI (DKIOC | 29) /* Un-Dumpify a zvol */ - -typedef uint_t volcapinfo_t; - -typedef uint_t volcapset_t; - -#define DKV_ABR_CAP 0x00000001 /* Support Appl.Based Recovery */ -#define DKV_DMR_CAP 0x00000002 /* Support Directed Mirror Read */ - -typedef struct volcap { - volcapinfo_t vc_info; /* Capabilities available */ - volcapset_t vc_set; /* Capabilities set */ -} volcap_t; - -#define VOL_SIDENAME 256 - -typedef struct vol_directed_rd { - int vdr_flags; - offset_t vdr_offset; - size_t vdr_nbytes; - size_t vdr_bytesread; - void *vdr_data; - int vdr_side; - char vdr_side_name[VOL_SIDENAME]; -} vol_directed_rd_t; - -#define DKV_SIDE_INIT (-1) -#define DKV_DMR_NEXT_SIDE 0x00000001 -#define DKV_DMR_DONE 0x00000002 -#define DKV_DMR_ERROR 0x00000004 -#define DKV_DMR_SUCCESS 0x00000008 -#define DKV_DMR_SHORT 0x00000010 - -#ifdef _MULTI_DATAMODEL -#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 -#pragma pack(4) -#endif -typedef struct vol_directed_rd32 { - int32_t vdr_flags; - offset_t vdr_offset; /* 64-bit element on 32-bit alignment */ - size32_t vdr_nbytes; - size32_t vdr_bytesread; - caddr32_t vdr_data; - int32_t vdr_side; - char vdr_side_name[VOL_SIDENAME]; -} vol_directed_rd32_t; -#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 -#pragma pack() -#endif -#endif /* _MULTI_DATAMODEL */ - -/* - * The ioctl is used to fetch disk's device type, vendor ID, - * model number/product ID, firmware revision and serial number together. - * - * Currently there are two device types - DKD_ATA_TYPE which means the - * disk is driven by cmdk/ata or dad/uata driver, and DKD_SCSI_TYPE - * which means the disk is driven by sd/scsi hba driver. - */ -#define DKIOC_GETDISKID (DKIOC|46) - -/* These two labels are for dkd_dtype of dk_disk_id_t */ -#define DKD_ATA_TYPE 0x01 /* ATA disk or legacy mode SATA disk */ -#define DKD_SCSI_TYPE 0x02 /* SCSI disk or native mode SATA disk */ - -#define DKD_ATA_MODEL 40 /* model number length */ -#define DKD_ATA_FWVER 8 /* firmware revision length */ -#define DKD_ATA_SERIAL 20 /* serial number length */ - -#define DKD_SCSI_VENDOR 8 /* vendor ID length */ -#define DKD_SCSI_PRODUCT 16 /* product ID length */ -#define DKD_SCSI_REVLEVEL 4 /* revision level length */ -#define DKD_SCSI_SERIAL 12 /* serial number length */ - -/* - * The argument type for DKIOC_GETDISKID ioctl. - */ -typedef struct dk_disk_id { - uint_t dkd_dtype; - union { - struct { - char dkd_amodel[DKD_ATA_MODEL]; /* 40 bytes */ - char dkd_afwver[DKD_ATA_FWVER]; /* 8 bytes */ - char dkd_aserial[DKD_ATA_SERIAL]; /* 20 bytes */ - } ata_disk_id; - struct { - char dkd_svendor[DKD_SCSI_VENDOR]; /* 8 bytes */ - char dkd_sproduct[DKD_SCSI_PRODUCT]; /* 16 bytes */ - char dkd_sfwver[DKD_SCSI_REVLEVEL]; /* 4 bytes */ - char dkd_sserial[DKD_SCSI_SERIAL]; /* 12 bytes */ - } scsi_disk_id; - } disk_id; -} dk_disk_id_t; - -/* - * The ioctl is used to update the firmware of device. - */ -#define DKIOC_UPDATEFW (DKIOC|47) - -/* The argument type for DKIOC_UPDATEFW ioctl */ -typedef struct dk_updatefw { - caddr_t dku_ptrbuf; /* pointer to firmware buf */ - uint_t dku_size; /* firmware buf length */ - uint8_t dku_type; /* firmware update type */ -} dk_updatefw_t; - -#ifdef _SYSCALL32 -typedef struct dk_updatefw_32 { - caddr32_t dku_ptrbuf; /* pointer to firmware buf */ - uint_t dku_size; /* firmware buf length */ - uint8_t dku_type; /* firmware update type */ -} dk_updatefw_32_t; -#endif /* _SYSCALL32 */ - -/* - * firmware update type - temporary or permanent use - */ -#define FW_TYPE_TEMP 0x0 /* temporary use */ -#define FW_TYPE_PERM 0x1 /* permanent use */ - - -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_DKIO_H */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/dklabel.h b/sys/cddl/contrib/opensolaris/uts/common/sys/dklabel.h deleted file mode 100644 index 01baa7157caf..000000000000 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/dklabel.h +++ /dev/null @@ -1,277 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _SYS_DKLABEL_H -#define _SYS_DKLABEL_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Miscellaneous defines - */ -#define DKL_MAGIC 0xDABE /* magic number */ -#define FKL_MAGIC 0xff /* magic number for DOS floppies */ - -#if defined(_SUNOS_VTOC_16) -#define NDKMAP 16 /* # of logical partitions */ -#define DK_LABEL_LOC 1 /* location of disk label */ -#elif defined(_SUNOS_VTOC_8) -#define NDKMAP 8 /* # of logical partitions */ -#define DK_LABEL_LOC 0 /* location of disk label */ -#else -#error "No VTOC format defined." -#endif - -#define LEN_DKL_ASCII 128 /* length of dkl_asciilabel */ -#define LEN_DKL_VVOL 8 /* length of v_volume */ -#define DK_LABEL_SIZE 512 /* size of disk label */ -#define DK_MAX_BLOCKS 0x7fffffff /* max # of blocks handled */ - -/* - * Reserve two cylinders on SCSI disks. - * One is for the backup disk label and the other is for the deviceid. - * - * IPI disks only reserve one cylinder, but they will go away soon. - * CDROMs do not reserve any cylinders. - */ -#define DK_ACYL 2 - -/* - * Format of a Sun disk label. - * Resides in cylinder 0, head 0, sector 0. - * - * sizeof (struct dk_label) should be 512 (the current sector size), - * but should the sector size increase, this structure should remain - * at the beginning of the sector. - */ - -#if !defined(BLKADDR_TYPE) -#define BLKADDR_TYPE -#if defined(_EXTVTOC) -typedef unsigned long blkaddr_t; -typedef unsigned int blkaddr32_t; -#else -typedef daddr_t blkaddr_t; -typedef daddr32_t blkaddr32_t; -#endif -#endif - -/* - * partition headers: section 1 - * Returned in struct dk_allmap by ioctl DKIOC[SG]APART (dkio(7I)) - */ -struct dk_map { - blkaddr_t dkl_cylno; /* starting cylinder */ - blkaddr_t dkl_nblk; /* number of blocks; if == 0, */ - /* partition is undefined */ -}; - -/* - * partition headers: section 1 - * Fixed size for on-disk dk_label - */ -struct dk_map32 { - blkaddr32_t dkl_cylno; /* starting cylinder */ - blkaddr32_t dkl_nblk; /* number of blocks; if == 0, */ - /* partition is undefined */ -}; - -/* - * partition headers: section 2, - * brought over from AT&T SVr4 vtoc structure. - */ -struct dk_map2 { - uint16_t p_tag; /* ID tag of partition */ - uint16_t p_flag; /* permission flag */ -}; - -struct dkl_partition { - uint16_t p_tag; /* ID tag of partition */ - uint16_t p_flag; /* permision flags */ - blkaddr32_t p_start; /* start sector no of partition */ - blkaddr32_t p_size; /* # of blocks in partition */ -}; - - -/* - * VTOC inclusions from AT&T SVr4 - * Fixed sized types for on-disk VTOC - */ - -struct dk_vtoc { -#if defined(_SUNOS_VTOC_16) - uint32_t v_bootinfo[3]; /* info for mboot (unsupported) */ - uint32_t v_sanity; /* to verify vtoc sanity */ - uint32_t v_version; /* layout version */ - char v_volume[LEN_DKL_VVOL]; /* volume name */ - uint16_t v_sectorsz; /* sector size in bytes */ - uint16_t v_nparts; /* number of partitions */ - uint32_t v_reserved[10]; /* free space */ - struct dkl_partition v_part[NDKMAP]; /* partition headers */ - time32_t timestamp[NDKMAP]; /* partition timestamp (unsupported) */ - char v_asciilabel[LEN_DKL_ASCII]; /* for compatibility */ -#elif defined(_SUNOS_VTOC_8) - uint32_t v_version; /* layout version */ - char v_volume[LEN_DKL_VVOL]; /* volume name */ - uint16_t v_nparts; /* number of partitions */ - struct dk_map2 v_part[NDKMAP]; /* partition hdrs, sec 2 */ - uint32_t v_bootinfo[3]; /* info needed by mboot */ - uint32_t v_sanity; /* to verify vtoc sanity */ - uint32_t v_reserved[10]; /* free space */ - time32_t v_timestamp[NDKMAP]; /* partition timestamp */ -#else -#error "No VTOC format defined." -#endif -}; - -/* - * define the amount of disk label padding needed to make - * the entire structure occupy 512 bytes. - */ -#if defined(_SUNOS_VTOC_16) -#define LEN_DKL_PAD (DK_LABEL_SIZE - \ - ((sizeof (struct dk_vtoc) + \ - (4 * sizeof (uint32_t)) + \ - (12 * sizeof (uint16_t)) + \ - (2 * (sizeof (uint16_t)))))) -#elif defined(_SUNOS_VTOC_8) -#define LEN_DKL_PAD (DK_LABEL_SIZE \ - - ((LEN_DKL_ASCII) + \ - (sizeof (struct dk_vtoc)) + \ - (sizeof (struct dk_map32) * NDKMAP) + \ - (14 * (sizeof (uint16_t))) + \ - (2 * (sizeof (uint16_t))))) -#else -#error "No VTOC format defined." -#endif - - -struct dk_label { -#if defined(_SUNOS_VTOC_16) - struct dk_vtoc dkl_vtoc; /* vtoc inclusions from AT&T SVr4 */ - uint32_t dkl_pcyl; /* # of physical cylinders */ - uint32_t dkl_ncyl; /* # of data cylinders */ - uint16_t dkl_acyl; /* # of alternate cylinders */ - uint16_t dkl_bcyl; /* cyl offset (for fixed head area) */ - uint32_t dkl_nhead; /* # of heads */ - uint32_t dkl_nsect; /* # of data sectors per track */ - uint16_t dkl_intrlv; /* interleave factor */ - uint16_t dkl_skew; /* skew factor */ - uint16_t dkl_apc; /* alternates per cyl (SCSI only) */ - uint16_t dkl_rpm; /* revolutions per minute */ - uint16_t dkl_write_reinstruct; /* # sectors to skip, writes */ - uint16_t dkl_read_reinstruct; /* # sectors to skip, reads */ - uint16_t dkl_extra[4]; /* for compatible expansion */ - char dkl_pad[LEN_DKL_PAD]; /* unused part of 512 bytes */ -#elif defined(_SUNOS_VTOC_8) - char dkl_asciilabel[LEN_DKL_ASCII]; /* for compatibility */ - struct dk_vtoc dkl_vtoc; /* vtoc inclusions from AT&T SVr4 */ - uint16_t dkl_write_reinstruct; /* # sectors to skip, writes */ - uint16_t dkl_read_reinstruct; /* # sectors to skip, reads */ - char dkl_pad[LEN_DKL_PAD]; /* unused part of 512 bytes */ - uint16_t dkl_rpm; /* rotations per minute */ - uint16_t dkl_pcyl; /* # physical cylinders */ - uint16_t dkl_apc; /* alternates per cylinder */ - uint16_t dkl_obs1; /* obsolete */ - uint16_t dkl_obs2; /* obsolete */ - uint16_t dkl_intrlv; /* interleave factor */ - uint16_t dkl_ncyl; /* # of data cylinders */ - uint16_t dkl_acyl; /* # of alternate cylinders */ - uint16_t dkl_nhead; /* # of heads in this partition */ - uint16_t dkl_nsect; /* # of 512 byte sectors per track */ - uint16_t dkl_obs3; /* obsolete */ - uint16_t dkl_obs4; /* obsolete */ - struct dk_map32 dkl_map[NDKMAP]; /* logical partition headers */ -#else -#error "No VTOC format defined." -#endif - uint16_t dkl_magic; /* identifies this label format */ - uint16_t dkl_cksum; /* xor checksum of sector */ -}; - -#if defined(_SUNOS_VTOC_16) -#define dkl_asciilabel dkl_vtoc.v_asciilabel -#define v_timestamp timestamp - -#elif defined(_SUNOS_VTOC_8) - -/* - * These defines are for historic compatibility with old drivers. - */ -#define dkl_gap1 dkl_obs1 /* used to be gap1 */ -#define dkl_gap2 dkl_obs2 /* used to be gap2 */ -#define dkl_bhead dkl_obs3 /* used to be label head offset */ -#define dkl_ppart dkl_obs4 /* used to by physical partition */ -#else -#error "No VTOC format defined." -#endif - -struct fk_label { /* DOS floppy label */ - uchar_t fkl_type; - uchar_t fkl_magich; - uchar_t fkl_magicl; - uchar_t filler; -}; - -/* - * Layout of stored fabricated device id (on-disk) - */ -#define DK_DEVID_BLKSIZE (512) -#define DK_DEVID_SIZE (DK_DEVID_BLKSIZE - ((sizeof (uchar_t) * 7))) -#define DK_DEVID_REV_MSB (0) -#define DK_DEVID_REV_LSB (1) - -struct dk_devid { - uchar_t dkd_rev_hi; /* revision (MSB) */ - uchar_t dkd_rev_lo; /* revision (LSB) */ - uchar_t dkd_flags; /* flags (not used yet) */ - uchar_t dkd_devid[DK_DEVID_SIZE]; /* devid stored here */ - uchar_t dkd_checksum3; /* checksum (MSB) */ - uchar_t dkd_checksum2; - uchar_t dkd_checksum1; - uchar_t dkd_checksum0; /* checksum (LSB) */ -}; - -#define DKD_GETCHKSUM(dkd) ((dkd)->dkd_checksum3 << 24) + \ - ((dkd)->dkd_checksum2 << 16) + \ - ((dkd)->dkd_checksum1 << 8) + \ - ((dkd)->dkd_checksum0) - -#define DKD_FORMCHKSUM(c, dkd) (dkd)->dkd_checksum3 = hibyte(hiword((c))); \ - (dkd)->dkd_checksum2 = lobyte(hiword((c))); \ - (dkd)->dkd_checksum1 = hibyte(loword((c))); \ - (dkd)->dkd_checksum0 = lobyte(loword((c))); -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_DKLABEL_H */ diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h index 70da8aec978a..2f7e7474c3f6 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h +++ b/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h @@ -253,13 +253,14 @@ typedef enum zfs_cache_type { #define SPA_VERSION_11 11ULL #define SPA_VERSION_12 12ULL #define SPA_VERSION_13 13ULL +#define SPA_VERSION_14 14ULL /* * When bumping up SPA_VERSION, make sure GRUB ZFS understands the on-disk * format change. Go to usr/src/grub/grub-0.95/stage2/{zfs-include/, fsys_zfs*}, * and do the appropriate changes. */ -#define SPA_VERSION SPA_VERSION_13 -#define SPA_VERSION_STRING "13" +#define SPA_VERSION SPA_VERSION_14 +#define SPA_VERSION_STRING "14" /* * Symbolic names for the changes that caused a SPA_VERSION switch. @@ -294,6 +295,7 @@ typedef enum zfs_cache_type { #define SPA_VERSION_DSL_SCRUB SPA_VERSION_11 #define SPA_VERSION_SNAP_PROPS SPA_VERSION_12 #define SPA_VERSION_USED_BREAKDOWN SPA_VERSION_13 +#define SPA_VERSION_PASSTHROUGH_X SPA_VERSION_14 /* * ZPL version - rev'd whenever an incompatible on-disk format change diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h b/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h index a46b71187354..5f1f4b457fd8 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h +++ b/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h @@ -304,7 +304,6 @@ typedef struct xvattr { * VOP_ACCESS flags */ #define V_ACE_MASK 0x1 /* mask represents NFSv4 ACE permissions */ -#define V_APPEND 0x2 /* want to do append only check */ /* * Flags for vnode operations. diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index 71b22aa11c2e..75b290b365f0 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -593,6 +593,41 @@ freebsd32_select(struct thread *td, struct freebsd32_select_args *uap) sizeof(int32_t) * 8)); } +int +freebsd32_pselect(struct thread *td, struct freebsd32_pselect_args *uap) +{ + struct timespec32 ts32; + struct timespec ts; + struct timeval tv, *tvp; + sigset_t set, *uset; + int error; + + if (uap->ts != NULL) { + error = copyin(uap->ts, &ts32, sizeof(ts32)); + if (error != 0) + return (error); + CP(ts32, ts, tv_sec); + CP(ts32, ts, tv_nsec); + TIMESPEC_TO_TIMEVAL(&tv, &ts); + tvp = &tv; + } else + tvp = NULL; + if (uap->sm != NULL) { + error = copyin(uap->sm, &set, sizeof(set)); + if (error != 0) + return (error); + uset = &set; + } else + uset = NULL; + /* + * XXX big-endian needs to convert the fd_sets too. + * XXX Do pointers need PTRIN()? + */ + error = kern_pselect(td, uap->nd, uap->in, uap->ou, uap->ex, tvp, + uset, sizeof(int32_t) * 8); + return (error); +} + /* * Copy 'count' items into the destination list pointed to by uap->eventlist. */ @@ -2482,7 +2517,7 @@ ofreebsd32_sigprocmask(struct thread *td, int error; OSIG2SIG(uap->mask, set); - error = kern_sigprocmask(td, uap->how, &set, &oset, 1); + error = kern_sigprocmask(td, uap->how, &set, &oset, SIGPROCMASK_OLD); SIG2OSIG(oset, td->td_retval[0]); return (error); } @@ -2546,15 +2581,11 @@ int ofreebsd32_sigblock(struct thread *td, struct ofreebsd32_sigblock_args *uap) { - struct proc *p = td->td_proc; - sigset_t set; + sigset_t set, oset; OSIG2SIG(uap->mask, set); - SIG_CANTMASK(set); - PROC_LOCK(p); - SIG2OSIG(td->td_sigmask, td->td_retval[0]); - SIGSETOR(td->td_sigmask, set); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_BLOCK, &set, &oset, 0); + SIG2OSIG(oset, td->td_retval[0]); return (0); } @@ -2562,16 +2593,11 @@ int ofreebsd32_sigsetmask(struct thread *td, struct ofreebsd32_sigsetmask_args *uap) { - struct proc *p = td->td_proc; - sigset_t set; + sigset_t set, oset; OSIG2SIG(uap->mask, set); - SIG_CANTMASK(set); - PROC_LOCK(p); - SIG2OSIG(td->td_sigmask, td->td_retval[0]); - SIGSETLO(td->td_sigmask, set); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &set, &oset, 0); + SIG2OSIG(oset, td->td_retval[0]); return (0); } @@ -2579,21 +2605,10 @@ int ofreebsd32_sigsuspend(struct thread *td, struct ofreebsd32_sigsuspend_args *uap) { - struct proc *p = td->td_proc; sigset_t mask; - PROC_LOCK(p); - td->td_oldsigmask = td->td_sigmask; - td->td_pflags |= TDP_OLDMASK; OSIG2SIG(uap->mask, mask); - SIG_CANTMASK(mask); - SIGSETLO(td->td_sigmask, mask); - signotify(td); - while (msleep(&p->p_sigacts, &p->p_mtx, PPAUSE|PCATCH, "opause", 0) == 0) - /* void */; - PROC_UNLOCK(p); - /* always return EINTR rather than ERESTART... */ - return (EINTR); + return (kern_sigsuspend(td, mask)); } struct sigstack32 { diff --git a/sys/compat/freebsd32/freebsd32_proto.h b/sys/compat/freebsd32/freebsd32_proto.h index 2a74fada83c8..7418dbdc2512 100644 --- a/sys/compat/freebsd32/freebsd32_proto.h +++ b/sys/compat/freebsd32/freebsd32_proto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 195468 2009-07-08 16:26:43Z trasz + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 200111 2009-12-04 21:52:31Z kib */ #ifndef _FREEBSD32_SYSPROTO_H_ @@ -453,6 +453,14 @@ struct freebsd32_shmctl_args { char cmd_l_[PADL_(int)]; int cmd; char cmd_r_[PADR_(int)]; char buf_l_[PADL_(struct shmid_ds32 *)]; struct shmid_ds32 * buf; char buf_r_[PADR_(struct shmid_ds32 *)]; }; +struct freebsd32_pselect_args { + char nd_l_[PADL_(int)]; int nd; char nd_r_[PADR_(int)]; + char in_l_[PADL_(fd_set *)]; fd_set * in; char in_r_[PADR_(fd_set *)]; + char ou_l_[PADL_(fd_set *)]; fd_set * ou; char ou_r_[PADR_(fd_set *)]; + char ex_l_[PADL_(fd_set *)]; fd_set * ex; char ex_r_[PADR_(fd_set *)]; + char ts_l_[PADL_(const struct timespec32 *)]; const struct timespec32 * ts; char ts_r_[PADR_(const struct timespec32 *)]; + char sm_l_[PADL_(const sigset_t *)]; const sigset_t * sm; char sm_r_[PADR_(const sigset_t *)]; +}; int freebsd32_wait4(struct thread *, struct freebsd32_wait4_args *); int freebsd32_recvmsg(struct thread *, struct freebsd32_recvmsg_args *); int freebsd32_sendmsg(struct thread *, struct freebsd32_sendmsg_args *); @@ -536,6 +544,7 @@ int freebsd32_jail_set(struct thread *, struct freebsd32_jail_set_args *); int freebsd32_semctl(struct thread *, struct freebsd32_semctl_args *); int freebsd32_msgctl(struct thread *, struct freebsd32_msgctl_args *); int freebsd32_shmctl(struct thread *, struct freebsd32_shmctl_args *); +int freebsd32_pselect(struct thread *, struct freebsd32_pselect_args *); #ifdef COMPAT_43 @@ -626,8 +635,7 @@ int freebsd4_freebsd32_sigreturn(struct thread *, struct freebsd4_freebsd32_sigr #endif /* COMPAT_FREEBSD4 */ -#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD6) +#ifdef COMPAT_FREEBSD6 struct freebsd6_freebsd32_pread_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; @@ -681,11 +689,10 @@ int freebsd6_freebsd32_lseek(struct thread *, struct freebsd6_freebsd32_lseek_ar int freebsd6_freebsd32_truncate(struct thread *, struct freebsd6_freebsd32_truncate_args *); int freebsd6_freebsd32_ftruncate(struct thread *, struct freebsd6_freebsd32_ftruncate_args *); -#endif /* COMPAT_FREEBSD[456] */ +#endif /* COMPAT_FREEBSD6 */ -#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) +#ifdef COMPAT_FREEBSD7 struct freebsd7_freebsd32_semctl_args { char semid_l_[PADL_(int)]; int semid; char semid_r_[PADR_(int)]; @@ -707,7 +714,7 @@ int freebsd7_freebsd32_semctl(struct thread *, struct freebsd7_freebsd32_semctl_ int freebsd7_freebsd32_msgctl(struct thread *, struct freebsd7_freebsd32_msgctl_args *); int freebsd7_freebsd32_shmctl(struct thread *, struct freebsd7_freebsd32_shmctl_args *); -#endif /* COMPAT_FREEBSD[4567] */ +#endif /* COMPAT_FREEBSD7 */ #define FREEBSD32_SYS_AUE_freebsd32_wait4 AUE_WAIT4 #define FREEBSD32_SYS_AUE_freebsd4_freebsd32_getfsstat AUE_GETFSSTAT @@ -816,6 +823,7 @@ int freebsd7_freebsd32_shmctl(struct thread *, struct freebsd7_freebsd32_shmctl_ #define FREEBSD32_SYS_AUE_freebsd32_semctl AUE_SEMCTL #define FREEBSD32_SYS_AUE_freebsd32_msgctl AUE_MSGCTL #define FREEBSD32_SYS_AUE_freebsd32_shmctl AUE_SHMCTL +#define FREEBSD32_SYS_AUE_freebsd32_pselect AUE_SELECT #undef PAD_ #undef PADL_ diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h index 6ff55df1f82d..abd87eb8830c 100644 --- a/sys/compat/freebsd32/freebsd32_syscall.h +++ b/sys/compat/freebsd32/freebsd32_syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 195468 2009-07-08 16:26:43Z trasz + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 200111 2009-12-04 21:52:31Z kib */ #define FREEBSD32_SYS_syscall 0 @@ -311,6 +311,10 @@ #define FREEBSD32_SYS_freebsd32_getcontext 421 #define FREEBSD32_SYS_freebsd32_setcontext 422 #define FREEBSD32_SYS_freebsd32_swapcontext 423 +#define FREEBSD32_SYS___acl_get_link 425 +#define FREEBSD32_SYS___acl_set_link 426 +#define FREEBSD32_SYS___acl_delete_link 427 +#define FREEBSD32_SYS___acl_aclcheck_link 428 #define FREEBSD32_SYS_sigwait 429 #define FREEBSD32_SYS_thr_exit 431 #define FREEBSD32_SYS_thr_self 432 @@ -382,4 +386,5 @@ #define FREEBSD32_SYS_freebsd32_msgctl 511 #define FREEBSD32_SYS_freebsd32_shmctl 512 #define FREEBSD32_SYS_lpathconf 513 -#define FREEBSD32_SYS_MAXSYSCALL 514 +#define FREEBSD32_SYS_freebsd32_pselect 522 +#define FREEBSD32_SYS_MAXSYSCALL 523 diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c index 4cd91746f2a6..2949d1bbf3d9 100644 --- a/sys/compat/freebsd32/freebsd32_syscalls.c +++ b/sys/compat/freebsd32/freebsd32_syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 195468 2009-07-08 16:26:43Z trasz + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 200111 2009-12-04 21:52:31Z kib */ const char *freebsd32_syscallnames[] = { @@ -432,10 +432,10 @@ const char *freebsd32_syscallnames[] = { "freebsd32_setcontext", /* 422 = freebsd32_setcontext */ "freebsd32_swapcontext", /* 423 = freebsd32_swapcontext */ "#424", /* 424 = swapoff */ - "#425", /* 425 = __acl_get_link */ - "#426", /* 426 = __acl_set_link */ - "#427", /* 427 = __acl_delete_link */ - "#428", /* 428 = __acl_aclcheck_link */ + "__acl_get_link", /* 425 = __acl_get_link */ + "__acl_set_link", /* 426 = __acl_set_link */ + "__acl_delete_link", /* 427 = __acl_delete_link */ + "__acl_aclcheck_link", /* 428 = __acl_aclcheck_link */ "sigwait", /* 429 = sigwait */ "#430", /* 430 = thr_create; */ "thr_exit", /* 431 = thr_exit */ @@ -521,4 +521,13 @@ const char *freebsd32_syscallnames[] = { "freebsd32_msgctl", /* 511 = freebsd32_msgctl */ "freebsd32_shmctl", /* 512 = freebsd32_shmctl */ "lpathconf", /* 513 = lpathconf */ + "#514", /* 514 = cap_new */ + "#515", /* 515 = cap_getrights */ + "#516", /* 516 = cap_enter */ + "#517", /* 517 = cap_getmode */ + "#518", /* 518 = pdfork */ + "#519", /* 519 = pdkill */ + "#520", /* 520 = pdgetpid */ + "#521", /* 521 = pdwait */ + "freebsd32_pselect", /* 522 = freebsd32_pselect */ }; diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c index e5fa6ae4fea3..479c92113092 100644 --- a/sys/compat/freebsd32/freebsd32_sysent.c +++ b/sys/compat/freebsd32/freebsd32_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 195468 2009-07-08 16:26:43Z trasz + * created from FreeBSD: head/sys/compat/freebsd32/syscalls.master 200111 2009-12-04 21:52:31Z kib */ #include "opt_compat.h" @@ -469,10 +469,10 @@ struct sysent freebsd32_sysent[] = { { AS(freebsd32_setcontext_args), (sy_call_t *)freebsd32_setcontext, AUE_NULL, NULL, 0, 0, 0 }, /* 422 = freebsd32_setcontext */ { AS(freebsd32_swapcontext_args), (sy_call_t *)freebsd32_swapcontext, AUE_NULL, NULL, 0, 0, 0 }, /* 423 = freebsd32_swapcontext */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 424 = swapoff */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 425 = __acl_get_link */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 426 = __acl_set_link */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 427 = __acl_delete_link */ - { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 428 = __acl_aclcheck_link */ + { AS(__acl_get_link_args), (sy_call_t *)__acl_get_link, AUE_NULL, NULL, 0, 0, 0 }, /* 425 = __acl_get_link */ + { AS(__acl_set_link_args), (sy_call_t *)__acl_set_link, AUE_NULL, NULL, 0, 0, 0 }, /* 426 = __acl_set_link */ + { AS(__acl_delete_link_args), (sy_call_t *)__acl_delete_link, AUE_NULL, NULL, 0, 0, 0 }, /* 427 = __acl_delete_link */ + { AS(__acl_aclcheck_link_args), (sy_call_t *)__acl_aclcheck_link, AUE_NULL, NULL, 0, 0, 0 }, /* 428 = __acl_aclcheck_link */ { AS(sigwait_args), (sy_call_t *)sigwait, AUE_SIGWAIT, NULL, 0, 0, 0 }, /* 429 = sigwait */ { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 430 = thr_create; */ { AS(thr_exit_args), (sy_call_t *)thr_exit, AUE_NULL, NULL, 0, 0, 0 }, /* 431 = thr_exit */ @@ -558,4 +558,13 @@ struct sysent freebsd32_sysent[] = { { AS(freebsd32_msgctl_args), (sy_call_t *)freebsd32_msgctl, AUE_MSGCTL, NULL, 0, 0, 0 }, /* 511 = freebsd32_msgctl */ { AS(freebsd32_shmctl_args), (sy_call_t *)freebsd32_shmctl, AUE_SHMCTL, NULL, 0, 0, 0 }, /* 512 = freebsd32_shmctl */ { AS(lpathconf_args), (sy_call_t *)lpathconf, AUE_LPATHCONF, NULL, 0, 0, 0 }, /* 513 = lpathconf */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 514 = cap_new */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 515 = cap_getrights */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 516 = cap_enter */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 517 = cap_getmode */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 518 = pdfork */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 519 = pdkill */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 520 = pdgetpid */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 521 = pdwait */ + { AS(freebsd32_pselect_args), (sy_call_t *)freebsd32_pselect, AUE_SELECT, NULL, 0, 0, 0 }, /* 522 = freebsd32_pselect */ }; diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master index 0628571bbb1d..3abd6e77d406 100644 --- a/sys/compat/freebsd32/syscalls.master +++ b/sys/compat/freebsd32/syscalls.master @@ -13,7 +13,7 @@ ; case where the event exists, but we don't want auditing, the ; event should be #defined to AUE_NULL in audit_kevents.h. ; type one of STD, OBSOL, UNIMPL, COMPAT, COMPAT4, COMPAT6, -; COMPAT7, LIBCOMPAT, NODEF, NOARGS, NOPROTO, NOSTD +; COMPAT7, NODEF, NOARGS, NOPROTO, NOSTD ; The COMPAT* options may be combined with one or more NO* ; options separated by '|' with no spaces (e.g. COMPAT|NOARGS) ; name psuedo-prototype of syscall routine @@ -29,7 +29,6 @@ ; COMPAT4 included on COMPAT4 #ifdef (FreeBSD 4 compat) ; COMPAT6 included on COMPAT6 #ifdef (FreeBSD 6 compat) ; COMPAT7 included on COMPAT7 #ifdef (FreeBSD 7 compat) -; LIBCOMPAT included on COMPAT #ifdef, and placed in syscall.h ; OBSOL obsolete, not included in system, only specifies name ; UNIMPL not implemented, placeholder only ; NOSTD implemented but as a lkm that can be statically @@ -740,10 +739,14 @@ struct freebsd32_ucontext *oucp, \ const struct freebsd32_ucontext *ucp); } 424 AUE_SWAPOFF UNIMPL swapoff -425 AUE_NULL UNIMPL __acl_get_link -426 AUE_NULL UNIMPL __acl_set_link -427 AUE_NULL UNIMPL __acl_delete_link -428 AUE_NULL UNIMPL __acl_aclcheck_link +425 AUE_NULL NOPROTO { int __acl_get_link(const char *path, \ + acl_type_t type, struct acl *aclp); } +426 AUE_NULL NOPROTO { int __acl_set_link(const char *path, \ + acl_type_t type, struct acl *aclp); } +427 AUE_NULL NOPROTO { int __acl_delete_link(const char *path, \ + acl_type_t type); } +428 AUE_NULL NOPROTO { int __acl_aclcheck_link(const char *path, \ + acl_type_t type, struct acl *aclp); } 429 AUE_SIGWAIT NOPROTO { int sigwait(const sigset_t *set, \ int *sig); } 430 AUE_NULL UNIMPL thr_create; @@ -901,3 +904,15 @@ 512 AUE_SHMCTL STD { int freebsd32_shmctl(int shmid, int cmd, \ struct shmid_ds32 *buf); } 513 AUE_LPATHCONF NOPROTO { int lpathconf(char *path, int name); } +514 AUE_CAP_NEW UNIMPL cap_new +515 AUE_CAP_GETRIGHTS UNIMPL cap_getrights +516 AUE_CAP_ENTER UNIMPL cap_enter +517 AUE_CAP_GETMODE UNIMPL cap_getmode +518 AUE_PDFORK UNIMPL pdfork +519 AUE_PDKILL UNIMPL pdkill +520 AUE_PDGETPID UNIMPL pdgetpid +521 AUE_PDWAIT UNIMPL pdwait +522 AUE_SELECT STD { int freebsd32_pselect(int nd, fd_set *in, \ + fd_set *ou, fd_set *ex, \ + const struct timespec32 *ts, \ + const sigset_t *sm); } diff --git a/sys/compat/ia32/ia32_sysvec.c b/sys/compat/ia32/ia32_sysvec.c index 46e0b80d2707..cb8d33df43ac 100644 --- a/sys/compat/ia32/ia32_sysvec.c +++ b/sys/compat/ia32/ia32_sysvec.c @@ -152,7 +152,7 @@ static Elf32_Brandinfo ia32_brand_info = { .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE }; -SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_MIDDLE, (sysinit_cfunc_t) elf32_insert_brand_entry, &ia32_brand_info); diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c index bb49e3fa8a43..4e33eaab2869 100644 --- a/sys/compat/linux/linux_file.c +++ b/sys/compat/linux/linux_file.c @@ -652,7 +652,7 @@ linux_unlinkat(struct thread *td, struct linux_unlinkat_args *args) if (args->flag & LINUX_AT_REMOVEDIR) error = kern_rmdirat(td, dfd, path, UIO_SYSSPACE); else - error = kern_unlinkat(td, dfd, path, UIO_SYSSPACE); + error = kern_unlinkat(td, dfd, path, UIO_SYSSPACE, 0); if (error == EPERM && !(args->flag & LINUX_AT_REMOVEDIR)) { /* Introduce POSIX noncompliant behaviour of Linux */ if (kern_statat(td, AT_SYMLINK_NOFOLLOW, dfd, path, diff --git a/sys/compat/linux/linux_futex.c b/sys/compat/linux/linux_futex.c index b9f570ba7b10..484226055990 100644 --- a/sys/compat/linux/linux_futex.c +++ b/sys/compat/linux/linux_futex.c @@ -493,7 +493,7 @@ linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args) return (error); if (f == NULL) { td->td_retval[0] = 0; - return (error);; + return (error); } td->td_retval[0] = futex_wake(f, args->val); futex_put(f, NULL); diff --git a/sys/compat/linux/linux_getcwd.c b/sys/compat/linux/linux_getcwd.c index afd30c8a4e06..cad5a22efd3d 100644 --- a/sys/compat/linux/linux_getcwd.c +++ b/sys/compat/linux/linux_getcwd.c @@ -15,13 +15,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c index 7688fe51db50..c457d12a2e97 100644 --- a/sys/compat/linux/linux_ioctl.c +++ b/sys/compat/linux/linux_ioctl.c @@ -78,6 +78,9 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include + CTASSERT(LINUX_IFNAMSIZ == IFNAMSIZ); static linux_ioctl_function_t linux_ioctl_cdrom; @@ -91,7 +94,9 @@ static linux_ioctl_function_t linux_ioctl_termio; static linux_ioctl_function_t linux_ioctl_private; static linux_ioctl_function_t linux_ioctl_drm; static linux_ioctl_function_t linux_ioctl_sg; +static linux_ioctl_function_t linux_ioctl_v4l; static linux_ioctl_function_t linux_ioctl_special; +static linux_ioctl_function_t linux_ioctl_fbsd_usb; static struct linux_ioctl_handler cdrom_handler = { linux_ioctl_cdrom, LINUX_IOCTL_CDROM_MIN, LINUX_IOCTL_CDROM_MAX }; @@ -115,6 +120,10 @@ static struct linux_ioctl_handler drm_handler = { linux_ioctl_drm, LINUX_IOCTL_DRM_MIN, LINUX_IOCTL_DRM_MAX }; static struct linux_ioctl_handler sg_handler = { linux_ioctl_sg, LINUX_IOCTL_SG_MIN, LINUX_IOCTL_SG_MAX }; +static struct linux_ioctl_handler video_handler = +{ linux_ioctl_v4l, LINUX_IOCTL_VIDEO_MIN, LINUX_IOCTL_VIDEO_MAX }; +static struct linux_ioctl_handler fbsd_usb = +{ linux_ioctl_fbsd_usb, LINUX_FBSD_USB_MIN, LINUX_FBSD_USB_MAX }; DATA_SET(linux_ioctl_handler_set, cdrom_handler); DATA_SET(linux_ioctl_handler_set, vfat_handler); @@ -127,6 +136,8 @@ DATA_SET(linux_ioctl_handler_set, termio_handler); DATA_SET(linux_ioctl_handler_set, private_handler); DATA_SET(linux_ioctl_handler_set, drm_handler); DATA_SET(linux_ioctl_handler_set, sg_handler); +DATA_SET(linux_ioctl_handler_set, video_handler); +DATA_SET(linux_ioctl_handler_set, fbsd_usb); struct handler_element { @@ -136,7 +147,7 @@ struct handler_element }; static TAILQ_HEAD(, handler_element) handlers = - TAILQ_HEAD_INITIALIZER(handlers); + TAILQ_HEAD_INITIALIZER(handlers); static struct sx linux_ioctl_sx; SX_SYSINIT(linux_ioctl, &linux_ioctl_sx, "linux ioctl handlers"); @@ -2588,6 +2599,342 @@ linux_ioctl_sg(struct thread *td, struct linux_ioctl_args *args) return (error); } +/* + * Video4Linux (V4L) ioctl handler + */ +static int +linux_to_bsd_v4l_tuner(struct l_video_tuner *lvt, struct video_tuner *vt) +{ + vt->tuner = lvt->tuner; + strlcpy(vt->name, lvt->name, LINUX_VIDEO_TUNER_NAME_SIZE); + vt->rangelow = lvt->rangelow; /* possible long size conversion */ + vt->rangehigh = lvt->rangehigh; /* possible long size conversion */ + vt->flags = lvt->flags; + vt->mode = lvt->mode; + vt->signal = lvt->signal; + return (0); +} + +static int +bsd_to_linux_v4l_tuner(struct video_tuner *vt, struct l_video_tuner *lvt) +{ + lvt->tuner = vt->tuner; + strlcpy(lvt->name, vt->name, LINUX_VIDEO_TUNER_NAME_SIZE); + lvt->rangelow = vt->rangelow; /* possible long size conversion */ + lvt->rangehigh = vt->rangehigh; /* possible long size conversion */ + lvt->flags = vt->flags; + lvt->mode = vt->mode; + lvt->signal = vt->signal; + return (0); +} + +static int +linux_to_bsd_v4l_clip(struct l_video_clip *lvc, struct video_clip *vc) +{ + vc->x = lvc->x; + vc->y = lvc->y; + vc->width = lvc->width; + vc->height = lvc->height; + vc->next = PTRIN(lvc->next); /* possible pointer size conversion */ + return (0); +} + +static int +linux_to_bsd_v4l_window(struct l_video_window *lvw, struct video_window *vw) +{ + vw->x = lvw->x; + vw->y = lvw->y; + vw->width = lvw->width; + vw->height = lvw->height; + vw->chromakey = lvw->chromakey; + vw->flags = lvw->flags; + vw->clips = PTRIN(lvw->clips); /* possible pointer size conversion */ + vw->clipcount = lvw->clipcount; + return (0); +} + +static int +bsd_to_linux_v4l_window(struct video_window *vw, struct l_video_window *lvw) +{ + lvw->x = vw->x; + lvw->y = vw->y; + lvw->width = vw->width; + lvw->height = vw->height; + lvw->chromakey = vw->chromakey; + lvw->flags = vw->flags; + lvw->clips = PTROUT(vw->clips); /* possible pointer size conversion */ + lvw->clipcount = vw->clipcount; + return (0); +} + +static int +linux_to_bsd_v4l_buffer(struct l_video_buffer *lvb, struct video_buffer *vb) +{ + vb->base = PTRIN(lvb->base); /* possible pointer size conversion */ + vb->height = lvb->height; + vb->width = lvb->width; + vb->depth = lvb->depth; + vb->bytesperline = lvb->bytesperline; + return (0); +} + +static int +bsd_to_linux_v4l_buffer(struct video_buffer *vb, struct l_video_buffer *lvb) +{ + lvb->base = PTROUT(vb->base); /* possible pointer size conversion */ + lvb->height = vb->height; + lvb->width = vb->width; + lvb->depth = vb->depth; + lvb->bytesperline = vb->bytesperline; + return (0); +} + +static int +linux_to_bsd_v4l_code(struct l_video_code *lvc, struct video_code *vc) +{ + strlcpy(vc->loadwhat, lvc->loadwhat, LINUX_VIDEO_CODE_LOADWHAT_SIZE); + vc->datasize = lvc->datasize; + vc->data = PTRIN(lvc->data); /* possible pointer size conversion */ + return (0); +} + +static int +linux_v4l_clip_copy(void *lvc, struct video_clip **ppvc) +{ + int error; + struct video_clip vclip; + struct l_video_clip l_vclip; + + error = copyin(lvc, &l_vclip, sizeof(l_vclip)); + if (error) return (error); + linux_to_bsd_v4l_clip(&l_vclip, &vclip); + /* XXX: If there can be no concurrency: s/M_NOWAIT/M_WAITOK/ */ + if ((*ppvc = malloc(sizeof(**ppvc), M_LINUX, M_NOWAIT)) == NULL) + return (ENOMEM); /* XXX: linux has no ENOMEM here */ + memcpy(&vclip, *ppvc, sizeof(vclip)); + (*ppvc)->next = NULL; + return (0); +} + +static int +linux_v4l_cliplist_free(struct video_window *vw) +{ + struct video_clip **ppvc; + struct video_clip **ppvc_next; + + for (ppvc = &(vw->clips); *ppvc != NULL; ppvc = ppvc_next) { + ppvc_next = &((*ppvc)->next); + free(*ppvc, M_LINUX); + } + return (0); +} + +static int +linux_v4l_cliplist_copy(struct l_video_window *lvw, struct video_window *vw) +{ + int error; + int clipcount; + void *plvc; + struct video_clip **ppvc; + + /* + * XXX: The cliplist is used to pass in a list of clipping + * rectangles or, if clipcount == VIDEO_CLIP_BITMAP, a + * clipping bitmap. Some Linux apps, however, appear to + * leave cliplist and clips uninitialized. In any case, + * the cliplist is not used by pwc(4), at the time of + * writing, FreeBSD's only V4L driver. When a driver + * that uses the cliplist is developed, this code may + * need re-examiniation. + */ + error = 0; + clipcount = vw->clipcount; + if (clipcount == VIDEO_CLIP_BITMAP) { + /* + * In this case, the pointer (clips) is overloaded + * to be a "void *" to a bitmap, therefore there + * is no struct video_clip to copy now. + */ + } else if (clipcount > 0 && clipcount <= 16384) { + /* + * Clips points to list of clip rectangles, so + * copy the list. + * + * XXX: Upper limit of 16384 was used here to try to + * avoid cases when clipcount and clips pointer + * are uninitialized and therefore have high random + * values, as is the case in the Linux Skype + * application. The value 16384 was chosen as that + * is what is used in the Linux stradis(4) MPEG + * decoder driver, the only place we found an + * example of cliplist use. + */ + plvc = PTRIN(lvw->clips); + ppvc = &(vw->clips); + while (clipcount-- > 0) { + if (plvc == 0) + error = EFAULT; + if (!error) + error = linux_v4l_clip_copy(plvc, ppvc); + if (error) { + linux_v4l_cliplist_free(vw); + break; + } + ppvc = &((*ppvc)->next); + plvc = PTRIN(((struct l_video_clip *) plvc)->next); + } + } else { + /* + * clipcount == 0 or negative (but not VIDEO_CLIP_BITMAP) + * Force cliplist to null. + */ + vw->clipcount = 0; + vw->clips = NULL; + } + return (error); +} + +static int +linux_ioctl_v4l(struct thread *td, struct linux_ioctl_args *args) +{ + struct file *fp; + int error; + struct video_tuner vtun; + struct video_window vwin; + struct video_buffer vbuf; + struct video_code vcode; + struct l_video_tuner l_vtun; + struct l_video_window l_vwin; + struct l_video_buffer l_vbuf; + struct l_video_code l_vcode; + + switch (args->cmd & 0xffff) { + case LINUX_VIDIOCGCAP: args->cmd = VIDIOCGCAP; break; + case LINUX_VIDIOCGCHAN: args->cmd = VIDIOCGCHAN; break; + case LINUX_VIDIOCSCHAN: args->cmd = VIDIOCSCHAN; break; + + case LINUX_VIDIOCGTUNER: + if ((error = fget(td, args->fd, &fp)) != 0) + return (error); + error = fo_ioctl(fp, VIDIOCGTUNER, &vtun, td->td_ucred, td); + if (!error) { + bsd_to_linux_v4l_tuner(&vtun, &l_vtun); + error = copyout(&l_vtun, (void *) args->arg, + sizeof(l_vtun)); + } + fdrop(fp, td); + return (error); + + case LINUX_VIDIOCSTUNER: + if ((error = fget(td, args->fd, &fp)) != 0) + return (error); + error = copyin((void *) args->arg, &l_vtun, sizeof(l_vtun)); + if (error) { + fdrop(fp, td); + return (error); + } + linux_to_bsd_v4l_tuner(&l_vtun, &vtun); + error = fo_ioctl(fp, VIDIOCSMICROCODE, &vtun, td->td_ucred, td); + fdrop(fp, td); + return (error); + + case LINUX_VIDIOCGPICT: args->cmd = VIDIOCGPICT; break; + case LINUX_VIDIOCSPICT: args->cmd = VIDIOCSPICT; break; + case LINUX_VIDIOCCAPTURE: args->cmd = VIDIOCCAPTURE; break; + + case LINUX_VIDIOCGWIN: + if ((error = fget(td, args->fd, &fp)) != 0) + return (error); + error = fo_ioctl(fp, VIDIOCGWIN, &vwin, td->td_ucred, td); + if (!error) { + bsd_to_linux_v4l_window(&vwin, &l_vwin); + error = copyout(&l_vwin, (void *) args->arg, + sizeof(l_vwin)); + } + fdrop(fp, td); + return (error); + + case LINUX_VIDIOCSWIN: + if ((error = fget(td, args->fd, &fp)) != 0) + return (error); + error = copyin((void *) args->arg, &l_vwin, sizeof(l_vwin)); + if (error) { + fdrop(fp, td); + return (error); + } + linux_to_bsd_v4l_window(&l_vwin, &vwin); + error = linux_v4l_cliplist_copy(&l_vwin, &vwin); + if (error) { + fdrop(fp, td); + return (error); + } + error = fo_ioctl(fp, VIDIOCSWIN, &vwin, td->td_ucred, td); + fdrop(fp, td); + linux_v4l_cliplist_free(&vwin); + return (error); + + case LINUX_VIDIOCGFBUF: + if ((error = fget(td, args->fd, &fp)) != 0) + return (error); + error = fo_ioctl(fp, VIDIOCGFBUF, &vbuf, td->td_ucred, td); + if (!error) { + bsd_to_linux_v4l_buffer(&vbuf, &l_vbuf); + error = copyout(&l_vbuf, (void *) args->arg, + sizeof(l_vbuf)); + } + fdrop(fp, td); + return (error); + + case LINUX_VIDIOCSFBUF: + if ((error = fget(td, args->fd, &fp)) != 0) + return (error); + error = copyin((void *) args->arg, &l_vbuf, sizeof(l_vbuf)); + if (error) { + fdrop(fp, td); + return (error); + } + linux_to_bsd_v4l_buffer(&l_vbuf, &vbuf); + error = fo_ioctl(fp, VIDIOCSFBUF, &vbuf, td->td_ucred, td); + fdrop(fp, td); + return (error); + + case LINUX_VIDIOCKEY: args->cmd = VIDIOCKEY; break; + case LINUX_VIDIOCGFREQ: args->cmd = VIDIOCGFREQ; break; + case LINUX_VIDIOCSFREQ: args->cmd = VIDIOCSFREQ; break; + case LINUX_VIDIOCGAUDIO: args->cmd = VIDIOCGAUDIO; break; + case LINUX_VIDIOCSAUDIO: args->cmd = VIDIOCSAUDIO; break; + case LINUX_VIDIOCSYNC: args->cmd = VIDIOCSYNC; break; + case LINUX_VIDIOCMCAPTURE: args->cmd = VIDIOCMCAPTURE; break; + case LINUX_VIDIOCGMBUF: args->cmd = VIDIOCGMBUF; break; + case LINUX_VIDIOCGUNIT: args->cmd = VIDIOCGUNIT; break; + case LINUX_VIDIOCGCAPTURE: args->cmd = VIDIOCGCAPTURE; break; + case LINUX_VIDIOCSCAPTURE: args->cmd = VIDIOCSCAPTURE; break; + case LINUX_VIDIOCSPLAYMODE: args->cmd = VIDIOCSPLAYMODE; break; + case LINUX_VIDIOCSWRITEMODE: args->cmd = VIDIOCSWRITEMODE; break; + case LINUX_VIDIOCGPLAYINFO: args->cmd = VIDIOCGPLAYINFO; break; + + case LINUX_VIDIOCSMICROCODE: + if ((error = fget(td, args->fd, &fp)) != 0) + return (error); + error = copyin((void *) args->arg, &l_vcode, sizeof(l_vcode)); + if (error) { + fdrop(fp, td); + return (error); + } + linux_to_bsd_v4l_code(&l_vcode, &vcode); + error = fo_ioctl(fp, VIDIOCSTUNER, &vcode, td->td_ucred, td); + fdrop(fp, td); + return (error); + + case LINUX_VIDIOCGVBIFMT: args->cmd = VIDIOCGVBIFMT; break; + case LINUX_VIDIOCSVBIFMT: args->cmd = VIDIOCSVBIFMT; break; + default: return (ENOIOCTL); + } + + error = ioctl(td, (struct ioctl_args *)args); + return (error); +} + /* * Special ioctl handler */ @@ -2616,6 +2963,24 @@ linux_ioctl_special(struct thread *td, struct linux_ioctl_args *args) return (error); } +/* + * Support for mounting our devfs under /compat/linux/dev and using + * our libusb(3) compiled on Linux to access it from within Linuxolator + * environment. + */ +static int +linux_ioctl_fbsd_usb(struct thread *td, struct linux_ioctl_args *args) +{ + + /* + * Because on GNU/Linux we build our libusb(3) with our header + * files and ioccom.h macros, ioctl() will contain our native + * command value. This means that we can basically redirect this + * call further. + */ + return (ioctl(td, (struct ioctl_args *)args)); +} + /* * main ioctl syscall function */ diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h index 2192127d38d3..5503362f4b78 100644 --- a/sys/compat/linux/linux_ioctl.h +++ b/sys/compat/linux/linux_ioctl.h @@ -575,4 +575,46 @@ struct ifnet; int linux_ifname(struct ifnet *, char *, size_t); +/* + * video + */ +#define LINUX_VIDIOCGCAP 0x7601 +#define LINUX_VIDIOCGCHAN 0x7602 +#define LINUX_VIDIOCSCHAN 0x7603 +#define LINUX_VIDIOCGTUNER 0x7604 +#define LINUX_VIDIOCSTUNER 0x7605 +#define LINUX_VIDIOCGPICT 0x7606 +#define LINUX_VIDIOCSPICT 0x7607 +#define LINUX_VIDIOCCAPTURE 0x7608 +#define LINUX_VIDIOCGWIN 0x7609 +#define LINUX_VIDIOCSWIN 0x760a +#define LINUX_VIDIOCGFBUF 0x760b +#define LINUX_VIDIOCSFBUF 0x760c +#define LINUX_VIDIOCKEY 0x760d +#define LINUX_VIDIOCGFREQ 0x760e +#define LINUX_VIDIOCSFREQ 0x760f +#define LINUX_VIDIOCGAUDIO 0x7610 +#define LINUX_VIDIOCSAUDIO 0x7611 +#define LINUX_VIDIOCSYNC 0x7623 +#define LINUX_VIDIOCMCAPTURE 0x7613 +#define LINUX_VIDIOCGMBUF 0x7614 +#define LINUX_VIDIOCGUNIT 0x7615 +#define LINUX_VIDIOCGCAPTURE 0x7616 +#define LINUX_VIDIOCSCAPTURE 0x7617 +#define LINUX_VIDIOCSPLAYMODE 0x7618 +#define LINUX_VIDIOCSWRITEMODE 0x7619 +#define LINUX_VIDIOCGPLAYINFO 0x761a +#define LINUX_VIDIOCSMICROCODE 0x761b +#define LINUX_VIDIOCGVBIFMT 0x761c +#define LINUX_VIDIOCSVBIFMT 0x761d + +#define LINUX_IOCTL_VIDEO_MIN LINUX_VIDIOCGCAP +#define LINUX_IOCTL_VIDEO_MAX LINUX_VIDIOCSVBIFMT + +/* + * Keep in sync with our include/dev/usb/usb_ioctl.h. + */ +#define LINUX_FBSD_USB_MIN 0x5100 +#define LINUX_FBSD_USB_MAX 0x55c7 + #endif /* !_LINUX_IOCTL_H_ */ diff --git a/sys/compat/linux/linux_ipc.c b/sys/compat/linux/linux_ipc.c index 0a46a058bfdb..fbec94e9dd4b 100644 --- a/sys/compat/linux/linux_ipc.c +++ b/sys/compat/linux/linux_ipc.c @@ -872,7 +872,7 @@ linux_shmctl(struct thread *td, struct linux_shmctl_args *args) case LINUX_SHM_LOCK: case LINUX_SHM_UNLOCK: default: - linux_msg(td, "ipc typ=%d not implemented", args->cmd & ~LINUX_IPC_64); + linux_msg(td, "ipc type %d not implemented", args->cmd & ~LINUX_IPC_64); return EINVAL; } } diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index 1d5eaf832ea9..d2cf6b6abf16 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -1138,7 +1138,7 @@ linux_setgroups(struct thread *td, struct linux_setgroups_args *args) struct proc *p; ngrp = args->gidsetsize; - if (ngrp < 0 || ngrp >= NGROUPS) + if (ngrp < 0 || ngrp >= ngroups_max + 1) return (EINVAL); linux_gidset = malloc(ngrp * sizeof(*linux_gidset), M_TEMP, M_WAITOK); error = copyin(args->grouplist, linux_gidset, ngrp * sizeof(l_gid_t)); diff --git a/sys/compat/linux/linux_signal.c b/sys/compat/linux/linux_signal.c index 5910d627d8de..9cc05ed99b87 100644 --- a/sys/compat/linux/linux_signal.c +++ b/sys/compat/linux/linux_signal.c @@ -565,7 +565,7 @@ linux_do_tkill(struct thread *td, l_int tgid, l_int pid, l_int signum) AUDIT_ARG_PROCESS(p); error = p_cansignal(td, p, signum); - if (error) + if (error != 0 || signum == 0) goto out; error = ESRCH; diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index d3860b0b2b21..d94d9263f8ea 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -128,7 +128,7 @@ do_sa_get(struct sockaddr **sap, const struct osockaddr *osa, int *osalen, bdom = linux_to_bsd_domain(kosa->sa_family); if (bdom == -1) { - error = EINVAL; + error = EAFNOSUPPORT; goto out; } @@ -157,8 +157,13 @@ do_sa_get(struct sockaddr **sap, const struct osockaddr *osa, int *osalen, } } else #endif - if (bdom == AF_INET) + if (bdom == AF_INET) { alloclen = sizeof(struct sockaddr_in); + if (*osalen < alloclen) { + error = EINVAL; + goto out; + } + } sa = (struct sockaddr *) kosa; sa->sa_family = bdom; @@ -639,19 +644,12 @@ linux_socket(struct thread *td, struct linux_socket_args *args) } #ifdef INET6 /* - * Linux AF_INET6 socket has IPV6_V6ONLY setsockopt set to 0 by - * default and some apps depend on this. So, set V6ONLY to 0 - * for Linux apps if the sysctl value is set to 1. + * Linux AF_INET6 socket has IPV6_V6ONLY setsockopt set to 0 by default + * and some apps depend on this. So, set V6ONLY to 0 for Linux apps. + * For simplicity we do this unconditionally of the net.inet6.ip6.v6only + * sysctl value. */ - if (bsd_args.domain == PF_INET6 -#ifndef KLD_MODULE - /* - * XXX: Avoid undefined symbol error with an IPv4 only - * kernel. - */ - && V_ip6_v6only -#endif - ) { + if (bsd_args.domain == PF_INET6) { int v6only; v6only = 0; diff --git a/sys/compat/linux/linux_stats.c b/sys/compat/linux/linux_stats.c index 4d21a32a231e..8e8936ce016f 100644 --- a/sys/compat/linux/linux_stats.c +++ b/sys/compat/linux/linux_stats.c @@ -58,8 +58,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include - static void translate_vnhook_major_minor(struct vnode *vp, struct stat *sb) { diff --git a/sys/compat/linux/linux_time.c b/sys/compat/linux/linux_time.c index e9bc71b14528..8800d674c319 100644 --- a/sys/compat/linux/linux_time.c +++ b/sys/compat/linux/linux_time.c @@ -15,13 +15,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/compat/linux/linux_uid16.c b/sys/compat/linux/linux_uid16.c index b49bf785fd9c..6ad674be77fc 100644 --- a/sys/compat/linux/linux_uid16.c +++ b/sys/compat/linux/linux_uid16.c @@ -109,7 +109,7 @@ linux_setgroups16(struct thread *td, struct linux_setgroups16_args *args) #endif ngrp = args->gidsetsize; - if (ngrp < 0 || ngrp >= NGROUPS) + if (ngrp < 0 || ngrp >= ngroups_max + 1) return (EINVAL); linux_gidset = malloc(ngrp * sizeof(*linux_gidset), M_TEMP, M_WAITOK); error = copyin(args->gidset, linux_gidset, ngrp * sizeof(l_gid16_t)); diff --git a/sys/compat/linux/linux_videodev.h b/sys/compat/linux/linux_videodev.h new file mode 100644 index 000000000000..f6606aeadffc --- /dev/null +++ b/sys/compat/linux/linux_videodev.h @@ -0,0 +1,367 @@ +/* + * This header comes from linux, but it has no license. The author + * (Alan Cox @ Redhat) gave explicit permissions to use it in FreeBSD. + * The freeBSD vendor branch for v4l gives a more detailed description + * about this. + * + * $FreeBSD$ + */ + +#ifndef __LINUX_VIDEODEV_H +#define __LINUX_VIDEODEV_H + +#include +typedef int32_t __s32; +typedef uint32_t __u32; +typedef uint16_t __u16; +typedef uint8_t __u8; + +#if 0 +#define HAVE_V4L1 1 + +#include +#endif + +#define VID_TYPE_CAPTURE 1 /* Can capture */ +#define VID_TYPE_TUNER 2 /* Can tune */ +#define VID_TYPE_TELETEXT 4 /* Does teletext */ +#define VID_TYPE_OVERLAY 8 /* Overlay onto frame buffer */ +#define VID_TYPE_CHROMAKEY 16 /* Overlay by chromakey */ +#define VID_TYPE_CLIPPING 32 /* Can clip */ +#define VID_TYPE_FRAMERAM 64 /* Uses the frame buffer memory */ +#define VID_TYPE_SCALES 128 /* Scalable */ +#define VID_TYPE_MONOCHROME 256 /* Monochrome only */ +#define VID_TYPE_SUBCAPTURE 512 /* Can capture subareas of the image */ +#define VID_TYPE_MPEG_DECODER 1024 /* Can decode MPEG streams */ +#define VID_TYPE_MPEG_ENCODER 2048 /* Can encode MPEG streams */ +#define VID_TYPE_MJPEG_DECODER 4096 /* Can decode MJPEG streams */ +#define VID_TYPE_MJPEG_ENCODER 8192 /* Can encode MJPEG streams */ + +struct video_capability +{ + char name[32]; + int type; + int channels; /* Num channels */ + int audios; /* Num audio devices */ + int maxwidth; /* Supported width */ + int maxheight; /* And height */ + int minwidth; /* Supported width */ + int minheight; /* And height */ +}; + + +struct video_channel +{ + int channel; + char name[32]; + int tuners; + __u32 flags; +#define VIDEO_VC_TUNER 1 /* Channel has a tuner */ +#define VIDEO_VC_AUDIO 2 /* Channel has audio */ + __u16 type; +#define VIDEO_TYPE_TV 1 +#define VIDEO_TYPE_CAMERA 2 + __u16 norm; /* Norm set by channel */ +}; + +struct video_tuner +{ + int tuner; + char name[32]; + unsigned long rangelow, rangehigh; /* Tuner range */ + __u32 flags; +#define VIDEO_TUNER_PAL 1 +#define VIDEO_TUNER_NTSC 2 +#define VIDEO_TUNER_SECAM 4 +#define VIDEO_TUNER_LOW 8 /* Uses KHz not MHz */ +#define VIDEO_TUNER_NORM 16 /* Tuner can set norm */ +#define VIDEO_TUNER_STEREO_ON 128 /* Tuner is seeing stereo */ +#define VIDEO_TUNER_RDS_ON 256 /* Tuner is seeing an RDS datastream */ +#define VIDEO_TUNER_MBS_ON 512 /* Tuner is seeing an MBS datastream */ + __u16 mode; /* PAL/NTSC/SECAM/OTHER */ +#define VIDEO_MODE_PAL 0 +#define VIDEO_MODE_NTSC 1 +#define VIDEO_MODE_SECAM 2 +#define VIDEO_MODE_AUTO 3 + __u16 signal; /* Signal strength 16bit scale */ +}; + +struct video_picture +{ + __u16 brightness; + __u16 hue; + __u16 colour; + __u16 contrast; + __u16 whiteness; /* Black and white only */ + __u16 depth; /* Capture depth */ + __u16 palette; /* Palette in use */ +#define VIDEO_PALETTE_GREY 1 /* Linear greyscale */ +#define VIDEO_PALETTE_HI240 2 /* High 240 cube (BT848) */ +#define VIDEO_PALETTE_RGB565 3 /* 565 16 bit RGB */ +#define VIDEO_PALETTE_RGB24 4 /* 24bit RGB */ +#define VIDEO_PALETTE_RGB32 5 /* 32bit RGB */ +#define VIDEO_PALETTE_RGB555 6 /* 555 15bit RGB */ +#define VIDEO_PALETTE_YUV422 7 /* YUV422 capture */ +#define VIDEO_PALETTE_YUYV 8 +#define VIDEO_PALETTE_UYVY 9 /* The great thing about standards is ... */ +#define VIDEO_PALETTE_YUV420 10 +#define VIDEO_PALETTE_YUV411 11 /* YUV411 capture */ +#define VIDEO_PALETTE_RAW 12 /* RAW capture (BT848) */ +#define VIDEO_PALETTE_YUV422P 13 /* YUV 4:2:2 Planar */ +#define VIDEO_PALETTE_YUV411P 14 /* YUV 4:1:1 Planar */ +#define VIDEO_PALETTE_YUV420P 15 /* YUV 4:2:0 Planar */ +#define VIDEO_PALETTE_YUV410P 16 /* YUV 4:1:0 Planar */ +#define VIDEO_PALETTE_PLANAR 13 /* start of planar entries */ +#define VIDEO_PALETTE_COMPONENT 7 /* start of component entries */ +}; + +struct video_audio +{ + int audio; /* Audio channel */ + __u16 volume; /* If settable */ + __u16 bass, treble; + __u32 flags; +#define VIDEO_AUDIO_MUTE 1 +#define VIDEO_AUDIO_MUTABLE 2 +#define VIDEO_AUDIO_VOLUME 4 +#define VIDEO_AUDIO_BASS 8 +#define VIDEO_AUDIO_TREBLE 16 +#define VIDEO_AUDIO_BALANCE 32 + char name[16]; +#define VIDEO_SOUND_MONO 1 +#define VIDEO_SOUND_STEREO 2 +#define VIDEO_SOUND_LANG1 4 +#define VIDEO_SOUND_LANG2 8 + __u16 mode; + __u16 balance; /* Stereo balance */ + __u16 step; /* Step actual volume uses */ +}; + +struct video_clip +{ + __s32 x,y; + __s32 width, height; + struct video_clip *next; /* For user use/driver use only */ +}; + +struct video_window +{ + __u32 x,y; /* Position of window */ + __u32 width,height; /* Its size */ + __u32 chromakey; + __u32 flags; + struct video_clip *clips; /* Set only */ + int clipcount; +#define VIDEO_WINDOW_INTERLACE 1 +#define VIDEO_WINDOW_CHROMAKEY 16 /* Overlay by chromakey */ +#define VIDEO_CLIP_BITMAP -1 +/* bitmap is 1024x625, a '1' bit represents a clipped pixel */ +#define VIDEO_CLIPMAP_SIZE (128 * 625) +}; + +struct video_capture +{ + __u32 x,y; /* Offsets into image */ + __u32 width, height; /* Area to capture */ + __u16 decimation; /* Decimation divider */ + __u16 flags; /* Flags for capture */ +#define VIDEO_CAPTURE_ODD 0 /* Temporal */ +#define VIDEO_CAPTURE_EVEN 1 +}; + +struct video_buffer +{ + void *base; + int height,width; + int depth; + int bytesperline; +}; + +struct video_mmap +{ + unsigned int frame; /* Frame (0 - n) for double buffer */ + int height,width; + unsigned int format; /* should be VIDEO_PALETTE_* */ +}; + +struct video_key +{ + __u8 key[8]; + __u32 flags; +}; + +#define VIDEO_MAX_FRAME 32 + +struct video_mbuf +{ + int size; /* Total memory to map */ + int frames; /* Frames */ + int offsets[VIDEO_MAX_FRAME]; +}; + +#define VIDEO_NO_UNIT (-1) + +struct video_unit +{ + int video; /* Video minor */ + int vbi; /* VBI minor */ + int radio; /* Radio minor */ + int audio; /* Audio minor */ + int teletext; /* Teletext minor */ +}; + +struct vbi_format { + __u32 sampling_rate; /* in Hz */ + __u32 samples_per_line; + __u32 sample_format; /* VIDEO_PALETTE_RAW only (1 byte) */ + __s32 start[2]; /* starting line for each frame */ + __u32 count[2]; /* count of lines for each frame */ + __u32 flags; +#define VBI_UNSYNC 1 /* can distingues between top/bottom field */ +#define VBI_INTERLACED 2 /* lines are interlaced */ +}; + +/* video_info is biased towards hardware mpeg encode/decode */ +/* but it could apply generically to any hardware compressor/decompressor */ +struct video_info +{ + __u32 frame_count; /* frames output since decode/encode began */ + __u32 h_size; /* current unscaled horizontal size */ + __u32 v_size; /* current unscaled veritcal size */ + __u32 smpte_timecode; /* current SMPTE timecode (for current GOP) */ + __u32 picture_type; /* current picture type */ + __u32 temporal_reference; /* current temporal reference */ + __u8 user_data[256]; /* user data last found in compressed stream */ + /* user_data[0] contains user data flags, user_data[1] has count */ +}; + +/* generic structure for setting playback modes */ +struct video_play_mode +{ + int mode; + int p1; + int p2; +}; + +/* for loading microcode / fpga programming */ +struct video_code +{ + char loadwhat[16]; /* name or tag of file being passed */ + int datasize; + __u8 *data; +}; + +#define VIDIOCGCAP _IOR('v',1,struct video_capability) /* Get capabilities */ +#define VIDIOCGCHAN _IOWR('v',2,struct video_channel) /* Get channel info (sources) */ +#define VIDIOCSCHAN _IOW('v',3,struct video_channel) /* Set channel */ +#define VIDIOCGTUNER _IOWR('v',4,struct video_tuner) /* Get tuner abilities */ +#define VIDIOCSTUNER _IOW('v',5,struct video_tuner) /* Tune the tuner for the current channel */ +#define VIDIOCGPICT _IOR('v',6,struct video_picture) /* Get picture properties */ +#define VIDIOCSPICT _IOW('v',7,struct video_picture) /* Set picture properties */ +#define VIDIOCCAPTURE _IOW('v',8,int) /* Start, end capture */ +#define VIDIOCGWIN _IOR('v',9, struct video_window) /* Get the video overlay window */ +#define VIDIOCSWIN _IOW('v',10, struct video_window) /* Set the video overlay window - passes clip list for hardware smarts , chromakey etc */ +#define VIDIOCGFBUF _IOR('v',11, struct video_buffer) /* Get frame buffer */ +#define VIDIOCSFBUF _IOW('v',12, struct video_buffer) /* Set frame buffer - root only */ +#define VIDIOCKEY _IOR('v',13, struct video_key) /* Video key event - to dev 255 is to all - cuts capture on all DMA windows with this key (0xFFFFFFFF == all) */ +#define VIDIOCGFREQ _IOR('v',14, unsigned long) /* Set tuner */ +#define VIDIOCSFREQ _IOW('v',15, unsigned long) /* Set tuner */ +#define VIDIOCGAUDIO _IOR('v',16, struct video_audio) /* Get audio info */ +#define VIDIOCSAUDIO _IOW('v',17, struct video_audio) /* Audio source, mute etc */ +#define VIDIOCSYNC _IOW('v',18, int) /* Sync with mmap grabbing */ +#define VIDIOCMCAPTURE _IOW('v',19, struct video_mmap) /* Grab frames */ +#define VIDIOCGMBUF _IOR('v',20, struct video_mbuf) /* Memory map buffer info */ +#define VIDIOCGUNIT _IOR('v',21, struct video_unit) /* Get attached units */ +#define VIDIOCGCAPTURE _IOR('v',22, struct video_capture) /* Get subcapture */ +#define VIDIOCSCAPTURE _IOW('v',23, struct video_capture) /* Set subcapture */ +#define VIDIOCSPLAYMODE _IOW('v',24, struct video_play_mode) /* Set output video mode/feature */ +#define VIDIOCSWRITEMODE _IOW('v',25, int) /* Set write mode */ +#define VIDIOCGPLAYINFO _IOR('v',26, struct video_info) /* Get current playback info from hardware */ +#define VIDIOCSMICROCODE _IOW('v',27, struct video_code) /* Load microcode into hardware */ +#define VIDIOCGVBIFMT _IOR('v',28, struct vbi_format) /* Get VBI information */ +#define VIDIOCSVBIFMT _IOW('v',29, struct vbi_format) /* Set VBI information */ + + +#define BASE_VIDIOCPRIVATE 192 /* 192-255 are private */ + +/* VIDIOCSWRITEMODE */ +#define VID_WRITE_MPEG_AUD 0 +#define VID_WRITE_MPEG_VID 1 +#define VID_WRITE_OSD 2 +#define VID_WRITE_TTX 3 +#define VID_WRITE_CC 4 +#define VID_WRITE_MJPEG 5 + +/* VIDIOCSPLAYMODE */ +#define VID_PLAY_VID_OUT_MODE 0 + /* p1: = VIDEO_MODE_PAL, VIDEO_MODE_NTSC, etc ... */ +#define VID_PLAY_GENLOCK 1 + /* p1: 0 = OFF, 1 = ON */ + /* p2: GENLOCK FINE DELAY value */ +#define VID_PLAY_NORMAL 2 +#define VID_PLAY_PAUSE 3 +#define VID_PLAY_SINGLE_FRAME 4 +#define VID_PLAY_FAST_FORWARD 5 +#define VID_PLAY_SLOW_MOTION 6 +#define VID_PLAY_IMMEDIATE_NORMAL 7 +#define VID_PLAY_SWITCH_CHANNELS 8 +#define VID_PLAY_FREEZE_FRAME 9 +#define VID_PLAY_STILL_MODE 10 +#define VID_PLAY_MASTER_MODE 11 + /* p1: see below */ +#define VID_PLAY_MASTER_NONE 1 +#define VID_PLAY_MASTER_VIDEO 2 +#define VID_PLAY_MASTER_AUDIO 3 +#define VID_PLAY_ACTIVE_SCANLINES 12 + /* p1 = first active; p2 = last active */ +#define VID_PLAY_RESET 13 +#define VID_PLAY_END_MARK 14 + + + +#define VID_HARDWARE_BT848 1 +#define VID_HARDWARE_QCAM_BW 2 +#define VID_HARDWARE_PMS 3 +#define VID_HARDWARE_QCAM_C 4 +#define VID_HARDWARE_PSEUDO 5 +#define VID_HARDWARE_SAA5249 6 +#define VID_HARDWARE_AZTECH 7 +#define VID_HARDWARE_SF16MI 8 +#define VID_HARDWARE_RTRACK 9 +#define VID_HARDWARE_ZOLTRIX 10 +#define VID_HARDWARE_SAA7146 11 +#define VID_HARDWARE_VIDEUM 12 /* Reserved for Winnov videum */ +#define VID_HARDWARE_RTRACK2 13 +#define VID_HARDWARE_PERMEDIA2 14 /* Reserved for Permedia2 */ +#define VID_HARDWARE_RIVA128 15 /* Reserved for RIVA 128 */ +#define VID_HARDWARE_PLANB 16 /* PowerMac motherboard video-in */ +#define VID_HARDWARE_BROADWAY 17 /* Broadway project */ +#define VID_HARDWARE_GEMTEK 18 +#define VID_HARDWARE_TYPHOON 19 +#define VID_HARDWARE_VINO 20 /* SGI Indy Vino */ +#define VID_HARDWARE_CADET 21 /* Cadet radio */ +#define VID_HARDWARE_TRUST 22 /* Trust FM Radio */ +#define VID_HARDWARE_TERRATEC 23 /* TerraTec ActiveRadio */ +#define VID_HARDWARE_CPIA 24 +#define VID_HARDWARE_ZR36120 25 /* Zoran ZR36120/ZR36125 */ +#define VID_HARDWARE_ZR36067 26 /* Zoran ZR36067/36060 */ +#define VID_HARDWARE_OV511 27 +#define VID_HARDWARE_ZR356700 28 /* Zoran 36700 series */ +#define VID_HARDWARE_W9966 29 +#define VID_HARDWARE_SE401 30 /* SE401 USB webcams */ +#define VID_HARDWARE_PWC 31 /* Philips webcams */ +#define VID_HARDWARE_MEYE 32 /* Sony Vaio MotionEye cameras */ +#define VID_HARDWARE_CPIA2 33 +#define VID_HARDWARE_VICAM 34 +#define VID_HARDWARE_SF16FMR2 35 +#define VID_HARDWARE_W9968CF 36 +#define VID_HARDWARE_SAA7114H 37 +#define VID_HARDWARE_SN9C102 38 +#define VID_HARDWARE_ARV 39 +#endif /* __LINUX_VIDEODEV_H */ + +/* + * Local variables: + * c-basic-offset: 8 + * End: + */ diff --git a/sys/compat/linux/linux_videodev_compat.h b/sys/compat/linux/linux_videodev_compat.h new file mode 100644 index 000000000000..98034bcbb04d --- /dev/null +++ b/sys/compat/linux/linux_videodev_compat.h @@ -0,0 +1,59 @@ +/* + * $FreeBSD$ + */ + +/* + * This file defines compatibility versions of several video structures + * defined in the Linux videodev.h header (linux_videodev.h). The + * structures defined in this file are the ones that have been determined + * to have 32- to 64-bit size dependencies. + */ + +#ifndef _LINUX_VIDEODEV_COMPAT_H_ +#define _LINUX_VIDEODEV_COMPAT_H_ + +struct l_video_tuner +{ + l_int tuner; +#define LINUX_VIDEO_TUNER_NAME_SIZE 32 + char name[LINUX_VIDEO_TUNER_NAME_SIZE]; + l_ulong rangelow, rangehigh; + uint32_t flags; + uint16_t mode; + uint16_t signal; +}; + +struct l_video_clip +{ + int32_t x, y; + int32_t width, height; + l_uintptr_t next; +}; + +struct l_video_window +{ + uint32_t x, y; + uint32_t width, height; + uint32_t chromakey; + uint32_t flags; + l_uintptr_t clips; + l_int clipcount; +}; + +struct l_video_buffer +{ + l_uintptr_t base; + l_int height, width; + l_int depth; + l_int bytesperline; +}; + +struct l_video_code +{ +#define LINUX_VIDEO_CODE_LOADWHAT_SIZE 16 + char loadwhat[LINUX_VIDEO_CODE_LOADWHAT_SIZE]; + l_int datasize; + l_uintptr_t data; +}; + +#endif /* !_LINUX_VIDEODEV_COMPAT_H_ */ diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c index 189388948493..62bb465899df 100644 --- a/sys/compat/ndis/kern_ndis.c +++ b/sys/compat/ndis/kern_ndis.c @@ -184,7 +184,7 @@ ndis_modevent(module_t mod, int cmd, void *arg) break; } - return(error); + return (error); } DEV_MODULE(ndisapi, ndis_modevent, NULL); MODULE_VERSION(ndisapi, 1); @@ -193,7 +193,6 @@ static void ndis_sendrsrcavail_func(adapter) ndis_handle adapter; { - return; } static void @@ -211,8 +210,7 @@ ndis_status_func(adapter, status, sbuf, slen) sc = device_get_softc(block->nmb_physdeviceobj->do_devext); ifp = sc->ifp; if (ifp->if_flags & IFF_DEBUG) - device_printf (sc->ndis_dev, "status: %x\n", status); - return; + device_printf(sc->ndis_dev, "status: %x\n", status); } static void @@ -227,8 +225,7 @@ ndis_statusdone_func(adapter) sc = device_get_softc(block->nmb_physdeviceobj->do_devext); ifp = sc->ifp; if (ifp->if_flags & IFF_DEBUG) - device_printf (sc->ndis_dev, "status complete\n"); - return; + device_printf(sc->ndis_dev, "status complete\n"); } static void @@ -241,7 +238,6 @@ ndis_setdone_func(adapter, status) block->nmb_setstat = status; KeSetEvent(&block->nmb_setevent, IO_NO_INCREMENT, FALSE); - return; } static void @@ -254,7 +250,6 @@ ndis_getdone_func(adapter, status) block->nmb_getstat = status; KeSetEvent(&block->nmb_getevent, IO_NO_INCREMENT, FALSE); - return; } static void @@ -270,10 +265,8 @@ ndis_resetdone_func(ndis_handle adapter, ndis_status status, ifp = sc->ifp; if (ifp->if_flags & IFF_DEBUG) - device_printf (sc->ndis_dev, "reset done...\n"); + device_printf(sc->ndis_dev, "reset done...\n"); KeSetEvent(&block->nmb_resetevent, IO_NO_INCREMENT, FALSE); - - return; } int @@ -287,7 +280,7 @@ ndis_create_sysctls(arg) struct sysctl_ctx_entry *e; if (arg == NULL) - return(EINVAL); + return (EINVAL); sc = arg; vals = sc->ndis_regvals; @@ -367,7 +360,7 @@ ndis_create_sysctls(arg) "Interrupt Number", buf, CTLFLAG_RD); } - return(0); + return (0); } int @@ -388,7 +381,7 @@ ndis_add_sysctl(arg, key, desc, val, flag) if (cfg == NULL) { printf("failed for %s\n", key); - return(ENOMEM); + return (ENOMEM); } cfg->ndis_cfg.nc_cfgkey = strdup(key, M_DEVBUF); @@ -415,7 +408,7 @@ ndis_add_sysctl(arg, key, desc, val, flag) cfg->ndis_cfg.nc_cfgdesc); #endif - return(0); + return (0); } /* @@ -451,7 +444,7 @@ ndis_flush_sysctls(arg) free(cfg, M_DEVBUF); } - return(0); + return (0); } static void @@ -488,8 +481,6 @@ ndis_return(dobj, arg) KeAcquireSpinLock(&block->nmb_returnlock, &irql); } KeReleaseSpinLock(&block->nmb_returnlock, irql); - - return; } void @@ -522,8 +513,6 @@ ndis_return_packet(buf, arg) IoQueueWorkItem(block->nmb_returnitem, (io_workitem_func)kernndis_functbl[7].ipt_wrap, WORKQUEUE_CRITICAL, block); - - return; } void @@ -540,8 +529,6 @@ ndis_free_bufs(b0) IoFreeMdl(b0); b0 = next; } - - return; } void @@ -553,7 +540,6 @@ ndis_free_packet(p) ndis_free_bufs(p->np_private.npp_head); NdisFreePacket(p); - return; } int @@ -567,26 +553,18 @@ ndis_convert_res(arg) device_t dev; struct resource_list *brl; struct resource_list_entry *brle; -#if __FreeBSD_version < 600022 - struct resource_list brl_rev; - struct resource_list_entry *n; -#endif int error = 0; sc = arg; block = sc->ndis_block; dev = sc->ndis_dev; -#if __FreeBSD_version < 600022 - SLIST_INIT(&brl_rev); -#endif - rl = malloc(sizeof(ndis_resource_list) + (sizeof(cm_partial_resource_desc) * (sc->ndis_rescnt - 1)), M_DEVBUF, M_NOWAIT|M_ZERO); if (rl == NULL) - return(ENOMEM); + return (ENOMEM); rl->cprl_version = 5; rl->cprl_version = 1; @@ -597,37 +575,7 @@ ndis_convert_res(arg) if (brl != NULL) { -#if __FreeBSD_version < 600022 - /* - * We have a small problem. Some PCI devices have - * multiple I/O ranges. Windows orders them starting - * from lowest numbered BAR to highest. We discover - * them in that order too, but insert them into a singly - * linked list head first, which means when time comes - * to traverse the list, we enumerate them in reverse - * order. This screws up some drivers which expect the - * BARs to be in ascending order so that they can choose - * the "first" one as their register space. Unfortunately, - * in order to fix this, we have to create our own - * temporary list with the entries in reverse order. - */ - - SLIST_FOREACH(brle, brl, link) { - n = malloc(sizeof(struct resource_list_entry), - M_TEMP, M_NOWAIT); - if (n == NULL) { - error = ENOMEM; - goto bad; - } - bcopy((char *)brle, (char *)n, - sizeof(struct resource_list_entry)); - SLIST_INSERT_HEAD(&brl_rev, n, link); - } - - SLIST_FOREACH(brle, &brl_rev, link) { -#else STAILQ_FOREACH(brle, brl, link) { -#endif switch (brle->type) { case SYS_RES_IOPORT: prd->cprd_type = CmResourceTypePort; @@ -671,17 +619,7 @@ ndis_convert_res(arg) block->nmb_rlist = rl; -#if __FreeBSD_version < 600022 -bad: - - while (!SLIST_EMPTY(&brl_rev)) { - n = SLIST_FIRST(&brl_rev); - SLIST_REMOVE_HEAD(&brl_rev, link); - free (n, M_TEMP); - } -#endif - - return(error); + return (error); } /* @@ -711,7 +649,7 @@ ndis_ptom(m0, p) int diff; if (p == NULL || m0 == NULL) - return(EINVAL); + return (EINVAL); priv = &p->np_private; buf = priv->npp_head; @@ -729,7 +667,7 @@ ndis_ptom(m0, p) if (m == NULL) { m_freem(*m0); *m0 = NULL; - return(ENOBUFS); + return (ENOBUFS); } m->m_len = MmGetMdlByteCount(buf); m->m_data = MmGetMdlVirtualAddress(buf); @@ -765,7 +703,7 @@ ndis_ptom(m0, p) } (*m0)->m_pkthdr.len = totlen; - return(0); + return (0); } /* @@ -793,7 +731,7 @@ ndis_mtop(m0, p) ndis_packet_private *priv; if (p == NULL || *p == NULL || m0 == NULL) - return(EINVAL); + return (EINVAL); priv = &(*p)->np_private; priv->npp_totlen = m0->m_pkthdr.len; @@ -805,7 +743,7 @@ ndis_mtop(m0, p) if (buf == NULL) { ndis_free_packet(*p); *p = NULL; - return(ENOMEM); + return (ENOMEM); } MmBuildMdlForNonPagedPool(buf); @@ -818,7 +756,7 @@ ndis_mtop(m0, p) priv->npp_tail = buf; - return(0); + return (0); } int @@ -831,25 +769,25 @@ ndis_get_supported_oids(arg, oids, oidcnt) ndis_oid *o; if (arg == NULL || oids == NULL || oidcnt == NULL) - return(EINVAL); + return (EINVAL); len = 0; ndis_get_info(arg, OID_GEN_SUPPORTED_LIST, NULL, &len); o = malloc(len, M_DEVBUF, M_NOWAIT); if (o == NULL) - return(ENOMEM); + return (ENOMEM); rval = ndis_get_info(arg, OID_GEN_SUPPORTED_LIST, o, &len); if (rval) { free(o, M_DEVBUF); - return(rval); + return (rval); } *oids = o; *oidcnt = len / 4; - return(0); + return (0); } int @@ -893,7 +831,7 @@ ndis_set_info(arg, oid, buf, buflen) sc->ndis_block->nmb_devicectx == NULL) { sc->ndis_block->nmb_pendingreq = NULL; KeReleaseSpinLock(&sc->ndis_block->nmb_lock, irql); - return(ENXIO); + return (ENXIO); } rval = MSCALL6(setfunc, adapter, oid, buf, *buflen, @@ -917,19 +855,19 @@ ndis_set_info(arg, oid, buf, buflen) *buflen = bytesneeded; if (rval == NDIS_STATUS_INVALID_LENGTH) - return(ENOSPC); + return (ENOSPC); if (rval == NDIS_STATUS_INVALID_OID) - return(EINVAL); + return (EINVAL); if (rval == NDIS_STATUS_NOT_SUPPORTED || rval == NDIS_STATUS_NOT_ACCEPTED) - return(ENOTSUP); + return (ENOTSUP); if (rval != NDIS_STATUS_SUCCESS) - return(ENODEV); + return (ENODEV); - return(0); + return (0); } typedef void (*ndis_senddone_func)(ndis_handle, ndis_packet *, ndis_status); @@ -951,7 +889,7 @@ ndis_send_packets(arg, packets, cnt) sc = arg; adapter = sc->ndis_block->nmb_miniportadapterctx; if (adapter == NULL) - return(ENXIO); + return (ENXIO); sendfunc = sc->ndis_chars->nmc_sendmulti_func; senddonefunc = sc->ndis_block->nmb_senddone_func; @@ -976,7 +914,7 @@ ndis_send_packets(arg, packets, cnt) if (NDIS_SERIALIZED(sc->ndis_block)) KeReleaseSpinLock(&sc->ndis_block->nmb_lock, irql); - return(0); + return (0); } int @@ -994,7 +932,7 @@ ndis_send_packet(arg, packet) sc = arg; adapter = sc->ndis_block->nmb_miniportadapterctx; if (adapter == NULL) - return(ENXIO); + return (ENXIO); sendfunc = sc->ndis_chars->nmc_sendsingle_func; senddonefunc = sc->ndis_block->nmb_senddone_func; @@ -1006,7 +944,7 @@ ndis_send_packet(arg, packet) if (status == NDIS_STATUS_PENDING) { if (NDIS_SERIALIZED(sc->ndis_block)) KeReleaseSpinLock(&sc->ndis_block->nmb_lock, irql); - return(0); + return (0); } MSCALL3(senddonefunc, sc->ndis_block, packet, status); @@ -1014,7 +952,7 @@ ndis_send_packet(arg, packet) if (NDIS_SERIALIZED(sc->ndis_block)) KeReleaseSpinLock(&sc->ndis_block->nmb_lock, irql); - return(0); + return (0); } int @@ -1030,18 +968,18 @@ ndis_init_dma(arg) M_DEVBUF, M_NOWAIT|M_ZERO); if (sc->ndis_tmaps == NULL) - return(ENOMEM); + return (ENOMEM); for (i = 0; i < sc->ndis_maxpkts; i++) { error = bus_dmamap_create(sc->ndis_ttag, 0, &sc->ndis_tmaps[i]); if (error) { free(sc->ndis_tmaps, M_DEVBUF); - return(ENODEV); + return (ENODEV); } } - return(0); + return (0); } int @@ -1070,7 +1008,7 @@ ndis_destroy_dma(arg) bus_dma_tag_destroy(sc->ndis_ttag); - return(0); + return (0); } int @@ -1093,7 +1031,7 @@ ndis_reset_nic(arg) if (adapter == NULL || resetfunc == NULL || sc->ndis_block->nmb_devicectx == NULL) { NDIS_UNLOCK(sc); - return(EIO); + return (EIO); } NDIS_UNLOCK(sc); @@ -1112,7 +1050,7 @@ ndis_reset_nic(arg) KeWaitForSingleObject(&sc->ndis_block->nmb_resetevent, 0, 0, FALSE, NULL); - return(0); + return (0); } int @@ -1149,7 +1087,7 @@ ndis_halt_nic(arg) adapter = sc->ndis_block->nmb_miniportadapterctx; if (adapter == NULL) { NDIS_UNLOCK(sc); - return(EIO); + return (EIO); } sc->ndis_block->nmb_devicectx = NULL; @@ -1169,7 +1107,7 @@ ndis_halt_nic(arg) sc->ndis_block->nmb_miniportadapterctx = NULL; NDIS_UNLOCK(sc); - return(0); + return (0); } int @@ -1186,7 +1124,7 @@ ndis_shutdown_nic(arg) shutdownfunc = sc->ndis_chars->nmc_shutdown_handler; NDIS_UNLOCK(sc); if (adapter == NULL || shutdownfunc == NULL) - return(EIO); + return (EIO); if (sc->ndis_chars->nmc_rsvd0 == NULL) MSCALL1(shutdownfunc, adapter); @@ -1195,7 +1133,7 @@ ndis_shutdown_nic(arg) TAILQ_REMOVE(&ndis_devhead, sc->ndis_block, link); - return(0); + return (0); } int @@ -1215,7 +1153,7 @@ ndis_pnpevent_nic(arg, type) pnpeventfunc = sc->ndis_chars->nmc_pnpevent_handler; NDIS_UNLOCK(sc); if (adapter == NULL || pnpeventfunc == NULL) - return(EIO); + return (EIO); if (sc->ndis_chars->nmc_rsvd0 == NULL) MSCALL4(pnpeventfunc, adapter, type, NULL, 0); @@ -1237,7 +1175,7 @@ ndis_init_nic(arg) uint32_t chosenmedium, i; if (arg == NULL) - return(EINVAL); + return (EINVAL); sc = arg; NDIS_LOCK(sc); @@ -1262,7 +1200,7 @@ ndis_init_nic(arg) NDIS_LOCK(sc); sc->ndis_block->nmb_miniportadapterctx = NULL; NDIS_UNLOCK(sc); - return(ENXIO); + return (ENXIO); } /* @@ -1281,7 +1219,7 @@ ndis_init_nic(arg) sc->ndis_block->nmb_devicectx = sc; NDIS_UNLOCK(sc); - return(0); + return (0); } static void @@ -1305,8 +1243,6 @@ ndis_intrsetup(dpc, dobj, ip, sc) if (KeInsertQueueDpc(&intr->ni_dpc, NULL, NULL) == TRUE) intr->ni_dpccnt++; KeReleaseSpinLockFromDpcLevel(&intr->ni_dpccountlock); - - return; } int @@ -1343,7 +1279,7 @@ ndis_get_info(arg, oid, buf, buflen) sc->ndis_block->nmb_devicectx == NULL) { sc->ndis_block->nmb_pendingreq = NULL; KeReleaseSpinLock(&sc->ndis_block->nmb_lock, irql); - return(ENXIO); + return (ENXIO); } rval = MSCALL6(queryfunc, adapter, oid, buf, *buflen, @@ -1370,19 +1306,19 @@ ndis_get_info(arg, oid, buf, buflen) if (rval == NDIS_STATUS_INVALID_LENGTH || rval == NDIS_STATUS_BUFFER_TOO_SHORT) - return(ENOSPC); + return (ENOSPC); if (rval == NDIS_STATUS_INVALID_OID) - return(EINVAL); + return (EINVAL); if (rval == NDIS_STATUS_NOT_SUPPORTED || rval == NDIS_STATUS_NOT_ACCEPTED) - return(ENOTSUP); + return (ENOTSUP); if (rval != NDIS_STATUS_SUCCESS) - return(ENODEV); + return (ENODEV); - return(0); + return (0); } uint32_t @@ -1403,14 +1339,14 @@ NdisAddDevice(drv, pdo) INTR_TYPE_NET | INTR_MPSAFE, NULL, ntoskrnl_intr, NULL, &sc->ndis_intrhand); if (error) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); } status = IoCreateDevice(drv, sizeof(ndis_miniport_block), NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo); if (status != STATUS_SUCCESS) - return(status); + return (status); block = fdo->do_devext; @@ -1446,7 +1382,7 @@ NdisAddDevice(drv, pdo) if (status != NDIS_STATUS_SUCCESS) { IoDetachDevice(block->nmb_nextdeviceobj); IoDeleteDevice(fdo); - return(status); + return (status); } InitializeListHead((&block->nmb_packetlist)); } @@ -1498,5 +1434,5 @@ ndis_unload_driver(arg) IoDetachDevice(sc->ndis_block->nmb_nextdeviceobj); IoDeleteDevice(fdo); - return(0); + return (0); } diff --git a/sys/compat/ndis/kern_windrv.c b/sys/compat/ndis/kern_windrv.c index 1d4f76c93f5f..f231863e8887 100644 --- a/sys/compat/ndis/kern_windrv.c +++ b/sys/compat/ndis/kern_windrv.c @@ -123,7 +123,7 @@ windrv_libinit(void) panic("failed to allocate thread info blocks"); smp_rendezvous(NULL, x86_newldt, NULL, NULL); #endif - return(0); + return (0); } int @@ -148,7 +148,7 @@ windrv_libfini(void) smp_rendezvous(NULL, x86_oldldt, NULL, NULL); ExFreePool(my_tids); #endif - return(0); + return (0); } /* @@ -172,7 +172,7 @@ windrv_lookup(img, name) if (name != NULL) { RtlInitAnsiString(&as, name); if (RtlAnsiStringToUnicodeString(&us, &as, TRUE)) - return(NULL); + return (NULL); } mtx_lock(&drvdb_mtx); @@ -183,7 +183,7 @@ windrv_lookup(img, name) mtx_unlock(&drvdb_mtx); if (name != NULL) ExFreePool(us.us_buf); - return(d->windrv_object); + return (d->windrv_object); } } mtx_unlock(&drvdb_mtx); @@ -191,7 +191,7 @@ windrv_lookup(img, name) if (name != NULL) RtlFreeUnicodeString(&us); - return(NULL); + return (NULL); } struct drvdb_ent * @@ -209,12 +209,12 @@ windrv_match(matchfunc, ctx) match = matchfunc(d->windrv_bustype, d->windrv_devlist, ctx); if (match == TRUE) { mtx_unlock(&drvdb_mtx); - return(d); + return (d); } } mtx_unlock(&drvdb_mtx); - return(NULL); + return (NULL); } /* @@ -283,7 +283,7 @@ windrv_unload(mod, img, len) return (ENOENT); if (drv == NULL) - return(ENOENT); + return (ENOENT); /* * Destroy any custom extensions that may have been added. @@ -306,7 +306,7 @@ windrv_unload(mod, img, len) /* Free our DB handle */ free(r, M_DEVBUF); - return(0); + return (0); } #define WINDRV_LOADED htonl(0x42534F44) @@ -345,28 +345,28 @@ windrv_load(mod, img, len, bustype, devlist, regvals) /* Perform text relocation */ if (pe_relocate(img)) - return(ENOEXEC); + return (ENOEXEC); /* Dynamically link the NDIS.SYS routines -- required. */ if (pe_patch_imports(img, "NDIS", ndis_functbl)) - return(ENOEXEC); + return (ENOEXEC); /* Dynamically link the HAL.dll routines -- optional. */ if (pe_get_import_descriptor(img, &imp_desc, "HAL") == 0) { if (pe_patch_imports(img, "HAL", hal_functbl)) - return(ENOEXEC); + return (ENOEXEC); } /* Dynamically link ntoskrnl.exe -- optional. */ if (pe_get_import_descriptor(img, &imp_desc, "ntoskrnl") == 0) { if (pe_patch_imports(img, "ntoskrnl", ntoskrnl_functbl)) - return(ENOEXEC); + return (ENOEXEC); } /* Dynamically link USBD.SYS -- optional */ if (pe_get_import_descriptor(img, &imp_desc, "USBD") == 0) { if (pe_patch_imports(img, "USBD", usbd_functbl)) - return(ENOEXEC); + return (ENOEXEC); } *ptr = WINDRV_LOADED; @@ -398,7 +398,7 @@ skipreloc: if (drv->dro_driverext == NULL) { free(new, M_DEVBUF); free(drv, M_DEVBUF); - return(ENOMEM); + return (ENOMEM); } InitializeListHead((&drv->dro_driverext->dre_usrext)); @@ -410,7 +410,7 @@ skipreloc: if (RtlAnsiStringToUnicodeString(&drv->dro_drivername, &as, TRUE)) { free(new, M_DEVBUF); free(drv, M_DEVBUF); - return(ENOMEM); + return (ENOMEM); } new->windrv_object = drv; @@ -426,7 +426,7 @@ skipreloc: RtlFreeUnicodeString(&drv->dro_drivername); free(drv, M_DEVBUF); free(new, M_DEVBUF); - return(ENODEV); + return (ENODEV); } mtx_lock(&drvdb_mtx); @@ -463,7 +463,7 @@ windrv_create_pdo(drv, bsddev) dev->do_devext = bsddev; - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } void @@ -482,8 +482,6 @@ windrv_destroy_pdo(drv, bsddev) mtx_lock(&drvdb_mtx); IoDeleteDevice(pdo); mtx_unlock(&drvdb_mtx); - - return; } /* @@ -503,13 +501,13 @@ windrv_find_pdo(drv, bsddev) while (pdo != NULL) { if (pdo->do_devext == bsddev) { mtx_unlock(&drvdb_mtx); - return(pdo); + return (pdo); } pdo = pdo->do_nextdev; } mtx_unlock(&drvdb_mtx); - return(NULL); + return (NULL); } /* @@ -533,7 +531,7 @@ windrv_bus_attach(drv, name) if (RtlAnsiStringToUnicodeString(&drv->dro_drivername, &as, TRUE)) { free(new, M_DEVBUF); - return(ENOMEM); + return (ENOMEM); } /* @@ -550,7 +548,7 @@ windrv_bus_attach(drv, name) STAILQ_INSERT_HEAD(&drvdb_head, new, link); mtx_unlock(&drvdb_mtx); - return(0); + return (0); } #ifdef __amd64__ @@ -578,7 +576,7 @@ windrv_wrap(func, wrap, argcnt, ftype) p = malloc((wrapend - wrapstart), M_DEVBUF, M_NOWAIT); if (p == NULL) - return(ENOMEM); + return (ENOMEM); /* Copy over the code. */ @@ -591,7 +589,7 @@ windrv_wrap(func, wrap, argcnt, ftype) *wrap = p; - return(0); + return (0); } #endif /* __amd64__ */ @@ -695,8 +693,6 @@ ctxsw_utow(void) x86_critical_exit(); /* Now entering Windows land, population: you. */ - - return; } /* @@ -722,7 +718,6 @@ ctxsw_wtou(void) if (t->tid_cpu != curthread->td_oncpu) panic("ctxsw GOT MOVED TO OTHER CPU!"); #endif - return; } static int windrv_wrap_stdcall(funcptr, funcptr *, int); @@ -754,7 +749,7 @@ windrv_wrap_fastcall(func, wrap, argcnt) p = malloc((wrapend - wrapstart), M_DEVBUF, M_NOWAIT); if (p == NULL) - return(ENOMEM); + return (ENOMEM); /* Copy over the code. */ @@ -774,7 +769,7 @@ windrv_wrap_fastcall(func, wrap, argcnt) *wrap = p; - return(0); + return (0); } extern void x86_stdcall_wrap(void); @@ -802,7 +797,7 @@ windrv_wrap_stdcall(func, wrap, argcnt) p = malloc((wrapend - wrapstart), M_DEVBUF, M_NOWAIT); if (p == NULL) - return(ENOMEM); + return (ENOMEM); /* Copy over the code. */ @@ -818,7 +813,7 @@ windrv_wrap_stdcall(func, wrap, argcnt) *wrap = p; - return(0); + return (0); } extern void x86_regparm_wrap(void); @@ -842,7 +837,7 @@ windrv_wrap_regparm(func, wrap) p = malloc((wrapend - wrapstart), M_DEVBUF, M_NOWAIT); if (p == NULL) - return(ENOMEM); + return (ENOMEM); /* Copy over the code. */ @@ -855,7 +850,7 @@ windrv_wrap_regparm(func, wrap) *wrap = p; - return(0); + return (0); } int @@ -867,18 +862,18 @@ windrv_wrap(func, wrap, argcnt, ftype) { switch(ftype) { case WINDRV_WRAP_FASTCALL: - return(windrv_wrap_fastcall(func, wrap, argcnt)); + return (windrv_wrap_fastcall(func, wrap, argcnt)); case WINDRV_WRAP_STDCALL: - return(windrv_wrap_stdcall(func, wrap, argcnt)); + return (windrv_wrap_stdcall(func, wrap, argcnt)); case WINDRV_WRAP_REGPARM: - return(windrv_wrap_regparm(func, wrap)); + return (windrv_wrap_regparm(func, wrap)); case WINDRV_WRAP_CDECL: - return(windrv_wrap_stdcall(func, wrap, 0)); + return (windrv_wrap_stdcall(func, wrap, 0)); default: break; } - return(EINVAL); + return (EINVAL); } static void @@ -909,8 +904,6 @@ x86_oldldt(dummy) x86_setldt(>able, ltable); mtx_unlock_spin(&dt_lock); - - return; } static void @@ -959,8 +952,6 @@ x86_newldt(dummy) mtx_unlock_spin(&dt_lock); /* Whew. */ - - return; } #endif /* __i386__ */ @@ -971,5 +962,5 @@ windrv_unwrap(func) { free(func, M_DEVBUF); - return(0); + return (0); } diff --git a/sys/compat/ndis/subr_hal.c b/sys/compat/ndis/subr_hal.c index 72b6db2915e9..45f34408c461 100644 --- a/sys/compat/ndis/subr_hal.c +++ b/sys/compat/ndis/subr_hal.c @@ -102,8 +102,7 @@ hal_libinit() patch++; } - - return(0); + return (0); } int @@ -121,7 +120,7 @@ hal_libfini() patch++; } - return(0); + return (0); } static void @@ -129,7 +128,6 @@ KeStallExecutionProcessor(usecs) uint32_t usecs; { DELAY(usecs); - return; } static void @@ -138,21 +136,18 @@ WRITE_PORT_ULONG(port, val) uint32_t val; { bus_space_write_4(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val); - return; } static void WRITE_PORT_USHORT(uint16_t *port, uint16_t val) { bus_space_write_2(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val); - return; } static void WRITE_PORT_UCHAR(uint8_t *port, uint8_t val) { bus_space_write_1(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val); - return; } static void @@ -163,7 +158,6 @@ WRITE_PORT_BUFFER_ULONG(port, val, cnt) { bus_space_write_multi_4(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val, cnt); - return; } static void @@ -174,7 +168,6 @@ WRITE_PORT_BUFFER_USHORT(port, val, cnt) { bus_space_write_multi_2(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val, cnt); - return; } static void @@ -185,28 +178,27 @@ WRITE_PORT_BUFFER_UCHAR(port, val, cnt) { bus_space_write_multi_1(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val, cnt); - return; } static uint16_t READ_PORT_USHORT(port) uint16_t *port; { - return(bus_space_read_2(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port)); + return (bus_space_read_2(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port)); } static uint32_t READ_PORT_ULONG(port) uint32_t *port; { - return(bus_space_read_4(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port)); + return (bus_space_read_4(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port)); } static uint8_t READ_PORT_UCHAR(port) uint8_t *port; { - return(bus_space_read_1(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port)); + return (bus_space_read_1(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port)); } static void @@ -217,7 +209,6 @@ READ_PORT_BUFFER_ULONG(port, val, cnt) { bus_space_read_multi_4(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val, cnt); - return; } static void @@ -228,7 +219,6 @@ READ_PORT_BUFFER_USHORT(port, val, cnt) { bus_space_read_multi_2(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val, cnt); - return; } static void @@ -239,7 +229,6 @@ READ_PORT_BUFFER_UCHAR(port, val, cnt) { bus_space_read_multi_1(NDIS_BUS_SPACE_IO, 0x0, (bus_size_t)port, val, cnt); - return; } /* @@ -370,7 +359,7 @@ KfAcquireSpinLock(lock) KeRaiseIrql(DISPATCH_LEVEL, &oldirql); KeAcquireSpinLockAtDpcLevel(lock); - return(oldirql); + return (oldirql); } void @@ -378,16 +367,14 @@ KfReleaseSpinLock(kspin_lock *lock, uint8_t newirql) { KeReleaseSpinLockFromDpcLevel(lock); KeLowerIrql(newirql); - - return; } uint8_t KeGetCurrentIrql() { if (mtx_owned(&disp_lock[curthread->td_oncpu])) - return(DISPATCH_LEVEL); - return(PASSIVE_LEVEL); + return (DISPATCH_LEVEL); + return (PASSIVE_LEVEL); } static uint64_t @@ -397,7 +384,7 @@ KeQueryPerformanceCounter(freq) if (freq != NULL) *freq = hz; - return((uint64_t)ticks); + return ((uint64_t)ticks); } uint8_t @@ -417,7 +404,7 @@ KfRaiseIrql(uint8_t irql) } /*printf("RAISE IRQL: %d %d\n", irql, oldirql);*/ - return(oldirql); + return (oldirql); } void @@ -431,8 +418,6 @@ KfLowerIrql(uint8_t oldirql) mtx_unlock(&disp_lock[curthread->td_oncpu]); sched_unpin(); - - return; } static uint8_t @@ -441,20 +426,18 @@ KeRaiseIrqlToDpcLevel(void) uint8_t irql; KeRaiseIrql(DISPATCH_LEVEL, &irql); - return(irql); + return (irql); } static void _KeLowerIrql(uint8_t oldirql) { KeLowerIrql(oldirql); - return; } static void dummy() { - printf ("hal dummy called...\n"); - return; + printf("hal dummy called...\n"); } image_patch_table hal_functbl[] = { diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c index d60e5268fe79..558398d71677 100644 --- a/sys/compat/ndis/subr_ndis.c +++ b/sys/compat/ndis/subr_ndis.c @@ -319,7 +319,7 @@ ndis_libinit() patch++; } - return(0); + return (0); } int @@ -333,7 +333,7 @@ ndis_libfini() patch++; } - return(0); + return (0); } static funcptr @@ -345,11 +345,11 @@ ndis_findwrap(func) patch = ndis_functbl; while (patch->ipt_func != NULL) { if ((funcptr)patch->ipt_func == func) - return((funcptr)patch->ipt_wrap); + return ((funcptr)patch->ipt_wrap); patch++; } - return(NULL); + return (NULL); } /* @@ -385,8 +385,6 @@ NdisInitializeWrapper(wrapper, drv, path, unused) */ drv->dro_driverext->dre_adddevicefunc = NdisAddDevice; - - return; } static void @@ -395,7 +393,6 @@ NdisTerminateWrapper(handle, syspec) void *syspec; { /* Nothing to see here, move along. */ - return; } static ndis_status @@ -422,7 +419,7 @@ NdisMRegisterMiniport(handle, characteristics, len) if (IoAllocateDriverObjectExtension(drv, (void *)1, sizeof(ndis_miniport_characteristics), (void **)&ch) != STATUS_SUCCESS) { - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); } bzero((char *)ch, sizeof(ndis_miniport_characteristics)); @@ -435,7 +432,7 @@ NdisMRegisterMiniport(handle, characteristics, len) ch->nmc_pnpevent_handler = NULL; } - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static ndis_status @@ -448,11 +445,11 @@ NdisAllocateMemoryWithTag(vaddr, len, tag) mem = ExAllocatePoolWithTag(NonPagedPool, len, tag); if (mem == NULL) { - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); } *vaddr = mem; - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static ndis_status @@ -466,10 +463,10 @@ NdisAllocateMemory(vaddr, len, flags, highaddr) mem = ExAllocatePoolWithTag(NonPagedPool, len, 0); if (mem == NULL) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); *vaddr = mem; - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -482,8 +479,6 @@ NdisFreeMemory(vaddr, len, flags) return; ExFreePool(vaddr); - - return; } static ndis_status @@ -506,7 +501,7 @@ NdisMSetAttributesEx(adapter_handle, adapter_ctx, hangsecs, block->nmb_checkforhangsecs = hangsecs; block->nmb_flags = flags; - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -517,8 +512,6 @@ NdisOpenConfiguration(status, cfg, wrapctx) { *cfg = wrapctx; *status = NDIS_STATUS_SUCCESS; - - return; } static void @@ -530,8 +523,6 @@ NdisOpenConfigurationKeyByName(status, cfg, subkey, subhandle) { *subhandle = cfg; *status = NDIS_STATUS_SUCCESS; - - return; } static void @@ -543,8 +534,6 @@ NdisOpenConfigurationKeyByIndex(status, cfg, idx, subkey, subhandle) ndis_handle *subhandle; { *status = NDIS_STATUS_FAILURE; - - return; } static ndis_status @@ -565,7 +554,7 @@ ndis_encode_parm(block, oid, type, parm) np = ExAllocatePoolWithTag(NonPagedPool, sizeof(ndis_parmlist_entry), 0); if (np == NULL) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); InsertHeadList((&block->nmb_parmlist), (&np->np_list)); *parm = p = &np->np_parm; @@ -584,7 +573,7 @@ ndis_encode_parm(block, oid, type, parm) if (RtlAnsiStringToUnicodeString(us, &as, TRUE)) { ExFreePool(np); - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); } break; case ndis_parm_int: @@ -609,11 +598,11 @@ ndis_encode_parm(block, oid, type, parm) strtoul((char *)oid->oid_arg1, NULL, base); break; default: - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); break; } - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -690,8 +679,6 @@ NdisReadConfiguration(status, parm, cfg, key, type) RtlFreeAnsiString(&as); *status = NDIS_STATUS_FAILURE; - - return; } static ndis_status @@ -707,7 +694,7 @@ ndis_decode_parm(block, parm, val) case ndis_parm_string: ustr = &parm->ncp_parmdata.ncp_stringdata; if (RtlUnicodeStringToAnsiString(&as, ustr, TRUE)) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); bcopy(as.as_buf, val, as.as_len); RtlFreeAnsiString(&as); break; @@ -718,10 +705,10 @@ ndis_decode_parm(block, parm, val) sprintf(val, "%xu", parm->ncp_parmdata.ncp_intdata); break; default: - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); break; } - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -779,7 +766,6 @@ NdisWriteConfiguration(status, cfg, key, parm) RtlFreeAnsiString(&as); *status = NDIS_STATUS_SUCCESS; - return; } static void @@ -801,8 +787,6 @@ NdisCloseConfiguration(cfg) RtlFreeUnicodeString(&p->ncp_parmdata.ncp_stringdata); ExFreePool(e); } - - return; } /* @@ -814,8 +798,6 @@ NdisAllocateSpinLock(lock) { KeInitializeSpinLock(&lock->nsl_spinlock); lock->nsl_kirql = 0; - - return; } /* @@ -834,7 +816,6 @@ NdisFreeSpinLock(lock) KeInitializeSpinLock(&lock->nsl_spinlock); lock->nsl_kirql = 0; #endif - return; } /* @@ -846,7 +827,6 @@ NdisAcquireSpinLock(lock) ndis_spin_lock *lock; { KeAcquireSpinLock(&lock->nsl_spinlock, &lock->nsl_kirql); - return; } /* @@ -858,7 +838,6 @@ NdisReleaseSpinLock(lock) ndis_spin_lock *lock; { KeReleaseSpinLock(&lock->nsl_spinlock, lock->nsl_kirql); - return; } /* @@ -869,7 +848,6 @@ NdisDprAcquireSpinLock(lock) ndis_spin_lock *lock; { KeAcquireSpinLockAtDpcLevel(&lock->nsl_spinlock); - return; } /* @@ -880,7 +858,6 @@ NdisDprReleaseSpinLock(lock) ndis_spin_lock *lock; { KeReleaseSpinLockFromDpcLevel(&lock->nsl_spinlock); - return; } static void @@ -889,7 +866,6 @@ NdisInitializeReadWriteLock(lock) { KeInitializeSpinLock(&lock->nrl_spinlock); bzero((char *)&lock->nrl_rsvd, sizeof(lock->nrl_rsvd)); - return; } static void @@ -901,8 +877,6 @@ NdisAcquireReadWriteLock(ndis_rw_lock *lock, uint8_t writeacc, lock->nrl_rsvd[0]++; } else lock->nrl_rsvd[1]++; - - return; } static void @@ -915,8 +889,6 @@ NdisReleaseReadWriteLock(lock, state) KeReleaseSpinLock(&lock->nrl_spinlock, state->nls_oldirql); } else lock->nrl_rsvd[1]--; - - return; } static uint32_t @@ -935,7 +907,7 @@ NdisReadPciSlotInformation(adapter, slot, offset, buf, len) block = (ndis_miniport_block *)adapter; dest = buf; if (block == NULL) - return(0); + return (0); dev = block->nmb_physdeviceobj->do_devext; @@ -959,7 +931,7 @@ NdisReadPciSlotInformation(adapter, slot, offset, buf, len) dest[i] = pci_read_config(dev, i + offset, 1); } - return(len); + return (len); } static uint32_t @@ -979,7 +951,7 @@ NdisWritePciSlotInformation(adapter, slot, offset, buf, len) dest = buf; if (block == NULL) - return(0); + return (0); dev = block->nmb_physdeviceobj->do_devext; for (i = 0; i < len; i++) { @@ -987,7 +959,7 @@ NdisWritePciSlotInformation(adapter, slot, offset, buf, len) pci_write_config(dev, i + offset, dest[i], 1); } - return(len); + return (len); } /* @@ -1033,22 +1005,20 @@ NdisWriteErrorLogEntry(ndis_handle adapter, ndis_error_code code, } } - device_printf (dev, "NDIS ERROR: %x (%s)\n", code, + device_printf(dev, "NDIS ERROR: %x (%s)\n", code, str == NULL ? "unknown error" : str); if (ifp != NULL && ifp->if_flags & IFF_DEBUG) { - device_printf (dev, "NDIS NUMERRORS: %x\n", numerrors); + device_printf(dev, "NDIS NUMERRORS: %x\n", numerrors); va_start(ap, numerrors); for (i = 0; i < numerrors; i++) - device_printf (dev, "argptr: %p\n", + device_printf(dev, "argptr: %p\n", va_arg(ap, void *)); va_end(ap); } if (as.as_len) RtlFreeAnsiString(&as); - - return; } static void @@ -1072,8 +1042,6 @@ ndis_map_cb(arg, segs, nseg, error) } ctx->nma_cnt = nseg; - - return; } static void @@ -1110,8 +1078,6 @@ NdisMStartBufferPhysicalMapping(ndis_handle adapter, ndis_buffer *buf, writedev ? BUS_DMASYNC_PREWRITE : BUS_DMASYNC_PREREAD); *arraysize = nma.nma_cnt; - - return; } static void @@ -1139,8 +1105,6 @@ NdisMCompleteBufferPhysicalMapping(adapter, buf, mapreg) BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(sc->ndis_mtag, map); - - return; } /* @@ -1158,8 +1122,6 @@ NdisInitializeTimer(timer, func, ctx) KeInitializeTimer(&timer->nt_ktimer); KeInitializeDpc(&timer->nt_kdpc, func, ctx); KeSetImportanceDpc(&timer->nt_kdpc, KDPC_IMPORTANCE_LOW); - - return; } static void @@ -1183,8 +1145,6 @@ ndis_timercall(dpc, timer, sysarg1, sysarg2) if (NDIS_SERIALIZED(timer->nmt_block)) KeReleaseSpinLockFromDpcLevel(&timer->nmt_block->nmb_lock); - - return; } /* @@ -1250,8 +1210,6 @@ NdisSetTimer(timer, msecs) */ KeSetTimer(&timer->nt_ktimer, ((int64_t)msecs * -10000), &timer->nt_kdpc); - - return; } static void @@ -1261,8 +1219,6 @@ NdisMSetPeriodicTimer(timer, msecs) { KeSetTimerEx(&timer->nmt_ktimer, ((int64_t)msecs * -10000), msecs, &timer->nmt_kdpc); - - return; } /* @@ -1279,7 +1235,6 @@ NdisMCancelTimer(timer, cancelled) { *cancelled = KeCancelTimer(&timer->nt_ktimer); - return; } static void @@ -1306,8 +1261,6 @@ NdisMQueryAdapterResources(status, adapter, list, buflen) bcopy((char *)block->nmb_rlist, (char *)list, rsclen); *status = NDIS_STATUS_SUCCESS; - - return; } static ndis_status @@ -1321,21 +1274,21 @@ NdisMRegisterIoPortRange(offset, adapter, port, numports) struct ndis_softc *sc; if (adapter == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); block = (ndis_miniport_block *)adapter; sc = device_get_softc(block->nmb_physdeviceobj->do_devext); if (sc->ndis_res_io == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); /* Don't let the device map more ports than we have. */ if (rman_get_size(sc->ndis_res_io) < numports) - return(NDIS_STATUS_INVALID_LENGTH); + return (NDIS_STATUS_INVALID_LENGTH); *offset = (void *)rman_get_start(sc->ndis_res_io); - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -1345,7 +1298,6 @@ NdisMDeregisterIoPortRange(adapter, port, numports, offset) uint32_t numports; void *offset; { - return; } static void @@ -1386,8 +1338,6 @@ NdisReadNetworkAddress(status, addr, addrlen, adapter) *addrlen = ETHER_ADDR_LEN; *status = NDIS_STATUS_SUCCESS; } - - return; } static ndis_status @@ -1396,7 +1346,7 @@ NdisQueryMapRegisterCount(bustype, cnt) uint32_t *cnt; { *cnt = 8192; - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static ndis_status @@ -1414,7 +1364,7 @@ NdisMAllocateMapRegisters(ndis_handle adapter, uint32_t dmachannel, M_DEVBUF, M_NOWAIT|M_ZERO); if (sc->ndis_mmaps == NULL) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); error = bus_dma_tag_create(sc->ndis_parent_tag, ETHER_ALIGN, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, @@ -1423,7 +1373,7 @@ NdisMAllocateMapRegisters(ndis_handle adapter, uint32_t dmachannel, if (error) { free(sc->ndis_mmaps, M_DEVBUF); - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); } for (i = 0; i < physmapneeded; i++) @@ -1431,7 +1381,7 @@ NdisMAllocateMapRegisters(ndis_handle adapter, uint32_t dmachannel, sc->ndis_mmapcnt = physmapneeded; - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -1451,8 +1401,6 @@ NdisMFreeMapRegisters(adapter) free(sc->ndis_mmaps, M_DEVBUF); bus_dma_tag_destroy(sc->ndis_mtag); - - return; } static void @@ -1470,8 +1418,6 @@ ndis_mapshared_cb(arg, segs, nseg, error) p = arg; p->np_quad = segs[0].ds_addr; - - return; } /* @@ -1556,8 +1502,6 @@ NdisMAllocateSharedMemory(ndis_handle adapter, uint32_t len, uint8_t cached, sh->ndis_saddr = *vaddr; InsertHeadList((&sc->ndis_shlist), (&sh->ndis_list)); NDIS_UNLOCK(sc); - - return; } struct ndis_allocwork { @@ -1593,8 +1537,6 @@ ndis_asyncmem_complete(dobj, arg) IoFreeWorkItem(w->na_iw); free(w, M_DEVBUF); - - return; } static ndis_status @@ -1607,18 +1549,18 @@ NdisMAllocateSharedMemoryAsync(ndis_handle adapter, uint32_t len, io_workitem_func ifw; if (adapter == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); block = adapter; iw = IoAllocateWorkItem(block->nmb_deviceobj); if (iw == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); w = malloc(sizeof(struct ndis_allocwork), M_TEMP, M_NOWAIT); if (w == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); w->na_cached = cached; w->na_len = len; @@ -1628,7 +1570,7 @@ NdisMAllocateSharedMemoryAsync(ndis_handle adapter, uint32_t len, ifw = (io_workitem_func)ndis_findwrap((funcptr)ndis_asyncmem_complete); IoQueueWorkItem(iw, ifw, WORKQUEUE_DELAYED, w); - return(NDIS_STATUS_PENDING); + return (NDIS_STATUS_PENDING); } static void @@ -1683,8 +1625,6 @@ NdisMFreeSharedMemory(ndis_handle adapter, uint32_t len, uint8_t cached, bus_dma_tag_destroy(sh->ndis_stag); free(sh, M_DEVBUF); - - return; } static ndis_status @@ -1695,14 +1635,14 @@ NdisMMapIoSpace(vaddr, adapter, paddr, len) uint32_t len; { if (adapter == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); *vaddr = MmMapIoSpace(paddr.np_quad, len, 0); if (*vaddr == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -1712,20 +1652,19 @@ NdisMUnmapIoSpace(adapter, vaddr, len) uint32_t len; { MmUnmapIoSpace(vaddr, len); - return; } static uint32_t NdisGetCacheFillSize(void) { - return(128); + return (128); } static uint32_t NdisMGetDmaAlignment(handle) ndis_handle handle; { - return(16); + return (16); } /* @@ -1748,13 +1687,13 @@ NdisMInitializeScatterGatherDma(ndis_handle adapter, uint8_t is64, int error; if (adapter == NULL) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); block = (ndis_miniport_block *)adapter; sc = device_get_softc(block->nmb_physdeviceobj->do_devext); /* Don't do this twice. */ if (sc->ndis_sc == 1) - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); error = bus_dma_tag_create(sc->ndis_parent_tag, ETHER_ALIGN, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, @@ -1763,7 +1702,7 @@ NdisMInitializeScatterGatherDma(ndis_handle adapter, uint8_t is64, sc->ndis_sc = 1; - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } void @@ -1811,7 +1750,6 @@ NdisAllocatePacketPool(status, pool, descnum, protrsvdlen) *pool = p; *status = NDIS_STATUS_SUCCESS; - return; } void @@ -1822,7 +1760,7 @@ NdisAllocatePacketPoolEx(status, pool, descnum, oflowdescnum, protrsvdlen) uint32_t oflowdescnum; uint32_t protrsvdlen; { - return(NdisAllocatePacketPool(status, pool, + return (NdisAllocatePacketPool(status, pool, descnum + oflowdescnum, protrsvdlen)); } @@ -1833,7 +1771,7 @@ NdisPacketPoolUsage(pool) ndis_packet_pool *p; p = (ndis_packet_pool *)pool; - return(p->np_cnt - ExQueryDepthSList(&p->np_head)); + return (p->np_cnt - ExQueryDepthSList(&p->np_head)); } void @@ -1866,8 +1804,6 @@ NdisFreePacketPool(pool) ExFreePool(p->np_pktmem); ExFreePool(p); - - return; } void @@ -1927,8 +1863,6 @@ NdisAllocatePacket(status, packet, pool) *packet = pkt; *status = NDIS_STATUS_SUCCESS; - - return; } void @@ -1955,8 +1889,6 @@ NdisFreePacket(packet) } KeReleaseSpinLock(&p->np_lock, irql); #endif - - return; } static void @@ -1980,8 +1912,6 @@ NdisUnchainBufferAtFront(packet, buf) *buf = priv->npp_head; priv->npp_head = (*buf)->mdl_next; } - - return; } static void @@ -2010,8 +1940,6 @@ NdisUnchainBufferAtBack(packet, buf) priv->npp_tail = tmp; tmp->mdl_next = NULL; } - - return; } /* @@ -2042,14 +1970,12 @@ NdisAllocateBufferPool(status, pool, descnum) *pool = NonPagedPool; *status = NDIS_STATUS_SUCCESS; - return; } static void NdisFreeBufferPool(pool) ndis_handle pool; { - return; } static void @@ -2072,8 +1998,6 @@ NdisAllocateBuffer(status, buffer, pool, vaddr, len) *buffer = buf; *status = NDIS_STATUS_SUCCESS; - - return; } static void @@ -2081,7 +2005,6 @@ NdisFreeBuffer(buf) ndis_buffer *buf; { IoFreeMdl(buf); - return; } /* Aw c'mon. */ @@ -2090,7 +2013,7 @@ static uint32_t NdisBufferLength(buf) ndis_buffer *buf; { - return(MmGetMdlByteCount(buf)); + return (MmGetMdlByteCount(buf)); } /* @@ -2107,8 +2030,6 @@ NdisQueryBuffer(buf, vaddr, len) if (vaddr != NULL) *vaddr = MmGetMdlVirtualAddress(buf); *len = MmGetMdlByteCount(buf); - - return; } /* Same as above -- we don't care about the priority. */ @@ -2123,8 +2044,6 @@ NdisQueryBufferSafe(buf, vaddr, len, prio) if (vaddr != NULL) *vaddr = MmGetMdlVirtualAddress(buf); *len = MmGetMdlByteCount(buf); - - return; } /* Damnit Microsoft!! How many ways can you do the same thing?! */ @@ -2133,7 +2052,7 @@ static void * NdisBufferVirtualAddress(buf) ndis_buffer *buf; { - return(MmGetMdlVirtualAddress(buf)); + return (MmGetMdlVirtualAddress(buf)); } static void * @@ -2141,7 +2060,7 @@ NdisBufferVirtualAddressSafe(buf, prio) ndis_buffer *buf; uint32_t prio; { - return(MmGetMdlVirtualAddress(buf)); + return (MmGetMdlVirtualAddress(buf)); } static void @@ -2150,8 +2069,6 @@ NdisAdjustBufferLength(buf, len) int len; { MmGetMdlByteCount(buf) = len; - - return; } static uint32_t @@ -2159,7 +2076,7 @@ NdisInterlockedIncrement(addend) uint32_t *addend; { atomic_add_long((u_long *)addend, 1); - return(*addend); + return (*addend); } static uint32_t @@ -2167,7 +2084,7 @@ NdisInterlockedDecrement(addend) uint32_t *addend; { atomic_subtract_long((u_long *)addend, 1); - return(*addend); + return (*addend); } static void @@ -2180,7 +2097,6 @@ NdisInitializeEvent(event) * not signaled state. */ KeInitializeEvent(&event->ne_event, EVENT_TYPE_NOTIFY, FALSE); - return; } static void @@ -2188,7 +2104,6 @@ NdisSetEvent(event) ndis_event *event; { KeSetEvent(&event->ne_event, IO_NO_INCREMENT, FALSE); - return; } static void @@ -2196,7 +2111,6 @@ NdisResetEvent(event) ndis_event *event; { KeResetEvent(&event->ne_event); - return; } static uint8_t @@ -2212,9 +2126,9 @@ NdisWaitEvent(event, msecs) 0, 0, TRUE, msecs ? & duetime : NULL); if (rval == STATUS_TIMEOUT) - return(FALSE); + return (FALSE); - return(TRUE); + return (TRUE); } static ndis_status @@ -2227,9 +2141,9 @@ NdisUnicodeStringToAnsiString(dstr, sstr) rval = RtlUnicodeStringToAnsiString(dstr, sstr, FALSE); if (rval == STATUS_INSUFFICIENT_RESOURCES) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); if (rval) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); return (NDIS_STATUS_SUCCESS); } @@ -2244,9 +2158,9 @@ NdisAnsiStringToUnicodeString(dstr, sstr) rval = RtlAnsiStringToUnicodeString(dstr, sstr, FALSE); if (rval == STATUS_INSUFFICIENT_RESOURCES) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); if (rval) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); return (NDIS_STATUS_SUCCESS); } @@ -2282,7 +2196,7 @@ ndis_intr(iobj, arg) intr = sc->ndis_block->nmb_interrupt; if (intr == NULL || sc->ndis_block->nmb_miniportadapterctx == NULL) - return(FALSE); + return (FALSE); if (sc->ndis_block->nmb_interrupt->ni_isrreq == TRUE) MSCALL3(intr->ni_isrfunc, &is_our_intr, &call_isr, @@ -2296,7 +2210,7 @@ ndis_intr(iobj, arg) if (call_isr) IoRequestDpc(sc->ndis_block->nmb_deviceobj, NULL, sc); - return(is_our_intr); + return (is_our_intr); } static void @@ -2337,8 +2251,6 @@ ndis_intrhand(dpc, intr, sysarg1, sysarg2) if (intr->ni_dpccnt == 0) KeSetEvent(&intr->ni_dpcevt, IO_NO_INCREMENT, FALSE); KeReleaseSpinLockFromDpcLevel(&intr->ni_dpccountlock); - - return; } static ndis_status @@ -2359,7 +2271,7 @@ NdisMRegisterInterrupt(ndis_miniport_interrupt *intr, ndis_handle adapter, intr->ni_rsvd = ExAllocatePoolWithTag(NonPagedPool, sizeof(struct mtx), 0); if (intr->ni_rsvd == NULL) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); intr->ni_block = adapter; intr->ni_isrreq = reqisr; @@ -2378,11 +2290,11 @@ NdisMRegisterInterrupt(ndis_miniport_interrupt *intr, ndis_handle adapter, ivec, ilevel, 0, imode, shared, 0, FALSE); if (error != STATUS_SUCCESS) - return(NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); block->nmb_interrupt = intr; - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -2408,8 +2320,6 @@ NdisMDeregisterInterrupt(intr) KeWaitForSingleObject(&intr->ni_dpcevt, 0, 0, FALSE, NULL); KeResetEvent(&intr->ni_dpcevt); - - return; } static void @@ -2431,8 +2341,6 @@ NdisMRegisterAdapterShutdownHandler(adapter, shutdownctx, shutdownfunc) chars->nmc_shutdown_handler = shutdownfunc; chars->nmc_rsvd0 = shutdownctx; - - return; } static void @@ -2452,8 +2360,6 @@ NdisMDeregisterAdapterShutdownHandler(adapter) chars->nmc_shutdown_handler = NULL; chars->nmc_rsvd0 = NULL; - - return; } static uint32_t @@ -2461,10 +2367,10 @@ NDIS_BUFFER_TO_SPAN_PAGES(buf) ndis_buffer *buf; { if (buf == NULL) - return(0); + return (0); if (MmGetMdlByteCount(buf) == 0) - return(1); - return(SPAN_PAGES(MmGetMdlVirtualAddress(buf), + return (1); + return (SPAN_PAGES(MmGetMdlVirtualAddress(buf), MmGetMdlByteCount(buf))); } @@ -2477,7 +2383,6 @@ NdisGetBufferPhysicalArraySize(buf, pages) return; *pages = NDIS_BUFFER_TO_SPAN_PAGES(buf); - return; } static void @@ -2491,8 +2396,6 @@ NdisQueryBufferOffset(buf, off, len) *off = MmGetMdlByteOffset(buf); *len = MmGetMdlByteCount(buf); - - return; } void @@ -2514,8 +2417,6 @@ NdisMSleep(usecs) KeSetTimer(&timer, ((int64_t)usecs * -10), NULL); KeWaitForSingleObject(&timer, 0, 0, FALSE, NULL); } - - return; } static uint32_t @@ -2533,7 +2434,7 @@ NdisReadPcmciaAttributeMemory(handle, offset, buf, len) int i; if (handle == NULL) - return(0); + return (0); block = (ndis_miniport_block *)handle; sc = device_get_softc(block->nmb_physdeviceobj->do_devext); @@ -2545,7 +2446,7 @@ NdisReadPcmciaAttributeMemory(handle, offset, buf, len) for (i = 0; i < len; i++) dest[i] = bus_space_read_1(bt, bh, (offset + i) * 2); - return(i); + return (i); } static uint32_t @@ -2563,7 +2464,7 @@ NdisWritePcmciaAttributeMemory(handle, offset, buf, len) int i; if (handle == NULL) - return(0); + return (0); block = (ndis_miniport_block *)handle; sc = device_get_softc(block->nmb_physdeviceobj->do_devext); @@ -2575,7 +2476,7 @@ NdisWritePcmciaAttributeMemory(handle, offset, buf, len) for (i = 0; i < len; i++) bus_space_write_1(bt, bh, (offset + i) * 2, src[i]); - return(i); + return (i); } static list_entry * @@ -2594,7 +2495,7 @@ NdisInterlockedInsertHeadList(head, entry, lock) head->nle_flink = entry; KeReleaseSpinLock(&lock->nsl_spinlock, lock->nsl_kirql); - return(flink); + return (flink); } static list_entry * @@ -2612,7 +2513,7 @@ NdisInterlockedRemoveHeadList(head, lock) flink->nle_blink = head; KeReleaseSpinLock(&lock->nsl_spinlock, lock->nsl_kirql); - return(entry); + return (entry); } static list_entry * @@ -2631,7 +2532,7 @@ NdisInterlockedInsertTailList(head, entry, lock) head->nle_blink = entry; KeReleaseSpinLock(&lock->nsl_spinlock, lock->nsl_kirql); - return(blink); + return (blink); } static uint8_t @@ -2640,7 +2541,7 @@ NdisMSynchronizeWithInterrupt(intr, syncfunc, syncctx) void *syncfunc; void *syncctx; { - return(KeSynchronizeExecution(intr->ni_introbj, syncfunc, syncctx)); + return (KeSynchronizeExecution(intr->ni_introbj, syncfunc, syncctx)); } static void @@ -2648,7 +2549,6 @@ NdisGetCurrentSystemTime(tval) uint64_t *tval; { ntoskrnl_time(tval); - return; } /* @@ -2662,8 +2562,6 @@ NdisGetSystemUpTime(tval) nanouptime(&ts); *tval = ts.tv_nsec / 1000000 + ts.tv_sec * 1000; - - return; } static void @@ -2674,7 +2572,6 @@ NdisInitializeString(dst, src) ansi_string as; RtlInitAnsiString(&as, src); RtlAnsiStringToUnicodeString(dst, &as, TRUE); - return; } static void @@ -2682,14 +2579,13 @@ NdisFreeString(str) unicode_string *str; { RtlFreeUnicodeString(str); - return; } static ndis_status NdisMRemoveMiniport(adapter) ndis_handle *adapter; { - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -2698,7 +2594,6 @@ NdisInitAnsiString(dst, src) char *src; { RtlInitAnsiString(dst, src); - return; } static void @@ -2707,7 +2602,6 @@ NdisInitUnicodeString(dst, src) uint16_t *src; { RtlInitUnicodeString(dst, src); - return; } static void NdisMGetDeviceProperty(adapter, phydevobj, @@ -2729,8 +2623,6 @@ static void NdisMGetDeviceProperty(adapter, phydevobj, *funcdevobj = block->nmb_deviceobj; if (nextdevobj != NULL) *nextdevobj = block->nmb_nextdeviceobj; - - return; } static void @@ -2754,8 +2646,6 @@ NdisGetFirstBufferFromPacket(packet, buf, firstva, firstlen, totlen) for (tmp = tmp->mdl_next; tmp != NULL; tmp = tmp->mdl_next) *totlen += MmGetMdlByteCount(tmp); } - - return; } static void @@ -2783,13 +2673,13 @@ ndis_find_sym(lf, filename, suffix, sym) fullsym = ExAllocatePoolWithTag(NonPagedPool, MAXPATHLEN, 0); if (fullsym == NULL) - return(ENOMEM); + return (ENOMEM); bzero(fullsym, MAXPATHLEN); strncpy(fullsym, filename, MAXPATHLEN); if (strlen(filename) < 4) { ExFreePool(fullsym); - return(EINVAL); + return (EINVAL); } /* If the filename has a .ko suffix, strip if off. */ @@ -2807,9 +2697,9 @@ ndis_find_sym(lf, filename, suffix, sym) *sym = linker_file_lookup_symbol(lf, fullsym, 0); ExFreePool(fullsym); if (*sym == 0) - return(ENOENT); + return (ENOENT); - return(0); + return (0); } struct ndis_checkmodule { @@ -2960,8 +2850,6 @@ NdisOpenFile(status, filehandle, filelength, filename, highestaddr) *filehandle = fh; *filelength = fh->nf_maplen = vap->va_size & 0xFFFFFFFF; *status = NDIS_STATUS_SUCCESS; - - return; } static void @@ -3025,8 +2913,6 @@ NdisMapFile(status, mappedbuffer, filehandle) *status = NDIS_STATUS_SUCCESS; *mappedbuffer = fh->nf_map; } - - return; } static void @@ -3042,8 +2928,6 @@ NdisUnmapFile(filehandle) if (fh->nf_type == NDIS_FH_TYPE_VFS) ExFreePool(fh->nf_map); fh->nf_map = NULL; - - return; } static void @@ -3078,14 +2962,12 @@ NdisCloseFile(filehandle) fh->nf_vp = NULL; free(fh->nf_name, M_DEVBUF); ExFreePool(fh); - - return; } static uint8_t NdisSystemProcessorCount() { - return(mp_ncpus); + return (mp_ncpus); } typedef void (*ndis_statusdone_handler)(ndis_handle); @@ -3103,7 +2985,6 @@ NdisMIndicateStatusComplete(adapter) statusdonefunc = block->nmb_statusdone_func; MSCALL1(statusdonefunc, adapter); - return; } static void @@ -3120,7 +3001,6 @@ NdisMIndicateStatus(adapter, status, sbuf, slen) statusfunc = block->nmb_status_func; MSCALL4(statusfunc, adapter, status, sbuf, slen); - return; } /* @@ -3154,7 +3034,7 @@ NdisScheduleWorkItem(work) (work_item_func)work->nwi_func, work->nwi_ctx); ExQueueWorkItem(wqi, WORKQUEUE_DELAYED); - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -3244,7 +3124,6 @@ NdisCopyFromPacketToPacket(dpkt, doff, reqlen, spkt, soff, cpylen) } *cpylen = copied; - return; } static void @@ -3258,7 +3137,6 @@ NdisCopyFromPacketToPacketSafe(dpkt, doff, reqlen, spkt, soff, cpylen, prio) uint32_t prio; { NdisCopyFromPacketToPacket(dpkt, doff, reqlen, spkt, soff, cpylen); - return; } static void @@ -3289,7 +3167,7 @@ NdisMRegisterDevice(handle, devname, symname, majorfuncs, devobj, devhandle) *devhandle = dobj; } - return(status); + return (status); } static ndis_status @@ -3297,7 +3175,7 @@ NdisMDeregisterDevice(handle) ndis_handle handle; { IoDeleteDevice(handle); - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static ndis_status @@ -3314,9 +3192,9 @@ NdisMQueryAdapterInstanceName(name, handle) RtlInitAnsiString(&as, __DECONST(char *, device_get_nameunit(dev))); if (RtlAnsiStringToUnicodeString(name, &as, TRUE)) - return(NDIS_STATUS_RESOURCES); + return (NDIS_STATUS_RESOURCES); - return(NDIS_STATUS_SUCCESS); + return (NDIS_STATUS_SUCCESS); } static void @@ -3324,14 +3202,12 @@ NdisMRegisterUnloadHandler(handle, func) ndis_handle handle; void *func; { - return; } static void dummy() { - printf ("NDIS dummy called...\n"); - return; + printf("NDIS dummy called...\n"); } /* diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c index 69bea9e15d6e..ba1e49ffaf67 100644 --- a/sys/compat/ndis/subr_ntoskrnl.c +++ b/sys/compat/ndis/subr_ntoskrnl.c @@ -295,13 +295,13 @@ ntoskrnl_libinit() #endif if (kq_queues == NULL) - return(ENOMEM); + return (ENOMEM); wq_queues = ExAllocatePoolWithTag(NonPagedPool, sizeof(kdpc_queue) * WORKITEM_THREADS, 0); if (wq_queues == NULL) - return(ENOMEM); + return (ENOMEM); #ifdef NTOSKRNL_MULTIPLE_DPCS bzero((char *)kq_queues, sizeof(kdpc_queue) * mp_ncpus); @@ -378,7 +378,7 @@ ntoskrnl_libinit() iw_zone = uma_zcreate("Windows WorkItem", sizeof(io_workitem), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); - return(0); + return (0); } int @@ -419,7 +419,7 @@ ntoskrnl_libfini() mtx_destroy(&ntoskrnl_interlock); mtx_destroy(&ntoskrnl_calllock); - return(0); + return (0); } /* @@ -432,7 +432,7 @@ ntoskrnl_memset(buf, ch, size) int ch; size_t size; { - return(memset(buf, ch, size)); + return (memset(buf, ch, size)); } static void * @@ -442,7 +442,7 @@ ntoskrnl_memmove(dst, src, size) size_t size; { bcopy(src, dst, size); - return(dst); + return (dst); } static void * @@ -506,14 +506,14 @@ static int ntoskrnl_toupper(c) int c; { - return(toupper(c)); + return (toupper(c)); } static int ntoskrnl_tolower(c) int c; { - return(tolower(c)); + return (tolower(c)); } static uint8_t @@ -523,20 +523,20 @@ RtlEqualUnicodeString(unicode_string *str1, unicode_string *str2, int i; if (str1->us_len != str2->us_len) - return(FALSE); + return (FALSE); for (i = 0; i < str1->us_len; i++) { if (caseinsensitive == TRUE) { if (toupper((char)(str1->us_buf[i] & 0xFF)) != toupper((char)(str2->us_buf[i] & 0xFF))) - return(FALSE); + return (FALSE); } else { if (str1->us_buf[i] != str2->us_buf[i]) - return(FALSE); + return (FALSE); } } - return(TRUE); + return (TRUE); } static void @@ -550,7 +550,6 @@ RtlCopyUnicodeString(dest, src) else dest->us_len = dest->us_maxlen; memcpy(dest->us_buf, src->us_buf, dest->us_len); - return; } static void @@ -567,8 +566,6 @@ ntoskrnl_ascii_to_unicode(ascii, unicode, len) *ustr = (uint16_t)ascii[i]; ustr++; } - - return; } static void @@ -585,15 +582,13 @@ ntoskrnl_unicode_to_ascii(unicode, ascii, len) *astr = (uint8_t)unicode[i]; astr++; } - - return; } uint32_t RtlUnicodeStringToAnsiString(ansi_string *dest, unicode_string *src, uint8_t allocate) { if (dest == NULL || src == NULL) - return(STATUS_INVALID_PARAMETER); + return (STATUS_INVALID_PARAMETER); dest->as_len = src->us_len / 2; if (dest->as_maxlen < dest->as_len) @@ -603,7 +598,7 @@ RtlUnicodeStringToAnsiString(ansi_string *dest, unicode_string *src, uint8_t all dest->as_buf = ExAllocatePoolWithTag(NonPagedPool, (src->us_len / 2) + 1, 0); if (dest->as_buf == NULL) - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); dest->as_len = dest->as_maxlen = src->us_len / 2; } else { dest->as_len = src->us_len / 2; /* XXX */ @@ -622,13 +617,13 @@ RtlAnsiStringToUnicodeString(unicode_string *dest, ansi_string *src, uint8_t allocate) { if (dest == NULL || src == NULL) - return(STATUS_INVALID_PARAMETER); + return (STATUS_INVALID_PARAMETER); if (allocate == TRUE) { dest->us_buf = ExAllocatePoolWithTag(NonPagedPool, src->as_len * 2, 0); if (dest->us_buf == NULL) - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); dest->us_len = dest->us_maxlen = strlen(src->as_buf) * 2; } else { dest->us_len = src->as_len * 2; /* XXX */ @@ -652,9 +647,9 @@ ExAllocatePoolWithTag(pooltype, len, tag) buf = malloc(len, M_DEVBUF, M_NOWAIT|M_ZERO); if (buf == NULL) - return(NULL); + return (NULL); - return(buf); + return (buf); } void @@ -662,7 +657,6 @@ ExFreePool(buf) void *buf; { free(buf, M_DEVBUF); - return; } uint32_t @@ -678,14 +672,14 @@ IoAllocateDriverObjectExtension(drv, clid, extlen, ext) + extlen, 0); if (ce == NULL) - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); ce->ce_clid = clid; InsertTailList((&drv->dro_driverext->dre_usrext), (&ce->ce_list)); *ext = (void *)(ce + 1); - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } void * @@ -702,17 +696,17 @@ IoGetDriverObjectExtension(drv, clid) */ if (drv->dro_driverext == NULL) - return(NULL); + return (NULL); e = drv->dro_driverext->dre_usrext.nle_flink; while (e != &drv->dro_driverext->dre_usrext) { ce = (custom_extension *)e; if (ce->ce_clid == clid) - return((void *)(ce + 1)); + return ((void *)(ce + 1)); e = e->nle_flink; } - return(NULL); + return (NULL); } @@ -725,7 +719,7 @@ IoCreateDevice(driver_object *drv, uint32_t devextlen, unicode_string *devname, dev = ExAllocatePoolWithTag(NonPagedPool, sizeof(device_object), 0); if (dev == NULL) - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); dev->do_type = devtype; dev->do_drvobj = drv; @@ -738,7 +732,7 @@ IoCreateDevice(driver_object *drv, uint32_t devextlen, unicode_string *devname, if (dev->do_devext == NULL) { ExFreePool(dev); - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); } bzero(dev->do_devext, devextlen); @@ -769,7 +763,7 @@ IoCreateDevice(driver_object *drv, uint32_t devextlen, unicode_string *devname, if (dev->do_devext != NULL) ExFreePool(dev->do_devext); ExFreePool(dev); - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); } dev->do_devobj_ext->dve_type = 0; @@ -794,7 +788,7 @@ IoCreateDevice(driver_object *drv, uint32_t devextlen, unicode_string *devname, *newdev = dev; - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } void @@ -824,8 +818,6 @@ IoDeleteDevice(dev) } ExFreePool(dev); - - return; } device_object * @@ -859,10 +851,10 @@ IoBuildSynchronousFsdRequest(func, dobj, buf, len, off, event, status) ip = IoBuildAsynchronousFsdRequest(func, dobj, buf, len, off, status); if (ip == NULL) - return(NULL); + return (NULL); ip->irp_usrevent = event; - return(ip); + return (ip); } static irp * @@ -879,7 +871,7 @@ IoBuildAsynchronousFsdRequest(func, dobj, buf, len, off, status) ip = IoAllocateIrp(dobj->do_stacksize, TRUE); if (ip == NULL) - return(NULL); + return (NULL); ip->irp_usriostat = status; ip->irp_tail.irp_overlay.irp_thread = NULL; @@ -900,7 +892,7 @@ IoBuildAsynchronousFsdRequest(func, dobj, buf, len, off, status) ExAllocatePoolWithTag(NonPagedPool, len, 0); if (ip->irp_assoc.irp_sysbuf == NULL) { IoFreeIrp(ip); - return(NULL); + return (NULL); } bcopy(buf, ip->irp_assoc.irp_sysbuf, len); } @@ -911,7 +903,7 @@ IoBuildAsynchronousFsdRequest(func, dobj, buf, len, off, status) if (ip->irp_assoc.irp_sysbuf != NULL) ExFreePool(ip->irp_assoc.irp_sysbuf); IoFreeIrp(ip); - return(NULL); + return (NULL); } ip->irp_userbuf = NULL; ip->irp_assoc.irp_sysbuf = NULL; @@ -933,7 +925,7 @@ IoBuildAsynchronousFsdRequest(func, dobj, buf, len, off, status) sl->isl_parameters.isl_write.isl_byteoff = 0; } - return(ip); + return (ip); } static irp * @@ -947,7 +939,7 @@ IoBuildDeviceIoControlRequest(uint32_t iocode, device_object *dobj, void *ibuf, ip = IoAllocateIrp(dobj->do_stacksize, TRUE); if (ip == NULL) - return(NULL); + return (NULL); ip->irp_usrevent = event; ip->irp_usriostat = status; ip->irp_tail.irp_overlay.irp_thread = NULL; @@ -976,7 +968,7 @@ IoBuildDeviceIoControlRequest(uint32_t iocode, device_object *dobj, void *ibuf, ExAllocatePoolWithTag(NonPagedPool, buflen, 0); if (ip->irp_assoc.irp_sysbuf == NULL) { IoFreeIrp(ip); - return(NULL); + return (NULL); } } if (ilen && ibuf != NULL) { @@ -994,7 +986,7 @@ IoBuildDeviceIoControlRequest(uint32_t iocode, device_object *dobj, void *ibuf, ExAllocatePoolWithTag(NonPagedPool, ilen, 0); if (ip->irp_assoc.irp_sysbuf == NULL) { IoFreeIrp(ip); - return(NULL); + return (NULL); } bcopy(ibuf, ip->irp_assoc.irp_sysbuf, ilen); } @@ -1045,7 +1037,7 @@ IoMakeAssociatedIrp(irp *ip, uint8_t stsize) associrp = IoAllocateIrp(stsize, FALSE); if (associrp == NULL) - return(NULL); + return (NULL); mtx_lock(&ntoskrnl_dispatchlock); associrp->irp_flags |= IRP_ASSOCIATED_IRP; @@ -1054,7 +1046,7 @@ IoMakeAssociatedIrp(irp *ip, uint8_t stsize) associrp->irp_assoc.irp_master = ip; mtx_unlock(&ntoskrnl_dispatchlock); - return(associrp); + return (associrp); } static void @@ -1062,7 +1054,6 @@ IoFreeIrp(ip) irp *ip; { ExFreePool(ip); - return; } static void @@ -1075,8 +1066,6 @@ IoInitializeIrp(irp *io, uint16_t psize, uint8_t ssize) InitializeListHead(&io->irp_thlist); io->irp_tail.irp_overlay.irp_csl = (io_stack_location *)(io + 1) + ssize; - - return; } static void @@ -1090,22 +1079,18 @@ IoReuseIrp(ip, status) IoInitializeIrp(ip, ip->irp_size, ip->irp_stackcnt); ip->irp_iostat.isb_status = status; ip->irp_allocflags = allocflags; - - return; } void IoAcquireCancelSpinLock(uint8_t *irql) { KeAcquireSpinLock(&ntoskrnl_cancellock, irql); - return; } void IoReleaseCancelSpinLock(uint8_t irql) { KeReleaseSpinLock(&ntoskrnl_cancellock, irql); - return; } uint8_t @@ -1119,7 +1104,7 @@ IoCancelIrp(irp *ip) ip->irp_cancel = TRUE; if (cfunc == NULL) { IoReleaseCancelSpinLock(cancelirql); - return(FALSE); + return (FALSE); } ip->irp_cancelirql = cancelirql; MSCALL2(cfunc, IoGetCurrentIrpStackLocation(ip)->isl_devobj, ip); @@ -1149,7 +1134,7 @@ IofCallDriver(dobj, ip) disp = drvobj->dro_dispatch[sl->isl_major]; status = MSCALL2(disp, dobj, ip); - return(status); + return (status); } void @@ -1230,8 +1215,6 @@ IofCompleteRequest(irp *ip, uint8_t prioboost) IoFreeMdl(ip->irp_mdl); IoFreeIrp(ip); } - - return; } void @@ -1253,8 +1236,6 @@ ntoskrnl_intr(arg) l = l->nle_flink; } KeReleaseSpinLock(&ntoskrnl_intlock, irql); - - return; } uint8_t @@ -1263,14 +1244,13 @@ KeAcquireInterruptSpinLock(iobj) { uint8_t irql; KeAcquireSpinLock(&ntoskrnl_intlock, &irql); - return(irql); + return (irql); } void KeReleaseInterruptSpinLock(kinterrupt *iobj, uint8_t irql) { KeReleaseSpinLock(&ntoskrnl_intlock, irql); - return; } uint8_t @@ -1285,7 +1265,7 @@ KeSynchronizeExecution(iobj, syncfunc, syncctx) MSCALL1(syncfunc, syncctx); KeReleaseSpinLock(&ntoskrnl_intlock, irql); - return(TRUE); + return (TRUE); } /* @@ -1313,7 +1293,7 @@ IoConnectInterrupt(kinterrupt **iobj, void *svcfunc, void *svcctx, *iobj = ExAllocatePoolWithTag(NonPagedPool, sizeof(kinterrupt), 0); if (*iobj == NULL) - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); (*iobj)->ki_svcfunc = svcfunc; (*iobj)->ki_svcctx = svcctx; @@ -1328,7 +1308,7 @@ IoConnectInterrupt(kinterrupt **iobj, void *svcfunc, void *svcctx, InsertHeadList((&ntoskrnl_intlist), (&(*iobj)->ki_list)); KeReleaseSpinLock(&ntoskrnl_intlock, curirql); - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } void @@ -1345,8 +1325,6 @@ IoDisconnectInterrupt(iobj) KeReleaseSpinLock(&ntoskrnl_intlock, irql); ExFreePool(iobj); - - return; } device_object * @@ -1363,7 +1341,7 @@ IoAttachDeviceToDeviceStack(src, dst) src->do_stacksize = attached->do_stacksize + 1; mtx_unlock(&ntoskrnl_dispatchlock); - return(attached); + return (attached); } void @@ -1392,8 +1370,6 @@ IoDetachDevice(topdev) } mtx_unlock(&ntoskrnl_dispatchlock); - - return; } /* @@ -1419,13 +1395,13 @@ ntoskrnl_is_signalled(obj, td) km = (kmutant *)obj; if ((obj->dh_sigstate <= 0 && km->km_ownerthread == td) || obj->dh_sigstate == 1) - return(TRUE); - return(FALSE); + return (TRUE); + return (FALSE); } if (obj->dh_sigstate > 0) - return(TRUE); - return(FALSE); + return (TRUE); + return (FALSE); } static void @@ -1460,8 +1436,6 @@ ntoskrnl_satisfy_wait(obj, td) default: break; } - - return; } static void @@ -1479,8 +1453,6 @@ ntoskrnl_satisfy_multiple_waits(wb) cur->wb_awakened = TRUE; cur = cur->wb_next; } while (cur != wb); - - return; } /* Always called with dispatcher lock held. */ @@ -1562,8 +1534,6 @@ ntoskrnl_waittest(obj, increment) e = e->nle_flink; } - - return; } /* @@ -1579,8 +1549,6 @@ ntoskrnl_time(tval) nanotime(&ts); *tval = (uint64_t)ts.tv_nsec / 100 + (uint64_t)ts.tv_sec * 10000000 + 11644473600 * 10000000; /* 100ns ticks from 1601 to 1970 */ - - return; } static void @@ -1666,7 +1634,7 @@ KeWaitForSingleObject(void *arg, uint32_t reason, uint32_t mode, obj = arg; if (obj == NULL) - return(STATUS_INVALID_PARAMETER); + return (STATUS_INVALID_PARAMETER); mtx_lock(&ntoskrnl_dispatchlock); @@ -1747,14 +1715,14 @@ KeWaitForSingleObject(void *arg, uint32_t reason, uint32_t mode, if (error == EWOULDBLOCK) { mtx_unlock(&ntoskrnl_dispatchlock); - return(STATUS_TIMEOUT); + return (STATUS_TIMEOUT); } mtx_unlock(&ntoskrnl_dispatchlock); - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); /* - return(KeWaitForMultipleObjects(1, &obj, WAITTYPE_ALL, reason, + return (KeWaitForMultipleObjects(1, &obj, WAITTYPE_ALL, reason, mode, alertable, duetime, &w)); */ } @@ -1776,9 +1744,9 @@ KeWaitForMultipleObjects(uint32_t cnt, nt_dispatch_header *obj[], uint32_t wtype wb_ext we; if (cnt > MAX_WAIT_OBJECTS) - return(STATUS_INVALID_PARAMETER); + return (STATUS_INVALID_PARAMETER); if (cnt > THREAD_WAIT_OBJECTS && wb_array == NULL) - return(STATUS_INVALID_PARAMETER); + return (STATUS_INVALID_PARAMETER); mtx_lock(&ntoskrnl_dispatchlock); @@ -1959,21 +1927,20 @@ wait_done: } mtx_unlock(&ntoskrnl_dispatchlock); - return(status); + return (status); } static void WRITE_REGISTER_USHORT(uint16_t *reg, uint16_t val) { bus_space_write_2(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg, val); - return; } static uint16_t READ_REGISTER_USHORT(reg) uint16_t *reg; { - return(bus_space_read_2(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg)); + return (bus_space_read_2(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg)); } static void @@ -1982,27 +1949,25 @@ WRITE_REGISTER_ULONG(reg, val) uint32_t val; { bus_space_write_4(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg, val); - return; } static uint32_t READ_REGISTER_ULONG(reg) uint32_t *reg; { - return(bus_space_read_4(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg)); + return (bus_space_read_4(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg)); } static uint8_t READ_REGISTER_UCHAR(uint8_t *reg) { - return(bus_space_read_1(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg)); + return (bus_space_read_1(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg)); } static void WRITE_REGISTER_UCHAR(uint8_t *reg, uint8_t val) { bus_space_write_1(NDIS_BUS_SPACE_MEM, 0x0, (bus_size_t)reg, val); - return; } static int64_t @@ -2090,7 +2055,7 @@ ntoskrnl_pushsl(head, entry) head->slh_list.slh_depth++; head->slh_list.slh_seq++; - return(oldhead); + return (oldhead); } static slist_entry * @@ -2106,7 +2071,7 @@ ntoskrnl_popsl(head) head->slh_list.slh_seq++; } - return(first); + return (first); } /* @@ -2129,11 +2094,11 @@ ntoskrnl_findwrap(func) patch = ntoskrnl_functbl; while (patch->ipt_func != NULL) { if ((funcptr)patch->ipt_func == func) - return((funcptr)patch->ipt_wrap); + return ((funcptr)patch->ipt_wrap); patch++; } - return(NULL); + return (NULL); } static void @@ -2167,8 +2132,6 @@ ExInitializePagedLookasideList(paged_lookaside_list *lookaside, lookaside->nll_l.gl_type = NonPagedPool; lookaside->nll_l.gl_depth = depth; lookaside->nll_l.gl_maxdepth = LOOKASIDE_DEPTH; - - return; } static void @@ -2181,8 +2144,6 @@ ExDeletePagedLookasideList(lookaside) freefunc = lookaside->nll_l.gl_freefunc; while((buf = ntoskrnl_popsl(&lookaside->nll_l.gl_listhead)) != NULL) MSCALL1(freefunc, buf); - - return; } static void @@ -2216,8 +2177,6 @@ ExInitializeNPagedLookasideList(npaged_lookaside_list *lookaside, lookaside->nll_l.gl_type = NonPagedPool; lookaside->nll_l.gl_depth = depth; lookaside->nll_l.gl_maxdepth = LOOKASIDE_DEPTH; - - return; } static void @@ -2230,8 +2189,6 @@ ExDeleteNPagedLookasideList(lookaside) freefunc = lookaside->nll_l.gl_freefunc; while((buf = ntoskrnl_popsl(&lookaside->nll_l.gl_listhead)) != NULL) MSCALL1(freefunc, buf); - - return; } slist_entry * @@ -2245,7 +2202,7 @@ InterlockedPushEntrySList(head, entry) oldhead = ntoskrnl_pushsl(head, entry); mtx_unlock_spin(&ntoskrnl_interlock); - return(oldhead); + return (oldhead); } slist_entry * @@ -2258,7 +2215,7 @@ InterlockedPopEntrySList(head) first = ntoskrnl_popsl(head); mtx_unlock_spin(&ntoskrnl_interlock); - return(first); + return (first); } static slist_entry * @@ -2267,7 +2224,7 @@ ExInterlockedPushEntrySList(head, entry, lock) slist_entry *entry; kspin_lock *lock; { - return(InterlockedPushEntrySList(head, entry)); + return (InterlockedPushEntrySList(head, entry)); } static slist_entry * @@ -2275,7 +2232,7 @@ ExInterlockedPopEntrySList(head, lock) slist_header *head; kspin_lock *lock; { - return(InterlockedPopEntrySList(head)); + return (InterlockedPopEntrySList(head)); } uint16_t @@ -2288,7 +2245,7 @@ ExQueryDepthSList(head) depth = head->slh_list.slh_depth; mtx_unlock_spin(&ntoskrnl_interlock); - return(depth); + return (depth); } void @@ -2296,8 +2253,6 @@ KeInitializeSpinLock(lock) kspin_lock *lock; { *lock = 0; - - return; } #ifdef __i386__ @@ -2317,8 +2272,6 @@ KefAcquireSpinLockAtDpcLevel(lock) panic("DEADLOCK!"); #endif } - - return; } void @@ -2326,8 +2279,6 @@ KefReleaseSpinLockFromDpcLevel(lock) kspin_lock *lock; { atomic_store_rel_int((volatile u_int *)lock, 0); - - return; } uint8_t @@ -2341,7 +2292,7 @@ KeAcquireSpinLockRaiseToDpc(kspin_lock *lock) KeRaiseIrql(DISPATCH_LEVEL, &oldirql); KeAcquireSpinLockAtDpcLevel(lock); - return(oldirql); + return (oldirql); } #else void @@ -2349,16 +2300,12 @@ KeAcquireSpinLockAtDpcLevel(kspin_lock *lock) { while (atomic_cmpset_acq_int((volatile u_int *)lock, 0, 1) == 0) /* sit and spin */; - - return; } void KeReleaseSpinLockFromDpcLevel(kspin_lock *lock) { atomic_store_rel_int((volatile u_int *)lock, 0); - - return; } #endif /* __i386__ */ @@ -2374,7 +2321,7 @@ InterlockedExchange(dst, val) *dst = val; mtx_unlock_spin(&ntoskrnl_interlock); - return(r); + return (r); } static uint32_t @@ -2382,7 +2329,7 @@ InterlockedIncrement(addend) volatile uint32_t *addend; { atomic_add_long((volatile u_long *)addend, 1); - return(*addend); + return (*addend); } static uint32_t @@ -2390,7 +2337,7 @@ InterlockedDecrement(addend) volatile uint32_t *addend; { atomic_subtract_long((volatile u_long *)addend, 1); - return(*addend); + return (*addend); } static void @@ -2401,8 +2348,6 @@ ExInterlockedAddLargeStatistic(addend, inc) mtx_lock_spin(&ntoskrnl_interlock); *addend += inc; mtx_unlock_spin(&ntoskrnl_interlock); - - return; }; mdl * @@ -2462,8 +2407,6 @@ IoFreeMdl(m) uma_zfree(mdl_zone, m); else ExFreePool(m); - - return; } static void * @@ -2476,7 +2419,7 @@ MmAllocateContiguousMemory(size, highest) addr = ExAllocatePoolWithTag(NonPagedPool, pagelength, 0); - return(addr); + return (addr); } static void * @@ -2493,7 +2436,7 @@ MmAllocateContiguousMemorySpecifyCache(size, lowest, highest, addr = ExAllocatePoolWithTag(NonPagedPool, pagelength, 0); - return(addr); + return (addr); } static void @@ -2522,7 +2465,7 @@ MmSizeOfMdl(vaddr, len) l = sizeof(struct mdl) + (sizeof(vm_offset_t *) * SPAN_PAGES(vaddr, len)); - return(l); + return (l); } /* @@ -2551,22 +2494,20 @@ MmBuildMdlForNonPagedPool(m) m->mdl_flags |= MDL_SOURCE_IS_NONPAGED_POOL; m->mdl_mappedsystemva = MmGetMdlVirtualAddress(m); - - return; } static void * MmMapLockedPages(mdl *buf, uint8_t accessmode) { buf->mdl_flags |= MDL_MAPPED_TO_SYSTEM_VA; - return(MmGetMdlVirtualAddress(buf)); + return (MmGetMdlVirtualAddress(buf)); } static void * MmMapLockedPagesSpecifyCache(mdl *buf, uint8_t accessmode, uint32_t cachetype, void *vaddr, uint32_t bugcheck, uint32_t prio) { - return(MmMapLockedPages(buf, accessmode)); + return (MmMapLockedPages(buf, accessmode)); } static void @@ -2575,7 +2516,6 @@ MmUnmapLockedPages(vaddr, buf) mdl *buf; { buf->mdl_flags &= ~MDL_MAPPED_TO_SYSTEM_VA; - return; } /* @@ -2592,9 +2532,9 @@ MmIsAddressValid(vaddr) void *vaddr; { if (pmap_extract(kernel_map->pmap, (vm_offset_t)vaddr)) - return(TRUE); + return (TRUE); - return(FALSE); + return (FALSE); } void * @@ -2626,13 +2566,13 @@ MmMapIoSpace(paddr, len, cachetype) free(nexus_devs, M_TEMP); if (matching_dev == NULL) - return(NULL); + return (NULL); v = (vm_offset_t)rman_get_virtual(res); if (paddr > rman_get_start(res)) v += paddr - rman_get_start(res); - return((void *)v); + return ((void *)v); } void @@ -2640,7 +2580,6 @@ MmUnmapIoSpace(vaddr, len) void *vaddr; size_t len; { - return; } @@ -2662,7 +2601,7 @@ ntoskrnl_finddev(dev, paddr, res) /* We only want devices that have been successfully probed. */ if (device_is_alive(dev) == FALSE) - return(NULL); + return (NULL); rl = BUS_GET_RESOURCE_LIST(device_get_parent(dev), dev); if (rl != NULL) { @@ -2685,7 +2624,7 @@ ntoskrnl_finddev(dev, paddr, res) bus_activate_resource(dev, SYS_RES_MEMORY, 0, r); *res = r; - return(dev); + return (dev); } } } @@ -2701,7 +2640,7 @@ ntoskrnl_finddev(dev, paddr, res) matching_dev = ntoskrnl_finddev(children[i], paddr, res); if (matching_dev != NULL) { free(children, M_TEMP); - return(matching_dev); + return (matching_dev); } } @@ -2711,7 +2650,7 @@ ntoskrnl_finddev(dev, paddr, res) if (children != NULL) free(children, M_TEMP); - return(NULL); + return (NULL); } /* @@ -2782,8 +2721,6 @@ ntoskrnl_destroy_workitem_threads(void) while (kq->kq_exit) tsleep(kq->kq_td->td_proc, PWAIT, "waitiw", hz/10); } - - return; } io_workitem * @@ -2794,7 +2731,7 @@ IoAllocateWorkItem(dobj) iw = uma_zalloc(iw_zone, M_NOWAIT); if (iw == NULL) - return(NULL); + return (NULL); InitializeListHead(&iw->iw_listentry); iw->iw_dobj = dobj; @@ -2804,7 +2741,7 @@ IoAllocateWorkItem(dobj) WORKIDX_INC(wq_idx); mtx_unlock(&ntoskrnl_dispatchlock); - return(iw); + return (iw); } void @@ -2812,7 +2749,6 @@ IoFreeWorkItem(iw) io_workitem *iw; { uma_zfree(iw_zone, iw); - return; } void @@ -2855,8 +2791,6 @@ IoQueueWorkItem(iw, iw_func, qtype, ctx) KeReleaseSpinLock(&kq->kq_lock, irql); KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE); - - return; } static void @@ -2873,8 +2807,6 @@ ntoskrnl_workitem(dobj, arg) f = (work_item_func)w->wqi_func; uma_zfree(iw_zone, iw); MSCALL2(f, w, w->wqi_ctx); - - return; } /* @@ -2945,8 +2877,6 @@ ExQueueWorkItem(w, qtype) iw->iw_idx = WORKITEM_LEGACY_THREAD; iwf = (io_workitem_func)ntoskrnl_findwrap((funcptr)ntoskrnl_workitem); IoQueueWorkItem(iw, iwf, qtype, iw); - - return; } static void @@ -2955,7 +2885,6 @@ RtlZeroMemory(dst, len) size_t len; { bzero(dst, len); - return; } static void @@ -2965,7 +2894,6 @@ RtlCopyMemory(dst, src, len) size_t len; { bcopy(src, dst, len); - return; } static size_t @@ -2984,7 +2912,7 @@ RtlCompareMemory(s1, s2, len) if (m1[i] == m2[i]) total++; } - return(total); + return (total); } void @@ -3004,8 +2932,6 @@ RtlInitAnsiString(dst, src) a->as_buf = src; a->as_len = a->as_maxlen = strlen(src); } - - return; } void @@ -3029,8 +2955,6 @@ RtlInitUnicodeString(dst, src) u->us_buf = src; u->us_len = u->us_maxlen = i * 2; } - - return; } ndis_status @@ -3084,7 +3008,7 @@ RtlUnicodeStringToInteger(ustr, base, val) ntoskrnl_unicode_to_ascii(uchr, astr, len); *val = strtoul(abuf, NULL, base); - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } void @@ -3095,7 +3019,6 @@ RtlFreeUnicodeString(ustr) return; ExFreePool(ustr->us_buf); ustr->us_buf = NULL; - return; } void @@ -3106,7 +3029,6 @@ RtlFreeAnsiString(astr) return; ExFreePool(astr->as_buf); astr->as_buf = NULL; - return; } static int @@ -3130,7 +3052,7 @@ rand(void) microtime(&tv); srandom(tv.tv_usec); - return((int)random()); + return ((int)random()); } static void @@ -3138,15 +3060,14 @@ srand(seed) unsigned int seed; { srandom(seed); - return; } static uint8_t IoIsWdmVersionAvailable(uint8_t major, uint8_t minor) { if (major == WDM_MAJOR && minor == WDM_MINOR_WINXP) - return(TRUE); - return(FALSE); + return (TRUE); + return (FALSE); } static ndis_status @@ -3156,7 +3077,7 @@ IoGetDeviceObjectPointer(name, reqaccess, fileobj, devobj) void *fileobj; device_object *devobj; { - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } static ndis_status @@ -3179,11 +3100,11 @@ IoGetDeviceProperty(devobj, regprop, buflen, prop, reslen) *reslen = drv->dro_drivername.us_len; break; default: - return(STATUS_INVALID_PARAMETER_2); + return (STATUS_INVALID_PARAMETER_2); break; } - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } static void @@ -3198,7 +3119,6 @@ KeInitializeMutex(kmutex, level) kmutex->km_header.dh_type = DISP_TYPE_MUTANT; kmutex->km_header.dh_size = sizeof(kmutant) / sizeof(uint32_t); kmutex->km_ownerthread = NULL; - return; } static uint32_t @@ -3210,7 +3130,7 @@ KeReleaseMutex(kmutant *kmutex, uint8_t kwait) prevstate = kmutex->km_header.dh_sigstate; if (kmutex->km_ownerthread != curthread) { mtx_unlock(&ntoskrnl_dispatchlock); - return(STATUS_MUTANT_NOT_OWNED); + return (STATUS_MUTANT_NOT_OWNED); } kmutex->km_header.dh_sigstate++; @@ -3223,14 +3143,14 @@ KeReleaseMutex(kmutant *kmutex, uint8_t kwait) mtx_unlock(&ntoskrnl_dispatchlock); - return(prevstate); + return (prevstate); } static uint32_t KeReadStateMutex(kmutex) kmutant *kmutex; { - return(kmutex->km_header.dh_sigstate); + return (kmutex->km_header.dh_sigstate); } void @@ -3243,7 +3163,6 @@ KeInitializeEvent(nt_kevent *kevent, uint32_t type, uint8_t state) else kevent->k_header.dh_type = DISP_TYPE_SYNCHRONIZATION_EVENT; kevent->k_header.dh_size = sizeof(nt_kevent) / sizeof(uint32_t); - return; } uint32_t @@ -3257,7 +3176,7 @@ KeResetEvent(kevent) kevent->k_header.dh_sigstate = FALSE; mtx_unlock(&ntoskrnl_dispatchlock); - return(prevstate); + return (prevstate); } uint32_t @@ -3310,7 +3229,7 @@ KeSetEvent(nt_kevent *kevent, uint32_t increment, uint8_t kwait) mtx_unlock(&ntoskrnl_dispatchlock); - return(prevstate); + return (prevstate); } void @@ -3318,14 +3237,13 @@ KeClearEvent(kevent) nt_kevent *kevent; { kevent->k_header.dh_sigstate = FALSE; - return; } uint32_t KeReadStateEvent(kevent) nt_kevent *kevent; { - return(kevent->k_header.dh_sigstate); + return (kevent->k_header.dh_sigstate); } /* @@ -3370,7 +3288,7 @@ ObReferenceObjectByHandle(ndis_handle handle, uint32_t reqaccess, void *otype, nr = malloc(sizeof(nt_objref), M_DEVBUF, M_NOWAIT|M_ZERO); if (nr == NULL) - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); InitializeListHead((&nr->no_dh.dh_waitlisthead)); nr->no_obj = handle; @@ -3381,7 +3299,7 @@ ObReferenceObjectByHandle(ndis_handle handle, uint32_t reqaccess, void *otype, TAILQ_INSERT_TAIL(&ntoskrnl_reflist, nr, link); *object = nr; - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } static void @@ -3393,15 +3311,13 @@ ObfDereferenceObject(object) nr = object; TAILQ_REMOVE(&ntoskrnl_reflist, nr, link); free(nr, M_DEVBUF); - - return; } static uint32_t ZwClose(handle) ndis_handle handle; { - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } static uint32_t @@ -3412,14 +3328,14 @@ WmiQueryTraceInformation(traceclass, traceinfo, infolen, reqlen, buf) uint32_t reqlen; void *buf; { - return(STATUS_NOT_FOUND); + return (STATUS_NOT_FOUND); } static uint32_t WmiTraceMessage(uint64_t loghandle, uint32_t messageflags, void *guid, uint16_t messagenum, ...) { - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } static uint32_t @@ -3427,7 +3343,7 @@ IoWMIRegistrationControl(dobj, action) device_object *dobj; uint32_t action; { - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } /* @@ -3472,7 +3388,7 @@ PsCreateSystemThread(handle, reqaccess, objattrs, phandle, tc = malloc(sizeof(thread_context), M_TEMP, M_NOWAIT); if (tc == NULL) - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); tc->tc_thrctx = thrctx; tc->tc_thrfunc = thrfunc; @@ -3483,13 +3399,13 @@ PsCreateSystemThread(handle, reqaccess, objattrs, phandle, if (error) { free(tc, M_TEMP); - return(STATUS_INSUFFICIENT_RESOURCES); + return (STATUS_INSUFFICIENT_RESOURCES); } *handle = p; ntoskrnl_kth++; - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } /* @@ -3522,7 +3438,7 @@ PsTerminateSystemThread(status) mtx_lock(&Giant); #endif kproc_exit(0); - return(0); /* notreached */ + return (0); /* notreached */ } static uint32_t @@ -3535,7 +3451,7 @@ DbgPrint(char *fmt, ...) vprintf(fmt, ap); } - return(STATUS_SUCCESS); + return (STATUS_SUCCESS); } static void @@ -3625,8 +3541,6 @@ ntoskrnl_timercall(arg) if (dpc != NULL) KeInsertQueueDpc(dpc, NULL, NULL); - - return; } #ifdef NTOSKRNL_DEBUG_TIMERS @@ -3661,8 +3575,6 @@ ntoskrnl_show_timers() printf("timer cancels: %qu\n", ntoskrnl_timer_cancels); printf("timer fires: %qu\n", ntoskrnl_timer_fires); printf("\n"); - - return; } #endif @@ -3700,8 +3612,6 @@ ntoskrnl_insert_timer(timer, ticks) callout_init(c, CALLOUT_MPSAFE); callout_reset(c, ticks, ntoskrnl_timercall, timer); - - return; } static void @@ -3716,8 +3626,6 @@ ntoskrnl_remove_timer(timer) mtx_lock_spin(&ntoskrnl_calllock); InsertHeadList((&ntoskrnl_calllist), (&e->ce_list)); mtx_unlock_spin(&ntoskrnl_calllock); - - return; } void @@ -3728,8 +3636,6 @@ KeInitializeTimer(timer) return; KeInitializeTimerEx(timer, EVENT_TYPE_NOTIFY); - - return; } void @@ -3749,8 +3655,6 @@ KeInitializeTimerEx(timer, type) else timer->k_header.dh_type = DISP_TYPE_SYNCHRONIZATION_TIMER; timer->k_header.dh_size = sizeof(ktimer) / sizeof(uint32_t); - - return; } /* @@ -3867,8 +3771,6 @@ ntoskrnl_destroy_dpc_threads(void) while (kq->kq_exit) tsleep(kq->kq_td->td_proc, PWAIT, "dpcw", hz/10); } - - return; } static uint8_t @@ -3883,7 +3785,7 @@ ntoskrnl_insert_dpc(head, dpc) while (l != head) { d = CONTAINING_RECORD(l, kdpc, k_dpclistentry); if (d == dpc) - return(FALSE); + return (FALSE); l = l->nle_flink; } @@ -3910,8 +3812,6 @@ KeInitializeDpc(dpc, dpcfunc, dpcctx) dpc->k_num = KDPC_CPU_DEFAULT; dpc->k_importance = KDPC_IMPORTANCE_MEDIUM; InitializeListHead((&dpc->k_dpclistentry)); - - return; } uint8_t @@ -3925,7 +3825,7 @@ KeInsertQueueDpc(dpc, sysarg1, sysarg2) uint8_t irql; if (dpc == NULL) - return(FALSE); + return (FALSE); kq = kq_queues; @@ -3954,11 +3854,11 @@ KeInsertQueueDpc(dpc, sysarg1, sysarg2) KeReleaseSpinLock(&kq->kq_lock, irql); if (r == FALSE) - return(r); + return (r); KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE); - return(r); + return (r); } uint8_t @@ -3969,7 +3869,7 @@ KeRemoveQueueDpc(dpc) uint8_t irql; if (dpc == NULL) - return(FALSE); + return (FALSE); #ifdef NTOSKRNL_MULTIPLE_DPCS KeRaiseIrql(DISPATCH_LEVEL, &irql); @@ -3985,7 +3885,7 @@ KeRemoveQueueDpc(dpc) if (dpc->k_dpclistentry.nle_flink == &dpc->k_dpclistentry) { KeReleaseSpinLockFromDpcLevel(&kq->kq_lock); KeLowerIrql(irql); - return(FALSE); + return (FALSE); } RemoveEntryList((&dpc->k_dpclistentry)); @@ -3993,7 +3893,7 @@ KeRemoveQueueDpc(dpc) KeReleaseSpinLock(&kq->kq_lock, irql); - return(TRUE); + return (TRUE); } void @@ -4007,7 +3907,6 @@ KeSetImportanceDpc(dpc, imp) return; dpc->k_importance = (uint8_t)imp; - return; } void @@ -4017,7 +3916,6 @@ KeSetTargetProcessorDpc(kdpc *dpc, uint8_t cpu) return; dpc->k_num = cpu; - return; } void @@ -4040,14 +3938,12 @@ KeFlushQueuedDpcs(void) KeSetEvent(&kq->kq_proc, IO_NO_INCREMENT, FALSE); KeWaitForSingleObject(&kq->kq_done, 0, 0, TRUE, NULL); } - - return; } uint32_t KeGetCurrentProcessorNumber(void) { - return((uint32_t)curthread->td_oncpu); + return ((uint32_t)curthread->td_oncpu); } uint8_t @@ -4062,7 +3958,7 @@ KeSetTimerEx(timer, duetime, period, dpc) uint8_t pending; if (timer == NULL) - return(FALSE); + return (FALSE); mtx_lock(&ntoskrnl_dispatchlock); @@ -4104,7 +4000,7 @@ KeSetTimerEx(timer, duetime, period, dpc) mtx_unlock(&ntoskrnl_dispatchlock); - return(pending); + return (pending); } uint8_t @@ -4129,7 +4025,7 @@ KeCancelTimer(timer) uint8_t pending; if (timer == NULL) - return(FALSE); + return (FALSE); mtx_lock(&ntoskrnl_dispatchlock); @@ -4145,14 +4041,14 @@ KeCancelTimer(timer) mtx_unlock(&ntoskrnl_dispatchlock); - return(pending); + return (pending); } uint8_t KeReadStateTimer(timer) ktimer *timer; { - return(timer->k_header.dh_sigstate); + return (timer->k_header.dh_sigstate); } static int32_t @@ -4222,8 +4118,7 @@ KeSetPriorityThread(td, pri) static void dummy() { - printf ("ntoskrnl dummy called...\n"); - return; + printf("ntoskrnl dummy called...\n"); } diff --git a/sys/compat/ndis/subr_pe.c b/sys/compat/ndis/subr_pe.c index 6a347a427eb2..fcbaef28acc3 100644 --- a/sys/compat/ndis/subr_pe.c +++ b/sys/compat/ndis/subr_pe.c @@ -89,7 +89,7 @@ pe_get_dos_header(imgbase, hdr) bcopy ((char *)imgbase, (char *)hdr, sizeof(image_dos_header)); - return(0); + return (0); } /* @@ -111,10 +111,10 @@ pe_is_nt_image(imgbase) dos_hdr = (image_dos_header *)imgbase; signature = *(uint32_t *)(imgbase + dos_hdr->idh_lfanew); if (signature == IMAGE_NT_SIGNATURE) - return(0); + return (0); } - return(ENOEXEC); + return (ENOEXEC); } /* @@ -132,7 +132,7 @@ pe_get_optional_header(imgbase, hdr) image_nt_header *nt_hdr; if (imgbase == 0 || hdr == NULL) - return(EINVAL); + return (EINVAL); if (pe_is_nt_image(imgbase)) return (EINVAL); @@ -143,7 +143,7 @@ pe_get_optional_header(imgbase, hdr) bcopy ((char *)&nt_hdr->inh_optionalhdr, (char *)hdr, nt_hdr->inh_filehdr.ifh_optionalhdrlen); - return(0); + return (0); } /* @@ -160,7 +160,7 @@ pe_get_file_header(imgbase, hdr) image_nt_header *nt_hdr; if (imgbase == 0 || hdr == NULL) - return(EINVAL); + return (EINVAL); if (pe_is_nt_image(imgbase)) return (EINVAL); @@ -179,7 +179,7 @@ pe_get_file_header(imgbase, hdr) bcopy ((char *)&nt_hdr->inh_filehdr, (char *)hdr, sizeof(image_file_header)); - return(0); + return (0); } /* @@ -197,7 +197,7 @@ pe_get_section_header(imgbase, hdr) image_section_header *sect_hdr; if (imgbase == 0 || hdr == NULL) - return(EINVAL); + return (EINVAL); if (pe_is_nt_image(imgbase)) return (EINVAL); @@ -208,7 +208,7 @@ pe_get_section_header(imgbase, hdr) bcopy ((char *)sect_hdr, (char *)hdr, sizeof(image_section_header)); - return(0); + return (0); } /* @@ -222,7 +222,7 @@ pe_numsections(imgbase) image_file_header file_hdr; if (pe_get_file_header(imgbase, &file_hdr)) - return(0); + return (0); return (file_hdr.ifh_numsections); } @@ -239,7 +239,7 @@ pe_imagebase(imgbase) image_optional_header optional_hdr; if (pe_get_optional_header(imgbase, &optional_hdr)) - return(0); + return (0); return (optional_hdr.ioh_imagebase); } @@ -258,14 +258,14 @@ pe_directory_offset(imgbase, diridx) vm_offset_t dir; if (pe_get_optional_header(imgbase, &opt_hdr)) - return(0); + return (0); if (diridx >= opt_hdr.ioh_rva_size_cnt) - return(0); + return (0); dir = opt_hdr.ioh_datadir[diridx].idd_vaddr; - return(pe_translate_addr(imgbase, dir)); + return (pe_translate_addr(imgbase, dir)); } vm_offset_t @@ -280,7 +280,7 @@ pe_translate_addr(imgbase, rva) int i = 0, sections, fixedlen; if (pe_get_optional_header(imgbase, &opt_hdr)) - return(0); + return (0); sections = pe_numsections(imgbase); @@ -310,9 +310,9 @@ pe_translate_addr(imgbase, rva) } if (i > sections) - return(0); + return (0); - return((vm_offset_t)(imgbase + rva - sect_hdr->ish_vaddr + + return ((vm_offset_t)(imgbase + rva - sect_hdr->ish_vaddr + sect_hdr->ish_rawdataaddr)); } @@ -335,7 +335,7 @@ pe_get_section(imgbase, hdr, name) int i, sections; if (imgbase == 0 || hdr == NULL) - return(EINVAL); + return (EINVAL); if (pe_is_nt_image(imgbase)) return (EINVAL); @@ -350,7 +350,7 @@ pe_get_section(imgbase, hdr, name) if (!strcmp ((char *)§_hdr->ish_name, name)) { bcopy((char *)sect_hdr, (char *)hdr, sizeof(image_section_header)); - return(0); + return (0); } else sect_hdr++; } @@ -420,7 +420,7 @@ pe_relocate(imgbase) break; default: - printf ("[%d]reloc type: %d\n",i, + printf("[%d]reloc type: %d\n",i, IMR_RELTYPE(rel)); break; } @@ -429,7 +429,7 @@ pe_relocate(imgbase) relhdr->ibr_blocksize); } while (relhdr->ibr_blocksize); - return(0); + return (0); } /* @@ -452,7 +452,7 @@ pe_get_import_descriptor(imgbase, desc, module) char *modname; if (imgbase == 0 || module == NULL || desc == NULL) - return(EINVAL); + return (EINVAL); offset = pe_directory_offset(imgbase, IMAGE_DIRECTORY_ENTRY_IMPORT); if (offset == 0) @@ -466,7 +466,7 @@ pe_get_import_descriptor(imgbase, desc, module) if (!strncasecmp(module, modname, strlen(module))) { bcopy((char *)imp_desc, (char *)desc, sizeof(image_import_descriptor)); - return(0); + return (0); } imp_desc++; } @@ -486,7 +486,7 @@ pe_get_messagetable(imgbase, md) int i; if (imgbase == 0) - return(EINVAL); + return (EINVAL); offset = pe_directory_offset(imgbase, IMAGE_DIRECTORY_ENTRY_RESOURCE); if (offset == 0) @@ -514,10 +514,10 @@ pe_get_messagetable(imgbase, md) dent2->irde_dataoff); *md = (message_resource_data *)pe_translate_addr(imgbase, rent->irde_offset); - return(0); + return (0); } - return(ENOENT); + return (ENOENT); } int @@ -536,7 +536,7 @@ pe_get_message(imgbase, id, str, len, flags) pe_get_messagetable(imgbase, &md); if (md == NULL) - return(ENOENT); + return (ENOENT); mb = (message_resource_block *)((uintptr_t)md + sizeof(message_resource_data)); @@ -551,12 +551,12 @@ pe_get_message(imgbase, id, str, len, flags) *str = me->mre_text; *len = me->mre_len; *flags = me->mre_flags; - return(0); + return (0); } mb++; } - return(ENOENT); + return (ENOENT); } /* @@ -573,16 +573,16 @@ pe_functbl_match(functbl, name) image_patch_table *p; if (functbl == NULL || name == NULL) - return(0); + return (0); p = functbl; while (p->ipt_name != NULL) { if (!strcmp(p->ipt_name, name)) - return((vm_offset_t)p->ipt_wrap); + return ((vm_offset_t)p->ipt_wrap); p++; } - printf ("no match for %s\n", name); + printf("no match for %s\n", name); /* * Return the wrapper pointer for this routine. @@ -591,7 +591,7 @@ pe_functbl_match(functbl, name) * that does calling convention translation and * then invokes the underlying routine. */ - return((vm_offset_t)p->ipt_wrap); + return ((vm_offset_t)p->ipt_wrap); } /* @@ -615,10 +615,10 @@ pe_patch_imports(imgbase, module, functbl) vm_offset_t func; if (imgbase == 0 || module == NULL || functbl == NULL) - return(EINVAL); + return (EINVAL); if (pe_get_import_descriptor(imgbase, &imp_desc, module)) - return(ENOEXEC); + return (ENOEXEC); nptr = (vm_offset_t *)pe_translate_addr(imgbase, imp_desc.iid_import_name_table_addr); @@ -632,11 +632,11 @@ pe_patch_imports(imgbase, module, functbl) *fptr = func; #ifdef notdef if (*fptr == 0) - return(ENOENT); + return (ENOENT); #endif nptr++; fptr++; } - return(0); + return (0); } diff --git a/sys/compat/ndis/subr_usbd.c b/sys/compat/ndis/subr_usbd.c index 1aae86865151..3b38aab7c801 100644 --- a/sys/compat/ndis/subr_usbd.c +++ b/sys/compat/ndis/subr_usbd.c @@ -206,7 +206,7 @@ usbd_libinit(void) usbd_driver.dro_dispatch[IRP_MJ_PNP] = (driver_dispatch)usbd_pnp_wrap; - return(0); + return (0); } int @@ -230,7 +230,7 @@ usbd_libfini(void) free(usbd_driver.dro_drivername.us_buf, M_DEVBUF); - return(0); + return (0); } static int32_t @@ -589,7 +589,7 @@ usbd_func_selconf(ip) intf->uii_len); } - return USBD_STATUS_SUCCESS; + return (USBD_STATUS_SUCCESS); } static usb_error_t @@ -1348,10 +1348,10 @@ USBD_CreateConfigurationRequest(conf, len) -1, -1, -1, -1, -1); urb = USBD_CreateConfigurationRequestEx(conf, list); if (urb == NULL) - return NULL; + return (NULL); *len = urb->uu_selconf.usc_hdr.uuh_len; - return urb; + return (urb); } static union usbd_urb * @@ -1375,7 +1375,7 @@ USBD_CreateConfigurationRequestEx(conf, list) selconf = ExAllocatePoolWithTag(NonPagedPool, size, 0); if (selconf == NULL) - return NULL; + return (NULL); selconf->usc_hdr.uuh_func = URB_FUNCTION_SELECT_CONFIGURATION; selconf->usc_hdr.uuh_len = size; selconf->usc_handle = conf; @@ -1421,8 +1421,6 @@ USBD_GetUSBDIVersion(ui) ui->uvi_usbdi_vers = USBDI_VERSION; ui->uvi_supported_vers = USB_VER_2_0; - - return; } static usb_interface_descriptor_t * @@ -1473,7 +1471,6 @@ static void dummy(void) { printf("USBD dummy called\n"); - return; } image_patch_table usbd_functbl[] = { diff --git a/sys/compat/svr4/svr4_misc.c b/sys/compat/svr4/svr4_misc.c index 62bd010bd6df..6f80fe64e667 100644 --- a/sys/compat/svr4/svr4_misc.c +++ b/sys/compat/svr4/svr4_misc.c @@ -708,7 +708,7 @@ svr4_sys_sysconfig(td, uap) switch (uap->name) { case SVR4_CONFIG_NGROUPS: - *retval = NGROUPS_MAX; + *retval = ngroups_max; break; case SVR4_CONFIG_CHILD_MAX: *retval = maxproc; diff --git a/sys/compat/svr4/svr4_termios.c b/sys/compat/svr4/svr4_termios.c index 37a6783aff11..8195a410e70a 100644 --- a/sys/compat/svr4/svr4_termios.c +++ b/sys/compat/svr4/svr4_termios.c @@ -34,7 +34,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include diff --git a/sys/compat/svr4/syscalls.master b/sys/compat/svr4/syscalls.master index 0a88a45ae20a..2d6afee38a72 100644 --- a/sys/compat/svr4/syscalls.master +++ b/sys/compat/svr4/syscalls.master @@ -22,7 +22,6 @@ ; types: ; STD always included ; COMPAT included on COMPAT #ifdef -; LIBCOMPAT included on COMPAT #ifdef, and placed in syscall.h ; OBSOL obsolete, not included in system, only specifies name ; UNIMPL not implemented, placeholder only diff --git a/sys/compat/x86bios/x86bios.c b/sys/compat/x86bios/x86bios.c index b187ae9093fc..34da07c3d409 100644 --- a/sys/compat/x86bios/x86bios.c +++ b/sys/compat/x86bios/x86bios.c @@ -1,6 +1,28 @@ /*- - * Written by paradox - * Public domain. + * Copyright (c) 2009 Alex Keda + * Copyright (c) 2009 Jung-uk Kim + * 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. */ #include @@ -9,29 +31,164 @@ __FBSDID("$FreeBSD$"); #include "opt_x86bios.h" #include +#include #include #include +#include #include #include - -#include -#include - -#include +#include +#include #include #include #include -u_char *pbiosMem = NULL; -static u_char *pbiosStack = NULL; +#include +#include -int busySegMap[5]; +#include + +#include +#include + +#define X86BIOS_PAGE_SIZE 0x00001000 /* 4K */ + +#define X86BIOS_IVT_SIZE 0x00000500 /* 1K + 256 (BDA) */ +#define X86BIOS_SEG_SIZE 0x00010000 /* 64K */ +#define X86BIOS_MEM_SIZE 0x00100000 /* 1M */ + +#define X86BIOS_IVT_BASE 0x00000000 +#define X86BIOS_RAM_BASE 0x00001000 +#define X86BIOS_ROM_BASE 0x000a0000 /* XXX EBDA? */ + +#define X86BIOS_ROM_SIZE (X86BIOS_MEM_SIZE - X86BIOS_ROM_BASE) + +#define X86BIOS_PAGES (X86BIOS_MEM_SIZE / X86BIOS_PAGE_SIZE) + +#define X86BIOS_R_DS _pad1 +#define X86BIOS_R_SS _pad2 static struct x86emu x86bios_emu; static struct mtx x86bios_lock; +static void *x86bios_ivt; +static void *x86bios_rom; +static void *x86bios_seg; + +static vm_offset_t *x86bios_map; + +static vm_paddr_t x86bios_seg_phys; + +SYSCTL_NODE(_debug, OID_AUTO, x86bios, CTLFLAG_RD, NULL, "x86bios debugging"); +static int x86bios_trace_call; +TUNABLE_INT("debug.x86bios.call", &x86bios_trace_call); +SYSCTL_INT(_debug_x86bios, OID_AUTO, call, CTLFLAG_RW, &x86bios_trace_call, 0, + "Trace far function calls"); +static int x86bios_trace_int; +TUNABLE_INT("debug.x86bios.int", &x86bios_trace_int); +SYSCTL_INT(_debug_x86bios, OID_AUTO, int, CTLFLAG_RW, &x86bios_trace_int, 0, + "Trace software interrupt handlers"); + +static void * +x86bios_get_pages(uint32_t offset, size_t size) +{ + int i; + + if (offset + size > X86BIOS_MEM_SIZE) + return (NULL); + + i = offset / X86BIOS_PAGE_SIZE; + if (x86bios_map[i] != 0) + return ((void *)(x86bios_map[i] + offset - + i * X86BIOS_PAGE_SIZE)); + + return (NULL); +} + +static void +x86bios_set_pages(vm_offset_t va, vm_paddr_t pa, size_t size) +{ + int i, j; + + for (i = pa / X86BIOS_PAGE_SIZE, j = 0; + j < howmany(size, X86BIOS_PAGE_SIZE); i++, j++) + x86bios_map[i] = va + j * X86BIOS_PAGE_SIZE; +} + +static uint8_t +x86bios_emu_rdb(struct x86emu *emu, uint32_t addr) +{ + uint8_t *va; + + va = x86bios_get_pages(addr, sizeof(*va)); + if (va == NULL) + x86emu_halt_sys(emu); + + return (*va); +} + +static uint16_t +x86bios_emu_rdw(struct x86emu *emu, uint32_t addr) +{ + uint16_t *va; + + va = x86bios_get_pages(addr, sizeof(*va)); + if (va == NULL) + x86emu_halt_sys(emu); + + return (le16toh(*va)); +} + +static uint32_t +x86bios_emu_rdl(struct x86emu *emu, uint32_t addr) +{ + uint32_t *va; + + va = x86bios_get_pages(addr, sizeof(*va)); + if (va == NULL) + x86emu_halt_sys(emu); + + return (le32toh(*va)); +} + +static void +x86bios_emu_wrb(struct x86emu *emu, uint32_t addr, uint8_t val) +{ + uint8_t *va; + + va = x86bios_get_pages(addr, sizeof(*va)); + if (va == NULL) + x86emu_halt_sys(emu); + + *va = val; +} + +static void +x86bios_emu_wrw(struct x86emu *emu, uint32_t addr, uint16_t val) +{ + uint16_t *va; + + va = x86bios_get_pages(addr, sizeof(*va)); + if (va == NULL) + x86emu_halt_sys(emu); + + *va = htole16(val); +} + +static void +x86bios_emu_wrl(struct x86emu *emu, uint32_t addr, uint32_t val) +{ + uint32_t *va; + + va = x86bios_get_pages(addr, sizeof(*va)); + if (va == NULL) + x86emu_halt_sys(emu); + + *va = htole32(val); +} + static uint8_t x86bios_emu_inb(struct x86emu *emu, uint16_t port) { @@ -40,6 +197,7 @@ x86bios_emu_inb(struct x86emu *emu, uint16_t port) return (0); if (port >= 0x80 && port < 0x88) /* POST status register */ return (0); + return (inb(port)); } @@ -49,6 +207,7 @@ x86bios_emu_inw(struct x86emu *emu, uint16_t port) if (port >= 0x80 && port < 0x88) /* POST status register */ return (0); + return (inw(port)); } @@ -58,6 +217,7 @@ x86bios_emu_inl(struct x86emu *emu, uint16_t port) if (port >= 0x80 && port < 0x88) /* POST status register */ return (0); + return (inl(port)); } @@ -69,6 +229,7 @@ x86bios_emu_outb(struct x86emu *emu, uint16_t port, uint8_t val) return; if (port >= 0x80 && port < 0x88) /* POST status register */ return; + outb(port, val); } @@ -78,6 +239,7 @@ x86bios_emu_outw(struct x86emu *emu, uint16_t port, uint16_t val) if (port >= 0x80 && port < 0x88) /* POST status register */ return; + outw(port, val); } @@ -87,9 +249,109 @@ x86bios_emu_outl(struct x86emu *emu, uint16_t port, uint32_t val) if (port >= 0x80 && port < 0x88) /* POST status register */ return; + outl(port, val); } +static void +x86bios_emu_get_intr(struct x86emu *emu, int intno) +{ + uint16_t *sp; + uint32_t iv; + + emu->x86.R_SP -= 6; + + sp = (uint16_t *)((vm_offset_t)x86bios_seg + emu->x86.R_SP); + sp[0] = htole16(emu->x86.R_IP); + sp[1] = htole16(emu->x86.R_CS); + sp[2] = htole16(emu->x86.R_FLG); + + iv = x86bios_get_intr(intno); + emu->x86.R_IP = iv & 0x000f; + emu->x86.R_CS = (iv >> 12) & 0xffff; + emu->x86.R_FLG &= ~(F_IF | F_TF); +} + +void * +x86bios_alloc(uint32_t *offset, size_t size) +{ + void *vaddr; + + if (offset == NULL || size == 0) + return (NULL); + + vaddr = contigmalloc(size, M_DEVBUF, M_NOWAIT, X86BIOS_RAM_BASE, + X86BIOS_ROM_BASE, X86BIOS_PAGE_SIZE, 0); + if (vaddr != NULL) { + *offset = vtophys(vaddr); + x86bios_set_pages((vm_offset_t)vaddr, *offset, size); + } + + return (vaddr); +} + +void +x86bios_free(void *addr, size_t size) +{ + vm_paddr_t paddr; + + if (addr == NULL || size == 0) + return; + + paddr = vtophys(addr); + if (paddr < X86BIOS_RAM_BASE || paddr >= X86BIOS_ROM_BASE || + paddr % X86BIOS_PAGE_SIZE != 0) + return; + + bzero(x86bios_map + paddr / X86BIOS_PAGE_SIZE, + sizeof(*x86bios_map) * howmany(size, X86BIOS_PAGE_SIZE)); + contigfree(addr, size, M_DEVBUF); +} + +void +x86bios_init_regs(struct x86regs *regs) +{ + + bzero(regs, sizeof(*regs)); + regs->X86BIOS_R_DS = regs->X86BIOS_R_SS = x86bios_seg_phys >> 4; +} + +void +x86bios_call(struct x86regs *regs, uint16_t seg, uint16_t off) +{ + + if (x86bios_map == NULL) + return; + + if (x86bios_trace_call) + printf("Calling 0x%05x (ax=0x%04x bx=0x%04x " + "cx=0x%04x dx=0x%04x es=0x%04x di=0x%04x)\n", + (seg << 4) + off, regs->R_AX, regs->R_BX, regs->R_CX, + regs->R_DX, regs->R_ES, regs->R_DI); + + mtx_lock_spin(&x86bios_lock); + memcpy(&x86bios_emu.x86, regs, sizeof(*regs)); + x86emu_exec_call(&x86bios_emu, seg, off); + memcpy(regs, &x86bios_emu.x86, sizeof(*regs)); + mtx_unlock_spin(&x86bios_lock); + + if (x86bios_trace_call) + printf("Exiting 0x%05x (ax=0x%04x bx=0x%04x " + "cx=0x%04x dx=0x%04x es=0x%04x di=0x%04x)\n", + (seg << 4) + off, regs->R_AX, regs->R_BX, regs->R_CX, + regs->R_DX, regs->R_ES, regs->R_DI); +} + +uint32_t +x86bios_get_intr(int intno) +{ + uint32_t *iv; + + iv = (uint32_t *)((vm_offset_t)x86bios_ivt + intno * 4); + + return (le32toh(*iv)); +} + void x86bios_intr(struct x86regs *regs, int intno) { @@ -97,21 +359,22 @@ x86bios_intr(struct x86regs *regs, int intno) if (intno < 0 || intno > 255) return; - if (bootverbose) + if (x86bios_map == NULL) + return; + + if (x86bios_trace_int) printf("Calling int 0x%x (ax=0x%04x bx=0x%04x " "cx=0x%04x dx=0x%04x es=0x%04x di=0x%04x)\n", intno, regs->R_AX, regs->R_BX, regs->R_CX, regs->R_DX, regs->R_ES, regs->R_DI); mtx_lock_spin(&x86bios_lock); - memcpy(&x86bios_emu.x86, regs, sizeof(*regs)); x86emu_exec_intr(&x86bios_emu, intno); memcpy(regs, &x86bios_emu.x86, sizeof(*regs)); - mtx_unlock_spin(&x86bios_lock); - if (bootverbose) + if (x86bios_trace_int) printf("Exiting int 0x%x (ax=0x%04x bx=0x%04x " "cx=0x%04x dx=0x%04x es=0x%04x di=0x%04x)\n", intno, regs->R_AX, regs->R_BX, regs->R_CX, @@ -119,24 +382,112 @@ x86bios_intr(struct x86regs *regs, int intno) } void * -x86bios_offset(uint32_t offs) +x86bios_offset(uint32_t offset) { - return (pbiosMem + offs); + return (x86bios_get_pages(offset, 1)); +} + +void * +x86bios_get_orm(uint32_t offset) +{ + uint8_t *p; + + /* Does the shadow ROM contain BIOS POST code for x86? */ + p = x86bios_offset(offset); + if (p == NULL || p[0] != 0x55 || p[1] != 0xaa || p[3] != 0xe9) + return (NULL); + + return (p); +} + +int +x86bios_match_device(uint32_t offset, device_t dev) +{ + uint8_t *p; + uint16_t device, vendor; + uint8_t class, progif, subclass; + + /* Does the shadow ROM contain BIOS POST code for x86? */ + p = x86bios_get_orm(offset); + if (p == NULL) + return (0); + + /* Does it contain PCI data structure? */ + p += le16toh(*(uint16_t *)(p + 0x18)); + if (bcmp(p, "PCIR", 4) != 0 || + le16toh(*(uint16_t *)(p + 0x0a)) < 0x18 || *(p + 0x14) != 0) + return (0); + + /* Does it match the vendor, device, and classcode? */ + vendor = le16toh(*(uint16_t *)(p + 0x04)); + device = le16toh(*(uint16_t *)(p + 0x06)); + progif = *(p + 0x0d); + subclass = *(p + 0x0e); + class = *(p + 0x0f); + if (vendor != pci_get_vendor(dev) || device != pci_get_device(dev) || + class != pci_get_class(dev) || subclass != pci_get_subclass(dev) || + progif != pci_get_progif(dev)) + return (0); + + return (1); +} + +static __inline int +x86bios_map_mem(void) +{ + + x86bios_ivt = pmap_mapbios(X86BIOS_IVT_BASE, X86BIOS_IVT_SIZE); + if (x86bios_ivt == NULL) + return (1); + x86bios_rom = pmap_mapdev(X86BIOS_ROM_BASE, X86BIOS_ROM_SIZE); + if (x86bios_rom == NULL) { + pmap_unmapdev((vm_offset_t)x86bios_ivt, X86BIOS_IVT_SIZE); + return (1); + } + x86bios_seg = contigmalloc(X86BIOS_SEG_SIZE, M_DEVBUF, M_WAITOK, + X86BIOS_RAM_BASE, X86BIOS_ROM_BASE, X86BIOS_PAGE_SIZE, 0); + x86bios_seg_phys = vtophys(x86bios_seg); + + return (0); +} + +static __inline void +x86bios_unmap_mem(void) +{ + + pmap_unmapdev((vm_offset_t)x86bios_ivt, X86BIOS_IVT_SIZE); + pmap_unmapdev((vm_offset_t)x86bios_rom, X86BIOS_ROM_SIZE); + contigfree(x86bios_seg, X86BIOS_SEG_SIZE, M_DEVBUF); } static void x86bios_init(void *arg __unused) { - int offs; + int i; mtx_init(&x86bios_lock, "x86bios lock", NULL, MTX_SPIN); - /* Can pbiosMem be NULL here? */ - pbiosMem = pmap_mapbios(0x0, MAPPED_MEMORY_SIZE); + if (x86bios_map_mem() != 0) + return; - memset(&x86bios_emu, 0, sizeof(x86bios_emu)); - x86emu_init_default(&x86bios_emu); + x86bios_map = malloc(sizeof(*x86bios_map) * X86BIOS_PAGES, M_DEVBUF, + M_WAITOK | M_ZERO); + x86bios_set_pages((vm_offset_t)x86bios_ivt, X86BIOS_IVT_BASE, + X86BIOS_IVT_SIZE); + x86bios_set_pages((vm_offset_t)x86bios_rom, X86BIOS_ROM_BASE, + X86BIOS_ROM_SIZE); + x86bios_set_pages((vm_offset_t)x86bios_seg, x86bios_seg_phys, + X86BIOS_SEG_SIZE); + + bzero(&x86bios_emu, sizeof(x86bios_emu)); + + x86bios_emu.emu_rdb = x86bios_emu_rdb; + x86bios_emu.emu_rdw = x86bios_emu_rdw; + x86bios_emu.emu_rdl = x86bios_emu_rdl; + x86bios_emu.emu_wrb = x86bios_emu_wrb; + x86bios_emu.emu_wrw = x86bios_emu_wrw; + x86bios_emu.emu_wrl = x86bios_emu_wrl; x86bios_emu.emu_inb = x86bios_emu_inb; x86bios_emu.emu_inw = x86bios_emu_inw; @@ -145,23 +496,24 @@ x86bios_init(void *arg __unused) x86bios_emu.emu_outw = x86bios_emu_outw; x86bios_emu.emu_outl = x86bios_emu_outl; - x86bios_emu.mem_base = (char *)pbiosMem; - x86bios_emu.mem_size = MAPPED_MEMORY_SIZE; - - memset(busySegMap, 0, sizeof(busySegMap)); - - pbiosStack = x86bios_alloc(1, &offs); + for (i = 0; i < 256; i++) + x86bios_emu._x86emu_intrTab[i] = x86bios_emu_get_intr; } static void x86bios_uninit(void *arg __unused) { + vm_offset_t *map = x86bios_map; - x86bios_free(pbiosStack, 1); + mtx_lock_spin(&x86bios_lock); + if (x86bios_map != NULL) { + free(x86bios_map, M_DEVBUF); + x86bios_map = NULL; + } + mtx_unlock_spin(&x86bios_lock); - if (pbiosMem) - pmap_unmapdev((vm_offset_t)pbiosMem, - MAPPED_MEMORY_SIZE); + if (map != NULL) + x86bios_unmap_mem(); mtx_destroy(&x86bios_lock); } @@ -169,7 +521,6 @@ x86bios_uninit(void *arg __unused) static int x86bios_modevent(module_t mod __unused, int type, void *data __unused) { - int err = 0; switch (type) { case MOD_LOAD: @@ -179,11 +530,10 @@ x86bios_modevent(module_t mod __unused, int type, void *data __unused) x86bios_uninit(NULL); break; default: - err = ENOTSUP; - break; + return (ENOTSUP); } - return (err); + return (0); } static moduledata_t x86bios_mod = { diff --git a/sys/compat/x86bios/x86bios.h b/sys/compat/x86bios/x86bios.h index 35cbbce8cfaa..4ed15e075274 100644 --- a/sys/compat/x86bios/x86bios.h +++ b/sys/compat/x86bios/x86bios.h @@ -1,48 +1,73 @@ /*- - * Written by paradox - * Public domain. + * Copyright (c) 2009 Alex Keda + * All rights reserved. * - * x86 registers were borrowed from x86emu.h x86emu_regs.h - * for compatability. + * 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$ */ +/* + * x86 registers were borrowed from x86emu.h x86emu_regs.h + * for compatability. + */ #ifndef _X86BIOS_H_ -#define _X86BIOS_H_ +#define _X86BIOS_H_ -#include #include #include +#include #ifdef __BIG_ENDIAN__ struct x86_register32 { - uint32_t e_reg; + uint32_t e_reg; }; struct x86_register16 { - uint16_t filler0; - uint16_t x_reg; + uint16_t filler0; + uint16_t x_reg; }; struct x86_register8 { - uint8_t filler0, filler1; - uint8_t h_reg, l_reg; + uint8_t filler0; + uint8_t filler1; + uint8_t h_reg; + uint8_t l_reg; }; #else /* !__BIG_ENDIAN__ */ struct x86_register32 { - uint32_t e_reg; + uint32_t e_reg; }; struct x86_register16 { - uint16_t x_reg; + uint16_t x_reg; }; struct x86_register8 { - uint8_t l_reg, h_reg; + uint8_t l_reg; + uint8_t h_reg; }; #endif /* __BIG_ENDIAN__ */ @@ -54,19 +79,19 @@ union x86_register { }; struct x86regs { - uint16_t padding; /* CS is unused. */ - uint16_t register_ds; + uint16_t _pad0; /* CS */ + uint16_t _pad1; /* DS */ uint16_t register_es; uint16_t register_fs; uint16_t register_gs; - uint16_t register_ss; + uint16_t _pad2; /* SS */ uint32_t register_flags; union x86_register register_a; union x86_register register_b; union x86_register register_c; union x86_register register_d; - union x86_register register_sp; + union x86_register _pad3; /* SP */ union x86_register register_bp; union x86_register register_si; union x86_register register_di; @@ -75,60 +100,57 @@ struct x86regs { typedef struct x86regs x86regs_t; /* 8 bit registers */ -#define R_AH register_a.I8_reg.h_reg -#define R_AL register_a.I8_reg.l_reg -#define R_BH register_b.I8_reg.h_reg -#define R_BL register_b.I8_reg.l_reg -#define R_CH register_c.I8_reg.h_reg -#define R_CL register_c.I8_reg.l_reg -#define R_DH register_d.I8_reg.h_reg -#define R_DL register_d.I8_reg.l_reg +#define R_AH register_a.I8_reg.h_reg +#define R_AL register_a.I8_reg.l_reg +#define R_BH register_b.I8_reg.h_reg +#define R_BL register_b.I8_reg.l_reg +#define R_CH register_c.I8_reg.h_reg +#define R_CL register_c.I8_reg.l_reg +#define R_DH register_d.I8_reg.h_reg +#define R_DL register_d.I8_reg.l_reg /* 16 bit registers */ -#define R_AX register_a.I16_reg.x_reg -#define R_BX register_b.I16_reg.x_reg -#define R_CX register_c.I16_reg.x_reg -#define R_DX register_d.I16_reg.x_reg +#define R_AX register_a.I16_reg.x_reg +#define R_BX register_b.I16_reg.x_reg +#define R_CX register_c.I16_reg.x_reg +#define R_DX register_d.I16_reg.x_reg /* 32 bit extended registers */ -#define R_EAX register_a.I32_reg.e_reg -#define R_EBX register_b.I32_reg.e_reg -#define R_ECX register_c.I32_reg.e_reg -#define R_EDX register_d.I32_reg.e_reg +#define R_EAX register_a.I32_reg.e_reg +#define R_EBX register_b.I32_reg.e_reg +#define R_ECX register_c.I32_reg.e_reg +#define R_EDX register_d.I32_reg.e_reg /* special registers */ -#define R_SP register_sp.I16_reg.x_reg -#define R_BP register_bp.I16_reg.x_reg -#define R_SI register_si.I16_reg.x_reg -#define R_DI register_di.I16_reg.x_reg -#define R_FLG register_flags +#define R_BP register_bp.I16_reg.x_reg +#define R_SI register_si.I16_reg.x_reg +#define R_DI register_di.I16_reg.x_reg +#define R_FLG register_flags /* special registers */ -#define R_ESP register_sp.I32_reg.e_reg -#define R_EBP register_bp.I32_reg.e_reg -#define R_ESI register_si.I32_reg.e_reg -#define R_EDI register_di.I32_reg.e_reg -#define R_EFLG register_flags +#define R_EBP register_bp.I32_reg.e_reg +#define R_ESI register_si.I32_reg.e_reg +#define R_EDI register_di.I32_reg.e_reg +#define R_EFLG register_flags /* segment registers */ -#define R_DS register_ds -#define R_SS register_ss -#define R_ES register_es -#define R_FS register_fs -#define R_GS register_gs +#define R_ES register_es +#define R_FS register_fs +#define R_GS register_gs -#define SEG_ADDR(x) (((x) >> 4) & 0x00F000) -#define SEG_OFF(x) ((x) & 0x0FFFF) -#define FARP(x) ((le32toh(x) & 0xffff) + ((le32toh(x) >> 12) & 0xffff00)) - -#define MAPPED_MEMORY_SIZE (1024 * 1024) -#define PAGE_RESERV (4096 * 5) +#define X86BIOS_PHYSTOSEG(x) (((x) >> 4) & 0xffff) +#define X86BIOS_PHYSTOOFF(x) ((x) & 0x000f) __BEGIN_DECLS -void *x86bios_alloc(int count, int *segs); -void x86bios_free(void *pbuf, int count); -void x86bios_intr(struct x86regs *regs, int intno); -void *x86bios_offset(uint32_t offs); +void *x86bios_alloc(uint32_t *offset, size_t size); +void x86bios_call(struct x86regs *regs, uint16_t seg, uint16_t off); +void x86bios_free(void *addr, size_t size); +uint32_t x86bios_get_intr(int intno); +void *x86bios_get_orm(uint32_t offset); +void x86bios_init_regs(struct x86regs *regs); +void x86bios_intr(struct x86regs *regs, int intno); +int x86bios_match_device(uint32_t offset, device_t dev); +void *x86bios_offset(uint32_t offset); __END_DECLS #endif /* !_X86BIOS_H_ */ diff --git a/sys/compat/x86bios/x86bios_alloc.c b/sys/compat/x86bios/x86bios_alloc.c deleted file mode 100644 index 0a364e7e4e0a..000000000000 --- a/sys/compat/x86bios/x86bios_alloc.c +++ /dev/null @@ -1,81 +0,0 @@ -/*- - * Copyright (C) 1999 Egbert Eich - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of the authors not be used - * in advertising or publicity pertaining to distribution of the software - * without specific, written prior permission. The authors makes no - * representations about the suitability of this software for any purpose. - * It is provided "as is" without express or implied warranty. - * - * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF - * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - * xserver/hw/xfree86/int10/generic.c - */ - -#include -__FBSDID("$FreeBSD$"); - -#include - -#include - -extern u_char *pbiosMem; -extern int busySegMap[5]; - -void * -x86bios_alloc(int count, int *segs) -{ - int i; - int j; - - /* find the free segblock of page */ - for (i = 0; i < (PAGE_RESERV - count); i++) - { - if (busySegMap[i] == 0) - { - /* find the capacity of segblock */ - for (j = i; j < (i + count); j++) - { - if (busySegMap[j] == 1) - break; - } - - if (j == (i + count)) - break; - i += count; - } - } - - if (i == (PAGE_RESERV - count)) - return NULL; - - /* make the segblock is used */ - for (j = i; j < (i + count); j++) - busySegMap[i] = 1; - - *segs = i * 4096; - - return (pbiosMem + *segs); -} - -void -x86bios_free(void *pbuf, int count) -{ - int i; - int busySeg; - - busySeg = ((u_char *)pbuf - pbiosMem) / 4096; - - for (i = busySeg; i < (busySeg + count); i++) - busySegMap[i] = 0; -} diff --git a/sys/conf/Makefile.arm b/sys/conf/Makefile.arm index 310c54d42877..66adea1d75af 100644 --- a/sys/conf/Makefile.arm +++ b/sys/conf/Makefile.arm @@ -73,7 +73,7 @@ FILES_CPU_FUNC = $S/$M/$M/cpufunc_asm_arm7tdmi.S \ $S/$M/$M/cpufunc_asm_sa1.S $S/$M/$M/cpufunc_asm_arm10.S \ $S/$M/$M/cpufunc_asm_xscale.S $S/$M/$M/cpufunc_asm.S \ $S/$M/$M/cpufunc_asm_xscale_c3.S $S/$M/$M/cpufunc_asm_armv5_ec.S \ - $S/$M/$M/cpufunc_asm_sheeva.S + $S/$M/$M/cpufunc_asm_sheeva.S $S/$M/$M/cpufunc_asm_fa526.S KERNEL_EXTRA=trampoline KERNEL_EXTRA_INSTALL=kernel.gz.tramp trampoline: ${KERNEL_KO}.tramp diff --git a/sys/conf/Makefile.mips b/sys/conf/Makefile.mips index 443065aaafcc..0b56bb725189 100644 --- a/sys/conf/Makefile.mips +++ b/sys/conf/Makefile.mips @@ -28,35 +28,83 @@ S= ../../.. .endif .include "$S/conf/kern.pre.mk" +LDSCRIPT_NAME?=ldscript.$M +SYSTEM_LD:= ${SYSTEM_LD:$S/conf/${LDSCRIPT_NAME}=${LDSCRIPT_NAME}} +SYSTEM_DEP:= ${SYSTEM_DEP:$S/conf/${LDSCRIPT_NAME}=${LDSCRIPT_NAME}} + # XXX: Such sweeping assumptions... MACHINE=mips MACHINE_ARCH=mips +KERNLOADADDR?=0x80001000 +# This obscure value is defined by CFE for WR160N +# To be changed later +TRAMPLOADADDR?=0x807963c0 MKMODULESENV+= MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH} # We default to the MIPS32 ISA, if none specified in the # kernel configuration file. ARCH_FLAGS?=-march=mips32 +EXTRA_FLAGS=-fno-pic -mno-abicalls -G0 HACK_EXTRA_FLAGS=-shared .if defined(TARGET_BIG_ENDIAN) CFLAGS+=-EB SYSTEM_LD+=-EB +EXTRA_FLAGS+=-EB +TRAMP_LDFLAGS+=-Wl,-EB HACK_EXTRA_FLAGS+=-EB -Wl,-EB +.if defined(TARGET_64BIT) +SYSTEM_LD+=-m elf64btsmip_fbsd +HACK_EXTRA_FLAGS+=-Wl,-m,elf64btsmip_fbsd +.endif .else CFLAGS+=-EL SYSTEM_LD+=-EL +EXTRA_FLAGS+=-EL +TRAMP_LDFLAGS+=-Wl,-EL HACK_EXTRA_FLAGS+=-EL -Wl,-EL +.if defined(TARGET_64BIT) +SYSTEM_LD+=-m elf64ltsmip_fbsd +HACK_EXTRA_FLAGS+=-Wl,-m,elf64ltsmip_fbsd .endif +.endif + # We add the -fno-pic flag to kernels because otherwise performance # is extremely poor, as well as -mno-abicalls to force no ABI usage. -CFLAGS+=-fno-pic -mno-abicalls -G0 $(ARCH_FLAGS) -HACK_EXTRA_FLAGS+=-fno-pic -mno-abicalls -G0 $(ARCH_FLAGS) +CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS) +HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS) # XXX hardcoded kernel entry point ASM_CFLAGS+=${CFLAGS} -D_LOCORE -DLOCORE +KERNEL_EXTRA=trampoline +trampoline: ${KERNEL_KO}.tramp.bin +${KERNEL_KO}.tramp.bin: ${KERNEL_KO} $S/$M/$M/elf_trampoline.c \ + $S/$M/$M/inckern.S + ${OBJCOPY} --strip-symbol '$$d' --strip-symbol '$$a' \ + -g --strip-symbol '$$t' ${FULLKERNEL} ${KERNEL_KO}.tmp + sed s/${KERNLOADADDR}/${TRAMPLOADADDR}/ ${LDSCRIPT_NAME} | \ + sed s/" + SIZEOF_HEADERS"// > ${LDSCRIPT_NAME}.tramp.noheader + # Generate .S file that setups stack and jumps to trampoline + echo "#include " >tmphack.S + echo "ENTRY(_start)" >>tmphack.S + echo "PTR_LA t0, kernel_end" >>tmphack.S + echo "move sp, t0" >>tmphack.S + echo "add sp, 0x2000" >>tmphack.S + echo "and sp, ~0x7" >>tmphack.S + echo "PTR_LA t0, _startC" >>tmphack.S + echo "j t0" >>tmphack.S + echo "END(_start)" >>tmphack.S + echo "#define KERNNAME \"${KERNEL_KO}.tmp\"" >opt_kernname.h + ${CC} -O -nostdlib -I. -I$S ${HACK_EXTRA_FLAGS} ${TRAMP_LDFLAGS} -Xlinker \ + -T -Xlinker ${LDSCRIPT_NAME}.tramp.noheader tmphack.S \ + $S/$M/$M/elf_trampoline.c $S/$M/$M/inckern.S \ + -o ${KERNEL_KO}.tramp.noheader + ${OBJCOPY} -S -O binary ${KERNEL_KO}.tramp.noheader \ + ${KERNEL_KO}.tramp.bin \ + %BEFORE_DEPEND %OBJS @@ -69,6 +117,12 @@ ASM_CFLAGS+=${CFLAGS} -D_LOCORE -DLOCORE %CLEAN +CLEAN+= ${LDSCRIPT_NAME} ${LDSCRIPT_NAME}.tramp.noheader \ + ${KERNEL_KO}.tramp.noheader ${KERNEL_KO}.tramp.bin + +${LDSCRIPT_NAME}: $S/conf/${LDSCRIPT_NAME} + cat $S/conf/${LDSCRIPT_NAME}|sed s/KERNLOADADDR/${KERNLOADADDR}/g \ + > ${LDSCRIPT_NAME} %RULES .include "$S/conf/kern.post.mk" diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 1cba42f46437..f7ab101346e8 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -50,6 +50,15 @@ ident LINT # maxusers 10 +# To statically compile in device wiring instead of /boot/device.hints +#hints "LINT.hints" # Default places to look for devices. + +# Use the following to compile in values accessible to the kernel +# through getenv() (or kenv(1) in userland). The format of the file +# is 'variable=value', see kenv(1) +# +#env "LINT.env" + # # The `makeoptions' parameter allows variables to be passed to the # generated Makefile in the build area. @@ -376,6 +385,11 @@ options KDTRACE_HOOKS # options SYSCTL_DEBUG +# +# NO_SYSCTL_DESCR omits the sysctl node descriptions to save space in the +# resulting kernel. +options NO_SYSCTL_DESCR + # # DEBUG_MEMGUARD builds and enables memguard(9), a replacement allocator # for the kernel used to detect modify-after-free scenarios. See the @@ -402,8 +416,7 @@ options KTRACE #kernel tracing options KTRACE_REQUEST_POOL=101 # -# KTR is a kernel tracing mechanism imported from BSD/OS. Currently -# it has no userland interface aside from a few sysctl's. It is +# KTR is a kernel tracing facility imported from BSD/OS. It is # enabled with the KTR option. KTR_ENTRIES defines the number of # entries in the circular trace buffer; it must be a power of two. # KTR_COMPILE defines the mask of events to compile into the kernel as @@ -413,7 +426,7 @@ options KTRACE_REQUEST_POOL=101 # events, with bit X corresponding to CPU X. KTR_VERBOSE enables # dumping of KTR events to the console by default. This functionality # can be toggled via the debug.ktr_verbose sysctl and defaults to off -# if KTR_VERBOSE is not defined. +# if KTR_VERBOSE is not defined. See ktr(4) and ktrdump(8) for details. # options KTR options KTR_ENTRIES=1024 @@ -424,7 +437,7 @@ options KTR_VERBOSE # # ALQ(9) is a facility for the asynchronous queuing of records from the kernel -# to a vnode, and is employed by services such as KTR(4) to produce trace +# to a vnode, and is employed by services such as ktr(4) to produce trace # files based on a kernel event stream. Records are written asynchronously # in a worker thread. # @@ -618,9 +631,9 @@ options SCTP_WITH_NO_CSUM # I have not yet commited the tools to get and print # the logs, I will do that eventually .. before then # if you want them send me an email rrs@freebsd.org -# You basically must have KTR enabled for these +# You basically must have ktr(4) enabled for these # and you then set the sysctl to turn on/off various -# logging bits. Use ktrdump to pull the log and run +# logging bits. Use ktrdump(8) to pull the log and run # it through a dispaly program.. and graphs and other # things too. # @@ -707,6 +720,7 @@ options NETGRAPH_TCPMSS options NETGRAPH_TEE options NETGRAPH_UI options NETGRAPH_VJC +options NETGRAPH_VLAN # NgATM - Netgraph ATM options NGATM_ATM @@ -973,6 +987,7 @@ options NFSSERVER #Network File System server options NFSLOCKD #Network Lock Manager options NFSCL #experimental NFS client with NFSv4 options NFSD #experimental NFS server with NFSv4 +options KGSSAPI #Kernel GSSAPI implementaion # NT File System. Read-mostly, see mount_ntfs(8) for details. # For a full read-write NTFS support consider sysutils/fusefs-ntfs @@ -1410,8 +1425,8 @@ options SC_NO_SUSPEND_VTYSWITCH # 0x100 Probe for a keyboard device periodically if one is not present # Enable experimental features of the syscons terminal emulator (teken). +options TEKEN_CONS25 # cons25-style terminal emulation options TEKEN_UTF8 # UTF-8 output handling -options TEKEN_XTERM # xterm-style terminal emulation # # Optional devices: @@ -1657,6 +1672,10 @@ device siis # The 'ATA' driver supports all ATA and ATAPI devices, including PC Card # devices. You only need one "device ata" for it to find all # PCI and PC Card ATA/ATAPI devices on modern machines. +# Alternatively, individual bus and chipset drivers may be chosen by using +# the 'atacore' driver then selecting the drivers on a per vendor basis. +# For example to build a system which only supports a VIA chipset, +# omit 'ata' and include the 'atacore', 'atapci' and 'atavia' drivers. device ata device atadisk # ATA disk drives device ataraid # ATA RAID drives @@ -1665,6 +1684,39 @@ device atapifd # ATAPI floppy drives device atapist # ATAPI tape drives device atapicam # emulate ATAPI devices as SCSI ditto via CAM # needs CAM to be present (scbus & pass) + +# Modular ATA +#device atacore # Core ATA functionality +#device atacard # CARDBUS support +#device atabus # PC98 cbus support +#device ataisa # ISA bus support +#device atapci # PCI bus support; only generic chipset support + +# PCI ATA chipsets +#device ataahci # AHCI SATA +#device ataacard # ACARD +#device ataacerlabs # Acer Labs Inc. (ALI) +#device ataadaptec # Adaptec +#device ataamd # American Micro Devices (AMD) +#device ataati # ATI +#device atacenatek # Cenatek +#device atacypress # Cypress +#device atacyrix # Cyrix +#device atahighpoint # HighPoint +#device ataintel # Intel +#device ataite # Integrated Technology Inc. (ITE) +#device atajmicron # JMicron +#device atamarvell # Marvell +#device atamicron # Micron +#device atanational # National +#device atanetcell # NetCell +#device atanvidia # nVidia +#device atapromise # Promise +#device ataserverworks # ServerWorks +#device atasiliconimage # Silicon Image Inc. (SiI) (formerly CMD) +#device atasis # Silicon Integrated Systems Corp.(SiS) +#device atavia # VIA Technologies Inc. + # # For older non-PCI, non-PnPBIOS systems, these are the hints lines to add: hint.ata.0.at="isa" @@ -1679,8 +1731,17 @@ hint.ata.1.irq="15" # # ATA_STATIC_ID: controller numbering is static ie depends on location # else the device numbers are dynamically allocated. +# ATA_REQUEST_TIMEOUT: the number of seconds to wait for an ATA request +# before timing out. +# ATA_CAM: Turn ata(4) subsystem controller drivers into cam(4) +# interface modules. This deprecates all ata(4) +# peripheral device drivers (atadisk, ataraid, atapicd, +# atapifd. atapist, atapicam) and all user-level APIs. +# cam(4) drivers and APIs will be connected instead. options ATA_STATIC_ID +#options ATA_REQUEST_TIMEOUT=10 +#options ATA_CAM # # Standard floppy disk controllers and floppy tapes, supports @@ -1766,14 +1827,47 @@ device puc # # Network interfaces: # -# MII bus support is required for some PCI 10/100 ethernet NICs, +# MII bus support is required for many PCI Ethernet NICs, # namely those which use MII-compliant transceivers or implement -# transceiver control interfaces that operate like an MII. Adding +# transceiver control interfaces that operate like an MII. Adding # "device miibus" to the kernel config pulls in support for # the generic miibus API and all of the PHY drivers, including a # generic one for PHYs that aren't specifically handled by an -# individual driver. -device miibus +# individual driver. Support for specific PHYs may be built by adding +# "device mii" then adding the appropriate PHY driver. +device miibus # MII support including all PHYs +device mii # Minimal MII support + +device acphy # Altima Communications AC101 +device amphy # AMD AM79c873 / Davicom DM910{1,2} +device atphy # Attansic/Atheros F1 +device axphy # Asix Semiconductor AX88x9x +device bmtphy # Broadcom BCM5201/BCM5202 and 3Com 3c905C +device brgphy # Broadcom BCM54xx/57xx 1000baseTX +device ciphy # Cicada/Vitesse CS/VSC8xxx +device e1000phy # Marvell 88E1000 1000/100/10-BT +device exphy # 3Com internal PHY +device gentbi # Generic 10-bit 1000BASE-{LX,SX} fiber ifaces +device icsphy # ICS ICS1889-1893 +device inphy # Intel 82553/82555 +device ip1000phy # IC Plus IP1000A/IP1001 +device jmphy # JMicron JMP211/JMP202 +device lxtphy # Level One LXT-970 +device mlphy # Micro Linear 6692 +device nsgphy # NatSemi DP8361/DP83865/DP83891 +device nsphy # NatSemi DP83840A +device nsphyter # NatSemi DP83843/DP83815 +device pnaphy # HomePNA +device qsphy # Quality Semiconductor QS6612 +device rgephy # RealTek 8169S/8110S/8211B/8211C +device rlphy # RealTek 8139 +device rlswitch # RealTek 8305 +device ruephy # RealTek RTL8150 +device smcphy # SMSC LAN91C111 +device tdkphy # TDK 89Q2120 +device tlphy # Texas Instruments ThunderLAN +device truephy # LSI TruePHY +device xmphy # XaQti XMAC II # an: Aironet 4500/4800 802.11 wireless adapters. Supports the PCMCIA, # PCI and ISA varieties. @@ -1783,6 +1877,7 @@ device miibus # L1 PCI express gigabit ethernet controllers. # alc: Support for Atheros AR8131/AR8132 PCIe ethernet controllers. # ale: Support for Atheros AR8121/AR8113/AR8114 PCIe ethernet controllers. +# ath: Atheros a/b/g WiFi adapters (requires ath_hal and wlan) # bce: Broadcom NetXtreme II (BCM5706/BCM5708) PCI/PCIe Gigabit Ethernet # adapters. # bfe: Broadcom BCM4401 Ethernet adapter. @@ -1841,6 +1936,7 @@ device miibus # pcn(4) driver is left out of the kernel. The le(4) driver does not # support the additional features like the MII bus and burst mode of # the PCnet-FAST and greater chipsets though. +# ral: Ralink Technology IEEE 802.11 wireless adapter # re: RealTek 8139C+/8169/816xS/811xS/8101E PCI/PCIe Ethernet adapter # rl: Support for PCI fast ethernet adapters based on the RealTek 8129/8139 # chipset. Note that the RealTek driver defaults to using programmed @@ -1883,8 +1979,8 @@ device miibus # txp: Support for 3Com 3cR990 cards with the "Typhoon" chipset # vr: Support for various fast ethernet adapters based on the VIA # Technologies VT3043 `Rhine I' and VT86C100A `Rhine II' chips, -# including the D-Link DFE530TX (see 'rl' for DFE530TX+), the Hawking -# Technologies PN102TX, and the AOpen/Acer ALN-320. +# including the D-Link DFE520TX and D-Link DFE530TX (see 'rl' for +# DFE530TX+), the Hawking Technologies PN102TX, and the AOpen/Acer ALN-320. # vx: 3Com 3C590 and 3C595 # wb: Support for fast ethernet adapters based on the Winbond W89C840F chip. # Note: this is not the same as the Winbond W89C940F, which is a @@ -1960,10 +2056,10 @@ device wb # Winbond W89C840F device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'') # PCI Ethernet NICs. -device bwi # Broadcom BCM430* BCM431* device de # DEC/Intel DC21x4x (``Tulip'') device em # Intel Pro/1000 Gigabit Ethernet device igb # Intel Pro/1000 PCIE Gigabit Ethernet +device ixgb # Intel Pro/10Gbe PCI-X Ethernet device ixgbe # Intel Pro/10Gbe PCIE Ethernet device le # AMD Am7900 LANCE and Am79C9xx PCnet device mxge # Myricom Myri-10G 10GbE NIC @@ -1978,6 +2074,26 @@ device fpa # PCI WAN adapters. device lmc +# PCI IEEE 802.11 Wireless NICs +device ath # Atheros pci/cardbus NIC's +device ath_hal # pci/cardbus chip support +#device ath_ar5210 # AR5210 chips +#device ath_ar5211 # AR5211 chips +#device ath_ar5212 # AR5212 chips +#device ath_rf2413 +#device ath_rf2417 +#device ath_rf2425 +#device ath_rf5111 +#device ath_rf5112 +#device ath_rf5413 +#device ath_ar5416 # AR5416 chips +options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors +#device ath_ar9160 # AR9160 chips +#device ath_ar9280 # AR9280 chips +device ath_rate_sample # SampleRate tx rate control for ath +device bwi # Broadcom BCM430* BCM431* +device ral # Ralink Technology RT2500 wireless NICs. + # Use "private" jumbo buffers allocated exclusively for the ti(4) driver. # This option is incompatible with the TI_JUMBO_HDRSPLIT option below. #options TI_PRIVATE_JUMBOS @@ -1985,6 +2101,12 @@ device lmc # only works for Tigon II chips, and has no effect for Tigon I chips. options TI_JUMBO_HDRSPLIT +# +# Use header splitting feature on bce(4) adapters. +# This may help to reduce the amount of jumbo-sized memory buffers used. +# +options BCE_JUMBO_HDRSPLIT + # These two options allow manipulating the mbuf cluster size and mbuf size, # respectively. Be very careful with NIC driver modules when changing # these from their default values, because that can potentially cause a @@ -2422,6 +2544,11 @@ options BOOTP_BLOCKSIZE=8192 # Override NFS block size # options SW_WATCHDOG +# +# Add the software deadlock resolver thread. +# +options DEADLKRES + # # Disable swapping of stack pages. This option removes all # code which actually performs swapping, so it's not possible to turn @@ -2474,8 +2601,10 @@ device uhid device ukbd # USB printer device ulpt -# USB Iomega Zip 100 Drive (Requires scbus and da) +# USB mass storage driver (Requires scbus and da) device umass +# USB mass storage driver for device-side mode +device usfs # USB support for Belkin F5U109 and Magic Control Technology serial adapters device umct # USB modem support @@ -2539,10 +2668,15 @@ device rue # # Davicom DM9601E USB to fast ethernet. Supports the Corega FEther USB-TXC. device udav +# +# HSxPA devices from Option N.V +device uhso # # Ralink Technology RT2501USB/RT2601USB wireless driver device rum +# Ralink Technology RT2700U/RT2800U/RT3000U wireless driver +device run # # Atheros AR5523 wireless driver device uath diff --git a/sys/conf/files b/sys/conf/files index b31249fc3dfe..e7237754966e 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -112,11 +112,12 @@ cam/cam_sim.c optional scbus cam/cam_xpt.c optional scbus cam/ata/ata_all.c optional scbus cam/ata/ata_xpt.c optional scbus +cam/ata/ata_pmp.c optional scbus cam/scsi/scsi_xpt.c optional scbus cam/scsi/scsi_all.c optional scbus cam/scsi/scsi_cd.c optional cd cam/scsi/scsi_ch.c optional ch -cam/ata/ata_da.c optional da +cam/ata/ata_da.c optional ada | da cam/scsi/scsi_da.c optional da cam/scsi/scsi_low.c optional ct | ncv | nsp | stg cam/scsi/scsi_low_pisa.c optional ct | ncv | nsp | stg @@ -170,107 +171,108 @@ contrib/dev/acpica/dispatcher/dswexec.c optional acpi contrib/dev/acpica/dispatcher/dswload.c optional acpi contrib/dev/acpica/dispatcher/dswscope.c optional acpi contrib/dev/acpica/dispatcher/dswstate.c optional acpi -contrib/dev/acpica/events/evevent.c optional acpi -contrib/dev/acpica/events/evgpe.c optional acpi -contrib/dev/acpica/events/evgpeblk.c optional acpi -contrib/dev/acpica/events/evmisc.c optional acpi -contrib/dev/acpica/events/evregion.c optional acpi -contrib/dev/acpica/events/evrgnini.c optional acpi -contrib/dev/acpica/events/evsci.c optional acpi -contrib/dev/acpica/events/evxface.c optional acpi -contrib/dev/acpica/events/evxfevnt.c optional acpi -contrib/dev/acpica/events/evxfregn.c optional acpi -contrib/dev/acpica/executer/exconfig.c optional acpi -contrib/dev/acpica/executer/exconvrt.c optional acpi -contrib/dev/acpica/executer/excreate.c optional acpi -contrib/dev/acpica/executer/exdump.c optional acpi -contrib/dev/acpica/executer/exfield.c optional acpi -contrib/dev/acpica/executer/exfldio.c optional acpi -contrib/dev/acpica/executer/exmisc.c optional acpi -contrib/dev/acpica/executer/exmutex.c optional acpi -contrib/dev/acpica/executer/exnames.c optional acpi -contrib/dev/acpica/executer/exoparg1.c optional acpi -contrib/dev/acpica/executer/exoparg2.c optional acpi -contrib/dev/acpica/executer/exoparg3.c optional acpi -contrib/dev/acpica/executer/exoparg6.c optional acpi -contrib/dev/acpica/executer/exprep.c optional acpi -contrib/dev/acpica/executer/exregion.c optional acpi -contrib/dev/acpica/executer/exresnte.c optional acpi -contrib/dev/acpica/executer/exresolv.c optional acpi -contrib/dev/acpica/executer/exresop.c optional acpi -contrib/dev/acpica/executer/exstore.c optional acpi -contrib/dev/acpica/executer/exstoren.c optional acpi -contrib/dev/acpica/executer/exstorob.c optional acpi -contrib/dev/acpica/executer/exsystem.c optional acpi -contrib/dev/acpica/executer/exutils.c optional acpi -contrib/dev/acpica/hardware/hwacpi.c optional acpi -contrib/dev/acpica/hardware/hwgpe.c optional acpi -contrib/dev/acpica/hardware/hwregs.c optional acpi -contrib/dev/acpica/hardware/hwsleep.c optional acpi -contrib/dev/acpica/hardware/hwtimer.c optional acpi -contrib/dev/acpica/hardware/hwvalid.c optional acpi -contrib/dev/acpica/hardware/hwxface.c optional acpi -contrib/dev/acpica/namespace/nsaccess.c optional acpi -contrib/dev/acpica/namespace/nsalloc.c optional acpi -contrib/dev/acpica/namespace/nsdump.c optional acpi -contrib/dev/acpica/namespace/nseval.c optional acpi -contrib/dev/acpica/namespace/nsinit.c optional acpi -contrib/dev/acpica/namespace/nsload.c optional acpi -contrib/dev/acpica/namespace/nsnames.c optional acpi -contrib/dev/acpica/namespace/nsobject.c optional acpi -contrib/dev/acpica/namespace/nsparse.c optional acpi -contrib/dev/acpica/namespace/nspredef.c optional acpi -contrib/dev/acpica/namespace/nsrepair.c optional acpi -contrib/dev/acpica/namespace/nssearch.c optional acpi -contrib/dev/acpica/namespace/nsutils.c optional acpi -contrib/dev/acpica/namespace/nswalk.c optional acpi -contrib/dev/acpica/namespace/nsxfeval.c optional acpi -contrib/dev/acpica/namespace/nsxfname.c optional acpi -contrib/dev/acpica/namespace/nsxfobj.c optional acpi -contrib/dev/acpica/parser/psargs.c optional acpi -contrib/dev/acpica/parser/psloop.c optional acpi -contrib/dev/acpica/parser/psopcode.c optional acpi -contrib/dev/acpica/parser/psparse.c optional acpi -contrib/dev/acpica/parser/psscope.c optional acpi -contrib/dev/acpica/parser/pstree.c optional acpi -contrib/dev/acpica/parser/psutils.c optional acpi -contrib/dev/acpica/parser/pswalk.c optional acpi -contrib/dev/acpica/parser/psxface.c optional acpi -contrib/dev/acpica/resources/rsaddr.c optional acpi -contrib/dev/acpica/resources/rscalc.c optional acpi -contrib/dev/acpica/resources/rscreate.c optional acpi -contrib/dev/acpica/resources/rsdump.c optional acpi -contrib/dev/acpica/resources/rsinfo.c optional acpi -contrib/dev/acpica/resources/rsio.c optional acpi -contrib/dev/acpica/resources/rsirq.c optional acpi -contrib/dev/acpica/resources/rslist.c optional acpi -contrib/dev/acpica/resources/rsmemory.c optional acpi -contrib/dev/acpica/resources/rsmisc.c optional acpi -contrib/dev/acpica/resources/rsutils.c optional acpi -contrib/dev/acpica/resources/rsxface.c optional acpi -contrib/dev/acpica/tables/tbfadt.c optional acpi -contrib/dev/acpica/tables/tbfind.c optional acpi -contrib/dev/acpica/tables/tbinstal.c optional acpi -contrib/dev/acpica/tables/tbutils.c optional acpi -contrib/dev/acpica/tables/tbxface.c optional acpi -contrib/dev/acpica/tables/tbxfroot.c optional acpi -contrib/dev/acpica/utilities/utalloc.c optional acpi -contrib/dev/acpica/utilities/utcache.c optional acpi -contrib/dev/acpica/utilities/utcopy.c optional acpi -contrib/dev/acpica/utilities/utdebug.c optional acpi -contrib/dev/acpica/utilities/utdelete.c optional acpi -contrib/dev/acpica/utilities/uteval.c optional acpi -contrib/dev/acpica/utilities/utglobal.c optional acpi -contrib/dev/acpica/utilities/utids.c optional acpi -contrib/dev/acpica/utilities/utinit.c optional acpi -contrib/dev/acpica/utilities/utlock.c optional acpi -contrib/dev/acpica/utilities/utmath.c optional acpi -contrib/dev/acpica/utilities/utmisc.c optional acpi -contrib/dev/acpica/utilities/utmutex.c optional acpi -contrib/dev/acpica/utilities/utobject.c optional acpi -contrib/dev/acpica/utilities/utresrc.c optional acpi -contrib/dev/acpica/utilities/utstate.c optional acpi -contrib/dev/acpica/utilities/utxface.c optional acpi +contrib/dev/acpica/events/evevent.c optional acpi +contrib/dev/acpica/events/evgpe.c optional acpi +contrib/dev/acpica/events/evgpeblk.c optional acpi +contrib/dev/acpica/events/evmisc.c optional acpi +contrib/dev/acpica/events/evregion.c optional acpi +contrib/dev/acpica/events/evrgnini.c optional acpi +contrib/dev/acpica/events/evsci.c optional acpi +contrib/dev/acpica/events/evxface.c optional acpi +contrib/dev/acpica/events/evxfevnt.c optional acpi +contrib/dev/acpica/events/evxfregn.c optional acpi +contrib/dev/acpica/executer/exconfig.c optional acpi +contrib/dev/acpica/executer/exconvrt.c optional acpi +contrib/dev/acpica/executer/excreate.c optional acpi +contrib/dev/acpica/executer/exdump.c optional acpi +contrib/dev/acpica/executer/exfield.c optional acpi +contrib/dev/acpica/executer/exfldio.c optional acpi +contrib/dev/acpica/executer/exmisc.c optional acpi +contrib/dev/acpica/executer/exmutex.c optional acpi +contrib/dev/acpica/executer/exnames.c optional acpi +contrib/dev/acpica/executer/exoparg1.c optional acpi +contrib/dev/acpica/executer/exoparg2.c optional acpi +contrib/dev/acpica/executer/exoparg3.c optional acpi +contrib/dev/acpica/executer/exoparg6.c optional acpi +contrib/dev/acpica/executer/exprep.c optional acpi +contrib/dev/acpica/executer/exregion.c optional acpi +contrib/dev/acpica/executer/exresnte.c optional acpi +contrib/dev/acpica/executer/exresolv.c optional acpi +contrib/dev/acpica/executer/exresop.c optional acpi +contrib/dev/acpica/executer/exstore.c optional acpi +contrib/dev/acpica/executer/exstoren.c optional acpi +contrib/dev/acpica/executer/exstorob.c optional acpi +contrib/dev/acpica/executer/exsystem.c optional acpi +contrib/dev/acpica/executer/exutils.c optional acpi +contrib/dev/acpica/hardware/hwacpi.c optional acpi +contrib/dev/acpica/hardware/hwgpe.c optional acpi +contrib/dev/acpica/hardware/hwregs.c optional acpi +contrib/dev/acpica/hardware/hwsleep.c optional acpi +contrib/dev/acpica/hardware/hwtimer.c optional acpi +contrib/dev/acpica/hardware/hwvalid.c optional acpi +contrib/dev/acpica/hardware/hwxface.c optional acpi +contrib/dev/acpica/namespace/nsaccess.c optional acpi +contrib/dev/acpica/namespace/nsalloc.c optional acpi +contrib/dev/acpica/namespace/nsdump.c optional acpi +contrib/dev/acpica/namespace/nseval.c optional acpi +contrib/dev/acpica/namespace/nsinit.c optional acpi +contrib/dev/acpica/namespace/nsload.c optional acpi +contrib/dev/acpica/namespace/nsnames.c optional acpi +contrib/dev/acpica/namespace/nsobject.c optional acpi +contrib/dev/acpica/namespace/nsparse.c optional acpi +contrib/dev/acpica/namespace/nspredef.c optional acpi +contrib/dev/acpica/namespace/nsrepair.c optional acpi +contrib/dev/acpica/namespace/nsrepair2.c optional acpi +contrib/dev/acpica/namespace/nssearch.c optional acpi +contrib/dev/acpica/namespace/nsutils.c optional acpi +contrib/dev/acpica/namespace/nswalk.c optional acpi +contrib/dev/acpica/namespace/nsxfeval.c optional acpi +contrib/dev/acpica/namespace/nsxfname.c optional acpi +contrib/dev/acpica/namespace/nsxfobj.c optional acpi +contrib/dev/acpica/parser/psargs.c optional acpi +contrib/dev/acpica/parser/psloop.c optional acpi +contrib/dev/acpica/parser/psopcode.c optional acpi +contrib/dev/acpica/parser/psparse.c optional acpi +contrib/dev/acpica/parser/psscope.c optional acpi +contrib/dev/acpica/parser/pstree.c optional acpi +contrib/dev/acpica/parser/psutils.c optional acpi +contrib/dev/acpica/parser/pswalk.c optional acpi +contrib/dev/acpica/parser/psxface.c optional acpi +contrib/dev/acpica/resources/rsaddr.c optional acpi +contrib/dev/acpica/resources/rscalc.c optional acpi +contrib/dev/acpica/resources/rscreate.c optional acpi +contrib/dev/acpica/resources/rsdump.c optional acpi +contrib/dev/acpica/resources/rsinfo.c optional acpi +contrib/dev/acpica/resources/rsio.c optional acpi +contrib/dev/acpica/resources/rsirq.c optional acpi +contrib/dev/acpica/resources/rslist.c optional acpi +contrib/dev/acpica/resources/rsmemory.c optional acpi +contrib/dev/acpica/resources/rsmisc.c optional acpi +contrib/dev/acpica/resources/rsutils.c optional acpi +contrib/dev/acpica/resources/rsxface.c optional acpi +contrib/dev/acpica/tables/tbfadt.c optional acpi +contrib/dev/acpica/tables/tbfind.c optional acpi +contrib/dev/acpica/tables/tbinstal.c optional acpi +contrib/dev/acpica/tables/tbutils.c optional acpi +contrib/dev/acpica/tables/tbxface.c optional acpi +contrib/dev/acpica/tables/tbxfroot.c optional acpi +contrib/dev/acpica/utilities/utalloc.c optional acpi +contrib/dev/acpica/utilities/utcache.c optional acpi +contrib/dev/acpica/utilities/utcopy.c optional acpi +contrib/dev/acpica/utilities/utdebug.c optional acpi +contrib/dev/acpica/utilities/utdelete.c optional acpi +contrib/dev/acpica/utilities/uteval.c optional acpi +contrib/dev/acpica/utilities/utglobal.c optional acpi +contrib/dev/acpica/utilities/utids.c optional acpi +contrib/dev/acpica/utilities/utinit.c optional acpi +contrib/dev/acpica/utilities/utlock.c optional acpi +contrib/dev/acpica/utilities/utmath.c optional acpi +contrib/dev/acpica/utilities/utmisc.c optional acpi +contrib/dev/acpica/utilities/utmutex.c optional acpi +contrib/dev/acpica/utilities/utobject.c optional acpi +contrib/dev/acpica/utilities/utresrc.c optional acpi +contrib/dev/acpica/utilities/utstate.c optional acpi +contrib/dev/acpica/utilities/utxface.c optional acpi contrib/ipfilter/netinet/fil.c optional ipfilter inet \ compile-with "${NORMAL_C} -I$S/contrib/ipfilter" contrib/ipfilter/netinet/ip_auth.c optional ipfilter inet \ @@ -519,19 +521,18 @@ dev/ata/chipsets/ata-highpoint.c optional ata pci | atahighpoint dev/ata/chipsets/ata-intel.c optional ata pci | ataintel dev/ata/chipsets/ata-ite.c optional ata pci | ataite dev/ata/chipsets/ata-jmicron.c optional ata pci | atajmicron -dev/ata/chipsets/ata-marvell.c optional ata pci | atamarvell +dev/ata/chipsets/ata-marvell.c optional ata pci | atamarvell | ataadaptec dev/ata/chipsets/ata-micron.c optional ata pci | atamicron dev/ata/chipsets/ata-national.c optional ata pci | atanational dev/ata/chipsets/ata-netcell.c optional ata pci | atanetcell dev/ata/chipsets/ata-nvidia.c optional ata pci | atanvidia dev/ata/chipsets/ata-promise.c optional ata pci | atapromise dev/ata/chipsets/ata-serverworks.c optional ata pci | ataserverworks -dev/ata/chipsets/ata-siliconimage.c optional ata pci | atasiliconimage +dev/ata/chipsets/ata-siliconimage.c optional ata pci | atasiliconimage | ataati dev/ata/chipsets/ata-sis.c optional ata pci | atasis dev/ata/chipsets/ata-via.c optional ata pci | atavia dev/ata/ata-disk.c optional atadisk dev/ata/ata-raid.c optional ataraid -dev/ata/ata-usb.c optional atausb usb dev/ata/atapi-cd.c optional atapicd dev/ata/atapi-fd.c optional atapifd dev/ata/atapi-tape.c optional atapist @@ -553,6 +554,9 @@ dev/ath/ath_hal/ah_eeprom_v3.c optional ath_hal | ath_ar5211 | ath_ar5212 \ dev/ath/ath_hal/ah_eeprom_v14.c \ optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ compile-with "${NORMAL_C} -I$S/dev/ath" +dev/ath/ath_hal/ah_eeprom_v4k.c \ + optional ath_hal | ath_ar9285 \ + compile-with "${NORMAL_C} -I$S/dev/ath" dev/ath/ath_hal/ah_regdomain.c optional ath \ compile-with "${NORMAL_C} -I$S/dev/ath" # ar5210 @@ -599,104 +603,124 @@ dev/ath/ath_hal/ar5211/ar5211_xmit.c optional ath_hal | ath_ar5211 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" # ar5212 dev/ath/ath_hal/ar5212/ar5212_ani.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_attach.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_beacon.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_eeprom.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_gpio.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_interrupts.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_keycache.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_misc.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_phy.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_power.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_recv.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_reset.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_rfgain.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5212/ar5212_xmit.c \ - optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5212 | ath_ar5416 | ath_ar9160 | ath_ar9280 | \ + ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" # ar5416 (depends on ar5212) dev/ath/ath_hal/ar5416/ar5416_ani.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_attach.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_beacon.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_cal.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_cal_iq.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_cal_adcgain.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_cal_adcdc.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_eeprom.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_gpio.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_interrupts.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_keycache.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_misc.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_phy.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_power.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_recv.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_reset.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar5416_xmit.c \ - optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 \ + optional ath_hal | ath_ar5416 | ath_ar9160 | ath_ar9280 | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" # ar9160 (depends on ar5416) dev/ath/ath_hal/ar5416/ar9160_attach.c optional ath_hal | ath_ar9160 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" # ar9280 (depends on ar5416) -dev/ath/ath_hal/ar5416/ar9280_attach.c optional ath_hal | ath_ar9280 \ +dev/ath/ath_hal/ar5416/ar9280_attach.c optional ath_hal | ath_ar9280 | \ + ath_ar9285 \ + compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" +# ar9285 (depends on ar5416 and ar9280) +dev/ath/ath_hal/ar5416/ar9285_attach.c optional ath_hal | ath_ar9285 \ + compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" +dev/ath/ath_hal/ar5416/ar9285_reset.c optional ath_hal | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" # rf backends dev/ath/ath_hal/ar5212/ar2316.c optional ath_rf2316 \ @@ -715,7 +739,9 @@ dev/ath/ath_hal/ar5212/ar5413.c optional ath_hal | ath_rf5413 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" dev/ath/ath_hal/ar5416/ar2133.c optional ath_hal | ath_ar5416 | ath_ar9160 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" -dev/ath/ath_hal/ar5416/ar9280.c optional ath_hal | ath_ar9280 \ +dev/ath/ath_hal/ar5416/ar9280.c optional ath_hal | ath_ar9280 | ath_ar9285 \ + compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" +dev/ath/ath_hal/ar5416/ar9285.c optional ath_hal | ath_ar9285 \ compile-with "${NORMAL_C} -I$S/dev/ath -I$S/dev/ath/ath_hal" # ath rate control algorithms dev/ath/ath_rate/amrr/amrr.c optional ath_rate_amrr \ @@ -774,6 +800,8 @@ dev/cxgb/common/cxgb_vsc8211.c optional cxgb pci \ compile-with "${NORMAL_C} -I$S/dev/cxgb" dev/cxgb/common/cxgb_ael1002.c optional cxgb pci \ compile-with "${NORMAL_C} -I$S/dev/cxgb" +dev/cxgb/common/cxgb_aq100x.c optional cxgb pci \ + compile-with "${NORMAL_C} -I$S/dev/cxgb" dev/cxgb/common/cxgb_mv88e1xxx.c optional cxgb pci \ compile-with "${NORMAL_C} -I$S/dev/cxgb" dev/cxgb/common/cxgb_xgmac.c optional cxgb pci \ @@ -818,12 +846,15 @@ dev/drm/drm_dma.c optional drm dev/drm/drm_drawable.c optional drm dev/drm/drm_drv.c optional drm dev/drm/drm_fops.c optional drm +dev/drm/drm_hashtab.c optional drm dev/drm/drm_ioctl.c optional drm dev/drm/drm_irq.c optional drm dev/drm/drm_lock.c optional drm dev/drm/drm_memory.c optional drm +dev/drm/drm_mm.c optional drm dev/drm/drm_pci.c optional drm dev/drm/drm_scatter.c optional drm +dev/drm/drm_sman.c optional drm dev/drm/drm_sysctl.c optional drm dev/drm/drm_vm.c optional drm dev/drm/i915_dma.c optional i915drm @@ -862,6 +893,14 @@ dev/drm/sis_drv.c optional sisdrm dev/drm/sis_ds.c optional sisdrm dev/drm/sis_mm.c optional sisdrm dev/drm/tdfx_drv.c optional tdfxdrm +dev/drm/via_dma.c optional viadrm +dev/drm/via_dmablit.c optional viadrm +dev/drm/via_drv.c optional viadrm +dev/drm/via_irq.c optional viadrm +dev/drm/via_map.c optional viadrm +dev/drm/via_mm.c optional viadrm +dev/drm/via_verifier.c optional viadrm +dev/drm/via_video.c optional viadrm dev/ed/if_ed.c optional ed dev/ed/if_ed_novell.c optional ed dev/ed/if_ed_rtl80x9.c optional ed @@ -930,6 +969,7 @@ dev/firewire/if_fwip.c optional fwip dev/firewire/sbp.c optional sbp dev/firewire/sbp_targ.c optional sbp_targ dev/flash/at45d.c optional at45d +dev/flash/mx25l.c optional mx25l dev/fxp/if_fxp.c optional fxp inet dev/gem/if_gem.c optional gem dev/gem/if_gem_pci.c optional gem pci @@ -1079,20 +1119,76 @@ iwi_monitor.fw optional iwimonitorfw | iwifw \ no-obj no-implicit-rule \ clean "iwi_monitor.fw" dev/iwn/if_iwn.c optional iwn -iwnfw.c optional iwnfw \ - compile-with "${AWK} -f $S/tools/fw_stub.awk iwn.fw:iwnfw:44417 -lintel_iwn -miwn -c${.TARGET}" \ +iwn1000fw.c optional iwn1000fw | iwnfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk iwn1000.fw:iwn1000fw -miwn1000fw -c${.TARGET}" \ no-implicit-rule before-depend local \ - clean "iwnfw.c" -iwnfw.fwo optional iwnfw \ - dependency "iwn.fw" \ - compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn.fw" \ + clean "iwn1000fw.c" +iwn1000fw.fwo optional iwn1000fw | iwnfw \ + dependency "iwn1000.fw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn1000.fw" \ no-implicit-rule \ - clean "iwnfw.fwo" -iwn.fw optional iwnfw \ + clean "iwn1000fw.fwo" +iwn1000.fw optional iwn1000fw | iwnfw \ dependency ".PHONY" \ - compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-4965-4.44.17.fw.uu" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-1000-128.50.3.1.fw.uu" \ no-obj no-implicit-rule \ - clean "iwn.fw" + clean "iwn1000.fw" +iwn4965fw.c optional iwn4965fw | iwnfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk iwn4965.fw:iwn4965fw -miwn4965fw -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "iwn4965fw.c" +iwn4965fw.fwo optional iwn4965fw | iwnfw \ + dependency "iwn4965.fw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn4965.fw" \ + no-implicit-rule \ + clean "iwn4965fw.fwo" +iwn4965.fw optional iwn4965fw | iwnfw \ + dependency ".PHONY" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-4965-228.61.2.24.fw.uu" \ + no-obj no-implicit-rule \ + clean "iwn4965.fw" +iwn5000fw.c optional iwn5000fw | iwnfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk iwn5000.fw:iwn5000fw -miwn5000fw -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "iwn5000fw.c" +iwn5000fw.fwo optional iwn5000fw | iwnfw \ + dependency "iwn5000.fw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn5000.fw" \ + no-implicit-rule \ + clean "iwn5000fw.fwo" +iwn5000.fw optional iwn5000fw | iwnfw \ + dependency ".PHONY" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-5000-8.24.2.12.fw.uu" \ + no-obj no-implicit-rule \ + clean "iwn5000.fw" +iwn5150fw.c optional iwn5150fw | iwnfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk iwn5150.fw:iwn5150fw -miwn5150fw -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "iwn5150fw.c" +iwn5150fw.fwo optional iwn5150fw | iwnfw \ + dependency "iwn5150.fw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn5150.fw" \ + no-implicit-rule \ + clean "iwn5150fw.fwo" +iwn5150.fw optional iwn5150fw | iwnfw \ + dependency ".PHONY" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-5150-8.24.2.2.fw.uu" \ + no-obj no-implicit-rule \ + clean "iwn5150.fw" +iwn6000fw.c optional iwn6000fw | iwnfw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk iwn6000.fw:iwn6000fw -miwn6000fw -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "iwn6000fw.c" +iwn6000fw.fwo optional iwn6000fw | iwnfw \ + dependency "iwn6000.fw" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} iwn6000.fw" \ + no-implicit-rule \ + clean "iwn6000fw.fwo" +iwn6000.fw optional iwn6000fw | iwnfw \ + dependency ".PHONY" \ + compile-with "uudecode -o ${.TARGET} $S/contrib/dev/iwn/iwlwifi-6000-9.176.4.1.fw.uu" \ + no-obj no-implicit-rule \ + clean "iwn6000.fw" dev/ixgb/if_ixgb.c optional ixgb dev/ixgb/ixgb_ee.c optional ixgb dev/ixgb/ixgb_hw.c optional ixgb @@ -1616,7 +1712,7 @@ dev/usb/usb_request.c optional usb dev/usb/usb_transfer.c optional usb dev/usb/usb_util.c optional usb # -# USB ethernet drivers +# USB network drivers # dev/usb/net/if_aue.c optional aue dev/usb/net/if_axe.c optional axe @@ -1625,12 +1721,14 @@ dev/usb/net/if_cue.c optional cue dev/usb/net/if_kue.c optional kue dev/usb/net/if_rue.c optional rue dev/usb/net/if_udav.c optional udav -dev/usb/net/usb_ethernet.c \ - optional (aue | axe | cdce | cue | kue | rue | udav) +dev/usb/net/usb_ethernet.c optional aue | axe | cdce | cue | kue | rue | \ + udav +dev/usb/net/uhso.c optional uhso # # USB WLAN drivers # dev/usb/wlan/if_rum.c optional rum +dev/usb/wlan/if_run.c optional run dev/usb/wlan/if_uath.c optional uath dev/usb/wlan/if_upgt.c optional upgt dev/usb/wlan/if_ural.c optional ural @@ -1657,8 +1755,11 @@ dev/usb/serial/uplcom.c optional uplcom dev/usb/serial/uslcom.c optional uslcom dev/usb/serial/uvisor.c optional uvisor dev/usb/serial/uvscom.c optional uvscom -dev/usb/serial/usb_serial.c optional ucom | \ - (u3g | uark | ubsa | ubser | uchcom | ucycom | ufoma | uftdi | ugensa | uipaq | ulpt | umct | umodem | umoscom | uplcom | uslcom | uvisor | uvscom) +dev/usb/serial/usb_serial.c optional ucom | u3g | uark | ubsa | ubser | \ + uchcom | ucycom | ufoma | uftdi | \ + ugensa | uipaq | ulpt | umct | \ + umodem | umoscom | uplcom | uslcom | \ + uvisor | uvscom # # USB misc drivers # @@ -1667,6 +1768,7 @@ dev/usb/misc/udbp.c optional udbp # # USB input drivers # +dev/usb/input/atp.c optional atp dev/usb/input/uhid.c optional uhid dev/usb/input/ukbd.c optional ukbd dev/usb/input/ums.c optional ums @@ -1871,6 +1973,7 @@ geom/label/g_label_gpt.c optional geom_label geom/linux_lvm/g_linux_lvm.c optional geom_linux_lvm geom/mirror/g_mirror.c optional geom_mirror geom/mirror/g_mirror_ctl.c optional geom_mirror +geom/mountver/g_mountver.c optional geom_mountver geom/multipath/g_multipath.c optional geom_multipath geom/nop/g_nop.c optional geom_nop geom/part/g_part.c standard @@ -1891,18 +1994,15 @@ geom/virstor/binstream.c optional geom_virstor geom/virstor/g_virstor.c optional geom_virstor geom/virstor/g_virstor_md.c optional geom_virstor geom/zero/g_zero.c optional geom_zero -gnu/fs/ext2fs/ext2_alloc.c optional ext2fs \ - warning "kernel contains GPL contaminated ext2fs filesystem" -gnu/fs/ext2fs/ext2_balloc.c optional ext2fs -gnu/fs/ext2fs/ext2_bmap.c optional ext2fs -gnu/fs/ext2fs/ext2_inode.c optional ext2fs -gnu/fs/ext2fs/ext2_inode_cnv.c optional ext2fs -gnu/fs/ext2fs/ext2_linux_balloc.c optional ext2fs -gnu/fs/ext2fs/ext2_linux_ialloc.c optional ext2fs -gnu/fs/ext2fs/ext2_lookup.c optional ext2fs -gnu/fs/ext2fs/ext2_subr.c optional ext2fs -gnu/fs/ext2fs/ext2_vfsops.c optional ext2fs -gnu/fs/ext2fs/ext2_vnops.c optional ext2fs +fs/ext2fs/ext2_alloc.c optional ext2fs +fs/ext2fs/ext2_balloc.c optional ext2fs +fs/ext2fs/ext2_bmap.c optional ext2fs +fs/ext2fs/ext2_inode.c optional ext2fs +fs/ext2fs/ext2_inode_cnv.c optional ext2fs +fs/ext2fs/ext2_lookup.c optional ext2fs +fs/ext2fs/ext2_subr.c optional ext2fs +fs/ext2fs/ext2_vfsops.c optional ext2fs +fs/ext2fs/ext2_vnops.c optional ext2fs gnu/fs/reiserfs/reiserfs_hashes.c optional reiserfs \ warning "kernel contains GPL contaminated ReiserFS filesystem" gnu/fs/reiserfs/reiserfs_inode.c optional reiserfs @@ -1916,7 +2016,6 @@ gnu/fs/reiserfs/reiserfs_vnops.c optional reiserfs isa/isa_if.m standard isa/isa_common.c optional isa isa/isahint.c optional isa -isa/orm.c optional isa isa/pnp.c optional isa isapnp isa/pnpparse.c optional isa isapnp fs/cd9660/cd9660_bmap.c optional cd9660 @@ -1954,6 +2053,7 @@ kern/kern_exec.c standard kern/kern_exit.c standard kern/kern_fail.c standard kern/kern_fork.c standard +kern/kern_gzio.c optional gzio kern/kern_idle.c standard kern/kern_intr.c standard kern/kern_jail.c standard @@ -1985,7 +2085,6 @@ kern/kern_sdt.c optional kdtrace_hooks kern/kern_sema.c standard kern/kern_shutdown.c standard kern/kern_sig.c standard -kern/kern_subr.c standard kern/kern_switch.c standard kern/kern_sx.c standard kern/kern_synch.c standard @@ -2022,6 +2121,7 @@ kern/subr_disk.c standard kern/subr_eventhandler.c standard kern/subr_fattime.c standard kern/subr_firmware.c optional firmware +kern/subr_hash.c standard kern/subr_hints.c standard kern/subr_kdb.c standard kern/subr_kobj.c standard @@ -2047,6 +2147,7 @@ kern/subr_stack.c optional ddb | stack | ktr kern/subr_taskqueue.c standard kern/subr_trap.c standard kern/subr_turnstile.c standard +kern/subr_uio.c standard kern/subr_unit.c standard kern/subr_witness.c optional witness kern/sys_generic.c standard @@ -2162,6 +2263,7 @@ libkern/iconv_converter_if.m optional libiconv libkern/iconv_xlat.c optional libiconv libkern/iconv_xlat16.c optional libiconv libkern/index.c standard +libkern/inet_aton.c standard libkern/inet_ntoa.c standard libkern/mcount.c optional profiling-routine libkern/memcmp.c standard @@ -2243,7 +2345,7 @@ net/slcompress.c optional netgraph_vjc | sppp | \ net/vnet.c optional vimage net/zlib.c optional crypto | geom_uzip | ipsec | \ mxge | netgraph_deflate | \ - ddb_ctf + ddb_ctf | zlib net80211/ieee80211.c optional wlan net80211/ieee80211_acl.c optional wlan wlan_acl net80211/ieee80211_action.c optional wlan @@ -2368,6 +2470,7 @@ netgraph/ng_tcpmss.c optional netgraph_tcpmss netgraph/ng_tee.c optional netgraph_tee netgraph/ng_tty.c optional netgraph_tty netgraph/ng_vjc.c optional netgraph_vjc +netgraph/ng_vlan.c optional netgraph_vlan netinet/accf_data.c optional accept_filter_data inet netinet/accf_dns.c optional accept_filter_dns inet netinet/accf_http.c optional accept_filter_http inet @@ -2391,7 +2494,11 @@ netinet/ip_encap.c optional inet | inet6 netinet/ip_fastfwd.c optional inet netinet/ipfw/ip_fw2.c optional inet ipfirewall \ compile-with "${NORMAL_C} -I$S/contrib/pf" +netinet/ipfw/ip_fw_dynamic.c optional inet ipfirewall +netinet/ipfw/ip_fw_log.c optional inet ipfirewall netinet/ipfw/ip_fw_pfil.c optional inet ipfirewall +netinet/ipfw/ip_fw_sockopt.c optional inet ipfirewall +netinet/ipfw/ip_fw_table.c optional inet ipfirewall netinet/ipfw/ip_fw_nat.c optional inet ipfirewall_nat netinet/ip_icmp.c optional inet netinet/ip_input.c optional inet @@ -2667,12 +2774,12 @@ vm/vm_reserv.c standard vm/vm_unix.c standard vm/vm_zeroidle.c standard vm/vnode_pager.c standard -xdr/xdr.c optional krpc | nfslockd | nfsclient | nfsserver -xdr/xdr_array.c optional krpc | nfslockd | nfsclient | nfsserver -xdr/xdr_mbuf.c optional krpc | nfslockd | nfsclient | nfsserver -xdr/xdr_mem.c optional krpc | nfslockd | nfsclient | nfsserver -xdr/xdr_reference.c optional krpc | nfslockd | nfsclient | nfsserver -xdr/xdr_sizeof.c optional krpc | nfslockd | nfsclient | nfsserver +xdr/xdr.c optional krpc | nfslockd | nfsclient | nfsserver | nfscl | nfsd +xdr/xdr_array.c optional krpc | nfslockd | nfsclient | nfsserver | nfscl | nfsd +xdr/xdr_mbuf.c optional krpc | nfslockd | nfsclient | nfsserver | nfscl | nfsd +xdr/xdr_mem.c optional krpc | nfslockd | nfsclient | nfsserver | nfscl | nfsd +xdr/xdr_reference.c optional krpc | nfslockd | nfsclient | nfsserver | nfscl | nfsd +xdr/xdr_sizeof.c optional krpc | nfslockd | nfsclient | nfsserver | nfscl | nfsd # gnu/fs/xfs/xfs_alloc.c optional xfs \ compile-with "${NORMAL_C} -I$S/gnu/fs/xfs/FreeBSD -I$S/gnu/fs/xfs/FreeBSD/support -I$S/gnu/fs/xfs" \ diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64 index 30d6e5ac1332..9300f898eb3e 100644 --- a/sys/conf/files.amd64 +++ b/sys/conf/files.amd64 @@ -131,13 +131,6 @@ amd64/amd64/tsc.c standard amd64/amd64/uio_machdep.c standard amd64/amd64/uma_machdep.c standard amd64/amd64/vm_machdep.c standard -amd64/isa/atpic.c optional atpic isa -#amd64/isa/atpic_vector.S optional atpic isa -amd64/isa/clock.c standard -amd64/isa/elcr.c standard -amd64/isa/isa.c standard -amd64/isa/isa_dma.c standard -amd64/isa/nmi.c standard amd64/pci/pci_bus.c optional pci amd64/pci/pci_cfgreg.c optional pci crypto/blowfish/bf_enc.c optional crypto | ipsec @@ -151,6 +144,7 @@ dev/agp/agp_amd64.c optional agp dev/agp/agp_i810.c optional agp dev/agp/agp_intel.c optional agp dev/agp/agp_via.c optional agp +dev/amdsbwd/amdsbwd.c optional amdsbwd dev/amdtemp/amdtemp.c optional amdtemp dev/arcmsr/arcmsr.c optional arcmsr pci dev/asmc/asmc.c optional asmc isa @@ -207,7 +201,7 @@ dev/hwpmc/hwpmc_core.c optional hwpmc dev/hwpmc/hwpmc_piv.c optional hwpmc dev/hwpmc/hwpmc_tsc.c optional hwpmc dev/hwpmc/hwpmc_x86.c optional hwpmc -dev/kbd/kbd.c optional atkbd | sc | ukbd | usb2_input_kbd +dev/kbd/kbd.c optional atkbd | sc | ukbd dev/lindev/full.c optional lindev dev/lindev/lindev.c optional lindev dev/mem/memutil.c optional mem @@ -227,7 +221,6 @@ dev/syscons/scvgarndr.c optional sc vga dev/syscons/scvtb.c optional sc dev/uart/uart_cpu_amd64.c optional uart dev/wpi/if_wpi.c optional wpi -isa/atrtc.c standard isa/syscons_isa.c optional sc isa/vga_isa.c optional vga kern/link_elf_obj.c standard @@ -287,12 +280,6 @@ compat/ndis/subr_ntoskrnl.c optional ndisapi pci compat/ndis/subr_pe.c optional ndisapi pci compat/ndis/subr_usbd.c optional ndisapi pci compat/ndis/winx64_wrap.S optional ndisapi pci -i386/bios/smbios.c optional smbios -i386/bios/vpd.c optional vpd -i386/cpufreq/powernow.c optional cpufreq -i386/cpufreq/est.c optional cpufreq -i386/cpufreq/hwpstate.c optional cpufreq -i386/cpufreq/p4tcc.c optional cpufreq # libkern/memmove.c standard libkern/memset.c standard @@ -300,6 +287,21 @@ libkern/memset.c standard # x86 real mode BIOS emulator, required by atkbdc/dpms/vesa # compat/x86bios/x86bios.c optional x86bios | atkbd | dpms | vesa -compat/x86bios/x86bios_alloc.c optional x86bios | atkbd | dpms | vesa contrib/x86emu/x86emu.c optional x86bios | atkbd | dpms | vesa -contrib/x86emu/x86emu_util.c optional x86bios | atkbd | dpms | vesa +# +# x86 shared code between IA32, AMD64 and PC98 architectures +# +x86/bios/smbios.c optional smbios +x86/bios/vpd.c optional vpd +x86/cpufreq/powernow.c optional cpufreq +x86/cpufreq/est.c optional cpufreq +x86/cpufreq/hwpstate.c optional cpufreq +x86/cpufreq/p4tcc.c optional cpufreq +x86/isa/atpic.c optional atpic isa +x86/isa/atrtc.c standard +x86/isa/clock.c standard +x86/isa/elcr.c standard +x86/isa/isa.c standard +x86/isa/isa_dma.c standard +x86/isa/nmi.c standard +x86/isa/orm.c optional isa diff --git a/sys/conf/files.arm b/sys/conf/files.arm index be0f9959f50e..c03cea4e2af8 100644 --- a/sys/conf/files.arm +++ b/sys/conf/files.arm @@ -47,6 +47,7 @@ arm/arm/vm_machdep.c standard arm/fpe-arm/armfpe_glue.S optional armfpe arm/fpe-arm/armfpe_init.c optional armfpe arm/fpe-arm/armfpe.S optional armfpe +dev/hwpmc/hwpmc_arm.c optional hwpmc geom/geom_bsd.c optional geom_bsd geom/geom_bsd_enc.c optional geom_bsd geom/geom_mbr.c optional geom_mbr diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index 7f6cadd4293b..a61dca22312a 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -127,6 +127,7 @@ dev/agp/agp_nvidia.c optional agp dev/agp/agp_sis.c optional agp dev/agp/agp_via.c optional agp dev/aic/aic_isa.c optional aic isa +dev/amdsbwd/amdsbwd.c optional amdsbwd dev/amdtemp/amdtemp.c optional amdtemp dev/arcmsr/arcmsr.c optional arcmsr pci dev/asmc/asmc.c optional asmc isa @@ -199,7 +200,7 @@ dev/ipmi/ipmi_smbios.c optional ipmi dev/ipmi/ipmi_ssif.c optional ipmi smbus dev/ipmi/ipmi_pci.c optional ipmi pci dev/ipmi/ipmi_linux.c optional ipmi compat_linux -dev/kbd/kbd.c optional atkbd | sc | ukbd | usb2_input_kbd +dev/kbd/kbd.c optional atkbd | sc | ukbd dev/le/if_le_isa.c optional le isa dev/lindev/full.c optional lindev dev/lindev/lindev.c optional lindev @@ -243,13 +244,6 @@ i386/bios/apm.c optional apm i386/bios/mca_machdep.c optional mca i386/bios/smapi.c optional smapi i386/bios/smapi_bios.S optional smapi -i386/bios/smbios.c optional smbios -i386/bios/vpd.c optional vpd -i386/cpufreq/est.c optional cpufreq -i386/cpufreq/hwpstate.c optional cpufreq -i386/cpufreq/p4tcc.c optional cpufreq -i386/cpufreq/powernow.c optional cpufreq -i386/cpufreq/smist.c optional cpufreq #i386/i386/apic_vector.s optional apic i386/i386/atomic.c standard \ compile-with "${CC} -c ${CFLAGS} ${DEFINED_PROF:S/^$/-fomit-frame-pointer/} ${.IMPSRC}" @@ -328,17 +322,10 @@ i386/ibcs2/ibcs2_util.c optional ibcs2 i386/ibcs2/ibcs2_xenix.c optional ibcs2 i386/ibcs2/ibcs2_xenix_sysent.c optional ibcs2 i386/ibcs2/imgact_coff.c optional ibcs2 -i386/isa/atpic.c optional atpic -#i386/isa/atpic_vector.s standard -i386/isa/clock.c optional native i386/xen/clock.c optional xen i386/xen/xen_clock_util.c optional xen i386/xen/xen_rtc.c optional xen -i386/isa/elcr.c standard i386/isa/elink.c optional ep | ie -i386/isa/isa.c optional isa -i386/isa/isa_dma.c optional isa -i386/isa/nmi.c standard i386/isa/npx.c optional npx i386/isa/pmtimer.c optional pmtimer i386/isa/prof_machdep.c optional profiling-routine @@ -361,7 +348,6 @@ i386/svr4/svr4_locore.s optional compat_svr4 \ warning "COMPAT_SVR4 is broken and should be avoided" i386/svr4/svr4_machdep.c optional compat_svr4 # -isa/atrtc.c optional atpic isa/syscons_isa.c optional sc isa/vga_isa.c optional vga kern/imgact_aout.c optional compat_aout @@ -384,6 +370,22 @@ i386/xbox/pic16l.s optional xbox # x86 real mode BIOS emulator, required by atkbdc/dpms/vesa # compat/x86bios/x86bios.c optional x86bios | atkbd | dpms | vesa -compat/x86bios/x86bios_alloc.c optional x86bios | atkbd | dpms | vesa contrib/x86emu/x86emu.c optional x86bios | atkbd | dpms | vesa -contrib/x86emu/x86emu_util.c optional x86bios | atkbd | dpms | vesa +# +# x86 shared code between IA32, AMD64 and PC98 architectures +# +x86/bios/smbios.c optional smbios +x86/bios/vpd.c optional vpd +x86/cpufreq/est.c optional cpufreq +x86/cpufreq/hwpstate.c optional cpufreq +x86/cpufreq/p4tcc.c optional cpufreq +x86/cpufreq/powernow.c optional cpufreq +x86/cpufreq/smist.c optional cpufreq +x86/isa/atpic.c optional atpic +x86/isa/atrtc.c optional atpic +x86/isa/clock.c optional native +x86/isa/elcr.c standard +x86/isa/isa.c optional isa +x86/isa/isa_dma.c optional isa +x86/isa/nmi.c standard +x86/isa/orm.c optional isa diff --git a/sys/conf/files.ia64 b/sys/conf/files.ia64 index 864be05c93a3..86ca96394d2e 100644 --- a/sys/conf/files.ia64 +++ b/sys/conf/files.ia64 @@ -45,8 +45,6 @@ contrib/ia64/libuwx/src/uwx_uinfo.c standard contrib/ia64/libuwx/src/uwx_utable.c standard crypto/blowfish/bf_enc.c optional crypto | ipsec crypto/des/des_enc.c optional crypto | ipsec | netsmb -dev/advansys/adv_isa.c optional adv isa -dev/aic/aic_isa.c optional aic isa dev/atkbdc/atkbd.c optional atkbd atkbdc dev/atkbdc/atkbd_atkbdc.c optional atkbd atkbdc dev/atkbdc/atkbdc.c optional atkbdc @@ -56,7 +54,8 @@ dev/atkbdc/psm.c optional psm atkbdc dev/fb/fb.c optional fb | vga dev/fb/vga.c optional vga dev/hwpmc/hwpmc_ia64.c optional hwpmc -dev/kbd/kbd.c optional atkbd | sc | ukbd | usb2_input_kbd +dev/io/iodev.c optional io +dev/kbd/kbd.c optional atkbd | sc | ukbd dev/syscons/scterm-teken.c optional sc dev/syscons/scvgarndr.c optional sc vga dev/syscons/scvtb.c optional sc @@ -74,6 +73,7 @@ ia64/ia32/ia32_reg.c optional compat_ia32 ia64/ia32/ia32_signal.c optional compat_ia32 ia64/ia32/ia32_trap.c optional compat_ia32 ia64/ia64/autoconf.c standard +ia64/ia64/bus_machdep.c standard ia64/ia64/busdma_machdep.c standard ia64/ia64/clock.c standard ia64/ia64/context.S standard @@ -84,8 +84,10 @@ ia64/ia64/elf_machdep.c standard ia64/ia64/emulate.c standard ia64/ia64/exception.S standard ia64/ia64/gdb_machdep.c optional gdb +ia64/ia64/highfp.c standard ia64/ia64/in_cksum.c optional inet ia64/ia64/interrupt.c standard +ia64/ia64/iodev_machdep.c optional io ia64/ia64/locore.S standard no-obj ia64/ia64/machdep.c standard ia64/ia64/mca.c standard diff --git a/sys/conf/files.mips b/sys/conf/files.mips index 1e233d789ef8..4b6c54a22656 100644 --- a/sys/conf/files.mips +++ b/sys/conf/files.mips @@ -5,10 +5,6 @@ # All rights reserved. # JNPR: files.mips,v 1.11 2007/08/09 12:25:35 katta # -# The long compile-with and dependency lines are required because of -# limitations in config: backslash-newline doesn't work in strings, and -# dependency lines other than the first are silently ignored. -# # ---------------------------------------------------------------------- # Phase 2 # ---------------------------------------------------------------------- @@ -20,15 +16,12 @@ # JNPR: files.mips,v 1.11 2007/08/09 12:25:35 katta # $FreeBSD$ # -# The long compile-with and dependency lines are required because of -# limitations in config: backslash-newline doesn't work in strings, and -# dependency lines other than the first are silently ignored. -# # ---------------------------------------------------------------------- # Phase 2 # ---------------------------------------------------------------------- mips/mips/machdep.c standard mips/mips/mp_machdep.c optional smp +mips/mips/mpboot.S optional smp mips/mips/psraccess.S standard # ---------------------------------------------------------------------- # Phase 3 @@ -38,14 +31,13 @@ mips/mips/cpu.c standard mips/mips/elf_machdep.c standard mips/mips/exception.S standard mips/mips/gdb_machdep.c standard -mips/mips/mainbus.c standard +# mips/mips/mainbus.c standard mips/mips/pmap.c standard mips/mips/trap.c standard mips/mips/vm_machdep.c standard # ---------------------------------------------------------------------- # Phase 4 # ---------------------------------------------------------------------- -mips/mips/tick.c standard # ---------------------------------------------------------------------- # Phase 5 # ---------------------------------------------------------------------- @@ -54,6 +46,7 @@ mips/mips/pm_machdep.c standard mips/mips/swtch.S standard mips/mips/tlb.S standard +mips/mips/bus_space_generic.c standard mips/mips/busdma_machdep.c standard mips/mips/cache.c standard mips/mips/cache_mipsNN.c standard @@ -63,36 +56,48 @@ mips/mips/db_interface.c optional ddb mips/mips/db_trace.c optional ddb mips/mips/dump_machdep.c standard mips/mips/in_cksum.c optional inet -mips/mips/intr_machdep.c standard mips/mips/locore.S standard no-obj mips/mips/mem.c optional mem mips/mips/nexus.c standard mips/mips/stack_machdep.c optional ddb | stack mips/mips/support.S standard +mips/mips/sys_machdep.c standard mips/mips/swtch.S standard mips/mips/uio_machdep.c standard +crypto/blowfish/bf_enc.c optional crypto | ipsec +crypto/des/des_enc.c optional crypto | ipsec | netsmb geom/geom_bsd.c optional geom_bsd geom/geom_bsd_enc.c optional geom_bsd geom/geom_mbr.c optional geom_mbr geom/geom_mbr_enc.c optional geom_mbr libkern/ashldi3.c standard libkern/ashrdi3.c standard -libkern/divdi3.c standard +libkern/cmpdi2.c standard +libkern/divdi3.c optional isa_mips32 libkern/ffsl.c standard libkern/fls.c standard libkern/flsl.c standard libkern/lshrdi3.c standard libkern/memmove.c standard -libkern/moddi3.c standard -libkern/qdivrem.c standard -libkern/udivdi3.c standard -libkern/umoddi3.c standard +libkern/moddi3.c optional isa_mips32 +libkern/qdivrem.c optional isa_mips32 +libkern/ucmpdi2.c standard +libkern/udivdi3.c optional isa_mips32 +libkern/umoddi3.c optional isa_mips32 #XXX: We can't use these versions, as strcmp.c is included conf/files #libkern/mips/strcmp.S standard #libkern/mips/strncmp.S standard +kern/link_elf_obj.c standard + dev/cfe/cfe_api.c optional cfe dev/cfe/cfe_console.c optional cfe_console +dev/cfe/cfe_env.c optional cfe_env #dev/cfe/cfe_resource.c optional cfe # not yet needed +dev/siba/siba.c optional siba +dev/siba/siba_cc.c optional siba +dev/siba/siba_core.c optional siba +dev/siba/siba_pcib.c optional siba pci +#mips/sentry5/siba_mips.c optional siba # not yet diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98 index 7f2afc5059cb..314b16ec4a20 100644 --- a/sys/conf/files.pc98 +++ b/sys/conf/files.pc98 @@ -105,7 +105,7 @@ dev/hwpmc/hwpmc_ppro.c optional hwpmc dev/hwpmc/hwpmc_tsc.c optional hwpmc dev/hwpmc/hwpmc_x86.c optional hwpmc dev/io/iodev.c optional io -dev/kbd/kbd.c optional pckbd | sc | ukbd | usb2_input_kbd +dev/kbd/kbd.c optional pckbd | sc | ukbd dev/le/if_le_cbus.c optional le isa dev/lindev/full.c optional lindev dev/lindev/lindev.c optional lindev @@ -194,10 +194,7 @@ i386/ibcs2/ibcs2_util.c optional ibcs2 i386/ibcs2/ibcs2_xenix.c optional ibcs2 i386/ibcs2/ibcs2_xenix_sysent.c optional ibcs2 i386/ibcs2/imgact_coff.c optional ibcs2 -i386/isa/atpic.c standard -#i386/isa/atpic_vector.s standard i386/isa/elink.c optional ep | ie -i386/isa/isa.c optional isa i386/isa/npx.c optional npx i386/isa/pmtimer.c optional pmtimer i386/isa/prof_machdep.c optional profiling-routine @@ -240,7 +237,7 @@ pc98/cbus/gdc.c optional gdc pc98/cbus/nmi.c standard pc98/cbus/olpt.c optional olpt pc98/cbus/pckbd.c optional pckbd -pc98/cbus/pcrtc.c standard +pc98/cbus/pcrtc.c optional atpic pc98/cbus/pmc.c optional pmc pc98/cbus/scgdcrndr.c optional sc gdc pc98/cbus/scterm-sck.c optional sc @@ -255,3 +252,8 @@ pc98/pc98/canbus.c optional canbus pc98/pc98/canbus_if.m optional canbus pc98/pc98/machdep.c standard pc98/pc98/pc98_machdep.c standard +# +# x86 shared code between IA32, AMD64 and PC98 architectures +# +x86/isa/atpic.c optional atpic +x86/isa/isa.c optional isa diff --git a/sys/conf/files.sparc64 b/sys/conf/files.sparc64 index ef6efa63e1e9..1f8c4a3e07eb 100644 --- a/sys/conf/files.sparc64 +++ b/sys/conf/files.sparc64 @@ -38,7 +38,7 @@ dev/fb/fb.c optional sc dev/fb/gallant12x22.c optional sc dev/fb/machfb.c optional machfb sc dev/hwpmc/hwpmc_sparc64.c optional hwpmc -dev/kbd/kbd.c optional atkbd | sc | ukbd | usb2_input_kbd +dev/kbd/kbd.c optional atkbd | sc | ukbd dev/le/if_le_lebuffer.c optional le sbus dev/le/if_le_ledma.c optional le sbus dev/le/lebuffer_sbus.c optional le sbus @@ -67,12 +67,14 @@ libkern/flsl.c standard libkern/memmove.c standard sparc64/central/central.c optional central sparc64/ebus/ebus.c optional ebus +sparc64/ebus/epic.c optional epic ebus sparc64/fhc/clkbrd.c optional fhc sparc64/fhc/fhc.c optional fhc sparc64/isa/isa.c optional isa sparc64/isa/isa_dma.c optional isa sparc64/isa/ofw_isa.c optional ebus | isa sparc64/pci/apb.c optional pci +sparc64/pci/fire.c optional pci sparc64/pci/ofw_pcib.c optional pci sparc64/pci/ofw_pcib_subr.c optional pci sparc64/pci/ofw_pcibus.c optional pci @@ -122,6 +124,7 @@ sparc64/sparc64/rwindow.c standard sparc64/sparc64/sc_machdep.c optional sc sparc64/sparc64/schppm.c standard sparc64/sparc64/spitfire.c standard +sparc64/sparc64/ssm.c standard sparc64/sparc64/stack_machdep.c optional ddb | stack sparc64/sparc64/support.S standard \ compile-with "${NORMAL_S} -mcpu=ultrasparc" diff --git a/sys/conf/files.sun4v b/sys/conf/files.sun4v index d83b0a29d293..5964f5659fc3 100644 --- a/sys/conf/files.sun4v +++ b/sys/conf/files.sun4v @@ -35,6 +35,10 @@ libkern/ffsl.c standard libkern/fls.c standard libkern/flsl.c standard libkern/memmove.c standard +sparc64/ebus/ebus.c optional ebus +sparc64/isa/isa.c optional isa +sparc64/isa/isa_dma.c optional isa +sparc64/isa/ofw_isa.c optional ebus | isa sparc64/sparc64/autoconf.c standard sun4v/sun4v/bus_machdep.c standard sun4v/sun4v/clock.c standard diff --git a/sys/conf/kern.mk b/sys/conf/kern.mk index f9618ef10a63..0f5cd6605c65 100644 --- a/sys/conf/kern.mk +++ b/sys/conf/kern.mk @@ -12,13 +12,7 @@ CWARNFLAGS= .else CWARNFLAGS?= -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes \ -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual \ - ${_wundef} ${_Wno_pointer_sign} -fformat-extensions -.if !defined(WITH_GCC3) -_Wno_pointer_sign=-Wno-pointer-sign -.endif -.if !defined(NO_UNDEF) -_wundef= -Wundef -.endif + -Wundef -Wno-pointer-sign -fformat-extensions .endif # # The following flags are next up for working on: @@ -86,11 +80,10 @@ INLINE_LIMIT?= 15000 .endif # -# For MIPS we also tell gcc to use floating point emulation and -# disable MIPS DSP ASE Instruction set. +# For MIPS we also tell gcc to use floating point emulation # .if ${MACHINE_ARCH} == "mips" -CFLAGS+= -msoft-float -mno-dsp +CFLAGS+= -msoft-float INLINE_LIMIT?= 8000 .endif diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk index 1c788a36b953..6d543e4981ac 100644 --- a/sys/conf/kmod.mk +++ b/sys/conf/kmod.mk @@ -128,6 +128,10 @@ CFLAGS+= -fno-omit-frame-pointer CFLAGS+= -mlongcall -fno-omit-frame-pointer .endif +.if ${MACHINE_ARCH} == "mips" +CFLAGS+= -G0 -fno-pic -mno-abicalls -mlong-calls +.endif + .if defined(FIRMWS) .if !exists(@) ${KMOD:S/$/.c/}: @ @@ -174,7 +178,7 @@ ${PROG}.symbols: ${FULLPROG} ${OBJCOPY} --only-keep-debug ${FULLPROG} ${.TARGET} .endif -.if ${MACHINE_ARCH} != amd64 +.if ${MACHINE_ARCH} != amd64 && ${MACHINE_ARCH} != mips ${FULLPROG}: ${KMOD}.kld ${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} ${KMOD}.kld .if !defined(DEBUG_FLAGS) @@ -187,7 +191,7 @@ EXPORT_SYMS?= NO CLEANFILES+= export_syms .endif -.if ${MACHINE_ARCH} != amd64 +.if ${MACHINE_ARCH} != amd64 && ${MACHINE_ARCH} != mips ${KMOD}.kld: ${OBJS} .else ${FULLPROG}: ${OBJS} @@ -206,7 +210,8 @@ ${FULLPROG}: ${OBJS} export_syms | xargs -J% ${OBJCOPY} % ${.TARGET} .endif .endif -.if !defined(DEBUG_FLAGS) && ${MACHINE_ARCH} == amd64 +.if !defined(DEBUG_FLAGS) && \ + (${MACHINE_ARCH} == amd64 || ${MACHINE_ARCH} == mips) ${OBJCOPY} --strip-debug ${.TARGET} .endif diff --git a/sys/conf/ldscript.mips b/sys/conf/ldscript.mips index ca4a70bd32e0..0736fd1c4536 100644 --- a/sys/conf/ldscript.mips +++ b/sys/conf/ldscript.mips @@ -43,7 +43,26 @@ PROVIDE (_DYNAMIC = 0); SECTIONS { /* Read-only sections, merged into text segment: */ - . = 0x80100000 + SIZEOF_HEADERS; + . = KERNLOADADDR + SIZEOF_HEADERS; + .text : + { + *(.trap) + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t.*) + } =0x1000000 + .fini : + { + KEEP (*(.fini)) + } =0x1000000 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } .interp : { *(.interp) } .hash : { *(.hash) } .dynsym : { *(.dynsym) } @@ -163,25 +182,6 @@ SECTIONS { KEEP (*(.init)) } =0x1000000 - .text : - { - *(.trap) - *(.text) - *(.text.*) - *(.stub) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.gnu.linkonce.t.*) - } =0x1000000 - .fini : - { - KEEP (*(.fini)) - } =0x1000000 - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) } - .rodata1 : { *(.rodata1) } .reginfo : { *(.reginfo) } .sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) } .sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) } diff --git a/sys/conf/ldscript.mips.cfe b/sys/conf/ldscript.mips.cfe index 0a50e9d46e86..6341d9b2877a 100644 --- a/sys/conf/ldscript.mips.cfe +++ b/sys/conf/ldscript.mips.cfe @@ -61,7 +61,7 @@ PHDRS SECTIONS { /* Read-only sections, merged into text segment: */ - . = 0x80100000 ; + . = KERNLOADADDR ; .interp : { *(.interp) } :interp .hash : { *(.hash) } :text .dynsym : { *(.dynsym) } diff --git a/sys/conf/ldscript.mips.mips64 b/sys/conf/ldscript.mips.mips64 new file mode 100644 index 000000000000..4762abfaf104 --- /dev/null +++ b/sys/conf/ldscript.mips.mips64 @@ -0,0 +1,303 @@ +/*- + * Copyright (c) 2001, 2004, 2008, Juniper Networks, Inc. + * 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. + * 3. Neither the name of the Juniper Networks, Inc. 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 JUNIPER NETWORKS 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 JUNIPER NETWORKS 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. + * + * JNPR: ldscript.mips,v 1.3 2006/10/11 06:12:04 + * $FreeBSD: projects/mips/sys/conf/ldscript.mips 191079 2009-04-14 22:53:22Z gonzo $ + */ + +OUTPUT_FORMAT("elf64-tradbigmips", "elf64-tradbigmips", + "elf64-tradlittlemips") + +OUTPUT_ARCH(mips) +ENTRY(_start) +SEARCH_DIR(/usr/lib); +/* Do we need any of these for elf? + __DYNAMIC = 0; +PROVIDE (_DYNAMIC = 0); +*/ +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + . = KERNLOADADDR + SIZEOF_HEADERS; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t.*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t.*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r.*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r.*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d.*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d.*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s.*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s.*) + } + .rel.sbss : + { + *(.rel.sbss) + *(.rel.sbss.*) + *(.rel.gnu.linkonce.sb.*) + } + .rela.sbss : + { + *(.rela.sbss) + *(.rela.sbss.*) + *(.rel.gnu.linkonce.sb.*) + } + .rel.sdata2 : + { + *(.rel.sdata2) + *(.rel.sdata2.*) + *(.rel.gnu.linkonce.s2.*) + } + .rela.sdata2 : + { + *(.rela.sdata2) + *(.rela.sdata2.*) + *(.rela.gnu.linkonce.s2.*) + } + .rel.sbss2 : + { + *(.rel.sbss2) + *(.rel.sbss2.*) + *(.rel.gnu.linkonce.sb2.*) + } + .rela.sbss2 : + { + *(.rela.sbss2) + *(.rela.sbss2.*) + *(.rela.gnu.linkonce.sb2.*) + } + .rel.bss : + { + *(.rel.bss) + *(.rel.bss.*) + *(.rel.gnu.linkonce.b.*) + } + .rela.bss : + { + *(.rela.bss) + *(.rela.bss.*) + *(.rela.gnu.linkonce.b.*) + } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .init : + { + KEEP (*(.init)) + } =0x1000000 + .text : + { + *(.trap) + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf64.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t.*) + } =0x1000000 + .fini : + { + KEEP (*(.fini)) + } =0x1000000 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .reginfo : { *(.reginfo) } + .sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) } + .sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) } + . = ALIGN(0x2000) + (. & (0x2000 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .plt : { *(.plt) } + _gp = ALIGN(16) + 0x7ff0; + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + .sbss : + { + PROVIDE (__sbss_start = .); + PROVIDE (___sbss_start = .); + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.sb.*) + *(.scommon) + PROVIDE (__sbss_end = .); + PROVIDE (___sbss_end = .); + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(64 / 8); + } + . = ALIGN(64 / 8); + _end = .; + PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* These must appear regardless of . */ +} diff --git a/sys/conf/ldscript.mips.octeon1.32 b/sys/conf/ldscript.mips.octeon1.32 new file mode 100644 index 000000000000..d3b3c410456f --- /dev/null +++ b/sys/conf/ldscript.mips.octeon1.32 @@ -0,0 +1,58 @@ +/* + * This product includes software developed by the University of + * California, Berkeley and its contributors." +*/ +OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips") +OUTPUT_ARCH(mips) +ENTRY(_start) + +SECTIONS { + . = KERNLOADADDR + SIZEOF_HEADERS; + .text . : { + *(.text) + *(.dynamic) + etext = .; + _etext = .; + . = ALIGN(0x2000); + } + + .rodata ALIGN(0x2000) : { + _fdata = .; + *(.rodata) + . = ALIGN(32); + } + + .data . : { + _rwdata = .; + *(.data) + . = ALIGN(32); + CONSTRUCTORS; + } + + _gp = (. + 0x8000); + + .sdata . : { + _small_start = .; + *(.sdata) + . = ALIGN(32); + edata = .; + _edata = .; + } + + .sbss . : { + __bss_start = .; + _fbss = .; + *(.sbss) *(.scommon) + _small_end = .; + . = ALIGN(32); + } + + .bss . : { + *(.bss) + *(COMMON) + . = ALIGN(32); + _end = .; + end = .; + } + +} diff --git a/sys/conf/ldscript.mips.octeon1.64 b/sys/conf/ldscript.mips.octeon1.64 new file mode 100644 index 000000000000..b476abf0cbdb --- /dev/null +++ b/sys/conf/ldscript.mips.octeon1.64 @@ -0,0 +1,61 @@ +TARGET(elf64-tradbigmips) +OUTPUT_FORMAT("elf64-tradbigmips", "elf64-tradbigmips", "elf64-tradlittlemips") +OUTPUT_ARCH(mips) +ENTRY(_start) +/* __DYNAMIC = 0; +PROVIDE (_DYNAMIC = 0); +*/ +PHDRS { + text PT_LOAD FLAGS ( 5 ) ; +} + +SECTIONS { + + .text _start : { + *(.text) + /*(.dynamic)*/ + etext = .; + _etext = .; + . = ALIGN(0x2000); + } : text + + .rodata ALIGN(0x2000) : { + _fdata = .; + *(.rodata) + . = ALIGN(32); + } + + .data . : { + _rwdata = .; + *(.data) + . = ALIGN(32); + CONSTRUCTORS; + } + + _gp = (. + 0x8000); + + .sdata . : { + _small_start = .; + *(.sdata) + . = ALIGN(32); + edata = .; + _edata = .; + } + + .sbss . : { + __bss_start = .; + _fbss = .; + *(.sbss) *(.scommon) + _small_end = .; + . = ALIGN(32); + } + + .bss . : { + *(.bss) + *(COMMON) + . = ALIGN(32); + _end = .; + end = .; + } + +} diff --git a/sys/conf/ldscript.mips.octeon1.n32 b/sys/conf/ldscript.mips.octeon1.n32 new file mode 100644 index 000000000000..4eb322483dce --- /dev/null +++ b/sys/conf/ldscript.mips.octeon1.n32 @@ -0,0 +1,57 @@ +TARGET(elf32-ntradbigmips) +OUTPUT_FORMAT("elf32-ntradbigmips", "elf32-ntradbigmips", "elf32-ntradlittlemips") +OUTPUT_ARCH(mips) +ENTRY(_start) + __DYNAMIC = 0; +PROVIDE (_DYNAMIC = 0); + +SECTIONS { + + .text . : { + *(.text) + *(.dynamic) + etext = .; + _etext = .; + . = ALIGN(0x2000); + } + + .rodata ALIGN(0x2000) : { + _fdata = .; + *(.rodata) + . = ALIGN(32); + } + + .data . : { + _rwdata = .; + *(.data) + . = ALIGN(32); + CONSTRUCTORS; + } + + _gp = (. + 0x8000); + + .sdata . : { + _small_start = .; + *(.sdata) + . = ALIGN(32); + edata = .; + _edata = .; + } + + .sbss . : { + __bss_start = .; + _fbss = .; + *(.sbss) *(.scommon) + _small_end = .; + . = ALIGN(32); + } + + .bss . : { + *(.bss) + *(COMMON) + . = ALIGN(32); + _end = .; + end = .; + } + +} diff --git a/sys/conf/makeLINT.mk b/sys/conf/makeLINT.mk index 08947a91db05..e7ca90921931 100644 --- a/sys/conf/makeLINT.mk +++ b/sys/conf/makeLINT.mk @@ -5,7 +5,15 @@ all: clean: rm -f LINT +.if ${TARGET} == "amd64" || ${TARGET} == "i386" + rm -f LINT-VIMAGE +.endif NOTES= ../../conf/NOTES NOTES LINT: ${NOTES} ../../conf/makeLINT.sed cat ${NOTES} | sed -E -n -f ../../conf/makeLINT.sed > ${.TARGET} +.if ${TARGET} == "amd64" || ${TARGET} == "i386" + echo "include ${.TARGET}" > ${.TARGET}-VIMAGE + echo "ident ${.TARGET}-VIMAGE" >> ${.TARGET}-VIMAGE + echo "options VIMAGE" >> ${.TARGET}-VIMAGE +.endif diff --git a/sys/conf/options b/sys/conf/options index 1df09d7d0382..7869add7a85f 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -71,7 +71,9 @@ COMPAT_FREEBSD5 opt_compat.h COMPAT_FREEBSD6 opt_compat.h COMPAT_FREEBSD7 opt_compat.h COMPILING_LINT opt_global.h +COMPRESS_USER_CORES opt_core.h CY_PCI_FASTINTR +DEADLKRES opt_watchdog.h DIRECTIO FULL_PREEMPTION opt_sched.h IPI_PREEMPTION opt_sched.h @@ -350,6 +352,8 @@ ISCSI_INITIATOR_DEBUG opt_iscsi_initiator.h # Options used in the 'ata' ATA/ATAPI driver ATA_STATIC_ID opt_ata.h ATA_NOPCI opt_ata.h +ATA_REQUEST_TIMEOUT opt_ata.h +ATA_CAM opt_ata.h # Net stuff. ACCEPT_FILTER_DATA @@ -496,6 +500,7 @@ NETGRAPH_TEE opt_netgraph.h NETGRAPH_TTY opt_netgraph.h NETGRAPH_UI opt_netgraph.h NETGRAPH_VJC opt_netgraph.h +NETGRAPH_VLAN opt_netgraph.h # NgATM options NGATM_ATM opt_netgraph.h @@ -511,6 +516,7 @@ DRM_DEBUG opt_drm.h ZERO_COPY_SOCKETS opt_zero.h TI_PRIVATE_JUMBOS opt_ti.h TI_JUMBO_HDRSPLIT opt_ti.h +BCE_JUMBO_HDRSPLIT opt_bce.h # XXX Conflict: # of devices vs network protocol (Native ATM). # This makes "atm.h" unusable. @@ -729,8 +735,8 @@ SC_RENDER_DEBUG opt_syscons.h SC_TWOBUTTON_MOUSE opt_syscons.h # teken terminal emulator options +TEKEN_CONS25 opt_teken.h TEKEN_UTF8 opt_teken.h -TEKEN_XTERM opt_teken.h # options for printf PRINTF_BUFR_SIZE opt_printf.h diff --git a/sys/conf/options.arm b/sys/conf/options.arm index b3cc09731c8b..922d38fda0ce 100644 --- a/sys/conf/options.arm +++ b/sys/conf/options.arm @@ -36,3 +36,4 @@ VERBOSE_INIT_ARM opt_global.h AT91_BWCT opt_at91.h AT91_TSC opt_at91.h AT91_KWIKBYTE opt_at91.h +CPU_FA526 opt_global.h diff --git a/sys/conf/options.i386 b/sys/conf/options.i386 index cd2ab98dafc2..83f828661c4e 100644 --- a/sys/conf/options.i386 +++ b/sys/conf/options.i386 @@ -105,6 +105,7 @@ NETGRAPH_CRONYX opt_ng_cronyx.h # Device options DEV_APIC opt_apic.h +DEV_ATPIC opt_atpic.h DEV_NPX opt_npx.h ASR_COMPAT opt_asr.h diff --git a/sys/conf/options.mips b/sys/conf/options.mips index 42e02639b9ac..1e30872cd626 100644 --- a/sys/conf/options.mips +++ b/sys/conf/options.mips @@ -31,8 +31,10 @@ CPU_MIPS4KC opt_global.h CPU_MIPS32 opt_global.h CPU_MIPS64 opt_global.h -CPU_NOFPU opt_global.h CPU_SENTRY5 opt_global.h +CPU_HAVEFPU opt_global.h +CPU_SB1 opt_global.h +CPU_CNMIPS opt_global.h ISA_MIPS1 opt_cputype.h ISA_MIPS3 opt_cputype.h @@ -44,14 +46,18 @@ ISA_MIPS64v2 opt_cputype.h YAMON opt_global.h CFE opt_global.h CFE_CONSOLE opt_global.h +CFE_ENV opt_global.h +CFE_ENV_SIZE opt_global.h -KERNPHYSADDR opt_global.h -KERNVIRTADDR opt_global.h -PHYSADDR opt_global.h -SOFTFLOAT opt_global.h - +NOFPU opt_global.h TARGET_OCTEON opt_global.h TARGET_EMULATOR opt_ddb.h +TARGET_XLR_XLS opt_global.h TICK_USE_YAMON_FREQ opt_global.h TICK_USE_MALTA_RTC opt_global.h + +# +# The highest memory address that can be used by the kernel in units of KB. +# +MAXMEM opt_global.h diff --git a/sys/conf/options.pc98 b/sys/conf/options.pc98 index dca3d694ae74..a10737be7672 100644 --- a/sys/conf/options.pc98 +++ b/sys/conf/options.pc98 @@ -90,6 +90,7 @@ PC98 opt_global.h # Device options DEV_APIC opt_apic.h +DEV_ATPIC opt_atpic.h DEV_MECIA opt_mecia.h DEV_NPX opt_npx.h diff --git a/sys/conf/options.sparc64 b/sys/conf/options.sparc64 index ba5ab9fc85bc..bc6af5a18a5e 100644 --- a/sys/conf/options.sparc64 +++ b/sys/conf/options.sparc64 @@ -8,6 +8,8 @@ SUN4U opt_global.h ATKBD_DFLT_KEYMAP opt_atkbd.h +FIRE_DEBUG opt_fire.h + # Debug IOMMU inserts/removes using diagnostic accesses. This is very loud. IOMMU_DIAG opt_iommu.h diff --git a/sys/contrib/altq/altq/altq_hfsc.c b/sys/contrib/altq/altq/altq_hfsc.c index cc9a566b4770..fa8bad13e99a 100644 --- a/sys/contrib/altq/altq/altq_hfsc.c +++ b/sys/contrib/altq/altq/altq_hfsc.c @@ -1809,15 +1809,20 @@ hfsc_class_modify(cl, rsc, fsc, usc) cl->cl_fsc == NULL) { fsc_tmp = malloc(sizeof(struct internal_sc), M_DEVBUF, M_WAITOK); - if (fsc_tmp == NULL) + if (fsc_tmp == NULL) { + free(rsc_tmp); return (ENOMEM); + } } if (usc != NULL && (usc->m1 != 0 || usc->m2 != 0) && cl->cl_usc == NULL) { usc_tmp = malloc(sizeof(struct internal_sc), M_DEVBUF, M_WAITOK); - if (usc_tmp == NULL) + if (usc_tmp == NULL) { + free(rsc_tmp); + free(fsc_tmp); return (ENOMEM); + } } cur_time = read_machclk(); diff --git a/sys/contrib/dev/acpica/changes.txt b/sys/contrib/dev/acpica/changes.txt index 177ae98ee26a..60620ce4f76b 100644 --- a/sys/contrib/dev/acpica/changes.txt +++ b/sys/contrib/dev/acpica/changes.txt @@ -1,8 +1,251 @@ +---------------------------------------- +21 January 2010. Summary of changes for version 20100121: + +1) ACPI CA Core Subsystem: + +Added the 2010 copyright to all module headers and signons. This affects +virtually every file in the ACPICA core subsystem, the iASL compiler, the +tools/utilities, and the test suites. + +Implemented a change to the AcpiGetDevices interface to eliminate unnecessary +invocations of the _STA method. In the case where a specific _HID is +requested, do not run _STA until a _HID match is found. This eliminates +potentially dozens of _STA calls during a search for a particular device/HID, +which in turn can improve boot times. ACPICA BZ 828. Lin Ming. + +Implemented an additional repair for predefined method return values. Attempt +to repair unexpected NULL elements within returned Package objects. Create an +Integer of value zero, a NULL String, or a zero-length Buffer as appropriate. +ACPICA BZ 818. Lin Ming, Bob Moore. + +Removed the obsolete ACPI_INTEGER data type. This type was introduced as the +code was migrated from ACPI 1.0 (with 32-bit AML integers) to ACPI 2.0 (with +64-bit AML integers). It is now obsolete and this change removes it from the +ACPICA code base, replaced by UINT64. The original typedef has been retained +for now for compatibility with existing device driver code. ACPICA BZ 824. + +Removed the unused UINT32_STRUCT type, and the obsolete Integer64 field in +the parse tree object. + +Added additional warning options for the gcc-4 generation. Updated the source +accordingly. This includes some code restructuring to eliminate unreachable +code, elimination of some gotos, elimination of unused return values, some +additional casting, and removal of redundant declarations. + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 6.0 32-bit compiler. The +debug version of the code includes the debug output trace mechanism and has a +much larger code and data size. + + Previous Release: + Non-Debug Version: 87.0K Code, 18.0K Data, 105.0K Total + Debug Version: 163.4K Code, 50.8K Data, 214.2K Total + Current Release: + Non-Debug Version: 87.1K Code, 18.0K Data, 105.1K Total + Debug Version: 163.5K Code, 50.9K Data, 214.4K Total + +2) iASL Compiler/Disassembler and Tools: + +No functional changes for this release. + +---------------------------------------- +14 December 2009. Summary of changes for version 20091214: + +1) ACPI CA Core Subsystem: + +Enhanced automatic data type conversions for predefined name repairs. This +change expands the automatic repairs/conversions for predefined name return +values to make Integers, Strings, and Buffers fully interchangeable. Also, a +Buffer can be converted to a Package of Integers if necessary. The nsrepair.c +module was completely restructured. Lin Ming, Bob Moore. + +Implemented automatic removal of null package elements during predefined name +repairs. This change will automatically remove embedded and trailing NULL +package elements from returned package objects that are defined to contain a +variable number of sub-packages. The driver is then presented with a package +with no null elements to deal with. ACPICA BZ 819. + +Implemented a repair for the predefined _FDE and _GTM names. The expected +return value for both names is a Buffer of 5 DWORDs. This repair fixes two +possible problems (both seen in the field), where a package of integers is +returned, or a buffer of BYTEs is returned. With assistance from Jung-uk Kim. + +Implemented additional module-level code support. This change will properly +execute module-level code that is not at the root of the namespace (under a +Device object, etc.). Now executes the code within the current scope instead +of the root. ACPICA BZ 762. Lin Ming. + +Fixed possible mutex acquisition errors when running _REG methods. Fixes a +problem where mutex errors can occur when running a _REG method that is in +the same scope as a method-defined operation region or an operation region +under a module-level IF block. This type of code is rare, so the problem has +not been seen before. ACPICA BZ 826. Lin Ming, Bob Moore. + +Fixed a possible memory leak during module-level code execution. An object +could be leaked for each block of executed module-level code if the +interpreter slack mode is enabled This change deletes any implicitly returned +object from the module-level code block. Lin Ming. + +Removed messages for successful predefined repair(s). The repair mechanism +was considered too wordy. Now, messages are only unconditionally emitted if +the return object cannot be repaired. Existing messages for successful +repairs were converted to ACPI_DEBUG_PRINT messages for now. ACPICA BZ 827. + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 6.0 32-bit compiler. The +debug version of the code includes the debug output trace mechanism and has a +much larger code and data size. + + Previous Release: + Non-Debug Version: 86.6K Code, 18.2K Data, 104.8K Total + Debug Version: 162.7K Code, 50.8K Data, 213.5K Total + Current Release: + Non-Debug Version: 87.0K Code, 18.0K Data, 105.0K Total + Debug Version: 163.4K Code, 50.8K Data, 214.2K Total + +2) iASL Compiler/Disassembler and Tools: + +iASL: Fixed a regression introduced in 20091112 where intermediate .SRC files +were no longer automatically removed at the termination of the compile. + +acpiexec: Implemented the -f option to specify default region fill value. +This option specifies the value used to initialize buffers that simulate +operation regions. Default value is zero. Useful for debugging problems that +depend on a specific initial value for a region or field. + +---------------------------------------- +12 November 2009. Summary of changes for version 20091112: + +1) ACPI CA Core Subsystem: + +Implemented a post-order callback to AcpiWalkNamespace. The existing +interface only has a pre-order callback. This change adds an additional +parameter for a post-order callback which will be more useful for bus scans. +ACPICA BZ 779. Lin Ming. Updated the ACPICA Programmer Reference. + +Modified the behavior of the operation region memory mapping cache for +SystemMemory. Ensure that the memory mappings created for operation regions +do not cross 4K page boundaries. Crossing a page boundary while mapping +regions can cause kernel warnings on some hosts if the pages have different +attributes. Such regions are probably BIOS bugs, and this is the workaround. +Linux BZ 14445. Lin Ming. + +Implemented an automatic repair for predefined methods that must return +sorted lists. This change will repair (by sorting) packages returned by _ALR, +_PSS, and _TSS. Drivers can now assume that the packages are correctly sorted +and do not contain NULL package elements. Adds one new file, +namespace/nsrepair2.c. ACPICA BZ 784. Lin Ming, Bob Moore. + +Fixed a possible fault during predefined name validation if a return Package +object contains NULL elements. Also adds a warning if a NULL element is +followed by any non-null elements. ACPICA BZ 813, 814. Future enhancement may +include repair or removal of all such NULL elements where possible. + +Implemented additional module-level executable AML code support. This change +will execute module-level code that is not at the root of the namespace +(under a Device object, etc.) at table load time. Module-level executable AML +code has been illegal since ACPI 2.0. ACPICA BZ 762. Lin Ming. + +Implemented a new internal function to create Integer objects. This function +simplifies miscellaneous object creation code. ACPICA BZ 823. + +Reduced the severity of predefined repair messages, Warning to Info. Since +the object was successfully repaired, a warning is too severe. Reduced to an +info message for now. These messages may eventually be changed to debug-only. +ACPICA BZ 812. + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 6.0 32-bit compiler. The +debug version of the code includes the debug output trace mechanism and has a +much larger code and data size. + + Previous Release: + Non-Debug Version: 85.8K Code, 18.0K Data, 103.8K Total + Debug Version: 161.8K Code, 50.6K Data, 212.4K Total + Current Release: + Non-Debug Version: 86.6K Code, 18.2K Data, 104.8K Total + Debug Version: 162.7K Code, 50.8K Data, 213.5K Total + +2) iASL Compiler/Disassembler and Tools: + +iASL: Implemented Switch() with While(1) so that Break works correctly. This +change correctly implements the Switch operator with a surrounding While(1) +so that the Break operator works as expected. ACPICA BZ 461. Lin Ming. + +iASL: Added a message if a package initializer list is shorter than package +length. Adds a new remark for a Package() declaration if an initializer list +exists, but is shorter than the declared length of the package. Although +technically legal, this is probably a coding error and it is seen in the +field. ACPICA BZ 815. Lin Ming, Bob Moore. + +iASL: Fixed a problem where the compiler could fault after the maximum number +of errors was reached (200). + +acpixtract: Fixed a possible warning for pointer cast if the compiler warning +level set very high. + +---------------------------------------- +13 October 2009. Summary of changes for version 20091013: + +1) ACPI CA Core Subsystem: + +Fixed a problem where an Operation Region _REG method could be executed more +than once. If a custom address space handler is installed by the host before +the "initialize operation regions" phase of the ACPICA initialization, any +_REG methods for that address space could be executed twice. This change +fixes the problem. ACPICA BZ 427. Lin Ming. + +Fixed a possible memory leak for the Scope() ASL operator. When the exact +invocation of "Scope(\)" is executed (change scope to root), one internal +operand object was leaked. Lin Ming. + +Implemented a run-time repair for the _MAT predefined method. If the _MAT +return value is defined as a Field object in the AML, and the field +size is less than or equal to the default width of an integer (32 or 64),_MAT +can incorrectly return an Integer instead of a Buffer. ACPICA now +automatically repairs this problem. ACPICA BZ 810. + +Implemented a run-time repair for the _BIF and _BIX predefined methods. The +"OEM Information" field is often incorrectly returned as an Integer with +value zero if the field is not supported by the platform. This is due to an +ambiguity in the ACPI specification. The field should always be a string. +ACPICA now automatically repairs this problem by returning a NULL string +within the returned Package. ACPICA BZ 807. + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 6.0 32-bit compiler. The +debug version of the code includes the debug output trace mechanism and has a +much larger code and data size. + + Previous Release: + Non-Debug Version: 85.6K Code, 18.0K Data, 103.6K Total + Debug Version: 161.7K Code, 50.9K Data, 212.6K Total + Current Release: + Non-Debug Version: 85.8K Code, 18.0K Data, 103.8K Total + Debug Version: 161.8K Code, 50.6K Data, 212.4K Total + +2) iASL Compiler/Disassembler and Tools: + +Disassembler: Fixed a problem where references to external symbols that +contained one or more parent-prefixes (carats) were not handled correctly, +possibly causing a fault. ACPICA BZ 806. Lin Ming. + +Disassembler: Restructured the code so that all functions that handle +external symbols are in a single module. One new file is added, +common/dmextern.c. + +AML Debugger: Added a max count argument for the Batch command (which +executes multiple predefined methods within the namespace.) + +iASL: Updated the compiler documentation (User Reference.) Available at +http://www.acpica.org/documentation/. ACPICA BZ 750. + +AcpiXtract: Updated for Lint and other formatting changes. Close all open +files. + ---------------------------------------- 03 September 2009. Summary of changes for version 20090903: -This release is available at www.acpica.org/downloads - 1) ACPI CA Core Subsystem: For Windows Vista compatibility, added the automatic execution of an _INI @@ -74,8 +317,6 @@ subtables. ---------------------------------------- 30 July 2009. Summary of changes for version 20090730: -This release is available at www.acpica.org/downloads - The ACPI 4.0 implementation for ACPICA is complete with this release. 1) ACPI CA Core Subsystem: @@ -146,8 +387,6 @@ changes to existing tables. ACPICA BZ 775. ---------------------------------------- 25 June 2009. Summary of changes for version 20090625: -This release is available at www.acpica.org/downloads - The ACPI 4.0 Specification was released on June 16 and is available at www.acpi.info. ACPICA implementation of ACPI 4.0 is underway and will continue for the next few releases. @@ -224,8 +463,6 @@ predefined names and control methods (31 total). ACPICA BZ 769. ---------------------------------------- 21 May 2009. Summary of changes for version 20090521: -This release is available at www.acpica.org/downloads - 1) ACPI CA Core Subsystem: Disabled the preservation of the SCI enable bit in the PM1 control register. @@ -297,8 +534,6 @@ after an invalid sub-table ID. ---------------------------------------- 22 April 2009. Summary of changes for version 20090422: -This release is available at www.acpica.org/downloads - 1) ACPI CA Core Subsystem: Fixed a compatibility issue with the recently released I/O port protection @@ -846,9 +1081,6 @@ header. 29 July 2008. Summary of changes for version 20080729: -This release is available at http://acpica.org/downloads -Direct git access via http://www.acpica.org/repos/acpica.git - 1) ACPI CA Core Subsystem: Fix a possible deadlock in the GPE dispatch. Remove call to @@ -938,9 +1170,6 @@ completion message. Previously, no message was displayed in this case. ---------------------------------------- 01 July 2008. Summary of changes for version 20080701: -This release is available at http://acpica.org/downloads -Direct git access via http://www.acpica.org/repos/acpica.git - 0) Git source tree / acpica.org Fixed a problem where a git-clone from http would not transfer the entire diff --git a/sys/contrib/dev/acpica/common/adfile.c b/sys/contrib/dev/acpica/common/adfile.c index ad5e54419a17..d72f36900aa7 100644 --- a/sys/contrib/dev/acpica/common/adfile.c +++ b/sys/contrib/dev/acpica/common/adfile.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -119,7 +119,6 @@ #include #include -#include #define _COMPONENT ACPI_TOOLS @@ -135,12 +134,13 @@ AdWriteBuffer ( char FilenameBuf[20]; + /****************************************************************************** * * FUNCTION: AfGenerateFilename * - * PARAMETERS: Prefix - prefix string - * TableId - The table ID + * PARAMETERS: Prefix - prefix string + * TableId - The table ID * * RETURN: Pointer to the completed string * @@ -180,9 +180,9 @@ AdGenerateFilename ( * * FUNCTION: AfWriteBuffer * - * PARAMETERS: Filename - name of file - * Buffer - data to write - * Length - length of data + * PARAMETERS: Filename - name of file + * Buffer - data to write + * Length - length of data * * RETURN: Actual number of bytes written * @@ -217,10 +217,10 @@ AdWriteBuffer ( * * FUNCTION: AfWriteTable * - * PARAMETERS: Table - pointer to the ACPI table - * Length - length of the table - * TableName - the table signature - * OemTableID - from the table header + * PARAMETERS: Table - pointer to the ACPI table + * Length - length of the table + * TableName - the table signature + * OemTableID - from the table header * * RETURN: None * @@ -272,7 +272,7 @@ FlGenerateFilename ( * Copy the original filename to a new buffer. Leave room for the worst case * where we append the suffix, an added dot and the null terminator. */ - NewFilename = ACPI_ALLOCATE_ZEROED ( + NewFilename = ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) strlen (InputFilename) + strlen (Suffix) + 2); strcpy (NewFilename, InputFilename); @@ -314,7 +314,7 @@ FlStrdup ( char *NewString; - NewString = ACPI_ALLOCATE (strlen (String) + 1); + NewString = ACPI_ALLOCATE ((ACPI_SIZE) strlen (String) + 1); if (!NewString) { return (NULL); diff --git a/sys/contrib/dev/acpica/common/adisasm.c b/sys/contrib/dev/acpica/common/adisasm.c index 873f42a46dba..fe5ae35731de 100644 --- a/sys/contrib/dev/acpica/common/adisasm.c +++ b/sys/contrib/dev/acpica/common/adisasm.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -132,14 +132,18 @@ #define _COMPONENT ACPI_TOOLS ACPI_MODULE_NAME ("adisasm") -extern int AslCompilerdebug; + +extern int AslCompilerdebug; +extern char *Gbl_ExternalFilename; + ACPI_STATUS LsDisplayNamespace ( void); void -LsSetupNsList (void * Handle); +LsSetupNsList ( + void *Handle); /* Local prototypes */ @@ -153,14 +157,6 @@ void AdDisassemblerHeader ( char *Filename); -void -AdAddExternalsToNamespace ( - void); - -UINT32 -AdMethodExternalCount ( - void); - ACPI_STATUS AdDeferredParse ( ACPI_PARSE_OBJECT *Op, @@ -171,8 +167,6 @@ ACPI_STATUS AdParseDeferredOps ( ACPI_PARSE_OBJECT *Root); -ACPI_PARSE_OBJECT *AcpiGbl_ParseOpRoot; - /* Stubs for ASL compiler */ @@ -192,7 +186,6 @@ AcpiDsMethodError ( { return (Status); } - #endif ACPI_STATUS @@ -238,18 +231,19 @@ AcpiDsMethodDataInitArgs ( } -ACPI_TABLE_DESC LocalTables[1]; +static ACPI_TABLE_DESC LocalTables[1]; +static ACPI_PARSE_OBJECT *AcpiGbl_ParseOpRoot; /******************************************************************************* * * FUNCTION: AdInitialize * - * PARAMETERS: None. + * PARAMETERS: None * * RETURN: Status * - * DESCRIPTION: CA initialization + * DESCRIPTION: ACPICA and local initialization * ******************************************************************************/ @@ -296,89 +290,15 @@ AdInitialize ( } -/******************************************************************************* - * - * FUNCTION: AdAddExternalsToNamespace - * - * PARAMETERS: - * - * RETURN: None - * - * DESCRIPTION: - * - ******************************************************************************/ - -void -AdAddExternalsToNamespace ( - void) -{ - ACPI_STATUS Status; - ACPI_NAMESPACE_NODE *Node; - ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; - ACPI_OPERAND_OBJECT *MethodDesc; - - - while (External) - { - Status = AcpiNsLookup (NULL, External->InternalPath, External->Type, - ACPI_IMODE_LOAD_PASS1, ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE, - NULL, &Node); - - if (External->Type == ACPI_TYPE_METHOD) - { - MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); - MethodDesc->Method.ParamCount = (UINT8) External->Value; - Node->Object = MethodDesc; - } - - External = External->Next; - } -} - - -/******************************************************************************* - * - * FUNCTION: AdMethodExternalCount - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Return the number of externals that have been generated - * - ******************************************************************************/ - -UINT32 -AdMethodExternalCount ( - void) -{ - ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; - UINT32 Count = 0; - - - while (External) - { - if (External->Type == ACPI_TYPE_METHOD) - { - Count++; - } - - External = External->Next; - } - - return (Count); -} - - /****************************************************************************** * * FUNCTION: AdAmlDisassemble * - * PARAMETERS: Filename - AML input filename - * OutToFile - TRUE if output should go to a file - * Prefix - Path prefix for output - * OutFilename - where the filename is returned - * GetAllTables - TRUE if all tables are desired + * PARAMETERS: Filename - AML input filename + * OutToFile - TRUE if output should go to a file + * Prefix - Path prefix for output + * OutFilename - where the filename is returned + * GetAllTables - TRUE if all tables are desired * * RETURN: Status * @@ -386,8 +306,6 @@ AdMethodExternalCount ( * *****************************************************************************/ -extern char *Gbl_ExternalFilename; - ACPI_STATUS AdAmlDisassemble ( BOOLEAN OutToFile, @@ -403,12 +321,11 @@ AdAmlDisassemble ( ACPI_TABLE_HEADER *Table = NULL; ACPI_TABLE_HEADER *ExternalTable; ACPI_OWNER_ID OwnerId; - ACPI_EXTERNAL_LIST *NextExternal; /* - * Input: AML Code from either a file, - * or via GetTables (memory or registry) + * Input: AML code from either a file or via GetTables (memory or + * registry) */ if (Filename) { @@ -462,13 +379,7 @@ AdAmlDisassemble ( /* Clear external list generated by Scope in external tables */ - while (AcpiGbl_ExternalList) - { - NextExternal = AcpiGbl_ExternalList->Next; - ACPI_FREE (AcpiGbl_ExternalList->Path); - ACPI_FREE (AcpiGbl_ExternalList); - AcpiGbl_ExternalList = NextExternal; - } + AcpiDmClearExternalList (); } } else @@ -501,8 +412,7 @@ AdAmlDisassemble ( } /* - * Output: ASL code. - * Redirect to a file if requested + * Output: ASL code. Redirect to a file if requested */ if (OutToFile) { @@ -589,11 +499,11 @@ AdAmlDisassemble ( * tree with the new information (namely, the number of arguments per * method) */ - if (AdMethodExternalCount ()) + if (AcpiDmGetExternalMethodCount ()) { fprintf (stderr, "\nFound %d external control methods, reparsing with new information\n", - AdMethodExternalCount()); + AcpiDmGetExternalMethodCount ()); /* * Reparse, rebuild namespace. no need to xref namespace @@ -611,7 +521,7 @@ AdAmlDisassemble ( AcpiGbl_RootNodeStruct.Flags = ANOBJ_END_OF_PEER_LIST; Status = AcpiNsRootInitialize (); - AdAddExternalsToNamespace (); + AcpiDmAddExternalsToNamespace (); /* Parse table. No need to reload it, however (FALSE) */ @@ -855,9 +765,9 @@ AdDisplayTables ( * * FUNCTION: AdDeferredParse * - * PARAMETERS: Op - Root Op of the deferred opcode - * Aml - Pointer to the raw AML - * AmlLength - Length of the AML + * PARAMETERS: Op - Root Op of the deferred opcode + * Aml - Pointer to the raw AML + * AmlLength - Length of the AML * * RETURN: Status * @@ -981,7 +891,7 @@ AdDeferredParse ( * * FUNCTION: AdParseDeferredOps * - * PARAMETERS: Root - Root of the parse tree + * PARAMETERS: Root - Root of the parse tree * * RETURN: Status * @@ -1055,8 +965,8 @@ AdParseDeferredOps ( * * FUNCTION: AdGetLocalTables * - * PARAMETERS: Filename - Not used - * GetAllTables - TRUE if all tables are desired + * PARAMETERS: Filename - Not used + * GetAllTables - TRUE if all tables are desired * * RETURN: Status * @@ -1138,6 +1048,11 @@ AdGetLocalTables ( Status = AcpiTbStoreTable (0, NewTable, NewTable->Length, 0, &TableIndex); + if (ACPI_FAILURE (Status)) + { + fprintf (stderr, "Could not store DSDT\n"); + return AE_NO_ACPI_TABLES; + } } else { @@ -1169,10 +1084,10 @@ AdGetLocalTables ( * * FUNCTION: AdParseTable * - * PARAMETERS: Table - Pointer to the raw table - * OwnerId - Returned OwnerId of the table - * LoadTable - If add table to the global table list - * External - If this is an external table + * PARAMETERS: Table - Pointer to the raw table + * OwnerId - Returned OwnerId of the table + * LoadTable - If add table to the global table list + * External - If this is an external table * * RETURN: Status * diff --git a/sys/contrib/dev/acpica/common/adwalk.c b/sys/contrib/dev/acpica/common/adwalk.c index a260cc591fd6..6bb4be5741bd 100644 --- a/sys/contrib/dev/acpica/common/adwalk.c +++ b/sys/contrib/dev/acpica/common/adwalk.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -118,7 +118,6 @@ #include #include #include -#include #include #include #include @@ -184,7 +183,7 @@ AcpiDmResourceDescendingOp ( * * FUNCTION: AcpiDmDumpTree * - * PARAMETERS: Origin - Starting object + * PARAMETERS: Origin - Starting object * * RETURN: None * @@ -218,7 +217,7 @@ AcpiDmDumpTree ( * * FUNCTION: AcpiDmFindOrphanMethods * - * PARAMETERS: Origin - Starting object + * PARAMETERS: Origin - Starting object * * RETURN: None * @@ -426,7 +425,6 @@ AcpiDmDumpDescending ( void *Context) { ACPI_OP_WALK_INFO *Info = Context; - const ACPI_OPCODE_INFO *OpInfo; char *Path; @@ -435,11 +433,9 @@ AcpiDmDumpDescending ( return (AE_OK); } - OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); - Info->Count++; - /* Most of the information (count, level, name) here */ + Info->Count++; AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level); AcpiDmIndent (Level); AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode)); @@ -472,7 +468,7 @@ AcpiDmDumpDescending ( case AML_METHOD_OP: case AML_DEVICE_OP: case AML_INT_NAMEDFIELD_OP: - AcpiOsPrintf ("%4.4s", &Op->Named.Name); + AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name)); break; default: @@ -536,7 +532,7 @@ AcpiDmFindOrphanDescending ( { /* This NamePath has no args, assume it is an integer */ - AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); + AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); return (AE_OK); } @@ -547,11 +543,11 @@ AcpiDmFindOrphanDescending ( { /* One Arg means this is just a Store(Name,Target) */ - AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); + AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); return (AE_OK); } - AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); + AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); } break; #endif @@ -567,7 +563,7 @@ AcpiDmFindOrphanDescending ( { /* This NamePath has no args, assume it is an integer */ - AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); + AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); return (AE_OK); } @@ -576,11 +572,11 @@ AcpiDmFindOrphanDescending ( { /* One Arg means this is just a Store(Name,Target) */ - AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); + AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0); return (AE_OK); } - AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); + AcpiDmAddToExternalList (ChildOp, ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); } break; @@ -611,7 +607,7 @@ AcpiDmFindOrphanDescending ( /* And namepath is the first argument */ (ParentOp->Common.Value.Arg == Op)) { - AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_INTEGER, 0); + AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_INTEGER, 0); break; } } @@ -621,7 +617,7 @@ AcpiDmFindOrphanDescending ( * operator) - it *must* be a method invocation, nothing else is * grammatically possible. */ - AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); + AcpiDmAddToExternalList (Op, Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount); } break; @@ -858,7 +854,7 @@ AcpiDmXrefDescendingOp ( { if (Status == AE_NOT_FOUND) { - AcpiDmAddToExternalList (Path, (UINT8) ObjectType, 0); + AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType, 0); /* * We could install this into the namespace, but we catch duplicate @@ -888,12 +884,12 @@ AcpiDmXrefDescendingOp ( if (ObjectType2 == ACPI_TYPE_METHOD) { - AcpiDmAddToExternalList (Path, ACPI_TYPE_METHOD, + AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_METHOD, Object->Method.ParamCount); } else { - AcpiDmAddToExternalList (Path, (UINT8) ObjectType2, 0); + AcpiDmAddToExternalList (Op, Path, (UINT8) ObjectType2, 0); } Op->Common.Node = Node; diff --git a/sys/contrib/dev/acpica/common/dmextern.c b/sys/contrib/dev/acpica/common/dmextern.c new file mode 100644 index 000000000000..943a3c2f1e6c --- /dev/null +++ b/sys/contrib/dev/acpica/common/dmextern.c @@ -0,0 +1,646 @@ +/****************************************************************************** + * + * Module Name: dmextern - Support for External() ASL statements + * + *****************************************************************************/ + +/****************************************************************************** + * + * 1. Copyright Notice + * + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. + * All rights reserved. + * + * 2. License + * + * 2.1. This is your license from Intel Corp. under its intellectual property + * rights. You may have additional license terms from the party that provided + * you this software, covering your right to use that party's intellectual + * property rights. + * + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a + * copy of the source code appearing in this file ("Covered Code") an + * irrevocable, perpetual, worldwide license under Intel's copyrights in the + * base code distributed originally by Intel ("Original Intel Code") to copy, + * make derivatives, distribute, use and display any portion of the Covered + * Code in any form, with the right to sublicense such rights; and + * + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent + * license (with the right to sublicense), under only those claims of Intel + * patents that are infringed by the Original Intel Code, to make, use, sell, + * offer to sell, and import the Covered Code and derivative works thereof + * solely to the minimum extent necessary to exercise the above copyright + * license, and in no event shall the patent license extend to any additions + * to or modifications of the Original Intel Code. No other license or right + * is granted directly or by implication, estoppel or otherwise; + * + * The above copyright and patent license is granted only if the following + * conditions are met: + * + * 3. Conditions + * + * 3.1. Redistribution of Source with Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification with rights to further distribute source must include + * the above Copyright Notice, the above License, this list of Conditions, + * and the following Disclaimer and Export Compliance provision. In addition, + * Licensee must cause all Covered Code to which Licensee contributes to + * contain a file documenting the changes Licensee made to create that Covered + * Code and the date of any change. Licensee must include in that file the + * documentation of any changes made by any predecessor Licensee. Licensee + * must include a prominent statement that the modification is derived, + * directly or indirectly, from Original Intel Code. + * + * 3.2. Redistribution of Source with no Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification without rights to further distribute source must + * include the following Disclaimer and Export Compliance provision in the + * documentation and/or other materials provided with distribution. In + * addition, Licensee may not authorize further sublicense of source of any + * portion of the Covered Code, and must include terms to the effect that the + * license from Licensee to its licensee is limited to the intellectual + * property embodied in the software Licensee provides to its licensee, and + * not to intellectual property embodied in modifications its licensee may + * make. + * + * 3.3. Redistribution of Executable. Redistribution in executable form of any + * substantial portion of the Covered Code or modification must reproduce the + * above Copyright Notice, and the following Disclaimer and Export Compliance + * provision in the documentation and/or other materials provided with the + * distribution. + * + * 3.4. Intel retains all right, title, and interest in and to the Original + * Intel Code. + * + * 3.5. Neither the name Intel nor any other trademark owned or controlled by + * Intel shall be used in advertising or otherwise to promote the sale, use or + * other dealings in products derived from or relating to the Covered Code + * without prior written authorization from Intel. + * + * 4. Disclaimer and Export Compliance + * + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY + * LIMITED REMEDY. + * + * 4.3. Licensee shall not export, either directly or indirectly, any of this + * software or system incorporating such software without first obtaining any + * required license or other approval from the U. S. Department of Commerce or + * any other agency or department of the United States Government. In the + * event Licensee exports any such software from the United States or + * re-exports any such software from a foreign destination, Licensee shall + * ensure that the distribution and export/re-export of the software is in + * compliance with all laws, regulations, orders, or other restrictions of the + * U.S. Export Administration Regulations. Licensee agrees that neither it nor + * any of its subsidiaries will export/re-export any technical data, process, + * software, or service, directly or indirectly, to any country for which the + * United States government or any agency thereof requires an export license, + * other governmental approval, or letter of assurance, without first obtaining + * such license, approval or letter. + * + *****************************************************************************/ + +#include +#include +#include +#include +#include + + +/* + * This module is used for application-level code (iASL disassembler) only. + * + * It contains the code to create and emit any necessary External() ASL + * statements for the module being disassembled. + */ +#define _COMPONENT ACPI_CA_DISASSEMBLER + ACPI_MODULE_NAME ("dmextern") + + +/* + * This table maps ACPI_OBJECT_TYPEs to the corresponding ASL + * ObjectTypeKeyword. Used to generate typed external declarations + */ +static const char *AcpiGbl_DmTypeNames[] = +{ + /* 00 */ "", /* Type ANY */ + /* 01 */ ", IntObj", + /* 02 */ ", StrObj", + /* 03 */ ", BuffObj", + /* 04 */ ", PkgObj", + /* 05 */ ", FieldUnitObj", + /* 06 */ ", DeviceObj", + /* 07 */ ", EventObj", + /* 08 */ ", MethodObj", + /* 09 */ ", MutexObj", + /* 10 */ ", OpRegionObj", + /* 11 */ ", PowerResObj", + /* 12 */ ", ProcessorObj", + /* 13 */ ", ThermalZoneObj", + /* 14 */ ", BuffFieldObj", + /* 15 */ ", DDBHandleObj", + /* 16 */ "", /* Debug object */ + /* 17 */ ", FieldUnitObj", + /* 18 */ ", FieldUnitObj", + /* 19 */ ", FieldUnitObj" +}; + + +/* Local prototypes */ + +static const char * +AcpiDmGetObjectTypeName ( + ACPI_OBJECT_TYPE Type); + +static char * +AcpiDmNormalizeParentPrefix ( + ACPI_PARSE_OBJECT *Op, + char *Path); + + +/******************************************************************************* + * + * FUNCTION: AcpiDmGetObjectTypeName + * + * PARAMETERS: Type - An ACPI_OBJECT_TYPE + * + * RETURN: Pointer to a string + * + * DESCRIPTION: Map an object type to the ASL object type string. + * + ******************************************************************************/ + +static const char * +AcpiDmGetObjectTypeName ( + ACPI_OBJECT_TYPE Type) +{ + + if (Type == ACPI_TYPE_LOCAL_SCOPE) + { + Type = ACPI_TYPE_DEVICE; + } + + else if (Type > ACPI_TYPE_LOCAL_INDEX_FIELD) + { + return (""); + } + + return (AcpiGbl_DmTypeNames[Type]); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmNormalizeParentPrefix + * + * PARAMETERS: Op - Parse op + * Path - Path with parent prefix + * + * RETURN: The full pathname to the object (from the namespace root) + * + * DESCRIPTION: Returns the full pathname of a path with parent prefix + * The caller must free the fullpath returned. + * + ******************************************************************************/ + +static char * +AcpiDmNormalizeParentPrefix ( + ACPI_PARSE_OBJECT *Op, + char *Path) +{ + ACPI_NAMESPACE_NODE *Node; + char *Fullpath; + char *ParentPath; + ACPI_SIZE Length; + + + /* Search upwards in the parse tree until we reach a namespace node */ + + while (Op) + { + if (Op->Common.Node) + { + break; + } + + Op = Op->Common.Parent; + } + + if (!Op) + { + return (NULL); + } + + /* + * Find the actual parent node for the reference: + * Remove all carat prefixes from the input path. + * There may be multiple parent prefixes (For example, ^^^M000) + */ + Node = Op->Common.Node; + while (Node && (*Path == (UINT8) AML_PARENT_PREFIX)) + { + Node = AcpiNsGetParentNode (Node); + Path++; + } + + if (!Node) + { + return (NULL); + } + + /* Get the full pathname for the parent node */ + + ParentPath = AcpiNsGetExternalPathname (Node); + if (!ParentPath) + { + return (NULL); + } + + Length = (ACPI_STRLEN (ParentPath) + ACPI_STRLEN (Path) + 1); + Fullpath = ACPI_ALLOCATE_ZEROED (Length); + if (!Fullpath) + { + goto Cleanup; + } + + /* + * Concatenate parent fullpath and path. For example, + * parent fullpath "\_SB_", Path "^INIT", Fullpath "\_SB_.INIT" + * + * Copy the parent path + */ + ACPI_STRCAT (Fullpath, ParentPath); + + /* Add dot separator (don't need dot if parent fullpath is a single "\") */ + + if (ParentPath[1]) + { + ACPI_STRCAT (Fullpath, "."); + } + + /* Copy child path (carat parent prefix(es) were skipped above) */ + + ACPI_STRCAT (Fullpath, Path); + +Cleanup: + ACPI_FREE (ParentPath); + return (Fullpath); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmAddToExternalList + * + * PARAMETERS: Op - Current parser Op + * Path - Internal (AML) path to the object + * Type - ACPI object type to be added + * Value - Arg count if adding a Method object + * + * RETURN: None + * + * DESCRIPTION: Insert a new name into the global list of Externals which + * will in turn be later emitted as an External() declaration + * in the disassembled output. + * + ******************************************************************************/ + +void +AcpiDmAddToExternalList ( + ACPI_PARSE_OBJECT *Op, + char *Path, + UINT8 Type, + UINT32 Value) +{ + char *ExternalPath; + char *Fullpath = NULL; + ACPI_EXTERNAL_LIST *NewExternal; + ACPI_EXTERNAL_LIST *NextExternal; + ACPI_EXTERNAL_LIST *PrevExternal = NULL; + ACPI_STATUS Status; + + + if (!Path) + { + return; + } + + /* Externalize the ACPI path */ + + Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Path, + NULL, &ExternalPath); + if (ACPI_FAILURE (Status)) + { + return; + } + + /* Get the full pathname from root if "Path" has a parent prefix */ + + if (*Path == (UINT8) AML_PARENT_PREFIX) + { + Fullpath = AcpiDmNormalizeParentPrefix (Op, ExternalPath); + if (Fullpath) + { + /* Set new external path */ + + ACPI_FREE (ExternalPath); + ExternalPath = Fullpath; + } + } + + /* Check all existing externals to ensure no duplicates */ + + NextExternal = AcpiGbl_ExternalList; + while (NextExternal) + { + if (!ACPI_STRCMP (ExternalPath, NextExternal->Path)) + { + /* Duplicate method, check that the Value (ArgCount) is the same */ + + if ((NextExternal->Type == ACPI_TYPE_METHOD) && + (NextExternal->Value != Value)) + { + ACPI_ERROR ((AE_INFO, + "Argument count mismatch for method %s %d %d", + NextExternal->Path, NextExternal->Value, Value)); + } + + /* Allow upgrade of type from ANY */ + + else if (NextExternal->Type == ACPI_TYPE_ANY) + { + NextExternal->Type = Type; + NextExternal->Value = Value; + } + + ACPI_FREE (ExternalPath); + return; + } + + NextExternal = NextExternal->Next; + } + + /* Allocate and init a new External() descriptor */ + + NewExternal = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_LIST)); + if (!NewExternal) + { + ACPI_FREE (ExternalPath); + return; + } + + NewExternal->Path = ExternalPath; + NewExternal->Type = Type; + NewExternal->Value = Value; + NewExternal->Length = (UINT16) ACPI_STRLEN (ExternalPath); + + /* Was the external path with parent prefix normalized to a fullpath? */ + + if (Fullpath == ExternalPath) + { + /* Get new internal path */ + + Status = AcpiNsInternalizeName (ExternalPath, &Path); + if (ACPI_FAILURE (Status)) + { + ACPI_FREE (ExternalPath); + ACPI_FREE (NewExternal); + return; + } + + /* Set flag to indicate External->InternalPath need to be freed */ + + NewExternal->Flags |= ACPI_IPATH_ALLOCATED; + } + + NewExternal->InternalPath = Path; + + /* Link the new descriptor into the global list, ordered by string length */ + + NextExternal = AcpiGbl_ExternalList; + while (NextExternal) + { + if (NewExternal->Length <= NextExternal->Length) + { + if (PrevExternal) + { + PrevExternal->Next = NewExternal; + } + else + { + AcpiGbl_ExternalList = NewExternal; + } + + NewExternal->Next = NextExternal; + return; + } + + PrevExternal = NextExternal; + NextExternal = NextExternal->Next; + } + + if (PrevExternal) + { + PrevExternal->Next = NewExternal; + } + else + { + AcpiGbl_ExternalList = NewExternal; + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmAddExternalsToNamespace + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Add all externals to the namespace. Allows externals to be + * "resolved". + * + ******************************************************************************/ + +void +AcpiDmAddExternalsToNamespace ( + void) +{ + ACPI_STATUS Status; + ACPI_NAMESPACE_NODE *Node; + ACPI_OPERAND_OBJECT *MethodDesc; + ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; + + + while (External) + { + /* Add the external name (object) into the namespace */ + + Status = AcpiNsLookup (NULL, External->InternalPath, External->Type, + ACPI_IMODE_LOAD_PASS1, + ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE, + NULL, &Node); + + if (ACPI_FAILURE (Status)) + { + ACPI_EXCEPTION ((AE_INFO, Status, + "while adding external to namespace [%s]", + External->Path)); + } + else if (External->Type == ACPI_TYPE_METHOD) + { + /* For methods, we need to save the argument count */ + + MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); + MethodDesc->Method.ParamCount = (UINT8) External->Value; + Node->Object = MethodDesc; + } + + External = External->Next; + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmGetExternalMethodCount + * + * PARAMETERS: None + * + * RETURN: The number of control method externals in the external list + * + * DESCRIPTION: Return the number of method externals that have been generated. + * If any control method externals have been found, we must + * re-parse the entire definition block with the new information + * (number of arguments for the methods.) This is limitation of + * AML, we don't know the number of arguments from the control + * method invocation itself. + * + ******************************************************************************/ + +UINT32 +AcpiDmGetExternalMethodCount ( + void) +{ + ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; + UINT32 Count = 0; + + + while (External) + { + if (External->Type == ACPI_TYPE_METHOD) + { + Count++; + } + + External = External->Next; + } + + return (Count); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmClearExternalList + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Free the entire External info list + * + ******************************************************************************/ + +void +AcpiDmClearExternalList ( + void) +{ + ACPI_EXTERNAL_LIST *NextExternal; + + + while (AcpiGbl_ExternalList) + { + NextExternal = AcpiGbl_ExternalList->Next; + ACPI_FREE (AcpiGbl_ExternalList->Path); + ACPI_FREE (AcpiGbl_ExternalList); + AcpiGbl_ExternalList = NextExternal; + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmEmitExternals + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Emit an External() ASL statement for each of the externals in + * the global external info list. + * + ******************************************************************************/ + +void +AcpiDmEmitExternals ( + void) +{ + ACPI_EXTERNAL_LIST *NextExternal; + + + if (!AcpiGbl_ExternalList) + { + return; + } + + /* + * Walk the list of externals (unresolved references) + * found during the AML parsing + */ + while (AcpiGbl_ExternalList) + { + AcpiOsPrintf (" External (%s%s", + AcpiGbl_ExternalList->Path, + AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type)); + + if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD) + { + AcpiOsPrintf (") // %d Arguments\n", + AcpiGbl_ExternalList->Value); + } + else + { + AcpiOsPrintf (")\n"); + } + + /* Free this external info block and move on to next external */ + + NextExternal = AcpiGbl_ExternalList->Next; + if (AcpiGbl_ExternalList->Flags & ACPI_IPATH_ALLOCATED) + { + ACPI_FREE (AcpiGbl_ExternalList->InternalPath); + } + + ACPI_FREE (AcpiGbl_ExternalList->Path); + ACPI_FREE (AcpiGbl_ExternalList); + AcpiGbl_ExternalList = NextExternal; + } + + AcpiOsPrintf ("\n"); +} + diff --git a/sys/contrib/dev/acpica/common/dmrestag.c b/sys/contrib/dev/acpica/common/dmrestag.c index 38caa23f9121..4abbf53a1f27 100644 --- a/sys/contrib/dev/acpica/common/dmrestag.c +++ b/sys/contrib/dev/acpica/common/dmrestag.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/common/dmtable.c b/sys/contrib/dev/acpica/common/dmtable.c index edce7af8dc02..70858911150a 100644 --- a/sys/contrib/dev/acpica/common/dmtable.c +++ b/sys/contrib/dev/acpica/common/dmtable.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -218,7 +218,6 @@ static const char *AcpiDmIvrsSubnames[] = }; - #define ACPI_FADT_PM_RESERVED 8 static const char *AcpiDmFadtProfiles[] = @@ -954,7 +953,7 @@ AcpiDmCheckAscii ( for (i = 0; i < Count; i++) { - RepairedName[i] = Name[i]; + RepairedName[i] = (char) Name[i]; if (!Name[i]) { diff --git a/sys/contrib/dev/acpica/common/dmtbdump.c b/sys/contrib/dev/acpica/common/dmtbdump.c index 00ca3758c6a6..2c9725d8206b 100644 --- a/sys/contrib/dev/acpica/common/dmtbdump.c +++ b/sys/contrib/dev/acpica/common/dmtbdump.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/common/dmtbinfo.c b/sys/contrib/dev/acpica/common/dmtbinfo.c index 629f009e07cf..6d3b500e0c0e 100644 --- a/sys/contrib/dev/acpica/common/dmtbinfo.c +++ b/sys/contrib/dev/acpica/common/dmtbinfo.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/common/getopt.c b/sys/contrib/dev/acpica/common/getopt.c index 56c7332817f6..b4a5b9e1e1d8 100644 --- a/sys/contrib/dev/acpica/common/getopt.c +++ b/sys/contrib/dev/acpica/common/getopt.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -195,9 +195,9 @@ AcpiGetopt( if (*++OptsPtr == ':') { - if (argv[AcpiGbl_Optind][CurrentCharPtr+1] != '\0') + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0') { - AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][CurrentCharPtr+1]; + AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)]; } else if (++AcpiGbl_Optind >= argc) { @@ -218,9 +218,9 @@ AcpiGetopt( else if (*OptsPtr == '^') { - if (argv[AcpiGbl_Optind][CurrentCharPtr+1] != '\0') + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0') { - AcpiGbl_Optarg = &argv[AcpiGbl_Optind][CurrentCharPtr+1]; + AcpiGbl_Optarg = &argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)]; } else { diff --git a/sys/contrib/dev/acpica/compiler/aslanalyze.c b/sys/contrib/dev/acpica/compiler/aslanalyze.c index 65052d50353f..46a6db00723b 100644 --- a/sys/contrib/dev/acpica/compiler/aslanalyze.c +++ b/sys/contrib/dev/acpica/compiler/aslanalyze.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -667,8 +667,8 @@ AnCheckForReservedName ( { /* The next two characters must be hex digits */ - if ((isxdigit (Name[2])) && - (isxdigit (Name[3]))) + if ((isxdigit ((int) Name[2])) && + (isxdigit ((int) Name[3]))) { return (ACPI_EVENT_RESERVED_NAME); } @@ -1236,7 +1236,7 @@ AnMethodAnalysisWalkBegin ( */ for (i = 0; Next->Asl.Value.String[i]; i++) { - if (!isalnum (Next->Asl.Value.String[i])) + if (!isalnum ((int) Next->Asl.Value.String[i])) { AslError (ASL_ERROR, ASL_MSG_ALPHANUMERIC_STRING, Next, Next->Asl.Value.String); @@ -2157,7 +2157,7 @@ AnOtherSemanticAnalysisWalkBegin ( */ if (((ArgNode->Asl.ParseOpcode == PARSEOP_WORDCONST) || (ArgNode->Asl.ParseOpcode == PARSEOP_INTEGER)) && - (ArgNode->Asl.Value.Integer >= (ACPI_INTEGER) ACPI_WAIT_FOREVER)) + (ArgNode->Asl.Value.Integer >= (UINT64) ACPI_WAIT_FOREVER)) { break; } diff --git a/sys/contrib/dev/acpica/compiler/aslcodegen.c b/sys/contrib/dev/acpica/compiler/aslcodegen.c index 6e0c764b5d1d..6821a69e4924 100644 --- a/sys/contrib/dev/acpica/compiler/aslcodegen.c +++ b/sys/contrib/dev/acpica/compiler/aslcodegen.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslcompile.c b/sys/contrib/dev/acpica/compiler/aslcompile.c index dda3ce3238cc..443273c62c77 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompile.c +++ b/sys/contrib/dev/acpica/compiler/aslcompile.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -895,6 +895,14 @@ CmCleanupAndExit ( 10) / Gbl_NsLookupCount); } + + if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) + { + printf ("\nMaximum error count (%d) exceeded\n", ASL_MAX_ERROR_COUNT); + } + + UtDisplaySummary (ASL_FILE_STDOUT); + /* Close all open files */ for (i = 2; i < ASL_MAX_FILE_TYPE; i++) @@ -902,14 +910,6 @@ CmCleanupAndExit ( FlCloseFile (i); } - /* - * TBD: SourceOutput should be .TMP, then rename if we want to keep it? - */ - if (!Gbl_SourceOutputFlag) - { - remove (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); - } - /* Delete AML file if there are errors */ if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors)) @@ -917,12 +917,19 @@ CmCleanupAndExit ( remove (Gbl_Files[ASL_FILE_AML_OUTPUT].Filename); } - if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) + /* + * Delete intermediate ("combined") source file (if -ls flag not set) + * + * TBD: SourceOutput should be .TMP, then rename if we want to keep it? + */ + if (!Gbl_SourceOutputFlag) { - printf ("\nMaximum error count (%d) exceeded\n", ASL_MAX_ERROR_COUNT); + if (remove (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename)) + { + printf ("Could not remove SRC file, %s\n", + Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); + } } - - UtDisplaySummary (ASL_FILE_STDOUT); } diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.h b/sys/contrib/dev/acpica/compiler/aslcompiler.h index ea6206f20934..16b5f723d45c 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.h +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.h @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -511,7 +511,7 @@ TrCreateLeafNode ( ACPI_PARSE_OBJECT * TrCreateValuedLeafNode ( UINT32 ParseOpcode, - ACPI_INTEGER Value); + UINT64 Value); ACPI_PARSE_OBJECT * TrLinkChildren ( @@ -718,7 +718,7 @@ UtCheckIntegerRange ( UINT32 LowValue, UINT32 HighValue); -ACPI_INTEGER +UINT64 UtDoConstant ( char *String); diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.l b/sys/contrib/dev/acpica/compiler/aslcompiler.l index 38b0254aafc1..bf9077f495a0 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.l +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.l @@ -10,7 +10,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.y b/sys/contrib/dev/acpica/compiler/aslcompiler.y index 1ca9dae2e114..d5120def8e1e 100644 --- a/sys/contrib/dev/acpica/compiler/aslcompiler.y +++ b/sys/contrib/dev/acpica/compiler/aslcompiler.y @@ -10,7 +10,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -2388,7 +2388,7 @@ QWordConstExpr ConstExprTerm : PARSEOP_ZERO {$$ = TrCreateValuedLeafNode (PARSEOP_ZERO, 0);} | PARSEOP_ONE {$$ = TrCreateValuedLeafNode (PARSEOP_ONE, 1);} - | PARSEOP_ONES {$$ = TrCreateValuedLeafNode (PARSEOP_ONES, ACPI_INTEGER_MAX);} + | PARSEOP_ONES {$$ = TrCreateValuedLeafNode (PARSEOP_ONES, ACPI_UINT64_MAX);} ; /* OptionalCount must appear before ByteList or an incorrect reduction will result */ diff --git a/sys/contrib/dev/acpica/compiler/asldefine.h b/sys/contrib/dev/acpica/compiler/asldefine.h index aeb368fa06b8..75345a5d7f4b 100644 --- a/sys/contrib/dev/acpica/compiler/asldefine.h +++ b/sys/contrib/dev/acpica/compiler/asldefine.h @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -127,7 +127,7 @@ #define IntelAcpiCA "Intel ACPI Component Architecture" #define CompilerId "ASL Optimizing Compiler" #define DisassemblerId "AML Disassembler" -#define CompilerCopyright "Copyright (C) 2000 - 2009 Intel Corporation" +#define CompilerCopyright "Copyright (c) 2000 - 2010 Intel Corporation" #define CompilerCompliance "Supports ACPI Specification Revision 4.0" #define CompilerName "iasl" #define CompilerCreatorId "INTL" diff --git a/sys/contrib/dev/acpica/compiler/aslerror.c b/sys/contrib/dev/acpica/compiler/aslerror.c index 2591dfe8c8b0..1fa78a5d81b1 100644 --- a/sys/contrib/dev/acpica/compiler/aslerror.c +++ b/sys/contrib/dev/acpica/compiler/aslerror.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -169,13 +169,7 @@ AeAddToErrorLog ( ASL_ERROR_MSG *Prev; - if (!Gbl_ErrorLog) - { - Gbl_ErrorLog = Enode; - return; - } - - /* List is sorted according to line number */ + /* If Gbl_ErrorLog is null, this is the first error node */ if (!Gbl_ErrorLog) { @@ -183,8 +177,10 @@ AeAddToErrorLog ( return; } - /* Walk error list until we find a line number greater than ours */ - + /* + * Walk error list until we find a line number greater than ours. + * List is sorted according to line number. + */ Prev = NULL; Next = Gbl_ErrorLog; @@ -535,6 +531,7 @@ AslCommonError ( Gbl_NextError = Gbl_ErrorLog; CmDoOutputFiles (); CmCleanupAndExit (); + exit(1); } return; diff --git a/sys/contrib/dev/acpica/compiler/aslfiles.c b/sys/contrib/dev/acpica/compiler/aslfiles.c index 17ae845e3a26..f2e2dca3fc39 100644 --- a/sys/contrib/dev/acpica/compiler/aslfiles.c +++ b/sys/contrib/dev/acpica/compiler/aslfiles.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslfold.c b/sys/contrib/dev/acpica/compiler/aslfold.c index d250c332b6c9..9b5efa8aa5ee 100644 --- a/sys/contrib/dev/acpica/compiler/aslfold.c +++ b/sys/contrib/dev/acpica/compiler/aslfold.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslglobal.h b/sys/contrib/dev/acpica/compiler/aslglobal.h index 6aecfb6fb4f5..69fcf8438a1e 100644 --- a/sys/contrib/dev/acpica/compiler/aslglobal.h +++ b/sys/contrib/dev/acpica/compiler/aslglobal.h @@ -10,7 +10,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -165,7 +165,6 @@ ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_LineBufPtr, Gbl_Curren ASL_EXTERN ASL_ERROR_MSG ASL_INIT_GLOBAL (*Gbl_ErrorLog,NULL); ASL_EXTERN ASL_ERROR_MSG ASL_INIT_GLOBAL (*Gbl_NextError,NULL); -extern UINT32 Gbl_ExceptionCount[]; /* Option flags */ @@ -278,5 +277,12 @@ ASL_EXTERN char MsgBuffer[ASL_MSG_BUFFER_SIZE]; ASL_EXTERN char StringBuffer[ASL_MSG_BUFFER_SIZE]; ASL_EXTERN char StringBuffer2[ASL_MSG_BUFFER_SIZE]; + +#ifdef _DECLARE_GLOBALS +UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0}; +#else +extern UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS]; +#endif + #endif /* __ASLGLOBAL_H */ diff --git a/sys/contrib/dev/acpica/compiler/asllength.c b/sys/contrib/dev/acpica/compiler/asllength.c index 75361dc2a0d8..d17bab97eab4 100644 --- a/sys/contrib/dev/acpica/compiler/asllength.c +++ b/sys/contrib/dev/acpica/compiler/asllength.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/asllisting.c b/sys/contrib/dev/acpica/compiler/asllisting.c index ff1e2baf421e..ebac9ca4996d 100644 --- a/sys/contrib/dev/acpica/compiler/asllisting.c +++ b/sys/contrib/dev/acpica/compiler/asllisting.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslload.c b/sys/contrib/dev/acpica/compiler/aslload.c index 2428f0f0871f..980b69b8c623 100644 --- a/sys/contrib/dev/acpica/compiler/aslload.c +++ b/sys/contrib/dev/acpica/compiler/aslload.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -534,7 +534,7 @@ LdNamespace1Begin ( if (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC) { Status = LdLoadResourceElements (Op, WalkState); - goto Exit; + return_ACPI_STATUS (Status); } ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode); @@ -575,8 +575,10 @@ LdNamespace1Begin ( goto FinishNode; } - AslCoreSubsystemError (Op, Status, "Failure from lookup\n", FALSE); - goto Exit; + AslCoreSubsystemError (Op, Status, + "Failure from namespace lookup", FALSE); + + return_ACPI_STATUS (Status); } /* We found a node with this name, now check the type */ @@ -711,15 +713,14 @@ LdNamespace1Begin ( AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, Op->Asl.ExternalName); - Status = AE_OK; - goto Exit; + return_ACPI_STATUS (AE_OK); } } else { AslCoreSubsystemError (Op, Status, - "Failure from lookup %s\n", FALSE); - goto Exit; + "Failure from namespace lookup", FALSE); + return_ACPI_STATUS (Status); } } @@ -757,8 +758,7 @@ FinishNode: Node->Value = (UINT32) Op->Asl.Extra; } -Exit: - return (Status); + return_ACPI_STATUS (Status); } @@ -885,7 +885,8 @@ LdNamespace2Begin ( return (AE_OK); } - AslCoreSubsystemError (Op, Status, "Failure from lookup\n", FALSE); + AslCoreSubsystemError (Op, Status, + "Failure from namespace lookup", FALSE); return (AE_OK); } diff --git a/sys/contrib/dev/acpica/compiler/asllookup.c b/sys/contrib/dev/acpica/compiler/asllookup.c index 716e9f9bc771..1f9fb4c3cb96 100644 --- a/sys/contrib/dev/acpica/compiler/asllookup.c +++ b/sys/contrib/dev/acpica/compiler/asllookup.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -526,7 +526,7 @@ LsDisplayNamespace ( /* Walk entire namespace from the root */ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, LsDoOneNamespaceObject, + ACPI_UINT32_MAX, FALSE, LsDoOneNamespaceObject, NULL, NULL, NULL); /* Print the full pathname for each namespace node */ @@ -534,7 +534,7 @@ LsDisplayNamespace ( FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\nNamespace pathnames\n\n"); Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, LsDoOnePathname, + ACPI_UINT32_MAX, FALSE, LsDoOnePathname, NULL, NULL, NULL); return (Status); @@ -598,7 +598,7 @@ LkObjectExists ( /* Walk entire namespace from the supplied root */ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, LsCompareOneNamespaceObject, + ACPI_UINT32_MAX, FALSE, LsCompareOneNamespaceObject, NULL, Name, NULL); if (Status == AE_CTRL_TRUE) { @@ -753,7 +753,7 @@ LkFindUnreferencedObjects ( /* Walk entire namespace from the supplied root */ (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, LkIsObjectUsed, + ACPI_UINT32_MAX, FALSE, LkIsObjectUsed, NULL, NULL, NULL); } diff --git a/sys/contrib/dev/acpica/compiler/aslmain.c b/sys/contrib/dev/acpica/compiler/aslmain.c index 6e05b49fd22a..9b9e95685439 100644 --- a/sys/contrib/dev/acpica/compiler/aslmain.c +++ b/sys/contrib/dev/acpica/compiler/aslmain.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -165,9 +165,6 @@ static int AslDoResponseFile ( char *Filename); -extern int AcpiGbl_Opterr; -extern int AcpiGbl_Optind; - #define ASL_TOKEN_SEPARATORS " \t\n" #define ASL_SUPPORTED_OPTIONS "@:2b:cd^e:fgh^i^I:l^o:p:r:s:t:v:w:x:" diff --git a/sys/contrib/dev/acpica/compiler/aslmap.c b/sys/contrib/dev/acpica/compiler/aslmap.c index 675a7bf18e76..be43b229ce59 100644 --- a/sys/contrib/dev/acpica/compiler/aslmap.c +++ b/sys/contrib/dev/acpica/compiler/aslmap.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslopcodes.c b/sys/contrib/dev/acpica/compiler/aslopcodes.c index ba5b41c7b5db..b1a56921de30 100644 --- a/sys/contrib/dev/acpica/compiler/aslopcodes.c +++ b/sys/contrib/dev/acpica/compiler/aslopcodes.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -328,7 +328,7 @@ OpcSetOptimalIntegerSize ( } break; - case ACPI_INTEGER_MAX: + case ACPI_UINT64_MAX: /* Check for table integer width (32 or 64) */ @@ -568,7 +568,7 @@ OpcDoEisaId ( if (i < 3) { - if (!isupper (InString[i])) + if (!isupper ((int) InString[i])) { Status = AE_BAD_PARAMETER; } @@ -576,7 +576,7 @@ OpcDoEisaId ( /* Last 4 characters must be hex digits */ - else if (!isxdigit (InString[i])) + else if (!isxdigit ((int) InString[i])) { Status = AE_BAD_PARAMETER; } @@ -666,7 +666,7 @@ OpcDoUuId ( } else { - if (!isxdigit (InString[i])) + if (!isxdigit ((int) InString[i])) { Status = AE_BAD_PARAMETER; } diff --git a/sys/contrib/dev/acpica/compiler/asloperands.c b/sys/contrib/dev/acpica/compiler/asloperands.c index 4e6d3b1e9ef3..772c89da6995 100644 --- a/sys/contrib/dev/acpica/compiler/asloperands.c +++ b/sys/contrib/dev/acpica/compiler/asloperands.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -604,7 +604,7 @@ OpnDoRegion ( } else { - Op->Asl.Value.Integer = ACPI_INTEGER_MAX; + Op->Asl.Value.Integer = ACPI_UINT64_MAX; } } @@ -788,20 +788,30 @@ OpnDoPackage ( if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER) || (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST)) { - if (PackageLengthOp->Asl.Value.Integer >= PackageLength) + if (PackageLengthOp->Asl.Value.Integer > PackageLength) { - /* Allow package to be longer than the initializer list */ + /* + * Allow package length to be longer than the initializer + * list -- but if the length of initializer list is nonzero, + * issue a message since this is probably a coding error, + * even though technically legal. + */ + if (PackageLength > 0) + { + AslError (ASL_REMARK, ASL_MSG_LIST_LENGTH_SHORT, + PackageLengthOp, NULL); + } PackageLength = (UINT32) PackageLengthOp->Asl.Value.Integer; } - else + else if (PackageLengthOp->Asl.Value.Integer < PackageLength) { /* - * Initializer list is longer than the package length. This - * is an error as per the ACPI spec. + * The package length is smaller than the length of the + * initializer list. This is an error as per the ACPI spec. */ - AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH, - PackageLengthOp->Asl.Next, NULL); + AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH_LONG, + PackageLengthOp, NULL); } } @@ -997,7 +1007,7 @@ OpnDoDefinitionBlock ( for (i = 0; i < 4; i++) { - if (!isalnum (Gbl_TableSignature[i])) + if (!isalnum ((int) Gbl_TableSignature[i])) { AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child, "Contains non-alphanumeric characters"); diff --git a/sys/contrib/dev/acpica/compiler/aslopt.c b/sys/contrib/dev/acpica/compiler/aslopt.c index 53ae3ce1328d..89c7baab1412 100644 --- a/sys/contrib/dev/acpica/compiler/aslopt.c +++ b/sys/contrib/dev/acpica/compiler/aslopt.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslresource.c b/sys/contrib/dev/acpica/compiler/aslresource.c index 59b75c20c384..3242ba700d68 100644 --- a/sys/contrib/dev/acpica/compiler/aslresource.c +++ b/sys/contrib/dev/acpica/compiler/aslresource.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -184,7 +184,7 @@ RsCreateBitField ( { Op->Asl.ExternalName = Name; - Op->Asl.Value.Integer = ((ACPI_INTEGER) ByteOffset * 8) + BitOffset; + Op->Asl.Value.Integer = ((UINT64) ByteOffset * 8) + BitOffset; Op->Asl.CompileFlags |= (NODE_IS_RESOURCE_FIELD | NODE_IS_BIT_OFFSET); } diff --git a/sys/contrib/dev/acpica/compiler/aslrestype1.c b/sys/contrib/dev/acpica/compiler/aslrestype1.c index 0de4d6fd693a..036abdf116fc 100644 --- a/sys/contrib/dev/acpica/compiler/aslrestype1.c +++ b/sys/contrib/dev/acpica/compiler/aslrestype1.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslrestype2.c b/sys/contrib/dev/acpica/compiler/aslrestype2.c index 672c31a4d4b4..48be8536600f 100644 --- a/sys/contrib/dev/acpica/compiler/aslrestype2.c +++ b/sys/contrib/dev/acpica/compiler/aslrestype2.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslstartup.c b/sys/contrib/dev/acpica/compiler/aslstartup.c index 45ec82be2f84..bbaa60855015 100644 --- a/sys/contrib/dev/acpica/compiler/aslstartup.c +++ b/sys/contrib/dev/acpica/compiler/aslstartup.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/aslstubs.c b/sys/contrib/dev/acpica/compiler/aslstubs.c index 84c730f0b1c8..ebc0a7d321a1 100644 --- a/sys/contrib/dev/acpica/compiler/aslstubs.c +++ b/sys/contrib/dev/acpica/compiler/aslstubs.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/compiler/asltransform.c b/sys/contrib/dev/acpica/compiler/asltransform.c index ca0d4b82159b..f03f1fe97f8e 100644 --- a/sys/contrib/dev/acpica/compiler/asltransform.c +++ b/sys/contrib/dev/acpica/compiler/asltransform.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -468,6 +468,8 @@ TrDoSwitch ( ACPI_PARSE_OBJECT *NewOp; ACPI_PARSE_OBJECT *NewOp2; ACPI_PARSE_OBJECT *MethodOp; + ACPI_PARSE_OBJECT *StoreOp; + ACPI_PARSE_OBJECT *BreakOp; char *PredicateValueName; UINT16 Index; UINT32 Btype; @@ -552,7 +554,7 @@ TrDoSwitch ( NewOp = NewOp2; NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, - (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName)); + (UINT64) ACPI_TO_INTEGER (PredicateValueName)); NewOp->Asl.Next = NewOp2; TrAmlInitLineNumbers (NewOp2, Predicate); @@ -610,7 +612,7 @@ TrDoSwitch ( * CaseOp->Child->Peer is the beginning of the case block */ NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, - (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName)); + (UINT64) ACPI_TO_INTEGER (PredicateValueName)); NewOp->Asl.Next = Predicate; TrAmlInitLineNumbers (NewOp, Predicate); @@ -638,11 +640,7 @@ TrDoSwitch ( */ if (CurrentParentNode == StartNode) { - Conditional->Asl.Parent = CurrentParentNode->Asl.Parent; - - /* Link IF into the peer list */ - - TrAmlInsertPeer (CurrentParentNode, Conditional); + Conditional->Asl.Next = NULL; } else { @@ -695,6 +693,7 @@ TrDoSwitch ( { return; } + TrAmlInitNode (DefaultOp, PARSEOP_ELSE); DefaultOp->Asl.Parent = Conditional->Asl.Parent; @@ -762,7 +761,7 @@ TrDoSwitch ( /* Create the NameSeg child for the Name node */ NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESEG, - (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName)); + (UINT64) ACPI_TO_INTEGER (PredicateValueName)); NewOp2->Asl.CompileFlags |= NODE_IS_NAME_DECLARATION; NewOp->Asl.Child = NewOp2; @@ -772,22 +771,22 @@ TrDoSwitch ( { case ACPI_BTYPE_INTEGER: NewOp2->Asl.Next = TrCreateValuedLeafNode (PARSEOP_ZERO, - (ACPI_INTEGER) 0); + (UINT64) 0); break; case ACPI_BTYPE_STRING: NewOp2->Asl.Next = TrCreateValuedLeafNode (PARSEOP_STRING_LITERAL, - (ACPI_INTEGER) ACPI_TO_INTEGER ("")); + (UINT64) ACPI_TO_INTEGER ("")); break; case ACPI_BTYPE_BUFFER: (void) TrLinkPeerNode (NewOp2, TrCreateValuedLeafNode (PARSEOP_BUFFER, - (ACPI_INTEGER) 0)); + (UINT64) 0)); Next = NewOp2->Asl.Next; (void) TrLinkChildren (Next, 1, TrCreateValuedLeafNode (PARSEOP_ZERO, - (ACPI_INTEGER) 1)); + (UINT64) 1)); (void) TrLinkPeerNode (Next->Asl.Child, - TrCreateValuedLeafNode (PARSEOP_DEFAULT_ARG, (ACPI_INTEGER) 0)); + TrCreateValuedLeafNode (PARSEOP_DEFAULT_ARG, (UINT64) 0)); TrAmlSetSubtreeParent (Next->Asl.Child, Next); break; @@ -799,22 +798,44 @@ TrDoSwitch ( TrAmlSetSubtreeParent (NewOp2, NewOp); /* - * Transform the Switch() into a Store() node which will be used to save the + * Transform the Switch() into a While(One)-Break node. + * And create a Store() node which will be used to save the * Switch() value. The store is of the form: Store (Value, _T_x) * where _T_x is the temp variable. */ - TrAmlInitNode (StartNode, PARSEOP_STORE); - StartNode->Asl.Child = NULL; + TrAmlInitNode (StartNode, PARSEOP_WHILE); + NewOp = TrCreateLeafNode (PARSEOP_ONE); + NewOp->Asl.Next = Predicate->Asl.Next; + NewOp->Asl.Parent = StartNode; + StartNode->Asl.Child = NewOp; + + /* Create a Store() node */ + + StoreOp = TrCreateLeafNode (PARSEOP_STORE); + StoreOp->Asl.Parent = StartNode; + TrAmlInsertPeer (NewOp, StoreOp); /* Complete the Store subtree */ - StartNode->Asl.Child = Predicate; - Predicate->Asl.Parent = StartNode; + StoreOp->Asl.Child = Predicate; + Predicate->Asl.Parent = StoreOp; NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESEG, - (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName)); - NewOp->Asl.Parent = StartNode; + (UINT64) ACPI_TO_INTEGER (PredicateValueName)); + NewOp->Asl.Parent = StoreOp; Predicate->Asl.Next = NewOp; + + /* Create a Break() node and insert it into the end of While() */ + + Conditional = StartNode->Asl.Child; + while (Conditional->Asl.Next) + { + Conditional = Conditional->Asl.Next; + } + + BreakOp = TrCreateLeafNode (PARSEOP_BREAK); + BreakOp->Asl.Parent = StartNode; + TrAmlInsertPeer (Conditional, BreakOp); } diff --git a/sys/contrib/dev/acpica/compiler/asltree.c b/sys/contrib/dev/acpica/compiler/asltree.c index 7e161a770c77..438a235e43e3 100644 --- a/sys/contrib/dev/acpica/compiler/asltree.c +++ b/sys/contrib/dev/acpica/compiler/asltree.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -490,7 +490,7 @@ TrCreateLeafNode ( ACPI_PARSE_OBJECT * TrCreateValuedLeafNode ( UINT32 ParseOpcode, - ACPI_INTEGER Value) + UINT64 Value) { ACPI_PARSE_OBJECT *Op; diff --git a/sys/contrib/dev/acpica/compiler/asltypes.h b/sys/contrib/dev/acpica/compiler/asltypes.h index fb2396f4dde9..9e1d426d2b75 100644 --- a/sys/contrib/dev/acpica/compiler/asltypes.h +++ b/sys/contrib/dev/acpica/compiler/asltypes.h @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -369,7 +369,8 @@ typedef enum ASL_MSG_INVALID_TIME, ASL_MSG_INVALID_TYPE, ASL_MSG_INVALID_UUID, - ASL_MSG_LIST_LENGTH, + ASL_MSG_LIST_LENGTH_LONG, + ASL_MSG_LIST_LENGTH_SHORT, ASL_MSG_LISTING_FILE_OPEN, ASL_MSG_LISTING_FILENAME, ASL_MSG_LOCAL_INIT, @@ -488,7 +489,8 @@ char *AslMessages [] = { /* ASL_MSG_INVALID_TIME */ "Time parameter too long (255 max)", /* ASL_MSG_INVALID_TYPE */ "Invalid type", /* ASL_MSG_INVALID_UUID */ "UUID string must be of the form \"aabbccdd-eeff-gghh-iijj-kkllmmnnoopp\"", -/* ASL_MSG_LIST_LENGTH */ "Initializer list too long", +/* ASL_MSG_LIST_LENGTH_LONG */ "Initializer list longer than declared package length", +/* ASL_MSG_LIST_LENGTH_SHORT */ "Initializer list shorter than declared package length", /* ASL_MSG_LISTING_FILE_OPEN */ "Could not open listing file", /* ASL_MSG_LISTING_FILENAME */ "Could not create listing filename", /* ASL_MSG_LOCAL_INIT */ "Method local variable is not initialized", @@ -569,11 +571,6 @@ char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = { #define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings above */ -/* Exception counters */ - -UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0}; - -#endif - +#endif /* ASL_EXCEPTIONS */ #endif /* __ASLTYPES_H */ diff --git a/sys/contrib/dev/acpica/compiler/aslutils.c b/sys/contrib/dev/acpica/compiler/aslutils.c index a226a3dde182..bc315ccc9a39 100644 --- a/sys/contrib/dev/acpica/compiler/aslutils.c +++ b/sys/contrib/dev/acpica/compiler/aslutils.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -142,7 +142,7 @@ static ACPI_STATUS UtStrtoul64 ( char *String, UINT32 Base, - ACPI_INTEGER *RetInteger); + UINT64 *RetInteger); static void UtPadNameWithUnderscores ( @@ -846,12 +846,12 @@ UtAttachNamepathToOwner ( * ******************************************************************************/ -ACPI_INTEGER +UINT64 UtDoConstant ( char *String) { ACPI_STATUS Status; - ACPI_INTEGER Converted; + UINT64 Converted; char ErrBuf[64]; @@ -888,11 +888,11 @@ static ACPI_STATUS UtStrtoul64 ( char *String, UINT32 Base, - ACPI_INTEGER *RetInteger) + UINT64 *RetInteger) { UINT32 Index; UINT32 Sign; - ACPI_INTEGER ReturnValue = 0; + UINT64 ReturnValue = 0; ACPI_STATUS Status = AE_OK; @@ -916,7 +916,7 @@ UtStrtoul64 ( /* Skip over any white space in the buffer: */ - while (isspace (*String) || *String == '\t') + while (isspace ((int) *String) || *String == '\t') { ++String; } @@ -948,7 +948,7 @@ UtStrtoul64 ( { if (*String == '0') { - if (tolower (*(++String)) == 'x') + if (tolower ((int) *(++String)) == 'x') { Base = 16; ++String; @@ -975,7 +975,7 @@ UtStrtoul64 ( if (Base == 16 && *String == '0' && - tolower (*(++String)) == 'x') + tolower ((int) *(++String)) == 'x') { String++; } @@ -984,14 +984,14 @@ UtStrtoul64 ( while (*String) { - if (isdigit (*String)) + if (isdigit ((int) *String)) { Index = ((UINT8) *String) - '0'; } else { - Index = (UINT8) toupper (*String); - if (isupper ((char) Index)) + Index = (UINT8) toupper ((int) *String); + if (isupper ((int) Index)) { Index = Index - 'A' + 10; } @@ -1008,8 +1008,8 @@ UtStrtoul64 ( /* Check to see if value is out of range: */ - if (ReturnValue > ((ACPI_INTEGER_MAX - (ACPI_INTEGER) Index) / - (ACPI_INTEGER) Base)) + if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) / + (UINT64) Base)) { goto ErrorExit; } diff --git a/sys/contrib/dev/acpica/debugger/dbcmds.c b/sys/contrib/dev/acpica/debugger/dbcmds.c index e68e79b52c3d..0c704e7e386a 100644 --- a/sys/contrib/dev/acpica/debugger/dbcmds.c +++ b/sys/contrib/dev/acpica/debugger/dbcmds.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -130,6 +130,7 @@ #define _COMPONENT ACPI_CA_DEBUGGER ACPI_MODULE_NAME ("dbcmds") + /* Local prototypes */ static ACPI_STATUS @@ -382,7 +383,7 @@ AcpiDbFindReferences ( /* Search all nodes in namespace */ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - AcpiDbWalkForReferences, (void *) ObjDesc, NULL); + AcpiDbWalkForReferences, NULL, (void *) ObjDesc, NULL); } @@ -474,7 +475,7 @@ AcpiDbCheckPredefinedNames ( /* Search all nodes in namespace */ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - AcpiDbWalkForPredefinedNames, (void *) &Count, NULL); + AcpiDbWalkForPredefinedNames, NULL, (void *) &Count, NULL); AcpiOsPrintf ("Found %d predefined names in the namespace\n", Count); } @@ -501,7 +502,7 @@ AcpiDbWalkForExecute ( void **ReturnValue) { ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; - UINT32 *Count = (UINT32 *) Context; + ACPI_EXECUTE_WALK *Info = (ACPI_EXECUTE_WALK *) Context; ACPI_BUFFER ReturnObj; ACPI_STATUS Status; char *Pathname; @@ -542,7 +543,6 @@ AcpiDbWalkForExecute ( if (ObjInfo->Type == ACPI_TYPE_METHOD) { - /* Setup default parameters */ for (i = 0; i < ObjInfo->ParamCount; i++) @@ -556,11 +556,9 @@ AcpiDbWalkForExecute ( } ACPI_FREE (ObjInfo); - ReturnObj.Pointer = NULL; ReturnObj.Length = ACPI_ALLOCATE_BUFFER; - /* Do the actual method execution */ AcpiGbl_MethodExecuting = TRUE; @@ -569,11 +567,21 @@ AcpiDbWalkForExecute ( AcpiOsPrintf ("%-32s returned %s\n", Pathname, AcpiFormatException (Status)); AcpiGbl_MethodExecuting = FALSE; - ACPI_FREE (Pathname); - (*Count)++; - return (AE_OK); + /* Ignore status from method execution */ + + Status = AE_OK; + + /* Update count, check if we have executed enough methods */ + + Info->Count++; + if (Info->Count >= Info->MaxCount) + { + Status = AE_CTRL_TERMINATE; + } + + return (Status); } @@ -581,27 +589,37 @@ AcpiDbWalkForExecute ( * * FUNCTION: AcpiDbBatchExecute * - * PARAMETERS: None + * PARAMETERS: CountArg - Max number of methods to execute * * RETURN: None * - * DESCRIPTION: Namespace batch execution. + * DESCRIPTION: Namespace batch execution. Execute predefined names in the + * namespace, up to the max count, if specified. * ******************************************************************************/ void AcpiDbBatchExecute ( - void) + char *CountArg) { - UINT32 Count = 0; + ACPI_EXECUTE_WALK Info; + + + Info.Count = 0; + Info.MaxCount = ACPI_UINT32_MAX; + + if (CountArg) + { + Info.MaxCount = ACPI_STRTOUL (CountArg, NULL, 0); + } /* Search all nodes in namespace */ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - AcpiDbWalkForExecute, (void *) &Count, NULL); + AcpiDbWalkForExecute, NULL, (void *) &Info, NULL); - AcpiOsPrintf ("Executed %d predefined names in the namespace\n", Count); + AcpiOsPrintf ("Executed %d predefined names in the namespace\n", Info.Count); } @@ -1147,15 +1165,13 @@ AcpiDbSetMethodData ( /* Create and initialize the new object */ - ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ObjDesc = AcpiUtCreateIntegerObject ((UINT64) Value); if (!ObjDesc) { AcpiOsPrintf ("Could not create an internal object\n"); return; } - ObjDesc->Integer.Value = Value; - /* Store the new object into the target */ switch (Type) @@ -1307,7 +1323,7 @@ AcpiDbDisplayObjects ( /* Walk the namespace from the root */ (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - AcpiDbWalkForSpecificObjects, (void *) &Info, NULL); + AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL); AcpiOsPrintf ( "\nFound %u objects of type [%s] in the current ACPI Namespace\n", @@ -1423,7 +1439,7 @@ AcpiDbFindNameInNamespace ( /* Walk the namespace from the root */ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - AcpiDbWalkAndMatchName, AcpiName, NULL); + AcpiDbWalkAndMatchName, NULL, AcpiName, NULL); AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); return (AE_OK); @@ -1924,7 +1940,7 @@ AcpiDbCheckIntegrity ( /* Search all nodes in namespace */ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - AcpiDbIntegrityWalk, (void *) &Info, NULL); + AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL); AcpiOsPrintf ("Verified %d namespace nodes with %d Objects\n", Info.Nodes, Info.Objects); @@ -2111,7 +2127,7 @@ AcpiDbGetBusInfo ( /* Search all nodes in namespace */ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - AcpiDbBusWalk, NULL, NULL); + AcpiDbBusWalk, NULL, NULL, NULL); } #endif /* ACPI_DEBUGGER */ diff --git a/sys/contrib/dev/acpica/debugger/dbdisply.c b/sys/contrib/dev/acpica/debugger/dbdisply.c index c86d6a21acb6..179f6f66de95 100644 --- a/sys/contrib/dev/acpica/debugger/dbdisply.c +++ b/sys/contrib/dev/acpica/debugger/dbdisply.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/debugger/dbexec.c b/sys/contrib/dev/acpica/debugger/dbexec.c index 377b503c876e..d940384b4bb7 100644 --- a/sys/contrib/dev/acpica/debugger/dbexec.c +++ b/sys/contrib/dev/acpica/debugger/dbexec.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -243,7 +243,7 @@ AcpiDbExecuteMethod ( default: Params[i].Type = ACPI_TYPE_INTEGER; - Params[i].Integer.Value = i * (ACPI_INTEGER) 0x1000; + Params[i].Integer.Value = i * (UINT64) 0x1000; break; } } @@ -453,7 +453,7 @@ AcpiDbExecute ( if (*Name == '*') { (void) AcpiWalkNamespace (ACPI_TYPE_METHOD, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, AcpiDbExecutionWalk, NULL, NULL); + ACPI_UINT32_MAX, AcpiDbExecutionWalk, NULL, NULL, NULL); return; } else @@ -484,7 +484,7 @@ AcpiDbExecute ( * Allow any handlers in separate threads to complete. * (Such as Notify handlers invoked from AML executed above). */ - AcpiOsSleep ((ACPI_INTEGER) 10); + AcpiOsSleep ((UINT64) 10); #ifdef ACPI_DEBUG_OUTPUT diff --git a/sys/contrib/dev/acpica/debugger/dbfileio.c b/sys/contrib/dev/acpica/debugger/dbfileio.c index 47cf825483bb..ab38a6adbee0 100644 --- a/sys/contrib/dev/acpica/debugger/dbfileio.c +++ b/sys/contrib/dev/acpica/debugger/dbfileio.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -150,9 +150,6 @@ AcpiDbCheckTextModeCorruption ( UINT32 TableLength, UINT32 FileLength); -static ACPI_STATUS -AeLocalLoadTable ( - ACPI_TABLE_HEADER *TablePtr); #endif /******************************************************************************* @@ -424,7 +421,7 @@ AcpiDbReadTable ( { /* Now validate the checksum */ - Status = AcpiTbChecksum ((void *) *Table, + Status = AcpiTbVerifyChecksum ((void *) *Table, ACPI_CAST_PTR (ACPI_TABLE_HEADER, *Table)->Length); if (Status == AE_BAD_CHECKSUM) diff --git a/sys/contrib/dev/acpica/debugger/dbhistry.c b/sys/contrib/dev/acpica/debugger/dbhistry.c index 23aec92e858a..44394050a16b 100644 --- a/sys/contrib/dev/acpica/debugger/dbhistry.c +++ b/sys/contrib/dev/acpica/debugger/dbhistry.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/debugger/dbinput.c b/sys/contrib/dev/acpica/debugger/dbinput.c index 358600ef866d..67510fabf36a 100644 --- a/sys/contrib/dev/acpica/debugger/dbinput.c +++ b/sys/contrib/dev/acpica/debugger/dbinput.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -644,7 +644,7 @@ AcpiDbCommandDispatch ( break; case CMD_BATCH: - AcpiDbBatchExecute (); + AcpiDbBatchExecute (AcpiGbl_DbArgs[1]); break; case CMD_BREAKPOINT: diff --git a/sys/contrib/dev/acpica/debugger/dbstats.c b/sys/contrib/dev/acpica/debugger/dbstats.c index 688d5b312555..da5f6c0afc9e 100644 --- a/sys/contrib/dev/acpica/debugger/dbstats.c +++ b/sys/contrib/dev/acpica/debugger/dbstats.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -446,7 +446,7 @@ AcpiDbCountNamespaceObjects ( } (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, AcpiDbClassifyOneObject, NULL, NULL); + ACPI_UINT32_MAX, FALSE, AcpiDbClassifyOneObject, NULL, NULL, NULL); } diff --git a/sys/contrib/dev/acpica/debugger/dbutils.c b/sys/contrib/dev/acpica/debugger/dbutils.c index f394876a7b12..ab66d42e3680 100644 --- a/sys/contrib/dev/acpica/debugger/dbutils.c +++ b/sys/contrib/dev/acpica/debugger/dbutils.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -275,6 +275,10 @@ AcpiDbDumpExternalObject ( AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); if (ObjDesc->Buffer.Length) { + if (ObjDesc->Buffer.Length > 16) + { + AcpiOsPrintf ("\n"); + } AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer), ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT); } diff --git a/sys/contrib/dev/acpica/debugger/dbxface.c b/sys/contrib/dev/acpica/debugger/dbxface.c index 71ef17124a0a..b0162c2dd2ab 100644 --- a/sys/contrib/dev/acpica/debugger/dbxface.c +++ b/sys/contrib/dev/acpica/debugger/dbxface.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/disassembler/dmbuffer.c b/sys/contrib/dev/acpica/disassembler/dmbuffer.c index 02a8465e361d..a408355376f5 100644 --- a/sys/contrib/dev/acpica/disassembler/dmbuffer.c +++ b/sys/contrib/dev/acpica/disassembler/dmbuffer.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/disassembler/dmnames.c b/sys/contrib/dev/acpica/disassembler/dmnames.c index c095d811fbe4..f210fe017f57 100644 --- a/sys/contrib/dev/acpica/disassembler/dmnames.c +++ b/sys/contrib/dev/acpica/disassembler/dmnames.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/disassembler/dmobject.c b/sys/contrib/dev/acpica/disassembler/dmobject.c index affae381eb26..1bfeadd5f8b9 100644 --- a/sys/contrib/dev/acpica/disassembler/dmobject.c +++ b/sys/contrib/dev/acpica/disassembler/dmobject.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/disassembler/dmopcode.c b/sys/contrib/dev/acpica/disassembler/dmopcode.c index d1781a1a577c..57dfa95833e4 100644 --- a/sys/contrib/dev/acpica/disassembler/dmopcode.c +++ b/sys/contrib/dev/acpica/disassembler/dmopcode.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -473,8 +473,8 @@ AcpiDmDisassembleOneOp ( case AML_QWORD_OP: - AcpiOsPrintf ("0x%8.8X%8.8X", Op->Common.Value.Integer64.Hi, - Op->Common.Value.Integer64.Lo); + AcpiOsPrintf ("0x%8.8X%8.8X", + ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); break; diff --git a/sys/contrib/dev/acpica/disassembler/dmresrc.c b/sys/contrib/dev/acpica/disassembler/dmresrc.c index 4293c00babc9..ed3b1c105ae8 100644 --- a/sys/contrib/dev/acpica/disassembler/dmresrc.c +++ b/sys/contrib/dev/acpica/disassembler/dmresrc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/disassembler/dmresrcl.c b/sys/contrib/dev/acpica/disassembler/dmresrcl.c index 9b07e5406deb..132263b3bac5 100644 --- a/sys/contrib/dev/acpica/disassembler/dmresrcl.c +++ b/sys/contrib/dev/acpica/disassembler/dmresrcl.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/disassembler/dmresrcs.c b/sys/contrib/dev/acpica/disassembler/dmresrcs.c index 8ac99745a195..798d113d6858 100644 --- a/sys/contrib/dev/acpica/disassembler/dmresrcs.c +++ b/sys/contrib/dev/acpica/disassembler/dmresrcs.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/disassembler/dmutils.c b/sys/contrib/dev/acpica/disassembler/dmutils.c index 912c92866037..7bd0f450ee0d 100644 --- a/sys/contrib/dev/acpica/disassembler/dmutils.c +++ b/sys/contrib/dev/acpica/disassembler/dmutils.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -129,9 +129,6 @@ ACPI_MODULE_NAME ("dmutils") -ACPI_EXTERNAL_LIST *AcpiGbl_ExternalList = NULL; - - /* Data used in keeping track of fields */ #if 0 const char *AcpiGbl_FENames[] = @@ -202,121 +199,6 @@ const char *AcpiGbl_IrqDecode[] = }; -#ifdef ACPI_ASL_COMPILER -/******************************************************************************* - * - * FUNCTION: AcpiDmAddToExternalList - * - * PARAMETERS: Path - Internal (AML) path to the object - * - * RETURN: None - * - * DESCRIPTION: Insert a new path into the list of Externals which will in - * turn be emitted as an External() declaration in the disassembled - * output. - * - ******************************************************************************/ - -void -AcpiDmAddToExternalList ( - char *Path, - UINT8 Type, - UINT32 Value) -{ - char *ExternalPath; - ACPI_EXTERNAL_LIST *NewExternal; - ACPI_EXTERNAL_LIST *NextExternal; - ACPI_EXTERNAL_LIST *PrevExternal = NULL; - ACPI_STATUS Status; - - - if (!Path) - { - return; - } - - /* Externalize the ACPI path */ - - Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Path, - NULL, &ExternalPath); - if (ACPI_FAILURE (Status)) - { - return; - } - - /* Ensure that we don't have duplicate externals */ - - NextExternal = AcpiGbl_ExternalList; - while (NextExternal) - { - /* Allow upgrade of type from ANY */ - - if (!ACPI_STRCMP (ExternalPath, NextExternal->Path)) - { - /* Duplicate method, check that the Value (ArgCount) is the same */ - - if ((NextExternal->Type == ACPI_TYPE_METHOD) && - (NextExternal->Value != Value)) - { - ACPI_ERROR ((AE_INFO, "Argument count mismatch for method %s %d %d", - NextExternal->Path, NextExternal->Value, Value)); - } - if (NextExternal->Type == ACPI_TYPE_ANY) - { - NextExternal->Type = Type; - NextExternal->Value = Value; - } - ACPI_FREE (ExternalPath); - return; - } - NextExternal = NextExternal->Next; - } - - /* Allocate and init a new External() descriptor */ - - NewExternal = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_LIST)); - NewExternal->InternalPath = Path; - NewExternal->Path = ExternalPath; - NewExternal->Type = Type; - NewExternal->Value = Value; - NewExternal->Length = (UINT16) ACPI_STRLEN (ExternalPath); - - /* Link the new descriptor into the global list, ordered by string length */ - - NextExternal = AcpiGbl_ExternalList; - while (NextExternal) - { - if (NewExternal->Length <= NextExternal->Length) - { - if (PrevExternal) - { - PrevExternal->Next = NewExternal; - } - else - { - AcpiGbl_ExternalList = NewExternal; - } - - NewExternal->Next = NextExternal; - return; - } - - PrevExternal = NextExternal; - NextExternal = NextExternal->Next; - } - - if (PrevExternal) - { - PrevExternal->Next = NewExternal; - } - else - { - AcpiGbl_ExternalList = NewExternal; - } -} -#endif - - /******************************************************************************* * * FUNCTION: AcpiDmDecodeAttribute diff --git a/sys/contrib/dev/acpica/disassembler/dmwalk.c b/sys/contrib/dev/acpica/disassembler/dmwalk.c index 78745b126719..bd89ddc60470 100644 --- a/sys/contrib/dev/acpica/disassembler/dmwalk.c +++ b/sys/contrib/dev/acpica/disassembler/dmwalk.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -130,6 +130,17 @@ #define DB_FULL_OP_INFO "[%4.4s] @%5.5X #%4.4X: " +/* Stub for non-compiler code */ + +#ifndef ACPI_ASL_COMPILER +void +AcpiDmEmitExternals ( + void) +{ + return; +} +#endif + /* Local prototypes */ static ACPI_STATUS @@ -148,69 +159,6 @@ static UINT32 AcpiDmBlockType ( ACPI_PARSE_OBJECT *Op); -static const char * -AcpiDmGetObjectTypeName ( - ACPI_OBJECT_TYPE Type); - -/* - * This table maps ACPI_OBJECT_TYPEs to the corresponding ASL - * ObjectTypeKeyword. Used to generate typed external declarations - */ -static const char *AcpiGbl_DmTypeNames[] = -{ - /* 00 */ "", /* Type ANY */ - /* 01 */ ", IntObj", - /* 02 */ ", StrObj", - /* 03 */ ", BuffObj", - /* 04 */ ", PkgObj", - /* 05 */ ", FieldUnitObj", - /* 06 */ ", DeviceObj", - /* 07 */ ", EventObj", - /* 08 */ ", MethodObj", - /* 09 */ ", MutexObj", - /* 10 */ ", OpRegionObj", - /* 11 */ ", PowerResObj", - /* 12 */ ", ProcessorObj", - /* 13 */ ", ThermalZoneObj", - /* 14 */ ", BuffFieldObj", - /* 15 */ ", DDBHandleObj", - /* 16 */ "", /* Debug object */ - /* 17 */ ", FieldUnitObj", - /* 18 */ ", FieldUnitObj", - /* 19 */ ", FieldUnitObj" -}; - - -/******************************************************************************* - * - * FUNCTION: AcpiDmGetObjectTypeName - * - * PARAMETERS: Type - An ACPI_OBJECT_TYPE - * - * RETURN: Pointer to a string - * - * DESCRIPTION: Map an object type to the ASL object type string. - * - ******************************************************************************/ - -static const char * -AcpiDmGetObjectTypeName ( - ACPI_OBJECT_TYPE Type) -{ - - if (Type == ACPI_TYPE_LOCAL_SCOPE) - { - Type = ACPI_TYPE_DEVICE; - } - - else if (Type > ACPI_TYPE_LOCAL_INDEX_FIELD) - { - return (""); - } - - return (AcpiGbl_DmTypeNames[Type]); -} - /******************************************************************************* * @@ -522,7 +470,6 @@ AcpiDmDescendingOp ( const ACPI_OPCODE_INFO *OpInfo; UINT32 Name; ACPI_PARSE_OBJECT *NextOp; - ACPI_EXTERNAL_LIST *NextExternal; if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE) @@ -554,35 +501,7 @@ AcpiDmDescendingOp ( /* Emit all External() declarations here */ - if (AcpiGbl_ExternalList) - { - /* - * Walk the list of externals (unresolved references) - * found during parsing - */ - while (AcpiGbl_ExternalList) - { - AcpiOsPrintf (" External (%s%s", - AcpiGbl_ExternalList->Path, - AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type)); - - if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD) - { - AcpiOsPrintf (") // %d Arguments\n", AcpiGbl_ExternalList->Value); - } - else - { - AcpiOsPrintf (")\n"); - } - - NextExternal = AcpiGbl_ExternalList->Next; - ACPI_FREE (AcpiGbl_ExternalList->Path); - ACPI_FREE (AcpiGbl_ExternalList); - AcpiGbl_ExternalList = NextExternal; - } - AcpiOsPrintf ("\n"); - } - + AcpiDmEmitExternals (); return (AE_OK); } } diff --git a/sys/contrib/dev/acpica/dispatcher/dsfield.c b/sys/contrib/dev/acpica/dispatcher/dsfield.c index 84751168e23c..e33d6a865be8 100644 --- a/sys/contrib/dev/acpica/dispatcher/dsfield.c +++ b/sys/contrib/dev/acpica/dispatcher/dsfield.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -314,7 +314,7 @@ AcpiDsGetFieldNames ( ACPI_PARSE_OBJECT *Arg) { ACPI_STATUS Status; - ACPI_INTEGER Position; + UINT64 Position; ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info); @@ -338,8 +338,8 @@ AcpiDsGetFieldNames ( { case AML_INT_RESERVEDFIELD_OP: - Position = (ACPI_INTEGER) Info->FieldBitPosition - + (ACPI_INTEGER) Arg->Common.Value.Size; + Position = (UINT64) Info->FieldBitPosition + + (UINT64) Arg->Common.Value.Size; if (Position > ACPI_UINT32_MAX) { @@ -406,8 +406,8 @@ AcpiDsGetFieldNames ( /* Keep track of bit position for the next field */ - Position = (ACPI_INTEGER) Info->FieldBitPosition - + (ACPI_INTEGER) Arg->Common.Value.Size; + Position = (UINT64) Info->FieldBitPosition + + (UINT64) Arg->Common.Value.Size; if (Position > ACPI_UINT32_MAX) { diff --git a/sys/contrib/dev/acpica/dispatcher/dsinit.c b/sys/contrib/dev/acpica/dispatcher/dsinit.c index 54293b61e6ed..79249e4ecbcb 100644 --- a/sys/contrib/dev/acpica/dispatcher/dsinit.c +++ b/sys/contrib/dev/acpica/dispatcher/dsinit.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -283,7 +283,7 @@ AcpiDsInitializeObjects ( * the namespace reader lock. */ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, StartNode, ACPI_UINT32_MAX, - ACPI_NS_WALK_UNLOCK, AcpiDsInitOneObject, &Info, NULL); + ACPI_NS_WALK_UNLOCK, AcpiDsInitOneObject, NULL, &Info, NULL); if (ACPI_FAILURE (Status)) { ACPI_EXCEPTION ((AE_INFO, Status, "During WalkNamespace")); diff --git a/sys/contrib/dev/acpica/dispatcher/dsmethod.c b/sys/contrib/dev/acpica/dispatcher/dsmethod.c index bf32fa86e682..e54bb608c806 100644 --- a/sys/contrib/dev/acpica/dispatcher/dsmethod.c +++ b/sys/contrib/dev/acpica/dispatcher/dsmethod.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -519,7 +519,7 @@ AcpiDsCallControlMethod ( if (ObjDesc->Method.MethodFlags & AML_METHOD_INTERNAL_ONLY) { - Status = ObjDesc->Method.Implementation (NextWalkState); + Status = ObjDesc->Method.Extra.Implementation (NextWalkState); if (Status == AE_OK) { Status = AE_CTRL_TERMINATE; diff --git a/sys/contrib/dev/acpica/dispatcher/dsmthdat.c b/sys/contrib/dev/acpica/dispatcher/dsmthdat.c index 9f735388ac12..8d2342f5f7df 100644 --- a/sys/contrib/dev/acpica/dispatcher/dsmthdat.c +++ b/sys/contrib/dev/acpica/dispatcher/dsmthdat.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -524,13 +524,12 @@ AcpiDsMethodDataGetValue ( if (AcpiGbl_EnableInterpreterSlack) { - Object = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + Object = AcpiUtCreateIntegerObject ((UINT64) 0); if (!Object) { return_ACPI_STATUS (AE_NO_MEMORY); } - Object->Integer.Value = 0; Node->Object = Object; } diff --git a/sys/contrib/dev/acpica/dispatcher/dsobject.c b/sys/contrib/dev/acpica/dispatcher/dsobject.c index 342989c04b85..3e1c45e7037d 100644 --- a/sys/contrib/dev/acpica/dispatcher/dsobject.c +++ b/sys/contrib/dev/acpica/dispatcher/dsobject.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -574,7 +574,7 @@ AcpiDsBuildInternalPackageObj ( * * Note: technically, this is an error, from ACPI spec: "It is an error * for NumElements to be less than the number of elements in the - * PackageList". However, we just print an error message and + * PackageList". However, we just print a message and * no exception is returned. This provides Windows compatibility. Some * BIOSs will alter the NumElements on the fly, creating this type * of ill-formed package object. @@ -598,8 +598,8 @@ AcpiDsBuildInternalPackageObj ( Arg = Arg->Common.Next; } - ACPI_ERROR ((AE_INFO, - "Package List length (0x%X) larger than NumElements count (0x%X), truncated\n", + ACPI_INFO ((AE_INFO, + "Actual Package length (0x%X) is larger than NumElements field (0x%X), truncated\n", i, ElementCount)); } else if (i < ElementCount) @@ -787,7 +787,7 @@ AcpiDsInitObjectFromOp ( case AML_ONES_OP: - ObjDesc->Integer.Value = ACPI_INTEGER_MAX; + ObjDesc->Integer.Value = ACPI_UINT64_MAX; /* Truncate value if we are executing from a 32-bit ACPI table */ diff --git a/sys/contrib/dev/acpica/dispatcher/dsopcode.c b/sys/contrib/dev/acpica/dispatcher/dsopcode.c index f62c58149921..b1c6dc36d98a 100644 --- a/sys/contrib/dev/acpica/dispatcher/dsopcode.c +++ b/sys/contrib/dev/acpica/dispatcher/dsopcode.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/dispatcher/dsutils.c b/sys/contrib/dev/acpica/dispatcher/dsutils.c index 98f799eed96d..3710da03de26 100644 --- a/sys/contrib/dev/acpica/dispatcher/dsutils.c +++ b/sys/contrib/dev/acpica/dispatcher/dsutils.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/dispatcher/dswexec.c b/sys/contrib/dev/acpica/dispatcher/dswexec.c index 187b1b840f10..cad6f5101f90 100644 --- a/sys/contrib/dev/acpica/dispatcher/dswexec.c +++ b/sys/contrib/dev/acpica/dispatcher/dswexec.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/dispatcher/dswload.c b/sys/contrib/dev/acpica/dispatcher/dswload.c index b1c8417b33ea..7ae09319ac22 100644 --- a/sys/contrib/dev/acpica/dispatcher/dswload.c +++ b/sys/contrib/dev/acpica/dispatcher/dswload.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -263,7 +263,7 @@ AcpiDsLoad1BeginOp ( * Target of Scope() not found. Generate an External for it, and * insert the name into the namespace. */ - AcpiDmAddToExternalList (Path, ACPI_TYPE_DEVICE, 0); + AcpiDmAddToExternalList (Op, Path, ACPI_TYPE_DEVICE, 0); Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType, ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, &Node); @@ -296,18 +296,19 @@ AcpiDsLoad1BeginOp ( case ACPI_TYPE_BUFFER: /* - * These types we will allow, but we will change the type. This - * enables some existing code of the form: + * These types we will allow, but we will change the type. + * This enables some existing code of the form: * * Name (DEB, 0) * Scope (DEB) { ... } * - * Note: silently change the type here. On the second pass, we will report - * a warning + * Note: silently change the type here. On the second pass, + * we will report a warning */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)\n", - Path, AcpiUtGetTypeName (Node->Type))); + "Type override - [%4.4s] had invalid type (%s) " + "for Scope operator, changed to type ANY\n", + AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type))); Node->Type = ACPI_TYPE_ANY; WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY; @@ -318,8 +319,9 @@ AcpiDsLoad1BeginOp ( /* All other types are an error */ ACPI_ERROR ((AE_INFO, - "Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)", - AcpiUtGetTypeName (Node->Type), Path)); + "Invalid type (%s) for target of " + "Scope operator [%4.4s] (Cannot override)", + AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } @@ -732,29 +734,45 @@ AcpiDsLoad2BeginOp ( break; case AML_SCOPE_OP: - /* - * The Path is an object reference to an existing object. - * Don't enter the name into the namespace, but look it up - * for use later. - */ - Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, + + /* Special case for Scope(\) -> refers to the Root node */ + + if (Op && (Op->Named.Node == AcpiGbl_RootNode)) + { + Node = Op->Named.Node; + + Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState); + if (ACPI_FAILURE (Status)) + { + return_ACPI_STATUS (Status); + } + } + else + { + /* + * The Path is an object reference to an existing object. + * Don't enter the name into the namespace, but look it up + * for use later. + */ + Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &(Node)); - if (ACPI_FAILURE (Status)) - { + if (ACPI_FAILURE (Status)) + { #ifdef ACPI_ASL_COMPILER - if (Status == AE_NOT_FOUND) - { - Status = AE_OK; - } - else - { - ACPI_ERROR_NAMESPACE (BufferPtr, Status); - } + if (Status == AE_NOT_FOUND) + { + Status = AE_OK; + } + else + { + ACPI_ERROR_NAMESPACE (BufferPtr, Status); + } #else - ACPI_ERROR_NAMESPACE (BufferPtr, Status); + ACPI_ERROR_NAMESPACE (BufferPtr, Status); #endif - return_ACPI_STATUS (Status); + return_ACPI_STATUS (Status); + } } /* @@ -778,15 +796,16 @@ AcpiDsLoad2BeginOp ( case ACPI_TYPE_BUFFER: /* - * These types we will allow, but we will change the type. This - * enables some existing code of the form: + * These types we will allow, but we will change the type. + * This enables some existing code of the form: * * Name (DEB, 0) * Scope (DEB) { ... } */ ACPI_WARNING ((AE_INFO, - "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)", - BufferPtr, AcpiUtGetTypeName (Node->Type))); + "Type override - [%4.4s] had invalid type (%s) " + "for Scope operator, changed to type ANY\n", + AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type))); Node->Type = ACPI_TYPE_ANY; WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY; @@ -797,8 +816,9 @@ AcpiDsLoad2BeginOp ( /* All other types are an error */ ACPI_ERROR ((AE_INFO, - "Invalid type (%s) for target of Scope operator [%4.4s]", - AcpiUtGetTypeName (Node->Type), BufferPtr)); + "Invalid type (%s) for target of " + "Scope operator [%4.4s] (Cannot override)", + AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node))); return (AE_AML_OPERAND_TYPE); } @@ -1138,33 +1158,40 @@ AcpiDsLoad2EndOp ( } /* - * If we are executing a method, initialize the region + * The OpRegion is not fully parsed at this time. The only valid + * argument is the SpaceId. (We must save the address of the + * AML of the address and length operands) + * + * If we have a valid region, initialize it. The namespace is + * unlocked at this point. + * + * Need to unlock interpreter if it is locked (if we are running + * a control method), in order to allow _REG methods to be run + * during AcpiEvInitializeRegion. */ if (WalkState->MethodNode) { + /* + * Executing a method: initialize the region and unlock + * the interpreter + */ Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length, RegionSpace, WalkState); if (ACPI_FAILURE (Status)) { return (Status); } + + AcpiExExitInterpreter (); } - /* - * The OpRegion is not fully parsed at this time. Only valid - * argument is the SpaceId. (We must save the address of the - * AML of the address and length operands) - */ - - /* - * If we have a valid region, initialize it - * Namespace is NOT locked at this point. - * - * TBD: need to unlock interpreter if it is locked, in order - * to allow _REG methods to be run. - */ Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node), FALSE); + if (WalkState->MethodNode) + { + AcpiExEnterInterpreter (); + } + if (ACPI_FAILURE (Status)) { /* diff --git a/sys/contrib/dev/acpica/dispatcher/dswscope.c b/sys/contrib/dev/acpica/dispatcher/dswscope.c index f7c1a3582bde..7a36e50a9406 100644 --- a/sys/contrib/dev/acpica/dispatcher/dswscope.c +++ b/sys/contrib/dev/acpica/dispatcher/dswscope.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/dispatcher/dswstate.c b/sys/contrib/dev/acpica/dispatcher/dswstate.c index 73a0ef6540d8..19bb45b3f392 100644 --- a/sys/contrib/dev/acpica/dispatcher/dswstate.c +++ b/sys/contrib/dev/acpica/dispatcher/dswstate.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/events/evevent.c b/sys/contrib/dev/acpica/events/evevent.c index 165959a85167..2c41639433cf 100644 --- a/sys/contrib/dev/acpica/events/evevent.c +++ b/sys/contrib/dev/acpica/events/evevent.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/events/evgpe.c b/sys/contrib/dev/acpica/events/evgpe.c index 5d13aa678e05..48355689fdc1 100644 --- a/sys/contrib/dev/acpica/events/evgpe.c +++ b/sys/contrib/dev/acpica/events/evgpe.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/events/evgpeblk.c b/sys/contrib/dev/acpica/events/evgpeblk.c index 7028a2cca9ef..fe55162cae17 100644 --- a/sys/contrib/dev/acpica/events/evgpeblk.c +++ b/sys/contrib/dev/acpica/events/evgpeblk.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -1110,7 +1110,7 @@ AcpiEvCreateGpeBlock ( Status = AcpiNsWalkNamespace (ACPI_TYPE_METHOD, GpeDevice, ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK, - AcpiEvSaveMethodInfo, GpeBlock, NULL); + AcpiEvSaveMethodInfo, NULL, GpeBlock, NULL); /* Return the new block */ @@ -1192,7 +1192,7 @@ AcpiEvInitializeGpeBlock ( Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, - AcpiEvMatchPrwAndGpe, &GpeInfo, NULL); + AcpiEvMatchPrwAndGpe, NULL, &GpeInfo, NULL); } /* diff --git a/sys/contrib/dev/acpica/events/evmisc.c b/sys/contrib/dev/acpica/events/evmisc.c index b138fa0d5c4a..1ee7f9d4a786 100644 --- a/sys/contrib/dev/acpica/events/evmisc.c +++ b/sys/contrib/dev/acpica/events/evmisc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/events/evregion.c b/sys/contrib/dev/acpica/events/evregion.c index a5ffca235db4..467a846e78c9 100644 --- a/sys/contrib/dev/acpica/events/evregion.c +++ b/sys/contrib/dev/acpica/events/evregion.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -128,6 +128,11 @@ /* Local prototypes */ +static BOOLEAN +AcpiEvHasDefaultHandler ( + ACPI_NAMESPACE_NODE *Node, + ACPI_ADR_SPACE_TYPE SpaceId); + static ACPI_STATUS AcpiEvRegRun ( ACPI_HANDLE ObjHandle, @@ -231,6 +236,57 @@ UnlockAndExit: } +/******************************************************************************* + * + * FUNCTION: AcpiEvHasDefaultHandler + * + * PARAMETERS: Node - Namespace node for the device + * SpaceId - The address space ID + * + * RETURN: TRUE if default handler is installed, FALSE otherwise + * + * DESCRIPTION: Check if the default handler is installed for the requested + * space ID. + * + ******************************************************************************/ + +static BOOLEAN +AcpiEvHasDefaultHandler ( + ACPI_NAMESPACE_NODE *Node, + ACPI_ADR_SPACE_TYPE SpaceId) +{ + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_OPERAND_OBJECT *HandlerObj; + + + /* Must have an existing internal object */ + + ObjDesc = AcpiNsGetAttachedObject (Node); + if (ObjDesc) + { + HandlerObj = ObjDesc->Device.Handler; + + /* Walk the linked list of handlers for this object */ + + while (HandlerObj) + { + if (HandlerObj->AddressSpace.SpaceId == SpaceId) + { + if (HandlerObj->AddressSpace.HandlerFlags & + ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) + { + return (TRUE); + } + } + + HandlerObj = HandlerObj->AddressSpace.Next; + } + } + + return (FALSE); +} + + /******************************************************************************* * * FUNCTION: AcpiEvInitializeOpRegions @@ -266,11 +322,16 @@ AcpiEvInitializeOpRegions ( for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) { /* - * TBD: Make sure handler is the DEFAULT handler, otherwise - * _REG will have already been run. + * Make sure the installed handler is the DEFAULT handler. If not the + * default, the _REG methods will have already been run (when the + * handler was installed) */ - Status = AcpiEvExecuteRegMethods (AcpiGbl_RootNode, - AcpiGbl_DefaultAddressSpaces[i]); + if (AcpiEvHasDefaultHandler (AcpiGbl_RootNode, + AcpiGbl_DefaultAddressSpaces[i])) + { + Status = AcpiEvExecuteRegMethods (AcpiGbl_RootNode, + AcpiGbl_DefaultAddressSpaces[i]); + } } (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); @@ -339,25 +400,21 @@ AcpiEvExecuteRegMethod ( * connection status 1 for connecting the handler, 0 for disconnecting * the handler (Passed as a parameter) */ - Args[0] = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + Args[0] = AcpiUtCreateIntegerObject ((UINT64) RegionObj->Region.SpaceId); if (!Args[0]) { Status = AE_NO_MEMORY; goto Cleanup1; } - Args[1] = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + Args[1] = AcpiUtCreateIntegerObject ((UINT64) Function); if (!Args[1]) { Status = AE_NO_MEMORY; goto Cleanup2; } - /* Setup the parameter objects */ - - Args[0]->Integer.Value = RegionObj->Region.SpaceId; - Args[1]->Integer.Value = Function; - Args[2] = NULL; + Args[2] = NULL; /* Terminate list */ /* Execute the method, no return value */ @@ -385,7 +442,7 @@ Cleanup1: * RegionOffset - Where in the region to read or write * BitWidth - Field width in bits (8, 16, 32, or 64) * Value - Pointer to in or out value, must be - * full 64-bit ACPI_INTEGER + * a full 64-bit integer * * RETURN: Status * @@ -400,7 +457,7 @@ AcpiEvAddressSpaceDispatch ( UINT32 Function, UINT32 RegionOffset, UINT32 BitWidth, - ACPI_INTEGER *Value) + UINT64 *Value) { ACPI_STATUS Status; ACPI_ADR_SPACE_HANDLER Handler; @@ -788,7 +845,7 @@ AcpiEvInstallHandler ( /* Convert and validate the device handle */ - Node = AcpiNsMapHandleToNode (ObjHandle); + Node = AcpiNsValidateHandle (ObjHandle); if (!Node) { return (AE_BAD_PARAMETER); @@ -1112,7 +1169,7 @@ AcpiEvInstallSpaceHandler ( * of the branch */ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX, - ACPI_NS_WALK_UNLOCK, AcpiEvInstallHandler, + ACPI_NS_WALK_UNLOCK, AcpiEvInstallHandler, NULL, HandlerObj, NULL); UnlockAndExit: @@ -1152,7 +1209,7 @@ AcpiEvExecuteRegMethods ( * regions of this Space ID before we can run any _REG methods) */ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX, - ACPI_NS_WALK_UNLOCK, AcpiEvRegRun, + ACPI_NS_WALK_UNLOCK, AcpiEvRegRun, NULL, &SpaceId, NULL); return_ACPI_STATUS (Status); @@ -1186,7 +1243,7 @@ AcpiEvRegRun ( /* Convert and validate the device handle */ - Node = AcpiNsMapHandleToNode (ObjHandle); + Node = AcpiNsValidateHandle (ObjHandle); if (!Node) { return (AE_BAD_PARAMETER); diff --git a/sys/contrib/dev/acpica/events/evrgnini.c b/sys/contrib/dev/acpica/events/evrgnini.c index adc9d7a52243..e2b0bcfdfa73 100644 --- a/sys/contrib/dev/acpica/events/evrgnini.c +++ b/sys/contrib/dev/acpica/events/evrgnini.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -260,7 +260,7 @@ AcpiEvPciConfigRegionSetup ( void **RegionContext) { ACPI_STATUS Status = AE_OK; - ACPI_INTEGER PciValue; + UINT64 PciValue; ACPI_PCI_ID *PciId = *RegionContext; ACPI_OPERAND_OBJECT *HandlerObj; ACPI_NAMESPACE_NODE *ParentNode; @@ -716,6 +716,20 @@ AcpiEvInitializeRegion ( HandlerObj = ObjDesc->ThermalZone.Handler; break; + case ACPI_TYPE_METHOD: + /* + * If we are executing module level code, the original + * Node's object was replaced by this Method object and we + * saved the handler in the method object. + * + * See AcpiNsExecModuleCode + */ + if (ObjDesc->Method.Flags & AOPOBJ_MODULE_LEVEL) + { + HandlerObj = ObjDesc->Method.Extra.Handler; + } + break; + default: /* Ignore other objects */ break; diff --git a/sys/contrib/dev/acpica/events/evsci.c b/sys/contrib/dev/acpica/events/evsci.c index 49639efd61b6..c358a48ffa3c 100644 --- a/sys/contrib/dev/acpica/events/evsci.c +++ b/sys/contrib/dev/acpica/events/evsci.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/events/evxface.c b/sys/contrib/dev/acpica/events/evxface.c index 5ecf4a76feac..abffad6536e5 100644 --- a/sys/contrib/dev/acpica/events/evxface.c +++ b/sys/contrib/dev/acpica/events/evxface.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -368,7 +368,7 @@ AcpiInstallNotifyHandler ( /* Convert and validate the device handle */ - Node = AcpiNsMapHandleToNode (Device); + Node = AcpiNsValidateHandle (Device); if (!Node) { Status = AE_BAD_PARAMETER; @@ -555,7 +555,7 @@ AcpiRemoveNotifyHandler ( /* Convert and validate the device handle */ - Node = AcpiNsMapHandleToNode (Device); + Node = AcpiNsValidateHandle (Device); if (!Node) { Status = AE_BAD_PARAMETER; diff --git a/sys/contrib/dev/acpica/events/evxfevnt.c b/sys/contrib/dev/acpica/events/evxfevnt.c index a583dacdac0e..92b6d4d69db7 100644 --- a/sys/contrib/dev/acpica/events/evxfevnt.c +++ b/sys/contrib/dev/acpica/events/evxfevnt.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -805,7 +805,7 @@ AcpiInstallGpeBlock ( return (Status); } - Node = AcpiNsMapHandleToNode (GpeDevice); + Node = AcpiNsValidateHandle (GpeDevice); if (!Node) { Status = AE_BAD_PARAMETER; @@ -905,7 +905,7 @@ AcpiRemoveGpeBlock ( return (Status); } - Node = AcpiNsMapHandleToNode (GpeDevice); + Node = AcpiNsValidateHandle (GpeDevice); if (!Node) { Status = AE_BAD_PARAMETER; diff --git a/sys/contrib/dev/acpica/events/evxfregn.c b/sys/contrib/dev/acpica/events/evxfregn.c index 8ec140241f2d..d06c6f73db7c 100644 --- a/sys/contrib/dev/acpica/events/evxfregn.c +++ b/sys/contrib/dev/acpica/events/evxfregn.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -171,7 +171,7 @@ AcpiInstallAddressSpaceHandler ( /* Convert and validate the device handle */ - Node = AcpiNsMapHandleToNode (Device); + Node = AcpiNsValidateHandle (Device); if (!Node) { Status = AE_BAD_PARAMETER; @@ -244,7 +244,7 @@ AcpiRemoveAddressSpaceHandler ( /* Convert and validate the device handle */ - Node = AcpiNsMapHandleToNode (Device); + Node = AcpiNsValidateHandle (Device); if (!Node || ((Node->Type != ACPI_TYPE_DEVICE) && (Node->Type != ACPI_TYPE_PROCESSOR) && diff --git a/sys/contrib/dev/acpica/executer/exconfig.c b/sys/contrib/dev/acpica/executer/exconfig.c index ace13d743dc0..95b78eda3b84 100644 --- a/sys/contrib/dev/acpica/executer/exconfig.c +++ b/sys/contrib/dev/acpica/executer/exconfig.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -263,15 +263,13 @@ AcpiExLoadTableOp ( /* Table not found, return an Integer=0 and AE_OK */ - DdbHandle = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + DdbHandle = AcpiUtCreateIntegerObject ((UINT64) 0); if (!DdbHandle) { return_ACPI_STATUS (AE_NO_MEMORY); } - DdbHandle->Integer.Value = 0; *ReturnDesc = DdbHandle; - return_ACPI_STATUS (AE_OK); } @@ -389,7 +387,7 @@ AcpiExRegionRead ( UINT8 *Buffer) { ACPI_STATUS Status; - ACPI_INTEGER Value; + UINT64 Value; UINT32 RegionOffset = 0; UINT32 i; @@ -612,7 +610,10 @@ AcpiExLoadOp ( Status = AcpiTbAddTable (&TableDesc, &TableIndex); if (ACPI_FAILURE (Status)) { - goto Cleanup; + /* Delete allocated table buffer */ + + AcpiTbDeleteTable (&TableDesc); + return_ACPI_STATUS (Status); } /* @@ -655,13 +656,6 @@ AcpiExLoadOp ( AcpiGbl_TableHandlerContext); } -Cleanup: - if (ACPI_FAILURE (Status)) - { - /* Delete allocated table buffer */ - - AcpiTbDeleteTable (&TableDesc); - } return_ACPI_STATUS (Status); } diff --git a/sys/contrib/dev/acpica/executer/exconvrt.c b/sys/contrib/dev/acpica/executer/exconvrt.c index b69157695c98..a67122c12d4e 100644 --- a/sys/contrib/dev/acpica/executer/exconvrt.c +++ b/sys/contrib/dev/acpica/executer/exconvrt.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -129,7 +129,7 @@ static UINT32 AcpiExConvertToAscii ( - ACPI_INTEGER Integer, + UINT64 Integer, UINT16 Base, UINT8 *String, UINT8 MaxLength); @@ -158,7 +158,7 @@ AcpiExConvertToInteger ( { ACPI_OPERAND_OBJECT *ReturnDesc; UINT8 *Pointer; - ACPI_INTEGER Result; + UINT64 Result; UINT32 i; UINT32 Count; ACPI_STATUS Status; @@ -247,7 +247,7 @@ AcpiExConvertToInteger ( * Little endian is used, meaning that the first byte of the buffer * is the LSB of the integer */ - Result |= (((ACPI_INTEGER) Pointer[i]) << (i * 8)); + Result |= (((UINT64) Pointer[i]) << (i * 8)); } break; @@ -260,7 +260,7 @@ AcpiExConvertToInteger ( /* Create a new integer */ - ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ReturnDesc = AcpiUtCreateIntegerObject (Result); if (!ReturnDesc) { return_ACPI_STATUS (AE_NO_MEMORY); @@ -271,7 +271,6 @@ AcpiExConvertToInteger ( /* Save the Result */ - ReturnDesc->Integer.Value = Result; AcpiExTruncateFor32bitTable (ReturnDesc); *ResultDesc = ReturnDesc; return_ACPI_STATUS (AE_OK); @@ -390,12 +389,12 @@ AcpiExConvertToBuffer ( static UINT32 AcpiExConvertToAscii ( - ACPI_INTEGER Integer, + UINT64 Integer, UINT16 Base, UINT8 *String, UINT8 DataWidth) { - ACPI_INTEGER Digit; + UINT64 Digit; UINT32 i; UINT32 j; UINT32 k = 0; @@ -660,7 +659,7 @@ AcpiExConvertToString ( for (i = 0; i < ObjDesc->Buffer.Length; i++) { NewBuf += AcpiExConvertToAscii ( - (ACPI_INTEGER) ObjDesc->Buffer.Pointer[i], Base, + (UINT64) ObjDesc->Buffer.Pointer[i], Base, NewBuf, 1); *NewBuf++ = Separator; /* each separated by a comma or space */ } diff --git a/sys/contrib/dev/acpica/executer/excreate.c b/sys/contrib/dev/acpica/executer/excreate.c index 1466fdbb12d3..f6c2700e0d00 100644 --- a/sys/contrib/dev/acpica/executer/excreate.c +++ b/sys/contrib/dev/acpica/executer/excreate.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exdump.c b/sys/contrib/dev/acpica/executer/exdump.c index 655a49986387..870eb07253f8 100644 --- a/sys/contrib/dev/acpica/executer/exdump.c +++ b/sys/contrib/dev/acpica/executer/exdump.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exfield.c b/sys/contrib/dev/acpica/executer/exfield.c index 0b3065cd263d..0e06eefa74db 100644 --- a/sys/contrib/dev/acpica/executer/exfield.c +++ b/sys/contrib/dev/acpica/executer/exfield.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -217,7 +217,7 @@ AcpiExReadDataFromField ( /* Call the region handler for the read */ Status = AcpiExAccessRegion (ObjDesc, 0, - ACPI_CAST_PTR (ACPI_INTEGER, BufferDesc->Buffer.Pointer), + ACPI_CAST_PTR (UINT64, BufferDesc->Buffer.Pointer), Function); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); goto Exit; @@ -226,7 +226,7 @@ AcpiExReadDataFromField ( /* * Allocate a buffer for the contents of the field. * - * If the field is larger than the size of an ACPI_INTEGER, create + * If the field is larger than the current integer width, create * a BUFFER to hold it. Otherwise, use an INTEGER. This allows * the use of arithmetic operators on the returned value if the * field size is equal or smaller than an Integer. @@ -249,14 +249,13 @@ AcpiExReadDataFromField ( { /* Field will fit within an Integer (normal case) */ - BufferDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + BufferDesc = AcpiUtCreateIntegerObject ((UINT64) 0); if (!BufferDesc) { return_ACPI_STATUS (AE_NO_MEMORY); } Length = AcpiGbl_IntegerByteWidth; - BufferDesc->Integer.Value = 0; Buffer = &BufferDesc->Integer.Value; } @@ -409,7 +408,7 @@ AcpiExWriteDataToField ( * same buffer) */ Status = AcpiExAccessRegion (ObjDesc, 0, - (ACPI_INTEGER *) Buffer, Function); + (UINT64 *) Buffer, Function); AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags); *ResultDesc = BufferDesc; diff --git a/sys/contrib/dev/acpica/executer/exfldio.c b/sys/contrib/dev/acpica/executer/exfldio.c index bcb3ddb2b016..8fbc9920adba 100644 --- a/sys/contrib/dev/acpica/executer/exfldio.c +++ b/sys/contrib/dev/acpica/executer/exfldio.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -133,13 +133,13 @@ static ACPI_STATUS AcpiExFieldDatumIo ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 FieldDatumByteOffset, - ACPI_INTEGER *Value, + UINT64 *Value, UINT32 ReadWrite); static BOOLEAN AcpiExRegisterOverflow ( ACPI_OPERAND_OBJECT *ObjDesc, - ACPI_INTEGER Value); + UINT64 Value); static ACPI_STATUS AcpiExSetupRegion ( @@ -296,7 +296,7 @@ AcpiExSetupRegion ( * FieldDatumByteOffset - Byte offset of this datum within the * parent field * Value - Where to store value (must at least - * the size of ACPI_INTEGER) + * 64 bits) * Function - Read or Write flag plus other region- * dependent flags * @@ -310,7 +310,7 @@ ACPI_STATUS AcpiExAccessRegion ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 FieldDatumByteOffset, - ACPI_INTEGER *Value, + UINT64 *Value, UINT32 Function) { ACPI_STATUS Status; @@ -408,7 +408,7 @@ AcpiExAccessRegion ( static BOOLEAN AcpiExRegisterOverflow ( ACPI_OPERAND_OBJECT *ObjDesc, - ACPI_INTEGER Value) + UINT64 Value) { if (ObjDesc->CommonField.BitLength >= ACPI_INTEGER_BIT_SIZE) @@ -420,7 +420,7 @@ AcpiExRegisterOverflow ( return (FALSE); } - if (Value >= ((ACPI_INTEGER) 1 << ObjDesc->CommonField.BitLength)) + if (Value >= ((UINT64) 1 << ObjDesc->CommonField.BitLength)) { /* * The Value is larger than the maximum value that can fit into @@ -457,11 +457,11 @@ static ACPI_STATUS AcpiExFieldDatumIo ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 FieldDatumByteOffset, - ACPI_INTEGER *Value, + UINT64 *Value, UINT32 ReadWrite) { ACPI_STATUS Status; - ACPI_INTEGER LocalValue; + UINT64 LocalValue; ACPI_FUNCTION_TRACE_U32 (ExFieldDatumIo, FieldDatumByteOffset); @@ -543,7 +543,7 @@ AcpiExFieldDatumIo ( * the register */ if (AcpiExRegisterOverflow (ObjDesc->BankField.BankObj, - (ACPI_INTEGER) ObjDesc->BankField.Value)) + (UINT64) ObjDesc->BankField.Value)) { return_ACPI_STATUS (AE_AML_REGISTER_LIMIT); } @@ -586,7 +586,7 @@ AcpiExFieldDatumIo ( * the register */ if (AcpiExRegisterOverflow (ObjDesc->IndexField.IndexObj, - (ACPI_INTEGER) ObjDesc->IndexField.Value)) + (UINT64) ObjDesc->IndexField.Value)) { return_ACPI_STATUS (AE_AML_REGISTER_LIMIT); } @@ -615,7 +615,7 @@ AcpiExFieldDatumIo ( "Read from Data Register\n")); Status = AcpiExExtractFromField (ObjDesc->IndexField.DataObj, - Value, sizeof (ACPI_INTEGER)); + Value, sizeof (UINT64)); } else { @@ -626,7 +626,7 @@ AcpiExFieldDatumIo ( ACPI_FORMAT_UINT64 (*Value))); Status = AcpiExInsertIntoField (ObjDesc->IndexField.DataObj, - Value, sizeof (ACPI_INTEGER)); + Value, sizeof (UINT64)); } break; @@ -679,13 +679,13 @@ AcpiExFieldDatumIo ( ACPI_STATUS AcpiExWriteWithUpdateRule ( ACPI_OPERAND_OBJECT *ObjDesc, - ACPI_INTEGER Mask, - ACPI_INTEGER FieldValue, + UINT64 Mask, + UINT64 FieldValue, UINT32 FieldDatumByteOffset) { ACPI_STATUS Status = AE_OK; - ACPI_INTEGER MergedValue; - ACPI_INTEGER CurrentValue; + UINT64 MergedValue; + UINT64 CurrentValue; ACPI_FUNCTION_TRACE_U32 (ExWriteWithUpdateRule, Mask); @@ -697,7 +697,7 @@ AcpiExWriteWithUpdateRule ( /* If the mask is all ones, we don't need to worry about the update rule */ - if (Mask != ACPI_INTEGER_MAX) + if (Mask != ACPI_UINT64_MAX) { /* Decode the update rule */ @@ -787,8 +787,8 @@ AcpiExExtractFromField ( UINT32 BufferLength) { ACPI_STATUS Status; - ACPI_INTEGER RawDatum; - ACPI_INTEGER MergedDatum; + UINT64 RawDatum; + UINT64 MergedDatum; UINT32 FieldOffset = 0; UINT32 BufferOffset = 0; UINT32 BufferTailBits; @@ -917,10 +917,10 @@ AcpiExInsertIntoField ( UINT32 BufferLength) { ACPI_STATUS Status; - ACPI_INTEGER Mask; - ACPI_INTEGER WidthMask; - ACPI_INTEGER MergedDatum; - ACPI_INTEGER RawDatum = 0; + UINT64 Mask; + UINT64 WidthMask; + UINT64 MergedDatum; + UINT64 RawDatum = 0; UINT32 FieldOffset = 0; UINT32 BufferOffset = 0; UINT32 BufferTailBits; @@ -972,7 +972,7 @@ AcpiExInsertIntoField ( */ if (ObjDesc->CommonField.AccessBitWidth == ACPI_INTEGER_BIT_SIZE) { - WidthMask = ACPI_INTEGER_MAX; + WidthMask = ACPI_UINT64_MAX; } else { diff --git a/sys/contrib/dev/acpica/executer/exmisc.c b/sys/contrib/dev/acpica/executer/exmisc.c index 18699ee7072d..a639afb285c0 100644 --- a/sys/contrib/dev/acpica/executer/exmisc.c +++ b/sys/contrib/dev/acpica/executer/exmisc.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -508,11 +508,11 @@ Cleanup: * ******************************************************************************/ -ACPI_INTEGER +UINT64 AcpiExDoMathOp ( UINT16 Opcode, - ACPI_INTEGER Integer0, - ACPI_INTEGER Integer1) + UINT64 Integer0, + UINT64 Integer1) { ACPI_FUNCTION_ENTRY (); @@ -615,8 +615,8 @@ AcpiExDoMathOp ( ACPI_STATUS AcpiExDoLogicalNumericOp ( UINT16 Opcode, - ACPI_INTEGER Integer0, - ACPI_INTEGER Integer1, + UINT64 Integer0, + UINT64 Integer1, BOOLEAN *LogicalResult) { ACPI_STATUS Status = AE_OK; @@ -690,8 +690,8 @@ AcpiExDoLogicalOp ( BOOLEAN *LogicalResult) { ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1; - ACPI_INTEGER Integer0; - ACPI_INTEGER Integer1; + UINT64 Integer0; + UINT64 Integer1; UINT32 Length0; UINT32 Length1; ACPI_STATUS Status = AE_OK; diff --git a/sys/contrib/dev/acpica/executer/exmutex.c b/sys/contrib/dev/acpica/executer/exmutex.c index 286fceb8ae03..0bd66b35623b 100644 --- a/sys/contrib/dev/acpica/executer/exmutex.c +++ b/sys/contrib/dev/acpica/executer/exmutex.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -490,6 +490,15 @@ AcpiExReleaseMutex ( return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED); } + /* Must have a valid thread ID */ + + if (!WalkState->Thread) + { + ACPI_ERROR ((AE_INFO, "Cannot release Mutex [%4.4s], null thread info", + AcpiUtGetNodeName (ObjDesc->Mutex.Node))); + return_ACPI_STATUS (AE_AML_INTERNAL); + } + /* * The Mutex is owned, but this thread must be the owner. * Special case for Global Lock, any thread can release @@ -505,15 +514,6 @@ AcpiExReleaseMutex ( return_ACPI_STATUS (AE_AML_NOT_OWNER); } - /* Must have a valid thread ID */ - - if (!WalkState->Thread) - { - ACPI_ERROR ((AE_INFO, "Cannot release Mutex [%4.4s], null thread info", - AcpiUtGetNodeName (ObjDesc->Mutex.Node))); - return_ACPI_STATUS (AE_AML_INTERNAL); - } - /* * The sync level of the mutex must be equal to the current sync level. In * other words, the current level means that at least one mutex at that diff --git a/sys/contrib/dev/acpica/executer/exnames.c b/sys/contrib/dev/acpica/executer/exnames.c index d83ca5970096..7134c62d6a48 100644 --- a/sys/contrib/dev/acpica/executer/exnames.c +++ b/sys/contrib/dev/acpica/executer/exnames.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exoparg1.c b/sys/contrib/dev/acpica/executer/exoparg1.c index dd4767f236ba..dff76c61b522 100644 --- a/sys/contrib/dev/acpica/executer/exoparg1.c +++ b/sys/contrib/dev/acpica/executer/exoparg1.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -183,13 +183,12 @@ AcpiExOpcode_0A_0T_1R ( /* Create a return object of type Integer */ - ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ReturnDesc = AcpiUtCreateIntegerObject (AcpiOsGetTimer ()); if (!ReturnDesc) { Status = AE_NO_MEMORY; goto Cleanup; } - ReturnDesc->Integer.Value = AcpiOsGetTimer (); break; default: /* Unknown opcode */ @@ -369,8 +368,8 @@ AcpiExOpcode_1A_1T_1R ( ACPI_OPERAND_OBJECT *ReturnDesc2 = NULL; UINT32 Temp32; UINT32 i; - ACPI_INTEGER PowerOfTen; - ACPI_INTEGER Digit; + UINT64 PowerOfTen; + UINT64 Digit; ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_1T_1R, @@ -478,7 +477,7 @@ AcpiExOpcode_1A_1T_1R ( /* Sum the digit into the result with the current power of 10 */ ReturnDesc->Integer.Value += - (((ACPI_INTEGER) Temp32) * PowerOfTen); + (((UINT64) Temp32) * PowerOfTen); /* Shift to next BCD digit */ @@ -507,7 +506,7 @@ AcpiExOpcode_1A_1T_1R ( * remainder from above */ ReturnDesc->Integer.Value |= - (((ACPI_INTEGER) Temp32) << ACPI_MUL_4 (i)); + (((UINT64) Temp32) << ACPI_MUL_4 (i)); } /* Overflow if there is any data left in Digit */ @@ -554,7 +553,7 @@ AcpiExOpcode_1A_1T_1R ( /* The object exists in the namespace, return TRUE */ - ReturnDesc->Integer.Value = ACPI_INTEGER_MAX; + ReturnDesc->Integer.Value = ACPI_UINT64_MAX; goto Cleanup; @@ -720,7 +719,7 @@ AcpiExOpcode_1A_0T_1R ( ACPI_OPERAND_OBJECT *ReturnDesc = NULL; ACPI_STATUS Status = AE_OK; UINT32 Type; - ACPI_INTEGER Value; + UINT64 Value; ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_1R, @@ -733,7 +732,7 @@ AcpiExOpcode_1A_0T_1R ( { case AML_LNOT_OP: /* LNot (Operand) */ - ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ReturnDesc = AcpiUtCreateIntegerObject ((UINT64) 0); if (!ReturnDesc) { Status = AE_NO_MEMORY; @@ -746,7 +745,7 @@ AcpiExOpcode_1A_0T_1R ( */ if (!Operand[0]->Integer.Value) { - ReturnDesc->Integer.Value = ACPI_INTEGER_MAX; + ReturnDesc->Integer.Value = ACPI_UINT64_MAX; } break; @@ -838,14 +837,12 @@ AcpiExOpcode_1A_0T_1R ( /* Allocate a descriptor to hold the type. */ - ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ReturnDesc = AcpiUtCreateIntegerObject ((UINT64) Type); if (!ReturnDesc) { Status = AE_NO_MEMORY; goto Cleanup; } - - ReturnDesc->Integer.Value = Type; break; @@ -917,14 +914,12 @@ AcpiExOpcode_1A_0T_1R ( * Now that we have the size of the object, create a result * object to hold the value */ - ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ReturnDesc = AcpiUtCreateIntegerObject (Value); if (!ReturnDesc) { Status = AE_NO_MEMORY; goto Cleanup; } - - ReturnDesc->Integer.Value = Value; break; @@ -1089,21 +1084,18 @@ AcpiExOpcode_1A_0T_1R ( * NOTE: index into a buffer is NOT a pointer to a * sub-buffer of the main buffer, it is only a pointer to a * single element (byte) of the buffer! + * + * Since we are returning the value of the buffer at the + * indexed location, we don't need to add an additional + * reference to the buffer itself. */ - ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ReturnDesc = AcpiUtCreateIntegerObject ((UINT64) + TempDesc->Buffer.Pointer[Operand[0]->Reference.Value]); if (!ReturnDesc) { Status = AE_NO_MEMORY; goto Cleanup; } - - /* - * Since we are returning the value of the buffer at the - * indexed location, we don't need to add an additional - * reference to the buffer itself. - */ - ReturnDesc->Integer.Value = - TempDesc->Buffer.Pointer[Operand[0]->Reference.Value]; break; diff --git a/sys/contrib/dev/acpica/executer/exoparg2.c b/sys/contrib/dev/acpica/executer/exoparg2.c index 899388b7c36a..b6e8478f22f2 100644 --- a/sys/contrib/dev/acpica/executer/exoparg2.c +++ b/sys/contrib/dev/acpica/executer/exoparg2.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -383,7 +383,7 @@ AcpiExOpcode_2A_1T_1R ( { ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0]; ACPI_OPERAND_OBJECT *ReturnDesc = NULL; - ACPI_INTEGER Index; + UINT64 Index; ACPI_STATUS Status = AE_OK; ACPI_SIZE Length; @@ -716,7 +716,7 @@ StoreLogicalResult: */ if (LogicalResult) { - ReturnDesc->Integer.Value = ACPI_INTEGER_MAX; + ReturnDesc->Integer.Value = ACPI_UINT64_MAX; } Cleanup: diff --git a/sys/contrib/dev/acpica/executer/exoparg3.c b/sys/contrib/dev/acpica/executer/exoparg3.c index 75ffcf66ca0e..c94a26d272f9 100644 --- a/sys/contrib/dev/acpica/executer/exoparg3.c +++ b/sys/contrib/dev/acpica/executer/exoparg3.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -239,7 +239,7 @@ AcpiExOpcode_3A_1T_1R ( ACPI_OPERAND_OBJECT *ReturnDesc = NULL; char *Buffer = NULL; ACPI_STATUS Status = AE_OK; - ACPI_INTEGER Index; + UINT64 Index; ACPI_SIZE Length; diff --git a/sys/contrib/dev/acpica/executer/exoparg6.c b/sys/contrib/dev/acpica/executer/exoparg6.c index 5284ea6234c6..d13e9f6117a7 100644 --- a/sys/contrib/dev/acpica/executer/exoparg6.c +++ b/sys/contrib/dev/acpica/executer/exoparg6.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -305,7 +305,7 @@ AcpiExOpcode_6A_0T_1R ( ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0]; ACPI_OPERAND_OBJECT *ReturnDesc = NULL; ACPI_STATUS Status = AE_OK; - ACPI_INTEGER Index; + UINT64 Index; ACPI_OPERAND_OBJECT *ThisElement; @@ -344,8 +344,9 @@ AcpiExOpcode_6A_0T_1R ( } /* Create an integer for the return value */ + /* Default return value is ACPI_UINT64_MAX if no match found */ - ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + ReturnDesc = AcpiUtCreateIntegerObject (ACPI_UINT64_MAX); if (!ReturnDesc) { Status = AE_NO_MEMORY; @@ -353,10 +354,6 @@ AcpiExOpcode_6A_0T_1R ( } - /* Default return value if no match found */ - - ReturnDesc->Integer.Value = ACPI_INTEGER_MAX; - /* * Examine each element until a match is found. Both match conditions * must be satisfied for a match to occur. Within the loop, @@ -365,7 +362,7 @@ AcpiExOpcode_6A_0T_1R ( * * Upon finding a match, the loop will terminate via "break" at * the bottom. If it terminates "normally", MatchValue will be - * ACPI_INTEGER_MAX (Ones) (its initial value) indicating that no + * ACPI_UINT64_MAX (Ones) (its initial value) indicating that no * match was found. */ for ( ; Index < Operand[0]->Package.Count; Index++) diff --git a/sys/contrib/dev/acpica/executer/exprep.c b/sys/contrib/dev/acpica/executer/exprep.c index 067d1bbaccc5..b60e09cc15b7 100644 --- a/sys/contrib/dev/acpica/executer/exprep.c +++ b/sys/contrib/dev/acpica/executer/exprep.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exregion.c b/sys/contrib/dev/acpica/executer/exregion.c index 73447ddf08e8..3969c584bb0c 100644 --- a/sys/contrib/dev/acpica/executer/exregion.c +++ b/sys/contrib/dev/acpica/executer/exregion.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -149,7 +149,7 @@ AcpiExSystemMemorySpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext) { @@ -157,7 +157,8 @@ AcpiExSystemMemorySpaceHandler ( void *LogicalAddrPtr = NULL; ACPI_MEM_SPACE_CONTEXT *MemInfo = RegionContext; UINT32 Length; - ACPI_SIZE WindowSize; + ACPI_SIZE MapLength; + ACPI_SIZE PageBoundaryMapLength; #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED UINT32 Remainder; #endif @@ -197,7 +198,7 @@ AcpiExSystemMemorySpaceHandler ( * Hardware does not support non-aligned data transfers, we must verify * the request. */ - (void) AcpiUtShortDivide ((ACPI_INTEGER) Address, Length, NULL, &Remainder); + (void) AcpiUtShortDivide ((UINT64) Address, Length, NULL, &Remainder); if (Remainder != 0) { return_ACPI_STATUS (AE_AML_ALIGNMENT); @@ -210,8 +211,8 @@ AcpiExSystemMemorySpaceHandler ( * 2) Address beyond the current mapping? */ if ((Address < MemInfo->MappedPhysicalAddress) || - (((ACPI_INTEGER) Address + Length) > - ((ACPI_INTEGER) + (((UINT64) Address + Length) > + ((UINT64) MemInfo->MappedPhysicalAddress + MemInfo->MappedLength))) { /* @@ -227,26 +228,45 @@ AcpiExSystemMemorySpaceHandler ( } /* - * Don't attempt to map memory beyond the end of the region, and - * constrain the maximum mapping size to something reasonable. + * October 2009: Attempt to map from the requested address to the + * end of the region. However, we will never map more than one + * page, nor will we cross a page boundary. */ - WindowSize = (ACPI_SIZE) + MapLength = (ACPI_SIZE) ((MemInfo->Address + MemInfo->Length) - Address); - if (WindowSize > ACPI_SYSMEM_REGION_WINDOW_SIZE) + /* + * If mapping the entire remaining portion of the region will cross + * a page boundary, just map up to the page boundary, do not cross. + * On some systems, crossing a page boundary while mapping regions + * can cause warnings if the pages have different attributes + * due to resource management. + * + * This has the added benefit of constraining a single mapping to + * one page, which is similar to the original code that used a 4k + * maximum window. + */ + PageBoundaryMapLength = + ACPI_ROUND_UP (Address, ACPI_DEFAULT_PAGE_SIZE) - Address; + if (PageBoundaryMapLength == 0) { - WindowSize = ACPI_SYSMEM_REGION_WINDOW_SIZE; + PageBoundaryMapLength = ACPI_DEFAULT_PAGE_SIZE; + } + + if (MapLength > PageBoundaryMapLength) + { + MapLength = PageBoundaryMapLength; } /* Create a new mapping starting at the address given */ MemInfo->MappedLogicalAddress = AcpiOsMapMemory ( - (ACPI_PHYSICAL_ADDRESS) Address, WindowSize); + (ACPI_PHYSICAL_ADDRESS) Address, MapLength); if (!MemInfo->MappedLogicalAddress) { ACPI_ERROR ((AE_INFO, "Could not map memory at %8.8X%8.8X, size %X", - ACPI_FORMAT_NATIVE_UINT (Address), (UINT32) WindowSize)); + ACPI_FORMAT_NATIVE_UINT (Address), (UINT32) MapLength)); MemInfo->MappedLength = 0; return_ACPI_STATUS (AE_NO_MEMORY); } @@ -254,7 +274,7 @@ AcpiExSystemMemorySpaceHandler ( /* Save the physical address and mapping size */ MemInfo->MappedPhysicalAddress = Address; - MemInfo->MappedLength = WindowSize; + MemInfo->MappedLength = MapLength; } /* @@ -262,7 +282,7 @@ AcpiExSystemMemorySpaceHandler ( * access */ LogicalAddrPtr = MemInfo->MappedLogicalAddress + - ((ACPI_INTEGER) Address - (ACPI_INTEGER) MemInfo->MappedPhysicalAddress); + ((UINT64) Address - (UINT64) MemInfo->MappedPhysicalAddress); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "System-Memory (width %d) R/W %d Address=%8.8X%8.8X\n", @@ -284,19 +304,19 @@ AcpiExSystemMemorySpaceHandler ( switch (BitWidth) { case 8: - *Value = (ACPI_INTEGER) ACPI_GET8 (LogicalAddrPtr); + *Value = (UINT64) ACPI_GET8 (LogicalAddrPtr); break; case 16: - *Value = (ACPI_INTEGER) ACPI_GET16 (LogicalAddrPtr); + *Value = (UINT64) ACPI_GET16 (LogicalAddrPtr); break; case 32: - *Value = (ACPI_INTEGER) ACPI_GET32 (LogicalAddrPtr); + *Value = (UINT64) ACPI_GET32 (LogicalAddrPtr); break; case 64: - *Value = (ACPI_INTEGER) ACPI_GET64 (LogicalAddrPtr); + *Value = (UINT64) ACPI_GET64 (LogicalAddrPtr); break; default: @@ -363,7 +383,7 @@ AcpiExSystemIoSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext) { @@ -427,7 +447,7 @@ AcpiExPciConfigSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext) { @@ -507,7 +527,7 @@ AcpiExCmosSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext) { @@ -544,7 +564,7 @@ AcpiExPciBarSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext) { @@ -581,7 +601,7 @@ AcpiExDataTableSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext) { diff --git a/sys/contrib/dev/acpica/executer/exresnte.c b/sys/contrib/dev/acpica/executer/exresnte.c index 1265d1a56aed..9a45afde9009 100644 --- a/sys/contrib/dev/acpica/executer/exresnte.c +++ b/sys/contrib/dev/acpica/executer/exresnte.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exresolv.c b/sys/contrib/dev/acpica/executer/exresolv.c index df8c8021ca39..e587bd1d4938 100644 --- a/sys/contrib/dev/acpica/executer/exresolv.c +++ b/sys/contrib/dev/acpica/executer/exresolv.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exresop.c b/sys/contrib/dev/acpica/executer/exresop.c index 72ca085e6720..22dd558b7d1d 100644 --- a/sys/contrib/dev/acpica/executer/exresop.c +++ b/sys/contrib/dev/acpica/executer/exresop.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exstore.c b/sys/contrib/dev/acpica/executer/exstore.c index a4fd02d7fba1..ff9b940e5bc6 100644 --- a/sys/contrib/dev/acpica/executer/exstore.c +++ b/sys/contrib/dev/acpica/executer/exstore.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exstoren.c b/sys/contrib/dev/acpica/executer/exstoren.c index c70c0acf92d1..4df2a40a35b6 100644 --- a/sys/contrib/dev/acpica/executer/exstoren.c +++ b/sys/contrib/dev/acpica/executer/exstoren.c @@ -10,7 +10,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exstorob.c b/sys/contrib/dev/acpica/executer/exstorob.c index f9baa9c42712..3c67aa612fb5 100644 --- a/sys/contrib/dev/acpica/executer/exstorob.c +++ b/sys/contrib/dev/acpica/executer/exstorob.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/executer/exsystem.c b/sys/contrib/dev/acpica/executer/exsystem.c index 8ef0d0daf9fa..c9f746acb364 100644 --- a/sys/contrib/dev/acpica/executer/exsystem.c +++ b/sys/contrib/dev/acpica/executer/exsystem.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -293,7 +293,7 @@ AcpiExSystemDoStall ( ACPI_STATUS AcpiExSystemDoSuspend ( - ACPI_INTEGER HowLong) + UINT64 HowLong) { ACPI_FUNCTION_ENTRY (); diff --git a/sys/contrib/dev/acpica/executer/exutils.c b/sys/contrib/dev/acpica/executer/exutils.c index 23e39c52613e..d90d6ea69ac0 100644 --- a/sys/contrib/dev/acpica/executer/exutils.c +++ b/sys/contrib/dev/acpica/executer/exutils.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -144,7 +144,7 @@ static UINT32 AcpiExDigitsNeeded ( - ACPI_INTEGER Value, + UINT64 Value, UINT32 Base); @@ -334,7 +334,7 @@ AcpiExTruncateFor32bitTable ( * We are running a method that exists in a 32-bit ACPI table. * Truncate the value to 32 bits by zeroing out the upper 32-bit field */ - ObjDesc->Integer.Value &= (ACPI_INTEGER) ACPI_UINT32_MAX; + ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX; } } @@ -446,17 +446,17 @@ AcpiExReleaseGlobalLock ( static UINT32 AcpiExDigitsNeeded ( - ACPI_INTEGER Value, + UINT64 Value, UINT32 Base) { UINT32 NumDigits; - ACPI_INTEGER CurrentValue; + UINT64 CurrentValue; ACPI_FUNCTION_TRACE (ExDigitsNeeded); - /* ACPI_INTEGER is unsigned, so we don't worry about a '-' prefix */ + /* UINT64 is unsigned, so we don't worry about a '-' prefix */ if (Value == 0) { @@ -497,7 +497,7 @@ AcpiExDigitsNeeded ( void AcpiExEisaIdToString ( char *OutString, - ACPI_INTEGER CompressedId) + UINT64 CompressedId) { UINT32 SwappedId; @@ -523,10 +523,10 @@ AcpiExEisaIdToString ( OutString[0] = (char) (0x40 + (((unsigned long) SwappedId >> 26) & 0x1F)); OutString[1] = (char) (0x40 + ((SwappedId >> 21) & 0x1F)); OutString[2] = (char) (0x40 + ((SwappedId >> 16) & 0x1F)); - OutString[3] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) SwappedId, 12); - OutString[4] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) SwappedId, 8); - OutString[5] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) SwappedId, 4); - OutString[6] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) SwappedId, 0); + OutString[3] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 12); + OutString[4] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 8); + OutString[5] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 4); + OutString[6] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 0); OutString[7] = 0; } @@ -551,7 +551,7 @@ AcpiExEisaIdToString ( void AcpiExIntegerToString ( char *OutString, - ACPI_INTEGER Value) + UINT64 Value) { UINT32 Count; UINT32 DigitsNeeded; diff --git a/sys/contrib/dev/acpica/hardware/hwacpi.c b/sys/contrib/dev/acpica/hardware/hwacpi.c index 2f30774593a3..9d7b89821b79 100644 --- a/sys/contrib/dev/acpica/hardware/hwacpi.c +++ b/sys/contrib/dev/acpica/hardware/hwacpi.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/hardware/hwgpe.c b/sys/contrib/dev/acpica/hardware/hwgpe.c index c1d4470ab77f..5b02856d699d 100644 --- a/sys/contrib/dev/acpica/hardware/hwgpe.c +++ b/sys/contrib/dev/acpica/hardware/hwgpe.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -320,7 +320,7 @@ AcpiHwGetGpeStatus ( Status = AcpiHwRead (&InByte, &GpeRegisterInfo->StatusAddress); if (ACPI_FAILURE (Status)) { - goto UnlockAndExit; + return (Status); } if (RegisterBit & InByte) @@ -331,10 +331,7 @@ AcpiHwGetGpeStatus ( /* Set return value */ (*EventStatus) = LocalEventStatus; - - -UnlockAndExit: - return (Status); + return (AE_OK); } diff --git a/sys/contrib/dev/acpica/hardware/hwregs.c b/sys/contrib/dev/acpica/hardware/hwregs.c index 39be6367f5f3..26ee46299f43 100644 --- a/sys/contrib/dev/acpica/hardware/hwregs.c +++ b/sys/contrib/dev/acpica/hardware/hwregs.c @@ -10,7 +10,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/hardware/hwsleep.c b/sys/contrib/dev/acpica/hardware/hwsleep.c index f6fc986ebb9e..7026c69a025a 100644 --- a/sys/contrib/dev/acpica/hardware/hwsleep.c +++ b/sys/contrib/dev/acpica/hardware/hwsleep.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/hardware/hwtimer.c b/sys/contrib/dev/acpica/hardware/hwtimer.c index b5f6794409af..b9b60318469a 100644 --- a/sys/contrib/dev/acpica/hardware/hwtimer.c +++ b/sys/contrib/dev/acpica/hardware/hwtimer.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -232,7 +232,7 @@ AcpiGetTimerDuration ( { ACPI_STATUS Status; UINT32 DeltaTicks; - ACPI_INTEGER Quotient; + UINT64 Quotient; ACPI_FUNCTION_TRACE (AcpiGetTimerDuration); diff --git a/sys/contrib/dev/acpica/hardware/hwvalid.c b/sys/contrib/dev/acpica/hardware/hwvalid.c index 395c995c69ae..8c369b18bc22 100644 --- a/sys/contrib/dev/acpica/hardware/hwvalid.c +++ b/sys/contrib/dev/acpica/hardware/hwvalid.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/hardware/hwxface.c b/sys/contrib/dev/acpica/hardware/hwxface.c index 85ed01188f3b..e7815ccf69e8 100644 --- a/sys/contrib/dev/acpica/hardware/hwxface.c +++ b/sys/contrib/dev/acpica/hardware/hwxface.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acapps.h b/sys/contrib/dev/acpica/include/acapps.h index e1f31b791b7d..418e20fb0840 100644 --- a/sys/contrib/dev/acpica/include/acapps.h +++ b/sys/contrib/dev/acpica/include/acapps.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -124,21 +124,21 @@ #define FILE_SUFFIX_DISASSEMBLY "dsl" #define ACPI_TABLE_FILE_SUFFIX ".dat" -extern UINT8 *DsdtPtr; -extern UINT32 AcpiDsdtLength; -extern UINT8 *AmlStart; -extern UINT32 AmlLength; - - -extern int AcpiGbl_Optind; -extern char *AcpiGbl_Optarg; +/* + * getopt + */ int AcpiGetopt( int argc, char **argv, char *opts); +extern int AcpiGbl_Optind; +extern int AcpiGbl_Opterr; +extern char *AcpiGbl_Optarg; + + /* * adisasm */ @@ -151,7 +151,8 @@ AdAmlDisassemble ( BOOLEAN GetAllTables); void -AdPrintStatistics (void); +AdPrintStatistics ( + void); ACPI_STATUS AdFindDsdt( @@ -159,7 +160,8 @@ AdFindDsdt( UINT32 *DsdtLength); void -AdDumpTables (void); +AdDumpTables ( + void); ACPI_STATUS AdGetLocalTables ( @@ -179,7 +181,9 @@ AdDisplayTables ( ACPI_TABLE_HEADER *Table); ACPI_STATUS -AdDisplayStatistics (void); +AdDisplayStatistics ( + void); + /* * adwalk @@ -209,6 +213,7 @@ AcpiDmConvertResourceIndexes ( ACPI_PARSE_OBJECT *ParseTreeRoot, ACPI_NAMESPACE_NODE *NamespaceRoot); + /* * adfile */ @@ -227,11 +232,6 @@ FlSplitInputPathname ( char **OutDirectoryPath, char **OutFilename); -char * -FlGenerateFilename ( - char *InputFilename, - char *Suffix); - char * AdGenerateFilename ( char *Prefix, diff --git a/sys/contrib/dev/acpica/include/accommon.h b/sys/contrib/dev/acpica/include/accommon.h index 98331d6da0a5..5853e6f7c93b 100644 --- a/sys/contrib/dev/acpica/include/accommon.h +++ b/sys/contrib/dev/acpica/include/accommon.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acconfig.h b/sys/contrib/dev/acpica/include/acconfig.h index 1fcc45a364a8..9417b449dc70 100644 --- a/sys/contrib/dev/acpica/include/acconfig.h +++ b/sys/contrib/dev/acpica/include/acconfig.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -177,9 +177,9 @@ #define ACPI_MAX_REFERENCE_COUNT 0x800 -/* Size of cached memory mapping for system memory operation region */ +/* Default page size for use in mapping memory for operation regions */ -#define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096 +#define ACPI_DEFAULT_PAGE_SIZE 4096 /* Must be power of 2 */ /* OwnerId tracking. 8 entries allows for 255 OwnerIds */ diff --git a/sys/contrib/dev/acpica/include/acdebug.h b/sys/contrib/dev/acpica/include/acdebug.h index dedaa649eae1..2be2fd409b92 100644 --- a/sys/contrib/dev/acpica/include/acdebug.h +++ b/sys/contrib/dev/acpica/include/acdebug.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -126,13 +126,19 @@ typedef struct CommandInfo } COMMAND_INFO; - typedef struct ArgumentInfo { char *Name; /* Argument Name */ } ARGUMENT_INFO; +typedef struct acpi_execute_walk +{ + UINT32 Count; + UINT32 MaxCount; + +} ACPI_EXECUTE_WALK; + #define PARAM_LIST(pl) pl #define DBTEST_OUTPUT_LEVEL(lvl) if (AcpiGbl_DbOpt_verbose) @@ -265,7 +271,7 @@ AcpiDbCheckPredefinedNames ( void AcpiDbBatchExecute ( - void); + char *CountArg); /* * dbdisply - debug display commands diff --git a/sys/contrib/dev/acpica/include/acdisasm.h b/sys/contrib/dev/acpica/include/acdisasm.h index 0ffddb5534d2..6c61f84f38bf 100644 --- a/sys/contrib/dev/acpica/include/acdisasm.h +++ b/sys/contrib/dev/acpica/include/acdisasm.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -125,18 +125,6 @@ #define BLOCK_COMMA_LIST 4 #define ACPI_DEFAULT_RESNAME *(UINT32 *) "__RD" -typedef struct acpi_external_list -{ - char *Path; - char *InternalPath; - struct acpi_external_list *Next; - UINT32 Value; - UINT16 Length; - UINT8 Type; - -} ACPI_EXTERNAL_LIST; - -extern ACPI_EXTERNAL_LIST *AcpiGbl_ExternalList; typedef const struct acpi_dmtable_info { @@ -475,14 +463,6 @@ void AcpiDmMatchOp ( ACPI_PARSE_OBJECT *Op); -BOOLEAN -AcpiDmCommaIfListMember ( - ACPI_PARSE_OBJECT *Op); - -void -AcpiDmCommaIfFieldMember ( - ACPI_PARSE_OBJECT *Op); - /* * dmnames @@ -555,6 +535,33 @@ AcpiDmIsStringBuffer ( ACPI_PARSE_OBJECT *Op); +/* + * dmextern + */ +void +AcpiDmAddToExternalList ( + ACPI_PARSE_OBJECT *Op, + char *Path, + UINT8 Type, + UINT32 Value); + +void +AcpiDmAddExternalsToNamespace ( + void); + +UINT32 +AcpiDmGetExternalMethodCount ( + void); + +void +AcpiDmClearExternalList ( + void); + +void +AcpiDmEmitExternals ( + void); + + /* * dmresrc */ @@ -589,18 +596,10 @@ ACPI_STATUS AcpiDmIsResourceTemplate ( ACPI_PARSE_OBJECT *Op); -void -AcpiDmIndent ( - UINT32 Level); - void AcpiDmBitList ( UINT16 Mask); -void -AcpiDmDecodeAttribute ( - UINT8 Attribute); - void AcpiDmDescriptorName ( void); @@ -727,10 +726,21 @@ AcpiDmVendorSmallDescriptor ( * dmutils */ void -AcpiDmAddToExternalList ( - char *Path, - UINT8 Type, - UINT32 Value); +AcpiDmDecodeAttribute ( + UINT8 Attribute); + +void +AcpiDmIndent ( + UINT32 Level); + +BOOLEAN +AcpiDmCommaIfListMember ( + ACPI_PARSE_OBJECT *Op); + +void +AcpiDmCommaIfFieldMember ( + ACPI_PARSE_OBJECT *Op); + /* * dmrestag diff --git a/sys/contrib/dev/acpica/include/acdispat.h b/sys/contrib/dev/acpica/include/acdispat.h index 2aa86232b2f0..d7af8003df2b 100644 --- a/sys/contrib/dev/acpica/include/acdispat.h +++ b/sys/contrib/dev/acpica/include/acdispat.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acevents.h b/sys/contrib/dev/acpica/include/acevents.h index 0cd5e2e28696..567ac1ec0e13 100644 --- a/sys/contrib/dev/acpica/include/acevents.h +++ b/sys/contrib/dev/acpica/include/acevents.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -265,7 +265,7 @@ AcpiEvAddressSpaceDispatch ( UINT32 Function, UINT32 RegionOffset, UINT32 BitWidth, - ACPI_INTEGER *Value); + UINT64 *Value); ACPI_STATUS AcpiEvAttachRegion ( diff --git a/sys/contrib/dev/acpica/include/acexcep.h b/sys/contrib/dev/acpica/include/acexcep.h index dfe2e2ee7342..89fe5c66898f 100644 --- a/sys/contrib/dev/acpica/include/acexcep.h +++ b/sys/contrib/dev/acpica/include/acexcep.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acglobal.h b/sys/contrib/dev/acpica/include/acglobal.h index 42b0d82c9a47..4469ee334e3b 100644 --- a/sys/contrib/dev/acpica/include/acglobal.h +++ b/sys/contrib/dev/acpica/include/acglobal.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -446,6 +446,7 @@ ACPI_EXTERN UINT8 AcpiGbl_DbOutputFlags; ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_disasm; ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_verbose; +ACPI_EXTERN ACPI_EXTERNAL_LIST *AcpiGbl_ExternalList; #endif diff --git a/sys/contrib/dev/acpica/include/achware.h b/sys/contrib/dev/acpica/include/achware.h index c171a5fc1df8..be0b4df327d8 100644 --- a/sys/contrib/dev/acpica/include/achware.h +++ b/sys/contrib/dev/acpica/include/achware.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acinterp.h b/sys/contrib/dev/acpica/include/acinterp.h index 74c5f0b4ebae..de7dbf8030eb 100644 --- a/sys/contrib/dev/acpica/include/acinterp.h +++ b/sys/contrib/dev/acpica/include/acinterp.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -214,13 +214,13 @@ AcpiExCommonBufferSetup ( ACPI_STATUS AcpiExWriteWithUpdateRule ( ACPI_OPERAND_OBJECT *ObjDesc, - ACPI_INTEGER Mask, - ACPI_INTEGER FieldValue, + UINT64 Mask, + UINT64 FieldValue, UINT32 FieldDatumByteOffset); void AcpiExGetBufferDatum( - ACPI_INTEGER *Datum, + UINT64 *Datum, void *Buffer, UINT32 BufferLength, UINT32 ByteGranularity, @@ -228,7 +228,7 @@ AcpiExGetBufferDatum( void AcpiExSetBufferDatum ( - ACPI_INTEGER MergedDatum, + UINT64 MergedDatum, void *Buffer, UINT32 BufferLength, UINT32 ByteGranularity, @@ -266,7 +266,7 @@ ACPI_STATUS AcpiExAccessRegion ( ACPI_OPERAND_OBJECT *ObjDesc, UINT32 FieldDatumByteOffset, - ACPI_INTEGER *Value, + UINT64 *Value, UINT32 ReadWrite); @@ -296,8 +296,8 @@ AcpiExDoConcatenate ( ACPI_STATUS AcpiExDoLogicalNumericOp ( UINT16 Opcode, - ACPI_INTEGER Integer0, - ACPI_INTEGER Integer1, + UINT64 Integer0, + UINT64 Integer1, BOOLEAN *LogicalResult); ACPI_STATUS @@ -307,11 +307,11 @@ AcpiExDoLogicalOp ( ACPI_OPERAND_OBJECT *Operand1, BOOLEAN *LogicalResult); -ACPI_INTEGER +UINT64 AcpiExDoMathOp ( UINT16 Opcode, - ACPI_INTEGER Operand0, - ACPI_INTEGER Operand1); + UINT64 Operand0, + UINT64 Operand1); ACPI_STATUS AcpiExCreateMutex ( @@ -425,7 +425,7 @@ AcpiExSystemDoNotifyOp ( ACPI_STATUS AcpiExSystemDoSuspend( - ACPI_INTEGER Time); + UINT64 Time); ACPI_STATUS AcpiExSystemDoStall ( @@ -697,12 +697,12 @@ AcpiExReleaseGlobalLock ( void AcpiExEisaIdToString ( char *Dest, - ACPI_INTEGER CompressedId); + UINT64 CompressedId); void AcpiExIntegerToString ( char *Dest, - ACPI_INTEGER Value); + UINT64 Value); /* @@ -713,7 +713,7 @@ AcpiExSystemMemorySpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -722,7 +722,7 @@ AcpiExSystemIoSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -731,7 +731,7 @@ AcpiExPciConfigSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -740,7 +740,7 @@ AcpiExCmosSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -749,7 +749,7 @@ AcpiExPciBarSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -758,7 +758,7 @@ AcpiExEmbeddedControllerSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -767,7 +767,7 @@ AcpiExSmBusSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -777,7 +777,7 @@ AcpiExDataTableSpaceHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); diff --git a/sys/contrib/dev/acpica/include/aclocal.h b/sys/contrib/dev/acpica/include/aclocal.h index b8ea4f14325a..0aeacff6c525 100644 --- a/sys/contrib/dev/acpica/include/aclocal.h +++ b/sys/contrib/dev/acpica/include/aclocal.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -500,6 +500,7 @@ typedef struct acpi_predefined_data { char *Pathname; const ACPI_PREDEFINED_INFO *Predefined; + union acpi_operand_object *ParentPackage; UINT32 Flags; UINT8 NodeFlags; @@ -852,8 +853,7 @@ typedef struct acpi_opcode_info typedef union acpi_parse_value { - ACPI_INTEGER Integer; /* Integer constant (Up to 64 bits) */ - UINT64_STRUCT Integer64; /* Structure overlay for 2 32-bit Dwords */ + UINT64 Integer; /* Integer constant (Up to 64 bits) */ UINT32 Size; /* bytelist or field size */ char *String; /* NULL terminated string */ UINT8 *Buffer; /* buffer or string */ @@ -1216,6 +1216,29 @@ typedef struct acpi_port_info #define ACPI_ASCII_ZERO 0x30 +/***************************************************************************** + * + * Disassembler + * + ****************************************************************************/ + +typedef struct acpi_external_list +{ + char *Path; + char *InternalPath; + struct acpi_external_list *Next; + UINT32 Value; + UINT16 Length; + UINT8 Type; + UINT8 Flags; + +} ACPI_EXTERNAL_LIST; + +/* Values for Flags field above */ + +#define ACPI_IPATH_ALLOCATED 0x01 + + /***************************************************************************** * * Debugger diff --git a/sys/contrib/dev/acpica/include/acmacros.h b/sys/contrib/dev/acpica/include/acmacros.h index 28c934deb996..e9a6f42cbf21 100644 --- a/sys/contrib/dev/acpica/include/acmacros.h +++ b/sys/contrib/dev/acpica/include/acmacros.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -335,8 +335,8 @@ * MASK_BITS_ABOVE creates a mask starting AT the position and above * MASK_BITS_BELOW creates a mask starting one bit BELOW the position */ -#define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_INTEGER_MAX) << ((UINT32) (position)))) -#define ACPI_MASK_BITS_BELOW(position) ((ACPI_INTEGER_MAX) << ((UINT32) (position))) +#define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_UINT64_MAX) << ((UINT32) (position)))) +#define ACPI_MASK_BITS_BELOW(position) ((ACPI_UINT64_MAX) << ((UINT32) (position))) /* Bitfields within ACPI registers */ @@ -403,6 +403,7 @@ #define ACPI_ERROR_NAMESPACE(s, e) AcpiNsReportError (AE_INFO, s, e); #define ACPI_ERROR_METHOD(s, n, p, e) AcpiNsReportMethodError (AE_INFO, s, n, p, e); #define ACPI_WARN_PREDEFINED(plist) AcpiUtPredefinedWarning plist +#define ACPI_INFO_PREDEFINED(plist) AcpiUtPredefinedInfo plist #else @@ -411,6 +412,7 @@ #define ACPI_ERROR_NAMESPACE(s, e) #define ACPI_ERROR_METHOD(s, n, p, e) #define ACPI_WARN_PREDEFINED(plist) +#define ACPI_INFO_PREDEFINED(plist) #endif /* ACPI_NO_ERROR_MESSAGES */ @@ -471,16 +473,16 @@ AcpiUtPtrExit (ACPI_DEBUG_PARAMETERS, (UINT8 *) _s); \ return (_s); }) #define return_VALUE(s) ACPI_DO_WHILE0 ({ \ - register ACPI_INTEGER _s = (s); \ + register UINT64 _s = (s); \ AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, _s); \ return (_s); }) #define return_UINT8(s) ACPI_DO_WHILE0 ({ \ register UINT8 _s = (UINT8) (s); \ - AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (ACPI_INTEGER) _s); \ + AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (UINT64) _s); \ return (_s); }) #define return_UINT32(s) ACPI_DO_WHILE0 ({ \ register UINT32 _s = (UINT32) (s); \ - AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (ACPI_INTEGER) _s); \ + AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (UINT64) _s); \ return (_s); }) #else /* Use original less-safe macros */ @@ -491,7 +493,7 @@ AcpiUtPtrExit (ACPI_DEBUG_PARAMETERS, (UINT8 *) (s)); \ return((s)); }) #define return_VALUE(s) ACPI_DO_WHILE0 ({ \ - AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (ACPI_INTEGER) (s)); \ + AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (UINT64) (s)); \ return((s)); }) #define return_UINT8(s) return_VALUE(s) #define return_UINT32(s) return_VALUE(s) diff --git a/sys/contrib/dev/acpica/include/acnames.h b/sys/contrib/dev/acpica/include/acnames.h index eb9944aa16e5..12dd89ce14d3 100644 --- a/sys/contrib/dev/acpica/include/acnames.h +++ b/sys/contrib/dev/acpica/include/acnames.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acnamesp.h b/sys/contrib/dev/acpica/include/acnamesp.h index ce0ba2aa08f1..9ddd12e210bc 100644 --- a/sys/contrib/dev/acpica/include/acnamesp.h +++ b/sys/contrib/dev/acpica/include/acnamesp.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -189,7 +189,8 @@ AcpiNsWalkNamespace ( ACPI_HANDLE StartObject, UINT32 MaxDepth, UINT32 Flags, - ACPI_WALK_CALLBACK UserFunction, + ACPI_WALK_CALLBACK PreOrderVisit, + ACPI_WALK_CALLBACK PostOrderVisit, void *Context, void **ReturnValue); @@ -428,7 +429,8 @@ AcpiNsGetAttachedData ( /* - * nsrepair - return object repair for predefined methods/objects + * nsrepair - General return object repair for all + * predefined methods/objects */ ACPI_STATUS AcpiNsRepairObject ( @@ -442,6 +444,31 @@ AcpiNsRepairPackageList ( ACPI_PREDEFINED_DATA *Data, ACPI_OPERAND_OBJECT **ObjDescPtr); +ACPI_STATUS +AcpiNsRepairNullElement ( + ACPI_PREDEFINED_DATA *Data, + UINT32 ExpectedBtypes, + UINT32 PackageIndex, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +void +AcpiNsRemoveNullElements ( + ACPI_PREDEFINED_DATA *Data, + UINT8 PackageType, + ACPI_OPERAND_OBJECT *ObjDesc); + + +/* + * nsrepair2 - Return object repair for specific + * predefined methods/objects + */ +ACPI_STATUS +AcpiNsComplexRepairs ( + ACPI_PREDEFINED_DATA *Data, + ACPI_NAMESPACE_NODE *Node, + ACPI_STATUS ValidateStatus, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + /* * nssearch - Namespace searching and entry @@ -528,13 +555,9 @@ AcpiNsExternalizeName ( char **ConvertedName); ACPI_NAMESPACE_NODE * -AcpiNsMapHandleToNode ( +AcpiNsValidateHandle ( ACPI_HANDLE Handle); -ACPI_HANDLE -AcpiNsConvertEntryToHandle( - ACPI_NAMESPACE_NODE *Node); - void AcpiNsTerminate ( void); diff --git a/sys/contrib/dev/acpica/include/acobject.h b/sys/contrib/dev/acpica/include/acobject.h index 5a33fdcf7b97..f86f8392679f 100644 --- a/sys/contrib/dev/acpica/include/acobject.h +++ b/sys/contrib/dev/acpica/include/acobject.h @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -190,7 +190,7 @@ typedef struct acpi_object_integer { ACPI_OBJECT_COMMON_HEADER UINT8 Fill[3]; /* Prevent warning on some compilers */ - ACPI_INTEGER Value; + UINT64 Value; } ACPI_OBJECT_INTEGER; @@ -288,7 +288,12 @@ typedef struct acpi_object_method UINT8 SyncLevel; union acpi_operand_object *Mutex; UINT8 *AmlStart; - ACPI_INTERNAL_METHOD Implementation; + union + { + ACPI_INTERNAL_METHOD Implementation; + union acpi_operand_object *Handler; + } Extra; + UINT32 AmlLength; UINT8 ThreadCount; ACPI_OWNER_ID OwnerId; diff --git a/sys/contrib/dev/acpica/include/acopcode.h b/sys/contrib/dev/acpica/include/acopcode.h index bb309c78d3fe..94d585d2273c 100644 --- a/sys/contrib/dev/acpica/include/acopcode.h +++ b/sys/contrib/dev/acpica/include/acopcode.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acoutput.h b/sys/contrib/dev/acpica/include/acoutput.h index 2b796b541a61..8018fed53842 100644 --- a/sys/contrib/dev/acpica/include/acoutput.h +++ b/sys/contrib/dev/acpica/include/acoutput.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -158,7 +158,8 @@ #define ACPI_LV_INIT 0x00000001 #define ACPI_LV_DEBUG_OBJECT 0x00000002 #define ACPI_LV_INFO 0x00000004 -#define ACPI_LV_ALL_EXCEPTIONS 0x00000007 +#define ACPI_LV_REPAIR 0x00000008 +#define ACPI_LV_ALL_EXCEPTIONS 0x0000000F /* Trace verbosity level 1 [Standard Trace Level] */ @@ -217,6 +218,7 @@ #define ACPI_DB_INIT ACPI_DEBUG_LEVEL (ACPI_LV_INIT) #define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT) #define ACPI_DB_INFO ACPI_DEBUG_LEVEL (ACPI_LV_INFO) +#define ACPI_DB_REPAIR ACPI_DEBUG_LEVEL (ACPI_LV_REPAIR) #define ACPI_DB_ALL_EXCEPTIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS) /* Trace level -- also used in the global "DebugLevel" */ @@ -248,8 +250,8 @@ /* Defaults for DebugLevel, debug and normal */ -#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT) -#define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT) +#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR) +#define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR) #define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL) diff --git a/sys/contrib/dev/acpica/include/acparser.h b/sys/contrib/dev/acpica/include/acparser.h index 086688e3224d..35fe0060f1a2 100644 --- a/sys/contrib/dev/acpica/include/acparser.h +++ b/sys/contrib/dev/acpica/include/acparser.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acpi.h b/sys/contrib/dev/acpica/include/acpi.h index 0d82345917c4..d462294325fe 100644 --- a/sys/contrib/dev/acpica/include/acpi.h +++ b/sys/contrib/dev/acpica/include/acpi.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acpiosxf.h b/sys/contrib/dev/acpica/include/acpiosxf.h index b10d12b48031..13570b4f1737 100644 --- a/sys/contrib/dev/acpica/include/acpiosxf.h +++ b/sys/contrib/dev/acpica/include/acpiosxf.h @@ -12,7 +12,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -346,7 +346,7 @@ AcpiOsWaitEventsComplete ( void AcpiOsSleep ( - ACPI_INTEGER Milliseconds); + UINT64 Milliseconds); void AcpiOsStall ( @@ -401,7 +401,7 @@ ACPI_STATUS AcpiOsWritePciConfiguration ( ACPI_PCI_ID *PciId, UINT32 Reg, - ACPI_INTEGER Value, + UINT64 Value, UINT32 Width); diff --git a/sys/contrib/dev/acpica/include/acpixf.h b/sys/contrib/dev/acpica/include/acpixf.h index 4a177280a08a..7111984df6a5 100644 --- a/sys/contrib/dev/acpica/include/acpixf.h +++ b/sys/contrib/dev/acpica/include/acpixf.h @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -120,7 +120,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20090903 +#define ACPI_CA_VERSION 0x20100121 #include #include @@ -267,7 +267,8 @@ AcpiWalkNamespace ( ACPI_OBJECT_TYPE Type, ACPI_HANDLE StartObject, UINT32 MaxDepth, - ACPI_WALK_CALLBACK UserFunction, + ACPI_WALK_CALLBACK PreOrderVisit, + ACPI_WALK_CALLBACK PostOrderVisit, void *Context, void **ReturnValue); diff --git a/sys/contrib/dev/acpica/include/acpredef.h b/sys/contrib/dev/acpica/include/acpredef.h index 2be401520b3d..9b881fb8007a 100644 --- a/sys/contrib/dev/acpica/include/acpredef.h +++ b/sys/contrib/dev/acpica/include/acpredef.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acresrc.h b/sys/contrib/dev/acpica/include/acresrc.h index 9e3698adb256..ed5926163d56 100644 --- a/sys/contrib/dev/acpica/include/acresrc.h +++ b/sys/contrib/dev/acpica/include/acresrc.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/acrestyp.h b/sys/contrib/dev/acpica/include/acrestyp.h index 7eb7600d9822..0a85d29f5a48 100644 --- a/sys/contrib/dev/acpica/include/acrestyp.h +++ b/sys/contrib/dev/acpica/include/acrestyp.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -534,7 +534,7 @@ typedef struct acpi_pci_routing_table { UINT32 Length; UINT32 Pin; - ACPI_INTEGER Address; /* here for 64-bit alignment */ + UINT64 Address; /* here for 64-bit alignment */ UINT32 SourceIndex; char Source[4]; /* pad to 64 bits so sizeof() works in all cases */ diff --git a/sys/contrib/dev/acpica/include/acstruct.h b/sys/contrib/dev/acpica/include/acstruct.h index 45c85fe0b2f1..d4696b83005d 100644 --- a/sys/contrib/dev/acpica/include/acstruct.h +++ b/sys/contrib/dev/acpica/include/acstruct.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/actables.h b/sys/contrib/dev/acpica/include/actables.h index e4428e641550..54fdaae9b1a7 100644 --- a/sys/contrib/dev/acpica/include/actables.h +++ b/sys/contrib/dev/acpica/include/actables.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/actbl.h b/sys/contrib/dev/acpica/include/actbl.h index bd6331e700f7..05775a87873d 100644 --- a/sys/contrib/dev/acpica/include/actbl.h +++ b/sys/contrib/dev/acpica/include/actbl.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/actbl1.h b/sys/contrib/dev/acpica/include/actbl1.h index 8af7a1838086..ac11a3fe6b3e 100644 --- a/sys/contrib/dev/acpica/include/actbl1.h +++ b/sys/contrib/dev/acpica/include/actbl1.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/actbl2.h b/sys/contrib/dev/acpica/include/actbl2.h index e57c02356cc9..c96715d3c05e 100644 --- a/sys/contrib/dev/acpica/include/actbl2.h +++ b/sys/contrib/dev/acpica/include/actbl2.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/actypes.h b/sys/contrib/dev/acpica/include/actypes.h index 0e01b97bbe06..8d0d06ad62ce 100644 --- a/sys/contrib/dev/acpica/include/actypes.h +++ b/sys/contrib/dev/acpica/include/actypes.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -470,22 +470,7 @@ typedef union uint64_overlay } UINT64_OVERLAY; -typedef struct uint32_struct -{ - UINT32 Lo; - UINT32 Hi; -} UINT32_STRUCT; - - -/* - * Acpi integer width. In ACPI version 1, integers are 32 bits. In ACPI - * version 2, integers are 64 bits. Note that this pertains to the ACPI integer - * type only, not other integers used in the implementation of the ACPI CA - * subsystem. - */ -typedef UINT64 ACPI_INTEGER; -#define ACPI_INTEGER_MAX ACPI_UINT64_MAX #define ACPI_INTEGER_BIT_SIZE 64 #define ACPI_MAX_DECIMAL_DIGITS 20 /* 2^64 = 18,446,744,073,709,551,616 */ #define ACPI_MAX64_DECIMAL_DIGITS 20 @@ -500,6 +485,19 @@ typedef UINT64 ACPI_INTEGER; #define ACPI_WAIT_FOREVER 0xFFFF /* UINT16, as per ACPI spec */ #define ACPI_DO_NOT_WAIT 0 +/* + * Obsolete: Acpi integer width. In ACPI version 1 (1996), integers are 32 bits. + * In ACPI version 2 (2000) and later, integers are 64 bits. Note that this + * pertains to the ACPI integer type only, not to other integers used in the + * implementation of the ACPICA subsystem. + * + * 01/2010: This type is obsolete and has been removed from the entire ACPICA + * code base. It remains here for compatibility with device drivers that use + * the type. However, it will be removed in the future. + */ +typedef UINT64 ACPI_INTEGER; +#define ACPI_INTEGER_MAX ACPI_UINT64_MAX + /******************************************************************************* * @@ -890,7 +888,7 @@ typedef union acpi_object struct { ACPI_OBJECT_TYPE Type; /* ACPI_TYPE_INTEGER */ - ACPI_INTEGER Value; /* The actual number */ + UINT64 Value; /* The actual number */ } Integer; struct @@ -1094,7 +1092,7 @@ ACPI_STATUS (*ACPI_ADR_SPACE_HANDLER) ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); @@ -1164,7 +1162,7 @@ typedef struct acpi_device_info UINT8 HighestDstates[4]; /* _SxD values: 0xFF indicates not valid */ UINT8 LowestDstates[5]; /* _SxW values: 0xFF indicates not valid */ UINT32 CurrentStatus; /* _STA value */ - ACPI_INTEGER Address; /* _ADR value */ + UINT64 Address; /* _ADR value */ ACPI_DEVICE_ID HardwareId; /* _HID value */ ACPI_DEVICE_ID UniqueId; /* _UID value */ ACPI_DEVICE_ID_LIST CompatibleIdList; /* _CID list */ diff --git a/sys/contrib/dev/acpica/include/acutils.h b/sys/contrib/dev/acpica/include/acutils.h index 33d33c2f4787..ae406c3882a0 100644 --- a/sys/contrib/dev/acpica/include/acutils.h +++ b/sys/contrib/dev/acpica/include/acutils.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -235,7 +235,7 @@ AcpiUtGetEventName ( char AcpiUtHexToAsciiChar ( - ACPI_INTEGER Integer, + UINT64 Integer, UINT32 Position); BOOLEAN @@ -470,7 +470,7 @@ AcpiUtValueExit ( const char *FunctionName, const char *ModuleName, UINT32 ComponentId, - ACPI_INTEGER Value); + UINT64 Value); void AcpiUtPtrExit ( @@ -550,7 +550,7 @@ ACPI_STATUS AcpiUtEvaluateNumericObject ( char *ObjectName, ACPI_NAMESPACE_NODE *DeviceNode, - ACPI_INTEGER *Value); + UINT64 *Value); ACPI_STATUS AcpiUtExecute_STA ( @@ -643,6 +643,10 @@ ACPI_OPERAND_OBJECT * AcpiUtCreatePackageObject ( UINT32 Count); +ACPI_OPERAND_OBJECT * +AcpiUtCreateIntegerObject ( + UINT64 Value); + ACPI_OPERAND_OBJECT * AcpiUtCreateBufferObject ( ACPI_SIZE BufferSize); @@ -716,16 +720,16 @@ AcpiUtDeleteGenericState ( */ ACPI_STATUS AcpiUtDivide ( - ACPI_INTEGER InDividend, - ACPI_INTEGER InDivisor, - ACPI_INTEGER *OutQuotient, - ACPI_INTEGER *OutRemainder); + UINT64 InDividend, + UINT64 InDivisor, + UINT64 *OutQuotient, + UINT64 *OutRemainder); ACPI_STATUS AcpiUtShortDivide ( - ACPI_INTEGER InDividend, + UINT64 InDividend, UINT32 Divisor, - ACPI_INTEGER *OutQuotient, + UINT64 *OutQuotient, UINT32 *OutRemainder); /* @@ -784,7 +788,7 @@ ACPI_STATUS AcpiUtStrtoul64 ( char *String, UINT32 Base, - ACPI_INTEGER *RetInteger); + UINT64 *RetInteger); void ACPI_INTERNAL_VAR_XFACE AcpiUtPredefinedWarning ( @@ -795,6 +799,15 @@ AcpiUtPredefinedWarning ( const char *Format, ...); +void ACPI_INTERNAL_VAR_XFACE +AcpiUtPredefinedInfo ( + const char *ModuleName, + UINT32 LineNumber, + char *Pathname, + UINT8 NodeFlags, + const char *Format, + ...); + /* Values for Base above (16=Hex, 10=Decimal) */ #define ACPI_ANY_BASE 0 diff --git a/sys/contrib/dev/acpica/include/amlcode.h b/sys/contrib/dev/acpica/include/amlcode.h index 19740d9083c2..d6fc7d00ce3b 100644 --- a/sys/contrib/dev/acpica/include/amlcode.h +++ b/sys/contrib/dev/acpica/include/amlcode.h @@ -10,7 +10,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/amlresrc.h b/sys/contrib/dev/acpica/include/amlresrc.h index 689564c6289e..9084e44540aa 100644 --- a/sys/contrib/dev/acpica/include/amlresrc.h +++ b/sys/contrib/dev/acpica/include/amlresrc.h @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/platform/acenv.h b/sys/contrib/dev/acpica/include/platform/acenv.h index 7756fb713638..b9ef33fa4f4e 100644 --- a/sys/contrib/dev/acpica/include/platform/acenv.h +++ b/sys/contrib/dev/acpica/include/platform/acenv.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -262,11 +262,11 @@ /* Global Lock acquire/release */ #ifndef ACPI_ACQUIRE_GLOBAL_LOCK -#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) Acq = 1 +#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acquired) Acquired = 1 #endif #ifndef ACPI_RELEASE_GLOBAL_LOCK -#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) Acq = 0 +#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Pending) Pending = 0 #endif /* Flush CPU cache - used when going to sleep. Wbinvd or similar. */ @@ -424,8 +424,8 @@ typedef char *va_list; #define ACPI_MEMCMP(s1,s2,n) AcpiUtMemcmp((const char *)(s1), (const char *)(s2), (ACPI_SIZE)(n)) #define ACPI_MEMCPY(d,s,n) (void) AcpiUtMemcpy ((d), (s), (ACPI_SIZE)(n)) #define ACPI_MEMSET(d,v,n) (void) AcpiUtMemset ((d), (v), (ACPI_SIZE)(n)) -#define ACPI_TOUPPER AcpiUtToUpper -#define ACPI_TOLOWER AcpiUtToLower +#define ACPI_TOUPPER(c) AcpiUtToUpper ((int) (c)) +#define ACPI_TOLOWER(c) AcpiUtToLower ((int) (c)) #endif /* ACPI_USE_SYSTEM_CLIBRARY */ diff --git a/sys/contrib/dev/acpica/include/platform/acfreebsd.h b/sys/contrib/dev/acpica/include/platform/acfreebsd.h index 8fea3cf97a02..20ec3a20bf95 100644 --- a/sys/contrib/dev/acpica/include/platform/acfreebsd.h +++ b/sys/contrib/dev/acpica/include/platform/acfreebsd.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/include/platform/acgcc.h b/sys/contrib/dev/acpica/include/platform/acgcc.h index 449942278c99..d0098b1800ab 100644 --- a/sys/contrib/dev/acpica/include/platform/acgcc.h +++ b/sys/contrib/dev/acpica/include/platform/acgcc.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/namespace/nsaccess.c b/sys/contrib/dev/acpica/namespace/nsaccess.c index b7bc11c1eb18..e360e28370a9 100644 --- a/sys/contrib/dev/acpica/namespace/nsaccess.c +++ b/sys/contrib/dev/acpica/namespace/nsaccess.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -251,7 +251,7 @@ AcpiNsRootInitialize ( /* Mark this as a very SPECIAL method */ ObjDesc->Method.MethodFlags = AML_METHOD_INTERNAL_ONLY; - ObjDesc->Method.Implementation = AcpiUtOsiImplementation; + ObjDesc->Method.Extra.Implementation = AcpiUtOsiImplementation; #endif break; diff --git a/sys/contrib/dev/acpica/namespace/nsalloc.c b/sys/contrib/dev/acpica/namespace/nsalloc.c index 1faab76b65a1..222977abac7c 100644 --- a/sys/contrib/dev/acpica/namespace/nsalloc.c +++ b/sys/contrib/dev/acpica/namespace/nsalloc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/namespace/nsdump.c b/sys/contrib/dev/acpica/namespace/nsdump.c index 78b083fa992b..a1ae96e59194 100644 --- a/sys/contrib/dev/acpica/namespace/nsdump.c +++ b/sys/contrib/dev/acpica/namespace/nsdump.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -286,7 +286,7 @@ AcpiNsDumpOneObject ( return (AE_OK); } - ThisNode = AcpiNsMapHandleToNode (ObjHandle); + ThisNode = AcpiNsValidateHandle (ObjHandle); if (!ThisNode) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Invalid object handle %p\n", @@ -736,7 +736,7 @@ AcpiNsDumpObjects ( (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth, ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES, - AcpiNsDumpOneObject, (void *) &Info, NULL); + AcpiNsDumpOneObject, NULL, (void *) &Info, NULL); } diff --git a/sys/contrib/dev/acpica/namespace/nsdumpdv.c b/sys/contrib/dev/acpica/namespace/nsdumpdv.c index ade6656ba6a5..5dc61287587b 100644 --- a/sys/contrib/dev/acpica/namespace/nsdumpdv.c +++ b/sys/contrib/dev/acpica/namespace/nsdumpdv.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -225,7 +225,7 @@ AcpiNsDumpRootDevices ( Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, SysBusHandle, ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK, - AcpiNsDumpOneDevice, NULL, NULL); + AcpiNsDumpOneDevice, NULL, NULL, NULL); } #endif diff --git a/sys/contrib/dev/acpica/namespace/nseval.c b/sys/contrib/dev/acpica/namespace/nseval.c index 142016124231..3d4926c442b9 100644 --- a/sys/contrib/dev/acpica/namespace/nseval.c +++ b/sys/contrib/dev/acpica/namespace/nseval.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -460,52 +460,99 @@ AcpiNsExecModuleCode ( ACPI_OPERAND_OBJECT *MethodObj, ACPI_EVALUATE_INFO *Info) { - ACPI_OPERAND_OBJECT *RootObj; + ACPI_OPERAND_OBJECT *ParentObj; + ACPI_NAMESPACE_NODE *ParentNode; + ACPI_OBJECT_TYPE Type; ACPI_STATUS Status; ACPI_FUNCTION_TRACE (NsExecModuleCode); + /* + * Get the parent node. We cheat by using the NextObject field + * of the method object descriptor. + */ + ParentNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, + MethodObj->Method.NextObject); + Type = AcpiNsGetType (ParentNode); + + /* + * Get the region handler and save it in the method object. We may need + * this if an operation region declaration causes a _REG method to be run. + * + * We can't do this in AcpiPsLinkModuleCode because + * AcpiGbl_RootNode->Object is NULL at PASS1. + */ + if ((Type == ACPI_TYPE_DEVICE) && ParentNode->Object) + { + MethodObj->Method.Extra.Handler = + ParentNode->Object->Device.Handler; + } + + /* Must clear NextObject (AcpiNsAttachObject needs the field) */ + + MethodObj->Method.NextObject = NULL; + /* Initialize the evaluation information block */ ACPI_MEMSET (Info, 0, sizeof (ACPI_EVALUATE_INFO)); - Info->PrefixNode = AcpiGbl_RootNode; + Info->PrefixNode = ParentNode; /* - * Get the currently attached root object. Add a reference, because the + * Get the currently attached parent object. Add a reference, because the * ref count will be decreased when the method object is installed to - * the root node. + * the parent node. */ - RootObj = AcpiNsGetAttachedObject (AcpiGbl_RootNode); - AcpiUtAddReference (RootObj); + ParentObj = AcpiNsGetAttachedObject (ParentNode); + if (ParentObj) + { + AcpiUtAddReference (ParentObj); + } - /* Install the method (module-level code) in the root node */ + /* Install the method (module-level code) in the parent node */ - Status = AcpiNsAttachObject (AcpiGbl_RootNode, MethodObj, + Status = AcpiNsAttachObject (ParentNode, MethodObj, ACPI_TYPE_METHOD); if (ACPI_FAILURE (Status)) { goto Exit; } - /* Execute the root node as a control method */ + /* Execute the parent node as a control method */ Status = AcpiNsEvaluate (Info); ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "Executed module-level code at %p\n", MethodObj->Method.AmlStart)); + /* Delete a possible implicit return value (in slack mode) */ + + if (Info->ReturnObject) + { + AcpiUtRemoveReference (Info->ReturnObject); + } + /* Detach the temporary method object */ - AcpiNsDetachObject (AcpiGbl_RootNode); + AcpiNsDetachObject (ParentNode); - /* Restore the original root object */ + /* Restore the original parent object */ - Status = AcpiNsAttachObject (AcpiGbl_RootNode, RootObj, ACPI_TYPE_DEVICE); + if (ParentObj) + { + Status = AcpiNsAttachObject (ParentNode, ParentObj, Type); + } + else + { + ParentNode->Type = (UINT8) Type; + } Exit: - AcpiUtRemoveReference (RootObj); + if (ParentObj) + { + AcpiUtRemoveReference (ParentObj); + } return_VOID; } diff --git a/sys/contrib/dev/acpica/namespace/nsinit.c b/sys/contrib/dev/acpica/namespace/nsinit.c index 296d83da8118..5dfb23efeddf 100644 --- a/sys/contrib/dev/acpica/namespace/nsinit.c +++ b/sys/contrib/dev/acpica/namespace/nsinit.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -185,7 +185,7 @@ AcpiNsInitializeObjects ( /* Walk entire namespace from the supplied root */ Status = AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, AcpiNsInitOneObject, + ACPI_UINT32_MAX, AcpiNsInitOneObject, NULL, &Info, NULL); if (ACPI_FAILURE (Status)) { @@ -249,7 +249,7 @@ AcpiNsInitializeDevices ( /* Tree analysis: find all subtrees that contain _INI methods */ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, AcpiNsFindIniMethods, &Info, NULL); + ACPI_UINT32_MAX, FALSE, AcpiNsFindIniMethods, NULL, &Info, NULL); if (ACPI_FAILURE (Status)) { goto ErrorExit; @@ -283,7 +283,7 @@ AcpiNsInitializeDevices ( /* Walk namespace to execute all _INIs on present devices */ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, AcpiNsInitOneDevice, &Info, NULL); + ACPI_UINT32_MAX, FALSE, AcpiNsInitOneDevice, NULL, &Info, NULL); ACPI_FREE (Info.EvaluateInfo); if (ACPI_FAILURE (Status)) diff --git a/sys/contrib/dev/acpica/namespace/nsload.c b/sys/contrib/dev/acpica/namespace/nsload.c index 031d3b3c206b..7d67c5b2397b 100644 --- a/sys/contrib/dev/acpica/namespace/nsload.c +++ b/sys/contrib/dev/acpica/namespace/nsload.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/namespace/nsnames.c b/sys/contrib/dev/acpica/namespace/nsnames.c index c299d7e747d5..c23e6de4f7f1 100644 --- a/sys/contrib/dev/acpica/namespace/nsnames.c +++ b/sys/contrib/dev/acpica/namespace/nsnames.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -337,7 +337,7 @@ AcpiNsHandleToPathname ( ACPI_FUNCTION_TRACE_PTR (NsHandleToPathname, TargetHandle); - Node = AcpiNsMapHandleToNode (TargetHandle); + Node = AcpiNsValidateHandle (TargetHandle); if (!Node) { return_ACPI_STATUS (AE_BAD_PARAMETER); diff --git a/sys/contrib/dev/acpica/namespace/nsobject.c b/sys/contrib/dev/acpica/namespace/nsobject.c index cb8482502be7..ca7f7a4703d3 100644 --- a/sys/contrib/dev/acpica/namespace/nsobject.c +++ b/sys/contrib/dev/acpica/namespace/nsobject.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/namespace/nsparse.c b/sys/contrib/dev/acpica/namespace/nsparse.c index efa0188e1888..8c71b80c618f 100644 --- a/sys/contrib/dev/acpica/namespace/nsparse.c +++ b/sys/contrib/dev/acpica/namespace/nsparse.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/namespace/nspredef.c b/sys/contrib/dev/acpica/namespace/nspredef.c index 4eca9b885585..48cf8fecae81 100644 --- a/sys/contrib/dev/acpica/namespace/nspredef.c +++ b/sys/contrib/dev/acpica/namespace/nspredef.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -313,25 +313,41 @@ AcpiNsCheckPredefinedNames ( Data->Pathname = Pathname; /* - * Check that the type of the return object is what is expected for - * this predefined name + * Check that the type of the main return object is what is expected + * for this predefined name */ Status = AcpiNsCheckObjectType (Data, ReturnObjectPtr, Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); if (ACPI_FAILURE (Status)) { - goto CheckValidationStatus; + goto Exit; } - /* For returned Package objects, check the type of all sub-objects */ - - if (ReturnObject->Common.Type == ACPI_TYPE_PACKAGE) + /* + * For returned Package objects, check the type of all sub-objects. + * Note: Package may have been newly created by call above. + */ + if ((*ReturnObjectPtr)->Common.Type == ACPI_TYPE_PACKAGE) { + Data->ParentPackage = *ReturnObjectPtr; Status = AcpiNsCheckPackage (Data, ReturnObjectPtr); + if (ACPI_FAILURE (Status)) + { + goto Exit; + } } + /* + * The return object was OK, or it was successfully repaired above. + * Now make some additional checks such as verifying that package + * objects are sorted correctly (if required) or buffer objects have + * the correct data width (bytes vs. dwords). These repairs are + * performed on a per-name basis, i.e., the code is specific to + * particular predefined names. + */ + Status = AcpiNsComplexRepairs (Data, Node, Status, ReturnObjectPtr); -CheckValidationStatus: +Exit: /* * If the object validation failed or if we successfully repaired one * or more objects, mark the parent node to suppress further warning @@ -343,7 +359,6 @@ CheckValidationStatus: } ACPI_FREE (Data); - Cleanup: ACPI_FREE (Pathname); return (Status); @@ -538,6 +553,12 @@ AcpiNsCheckPackage ( "%s Validating return Package of Type %X, Count %X\n", Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count)); + /* + * For variable-length Packages, we can safely remove all embedded + * and trailing NULL package elements + */ + AcpiNsRemoveNullElements (Data, Package->RetInfo.Type, ReturnObject); + /* Extract package count and elements array */ Elements = ReturnObject->Package.Elements; @@ -576,9 +597,10 @@ AcpiNsCheckPackage ( } else if (Count > ExpectedCount) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, - "Return Package is larger than needed - " - "found %u, expected %u", Count, ExpectedCount)); + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s: Return Package is larger than needed - " + "found %u, expected %u\n", + Data->Pathname, Count, ExpectedCount)); } /* Validate all elements of the returned package */ @@ -719,7 +741,7 @@ AcpiNsCheckPackage ( * there is only one entry). We may be able to repair this by * wrapping the returned Package with a new outer Package. */ - if ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE) + if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE)) { /* Create the new outer package and populate it */ @@ -799,12 +821,18 @@ AcpiNsCheckPackageList ( UINT32 j; - /* Validate each sub-Package in the parent Package */ - + /* + * Validate each sub-Package in the parent Package + * + * NOTE: assumes list of sub-packages contains no NULL elements. + * Any NULL elements should have been removed by earlier call + * to AcpiNsRemoveNullElements. + */ for (i = 0; i < Count; i++) { SubPackage = *Elements; SubElements = SubPackage->Package.Elements; + Data->ParentPackage = SubPackage; /* Each sub-object must be of type Package */ @@ -817,6 +845,7 @@ AcpiNsCheckPackageList ( /* Examine the different types of expected sub-packages */ + Data->ParentPackage = SubPackage; switch (Package->RetInfo.Type) { case ACPI_PTYPE2: @@ -893,7 +922,7 @@ AcpiNsCheckPackageList ( /* * First element is the (Integer) count of elements, including - * the count field. + * the count field (the ACPI name is NumElements) */ Status = AcpiNsCheckObjectType (Data, SubElements, ACPI_RTYPE_INTEGER, 0); @@ -916,6 +945,17 @@ AcpiNsCheckPackageList ( ExpectedCount = Package->RetInfo.Count1; goto PackageTooSmall; } + if (ExpectedCount == 0) + { + /* + * Either the NumEntries element was originally zero or it was + * a NULL element and repaired to an Integer of value zero. + * In either case, repair it by setting NumEntries to be the + * actual size of the subpackage. + */ + ExpectedCount = SubPackage->Package.Count; + (*SubElements)->Integer.Value = ExpectedCount; + } /* Check the type of each sub-package element */ @@ -1050,11 +1090,19 @@ AcpiNsCheckObjectType ( /* - * If we get a NULL ReturnObject here, it is a NULL package element, - * and this is always an error. + * If we get a NULL ReturnObject here, it is a NULL package element. + * Since all extraneous NULL package elements were removed earlier by a + * call to AcpiNsRemoveNullElements, this is an unexpected NULL element. + * We will attempt to repair it. */ if (!ReturnObject) { + Status = AcpiNsRepairNullElement (Data, ExpectedBtypes, + PackageIndex, ReturnObjectPtr); + if (ACPI_SUCCESS (Status)) + { + return (AE_OK); /* Repair was successful */ + } goto TypeErrorExit; } @@ -1107,28 +1155,27 @@ AcpiNsCheckObjectType ( /* Is the object one of the expected types? */ - if (!(ReturnBtype & ExpectedBtypes)) + if (ReturnBtype & ExpectedBtypes) { - /* Type mismatch -- attempt repair of the returned object */ + /* For reference objects, check that the reference type is correct */ - Status = AcpiNsRepairObject (Data, ExpectedBtypes, - PackageIndex, ReturnObjectPtr); - if (ACPI_SUCCESS (Status)) + if (ReturnObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) { - return (AE_OK); /* Repair was successful */ + Status = AcpiNsCheckReference (Data, ReturnObject); } - goto TypeErrorExit; + + return (Status); } - /* For reference objects, check that the reference type is correct */ + /* Type mismatch -- attempt repair of the returned object */ - if (ReturnObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) + Status = AcpiNsRepairObject (Data, ExpectedBtypes, + PackageIndex, ReturnObjectPtr); + if (ACPI_SUCCESS (Status)) { - Status = AcpiNsCheckReference (Data, ReturnObject); + return (AE_OK); /* Repair was successful */ } - return (Status); - TypeErrorExit: diff --git a/sys/contrib/dev/acpica/namespace/nsrepair.c b/sys/contrib/dev/acpica/namespace/nsrepair.c index 82c1bb831977..b2191a754ab2 100644 --- a/sys/contrib/dev/acpica/namespace/nsrepair.c +++ b/sys/contrib/dev/acpica/namespace/nsrepair.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -118,12 +118,67 @@ #include #include #include +#include #include #define _COMPONENT ACPI_NAMESPACE ACPI_MODULE_NAME ("nsrepair") +/******************************************************************************* + * + * This module attempts to repair or convert objects returned by the + * predefined methods to an object type that is expected, as per the ACPI + * specification. The need for this code is dictated by the many machines that + * return incorrect types for the standard predefined methods. Performing these + * conversions here, in one place, eliminates the need for individual ACPI + * device drivers to do the same. Note: Most of these conversions are different + * than the internal object conversion routines used for implicit object + * conversion. + * + * The following conversions can be performed as necessary: + * + * Integer -> String + * Integer -> Buffer + * String -> Integer + * String -> Buffer + * Buffer -> Integer + * Buffer -> String + * Buffer -> Package of Integers + * Package -> Package of one Package + * + * Additional possible repairs: + * + * Optional/unnecessary NULL package elements removed + * Required package elements that are NULL replaced by Integer/String/Buffer + * Incorrect standalone package wrapped with required outer package + * + ******************************************************************************/ + + +/* Local prototypes */ + +static ACPI_STATUS +AcpiNsConvertToInteger ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject); + +static ACPI_STATUS +AcpiNsConvertToString ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject); + +static ACPI_STATUS +AcpiNsConvertToBuffer ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject); + +static ACPI_STATUS +AcpiNsConvertToPackage ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject); + + /******************************************************************************* * * FUNCTION: AcpiNsRepairObject @@ -152,29 +207,230 @@ AcpiNsRepairObject ( { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_OPERAND_OBJECT *NewObject; - ACPI_SIZE Length; + ACPI_STATUS Status; - switch (ReturnObject->Common.Type) + ACPI_FUNCTION_NAME (NsRepairObject); + + + /* + * At this point, we know that the type of the returned object was not + * one of the expected types for this predefined name. Attempt to + * repair the object by converting it to one of the expected object + * types for this predefined name. + */ + if (ExpectedBtypes & ACPI_RTYPE_INTEGER) { + Status = AcpiNsConvertToInteger (ReturnObject, &NewObject); + if (ACPI_SUCCESS (Status)) + { + goto ObjectRepaired; + } + } + if (ExpectedBtypes & ACPI_RTYPE_STRING) + { + Status = AcpiNsConvertToString (ReturnObject, &NewObject); + if (ACPI_SUCCESS (Status)) + { + goto ObjectRepaired; + } + } + if (ExpectedBtypes & ACPI_RTYPE_BUFFER) + { + Status = AcpiNsConvertToBuffer (ReturnObject, &NewObject); + if (ACPI_SUCCESS (Status)) + { + goto ObjectRepaired; + } + } + if (ExpectedBtypes & ACPI_RTYPE_PACKAGE) + { + Status = AcpiNsConvertToPackage (ReturnObject, &NewObject); + if (ACPI_SUCCESS (Status)) + { + goto ObjectRepaired; + } + } + + /* We cannot repair this object */ + + return (AE_AML_OPERAND_TYPE); + + +ObjectRepaired: + + /* Object was successfully repaired */ + + /* + * If the original object is a package element, we need to: + * 1. Set the reference count of the new object to match the + * reference count of the old object. + * 2. Decrement the reference count of the original object. + */ + if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT) + { + NewObject->Common.ReferenceCount = + ReturnObject->Common.ReferenceCount; + + if (ReturnObject->Common.ReferenceCount > 1) + { + ReturnObject->Common.ReferenceCount--; + } + + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s: Converted %s to expected %s at index %u\n", + Data->Pathname, AcpiUtGetObjectTypeName (ReturnObject), + AcpiUtGetObjectTypeName (NewObject), PackageIndex)); + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s: Converted %s to expected %s\n", + Data->Pathname, AcpiUtGetObjectTypeName (ReturnObject), + AcpiUtGetObjectTypeName (NewObject))); + } + + /* Delete old object, install the new return object */ + + AcpiUtRemoveReference (ReturnObject); + *ReturnObjectPtr = NewObject; + Data->Flags |= ACPI_OBJECT_REPAIRED; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsConvertToInteger + * + * PARAMETERS: OriginalObject - Object to be converted + * ReturnObject - Where the new converted object is returned + * + * RETURN: Status. AE_OK if conversion was successful. + * + * DESCRIPTION: Attempt to convert a String/Buffer object to an Integer. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiNsConvertToInteger ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject) +{ + ACPI_OPERAND_OBJECT *NewObject; + ACPI_STATUS Status; + UINT64 Value = 0; + UINT32 i; + + + switch (OriginalObject->Common.Type) + { + case ACPI_TYPE_STRING: + + /* String-to-Integer conversion */ + + Status = AcpiUtStrtoul64 (OriginalObject->String.Pointer, + ACPI_ANY_BASE, &Value); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + break; + case ACPI_TYPE_BUFFER: - /* Does the method/object legally return a string? */ + /* Buffer-to-Integer conversion. Max buffer size is 64 bits. */ - if (!(ExpectedBtypes & ACPI_RTYPE_STRING)) + if (OriginalObject->Buffer.Length > 8) { return (AE_AML_OPERAND_TYPE); } + /* Extract each buffer byte to create the integer */ + + for (i = 0; i < OriginalObject->Buffer.Length; i++) + { + Value |= ((UINT64) OriginalObject->Buffer.Pointer[i] << (i * 8)); + } + break; + + default: + return (AE_AML_OPERAND_TYPE); + } + + NewObject = AcpiUtCreateIntegerObject (Value); + if (!NewObject) + { + return (AE_NO_MEMORY); + } + + *ReturnObject = NewObject; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsConvertToString + * + * PARAMETERS: OriginalObject - Object to be converted + * ReturnObject - Where the new converted object is returned + * + * RETURN: Status. AE_OK if conversion was successful. + * + * DESCRIPTION: Attempt to convert a Integer/Buffer object to a String. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiNsConvertToString ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject) +{ + ACPI_OPERAND_OBJECT *NewObject; + ACPI_SIZE Length; + ACPI_STATUS Status; + + + switch (OriginalObject->Common.Type) + { + case ACPI_TYPE_INTEGER: /* - * Have a Buffer, expected a String, convert. Use a ToString + * Integer-to-String conversion. Commonly, convert + * an integer of value 0 to a NULL string. The last element of + * _BIF and _BIX packages occasionally need this fix. + */ + if (OriginalObject->Integer.Value == 0) + { + /* Allocate a new NULL string object */ + + NewObject = AcpiUtCreateStringObject (0); + if (!NewObject) + { + return (AE_NO_MEMORY); + } + } + else + { + Status = AcpiExConvertToString (OriginalObject, &NewObject, + ACPI_IMPLICIT_CONVERT_HEX); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + } + break; + + case ACPI_TYPE_BUFFER: + /* + * Buffer-to-String conversion. Use a ToString * conversion, no transform performed on the buffer data. The best * example of this is the _BIF method, where the string data from * the battery is often (incorrectly) returned as buffer object(s). */ Length = 0; - while ((Length < ReturnObject->Buffer.Length) && - (ReturnObject->Buffer.Pointer[Length])) + while ((Length < OriginalObject->Buffer.Length) && + (OriginalObject->Buffer.Pointer[Length])) { Length++; } @@ -192,46 +448,372 @@ AcpiNsRepairObject ( * terminated at Length+1. */ ACPI_MEMCPY (NewObject->String.Pointer, - ReturnObject->Buffer.Pointer, Length); + OriginalObject->Buffer.Pointer, Length); + break; + default: + return (AE_AML_OPERAND_TYPE); + } + + *ReturnObject = NewObject; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsConvertToBuffer + * + * PARAMETERS: OriginalObject - Object to be converted + * ReturnObject - Where the new converted object is returned + * + * RETURN: Status. AE_OK if conversion was successful. + * + * DESCRIPTION: Attempt to convert a Integer/String/Package object to a Buffer. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiNsConvertToBuffer ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject) +{ + ACPI_OPERAND_OBJECT *NewObject; + ACPI_STATUS Status; + ACPI_OPERAND_OBJECT **Elements; + UINT32 *DwordBuffer; + UINT32 Count; + UINT32 i; + + + switch (OriginalObject->Common.Type) + { + case ACPI_TYPE_INTEGER: /* - * If the original object is a package element, we need to: - * 1. Set the reference count of the new object to match the - * reference count of the old object. - * 2. Decrement the reference count of the original object. + * Integer-to-Buffer conversion. + * Convert the Integer to a packed-byte buffer. _MAT and other + * objects need this sometimes, if a read has been performed on a + * Field object that is less than or equal to the global integer + * size (32 or 64 bits). */ - if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT) + Status = AcpiExConvertToBuffer (OriginalObject, &NewObject); + if (ACPI_FAILURE (Status)) { - NewObject->Common.ReferenceCount = - ReturnObject->Common.ReferenceCount; + return (Status); + } + break; - if (ReturnObject->Common.ReferenceCount > 1) + case ACPI_TYPE_STRING: + + /* String-to-Buffer conversion. Simple data copy */ + + NewObject = AcpiUtCreateBufferObject (OriginalObject->String.Length); + if (!NewObject) + { + return (AE_NO_MEMORY); + } + + ACPI_MEMCPY (NewObject->Buffer.Pointer, + OriginalObject->String.Pointer, OriginalObject->String.Length); + break; + + case ACPI_TYPE_PACKAGE: + /* + * This case is often seen for predefined names that must return a + * Buffer object with multiple DWORD integers within. For example, + * _FDE and _GTM. The Package can be converted to a Buffer. + */ + + /* All elements of the Package must be integers */ + + Elements = OriginalObject->Package.Elements; + Count = OriginalObject->Package.Count; + + for (i = 0; i < Count; i++) + { + if ((!*Elements) || + ((*Elements)->Common.Type != ACPI_TYPE_INTEGER)) { - ReturnObject->Common.ReferenceCount--; + return (AE_AML_OPERAND_TYPE); } + Elements++; + } - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, - "Converted Buffer to expected String at index %u", - PackageIndex)); + /* Create the new buffer object to replace the Package */ + + NewObject = AcpiUtCreateBufferObject (ACPI_MUL_4 (Count)); + if (!NewObject) + { + return (AE_NO_MEMORY); + } + + /* Copy the package elements (integers) to the buffer as DWORDs */ + + Elements = OriginalObject->Package.Elements; + DwordBuffer = ACPI_CAST_PTR (UINT32, NewObject->Buffer.Pointer); + + for (i = 0; i < Count; i++) + { + *DwordBuffer = (UINT32) (*Elements)->Integer.Value; + DwordBuffer++; + Elements++; + } + break; + + default: + return (AE_AML_OPERAND_TYPE); + } + + *ReturnObject = NewObject; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsConvertToPackage + * + * PARAMETERS: OriginalObject - Object to be converted + * ReturnObject - Where the new converted object is returned + * + * RETURN: Status. AE_OK if conversion was successful. + * + * DESCRIPTION: Attempt to convert a Buffer object to a Package. Each byte of + * the buffer is converted to a single integer package element. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiNsConvertToPackage ( + ACPI_OPERAND_OBJECT *OriginalObject, + ACPI_OPERAND_OBJECT **ReturnObject) +{ + ACPI_OPERAND_OBJECT *NewObject; + ACPI_OPERAND_OBJECT **Elements; + UINT32 Length; + UINT8 *Buffer; + + + switch (OriginalObject->Common.Type) + { + case ACPI_TYPE_BUFFER: + + /* Buffer-to-Package conversion */ + + Length = OriginalObject->Buffer.Length; + NewObject = AcpiUtCreatePackageObject (Length); + if (!NewObject) + { + return (AE_NO_MEMORY); + } + + /* Convert each buffer byte to an integer package element */ + + Elements = NewObject->Package.Elements; + Buffer = OriginalObject->Buffer.Pointer; + + while (Length--) + { + *Elements = AcpiUtCreateIntegerObject ((UINT64) *Buffer); + if (!*Elements) + { + AcpiUtRemoveReference (NewObject); + return (AE_NO_MEMORY); + } + Elements++; + Buffer++; + } + break; + + default: + return (AE_AML_OPERAND_TYPE); + } + + *ReturnObject = NewObject; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsRepairNullElement + * + * PARAMETERS: Data - Pointer to validation data structure + * ExpectedBtypes - Object types expected + * PackageIndex - Index of object within parent package (if + * applicable - ACPI_NOT_PACKAGE_ELEMENT + * otherwise) + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if repair was successful. + * + * DESCRIPTION: Attempt to repair a NULL element of a returned Package object. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiNsRepairNullElement ( + ACPI_PREDEFINED_DATA *Data, + UINT32 ExpectedBtypes, + UINT32 PackageIndex, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; + ACPI_OPERAND_OBJECT *NewObject; + + + ACPI_FUNCTION_NAME (NsRepairNullElement); + + + /* No repair needed if return object is non-NULL */ + + if (ReturnObject) + { + return (AE_OK); + } + + /* + * Attempt to repair a NULL element of a Package object. This applies to + * predefined names that return a fixed-length package and each element + * is required. It does not apply to variable-length packages where NULL + * elements are allowed, especially at the end of the package. + */ + if (ExpectedBtypes & ACPI_RTYPE_INTEGER) + { + /* Need an Integer - create a zero-value integer */ + + NewObject = AcpiUtCreateIntegerObject (0); + } + else if (ExpectedBtypes & ACPI_RTYPE_STRING) + { + /* Need a String - create a NULL string */ + + NewObject = AcpiUtCreateStringObject (0); + } + else if (ExpectedBtypes & ACPI_RTYPE_BUFFER) + { + /* Need a Buffer - create a zero-length buffer */ + + NewObject = AcpiUtCreateBufferObject (0); + } + else + { + /* Error for all other expected types */ + + return (AE_AML_OPERAND_TYPE); + } + + if (!NewObject) + { + return (AE_NO_MEMORY); + } + + /* Set the reference count according to the parent Package object */ + + NewObject->Common.ReferenceCount = Data->ParentPackage->Common.ReferenceCount; + + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s: Converted NULL package element to expected %s at index %u\n", + Data->Pathname, AcpiUtGetObjectTypeName (NewObject), PackageIndex)); + + *ReturnObjectPtr = NewObject; + Data->Flags |= ACPI_OBJECT_REPAIRED; + return (AE_OK); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsRemoveNullElements + * + * PARAMETERS: Data - Pointer to validation data structure + * PackageType - An AcpiReturnPackageTypes value + * ObjDesc - A Package object + * + * RETURN: None. + * + * DESCRIPTION: Remove all NULL package elements from packages that contain + * a variable number of sub-packages. For these types of + * packages, NULL elements can be safely removed. + * + *****************************************************************************/ + +void +AcpiNsRemoveNullElements ( + ACPI_PREDEFINED_DATA *Data, + UINT8 PackageType, + ACPI_OPERAND_OBJECT *ObjDesc) +{ + ACPI_OPERAND_OBJECT **Source; + ACPI_OPERAND_OBJECT **Dest; + UINT32 Count; + UINT32 NewCount; + UINT32 i; + + + ACPI_FUNCTION_NAME (NsRemoveNullElements); + + + /* + * PTYPE1 packages contain no subpackages. + * PTYPE2 packages contain a variable number of sub-packages. We can + * safely remove all NULL elements from the PTYPE2 packages. + */ + switch (PackageType) + { + case ACPI_PTYPE1_FIXED: + case ACPI_PTYPE1_VAR: + case ACPI_PTYPE1_OPTION: + return; + + case ACPI_PTYPE2: + case ACPI_PTYPE2_COUNT: + case ACPI_PTYPE2_PKG_COUNT: + case ACPI_PTYPE2_FIXED: + case ACPI_PTYPE2_MIN: + case ACPI_PTYPE2_REV_FIXED: + break; + + default: + return; + } + + Count = ObjDesc->Package.Count; + NewCount = Count; + + Source = ObjDesc->Package.Elements; + Dest = Source; + + /* Examine all elements of the package object, remove nulls */ + + for (i = 0; i < Count; i++) + { + if (!*Source) + { + NewCount--; } else { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, - "Converted Buffer to expected String")); + *Dest = *Source; + Dest++; } - - /* Delete old object, install the new return object */ - - AcpiUtRemoveReference (ReturnObject); - *ReturnObjectPtr = NewObject; - Data->Flags |= ACPI_OBJECT_REPAIRED; - return (AE_OK); - - default: - break; + Source++; } - return (AE_AML_OPERAND_TYPE); + /* Update parent package if any null elements were removed */ + + if (NewCount < Count) + { + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s: Found and removed %u NULL elements\n", + Data->Pathname, (Count - NewCount))); + + /* NULL terminate list and update the package count */ + + *Dest = NULL; + ObjDesc->Package.Count = NewCount; + } } @@ -267,6 +849,9 @@ AcpiNsRepairPackageList ( ACPI_OPERAND_OBJECT *PkgObjDesc; + ACPI_FUNCTION_NAME (NsRepairPackageList); + + /* * Create the new outer package and populate it. The new package will * have a single element, the lone subpackage. @@ -284,8 +869,8 @@ AcpiNsRepairPackageList ( *ObjDescPtr = PkgObjDesc; Data->Flags |= ACPI_OBJECT_REPAIRED; - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, - "Incorrectly formed Package, attempting repair")); + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s: Repaired incorrectly formed Package\n", Data->Pathname)); return (AE_OK); } diff --git a/sys/contrib/dev/acpica/namespace/nsrepair2.c b/sys/contrib/dev/acpica/namespace/nsrepair2.c new file mode 100644 index 000000000000..25fc47c2bb2c --- /dev/null +++ b/sys/contrib/dev/acpica/namespace/nsrepair2.c @@ -0,0 +1,696 @@ +/****************************************************************************** + * + * Module Name: nsrepair2 - Repair for objects returned by specific + * predefined methods + * + *****************************************************************************/ + +/****************************************************************************** + * + * 1. Copyright Notice + * + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. + * All rights reserved. + * + * 2. License + * + * 2.1. This is your license from Intel Corp. under its intellectual property + * rights. You may have additional license terms from the party that provided + * you this software, covering your right to use that party's intellectual + * property rights. + * + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a + * copy of the source code appearing in this file ("Covered Code") an + * irrevocable, perpetual, worldwide license under Intel's copyrights in the + * base code distributed originally by Intel ("Original Intel Code") to copy, + * make derivatives, distribute, use and display any portion of the Covered + * Code in any form, with the right to sublicense such rights; and + * + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent + * license (with the right to sublicense), under only those claims of Intel + * patents that are infringed by the Original Intel Code, to make, use, sell, + * offer to sell, and import the Covered Code and derivative works thereof + * solely to the minimum extent necessary to exercise the above copyright + * license, and in no event shall the patent license extend to any additions + * to or modifications of the Original Intel Code. No other license or right + * is granted directly or by implication, estoppel or otherwise; + * + * The above copyright and patent license is granted only if the following + * conditions are met: + * + * 3. Conditions + * + * 3.1. Redistribution of Source with Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification with rights to further distribute source must include + * the above Copyright Notice, the above License, this list of Conditions, + * and the following Disclaimer and Export Compliance provision. In addition, + * Licensee must cause all Covered Code to which Licensee contributes to + * contain a file documenting the changes Licensee made to create that Covered + * Code and the date of any change. Licensee must include in that file the + * documentation of any changes made by any predecessor Licensee. Licensee + * must include a prominent statement that the modification is derived, + * directly or indirectly, from Original Intel Code. + * + * 3.2. Redistribution of Source with no Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification without rights to further distribute source must + * include the following Disclaimer and Export Compliance provision in the + * documentation and/or other materials provided with distribution. In + * addition, Licensee may not authorize further sublicense of source of any + * portion of the Covered Code, and must include terms to the effect that the + * license from Licensee to its licensee is limited to the intellectual + * property embodied in the software Licensee provides to its licensee, and + * not to intellectual property embodied in modifications its licensee may + * make. + * + * 3.3. Redistribution of Executable. Redistribution in executable form of any + * substantial portion of the Covered Code or modification must reproduce the + * above Copyright Notice, and the following Disclaimer and Export Compliance + * provision in the documentation and/or other materials provided with the + * distribution. + * + * 3.4. Intel retains all right, title, and interest in and to the Original + * Intel Code. + * + * 3.5. Neither the name Intel nor any other trademark owned or controlled by + * Intel shall be used in advertising or otherwise to promote the sale, use or + * other dealings in products derived from or relating to the Covered Code + * without prior written authorization from Intel. + * + * 4. Disclaimer and Export Compliance + * + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY + * LIMITED REMEDY. + * + * 4.3. Licensee shall not export, either directly or indirectly, any of this + * software or system incorporating such software without first obtaining any + * required license or other approval from the U. S. Department of Commerce or + * any other agency or department of the United States Government. In the + * event Licensee exports any such software from the United States or + * re-exports any such software from a foreign destination, Licensee shall + * ensure that the distribution and export/re-export of the software is in + * compliance with all laws, regulations, orders, or other restrictions of the + * U.S. Export Administration Regulations. Licensee agrees that neither it nor + * any of its subsidiaries will export/re-export any technical data, process, + * software, or service, directly or indirectly, to any country for which the + * United States government or any agency thereof requires an export license, + * other governmental approval, or letter of assurance, without first obtaining + * such license, approval or letter. + * + *****************************************************************************/ + +#define __NSREPAIR2_C__ + +#include +#include +#include + +#define _COMPONENT ACPI_NAMESPACE + ACPI_MODULE_NAME ("nsrepair2") + + +/* + * Information structure and handler for ACPI predefined names that can + * be repaired on a per-name basis. + */ +typedef +ACPI_STATUS (*ACPI_REPAIR_FUNCTION) ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +typedef struct acpi_repair_info +{ + char Name[ACPI_NAME_SIZE]; + ACPI_REPAIR_FUNCTION RepairFunction; + +} ACPI_REPAIR_INFO; + + +/* Local prototypes */ + +static const ACPI_REPAIR_INFO * +AcpiNsMatchRepairableName ( + ACPI_NAMESPACE_NODE *Node); + +static ACPI_STATUS +AcpiNsRepair_ALR ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +static ACPI_STATUS +AcpiNsRepair_FDE ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +static ACPI_STATUS +AcpiNsRepair_PSS ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +static ACPI_STATUS +AcpiNsRepair_TSS ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +static ACPI_STATUS +AcpiNsCheckSortedList ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT *ReturnObject, + UINT32 ExpectedCount, + UINT32 SortIndex, + UINT8 SortDirection, + char *SortKeyName); + +static void +AcpiNsSortList ( + ACPI_OPERAND_OBJECT **Elements, + UINT32 Count, + UINT32 Index, + UINT8 SortDirection); + +/* Values for SortDirection above */ + +#define ACPI_SORT_ASCENDING 0 +#define ACPI_SORT_DESCENDING 1 + + +/* + * This table contains the names of the predefined methods for which we can + * perform more complex repairs. + * + * As necessary: + * + * _ALR: Sort the list ascending by AmbientIlluminance + * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs + * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs + * _PSS: Sort the list descending by Power + * _TSS: Sort the list descending by Power + */ +static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] = +{ + {"_ALR", AcpiNsRepair_ALR}, + {"_FDE", AcpiNsRepair_FDE}, + {"_GTM", AcpiNsRepair_FDE}, /* _GTM has same repair as _FDE */ + {"_PSS", AcpiNsRepair_PSS}, + {"_TSS", AcpiNsRepair_TSS}, + {{0,0,0,0}, NULL} /* Table terminator */ +}; + + +#define ACPI_FDE_FIELD_COUNT 5 +#define ACPI_FDE_BYTE_BUFFER_SIZE 5 +#define ACPI_FDE_DWORD_BUFFER_SIZE (ACPI_FDE_FIELD_COUNT * sizeof (UINT32)) + + +/****************************************************************************** + * + * FUNCTION: AcpiNsComplexRepairs + * + * PARAMETERS: Data - Pointer to validation data structure + * Node - Namespace node for the method/object + * ValidateStatus - Original status of earlier validation + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if repair was successful. If name is not + * matched, ValidateStatus is returned. + * + * DESCRIPTION: Attempt to repair/convert a return object of a type that was + * not expected. + * + *****************************************************************************/ + +ACPI_STATUS +AcpiNsComplexRepairs ( + ACPI_PREDEFINED_DATA *Data, + ACPI_NAMESPACE_NODE *Node, + ACPI_STATUS ValidateStatus, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + const ACPI_REPAIR_INFO *Predefined; + ACPI_STATUS Status; + + + /* Check if this name is in the list of repairable names */ + + Predefined = AcpiNsMatchRepairableName (Node); + if (!Predefined) + { + return (ValidateStatus); + } + + Status = Predefined->RepairFunction (Data, ReturnObjectPtr); + return (Status); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsMatchRepairableName + * + * PARAMETERS: Node - Namespace node for the method/object + * + * RETURN: Pointer to entry in repair table. NULL indicates not found. + * + * DESCRIPTION: Check an object name against the repairable object list. + * + *****************************************************************************/ + +static const ACPI_REPAIR_INFO * +AcpiNsMatchRepairableName ( + ACPI_NAMESPACE_NODE *Node) +{ + const ACPI_REPAIR_INFO *ThisName; + + + /* Search info table for a repairable predefined method/object name */ + + ThisName = AcpiNsRepairableNames; + while (ThisName->RepairFunction) + { + if (ACPI_COMPARE_NAME (Node->Name.Ascii, ThisName->Name)) + { + return (ThisName); + } + ThisName++; + } + + return (NULL); /* Not found */ +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsRepair_ALR + * + * PARAMETERS: Data - Pointer to validation data structure + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if object is OK or was repaired successfully + * + * DESCRIPTION: Repair for the _ALR object. If necessary, sort the object list + * ascending by the ambient illuminance values. + * + *****************************************************************************/ + +static ACPI_STATUS +AcpiNsRepair_ALR ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; + ACPI_STATUS Status; + + + Status = AcpiNsCheckSortedList (Data, ReturnObject, 2, 1, + ACPI_SORT_ASCENDING, "AmbientIlluminance"); + + return (Status); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsRepair_FDE + * + * PARAMETERS: Data - Pointer to validation data structure + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if object is OK or was repaired successfully + * + * DESCRIPTION: Repair for the _FDE and _GTM objects. The expected return + * value is a Buffer of 5 DWORDs. This function repairs a common + * problem where the return value is a Buffer of BYTEs, not + * DWORDs. + * + *****************************************************************************/ + +static ACPI_STATUS +AcpiNsRepair_FDE ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; + ACPI_OPERAND_OBJECT *BufferObject; + UINT8 *ByteBuffer; + UINT32 *DwordBuffer; + UINT32 i; + + + ACPI_FUNCTION_NAME (NsRepair_FDE); + + + switch (ReturnObject->Common.Type) + { + case ACPI_TYPE_BUFFER: + + /* This is the expected type. Length should be (at least) 5 DWORDs */ + + if (ReturnObject->Buffer.Length >= ACPI_FDE_DWORD_BUFFER_SIZE) + { + return (AE_OK); + } + + /* We can only repair if we have exactly 5 BYTEs */ + + if (ReturnObject->Buffer.Length != ACPI_FDE_BYTE_BUFFER_SIZE) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + "Incorrect return buffer length %u, expected %u", + ReturnObject->Buffer.Length, ACPI_FDE_DWORD_BUFFER_SIZE)); + + return (AE_AML_OPERAND_TYPE); + } + + /* Create the new (larger) buffer object */ + + BufferObject = AcpiUtCreateBufferObject (ACPI_FDE_DWORD_BUFFER_SIZE); + if (!BufferObject) + { + return (AE_NO_MEMORY); + } + + /* Expand each byte to a DWORD */ + + ByteBuffer = ReturnObject->Buffer.Pointer; + DwordBuffer = ACPI_CAST_PTR (UINT32, BufferObject->Buffer.Pointer); + + for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++) + { + *DwordBuffer = (UINT32) *ByteBuffer; + DwordBuffer++; + ByteBuffer++; + } + + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s Expanded Byte Buffer to expected DWord Buffer\n", + Data->Pathname)); + break; + + default: + return (AE_AML_OPERAND_TYPE); + } + + /* Delete the original return object, return the new buffer object */ + + AcpiUtRemoveReference (ReturnObject); + *ReturnObjectPtr = BufferObject; + + Data->Flags |= ACPI_OBJECT_REPAIRED; + return (AE_OK); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsRepair_TSS + * + * PARAMETERS: Data - Pointer to validation data structure + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if object is OK or was repaired successfully + * + * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list + * descending by the power dissipation values. + * + *****************************************************************************/ + +static ACPI_STATUS +AcpiNsRepair_TSS ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; + ACPI_STATUS Status; + + + Status = AcpiNsCheckSortedList (Data, ReturnObject, 5, 1, + ACPI_SORT_DESCENDING, "PowerDissipation"); + + return (Status); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsRepair_PSS + * + * PARAMETERS: Data - Pointer to validation data structure + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if object is OK or was repaired successfully + * + * DESCRIPTION: Repair for the _PSS object. If necessary, sort the object list + * by the CPU frequencies. Check that the power dissipation values + * are all proportional to CPU frequency (i.e., sorting by + * frequency should be the same as sorting by power.) + * + *****************************************************************************/ + +static ACPI_STATUS +AcpiNsRepair_PSS ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; + ACPI_OPERAND_OBJECT **OuterElements; + UINT32 OuterElementCount; + ACPI_OPERAND_OBJECT **Elements; + ACPI_OPERAND_OBJECT *ObjDesc; + UINT32 PreviousValue; + ACPI_STATUS Status; + UINT32 i; + + + /* + * Entries (sub-packages) in the _PSS Package must be sorted by power + * dissipation, in descending order. If it appears that the list is + * incorrectly sorted, sort it. We sort by CpuFrequency, since this + * should be proportional to the power. + */ + Status =AcpiNsCheckSortedList (Data, ReturnObject, 6, 0, + ACPI_SORT_DESCENDING, "CpuFrequency"); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* + * We now know the list is correctly sorted by CPU frequency. Check if + * the power dissipation values are proportional. + */ + PreviousValue = ACPI_UINT32_MAX; + OuterElements = ReturnObject->Package.Elements; + OuterElementCount = ReturnObject->Package.Count; + + for (i = 0; i < OuterElementCount; i++) + { + Elements = (*OuterElements)->Package.Elements; + ObjDesc = Elements[1]; /* Index1 = PowerDissipation */ + + if ((UINT32) ObjDesc->Integer.Value > PreviousValue) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + "SubPackage[%u,%u] - suspicious power dissipation values", + i-1, i)); + } + + PreviousValue = (UINT32) ObjDesc->Integer.Value; + OuterElements++; + } + + return (AE_OK); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsCheckSortedList + * + * PARAMETERS: Data - Pointer to validation data structure + * ReturnObject - Pointer to the top-level returned object + * ExpectedCount - Minimum length of each sub-package + * SortIndex - Sub-package entry to sort on + * SortDirection - Ascending or descending + * SortKeyName - Name of the SortIndex field + * + * RETURN: Status. AE_OK if the list is valid and is sorted correctly or + * has been repaired by sorting the list. + * + * DESCRIPTION: Check if the package list is valid and sorted correctly by the + * SortIndex. If not, then sort the list. + * + *****************************************************************************/ + +static ACPI_STATUS +AcpiNsCheckSortedList ( + ACPI_PREDEFINED_DATA *Data, + ACPI_OPERAND_OBJECT *ReturnObject, + UINT32 ExpectedCount, + UINT32 SortIndex, + UINT8 SortDirection, + char *SortKeyName) +{ + UINT32 OuterElementCount; + ACPI_OPERAND_OBJECT **OuterElements; + ACPI_OPERAND_OBJECT **Elements; + ACPI_OPERAND_OBJECT *ObjDesc; + UINT32 i; + UINT32 PreviousValue; + + + ACPI_FUNCTION_NAME (NsCheckSortedList); + + + /* The top-level object must be a package */ + + if (ReturnObject->Common.Type != ACPI_TYPE_PACKAGE) + { + return (AE_AML_OPERAND_TYPE); + } + + /* + * NOTE: assumes list of sub-packages contains no NULL elements. + * Any NULL elements should have been removed by earlier call + * to AcpiNsRemoveNullElements. + */ + OuterElements = ReturnObject->Package.Elements; + OuterElementCount = ReturnObject->Package.Count; + if (!OuterElementCount) + { + return (AE_AML_PACKAGE_LIMIT); + } + + PreviousValue = 0; + if (SortDirection == ACPI_SORT_DESCENDING) + { + PreviousValue = ACPI_UINT32_MAX; + } + + /* Examine each subpackage */ + + for (i = 0; i < OuterElementCount; i++) + { + /* Each element of the top-level package must also be a package */ + + if ((*OuterElements)->Common.Type != ACPI_TYPE_PACKAGE) + { + return (AE_AML_OPERAND_TYPE); + } + + /* Each sub-package must have the minimum length */ + + if ((*OuterElements)->Package.Count < ExpectedCount) + { + return (AE_AML_PACKAGE_LIMIT); + } + + Elements = (*OuterElements)->Package.Elements; + ObjDesc = Elements[SortIndex]; + + if (ObjDesc->Common.Type != ACPI_TYPE_INTEGER) + { + return (AE_AML_OPERAND_TYPE); + } + + /* + * The list must be sorted in the specified order. If we detect a + * discrepancy, sort the entire list. + */ + if (((SortDirection == ACPI_SORT_ASCENDING) && + (ObjDesc->Integer.Value < PreviousValue)) || + ((SortDirection == ACPI_SORT_DESCENDING) && + (ObjDesc->Integer.Value > PreviousValue))) + { + AcpiNsSortList (ReturnObject->Package.Elements, + OuterElementCount, SortIndex, SortDirection); + + Data->Flags |= ACPI_OBJECT_REPAIRED; + + ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, + "%s: Repaired unsorted list - now sorted by %s\n", + Data->Pathname, SortKeyName)); + return (AE_OK); + } + + PreviousValue = (UINT32) ObjDesc->Integer.Value; + OuterElements++; + } + + return (AE_OK); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiNsSortList + * + * PARAMETERS: Elements - Package object element list + * Count - Element count for above + * Index - Sort by which package element + * SortDirection - Ascending or Descending sort + * + * RETURN: None + * + * DESCRIPTION: Sort the objects that are in a package element list. + * + * NOTE: Assumes that all NULL elements have been removed from the package, + * and that all elements have been verified to be of type Integer. + * + *****************************************************************************/ + +static void +AcpiNsSortList ( + ACPI_OPERAND_OBJECT **Elements, + UINT32 Count, + UINT32 Index, + UINT8 SortDirection) +{ + ACPI_OPERAND_OBJECT *ObjDesc1; + ACPI_OPERAND_OBJECT *ObjDesc2; + ACPI_OPERAND_OBJECT *TempObj; + UINT32 i; + UINT32 j; + + + /* Simple bubble sort */ + + for (i = 1; i < Count; i++) + { + for (j = (Count - 1); j >= i; j--) + { + ObjDesc1 = Elements[j-1]->Package.Elements[Index]; + ObjDesc2 = Elements[j]->Package.Elements[Index]; + + if (((SortDirection == ACPI_SORT_ASCENDING) && + (ObjDesc1->Integer.Value > ObjDesc2->Integer.Value)) || + + ((SortDirection == ACPI_SORT_DESCENDING) && + (ObjDesc1->Integer.Value < ObjDesc2->Integer.Value))) + { + TempObj = Elements[j-1]; + Elements[j-1] = Elements[j]; + Elements[j] = TempObj; + } + } + } +} diff --git a/sys/contrib/dev/acpica/namespace/nssearch.c b/sys/contrib/dev/acpica/namespace/nssearch.c index 03863888165a..b583fab12871 100644 --- a/sys/contrib/dev/acpica/namespace/nssearch.c +++ b/sys/contrib/dev/acpica/namespace/nssearch.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/namespace/nsutils.c b/sys/contrib/dev/acpica/namespace/nsutils.c index 666c79096faa..cc42f68b592c 100644 --- a/sys/contrib/dev/acpica/namespace/nsutils.c +++ b/sys/contrib/dev/acpica/namespace/nsutils.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -857,25 +857,26 @@ AcpiNsExternalizeName ( /******************************************************************************* * - * FUNCTION: AcpiNsMapHandleToNode + * FUNCTION: AcpiNsValidateHandle * - * PARAMETERS: Handle - Handle to be converted to an Node + * PARAMETERS: Handle - Handle to be validated and typecast to a + * namespace node. * - * RETURN: A Name table entry pointer + * RETURN: A pointer to a namespace node * - * DESCRIPTION: Convert a namespace handle to a real Node + * DESCRIPTION: Convert a namespace handle to a namespace node. Handles special + * cases for the root node. * - * Note: Real integer handles would allow for more verification + * NOTE: Real integer handles would allow for more verification * and keep all pointers within this subsystem - however this introduces - * more (and perhaps unnecessary) overhead. - * - * The current implemenation is basically a placeholder until such time comes - * that it is needed. + * more overhead and has not been necessary to this point. Drivers + * holding handles are typically notified before a node becomes invalid + * due to a table unload. * ******************************************************************************/ ACPI_NAMESPACE_NODE * -AcpiNsMapHandleToNode ( +AcpiNsValidateHandle ( ACPI_HANDLE Handle) { @@ -900,48 +901,6 @@ AcpiNsMapHandleToNode ( } -/******************************************************************************* - * - * FUNCTION: AcpiNsConvertEntryToHandle - * - * PARAMETERS: Node - Node to be converted to a Handle - * - * RETURN: A user handle - * - * DESCRIPTION: Convert a real Node to a namespace handle - * - ******************************************************************************/ - -ACPI_HANDLE -AcpiNsConvertEntryToHandle ( - ACPI_NAMESPACE_NODE *Node) -{ - - - /* - * Simple implementation for now; - */ - return ((ACPI_HANDLE) Node); - - -/* Example future implementation --------------------- - - if (!Node) - { - return (NULL); - } - - if (Node == AcpiGbl_RootNode) - { - return (ACPI_ROOT_OBJECT); - } - - - return ((ACPI_HANDLE) Node); -------------------------------------------------------*/ -} - - /******************************************************************************* * * FUNCTION: AcpiNsTerminate diff --git a/sys/contrib/dev/acpica/namespace/nswalk.c b/sys/contrib/dev/acpica/namespace/nswalk.c index fcfa5e1c2280..f5eb8ff11575 100644 --- a/sys/contrib/dev/acpica/namespace/nswalk.c +++ b/sys/contrib/dev/acpica/namespace/nswalk.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -247,24 +247,27 @@ AcpiNsGetNextNodeTyped ( * MaxDepth - Depth to which search is to reach * Flags - Whether to unlock the NS before invoking * the callback routine - * UserFunction - Called when an object of "Type" is found - * Context - Passed to user function - * ReturnValue - from the UserFunction if terminated early. - * Otherwise, returns NULL. + * PreOrderVisit - Called during tree pre-order visit + * when an object of "Type" is found + * PostOrderVisit - Called during tree post-order visit + * when an object of "Type" is found + * Context - Passed to user function(s) above + * ReturnValue - from the UserFunction if terminated + * early. Otherwise, returns NULL. * RETURNS: Status * * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, * starting (and ending) at the node specified by StartHandle. - * The UserFunction is called whenever a node that matches - * the type parameter is found. If the user function returns + * The callback function is called whenever a node that matches + * the type parameter is found. If the callback function returns * a non-zero value, the search is terminated immediately and * this value is returned to the caller. * * The point of this procedure is to provide a generic namespace * walk routine that can be called from multiple places to - * provide multiple services; the User Function can be tailored - * to each task, whether it is a print function, a compare - * function, etc. + * provide multiple services; the callback function(s) can be + * tailored to each task, whether it is a print function, + * a compare function, etc. * ******************************************************************************/ @@ -274,7 +277,8 @@ AcpiNsWalkNamespace ( ACPI_HANDLE StartNode, UINT32 MaxDepth, UINT32 Flags, - ACPI_WALK_CALLBACK UserFunction, + ACPI_WALK_CALLBACK PreOrderVisit, + ACPI_WALK_CALLBACK PostOrderVisit, void *Context, void **ReturnValue) { @@ -284,6 +288,7 @@ AcpiNsWalkNamespace ( ACPI_NAMESPACE_NODE *ParentNode; ACPI_OBJECT_TYPE ChildType; UINT32 Level; + BOOLEAN NodePreviouslyVisited = FALSE; ACPI_FUNCTION_TRACE (NsWalkNamespace); @@ -299,7 +304,7 @@ AcpiNsWalkNamespace ( /* Null child means "get first node" */ ParentNode = StartNode; - ChildNode = NULL; + ChildNode = AcpiNsGetNextNode (ParentNode, NULL); ChildType = ACPI_TYPE_ANY; Level = 1; @@ -308,103 +313,139 @@ AcpiNsWalkNamespace ( * started. When Level is zero, the loop is done because we have * bubbled up to (and passed) the original parent handle (StartEntry) */ - while (Level > 0) + while (Level > 0 && ChildNode) { - /* Get the next node in this scope. Null if not found */ - Status = AE_OK; + + /* Found next child, get the type if we are not searching for ANY */ + + if (Type != ACPI_TYPE_ANY) + { + ChildType = ChildNode->Type; + } + + /* + * Ignore all temporary namespace nodes (created during control + * method execution) unless told otherwise. These temporary nodes + * can cause a race condition because they can be deleted during + * the execution of the user function (if the namespace is + * unlocked before invocation of the user function.) Only the + * debugger namespace dump will examine the temporary nodes. + */ + if ((ChildNode->Flags & ANOBJ_TEMPORARY) && + !(Flags & ACPI_NS_WALK_TEMP_NODES)) + { + Status = AE_CTRL_DEPTH; + } + + /* Type must match requested type */ + + else if (ChildType == Type) + { + /* + * Found a matching node, invoke the user callback function. + * Unlock the namespace if flag is set. + */ + if (Flags & ACPI_NS_WALK_UNLOCK) + { + MutexStatus = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); + if (ACPI_FAILURE (MutexStatus)) + { + return_ACPI_STATUS (MutexStatus); + } + } + + /* + * Invoke the user function, either pre-order or post-order + * or both. + */ + if (!NodePreviouslyVisited) + { + if (PreOrderVisit) + { + Status = PreOrderVisit (ChildNode, Level, + Context, ReturnValue); + } + } + else + { + if (PostOrderVisit) + { + Status = PostOrderVisit (ChildNode, Level, + Context, ReturnValue); + } + } + + if (Flags & ACPI_NS_WALK_UNLOCK) + { + MutexStatus = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); + if (ACPI_FAILURE (MutexStatus)) + { + return_ACPI_STATUS (MutexStatus); + } + } + + switch (Status) + { + case AE_OK: + case AE_CTRL_DEPTH: + + /* Just keep going */ + break; + + case AE_CTRL_TERMINATE: + + /* Exit now, with OK status */ + + return_ACPI_STATUS (AE_OK); + + default: + + /* All others are valid exceptions */ + + return_ACPI_STATUS (Status); + } + } + + /* + * Depth first search: Attempt to go down another level in the + * namespace if we are allowed to. Don't go any further if we have + * reached the caller specified maximum depth or if the user + * function has specified that the maximum depth has been reached. + */ + if (!NodePreviouslyVisited && + (Level < MaxDepth) && + (Status != AE_CTRL_DEPTH)) + { + if (ChildNode->Child) + { + /* There is at least one child of this node, visit it */ + + Level++; + ParentNode = ChildNode; + ChildNode = AcpiNsGetNextNode (ParentNode, NULL); + continue; + } + } + + /* No more children, re-visit this node */ + + if (!NodePreviouslyVisited) + { + NodePreviouslyVisited = TRUE; + continue; + } + + /* No more children, visit peers */ + ChildNode = AcpiNsGetNextNode (ParentNode, ChildNode); if (ChildNode) { - /* Found next child, get the type if we are not searching for ANY */ - - if (Type != ACPI_TYPE_ANY) - { - ChildType = ChildNode->Type; - } - - /* - * Ignore all temporary namespace nodes (created during control - * method execution) unless told otherwise. These temporary nodes - * can cause a race condition because they can be deleted during - * the execution of the user function (if the namespace is - * unlocked before invocation of the user function.) Only the - * debugger namespace dump will examine the temporary nodes. - */ - if ((ChildNode->Flags & ANOBJ_TEMPORARY) && - !(Flags & ACPI_NS_WALK_TEMP_NODES)) - { - Status = AE_CTRL_DEPTH; - } - - /* Type must match requested type */ - - else if (ChildType == Type) - { - /* - * Found a matching node, invoke the user callback function. - * Unlock the namespace if flag is set. - */ - if (Flags & ACPI_NS_WALK_UNLOCK) - { - MutexStatus = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); - if (ACPI_FAILURE (MutexStatus)) - { - return_ACPI_STATUS (MutexStatus); - } - } - - Status = UserFunction (ChildNode, Level, Context, ReturnValue); - - if (Flags & ACPI_NS_WALK_UNLOCK) - { - MutexStatus = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); - if (ACPI_FAILURE (MutexStatus)) - { - return_ACPI_STATUS (MutexStatus); - } - } - - switch (Status) - { - case AE_OK: - case AE_CTRL_DEPTH: - - /* Just keep going */ - break; - - case AE_CTRL_TERMINATE: - - /* Exit now, with OK status */ - - return_ACPI_STATUS (AE_OK); - - default: - - /* All others are valid exceptions */ - - return_ACPI_STATUS (Status); - } - } - - /* - * Depth first search: Attempt to go down another level in the - * namespace if we are allowed to. Don't go any further if we have - * reached the caller specified maximum depth or if the user - * function has specified that the maximum depth has been reached. - */ - if ((Level < MaxDepth) && (Status != AE_CTRL_DEPTH)) - { - if (ChildNode->Child) - { - /* There is at least one child of this node, visit it */ - - Level++; - ParentNode = ChildNode; - ChildNode = NULL; - } - } + NodePreviouslyVisited = FALSE; } + + /* No peers, re-visit parent */ + else { /* @@ -414,6 +455,8 @@ AcpiNsWalkNamespace ( Level--; ChildNode = ParentNode; ParentNode = AcpiNsGetParentNode (ParentNode); + + NodePreviouslyVisited = TRUE; } } diff --git a/sys/contrib/dev/acpica/namespace/nsxfeval.c b/sys/contrib/dev/acpica/namespace/nsxfeval.c index bc606781bfdb..8f8ee66034c8 100644 --- a/sys/contrib/dev/acpica/namespace/nsxfeval.c +++ b/sys/contrib/dev/acpica/namespace/nsxfeval.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -281,7 +281,7 @@ AcpiEvaluateObject ( /* Convert and validate the device handle */ - Info->PrefixNode = AcpiNsMapHandleToNode (Handle); + Info->PrefixNode = AcpiNsValidateHandle (Handle); if (!Info->PrefixNode) { Status = AE_BAD_PARAMETER; @@ -544,8 +544,11 @@ AcpiNsResolveReferences ( * PARAMETERS: Type - ACPI_OBJECT_TYPE to search for * StartObject - Handle in namespace where search begins * MaxDepth - Depth to which search is to reach - * UserFunction - Called when an object of "Type" is found - * Context - Passed to user function + * PreOrderVisit - Called during tree pre-order visit + * when an object of "Type" is found + * PostOrderVisit - Called during tree post-order visit + * when an object of "Type" is found + * Context - Passed to user function(s) above * ReturnValue - Location where return value of * UserFunction is put if terminated early * @@ -554,16 +557,16 @@ AcpiNsResolveReferences ( * * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, * starting (and ending) at the object specified by StartHandle. - * The UserFunction is called whenever an object that matches - * the type parameter is found. If the user function returns + * The callback function is called whenever an object that matches + * the type parameter is found. If the callback function returns * a non-zero value, the search is terminated immediately and this * value is returned to the caller. * * The point of this procedure is to provide a generic namespace * walk routine that can be called from multiple places to - * provide multiple services; the User Function can be tailored - * to each task, whether it is a print function, a compare - * function, etc. + * provide multiple services; the callback function(s) can be + * tailored to each task, whether it is a print function, + * a compare function, etc. * ******************************************************************************/ @@ -572,7 +575,8 @@ AcpiWalkNamespace ( ACPI_OBJECT_TYPE Type, ACPI_HANDLE StartObject, UINT32 MaxDepth, - ACPI_WALK_CALLBACK UserFunction, + ACPI_WALK_CALLBACK PreOrderVisit, + ACPI_WALK_CALLBACK PostOrderVisit, void *Context, void **ReturnValue) { @@ -586,7 +590,7 @@ AcpiWalkNamespace ( if ((Type > ACPI_TYPE_LOCAL_MAX) || (!MaxDepth) || - (!UserFunction)) + (!PreOrderVisit && !PostOrderVisit)) { return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -621,7 +625,8 @@ AcpiWalkNamespace ( } Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth, - ACPI_NS_WALK_UNLOCK, UserFunction, Context, ReturnValue); + ACPI_NS_WALK_UNLOCK, PreOrderVisit, + PostOrderVisit, Context, ReturnValue); (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); @@ -671,7 +676,7 @@ AcpiNsGetDeviceCallback ( return (Status); } - Node = AcpiNsMapHandleToNode (ObjHandle); + Node = AcpiNsValidateHandle (ObjHandle); Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); if (ACPI_FAILURE (Status)) { @@ -683,27 +688,20 @@ AcpiNsGetDeviceCallback ( return (AE_BAD_PARAMETER); } - /* Run _STA to determine if device is present */ - - Status = AcpiUtExecute_STA (Node, &Flags); - if (ACPI_FAILURE (Status)) - { - return (AE_CTRL_DEPTH); - } - - if (!(Flags & ACPI_STA_DEVICE_PRESENT) && - !(Flags & ACPI_STA_DEVICE_FUNCTIONING)) - { - /* - * Don't examine the children of the device only when the - * device is neither present nor functional. See ACPI spec, - * description of _STA for more information. - */ - return (AE_CTRL_DEPTH); - } - - /* Filter based on device HID & CID */ - + /* + * First, filter based on the device HID and CID. + * + * 01/2010: For this case where a specific HID is requested, we don't + * want to run _STA until we have an actual HID match. Thus, we will + * not unnecessarily execute _STA on devices for which the caller + * doesn't care about. Previously, _STA was executed unconditionally + * on all devices found here. + * + * A side-effect of this change is that now we will continue to search + * for a matching HID even under device trees where the parent device + * would have returned a _STA that indicates it is not present or + * not functioning (thus aborting the search on that branch). + */ if (Info->Hid != NULL) { Status = AcpiUtExecute_HID (Node, &Hid); @@ -757,6 +755,25 @@ AcpiNsGetDeviceCallback ( } } + /* Run _STA to determine if device is present */ + + Status = AcpiUtExecute_STA (Node, &Flags); + if (ACPI_FAILURE (Status)) + { + return (AE_CTRL_DEPTH); + } + + if (!(Flags & ACPI_STA_DEVICE_PRESENT) && + !(Flags & ACPI_STA_DEVICE_FUNCTIONING)) + { + /* + * Don't examine the children of the device only when the + * device is neither present nor functional. See ACPI spec, + * description of _STA for more information. + */ + return (AE_CTRL_DEPTH); + } + /* We have a valid device, invoke the user function */ Status = Info->UserFunction (ObjHandle, NestingLevel, Info->Context, @@ -833,7 +850,7 @@ AcpiGetDevices ( Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, - AcpiNsGetDeviceCallback, &Info, ReturnValue); + AcpiNsGetDeviceCallback, NULL, &Info, ReturnValue); (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); return_ACPI_STATUS (Status); @@ -883,7 +900,7 @@ AcpiAttachData ( /* Convert and validate the handle */ - Node = AcpiNsMapHandleToNode (ObjHandle); + Node = AcpiNsValidateHandle (ObjHandle); if (!Node) { Status = AE_BAD_PARAMETER; @@ -938,7 +955,7 @@ AcpiDetachData ( /* Convert and validate the handle */ - Node = AcpiNsMapHandleToNode (ObjHandle); + Node = AcpiNsValidateHandle (ObjHandle); if (!Node) { Status = AE_BAD_PARAMETER; @@ -996,7 +1013,7 @@ AcpiGetData ( /* Convert and validate the handle */ - Node = AcpiNsMapHandleToNode (ObjHandle); + Node = AcpiNsValidateHandle (ObjHandle); if (!Node) { Status = AE_BAD_PARAMETER; diff --git a/sys/contrib/dev/acpica/namespace/nsxfname.c b/sys/contrib/dev/acpica/namespace/nsxfname.c index 298aeb54fc4a..81344e1181af 100644 --- a/sys/contrib/dev/acpica/namespace/nsxfname.c +++ b/sys/contrib/dev/acpica/namespace/nsxfname.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -178,7 +178,7 @@ AcpiGetHandle ( if (Parent) { - PrefixNode = AcpiNsMapHandleToNode (Parent); + PrefixNode = AcpiNsValidateHandle (Parent); if (!PrefixNode) { return (AE_BAD_PARAMETER); @@ -200,7 +200,7 @@ AcpiGetHandle ( if (!ACPI_STRCMP (Pathname, ACPI_NS_ROOT_PATH)) { - *RetHandle = AcpiNsConvertEntryToHandle (AcpiGbl_RootNode); + *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, AcpiGbl_RootNode); return (AE_OK); } } @@ -216,7 +216,7 @@ AcpiGetHandle ( Status = AcpiNsGetNode (PrefixNode, Pathname, ACPI_NS_NO_UPSEARCH, &Node); if (ACPI_SUCCESS (Status)) { - *RetHandle = AcpiNsConvertEntryToHandle (Node); + *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node); } return (Status); @@ -282,7 +282,7 @@ AcpiGetName ( return (Status); } - Node = AcpiNsMapHandleToNode (Handle); + Node = AcpiNsValidateHandle (Handle); if (!Node) { Status = AE_BAD_PARAMETER; @@ -399,7 +399,7 @@ AcpiGetObjectInfo ( goto Cleanup; } - Node = AcpiNsMapHandleToNode (Handle); + Node = AcpiNsValidateHandle (Handle); if (!Node) { (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); diff --git a/sys/contrib/dev/acpica/namespace/nsxfobj.c b/sys/contrib/dev/acpica/namespace/nsxfobj.c index 26859ef0201e..b43917b45743 100644 --- a/sys/contrib/dev/acpica/namespace/nsxfobj.c +++ b/sys/contrib/dev/acpica/namespace/nsxfobj.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -172,7 +172,7 @@ AcpiGetType ( /* Convert and validate the handle */ - Node = AcpiNsMapHandleToNode (Handle); + Node = AcpiNsValidateHandle (Handle); if (!Node) { (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); @@ -233,7 +233,7 @@ AcpiGetParent ( /* Convert and validate the handle */ - Node = AcpiNsMapHandleToNode (Handle); + Node = AcpiNsValidateHandle (Handle); if (!Node) { Status = AE_BAD_PARAMETER; @@ -243,7 +243,7 @@ AcpiGetParent ( /* Get the parent entry */ ParentNode = AcpiNsGetParentNode (Node); - *RetHandle = AcpiNsConvertEntryToHandle (ParentNode); + *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, ParentNode); /* Return exception if parent is null */ @@ -312,7 +312,7 @@ AcpiGetNextObject ( { /* Start search at the beginning of the specified scope */ - ParentNode = AcpiNsMapHandleToNode (Parent); + ParentNode = AcpiNsValidateHandle (Parent); if (!ParentNode) { Status = AE_BAD_PARAMETER; @@ -324,7 +324,7 @@ AcpiGetNextObject ( /* Non-null handle, ignore the parent */ /* Convert and validate the handle */ - ChildNode = AcpiNsMapHandleToNode (Child); + ChildNode = AcpiNsValidateHandle (Child); if (!ChildNode) { Status = AE_BAD_PARAMETER; @@ -343,7 +343,7 @@ AcpiGetNextObject ( if (RetHandle) { - *RetHandle = AcpiNsConvertEntryToHandle (Node); + *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node); } diff --git a/sys/contrib/dev/acpica/osunixxf.c b/sys/contrib/dev/acpica/osunixxf.c index 727916e4f884..a0e38e46c0ae 100644 --- a/sys/contrib/dev/acpica/osunixxf.c +++ b/sys/contrib/dev/acpica/osunixxf.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -871,7 +871,7 @@ AcpiOsStall ( void AcpiOsSleep ( - ACPI_INTEGER milliseconds) + UINT64 milliseconds) { sleep (milliseconds / 1000); /* Sleep for whole seconds */ @@ -976,7 +976,7 @@ ACPI_STATUS AcpiOsWritePciConfiguration ( ACPI_PCI_ID *PciId, UINT32 Register, - ACPI_INTEGER Value, + UINT64 Value, UINT32 Width) { diff --git a/sys/contrib/dev/acpica/parser/psargs.c b/sys/contrib/dev/acpica/parser/psargs.c index c36982c6a6b6..275993d99a9d 100644 --- a/sys/contrib/dev/acpica/parser/psargs.c +++ b/sys/contrib/dev/acpica/parser/psargs.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -514,7 +514,7 @@ AcpiPsGetNextSimpleArg ( /* Get 1 byte from the AML stream */ Opcode = AML_BYTE_OP; - Arg->Common.Value.Integer = (ACPI_INTEGER) *Aml; + Arg->Common.Value.Integer = (UINT64) *Aml; Length = 1; break; diff --git a/sys/contrib/dev/acpica/parser/psloop.c b/sys/contrib/dev/acpica/parser/psloop.c index 1c1c011069ee..73bfdf826562 100644 --- a/sys/contrib/dev/acpica/parser/psloop.c +++ b/sys/contrib/dev/acpica/parser/psloop.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -173,6 +173,7 @@ AcpiPsCompleteFinalOp ( static void AcpiPsLinkModuleCode ( + ACPI_PARSE_OBJECT *ParentOp, UINT8 *AmlStart, UINT32 AmlLength, ACPI_OWNER_ID OwnerId); @@ -593,7 +594,7 @@ AcpiPsGetArguments ( */ if (WalkState->PassNumber == ACPI_IMODE_LOAD_PASS1) { - AcpiPsLinkModuleCode (AmlOpStart, + AcpiPsLinkModuleCode (Op->Common.Parent, AmlOpStart, (UINT32) (WalkState->ParserState.PkgEnd - AmlOpStart), WalkState->OwnerId); } @@ -704,7 +705,8 @@ AcpiPsGetArguments ( * * FUNCTION: AcpiPsLinkModuleCode * - * PARAMETERS: AmlStart - Pointer to the AML + * PARAMETERS: ParentOp - Parent parser op + * AmlStart - Pointer to the AML * AmlLength - Length of executable AML * OwnerId - OwnerId of module level code * @@ -718,6 +720,7 @@ AcpiPsGetArguments ( static void AcpiPsLinkModuleCode ( + ACPI_PARSE_OBJECT *ParentOp, UINT8 *AmlStart, UINT32 AmlLength, ACPI_OWNER_ID OwnerId) @@ -725,6 +728,7 @@ AcpiPsLinkModuleCode ( ACPI_OPERAND_OBJECT *Prev; ACPI_OPERAND_OBJECT *Next; ACPI_OPERAND_OBJECT *MethodObj; + ACPI_NAMESPACE_NODE *ParentNode; /* Get the tail of the list */ @@ -751,11 +755,27 @@ AcpiPsLinkModuleCode ( return; } + if (ParentOp->Common.Node) + { + ParentNode = ParentOp->Common.Node; + } + else + { + ParentNode = AcpiGbl_RootNode; + } + MethodObj->Method.AmlStart = AmlStart; MethodObj->Method.AmlLength = AmlLength; MethodObj->Method.OwnerId = OwnerId; MethodObj->Method.Flags |= AOPOBJ_MODULE_LEVEL; + /* + * Save the parent node in NextObject. This is cheating, but we + * don't want to expand the method object. + */ + MethodObj->Method.NextObject = + ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, ParentNode); + if (!Prev) { AcpiGbl_ModuleCodeList = MethodObj; diff --git a/sys/contrib/dev/acpica/parser/psopcode.c b/sys/contrib/dev/acpica/parser/psopcode.c index 9ce095f772f5..6b65d79e5e31 100644 --- a/sys/contrib/dev/acpica/parser/psopcode.c +++ b/sys/contrib/dev/acpica/parser/psopcode.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/parser/psparse.c b/sys/contrib/dev/acpica/parser/psparse.c index eda132bd7fb5..22783c233cba 100644 --- a/sys/contrib/dev/acpica/parser/psparse.c +++ b/sys/contrib/dev/acpica/parser/psparse.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -705,13 +705,11 @@ AcpiPsParseAml ( !PreviousWalkState->ImplicitReturnObj) { PreviousWalkState->ImplicitReturnObj = - AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + AcpiUtCreateIntegerObject ((UINT64) 0); if (!PreviousWalkState->ImplicitReturnObj) { return_ACPI_STATUS (AE_NO_MEMORY); } - - PreviousWalkState->ImplicitReturnObj->Integer.Value = 0; } /* Restart the calling control method */ diff --git a/sys/contrib/dev/acpica/parser/psscope.c b/sys/contrib/dev/acpica/parser/psscope.c index ce50c4a1c636..bf72f4562a60 100644 --- a/sys/contrib/dev/acpica/parser/psscope.c +++ b/sys/contrib/dev/acpica/parser/psscope.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/parser/pstree.c b/sys/contrib/dev/acpica/parser/pstree.c index d29b561126ff..f4ffe4b1abe9 100644 --- a/sys/contrib/dev/acpica/parser/pstree.c +++ b/sys/contrib/dev/acpica/parser/pstree.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/parser/psutils.c b/sys/contrib/dev/acpica/parser/psutils.c index c67ef366bc6c..c34d0159d67d 100644 --- a/sys/contrib/dev/acpica/parser/psutils.c +++ b/sys/contrib/dev/acpica/parser/psutils.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/parser/pswalk.c b/sys/contrib/dev/acpica/parser/pswalk.c index f5f3e902529e..321d96e30d36 100644 --- a/sys/contrib/dev/acpica/parser/pswalk.c +++ b/sys/contrib/dev/acpica/parser/pswalk.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/parser/psxface.c b/sys/contrib/dev/acpica/parser/psxface.c index 677354a73226..e9fc45de6898 100644 --- a/sys/contrib/dev/acpica/parser/psxface.c +++ b/sys/contrib/dev/acpica/parser/psxface.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -403,7 +403,7 @@ AcpiPsExecuteMethod ( if (Info->ObjDesc->Method.MethodFlags & AML_METHOD_INTERNAL_ONLY) { - Status = Info->ObjDesc->Method.Implementation (WalkState); + Status = Info->ObjDesc->Method.Extra.Implementation (WalkState); Info->ReturnObject = WalkState->ReturnDesc; /* Cleanup states */ @@ -422,15 +422,13 @@ AcpiPsExecuteMethod ( if (AcpiGbl_EnableInterpreterSlack) { WalkState->ImplicitReturnObj = - AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + AcpiUtCreateIntegerObject ((UINT64) 0); if (!WalkState->ImplicitReturnObj) { Status = AE_NO_MEMORY; AcpiDsDeleteWalkState (WalkState); goto Cleanup; } - - WalkState->ImplicitReturnObj->Integer.Value = 0; } /* Parse the AML */ diff --git a/sys/contrib/dev/acpica/resources/rsaddr.c b/sys/contrib/dev/acpica/resources/rsaddr.c index f3ce1071b6dc..7ce78a592646 100644 --- a/sys/contrib/dev/acpica/resources/rsaddr.c +++ b/sys/contrib/dev/acpica/resources/rsaddr.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rscalc.c b/sys/contrib/dev/acpica/resources/rscalc.c index 8ef95f85c75c..d3aca948553f 100644 --- a/sys/contrib/dev/acpica/resources/rscalc.c +++ b/sys/contrib/dev/acpica/resources/rscalc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rscreate.c b/sys/contrib/dev/acpica/resources/rscreate.c index d63c7c4d0a04..8e460d2e53c1 100644 --- a/sys/contrib/dev/acpica/resources/rscreate.c +++ b/sys/contrib/dev/acpica/resources/rscreate.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -270,7 +270,7 @@ AcpiRsCreatePciRoutingTable ( /* * Loop through the ACPI_INTERNAL_OBJECTS - Each object should be a - * package that in turn contains an ACPI_INTEGER Address, a UINT8 Pin, + * package that in turn contains an UINT64 Address, a UINT8 Pin, * a Name, and a UINT8 SourceIndex. */ TopObjectList = PackageObject->Package.Elements; diff --git a/sys/contrib/dev/acpica/resources/rsdump.c b/sys/contrib/dev/acpica/resources/rsdump.c index e9d54d697f22..d73a0719dde5 100644 --- a/sys/contrib/dev/acpica/resources/rsdump.c +++ b/sys/contrib/dev/acpica/resources/rsdump.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rsinfo.c b/sys/contrib/dev/acpica/resources/rsinfo.c index e52c6fd2210e..f1bb441ee17c 100644 --- a/sys/contrib/dev/acpica/resources/rsinfo.c +++ b/sys/contrib/dev/acpica/resources/rsinfo.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rsio.c b/sys/contrib/dev/acpica/resources/rsio.c index 9806f60206d8..946b4d4d93e7 100644 --- a/sys/contrib/dev/acpica/resources/rsio.c +++ b/sys/contrib/dev/acpica/resources/rsio.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rsirq.c b/sys/contrib/dev/acpica/resources/rsirq.c index 54e04229f0f6..c409dc11e202 100644 --- a/sys/contrib/dev/acpica/resources/rsirq.c +++ b/sys/contrib/dev/acpica/resources/rsirq.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rslist.c b/sys/contrib/dev/acpica/resources/rslist.c index 44c2f0235344..1b73cf218352 100644 --- a/sys/contrib/dev/acpica/resources/rslist.c +++ b/sys/contrib/dev/acpica/resources/rslist.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rsmemory.c b/sys/contrib/dev/acpica/resources/rsmemory.c index c20fe56c2805..b7c64a225d6c 100644 --- a/sys/contrib/dev/acpica/resources/rsmemory.c +++ b/sys/contrib/dev/acpica/resources/rsmemory.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rsmisc.c b/sys/contrib/dev/acpica/resources/rsmisc.c index 7ad344f25e6c..37c1a050a7d9 100644 --- a/sys/contrib/dev/acpica/resources/rsmisc.c +++ b/sys/contrib/dev/acpica/resources/rsmisc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rsutils.c b/sys/contrib/dev/acpica/resources/rsutils.c index fabea698fe8b..b0cd5380eb3e 100644 --- a/sys/contrib/dev/acpica/resources/rsutils.c +++ b/sys/contrib/dev/acpica/resources/rsutils.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/resources/rsxface.c b/sys/contrib/dev/acpica/resources/rsxface.c index b72d58b8e3e4..3e6399cceb94 100644 --- a/sys/contrib/dev/acpica/resources/rsxface.c +++ b/sys/contrib/dev/acpica/resources/rsxface.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -191,7 +191,7 @@ AcpiRsValidateParameters ( return_ACPI_STATUS (AE_BAD_PARAMETER); } - Node = AcpiNsMapHandleToNode (DeviceHandle); + Node = AcpiNsValidateHandle (DeviceHandle); if (!Node) { return_ACPI_STATUS (AE_BAD_PARAMETER); diff --git a/sys/contrib/dev/acpica/tables/tbfadt.c b/sys/contrib/dev/acpica/tables/tbfadt.c index e6e467993411..7f2ae36f435b 100644 --- a/sys/contrib/dev/acpica/tables/tbfadt.c +++ b/sys/contrib/dev/acpica/tables/tbfadt.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/tables/tbfind.c b/sys/contrib/dev/acpica/tables/tbfind.c index a3a862dfe2e6..d6cee630e13e 100644 --- a/sys/contrib/dev/acpica/tables/tbfind.c +++ b/sys/contrib/dev/acpica/tables/tbfind.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/tables/tbinstal.c b/sys/contrib/dev/acpica/tables/tbinstal.c index d03b2949c339..be5561249e91 100644 --- a/sys/contrib/dev/acpica/tables/tbinstal.c +++ b/sys/contrib/dev/acpica/tables/tbinstal.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/tables/tbutils.c b/sys/contrib/dev/acpica/tables/tbutils.c index b77d59bc2c1c..25b0652943b5 100644 --- a/sys/contrib/dev/acpica/tables/tbutils.c +++ b/sys/contrib/dev/acpica/tables/tbutils.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/tables/tbxface.c b/sys/contrib/dev/acpica/tables/tbxface.c index e6e9a2912423..26f9472c5aa0 100644 --- a/sys/contrib/dev/acpica/tables/tbxface.c +++ b/sys/contrib/dev/acpica/tables/tbxface.c @@ -9,7 +9,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/tables/tbxfroot.c b/sys/contrib/dev/acpica/tables/tbxfroot.c index c0d2b756c0b6..021e2b60a050 100644 --- a/sys/contrib/dev/acpica/tables/tbxfroot.c +++ b/sys/contrib/dev/acpica/tables/tbxfroot.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/tools/acpiexec/aecommon.h b/sys/contrib/dev/acpica/tools/acpiexec/aecommon.h index fa0c918298e1..0ceddea49601 100644 --- a/sys/contrib/dev/acpica/tools/acpiexec/aecommon.h +++ b/sys/contrib/dev/acpica/tools/acpiexec/aecommon.h @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -135,8 +135,9 @@ #include #include -extern FILE *AcpiGbl_DebugFile; -extern BOOLEAN AcpiGbl_IgnoreErrors; +extern FILE *AcpiGbl_DebugFile; +extern BOOLEAN AcpiGbl_IgnoreErrors; +extern UINT8 AcpiGbl_RegionFillValue; typedef struct ae_table_desc @@ -231,7 +232,7 @@ AeRegionHandler ( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, void *HandlerContext, void *RegionContext); diff --git a/sys/contrib/dev/acpica/utilities/utalloc.c b/sys/contrib/dev/acpica/utilities/utalloc.c index aff2e1c4d319..8c6ed0b60bfa 100644 --- a/sys/contrib/dev/acpica/utilities/utalloc.c +++ b/sys/contrib/dev/acpica/utilities/utalloc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/utcache.c b/sys/contrib/dev/acpica/utilities/utcache.c index 42bef0c42382..cb487a199670 100644 --- a/sys/contrib/dev/acpica/utilities/utcache.c +++ b/sys/contrib/dev/acpica/utilities/utcache.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/utcopy.c b/sys/contrib/dev/acpica/utilities/utcopy.c index 8d919abe548b..b16e14c1439d 100644 --- a/sys/contrib/dev/acpica/utilities/utcopy.c +++ b/sys/contrib/dev/acpica/utilities/utcopy.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -422,11 +422,11 @@ AcpiUtCopyIelementToEelement ( * RETURN: Status * * DESCRIPTION: This function is called to place a package object in a user - * buffer. A package object by definition contains other objects. + * buffer. A package object by definition contains other objects. * * The buffer is assumed to have sufficient space for the object. - * The caller must have verified the buffer length needed using the - * AcpiUtGetObjectSize function before calling this function. + * The caller must have verified the buffer length needed using + * the AcpiUtGetObjectSize function before calling this function. * ******************************************************************************/ @@ -485,12 +485,12 @@ AcpiUtCopyIpackageToEpackage ( * FUNCTION: AcpiUtCopyIobjectToEobject * * PARAMETERS: InternalObject - The internal object to be converted - * BufferPtr - Where the object is returned + * RetBuffer - Where the object is returned * * RETURN: Status * - * DESCRIPTION: This function is called to build an API object to be returned to - * the caller. + * DESCRIPTION: This function is called to build an API object to be returned + * to the caller. * ******************************************************************************/ @@ -742,7 +742,7 @@ AcpiUtCopyEpackageToIpackage ( * PARAMETERS: ExternalObject - The external object to be converted * InternalObject - Where the internal object is returned * - * RETURN: Status - the status of the call + * RETURN: Status * * DESCRIPTION: Converts an external object to an internal object. * @@ -784,7 +784,7 @@ AcpiUtCopyEobjectToIobject ( * * RETURN: Status * - * DESCRIPTION: Simple copy of one internal object to another. Reference count + * DESCRIPTION: Simple copy of one internal object to another. Reference count * of the destination object is preserved. * ******************************************************************************/ @@ -1034,10 +1034,11 @@ ErrorExit: * * FUNCTION: AcpiUtCopyIpackageToIpackage * - * PARAMETERS: *SourceObj - Pointer to the source package object - * *DestObj - Where the internal object is returned + * PARAMETERS: SourceObj - Pointer to the source package object + * DestObj - Where the internal object is returned + * WalkState - Current Walk state descriptor * - * RETURN: Status - the status of the call + * RETURN: Status * * DESCRIPTION: This function is called to copy an internal package object * into another internal package object. @@ -1093,9 +1094,9 @@ AcpiUtCopyIpackageToIpackage ( * * FUNCTION: AcpiUtCopyIobjectToIobject * - * PARAMETERS: WalkState - Current walk state - * SourceDesc - The internal object to be copied + * PARAMETERS: SourceDesc - The internal object to be copied * DestDesc - Where the copied object is returned + * WalkState - Current walk state * * RETURN: Status * diff --git a/sys/contrib/dev/acpica/utilities/utdebug.c b/sys/contrib/dev/acpica/utilities/utdebug.c index 9dacaabb18fd..99670b58f36f 100644 --- a/sys/contrib/dev/acpica/utilities/utdebug.c +++ b/sys/contrib/dev/acpica/utilities/utdebug.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -598,7 +598,7 @@ AcpiUtValueExit ( const char *FunctionName, const char *ModuleName, UINT32 ComponentId, - ACPI_INTEGER Value) + UINT64 Value) { AcpiDebugPrint (ACPI_LV_FUNCTIONS, diff --git a/sys/contrib/dev/acpica/utilities/utdelete.c b/sys/contrib/dev/acpica/utilities/utdelete.c index 1b975a22179a..bd6490dac3b0 100644 --- a/sys/contrib/dev/acpica/utilities/utdelete.c +++ b/sys/contrib/dev/acpica/utilities/utdelete.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/uteval.c b/sys/contrib/dev/acpica/utilities/uteval.c index a4f5e21c79cd..be1e45e1aa9b 100644 --- a/sys/contrib/dev/acpica/utilities/uteval.c +++ b/sys/contrib/dev/acpica/utilities/uteval.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -423,7 +423,7 @@ ACPI_STATUS AcpiUtEvaluateNumericObject ( char *ObjectName, ACPI_NAMESPACE_NODE *DeviceNode, - ACPI_INTEGER *Value) + UINT64 *Value) { ACPI_OPERAND_OBJECT *ObjDesc; ACPI_STATUS Status; diff --git a/sys/contrib/dev/acpica/utilities/utglobal.c b/sys/contrib/dev/acpica/utilities/utglobal.c index 8cee843bd467..df32fc069f86 100644 --- a/sys/contrib/dev/acpica/utilities/utglobal.c +++ b/sys/contrib/dev/acpica/utilities/utglobal.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -331,7 +331,7 @@ static const char AcpiGbl_HexToAscii[] = char AcpiUtHexToAsciiChar ( - ACPI_INTEGER Integer, + UINT64 Integer, UINT32 Position) { @@ -949,6 +949,10 @@ AcpiUtInitGlobals ( AcpiGbl_RootNodeStruct.Flags = ANOBJ_END_OF_PEER_LIST; +#ifdef ACPI_DISASSEMBLER + AcpiGbl_ExternalList = NULL; +#endif + #ifdef ACPI_DEBUG_OUTPUT AcpiGbl_LowestStackPointer = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX); #endif diff --git a/sys/contrib/dev/acpica/utilities/utids.c b/sys/contrib/dev/acpica/utilities/utids.c index 59f595610d52..6e5f8333ffba 100644 --- a/sys/contrib/dev/acpica/utilities/utids.c +++ b/sys/contrib/dev/acpica/utilities/utids.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/utinit.c b/sys/contrib/dev/acpica/utilities/utinit.c index 1cf0c46f652c..fe8e3dcdacd2 100644 --- a/sys/contrib/dev/acpica/utilities/utinit.c +++ b/sys/contrib/dev/acpica/utilities/utinit.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/utlock.c b/sys/contrib/dev/acpica/utilities/utlock.c index cbe1cb928027..9d4423f6ce23 100644 --- a/sys/contrib/dev/acpica/utilities/utlock.c +++ b/sys/contrib/dev/acpica/utilities/utlock.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/utmath.c b/sys/contrib/dev/acpica/utilities/utmath.c index ec9449b48179..f6d5f7cddb53 100644 --- a/sys/contrib/dev/acpica/utilities/utmath.c +++ b/sys/contrib/dev/acpica/utilities/utmath.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -149,9 +149,9 @@ ACPI_STATUS AcpiUtShortDivide ( - ACPI_INTEGER Dividend, + UINT64 Dividend, UINT32 Divisor, - ACPI_INTEGER *OutQuotient, + UINT64 *OutQuotient, UINT32 *OutRemainder) { UINT64_OVERLAY DividendOvl; @@ -213,10 +213,10 @@ AcpiUtShortDivide ( ACPI_STATUS AcpiUtDivide ( - ACPI_INTEGER InDividend, - ACPI_INTEGER InDivisor, - ACPI_INTEGER *OutQuotient, - ACPI_INTEGER *OutRemainder) + UINT64 InDividend, + UINT64 InDivisor, + UINT64 *OutQuotient, + UINT64 *OutRemainder) { UINT64_OVERLAY Dividend; UINT64_OVERLAY Divisor; @@ -293,8 +293,8 @@ AcpiUtDivide ( * The 64-bit remainder must be generated. */ Partial1 = Quotient.Part.Lo * Divisor.Part.Hi; - Partial2.Full = (ACPI_INTEGER) Quotient.Part.Lo * Divisor.Part.Lo; - Partial3.Full = (ACPI_INTEGER) Partial2.Part.Hi + Partial1; + Partial2.Full = (UINT64) Quotient.Part.Lo * Divisor.Part.Lo; + Partial3.Full = (UINT64) Partial2.Part.Hi + Partial1; Remainder.Part.Hi = Partial3.Part.Lo; Remainder.Part.Lo = Partial2.Part.Lo; @@ -362,9 +362,9 @@ AcpiUtDivide ( ACPI_STATUS AcpiUtShortDivide ( - ACPI_INTEGER InDividend, + UINT64 InDividend, UINT32 Divisor, - ACPI_INTEGER *OutQuotient, + UINT64 *OutQuotient, UINT32 *OutRemainder) { @@ -395,10 +395,10 @@ AcpiUtShortDivide ( ACPI_STATUS AcpiUtDivide ( - ACPI_INTEGER InDividend, - ACPI_INTEGER InDivisor, - ACPI_INTEGER *OutQuotient, - ACPI_INTEGER *OutRemainder) + UINT64 InDividend, + UINT64 InDivisor, + UINT64 *OutQuotient, + UINT64 *OutRemainder) { ACPI_FUNCTION_TRACE (UtDivide); diff --git a/sys/contrib/dev/acpica/utilities/utmisc.c b/sys/contrib/dev/acpica/utilities/utmisc.c index d051c9ea3395..3bef62c1c6ec 100644 --- a/sys/contrib/dev/acpica/utilities/utmisc.c +++ b/sys/contrib/dev/acpica/utilities/utmisc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -929,12 +929,12 @@ ACPI_STATUS AcpiUtStrtoul64 ( char *String, UINT32 Base, - ACPI_INTEGER *RetInteger) + UINT64 *RetInteger) { UINT32 ThisDigit = 0; - ACPI_INTEGER ReturnValue = 0; - ACPI_INTEGER Quotient; - ACPI_INTEGER Dividend; + UINT64 ReturnValue = 0; + UINT64 Quotient; + UINT64 Dividend; UINT32 ToIntegerOp = (Base == ACPI_ANY_BASE); UINT32 Mode32 = (AcpiGbl_IntegerByteWidth == 4); UINT8 ValidDigits = 0; @@ -1071,7 +1071,7 @@ AcpiUtStrtoul64 ( /* Divide the digit into the correct position */ - (void) AcpiUtShortDivide ((Dividend - (ACPI_INTEGER) ThisDigit), + (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit), Base, &Quotient, NULL); if (ReturnValue > Quotient) @@ -1440,3 +1440,51 @@ AcpiUtPredefinedWarning ( ACPI_COMMON_MSG_SUFFIX; va_end (args); } + +/******************************************************************************* + * + * FUNCTION: AcpiUtPredefinedInfo + * + * PARAMETERS: ModuleName - Caller's module name (for error output) + * LineNumber - Caller's line number (for error output) + * Pathname - Full pathname to the node + * NodeFlags - From Namespace node for the method/object + * Format - Printf format string + additional args + * + * RETURN: None + * + * DESCRIPTION: Info messages for the predefined validation module. Messages + * are only emitted the first time a problem with a particular + * method/object is detected. This prevents a flood of + * messages for methods that are repeatedly evaluated. + * + ******************************************************************************/ + +void ACPI_INTERNAL_VAR_XFACE +AcpiUtPredefinedInfo ( + const char *ModuleName, + UINT32 LineNumber, + char *Pathname, + UINT8 NodeFlags, + const char *Format, + ...) +{ + va_list args; + + + /* + * Warning messages for this method/object will be disabled after the + * first time a validation fails or an object is successfully repaired. + */ + if (NodeFlags & ANOBJ_EVALUATED) + { + return; + } + + AcpiOsPrintf ("ACPI Info for %s: ", Pathname); + + va_start (args, Format); + AcpiOsVprintf (Format, args); + ACPI_COMMON_MSG_SUFFIX; + va_end (args); +} diff --git a/sys/contrib/dev/acpica/utilities/utmutex.c b/sys/contrib/dev/acpica/utilities/utmutex.c index e9bb4a84543a..d0d47d496d72 100644 --- a/sys/contrib/dev/acpica/utilities/utmutex.c +++ b/sys/contrib/dev/acpica/utilities/utmutex.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -128,7 +128,7 @@ static ACPI_STATUS AcpiUtCreateMutex ( ACPI_MUTEX_HANDLE MutexId); -static ACPI_STATUS +static void AcpiUtDeleteMutex ( ACPI_MUTEX_HANDLE MutexId); @@ -216,7 +216,7 @@ AcpiUtMutexTerminate ( for (i = 0; i < ACPI_NUM_MUTEX; i++) { - (void) AcpiUtDeleteMutex (i); + AcpiUtDeleteMutex (i); } /* Delete the spinlocks */ @@ -253,11 +253,6 @@ AcpiUtCreateMutex ( ACPI_FUNCTION_TRACE_U32 (UtCreateMutex, MutexId); - if (MutexId > ACPI_MAX_MUTEX) - { - return_ACPI_STATUS (AE_BAD_PARAMETER); - } - if (!AcpiGbl_MutexInfo[MutexId].Mutex) { Status = AcpiOsCreateMutex (&AcpiGbl_MutexInfo[MutexId].Mutex); @@ -281,7 +276,7 @@ AcpiUtCreateMutex ( * ******************************************************************************/ -static ACPI_STATUS +static void AcpiUtDeleteMutex ( ACPI_MUTEX_HANDLE MutexId) { @@ -289,17 +284,10 @@ AcpiUtDeleteMutex ( ACPI_FUNCTION_TRACE_U32 (UtDeleteMutex, MutexId); - if (MutexId > ACPI_MAX_MUTEX) - { - return_ACPI_STATUS (AE_BAD_PARAMETER); - } - AcpiOsDeleteMutex (AcpiGbl_MutexInfo[MutexId].Mutex); AcpiGbl_MutexInfo[MutexId].Mutex = NULL; AcpiGbl_MutexInfo[MutexId].ThreadId = ACPI_MUTEX_NOT_ACQUIRED; - - return_ACPI_STATUS (AE_OK); } diff --git a/sys/contrib/dev/acpica/utilities/utobject.c b/sys/contrib/dev/acpica/utilities/utobject.c index 3c96d78f6f27..f3ec7920c4fe 100644 --- a/sys/contrib/dev/acpica/utilities/utobject.c +++ b/sys/contrib/dev/acpica/utilities/utobject.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License @@ -279,6 +279,41 @@ AcpiUtCreatePackageObject ( } +/******************************************************************************* + * + * FUNCTION: AcpiUtCreateIntegerObject + * + * PARAMETERS: InitialValue - Initial value for the integer + * + * RETURN: Pointer to a new Integer object, null on failure + * + * DESCRIPTION: Create an initialized integer object + * + ******************************************************************************/ + +ACPI_OPERAND_OBJECT * +AcpiUtCreateIntegerObject ( + UINT64 InitialValue) +{ + ACPI_OPERAND_OBJECT *IntegerDesc; + + + ACPI_FUNCTION_TRACE (UtCreateIntegerObject); + + + /* Create and initialize a new integer object */ + + IntegerDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER); + if (!IntegerDesc) + { + return_PTR (NULL); + } + + IntegerDesc->Integer.Value = InitialValue; + return_PTR (IntegerDesc); +} + + /******************************************************************************* * * FUNCTION: AcpiUtCreateBufferObject diff --git a/sys/contrib/dev/acpica/utilities/utresrc.c b/sys/contrib/dev/acpica/utilities/utresrc.c index 541b9708ed0b..e07cee4333c9 100644 --- a/sys/contrib/dev/acpica/utilities/utresrc.c +++ b/sys/contrib/dev/acpica/utilities/utresrc.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/utstate.c b/sys/contrib/dev/acpica/utilities/utstate.c index fd18dda34f4b..39afcda86acc 100644 --- a/sys/contrib/dev/acpica/utilities/utstate.c +++ b/sys/contrib/dev/acpica/utilities/utstate.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/uttrack.c b/sys/contrib/dev/acpica/utilities/uttrack.c index f399d97bf3d0..5c48544792e6 100644 --- a/sys/contrib/dev/acpica/utilities/uttrack.c +++ b/sys/contrib/dev/acpica/utilities/uttrack.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/acpica/utilities/utxface.c b/sys/contrib/dev/acpica/utilities/utxface.c index 50622b5c73e1..d000b0c765a0 100644 --- a/sys/contrib/dev/acpica/utilities/utxface.c +++ b/sys/contrib/dev/acpica/utilities/utxface.c @@ -8,7 +8,7 @@ * * 1. Copyright Notice * - * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. + * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. * All rights reserved. * * 2. License diff --git a/sys/contrib/dev/iwn/LICENSE b/sys/contrib/dev/iwn/LICENSE index e86fd6922574..74a3f7e53089 100644 --- a/sys/contrib/dev/iwn/LICENSE +++ b/sys/contrib/dev/iwn/LICENSE @@ -1,39 +1,39 @@ -Copyright (c) 2006, Intel Corporation. -All rights reserved. - -Redistribution. Redistribution and use in binary form, without -modification, are permitted provided that the following conditions are -met: - -* Redistributions must reproduce the above copyright notice and the - following disclaimer in the documentation and/or other materials - provided with the distribution. -* Neither the name of Intel Corporation nor the names of its suppliers - may be used to endorse or promote products derived from this software - without specific prior written permission. -* No reverse engineering, decompilation, or disassembly of this software - is permitted. - -Limited patent license. Intel Corporation grants a world-wide, -royalty-free, non-exclusive license under patents it now or hereafter -owns or controls to make, have made, use, import, offer to sell and -sell ("Utilize") this software, but solely to the extent that any -such patent is necessary to Utilize the software alone, or in -combination with an operating system licensed under an approved Open -Source license as listed by the Open Source Initiative at -http://opensource.org/licenses. The patent license shall not apply to -any other combinations which include this software. No hardware per -se is licensed hereunder. - -DISCLAIMER. 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 MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER 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. +Copyright (c) 2006-2009, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. 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 MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER 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. diff --git a/sys/contrib/dev/iwn/iwlwifi-1000-128.50.3.1.fw.uu b/sys/contrib/dev/iwn/iwlwifi-1000-128.50.3.1.fw.uu new file mode 100644 index 000000000000..6e7de6131edd --- /dev/null +++ b/sys/contrib/dev/iwn/iwlwifi-1000-128.50.3.1.fw.uu @@ -0,0 +1,5920 @@ +Copyright (c) 2006-2009, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. 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 MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER 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. +begin-base64 644 iwlwifi-1000-128.50.3.1.fw.uu +AQMygLA0AABE4wEAAMAAAHC5AQAAwAAAAAAAACAggA8AAEAAaSAAAGkgQABpIAAAaSBAACAggA8A +AOgAaSAAAGkgQABpIAAAaSBAACAggA8AAIgFaSAAAGkgQABpIAAASiAAAEohAABKIgAASiMAAEok +AABKJQAASiYAAEonAABKIAAQSiEAEEoiABBKIwAQSiQAEEolABBKJgAQSicAEEogACBKIQAgSiIA +IEojACBKJAAgSiUAIEomACBKJwAgSiAAMEohADAKJIA/gAAAwEEsnDBALJwwQiQcNAoigD+AAERZ +CiMANwYPAABKJgBwaSBAAEomAHBKJgBwSiYAcEomAHAAFgBwgAB0BEB4ICBAhwAAAAAAAAAAAAAK +yM9xoADIHw4ZGIALyA8ZGIAMyBAZGIANEgI2AMhEeBEZGIAOyC0ZGIDgfuHE/BzIvvwcSL7hwOHB +4cLhw/wcCLH8HEix/ByIsfwcyLH8HAiy/BxIsvwciLL8HMiy/BwIv2okgBDhxGokwBDhxPHAz3Cg +ANAbFIDPcYAAcAQEIICPz1EE4QChCvIvKQEAz3CAAGAJ8CBAAEB42v/RwMHEayTAEMHEaySAEMHE +n3QEFAs0BBQKNAQUCTQEFAg0BBQHNAQUBjQEFAU0BBQENMHDwcLBwcHAwcRFLH4QCiZAfsHEaySA +FMHEICBAhwrIh7gKGhgwC8ibuAsaGDAMyAwaGDANyIe4DRoYMA7IhSDDDw4aGDDgfuB48cAKyJW4 +ChoYMAvIm7gLGhgwDciKuI24kLgNGhgwz3CAAIgKGIiB4Av0DcjPcQAAbAqsuA0aGDCuDSAAD9jR +wOB+4HjPcIAARJsAgIYg/oEI9A3IBSCADwAAANQNGhgwRPHgePHAz3EDAEANz3CgAKggLaDPcoAA +sAQgggFpAKLeDCABSNjPcIAAxAglgCOBIIHHcQAAiBOGDMAH0fHgeM9wgADECBUEwAfgePHA4gtA +AYDgz3aAAHAEBvKB4Ab0AdgD8ADYC66A4QbygeEG9AHYA/AA2AqugOIG8oHiBvQB2APwANgMrgDY +z3WgAMgfGB0YkAuOgOCKIRAADvIIjoDgDPLPcAMAQA1FHRgQMKUC2BgdGJAD8DGlCo6A4BryCY6A +4Bbyz3ABAETjIB0YkM9wgAAoACEdGJDPcIAAbAQiHRiQGBUAlkUgAAMYHRiQDI6A4AfyGBUAloUg +AQQYHRiQgOMY8gDYlLjPdoAApAQApnHYBrg6D+AA/Nkghs9wAABMHCoP4ACfuRgVAJaFuBgdGJBl +A0ABz3Gqqru7z3CfALj/NqA2oDagNqDPcaAAyDsOgYi4DqFpIEAA/vHgePHApcFBwELBDBwAMRAc +QDHPcYAAfFo0GcAPMBkADywZwA4oGYAOJBlADs9wgAB8WiAYQAvPcIAAfFocGAALz3CAAHxaGBjA +Cs9wgAB8WhQYgArPcIAAfFoQGMAIz3CAAHxaDBiACM9wgAB8WggYQAjPcYAAAFqAGQAIfBnAB3gZ +gAd0GUAHcBkAB2wZAAdoGYAGZBlABmAZAAZcGcAFWBmABVQZQAVQGQAFTBnABEgZgAREGUAEQBkA +BO+hzqGtoYyhLBnAAigZgAIkGUACIBkAAhwZwAEYGYABFBlAARAZAAFjoWogAAPYGQAAaiDAAtQZ +AABqIIAC0BkAAGogQAHIGQAAaiAAAcQZAABqIMAAwBkAAGoggAC8GQAAaiBAALgZAABqIAAAtBkA +AGoggAHMGQAA0NifuM9xnwC4/x2hz3CAAAAAxIBTJcQ1UybFNde6AebTvsSgUyPABAUmjh/Q/gAA +1qEFIIAPsP4AABahGIFTJ841AN2UuBihQMMBwALByXMMFAYwSgpgARAUBzDPcKAAtA+8oE4LQAGG +DeAAqXAI2ADZSg3gAJm5FvHgePHA8ghgAXvYyglgAdfZz3GAAHxaNBnADzAZAA8sGcAOKBmADiQZ +QA7PcIAAfFogGEALz3CAAHxaHBgAC89wgAB8WhgYwArPcIAAfFoUGIAKz3CAAHxaEBjACM9wgAB8 +WgwYgAjPcIAAfFoIGEAIz3GAAABagBkACHwZwAd4GYAHdBlAB3AZAAdsGQAHaBmABmQZQAZgGQAG +XBnABVgZgAVUGUAFUBkABUwZwARIGYAERBlABEAZAATvoc6hraGMoSwZwAIoGYACJBlAAiAZAAIc +GcABGBmAARQZQAEQGQABY6FqIAAD2BkAAGogwALUGQAAaiCAAtAZAABqIEAByBkAAGogAAHEGQAA +aiDAAMAZAABqIIAAvBkAAGogQAC4GQAAaiAAALQZAABqIIABzBkAAOt2z3WgAMgfGRURls9wAABE +HN4IIAEKIMAvWnDPcIAAZBYjgM9znwC4/893gAAAAASHgOEB4NO4JPIZFQKWUSLAgB7yXYNA3p++ +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 +AACfBQXY4fMgwAAcBDCE4Mohyw/KIssHyiOLDwAAowWmB+v/yiBrAYbgAdnCIUoAz3CAAM4GIKih +wNHA4H7gePwciLb8HEi2/BwItvwcyLX8HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzIs/wc +iLP8HEiz4H7geATcON018OB4BNw03TPw4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTdK/Dg +eATcIN0p8OB4BNwc3Sfw4HgE3BjdJfDgeATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c8OB4 +BNwE3RnwNBQaMDAUGTAsFBgwKBQXMCQUFjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHGsCRN +M7AkHzPgfvHASg/P/89zgABUEEODAN/PdaAALCCwhdJq1H5+ZqWmBKYB4owiAoAmpkOjhfcCg+Oj +AeACo30Hz//geADYz3GgAMgfGKEZoQHYDqHgfuB48cD6Du//OXEZcshx6HIB3c92oADIH7OmBd/P +dYAAwA/gpQGlBMBIpQmlFYYnpQqlGIYYHUARC6UZhhQdABEMpaAWABBkpQ2lpBYAEAwdABIOpagW +ABAIHUASD6XPcAEAMoAQpZ4Pr/8k2AQggA8AAAD4EaWOD6//ANgSpVMnwHUTpQHIVB0AFxalEhYA +llAdABcXpRMWAJbPcoAAwA8YpRQWAJZKJEB5GaUVFgCWANkapSQWAJYbpRYWAJYcpc9wgAAoDxCA +HaXPcIAAwA94GIAKz3CAAMAPfBjACs9wgAA8EAQYAAuEGkALz3CgAMgcCICIGgAAqCCAAvAiQwDP +cJ8AuP8B4XagWQbP/+B+4HjgfuB44H7geOB+4HgA2Za5z3CgAKwvPKDgfuB48cChwYtwCgyv/wHZ +QNjmD6//QMC+C4//ocDRwOB+4HjxwAohwA/rcgXYMNuKJMMP1QKv/rhz4HjgfuB44H7geOB+4Hjg +fuB44H8B2OB+4HjgfuB44H8B2PHAag3P/6/BCHcA3s9woABkLvAg0gMZEhA2GRrYM/XYBbh6Ca// +6XEZyM91oADUBxodGJAPFRGWGRUAloDgLPLA5kX3GRUOlvzxABYAQAAWBUAAHEAxIMCc4D/0gcBa +C6//DtkjwGG4Y8AMwIDgDvLPcZ8AuP8aoS3AG6EDwB6hz3AAbAQAGaEPHViUTg7ABQ8VEZbPcKAA +wC9REACGCyCAhMz1z3AAAGQe1g2P/xEgwIPE8xkVAJaA4MD1GRoYNPXYBbjWCK//CnEZyBodGJD1 +BO//r8AKIcAP63IF2IojWgPNAa/+iiQIAOB48cCOCo//lQGP/uB4gQKP//HAfgzv/wDZSiQAcuB4 +qCCAAgAWAkAVIkAwGhiYAAHhABYNQAAWDkCODY//z3CgABQErKDPcKAA1AvcoEIKj/+pBM//4cXh +xiSIz3KAALBApojCuS5iANkPIYEDgOXPc4AA/G52EwIGBfQmenYbmAAc8EV5dhtYACWIFSONA3kd +WBAmiEWIWWF8HVgQIICMIRCARfeKIRAAIKAjuXcbWAAAgCq4eBsYAADZz3CgAPA2LKB5EwEGJaB8 +EwEGJqB6EwEGJ6B9EwEGKKB7EwEGKaB+EwEGKqB3EwEGK6B4EwEGLaB2EwEGJKDBxuB/wcXgePHA +4cWiwYt1qXDCCa//AtmpcNH/egmP/+kD7/+iwOB4gODxwAf0z3CAANRwgg5v/yTZ0cDgfuB48cBS +C+//mHCQ4Mohxg/KIsYHyiBmAcojhg8AAFUDbACm/solJgQA2kokAHTPd4AAyASoIAAPQCyDAVV7 +QCyNAMdzgADwXyCDz3CAAChdtH3duaBgIKPxuNEhIoII8qCLz3aAALhArWaB5Qv2z3WAAPBeFiUN +EaCNUSUAkAPynrkS8C24wLgVJwAQA4BSIU0CCyBAgwnyz3CAAIgKCID+uO/zn7kgowHiEQPP//HA +lgrP/wAWEUEAFgBBz3GAAChdQCmAIBR4AWGiwUEpQANTIBIATCEApMohxg/KIsYHyiOGDwAAGwWu +ASYAyiBmAVEhQILKIcIPyiLCB8ojgg8AABwFBdjH9M9wgADwXhYgQAQacIIIr/8C2c9wgABwXxYg +QARyCK//AtlAKZMhACOAL4AA8F9eCK//ENmLcFYIr/8B2QAjgC+AAPBf2gygCRDZARCAIJDgyiHK +D8oiygfKIGoByiOKDwAAPwXKJGoAHAdq/solSgRKJAB0ANioIEELFSMBIM9ygADwXzAiRQAEJYOP +AAAAAQQcQDFL8iHGz3GAALhABCWNDwYAAABBLU8UymGg5lln0SXhgg/ygOME8oHiDfYEJYQPAAAA +JAwkgI8AAAAkA/QA2ynwguc994LnBfSA4/nzguL39YDjA/LM5jP2gOMF8oHiw/aA5e31z3OAAPBj +ZpNwcif2USXAgg7yz3OAAAyehCoLKjAjQg4EIr6PAAYAANnzAdtvewPwAdkocwQlgg8BAADALrrP +dYAA/ENKZVBxAdnCIU0AgOPMISKAEvIB4AIQgCDPcYAACEEIYYHgHfIKIcAP63IF2IojlQUR8M9z +gAAMnoQqCyowI0QOCiHAD+tyBdgBBm/+iiPVBEokQAD1BW/+SiUAAAMQgCAIYYLgyiHCD8oiwgfK +I4IPAABYBQXY7fUqcFH/z3CAAHBfFiBABECQz3EAABgVCSJBAIIOb/8gsMEA7/+iwPHAz3CAAMgE +igiv/wLZag5P/wsFz//geOHFMmg0ec9ygAAoXSFiz3KAAAyeLbnAuYQpCwowIkEOUSEAgM9xgACA +iEGBxSKCDwAACgLFImEDSiQAdADbqCDAAjZodXkAIY0PgADwX0ClAeMO2c9zgADwXhYjAgAgqgDd +oaoB2SKqA9kjqkokAHGpcqggwAF5YhZ5pKkB4uB/wcXgeE0Dz/9JA8//8cAAFgBAgeDPcYAAZBYA +oQ30ABYAQAy4BCCADwEAAPABoQAWAEACoRHwguAAFgBAC/RGIMIAQ6EAFgBAz3CgANAbXqAD8AAW +AEADzNdwAAAAQMohiw+ArggAyiGKDwCuCADscCCgAcjscQChTgxv/wHYANnPcKAARB01oPsDz//x +wOHFABYBQKHBQMEBFIAwUSAAgAXyz3KAAMB5BPDPcoAA2HkgomCKAdkI8AAWAEAVIkwAAKQB4X14 +EHH491EjAIAI8gAWAEEVIkwAAKQB4YXhAN0H9xUiTAAB4YXhoKT7989xgK4IAOxwIKAByOxxAKG6 +DG//AorPcKAARB21oEUHr/+hwOB48cDhxQAWA0DPcYAAAABgoQAWAkAA3UGhABYAQP+7AqEAFgBA +A6GkoRDy/7pA2M8g4gfKIIEPAADQAM8g4QfPcZ8AuP8doQbwz3CfALj/vaDPcYCuCADscCCgAcjs +cQChUgtv/wHYz3CgAEQdtaDRBo//4HjxwOHFz3WAAMgEBG0qDm//CNkBhc9xoAC4HgKhAoUDoTYM +T/+lBo//8cDhxaHBAN1AxQAWAUAAFgBAgeEN8s9xgK4MAOxwIKAByOxxAKHscKCgqXAT8N4J4AmL +cAHaz3GArhAA7HAgoAHI7HEAoexwQKAAwexwIKBIcMYKT//PcKAARB21oIDx8cDCDY//CiYAkM93 +oAAUBDpxOfIvKIEDTiCNBxkaWDNAJQAUSiAAIA8gECD12AW4vglv/6lxGcjPcqAAwC8Kp89xoABk +LvAhAQAJh4DgD/RREgCGCyBAgAn0z3AAALAecg5P/wsgAIQE9HIPoAUqcBIM4AGpcADYDyBAAwYm +DpDK9QfYugigBBkaGDAZyAqnkQWP//HA4cUBEg02ABYAQQAWAUHFuIK51v8mC2//ARpYM5EFj//g +ePHABg2v/4DYz3agAMAvpRYSlhQWEZYA3aUeWJPPcqAAZC4UHliTLysBAE4jgQfwIkMAZX0A2w8j +QwAGIMCA9fVPJcAWpB4YkKQWAJb/uP7zoxYAlgQggA8AAAAPjCAQgPjz89gFuIDZzghv/5+5GRIQ +NvXYBbjCCG//B9kH2M93oAAUBAqnGRoYMATwA9gFpwmHgOAb8oDg+vNBKIGACvIvJElw4HioIIAB +ABYBQOB4UyBAgAnyLyQJcOB4qCBAAQAWgEDgeAmH5/H12AW4aghv/wpxKB8AFIDlGRoYNBLyLyhB +A04gggcVJoEQFhEAhioZGIAA2A8ggAAGJQ2Q8vWA2c9woADQGzCgpR6YlBQeWJRRBI//4HjxwO4L +r/8X2bfBSiFAIADfKgpv/4twDBSQMM91gAA0BUwgAKTKIcYPyiLGB8ogZgHKI4YPAACnA8okRgT0 +AGb+yiUGBCDAUSAAgFz0EsDtuAXyz3WAADgFKndAKI4g1H7HdoAAKF0AhlEgQILKIcEPyiLBB8og +YQHKI4EPAAC1A8okYQCsAGH+yiUBBAHAAsEKcmoMYANmboDgMPL/2AeuSiQAcQDYqCCAAwllACCC +D4AAqFwWIgIEJKoJZQHgIKoNFIAwRSDAAA0cAjCKIP8PU8AAhqm4AKYBFIAwz3GAAKgECK4CFIAw +9XkJrgCBDyAABAChAd8D8ALfCnCp/g/wQCiOINR+x3aAAChdAIZRIECCyidBFMonIhKB5xgCAgAQ +FAIxE8FIcIYg8w9CKBICAIYSwyZ4ZHkleACmANnPc4AACF4WIwME9bggoyGjBfQA2Yu5IaP2uAXy +AYOFIAEOAaPruoohwy8D9B4UkTANFIEw5bkE8lgUADEFtuC5rPIAhu24BPLPdYAAOAXjujz067gV +8v/YB65KJABxANioIIADCmUAIIMPgACoXBYjAwREqwplAeBAq1zwTCIAoY72CiHAD+tyBdiKI9AG +SiRAAGEHL/4KJYAE7roHjjIlghQAIoMvgACoXBYjAwQI8kSrBNoAKoIERXgHrj/wQKsPIIAEZvBM +IQCkkPaMIcOvHPIKIcAP63IF2IojUAxKJEAAEQcv/golQATSCKADi3AQFAIx7roF8gIUgDAJrgTw +ARSAMAiuAIbruBvyDRSBMADaSiQAcUeuqCCAAwAigA+AAKhcFiAABAQYQgQAGEIEAeIBFIAwCK4C +FIAwCa4s8EwiAKHKIcoPyiLKB8ojig8AAFEEPAfq/8ogagENFIEw7roHjgAigi+AAKhcFiICBAry +BBpCBATaACqCBEZ4B67d8QAaQgQA2g8iggRGeAeuARSAMAiu4bkF8lAUADECtlEhAIEH8iPAzgqg +A1UUgTANFIAwUSDAgB7yNcFWFAIxCnAmC6ADEsO4cIwgAoDKIcEPyiLBB8ogYQHKI4EPAACcBBAG +If7KJGEAUSXAgconIhEKcF79z3GArggA7HAgoAHI7HEAoaINL//pcADZz3CgAEQdNaD1AK//t8Dg +ePHAmgiP/6TBAd2BwNIOL/+pcQDeTfCCwMYOL/8C2QLAi3ImCGADA8GkeC8lB5BA8gDAANnPcoAA +KF0PIQEAArgUeABiz3KAAEgFYIIyfy24UyAQAAQnwJAAogf0gOOQDmIHyiAiCCDA7gmgAxDZAMIA +2DJqNHkAIYMPgAAoXYohCAACsyCjz3GAAKgEFSEBBGCBZH/goc9xgAAIXlZ5AKEBoc9xgADoXVR5 +ALEB5iHAEHZmB8X/z3GArggA7HAgoAHI7HEAobYNL/+pcDEAr/+kwOB48cAKDwADyg0P/2sEj//g +ePHA4cXPcYAADJ7PcoAAqATwIg0AhCgLCjAhQQ4EIYIPgAAAAEQhAwIvuga7BCGBDwABAABFe0Ep +QgMsuWV6JXrPcYAAyAQVeQOBEHIN8oDlQ6EL8i8pQQNOIYAHECUNEAL9gOX49c0HT//gePHAosGL +cC4PL/8I2QDAgODPcYAAmAQAoQfyBhQAMQOxBBQAMQKxLg0P/6LA0cDgfvHApMGLcP4OL/8Q2c9x +gK4IAOxwIKAByOxxAKEAwFEgAIADwAb0AsGGDeADANoF8B4PoAQBwdYLD/8A2c9woABEHTWgpMDR +wOB+4Hgw2c9woABQDCKgwdnPcKAABCUgoOB+4HjxwL4OT//PcAAARBy2Dy//AN5x2K4PL/8GuM9w +AABMHKIPL/8I3c9wAADIG5YPD//PcAAAzBuODw//z3AAAAgcgg8P/89wAAAEHHoPD//PcKAA1As4 +gByAz3CfALj/WBgACAAmgB8AAMAbWg8v/wTmYb2A5Tf3AN4F3QAmgB8AAAAcQg8v/wTmYb2A5Tf3 +nQZP/+B4z3GgANAPGREAhhwRAIbPcKAAyB8VEAKGHoDPcKAAxCcZEAKGnBECABUQAoYtEAKGLhAC +hi8QAoYwEAKGgBECAIQRAgChEAKGkBECAKIQAIaUEQAAmBEAAIwRAACIEQAAGIHPcZ8AuP9YGQAI +z3GfALj/WBlACM9woADQDzuAOYDPcaYA1AQXEACGLBEAgDARAIA4EQCAz3GgAIgkAIEBgQKBA4EE +gQWBBoEHgWDx4HjxwOHFz3WAAPhwqXCqCy//A9kBhc9xoACAJQyhAoUNoQCNUSAAgADYjrgE8g+h +A/AQoUoLD/+5BU//4HjxwDYNT//PdYAA3AQAhc92gAAwc+SQ6XGyCeAChiH8A1EgwIAacAXyH4aA +uB+mIIUAkThgAKVUFoAQgOAV9OlwagygBYYg/AOA4AzyUSAAoAvyz3CAAIgKCYBRIECABfQfhoK4 +H6Y1BU//4HjxwM4MT/+iwc9wgAAwcz6ABCGBD///D9AEJYBfAADwLyV4z3WAADBzfgygBR6lgODK +AiEAmB0AEM9xgAAAAACB67ga8gGB67hA2M8g4gfKIIEPAADQAM8g4QfPcp8AuP8dogSBAeDTuASh +BSCAD9D+AAAWolElwNEG8s9wgADcCgKIBvADhfYNIAMkhT6FRCECDKDilB0CEAT0gNiUHQIQUSDA +gUAoAgYV9FEigNOCuhnyRCI+0wz0z3CAADBzAYBRIACABPJyDYAFHfBuDoAFGfCzuT6lUSKA08Ui +gg8AAAAHz3GAALxzKIlFIgAGhiH9D1IhwQFFuSV4z3GgAIgkEKGKIdYAz3CgAIAlL6DPcaAAxCdB +EQCGUSLA088g4gLQIOECQRkYgM91gAAwcwCVBCCADwAAzIDXcAAAyIAJ9AuFUSAAgAXydgzAAlHw +HoXzuFQVghBD8k3YCbgaGRiAgOIH8gHaz3CgANQLUqAE2BAZGIAF8O4N7/6KIEUCUSCAxAX0USEA +xvfzz3WAADBzz3agAMQnLhYBlhaFInhkuBB4hh0EEM9xgACICgoKIAYvkRoWAJYEIIAP////ABoe +GJARFgCW67gT8gDYi7gTHhiQGtgZHhiQC/CA4gbyAdrPcKAA1AtSoATYEBkYgB6FUSCAgY7yFJVR +IECBivTPcKAALCAPgIDghPQQ2EHAz3CAAESbAIBRIECABvJRJUDTAdgD9ADYQMALhc9xgACAmotz +BCCAD8AAAADCgTa4ESYAkIHCQCEECy/y4ZXHgXC/9CQAAAgmzhMQdk4ADACUFYAQUSDAgSH0z3ag +ACwgD4aA4Bv0xoYclRB2yffPcIAA5HvCgAWBEHYP9IDjA/IC2ACjA4GA4oO4A6EF8gCCprgAogHC +DfADgeO4AcIJ8gDenr7Pc6AA/ETBo6O4A6ELhQShA4UFoVQVgBCA4AbyAMCC4M8iYgED9Ie6QcJV +JUAaz3OAALAyvgtgAQDBH4WUuB+lHoWQuB6lDPDPcYAAfGQNgQHgDaEQ2c9woACQIz2gJQJv/6LA +4HjPcKQAkEFNgM9xgAAYfUKxGoBRIEDGA7EEIIAP/wAAADC4BLHPcIAAGH0A2gjyz3GAADBzMYFR +IYCCBfJCsEOwRLDgf1Ww4HjxwG4JT//PcIAAMHMOkM9ygAAYfQCyz3CmAOj/C4DPdaQAtEUDogwV +A5YNFQGWz3CAADBzRBCOAC8mxwD/2BC4yXSEJAOcBCMHAAT04L4t9DIVAJZTII8A/2cBsv/Y9H8I +uO9/ZHhALwQSACQFAAAmxgMFJYUBQC8AFgQjgw8A/wAAQC8GFBtjACeHAf/YBSXFAQi4BSNDAQQh +BQD5YQAlAAEFeeWyb3gEI4MP/wAAACi7ZXgveQOyJLIEFQCWArLPcIAAMHMRgFEgAIIM8s9wgAC4 +QMhggeDG9s9wpgDo/w2ABPAA2AaiBaIA2EokgHAG2Y25qCAAAynbErvwI00AQCIDCxV7AeGgowHg +yQBP//HATghP/89xoADIH0ARAAbPcqAA0A8ZEgCGz3OgAMQnTxMPhtiBz3CAAICayKAPzBB3z3aA +ADBzAN0G8h+GUSCAgAXySiFAIATwDxrcMzp1UhMThhUTD4Yb2BYbGIDjvwb0USNAoMoiQiMH9B2G +SiJAIIS4HabkvwXyVBaAEIDgA/IadQbwHYZKIEAghbgdpkwiAKDMICGgVfLPcJ8AuP9YGAAIUILP +coAA3ApPilagANrPcKAA/ESeukGgpaAehrC4HqaoFgAQZOAeoRDYDqEB2BUZGIA2De/+CdhRIEDH +CfTPcYAAKA8LgQHgagrgAQuh0g2AAUwgAKAM8s9xgAD4ZAWBAeCSDqABBaH/AQAATCIAoM9xgAAw +c1LyHYFRJ8CQhLgdoc9xgAD4ZAXyAoEB4AKhBPABgQHgAaH2CcABPvBCEwCGBCC+jwDAAAA48gG2 +HobzuDDySgsABgCWhiD8AIwgAoAs9J4JAAaA4Cj0C/CA5QX0z3CgACwgsIB2Ce/+iiCEC1EgAMT1 +9YDlDvLPcKAALCAQgM9ygAAoDy+CongwcML3D6ID2c9woADUCzGgBvAAlv4KIAc0ls91gAAwc1QV +gBCA4CHyz3KgAPwlNILPc4AA+GQGg4DhOGAGowbyAd7PcYAAqQjAqVOCJ4OA4FlhJ6M+hdEh4oEZ +8gHZz3CAAHAFIKAT8FEjAKAT8s9wgACpCAHZIKjPcoAA+GQDggHgA6IehVEgwIEC9C7w6PEA3Qvw +gOUF9M9woAAsILCAsgjv/ooghAtRIADE9fWA5Q7yz3CgACwgEIDPcoAAKA8vgqJ4EHFC9w+iA9nP +cKAA1AsxoM9xgAD4ZASBz3WAADBzAeAEoR6F8LgK8pUVgBCkFQEQqXLaCGACAdsE8KILgAIfhVEg +AIAH8s9wgADweTYMQATPdoAASIEZhoDgBfI+CYADANgZps4MgAHPcIAAiAoIgOu4DPJMIQCgCvQE +/89wgAAYfTTZdgnv/sTaHoXwuNwJggPPcIAAgJoAgIDgHAviC8ogYgCdBQ//4HjxwD4ND//PcYAA +3HPPcIAA3AQgoADZz3CAAKxzKaDPcIAAgJokoCWgz3AAAP8/z3GgAAwkAaEb2AShUSAAxM91gAAw +cw/yHYWEuB2lz3CAALQEIIAFgQHgWgugAQWhWwIAAEQVgBDxhcK4BCePHwAAAAhUFYIQ+3+A4s92 +oADEJwDZFfLg2r8emJCU2pUdghAE289ygABEBWCiAto8HoCQz3KAAOR7IaIH8EDZvx5YkNTZlR1C +EAAgkQ+AAOydvBGBIAAgkg+AAIihCBKAIAUh0wNOC+ABBSDQA4Dg2gEBAAHYEB4YkMQRgCDPcYAA +LHrleBulbBWAEMO4HHj0IQAAZB3AFF4dBBAQEoAg5XgcpXAVgBDDuBx49CEAAGgdABTPcYAATHpg +HQQQZBWAEMO4HHj0IQIAih2EEM9ygABcevQiAACOHQQQaBWAEMO4HHj0IQEA9CIAAIwdRBCQHQQQ +EMyGIP+FJAzBAc9wgACICgiA67gkCsL/G/DPcYAA8HsAgWOBQ6FmeAChBIEMFQGQEngleAwdAJAA +2I+4Ex0YkIogvw8IHQCQGtgZHRiQQg+AAc92gAAwcx2GUSDAgX30z3WgAMQnERUQllEgwKMA2tX1 +USBAohv0USCAoy70USAAoFn0USDAoGnyCNgTHRiQCgnAAYDgX/QC2DwdAJAjhs9wgADkeyGg0/GD +/aAWABCRFQGWAeDDuTBwoB4AEMn1iiIIABMdmJCRFQCWw7gQcb/zEh2YkL3xOhUAllEggIAc8s9x +gADwewCB4LgW9IC4AKGKIP8AAdoEoUOhOhUAloYg/wEDuAGhDBUAkEYgAA8MHQCQCB2AkADYjrgT +HRiQUSUA0JXzBNnPcKAAkCM9oI/xfP0C2DwdAJAjhs9wgADkeyGgHobzuIPzEx0YlJH+A/ATHRiU +4QIP/1QWgBCA4Aj0QhUAlgQgvo8AwAAABfRRIACiEPK/FQCWpbi/HRiQiiAEABMdGJBCCMALVBaA +EIDgX/VRIICgDfQKIcAP63IF2IojjAKKJIMPfQev/QolAATPcIAAgJoqgM9woAAERCagxfHhxc91 +gAAYfQelKKV0tUmlAdgVteB/wcVKJEBzANmoIIACANrPcIAAGH01eECgAeHgfuB48cD2CQ//Fgkv +/wDdz3CAAAAAoKDPcqAAyDs9gqKggOGhoKOgA/QA2QrwJIDXcWWHIUP79YohhAAgoCGggOGkoA3y +0Nmfuc9wnwC4/z2ggtgUos9wAIARFA6if9jPd6AAyB8ZHxiQAdgIcQhyrg2v/Qhzz3CAABQA13CA +ABQADPIKIcAP63IF2GDbiiSDD6EGr/24c892oADQD7WmIglABsILz/5A2c9wnwC4/zKghgrP/oDZ +z3CgABQELKAdHliQSgsgBgPeHgiABV4KIAYA2BILgAjPdaAArC8YhZq4GKUR8OB44HjgeOB44Hjg +eOB44HjgeOB44HjgeOB44HjgeOB4Yb6MJv+f7fUYhbO4urgYpQfYSB8YkKoJj/4WDEAImgtACCYJ +QAkahcC4geAB2MB4LyYH8AbyYgjgCAHeBvAD3hiFmrgYpRYJj/7qD4ACxgpAA89wgAA0BTYO4AIE +2QIKAAO+DEADyghAB24OgAYKDQALLg6AC1oPgAumDs/9iiDGDc9xgACICg2xA9htGQIAG9nPcIAA +XCNSCyACMKiGCY//Dg6AC2YKD/8+DwAMJgyADAYJgAmWDK/+yXChAA//4HjgfuB44H7geOB+4Hjg +fuB44H7geOB+4HjxwAohwA/rcgXYWtuKJIMPQQWv/bhz4HjxwP4Pz/4acCh3z3WAAIgKFJXPdoAA +AGQQuCILYAcApoDgyiciEM9xgK7kAexwIKDscQAZAAQIhVEgAIAE8gCGgbgAps9wgACsBgCIgOAF +9ACGg7gAps9woAAsIBCAgOcA2m0eGBAe8gCGYhYPFslzYxYEFoC4AKZIcQfw7HUApQQbkAAB4ffh +AIO6989xoADUCw2hQKNiHtgTYx4YERDwyXNIdQXw7HEAoQTjAeX35QCDu/fPcaAA1AsNoaUH7/7U +HoAQ8cDhxaHBCHXSCO/9FNjPcIAA4AQAgIDgD/Sd2AAcBDAPzAIcBDAB4BB4j7gPGhwwAMCpccL/ +vgwABX0H7/6hwADY4PHxwOHFABYNQAHIUyUBELv/USVAkM9xgADgBAHYyiAhAFEH7/4AoeB48cDh +xc9xpwAUSADbaKFHgc9wgAAEcV6gUIHPdacANERfoGehz3LzD//8UKF2oaDZmrn1HVgQz3GlAAgM +CBEFAEwlAIDKIcIPyiLCB8ogYgHKI4IPAAAGA7ADov3KJCIAz3WkALg9mxUCFlqgphUCFlugkhUC +FlygoxUCFl2gUNpCoZsd2BD/2aYdWBCSHVgQox1YEM9ypADs/89xAAD//2eiJqIB2c91oADIHDGl +iiHEAM9yoADsJyaiKoJkGEQAz3AoAAIBBqJxpYEGz/7gePHA4cUIcgHdgOHKIcEPyiLBB8ogYQHK +I4EPAADEAMokIQAYA6H9yiUBAYDiRPZTeool/x+A4UT2M3mzfRQhgABaDCAFO3mseDEG7/4vcOB4 +8cCiDc/+OnBacXpyGnMA2s9xqwCg/1mhB9gaoVihIN/PdaAAyB/wpQHeQx2YEwDYLguv/o248aXP +cKcAmEfaoOIN4Age2M9xpwAUSB2BvoEAGwAgABhAI/e4xSCCDwD/AADTIOEF973FJYIfAP8AANMl +4RWKIRAAzv8IdqlwiiEQAMz/ABmAI3EF7/4AGgAg8cAiDe/+ANnPdaAAtA98hTylz3KAAARxZBIA +Ac92oADsJxC4hSCEAAamHoLPd6cAFEgHpx+CEKfPcKUACAwioPqCz3CkALg9mxjYA/uCphjYA/yC +khjYA12CoxiYAM9wpADs/yagiiCKAAamfKVaDqAAAdgVBc/+8cCGDM/+z3CAAPBjB4iA4GgEIQCq +wc9wqwCg/2QQFgDPcKsAoP9oEBcAz3CrAKD/YBAYAAfeaf8A2c9wqwCg/zmg2qA4oO4PIAgB2ADY +z3GnABRIDKENoQ6hD6HPcAAAASrPdaAA7CcGpc9wpQDoD8egz3egAMgfINgQpwXYQx8YEADY0gmv +/o24INgRpwHZz3CgALQPPKDPcAAAAi8Gpc9wAADCMAalz3AAAEJIBqXPcAAAAkoGpc9wAAACYgal +z3AAAMJjBqVKJAAgz3CAAPBjJJAFkEQpvgcYYBV4FSQBJSdwGWHHcYAAdBYDEZIABBGVAAERkAAC +EZMAAIkQuAUggA8AAEItBqUAiRC4BSCADwAAgkYGpQCJELgFIIAPAABCYAalINgQpwXYQx8YEADY +Jgmv/o24INgRpwDYEPDPcIAAeG8WIEAERBiAAUGGSBhAAVegOKBAIUAgOnDPcIAA8GMGkDJwegIO +AM9xpwAUSFwZQARAKAAkTyBBAIe5ibkmpQhxhSGLACalhSCMAAalTCEAoBTyTCFAoBzyTCGAoCb0 +QCoAJAUggQ8AAIJgJqUFIIAPAABCYhnwQCoAJAUggQ8AAIItJqUFIIAPAABCLw3wQCoAJAUggQ8A +AMJGJqUFIIAPAACCSAalINgQpwXYQx8YEADYXgiv/o24INgRp4twgcGIwonDPP8IwUApQCEAII4P +gAD8bgnAIKYBpgDAGKYBwBmmQCsAJIUgigAGpSDYEKcF2EMfGBAA2BoIr/6NuCDYEaeCwIPBiMKJ +wyr/CMBMIQCgAqYJwAOmAsAapgPAG6YU8kwhQKAc8kwhgKAm9EAtACQFIIEPAACCYCalBSCADwAA +QmIZ8EAtACQFIIEPAACCLSalBSCADwAAQi8N8EAtACQFIIEPAADCRialBSCADwAAgkgGpSDYEKcF +2EMfGBAA2I4Pb/6NuCDYEaeEwIXBiMKJwwj/CMAGpgnAB6YEwB6mBcAfpiDYEKcF2EMfGBAA2F4P +b/6NuCDYEadAKAAkhSCKAAalhsCHwYjCicP5/gjABsMEpgnAfKYFpgfAAMEdpgLAAiBCAATBW2MC +I0WAOvIieEx4L3Cocdr+AsFALI4g1H4VJk4UAnnHdoAABHEBwAPCIaYHwwIiAQAFwDtjAiMFgCry +Anosei9wqHHN/gPCBMMCIgEAAsAnpgIjBoA0HoARIfIFwAIghYCwBeL/TB5AEQohwA/rcgXYiiOF +DAjwCiHAD+tyBdiKI8UJLQZv/Yokgw8KIcAP63IF2IojxQr28QohwA/rcgXYiiPFC4okgw8JBm/9 +CiWAAUAkVCBMJICg5ATF/wDYz3GgALQPHKHk/spwz3GrAKD/GaFoGcAFYBkABkokAHEA2KggAA0I +cYAhgg0weQa5gbmXuSalCHGAIUIPMHkGuYG5l7kmpQhxgCHEBjB5BrmBuZe5JqUIcYAhhAgweQa5 +gbmXuSalCHGAIYYAMHkGuYG5l7kmpQhxgCFGAjB5BrmBuZe5JqUB4FEA7/6qwOB48cAaCO/+mHCh +wc9ygADkBCCKz3OAAARxAYKAEwMAkHHMIMGA6vJwcAbyz3CAAAByOYggqkokwHBKIAAQqCDAAs9w +gAAYcjIgAAKQcAPyQCBIEEwgwJCkAQYAz3CAAAByGYiQcAb0BCEBAS8lRwAG8AcgAAEvJQcAYaIA +289woAC0D3AQEgB8oAAaAgEU8EAggCEQeAa4gbhAKQEkJXgGpkAjgREweQa5gblAKgAUJXgGpgHj +z3CAAPBjBpAQczIBBgAA2Q8hwQALIUCBAdjKJwIADfQLIQCB7fPPcIAAAHIZiJBw5/MKJwACgOMR +8oHjZ/KC4wb0iiCGIIohRgIM8AohwA/rcgXYiiPODGTwttq92RpyeXHPdqAA7CdKIQAgSiQAcQoi +QBQqdagggQIAIEEjVGtALwABFHgaYrV6x3KAAHxxBpIweUApiQFPIUEQHH8Qv+V5JqbAuLh4BSBA +BC8hCCAAI08TB5Lwfwa/TydGEBx5QCkTBAUjgSEmpsC4uHgFIIECLyJIEEUhwBAGpgqGi3EAsQaS +LyYBAAAUADHQcBT0RSfPEOamCoYAsQeSABQBMRx4MHAU9AHlafGKIsQGiiGECKfxCiHAD+tyBdiK +I88BSiQAAIkDb/0KJQABCiHAD+tyBdiKI08C9PHPcaAAtA9wGYAEeQav/qHA4HgA2c9wgAAAcjio +Oajgfzqo8cDyDY/+rcHPcIAAiAoIgM91gAB0FsC4QMDPcIAA8GMkkAWQRCm+BwDBGGAVeCdwNXk4 +YBllI4lBwRllJIm4YAKIQsFDwM9wgAAEcWYQAQHPcIAAqAZAkFBxSiAAICj0z3GAAFwjDYmGIP8B +e2jPcIAAAHLYiAIjg4POiS+JyiNiAIYm/xH7btmIGoiGIf8BQ7kOJs6TyiZiEA4gQIDbfsogYgDF +ewK4ZXgD8AfYgOCEAyEARMDPcKAAtEdHEACGgOB0AwEAz3GAAFwjDYnPc4AAAHKGIP8BQ7gYqw6J +hiD/AUO4GasPiQDZnrmGIP8BQ7gaq89wgAAEcWYYhADPcKAAtEdTGFiAkP3PcIAA8GMlkESQz3eg +AOwnAMA5YTV5RCq+BxV4J3EZYShlELgFIIAPAABCLQanKGUQuAUggA8AAIJGBqcoZRC4BSCADwAA +QmAGp89wpwAUSAyAz3EPAAD8z3WAAARxRcAAwAK4FHgeZQAlBRAaZRtlACUEEB1lCYXBhhwVBQAF +xWiDgOVCggwUBAAb8gq+JH6odcm9xX3PdqcAFEitpgq6RHnJu2V5z3KnABRILqJALIECBCGBDw8A +APzJuCV4GvBALY0CJH3JvsV9z3anABRIraYKu2R5ybpFec9ypwAUSC6iCrgEIIAPDwAA/Ihxybkl +eM9xpwAUSA+hSiEAIAPYRsAKIwAkBMARIECE6AEBAM9xgAAAcgAhQAQYiCJxR8HPcaAAtEdgGRiA +ELibuM9xgAB0iCCJn7iA4QHZwHkPuSV4z3GgALRHXxkYgAbwVg4v/oogiADPcKAAtEdxEACGBCCA +Dw4AAAAxuIHg8vMA3gPwAebPcIAA8GMGkBB2dAEGAAfAGIgRIICD9PMBwQLAgOYCIFkAAMACuBQg +GADPcKcAFEjXoArygeaf8oLmCvSKIIYAiiFGAgTwtti92RpwenFKIgAhSnUVbkjAYb0DwRVtJXgQ +eBC4hSCKAAanACUAFBB4BriBuJe4BqcAJcAUEHgGuIG4l7gGp0AggCEQeAa4gbgGp0AjgCEQeAa4 +gbgGp4nAisGLwozDUf0FwIDgEvKKwUCBicAAgInBQKGKwQChi8AggIzAQICLwECgjMAgoAjACcG2 +eAAglg+AAPxuCsDwHkAg9B4AIAghgA///wH/LyRAJgQsPiAVIJUzACWAL4AABHEtgC9wJf0OIJcP +AAAAAQrAiCB8AAQoPgUAJYAvgAAEcTOAL3Ad/Q4ggg8AAAABCSeBLwAA/wEJIoAPAAD/AUghAQBI +IAAAVB5YIFUeGCBUbkApAyF0e3pitXrHcoAAfHFCIlIgTCIAoCay7gbt/weyRvGKIMQGiiGECGjx +BsBhuIDgQCFRIAwG7f9GwFYIwAQ6/Qbwmgwv/oogiADPcKAAtEdxEACGBCCADw4AAAAxuIHg8vP9 +Aa/+rcDgePHAocGLcL4Jb/4E2QDAUSAAgCQNgv8AwFEgQICoC8L/AMBRIICA4A0CCQDAUSDAgEQL +AgkAwFEgAIEECMIERgtgAAHYz3GAruAB7HAgoAHI7HEAoc9ygAD8bookgX0A2aggwAHwIkMA7HBg +oAHhXg4v/gDYocDRwOB+4HjxwGIJj/7PcKUA6A8HgM9ypAAMQlMgBIBEII0ARCADAQKCz3YPAAD8 +CHHJucR444IquNh3xH9BL4US5IJTJkYC6XLJuuR+Kr4G8p7hhPeMIU+IxPcA2QPwAdlMJACABPKe +4ET3ANgG8IwgT4g89wHYgOUbeCV4BfJMJoCHQ/cA2QXwjCZPiD33AdmA5QK5BXkE8kwlgIdE9wDY +BvCMJU+IPPcB2IDjA7gFeQTynuJE9wDYBvCMIk+IPPcB2IDjBLgFeQTynuZE9wDYBvCMJk+YPPcB +2AW4JXhCIACA7QCv/sogYgDxwIIIj/7G/4DgCfTPcIAAgAUAgIXgrgAFAM9yoACsLxqCwLiB4AHY +wHgvJgfwAN1J8s9wgAD8cSiAz3aAAJyIAeFghiiggOMjhjV4BfIpgAHhKaAE8DeAAeE3oBiCmrgY +on3+GIKzuLq4GKK2DwAIoab6CmAAoqYF8JoKL/6KIIgAz3CgAHhFAIAEIIAPDgAAADG4geDz889x +gACICkiBNJFTIgAAqg/v/QHbFg+AB4DgCfKa/4DgBfJOCW/9D9gE8FoJb/0P2CUAj/7xwKHBAdhA +wM9wgADQFgqAUSAAgMogAgfKIoIPAABnAJALIv7KISIBocDRwOB+4HihwfHAfg9P/qPBCHZHwM91 +gADQFhuFOoX8hSR4BH8HJ4+TQcdH8gQUATGA4RnyHBQAMQsgQIAN8s9wgABoBWCAz3EAAGBiDNhg +ewPaCfCA4Af0z3CAAGwFIIBgeQzYBhQBMYDhGfIeFAAxCyBAgA3yz3CAAGgFYIDPcQAAYGIN2GB7 +BNoJ8IDgB/TPcIAAbAUggGB5DdgLJ4CTBvJuCG/9BdgI8IDmBvR2CG/9BdjJ/9ylCNw3B2/+o8Dg +ePHAvg5P/gh3BYFAgQDdIN7IuBC4yLoFIJAAAYEmgci4yLkQuQUhEQAA2A8gQAMLIACgDfLwJ0ET +gOEJ8gQgQARCIACAYHnKIGIAYb6A5gHlLPfNBk/+4HjxwG4OT/7PdYAA0BYlhUCFyLnIukApAwQF +I4OARoUhhci6ELrIuQUiRgBHhSKFyLoQusi5BSJFAEiFI4XIusi5ELoFIkQAI/IvKcEA4IBOIY4H +ANoPIoIDUn4EIoEBxH8lf+Cg+oXEf+V5OqU5hQQiDwEEIkIBxHnleTmlOIXEeQQjg4NFeTil4PVN +Bk/+4HjxwNYNT/6iwc9ygADQFhqCO4IEeRyCVSJDBwQgUIBKIQAgJfJMIQCoRvcRIECkwCFhIPrz +8CNABFwaQASA4MohwQ/KIsEHyiBhAcojgQ8AADACyiQBBMACIf3KJUEEQHgA2A8gQAQGIBAgCnB8 +/8kFb/6iwPHAYg1P/qfBOnEackDAANhhwAHYBRwCMAYcAjCLcI4PoAiCwQXBCnAjIEAEBsIEwIDg +DfQKIcAP63IF2IojhAaKJMMPXQIv/bhzQHh1BW/+p8DgePHAEg1P/hpwKHVId2h2OGNuCC/+ZtmB +4An0CnC+Di/+qXHpcMoIL/7JcU0FT/7gePHA4cWjwQHYQMDPdYAA0BapcLoML/5c2TqFG4UkeDyF +BHmBwEHBlf8BwRuFJHhBwFUlQB+pcXv/z3CAAEgYQCUBG3j/i3CCDi/+BNkBwEb/AIWA4AX0BYWA +4NwMwf8BBW/+o8DxwIYMb/4A2s9zgADQFjuDuoMA3g8mDhCkeQQmQBBCIACAyiBiAC8mB/AB3cog +gQAG8hyDJHjFeDL/qXC1BE/+4H8A2PHAOgxP/s9wgADYBQCAgOBMCcIGz3eAAAAAAIdRIMCASiAA +IBryAYdRIMCAQNjPIOIHyiCBDwAA0ADPIOEHz3GfALj/HaEEhwHg07gEpwUggA/Q/gAAFqEQzOC4 +AN498s9xoADIH7ARAgDPc4AAiApqEwABY7gIIgAAHqEQ2A6hAdrPcIAA3HcVGZiAAhoYMM9wgACc +eAYaGDAIg+u4CfLPcKAAtEdLGJiDdxiYgMIMAATPcIAABAUAiIDgiAoCCAQgj08wAAAAz3CgACwg +z3WgAMgfI/DtuMolgR+gAMgfyiCBD6AALCAY8rYNAAHPcIAAiAoIgOu4B/IA2Z65z3CgAPxEIqAQ +zM91oADIH++4z3CgACwgJvQKd89xgAAoD8OhxaEDgI0CIAAHoRHMUyBAgBLyBsgCEgE2AhoYMAYa +WDAuDAAEz3CAAAQFAIiA4PQJAgjPdaAAyB9ZAiAAAN4E2AgaGDAfhYDgiiAMAMoggg8AAAACDqUD +2BW4Eh0YkM9wgADYBQCAgODwD4IGAIcEIL6PAADfeBoDAQDPcJ8AuP/doA8DAAAIyM9xnwC4/xah +z3CfALj/WBgACB6FUSBAxS3yz3WAACgPA4UB4NIMIAEDpc9wgACICgiA67gI8gDYnrjPcaAA/EQC +oc9wgAAwcx2AhiC+jwTyBYUB4AWlz3CAAAAAAIDruAfyANnPcJ8AuP89oEogQCAQzOS4iPXmuJH1 +hiD/hSzyUSMAwJTzUSBAxZD1EMzPdYAA+GRRIMCAN/KA2BAaHDARzOu4CPIYhQHgGKVKIAAgBfAQ +hQHgEKXPcIAAXCMSiFEgAIB0CyIAyiBiAIDnBPIXhQHgF6UQzOe4AN5U8hHMBCCEDwAAABgMJICP +AAAACB303gugAgpwUSAAgBXyCNibuA7wiiAEABAaHDAPhYDnAeAPpeLzFoUB4Bal3vEIGhgwb/AE +2PzxwgqAABHMUSDAgB3yz3GgACwgBYEmgQrgMHAx9wISATYC2BAaHDBQ2HoNIACYEQEAbgoABM9w +gAAEBQCIgOA0CAIIS/ACyKAQAADwuMlwGfIeCIAAANiWuBXw6LgW8jYJoACKIAQAWgqgAMl1Asig +EAAA8LipcAXy9g9AAADYlbiaCoAAvfHpuM9yoADIHwfy3g9gAAHYANiQuPPx7rgK8lEjAMAI8oog +BAAOogTYCBoYMBESATfvuRHyQBICBs9wgACocw2QEHKJ96+5ERpcMM9wgACAmsCgz3WgAMgfCMgE +IL6PA4DoQ/AFwv9RIEDF6AXC/z+FoBUAEAkhAADk4NP2z3CAADBcAIBRIECAC/LepRDfXg1gBOlw +gOAF9AHYHqXupYogCACgHYATDqUfhajgSPeA4AT0iiAEAA6l3gzABy/YlbgSHRiQz3ABAMD8FR0Y +kJoPQACKCyADB9jPcIAA2AUAgIDgQA2CBs9wgAAoD0SAI4AIIkEAJKBFgCaACCGBACagPIVngEiA +YnkIIkEAKKDPcIAAAAAAgAQgvo8AAN94BvLPcJ8AuP/doM9wgACICgiA67gV8s9wgAD0AxB4z3Gg +ALRHSRkYgM9wAEQUAEsZGIBMGZiDA9h3GRiA7QcP/uB4z3CAAAUFQIjgugjyz3GgAKwvGYGKuBmh +USJAgAfyz3GgAKwvGYGOuBmh4H7hxQfZGRpYMM9woADUBxoYWIAOEA2Gz3GAAAAAQIFRIgCCCRpY +MxvyQYFRIgCCQNvPI+IHyiOBDwAA0ADPI+EHz3KfALj/faJkgQHj07tkoQUjgw/Q/gAAdqLPcaAA +SCy+oR8QAIYBGhgwBMqc4Mwggo8AAJEABvIAFgBAABYAQAPMz3GfALj/GKEEyuB/wcXxwOHFz3GA +AIgKSIFRIgCALPLPcqAAyBxIgoYg/wFDuM9ygAAIQQpiANuA4sohwQ/KIsEHyiBhAcojgQ8AAFoA +yiTBALwD4fzKJSEAgeLPcKoADFC+gcf3gL2+oQHZJaAE8KC9vqFloNkGD/7xwFYOD/4acM93gABc +IxCPhiD/AUIo0QDPdqAAtEcqdQXw0gjv/YogiABxFgCWBCCADw4AAAAxuIHg9fNDFgCWRiAADUMe +GJBXFgCWvLi/uFceGJBfFgCWv7hfHhiQANieuFMeGJAQj2AeGJDK/89wgADwYweIgOAU8hCPhiD/ +AbYNb/9DuM93gAAIBRSPEHUI8s9wgAA4JBaAQHgUH0IUQxYAlkwgwKBFIAANQx4YkIAADQAKcDMm +AHCAAIxEQCeBchR5AHkQvZu9z3CAAHSIAIifvYDgAdjAeA+4pXhfHhiQIPDPcIAAdIgAiBC9gOAB +2MB4D7iYuJ+4pXhFIMABXx4YkA7wEL3PcIAAdIgAiJ+9gOAB2MB4D7ileF8eGJAIyITgwA7h/Mog +4QOJBQ/+CiHAD+tyBdiKIw8ISiQAAFUC7/wKJQAB8cAWDS/+AdnPcIAAiAoIgMC4G3gA3s91oAC0 +R0sdmJN3HViQz3GgAIRE2KEC2XcdWJAA2Z65Ux1YkFQdWJDPcYAAQAFHHViQjrjPcYAAKABFIAYN +SB1YkM9wgACICkkdmJMakAK4bLhEHRiQHNhFHRiQz3CAAKQyAYhGHRiQz3CAAFwjEIhy/0okwHDP +cYAABHzJcqgggAPPcIAAgIhWeGGA82r1fz9nAoBipwHiA6fPd4AACAUAh4DgBPJkHRiQQx2YkQHY +ff/PcIAAiAoogOu5EfLPcIAA9AMQeEkdGJDPcABEFABLHRiQTB2YkwPYBPBLHZiTAdh3HRiQUSEA +gECHDvJTIkEAErlEIgADDrgleIYi/wMKukV4EvBIcIYg8w8KuAQigQ8AAAAMBrkleAQigQ8AAAAw +ArkleM9xgAA0Mj0EL/4CoaHB8cCyCw/+WnDPcIAAgIhAgKTBSHCGIP4DJLgOuAZ5wrpAKoADJXhO +wAQggw8BAADALrtAKw0GnL3PcYAAiAoogZ+9z3KAAAgFUSEAgM9xgACIGXZ5BvLQgcSiMYEF8MCB +IYHEoiOiAhICNieKUSHAgAv0z3GAAMgEIIGGIX8PPXkPuSV9USKAocokISIK8gvZBCC+jwAAABjK +IeIDmnFRIgChzyXiFgX0USIAos8lYhfpuDHyBCCBDwEAAMAuuc92gAAIQSlmSSGBAGG50mnUfsd2 +gAB0eygWERAsFhUQz3eAAIgKYhePEC7GCLsY4QQggA8AAAAQxH+GJ/8eCb/le2V+BSCTA569L3m5 +GkIAiif/H17w6Lgl8kPAI8Gg4cojQgDKIyEAz3aAALhAKWYEII8PBgAAADG/BCCEDwEAAMAAJ0UQ +z3GAAAhBQSyEAzIhAQECIUEBFiNFAC7BKWYV8FMgwQDPc4AA9EM9eSljBCCDDwEAAMAuu892gAAI +QWtmYbsWIcUAAdlMJQCGjPcKIcAP63IF2IojxglpB6/8iiSDD0AtgwB0e8dzgAB8egATEQAEExUA +BCCAD+8AAN3ig2G5JrgleFIg0wO5GkIBz3agALRHOBQQMAbwhgyv/YogiABxFgCWBCCADw4AAAAx +uIHg9POMJ/+fz3GnAIhJC/LPcIAA0BYagFEgAIIF8u+hAdgC8ADYDqEqcDILYAgKcYog/w9vHhiQ +ax4YkAPYD7jPd6AAyB8THxiQWR5YlVoeWJRbHtiUWB4YlVEigKJKIAAgBvLPcIAAiApqEBAB+73K +ISEADfJGCQAFPocCcQK5brlIIQEAKHDJuAV9anCGIOMPjCAcgNAl4RPPJeITVx5Yk89wgADwYwSQ +geAO9IQWApZQIgADBCKCDwAAAAytuAK6RXgE8IQWAJYWHhiQjCHPj8ohxg/KIsYHyiBmAcojhg8A +ABcByiTGACgGpvzKJSYACNwjAS/+pMChwfHAxggP/hpwz3CAAICIYICkwWhwhiD+AyS4DrgGecK7 +DrsFI00ATsUEJYEfAQAAwC65geIB2sB6BrpWIkIIQCkPBpy/z3CAAIgKCICfv89zgAAIBVEgAIDP +cIAAiBk2eAby0IDEoxGABfDAgAGAxKPpvQOjNPIEJYAfAQAAwC64z3OAAAhBCGNJIIAAYbgCuBR4 +ACCDD4AAdHsoExEALBMVAM92gACICi7DYhaOEAi5TyISAYog/w9kfoYm/x4JvsV5ZXkEJYMfAAAA +EAUjVACev08i0iF6cGHwUSBAos8iYgHPIiEB6L1aciHyQ8UjwKDgyiECAMohIQDPcoAAuEAIYgQl +jh8GAAAAMb4EJYMfAQAAwNhgLrvPdoAACEFrZgJ7FiHFAC7ACGIV8FMlwBDPcYAA9EMdeAhhBCWB +HwEAAMAuuc9ygAAIQSliYbkWIEUAAdhMJQCGjPcKIcAP63IF2IojSgSxBK/8iiSDD0AtgQA0ecdx +gAB8egAREQAEERUAYbgIERMABCWBH+8AAN0muSV4UiDUA892oAC0RwXw1gmv/YogiABxFgCWBCCA +Dw4AAAAxuIHg9fOMI/+vz3GnAIhJDfLPcIAA0BYagFEgAIIF8jwZwAQB2ALwANgOoSpwfghgCKlx +iiD/D28eGJBrHhiQA9kPuc9woADIHxMYWIBZHliVWh5YlFseGJVYHpiUUSCAogDdB/LPcIAAiApq +EA0B+7/KICEAD/KWDsAEz3CgAMgfHoC4YAK4brhIIAAACHHJuSV/inGGIeMPjCEcgNAn4RPPJ+IT +Vx7Yk89xgADwYySRgeEO9IQWApZQIgEDBCKCDwAAAAytuQK6RXkE8IQWAZYWHliQjCDPj8ohxg/K +IsYHyiBmAcojhg8AABcByiTGAHADpvzKJSYASQXP//HADg7v/QO5+nDPcIAAiAofgDV5ACGND4AA +BHyA4DpzpvIJhUV4unAJpRAVFBAUFRAQ5oUcFRYQIBUTEM92oAC0RwAVEhAG8HoIr/2KIIgAcRYA +lgQggA8OAAAAMbiB4PTzjCf/n89xpwCISQvyz3CAANAWGoBRIACCBfLvoQHYAvAA2A6hCnAmDyAI +SnGKIP8Pbx4YkGseGJAD2A+4z3egAMgfEx8YkFkeGJVaHhiUWx6YlVgeWJVRI8CmyiEhAA3yTg3A +BB6HArhCIIEDSCEBAChyyboFI5MgynCGIOMPjCAcgAT0UCPAIwTwTyPAI1ceGJDPcIAA8GMEkIHg +DvSEFgKWUCIAAwQigg8AAAAMrbgCukV4BPCEFgCWFh4YkIwhz4/KIcYPyiLGB8ogZgHKI4YPAAAX +AcokxgAoAqb8yiUmAAARASB+FwCW4LnPIOIA0CDhAH4fGJAvIUMAABlAIADZz3CAAIgKP6AghekE +7/0AH0Ag4HjxwLYM7/0A24DhpcEK8kiBBCKCDwAAADBCIgOAyiNiAAO4FXgAIIIPgAAEfMCC6L5A +xhLyIMDPdYAAuEAyJQYQAIoNZQQmgB8GAAAAMbgAIEUDBfAB2NhwuHCuvq++sL5AxoDjzCEigI30 +z3CAAICIz3OAADBzlhOBAAOICyEAgDfySBODAADZAN9TI00ADyFBA0QjDQNCvYYj/wMPJ08TvGsE +Jw+QANsEeQ8jQwNkeMonARCA4cohwQNMJUCAFPJMJYCAE/JMJcCARPIKIcAP63IF2IojDAZKJAAA +EQGv/AolAAEOuSV+N/DlefzxIYLPc4AAKF2yabR9o2NRI0CCCvIvKAEATiCBBwDYjrg4eAV+I/BM +JUCADvJMJYCAEvJMJcCAFvIKIcAP63IF2IojzAvU8c9wgADwXjZ4AogH8M9wgADwXjZ4A4gOuAV+ +BfCOvo++kL4EJoAfAQAAwC64z3GAAPxDCGGwcFYAJgBAxgohwA/rcgXYiiPMDXEAr/yYdqiBDZEE +JY0fAAAAMCy9hiB/DGG9HHhAJYETESBAgw8mThBAxg30CiHAD+tyBdiKIw0AiiTDDzUAr/y4dc9z +gACAiACDi3GggYYg/gMkuA64Bn2goQCDwrgOuAV9oKEAwM9zgACICgQgjQ8BAADALr1ALQEWTyEE +ByiDTyTEB892gAAIBVEhAIDPcYAAiBm2eQby8IHkpjGBBfDggSGB5KbpuCOmL/Inggi9pXknogQg +gA8BAADALrjPcYAACEEIYUkggABhuAK4FHjHcIAAdHvKgCuAYhOPACDABCcFEM93gABocxEXhhBP +JIQHBCZPAQm/5X2leIonBhaKJf8fUvDouB3yRMAkxqDmyiWCE8olIRDPd4AAuEDOZwQgjw8GAAAA +Mb8EIIEPAQAAwP5mLrnPd4AACEEpZ8J5EvBTIMEAPXnPdYAA9EMtZQQggQ8BAADALrnPdoAACEEp +ZmG5Nn2Y5Yz3CiHAD+tyBdiKI40OiiSDD/kGb/y4dQK9tH3HdYAAfHrAhSGFBCCAD+8AAN2ihUIm +TwAmuOV4UiDAA4onBBIkosWipqIgGgAB6aIHogHYH6PpAe/9pcAA2JC4z3GgAMgfFRkYgM9wgAAw +XEaQW3pPIgMAWhEChjgQgABkelhg2BkAAOB+4HjhxQDbz3KAAAhuFCINAGC1aLUaYiAawgC4HcQQ +z3GAADBcFnkikSgawgDIHcQQcB1EEAHZgBpCAM9xgACgbhV5YKHgf8HF4HjxwOHFCHUZEgE2z3CA +AAhuNHgRiIDgEvICyAGA7bgO8s9wgACAWfAgQADPcYAAgAQUeQCREOAAsaINwAMZyN//AsgB2aAY +QADKCuADqXDPcIAAAAAAgFEgQIES8s9xqqq7u89wnwC4/zagNqA2oDagz3GgAMg7DoGIuA6h/QDP +/fHAggjv/UokAHLPcqAAiCAA3qggQQGH5kDyAILPcYAAMFzPc4AA6ILWeaiJZ4O7Y4Dgz3WAAAhu +1H0j9AAmgB+AAHhu8IiC5wr0cBUPEft/I5GAvyR/cB3EEwfwgecF9CKRcB1EEADZMKjPcKAAyBz6 +gHAVARHkeYgdRBAF8IgVAREwcMP3eGEE8IgdBBB4YIkgzw8EGhAAAeYA2c9wgADogkkA7/0noPHA +2g+P/VEgwIHPcIAACG4CEgI2z3OAABR6GRIBNs92gAAoDzR4MYgQEIQAEfIB4Sh1MhKFAAeTAhsC +AQazGYYB4Bmmz3BBAIMAI6sQ8EAkTQAxEoUAoqu4EAABI6sGsxqGAeAaps9wIQCCALB1xffRB6/9 +BKMZyM91gAAobghlAeAEqwGCUSAAgbCKQfIvJEgAz3eAAEQyJ4cZyIDh0ooPeATyBYcl8PJtz3GA +AChd9H/hYfa5SSDAAAjyz3GAAPBetnkhiQPwANnHcIAA8F62eASICCYOEAgmQRCAcUkhwQMWbTV4 +z3GAAPBfAGHPcYAACF62ec91gACICr2FIYGleQQhgQ8AAAAIJngC8AOCAqOYEoAAKIsQcQfyANgE +q2DYGLim8QDYnbik8eHF4cbPcKAAFAQD2SOgGcjPcoAAFHphks9xgAAIbsSKFCENAGi1ACCDD4AA +KG4w4cCrYoIVeQaSYKECEgM2uB0EEASCoBMBAIYhww8leKAbAADBxuB/wcUZEgI2BCC+j2AAAADP +c4AACG5Ue8dygAB4bghxBvICyByQUSCAggryBCGBD2EAAADXcQEAAAAG9ADYALMB2B7wEMxRIMCB +AhIBNg3yMhGBAAGLMHAE9ADYAavy8QHgAasL8DERgQAAizBwBfQA2ACr5vEB4ACrAtjgfxCq8cDa +Da/9BNkIdRkSDjYG2BkaGDDPd6AAFAQKp89wgACQRPINT/0AheoNb/0E2QGF4g1v/TjZIoWA4Qby +AYUAkBBxzPcKIcAP63IF2HXbSiRAAMECb/y4c7oNb/0DhQGFQoUgkAWFrg1v/UJ5yqfVBa/9GRqY +M+B4z3GAACAF4H8DoeB48cBWDY/9CiYAkMohwQ/KIsEHyiOBDwAArQAF2CPyAYaA4MohwQ/KIsEH +yiOBDwAArgDKIGEBF/IwiM9ygAAoXQK5NHknYqKALb8BhYDgwL8E8gCFgOAM9AohwA/rcgXYtdtK +JEAAKQJv/LhzUSCAwQX0XgvABoDgB/IAhYDZKKABhUB4KPABhiCQIMgQccohzQ/KIs0HyiONDwAA +wgAF2CH3yXC2/wGF0//PcIAA0KCELwsaiiEQADAgQA4YeQDIJngAGhgwz3CAAIBZ5qCaDC/96XDp +BI/9z3GAACAFI4HgfyCg8cDhxQISATaigYoh/w8AGlgwIIWWC2/9JNoBhYDg4iACAMkEj/3gePHA +Sgyv/QbYGRIPNhkaGDDPdqAAFAQKpgmGgOAA3RPyjg2AAwmGgOAN8iQWBRAKIcAP63IF2IojRANJ +AW/8SiRAAIog/w/qpgAaGDDPcaAA0BsQgc9ygAAIboa4EKETgZC4E6EdioDgGRrYMwzyz3CAAIBZ +BoDPcYAAgAQUeQCREOAAsaayrrImGkIDJQSv/cQaRAPxwOHFCHXPcIAAgFlGgM9wgACMnoQqCwoA +IEIOz3CAANxaAIBRIMCAocEU8hZpz3OAAPBfAGNRIECCDPTPcIAA8F42eFuKAoiJug64RXgG8BII +r/2LcADAAKXVA6/9ocDPcoAA3ApUillhMHlBaVBwxPYieBB4A/AC2M9xoADIHx6hENgOoQHYFRkY +gOB+4HjxwCYLj/0A3891oADQD/WlA94S8OB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +Yb6MJv+f7vUD2Bqlz3CAANwK76gB2BWlQQOP/fHA1gqv/QXYAN0LuKlx3f/PcYAAMHMege64WvId +gVEgAIBW8o4OD/wA2Zy5z3CgANAbMKAB2c9wpACYQDygBCC+zzAAAAAB5colIhBRIwDAJ/RRIEDF +BfJRIYDDIvJRIMDFDvJRIYDDCvLPcKoAAAQBgIYgPwuD4BTyzv8g3892oADIH/CmAdhDHhgQANj2 +Dy/9jbjxpoTlpgfF/wLwxf9RIADHANkP8gDaz3CgANAbnLpQoM9wgAC0BECAEIIB4BCiz3CkAJhA +PKA28OYND/xRIEDFMPRRIADFAeXKJSIQUSMAwM92oADIHyDfDfTwpgHYQx4YEADYig8v/Y248aaE +5Vr35vHPdaAA0A8A2BWl8KYB2EMeGBAA2GoPL/2NuPGmA9gapc9xgADcCgDYD6kB2BWlCQKP/fHA +ngmP/QDfz3agANAP9aYD3RLw4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HhhvYwl/5/u +9QPYGqbPcIAA3ArvqAHYFabPcYAAMHMdgYC4HaGc/4INwAGpAY/94HjxwOHFz3KgANAPsILPcIAA +3AoviDB1ANsF9APZOqJvqALw3/+NAY/9ANvPcqAAxCeKIBgIPBrAgM9xoADIHw6hgBEAAFEgQIDP +cIAA5HsN8kISAoYEIr6PAMAAAAXyQYCA4gPyQqCAGcAA4H9hoOB4EMwEIL6PAAAoQEXy47gh8hES +AjeA2M9xgAD4ZOu6EBocMAbyGIEB4BihBfAQgQHgEKFRIsCAB/QA2c9woAAsIC+gEcxGIIAC4H8R +GhwwUSBAgRfyiiAEABAaHDDPcYAA+GQPgQHgD6ERzADZRiCAAhEaHDDPcKAALCAvoOB+BNgQGhww +z3GAACgPHYEB4OB/HaHgfvHAMgiP/QDdINjPdoAAXHlAJhAVAgigBACmz3CgAMgfAdkzoFiAeYDP +d6AAMBA1gPgQAADhh893oAAMJAIiAoACeeeHQaYjps9ygACICgMjQwPPcYAAMHNipkwZRAMUklAZ +RAPoggm2vbZTJwAQCLbPcqUACAxggk4ZRANTI0UBUyNCAEgZQgGD4sohwQ/KIsEHyiOBDwAAVg3K +JIEPAAD+AMwEIfzKIGEBBCOCDwAAAOAtupYZggA+ge65ZaYM8gS6gbpFeAi2B9gH8BUgDCCgpAPw +BNgB4Ijguvfrv0gNQv6pd1EggMW68oDnuPTPcIAAMHM+gAQhgQ8AAABABCGATwAAAEAQcQHfyici +EMolYhDPcYAA3AoPiQHgD3gPqc9xoAC0DzeBMHAA3gj0z3CgAKggBoCMIIOOzPcA31f/z3CAALQE +IIAB3QiBAeAIoYDnhvLPcYAAXHkFgc9ypACQQXWCBCCADwAAAOBBKEQDFoJRJACAuHAIoc9wgAAw +c2ehBfJMGMQACPBMGIQDBCODD///AABnoVEkQIAF8jC7ThjEAAXwThiEA3B7Z6FRJICABfJQGEQB +CPBQGIQDBCWDD///AABooU2CRqEEIoIPAAAA/im6UhiEAB6A7rgj8s9wqgAABASACaHPcIAAwHlA +iIDiQCAEATLygOJaAC4AAhCFAPQkgwMV2BO48CDDAM9wgACYedV4AeZQdmCgtPcb8M9wgADYeUCI +gOJAIAQBFvKA4gIQhQDP9/QkgwMp2BK48CDDAM9wgACYedV4AeZQdmCgs/dBqQIZQgGA5xL0BCC+ +z2AAAAAM9M9wgAC0BCCAAd0BgWG4AaEHgQHgB6FRIwDADvIB3QT/z3CAALQEIIAA3wGBYbgBoQeB +AeAHoSoIL/3y2AQgvs+AAQAAzCcikMwlIZAY889woAAwEAOAgOAA2Qryz3CAALQEQIAB3Sh3DIIB +4AyigOUV8gLZz3CgAMgcKqAi/89wgAAwc0DZPaAQzIYg+Y8F9ADYj7gQGhwwlQVv/elw4cUw2wDd +z3CgAMgcaaAD2s9xoADMFyEZmIBOoaegaqDgf8HF8cAODU/9z3GAACgPDoEB4A6hz3GgAMQnGREA +hoDgAN0E8gLYEBkYgM92oADUC7emBP/PcYAAMHMdgYe4HaHo/xCGgOAl8gzwgOUG9M9woAAsILCA +Sg/v/IoghAtRIADE9PWA5Q3yz3CgACwgEIDPcoAAKA8vgqJ4MHDD9w+iA9nPcKAA1AsxoLn+8QRP +/QohwA/rcgXYz3MAAJwJSiQAAKEBL/wKJQABUSEAxvHAHfTPcKAADCQHgIDgF/LPcIAArHMLgM9x +oADIH2TgHqEQ2A6hAdgVGRiA3gkv/QPYUSMAwCAPwv/RwOB+4HjxwB4MT/3PdoAAMHM9hi8mSPAr +9OC4C/SCuT2mz3GAALQEQIEjggHhI6JRIECAHYYK9IS4HabPcIAAtAQggASBAeAEoc9woAAMJAOA +USDAgB2GC/KEuB2mz3CAALQEIIAFgQHgBaE9hi8mSPAA3Q70CiHAD+tyBdj024u7iiSDD9UAL/xK +JQAAz3egANAPERcAloDgePLguQnyz3CAALQEIIACgQHgAqEJ8FEhAIEV8sP/HYZRIMCBZPTPcKAA +xCcZEACGgOAH8gLZz3CgAJAjPaBs/hrwuv8dhlEgwIFS9FmHBvAAEQBQAeWvfUEqgAAQdbr3ANkG +8AARgFAB4S95UyJAABBxuvcA3QzwgOUG9M9woAAsILCAmg3v/IoghAtRIADE9PWA5QDbDvLPcKAA +LCAQgM9ygAAoDy+CongwcML3D6ID2c9woADUCzGggv7PcIAAMHMegPO4CvLPcIAA3IJrqM9wgACc +gmywz3AAAP8/z3GgAAwkAaEb2AShXf8FA0/9CiHAD+tyz3MAADgJBdh28fHA4cVQ3QDaz3OgAMgf +r6NeowIgQgBeowHaFRuYgEDaTqMEIL7PAAIAEAwPgf/VAk/94HjxwFYKT/3PcIAAMHMxgFEhQIIR +8s9xgADcCi6JRBCCAER5USGAgEjayiKBDwAAkAAC8A7aANvPcaAAqCAngagQDQBZYbFxwiVFEMol +5hKweArZrP1O/s9wgADAGwCQz3agAMQnUSAAgQTyjCUDkgT3AN8V8M9woAC0D3ygz3CrAKD/eqCm +DWAHANgZFgCWgOAE8gLYEB4YkAHfGRYAloDgP/RRIQDGPfTPcIAAMHMRgFEgAIIF8g/MYbgPGhww +AN4L8IDmBfTPcKAALCDQgB4M7/yKIIQLUSAAxPX1gObPcYAAKA8K8s9woAAsIBCAT4HCeFBwwvcP +oQPaz3CgANQLUaATgWq9AeAToRSBuGAUofIO7/wB2OYKL/8B2Of9oQFv/elw8cAyCW/9wNjPcoAA +XHmhihwaAjDSbUTmz3GgANQLGIEA20IgAAiA4MogzAAQdtz3z3GfALj/GIGQuBihGIGwuBihz3CA +ALQEIIAFgQHgBaHPcYAAMHMdgYS4HaEA2C7/ANgx8APmBCaOHwAA/P+XvuxwwKAHyOx2AKYPzEok +wHMB4BB4j7gQfg8aHDDPcKAAiCTeoADYqCAAAvAiDwDsduCmAeCA5QDay/fPcIAAmHnwII4A7HDA +oAHisXK3922hAdjZAE/94HjxwOHFz3GAADBzdoHB2BwaAjAM489woADUCxiAANpCIAAIgODKIIwA +jOBZ989ynwC4/xiCkLgYohiCsLgYos9wgAC0BECABYIB4AWiHYGEuB2hANj+/gDYI/DPcoAAiAoY +igHdhuDCJUETGCNAAwPgBCCADwAA/P+XuJ24n7jscwCjB8jscwCjGIo2gYbgAdjCIAEAGCEBAOxw +IKAB2EUAT/3gePHA4cXPcoAAMHMWgpjgz3GAAAR8BfJUEoAAgOAE8hmCuoIE8BuCvIJRgs9z/v// +P2R4pHsEIoIPAAAAEEV4AKEA2AGhZXpKoQ7aS6HPcYAA7J3CCk//z3CAAESbAIBRIECACPLPcYAA +1KCqCm//AdjNBw/98cBWDy/9G9jPcaAADCSjgQShAN4L8IDmBfTPcKAALCDQgMYJ7/yKIIQLUSAA +xPX1gOYO8s9woAAsIBCAz3KAACgPL4LCeDBwwvcPogPZz3CgANQLMaCN/eS9z3agAMQnEvLPcIAA +tAQggBGBAeARoVH9GRYAloDgBPIC2BAeGJBp/iPwUhYAllMgQQCD4dEl4ZAE8qj+GfDPcIAAqQgB +2SCoz3CAALQEQIAGggHgBqLPcIAAMHMegFEgwIEF8s9wgABwBSCg/QYP/eB48cCKDi/9ANrPcAAA +/z/PdaAAxCcTHRiQG9gWHRiQAdgQHRiQz3aAADBzEYbqDKABNoaoHgAQfP4dhue4A/IA2B/wLRUB +llaGMHIH8oC4HaYA2Ib+9fEEJYFfAADwLx6GJXgephEVAJbguAbyz3AAAHCgB/DpuAfyz3AAAFSe +eQYP/VEgwIAb8gjYEx0YkOn+gODX9QLYPB0AkCEVAZbPcIAA5HshoBEVAJZRIICAB/Rd/h2GUSDA +gcP1ERUFllElgIAM9AohwA/rcgXYiiMFD+0C7/uKJIMPBNgTHRiQlv+v8eB48cCWDQ/9z3GAAAAA +AIFRIACAG/IBgVEgAIBA2M8g4gfKIIEPAADQAM8g4QfPcp8AuP8dogSBAeDTuAShBSCAD9D+AAAW +ogDZz3KAADBzPaI+olQaQgA/ooDYlBoCAIAaQACoGkAAz3CAAEiBOaDPcIAA8HsgoM9wgACAmiKg +z3CgAAQlNKAD/VEhgMPPdoAAMHPPcoAAAGTPcYAAtATPdYAAiAoV8gDYjrgeplUiQAUAoRuVBtoc +th2Vkh4EEIoghA4ets9woADIHEmgC/AEagChGpUcthyVkh4EEE4VABEetkCBAIIB4ACiIIEBgQHg +AaH62ADZVvwd/YDgAAcBAM9woAAMJM9xAAD/PyGgz3OgANAPERMAhoDgDfIKIcAP63IF2IojDQqK +JIMPrQHv+7hzAdgRGxiAaBWBEByWAiBEAB6G7rgvJAgB2vIA2EAeBBDPcaoAAAQIEQUAz3ClAAgM +AIAEJYIPAAAA/yi6BCCADwAAAOAbeIm6BXoIhQQgvo8ABgAAUaYD8oy6UabPd4AAXHlNpzAfQBEA +gUQWghCU4gqnGfIG9oriGfQjuA7wt+IO8u7iE/RFKP4CQSnAcFElwIHCIGIAANoL8EUo/gJBKQBx ++vEiuPjxANgB2hamIYEctyun5LnKImIA4bnKImEAuHGGJf4PQS0FARAXBhFJHkIRBSZBAY7gKLdd +ppj313AAADAJFPdVFYEQgOEM8hkTAYZCIQEISCEBAFYgTwLxcYb3gBMBADBwBPKAul2mUSIAgJ4C +AgCIcADZM/5iFYMQRBaBEEQhBQwEI0IARCIAAUItBQGgcFMgRADPcIAApJ4yIAABibgbpmwWjRBJ +FoEQBCXAEIYl/xNEvSR4uGDPdYAAsEH0JQAQz3eAAIyhXh4EEDInABGJuBymcBaAEAR7hiD/A0S4 +JHt4YPQlABBEeWAeBBARhqBxz3KAANBB9CJDABmmz3KAAOBB9CJBAIoexBAapowexBCOHkQQkB5E +EADYcwQgAEoeAhDPcKYACAQBgAQggA8wAAAANLhRIEDGQB4EEEAWAREM9M9woACoIAiAGWEweSYP +b/+IcATwiHD6/QQggE+AAQAA13AAAQAAANkW9AHYSh4CEJYWgBDPcoAAXHlAHkQQSR5CEAS4NqYp +ok8gQQIIkiV4CLK/8EkeQhDPcKYAjAM9gFEgwMcEIYIPOAAAAEEqwASWHgIQBCGADwAAAPAsuCW6 +RXgRps92gAAwcwXyEYaMuBGmUyHNAkQWhBC2plEkAIDRIeKHANgD9AHYz3KAAFx5lhaDECmiKJIE +u2V5KLJxhryyUyTBADx5z3eAAJSeL2cdpvumbBaPEMO/LyXBA893gAAsevQnTxFtol4exBPPd4AA +fKEvZ3mm/KZwFo8Qw78vJcEDz3eAACx69CdPEXqmYB7EE893gABMevQnRRDPd4AAXHr0J0EQih5E +EYweRBGOHkQQkB5EEM9xpgCMAz2BBCGPDwEAAAAwv0oewhMpokoWgRCA4QDbEvJMJECDBPKAuB2m +USAAgAbyL/CuC6/8iiBQBFEgAMb68yvwjuVAAAUAz3KAAIgKnBIBADB1GPdVEoEAgOHPcqAA0A8M +8hkSAYZCIQEIgOHKIcwAViVDEjBzBveAEgEAMHUE8oC4HaZRIACABfIA2Cj9dQIAAM92gAAwc0oW +gBCA4HICAQDPcaYA1AQsEQCANBERgDgRD4DLERIGKnHGuelyhiL9Dwa6RXkqcoYi/Q8EukV5BCCC +DwIAAAAnukV5RCcCHA26RXnpcoYi8w8EIIAPOAAAAA66RXkluCV4RCeBEBS5JXiIuEQnARJBKcGA +UiBABRGmVB5CEMohgg8AAP//yiGBDwAAEB8acTaGP7YEIYEv/wMA/yi5NqaiDmABANryv6geABA7 +8kQWgxAxhqDj0SHhgjXyBCGNjwAAAAEH8s9ygAC4QGpigeIJ9gQhgg8AAAAk13IAAAAkIfIEIYQP +BgAAAEEsQgSC4jIADQCC4gr0gOUV8s9ygAC4QGpiguIP9IDlBPLM4wv2VoYScsoijg8BAIgNzCCO +gM3313ABAIgNx/fPcYAAKA8VgQHgFaEB3SDwgOXPcIAAuEBqYAbygeLE9kwkAIAV9M9wgADwYwaQ +EHIP9uu5C/LPcIAAiAoIgAQgvo8ABgAAA/IA3QLwAt1UFoEQz3CAAFx5KBhABAe5SJCIuUV5KLA2 +hjAYgAQ8sDGG66AEJ48fCAACANd3CAAAAC2g2AyhCcogQQMWhoDgvaYF9LoMgAlU8M93gACYBACH +gOAf8lQWgBCA4BvyEYYA2Y25Zg1gASDaI5cCIE0AEYY2hlYNYAEg2hB1CHJK90AtARTPcAAAeB7W +Cq/8RXm9hs9wgADcCgGIgOAO8s9woADQDxkQAIZCIAAISCAAADaGSOEQcQr3z3CgANAPgBAAADaG +EHEE8oC9vaZTJX6QFPJRJQCQz3GAAPhkBvIAgQHgmwXv/wChCYEB4Amh/vzPcKAA1AtO8PYIz/36 +8ULYz3WgAMQnvx0YkBaGjuAN9BHMUyBAgAnyz3CAAIgKCYBRIECAEPI5/YDg5PNp/YDg4PMQzIYg +/4UF8gLIAYD9uALyjf3c/QomAJAo9ADdDPCA5Qb0z3CgACwgsIByCK/8iiCEC1EgAMT09YDlDfLP +cKAALCAQgM9ygAAoDy+CongwcMP3D6ID2c9woADUCzGgANkwoPUFz/wxFQCWdgqABkB+qPHxwOHF +CHXPcIAArHMLgM9xoADIH2TgHqEQ2A6hAdgVGRiABfAGCK/8ZdgBhYDgBfRRIwDA+PMBhcG4g+AP +9M9wgACpCAHZIKjPcIAAtAQggAaBAeAGoQDYFvABhVEgAIAH9M9xgAAwcx2BgrgdoQGFUSBAgAf0 +z3GAADBzHYGEuB2hAdiJBc/88cDPcIAA2HkqCK/8GNnPcIAAwHkeCK/8GNnTAI//4HihwfHAxgzv +/JhxOnDPcYAAAAAAgRpyUSDAgaHBuHMb8gGBUSDAgUDYzyDiB8oggQ8AANAAzyDhB89ynwC4/x2i +BIEB4NO4BKEFIIAP0P4AABaiz3GAAAiDJoEA2IHhAdnAeUwhAKBAKRMDKfIqcIYg/ACMIAKFz3GA +ADBzEPTPcIAARAUAgFEggIAG8iDejhEPAQnwmN6KEQ8BBfBeEQ8BDt7PdYAA8HsAheC4wCYiEdB6 +8H9KJkAgCfDPdYAA8HsApdpwCHYIdwhyz3GAAICaIIGD4Qj0z3GAAICaI4FRIcCAC/RKIgAgCiWA +JAongCQKJIAkePDPcYAAgJrAEQIAOBKBADcSjwA0EoMACLklfzkSgQAIuxC5JX86EoEAGLklfzMS +gQAQ5/B/ZXk1EoMAELtleTYSgwDPcqAA/EQYu2V5QCEUAV2CANlRIoCBzCUigAnyLyIIBVpx2nG6 +cfpxQvBPI9MjiHHGuVEkwILPcoAAKEP0IkEABPJcaTR6UHkiuUNpz3EAAPz/RHnPcoAAvHNIis9z +gAAoXQK6VHpCYwTn8rrwfwXyO3kE5/B/QCTCIc9zAAD8/0R7CCHCAAIi1wBRIACAwCYhEWduBCOD +DwAA/P8IIcAAAiDVABpiUHqKIgIgAhAAIUAnARUQcUf24nhIIAAAEHgC8ADYQMAvIIgEiHHpcyIN +oAFKJAAACiAAsMolIhDKICIAwvRMIgCgGPLPcKAA9AfNoM9wgACAmsAQAQBbiRqJCLpFeAS1XYkc +iQi6RXgFtQCFgbgApQTwANgCpUwmAKCU8gCFUSAAgDryz3CAAGhzTIjPcIAAuEAyIIQAH9lMJACA +ANrb989wAwAUAFZ4z3OjALD/UOBgYM92AwAYAFZ+UOZjZi8oAQAB4i8rwQACezBzyiHFAJByp/dA +LEABQiAACBlhz3CAACxEKGAhhU8j0yMJuAV5AoUleAKlBSNAJA1xALENcQDAjCECpQCxDBABIA1w +IKAQEAEhDXAgsBTyjCEDoRvyjCEDpSHyCiHAD+tyBdjPcwAACAyKJIMPEQdv+7hzz3CAALQEIIAP +gQHgD6F2CiABCnAQ8M9wgAC0BCCADoEB4A6hCPDPcIAAtAQggA2BAeANoQCFgOAG8iKFDXAgoADY +AKVMIgCgz3GgAPQHANgS8gehAdgLoQPYCKFMGUAFAdgD8ADYinHqcgpzMg9gCQAUBDDPcqAA9AcA +2SSiAd2A4AHYHg9gCcB4AMDPcaAAyB/4EQIA+GBCeEggAABfgRB4UHBIAAUADBACIM9wgADke0Kg +oNgPoQDYH6HPcoAA3ArPcIAAMHNVihyQQngAwkwgALBYYB+hAtgVGRiABvJRIEDGINgD8oDYDqGM +IQOlBvTPcIAAMHMckAnwjCEDoQj0z3CAAKhzDZBCDm//ANn6Dw//EMyGIPmPC/SMIQOhANjPIKED +yiAiARAaHDDPcIAAAAAAgFEgwIEH8s9xnwC4/wDYHaHPcYAA8HsA2AChqXAI3J8A7/yhwOB48cBy +CO/8ANkIdQGAwbiD4MogQSDKIEEABfKpcLH+SiBAIIHgEfIQhVEggIFH8hCFz3aAADBzUSDAgRzy +z3CAANwKAoga8AHbAN878ADfVSZAGulxz3OAALAy8gnv/pDaQCUAEpweABAA2AW1BNsp8AWFJoWu +CYAAUSDAgZQeAhAH8h2Glbgdph6Gl7geph+GBCC+jxBwAADKJyIQ6PWcuB+mz3CAAESbAIBRIECA +0PMQhe24zPMB38vxAN/pc89ygAAwc1QSjgDPcaAA9CaA5s9wgADkexH0z3aAAI5z9CbOE1yS2mLP +doAA3ArVjsJ6ELqAugLwAtpDoSWFTCAAoCGgDvTPcIAAqQgB2SCoz3CAALQEIIAGgQHgBqGSDg// +tQev/Ghw4HjxwEoPr/yQ2aLBCHVBwSGFwbmD4QDYyiABIAbyqXBn/kogQCDPcaAALCAmgYHgAN8w +eRzyEIVRIICBM/LPdoAAMHMclhBxyfYlhc9wgADkewKAEHGs9BCFUSDAgQjyz3CAANwKAogI8AHY +Q/AFhSaFigiAAD+GBCG+jxBwAACUHgIQD/TPcYAARJsggVEhQIBI8jCF7blG8gHfQMdE8ADfJPCL +cYDhBPIC22ChI4CA4oO5I6AE8iCCprkgoiwWAQAkoAwWAQAloADBVSZAGs9zgAC0Mk4I7/4Bwh+G +nrgfpkAlABKcHgAQng0P/wDYz3aAADBzVBaCEIDiz3GgAPQmXvTPcoAAjnP0IsMDXJZ6Ys9zgADc +CnWLYnoQuoC6UfBAxwDfUSDAgdD1bYUFhc9wgACAmoHCBCODD8AAAAAigDa7ESHAgEAlBhJAIAQL +IvIllRwQBwBCIQUE9CTDAAgnQQFwcdb2z3GgACwgL4GA4RD0z3GgACwgZoE8lnBxJgfG/89xgADk +e2KBJYAwc4vzI4BRIcCAlPMA2s9xoAD8RJ66QaEjgKO5I6CK8c9wgAC0BCCAC4EB4Auhc/EC2kOh +RYVMIACgz3GAAOR7QaEO9M9xgACpCAHaQKnPcYAAtARAgSaCAeEmosUFr/yiwOB48cBeDY/8CHUR +zFMgQIAK8gYSATYA2JgRAQBmDK/+CHIBhcG4g+DKJyEQyiPBAwbyqXDm/QhzAd+B48omYRA08hCF +USCAgQX0AN7JcS3wEMxRIMCAIfIRzFMgQIAS9BnIAdoAIIEPgACIbs9wgABcIxKIQKlRIACAiA5i +/sogggAQ2BAaHDDPcYAA+GQSgQHgEqEI29rxz3GAAHxkC4EA3gHgC6EB2QLYz3KgAPQmA6JDhYDn +z3CAAOR7QaAN9M9wgACpCAHaQKjPcIAAtARAgAaCAeAGooDhCfIA2J64z3GgAPxEAaEA2AWhrgsP +/9kEr/wFJsAQ4HjxwGoMj/wIdgGAwbiD4ADdyiBBAwTyyXCu/QHdgeAA2SjyEIZRIICBJPIQzM9y +gAAAZFEgQIEZ8kDYEBocMFASAAYB4FAaGAAZyM9ygAAIbhR6IKoCEgE2ANiYEQEAKguv/ghyBvCk +EgAAAeCkGgAAAtnPcKAA9CYjoCOGgOXPcIAA5HshoA70z3CAAKkIAdkgqM9wgAC0BCCABoEB4Aah +/goP/zEEr/wA2OB48cDPcoAAMHNUEoEAgOEU9DySz3KAANwKVIpCeRC5RSFDAc9xoAD0JmOhANrP +cYAA5HtBoXz9geDKIGEABPK2Cg//ANhTBw//QSkCAcO6z3OAAORDS2NEkAQigg8AAACA13IAAACA +AdrAelV7QZAE4lBzDPKMIQKEj/TPcoAAMHNWgowiAoaJ9IwhAowd8g32jCECgD3yjCEChF3yjCEC +iHv0pQLP/4whA4QR8gX2jCEDgHP0UPGMIQOIzCGCjwAA8ABr9J7xqQPP/89ygAAAACCCUSEAgRvy +IYJRIQCBQNnPIeIHyiGBDwAA0ADPIeEHz3OfALj/PaMkggHh07kkogUhgQ/Q/gAANqNVBc//z3OA +AAAAIINRIQCBG/Ihg1EhAIFA2c8h4gfKIYEPAADQAM8h4QfPcp8AuP89oiSDAeHTuSSjBSGBD9D+ +AAA2okEFgADPcoAAAAAgglEhAIEb8iGCUSEAgUDZzyHiB8ohgQ8AANAAzyHhB89znwC4/z2jJIIB +4dO5JKIFIYEP0P4AADajeQeAABDY4H7gePHAIgqP/M91gAAwcx+FBCC+jwBwAABK8i8pAQDPcIAA +7AT0IEAApBUBEADenBUCEIK4yXM//YDgOPIfhf64MPLPdYAAXCMQjS6NEHEs8hKNUSDAgCj0MK1q +C2/+A9hRIADDGvQA2Z65z3CgAPxEIaAwjYYh/wFDuRC5TyHCBs9xgAB0iCCJn7qA4QHZwHkPuUV5 +LaASjYS4Eq0G8M9wgACQgsCo7g3AAOUBj/zxwOHFDg0v/wDdz3GAADBzHYFRIMCBYPTPcKAABCWi +gAQljR//AF9vUyWAEIfgR/RRIoDTQ/Iegfq4QfQEIL6PAB4AAA7yB/DPcAAA+Qm6Cw/8USKAwPr1 +USIAwM8lYhHPcYAAMHMegfm4zyUiEs8lIhPPJeISzyWiEyH0+7gS8oi9ib2NvU8lwBK9gY64BCWN +HwIAAABSJU0UKr0FfQ/w/LjFJYIfAAAABc8l4hLPJaITxSWBHwAAAAfPcIAAvHMIiMS4GLhRIIDE +BX1QDiL8yiAiCBUBr/ypcOB48cAPEgE3AeEweY+5DxpcMM9xoADQDw4ZGIAgEQGGz3GAAIgKKIHr +uQ3yUSAAgQv0+g4P/c9wgAAYfTTZWgwv/MTaMwQP/+B48cBKCK/8iiEIAM9woAAMJCGgz3aAANxz +5JbpcKIPoAKGIPwDGnDJcOlxhiH8Ayz/CHeA/0QnfpQA3Q/yUScAkQfyz3GAADBzHYGAuB2hAYbi +Cw//cfBMIACgFvKg/89xgAAwcz2BUSHAgWf00/8j8IDlBvTPcKAALCCwgGYKL/yKIIQLUSAAxPT1 +gOUN8s9woAAsIBCAz3KAACgPL4KieDBww/cPogPZz3CgANQLMaAA3VEnwJAH8s9wgADweRoOgAHP +dqAAxCcRFgCWUSCAgBn0HgsP/89wgAAwcx2AUSDAgSv0ERYFllElgIAL9AohwA/rcgXYiiOID40E +L/uKJIMPBNgTHhiQG9gWHhiQz3aAAEiBGYaA4ATy1grAALmmz3CAAAAAAIBRIACBBfLPcJ8AuP+9 +oHkHT/zgePHAFg9v/E3Yz3KgAMQnLRIOhgm4GhoYgM9wgACEcyCIgOGhwQbyAdvPcaAA1AtyoQTZ +EBpYgE1xhiHzD4whDIAB2cB5OWE0eQCIHuGA4MolQRAE8kAhDQMifgfwz3AAAPEPRgkP/FEggMQF +9FEhAMb2889xoADQDxAZWIMlEQCGYMAlEQCGD3kBHAIwABQAMYwg2IHMIIKPAAAHCMogIgAH9Ijh +AdjAeDIMIAkubs9yoADEJxoSAYYEIYEP////ABoaWIAREgGG67kJ8gDZi7kTGliAGtkZGliAqQZv +/KHA8cAuDk/8z3WAADBzz3CgAAwkPIBWhaHBAiJAAGS4EHiGHQQQEHLKIc4PyiLOB8ogbgHKI44P +AAD7BMokLgAsAy77yiUOAQLIAYD9uAnyLyCHCowgAoYF9B6FnrgepQDZz3CgAAwkPBAQAM9woADU +CxiAQiAACIDgyiBMAPzgWvfPcZ8AuP8YgZC4GKEYgbC4GKHPcIAAtAQggAWBAeAFoR2FhLgdpXIJ +L/8A2NkDAABaDYACgOAKAiEAmB0AEM9xgAAAAACB67gZ8gGB67hA2M8g4gfKIIEPAADQAM8g4QfP +cp8AuP8dogSBAeDTuAShBSCAD9D+AAAWolElwNHPdoAAiAoE8lYWgBAG8AOF0g4gACSFPoWUHQIQ +RCEADKDgB/RRJcDSBfSA2JQdAhCUFYAQUSDAgQTyl7k+pVEhgIEp8hSVUSBAgSX0YguABYDgIfTP +cKAALCAPgIDgBfICyAGA/bgX8h6FkLgepc9wgABEmwCAUSBAgAXyUSVA0wHZAvQA2Ytwz3OAALAy +eg5v/pDaz3CAADBzlBCBAEApAgaGIf0PUiHBAUW5RXnPcqAAiCQwommG47tegATy6boE8gDZA/AB +2VEjAIHRImKCANjKIGIA97oleA94FvRRIoDTEvKA4BD0hiL/3Az0z3CAADBzAYBRIACABPKiDYAC +BPCeDoACz3WAADBzHoXzuB7yBNnPcKAAkCM9oAbwqg7v+4ogFgNRIIDEBPRRIQDG+PPPdYAAMHOG +FQARz3GAAIgK2gogAy+RFvAAlQQggA8AAMyA13AAAMiAB/QLhVEgAIAD8jD/BvAE2c9woACQIz2g +AtjPd6AAxCc8HwCQlBWAEM9xgADke1EgwIEEGQAEBfIdhZW4HaWL/gh2HYVRIMCB5AECAFMmQBCD +4Af0FRcAllEgwIBa8mIP7/7JcOTwz3GAAHxkDYEA3QHgDaEL8IDlBfTPcKAALCCwgO4N7/uKIIQL +USAAxPX1gOUO8s9woAAsIBCAz3KAACgPL4KieDBwwvcPogPZz3CgANQLMaAQ2M91oADEJxAdGJAC +2DwdAJDPcYAA5HuuDu/+BBkABM9wgAAwcx2AUSDAgab0ERUFllElgIAL9AohwA/rcgXYiiNWDxkA +L/uKJIMPBNgTHRiQG9gWHRiQkPAQzFEgwIA+hQvyBCGADwBAQADXcABAQAAD9Ji5PqXwuQryAMHU +2Klytg1v/wHbgOAMD4IAz3CAAKkIAd/gqM9wgAC0BCCABoEB4AahHoXzuLwOAgMehfC4qAnB/h6F +USDAgQfyAdnPcIAAcAUgoM9xoADIHADYB6Ew2AqhyXBu/gLIAYD9uBbyHoX4uBLyENgQGhwwz3CA +APB5ugiAARnIACCBD4AAiG4eheCpuLgepQCVhiD8AIwgAoAo9LYMAAOA4CT0AN0M8IDlBvTPcKAA +LCCwgIoM7/uKIIQLUSAAxPT1gOUN8s9woAAsIBCAz3KAACgPL4KieBBxQ/cPogPZz3CgANQLMaDP +cYAAMHMegfO4BvQAkQoOIAQ0kQ0Cb/yhwOB4z3KAANwKVIpZYTB5QWlQcMT2IngQeAPwAtjPcaAA +yB8foYogGAgOoQLYFRkYgOB+4HjgeAokgPAFIEQA4CDBB0Qk/oBBKsQAhAACAC8kAvFCIQEBQiAD +AeggogQEEQQCBBEFAgQRBgIEEQcCBBsIAQQbSAEEG4gBBBvIASwAJQBEIj6BPAAiAEQi/IBAIcEA +4CDBB0AjwwCoIIABARGEAgEbCgEgIMAHBBEEAgQRBQIEGwgB1Afh/wQbSAFEIvyABBEEAskH7/8E +GwgBQiFBAEIgQwCoIIABARGEAgEbCgEgIMAH8cDGCG/8ANjPdYAATH1KJAB0gN6oIAAFCHEB4E8g +wgEWJUMQR6uKIggAArk0ecdxgAAoXUChANpCscapwNh/HQIQz3WAADAFwK3PcIAAzH2A2UYL7/so +csGtz3CAANwK0QBv/MKo4HiiwfHAVghv/JhyRcFBKAECQSgDBAd5J3vGu8dzgADMfSCL57kS9BQU +DjHPcoAATH0WIk0A4IXxcAT04pXRdwjyJ43nuWdt8/MA2CDwxo2A5gb0gN/PcIAAMAXhqM9wgADc +CuKI8XYE9IDewqjGjTZ6AByAAweNh7kAq89wgAAwBWCIIKgB2GeqDNw7AE/84HjxwMIPD/zPcYAA +lEQhgaPBQsHPcYAAqAQVIREAABENIIDlLyhBA04gjgdM8vJu9H/Hd4AAKF0Gj89xgABMfRZ5AIEi +kY7mCBxEMMogYQAF8otyAsHH/4DgLfIA2M9xgABIBUCBDyCAAy8gCiAEIICgAKEH9IDipA0iBMog +IgjPeAIJYAAQ2QDYiiEIAAARAiACtyCnz3GAAAhe1nkAoQGhz3GAAOhdBCICBAAZgCDUeQCxECWN +ky8oQQNOII4HuPVhBy/8o8DgeKLB8cD+Dg/8RcHPdYAAiAoihTBwCPQmlRQUDjEwdgT0Vh2CEIDi +DPTPdYAAMAXBjYDmANnKIEEAI/IhrY7iBPQB2B/wQSgNAgd9QSgBBKd5z3aAADAFoI5TJUURTCUA +hMa5i/YKIcAP63IF2KPbzQPv+ookgw9RJYCRBPIA2Frxz3WAAEx9FiVNEeeNAKUUFAAx4K5GrQK1 +x3GAAMx9AIkHrQAZQgEAG0IBzPGiwUHBQSgCAgd6QSgBBEd5z3KAAMx9xrkqYue6EPQEFAMxz3GA +AEx9VnlAgVBwBfRCkXByBvJHiee69fOA2APwBongf6LA4HjxwBIOL/y4cEokQACQ4Mohyg/KIsoH +yiOKDwAA8wAoA+r6yiBqAUAtgAAUeAAggw+AAChdxouMJgKQANgN8s9wgABMfRYgjQOghaChJos2 +eAKQALKIcCkGD/zgePHAng0v/AHZpcEacAoigC+AADQF3gvv+4twTCBAoAAUhTABFJEwBvQKIoAv +gAA4BUwlAIDE9kwlAIHL9gohwA/rcgXYnNulAu/6SiRAAEwlAIAoAQ4AqHAAFo5AABaUQEwkAKR6 +cIX2jCTDryj0ABYAQQAWj0AAFoBAABYAQUwkAKR+AAoAgOcl8s9wgAA0BQKAQCzNILV9EOC4YFYL +7/sE2c9wgAA0BQKATCFAoB1lzCdhkxX0ANiMuBTwCiHAD+tyBdin20okQAAhAu/6CiUABQohwA/r +cgXYsNv18QDYALXPcIAANAUCgEAswSA1eTJgOGAFIkIEQLAE3QbwgcAE3fIK7/upcQAijCMAHAIV +z3CAAKgE8CACBB7fgOIvKYEAAidAECXyMmjPc4AAL100eStjESOAgwjyACaBH4AAqFwWeQAZAgUA +LYETCyHAgAjyACaBH4AAqFwWeQQZAgUQIgKALymBAAInQBDe9UIjQCCA4OQGzf8+Cs/7dQQv/KXA +4HgA2D7x8cDhxa3Bi3WpcGIK7/sN2QDAHXhTIAEARCk+DalwACGBf4AAiF7yCu/7DdoCCs/7cQQv +/K3A4HjxwOHFINvPcaAAyBxpoQAWAEDPcqAAEBQMogAWBUAB3UwlAIDKIcEPyiLBB8ogYQHKI4EP +AAAJAfAA4frKJEEDGBpAAWgZQAED2A+iuaFqoaYJz/sVBA/88cCaCw/8pBABAPm5osFw9CDZz3Og +AMgcKaOkEAEAUSHAgS7yMYjPdaAAEBQjucC5A7kF4QPaT6VGhUHCjeEQ3som4hEGFA8xjCfDnwj0 +BBQPMfF2zCfqkAHeQ/YA3oDm6vXFgEV+x6WxiIYl/B8YvaV6z3WgAMwXWqAX8EWAz3GgABAUR6Gk +EAEAUSGAggnyMYjXuoYh/A8YuUV5OqDPdaAAzBcN2QHaA+ENHZiQDh1YkCaAGR1YkCeAGh1YkCiA +Gx1YkAPZFB1YkHAQAQEQHViQcBABAc91oAD0BwThJ6VHo6QQAQCZuaQYQAAVAy/8osDgePHAkgtg +BRDYb9kHuc9yoADwFzGiz3EAAPD/OKISDUAF0cDgfgDagOHKJE1w4HjoIO0B/9lcYCCsAeLgfvHA ++v/w//DxD3tIuA94z3KAAABG9CIAAEAoAQJIuAV59CLAADB54H8neOB48cA+Cg/8pcEIdgKLKHWY +cGTAAIsAEgYBERwCMHlwAhIHAQQSCAEQFAAx5JIGEgUBACDJAwCRLyFIEgcgQAIQeOf/ACCKAQGV +LyKIEgcggAIQeOP/ACDGAQKVLyaIAQcggAEQeN7/ACAHAgOVLyfIAQcgwAEQeNr/ACUFAASVLyVI +AQcgQAEQeNX/H2cFlfB/53gQeNL/JpUhcBB4B3k8eg+5JXpQegAigQIweQAcRDBHlSd6XHkPukV5 +MHkAIYIBUHpceQIchDAPukV5MHkAIcIBUHpceQQchDAPukV5MHkAIUIBUHpceQYchDAPukV5MHk/ +Z/B//HkIHMQzD7/leTB5OGBpcca5hbkIuQUhwQIgthB4IJUKHAQwJ3gceAi4BSAAAQG2AMABpgHA +AqYCwAOmdQEv/KXA4H7gePHA4cUIdT6Iz3CAADQFQoBAJQAUA7k1eVlh1g+v+wraqXD3/1UBD/zx +wNoIL/yYcKXBKHe4cwDeBCOAD/8AAAAYugV6b3kIuf/YCLhkeCi4BXlFeQjd9CSAAyd4RMAQFAAx +kP8SFAIxYb1AKAEEBXlHeUTBEBQCMRQkgDOA5UCwAeYr91MlwgVApwAUDQEH2QbwEH0UJ0wQALRh +uRQkQDC7e0+9AJCle4HhcHt4YDP3BCCADwAAAP8QuAV6QKed8fHAQggv/CDZANrPdaAAyBwppc9x +oACUE1uhz3OAADQFYoPzaM92gAAwcwyG9X9TIMQF8GP7Y1MgjwCD56TBi3Ea9B6Gm7gepjQWgBDi +i/FwCvQocEAjAQREa0AmAxxq/w3aKvAdhpG4krgdps9woADMFyvwhecO9EEqAlJAIwAEwbqIc7n/ +HoacuB6mDdoU8Cy4UyACAB6GA7qZuB6m5IMF4gUnABEAoQWDAaEGgwKhB4MDoQPiz3CgAMwXz3Gg +AJQTXKEB2oDiB/Qehpe4HqYg2AqlGPAAwQPaGBhYgAHBGRhYgALBGhhYgAPBGxhYgBQYmICGFgER +EBhYgATZJ6UWGJiApQfv+6TA4HjxwOHFz3WAAMyAz3GAAIgKAIF0FQIWEHIi9AKR6hUCFxByHvR2 +FQAWugjv/3cVARaMIAKAFPLPcoAARAUhggDbDyMDAAK4ZnkUeCGiACCBD4AAKF0Agaq4iLgAoQDY +UQfv+/QdHBDgeM9wgAC8c2iIz3GAAKyCjCMCgAKRQSgCAwzy67gK9AK7dHvHc4AAKF0Ckw8ggAAC +swDY4H8EseB4ANpKJAB0SHGoIIADz3CAALCBz3OAADCCNHtAszZ4QKBBoAHhSiTAcwDZqCBAAs9w +gADoXTR4QLAB4c9wgABEBUGgz3CAAKyC4H9EsPHASg7v+1RohiL4A4m6UyHDAEV7z3KAAOhdFHqP +4YolDxzKICkACfYAkgDeDyZOEIolzx/GeACySiQAdADaqCBABs93gAAoglR/xJekftFzz3CAALCB +DPQA3sS3VnjAoMGgz3CAAFCCVXjAoAHiRQbP++B48cDWDe/7CHOYcs92gAAwgvQmQBDPcoAAsIFR +IECCyiBBAMokInTKICIA6CBiAvQmDRBRJUCSA/IB4JDgXPfPdYAA6F10feCVBLuGI/gDibsPJ08Q +4LUA3RZ6oKKhosO5ZXkUfiC2z3GAAFCCFXkAGQABA/CA2MkFz/vgeAhxw7jPc4AAMIL0IwIAybpQ +ccokInTKICIA6CBiAvQjAgDJulBxA/IB4OB+8cAuDe/7ANmjwQh1AYDBuIPgyiBBAIQP4v7KIEID +geAR8hCFUSCAgQ/yEIXPdoAAMHNRIMCBGvLPcIAA3AoCiBjwAd4C8ADeAtnPcKAA9CYjoCWFz3CA +AOR7Dgxv/iGgyXA1Be/7o8AFhSaFbg6P/5QeAhAfhgQgvo8QcAAAY/TPcIAARJsAgFEgQIAF8lEl +QNMB2AL0ANhAwJQWgBBRIMCBSPRthSWFz3GAAICai3AEI4MPwAAAAOKBNrsRJ8CQQCUCEkAhBAsl +8uWVHBEGAEInBRT0JMMACCZPAXB3NgAMAM93oAAsIG+HgOMT9OaHfJZwd8j3z3OAAOR74oNlgXB3 +CfSA4ATyAttgoAOBg7gL8AOB47gK8gDfnr/Pc6AA/ETho6O4A6ELggShA4IFoQDBVSZAGs9zgACw +MsYN7/2Q2hGFz3GAAEQFAKFBKA8Dw7+UFoEQQSgFBVEhwIEUaQUgxAMF8h2Glbgdpn3wTyRAApn/ +kODyAAYAz3GAAFCClBaCEPAhAwBAKgEGhiL9D1IiwgFFukV5z3KgAMQnQRpYgAIlwYDAIYQPAAAA +EAy/13EAAAAIkL9R9gUnTxFiGtiDjCECgMj2z3GAACgPDIEB4AyhANmduUnw5XtiGtiA13EAAMAP +UgAMAA4hgg8AAAAQz3GAALCBFnmg4gCBBBEFAFD3ANsPI4MAYbtOIg8IASjBA1h4ZXgALYMAZXkW +8EIiAggA2Q8hgQBhuVh4BXmKIP8PCvDPc4AAKA9Ng4og/w8IcQHiTaMB289ygACMgmSqz3KAAMyA +4xocAXIaGABzGlgAuPEA2Zy5H4YleB+mQCUAEtMF7/+cHgAQ8cCeCs/7GnDPcIAAAAAAgFEggIGi +wSHyz3CAAAAAAYBRIICBQNjPIOIHyiCBDwAA0ADPIOEHz3KfALj/HaLPcYAAAAAEgQHg07gEoQUg +gA/Q/gAAFqIRzFUgVCTtuNEgYoAK8gYSATYA2JgRAQBmCe/9CHIEEAAggOAL9M9woAD8JSOALyAI +BTC5EHH09wAUACAB3UHABBQAMUEoEQNAEAAgUSCAgQYUEjE68hHM67gw8kAQACDPdoAAMHNRIMCB +BvLPcIAA3AoCiAjwFBAAIBgQASCKC4//57iUHgIQAdkF8j2Glbk9pgDZenEEuM9xgADEeyaRBSBA +BDBwEvLPcoAAKA8AgkojACAB4ACiCvDPcYAAfGQLgQHgC6FKIwAgAhAAIYwgAoVG9ADZBBAAIIDg +DPTPcKAA/CUDgEAkAiFQejC4UHD09wDeSiQAdAHYKHOoIAAE8CQNIAHgUyUCEC+9hiV/H0V9e3pY +faV+AeMEEAIggOIM9M9yoAD8JUOCViQDInB7MLpwcvT3AN8Q8PAkDSA7fwHgAeFTJQMQL72GJX8f +ZX0ALc8TRX+Q4elysPcY8AIQACGc4FP0BBAAIIDgDPTPcKAA/CUDgEAkASEweTC4EHF09/AkTiMI +FA8gz3CAAMyA4BABABQQACBEKT4HACGNf4AAzIAApRgQACEC2QK1z3CAALxzCIgIrQkdQhTPcIAA +xHsKHYQUw6UEkOSlCrXPcKAA9CYjoAwQASDPcIAA5HshoOYK7/4KcIHgHfTPcIAAAAAAgFEggIEH +8s9xnwC4/wDYHaEB2H7wz3CAAAAAAIBRIICBB/IA2c9wnwC4/z2gENhw8EwjAKAj8s9woADELMeg +z3GAALxz6KAoiUApAiMQuZ+5RXlBKgIhRXkmoBHM67gN8hDZq7gQGlwwERocMM9xgAB0ZQKBAeAC +oSoPD/4REgE37LkG8gjYrLkRGlwwA/AA2EwjAKAy8s9xgADMgOARAQDPcoAAzIDPc6AAwC8B4eAa +QADPcYAAvHNIiUApASMQukV5QSoCIUV5RxtYgM9xgADEe0SRz3GgAGgs8CGBACu1jxMChue6/fNA +wgEUgTDGusa5OK1Zrc9xgAAAACCBUSGAgQbyz3KfALj/ANk9opkHr/uiwOB48cBKD4/7GnDPcIAA +jIIEiIDgG/LPcIAAzIByEA4GcxANBs9xgAAoD+MQEQfPcIAARAXggAKBNL8B4AKhNfCqCW/7iiAO +Cc9xoADEJxERAIZRIICBAN/182QRAoZkGdiDAtgTGRiAgOIvKIEATiCBBxLyz3CAALCBNnjAgKGA +z3CAADCC9CBRAM9wgABQgvAgTwAL8M9xgAAoDwGB6XXpdjp3AeABoQQQASANcCCgCBABIQ1wILDP +cYAA8HsAgYDgBvJCgQ1wQKAA2AChz3CAAIgKCIDruMogggPKIUIDyiLCA0gMovzKI0IEUyHAIM9x +gABEBSCBFL9RIYCADLjleAnygrgNcQChDXDAoA1woKAf8A1xAKFKJAB04HioIMACRCaBEA+5UyYA +ECV4DXEAoSK+SiQAdOB4qCDAAkQlgRAPuVMlABAleA1xAKEivV0Gj/vgeM9ygACwgc9xoAAEJU+h +ViIABBGhViIABRCh4H5KJAB0ANmoIIACANrPcIAAMII0eECwAeHm8eB48cC6DY/7z3WAAAAAIIVR +IYCBG/IhhVEhgIFA2c8h4gfKIYEPAADQAM8h4QfPcp8AuP89oiSFAeHTuSSlBSGBD9D+AAA2os92 +gADEe0SWz3GgAGgsgODwIZIAYfIvjs9wgADwXs9yoAAsIDZ4IojPcIAAiAo4EBABPBIRAA6OAN+A +4JwAKQDKIKkAjCEBpJAAJQAE2OWiUNhFIUECGNpSDOAAINv4uAjYOvQD2M9xoAD0BwWhhNoNcECw +QiEAKA1yALJAhg1wQKBClg1wQLDPcIAAiApAgA1wQKDPcIAAiApCkA1wQLAGlkAqAiXDuAy4grgF +eg1wQKDkoQ6OAeAOrl4I4AAKcACFUSCAgQXyz3CfALj//aAB2CPwANjPcaAAwC8A2kgZmIBJGZiA +ZpYMu5+7BSOBBM9zoADAL0cbWIDPc4AA+GQ5gwHhOaMghVEhgIFOrgXyz3GfALj/XaG5BI/74Hjx +wOHFAN0K8EQtPhcncBzZUghv+8XaAeXPcIAAzIDgEAEAMHWy97UEj/vgeOHF4caA4M9xgADogkWB +JvLPc6AAyB9AEw4GQCiBAs91gAAwc0AVABHQfthg3JU+Zs9xgACICmkRjQCifggmDRACfQkiQgMC +2BUbGIBfoyKBz3CAAOR7IqDBxuB/wcXgeADZz3CAAOR7IKAhoOB/IqAA2c9wgADkeyGgz3CAADBz +PJDPcIAA3AoViM9yoADIHwJ5H4IweRB4CCEBADB5AtgVGhiAP6LgflEgAMPxwC/yz3CgAPQHJ4AZ +gDB5OGADuJYgQgXPcaAAyB8eoRDYDqEB2BUZGIAOCW/7gdhRIADDFfLPcIAATAUB2SGgAsikEAEA +mrmkGEAA4gxv/QHYz3GAAKQPA4EB4AOh0cDgfuB48cAmC6/7mHABgeS40IlD8s91gABEMkeFCBGF +AIDicolkEo8wA/JFhSXwSSfCEPJuz3WAAChd9H/lZfa9B/LPdYAA8F7WfaGNAvAA3cdygADwXtZ6 +RIoII4MACCNDAwAjQgFJIsMDVm51es9zgADwX0Jjz3OAAAhe1nvPdYAAiAq9hWGDpXsEI4MPAAAA +CGZ6AvBDgei6mBmAAADbCfKkEQ0AANuXu5G9lL2kGUADUSQAgBvyz3WAAIgKyIXAuAQmjh8AQAAA +Pr4e5th4BXr+upgZgAAM8qQRAACFIwEEjLiRuKQZAACcGcAAG/D/uhKFEPKkEQIAhSMBBJa7mLuN +upG6pBmAAJwZwACeuBKlCfCUu5a7nBnAAJ64n7gSpXECj/vgeOHF4caYEA4AGRICNgQmgR8AAAAI +O3kEJo0fAAAAECV9z3GAAIBZ8CGCAOm+hCoLCgAhgX+AAIyeQCECBpgQgwAI8kQjAQxEuS5iib7J +cRrwUSYAks9ygAD0BECCC/Ic4cK7fmHIjnlhMImlftB+RXkI8MO7fHt+YXlhMInIjkV5iBiAA6V5 +jBhAAMHG4H/BxaHB8cBiCY/7CHVHwOi9KHDeACEASHYDuEAgkQUnwc9wgAC4QAQlkh8GAAAAQSpC +JCtgBCWAH8AAAAA2uKl3emLPc4AAAEjGvwhjSmMaYkEtgBJSIAAAwLgDuBjgheLKII0PAQCJDdUg +jgAvIAggBCWCHwAAABjPcIAA9EHXcgAAAAgeACIA8CDAA6DhEgABAM9xQnvQXgUofgAKIMAOKnEF +KT4ACiDADkwiAKAkuAHgBPJTIAEAOGDtvQIogSPPcoAAxApVkhHyz3OAAPBBYJMFKz4AACGAfwAA +/z8uuDhgjwAgAFhgFXmHACAAWGFRJUCSUAAhACfFt+UiAAsAM2hTJQIQz3CAACxB8CCAAAUpPgAK +IMAOAeAG8IrlwCjhAMAoogDPcYAA3AouicDapHmGIf8OIrk6etp6NwAgAFhgM2hTJcAQHHjPcoAA +QEHwIgAAFuEFKT4ACiDADs9ygADECjWSAeAVeQiS2ng4YBB4CNxTAI/74HjxwOoPT/uhwRpwKHYA +2KQZAADPdYAAiAoSpQnIBCCADwDAAADXcADAAADwiRb0GcjPcYAACG4UeRGJgOAO9M9wgABwX/Z4 +IogIjhBxxvYKcIYM7//JcdnwUSAAoHzyBBYEEFEkAIFE8hnIz3KAAAhuz3OAAEQyFHoREoUAR4My +joDiD3gD8gWDJfByb89ygAAoXXR7YmL2ukkgwAAH8s9ygADwXvZ6QYoC8ADax3CAAPBe9ngEiAgh +AQAIIYEAACFAAUkgwQMWbzV4z3GAAPBfAGHPcYAACF72eV2FIYFFeQQhgQ8AAAAIJngD8AOGmB4A +ECiFUyQCAAQhgQ8AQAAAPrke4Th6RXj+uJgeABAK8gDYjLikHgAQUNicHgAQdfD/uA/yANiNuKQe +ABDPcEABUACcHgAQANieuBKlZfAA2KQeABAF2BS4nB4AEMDYGLgSpVvwUSBAp0ryAYZRIACBO/LP +c4AARDIHgzKOgOBkEoIwBPIlgyTwSSLCAHJvz3CAAChddHtgYPa4CPLPcIAA8F72eAGIA/AA2Mdy +gADwXvZ6RIoIIYEACCEAAEkgwQMWbzV4z3GAAPBfAWHPcIAACF72eF2FAYBFeAQggA8AAAAIBnkC +8COGmB5AEBnIz3KAADhuFXogogDYBPAF2BS4nB4AEFEgAKUA2M8gYgTKICEApB4AEALIAYDPcaAA +wB3suACB0CDiAM8g4QAAoRGOz3GAAAREwrgJYXQeRBDPcYAADETwIQAApBYBECV4mBYBEFEhQIKk +HgAQC/I7lYC4dh5EEHgeRBCkHgAQEfAohVqVUSHAgHYehBAJ8juVg7h4HkQQpB4AEAPweB6EEH4L +7//JcKQWARBEIX6CjBaCEBXyYhWAEER4hiL/A0S6hiD/Dlhgz3KAAMBB9CISAM9ygACwQfQiEQAN +8MO6z3CAADx6XHr0IJIAz3CAACx69CCRAOC5yiNCJBf0mBYAEFEgAIKIFoAQw7gceNEhIoUI8s9x +gABcevQhEwAH8M9xgAAsevQhEwBAlnQWARGYFgAQWWF6C+//ANqCHgQQAYZRIMCAyiDCBMogIQCY +FgUQUSUAgoQeBBBW8pgWgRDPcIAAuEAoYAQlgQ8GAAAAMbk4YDJvNHkAIYQPgAAoXQAUAQAEIb6P +ACgAAD3ypBYBEJe5pB5AEATZuB5CEADZj7m6HkQQABQBAAQhvo8AMAAAJfLPcYAARDJBgVmmRoEC +eha6BSJCAa66r7qwupgegBAlgQQhgQ8BAADAJXqYHoAQABQBAAQhgQ8AIAAAKLkFIYUAmB5AEQfw +z3EMQKj+OaYD8AHYBCW+jwEAAMAM9AohwA/rcgXYiiOYCDkBL/qKJIMPgeAb8oLgzCDigMohwg/K +IsIHyiBiAcojgg8AAC4GyiQiABABIvrKJQIBz3CAAPBe9ngDiAbwz3CAAPBe9ngCiIwWARAOuCV4 +jB4AEP/YQMAqD6AIi3CEFQEQgOHMICGANvIZEgI2huIy8oIWARHG4VwADADPcYAACG5UeTGJgOEm +9FEgAKAk8p4WARGKuZ4eRBCYFgEQrrmvuYDgsLmYHkAQCvSEFQIQLyqBAE4igAcjuEDAAMAO4A8h +AQDouZgeQBAG8oYhAQ6YHkAQpBYCEAQivo8AAAAwT/KMFgEQnBYAEZQeQBCSHgQQ7LqAHkQUAhID +Ng7yFNiQHgQQfh6EFHgTAwECIsAgEHiyHgQQEfAO2JAeBBAA2H4eBBB4EwMBSiIAIAIhwCAQeLIe +BBDPcIAAMFwAgIYgf48L9JgWAxBRI0CCBfSRupK6pB6AEBC4BXqkHoAQEoUEIYEPAAAAEFIhAQMl +eAQggQ8AAAAQPXkleBKlH/CYFgAQIJaUHgAQnhYAEZIeBBB0FgARGWG4FoAQOGAQeJAeBBAA2IAe +BBB+HgQQghYAEbIeBBAA2DpwWnCCFgERhBYAEQAiQyR5YThgEHiwHgQQz3GfALj/VqGcFgAQFqFt +Am/7ocDxwB4KT/v6C8AIgOAgAgEACMhRIICBGAICAAISATbPdaAAyB9KgaQVABCMIv+PDfJCeNdw +AIAAAEf3h9iQuPEBIACgGQAAUIkSahR4x3CAAChdYIAEI76PAAAAEyjy6bsG8ovYkLigGQAA4vDs +uwj0BZCA4Aj0iNiQuATwhdiQuKAZAADPcIAAiAoYiITg0PTPcYAAZDAMgQ8ggAAMoc9xgAAoCACB +AeAAocLwQpAzEYAAESIAgCLyCcgEIIAPAMAAANdwAMAAAA/0CImA4BH2pBEAALS4pBkAAJIRAAGn +uJIZBAAK8AGBUSCAgQbyjdiQuKAZAACc8AjIBCC+jwAAARB18s4KQAICEgE2CHOwEQIBqBkAALWF +VSJABtW9EHXPdoAA6IJE9wXYB6YFhqJ45ODKJSUQpBEAAAklzRDyuKwZQANX8pgRgADDuBx9CcgZ +Eg42BCCGDwEAAPDPcIAAMFzWeOWQrBEAAEEuBgMJIMUDz3CAAIBZ8CCEA4ARDwF+EQAB+GDPd4AA +xAr3lxS++GAIJQ8AAn8D589wgADEQ/AgQAMivwUo/gNTIQ9wACdAHi8lAgBALEABtXjHcIAA8HLg +kM91oADELO+lAZAOpUAuAAaeuAV+BSWAAwqlz3WAAEwFAdgApQXwoBUDELARAgFQc0X3BdgYuKAZ +AADPcIAAhAQAkECRCSICAM9woAAUBAmAEHLM9wPYGLigGQAAz3GAAPhkDoEB4A6hWQBP+wQogA8A +AC+6QinCdFB6RCr+AgIgQA4QeIDgBPIB4lB6g+BAsQP2gOAD9ADYAvCA2OB+4HihweHF4cZCwc91 +pQCs/1ilz3KAAMQK1ZJIktpiQnsD4yK7emN6YkgiQgAFukUiQgMnuFalUyACACLABCGBDwAAACAH +uiW5RXgleIm4jrgZpc9woACoIAiAwcbBxeB/ocDxwFYPD/vPcKAA/EQFgEogQCAEIL6PACgAAM9w +oAAsIAOAwiACJADdBvDPcAAAWg6+Cc/6z3CgAPxEHYBMIACgBCCED4AAAAAEIIMPIAAAAAQgjg8Q +AAAABPJRIEDGBPQA2QPwAdnPcqAA0BvxggQgvo8AOAAABCePHwAAAIDMISGAwCVhEAUjAQHleQUh +voME9InllgfO/4DnBvKA48wmIZBZ8s9xoAD8RFmB47oJ8s9xgAD4ZAyBAeAMoUjwUyK+gAnyz3GA +APhkC4EB4AuhPvDnujz0gOMI8s9xgAAoDwmBAeAJoTTwgOYg8vq4CfLPcYAApA8FgQHgBaEo8Pm4 +CPLPcYAApA8GgQHgBqEg8AohwA/rcgXYHdsHu0okAABxA+/5CiUAAVEigIHPcoAAKA8G8huCAeAb +ogrwANieuAGhANgFoQqCAeAKogDYmLgd8BGC8LjKICEArAvh+s8goQPPcKAA/EQ5gAaACyBAgAzy +jg/v/AHYA9nPcKAA9AcqoAXYmLgD8ADYMQYP++B4ocHxwL4ND/uhwUfBCHZIdWh36bkEIZEPAQAA +wAogACEv8gLZz3CgAMgcKaAnwVNt7uFQeAT0i3Fp/xnwt+EH9Bt4EHiLcWb/EPCU4QP0HHgJ8Irh +BPQAHIQwB/DPcAAA//8AHAQw4HgA2M9yqQCk/7miABQBMYK4N6Iaoizw6LkO8kwgAKDRJuKRyiCB +A8oiQQOADeH/yiPBAx7wJ8CA4MohwQ/KIsEHyiBhAcojgQ8AAPUNyiQhAEgC4fnKJcEABb2leM9x +pQCs/xahz3CgAKggCIBn/wolAJAT9Oe+DPJMIACgDfQB2c9woAD0ByygA9kG8APZz3CgAPQHJaDP +cIAA3AUAgIDgB/LPcYAAIB0FgR9n5aHPcYAA+GQKgVEmgJIB4AqhBvKODeAEQSmAI6lwCNzvBC/7 +ocDgePHAkgwP+wh1z3aAAEwFBoYQdQry9dgFuEoN7/qpcYHgAvSmptkED/vxwGoMD/ukEQAAKHby +uADYMvLPcoAATAUggoDhMvIAon4WARGAFgAROGDPcYAAxAq3kR1lBfDGDq/6iiCFCFEhgMX7889w +oADELAuAUyCBBP64zCEigA7ymBYAEJoKr/8A2s9xgADECiiRIni4YArwANgI8BnIz3GAADBcFnkF +kYDgrBYBEAj0pBYCELG6pB6AEATwCSEBAAPaGLrPc6AAyB9Po/gTDQBBbQghgQCieaAbQAAA2Zi5 +LqMdBA/74HjhxeHGpBACAPi6CfK2EAEBz3CgAJgDPqB+8AAWAUE8sAAWA0FEIQ0DfbAAFgNAhOVv +oAAWA0FAGMQAABYDQHGgABYDQUgYxAAZ8hjbchjEAAAWA0CI5XOgABYDQVAYxAAAFgNBVBjEAAf0 +KHOGI/MPjCMMgAzyGN4U8BDechiEAwDdz3OAABR6p7MM8B7echiEAwAWA0B2oAAWA0FcGMQAKHOG +I/0MjCMCggn0AubQfnIYhAMAFgNBAvAA2+G+YBjEAATyABYDQbgQgwCgkNtjcHtyGMQAwn2wfboQ +AwFwGEQDSHSEJAyQZXk8sAvyABYBQGi9OqAAFgFAsH07oHAYRAOYus9xoACYA6QYgAA+gbYYRAAb +AY//PJAIckQhAAOE4CbyGcjPc4AAwG70IwAAJXgcsgGC7bgJ8lQSAQG8EgABw7kleFQaBAAJyM9x +gAAUegQggA8AwAAA13AAwAAAANjKICIAzyDiAgex4H7gePHAJgoP+89wgACICmoQEAEZEgE2z3CA +AIBZ8CBCAM9wgACMnoQqCwoAIFEOERINN0AhEyJGJcARERocMALIAN6kEAIAhhiEA4S6pBiAAAGA +osHuuEAhEiYD9KC9sH1TJX6QxgIBAM9wgAB0ZQeAz3KAAHRlAeAHogbIz3egALwtpBiAAy6nBfBC +DK/63dgPh/e4/PNPh/a6UyLAAiPyjuBJ989xgACkDwKBtroB4AKhGfBkuAYSATYQeJAZBAAEIoAP +AAAA8Cy4dBmEAxCpAsjAsWGAyKmGI/8NhLthoRKIEqn2ukICAQAA2Ja49boGEgE2pBkAABHyGg5v +/wDYBhIBNqQRAAAEIIIPAgAAAC26pXpQfUfwAYFRIACBWfLPd4AARDJHhxKJgOJwiWQShDAD8gWH +JPDya89ygAAoXfR/4mL2ukkkxAAH8s9ygADwXnZ6QYoC8ADaACSPD4AA8F52f+SPCCDAAwgggABJ +IMIDFmtVeM9ygADwXwBiz3KAAAhednrPc4AAiAp9g0GCZXoEIoIPAAAACEZ4mBkAAADYlrj0uEGB +hiL/DSDygOJT8pgRggBAIQApSGDPc4AAXHpAwCDCw7pcevQjggBV8AohwA/rcgXYz3MAAJ8KiiSD +D40Fr/lKJQAAmBEDAOm7nBmAAyTygOKAuKQZAAAr8pgRgADPcoAAiApiEoIAhiD/A0S4MiIAIIm4 +QMAgw2R6hiP/A4Yi/w5Eu3piT3rPc4AAsEH0I4IAIfBRIwCCCfKA4gnymBGCAEAhAClIYAzwgOIE +9ADaSHAR8JgRgADDuBx4MiMAIEDAIMLPc4AALHrDulx69COCAIgZAACYEQAAhBmEAJARAQFCDm// +ANoGEgI2AhIDNoQSAQGCGgQAz3agAMgfOGAQeLAaBAD4FgEQsBMPASJ/z3GAAIgKZBEBAQJ3P2cf +Z6AWDhDwf9F3WgANAM92gACICtKGmBMPAAsmwJMj9FCK0IvRctEnIpIR8pgTjwDPcoAAuEDqYoHi +yfYCvs9ygAAoXdR+wmLxug30OGAQeIYbBADPcYAAdGUIgREaXDMB4AihWQfv+qLA8cAKD8/6z3ag +AMgfoBYEEPgWAxCE4CX0AhICNqQSAAD0uHYSAQEH8s9wgAC0e6GAA/CCEg0BEcxRIACBhBIAAQjy +AiXCEAIkgwAIIwMABfCGEgMBG2PPd4AAiAps8IHgR/QREgI3AsjkungQAQEh8lEiQIDPd4AAiApk +FwIRCfJ+EA0BQn1ifQIkQwMq8IAQAwHPdYAAcF8AI4QAcIh2fWCVACMNAYQQAwG7YxrwpBACAPS6 +CPJwiM9ygABwX3Z6YJIE8IIQAwGAEA0Bz3eAAIgKZBcCEV1lu2OEEA0Bu2OAEA0BumJ+EA0BIn0l +8ILgz3eAAIgKHfQCEg02EcxRIACBeBUBEWQXAhEJ8oAVABFCeGJ4AiQDAAfwghUDEYQVABFbYxtj +gBUNESJ9BfAA22hxaHVochHMUSBAgGkXhBAI8gLIdhABAQIhAQFZYQnwgOMCIQEBxfZqFwARGWH4 +FgAQPWUCfR+GEHWM96DYD6YA2B+mP6YC2BUeGJCA2A6m8QXv+nB44HjPcYAA+GQNgQHgDaEZyMdw +gAAkbiyIAeEveSyoz3CAAKQyAogQccr2iiAIAAgaGDDPcAEIAAAN8APZz3CgABQEI6CKIBAACBoY +MAnYGLjgfvHAz3CgAPxEXYAEIr6PAAYAAADZBvQCyKQQAAD6uFLyA9nPcKAA9AcqoPq6GPICyM9x +AwCEADXb63KgGEAAiiAIAAgaGDAKIcAPBdiLuwokgA8CAIQAFQKv+bhz+boF9AISATYG8NP/AhIB +NqAZAADzugrybyBDAKAZAACKIAgACBoYMPK6CvIA2Je4oBkAAIogCAAIGhgwpBEAAPq4CvIF2BC4 +oBkAAIogCAAIGhgwz3CfALj/WBgACKARAAAD8ChwRwFP/+B48cBuDM/62ghv/wh2y//PcaAAyB8I +dUDYD6FAEQEGMHn2CG/9yXC1BO/6qXDxwALIpBAAAFEgAIDPcIAAiAoE8h2QA/AckO//gOA99M9w +oAAUBAPZI6Ag2BAaHDDPcYAA+GQRgQHgEaECyADamBABAHQQAwGUGEAAnhABAZIYRAAgkDtjuBCB +AHlhMHmQGEQApBABAKy5rbmkGEAAgBABAX4QAwGAGIQAO2OwEAEBYnkwebAYRACCEAEBfhiEALIY +RAB/AE//4HjPcIAACIMGgAPbz3GgAPQHZaGB4AHYwHgMuIUgAwENcwCzAsgA2n2QDXBgsALIcYAN +cGCgAshIEAMBDXBgsESh4H7gePHAXgvv+ghzEIkzEY0AAdpAqxkSDzbPdoAAMG7uZs9ygABYbkDc +wasZEg82AiIOA/QmzhPBsxkSDjbwIoIDQaNBgVEiAIEQ8tKJz3KAAPBeFnrcq0CKhiJ/DFx6BLpF +ftyrBPCA2lyrBLgFfb2rHJHPcoAAoG4PsxnI8CIAAASzCcgFo1QRAAEMswCRDbOgEYIASKMIyAQg +gA8CAEEA13ACAAAAA/SIukijCMgEIL6PAABBEAPyibpIo5wRAAHPc4AATAUmuMC4QCgCAw+BwLgN +uEV48QLv+gWj4HjxwOHFCHUCyAeIUSDAgAzyANgeCK/6kLgA2ZK5z3CgANAbMaCKDW/6MNjPcYAM +LADscCCgAcjscQChIIXscCCgIYXscCCgIoXscCCgI4XscCCgJIXscCCgJYXscCCgJoXscCCgJ4Xs +cCCgKIXscCCgBvDPcAAAnAyeDE/6z3CgAMAvoxAAhlEgAIH18wnIz3GgAGgsBCCADwEAAPAsuPAh +AQDPcIAATAUFgMYOb/oleEkCz/rxwNIJz/oIdgbwz3AAAFYMUgxP+s9xoADAL6MRAIZRIACBAN3z +8wnIQBkYgBkSATaG4clwBPQqDQ/9DPDE/89xgADweTB2BvQKiYDgAvKqqe0Bz/rxwHoJz/oZEgI2 +z3GAAAhuAN1UeQISDjagsWGG7rsQ9KixyBlEA3COArt0e8dzgAAoXeWTgOfE9mG/5bMAIoMPgAAk +bqSrrKvPc4AAMFxWe2KTuBlEA3AZxADPcYAAoG5VeaChIYYEIYEPAAAAYNdxAAAAIA30z3GAAIBZ +8CGCAM9xgACABFR5QJEQ4kCxA9rPcaAAFARQocX/SQHP+uB4ocHxwMoIz/qhwSh1GnBacgQhvo8B +AADAOnMs9Oi9QMUN8iDBz3CAALhAKWAEJYAfBgAAADG4OGAC8AHYBCWBHwIAAAHXcQIAAAHKIKEA +geAN8oLgCPKD4ADYyiDhAcAooQMH8APYDrgD8ADYjrgFfQpwngyv/KlxCnCpcUpyKnMB3Zh1o/yA +4Dz0CtjPcaAAyB8eoRDYDqEVGViDBfDSCm/6iiDHAFEgAMMO9M9woAD8RB2ABCC+jzAAAAAE9FEj +AMDv81EjAMDKIcIPyiLCB8ogYgHKI4IPAADJAcokIgAwBWL5yiUiAFEgAMMA2Ar0z3GAACgPCYEB +4AmhANiYuAjcKwDv+qHAocHxwOHFUSAAggh1mAAhAELAIsPPcIAAuEAEJYIfBgAAADG6a2AEJYAf +wAAAADa4emLPc4AAAEhKYwhjWGBBLYISUiICAMC6A7oY4oXgyiKNDwEAiQ3VIg4AUHFCACUAANjt +vRgAIQACIYAAz3EcR8dxBSh+AAogwA4D8CK4qXLGuuu9z3GAAChD9CGCAAXyPGpUeTB6BSo+AEEp +gHAI3KsHj/oKIcAP63IF2BPbjLtKJAAAVQRv+QolAAHxwBIPj/oIdjCIz3KAAHBfz3CAAAAAoIA2 +elElgJFgkhryoYBRJYCRQN3PJeIXyiWBHwAA0ADPJeEXz3efALj/vaekgAHl072koAUljR/Q/gAA +tqcRzFEgQIAM8s9woAAsIK+AhBYAEQglDRACfQPwaHWwFgARZOAQdfgADgDPcIAAKF0CuTR5IGBK +IAAgBCCBD4ADAAA3uWW5SCEPAAQggA8YAAAAM7gN4A8gECAJJcEQo4qSDu//mBYAEJgWAxAJIAEE +aHLGuuu7z3CAAChD9CCCAATyHGpUeBB6IroAKsADA+AEIIAPAAD8/89ygAC0ewOiz3KgAMAvThoY +gE0aWIMJyBkSAzYEIIAPAQAA8Cy4QCgNBhS7nb2le2V5SxpYgM9zgAAoDzyDFXoWEgCGKhIAhgHh +PKMG8M9wAACsD2oIT/pRIYDF+fPPcKAAxCwLgAQgjQ/wBwAA/rg0vVMggQQI8oHlxvcAlhDgEHEV +989ygAD4ZDuCAeE7os9xgAAAACCBUSGAgQDYJvLPcZ8AuP8doSDwEI7PcoAAKF0CuBR4AGL7uNUh +QgPPd4AAtHsgp6KnmBYAEO4LL/8A2gGnz3GAAPhkHIEB4ByhGoEdZQHYuqGhBY/6pBABALe5pBhA +AADZOaC4GEIA4H+6GEQA8cDPcIAAtHsBgM9xoADIH5YgQQ8eoRDYDqEB2BUZGIAT8M9woAD8RB2A +BCC+jwAWAAAI8vq4FvT5uBD0/LgS9FEjAMAS9M9xoAD0ByeB/7kA2OnzpwEP/6MBL/+KIIgAiiBI +AJcBD/8B2c9wgABMBSGgWg5v/Chwz3GAAKQPA4EB4AOhdwEv/4ogCAJRIEDD8cAp8s9wgAC0ewGA +z3GgAMgfliBBDx6hENgOoQHYFRkYgCIKb/pB2FEgQMMT8gHZz3CAAEwFIaACDm/8AdjPcYAApA8D +gQHgA6EjAS//iiAIAs9woAD8RB2ABCC+jwAGAAAO8vq4yiCCDwAAAQL+AAL/+bj2ACL/iiCIAAPZ +z3CgABQEJaAA2OMAD//hxQISAjYgkkGCQOH0usAhogAD4c9zoADUBw8TDYYEIYEPAAD8/7FwGmHI +9xnIFSIBMBoRAAYdZQIiQQMZEwCGEHE+9w8bmIDgf8HF8cCWC4/6qMEA3s93gAC0exHMABcQEM91 +oADIH2GHUSBAgALIDvKgFQIQ+BUBECJ7AiLWAHYQAwEvJoglW2MF8IQQFgHCczoYhAUfhRBzyfdw +eM9xgADcCsIJb/41iQHZz3CgANQHNKAzoAPZLaAREBeGz3GgANQHVicAIg8ZGIAUGZiDAsikEAAA +USAAggXy5g7AAAPwRx2Yk89woADUBw0QAIZALgEkEHgFIREAAsghgAAQFAFAwbgQggByEAEBAiGT +ALoQAQFBwkLBWYDPcaAA1AeIGYAAav8JyM9xgADEewQggA8BAADwLLgCEgM2BLEPg86pAKFAEwAB +ArEQi2ATAwFUaMO7ZXoPqUaxGRICNs9wgACEbkAgBAchh1V4R4A6YkegpBUAEDhg+BUBECJ4Q8AB +2M9xoADUCxChAocCuEAgwQrPcAAA/P8keJe4mribuOxxAKEBEgE27HAgoCKH7HAgqBkSATbPcIAA +CG40eDCI7HAgqOxwwLAZEgE2z3CAAFhu8CBBAOxwIKAZyPAkAQDscCCw7HDAsOxwwKDscMCgCRIB +NuxwIKACyCCQVBAAARC5JXjscQChAhICNgGCUSAAgQ/yMopQis9wgADwXlZ4AIiGIH8MHHgEuCV4 +AvCA2OxxAKkCyM9ygABMBTCIMxCAAAS5BXnscCCo7HDAsAISAzbPdaAA1AecEwABJrjAuEAoAQMP +g8C4DbgleAWiGRICNs9xgAAIbgAigA+AADBuwKjPcIAAMFxWeFR5wLECkLgZhAMVJIIAwKJwGQQA +z3CAAIgKHJDIGYQDSiEAMAoiQCZEwCt2K3cr8EwiAKAG9BDMUSAAgBPyz3CgANAbEYDxuMogIQDg +DiH6zyDhAwDZkbnPcKAA0BsxoADYFB0YkALIQCJSIM91oADUByiIAeEoqAkSATbPcKAASCw9oM9w +gAC0ewKAUnCEAg4ATCIAoILy8f4FJw+QOAICAA+FEHgZFQGWWOAwcNT3D4UQeBkVAZZY4DBwxveE +FQAQsuA39w+FEHgZFQGWWOAwcKYADQAeHZiTHRUAlgYSATYJGhgwHRUAlkAmAxJHwB0VAJYAsR0V +AJYBoVYmABIeHRiQHRUClkAuACRQegUiEQAA2s9woADQG5G6UaDPcIAAYAMQeM9yoAC0R0kaGIDP +cIAADAVgoM9wgAAQBSCgbyBDAFQaGIDPcKAA0BsRgPG4B/QA2NYNL/qPuAYSATYBgUDAKnCGIPMP +jCAMgAARFAEM8hrYC/DPcoAA+GQegoohECEB4B6iyPAg2HpwCHIBwFhgEHhyGQQAAMD2uAfyz3Cg +AEgIQCQBIwbwQCQBIc9woABMCBtwAcBMIgCgGWECwEXBBSERIAdpBCCADwAA/P9GwM9wgAC0eyOA +BsAIIFUAE/IMJQCk3gANAL/+BScPkHL0AdgUHRiQVSZAFA8dGJBRIgDC/vUFwM91oADUBxWlABhA +NAIkwCQPpQbBAiBQJUwiAKACJUAgG6UD2BClAhIBNhnyKInpcMi4DLkleOxxALEDzOxxALEHwEAh +WTABGhgwBhIBNgLI+nYCGlgwBhoYMAGBIJFWJw4iNLjAuBR5A+HPcAAA/P8EeT5mGRIBNgbwFSJA +MBoQAAYCfhUiQDAaEAAGEHZ39wPMz3GfALj/GKHPcKAA/EQ9gAQhvo8ABgAAfgXB/0wiAKAQ8oon +EBAT8M9ygAD4ZD2CiiESIAHhPaIi8Dp3IPAJyM9yoABILIonCBAdovq5z3GAAHRlCvIAgYC/z3Wg +ANQHAeAAoezxAYGBv891oADUBwHgAaHk8UohACBTIX6gA/Rz/gV/gOcX8uG/DPICyCmIAeEpqM9x +gAB0ZQGBAeABoQrw4L8I8s9xgAB0ZQCBAeAAoTp3Asjpcci5CIgMuCV4AxIBNxC5JXjscSp0hCQC +kQChQCFOMBLygB0AFAPMKnHIuRC4JXjscQChANgMpQHYFB0YkGYK7/4B5gLIkhAAAVEggIIu8lYP +AAQQ2c9woADQDxAYWIAkEAGGz3KAAPB5RZIweQK6RXkMGFiAFNkQGFiAz3GAAPB5Z5FGkRjZELtl +egwYmIAQGFiAz3GAAPB5aZFIkRC7ZXoMGJiAB/AA2M9xgADweQqpz3GgANQLANgQoUwhAKBO8gbw +CNrscECgAebPcIAAtHsCgBB2uPcJyM9yoABoLAQggA8BAADwLLjwIgAAz3KAAEwFRYJRJ0CSRXgN +oQPYEqXPcaAA8BcFoQXy6nBG/gbwEx0YkADYFB0YkM9yoAAsIDCCA8AwcAHZyiEmAEQgg0APguTg +AdjKICYAgOHMIyGAzCAhgOzzz3AAKAgACBoYMATAhgnv/ADZqPDPcIAAXCMSiFEgAIAX8lEgAMMV +8s9wgABcIw+Iz3GAAHSIELggiZ+4gOEB2cB5D7kleM9xoAD8RA2hTCAAoA3yz3GgANQHgBkABM9x +gAD4ZB2BAeAdoQnIz3GgAGgsBCCADwEAAPAsuPAhAADPcYAATAUlgSV4z3GgANQLDaHPcKAA1AcA +2Syg4g9v/wTAz3CgANQHGRAAhsDgqgAOABHMUSBAgE/yz3CgANQHA90gGFiDAdkUGFiAANjPcYAA +DAUAoQDYkbjPdqAAyB8THhiQz3CAAOgCEHjPcqAAtEdJGhiABsjPcYAAEAUAoW8gQwBUGhiAExYA +lvG4yiAhAIAJIfrPIOEDz3CgANQHDxAChgYSATa0GYQAExhYg89wEiAAALoL7/4ZEgI2BsiwEAAB +oBYBEGTgMHDKIIUPEigIAIT3z3AAKAgACBoYMBHMBCCADwAAAgiC4An0BhIBNoogBACmDy/8mBEB +ABkSATbPcoAAGG4A2DR6ALICyBYPIAIakM9wgAAAAACAUSCAgQfyz3GfALj/ANgdoVEDb/qowPHA +4cUCyKQQAQCYEAIAUSEAgHIQAQFIcAbyqgnv/gDaCHUH8AHhngnv/gDarGjmCkABz3KgAMgf+BIB +AALIz3OAAChdEIgCuBR4AGPtuAf0AdgToniCWYIF8ALYE6J6gluCAiVAEHhgEHPAIm0ADXEAoQ1w +QKAAFgBAABYAQALIz3KgAPQHcBABAWi5J6JwEAEBaLkweRUDb/pwGEQA4HjxwM9wgAAIgwaAAdmB +4M9woAD0B8B5GYAMuYDgyiHCD8oiwgfKIGIByiOCDwAAcQnKJCIAlAfi+MolAgECyByQJXgNcQCx +Asg9kA1wILACyC+ADXAgoALIQBABAQ1wILACyDGADXAgoALISBABAQ1wILACEgE2HJGGIP8MhOAf +8jOBDXAgoALIUBABAQ1wILACyFQQAQENcCCwAhIBNhyRhiDzD4wgDIAJ9DaBDXAgoALIXBABAQ1w +ILACEgE2HJGGIP0MjCACghD0YBEBAQ1wILACEgE2pBEAAPe4BvI5gQ1wIKACyBz9AhIBNqQRAABR +IICBB/IBgfC4FPKZ/2sGj/46gQ1wIKACEgE2pBEAAIYg848G8juBDXAgoEsGj/5HBo/+8cAB2M9x +oAD0BwuhA9gIoc9woAD8RB2ABCC+jwAGAAAv9OB44HjgeFEgQMMp8gLIz3GgAMgfsBAAAZYgQQ8e +oRDYDqEB2BUZGIDSDu/5QdhRIEDDFfLPcIAATAUB2SGgAsikEAEAmrmkGEAApgov/AHYz3GAAKQP +A4EB4AOhwgtP/8MFj/7gePHA1ghP+qQRAAChwVEgAIDPcIAAiAoodgPyG5AC8BqQmBYBEAQhvo8B +AADAdh4EEC306LlAwQ7yIMLPcIAAuEBKYAQhgA8GAAAAMbhYYAPwAdgEIYIPAgAAAddyAgAAAcog +oQCB4A7yguAJ8oPgANjKIOEBwCihAwbwA9gOuATwANiOuAV5mB5AEJ4WABGUHkAQkh4EEIIWABGQ +FhMRz3WgANQHsh4EEADYgB4EEH4eBBAZFQCWuOAQFpIQTfcRzM9xgAD4ZIYgiAIRGhwwFYEB4BWh +nvAPFRGWARIQNgHZz3CAAAwFIKAA2JG4z3GgANAbEaHPcIAA6AIQeM9yoAC0R0kaGIDPcIAAEAXA +oG8gQwBUGhiAEYEJEg828bjKICEAcA3h+c8g4QOkFgAQ9rgi9AkSAjYCIsEDgeEA2AfyAieBEIwh +w48C9AHYgOAU9BHMz3GAAPhkhiCIAhEaHDAUgQHgFKEPHViUCRrYMwEaGDRQ8AEaGDQRjs9xgAAE +RMK4MiEFAAka2DPPcYAADER0HkQR8CEBAKQWABAleKQeABAAlqBwEHiQHgQQcnDKIcIPyiLCB8og +YgHKI4IPAAAdB1wE4vjKJMIEEBaEEAwiAKHKIcIPyiLCB8ogYgHKI4IPAAAeBzgE4vjKJYIEDxUA +lrQeBBBOCy//yXCkFgAQhiDlj0gLIv7KIIIDDx1YlLMEz/7xwNIOD/oZyM9xgACAWfAhAADPcoAA +AACEKAsKACGPf4AA7J20FwEWz3CAADBcIKAAglEgQIAh8iKCCcgkeCOCMHAb9AGCUSBAgEDYzyDi +B8oggQ8AANAAzyDhB89xnwC4/x2hBIIB4NO4BKIFIIAP0P4AABahEMxRIACAQfLPcKAA0BsRgPG4 +yiAhAPAL4fnPIOEDz3GAAIBcSJEZEgE2AsjPdaAA1AcRIkCAkBAAARDyGRUBljjgMHDM989wgACU +BCCAz3AAAJgeLgrv+Ye5DxUAlgISATa0GQQACMj+Da/+GRICNgISATaSEQABGgov/JQRAQACEgM2 +Ad0Y8APYz3GgANQHIBkYgAHdFBlYgwAWAEAJGhgwABYAQAISAzYBGhgwtBMAAQ8ZGIAZEgE2z3aA +AAhuFCZCEAiSgOAW9JgTAAA1fgymFKbPcIAAgFnwIEEAz3CAAIAE9CBAALwbBADIGgQABvDIEgAB +vBsEAEYL7/6gG0ADAhIDNqATAAAEIL6PAQEAABfyANnPcKAA/ESeuSGgz3CgANAbEYDvuB7y1g7v ++wHYz3GAACgPHoEB4B6hFPCSEwABlBMBAJATAgGyEwMBRg/v/kokQAACEgI2oBIBACV4oBoAAAIS +DjagFgAQBCC+jwEBAABA8s9woAAUBAPZI6AIyAQgvo8AAAEQJfKkFgAQ8rgh8s9xgABMBQCBgOAb +8gDYAKEF8EoPr/mKIIUIUSGAxfvzz3CgAMQsC4BTIIEE/rjMISKAB/KYFgAQHguv/gDaAsigEAAA +8LgI8oogCACrBSAAEBocMIogEACfBSAACBoYMAPMz3GfALj/GKHSD+/+GcgIyAQgvo8AAAEQAhIB +Nhny4g/P/oDgAhIBNgzypBEAAPG4EczFIKIEzyBhABEaHDABge64BfIRzIC4ERocMHYIL/8ocIYJ +L/8CyAISATYckYYg/QyMIAKCD/QQic9ygAAyXQK4FHgQYoHgB/RgEQABhLhgGQQACtjPcaAAyB8e +oRDYDqEVGViDBfBiDq/5iiDHAFEgAMMO9M9woAD8RB2ABCC+jzAAAAAE9FEjAMDv81EjAMDKIcIP +yiLCB8ogYgHKI4IPAADJAcokIgDAAOL4yiUiAFEgAMMA2Ar0z3GAACgPCYEB4AmhANiYuIDgCPID +2c9woAAUBCOgdvECyKQQAAAEIL6PAAAAMKvy9LgUCQH/AhIBNqQRAADsuEryMgwv/wHYAhIBNgPb +HbHPcIAACIMGgM9xoAD0B2WhgeAB2MB4DLiFIAINDXMAswLIfZANcGCwAshvgOC7ANoG8mKHDXBg +oGaXB/ANcGCgAshAEAMBDXBgsALIcYANcGCgAshIEAMBDXBgsEShAsgZEgM2gBACAX4QAQHPcIAA +hG51eFlhR4BZYXYOL/8noNsDAAABgfi4DvLPcIAARAgAkB2xz3CAAEgIQIABgFGhEqEI8H4LL/8C +2AISATYdsdoOD/8CyA4OL/94EAABgOCaAwIAAhIDNhnIz3GAAIRuFXkHgYATAgEaYkehAYOYEwEA ++LiUG0AAFPLPdYAA8HmpcN4OL/9ocRDYEBocMBHMo7gRGhwwrghv/6lwTwMAAJ4TAAFAk3QTDQGS +GwQAumJQepAbhAAuCW//ghMDAfi4SvUCyKQQAQD0uVUgwgd08tYKT/8CEgM2gOCSEwIBlBMBAEny +SHDPdoAAtHtAhhYK7/5ils93gACAXCiXgOHKIIIPAACEHtgNgvnPdYAAmAQAhYDgIfIZyAISAjYV +IgEwmBIAABoRAQYiCK/+INojlQIgTQACyCCGmBAAAA4Ir/4g2hB1CHFJ9xC9z3AAAHQejg2v+aV5 +qg1P/wiXgODKIIIPAACEHngNovnKISIAfwIAAKQTAACnupIbhACQEwIBtLikGwAAkhMAAXoJ7/6w +EwMBA9nPcKAA9AcloALIGRIDNpgQAQBVIMIHz3CAADhudXggoAqCUSAAgcwOwf4CyKQQAQAodIQk +GpAK8lYNz/0D2c9woAAQFCWgFfBRIQCCBvKSDEAADg1AAA3wcBACAc9woAD0BwDZR6DPcKAAyBwn +oALIAYD5uAf0qgkv/wTYAhIBNh2xhf3N/QISAzYZEgI2hBMOAYITDQHPcYAAhG5Ved1lx4EEIL6P +BggAAN1lp6HV9M9woAAUBAPZJaABg1EgwIAk8qQTAABRIACAz3CAAIgKA/K9kALwvJDPcYAAXCMS +iVEgAIAU8g+Jz3GAAHSIELggiZ+4gOEB2cB5D7kleM9xoAD8RA2hBPB2Ew0BEcxTIECABvIIyAYS +ATbK/c92gADweclwpgwv/wISATZuDE/+xgoP/4DgkfQCyJIQAAFRIICCXAnCAwLIAYBRIMCASvL+ +Dy/8gNgIEgE2BCGBDwIAAQDXcQIAAAAREgI3CPT9uAbyTyLAABEaHDAG8KO6UHgRGpwwAhICNiGC +USGAgSDyi7iMuBEaHDAQijMSgQDPcoAAxHsEuAV5JrJKJAB1ANioIIACz3OAAOBt9CMDAHBxBfIB +4M9wAAD//wSyCNgQGhwwz3GAAPhkEYEB4BGhI/AQ2BAaHDARzKO4ERocMMINL//JcALIAYDuuAn0 +GcgB2gAggQ+AAIhuQKkRzFMgQIAJ8gYSATaKIAQAQgvv+5gRAQCeCi//qXACyBqQugrgARkSATYR +zFEgwIAP8s9wgAAUegISATYCgJgZAAAIyOIOb/4ZEgI2OQfP+eB48cDhxW/YlbjPdaAAyB8SHRiQ +z3ABAEA8FR0YkC4OD/yKIAQADqUdB8/54HjxwJYOz/kD3892oADUBxMe2JMPFhCWABYBQAAWAkDT +uc9wsP4AAAV5z3OfALj/NqNTIsEEJXgWo096nOLKIcIPyiLCB8ogYgHKI4IPAAA+C8okwgCAA6L4 +yiUiAAAWAUAweQAWEUBA4VEhAKXAIaIAA+EEIY0PAAD8/wfwz3AAAFILsgiP+RkWAJZCJQEUEHE2 +9wAgQCMPHhiQIB7YkwQhgC8AAABAUQbP+eB48cDqDc/5CHXPcYAAAAAAge24giQDMBryAYHtuEDY +zyDiB8oggQ8AANAAzyDhB89ynwC4/x2iBIEB4NO4BKEFIIAP0P4AABaii3DPcYAACEgyDK/9wNrP +cKAAFAQB2SSgz3GAAPhkE4HivQHgE6HTuAUggA+w/gAAz3GfALj/FqEb8hnIz3GgAGQu8CEQABDg +SiEAIA8hESAB3ynwrv/PdoAA8HkId8lw7gkv/4txegsv/8lwG/Co/wh3ANgacDpwFfCO2FEmAJGQ +uKAcADAG8obYkLigHAAwgOfMJSGQ4PUD2c9woAAUBCOggOepdonyANjPcYAADAUAoQDZz3CgAMgf +kbkTGFiAz3CAAOgCEHjPcaAAtEdJGRiAi3DPcoAAEAUAom8gQwBUGRiAz3CgAMgfExAAhvG4yiAh +AGAKofnPIOED4b5EJo0WvfWA5wfyjNiQuKAcADDA8STAArgUeMdwgAAoXSCAKHSEJAyQEPJRIUCC +Ad0H8ovYkLigHAAwrPGI2JC4oBwAMKjxIpAzFIAwESEAgCDyCcgEIIEPAMAAANdxAMAAABb0IsGA +4dT2jdmQuaAcQDAEIIAPAQAA8Cy4z3GgAMAvFXkqEQCGFhEAhhXwCsGMIf+PgPPPcKAAyB+kEAAA +InjXcACAAADsBsb/h9iQuKAcADAB3W7xRCb+kgjyz3CgABQECYCA4HL14b4R8s9woADELBCACyAA +hGj1z3AAALAe0gyP+QsgQIRg8xkE7/mAJAMw4HjhxeHGocFKJAByANmoIMAOACGCD4AAlJ6EKAsK +MiJCDs9zgAAses91gACICkDCIMLDulx69CODAEwVAhF6YnqVYrpbYwPiz3WAAMRD8CVNECK6BS2+ +EFMhDnAAJkIeXXrVaDV+x3aAAPByQLYD4yK7BS3+EFMhA3AAI0IOXXpBtgHhocDBxuB/wcXgePHA +4cWpwYt1qXDPcYAAyEiqCa/9JNqpcLYP7/4CEgE2Pgkv/6lwfQPv+anA8cD+Cs/5ocHPcYAAWHgk +gc91gACICvqVz3OAADx6BCGBDwAAABBFIUEDQMEgws92oADIH8O6XHr0I4MAoBYCEOJ7UHNiAA0A +fhYClqO6fh6YkBB4cHvSCS//FNr4uCX0A9jPcaAA9AcFoeTaDXBAsA1yANgAskKFDXBAoEaVDXBA +sECFDXBAoEKVDXBAsADYBKHiDg/+QBYBFjB5vgiv/elwAdgC8ADYvQLv+aHA4HjxwM9wgACIChiI +heAO9M9wAQCghpYPAADiCcAACHHPcIAAEBq+CkAA0cDgfqkDr/gU2OB48cAeCs/5z3WAACgaBYUD +gM92gACAcUCAAYbPcS0AwMY4YAJ6gOLG9soLD/vWCw/7IYbHcS0AwMZ2CmAAqXBNAs/54HjPcIAA +KBoFgAOAIIDPcIAAgHEhoEEFb/sQ2OB4z3CAACgaBYADgCCAz3CAAIBx4H8hoOB4z3GAAARxAIGA +uOB/AKHgeBEFb/sQ2OB4CiJAgADZ7gABAC8mAPBKJkAATgAGAE8AIACKJf8P4HgKIkCAANnOAAEA +bAAkAC8mAPBcAAUAKwg1CEomQAAIcQDYAiG+gOAgxQdCeQHgAiG+gOAgxQdCeesH7/8B4C8tAQBA +JUUAAiZ88QAAIAAAKEAB6CBiAy8gAIAvIUsAAiG+gMAghgHCIYYA4H4RACAASiAAEEogQBAOIkIA +LyALEs4gRYCKJf8PCAAFAC8tAQBAJUUAAiZ88QAAIAAAKEABSiZAAOggIgMvIACALyFLAAIhvoDA +IIYBwiGGAEomAABCIP6QziCCAUQgfpDOIYIB4H6hBgAA4HjPcYAAiAopgVEhQIDhIMIHyiCiAES4 +z3GAAEAaw7gJYeC5BfJRJYDRHPRRIUCAHPLPcIAAiAo4iIHhEfLPcIAARJsAgFEgQIAH8s9wgADg +oAyIh+AD8oLhBvRRJYDRBPIB2OB+4H8A2OHFRCIBU01yhiL8A01wTXAEJYBfAAAAIEEofoMI8s9w +gABEmwCAUSBAgAT0ANgD8AHYiOES9M9wgACIChiIgeAF8lElQNEI8gTwhiX21wTyAdid8ADYm/CA +4f71z3GAADBzVBGDAIDj9vXPc4AARJtgg1EjQIAb8s9zgADgoGyLh+MV9GGBjCP/jxH0pJHPcwAA +//9wdQv0ZYGMI/+PB/RskddzAAD//9TzhCgLCgAhgH+AAOydaYDPdYAA7EhRI0CBBfJAJQMXA/BA +JQMUGIgLY0EqAAEIZRZ7z3CAAAhJfLh4YCgQgwDguwbyHoGGIPaPGPLhuwbyHoFRIICCEvLiuwXy +USUA0gPyAdgL8OO7CPLPcKAADCQRgIwg/4/38wDYUSOAgcogIgDPcYAARJsggVEhQIAI8gQlvt8A +AAAiyiBiAIDgFvLPc4AAMHM+g+i5HfKMIgKAzCKCjwAAUADMIoKPAADQABH0k7k+ow/wz3GAAIgK +KYHhuQj0jCICgAX0USGAgQPyAtjgf8HF4HjxwJoOj/nPcKAADCQYgEEohAdBLQBUwbiD4Ar3MyYA +cIAAhElAJwFyFHkAeQDYGPDPdYAAMHOUFYAQQCgBBoYg/Q9SIMABRbgleM9xoACIJBChPoWzuT6l +U/AB2EQoPg0AIYB/gACIXiGIz3WAADBzlBWCEM92oACIJFMhRQA+hUAqDwaGIv0PDCRAgVIiwgFF +ugXy5XpQpt7xz3OAAGxJYoOaueV7ZXpQpj6lz3GgAMgcENpJoSSAz3KgAPAXJqIjgCaiIoAmoiGA +JqKGFQERaLkweYYdRBBTIcGAwCAhCMAgIgwggDOiLGgggTOi+BABgjOi/BAAgBOiANgKogUGj/ng +ePHAlg2v+QDbz3CgAAwkWIDPdYAAMHOtcEEqhgeGIPcPlBWBECm4NnvAc8dzgACoXBV7AIvPc4AA +PAVgg9No1X7XY9tjRCeFkFMnjhAEIo8PACAAAMwnIpAH9EwlAIDMJyGQAN8C9AHfkODAAAoAgObM +JyKQWvJMJUCBy/cKIcAP63IF2JbbSQJv+Iokgw/Pd4AAbEnwJ4QTQCkFBoYh/Q9ALoYDUiHBAQUk +hAEFJQ8BRbklf89xoADEJ0EZ2IOC5h30HoUQ2Zq4HqXPcKAAyBwpoAeDz3GgAPAXBqEGgwahBYMG +oQSDBqEA2AqhhhUAEWi4EHiGHQQQJ/BKFYMQgOMj9EylhhUCEWS6g+ZQeoYdhBAJ9CsRAYZkulB6 +hh2EEC2lNgyP/RHwQCkABoYh/Q9SIcEBRbkleM9xoACIJBChHoWzuB6luQSP+eB4z3CgAMgcENkp +oAHYz3GgAPAXCqECEgM2HJOGIP+MKPQPg1EgAIAk8s9ygACIXgSCBqEDggahAoIGoQGCBqFwEwAB +HuBTIMCABPRAIgAIBPBAIgAMQIBToUxoQIJTofgQAoJTofwQAIAToQrwCIMGoQeDBqEGgwahBYMG +oeB+4HjhxQISDTbPc6AA8BcPhc9yoAD8FwijQBUAEQqyEYUIo0gVABEKshOFCKNQFQARCrIclYYg +8w+MIAyAB/QWhQijXBUAEQqycBUBERyVCOEIsh2VCLJUFQARCLJgFQARCLIZhQejGoUHoxuFB6Ny +FQAROGAQeAiyz3CgAPQHJ6AC2c9woADIHCeg4H/BxeB+4HjgfuB44H7geOB+4HjgfuB44H7geOB/ +AdhGgYDiCPIjgWCBIoJieTBwANgD9gHY4H7xwM9xgADUGphw+P+A4Anyz3GAAPQaiHD0/4DgA/QA +2Anwz3GAABQbiHDw/4Dg+fMB2NHA4H7geAhzOGDVu9W5MHM2uMT3AiNCAArwz3KAAOiCRYIB4Mm4 +Inp6Yha44H9FeOB48cCqCo/5CHXXdSUAAIAA2Er3z3GAAOiCJYEwddD3In0B4Pnxz3CAAOiCxYCp +cPII7//JcQUuPhACJU0ejCAQgMohxg/KIsYHyiBmAcojZgnKJCYAiAcm+MolBgEWuLkCr/mleAHa +z3OgALAfWaN+g4DgBfIie3Bwg/cA2ALwSHDgfuB4z3KgACwgcIKA4AryAiNCANdyAIAAAAb3UHCG +9wDYBfBwcH73AdjgfgomAPCKIL8PyiBkAOB/LyADAOB/iiD/D/HA5gmP+Y4KIAAIdYDgz3GgAMgf +RYUN8vQRDgACgGSFxHpFe/QZwAAihQChCvD0EQAARHj0GQAAHNgYuBUZGIARAo/5D9mauc9woACw +HzWg4H7gePHAkgmP+Qh1z3agAMgfpBYAELhgpB4AEAHYE6ZYhjmGANgAIkKDASEBAFimOaYC2TOm +OoZbhgAhQYMBIIAAOqYbphWG6gygAKlxFaYXhuIMoACpcRemD9iauA6mz3CAABQb0//PcIAA1BrR +/89wgAD0Gs//iQGP+c9xoADIH/QRAAAA2kYgwA/0GQAADciauJu4nLgNGhgwHNgYuBUZGIBYoVmh +WqFboaQZgADPcAAMDwAOoeB+4HjxwNoIj/nPdaAA0BvThfq+BvLPcIAA1Bp6CQAA+74H8s9wgAD0 +Gm4JAAD8vgbyz3CAABQbXgkAABzYGLgTpQkBj/ngePHA4cUlgECAQiICgMoiYgCA4sohwg/KIsIH +yiBiAcojgg8AAF4AyiQiAKAFIvjKJQIBYIEwcwryQoCig0J9gOUE9mCDMHP69UGDAaNgoEGgAKJE +gKWAUSJAgEAlAxYL8kaFgOIG8qKCQoBCfYDlw/YAo0SApYBRIsCAQCUDFwvyR4WA4gbyooJCgEJ9 +gOXD9gCjQYBQcQX0Gg7v/wWAbQCP+eB4QIAQcgjyZIILI0CABfRAghBy+/UA2uB/SHDgePHA0g9P ++Qh2AIBCIAGAyiFiAIDhANgm8iWGQYYB3zByIIZBhkGhIKIAps9wrd4CAAGmpYbAfwaFEHYG9Klw +Atnp/walpYYHhRB2BvSpcAjZ5f8HpYDnBfKaDe//BYYB2NkHT/nxwG4PT/kIdSh25f8Id8KlqXCz +/8EHb/npcOB4IIAQccohIQDgfyhw8cBGD0/5CHce8ACGIYYhoAChANgAps9wrd4CAAGmpYYGhRB2 +BfSpcALZzP8GpaWGB4UQdgX0qXAI2cj/B6UjhmB5yXDpcOz/CiYAkAjyA4cggAKGIniA4LIHzP8K +De//6XBNB0/54HjxwOHFCHUD8MH/qXDg/4Dg/PVFB0/54HjgfuB4gOHKJE1w4HjoIC0Cz3GgAFAM +JYEBGFIA4H7gePHApg5v+bhwmHHPc4AAcAUBgyKDz3aAADBzz3WAAIhJAnkehjm4wbgUfQEVhxDP +cKAA1As8EAYAsHHPdaAA0A8A2kT3ANhG8KgWABDPcaAAyB9k4B6hENgOoQHYFRkYgBlzBvDPdaAA +0A8JcxcVAJYigwIgwAECeUghAQABgwJ5SCEBAEwkQIAT9FBx0ffPc4AAQBsCiyUVD5bBuNNoAeAC +qwOD2H/neAOjAeLv8VEjAMAS9LBxz3OgANQLqAfF/wQQARAB2KBxBBhAEDwbgAE9Bk/5yggP/Lbx +4HjxwMoNT/nPcIAAvHMIiIwgAoAr8jJoNHnHcYAAKF2ggc9zgAAIXs93gAC4gvaXFntBg1AljhWG +J7sfwKGMJ0SQhiIBDkGjBfSRvsChC/CxvYHntr2goQf0lr2goYUiAQ5BoxoKj/kA2c9wgAC4gsUF +b/kvGEIA4HjhxeHGz3CAALxzSIiMIgKAz3OAANSCGPLSi89wgAAIXjJqNHnHcYAAKF1WeIDmQIGh +gAbylbpAoau9BfC1ukChi72hoADYE6vBxuB/wcXgePHAAg1P+c91gAC4ggqFz3OAAAheRCAEg89w +gAC8cwiI0mjUfsd2gAAoXUCGFnshgxPyUCKPBeCmTCQAgYYhAQ4howX0kb/gpgTwsbq2ukCmYgmP ++QbwlrpApoUhAQ4hoy8VgBCiuAUFb/kvHQIQ4HjxwOHFz3CAAOydSIDPdYAAuIIphbe6uLoEIYEP +AwAAAAe5RXkooLYM7/kA2AmFz3GAALxzUSCAgkiJz3CAAAheMmo0ecdxgAAoXWCBVnhBgAXylbtg +oau6BPC1u2Chi7pBoC8VgBCjuKEEb/kvHQIQ8cAGDE/5ocEIdUDBz3aAADBzAJZKJkAghiD8AIwg +AoDCJoIlAtjKcVX/gOAO9B6Gs7gepgDYz3GAANSCE6nPcYAAnIIMsWnwQiWSEEx0hCQDkP7z4HjP +daAA0A8lFQ6WJRUPlkokQCAQFRWWAm8MIgCgwiQOJS8jACX2D2AAyXBMJgCgGnAUJxEVEfKF5gfy +i+YA2MogYQAC8ALYz3GAAEAbJIELIQCAA/IA2QLwAdkqcDP/gOAU8kwggKEj8s9wgABsGxYgAARA +gAaIEHYP9IDiDfLpcGB6AMEW8M9xgAAwcx6Bs7geoabxCiHAD+tyBdiKI9cDSiQAAGEAL/gKJQAB +AdiidxAd2JMCIlIkgODMIyKgnPU9A2/5ocDhxc9wgABAGyCIAduA4WGoIPLPcqAAsB95on6CQoCj +gFB1ANkY9M9ygABwBViKgOID9AHaCvBBgAIjjQDXdUwAQEt59yGoKHKB4gP0YaAiqOB/wcWioO/x +8cCmCk/5GnA6cc92gAAwc5Dgz3WAALiCAN+H9wzY6XH6/oDgC/Qehi8dwhOzuB6mz3CAAJyC7LAf +8KlwDNns/s9ygABAGwCKgOD82QryAJYkeIwgAoAG9CWVBJUneAOiQiAAIypxiv8AloYg/ACMIAKA +OA/B/5ECT/ngePHANgpv+QDZguAIdhD3z3KAADBzHoKzuB6iz3CAANSCM6jPcIAAnIIssHbwAtjY +/oDgcvLPcaAAUAwFgc91gAC4ghKtBYETrQmVjCCIgGK+N/IY9ofgJPKMIMSBzCahkFr0yXAA2cr+ +gOBW8kAlABvJccD+LxWAEIC4Lx0CEEzwjCDIgDfyjCAQgEb0BYEJboXggA3h/8ohIQA+8IHmPPTJ +cADZuv6A4DbyQCWAG8lxsP4vFYAQgbgvHQIQLPCO5ir0z3CAAIgKGIiB4CTyyXAA2a/+gOAg8s9y +gACcgkhwBtmk/kAiAAIG2aL+DJKBuBHwhOYQ9MlwANml/oDgDPLPcoAAnIJAIgAFBNmZ/gySgLgM +so0BT/nxwBYJT/kIdRpxz3CAALiCLgzv+CTZz3CAADBzHoDPcoAAXHk5uFMgQQDPcIAAiEk0eEGK +IIgA21V5z3KgANQLL6LPcoAAcAUhiGGiAiVAEIDgyiDMAAKiTXGGIfwD0OHMIYKPAACAAA/yjCED +hBDyCiHAD+tyBdiKIxkMSiQAANEF7/e4cwpxef8D8Jf/7QBP+eB48cB6CE/5z3KAADBzPoIacO65 +qsEA2BDyz3GAAIgKYhGBAEQSgwDA3WR5hiH/DiK5On0I8M9wgACICkwQDQEC2IYSAQECeRGCBOHO +Dq/9ANoWCGAAAiBPAwPYz3agAMgfE6YYhgDZQsAZhkPAGoZEwBuGRcC1hlwWERBAFgAWH2f8FgAQ +z3CAALiCQIABgAAiwoMBIEAAQMJMIECgQcCLcAv0hMHuCmAAhsIId89wgABwnCqQCvCCwdoKYACG +wgh3z3CAAOiCJJDPcoAA6IJlggbCBLtQc0ApgAKI91BwS/cCelBwvvcG8J4LYACGwAhyRsKC5xX0 +qXAuC2AASHEIdSpwJgtgAAbBBsM6cATCB8EFwAAiwoABIEAARMIW8IDnFfSpcC4LYABIcQh1KnAm +C2AABsEEwTpwBsMFwAfCAiHBgETBAyCAAEXAgecK8s9wgACIChiIhODMJyGQANgD9AHYLyIHoDv0 +qXC+CmAAA9kIdSpwsgpgAAPZAMEIdwHAQCHBgEEgAABBwATAQMEFwUAgwIBBIQEARMDODiAARcFM +IACgBvS1pgDAGKYBwBmmTCCAoAv0taYAwBimAcAZpvemBMAapgXAG6ZMIECgB/T3pgDAGqYBwBum +TCIAoAHZwHnPcIAAZDA0qO0GL/mqwM9xgAA0GyCBANiD4cwhIoAC9AHY4H8PeAoiAIDxwBTy+P+A +4MohwQ/KIsEHyiBhAcojgQ8AAJYGyiQhAJAD4ffKJQEBz3CAADQbQKDRwOB+8cDPcoAANBsggoDh +yiHBD8oiwQfKIGEByiOBDwAAnwbKJCEAWAPh98olAQEBogHaz3GgAMgfUKFKGZgASBkYAN7x4Hjx +wAIOD/nPcaQAtEUpEQCGz3aAAHxkEaYrEQCGAN0Sps9wpQAIDAOAGKYOEQCGEHowuFOmFKYPEQCG +FabPcIAAbHNQiHKIWaY0iHqmC5A7pizgAiCPAAIgwgAieM9zgAA0GyCDXaaD4fymOAAtAB6mMyZB +cIAAkElAJwByNHgAeAPYwf9A2M7/t6YM8M9yoACoIDGCAoOiozhgF6YB2BKiAdjJBS/5FqbPcIAA +cAUYiIDgB/LPcIAAQBsBiALwAdjgfuB48cBCDQ/5z3WAAOydwxUAFlEgQIEH8s9wgADgoAyIiOAF +8gmFUSBAgYvyz3GAADBzA4G6Du/8JIGB4BH0z3GAAESbIIFRIUCACfLPcYAA4KAsiYjhyiBhABLy +gOAR9M9wgABEmwCAUSBAgAnyz3CAAOCgDIiH4ALYAvIA2A//5glAAs9xgADoggaBRSBAAQahz3CA +AIgKGIiE4M92gAC4giPyz3CAANxaVoh3jlBzz3GAAHxkBfIAgFEgAIAN9M9ygABwBQWCAeAFogDY +BKIPgQHgD6EE8A6BAeAOoQmFUSBAgdALggDPcYAAcAUDgYDgC/IA2AOhz3GAAKQGAIGiuA4LYAIA +oS8WgBBRIMCAoA+C/y8WgBBRIICAJA+C/4j/sf+A4KAN4vfKICIFz3CAAFwjEYiA4JAN4vfKIKIE +cQQP+eB48cDPcIAAnIIMkOC4BPIiDQ/9BvBRIECArAwC/c9wgADUghOIgeAH8oLgCPSf/YUFz/+A +/X0Fz/95Bc//8cDCCw/5z3CgAMQnUhABhkEQAIaGIOOPAN0G8uu50SGigUbyz3CAAIgKCYDPdoAA +uIJRIECBGPK2DYAGgOAK9BSOgeDKICEBpAlhAsohYQDPcIAA5HsAgFEggIAE8i4Pb/0QlrSuz3CA +AOR7oKBNcIYg/AOMIAKAFvTPcYAAcAUHgQHgB6HPcIAAiAoYiITg6AxBBfYMgAZ6/4oPYAUvIIgK +BvCMIAOEHA/B/4EDD/nPcYAAcAUJgYHgB/TPcKAAsB8bgAuh4H42uDa5MHDWIIUPAACAAOB/Injg +ePHAz3KAAHAFCYKB4A70z3CgALAfG4AMoiuC9f9GEgEBOGAQeEYaBABxBM//8cDhxc91gABwBQ+F +gOAQ9AmFgeAM9G4Mz/eW4Ajyz3CgALAfG4ANpQHYD6UBAw/58cDhxc91gABwBQ+FgOAY8gmFgeAU +9D4Mz/eW4BDyz3CgALAfG4AA2g6lLYXZ/0QVARFPpThgEHhEHQQQwQIP+QDZz3CAAHAFK6AsoC2g +LqAvoCWgMKAkoEYYRABEGEQA4H8qoPHAANnPcIAAcAUpoPT/z3CAAFQbPgqP/8EDz/8Icc9wgABU +G0WAQ4JhuWCCz3KAAHAFSILVunpiz3OAAOiCZYMFK34AACGBcMdxAAAAEGkCj//gePHAz3GAAHAF +CYGA4A/0AdgJoQDYCKHd/89wgACIChiIg+CoD+H/yiBhAV0Dz//gePHAogkP+aYJoASkwYDgDA/C +/891gABwBQiFKoWj/0QVARFGFQIRWWEwcMogLgDCIE0ARYWA4nCFEvSA4BDyIIWA4Q70JIXPdoAA +fGQbY3ClGWEkpTCGGWEwpgjwUHDG9wIggQA7Y3ClJIVBw0LAQ8JAwYtwENkqDa/4otoIhQqlANgF +pUYdBBBEHQQQAKWuCu/3ENgEhYXgjPcB2L//hgiP+s9xgAB0ZRiBAeAYoQTwBdi6/1kBL/mkwOB4 +gOAB2MIgDADPcoAAQBsAqgHYAaoA2AKqAaICogOi4H8kouB4ABYAQL0Gj/jPcIAANBvgfwCA4Hjx +wDIK7/cQ2M9woACwHzuAz3CAAHAFTQLv/yigz3GgALAfO4FBKIIF1bhBKYMF1bkCec9wgADogmJ6 +BYDJugUovgAncc9wgADUGgOAAIDgfzhg4HjPcaAAsB87gUEogwXVuEEpggXVuRBxW2NJ989ygADo +gkWCWWECeQHjAvACeUArgAUleMzxANmWuc9woADQGzOg4HhRI4DF//PgfuB48cAGCC/5CHOKIAgA +z3WgAMgfEKUB2kEdmBD0/892gADogiOGBYZTIU8FEHfKIc0PyiLNB8ogbQHKI40PAACPAMokLQD8 +BK33yiUNAYDjzCNigED0QIZYpUGGz3aAAESbWaUUpTWlAIZRIECAZPLPcIAA4KAMiIfgXvQ3hc9w +gAB4nPeFBCGQD8D/AAA3iBWF1b9GCyAACrnVuAUgAQQ3pQLZM6VahTuFAiDDg8ogwwASACMAX7ug +FgMXCrvie3hgANsCIgKAAyHBAFqlO6U08ILjMvTPc4AARJugEwAHCrgWpc9wgADsnQmAUSBAgR3y +z3CAAOCgDIiH4Bf0U6UYhXmFz3GAAHicN4kKuQIgQIBCKcIHGqUDI4MAe6UVhboKAAAXpQjwThMA +BhqlTxMABhulN6U1B8/48cDWDs/4CiYAkM91gADoghH0z3CAAJRJqXHyDa/4FNrPcIAA1BrSD0// +z3CAAPQaFfCC5gz0z3CAAHycqXHODa/4FNrPcIAA9BoO8Klwxgyv+AXZz3CAANQang9P/89wgAAU +G5IPT/8ElQq4BaUGhYYgww8GpclwlP82Co/3xQbP+OB4z3CAANQaJ4CA4QfyA4BAgAKBQngE8M9w +/w///+B+4HjPcYAA1BpGgYDiiiH/DyCgBfIigiCgAdgC8ALY4H7gePHAocEIc4tw9v+C4ADYB/IA +wBBzAdjCIA4AocDRwOB+4NgA2s9xoADIHxChCdiwGQAAtBkAAGrYQhkYAADYmrgPoaQZgADPcAAM +ABkOoeB+4cVTIEIFBCCND8D/AADPcIAA6IIFgAIggwAEIYIPwP8AANW5Inile0V4EHPKIK0ABfcQ +cwDYyiBmAOB/wcXgePHA4cXYcLhxmHLu/wh1yHCIcez/EHXKIK0ACvcQdQDYyiBGAZwP5v/KIQYB +yQXP+AhzKHLPcKAAsB8bgAIggA8AAgAAaHHe8Yoh/w8goM9zgADUGkaDgOIS8iSCUSFAgAvyz3GA +AFQcMHIH8s9xgABsHDByBvRAglBz8fUC2AXwIoIgoAHY4H7xwPYM7/hKJEAAwIGggAHf0XXCJAIB +0XWhgWGAwifOEwHesXPAfrFzAdvCI84ATCQAgMwmIpDKI2IAC/SA4wb0gObMJyKQBPIC2wPwANuA +4xTygeMO8oLjGvSggMCBAYAhgQIljZOgogMgQAABohDwANgAogGiDPCggcCAIYEBgAIljZOgogMh +AQAhotEE7/hocOB4BfBCecdwQAAAAM9ygADogkWCUHE391MgQwVwccAgjQ9AAAAAwCCNAOB/IngG +8GJ5AiCAD0AAAADPcoAA6IJlgnBxN/dTIEIFOmJQc4P3OGAH8AIggA9AAAAAYng4YOB+8cAGDM/4 +CHUodnIKL/8BgKCFELlBLQAUOGBiCi//yXEQubB4OGBWCi//QC6BEkUE7/gocNW41bkwcMf3z3KA +AOiCRYJZYeB/DiBAAL3gFfKF4BHyB/aD4AvyhOAR9OB/BNil4AvyreAL9OB/AtjgfwDY4H8B2OB/ +A9jgfwXYBtjgfuB48cCB4OHFANgJ9M9wgADPggHdrgxv/6lxqXDdA8/44HjxwFoLz/gId89wgACI +ChiIhOAacUjyhOcA3Y4AJQDKIEUDz3aAALiCQCYAE3IMb/8E2S6OsK5TIQAAEa5BKMAgoLkwcGAA +JQACIEIAY7/xclQABgCA4g/yz3GgANAPEBEAhmG6WGAQGRiAJREAhg94AvAPjgDZUyCCIA8hgQAk +eC8mB/DPcZ8AuP8QrhiBzyDiB9Ag4QcYoRiBnrgYoRiBvrgYoQHYGQPP+OB4g+DxwADYCfTPcIAA +zILmC2//A9kB2NHA4H7geIbg8cAA2A/0z3CAANSCygtv/wbZz3GAAOR7AIGCuAChAdjt8fHAmuDh +xQDYjPfPdYAA3IIEbaILb/8E2QuNgrgLrQHYyQLP+PHAluDhxQDYjPfPdYAA3IKpcH4Lb/8E2QuN +g7gLrQHYpQLP+PHA4cXPcoAA6BvwIgEAz3WAALwFg+EApVPyguDPc4AACIMH9CaDgeED9AjYAKWC +4Br0AtgGowDaz3CgAPxEnrpBoM9woAC0DwDZPKANyAQggA/+//8DDRoYMA3Ih7gNGhgwL/DwIgEA +geEM9M9wgAC0HACAUSAAgAT0ANgGowPwJqMDyFEggIAE8n4OD/sN8ADanroA2c9woAD8REGgz3Cg +ALQPPKDPcIAAiAoYiITgBfQGCwAFgOAD9EIIAALlAc/44HjxwGoJ7/gA2Zu5z3CgANAbMaDPcIAA +vAUggADdieHKIcYPyiLGB8ogZgHKI4YPAADXAMokRgNoBmb3yiXGAM92gAAAAACG8bgZ8gGG8bhA +2s8i4gfKIoEPAADQAM8i4QfPcJ8AuP9doESGAeLTukSmBSKCD9D+AABWoM9wgACcG/AgQABAeACG +8bgG8s9wnwC4/72gQQHP+PHA4cXPcaAArC8cgb2BBH3PcIAAuAQAiIHgCfTPcMDfAQAcoSjZGLkJ +8Py9NA3CBPa9wArC+ADZm7nPcKAA0BsxoAUBz/jgePHA4cXPdYAACIPPcIAAqEmpca4Pb/hI2s9w +gABYSs9xgADABZoPb/gI2gDZz3CAAMAbKaDPcIAAvAUgoM9woAAsIBCAuQDv+BKl4HjxwO3/ANjP +caAAwC+AGQAAz3DIADwAwBkAABOBi7gTodHA4H7xwBoI7/gB2wDdz3CAAJyIoaDPcYAA7J1IgaKg +UyIAAMYPL/g0kc92gAAIgwqGgOCupgjyz3CAAIgKGIiE4AT0BNgE8EYPQAAKCaAAANmA4Aj0B4ZR +IMCAANjKIKEAZP8lAM/48cAA2c9woADQG5u5MaADyITgBfIA2F3/BPAE2Fv/4P+88eB48cCuDK// +4cXPdaAArC8Yhfq4DfIahcC4geAB2MB4LyYH8AX0HIX8uAPyDg/AAByFUSAAgBnyz3CAAAwcAIBC +IACAyiBiAIDgD/TPcoAAwBsJgoTgSffPcYAACIMqgYHhA/QB4AmiHIUCC0/3tgvABIDgCfTPcIAA +vAUAgIPgYA/B/4UHj/jgePHA+g6P+Ah1OnHPcIAAwAUggAGAViFBCxTgOGAA2TJwyiHGD8oixgfK +IGYByiOGDwAA4QHKJCYABARm98olBgHPcIAACIMKgIDgHfLPcIAAiAoYiITgF/LPcIAACIMFgILg +yiHCD8oiwgfKIGIByiOCDwAA4gHKJCIAxANi98olwgDPdqAAyB90HliQz3AAABAcfg9P+E8gQQPP +cAAAEByKCk/4WNiGCm/4Adkg2BCmMthDHhgQANj6C2/4jbgg2BGmz3CAAAiDpBYQEC4Lr/+noFEl +wJDPdaAArC8+8s9wgAAACACAUSBAgDjyGBYAlqG4GB4YkIogEAARphmF8LgZhQzyBCCADwgAAADX +cAgAAAAB2MB4B/CGIH8PguAB2MB4gODs86DfEfDgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeGG/jCf/n+31GYWIuBmlhg/P+c9wgAAIgweAwLiB4AHYwHhmCi//WnDGCeAAKnAB2PoI4AAK +cRyF+bga9BiFiLgYpaDfEvDgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeGG/jCf/n+71 +mgvAAKQWDxDPcAAAEBxKDk/4UCBBA89wAAAQHFYJT/j+CS//SnBn/1zYSglv+AHZINgQpjLYQx4Y +EADYvgpv+I24INgRphyF+bjKICICJAli+MohogDPcACCAQAcpQDYWgjgAOlxOQWP+OB48cDmDYAA +gOAA2cogQQAa8moJ7/gocAPYqP4C2M9xgAAIgwWhz3CAAOydCYAluMC4egkv/wqhCNiKIf8PaP8B +2IkEz//xwM9wgAC8BQCAg+AE9DoMwAA3/3EEz//xwM9wgADsnQmAz3GAAAiDJbjAuG4MoAAKoYDg +BvJuDaAA/9iA4AT0ANgD8AHYQQTP/+B48cDhxc91gAAIg0wVgRCA4Q32CiHAD+tyBdiKI8QCSiQA +AGkBb/cKJQABA8iB4MohwQ/KIsEHyiOBDwAADAHKIGEB7/OC4Qn0ANhMHQIQog1v9xbYPfDe/4Dg +O/IKhQDZgOAupQfyz3CAAIgKGIiE4Az0z3KAALQcMKIxohDYCaInoiWlAtgk8GIPgADPcYAAwAVA +gSGBliKBARThWWEwcJf3AdgFpc9woAAsIHCACiWADwEALCwB2AbZCHLHcwcAIKGiDyAFSiQAAAHY +V/79A4/44HjxwIILj/jPcIAAiAoYiITgyiHBD8oiwQfKIGEByiOBDwAARAHKJCEAjABh98olwQDC +CkAA4g6gAAh2gOYIdRD0rv+A4Azyz3CAAMAFIIABgJYhgQEU4DhgEHUG99oOz/oA2D3+iQOP+PHA +Eguv+Iog/w+hwUDAz3WAAAiDBIWA4ADZCPLPcKAALCAQgCSlA6ViCkAA0gpgABpwCHEeDGAACnCA +4D70z3CAALQcCYBRIACByiHBD8oiwQfKIGEByiOBDwAAfgHKJCEA7Ach98olwQDPcQCCAQDPcKAA +rC88oIb/gOAe8gKFgODKIcIPyiLCB8ogYgHKI4IPAACKAcokIgC0ByL3yiUCAXoJoACLcAolAJAG +8gPYD/6pcADB1/69Aq/4ocDgePHAyglgAOHFNgpgAAh1CHGCC2AAqXCE4CHyz3CgAMgfpBABABWA +z3OAAAiDoYOieddxAACgDwDay/fPcYAA6IIlgdW4QSmNAKJ5MHCE9wKDgOAF9EKjAtj1/XUCj/jg +ePHA4cXPcIAAiAoYEIQATCQAgcohwQ/KIsEHyiBhAcojgQ8AAPkCCAch98olIQA+CUAArglgAAh1 +CHH6CmAAqXAtAo/48cDPcIAAiAoYiITgyiHBD8oiwQfKIGEByiOBDwAACwPKJCEAxAYh98olwQD6 +CEAAgOAI8jYNz/oH2NT9xg5AAFkBz//xwOHFz3CAAIgKGIiE4MohwQ/KIsEHyiBhAcojgQ8AAE4D +yiQhAIAGIffKJcEAtghAACYJYAAIdQhxcgpgAKlwhiC/jgv0IgtAAIHgB/QC2M9xgAAIgwahu/2N +AY/44HjxwBIJj/iiwc9wgACoSTaAz3WAAAiDF4BAwSWFQcCD4cwhIoAq8s9wgACIChiIhOAk8oHh +AN4L9I4Mz/rPcIAACG4diIDgxaUY8gPYBaUNhc6lCiWADwEA8CsM2RUkAjDPcKAALCBwgECCANjH +cwcAIKGuDCAFmHAFAa/4osDgePHAjgiP+M93gACIChiPhODKIcEPyiLBB8ogYQHKI4EPAABFAMok +IQCcBSH3yiXBAM9zgAC4gq2LgOU18iyLMHViAAwAz3CgALAfW4DPcIAAYIMgoKGgQqDPcIAA6ILI +kNF1z3KAAAiDi/aosADYTRoCAAHYDKIVghB1w/e1ohCLBKIRi4DgBPKA4QTyANgH8AmHUSCAgPzz +AdgConoJb/cC2FUAj/jgePHA6g9P+MoPAADPdYAACIMIcYTgzCEighH0z3CgACwgEIAA2kKlA6XP +cIAAYIMCgNW4x3AAAIgTCaUNhYDgyiEiAQDe3ghgAMlwhOAD9M2lCPAChYDgBdjKIKEAYg2P//UH +T/jxwIIPb/iYcQojAIDKIcEPyiLBB8ogYQHKI4EPAABKAcokIQCUBCH3yiUBAc9wgABUHCWAI4HP +doAA6IJAgc9xoACwH/uBUydNFTa/f2ddZSWGYbsFKf4AJ3UCJYMQjCMXh0r3z3KAAGCDQYIFKn4A +J3VfZ0wkAIAH8s9xgAC0HDOBgeEP9JIP7/5YJUEWz3CAAGwcACWBHwAAiBN6D8/+FvDPcIAAPBxu +D+/+WCVBFs9wgACEHAAlgR8AAIgTWg/v/sm/z3CAAGCD46AGhoG4GQdv+Aam4HjxwM9wgAAkHNIO +7/7hxc9wgABAgzWIz3CAAFQcgOHPdYAAYIML9CCAQiEBgMohYgCA4QXyIIWA4Un0og7P/s9wgABs +HJYOz/5Chc9woACwHxuANro2uBByxfcIcYAhEAAC8AhxYIV6YmGFeWEwcs33CiHAD+tyBdil20ok +AABlAy/3uHN6YjBy/vciek96cHLKIc0PyiLNB8ojjQ8AAKwAyiBtASv3z3GAADwcIIFCIQGAyiFi +AIDhBvJYYCOFybgwcAXySHAA2Zj/WQZP+OB48cDhxc9wgACIChiIhODKIcEPyiLBB8ogYQHKI4EP +AADGAMokIQDsAiH3yiXBAEoPL/cC2M91gAAIgwKFgOAM8s9wgADAGwGACaXPcKAALCAQgAGlz3CA +AOiCBoBRIACAIvLPcIAAvAUAgIbgzCBigcwgIoID9GD/FPAEhYDgANkQ8s9woAAsIBCAIqUDpc9w +gABggwKA1bjHcAAAiBMJpQDYBKWj/60FT/jgePHA4cUIcc9wgACIChiIhODKIcEPyiLBB8ogYQHK +I4EPAAAwAcokIQA8AiH3yiXBAM9wgAAIgwqAgOA78s9wgAAMHECAQiICgMoiYgCA4jH0gOHKIcEP +yiLBB8ogYQHKI4EPAAA2AcokIQD8ASH3yiUBAUWAQ4JhuaCCz3KgALAfW4LVul1lz3KAAOiCRYIF +Kn4AJ3UuDe/+VyXBGM9wgAAkHAAlgR8AAIgTGg3P/vkET/jgePHAz3CAAIgKGIiE4MohwQ/KIsEH +yiBhAcojgQ8AAIAByiQhAIwBIffKJcEAz3GAAMAbCYGE4ET3AeAJoc9xgADoggaBRiBAAQahz3CA +ALwFAICC4PwJof/KIKEB0cDgfs9xgADoggaBgrgGoZUFL/cC2OB48cDPcIAAiAoYiITgyiHBD8oi +wQfKIGEByiOBDwAA7AHKJCEAGAEh98olwQCyCa//BtgB2c9wgAAIgy2gz3GAAOiCBoFGIEABBqHQ +8fHAz3CAAIgKGBCEAEwkAIHKIcEPyiLBB8ogYQHKI4EPAACvAcwAIffKJSEAz3GAAAiDDIGA4Ary +BYGA4MwgYoAE8gDY3P+s8c9xgADoggaBRiBAAQahz3CAALwFAICC4AX0Mgmv/wbYmvGa8fHAUgtP ++M9wgACIChiIAN2E4MohwQ/KIsEHyiBhAcojgQ8AAA4CyiRBA1wAIffKJcEAz3aAAOiCpqbuCK// +B9gGhoK4/gnv/wamz3CAAAiDraCGDC/3AthlA0/48cDPcYAA6IIGgYK4BqFuDC/3AtjPcYAACIMM +gYDgDfINgYDgCfIFgYDgzCBigHgP4v/KICIAUPHxwOHFz3CAAOydCYDPcYAACIMluFMgAIAKoQDY +BaENoTvyz3CAAIgKGIiE4DXyz3WAADwcAIVCIACAyiBiAIHgEfSqCu/+qXDPcIAAVBwggEIhAYDK +IWIAgOEF9PIK7/4ihc91gACEHACFQiAAgMogYgCB4BH0dgrv/qlwz3CAAGwcIIBCIQGAyiFiAIDh +BfS+Cu/+IoWdAk/44HjxwOHFz3AAAP//z3WAAGCDA6XPcIAADBw2Cs/+z3CAACQcLgrP/gDZIKUF +2AGlIqWKCy/3AthhAk/44HjPcYAAtBzPcIAACErBAC/4FNrgePHA4cXPdYAAnBz2Ce/+qXDPcIAA +tBwggOG5HvIUEAQAGBAFAFEhAIDMJCKAzCUigAj0CiHAD+tyBdjNBu/2tNvqDq/+ACUAATIJT/8I +cRYK7/6pcPEBT/jxwOHFz3WAALQcqXCqD+/3B9kIFQQQANhGJP6DyiHCD8oiwgfKIGIByiOCDwAA +ZwB8BuL2yiUiAECF4boT8uC6B/IlhYDhBfImhYDhC/QKIcAP63IF2G/bSiQAAFEG7/a4c89xAQBs +wTKlUSIAgROlI4UO8g6lAYWP4C+lC/LPcAEASMMSpQHYE6UF8C6l/9gPpcb/5g7P91UBT/jPcYAA +tBwAgSKBf9vPcoAACINTIACAJnsE9C6CgOEV9IDgBvIOggsgwIAP9DCCgOEE9AWCguAH8oDhB/IR +goLgA/QB2ALwANjgfuB44cXhxs9wgAC0HECAAoA/2wZ7DHDPdoAAtByihs9xgAAIgwsgQIMB2C6B +wiABAAshQIPAugbyKYZRIQCBzyBhAAsgwMAJ9M9xgAAIgy6BCyHAgADZAvIE2YDiBvSE4QjygOAG +9IDiBfKE4QP0BNjBxuB/wcXxwBoIb/gA2c9ygAAIgwSCgOAI9M9wgAC0HAeAgOAD8gHZz3WAALQc +z3eAAIgKGI/AhYTgUyYDEAXyCYdRIECBA/QA3jjwB4WA4AT0ANgRpYDjzCEigAzyCYVRIACBCPJR +JgCRCfIBhY/gBfQA2Ah2FPAA2BHwEYUB4ITgEaUI3kX3AYWP4ADYCPLPdqAALCDQhgHYw6II3rCF +gOUL9IDjA/SA4Qf0gOAF9EwSgACC4AL0BN7NBy/4yXDgePHAWg8P+KHBGnAod0h2nv+A4EDyz3WA +AAiDAIWA4Dr0z3CAALwFAICC4AwNYf/KICECz3GAALQcAIFRIACBS4EE9AGBj+AK8oPiJPIA2Aeh +DKED2kuhCfCD4hzyANgJoQehA9pIoQSlz3CgACwgsIBAxgHYHtkKcghzSiQAAAolAAEAJYcfBwAg +oWB/CiYAAS0HL/ihwOB48cCE4OHFCHUI9AYM7/8E3Y4Mb/8A2FHwhOEy9M9wgADsnRgQhABMJACB +yiHBD8oiwQfKIGEByiOBDwAArAHAA+H2yiUhACQQBABRJECByiHBD8oiwQfKIGEByiOBDwAArgGc +A+H2yiUhADYMb/8H2EoNr/8E3ZoLz/8f8FMlfpAN8s9wgAC8BQCAguDMICKBDAxh/8ogIQIP8Ijh +DPTPcYAAtBzPcgEAUCkB3alwMoGu/wPwAN2JBi/4qXDPcoAAtBwIgoPgIfILgoPgHfIJglEgAIEG +8gyCgeDhIMEHAdjPcKAALCAQgCqCAiBDAAXZDLkwc8n3ENkpoi2CInjXcAAAAFAD9wDY4H4B2OB/ +DKLxwLYND/jPcKAALCDwgM92gAC0HAqGpYYCJwEQsXEG9waGHWUifQnwz3IBAFApAdgyhor/6qYA +hs92gACcHFEgQIAM8s4Kr/6pcBoND/8IcfoNr/7JcAXwjg2v/slwwQUP+OB4z3GAALQcAIFRIACB +z3CAAPR8SIBTIgMABPQBgY/gEvKA4w3yUSLAgQn0z3CgACwgEIANoQHY4H8LoQLY4H8LoYDjDPJR +IsCBCPTPcKAALCAQgAqhAdgD8ALYCKHgfuB48cD2DC/4CdnPdoAAwBsmC+/3yXAAls91gAAIg1Eg +AIAI8gHYTB0CEFIO7/YW2AnwTBWAEIHgBfQC2EwdAhAAliKGIrjAuE0dAhDPcIAABB0goM9xoAAs +IFCBcoUCIsAA/7gD9FKlEIEDpc9wgACcHACAQiAAgMogYgCA4Aj0z3CAALQcAICA4IgKwv8IhoDg +BfTPcIAA6IIIkBWlAJYluMC4cgsv/wPZTgrP97UED/jxwEYMD/jPcqAALCBQgs91gADwY2aNgOMA +3gXyZ42A4wL0BtiH4Mohyg/KIsoHyiBqAcojig8AAHgCyiQqADwB6vbKJcoAhuHPc4AACIMD8lSj +roMPJU0QrqPPcYAABB3wIQAAsoNYYAIgQQP/uQP0EqPPc4AAtByhgyKDGcikeREhAIAG8o/lSqPJ +owL0x6MhBA/48cCuCw/4CHXPdoAAwBsBhs9ygAAIgwmiz3CAADBzHoAEJYQfAAAAIOa4JrhTIAMA +QS1AE8C4FiLPAAKnJPLPc4AAtBwJgwDfJXjDuQ8nTxAvgwmjCyHAgwHYBfIMoxwbAAHmvRX0DoMw +g+R4BSBAgBCjD/IA2Ammz3CgACwgEIADogfwz3CgACwgEIABos92gACIChiOhOB4D2EEyiBBAxiO +geAb8s9wgABEmwCAUSBAgCTyz3CAAOCgDIiH4B70z3CAADBzlBCAAM9xgAAoXQK4FHgAYe24EPLs +vQ7yz3CAADBzlBCBAAK5NHnHcYAAKF0AgYi4AKEdAw/48cDPcIAAvAUAEAQAz3OAAAiDTCTAgcwk +IoAL8hQTBQAKIcAP63IF2MEHr/bw2wDYWghv/wWj0cDgfuB48cB2Cg/4z3CAAPR8CIDPd4AACINR +IMCBAN0Q9ALeMghv/8lwxafPcYAAtBywobGhENgJoaehBvClpxYIb/+pcJ0CD/jxwDYKD/jPdYAA +CIMghSV4AKUQhYDgocEF9AHYEKUFhRGllg1v+otwAMHPcAEALCwwcAzyz3ABAPArEHEG8s9wAQBQ +KRBxBPSiDU/6AN4uD6//wqXPcIAADBwKCo/+z3CAACQc/gmP/s9wgACcHPYJj/6aDy//yXApAi/4 +ocDgeM9ygAAIgyCCBnkA2BCiBYIgotUHr/8RovHAngkP+M9wgAC0HACAz3OAAGCDAd3BuIPgAYPA +fYHgBfTPcIAAwBsHgM9xgAA8HCCBQiEBgMohYgCA4S70z3KAAAiDLIKA4cwlIZAm9MKDz3GgALAf +O4E2vja5MHbWIY0PAACAAKCD3WXVgj5m0XXM9wohwA/rcgXYiiMEB5h1UQav9rh2HWXRdf/3OGAO +IEADigmv/wHZcQEP+PHA9ggP+Ah2iiD/DwCmz3CAAAiDCoCA4MolIRFq8s9wgACIChiIhOAV9MoM +AADPcYAAwAUApkCBIYFWIkILFOFZYTBwAdjCIA4AE3hTIE0AUPDF/89wgAAMHACAz3eAAMAbQiAR +gDIMIADKIWIgAKbPcaAAsB+7gSmHQCcQE89ygADogvAgQSBFgmG5BSp+ANW9J3WCJYERSCUNEBB1 +yiUGEE/3z3CAAAwchgiv/kohQCDPcIAAJBx2CI/+oKbPcYAAwAUAgSGBViBACxThOGAQdQHdwiVO +E7N9UyVNkAryTCFAoAb0CYfqCq//8CAAIGUAL/ipcOB48cAGCA/4z3CAAIgKGIiE4M92gAAIgxX0 +CoYB2oDgAIbAegHZgODPcIAA6IIGgMB5gODMIiGAzCEigF3yY/DPcKAALCCwgBKGANoCJQGQ44bK +Im8AsXcJhhAALwD7YAIlzxCA5wDfw/YB39dxAEAAAMj3gOIG8gIlgR9OAAEgMqYCJcEQ13EAQAAA +yfeA5wfyAiWBH04AASAjpiKGgOET8iGGOGAQccf3EHXL9zB1h/cH8DB1g/cQdcP3ANkC8AHZIqYA +hs91gADogqaFgOAB2MB4gOEB2cB5hiV/HoblANsE8qqGgOUD9AHbgOfMIiKAA/QA2AjwgOPMISKA +zCAigPnzAdhpB8/38cD6Ds/3CHXPdqAAwC8ahjm4UiAAAFMgEAAUhlEgwIAA3wf04g+v9yTY8rgC +8gHfURYAloDgC/SjFgCWBCCADwAAAA+MIBCAA/QA2gLwAdoEIYFPAAQAAAQggE8CAAAA13ACAAAA +SiRAAMIkAgEMcIYgPQCA4EolQADCJUIBUSCAwQnyz3CAALwFAICB4ADYAvQB2M9zgABQGmKDUSOA +gAjyz3agAKwv3Ib2vgDbA/QB2+S9yiBhIEwgAKAn8uW9yidhEIDnI/LjvcohYQCA4R3y4r3KImEA +gOIZ8uG9yiRhAEwkAIAT8uC9yiVhAEwlAIAN8ua9yiBhAIDgB/JRJcCRyiNhAIDjA/QA2ALwAdhN +Bs/34cXhxgh1z3GAAPBjIJH/2ILhyiCiD//az3GrAKD/WaEYoQTZz3CgAMgcKKAW3hLw4HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44Hhhvowm/5/u9YDlz3GgAMAvCfLPcMgAPADAGQAAE4GL +uAjwz3DIALIMwBkAABOBq7gTocHG4H/Bxc9wgACIChCAz3GgAMgcANqFIAEBCKHPcasAoP9ZoQfY +GqFYoeB+4HjxwOHFz3EDAEANz3CgAKggLaDPcaAAwC8Ugc91oACsL/C4FIEL8gQggA8IAAAA13AI +AAAAAdjAeAbwhiB/D4LgAdjAeIDgLfQVEQCGoLgVGRiABfDPdaAArC/PcKAA1AsbgIDgEfIchc9x +oADAL/m4BfQMdIQkwp/u8xURAIaAuBUZGIAN8FEhgMbv8xmFUSDAgAf0rg2v9yTY8rjl8xUFz/fg +eM9yoAAsIFCCInrPcYAAwAUVeQCBEHLK989wgADsnQmAUSBAgQLyQKHgfuB48cChwQDYz3KAAAiD +TRKBAEDAgeGLcA/0z3GgACwgMIFUgkJ513FOAAAgxfcKD8/+A/AODs/+guAG9Iog/w+hwNHA4H7P +cIAA1BoDgCCAAMAieIDgyiAsAPPx4HjhxYoh/w/PcKAAsB8bgM91gADUGmOFYIOmhdW4gOUA2gby +IoVieYDhyiGMAAkhAACCIIEBSCAAAOB/wcXxwMoLz/cacM9wgAAIgweAAd/AuIHgz3GAAFAaDYnA +f4HgDfTPcIAAYBoAgIDgB/IIEQQAUSTAgATySiEAIBvwUSRAgMohwg/KIsIHyiBiAcojgg8AALYA +sACi9solwgCB5wHYwiABABW4ACCRD0AAAAA6DKAEAN7PcKAAtA/coA3IRNkEIIAP/v//Aw0aGDAN +yIe4DRoYMM9woADsJ8ugz3CgAMgcKaAc3RLw4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HhhvYwl/5/u9c91oADALxOF+rjKIGEAlAzhAcohwQMCDe//6XDPcZ8AuP9dgc9wgADIBd2hmg3v +/0CgURUAloDgBfQMdIQkwp8W8heF+bgU9M9wgAAACACAUSBAgAz0CiHAD+tyCiQACFEVBZYF2NEH +b/Zy24HnJPQQhVEgAIAM9EAVBBAKIcAP63IF2H3bsQdv9rhzz3GAAPBjAJGF4An0AZGA4AX0iiAQ +ABGlCPCKIBABEaUQhVEgAID+9RSFq7gUpU8hQCacuBmlz3CgAMgfGBABhqG5GBhYgIohEAAxoAnZ +CLkvoA4YmIMPGJiDEBiYgxEYmIMtGJiDE4WpuBOlz3CAAAiDB4CD4Br0z3CAAMAFAIBWIEALAiAB +oBgADwAKIcAP63IF2K3bSiQAABEHb/a4cxJpn7iIHQAQLghP/oAdgBPPcIAAyAUVAu/3waDxwLIJ +z/fPdaAAwC+AFQAQF4UahYgVABDPcIAACINKIEAgB4DAuIHgz3eAAMgFAYfCIAIk4LiR9IC4AafP +cYAA8GMAkYXgBfQBkYDgD/IQhVEgAIAL8kAVBBAKIcAP63IF2ObbiQZv9rhzTCAAoBCFIfJRIICC +BdkM9EAVBBBMFQUQCiHAD+tyBdhlBm/279uKIBAAEqXPdqAAyB8g2BCmQx5YEADYvg5v9424INgR +pg/wUSCAgg3yQBUEEEwVBRAKIcAP63IF2CUGb/b520wgAKAThQ7y+rgX8gohwA/rcgXYbNtKJAAA +BQZv9golAAH6uMohwQ/KIsEHyiOBDwAAcAAF2PDzB9nPcKAAyB8ZGFiAAdgIcQhywgxv9ghzIIfP +cJ8AuP89oIAVDhAivv4OL/7JcM9xgAB0ZQ2B2GANoQDYgB0AEIgdABAJ2Qi5z3CgAMgfLqDBAM/3 +4HjxwFoIz/fPcIAACIPngMC/gecB389xgADIBQGBwH/huCv0gbiA5892oADALwGhBfQThrq4E6YC +2BGmz3WgAMgfBfBFFQAW5OCZ9xCGUSAAgPnzqgrP/wHY2gjgAelxFRYAloC4FR4YkGIMQAHaCo/5 +CdgIuA6lTQDP91wWBBBAFgUQCiHAD+tyBdgJBW/2iiMFAOB48cAKC8AAjgjAAC4NAADRwOB+4Hg5 +2c9wpQAIDD6g4H7xwOHFAN2GCCAAqXAqCuAAqXCmDgAAegjAAM9wgAB8Bf0Hr/egoOB4z3GAANAF +AIHXcACAAABUA8EAAIHXcABAAAAkA8EA4H7xwGIPj/eA4c91gADQBQ/yAKUBhYDgFPTOCK/2DNgS +Da//CNgB2AGlCvAA3sClzgiv9gzYeg2v/wjYwaWRB4/3gODxwA3YCfKeCI/24gyv/4DY0cDgfqYI +j/ZWDa//gNhKDo/+guAG9HoIr/4A2PPx8fHgePHA0g6v9wLZosEiDW/3i3ADFI8wgufKIcoPyiLK +B8ogagHKI4oPAABaAcokKgD0A2r2yiXKAAIUgDDPdoAA2AWELwYfABQQMSQeAhDPcIAAFIUAIEEO +NIkKJUAugOFAIBIFACBUDhHypgiv90IggCEB2BO2/9glHgIQQCYAGU4Ir/cE2VfwSiMAICYexBQl +HsITz3WAAHCDQCUREqJ1i3CpcTYNb/cC2kAlABIiDm/3QiCBIQAlgS+AAHCDAoHPcYAA6IIlgdW4 +MHDKIcYPyiLGB8ogZgHKI4YPAAB4AcokxgRAA2b2yiXGBLINIAXpcEokgHBqcaggAASEKQYPL3Ay +IgIggOIH8jAhAiAChRByFPIB4UAmABmyD2/3BNkB2RQcQiBtFQAWgLhtHRgQKHCn//EFr/eiwAoh +wA/rcgXYiiMGAUokAADZAm/2CiUAAfHAz3GAANgFA6EaD2/2DthaC6//iiAEADvx4HjxwHoNj/cA +Fg5AocGC5sohxg/KIsYHyiBmAcojhg8AAGsFyiTGAJACZvbKJSYAQMaLd+lwKg9v9wTZhC4GHwog +QC4AIY1/gABshWDcYg0v/gIlABPPcIAAcIPeEAAGEHYO8rwVgJCA4CLy6XAE2RIJb/eZ2gDYvB0C +kBrwACCBL4AA5IQQgYG4EKHPcIAA2AUzgIDhAdoF8kSgBNgH8ADZL6AqoEugJKAF2M//MQWv96HA +4Hh5Bm/2DtjgePHA4cXPdYAA2AUUhYDgIfT+C4/+guAwDmH+yiAhAAHYFKU+Dm/2DthKDm/2DdiA +4BWlCPIqDm/2DdjaCq//gNjPcQEAEEwB2KIMIAOA2u0Ej/fgePHA4cXPdYAA2AUwFQUQjCXDjx70 +gODKIcEPyiLBB8ogYQHKI4EPAAC8AXwBYfbKJCEACHGCIQYHz3CAAHCDDiBAAMYK7/2KIQYPuHDP +cIAA1IZFgIwiw4//2QbyOBhAASylCPAUGEABANgEpSyl0P91BI/38cDhxQh1hCgGD89ygABwgwAi +QQ5tEQAGz3OAANgFoLhtGRgAAoMEiIDgFPIDgYDgyiHBD8oiwQfKIGEByiOBDwAAMQfKJCEA6ABh +9solwQACgYDgEvTeEgAGjCDDjwryz3CgALAfG4ACoecaWAMR8KyjANjG/w3w9gqP/oQtBh8IcQAh +gH+AAAyFBgwP/uUDj/fgePHAaguv9wLYAN0Ids9wgAAkhYQtBh8wIEAOUSAAgFAP4v/KIEIDCW6A +4AHlL/cA2Ab/pQOP9+B48cDhxc91gADYBSOFz3CAAIAh8CBAAEB4gOD584kDj/fPcKAABEQHgIDg +Adjgf8B4z3OgAKggMYPPcoAAIB0DgjhgA6IB2BKj4H7geM9yoAAsIGaCz3GAANgFEoFieBKhEIIR +oebx4Hjhxc9yoADIH6QSAwDPcYAA2AURgRBzwiMGAET3YngTe7+CEoG7Y3hgEqEB2EoaGADgf8HF +8cCSCq/3ANvPcIAA2AVjoP/az3CAAHCD3hiYAEokgHBodaggAAiELQYfACGBf4AAbIXPd4AA1Bqg +GcCABt6wGYCDz3YBADQ6rBmAg7QZwIO8GcKAACGBf4AAJIVgoQHlz3CAAHCD5xiYAM9xgACcIQCB +HNpAoBjYagrv/wKhfQKP9+B4AdrPcYAAIB1DqRihKHBk2f0FL/d12uB48cDyCY/3z3eAAHCD5xcN +Fowlw58x8v/Z5x9YEIQtBh+goCd3BI+A4AogQC4R9AKHz3GAAGQG8g7v/SCBCHHPdqAAyB8VhmYM +j/6A4AP0AdgU8M9xgAAgHQKPoKkBqQHYE6YchgGhAdjg/wDYACCBL4AAKIUAqQDY3QGP9/HAfgmv +9wHaocGB4M9xgACgBkChJ/TPdYAA1IYFhYwgw48K8gDahCgGDwAhgX+AACiFQKnPdoAA2AUPhoDg +BvIOhsv/ANgPpv/YBaWLcM7/gOAJ8vYPgAAAwAymANgs/xHwtgpv9g7Y4g+AAF4Pb/+KIAQAUgiP +/oLghAph/sogIQBpAa/3ocDxwO4Ir/f/2s9wgABwg94YmADnGJgAAN7PcYAA2AXDoUyhAdrPcIAA +oAZAoM+h1KHVodOhwKHBoQLdyXCEKAYPGnAAIYF/gADkhBCBACGPf4AAbIVg3EYgwAAQocYIL/4C +JwATYb2A5bwfgpNAIEAgJvcB2MH/3QCP9+B4ANjPcYAAIB0Dqc9wgADYBUiAAoBCqRzgVnhEiEmp +BYjgfwqp8cBSCI/3z3OAANgFBIOA4EL0z3eAAHCD3hcCFgDehCoGDwAnQB4CoySIAd2A4c6jr6Mi +8ugfmBMMEAUAz3GAAOiCBCWED8D/AAAUEQYAQSwEBgUuPgEAIYR/PwD//wQkQQHpH1gQIJCMIYKG +AdnCIU4ALaPIoySAz3aAALiGwLk6ts92gAAgHSiuQK4CiKSjAa4f8ASDgeAb9NH/ANgEowKDJIiA +4RP0KIMc4DZ4JIjPcIAA3FoWiBBxAdnAec9wgACgBiCgAtgC8AHYA6PtB2/3AdjxwM9ygADYBQKC +JYiA4QHYBfII2S6ifP8H8M9xgACgBgIOoAAAoU8Az//gePHAUg9P9892gADYBQSGgOCa9AKGSIYk +gFZ4z3KAANxaBCGBDwAGAACA4QHZdoogEI0AwHlwdQn0z3eAALiG+pe0ivF1A/IA3QXwsoqxcf31 +Ad2A5c9xgACgBqChFfTPcYAAqAYgkTBzD/TPcYAAqgYgkXSKMHMJ9M9xgACsBiCJUoowcgPyANkC +8AHZgOFW8ieAz3CAANSGLaDPcIAAYINBgM9wgADoggWABSi+AEApgHIQccohxg/KIsYHyiBmAcoj +hg8AAOoCyiQmALwDJvbKJQYBz3CAAGwGAIBuC+/9OGCA4AP0vP9C8A3IBCCAD////wMNGhgwZBaA +EADdgOClpgr0z3CgACwgEIDHcAcAIKEYpniGAd8KJYAPAQCkS+lwBtkE2j4KIARKJAAAZB5CE+Sm +6XAd8ADYAtkjpmQeAhAX8ASGgeAB3RL0BYaA4Bj0z3CAANSGLYDPcIAAbAYAgOoK7/04YIDgBfIB +2E0GT/eaCe/5ZB5CEwDYBKa18QXYDqapcBX/ANhkHgIQ8PHxwMYNT/fPdYAA2AUEhYDgB/QChQSI +gOAU9ALYBKUEhYHgP/QFhYDgL/TPcKAAsB8bgEYIr/46hYDgI/QA2CbwANgFpc92oADIHxWGz3GA +AGwGogrv/SCBGqWkFgMQCiWADwEA8EsA2AbZBNrHcwcAIKFiCSAEmHAB2ASlKfD+CM/5BNgC8AXY +gOAB2gP0Adgf8CuFgeEL8k+lDqUH8ASFguAW9AuFgeAD9AHYDvCA4O/1AoW6DG/+A4AIcc9wgAC0 +IZYNz/0A2OD+4/EA2GUFT/fgeM9ygADYBSKCJYmA4RPyz3GAAHCD3hEDBs9xgAAkhYQrBg8wIUEO +USFAgAX0CNgOogHYC6IA2AqiBKIF2AOi4H7xwLIMT/fPdYAA2AUEhYDgOPQihUiFQCEAB1Z4RIjP +cIAAqAYAkBByAd4P9M9wgACqBkCQz3CAALiGGpAQcgX0xKUA2DnwBImA4Bnyz3CAAKAGAICA4BP0 +z3CAANSGLYDPcIAAbAYAgD4J7/04YIDgBfQA2NP/Adgf8MSlAdgd8ASFgeAA3hv0IoXPc4AAiApE +gQWBHOFIowmjaIXPcIAAuIYakHZ5JInWC+/2yXPEpQPYA6UB2GkET/cKIcAP63IF2IojTQqYdh0B +L/a4c+B4z3CAAJwhIIAc2s9zgADYBUChQoNVIsEJIaCgEgEAjbmgGkAAViPBAqQaQACcEgEBaIMk +oFUiQQ0joEAiAQd2eSWJoOEL9M9xgACoBiCRSHSAJEQTIKwe2wLwGNtioFUiQQ15YSUGr/kloOB4 +z3GAACAdQCEAA1UhwgVQcEb3ANkEGFAAUHC99+B+4HjxwE4LT/fPcIAAcIPeEAMGSiAAIILjyiHG +D8oixgfKIGYByiOGDwAA0AfKJAYEXAAm9solxgDPcoAA2AVIgoQrBg8ncIDhVningEf0z3CAAIQd +Jg7v9oohDw/PcIAAPB0WDu/2INnPcKUACAwAgFMgQIAS8oHgEvKC4BPyCiHAD+tyBdiKI58LCiQA +BP0H7/UKJQAE/9kH8P/ZCLkD8P/ZELnPcqAAtEceGliAHRoYgBsaWIMA2ZG5z3CgANAbMaDPcIAA +GAQQeEkaGIBvIEMAVBoYgDPwz3OgALRHGxMAhoDgDvIbEwWGCiHAD+tyBdiKI18PlQfv9QokAARL +GxiEAdh3GxiAANieuFQbGICKJMN/z3OAAGBKCnCoIEAECmPPdYAAIB3PcYAAhB1VfUeF8CEBAAHg +WWEnpXkCT/fgePHAEgpP9891gADYBQSFosGA4ADeJvSiCIAAAdgEpQKFBIiA4DgCAQDPcIAAoAYA +gIDgLAICAM9woAAsIAOAz3KAANSGLYIZYc9wgABoBgCAOGC2C2/+DKKA4AQCAQB18ASFguA69A2F +gODKIcEPyiLBB8ogYQHKI4EPAACTA8okgQPIBuH1yiXBAEKFKIVAIgAHNngmiGDBJogBHEIwJogC +HEIwJ4hhwSeIBRxCMAeIi3EGHAIwcgwv96gSAADPcKAALCAjgM9wgAAgHSGgxaVZ/wPYBKXE8ASF +g+A49EKFKIVAIgAHNngFiFEgQIES8gOSz3GgACwgI4HPc4AAIB1hgwq4YnkwcAT3CdgOpYnwBYWA +4Az0BIqA4KLyz3CAANSG5gpv/gyAgOCa8gWFgOAF8gXYDqUB2Ajwz3CAAKAGAICA4Iz0ANj3/orw +BIWB4Gr0VP8ihUiFQCEAB1Z4RYjguhjyg7pFqM9zgAAAZMeDz3KAANSGx6L3g8OD/mbIovaDwoP+ +ZsmiwYN1g35myqIFiFEgQIAs8uYJD/6A4MohwQ/KIsEHyiBhAcojgQ8AAOUDyiQhAJQF4fXKJQEB +2gkv/gLYCgov/gjYIoUEiYLgCfQB2AClANgSpfYJL/5a2CKFBImB4AT0AdgBpQiFHOEWeQWJhiD/ +jMoggg8AADBDwAzi/8ohIgAChSiFHOA2eAWIhiD+hwXyAtgEpSDwBNgEpR7wJIWE4QHYGvQTpc93 +oADIHzyHz3CAACAdIaAM2dIL7/Z12hWHz3GAAHAG9gyv/SCBB6XEpQTYA6UB2B0Ab/eiwPHArg8P +9891gADYBQSFgOBq9AKFBIiA4BPyz3CAAKAGAICA4A30z3CAANSGdglv/gyAgOAF8gDYov7jAgAA +z3agAMgfPIbPcIAAIB0BgEiFAnkChVZ4B4AQcYb3AdgEpbsCAAAAhYDgCvJRI0DACPIC2BUeGJD2 +CC/+HtgVhs91gADYBd4Jb/4nhYDgjgIBABWGz3GAAHAGRgyv/SCBB6UChSiFHOA2eAWIhiD/jAny +z3AAADBDz3GAADwd6P4ChSiFHOA2eAWIUSBAgE4CAQAAhYDgBfIfhoDgQgICAPX8OwIAAASFgeCA +9AKFKIUc4DZ4BRCGAADaUSYAgFOlPvLPc4AAIB3PcIAAAGTWgCKA2WHPdoAA1IbphlirVBAEAAQQ +BQAAJQUBKBYEEOJ5AiUFAeeGHBAEAAIkxIPIhgOAwnjKJoEQBPIB3tirgOEP8kAsjwDxcYX3TyaA +EAXwgOAF8k8mQBAPfhirQSnAABlhsHFE94K+2KtRJkCAKPIAhYDgDvLPcaAALCAmgRKFInjPcYAA +IB0FoUClBvABhYDgAvJBpcP8Vg0P/oLgDfIKIcAP63IF2IojEwVKJAAAKQPv9QolAAFuD+/9ANgC +hSiFHOA2eAWIhiD/jAXyAtgEpZ3wBNgEpZvwBIWC4Ar0z3AAADBDz3GAADwdmf4E2ASlBIWE4I70 +z3CgACwgA4DPcoAAIB0XoggVBRAgFQQQQCUBBxYhAQEFiVEgAIBAIgMHGvJKJMBwANkodqggwAHw +I4ADAeYZYQPfSiRAcQDeqCDAAfAjwAMB5x5mMHbE9xiKgrgYqs92gADUhgDYD6YYFQEBQCRAADBw +CKVH920VAAZRIECABfIB2A+lDv5H8A6FxPwA2A6lDcgEIIAP////Aw0aGDAl/QLYA6UChc9ygACg +BiSIgOEP9CiFHOA2eM9xgADcWjaJBIgwcAHYwHgAoiPwIIKA4QXyAdgDpR3wKIU2eCeAz3CAAGCD +QYDPcIAA6IIFgC2mBSi+AEApgHIQccohxg/KIsYHyiOGDwAALwWqBub/BdgA2ASl/QQv9wHYCiHA +D+tyBdiKI5QOSiSAALUB7/W4c+B48cB2DA/3z3WAANgFBIWA4KHBPPQB3s9wgACgBsCgANgTpSqF +AaWA4QClAtod9M9wgADcWs93gACoBuCXdojxcxH0z3eAAKoG4Jd0iPFzC/RyiM9wgACsBgCIEHMD +9ESlA/DKpclxgeEP9DYJL/YC2M9ygADcWhSKNopAgsoLr/YB28SldvBEpQSFgeAD9ALYBKUEhYLg +HvQChQSIgOAY8guFgOAU9M9ygADUhjCCD4IOIYMPBwAgoRBzSPcH2A6lAdgPpQulBPA4YA+iA9hR +8ASFg+AK9A3IBCCAD////wMNGhgwBNhF8ASFhOAY9FMgwEAqCmAAG6XPcIAAcIPeEAEGz3CAACSF +hCkGDzAgQA5RIECABdjKIKEBK/AEhYXgHfTPdoAAcIPeFgAWBNlAwItwRg+v9pna3hYAFoQoBg8A +IYB/gADkhDCAobkwoAHYC6UG2ASlANgN8ASFhuAK9AbYA6UbhYDgyiBiABt4BKUB2G0DL/ehwM9w +gAD0fCAQgACB4M9xgADYBQv0ANrPcKAAtA9coALYA6FEoQPwAdgFoeB+z3CAANSGZBCAAIHgz3GA +ANgFBfQE2AShA/AB2AWh4H7PcIAA9HwgEIAAgeDPcYAA2AUF9ALYBKED8AHYBaHgfvHAlgoP9w3I +AN4EIIAP////Aw0aGDDmDG//yXDPdYAA2AUVhYDgUAti/8ogYgDVAi/31KUB2c9wgADYBSSglQVP +/+B48cDhxYDhz3WAAEgGEvImhYDhDfQApcIL7/UL2AIIL/+KIAgAAdgGpQ7wIIUleAvwugvv9QvY +aggv/4ogCAAA2AalAKWBAg/38cACCg/3CHYA3+lw6XHr/wPY6XWA5hpwCPITbRR4x3CAAMwhEgqP +/YDmCfITbRR4x3CAABQiAgqP/UIgQCCA4AHlKvfPcIAAPIfpdJ2wMLyesM9wgABIBn4IYADgoAkC +D/fgePHAkgkP989xgACkBgCBoLgAoQHY4v/PcIAAPIcAgIPgy/cKIcAP63IF2N3bmHOtBq/1SiUA +AIDgtAAuAADez3eAAEgGz3CAAGBL1XgggLNuA4AipwOnFG4AIIEPgAA8h0eRBpEQukV4RZE6cASR +ELpFeEORWnACkRC6RXgacFYOb/0qcSKHenC0fQAlgB+AANghIKCCCC/+CnAIcQAlgB+AAMwhkgmP +/QwhgKSE90wiAKAW9COHs260fQAlgB+AACAiIKBSCC/+anAIcQAlgB+AABQiYgmP/YPmTPfPcIAA +PIcAgAHmEHZcB8X//QAP9wohwA/rcgXY/9ua8fHAz3CAADyH3g6v9g3Zng6P9r3/0cDgfvHAiggP +9wh2g+DKIcYPyiLGB8ogZgHKI4YPAACQAcokxgCkBab1yiUmABRuz3eAADyH+GBFkCSQELpFeYDh +GnBC8s9wgABgS9V4IIDPcoAASAYDgCSis24ForR9ACWAH4AAaCIGEAIhIKAEEAAhELqSD+/9RXgI +cQAlgB+AAFwiogiP/c9wgABIBiWAACWAH4AAsCIGEAIhDhADISCgBBAAIQwQASEQuhC7RXgSDW/9 +ZXlSD8/9CHEAJYAfgACkImIIj/1elx2XANkPIYEDELpFeAYgQIAB3R23MLgetxb0z3GAAKQGAIGg +uHYOIAAAoc9woACwHxuAsqcM2RGnVicAEo4Lr/aW2hDaz3GAAEgGAIHYekZ42Qfv9gCh8cB2D8/2 +z3aAAEgGAN0L8BDYuHgLIQCAzA7i/8ogQgMB5YPlIIa294DhyiAhAPgM4f/KIQEArQfP9uB48cAA +2c9ygAA8hyCiz3CAAKQGIKA9sjC5PrJG8fHA4cUA3c9wgABIBqCgz3CAAKQGoKDPcIAAPIepdJ2w +MLyesKlwPP+pcKlxKP9lB8/24HjxwOYOz/YA3891gAA8hz6VDycPEB2VELkleAYg/oM99M9xgACk +BgCBgLgAoc9wgACoBs9xgADcWgCQVokQchv0z3CAAKoGAJBUiRByE/TPcIAArAYAiDKJEHEN9A3I +BCCAD/7//wMNGhgwDciHuA0aGDDPcKAAsB8bgADeDNnSpRClViUAEmIKr/aW2gHYyXF+DmACgNo+ +lR2VELkleOV4HbUwuKkG7/YeteB4qvHgeAhxANj88eB4CHEB2Pjx4HgIcQLY9PHgePHA4cXPcYAA +PId+kV2RELtlehEiAIAB3Qr0A7gUeMdwgADMISoOT/2pcAPwANhpBs/24HjxwOHFKHXy/4DgyiBB +A5AL4f/KIWEATQbP9uB4CHIA2BDZ8PEIcgHYINns8QhyAthA2ejx8cDPcAAAIE4KC2/94cXPdYAA +ZAYApc9wAAC4CwGlz3AAAIgT7gpP/QKlz3APAEBC4gpP/QOlBdjaCm/9C7jxBe/2BKXxwHYNz/bP +doAAiIfoFoEQjCHDjwvygOAG8s9wgADsIoINT/3/2OgeAhDPcIAAfAUA3aCgz3GAAKQGAIHkHkAT +orgCDCAAAKGpcM4NL/+pcZEFz/bxwCINz/bPcIAA0AUAgAQgvo8AwAAACfTPcIAAaIgIiIwgw48D +8gHY4f/PdYAAiIepcC4Lr/Y42VIMQATmCq/2w4VSDO/9yXAIcc9wgADsImINT/3+2DkF7/boHQIQ +4Hj/2M9xgACIh+gZAgAA2OB/5BkAAM9ygADcWnaKz3GAAHgGVIphsQGhQLEocAjZkQCv9nPa8cDh +xc9xgACIh0GJz3WAAHwFgOLPc4AApAYggwbyAdgApYK5IKMJ8ADaQKWiuYDgIKMoCwIAANj2DC// +CHEA2Oj/wQTP9uB48cDPcIAAiAoJgFEgQIHKIGIA4AuiA8ohIgAB2Of/0cDgfuB48cAKIcAP63IF +2I/bSiQAAEUBr/UKJQAB/9nPcIAAaIgoqG8gQwCdBC//AdnxwM9wgACABgSAgOAb9JYNr/UT2IDg +F/TPcIAA8GMHiIDgEfLPcIAAaAVggM9xAQC0VAvYYHsE2kINr/UT2NHA4H7PcYAA7J0JgVEgQIEH +9MMRAAZRIECBBfIaD2/4E9jv8e/x8cCKC+/2B9hyDAAAz3WgALQP/IUacADYHKUODUABz3aAAIAG +AKYB2JoMYAEErkCGz3GAAHRlAqZFoZ4LYAQGofyl1g0gAApwFY6B4Bj0QIaKIEQEz3GAAAQjIoEa +YjhgEHIB2cIhTgCA4QTYBPLWDsACBPDeDsAC3g3AAnEDz/bxwOHFz3WAAIAGFI2MIMOPDvTPcIAA +ECMlgCOBIIHHcZwAAEB+C0/9/tgUrVkDz/bxwOHFz3WAAIAGB4UbeLIIb/0jhYDgBfIB2BWttP85 +A8/24HjxwP/Zz3CAAIAGNKjo//T/e/HgePHApgrP9gh3z3CcAABAz3GAAOiCxYEKCS/9yXGMIAKA +z3GAAIAGAN2G9x14jCACgAHlffcAKEIDBSq+AxwZQA6A5xa4BqEE9P/YFKkUiYwgw49ID8H/uQLP +9uB48cDPcIAABCOCCK/2A9lCCI/2Q/HxwNILr/UT2Kj/z3GAAOydCYFRIECBB/TDEQAGUSBAgQTy +lg1v+BPYz3CgACwgMIDPcIAAgAYjoM9wgABsBSCAYHkL2B/x4HjxwIoLr/UT2ADYGfGA4AHZwHnP +cIAAgAbgfySgz3KAAKAGYYKA4WV4AaIR8s9xgADcWgSSdokQcxT0BZJ0iRBzEPQMijKJEHEM9A3I +BCCAD/7//wMNGhgwDciHuA0aGDDgfuB4z3KAANxaz3GAAKAGBJF2ihBzDPQFkXSKEHMI9AyJUooQ +cgT0AYED8ADY4H7PcYAAoAYAgYDgC/IBgYDgC/QNyAUggA8BAAD8A/ANyJC4DRoYMHECz/zgePHA +z3CAAESbAIBRIECALPTSCq/1DtiA4CT0z3KAANxaz3GAAKAGBJF2ihBzEvQFkXSKEHMO9AyJUooQ +cgr0AYGA4Az0DcgFIIAPAQAA/ATwDciQuA0aGDASCs/80cDgft3//vH88eB4DciQuA0aGDD5Ac/8 +8cDKCEACgOAH8s9wgACkBwCAhuAH9M9wgACgBgCAgOAD9ADYAvAB2ODx4HjxwI4I7/aYcQQikA8A +BgAATCAAoAHdwH0EIoIPQAAAANdyQAAAAAHfz3aAAJyIOI7AfzB1CPSA5QT0OY4wdwT0ANkD8AHZ +YIYvenBwANkH9GGGkHPMIiGAAvIB2S8mR/A6rj/yANrPcaAAtA9coc9zqwCg/1mjB9k6o1ijiHGp +cv4KoAHpc5YLIACpcNL/gOAG9O4JQABKDY/9BPByDY/9RghABAGGz3WAAKAGBLUAhgW1GI4MrW4I +YATpcASVz3KAAIgKJZUUsgiCgOHQICEAzyAiALm4urgFIAAECKIVAM/24HjxwKoPj/bPdaAAtA9w +FRAQz3CAAIgKCYCiwVEgQIEA3gvyCiHAD+tyBdiT24okww+1BG/1uHaLd+lwtg1v9gLZ3KXPcasA +oP/ZoQfYGqHYoQAUADECFAExRCACAkIiAoJBKMMAyiJiAMC4MgqgAcC7ABQAMYYg/w1CIACCugog +AMogYgBwHQAUQcbpcAIJr/YI2X0Hr/aiwOHF4cbPcaAAyBzIgQihBt0R8OB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB4Yb2MJf+f7fXJcMHG4H/BxeB48cDSDq/2AdnPcIAA8GMAkIbgz3Ks +ANQBAN0F9K0aWIAD8K0aWIM326ga2ICG4Az0RdvoGsCA7BpAgIEa2ACCGlgAD/Cg3+gawIMF3uwa +gINa24Ea2ACCGtgDgxqYAwfevhqYgwgagIOG4AzbyiOCDwAAdwAYGsCAvxqYgwwagIOG4DjbyiOC +DwAAfwAcGsCAvBpYgwAaQIMQGkCDvRpYgwQaQIMUGkCDhuAI9ATbqhrYgKsa2IAJ8EjbqhrYgKsa +2ICsGtiAkxpYgIbgatjKIKIKmBoYgHrYmRoYgBDYmhoYgH4aWAB/GlgAgBpYAE0Gj/bgeM9wAAAB +Pc9xqgDwQwWhz3IAADw8RqHPcAAAPD4HoYogVAAIoc9wAAALEgmhz3AAABgcCqHPcAAAHx8Loc9w +AAAcGAyhz3AAABILDaGKIEQBDqHPcAAAPjwPoVChiiBEDxGh4H7hxc9xoADIHAihBt0R8OB44Hjg +eOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4Yb2MJf+f7fXgf8HF4HjxwDoNr/YH2ADfiP8acJj/ +z3WkALg9rBUAFs92pQDYy6K4rB0YEAHY7Kb2HRgQpgkgAOlwiiDEAJ8dGBA52c9wpQAIDD6gx/8K +cN//GNiVHRgQyNnPcIAABCMgoOGgIqDPcQEAwFTPcIAATBfUGEAA+NgLpikFj/bxwMoMr/aKIQQO +z3CAAHx62g8v9kAgDQLPcIAA3FpAIA4Iyg8v9oohBQVKJAB2ANmoIMACiiL/DxJpFHgcZUCk2GBA +oAHh8QSP9uB4z3KAAPBjJ4qA4QX0JoqA4QzygODPcawAkAEA2gPyRaHgfgLYBaHgfuB+4HjxwEKQ +IZBgkBC6RXkp2hK6FSLDACCjAJDwIgAA0cDgfvHAQpAhkGCQELpFeRXaE7oVIsMAIKMAkPAiAADw +8eB48cDhxYDgzCEigA30CiHAD+tyBdiKI4UOiiTDDykBb/W4c1MhfoDKIcIPyiLCB8ogYgGKIwUP +8vVBgGCBoIBYe0KAZHop2xK7FSNNA0ClAIDwIwAAMQSv9gRp4HjxwLYLj/aA4Eh1y/cIdkCFYb5g +egRtgOYIcRDlOfcFBI/24HjxwOHFz3WAACgjqXBAJYEVtgpv9hbaAdjtA6/2MR0CEPHAbguP9gh2 +guDKIcYPyiLGB8ogZgHKI4YPAABPAMokJgCEAGb1yiXGAM91gAAoIwuFACaPH4AARCMQdgT0FI+A +4DLyFgzv/wXYRC6+FQAlQR5gkUGRCLtles9zpAC4PZsbmABCkcobmABDkcsbmABEkcQbmABFkcYb +mABGkccbmABHkcIbmABIkcMbmABJkcUbmAAqkaMbWABeDc//y6UA2BSvMQOP9vHA4cWmwYtw/ghv +9gbZABQAMYDgE/RAJIAwz3WAACgjqXHeCW/2FtoB2DAdAhALhYDgKA/h/8ogIQAAFAAxgeAS9EAk +gDDPdYAAKCNAJYEVrglv9hbaAdgrhTEdAhCB4fgOwf9mCE/21QKv9qbA4HjxwFYKj/bPcoAAXCMB +ghYShAAJJAQATCQAgAXyTCQAgsv3CiHAD+tyBdiKI4gAYQcv9UolAAIA22qiTCQAgGuibKLX92h3 +aHVocRJpFHgeYtOGAeHfZx5i1IZYYBWA22MveZBxHWWsorH3a6LqolECj/bgePHA4gmv9phwz3GA +AFwjbIkA3UAhAgpKJMBw4HioIEADESNAgwf0z3D/AP//FSJMAwCkAeWvfWuBqoFwdQyB1fYQdc/2 +EHMC28ogKQDKJWkQyiNsAMogLADKJawQFPAB2wLYAN0Q8BBzy/YQdQDdyiOpAMogaQAI9gHYAt0D +8ALYAd0A2/AizwDwIkUD8CIAAAIlzgPNoQIgQAEOoQDYDyDAADwZAgAPIEADPRkCAJ0Br/YAHMIA +4HjxwCoJj/ahwQDdYMWy/4twzv/PcYAAXCOwEYMAgONAIQIKBPQUiRDwIMDaifAiDwABgQUovgM3 +dzb2AdgUqbAZQgOpc4DjzCBhgBD0IMPwIs0AQYF6iQUq/gA3dcb2AtgUqQHasBmCAIHgG/KC4A/y +g+Aj8gohwA/rcgXYiiPLA4okww/dBS/1uHMBgVmJBSo+AA2BN3AF9z0RggAg8LERgACA4Pr1PBGC +ABNqRXgvJQcADakZ8AGBWYkFKj4ATYEvIEAOEHIt926BcHA9EYIAhvdFIgUODRlCAQfwE2oFei8l +hwBNqRWJgeAN8oLgEPKD4BHyCiHAD+tyBdiKIwsNwPE8EYAAU2hFeBnwPRGCABPwAYFZiQUqPgBt +gS8gQA4Qcz0RggAJ926BcHCF90UiAg5OqQXwE2pFeA96DqkPiQUiQgFFeIYg/wEMEYQAQ7gLJACA +yiHBD8oiwQfKI4EPAAACA/wEIfXKIGEBBiA+gcohwg/KIsIHyiOCDwAAAwPgBCL1yiBiAQkAr/ah +wOB48cCWD2/2SiRAABpwwLiB4MIkAgEKc4Yj/gNEuwpwhiDxD0e4RCCCI1x6SHHPdYAAXCNMrQQg +ji8AAAAMSr64dtStBCCOLwAAADBMvtWtBCCPLwAAAEBOv7EdwhNTIr6AyiHBD8oiwQfKI4EPAAAx +AcogYQEc8kwkAIAp8gQhAgBQcMohwg/KIsIHyiOCDwAAOwHKIGIBDPQEIMIAUHMO8gohwA/rcgXY +iiMED4okww8hBC/1SiUAAIDjQfQKIcAP63IF2IojRA/y8YPmA/aA5gj2CiHAD+tyBdiKI8UA6PGw +doX2TCUAgAj2CiHAD+tyBdiKI4UB3PFTIgQARCKPAC8mwQMAJIQBhiL/DkK6gHJPerByQ/ZUrbhy +0XJD9lWtSHaC4kT2ANqxHYIQsHZRjQX0gOID8gTaUa3RjYHmzCYikMwmIpEG9FNpJXpOrU2tgOPM +JiKRBfJTa2V6Ta2A4MwmIpEE8lNoRXgOrRNpJXgPrQ2NEK3KDy/4ANh9Bm/2Ph0EFPHAGg5P9s91 +gABcIxGNgOAU8qIPL/US2ADe0a3Src9wgACICg2Qlv/PcIAA8GMHiIDgzA+C99+1TQZP9vHAAtjP +cYAAXCMRqRKJRSBAAhKpD4lQiRByBvIQqWIPL/gB2NHA4H7xwALYz3GAAFwjEakSiYC4o7gPeKG4 +EqkNiVCJEHIG8hCpNg8v+AHY6vHgePHA4cXPcKAAsB87gALYz3KAAFwjEaoPigDbYKJhooYg/wG7 +aA6KYqKsGsAA1bmGIP8BAdtDuBB1cqoE9AXbcqoHghBxS/eBu3Kq2f/PcYAAdGUUgQHgFKEC8N// +oQVP9vHAA9nPcIAAXCMxqADZMqgtiFCIMHIG8jCosg4v+AHYqPHgePHA/gxP9gh3z3CAAIgKCYDP +doAAXCMluD+WUyAQADB3EY5H8hOuAd2xrulwT/9RJwCQBfQRjoTgA/St/1LwE46A4ADZMvSxrqwe +QBAyrraut64K2BiuBdpZrlDYGq4A2I64CKYJpgemA9hAHgIQBNhBHgIQQh4CEEMeghBEHoIQRR6C +EAbYRh4CEEceAhBIHgIQSR4CEAjYSh4CEAzYSx4CEDLYuB4AELAeQhC0/xGOgOAY8gTKkOAU9Ewg +AKAS8gyOM2gleA6uDa7PcKAAsB87gLgWABA2uThgtB4AEMD/gQRP9vHAIgxP9s91gABcIxaNIYUQ +cUf3F40ihRBxRgAFAC2Fz3CAAJwjLmCz/s9wgADwYweIgODQDYL3ANgNpQ6lAKUBpQKlrB0AEKz/ +z3CgALAfG4A2uNhgybi0HQAQFvA4jUCFEo0wcqG4Eq2E93b/DvDPcaAAsB87gUeF1blQcUX3gbgS +rfTxev8FBE/28cAuDS/1EtjPcoAAXCMRioDgFvKD4BH0z3CgALAfO4C0EgAANrkieMm4jCDHj8j3 +d/+tBc//0P+lBc//oQXP//HA4cXPdYAAXCMSjVEgAIEJ8g2NEK3iDC/4AdgSjaS4Eq2pA0/24Hjx +wCoLT/bPdoAAXCMSjlEgAIBN8s9ygAAwcz6C5rkL9ACShiD8AIwgAoBB9FEhAII98gCGAeAApg+O +hiD/AZYSjQBDuLFwM/QA2awWBRBKJMBwUhIEAaggwAXPcIAAfHM0eGCIESVAkEAkDwtALYAAFHg1 +eNhgBfLg48InxRDzoAHhQCVAAMK4rB4AEAGGAeABpgCShiD8AIwgAoAE9AKGAeACpg4ML/US2OkC +T/bgeKPB4cVCwQkUgTBDwoPhQcAA2Ar2gOHI9goUgTCA4cT2g+HD9gHYBxSCMAYUgzBQcwbyIsEw +c8wiQoAD9AHYIcWB5RD0ChSBMCPDcHFK9gsUgjBQccwjqoCE9oDiyiBpAIHgDfSKIckPz3CAALAG +IKCB5f/ZyiEiACGgwcXgf6PAo8FAwEHBBRSBMADYgeFCwg3yguEH8oPhDfQhwQDYDyBAAAMUgTAP +IEAAAhSBMA8gQAAGFIEwgeEO8oLhB/KD4Q/0IcED4Q8gQAADFIEwA+EPIEAAAhSBMAPhDyBAAAkU +gTCB4Q70AhSBMAq5TyECBAMUgTAMuSV6IcEOuUV5JXggwYHhCPQHFIEwIsIGuQi6RXkleOB/o8AA +2M9xrADUAfgZAID8GQCAAKGlGRiAphkYgKcZGICiGRiAoxkYgKQZGICfGRiAoBkYgKEZGIDPcoAA +uAYAgosZGIABgowZGICxEQCGg7ixGRiAshEAhoO4shkYgLMRAIaDuLMZGIDgfvHA4cUA3c9wgAAE +BaCoz3CnAJhHuqBaC0AAgOAD9N//DfCiC0AAz3CAALgGQIDPcasAoP9YoQGAGaHPcKcAFEiooDEB +T/bgePHAtghP9s91gAC4BgKFgeAB2CDyigmv/wfY9gxgAAh2ZgiAAAoLD/YWCYAAjg9AAFYPQACA +4A3yAguAAJ4MwADaCoAA9gqv/8lwAdgCpQDY0QBP9vHA6/+B4CwPQQDRwOB+4HjPcawAmAAAgaO4 +AKEBgaO4AaECgaO4AqHgfuB4z3CrAKD/OIDPcoAAuAYgojmAANshonigeaA/2Tqg4H4C2M9xrADU +AZ8ZGICgGRiAoRkYgAHYohkYgKMZGICkGRiApRkYgKYZGICnGRiABdj4GQCA/BkAgACh4H7xwNYP +L/aYcAHdz3anABRIqKYA393/5P+IcOv//9ibuM9ypwCYRxyiz3CAAAQFIIiA4cohwg/KIsIHyiBi +Acojgg8AALYCyiTCA8QE4vTKJcIDoKj2phvYGqLlBw/24HjxwHIPD/YacAHez3WnABRIyKUWCmAA +AN/L//YKYAAKcP/Ym7jPcqcAmEccos9wgAAEBSCIgOHKIcIPyiLCB8ogYgHKI4IPAACHAsokwgNg +BOL0yiXCA/al2qJ9By/2wKjxwOHFhglgAAh1gOCpcAT0zP8D8OP/eQcP9uB48cChwbhwANhAwFMl +gACB4A/yguAU8oTgGfIKIcAP63IF2IojCQYNBO/0iiSDD89wAAAi0s9xgAD7eQ/wz3AAACPSz3GA +AP55B/DPcAAAJNLPcYAAAXop2hK68CIAAEDAi3DSDe/1A9qhwNHA4H7gePHAig4P9s9wpgCcPxmA +USAAgKHBnvL2CaADi3CA4CP0z3eAAIgKhBcBEC8pQQBOIYAHQSjFAEwlgIAAHEAxCffPcIAADAsy +IEABgOAT9AohwA/rcgXYiiOMAWkD7/SKJIMPABQFMEwlgIAX9893gACICgDdDyVNEc92gADweUAm +wBIuCe/1Cdl2CEAAgOCpcAr0wP8K8AohwA/rcgXYiiOMAt3xTglAAFMlgBCB4A/yguAf8oTgLvTP +cKcAkEgggM9wgAC8oyKgJPDPcIAA8GNAkM9wpwAUSIbiz3GAALyjBPQegAChFvAdgAChEvDPcIAA +8GNEkM9wpwAUSIHiz3GAALyjBPQdgAGhBPAegAGhAsi5EIAAugigA6lxAMHHcYAA+AoUiYDgBPJh +uA94FKkCyIQXARC5EIAAG3iAuAquz3CAANRbNqDPcIAAaJ4ioBD/oQUv9qHAgODxwLhxC/QKIcAP +63IF2HjbWQLv9Iokgw/PcYAAgIgggUwlAIAEIYEPAAcAAEEpAwYA2cokTXHgeOggrQPwIEUABCWC +DwEAAMAuumV6UHME9AHhiwTP/wohwA/rcgXYgdsJAu/0SiRAAOB4z3CAAIgKCIDPcYAAgIhRIACA +BPIBiQPwAongfwCp4HgIcViJAYCA4gKhCfRZiYDiwiCiAMAgoQACoeB+8cCCDA/2KHVihSCQz3aA +ALgGeHljhSR7I4ZleSOmJoUBkDh4J4WiwSR4JIZAJRAUgOIleASmJ/I+DW//B9g6cAGFI4YAHAQw +AhxEMDC5BBxEMCCFi3dgeelwBBAAICSGAhxEMDC5BBxEMAAQASAAHAQwYHnpcADYA6YEppYOb/8q +cGEEL/aiwPHA9gsP9qHBABaOQAAWjUAAFgBB2gxv/wfYGnCC5gbYA/S7eAfgA+AEIIAPAAD8/wUg +gA+ArgAA7HEAoQHI7HEAoexwwKgB2c9woADIH1EYWICH5qIBDQAyJo5zgAB4S0AnAHLUeAB4ABYB +QAAWAECAuc9woADsJyagqvCA5VABDgAAFgBBABYBQQAcRDAAFgFAyg8gAGG9ABQBMQa4gbgQuSV4 +z3GgAOwnBqGA5Sv3jvDscKCogOUUAQ4AABYAQAAWAUCWDyAAEHgGuEUgwgDPcKAA7CdGoAqAi3EA +sQAUATHscCCwYb2A5Sr3cPAAFgBA5gtAAM9xoADsJwuhABYAQGbwgOXIAA4AABYPQAAWEkBBLxEU +8H9CDyAA6XAGuEUgwADPdqAA7CcGpgqGi3EAsQAUADEGIEAEBSCABAAcBDAaDyAA6XAAFAExBriB +uBC5JXgGpmG9gOWyB83/OPCA5WwADgAAFgBBABYBQQAcRDAAFgFA5g4gAGG9ABQBMQa4RSCAARC5 +JXjPcaAA7CcGoYDlKfcc8IDl2vcAFgBBABYBQQAcRDAAFgFArg4gAGG9ABQBMQa4RSDAARC5JXjP +caAA7CcGoYDlKvcA2c9woADIH1EYWICyDG//CnACCO/1AdgA2M9xoADIH3QZGIBhAi/2ocAKIcAP +63IF2IojRApKJAAANQev9AolAAHgePHA8gkP9gAWjkAAFo1AABYAQc4Kb/8H2JhwguYG2AP0B20D +4AQggA8AAPz/BSCAD4CuAADscQChAcjscQCh7HDAqAHYz3GgAMgcEaGF5soALQAA2jMmjnOAAIBL +QCcActR4AHgAFgNAz3CgAOwnZqBK8IDlkAAOAJ914HioIAACABYDQM9woADsJ2agPPDscKCogOVw +AA4An3XgeKggwAIAFgNAz3CgAOwnZqBqgOxwYKgq8AAWA0DPcKAA7CdroCLwgOXKJE1z4HjoIK0H +ABYOQAQmgx8AAAD/KLu2a0UlzxDPc6AA7CcEJoAf/wAAAOaj6oMwuDi+gb0Gf+V+EL7FfaajUaF2 +C2//iHDCDq/1AdhJAQ/2CiHAD+tyBdiKI0YMSiQAAAUGr/QKJQAB4HilAM/18cC6CA/2GnDPcIAA +XCMQiM92gACciIYg/wE7aAWGDiBAgM9xgADwYyeJyiBiAIDhIvI6joDhzCAhgB7yAN0M3xJtFXjH +cIAAOCQggIDhBvICgIDgFfJAeGG/gOcB5TL3ANgars9wgABcIxCIhiD/AUO4BabeDG//CnClAA/2 +CiHAD+tyBdgt20okQABpBa/0uHPgePHAABaFQKfBTCUAhQAcQDFE90wlAIJL9wohwA/rcgXYettB +Ba/0SiRAAAAWgEBhwAAWgEAFHAIwABaAQAYcAjCLcCoKYACCwQPCgOIL9AohwA/rcgXYhNuKJMMP +BQWv9LhzBcBgegbBBMGA4cohwQ/KIsEHyiOBDwAAiAAF2O7zAsCA4OIgQgCmDY/1p8DRwOB+4Hjg +fuB48cCWD8/1G30C8Ah1z3CmAJw/GYBRIACAJvQD3hHw4HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44Hhhvowm/5/t9YDlwgfp/wltCiHAD+tyEthM20okAABtBK/0CiUAAZ0Hz/XxwCIPz/U6 +cAogQKDPcAEAAsPPdaAA7CcGpc9wAQBCxQalz3ABAALIBqXPcAEAgsoGpQ70z3ABAELEBqXPcAEA +QskGpc9wAQDCywalIN/PdqAAyB/wpjLYQx4YEADYegyv9Y248abPcKAArC8agMC4geAB2MB4LyYH +8CjyTCAAoBzyTCEAoA/yz3ADAMYABqXwpjLYQx4YEADYPgyv9Y248abPcIAA8GMAkIbgCPLPcAYA +AnUGpQTwFg6P/89wgACICg+AgLgGpbkGz/XxwOHFAdvPcqAA7CdmooDhz3OgAKwvBvQYg5q4GKNX +8LWDUSUAkAz0VBMEAAohwA/rcgXYSNthA6/0uHPPc8AAR2hmooDgBvLPcAMAxwAGos9wEAAGaQai +z3AAAMIaBqLPcAAAAjQGos9wAACCTQaix9iVuAaiz3AAAEItBqLPcAAAgkYGos9wAABCYAaiz3AD +AALDBqLPcAMAQsUGos9wAwACyAaiz3ADAILKBqKA4Q30z3ADAELEBqLPcAMAQskGos9wAwDCywai +DQbP9eB48cDPcIAA8GMIEAUBTCUAgMwlYoAO8kwlgIAO8gohwA/rcgXYiiPGDp0Cr/SKJIMPANgD +8AHY0cDgfuB4z3ADAAYhz3GgAOwnBqHPcAQARksGoeB+AdgA289xoADIHBGhz3CAAMcgz3KgAOwn +BqLPcIAABzoGos9wgACHUwaiz3CAAIckBqLPcIAAxz0Gos9wgABHVwaiiiCKAAaiiiCLAAaiiiCM +AAaiiiCFAAaiz3ADAAchBqLPcAQAR0sGos9wAwBHOgaiz3AEAMdkBqLPcAMAx1MGos9wBADHMQai +z3CAAMwGAJAQuIUghAAGonGh4H7gePHAocEvKAEATiCBB89wpwA8SBSAz3KAAPt5NHlZYUDAi3Cy +C6/1A9qhwNHA4H7geM9wLAAGAc9xoADsJwahz3CAAMYgBqHPcIAAhiQGoc9wAwDCAgahz3BIAEIB +BqEB2c9wpwAUSDeg4H7geIC4z3GgAOwnBqHgfgnZ4H8goOB48cAiDa/1KNgIcYYh/AMkuc9ygADw +YyCyRCABAyK5IbLBuAKyT/HgePHA+gyv9QDYQSgBAsC5z3KAAPBjJqopuMC4B6o/8eB4z3AgAAYB +z3GgAOwnBqHPcHAAggIGoeB+z3EgAAcBz3CgAOwnJqDgfuB+4HgB2c9woADIHDCgS9nPcKQAHEAk +oOB+4HjPcgAAPj7PcaoA8ENFoUahiiDIDwehz3AAAAUKCKHPcAAADxUJoc9wAAAZHQqhz3AAAB8f +C6HPcAAAHRkMoc9wAAAVDw2hiiCUAg6hz3AAAAI/D6FQoVGh4H7gePHAMgvv9QHZz3CgAMgcMaDP +cAIAAkbPcaAA7CcGoc9wAgDCLAahz3AQAEIhBqHPcA4AgiEGoc92CgDCIcahz3ULAAIipqHPcw8A +QiJmoc9wAACCIgahz3IAAMIiRqHPcA8AAiMGoc93EQBCIeahz3cMAIIh5qHGoaahZqHPdwAAgiLm +oUahBqHPdxIAQiHmoc93CACCIeahxqGmoWahz3cAAIIi5qFGoQahz3cTAEIh5qHPdwAAgiHmocah +pqFmoc9zAACCImahRqEGoc9wAABCIQahz3A3AIIpBqHPcAEAwikGoc9wNwDCQgahz3ABAAJDBqHP +cP8AAmcGoc9w/wBCdQahz3D/AIJ1BqHPcHcAAioGoc9wdwBCQwahz3CDAMJpBqHPcFkAAmoGoc9w +BgACbgahz3ABAEJwBqHPcFgAggAGoc9wTADCEgahz3AHAAITBqHPcAcAAhkGoc9wGABCygahz3CU +AAIbBqHPcAAAgh0Goc9wEAACyQahz3ABAALDBqHPcAEAQsQGoc9wAQBCxQahz3ABAALIBqHPcAEA +QskGoc9wAQCCygahz3ABAMLLBqHPcAcAxgAGoc9wYADGIAahz3APAIIjBqHPcIAAzgZAiM9wAAAC +JIDiyiCBD6oAAiQGoc9xpwAUSADYC6EMoW3/ANjPcaAAyBwRoZ0Bz/XgePHAMgnP9c9wgADwYweI +gOAP8iDeev/PdaAAyB/QpTLYQx0YEADYtg5v9Y240aVxAe/1AdjxwOHFz3KAAPBjBJLPcYAAgIiA +4ADbYKER8oHgJvKC4DfyCiHAD+tyBdiKI0gDSiRAAAEGb/RKJQAAB9gYuAChYalKJMBwYqmoIMAC +ANiOuBYhzQABpQPYDrgCpQHjA9gGsgeyANgw8ADYmbgAoVLYAalKJMBwAqmoIEACAN2PvRYhwACh +oKKgAeNS2BjwANiYuEokwHAAoaggQAIA3Y69FiHAAKGgoqAB42HYYJIBqYbjyiCCDwAAUgACqQLb +ZrIB22eyrQDv9QCp4HjxwOHFz3GAAPBjB4mhwYDgANoz8gAchDAD289woADsJ2agCoCLdQC1ABQN +MalwhiD8B4wgAogF9AAchDBIdal0hCQDkMohwg/KIsIHyiBiAcojgg8AACkCyiRiAAgFYvTKJUID +RCUAHES4BLFEJQATQrgFsQLwRLEtAO/1ocDgeM9wgADwYweIgOAW8s9yAQCIfs9wgABEGESgz3AA +AIj0gODPcYAA0BYG8rQZAAAbgZC4G6HgfuB48cDPcIAA8GMEkIDgEfKB4MwgooAR8gohwA/rcgXY +iiMKBEokQACJBG/0SiUAAM9xKhUVKgTwz3EqKhUVz3CAAAgFIKDRwOB+8cDPcYAA8GMkkYDhQ/KB +4Q/yguEv8gohwA/rcgXYiiMLAUokQABBBG/0SiUAAAQggQ/z///PBCGADwMAAAACuAUhAgAEIYEP +AAAADAQggA8AAAAMJXjPcYAAiAoogQK4USEAgEV4F/QHIIAPDwAAAMbxz3GAAIgKKIFRIQCAC/QE +IL6PDAAAANIgogTSIOIEtvW28SCQAZAGuYG5ELgleM9xoADsJwah4H7geKHB8cB+Dq/1mHDPcIAA +nIgQEAUAz3CAADgkBYChwYDghiH3D0ryz3WAANAGBoWwcAf0B4WQcAX0CIUQcT7yABwAMSDCgOFT +IsAAhiL/A0S6WmIDuFR6FHhYYMdwgAD4jeCI6XKGIv0PW3oBiEV/CHKGIv0PW3pFeADeE/LPcqoA +4AdzglEjAIAI8gii6aLKosuizKLNog3w6KIJovnxCbjleM9ypwAUSAOixKLFohgdQBEcHQARKKUI +3DMGr/WhwACAAdtgoWi4ArgVeMdwgAA4JEOAQ6FBgEGhQoBCoUSARKHgf2Cg4HjPcIAA8GMEkM9x +gAC0JIQoBQQAIYB/gAAoJeB/AqHgeNEAz/bPc4AAxCTPcYAA0AYMiUODAKoNiQGqAdjgfwCj4cXh +xgDZB9gA2rRptH3HdYAAmI9VfcCVjCYCnQDbhfaMJoWSw/b/3sC1wZ285gX2jCY/kUL2YbUB4k96 +jOKn9mG4gOAB4S95IPfBxuB/wcXxwOHFz3GAAJiPiiAID6jaAd0yC6/1qXOA4MohwQ/KIsEHyiBh +AcojgQ8AAHQFyiQhABACYfTKJQEB3v/PcIAA8GMHiM9xgAA4JIDgtKEE8haBQHgtBY/18cC2DK/1 +SiQAAM9ypQAIDAgSBQBMJQCAyiHCD8oiwgfKI4IPAACZA8ABYvTKIGIBQNgCos9zgADwY89xgACc +iM9wgAAoJaSTIIET8IQpAgovc4QtBRQncxtj9CMDAc92pgAAgBUmDhFAJEQAYKaMJIGErveELQUU +ACGAf4AAoCWEKQIKJ3B2kM9xpACgP32hF5AeoQgaQAGJBI/18cASDI/1pcEIdyh29gzv/gfYGnAB +hgzdBBwEMAQXARQGHEQwMLkIHEQwEBYBFGB5gcABhmG9DBwEMAEXgRQOHEQwMLkQHEQwEBYBFGB5 +g8CA5TH3Sg7v/gpwHQSv9aXA8cC6C4/1z3CAADgkAICA4H/yz3DBAEItz3GgAOwnBqHPcMEAgkYG +oc9wwQBCYAahz3CAAFwjEIiGIP8BQ7gpaIbhzgANAM91gACciASFMyZBcIAAiEtAJwJ1BrgUeDR6 +x3CAALiIAHrPcYAAGClQ8M9xgADoKRDgSvDPcYAAuCog4Ebwz3GAABgpMODF/wSFz3KAAPiIz3GA +AOgpBrgUeDXwz3aAADiJz3GAABgpcOC8/wSFz3GAALgqBrgUeNhgJvDPcYAA6ClQ4Lb/z3KAABiJ +BIUW8M92gABYic9xgAAYKYAgAgSv/wSFz3GAAOgpBrgUeNhgq/8Ehc9ygABoiQa4FHjPcYAAuCpY +YKX/GQOP9eB4z3KAANAGAIrPcaAA7CcQuAUggA8AAMJpBqEBihC4BSCADwAAAmoGoeB+4HjPcoAA +0AYCks9xoADsJ4a4ELgFIIAPAADCEgahA5IQuAUggA8AAAITBqHgfvHATgqP9c91gADQBsiNCY3C +vsK4Fn7PfooOr/8N2Aa4gbgQvsV4z3GgAOwnBqEEhc9xpQDoDwahBYUHoX0Cj/XxwAoKj/XPdqUA +6A8mhqeGz3CAANAGAN8koKWgRg6v/w3YBriBuM9xoADsJwah5qZFJc0fp6Y9Ao/14HjxwLoJj/Wi +wTpwGnEA3a4K7/4H2JpwAtmpcFpwenEA2zRoAnEodRQhACBocsKFBBAPBdh/w4UB4sR/g+LleyDl +tvcBgQIcxDAwuwAcBDAggQQcxDBgeYtwQiNBIIDhvgft/0AiQCDyC+/+inChAa/1osDgePHAz3CA +ADgkD4CA4A/yz3CAAJyIBIDPcYAAGCzPcoAAGI8CuBR4WGDZ/9HA4H7gePHAHgmP9c9wgAA4JBSA +gOB+8s9wgABcIxCIhiD/AUO4KWiG4egADQDPdYAAnIhEhc9wgACYjzMmQXCAAJBLQCAQCwS6VHpA +IBEKQCASBkAgDwhAIA4EWGBAJwJyNHoAes9xgAB4LFHwz3GAAJgsBOBL8M9xgAC4LAjgR/DPcYAA +eCwM4B4Mb/8A2gSFz3GAAJgsBLgUeNhgN/DPcYAAeCwc4AIMb/8A2gSFz3GAALgsBLgUePhgKfDP +cYAAmCwU4OILb/8A2gSFz3GAALgsBLgUeEJwGfDPcYAAeCwk4MYLb/8A2gSFz3GAAJgsBLgUeCJw +sgtv/wDaBIXPcYAAuCwEuBR4AnCeC2//AdptAI/18cAKJQCAz3GAANAGJBEEACPyTCQAgM9ypAC4 +PQDbDvSbEgAGCqGmEgAGC6GSEgAGDKGjEgAGDaGbGtgA/9imGhgAkhoYAKMaGAAB2s9woAC0D1yg +JvBMJACAyiHBD8oiwQfKI4EPAADMBegEIfTKIGEBCoHPcqQAuD2bGhgAC4GmGhgADIGSGhgADYGj +GhgAA8jPcqAAtA+GIP8OIrgcoiQZQAEj8eB48cDhxVIPL/UIdToLYACpcNkHT/XxwOHFPg8v9Qh1 +/gpgAKlwxQdP9fHALg8P9XT+CfHgePHAQg9v9YogyA2hwYt2yXEB2mYNb/VIc4DgDvQKIcAP63IF +2Ioj2AFKJAAASQQv9AolAAEAFAAxz3WAANAGyXEB2gytiiAIDi4Nb/VIc4DgyiHBD8oiwQfKI4EP +AAAOBgXY5PMAFAAxDa1FB2/1ocDPcIAA2CzgfxSA4HjxwL4OT/UIdxpxAdnPcKcAmEc6oCDez3Wg +AMgf0KUK2EMdGBAA2EoML/WNuNGlz3GnABRIDIGA4APyPoEC8D2BABhAIPe5xSGCDwD/AADTIeEF +0QZv9SCn8cBqDk/1z3CAAPBjJoiA4c92gADYLHQCIQCiwQeIgOBoAgEAMg+v/gXYD6bD2M91oADs +JwalCoUA2QC2iiDEAAalCoXPd6cAFEgBtoogxQAGpQqFxtoCtoogywAGpQqFkLoDtoogzwAGpQqF +z3NQAP8ABLbPcAAAgw0GpQqFBbbPcAAAww0GpQqFBrbPcAAAAw4GpQqFB7YIhwSmz3CnAJhHHIAF +pheHBqYWhwemz3ClAAgMAoAIpg2HCaYOhwqmD4cLps9wqwCg/xiADKbPcKsAoP8ZgA2mz3CrAKD/ +GoAOps9wBQDGAwalAdhGpc9yLAACAUalz3JaAEIBRqWKIosARqXPckAAhw1Gpc9y0QDCDUalz3LA +AAcORqUIp89ypwCYR3yiF6c2p89wpQAIDFDaQqAtpy6nL6f82M9xqwCg/xihc9gZoRqBgbgaoc9w +EQAGDgali3CBwZT/NoYAwCJ4hCiEAxWGN4YCeZYLr/svcAHCgiDEAs9xgABwcBOmVaEWoc9wQACG +DQalz3AQAAIOBqWLcIHBhP82hgDAIngEKIAPAAB0CRWGN4YCeVYLr/svcE/gFKYBws9xgABwcBih +AJYQuIUggwAGpQGWELiFIIQABqUClhC4hSCFAAalA5YQuIUgiwAGpQSWELiFII8ABqUFlhC4BSCA +DwAAgg0GpQaWELgFIIAPAADCDQalB5YQuAUggA8AAAIOBqUEhlehCKclhs9wpwCYRzygBoYgFgUQ +F6cHhkwlAIAWp89wpQAIDAgYQAHKIcIPyiLCB8ogYgHKI4IPAAD7AEQBIvTKJCIACYbPcasAoP8N +pwqGDqcLhg+nDIYYoQ2GGaEOhhqhcg6v/g+GE4ZJBG/1osDxwNoLT/XPcIAA8GMHiIDgWgIhAKLB +sgyv/gXYz3aAANgsD6bD2c91oADsJyalKoUA2CC2iiHEACalKoXPd6cAFEghtoohxQAmpSqFxtoi +toohywAmpSqFkLojtoohzwAmpSqFz3NQAP8AJLbPcQAAgw0mpSqFJbbPcQAAww0mpSqFJrbPcQAA +Aw4mpSqFJ7YohySmz3GnAJhHPIElpjeHJqY2hyemz3GlAAgMIoEopi2HKaYuhyqmL4crps9xqwCg +/ziBLKbPcasAoP85gS2mz3GrAKD/OoEups9xBQDGAyalAdlGpc9yLAACAUalz3JaAEIBRqWKIosA +RqXPckAAhw1Gpc9y0QDCDUalz3LAAAcORqUop89ypwCYR3yiN6cWp89xpQAIDFDaQqENpw6nD6f8 +2c9wqwCg/zigc9k5oBqAz3GrAKD/gbgaoc9wKgACDgali3CBwfD+AMHPcIAAcHA1pjKgAcEvoM9w +GgACDgali3CBwen+AMHPcIAAcHA2pjOgAcEwoM9wJgACDgali3CBweH+AMHPcIAAcHA3pjSgAcEg +FgUQMaAAlhC4hSCDAAalAZYQuIUghAAGpQKWELiFIIUABqUDlhC4hSCLAAalBJYQuIUgjwAGpQWW +ELgFIIAPAACCDQalBpYQuAUggA8AAMINBqUHlhC4BSCADwAAAg4GpQSGJYYIp89wpwCYRzygBoZM +JQCAF6cHhhanz3ClAAgMCBhAAcohwg/KIsIHyiBiAcojgg8AAPsA1Abi88okIgAJhs9xqwCg/w2n +CoYOpwuGD6cMhhihDYYZoQ6GGqH+C6/+D4aTBc//4HjxwOHFz3WAAJyIvgwv/6lwuHAAhYDgEvLP +coAAmEtKJIBzANioIEACRCh+AzIiQQ6wcR/yAeAU8ADYSiSAec9ygABATKggAANZIkEFRCh+Aydx +uBGBALBxC/IB4AohwA/rcgXYn9s9Bu/zSiSAAnUBT/XgeM9wgACciCCAA4CA4UQofgMAIYB/gACY +SwPyDIgD8MQQgADgfvHA0ghv9ZhwocEodc93oAAsIBCHz3aAAAgHBKYwhwSGAnkwciOm1fdALIAB +RSDDAM9woADsJ2agCoCLcQCxABQAMaR4EHXs9fEAb/WhwMKWz3CAAJyIDBAEAAAUDzEQvgohwA/r +cgXYiiOGCgUkhAMQv5kF7/MFJ0UT4HjxwFIIb/UA2M9xgADwYySRocGC4cwhYoDKIGEALyAHIM91 +gAAIBwKVz3egAMgfAeACtQHYUR8YkM9wwABHaM92oADsJwamw9gGpgqGQCSBMACxAhQAMcG4g+AR +8s9wAwDGAAamINgQpzLYQx8YEADYkg3v9I24INgRp89xgAC0JASBgeAT9AaBQHjPc4AAnIgYE4UA +TCUAgBT0z3ABAAYBBqbPcBIABgQT8AohwA/rcgXY4ttKJAAA1QTv8wolAAHPcAEABwEGps9wEgAH +BAamiiDEAAamCobPcYAAzAYAEwYAALFMJgCAz3CAAJhLI4Mm8kQpfgPG2ZK5JqbPcQAAwhomps9x +AAACNCamz3EAAIJNJqbH2ZW5JqbPcYAA8GMgkc9ypwAUSIbhAdnCIUEAM3nCuSuiLKIncB/wgCAC +DkQpfgMncMfZkrkmps9xGQDCGiamz3EZAAI0JqbPcRkAgk0mpsbZlbkmpgDaz3GnABRIS6FMoc9x +gADwYyCRhuEG8gHaz3GqAOAHU6FMJgCACPRMIACgyiGCDwIAgnIF9M9xEACHciamIYgQuQUhgQ8A +AEJyJqYliBC5BSGBDwAAQnAmpiSIELkFIYEPAACCcCamI4gQuQUhgQ8AAMJwJqYiiBC5BSGBDwAA +AnEmpimIELkFIYEPAABCcSamKIgQuQUhgQ8AAIJxJqYniBC5BSGBDwAAwnEmpiaIELkFIYEPAAAC +ciamK4gQuQUhgQ8AAIJzJqYKiBC4BSCADwAAxnMGpkLYjLgGps9wAQBGagampBcQEM9wgADGcwam +z3BAAEJ0BqbPcIAAx3MGps9wAgBGagamz3AQAMZqBqYki0wlAIAB2i8ghwHAeo4KIAJ5iyTYGNkz +2jz/z3AQAMdqBqbPcBAAhnIGpmoMAAJyCkACJNgB2TPaNP+kFwAQAiAABAClz3ACAEdqBqbPcMAA +RmgGps9wAADDCQamCoaLcQCxABQFMUwlAIDMJeKHI/QDlQHgA7UElYHgC/QEFQQRCiHAD+tyBdiJ +Au/ziiMGA4LgEfQEFQQRTCRAgMohyQ/KIskHyiOJDwAAkAFkAunzyiBpAQDYUR8YkH0FL/WhwOB4 +8cDhxc91gACciAClIaVYrXmt5/4DpQP/BKXPcIAA8GMHiIDgnAzC/2UFD/XxwOoML/VKJEAAz3CA +AJyIRIDPcYAAgAbPd4AA6JBVfyCBAIdKJUAAAiEDAM9wgAA4JK+AtBAOAM9wgACEBoHlwiQCAYHm +AIjCJUIBgOC0wR3yTCQAgMwlIoDKIcEPyiLBB8ogYQG8AeHzyiOhDHF7lOPN989wgACkD2SAIKdA +wgHjZKDGDyAAi3DJBC/1tMDPcQEAuImA4Qnyz3KAANAWwBpAADuCk7k7os9xgACQkXED7/RU2uB4 +8cDPcYAA5JFiC+/0LNoA2UokwHHPcoAA6JCoIIACz3AAAP//FSJMAACkAeHRwOB+z3GAAPBjJJGB +4QHZwHngfyCg4HjxwNYLL/UB2qPBCHXOCu/0i3HPcYAAQE4AgUHAApEIHAQwz3CAAPBjAJCG4ADC +BPLDukDCz3GAABwHgcOpcOoIYAAwgSHAHgtgAAfZWnAFFIAwEgtgAAfZOnBKcADZCNoqc0okQALS +C2AASiVABLpwBhSAMO4KYAAH2RpwBxSAMOIKYAAH2Qh3CnAA2Qja6XNKJEACogtgAEolQASacCLA +wgpgAAfZCHUJFIAwtgpgAAfZCHapcADZCNrJc0okQAJ2C2AASiVABHpwz3AAAAjSqnHKC2AAANpB +2Am4SnG+C2AAAdrPcAAAAYIqca4LYAAB2s9wAAAJ0opxogtgAADaz3AAAAKCCnGSC2AAAdrPcAAA +A4LpcYYLYAAB2s9wAAAK0mpxdgtgAADaz3AAAASCqXFqC2AAAdrPcAAABYLJcVoLYAAB2gDY3QIv +9aPA4HjxwKTBi3GGCe/0A9qSDu//g8ADwIDgNPQAwc9wAAAb0oDhEPQB2SYLYAAA2s9wAAAc0gHZ +FgtgAADaAtgK2TDwgeEQ9ALZBgtgAADaz3AAABzSAtn2CmAAANoC2BTZIPAE2eoKYAAA2s9wAAAc +0gDZ2gpgAADaAtgh2RLwz3AAABvSAtnGCmAAANrPcAAAHNIA2boKYAAA2gLYEdmuCmAAAtoCwc9w +AAAF0qIKYAAA2gHB0tgIuDt5AeGSCmAAANoA2KTA0cDgfvHA1gkP9anBQMBBwQDYSMCCxU4JYACp +cITGRglgAMlwhsc+CWAA6XAAwIty2ghgABfZAcCBwtIIYAAX2QDAKglgAKlxAcAiCWAAyXGpcKlx +IglgAKlyyXDJcRoJYADJcqlwyXEuCWAA6XIGwAfBiMNiDyAAAdoIwMUBL/WpwOB48cBOCS/1BNqk +wRpwNgjv9ItxAMHPdoAAHAdxhs9wgAC4LQQUETAA3fAgwgDPcIAAxC3wIM8Az3AAAAbSWHnGCWAA +qXLPcAAAB9IAKcEjtglgAKlyCnDPcq3e774mDGAANIYKcEH/g+Am8jGGAsIKcAokgA+t3u++Cgxg +AAPDCnCO/4PgGPLPcAAAINJWJgEUyglgAATaz3AAACHSVSZBGLoJYAAE2oAWABCEFgEQtf8bpqlw ++QAv9aTA4HjxwJYIL/UB26HBGnDPdYAAHAdZhTiFCiWAD63e775ZYVqFpgtgAEokAAAKcMb/g+Bd +8huFOYUC21iFHKUKcAolgA+t3u++WWFahX4LYABKJAAACnC8/4PgSfIbhTmFAdtYhR2lCnAKJYAP +rd7vvkJ5WoVWC2AASiQAAApwsv+D4DXyG4U5hQLbWIUepQpwCiWAD63e775CeVqFLgtgAEokAAAK +cKj/g+Ah8huFH6VkFRAQWIU8hd6FfYU/ZhlhYnlifwIhgYMCfwDYQMAO8kx/i3YvcMIOIADJco4O +IADJcADBAiBAIBmlANgRAC/1ocDxwOHFocEIdYtxjg6v9AHaAMDPcYAAHAcQoc9xrd7vvrYKYACp +cKlwuv+D4MogIgDxB+/0ocDgePHA4cUA2AhxFghgAALaAdgA2Q4IYAAC2gLYCtkCCGAAAtrPcAAA +BNIA2fYPIAAA2s9wAAAN0gHZ5g8gAADaz3WAABwHE4UVJQAQJIDPcAAAEdLODyAAANrPcIAA8GMg +kIbhE4UVfQT0JoUD8CSFz3AAABDSqg8gAADaz3AAAALSz3HQB/8Amg8gAADaz3AAAAHSA9mKDyAA +ANrPcAAAA9IC2X4PIAAA2s9wAAAb0gPZbg8gAADaANiPuAPZYg8gAADaz3AAAAXSANlWDyAAANoJ +2Iy4ANlKDyAAANrPcAAAC9LPcUsAS0s2DyAAANrPcAAAEtIA2SoPIAAA2s9wAAAT0gDZGg8gAADa +z3AAABTSANkODyAAANrPcAAABEOKIc8P/g4gAADaz3AAAHDSANnuDiAAANq1Bu/0ANjxwDoO7/S1 +2KHBng8gAADZiiCEBpIPIAAA2YogRgCKDyAAANkE2IIPIAAs2Q/Yeg8gAAHZBthyDyAAFdkI2GoP +IAAV2QnYYg8gABXZCthaDyAAAdkL2FIPIAAB2QzYSg8gAAHZz3WAABwHUYUF2EjZNg8gAA8hgQAz +hYt2geEVJUwQFJQH8s9xgADwYyCRhuEp9FIPIADJcROFAMEVJQAQFJAGDyAAxrkThRUlABAYkDIP +IADJcROFAMEVJQAQGJDmDiAAxrkThRUlABAckBYPIADJcROFAMEVJQAQHJDGuSjwAg8gAMlxE4UA +wRUlABAUkLYOIACHuROFFSUAEBiQ4g4gAMlxE4UAwRUlABAYkJYOIACHuROFFSUAEByQxg4gAMlx +E4UAwRUlABAckIe5dg4AAADYcQXv9KHA8cDhxaHBi3HeC6/0AdoAFAQwz3WAAASRz3CAADgtqXEU +2iYPIAAA2wAUBDDPcIAAHAdWJYESA9oODyAAAtvPcIAAYC1VJcEVEtpqDyAAAMMxBe//ANjgePHA +mgzv9AHapMEacIILr/SLcQpwz3Kt3u++tg8gAAjZCnDi/4Pgz3eAAASR0/IAwc9wgACELc92gAAc +B/AgQAAwpo7gAdjCIA4AE6YK2BimANgRpk4I7/+BwM9wgADwYwCQhuAB2MIgAQAbeEAgUQAI8Ajg +GaYZhgC1EYYB4BGmUYYyciABBgABwIDgBfKA4swiooDz8xCGVSfDGDJoNHkYYBR4PWNUeFYnARcI +YVV9z3Gt3u++FKYWDyAACnAKcBz/g+CH8s9xrd7vvgIPIAAKcApwZv+D4H3ykg4gAADYz3Gt3u++ +6g4gAApwEIYYYFGGFHjpcYAhQwhUeAlhA7rPcAAAC9JYeUYMIAAA2hGGFCYAEASQ/gwgADSGEYaA +4Aj0BtjuDCAANIYC2ArZEPCB4Az0bg+v/4LAAsEC2IDhFNnKIWIEBPAC2CHZAgwgAALaAJXPcq3e +774ZpgGVGqYKcG4OIAAAwQpw5P6D4DPyIJUKcM9zrd7vvlYOIABZhoLBCnAKCq/0AtoCwAPCAiIB +ADF5iOHiBs7/EHLWBsr/aLhq8Qpwz3Kt3u++Ig4gABDZCnB9/4PgDfLPca3e774ODiAACnBGCCAA +CnCD4MogIgAxAs//4HjxwOHFz3CAADgkqIBTIsAAhiL/A0S6WmJUegO4FHhYYLhgaHHeCa/0BtoZ +A+/0ANjxwJoK7/QA2c92gADQFheGz3WAAASRDyEBABmGJHhCIACAyiBiAIHgocEB3wn0z3EAANgl +C9j+DG/2VSXCGDeGANgPIEAAOIYkeEIgAIDKIGIAgeAA2Rv0C9hgwAEcQjACHMIzAxzCM4t2yXAE +2VUlwhgWDW/2VNsR2GDAyXAE2VYlAhcCDW/2LNsA2HUC7/ShwOB48cDeCc/0WnAacdpw+nE6cnpz +ANiacG8lQxAIdkogwDc7cAh3unDpcKpxWg0gAAHaACBAgwEhgQNKDSAAC3JCIFiwynNDIRkw8nHM +IMGACvcAJ0+TASWVIwImFqADJ1cgqXDJcUoNIAAB2gUgfoAIdSh22/XpcKpx6XJiDSAAqnMCIhKg +6XADIFAgqnH2DCAAAdoFIj6kCHUodhDyBSW+kwzyKnAA2UpyMg0gAApzqXJKDSAAyXOacCpwANnp +ch4NIACqcwAkAiBVAe/0ABuAICCAANqA4UX2AdozeSCggCEBgH/cwCEEA4DiR7kgoATyM3kgoOB+ +4HgggAe54H8goKHB8cDhxULAmHFIdYDgANpE9gHaE3hCwILA+P+A4gLAAvITeHoP7/qIcQClCNxT +Ac/04HjhxZ/h4cYA3RjynuED9oDhQ/YA2BTwn+Ef3kr2TiH8B+B4qCCAAQ8ljRNhvhEgQIAD8qV4 +AvCmeACiAdjBxuB/wcXgePHAocEA2kDCi3Lt/wDAocDRwOB+ANkgoOB/IaAIcl+4QKHgfwGh4Hjx +wGoIz/RIdUCAYYDBgQCBKgwgAMlxAKW9AO/0IaXgeOHF4cbAgGGAoIEBgQAljZMBIMAAoKIBoszx +4HjxwC4Iz/RIdcGAAIAocooNIADJcQClhQDv9CGlYIBAgQGAIYFQc8wgQYDhIMEHyiAhADBwhvYE +9lBzxPfgfwHYiiD/D+B+4Hif4cwg7ofMIE6ABvcCeUFpoOIF9Ioh/w8G8ADZDyGBAGG5GHngfyhw +8cC6D6/02HAodkhxiHXJcPL/CHepcKhx8P8IcQAugAMEfyZ/ACtAAyR4+Qev9OV48cCOD4/0SHaA +4AHdRPaKJf8fE3iA4UT2s30zeRQhAAACDu/6O3mseAAeQB7NB6/0AdjgePHATg+P9DpwKHUacjYI +L/4H2EwgAKAT8kwgQKAS8kwggKAT8gohwA/rcgXYNdsKJEAEXQRv8wolAAQp2RK5B/AV2RO5A/Ar +2RK5FSFBBKChjgkP/lkHj/TxwPIOj/Q6cCh1GnLeD+/9B9hRIICgWnAG8lYPr/5k2FAgkCBMIACg +EvJMIECgGvJMIICgGfIKIcAP63IF2GDbCiRABPEDb/MKJQAEKdgSuPAgQAQApTIJL/5KcPEGj/QV +2BO49vEr2BK49PHxwI4Oj/QacCh3AdgA3c92oADIHBGmag/v/QfY8H9AKIEhgbkQv+V5z3KgAOwn +JqKxpuoID/69Bo/04HjxwFIOj/ShwRpwKHYB2M91oADIHBGlLg/v/QfYQCiQIUUgwyDPcqAA7Cdm +okqCi3FAsQAUATEA3yCm8aWiCA/+dQav9KHA4HjxwAYOj/QIdzpxgOIacwDezPdIdfQngBMVIYEj +CnK9/2G9gOUB5jj3PQaP9PHA2g2P9Ah3OnGA4hpzAN7M90h19CeAE/AhgSMKcpz/Yb2A5QHmOPcR +Bo/0USTAgPHABPLo/wPw8v/RwOB+4HjxwJ4Nj/ShwQh3gOIacQDezvdIdfQngBOLcc3/AMAUIIwj +Yb2A5QC0AeY297Dx4HjxwG4Nj/QId4DiGnEA3sz3SHX0J4AT9CCBI7L/Yb2A5QHmOfetBY/0USPA +gPHABPLo/wPw8//L8fHAOg2P9Ah3AdgA3c92oADIHBGmEg7v/QfYgL/PcaAA7CfmobGmng/P/XkF +j/TgePHA4cUIcY7gAdjCIA0AAN3Pc6sAoP+5owfaWqO4owHa1g9v/0hzbggv/gHYVQWP9P0HD/Tx +wG4KAADODK/0UNlFwEogACCGxfr/TCAApQQVARRP9wXA13Gt3u++FSAABCCgQCBQIPP1JNwDBY/0 +CiHAD+tyBdiKIwUImHPFAW/zCiUABFMiQoHgfE4iA4gWAAwAASjMAAApgQAAKIAA4H+FeU4jAwAA +KMEA4H8CeOB4UyJCgeB8TiIDiBYADAAAKcwAASmBAAEogADgf4V4TiMDAAEpwADgfyJ54HgIdADY +BSp+AC9xBSo+AwAgQI4BIcEOBSs+A+B/J3HgeDMAIABKJAAAByHEAC8mQPBKJQAAEAAmAC8kBAEO +IECBAyVBAIDjDgADAA4iQoEDJcMABSOFgDABAQB5c0h0CHIocwolwIJKIgAQGgAEAMAiIRjKJQGD +Ly9BAcAiYxDAIsMRSicAAAolwIDAJyEIFgAEAMolgYAvKEEBwCdjAMAnAwAOJ4eCyickAEAnRwAK +JcABTCcAiADZEAAkAADYSHFocgDbQicHiAokQHEoAAEATicKiH4AAQAAKYACASnBAQAqhQKgcQEq +wgEAK4UCASvDAaByTCIAmGoACQCoIIAFACAAgAEhQYABIoKAASPDAAIiAoMDI8OCDAAGAAAiAoMB +I8OCwCBmAEIkPoBKJQAAIAABAAwACgAOIkKBAyXDAC8kAIEMAAMADiBAgQMlQQDgfihwSHFocgDb +ICCADwEAaJuoIIADACAAgAEhQYABIoKAkXLCIgYDxSBmACAggA8BAJybANoJagDbLyECACAggA8B +AMSb4HhTIkKB4HxOIgOIFgAMAAApzAACKYEAASiAAOB/hXhOIwMAAinAAOB/QinBB/wciLH8HEix +/BwIseHD4cLhweHAB8AcHMAx4cDgfwHA8cBKCo/0z3WAAKQHABUFEEwlQILKIcYPyiLGB8ogZgHK +I4YPAABUAFgHJvPKJKYAz3aAAAAAAIZRIICCGvIBhlEggIJA2c8h4gfKIYEPAADQAM8h4QfPcJ8A +uP89oCSGAeHTuSSmBSGBD9D+AAA2oM93gABITgTwABUFECGFQC0AAiV4IoUwcALyAqXwJ0ARQHiA +4PLzAIZRIICCBvIA2c9wnwC4/z2gCQKP9PHAz3GAAMAHIImjwQEcAjDPcIAAlpf0IEAAYMHPcaAA +yB8DHAIwANgCHAIwAdgToRmBQsAYgQzZQcCLcGINL/SE2s9xgABEmwCBo7gAoaPA0cDgfvHATgmP +9M9wgACkBwDdoKDPcIAAqAegoM92gAC8BwCGjCDDjwbyz3CAABwuTgkP+89wgADAB6Coz3CAAMQH +oKDPcIAA5AegoP/YcQGv9ACm8cDhxQh1kgpv8xHYz3CAAOydCYAluDoJYAHAuC4Pb/wE2Klwzv/j +/6IPj/1FAY/08cDKCK/0gdihwWDAA8wA3s91gACkBwIcBDAAhYDgARyCMxDyz3GAAMQHAIGBuACh +z3GAAOgtA4EB4AOhAd8D8ALfAMDWCm/06XGC5yryz3eAALwHAIeMIMOPDvLPcIAAHC6aCA/7/9gA +p8Clz3CAAKgHwKAAhYDgB/TPcIAAqAcAgIDgBfJ+C8/8gOAK8s9wgADEBwCALygBAE4gwAfN/5EA +r/ShwOB48cDPcIAAEJJBiM9xgABslUoPL/QC4s9wgAC4ByCQz3CAADSSLrDRwOB+4HjPcIAApAcA +gIDgzCBigAT0ANgF8Ijg/vMB2OB+8cDWD0/0CHfPdYAApAcAhSh2gOAacgb0gObiIIIDL/DPcIAA +vAcAgIwgw48G8s9wgAAcLtYPz/rPcIAA4AfPcoAAxAcggsCgBSEABACiz3GAAOgtAoEB4AKhz3CA +ANwH4KAE8C4Nz/8AhYDg/PXPcIAAqAcAgIDg9vXBB0/04HjxwM9wgACkBwCAgOAJ8s9xgADoLQmB +AeAJoQLYkf+h8fHAwghv8xHYAg1v/ATY/9nPcIAAvAcgoJPx4HjxwB4Pb/Qc2s9zgADQLSCDz3WA +ADSSQKFAJQEXIaMA2Y25KKXPcYAAsAcppc9xgAAwlSOjgOAY2SKjCvTPcYAAbJXPcIAA1AcgoELw +z3GAANQHIIEhiUQovggA3kAhhgDPcYAAZ5IyIUIOLyaHAc9xgADYBwLiT3qA4gARhQACJYEA2PYA +Jo8fgABQkkQovggW5zInTx4AIYQDACSBD4AAMJUB5s9+UHbgqQIlgQCs9s9wgAAwlRlhz3CAANQH +IKAOlQIggAEQeFhgDrUlow6VtQZv9ASj4HjxwKXBz3CAADSSBYDAuA0cAjDPcIAAwAcgiM9wgACY +l/QgQAAB289xoADIH2PAc6EZgQDaQcAYgQ4cgjBAwBWBDxyCMETDFNlCwItw+gkv9ILapcDRwOB+ +8cCkwc9wgAA0kgWAwLgBHAIwz3CAAMAHIIjPcIAAmJf0IEAAz3GgAMgfYMAA2AIcAjADHAIwAdgT +oRmBQsAYgUHAz3CAAABkO4AHgDhgQ8CLcBDZmgkv9IPapMDRwOB+8cCODU/0z3WAAKgHAIWB4Avy +CiHAD+tyBdjT20okAAClAi/zuHPPdoAApAcAhoLgzCDigcohwg/KIsIHyiOCDwAA1ADKIGIB6vXP +cYAA9HwgEYEAgeEJ8s9xgAA0kiKJUSEAgBv0guAA38og4QAS8u4Lj/3PcIAAxAcAgFEgAIAH9M9w +gAA0kgSAgOAF9AHYAKbgpQzwCNj88Q3IBSCADwEAAPwNGhgwAtgApUkFT/TxwOHFz3OAAAAAIIOG +Ie+PGvIBg1EggIJA2M8g4gfKIIEPAADQAM8g4QfPcp8AuP8dogSDAeDTuASjBSCAD9D+AAAWos9w +gADZBwHaQKjPcIAApAcAgITgB/TPcoAAqAcAgoHgDPIKIcAP63IF2IojBAJKJAAAoQEv87hzz3CA +AFyYIBCAAIHgEPTPcIAA0AcAgADdz3OAAMwHDyUNEACDpngAowbYA/AC2IDhAKIH8gDZz3CfALj/ +PaCdBE/04HjPcYAAxAcAgYC4AKHPcYAA6C0FgQHgBaEG2c9wgACkByCgANnPcIAAqAfgfyCg4HjP +cIAANJJEkIDiHfLPcIAA2QcAiIDgF/TPcIAAwAcgiM9wgAAYl/AgQABRIACAC/TPcIAAAGQ7gAeA +OGAQcgHYwvcA2OB+4HjxwKYLb/SA2KHBYMADzAIcBDAA2AEcAjDPcIAApAcAgIDg6vT6CY/9gODm +9M9wgAC0HACAUSAAgd70JgrP/89wgAA0kkYLL/SKIQsPz3CAADSSBZDPd4AAuAeGIH8MHHhTIICA +BPQDh4a4A6fPdoAALJb83AImABMSCy/0GNnPcIAANJIukMDcAiYAE/4KL/R4ucDcQBaFkAImABNM +JQCAB6cL8gohwA/rcgXYqNsxAC/ziiSDD0EWjZBAJYUQQCWAH0wlgIgPeCAfAhDK9wohwA/rcgXY +rtsFAC/ziiSDD8DcAiYAE89xgAAQkvIJL/Socs9wgAA0kg6Qz3WAADCaALcA2CjwABYCQM9xgAAY +lxV5QKEAFgJBz3GAAJiXFHlAsQAWgUDPcoAACJYWejCqMaoyqgAWgUA0qjWqNqoAFgFBz3KAANSX +FXoisgAWAUEB4COyz3GAADSSI4kwcKoHxf/PcIAANJJOC8ABwgsv8xHYBghv/ATYAcgB2c9ygACo +B4odGJDPcIAApAcgoADYAKJmDC/0AMDPcoAARJsAguG4PfLPcYAA4KAsiYfhIfTPc4AA3FrPcYAA ++KDCkbaL0XXPcYAA7J0H9MIRDQZ0i8C9cHUK8sMRAwZRI0CBBvIpgVEhQIEF9ALZqRpYAIO4AKIV +8M9xgADoLQSBAeAEoc9woADUAxyQwgsP9ADA6gsv9ALZ9g+v/wLY9QFv9KHA8cCCCU/0z3aAALgH +I4YA3VAhDACnvFAkDJIvKkEAB/JuCO//TiLABxfwKHSEJAaQFvIJhoHgB/RWCO//TiLAB6mmA4aG +IAYAA6YKhoDgBfJAeADYCqaRAW/0AdjPdYAAqAcAhYDgjPRRIQCAdPQIjs9xgAAYlwHa8CEBAAK4 +JnpUeM9xgADYlxBhCrgMpsdwAAAAGOoNr/pKIEAgCHfPcIAA7J25EAEGz3CAAAhuNHgRiIDg8g/g +AMIgAiSA58wgIqDMICKAP/LPcIAAMJa0EAEHz3CAAKgGAJAQcc9ygACIChr0z3eAADSSBYcoglMg +BABTIQMAkHMO9GOPgePEIIEPAAYAAMQhgQ8ABgAAzCBBgATyANkD8AHZCYIvps9zgACkB1EgQIEA +2AvygOEJ9DiKg+EF9ALZIKMApY3xA9n88YDnifPPcYAAKA8XgQHgF6GD8ZYOr/8B2M9wgADsnQmA +Jbh2CCABwLi6CS/zEdhmDi/8BNjKDo//b/EKIcAP63IF2IojBgNKJIAAMQXv8rhz4HjxwPIPD/TP +doAAuAcDhs91gACoBwh0hCSGkCCFDfKA4YgLgvYA2EQeAhAB2s9xgACkB0ChVvCA4Sv0DcgC2QQg +gA////8DDRoYMM9wgACkByCgAdgApUQWgBCA4ADdCvTPcKAALCAQgMdwBwAgoRCmcIYKJYAPAQAU +oQHYBtkE2oIL4ABKJAAARB5CExTwgeEU9APYVgyv+gu4gOAB3wz0Cguv9kQewhPPcIAApAfgoADY +AKUB2BbwguEW9IK4A6bPcoAA6C0GggDZRB5CECClAeAGogHaz3CAAKQHQKAocHkHD/QKIcAP63IF +2IojRwdKJIAANQTv8rhz4HjxwPIOD/TPdoAAuAcDhs93gACoB4YgeY8H9APY0guv+gu4gOAJ9AbZ +z3CAAKQHIKAA2ACnm/AAh4Dgm/Qojs9wgADUl891gAA0kgQVBBE1eEOQYpCA4gOFSiBAIBzycHJM +9wohwA/rcgXYiiPIAwokAAS9A+/yuHOA4A7yEHLKIcYPyiLGB8ojhg8AABECyiBmAW/3kHNN9woh +wA/rcgXYiiNIBUokQACFA+/yuHOA4AzyEHPKIcYPyiLGB8ojhg8AABcCBdhw9w+GgOAN9AuGgOAL +9M9woACwH2QYAAQegCweABQNpkWFz3CAAIgKz3OAAJiX9CNBAEigZoU0sGmgZZVtsFMiAAC+Da/z +ANsIjs9xgAAYlhZ58ggv9AqFng4v9QHYjg+P/yiOz3CAABiX8CBAAFEgAIAI8s9woACwH2QYAAQe +gASmz3CAAKQHBNkgoADYAKcPhoDgCPQA2EoN4AAIccoMT/0B2O0FD/QKIcAP63IF2IojyQVKJIAA +sQLv8rhz8cByDQ/0z3WAALgHCI3Pd4AAGJfwJwIQz3aAAKgH4Loa8gHZArhGeTR4z3GAANiXEGEK +uAyl/gqv+iSFgOAM8uoIj/YF2c9wgACkByCgIKYA2HrwA4WGIHmPCPQA2A4Kr/qMuIDgCvQG2c9w +gACkByCgANgApmjwz3CAADSSA4CyCq/6LYWA4BPyD4WA4BH0z3CAAKQHBtkgoM9ygADoLQCCANkg +pgHgAKIocEzwAIaA4CH0ngyP/wiN8CcAEM9ygACkB+C4ANkI8oC4BaUmpQbYAKYA2Djwz3egALAf +AdgZp36HZKV+h26lBdtgoiCmKvCG4CX0JYXPcoAApAfguQHfDPIGhVINj//PcIAA0C0OD2/24KYX +8IDhCPIvKUEATiGABwal8fEF2ACiANgAps9woACwH/mgHoAOpQPwgeAE9AHYlQQP9ILgDPQDhc9x +gADoLYS4A6UHgQHgB6GG8QohwA/rcgXYiiPLB0okgAA5Ae/yuHPgePHA9gsP9BYLwACA4MohwQ/K +IsEHyiBhAcojgQ8AAPYCyiQhAAwB4fLKJQEBz3WAALgHA4WGIHmPDfIG2c9wgACkByCgAN3PcIAA +qAcZAiAAoKAA2J4Ir/qMuIDg7/PPd4AANJIDh1YJr/othYDgK/IPhYDgJ/Qshc9wAAABFAghAACZ +IAoANgmv+iSFgODPdoAA6C0T8noNj/9MhgiNANkB4kymAeBDjw94UHAhHUIQigfr/witKHWP8ACG +AeAApr3xTg+P/4Dgz3aAAKgHI/Iojc9wgADUlwHbNXgCkAq4DKXPcKAAsB95oB6AANpGpQSlz3CA +ABiX8CBAAATZgLgFpc9wgACkByCgBtgApgDdqvAAhoDga/QMhaIIr/okhYDgCvIF2c9wgACkByCg +IKYA3ZrwKI3PcIAAGJcacPAgQAAB2QZ5A5eA4ErygOFI9AKXCrhmCK/6LoWA4IPyz3KAAABkF4I2 +ggJ5AoJDgkJ4OGAjlxBxaAAFAM9xgADoLQGBAeCKDK//AaEojQHaAeEvefAgQCAGehJpVHjPcoAA +2JcQYgDaIR2CEEOPCrhQcSitcAAqAAylx3AAAAAYNg9P+s9xgACkB4DgA9jKIKEBAKEA3UjwCg6P +/0bwBdnPcIAApAcgoCCmPfCF4D/0DIXKD2/6JIWA4DXyFgyP/89xgACkBwXaANhAoSEdAhAA2QiN +IKYB4COPD3gwcAithPYA3dvxz3GAABiX8CEBAAHaArgmelR4z3GAANiXEGEKuAylx3AAAAAYqg5P ++oDgA9nKIaEBz3CAAKQHIKAA3aCmAvAB3fUBL/SpcAohwA/rcgXYiiPPAEokgAC5Bq/yuHPxwHoJ +D/TPdYAAqAcAhYDgJ/QA2c9woAC0DzygFg1P9s9xgADcWkCBUyIAAL4Ib/02ic9wgADsnQmAJbjA +uO4I4AAA2c9xoACwHwHYGaFegc9xgAC4B0ShBNkgpVbwhOBW9FIIb/0B3joO7/IC2NIIj/NOCC/+ +yXDPcIAA9FpODc/zvgkv9clwA8hRIICABfLGDU/2DPAA2p66ANnPcKAA/ERBoM9woAC0DzygANgA +pc9xgACICgmBz3eAAKQHUSBAgQ7yz3CAALgHD4CA4Aj0GImD4AT0B9gApxfwbg8P/c9wgAA0kgSA +gOAJ8s9wgAC4BwOAhiA5jwPywKcD8AjYAKcA2AClANjZAA/0CiHAD+tyBdiKI1AKSiSAAJUFr/K4 +c+B48cBaCA/0z3aAAKgHAIaA4DT0z3CAALgHQ4DPcYAApAdIdIQkhpAd9A+AgOAW9AHdoKbPcKAA +LCBwgAolgA8BABShANgG2QTax3MHACChGgygAJhwqXAc8FEiAIAG8gHYAKEA2ACmFPDPcIAANJIE +gIDg+fMI2PbxgeAU9M9wgAC4BwOAhiB5jwT0Adg5AA/0fgtP9gHYz3GAAKQHAKHj8YLgD/TPcYAA +uAcDgYW4A6HPcYAA6C0IgQHgCKHs8QohwA/rcgXYiiORDEokgADBBK/yuHPxwOHFz3WAAKgHAIWA +4CX0/tnPcIAAuAchoM9wgAA0kg4P7/oEgAhxz3CAABwu6g9P+s9xgADoLQqBAeAKoeII7/IR2I4N +7/sE2AoOD/0D2AClAdgU8IPgFPTPcYAA6C0LgQHgC6HPcIAApAcB2SCgANjPcYAAuAcApQuhfQfP +8wohwA/rcgXYiiPSCEokgAApBK/yuHPgePHAmgrP8gDY0cDgfvHA4g7v84og/w/PdaAAOC7HhQel +P9gCCW/0FtmyCU/0x6UtB8/z4HjxwE4LL/QB2APIhOAgCoHyz3EAAMAI/g+v8gbYDcgFIIAPAQAA +/A0aGDADyFEggIAE8mILT/YN8ADanroA2c9woAD8REGgz3CgALQPPKDj/8oJT/u+Cy/9Adj6D6/y +AdjRwOB+8cBWDs/z63DPdYAAAAgAhVEgQIAV9AOFUiCAAAOlCfDPcKAAqCANgOTg2gAFAC4Pr/NU +2EQgAQEDhTBw8vUDyITgIvTPcYAA3FoBgaW4AaHPcYAA7J3DEQAGpbjDGRgACYGluAmhJbjAuM9x +gAAIg4oOb/8KoTIOT/MCC+/yAtiWDU/zANnPcKAA/ESeuSGgz3CgALQPAN7coA3IBCCAD/7//wMN +GhgwDciHuA0aGDB/2Aq4z3GgANAbE6F/2BChANiVuBChz3EAADwL4g6v8gbYz3CfALj/3aDPcaAA +8DYEgUYgwAEEoZTYjgmv8xjZAIVRIECAfAhi+8ogggPFBc/zCiHAD+tyBdj520okAAB5Aq/yCiUA +AfHA4cXPdYAAAAhChSGFUHGhwSTyA8iE4EDBBfRPIQABQMCA4Qz0gOIK8s9wgADIBSCAz3CfALj/ +PaCT/4twBNn6CK/zodohhYDhB/IChYDgA/Sm/yGFIqWA4SbyANnPcKAA/ESeuSGgz3CgALQPANpc +oA3IBCCAD/7//wMNGhgwDciHuA0aGDB/2Aq4z3GgANAbE6F/2BChANiVuBChJg6v8gHYDQXv86HA +4HjxwOHFABYAQM91gAAACIYKr/MApQCFgOAH8oHgD/KC4BwOwf8L8HINr/NU2FEgQIAF8gGFgbgB +pcf/zQTP8+B4z3KAAAAIIYIleOB/AaLgeM9ygAAACCGCBnngfyGi4HjxwM9zoACsLxmD8LgZgwzy +BCCADwgAAADXcAgAAAAB2MB4B/CGIH8PguAB2MB4gOAX8hmDBCCADw4AAABCIACAyiBiAIHgDfIK +IcAP63JkEwQABdhn2xEBr/JKJQAA2gyv81TYRCADAs9ygAAACFEgQIABgs8gYgDQIGEA4rgBog/y +JIIwcw3yZKKiuAGimv8B2c9wgACVBqYP7/wgqD0Fz//gePHAK//W/5P/LQXP/wDZnLnPcKAArC89 +oOB+4HjxwOHFANicuM9xoACsLxyhGoFRIICCGoEN8qq4GqEagVEgAIDw8891gAAACAGFoLgM8Iq4 +GqEagVEgAIDk9c91gAAACAGFgLgBpQDZm7nPcKAA0BsxoLv/d/8BhUIgAICFA+/zyiBiAPHACgvP +889xAIIBAM9woACsLzygz3CAAAAIAYCA4AT03v8W8AH/Ag4v+z/YgOAQ9CDez3WgAMgf0KUK2EMd +GBAA2HIIr/ONuNGl+P4pA8/z8cC6Cs/zABYAQM9wgABcCACAz3WAAICYg+AAFgBAVSVOFBX0z3WA +AEwuAKUEbcoIr/MP2VUlQBRiCq/zIpUB2c9wgADInSSoJvAApQRtqgiv8w/ZyXBGCq/zIpUelc9y +gAAgCNlg2GABEIUATCUAgCCiEvQChfC4yiHBD8oiwQfKIGEByiOBDwAA4QBgB2HyyiRhAJECz/MI +cs9wgAA0LiWAI4Fggc9xoACwHzuB1bl5YRDhlQJv+kJ54HjxwNH/+g9P889wgACIChiIgeAq9M9x +gACAmM9ygABMMACCYIFgoACCHNtgqARpAaICgY24AqHPcIAAFAgDoVUhQAQDohjYAqJVIcAFBaIB +gUIPYAAEooDgBvQA2OD/Kg9gAAbY0cDgfvHA4cXPdaAAyB8Vhc9xnwC4/9W4FqFeCgAAFRUAlpC4 +Hh0YkPoOYAAA2OEBz/PgePHA4cUB2M9xoADIHxOhGIGswUnAGYHPdYAA9HxKwAiF4LgK8lEgwIEG +9DoLj/q+Cq/yFNiLcalwYgiv8yTaz3CAACAIIIACiYDgE/QEiVEgAIAP8g3IBCCAD/7//wMNGhgw +DciGuIy4j7iQuArwDcgFIIAPAQAA/A0aGDANyKy4DRoYMD4LT/KLcDDZ1gxv85Daz3CfALj/Atk2 +oCjAgeDKIcIPyiLCB8ogYgHKI4IPAAAqAcokIgDgBWLyyiUiADoOQACA4Af0ANif/yIOYAAG2AkB +7/OswPHAigjv8zDaz3GfALj/VqEZGhgwz3KgANQHGhoYgB8SAIYA3wHeARoYMAQShTBMJQCHyiHC +D8oiwgfKIGIByiOCDwAAlgF8BWLyyiSCAxkSDYYD2CAaGIAUGpiDDxIDhgAWAEAAFgBAABYBQQAW +AEEAFgBADxrYgPS4QOEweQTyAuEweQNpBCCADwAA/P8QdY4ADQAPEgCGQOAeGhiAHRIBhh4aGICt +uR0aWIByDkAAgOAs8s91oAA4LgeFz3EAAPgIqLgHpSIJr/IN2AeFhbgHpc9wgABEmwCAhiD+gQ3I +CvIFIIAPAAAA1A0aGDANyJC4BvAFIIAPAQAA/A0aGDAaDmAAAtgN8A3IBSCADwEAAPwNGhgwDcis +uA0aGDDPcIAADAXgoADZkbnPcKAA0BsxoM9wgADoAhB4z3GgALRHSRkYgM9ygADcd89wgAAQBUCg +byBDAFQZGID2Cm/1CBqYM5EHr/MA2M9wgABMMMkBD/bgePHAoghAAc9wgACIChiIhOAF9O4JAADR +wOB+geAH8s9wgADgoAyIh+AE9PYMz//18fPx4HjxwM9wgABkMCAQBQBMJcCAyiHGD8oixgfKIGYB +yiOGDwAASAD0A2byyiSmAM9wgABsTvAgQAFAeNHA4H7PcoAAZDAogjBwRPeA4AP0CKLgfs9wgABk +MOB/CIDgePHAIgiv8gfYANj2/+jx4HjxwPn/ANmC4MwgYoDKIEIAAvQB2A943PHPcaAA0BsTgfC4 +BfIA2JC4E6EFAg/24HjxwAHYz3GAAGQwA6HPcKAALCADgAShAoGB4NAPwf/A8cEHb/IH2OB48cAi +Do/z4v+B4AzyCiHAD+tyBdiT24okww89A2/yuHPPdYAAZDAjhYHhAoUP9IHgANkF8hSNgOAF8kYL +IAAmpQzwI6UB2AalCPCA4Ab0Ad6uDu//xqXCpc9wgADoggWQgOCQCgkAKQaP8+B48cCyDY/zz3WA +AGQwSYWA4i/yB4WB4C/0Fo0A2WqFy4UPIQEAJHpCIgKAJHvKImIAgOMB2yR+wHuA5gHe7IXAfuR5 +gOEB2cB5gOLMIyKAzCYikMwhIoAH8hWtANlaCyAAJ6UWjQHgD3iQ4BatA/QA2BatqQWP8+B48cDP +cYAAZDDPcIAAeE5mDG/zONqyCmAAANjRwOB+4HjxwBoNj/MAFgBAz3CAANxaAYBRIECBDPQKIcAP +63IF2IXbiiTDDy0Cb/K4cwAWAEDPdoAAgJgApuRu6XAeC2/zD9lVJk0UqXC2DG/zIpbSCk/zCBYF +EFElAITKIcEPyiLBB8ogYQHKI4EPAACNAOQBYfLKJGEAz3GAAEwwAIFAhkCgAIEc2kCoAobhoaOh +jbgCps9wgAAsCAOmGNgCoVUmwBUFoQGGDgpgAAShgOAQ9M9wgADoggWQgODF9roMAAAD8E4MAADi +CWAADdi1BI/z8cBODI/zABaFQAAWgEAAFoBAABaAQEwlAITKIckPyiLJB8ogaQHKI4kPAABMAFQB +afLKJGkAANhMJQCAz3aAAGQwCabT9whxABaDQFJrVHrPdYAAKF1CZVEiQIIL9AHhsHEPIMAACaaw +9+YJT/NNBI/zCiHAD+tyBdha20okAAABAW/yCiUAAc9xgABkMAqBgOAF9A2BgOAD8gDYBfAGgYHg +/fMB2OB/D3jgePHA4cUKDe//CHXPcYAA6IIlkYDhVgAMAIDgKfLPcIAAvHNIiADYz3OAAGQwLIMP +IIAACyEAgBv0jCICgBfyhiX8EIwlApAI8owlApQP9C2DBXktoyuDJXgyajR5C6PHcYAAKF0Agai4 +AKGtA4/z4HjxwC4Lr/MA2EokwHPgeKgggAcyaDR5x3GAAChd4IHPdYAAZDAA3g8mDhBBLwMSUSMA +gGyFBPTGe2ylB/ALI4CDA/Sov+ChAeBNA4/z4cVKJMBzANuoIEAGAN3PcYAAZDAMgQ8lzRALIECD +DvQLgQsgQIMK9DJrNHnHcYAAKF0AgYi4AKEB4+B/wcXgePHAogqP8892gAD0fAiG4LiswQryUSDA +gQb0igxP+g4Mb/IU2ItxyXCyCW/zJNoB2M9xoADIHxOhGIEA3UnAGYHPd4AAZDBKwAaHMNlLwItw +Ug4v85DaobaopqGmvK6jp54L7/8C2M9wgADoggWQgODE9qqnracF8FILIACpcGaHAdnPcoAANAgA +goHjwHmA4zhgAKIB2CGCwHg4YAGibQKv86zA8cD6Ca/zGNkacM91gACcMAGFosEgsM9zgACICjeD +EBgCBADaMxiCACGgz3GgACwgUagwgcdxBwAgoSqgBtkxGEIAMhhCADaDUrBbsFqwI6AM4PoN7/UK +cQOFkNmBwiCwi3GSC2/3CnCB4Mohwg/KIsIHyiBiAcojgg8AAGgAyiRiALQGIvLKJQIEAMBRIACA +BfIhhQGBo7gBoSOFi3AE4ZYIb/MG2gGFz3GAADwIIqD6C+/1qXDPcIAAZDAVGAIEnQGv86LA4Hjh +xeHGAdjPcoAAZDAHojWKANsMgg8jQwALIMCAHPQKgmV4CqLPcIAA9HzIgKuCEmkUeOC+x3CAAChd +IIAI8lEmwJEG9KV7a6KouQXwZn2rooi5IKDBxuB/wcXgePHA2giP889wgABkMMCAAN+Wv/5mOgiv ++slwCHHPcIAAtDBOCS/6/mbPdYAA6IIFlSWFCrjZYRoIr/oOIEAAmHDPcIAAzDAqCS/6iHECCK/6 +yXCYcM9wgADkMBYJL/qIcc9wgABkMMCgBYX+Zh5mBZUKuN4Pb/oOIIADCHHPcIAA/DDuCA/6vQCP +8+B48cBOCI/zz3aAAGQwoIYA35a//WWuD2/6qXAIcc9wgACkMcIIL/r9ZZoPb/qpcAhxz3CAALwx +rggP+n0Ar/OgpvHADgiP889woACwH7uAAN6WvgQljR/A/wAA3WUU5QAljx+AAAAAXg9v+qlwCHHP +cIAA1DFuCA/6Sg9v+thlCHHPcIAA7DFeCA/6Og9v+ulwCHHPcIAABDJKCA/6z3CAAGQwFQCv8+Cg +8cCiD0/zz3CgALAf+4AA3Za9BCePH8D/AAC/ZxDnACeQH4AAAAD2Dm/66XAIcc9wgAAUMQYIL/q/ +Z892gADoggWWJYYKuPlh0g5v+g4gQAAIcc9wgAAsMeIPz/m+Dm/66XAIcc9wgABEMdIP7/m/ZwWG +H2cFlgq4og5v+g4gwAMIcc9wgABcMbIP7/kCdY4Ob/oKcAhxz3CAAHQxng/P+c9xgABkMAAZAAQF +liWGCri5YWoOb/oOIEAACHHPcIAAjDF6D8/5QQdP8+B48cDaDk/zgOCiwQXyBYADgACAz3aAAGQw +AYaB4Ar0AN2hplYIb/IH2A4I7/+pcFbwGgjP/4HgAdjAeC8nB5AL8j4Iz/8B2PYL7/8GpuoPr/8C +2PoPj/+C4AzyCiHAD+tyBdiKIwYNiiTDD6kDL/K4cw3IBSCADwEAAPwNGhgwvggv8gDdsg+v/6lw +7g8v8gfYz3CAAOiCBZCA4EAADAAKhkHAC4Z2Cu//QMCA4AjygOfKIIEPAABAAHAMQfuLcAjZGgov +85TagOcH9DILz/+yD4//AdgHpqumaQZv86LA4HjxwD4Nr/zhxYDgz3WAAGQwD/QB2AGlz3CAAOiC +BZCA4MT2rgrP/z3wANi+/znwDcgEIIAP/v//Aw0aGDANyIe4DRoYMA3IkLgNGhgwDggP8jIMj/Uu +Dy/yB9gkhc9woAAsIAOAx3EAAAAUInjXcACAAAAA2kL3Q6XyDq//QqWA4NQOof/KIGEAz3CAAOiC +BZCA4MogiQ8AAEAAMAtJ+9UFT/PgePHA4cUIdc9wgADoggWQgODD9hv/AvA9/6lw0f+xBU/z8cAe +DU/zOnAKIECQGnMKJQAhCiRAIQojgCEeAC8A6HMKIcAP63IF2ErbSiRAAEECL/IKJQACz3WAABwy +AIUc2SCgAYUY2SCwanGEKQsKACGSf4AA7J1cEgEgAN5qoM93gABECCGgCiHAhEAnAxPKIWIAMKgz +GIID0ahioDEYAgIyGAIC27BasFoJb/MM4CGFDNgSqQOBUSBAgg70DInPcoAAJEHDuBx4CGLPcoAA +jJ4IYgypTCMAoAX0z3CAAHx8BPDPcIAAnHwDpc9yAABIEUCwTCFAoBjaQqUF8ooiBQJAsArCgOIF +9M9yAQD4w0SntBICJlEiAIAQ8hraQLFCpUCQTCAAoIe6QLAI8s9wgAC0HASAMxkCAEwlAKAP8gGB +mLgBoQOBn7gDoQASASAEEgAgAB8EFSGnAqeqDq/1qXAtBE/z8cDmC0/zocEIdlpxOnIac4h3Cgsv ++6h1gODMJiKQCvLPcIAACIOvoFINL/ID2A3wQMXJcEpxKnIA25hzuHPYdwonAASe//0Db/OhwPHA +qgtP8891gAAIgy+FAN6A4cohwQ/KIsEHyiBhAcojgQ8AAKYAyiSBA7QAIfLKJcEAAdrPcIAA9Hxg +eUigz6UCDS/yA9jRA0/z4HjxwFoLb/PocwolQIAaAC8AyHEKIcAP63IF2IojhAF1AC/ySiRAAM91 +gAAcMuGFEN7At8KlpN+B4MOF4LYE9KTYjLgAts9wgACICg+QjriPuAG2AIUc3oQpCwrAoM9wgABI +njAgTg4BhZm+waCA4cohYgAwqADeMxiCA9GoaqAxGEIBMhhCAduwWrB+Dy/zDOABhQjZMqgEwYDh +BvLPcIAARAgkoGINr/WpcBkDT/PgeM9wgAD0fCiAz3CfALj/ANo2oAjZ7HAgoAPZz3CgABQEJaAB +yOxxAKHPcKAA1AtNoOB+4HjPcYAAWAjgfwCh4HjPcIAAWAjgfwCA4HjVB8/y0QfP8uB+4HjgfuB4 +4H7geOB+4HjgfuB44H7geOB+4HjgfwDY4H8A2OB+4HihweB/ocDgeOB+4HjxwOHFAcjPdYAAZDIA +pQRtUggv8wLZz3GADgQA7HAgoO4O7/IAhXUCT/PgeOB+4HjgfuB48cAAFgBBz3KAAGQyBrIAFgVB +QCIBBA4aRAFMJYCEyiHCD8oiwgfKIGIByiOCDwAARAD0BuLxyiQiAADaB/AAFgBBFCGMAAC0AeIv +IEIBEHK39qIPz/LRwOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjPcIAA +XAjgfwCA4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4Hjg +fuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+ +4HjgfuB44H7geOB+4HjgfuB44H7geOB/AdjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB48cDhxc91gACkMqlw0g7v8gPZABWFEEQl +QAGF4MohwQ/KIsEHyiBhAcojgQ8AAE8ApAXh8cokYQABjYPgw/ZjuAGtYg7P8tEAT/PgePHAUghP +889ygACkMmCKUSMAgDfyz3OAAGQIoIuA5cwhIYAv8oHgB/TPcIAAnIihgALwAN2O5QT3gOUD9ADd +z3eAAJyIGI+A4AP0gOUD9ADeA/CihwTez3CAAIgKGIiD4MwgIoHMIOKBzCAiggn0CpIQdQn0C5IQ +dswhIYAD9ADYD/AB2M9xoADIHw2hqrLLskGLBL7FfRC6pXp/GZiAHQBP8+B48cCuDy/zCHEA39X/ +gOAs8iDdz3agAMgfsKYy2EMeGBAA2DoN7/KNuLGmsKYe2EMeGBAA2CYN7/KNuLGmfxYAls9ygABk +CDC4IYrEuDBwAdnCIUoAgOAgqsb27aaB4QT0BNgBqrEHD/PPcIAApDIAiFEggIAH8s9xoADAHQCB +gLgAoeB+z3CAAKQyAIhRIICAB/LPcaAAwB0AgaC4AKHgfvHA4cWhwc9wgAC8CACQz3WAACSkqXGK +IgQKLg0v8wHbgOAP9AohwA/rcgXYz3MAAJ0LSiQAABEE7/EKJQABAI2E4Mohyw/KIssHyiBrAcoj +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAA +AAAAwACQANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAACAAAAHz7AAB4+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGIeAANBLAQAAAAAAAAAA +AAAAAAAAAAAAAAAAADyHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8BAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgAA +AAYACAAJAAAABwAAAAAAAAAAAAAAAAAAAAIAAAACAAAAgwAAAJIAAADoAAAA9wAAAE4BAABdAQAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAXJiAAMShAQAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAPR8gABAtQEAAAAAAAAAAAAAAAAAAAAAAPR8gAAAvAEAAAAAAAAAAAD0fIAA +bL0BAAAAAAAAAAAAAAAAAPR8gAAAAAAAAAAAAAAAAAD/AAAAAAcAAAAAAAAAAAAAAAAAAAB/fwAB +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgQIAAgQIAEAAAAAAAAAAAAAAAEA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAcAABUAAAAUG4AAUAoAAFAKAABQCgAAUAoA +AFAKAABQCgAAUAoAAFAKAABQCgAAUAoAAFAKAABQCgAAUAoAAFAKAABQCgAAUAoAAFAKAABQCgAA +UAoAAFAKAABQCgAAUAoAAFAKAABQCgAAUAoAAFAKAABQCgAAUAoAAFAKAABQCgAAUAoAAHQLAAAA +AAAA1BUBAFAKAACYCAAAUAoAAFAKAABQCgAAwAgAAMz9AACITgAAUAoAAFAKAAD4CAAA+AgAAPgI +AAD4CAAA+AgAAPgIAAD4CAAAUAoAAFAKAABQCgAAUAoAABwKAABQCgAAUAoAAFAKAABQCgAAUAoA +AHgLAABQCgAAUAoAAHwIAAADAAAA/MIBAAIAAADIIAEABAAAALQwAAAGAAAArMQBABEAAABYnAEA +BwAAAMC3AQAIAAAALMUBAAwAAAAkNwEADQAAADw7AQAOAAAAdDsBABYAAAA8FQEACwAAADBPAQAU +AAAApE8AAA8AAAAkXgAAEAAAAAQNAQABAAAAnLMBABIAAAAQYwEAEwAAAGxUAQAFAAAAxGAAABUA +AAA02AEAFwAAAHQLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAGCQAABgkAAAYJAAAJDIAABgkAAAYJAAAGDIAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgk +AAAYJAAAGCQAABAaAAC4GwAAyBsAAEAdAADIHQAARB0AABgkAAAYJAAAqDoAAAQ+AADYPgAAGCQA +ABgkAAAYJAAAbDkAAHiqAAB0qgAAsKoAABgkAAAYJAAAGCQAACgyAAAYJAAAGCQAABgkAAAYJAAA +GCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAY +JAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgk +AAAYJAAAGDMAABgkAAAYJAAAGCQAABgkAAAYJAAA/DMAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQA +ABgkAAAYJAAAGCQAABgkAAAYJAAA1DAAABgkAAD0MAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAA +GCQAABgkAAC8YQAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAD8 +TQEAhFEBABgkAAC4NwEAGCQAACQ5AQCwKQEAGCQAABgkAABUPwAAGCQAABgkAAAYJAAAGCQAABgk +AAD8ogEA2J0BABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAABExAEASMQBABgkAAAYJAAAGCQA +ABgkAAAYJAAAGCQAAIy3AQAYJAAAWLoBABgkAACE2QEAGCQAAOwgAADwIAAAGCQAABgkAAAExgEA +qE8AABgkAAAYJAAAGCQAABSyAQAYJAAAGCQAAOQNAQBYVAEAGCQAABgkAAAYJAAA3FsBACwlAQAY +JAAAGCQAABgkAAAYJAAAGCQAABgkAAB4bgEAGCQAABDFAQAUxQEAIMUBACTFAQAYxQEAHMUBACjF +AQAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAsQQAAGCQAABgkAAAYJAAAGCQA +ABgkAACAxAEAtMQBADA2AAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAA +GCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAY +JAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAAGCQAABgkAAAYJAAA1DYAAFQ3 +AADcNwAAeDgAAMRcAABQOAAAGCQAABgkAAAYJAAAGCQAABgkAADMNgAA0DYAABgkAAAYJAAAhD8A +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAIAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOED +Dh7h4QMOHuHBAgoe4YEFDB7hAAAAAAAAAAAAAOEDDh7h4QMOHuHBAgYe4YEFDB7hwQIGHuGBBQwe +4cECBh7hgQUMHuHBAgYe4YEFDB7hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBDQ0NDQ0NDQ0NDQ0NDQ0NDQMDAwMDAwMDAwMD +AwMDAwMAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQ0NDQ0NDQ0NDQ0NDQ0NDQ0DAwMD +AwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQENDQ0NDQ0NDQ0NDQ0N +DQ0NAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAACRAgAAMcovAJECAAAxyi8AkQIAADHK +LwCRAgAAMcovAJECAAAxyi8AkQIAADHKLwCRAgAAMcovAJECAAAxyi8AQwEAADHKLwBDAQAAMcov +AEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEANAADeAwkA +AAAAAAAAAAAAAAAAgPQAAAEAAADUGoAAAAAAAAAAAAAAAAAAEPUAABUAAAAUG4AAgICAgICAgIAB +gAKAgICAgAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANQagADUGoAApCCgADggoAABAAAA/P///wAAAAAAAAAA +9BqAAPQagACoIKAAPCCgAAgAAADz////AAAAAAAAAAAUG4AAFBuAAKwgoABsIKAAMAAAAM////8A +AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAA+A0BAAUA +AAAUG4AAJBMBAAD/AwBEEwEAAP8FADAUAQAA/y0AVBQBAAD/PQAMFAEAAP8EAPATAQAA/yUAUBoB +ACQbAQCMGwEAFBcBAIwWAQBMHAEArBwBAPAcAQA0HQEAAAAAACwBAABeAQAAAQAAAAEAAAABAAAA +AQAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAgAAAAMAAAADAAAAAwAAAAEAAAAAAAAAAQAAAAAAAAAA +AAAAAAAAACgiAQAKAAAA1BqAAAAAAAAAAAAAAAAAAIgiAQAKAAAA1BqAAAAAAAAAAAAAAAAAAJwi +AQAKAAAA1BqAAAAAAAAAAAAAAAAAAOgiAQAKAAAA1BqAAAAAAAAAAAAAAAAAALAjAQAKAAAA1BqA +AAAAAAAAAAAAAAAAAFQjAQAKAAAA1BqAAAAAAAAAAAAAAAAAAOwoAQAGAAAA1BqAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAgAAAAACgABAnAADoAwAA6AMAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQPgEAUD8BAPRBAQCQRAEA9EYBACxKAQDgQAEAIAWAALx8 +gAAYAAAAfHyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAREwBAAYAAADUGoAAAAAAAAAAAAAAAAAA3P8A +AAoAAADUGoAAAAAAAAAAAAAAAAAA3P8AAAoAAADUGoAAAAAAAAAAAAAAAAAA3P8AAAoAAADUGoAA +AAAAAAAAAAAAAAAA3P8AAAoAAADUGoAAAAAAAAAAAAAAAAAA3P8AAAoAAADUGoAAAAAAAAAAAAAA +AAAA3P8AAAoAAADUGoAAAAAAAAAAAAAAAAAA3P8AAAoAAADUGoAAAAAAAAAAAAAAAAAA3P8AAAoA +AADUGoAAAAAAAAAAAAAAAAAA3P8AAAoAAADUGoAAAAAAAAAAAAAAAAAA3P8AAAoAAADUGoAAAAAA +AAAAAAAAAAAA3P8AAAoAAADUGoAAAAAAAAAAAAAAAAAA3P8AAAoAAADUGoAAAAAAAAAAAAAAAAAA +nFIBAAoAAADUGoAA/////wAAAAD/////AAAAAAAAAAAAAAAA6FMBAAUAAAAUG4AAZABkAGkA3ADI +AFoAqgC+AIYBfQA+AGQAZABpANwAyABaAKoAvgCGAX0APgAAAAAAAQEAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAABAgEBAAIBAAECAgIAAQEAAgECAQIAAgABAgMAAAAA4G0BAOx6AQC4iIAAQAUAAAAA +AADgbQEADG8BAPiNgAAgAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARH8BAEh9AQAYj4AAVAAA +AAAAAADgbQEAeH0BAJiPgABQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA4G0BAPB5AQAoJYAA +UAEAAAAAAABYfwEAAHwBANAGgAACAAAAAAAAAOBtAQAsfAEA1AaAAAQAAAAAAAAAMH8BAAxvAQBs +j4AALAAAAAAAAADgbQEAmHwBAAAAAAAAAAAAAAAAAOBtAQBYfAEA2AaAAAQAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAABAAIAAgADAAQABAAFAAYABgAHACAAIAAhACIAIgAjACQAJAAl +ACYAJgBDAEQARABFAEYARgBHAEgASABJAEoASgBLAEwATABNAE4ATgBPAFAAUABRAG4AbgBvAHAA +cABxAHIAcgBzAHQAdAB1AHYAdgB3AHgAeAB4AHgAeAB4AHgAeAB4AA8APwAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABAAEAAgADAAMABAAFAAUABgAHAAcACAAJAAkACgAjACMAJAAlACUA +JgAnACcAKAApACkARgBHAEcASABJAEkAZgBnAGcAaABpAGkAagBrAGsAbABtAG0AbgBvAG8AcABx +AHEAcgBzAHMAdAB1AHUAdgB3AHcAeAB4AHgAeAB4AHgAeAB4AA4APwAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABAAIAAgADAAQABAAFAAYABgAHACAAIAAhACIAIgAjACQAJAAlACYAJgBD +AEQARABFAEYARgBHAEgASABJAEoASgBLAEwATABNAE4ATgBPAFAAUABRAG4AbgBvAHAAcABxAHIA +cgBzAHQAdAB1AHYAdgB3AHgAeAB4AHgAeAB4AHgAeAB4AA8AQwAAAAAAAAAAAAAAAAAAAAAAAAAB +AAEAAgADAAMABAAFAAUABgAHAAcACAAJAAkACgAjACMAJAAlACUAJgAnACcAKAApACkARgBHAEcA +SABJAEkAZgBnAGcAaABpAGkAagBrAGsAbABtAG0AbgBvAG8AcABxAHEAcgBzAHMAdAB1AHUAdgB3 +AHcAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AAgAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAABAAIAAgADAAQABAAFAAYABgAHACAAIAAhACIAIgAjACQAJAAlACYAJgBDAEQARABF +AEYARgBHAEgASABJAEoASgBLAEwATABNAE4ATgBPAFAAUABRAG4AbgBvAHAAcABxAHIAcgBzAHQA +dAB1AHYAdgB3AHgAeAB4AHgAeAB4AHgAeAB4AA8AQwAAAAAAAAAAAAAAAQABAAIAAwADAAQABQAF +AAYABwAHAAgACQAJAAoAIwAjACQAJQAlACYAJwAnACgAKQApAEYARwBHAEgASQBJAGYAZwBnAGgA +aQBpAGoAawBrAGwAbQBtAG4AbwBvAHAAcQBxAHIAcwBzAHQAdQB1AHYAdwB3AHgAeAB4AHgAeAB4 +AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AAQAPwBUWgEAEtIAAAAAAAD//w8ACHgBALYAAAAAAAAA +/wAAAAh4AQC3AAAAAAAAAP8AAAAIeAEAuAAAAAAAAAD/AAAACHgBALkAAAAAAAAA/wAAAAh4AQC6 +AAAAAAAAAP8AAAAIeAEAuwAAAAAAAAD/AAAACHgBAL0AAAAAAAAA/wAAAAh4AQC+AAAAAAAAAP8A +AAAIeAEAvwAAAAAAAAD/AAAACHgBAMAAAAAAAAAA/wAAAAh4AQDBAAAAAAAAAP8AAAAIeAEAwgAA +AAAAAAD/AAAAVFoBABPSAAAAAAAA//8PAAh4AQAbAQAAAAAAAP8AAAAIeAEAHAEAAAAAAAD/AAAA +CHgBAB0BAAAAAAAA/wAAAAh4AQAeAQAAAAAAAP8AAAAIeAEAHwEAAAAAAAD/AAAACHgBACABAAAA +AAAA/wAAAAh4AQAiAQAAAAAAAP8AAAAIeAEAIwEAAAAAAAD/AAAACHgBACQBAAAAAAAA/wAAAAh4 +AQAlAQAAAAAAAP8AAAAIeAEAJgEAAAAAAAD/AAAACHgBACcBAAAAAAAA/wAAAFRaAQAU0gAAAAAA +AP//DwAIeAEAggEAAAAAAAD/AAAACHgBAIMBAAAAAAAA/wAAAAh4AQCEAQAAAAAAAP8AAAAIeAEA +hQEAAAAAAAD/AAAACHgBAIYBAAAAAAAA/wAAAAh4AQCHAQAAAAAAAP8AAAAIeAEAiQEAAAAAAAD/ +AAAACHgBAIoBAAAAAAAA/wAAAAh4AQCLAQAAAAAAAP8AAAAIeAEAjAEAAAAAAAD/AAAACHgBAI0B +AAAAAAAA/wAAAAh4AQCOAQAAAAAAAP8AAABUWgEACNIAAAAAAAD//wMAdFoBAACCAAAAAAAA/wEA +AHRaAQABggAAAAAAAP8BAABUWgEACdIAAAAAAAD//wMAdFoBAAKCAAAAAAAA/wEAAHRaAQADggAA +AAAAAP8BAABUWgEACtIAAAAAAAD//wMAdFoBAASCAAAAAAAA/wEAAHRaAQAFggAAAAAAAP8BAABU +WgEABtIAAAAAAAD/AQAAVFoBAAfSAAAAAAAA/wMAAFRaAQAG0gAACQAAAAD+AwBUWgEAB9IAAAoA +AAAA/A8AVFoBAAbSAAASAAAAAAD8B1RaAQAH0gAAFAAAAAAA8D9UWgEAFdIAAAAAAAD/AwAAVFoB +AAzSAAAAAAAA/wEAAFRaAQAV0gAACgAAAAD8DwBUWgEADNIAAAkAAAAA/gMAVFoBABXSAAAUAAAA +AADwP1RaAQAM0gAAEgAAAAAA/AcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAc0g3SEdIQ0gLSAdID0hvSC9IAgAXSEtIT0hTSBEMG0gfSBNIJEHDStQAaAYEBBQAEAAYACAAJ +AAoACwAMAIMAkgDoAPcATgFdAQ8ALgAAAGwAAAB0AAAAgAAAAIwAAACdAAAABwAAAAQAAAAIAAAA +EAAAAEAAAACAAAAAIAAAAAAAAAAJAAAAEgAAAAAAAAAKAAAAFAAAACAFgAC8fIAAGAAAAHx8gAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABonwEABgAAANQagAAAAAAAAAAAAAAAAAAQtQEABgAAANQagAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAFgAC8fIAA +GAAAAHx8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAIAWAALx8gAAYAAAAfHyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqMABAAQA +AADUGoAAAAAAAAAAAAAAAAAAyL8BAAQAAADUGoAAAAAAAAAAAAAAAAAATMEBAAYAAADUGoAAAAAA +AAAAAAAAAAAAyL8BAAQAAADUGoAAAAAAAAAAAAAAAAAAqMABAAQAAADUGoAAAAAAAAAAAAAAAAAA +yL8BAAQAAADUGoAAAAAAAAAAAAAAAAAAqMABAAQAAADUGoAAAAAAAAAAAAAAAAAAyL8BAAQAAADU +GoAAAAAAAAAAAAAAAAAATMEBAAYAAADUGoAAAAAAAAAAAAAAAAAAyL8BAAQAAADUGoAAAAAAAAAA +AAAAAAAAqMABAAQAAADUGoAAAAAAAAAAAAAAAAAATMEBAAYAAADUGoAAAAAAAAAAAAAAAAAAqMAB +AAQAAADUGoAAAAAAAAAAAAAAAAAAqMABAAQAAADUGoAAAAAAAAAAAAAAAAAATMEBAAYAAADUGoAA +IAWAALx8gAAYAAAAfHyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBQAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIDBAQE +BAQFBgcICAgICAkKCwwNAAAABQYHCA0ODxAVFhcYGQAACg0RFAoNERQKDREUCgoAAAAAAAAGBgYG +CQkJCQAGAABuO2g7YjtcO246aDpiOlw6bjloOWI5XDluOGg4YjhcOG43aDdiN1w3biloKWIpXClu +KGgoYihcKG4naCdiJ1wnbhloGWIZXBluGGgYYhhcGG4XaBdiF1wXbgloCWIJXAluCGgIYghcCG4H +aAdiB1wHbgZoBmIGXAZuBWgFYgVcBW4EaARiBFwEbgNoA2IDXANuAmgCYgJcAm4BaAFiAVwBbgBo +AGIAXABuO2g7YjtcO246aDpiOlw6bjloOWI5XDluOGg4YjhcOG43aDdiN1w3biloKWIpXCluKGgo +YihcKG4naCdiJ1wnbhloGWIZXBluGGgYYhhcGG4XaBdiF1wXbgloCWIJXAluCGgIYghcCG4HaAdi +B1wHbgZoBmIGXAZuBWgFYgVcBW4EaARiBFwEbgNoA2IDXANuAmgCYgJcAm4BaAFiAVwBbgBoAGIA +XABuO2g7YjtcO246aDpiOlw6bjloOWI5XDluOGg4YjhcOG43aDdiN1w3bjZoNmI2XDZuNWg1YjVc +NW40aDRiNFw0bjNoM2IzXDNuMmgyYjJcMm4xaDFiMVwxbjBoMG4iaCJiIlwibiFoIWIhbhNoE2IT +XBNuEmgSYhJcEm4RaBFiEVwRbgNoA2IDXANuAmgCYgJcAm4BaAFiAVwBbgBoAGIAXABcAFwAXAAA +G0EAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABA +AEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA +QABAAEAAQABAAEAAQABAAEAAQABAAEAAQAFBAEABQAFBAEABQAFAAUEBQQFBAUEBQQFBAUEBQQFB +AUEBQQFBAUEBQQFBAUEBQQFBAUEBQQFBAUIBQQBCAEIAQgBCAEIAQgBCAEIAQgBCAEIAQgBCAEIA +QwBDAEIAQgBCAEIAQwBDAEMAQwBDAEMARABDAEQAQwBEAEQARABEAUQBRAFEAUQBRQFEAUUBRQFE +AUUBRQFEAUUBRQFFAUUBRQFFAUUBRQFFAUUBRgFGAUYBRgFHAUYBRwFHAkcBRwJHAkcCSAJHAkgC +SAJIAkgCSAJIAkgCSAJJAkgCSQJJAkkCSQJJAkkCSgJKAkoCSgJKAkoCSwJKAksCSwJLAksCTAJM +AkwCTAJNAk0CTQJNAk4CTgJOAk4CTwJOAk8CTwJPAk8CUAJQAlACUANRAlECUgNRA1ICUgNSA1IC +UwJTAlQCUwJVAlQCVQJVAlYCVgJWAlYCVwJXAlgCVwFZAlgBWgFZAVoBWgFbAVsAWwBbAFwAXABd +AFz/XQBd/17/Xv9e/17/X/9f/2D/YP5g/2D+Yf5h/mL+Yf1j/mP9ZP1k/Gb9Zfto+2f6afpo+Wr5 +avhr+Wr4a/hr92z4bPZt9231bfZt9W31bfVt9W31bPVt9Wv1bPVr9Wv1avVq9Wn1avVp9Wn1aPVo +9Wf1aPVn9Wf1ZvVm9WX1ZvZl9mX2ZPZk9mT2ZPZj9mP2YvZj9mL2YvZh9mH2YfZh9mD2YPZf9mD2 +X/Zf9l72X/Ze9l72XfZe9l32XfZc9l33XPZc91v3W/db91v3Wvda91r3WvdZ91n3WfdZ91j3WPdY +91j3V/dY91f3V/dW91f3VvdW91X3VvdV91X3VfdV91T3VPdU91T3U/dT91P3U/dS91P4UvdS+FL4 +UvhR+FH4UfhR+FD4UfhQ+FD4UPhQ+E/4T/hP+E/4TvhP+E74TvhO+E74TfhO+E34TfhN+E34TPhM ++Ez4TPhM+Ez4S/hL+Ev4S/hL+Ev4SvhK+Er4SvhK+Er4SfhJ+En4SfhJ+En5SPlI+Uj5SPlI+Uj5 +R/lH+Uf5R/lH+Uf5RvlG+Ub5RvlG+Ub5RflG+UX5RflF+UX5RflF+UT5RPlE+UT5RPlE+UP5RPlD ++UP5Q/lD+UP5Q/lC+UL5QvlC+UL5QvlC+UL5QflB+UH5QflB+UH5QPlB+UD5QPlA+UD5QPlAAAAA +AAAAAAAAAAAAdNsBAAgAAAAUG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/////////wAB//8CA////wT//////////////////////wX/Bv8H/wj/Cf8K/wv/ +DP///w3///8O////D////xD//////////////////////////////////////////////xH///8S +////E////xT///8V////Fv///xf///8Y////Gf///xr///8b/////xz///8d////Hv///x////8g +////If//////////////////////IiMk/yUmJ///KP///yn///////////////////////////// +/////////////////////////////////////////////////wEEAAACBQEAAwYCAAQHAwAFCAQA +BgkFAAcKBgAICwcACQwIAAoNCQALDgoADA8LAA0QDAAOEQ0AAUEABAJCAQQDQwIEBEQDBAVFBAQG +RgUEB0cGBLcTIgC4FCMAuRUkALsWJQC8FyYAvRgnAMAZKADEGikABxsAAAgcAQALHQIADB4DABAf +BAAiIQUAJCIGACYjBwAoJAgAKiUJACwmCgAuJwsAMCgMADQpDQA4Kg4APCsPAEAsEABkLhEAaC8S +AGwwEwBwMRQAdDIVAHgzFgB8NBcAgDUYAIQ2GQCINxoAjDgbAJE6HACVOx0AmTweAJ09HwChPiAA +pT8hACRJBgIsSgoCNEsNATxMDwFkTREBbE4TAXRPFQF8UBcBhFEZAZVSHQGdUx8BAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFggWFhYMFhYWFhYWFhAAAAAADwA/AAEAAAAPAD8AAQAA +AA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAIAAAAPAD8AAQAAAAAAAAABAAAA +AgAAAAMAAAAAAAAABAAAAAIAAAAFAAAAMoABpQA8ODQwLCgkIBwYFBAMCAQADAgEADw4NDAsKCQg +HBgUEAwIBAIAFQ8bAAAAIQAAAAIAAAIAAAAAAQEAAQIBAQEBAQEBAQEBAQICAgICAgICAwMDAwMD +AwMEBAQEBAQEBAECAgICAgIDAwMDAwMDAwMDAwMDAwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAA +AAABAQIBAgIDf/8HDx8/AQMBAw8HAQcPHz9///8FAAcCAwQGBnTRRRfooosuDQ8FBwkLAQMKFDdu +VVVVAUtoLwFVVVUF4ziOA6qqqgJxHMcBqqqqCsdxHAcoACgAMAAsACwAKAA8ADQAKAAoADQAMAAs +ACwARAA8AEAAPACMAGwAWABIAPQAsAAsACwAPAA0ADAALABUAEQAVABUAGwAYABcAFQAjAB4ADoB +AgHVAN8A2gCiAHUAfwBqARoB2QDoAAoBugB5AIgAigUqAzkBqAGKBcoC2QBIAcoBSgHiAPkAygHq +AIIAmQBm5gAAndiJnU7sxE40SIM0J3ZiJxqkQRoTO7ETERiBEQ/8wA9O7MROJ3ZiJxqkQRoTO7ET +DdIgDYmd2AkIjMAIB37gBzRIgzQapEEaERiBEQ3SIA0IjMAIBmmQBrCy1QUFVEAFJ3ZiJxM7sRMN +0iANiZ3YCQZpkAbETuwEBEZgBAM/8AOqqqqqGqRBGhM7sRMP/MAPERiBEQ3SIA0KqIAKEzuxEw/8 +wA8P/MAPDdIgDQu0QAsLtEALiZ3YCQ3SIA0KqIAKCqiACgiMwAgHeIAHB3iABwZpkAYP/MAPDdIg +DQu0QAsN0iANC7RAC4md2AkIjMAIiZ3YCQiMwAgHfuAHB37gB8EsKQcKqIAKCIzACAd4gAcIjMAI +B3iABwZpkAawstUFBmmQBrCy1QUFVEAFBVRABdYdxgQNABoAJwA0AE4AaAB1AIIAGgA0AE4AaACc +ANAA6gAEAScATgB1AJwA6gA4AV8BhgE0AGgAnADQADgBoAHUAQgCDABOAGgAggB1AJwAwwBoAIIA +ggCcALYAtgDQAJwAwwDDAOoAEQERATgBggCcALYAnAC2ANAA6gDQAOoABAEEAR4BwwDqABEB6gAR +ATgBXwE4AV8BhgGGAa0BAAAwAAAANgAAAAwAAAASAAAAGAAAACQAAAAGAAAACQAAAAAAAAAAAAAA +GCAUFA4OFBQFBgECAwQAAAABAQIBAgIDBAwMCAQMBARAAAAAgAAAAAABAAAAAgAAQAAAAAAEAABA +AAAAQAAAABAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vQEFCQ0RFRkdISUpLTE1OT1BR +UlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fy0ADyAA8GEAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAKXGhPiZ7o32Df+91rHeVJFQYAMCqc59VhnnYrXmTZrsRY+dH0CJ +h/oV7+uyyY4L++xBZ7P9X+pFvyP3U5bkW5vCdRzhrj1qTFpsQX4C9U+DXGj0UTTRCPmT4nOrU2I/ +KgwIUpVlRl6dKDChNw8KtS8JDjYkmxs93ybNaU7Nf5/qGxKeHXRYLjQtNrLc7rT7W/akTXZht859 +e1I+3XFelxP1pmi5AAAswWBAH+PIee22vtRGjdlnS3LelNSY6LBKhWu7KsXlTxbtxYbXmlVmlBHP +ihDpBgSB/vCgRHi6JeNL86L+XcCAigWtP7whSHAE8d9jwXd1r2NCMCAa5Q79bb9MgRQYNSYvw+G+ +ojXMiDkuV5PyVYL8R3qsyOe6KzKV5qDAmBnRnn+jZkR+VKs7gwvKjCnH02s8KHmn4rwdFnatO9tW +ZE50HhTbkgoMbEjkuF2fbr3vQ6bEqDmkMTfTi/Iy1UOLWW632owBZLHSnOBJtNj6rAfzJc+vyo70 +6UcYENVviPBvSnJcJDjxV8dzUZcjy3yhnOghPt2W3GGGDYUPkOBCfMRxqszYkAUGAfcSHKPCX2r5 +rtBpkRdYmSc6uSc42RPrsyszIrvScKmJB6czti0iPJIVIMlJh/+qeFB6pY8D+FmACRca2mUx18aE +uNDDgrApd1oRHst7/KjWbTosAAECBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgECAwQAAAUGBwgJCgAAAAUGAAIEAAUAAAAAAAUH +AQMEAAUBAAAAQCNAJSEhISFAQEBAQAUEBAEBQEBAQAUFQEAMDEANDAwBAQEFQEAFBQAEAARAQAAE +QEBABUBAQEBABUBAQAUFBQEBAQFABQUFAQUBAUAFBQVABUAFBQUFBQQAAAAcEQAAHDIAABwzAAAE +AAAAHBUAAAIAFwBsAHAEdAh0DAAEBAYAAAAAAAAAAGQAAAAAkAEACgAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA +AQAAABAAAAAAAAAAAQAAAAEAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAGzBAQAAAAAAAAQAAGQAAAAH +BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcG +BgYGBgUFBQUFBAQEBAQDAwMDAwICAgICAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbFABAHRQAQB8UAEA1FABANxQAQDkUAEAAAolQ8dO +fJgABxUoWS8AAAAEDgkdLTcAAAQOCR0sOwABEAABAAAAAoAAAUIGAhAAAiAAAAPAAAFDBgMQAALA +AAADwAABQwYEEAACQAAAAoAAAUQGBREAAEAAAAPAAAFFBgYRAADgAAADwAABRQYHEQABAAAAAoAA +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAICCADwAAQABpIAAAaSBAAGkgAABpIEAAICCADwAA6ABpIAAAaSBAAGkg +AABpIEAAICCADwAAeAVpIAAAaSBAAGkgAABKIAAASiEAAEoiAABKIwAASiQAAEolAABKJgAASicA +AEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQSiAAIEohACBKIgAgSiMAIEokACBKJQAg +SiYAIEonACBKIAAwSiEAMAokgD+AAADAQSycMEAsnDBCJBw0CiKAP4AAaFMKIwA37g4AAEomAHBp +IEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAHQEQHggIECHAAAAAAAAAAAAAArIz3GgAMgfDhkYgAvI +DxkYgAzIEBkYgA0SAjYAyER4ERkYgA7ILRkYgOB+4cT8HMi+/BxIvuHA4cHhwuHD/BwIsfwcSLH8 +HIix/BzIsfwcCLL8HEiy/ByIsvwcyLL8HAi/aiSAEOHEaiTAEOHE8cDPcKAA0BsUgM9xgABwBAQg +gI/PUQThAKEK8i8pAQDPcIAAhAnwIEAAQHja/9HAwcRrJMAQwcRrJIAQwcSfdAQUCzQEFAo0BBQJ +NAQUCDQEFAc0BBQGNAQUBTQEFAQ0wcPBwsHBwcDBxEUsfhAKJkB+wcRrJIAUwcQgIECHCsiHuAoa +GDALyJu4CxoYMAzIDBoYMA3Ih7gNGhgwDsiFIMMPDhoYMOB+4HjxwArIlbgKGhgwC8ibuAsaGDAN +yIq4jbiQuA0aGDDPcIAApAoYiBsIUQANyM9xAABICqy4DRoYMJYNIAAP2NHA4H7geM9wgABQjwCA +hiD+gQj0DcgFIIAPAAAA1A0aGDBE8eB48cDPcQMAQA3PcKAAqCAtoM9ygACwBCCCAWkAoiIMIAFI +2M9wgADoCCWAI4EggcdxAACIE6YLgAfR8eB4z3CAAOgIOQOAB+B48cDqCkABz3aAAHAEBegPCFEA +AdgC8ADYC64G6Q0JUQAB2APwANgKrgXqDwpRAAHYAvAA2AyuANjPdaAAyB8YHRiQC46KIRAADegI +jgvoz3ADAEANRR0YEDClAtgYHRiQAvAxpQqOGegJjhfoz3ABAG65IB0YkM9wgAAoACEdGJDPcIAA +bAQiHRiQGBUAlkUgAAMYHRiQDI4H6BgVAJaFIAEEGB0YkBnrANiUuM92gACkBACmcdgGuJYO4AD8 +2SCGz3AAAEwcig7gAJ+5GBUAloW4GB0YkIECQAHgeM9xqqq7u89wnwC4/zagNqA2oDagz3GgAMg7 +DoGIuA6haSBAAP7x4HjxwKXBQcBCwQwcADEQHEAxz3GAAHxUNBnADzAZAA8sGcAOKBmADiQZQA7P +cIAAfFQgGEALz3CAAHxUHBgAC89wgAB8VBgYwArPcIAAfFQUGIAKz3CAAHxUEBjACM9wgAB8VAwY +gAjPcIAAfFQIGEAIz3GAAABUgBkACHwZwAd4GYAHdBlAB3AZAAdsGQAHaBmABmQZQAZgGQAGXBnA +BVgZgAVUGUAFUBkABUwZwARIGYAERBlABEAZAATvoc6hraGMoSwZwAIoGYACJBlAAiAZAAIcGcAB +GBmAARQZQAEQGQABY6FqIAAD2BkAAGogwALUGQAAaiCAAtAZAABqIEAByBkAAGogAAHEGQAAaiDA +AMAZAABqIIAAvBkAAGogQAC4GQAAaiAAALQZAABqIIABzBkAANDYn7jPcZ8AuP8doc9wgAAAAMSA +UyXENVMmxTXXugHm077EoFMjwAQFJo4f0P4AANahBSCAD7D+AAAWoRiBUyfONQDdlLgYoUDDAcAC +wclzDBQGMGIJYAEQFAcwz3CgALQPvKBmCkAB4gzgAKlwCNgA2aYM4ACZuRbx4HjxwAoIYAF72OII +YAHX2c9xgAB8VDQZwA8wGQAPLBnADigZgA4kGUAOz3CAAHxUIBhAC89wgAB8VBwYAAvPcIAAfFQY +GMAKz3CAAHxUFBiACs9wgAB8VBAYwAjPcIAAfFQMGIAIz3CAAHxUCBhACM9xgAAAVIAZAAh8GcAH +eBmAB3QZQAdwGQAHbBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlABVAZAAVMGcAESBmABEQZQARA +GQAE76HOoa2hjKEsGcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUABEBkAAWOhaiAAA9gZAABqIMAC +1BkAAGoggALQGQAAaiBAAcgZAABqIAABxBkAAGogwADAGQAAaiCAALwZAABqIEAAuBkAAGogAAC0 +GQAAaiCAAcwZAADrds91oADIHxkVEZbPcAAARBwyCCABCiDAL1pwz3CAAIAoI4DPc58AuP/Pd4AA +AAAEhwHg07gi6RkVApZBCt4AXYNA3p++3aMEpwUggA/Q/gAAFqNYG4AHIRUAliIVAJYEIYEP/wD8 +/wCBFqMI2BkdGJBWo12joQYAAdDZn7k9owSnBSCAD9D+AAAWo89wgACkBACACyCAhAjyWBuABDIM +wAEM2CjwjCEBoCHyQiFBIEMJFQQzJkFwgAA0SEAngHI0eAB4SiFAIA3YFPBKIYAgBNgQ8BPYSiEA +IQzwSiEAIhTYCPBKIQAkFdgE8BbYAvAP2M9zgABED3CDCnHJcgokQAQdBO//CiWABMkCz//xwOYO +AAFyCwAAWg8AAor+nggAAAohwA/rcgbYiiPKAkokAADtA+//CiUAAfHABOkZCBIICiHAD+tyBdjs +20okQADRA+//uHPPcoAAhAkVeiCi0cDgfuB4ANmeuRl5z3KAAHwJAYIleOB/AaIA2Z65GXnPcoAA +fAkBgiZ44H8BogDZnrkZec9wgAB8CQGAJHhCIACA4H/KIGIA4HjPcIAAfAkBgOB/LygBAOB48cCe +CM//4HjgeOB44HhpIIABbyE/AGkgAAD38fHAANiNuOoL4AIIGhgwEMyGIP+KCPLPcIAABQUAiIDg +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 +QSjDAQ27ZXlFeYC5z3KgAOwnJqJALMEA5XnPcqsAoP86os9xoAC0D7yhIY7PcqcANET2GlgAJZZh +lvNp9X8QvwUj0gP1GpgEZI7ljlEgQID3GtgA+BrYA89zpwAUSEEpgiFYGwABV6PPcqAAgERwgs93 +pQCs/0YjAwVwogDCBCKCDyEAAMEmulWnyiCCDwEA//8G9ADAGgvv+BThGKcgwIm4jrgZpwCOEwhe +AEAmABPyCq/zFNkD8ADdz3agAPQHpKaeDU/yz3GAAGyOAYmF6ACJEwhfAAHZkLnPcKcAmEc8oAPY +BKYDCB5Dz3GAAGyOAYmF6ACJFwhfAM9ypwCYR3AagAQIiYC4GqIAiXUIXgCpCB7D/QjewfoLj/WM +IAKDzCCCjwAA/AAM8gohwA/rcgXYiiPOBEokQABxBm/yuHOMIAKDGPTPdYAAbI6pcMIOb/MD2QCN +USAAgMohwg/KIsIHyiOCDwAAmAPKIGIB5fVb/wTwWgwP9AIOb/OA2Abw+g1v84DYVv8A2s9xoAD0 +B0ShA9gKoQmhSaFKCO/8CnA5AO/zocDgePHAz3KAAPBdJJIA2ILhzCFigMogYQAvJgfwz3GAAGyO +AIkP8kCSEQqRAYYgPg6FIAEBBvCGID8FRSAACgCpCwgeAFX/AvA8/xsBz//xwM9wgABsjhIOb/MD +2er/BwHP/z0FT/M5BU/z4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB/ANjgfwDY4H7geKHB +4H+hwOB44H7gePHA4cUByM91gADYRwClBG26DW/zAtnPcYAOBADscCCgVgxv8wCFmQeP8+B44H7g +eOB+4HjxwAAWAEHPcoAA2EcGsgAWBUFAIgEEDhpEAUwlgITKIcIPyiLCB8ogYgHKI4IPAABEAAAF +YvLKJCIAANoH8AAWAEEUIYwAALQB4i8gQgHzCgKACg1P89HA4H7geOB+4HjgfuB44H7geOB+4Hjg +fuB44H7geOB+4HjgfuB44H7geM9wgADcCOB/AIDgeOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+ +4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H8B2OB+4HjgfuB4 +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 +sPIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJh+gAAAQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAC8foAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAD/AQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgAAAAYACAAJAAAA +BwAAAAAAAAAAAAAAAAAAAAIAAAACAAAAgwAAAJIAAADoAAAA9wAAAE4BAABdAQAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAcAAAAAAAEAAgAAAAMAEwAjADIAfwAgABAACAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPR2gAAEnwEAAAAAAAAAAAAAAAAAAAAAAPR2 +gACQpQEAAAAAAAAAAAD0doAA+KYBAAAAAAAAAAAAAAAAAPR2gAAAAAAAAAAAAAEADwBkAAEAuAiA +AAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAcAAAAAAAAAAAAA +AAAAALQHAAAVAAAAGC2AACwKAAAsCgAALAoAACwKAAAsCgAALAoAACwKAAAsCgAALAoAACwKAAAs +CgAALAoAACwKAAAsCgAALAoAACwKAAAsCgAALAoAACwKAAAsCgAALAoAACwKAAAsCgAALAoAACwK +AAAsCgAALAoAACwKAAAsCgAALAoAACwKAABQCwAAAAAAAGgMAQAsCgAAgAgAACwKAAAsCgAALAoA +AKgIAAD49AAA6FAAACwKAAAsCgAA3AgAANwIAADcCAAA3AgAANwIAADcCAAA3AgAACwKAAAsCgAA +LAoAACwKAAD4CQAALAoAACwKAAAsCgAALAoAACwKAABUCwAALAoAACwKAABkCAAAAwAAAGysAQAC +AAAAGBcBAAQAAAC8LwAABgAAAJC2AQARAAAArJgBAAcAAABooQEACAAAABC3AQAMAAAA1CwBAA0A +AADQMAEADgAAAAgxAQAWAAAA0AsBAAsAAABQRAEAFAAAAABSAAAPAAAASGAAABAAAADIAwEAAQAA +AGSdAQASAAAA+FEBABMAAABsSQEABQAAANBiAAAXAAAAUAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkIwAAZCMAAGQjAABUNQAAZCMAAGQjAAAYMQAAZCMA +AGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAlBkAACwbAAAwGwAApBwAACQdAACoHAAA +ZCMAAGQjAAC4PQAACEEAANhBAABkIwAAZCMAAGQjAACEPAAAHKkAABipAAAgqQAABDIAABQzAAC8 +VwEAWDUAANAzAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQj +AABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMA +AGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABENgAAZCMAAGQjAABkIwAAZCMAAGQjAAAkNwAA +ZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAADcLwAAZCMAAPwvAABk +IwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAMRjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQj +AABkIwAAZCMAAGQjAABkIwAAZCMAABxDAQCgRgEAZCMAAGQtAQBkIwAAxC4BALgfAQBkIwAAZCMA +AFBCAABkIwAAZCMAAGQjAABkIwAAZCMAAFCZAQDEmAEAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAA +KO8AACi2AQAstgEAZCMAABS2AQBkIwAAZCMAAGQjAABkIwAARKEBAGQjAAD0owEAZCMAAGQjAABk +IwAAPCAAAEAgAABkIwAAzEsBAOi3AQAEUgAAZCMAAGQjAABkIwAA6JsBAGQjAABkIwAAoAQBAFhJ +AQBkIwAAZCMAAGQjAADMUAEAaBsBAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAHhbAQBkIwAA9LYB +APi2AQAEtwEACLcBAPy2AQAAtwEADLcBAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAA +ZCMAAChEAABkIwAAZCMAAGQjAABkIwAAZCMAAGS2AQCYtgEATDkAAGQjAABkIwAAZCMAAGQjAABk +IwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAMRZ +AQBkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMAAGQjAABkIwAAZCMA +AGQjAABkIwAAZCMAAGQjAADwOQAAcDoAAPQ6AACQOwAAAF8AAGg7AABkIwAAZCMAAGQjAABkIwAA +ZCMAAOg5AADsOQAAZCMAAGQjAACAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAEAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAA4QMOHuHhAw4e4cECCh7hgQUMHuEAAAAAAAAAAAAA4QMOHuHhAw4e4cECBh7h +gQUMHuHBAgYe4YEFDB7hwQIGHuGBBQwe4cECBh7hgQUMHuEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQENDQ0NDQ0NDQ0NDQ0N +DQ0NAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBDQ0NDQ0N +DQ0NDQ0NDQ0NDQMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEB +AQ0NDQ0NDQ0NDQ0NDQ0NDQ0DAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAJECAAAxyi8A +kQIAADHKLwCRAgAAMcovAJECAAAxyi8AkQIAADHKLwCRAgAAMcovAJECAAAxyi8AkQIAADHKLwBD +AQAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEMB +AAAxyi8AQA0AAN4DCQAAAAAAAAAAAAAAAAAU7QAAAQAAANgsgACAgICAgICAgAGAAoCAgICAAQAA +AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAA2CyAANgsgACkIKAAOCCgAAEAAAD8////AAAAAAAAAAD4LIAA+CyAAKgg +oAA8IKAACAAAAPP///8AAAAAAAAAABgtgAAYLYAArCCgAGwgoAAwAAAAz////wAAAAAAAAAAAAAA +AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAC0BAEABQAAABgtgADICQEA +AP8DAOgJAQAA/wUAzAoBAAD/LQDwCgEAAP89AKgKAQAA/wQAjAoBAAD/JQDMEAEAnBEBAAASAQCk +DQEAIA0BALwSAQAYEwEAXBMBAKATAQAAAAAALAEAAF4BAAABAAAAAQAAAAEAAAABAAAAAwAAAAAA +AAAAAAAAAAAAAAMAAAACAAAAAwAAAAMAAAADAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAbBgB +AAoAAADYLIAAAAAAAAAAAAAAAAAAzBgBAAoAAADYLIAAAAAAAAAAAAAAAAAA4BgBAAoAAADYLIAA +AAAAAAAAAAAAAAAALBkBAAoAAADYLIAAAAAAAAAAAAAAAAAA9BkBAAoAAADYLIAAAAAAAAAAAAAA +AAAAmBkBAAoAAADYLIAAAAAAAAAAAAAAAAAAAB8BAAYAAADYLIAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAEAAAAACAAAAAAKAAECcAAOgDAADoAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAANwzAQDUNAEAYDcBAPA5AQBMPAEAZD8BAFw2AQAgBYAAvHaAABgAAAB8doAA +AAAAAAAAAAAAAAAAAAAAAAAAAAB0QQEABgAAANgsgAAAAAAAAAAAAAAAAAD09gAACgAAANgsgAAA +AAAAAAAAAAAAAAD09gAACgAAANgsgAAAAAAAAAAAAAAAAAD09gAACgAAANgsgAAAAAAAAAAAAAAA +AAD09gAACgAAANgsgAAAAAAAAAAAAAAAAAD09gAACgAAANgsgAAAAAAAAAAAAAAAAAD09gAACgAA +ANgsgAAAAAAAAAAAAAAAAAD09gAACgAAANgsgAAAAAAAAAAAAAAAAAD09gAACgAAANgsgAAAAAAA +AAAAAAAAAAD09gAACgAAANgsgAAAAAAAAAAAAAAAAAD09gAACgAAANgsgAAAAAAAAAAAAAAAAAD0 +9gAACgAAANgsgAAAAAAAAAAAAAAAAAD09gAACgAAANgsgAAAAAAAAAAAAAAAAACwRwEACgAAANgs +gAD/////AAAAAP////8AAAAAAAAAAAAAAADsSAEABQAAABgtgABkAGQAaQDcAMgAWgCqAL4AhgF9 +AD4AZABkAGkA3ADIAFoAqgC+AIYBfQA+AAAAAAABAQAAAAAAAAABAgEBAAIBAAECAgIAAQEAAgEC +AQIAAgABAgMAAAAA6FoBANxnAQD0gIAAQAUAAAAAAADoWgEABFwBADSGgAAgAQAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAFGwBADBqAQBUh4AAVAAAAAAAAADoWgEAXGoBANSHgABQAQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABAAAA6FoBAOBmAQBwNoAAUAEAAAAAAAAYbAEA7GgBAMwGgAACAAAAAAAA +AOhaAQAYaQEA0AaAAAQAAAAAAAAAEGwBAARcAQCoh4AALAAAAAAAAADoWgEAhGkBAAAAAAAAAAAA +AAAAAOhaAQBEaQEA1AaAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIAAgAD +AAQABAAFAAYABgAHACAAIAAhACIAIgAjACQAJAAlACYAJgBDAEQARABFAEYARgBHAEgASABJAEoA +SgBLAEwATABNAE4ATgBPAFAAUABRAG4AbgBvAHAAcABxAHIAcgBzAHQAdAB1AHYAdgB3AHgAeAB4 +AHgAeAB4AHgAeAB4AA8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAgADAAMA +BAAFAAUABgAHAAcACAAJAAkACgAjACMAJAAlACUAJgAnACcAKAApACkARgBHAEcASABJAEkAZgBn +AGcAaABpAGkAagBrAGsAbABtAG0AbgBvAG8AcABxAHEAcgBzAHMAdAB1AHUAdgB3AHcAeAB4AHgA +eAB4AHgAeAB4AA4APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIAAgADAAQABAAF +AAYABgAHACAAIAAhACIAIgAjACQAJAAlACYAJgBDAEQARABFAEYARgBHAEgASABJAEoASgBLAEwA +TABNAE4ATgBPAFAAUABRAG4AbgBvAHAAcABxAHIAcgBzAHQAdAB1AHYAdgB3AHgAeAB4AHgAeAB4 +AHgAeAB4AA8AQwAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAgADAAMABAAFAAUABgAHAAcACAAJAAkA +CgAjACMAJAAlACUAJgAnACcAKAApACkARgBHAEcASABJAEkAZgBnAGcAaABpAGkAagBrAGsAbABt +AG0AbgBvAG8AcABxAHEAcgBzAHMAdAB1AHUAdgB3AHcAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgA +eAB4AAgAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIAAgADAAQABAAFAAYABgAH +ACAAIAAhACIAIgAjACQAJAAlACYAJgBDAEQARABFAEYARgBHAEgASABJAEoASgBLAEwATABNAE4A +TgBPAFAAUABRAG4AbgBvAHAAcABxAHIAcgBzAHQAdAB1AHYAdgB3AHgAeAB4AHgAeAB4AHgAeAB4 +AA8AQwAAAAAAAAAAAAAAAQABAAIAAwADAAQABQAFAAYABwAHAAgACQAJAAoAIwAjACQAJQAlACYA +JwAnACgAKQApAEYARwBHAEgASQBJAGYAZwBnAGgAaQBpAGoAawBrAGwAbQBtAG4AbwBvAHAAcQBx +AHIAcwBzAHQAdQB1AHYAdwB3AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AAQA +PwBETwEAEtIAAAAAAAD//w8A/GQBALYAAAAAAAAA/wAAAPxkAQC3AAAAAAAAAP8AAAD8ZAEAuAAA +AAAAAAD/AAAA/GQBALkAAAAAAAAA/wAAAPxkAQC6AAAAAAAAAP8AAAD8ZAEAuwAAAAAAAAD/AAAA +/GQBAL0AAAAAAAAA/wAAAPxkAQC+AAAAAAAAAP8AAAD8ZAEAvwAAAAAAAAD/AAAA/GQBAMAAAAAA +AAAA/wAAAPxkAQDBAAAAAAAAAP8AAAD8ZAEAwgAAAAAAAAD/AAAARE8BABPSAAAAAAAA//8PAPxk +AQAbAQAAAAAAAP8AAAD8ZAEAHAEAAAAAAAD/AAAA/GQBAB0BAAAAAAAA/wAAAPxkAQAeAQAAAAAA +AP8AAAD8ZAEAHwEAAAAAAAD/AAAA/GQBACABAAAAAAAA/wAAAPxkAQAiAQAAAAAAAP8AAAD8ZAEA +IwEAAAAAAAD/AAAA/GQBACQBAAAAAAAA/wAAAPxkAQAlAQAAAAAAAP8AAAD8ZAEAJgEAAAAAAAD/ +AAAA/GQBACcBAAAAAAAA/wAAAERPAQAU0gAAAAAAAP//DwD8ZAEAggEAAAAAAAD/AAAA/GQBAIMB +AAAAAAAA/wAAAPxkAQCEAQAAAAAAAP8AAAD8ZAEAhQEAAAAAAAD/AAAA/GQBAIYBAAAAAAAA/wAA +APxkAQCHAQAAAAAAAP8AAAD8ZAEAiQEAAAAAAAD/AAAA/GQBAIoBAAAAAAAA/wAAAPxkAQCLAQAA +AAAAAP8AAAD8ZAEAjAEAAAAAAAD/AAAA/GQBAI0BAAAAAAAA/wAAAPxkAQCOAQAAAAAAAP8AAABE +TwEACNIAAAAAAAD//wMAZE8BAACCAAAAAAAA/wEAAGRPAQABggAAAAAAAP8BAABETwEACdIAAAAA +AAD//wMAZE8BAAKCAAAAAAAA/wEAAGRPAQADggAAAAAAAP8BAABETwEACtIAAAAAAAD//wMAZE8B +AASCAAAAAAAA/wEAAGRPAQAFggAAAAAAAP8BAABETwEABtIAAAAAAAD/AQAARE8BAAfSAAAAAAAA +/wMAAERPAQAG0gAACQAAAAD+AwBETwEAB9IAAAoAAAAA/A8ARE8BAAbSAAASAAAAAAD8B0RPAQAH +0gAAFAAAAAAA8D9ETwEAFdIAAAAAAAD/AwAARE8BAAzSAAAAAAAA/wEAAERPAQAV0gAACgAAAAD8 +DwBETwEADNIAAAkAAAAA/gMARE8BABXSAAAUAAAAAADwP0RPAQAM0gAAEgAAAAAA/AcAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0g3SEdIQ0gLSAdID0hvSC9IAgAXSEtIT +0hTSBEMG0gfSBNIJEHDStQAaAYEBBQAEAAYACAAJAAoACwAMAIMAkgDoAPcATgFdAQ8ALgAAAGwA +AAB0AAAAgAAAAIwAAACdAAAABwAAAAQAAAAIAAAAEAAAAEAAAACAAAAAIAAAAAAAAAAJAAAAEgAA +AAAAAAAKAAAAFAAAAP////8AAAAALQEAAN0BAABaAgAAugIAAAoDAABNAwAAhwMAALoDAADoAwAA +EQQAADcEAABZBAAAegQAAJgEAAC0BAAAzgQAAOcEAAD+BAAAFQUAACoFAAA+BQAAUQUAAGQFAAB1 +BQAAhgUAAJcFAACnBQAAtgUAAMUFAADTBQAA4QUAAO4FAAD7BQAACAYAABQGAAAgBgAAKwYAADcG +AABCBgAATAYAAFcGAABhBgAAawYAAHUGAAB+BgAAiAYAAJEGAACaBgAAogYAAKsGAAC0BgAAvAYA +AMQGAADMBgAA1AYAANsGAADjBgAA6gYAAPIGAAD5BgAAAAcAAAcHAAAOBwAAFAcAABsHAAAiBwAA +KAcAAC4HAAA1BwAAOwcAAEEHAABHBwAATQcAAFMHAABYBwAAXgcAAGQHAABpBwAAbwcAAHQHAAB5 +BwAAfwcAAIQHAACJBwAAjgcAAJMHAACYBwAAnQcAAKIHAACnBwAAqwcAALAHAAC1BwAAuQcAAL4H +AADCBwAAxwcAAMsHAADQBwAA1AcAANgHAADcBwAA4QcAAOUHAADpBwAA7QcAAPEHAAD1BwAA+QcA +AP0HAAABCAAABQgAAAgIAAAMCAAAEAgAABQIAAAXCAAAGwgAAB8IAAAiCAAAJggAACkIAAAtCAAA +MAgAADQIAAA3CAAAOwgAAD4IAABBCAAARQgAAEgIAABLCAAATwgAAFIIAABVCAAAWAgAAFsIAABf +CAAAYggAAGUIAABoCAAAawgAAG4IAABxCAAAdAgAAHcIAAB6CAAAfQgAAIAIAACCCAAAhQgAAIgI +AACLCAAAjggAAJEIAACTCAAAlggAAJkIAAAAAAAAAAAAAAoAAAAN0hHSENIC0gHSA9Ib0gvSAIAF +0hLSE9IU0gRDCNIJ0grSHNIG0gfScNIAAAEAAAAAAAAAAAAAAAAAAAADAAAABAAAAAMAAAAAAAAA +AwAAAAAAAAAAAAAAAAAAAAAAAAD/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALUAGgGB +AQQADwCDAOgATgGSAPcAXQEGAAgACQAKAAsADAAFAAAAAAAAACwAAQAAAAAAAAAAAAAAAAAAAAAA +AAACAAIAAgAAAN8AAAAZAQAAYgEAAL4BAAAyAgAAwwIAAHsDAABiBAAAhAUAAPIGAAC+CAAAAgsA +AAEAAAACAAAAAAAAAAvSDtIN0gjSCdIK0hLSE9IU0hHSENIC0gHSA9IAgAXSBEMb0hzSBNIARTDS +MdIAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAHAAAAAAAAAAMAAAAE +AAAAAwAAAAAAAAD/AwAAAwAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAtQAaAYEB +BQAEAA8AEAAKAAsADAAAAAAAAAAAACwAAQAAAAIAAgACAAAAAAABAAEAAgACAAIAAwADAAQABAAF +AAUABgAGAAcABwAIAAgACQAJAAoACgALAAsADAAMAA0ADQAOAA4ADwAAAAAAAAAAAAAAAADUngEA +BgAAANgsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAACAFgAC8doAAGAAAAHx2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA +AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAWAALx2gAAYAAAAfHaAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAKKoBAAQAAADYLIAAAAAAAAAAAAAAAAAAUKkBAAQAAADYLIAAAAAAAAAAAAAAAAAA +yKoBAAYAAADYLIAAAAAAAAAAAAAAAAAAUKkBAAQAAADYLIAAAAAAAAAAAAAAAAAAKKoBAAQAAADY +LIAAAAAAAAAAAAAAAAAAUKkBAAQAAADYLIAAAAAAAAAAAAAAAAAAKKoBAAQAAADYLIAAAAAAAAAA +AAAAAAAAUKkBAAQAAADYLIAAAAAAAAAAAAAAAAAAyKoBAAYAAADYLIAAAAAAAAAAAAAAAAAAUKkB +AAQAAADYLIAAAAAAAAAAAAAAAAAAKKoBAAQAAADYLIAAAAAAAAAAAAAAAAAAyKoBAAYAAADYLIAA +AAAAAAAAAAAAAAAAKKoBAAQAAADYLIAAAAAAAAAAAAAAAAAAKKoBAAQAAADYLIAAAAAAAAAAAAAA +AAAAyKoBAAYAAADYLIAAIAWAALx2gAAYAAAAfHaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBQAAAAAAAAAAAAAAAAAAAAAA +/wD/AAAAAAAABBYIFhYWDBYWFhYWFhYQAAAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwAB +AAAADwA/AAEAAAAPAD8AAQAAAA8APwACAAAADwA/AAEAAAAAAAAAAQAAAAIAAAADAAAAAAAAAAQA +AAACAAAABQAAADKAAaUAPDg0MCwoJCAcGBQQDAgEAAwIBAA8ODQwLCgkIBwYFBAMCAQCABQOGgAA +ACAAAAACAAACAAAAAAEBAAECAQEBAQEBAQEBAQECAgICAgICAgMDAwMDAwMDBAQEBAQEBAQBAgIC +AgICAwMDAwMDAwMDAwMDAwMEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAQECAQICA3//Bw8f +PwEDAQMPBwEHDx8/f///BQAHAgMEBgZ00UUX6KKLLg0PBQcJCwEDChQ3blVVVQFLaC8BVVVVBeM4 +jgOqqqoCcRzHAaqqqgrHcRwHKAAoADAALAAsACgAPAA0ACgAKAA0ADAALAAsAEQAPABAADwAjABs +AFgASAD0ALAALAAsADwANAAwACwAVABEAFQAVABsAGAAXABUAIwAeAA6AQIB1QDfANoAogB1AH8A +agEaAdkA6AAKAboAeQCIAIoFKgM5AagBigXKAtkASAHKAUoB4gD5AMoB6gCCAJkAZuYAAJ3YiZ1O +7MRONEiDNCd2YicapEEaEzuxExEYgREP/MAPTuzETid2YicapEEaEzuxEw3SIA2JndgJCIzACAd+ +4Ac0SIM0GqRBGhEYgREN0iANCIzACAZpkAawstUFBVRABSd2YicTO7ETDdIgDYmd2AkGaZAGxE7s +BARGYAQDP/ADqqqqqhqkQRoTO7ETD/zADxEYgREN0iANCqiAChM7sRMP/MAPD/zADw3SIA0LtEAL +C7RAC4md2AkN0iANCqiACgqogAoIjMAIB3iABwd4gAcGaZAGD/zADw3SIA0LtEALDdIgDQu0QAuJ +ndgJCIzACImd2AkIjMAIB37gBwd+4AfBLCkHCqiACgiMwAgHeIAHCIzACAd4gAcGaZAGsLLVBQZp +kAawstUFBVRABQVUQAXWHcYEDQAaACcANABOAGgAdQCCABoANABOAGgAnADQAOoABAEnAE4AdQCc +AOoAOAFfAYYBNABoAJwA0AA4AaAB1AEIAgwATgBoAIIAdQCcAMMAaACCAIIAnAC2ALYA0ACcAMMA +wwDqABEBEQE4AYIAnAC2AJwAtgDQAOoA0ADqAAQBBAEeAcMA6gARAeoAEQE4AV8BOAFfAYYBhgGt +AQAAMAAAADYAAAAMAAAAEgAAABgAAAAkAAAABgAAAAkAAAAAAAAAAAAAABggFBQODhQUBQYBAgME +AAAAAQECAQICAwQMDAgEDAQEQAAAAIAAAAAAAQAAAAIAAEAAAAAABAAAQAAAAEAAAAAQERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uL0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f +YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8tAA8gAPBhAAAAAAAAAAAAAAECBAQAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB +AgECAwQAAAUGBwgJCgAAAAUGAAIEAAUAAAAAAAUHAQMEAAUBAAAAQCNAJSEhISFAQEBAQAUEBAEB +QEBAQAUFQEAMDEANDAwBAQEFQEAFBQAEAARAQAAEQEBABUBAQEBABUBAQAUFBQEBAQFABQUFAQUB +AUAFBQVABUAFBQUFBWwAcAR0CHQMAAQEBgAAAAAAAAAAZAAAAACQAQAKAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA +AAABAAAAEAAAAAAAAAABAAAAAQAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA6KoBAAAAAAAABAAAZAAA +AAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwYGBgYGBQUFBQUEBAQEBAMDAwMDAgICAgIBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMRQEAlEUBAJxFAQDwRQEA+EUBAABGAQAACiVD +xE56lQAHEyRUKwAAAAQOCR0tNwAABA4JHSw7AAEQAAEAAAACgAABQgYCEAACIAAAA8AAAUMGAxAA +AsAAAAPAAAFDBgQQAAJAAAACgAABRAYFEQAAQAAAA8AAAUUGBhEAAOAAAAPAAAFFBgcRAAEAAAAC +gAABRgYIEQACIAAAA8AAAUcGCREAAsAAAAPAAAFHBgoRAAJAAAACgAABSAYLEgAAQAAAA8AAAUkG +DBIAAOAAAAPAAAFJBg0SAAEAAAACgAABSgYOEgACAAAAAoAAAUwGAAAiFgAAgAAAAwAAAVkAJBYA +AQAAAAMAAAFaACYWAAIAAAAEAAABWgAoFgACAAAAAwAAAVsAKhYAAoAAAAMAAAFcACwXAAAAAAAE +AAABXAAuFwAAgAAAAwAAAV0AMBcAAQAAAAMAAAFeADQXAAIAAAADAAABXwA2FwACgAAAAwAAAWAA +OBgAAAAAAAQAAAFgADwYAAEAAAADAAABYgA+GAACAAAABAAAAWIAQBgAAgAAAAMAAAFjAGQbAAIA +AAADAAABbwFmGwACgAAAAwAAAXABaBwAAAAAAAQAAAFwAWwcAAEAAAADAAABcgFuHAACAAAABAAA +AXIBcBwAAgAAAAMAAAFzAnQdAAAAAAAEAAABdAJ2HQAAgAAAAwAAAXUCeB0AAQAAAAMAAAF2Anwd +AAIAAAADAAABdwN+HQACgAAAAwAAAXgDgB4AAAAAAAQAAAF4A4QeAAEAAAADAAABegOGHgACAAAA +BAAAAXoEiB4AAgAAAAMAAAF7BIwfAAAAAAAEAAABfASRHwABQAAAAwAAAX4ElR8AAwAAAAQAAAF/ +BZcfAALAAAADAAABgAWZIAAAQAAAAwAAAYEFnSAAAUAAAAMAAAGCBZ8gAAHAAAADAAABgwWhIAAD +AAAABAAAAYMFpSEAAEAAAAMAAAGFBQAAAAAAAAAAAAAkogEALKIBAJSiAQAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAD/////AAAAAAAAAAABAAAAAAAAAGAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAA +AAAAAAUFBQUFBQUFAAAAAIANAAAAIAAAgA0AAIANAAAAIAAAgA0AAAAGAAAABAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAA== +==== diff --git a/sys/contrib/dev/iwn/iwlwifi-4965-228.61.2.24.fw.uu b/sys/contrib/dev/iwn/iwlwifi-4965-228.61.2.24.fw.uu new file mode 100644 index 000000000000..270a4d80bfd6 --- /dev/null +++ b/sys/contrib/dev/iwn/iwlwifi-4965-228.61.2.24.fw.uu @@ -0,0 +1,3339 @@ +Copyright (c) 2006-2009, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. 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 MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER 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. +begin-base64 644 iwlwifi-4965-228.61.2.24.fw.uu +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 +8cDhxc9yoADIH89xoADIHKiBSBoYgAbYCiQAcOB4qCBAAeB44HitAu/2qXDxwM9xoADIH0kZGIAG +2AokAHDgeKggAAHgeOB40cDgfvHACgrv9gHYAN7PdaAAxCcSpaYP7/8D2Bpwz3AJAAYAEKXPcMAA +BkMQpc9wwAAGTBClz3DAAAZVEKXPcqUA8MwYGoCDAdjPcaQADEIUoSvZz3CkAJBBPqAS389zpAAU +QfijLNtooM9zpACgPzyjP9kroHTYFBoAgM9wpACYfZ8YmAO6DiAAyXCKIcQAz3CkABxANqAg2M9x +pAAMQgyhFNgNoTnZz3ClAFANMBhAgM9wPwACwRClz3BgAALMEKXPcAEAAssQpc9wCAACiRClz3B3 +AAKQEKXPcMcAAosQpc9wXwACGBClz3AFAAIZEKXPcAMAAsAQpc9wIAACXhClz3BjAAJlEKXPcAYA +AmYQpc9wAQAC2BClz3BgAALSEKXGDu//CnBJAc/2bPHgeADaDfBUeGOIIojPcKwA1AEB4k96NXiL +GNiAz3CAANAVIIgwcuAgygfu8eB48cDhxQh1z3GAAMgDBYmA4AT0BImA4A/y7/8H2gDYz3GsANQB +2BmAgIDlyiChAtAZAID9AM/24HjxwOHFCHUhkECQz3CjANj9VXiKGFgAIJUp2BK48CBBAAGVMHAK +8qIPL/eKINEDiiDRA5YPL/cghb0Az/bxwOHFCHUhkECQz3CoANQDVXgLGFiAIJUV2BO48CBBAAGV +MHAK8mYPL/eKINEDiiDRA1oPL/cghYEAz/bxwOHFCHUhkECQz3CsANQBVXiLGFiAIJUr2BK48CBB +AAGVMHAK8ioPL/eKINEDiiDRAx4PL/cghUUAz/bxwOHFCHUAkM9yoADsJwi4TyBBAAGVELgleM9x +oADEJxChAJUIuEUgwAAQoSqCAZUwcAvy3g4v94og0QOKINED0g4v9yCF/QeP9uB4z3GsANQBANiL +GRiAjBkYgAfYjRkYgAbZkbnPcKAAxCcwoM9xGAAHAjCgz3KAAHR7NIqA4QX0z3EQAAYCMKAggoDh +UfIG2Za5MKDPcXgAAoUwoM9xAgACgTCgz3FVAAKCMKDPcRAAAoYwoM9xQQAChzCgz3EHAALTMKDP +cQEAAoowoM9xAAACpTCgz3EAAAKmMKDPcQAAAqcwoM9xBgACqDCgz3EGAAKpMKDPcQYAAqowoM9x +/wAHxTCgz3H/AAfbMKDPcf8AByYwoM9x/wAHIzCgz3EYAAIfMKDPccwAAh5X8AfZlrkwoM9xAQAC +hzCgz3EDAALFMKDPcYAAAtswoM9xcAAChTCgz3FwAAKBMKDPcQYAAtMwoM9xIQACijCgz3EFAAKl +MKDPcQUAAqYwoM9xBQACpzCgz3EMAAKoMKDPcQwAAqkwoM9xDAACqjCgz3FEAAImMKDPcUQAAiMw +oM9xKAACFjCgz3GZAAIVMKDPcf8AB4IwoM9x/wAHhjCgz3H/AAcfMKDPcf8ABx4woOB+4HjxwLhw +z3CAAHR7ABAEAEwkAIAA2A7yz3KAABxEAvAB4I7gVfcWIgEAIImwcfn1F/DPcoAAjEQD8AHgpuBH +9xYiAQAgibBx+vUJ8ArYCiHAD+tyzguv9onbANjRwOB+4HjPcoAAdHs0ioDhAYIH9DWKgOHCIKIA +wCChAMTxz3CAAHR7QIAigM9wgAAcRIDiNngD8uB/B4jgf3cQgADxwEYNj/bPdYAAIREAjYDgHAAC +AM9wAACQZQokAHDgeKggAAHgeOB4AdgArQbYkLjPdaAAxCcQpc9wgAB0e0CAIoDPd6AA7CfPcIAA +HESA4gXyNngG2Za5BfBw4DZ4B9mWuTClz3YEAAe8z3EQAAe40KUwpc9xCgAHvDClz3E/AALBMKUi +iBC5BSGBDwAAArIwpSGIELkFIYEPAAACszClJYgQuQUhgQ8AAAK0MKUkiBC5BSGBDwAAArUwpSOI +ELkFIYEPAAACtjClBogQuAUggA8AAAK3EKXPcAQABrwQpc9wAQAGsRClz3ADAAauEKXPcAEABrwQ +pc9wAwAGABClz3AIAAa8EKXPcBAABrgQpc9wAACgKAokAHDgeKggAAHgeOB4z3AgAAa8EKXPcAAA +KAoKJABw4HioIAAB4HjgeM9wAAAD8BClCoeEIAEPQSiRAM9wIAAHvBClz3AAAAPvEKUoFxAQCiUA +BIQlAQiMJQGIDPIR2AohwA/rcoojxAcCCq/2CiQABEwhgKFTIAAhTfeP4MogYQTAIGIAELgFIIAP +AAAC2xCl0KX9A4/24HjxwKILr/aKIQYEz3WgALAfGIV+C4/8CHYM8AjYCiHAD+tyx9tKJAAAqgmv +9golAAHPcgAAA/DPcaAAxCfPcKAA7CdQoQqA57gI9BiFogov/MlxguDu9ePxtQOP9vHA4cXPdYAA +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 +4b3RJeKQBPLkvQzyBdgKIcAP63KKI1gKmHM2Ca/0uHZhA6/0ocDgePHA9gqP9BXIXBKNMFMgDgCK +IAcCJgov9alxyXCpcU79AYjkuAvyBdgKIcAP63KKIxkAmHPyCK/0uHUpA4/0AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAJQBAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPht +gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAALAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAQD/APDw8PDw8PDw8PDw8PDw8PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgGAAAYBgAAGAY +AABYIAAAYBgAAGAYAAAwIAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAA9BEA +AAASAABgGAAAoBIAAMgTAABIEwAAYBgAAGAYAACUJAAAQCcAAOgnAABgGAAAYBgAAGAYAADIIwAA +YBgAACQpAABkKgAAYBgAAGAYAABgGAAAXCAAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABg +GAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAY +AABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAACgIAAAYBgA +AGAYAABgGAAAYBgAAGAYAAB0IQAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAA +YBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABg +GAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAADQBAQAwBAEAYBgAAJQG +AQBgGAAAQAgBANzPAADc0AAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAADA9AQDcTwEAYBgA +AGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAA +qFYBAGAYAACEWAEAYBgAAGAYAABgGAAAVBQAAHAcAQBgGAAAYBgAAABmAQAsMAAAYBgAAGAYAABg +GAAAANUAAGAYAABgGAAAdMQAAEgjAQBgGAAAYBgAAGAYAABcMwEAtNUAAGAYAABgGAAAYBgAAGAY +AABgGAAAYBgAAOwoAQBgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgA +AGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAHwwAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAA +YBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABg +GAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAY +AABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAGAYAABgGAAAYBgA +AGAYAABgGAAAYBgAAGAYAABgGAAAYBgAAPAiAAD0IgAAYBgAAGAYAABgGAAAGAAN/A5zD3AdIB9A +IEAhQCIxJWYmDydmKA8rHSxELR0uRDEQMgkzEDQJb1pwAHEAcgMAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcA +AOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA +5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADMCAAAAAAAADzHAADk +BwAA4AYAAOQHAADIGwEAFAcAAIiyAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAACcBwAAOAcAADgH +AAA4BwAAOAcAALQIAADkBwAA5AcAAOQHAACwBwAA5AcAAOQHAADkBwAA5AcAAOQHAADQCAAA5AcA +AOQHAADQBgAAAwAAANRkAQAEAAAAMN8AAA4AAAD0VQEACAAAAAgeAQACAAAAKFoBAAoAAADoHgEA +CwAAAJQKAQAMAAAAyAoBABEAAADgxgAACQAAABwCAQAQAAAAKDAAAA0AAAB8wwAAAQAAAJTUAAAP +AAAA7DkBABIAAADMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAEAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAACAgICAgICAgAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAEAAAAIyQAA3MkAAPDMAAAkywAAJMoAALzNAABAzgAAeM4AALzOAAAAAAAALAEAAF4B +AAABAAAAAQAAAAEAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAMAAAACAAAAAwAAAAMAAAADAAAAAQAA +AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsDQAAAAAAAAAAAAAAAAAAAP8A/wD/AP// +/wD/AP8AAAEAAAAAAAAABQAAAAAAAAAAAAAAEAAAAACAAAAAAKAAECcAAOgDAADoAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwNAQDoDgEAbBEBAFgTAQDIFQEA ++BgBAEgQAQCUD4AAbGOAABgAAABMY4AAAAAAAAAAAABkMoAApGOAAAAbAQAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAwQEBQYGBwgICQoKCwwMDQ4OD2ZmZ2hoaWpqa2xsbW5u +b3BwcXJyc3R0dXZ2d3h4eXp6e3x8fX5+FT8AAAAAAAAAAAAAAAAAAQICAwQEBQYGBwgICQoKCwwM +DSgoKSoqKywsLUdISUlKS0tMTU1OT09QUVFSbW1ub29wcXFyc3N0dXV2d3d4eXl6e3x9DD8ELQEA +UHAAAAQtAQBRcAAAuC0BAEUAAAC4LQEARAAAALgtAQBJAAAAuC0BAEgAAAAELQEAUnAAAAQtAQBT +cAAAuC0BAE4AAAC4LQEATQAAALgtAQBSAAAAuC0BAFEAAAAELQEAQNIAAAQtAQBB0gAAuC0BAFcA +AAC4LQEAVgAAALgtAQBbAAAAuC0BAFoAAAAELQEACNIAAAQtAQAJ0gAAQC0BAACCAABALQEAAYIA +AAQtAQBF0gAABC0BAEbSAABALQEAAIIAAEAtAQABggAABC0BAAbSAAAELQEAPpAAAAQtAQBD0gAA +BC0BAETSAAAELQEAUNIAAAQtAQBR0gAABC0BAFLSAAAELQEAU9IAAAQtAQA/kAAABC0BABPSAAAE +LQEAQJAAAAQtAQAV0gAABC0BAD/SAAAELQEAPtIAAAQtAQA/kAAABC0BABPSAABkAGQAaQDcAMgA +WgCqAL4AhgF9AD4AZABkAGkA3ADIAFoAqgC+AIYBfQA+AAAAAAABAQAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAACUD4AAbGOAABgAAABMY4AAAAAAAAAAAABUNoAApGOAAAAAAACUD4AAbGOAABgA +AABMY4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAuDaAAKRjgABwXgEAlA+AAGxjgAAYAAAATGOAAAAAAAAAAAAA +lA+AAGxjgAAYAAAATGOAAAAAAAAAAAAA0DaAAKRjgABwZQEAABQFAAAAAAAAAAAAAAAAAAAAAAD/ +AP8AAAAAAD97P3U/bj9oP2I+bj5oPmI9bj1oPWI8bjxoPGI7bjtoO2I6bjpoOmI5bjloOWI4bjho +OGI3bjdoN2I2bjZoNmI1bjVoNWI0bjRoNGIzbjNoM2IybjJoMmIxbjFoMWIwbjBoMGIlbiVoJWIk +biRoJGIjbiNoI2IibhhoGGIXbhdoF2IWbhZoFmIVbhVoFWIUbhRoFGITbhNoE2ISbghoCGIHbgdo +B2IGbgZoBmIFbgVoBWIEbgRoBGIDbgNoA2ICbgJoAmIBbgFoAWIAbgBoAGIAXQBYAFMATj9uP2g/ +Yj5uPmg+Yj1uPWg9YjxuPGg8YjtuO2g7YjpuOmg6YjluOWg5YjhuOGg4YjduN2g3YjZuNmg2YjVu +NWg1YjRuNGg0YjNuM2gzYjJuMmgyYjFuMWgxYjBuMGgwYgZuBmgGYgVuBWgFYgRuBGgEYgNuA2gD +YgJuAmgCYgFuAWgBYgBuAGgAYgBhAGAAXwBeAF0AXABbAFoAWQBYAFcAVgBVAFQAUwBSAFEAUABP +AE4ATQBMAEsASgBJAEgARwBGAEUARAAA/////////wAB//8CA////wT///////////////////// +/wX/Bv8H/wj/Cf8K/wv/DP///w3///8O////D////xD///////////////////////////////// +/////////////xH///8S////E////xT///8V////Fv///xf///8Y////Gf///xr///8b/////xz/ +//8d////Hv///x////8g////If//////////////////////IiMk/yUmJ///KP///yn///////// +/////////////////////////////////////////////////////////////////////wAAAAAP +AD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8A +PwACAAAAAQAAAD3kAaUALSonJCEeGxgVEg8MCQYDAAwIBAA8ODQwLCgkIBwYFBAMCAR//wcPHz8B +AwEDDwcBBw8fP3///wUABwIDBAYGdNFFF+iiiy4NDwUHCQsBAwoUN25VVVUBS2gvAVVVVQXjOI4D +qqqqAnEcxwGqqqoKx3EcBw8PDwcGBwIDBAUAAQgJCwooACgAMAAsACwAKAA8ADQAKAAoADQAMAAs +ACwARAA8AEAAPACMAGwAWABIAPQAsAAsACwAPAA0ADAALABUAEQAVABUAGwAYABcAFQAjAB4ADoB +AgHVAN8A2gCiAHUAfwBqARoB2QDoAAoBugB5AIgAigUqAzkBqAGKBcoC2QBIAcoBSgHiAPkAygHq +AIIAmQD0AkQCtQHVAZQChAH1AEECrACQAIQAgAB4AHgAeAB0AGYOAACJndgJxE7sBIM0SANiJ3YC +QRqkAbETOwGBERgBwA/8AC+hvQSX0F4CD4uUAUtoLwGHRcoAJbSXAAXZhgDrXHkAqqqqCgANAAAA +GgAAACcAAAA0AAAATgAAAGgAAAB1AAAAggAAABsAAAA2AAAAUQAAAGwAAACiAAAA2AAAAPMAAAAO +AQCd2ImdTuzETjRIgzQndmInGqRBGhM7sRMRGIERD/zAD07sxE4ndmInGqRBGhM7sRMN0iANiZ3Y +CQiMwAgHfuAHNEiDNBqkQRoRGIERDdIgDQiMwAgGaZAGsLLVBQVUQAUndmInEzuxEw3SIA2JndgJ +BmmQBsRO7AQERmAEAz/wA6qqqqoapEEaEzuxEw/8wA8RGIERDdIgDQqogAoTO7ETD/zADw/8wA8N +0iANC7RACwu0QAuJndgJDdIgDQqogAoKqIAKCIzACAd4gAcHeIAHBmmQBg/8wA8N0iANC7RACw3S +IA0LtEALiZ3YCQiMwAiJndgJCIzACAd+4AcHfuAHwSwpBwqogAoIjMAIB3iABwiMwAgHeIAHBmmQ +BrCy1QUGaZAGsLLVBQVUQAUFVEAF1h3GBAAAAAAAAAAAGCAUFA4OFBQFBgECAwQAAAAAAAAABwgI +AAAABwoNEBEAAAAHCw4QEQAHCw4VGx8iAAAAAAcKCw0AAAcKDxUXGgAACAsQFRgbAAsQFiEsMTYA +AAAHCw8QEgAHCw8WHSEkAAgMDxceIiUIDxceLTxESwAICw8WHSElCA8WHSw6QkkIEBcfLj1ETBAf +Lj1beYiXAAcHDwcPDw8EDAwIBAwEBEAAAACAAAAAAAEAAAACAABAAAAAAAQAAEAAAABAAAAAMxMA +AAAFCg8BAQABAgEBAaXGhPiZ7o32Df+91rHeVJFQYAMCqc59VhnnYrXmTZrsRY+dH0CJh/oV7+uy +yY4L++xBZ7P9X+pFvyP3U5bkW5vCdRzhrj1qTFpsQX4C9U+DXGj0UTTRCPmT4nOrU2I/KgwIUpVl +Rl6dKDChNw8KtS8JDjYkmxs93ybNaU7Nf5/qGxKeHXRYLjQtNrLc7rT7W/akTXZht859e1I+3XFe +lxP1pmi5AAAswWBAH+PIee22vtRGjdlnS3LelNSY6LBKhWu7KsXlTxbtxYbXmlVmlBHPihDpBgSB +/vCgRHi6JeNL86L+XcCAigWtP7whSHAE8d9jwXd1r2NCMCAa5Q79bb9MgRQYNSYvw+G+ojXMiDku +V5PyVYL8R3qsyOe6KzKV5qDAmBnRnn+jZkR+VKs7gwvKjCnH02s8KHmn4rwdFnatO9tWZE50HhTb +kgoMbEjkuF2fbr3vQ6bEqDmkMTfTi/Iy1UOLWW632owBZLHSnOBJtNj6rAfzJc+vyo706UcYENVv +iPBvSnJcJDjxV8dzUZcjy3yhnOghPt2W3GGGDYUPkOBCfMRxqszYkAUGAfcSHKPCX2r5rtBpkRdY +mSc6uSc42RPrsyszIrvScKmJB6czti0iPJIVIMlJh/+qeFB6pY8D+FmACRca2mUx18aEuNDDgrAp +d1oRHst7/KjWbTosCKAAAKScAACYnwAAVJ0AAABBAAAAQgAAfEAAAEBCAAAAAMAAcESgAGwAAIAA +ALAABAigAAAAAAAEALAAGAigAAEAAAAAALAAHAigAAMAAAAAALAA7BygADAAAAAAALAAUBSgAAMA +AAAAALAABBigAAMAAAAAALAAQESgAAAAAAAAALAAGAigAAAAAAAAAAAABCigAAIBAAAAAAAAXEin +AAAAAAAAAAAABCigAAJpAAACkPEABCigAAEAAAAAgAEAGCigAAAAAAAAAAAA8BygAAIAAAAAAAAA +7BygAAEAAAAAoAEACACsAAAAAAAAEAIAMECkAAAAAAAAAAAAEBygAAAAcAAAAAAA4BygAAAAAAAA +AACAJBCgAAEAAAAAADAAJBCgAAAAAAAAAAAAOBygAACAAAAAAIACOBygAAAAAQAAUEAABCigAAID +AAAAYFAABCigAAIEAAAEIAAABCigAAEAAAAAQAAACACsAAAAAAAAAKAA7BygAAIAAAAAAJAAcESg +ACQAAIAAsAIAAAiqAAAAAAAAwAIABAiqAAAAAAAFABABcESgAIQAAIAAMAAAGCigAAAAAAAAAAAA +OBygAAAAAQAAgAAA4BygAAAAAAAAcKAACAiqAAAAAAAAkKAABACqAAAAAAAAcJAAKEinAAAAAAAA +kJAAAACmAAAAAAADAAAABAigAAMAAAAAAAAApCCgAAAAAAAAAACAACCgAAAAYAAAAACAOBygAAAA +AQAAoAGACACsAAAAAAAEkAEABCigAAEAAAAAkAEABCigAAEAAAAAoAGACACsAAAAAAAAAAAAXEin +AAEAAAAAIAIACACsAAAAAAAAAAAAMEmnAAIAAAAAAAAABCigAAIBQAAAAAAACEinAP8AAAAAAAAA +BCigAAJpIQAAAAAAZECmAAAIAAAAAAAALEmnAAAAAAAAAACAAEinAAEAAAABAgECAwQAAAUGBwgJ +CgAAAAUGAAIEAAAABQcBAwQAAEAjQCUhISEhQEBAQEAFBAQBAUBAQEAFBUBADAxADQwMAQEBBUBA +BQUABAAEQEAABEBAQAVAQEBAQAVAQEAFBQUBAQEBQAUFBQEFAQFABQUFQAVABQUFBQUEAAAAHBEA +ABwyAAAcMwAABAAAABwVAAAAAAAAAAAAAGQAAAAAkAEACgAAAAAEBAcAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAHECQAAAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA +AAAAAAAA/wAAAAAAAAABAAAAEAAAAAAAAAABAAAAAQAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA3GMB +AFwDAQBgAwEAZAMBAMADAQDIAwEA0AMBAAAECwkVJS8AAAQRCRwnMgABgAARgAAWBAIgABKAABYE +A0AAEIAAFwQE4AAQgAAXBAWAABGAABcEBiAAEoAAFwQHQAAQgAAYBAjgABCAABgECYAAEYAAGAQK +IAASgAAYBAtAABCAABkEDOAAEIAAGQQNgAARgAAZBA6AABCAABoEIoAAGAAAFgAkAAAZAAAWASYA +ACIAABYBKAAAGgAAFgEqgAAaAAAWASwAACAAABcBLoAAGAAAFwEwAAAZAAAXATQAABoAABcBNoAA +GgAAFwE4AAAgAAAYATwAABkAABgBPgAAIgAAGAFAAAAaAAAYAWQAABoAABsCZoAAGgAAGwJoAAAg +AAAcAmwAABkAABwCbgAAIgAAHAJwAAAaAAAcAnQAACAAAB0CdoAAGAAAHQJ4AAAZAAAdAnwAABoA +AB0CfoAAGgAAHQKAAAAgAAAeAoQAABkAAB4ChgAAIgAAHgKIAAAaAAAeAowAACAAAB8CkUAAGQAA +HwOVAAAjAAAfA5fAABoAAB8DmUAAGAAAIAOdQAAZAAAgA5/AABkAACADoQAAIwAAIAOlQAAYAAAh +A/ROAQBIPwEAFEEBAEhCAQCkRAEAUEcBAFxLAQDUTAEA+E0BADxbAQBUWwEAwFsBAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAADQAQABMAFgAaACAAJgAtADUAQABMAFoAawCAAJgAtAAmAC0ANQBAAEwAWgBrAIAAmAC0ANYA +AAEwAWkBrQEAAmsAgACYALQA1gAAATABaQGtAQACYALTAl0DAATBBKYFMAFpAa0BAAJgAtMCXQMA +BMEEpgW3BgAIgglMC24NABBQAF8AcQCHAKEAvwDjAA8BQgF/AccBHgKEAv4CjgM8BP////////// +//////////////////////////////////////////////////////////////////////////8w +AWkBrQEAAmAC0wJdAwAEwQSmBbcGAAiCCUwLbg0AEAAAAAAAAgQGAwkGCQAJAAkACQAJAAkAAAAA +AAAAAAAAAAAAAAAAAAD/////AAAAAGAAAAAFBQUFBQUFBQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +DgAAAA4AAAAOAAAADgAAAAQAAIAAAACAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICCADwAAQABpIAAAaSBAAGkgAABpIEAAICCADwAA6ABp +IAAAaSBAAGkgAABpIEAAICCADwAAGAFpIAAAaSBAAGkgAABKIAAASiEAAEoiAABKIwAASiQAAEol +AABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQSiAAIEohACBKIgAgSiMA +IEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+AAACgQSycMEAsnDBCJBw0CiKAP4AADDMKIwA3 +UggAAEomAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAAQPQHggIECHAAAAAAAAAAAAAIoh/w/P +cKAAyB8TGFiAICCADwAAAADgfuB+4HjxwFYJIAAB2M91AACECEB9z3agAMAvFIbPd6AArC+LuBmn +FIbjuP/1YH0C2IogCAAWp2B9A9jPd6AAyB8A2A4fGJAPHxiQEB8YkBEfGJCOCyAAPNhPIEEAGgog +ADzYSgtAAGIKAABgfQXYz3GgAIQ0BIHPcqAAvDf/uPnzFBESABgREwAMEREABIHTuBpwNhoYgGB9 +B9jPcYAAAA8CIYAPgAAAAEEoAgEAIoMEAiMCIGhwMghgAAHbYH0J2M9woADQGxGA/bj882B9CtgA +2J24Ex8YkGB9C9jPcYAA7AMC2AChN4bPcIAABAQgoDqGz3CAAAgEIKBgfQzYKnAA2Qpy4g8gAChz +ANiduA8fGJDPcIAA2AMAEBoAz3EAbQAQz3CfANj/MaBgfQ3YaSCAAG8hPwB9AAAA4Hj8HIi2/BxI +tvwcCLb8HMi1/ByItfwcSLX8HAi1/BzItPwciLT8HEi0/BwItPwcyLP8HIiz/BxIs+B+4HgE3Djd +NfDgeATcNN0z8OB4BNww3THw4HgE3CzdL/DgeATcKN0t8OB4BNwk3Svw4HgE3CDdKfDgeATcHN0n +8OB4BNwY3SXw4HgE3BTdI/DgeATcEN0h8OB4BNwM3R/w4HgE3AjdHPDgeATcBN0Z8DQUGjAwFBkw +LBQYMCgUFzAkFBYwIBQVMBwUFDAYFBMwFBQSMBAUETAMFBAwAscBxrAkTTOwJB8z4H7hxaHBCHPP +dYAACA8BlQAchDBPIMIDAeAQeAIchDCPuAG1R2kEIoIPAAD8/+xwQKAAwkCgIrkF8ECgBONhuYHh +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 +SiZAAOggIgMvIACALyFLAAIhvoDAIIYBwiGGAEomAABCIP6QziCCAUQgfpDOIYIB4H4FAMAA4Hjx +wCYMr/8B2s9xoADIH89woACwH1agvBEOABHYCgrv/424EfDPcKAAsB8B2lagz3GgAMgfvBEAAMJ4 +jCAfhHAADQDPdaAArC8Yhc9xoADAL+C46vMYhZG4E6EW2AokAHDgeKggQAHgeOB4Eti6Ce//jbgY +hfG4BPRvIT8Az3WgAKwvGIXPcaAAwC+zuBOhE9iWCe//jbgYhfO4BPJvIT8AFNiGCe//jbjpA4// +byE/AJMHz//xwM9xgABsOSCBgOEA2Q/yz3OAAEwxA/AB4Y7hVPcWI0IAQIpQcPr1FvDPc4AAvDEC +8AHhpuFI9xYjQgBAilBw+fUK8M9wAAAHMCoJz/9vIT8AANnRwOB/KHDgeM9wgABsOQGAzvHgeM9w +gABsOUCAIoDPcIAATDGA4jZ4A/LgfweI4H93EIAAz3GsANQBANiLGRiAjBkYgAfYjRkYgAbZkbnP +cKAAxCcwoM9xGAAHAjCgz3KAAGw5NIqA4QX0z3EQAAYCMKAggoDhUfIG2Za5MKDPcXgAAoUwoM9x +AgACgTCgz3FVAAKCMKDPcRAAAoYwoM9xQQAChzCgz3EHAALTMKDPcQEAAoowoM9xAAACpTCgz3EA +AAKmMKDPcQAAAqcwoM9xBgACqDCgz3EGAAKpMKDPcQYAAqowoM9x/wAHxTCgz3H/AAfbMKDPcf8A +ByYwoM9x/wAHIzCgz3EYAAIfMKDPccwAAh5X8AfZlrkwoM9xAQAChzCgz3EDAALFMKDPcYAAAtsw +oM9xcAAChTCgz3FwAAKBMKDPcQYAAtMwoM9xIQACijCgz3EFAAKlMKDPcQUAAqYwoM9xBQACpzCg +z3EMAAKoMKDPcQwAAqkwoM9xDAACqjCgz3FEAAImMKDPcUQAAiMwoM9xKAACFjCgz3GZAAIVMKDP +cf8AB4IwoM9x/wAHhjCgz3H/AAcfMKDPcf8ABx4woOB+4HjxwFIJj//PdYAAFA8AjYDgHAACAM9w +AACQZQokAHDgeKggAAHgeOB4AdgArQbYkLjPdaAAxCcQpc9wgABsOUCAIoDPdqAA7CfPcIAATDGA +4gXyNngG2Za5BfBw4DZ4B9mWuTClz3EEAAe8MKXPcRAAB7gwpc9xCgAHvDClz3E/AALBMKUiiBC5 +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 +7/4A2RpwSHXPdoAAuA8A2ACm/9pBpkohgCAA2M9zpwA0RPgbGAAU4alwz3cAAHQmYH8B2yCGAqZB +hqlwFOFgfwLbIIYDpkGGqXB0uWB/AdsghgSmQYapcHS5YH8C2wWmAIbZ///aAKYIcc9wpwA0RPgY +mABBhqlwFOJgfwPbQYYCpiCGqXAU4mB/BNtBhgOmIIapcHS6YH8D20GGBKYghqlwdLpgfwTbBaYB +hsb/IIYIcgGmQiFAIIDgYgft/zpwz3OAALACgOUWIwMEBPQgs0GzBPAis0Oz6QLP/vHAigrP/hpw +KHZId891gAC4MH4N7/6pcM9xoADEJ4DmCfLPcDUAAgMQoc9wNQACBAjwz3AyAAIDEKHPcDIAAgQQ +oQpwyXHpcrb/gg3v/qlwnQLP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA +AAAAAAAAAAIAAAAPAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAF+gAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoPERQAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAtL/AAAAAgAZkEAfAAACAAHSAwAAAAIABNIAAAAA +AgAF0gAAAACCAArSbm4AAIIAGNIBAAAAggA80gAAAACCAE3SAAAAAIIAS9IDAAAAggAX0gEAAACC +AD3SAAAAAIIATtIAAAAAggBP0gAAAACCAEzSAAAAAIQAAgAfAAAAhQAAAAsAAACFAAYAQAAAAIUA +CAAJAAAAhQAJAAkAAACFAAoACQAAAIUAfwAMAAAAAAAAAAAAAAAAAAAAAAAAAAIAAtL/AAAAAgAZ +kEAfAACFAAcADwAAAIQAAAAAAAAAhAABAAAAAAACABfSAAAAAAIAUHAAAAAAAgBRcAAAAAACAFJw +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 +nQBkAR8AAQCCAALS/wAAAIIAGZBAHwAAAgAI0gAAAAACAAnSAAAAAAIARdIAAAAAAgBG0gAAAACC +AAXSAAAAAIIABtIAAAAAggA+kAAAAACCAEPSAAAAAIIARNIAAAAAAAAAAAAAAAAAAAAAAAAAAJQK +AACcCgAAuAoAANQKAADwBQAAmAoAAKgKAADECgAA4AoAAAwGAAAJAAAAAYAAEYAAFgQCIAASgAAW +BANAABCAABcEBOAAEIAAFwQFgAARgAAXBAYgABKAABcEB0AAEIAAGAQI4AAQgAAYBAmAABGAABgE +CiAAEoAAGAQLQAAQgAAZBAzgABCAABkEDYAAEYAAGQQOgAAQgAAaBCKAABgAABYAJAAAGQAAFgEm +AAAiAAAWASgAABoAABYBKoAAGgAAFgEsAAAgAAAXAS6AABgAABcBMAAAGQAAFwE0AAAaAAAXATaA +ABoAABcBOAAAIAAAGAE8AAAZAAAYAT4AACIAABgBQAAAGgAAGAFkAAAaAAAbAmaAABoAABsCaAAA +IAAAHAJsAAAZAAAcAm4AACIAABwCcAAAGgAAHAJ0AAAgAAAdAnaAABgAAB0CeAAAGQAAHQJ8AAAa +AAAdAn6AABoAAB0CgAAAIAAAHgKEAAAZAAAeAoYAACIAAB4CiAAAGgAAHgKMAAAgAAAfApFAABkA +AB8DlQAAIwAAHwOXwAAaAAAfA5lAABgAACADnUAAGQAAIAOfwAAZAAAgA6EAACMAACADpUAAGAAA +IQMAAwkAAwMJAAkAAwkOAAAAKgAAAAcAAAALAAAAAAIEBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIIAP +AABAAGkgAABpIEAAaSAAAGkgQAAgIIAPAADoAGkgAABpIEAAaSAAAGkgQAAgIIAPAABgAWkgAABp +IEAAaSAAAEogAABKIQAASiIAAEojAABKJAAASiUAAEomAABKJwAASiAAEEohABBKIgAQSiMAEEok +ABBKJQAQSiYAEEonABBKIAAgSiEAIEoiACBKIwAgSiQAIEolACBKJgAgSicAIEogADBKIQAwCiSA +P4AAAKBBLJwwQCycMEIkHDQKIoA/gAAIDwojADeaCAAASiYAcGkgQABKJgBwSiYAcEomAHBKJgBw +ABYAcIAABA9AeCAgQIcAAAAAAAAAAAAA4cWYcCh1BLjPcZ8A2P8SoQQkgA8A8AAARXgTobahgOMF +8s9wAG0AEBGh4H/BxeB4z3KfANj/EqIzomnYGLgRouB+4HjPcZ8A2P/Pcp8AuP8SoWrYGLgRoRyC +4H7gfuB44H7gePHA+gggAADZz3agAMAvFIbPcqAArC/PdaAAhDSLuBmiZYUYFQQQDBUFEBAVBhAU +huO4//WKIAgAFqLPdaAAyB/Pd6AA0BsOHViQDx1YkBAdWJARHViQPNji/08gQQA82Nv/aHAA2Ze5 +iHIB28z/EYf9uP/zAN+dv89xgADsAwHYEx3YkwChN4bPcIAABATIciCgOobPcIAACAQgoKhwANko +c7//Dx3Yk89wgADYAwAQGgDPcQBtABDPcJ8A2P8xoGkggABvIT8AmQAAAPwciLb8HEi2/BwItvwc +yLX8HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzIs/wciLP8HEiz4H7geATcON018OB4BNw0 +3TPw4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTdK/DgeATcIN0p8OB4BNwc3Sfw4HgE3Bjd +JfDgeATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c8OB4BNwE3RnwNBQaMDAUGTAsFBgwKBQX +MCQUFjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHGsCRNM7AkHzPgfg== +==== diff --git a/sys/contrib/dev/iwn/iwlwifi-4965-4.44.17.fw.uu b/sys/contrib/dev/iwn/iwlwifi-4965-4.44.17.fw.uu deleted file mode 100644 index a4e3587f0e5a..000000000000 --- a/sys/contrib/dev/iwn/iwlwifi-4965-4.44.17.fw.uu +++ /dev/null @@ -1,3398 +0,0 @@ -Copyright (c) 2006, Intel Corporation. -All rights reserved. - -Redistribution. Redistribution and use in binary form, without -modification, are permitted provided that the following conditions are -met: - -* Redistributions must reproduce the above copyright notice and the - following disclaimer in the documentation and/or other materials - provided with the distribution. -* Neither the name of Intel Corporation nor the names of its suppliers - may be used to endorse or promote products derived from this software - without specific prior written permission. -* No reverse engineering, decompilation, or disassembly of this software - is permitted. - -Limited patent license. Intel Corporation grants a world-wide, -royalty-free, non-exclusive license under patents it now or hereafter -owns or controls to make, have made, use, import, offer to sell and -sell ("Utilize") this software, but solely to the extent that any -such patent is necessary to Utilize the software alone, or in -combination with an operating system licensed under an approved Open -Source license as listed by the Open Source Initiative at -http://opensource.org/licenses. The patent license shall not apply to -any other combinations which include this software. No hardware per -se is licensed hereunder. - -DISCLAIMER. 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 MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER 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. -begin-base64 644 iwlwifi-4965-4.44.17.fw.uu -EQAsBPB/AQAAoAAASCgAAACgAAAUAwAAICCADwAAQABpIAAAaSBAAGkgAABpIEAAICCADwAA6ABp -IAAAaSBAAGkgAABpIEAAICCADwAACARpIAAAaSBAAGkgAABKIAAASiEAAEoiAABKIwAASiQAAEol -AABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQSiAAIEohACBKIgAgSiMA -IEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+AAACgQSycMEAsnDBCJBw0CiKAP4AAQDsKIwA3 -UgwAAEomAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAAgPQHggIECHAAAAAAAAAAAAAPHA4cXP -caAA0BtUgc9wgADoUUCgUIHPdaAAyB9BoFGBQqBSgUOgU4FEoM9ynwDY/w6iEYH9uA/yz3CAAOwD -AICB4An0z3CAACQPAIiC4CANAQaKIP8PEh0YkBMdGJAUHRiQFR0YkJUEAADgeADIz3KgAMgfDhoY -gAHIDxoYgALIEBoYgAMSATYEyCR4ERoYgOB+4HjxwOHFz3WgANAbEYXPcqAAyB/9uADbEfLPcYAA -7AMAgYLgC/QA2J24ExoYgGChICCADwAAAAAUhc9xgAAEDwQggI8DVwTxAKEK8i8pAQDPcIAA7Bbw -IEAAQHjg/wkEAAAAyIS4ABoYMAHIm7gBGhgwAsgCGhgwA8iHuAMaGDDgfvHAAMiVuAAaGDAByIq4 -m7gBGhgwA8gFIIAPAAAAfAMaGDBwyoHgDPQDyM9xAAAQCKy4AxoYMPILIAAL2GfYcgqgAIohxQbR -wOB+4HjPcQMAQA3PcKAAyB9DGFgAz3KAABwPIIIBaQCiOQSgAEjY4HjxwOHFANjPdQAAYAIIcfT/ -iiAHDalxCNqeCWAFGNtZAwAA4HjxwNoKAADPc4AABA+A4AbygeAG9AHYA/AA2AqrgOEG8oHhBvQB -2APwANgLqwDYz3WgANAbFqUKiwDez3GgALAfgOCdvg/yCIuA4A3yz3cDAEANz3CgAKgg66DUoQLY -FqUC8NWhC4uA4A/yCYuA4A3yz3AB4ACAFaXPcKAAyB8YEACGgrgWpYDiFvIA2ZS5z3CAABgPIKDP -cAAATBzPcRCAAABuC4AAz3CgAMgfGBAAhoO4FqWNAgAAz3CgAMgfGBAAhs9xoADQG6G4FqEA2J24 -z3GgALAfFaHgfuB4z3Gqqru7z3CfANj/LqAuoC6gLqDPcKAAyDsOgM9xoAC4P4i4EhkYgGkgQAD+ -8eB48cDhxaHBCiYAAQonQAFTJ801UyXENVMmxTXXukDDVgmgAKlzz3CgANAPAN21oM9xoADIOy6B -2gigAH3YOgugAKlwCNgA2b4KoACZueH/+QEgAKHA4cT8HMi+/BxIvuHA4cHhwuHD/BwIsfwcSLH8 -HIix/BzIsfwcCLL8HEiy/ByIsvwcyLLhxeHG4cf8HAi0/BwIv2okgBDhxGokwBDhxPHA63fPdqAA -0BtcFhAQz3AAAEQcAg+gAAolwB+4cM9wgACEJAOAgOAE8heG4rgh9M9wgAAYDwCACyBAgcogIgMR -9EwgQKAK8kwggKAI8kwgAKEI8g/YB/AN2AXwBNgD8A7YqXHpctDbCiQABL3/0cDBxGskwBDBxGsk -gBDBxJ90BBQQNMHHwcbBxQQUCzQEFAo0BBQJNAQUCDQEFAc0BBQGNAQUBTQEFAQ0wcPBwsHBwcDB -xEUsfhAKJkB+wcRrJIAUwcQgIICH8cDyD0AAddieD2AAiiHIDmYLAAC6CwABMP+eCQAABtgKIcAP -63KKIwkDSiQAAAolAAGa/9HA4H78HIi2/BxItvwcCLb8HMi1/ByItfwcSLX8HAi1/BzItPwciLT8 -HEi0/BwItPwcyLP8HIiz/BxIs+B+4HgE3DjdNfDgeATcNN0z8OB4BNww3THw4HgE3CzdL/DgeATc -KN0t8OB4BNwk3Svw4HgE3CDdKfDgeATcHN0n8OB4BNwY3SXw4HgE3BTdI/DgeATcEN0h8OB4BNwM -3R/w4HgE3AjdHPDgeATcBN0Z8DQUGjAwFBkwLBQYMCgUFzAkFBYwIBQVMBwUFDAYFBMwFBQSMBAU -ETAMFBAwAscBxrAkTTOwJB8z4H7xwE4Pz/8KJkCQCHUD8qDli/YF2AohwA/rcujbSiRAAF4N7/+4 -c89wgADsFrV4jQfv/8CgANmeuRl5z3CAAOQWAYDPcoAAaBYleOB/gBoAAADZnrkZec9wgADkFgGA -z3KAAGgWJnjgf4AaAAAA2Z65GXnPcIAA5BYBgCR4QiAAgMogYgDgfuB4z3CAAOQWAYDgfy8oAQDg -ePHAngrP/2kggAFvIT8A//HxwGrY3g1gAIohxAEA2I24jgygAQkaGDASzEQgPoUJ8s9wgACEEQCI -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 -QIDPcD8AAsEQpc9wYAACzBClz3ABAALLEKXPcAgAAokQpc9wdwACkBClz3DHAAKLEKXPcF8AAhgQ -pc9wBQACGRClz3ADAALAEKXPcCAAAl4Qpc9wYwACZRClz3AGAAJmEKXPcAEAAtgQpc9wYAAC0hCl -xg7v/wpwQQLP9mzx4HgA2g3wVHhjiCKIz3CsANQBAeJPejV4ixjYgM9wgADIFSCIMHLgIMoH7vHg -ePHA4cUIdc9xgADIAwWJgOAE9ASJgOAP8u//B9oA2M9xrADUAdgZgICA5cogoQLQGQCA9QHP9uB4 -8cDhxQh1IZBAkM9wowDY/VV4ihhYACCVKdgSuPAgQQABlTBwCvKSCG/3iiDRA4og0QOGCG/3IIW1 -Ac/28cDhxQh1IZBAkM9wqADUA1V4CxhYgCCVFdgTuPAgQQABlTBwCvJWCG/3iiDRA4og0QNKCG/3 -IIV5Ac/28cDhxQh1IZBAkM9wrADUAVV4ixhYgCCVK9gSuPAgQQABlTBwCvIaCG/3iiDRA4og0QMO -CG/3IIU9Ac/28cDhxQh1AJDPcqAA7CcIuE8gQQABlRC4JXjPcaAAxCcQoQCVCLhFIMAAEKEqggGV -MHAL8s4PL/eKINEDiiDRA8IPL/cghfUAz/bgeM9xrADUAQDYixkYgIwZGIAH2I0ZGIAG2ZG5z3Cg -AMQnMKDPcRgABwIwoM9ygAB0bzSKgOEF9M9xEAAGAjCgIIKA4VHyBtmWuTCgz3F4AAKFMKDPcQIA -AoEwoM9xVQACgjCgz3EQAAKGMKDPcUEAAocwoM9xBwAC0zCgz3EBAAKKMKDPcQAAAqUwoM9xAAAC -pjCgz3EAAAKnMKDPcQYAAqgwoM9xBgACqTCgz3EGAAKqMKDPcf8AB8UwoM9x/wAH2zCgz3H/AAcm -MKDPcf8AByMwoM9xGAACHzCgz3HMAAIeV/AH2Za5MKDPcQEAAocwoM9xAwACxTCgz3GAAALbMKDP -cXAAAoUwoM9xcAACgTCgz3EGAALTMKDPcSEAAoowoM9xBQACpTCgz3EFAAKmMKDPcQUAAqcwoM9x -DAACqDCgz3EMAAKpMKDPcQwAAqowoM9xRAACJjCgz3FEAAIjMKDPcSgAAhYwoM9xmQACFTCgz3H/ -AAeCMKDPcf8AB4YwoM9x/wAHHzCgz3H/AAceMKDgfuB48cC4cM9wgAB0bwAQBABMJACAANgO8s9y -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 -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAJQBAAABAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhhgAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAA/wAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wDw8PDw -8PDw8PDw8PDw8PDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWBgAAFgYAABYGAAASCEAAFgYAABY -GAAAICEAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAMgRAADUEQAAdBIAAKwS -AADAEwAAQBMAAFgYAABYGAAAhCUAADAoAADYKAAAWBgAAFgYAABYGAAAuCQAAFgYAAAEKgAARCsA -AFgYAABYGAAAWBgAAEwhAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAACEZQEA -0GYBAKBoAQDAZAEAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABY -GAAAWBgAAFgYAABYGAAAWBgAALxuAQCMbwEAcHEBAPhwAQBYGAAAkCEAAFgYAABYGAAAWBgAAFgY -AABYGAAAZCIAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgA -AFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAA -WBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAAA8AAEAOAMBAFgYAACcBQEAWBgAAEgHAQAA -zwAAANAAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAACIOwEAWE0BAFgYAABYGAAAWBgAAFgY -AABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAORTAQBYGAAAwFUB -AFgYAABYGAAAWBgAAEwUAAB4GwEAWBgAAFgYAAA0YwEADDEAAFgYAABYGAAAWBgAACTUAABYGAAA -WBgAALzDAABQIgEAWBgAAFgYAABYGAAAZDIBANjUAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAAD0 -JwEAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgY -AABYGAAAWBgAAFgYAABcMQAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgA -AFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAA -WBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABY -GAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgYAABYGAAAWBgAAFgY -AABYGAAAWBgAAFgYAADgIwAA5CMAAFgYAABYGAAAWBgAABgADfwOcw9wHSAfQCBAIUAiMSVmJg8n -ZigPKx0sRC0dLkQxEDIJMxA0CW9acABxAHIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQH -AADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAA5AcA -AOQHAADkBwAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAAzAgAAAAAAABsxgAA5AcAAOAGAADkBwAA -0BoBABQHAAAksgAA5AcAAOQHAADkBwAA5AcAAOQHAADkBwAAnAcAADgHAAA4BwAAOAcAADgHAAC0 -CAAA5AcAAOQHAADkBwAAsAcAAOQHAADkBwAA5AcAAOQHAADkBwAA0AgAAOQHAADkBwAA0AYAAAMA -AAAIYgEABAAAADTeAAAOAAAAMFMBAAgAAAAQHQEAAgAAAGRXAQAKAAAA8B0BAAsAAACcCQEADAAA -ANAJAQARAAAAKMYAAAkAAAAkAQEAEAAAAAgxAAANAAAAAMMAAAEAAAC40wAADwAAAHA4AQASAAAA -zAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAgICAgICAgIABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAABAAAAOMgAAAjJAAAUzAAATMoAAFDJAADgzAAAZM0AAJzNAADgzQAAAAAAACwBAABeAQAAAQAA -AAEAAAABAAAAAQAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAgAAAAMAAAADAAAAAwAAAAEAAAAAAAAA -AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArA0AAAAAAAAAAAAAAAAAAAD/AP8A/wD///8A/wD/ -AAABAAAAAAAAAAUAAAAAAAAAAAAAABAAAAAAgAAAAACgABAnAADoAwAA6AMAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUDAEA8A0BAHQQAQBgEgEA0BQBAAAYAQBQ -DwEAkA+AAGxXgAAYAAAATFeAAAAAAAAAAAAAXCaAAKRXgAAIGgEAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAECAgMEBAUGBgcICAkKCgsMDA0ODg9mZmdoaGlqamtsbG1ubm9wcHFy -cnN0dHV2dnd4eHl6ent8fH1+fhU/AAAAAAAAAAAAAAAAAAECAgMEBAUGBgcICAkKCgsMDA0oKCkq -KissLC1HSElJSktLTE1NTk9PUFFRUm1tbm9vcHFxcnNzdHV1dnd3eHl5ent8fQw/DCwBAFBwAAAM -LAEAUXAAAMAsAQBFAAAAwCwBAEQAAADALAEASQAAAMAsAQBIAAAADCwBAFJwAAAMLAEAU3AAAMAs -AQBOAAAAwCwBAE0AAADALAEAUgAAAMAsAQBRAAAADCwBAEDSAAAMLAEAQdIAAMAsAQBXAAAAwCwB -AFYAAADALAEAWwAAAMAsAQBaAAAADCwBAAjSAAAMLAEACdIAAEgsAQAAggAASCwBAAGCAAAMLAEA -RdIAAAwsAQBG0gAASCwBAACCAABILAEAAYIAAAwsAQAG0gAADCwBAD6QAAAMLAEAQ9IAAAwsAQBE -0gAADCwBAFDSAAAMLAEAUdIAAAwsAQBS0gAADCwBAFPSAAAMLAEAP5AAAAwsAQAT0gAADCwBAECQ -AAAMLAEAFdIAAAwsAQA/0gAADCwBAD7SAAAMLAEAP5AAAAwsAQAT0gAAZABkAGkA3ADIAFoAqgC+ -AIYBfQA+AGQAZABpANwAyABaAKoAvgCGAX0APgAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAkA+AAGxXgAAYAAAATFeAAAAAAAAAAAAATCqAAKRXgAAAAAAAkA+AAGxXgAAYAAAATFeA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAALAqgACkV4AArFsBAJAPgABsV4AAGAAAAExXgAAAAAAAAAAAAJAPgABs -V4AAGAAAAExXgAAAAAAAAAAAAMgqgACkV4AApGIBAAAUBQAAAAAAAAAAAAAAAAAAAAAA/wD/AAAA -AAA/ez91P24/aD9iPm4+aD5iPW49aD1iPG48aDxiO247aDtiOm46aDpiOW45aDliOG44aDhiN243 -aDdiNm42aDZiNW41aDViNG40aDRiM24zaDNiMm4yaDJiMW4xaDFiMG4waDBiJW4laCViJG4kaCRi -I24jaCNiIm4YaBhiF24XaBdiFm4WaBZiFW4VaBViFG4UaBRiE24TaBNiEm4IaAhiB24HaAdiBm4G -aAZiBW4FaAViBG4EaARiA24DaANiAm4CaAJiAW4BaAFiAG4AaABiAF0AWABTAE4/bj9oP2I+bj5o -PmI9bj1oPWI8bjxoPGI7bjtoO2I6bjpoOmI5bjloOWI4bjhoOGI3bjdoN2I2bjZoNmI1bjVoNWI0 -bjRoNGIzbjNoM2IybjJoMmIxbjFoMWIwbjBoMGIGbgZoBmIFbgVoBWIEbgRoBGIDbgNoA2ICbgJo -AmIBbgFoAWIAbgBoAGIAYQBgAF8AXgBdAFwAWwBaAFkAWABXAFYAVQBUAFMAUgBRAFAATwBOAE0A -TABLAEoASQBIAEcARgBFAEQAAP////////8AAf//AgP///8E//////////////////////8F/wb/ -B/8I/wn/Cv8L/wz///8N////Dv///w////8Q//////////////////////////////////////// -//////8R////Ev///xP///8U////Ff///xb///8X////GP///xn///8a////G/////8c////Hf// -/x7///8f////IP///yH//////////////////////yIjJP8lJif//yj///8p//////////////// -//////////////////////////////////////////////////////////////8AAAAADwA/AAEA -AAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAgAA -AAEAAAAsBAGlAC0qJyQhHhsYFRIPDAkGAwAMCAQAPDg0MCwoJCAcGBQQDAgEf/8HDx8/AQMBAw8H -AQcPHz9///8FAAcCAwQGBnTRRRfooosuDQ8FBwkLAQMKFDduVVVVAUtoLwFVVVUF4ziOA6qqqgJx -HMcBqqqqCsdxHAcPDw8HBgcCAwQFAAEICQsKKAAoADAALAAsACgAPAA0ACgAKAA0ADAALAAsAEQA -PABAADwAjABsAFgASAD0ALAALAAsADwANAAwACwAVABEAFQAVABsAGAAXABUAIwAeAA6AQIB1QDf -ANoAogB1AH8AagEaAdkA6AAKAboAeQCIAIoFKgM5AagBigXKAtkASAHKAUoB4gD5AMoB6gCCAJkA -9AJEArUB1QGUAoQB9QBBAqwAkACEAIAAeAB4AHgAdABmDgAAiZ3YCcRO7ASDNEgDYid2AkEapAGx -EzsBgREYAcAP/AAvob0El9BeAg+LlAFLaC8Bh0XKACW0lwAF2YYA61x5AKqqqgoADQAAABoAAAAn -AAAANAAAAE4AAABoAAAAdQAAAIIAAAAbAAAANgAAAFEAAABsAAAAogAAANgAAADzAAAADgEAndiJ -nU7sxE40SIM0J3ZiJxqkQRoTO7ETERiBEQ/8wA9O7MROJ3ZiJxqkQRoTO7ETDdIgDYmd2AkIjMAI -B37gBzRIgzQapEEaERiBEQ3SIA0IjMAIBmmQBrCy1QUFVEAFJ3ZiJxM7sRMN0iANiZ3YCQZpkAbE -TuwEBEZgBAM/8AOqqqqqGqRBGhM7sRMP/MAPERiBEQ3SIA0KqIAKEzuxEw/8wA8P/MAPDdIgDQu0 -QAsLtEALiZ3YCQ3SIA0KqIAKCqiACgiMwAgHeIAHB3iABwZpkAYP/MAPDdIgDQu0QAsN0iANC7RA -C4md2AkIjMAIiZ3YCQiMwAgHfuAHB37gB8EsKQcKqIAKCIzACAd4gAcIjMAIB3iABwZpkAawstUF -BmmQBrCy1QUFVEAFBVRABdYdxgQAAAAAAAAAABggFBQODhQUBQYBAgMEAAAAAAAAAAcICAAAAAcK -DRARAAAABwsOEBEABwsOFRsfIgAAAAAHCgsNAAAHCg8VFxoAAAgLEBUYGwALEBYhLDE2AAAABwsP -EBIABwsPFh0hJAAIDA8XHiIlCA8XHi08REsACAsPFh0hJQgPFh0sOkJJCBAXHy49REwQHy49W3mI -lwAHBw8HDw8PBAwMCAQMBARAAAAAgAAAAAABAAAAAgAAQAAAAAAEAABAAAAAQAAAADMTAAAABQoP -AQEAAQIBAQGlxoT4me6N9g3/vdax3lSRUGADAqnOfVYZ52K15k2a7EWPnR9AiYf6Fe/rssmOC/vs -QWez/V/qRb8j91OW5FubwnUc4a49akxabEF+AvVPg1xo9FE00Qj5k+Jzq1NiPyoMCFKVZUZenSgw -oTcPCrUvCQ42JJsbPd8mzWlOzX+f6hsSnh10WC40LTay3O60+1v2pE12YbfOfXtSPt1xXpcT9aZo -uQAALMFgQB/jyHnttr7URo3ZZ0ty3pTUmOiwSoVruyrF5U8W7cWG15pVZpQRz4oQ6QYEgf7woER4 -uiXjS/Oi/l3AgIoFrT+8IUhwBPHfY8F3da9jQjAgGuUO/W2/TIEUGDUmL8PhvqI1zIg5LleT8lWC -/Ed6rMjnuisyleagwJgZ0Z5/o2ZEflSrO4MLyowpx9NrPCh5p+K8HRZ2rTvbVmROdB4U25IKDGxI -5Lhdn26970OmxKg5pDE304vyMtVDi1lut9qMAWSx0pzgSbTY+qwH8yXPr8qO9OlHGBDVb4jwb0py -XCQ48VfHc1GXI8t8oZzoIT7dltxhhg2FD5DgQnzEcarM2JAFBgH3Ehyjwl9q+a7QaZEXWJknOrkn -ONkT67MrMyK70nCpiQenM7YtIjySFSDJSYf/qnhQeqWPA/hZgAkXGtplMdfGhLjQw4KwKXdaER7L -e/yo1m06LJSfAAAUnAAACJ8AAMScAABEQQAAREIAAMBAAACEQgAAAADAAHBEoABsAACAAACwAAQI -oAAAAAAABACwABgIoAABAAAAAACwABwIoAADAAAAAACwAOwcoAAwAAAAAACwAFAUoAADAAAAAACw -AAQYoAADAAAAAACwAEBEoAAAAAAAAACwABgIoAAAAAAAAAAAAAQooAACAQAAAAAAAFxIpwAAAAAA -AAAAAAQooAACaQAAApDxAAQooAABAAAAAIABABgooAAAAAAAAAAAAPAcoAACAAAAAAAAAOwcoAAB -AAAAAKABAAgArAAAAAAAABACADBApAAAAAAAAAAAABAcoAAAAHAAAAAAAOAcoAAAAAAAAAAAgCQQ -oAABAAAAAAAwACQQoAAAAAAAAAAAADgcoAAAgAAAAACAAjgcoAAAAAEAAFBAAAQooAACAwAAAGBQ -AAQooAACBAAABCAAAAQooAABAAAAAEAAAAgArAAAAAAAAACgAOwcoAACAAAAAACQAHBEoAAkAACA -ALACAAAIqgAAAAAAAMACAAQIqgAAAAAABQAQAXBEoACEAACAADAAABgooAAAAAAAAAAAADgcoAAA -AAEAAIAAAOAcoAAAAAAAAHCgAAgIqgAAAAAAAJCgAAQAqgAAAAAAAHCQAChIpwAAAAAAAJCQAAAA -pgAAAAAAAwAAAAQIoAADAAAAAAAAAKQgoAAAAAAAAAAAgAAgoAAAAGAAAAAAgDgcoAAAAAEAAKAB -gAgArAAAAAAABJABAAQooAABAAAAAJABAAQooAABAAAAAKABgAgArAAAAAAAAAAAAFxIpwABAAAA -ACACAAgArAAAAAAAAAAAADBJpwACAAAAAAAAAAQooAACAUAAAAAAAAhIpwD/AAAAAAAAAAQooAAC -aSEAAAAAAGRApgAACAAAAAAAACxJpwAAAAAAAAAAgABIpwABAAAAAQIBAgMEAAAFBgcICQoAAAAF -BgACBAAAAAUHAQMEAABAI0AlISEhIUBAQEBABQQEAQFAQEBABQVAQAwMQA0MDAEBAQVAQAUFAAQA -BEBAAARAQEAFQEBAQEAFQEBABQUFAQEBAUAFBQUBBQEBQAUFBUAFQAUFBQUFBAAAABwRAAAcMgAA -HDMAAAQAAAAcFQAAAAAAAAAAAABkAAAAAJABAAoAAAAABAQHAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAABxAkAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAA -AP8AAAAAAAAAAQAAABAAAAAAAAAAAQAAAAEAAAAAAAAA/wAAAP8AAAAAAAAAAAAAABBhAQBkAgEA -aAIBAGwCAQDIAgEA0AIBANgCAQAABAsJFSUvAAAEEQkcJzIAAYAAEYAAFgQCIAASgAAWBANAABCA -ABcEBOAAEIAAFwQFgAARgAAXBAYgABKAABcEB0AAEIAAGAQI4AAQgAAYBAmAABGAABgECiAAEoAA -GAQLQAAQgAAZBAzgABCAABkEDYAAEYAAGQQOgAAQgAAaBCKAABgAABYAJAAAGQAAFgEmAAAiAAAW -ASgAABoAABYBKoAAGgAAFgEsAAAgAAAXAS6AABgAABcBMAAAGQAAFwE0AAAaAAAXATaAABoAABcB -OAAAIAAAGAE8AAAZAAAYAT4AACIAABgBQAAAGgAAGAFkAAAaAAAbAmaAABoAABsCaAAAIAAAHAJs -AAAZAAAcAm4AACIAABwCcAAAGgAAHAJ0AAAgAAAdAnaAABgAAB0CeAAAGQAAHQJ8AAAaAAAdAn6A -ABoAAB0CgAAAIAAAHgKEAAAZAAAeAoYAACIAAB4CiAAAGgAAHgKMAAAgAAAfApFAABkAAB8DlQAA -IwAAHwOXwAAaAAAfA5lAABgAACADnUAAGQAAIAOfwAAZAAAgA6EAACMAACADpUAAGAAAIQNwTAEA -kD0BAFw/AQCQQAEAvEIBAARFAQC8SAEAUEoBAHRLAQB4WAEAkFgBAPxYAQAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0A -EAATABYAGgAgACYALQA1AEAATABaAGsAgACYALQAJgAtADUAQABMAFoAawCAAJgAtADWAAABMAFp -Aa0BAAJrAIAAmAC0ANYAAAEwAWkBrQEAAmAC0wJdAwAEwQSmBTABaQGtAQACYALTAl0DAATBBKYF -twYACIIJTAtuDQAQUABfAHEAhwChAL8A4wAPAUIBfwHHAR4ChAL+Ao4DPAT///////////////// -////////////////////////////////////////////////////////////////////MAFpAa0B -AAJgAtMCXQMABMEEpgW3BgAIgglMC24NABAAAAAAAAIEBgMJBgkACQAJAAkACQAJAAAAAAAAAAAA -AAAAAAAAAAAA/////wAAAABgAAAABQUFBQUFBQUAAAAAAQAAAAAAAAAAAAAAAAAAAAAOAAAADgAA -AA4AAAAOAAAABAAAgAAAAIAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAICCADwAAQABpIAAAaSBAAGkgAABpIEAAICCADwAA6ABpIAAA -aSBAAGkgAABpIEAAICCADwAAGAFpIAAAaSBAAGkgAABKIAAASiEAAEoiAABKIwAASiQAAEolAABK -JgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQSiAAIEohACBKIgAgSiMAIEok -ACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+AAACgQSycMEAsnDBCJBw0CiKAP4AADCcKIwA3UggA -AEomAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAAQPQHggIECHAAAAAAAAAAAAAIoh/w/PcKAA -yB8TGFiAICCADwAAAADgfuB+4HjxwFYJIAAB2M91AACECEB9z3agAMAvFIbPd6AArC+LuBmnFIbj -uP/1YH0C2IogCAAWp2B9A9jPd6AAyB8A2A4fGJAPHxiQEB8YkBEfGJCOCyAAPNhPIEEAGgogADzY -SgtAAGIKAABgfQXYz3GgAIQ0BIHPcqAAvDf/uPnzFBESABgREwAMEREABIHTuBpwNhoYgGB9B9jP -cYAAAA8CIYAPgAAAAEEoAgEAIoMEAiMCIGhwMghgAAHbYH0J2M9woADQGxGA/bj882B9CtgA2J24 -Ex8YkGB9C9jPcYAA7AMC2AChN4bPcIAABAQgoDqGz3CAAAgEIKBgfQzYKnAA2Qpy4g8gAChzANid -uA8fGJDPcIAA2AMAEBoAz3EAbQAQz3CfANj/MaBgfQ3YaSCAAG8hPwB9AAAA4Hj8HIi2/BxItvwc -CLb8HMi1/ByItfwcSLX8HAi1/BzItPwciLT8HEi0/BwItPwcyLP8HIiz/BxIs+B+4HgE3DjdNfDg -eATcNN0z8OB4BNww3THw4HgE3CzdL/DgeATcKN0t8OB4BNwk3Svw4HgE3CDdKfDgeATcHN0n8OB4 -BNwY3SXw4HgE3BTdI/DgeATcEN0h8OB4BNwM3R/w4HgE3AjdHPDgeATcBN0Z8DQUGjAwFBkwLBQY -MCgUFzAkFBYwIBQVMBwUFDAYFBMwFBQSMBAUETAMFBAwAscBxrAkTTOwJB8z4H7hxaHBCHPPdYAA -CA8BlQAchDBPIMIDAeAQeAIchDCPuAG1R2kEIoIPAAD8/+xwQKAAwkCgIrkF8ECgBONhuYHhQIM8 -989woADQDw4YmIChwOB/wcXxwPYO7/+YcM9woADMK9SAANrPdaAAwC8XHZiQz3OfANj/FYPPcp8A -uP/m3/2i94MEJ76fAPAAAPv1HaJoGgABO6Jp2Bi4GaIXHZiTEQfP//HAqg7v/wDZu8GPuc91gAAI -DyG1ANkhrc9yAQAsBEDCQcFCwQHbz3KAAEglQIpjw0fAz3CAALQODRyCMA4cwjAPHEIwz3KAAHwQ -RMLPcoAA7A9FwkbBAIBKJIBwSMCoIIAHz3CAALgO8CBCABUkQDBJoM9ygADADvAiQgBLoM9ygADI -DvAiQgBNoM9ygADQDvAiQgAB4U+gANkF2kokgHAA26ggAAMSazZ4z3aAANgOBmaDcAHj0aBhuoDi -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 -puFI9xYjQgBAilBw+fUK8M9wAAAHMCoJz/9vIT8AANnRwOB/KHDgeM9wgABsLQGAzvHgeM9wgABs -LUCAIoDPcIAATCWA4jZ4A/LgfweI4H93EIAAz3GsANQBANiLGRiAjBkYgAfYjRkYgAbZkbnPcKAA -xCcwoM9xGAAHAjCgz3KAAGwtNIqA4QX0z3EQAAYCMKAggoDhUfIG2Za5MKDPcXgAAoUwoM9xAgAC -gTCgz3FVAAKCMKDPcRAAAoYwoM9xQQAChzCgz3EHAALTMKDPcQEAAoowoM9xAAACpTCgz3EAAAKm -MKDPcQAAAqcwoM9xBgACqDCgz3EGAAKpMKDPcQYAAqowoM9x/wAHxTCgz3H/AAfbMKDPcf8AByYw -oM9x/wAHIzCgz3EYAAIfMKDPccwAAh5X8AfZlrkwoM9xAQAChzCgz3EDAALFMKDPcYAAAtswoM9x -cAAChTCgz3FwAAKBMKDPcQYAAtMwoM9xIQACijCgz3EFAAKlMKDPcQUAAqYwoM9xBQACpzCgz3EM -AAKoMKDPcQwAAqkwoM9xDAACqjCgz3FEAAImMKDPcUQAAiMwoM9xKAACFjCgz3GZAAIVMKDPcf8A -B4IwoM9x/wAHhjCgz3H/AAcfMKDPcf8ABx4woOB+4HjxwFIJj//PdYAAFA8AjYDgHAACAM9wAACQ -ZQokAHDgeKggAAHgeOB4AdgArQbYkLjPdaAAxCcQpc9wgABsLUCAIoDPdqAA7CfPcIAATCWA4gXy -NngG2Za5BfBw4DZ4B9mWuTClz3EEAAe8MKXPcRAAB7gwpc9xCgAHvDClz3E/AALBMKUiiBC5BSGB -DwAAArIwpSGIELkFIYEPAAACszClJYgQuQUhgQ8AAAK0MKUkiBC5BSGBDwAAArUwpSOIELkFIYEP -AAACtjClBogQuAUggA8AAAK3EKXPcAQABrwQpc9wAQAGsRClz3ADAAauEKXPcAEABrwQpc9wAwAG -ABClz3AIAAa8EKXPcBAABrgQpc9wAACgKAokAHDgeKggAAHgeOB4z3AgAAa8EKXPcAAAKAoKJABw -4HioIAAB4HjgeM9wAAAD8BCl6obPcCAAB7wQpc9wAAAD7xClqoaEJwEfqXCEIAEI4OAivwnyz3AA -AAkw5g2P/28hPwCG58S9VPeP5colYRTAJWIQEL0FJY0fAAAC289xoADEJ7Chz3AEAAe8EKEVAI// -8cDhxc9woAAsIL2AgCUGFAjwz3AAAAgwlg2P/28hPwDPcgAAA/DPcaAAxCfPcKAA7CdQoQqA57gI -9M9woAAsIB2AEHVu9+fx2QdP/+HF/NnPcqwAHAAmonPZJ6Jw2SiiINk2olrZz3WsAJABK6UH2Sel -gOAA2wTyZaUE8ArYBaVA2BiiGaIaouB/wcXxwOHFz3WAAGwtAKUhpVSt/gvv/3WtBgzv/wKlHgzv -/wOlrg3P/9T/FI3m/2kHT//xwOHFWgqv/37Yz3GAABgPCLGAuBC4BSCADwAAAn7PdaAAxCcQpc9w -gACMHMIJj//PcAAAATQQpS0HT//xwOHFosEeCq//d9gIcc9wgAAYD0SQhCEBDMO6h7pFeRC5BSGB -DwAAAnfPcqAAxCcwogCIz3OnADREz3WAAIwcHXj2GxgABpXPcaYAuDwdeusZmAAZ2fMbWAD6Ca// -JbiLcCYKr/+BwQHBAMA4YAi4Sgnv/yaVtQZv/6LA8cDhxQLYz3WAABgPAK3e/wK4FXgVeAoJ7/+K -IQYCkQZv/wOl8cDhxQzYz3WAABgPAK0Q8CK1DvAAIECAwCBkABx4BLXQ/0OFUHAklbT3I7UjlQKV -QWlQcDD2BLXK/wWlA5UEtcj/Q4UlhUJ5gOEGpUL2M3lCeIDgQvYTeBBxRPYClQPwA5UpBm//AbXx -wK4Nb/932BIJj//PdoAAGA8kloQgAQzPdaAAxCfDuYe5JXgQuAUggA8AAAJ3EKXqCK//edgkloQg -AQzDuYe5JXgQuAUggA8AAAJ5EKXNBU//4HjxwOHFz3CAABgPCJDPdaAAxCcQuAUggA8AAAJ+EKXP -cIAAjBxuCI//AdgQpaEFT//xwADYKNkB2gIO7/8Ic4v/uP/B/9r/7//RwOB+8cACDU//osEIdzpx -z3CnADREAdnzGFgAz3WAAEwdBpWKCK//JbiLcBIJr/+BwaaVAMC+Zbhg3g+v/8lxGnABwLhg0g+v -/8lxQcAAHwAUAcEAGUAgDQVv/6LA4HjxwIYMT/8acTNoz3KAAPwdNHlAIgAFKGA6YhQiAgQkiowh -w4/lirPyCLhPIFIAz3KAAOwdFCIRBAARgCDPdqAAxCfPdYAANA8IuRC4BSCABBCmgbkAjXpxCL+B -vxC4BXkwpuV4EKYEbUAlARLO/wERgSAQuQUhgAQQpiCNELkFIcAEEKbleTCmQCUAE0AlARTF/wAR -gSAQuQUhgAQQpgGNELgFIMEE5XgwphCmQCUAFUAlARa8/wERgCAQuAUggAQQpgGNELgFIMEE5Xgw -phCmQCUAF0AlARiz/wOFIYXacAIgUgAFhSeFQnACIECAOnAEhbpxIoX6cCJ45oWacB9nCIUbcAJ/ -zCcikEHyAI3BjUEpzScqcXpwAn4ELr4UInW8fZYOr/8AJUAeACDZBAQuPhVBL84X/mbcfgAmQB56 -Dq//6XEAIxMgAiZAJQQovgQAIUBzYg6v/ypxAiYNIAInASYEKT4FACGAc04Or//pcQInAiDPcYAA -hC0WIQEEABlEBgIZxASisUOxPQNP/+B48cAeC0//CHfPcIAATB0SDm//AN7PcKcAMExAGNiDCN3p -cMlxk/9hvYDlAeY6989wgABMHSYOT/9NA0//BbgUeMdwgACAAM9ygACELWKaNngjmmCwIbAgmiSo -PJolqCGaJqg9muB/J6jxwLYKb/+YcCh2AN0M3zMmS3OAAOwmQCcMcxQkzBIAfIDmC/QD8IHmB/SI -cKlx6v8D8ILm+/Nhv4Dn1gft/wHl3QJP//HAbgpP/wDfSiBAIc9wgABYHs9xgABEHvAgwAPwIcED -AdoA3TIL7/+pcwPeqXDK/+lwqXHi/2G+gOYB5Tj3AedCIEAggOAacCL3z3GAAAAAAdiBAm//AKHx -wBYKT/9od4DgCiAAIQr0z3CnADRE+xhYAPwYmAAJ8M9wpwAwTDkYWIA6GJiAz3CnADREAdnzGFgA -z3WAAGweBpV6DW//JbjPdoAAWA/JcJ4Nb/8kbgCGJpUGuMYMr/8kuQCnAYYmlQa4ugyv/yS5CQJv -/wAYACAMeS9wTHvgfwIgQA7xwIoJT/9acBpxOnLPdoAAWA9khgOGp4YlhkaGuWGieqKGYni7Y891 -AADgGEB9mHAnhuaGAidAEEOGIoZkhkJ5YnplhmB94nvYcCOGYoYCI0AAJ4ZFhuaGWWHieuSGYH37 -Ywh3RIYjhgIhgABGhmWGAiOFAGeGYnpihiJ7YH2ocQh1QixBATq5gHFGuQQpvgQvcEIuQQE6ucBx -Bgyv/0a5ABgAID1vOrn5YUa5BCm+BC9wPW06ublh5guv/0a5KQFv/wAZACDgePHAwghP/xpwKHVa -cjpzz3aAAGAPyXNAJgQTKHKm/7N/ZG5AJgQUCnCpcelyov9AJgMSQCYEFQpw6XHpcp7/qXBKcSpy -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 -yXHpcrb/gg3v/qlwnQLP/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA -AAAAAAIAAAAPAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAF+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoPERQAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -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 -KAAGAQgAAAAqAAgBCQAAACwACgEKAAAALgAMAQsAAAAwAA4BDAAAADQAEAENAAAAOAASAQ4AAAA8 -ABQBDwAAAEAAFgEQAAAAZAAaAREAAABoABwBEgAAAGwAHgETAAAAcAAgARQAAAB0ACIBFQAAAHgA -JAEWAAAAfAAmARcAAACAACgBGAAAAIQAKgEZAAAAiAAsARoAAACMAC4BGwAAAJEAMgEcAAAAlQA0 -AR0AAACZADYBHgAAAJ0AOAEfAAAAoQA6ASAAAAClADwBIQAAACQAUAEGAAIALABSAQoAAgA0AFQB -DQABADwAVgEPAAEAZABYAREAAQBsAFoBEwABAHQAXAEVAAEAfABeARcAAQCEAGABGQABAJUAYgEd -AAEAnQBkAR8AAQCCAALS/wAAAIIAGZBAHwAAAgAI0gAAAAACAAnSAAAAAAIARdIAAAAAAgBG0gAA -AACCAAXSAAAAAIIABtIAAAAAggA+kAAAAACCAEPSAAAAAIIARNIAAAAAAAAAAAAAAAAAAAAAAAAA -AJQKAACcCgAAuAoAANQKAADwBQAAmAoAAKgKAADECgAA4AoAAAwGAAAJAAAAAYAAEYAAFgQCIAAS -gAAWBANAABCAABcEBOAAEIAAFwQFgAARgAAXBAYgABKAABcEB0AAEIAAGAQI4AAQgAAYBAmAABGA -ABgECiAAEoAAGAQLQAAQgAAZBAzgABCAABkEDYAAEYAAGQQOgAAQgAAaBCKAABgAABYAJAAAGQAA -FgEmAAAiAAAWASgAABoAABYBKoAAGgAAFgEsAAAgAAAXAS6AABgAABcBMAAAGQAAFwE0AAAaAAAX -ATaAABoAABcBOAAAIAAAGAE8AAAZAAAYAT4AACIAABgBQAAAGgAAGAFkAAAaAAAbAmaAABoAABsC -aAAAIAAAHAJsAAAZAAAcAm4AACIAABwCcAAAGgAAHAJ0AAAgAAAdAnaAABgAAB0CeAAAGQAAHQJ8 -AAAaAAAdAn6AABoAAB0CgAAAIAAAHgKEAAAZAAAeAoYAACIAAB4CiAAAGgAAHgKMAAAgAAAfApFA -ABkAAB8DlQAAIwAAHwOXwAAaAAAfA5lAABgAACADnUAAGQAAIAOfwAAZAAAgA6EAACMAACADpUAA -GAAAIQMAAwkAAwMJAAkAAwkOAAAAKgAAAAcAAAALAAAAAAIEBgAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIIAPAABA -AGkgAABpIEAAaSAAAGkgQAAgIIAPAADoAGkgAABpIEAAaSAAAGkgQAAgIIAPAABgAWkgAABpIEAA -aSAAAEogAABKIQAASiIAAEojAABKJAAASiUAAEomAABKJwAASiAAEEohABBKIgAQSiMAEEokABBK -JQAQSiYAEEonABBKIAAgSiEAIEoiACBKIwAgSiQAIEolACBKJgAgSicAIEogADBKIQAwCiSAP4AA -AKBBLJwwQCycMEIkHDQKIoA/gAAIDwojADeaCAAASiYAcGkgQABKJgBwSiYAcEomAHBKJgBwABYA -cIAABA9AeCAgQIcAAAAAAAAAAAAA4cWYcCh1BLjPcZ8A2P8SoQQkgA8A8AAARXgTobahgOMF8s9w -AG0AEBGh4H/BxeB4z3KfANj/EqIzomnYGLgRouB+4HjPcZ8A2P/Pcp8AuP8SoWrYGLgRoRyC4H7g -fuB44H7gePHA+gggAADZz3agAMAvFIbPcqAArC/PdaAAhDSLuBmiZYUYFQQQDBUFEBAVBhAUhuO4 -//WKIAgAFqLPdaAAyB/Pd6AA0BsOHViQDx1YkBAdWJARHViQPNji/08gQQA82Nv/aHAA2Ze5iHIB -28z/EYf9uP/zAN+dv89xgADsAwHYEx3YkwChN4bPcIAABATIciCgOobPcIAACAQgoKhwANkoc7// -Dx3Yk89wgADYAwAQGgDPcQBtABDPcJ8A2P8xoGkggABvIT8AmQAAAPwciLb8HEi2/BwItvwcyLX8 -HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzIs/wciLP8HEiz4H7geATcON018OB4BNw03TPw -4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTdK/DgeATcIN0p8OB4BNwc3Sfw4HgE3BjdJfDg -eATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c8OB4BNwE3RnwNBQaMDAUGTAsFBgwKBQXMCQU -FjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHGsCRNM7AkHzPgfg== -==== diff --git a/sys/contrib/dev/iwn/iwlwifi-5000-8.24.2.12.fw.uu b/sys/contrib/dev/iwn/iwlwifi-5000-8.24.2.12.fw.uu new file mode 100644 index 000000000000..72e45e32920e --- /dev/null +++ b/sys/contrib/dev/iwn/iwlwifi-5000-8.24.2.12.fw.uu @@ -0,0 +1,6239 @@ +Copyright (c) 2006-2009, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. 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 MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER 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. +begin-base64 644 iwlwifi-5000-8.24.2.12.fw.uu +DAIYCIz+AQAAwAAANOUBAADAAAAAAAAAICCADwAAQABpIAAAaSBAAGkgAABpIEAAICCADwAA6ABp +IAAAaSBAAGkgAABpIEAAICCADwAAnAVpIAAAaSBAAGkgAABKIAAASiEAAEoiAABKIwAASiQAAEol +AABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQSiAAIEohACBKIgAgSiMA +IEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+AAADAQSycMEAsnDBCJBw0CiKAP4AA8FoKIwA3 +Gg8AAEomAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAFgEQHggIECHAAAAAAAAAAAAAArIz3Gg +AMgfDhkYgAvIDxkYgAzIEBkYgA0SAjYAyER4ERkYgA7ILRkYgOB+4cT8HMi+/BxIvuHA4cHhwuHD +/BwIsfwcSLH8HIix/BzIsfwcCLL8HEiy/ByIsvwcyLL8HAi/aiSAEOHEaiTAEOHE8cDPcKAA0BsU +gM9xgABUBAQggI/PUQThAKEK8i8pAQDPcIAAPAnwIEAAQHja/9HAwcRrJMAQwcRrJIAQwcSfdAQU +CzQEFAo0BBQJNAQUCDQEFAc0BBQGNAQUBTQEFAQ0wcPBwsHBwcDBxEUsfhAKJkB+wcRrJIAUwcQg +IECHCsiHuAoaGDALyJu4CxoYMAzIDBoYMA3Ih7gNGhgwDsiFIMMPDhoYMOB+4HjxwArIlbgKGhgw +C8ibuAsaGDANyIq4jbiQuA0aGDDPcIAAZAoYiIHgC/QNyM9xAACgCqy4DRoYMM4NIAAP2GfY5g7g +AIohhgjRwOB+z3CAAOSbAICGIP6BCPQNyAUggA8AAADUDRoYMEDx4HjxwM9xAwBADc9woACoIC2g +z3KAAJQEIIIBaQCiWg4gAUjYz3CAAKAIJYAjgSCBx3EAAIgTjgyACNLx4HjPcIAAoAgdBIAI4Hjx +wMoKQAGA4M92gABUBAbygeAG9AHYA/AA2AuugOEG8oHhBvQB2APwANgKroDiBvKB4gb0AdgD8ADY +DK4A2M91oADIHxgdGJALjoDgiiEQAA7yCI6A4Azyz3ADAEANRR0YEDClAtgYHRiQA/AxpQqOgOAa +8gmOgOAW8s9wAQCK/iAdGJDPcIAAJAAhHRiQz3CAAFAEIh0YkBgVAJZFIAADGB0YkAyOgOAH8hgV +AJaFIAEEGB0YkIDjGPIA2JS4z3aAAIgEAKZx2Aa4tgggAfzZIIbPcAAATBymCCABn7kYFQCWhbgY +HRiQTQJAAc9xqqq7u89wnwC4/zagNqA2oDagz3GgAMg7DoGIuA6haSBAAP7x4HjxwKXBQcBCwQwc +ADEQHEAxz3GAAPxbNBnADzAZAA8sGcAOKBmADiQZQA7PcIAA/FsgGEALz3CAAPxbHBgAC89wgAD8 +WxgYwArPcIAA/FsUGIAKz3CAAPxbEBjACM9wgAD8WwwYgAjPcIAA/FsIGEAIz3GAAIBbgBkACHwZ +wAd4GYAHdBlAB3AZAAdsGQAHaBmABmQZQAZgGQAGXBnABVgZgAVUGUAFUBkABUwZwARIGYAERBlA +BEAZAATvoc6hraGMoSwZwAIoGYACJBlAAiAZAAIcGcABGBmAARQZQAEQGQABY6FqIAAD2BkAAGog +wALUGQAAaiCAAtAZAABqIEAByBkAAGogAAHEGQAAaiDAAMAZAABqIIAAvBkAAGogQAC4GQAAaiAA +ALQZAABqIIABzBkAANDYn7jPcZ8AuP8doc9wgAAAAMSAUyXENVMmxTXXugHm077EoFMjwAQFJo4f +0P4AANahBSCAD7D+AAAWoRiBUyfONQDdlLgYoUDDAcACwclzDBQGMCYM4AAQFAcwz3CgALQPvKDP +caAAyDsugb4L4AB92FoMQAH2DuAAqXAI2ADZtg7gAJm5EPHxwM4PIAF72JoL4ADX2c9xgAD8WzQZ +wA8wGQAPLBnADigZgA4kGUAOz3CAAPxbIBhAC89wgAD8WxwYAAvPcIAA/FsYGMAKz3CAAPxbFBiA +Cs9wgAD8WxAYwAjPcIAA/FsMGIAIz3CAAPxbCBhACM9xgACAW4AZAAh8GcAHeBmAB3QZQAdwGQAH +bBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlABVAZAAVMGcAESBmABEQZQARAGQAE76HOoa2hjKEs +GcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUABEBkAAWOhaiAAA9gZAABqIMAC1BkAAGoggALQGQAA +aiBAAcgZAABqIAABxBkAAGogwADAGQAAaiCAALwZAABqIEAAuBkAAGogAAC0GQAAaiCAAcwZAADr +ds91oADIHxkVEZbPcAAARBxOCiABCiDAL1pwz3CAANwoI4DPc58AuP/Pd4AAAAAEh4DhAeDTuCTy +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 +BwBCJSaiz3EAAII+JqLPcQAAQj4mos9xAQCCPiaiz3EBAEI+JqLPcQIAgj4mos9xAwBCPiaiz3ED +AII+JqLPcQcAQj4mos9xAADCVyaiz3EAAEJYJqLPcQEAwlcmos9xAQBCWCaiz3ECAMJXJqLPcQMA +Qlgmos9xAwDCVyaiz3EHAEJYJqLPcRsAAh4mos9xGwBCNyaiz3EbAMJQJqLPcQAAQiEmos9xAACC +ISaiz3EGAMIhJqLPcwEAQiFmos9zAQCCIWaiJqLPcwIAQiFmos9zAwCCIWaiJqLPcwMAQiFmos9z +BwCCIWaiJqLPcQAAwjomos9xAACCOiaiz3MGAAI7ZqLPcQEAwjomos9xAQCCOiaiZqLPcQIAwjom +os9xAwCCOiaiZqLPcQMAwjomos9xBwCCOiaiZqLPcQAAQlQmos9xAAACVCaiz3MGAIJUZqLPcQEA +QlQmos9xAQACVCaiZqLPcQIAQlQmos9xAwACVCaiZqLPcQMAQlQmos9xBwACVCaiZqLPcXkAwh8m +os9xeQACOSaiz3F5AIJSJqLPcRAAQiomos9xMwCCKiaiz3EBAMIqJqLPcRAAgkMmos9xMwDCQyai +z3EBAAJEJqLPcRAAAl0mos9xMwBCXSaiz3EBAIJdJqKA4A7yz3EtAEIeJqLPcS0Agjcmos9xLQAC +UQ3wz3FqAEIeJqLPcWoAgjcmos9xagACUSaiz3E/AIIpJqLPcQEAwikmos9xPwDCQiaiz3EBAAJD +JqLPcT8AQlwmos9xAQCCXCaiz3EIAAIBJqKA4BLyz3AAAAIqBqLPcAIAAisGos9wAABCQwaiz3AC +AEJEBqLPcP8AAmcGos9w/wBCZwaiz3D/AIJnBqLPcP8AwmcGos9w/wBCdQaiz3D/AIJ1BqLPcP8A +wnUGos9w/wCCHQaiz3D/AMI2BqLPcP8AQlAGos9wgAACDAaiz3ADAMYABqIg3s91oADIH9ClMthD +HRgQANiSD6/0jbjRpScEz//gePHA4cXPcYAAcGUEkc9ygADMiYDgANtgohHygeAn8oLgPvIKIcAP +63IF2Iojhw1KJEAAYQWv80olAAAH2Bi4AKJhqmKqSiTAcGhwqCAAAwDbjrsWIg0AYaUD2w67YqUB +4APYBrEHsQDYF/AA2Jm4AKJS2AGqSiTAcAKqqCCAAgDdj70WIsAAoaCioAHjUtgC22axAdtnsSUH +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 +7/4F2Aylw9jPdqAA7CcGpgqGz3erAKD/ALWKIMQABqYKhgG1iiDFAAamCoYCtYogywAGpgqGA7WK +IM8ABqYKhgS1z3AAAIMNBqYKhgW1z3AAAMMNBqYKhga1z3AAAAMOBqYKhge1z3CnABRICIAEpc9w +pwCYRzyAJaXPcacAFEhXgTaBRqUnpc9xpQAIDCKBxtoopTiHkLoppTmHKqU6hyulz3EFAMYDJqYB +2Uamz3IsAAIBRqbPcloAQgFGpooiiwBGps9yQACHDUamz3LRAMINRqbPcsAABw5Gps9ypwAUSCii +z3JQAP8AXKDPcKcAFEg3oADZNqDPcKUACAxQ2SKg/NgYp3PYGacah4G4GqfPcBEABg4GpotwgcGV +/zOFAMBShSJ4NIUKuLILr/tCeYQohANCKUFyNrkBwidxSrmCIcQCz3CAADByMKVVoDagz3BAAIYN +BqbPcBAAAg4GpotwgcGD/zOFAMBShSJ4NIUKuGoLr/tCeQQogA8AAHQJQilBcja5AcIncUq5T+HP +cIAAMHIxpVegOKABlRC4hSCEAAamApUQuIUghQAGpgOVELiFIIsABqYElRC4hSCPAAamBZUQuAUg +gA8AAIINBqYGlRC4BSCADwAAwg0GpgeVELgFIIAPAAACDgamJIXPcKcAFEgooCaFIBUFEDegJ4VM +JQCANqDPcKUACAwIGEAByiHCD8oiwgfKIGIByiOCDwAA9QAkAGLzyiQiAAmFGKcKhRmnC4Uap64K +7/4MhYog0QVmDS/0MIUQhRkCr/SiwPHAqgmP9M9wgABwZQeIgOAcAiEAosE+Ce/+BdjPdYAA5D0M +pcPYz3agAOwnBqYKhgDbALWKIMQABqYKhs9xpwCYRwG1iiDFAAamCobPd6sAoP8CtYogywAGpgqG +A7WKIM8ABqYKhgS1z3AAAIMNBqYKhgW1z3AAAMMNBqYKhga1z3AAAAMOBqYKhge1z3CnABRICIAE +pRyBBaXPcKcAFEhXgBaARqUHpc9wpQAIDAKAxtoIpRiHkLoJpRmHCqUahwulz3AFAMYDBqYB2Eam +z3IsAAIBRqbPcloAQgFGpooiiwBGps9yQACHDUamz3LRAMINRqbPcsAABw5Gps9ypwAUSAiiz3JQ +AP8AXKHPcacAFEgXoXahz3ClAAgMUNkioPzYGKdz2BmnGoeBuBqnz3AqAAIOBqaLcIHB+v4Awc9w +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 +aqAxGEIBMhhCAduwWrAeCG/yDOABhQjZMqgEwYDhBvLPcIAAJAgkoGIK7/SpcGUBT/LgeM9wgABA +fiiAz3CfALj/ANo2oAjZ7HAgoAPZz3CgABQEJaAByOxxAKHPcKAA1AtNoOB+4HjPcYAAOAjgfwCh +4HjPcIAAOAjgfwCA4Hi1AA/ysQAP8uB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfwDY4H8A +2OB+4HihweB/ocDgeOB+4HjxwOHFAcjPdYAAZEMApQRtMgkv8gLZz3GADgQA7HAgoM4P7/EAhcEA +T/LgeOB+4HjgfuB48cAAFgBBz3KAAGRDBrIAFgVBQCIBBA4aRAFMJYCEyiHCD8oiwgfKIGIByiOC +DwAARABYBuLwyiQiAADaB/AAFgBBFCGMAAC0AeIvIEIBEHK39oIID/LRwOB+4HjgfuB44H7geOB+ +4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjPcIAAPAjgfwCA4HjgfuB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4 +4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB/Adjg +fuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+ +4HjgfuB48cDhxc91gACkQ6lwsg/v8QPZABWFEEQlQAGF4MohwQ/KIsEHyiBhAcojgQ8AAE8ACAXh +8MokYQABjYPgw/ZjuAGtQg/P8R0HD/LgePHAmg4P8hpxz3aAAKRDII5RIQCARvLPcYAARAggiYDh +zCAhoD7ygeAG9M9wgADoiaGAA/AA3Y7lA/eA5QL0AN3PcYAA6IkYiYDgBPSA5QT0AN8E8KKBBN+K +IBMB7gnv8alxiiBTAeYJ7/Hpcc9wgABkChiIg+DMICKBzCDigcwgIoII8oogEwHCCe/xi9kK8AqW +EHUI9AuWEHfMICGgBPQA2CHwAdjPcaAAyB8Noc9wgABECAGI67aqtgS/ELjlfQV9iiATAYYJ7/Gi +2YogEwF6Ce/xqXHPcKAAyB9/GFiDAdgdBg/y4HjxwLYNL/IIccT/gOA88iDdz3agAMgfsKYy2EMe +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 +IAkAACAJAAB4CgAAeAoAAHgKAAB4CgAARAoAAHgKAAB4CgAAeAoAAHgKAAB4CgAAwAsAAHgKAAB4 +CgAAnAgAAAMAAACg4wEAAgAAAMw7AQAEAAAAHDEAAAYAAABQ5QEAEQAAAKi0AQAHAAAANNcBAAgA +AADQ5QEADAAAAJxUAQANAAAAtFgBAA4AAADsWAEAFgAAAFQuAQALAAAAqGwBABQAAAAwVQAADwAA +ALhjAAAQAAAA9CUBAAEAAAAQ0wEAEgAAADyBAQATAAAAsHIBAAUAAAAUZwAAFQAAALD0AQAXAAAA +vAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnCUAAJwlAACcJQAAPDcAAJwlAACcJQAAMDcAAJwl +AACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAHQaAAAYHAAAHBwAAJQdAAAcHgAAmB0A +AJwlAACcJQAA7D8AAGBDAAA0RAAAnCUAAJwlAACcJQAAsD4AAPixAAD0sQAAMLIAAJwlAACcJQAA +nCUAAEA3AACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACc +JQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwl +AACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAMDgAAJwlAACcJQAAnCUAAJwlAACcJQAAFDkA +AJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAVP4AAJwlAAB8/wAA +nCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACoZgAAnCUAAJwlAACcJQAAnCUAAJwlAACc +JQAAnCUAAJwlAACcJQAAnCUAAJwlAAB0awEA/G4BAJwlAAAwVQEAnCUAAJxWAQBIRgEAnCUAAJwl +AACwRAAAnCUAAJwlAACcJQAAnCUAAJwlAAC4vAEAYLYBAJwlAACcJQAAnCUAAJwlAACcJQAAnCUA +AJwlAADo5AEA7OQBAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAADXAQCcJQAANNoBAJwlAADY9QEA +nCUAAPQgAAD4IAAAnCUAAJwlAACo5gEANFUAAJwlAACcJQAAnCUAAHzRAQCcJQAAnCUAAPAmAQCc +cgEAnCUAAJwlAACcJQAAeHkBAGRBAQCcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACshwEAnCUAALTl +AQC45QEAxOUBAMjlAQC85QEAwOUBAMzlAQCcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUA +AJwlAACIRgAAnCUAAJwlAACcJQAAnCUAAJwlAAAk5QEAWOUBAEg7AACcJQAAnCUAAJwlAACcJQAA +nCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACc +JQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwlAACcJQAAnCUAAJwl +AACcJQAAnCUAAJwlAACcJQAA7DsAAGw8AAD0PAAAkD0AAFhiAABoPQAAnCUAAJwlAACcJQAAnCUA +AJwlAADkOwAA6DsAAJwlAACcJQAA4EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAABAAAAABAAAAAQEAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAADhAw4e4eEDDh7hwQIKHuGBBQwe4eEDDh7h4QMOHuHBAgYe4YEFDB7hAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEB +AQ0NDQ0NDQ0NDQ0NDQ0NDQ0DAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEB +AQEBAQEBAQENDQ0NDQ0NDQ0NDQ0NDQ0NAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAB +AQEBAQEBAQEBAQEBAQEBDQ0NDQ0NDQ0NDQ0NDQ0NDQMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAA +AAAAAAAAkQIAADHKLwCRAgAAMcovAJECAAAxyi8AkQIAADHKLwCRAgAAMcovAJECAAAxyi8AkQIA +ADHKLwCRAgAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAA +McovAEMBAAAxyi8AQwEAADHKLwBADQAA3gMJAAAAAAAAAAAAAAAAALz9AAABAAAAMC2AAAAAAAAA +AAAAAAAAAEz+AAAVAAAAcC2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA +AAADAAAAAAAAAAgAAAAAAAAAQEIPABQCAQD4AgEACAQBANQFAQAIBAEA1AUBAIAHAQAECAEAgICA +gICAgIABgAKAgICAgAAAAABwEAEAcBABAAAAAAAAAAAAAAAAAAAAAABwEAEAcBABAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAwLYAAMC2AAKQgoAA4IKAAAQAAAPz///8AAAAAAAAAAFAtgABQ +LYAAqCCgADwgoAAIAAAA8////wAAAAAAAAAAcC2AAHAtgACsIKAAbCCgADAAAADP////AAAAAAAA +AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAQnAQAFAAAAcC2A +ADAsAQAA/wMAUCwBAAD/BQA8LQEAAP8tAGAtAQAA/z0AGC0BAAD/BAD8LAEAAP8lABQ0AQAANQEA +dDUBAJAwAQDILwEAYDYBAOg2AQAsNwEAfDcBAAAAAAAsAQAAXgEAAAEAAAABAAAAAQAAAAEAAAAD +AAAAAAAAAAAAAAAAAAAAAwAAAAIAAAADAAAAAwAAAAMAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAA +AAA0PQEACgAAADAtgAAAAAAAAAAAAAAAAADAPQEACgAAADAtgAAAAAAAAAAAAAAAAAD0PQEACgAA +ADAtgAAAAAAAAAAAAAAAAABsPgEACgAAADAtgAAAAAAAAAAAAAAAAACMPwEACgAAADAtgAAAAAAA +AAAAAAAAAAAEPwEACgAAADAtgAAAAAAAAAAAAAAAAACERQEABgAAADAtgAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAQAAAAAIAAAAAAoAAQJwAA6AMAAOgDAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAyFsBAMhcAQBsXwEACGIBAGxkAQCkZwEAWF4BABwFgAAIfoAAGAAA +AMh9gAAAAAAAAAAAAAAAAAAAAAAAAAAAALxpAQAGAAAAMC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAA +MC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAA +AAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAAAAAAAOwX +AQAKAAAAMC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2A +AAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAA +AAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAAAAAAAOwXAQAKAAAAMC2AAAAAAAAAAAAAAAAAAKhwAQAK +AAAAMC2AAAAAAAD//////////wAAAAAAAAAAAAAAACxyAQAFAAAAcC2AAGQAZABpANwAyABaAKoA +vgCGAX0APgBkAGQAaQDcAMgAWgCqAL4AhgF9AD4AAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAQIBAQACAQABAgICAAEBAAIBAgECAAIAAQIDAAAAABSHAQCElAEABIqAAMADAAAAAAAAFIcB +AECIAQDEjYAA+AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANyYAQDglgEAvI+AAFQAAAAAAAAA +FIcBABCXAQA8kIAAUAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABSHAQCIkwEAhDeAAFABAAAA +AAAA8JgBAJiVAQC8BoAAAgAAAAAAAAAUhwEAxJUBAMAGgAAEAAAAAAAAAMiYAQBAiAEAEJCAACwA +AAAAAAAAFIcBADCWAQAAAAAAAAAAAAAAAAAUhwEA8JUBAMQGgAAEAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAQACAAIAAwAEAAQABQAGAAYABwAgACAAIQAiACIAIwAkACQAJQAmACYA +QwBEAEQARQBGAEYARwBIAEgASQBKAEoASwBMAEwATQBOAE4ATwBQAFAAUQBuAG4AbwBwAHAAcQBy +AHIAcwB0AHQAdQB2AHYAdwB4AHgAeAB4AHgAeAB4AHgAeAAPAD8AAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAQABAAIAAwADAAQABQAFAAYABwAHAAgACQAJAAoAIwAjACQAJQAlACYAJwAn +ACgAKQApAEYARwBHAEgASQBJAGYAZwBnAGgAaQBpAGoAawBrAGwAbQBtAG4AbwBvAHAAcQBxAHIA +cwBzAHQAdQB1AHYAdwB3AHgAeAB4AHgAeAB4AHgAeAAOAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAQACAAIAAwAEAAQABQAGAAYABwAgACAAIQAiACIAIwAkACQAJQAmACYAQwBEAEQA +RQBGAEYARwBIAEgASQBKAEoASwBMAEwATQBOAE4ATwBQAFAAUQBuAG4AbwBwAHAAcQByAHIAcwB0 +AHQAdQB2AHYAdwB4AHgAeAB4AHgAeAB4AHgAeAAPAEMAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAIA +AwADAAQABQAFAAYABwAHAAgACQAJAAoAIwAjACQAJQAlACYAJwAnACgAKQApAEYARwBHAEgASQBJ +AGYAZwBnAGgAaQBpAGoAawBrAGwAbQBtAG4AbwBvAHAAcQBxAHIAcwBzAHQAdQB1AHYAdwB3AHgA +eAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAIAEMAeHcBABLSAAAAAAAA//8PAOCQAQC2AAAAAAAA +AP8AAADgkAEAtwAAAAAAAAD/AAAA4JABALgAAAAAAAAA/wAAAOCQAQC5AAAAAAAAAP8AAADgkAEA +ugAAAAAAAAD/AAAA4JABALsAAAAAAAAA/wAAAOCQAQC9AAAAAAAAAP8AAADgkAEAvgAAAAAAAAD/ +AAAA4JABAL8AAAAAAAAA/wAAAOCQAQDAAAAAAAAAAP8AAADgkAEAwQAAAAAAAAD/AAAA4JABAMIA +AAAAAAAA/wAAAHh3AQAT0gAAAAAAAP//DwDgkAEAGwEAAAAAAAD/AAAA4JABABwBAAAAAAAA/wAA +AOCQAQAdAQAAAAAAAP8AAADgkAEAHgEAAAAAAAD/AAAA4JABAB8BAAAAAAAA/wAAAOCQAQAgAQAA +AAAAAP8AAADgkAEAIgEAAAAAAAD/AAAA4JABACMBAAAAAAAA/wAAAOCQAQAkAQAAAAAAAP8AAADg +kAEAJQEAAAAAAAD/AAAA4JABACYBAAAAAAAA/wAAAOCQAQAnAQAAAAAAAP8AAAB4dwEAFNIAAAAA +AAD//w8A4JABAIIBAAAAAAAA/wAAAOCQAQCDAQAAAAAAAP8AAADgkAEAhAEAAAAAAAD/AAAA4JAB +AIUBAAAAAAAA/wAAAOCQAQCGAQAAAAAAAP8AAADgkAEAhwEAAAAAAAD/AAAA4JABAIkBAAAAAAAA +/wAAAOCQAQCKAQAAAAAAAP8AAADgkAEAiwEAAAAAAAD/AAAA4JABAIwBAAAAAAAA/wAAAOCQAQCN +AQAAAAAAAP8AAADgkAEAjgEAAAAAAAD/AAAAeHcBAAjSAAAAAAAA//8DALh3AQAAggAAAAAAAP8B +AAC4dwEAAYIAAAAAAAD/AQAAeHcBAAnSAAAAAAAA//8DALh3AQACggAAAAAAAP8BAAC4dwEAA4IA +AAAAAAD/AQAAeHcBAArSAAAAAAAA//8DALh3AQAEggAAAAAAAP8BAAC4dwEABYIAAAAAAAD/AQAA +eHcBAAbSAAAAAAAA/wEAAHh3AQAH0gAAAAAAAP8DAAB4dwEABtIAAAkAAAAA/gMAeHcBAAfSAAAK +AAAAAPwPAHh3AQAG0gAAEgAAAAAA/Ad4dwEAB9IAABQAAAAAAPA/eHcBABXSAAAAAAAA/wMAAHh3 +AQAM0gAAAAAAAP8BAAB4dwEAFdIAAAoAAAAA/A8AeHcBAAzSAAAJAAAAAP4DAHh3AQAV0gAAFAAA +AAAA8D94dwEADNIAABIAAAAAAPwHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNIN0hHSENIC +0gHSA9Ib0gvSAIAF0hLSE9IU0gRDBtIH0gTSCRAAALUAGgGBAQUABAAGAAgACQAKAAsADACDAJIA +6AD3AE4BXQEPAC4AAABsAAAAdAAAAIAAAACMAAAAnQAAAAcAAAAEAAAACAAAABAAAABAAAAAgAAA +ACAAAAAAAAAACQAAABIAAAAAAAAACgAAABQAAAAcBYAACH6AABgAAADIfYAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAATLgBAAYAAAAwLYAAAAAAAAAAAAAAAAAAhNQBAAYAAAAwLYAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcBYAACH6AABgAAADIfYAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAABwFgAAIfoAAGAAAAMh9gAAAAAAAAAAAAAAAAAAAAAAAAAAAABThAQAEAAAAMC2AAAAAAAAA +AAAAAAAAAOjfAQAEAAAAMC2AAAAAAAAAAAAAAAAAANzhAQAGAAAAMC2AAAAAAAAAAAAAAAAAAOjf +AQAEAAAAMC2AAAAAAAAAAAAAAAAAABThAQAEAAAAMC2AAAAAAAAAAAAAAAAAAOjfAQAEAAAAMC2A +AAAAAAAAAAAAAAAAABThAQAEAAAAMC2AAAAAAAAAAAAAAAAAAOjfAQAEAAAAMC2AAAAAAAAAAAAA +AAAAANzhAQAGAAAAMC2AAAAAAAAAAAAAAAAAAOjfAQAEAAAAMC2AAAAAAAAAAAAAAAAAABThAQAE +AAAAMC2AAAAAAAAAAAAAAAAAANzhAQAGAAAAMC2AAAAAAAAAAAAAAAAAABThAQAEAAAAMC2AAAAA +AAAAAAAAAAAAABThAQAEAAAAMC2AAAAAAAAAAAAAAAAAANzhAQAGAAAAMC2AABwFgAAIfoAAGAAA +AMh9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAFAUAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwQEBAQEBQYHCAgICAgJ +CgsMDQAAAAUGBwgNDg8QFRYXGBkAAAoNERQKDREUCg0RFAoKAAAAAAAABgYGBgkJCQkABgAAbjto +O2I7XDtuOmg6YjpcOm45aDliOVw5bjhoOGI4XDhuN2g3YjdcN24paCliKVwpbihoKGIoXChuJ2gn +YidcJ24ZaBliGVwZbhhoGGIYXBhuF2gXYhdcF24JaAliCVwJbghoCGIIXAhuB2gHYgdcB24GaAZi +BlwGbgVoBWIFXAVuBGgEYgRcBG4DaANiA1wDbgJoAmICXAJuAWgBYgFcAW4AaABiAFwAbjtoO2I7 +XDtuOmg6YjpcOm45aDliOVw5bjhoOGI4XDhuN2g3YjdcN24paCliKVwpbihoKGIoXChuJ2gnYidc +J24ZaBliGVwZbhhoGGIYXBhuF2gXYhdcF24JaAliCVwJbghoCGIIXAhuB2gHYgdcB24GaAZiBlwG +bgVoBWIFXAVuBGgEYgRcBG4DaANiA1wDbgJoAmICXAJuAWgBYgFcAW4AaABiAFwAAAAAAAAAAAAA +AAAAUPoBAAgAAABwLYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAA/////////wAB//8CA////wT//////////////////////wX/Bv8H/wj/Cf8K/wv/DP///w3/ +//8O////D////xD//////////////////////////////////////////////xH///8S////E/// +/xT///8V////Fv///xf///8Y////Gf///xr///8b/////xz///8d////Hv///x////8g////If// +////////////////////IiMk/yUmJ///KP///yn///////////////////////////////////// +/////////////////////////////////////////wEEAAACBQEAAwYCAAQHAwAFCAQABgkFAAcK +BgAICwcACQwIAAoNCQALDgoADA8LAA0QDAAOEQ0AAUEABAJCAQQDQwIEBEQDBAVFBAQGRgUEB0cG +BLcTIgC4FCMAuRUkALsWJQC8FyYAvRgnAMAZKADEGikABxsAAAgcAQALHQIADB4DABAfBAAiIQUA +JCIGACYjBwAoJAgAKiUJACwmCgAuJwsAMCgMADQpDQA4Kg4APCsPAEAsEABkLhEAaC8SAGwwEwBw +MRQAdDIVAHgzFgB8NBcAgDUYAIQ2GQCINxoAjDgbAJE6HACVOx0AmTweAJ09HwChPiAApT8hACRJ +BgIsSgoCNEsNATxMDwFkTREBbEMTAXRPFQF8UBcBhFEZAZVSHQGdUx8BAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQWCBYWFgwWFhYWFhYW +EAAAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8A +AgAAAA8APwABAAAAAAAAAAEAAAACAAAAAwAAAAAAAAAEAAAAAgAAAAUAAAAYCAGlDAIApQA8ODQw +LCgkIBwYFBAMCAQADAgEADw4NDAsKCQgHBgUEAwIBAIAFQ8AAAAAGwAAAAEBAAECAQEBAQEBAQEB +AQECAgICAgICAgMDAwMDAwMDBAQEBAQEBAQBAgICAgICAwMDAwMDAwMDAwMDAwMEBAQEBAQEBAQE +BAQEBAQEBAQEBAQEBAQAAAAAAQECAQICA3//Bw8fPwEDAQMPBwEHDx8/f///BQAHAgMEBgZ00UUX +6KKLLg0PBQcJCwEDChQ3blVVVQFLaC8BVVVVBeM4jgOqqqoCcRzHAaqqqgrHcRwHKAAoADAALAAs +ACgAPAA0ACgAKAA0ADAALAAsAEQAPABAADwAjABsAFgASAD0ALAALAAsADwANAAwACwAVABEAFQA +VABsAGAAXABUAIwAeAA6AQIB1QDfANoAogB1AH8AagEaAdkA6AAKAboAeQCIAIoFKgM5AagBigXK +AtkASAHKAUoB4gD5AMoB6gCCAJkAZuYAAJ3YiZ1O7MRONEiDNCd2YicapEEaEzuxExEYgREP/MAP +TuzETid2YicapEEaEzuxEw3SIA2JndgJCIzACAd+4Ac0SIM0GqRBGhEYgREN0iANCIzACAZpkAaw +stUFBVRABSd2YicTO7ETDdIgDYmd2AkGaZAGxE7sBARGYAQDP/ADqqqqqhqkQRoTO7ETD/zADxEY +gREN0iANCqiAChM7sRMP/MAPD/zADw3SIA0LtEALC7RAC4md2AkN0iANCqiACgqogAoIjMAIB3iA +Bwd4gAcGaZAGD/zADw3SIA0LtEALDdIgDQu0QAuJndgJCIzACImd2AkIjMAIB37gBwd+4AfBLCkH +CqiACgiMwAgHeIAHCIzACAd4gAcGaZAGsLLVBQZpkAawstUFBVRABQVUQAXWHcYEDQAaACcANABO +AGgAdQCCABoANABOAGgAnADQAOoABAEnAE4AdQCcAOoAOAFfAYYBNABoAJwA0AA4AaAB1AEIAgwA +TgBoAIIAdQCcAMMAaACCAIIAnAC2ALYA0ACcAMMAwwDqABEBEQE4AYIAnAC2AJwAtgDQAOoA0ADq +AAQBBAEeAcMA6gARAeoAEQE4AV8BOAFfAYYBhgGtAQAAMAAAADYAAAAMAAAAEgAAABgAAAAkAAAA +BgAAAAkAAAAAAAAAAAAAABggFBQODhQUBQYBAgMEAAAAAQECAQICAwQMDAgEDAQEQAAAAIAAAAAA +AQAAAAIAAEAAAAAABAAAQAAAAEAAAAAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uL0BB +QkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6 +e3x9fn8tAA8gAPBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApcaE+JnujfYN/73Wsd5UkVBg +AwKpzn1WGediteZNmuxFj50fQImH+hXv67LJjgv77EFns/1f6kW/I/dTluRbm8J1HOGuPWpMWmxB +fgL1T4NcaPRRNNEI+ZPic6tTYj8qDAhSlWVGXp0oMKE3Dwq1LwkONiSbGz3fJs1pTs1/n+obEp4d +dFguNC02stzutPtb9qRNdmG3zn17Uj7dcV6XE/WmaLkAACzBYEAf48h57ba+1EaN2WdLct6U1Jjo +sEqFa7sqxeVPFu3FhteaVWaUEc+KEOkGBIH+8KBEeLol40vzov5dwICKBa0/vCFIcATx32PBd3Wv +Y0IwIBrlDv1tv0yBFBg1Ji/D4b6iNcyIOS5Xk/JVgvxHeqzI57orMpXmoMCYGdGef6NmRH5UqzuD +C8qMKcfTazwoeafivB0Wdq0721ZkTnQeFNuSCgxsSOS4XZ9uve9DpsSoOaQxN9OL8jLVQ4tZbrfa +jAFksdKc4Em02PqsB/Mlz6/KjvTpRxgQ1W+I8G9KclwkOPFXx3NRlyPLfKGc6CE+3ZbcYYYNhQ+Q +4EJ8xHGqzNiQBQYB9xIco8Jfavmu0GmRF1iZJzq5JzjZE+uzKzMiu9JwqYkHpzO2LSI8khUgyUmH +/6p4UHqljwP4WYAJFxraZTHXxoS40MOCsCl3WhEey3v8qNZtOiwAAQIEBAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAFk4wAB0wLLAnMBtAACwsGUGsH2GsLBKAAkAAAACAAAAAAAAAAAAAAAJAAAAAgAA +AAAAAAAAAAAACQAAAAMAAAABAAAACQAAAAkAAAACAAAAAgAAAAkAAAABAgECAwQAAAUGBwgJCgAA +AAUGAAIEAAUAAAAAAAUHAQMEAAUBAAAAQCNAJSEhISFAQEBAQAUEBAEBQEBAQAUFQEAMDEANDAwB +AQEFQEAFBQAEAARAQAAEQEBABUBAQEBABUBAQAUFBQEBAQFABQUFAQUBAUAFBQVABUAFBQUFBQQA +AAAcEQAAHDIAABwzAAAEAAAAHBUAAAIAFwBsAHAEdAh0DAAEBAYAAAAAAAAAAGQAAAAAkAEACgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAAAAAAAAAAP8AAAAA +AAAAAAAAAAAAAAAAAAAAAQAAABAAAAAAAAAAAQAAAAEAAAAAAAAA/wAAAP8AAAAAAAAAAAAAABDi +AQAAAAAAAAQAAGQAAAAHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcHBwcHBwcGBgYGBgUFBQUFBAQEBAQDAwMDAwICAgICAQEBAQEAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5G0BAOxtAQD0bQEATG4B +AFRuAQBcbgEAAAQOCR0tNwAABA4JHSw7AAEQAAEAAAACgAABQgYCEAACIAAAA8AAAUMGAxAAAsAA +AAPAAAFDBgQQAAJAAAACgAABRAYFEQAAQAAAA8AAAUUGBhEAAOAAAAPAAAFFBgcRAAEAAAACgAAB +RgYIEQACIAAAA8AAAUcGCREAAsAAAAPAAAFHBgoRAAJAAAACgAABSAYLEgAAQAAAA8AAAUkGDBIA +AOAAAAPAAAFJBg0SAAEAAAACgAABSgYOEgACAAAAAoAAAUwGAAAiFgAAgAAAAwAAAVkAJBYAAQAA +AAMAAAFaACYWAAIAAAAEAAABWgAoFgACAAAAAwAAAVsAKhYAAoAAAAMAAAFcACwXAAAAAAAEAAAB +XAAuFwAAgAAAAwAAAV0AMBcAAQAAAAMAAAFeADQXAAIAAAADAAABXwA2FwACgAAAAwAAAWAAOBgA +AAAAAAQAAAFgADwYAAEAAAADAAABYgA+GAACAAAABAAAAWIAQBgAAgAAAAMAAAFjAGQbAAIAAAAD +AAABbwFmGwACgAAAAwAAAXABaBwAAAAAAAQAAAFwAWwcAAEAAAADAAABcgFuHAACAAAABAAAAXIB +cBwAAgAAAAMAAAFzAnQdAAAAAAAEAAABdAJ2HQAAgAAAAwAAAXUCeB0AAQAAAAMAAAF2AnwdAAIA +AAADAAABdwN+HQACgAAAAwAAAXgDgB4AAAAAAAQAAAF4A4QeAAEAAAADAAABegOGHgACAAAABAAA +AXoEiB4AAgAAAAMAAAF7BIwfAAAAAAAEAAABfASRHwABQAAAAwAAAX4ElR8AAwAAAAQAAAF/BZcf +AALAAAADAAABgAWZIAAAQAAAAwAAAYEFnSAAAUAAAAMAAAGCBZ8gAAHAAAADAAABgwWhIAADAAAA +BAAAAYMFpSEAAEAAAAMAAAGFBQAAAAAAAAAAAADEzgEASL8BAAjBAQBswgEAeMQBAPjGAQDYygEA +nMwBAOTNAQA82AEAUNgBALzYAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQkSFBgAAA4AAAAqAAAABwAAAAsAAAD/////AAAAAAAA +AAABAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAUFBQUFBQUFAAAAAIANAAAAIAAAgA0AAIANAAAAIAAA +gA0AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIIAPAABAAGkgAABpIEAA +aSAAAGkgQAAgIIAPAADoAGkgAABpIEAAaSAAAGkgQAAgIIAPAACcBWkgAABpIEAAaSAAAEogAABK +IQAASiIAAEojAABKJAAASiUAAEomAABKJwAASiAAEEohABBKIgAQSiMAEEokABBKJQAQSiYAEEon +ABBKIAAgSiEAIEoiACBKIwAgSiQAIEolACBKJgAgSicAIEogADBKIQAwCiSAP4AAAMBBLJwwQCyc +MEIkHDQKIoA/gABgWgojADcSDwAASiYAcGkgQABKJgBwSiYAcEomAHBKJgBwABYAcIAAWARAeCAg +QIcAAAAAAAAAAAAACsjPcaAAyB8OGRiAC8gPGRiADMgQGRiADRICNgDIRHgRGRiADsgtGRiA4H7h +xPwcyL78HEi+4cDhweHC4cP8HAix/BxIsfwciLH8HMix/BwIsvwcSLL8HIiy/BzIsvwcCL9qJIAQ +4cRqJMAQ4cTxwM9woADQGxSAz3GAAFQEBCCAj89RBOEAoQryLykBAM9wgACoCfAgQABAeNr/0cDB +xGskwBDBxGskgBDBxJ90BBQLNAQUCjQEFAk0BBQINAQUBzQEFAY0BBQFNAQUBDTBw8HCwcHBwMHE +RSx+EAomQH7BxGskgBTBxCAgQIcKyIe4ChoYMAvIm7gLGhgwDMgMGhgwDciHuA0aGDAOyIUgww8O +Ghgw4H7gePHACsiVuAoaGDALyJu4CxoYMA3IiriNuJC4DRoYMM9wgADQChiIGwhRAA3Iz3EAAIwK +rLgNGhgwxg0gAA/YZ9hqDuAAiiGGCNHA4H7xwM9wgABElgCAhiD+gQn0DcgFIIAPAAAA1A0aGDCg +/4ogVQU6DuAAiiHGDOjx4HjxwM9xAwBADc9woACoIC2gz3KAAJQEIIIBaQCiwg0gAUjYz3CAAAwJ +JYAjgSCBx3EAAIgT7gwACMrx4HjPcIAADAmBBAAI4HjxwBYKQAHPdoAAVAQF6A8IUQAB2ALwANgL +rgbpDQlRAAHYA/AA2AquBeoPClEAAdgC8ADYDK4A2M91oADIHxgdGJALjoohEAAN6AiOC+jPcAMA +QA1FHRgQMKUC2BgdGJAC8DGlCo4Z6AmOF+jPcAEAMuUgHRiQz3CAACQAIR0YkM9wgABQBCIdGJAY +FQCWRSAAAxgdGJAMjgfoGBUAloUgAQQYHRiQGesA2JS4z3aAAIgEAKZx2Aa4NgggAfzZIIbPcAAA +TBwqCCABn7kYFQCWhbgYHRiQrQFAAeB4z3Gqqru7z3CfALj/NqA2oDagNqDPcaAAyDsOgYi4DqFp +IEAA/vHgePHApcFBwELBDBwAMRAcQDHPcYAAfFs0GcAPMBkADywZwA4oGYAOJBlADs9wgAB8WyAY +QAvPcIAAfFscGAALz3CAAHxbGBjACs9wgAB8WxQYgArPcIAAfFsQGMAIz3CAAHxbDBiACM9wgAB8 +WwgYQAjPcYAAAFuAGQAIfBnAB3gZgAd0GUAHcBkAB2wZAAdoGYAGZBlABmAZAAZcGcAFWBmABVQZ +QAVQGQAFTBnABEgZgAREGUAEQBkABO+hzqGtoYyhLBnAAigZgAIkGUACIBkAAhwZwAEYGYABFBlA +ARAZAAFjoWogAAPYGQAAaiDAAtQZAABqIIAC0BkAAGogQAHIGQAAaiAAAcQZAABqIMAAwBkAAGog +gAC8GQAAaiBAALgZAABqIAAAtBkAAGoggAHMGQAA0NifuM9xnwC4/x2hz3CAAAAAxIBTJcQ1UybF +Nde6AebTvsSgUyPABAUmjh/Q/gAA1qEFIIAPsP4AABahGIFTJ841AN2UuBihQMMBwALByXMMFAYw +qgvgABAUBzDPcKAAtA+8oM9xoADIOy6BQgvgAH3YpgtAAXYO4ACpcAjYANk2DuAAmbkQ8fHAKg8g +AXvYHgvgANfZz3GAAHxbNBnADzAZAA8sGcAOKBmADiQZQA7PcIAAfFsgGEALz3CAAHxbHBgAC89w +gAB8WxgYwArPcIAAfFsUGIAKz3CAAHxbEBjACM9wgAB8WwwYgAjPcIAAfFsIGEAIz3GAAABbgBkA +CHwZwAd4GYAHdBlAB3AZAAdsGQAHaBmABmQZQAZgGQAGXBnABVgZgAVUGUAFUBkABUwZwARIGYAE +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 +5BiAAB0GQADPcIAA3FtdAyAA6NnxwJoNQAAAFoNAABaPQAAWjUAAFpBAw7+j6M9xgADcW9aJFBGF +ANF1zCNBgRDyCiHAD+tyEL1AKw8EBdiKI9sIBSWEE00EL/8FJcUDQCEOBvWpz3WAAISYhR3CEyHw +z3CAAJCbApAXDQEQz3WAAISYwhUAFsC4HQsAAAohwA/rcgXYiiMbC5hzCQQv/0olAADPdoAAkJfP +cIAA6JvpqEAgQSBJIQEGO3nuDSAAyXBCIMAlSCAAABsIdAAA2wDaABYBQAHi+wqUgAHj9QsEgFYm +ABbGDSAABNnPcIAARJYAgDMIXgDPcYAA3FvPcIAAkJsCkFaJEQoBAMIVABY0icC4EwkAAMMVABYL +CF4BCYUVCF8BPgtgAMlwz3CAAEAL9ag6DQAA2QRAAADYbPHxwKHBi3BmDSAAAdkAFAUwTCUAgMoh +wQ/KIsEHyiBhAcojgQ8AACIHPAMh/8okYQDPcIAAiIf6DCAAAxhCAaHA0cDgfvHALgxAAM9zgAAA +DEODAN/PdaAALCCwhdJq1H5+ZqWmBKYB4owiCIAmpkOjhfcCg+OjAeACo2EEQADgeADYz3GgAMgf +GKEZoQHYDqHgfuB48cDeC2AAOXEZcshx6HIB3c92oADIH7OmBd/PdYAAcAvgpQGlBMBIpQmlFYYn +pQqlGIYYHUARC6UZhhQdABEMpaAWABBkpQ2lpBYAEAwdABIOpagWABAIHUASD6XPcAEAGAgQpTIP +IAAk2AQggA8AAAD4EaUiDyAAANgSpVMnwHUTpQHIVB0AFxalEhYAllAdABcXpRMWAJbPcoAAcAsY +pRQWAJZKJAB5GaUVFgCWANkapRYWAJYbpc9wgAAQKBCAHKXPcIAAcAt0GIAKz3CAAHALeBjACs9w +gABwC3wYAAuAGkALz3CgAMgcCICEGgAAqCBAAvAiQwDPcJ8AuP8B4XagRQNAAOB48cDPcYAAECgQ +oeB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeNHA4H7geOHF +4cZAKQ0CJX1ALQMUpXslCjQCCHVTJX6QBvIBHVIQYbr78UEqjgDBukImTpAEHdAQ/fUJ6i8kiXDg +eKggQAEBHVIQ4HjBxuB/wcUocgDZ2PHgePHA4cUIdc9wgAAkCwGIFegH8NoPz/5aD+//iiCRD89w +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 +N/DPcYAAHD0c4FYPb/8A2gSFz3GAAFw9BLgUePhgKfDPcYAAPD0U4DYPb/8A2gSFz3GAAFw9BLgU +eEJwGfDPcYAAHD0k4BoPb/8A2gSFz3GAADw9BLgUeCJwBg9v/wDaBIXPcYAAXD0EuBR4AnDyDm// +AdrdBE/18cAKJQCAz3GAALwGIBEEACLyz3KkALg9ANsfDBEAmxIABgmhphIABgqhkhIABguhoxIA +BgyhmxrYAP/YphoYAJIaGACjGhgAAdrPcKAAtA9coCfwTCQAgMohwQ/KIsEHyiOBDwAA+wQUAyH0 +yiBhAQmBz3KkALg9mxoYAAqBphoYAAuBkhoYAAyBoxoYAAPIz3KgALQPhiD/DiK4HKIgGUABJvF5 +Bg/1dQYP9fHAcg4P9W/+HPHgeM9wgAB8PeB/EYDgePHAwgtP9Qh3GnEB2c9wpwCYRzqgIN7PdaAA +yB/QpQrYQx0YEADYBgwv9Y240aXPcacAFEgMgQToHoED8B2BABgAIPe4xSCCDwD/AADTIOEFmg3v ++6DZ0QNv9QCn8cBqC0/1z3CAAPBkJoiA4c91gAB8PWQCIQCiwQeIgOBYAgEAiiCRBRYP7/QA2fIL +L/8F2Aylw9jPdqAA7CcGpgqGz3erAKD/ALWKIMQABqYKhgG1iiDFAAamCoYCtYogywAGpgqGA7WK +IM8ABqYKhgS1z3AAAIMNBqYKhgW1z3AAAMMNBqYKhga1z3AAAAMOBqYKhge1z3CnABRICIAEpc9w +pwCYRzyAJaXPcacAFEhXgTaBRqUnpc9xpQAIDCKBxtoopTiHkLoppTmHKqU6hyulz3EFAMYDJqYB +2Uamz3IsAAIBRqbPcloAQgFGpooiiwBGps9yQACHDUamz3LRAMINRqbPcsAABw5Gps9ypwAUSCii +z3JQAP8AXKDPcKcAFEg3oADZNqDPcKUACAxQ2SKg/NgYp3PYGacah4G4GqfPcBEABg4GpotwgcGW +/zOFAMBShSJ4NIUKuDYM7/tCeYQohANCKUFyNrkBwidxSrmCIcQCz3CAALBxMKVVoDagz3BAAIYN +BqbPcBAAAg4GpotwgcGE/zOFAMBShSJ4NIUKuO4L7/tCeQQogA8AAHQJQilBcja5AcIncUq5T+HP +cIAAsHExpVegOKABlRC4hSCEAAamApUQuIUghQAGpgOVELiFIIsABqYElRC4hSCPAAamBZUQuAUg +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 +AMCOCW/4FOEYpyDAibiOuBmnAI4TCF4AQCYAE3YO7/IU2QPwAN3PdqAA9Aekpq4Pj/HPcYAAYJUB +iYXoAIkTCF8AAdmQuc9wpwCYRzygA9gEpgMIHkPPcYAAYJUBiYXoAIkXCF8Az3KnAJhHcBqABAiJ +gLgaogCJdQheAKkIHsP9CN7BRggP9YwgAoPMIIKPAAD8AAzyCiHAD+tyBdiKI44CSiRAAIEA7/G4 +c4wgAoMY9M91gABglalwcgrv8gPZAI1RIACAyiHCD8oiwgfKI4IPAACPA8ogYgHl9Vv/BPBuD0/z +sgnv8oDYBvCqCe/ygNhW/wDaz3GgAPQHRKED2AqhCaFJoSYL7/wKcHUBL/OhwOB48cDPcYAA8GQk +kQDYguHMIWKAA/QB2C8mB/DPcYAAYJUAiQfyhiA/BUUgAAoAqQsIHgBZ/wLwQP/PAM//8cDPcIAA +YJXSCe/yA9nu/7sAz//9AM/y+QDP8uB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfwDY4H8A +2OB+4HihweB/ocDgeOB+4HjxwOHFAcjPdYAAPEcApQRtegnv8gLZz3GADgQA7HAgoBYI7/IAheUA +D/PgeOB+4HjgfuB48cAAFgBBz3KAADxHBrIAFgVBQCIBBA4aRAFMJYCEyiHCD8oiwgfKIGIByiOC +DwAARAAgB6LxyiQiAADaB/AAFgBBFCGMAAC0AeIvIEIB8woCgMoIz/LRwOB+4HjgfuB44H7geOB+ +4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjPcIAAqAjgfwCA4HjgfuB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4 +4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB/Adjg +fuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+ +4HjgfuB48cDhxc91gAB8R6lw+g+v8gPZABWFEEQlQAGF4MohwQ/KIsEHyiBhAcojgQ8AAE8A0AWh +8cokYQABjQsIEgFjuAGtig+P8kEHz/LgePHAvg7P8hpxz3aAAHxHII6JCR4Az3GAALAIIImA4cwg +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAZIWAAFBZAQAAAAAAAAAAAAAAAAAAAAAAAAAAAIiFgAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +/wEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEBAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACAAAABgAIAAkAAAAHAAAAAAAAAAIAAAACAAAAgwAA +AJIAAADoAAAA9wAAAE4BAABdAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAfYAALLMBAAAAAAAAAAAA +AAAAAAAAAADAfYAAPLoBAAAAAAAAAAAAwH2AALC7AQAAAAAAAAAAAAAAAADAfYAAAAAAAAAAAAAB +AA8AZAABAIgIgAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAcAAAAA +AAAAAAAAAAAAAH9/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgQIAAgQ +IAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYBwAAFQAAAMQtgABkCgAA +ZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABk +CgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQK +AABkCgAAqAsAAAAAAADUHgEAZAoAALAIAABkCgAAZAoAAGQKAADgCAAAWAYBAJhSAABkCgAAZAoA +ABQJAAAUCQAAFAkAABQJAAAUCQAAFAkAABQJAABkCgAAZAoAAGQKAABkCgAAMAoAAGQKAABkCgAA +ZAoAAGQKAABkCgAArAsAAGQKAABkCgAAlAgAAAMAAADcwQEAAgAAAHArAQAEAAAAbDAAAAYAAACI +zAEAEQAAAGysAQAHAAAAoLUBAAgAAAAIzQEADAAAAKBDAQANAAAAIEgBAA4AAABYSAEAFgAAADwe +AQALAAAA6FwBABQAAACwUwAADwAAAARiAAAQAAAADBYBAAEAAACMsQEAEgAAABRrAQATAAAANGMB +AAUAAABIZQAAFQAAAJjbAQAXAAAAqAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCUAABwlAAAc +JQAAcDYAABwlAAAcJQAAZDYAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwa +AAC0GwAAuBsAACwdAACsHQAAMB0AABwlAAAcJQAA/D4AAGRCAAA0QwAAHCUAABwlAAAcJQAAyD0A +APysAAD4rAAAAK0AABwlAAAcJQAAHCUAAHQ2AAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAA +HCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAc +JQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAYDcAABwl +AAAcJQAAHCUAABwlAAAcJQAAQDgAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUA +ABwlAAAcJQAAyPIAABwlAADo8wAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAADcZAAA +HCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAACoWwEAOF8BABwlAABM +RAEAHCUAAPhFAQCoNQEAHCUAABwlAACsQwAAHCUAABwlAAAcJQAAHCUAABwlAAAQrQEAhKwBABwl +AAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAgzAEAJMwBABwlAAAcJQAAHCUAABwlAAAcJQAAHCUA +AGy1AQAcJQAAlLgBABwlAAC03AEAHCUAAHggAAB8IAAAHCUAABwlAADgzQEAtFMAABwlAAAcJQAA +HCUAAASwAQAcJQAAHCUAAAAXAQAgYwEAHCUAABwlAAAcJQAA1GkBAPQwAQAcJQAAHCUAABwlAAAc +JQAAHCUAABwlAABIcAEAHCUAAOzMAQDwzAEA/MwBAADNAQD0zAEA+MwBAATNAQAcJQAAHCUAABwl +AAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAACERQAAHCUAABwlAAAcJQAAHCUAABwlAABczAEAkMwB +AGg6AAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAA +HCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAc +JQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAAHCUAABwlAAAcJQAADDsAAIw7AAAQPAAArDwAALxg +AACEPAAAHCUAABwlAAAcJQAAHCUAABwlAAAEOwAACDsAABwlAAAcJQAA3EMAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAABAAAAAQEAAAAAAAAQAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhAw4e4eEDDh7hwQIKHuGBBQwe4eEDDh7h +4QMOHuHBAgYe4YEFDB7hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAQEBAQEBAQEBAQEBAQEBAQ0NDQ0NDQ0NDQ0NDQ0NDQ0DAwMDAwMDAwMDAwMDAwMDAAAA +AAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQENDQ0NDQ0NDQ0NDQ0NDQ0NAwMDAwMDAwMDAwMD +AwMDAwAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBDQ0NDQ0NDQ0NDQ0NDQ0NDQMDAwMD +AwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAkQIAADHKLwCRAgAAMcovAJECAAAxyi8AkQIAADHK +LwCRAgAAMcovAJECAAAxyi8AkQIAADHKLwCRAgAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAAMcov +AEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEMBAAAxyi8AQwEAADHKLwBADQAA3gMJAAAAAAAAAAAA +AAAAAMDyAAABAAAAhC2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAD +AAAAAAAAAAgAAAAAAAAAQEIPAHT2AABY9wAAaPgAADD6AABo+AAAMPoAANj7AABc/AAAgICAgICA +gIABgAKAgICAgAAAAAAEAQEABAEBAAAAAAAAAAAAAAAAAAAAAAAEAQEABAEBAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAACELYAAhC2AAKQgoAA4IKAAAQAAAPz///8AAAAAAAAAAKQtgACkLYAA +qCCgADwgoAAIAAAA8////wAAAAAAAAAAxC2AAMQtgACsIKAAbCCgADAAAADP////AAAAAAAAAAAA +AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAABQXAQAFAAAAxC2AACgc +AQAA/wMASBwBAAD/BQAsHQEAAP8tAFAdAQAA/z0ACB0BAAD/BADsHAEAAP8lAOAjAQDIJAEAOCUB +AHAgAQCwHwEAICYBAKQmAQDoJgEAOCcBAAAAAAAsAQAAXgEAAAEAAAABAAAAAQAAAAEAAAADAAAA +AAAAAAAAAAAAAAAAAwAAAAIAAAADAAAAAwAAAAMAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAADQ +LAEACgAAAIQtgAAAAAAAAAAAAAAAAABcLQEACgAAAIQtgAAAAAAAAAAAAAAAAACQLQEACgAAAIQt +gAAAAAAAAAAAAAAAAAAILgEACgAAAIQtgAAAAAAAAAAAAAAAAAAkLwEACgAAAIQtgAAAAAAAAAAA +AAAAAACcLgEACgAAAIQtgAAAAAAAAAAAAAAAAADwNAEABgAAAIQtgAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAQAAAAAIAAAAAAoAAQJwAA6AMAAOgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAALEsBADBMAQDYTgEAgFEBAPRTAQBYVwEAwE0BABwFgACIfYAAGAAAAEh9 +gAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBZAQAGAAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2A +AAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAA +AAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAK +AAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAA +AAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAA +AFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAAAFQIAQAKAAAAhC2AAAAAAAAAAAAAAAAAACxhAQAKAAAA +hC2AAAAAAAD//////////wAAAAAAAAAAAAAAALRiAQAFAAAAxC2AAGQAZABpANwAyABaAKoAvgCG +AX0APgBkAGQAaQDcAMgAWgCqAL4AhgF9AD4AAAAAAAEBAAAAAAAAAAECAQEAAgEAAQICAgABAQAC +AQIBAgACAAECAwAAAAC4bwEA1HwBAMCHgADAAwAAAAAAALhvAQDUcAEAgIuAAPgBAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAMgQEAKH8BAHiNgABUAAAAAAAAALhvAQBUfwEA+I2AAFABAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAEAAAC4bwEA2HsBABw3gABQAQAAAAAAABCBAQDkfQEAvAaAAAIAAAAA +AAAAuG8BABB+AQDABoAABAAAAAAAAAAIgQEA1HABAMyNgAAsAAAAAAAAALhvAQB8fgEAAAAAAAAA +AAAAAAAAuG8BADx+AQDEBoAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgAC +AAMABAAEAAUABgAGAAcAIAAgACEAIgAiACMAJAAkACUAJgAmAEMARABEAEUARgBGAEcASABIAEkA +SgBKAEsATABMAE0ATgBOAE8AUABQAFEAbgBuAG8AcABwAHEAcgByAHMAdAB0AHUAdgB2AHcAeAB4 +AHgAeAB4AHgAeAB4AHgADwA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQACAAMA +AwAEAAUABQAGAAcABwAIAAkACQAKACMAIwAkACUAJQAmACcAJwAoACkAKQBGAEcARwBIAEkASQBm +AGcAZwBoAGkAaQBqAGsAawBsAG0AbQBuAG8AbwBwAHEAcQByAHMAcwB0AHUAdQB2AHcAdwB4AHgA +eAB4AHgAeAB4AHgADgA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgACAAMABAAE +AAUABgAGAAcAIAAgACEAIgAiACMAJAAkACUAJgAmAEMARABEAEUARgBGAEcASABIAEkASgBKAEsA +TABMAE0ATgBOAE8AUABQAFEAbgBuAG8AcABwAHEAcgByAHMAdAB0AHUAdgB2AHcAeAB4AHgAeAB4 +AHgAeAB4AHgADwBDAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQACAAMAAwAEAAUABQAGAAcABwAIAAkA +CQAKACMAIwAkACUAJQAmACcAJwAoACkAKQBGAEcARwBIAEkASQBmAGcAZwBoAGkAaQBqAGsAawBs +AG0AbQBuAG8AbwBwAHEAcQByAHMAcwB0AHUAdQB2AHcAdwB4AHgAeAB4AHgAeAB4AHgAeAB4AHgA +eAB4AHgACABDANhnAQAS0gAAAAAAAP//DwA4eQEAtgAAAAAAAAD/AAAAOHkBALcAAAAAAAAA/wAA +ADh5AQC4AAAAAAAAAP8AAAA4eQEAuQAAAAAAAAD/AAAAOHkBALoAAAAAAAAA/wAAADh5AQC7AAAA +AAAAAP8AAAA4eQEAvQAAAAAAAAD/AAAAOHkBAL4AAAAAAAAA/wAAADh5AQC/AAAAAAAAAP8AAAA4 +eQEAwAAAAAAAAAD/AAAAOHkBAMEAAAAAAAAA/wAAADh5AQDCAAAAAAAAAP8AAADYZwEAE9IAAAAA +AAD//w8AOHkBABsBAAAAAAAA/wAAADh5AQAcAQAAAAAAAP8AAAA4eQEAHQEAAAAAAAD/AAAAOHkB +AB4BAAAAAAAA/wAAADh5AQAfAQAAAAAAAP8AAAA4eQEAIAEAAAAAAAD/AAAAOHkBACIBAAAAAAAA +/wAAADh5AQAjAQAAAAAAAP8AAAA4eQEAJAEAAAAAAAD/AAAAOHkBACUBAAAAAAAA/wAAADh5AQAm +AQAAAAAAAP8AAAA4eQEAJwEAAAAAAAD/AAAA2GcBABTSAAAAAAAA//8PADh5AQCCAQAAAAAAAP8A +AAA4eQEAgwEAAAAAAAD/AAAAOHkBAIQBAAAAAAAA/wAAADh5AQCFAQAAAAAAAP8AAAA4eQEAhgEA +AAAAAAD/AAAAOHkBAIcBAAAAAAAA/wAAADh5AQCJAQAAAAAAAP8AAAA4eQEAigEAAAAAAAD/AAAA +OHkBAIsBAAAAAAAA/wAAADh5AQCMAQAAAAAAAP8AAAA4eQEAjQEAAAAAAAD/AAAAOHkBAI4BAAAA +AAAA/wAAANhnAQAI0gAAAAAAAP//AwAYaAEAAIIAAAAAAAD/AQAAGGgBAAGCAAAAAAAA/wEAANhn +AQAJ0gAAAAAAAP//AwAYaAEAAoIAAAAAAAD/AQAAGGgBAAOCAAAAAAAA/wEAANhnAQAK0gAAAAAA +AP//AwAYaAEABIIAAAAAAAD/AQAAGGgBAAWCAAAAAAAA/wEAANhnAQAG0gAAAAAAAP8BAADYZwEA +B9IAAAAAAAD/AwAA2GcBAAbSAAAJAAAAAP4DANhnAQAH0gAACgAAAAD8DwDYZwEABtIAABIAAAAA +APwH2GcBAAfSAAAUAAAAAADwP9hnAQAV0gAAAAAAAP8DAADYZwEADNIAAAAAAAD/AQAA2GcBABXS +AAAKAAAAAPwPANhnAQAM0gAACQAAAAD+AwDYZwEAFdIAABQAAAAAAPA/2GcBAAzSAAASAAAAAAD8 +BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzSDdIR0hDSAtIB0gPSG9IL0gCABdIS0hPSFNIE +QwbSB9IE0gkQAAC1ABoBgQEFAAQABgAIAAkACgALAAwAgwCSAOgA9wBOAV0BDwAuAAAAbAAAAHQA +AACAAAAAjAAAAJ0AAAAHAAAABAAAAAgAAAAQAAAAQAAAAIAAAAAgAAAAAAAAAAkAAAASAAAAAAAA +AAoAAAAUAAAA/////wAAAAAtAQAA3QEAAFoCAAC6AgAACgMAAE0DAACHAwAAugMAAOgDAAARBAAA +NwQAAFkEAAB6BAAAmAQAALQEAADOBAAA5wQAAP4EAAAVBQAAKgUAAD4FAABRBQAAZAUAAHUFAACG +BQAAlwUAAKcFAAC2BQAAxQUAANMFAADhBQAA7gUAAPsFAAAIBgAAFAYAACAGAAArBgAANwYAAEIG +AABMBgAAVwYAAGEGAABrBgAAdQYAAH4GAACIBgAAkQYAAJoGAACiBgAAqwYAALQGAAC8BgAAxAYA +AMwGAADUBgAA2wYAAOMGAADqBgAA8gYAAPkGAAAABwAABwcAAA4HAAAUBwAAGwcAACIHAAAoBwAA +LgcAADUHAAA7BwAAQQcAAEcHAABNBwAAUwcAAFgHAABeBwAAZAcAAGkHAABvBwAAdAcAAHkHAAB/ +BwAAhAcAAIkHAACOBwAAkwcAAJgHAACdBwAAogcAAKcHAACrBwAAsAcAALUHAAC5BwAAvgcAAMIH +AADHBwAAywcAANAHAADUBwAA2AcAANwHAADhBwAA5QcAAOkHAADtBwAA8QcAAPUHAAD5BwAA/QcA +AAEIAAAFCAAACAgAAAwIAAAQCAAAFAgAABcIAAAbCAAAHwgAACIIAAAmCAAAKQgAAC0IAAAwCAAA +NAgAADcIAAA7CAAAPggAAEEIAABFCAAASAgAAEsIAABPCAAAUggAAFUIAABYCAAAWwgAAF8IAABi +CAAAZQgAAGgIAABrCAAAbggAAHEIAAB0CAAAdwgAAHoIAAB9CAAAgAgAAIIIAACFCAAAiAgAAIsI +AACOCAAAkQgAAJMIAACWCAAAmQgAAC4AAABsAAAAdAAAAIAAAACMAAAAnQAAAAcAAAAAAAAAAAAA +AAoAAAAN0hHSENIC0gHSA9Ib0gvSAIAF0hLSE9IU0gRDCNIJ0grSHNIG0gfSAQAAAAAAAAAAAAAA +AAAAAAMAAAAEAAAAAwAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAP8DAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAC1ABoBgQEEAA8AgwDoAE4BkgD3AF0BBgAIAAkACgALAAwABQAAAAAAAAAsAAEA +AAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAADfAAAAGQEAAGIBAAC+AQAAMgIAAMMCAAB7AwAAYgQA +AIQFAADyBgAAvggAAAILAAABAAAAAgAAAAAAAAAL0g7SDdII0gnSCtIS0hPSFNIR0hDSAtIB0gPS +AIAF0gRDG9Ic0gTSAEUw0jHSAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH +AAAABwAAAAAAAAADAAAABAAAAAMAAAAAAAAA/wMAAAMAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAA +AAAAAAAAAAAAALUAGgGBAQUABAAPABAACgALAAwAAAAAAAAAAAAsAAEAAAACAAIAAgAAAAAAAQAB +AAIAAgACAAMAAwAEAAQABQAFAAYABgAHAAcACAAIAAkACQAKAAoACwALAAwADAANAA0ADgAOAA8A +AAAAAAAAAAAAAAAA/LIBAAYAAACELYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcBYAAiH2AABgAAABIfYAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwFgACIfYAAGAAA +AEh9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAFy/AQAEAAAAhC2AAAAAAAAAAAAAAAAAADi+AQAEAAAA +hC2AAAAAAAAAAAAAAAAAACTAAQAGAAAAhC2AAAAAAAAAAAAAAAAAADi+AQAEAAAAhC2AAAAAAAAA +AAAAAAAAAFy/AQAEAAAAhC2AAAAAAAAAAAAAAAAAADi+AQAEAAAAhC2AAAAAAAAAAAAAAAAAAFy/ +AQAEAAAAhC2AAAAAAAAAAAAAAAAAADi+AQAEAAAAhC2AAAAAAAAAAAAAAAAAACTAAQAGAAAAhC2A +AAAAAAAAAAAAAAAAADi+AQAEAAAAhC2AAAAAAAAAAAAAAAAAAFy/AQAEAAAAhC2AAAAAAAAAAAAA +AAAAACTAAQAGAAAAhC2AAAAAAAAAAAAAAAAAAFy/AQAEAAAAhC2AAAAAAAAAAAAAAAAAAFy/AQAE +AAAAhC2AAAAAAAAAAAAAAAAAACTAAQAGAAAAhC2AABwFgACIfYAAGAAAAEh9gAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAUA +AAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwQEBAQEBQYHCAgICAgJCgsMDQAAAAUGBwgNDg8Q +FRYXGBkAAAoNERQKDREUCg0RFAoKAAAAAAAABgYGBgkJCQkABgAAbjtoO2I7XDtuOmg6YjpcOm45 +aDliOVw5bjhoOGI4XDhuN2g3YjdcN24paCliKVwpbihoKGIoXChuJ2gnYidcJ24ZaBliGVwZbhho +GGIYXBhuF2gXYhdcF24JaAliCVwJbghoCGIIXAhuB2gHYgdcB24GaAZiBlwGbgVoBWIFXAVuBGgE +YgRcBG4DaANiA1wDbgJoAmICXAJuAWgBYgFcAW4AaABiAFwAbjtoO2I7XDtuOmg6YjpcOm45aDli +OVw5bjhoOGI4XDhuN2g3YjdcN24paCliKVwpbihoKGIoXChuJ2gnYidcJ24ZaBliGVwZbhhoGGIY +XBhuF2gXYhdcF24JaAliCVwJbghoCGIIXAhuB2gHYgdcB24GaAZiBlwGbgVoBWIFXAVuBGgEYgRc +BG4DaANiA1wDbgJoAmICXAJuAWgBYgFcAW4AaABiAFwAAAAAAAAAAAAAAAAAEOEBAAgAAADELYAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////wAB//8C +A////wT//////////////////////wX/Bv8H/wj/Cf8K/wv/DP///w3///8O////D////xD///// +/////////////////////////////////////////xH///8S////E////xT///8V////Fv///xf/ +//8Y////Gf///xr///8b/////xz///8d////Hv///x////8g////If////////////////////// +IiMk/yUmJ///KP///yn///////////////////////////////////////////////////////// +/////////////////////wEEAAACBQEAAwYCAAQHAwAFCAQABgkFAAcKBgAICwcACQwIAAoNCQAL +DgoADA8LAA0QDAAOEQ0AAUEABAJCAQQDQwIEBEQDBAVFBAQGRgUEB0cGBLcTIgC4FCMAuRUkALsW +JQC8FyYAvRgnAMAZKADEGikABxsAAAgcAQALHQIADB4DABAfBAAiIQUAJCIGACYjBwAoJAgAKiUJ +ACwmCgAuJwsAMCgMADQpDQA4Kg4APCsPAEAsEABkLhEAaC8SAGwwEwBwMRQAdDIVAHgzFgB8NBcA +gDUYAIQ2GQCINxoAjDgbAJE6HACVOx0AmTweAJ09HwChPiAApT8hACRJBgIsSgoCNEsNATxMDwFk +TREBbEMTAXRPFQF8UBcBhFEZAZVSHQGdUx8BAAQWCBYWFgwWFhYWFhYWEAAAAAAPAD8AAQAAAA8A +PwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAgAAAA8APwABAAAAAAAA +AAEAAAACAAAAAwAAAAAAAAAEAAAAAgAAAAUAAAAYCAGlDAIApQA8ODQwLCgkIBwYFBAMCAQADAgE +ADw4NDAsKCQgHBgUEAwIBAIAFA4AAAAAGgAAAAEBAAECAQEBAQEBAQEBAQECAgICAgICAgMDAwMD +AwMDBAQEBAQEBAQBAgICAgICAwMDAwMDAwMDAwMDAwMEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA +AAAAAQECAQICA3//Bw8fPwEDAQMPBwEHDx8/f///BQAHAgMEBgZ00UUX6KKLLg0PBQcJCwEDChQ3 +blVVVQFLaC8BVVVVBeM4jgOqqqoCcRzHAaqqqgrHcRwHKAAoADAALAAsACgAPAA0ACgAKAA0ADAA +LAAsAEQAPABAADwAjABsAFgASAD0ALAALAAsADwANAAwACwAVABEAFQAVABsAGAAXABUAIwAeAA6 +AQIB1QDfANoAogB1AH8AagEaAdkA6AAKAboAeQCIAIoFKgM5AagBigXKAtkASAHKAUoB4gD5AMoB +6gCCAJkAZuYAAJ3YiZ1O7MRONEiDNCd2YicapEEaEzuxExEYgREP/MAPTuzETid2YicapEEaEzux +Ew3SIA2JndgJCIzACAd+4Ac0SIM0GqRBGhEYgREN0iANCIzACAZpkAawstUFBVRABSd2YicTO7ET +DdIgDYmd2AkGaZAGxE7sBARGYAQDP/ADqqqqqhqkQRoTO7ETD/zADxEYgREN0iANCqiAChM7sRMP +/MAPD/zADw3SIA0LtEALC7RAC4md2AkN0iANCqiACgqogAoIjMAIB3iABwd4gAcGaZAGD/zADw3S +IA0LtEALDdIgDQu0QAuJndgJCIzACImd2AkIjMAIB37gBwd+4AfBLCkHCqiACgiMwAgHeIAHCIzA +CAd4gAcGaZAGsLLVBQZpkAawstUFBVRABQVUQAXWHcYEDQAaACcANABOAGgAdQCCABoANABOAGgA +nADQAOoABAEnAE4AdQCcAOoAOAFfAYYBNABoAJwA0AA4AaAB1AEIAgwATgBoAIIAdQCcAMMAaACC +AIIAnAC2ALYA0ACcAMMAwwDqABEBEQE4AYIAnAC2AJwAtgDQAOoA0ADqAAQBBAEeAcMA6gARAeoA +EQE4AV8BOAFfAYYBhgGtAQAAMAAAADYAAAAMAAAAEgAAABgAAAAkAAAABgAAAAkAAAAAAAAAAAAA +ABggFBQODhQUBQYBAgMEAAAAAQECAQICAwQMDAgEDAQEQAAAAIAAAAAAAQAAAAIAAEAAAAAABAAA +QAAAAEAAAAAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uL0BBQkNERUZHSElKS0xNTk9Q +UVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8tAA8gAPBhAAAA +AAAAAAAAAAECBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYN74Ac76wvpq+bAAArq5kBq58ha6u +SQAJAAAAAgAAAAAAAAAAAAAACQAAAAIAAAAAAAAAAAAAAAkAAAADAAAAAQAAAAkAAAAJAAAAAgAA +AAIAAAAJAAAAAQIBAgMEAAAFBgcICQoAAAAFBgACBAAFAAAAAAAFBwEDBAAFAQAAAEAjQCUhISEh +QEBAQEAFBAQBAUBAQEAFBUBADAxADQwMAQEBBUBABQUABAAEQEAABEBAQAVAQEBAQAVAQEAFBQUB +AQEBQAUFBQEFAQFABQUFQAVABQUFBQVsAHAEdAh0DAAEBAYAAAAAAAAAAGQAAAAAkAEACgAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAA +AAAAAAAAAAAAAAAAAQAAABAAAAAAAAAAAQAAAAEAAAAAAAAA/wAAAP8AAAAAAAAAAAAAAFjAAQAA +AAAAAAQAAGQAAAAHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcHBwcGBgYGBgUFBQUFBAQEBAQDAwMDAwICAgICAQEBAQEAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJF4BACxeAQA0XgEAiF4BAJBe +AQCYXgEAAAQOCR0tNwAABA4JHSw7AAEQAAEAAAACgAABQgYCEAACIAAAA8AAAUMGAxAAAsAAAAPA +AAFDBgQQAAJAAAACgAABRAYFEQAAQAAAA8AAAUUGBhEAAOAAAAPAAAFFBgcRAAEAAAACgAABRgYI +EQACIAAAA8AAAUcGCREAAsAAAAPAAAFHBgoRAAJAAAACgAABSAYLEgAAQAAAA8AAAUkGDBIAAOAA +AAPAAAFJBg0SAAEAAAACgAABSgYOEgACAAAAAoAAAUwGAAAiFgAAgAAAAwAAAVkAJBYAAQAAAAMA +AAFaACYWAAIAAAAEAAABWgAoFgACAAAAAwAAAVsAKhYAAoAAAAMAAAFcACwXAAAAAAAEAAABXAAu +FwAAgAAAAwAAAV0AMBcAAQAAAAMAAAFeADQXAAIAAAADAAABXwA2FwACgAAAAwAAAWAAOBgAAAAA +AAQAAAFgADwYAAEAAAADAAABYgA+GAACAAAABAAAAWIAQBgAAgAAAAMAAAFjAGQbAAIAAAADAAAB +bwFmGwACgAAAAwAAAXABaBwAAAAAAAQAAAFwAWwcAAEAAAADAAABcgFuHAACAAAABAAAAXIBcBwA +AgAAAAMAAAFzAnQdAAAAAAAEAAABdAJ2HQAAgAAAAwAAAXUCeB0AAQAAAAMAAAF2AnwdAAIAAAAD +AAABdwN+HQACgAAAAwAAAXgDgB4AAAAAAAQAAAF4A4QeAAEAAAADAAABegOGHgACAAAABAAAAXoE +iB4AAgAAAAMAAAF7BIwfAAAAAAAEAAABfASRHwABQAAAAwAAAX4ElR8AAwAAAAQAAAF/BZcfAALA +AAADAAABgAWZIAAAQAAAAwAAAYEFnSAAAUAAAAMAAAGCBZ8gAAHAAAADAAABgwWhIAADAAAABAAA +AYMFpSEAAEAAAAMAAAGFBQAAAAAAAAAAAACotgEAvLYBACS3AQAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAkAAAAABQkRExcAAA4AAAAqAAAABwAAAAsAAAD/////AAAAAAAAAAAB +AAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAQAAAAEAAAAAAAAAAAAAAAUFBQUFBQUFAAAAAIANAAAAIAAAgA0AAIANAAAAIAAAgA0A +AAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAA= +==== diff --git a/sys/contrib/dev/iwn/iwlwifi-5150-8.24.2.2.fw.uu b/sys/contrib/dev/iwn/iwlwifi-5150-8.24.2.2.fw.uu new file mode 100644 index 000000000000..861fcff6873f --- /dev/null +++ b/sys/contrib/dev/iwn/iwlwifi-5150-8.24.2.2.fw.uu @@ -0,0 +1,5961 @@ +Copyright (c) 2006-2009, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. 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 MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER 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. +begin-base64 644 iwlwifi-5150-8.24.2.2.fw.uu +AgIYCCjXAQAAwAAAuM4BAADAAAAAAAAAICCADwAAQABpIAAAaSBAAGkgAABpIEAAICCADwAA6ABp +IAAAaSBAAGkgAABpIEAAICCADwAArAVpIAAAaSBAAGkgAABKIAAASiEAAEoiAABKIwAASiQAAEol +AABKJgAASicAAEogABBKIQAQSiIAEEojABBKJAAQSiUAEEomABBKJwAQSiAAIEohACBKIgAgSiMA +IEokACBKJQAgSiYAIEonACBKIAAwSiEAMAokgD+AAADAQSycMEAsnDBCJBw0CiKAP4AAiFYKIwA3 +Kg8AAEomAHBpIEAASiYAcEomAHBKJgBwSiYAcAAWAHCAAFgEQHggIECHAAAAAAAAAAAAAArIz3Gg +AMgfDhkYgAvIDxkYgAzIEBkYgA0SAjYAyER4ERkYgA7ILRkYgOB+4cT8HMi+/BxIvuHA4cHhwuHD +/BwIsfwcSLH8HIix/BzIsfwcCLL8HEiy/ByIsvwcyLL8HAi/aiSAEOHEaiTAEOHE8cDPcKAA0BsU +gM9xgABUBAQggI/PUQThAKEK8i8pAQDPcIAApAjwIEAAQHja/9HAwcRrJMAQwcRrJIAQwcSfdAQU +CzQEFAo0BBQJNAQUCDQEFAc0BBQGNAQUBTQEFAQ0wcPBwsHBwcDBxEUsfhAKJkB+wcRrJIAUwcQg +IECHCsiHuAoaGDALyJu4CxoYMAzIDBoYMA3Ih7gNGhgwDsiFIMMPDhoYMOB+4HjxwArIlbgKGhgw +C8ibuAsaGDANyIq4jbiQuA0aGDDPcIAAzAkYiIHgC/QNyM9xAACwCqy4DRoYMN4NIAAP2GfY+g7g +AIohhgjRwOB+8cDPcIAAWKMAgIYg/oEJ9A3IBSCADwAAANQNGhgwoP+KIFUFyg7gAIohxgzo8eB4 +8cDPcQMAQA3PcKAAqCAtoM9ygACUBCCCAWkAomIOIAFI2M9wgAAICCWAI4EggcdxAACIE54IAAjK +8eB4z3CAAAgILQAACOB48cDSCkABgODPdoAAVAQG8oHgBvQB2APwANgLroDhBvKB4Qb0AdgD8ADY +Cq6A4gbygeIG9AHYA/AA2AyuANjPdaAAyB8YHRiQC46A4IohEAAO8giOgOAM8s9wAwBADUUdGBAw +pQLYGB0YkAPwMaUKjoDgGvIJjoDgFvLPcAEAJtcgHRiQz3CAACQAIR0YkM9wgABQBCIdGJAYFQCW +RSAAAxgdGJAMjoDgB/IYFQCWhSABBBgdGJCA4xjyANiUuM92gACIBACmcdgGuLoIIAH82SCGz3AA +AEwcqgggAZ+5GBUAloW4GB0YkFUCQAHPcaqqu7vPcJ8AuP82oDagNqA2oM9xoADIOw6BiLgOoWkg +QAD+8eB48cClwUHAQsEMHAAxEBxAMc9xgAD8VzQZwA8wGQAPLBnADigZgA4kGUAOz3CAAPxXIBhA +C89wgAD8VxwYAAvPcIAA/FcYGMAKz3CAAPxXFBiACs9wgAD8VxAYwAjPcIAA/FcMGIAIz3CAAPxX +CBhACM9xgACAV4AZAAh8GcAHeBmAB3QZQAdwGQAHbBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlA +BVAZAAVMGcAESBmABEQZQARAGQAE76HOoa2hjKEsGcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUAB +EBkAAWOhaiAAA9gZAABqIMAC1BkAAGoggALQGQAAaiBAAcgZAABqIAABxBkAAGogwADAGQAAaiCA +ALwZAABqIEAAuBkAAGogAAC0GQAAaiCAAcwZAADQ2J+4z3GfALj/HaHPcIAAAADEgFMlxDVTJsU1 +17oB5tO+xKBTI8AEBSaOH9D+AADWoQUggA+w/gAAFqEYgVMnzjUA3ZS4GKFAwwHAAsHJcwwUBjAq +DOAAEBQHMM9woAC0D7ygz3GgAMg7LoHCC+AAfdhiDEAB+g7gAKlwCNgA2boO4ACZuRDx8cDWDyAB +e9ieC+AA19nPcYAA/Fc0GcAPMBkADywZwA4oGYAOJBlADs9wgAD8VyAYQAvPcIAA/FccGAALz3CA +APxXGBjACs9wgAD8VxQYgArPcIAA/FcQGMAIz3CAAPxXDBiACM9wgAD8VwgYQAjPcYAAgFeAGQAI +fBnAB3gZgAd0GUAHcBkAB2wZAAdoGYAGZBlABmAZAAZcGcAFWBmABVQZQAVQGQAFTBnABEgZgARE +GUAEQBkABO+hzqGtoYyhLBnAAigZgAIkGUACIBkAAhwZwAEYGYABFBlAARAZAAFjoWogAAPYGQAA +aiDAAtQZAABqIIAC0BkAAGogQAHIGQAAaiAAAcQZAABqIMAAwBkAAGoggAC8GQAAaiBAALgZAABq +IAAAtBkAAGoggAHMGQAA63bPdaAAyB8ZFRGWz3AAAEQcVgogAQogwC9acM9wgABEKCOAz3OfALj/ +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 +AIXpAI/z4HjgfuB44H7gePHAABYAQc9ygAAQQgayABYFQUAiAQQOGkQBTCWAhMohwg/KIsIHyiBi +Acojgg8AAEQAeAYi8sokIgAA2gfwABYAQRQhjAAAtAHiLyBCARByt/aqCE/z0cDgfuB44H7geOB+ +4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4z3CAAKQH4H8AgOB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4 +4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4Hjg +fwHY4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+ +4HjgfuB44H7gePHA4cXPdYAAUEKpcNoPL/MD2QAVhRBEJUABheDKIcEPyiLBB8ogYQHKI4EPAABP +ACgFIfLKJGEAAY2D4MP2Y7gBrWoPD/NFB0/z4HjxwMIOT/Macc92gABQQiCOUSEAgEbyz3GAAKwH +IImA4cwgIaA+8oHgBvTPcIAA/IOhgAPwAN2O5QP3gOUC9ADdz3GAAPyDGImA4AT0gOUE9ADfBPCi +gQTfiiATARIKL/OpcYogUwEKCi/z6XHPcIAAzAkYiIPgzCAigcwg4oHMICKCCPKKIBMB5gkv84vZ +CvAKlhB1CPQLlhB3zCAhoAT0ANgh8AHYz3GgAMgfDaHPcIAArAcBiOu2qrYEvxC45X0FfYogEwGq +CS/zotmKIBMBngkv86lxz3CgAMgffxhYgwHYRQZP8+B48cDeDW/zCHHE/4DgPPIg3c92oADIH7Cm +MthDHhgQANj+DS/zjbixprCmHthDHhgQANjuDS/zjbixpn8WD5aKIBMBQS8NFMS9Pgkv88zZiiAT +ATYJL/PpcYogEwEqCS/zqXHPcYAArAcBiQHaEHXCIooAgOVAqcj2ANgNpoHiBPQE2AGpwQVP889w +gABQQgCIUSCAgAfyz3GgAMAdAIGAuACh4H7PcIAAUEIAiFEggIAH8s9xoADAHQCBoLgAoeB+8cDh +xc9wgAAACACQz3WAANCrqXFmDqAAiiIECwCNhODKIcsPyiLLB8ogawHKI4sPAAB5CcokKwAsAyvy +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 +AAATJAEAEyU4HMAR4EGAgQAAwBYIABNiAAATJQMAEyRUBMURfwITJAQAxRHkQYCBAADAFggAxREA +AAAh7FaAgQAAwBY8BMARAAWAgQAAwBYEARtiEATAEAMAGyRUBMARJATAEQgEwBCsVoCBAADAFwgE +wBCMVoCBAADAFwAAGyUDHBtiQAAbJDAcwBEFAABhBAWAgQAAwBYPGxkiCASggTjwxIAAABskAgAb +JTgcwBEAAAAhAAWAgQAAwBZMBMARBAWAgQAAwBYPGxkiSASggTjwxIAAABskAgAbJTgcwBEAAAAh +AAAAhQAFgIEAAMAWDxsEIhAEG2YPARtoFBzAEAoAG0AEABtuAwAAYQ8cHSIBAB0m+Q8AYWQMABAA +wAYRAQAEJ/wABGQAABskAgAbJTgcwBEAAAAhAAAbJUAAGyQwHMARAAAAIQ8cHSIYAR0mGADHEIh4 +gIEAAMAXIADHEJB4gIEAAMAXAAAAIRAtgIH4QcQQDxsJIgALCTkCAApiAwEKYgQCCmIAAAlABAAA +YQkACUACAABhCgAJQAAAAGECAAlBAAkaKAAAwBYBABsmAADAFwQAHSYBAAgn6wAIZAAAACEAAAAA +LAEAAAEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcNAAAwDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAQAAAMAAkADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArHmAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4goAA +tFYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAnIKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQAAAAAAAAAAAAABAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAoAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAcKCAAASTAQAAAAAA +/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFR4gACkrAEAAAAAAAAAAAAAAAAAAAAAAFR4 +gADYswEAAAAAAAAAAABUeIAATLUBAAAAAAAAAAAAAAAAAFR4gAAAAAAAAAAAAAAAAAD/AAAAAAcA +AAAAAAAAAAAAAAAAAH9/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgQI +AAgQIAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwBwAAFQAAAKAqgACI +CgAAiAoAAIgKAACICgAAiAoAAIgKAACICgAAiAoAAIgKAACICgAAiAoAAIgKAACICgAAiAoAAIgK +AACICgAAiAoAAIgKAACICgAAiAoAAIgKAACICgAAiAoAAIgKAACICgAAiAoAAIgKAACICgAAiAoA +AIgKAACICgAAzAsAAAAAAAAYGwEAiAoAAMgIAACICgAAiAoAAIgKAAD4CAAA/AEBACxUAACICgAA +iAoAADAJAAAwCQAAMAkAADAJAAAwCQAAMAkAADAJAACICgAAiAoAAIgKAACICgAAVAoAAIgKAACI +CgAAiAoAAIgKAACICgAA0AsAAIgKAACICgAArAgAAAMAAACQuwEAAgAAAPQnAQAEAAAANDEAAAYA +AABAvQEAEQAAAIiMAQAHAAAAJK8BAAgAAADAvQEADAAAAIxAAQANAAAAIEUBAA4AAABYRQEAFgAA +AIAaAQALAAAAXFoBABQAAABIVQAADwAAALx4AQAQAAAAFBIBAAEAAAAAqwEAEgAAAEBvAQATAAAA +sGABAAUAAAB0VQAAFQAAAEDNAQAXAAAAzAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAQAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtCUAALQl +AAC0JQAAVDcAALQlAAC0JQAASDcAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUA +AHwaAAAgHAAAJBwAAJwdAAAkHgAAoB0AALQlAAC0JQAABEAAAHhDAABMRAAAtCUAALQlAAC0JQAA +yD4AAKieAACkngAA4J4AALQlAAC0JQAAtCUAAFg3AAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0 +JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQl +AAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAASDgA +ALQlAAC0JQAAtCUAALQlAAC0JQAALDkAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAA +tCUAALQlAAC0JQAAdOoAALQlAACc6wAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAACM +VQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAAcWQEAsFwBALQl +AAA8QQEAtCUAAOxCAQBwMgEAtCUAALQlAADIRAAAtCUAALQlAAC0JQAAtCUAALQlAACYlAEAQI4B +ALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAADYvAEA3LwBALQlAAC0JQAAtCUAALQlAAC0JQAA +tCUAAPCuAQC0JQAAJLIBALQlAAB0zgEAtCUAAAghAAAMIQAAtCUAALQlAACYvgEATFUAALQlAAC0 +JQAAtCUAAGypAQC0JQAAtCUAABATAQCcYAEAtCUAALQlAAC0JQAAmGcBAIwtAQC0JQAAtCUAALQl +AAC0JQAAtCUAALQlAAC8dQEAtCUAAKS9AQCovQEAtL0BALi9AQCsvQEAsL0BALy9AQC0JQAAtCUA +ALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAACgRgAAtCUAALQlAAC0JQAAtCUAALQlAAAUvQEA +SL0BAGA7AAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0 +JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQl +AAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAAtCUAALQlAAC0JQAABDwAAIQ8AAAMPQAAqD0A +ALQlAACAPQAAtCUAALQlAAC0JQAAtCUAALQlAAD8OwAAADwAALQlAAC0JQAA+EQAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAABAAAAAQEAAAAAAAAQAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBDQ0NDQ0N +DQ0NDQ0NDQ0NDQMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEB +AQ0NDQ0NDQ0NDQ0NDQ0NDQ0DAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEB +AQEBAQEBAQENDQ0NDQ0NDQ0NDQ0NDQ0NAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAACR +AgAAMcovAJECAAAxyi8AkQIAADHKLwCRAgAAMcovAJECAAAxyi8AkQIAADHKLwCRAgAAMcovAJEC +AAAxyi8AQwEAADHKLwBDAQAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEMBAAAxyi8AQwEA +ADHKLwBDAQAAMcovAEANAADeAwkAAAAAAAAAAAAAAAAAbOoAAAEAAABgKoAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAAAAAACAAAAAAAAABAQg8ANO4AABjvAAAo +8AAA9PEAACjwAAD08QAAoPMAACT0AACAgICAgICAgAGAAoCAgICAAAAAAJj7AACY+wAAAAAAAAAA +AAAAAAAAAAAAAJj7AACY+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAqgABgKoAApCCg +ADggoAABAAAA/P///wAAAAAAAAAAgCqAAIAqgACoIKAAPCCgAAgAAADz////AAAAAAAAAACgKoAA +oCqAAKwgoABsIKAAMAAAAM////8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAD +AAAAAAAAAAAAAAAAAAAAJBMBAAUAAACgKoAAUBgBAAD/AwBwGAEAAP8FAFwZAQAA/y0AgBkBAAD/ +PQA4GQEAAP8EABwZAQAA/yUAPCABACghAQCcIQEAvBwBAPQbAQCIIgEAECMBAFQjAQCkIwEAAAAA +ACwBAABeAQAAAQAAAAEAAAABAAAAAQAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAgAAAAMAAAADAAAA +AwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAFwpAQAKAAAAYCqAAAAAAAAAAAAAAAAAAOgpAQAK +AAAAYCqAAAAAAAAAAAAAAAAAABwqAQAKAAAAYCqAAAAAAAAAAAAAAAAAAJQqAQAKAAAAYCqAAAAA +AAAAAAAAAAAAALQrAQAKAAAAYCqAAAAAAAAAAAAAAAAAACwrAQAKAAAAYCqAAAAAAAAAAAAAAAAA +AKwxAQAGAAAAYCqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAgAAAAACgABAnAADo +AwAA6AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0SAEAQEkBAARMAQC0 +TgEAMFEBALRUAQDcSgEAFAWAABx4gAAYAAAA3HeAAAAAAAAAAAAAAAAAAAAAAAAAAAAARFcBAAYA +AABgKoAAAAAAAAAAAAAAAAAADAQBAAoAAABgKoAAAAAAAAAAAAAAAAAADAQBAAoAAABgKoAAAAAA +AAAAAAAAAAAADAQBAAoAAABgKoAAAAAAAAAAAAAAAAAADAQBAAoAAABgKoAAAAAAAAAAAAAAAAAA +DAQBAAoAAABgKoAAAAAAAAAAAAAAAAAADAQBAAoAAABgKoAAAAAAAAAAAAAAAAAADAQBAAoAAABg +KoAAAAAAAAAAAAAAAAAADAQBAAoAAABgKoAAAAAAAAAAAAAAAAAADAQBAAoAAABgKoAAAAAAAAAA +AAAAAAAADAQBAAoAAABgKoAAAAAAAAAAAAAAAAAADAQBAAoAAABgKoAAAAAAAAAAAAAAAAAADAQB +AAoAAABgKoAAAAAAAAAAAAAAAAAAqF4BAAoAAABgKoAAAAAAAP//////////AAAAAAAAAAAAAAAA +LGABAAUAAACgKoAAZABkAGkA3ADIAFoAqgC+AIYBfQA+AGQAZABpANwAyABaAKoAvgCGAX0APgAA +AAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEBAAIBAAECAgIAAQEAAgECAQIAAgABAgMA +AAAAZIEBABB/AQBMhIAAMAIAAAAAAAAkdQEAUHYBACCYgABQAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAJHUBAEx/AQBwmIAAFAAAAAAAAAAkdQEAfH8BANSZgABQAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAABAAAAJHUBAER6AQC0NIAAUAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACR1AQA8gAEA +tAaAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkdQEArIABAAAAAAAAAAAAAAAAACR1AQBA +gAEAwAaAAAQAAAD/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B +/wH/Af8B/wH/Af4B/QH8AfsBvwG+Ab0BvAG7AboBuQG4AbcBfwF+AX0BfAF7AXoBeQF4AXcBdgF1 +AX8AfgB9AHwAewA/AD4APQA8ADsAOgA5ADkAOQA5ADkAOQA5ADkAOQA5ADkAOQA5ADkAOQA5ADkA +OQA5AAoAPwD/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/gH9AfwB+wH6AfkB+AH3 +AfYB/wD+AP0A/AD7APoA+QD4APcA9gC/AL4AvQC8ALsAfwB+AH0AfAB7AD8APgA9ADwAOwA6ADkA +OAA3ADYANQA0ADMAMgAxADAAJwAmACYAJgAmACYAJgAmACYAJgAmACYAJgAmACYAJgAmACYAJgAm +AAoAPwABAQAAAgEBAAMCAgMYZgEAEtIAAAAAAAD//w8AFIEBAAFAAAAAAAAABgAAABSBAQACQAAA +AAAAAAkAAACEgwEAGwAAAAAAAAD/BwAAhIMBABsAAAAAAAAA/wcAABSBAQACQAAAAAAAAAgAAACE +gwEAGwAAAAAAAAD/BwAAhIMBABsAAAAAAAAA/wcAABSBAQACQAAAAAAAAAkAAACEgwEAGwAAAAAA +AAD/BwAAhIMBABsAAAAAAAAA/wcAABSBAQABQAAAAAAAAAYAAAAUgQEAAkAAAAAAAAAAAAAAhIMB +AA8AAAAAAAAA/wcAAISDAQAQAAAAAAAAAP8HAAAUgQEAAkAAAAAAAAABAAAAhIMBAA8AAAAAAAAA +/wcAAISDAQAQAAAAAAAAAP8HAAAUgQEAAkAAAAAAAAACAAAAhIMBAA8AAAAAAAAA/wcAAISDAQAQ +AAAAAAAAAP8HAAAUgQEAAkAAAAAAAAADAAAAhIMBAA8AAAAAAAAA/wcAAISDAQAQAAAAAAAAAP8H +AAAUgQEAAkAAAAAAAAAEAAAAhIMBAA8AAAAAAAAA/wcAAISDAQAQAAAAAAAAAP8HAAAUgQEAAkAA +AAAAAAAFAAAAhIMBAA8AAAAAAAAA/wcAAISDAQAQAAAAAAAAAP8HAAAUgQEAAUAAAAAAAAAHAAAA +GGYBABPSAAAAAAAA//8PABSBAQABQAAAAAAAAAYAAAAUgQEAAkAAAAAAAAAJAAAAhIMBABwAAAAA +AAAA/wcAAISDAQAcAAAAAAAAAP8HAAAUgQEAAkAAAAAAAAAIAAAAhIMBABwAAAAAAAAA/wcAAISD +AQAcAAAAAAAAAP8HAAAUgQEAAkAAAAAAAAAJAAAAhIMBABwAAAAAAAAA/wcAAISDAQAcAAAAAAAA +AP8HAAAUgQEAAUAAAAAAAAAGAAAAFIEBAAJAAAAAAAAAAAAAAISDAQARAAAAAAAAAP8HAACEgwEA +EgAAAAAAAAD/BwAAFIEBAAJAAAAAAAAAAQAAAISDAQARAAAAAAAAAP8HAACEgwEAEgAAAAAAAAD/ +BwAAFIEBAAJAAAAAAAAAAgAAAISDAQARAAAAAAAAAP8HAACEgwEAEgAAAAAAAAD/BwAAFIEBAAJA +AAAAAAAAAwAAAISDAQARAAAAAAAAAP8HAACEgwEAEgAAAAAAAAD/BwAAFIEBAAJAAAAAAAAABAAA +AISDAQARAAAAAAAAAP8HAACEgwEAEgAAAAAAAAD/BwAAFIEBAAJAAAAAAAAABQAAAISDAQARAAAA +AAAAAP8HAACEgwEAEgAAAAAAAAD/BwAAFIEBAAFAAAAAAAAABwAAADCBAQAG0gAAAAAAAP8BAAAw +gQEAB9IAAAAAAAD/AwAAmGUBABXSAAAAAAAA/wMAAJhlAQAM0gAAAAAAAP8BAACYZQEAFdIAAAoA +AAAA/A8AmGUBAAzSAAAJAAAAAP4DABIAAAAAALwAAQAAAIwBAQDgB1gGEAMAAH8EAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAMAAAABAAAAgAIrAM0EmQMEAAIAAACAAqsAzQQZAQQA +AwAAAIACqwDNBJkCBAAEAAAAgAIrAc0EGQAEAAUAAACAAisBzQSZAQQABgAAAIACKwHNBBkDBAAH +AAAAgAKrAc0EmQAEAAgAAACAAqsBzQQZAgQACQAAAAACqwHNBJkDBAAKAAAAAAJLAM0EGQEEAAsA +AAAAAksAzQSZAgQADAAAAAACywDNBBkABAANAAAAAALLAM0EmQEEAA4AAAAAAssAzQQZAwQAIgAC +AIEBjAABAIADAAAkAAIAgQEMAQEAAAEAACYAAgCBAQwBAQCAAgAAKAACAIEBjAEBAAAAAAAqAAIA +AQGMAQEAgAEAACwAAgABAYwBAQAAAwAALgACAAEBLAABAIAAAAAwAAIAAQEsAAEAAAIAADQAAgAB +AawAAQAAAQAANgACAAEBrAABAIACAAA4AAIAAQEsAQEAAAAAADwAAgABASwBAQAAAwAAPgACAAEB +rAEBAIAAAABAAAIAAQGsAQEAAAIAAGQAAgCBAGwBAQAAAQEAZgACAIEAbAEBAIACAQBoAAIAgQDs +AQEAAAABAGwAAgCBAOwBAQAAAwEAbgACAIEADQABAIAAAQBwAAIAgQANAAEAAAIBAHQAAgCBAI0A +AQAAAQEAdgACAIEAjQABAIACAQB4AAIAAQANAQEAAAABAHwAAgABAA0BAQAAAwEAfgACAAEAjQEB +AIAAAgCAAAIAAQCNAQEAAAICAIQAAgABAC0AAQAAAQIAhgACAAEALQABAIACAgCIAAIAAQCtAAEA +AAACAIwAAgABAK0AAQAAAwIAkQACAAEALQEBAMACAgCVAAIAAQCtAQEAwAEDAJcAAgABAK0BAQBA +AwMAmQACAAEATQABAMAAAwCdAAIAAQBNAAEAwAMDAJ8AAgABAM0AAQBAAQMAoQACAAEAzQABAMAC +AwClAAIAAQBNAQEAwAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAWAABx4gAAYAAAA3HeAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAACyQAQAGAAAAYCqAAAAAAAAAAAAAAAAAAHSsAQAGAAAAYCqAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAWAABx4gAAYAAAA +3HeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAUBYAAHHiAABgAAADcd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEuQEABAAAAGAq +gAAAAAAAAAAAAAAAAADYtwEABAAAAGAqgAAAAAAAAAAAAAAAAADMuQEABgAAAGAqgAAAAAAAAAAA +AAAAAADYtwEABAAAAGAqgAAAAAAAAAAAAAAAAAAEuQEABAAAAGAqgAAAAAAAAAAAAAAAAADYtwEA +BAAAAGAqgAAAAAAAAAAAAAAAAAAEuQEABAAAAGAqgAAAAAAAAAAAAAAAAADYtwEABAAAAGAqgAAA +AAAAAAAAAAAAAADMuQEABgAAAGAqgAAAAAAAAAAAAAAAAADYtwEABAAAAGAqgAAAAAAAAAAAAAAA +AAAEuQEABAAAAGAqgAAAAAAAAAAAAAAAAADMuQEABgAAAGAqgAAAAAAAAAAAAAAAAAAEuQEABAAA +AGAqgAAAAAAAAAAAAAAAAAAEuQEABAAAAGAqgAAAAAAAAAAAAAAAAADMuQEABgAAAGAqgAAUBYAA +HHiAABgAAADcd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAABQFAAAAAAAAAAAAAAAAAAAAAAD/AP8AAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBAQEBAUG +BwgICAgICQoLDA0AAAAFBgcIDQ4PEBUWFxgZAAAKDREUCg0RFAoNERQKCgAAAAAAAAYGBgYJCQkJ +AAYAAPgA6gDdANAAxAC5AK8ApQCcAJMAigCDAHsAdABuAGgAbgFoAW4CaAJuA2gDbgRoBG4FaAVu +BmgGbgdoB24IaAhuCWgJbgpoCm4LaAtuDGgMbg1oDW4OaA5uD2gPbhBoEG4RaBFuEmgSbhNoE24U +aBRuFWgVbhZoFm4XaBduGGgYbhloGW4aaBpuG2gbbhxoHG4daB1uHmgebh9oH24gaCBuAGgAbgFo +AW4CaAJuA2gDbgRoBG4FaAVuBmgGbgdoB24IaAhuCWgJbgpoCm4LaAtuDGgMbg1oDW4OaA5uD2gP +bhBoEG4RaBFuEmgSbhNoE24UaBRuFWgVbhZoFm4XaBduGGgYbhloGW4aaBpuG2gbbhxoHG4daB1u +Hmgebh9oH24gaCBuIWghbiJoIm4jaCNuJGgkbiVoJW4maCZuJ2gnAAAAAAAAAAAAAAAA7NIBAAgA +AACgKoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////// +/wAB//8CA////wT//////////////////////wX/Bv8H/wj/Cf8K/wv/DP///w3///8O////D/// +/xD//////////////////////////////////////////////xH///8S////E////xT///8V//// +Fv///xf///8Y////Gf///xr///8b/////xz///8d////Hv///x////8g////If////////////// +////////IiMk/yUmJ///KP///yn///////////////////////////////////////////////// +/////////////////////////////wEEAAACBQEAAwYCAAQHAwAFCAQABgkFAAcKBgAICwcACQwI +AAoNCQALDgoADA8LAA0QDAAOEQ0AAUEABAJCAQQDQwIEBEQDBAVFBAQGRgUEB0cGBLcTIgC4FCMA +uRUkALsWJQC8FyYAvRgnAMAZKADEGikABxsAAAgcAQALHQIADB4DABAfBAAiIQUAJCIGACYjBwAo +JAgAKiUJACwmCgAuJwsAMCgMADQpDQA4Kg4APCsPAEAsEABkLhEAaC8SAGwwEwBwMRQAdDIVAHgz +FgB8NBcAgDUYAIQ2GQCINxoAjDgbAJE6HACVOx0AmTweAJ09HwChPiAApT8hACRJBgIsSgoCNEsN +ATxMDwFkTREBbE4TAXRPFQF8UBcBhFEZAZVSHQGdUx8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQWCBYWFgwW +FhYWFhYWEAAAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEA +AAAPAD8AAgAAAA8APwABAAAAAAAAAAEAAAACAAAAAwAAAAAAAAAEAAAAAgAAAAUAAAAYCAGlAgIA +pQA8ODQwLCgkIBwYFBAMCAQADAgEADw4NDAsKCQgHBgUEAwIBAIAFQ8AAAAAGwAAAAEBAAECAQEB +AQEBAQEBAQECAgICAgICAgMDAwMDAwMDBAQEBAQEBAQBAgICAgICAwMDAwMDAwMDAwMDAwMEBAQE +BAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAQECAQICA3//Bw8fPwEDAQMPBwEHDx8/f///BQAHAgME +BgZ00UUX6KKLLg0PBQcJCwEDChQ3blVVVQFLaC8BVVVVBeM4jgOqqqoCcRzHAaqqqgrHcRwHKAAo +ADAALAAsACgAPAA0ACgAKAA0ADAALAAsAEQAPABAADwAjABsAFgASAD0ALAALAAsADwANAAwACwA +VABEAFQAVABsAGAAXABUAIwAeAA6AQIB1QDfANoAogB1AH8AagEaAdkA6AAKAboAeQCIAIoFKgM5 +AagBigXKAtkASAHKAUoB4gD5AMoB6gCCAJkAZuYAAJ3YiZ1O7MRONEiDNCd2YicapEEaEzuxExEY +gREP/MAPTuzETid2YicapEEaEzuxEw3SIA2JndgJCIzACAd+4Ac0SIM0GqRBGhEYgREN0iANCIzA +CAZpkAawstUFBVRABSd2YicTO7ETDdIgDYmd2AkGaZAGxE7sBARGYAQDP/ADqqqqqhqkQRoTO7ET +D/zADxEYgREN0iANCqiAChM7sRMP/MAPD/zADw3SIA0LtEALC7RAC4md2AkN0iANCqiACgqogAoI +jMAIB3iABwd4gAcGaZAGD/zADw3SIA0LtEALDdIgDQu0QAuJndgJCIzACImd2AkIjMAIB37gBwd+ +4AfBLCkHCqiACgiMwAgHeIAHCIzACAd4gAcGaZAGsLLVBQZpkAawstUFBVRABQVUQAXWHcYEDQAa +ACcANABOAGgAdQCCABoANABOAGgAnADQAOoABAEnAE4AdQCcAOoAOAFfAYYBNABoAJwA0AA4AaAB +1AEIAgwATgBoAIIAdQCcAMMAaACCAIIAnAC2ALYA0ACcAMMAwwDqABEBEQE4AYIAnAC2AJwAtgDQ +AOoA0ADqAAQBBAEeAcMA6gARAeoAEQE4AV8BOAFfAYYBhgGtAQAAMAAAADYAAAAMAAAAEgAAABgA +AAAkAAAABgAAAAkAAAAAAAAAAAAAABggFBQODhQUBQYBAgMEAAAAAQECAQICAwQMDAgEDAQEQAAA +AIAAAAAAAQAAAAIAAEAAAAAABAAAQAAAAEAAAAAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSor +LC0uL0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0 +dXZ3eHl6e3x9fn8tAA8gAPBhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApcaE+JnujfYN/73W +sd5UkVBgAwKpzn1WGediteZNmuxFj50fQImH+hXv67LJjgv77EFns/1f6kW/I/dTluRbm8J1HOGu +PWpMWmxBfgL1T4NcaPRRNNEI+ZPic6tTYj8qDAhSlWVGXp0oMKE3Dwq1LwkONiSbGz3fJs1pTs1/ +n+obEp4ddFguNC02stzutPtb9qRNdmG3zn17Uj7dcV6XE/WmaLkAACzBYEAf48h57ba+1EaN2WdL +ct6U1JjosEqFa7sqxeVPFu3FhteaVWaUEc+KEOkGBIH+8KBEeLol40vzov5dwICKBa0/vCFIcATx +32PBd3WvY0IwIBrlDv1tv0yBFBg1Ji/D4b6iNcyIOS5Xk/JVgvxHeqzI57orMpXmoMCYGdGef6Nm +RH5UqzuDC8qMKcfTazwoeafivB0Wdq0721ZkTnQeFNuSCgxsSOS4XZ9uve9DpsSoOaQxN9OL8jLV +Q4tZbrfajAFksdKc4Em02PqsB/Mlz6/KjvTpRxgQ1W+I8G9KclwkOPFXx3NRlyPLfKGc6CE+3Zbc +YYYNhQ+Q4EJ8xHGqzNiQBQYB9xIco8Jfavmu0GmRF1iZJzq5JzjZE+uzKzMiu9JwqYkHpzO2LSI8 +khUgyUmH/6p4UHqljwP4WYAJFxraZTHXxoS40MOCsCl3WhEey3v8qNZtOiwAAQIEBAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAFk4wAB0wLLAnMBtAACwsGUGsH2GsLBKAAkAAAACAAAAAAAAAAAAAAAJ +AAAAAgAAAAAAAAAAAAAACQAAAAMAAAABAAAACQAAAAkAAAACAAAAAgAAAAkAAAABAgECAwQAAAUG +BwgJCgAAAAUGAAIEAAUAAAAAAAUHAQMEAAUBAAAAQCNAJSEhISFAQEBAQAUEBAEBQEBAQAUFQEAM +DEANDAwBAQEFQEAFBQAEAARAQAAEQEBABUBAQEBABUBAQAUFBQEBAQFABQUFAQUBAUAFBQVABUAF +BQUFBQQAAAAcEQAAHDIAABwzAAAEAAAAHBUAAAIAFwBsAHAEdAh0DAAEBAYAAAAAAAAAAGQAAAAA +kAEACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAAAAAAAAA +AP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAABAAAAAAAAAAAQAAAAEAAAAAAAAA/wAAAP8AAAAAAAAA +AAAAAAC6AQAAAAAAAAQAAGQAAAAHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcHBwcHBwcHBwcHBwcGBgYGBgUFBQUFBAQEBAQDAwMDAwICAgICAQEBAQEAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmFsBAKBbAQCo +WwEAAFwBAAhcAQAQXAEAAAgAAEAIAACACAAAAAkAAEAJAACACQAA/ykAAAAAAACYCQAApAkAACQA +AABkAAAApAAAACQBAABkAQAApAEAACQAAABkAAAApAAAACQBAADkAAAApAEAAKimAQAolwEA6JgB +AEyaAQBYnAEA2J4BALiiAQCApAEAyKUBACywAQBAsAEArLABAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCRIUGAAADgAAACoAAAAH +AAAACwAAAP////8AAAAAAAAAAAEAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAABQUFBQUFBQUAAAAAgA0A +AAAgAACADQAAgA0AAAAgAACADQAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAggA8AAEAAaSAA +AGkgQABpIAAAaSBAACAggA8AAOgAaSAAAGkgQABpIAAAaSBAACAggA8AAJwFaSAAAGkgQABpIAAA +SiAAAEohAABKIgAASiMAAEokAABKJQAASiYAAEonAABKIAAQSiEAEEoiABBKIwAQSiQAEEolABBK +JgAQSicAEEogACBKIQAgSiIAIEojACBKJAAgSiUAIEomACBKJwAgSiAAMEohADAKJIA/gAAAwEEs +nDBALJwwQiQcNAoigD+AAFRZCiMANxIPAABKJgBwaSBAAEomAHBKJgBwSiYAcEomAHAAFgBwgABY +BEB4ICBAhwAAAAAAAAAAAAAKyM9xoADIHw4ZGIALyA8ZGIAMyBAZGIANEgI2AMhEeBEZGIAOyC0Z +GIDgfuHE/BzIvvwcSL7hwOHB4cLhw/wcCLH8HEix/ByIsfwcyLH8HAiy/BxIsvwciLL8HMiy/BwI +v2okgBDhxGokwBDhxPHAz3CgANAbFIDPcYAAVAQEIICPz1EE4QChCvIvKQEAz3CAAPAJ8CBAAEB4 +2v/RwMHEayTAEMHEaySAEMHEn3QEFAs0BBQKNAQUCTQEFAg0BBQHNAQUBjQEFAU0BBQENMHDwcLB +wcHAwcRFLH4QCiZAfsHEaySAFMHEICBAhwrIh7gKGhgwC8ibuAsaGDAMyAwaGDANyIe4DRoYMA7I +hSDDDw4aGDDgfuB48cAKyJW4ChoYMAvIm7gLGhgwDciKuI24kLgNGhgwz3CAABgLGIgbCFEADcjP +cQAAjAqsuA0aGDDGDSAAD9hn2HYO4ACKIYYI0cDgfvHAz3CAAFyhAICGIP6BCfQNyAUggA8AAADU +DRoYMKD/iiBVBUYO4ACKIcYM6PHgePHAz3EDAEANz3CgAKggLaDPcoAAlAQgggFpAKLSDSABSNjP +cIAAVAklgCOBIIHHcQAAiBOeDYAHyvHgeM9wgABUCTEFgAfgePHAJgpAAc92gABUBAXoDwhRAAHY +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 +AHkA2R7wJJCG6SWQgeHMIaKABPIA2QPwAdkC3RLwJJAF3YHhAdnAeQzwJJAE3YPhAdnAeQbwJJAK +3YThAdnAeRsJUAAIEAUBCiHAD+tyENiKI44NbQHv/ph1/QIAAOB4ocHxwHoKAADPcoAA/QhAioDi +RMCJ8o3pCiHAD+tyBdiKIw8CSiRAADkB7/64c2CBA+tBgYjqz3KAAFhbd4JgoViCQaEkxoDmyiHB +D8oiwQfKI4EPAADSA8ogYQHk84DiyiHBD8oiwQfKI4EPAADTA8ogYQHY8y8IXgIEIIAPAQAAwM9y +gAA0US64CmJJIoIAYbrPcIAATHlWeHGgIYEyoEPwOwgeAqDmyiWCE8olIRAEIIIPAQAAwM93gADk +UM5nBCCADwYAAAAxuC66HmbPcIAANFFIYMJ4EvBTIMIAXXrPdYAAIFRNZQQggA8BAADALrjPcoAA +NFEIYmG4Fn3PcIAA0Hi2eGCgIYEfDTQWIaAKIcAP63IF2IojTwyKJIMPQQDv/rh1CNy/AQAA4cXh +xs9xgAD9CCCJIukA2kokAHbPc4AA0HioIAADFiCBAMCBFiONAMClIYEB4iGlwBABAMAbQADEEAEA +xBtAAMgQAQDIG0AAzBAAAMwbAACvBo//8cACCSAAuHECuc9ygAAoXTR5MCJEAKLBDQxeA89ygAAk +pwXwz3KAADykQCIDBkAiAQdRJECCyiHCD8oiwgfKI4IPAAAbBJwHov7KIGIBz3aAAPBfQC2NAaZm +QMYgxQ0OHhLCvaphDvARDl4SRCUBHES5KmOJugbwUyXBEDx5KmLPcYAA8F4WIUEBIokOuUV5IKDd +ACAAosAdeM9xoABgHRKxFJHgfuB48cDhxQh1KHMJ8Klw+f8Aq0i4AasC5bB9AuNhuowi/4/19a0A +AADgePwciLb8HEi2/BwItvwcyLX8HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzIs/wciLP8 +HEiz4H7geATcON018OB4BNw03TPw4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTdK/DgeATc +IN0p8OB4BNwc3Sfw4HgE3BjdJfDgeATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c8OB4BNwE +3RnwNBQaMDAUGTAsFBgwKBQXMCQUFjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHGsCRNM7Ak +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 +BCKQDwAGAABMIACgAd3AfQQigg9AAAAA13JAAAAAAd/PdoAAuIQ4jsB/Ew1BEIXtOY4LD0EQANkC +8AHZYIYvegDZEQjBAGGGkHPMIiGAA/IB2S8mR/A6rj3yANrPcaAAtA9coc9zqwCg/1mjB9k6o1ij +iHGpch4P4ADpc3YKIACpcNT/hujKDQAAtg9P/QTw3g9P/RYLgAMBhs91gACABgS1AIYFtRiODK12 +CqAD6XAElc9ygAAYCyWVFLIIgoDh0CAhAM8gIgC5uLq4BSAABAiiLQeP9uB44cXhxs9xoADIHMiB +CKEG3RHw4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HhhvYwl/5/t9clwwcbgf8HF4Hjh +xQDaz3GsANQBrRmYgDfYqBkYgKDd6BlAgwXb7BnAgFrYgRkYAIIZWAODGdgAB9u+GdiACBnAgHfY +GBkAgL8Z2IAMGcCAf9gcGQCAvBmYgAAZgIAQGYCAvRmYgAQZgIAUGYCASNiqGRiAqxkYgKwZGIAB +2pMZmIAq2JgZGIB62JkZGIAQ2JoZGIB+GZgAfxmYAIAZmADgf8HF4HjPcAAAAT3PcaoA8EMFoc9y +AAA8PEahz3AAADw+B6GKIFQACKHPcAAACxIJoc9wAAAYHAqhz3AAAB8fC6HPcAAAHBgMoc9wAAAS +Cw2hiiBEAQ6hz3AAAD48D6FQoYogRA8RoeB+4cXPcaAAyBwIoQbdEfDgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeGG9jCX/n+31sfHxwEYNr/YH2ADfn/8acK//z3WkALg9rBUAFs92pQDY +y6K4rB0YEAHY7Kb2HRgQ3gkgAOlwiiDEAJ8dGBA52c9wpQAIDD6gyP8KcOD/GNiVHRgQz3GAANQ1 +4KFvIEMAAaECoc9xAQAcVM9wgAAcKtQYQAD42AumNQWP9uB48cDPcIAA0Hh6Cm/20NnPcIAA3Fpu +Cm/26NnRwOB+4HjPcoAA8GMnioPpJooL6c9xrACQAQDaBOhFoeB+AtgFoeB+4H7xwOHFCHUgkAKV +QZUQuAV6KdgSuBUgQQBAoSCV8CBBAB0KQAA2CG/2iiDRAwKVIZUQuAV5Jghv9oog0QPFBI/28cDh +xQh1IJAClUGVELgFehXYE7gVIEEAQKEglfAgQQAdCkAA9g8v9oog0QMClSGVELgFeeYPL/aKINED +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 +wgfKIGIByiOCDwAARABEBmLyyiQiAADaB/AAFgBBFCGMAAC0AeIvIEIB8woCgP4PT/PRwOB+4Hjg +fuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjPcIAA8AjgfwCA4HjgfuB44H7geOB+ +4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4 +4H7geOB/AdjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4Hjg +fuB44H7geOB+4HjgfuB48cDhxc91gADISKlwLg9v8wPZABWFEEQlQAGF4MohwQ/KIsEHyiBhAcoj +gQ8AAE8A9ARh8sokYQABjQsIEgFjuAGtvg5P83UGj/PgePHA8g2P8xpxz3aAAMhIII6JCR4Az3GA +APgIIImA4cwgIaA88g8IUQDPcIAAuIShgALwAN0HDdUTgu0A3c9xgAC4hBiJguiE7QDfBPCigQTf +iiATAXIJb/OpcYogUwFqCW/z6XHPcIAAGAsYiIPgzCAigcwg4oHMICKCCPKKIBMBRglv84vZCvAK +lhUNARALlhB3zCAhoAT0ANgh8AHYz3GgAMgfDaHPcIAA+AgBiOu2qrYEvxC45X0FfYogEwEKCW/z +otmKIBMB/ghv86lxz3CgAMgffxhYgwHYfQWP8+B48cAWDa/zCHHG/z3oIN3PdqAAyB+wpjLYQx4Y +EADYXg1v8424saawph7YQx4YEADYSg1v8424saZ/Fg+WiiATAUEvDRTEvaIIb/PM2YogEwGWCG/z +6XGKIBMBjghv86lxz3GAAPgIAYkB2hB1wiKKABMNchBAqQDYDaYLClEABNgBqf0Ej/PgeM9wgADI +SACIEQieAM9xoADAHQCBgLgAoeB+4HjPcIAAyEgAiBEIngDPcaAAwB0AgaC4AKHgfuB48cDhxc9w +gABMCQCQz3WAANSpqXHaDaAAiiIECwCNhODKIcsPyiLLB8ogawHKI4sPAAB5CcokKwAAA2vyyiXL +AM9wgABOCQCQz3GAACysVOAQeJ4NoAAO2nUEj/PxwOHFz3WAAPCrHZ3+C+/5iiH/DjydAnnPcIAA +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 +DxsZIkgEoIE48MSAAAAbJAIAGyU4HMARAAAAIQAAAIUABYCBAADAFg8bBCIQBBtmDwEbaBQcwBAK +ABtABAAbbgMAAGEPHB0iAQAdJvkPAGFkDAAQAMAGEQEABCf8AARkAAAbJAIAGyU4HMARAAAAIQAA +GyVAABskMBzAEQAAACEPHB0iGAEdJhgAxxAIe4CBAADAFyAAxxAQe4CBAADAFwAAACFUMICB+EHE +EA8bCSIACwk5AgAKYgMBCmIEAgpiAAAJQAQAAGEJAAlAAgAAYQoACUAAAABhAgAJQQAJGigAAMAW +AQAbJgAAwBcEAB0mAQAIJ+sACGQAAAAhAAAAACwBAAABAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFDQAAPQ0 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADAAJAA0AAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAHiCgADQSQEAAAAAAAAAAAAAAAAAAAAAAAAAAACcgoAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B +AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAACBAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAACAAAA/wCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAgADAAQAAAAZABgAFAAVAEACBAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAgADAAQAAAAZABgAFAAVAAAAAAAHAAAAAgADAAQAAAAZABgAFAAVAEAC +BAC/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANR6gAAIpQEA +AAAAAAAAAAAAAAAAAAAAANR6gAAYrAEAAAAAAAAAAADUeoAAjK0BAAAAAAAAAAAAAAAAANR6gAAA +AAAAAAAAAAAAAAD/AAAAAAcAAAAAAAAAAAAAAAAAAH9/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAABAgQIAAgQIAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAADYBwAAFQAAAOQtgABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAA +ZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAZAoAAGQKAABk +CgAAZAoAAGQKAABkCgAAZAoAAGQKAABkCgAAqAsAAAAAAACQDwEAZAoAALAIAABkCgAAZAoAAGQK +AADgCAAACPcAAKhSAABkCgAAZAoAABQJAAAUCQAAFAkAABQJAAAUCQAAFAkAABQJAABkCgAAZAoA +AGQKAABkCgAAMAoAAGQKAABkCgAAZAoAAGQKAABkCgAArAsAAGQKAABkCgAAlAgAAAMAAAC4swEA +AgAAACgcAQAEAAAAfDAAAAYAAABktQEAEQAAADyeAQAHAAAAfKcBAAgAAADktQEADAAAACA0AQAN +AAAAoDgBAA4AAADYOAEAFgAAAPgOAQALAAAAaE0BABQAAADAUwAADwAAAOBjAQAQAAAAvAYBAAEA +AABoowEAEgAAALBbAQATAAAApFMBAAUAAABsVgAAFQAAABDFAQAXAAAAqAsAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAALCUAACwlAAAsJQAAgDYAACwlAAAsJQAAdDYAACwlAAAsJQAALCUAACwlAAAs +JQAALCUAACwlAAAsJQAALCUAABwaAAC0GwAAuBsAACwdAACsHQAAMB0AACwlAAAsJQAADD8AAHRC +AABEQwAALCUAACwlAAAsJQAA2D0AAKydAAConQAAsJ0AACwlAAAsJQAALCUAAIQ2AAAsJQAALCUA +ACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAA +LCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAs +JQAALCUAACwlAAAsJQAAcDcAACwlAAAsJQAALCUAACwlAAAsJQAAUDgAACwlAAAsJQAALCUAACwl +AAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAAeOMAACwlAACY5AAALCUAACwlAAAsJQAALCUA +ACwlAAAsJQAALCUAACwlAAAAVgAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAA +LCUAACwlAAAoTAEAuE8BACwlAADMNAEALCUAAHg2AQBgJgEALCUAACwlAAC8QwAALCUAACwlAAAs +JQAALCUAACwlAADgngEAVJ4BACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAD8tAEAALUBACwl +AAAsJQAALCUAACwlAAAsJQAALCUAAEinAQAsJQAAcKoBACwlAAA4xgEALCUAAIQgAACIIAAALCUA +ACwlAAC8tgEAxFMAACwlAAAsJQAALCUAAOChAQAsJQAALCUAALAHAQCQUwEALCUAACwlAAAsJQAA +cFoBAKwhAQAsJQAALCUAACwlAAAsJQAALCUAACwlAADwYAEALCUAAMi1AQDMtQEA2LUBANy1AQDQ +tQEA1LUBAOC1AQAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAACURQAALCUAACwl +AAAsJQAALCUAACwlAAA4tQEAbLUBAHg6AAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUA +ACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAA +LCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAsJQAALCUAACwlAAAs +JQAAHDsAAJw7AAAgPAAAvDwAACwlAACUPAAALCUAACwlAAAsJQAALCUAACwlAAAUOwAAGDsAACwl +AAAsJQAA7EMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAB +AAAAAQEAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEB +AQEBDQ0NDQ0NDQ0NDQ0NDQ0NDQMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAQEBAQEB +AQEBAQEBAQEBAQ0NDQ0NDQ0NDQ0NDQ0NDQ0DAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAA +AAEBAQEBAQEBAQEBAQEBAQENDQ0NDQ0NDQ0NDQ0NDQ0NAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAA +AAAAAAAAAACRAgAAMcovAJECAAAxyi8AkQIAADHKLwCRAgAAMcovAJECAAAxyi8AkQIAADHKLwCR +AgAAMcovAJECAAAxyi8AQwEAADHKLwBDAQAAMcovAEMBAAAxyi8AQwEAADHKLwBDAQAAMcovAEMB +AAAxyi8AQwEAADHKLwBDAQAAMcovAEANAADeAwkAAAAAAAAAAAAAAAAAcOMAAAEAAACkLYAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAAAAAACAAAAAAAAABAQg8A +JOcAAAjoAAAY6QAA4OoAABjpAADg6gAAiOwAAAztAACAgICAgICAgAGAAoCAgICAAAAAALzwAAC8 +8AAAAAAAAAAAAAAAAAAAAAAAALzwAAC88AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQt +gACkLYAApCCgADggoAABAAAA/P///wAAAAAAAAAAxC2AAMQtgACoIKAAPCCgAAgAAADz////AAAA +AAAAAADkLYAA5C2AAKwgoABsIKAAMAAAAM////8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA +AAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAxAcBAAUAAADkLYAA2AwBAAD/AwD4DAEAAP8FANwNAQAA +/y0AAA4BAAD/PQC4DQEAAP8EAJwNAQAA/yUAmBQBAIAVAQDwFQEALBEBAGwQAQDYFgEAXBcBAKAX +AQDwFwEAAAAAACwBAABeAQAAAQAAAAEAAAABAAAAAQAAAAMAAAAAAAAAAAAAAAAAAAADAAAAAgAA +AAMAAAADAAAAAwAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAIgdAQAKAAAApC2AAAAAAAAAAAAA +AAAAABQeAQAKAAAApC2AAAAAAAAAAAAAAAAAAEgeAQAKAAAApC2AAAAAAAAAAAAAAAAAAMAeAQAK +AAAApC2AAAAAAAAAAAAAAAAAANwfAQAKAAAApC2AAAAAAAAAAAAAAAAAAFQfAQAKAAAApC2AAAAA +AAAAAAAAAAAAAKglAQAGAAAApC2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAgAAA +AACgABAnAADoAwAA6AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsOwEA +sDwBAFg/AQAAQgEAdEQBANhHAQBAPgEAFAWAAJx6gAAYAAAAXHqAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAYEoBAAYAAACkLYAAAAAAAAAAAAAAAAAABPkAAAoAAACkLYAAAAAAAAAAAAAAAAAABPkAAAoA +AACkLYAAAAAAAAAAAAAAAAAABPkAAAoAAACkLYAAAAAAAAAAAAAAAAAABPkAAAoAAACkLYAAAAAA +AAAAAAAAAAAABPkAAAoAAACkLYAAAAAAAAAAAAAAAAAABPkAAAoAAACkLYAAAAAAAAAAAAAAAAAA +BPkAAAoAAACkLYAAAAAAAAAAAAAAAAAABPkAAAoAAACkLYAAAAAAAAAAAAAAAAAABPkAAAoAAACk +LYAAAAAAAAAAAAAAAAAABPkAAAoAAACkLYAAAAAAAAAAAAAAAAAABPkAAAoAAACkLYAAAAAAAAAA +AAAAAAAABPkAAAoAAACkLYAAAAAAAAAAAAAAAAAArFEBAAoAAACkLYAAAAAAAP//////////AAAA +AAAAAAAAAAAAJFMBAAUAAADkLYAAZABkAGkA3ADIAFoAqgC+AIYBfQA+AGQAZABpANwAyABaAKoA +vgCGAX0APgAAAAAAAQEAAAAAAAAAAQIBAQACAQABAgICAAEBAAIBAgECAAIAAQIDAAAAAHxsAQAs +agEACIWAADACAAAAAAAAYGABAHxhAQDcmIAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBg +AQBoagEALJmAABQAAAAAAAAAYGABAJRqAQCQmoAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA +AGBgAQBkZQEAPDeAAFABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAABgYAEAVGsBALQGgAAEAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGABAMRrAQAAAAAAAAAAAAAAAABgYAEAWGsBAMAGgAAE +AAAA/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B +/wH+Af0B/AH7Ab8BvgG9AbwBuwG6AbkBuAG3AX8BfgF9AXwBewF6AXkBeAF3AXYBdQF/AH4AfQB8 +AHsAPwA+AD0APAA7ADoAOQA5ADkAOQA5ADkAOQA5ADkAOQA5ADkAOQA5ADkAOQA5ADkAOQAKAD8A +/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af8B/wH/Af4B/QH8AfsB+gH5AfgB9wH2Af8A/gD9 +APwA+wD6APkA+AD3APYAvwC+AL0AvAC7AH8AfgB9AHwAewA/AD4APQA8ADsAOgA5ADgANwA2ADUA +NAAzADIAMQAwACcAJgAmACYAJgAmACYAJgAmACYAJgAmACYAJgAmACYAJgAmACYAJgAKAD8AAQEA +AAIBAQADAgID9FgBABLSAAAAAAAA//8PACxsAQABQAAAAAAAAAYAAAAsbAEAAkAAAAAAAAAJAAAA +lG4BABsAAAAAAAAA/wcAAJRuAQAbAAAAAAAAAP8HAAAsbAEAAkAAAAAAAAAIAAAAlG4BABsAAAAA +AAAA/wcAAJRuAQAbAAAAAAAAAP8HAAAsbAEAAkAAAAAAAAAJAAAAlG4BABsAAAAAAAAA/wcAAJRu +AQAbAAAAAAAAAP8HAAAsbAEAAUAAAAAAAAAGAAAALGwBAAJAAAAAAAAAAAAAAJRuAQAPAAAAAAAA +AP8HAACUbgEAEAAAAAAAAAD/BwAALGwBAAJAAAAAAAAAAQAAAJRuAQAPAAAAAAAAAP8HAACUbgEA +EAAAAAAAAAD/BwAALGwBAAJAAAAAAAAAAgAAAJRuAQAPAAAAAAAAAP8HAACUbgEAEAAAAAAAAAD/ +BwAALGwBAAJAAAAAAAAAAwAAAJRuAQAPAAAAAAAAAP8HAACUbgEAEAAAAAAAAAD/BwAALGwBAAJA +AAAAAAAABAAAAJRuAQAPAAAAAAAAAP8HAACUbgEAEAAAAAAAAAD/BwAALGwBAAJAAAAAAAAABQAA +AJRuAQAPAAAAAAAAAP8HAACUbgEAEAAAAAAAAAD/BwAALGwBAAFAAAAAAAAABwAAAPRYAQAT0gAA +AAAAAP//DwAsbAEAAUAAAAAAAAAGAAAALGwBAAJAAAAAAAAACQAAAJRuAQAcAAAAAAAAAP8HAACU +bgEAHAAAAAAAAAD/BwAALGwBAAJAAAAAAAAACAAAAJRuAQAcAAAAAAAAAP8HAACUbgEAHAAAAAAA +AAD/BwAALGwBAAJAAAAAAAAACQAAAJRuAQAcAAAAAAAAAP8HAACUbgEAHAAAAAAAAAD/BwAALGwB +AAFAAAAAAAAABgAAACxsAQACQAAAAAAAAAAAAACUbgEAEQAAAAAAAAD/BwAAlG4BABIAAAAAAAAA +/wcAACxsAQACQAAAAAAAAAEAAACUbgEAEQAAAAAAAAD/BwAAlG4BABIAAAAAAAAA/wcAACxsAQAC +QAAAAAAAAAIAAACUbgEAEQAAAAAAAAD/BwAAlG4BABIAAAAAAAAA/wcAACxsAQACQAAAAAAAAAMA +AACUbgEAEQAAAAAAAAD/BwAAlG4BABIAAAAAAAAA/wcAACxsAQACQAAAAAAAAAQAAACUbgEAEQAA +AAAAAAD/BwAAlG4BABIAAAAAAAAA/wcAACxsAQACQAAAAAAAAAUAAACUbgEAEQAAAAAAAAD/BwAA +lG4BABIAAAAAAAAA/wcAACxsAQABQAAAAAAAAAcAAABIbAEABtIAAAAAAAD/AQAASGwBAAfSAAAA +AAAA/wMAAHRYAQAV0gAAAAAAAP8DAAB0WAEADNIAAAAAAAD/AQAAdFgBABXSAAAKAAAAAPwPAHRY +AQAM0gAACQAAAAD+AwASAAAAAAC8AAEAAACMAQEA4AdYBhADAAB/BAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAEAAAAAAAAAAAAAAADAAAAAQAAAIACKwDNBJkDBAACAAAAgAKrAM0EGQEEAAMAAACAAqsA +zQSZAgQABAAAAIACKwHNBBkABAAFAAAAgAIrAc0EmQEEAAYAAACAAisBzQQZAwQABwAAAIACqwHN +BJkABAAIAAAAgAKrAc0EGQIEAAkAAAAAAqsBzQSZAwQACgAAAAACSwDNBBkBBAALAAAAAAJLAM0E +mQIEAAwAAAAAAssAzQQZAAQADQAAAAACywDNBJkBBAAOAAAAAALLAM0EGQMEACIAAgCBAYwAAQCA +AwAAJAACAIEBDAEBAAABAAAmAAIAgQEMAQEAgAIAACgAAgCBAYwBAQAAAAAAKgACAAEBjAEBAIAB +AAAsAAIAAQGMAQEAAAMAAC4AAgABASwAAQCAAAAAMAACAAEBLAABAAACAAA0AAIAAQGsAAEAAAEA +ADYAAgABAawAAQCAAgAAOAACAAEBLAEBAAAAAAA8AAIAAQEsAQEAAAMAAD4AAgABAawBAQCAAAAA +QAACAAEBrAEBAAACAABkAAIAgQBsAQEAAAEBAGYAAgCBAGwBAQCAAgEAaAACAIEA7AEBAAAAAQBs +AAIAgQDsAQEAAAMBAG4AAgCBAA0AAQCAAAEAcAACAIEADQABAAACAQB0AAIAgQCNAAEAAAEBAHYA +AgCBAI0AAQCAAgEAeAACAAEADQEBAAAAAQB8AAIAAQANAQEAAAMBAH4AAgABAI0BAQCAAAIAgAAC +AAEAjQEBAAACAgCEAAIAAQAtAAEAAAECAIYAAgABAC0AAQCAAgIAiAACAAEArQABAAAAAgCMAAIA +AQCtAAEAAAMCAJEAAgABAC0BAQDAAgIAlQACAAEArQEBAMABAwCXAAIAAQCtAQEAQAMDAJkAAgAB +AE0AAQDAAAMAnQACAAEATQABAMADAwCfAAIAAQDNAAEAQAEDAKEAAgABAM0AAQDAAgMApQACAAEA +TQEBAMABAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA3SEtIT0gLSEdIEQwFAFUECQALSHNIAAAwADQAO +ABQADQAOAA8AEQAQABIAGwAcAA8AAAARAAAAEAAAABIAAAAbAAAAHAAAABsAAAAcAAAAEtIAABPS +AAAwAAAAcAAAAIQAAACZAAAABwAAAAAAAAABAAAAAgAAAAIAAAAAAAAAAQAAAAAAAAABAAAAPwAA +ACQAAAAfAAAAGQAAABcAAAAUAAAAEQAAABgAAAAbAAAAJwAAACAAAAA2AAAAMAAAAH8AAABkAAAA +XwAAAFkAAABXAAAAVAAAAFEAAABYAAAAWwAAAGcAAABgAAAAdgAAAHAAAAC/AAAApAAAAJ8AAACZ +AAAAlwAAAJQAAACRAAAAmAAAAJsAAACnAAAAoAAAALYAAACwAAAAPwEAACQBAAAfAQAAGQEAABcB +AAAUAQAAEQEAABgBAAAbAQAAJwEAACABAAA2AQAAMAEAAP8AAADkAAAA3wAAANkAAADXAAAA1AAA +ANEAAADYAAAA2wAAAOcAAADgAAAA9gAAAPAAAAC/AQAApAEAAJ8BAACZAQAAlwEAAJQBAACRAQAA +mAEAAJsBAACnAQAAoAEAALYBAACwAQAAPwAAACQAAAAfAAAAGQAAABcAAAAUAAAAEQAAABgAAAAb +AAAAJwAAACAAAAA2AAAAMAAAAH8AAABkAAAAXwAAAFkAAABXAAAAVAAAAFEAAABYAAAAWwAAAGcA +AABgAAAAdgAAAHAAAAC/AAAApAAAAJ8AAACZAAAAlwAAAJQAAACRAAAAmAAAAJsAAACnAAAAoAAA +ALYAAACwAAAAPwEAACQBAAAfAQAAGQEAABcBAAAUAQAAEQEAABgBAAAbAQAAJwEAACABAAA2AQAA +MAEAAH8BAABkAQAAXwEAAFkBAABXAQAAVAEAAFEBAABYAQAAGwAAAGcBAABgAQAAdgEAAHABAAC/ +AQAApAEAAJ8BAACZAQAAlwEAAJQBAACRAQAAmAEAAJsBAACnAQAAoAEAALYBAACwAQAAIgAAAEAA +AABkAAAAjAAAAAcAAAAHAAAA/wAAAP8AAAAN0hHSENIC0gHSA9IL0hvSCNIAgAXSEtIT0hTSBEMc +0gEAAAAAAAAAAAAAAAAAAAADAAAABAAAADAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAA +/wMAAAIAAADoAwAAewMAABoDAADDAgAAdwIAADICAAD1AQAAvgEAABzSDdIR0hDSAtIB0gPSG9IL +0gCABdIS0hPSFNIEQwbSB9IAACIAAABAAAAAZAAAAIwAAAAHAAAAIgAAAEAAAABkAAAAjAAAAAcA +AAAHAAAA/wAAAP8AAAAN0hHSENIC0gHSA9IL0hvSCNIAgAXSEtIT0hTSBEMc0gEAAAAAAAAAAAAA +AAAAAAADAAAABAAAADAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAA/wMAAAIAAAAAAAAA +AAAAAAAAAADYpAEABgAAAKQtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAABQFgACceoAAGAAAAFx6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAWAAJx6gAAYAAAAXHqA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAOLEBAAQAAACkLYAAAAAAAAAAAAAAAAAAFLABAAQAAACkLYAA +AAAAAAAAAAAAAAAAALIBAAYAAACkLYAAAAAAAAAAAAAAAAAAFLABAAQAAACkLYAAAAAAAAAAAAAA +AAAAOLEBAAQAAACkLYAAAAAAAAAAAAAAAAAAFLABAAQAAACkLYAAAAAAAAAAAAAAAAAAOLEBAAQA +AACkLYAAAAAAAAAAAAAAAAAAFLABAAQAAACkLYAAAAAAAAAAAAAAAAAAALIBAAYAAACkLYAAAAAA +AAAAAAAAAAAAFLABAAQAAACkLYAAAAAAAAAAAAAAAAAAOLEBAAQAAACkLYAAAAAAAAAAAAAAAAAA +ALIBAAYAAACkLYAAAAAAAAAAAAAAAAAAOLEBAAQAAACkLYAAAAAAAAAAAAAAAAAAOLEBAAQAAACk +LYAAAAAAAAAAAAAAAAAAALIBAAYAAACkLYAAFAWAAJx6gAAYAAAAXHqAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBQAAAAAA +AAAAAAAAAAAAAAAA/wD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIDBAQEBAQFBgcICAgICAkKCwwNAAAABQYHCA0ODxAVFhcY +GQAACg0RFAoNERQKDREUCgoAAAAAAAAGBgYGCQkJCQAGAAD4AOoA3QDQAMQAuQCvAKUAnACTAIoA +gwB7AHQAbgBoAG4BaAFuAmgCbgNoA24EaARuBWgFbgZoBm4HaAduCGgIbgloCW4KaApuC2gLbgxo +DG4NaA1uDmgObg9oD24QaBBuEWgRbhJoEm4TaBNuFGgUbhVoFW4WaBZuF2gXbhhoGG4ZaBluGmga +bhtoG24caBxuHWgdbh5oHm4faB9uIGggbgBoAG4BaAFuAmgCbgNoA24EaARuBWgFbgZoBm4HaAdu +CGgIbgloCW4KaApuC2gLbgxoDG4NaA1uDmgObg9oD24QaBBuEWgRbhJoEm4TaBNuFGgUbhVoFW4W +aBZuF2gXbhhoGG4ZaBluGmgabhtoG24caBxuHWgdbh5oHm4faB9uIGggbiFoIW4iaCJuI2gjbiRo +JG4laCVuJmgmbidoJwAAAAAAAAAAAAAAAJTKAQAIAAAA5C2AAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////8AAf//AgP///8E//////////////////// +//8F/wb/B/8I/wn/Cv8L/wz///8N////Dv///w////8Q//////////////////////////////// +//////////////8R////Ev///xP///8U////Ff///xb///8X////GP///xn///8a////G/////8c +////Hf///x7///8f////IP///yH//////////////////////yIjJP8lJif//yj///8p//////// +//////////////////////////////////////////////////////////////////////8BBAAA +AgUBAAMGAgAEBwMABQgEAAYJBQAHCgYACAsHAAkMCAAKDQkACw4KAAwPCwANEAwADhENAAFBAAQC +QgEEA0MCBAREAwQFRQQEBkYFBAdHBgS3EyIAuBQjALkVJAC7FiUAvBcmAL0YJwDAGSgAxBopAAcb +AAAIHAEACx0CAAweAwAQHwQAIiEFACQiBgAmIwcAKCQIAColCQAsJgoALicLADAoDAA0KQ0AOCoO +ADwrDwBALBAAZC4RAGgvEgBsMBMAcDEUAHQyFQB4MxYAfDQXAIA1GACENhkAiDcaAIw4GwCROhwA +lTsdAJk8HgCdPR8AoT4gAKU/IQAkSQYCLEoKAjRLDQE8TA8BZE0RAWxOEwF0TxUBfFAXAYRRGQGV +Uh0BnVMfAQAEFggWFhYMFhYWFhYWFhAAAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEA +AAAPAD8AAQAAAA8APwABAAAADwA/AAIAAAAPAD8AAQAAAAAAAAABAAAAAgAAAAMAAAAAAAAABAAA +AAIAAAAFAAAAGAgBpQICAKUAPDg0MCwoJCAcGBQQDAgEAAwIBAA8ODQwLCgkIBwYFBAMCAQCABQO +AAAAABoAAAABAQABAgEBAQEBAQEBAQEBAgICAgICAgIDAwMDAwMDAwQEBAQEBAQEAQICAgICAgMD +AwMDAwMDAwMDAwMDBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAEBAgECAgN//wcPHz8BAwED +DwcBBw8fP3///wUABwIDBAYGdNFFF+iiiy4NDwUHCQsBAwoUN25VVVUBS2gvAVVVVQXjOI4Dqqqq +AnEcxwGqqqoKx3EcBygAKAAwACwALAAoADwANAAoACgANAAwACwALABEADwAQAA8AIwAbABYAEgA +9ACwACwALAA8ADQAMAAsAFQARABUAFQAbABgAFwAVACMAHgAOgECAdUA3wDaAKIAdQB/AGoBGgHZ +AOgACgG6AHkAiACKBSoDOQGoAYoFygLZAEgBygFKAeIA+QDKAeoAggCZAGbmAACd2ImdTuzETjRI +gzQndmInGqRBGhM7sRMRGIERD/zAD07sxE4ndmInGqRBGhM7sRMN0iANiZ3YCQiMwAgHfuAHNEiD +NBqkQRoRGIERDdIgDQiMwAgGaZAGsLLVBQVUQAUndmInEzuxEw3SIA2JndgJBmmQBsRO7AQERmAE +Az/wA6qqqqoapEEaEzuxEw/8wA8RGIERDdIgDQqogAoTO7ETD/zADw/8wA8N0iANC7RACwu0QAuJ +ndgJDdIgDQqogAoKqIAKCIzACAd4gAcHeIAHBmmQBg/8wA8N0iANC7RACw3SIA0LtEALiZ3YCQiM +wAiJndgJCIzACAd+4AcHfuAHwSwpBwqogAoIjMAIB3iABwiMwAgHeIAHBmmQBrCy1QUGaZAGsLLV +BQVUQAUFVEAF1h3GBA0AGgAnADQATgBoAHUAggAaADQATgBoAJwA0ADqAAQBJwBOAHUAnADqADgB +XwGGATQAaACcANAAOAGgAdQBCAIMAE4AaACCAHUAnADDAGgAggCCAJwAtgC2ANAAnADDAMMA6gAR +AREBOAGCAJwAtgCcALYA0ADqANAA6gAEAQQBHgHDAOoAEQHqABEBOAFfATgBXwGGAYYBrQEAADAA +AAA2AAAADAAAABIAAAAYAAAAJAAAAAYAAAAJAAAAAAAAAAAAAAAYIBQUDg4UFAUGAQIDBAAAAAEB +AgECAgMEDAwIBAwEBEAAAACAAAAAAAEAAAACAABAAAAAAAQAAEAAAABAAAAAEBESExQVFhcYGRob +HB0eHyAhIiMkJSYnKCkqKywtLi9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNk +ZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/LQAPIADwYQAAAAAAAAAAAAABAgQEAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAWDe+AHO+sL6avmwAAK6uZAaufIWurkkACQAAAAIAAAAAAAAAAAAAAAkA +AAACAAAAAAAAAAAAAAAJAAAAAwAAAAEAAAAJAAAACQAAAAIAAAACAAAACQAAAAECAQIDBAAABQYH +CAkKAAAABQYAAgQABQAAAAAABQcBAwQABQEAAABAI0AlISEhIUBAQEBABQQEAQFAQEBABQVAQAwM +QA0MDAEBAQVAQAUFAAQABEBAAARAQEAFQEBAQEAFQEBABQUFAQEBAUAFBQUBBQEBQAUFBUAFQAUF +BQUFbABwBHQIdAwABAQGAAAAAAAAAABkAAAAAJABAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAQAAAAUAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAQAAAA +AAAAAAEAAAABAAAAAAAAAP8AAAD/AAAAAAAAAAAAAAA0sgEAAAAAAAAEAABkAAAABwcHBwcHBwcH +BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBgYGBgYFBQUF +BQQEBAQEAwMDAwMCAgICAgEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAKROAQCsTgEAtE4BAAhPAQAQTwEAGE8BAAAIAABACAAAgAgAAAAJ +AABACQAAgAkAAP8pAAAAAAAAmAkAAKQJAAAkAAAAZAAAAKQAAAAkAQAAZAEAAKQBAAAkAAAAZAAA +AKQAAAAkAQAA5AAAAKQBAAAAAAAAAQAAAAIAAAADAAAABAAAAAAAAAABAAAAAgAAAAMAAAAAAAAA +AQAAAAIAAAADAAAABAAAAAUAAAAMAAAACgAAAISoAQCYqAEAAKkBAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAAFCRETFwAADgAAACoA +AAAHAAAACwAAAP////8AAAAAAAAAAAEAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAABQUFBQUFBQUAAAAA +gA0AAAAgAACADQAAgA0AAAAgAACADQAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAA= +==== diff --git a/sys/contrib/dev/iwn/iwlwifi-6000-9.176.4.1.fw.uu b/sys/contrib/dev/iwn/iwlwifi-6000-9.176.4.1.fw.uu new file mode 100644 index 000000000000..636a7ba4b266 --- /dev/null +++ b/sys/contrib/dev/iwn/iwlwifi-6000-9.176.4.1.fw.uu @@ -0,0 +1,8112 @@ +Copyright (c) 2006-2009, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. 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 MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER 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. +begin-base64 644 iwlwifi-6000-9.176.4.1.fw.uu +AQSwCds9AAAUQwIAAEABAKhBAgAAQAEAAAAAACAggA8AAEAAaSAAAGkgQABpIAAAaSBAACAggA8A +AOgAaSAAAGkgQABpIAAAaSBAACAggA8AAHgGaSAAAGkgQABpIAAASiAAAEohAABKIgAASiMAAEok +AABKJQAASiYAAEonAABKIAAQSiEAEEoiABBKIwAQSiQAEEolABBKJgAQSicAEEogACBKIQAgSiIA +IEojACBKJAAgSiUAIEomACBKJwAgSiAAMEohADAKJIA/gQAAQEEsnDBALJwwQiQcNAoigD+AADBr +CiMAN/4PAABKJgBwaSBAAEomAHBKJgBwSiYAcEomAHAAFgBwgABkBEB4ICBAhwAAAAAAAAAAAADh +wOHB4cLPcKAAyB8WEAGGz3KAAJh/IKISEAGGIaITEAGGIqIUEAGGI6IVEAGGJKIkEAGGJqLPcZ8A +uP9WoYoh/w8SGFiAExhYgBQYWIAVGFiAJBhYgMHCwcHBwCAgQIcMyM9yoADIHw4aGIANyA8aGIAO +yBAaGIAPEgE2AcgkeBEaGIAQyC0aGIDgfuHE/BzIvvwcSL7hwOHB4cLhw/wcCLH8HEix/ByIsfwc +yLH8HAiy/BxIsvwciLL8HMiy/BwIv2okgBDhxGokwBDhxPHAz3CgANAbFIDPcYAAYAQEIICPz1EE +4QChCvIvKQEAz3CAAOQN8CBAAEB42v/RwMHEayTAEMHEaySAEMHEn3QEFAs0BBQKNAQUCTQEFAg0 +BBQHNAQUBjQEFAU0BBQENMHDwcLBwcHAwcRFLH4QCiZAfsHEaySAFMHEICBAhwzIh7gMGhgwDcib +uA0aGDAOyA4aGDAPyIe4DxoYMBDIEBoYMOB+4HjxwAzIlbgMGhgwDcibuA0aGDAPyIq4jbiQuA8a +GDDPcIAAHA8YiIHgC/QPyM9xAAC0DKy4DxoYMFYOIAAP2GfYNgsgAYohBgrRwOB+8cDPcIAAsK8A +gIYg/oEJ9A/IBSCADwAAANQPGhgwof+KIFUFBgsgAYohRg7o8eB4z3EDAEANz3CgAKggLaDPcYAA +jARAgQFqAKHPcKAAOC4FgAQggA/AAAAA13DAAAAACvJI2M9xnwC4/xqhW6Fp2Bi4GaHPcIAAeAgl +gCOBIIHHcQAAiBMNA8AJ4HjPcIAAeAidAsAJ4HjxwB4MAAGA4M93gABgBIh1BfKB4AX0AdgC8ADY +C6+A4QXygeEF9AHYAvAA2AqvgOIF8oHiBfQB2ALwANgMrwDYz3agAMgfGB4YkAuPgOCKIRAAD/II +j4DgC/LPcAMAQA1FHhgQMKYC2BgeGJAC8DGmCo+A4BnyCY+A4Bfyz3ACABRDIB4YkM9wgAAoACEe +GJDPcIAAXAQiHhiQGBYAlkUgAAMYHhiQDI+A4AjyGBYAloUgAQQYHhiQgeMH9BgWAJaIuBgeGJDP +cIAAMHQAkI7gzCCiggb0GBYAloC4GB4YkIDlGfIA2JS4z3WAAIAEAKVx2Aa4Zg0gAfzZIIXPcAAA +TBxaDSABn7kYFgCWhbgYHhiQdQMAAeB4z3Gqqru7z3CfALj/NqA2oDagNqDPcaAAyDsOgYi4DqFp +IEAA/vHgePHApcFBwELBDBwAMRAcQDHPcYAAfGw0GcAPMBkADywZwA4oGYAOJBlADs9wgAB8bCAY +QAvPcIAAfGwcGAALz3CAAHxsGBjACs9wgAB8bBQYgArPcIAAfGwQGMAIz3CAAHxsDBiACM9wgAB8 +bAgYQAjPcYAAAGyAGQAIfBnAB3gZgAd0GUAHcBkAB2wZAAdoGYAGZBlABmAZAAZcGcAFWBmABVQZ +QAVQGQAFTBnABEgZgAREGUAEQBkABO+hzqGtoYyhLBnAAigZgAIkGUACIBkAAhwZwAEYGYABFBlA +ARAZAAFjoWogAAPYGQAAaiDAAtQZAABqIIAC0BkAAGogQAHIGQAAaiAAAcQZAABqIMAAwBkAAGog +gAC8GQAAaiBAALgZAABqIAAAtBkAAGoggAHMGQAA0NifuM9xnwC4/x2hz3CAAAAAxIBTJcQ1UybF +Nde6AebTvsSgUyPABAUmjh/Q/gAA1qEFIIAPsP4AABahGIFTJ841AN2UuBihQMMBwALByXMMFAYw +GgggARAUBzDPcKAAtA+8oM9xoADIOy6Bsg/gAH3YMg9AAboLIAGpcAjYANlmCyABmbnPcIAAMHQA +kI7gzCCigsoggQ/gAMQxyiEhAJAIYQHPIaEF/QXP//HA1gggAXvYag/gAOHZz3GAAHxsNBnADzAZ +AA8sGcAOKBmADiQZQA7PcIAAfGwgGEALz3CAAHxsHBgAC89wgAB8bBgYwArPcIAAfGwUGIAKz3CA +AHxsEBjACM9wgAB8bAwYgAjPcIAAfGwIGEAIz3GAAABsgBkACHwZwAd4GYAHdBlAB3AZAAdsGQAH +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 +AAuEGkALz3CgAMgcCICIGgAAz3CAAIAFAICMGgAAqCCAAvAiQwDPcJ8AuP8B4XagmQAAAPwciLb8 +HEi2/BwItvwcyLX8HIi1/BxItfwcCLX8HMi0/ByItPwcSLT8HAi0/BzIs/wciLP8HEiz4H7geATc +ON018OB4BNw03TPw4HgE3DDdMfDgeATcLN0v8OB4BNwo3S3w4HgE3CTdK/DgeATcIN0p8OB4BNwc +3Sfw4HgE3BjdJfDgeATcFN0j8OB4BNwQ3SHw4HgE3AzdH/DgeATcCN0c8OB4BNwE3RnwNBQaMDAU +GTAsFBgwKBQXMCQUFjAgFBUwHBQUMBgUEzAUFBIwEBQRMAwUEDACxwHGsCRNM7AkHzPgfvHAz3GA +AJAMEKHgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjRwOB+ +4HjhxeHGQCkNAiV9QC0DFIjipXsIdZD3UyV+kAbyAR1SEGG6+/FBKo4AwbpCJk6QBB3QEP31gOIK +8i8kiXDgeKgggAEBHVIQ4HjBxuB/wcXgeChyANnW8eB48cCuDs//ocEId892oACsLxmGBCCAD3AA +AADXcCAAAAAB2MB4LyYH8Ch1GnIT9IogSQb2DO//iiFNBDmG6gzv/4ogCQaKIAkG3gzv/6lxANgk +8BHMABxEM08gwQMB4BB4BCCADwAA/7+PuAIcRDARGhwwRgmgD0AnABIH5wQnjx8AAPz/BScAFJ24 +n7jscQChAMHscCCgAdh5Bu//ocDgeCK5BvDscmCiBOBhuYHhYIA69wDZz3CgANQLbaDPcKAARB01 +oOB+4HjxwO4Nz/8Idih1KHBIcWhyyv+B4MoggQPAD+H/yiFBAzkGz//hxc9ygACwBKSKgOXPcp8A +uP8G8s9z0Lr+yn6iGqI7ooDlDvLPcKAAOC4FgAQggA/AAAAA13DAAAAA9vNp2Bi4GaLgf8HF4Hjx +wH4Nz/8Id89xgACwBAWJAN6A4KnBQMZD9AHdpanPcYAAgHbPcKAAzCstoADYj7gRGhwwIRqCM34I +IA2LcCoJAAjPcAEAsAlBwIogUABCwM9wgAD8YgCIZMUC3REcAjAAwBIcQjMTHAIwz3CAAFQQRcDP +cIAAwA9GwM9wgACABQCAQ8Yg2QHaR8BIx4HAPdsXu8H/CNgB2cj/BBpYM0kF7/+pwAPaz3GgABQE +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 +8cAAFgBBz3KAAARLBrIAFgVBQCIBBA4aRAFMJYCEyiHCD8oiwgfKIGIByiOCDwAAcwBEBaLvyiQi +AADaB/AAFgBBFCGMAAC0AeIvIEIBEHK39lIMz/DRwOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+ +4HjgfuB44H7geOB+4HjPcIAA6AfgfwCA4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4 +4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfwHY4H7geOB+4Hjg +fuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB48cD+Do/w +GnHPd4AAREsgj1EhAIBG8s9xgADwByCJgOHMICGgPvKB4Ab0z3CAALicoYAD8ADdjuUD94DlAvQA +3c9xgAC4nBiJgOAE9IDlBPQA3gTwooEE3oogEwEaDa/wqXGKIFMBEg2v8Mlxz3CAABwPGIiD4Mwg +IoHMIOKBzCAiggjyiiATAe4Mr/Cl2QrwCpcQdQj0C5cQdswgIaAE9ADYIfAB2M9xoADIHw2hz3CA +APAHAYjLt6q3BL4QuMV9BX2KIBMBsgyv8LzZiiATAaYMr/Cpcc9woADIH38YWIMB2IEGj/DgePHA +Gg6v8AhxxP+A4DzyIN3PdqAAyB+wpjLYQx4YEADY8gnv8I24saawph7YQx4YEADY4gnv8I24saZ/ +Fg+WiiATAUEvDRTEvUYMr/Dm2YogEwE+DK/w6XGKIBMBMgyv8Klxz3GAAPAHAYkB2hB1wiKKAIDl +QKnI9gDYDaaB4gT0BNgBqf0Fj/Dhxc9ygABESyCKAN3guWTYyiBBA+G5z3OgAMAdBqIJ8gzYAKMB +ggOiAoIEogTwoKOjoqSiz3CAABwPCYBRIECB0SGigATyAIOAuACj4H/BxfHA4cUA3c9woADAHaCg +qXCpcYz/z3CAAERLo6CkoJ0Fr/CmoIDgz3GAAERLBPRAIQADBPBAIQAEAIDPcaAAwB1RIACAAIHP +IOIA0CDhAACh4H7gePHA8gyv8APZz3aAAERLdgnv8MlwoI5EJUARheAM9AohwA/rcgXYadtKJEAA +5QGv70AtBRIBjoPgw/ZjuAGuAgnP8B0Fj/DgeOB+4HjgfuB44cVSIIAAz3GgAHwdBKkC3RHw4Hjg +eOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HhhvYwl/5/t9eB/wcXgeM9woAB8HQSI4H7gePHA +QgyP8DpwenFachpzANjp/wTY6P9MIQCg1PcqdQDfQiFAIOJ4ASsOIMC+TyaAEOH/RSaAEeD/Yb2A +5QHnMvcE2N3/TCIAoADZABhAINf3SnUodgbY2P9hvef/QiJBIMJ5wLg4eAAQASAFeQAYQCAE2NH/ +gOUB5i73ANjO/x0Ej/DgePHAocGLcwjYBdkIctz/IMChwNHA4H7gePHAnguP8FpwOnEKI4CgGnMK +JQAhzCAhoBDyTCMAoMwgIqAM9AohwA/rcgXYQ9uKJIMPqQCv77hzANiacLf/BNi2/0wiAKDU90p2 +inVCIkAgongBKQ8gwL9PJ4AQr/9FJ4ARrv9hvoDmAeUy9wDdE/BBLcAQMiMOIFMlgRBOIcABGX7A +vk8mgBCk/0UmgBGj/wHlQCjAIBB1rPcA2J//TCUAoBvyFPDR/1EgAIAY8iDez3WgAMgf0KVk2EMd +GBAA2O4Or/CNuNGlgCQBKQwkgK8AAIgTqfeKIP8PA/AA2BEDj/DgeAjYBtkA2khzmHKK8fHAxgqP +8Ah1KHdIdvr/TyVBFBjY6XLJc0okQAC9/xEDj/DgePHAngqP8KnBz3egACwgQBcQEA4Ob+8A3c9x +gACQDBGBAeARoYtwugjv8ATZF/CBxslwrgjv8CDZABQAMclxINrn/wV9ABQAMSDgABwEMAIUADFC +IAAIAhwEMAIUATGg4Wf2gOEM8oHGdgjv8MlwABQAMclxAhQCMdn/BX3QhzzYAiYOFJIIr/DJcYDl +yiWBEwLI7gvv8KlxaQKv8KnA4HgdeM9xoABgHRKxFJHgfuB48cDhxQh1KHMH8Klw+f8CGxQAAuWw +fWG6jCL/j/f1TQKP8OB48cDhxQh1KHMJ8Klw8P8Aq0i4AasC5bB9AuNhuowi/4/19SUCj/DgePHA +4cWhwQhzKHUB4l16EPBocOX/ABwEMAJrEHji/wIcBDAAwATjcHsEHRAQYbqMIv+P8PXpAa/wocDg +ePHAagmP8Ah20gnv8CTYUSAAgMohwQ/KIsEHyiBhAcojgQ8AABcCyiQhAGQGYe/KJcEAz3WgAMAv +gOYThVH0+rgS8hOFIN6zuLq4E6XPdaAAyB9k2NClQx0YEADYBg2v8I240aX02ADZtgnv8AHaNNgA +2ZG5qgnv8ADaMNiKIQYAngnv8ADaNNgA2QPakgnv8BS6Sgnv8DDYwriB4AP0ANgH8ATdP9g6D2/w +qXGpcM9yAQDGA89xoADsJ0ahz3GgALQPPIGA4UryAhIENgohwA/rcgXYiiOJALUFb++4c5q4E6Ug +3892oADIH/CmiiAPCkMeGBAA2G4Mr/CNuPGmE4WzuLq4E6Vk2PCmQx4YEADYUgyv8I248abwpgHY +Qx4YEADYQgyv8I248aYThfq4BvQQhVEgAIAO9PwVBRAKIcAP63IF2IojRg1FBW/viiTIDkTYSR4Y +kKXxeQCP8PHACgiP8KHBKHbPd6AALCBAFxAQgOIA3QAcRDMw9DJoBCGBDwAA/P8iCq/wLNgQhwIg +AASMIA+KCfdGCO/wLNhRIACACHX18wfwIIaAuSCmMg5v8D/YKgjv8DTY9bgO8iCGgbkgph4Ob/A/ +2DTYANkA2lII7/CVujC9VfAPeRC5BSGBDwAAgv3PdaAA7CcmpQQggA8AAAAfSLiGuBC4BSCADwAA +Qv0GpRCHAiAABIwgD4oP989wAAAD/QalCoWLcQCxABQAMVEgAIDw8wfwIIaAuSCmrg1v8D/Yz3AA +AEP8BqUKhUAkgTAAsQIUADFRIICACPIghoG5IKaKDW/wP9jPcAAAg/8GpQqFi3EAsSDAz3IAAMP/ +RqVKhQi4QLEgxQV9QNheDW/wqXGpcEEHb/ChwOB4z3EBAMcDz3CgAOwnJqDgfvHAyg5v8ALZosEA +3kHGNg2v8ItwPtgqDW/wAhIBNj7YHg1v8AAUATE+2BYNb/ACFAExBczXcAAAAEAB2MIgCgAXuAAg +gQ8ADgAAAhQAMRt4D+AEIIAPAAD8/yV4nbifuOxxAKECEgE27HAgoAAUATHscCCwAhQBMexwILAC +FAUxUSUAgMohwg/KIsIHyiBiAcojgg8AAJoBVANi78okggPPcQAAIiKaDG/wPtgB2C3/AcHPdaAA +LCDwhSV4QcAP8AAUADGBwQHaff/scQCxABQAMQHmAeAAHAQwAhQAMRB2sPbE/zCFPthWDG/w4nk/ +2E4Mb/ABwf4Ir/ABwDUGb/CiwOB48cChwRB4TyABBJG5i3MY2BDaWf71Ae//ABQAMfHAqg1P8Ah2 +KHcSDq/wMNgIcYYhBgDSD2/wMNj+Da/wMNhRIECC/PXbfoG+QC8NFCzYtg9v8AUlgRPiDa/wMNhR +IECC+/WKINEP1gtv8AUlgRPBBU/w4HiB4M9xgAD0BwT0AdgAqQGpAImB4MoggQ8AAMQJyiCCDwAA +gADgfwGhANjPcoAA9AcBqgCqz3GAADB0BomA4AryB4mA4AbyAJGO4AT0AdgAqgDY2PHxwOHFCHXP +cIAAcA8BiIHgE/QH8GYIT++eDW/wT9jPcKAA1AsYgADZQiAACIDgyiBMABB1MPdBBU/w4HjPcFhY +WFjPcaUATBWxGRgAz3BwcFhYshkYAM9wAAQWoLMZGADPcDEIU7S0GRgAz3ACAJ1QtRkYAM9wMAQR +gLYZGADPcEEJPfC3GRgAz3ACAKl0uBkYAOB+4H7geOB+4HjgfuB44H7geOB+4HjxwAohwA/rcgXY +JttKJAAAaQFv7wolAAHxwAohwA/rcgXYK9tKJAAAUQFv7wolAAHPcAIAmBvPcYAA/AcAoc9wAgCU +GwGhz3ACAJwbAqHPcAIAoBvgfwOhz3ACABgbz3GAAPwHAKEBoQKhz3ACABwb4H8DoeB+4HjgfuB4 +4H7geOB+4HjxwNYLb/Bq2KLBi3EB2mYJ4ABIc4DgDvQKIcAP63IF2IojzwuKJIEKzQBv70olAACB +wUTYAdo+CeAASHOA4A70CiHAD+tyBdiKI88MiiQBAaUAb+9KJQAABBQAMYwgkIxcAAsAQCSBMGvY +AdoGCeAASHOA4A30CiHAD+tyBdiKI88PiiTBCnEAb+9KJQAAAhQAMc92gAAMCBt4QSjFAEwlAIoE +HkAR0vYKIcAP63IF2Ioj0ABBAG/viiTBCh3Yz3aAAAwIAaa4cAAUADHPdYAARLhALYIAqXGaCOAA +AduA4A30ABQEMQQWBRAKIcAP63IF2AUAb++KI1ADQYaA4gDY0fYWJQEQYImGI/8NI7uB4wb0YYmA +4wTyYrthqQHgUHCx9gDYHQNv8KLA4HjxwKIKb/CKIgQKocHPdYAAXAgAlc92gADguclxSiAAIAAc +BDQiCOAAAduA4A70ABUEEQohwA/rcgXYz3MAAAIMiQcv74olBAoAjoTgyiHLD8oiywfKIGsByiOL +DwAABwzKJAsEZAcr78olywCqCq/wNNjwuDbymP+A4A/yCiHAD+tyBdjPcwAADgxKJAAAPQcv7wol +AAGLcUXYAdqqD6AAAduA4MohwQ/KIsEHyiBhAcojgQ8AABEMyiSBDwAARQAIByHvyiUBBAAUADEB +2YYg/g/A4MB5z3CAAAwIIqgb8M9wgABeCACQz3GAADC8DtpU4BB4Ug+gAAHbgODKIcEPyiLBB8oj +gQ8AABkMyiBhAb3z9QFv8KHADngseClqANgPIEAAJ3BaeOB/DiDAAOB48cB2CU/wz3CAAAwIHYgF +8EAnQAAPePhwz3CAAAwIHojwcI4ACwAA2QfYRCk+B1lwL3AZcYQvAwEncM9xgADguQAhBAAfFMQA +GWEeEcUAOXAA3gAhjR+AAOC51X3njYhxBdrpcAUVwxDg/0AogRA0eYQvAQUncdR5x3GAAEy82HEA +qelwqHEH2gYVwxDX/wHmz36G5r4H6/8BHgIAQiJAEIDgQCBBEIYH7f8vebLxMQFP8OB4gOAb9Iwh +wo02ACoAAdpKJIBx4HioIEAEz3OAAMG6RCo+BzIjQw5wccv2gOMH8obiB/IB4k96ANoD8GG6T3rg +f0hw4HjxwHIIT/AacIDhOnKUACwAAN9acRUgwCNMIQCgoIgCiAvyz3aAAGBLFX4CuBR4x3CAAPRN +CvDPdoAAmEsVfgK4FHjHcIAAnE4hiFEhAIAk8gUQwQAirgYQwAADripwqXHX/wCugODMIGKAyiAh +ABPyRCg+BwAhgH+AAOC5xRCCAOEQgQACJYAQEHgHuMIJ7/hCeQGuQiJBIIDhegft/wHnLQBP8PHA +z3CAADB0BoCB4M9xgAAMCALaB/RcqQDYHakB2B6pC/CC4AT0XKkB2AXwA9gcqQDYHaleqUD/i//P +cYAAHGMggc9wgACUUQHaxf/PcYAAIGMggc9wgADwUQDawP/RwOB+4HiB4PHAuHEY9EwlAIDE9kwl +gIPL9gohwA/rcgXYiiOSBHkEL++Yc0AtgABkuMdwgABgSxvwz3CAAJRQMiBBAYwhw4/KIcEPyiLB +B8ogYQHKI4EPAACYBEQEIe/KJMEAz3CAAJhLNXjL8QJ5LXlMeVYhAXJHuThg4H8PeOB48cD2Dg/w +CHYodUh3GnNPeRC5D3gIuAV5iiBHCFINL/Clec9wgAAMCAGIgOD2AQIAgOfMICKgCfIsbS95z3CA +AAwIP6gG8M9wgAAMCL+oqXHPcoAADAggGkIDIRqCAyIawgMjGgIEyXDH/wAQhwDhiM9wgAAMCN2I +HogQdpwBCQBELz4HL3GELgMRCiRADgAhTQ7PcIAA5LkdZUAvggBUeoQuARUKJUAOACJADgAgiA+A +AEy8ACaDH4AAKAhMJwCAzCdigCX0GhXAEADZDKsbFcAQSiSAcRCrGI0Uq6ggAAYUIEAQQYhzbnR7 +NXvHc4AAQL0AEMAASKsVJUIQCasBEsAAAeEKqwCKL3kLq33wARXAEIDgF/QA2kyrUKtUq0okgHEA +2agggAMTbhR4NXjHcIAAQL1IqEmoSqhLqAHhL3lj8Gy6ACJAAXy5ACREAAAghg+AAEy8ACSAD4AA +5LkaiDqN6XKi/wyrACSAD4AA5LkbiDuN6XKe/xCrz3KAAOS5ACSAABiIOI0AJIUA6XKY/xSrANtK +IYARFCbLABQgxBABE4AQARSBAOlykf8zbjR5dXkAIYoPgABAvQgaAhAAE4AQABSBAOlyif8JGgIQ +FSXLABUlxBABE4AQARSBAOlyg/8KGgIQABOAEAAUgQDpcn//CxoCEEIhSRBMIQCQAeOYB+3/b3sB +5s9wgAAMCB6Iz34QdmwGzP8A2c9wgAAMCCCoOQUP8OB48cDCDA/wp8EacFpxSHU6cwojACGLcM9x +gAAAY+IJb/Ua2s9xgAAMCAGBAN6A4LQALgCYcAIRhQBMIICjAdrPcYAARLgWIYMDAIvCIowARCCP +AP1/8XJC9EwjQKAE9EGLEnII8kwjAKA49EGLgOI29EQgAgIjulB1MPRMJUCAGPREIAIBQSqCgAb0 +RCAPBEEvPpEL8oHiB/REIAIEJLqB4gPyANoC8AHaT3oI8EQgAgQkuoDiAdrAeoHiEPRMIQCmAdrC +IooAhiD/DiK4UHAN8oDizCVhkAnyAeaQdlwHxf+KIP8PEfAyJEA0geAG9EJx1nkCEcAACfCC4AX0 +BhPAAAPwBxPAABUEL/CnwPHAwgsv8EokQAAIdhpxSHdodbn/jCD/jxH0yXAKcelyqXMA3Zh1tP+M +IP+PB/SKIAcKCgov8MlxqXDtAw/w4Hj44Jb2z3OAAEBMBosQcgvyB4sQcgfyDosQcgXyD4sQcgb0 +geHMIaKAAdgD8gDY4H7xwEYLL/CKIIcIz3aAAAwIugkv8D+OAY6A4Hz0z3CAACgIQiAQByEWgBA/ +ju3+z3GAALR/IBaAEFaJEHIYFtMQDPQhFoAQNIkwcAj0GRbAEAkgwAQvIwUgHo79jhB3tAAJAADd +SiKAIxqOgOAR8kQvvhMAJUAeGBbCEM9xgAB4vZkhAgoZYZYhwgpAqTTwSCNAIC8hBSDPcIAAXEyr +YB+O6XEiFoIQu/8JIEEELXkAIMAjz3KAAGxMqmIwEIAAQngJIEEARC++EwAlRB4fjgAkhQ+AAHi9 +GB1CAOlxqXK9/wAkgQ+AAHi9GBHBAAJ5LXkYHUIAQiJSIEwiAKAB5WwH7f+vfQHnHo7vfxB3VgfM +/40CD/DhxeHGABHNAIDlRPYA3aCpgOAS8tTlhPdT3aCpz3CAADRNFCBOA6COoKoAEcEANHgBiBHw +1OWE91PdoKnPcIAAjEwUIE4DoI6gqgARwQA0eAGIAKvBxuB/wcXgePHA5gkv8LhyCHcodc9wgAC0 +f892gAAMCCAWgxA2iHBxo8EA2mb0NIghFoAQEHFi9BMWhhBMJgCABfKA5wP0RaY38FMlgJAF8oXg +ZgALAJDlg/aX5cP2ANoC8AHaTCYAgAbyIhaAEIDgANgD8gHYz3GAAEBMqWHPc4AAeL1EL74TmSMC +CidxO2MzI4QPAABYBRQiwQPZYWyJAdlAwUHAQCYAFULAANgIcQoL4AD4dwK9tH3HdYAAbJCA5yKF +CfKB5w/yguce9NG5BYYSuA/wBYYEIYEP/wcA/gV5IqUS8AWGBCGBD/wH/wEJuAV5IqUK8ADZAr20 +fQAlgB+AAHSQIKBaD+/viiCUDUUBL/CjwOB4ocHxwNIID/ChwWXCCHYodc9wgADKBoXBi3JAJEMw +AIid/0QuvhYAJUAeFBTBMM93gACIuVknjxr4YJjlViDACngAKgAgqFMlgBCF4EwACgBGJc0Rr30d +8AEUgDAAJoEfgABskFJtVHpZYSDCAKlELr4WACVAHkSpFBTBMPhgViDACiCoyXCpcZr/AeWvfVMl +gBCF4KL2IPABFIIwEm0UeAAmgR+AAGyQOGBAqCDCRKjJcKlxj/8Q8EIlABYPeAEUgTDHdoAAhJEC +uBR4HmYgwCiuDK4I3GsAL/ChwPHA6g/P76HBGnCKIAcJYg7v7wpxz3CAAAwIAYiA4EohACC59M9w +gABATDIgEwTPcIAADAjdiB6IEHZaAQkAKncKIkAkAvA6dUQuvhMAI0Auz3GAAHi9mSECChlhMyGN +DwAAWAVMIACmu32tfVb2z3GAAEwpGoE7gSR4USAAgg7yz3CAAAwIE4iLc8lx+gjgAKlyAMACfa19 +z3CAACgIfLjYYCwQwQDPcoAAoAYAigXaqXNv/UokgHEA3agggAVzbnR7tXvPcoAAQL15YimJgOF6 +YgvyEHEQ8hBxE/aF5Vf2AeWvfQrwQiWSEC8ihyRhva99EfALEs8AANkqdQzwgOVKIgAgyiVhEAXy +QiVSEC8ihyQB2YDhLfJzbnR7FSNBA893gABAvTpnACdFEBUjgwR5ZymJSYowcn9n64/Y9gIiRAAL +FYIABL/wfyJ4BLovJAgBAieDEGx4LyBGDm4Ir/iIcQ54An8I5+5/RL/tf0wgAKaE9grn7X/JcApx +6XJq/wHmz3CAAAwIHojPfhB2ugbM/7EG7++hwPHAXg7P789woAC0D3AQEACKIMcIz3GAAKAGvgzv +7yCBz3eAAAwIAY+A4ADdLvTPcKAAtA+8oD6PHY8wcBD2z3OAAGy5f9oUIA4AfmZYrrmuAeAPeDBw +Bdparvb2AN0O3s9wgABcTKhggP9hvoDmAeWvfTj3z3CAAKAGAIDPcaAAtA8Jp3AZAAQ5Bs/vCHEF +IYEPrd4AAEEE7++KIIcJ4HjxwOHFz3WAAKAGiiDHCSoM7+8ghc9xgAAMCAGJgOAM9ACFKYFNaDBy +wCBsAcwhDIAwD8n/BQbP789xAACt3vkD7++KIIcJ4HjxwAAWgEDPcYAADAgYqQAWhEAAFoBAUCS+ +gRmpABaAQMohwg/KIsIHyiBiAcojgg8AAPEKaALi7solwgBRJICBANjKIGEAG6nPcIAAyAYAkIDg +BPJ0/rH/cgkP8KMFj//xwBoNz+8Idc92gAAMCAmOEHUodwT0CI4QdyDyqXBAJoEU8gmgAEAmwhQS +jq96M44Yugi4BXqKIFQNVgvv70V5Mo5AJgATTg2gAFOOEo56DKAAM46pruiuKQXP74Hg8cC4cRj0 +TCUAgMT2TCWAg8r2CiHAD+tyBdiX28UB7+6Yc0AtgAAUeGy4x3CAAPRNHPDPcIAAlFAyIEABjCDD +j8ohwQ/KIsEHyiBhAcojgQ8AAJ0AjAHh7sokwQACuBR4x3CAAJxO0cDgfvHAUgzP7892gADKBgCO +z3eAAMgGII/g/0GIz3WAAEgI47oglwbyAdgArYogxwNI8AKAgOAF8gDYAK2QuT7wUSIAgTHyz3KA +ALR/FooQcSv0AJZ0inBwJ/TPcIAAzAYAiFKKEHIf9M9wgAAcDwmAUSBAgRnyQYWA4gDbDvLPcKAA +LCAQgEJ413AxAQAtRPcB2kCtBPBgrQDaELqKIEcDRXkO8AGNgOAH8gHYAK2KIAcDBvAA2ACtkbmK +IAcECgrP7/kD7+8AjeB4gODxwA70sv/PcaAALCAwgcdxSWsA0iKg5gnv74oghwWK8eB4gODxwNhx +CvSo/wDZIqCKIMcFygnv78hxfPHgePHA4cXPdYAASAiKIEcGsgnv7ymNBNheDK/7AdkIjSmN6P+h +A8/v4HjxwM9xgABICIogxwaKCe/vKYnPcIAA3E2CCY/4WPHgeOHFUyANAKCpBCCBDwAGAABCIQGA +BCCAD0AAAADKIWIAIKrXcEAAAAAB2MB4AKvgf8HF4HjxwNIK7+/YcQomgJCIdcwjIoAG8kImBgEv +JocByHF9/4Dmz3GAAEgIA6Ei8iSIArk0eUOIA+FRIgCAAhCFAA30CiHAD+tyBdiKI0gEmHOlB6/u +CiWAAQhhUSBAgAr0CiHAD+tyBdiKI0gF8vEBEIUAUSUAgMohwQ/KIsEHyiOBDwAAIgLKIGEB4vPh +vdElIoHKIcIPyiLCB8ogYgHKI4IPAAApAkwHou7KJIIBUSUAkBHyUSXAgMohwQ/KIsEHyiBhAcoj +gQ8AADACKAeh7sokgQFtAs/v4HjxwO4Jz++hwQh2KHcacgDdz3CgALQPcBARAIogxwBOCO/vyXHP +cKAAtA+8oItxQCRCMEAkgzDpcK//TCAAoAX0SiQAAAnwz3CAAIyXAYiA4Pj1SiSAACDAARSCMMlx +AhSDMLL/z3CAAEgIKYiA4cwmQpAF8iOAqqiioeW/FvLPcYAAtH9WiVB2EPRUiVMnAxBQcwz0BCeP +HwAGAACA5wHaMonAejByBfKiqKGgoKiKIMcAug+v78lxz3GgALQPcBlABI0B7++hwPHAMgnv74og +BwbPdoAASAiSD6/vJIYV3QSGMmgB4DR5x3GAAJxOBKYCgYDgEfLPc6AALCBwg2J413BJawDSANrH +90KhiiDHBVoPr+8giQSGquCE9wDYBKZhvYDlvAfN/z0Bz+/xwM9xgACgBooghwEyD6/vIIHj/89w +gADIBgCQgOBcDML/VQTP/+B48cCeCO/v2HGhwRpwi3FAJEIwQCSDMMhwYv8BFIAwgOAJ8gIUgDCA +4AXyQiAQIS8gByQgwApx7P4BFIEwgOEE8qKIA/ChiIogxwHODq/vyHFAKAAmQC0CFAV6ARSAMAIU +gTAIuAV6iiDHAa4Or+9FeeG90SXikAXyUSUAkQzyCiHAD+tyBdiKI00BmHM5Ba/uCiUABG0A7++h +wOB48cDhxTj/z3CAABwPGIiE4M91gACMlwv0iiAPCl4Or++KIYoCAo0hhc//Ao0hhQHaeP9NAM/v +4HjouAjyBCC+jwAAABgB2AP0ANjgfwCp4HjxwK4Pj++hwRpwAN7PcKAAtA9wEBEAz3CgALQP3KCK +IEcBCg6v7wpxhCgGLwAhjX+AAOCYIfBAJQAXFiCEAwUUgACGIP6HGPIEhYtxQCSDMEAkTzDpchj/ +qBUAEOlx4/8gwAQUgQABFIIwAhSDMEokwAAe/wHmDJUQdr4Hxf+KIEcBqg2v7wpxz3GgALQPcBlA +BPMFz//geIQoCwwAIYF/gABYsigRgAAogRkF7/8A2vHAj/9CCc//qQLP/89xgAC0f89wgADIBgCQ +VokQchX0z3CAAMoGAJBUiRByDfTPcIAAzAYAiDKJEHEH9M9xgABICAGJAqngfvHAug6P7xpwz3GA +ALR/z3aAAMgGAJZWiRByz3WAAEgIEfTPcIAAygYAkFSJEHIL9M9wgADMBgCIMokQcQP0Ao0C8ADY +Aa2K/s9wgADMBkCIz3GAAMoGAIkgjoDiAdrAegpzAN+Yd+P+A4UBiFEgAIEglgfyAdgDrYogRwME +8OOtiiCHA64Mj++VBo/v8cAuDo/vocEIdQDez3CgALQPcBAQAM9woAC0D9yg442KIAcBggyv7+lx +BJWLcUAkgzCA4AHYwHgvJwAABYVAJEIwvP4KhUAkQTCH/4DnlSVDHtn3ViUAHPAggAOpcYAhCADU +ecC4BSDAAS8kBwAgiSDAARSCMAIUgzC7/gHm8Xaq94ogBwEiDK/v6XHPcaAAtA9wGQAEkQXP/+B4 +8cCSDY/vz3CAABwPKBCQAKiAiiAHAvYLr+8KcVMlABAKcS7+AYhRIACByiHCD8oiwgfKIGIByiOC +DwAAWgPKJMIAeAKi7solAgStBY/v4HjPcKAALCAwgM9wgABICOB/IaDgePHA4cXPdYAASAgAjYDg +EfQ0/oDgDfSKIEcEAN2KC6/vqXGQ2ZC5A8igGEAAFPADjYDgEfLPcKAAAAQsiIwhAoAA3Qn0Yguv +74oghwSR2ZC56/EB3VUFr++pcOB48cDWDI/vz3aAAHiWFI6B4BH0BNjqDW/7AdnPcIAAygYAiM9x +gADIBiCJSf4A2BSuLvD2joDnLPLPdYAASAgKjWG4EHcX8lz+z3CAANxNz3GAAKiWJYFBbwUpvgBW +C2/4L3GKIIcGz3GAAMgG3gqv7yCRz3CAAMoGAJDqrQitz3CAAMgGAJAJrQDYFq41joDhCPLPcIAA +ygYAiDb+ANgVrp0Er+8B2OB4gODxwPTYCPSWDM/vUCABAPTYB/CKDM/vCHH02IC5Tg6P79HA4H7g +eIDg8cA02Af0bgzP71AgQQQF8GYMz+9PIEEEKg6v7zTY7fHgePHA3guP7xpwSgzv7zDYmHApuFEg +AIDKIcIPyiLCB8ogYgHKI4IPAADPANwAou7KJSIALNjqDa/vQCiBIAHfiiAPChpwDgzv7zDYmHAp +uFEgAIAX8ownD5o08iDdz3agAMgfsKYB2EMeGBAA2G4Pr++NuLGmQiBAIIDgAecj99YL7+802E8g +AQWVuZYNr+802MIL7+8s2Ah1ugvv7zTY9bgZ8kfYsgmv7wLZCiHAD+tyBdjr20okAABNAK/uCiUA +AQohwA/rcgXY29s9AK/uSiUAAPS4yiCCDwAARwB4CaLvyiFiAF0Dr+9BLQAU8cD2Cq/vNNheC8/v +8LjPd4AAvL0R8gDeyXCs/wHYtf+KJRAQyXC8/xQnjBNhvYDlALQB5jj3KQOP7+B48cC6Cq/vNNih +wQDeQMYA3xoL7++Mv/C4F/I6CS//AdgD3Qq9+GYQeItxhgov/wHaz3GAALzF1HlhvYDlALEB5jL3 +ogsP/90Cr++hwM9xoABgHRKxFJHgfvHAXgqP7wh2KHVIdxpzxgrv7zTY8LgN9GG/jCf/nxjyyXD1 +/wIdFBAB5tB+9vFMIACgBvLPcYAAvL0F8M9xgAC8xft61HlKD6/0qXB1Aq/vAdjgePHAAgqP71pw +GnE6cmhwsgsv+ArZoWhqCu/vSnAEIEAEBCEBJDBwFfIg3892oADIH/CmCthDHhgQANjODa/vjbjx +pmG9jCX/nyf2ANgC8AHYDQKP7/HA07hPIAEGmbk6Ce/viiARAkoJ7++KIBEElwXP/+B48cDhxUh1 +QCkCBlMgwQSKIBEBEgnv70V5iiARAwYJ7++pcfEBj+/gePHAdgmP7wh2KHXs/whyyXAD2aZ68f/N +AY/v4HjxwFoJj+8Idih15f8IcslwA9mleur/sQGP7+B48cDMuBC4TyCBAJ+5aguv7/TY9NgC2c9z +AQCghihyxP+A4MogIQALBc//4HjxwBIJr+8k2EILr+8E2STYAdnPcwAAqGEocrr/gODKIcEPyiLB +B8ogYQHKI4EPAAACAcokIQD8BWHuyiUBAc9wAAAMMADZmrnc/yDez3WgAMgf0KUK2EMdGBAA2KoM +r++NuNGlz3AAAAwwANmaucz/iiAJBNYKr+9vIUMAAQGP7/HAhgiv7wDZB9gacTpwAN5AKAAhFHjH +cIAArKQVII0DAJWMIAKNAN+E9owghYLJ9v/YALWKIBEDyg5v7wDZAZ284AX2jCA/gUf24bWKIBED +sg5v7wDZAebPfozmtAfL/0IhQCCA4EAgQSCiB+3/L3l1AI/v8cDhxc9wgABcCACQz3GAAKykqNoB +3YAgRAsQeJ4N7/+pc4DgyiHBD8oiwQfKIGEByiOBDwAAwADKJCEAAAVh7solAQHS/89wgABQPkUA +r++0oOB48cDKD0/vCg3P/892gABcCGbYIm4B2lIN7/9Ic4DgCvQKIcAP63IF2M3biiSBCTbwAhYF +EUwlAIDMJYKPAAD//wr0CiHAD+tyBdjQ250Eb+6KJIEJZ9jJcQHaDg3v/0hzgOAK9AohwA/rcgXY +09uKJMEJFPABliRuAdoB4BB46gzv/0hzgOChlgz0CiHAD+tyBdjW20AlRBBRBG/uSiUAAAJtEHgm +bgHavgzv/0hzgOAK9AohwA/rcqGWBdjZ20AlhBDs8XEHT+/xwOYOT++hwRpwOnKA4Wh2wgAsAADY +mnEVIA0gz3GAAFwIABWTEAIVkhC6cOONIZEBjQHaOGAQeItxZgzv/0hzgOAT8gAUADFMIQCgQCqC +IAQggQ8AAAD/R7lUehXyx3KAAPRNFPDPcIAAXAjBkKGNCiHAD+tyBdj22wAmRBOlA2/uCiVABcdy +gACcToDmABrCBATyAqoD8AGqUSAAgBTygOYN8gOKgLgDqhJvFHgbYmOLWGCBu2Oo5KqA5gPyJqoC +8CWqQiRBIIDhTgft/0AlQCBlBm/vocDxwM9wgACUUQ7ZAdoA28f/z3CAAMxRCdkB2khzw//PcIAA +8FEq2QDaANvA/89wgACYUgvZANoB27z/0cDgfuB48cCI/+//Cg4P/w4IAABw//Xx4HjxwMYNT++j +wUohACCLcSpwSiAAIQpyXgvv/ypzgODKIcEPyiLBB8ogYQHKI4EPAADuAMokQQTAAmHuyiUBBAAU +hTDPcYAAZAgAGUIBTCUAgMohyw/KIssHyiBrAcojiw8AAPYAkAJr7sokywAAwEEoAgJBKA4DUyLE +AFMmxRACGQIBAxlCAUwkwIDMJeyAyiHJD8oiyQfKI4kPAAD8AFgCae7KIGkBQSgCBFMixgAEGYIB +QSgCBVMixQAFGUIBTCZAgMwl4YDKIcIPyiLCB8ogYgHKI4IPAAACARwCYu7KJIIBQSgCBlMixAAG +GQIBQSgFBwcZQgFMJECAzCVsgMohyQ/KIskHyiOJDwAACAHoAWnuyiBpAQQUhTCMJQGEtgAsAAEZ +QgEKIcAP63IF2IojRAPFAW/umHPPdYAAvN0A3wPwAefvf0EoAQLDuTB3cAAKAADeEvBAKYEgNHkK +FIAwFSFBAQHmz34UeblhABkEBIAgAiMvIAgkAMBBKAEGw7kB4TB2vgfK/4LBCnAC2uYJ7/8A2wsU +hDAvKAEBTiCFBy8lRwFMJcCArgfL/wohwA/rcgXYQQFv7oojRAtAIVEgLyFHJEEoAQTDuTJxcgfJ +/wXwTCYAgGQHyf9BKAEFw7mA4Qp1rgAsAEogACBKIgAgBfBAIlIgLyKHJEEoAQPDuVJxfgAMAEoh +ACAV8AK+1H4KFIAwFSZOEUAhUSAvIUckFH4AJoAfgAC83aCwgCUCE7B9AMBBKAEHAeEycbYHzP8w +uMO4ACAOBILBqXAC2iYJ7/8A2wsUhDAvKAEBTiCFBy8lRwFMJcCApAfr/89+CiHAD+tyBdiBAG/u +iiOFAUAgUCAvIAckQSgBBcO5EnFgB8n/09kIuQDYA97Pc4AAvN0A2rJoVH19ZTi1AeJPeoLiViEB +CDB5t/ZhvoDmAeAPeDD3YQNv76PAgODxwLhwyfZMJYCDBfYA2ACpAKoT8EwlgIiH9owlAYDKIGwA +9vaMJQGJi/aMJQKDB/YC2ACpAdgAqtHA4H6MJUKEhvaMJUKJA9j29gohwA/rcgXYiiPGAdUHL+6Y +c+B44cXhxs9zgABkCEaTUyJNgBfyguUX9BGrBZMwq8SDKd0SvRUlDBDApCiLgOEG8lYgAQgweTV9 +wKUB4AWzA/ATqzKrAeJGs8HG4H/BxbhwViEAAoDg8cCYccT2jCACgIr2CiHAD+tyBdhlBy/uiiNH +B89wgAAsYxQgAAGAEAEBBCl+AS9ywBBAB0IqAwTBu1K6BCh+AS9xQikABMG4UrmB48AiaQCB4MAh +aQCIIj4Af9wJIgADiCE+AIkhwQ+A4NYgKwiA4dYhKwjO/4nx8cC+CU/vosFAwEHCQCgUBUApFwUA +3UAqEwVAKxIFAd5KJYAhqXcE8Ap1yncAwBW4E3gUIMAFegvv9wfZAiBQAwIgQCNqC+/3DtnMfgoh +QC4EKT5wL3CsfgAhDXUdZQHAFbgTeBQggARGC+/3B9kCINYDAibAIzoL7/cO2QQofgQvcex+ACHA +dBlhQi0AFVS5vP9CJVUgTCUAoAHmjAft/89+ZQFv76LA8cAyCU/vCHYacc91gABkCOaVCvDMf/IK +7/dAKUBxRbgKca7/JpWMIRCAtvZpAU/v8cD2CE/vocE6cQDfgODKIcEPyiLBB8ogYQHKI4EPAABx +AsokwQAEBiHuyiXBA89xgABkCEWx5rFMIQCgyiXOE2QALgDKJs4TGndadwTwyXcadWpwQCBTAItx +AdpKDq//ANsAFA0xLyPIJKl2Kb3Ivr/l2SUpFEwiAKDKIMIDyiGCA8oiAgSkDuL/yiNCA8lwqXGG +/0IhUSBMIQCgsgft/0AiUiDJcKlxyv+lAG/vocDxwEIIT++acBpxz3WAAGQIxY0EjR5mknbKIcwP +yiLMB8ogbAHKI4wPAADSAsokDAVIBSzuyiWMAwDfAN4i8ADYCK1qcIrZKnLC/wiNUyfBEBi5w7gc +uAV5z3gQuAV5iiBUDWoOL+8FIYEELyHIBBC5iiBUDVYOL+8FIUEEAebPfgAlAhRGigFqEHZb9kAs +gCAUePV41HjPc4AAvN0QYwoiAKAyb+zzQCCTAC8jyCTUeYDiO2MwExEBw/UB2MLxAefvf4PndgfL +/80HD+/xwHoPD++hwQh1enEacs9xgABkCMWJBIkeZnJ2yiHMD8oizAfKIGwByiOMDwAAGwPKJMwE +eAQs7soljAMA3wDeIPABFIAwAR0SEAYRgSCA4QEUgDAD9AEdEhAgwAMUgjABFIEwGLgUugV6AhSA +MBC4BXqKIJQNig0v70V5AebPfs9xgABkCAAhAAQGiAHgEHZ2ACoAACERBEArgCAUePV41HjPcYAA +vN00IRIAUyfAEBi4z3kQuQV5iiCUDUINL+8FIYEETCIAoADZFvKLcUpwAtpaDK//ANuA4LX1CiHA +D+tyBdiKIwwMCiSABMEDL+5KJYAAAR1SEAYRgCCA4MD1AR1SELzxAefvf4PnMgfL/w/x4HjxwOHF +AN2go4HgzCEhgBfyoOJF9qCjANgJ8MDiBtgG9kIiAAhDuALgAKNQeRC5EH2KIJQNtgwv76V5tQYP +7+B48cAqDi/vANihwUh2iHIKIkAhCiGAIQrBCiDAIUwmQIAAocwmbJDMIKygzvYKIcAP63IF2Ioj +TgsKJEAEHQMv7golAARMIUCgzCAhoMohwQ/KIsEHyiOBDwAAswMF2O7zaHCGIPwDRLhk34QoAQkv +dYAlDxrDu3tjdXsowEQqvgyB4H1lAiVNHgv0W3pNeotzKnAKccv/AMAVeBV4An2pcGYPr/dk2ex4 +AiVEHongyiBqAsoiCgBJ9oDgyiArAMoiCwCD9kFoQCjPIPV/z3OAAChrFScBEFV/TCEAoHlh+2MN +9IDmBvSoEQ6GqBMAhhLwihEOhooTAIYM8IDmBvSQEQ6AkBMAgAbwGBEOgBgTAIApwYHhiiH+AMAm +QRDAIEEAwniIcSx4L3DeDq/3ZNm4YNhg1g6v9wrZKOBIIAEAjCFDgsohig8AAMgAz3CAABRmmSBB +BzV4wBAABowiQqAluBB4RfaMIgGgDfYKIcAP63IF2IojUQ2KJEIA4QEv7golgATPcYAAJGRZIcEP +FSGBBIARAQYtuTB5LHgKwEIphHWMJMePABgAAcohzQ/KIs0HyiBtAcojjQ8AAJQEnAEt7solDQSK +IJQN4gov74hxuQQv76HAAAAAAAAAAAAAAAAAAQAAAAAAAADAD4AAVBCAAABsgAAQAIAAjASAAAQI +wBAKABNkbAWAgQAAwBYEARNiD1wAIgoAAEAABgBwGgAAYQAAEyQAABMlAADAF8ggwBBwRcAQEAjA +EAAAEyQAABMlBAjAEQ8UFSIEABUm+/8wMgMAEyQYCMARHAjAEQ8UFSIBABUmBAAwMDAAEyTsHMAR +AwATJFAUwBEEGMARAAATJBBFwBEYCMARD3wTIggAzBEAABMlAAATJDRIxxEPexMiAQATMAQowBEP +FBUiBAAVJuwGgIEAAMAWwiwTJAQowBECRhMkBCjAEcJfEyQEKMARD00TIgQQxRECABMk8BzAEQEA +EyTsHMARAAATJHAAEyUQHMARAAATJQAAEyTgHMARAQATJCQQwBEAAAAhAAATJQAAEyQPRQAiAFwA +OQMAAGICYABiAABYOF0AAGEkEMARAIATJDgcwBEPcxMiggETMAQowBEPdBMiAgITMAQowBEPdRMi +QgITMAQowBEPFBUiAQAVJg9yEyIIAMwRD0QAIgoAAEAAQABwDgAAYQAAEyUCABMk7BzAEQ92EyIY +CMoRCQATQBwIyhEJABNAIAjKEQ94EyIEAMoRAAABJAAAASUGAABhD3YTIixIxxEPeBMiAADGEQMA +ASQAAAElAAATJcIsEyQEKMARAkYTJAQowBHCXxMkBCjAEQ9FACIAXAA5JwAAZAAAEyQBABMlOBzA +EQ93EyLgHMARDwETIgQIwBEPAhMiBCjAEQ8HEyIEKMARDwQTIgQowBECAHFwBwAAYf8AEyUCEBMk +BCjAEQAAEyUAABMkyEnHEQYAAGEAABMlAhATJAQowBEAABMlSQATJMhJxxEPcBMiAQATMAQowBED +ABMkAAATJQQIwBEAABMkOEXAEQ8DEyIYKMARBAAAYQAAWDgAABMkAQATJTgcwBEAAAAhnGuAgQAA +wBY8BMARMAWAgQAAwBYEARtiEATAEAMAGyRUBMARJATAEQgEwBBca4CBAADAFwgEwBA4a4CBAADA +FwAAGyUDHBtiQAAbJDAcwBEFAABhNAWAgQAAwBYPGxkiCASggTjwxIAAABskAgAbJTgcwBEAAAAh +MAWAgQAAwBZMBMARNAWAgQAAwBYPGxkiSASggTjwxIAAABskAgAbJTgcwBEAAAAhAAAAhTAFgIEA +AMAWDxsEIhAEG2YPARtoFBzAEAoAG0AEABtuAwAAYQ8cHSIBAB0m+Q8AYWQMABAAwAYRAQAEJ/wA +BGQAABskAgAbJTgcwBEAAAAhAAAbJUAAGyQwHMARAAAAIQ8cHSIYAR0mGADHEPySgIEAAMAXIADH +EASTgIEAAMAXAAAAIXwxgIECAFxuEQAAYfhBxBAPGwkiAAsJOQIACmIDAQpiBAIKYgAACUAEAABh +CQAJQAIAAGEKAAlAAAAAYQIACUEACRooAADAFgEAGyYAAMAXBAAdJgEACCfpAAhkAAAAIQAAAACM +AQAAAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsOQAAODsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAABSEgAAAAAAAAAAAAAAAAAABAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +wACQANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAADIkoAAAAAAAAAAAABAl4AA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAsAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAiJyAACycAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAD/AQAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMisgACY9gEAAAAA +AAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIkoAAhP8BAAAAAADIkoAA +UAYCAAAAAAAAAAAAyJKAAOgHAgAAAAAAAAAAAAAAAADIkoAAAAAAAAAAAAAAAAAA/wAAAAAHAAAA +AAAAAAAAABgbAgAYGwIAGBsCABwbAgAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAB/fwABAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAQIECAAIECAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADECAAAFQAAANQtgAA4KwAAOCsAADgrAAAMQgAA +OCsAADgrAABYPQAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAArB4AAFwgAAB0 +IAAA5CEAAGwiAADoIQAAOCsAADgrAACATgAASFAAADRRAAA4KwAAOCsAADgrAAD8TAAAFGQAABBk +AABoZAAAOCsAADgrAAA4KwAAGEQAADgrAABMZAAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsA +ADgrAAAQQgAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAA +OCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAAIRQAAOCsAADgrAAA4 +KwAAOCsAADgrAADwRQAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgr +AABQawAAOCsAAHhsAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAACBvAAA4KwAAOCsA +ADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAAMyAAQAkhAEAOCsAAHiGAQA4KwAA +KIgBABRUAQA4KwAAOCsAAABSAAA4KwAAOCsAADgrAAA4KwAAOCsAADzeAQDE8QEAOCsAADgrAAA4 +KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAACsGAIAOCsAADgrAAA4KwAA2P0BADgr +AADUAQIAOCsAAPwpAgA4KwAAoCUAAKQlAAA4KwAAOCsAAIgSAgBMcgAAOCsAADgrAAA4KwAAfPsB +ADgrAAA4KwAAWE0BAAygAQA4KwAAOCsAADgrAAD8qAEANFUBADgrAAA4KwAAOCsAADgrAAA4KwAA +OCsAALSzAQA4KwAAgA8CAIQPAgCQDwIAlA8CAIgPAgCMDwIAmA8CADgrAAA4KwAAOCsAADgrAAA4 +KwAAOCsAADgrAAA4KwAAOCsAAPBTAAA4KwAAOCsAADgrAAA4KwAAOCsAANQOAgAkDwIAEEgAADgr +AAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsA +ADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAAA4KwAA +OCsAADgrAAA4KwAAOCsAADgrAAA4KwAAOCsAADgrAACQSQAAGEoAAKxKAABgSwAAJIEAADhLAAA4 +KwAAOCsAADgrAAA4KwAAOCsAAIhJAACMSQAAOCsAADgrAAAwUgAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAIwMAACMDAAAjAwAAIwMAACMDAAAjAwAAIwMAACMDAAAjAwAAIwM +AACMDAAAjAwAAIwMAACMDAAAjAwAAIwMAACMDAAAjAwAAIwMAACMDAAAjAwAAIwMAACMDAAAjAwA +AIwMAACMDAAAjAwAAIwMAACMDAAAjAwAAIwMAAC8DQAAAAAAALxaAQCMDAAAnAkAAIwMAACMDAAA +jAwAAMwJAADoPAEAZIMAAIwMAACMDAAABAoAAAQKAAAECgAABAoAAAQKAAAECgAABAoAAIwMAACM +DAAAjAwAAIwMAAD8CwAAjAwAAIwMAACMDAAAjAwAAIwMAADADQAAjAwAAIwMAACACQAAAwAAAJwM +AgACAAAA6GgBAAQAAACcaQEABQAAANwNAAAGAAAAIDQAAAgAAAAADwIAEwAAACz4AQAJAAAAgAMC +AAoAAACcDwIADgAAABSdAQAPAAAAYIoBABAAAACYigEAGAAAACRaAQANAAAAEIIBABcAAABIcgAA +EQAAAKSBAAASAAAAWEwBAAEAAABY/QEAFAAAAMCwAQAVAAAAQKABAAcAAACQbwAAFgAAAOwpAgAZ +AAAAvA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAABAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAABAQAAAAAA +ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QMOHuHhAw4e4eEDDh7h4QMOHuHhAw4e +4eEDDh7h4QMOHuHhAw4e4eEDDh7h4QMOHuHhAw4e4eEDDh7hPDw8PDw8PDw8PDw8PDw8PDw8PDw8 +PDw8PDw8PDw8PDwVFRUVPDw8PBUVFRU8PDw8AAAAAAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8 +PDw8PDw8PDw8PDw8PDw8PDw8FRUVFTw8PDwVFRUVPDw8PAAAAAAAAAAAAAAAAAAAAAA8PDw8PDw8 +PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PBUVFRU8PDw8FRUVFTw8PDwAAAAAAAAAAAAAAAAAAAAA +kAYAADH6rwCQBgAAMfqvAJAGAAAx+q8AkAYAADH6rwCQBgAAMfqvAJAGAAAx+q8AkAYAADH6rwCQ +BgAAMfqvAEMFAAAx+q8AQwUAADH6rwBDBQAAMfqvAEMFAAAx+q8AQwUAADH6rwBDBQAAMfqvAEMF +AAAx+q8AQwUAADH6rwAAAAAA3sMJAAAAAAAAAAAAAAAAALQqAQABAAAAlC2AAAAAAAAAAAAAAAAA +AFQrAQAVAAAA1C2AAAAAAAAAAAAAAgAAAAMAAAAAAAAACAAAAAAAAAAwjBEAIL8CAAAAAADIKwEA +cCwBAHQtAQAgLwEAdC0BACAvAQDQMAEAWDEBALgxAQCAgICAgICAgAGAAoCAgICAAAAAALg3AQC4 +NwEAAAAAAAAAAAAAAAAAAAAAALg3AQC4NwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQt +gACULYAApCCgADggoAABAAAA/P///wAAAAAAAAAAtC2AALQtgACoIKAAPCCgAAgAAADz////AAAA +AAAAAADULYAA1C2AAKwgoABsIKAAMAAAAM////8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA +AAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAbE0BAAUAAADULYAAwFIBAAD/AwDgUgEAAP8FAMxTAQAA +/y0A8FMBAAD/PQCoUwEAAP8EAIxTAQAA/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAABgWQEABgAAAJQtgAAAAAAALAEAAF4BAAABAAAAAQAAAAEAAAABAAAAAwAAAAAAAAAAAAAA +vGABALxhAQA4YgEAQF0BAGhcAQBoYwEA8GMBADRkAQCIZAEAAAAAAAMAAAACAAAAAwAAAAMAAAAD +AAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAbGoBAAoAAACULYAAAAAAAAAAAAAAAAAA+GoBAAoA +AACULYAAAAAAAAAAAAAAAAAArGsBAAoAAACULYAAAAAAAAAAAAAAAAAAzGwBAAoAAACULYAAAAAA +AAAAAAAAAAAAMGsBAAoAAACULYAAAAAAAAAAAAAAAAAARGwBAAoAAACULYAAAAAAABAAAAAAgAAA +AACgABAnAADoAwAA6AMAAAAAAAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAAAAAAAAAAAPg+AQAK +AAAAlC2AAAAAAAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAA +AAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAAAAAAAAAA +APg+AQAKAAAAlC2AAAAAAAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAAAAAAAAAAAPg+AQAKAAAA +lC2AAAAAAAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAAAAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAA +AAAAAAAAAPg+AQAKAAAAlC2AAAAAAAAAAAAAAAAAAASGAQAKAAAAlC2AAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4jQEAhI4BAHCRAQAklAEApJYBACiaAQA0kAEARAWAAJCS +gAAYAAAAUJKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvJwBAAYAAACULYAA/////wAAAAD///////// +/wAAAAAAAAAAAAAAAJyfAQAFAAAA1C2AAG4AbgBpAMAAoABQAIAAvgBQAX0APgBuAG4AaQDAAKAA +UACAAL4AUAF9AD4AAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIBAQACAQABAgICAAEB +AAIBAgECAAIAAQID//8AALkB3wCxABsAFgEbAHwBGwCvABsAFAEbAHoBGwBsAKAA0QCgADcBoABv +AIMAcQCDAHYAgwBzADMAbgAzAHAAMwByADMA1wAzAD0BMwDUAQYA0AEAAH4APADjADwASQE8AHgA +SQDdAEkAQwFJAH8AWgDkAFoASgFaAKoAPwCrAAEADwE/ABABAQB1AT8AdgEBAHkAagDeAGoARAFq +AKgAAAANAQAAcwEAAKYANwCnAAEACwE3AAwBAQBxATcAcgEBAAQACACcAcwAnQHMAJ4BzACfAcwA +1QHMANYBzADXAcwAtABHABkBRwCAAUcAkAAiAPUAIgBbASIAoQCIAAYBiABsAYgAlAAAAJUAAACY +AMAAmQCgAJYAkACXAAAAlAABAJUAAQCYAMAAmQCgAJYAkACXAAAAlAACAJUAAwCYAMAAmQCgAJYA +kACXAAAAlAADAJUABwCYAMAAmQCgAJYAkACXAAAA+gAAAPkAAAACAZAAAwHTAAABgwD+ABMA/AAz +AP0AdwD6AAEA+QABAAIBkAADAdMAAAGDAP4AEwD8ADMA/QB3APoAAgD5AAMAAgGQAAMB0wAAAYMA +/gATAPwAMwD9AHcA+gADAPkABwACAZIAAwHTAAABgwD+ABMA/AAzAP0AdwBfAQAAYQEAAGgBkABp +AdMAZgGDAGQBEwBiATMAYwF3AF8BAQBhAQEAaAGQAGkB0wBmAYMAZAETAGIBMwBjAXcAXwECAGEB +AwBoAZAAaQHTAGYBgwBkARMAYgEzAGMBdwBfAQMAYQEHAGgBkABpAdMAZgGDAGQBEwBiATMAYwF3 +AIUAAACGAAAAhwBQAIgAAACJAKAAigAAAIsA0ACMAAAAhQABAIYAAQCHAFAAiAAAAIkAoACKAAAA +iwDQAIwAAACFAAIAhgADAIcAUACIAAAAiQCgAIoAAACLANAAjAAAAIUAAwCGAAcAhwBQAIgAAACJ +AKAAigAAAIsA0ACMAAAA6wAAAOoAAADsAFAA7QAAAO4AoADvAAAA8ADQAPEAAADrAAEA6gABAOwA +UADtAAAA7gCgAO8AAADwANAA8QAAAOsAAgDqAAMA7ABQAO0AAADuAKAA7wAAAPAA0ADxAAAA6wAD +AOoABwDsAFAA7QAAAO4AoADvAAAA8ADQAPEAAABRAQAAUAEAAFIBUABTAQAAVAGgAFUBAABWAdAA +VwEAAFEBAQBQAQEAUgFQAFMBAABUAaAAVQEAAFYB0ABXAQAAUQECAFABAwBSAVAAUwEAAFQBoABV +AQAAVgHQAFcBAABRAQMAUAEHAFIBUABTAQAAVAGgAFUBAABWAdAAVwEAAPv/AAD//wAAuQHfALEA +GwAWARsAfAEbAK8AGwAUARsAegEbAGwAoADRAKAANwGgAG8AgwBxAIMAdgCDAHMAMwBuADMAcAAz +AHIAMwDXADMAPQEzANQBBgDQAQAAfgA8AOMAPABJATwAeABJAN0ASQBDAUkAfwBaAOQAWgBKAVoA +qgA/AKsAAQAPAT8AEAEBAHUBPwB2AQEAeQBqAN4AagBEAWoAqAAAAA0BAABzAQAApgA3AKcAAQAL +ATcADAEBAHEBNwByAQEABAAIAJwBzACdAcwAngHMAJ8BiADVAcwA1gHMANcBzAC0AEcAGQFHAIAB +RwCQACIA9QAiAFsBIgChAIgABgGIAGwBiAD6AAAA+QAAAAIBlwADAdAAAAGNAP4AEQD8ADMA/QB3 +APoAAQD5AAEAAgGXAAMB0AAAAY0A/gARAPwAMwD9AHcA+gACAPkAAwACAZcAAwHQAAABjQD+ABEA +/AAzAP0AdwD6AAMA+QAHAAIBlwADAdAAAAGNAP4AEQD8ADMA/QB3AF8BAABhAQAAaAGXAGkB0ABm +AY0AZAERAGIBMwBjAXcAXwEBAGEBAQBoAZcAaQHQAGYBjQBkAREAYgEzAGMBdwBfAQIAYQEDAGgB +lwBpAdAAZgGNAGQBEQBiATMAYwF3AF8BAwBhAQcAaAGXAGkB0ABmAY0AZAERAGIBMwBjAXcA6wAA +AOoAAADsAFUA7QAAAO4AqgDvAAAA8ADdAPEAAADrAAEA6gABAOwAVQDtAAAA7gCqAO8AAADwAN0A +8QAAAOsAAgDqAAMA7ABVAO0AAADuAKoA7wAAAPAA3QDxAAAA6wADAOoABwDsAFUA7QAAAO4AqgDv +AAAA8ADdAPEAAABRAQAAUAEAAFIBVQBTAQAAVAGqAFUBAABWAd0AVwEAAFEBAQBQAQEAUgFVAFMB +AABUAaoAVQEAAFYB3QBXAQAAUQECAFABAwBSAVUAUwEAAFQBqgBVAQAAVgHdAFcBAABRAQMAUAEH +AFIBVQBTAQAAVAGqAFUBAABWAd0AVwEAAPv/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAcswEAINQBAPScgABABQAAAAAAAByzAQBItAEANKKAAPgBAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAD42AEA/NYBACykgABUAAAAAAAAAByzAQAs1wEArKSAAFABAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAEAAAAcswEAQNMBAEA/gABQAQAAAAAAAByzAQBY1QEA8AaAAAIAAAAAAAAA +HLMBALDVAQD0BoAABAAAAAAAAAD02AEASLQBAICkgAAqAAAAAAAAAByzAQBM1gEAAAAAAAAAAAAA +AAAAHLMBAAzWAQD4BoAABAAAAAAAAAAAAAAAAAAAAAEAAgACAAMABAAEAAUABgAGAAcACAAIAAkA +CgAKAAsADAAMAA0ADgAOAA8AJgAnACgAKAApACoARgBGAEcASABIAEkASgBKAEsATABoAGkAagBq +AGsAbABsAG0AbgBuAG8AcABwAHEAcgByAHMAdAB0AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA +dQB1AHUAdQB1AHUADwA/AAAAAAAAAAAAAAAAAAAAAQACAAIAAwAEAAQABQAGAAYABwAIAAgACQAK +AAoACwAkACQAJQAmACYAJwBEAEQARQBGAEYARwBIAEgASQBKAEoASwBMAEwATQBqAGoAawBsAGwA +bQBuAG4AbwBwAHAAcQByAHIAcwB0AHQAdQB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2 +AHYAdgB2AHYADgA/AESmAQAS0gAAAAAAAP//DwBwwgEAtgAAAAAAAAD/AAAAcMIBALcAAAAAAAAA +/wAAAHDCAQC4AAAAAAAAAP8AAABwwgEAuQAAAAAAAAD/AAAAcMIBALoAAAAAAAAA/wAAAHDCAQC7 +AAAAAAAAAP8AAABwwgEAvQAAAAAAAAD/AAAAcMIBAL4AAAAAAAAA/wAAAHDCAQC/AAAAAAAAAP8A +AABwwgEAwAAAAAAAAAD/AAAAcMIBAMEAAAAAAAAA/wAAAHDCAQDCAAAAAAAAAP8AAABEpgEAE9IA +AAAAAAD//w8AcMIBABsBAAAAAAAA/wAAAHDCAQAcAQAAAAAAAP8AAABwwgEAHQEAAAAAAAD/AAAA +cMIBAB4BAAAAAAAA/wAAAHDCAQAfAQAAAAAAAP8AAABwwgEAIAEAAAAAAAD/AAAAcMIBACIBAAAA +AAAA/wAAAHDCAQAjAQAAAAAAAP8AAABwwgEAJAEAAAAAAAD/AAAAcMIBACUBAAAAAAAA/wAAAHDC +AQAmAQAAAAAAAP8AAABwwgEAJwEAAAAAAAD/AAAARKYBABTSAAAAAAAA//8PAHDCAQCCAQAAAAAA +AP8AAABwwgEAgwEAAAAAAAD/AAAAcMIBAIQBAAAAAAAA/wAAAHDCAQCFAQAAAAAAAP8AAABwwgEA +hgEAAAAAAAD/AAAAcMIBAIcBAAAAAAAA/wAAAHDCAQCJAQAAAAAAAP8AAABwwgEAigEAAAAAAAD/ +AAAAcMIBAIsBAAAAAAAA/wAAAHDCAQCMAQAAAAAAAP8AAABwwgEAjQEAAAAAAAD/AAAAcMIBAI4B +AAAAAAAA/wAAAESmAQAI0gAAAAAAAP//AwCEpgEAAIIAAAAAAAD/AQAAhKYBAAGCAAAAAAAA/wEA +AESmAQAJ0gAAAAAAAP//AwCEpgEAAoIAAAAAAAD/AQAAhKYBAAOCAAAAAAAA/wEAAESmAQAK0gAA +AAAAAP//AwCEpgEABIIAAAAAAAD/AQAAhKYBAAWCAAAAAAAA/wEAAESmAQAG0gAAAAAAAP8BAABE +pgEAB9IAAAAAAAD/AwAARKYBAAbSAAAJAAAAAP4DAESmAQAH0gAACgAAAAD8DwBEpgEABtIAABIA +AAAAAPwHRKYBAAfSAAAUAAAAAADwP0SmAQAV0gAAAAAAAP8DAABEpgEADNIAAAAAAAD/AQAARKYB +ABXSAAAKAAAAAPwPAESmAQAM0gAACQAAAAD+AwBEpgEAFdIAABQAAAAAAPA/RKYBAAzSAAASAAAA +AAD8BzCAAACqqqqqMYAAAKqqqqoygAAAAKqqqjOAAAAAAAAANIAAAAAAAAA1gAAAAAAAADaAAAAA +AAAAN4AAAAAAAAA4gAAAAAAAADmAAAAAAAAAOoAAAAAAAAA7gAAAAAAAADyAAAAAAAAAPYAAAKqq +CgA+gAAAqqqqqj+AAACqqqqqQIAAAAAAAAAwgAAAqqqqqjGAAACqqqqqMoAAAACqqqozgAAAAAAA +ADSAAAAAAAAANYAAAAAAAAA2gAAAAAAAADeAAAAAAAAAOIAAAAAAAAA5gAAAAAAAADqAAAAAAAAA +O4AAAAAAAAA8gAAAAAAAAD2AAACqqgoAPoAAAKqqqqo/gAAAqqqqqkCAAAAAAAAAMIAAAAAAAAAx +gAAAAAAAADKAAAAAAAAAM4AAAAAAAAA0gAAAqqqqqjWAAACqqqqqNoAAAAAAAAA3gAAAAAAAADiA +AAAAAAAAOYAAAAAAAAA6gAAAqqqqCjuAAACqqqqqPIAAAAAAAAA9gAAAAAAAAD6AAAAAAAAAP4AA +AAAAAABAgAAAAAAAADCAAAAAAAAAMYAAAAAAAAAygAAAAAAAADOAAAAAAAAANIAAAKqqqqo1gAAA +qqqqqjaAAAAAAAAAN4AAAAAAAAA4gAAAAAAAADmAAAAAAAAAOoAAAKqqqgo7gAAAqqqqqjyAAAAA +AAAAPYAAAAAAAAA+gAAAAAAAAD+AAAAAAAAAQIAAAAAAAABEBYAAkJKAABgAAABQkoAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAsPMBAAYAAACULYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAABEBYAAkJKAABgAAABQkoAAAAAAAAAAAAAAAAAAAAAAAAAAAABU +/wEABgAAAJQtgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAEQFgACQkoAAGAAAAFCSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAKALAgAEAAAAlC2A +AAAAAAAAAAAAAAAAAHAKAgAEAAAAlC2AAAAAAAAAAAAAAAAAAGgMAgAGAAAAlC2AAAAAAAAAAAAA +AAAAAHAKAgAEAAAAlC2AAAAAAAAAAAAAAAAAAKALAgAEAAAAlC2AAAAAAAAAAAAAAAAAAHAKAgAE +AAAAlC2AAAAAAAAAAAAAAAAAAKALAgAEAAAAlC2AAAAAAAAAAAAAAAAAAHAKAgAEAAAAlC2AAAAA +AAAAAAAAAAAAAGgMAgAGAAAAlC2AAAAAAAAAAAAAAAAAAHAKAgAEAAAAlC2AAAAAAAAAAAAAAAAA +AKALAgAEAAAAlC2AAAAAAAAAAAAAAAAAAGgMAgAGAAAAlC2AAAAAAAAAAAAAAAAAAKALAgAEAAAA +lC2AAAAAAAAAAAAAAAAAAKALAgAEAAAAlC2AAAAAAAAAAAAAAAAAAGgMAgAGAAAAlC2AAEQFgACQ +koAAGAAAAFCSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAFAUAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAwQEBAQEBQYH +CAgICAgJCgsMDQAAAAUGBwgNDg8QFRYXGBkAAAoNERQKDREUGRkZGQoKAAAAAAAABgYGBgkJCQkA +BgAAbjtoO2I7XDtuOmg6YjpcOm45aDliOVw5bitoK2IrXCtuKmgqYipcKm4paCliKVwpbhtoG2Ib +XBtuGmgaYhpcGm4ZaBliGVwZbhhoGGIYXBhuF2gXYhdcF24WaBZiFlwWbhVoFWIVXBVuFGgUYhRc +FG4TaBNiE1wTbhJoEmISXBJuEWgRYhFcEW4QaBBiEFwQVxBSEE0QSRBuAWgBYgFcAW4AaABiAFwA +bjtoO2I7XDtuOmg6YjpcOm45aDliOVw5bjhoOGI4XDhuN2g3YjdcN24paCliKVwpbihoKGIoXChu +J2gnYidcJ24ZaBliGVwZbhhoGGIYXBhuF2gXYhdcF24JaAliCVwJbghoCGIIXAhuB2gHYgdcB24G +aAZiBlwGbgVoBWIFXAVuBGgEYgRcBG4DaANiA1wDbgJoAmICXAJuAWgBYgFcAW4AaABiAFwAAAAA +AAAAAAAAAAAALCwCAAgAAADULYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/////////wAB//8CA////wT//////////////////////wX/Bv8H/wj/Cf8K/wv/ +DP///w3///8O////D////xD//////////////////////////////////////////////xH///8S +////E////xT///8V////Fv///xf///8Y////Gf///xr///8b/////xz///8d////Hv///x////8g +////If//////////////////////IiMk/yUmJ///KP///yn///////////////////////////// +/////////////////////////////////////////////////wEEAAACBQEAAwYCAAQHAwAFCAQA +BgkFAAcKBgAICwcACQwIAAoNCQALDgoADA8LAA0QDAAOEQ0AAUAABAJBAQQDQgIEBEMDBAVEBAQG +RQUEB0YGBAhHBwQJSAgEtxMiALgUIwC5FSQAuxYlALwXJgC9GCcAwBkoAMQaKQAHGwAACBwBAAsd +AgAMHgMAEB8EACIhBQAkIgYAJiMHACgkCAAqJQkALCYKAC4nCwAwKAwANCkNADgqDgA8Kw8AQCwQ +AGQuEQBoLxIAbDATAHAxFAB0MhUAeDMWAHw0FwCANRgAhDYZAIg3GgCMOBsAkTocAJU7HQCZPB4A +nT0fAKE+IAClPyEAJEkGAixKCgI0Sw0BPEwPAWRNEQFsThMBdE8VAXxQFwGEURkBlVIdAZ1THwEA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQYCBgYGAwYGBgYGBgYEAAAAAAPAD8AAQAA +AA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/AAEAAAAPAD8AAgAAAA8APwABAAAA +AAAAAAEAAAACAAAAAwAAAAAAAAAEAAAAAgAAAAUAAAAPFBkeKAoFALAJAaUAPDg0MCwoJCAcGBQQ +DAgEAAwIBAA8ODQwLCgkIBwYFBAMCAQCCAAOAAAADgEBAAECAQEBAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAClxoT4me6N9g3/vdax3lSRUGADAqnOfVYZ52K1 +5k2a7EWPnR9AiYf6Fe/rssmOC/vsQWez/V/qRb8j91OW5FubwnUc4a49akxabEF+AvVPg1xo9FE0 +0Qj5k+Jzq1NiPyoMCFKVZUZenSgwoTcPCrUvCQ42JJsbPd8mzWlOzX+f6hsSnh10WC40LTay3O60 ++1v2pE12YbfOfXtSPt1xXpcT9aZouQAALMFgQB/jyHnttr7URo3ZZ0ty3pTUmOiwSoVruyrF5U8W +7cWG15pVZpQRz4oQ6QYEgf7woER4uiXjS/Oi/l3AgIoFrT+8IUhwBPHfY8F3da9jQjAgGuUO/W2/ +TIEUGDUmL8PhvqI1zIg5LleT8lWC/Ed6rMjnuisyleagwJgZ0Z5/o2ZEflSrO4MLyowpx9NrPCh5 +p+K8HRZ2rTvbVmROdB4U25IKDGxI5Lhdn26970OmxKg5pDE304vyMtVDi1lut9qMAWSx0pzgSbTY ++qwH8yXPr8qO9OlHGBDVb4jwb0pyXCQ48VfHc1GXI8t8oZzoIT7dltxhhg2FD5DgQnzEcarM2JAF +BgH3Ehyjwl9q+a7QaZEXWJknOrknONkT67MrMyK70nCpiQenM7YtIjySFSDJSYf/qnhQeqWPA/hZ +gAkXGtplMdfGhLjQw4KwKXdaER7Le/yo1m06LAEBAQEBAQEBAgICAgICAgIDAwMDAwMDAwQEBAQE +BAQEAQICAgICAgMDAwMDAwMDAwMDAwMDBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAEBAgEC +AgN//wcPHz8BAwEDDwcBBw8fP3///wUABwIDBAYGdNFFF+iiiy4NDwUHCQsBAwoUN25VVVUBS2gv +AVVVVQXjOI4DqqqqAnEcxwGqqqoKx3EcBw8PDwcGBwIDBAUAAQgJCwooACgAMAAsACwAKAA8ADQA +KAAoADQAMAAsACwARAA8AEAAPACMAGwAWABIAPQAsAAsACwAPAA0ADAALABUAEQAVABUAGwAYABc +AFQAjAB4ADoBAgHVAN8A2gCiAHUAfwBqARoB2QDoAAoBugB5AIgAigUqAzkBqAGKBcoC2QBIAcoB +SgHiAPkAygHqAIIAmQD0AkQCtQHVAZQChAH1AEECrACQAIQAgAB4AHgAeAB0AGbmAACd2ImdTuzE +TjRIgzQndmInGqRBGhM7sRMRGIERD/zAD07sxE4ndmInGqRBGhM7sRMN0iANiZ3YCQiMwAgHfuAH +NEiDNBqkQRoRGIERDdIgDQiMwAgGaZAGsLLVBQVUQAUndmInEzuxEw3SIA2JndgJBmmQBsRO7AQE +RmAEAz/wA6qqqqoapEEaEzuxEw/8wA8RGIERDdIgDQqogAoTO7ETD/zADw/8wA8N0iANC7RACwu0 +QAuJndgJDdIgDQqogAoKqIAKCIzACAd4gAcHeIAHBmmQBg/8wA8N0iANC7RACw3SIA0LtEALiZ3Y +CQiMwAiJndgJCIzACAd+4AcHfuAHwSwpBwqogAoIjMAIB3iABwiMwAgHeIAHBmmQBrCy1QUGaZAG +sLLVBQVUQAUFVEAF1h3GBEADgAbACQANgBMAGkAdgCCABgANgBMAGgAnADSAOgBBwAmAE0AdACeA +OgBOwFeAYZkDMwfZCnMOphXmHIAgGSQzB3MOphXmHFkrzDkAQTNI2QqmFYAgWSsAQaZWgGFZbDAA +AAA2AAAADAAAABIAAAAYAAAAJAAAAAYAAAAJAAAAAAAAAAAAAAAYIBQUDg4UFAUGAQIDBAAAAAEB +AgECAgMEDAwIBAwEBEAAAACAAAAAAAEAAAACAABAAAAAAAQAAEAAAABAAAAAEBESExQVFhcYGRob +HB0eHyAhIiMkJSYnKCkqKywtLi9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNk +ZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/MxMAAAAHBw8HDw8XLQAPIADwYQAAAAAAAAAAAAAB +AgQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAADA5OjUyOjE5AAAAAE8usABqsKKwkrBjAAGtrXsArZOcra1gAAkAAAACAAAAAAAA +AAAAAAAJAAAAAgAAAAAAAAAAAAAACQAAAAMAAAABAAAACQAAAAkAAAACAAAAAgAAAAkAAAABAgEC +AwQAAAUGBwgJCgAAAAUGAAIEAAUAAAAAAAUHAQMEAAUBAAAAQCNAJSEhISFAQEBAQAUEBAEBQEBA +QAUFQEAMDEANDAwBAQEFQEAFBQAEAARAQAAEQEBABUBAQEBABUBAQAUFBQEBAQFABQUFAQUBAUAF +BQVABUAFBQUFBQQAAAAcEQAAHDIAABwzAAAEAAAAHBUAAAIAFwBsAHAEdAh0DAAEBAYAAAAAAAAA +AGQAAAAAkAEACgAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAABAAAAAAAAAA +AQAAAAEAAAAAAAAA/wAAAP8AAAAAAAAAAAAAALx8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAEAAAAFAAAAAAQAAGQAAABQgwEAWIMBAGCDAQC4gwEAwIMBAMiDAQAHBwcHBwcH +BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcGBgYGBgUF +BQUFBAQEBAQDAwMDAwICAgICAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAolQ8BOfJgABxctYDQAAAAEDgkdLTcAAAQOCR0sOwABEAAB +AAAAAoAAAUIGAhAAAiAAAAPAAAFDBgMQAALAAAADwAABQwYEEAACQAAAAoAAAUQGBREAAEAAAAPA +AAFFBgYRAADgAAADwAABRQYHEQABAAAAAoAAAUYGCBEAAiAAAAPAAAFHBgkRAALAAAADwAABRwYK +EQACQAAAAoAAAUgGCxIAAEAAAAPAAAFJBgwSAADgAAADwAABSQYNEgABAAAAAoAAAUoGDhIAAgAA +AAKAAAFMBgAAIhYAAIAAAAMAAAFZACQWAAEAAAADAAABWgAmFgACAAAABAAAAVoAKBYAAgAAAAMA +AAFbACoWAAKAAAADAAABXAAsFwAAAAAABAAAAVwALhcAAIAAAAMAAAFdADAXAAEAAAADAAABXgA0 +FwACAAAAAwAAAV8ANhcAAoAAAAMAAAFgADgYAAAAAAAEAAABYAA8GAABAAAAAwAAAWIAPhgAAgAA +AAQAAAFiAEAYAAIAAAADAAABYwBkGwACAAAAAwAAAW8BZhsAAoAAAAMAAAFwAWgcAAAAAAAEAAAB +cAFsHAABAAAAAwAAAXIBbhwAAgAAAAQAAAFyAXAcAAIAAAADAAABcwJ0HQAAAAAABAAAAXQCdh0A +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIIAPAABAAGkgAABpIEAAaSAAAGkgQAAgIIAPAADo +AGkgAABpIEAAaSAAAGkgQAAgIIAPAABkBmkgAABpIEAAaSAAAEogAABKIQAASiIAAEojAABKJAAA +SiUAAEomAABKJwAASiAAEEohABBKIgAQSiMAEEokABBKJQAQSiYAEEonABBKIAAgSiEAIEoiACBK +IwAgSiQAIEolACBKJgAgSicAIEogADBKIQAwCiSAP4EAAEBBLJwwQCycMEIkHDQKIoA/gAA4cwoj +ADfmDwAASiYAcGkgQABKJgBwSiYAcEomAHBKJgBwABYAcIAAZARAeCAgQIcAAAAAAAAAAAAA4cDh +weHCz3CgAMgfFhABhs9ygACYhyCiEhABhiGiExABhiKiFBABhiOiFRABhiSiJBABhiaiz3GfALj/ +VqGKIf8PEhhYgBMYWIAUGFiAFRhYgCQYWIDBwsHBwcAgIECHDMjPcqAAyB8OGhiADcgPGhiADsgQ +GhiADxIBNgHIJHgRGhiAEMgtGhiA4H7hxPwcyL78HEi+4cDhweHC4cP8HAix/BxIsfwciLH8HMix +/BwIsvwcSLL8HIiy/BzIsvwcCL9qJIAQ4cRqJMAQ4cTxwM9woADQGxSAz3GAAGAEBCCAj89RBOEA +oQryLykBAM9wgAA0D/AgQABAeNr/0cDBxGskwBDBxGskgBDBxJ90BBQLNAQUCjQEFAk0BBQINAQU +BzQEFAY0BBQFNAQUBDTBw8HCwcHBwMHERSx+EAomQH7BxGskgBTBxCAgQIcMyIe4DBoYMA3Im7gN +GhgwDsgOGhgwD8iHuA8aGDAQyBAaGDDgfuB48cAMyJW4DBoYMA3Im7gNGhgwD8iKuI24kLgPGhgw +z3CAAGwQGIgbCFEAD8jPcQAAiAysuA8aGDA+DiAAD9hn2IYKIAGKIQYK0cDgfvHAz3CAALy1AICG +IP6BCfQPyAUggA8AAADUDxoYMKH/iiBVBVYKIAGKIUYO6PHgeM9xAwBADc9woACoIC2gz3GAAIwE +QIEBagChz3CgADguBYAEIIAPwAAAAB0IgA/AAAAASNjPcZ8AuP8aoVuhadgYuBmhz3CAAMgJJYAj +gSCBx3EAAIgT5QLACeB4z3CAAMgJeQLACeB48cBuCwABz3eAAGAEiHUG6A0IUQAB2APwANgLrwXp +DwlRAAHYAvAA2AqvBuoNClEAAdgD8ADYDK8A2M92oADIHxgeGJALj4ohEAAO6AiPDOjPcAMAQA1F +HhgQMKYC2BgeGJAD8DGmCo8Y6AmPFujPcAIApkEgHhiQz3CAACgAIR4YkM9wgABcBCIeGJAYFgCW +RSAAAxgeGJAMjwjoGBYAloUgAQQYHhiQDwtRABgWAJaIuBgeGJDPcIAAMHwAkI7gzCCiggb0GBYA +loC4GB4YkBjtANiUuM91gACABAClcdgGuMYMIAH82SCFz3AAAEwctgwgAZ+5GBYAloW4GB4YkNUC +AAHPcaqqu7vPcJ8AuP82oDagNqA2oM9xoADIOw6BiLgOoWkgQAD+8eB48cClwUHAQsEMHAAxEBxA +Mc9xgAB8dDQZwA8wGQAPLBnADigZgA4kGUAOz3CAAHx0IBhAC89wgAB8dBwYAAvPcIAAfHQYGMAK +z3CAAHx0FBiACs9wgAB8dBAYwAjPcIAAfHQMGIAIz3CAAHx0CBhACM9xgAAAdIAZAAh8GcAHeBmA +B3QZQAdwGQAHbBkAB2gZgAZkGUAGYBkABlwZwAVYGYAFVBlABVAZAAVMGcAESBmABEQZQARAGQAE +76HOoa2hjKEsGcACKBmAAiQZQAIgGQACHBnAARgZgAEUGUABEBkAAWOhaiAAA9gZAABqIMAC1BkA +AGoggALQGQAAaiBAAcgZAABqIAABxBkAAGogwADAGQAAaiCAALwZAABqIEAAuBkAAGogAAC0GQAA +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 +GYYUHQARDKWgFgAQZKUNpaQWABAMHUASDqWoFgAQCB2AEg+lz3ABALAJEKUuCWAAKNgRpSYJYAAA +2BKlUyfAdROlAshUHQAXFqUSFgCWUB0AFxelExYAls9ygAAQERilFBYAlkokQHkZpRUWAJYA2Rql +JBYAlhulFhYAlhylz3CAAOANEIAdpc9wgAAQEXgYgArPcIAAEBF8GMAKz3CAAIwRBBgAC4QaQAvP +cKAAyBwIgIgaAADPcIAAgAUAgIwaAACoIIAC8CJDAM9wnwC4/wHhdqCZAAAA/ByItvwcSLb8HAi2 +/BzItfwciLX8HEi1/BwItfwcyLT8HIi0/BxItPwcCLT8HMiz/ByIs/wcSLPgfuB4BNw43TXw4HgE +3DTdM/DgeATcMN0x8OB4BNws3S/w4HgE3CjdLfDgeATcJN0r8OB4BNwg3Snw4HgE3BzdJ/DgeATc +GN0l8OB4BNwU3SPw4HgE3BDdIfDgeATcDN0f8OB4BNwI3Rzw4HgE3ATdGfA0FBowMBQZMCwUGDAo +FBcwJBQWMCAUFTAcFBQwGBQTMBQUEjAQFBEwDBQQMALHAcawJE0zsCQfM+B+8cDPcYAA4A0QoeB4 +4HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeNHA4H7geOHF4cZA +KQ0CJX1ALQMUpXslCjQCCHVTJX6QBvIBHVIQYbr78UEqjgDBukImTpAEHdAQ/fUJ6i8kiXDgeKgg +QAEBHVIQ4HjBxuB/wcUocgDZ2PHgePHAsg7P/6HBCHfPdqAArC8ZhgQggA9wAAAA13AgAAAAAdjA +eC8mB/AodRpyE/SKIEkG+gzv/4ohTQQ5hu4M7/+KIAkGiiAJBuIM7/+pcQDYJPARzAAcRDNPIMED +AeAQeAQggA8AAP+/j7gCHEQwERocMN4JoA9AJwASB+cEJ48fAAD8/wUnABSduJ+47HEAoQDB7HAg +oAHYfQbv/6HA4HgiuQbw7HJgogTgYbn5CbWAYIAA2c9woADUC22gz3CgAEQdNaDgfuB48cDyDc// +CHYodShwSHFocsr/geDKIIEDwA/h/8ohQQM9Bs//4cXPcoAAsASkis9ynwC4/wXtz3PQuv7KfqIa +ojuiDu3PcKAAOC4FgAQggA/AAAAA8QiAj8AAAABp2Bi4GaLgf8HF4HjxwIYNz/8Id89xgACwBAWJ +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 +HgLPcIAAAGAyIEACDwiSAM9wpgDo/w2AA/AA2AamBaYA2EokgHAG2o26qCBAAynbErvwI48AQCYD +HxV7AeLgowHgAJE4HgARVSZBFBq2z3CAAGCXBgyv/gjaGxUAls9xpQDYyxmmHBUAlhqmHRUAlhum +DoEcpg+BHaYmFQCWHqbPcKQAkH8cgAUHb/4fpuB48cCGDm/+ANvPcaAAyB9AEQAGz3egANAPGRcA +ls9yoADEJ08SDoa4gc9wgAD4tKigEczPdYAAFJELDgAQH4ULCJ4AAd4E8BEanDNodlISEIYVEhOG +G9gWGhiAEQvfIFEgQKBKIgAgB/QdhQHeWnaEuB2lDQseIVQVgBAE6ADYBvAdhYW4HaUB2DpwTCIA +oMwhIaBY8s9ynwC4/1gaAAgQh89wgADAEA+IFqIA2s9woAD8RJ66QaBloB6FsLgepagVABBk4B6h +ENgOoQHYFRkYgLYJr/4J2BcIX0fPcYAA4A0LgQHgUg9gAguhvgpAAhsJECDPcYAARH0FgQHgegtg +AgWhOQIAAM91gAAUkccKECAdhYS4HaXPcIAARH0RC94gIoAB4SKgiiCFCQfwIYAB4SGgiiDFCNYL +T/7aDkACS/BCEgCGBCC+jwDAAABD8gG1HoV7CN4EiiCEDrILb/6KIRADJgiABwCVhiD8AIwgAoAx +9IoOQAev6APYEh8YkOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeOB44HjgeOB44HjgeOB44HgSHxiQE8wRGhwwBfAAla4LoAg0lawVARAI6ZcVgBAAqQDYrB0A +EFQVgBAh6M92oAD8JTSGAdrPc4AARH0GgzhgBqMF6c9xgACZCUCpU4Yng1lhJ6M+hQHenwgQAJsJ +3gEB2c9wgACEBSCgRfAhCB4gAdnPcIAAmQkgqM9xgABEfQOBAeADoT6F6/ED2c9woADUCzGg4Hjg +eOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB44HjgeOB4 +4HjgeDGgE8wRGhwwGQoRIB2Fz3GAAER9grgdpQSBAeAEoQHeHoUXCB4ElRWAEKQVARCpcg4P4AIB +2wPwdgpAAx+FDwgeAM9wgADgl44OgATPd4AACJ0ZhwbougoABADYGaeGCUACz3CAAGwQCIAjCN4C +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 +HgmgAItxgsZqcBYJoADJcUpwDgmgAITBqXAGCaAAhsGIxelw+gigAKlxKnDyCKAAisEKcOoIoACM +walwisFOCaAAkMKLcMlxQgmgAJLCyXCEwToJoACUwobAqXEuCaAAlsKYxpDAksHCCKAAyXKax5TA +lsG2CKAA6XLJcOlxDgmgAJzCnMCeweIIoACOwp/FhgigAARtjsCWCaAAJG23CBAAhsCKwaYIoABA +JQITi3CEwZoIoABAJQIVlMBAJQETagigAMlykMBAJQEVXgigAOlyyXDpcbYIoACcwozAnMFKCKAA +yXLCCKAAyXDJcI7BegigAEAlAheSwEAlARMuCKAAyXKWwEAlARUiCKAA6XLJcOlxdgigAJzCjMCc +wQ4IoADJcslwjsFCCKAAQCUCGTYIoABAJQAXz3GAAPwHGKEmCKAAQCUAGc9xgAD8BxmhB/AA2c9w +gAD8BzigOaCZAi/ygCQCOuB48cBSCi/yCtqqwQh2dg8v8otxBtguCmAAAcEI2CYKYAABwQnYHgpg +AAHBEBQEMMlwAMECwgolgA+t3u++og1gAAPDyXBd/38I0ADPdYAA/AcchRgUBDASpR2FAMEKJYAP +rd7vvgLCFaXJcHYNYAAFw8lwUv9PCNAAHIUgFAQwE6UdhQDBCiWAD63e774CwhalyXBODWAAB8PJ +cEj/JwjQAHyFdBUGEMlwVBUEEFgVBRB0pSQUBzAyhVwdgBFThW3/ANj9AS/yqsDxwG4JL/IM2Lpx +OnLPd4AA/AeEFxMQfBcQEADdmnDPcIAADE3wIFIDanDSC6/6SnECcBN4xguv+oohDwoIdogXABC6 +C6/6SnGAFwEQOGATeKoLr/qKIQ8KumVUekAtwSA2eVlhx3GAAEywDQkRIMSpBakJ8AsJUSDGqQep +A/DIqQmpQiRAIJkIdYAB5TEBL/IA2OB48cDKCA/yp8G6cADfRsdKJ8AgSiSAIUojwCRKIIA1z3aA +APwH66bpcVp3gOHKIoEvAAAI0sojISXKIOE1yifhJMokoSWB4coigS8AAAnSyiMhJcog4TXKJ2El +yiQhJoLhyiKBLwAACtIT2cojQSDKIKEFyiABMMokASDKJ0EgANkH2EXAz3WAABxMNX0AhdpxAdmO +4MIhTgAqpoDhyiHBJcohwiSA4cogASXKIAImogtAAM9xgAA4TMlwA9oKCmAAAtsKhiuGCtqt/s9w +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 +AQQOGkQBTCWAhMohwg/KIsIHyiBiAcojgg8AAHMA6ANi78okIgAA2gfwABYAQRQhjAAAtAHiLyBC +AfMKAoBSCo/w0cDgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4z3CAADwJ +4H8AgOB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7g +eOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB4 +4H7geOB+4HjgfuB44H7geOB+4HjgfuB44H8B2OB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4Hjg +fuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjgfwHY8cDPcIAA +RL56Ca/wA9kyCY/w0cDgfuB4AtjPcaAAwB0NoSHYBqEB2Aeh4H4A2c9woADAHSegJqAtoOB+z3GA +AEQJDQhRAAHYAKkBqQCJgeDKIIEPAADECcoggg8AAIAA4H8BoQDYz3KAAEQJAaoAqs9xgAAwfAaJ +COgHiQboAJEJCJEDAdgAqgDY2vHxwOHFCHXPcIAAwBABiCsIUQAH8IIIT+8KDW/wT9jPcKAA1AsY +gADZQiAACIDgyiBMAOUIRIOtBE/w4HjgfuB44H7geOB+4HjgfuB44H7geOB+4HjxwAohwA/rcgXY +JttKJAAAxQFv7wolAAHxwAohwA/rcgXYK9tKJAAArQFv7wolAAHPcAIAKBvPcYAATAkAoc9wAgAk +GwGhz3ACACwbAqHPcAIAMBvgfwOhz3ACAKgaz3GAAEwJAKEBoQKhz3ACAKwa4H8DoeB+4HjgfuB4 +4H7geOB+4HjxwJYLb/Bq2KLBi3EB2sII4ABIc43oCiHAD+tyBdiKI88LiiSBCi0Bb+9KJQAAgcFE +2AHamgjgAEhzjugKIcAP63IF2IojzwyKJAEBBQFv70olAAAEFAAxXwiCDwAAMgRAJIEwa9gB2mYI +4ABIc47oCiHAD+tyBdiKI88PiiTBCtEAb+9KJQAAAhQAMc92gABcCRt4QSjFAEwlAIoEHkAR0fYK +IcAP63IF2Ioj0AClAG/viiTBCh3Yz3aAAFwJAaa4cAAUADHPdYAAXL5ALYIAqXH+D6AAAduN6AAU +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 +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAMAAADImoAAAAAAAAAAAABAn4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAD/ +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiKSAAOSZAQAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AQAAAAAA +AAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAEBAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAABAAIAAAAAAAAABwAAAAcAAAAHAAAAAgAAAAIAAACDAAAAkgAAAOgA +AAD3AAAATgEAAF0BAAAAAAEAAgAAAAYACAAJAAAABwAAAAAAAAACAAAAAgAAAIMAAACSAAAA6AAA +APcAAABOAQAAXQEAAAAAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQACAAAAgwAAAJIAAADo +AAAA9wAAAE4BAABdAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMiagAD8/wEAAAAAAMiagACgBgIAAAAAAAAAAADI +moAAOAgCAAAAAAAAAAAAAAAAAMiagAAAAAAAAAAAAAEADwBkAAEAHAmAAAAAAAAAAAAABwAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAKgaAgCoGgIAqBoCAKwaAgAAAAAAHQAA +AAAAAAAAAAAAAAAAAAAAAAB/fwABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIECAAIECAAAAAA +AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACs +CAAAFQAAAAwvgACAKgAAgCoAAIAqAAC8QAAAgCoAAIAqAABAPAAAgCoAAIAqAACAKgAAgCoAAIAq +AACAKgAAgCoAAIAqAACAKgAAIB4AAMgfAADgHwAATCEAAMwhAABQIQAAgCoAAIAqAAAETQAAxE4A +AKxPAACAKgAAgCoAAIAqAACISwAA7GEAAOhhAABAYgAAgCoAAIAqAACAKgAAyEIAAIAqAAAkYgAA +gCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAADAQAAAgCoAAIAqAACAKgAAgCoAAIAqAACA +KgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAq +AACAKgAAgCoAAIAqAAC0QwAAgCoAAIAqAACAKgAAgCoAAIAqAACYRAAAgCoAAIAqAACAKgAAgCoA +AIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAAAYaQAAgCoAADxqAACAKgAAgCoAAIAqAACAKgAA +gCoAAIAqAACAKgAAgCoAANRsAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACA +KgAAgCoAAAh/AQBYggEAgCoAAKSEAQCAKgAAUIYBAHRTAQCAKgAAgCoAAHBQAACAKgAAgCoAAIAq +AACAKgAAgCoAAID4AQDU+AEAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoA +AIAqAABodAAAgCoAAIAqAACAKgAAWP4BAIAqAABAAgIAgCoAACgpAgCAKgAA8CQAAPQkAACAKgAA +gCoAANAZAgAodwAAgCoAAIAqAACAKgAADPwBAIAqAACAKgAA3EwBALCdAQCAKgAAgCoAAIAqAAB4 +pgEAkFQBAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAGypAQCAKgAAyBgCAMwYAgDYGAIA3BgCANAY +AgDUGAIA4BgCAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAGBSAACAKgAAgCoA +AIAqAACAKgAAgCoAABwYAgBsGAIArEYAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAA +gCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACA +KgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAqAACAKgAAgCoAAIAq +AAAkSAAArEgAADxJAADwSQAA3IUAAMhJAACAKgAAgCoAAIAqAACAKgAAgCoAABxIAAAgSAAAgCoA +AIAqAACgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAMAABgDAAAYAwA +AGAMAABgDAAAYAwAAGAMAABgDAAAYAwAAGAMAABgDAAAYAwAAGAMAABgDAAAYAwAAGAMAABgDAAA +YAwAAGAMAABgDAAAYAwAAGAMAABgDAAAYAwAAGAMAABgDAAAYAwAAGAMAABgDAAAYAwAAGAMAACQ +DQAAAAAAAORZAQBgDAAAhAkAAGAMAABgDAAAYAwAALQJAADMPAEA/IcAAGAMAABgDAAA6AkAAOgJ +AADoCQAA6AkAAOgJAADoCQAA6AkAAGAMAABgDAAAYAwAAGAMAADQCwAAYAwAAGAMAABgDAAAYAwA +AGAMAACUDQAAYAwAAGAMAABoCQAAAwAAAOQMAgACAAAAyGcBAAQAAAB4aAEABQAAALANAAAGAAAA +NDMAAAgAAABIGAIAEwAAAGT5AQAJAAAA3AMCAAoAAADkGAIADgAAAMyaAQAPAAAAfIgBABAAAAC0 +iAEAGAAAAExZAQANAAAATIABABcAAAAkdwAAEQAAAFCGAAASAAAA5EsBAAEAAADc/QEAFAAAALin +AQAVAAAA4J0BAAcAAABEbQAAFgAAABgpAgAZAAAAkA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAACAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAEAAAAAEAAAABAQAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// +////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAA4QMOHuHhAw4e4eEDDh7h4QMOHuHhAw4e4eEDDh7h4QMOHuHhAw4e4eEDDh7h4QMOHuHhAw4e +4eEDDh7hPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwVFRUVPDw8PBUVFRU8PDw8AAAA +AAAAAAAAAAAAAAAAADw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8FRUVFTw8PDwVFRUV +PDw8PAAAAAAAAAAAAAAAAAAAAAA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PBUVFRU8 +PDw8FRUVFTw8PDwAAAAAAAAAAAAAAAAAAAAAkAYAADH6rwCQBgAAMfqvAJAGAAAx+q8AkAYAADH6 +rwCQBgAAMfqvAJAGAAAx+q8AkAYAADH6rwCQBgAAMfqvAEMFAAAx+q8AQwUAADH6rwBDBQAAMfqv +AEMFAAAx+q8AQwUAADH6rwBDBQAAMfqvAEMFAAAx+q8AQwUAADH6rwAAAAAA3sMJAAAAAAAAAAAA +AAAAAIwrAQABAAAAzC6AAAAAAAAAAAAAAgAAAAMAAAAAAAAACAAAAAAAAAAwjBEAIL8CAAAAAAD8 +KwEAoCwBAKQtAQBMLwEApC0BAEwvAQD8MAEAhDEBAOQxAQCAgICAgICAgAGAAoCAgICAAAAAALQ3 +AQC0NwEAAAAAAAAAAAAAAAAAAAAAALQ3AQC0NwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AMwugADMLoAApCCgADggoAABAAAA/P///wAAAAAAAAAA7C6AAOwugACoIKAAPCCgAAgAAADz//// +AAAAAAAAAAAML4AADC+AAKwgoABsIKAAMAAAAM////8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA +AAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAA8EwBAAUAAAAML4AAKFIBAAD/AwBIUgEAAP8FACxT +AQAA/y0AUFMBAAD/PQAIUwEAAP8EAOxSAQAA/yUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAACUWAEABgAAAMwugAAAAAAALAEAAF4BAAABAAAAAQAAAAEAAAABAAAAAwAAAAAAAAAA +AAAAxF8BAMBgAQA4YQEAWFwBAIhbAQBkYgEA6GIBACxjAQB8YwEAAAAAAAMAAAACAAAAAwAAAAMA +AAADAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAARGkBAAoAAADMLoAAAAAAAAAAAAAAAAAA0GkB +AAoAAADMLoAAAAAAAAAAAAAAAAAAhGoBAAoAAADMLoAAAAAAAAAAAAAAAAAApGsBAAoAAADMLoAA +AAAAAAAAAAAAAAAACGoBAAoAAADMLoAAAAAAAAAAAAAAAAAAHGsBAAoAAADMLoAAAAAAABAAAAAA +gAAAAACgABAnAADoAwAA6AMAAAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAAAAAAAMg+ +AQAKAAAAzC6AAAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6A +AAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAA +AAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAAAAAAAMg+AQAK +AAAAzC6AAAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAA +AAAAAAAAAAAAAMg+AQAKAAAAzC6AAAAAAAAAAAAAAAAAADCEAQAKAAAAzC6AAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMiwEAkIwBAGCPAQAMkgEAhJQBAOiXAQA0jgEARAWA +AJCagAAYAAAAUJqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdJoBAAYAAADMLoAA/////wAAAAD///// +/////wAAAAAAAAAAAAAAAECdAQAFAAAADC+AAG4AbgBpAMAAoABQAIAAvgBQAX0APgBuAG4AaQDA +AKAAUACAAL4AUAF9AD4AAAAAAAEBAAAAAAAAAAECAQEAAgEAAQICAgABAQACAQIBAgACAAECA/// +AAC5Ad8AsQAbABYBGwB8ARsArwAbABQBGwB6ARsAbACgANEAoAA3AaAAbwCDAHEAgwB2AIMAcwAz +AG4AMwBwADMAcgAzANcAMwA9ATMA1AEGANABAAB+ADwA4wA8AEkBPAB4AEkA3QBJAEMBSQB/AFoA +5ABaAEoBWgCqAD8AqwABAA8BPwAQAQEAdQE/AHYBAQB5AGoA3gBqAEQBagCoAAAADQEAAHMBAACm +ADcApwABAAsBNwAMAQEAcQE3AHIBAQAEAAgAnAHMAJ0BzACeAcwAnwHMANUBzADWAcwA1wHMALQA +RwAZAUcAgAFHAJAAIgD1ACIAWwEiAKEAiAAGAYgAbAGIAJQAAACVAAAAmADAAJkAoACWAJAAlwAA +AJQAAQCVAAEAmADAAJkAoACWAJAAlwAAAJQAAgCVAAMAmADAAJkAoACWAJAAlwAAAJQAAwCVAAcA +mADAAJkAoACWAJAAlwAAAPoAAAD5AAAAAgGQAAMB0wAAAYMA/gATAPwAMwD9AHcA+gABAPkAAQAC +AZAAAwHTAAABgwD+ABMA/AAzAP0AdwD6AAIA+QADAAIBkAADAdMAAAGDAP4AEwD8ADMA/QB3APoA +AwD5AAcAAgGSAAMB0wAAAYMA/gATAPwAMwD9AHcAXwEAAGEBAABoAZAAaQHTAGYBgwBkARMAYgEz +AGMBdwBfAQEAYQEBAGgBkABpAdMAZgGDAGQBEwBiATMAYwF3AF8BAgBhAQMAaAGQAGkB0wBmAYMA +ZAETAGIBMwBjAXcAXwEDAGEBBwBoAZAAaQHTAGYBgwBkARMAYgEzAGMBdwCFAAAAhgAAAIcAUACI +AAAAiQCgAIoAAACLANAAjAAAAIUAAQCGAAEAhwBQAIgAAACJAKAAigAAAIsA0ACMAAAAhQACAIYA +AwCHAFAAiAAAAIkAoACKAAAAiwDQAIwAAACFAAMAhgAHAIcAUACIAAAAiQCgAIoAAACLANAAjAAA +AOsAAADqAAAA7ABQAO0AAADuAKAA7wAAAPAA0ADxAAAA6wABAOoAAQDsAFAA7QAAAO4AoADvAAAA +8ADQAPEAAADrAAIA6gADAOwAUADtAAAA7gCgAO8AAADwANAA8QAAAOsAAwDqAAcA7ABQAO0AAADu +AKAA7wAAAPAA0ADxAAAAUQEAAFABAABSAVAAUwEAAFQBoABVAQAAVgHQAFcBAABRAQEAUAEBAFIB +UABTAQAAVAGgAFUBAABWAdAAVwEAAFEBAgBQAQMAUgFQAFMBAABUAaAAVQEAAFYB0ABXAQAAUQED +AFABBwBSAVAAUwEAAFQBoABVAQAAVgHQAFcBAAD7/wAA//8AALkB3wCxABsAFgEbAHwBGwCvABsA +FAEbAHoBGwBsAKAA0QCgADcBoABvAIMAcQCDAHYAgwBzADMAbgAzAHAAMwByADMA1wAzAD0BMwDU +AQYA0AEAAH4APADjADwASQE8AHgASQDdAEkAQwFJAH8AWgDkAFoASgFaAKoAPwCrAAEADwE/ABAB +AQB1AT8AdgEBAHkAagDeAGoARAFqAKgAAAANAQAAcwEAAKYANwCnAAEACwE3AAwBAQBxATcAcgEB +AAQACACcAcwAnQHMAJ4BzACfAYgA1QHMANYBzADXAcwAtABHABkBRwCAAUcAkAAiAPUAIgBbASIA +oQCIAAYBiABsAYgA+gAAAPkAAAACAZcAAwHQAAABjQD+ABEA/AAzAP0AdwD6AAEA+QABAAIBlwAD +AdAAAAGNAP4AEQD8ADMA/QB3APoAAgD5AAMAAgGXAAMB0AAAAY0A/gARAPwAMwD9AHcA+gADAPkA +BwACAZcAAwHQAAABjQD+ABEA/AAzAP0AdwBfAQAAYQEAAGgBlwBpAdAAZgGNAGQBEQBiATMAYwF3 +AF8BAQBhAQEAaAGXAGkB0ABmAY0AZAERAGIBMwBjAXcAXwECAGEBAwBoAZcAaQHQAGYBjQBkAREA +YgEzAGMBdwBfAQMAYQEHAGgBlwBpAdAAZgGNAGQBEQBiATMAYwF3AOsAAADqAAAA7ABVAO0AAADu +AKoA7wAAAPAA3QDxAAAA6wABAOoAAQDsAFUA7QAAAO4AqgDvAAAA8ADdAPEAAADrAAIA6gADAOwA +VQDtAAAA7gCqAO8AAADwAN0A8QAAAOsAAwDqAAcA7ABVAO0AAADuAKoA7wAAAPAA3QDxAAAAUQEA +AFABAABSAVUAUwEAAFQBqgBVAQAAVgHdAFcBAABRAQEAUAEBAFIBVQBTAQAAVAGqAFUBAABWAd0A +VwEAAFEBAgBQAQMAUgFVAFMBAABUAaoAVQEAAFYB3QBXAQAAUQEDAFABBwBSAVUAUwEAAFQBqgBV +AQAAVgHdAFcBAAD7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3KgB +AJDJAQCwpYAAQAUAAAAAAADcqAEA/KkBAPCqgAD4AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +XM4BAGjMAQDorIAAVAAAAAAAAADcqAEAlMwBAGitgABQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB +AAAA3KgBALDIAQC8P4AAUAEAAAAAAADcqAEAyMoBAPgGgAACAAAAAAAAANyoAQAgywEA/AaAAAQA +AAAAAAAAWM4BAPypAQA8rYAAKgAAAAAAAADcqAEAvMsBAAAAAAAAAAAAAAAAANyoAQB8ywEAAAeA +AAQAAAAAAAAAAAAAAAAAAAABAAIAAgADAAQABAAFAAYABgAHAAgACAAJAAoACgALAAwADAANAA4A +DgAPACYAJwAoACgAKQAqAEYARgBHAEgASABJAEoASgBLAEwAaABpAGoAagBrAGwAbABtAG4AbgBv +AHAAcABxAHIAcgBzAHQAdAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA8A +PwAAAAAAAAAAAAAAAAAAAAEAAgACAAMABAAEAAUABgAGAAcACAAIAAkACgAKAAsAJAAkACUAJgAm +ACcARABEAEUARgBGAEcASABIAEkASgBKAEsATABMAE0AagBqAGsAbABsAG0AbgBuAG8AcABwAHEA +cgByAHMAdAB0AHUAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AHYAdgB2AA4APwDE +owEAEtIAAAAAAAD//w8A6LcBALYAAAAAAAAA/wAAAOi3AQC3AAAAAAAAAP8AAADotwEAuAAAAAAA +AAD/AAAA6LcBALkAAAAAAAAA/wAAAOi3AQC6AAAAAAAAAP8AAADotwEAuwAAAAAAAAD/AAAA6LcB +AL0AAAAAAAAA/wAAAOi3AQC+AAAAAAAAAP8AAADotwEAvwAAAAAAAAD/AAAA6LcBAMAAAAAAAAAA +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 +ENIC0gHSA9Ib0gvSAIAF0hLSE9IU0gRDCNIJ0grSHNIG0gfScNIAAAEAAAAAAAAAAAAAAAAAAAAD +AAAABAAAAAMAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAD/AwAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAALUAGgGBAQQADwCDAOgATgGSAPcAXQEGAAgACQAKAAsADAAFAAAAAAAAACwAAQAA +AAAAAAAAAAAAAAAAAAAAAAABAAEAAQAAAP////8AAAAALQEAAN0BAABaAgAAugIAAAoDAABNAwAA +hwMAALoDAADoAwAAEQQAADcEAABZBAAAegQAAJgEAAC0BAAAzgQAAOcEAAD+BAAAFQUAACoFAAA+ +BQAAUQUAAGQFAAB1BQAAhgUAAJcFAACnBQAAtgUAAMUFAADTBQAA4QUAAO4FAAD7BQAACAYAABQG +AAAgBgAAKwYAADcGAABCBgAATAYAAFcGAABhBgAAawYAAHUGAAB+BgAAiAYAAJEGAACaBgAAogYA +AKsGAAC0BgAAvAYAAMQGAADMBgAA1AYAANsGAADjBgAA6gYAAPIGAAD5BgAAAAcAAAcHAAAOBwAA +FAcAABsHAAAiBwAAKAcAAC4HAAA1BwAAOwcAAEEHAABHBwAATQcAAFMHAABYBwAAXgcAAGQHAABp +BwAAbwcAAHQHAAB5BwAAfwcAAIQHAACJBwAAjgcAAJMHAACYBwAAnQcAAKIHAACnBwAAqwcAALAH +AAC1BwAAuQcAAL4HAADCBwAAxwcAAMsHAADQBwAA1AcAANgHAADcBwAA4QcAAOUHAADpBwAA7QcA +APEHAAD1BwAA+QcAAP0HAAABCAAABQgAAAgIAAAMCAAAEAgAABQIAAAXCAAAGwgAAB8IAAAiCAAA +JggAACkIAAAtCAAAMAgAADQIAAA3CAAAOwgAAD4IAABBCAAARQgAAEgIAABLCAAATwgAAFIIAABV +CAAAWAgAAFsIAABfCAAAYggAAGUIAABoCAAAawgAAG4IAABxCAAAdAgAAHcIAAB6CAAAfQgAAIAI +AACCCAAAhQgAAIgIAACLCAAAjggAAJEIAACTCAAAlggAAJkIAAA4AAAAaAAAAHQAAACAAAAAjAAA +AJ0AAAAHAAAAAAAAAAAAAAAKAAAADdIR0hDSAtIB0gPSG9IL0gCABdIS0hPSFNIEQwjSCdIK0hzS +BtIH0nDSAAABAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAADAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA +AAAA/wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC1ABoBgQEEAA8AgwDoAE4BkgD3AF0B +BgAIAAkACgALAAwABQAAAAAAAAAsAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAADfAAAAGQEA +AGIBAAC+AQAAMgIAAMMCAAB7AwAAYgQAAIQFAADyBgAAvggAAAILAAABAAAAAgAAAAAAAAAL0g7S +DdII0gnSCtIS0hPSFNIR0hDSAtIB0gPSAIAF0gRDG9Ic0gTSAEUw0jHSAAAAAAAAAQAAAAEAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAAAAAADAAAABAAAAAMAAAAAAAAA/wMAAAMA +AAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAALUAGgGBAQUABAAPABAACgALAAwATgAA +AAAAAAAAAAAALAABAAAAAQABAAEAAAAAAAAAAAABAAEAAgACAAIAAwADAAQABAAFAAUABgAGAAcA +BwAIAAgACQAJAAoACgALAAsADAAMAA0ADQAOAA4ADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQFgACQmoAAGAAAAFCagAAAAAAAAAAAAAAA +AAAAAAAAAAAAAMz/AQAGAAAAzC6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAARAWAAJCagAAYAAAAUJqAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +6AsCAAQAAADMLoAAAAAAAAAAAAAAAAAAwAoCAAQAAADMLoAAAAAAAAAAAAAAAAAAsAwCAAYAAADM +LoAAAAAAAAAAAAAAAAAAwAoCAAQAAADMLoAAAAAAAAAAAAAAAAAA6AsCAAQAAADMLoAAAAAAAAAA +AAAAAAAAwAoCAAQAAADMLoAAAAAAAAAAAAAAAAAA6AsCAAQAAADMLoAAAAAAAAAAAAAAAAAAwAoC +AAQAAADMLoAAAAAAAAAAAAAAAAAAsAwCAAYAAADMLoAAAAAAAAAAAAAAAAAAwAoCAAQAAADMLoAA +AAAAAAAAAAAAAAAA6AsCAAQAAADMLoAAAAAAAAAAAAAAAAAAsAwCAAYAAADMLoAAAAAAAAAAAAAA +AAAA6AsCAAQAAADMLoAAAAAAAAAAAAAAAAAA6AsCAAQAAADMLoAAAAAAAAAAAAAAAAAAsAwCAAYA +AADMLoAARAWAAJCagAAYAAAAUJqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBAQEBAUGBwgICAgICQoLDA0AAAAFBgcI +DQ4PEBUWFxgZAAAKDREUCg0RFBkZGRkKCgAAAAAAAAYGBgYJCQkJAAYAAG47aDtiO1w7bjpoOmI6 +XDpuOWg5YjlcOW4raCtiK1wrbipoKmIqXCpuKWgpYilcKW4baBtiG1wbbhpoGmIaXBpuGWgZYhlc +GW4YaBhiGFwYbhdoF2IXXBduFmgWYhZcFm4VaBViFVwVbhRoFGIUXBRuE2gTYhNcE24SaBJiElwS +bhFoEWIRXBFuEGgQYhBcEFcQUhBNEEkQbgFoAWIBXAFuAGgAYgBcAG47aDtiO1w7bjpoOmI6XDpu +OWg5YjlcOW44aDhiOFw4bjdoN2I3XDduKWgpYilcKW4oaChiKFwobidoJ2InXCduGWgZYhlcGW4Y +aBhiGFwYbhdoF2IXXBduCWgJYglcCW4IaAhiCFwIbgdoB2IHXAduBmgGYgZcBm4FaAViBVwFbgRo +BGIEXARuA2gDYgNcA24CaAJiAlwCbgFoAWIBXAFuAGgAYgBcAAAAAAAAAAAAAAAAAEArAgAIAAAA +DC+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////8A +Af//AgP///8E//////////////////////8F/wb/B/8I/wn/Cv8L/wz///8N////Dv///w////8Q +//////////////////////////////////////////////8R////Ev///xP///8U////Ff///xb/ +//8X////GP///xn///8a////G/////8c////Hf///x7///8f////IP///yH///////////////// +/////yIjJP8lJif//yj///8p//////////////////////////////////////////////////// +//////////////////////////8BBAAAAgUBAAMGAgAEBwMABQgEAAYJBQAHCgYACAsHAAkMCAAK +DQkACw4KAAwPCwANEAwADhENAAFAAAQCQQEEA0ICBARDAwQFRAQEBkUFBAdGBgQIRwcECUgIBLcT +IgC4FCMAuRUkALsWJQC8FyYAvRgnAMAZKADEGikABxsAAAgcAQALHQIADB4DABAfBAAiIQUAJCIG +ACYjBwAoJAgAKiUJACwmCgAuJwsAMCgMADQpDQA4Kg4APCsPAEAsEABkLhEAaC8SAGwwEwBwMRQA +dDIVAHgzFgB8NBcAgDUYAIQ2GQCINxoAjDgbAJE6HACVOx0AmTweAJ09HwChPiAApT8hACRJBgIs +SgoCNEsNATxMDwFkTREBbE4TAXRPFQF8UBcBhFEZAZVSHQGdUx8BAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAABBgIGBgYDBgYGBgYGBgQAAAAAA8APwABAAAADwA/AAEAAAAPAD8AAQAAAA8APwABAAAADwA/ +AAEAAAAPAD8AAQAAAA8APwACAAAADwA/AAEAAAAAAAAAAQAAAAIAAAADAAAAAAAAAAQAAAACAAAA +BQAAAA8UGR4oCgUAsAkBpQA8ODQwLCgkIBwYFBAMCAQADAgEADw4NDAsKCQgHBgUEAwIBAIIAA4A +AAAOAQEAAQIBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AKXGhPiZ7o32Df+91rHeVJFQYAMCqc59VhnnYrXmTZrsRY+dH0CJh/oV7+uyyY4L++xBZ7P9X+pF +vyP3U5bkW5vCdRzhrj1qTFpsQX4C9U+DXGj0UTTRCPmT4nOrU2I/KgwIUpVlRl6dKDChNw8KtS8J +DjYkmxs93ybNaU7Nf5/qGxKeHXRYLjQtNrLc7rT7W/akTXZht859e1I+3XFelxP1pmi5AAAswWBA +H+PIee22vtRGjdlnS3LelNSY6LBKhWu7KsXlTxbtxYbXmlVmlBHPihDpBgSB/vCgRHi6JeNL86L+ +XcCAigWtP7whSHAE8d9jwXd1r2NCMCAa5Q79bb9MgRQYNSYvw+G+ojXMiDkuV5PyVYL8R3qsyOe6 +KzKV5qDAmBnRnn+jZkR+VKs7gwvKjCnH02s8KHmn4rwdFnatO9tWZE50HhTbkgoMbEjkuF2fbr3v +Q6bEqDmkMTfTi/Iy1UOLWW632owBZLHSnOBJtNj6rAfzJc+vyo706UcYENVviPBvSnJcJDjxV8dz +UZcjy3yhnOghPt2W3GGGDYUPkOBCfMRxqszYkAUGAfcSHKPCX2r5rtBpkRdYmSc6uSc42RPrsysz +IrvScKmJB6czti0iPJIVIMlJh/+qeFB6pY8D+FmACRca2mUx18aEuNDDgrApd1oRHst7/KjWbTos +AQEBAQEBAQECAgICAgICAgMDAwMDAwMDBAQEBAQEBAQBAgICAgICAwMDAwMDAwMDAwMDAwMEBAQE +BAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAQECAQICA3//Bw8fPwEDAQMPBwEHDx8/f///BQAHAgME +BgZ00UUX6KKLLg0PBQcJCwEDChQ3blVVVQFLaC8BVVVVBeM4jgOqqqoCcRzHAaqqqgrHcRwHDw8P +BwYHAgMEBQABCAkLCigAKAAwACwALAAoADwANAAoACgANAAwACwALABEADwAQAA8AIwAbABYAEgA +9ACwACwALAA8ADQAMAAsAFQARABUAFQAbABgAFwAVACMAHgAOgECAdUA3wDaAKIAdQB/AGoBGgHZ +AOgACgG6AHkAiACKBSoDOQGoAYoFygLZAEgBygFKAeIA+QDKAeoAggCZAPQCRAK1AdUBlAKEAfUA +QQKsAJAAhACAAHgAeAB4AHQAZuYAAJ3YiZ1O7MRONEiDNCd2YicapEEaEzuxExEYgREP/MAPTuzE +Tid2YicapEEaEzuxEw3SIA2JndgJCIzACAd+4Ac0SIM0GqRBGhEYgREN0iANCIzACAZpkAawstUF +BVRABSd2YicTO7ETDdIgDYmd2AkGaZAGxE7sBARGYAQDP/ADqqqqqhqkQRoTO7ETD/zADxEYgREN +0iANCqiAChM7sRMP/MAPD/zADw3SIA0LtEALC7RAC4md2AkN0iANCqiACgqogAoIjMAIB3iABwd4 +gAcGaZAGD/zADw3SIA0LtEALDdIgDQu0QAuJndgJCIzACImd2AkIjMAIB37gBwd+4AfBLCkHCqiA +CgiMwAgHeIAHCIzACAd4gAcGaZAGsLLVBQZpkAawstUFBVRABQVUQAXWHcYEQAOABsAJAA2AEwAa +QB2AIIAGAA2AEwAaACcANIA6AEHACYATQB0AJ4A6AE7AV4BhmQMzB9kKcw6mFeYcgCAZJDMHcw6m +FeYcWSvMOQBBM0jZCqYVgCBZKwBBplaAYVlsMAAAADYAAAAMAAAAEgAAABgAAAAkAAAABgAAAAkA +AAAAAAAAAAAAABggFBQODhQUBQYBAgMEAAAAAQECAQICAwQMDAgEDAQEQAAAAIAAAAAAAQAAAAIA +AEAAAAAABAAAQAAAAEAAAAAQERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uL0BBQkNERUZH +SElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8z +EwAAAAcHDwcPDxctAA8gAPBhAAAAAAAAAAAAAAECBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDk6NDk6MDkAAAAATi2uAGmu +oK6QrmIAAaysegCskpusrF8ACQAAAAIAAAAAAAAAAAAAAAkAAAACAAAAAAAAAAAAAAAJAAAAAwAA +AAEAAAAJAAAACQAAAAIAAAACAAAACQAAAAECAQIDBAAABQYHCAkKAAAABQYAAgQABQAAAAAABQcB +AwQABQEAAABAI0AlISEhIUBAQEBABQQEAQFAQEBABQVAQAwMQA0MDAEBAQVAQAUFAAQABEBAAARA +QEAFQEBAQEAFQEBABQUFAQEBAUAFBQUBBQEBQAUFBUAFQAUFBQUFBAAAABwRAAAcMgAAHDMAAAQA +AAAcFQAAAgAXAGwAcAR0CHQMAAQEBgAAAAAAAAAAZAAAAACQAQAKAAAAAAAAAAAAAAAAAAAA/wAA +AAAAAAAAAAAAAAAAAAAAAAABAAAAEAAAAAAAAAABAAAAAQAAAAAAAAD/AAAA/wAAAAAAAAAAAAAA +HHsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAAABAAAZAAAAIyB +AQCUgQEAnIEBAPCBAQD4gQEAAIIBAAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcH +BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwYGBgYGBQUFBQUEBAQEBAMDAwMDAgICAgIBAQEBAQAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACiVDvU56 +lQAHFCdZLgAAAAQOCR0tNwAABA4JHSw7AAEQAAEAAAACgAABQgYCEAACIAAAA8AAAUMGAxAAAsAA +AAPAAAFDBgQQAAJAAAACgAABRAYFEQAAQAAAA8AAAUUGBhEAAOAAAAPAAAFFBgcRAAEAAAACgAAB +RgYIEQACIAAAA8AAAUcGCREAAsAAAAPAAAFHBgoRAAJAAAACgAABSAYLEgAAQAAAA8AAAUkGDBIA +AOAAAAPAAAFJBg0SAAEAAAACgAABSgYOEgACAAAAAoAAAUwGAAAiFgAAgAAAAwAAAVkAJBYAAQAA +AAMAAAFaACYWAAIAAAAEAAABWgAoFgACAAAAAwAAAVsAKhYAAoAAAAMAAAFcACwXAAAAAAAEAAAB +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 +AAAAAAUFBQUFBQUFAAAAAIANAAAAIAAAgA0AAIANAAAAIAAAgA0AAAAGAAAABAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAA= +==== diff --git a/sys/contrib/dev/run/LICENSE b/sys/contrib/dev/run/LICENSE new file mode 100644 index 000000000000..39e3c521891a --- /dev/null +++ b/sys/contrib/dev/run/LICENSE @@ -0,0 +1,39 @@ +Copyright (c) 2007, Ralink Technology Corporation +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Ralink Technology Corporation nor the names of its + suppliers may be used to endorse or promote products derived from this + software without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Ralink Technology Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. 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 MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER 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. diff --git a/sys/contrib/dev/run/rt2870.fw.uu b/sys/contrib/dev/run/rt2870.fw.uu new file mode 100644 index 000000000000..1c3a0c7f9f78 --- /dev/null +++ b/sys/contrib/dev/run/rt2870.fw.uu @@ -0,0 +1,225 @@ +# Copyright (c) 2007, Ralink Technology Corporation +# All rights reserved. +# +# Redistribution. Redistribution and use in binary form, without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions must reproduce the above copyright notice and the +# following disclaimer in the documentation and/or other materials +# provided with the distribution. +# * Neither the name of Ralink Technology Corporation nor the names of its +# suppliers may be used to endorse or promote products derived from this +# software without specific prior written permission. +# * No reverse engineering, decompilation, or disassembly of this software +# is permitted. +# +# Limited patent license. Ralink Technology Corporation grants a world-wide, +# royalty-free, non-exclusive license under patents it now or hereafter +# owns or controls to make, have made, use, import, offer to sell and +# sell ("Utilize") this software, but solely to the extent that any +# such patent is necessary to Utilize the software alone, or in +# combination with an operating system licensed under an approved Open +# Source license as listed by the Open Source Initiative at +# http://opensource.org/licenses. The patent license shall not apply to +# any other combinations which include this software. No hardware per +# se is licensed hereunder. +# +# DISCLAIMER. 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 MERCHANTABILITY AND +# FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER 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. +begin 644 rt2870.fw +M____`A`H`A`R`A!X`A)G`A)H`A*'`A*,$A*((@(620(7'P(3=P(2C3`%!B`- +M`Q(7P2*0`8S@,.,;Y4PPX`1_0(`"?P"0$"_O\)`!C'0(\.20`:?PD`&,X##@ +M')`!@."T`A6CX+0!$)`!A."T@0F0`8QT`?`2#<@BD`04X"#G`P(29I!P$N#U +M5I`$!.`2"IT0MS$0X%`1!%$1#5(1#5,1#5013E41?G`1J7$1UW(2'7,2/H`` +M`!)F(`(#,`,=?0*O5A(+D9`$%'2`\.20`D7?57D'`0X/]T1R57^,;OQI!P$>#_=$@E5_C&[\;D_:]6$@N1D`04 +M=(#PY)!P$_#E5O1P`P(29@(27^5'9`=@"^5'9`A@!>5'M`D(D'`1X%0/]3KE +M1[0)".4ZM`,#Y/5&Y/VO5A(+D=($(I!P$.#^D'`1X/WM^.;U5_VO5A(+D9`$ +M%'2`\.20#][?6"CH/@]5?]KU82"Y&0 +M!!1T@/#DD'`3\.56]'`#`A)F`A)?D!`"X+1P'J/@M#`9D`4(X$0!\/V0!07@ +M5/OP1`3P[53^D`4(\.3U3O5/=3K_K5>O5A(+D9`$%'2`\.20!$`?`B(N53Y4=D!F`#`A-$@!OE2,14#_5#Y4K$5`_U +M0N5,Q%0/]5[E1V0&<&930P^`885)0X5+0H5-7N5'9`9P4H`;Y4G$5`_U0^5+ +MQ%0/]4+E3<14#_5>Y4=D!G`UY4-4#T00]4.`*^5'M`0&4U[[=4()Y4>T!09# +M7@1U0@GE1[0&$.5#5`]$,/5#@`;22X`"TDSD]27E0L14\/_E0U0/3_5?D'!$ +M\*/E7O"CY4KPH^5(\*/E3/"CY43PH^5"\*/E0_#28"+E1V`0),!P`Q(6*1(3 +MC,*OP@32KR+"KY`$%.!4#F`$TAB`".5.14\D_Y(8TJ^0!!3@HN22&70>\.5? +M5`_U+>4E5?5##_OS`1Y25P!74E#(`"%272;-)M@`_E +M7S#F!L)LTFV`!-)LPFWE1V0#<"$P2P;";-)M@!CE)7`#,$P1PDSE)7`%=24' +M@`(5)=)LTFWE1[0)%.5$(.,+Y3ID`F`%Y3JT`P3";-)MD'!&Y2WP(&D'Y5X@ +MX`*R:"!K!^5>(.$"LFH@;0?E7B#B`K)LD'!'Y2WP=2Y`(&D$HFB`)C!H!N5& +MHN*`'>5>(.($?P&``G\`Y494\/Z^\`1^`8`"?@#N;R3_DG.2!4_O#E0\14#Q1@%"3^8",D`V`#`A88D`(HX#!'#X`'D`(HX"!' +M!E3^\`(6&$0!\`(6&.5&,.($?P&``G\`D`(HX%3^3_`"%ACE1V0'8`_E1V0( +M8`GE1V0)8`,"%ACD]2>0`BG@5/SPY3H48"T48"X48#8D_&!?)/E@'R0.<&GE +M1A,35#]U\`.$K_`@1P1^`8`"?@#O;B3_@$6B1X!!Y48PX@/3@"?#@"3E1C#B +M#50XPY0P4`9^`'\!@`1^`'\`($<$?0&``GT`[VU.)/^2.*)'LY(Y@!GE1C#B +M`].``<.2.:)'LY(X@`>B1[.2.)(YD`(HX%3\12?PD'"4Z +M\"+DD`(I\#!'!*]%@`3E1?3_D`(H[_`BCU#262*/5-)8(N3U8L*OY5$48$84 +M8&(D`F`#`A<#TEEU50&0`J+@5'_PH^`@YR*0!#3@M`(;H^"T`A:CX+0"$7\@ +M$A8_D!`$X%3S\'51`8!SY5!P!75B`X!JD!(`X%0#50<`*`1I`"H^`@YCN0!#?@9")P,Y`!BG1^\)`!EO"0$@1T"O"0$RC@ +M5/#PH^!4\/"CX%3Z\)`$`>!4^?!U8@%U50+D]5&`">50<`5U8@/U4>5B8!7" +M`>3U4<)9K6*O0!(7C>5BM`,"T@/2KR+"KS`!$N20`9;P]5'"6<(!?0*O0!(7 +MC>52%&`)!'!,=5(!=54#D`0!X$0.\)`3*.!$#_"CX$0/\*/@1`7PD!($=`/P +MD`*BX$3`\)`0!.!$#/#D]5+U53`""\("?0&O01(7C8`"P@/DD`&6\-*O(N_T +M8"WD_G04+O6"Y#1P]8/@M/\9=!0N]8+D-'#U@^_P=!PN]8+D-'#U@^WP(@Z^ +M!-4B(B*0<"K@,.%-PJ^0<"C@D!`<\)!P*>"0$!WPD'`JX)`0'O"0$!S@]6*0 +M$![@(.'SD!``(29P(2:`(2AP(2C!(2B"("%DD"%Q\"$W<"$HTP!08@ +M#0,2%\$BD`&,X##C&^5,,.`$?T"``G\`D!`O[_"0`8QT"/#DD`&G\)`!C.`P +MX!R0`8#@M`(5H^"T`1"0`83@M($)D`&,=`'P$@W=(I`$%.`@YP,"$F:0!D"&`(X&0@8`,"$F9U3@-U3R`BD'`1X"3_DD!4#_4Z +MY4>T"0CE.K0#`^3U1N3]KU82"ZK2!"*0#][?CF]5?]KU82"ZJ0 +M!!1T@/#DD'`3\.56]'`#`A)F`A)?D'`0X/Z0WU@HZ#X/57_:]6$@NJ +MD`04=(#PY)!P$_#E5O1P`P(29@(27Y`0`N"TO5A(+JI`$%'2`\.200<"7@1`'P(B+E4W`:,&`)LDTP300% +M1L($Y4]%3F`(Y4\53W`"%4XB(L)"TR(BPDO"3.5$$@JV$J\`$T($$SX($QD0 +M$L,@$N-@$O2@```31(5(0X5*0H5,7N5'9`9@`P(31(`;Y4C$5`_U0^5*Q%0/ +M]4+E3,14#_5>Y4=D!G!F4T,/@&&%24.%2T*%35[E1V0&<%*`&^5)Q%0/]4/E +M2\14#_5"Y4W$5`_U7N5'9`9P->5#5`]$$/5#@"OE1[0$!E->^W5"">5'M`4& +M0UX$=4()Y4>T!A#E0U0/1##U0X`&TDN``M),Y/4EY4+$5/#_Y4-4#T_U7Y!P +M1/"CY5[PH^5*\*/E2/"CY4SPH^5$\*/E0O"CY4/PTF`BY4=@$"3`<`,2%BD2 +M$XS"K\($TJ\BPJ^0!!3@5`Y@!-(8@`CE3D5/)/^2&-*OD`04X*+DDAET'O#E +M7U0/]2WE)7`3,!@%Y5\@Y0LP&1GE7U0P_[\P$>4E<`5U)0R``A4ETFS2;8`/ +MY5\PY@;";-)M@`32;,)MY4=D`W`A,$L&PFS2;8`8Y25P`S!,$<),Y25P!74E +M!X`"%272;-)MY4>T"13E1"#C"^4Z9`)@!>4ZM`,$PFS2;9!P1N4M\"!I!^5> +M(.`"LF@@:P?E7B#A`K)J(&T'Y5X@X@*R;)!P1^4M\'4N0"!I!*)H@"8P:`;E +M1J+B@!WE7B#B!'\!@`)_`.5&5/#^OO`$?@&``GX`[F\D_Y)SDG(@:P2B:H`F +M,&H&Y4:BXH`=Y5X@X`1_`8`"?P#E1E3P_K[P!'X!@`)^`.YO)/^2=9)T(&T$ +MHFR`)C!L!N5&HN*`'>5>(.$$?P&``G\`Y494\/Z^\`1^`8`"?@#N;R3_DG&2 +M<)`0`."0$"_PD!`#X,.4,$`4HG&2=Z)PDG;E+A,35#_U+L)WTG:0$"_E+O#E +M1V0&<$R0`BG@5/[PY4/$5`\48!0D_F`C)`-@`P(6&)`"*.`P1P^`!Y`"*.`@ +M1P94_O`"%AA$`?`"%ACE1C#B!'\!@`)_`)`"*.!4_D_P`A88Y4=D!V`/Y4=D +M"&`)Y4=D"6`#`A88Y/4GD`(IX%3\\.4Z%&`M%&`N%&`V)/Q@7R3Y8!\D#G!I +MY483$U0_=?`#A*_P($<$?@&``GX`[VXD_X!%HD>`0>5&,.(#TX`GPX`DY48P +MX@U4.,.4,%`&?@!_`8`$?@!_`"!'!'T!@`)]`.]M3B3_DCBB1[.2.8`9Y48P +MX@/3@`'#DCFB1[.2.(`'HD>SDCB2.9`"*.!4_$4G\)!PG.4Z\*/E1_"0<$'E +M.O`BY)`"*?`P1P2O18`$Y47T_Y`"*._P(H]0TEDBCU326"+D]6+"K^51%&!& +M%&!B)`)@`P(7`])9=54!D`*BX%1_\*/@(.!$#O"0$RC@1`_PH^!$#_"CX$0%\)`2!'0# +M\)`"HN!$P/"0$`3@1`SPY/52]54P`@O"`GT!KT$2%XV``L(#Y)`!EO#2KR+O +M]&`MY/YT%"[U@N0TX"#A\Y`0'."0<"CPD!`=X)!P*?"0$![@D'`J\#!*!Y!P).!$`?#"!=*O +M(B(B```````````````````````````````````````````````````````` +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```````````````````````````````````````````````````````````" +"F\`` +` +end diff --git a/sys/contrib/dev/uath/ar5523.bin.uu b/sys/contrib/dev/uath/ar5523.bin.uu index 6fa430dfde1d..591c87ed255b 100644 --- a/sys/contrib/dev/uath/ar5523.bin.uu +++ b/sys/contrib/dev/uath/ar5523.bin.uu @@ -59,34 +59,34 @@ M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M``````!`@&@``````#P"$``T0O\`0()@`````````````````"0"``)`@H`` M`````````````````^`((3P:@``G6@MT/!^``"?_!&0#7]`B!!$``0`````# -M7]`@`"#X(0-`^`D``````^`((3P:@`(G6D:X/!^``"?_!)0#7]`B!!$``0`` +M7]`@`"#X(0-`^`D``````^`((3P:@`(G6E98/!^``"?_!)0#7]`B!!$``0`` M```#7]`@`"#X(0-`^`D`````0`)@```````\`___-&,`_P!#$"1`@F`````` -M````````````/`2``B2$5_``@.@A/`$?_S0A__\#H>@D/`&@``.AZ"5`!(`` -M`````````````````^`((3P:@`(G6J6$/!^``"?_!1@#7]`B!!$``0`````# -M7]`@`"#X(3P!'_\T(?__`T'0)#P!H``#0=`E`T#X"0`````\'(`#)YS&L#P$ -M@`(DA%?P`(#H(3P(@``\"8``)2D!P#P+@``E:P'DC2(``"$I``2M`@``(0@` +M````````````/`2``B2$9Y``@.@A/`$?_S0A__\#H>@D/`&@``.AZ"5`!(`` +M`````````````````^`((3P:@`(G6JL0/!^``"?_!1@#7]`B!!$``0`````# +M7]`@`"#X(3P!'_\T(?__`T'0)#P!H``#0=`E`T#X"0`````\'(`#)YS64#P$ +M@`(DA&>0`(#H(3P(@``\"8``)2D!P#P+@``E:P'DC2(``"$I``2M`@``(0@` M!!4K__L`````-`0`$#P%@``DI09T/`:``"3&`@"LQ0``(,8`!""$__\4@/_\ M`````#P$@``DA`(`/`6``"2E!X"LA0``/`6``"2E"RBLA0`D/`6``"2E!G2L -MA0"`K(4`A*R%`(@,``*L``````P`:5H`````#`!J>P`````,`&D:``````@` -M;<\\'P``$````0````!`&F``/!O__S=[__`#6]`D0)I@```````````````` +MA0"`K(4`A*R%`(@,``*L``````P`:KT`````#`!KW@`````,`&I]``````@` +M;S(\'P``$````0````!`&F``/!O__S=[__`#6]`D0)I@```````````````` M`$`:\`````````````````!`FG``````````````````0!I@`#P;_[\W>___ M`UO0)$":8``D&@"(/!N``"=[`@"/>P"(`V``"``````#H-@A([W^L*^Z`(BO MH```KZ$`!*^B``BOHP`,KZ0`$*^E`!2OI@`8KZ<`'*^H`""OJ0`DKZH`**^K M`"ROK``PKZT`-*^N`#BOKP`\K[``0*^Q`$2OL@!(K[,`3*^T`%"OM0!4K[8` M6*^W`%RON`!@K[D`9*^\`'"OO@!XK[\`?```(!```"@2KZ0`@*^E`(2ONP!T M0`AH`$`)8`!`"C@`0`M``$`,&`!`#7@`0`YP`*^H`)BOJ0",KZH`E*^K`)RO -MK`"DKZT`H*^N`)`\'(`#)YS&L`.@@"$CO?_@0!I@`#P;__\W>__P`UO0)$": -M8``````````````````,`&D.`@`@(0@``DT``````Z#8(2.]_K"ON@"(KZ`` +MK`"DKZT`H*^N`)`\'(`#)YS64`.@@"$CO?_@0!I@`#P;__\W>__P`UO0)$": +M8``````````````````,`&IQ`@`@(0@``DT``````Z#8(2.]_K"ON@"(KZ`` M`*^A``2OH@`(KZ,`#*^D`!"OI0`4KZ8`&*^G`!ROJ``@KZD`)*^J`"BOJP`L MKZP`,*^M`#2OK@`XKZ\`/*^P`$"OL0!$K[(`2*^S`$ROM`!0K[4`5*^V`%BO MMP!*^_`'P``"`0```H$J^D`("OI0"$K[L`=$`) -M8`!`"C@`0`MP`*^I`(ROJ@"4KZL`D#P<@`,GG,:P/`*``B1"1E2,1```((0` +M8`!`"C@`0`MP`*^I`(ROJ@"4KZL`D#P<@`,GG-90/`*``B1"5?2,1```((0` M`:Q$```#H(`A)[W_X$`#8```````0`)H````````0Q`D``(2@C!"`'\\`X`` M)&,*/`!#$""`4@```D"((20!``02(0`#`````!````P`````/!&@P#8Q`!". M,0``,C$`?SP#@``D8PH\`'$8((!Q```F,0`&`B"0(0``````$8B`0!I@`#P; -M__\W>__P`UO0)$":8``````````````````\"H`")4HQ>`%14""-2@``/`6` -M`B2E,?``L2@@C*4```)`("$!0/@)``````!`D"$\!8`")*4R:`"Q*"",I0`` -M`@`P(0P`=7,`0"`A`D`0(2.]`"!``F``/`/__S1C__X`0Q`D0()@```````` +M__\W>__P`UO0)$":8``````````````````\"H`")4HW(`%14""-2@``/`6` +M`B2E-Y@`L2@@C*4```)`("$!0/@)``````!`D"$\!8`")*4X$`"Q*"",I0`` +M`@`P(0P`=M8`0"`A`D`0(2.]`"!``F``/`/__S1C__X`0Q`D0()@```````` M`````````(^H`)2/J0"`CZH`A$"(.``!(``1`4``$X^A``2/H@`(CZ,`#(^D M`!"/I0`4CZ8`&(^G`!R/J``@CZD`)(^J`"B/JP`LCZP`,(^M`#2/K@`XCZ\` M/(^P`$"/L0!$C[(`2(^S`$R/M`!0C[4`5(^V`%B/MP!(^_`'R/NP",-!K_``-:T"<#>M@D0!I@````````````,UK_``-ZV"6/ MN@"0C[T`=#=[``)`FV``````````````````0)IP```````````````````` M``]"```8`````````0`"``$``P`!``(``0`$``$``@`!``,``0`"``$`!0`! M``(``0`#``$``@`!``0``0`"``$``P`!``(``0`#X``(``````.@&"$`H.@A -M([W_X*^C``BOOP`0`(#X"0````"/OP`0C[T`"`/@``@`````/`2``B2$1Z@\ -M!8`#)*6B'#"&``,4P``2``````"D.",`!SE"``P(``WK8((][```#8``(`````#0:`"0( @@ -111,7 +111,7 @@ MGP`LC)X`*(R<`"2,EP`@C)8`'(R5`!B,E``4C),`$(R2``R,D0`(C)``!(R= M```#X``(`*`0(0`````GO?_PK[\```P``TL``$`AC[\```/@``@GO0`0)[W_ M\*^R``BOLP`,K[$`!*^P````P$@A`0"0(0#@6"$`H'`A%,`!``"`4"$`AQ`K M$$``9#0"__\`1Q`K%$``60#@*"$D`@`(+.,!``!`,"$``S`+/`.``@#%$`8D -M8Q9\`$,0(9!$```D`@`@`(8@(0!$.",0X``(``LT`@!'$",`3A`&`.H8!`!B +M8QP<`$,0(9!$```D`@`@`(8@(0!$.",0X``(``LT`@!'$",`3A`&`.H8!`!B M4"4`ZU@$`.YP!``+-`(!1@`;,6K__P`.)`)0P``!```!S0``$!(``!@0``,< M``!D&"4``"@2``````````!P2D@"`&D0*U!```L`:1@C`&L8(0!K$"L40``& M)*7__P!I$"M00``$`&D8(R2E__\`:Q@A`&D8(P!F`!M0P``!```!S3'$__\` @@ -120,7 +120,7 @@ M&"$`:Q`K%$``!B3&__\`:1`K$$``!``%%```:Q@A),;__P`%%```1C`E`&EP M(P``F"$20``$`.[(!@``P"&N6```KED`!`)@$"&/L@`(C[,`#(^Q``2/L``` M`,`8(0/@``@GO0`0/`(`_S1"__\D`P`0`$<0*R0$`!@`8#`A$`#_I0"",`L4 MX``*`$L0*R0"``$`1@`;4.```0```",!2U`C)!,``0`+9`(Q:/__`4P`&P`.+`)1@``! M```!S0``(!(``!@0``,<``!E&"4``&@2``````````!PB$@"`&D0*U!```L` M:1@C`&L8(0!K$"L40``&)(W__P!I$"M00``$`&D8(R6M__\`:Q@A`&D8(P!L @@ -134,7 +134,7 @@ M``,<``!D&"4``#`2``````````!P4T@"`&D0*Q!```L`#Q0``&L8(0!K$"L4 M0``&),;__P!I$"L00``$``\4`"3&__\`:Q@A``\4``!&F"40`/^.`&E0(S1" M__\D`P`0`$L0*R0$`!@`8"@A$`#_>0""*`L`AA`K$$``!S0"__\``#`A``"8 M(1$`_U$`H,@A$`#_30%`P"$`1A`K%$``?#P"`/\D`@`(+,,!``!`*"$``R@+ -M/`.``@"I$`8D8Q9\`$,0(9!$```D`@`@`(4@(0!$.",4X``1`$=X(P$J$"L4 +M/`.``@"I$`8D8QP<`$,0(9!$```D`@`@`(4@(0!$.",4X``1`$=X(P$J$"L4 M0``%`H@!@",`!LQ,___`>X0 M!@#J&`0`8E`E``HL`E&```$```'-`.M8!```,!(``"`0``0D``"%&"4``$`2 @@ -148,7 +148,7 @@ M(",!I!`K`8D8(P!B8",`@&@A$`#_[B3&__\T0O__)`,`$`!&$"LD!``8`&`H M(1``_X,`@B@+)[W_X*^_`!`,``3L`Z!`(8^B``"/HP`$C[\`$`/@``@GO0`@ M)[W_\*^R``BOLP`,K[$`!*^P````P$@A`0"0(0#@6"$`H'`A%,`!``"`4"$` MAQ`K$$``9#0"__\`1Q`K%$``60#@*"$D`@`(+.,!``!`,"$``S`+/`.``@#% -M$`8D8Q9\`$,0(9!$```D`@`@`(8@(0!$.",0X``(``LT`@!'$",`3A`&`.H8 +M$`8D8QP<`$,0(9!$```D`@`@`(8@(0!$.",0X``(``LT`@!'$",`3A`&`.H8 M!`!B4"4`ZU@$`.YP!``+-`(!1@`;,6K__P`.)`)0P``!```!S0``$!(``!@0 M``,<``!D&"4``"@2``````````!P2D@"`&D0*U!```L`:1@C`&L8(0!K$"L4 M0``&)*7__P!I$"M00``$`&D8(R2E__\`:Q@A`&D8(P!F`!M0P``!```!S3'$ @@ -157,7 +157,7 @@ M``!K&"$`:Q`K%$``!B3&__\`:1`K$$``!``%%```:Q@A),;__P`%%```1C`E M`&EP(P``F"$20``$`.[(!@``P"&N6```KED`!`)@$"&/L@`(C[,`#(^Q``2/ ML````,`8(0/@``@GO0`0/`(`_S1"__\D`P`0`$<0*R0$`!@`8#`A$`#_I0"" M,`L4X``*`$L0*R0"``$`1@`;4.```0```",!2U`C)!,``0`+9`(Q:/__`4P`&P`.+`)1 M@``!```!S0``(!(``!@0``,<``!E&"4``&@2``````````!PB$@"`&D0*U!` M``L`:1@C`&L8(0!K$"L40``&)(W__P!I$"M00``$`&D8(R6M__\`:Q@A`&D8 @@ -171,7 +171,7 @@ M`!@0``,<``!D&"4``#`2``````````!P4T@"`&D0*Q!```L`#Q0``&L8(0!K M$"L40``&),;__P!I$"L00``$``\4`"3&__\`:Q@A``\4``!&F"40`/^.`&E0 M(S1"__\D`P`0`$L0*R0$`!@`8"@A$`#_>0""*`L`AA`K$$``!S0"__\``#`A M``"8(1$`_U$`H,@A$`#_30%`P"$`1A`K%$``?#P"`/\D`@`(+,,!``!`*"$` -M`R@+/`.``@"I$`8D8Q9\`$,0(9!$```D`@`@`(4@(0!$.",4X``1`$=X(P$J +M`R@+/`.``@"I$`8D8QP<`$,0(9!$```D`@`@`(4@(0!$.",4X``1`$=X(P$J M$"L40``%`H@!@",`!LQ,___ M`>X0!@#J&`0`8E`E``HL`E&```$```'-`.M8!```,!(``"`0``0D``"%&"4` @@ -183,173 +183,173 @@ M`&`0````````````K!`K``!H$@``````````%$``$`&K(",1A0`,`]`"`G -MO?_0K[``$`"`@"$D!`!`.@*"$00``+`$"( M(5:```&ND0``C[\`)(^T`""/LP`]`#"/H@`` -M`$`@(0P`!L^N8@`$%$#_\0!`B"$,`!FN`F`@(11`_^T`0(@A#``2D`)@("$4 -M0/_I`$"((0P`&=D"8"`A`$"0(1!`_^0D$0`"C[````!`("$,`!G1)`4'(`!` -MB"$D`@<@K@(;[`)`*"$"8"`A#``<@JYR```\`X`"K'-'J!``_]6N8@`()[W_ -M\*^P``"OOP`$#``4GP"`@"$"`"`A#``4K```*"$00``&)`,`%H^_``2/L``` -M`&`0(0/@``@GO0`0#``?*P(`("$`0!@A)@4;<`(`("$40/_U)`8``0P`-X4` -M`````$`8(20%``$40/_O`@`@(0P`%*P`````)`,`%A``_^H``A@*K*0`!`/@ -M``BLX```)[W_H*^S`$P`H)@A```H(:^Q`$2OOP!0K[(`2*^P`$`,`!2L`("( -M(11``!6OH@`PCB(7W!1``"T#H"`A#`!Z=0````"/I@`@CZ4`'#P$@`(DT,0` -M`!`7P@("$"$``I!##`!P="2$"(@"("`A#``)M@)`*"&OH@`P$$``"P.@("$2 -M8``"CZ(`,*YB``"/OP!0C[,`3(^R`$B/L0!$C[``0`/@``@GO0!@#`!Z=0`` -M``"/H@`@`B`@(210Q``,``RQ`@`H(3P$@`(DA`BD`@`H(0)`,"$40/_JKZ(` -M,`P`<'0`````)`(``:XB%]P"("`A#``'5R>E`#"/H@`P4$#_X*X@%^@0`/_> +M`$`@(0P`!L^N8@`$%$#_\0!`B"$,`!G!`F`@(11`_^T`0(@A#``2E`)@("$4 +M0/_I`$"((0P`&>P"8"`A`$"0(1!`_^0D$0`"C[````!`("$,`!GD)`4'(`!` +MB"$D`@<@K@(;\`)`*"$"8"`A#``E`#"/H@`P4$#_X*X@%^@0`/_> M`````">]_^"OL0`4K[``$*^_`!B,@Q?@)`(``0"@B"$`@(`A`Z`H(1!B``NO MH```$B``!JX`%^B/OP`8C[$`%(^P`!`#X``()[T`((^B```0`/_YKB(```P` -M!Y4`````CZ(``!1`__("`"`A#`!1E``````"`"`A#``4K"0%``$0`/_K```` -M`">]_^"OL@`(`*"0(0``*"&OLP`,K[$`!*^P``"OOP`0#``4K`"`@"$D$P`! +M!Y4`````CZ(``!1`__("`"`A#`!2K``````"`"`A#``4L"0%``$0`/_K```` +M`">]_^"OL@`(`*"0(0``*"&OLP`,K[$`!*^P``"OOP`0#``4L`"`@"$D$P`! M`$"((1!```L"`"`A$D```JX`%^BN40``C[\`$(^S``R/L@`(C[$`!(^P```# -MX``()[T`(*X`&QP,``A^KA,;)`P`"A@"`"`A#`!Q7``````D8P#(+&4`R(X$ -M&`@`11`A`$`P(20(```D"0#(#`!Q=`!@."$,`'%<`````"1C`,@L90#(C@08 -M0`!%$"$`0#`A)`@``"0)`,@,`'%T`&`X(8X"``0,`!T8C$0```(`("$,`"D\ +MX``()[T`(*X`&QP,``A^KA,;)`P`"A@"`"`A#`!ROP`````D8P#(+&4`R(X$ +M&`@`11`A`$`P(20(```D"0#(#`!RUP!@."$,`'*_`````"1C`,@L90#(C@08 +M0`!%$"$`0#`A)`@``"0)`,@,`'+7`&`X(8X"``0,`!TKC$0```(`("$,`"E6 M/`6```P`!_8"`"`AKA,7X!``_]$`````)[W_\*^R``BOL0`$K[```*^_``R, M@A?@)!(``0"@B"$`@(`A$%(`"@``*"$2(``"KA(7Z*X@``"/OP`,C[(`"(^Q -M``2/L````^``"">]`!`,`!2L`````#P%@``,`"EL`@`@(0P`<7N.!!@(#`!Q -M>XX$&$`,``LT`@`@(0P`$7<"`"`A#``(E0(`("$D!0`!#``*2`(`("$,``@' -M`@`@(8X"``0,`!T*C$0``*X`%^`0`/_>`````">]__"OL````*"`(:^Q``0` -MP"@A`("((0(`("&OOP`,K[(`"`P`!S8`P)`A#`!1E`(`("$"("`A)`4`"``` -M,"$,`!$9)`<``59```&N0```C[\`#(^R``B/L0`$C[````/@``@GO0`0)[W_ -M\*^Q``2OL````("((0"@@"&OOP`(#``4;20%``$"("`A$@``"SP%``0,`"D\ -M``````(@("$,`!1M```H(8^_``B/L0`$C[````/@``@GO0`0#``I;#P%``00 -M`/_V`B`@(2>]__`D`@`!K((]`!`,`!2P`````#P%@``,`"F&`@`@(0P``````">]__"OL````*"`(:^Q``0` +MP"@A`("((0(`("&OOP`,K[(`"`P`!S8`P)`A#`!2K`(`("$"("`A)`4`"``` +M,"$,`!$=)`<``59```&N0```C[\`#(^R``B/L0`$C[````/@``@GO0`0)[W_ +M\*^Q``2OL````("((0"@@"&OOP`(#``4<20%``$"("`A$@``"SP%``0,`"E6 +M``````(@("$,`!1Q```H(8^_``B/L0`$C[````/@``@GO0`0#``IACP%``00 +M`/_V`B`@(2>]__`D`@`!K((]_]"OM0`4`*"H(20%``&OOP`@K[<` -M'*^V`!BOM``0K[,`#`$`H"$`X)@AK[(`"*^Q``0`P)`A`("((:^P```,`!1M -M/!:``CP0@`(FI``0/!>``@``*"&N$C.`KM,SA`P`:S2N]#.(`J`@(0P`:S0D -M!0`!CB4``(X$,X`\`O_QC*-`$#1"__\`!"1``&(8)#P"``X`@B`D`&08):RC -M0!".)0``CL0SA#P"_X^,HT`0-$+__P`$)0``8A@D/`(`<`""("0`9!@EK*-` -M$(XE``".Y#.(/`+_?XRC0!`T0O__``0EP`!B&"0\`@"``((@)`!D&"6LHT`0 -M`B`@(0P`%&T``"@AC[\`((^W`!R/M@`8C[4`%(^T`!"/LP`,C[(`"(^Q``2/ -ML````^``"">]`#`GO?_PK[```"0&``0`@(`AK[\`!`P`-@X``"@A#`!1O28$ -M'8P00``'`@`@(0P`-;2,10`D#``UN`(`("$,`#7H`@`@(0P`<=`F!!K(C[\` -M!(^P```#X``()[T`$">]__```"@A)`8``Z^P``"OOP`$#``V#@"`@"$,`''" -M)@0:R`P`<+4`````#``U_0(`("$,`#6_`@`@(0P`<+H`````#``(VP(`("$D +M'*^V`!BOM``0K[,`#`$`H"$`X)@AK[(`"*^Q``0`P)`A`("((:^P```,`!1Q +M/!:``CP0@`(FI``0/!>``@``*"&N$CDHKM,Y+`P`;)>N]#DP`J`@(0P`;)]`#`GO?_PK[```"0&``0`@(`AK[\`!`P`-F$``"@A#`!2U28$ +M'9`00``'`@`@(0P`-@>,10`D#``V"P(`("$,`#8[`@`@(0P`]__```"@A)`8``Z^P``"OOP`$#``V80"`@"$,`',E +M)@0:R`P`]`!",I0`H)`/_\#"B``\D0@`G`$,X)`"C M&"0`9Q`A`$,0*Q1```<`8#`AO'$``"1C`!``QQ`A`$,0*Q!`__L`````D*(` -M`"0#`(`P0@#\4$,`!)2C`!0``"`A`^``"`"`$"&4@AQ>5&+__```("&4HP`2 -ME((<7%1B__@``"`AE((<6I2C`!`48O_S)`0``1``__(`````C((:_(Q#```# +M`"0#`(`P0@#\4$,`!)2C`!0``"`A`^``"`"`$"&4@AQB5&+__```("&4HP`2 +ME((<8%1B__@``"`AE((<7I2C`!`48O_S)`0``1``__(`````C((:_(Q#```# MX``(K(,:_(R"&ORLH@```^``"*R%&OPGO?_@)`(``:^P``"OOP`, +MK((`)%*@``&N!Q?`C@(`!`)`*"$,`!K:C$0``!(@``0"("@AC@(`!`P`&MJ, M1```H@`:^!``_XBN`!KT#``(TP(`("$`0(@AD@(:^"8E``0D0@`!HB(``"0" M``.B(@`!)`(`0!``_\2F(@`"D@,:^`)`*"$D8@`!H@(:^))"``&B0P``,$(` -M_J)"``&.`@`$#``:QXQ$```0`/]P)A8=C`P`"*X"`"`A$`#_F*X"&MR/OP`< +M_J)"``&.`@`$#``:VHQ$```0`/]P)A8=D`P`"*X"`"`A$`#_F*X"&MR/OP`< MC[8`&(^U`!2/M``0C[,`#(^R``B/L0`$C[````"`$"$#X``()[T`(">]__"O -ML0`$K[````#`B"$`H(`A)`4``:^_``ROL@`(#``4;0"`D"$"`"`A#``W=`(@ -M*"$"`#`A`@`H(0P`4=@F1!V,`D`@(0P`%&T``"@AC[\`#(^R``B/L0`$C[`` +ML0`$K[````#`B"$`H(`A)`4``:^_``ROL@`(#``4<0"`D"$"`"`A#``WQP(@ +M*"$"`#`A`@`H(0P`4O`F1!V0`D`@(0P`%'$``"@AC[\`#(^R``B/L0`$C[`` M``/@``@GO0`0)[W_\*^_``"0H@`!,$(``A!```8DI_^D#``(UP````"/OP`` -M`^``"">]`!"@H```H*```8R&&^RDH``"`.`H(0P`"8@DQO_\$`#_]H^_```G -MO?_0K[\`(*^W`!ROM@`8K[,`#*^Q``2OL```K[4`%*^T`!"OL@`(C((;[`"` -MF"$DA!V,)%``H`"P`!JN8!M44@```0```]`#!RT!@")`(``:YB';0D<``0#`!Z5P(`("$0 -M0``R`$"((0!`("$``"@A`@`P(0!`D"$,`'"J)C4`8`+V$"JN<1JX`B"@(:YP -M&KP00``5`J"((0+`@"&.9AOLKE0`)*Y5`"BN40`$`D`H(0)@("$,``F(),;_ -M_(YB&^PF$/__`B(H(0)"&"$"HB`A`H(0(21R`%PDE0!<)%0`7!8`_^XDL0!< +M`^``"">]`!"@H```H*```8R&&_"DH``"`.`H(0P`"8@DQO_\$`#_]H^_```G +MO?_0K[\`(*^W`!ROM@`8K[,`#*^Q``2OL```K[4`%*^T`!"OL@`(C((;\`"` +MF"$DA!V0)%``H`"P`!JN8!M44@```0```]`#!RT!@")`(``:YB';@D<``0#`![N@(`("$0 +M0``R`$"((0!`("$``"@A`@`P(0!`D"$,`'(-)C4`8`+V$"JN<1JX`B"@(:YP +M&KP00``5`J"((0+`@"&.9AOPKE0`)*Y5`"BN40`$`D`H(0)@("$,``F(),;_ +M_(YB&_`F$/__`B(H(0)"&"$"HB`A`H(0(21R`%PDE0!<)%0`7!8`_^XDL0!< M)I$`$!K```BN8!K\`L"`(0(@*"$"8"`A#``(UR80__\6`/_[)C$`1"9P&L@, -M`'&T`@`@(0P`<]__"OL````("`(:^_ -M``0,`''0)(0:F`P`<=`F!!J$)`(``:X"&K2/OP`$C[````/@``@GO0`0)[W_ +M`',7`@`@(0P`]__"OL````("`(:^_ +M``0,`',S)(0:F`P`] -M__"OL0`$`("((:X@&K0DA!J$K[\`"*^P```,`''"`*"`(0P`<<(F)!J8$@`` +M`!#D`D`@(28Q__\&(?_M)A`!'(^_``R/L@`(C[$`!(^P```#X``()[T`$">] +M__"OL0`$`("((:X@&K0DA!J$K[\`"*^P```,`',E`*"`(0P`LC@,`.*X@```"0A`JKA$`.*QQ```40/_N -MKB,`!"8$`"0,`'&'```H(0)@$"&/OP`0C[,`#(^R``B/L0`$C[````/@``@G -MO0`@$`#_]R03``(GO?_PK[$`!*^_``BOL```C)``!`P`<+4`H(@AC@0`-(R% +ML@`(K[```#P"@`*OOP`0K[$`!(Q%5TPD@P`T)((`+`"`@"&L@@`PK(,`.*R` +M`"RL@``T``"0(1B@`!0``)@A#`![NB0$``PF4@`!`$"((0!`("$``"@A$$`` +M%R0&``P,`'(-`````#P"@`*,0E=,C@,`.*X@```"0A`JKA$`.*QQ```40/_N +MKB,`!"8$`"0,`'+J```H(0)@$"&/OP`0C[,`#(^R``B/L0`$C[````/@``@G +MO0`@$`#_]R03``(GO?_PK[$`!*^_``BOL```C)``!`P`]`"`,``L3`D`@(1!`__<` M0"@A,$(`#R1"`"LD`__P`$,P)`"C&"0`9A`A`$,0*Q1```<`8"`AO'$``"1C M`!``AA`A`$,0*Q!`__L`````C*,`""0"`!`08@`*``````P`"H,"`"`ACZ(` M`"8Q``$"(A`J%$#_XX^_`!P0`/_=C[(`&`P`"O0"`"`A$`#_]X^B```GO?_P MK[(`"*^P``"OOP`,K[$`!(R1``0D`@`!``"`(0(@("&N(A?8#``*@R8R&JP" -M0"`A#`!QAP``*"$,``ZZ`B`@(2H#``440``.)A```5!@``TF,!J8#`!Q7``` -M```D8P!D+&0`9`!$$"$`0#`A`&`X(0P`<94"0"`A$`#_[P`````F,!J8#`!Q -MT`(`("$,`'&C)B07T`P`<8XF)!?(`@`@(:X@%]@,`''"`````(^_``R/L@`( +M0"`A#`!RZ@``*"$,``Z^`B`@(2H#``440``.)A```5!@``TF,!J8#`!ROP`` +M```D8P!D+&0`9`!$$"$`0#`A`&`X(0P`]_]"OL0`DK[\`+*^R`"BOL``@`*"((8R2``0` M`%`A``!P(1"@`'X``'@AC*T`#(RD`!`QH@`/``(8P`!B&",``QC``D,8(20" M__\0@@`8)'D8>``$$,``1!`A``(0P`!$$",``A"``D(0(8Q$``@D`P`!KZ,` M!!2```X`6!'``&DD`@`& MC<,`!%!B`&<``'@A)BG__(XL`!@!((`A)CC_H!$@`#\D!@`<`29`(24J_Z0E M"``$K4@`!(TK``"10P`.)`7P```+$"L``A$`,&,`[P!B&"6A0P`.CB(``)5# -M``HE9_^D)$+_Y#!"#_\`91@D`&(8):5#``J.0AOLE40`#@`+.`H`1A`C)$+_ +M``HE9_^D)$+_Y#!"#_\`91@D`&(8):5#``J.0AOPE40`#@`+.`H`1A`C)$+_ M_`&"&"L!@Q`+`(4@)#!"#_\`@B`EI40`#I5&``ZM)_^DC4(`/"0#_?\`#2E` M`$,0)#"E`@``#1E"/`3^_S2$__\`11`E,&,``0!$$"0``QX``$,0):U"`#RM M2``HCB,`$##&#_\D`O__)&0`!*U'`""M6``PK4\`4*U.`$P08@`C`89@(ZU$ M`#@!8$@A%6#_PP``,"$"`$@A$2``#`%`@"$E*O^DC4,`/(TK```\`G__-$+_ -M_P!B&"0!8$@AK4,`/*U9`%@58/_VK5``+`)`("$#("@A`P`P(0P`#TL``#@A +M_P!B&"0!8$@AK4,`/*U9`%@58/_VK5``+`)`("$#("@A`P`P(0P`#T\``#@A MCB(`%%!```.N``!4CB(`!*X"`%2/OP`LC[(`*(^Q`"2/L``@`^``"">]`#`D M`G__$`#_W:U"`#@``'@A$`#_F0``<"$,``JD`Z`P(:X@``0"0"`A#``*@P(@ -M*"$0`/_NC[\`+">]_]"OL0`4K[\`(*^S`!ROL@`8K[``$`"`B"$,`'#^C)(` -M!`!`("$,`'$!```H(0(@("$,``L3)E,:F`)@("$,`''"`$"`(0)`("$,`!1M +M*"$0`/_NC[\`+">]_]"OL0`4K[\`(*^S`!ROL@`8K[``$`"`B"$,`')AC)(` +M!`!`("$,`')D```H(0(@("$,``L3)E,:F`)@("$,`',E`$"`(0)`("$,`!1Q M)`4``8X#``@D`@`0`@`H(1!B`!X"("`ACD(7X`(`*"$40``6`D`@(0P`"H,` -M````)B0`)`P`<:H#H"@ACZ(`````@"$00``$`B`@(0P`"Q,``````$"`(58` -M_^N.`P`(#`!QT`)@("$"0"`A#``4;0``*"$0`/_;`B`@(0P`"YX"("`A$`#_ +M````)B0`)`P`]`"`,`'&T)@0:F#P%@``\!X`"/`B``CP+@`(D!``!)FID$"2E -M,.@"(#`A).<(Q"4(6!`E:V08#`!PRR0)#``,`'#DCF1D$!``_^<"0!`A)[W_ -M\*^P``"OOP`$C((;]`"`@"&,0@!$%$``!20$.@"/OP`$C[````/@``@GO0`0 -M)`(`!PP`>E>N`AL`)$("`"0#_@``0Q`DK@(=Q!``__2N`AL$)[W_X*^_`!RO -MM@`8K[4`%*^T`!"OL@`(K[$`!*^P``"OLP`,C((;[`"`B"$DD!AX)%4`7`"U -M`!H\`H`"4J```0```]`"`,`',7)@0:F#P%@``\!X`"/`B``CP+@`(D!``!)FISL"2E +M,.@"(#`A).<.5"4(9[`E:W.X#`!R+B0)#``,`')'CF1SL!``_^<"0!`A)[W_ +M\*^P``"OOP`$C((;^`"`@"&,0@!$%$``!20$.@"/OP`$C[````/@``@GO0`0 +M)`(`!PP`>[JN`AL`)$("`"0#_@``0Q`DK@(=R!``__2N`AL$)[W_X*^_`!RO +MM@`8K[4`%*^T`!"OL@`(K[$`!*^P``"OLP`,C((;\`"`B"$DD!AX)%4`7`"U +M`!H\`H`"4J```0```L)E(``0)"$"H40/_X`A6`(1``_]P`````$`#_WB03``(GO?_`K[``,*^_ -M`#BOL0`TC((;](S+```D#``!C$,`"`%L$`0`@(`A`&(8)!1@`"D`H$@A+*(` +M)C`:A`P`]__"OL@`( +MH``D$0``!J^@`"@5(``6`````(X"'<@D0AP`KZ(`*`(`("$,`$MR`Z`H(0!` +M&"&.`AOXC$(`:`!B$"M40``&KB,`)(^_`#B/L0`TC[``,`/@``@GO0!`#`!S +M%P(@("$0`/_YC[\`.%$L_^R.`AW()`+_]P%"$"00`/_IKZ(`!">]__"OL@`( MK[$`!*^P``"OOP`,`("`(0``D"$DD1G(C@,:<"0"``$"0A`$`&(8)`)`*"$4 M8``+`@`@(292``$N0@`&%$#_]B8Q`!R/OP`,C[(`"(^Q``2/L````^``"">] -M`!`,`$J'``````(`("$"0"@A#``-%@(@,"$0`/_P)E(``2>]__"OL@`(K[$` +M`!`,`$N1``````(`("$"0"@A#``-%@(@,"$0`/_P)E(``2>]__"OL@`(K[$` M!*^P``"OOP`,`("`(0``D"$DD1AXC@(:<"0#``$"0Q@$`$,0)%!```DF4@`! -MC@(;]`)`*"$"`"`AC$(`"`!#$"040``+)`8`!"92``$N0@`&%$#_\"8Q`#B/ -MOP`,C[(`"(^Q``2/L````^``"">]`!`,`$JV)E(``0(`("$,`!#@`B`H(1`` -M__(N0@`&)[W_\*^_``2OL```C*8`.`P`2[4`H(`AC@(`+(^_``2/L```K$`` +MC@(;^`)`*"$"`"`AC$(`"`!#$"040``+)`8`!"92``$N0@`&%$#_\"8Q`#B/ +MOP`,C[(`"(^Q``2/L````^``"">]`!`,`$O`)E(``0(`("$,`!#D`B`H(1`` +M__(N0@`&)[W_\*^_``2OL```C*8`.`P`3,(`H(`AC@(`+(^_``2/L```K$`` M0`/@``@GO0`0)[W_L*^U`#2OM``PK[,`+*^_`$"OMP`\K[8`.*^R`"BOL0`D -MK[``((RR`!0`H*@A`("8(1)``&XDE`2`CD(`/`1!``0``+`ACD(`(!!``.8` +MK[``((RR`!0`H*@A`("8(1)``&XDE`2`CD(`/`1!``0``+`ACD(`(!!``.H` M0)`ACD(`4%!```6.40`LC$(``%!```&N0`!0CE$`+(XB`$`40``')C<`0`)@ -M("$,`$VK`B`H(20#``T00P!9C[\`0`)@("$,`!"&`B`H(11``,\D`@`!CB,` -M0*Y@&QP08@`&CE``4%(```6.H@`(ZB`#"50P`(EF(<7E!B``.50P`&$`#_VB5"`!"68AQ<%&+_UR5"`!"50P`$ -MEF(<6E1B_],E0@`0CH(!+"1"``$0`/_TKH(!+`*@*"$,`!`!`B`P(5!`_X6. -ML@`4$`#_/8ZB`!P0`/^#KB``0(YB%]A00/^!C[\`0`P`<:,F9!JL$`#_?8^_ -M`$",@P`4$&``""0$``&,8@`\!$,`!0``("&,8@`@$$```@```````"`A`^`` -M"`"`$"$GO?_PK[$`!*^_``@`@(@AK[```(XB&\P00``4)(08>`P`#JX````` -M)B08L`P`#JX``H`K)B08Z`P`#JX``H`*)B09(`P`#JX``H`*4$```0``@"$" -M`!`AC[\`"(^Q``2/L````^``"">]`!`,``ZN`````!``__<``H`K)[W_\*^P -M``"OOP`$#`!PM0"`@"&.`AO,)@48>!!```L"`"`A#``-K0`````F!1BP#``- -MK0(`("$F!1CH#``-K0(`("$F!1D@`@`@(0P`#:T`````#`!PN@````"/OP`$ -MC[````/@``@GO0`0C*<`*```2"&0X@`!,$(`!!1``!",J``LD.(`%C!#``]4 -M8``-C*(`/)4"`$8``"`A``(1`J#B`!>1`@!',$(`#P`"$0``8A`EH.(`%@/@ -M``@`@!`AC*(`/``"%H(P0@`!5$``#Y#B``&5"0!&D.,`%C$B``\``A$`,&,` -M#P!B&"4`"1$"H.,`%J#B`!>,H@`\/`,$``!#$"6LH@`\D.(``3!"``000/_I -M`2`@(8T&`"!0P/_F`2`@(8S(`"PD!/_PC,<`*"4#``@P8@`/)$(`)P!D&"0` -M1"@D`&40(0!#$"L40``'`&`@(;QQ```D8P`0`(40(0!#$"L00/_[`````(S" -M`#P``A:",$(``51```Z0X@`!D.,`%C$B``\``A$`,&,`#P!B&"4`"1$"H.,` -M%J#B`!>,P@`\/`,$``!#$"6LP@`\D.(``3!"``140/_8C08`(!``_[T!("`A -M)[W_X*^S``P`P)@AK[4`%*^T`!"OL0`$K[```*^_`!BOL@`(`("@(0"@B"$, -M`'"U``"H(1)@`$("8(`AC@(`/``"%D(P0@`!%$``58X2`%`20`!4`H`@(8Y" -M`%000`!1`````!*@`$R.`@`LC$,``(Q"`""NHP``KJ(`((X&`"PF1`!<`@`H -M(:S``""LP```#`!1V`````".0@!X)$(``:Y"`'@2H``"`F"`(8ZP`"!6`/_C -MC@(`/!)@`"$`````EB,`-%!@`!&.(@`8CF0`*)""`!8P10`/4*``"Z8@`#0` -M`Q$"H((`%Y(B`#60@P`!,$(`#P`"$0``HA`E-&,`"*"#``&@@@`6CB(`&%1` -M`!VL4P`@)`(``:XB`"RN,P`4KC4`&`````^.(@`L5$``$(YF`"2.)0`D#`!* -MG`*`("$,`'"Z`````(^_`!B/M0`4C[0`$(^S``R/L@`(C[$`!(^P`````!`A -M`^``"">]`"".)0`D#`!*E0*`("$0`/_MKB``+(XC`!B.8@`DK&(``!``_^2N -M-0`8$`#_N(Q3`"`"@"`A#``-H0(`*"&.@ALX4$``&(XB`!Q2```6CB(`'(X" -M`#P``A9",$(``11```D"@"`ACB8`&(XG`#".*``D#`!*_@(`*"%40``*CB(` -M'`*`("$,`"EL/`6``(X"`#`"@"`A/`6```P`*3RN(@`PCB(`'"1"``$20``* -MKB(`'(XB`"2.1`!0``(0P`!2$"&40P`P)(0``:Y$`%`D8P`!I$,`,!``_Y>. -M%0`L)[W_\*^R``BOOP`,K[$`!*^P``",H@!4%$``!P"`D"$DL0!]`!",P@`LC,4` -M6`)`("&,4``@K$```*Q``"`,``]+```X(8XB`!P"`#`A)$+__Q1`__2N(@`< -M$`#_ZZX@`!@GO?_@K[0`$*^S``ROL0`$K[\`%*^R``BOL```C-``,(RB`"2, -MPP!`CA(`4``"$,``H(@A`D(H(20"``(`@*`A$&(`.22S`#".(P`4C&(`/`1" -M`"V,8@`@C@(`/#P#`@".!P`L`$,0):X"`#R.(@`] -M`""L8````&`H(:XB`!0"@"`A#``*8ZQ@`"`0`/_.C@(`/)2C`#".0@!4)`8` -M`:YF``0`0Q`AKD(`5*9C``*.`P`\/`6'_S2E__\``Q;",$(`#R1"``$P0@`/ -M``(6P`!E&"0`8A@EK@,`/(R"&V@``Q[",&,`#P!#$"M40``%CD(`5(R"&K14 -M0``1C((%@(Y"`%268P`")`7__R1"__^N0@!4CH(%A"1C__^F8P`")$(``0P` -M5NZN@@6$`H`@(0P`#]X"0"@A$`#_QB0"__\D0@`!K((%@(X"`#P``A;",$(` -M#Q!&``8`````C@,`*)!B``$T0@`($`#_DJ!B``$,``[T`@`H(1``__BF(@`T -M)[W_\*^Q``2OL```K[\`"`"@@"&.`P!`C*4`,"0"``$`@(@A$&(`3HRD`%". -M(AMH$$``1@``$"%0@`!%C[\`"(RB`"B00@`!,$(`!!!``"6.`P`@$&``/0`` -M$"&,<``LC@(`,(Q"`"B00@`6,$(`#Q!``#LF!``(,((`#R0#__`D0@`G`(,@ -M)`!#*"0`A1`A`$00*Q1```<`@!@AO)$``"2$`!``91`A`$00*Q!`__L````` -M`B`@(0(`*"$,`$Z')`8``1!``"$D`O__C@(`,(Q"`"B00@`!,$(`!!1`_]V. -M`P`@$&``&0``$"&,<``L)`3_\"8#``@P8@`/)$(`)P!D&"0`1"@D`&40(0!# -M$"L40``'`&`@(;QQ```D8P`0`(40(0!#$"L00/_[``````(@("$"`"@A#`!. -MAR0&``$D`___``(8"P!@$"&/OP`(C[$`!(^P```#X``()[T`$!``__H``!`A -M)[W_T*^Q`"0`H(@AK[(`**^P`""OOP`L#`!PM0"`D"&.,``4$@``&0````". -M0@2PCD,$M(X$`%0D8P`!+&4``0!%$"&N0@2PKD,$M!2``!]`!`0`/_JK@(`4`P`<9P` -M````)`,``11#__,D!``"$`#_W``````GO?_PK[````"`@"$DA``\K[\`#*^Q -M``2OL@`(#`!QC@"@B"$,`'"U`````(X%`$2,HP``$&``'(RB``2L8@`$C*(` -M!"8$`%2,L@`($B```ZQ#``",H@`,KB(``(X"`%`D`___K*```*RB``2.`@!0 -MK*,`"*X%`%"L10``#`!QHZR@``P,`'"Z``````)`$"&/OP`,C[(`"(^Q``2/ -ML````^``"">]`!`0`/_EK@(`2">]_^"OOP`4K[``$(R0``2OH```)@0`/`P` -M<:H#H"@ACZ(```(`("$40``()Z4`!(^B``!40/_X)@0`/(^_`!2/L``0`^`` -M"">]`"`,`!%+`````!``__>/H@``)[W_\"2E__^OL0`$K[\`#*^R``BOL``` -M+*(`&0"`B"$00``4C)(`!#P#@`(`!1"`)&,(X`!#$"&,0@```$``"`````", -MA```#``;"B0%`!$`0(`A)D8$@`!`("$D!0$X#``;/@````".)```#``:O0(` -M*"&/OP`,C[(`"(^Q``2/L````^``"">]`!```#`A`D`@(0P`+H$D!0`"CB0` -M``P`&PHD!0`2`$"`(29&!(@`0"`A$`#_ZB0%``B,A```#``;"B0%`!..)``` -M`$"`(20"`@`0`/_EK@(```P`$ZB,A``$$`#_Y(^_``P,`!/`C(0`!!``_^"/ -MOP`,)[W_T*^S`!ROOP`@K[(`&*^Q`!2OL``0C)(`!`"`F"$#H"@A`F`@(0P` -M$4LF41?L`B`@(0P`<<(`0(`A`D`@(0P`%&TD!0`!CZ8```(`*"$,`!&.`F`@ -M(0)`("$,`!1M```H(0P`<=`"("`A$`#_[0.@*"$GO?_@K[0`$*^S``ROOP`< -MK[8`&*^U`!2OL@`(K[$`!*^P``",D0`$``"@(0``F"&.(A?@5$``"HXB%]PF -M,!K(#`!QP@(`("$,`''0`@`@(8XB%^!00/_Z)C`:R(XB%]P00``X`````"8V -M&N`,`''"`L`@(8XC'*0D`@`#$&(`-0`````D!0`!`B`@(0P`%&TF,AK()C4: -MA`P`<]__"OOP``C*(`!`"@("$``#`A -MC$(7Q"0%`!@40``$```X(8^_```#X``()[T`$`P`$1D`````$`#_^X^_```G -MO?_P`*`@(0``,"$D!0`9K[\```P`$1D``#@AC[\```/@``@GO0`0)[W_\*^_ -M``BOL0`$K[```(R0``0,`'%9`("((0!`("$,`'%7)@4;7(X$&UP\!8``)@<8 -M""8(&!`"(#`A#`!Q822E20P,`'%<`````"1C`,@L90#(C@08"`!%$"$D"``` -M)`D`R`!`,"$,`'%T`&`X(8X$&UP\!8``)@<80"8(&$@"(#`A#`!Q822E24P, -M`'%<`````"1C`,B.!!A`+&4`R`!%$"$`0#`A)`@``"0)`,@,`'%T`&`X(8^_ -M``B/L0`$C[````/@``@GO0`0)[W_X"2"`$0D@P!,K[$`!`"`B"&OOP`8K[4` -M%*^S``ROL@`(K[0`$*^P```DA``\KB(`2*XC`%```"@AKB``1*X@`$PF,P!4 -M#`!QAXXT``0"8"`A#`!QAP``*"$``*@A``"0(0P`>EH).<)1"4(9+@E:VS``B`P(20)"``,`'#+ -M)`0``8X$;+@,`'#D/!"``CP%@``\!X`"/`B``CP+@`(F"GE@)*5'-"3G"50E -M"&U@)6MY:"0$``$"(#`A#`!PRR0)#``,`'#DC@1Y8`P`$ET"("`A`J`0(8^_ -M`!B/M0`4C[0`$(^S``R/L@`(C[$`!(^P```#X``()[T`(!``__4D%0`")[W_ -MT*^P`!``H(`AK[\`(*^S`!ROL@`8`("8(:^Q`!0,`'%"KZ``!`P`*.@"`"`A -M%$``$B02``$,`'%0`F`@(20"``$20@`)``````)`$"&/OP`@C[,`'(^R`!B/ -ML0`4C[``$`/@``@GO0`P#`!Q20)@("$0`/_V`D`0(0(`("$#H"@A#``H[2>F -M``0`0(@A,$(``11``%`"`"`A,B(`(%1``$:.`@2$,B((`!1``#X"`"`A,B(` -M0!1``#<"`"`A/`(`!`(B$"040``O`@`@(3(B`(`00``2`````(X"&\Q00``B -MC@48G(^B``0P0@`(5$``&HX%&42/H@`$,$(`!%1``!*.!1D,CZ(`!#!"``)4 -M0``*C@48U"0"_W\"(H@D$B#_Q:^@``".`AV$)!(``P!1$"40`/_`K@(=A`P` -M2IP"`"`A$`#_]20"_W\,`$J<`@`@(1``_^V/H@`$#`!*G`(`("$0`/_ECZ(` -M!(^B``0`LA@$`$,0)!!`_^D`````$`#_[@`````,`"EL/`4`!!``_]`R(@"` -M#``I;"0%`$`0`/_(/`(`!`P`2@HD!0`!)`+W_Q``_[\"(H@D`@`@(20%`"`D -M0@`!#``I;*X"!(00`/^V,B((``P`*6PD!0`!$`#_KS(B`"`GO?_@K[0`$*^R -M``BOL```K[\`%*^S``ROL0`$C,,] -M`"`,`#>``````%1```..!``$$`#_Z0)3D"4``#`A```X(0P`$1DD!0`#4$#_ -MY`)`*"$0`/_A`E.0)2>]__"OL```K[\`!(R"%^`00``/`("`(8R"%]P00``, -M)`(``HR#'*008@`))`(``1!B``B/OP`$#`!PM0`````,`##@`@`@(0P`<+H` -M````C[\`!(^P```#X``()[T`$">]_]"OL0`DK[\`+*^R`"BOL``@C((7X!!` -M`"8`@(@AC((7W!!``",D`@`"C(,)`(``1``_]RN(AL<)[W_X"0#``&OLP`,K[(`"*^Q``2O -ML```K[\`$`"@D"$`P)@A`("`(1"C`$8``(@A4*``,(R"'*0D`@`"$*(`$R0" -M``,0H@`,`````%(@``&N$ARD5F```:YQ``"/OP`0C[,`#(^R``B/L0`$C[`` -M``/@``@GO0`@#``4K"0%``(D$0`6$`#_\0`"B`H,`"EL/`6```(`("$,`!2L -M```H(201`!8"`"`A#``(E0`"B`HD!0`!#``*2`(`("&.`@`$#``="HQ$```, -M`%&4`@`@(0(`("&N`!?@#``I/#P%@``"`"`A#``4K"0%``$0`/_7`````!!# -M``D``````@`@(0``*"$,`!2L`````%1`_\\D$0`6$`#_S0````",@A?@4$#_ -M]P(`("&,@@`$#``=&(Q$```,`''0)@0:X!``__`"`"`AC((7X%1```2,@@`$ -M`@`@(1``_^LD!0`!#``="HQ$```,`''")@0:X!``__D"`"`A)[W_\*^P```P -ML`#_K[\`#*^R``BOL0`$``"0(0P`<+4`@(@A#`!Q-``````2```:CB(]`!`,`#3E)`8``8X#%]PD -M$@`6$&``!``"D`J.`A?@$%$`&3P%@``60/_O)`(``8X#'*A08@`/C@(%)`8``1!```0`0)`A)!(`%A9` -M_[X"0!`A`@`@(1``_]]__`D@@`4 -M)(,`'*^R``BOL```K[\`#*^Q``0`@(`AK((`&*R#`""L@``4K(``'```D"$, -M`'I7)`0`#`!`B"$2(``1)`(``@(@("$``"@A#`!PJB0&``R.`@`@)E(``2I# -M``*N$0`@KB```*XB``048/_PK%$``"8$``P,`'&'```H(0``$"&/OP`,C[(` -M"(^Q``2/L````^``"">]`!`GO?_PK[\``(R&`!R,R```$0``$0"`."&,P@`$ -MK0(`!(SB`!B,PP`$).0`#*S"``2,X@`8K&@``*S%``BLP```K.8`&`P`<:.L -M1@``C[\```/@``@GO0`0C,(`!!``__"L@@`@)[W_\*^Q``0`@(@A)(0`#*^_ -M``@,`'&.K[````P`<+4`````CB0`%(R%```0H``3C((`!*RB``2.(@`@C(,` -M!(R0``BL@@`$CB(`(*QE``"N)``@K(```*R```@,`'"ZK$0```(`$"&/OP`( -MC[$`!(^P```#X``()[T`$!``_^ZN(@`8,*8`#R>]_?`D`O_P),,`3Z^T`@`` -M8A@D`*"@(0"B*"0`HQ`AK[$!]*^_`@ROM@((K[4"!*^S`?ROL@'XK[`!\`!% -M$"L`@(@AC),`!(R6``"OH`"TKZ``H!1```<`H"`AO+$``"2E`!``@Q`A`$40 -M*Q!`__L`````CH,``"QB`$%40``1CH(`#`!F$"$D0@`/)`/_\`!#*"0"@Q@D -M`&40(0!#$"L40``'`&`@(;QQ```D8P`0`(40(0!#$"L00/_[`````(Z"``P4 -M0`.[CI``!```J"$F!?__+*(`0Q!``!L\`X`"``40@"1C"80`0Q`AC$(```!` -M``@`````)Z4`H">F`*0,`!MH`H`@(0*`("$GI0"@#``;:">F`*@"@"`A)Z4` -MH`P`&V@GI@"L`H`@(2>F`+`,`!MH)Z4`H`(@("$"8"@A#``'PR>F`+02H``' -M`L`@(8Z"``@"H"@AKJ(`"(^B`+0,`!J]KJ(`#(^_`@R/M@((C[4"!(^T`@"/ -MLP'\C[(!^(^Q`?2/L`'P`^``"">]`A`"@"`A)Z4`H`P`&V@GI@"XCZ8`N`(@ -M("$"8"@A#``&\">G`+00`/_D``````)@("$,`%>0)Z4`M!``_]\``````H`@ -M(2>E`*`,`!MH)Z8`O(^E`+P"8"`A)Z8`P```."$,`%!<)Z@`Q(^E`,`,`!LW -M`J`@(8^B`,`00``1CZ4`O`*@("$GI0#(#``;5R>F`,R/I0"\CZ<`R`)@("$G -MI@#0#`!07">H`,2/I0#0`J`@(0P`&V$`````$`#_OP`````"8"`A)Z8`P">G -M`-0,`%!<)Z@`Q(^E`-0"H"`A#``;-P`````0`/^T`````">E`*`GI@#8#``; -M:`*`("$"@"`A)Z4`H`P`&V@GI@#F`.B/ -MI0#8CZ<`Z`)@("$0`/_U```P(0*`("$GI0"@#``;:">F`.R/I0#L`F`@(2>F -M`/```#@A#`!8(2>H`/2/I0#P#``;-P*@("&/H@#P4$``#H^E`.P"H"`A)Z4` -M^`P`&UF`/`GIP$`#`!8(2>H`/2/I0$`$`#_N@*@("$"("`A)`4``0``,"$, -M`!$9```X(1``_VH``````F`@(0P`!O,GI0"T/`2``@P`<'0DA`ET$J#_:X^_ -M`@P,`"YR`F`@(0*@("$0`/^F`$`H(0)@("$,``E`+00`/].`````">E`*`GI@$$ -M#``;:`*`("$"@"`A)Z4`H`P`&V@GI@$(`H`@(2>E`*`,`!MH)Z8!#`*`("$G -MI0"@#``;F`1"/I0$$CZ8!"(^G`1`,`%#?`F`@(1``_S<`````)Z4`H">F -M`10,`!MH`H`@(0*`("$GI0"@#``;:">F`1@"@"`A)Z4`H`P`&V@GI@$E`*`,`!MH)Z8!/(^E -M`3P"8"`A#``4$">F`+00`/\#``````*`("$GI0"@#``;:">F`42/I0%$#``' -MW0)@("$0`/[Z`````">E`*`GI@%(#``;:`*`("$"@"`A)Z4`H`P`&V@GI@%, -MCZ4!2(^F`4P,``@6`F`@(1``_NP`````)Z4`H">F`5`,`!MH`H`@(0*`("$G -MI0"@#``;:">F`50"@"`A)Z4`H`P`&V@GI@%8`H`@(2>E`*`,`!MH)Z8!7(^E -M`5"/I@%4CZF`6`,`!MH`H`@ -M(0*`("$GI0"@#``;:">F`60GL``0`H`@(2>E`*`,`!MR)Z8!:`(`("$``"@A -M#`!PJB0&`!R/HP%DCZ(!:)>E`6("8"`A`@`P(:^B`!2OHP`D#`!/@*^C`!P0 -M`/ZX``````*`("$GI0"@#``;:">F`6R/I@%L`F`@(0P`3\@``"@A$`#^K@`` -M```,`!VR`F`@(1``_JH``````H`@(2>E`*`,`!MH)Z8!<(^E`7`,`"F>`F`@ -M(1``_J$`````)Z0`,```*"$,`'"J)`8`!@*`("$GI0"@#``;:">F`70"@"`A -M)Z4`H`P`&V@GI@%X`H`@(2>E`*`,`!MH)Z8!?`*`("$GI0"@#``;F`8"/ -MI@&`EZ4`-```@"&4QP`4E,0`!"3#``@XX@`'$*0`,P!B@`L`P(@ACZ,!="QB -M``040``8``,0P`!#$"$``A#``$,0(P`"$(`"8A`A)$/[F"0"``<0X@`B)`(` -M!*1B`18D`@`#$.(`&B0"`!`0X@`8)`(`$5#B`!>48@$6).+__BQ"``(40``" -M)`0`""0$``2D9`$8#``(E0)@("&.8AM4`F`@(0(@,"$D0@`!KF(;5(^E`72/ -MJ`%X#``IO`(`."$,``A^`F`@(1``_ED`````E&(!%B1"``00`/_HI&(!%J1@ -M`1@0`/_KI&`!%I>C`#*4P@`"%&+_S`#`B"&7HP`PE,(``!1B_\<``(@A$`#_ -MQX^C`70GI0"@)Z8!A`P`&V@"@"`A`H`@(2>E`*`,`!MH)Z8!B`*`("$GI0"@ -M#``;:">F`8R/IP&,CZ4!A(^F`8@,`"P_`F`@(8^C`80``A0```(D`RQB``04 -M0/XQ``,0P`!#$"$``A#``$,0(P`"$(`"8A`A$`#^*J1$_*P"@"`A)Z4`H`P` -M&V@GI@%`CZ4!0`P`5W\"8"`A$`#^(0`````GI0"@)Z8!D`P`&V@"@"`A`H`@ -M(2>E`*`,`!MH)Z8!E`*`("$GI0"@#``;:">F`9@"@"`A)Z4`H`P`&V@GI@&< -M)Z4`H">F`9P"@"`A#``;:(^P`9P"@"`A)Z4`H`P`&W(GI@&@CZ8!E(^G`9B/ -MJ`&@CZD!D`)@("$"`%`A#`!0$@``*"$0`/W^`````">E`*`GI@&D#``;:`*` -M("$"@"`A)Z4`H`P`&W(GI@&HCZ4!J`P`+2("8"`A$`#]\0`````GL``X`F`@ -M(0P`+>T"`"@A`J`@(0(`,"$D!0`(#``;/@`````0`/WF``````P`+@0"8"`A -M$`#]X@`````D`@`"KF(;L`P`+A("8"`A$`#]W``````GI0"@)Z8!K`P`&V@" -M@"`A`H`@(2>E`*`,`!MH)Z8!L">E`*`GI@&P`H`@(0P`&VB/L`&P`H`@(2>E -M`*`,`!MR)Z8!M(^C`:PD`O__$&(`)0`#$,``0Q`A``(0P`!#$"./I0&T``(0 -M@`)B$"$D1@`0`*88)3!C``,D1``($&``'R2G`"``X!@AB*(``)BB``.(IP`$ -MF*<`!XBH``B8J``+B*D`#)BI``^HP@``N,(``ZC'``2XQP`'J,@`"+C(``NH -MR0`,N,D`#R2E`!`4H__N),8`$("B``"@P@``#`!2Q0(`*"$6`/VACZ4!M`P` -M+BX"8"`A$`#]G0````",H@``C*,`!(RH``B,J0`,K,(``*S#``2LR``(K,D` -M#"2E`!`4I__V),8`$!``_^H``````H`@(2>E`*`,`!MH)Z8!N(Z"``P00``? -MCZ,!N"0"``408@`()`(`!!1B_80"8"`A```P(0P`+H$D!0`$$`#^(0*@("$" -M8"`A)Z8`0`P`+H$D!0`%CZ(`0">F`%@"H"`AKZ(`6(^B`$0D!0`4KZ(`7(^B -M`$BOH@!@CZ(`3*^B`&27H@!2IZ(`:)>B`%80`/^"IZ(`:H^E`;@"8"`A#``N -M@0``,"$0`/UE``````P`+PX"8"`A$`#^`P*@("$GI0"@)Z8!O`P`&V@"@"`A -M`H`@(2>E`*`,`!MH)Z8!P(^E`;R/I@'`#``RH0)@("$0`/U3``````P`,XT" -M8"`A$`#]3P`````"@"`A)Z4`H`P`&V@GI@'DCZ4!Y`P`,\$"8"`A$`#]1@`` -M```"@"`A)Z4`H`P`&V@GI@'HCF8<_(^E`>@,`#,5`F`@(1``_3RN8AS\)Z4` -MH">F`30,`!MH`H`@(0*`("$GI0"@#``;:">F`3B/I0$TCZ8!.`P`-@4"8"`A -M$`#]+@`````GI0"@)Z8!+`P`&V@"@"`A`H`@(2>E`*`,`!MH)Z8!,(^E`2R/ -MI@$P#``V#@)@("$0`/T@``````P`2'\"8"`AKF(%L"9E&W`,`#KG`F`@(1`` -M_1@`````)[`!Q`*`("$GI0"@#``;:`(`,"$"@"`A)Z4`H`(`,"$,`!MHE[(! -MQB>E`*`GI@'(`H`@(0P`&VB7L0'&`H`@(2>E`*`,`!MH)Z8!S`*`("$GI0"@ -M#``;:">F`=`"@"`A)Z4`H`P`&V@"`#`A`@`P(0*`("$GI0"@#``;:(^P`<2/ -MIP'(CZ@!S(^I`="/JP'$)Z(`M`)@("$"0"@A`B`P(0(`4"&OH@``#`!7EZ^@ -M``00`/SJ``````P`.F<"8"`A$`#\Y@`````"@"`A)Z4`H`P`&V@GI@'4CZ4! -MU`P`0=<"8"`A$`#\W0`````"@"`A)Z4`H`P`&V@GI@'8CZ(!V`*`("$GI0"@ -M``*`P`("@",,`!MH)Z8!W``0B("/H@'<`G&((28Q&E`*"N -M(@`$#``;:">F`=R/H@'<`H`@(2>E`*"OH@"`)Z8!W`P`&VBN(@`(CZ(!W`*` -M("$GI0"@KZ(`A">F`=P,`!MHKB(`#(^B`=P`$(#``H`@(:^B`)`GI0"@KB(` -M$">F`=P,`!MH`G"`(280&'B/H@'F`20"@"`A#``;:(^P`20" -M@"`A)Z4`H`P`&W(GI@$HCZ8!*``0$,``4!`CC,,````"$(``4Q`AK$,9R(S# -M``0D0AG()`<``:Q#``2,PP`(`@F`>"/HP'@`F`@(0`#$,``0Q`C``(0P`!3$"$, -M`$J'C$48G!``_&T``````H`@(2>E`*`,`!MH)Z8![)>B`>X0`/QFIF(;\`+` -M("$,`!L*`@`H(11`_$,`0*@A)`(``A``_&:OH@"T)[W_\*^Q``2OOP`(`("( -M(0P`]__"OL@`(K[$`!*^P``"OOP`,`("`(0P`%4,\ -M$H`#/`6``#P'@`(\"(`"/`N``P!`B"$F2HH()*5F;`(`,"$DYPJ0)0AZ""5K -MBA`D!``!$$``""0)$``"(!`AC[\`#(^R``B/L0`$C[````/@``@GO0`0#`!P -MRP`````,`'#DCD2*"!``__4"(!`A)`(``:R"`#`\`H`"K$5$1#P"@`*L140\ -M`^``"```$"$GO?_0K[0`(*^R`!BOL0`4K[``$*^_`"0\$(`"K[,`'(X%,N`\ -M!H``/`>```"`B"$DQFI0```@(23G:K@GJ@`!)Z@`!`P`66L#H$@A/`*``HQ4 -M1$`\`H`"C$9$.(X#,N"3H@``CZ4`!*QQ``"@8@`(K&4`!).B``&.!#+@``"0 -M(:""``F.`C+@K$8`$*Q4``P\$X`"CG`RX`P`>E<"@"`ACF,RX``2B(`",(`A -MK@(`%`(CB"&.)``4#``;'B92``$J0@`"5$#_\SP3@`*.9#+@#``:VB02``\\ -M$(`"C@(RX"92__\,`'I7C$0`#(X$,N`,`!KW`$`H(09#__@\$(`"C@(RX(^_ -M`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_T#"B``\D0@!-)`/_ -M\*^R`!@`H)`A`$,H)`)#&"0`91`A`$,0*Z^Q`!2OOP`@`("((:^S`!ROL``0 -M%$``!P!@("&\<0``)&,`$`"%$"$`0Q`K$$#_^P````"20@`!DD0``)(C`$`0 -M@P`2,%,``8XC`#B.(@`\K&```(XD`#0D0@`!$(``!:XB`#P,`!LIC)```!8` -M__T"`"`AKB``1*X@`#2B(`!`DD(``!1``$(`````DD(``%1```6.(@!$KC(` -M-*XR`#BN(`!$CB(`1)9#``*.)``X`$,0(:R2``"N(@!$%F``"ZXR`#B2(@!` -M)$(``:(B`$"/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`PKD```(XC``". -M(@`THB``0"1D`"0D4@`$KB``-`.@*"&,<``$#`!QJJ^@``".0P`()`(`$!!B -M``J/H@``5$``"8XB``".`A?8)`,``5!#``6.(@``C@(:M!!#`` -M`D`H(0P`<=`"`"`A$`#_TH^_`"`,`!LI`D`@(1``_\Z/OP`@)[W_\*^_```0 -MX``-,*(`_Q!```8`P"@A#``:(@````"/OP```^``"">]`!",A```#``5:P#` -M*"$0`/_ZC[\``!!```4`P"`A#``;*0`````0`/_TC[\```P`&QX`P"`A$`#_ -M\(^_```GO?_P,*(`_Z^_```40``&`,`H(0P`&Q8`````C[\```/@``@GO0`0 -MC((```P`":*,1``$$`#_^H^_```GO?_PK[\``(RG``",A``$`*`P(0P`6@0` -M`"@AC[\```/@``@GO0`0)[W_\*^_```\`H`"C$(RY`"@,"$00``+D(4`,Y3" -M``(D1P`$#`!:!(R$``2/OP``)`0``3P#@`*L9#+D`^``"">]`!`0`/_W)`<' -M("2"`!PGO?_PK(``)```*"&OOP``#`!QAP!`("&/OP```^``"">]`!`GO?_P -MK[````"`@"$DA``]__"OOP`$K[````P`&N0`H(`AK%``!(^_``2/L``` -M)`,`(*Q#```#X``()[T`$">]__"LH``$K[\```P`&O<`````C[\```/@``@G -MO0`0)[W_\*^_```\`H`"C$(RX`"`,"$``"@A#`!9[HQ$``2/OP```^``"">] -M`!`GO?_PK[\``#P"@`*,0S+@`(`P(3P"B(B090`SC&0`!#1"B(@,`%GNK,(` -M`(^_```#X``()[T`$(R"````@A`AK$4``(R"```D0@`$`^``"*R"```GO?_P -MK[\`"*^Q``2OL````("((8R$````H(`A)`+__`(D("$`P"@AK)````(`,"$D -MA``$)A```PP`<)T"`H`DCB(``(^_``@`4!`A)$(`!*XB``"/L```C[$`!`/@ -M``@GO0`0C(,``"0"`@``0Q`C$*```@"#("&LI```5,```:S"```#X``(```` -M`(R#```DI0`#)`+__`"B*"0`91@A`^``"*R#```0H``"```8(8RC````@Q`A -MC$(`(!"@``(D8P`$K*,```/@``BLP@``C*(```""("$0P``")(0`(*S$```# -MX``(`````">]__"OOP`$K[````P`:_(`@(`A)`,``:X#``RN`@``K@``"*X` -M``2/OP`$C[````/@``@GO0`0)[W_\*^P``"OOP`$C((`.`"`@"$40``F)`0` -M`0P`:LDD!``!#`!K\@````"N`@`L#`!K]20$``*.`@`````H(0P`%-^,1``$ -M%$``$P````".`@`P%$``#```("&.`@`X%$``!0``("&/OP`$C[````/@``@G -MO0`0#`!K#P`````0`/_ZC[\`!`P`:P$`````$`#_\XX"`#@,`&OUC@0`+`P` -M:LD``"`A$`#_[8X"`#@,`&L/`````!``_]@`````)[W_\*^P``"OOP`$C((` -M.`"`@"$40``=)`0``8X"```D!0`!#``4WXQ$``000``%`````(^_``2/L``` -M`^``"">]`!`,`&OUC@0`+`P`:LD``"`AC@(`,!1```@D!``!C@(`.!!`__,` -M`"`A#`!K#P`````0`/_PC[\`!`P`:P$`````$`#_]XX"`#@,`&L/`````!`` -M_^*.`@``)[W_\*^P``"OOP`(K[$`!(S#`"@D`@`!$&(`!@#`@"&/OP`(C[$` -M!(^P```#X``()[T`$*S``#P,`'$T``````P`&[<"`"`AC@(`*!1``"```"`A -M$(``$`````".`@`\/`,``C1C2?`D0@`!K@(`/(X"`#P`8A@K$&``!P````". -M`@``C$(`!(Q1%^@D`@`!$B(`"@`````,`!S\C@0`!"0$``4,`'%)``````P` -M<3L`````$`#_VX^_``@,`!N'`@`@(20$``L0`/_VKA$`*`P`'0..!``$#``= -M(XX$``0\`P`"`$`@(1!```XT8TGPC@(`/"1"``&N`@`\C@(`/`!B$"M00``( -MC@(`*(X"``",0@`$C$,7Z"0"``$08O_-`````(X"`"@40/_I`````!``_\@` -M````)[W_\*^Q``2OL````*"((:^_``@,`'%"`("`(0(`("$"(#`A#``;W@`` -M*"&/OP`(C[$`!(^P```D`@`!`^``"">]`!`GO?_PK[```#P'@```@(`A/`B` -M`"2)`"0DB@`().=PL"0$``LE"&]X```H(:^_``0,`'$(`@`P(8X"`"040``% -M`$`@(8^_``2/L````^``"">]`!`,`'$F`````!``__J/OP`$)[W_\"0#``&O -ML```K[\`"*^Q``00HP`1`("`(5"@`!*,@@`H)`(``A"B``PD`@`#4*(`!HR" -M`"B/OP`(C[$`!(^P```#X``()[T`$%1`__JL@``H$`#_^8^_``BN```\$`#_ -M]H^_``@40/_TC[\`"(R"``",0@`$C%$7Z%8C__"/L0`$#``<]8R$``0,`'%" -M)`0`!0P`&X<"`"`AKA$`*`P`<4DD!``+$`#_Y(^_``@GO?_PK[(`"`"`D"$D -M!`!`K[$`!*^P``"OOP`,#`!Z5P"@B"$`0(`A$@``%```$"$``"@A)`8`0`P` -M<*H"`"`A)@0`+*X2``"N$0`$#``;>:X``"@,`'%))`0`!`P`'#T"`"`AC@0` -M!#P%@``DI7%8#``]`!``0/@)C(0`+!``__N/ -MOP``)[W_\*^_``",@@`H%$``!"0%``&/OP```^``"">]`!``0/@)C(0`+!`` -M__N/OP``)[W_\*^_``",@@`H%$``!"0%``*/OP```^``"">]`!``0/@)C(0` -M+!``__N/OP``)[W_\*^_``",@@`H%$``!"0%``./OP```^``"">]`!``0/@) -MC(0`+!``__N/OP``)[W_\*^_``2OL````("`(8R$``2N!@`L/`:``*X%`"@D -MQG*<#`!9U```*"&.!``$/`:``"3&]__"OOP``#`!:SXR$``2/OP`` -M`^``"">]`!`GO?_PK[\```P`6N",A``$C[\```/@``@GO0`0)[W_\*^_``2O -ML````("`(0P`6M>,A``$#``<_`(`("$,`!T#`@`@(8^_``2/L````^``"">] -M`!`GO?_PK[```*^_``0,`!SU`("`(0P`6MN.!``$C[\`!(^P```#X``()[T` -M$">]__"OOP``#`!:](R$``2/OP```^``"">]`!",@@`````H(8Q"0"`P1@#_ -M/`.``@`%$(`D8S,P`$,@(92"```DI0`!$,(`!2RC``A48/_X/`.``@/@``@` -M`!`A`^``")2"``(D`A0`I((`"B0""9ZD@@`()`(`!:2"`!0D`@`$K((`8"0" -M`!ZD@@`<)`()*J2"`'0D`@`'K((`>"0"``\D`P`")`4``20&``,D!P`\H((` -M4R0"$`"LA0!(H(8`?*"#`'VL@@!4I(<`6JR```2@@P`6H(``%ZR%`'"LA@`` -MK(``:*R``&RL@`!,K(``9*R``#2D@`!]_^"O -ML````("`(20$'`!`&"$``(`A/`*``B12,N@`$!#``%(0(91"```00P`& -M)`(`"280``$J`@`)%$#_]SP"@`(D`@`)$@(`%20#``$,`'I7)`0`O*XB&_00 -M0``0)`/__P``*"$D!@"\#`!PJ@!`("$,`!T\)B0;:``0$,``4A`AC$(`!`!` -M^`D"("`A%$``"P!`@"&N<0```@`8(8^_`!"/LP`,C[(`"(^Q``2/L````&`0 -M(0/@``@GO0`@#`!Z:HXD&_00`/_SKB`;]!``__(D$``")[W_\"0%``X``#`A -MK[(`"*^Q``2OL```K[\`#`P`'B``(40`!K)!0$```4 -M$$`D4?Z`#`!Z5P(@("$`0)@A$$#_YB0$``("(#`A`$`@(0P`<*H``"@AC@(; -M]"01`,`"-!@KK%,`M!!@``P"8)`A`B`H(0(`("$"H#`A#``LKR8Q``$40``* -M`C08*Y>B``*F0@``%&#_]B92``("@"@A#``@YP)@("$00``*`````!)@``8D -M!0`6#`!Z:@)@("&.`AOTK$``M"0%`!80`/_#`*`@(0P`>EB``(0`/^,`H*@)2Q"``440/]U)`0`%A``_VX"`"`A+((``A1`_W`D -M!``6$`#_#S0"@``GO?_PK[$`!*^P``"OOP`,K[(`"(R"&_0`@(@A)`0`(`P` -M>E>,4@"T$$``%P!`@"$`0"`A```H(0P`<*HD!@`@CB(;]`(`*"$"("`A#`!( -M#JQ0``0``(`A`@`H(0(@("$,`"F>)A```2H"`(`40/_[`@`H(8XE&_0,`#\Y -M`B`@(11```\`````$D```P`````,`'IJ`D`@(0P`'WP"("`A)`0`%H^_``R/ -ML@`(C[$`!(^P````@!`A`^``"">]`!`,`#3``B`@(0P`+V0"("`ACB0;]#P# -M@`(D8RRT/!"``CP'@``\"(``/`J``ZR#`!BN(A?$)@E'L"3G2\`E"$VH)4JA -M8```*"$"(#`A#`!Q"```("$,`'$FC@1'L`P`<4D``"`A#`!Z:@)`("&.(QOT -M)`(`"@``("&L8@!H$`#_V:Q@`+0GO?_@K[0`$*^_`!2OLP`,K[(`"*^Q``2O -ML```C)(;](Y0```2```=`("@(8X$``04@`!!`````(X$``@4@``Z`````(X$ -M``P4@``S`````(X$`!`4@``L````````F"$"`(@ACB(`%"9S``$40``B`$`@ -M(8XB`!PF,0`,%$``&@!`("$N8@`#5$#_]XXB`!0,`'IJ`@`@(:Y```".1``$ -M%(``#0`````"@"`A#``_1@)`*"&/OP`4C[0`$(^S``R/L@`(C[$`!(^P```` -M`!`A`^``"">]`"`,`'IJ`````!``__&N0``$#`!Z:@`````0`/_E+F(``PP` -M>FH`````$`#_W8XB`!P,`'IJ``"8(1``_]0"`(@A#`!Z:@`````0`/_,C@0` -M$`P`>FH`````$`#_Q8X$``P,`'IJ`````!``_[Z.!``(C(,;]"0"``XD8P`T -M`^``"``#$`LGO?_0K[0`(*^R`!BOL``0K[\`)*^S`!ROL0`4C)$;]"0%`+\# -MH#`ACB(```"`D"&GH``$#``LKXQ3``0F,``T%$``I@!`H"&.0AOTEZ,``(Q" -M``"N(P`TE$(``"Q"4`,40`"_)Z8`!`)`("$,`"RO)`4`RA1``)D`0*`AEZ(` -M!#!"#\```A%"-$(``:X"`#R.0AOTC$(``)1"```L0E`!$$``IR>F``*GH``" -MEF(`$I9D`!"68P`4``(0@`""("4``QC`EF4```"#("4T@@`"`$4@"I9C``(` -M@"@A-*(`$)>D````0R@*,*(``11```.N!```)`+__0"B*"0PH@`(%$``!"0" -M"0@D`O_O`*(H)"0""0BF`@!$ED(<]C!"`/`L0@`P$$``A*X%``260QSP)`(` -M!Q!B``4D`@G$)`(`"A!B``(D`@G$)`(*K*8"`$:7J``")`(3.*8"`$`D`A?4 -MI@(`0C$#``(D`@`!K@(`8*X``%P48``(```P(99#'/`L8@`&4$``!"0&``$D -M`@`%4&(`8I9#'/*61!SP)`(``:X&`%@L@P`&K@(`4*X``$P08`!8```P(20" -M``50@@!2ED(<\C$$__\`!!!".$(``20'``$P0@`!,0,``:X&`%2N`@!(K@<` -M"*X'``P48``#```P(3"B``D``C`K``00PCA"``$P0@`!,0,`!*X&`!"N`@`4 -M%&```P``,"$PH@`)``(P*Y9B``:.9``8``49`C!C``&N!@`8K@,`(*X'`"2N -M`@`HK@<`'!"```0``"@ACF(`'%1```,D`@`!)`4``20"``$Q`P'PK@(`,*X% -M`"P48``"``,1`B0"``HQ`_``$&``'ZX"`#0``QL")`(``0!B$`2N`@`XCD(; -M](Q#``"7H@`$,$(/P``"(4*48@``+$)0`Q1```.N!``\-((``:X"`#R"8@`@ -M`D`@(:X"`&2"8@`A#``?SJX"`&@"@!`AC[\`)(^T`""/LP`]`#`0`/_D)`(`@"Q"``@40/^N,03__Q``_ZLD!@`!)`(``A!B -M``,L8@`$5$#_G)9$'/`0`/^9)`8``1``_X0D`@G$`D`@(0P`+*\D!0#)%$#_ -MXP!`H"&7H@`"$`#_5*9B`#@"0"`A#``LKR0%`,H40/_;`$"@(9>B``0P0@P` -M``(90JX#`#P0`/]"IZ(`!">]_]"OLP`B -M``"3HP`!``(2`J(#``"B`@`!%(#_\B80``*20P`+)`(`_Q!B``H``(@AHD`` -M#(^_`""/LP`] -M__"OL````("`(:^_``0,`'I7)`0!6*X"``000`!")`,``@!`("$``"@A#`!P -MJB0&`5@,`'I7)`0#9*X"``@00``Y)`,``@!`("$``"@A#`!PJB0&`V2."0`( -M)`(`"B0(``FE(@`4)`(``Z4B`AXE(P`<)`(`"R4(__^D8@``!0'__21C`#0` -M`$`A`2`X(3P#@`(\`H`"``@@0"1C%X0D0A=\`((0(0"#&"&41@``E&,``"4( -M``$`B2`A)`(`"RD%``.D@P(@I(8")J3B`C*DX@+.%*#_[B3G`#0,`'I7)`0` -MB*X"``P00``/)`,``@!`("$``"@A#`!PJB0&`(@,`'I7)`0(`*X"`!`00``& -M)`,``@!`("$``"@A#`!PJB0&"````!@AC[\`!(^P````8!`A`^``"">]`!`G -MO?_@K[\`$*^S``ROL@`(K[$`!*^P``",@AOT`*!((3##__^,4P``EF(``"Q" -M,`,40``ICG``")8&`!0``)`A`D80*U!``!"6`@`4`@`X(0`#$$``21`AE$@` -M`"92``(D8P`!,00`_P`($@("1B@KI.(``*3D``(P8___%*#_]"3G``26`@`4 -M$$``#```D"$"`(@AEB4``)9D`````#`A#``HGB92``&6`P`4IB(```)#&"L4 -M8/_W)C$``H^_`!"/LP`,C[(`"(^Q``2/L````^``"">]`"```Q!``$40(91( -M```D8P`!,&/__P!@*"$`"#%```@8@@`($D(PQ@!_,&,`?P`%($"F!@`$I@(` -M`*8#``(`B2`AE(@``"2E``$PH___`&`@(0`($L(`""C```@9`@#","4PI0!_ -M,&,`?P`$$$"F!0`(I@8`!*8#``8`21`AE$@``"2$``$P@___`&`@(0`($T(` -M"#A```@9@@"B*"4PYP!_,&,`?P`$$$"F!P`,I@4`"*8#``H`21`AE$@``"2$ -M``$PA/__``@I@``(,\(`"!("``@80C"E`'\P0@!_`.8X)3!C`'\`!"!`I@4` -M$J8"``ZF!P`,I@,`$`")("&4B`````@2@@"B*"40`/^HI@4`$B>]_\"OMP`L -MK[4`)*^Q`!2OOP`TK[X`,*^V`"BOM``@K[,`'*^R`!BOL``0C((;]##&__^O -MI0``C%0``*^F``0``+@ACH(`!(Z2``@``(@AE%X`$@``J"$D`@`!```@(1*B -M`'>/HP`$4J``<997`!0D`@`"$J(`9P`````2X`!5``"P(0`#$$"/HP```("8 -M(0!#@"&68@``)B<`"*8B``"6"@``)A```@`*((``"BD"``HR@C"E`#\PA``_ -MIB0`'J8F``2F)0`"E@H``"80``(`"DN"``I!```*$@(`"AB"`(D@)3$(`#\P -M0@`_,&,`/Z8H`"2F)``>IB(`(*8C`"*6"@``)A```@`*&P(`"A&"`0-`)3!" -M`#\Q0P`_IB@`)*8B`":F(P`HE@H``"80``(`"D"```H9`@`*$H(Q"``_,&,` -M/Z8H`"ZF(@`JIB,`+)8*```F$``"``HC@@`*&((`"A("`01`)3!"`#\P8P`_ -MIB@`+J8B`#"F(P`R#``H>I:$``"6)P`&$.``#0``,"$"("@AA*(`'B3&``$` -MQR`K``(80`!B&"$``QC``&(8(0`#&$"DHP`>%(#_]B2E``(FU@`!`M<0*R8Q -M`#040/^Q)G,``B:U``$NH@`#5$#_GR0"``&/OP`TC[X`,(^W`"R/M@`HC[4` -M)(^T`""/LP`]`$!3P/_P)K4``997`AXD8P!& -M)E$"+!``_Y0F1`(@)&,`!291`!80`/^0`D`@(5/`_^4FM0`!EE<"'B1C`#`````":#``$P=/__EB,````4*$``O8@A``,:`H^D`!@``#`AIF(``!!@ -M``H`8"@A#``HG@`````F`P`!,'#__R:#``$P=/__`I(8*Q1@_^*F(@```!(0 -M0@+"$"$P4/__IO0`%!*``&$``$`A``@@0`"($"$`G1@A``(0@)1C````2!`A -M``(00`!7,"$`$"A``)<@(:2#````M2@AI,,`&)2C```F`@`!,%#__P`#$$`P -M0@$`,&,`_P!B&".DPP`$$"/OP!$`$,0(91"`'Z/O@!`C[8`.*;B`!:/M0`TC[<`/(^T`#"/ -MLP`LC[(`*(^Q`"2/L``@`^``"">]`%"4X@``)`,``:3#`!H``AO"``,:```" -M$@(`0Q`C$`#_X:3"`"H`"!!``$D0(91%```E`P`!,&C__R0"`/\`%!A`+08` -M`R:$``$010`#`'T8(3"4__^D90``%,#_\P`($$`0`/]TIO0`%">]__"OL``` -M,+#__P`0$$"OL0`$`("((0!`("&OL@`(K[\`#`P`>E<`P)`AKB(``!!``#,D -M`P`"`!`@@`"0("$`!""``)`@(0P`>E<`!""`$$``,JXB``BF,``$$@``)P`` -M,"$`!D"```880`$&$"$`K0"`8"&GH@`"I*,` -M!J>B````8#@A```P(0``("$`AQ`',$(``1A```@LPP`"$&``@```$"$`!AA` -M),(``0!]&"$P1O__I&0``"2"``$P1/__+((`!!1`__(`AQ`'E8(`%```2"$0 -M0`!QI*(`!``)&$``:1@A``,8@`!I&"$`"4"```,80`$)$"$!@Q@A``(0@(RJ -M``B49``8`$D0(0`"$(``2A`AI$0``"1F`!B4PP`2I$,``I>C``(T`MZM$&(` -M7@``("$!"1@A``,8@`!I&"$`!!"``$00(0`#6(`D@P`!``(0@#!D__\!:C@A -M`$<0(2R#``048/_SI$``!I>C``"4Q``"``,0@`!#$"$``A"``$<0(:1$``B7 -MHP`"``,0@`!#$"$``A"``$<0(20#`!2D0P`(EZ,``@`#$(``0Q`A``(0@`!' -M$"$D`P`CI$,`"I>C``(``Q"``$,0(0`"$(``1Q`A)`,`/Z1#``R7I`````00 -M@`!$$"$``A"``6(0(0!*$"$D1``$)`(`!*2"``*4PP`&E((`!`!#$"&D@@`& -ME,,`"@!#$"&D@@`(E,,`#@!#$"&D@@`*E,(`!*2"``R4P@`(I((`#I3"``RD -M@@`0E,(`$*2"`!*7I``"``00@`!$$"$``A"``6(0(0!*$"$D1``$)`(``Z2" -M``*4P@`4I((`#)3"`!:D@@`.E,(`&*2"`!"4H@`$)2,``3!I__\!(A`K%$#_ -MD@`)&$`D`@`!`^``"">]`!`!"1@A``,8@`!I&"$`!!"``$00(0`#.(`D@P`! -M,&3__P`"$(``ZA@A`$,0(2R#``048/_SI$``!I>D````!!"``$00(0`"$(`` -MXA`A`$H0(21$``0D`@`$I((``I3"``*D@@`$E,,`!@!#$"&D@@`&E,,`"@!# -M$"&D@@`(E,,`#@!#$"&D@@`*E,(`!*2"``R4P@`(I((`#I3"``RD@@`0E,(` -M$!``_\VD@@`2)[W^L*^W`3ROM@$XK[4!-*^S`2ROL@$HK[$!)*^P`2"OOP%` -MK[0!,(R"&_0`@+`A`*"X(8Q"```PT?__`."0(8Q4``0``)@A``"H(0``@"$D -M`@`!4@(`-I:"`!)2```XEH(`$"0"``)2`@`QEH(`%`.@("$``"@A#`!PJB0& -M`1P"P"`A`Z`H(0(@,"$"H#@A`N!`(0P`(E4"`$@AEZ4`%`)`("$,`",F`Z`P -M(0!`F"$40``3`$`8(0.@("$,`"-Q`D`H(1!```XD`___EZ,`%``#$(``0Q`A -M`B(0(18```,P4?__)B(`!3!1__\F$``!+@(``Q1`_]8F4@`,`F`8(8^_`4"/ -MMP$\C[8!.(^U`32/M`$PC[,!+(^R`2B/L0$DC[`!(`!@$"$#X``()[T!4%!` -M_^\F$``!$`#_S205``-00/_K)A```1``_\DD%0`*)[W_P*^W`"ROM``@K[\` -M-*^^`#"OM@`HK[4`)*^S`!ROL@`8K[$`%*^P`!",@AOT,,;__Z^E``",4P`` -MKZ<`"*^F``2.8@`$``"X(0``H"&47@`2)`(``0``D"$``*@A$H(`]`$"60P`$`!`@0@`0*T(`$!'"`&48)3!"`#\0`/_=,(0`/Q``_\@` -M$!#"$`#_O20&``$0`/_=,%'__Q``_[(`$!)"%\``!#!1__\F(@`&$`#_VC!1 -M__^.8@`,)!<``R15`%(0`/^;)%(`5"8B`%4P4?__`&"H(207``@0`/^5)'(` -M`B8B`&4P4?__$\#_\"8B``2.8@`,)!<``B15`'(0`/^,)%(`=">]_]"OM@`8 -MK[0`$*^Q``2OOP`@K[<`'*^U`!2OLP`,K[(`"*^P``",@AOT`*"@(3#1__^, -M50````"P(8ZC``248@$6$$``$8ZR`!``%KA``N,0(91"`1@40``7EJ(``"8C -M``@F)``'+$(P`P!@B"$`@H@+CJ,`!";6``&48@$6`L(0*Q1`__$F4@!`C[\` -M((^W`!R/M@`8C[4`%(^T`!"/LP`,C[(`"(^Q``2/L````^``"">]`#`L0C`# -M%$``0``1$$``5#`A``"8(0)`*"&4R```)G,``BYD``@Q`P#_``@2`J2B``"D -MHP`(),8``B8Q``$4@/_V)*4`$``1$$``5$@A``"8(0)`."&5*```)G,``BYF -M``@`""&"``@2`@`(&X(P0@`_,&,``3"$``$Q!0`_I.(``JSC``2DY0`*K.0` -M#"4I``(F,0`!%,#_[R3G`!```)@A`D"`(8X"``!00``/)G,``8ZB``0"XA`A -ME$(!&#!#``<08``.```P(20"``,08@`,EJ0``)8%```D!@`!#``HGB9S``&F -M`@``+F(`"!1`_^TF$``($`#_LHZC``26I```$`#_]I8%````5!`AE$@``"8Q -M``$`$2!```@I0``(&((`"!)",*4`?S!C`'^F10`0ID(``*9#``@`E"`AE(@` -M`"8Q``$`$3!```@:P@`((,``"!$"`*,H)3"$`'\P0@!_ID0`(*9%`!"F0@`8 -M`-0P(93(```F,0`!`!$H0``(&T(`"#!```@1@@"#("4PQ@!_,$(`?Z9&`#"F -M1``@ID(`*`"T*"&4J```)C$``0`1.$``""/"``@I```($@(`"!B"`,0P)3"E -M`#\P0@!_,&,`/Z9%``JF0@`XID,``J9&`#``]#@AE.@``"8Q``$`$2!```@; -M`@`($8(`HR@E,$(`/S$#`#^F10`*ID(`$J9#`!H`E"`AE(@``"8Q``$`$2A` -M``@@@``(&0(`"!*",(0`/S!C`#^F1``RID(`(J9#`"H`M"@AE*@``"8Q``$` -M"!H"``@3@@""("4P8P`_ID0`,A``_XZF0P`Z)[W_T*^U`"2OM``@K[,`'*^_ -M`"BOL@`8K[$`%*^P`!",@AOT`*`P(0"@H"&,4@```("8(0``J"$,`"8TCD4` -M!)9B'/8P0@#P+$(`,%1```:60@``CD(`!)1"`"@00``I)`,`%I9"```D$`"0 -M)!$`0"Q",`,"`#`A`B(P"P)@("$,`"%$`H`H(99"```"`#`A+$-``"Q",`,4 -M8``&`B(P"XY"``240P`H)`(``1!B`",F1P`4`F`@(0P`(;X"@"@AED,``"QB -M0``40``8+&,P`XY"``240@`L)$+^ZS!&__\"8"`A`H`H(0P`)($#H#@AEZ8` -M``)@("$,`"45`H`H(0*@&"&/OP`HC[4`)(^T`""/LP`F1@#JID(`[*9#`.:F1`#HID4`XJ9'`.0`$1!``%,0 -M(910```F,0`!`9)0(3($`/\`$!H"`!$00*5#`%"E1`!6`%,0(910```F,0`! -M`!$80#($`/\`$!("I4(`7*5$`&(`DH@`"`!$00`!3$"&44```+H5``"8Q -M``$`$!E"`!`@0C!C`/\PA``/,@(``:5"`(2E0P!X%*``!J5$`'X2H`$T`!`3 -M0B0"``(2H@$N`!`30A;``!$N@C`$`!$00`!3$"&44````9(8(0`0$8(P0@!_ -MI&(`S"0"``$2H@$<)C$``2JB``(40`$4)`(``A*B`0T`$!#"+H(P!!1``00` -M%1!``!480`!R&"$`$"-")&,`T``1$$"D9``"`%,0(910```F,0`!`!`0P#!" -M`#@`@B`E)`(``A*B`.VD9``"%J``"2Z"0``4H``'`!`8P@`0$@(P0@`_,&,` -M'Z9"`0*F0P$&+H)``!1``#`FH@`!)`(``1*B`,$D`@`"$J(`:P`1$$`6H``I -M)J(``2Z"0`$40``F)J(``0`1$$``4Q`AE%```"Z#4``F,0`!,@(`/Q1@`!VF -M0@#8`!`1@@`0,T(P0@!_`!$80*9&`$RF0@!"`',8(91P```F,0`!`!$H0#(" -M``<``A#``!`8P@`0(D(`PC`E,&,`/Z)$`&NF1@!,ID,`W@"S*"&4L```)C$` -M`3("``$``A'``((@)0`0$$*B1`!KHD(`<":B``$P5?__+J(``Q1`_O\`%1"` -M4L``$X[B`!0`$1!``%,0(910```F,0`!`!$@0``0$,(R`P`',$(`!Z9#`/JF -M0@#^`),@(920````$!#",$(`!S(#``>F0P#\ID(!`([B`!261P$6``"H(1#@ -M``\D4?]``!$00`!3,"&4T```)J,``@`5$$`P=?__`%(0(3(#`/\`$"("`J,@4`_R8Q``$`$"H"`H`@(20&``$,`"B>ID(!$``1 -M&$``F0P#Z$`#^Y:9" -M`/XP0@`!$`#^T:9"`#`P0@`!$`#^SJ9"`"XP0@`',@,`!Z9"`/80`/Z`ID,` -M^!:@_I8`$1!``!`00``0&4(`$""",&,`!S"$``,,*7__R0"`/\P@___$*(`"20'`/\0P``)``40@"QB,`-0 -M0``")*((_"2B"6`P0O__`$`X(0/@``@`X!`A`$40(21"$L`L8S`#$&#_^3!" -M__\LH@`_%$``!``%$(``11`A$`#_\B1"%2(`11`A``(00!``_^XD0A/L)[W_ -MX"0%`+\#H#`AK[``$*^_`!0,`"RO`("`(1!```8``!@AC[\`%(^P`!``8!`A -M`^``"">]`"".`AOT)`,`SR0%`,J,0@```@`@(0.@,"&40@``+$)```P`+*\` -M8B@+C@(;])>C``",1```,&:``#!C"`"4@@```$`@(2Q"0``X0@```,(8"S!B -M__\LA$````(KPCB$`````A+"`*00"Z>C``"GH@``$`#_WC!#__^,@@``C$)` -M"#A"``$#X``(+$(``2>]_^"OLP`,K[$`!*^P``"OM``0K[(`"*S```",BP`` -M)`+__P"@F"&-:0"``,"`(0"`4"$D!?__$2(`.```B"&,@QM`/`0!!32$V#`! -M(Q@D/`(`@`$D0"0Q)0`%`&)H)#4"``$`14`+/!(`(#!G``4P9@%`-0(`0`!R -MR"0Q)0%`,&P`@`!D&"0`14`+-&(``0!'&`LT8@!`/!0#_SP8(``Q+P`@,2X` -M@!&@``(`1A@+C7$`C`&#&"4"."`D$:```@!X$"4`1!@+`'(0)0!9&`L!XQ@E -M$<``#`!@*"&-8P"$)`+_?P$B2"0`=!@D``,<`JX#`````Q0`C4,```!4$"0U -M"`"`K&(`A(U"``"N:```K$D`@(U"``",0@"`C[0`$(^S``R/L@`(C[$`!(^P -M````H!`A`^``"">]`"`\`@$%-$+8,#"H`$`PJ0`!,*H`@`2A``\`@#`AC(,; -M](QB`!000``#)$3__ZQD`!2,8@`4%$```R0"``&,PP``K&(`)`/@``@````` -M`^``"`````",@P```*(H)(QB`"0X0@`!+$<``5#@``6,PAM`K&``)(R"``", -M0@`DC,(;0(S$```T0P%``&@0"S1#``4`:1`+`4(0)0!%$"6L@@"@C,0``(R# -M`*`0X/_FK,(;0"0"``&L@@`D$`#_Y``````$HP`+C(,``(R#&_2,8@`4)$(` -M`:QB`!2,@@``K$``)(R"``",0@`D`^``"`````",8@`D.$(``2Q'``$0X``% -M,*(`0*Q@`"2,@@``C$(`)#"B`$`00``#C(8;0"0"_K\`PC`D,*(``1!```0P -MH@"`)`+_^@#","0PH@"`$$``!#P"`04D`O]_`,(P)#P"`04T0M@PC(,```"B -M*"0`!1`G`,(P)*QF`*",@P``C&(`H!#@_]VLAAM`)`(``:QB`"0#X``(```` -M`(R#```T`H@```4I0`"B*"$`91@AK&```(R"```D`P`'`$40(:Q```2,@@`` -M`$40(:Q```B,@@```$40(:Q```R,@@```$40(:Q``!",@@```$40(:Q#`!2, -M@@```$40(:Q``!B,@@```$40(:Q``!P#X``(`````">]_X"OM0!D/!6JJC:U -MJJHD`@`'K[X`<*^W`&ROM`!@K[(`6*^Q`%0`P)`AK[\`=*^V`&BOLP!\$(`!A?``\+P)0`&,$(T!8``-,:``*^E`$2OI@!($B``!:^@`#R6(P`, -M)`(`$!!B`"H"@"`A```P(0.@."$`%Q#`CH,```!&$"&,Y0`,``(0@#0(B``` -M2!`A),8``0!B&"$LQ``(K.(`"*QE```4@/_S).<`"(Z"````%R%`CZ,```"" -M$"$`2!`AK$,``(Z"```T`X@$`((0(0!#$"&/HP`$K$,``(Z"```T`X@8`((0 -M(0!#$"&L7@``CH(```""("$T`H@<`((@(8^B`$BL@@``$`#_D8^_`'0D!0`2 -M#``=SB0&`!`00/_4```P(1)``0,GI``(```H(0P`<*HD!@!`)`(`!"8P`!2O -MH@`TD@,`#9("``R2!``.D@4`#P`#&@``0Q`E``0D``!$$"4`!2X``$40)0!5 -M$":OH@`LD@,`"Y("``J2!``,D@4`#0`#&@``0Q`E``0D``!$$"4`!2X``$40 -M)0!5$"8P0O__KZ(`))(#``>2`@`&D@0`"``#&@"2!0`)`$,0)0`$)```1!`E -MCZ0`!(^C````!2X``$40)0`$("<`51`F,(3__P`#&"D``@``"@A)`8`0`P`<*HP4___D@,``9($``*2(@!&D@4``P`#&@``0Q`E -M``0D``!$$"4`!2X``$40):^B``R2`P`%D@(`!)($``:2!0`'``,:``!#$"4` -M!"0``$00)0`%+@``11`EKZ(`'```,"$#H#@A`!,0P(Z#````1A`AC.4`#``" -M$(`T"(@``$@0(23&``$`8A@A+,0`"*SB``BL90``%(#_\R3G``B.@@``CZ,` -M```7L4`"PA`A`$@0(:Q#``".@@``-`.(!">D``@"PA`A`$,0(8^C``0``"@A -M)`8`0*Q#```FX@`@#`!PJC!3__\D`@`$KZ(`-))#``V20@`,DD0`#I)%``\` -M`QH``$,0)0`$)```1!`E``4N``!%$"4`51`FKZ(`+))#``N20@`*DD0`#))% -M``T``QH``$,0)0`$)```1!`E``4N``!%$"4`51`F,$+__Z^B`"220P`'DD(` -M!I)$``B210`)``,:``!#$"4`!"0``$00)0`%+@``11`ECZ0`!`!5$":/HP`` -MKZ(`'(^B`$@`!"`G,(3__P`#&">OI``4KZ,`#*^^`#ROH@!$```P(0.@."$` -M$Q#`CH0```!&$"&,Y0`,-`.(```"$(``0Q`A),8``0""("$LPP`(K.(`"*R% -M```48/_S).<`""8P`$XFX@!@)Z0`"```*"$D!@!`#`!PJC!3__^2`P`!DB(` -M3I($``*2!0`#``,:``!#$"4`!"0``$00)0`%+@``11`EKZ(`#)(#``62`@`$ -MD@0`!I(%``<``QH``$,0)0`$)```1!`E``4N``!%$"6OH@`<```P(0.@."$` -M$Q#`CH0```!&$"&,Y0`,-`.(```"$(``0Q`A),8``0""("$LPP`(K.(`"*R% -M```48/_S).<`"(Z"```T`XP``L(0(0!#$"&/HP``K$,``(Z"```T`XP$`L(0 -M(0!#$"&/HP`$K$,``!``_HB/OP!T)[(`"`)`("$``"@A#`!PJB0&`$`D`@`$ -MKZ(`-"8P`!22`P`-D@(`#)($``Z2!0`/``,:``!#$"4`!"0``$00)0`%+@`` -M11`E`%40)J^B`"R2`P`+D@(`"I($``R2!0`-``,:``!#$"4`!"0``$00)0`% -M+@``11`E`%40)C!"__^OH@`DD@,`!Y("``:2!``(D@4`"0`#&@``0Q`E``0D -M``!$$"4`!2X``$40)8^D``0`51`FCZ,``*^B`!R/H@!(``0@)S"$__\``Q@G -MKZ0`%*^C``ROO@`\KZ(`1#+S__\``#`A`Z`X(0`3$,".A````$80(8SE``PT -M`X@```(0@`!#$"$DQ@`!`((@(2S#``BLX@`(K(4``!1@__,DYP`()C``3@)` -M("$FX@!````H(20&`$`,`'"J,%/__Y(#``&2(@!.D@0``I(%``,``QH``$,0 -M)0`$)```1!`E``4N``!%$"6OH@`,D@,`!9("``22!``&D@4`!P`#&@``0Q`E -M``0D``!$$"4`!2X``$40):^B`!P``#`A`Z`X(0`3$,".@P```$80(8SE``P` -M`A"`-`B(``!($"$DQ@`!`&(8(2S$``BLX@`(K&4``!2`__,DYP`(CH(````7 -M(4"/HP```((0(0!($"&L0P``CH(```""("$T`H@$`((@(1``_G2/H@`$%*+^ -M!8^_`'0D`@!H$*(`)I(#``V2`@`,D@0`#I(%``\``QH``$,0)0`$)```1!`E -M``4N``!%$"4`51`FKZ(`+)(#``N2`@`*D@0`#)(%``T``QH``$,0)0`$)``` -M1!`E``4N``!%$"4`51`F,$+__Z^B`"22`P`'D@(`!I($``B2!0`)``,:``!# -M$"4`!"0``$00)0`%+@``11`E`%40)A``_>BOH@`(1@"HF$8`JXA' -M`*R81P"O@$@`L*BD``"XI``#J*8`!+BF``>HIP`(N*<`"Z"H``P#X``(`&`0 -M(8R$&_0PI?__C(,`-!!E``(``!`AK(4`-`/@``@``````^``"```$"$GO?_@ -MK[$`%`.@,"$`H(@A)`4`'Z^R`!BOOP`<`("0(0P`+*^OL``0`D`@(0.@,"$0 -M0``))`4`'B0$`!:/OP`B``"3HP`!`@*` -M(0`"$@*B(P`##``LKZ(B``(40/_G)`0`%I>B``"3HP`!/`4``@("@"$``A(" -M```@(32E__VB(@`$$@#_W*(C``46!?_]_]"OOP`@K[,`'*^R`!BOL0`4K[``$(RC`!",I@`4`*"`(5!@``$```'- -M`,,`&XX"``P#H"@A`("((0``F!(```````````!B`!L``)`2#``M[0````"/ -MHP`$CZ(``(X&``2.!0`(``,=@``"$H(`8D@EC@,``(X(``PE(@`"),;__P!H -M("$F9___`((8*P3``*&N!```5&#_]XX#``!PR#@"C@(`$(X#`!@`Y#`A<*(@ -M`JX&``0`AA`A$&``C*X"``B.)```-`6``#P#`!``A2`AC((`!`!#$"6L@@`$ -MCB(``(X#`!0`11`AK$,`)(XB``".`P`8`$40(:Q#`#B.(P``C@(`"`!E&"$` -M`A#`K&(`,(XB``".`P``-!*```!2$"&L0P`HCB,``)8&``X\$___`'(8(8QB -M`"`"("`A/`6```!3$"0`1A`EK&(`(`P`*6P`````CB(;0(XD```\`__[-&/_ -M_P!#$"2N(AM`K((`H(XB'82.)```/`7__P!#$"2N(AV$C@(`(`"2("&,@P`8 -M-*4`_P`"$@``91@D,$+_``!B&"6L@P`8CB(;0(XD```\`P`$`$,0):XB&T`\ -M!8``K((`H`P`*3P"("`AC@,`'(X"``P`0Q`K5$```:X#``R.`@`0`$,0*U1` -M``&N`P`0C@,`#(X"`!!08@`ZC@(`!(X"``2.(P``/`8`!P`"$,`TQO__)$+_ -MZ`!R&"$`1A`DK&(`U(XC```\!0#_-*7__P!R&"&,8@#4/`<*`#P$`!@`11`D -M`$<0):QB`-2.(P``C[\`(`!R&"&,8@#4`$00):QB`-2.`@``CB,````"$,`D -M0O_H`$80)`!R&"&L8@#8CB,```!R&"&,8@#8`$40)`!'$"6L8@#8CB(``)8# -M``X`4A`AK$,`W(XD``".`P`0C[$`%`"2("&,@@#<``,<``!S&"2/L@`8C[,` -M'(^P`!`P0O__`$,0):R"`-P#X``()[T`,!``_\:N`@``CB,``#0"@``\!/_O -M`&(8(8QB``0TA/__`$00)*QB``00`/^!CB(``"2E__\HH@``)D;__Q``_UP` -MXB@+C((``#0&@```1A`AC$(`3*BB``"XH@`#C((```!&$"&,0P!0C$(`4*BB -M``2XH@`'B*(`!)BB``<00P`&`````(R"````1A`AC$(`3*BB``"XH@`#`^`` -M"`````",@P``-`6``#P&`0``91@AC&(`(`!&$"6L8@`@C(,```!E&"&,8@`@ -M`$80):QB`"`#X``(`````(R#```T!X```(!`(0!G$"&,1``$C&(`%#P%_Y^5 -M!AMR-$(`(*QB`!2-`P``-*7__SP"`((`A2`D`((@)0!G&"$PQC<`)`(4`*QD -M``10P@`#C0,```/@``@`````)`(#<*T`'/RL8A!P$`#_^@````"4@AMR```8 -M(3!"`@`00``UC(D<")"K```18``.``!`(0"H$"&00@`!)0@``0$+4"HP1@!_ -M,$(`@!!```0`PS@K5.```0!@,"$PPP#_%4#_]0"H$"&-)@``&,``"0``."$E -M)0`RD*(``!!#``4DI0`8).<``0#F$"I40/_[D*(``!C```L``$`A)24`,P#H -M$"I40``"H*<``*"H``"-(@``)0@``0$"$"H40/_X)*4`&%!@``Z,@P````,0 -M0BQ"``-00``*C(,``(R$```T`H``/`,"``""("&,@@`$`$,0):R"``0#X``( -M`````#0"@``\!/W_`&(8(8QB``0TA/__`$00)*QB``0#X``(`````(R#```T -M`H```&(H(8RB&&0``A3",$,!`#!$`?\08``".((!_P`"(">,H@!0C*,`3`!# -M$"8#X``(`$00)B2C__\L8@`%`*#`(1!``#L`@'`A``,0@#P#@`(D8PRL`$,0 -M(8Q"````0``(`````(R"```T#X``)(T$@`!/$"&,1`"0C:(`3(VC`%B-QP2` -M`$00(:VB`$R-P@``C:@`8(VD`%"-I0!4`$\0(8Q"`(R-J0!DC:L`:`!B&"&M -MHP!8C```` -M`#P"4>LT0H4?`*(`&0``$!```BE")`(`9`!E`!M0H``!```!S0``&!(0`/_2 -M`$,@(U#`_]```"`AC((``#0#@```0Q`AC$4`[*S%``",@@```$,0(8Q$`/"L -MQ``$C<(```!#$"&,0@#TK,(`"(W"````0Q`AC$(`^*S"``R-P@```$,0(8Q# -M`.R,0@#P`&48)@!$$"8``Q@K``(0*ZS"`!`0`/^SK,,`%(R"```T`X```$,0 -M(8Q"&&0``A,"`^``"#!"`'\PI?__)(0%O```&"&4@@``$$4`"22$`$@00``( -M``,4`"1C``$L8@!`5$#_^92"```#X``(```0(0`#%``#X``(``(4`R>]__"O -ML```)`4``@"`@"&OOP`$#``N@0``,"&.`@``-`2``#P#``(`1!`AK$`!)(X" -M``"/OP`$`$00(:Q``2B.`@``K$``0(X"````1!`AK$,!,(X"``"/L```/`," -M``!$$"&L0P$X`^``"">]`!`GO?_P```H(20&`$BOOP`$K[````P`<*H`@(`A -M/`(`/S1"_SBN`@!$)`(!]*X"`!`D`@!DK@(`'"0"`"BN`@`D/`,`/R0"``]`!`GO?_PK[\`!*^P``",D`6X/`(`0`"` -M0"&.`P`0`$,@(P!#$"H00``EK@``#*X``$".`P`8/`(`0`!#(",`0Q`J4$`` -M`JX$`$2N``!$C0(``(X#`$`T!X```$<0(:Q#`2R-`@``C@,`1`$`("$`1Q`A -MK$,!-(T"```\`P`")`4``@!'$"&L0P$PC0(``#P#`@```#`A`$<0(:Q#`3@, -M`"Z!`````*X``#RN```XC[\`!(^P```#X``()[T`$!``_]RN!`!`)[W_\*^Q -M``2OOP`(K[```(R#%\``@(@AC)`%N"AB```D9`!_`&`H(0""*`L`!2G#``41 -MP`!B$",H0@!`5$``!0"@("$D8P#^*((```!B(`L`!"'#CB(7Q!!``!2/OP`( -MD@(``Q!``$TD0@`!D@,`!"QB``(40`!$)&(``8X"`"0`1!`J4$``'XX"`""2 -M`@`&$$``$B0"``&2`P`%+&(``A1```8D8@`!C[\`"(^Q``2/L````^``"">] -M`!`P1@#_`B`@(20%``2B`@`%#``Q5@`````0`/_UC[\`"`(@("$D!0`"H@(` -M!@P`,58``#`A`B`@(20%``6B```$$`#_\P``,"$`1!`J4$``"Y8B&W*2`@`& -M4$#_X9(#``6B```&`B`@(20%``(,`#%6)`8``1``_]J2`P`%,$(0`!!`_]N/ -MOP`(D@(`!A!```@D`@`!D@(`!5!`_]6/OP`(H@``!0(@("$0`/_E)`4`!*(" -M``8"("`A)`4``@P`,58``#`A$`#_])("``4P1@#_`B`@(20%``40`/_-H@(` -M!#!&`/\"("`A)`4``1``_\BB`@`#C(,7P">]__"OOP``*&(``"1E`'\`8#`A -M`*(P"P`&,<,`!A'``&(0(RA"`$`40``JC(<%N"1C`/XHH@```&(H"P`%&<., -M@A?$$$``#8^_``"0X@`#$$``'"1"``&,X@`@`$,0*E!```^4@AMRD.,`!2QB -M``(40``$)&(``8^_```#X``()[T`$#!&`/\D!0`$H.(`!0P`,58`````$`#_ -M^(^_```P0A``$$#_]8^_``"0X@`%$$#_\B0%``2@X``%$`#_]```,"$P1@#_ -M)`4``1``__"@X@`#$`#_V@#`&"$GO?_PK[(`"*^Q``2OL```K[\`#)2%&W`, -M`"\5`("`(0`"&,``8A@A``,8P`(#D"&60P6\E@(;<"91!;P"("`A$&(`+ZX1 -M!;@,`"]"`````)8"&W"F0@6\E@(;<@`"$@(P0@`/HB(``I(F``,"`"`A#``Q -M5B0%``&2)@`$`@`@(0P`,58D!0`%DB8`!@(`("$D!0`"#``Q5BS&``&2)@`' -M`@`@(0P`,58D!0`#DB8`!20%``0,`#%6`@`@(0P`+X<"`"`AC@(``#0$@``\ -M`P`"`$00(:Q#`3".`@``C[\`#(^R``B/L0`$C[````!$$"$\`P(`K$,!.`/@ -M``@GO0`0E@(;P````".`P`,`B`@(20%``(`8A@AK@,`#`P` -M+H$``#`ACB(``#0$@`".!0!``$08(8QG`2R,9@$T`.40*Q1``%$`````C@,` -M1`##$"M00``.`,,P(XX#`$0`PQ`K4$#_XX^_``B.(@```$00(:Q#`32.(@`` -M/`,"``!$$"&L0P$X$`#_VH^_``@`Y2@CK@4`.*X&`#R.(Q>\C@0`#``#$(`` -M0Q`A`$00*Q!``!L`9!`KC@(`%#P#$&(T8TW3<((0`@!#`!D``!`0``(1@@!% -M$"L40``)`````(X"`!QP@A`"`$,`&0``$!```A&"`$80*Q!```4`````#``O -MAP(@("$0`/^ZC[\`"`P`,*0"("`A$`#_^0`````00/^S/`,08HX"`!`T8TW3 -M<((0`@!#`!D``!`0``(1@@!%$"L40``-`````(X"`!AP@A`"`$,`&0``$!`` -M`A&"`$80*U!`_Z./OP`(#``P)`(@("$0`/_B``````P`+[@"("`A$`#_W@`` -M``"L90$LCB(``#P#``(`1!`AK$,!,!``_Z^.`P!$)*7__RRB``4GO?]P`(!H -M(1!``%(`P&`A/`.``@`%$(`D8PVL`$,0(8Q"````0``(`````#P"@`(\!H`" -M)$,-*(VE``",1`THC&(`!(S##3`T"H````Q(@`$]2"&OH@`$`*HH(:^C``BO -MI```C2,``(RD&%`\`O`/-$+__P""("0``QT`/`(/\`!B&"0`@R`E/`B``B3& -M#3"LI!A0C,(`!(T##3B-I@``KZ(`#*^C`!``RC`AC2(`"(S%&%P\`__`/`0` -M/S1C?_\TA(````(3P`!$$"0`HR@D`*(H)3P'@`(E"`TXK,487(SC#4"-`@`$ -MC:4``*^C`!BOH@`4`*HH(8TB`!",I!A<)`.`?P`"$<``@R`D,$)_@`""("6L -MI!A<).<-0(SC``2-I0``/`+\`Z^C`!P`JB@AC*086(TC`!@T0O__`((@)``# -M'(`\`@/\`&(8)`"#("6LI!A8`^``"">]`)`\`H`"/`B``B1##4B,1`U(C&(` -M!(T##5``!F`KC:8````,6(`!?5@A-`Z``*^C`"BOH@`DKZ0`(`#.,"&-8@`@ -MC,48;#P#_^`\!``?-&,__S2$P````A.``$00)`"C*"0`HB@EK,48;#P'@`(E -M"`U0C0(`!(SC#5B-I0``KZ(`+*^C`#``KB@AC*08;(UC`"@\`O`?-$+__P"" -M("0``QU`/`(/X`!B&"0`@R`EK*08;#P&@`(DYPU8C.(`!(S##6"-J```KZ(` -M-*^C`#@!#D`AC6,`,(T$&&@\!X`"/`+_`3P)@`(DY0UH-$+__R3",Q@`$ -MC*4`!"4J#7",YPUH`((@)(TI#7`\`@#^``,<0`!B&"0`@R`EC4H`!*^F`#RO -MI0!$KZ<`0*^I`$BM!!AHC:4``(UD`#@\`H#_`*XH(8RC&&@T0O__``0F``!B -M&"0\`G\``((@)`!D&"6LHQAHC:4``(UD`$`D`__@`*XH(8RB&&@PA``?KZH` -M3`!#$"0`1!`EK*(8:(VD``"-9@!()`/`_P".("&,@AAL``8R`##&/P``0Q`D -M`$80):R"&&Q1@``(C:(``(VC````;A@AC&(8;#1"``&L8AAL$`#_B@`````D -M!/_^`$X0(8Q#&&P`9!@DK$,8;!``_X,`````/`*``B1##7B,A0``C&8`!(Q$ -M#7@`#!@K-`*````#&(``HB@A`'T8(:^D`%"OI@!4C&0`4(RB(@@D`__`,(0` -M/P!#$"0`1!`EK*(B"!``_VX`````/`*``B1##8",1`V`C&4`"(QB``2-I@`` -M``P8@*^D`%BOH@!*^I`'ROJP"$`*(H(8QB`&B,HQDD -M)`3_`0`"$$``9!@D,$(`_@!B&"6LHQDD$`#_,P````",A06XC(,``#0"@`", -MI@`T`&(8(8QJ`.PD!/__C&D`\(QG`/A0P``0K*D`,#P(OJ8`YA`K`.H8(Q1` -M``HU"')1C*(`+(RD`#``:1@C`&88(P!B&"$`9!@A`&@`&0``&!```R/"K*D` -M,*RG`#2LJ@`L`^``"`"`$"&,@P``-`*``#"E``<`8A@AK&4`6*R%&T@#X``( -MK(`;3(R"&_0`@&`A,,8W`(Q"````H&@A)8X;:(Q$``0D`A4`$,(`-0``&"$L -MPA4!$$``!P`#$$`D`A(`$,(`,20"%`!0P@`!)`,``@`#$$``1!`AE$4`EI1& -M`+241`"0E$@`G)1#`*Z41P"ZE$D`HI1*`,``!2F`E$L`QI1"`*@`A2`E``8Q -M@``(0P``9A@E``<[``"(("4`"4R```(6``!G&"4`"E2``(D@)0!J&"4`"UX` -M`((@)20"``$1H@`-`&LH)3FB``(`HB`*C8(``#0#@`"MS0`T`$,0(:Q$&6"- -M@@```$,0(:Q%&60#X``(`````!``__4`@"@A$`#_TR0#``(0`/_1)`,``2>] -M__"OOP``C*H!$``'/@`Q"`#_``<^`Q%(`!DDJ0"4K*@!$(R"!9@D0@`!K((% -MF"0"``&A(@`_C((;4!1```,D`@`"4,(`!($B`":/OP```^``"">]`!`D`P`! -M`&@P"B1"``(`XA`J%$#_^`#`*"$,`#*9`````!``__6/OP``C((;4!1`__*/ -MOP``D2,`/X$B`#\D9@`!``8>`"A"``,00/_K``,>`R0"``$D!0`"`$HH"B0" -M``,48O_EH28`/Q``_^L`````E(,;(SB```D`P`_ -M`$40(:Q#&?0#X``(`````#0#@```0Q`A$`#_TB0#``^,A```/`/\_S1C__^, -M@D`0-`6```!#$"2L@D`0C.0``"0#__V,@D`0`$,0)*R"0!",X@``)`,`#`!% -M$"&L0QGPC.(``"0#``$`11`AK$,!!(SD```D`\!_`(4@(8R"`!P`0Q`D-$(3 -M@*R"`!R,X@``)`,`?P!%$"&L0QATC.(``"0#``X`11`AK$,8>(SB```D`P#_ -M`$40(:Q#&?00P``&C.(``"0#`!\`11`AK$,8<`/@``@`````)`,`#Q``__L` -M11`A)[W_\*^R``BOL0`$K[\`#*^P``",@@``-`.```"`B"$`0Q`AC$(`S#!" -M``$00``'``"0(8^_``R/L@`(C[$`!(^P```#X``()[T`$(XC```T$(``)`0` -M/`!P&"&,8@#,-$(``:QB`,P,`&D_`````(XB````4!`AC$(`S#!"``$00``- -M)!``"0P`:3\D!``"CB(``#0#@``F$/__`$,0(8Q"`,PP0@`!$$```R0"__\6 -M`O_U`````"92``$J0@`"5$#_XXXC```0`/_;C[\`##P+_]\\#=`^/`S0/CP* -M&2\\"1DK-`B``#0'@``U:___-:U&2#6,9X@U2K44-2FU%!"@`!0`@#`AC(,` -M``!H&"&,8@#`-$(`@*QB`,",@P``/`0`(`!H&"&,8@`$`$00):QB``2,P@`` -M`$@0(:Q-(@B,P@```$@0(:Q*&7`#X``(K,`;4(R#```D!/]_`&<8(8QB`,`` -M1!`DK&(`P(S#````9Q@AC&(`!`!+$"2L8@`$C,(```!'$"&L3"((C,(```!' -M$"&L21EP)`(``0/@``BLPAM0C((;])2#&^8D!@`!`(`X(1!F``>,0@``5&`` -M/(SB``",0@`$C$(`-%!``#B,X@``C.(``#0%@``D`P`/`$40(:Q#&'",X@`` -M)`,`#93D'/8`11`AK$,8=(SB```D`P`,,(0`\`!%$"&L0QAXC.(``"0#``4L -MA``P`$40(:Q&&?",X@```$40(:Q#&?04@`````"`,"$0:0`' -MC$(``!1@`#D`````C$(`!(Q"`#000``U`````(S#``"4Q1SVC&)`$#"E`/`L -MI0`P`$@0)*QB0!",Q```)`/__8R"0!``0Q`DK()`$(S"```D`\!_`$<0(:Q) -M`02,Q````(<@(8R"`!P`0Q`D-$(/@*R"`!R,P@``)`,`#P!'$"&L0QAPC,(` -M`"0#`'\`1Q`AK$,8=(S"```D`P`.`$<0(:Q#&'B,P@``)`,`#`!'$"&L0QGP -MC,(``"0#`/\`1Q`AK$,9]!2@``:,P@``)`,`%`!'$"&L0QGX`^``"``````D -M`P`8`$<0(:Q#&?@#X``(``````"`."$``#`A),(``0#F("$P1@#_+,,`("0" -M__\48/_ZH((`!)#B``,D0O__,$8`_R0"`/\0P@`1``800`!&$"$``A#``$<0 -M(21"`"B00P`(),7__P#C("&@A@`$D$(`"0!B&"4`XQ@AH&8`!"0"`/\PI@#_ -M%,+_\0`&$$`#X``(`````">]__"OL```/!"``B80-LBOL0`$K)`]`!`GO?_@+*(`!:^S``ROL``` -MK[\`$*^R``BOL0`$`("`(1!``,0D$P`6/`.``@`%$(`D8PX$`$,0(8Q"```` -M0``(`````(R$```T`H``/`,`!`""("&,@@`$`$,0):R"``00P``/``"8(8X% -M```D`]__/`3__(RB0!`TA/__`$,0)*RB0!".!0``/`,``HRB0`0`1!`D`$,0 -M):RB0`0``)@A`F`0(8^_`!"/LP`,C[(`"(^Q``2/L````^``"">]`"!0P``: -M``"8(8R$```\`__\-&/__XR"0`0``(@A`$,0)*R"0`2.`@``/`,``8Q"0!`` -M0Q`D4$``#0``F"$,`&D_)`0`R(X%```\`__\-&/__XRB0`0F,0`!*B0`%`!# -M$"2LHD`$5(#_\(X"```68/_<-`*``(X#```\!/_[`&(8(8QB``0TA/__`$00 -M)*QB``00`/_4`F`0(8R$```T`H``/`,`!`""("&,@@`$`$,0):R"``10P/_* -M``"8(8X$```\`__\-&/__XR"0!`T0B``K()`$(X$``",@D`$`$,0)#P#``$` -M0Q`EK()`!!``_[P``)@A$,#_NP)@$"&,AP``)`+__20%``&,XT`,)`8``0`` -MB"$`8A@DK.-`#(X#``",8D`0-$(@`*QB0!`,`#,F`````(X$```\`__\-&/_ -M_XR"0`0`0Q`D/`,``0!#$"6L@D`$C@(``#P2``&,0D`0`%(0)%1`_YX``)@A -M#`!I/R0$``J.!```/`/__#1C__^,@D`$)C$``2HE`9``0Q`D`%(0):R"0`2. -M`P``C&)`##1"``&L8D`,5*#_ZXX"```0`/^,`F`0(1#`_XDD`O_^C(4``#P$ -M__R,HT`,-(3__P``B"$`8A@DK*-`#(X#``",8D`$`$00)*QB0`2.`@``/`,` -M`8Q"0!``0Q`D4$``$0``F"$,`&D_)`0`"HX$```\`__\-&/__XR"0`0F,0`! -M*B4!D`!#$"2L@D`$C@,``(QB0`PT0@`"K&)`#%2@_^R.`@``C@8``#P#__PT -M8___C,)`!`(`("$``"@A`$,0)*S"0`0,`#,F```P(1``_UT"8!`A$`#_6B03 -M`!&,@@``K$4`#`/@``@`````C(,``"0"``2L8@`()`(``:R"%^0#X``(```` -M`">]__"OL@`(K[```*^_``ROL0`$C(,``"0"`"``@(`AK&(`"(R"&[0P0@!` -M$$``!202`^B,@AP<)`,G$#A"``4`8I`*$D``#0``B"&.`@``)`0`"B8Q``&, -M0@`(,$(`!!!```T``!`A#`!I/P`````",A`K5$#_]HX"```D`@`6C[\`#(^R -M``B/L0`$C[````/@``@GO0`0K@`7Y!``__F/OP`,)[W_\*^P``"OOP`$C((7 -MQ!1```P`@(`AC@0``#0"@`"/OP`$`((@(8R"`$B/L```)`/_WP!#$"2L@@!( -M`^``"">]`!`,`#!<`````!``__..!```C(,``#0"@```8A@AC&(`2#1"`""L -M8@!(`^``"`````",@@``-`.```!#$"&L10!`C((```!#$"&L1@!$`^``"``` -M```LP@`%`(!((1!``#0`H$`A/`.``@`&$(`D8PY@`$,0(8Q"````0``(```` -M`#"E`#\Q`@0`-*,`0(R$````HA@*-`:``#$%"``T8@"``$48"P"&("&M*!M$ -MK(,`/(TB&T2-(P``)`<`(#!%`$``X"`A,$(`@`!F&"$0H``#``(@"CP"`@(` -M@B`E-((`"`!%(`NL9`$,C2(;1`#@("$P0P!`,$(`@!1@``\``B`*5(``#HTC -M``"-(@``)`3_[XQ#`#0`9!@DK$,`-(TB```D!/_WC$,`-`!D&"2L0P`T`^`` -M"`````"-(P``C&(`-#1"`!"L8@`T$`#_]8TB``",A!M$C28``#0'@```A2`E -M,((`/S"%!``T0P!``$48"C1B`(``QS`A,(4(``!%&`N,P@`\C,(!#*TD&T2L -MPP`\C2(;1(TC```D!@`@,$4`0`#`("$P0@"``&<8(1"@``,``B`*/`("`@"" -M("4T@@`(`$4@"ZQD`0R-(AM$$`#_R`#`("&,A1M$``@0)XR&````HB@D,*(` -M/S"D!``T0P!``$08"C0'@``T8@"``, -MK24;1#"D`#\Q`@0`C24``#2#`$``@A@*-`:``#$$"``T8@"``$08"P"F*"&L -MHP`\C2,````($((P10`@,00`0`!F&"$0@``#`*`P(3P"`@(`HC`E-,(`"`!$ -M,`NL9@$,5(#_L8TC``!0H/^CC2(``!``_ZV-(P``C(0;1(TF```T!X``,(,` -M/S"%!``T8@!``&40"C"$"``T0P"``&00"P#',"&LP@`\C2(;1(TC```D!@`@ -M,$4`0`#`("$P0@"``&<8(1"@``,``B`*/`("`@""("4T@@`(`$4@"ZQD`0R- -M(AM$`,`@(3!#`$`P0@"`%&```P`"(`I0@``,C2(``(TC``",8@`T-$(`$*QB -M`#2-(@``)`3_]XQ#`#0`9!@DK$,`-`/@``@`````)`3_[XQ#`#0`9!@DK$,` -M-!``__6-(@```*`P(22E``@PH@`/)`/_\"1"`"<`HR@D`$,X)`"G$"$GO?_P -M`$40*Z^_``2OL````(!`(11```<`H!@AO+$``"2E`!``9Q`A`$40*Q!`__L` -M````)-``$)("``2`@`$``(1PJ#" -M`$N2`@`'``(00C!"``$40``8)0(<&)("``<``A"",$(``11```XD!``;D@(` -M!P`"$0(P0@`!$$``#B4"'!B2`@`'``(1`C!"``$00``"```8(9(#``8D!``< -MH,,`18^_``2/L````(`0(0/@``@GO0`0C$,`/!!@`#BLP@!,C@(````"$\(P -M0@`?`&(0(9!"``2@P@!&D@(`!P`"$$(P0@`!5$``#XT"&U"2`@`'``(0PC!" -M``$00``@`````)#"`$0T0@`!H,(`1)("``(``A%",$(``11`_^$D!``:C0(; -M4!!```H`````D,,`2HT"&TA00P`&K0`;3(T"&TPD0@`!+$,``Q!@``>M`AM, -MD@(``B0$`!T``A$",$(``1``_\\``B`*D,4`2@P`,ID!`"`A$`#_]@````"2 -M`@`'``(10C!"``$00/_@`````)#"`$00`/_<-$(``A``_\T``!`AK(``"*R` -M``RL@``0K(``%"2$``B,@@`$)`/P`#"E#_\`0Q`D`$40)0/@``BL@@`$C((` -M`(Q"``@P0@`$`^``"``"$"LGO?^@K[X`4*^W`$ROM@!(K[4`1*^T`$"OL0`T -MK[\`5*^S`#ROL@`XK[``,(R"&_0`H*`A)(4<&(Q#`!B,0@```("((:^C`!RO -MI@`(``#P(0``L"&OH``4KZ(`&"27&V@``*@AKZ4`)!*``)(D`___)`8`$`P` -M' -M``26(QSVCB0``#0"@``P8P#P`((@(2QC`#`D`@`'K((8`!!@`>X"("`A#`!) -M;@*`*"&6)QST+.(`0A1``#`PY/__CB0``):%```T`H``/`,``@""("$T8Z`" -M)`()M*R#&"P0H@'/CZ,`&(QB``0\`V9F-&-F9Y1"`"0`0P`8``(7PP``&!`` -M`QA#`&(@(Y:"``(D`Q0`,$(W`!!#`;`T`X``CB(```!#$"&L0!E,CB0``#0& -M@``D`OW_`(8@(8R#(B@\!?_^-*4#_P!B&"2L@R(HCB,```!F&"&,8B(H`$40 -M)#1""`"L8B(HCB(``"0#``\`1A`AK$,`8##D__\L@@!#%$``!BR"`$2.(@`` -M-`.```!#$"&L0")4+((`1%1```Z.(@``CB4``"0#@!\\!/__C*(2,#2$?_\` -M0Q`D-$(!X*RB$C".(P``C&(`,`!$$"2L8@`PCB(``#00@``D`P`.`%`0(:Q# -M&'@"("`A`H`H(0.@,"$D!P`_#`!`MB0(``$00``.)`/__X^_`%2/O@!0C[<` -M3(^V`$B/M0!$C[0`0(^S`#R/L@`XC[$`-(^P`#``8!`A`^``"">]`&"/I``< -MCZ8`&`/`."&,@@`$C,4`!`(@("$"@#`A`$#X"0.@0"&6@@`",$($`!1``5@" -M("`ACZ(`&`(@("$"@#`A#``_58Q%``2/HP`($&``!`````".(@``CZ0`%*Q$ -M$4"*XP`ZFN,`/8KB`#J:X@`]BN0`.IKD`#V*Y@`ZFN8`/3!C_P```QH`CB4` -M```"%@``!"("`$,0)3"$_P"6XP`^`$00)0`&-@(`1A`E`+`H(:RB``"/I@`, -M,&(`_XXD`````QH"``(2`([E`$@`0Q`E`,(8)20"``(0H@$I`)`@(8^E`"`\ -M`A"``&48)8^F`"0`8A`EK((`!(C#`$*8PP!%B,(`0IC"`$6(Q`!"F,0`10#` -M*"&(I@!"F*8`13!C_P```QH```(6```$(@(`0Q`E,(3_``!$$"4`!C8"CB4` -M``!&$"6/I@`D-!"```"P*"&4PP!&K*(`"(XD```P8@#_``(2```#&@(`0Q`E -M`)`@(:R"``R.(@``EH,``H^D`!``4!`A,&,W`*Q$`%@D`A0`4&(`]HXE'/R. -M(P``)`+__X^E`!RL8@"`CB0``"0#``J,H@``K(,`%(XF```D`P<``B`@(0#0 -M,"&LPP`8`$#X"0*`*"$40/]]`$`8(8XB&_Q00``/CB4```!`("$``)`AC(4` -M`"92``$0H``(+D8`@8XB``",@P`$)(0`"`!%$"&L0P``5,#_]XR%``".)0`` -M-`.```"C&"&,8@!8KB`;3#!"`/^N(AM(C&(B"#!"(`!00``#KB`;4"0"``&N -M(AM0-`*```"B$"&6@P`"C$(9%#!C`@`08`"[,$0__SP#NBX`!!"`-&.+HP!# -M`!D``!`0``(1`C00@```L!@A)$0`9"0"``&L8A@<#`!I/R02``&.(@``)`,X -M``!0$"&,4Q@(K$,8"(XB````4!`AC$(<)#!"`!`40`"5`````(XB```T!H`` -MEN0`'`!&$"&L4Q@(CB,```!F&"&,8AA@-$(``:QB&&".(P```&88(8QB&&`T -M0@`"K&(88%"``(*.(AOTEH(``B0#$@`P0C<`$$,`?"0"``*.)1OTC*,`+!!B -M`'@D`P`!CB0``*RC`"P`AB`AC((9(#1"\`"L@AD@CB,``#P$``$`9A@AC&(9 -M(`!$$"6L8AD@#``].0(@("$``)`ACB0``"0#``$"0Q@$`!(0@"92``$`1!`A -M+D0`"JQ#$`!4@/_XCB0``(XC```\`@`(-$((H*XB&T"L8@"@CB4``#P#``<\ -M!@"`C*(`K`(@("$`0Q`EK*(`K(XB&T".(P```$80):XB&T",8@"@`$80):QB -M`*".)0``/`,@`(RB`*P`0Q`EK*(`K`P`+'8`````%$``/P```````)`ACB(` -M`#00@``D!``*`%`0(8Q"&&`P0@`!$$``!B92``$,`&D_`````"Y"`&140/_V -MCB(```P`,_8"("`ACB,``#0"@``\!/Y_`&(8(8QB`"`TA/__`$00)*QB`"". -M(ANT,$(`0!1``!\"@"@A`B`@(0P`,\$``"@AEB,<\"QB``900``.CB(``"0" -M``508@`(EB(<\HXB```T`X```$,0(20#`%*L0P$($`#^Q0``&"$L0@`(%$#_ -M^(XB```\`P`!-&,`J@!0$"&L0P$8CB(``"0#,A``4!`AK$,!'!``_^Z.(@`` -M#``Z*P(@("$0`/_@`B`@(0P`++@"("`A$`#_P```D"&.(AOT$`#_DZQ``"P, -M`&D_)`0`R"Y"`!000/]H)E(``8XB```T`X```$,0(8Q"'"0P0@`0%$#_]0`` -M```0`/]@CB(``#P"S,PT0LS-`((`&0``$!`0`/]'``(0P@(@("$,`#,5+*8` -M`1``_PB.(P``CZ(`(`!B&"40`/[8/`(0@@P`0&X"@"@A$`#^IX^B`!B/HP`8 -MCB4````$(".,8@`$``0D@#P#`/R`0@`B`(,@)#0#@````A`C``(1@#!"#\`` -MHR@A`$00):RB&4P0`/Y%CB0``(^F`!@\`F9F-$)F9XS#``2$9``FE&,`)`!D -M&",`8@`8``,?PP``$!```A!#`$,0(P`"%``0`/XM``(D`PP`:3\D!``!`!Z` -M@```F"$D$@`H/`.``B1C%[P`$Q#``$,0(8Q$```"`Q@ACB(``(QE```FM0`! -M`$00(3*C`#\F4O__)A``&"9S``,D!``!K$4``!!@`#L`````!D'_[CP#@`(, -M`&D_)`0``0``@"$\`H`"`!`8P"1"&Y0`8A@AC&0``(XB``",90`$)K4``0!$ -M$"$RHP`_)A```20$``&L10``$&``(P`````J`@$>%$#_\#P"@`(,`&D_)`0` -M`0`6@(```)@A)!(`/SP#@`(D8R2$`!,0@`!#$"&,1````@,8(8XB``",90`` -M)K4``0!$$"$RHP`_)E+__R80``PF``(0`/VJ)!8``1``__TD'@`!$`#_\B0>``4`@#@AC(0``#0&@``D`__\ -M`(8@(8R"`,"4J``"`$,0)#1"``*L@@#`C.0``"0#_\,Q!2```(8@(8R"`,`` -M0Q`D-$(`&*R"`,",X@```$8P(8S"`,@P0___/`(G$!2@``,`8B`E/`(J^`!B -M("4Q`B``,$7__S$""``T"8``K,0`R!!``!DD`\``C.0```")("&,@@`4`$,0 -M)#1#$3`T0@^@`&40"JR"`!2,X@```$D@(8R"`,0P0___/`(%>!2@``,`8A`E -M/`(&!`!B$"6L@@#$)`,$L"0"!2@Q!"```$08"HSB``"L0Q!P`^``"```$"$G -MO?_PK[\```P`.\\D!0`"C[\```/@``@GO0`0)[W_X*^V`!BOM0`4K[0`$*^S -M``ROL@`(K[```*^_`!ROL0`$`*"8(0"`@"$D%@`!``"0(0``J"$0H``F``"@ -M(92E``*4@ASV,*,W`#!"`/`X8Q0`-*0"`"Q"`#`40``&`(,H"C"C`@`D%`#K -M)`(`Z@!#H`HD$@`(,*,&`"0"!@`08@!6,*,$`#9"``$`0Y`*,*(@`#9#``(P -MI`@`$(``30!BD`J.`ANT,$(`0%!```2N`!V()`(``392`!"N`AV(,*,!`"0" -M``,``*@A`$.H"P``L"$"`"`A#``[SR0%`!,00``,`$"((0(@$"&/OP`]__"OL0`$K[```*^_``B,BQOT)`(``0"`@"&- -M8P`L`*"((1!B`#\DA!MHEB(``B0#$@`P0C<`$$,`!"0"``*-8P`L4&(`(HX% -M```"("@A#``]!`(`("&6)0`",*(``11``!4D`P`8C@,``#0"@``PI"```&(8 -M(8QB&&`T0@`"K&(88!2```D`````E@(<]C!"`/`L0@`P%$``!P``&"$PH@0` -M$$``!8^_``@,`$AQ`@`@(0``&"&/OP`(C[$`!(^P````8!`A`^``"">]`!`T -M!H``D(0`4P"F*"&,HQD@/`+__S1"#_\`!",``&(8)#"$\```9!@EK*,9((X$ -M```D`@`!K6(`+`"&("&,@QD@/`(``0!B&"6L@QD@$`#_S`(@*"&.`@``-`.` -M``!#$"&,0AD@/`,``0!#$"140/^\EB(``JU@`"P``"`AC@,``#0"@``DA``! -M`&(H(8RJ'!`LAP`*C*8<%(RH'!@10``#`````!3```@`!AA"C*(9(#P#``$` -M0Q`EK*(9(%3@__".`P````880@`*$$(`0Q`A``(9PA!@_ZD`!B'"*((``E1` -M_Z<"("@A``@0(P!#`!I08``!```!S8X(```T"8``)`/X'P$)0"&-!QD@`.,X -M)"0#``*M8P`L)`,`'P``$!(``A8```(6`P%$`!LH1?_@*$8`(`!F$`HXI0`` -M)`/_X`!E$`L``A%`,$('X`#B."6M!QD@C@<``"0"_^``Z3@AC.89(`#","0D -M`@`/```@$B2$_X`H@__P*(4`$`!%(`HX8P``)`+_\`!#(`LPA``?`,0P):SF -M&2".`P```&D8(8QB&2`T0@@`K&(9(!``_W0"("@A)[W_X*^S``ROL@`(K[$` -M!*^P``"OOP`0C(,```"`B"$D$___C&(`""00``8``)`A-$(`(*QB``B,@P`` -MC&((@#1"`_^L8@B`,@(`!!!```DR`@`"CB(``(Q"``@P0@`$%$``!#("``(D -M`O_[`@*`)#("``(00``*,@(``8XB``",0@A`,$(#_Q1```4R`@`!)`+__0(" -M@"0V$``!,@(``1!```T``#`ACB0`````*"&,@@H`)*4``2RC``HP0@`#`,(P -M(11@__HDA``$%,```B0"__X"`H`D$@``#B0$`#(,`&D_)E(``2Y"``H40/_7 -M,@(`!`)@$"&/OP`0C[,`#(^R``B/L0`$C[````/@``@GO0`@$`#_]P``F"$G -MO?_@K[,`##"B`!$D$___K[$`!*^P``"OOP`0K[(`"`"@@"$`@(@A$$``)P"E -MF`L``"@A#``TY20&``$00``)`$`8(8^_`!"/LP`,C[(`"(^Q``2/L````&`0 -M(0/@``@GO0`@CB(```(@("&L0``DCB(``(Q"`"0,`#N(`````!!``$HD`O_O -M#`!I/R0$``^.(@``)`0``380`!.,0@`,#`!JO``````,`&G3``````P`::L` -M````#`!I/R0$``H,`&J\```@(0P`:3\D!``/CB(``"0$``\RC(,`````,"$0 -M`/_:)`@``8R"&[2,@P```(`H(0`"$((P0@`!K&($((RB&[R,HP``/`0`$``" -M$@(P0@`'K&(&`(RC```TA`(!```X(8QB!@`DIAT!-$(`"*QB!@",H@``K$0& -M!(RB``"L0`8@C*(``*Q'!`"0Q```C*(``"3G``$LXP"`K$0$!!1@__@DQ@`! -M`^``"``````GO?_`K[X`,*^W`"ROM@`HK[4`)*^T`""OL@`8K[\`-*^S`!RO -ML0`4K[``$)3"``*,@QOT,.?__S!*-P`D`A4``*!((0#`D"$`@*@A`0#P(:^G -M``",<0`$``"@(0``L"$``+@AKZ``"*^@``P``"@A$4(!-HQS`"`I0A4!$$`! -M/R0")``D`A(`$4(!-B0"%`!10@$OE2(`]H^B```\!(`"/`.``@`",(``!2A` -M)(0GC"1C)Z0`J2@A`,0@(0##&"$\`H`"C(0``(QC``"4IP#2C$(GB)2E`(2N -M9``$KF,`"*^G``2N8@``)F,`#"0$`"<\`H`")$(GO`#"$"&,0@``)(3__R3& -M`!BL8@``!('_^"1C``0F<``,`@`@(20&``$D!P$N#``^V```0"&7Q0```@`@ -M(20&``(D!P$.#``^V```0"&7Q0`"`@`@(20&``(D!P$!#``^V```0"&60@`" -M,$($`%1``,Z.(@`(/_F)A``!(^_`!"/LP`,C[(`"(^Q``2/L````^``"">]`"`DQO__)[W_ -M\*^_````H%`A,,@`!P``8"$`!A#"`*!((1B@`!P``%@A``(0@`!$,"$!"2@A -M**,`"20"``@`0R@*)`(``0$"(`0`HA`$)(3__XS#```D0O__`$00)@`'(,`` -M@A`$`&(8)`"#&`8!*!`A`0,8!@%C&`0`J"@C)$G_^`"4!95@A``!`(1T@ -M_^@DQ@`$`8`@(0P`6)0!0"@AC[\```/@``@GO0`0)[W_\"0$`."OOP`$K[`` -M``P`>E<`H(`AK@(`((^_``2/L`````(8*P!@$"$#X``()[T`$">]__"OL``` -MK[\`!(RB`"``H(`A%$``!0!`("&/OP`$C[````/@``@GO0`0#`!Z:@`````0 -M`/_YK@``(">]_]"OO@`@K[8`&*^T`!"OLP`,K[(`"*^Q``2OOP`DK[<`'*^U -M`!2OL```C((;]`#`\"&4Q@`"C$,```"`B"$PPO__``(B`@`"$P(P4P`!,,@W -M`"0"%0``H)`AE'<``#"4``$1`@#U``"P(2D"%0$00`#V)`(D`"0"$@`1`@#Q -M)`(4`%$"``$D%@`"CB<``#0"@```%JA``.(X(0*R@"&,XAD0E@,`BB0$_`8` -M1!`D``,9``!#$"6.)1N<-$(``0(@("$PQO__K.(9$`P`,J$`````*NI0`!5` -M``:6!``\4H``!8XE````$Q!``%(0(91$`$*.)0``-`*````$(<``HB@AC*(8 -M1"0#P'\PA#^``$,0)`!$$"6LHAA$`M(P(15```6`Q0!H4H``!(XD```""/OP`DC[X`((^W`!R/M@`8C[4`%(^T`!"/LP`, -MC[(`"(^Q``2/L````^``"">]`#`T`X```$,0(:Q`&>`0`/_QC[\`)!5`_^0J -MXE`!$`#_UHXF```0`/\3)!8``A``_Q$D%@`!$0(``R0")0!5`O\.CB<``!`` -M_PL``+`AE*8``I2E```\`F0`,,8!`#P#R```9A`+`$4`&U"@``$```'-`(!0 -M(20(`!\``$@2`0D0!C!"``%40``%C48``"4(__]5`/_[`0D0!HU&```D`@`F -M`$A`(S0'@``D`P`7`,]_\`D0@]\`Z`8(21$`$",10``C$8`!(Q'``B,2``,K&4``*QF``2L9P`( -MK&@`#"1"`!`41/_V)&,`$`/@``@GO0!`)[W_$*^^`.`GO@`0``<\`*^W`-RO -MM@#8K[(`R*^Q`,0`H)`A`("((0``*"$#P"`A`,"X(2>V`)`D!@"`KZ@`M*^_ -M`.2OM`#0K[``P*^U`-0`!X0##`!PJJ^S`,P"P"`A```H(0P`<*HD!@`@ED(` -M`HXC&_0``$`A,$(@`(QT```00`#\KZ``N(8B&\"6(QO``@`@(0!0$"I40``! -M`&`@(0`$%````H0#*@(`0!1```("`#@A)`<`/P`'%````H0#*@(`/U!```26 -M(QO$%@``"">U`+*6(QO$/`*``B1"+,```QA``&(8(81H```GM0"RK[4``(Z& -M``PGLP"P`@!((0(@("$"P"@A`D`X(0*`4"$,`$4$`F!8(3P"@`*,0D/\6$`` -M!(XB&_0,`$"D`L`@(8XB&_0"8#`A`J`X(8Q"`!@"X$@A`B`@(8Q"``@GI0`0 -M`$#X"0)`0"&6(QSVEZ(`KC!C`/`D0@`$+&,`,!1@`+^GH@"NEZ,`LB0"`#\# -MP"`A`$,0(S!%__\``#`AE(,`@"3&``$HQP`0`*,8(3!B__\L0@!`%$```Z2# -M`(`D`@`_I((`@!3@__4DA``"CB(;](Q#``"D10`DC&(`!)1"`"@L0@`"$$`` -M)SP"@`*6(AST+$(`0A!```>/H@"TED(``B0#%``P0C<`4$,`?)9#``"/H@"T -M%$``!30%H8"/H@"X$$``&#P"@`(T!:&````P(0`&$(`GHP`0`$,0(91#``"4 -M0@`"CB0````#&@```A(`-$(`_S1C`/\``A0`,&/__R3&``$`0S@E`(4@(22B -M``0HPP`@K(<``!1@_^TP1?__/`*``HQ"0_PH0@`"$$``5P````"7HP"6EZ0` -ME)>B`)(P8P`_,(0`/P`$)````QX`,$(`/P!D&"4``A(``&(8)9>B`)"7I`"< -MCB4``#!"`#\`8C@EEZ,`GI>B`)HPA``_,&,`/P`$)````QX`,$(`/P!D&"4` -M`A(``&(8)9>B`)@T!H```*8H(3!"`#^LIQDTEZ0`H@!B."67HP"DEZ(`KC"$ -M`#\P8P`_``0D```#'@`P0@`_`&08)0`"$@".)0```&(8)9>B`*``IB@AK*<9 -M.#!"`#\`8C@EEZ0`JI>C`*R7H@"HCB4``#!C`#\PA``_``0D```#'@`P0@`_ -M`*8H(0!D&"4``A(`K*C`)8D`@FT$&(` -M$#P#9F:.@@`$-&-F9Y1"`"0`0P`8``(7PP``&!```QA#`&(X(P+`*"$"("`A -M#`!&;2>F`!`D`@`!$`#_=*^B`+B.@P`$/`)F9C1"9F>$9``FE&,`)`!D&",` -M8@`8``,?PP``$!```A!#`$,0(P`"%``0`/_L``(\`Q``_U,``"@AAB(;PI8C -M&\(0`/\%`@`@(2RC`$``H#@A)`(`/P!#.`HGO?_@``<\`"2%&W``!SP#`Z`P -M(:^_`!`,`$"V``!`(8^_`!`#X``()[T`(#"$__\PI?__,,;__P`'/```"$0` -M`,1((P"%4",`Q1@C``<4`Q#%``P`""0#`2(`&%!@``$```'-<40`````$!(` -M``````````!#`!H``!@2``,4```"%`,#X``(`````)2C````!"0`,,;__P`$ -M)`,`!A!``*(0(0!D&"H48``$A$+__JS@```#X``(K0````""$"H40``$),+_ -M_ZSB```#X``(K0(``!#```X``!@A``,00`!%2"&5(@``$$0`#21J``&5(@`" -M`((0*A1```D`P``F"$D$@`!%$`` -M-```&"$``(`A`!(00`!1$"&40@```%`0*Q!```H`$Q!`)N+__P)"$"H00``& -M`!,00"9B``$F0P`!,%/__S!R__\`$Q!``!(80`!6("$`=D`A`%$0(0!Q&"&4 -M9@``A(<``)1%``"%"```#`!!Y@(`("$``B0```0D`P`0&$``=1@A`)0@*A2` -M``RD8@``+@(`0!!```HF`@`!`@`0(28#``$P]`#"$@@!^A(,```"`2"$` -M0Q`C*$(`?Q1``$24A`!^)(+_@@`"%````E0#``04```")`,DA___)`(`/R4F -M`'XDQO_^A,,``"1"__\``A0``.,8*A!@``,``A0#!$'_^23&__X`0#`A)`<` -M/R3#__\P8O__+$(`/Q!``!(`!A!``$D0(81"````1!`J%$``#0`#%````C0# -M``800"3#__\`24`A,&+__RQ"`#\00``%`````(4"````1!`J$$#_]0`#%``0 -MP``,).+__P`'&$`DA/_^``(4``!E&"$`!"0```(\`Z1F```$X?_@``0D`P/@ -M``@!0!`A!.#__0``````!Q!``$4H(23B__^4HP`"``(4```"/`.DHP``!.'_ -M^B2E__X0`/_R`````!``_[\`8%`AA((`?H2H````@%`A)`P`0`!($",H0@!_ -M%$``392#`'XD8O^"``(4```";`,``Q0```(D`R0)`#\DB___)4@`?B4(__Z% -M`P``)2+__P`"%``!8Q@J$&```P`"3`,%(?_Y)0C__I2B`'X!($`A)`D`/Z3B -M``"$X@```$00*E!``#$``&`A%0```P````!5@``M``!@(1D```X`"!!``$H8 -M(81B````1!`J%$``"24"__\``A0```)$`QD```4D8__^A&(```!$$"H00/_Y -M)0+__Q4```,E(O__$8``#0```````A0```D80"2$__X`9A@A``0D```"3`,! -M#!`EI&(```4A_]P`!"0#`^``"`&@$"$%(/_]```````)$$``1C`A)2+__Y3# -M``(``A0```),`Z3#```%(?_Z),;__A``__(``````*!0(1``_](D"``_$`#_ -MM@$`:"$GO?O0K[X$(*^_!"2OMP0K:>B`[JGH@.X``,<0``$)$"4Q0`&``0D -M`P`#'`.OI`/@KZ,#Y```J"$``(@A)Z0#N`(E$`W`0@"X"`A`!&`@`(1@"$`$("``A6`(984``8F!0`()[,!(``4B$`"(#`A -M#`!PG280`!`"`"@A`B`P(0P`<)T"8"`AAJ<``B>R`S@"@"`A`N`H(0)@,"$, -M`$(F`D!`(1!``*:/I@/P`D`@(2>E`[@`W1`A)$,!.#!B``,00`$4KZ8#Z`"@ -M$"&(AP``F(<``XB(``28B``'B(4`")B%``N(A@`,F(8`#ZAG``"X9P`#J&@` -M!+AH``>H90`(N&4`"ZAF``RX9@`/)(0`$!2"_^XD8P`0E[$#N@+@("$`$8"` -M`A&`(0`0@(`"%8`AEA0`!B8%``@F$``0`!2(0`P`<)T"(#`A`@`H(0(@,"$, -M`'"=`F`@(8:G``("@"`A`N`H(0)@,"$,`$(F`D!`(1!``'./IP/H`D!`(0#] -M$"$D0P(X,&(``Q!``-4GI`.X`(`0(8D$``"9!``#B04`!)D%``>)!@`(F08` -M"XD'``R9!P`/J&0``+AD``.H90`$N&4`!ZAF``BX9@`+J&<`#+AG``\E"``0 -M%0+_[B1C`!"/J`/PCZ,#[(^B`\0FU@`!)0@`@"1C`%0`5A`KKZ@#\!!`_XBO -MHP/LCZ<#W(^F`\"/I0/$C.0````&$$"7IP.Z`$00(0`%&$``9!@AE%0``#0" -MWJT`IJ@C$.(`@91S`````(@A`Z"0(0`5@8"/J`/8`A&`(0`0@$`"'8`AAD8"8#`ACZ,#V(9'`CB&"`(XE&0```*`*"&F0@`( -M`F`P(0P`0>8F,0`!+B,`0*9"`(@48/_I)E(``B0"``(40`!%AZ,!!H^G`^`` -M9Q`J%$``!(^H`^0`:!`J$$``*8^E`\R/I0/,#`!">B>D``@`0$@A``(?PI>B -M`(:7I0.XCZ8#T``"%````B?"CZ<#U``"%`,!(Q@A`$00(0`"$$,``QA#I\4` -M`J>B``"GQ0``I,,``*3B``"/J`/4CZ,#R)4"``",9!OT)`,`/P!B&".D@P`D -MC[\$)(^^!""/MP0B>D`(@`0$@A``(?PI>B`0:7I0.Z`2,8(0`"%````B?"``(4`P!$ -M$"$``A!#I\4``H^D`]"GH@``I\4``(^E`]0``QA#I(,``!``_]FDH@``CZ8# -MS">D``@GI0"(#`!"QB>G``(`0$@AEZ,``@`")\*7H@"&``,<```#+\(``A0` -M``(WP@`#'`,``A0#EZ@#N)>G`[H`91@A`$80(8^E`]"/I@/4`20@(0`$($,` -M`QA#``(00Z2D``"GHP``I,(``*?'``(0`/^ZI\@`````B"$#H(`A`!41@`!1 -M$"$``A!``%T0(81(`3B/H@/8A@8F,0`!+B,` -M0*8"``@48/_Q)A```H^E`\P,`$)Z)Z0`"`!`2"$``A_"EZ(`AI>E`[B/I@/4 -M``(4```")\(``A0#`$00(8^D`]`!(Q@A``(00P`#&$.D@P``IZ(``*3"``"G -MQ0`"$`#_DJ?%``"-`@``C04`!(T&``B-!P`,K&(``*QE``2L9@`(K&<`#"4( -M`!`5!/_V)&,`$!``_S6/J`/PC(<``(R(``2,@@`(C(8`#*QG``"L:``$K&(` -M"*QF``PDA``0%(7_]B1C`!`0`/[VE[$#NB>S`0@"8"`A`!&`@`(1@"$`$("` -M`A6`(984``8F!0`()[(!(``4B$`"(#`A#`!PG280`!`"`"@A`B`P(0P`<)T" -M0"`AAJ<``B>P`S@"@"`A`F`H(0)`,"$,`$(F`@!`(1!`_V6/I0/P`@!`(0"] -M$"$D0P$X,&(``Q!``!)!``(F00` -M"XD%``R9!0`/J&8``+AF``.H9P`$N&<`!ZAD``BX9``+J&4`#+AE``\E"``0 -M%0+_[B1C`!`0`/[RCZ@#\(T&``"-!P`$C0(`"(T%``RL9@``K&<`!*QB``BL -M90`,)0@`$!4$__8D8P`0$`#^Y8^H`_`D8P`L$`#^0:^C`]P0`/_])&,`(!"" -M``,D`B4`%(+^/(^D`]00`/_W)&,`%">]_Y"OJP`HCZL`<"0"`#^OO@!@K[<` -M7*^V`%BOM0!4K[0`4*^R`$BOL0!$K[``0*^_`&2OLP!,`."@(:^B`"PD`O_! -ME.<``I:#``RE8@``CZ(`*`%`D"&-2@`$)`L`/Z1+````"$0```E,```#&$"5 -M0@$6``A$`P`)3`,P8___KZ@`(*^I`"2OHP`PDI,`#@"`J"$`H(`A`,"X(3#^ -M-P`D%@`_``"((1!``!2OH``T`!$00`!*$"&40@$8,$/__Q!@``B``27HP`"EZ0```$B*"H!(S`J`20X -M*@$E$`L!)A@+`2<@"Z8"``JF`P`,I@0`#J8)``BF"0`&I@D`!*8)``*F"0`` -MED(``"Q"0`!40``,I@D`'C/#$``08`"*CD(`!)1"``X!(A`J5$``!`$@$"$0 -M8`""CD(`!)1"``ZF`@`>E@(`#H^K`"B.I!OTI6(``)8#`````Q0```(4`ZZB -M!9RL@@`HCZ(`<*1#```SP@(`%$``%8^C`#@D`A0`4&(`$Y;G`'*/HP!PCZ0` -M-(^_`&2$8@``KJ0%H(^^`&"NH@6D`!(`!A0```),`P$E$"H!(B@+`2HP*@$C."H! -M)$`J`2`0(0%&$`H!)Q@+`2@@"Z8"`!"F`P`4I@0`&*8%`!RF`P`2I@0`%J8% -M`!J6HAO&$$``#(^D`"@``A!`I@(`$*8"`!:F`@`4I@(`$I:B&\8``A!`I@(` -M&*8"`!RF`@`:CZ0`*)8#`!J$@@```&(0*E1```&D@P``CZL`<)8#`!"%8@`` -M`$,0*E1`_Y>E8P``$`#_EH^C`'`0`/_(```0(1``_W^40@`,$`#_=Y1"``P0 -M`/]0```0(1``_R$FY@`",F,`^#1S``&40@$6$$#_%```B"&.0P`$`!$00`!# -M$"&40@$8,$/__Q!@``]_^",0@``)`4` -M"(Q"``2`3@`BB8(``)F"``.)@P`$F8,`!XF$``B9A``+B8@`#)F(``^KH@`` -MNZ(``ZNC``2[HP`'JZ0`"+ND``NKJ``,NZ@`#XF"`!"9@@`3B8,`%)F#`!>) -MA``8F80`&XF(`!R9B``?JZ(`$+NB`!.KHP`4NZ,`%ZND`!B[I``;JZ@`'+NH -M`!\`!5A``7T8(91B`````$@A``!H(0!.$".D8@```7U`(84"```$0@`!I0`` -M`"0"``@1(@`Y``D00`!,$"&40P``A0H``"4B``$P2?__$4,`)Y4$```M(@`0 -M5$#_\0%]0"$!?2`AA((``"A"`$`40``$`6P0(20"`#^D@@```6P0(91"``"$ -MA```)*4``0!'$",H0P````,0"P`"$$``1A`AE$,````$($`PI?__`(8@(2RB -M``\40/_2I(,``"0%``@`!1A``'T0(91$```DH@`!,$7__P!L&"$LH@`/%$#_ -M^*1D```#X``()[T`(!%```4D@@`!+:(`,Q1```(D@O__)((``:4"```EH@`! -M,$W__Q``_]```$@A$`#_SB0)``\GO?_`K[,`+*^R`"BOL0`D,)+__Z^_`#"O -ML``@`*"((203`#\``"`A``00P`!1$"&40P````000"2&``$08``%`%TH(3#$ -M__\L@@`(%$#_]J2C````@(`A)Z<`$`)`("$GJ``2`Z`H(0P`1[L"`#`A$@`` -M"P``("&7I0`0``000`!=$"&40@``$$4`!22#``$P9/__`)`0*Q1`__D`!!!` -MEZ,`$)>B`!(08@`/``00P`!1$"&,0@`$$$```P`$$,``41`AE%,``@)@$"&/ -MOP`PC[,`+(^R`"B/L0`DC[``(`/@``@GO0!`%'+_\0`````0`/_T`%$0(2>] -M_\"OL``@,/#__Z^V`#BOM0`TK[0`,*^S`"ROL@`H`*"8(:^_`#ROL0`D`,"0 -M(0$`J"$``*`A``"P(1(```T``"@A``40@`!%$"$``A!``%(0(91$``@DHP`! -M``400#!E__\`71`A`+`8*Q1@__6D1```EF0```.@*"$GIP`0)Z@`$@P`1[L" -M`#`A$@``#@``*"&7IP`0EZ8`$@`%$$``71`AE$,``"2D``$`9Q`F$&8`-P"B -MH`HPA?__`+`0*Q1`__<`!1!``!2`@``6B(`"%(`A`C:((0`0@$``$8A``C*( -M(0(2@"&6!P`&EB@`!I9D``"7I0`0EZ8`$@P`1X```$@AIJ(`!I8'``26*``$ -MEF0``)>E`!"7I@`2#`!'@```2"&FH@`$E@<``I8H``*69```EZ4`$)>F`!(, -M`$>```!((::B``*6!P``EB@``)9D``"7I0`0EZ8`$@P`1X```$@AIJ(``(^_ -M`#R/M@`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`$`0`/_-`*"P -M(3#G__\Q"/__<.@0`C"*__\PI?__,,;__R0$`&000``>```8(20"``$0Q0`I -M`$D@"P%%&",``Q!``$,0(0`"$,``0Q`A``(0@`#%&",`0P`:4&```0```] -M`!`D`@`W)`<`4R0$`%,0`/_MK@(`$`P`2>T``````$`@(20&`"4``#@A#``_ -M#B0%``8X1``_)`8`0``$,`HDPP`W),4`(P!D*`LD`P`4``08"R1"``0D!P`R -M`$0X"ZX#``RN!0`0$`#_UR3$`#*,A1OTC(0``#0#@`",H@`HA*8`)`"#("$` -M1A`A``(20#!"?@`T0H``K((9,"0"``$#X``(K*(`,">]__"OL0`$K[\`"*^P -M``",A1OT`("((8RP``2.`@`8$$``!R0$__^,HP`P)`(``5!B``F.(@``CB(; -M](Q$`#"/OP`(C[$`!(^P````@!`A`^``"">]`!`T`X```$,0(8Q$&3`P@H`` -M5$#_](XB&_0`!!W",&,``P`$)D(D`@`"$&(`):X$``26(ASV,$(`\"Q"`#`0 -M0``6`B`@(8XB&_26)AMR`B`@(:Q``#`,`$@R`@`H(51`_^&.(AOT#`!(SP(` -M("%00/_=CB(;]`(`*"$,`$C;`B`@(1A`_]K,(`'!"@`!HD`___ -MK,0`"(S#```\`H`#C$2*L"1G__\`!QC`C,(`'`!G&"$``QB``&08(:S'``", -M10`0C&(`&(S$``@D8P`(`$40(P`"$$``@B`C`(@0*ZS#`!P40``#K,0`"%3@ -M_^N,PP``)`,``0/@``@`8!`AC,D`#`$D$"L40/_[```8(8SB```D0O__$*+_ -M]R0#__ZLQ``(C.(``"1"__\`HA`K$$#_\20#``*,PP``/`*``XQ(BK`D9P`! -M``<8P(S"`!P`9Q@A``,8@*S'````:!@AC$4`$(QB`!B,Q``()&,`"`!%$",` -M`A!``((@(P$D$"NLPP`<%$``!JS$``B-`@``)$+__P#B$"M40/_HC,,``!`` -M_]4D`P`"/`*``A``_Z@D0BS,)[W_\*^Q``2LH``4`*"((20%``>OOP`,K[(` -M"*^P```,`$GM`("`(0!`("$D!0`!)`8`)`P`/PX``#@A`$"0(20"``%20@`' -MCB(`'(^_``R/L@`(C[$`!(^P```#X``()[T`$`(`("$D!0`'#`!)[810```` -M0"`A)`4`!"0&`"`,`#\.```X(1(2``X`0!@A4@#_[JX@`!0D`@`"$@(`!P`# -M$$`D`@`#%@+_Z8^_``P``Q!`$`#_Y:XB`!00`/_])$+_^Q``_^&N(@`4)[W_ -MX*^U`!2OM``0K[\`&*^S``ROL@`(K[$`!*^P``"4H@`"`*"H(3!"`0`00`!Q -M`("@(8R0'`2.`@``&$``'@``F"$F$0`HDB8`"Y(H``@"`"`A``800`!&$"$` -M`A#``%`0(8Q#`"@\`H`")$)$```#&(``8A@AC&(````(0(`T`X<`)`4`#@`` -M."$`0/@)`0.0(0!`,"&.`P``CH(``"9S``$"8Q@J`%(0(:Q&```48/_E)C$` -M&):B``(P0@$`%$``"H^_`!B.D!P,C@(``!A```8``)@AC@,`*"0"``(08@`* -M)A$`*(^_`!B/M0`4C[0`$(^S``R/L@`(C[$`!(^P```#X``()[T`()(F``L\ -M`H`")%5$```&$$``1A`A``(0P`!0$"&,0@`HDB@`"#0#AP```A"``%40(8Q" -M````"$"``@`@(20%``X``#@A`$#X"0$#D"$`0#`ACH(```(`("$D!0`.`%(0 -M(:Q&``"2(P`))`<``29S``$``Q"`%&``"P)"D"&.`@```F(0*A!`_]4F,0`8 -MCB,``"0"``)08O_;DB8`"Q``_]"/OP`8DB8`"P`&$$``1A`A``(0P`!0$"&, -M0@`H``(0@`!5$"&,0@```$#X"0``````0#`ACH(```!2$"&L1@``$`#_YXX" -M```0`/^0C)`<%)2"'/8P0@#P+$(`,!1``!,PI?__C(,;]"2E__\LH@`'$$`` -M#HQD`"`\`X`"``40@"1C#[P`0Q`AC$(```!```@``````^``"`"`$"$#X``( -M)((`!`/@``@D@@`(`^``"```$"$#X``()((`#`/@``@D@@"L)[W_\*^Q``2O -ML````("((0"@@"&OOP`(#``I;#P%@`".)P``)`/\#P(@("&,X@`P/`6```!# -M0"0P0@/P``(1`BQ&`"42```3+$,``A#```TD0@`!``(1`#!"`_`!`A`EK.(` -M,`P`*3P`````)`(``8^_``B/L0`$C[````/@``@GO0`0#``I/#P%@``0`/_X -M```0(1!@_^\D0O__$`#_^0(@("&,P@`4C,<`$"0#``$`0Q`$`(!((0#`0"$` -MXQ@$C,8`#"1"__\\!``/-(3\`"1C__\``A*``$00)(TG```P8P/_`&(8)0`& -M-0`\`@_P`,(P)``%*(``9A@E`.4X(:SC$$"-)```C0,`(#P"``\T0O__`&(X -M)!!@``,`A2`A/`(`$`#B."6-`@`$K(<0P#!&`"`P0@`$$$``!CP$`""-(@`` -M`$40(8Q#$0``9!@EK$,1`!#```8`````C2,```!E&"&,8A$`-$("`*QB$0`# -MX``(`````">]__"OOP`$K[```(R(&_2,L``(C*,`!(T'``@D`@`!`@)(!`#I -M."4P:@`",&,``0"@,"&M!P`($&``!`(`*"&-`@`,`$D0):T"``P10``$```` -M`(T"`!``21`EK0(`$`P`3HL``````@`0(8^_``2/L````^``"">]`!",A!OT -M)`(``0"B$`2,A@`(C(<`#(R#`!```A`G`,(P)`!B&"0`XC@DK(,`$*R&``@# -MX``(K(<`#(R"````!2B`)*4(``!%$"&L1@```^``"`````",@P``)`(``0"B -M$`2L8@A``^``"`````",@AOTC$,`""0"``$`HC`$`&88)``%*(`DI0H`$&`` -M"@``$"&,A````(40(8Q"```P0@`#%$``!`````",@@A``$80)``"$"L#X``( -M`````">]__``!A!`K[(`"*^Q``2OL```K[\`#`!&$"$`@(@A``(0P(R$```` -M1A`A)`,``0"C&`0`H)`A``*`@*R#"(`"("`A#`!*H@)`*"$F$/__$$``!R0$ -M``H&`@`&CB(```P`:3\`````$`#_]@(@("&.(@``C[\`#(^R``B/L0`$C[`` -M`*Q`"(`#X``()[T`$!"@`!4`H#@AD*(`#@`"$0(P0@`!$$``$8SB``@\`]__ -M``8@*S1C__\`0Q`D``0G0`!$$"6LX@`(C.<`(%#@``>,X@`(D.(`#@`"$0(P -M0@`!5$#_\HSB``B,X@`(/`/?_P`&("LT8___`$,0)``$+T`\`_]_`$40)31C -M__\`0Q`D``0EP`!$$"4#X``(K.(`"``($,``2!`C)[W_P``"$("OO@`PK[<` -M+*^V`"BOM``@K[,`'*^R`!BOL0`4K[``$*^_`#2OM0`D`$00(8Q"&=@`@)`A -M`*#P(:^B``2/HP`$)`(``:^F````X)@A``"@(0``L"$``+@AKZ(`"*^@``P` -M`(@A%&``#B2P``B/H@`,C[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R -M`!B/L0`4C[``$`/@``@GO0!`#``I;#P%@``28``:)`/_\"9T``@R@@`/)$(` -M)P!#*"0"@Q@D`&40(0!#$"L40``'`&`@(;QQ```D8P`0`(40(0!#$"L00/_[ -M``````)`("$"8"@A#`!.AR0&``&OH@`(CH(``(Z#``@``HV",'9__S(Q``$" -M0"`A#``I/#P%@`".`P``/`*`0(X%``P`8A@DC@0`"(^B``@`!34",)5__P`# -M&"L40``+,,8`'U!@``H#P"@A5B``2H_"`$R/HP`$`M40(0!7$",`8A`K$$`` -M$`*W$",#P"@A`D`@(0P`2MHD!@`!CZ,`#!!@_[B/H@``4$#_MX^B``R,10`P -M`D`@(0P`2MH``#`A$`#_L8^B``P"0"`A/`6```P`*6P"PK`A$F``'"9E``@P -MH@`/CH0`""0#__`D0@`G`*,H)`!#,"0D`H```((@)#+#?_\`IA`A`(,@)0!% -M$"NNA``(%$``!P"@&"&\L0``)*4`$`!F$"$`11`K$$#_^P`````"8"@A`D`@ -M(0P`3H]_\"OM``@K[(` -M&*^Q`!2OL``0K[\`-*^^`#"OMP`LK[8`**^U`"2OLP`KB(``)9#&]P\!?^_,((/_P!B&"HTI?__``,=@`"%("0`@R`E -MKB0``)("`#PP0@`!4$``!(X"`#P`A1`DKB(``(X"`#P``A;",$(`#U!```:. -M(P``CB(``#P#`$``0Q`EKB(``(XC```\`G__-$+__P!B&"2N(P``CZ,``!!@ -M``.0Q``,D,(`#0""("6.(@`,/`/^#S"$`!\T8___`$,0)``$)0``1!`E$`#^ -M[ZXB``R3P@`6CB,``#P$_O\P0@`/+$(``32$__\`9!@D``(6``!B&"40`/[7 -MKB,``"0"`$`08OZY)`,``Q)@_KED0; -M<@`"$(``4A`A$`#^,XQ6'``GO?_0K[(`"`"@D"$DI0`(,*(`#Z^U`!2OLP`, -MK[$`!*^P``"OOP`@K[<`'*^V`!BOM``0)`/_\"1"`">.5``P`*,H)`!#,"0` -MIA`A`$40*P"`J"$F4``8)I,`"(Z6`%".EP`H))$$@!1```<`H!@AO+$``"2E -M`!``9A`A`$40*Q!`__L``````J`@(0)`*"$,`$Z')`8``1!``&8D`P`-D@(` -M`XYC``PP0@`!$$``J3!I`!\D`@`!KD(`0)8"``8``A!",$(/_Z9"`$:6`@`` -MID(`1)("``*2`P`#HDD`2C!"``\``QD"`$,0(:9"`$B28@`$,$(``1!``)(` -M````$L``!20*`!Z"P@"Z%$```@!`4"$D"@`>D@(``S!"``$00`!K*4+_[!1` -M``Z.(P$()`(!)Q!B`&0``Q#``$,0(0`*(<`\`V9F`$00(31C9F<`0P`8``(7 -MPP``&!```QB#`&(8(Y("``(P0@`/%$``!:XC`0B2`@`#``(1`A!``!8````` -MCB0`>(XE`'R.8@``)*4``0`"%8(LHP`!`(,@(3!"``&N)`!XKB4`?!1``$$` -M`#`AD@(``C!"``\00``X``88@``"&(``<1@AC&(`P"1"``&L8@#`D@(`!0`" -M$<(00``$`````(XB`%PD0@`!KB(`7)("``,``A#",$(``11```P``!@ACJ(; -M1#!"``$00``)C[\`()+B``0P0@`!%$``!H^W`!R.@@!,5$``#8Q"`#R/OP`@ -MC[<`'(^V`!B/M0`4C[0`$(^S``R/L@`(C[$`!(^P````8!`A`^``"">]`#"2 -M"``#CF<```!)$"&2"P`$D$8`!)9)`$@`"$!",.,Y0`$C0,```!I&"&,8@G` -M-$("`*QB"<",Y0`$,*(`!!!```@PH@`@C0(``#P$`"``21`AC$,1``!D&"6L -M0Q$`,*(`(!!```]__"OL0`$K[```*^_``B,H@"$)`8`!`"@@"$40``&`("((8^_``B/L0`$ -MC[````/@``@GO0`0#`!*MHRE`&R.!0!L#`!*AP(@("$,`'IJC@0`A!``__.N -M``"$)[W_X*^S``ROL@`(K[$`!*^_`!"OL````("8(0#`B"$0P``I))(<&(Y0 -M`(02```M`````"8$``@``"@A#`!PJB0&`!B6`@`.C@0`*(XE``2.)@`,,$(/ -M_PP`<)T`@B`AE@(`#HXD``R6`P`.,$(/_P!$$"$D!/``,$(/_P!D&"0`8A@E -MI@,`#HXQ```6(/_M`````)8"``Z6`P`*KA(`3#!"#_\D0@`$`&08)#!"#_\` -M8A@EI@,`"@)@("$"`"@A#`!8H0``,"&/OP`0C[,`#(^R``B/L0`$C[````/@ -M``@GO0`@#`!Z5R0$`-P`0(`A`$`@(0``*"$,`'"J)`8`7"8"`%RN4`"$K@`` -M`*X``""N`@`$K@(`*!``_\:N$``D)[W_L*^P`#``@(`AK[,`/*^Q`#2OOP!` -MK[(`.`.@("$``"@A)A$<&`#`F"$D!@`L#`!PJHXR`(2.(@`$C@8;]``"&$`` -M8A@A/`*``B1"+ZP``QB``&(8(8QD``2,90`(C&,``"2$``$D`@`%KZ(`"*^E -M`!2OI``0KZ,`#(S#``@D`@`")`8`!#!C`"`"`"`A)`4`!11@`!VOH@``#`!1 -MKR8$'&`00``))`/__X^_`$"/LP`\C[(`.(^Q`#2/L``P`&`0(0/@``@GO0!0 -M`@`@(0P`2F@#H"@ACD8`)`!`*"&N(@!L#`!*E0(`("&.)0!L#`!*G`(`("$" -M`"`A#`!9$@)@*"$0`/_I```8(0P`2K8`````CZ4`"`P`2H<"`"`A$`#_W@`` -M```GO?_@K[$`!"0"__\DD1P8K[8`&*^U`!2OM``0K[,`#*^R``BOL```K[\` -M'#P%``0`@(`A`,"8(0#@H"$!`)`A`4"H(0$@L"$0X@`FIB8`@@P`4EZ4A!MR -M.$D``0(`("$"0"@A`F`P(0*`."&N(@`$`$`8(1*@``0X2``$)`(``P!(&`H` -M"1@*``,0@`!0$"&,0AP`KA48`*XV`!RN`AQ4ED(``*8B`$*60@`"IB(`1)9" -M``0,`"SJIB(`1H^_`!R/M@`8C[4`%(^T`!"/LP`,C[(`"(^Q``2/L````^`` -M"">]`"`D`@`!K((;L"0"``:L@`6,K(`8``P`*6RN(@`$`@`@(0)`*"$``#`A -M#``LZ@``."$"`"`A#`!/:0(@*"$0`/_GC[\`'"2E__XLH@`F``!((1!``"0` -M`%`A/`.``@`%$(`D8P_8`$,0(8Q"````0``(`````(R)!'@50``%`````%3@ -M``&LZ0``5,```:S```!5```!K0H```/@``@`````$`#_]8R)!'P0`/_SE(D< -M\!``__&4B1SR$`#_[Y2)'/00`/_ME(D<]A``_^N4B1SX$`#_Z0``2"&,@AOT -M$`#_YHQ)`#00`/_D)`H`#HR"&_00`/_AC$D`<(R"&_00`/_>C$D`.(R"&_00 -M`/_;C$D`/(R"&_00`/_8C$D`0(R"&_00`/_5C$D`1(R"&_00`/_2C$D`2(R" -M&_00`/_/C$D`3(R"&_00`/_,C$D`4(R"&_00`/_)C$D`5(R"&_00`/_&C$D` -M6(R"&_00`/_#C$D`7(R"&_00`/_`C$D`8(R"&_00`/^]C$D`9(R"&_00`/^Z -MC$D`:(R"&_2,0@!L)$G__RTB``500/^T)`D`!!``_[(`````C((;]!``_Z^4 -M20!TC((;]!``_ZR420!VC((;]!``_ZF420!XC((;]!``_Z:420!ZC((;]!`` -M_Z.,20!\C((;]!``_Z",20"`C((;]!``_YV,20"$C((;]!``_YJ,20"(C((; -M]!``_Y>,20",C((;]!``_Y2,20"0C((;]!``_Y&,20"4C((;]!``_XZ,20"8 -MC((;]!``_XN,20"<``40P`!%$"$``A#``$40(R>]_^```A"`K[,`#*^R``BO -ML0`$K[```*^_`!``@H`AC@(`"`"`D"$`X)@A$$``""81``B/OP`0C[,`#(^R -M``B/L0`$C[````/@``@GO0`@`B`@(0``*"$,`'"J)`8!'"9$'!@0@/_S)`(` -M!HR#``008O_P)`(``:X"``@F`P`\)`4``R0"``$DI?__K&(```2A__TD8P`( -M`F`X(28B``0F8P`@C.4``(SF``2,Z``(C.D`#*Q%``"L1@`$K$@`"*Q)``PD -MYP`0%./_]B1"`!",XP``C.4`!(SF``BL0P``K$4`!*Q&``BN)`!8#`!39P(@ -M("$"("`A#`!2Q0``*"$,`'&T)B0`7!``_\N/OP`0``40P`!%$"$``A#``$40 -M(P`"$(``@B`A)[W_\"0"``:OOP``$,(`#B2%``@LP@`'$$``!R0"``]`!!0PO_\K*@`+!``__N/OP``)(0`$`$$$"4P -M0@`#$$``'"4#`"``8!`AB0,``)D#``.)!@`$F08`!XD'``B9!P`+B0D`#)D) -M``^H@P``N(,``ZB&``2XA@`'J(<`"+B'``NHB0`,N(D`#R4(`!`5`O_N)(0` -M$($"``"@@@```*`@(0P`4L4D!0`!$`#_VX^_``"-`@``C08`!(T'``B-"0`, -MK((``*R&``2LAP`(K(D`#"4(`!`5`__V)(0`$!``_^T```````40P`!%$"$` -M`A#``$40(R>]__```A"`K[````""@"&OL@`(K[$`!*^_``PF$0`(CB(`>`"` -MD"$\!8`"/`2``B2$$)PDI1!P%$``#B0&`0<,`'&[)@0`9`(@("$``"@A#`!P -MJB0&`1RN```(C[\`#(^R``B/L0`$C[````/@``@GO0`0#`!P=``````F!0!D -M#``0X`)`("$0`/_M`````">]__"OL@`(K[$`!*^P``"OOP`,`("0(0``B"$D -MD``(C@(```(@*"$F$`$<)C$``11```H"0"`A*B(`!%1`__F.`@``C[\`#(^R -M``B/L0`$C[````/@``@GO0`0#`!1;``````0`/_U*B(`!">]__"OL``````H -M(20&`#BOOP`$#`!PJ@"`@"$,`'&T`@`@(8^_``2/L``````0(0/@``@GO0`0 -M`^``"(R"`!0GO?_PK[$`!*^P``"OOP`(#`!PM0"`B"&.,``4$@``"0````". -M`@`@`%`8)@`#$`H40``"KB(`%*X@`!BN```@K@````P`<+H``````@`0(8^_ -M``B/L0`$C[````/@``@GO0`0)[W_\*^Q``0`@(@AK[(`"*^P``"OOP`,`,"` -M(0P`<+4`H)`ACB(`*%!``!6N```@C@(`)*X0`""N`@``CB(`&%1```JL4@`@ -MKC(`%`P`<+JN,``8C[\`#(^R``B/L0`$C[````/@``@GO0`0CD,`)(XB`!BL -M0P``$`#_]`````"N````$`#_[HXB`!@PQO__``800`!&$"$``A#``$00(91# -M`"P\`A!B-$)-TP`#&(``8@`9``40P```&!```QF"`$,0(21"`!4`0P`;4&`` -M`0```]`#"A$`!C#`!2 -M`/\D`@`!`D`H(0(@("$4 -M8O_3)`8``0P`4G(``````E<0*Q!```("0!@A`N`8(1``_\LP=P#_)[W_\*^P -M```DD`"4`@`@(0``*"&OOP`$#`!PJB0&`'P,`'%<```````#*(``HR@A``4H -M0*X%`%2/OP`$C[````/@``@GO0`0``0F```%+@``!"8#``4N`P`&-@``!C8# -M`(40*@"F0"H40``(`(8X*A$```0`H!@A`,`8(0#$$"H`@A@*`^``"`!@$"$0 -MX/_]`(`8(0#`&"$`IA`J$`#_^0"B&`N0IP``,(3__Q#@``L``!@A``,00`!% -M$"&40@`"`((0*Q1```4D9@`!,,/__P!G$"M40/_X``,00`/@``@`8!`A)[W_ -MP*^^`#"OM0`DK[,`'*^Q`!2OOP`TK[<`+*^V`"BOM``@K[(`&*^P`!"4@AMR -ME*,`"HRW`%```A("`("8(0"@J"$P<0__,%X``8RV`$R,HP`H```0(9"%&`,2 -MX``:D(08!XZB`#P``A)",$(``11```V.U``\CF(;V%!```N.H@`\D&(`!#!" -M``%40``'CJ(`/)!B```D`P`(,$(`#!!#`!T`````CJ(`/"0#_?\`0Q`DKJ(` -M/(YB'!12@@`.DL(`@);"`!Z/OP`TC[X`,(^W`"R/M@`HC[4`)(^T`""/LP`< -MC[(`&(^Q`!2/L``0`^``"">]`$!00/_SEL(`'I:D``J.A0,T#`!3D#"$#_\0 -M`/_NC[\`-!"@``\F\`"4)`(``5""`0"2`@`]5(``"X($`":2`P`]``,00`!# -M$"$``A#``%00(8Q#`"@D`@`!4&(`\)*"``."!``F@@4`*`P`4WF"!@`I#`!Q -M7`!`D"$``RB`C@8`4`"C*"$`!2A``*8@(RR"`+D40`#;```8(20#``HN(@,A -M%$``!)(&`&$D8@`!``(6```"'@.2!P!B`D,0(P`"%@`"0Q@J``(6`SAC```D -MQ/__``"0(3#H`/\`0Y`*,(0`_P``8"$1```'``!((1?``+\!!A`K`(<0(S!$ -M`/\0@`!H``"((0$P6"$`B1`J`(`P(11``!N1:`!C`)`0(21'`&.0\0``),;_ -M_P#)4"H`$1!``%$8(0`#&,``="`A`%`8(8!B```"0A`J%$``"R3G__^08P`! -ME(0`+B0"`&0`0Q`C<((8`@!L$"L40``#``````!@8"$"($`A44#_ZI#Q``"B +M>(ZB`#"50P`(EF(<8E!B``.50P`&$`#_VB5"`!"68AQ@%&+_UR5"`!"50P`$ +MEF(<7A1B_],E0@`0D4(``#!"``Q00/_/)4(`$(Z"`2PD0@`!$`#_\*Z"`2P" +MH"@A#``0!0(@,"%00/^!CK(`%!``_SF.H@`<$`#_?ZX@`$".8A?84$#_?8^_ +M`$`,`',&)F0:K!``_WF/OP!`C(,`%!!@``@D!``!C&(`/`1#``4``"`AC&(` +M(!!```(````````@(0/@``@`@!`A)[W_\*^Q``2OOP`(`("((:^P``".(AO0 +M$$``%"2$&'@,``ZR`````"8D&+`,``ZR``*`*R8D&.@,``ZR``*`"B8D&2`, +M``ZR``*`"E!```$``(`A`@`0(8^_``B/L0`$C[````/@``@GO0`0#``.L@`` +M```0`/_W``*`*R>]__"OL```K[\`!`P`]_^"OLP`,`,"8(:^U`!2OM``0K[$`!*^P``"O +MOP`8K[(`"`"`H"$`H(@A#`!R&```J"$28`!"`F"`(8X"`#P``A9",$(``11` +M`%6.$@!0$D``5`*`("&.0@!4$$``40`````2H`!,C@(`+(Q#``",0@`@KJ,` +M`*ZB`"".!@`L)D0`7`(`*"&LP``@K,````P`4O``````CD(`>"1"``&N0@!X +M$J```@)@@"&.L``@5@#_XXX"`#P28``A`````)8C`#108``1CB(`&(YD`"B0 +M@@`6,$4`#U"@``NF(``T``,1`J""`!>2(@`UD(,``3!"``\``A$``*(0)31C +M``B@@P`!H((`%HXB`!A40``=K%,`("0"``&N(@`LKC,`%*XU`!@````/CB(` +M+%1``!".9@`DCB4`)`P`2Z8"@"`A#`!R'0````"/OP`8C[4`%(^T`!"/LP`, +MC[(`"(^Q``2/L``````0(0/@``@GO0`@CB4`)`P`2Y\"@"`A$`#_[:X@`"R. +M(P`8CF(`)*QB```0`/_DKC4`&!``_[B,4P`@`H`@(0P`#:$"`"@ACH(;.%!` +M`!B.(@`<4@``%HXB`!R.`@`\``(60C!"``$40``)`H`@(8XF`!B.)P`PCB@` +M)`P`3`@"`"@A5$``"HXB`!P"@"`A#``IACP%@`".`@`P`H`@(3P%@``,`"E6 +MKB(`,(XB`!PD0@`!$D``"JXB`!R.(@`DCD0`4``"$,``4A`AE$,`,"2$``&N +M1`!0)&,``:1#`#`0`/^7CA4`+">]__"OL@`(K[\`#*^Q``2OL```C*(`5!1` +M``<`@)`A)+$`7(XB`!P40``)CB8`%*X@`!BN(``4C[\`#(^R``B/L0`$C[`` +M``/@``@GO0`0C,(`+(S%`%@"0"`AC%``(*Q```"L0``@#``/3P``."&.(@`< +M`@`P(21"__\40/_TKB(`'!``_^NN(``8)[W_X*^T`!"OLP`,K[$`!*^_`!2O +ML@`(K[```(S0`#",H@`DC,,`0(X2`%```A#``*"((0)"*"$D`@`"`("@(1!B +M`#DDLP`PCB,`%(QB`#P$0@`MC&(`((X"`#P\`P(`C@<`+`!#$"6N`@`\CB(` +M')9E``"69``")$+__ZXB`!R.0@!0CD,`5(SF`"`DI?__)$+__R2$__\D8___ +MCC``%*9D``*F90``KD(`4*Y#`%04P``"KB8`%*X@`!BLX````@`P(:S@`"`" +M("@A```X(0P`#T\"@"`A`H`@(0P`#^("0"@A```0(8^_`!2/M``0C[,`#(^R +M``B/L0`$C[````/@``@GO0`@K&````!@*"&N(@`4`H`@(0P`"F.L8``@$`#_ +MSHX"`#R4HP`PCD(`5"0&``&N9@`$`$,0(:Y"`%2F8P`"C@,`/#P%A_\TI?__ +M``,6PC!"``\D0@`!,$(`#P`"%L``91@D`&(8):X#`#R,@AMH``,>PC!C``\` +M0Q`K5$``!8Y"`%2,@AJT5$``$8R"!8".0@!4EF,``B0%__\D0O__KD(`5(Z" +M!80D8___IF,``B1"``$,`%A=KH(%A`*`("$,``_B`D`H(1``_\8D`O__)$(` +M`:R"!8".`@`\``(6PC!"``\01@`&`````(X#`"B08@`!-$(`"!``_Y*@8@`! +M#``.^`(`*"$0`/_XIB(`-">]__"OL0`$K[```*^_``@`H(`AC@,`0(RE`#`D +M`@`!`("((1!B`$Z,I`!0CB(;:!!``$8``!`A4(``18^_``B,H@`HD$(``3!" +M``000``EC@,`(!!@`#T``!`AC'``+(X"`#",0@`HD$(`%C!"``\00``[)@0` +M"#""``\D`__P)$(`)P"#("0`0R@D`(40(0!$$"L40``'`(`8(;R1```DA``0 +M`&40(0!$$"L00/_[``````(@("$"`"@A#`!/G"0&``$00``A)`+__XX"`#", +M0@`HD$(``3!"``040/_=C@,`(!!@`!D``!`AC'``+"0$__`F`P`(,&(`#R1" +M`"<`9!@D`$0H)`!E$"$`0Q`K%$``!P!@("&\<0``)&,`$`"%$"$`0Q`K$$#_ +M^P`````"("`A`@`H(0P`3YPD!@`!)`/__P`"&`L`8!`AC[\`"(^Q``2/L``` +M`^``"">]`!`0`/_Z```0(2>]_]"OL0`D`*"((:^R`"BOL``@K[\`+`P`]`#"OH@`$KZ``"*^@``ROH``0#`!R':^@`!2.!0!4`D`@(0P`"J0# +MH#`A#`!R&``````0`/_=K@``5">]__`D@@!4K[(`"*^Q``2OL```K[\`#`"` +M@"$`H(@A`$`@(1#@`"$`P)`A#`!R\0`````,`'(8`````(X$`$R,A0``$*`` +M%XR"``2LH@`$C@(`2(R#``2LD0`(K((`!(X"`$BL90``K)(`#*R```"N!`!( +M#`!R':Q$```,`',&)@0`/```("&/OP`,C[(`"(^Q``2/L````(`0(0/@``@G +MO0`0$`#_ZJX"`%`,`'+_`````"0#``$40__S)`0``A``_]P`````)[W_\*^P +M````@(`A)(0`/*^_``ROL0`$K[(`"`P`E``2/H@``5$#_ +M^"8$`#R/OP`4C[``$`/@``@GO0`@#``13P`````0`/_WCZ(``">]__`DI?__ +MK[$`!*^_``ROL@`(K[```"RB`!D`@(@A$$``%(R2``0\`X`"``40@"1C#G`` +M0Q`AC$(```!```@`````C(0```P`&QTD!0`1`$"`(29&!(``0"`A)`4!.`P` +M&U$`````CB0```P`&M`"`"@AC[\`#(^R``B/L0`$C[````/@``@GO0`0```P +M(0)`("$,`"Z$)`4``HXD```,`!L=)`4`$@!`@"$F1@2(`$`@(1``_^HD!0`( +MC(0```P`&QTD!0`3CB0```!`@"$D`@(`$`#_Y:X"```,`!.LC(0`!!``_^2/ +MOP`,#``3Q(R$``00`/_@C[\`#">]_]"OLP`]`!`, +M`!$=`````!``__N/OP``)[W_\`"@("$``#`A)`4`&:^_```,`!$=```X(8^_ +M```#X``()[T`$">]__"OOP`(K[$`!*^P``",D``$#`!RO`"`B"$`0"`A#`!R +MNB8%&UR.!!M]_^`D@@!$)(,` +M3*^Q``0`@(@AK[\`&*^U`!2OLP`,K[(`"*^T`!"OL```)(0`/*XB`$BN(P!0 +M```H(:X@`$2N(`!,)C,`5`P```CP(@`(\ +M"X`#)@J)`"2E1T0DYP[D)0A]`"5KB0@D!``!`B`P(0P`]`"`0`/_U)!4``B>]_]"OL``0`*"`(:^_`""OLP`]`!`GO?_0K[$`)*^_ +M`"ROL@`HK[``((R"%^`00``F`("((8R"%]P00``C)`(``HR#'*@08@`@)!(` +M`1!R`!^/OP`L#`!R&`````".(AL<5$``!8XP&T".(ALD5$``((XB&]".,!M` +M)Z(`$`(@("$``"@A```P(0``."$``$`A``!((0``4"$D"P`!KZ(```P`60BO +ML@`$/`(`!`("@"06```+`B`@(0P`#5H"("`A#`!R':X@&R2/OP`LC[(`*(^Q +M`"2/L``@`^``"">]`#`,`"E6/`4`!!``__,`````4$``%(XB&)0``"@A``40 +MP`!%$",``A#``%$0(8Q#&)0DH@`!,$4`_Q!@``,LI``$)`(``:XB&QP0@/_E +M`````(XB&QP40/_B``40P!``__$`11`C$$#_WB0"``$0`/_]_^`D +M`P`!K[,`#*^R``BOL0`$K[```*^_`!``H)`A`,"8(0"`@"$0HP!&``"((5"@ +M`#",@ARH)`(``A"B`!,D`@`#$*(`#`````!2(``!KA(]__"OL```,+``_Z^_``ROL@`(K[$`!```D"$,`'(8`("((0P` +M]`!`,`#4X)!(`%A``_^\``I`*)$+__Q1`_^^N(ARPCB(]__"OL@`(K[$` +M!*^P``"OOP`,`("`(0P`]`!`0 +M0``#`@`@(1``__2N$1RL)`4``@P`-3@D!@`!)!(`%A``__D``I`*$$```P(` +M("$0`/_JK@`]__"OL@`(K[$`!*^P``"OOP`,`*"((0"`@"$0H``W +M``"0(20"``$0H@`))`4`!"02__\"0!`AC[\`#(^R``B/L0`$C[````/@``@G +MO0`0#``U."0&``&.`Q?<)!(`%A!@``0``I`*C@(7X!!1`!D\!8``%D#_[R0" +M``&.`QRL4&(`#XX"'+`D`@`"%&+_Z@)`$"&.`ARP%$#_YP)`$"$"`"`A)`4` +M`@P`-3@D!@`!5$#_X"02`!80`/_?`D`0(11`__(D`@`"`@`@(1``__8D!0`! +M#``I5@(`("$,`#8+`@`@(0P`-CL"`"`A#`!R'0`````0`/_?`````(R"'*P4 +M0``>`````(X"%]P00``%)@4;<(X#%^`D`@`!$&(`#``````"`"`A#``WV"0& +M``$00``$`$"0(202`!860/^^`D`0(0(`("$0`/_7)`4``PP`] +M__"OL0`$`("((22$``ROOP`(#`!R\:^P```,`'(8`````(XD`!2,A0``$*`` +M$XR"``2LH@`$CB(`((R#``2,D``(K((`!(XB`""L90``KB0`(*R```"L@``( +M#`!R':Q$```"`!`AC[\`"(^Q``2/L````^``"">]`!`0`/_NKB(`&#"F``\G +MO?W@)`+_\"3#`$^OM`(0`&(8)`"@H"$`HB@D`*,0(:^Q`@2OOP(E`*`GI@"D#``;>P*`("$"@"`A)Z4` +MH`P`&WLGI@"H`H`@(2>E`*`,`!M[)Z8`K`*`("$GI@"P#``;>R>E`*`"("`A +M`F`H(0P`!\,GI@"T$J``!P+`("&.@@`(`J`H(:ZB``B/H@"T#``:T*ZB``R/ +MOP(E +M`*`,`!M[)Z8`N(^F`+@"("`A`F`H(0P`!O`GIP"T$`#_Y``````"8"`A#`!9 +M`2>E`+00`/_?``````*`("$GI0"@#``;>R>F`+R/I0"\`F`@(2>F`,```#@A +M#`!1<2>H`,2/I0#`#``;2@*@("&/H@#`$$``$8^E`+P"H"`A)Z4`R`P`&VHG +MI@#,CZ4`O(^G`,@"8"`A)Z8`T`P`47$GJ`#$CZ4`T`*@("$,`!MT`````!`` +M_[\``````F`@(2>F`,`GIP#4#`!1<2>H`,2/I0#4`J`@(0P`&TH`````$`#_ +MM``````GI0"@)Z8`V`P`&WL"@"`A`H`@(2>E`*`,`!M[)Z8`W(^B`-P00``, +M`H`@(2>E`*`,`!N%)Z8`X(^E`-B/I@#E`/@,`!MJ)Z8`_(^E`.R/IP#X`F`@(2>F`/`,`%F1 +M)Z@`](^E`/`0`/^W`J`@(0)@("$GI@#P)ZE`+00`/]8``````)@("$,``=7)Z4`M!``_U,``````F`@(0P`!Y4GI0"T +M$`#_3@`````GI0"@)Z8!!`P`&WL"@"`A`H`@(2>E`*`,`!M[)Z8!"`*`("$G +MI0"@#``;>R>F`0P"@"`A)Z4`H`P`&X4GI@$0CZ4!!(^F`0B/IP$0#`!1]P)@ +M("$0`/\W`````">E`*`GI@$4#``;>P*`("$"@"`A)Z4`H`P`&WLGI@$8`H`@ +M(2>E`*`,`!M[)Z8!'(^E`12/I@$8CZ@!'`)@("$,`%(_```X(1``_R,````` +M)Z4`H`*`("$,`!M[)Z8!((^E`2`D`O__$*(`!0`````,`%*$`F`@(1``_Q<` +M````#`!2K`)@("$0`/\3``````P`R>F`3R/I0$\`F`@(0P`%!0GI@"T$`#_`P`````"@"`A)Z4` +MH`P`&WLGI@%$CZ4!1`P`!]T"8"`A$`#^^@`````GI0"@)Z8!2`P`&WL"@"`A +M`H`@(2>E`*`,`!M[)Z8!3(^E`4B/I@%,#``(%@)@("$0`/[L`````">E`*`G +MI@%0#``;>P*`("$"@"`A)Z4`H`P`&WLGI@%4`H`@(2>E`*`,`!M[)Z8!6`*` +M("$GI0"@#``;>R>F`5R/I0%0CZ8!5(^G`5B/J`%<#``(,@)@("$0`/[4```` +M`">E`*`GI@%@#``;>P*`("$"@"`A)Z4`H`P`&WLGI@%D)[``$`*`("$GI0"@ +M#``;A2>F`6@"`"`A```H(0P`<@TD!@`R>F`7"/I0%P#``IN`)@("$0`/ZA`````">D`#```"@A#`!R#20&``8"@"`A +M)Z4`H`P`&WLGI@%T`H`@(2>E`*`,`!M[)Z8!>`*`("$GI0"@#``;>R>F`7P" +M@"`A)Z4`H`P`&X4GI@&`CZ8!@)>E`#0``(`AE,<`%)3$``0DPP`(..(`!Q"D +M`#,`8H`+`,"((8^C`70L8@`$%$``&``#$,``0Q`A``(0P`!#$",``A"``F(0 +M(21#^Y@D`@`'$.(`(B0"``2D8@$6)`(``Q#B`!HD`@`0$.(`&"0"`!%0X@`7 +ME&(!%B3B__XL0@`"%$```B0$``@D!``$I&0!&`P`")4"8"`ACF(;5`)@("$" +M(#`A)$(``:YB&U2/I0%TCZ@!>`P`*=8"`#@A#``(?@)@("$0`/Y9`````)1B +M`18D0@`$$`#_Z*1B`1:D8`$8$`#_ZZ1@`1:7HP`RE,(``A1B_\P`P(@AEZ,` +M,)3"```48O_'``"((1``_\>/HP%T)Z4`H">F`80,`!M[`H`@(0*`("$GI0"@ +M#``;>R>F`8@"@"`A)Z4`H`P`&WLGI@&,CZE`*`,`!M[)Z8!0(^E`4`,`%CP`F`@(1``_B$`````)Z4` +MH">F`9`,`!M[`H`@(0*`("$GI0"@#``;>R>F`90"@"`A)Z4`H`P`&WLGI@&8 +M`H`@(2>E`*`,`!M[)Z8!G">E`*`GI@&<`H`@(0P`&WN/L`&<`H`@(2>E`*`, +M`!N%)Z8!H(^F`92/IP&8CZ@!H(^I`9`"8"`A`@!0(0P`42<``"@A$`#]_@`` +M```GI0"@)Z8!I`P`&WL"@"`A`H`@(2>E`*`,`!N%)Z8!J(^E`:@,`"TE`F`@ +M(1``_?$`````)[``.`)@("$,`"WP`@`H(0*@("$"`#`A)`4`"`P`&U$````` +M$`#]Y@`````,`"X'`F`@(1``_>(`````)`(``JYB&[0,`"X5`F`@(1``_=P` +M````)Z4`H">F`:P,`!M[`H`@(0*`("$GI0"@#``;>R>F`;`GI0"@)Z8!L`*` +M("$,`!M[C[`!L`*`("$GI0"@#``;A2>F`;2/HP&L)`+__Q!B`"4``Q#``$,0 +M(0`"$,``0Q`CCZ4!M``"$(`"8A`A)$8`$`"F&"4P8P`#)$0`"!!@`!\DIP`@ +M`.`8(8BB``"8H@`#B*<`!)BG``>(J``(F*@`"XBI``R8J0`/J,(``+C"``.H +MQP`$N,<`!ZC(``BXR``+J,D`#+C)``\DI0`0%*/_[B3&`!"`H@``H,(```P` +M4_D"`"@A%@#]H8^E`;0,`"XQ`F`@(1``_9T`````C*(``(RC``2,J``(C*D` +M#*S"``"LPP`$K,@`"*S)``PDI0`0%*?_]B3&`!`0`/_J``````*`("$GI0"@ +M#``;>R>F`;B.@@`,$$``'X^C`;@D`@`%$&(`""0"``048OV$`F`@(0``,"$, +M`"Z$)`4`!!``_B$"H"`A`F`@(2>F`$`,`"Z$)`4`!8^B`$`GI@!8`J`@(:^B +M`%B/H@!$)`4`%*^B`%R/H@!(KZ(`8(^B`$ROH@!DEZ(`4J>B`&B7H@!6$`#_ +M@J>B`&J/I0&X`F`@(0P`+H0``#`A$`#]90`````,`"\1`F`@(1``_@,"H"`A +M)Z4`H">F`;P,`!M[`H`@(0*`("$GI0"@#``;>R>F`<"/I0&\CZ8!P`P`,J0" +M8"`A$`#]4P`````,`#.0`F`@(1``_4\``````H`@(2>E`*`,`!M[)Z8!Z(^E +M`>@,`#/$`F`@(1``_48``````H`@(2>E`*`,`!M[)Z8![(YF'0"/I0'L#``S +M&`)@("$0`/T\KF(=`">E`*`GI@$T#``;>P*`("$"@"`A)Z4`H`P`&WLGI@$X +MCZ4!-(^F`3@,`#98`F`@(1``_2X`````)Z4`H">F`2P,`!M[`H`@(0*`("$G +MI0"@#``;>R>F`3"/I0$LCZ8!,`P`-F$"8"`A$`#](``````,`$E,`F`@(:YB +M!;`F91MP#``[?0)@("$0`/T8``````*`("$GI0"@#``;>R>F`<0"@"`A)Z4` +MH">F`<0,`!M[C[(!Q">E`*`GI@'(`H`@(0P`&WN7L0'&`H`@(2>E`*`,`!M[ +M)Z8!S">P`<0"@"`A)Z4`H`P`&WLGI@'0`H`@(2>E`*`,`!M[`@`P(0(`,"$" +M@"`A)Z4`H`P`&WN/L`'$CZB`+0"8"`A`D`H(0(@ +M,"$"`%`AKZ(```P`60BOH``$$`#\Z@`````"@"`A)Z4`H`P`&WLGI@'4)Z8! +MU`*`("$GI0"@#``;>Y.P`=>/I@'4`F`@(0P`-*("`"@A$`#\VP`````,`#KX +M`F`@(1``_-<``````H`@(2>E`*`,`!M[)Z8!V(^E`=@,`$*E`F`@(1``_,X` +M`````H`@(2>E`*`,`!M[)Z8!W(^B`=P"@"`A)Z4`H``"@,`"`H`C#``;>R>F +M`>``$(B`CZ(!X`)QB"$F,1G(KZ(`?`*`("$GI0"@KB(`!`P`&WLGI@'@CZ(! +MX`*`("$GI0"@KZ(`@">F`>`,`!M[KB(`"(^B`>`"@"`A)Z4`H*^B`(0GI@'@ +M#``;>ZXB``R/H@'@`!"`P`*`("&OH@"0)Z4`H*XB`!`GI@'@#``;>P)P@"$F +M$!AXCZ(!X(X%`"0"8"`AKB(`&">F`'`,`$L]KZ(`=!``_)@``````H`@(2>E +M`*`,`!M[)Z8!)">E`*`GI@$D`H`@(0P`&WN/L`$D`H`@(2>E`*`,`!N%)Z8! +M*(^F`2@`$!#``%`0(XS#`````A"``%,0(:Q#&```` +M``*`("$GI0"@#``;>R>F`?"7H@'R$`#\5Z9B&_0"P"`A#``;'0(`*"$40/PT +M`$"H(20"``(0`/Q7KZ(`M">]__"OL0`$K[\`"`"`B"$,`')AK[````!`("$, +M`')D```H(0P`%8@"("`A`$"`(0(@("$,`!6I`$`H(0P`&S$"`"`A$`#_]P`` +M```GO?_PK[(`"*^Q``2OL```K[\`#`"`@"$,`!5'/!*``SP%@``\!X`"/`B` +M`SP+@`,`0(@A)DJ9J"2E9K@"`#`A).<0)"4(B:@E:YFP)`0``1!```@D"1`` +M`B`0(8^_``R/L@`(C[$`!(^P```#X``()[T`$`P`H``0,`%K9`Z!((3P"@`*,5%/@/`*``HQ&4]B.`SB( +MDZ(``(^E``2L<0``H&(`"*QE``23H@`!C@0XB```D"&@@@`)C@(XB*Q&`!"L +M5``,/!.``HYP.(@,`'NZ`H`@(8YC.(@`$HB``C"`(:X"`!0"(X@ACB0`%`P` +M&S$F4@`!*D(``E1`__,\$X`"CF0XB`P`&NTD$@`//!"``HX".(@F4O__#`![ +MNHQ$``R.!#B(#``;"@!`*"$&0__X/!"``HX".(B/OP`DC[0`((^S`!R/L@`8 +MC[$`%(^P`!`#X``()[T`,">]_]`PH@`/)$(`320#__"OL@`8`*"0(0!#*"0" +M0Q@D`&40(0!#$"NOL0`4K[\`(`"`B"&OLP`]__"OOP``$.``#3"B`/\00``&`,`H +M(0P`&C4`````C[\```/@``@GO0`0C(0```P`%6\`P"@A$`#_^H^_```00``% +M`,`@(0P`&SP`````$`#_](^_```,`!LQ`,`@(1``__"/OP``)[W_\#"B`/^O +MOP``%$``!@#`*"$,`!LI`````(^_```#X``()[T`$(R"```,``FBC$0`!!`` +M__J/OP``)[W_\*^_``",IP``C(0`!`"@,"$,`%MR```H(8^_```#X``()[T` +M$">]__"OOP``/`*``HQ".(P`H#`A$$``"Y"%`#.4P@`")$<`!`P`6W*,A``$ +MC[\``"0$``$\`X`"K&0XC`/@``@GO0`0$`#_]R0'!R`D@@`<)[W_\*R``"0` +M`"@AK[\```P`]__"OL````("`(:^_``BOL0`$#`!R&`"@B"&.`@`D +MKB(``*X1`"0,`'(=)A``'`P`]`!`G +MO?_PK[\`!*^P```,`!KW`*"`(:Q0``2/OP`$C[```"0#`""L0P```^``"">] +M`!`GO?_PK*``!*^_```,`!L*`````(^_```#X``()[T`$">]__"OOP``/`*` +M`HQ".(@`@#`A```H(0P`6UR,1``$C[\```/@``@GO0`0)[W_\*^_```\`H`" +MC$,XB`"`,"$\`HB(D&4`,XQD``0T0HB(#`!;7*S"``"/OP```^``"">]`!", +M@@```((0(:Q%``",@@``)$(`!`/@``BL@@``)[W_\*^_``BOL0`$K[````"` +MB"&,A````*"`(20"__P")"`A`,`H(:R0```"`#`A)(0`!"80``,,`'(``@*` +M)(XB``"/OP`(`%`0(21"``2N(@``C[```(^Q``0#X``()[T`$(R#```D`@(` +M`$,0(Q"@``(`@R`AK*0``%3```&LP@```^``"`````",@P``)*4``R0"__P` +MHB@D`&48(0/@``BL@P``$*```@``&"&,HP```(,0(8Q"`"`0H``")&,`!*RC +M```#X``(K,(``(RB````@B`A$,```B2$`""LQ````^``"``````GO?_PK[\` +M!*^P```,`&U5`("`(20#``&N`P`,K@(``*X```BN```$C[\`!(^P```#X``( +M)[T`$">]__"OL```K[\`!(R"`#@`@(`A%$``)B0$``$,`&PL)`0``0P`;54` +M````K@(`+`P`;5@D!``"C@(`````*"$,`!3CC$0`!!1``!,`````C@(`,!1` +M``P``"`AC@(`.!1```4``"`AC[\`!(^P```#X``()[T`$`P`;'(`````$`#_ +M^H^_``0,`&QD`````!``__..`@`X#`!M6(X$`"P,`&PL```@(1``_^V.`@`X +M#`!L<@`````0`/_8`````">]__"OL```K[\`!(R"`#@`@(`A%$``'20$``&. +M`@``)`4``0P`%..,1``$$$``!0````"/OP`$C[````/@``@GO0`0#`!M6(X$ +M`"P,`&PL```@(8X"`#`40``()`0``8X"`#@00/_S```@(0P`;'(`````$`#_ +M\(^_``0,`&QD`````!``__>.`@`X#`!L<@`````0`/_BC@(``">]__"OL``` +MK[\`"*^Q``2,PP`H)`(``1!B``8`P(`AC[\`"(^Q``2/L````^``"">]`!"L +MP``\#`!REP`````,`!O*`@`@(8X"`"@40``@```@(1"``!``````C@(`/#P# +M``(T8TGP)$(``:X"`#R.`@`\`&(8*Q!@``<`````C@(``(Q"``2,41?H)`(` +M`1(B``H`````#``=#XX$``0D!``%#`!RK``````,`'*>`````!``_]N/OP`( +M#``;F@(`("$D!``+$`#_]JX1`"@,`!T6C@0`!`P`'3:.!``$/`,``@!`("$0 +M0``.-&-)\(X"`#PD0@`!K@(`/(X"`#P`8A`K4$``"(X"`"B.`@``C$(`!(Q# +M%^@D`@`!$&+_S0````".`@`H%$#_Z0`````0`/_(`````">]__"OL0`$K[`` +M``"@B"&OOP`(#`!RI0"`@"$"`"`A`B`P(0P`&_$``"@AC[\`"(^Q``2/L``` +M)`(``0/@``@GO0`0)[W_\*^P```\!X```("`(3P(@``DB0`D)(H`""3G]__`D`P`!K[```*^_``BOL0`$$*,` +M$0"`@"%0H``2C((`*"0"``(0H@`,)`(``U"B``:,@@`HC[\`"(^Q``2/L``` +M`^``"">]`!!40/_ZK(``*!``__F/OP`(K@``/!``__:/OP`(%$#_](^_``B, +M@@``C$(`!(Q1%^A6(__PC[$`!`P`'0B,A``$#`!RI20$``4,`!N:`@`@(:X1 +M`"@,`'*L)`0`"Q``_^2/OP`()[W_\*^R``@`@)`A)`0`0*^Q``2OL```K[\` +M#`P`>[H`H(@A`$"`(1(``!0``!`A```H(20&`$`,`'(-`@`@(28$`"RN$@`` +MKA$`!`P`&XRN```H#`!RK"0$``0,`!Q0`@`@(8X$``0\!8``)*5QI`P`'.H" +M`#`A`@`0(8^_``R/L@`(C[$`!(^P```#X``()[T`$">]__"OOP``C((`*!1` +M``0``"@AC[\```/@``@GO0`0`$#X"8R$`"P0`/_[C[\``">]__"OOP``C((` +M*!1```0D!0`!C[\```/@``@GO0`0`$#X"8R$`"P0`/_[C[\``">]__"OOP`` +MC((`*!1```0D!0`"C[\```/@``@GO0`0`$#X"8R$`"P0`/_[C[\``">]__"O +MOP``C((`*!1```0D!0`#C[\```/@``@GO0`0`$#X"8R$`"P0`/_[C[\``">] +M__"OOP`$K[````"`@"&,A``$K@8`+#P&@`"N!0`H),9RZ`P`6T(``"@AC@0` +M!#P&@``DQG,8#`!;0B0%``&.!``$/`:``"3&`P`6T(D!0`#C[\`!(^P```#X``()[T`$">]__"OOP``#`!<,(R$``2/ +MOP```^``"">]`!`GO?_PK[\```P`7#B,A``$C[\```/@``@GO0`0)[W_\*^_ +M```,`%Q)C(0`!(^_```#X``()[T`$">]__"OOP`$K[````"`@"$,`%Q`C(0` +M!`P`'0\"`"`A#``=%@(`("&/OP`$C[````/@``@GO0`0)[W_\*^P``"OOP`$ +M#``="`"`@"$,`%Q$C@0`!(^_``2/L````^``"">]`!`GO?_PK[\```P`7%V, +MA``$C[\```/@``@GO0`0C((`````*"&,0D`@,$8`_SP#@`(`!1"`)&,XV`!# +M("&4@@``)*4``1#"``4LHP`(5&#_^#P#@`(#X``(```0(0/@``B4@@`")`(4 +M`*R"``PD`@F>I((`""0"``6D@@`8)`(`!*R"`&0D`@`>I((`("0""2JD@@!X +M)`(`!ZR"`'PD`@`#H((`@"0"``\D`P`")`4``20&`#R@@@!7)`(0`*R%`$R@ +M@P"!K((`6*2&`%ZL@``$H(,`&J"``!NLA0!TK(```*R``&RL@`!PK(``4*R` +M`&BL@``XI(``8*2&`%RD@`!B`^``"*2``((GO?_@K[````"`@"$D!!W8K[,` +M#*^Q``2OOP`0K[(`"`P`>[H`H)@A$$``0`!`B"$`0"`A```H(0P`<@TD!AW8 +M/`*@P#1"`*",0P```B`@(:XP```P8@#P``(1`C!C``^N(P1\#``=/:XB!'@` +M0!@A``"`(3P"@`(D4CB0`!`0P`!2$"&40@``$$,`!B0"``DF$``!*@(`"11` +M__<\`H`")`(`"1("`!4D`P`!#`![NB0$`,"N(AOX$$``$"0#__\``"@A)`8` +MP`P`<@T`0"`A#``=3R8D&V@`$!#``%(0(8Q"``0`0/@)`B`@(11```L`0(`A +MKG$```(`&"&/OP`0C[,`#(^R``B/L0`$C[````!@$"$#X``()[T`(`P`>\V. +M)!OX$`#_\ZX@&_@0`/_R)!```B>]__`D!0`.```P(:^R``BOL0`$K[```*^_ +M``P,`!WA`("0(0!`B"$40``'``"`(8^_``R/L@`(C[$`!(^P```#X``()[T` +M$`(`*"$,`"FX`D`@(28"``$P4/__`A$0*Q1`__H"`"@A$`#_\H^_``R,@AOX +M+*,`%0"@0"$D1P`T$&``"@``*"$\`H`"``@8@"1"$(``8A`AC$(```!```@` +M`````&<0(8Q%```#X``(`*`0(3#"(`!00/_\E.4`2!``__J4Y0!$,,(@`%!` +M__>4Y0!*$`#_]93E`$8D`@`0$,(`#RS"`!$00``&)`(`$20"``-0PO_MC.4` +M3!``_^LD!0`!$,+_Z0``*"$D`@`@5,+_YB0%``$0`/_DC.4`4(R"&]`00/_A +MC.4`5(SB`%@0`/_>`*(H)"0"`!!0PO_;C.4`9"S"`!$00``&)`(`$20"``-4 +MPO_5)`4``1``_].,Y0!<$,+_T0``*"$D`@`@5,+_SB0%``$0`/_,C.4`8">] +M_[`\!8`"/`:``J^P`#"OOP!(K[4`1*^T`$"OLP`\K[(`.*^Q`#0DPA$D)*,1 +M'(RG$1R,:``$C$D`#(Q#``2,QA$DC$(`"```*"$`@(`AKZ<`"*^H``ROI@`8 +MKZ,`'*^B`"`,`#K_KZD`)!1``&H`0"`AC@4``(RB0"`P0P#_,$0`#P`#&0(D +M`@`%I@,<]!!B`.^F!!SV-`*```"B$"&,0A@8```X(:8"'/@`!TB``3T0(8X# +M``",40`(```H(0!Q&"&,8P``K$,`$(X"````!1P``&48)0!1$"&L0P``C@(` +M`"2E``$LI`$``%$0(8Q"``!40P!()`0`%A2`__2.`@`````P(2>E`!B,HP`` +M),8``0!1$"&L0P``C@@``"S$``0DI0`$`1$0(8Q"``!48@`Y)`0`%E2`__2. +M`@```3T0(8Q#``B,1``0).(``3!'__\!`Q@A+.(``JQD```40/_3``=(@`P` +M:J(D!`!DC@(``#0$@``D`P`'`$00(:Q#&`".`@``)`,<%@``."$`1!`AK$,8 +MT(X#```DX@`!,$?__S0&@```9A@A/`(``2SD``BL8AB`5(#_^(X#``".`@`` +M)`4`"`!&$"&,1!P```0F`C""``\``A$```0A`@P`6?X`@B`E`$`@(3!#`/"F +M`ASZ)`(`,!!B`)`P@@`/`@`@(20%`,$,`"RR`Z`P(1!```LD!``6C[\`2(^U +M`$2/M`!`C[,`/(^R`#B/L0`TC[``,`"`$"$#X``()[T`4">U``("`"`A)`4` +M'`P`++("H#`A%$#_\"0$`!:7H@`"%$``:R04!```%!!`)%'^@`P`>[H"("`A +M`$"8(1!`_^8D!``"`B`P(0!`("$,`'(-```H(8X"&_@D$0#``C08*ZQ3`+@0 +M8``,`F"0(0(@*"$"`"`A`J`P(0P`++(F,0`!%$``"@(T&"N7H@`"ID(``!1@ +M__8F4@`"`H`H(0P`(0$"8"`A$$``"@`````28``&)`4`%@P`>\T"8"`AC@(; +M^*Q``+@D!0`6$`#_PP"@("$,`'NZ)`0`.!!`__0`0(@A`$`@(0``*"$,`'(- +M)`8`.(X"&_@"("`A#``A#ZQ1```40/_JEZ(```(`("$"8"@A#``E]Z8B```4 +M0/_D)B8``@(`("$,`"RR)`4`/Q1`_]\"`"`AC@4;^`P`(-`DI0"H%$#_V@`` +M```,`!_F`@`@(11`_]8F!1NF#``L>P(`("&*`QNFF@,;J11@``4D`O__E@(; +MJA!``!`\`@`#)`+__U!B``F6`QNJE@(;II8$&ZB6`QNJ```H(:8"&ZRF`QNP +M$`#_R:8$&ZXT`O__5&+_]Y8"&Z8\`@`#-$)_OZH"&Z:Z`ANI)`*JJA``_^^F +M`ANJ,$+_\`(`("$D!0`;`J`P(0P`++(``J,`%$#_>R0$`!:7H@`"$`#_C`*" +MH"4L0@`%%$#_=20$`!80`/]N`@`@(2R"``(40/]P)`0`%A``_P\T`H``)[W_ +M\*^Q``2OL```K[\`#*^R``B,@AOX`("((20$`"`,`'NZC%(`N!!``!<`0(`A +M`$`@(0``*"$,`'(-)`8`((XB&_@"`"@A`B`@(0P`2-NL4``$``"`(0(`*"$" +M("`A#``IN"80``$J`@"`%$#_^P(`*"&.)1OX#`!`!P(@("$40``/`````!)` +M``,`````#`![S0)`("$,`!^/`B`@(20$`!:/OP`,C[(`"(^Q``2/L````(`0 +M(0/@``@GO0`0#``U"0(@("$,`"]G`B`@(8XD&_@\`X`")&,R8#P0@`(\!X`` +M/`B``#P*@`.L@P`8KB(7Q"8)5U`DYTO0)0A-N"5*L0```"@A`B`P(0P`\T"0"`ACB,;^"0"``H``"`AK&(`:!`` +M_]FL8`"X)[W_X*^T`!"OOP`4K[,`#*^R``BOL0`$K[```(R2&_B.4```$@`` +M'0"`H"&.!``$%(``00````".!``(%(``.@````".!``,%(``,P````".!``0 +M%(``+````````)@A`@"((8XB`!0F.(@`4#`![S0(`("&N0```CD0`!!2```T``````H`@(0P` +M0!0"0"@AC[\`%(^T`!"/LP`,C[(`"(^Q``2/L``````0(0/@``@GO0`@#`![ +MS0`````0`/_QKD``!`P`>\T`````$`#_Y2YB``,,`'O-`````!``_]V.(@`< +M#`![S0``F"$0`/_4`@"((0P`>\T`````$`#_S(X$`!`,`'O-`````!``_\6. +M!``,#`![S0`````0`/^^C@0`"(R#&_@D`@`.)&,`-`/@``@``Q`+)[W_T*^T +M`""OL@`8K[``$*^_`"2OLP`C``",0@``KB,`-)1"```L0E`# +M%$``QB>F``0"0"`A#``LLB0%`,H40`">`$"@(9>B``0P0@_```(10C1"``&N +M`@`\CD(;^(Q"``"40@``+$)0`1!``*XGI@`"IZ```I9B`!*69``0EF,`%``" +M$(``@B`E``,8P)9E````@R`E-((``@!%(`J68P`"`(`H(32B`!"7I````$,H +M"C"B``$40``#K@0``"0"__T`HB@D,*(`"!1```0D`@D()`+_[P"B*"0D`@D( +MI@(`2)9"'/HP0@#P+$(`,!!``(NN!0`$ED,<]"0"``<08@`%)`()Q"0"``H0 +M8@`")`()Q"0""JRF`@!*EZ@``B0"$SBF`@!$)`(7U*8"`$8Q`P`")`(``:X" +M`&2N``!@%&``"```("&60QST+&(`!E!```0D!``!)`(`!5!B`&F60QSVEDD< +M]*X$`%PD`@`!,23__RR#``:N`@!4K@``4!!@`%X``#`A)`(`!5""`%B60ASV +M,03__P`$$$(X0@`!)`<``3!"``$Q`P`!K@8`6*X"`$RN!P`(K@<`#!1@``,` +M`#`A,*(`"0`","L`!!#".$(``3!"``$Q`P`$K@8`$*X"`!048``#```P(3"B +M``D``C`KEF(`!HYD`!@`!1D",&,``:X&`!BN`P`@K@<`)*X"`"BN!P`<$(`` +M!```*"&.8@`<5$```R0"``$D!0`!)`(``3$#`?"N`@`PK@4`+!1@``(``Q$" +M)`(`"C$#\``08``EK@(`-``#&P(D`@`!`&(0!*X"`#B.0AOXC$,``)>B``0P +M0@_```(A0I1B```L0E`#%$```ZX$`#PT@@`!K@(`/()B`""N`@!H@F(`(:X` +M`$"N`@!L)`(`"A!)``PD`@`##``?X0)`("$"@!`AC[\`)(^T`""/LP`]`#`0`/_TK@(`0!``_]XD`@"`+$(`"!1`_Z@Q!/__ +M$`#_I20&``$D`@`"$&(``RQB``140/^5EDD<]!``_Y(D!``!$`#_?20""<0" +M0"`A#``LLB0%`,D40/_A`$"@(9>B``(0`/]-IF(`.`)`("$,`"RR)`4`RA1` +M_]D`0*`AEZ(`!#!"#````AE"K@,`/!``_SNGH@`$)[W_T*^S`!ROL@`8K[$` +M%*^P`!"OOP`@`*"0(0"`F"$``(@A`*"`(28E`+`"8"`A#``LL@.@,"$F,0`! +M`$`X(11```@J)``&EZ(``).C``$``A("H@,``*("``$4@/_R)A```I)#``LD +M`@#_$&(`"@``B"&B0``,C[\`((^S`!R/L@`8C[$`%(^P`!``X!`A`^``"">] +M`#`"42`A`E$H(X"&``"0H@`*)C$``2HC``6@@@``%&#_^*"F``H0`/_MHD`` +M"R0'`,``Y1`K$$``!P``,"&4@@``).<``0#E&"L`PC`F%&#_^R2$``(XP___ +M)`(`%@/@``@``Q`*)[W_\*^P````@(`AK[\`!`P`>[HD!`%8K@(`!!!``$(D +M`P`"`$`@(0``*"$,`'(-)`8!6`P`>[HD!`-DK@(`"!!``#DD`P`"`$`@(0`` +M*"$,`'(-)`8#9(X)``@D`@`*)`@`":4B`!0D`@`#I2("'B4C`!PD`@`+)0C_ +M_Z1B```%`?_])&,`-```0"$!(#@A/`.``CP"@`(`""!`)&,=)"1"'1P`@A`A +M`(,8(91&``"48P``)0@``0")("$D`@`+*04``Z2#`B"DA@(FI.(",J3B`LX4 +MH/_N).<`-`P`>[HD!`"(K@(`#!!```\D`P`"`$`@(0``*"$,`'(-)`8`B`P` +M>[HD!`@`K@(`$!!```8D`P`"`$`@(0``*"$,`'(-)`8(````&"&/OP`$C[`` +M``!@$"$#X``()[T`$">]_^"OOP`0K[,`#*^R``BOL0`$K[```(R"&_@`H$@A +M,,/__XQ3``"68@``+$(P`Q1``"F.<``(E@8`%```D"$"1A`K4$``$)8"`!0" +M`#@A``,00`!)$"&42```)E(``B1C``$Q!`#_``@2`@)&*"NDX@``I.0``C!C +M__\4H/_T).<`!)8"`!000``,``"0(0(`B"&6)0``EF0`````,"$,`"BX)E(` +M`98#`!2F(@```D,8*Q1@__IB8`!*8E``*6"@``)A```@`*2X(`"D$```H2 +M`@`*&((`B2`E,0@`/S!"`#\P8P`_IB@`)*8D`!ZF(@`@IB,`(I8*```F$``" +M``H;`@`*$8(!`T`E,$(`/S%#`#^F*``DIB(`)J8C`"B6"@``)A```@`*0(`` +M"AD"``H2@C$(`#\P8P`_IB@`+J8B`"JF(P`LE@H``"80``(`"B."``H8@@`* +M$@(!!$`E,$(`/S!C`#^F*``NIB(`,*8C`#(,`"B4EH0``)8G``80X``-```P +M(0(@*"&$H@`>),8``0#'("L``AA``&(8(0`#&,``8A@A``,80*2C`!X4@/_V +M)*4``B;6``$"UQ`K)C$`-!1`_[$F)&,`-R91`L@0`/^))D0")B>]_["OO@!`K[<`/*^V`#BOM0`T +MK[0`,*^R`"BOL``@K[\`1*^S`"ROL0`DC((;^#DC``$!(/`AC$0``##6__\! +M`*@AC((`!)2$````H+@A)$D!$*^B`!PD0@$*`$-("S#R__\``*`AKZ0`&`+` +M@"$7P`"C``!`(0/2$"L00``A`!(00@`0$$``58@ADB(``0`4&$"/I``8```P +M(0!]F"$00``7`$`H(0P`*+@`````)H,``3!T__^6(P```!0H0`"]B"$``QH" +MCZ0`&```,"&F8@``$&``"@!@*"$,`"BX`````"8#``$P]`!`,`'O-CB0``!``__8D`P`"E(,`%B>]__`D +M`MZM`(!@(:>B``*DHP`&IZ(```!@."$``#`A```@(0"'$`5@@`4``!((1!``'&DH@`$``D80`!I&"$``QB``&D8(0`)0(```QA` +M`0D0(0&#&"$``A"`C*H`")1D`!@`21`A``(0@`!*$"&D1```)&8`&)3#`!*D +M0P`"EZ,``C0"WJT08@!>```@(0$)&"$``QB``&D8(0`$$(``1!`A``-8@"2# +M``$``A"`,&3__P%J."$`1Q`A+(,`!!1@__.D0``&EZ,``)3$``(``Q"``$,0 +M(0`"$(``1Q`AI$0`")>C``(``Q"``$,0(0`"$(``1Q`A)`,`%*1#``B7HP`" +M``,0@`!#$"$``A"``$<0(20#`".D0P`*EZ,``@`#$(``0Q`A``(0@`!'$"$D +M`P`_I$,`#)>D````!!"``$00(0`"$(`!8A`A`$H0(21$``0D`@`$I((``I3# +M``:4@@`$`$,0(:2"``:4PP`*`$,0(:2"``B4PP`.`$,0(:2"``J4P@`$I((` +M#)3"``BD@@`.E,(`#*2"`!"4P@`0I((`$I>D``(`!!"``$00(0`"$(`!8A`A +M`$H0(21$``0D`@`#I((``I3"`!2D@@`,E,(`%J2"``Z4P@`8I((`$)2B``0E +M(P`!,&G__P$B$"L40/^2``D80"0"``$#X``()[T`$`$)&"$``QB``&D8(0`$ +M$(``1!`A``,X@"2#``$P9/__``(0@`#J&"$`0Q`A+(,`!!1@__.D0``&EZ0` +M```$$(``1!`A``(0@`#B$"$`2A`A)$0`!"0"``2D@@`"E,(``J2"``24PP`& +M`$,0(:2"``:4PP`*`$,0(:2"``B4PP`.`$,0(:2"``J4P@`$I((`#)3"``BD +M@@`.E,(`#*2"`!"4P@`0$`#_S:2"`!(GO?ZPK[`!(D`@`!``"0 +M(0``J"$2@@!RC[$`!%*``&J.8P`,)`(``A*"`%TF(@!IIJ```!+@`#@``+`A +MEF(``(^E````$2!`)B,``0"%("$L0C`#,''__Q1``$^4D````!`2`J9"``B6 +M10`($*``2"8B``$6@`!$EF0`````,"$,`"BX`````*9"``B68@``+$(P`Q1` +M`#H`$!C``!`9```0$((P0@`_,&,`/Z9#``2F0@`&EF(``(^E````$2!`)B,` +M`0"%("$L0C`#,''__Q1``".4D```ED,`!``0(P(`$!&"`&08)3!"`#\R!``_ +MID,`!*9"``*F1```EJ(``"1"``&FH@``)M8``0+7$"L40/_*)E(`"B:4``$N +M@@`#%$#_NB0"``&/H@`(C[\`-(^^`#"D40``C[<`+(^V`"B/M0`DC[0`((^S +M`!R/L@`8C[$`%(^P`!`#X``()[T`0)9#``0`$"!"`!`K0@`0$<(`91@E,$(` +M/Q``_]TPA``_$`#_R``0$,(0`/^])`8``1``_]TP4?__$`#_L@`0$D(7P``$ +M,%'__R8B``80`/_:,%'__XYB``PD%P`#)%4`4A``_YLD4@!4)B(`53!1__\` +M8*@A)!<`"!``_Y4D<@`")B(`93!1__\3P/_P)B(`!(YB``PD%P`")%4`6H@``)B,`""8D``]`#`D!@"0)`(`0!``_^H`0S`+`F`@ +M(0P`)$<"@"@A`$"H(11`_^T`0!@A$`#_VY9#```GO?_0K[8`&*^S``ROL@`( +MK[\`(*^W`!ROM0`4K[0`$*^Q``2OL```C((;^`"@D"$`P)@AC$(``)14```D +M`@`/H*(`(BZ6,`,D`@`/%L`"+:2B`"8\`H`")%`+,H(92P```F,0`!,@(``0`"$<``@B`E`!`00J)$`&NB0@!P)J(``3!5 +M__\NH@`#%$#^_P`5$(!2P``3CN(`%``1$$``4Q`AE%```"8Q``$`$2!``!`0 +MPC(#``]`#``4Q`AE%````*`("$D!@`! +M#``HN#(%`/\F,0`!`!`J`@*`("$D!@`!#``HN*9"`0H`$1A`ID(!#`!S&"&4 +M<```)C$``0`1($``$!'",@,`?S!"`#^F0P`*ID(`#@"3("&4D```)`8``0*` +M("$,`"BX,@4`_RZ#0`&F0@$.%&``!"8Q``$`$!(",$(`/Z9"`-P`$1!``%,0 +M(910```NA$`")C$``0`0$4(P0@`_,@,`'Z9"`004@``&ID,!"``1$$``4Q`A +ME%```"8Q``&B4``B+H)0`!1`_XHFH@`!`!`2`@`0,\(P0@!_`!$80*9&`$ZF +M0@!$`',8(91P```F,0`!`!$H0#("`!\``A!``!`90@`0(L(`PC`E,&,`/Z)$ +M`&RF1@!.ID,`X`"S*"&4L```)C$``3("``<``A%``((@)0`0$,*B1`!L$`#_ +M;*)"`'$`$1!``%,0(910```"@"`A)`8``0P`*+@R!0#_)C$``0`0*@("@"`A +M)`8``0P`*+BF0@$0`!$80`!S&"&F0@$2E'````*`("$D!@`!#``HN#(%`/\N +M@T`!ID(!%!1@_U,F,0`!`!`2`C!"`#\0`/]/ID(`V@`0$,(P0@#_+H-`!A1@ +M_Q"F0@`D`!`2PA``_PVF0@`F`%(0(20#``JD0P#2)`(`#Q``_Q"F0@`D,$(` +M!S(#``>F0P#\$`#^\*9"`0`6H/[O+H(P!#("`#\0`/[KID(`#``0$,(P0@`' +M,@,`!Z9#`/H0`/[EID(`_C!"``$0`/[1ID(`,#!"``$0`/[.ID(`+C!"``F0P#NID0`\!``_G2F0@#J`!`1`C!"``B```0 +M`/_>,$/__XR"``",0D`(.$(``0/@``@L0@`!)[W_X*^S``ROL0`$K[```*^T +M`!"OL@`(K,```(R+```D`O__`*"8(8UI`(``P(`A`(!0(20%__\1(@`X``"( +M(8R#&T`\!`$%-(38,`$C&"0\`@"``21`)#$E``4`8F@D-0(``0!%0`L\$@`@ +M,&<`!3!F`4`U`@!``'+()#$E`4`P;`"``&08)`!%0`LT8@`!`$<8"S1B`$`\ +M%`/_/!@@`#$O`"`Q+@"`$:```@!&&`N-<0",`8,8)0(X("01H``"`'@0)0!$ +M&`L`OO@!PK[<`;*^T`&"OL@!8K[$`5`#`D"&O +MOP!TK[8`:*^S`%ROL`!0`."((:^B`#0`@*`A`*"X(0`(J`JOH``$KZ`````` +M,"$0X`!!``#P(93C``PL8@`A$$``$P`#$(`\`X`")&,1?`!#$"&,0@```$`` +M"`````"4Y0`T)/``-B0"``6OH@`T)`(`:!"B`@,HH@!I$$`!_R0"`(`D`@`H +M4*(`#I("``6/OP!TC[X`<(^W`&R/M@!HC[4`9(^T`&"/LP!]`("2`@`%D@,`!)($``:2!0`'``(2``!B&"4`!"0``&08)0`% +M+@``91@E`'48)C!C__\``Q`G,$+__Z^B`!2OHP`$D@,``9("``"2!``"D@4` +M`P`#&@``0Q`E``0D``!$$"4`!2X``$40)0!5$"8``A@GKZ,`#*^B```20``4 +M-`6``))"``.20P`"DD0``9)%``4``A8```,<`))&``221P```$,0)0`$(@`` +M1!`E``4J``"F,"4`1_`E`![P0@`&%\`#PO`E``8P0C0%@``TQH``KZ4`1*^F +M`$@2(``%KZ``/)8C``PD`@`0$&(`*@*`("$``#`A`Z`X(0`7$,".@P```$80 +M(8SE``P``A"`-`B(``!($"$DQ@`!`&(8(2S$``BLX@`(K&4``!2`__,DYP`( +MCH(````7(4"/HP```((0(0!($"&L0P``CH(``#0#B`0`@A`A`$,0(8^C``2L +M0P``CH(``#0#B!@`@A`A`$,0(:Q>``".@@```((@(30"B!P`@B`ACZ(`2*R" +M```0`/^1C[\`="0%`!,,`!WA)`8`$!!`_]0``#`A$D`!`R>D``@``"@A#`!R +M#20&`$`D`@`$)C``%*^B`#22`P`-D@(`#)($``Z2!0`/``,:``!#$"4`!"0` +M`$00)0`%+@``11`E`%40)J^B`"R2`P`+D@(`"I($``R2!0`-``,:``!#$"4` +M!"0``$00)0`%+@``11`E`%40)C!"__^OH@`DD@,`!Y("``:2!``(``,:`)(% +M``D`0Q`E``0D``!$$"6/I``$CZ,````%+@``11`E``0@)P!5$"8PA/__``,8 +M)S0%@``"`)`AKZ(`'*^D`!2OHP`,KZ4`1*^@`#PR\___```P(0.@."$`$Q#` +MCH0```!&$"&,Y0`,-`.(```"$(``0Q`A),8``0""("$LPP`(K.(`"*R%```4 +M8/_S).<`""8P`$8FX@!`)Z0`"```*"$D!@!`#`!R#3!3__^2`P`!D@0``I(B +M`$:2!0`#``,:``!#$"4`!"0``$00)0`%+@``11`EKZ(`#)(#``62`@`$D@0` +M!I(%``<``QH``$,0)0`$)```1!`E``4N``!%$"6OH@`<```P(0.@."$`$Q#` +MCH,```!&$"&,Y0`,``(0@#0(B```2!`A),8``0!B&"$LQ``(K.(`"*QE```4 +M@/_S).<`"(Z"``"/HP```!>Q0`+"$"$`2!`AK$,``(Z"```T`X@$)Z0`"`+" +M$"$`0Q`ACZ,`!```*"$D!@!`K$,``";B`"`,`'(-,%/__R0"``2OH@`TDD,` +M#9)"``R21``.DD4`#P`#&@``0Q`E``0D``!$$"4`!2X``$40)0!5$":OH@`L +MDD,`"Y)"``J21``,DD4`#0`#&@``0Q`E``0D``!$$"4`!2X``$40)0!5$"8P +M0O__KZ(`)))#``>20@`&DD0`"))%``D``QH``$,0)0`$)```1!`E``4N``!% +M$"6/I``$`%40)H^C``"OH@`OI``4KZ,`#*^^`#ROH@!$,O/__P``,"$#H#@A`!,0 +MP(Z$````1A`AC.4`##0#B````A"``$,0(23&``$`@B`A+,,`"*SB``BLA0`` +M%&#_\R3G``@F,`!.`D`@(2;B`$```"@A)`8`0`P`<@TP4___D@,``9(B`$Z2 +M!``"D@4``P`#&@``0Q`E``0D``!$$"4`!2X``$40):^B``R2`P`%D@(`!)($ +M``:2!0`'``,:``!#$"4`!"0``$00)0`%+@``11`EKZ(`'```,"$#H#@A`!,0 +MP(Z#````1A`AC.4`#``"$(`T"(@``$@0(23&``$`8A@A+,0`"*SB``BL90`` +M%(#_\R3G``B.@@```!2`@`& +MD@0`")(%``D``QH``$,0)0`$)```1!`E``4N``!%$"4`51`F$`#]Z*^B`!R2 +M`@`,D@0`#I(%``\``QH``$,0)0`$)```1!`E``4N``!%$"4`51`F$`#_VC!" +M`/^4Y0`*)`(`:!"B``TD\``4**(`:1!```8D`@"`)`(`*%"B_;ZOH``T$`#] +MO20"`&A4HOV[)`(`:!``_;HIP`(N*<` +M"Z"H``P#X``(`&`0(8R$&_@PI?__C(,`-!!E``(``!`AK(4`-`/@``@````` +M`^``"```$"$GO?_@K[$`%`.@,"$`H(@A)`4`'Z^R`!BOOP`<`("0(0P`++*O +ML``0`D`@(0.@,"$00``))`4`'B0$`!:/OP`B``"3HP`!`@*`(0`"$@*B(P`##``LLJ(B``(40/_G)`0`%I>B``"3HP`! +M/`4``@("@"$``A("```@(32E__VB(@`$$@#_W*(C``46!?_]_]"OOP`@K[,`'*^R`!BOL0`4K[``$(RC`!",I@`4 +M`*"`(5!@``$```'-`,,`&XX"``P#H"@A`("((0``F!(```````````!B`!L` +M`)`2#``M\`````"/HP`$CZ(``(X&``2.!0`(``,=@``"$H(`8D@EC@,``(X( +M``PE(@`"),;__P!H("$F9___`((8*P3``*&N!```5&#_]XX#``!PR#@"C@(` +M$(X#`!@`Y#`A<*(@`JX&``0`AA`A$&``C*X"``B.)```-`6``#P#`!``A2`A +MC((`!`!#$"6L@@`$CB(``(X#`!0`11`AK$,`)(XB``".`P`8`$40(:Q#`#B. +M(P``C@(`"`!E&"$``A#`K&(`,(XB``".`P``-!*```!2$"&L0P`HCB,``)8& +M``X\$___`'(8(8QB`"`"("`A/`6```!3$"0`1A`EK&(`(`P`*88`````CB(; +M0(XD```\`__[-&/__P!#$"2N(AM`K((`H(XB'8B.)```/`7__P!#$"2N(AV( +MC@(`(`"2("&,@P`8-*4`_P`"$@``91@D,$+_``!B&"6L@P`8CB(;0(XD```\ +M`P`$`$,0):XB&T`\!8``K((`H`P`*58"("`AC@,`'(X"``P`0Q`K5$```:X# +M``R.`@`0`$,0*U1```&N`P`0C@,`#(X"`!!08@`ZC@(`!(X"``2.(P``/`8` +M!P`"$,`TQO__)$+_Z`!R&"$`1A`DK&(`U(XC```\!0#_-*7__P!R&"&,8@#4 +M/`<*`#P$`!@`11`D`$<0):QB`-2.(P``C[\`(`!R&"&,8@#4`$00):QB`-2. +M`@``CB,````"$,`D0O_H`$80)`!R&"&L8@#8CB,```!R&"&,8@#8`$40)`!' +M$"6L8@#8CB(``)8#``X`4A`AK$,`W(XD``".`P`0C[$`%`"2("&,@@#<``,< +M``!S&"2/L@`8C[,`'(^P`!`P0O__`$,0):R"`-P#X``()[T`,!``_\:N`@`` +MCB,``#0"@``\!/_O`&(8(8QB``0TA/__`$00)*QB``00`/^!CB(``"2E__\H +MH@``)D;__Q``_UP`XB@+C((``#0&@```1A`AC$(`3*BB``"XH@`#C((```!& +M$"&,0P!0C$(`4*BB``2XH@`'B*(`!)BB``<00P`&`````(R"````1A`AC$(` +M3*BB``"XH@`#`^``"`````",@P``-`6``#P&`0``91@AC&(`(`!&$"6L8@`@ +MC(,```!E&"&,8@`@`$80):QB`"`#X``(`````(R%```T!H```(`X(0"F$"&, +M1``$C*(`%#P#_Y\T8___-$(`(*RB`!2,X@```(,@)#P#`((`@R`E`$80(:Q$ +M``2,XAMT)`,4`#!"-P!00P`#C.,```/@``@`````)`(#<*S@'0"L8A!P$`#_ +M^@````",@AMT```8(3!"`@`00``UC(D<#)"K```18``.``!`(0"H$"&00@`! +M)0@``0$+4"HP1@!_,$(`@!!```0`PS@K5.```0!@,"$PPP#_%4#_]0"H$"&- +M)@``&,``"0``."$E)0`VD*(``!!#``4DI0`<).<``0#F$"I40/_[D*(``!C` +M``L``$`A)24`-P#H$"I40``"H*<``*"H``"-(@``)0@``0$"$"H40/_X)*4` +M'%!@``Z,@P````,00BQ"``-00``*C(,``(R$```T`H``/`,"``""("&,@@`$ +M`$,0):R"``0#X``(`````#0"@``\!/W_`&(8(8QB``0TA/__`$00)*QB``0# +MX``(`````(R#```T`H```&(H(8RB&&0``A3",$,!`#!$`?\08``".((!_P`" +M(">,H@!0C*,`3`!#$"8#X``(`$00)B2C__\L8@`%`*#`(1!``#L`@'`A``,0 +M@#P#@`(D8Q)$`$,0(8Q"````0``(`````(R"```T#X``)(T$@`!/$"&,1`"0 +MC:(`3(VC`%B-QP2``$00(:VB`$R-P@``C:@`8(VD`%"-I0!4`$\0(8Q"`(R- +MJ0!DC:L`:`!B&"&MHP!8C`````#P"4>LT0H4?`*(`&0``$!```BE")`(`9`!E`!M0H``! +M```!S0``&!(0`/_2`$,@(U#`_]```"`AC((``#0#@```0Q`AC$4`[*S%``", +M@@```$,0(8Q$`/"LQ``$C<(```!#$"&,0@#TK,(`"(W"````0Q`AC$(`^*S" +M``R-P@```$,0(8Q#`.R,0@#P`&48)@!$$"8``Q@K``(0*ZS"`!`0`/^SK,,` +M%(R"```T`X```$,0(8Q"&&0``A,"`^``"#!"`'\PI?__)(0%O```&"&4@@`` +M$$4`"22$`$@00``(``,4`"1C``$L8@!`5$#_^92"```#X``(```0(0`#%``# +MX``(``(4`R>]__"OL```)`4``@"`@"&OOP`$#``NA```,"&.`@``-`2``#P# +M``(`1!`AK$`!)(X"``"/OP`$`$00(:Q``2B.`@``K$``0(X"````1!`AK$,! +M,(X"``"/L```/`,"``!$$"&L0P$X`^``"">]`!`GO?_P```H(20&`$BOOP`$ +MK[````P`<@T`@(`A/`(`/S1"_SBN`@!$)`(!]*X"`!`D`@!DK@(`'"0"`"BN +M`@`D/`,`/R0"``]`!`GO?_PK[\`!*^P +M``",D`6X/`(`0`"`0"&.`P`0`$,@(P!#$"H00``EK@``#*X``$".`P`8/`(` +M0`!#(",`0Q`J4$```JX$`$2N``!$C0(``(X#`$`T!X```$<0(:Q#`2R-`@`` +MC@,`1`$`("$`1Q`AK$,!-(T"```\`P`")`4``@!'$"&L0P$PC0(``#P#`@`` +M`#`A`$<0(:Q#`3@,`"Z$`````*X``#RN```XC[\`!(^P```#X``()[T`$!`` +M_]RN!`!`)[W_\*^Q``2OOP`(K[```(R#%\``@(@AC)`%N"AB```D9`!_`&`H +M(0""*`L`!2G#``41P`!B$",H0@!`5$``!0"@("$D8P#^*((```!B(`L`!"'# +MCB(7Q!!``!2/OP`(D@(``Q!``$TD0@`!D@,`!"QB``(40`!$)&(``8X"`"0` +M1!`J4$``'XX"`""2`@`&$$``$B0"``&2`P`%+&(``A1```8D8@`!C[\`"(^Q +M``2/L````^``"">]`!`P1@#_`B`@(20%``2B`@`%#``Q60`````0`/_UC[\` +M"`(@("$D!0`"H@(`!@P`,5D``#`A`B`@(20%``6B```$$`#_\P``,"$`1!`J +M4$``"XXB&W22`@`&4$#_X9(#``6B```&`B`@(20%``(,`#%9)`8``1``_]J2 +M`P`%,$(0`!!`_]N/OP`(D@(`!A!```@D`@`!D@(`!5!`_]6/OP`(H@``!0(@ +M("$0`/_E)`4`!*("``8"("`A)`4``@P`,5D``#`A$`#_])("``4P1@#_`B`@ +M(20%``40`/_-H@(`!#!&`/\"("`A)`4``1``_\BB`@`#C(,7P">]__"OOP`` +M*&(``"1E`'\`8#`A`*(P"P`&,<,`!A'``&(0(RA"`$`40``JC(<%N"1C`/XH +MH@```&(H"P`%&<.,@A?$$$``#8^_``"0X@`#$$``'"1"``&,X@`@`$,0*E!` +M``^,@AMTD.,`!2QB``(40``$)&(``8^_```#X``()[T`$#!&`/\D!0`$H.(` +M!0P`,5D`````$`#_^(^_```P0A``$$#_]8^_``"0X@`%$$#_\B0%``2@X``% +M$`#_]```,"$P1@#_)`4``1``__"@X@`#$`#_V@#`&"$GO?_PK[(`"*^Q``2O +ML```K[\`#)2%&W`,`"\8`("`(0`"&,``8A@A``,8P`(#D"&60P6\E@(;<"91 +M!;P"("`A$&(`+ZX1!;@,`"]%`````(X"&W26`QMP``(2`C!"``^F0P6\HB(` +M`I(F``,"`"`A#``Q620%``&2)@`$`@`@(0P`,5DD!0`%DB8`!@(`("$D!0`" +M#``Q62S&``&2)@`'`@`@(0P`,5DD!0`#DB8`!20%``0,`#%9`@`@(0P`+XH" +M`"`AC@(``#0$@``\`P`"`$00(:Q#`3".`@``C[\`#(^R``B/L0`$C[````!$ +M$"$\`P(`K$,!.`/@``@GO0`0C@(;=)(C``(``A(",$(`#Q1B_\T`````$`#_ +MU)(F``.,@Q?`)[W_\*^_```H8@``)&8`?P!@."$`PC@+``\C@0`#``#$(``0Q`A`$00*Q!``!L`9!`KC@(`%#P#$&(T8TW3<((0`@!# +M`!D``!`0``(1@@!%$"L40``)`````(X"`!QP@A`"`$,`&0``$!```A&"`$80 +M*Q!```4`````#``OB@(@("$0`/^ZC[\`"`P`,*<"("`A$`#_^0`````00/^S +M/`,08HX"`!`T8TW3<((0`@!#`!D``!`0``(1@@!%$"L40``-`````(X"`!AP +M@A`"`$,`&0``$!```A&"`$80*U!`_Z./OP`(#``P)P(@("$0`/_B``````P` +M+[L"("`A$`#_W@````"L90$LCB(``#P#``(`1!`AK$,!,!``_Z^.`P!$)*7_ +M_RRB``4GO?]P`(!H(1!``%(`P&`A/`.``@`%$(`D8Q-$`$,0(8Q"````0``( +M`````#P"@`(\!H`")$,2P(VE``",1!+`C&(`!(S#$L@T"H````Q(@`$]2"&O +MH@`$`*HH(:^C``BOI```C2,``(RD&%`\`O`/-$+__P""("0``QT`/`(/\`!B +M&"0`@R`E/`B``B3&$LBLI!A0C,(`!(T#$M"-I@``KZ(`#*^C`!``RC`AC2(` +M"(S%&%P\`__`/`0`/S1C?_\TA(````(3P`!$$"0`HR@D`*(H)3P'@`(E"!+0 +MK,487(SC$MB-`@`$C:4``*^C`!BOH@`4`*HH(8TB`!",I!A<)`.`?P`"$<`` +M@R`D,$)_@`""("6LI!A<).<2V(SC``2-I0``/`+\`Z^C`!P`JB@AC*086(TC +M`!@T0O__`((@)``#'(`\`@/\`&(8)`"#("6LI!A8`^``"">]`)`\`H`"/`B` +M`B1#$N",1!+@C&(`!(T#$N@`!F`KC:8````,6(`!?5@A-`Z``*^C`"BOH@`D +MKZ0`(`#.,"&-8@`@C,48;#P#_^`\!``?-&,__S2$P````A.``$00)`"C*"0` +MHB@EK,48;#P'@`(E"!+HC0(`!(SC$O"-I0``KZ(`+*^C`#``KB@AC*08;(UC +M`"@\`O`?-$+__P""("0``QU`/`(/X`!B&"0`@R`EK*08;#P&@`(DYQ+PC.(` +M!(S#$OB-J```KZ(`-*^C`#@!#D`AC6,`,(T$&&@\!X`"/`+_`3P)@`(DY1,` +M-$+__R3&$OB,Q@`$C*4`!"4J$PB,YQ,``((@)(TI$P@\`@#^``,<0`!B&"0` +M@R`EC4H`!*^F`#ROI0!$KZ<`0*^I`$BM!!AHC:4``(UD`#@\`H#_`*XH(8RC +M&&@T0O__``0F``!B&"0\`G\``((@)`!D&"6LHQAHC:4``(UD`$`D`__@`*XH +M(8RB&&@PA``?KZH`3`!#$"0`1!`EK*(8:(VD``"-9@!()`/`_P".("&,@AAL +M``8R`##&/P``0Q`D`$80):R"&&Q1@``(C:(``(VC````;A@AC&(8;#1"``&L +M8AAL$`#_B@`````D!/_^`$X0(8Q#&&P`9!@DK$,8;!``_X,`````/`*``B1# +M$Q",A0``C&8`!(Q$$Q``#!@K-`*````#&(``HB@A`'T8(:^D`%"OI@!4C&0` +M4(RB(@@D`__`,(0`/P!#$"0`1!`EK*(B"!``_VX`````/`*``B1#$QB,1!,8 +MC&4`"(QB``2-I@````P8@*^D`%BOH@!*^I`'ROJP"$ +M`*(H(8QB`&B,HQDD)`3_`0`"$$``9!@D,$(`_@!B&"6LHQDD$`#_,P````", +MA06XC(,``#0"@`",I@`T`&(8(8QJ`.PD!/__C&D`\(QG`/A0P``0K*D`,#P( +MOJ8`YA`K`.H8(Q1```HU"')1C*(`+(RD`#``:1@C`&88(P!B&"$`9!@A`&@` +M&0``&!```R/"K*D`,*RG`#2LJ@`L`^``"`"`$"&,@P``-`*``#"E``<`8A@A +MK&4`6*R%&T@#X``(K(`;3(R"&_@`@&`A,,8W`(Q"````H&@A)8X;:(Q$``0D +M`A4`$,(`-0``&"$LPA4!$$``!P`#$$`D`A(`$,(`,20"%`!0P@`!)`,``@`# +M$$``1!`AE$4`EI1&`+241`"0E$@`G)1#`*Z41P"ZE$D`HI1*`,``!2F`E$L` +MQI1"`*@`A2`E``8Q@``(0P``9A@E``<[``"(("4`"4R```(6``!G&"4`"E2` +M`(D@)0!J&"4`"UX``((@)20"``$1H@`-`&LH)3FB``(`HB`*C8(``#0#@`"M +MS0`X`$,0(:Q$&6"-@@```$,0(:Q%&60#X``(`````!``__4`@"@A$`#_TR0# +M``(0`/_1)`,``2>]__"OOP``C*H!$``'/@`Q"`#_``<^`Q%(`!DDJ0"4K*@! +M$(R"!9@D0@`!K((%F"0"``&A(@`_C((;4!1```,D`@`"4,(`!($B`":/OP`` +M`^``"">]`!`D`P`!`&@P"B1"``(`XA`J%$#_^`#`*"$,`#*<`````!``__6/ +MOP``C((;4!1`__*/OP``D2,`/X$B`#\D9@`!``8>`"A"``,00/_K``,>`R0" +M``$D!0`"`$HH"B0"``,48O_EH28`/Q``_^L`````C(,;="0"%``P8S<`$&(` +M`P`````#X``(`*`0(1"F__T`````$*``!8R#```D`@&,K&(0(SB```D`P`_`$40(:Q#&?0#X``(`````#0#@```0Q`A$`#_TB0#``^, +MA```/`/\_S1C__^,@D`0-`6```!#$"2L@D`0C.0``"0#__V,@D`0`$,0)*R" +M0!",X@``)`,`#`!%$"&L0QGPC.(``"0#``$`11`AK$,!!(SD```D`\!_`(4@ +M(8R"`!P`0Q`D-$(3@*R"`!R,X@``)`,`?P!%$"&L0QATC.(``"0#``X`11`A +MK$,8>(SB```D`P#_`$40(:Q#&?00P``&C.(``"0#`!\`11`AK$,8<`/@``@` +M````)`,`#Q``__L`11`A)[W_\*^R``BOL0`$K[\`#*^P``",@@``-`.```"` +MB"$`0Q`AC$(`S#!"``$00``'``"0(8^_``R/L@`(C[$`!(^P```#X``()[T` +M$(XC```T$(``)`0`/`!P&"&,8@#,-$(``:QB`,P,`&JB`````(XB````4!`A +MC$(`S#!"``$00``-)!``"0P`:J(D!``"CB(``#0#@``F$/__`$,0(8Q"`,PP +M0@`!$$```R0"__\6`O_U`````"92``$J0@`"5$#_XXXC```0`/_;C[\`##P+ +M_]\\#=`^/`S0/CP*&2\\"1DK-`B``#0'@``U:___-:U&2#6,9X@U2K44-2FU +M%!"@`!0`@#`AC(,```!H&"&,8@#`-$(`@*QB`,",@P``/`0`(`!H&"&,8@`$ +M`$00):QB``2,P@```$@0(:Q-(@B,P@```$@0(:Q*&7`#X``(K,`;4(R#```D +M!/]_`&<8(8QB`,``1!`DK&(`P(S#````9Q@AC&(`!`!+$"2L8@`$C,(```!' +M$"&L3"((C,(```!'$"&L21EP)`(``0/@``BLPAM0C((;^)2#&^HD!@`!`(`X +M(1!F``>,0@``5&``/(SB``",0@`$C$(`-%!``#B,X@``C.(``#0%@``D`P`/ +M`$40(:Q#&'",X@``)`,`#93D'/H`11`AK$,8=(SB```D`P`,,(0`\`!%$"&L +M0QAXC.(``"0#``4LA``P`$40(:Q&&?",X@```$40(:Q#&?04@`````"`,"$0:0`'C$(``!1@`#D`````C$(`!(Q"`#000``U`````(S#``"4 +MQ1SZC&)`$#"E`/`LI0`P`$@0)*QB0!",Q```)`/__8R"0!``0Q`DK()`$(S" +M```D`\!_`$<0(:Q)`02,Q````(<@(8R"`!P`0Q`D-$(/@*R"`!R,P@``)`,` +M#P!'$"&L0QAPC,(``"0#`'\`1Q`AK$,8=(S"```D`P`.`$<0(:Q#&'B,P@`` +M)`,`#`!'$"&L0QGPC,(``"0#`/\`1Q`AK$,9]!2@``:,P@``)`,`%`!'$"&L +M0QGX`^``"``````D`P`8`$<0(:Q#&?@#X``(`````">]_^"OL@`8K[$`%*^P +M`!"OOP`<`("`(8R$&W0D`B0`,+$`_S"#-P`08@`'`,"0(8^_`!R/L@`8C[$` +M%(^P`!`#X``()[T`((X"'8P40/_YC[\`'`P`4Y(`````C@8=T#P#@`(D8QU< +M/`2``@!#$"$DA!UD`,0@(9!%``"0@P```!$00`!1$"$`Q2@'`&(8(3"B`/]P +M8E`"``,80`(`("$XR0`!)&@!*J.E```0P``#)&<`2B1G`)4!"3@+]`!`0`/_O)$(\ +M\">]_^`LH@`%K[,`#*^P``"OOP`0K[(`"*^Q``0`@(`A$$``Q"03`!8\`X`" +M``40@"1C$YP`0Q`AC$(```!```@`````C(0``#0"@``\`P`$`((@(8R"``0` +M0Q`EK((`!!#```\``)@AC@4``"0#W_\\!/_\C*)`$#2$__\`0Q`DK*)`$(X% +M```\`P`"C*)`!`!$$"0`0Q`EK*)`!```F"$"8!`AC[\`$(^S``R/L@`(C[$` +M!(^P```#X``()[T`(%#``!H``)@AC(0``#P#__PT8___C()`!```B"$`0Q`D +MK()`!(X"```\`P`!C$)`$`!#$"100``-``"8(0P`:J(D!`#(C@4``#P#__PT +M8___C*)`!"8Q``$J)``4`$,0)*RB0`14@/_PC@(``!9@_]PT`H``C@,``#P$ +M__L`8A@AC&(`!#2$__\`1!`DK&(`!!``_]0"8!`AC(0``#0"@``\`P`$`((@ +M(8R"``0`0Q`EK((`!%#`_\H``)@AC@0``#P#__PT8___C()`$#1"(`"L@D`0 +MC@0``(R"0`0`0Q`D/`,``0!#$"6L@D`$$`#_O```F"$0P/^[`F`0(8R'```D +M`O_])`4``8SC0`PD!@`!``"((0!B&"2LXT`,C@,``(QB0!`T0B``K&)`$`P` +M,RD`````C@0``#P#__PT8___C()`!`!#$"0\`P`!`$,0):R"0`2.`@``/!(` +M`8Q"0!``4A`D5$#_G@``F"$,`&JB)`0`"HX$```\`__\-&/__XR"0`0F,0`! +M*B4!D`!#$"0`4A`EK()`!(X#``",8D`,-$(``:QB0`Q4H/_KC@(``!``_XP" +M8!`A$,#_B20"__Z,A0``/`3__(RC0`PTA/__``"((0!B&"2LHT`,C@,``(QB +M0`0`1!`DK&)`!(X"```\`P`!C$)`$`!#$"100``1``"8(0P`:J(D!``*C@0` +M`#P#__PT8___C()`!"8Q``$J)0&0`$,0)*R"0`2.`P``C&)`##1"``*L8D`, +M5*#_[(X"``".!@``/`/__#1C__^,PD`$`@`@(0``*"$`0Q`DK,)`!`P`,RD` +M`#`A$`#_70)@$"$0`/]:)!,`$8R"``"L10`,`^``"`````",@P``)`(`!*QB +M``@D`@`!K((7Y`/@``@`````)[W_\*^R``BOL```K[\`#*^Q``2,@P``)`(` +M(`"`@"&L8@`(C((;N#!"`$`00``%)!(#Z(R"'"`D`R<0.$(`!0!BD`H20``- +M``"((8X"```D!``*)C$``8Q"``@P0@`$$$``#0``$"$,`&JB``````(R$"M4 +M0/_VC@(``"0"`!:/OP`,C[(`"(^Q``2/L````^``"">]`!"N`!?D$`#_^8^_ +M``PGO?_PK[```*^_``2,@A?$%$``#`"`@"&.!```-`*``(^_``0`@B`AC((` +M2(^P```D`__?`$,0)*R"`$@#X``()[T`$`P`,%\`````$`#_\XX$``",@P`` +M-`*```!B&"&,8@!(-$(`(*QB`$@#X``(`````(R"```T`X```$,0(:Q%`$", +M@@```$,0(:Q&`$0#X``(`````"S"``4`@$@A$$``-`"@0"$\`X`"``80@"1C +M$_@`0Q`AC$(```!```@`````,*4`/S$"!``THP!`C(0```"B&`HT!H``,04( +M`#1B`(``11@+`(8@(:TH&T2L@P`\C2(;1(TC```D!P`@,$4`0`#@("$P0@"` +M`&88(1"@``,``B`*/`("`@""("4T@@`(`$4@"ZQD`0R-(AM$`.`@(3!#`$`P +M0@"`%&``#P`"(`I4@``.C2,``(TB```D!/_OC$,`-`!D&"2L0P`TC2(``"0$ +M__>,0P`T`&08)*Q#`#0#X``(`````(TC``",8@`T-$(`$*QB`#00`/_UC2(` +M`(R$&T2-)@``-`>```"%("4P@@`_,(4$`#1#`$``11@*-&(`@`#',"$PA0@` +M`$48"XS"`#R,P@$,K20;1*S#`#R-(AM$C2,``"0&`"`P10!``,`@(3!"`(`` +M9Q@A$*```P`"(`H\`@("`((@)32"``@`12`+K&0!#(TB&T00`/_(`,`@(8R% +M&T0`"!`GC(8```"B*"0PH@`_,*0$`#1#`$``1!@*-`>``#1B`(``QS`A,*0( +M``!$&`N,P@`\C,(!#!``_]ZM)1M$,*0`/S$"!`"-)0``-(,`0`""&`HT!H`` +M,00(`#1B`(``1!@+`*8H(:RC`#R-(P````@0@C!%`"`Q!`!``&88(1"```,` +MH#`A/`("`@"B,"4TP@`(`$0P"ZQF`0Q4@/^QC2,``%"@_Z.-(@``$`#_K8TC +M``",A!M$C28``#0'@``P@P`_,(4$`#1B`$``91`*,(0(`#1#`(``9!`+`,

    ]__``11`KK[\`!*^P````@$`A%$``!P"@&"&\L0`` +M)*4`$`!G$"$`11`K$$#_^P`````DT``0D@(`!S!"``$00`!+)`0`#8S'`"`D +M!/_P).,`"#!B``\D0@`G`&08)`!$*"0`91`A`$,0*Q1```<`8"`AO'$``"1C +M`!``A1`A`$,0*Q!`__L`````).(`$)!"``]`!",0P`\ +M$&``.*S"`$R.`@````(3PC!"`!\`8A`AD$(`!*#"`$:2`@`'``(00C!"``%4 +M0``/C0(;4)("``<``A#",$(``1!``"``````D,(`1#1"``&@P@!$D@(``@`" +M$4(P0@`!%$#_X20$`!J-`AM0$$``"@````"0PP!*C0(;2%!#``:M`!M,C0(; +M3"1"``$L0P`#$&``!ZT"&TR2`@`")`0`'0`"$0(P0@`!$`#_SP`"(`J0Q0!* +M#``RG`$`("$0`/_V`````)("``<``A%",$(``1!`_^``````D,(`1!``_]PT +M0@`"$`#_S0``$"&L@``(K(``#*R``!"L@``4)(0`"(R"``0D`_``,*4/_P!# +M$"0`11`E`^``"*R"``2,@@``C$(`"#!"``0#X``(``(0*R>]_Z"OO@!0K[<` +M3*^V`$BOM0!$K[0`0*^Q`#2OL``PK[\`5*^S`#ROL@`XC(,;^)2B``0`H*`A +MC&4`&(QC``"OI@`()(8<'*^C`!@`@(@AKZ4`'#!0``,``/`A``"P(:^@`!0D +MEQMH``"H(:^F`"02@`"A)`/__R0%`!,,`!WA)`8`$(Z#``2.)!W0/`4(`#!C +M"````B@*``.`"Q"0``2OI0`@KC`=T`P`-0D"("`ACZ8`"!#```2.(@``C$(1 +M0*^B`!2.(@``-`.```(@("$`0Q`AC$,`6"00``&OHP`0C$,`!#P"`B``8A@D +M#``T7:^C``P,`$E,`B`@(0(@("$,`#K_`H`H(8^D`!``0!@A`@0@"A1``'BO +MI``0CB(;^*Q0`!2.@@`$,$,W`"0"%0`08@*2+&(5`1!``H``26(QSZCB0``#0"@``P8P#P`((@(2QC`#`D`@`'K((8 +M`!!@`A\`````CB(=T!1``A@`````DB4=S!2@`A$"("`ACH4`!`P`2CL"("`A +MEB<<^"SB`$(40``P,.3__XXD``"6A0``-`*``#P#``(`@B`A-&.@`B0"";2L +M@Q@L$*(!\8^C`!B,8@`$/`-F9C1C9F>40@`D`$,`&``"%\,``!@0``,80P!B +M("..@@`$)`,4`#!"-P`00P'2-`.``(XB````0Q`AK$`93(XD```T!H``)`+] +M_P"&("&,@R(H/`7__C2E`_\`8A@DK(,B*(XC````9A@AC&(B*`!%$"0T0@@` +MK&(B*(XB```D`P`/`$80(:Q#`&`PY/__+((`0Q1```8L@@!$CB(``#0#@``` +M0Q`AK$`B5"R"`$140``.CB(``(XE```D`X`?/`3__XRB$C`TA'__`$,0)#1" +M`>"LHA(PCB,``(QB`#``1!`DK&(`,(XB```T`X```B`@(0!#$"$D`P`.K$,8 +M>`*`*"$#H#`A)`<`/PP`080D"``!$$``#B0#__^/OP!4C[X`4(^W`$R/M@!( +MC[4`1(^T`$"/LP`\C[(`.(^Q`#2/L``P`&`0(0/@``@GO0!@CZ0`'(^F`!@# +MP#@AC((`!(S%``0"("`A`H`P(0!`^`D#H$`ACH(`!#!"!``40`%Z`B`@(8^B +M`!@"("`A`H`P(0P`0".,10`$CB4=U!"@``>/HP`(CH(`!#P#``0`0Q`D%$`! +M:0````"/HP`($&``!`````".(@``CZ0`%*Q$$4"*XP`^FN,`08KB`#Z:X@!! +MBN0`/IKD`$&*Y@`^FN8`03!C_P```QH`CB4````"%@``!"("`$,0)3"$_P"6 +MXP!"`$00)0`&-@(T!X```$80)0"G*"&LH@``CZ8`##!B`/^.)`````,:`@`" +M$@".Y0!,`$,0)0#"&"4D`@`"$*(!/@"'("&/I0`@/`(0@`!E&"6/I@`D`&(0 +M):R"``2(PP!"F,,`18C"`$*8P@!%B,0`0IC$`$4`P"@AB*8`0IBF`$4P8_\` +M``,:```"%@``!"("`$,0)3"$_P``1!`E``8V`HXE````1A`ECZ8`)#00@``` +ML"@AE,,`1JRB``B.)```,&(`_P`"$@```QH"`$,0)0"0("&L@@`,CB(``(^C +M`!``4!`AK$,`6(Z"``0D`Q0`,$(W`%!#`0N.)1T`CB,``"0"__^/I0`,A0``EB(<^C!"`/`L0@`P%$``$(XE +M``".)AW0$,``#0`````T`H``.,8``0"B*"&,HQ@D)`(`#"0$``T`1B`+)`+_ +M``!B&"0`9!@EK*,8)(XE```T`X```*,8(8QB`%BN(!M,,$(`_ZXB&TB,8B(( +M,$(@`%!```.N(!M0)`(``:XB&U`T`H```*(0(8Z#``2,0AD4,&,"`!!@`+TP +M1#__/`.Z+@`$$(`T8XNC`$,`&0``$!```A$"CB0=T#00@```L!@A`((@!"0" +M``&L8A@<#`!JHB2$`&2.(@``)`,X`"02``$`4!`AC%,8"*Q#&`B.(@```%`0 +M(8Q"'"0P0@`0%$``E0````".(@``-`:``);D`"``1A`AK%,8"(XC````9A@A +MC&(88#1"``&L8AA@CB,```!F&"&,8AA@-$(``JQB&&!0@`""CB(;^(Z"``0D +M`Q(`,$(W`!!#`'PD`@`"CB4;^(RC`"P08@!X)`,``8XD``"LHP`L`(8@(8R" +M&2`T0O``K((9((XC```\!``!`&88(8QB&2``1!`EK&(9(`P`/?,"("`A``"0 +M(8XD```D`P`!`D,8!``2$(`F4@`!`$00(2Y$``JL0Q``5(#_^(XD``".(P`` +M/`(`"#1""*"N(AM`K&(`H(XE```\`P`'/`8`@(RB`*P"("`A`$,0):RB`*R. +M(AM`CB,```!&$"6N(AM`C&(`H`!&$"6L8@"@CB4``#P#(`",H@"L`$,0):RB +M`*P,`"QY`````!1``#\```````"0(8XB```T$(``)`0`"@!0$"&,0AA@,$(` +M`1!```8F4@`!#`!JH@`````N0@!D5$#_]HXB```,`#/Y`B`@(8XC```T`H`` +M/`3^?P!B&"&,8@`@-(3__P!$$"2L8@`@CB(;N#!"`$`40``?`H`H(0(@("$, +M`#/$```H(98C'/0L8@`&4$``#HXB```D`@`%4&(`")8B'/:.(@``-`.```!# +M$"$D`P!2K$,!"!``_J<``!@A+$(`"!1`__B.(@``/`,``31C`*H`4!`AK$,! +M&(XB```D`S(0`%`0(:Q#`1P0`/_NCB(```P`.KD"("`A$`#_X`(@("$,`"R[ +M`B`@(1``_\```)`ACB(;^!``_Y.L0``L#`!JHB0$`,@N0@`4$$#_:"92``&. +M(@``-`.```!#$"&,0APD,$(`$!1`__4`````$`#_8(XB```\`LS,-$+,S0"" +M`!D``!`0$`#_10`"$,("("`A#``S&"RF``$0`/[SCB,``(^B`"``8A@E$`#^ +MPSP"$((,`$KL`B`@(1``_I:/HP`(#`!!.@*`*"$0`/Z%CZ(`&(^C`!B.)0`` +M``0@(XQB``0`!"2`/`,`_(!"`"(`@R`D-`.````"$",``A&`,$(/P`"C*"$` +M1!`EK*(93!``_B..)```CZ8`&#P"9F8T0F9GC,,`!(1D`":48P`D`&08(P!B +M`!@``Q_#```0$``"$$,`0Q`C``(4`!``_@L``B0##``THB0&``$0`/WNCH4` +M!`P`2L$"("`A$`#]YY(E'@(```)@A)!(`*#P#@`(D8QUH +M`!,0P`!#$"&,1````@,8(8XB``",90``)K4``0!$$"$RHP`_)E+__R80`!@F +M206``$0`/_] +M)!X``1``__(D'@`%`(`X(8R$```T!H``)`/__`"&("&,@@#``$,0)#1"``*L +M@@#`C.0``"0#_\,`AB`AC((`P`!#$"0T0@`8K((`P(SB``",HP`$`$8P(8S" +M`,@P8R``,$3__SP")Q`48``#`((0)3P"*O@`@A`EK,(`R(RB``0P1B``,$(( +M`!!``!TT"(``C.0``"0#P```B"`AC((`%`!#$"0T0Q$P-$(/H`!F$`JL@@`4 +MC.(``(RC``0`2#`AC,(`Q#!C(``P1/__/`(%>!1@``,`@A`E/`(&!`""$"6L +MP@#$C*(`!(SE```D!`2P,$(@`"0#!2@`8B`*K*00<`/@``@``!`A)[W_\*^_ +M```,`#QF)`4``H^_```#X``()[T`$">]_^"OM@`8K[4`%*^T`!"OLP`,K[(` +M"*^P``"OOP`HD`@+J`$.@"S"C!@`D`@8`$&(`53"C +M!``V0@`!`$.0"C"B(``V0P`",*0(`!"``$P`8I`*C@(;N#!"`$!00``$K@`= +MC"0"``$V4@`0K@(=C#"B`0`D%0`#``*H"@``L"$"`"`A#``\9B0%`!,00``, +M`$"((0(@$"&/OP`]__"OL0`$K[```*^_ +M``B,BQOX)`(``0"`@"&-8P`L`*"((1!B`$`DA!MHCB(`!"0#$@`P0C<`$$,` +M!"0"``*-8P`L4&(`(XX%```"`"`A#``]O@(@*"&.(@`$,$(``11``!8D`P`8 +MC@,``#0"@```8A@AC&(88#1"``*L8AA@CB4`!#"B(``40``)`````)8"'/HP +M0@#P+$(`,!1```<``!@A,*($`!!```6/OP`(#`!)/@(`("$``!@AC[\`"(^Q +M``2/L````&`0(0/@``@GO0`0-`:``)"$`%<`IB@AC*,9(#P"__\T0@__``0C +M``!B&"0PA/```&08):RC&2".!```)`(``:UB`"P`AB`AC(,9(#P"``$`8A@E +MK(,9(!``_\L"`"`AC@(``#0#@```0Q`AC$(9(#P#``$`0Q`D5$#_NXXB``2M +M8``L```@(8X#```T`H``)(0``0!B*"&,JAP0+(<`"HRF'!2,J!P8$4```P`` +M```4P``(``880HRB&2`\`P`!`$,0):RB&2!4X/_PC@,````&&$(`"A!"`$,0 +M(0`"&<(08/^H``8APBB"``)40/^F`@`@(0`($",`0P`:4&```0```]_^"OLP`,K[(`"*^Q``2OL```K[\`$(R#````@(@A)!/__XQB``@D +M$``&``"0(31"`""L8@`(C(,``(QB"(`T0@/_K&((@#("``000``),@(``HXB +M``",0@`(,$(`!!1```0R`@`")`+_^P("@"0R`@`"$$``"C("``&.(@``C$(( +M0#!"`_\40``%,@(``20"__T"`H`D-A```3("``$00``-```P(8XD`````"@A +MC((*`"2E``$LHP`*,$(``P#","$48/_Z)(0`!!3```(D`O_^`@*`)!(```XD +M!``R#`!JHB92``$N0@`*%$#_US("``0"8!`AC[\`$(^S``R/L@`(C[$`!(^P +M```#X``()[T`(!``__<``)@A)[W_X*^S``PPH@`1)!/__Z^Q``2OL```K[\` +M$*^R``@`H(`A`("((1!``"<`I9@+```H(0P`-3@D!@`!$$``"0!`&"&/OP`0 +MC[,`#(^R``B/L0`$C[````!@$"$#X``()[T`((XB```"("`AK$``)(XB``", +M0@`D#``\'P`````00`!*)`+_[PP`:J(D!``/CB(``"0$``$V$``3C$(`#`P` +M;!\`````#`!K-@`````,`&L.``````P`:J(D!``*#`!L'P``("$,`&JB)`0` +M#XXB```D!``/,G,``XQ#``RL4$``#`!JHC(0``,``)`ACB(``"92``$"("`A +MC$)`````*"$`4Q`D$%``$B0&``$2```(``````P`:J(D!``R+D(G$%1`__.. +M(@``$`#_Q20#`!8,`#4X`````!1`__8`````CB(``*Q`0``0`/_R``````P` +M-3@`````5$``!(XB&_B.(@``C$(`P(XB&_B,0P!<)`(``U!B``..)```$`#_ +ML```&"$\`__Q-&/__XR"0!``0Q`D/`,`"`!#$"6L@D`0$`#_IP``&"$D!``/ +M#`!JH@("@"2.(@``C$(`#!``_\$`````)[W_X*^T`!"OLP`,K[(`"*^P``"O +MOP`4K[$`!)2F```\`\S,-&/,S3#0__\"`P`9C*4`!`"`D"$``*`A,*0@```` +MF"$``!@0``,8@@`#$(``0Q`A`@(0(S!"__\X0@`"$(``RBQ'``&.0AOXE$0` +M>#"B(``00`##CD(;^)1#`'HPQ?__`*00*Q1``#HD`@`.`&40*Q1``#]`"".0@``-`.```!#$"&,0R($-&,`$*Q# +M(@00`/_A`!,8@`"%`!@`!!?#```8$``#&$,`8A@C``,0@`!#$"%4@O_H)`(` +M#@`0$$`D0NZ@`$4`&"04``$``!@0$`#_OP`"%\,0X``$/`/,S"X"%3P40`!, +M)@+__C1CS,T"`P`9```8$``#&0(``Q"``$,0(0`"$(`"`A`C,$+__Q1```0\ +M`LS,+@(4`!!``#`\`LS,-$+,S0("`!D``"`0``08P@`#$(``0Q`A``(00`(" +M$",P0O__$$``%P`$&((``Q"``$,0(0("$",P0O__%$#_O20"``X\!&9F)@+M +M0#2$9F<`1``8``(7PR0%``@``"`0``0@0PP`6?X`@B`C`$"((20$``$,`%G^ +M)`4``A``_YP`0)@A/`1F9B8"[4`TA&9G`$0`&``"%\,D!0`(```@$``$((,` +M@B`C#`!9_@`$($``0(@A$`#_[R0$``(\!&9F)@+M0#2$9F<`1``8``(7PR0% +M``@``"`0``0@PP""(",,`%G^``0@@`!`B"$0`/_A)`0``S!0__\`$!"``%`0 +M(3P#__\T8T2```(00#P$4>L`0Q`A-(2%'P!$`!@``A?#)`4`"```(!``!"## +M`((@(PP`6?XDA``!`$"((1``_\T``"`A$`#_/I1#`'Z.0AOX$`#_-Y1$`'R, +MIP`$)`(5````,"$PXS<`$&(`)0``0"$L8A4!$$``)B0")``D`A(`$&(`(20" +M%`!08@`!)`8``HR#```T`H```&(8(8QB&&`P0@`"%$``%`````",A!OXC&(8 +M9``&&$",A`````(4PC!&`?^,@@`$,,0!``!B&"$0@``#A&,`C(,`````,"$0`/_:)`@``8R"&[B,@P```(`H(0`" +M$((P0@`!K&($((R"&[@P0@`$4$``"8RB&\"4@QST+&(`!E!``"2,HP``)`(` +M!5!B`!V4@ASVC*(;P(RC```\!``0``(2`C!"``>L8@8`C*,``#2$`@$``#@A +MC&(&`"2F'04T0@`(K&(&`(RB``"L1`8$C*(``*Q`!B",H@``K$<$`)#$``", +MH@``).<``2SC`("L1`0$%&#_^"3&``$#X``(`````"Q"``A40/_CC*(;P(RC +M``",8@0@-$(`0*QB!"`0`/_=C*(;P">]_\"OO@`PK[<`+*^V`"BOM0`DK[0` +M(*^R`!BOOP`TK[,`'*^Q`!2OL``0C,(`!(R#&_@PY___,$HW`"0"%0``H$@A +M`,"0(0"`J"$!`/`AKZ<``(QQ``0``*`A``"P(0``N"&OH``(KZ``#```*"$1 +M0@$VC',`("U"%0$00`$_)`(D`"0"$@`10@$V)`(4`%%"`2^5(@#VCZ(``#P$ +M@`(\`X`"``(P@``%*$`DA"TX)&,M4`"I*"$`Q"`A`,,8(3P"@`*,A```C&,` +M`)2G`-*,0BTTE*4`A*YD``2N8P`(KZ<`!*YB```F8P`,)`0`)SP"@`(D0BUH +M`,(0(8Q"```DA/__),8`&*QB```$@?_X)&,`!"9P``P"`"`A)`8``20'`2X, +M`#^F``!`(9?%```"`"`A)`8``B0'`0X,`#^F``!`(9?%``("`"`A)`8``B0' +M`0$,`#^F``!`(8Y"``0P0@0`5$``SHXB`!R.0@`$,$(0`!!``,`"P"@ACZ4` +M"`(`("$D!@`#)`]_^"OL@`(K[````"`D"$`X(`A`*`@(0#`*"&O +MLP`,K[$`!`$`F"$F$/__K[\`$`P`6?X`P(@A`$!`(3('``<:(``>`!`0P@`" +M$(``4H`A`/$@(20&``@H@@`)`,(@"B0"``$`XA@$`((0!"1C__\D0O__C@4` +M``!#$"8`$QC``&(0!`#H(`0`9"`$``(8)P""("0`HR@D`B<0(0#',",`I"@E +M)%'_^*X%````R$`&```X(1X@_^8F$``$C[\`$(^S``R/L@`(C[$`!(^P```# +MX``()[T`("3&__\GO?_PK[\```"@4"$PR``'``!@(0`&$,(`H$@A&*``'``` +M6"$``A"``$0P(0$)*"$HHP`))`(`"`!#*`HD`@`!`0(@!`"B$`0DA/__C,,` +M`"1"__\`1!`F``<@P`""$`0`8A@D`(,8!@$H$"$!`Q@&`6,8!`"H*",D2?_X +M`8-@)0%E6"$``$`A'2#_Z"3&``0!@"`A#`!9_@%`*"&/OP```^``"">]`!`G +MO?_P)`0`X*^_``2OL```#`![N@"@@"&N`@`@C[\`!(^P`````A@K`&`0(0/@ +M``@GO0`0)[W_\*^P``"OOP`$C*(`(`"@@"$40``%`$`@(8^_``2/L````^`` +M"">]`!`,`'O-`````!``__FN```@)[W_T*^W`!ROM@`8K[0`$*^S``ROL@`( +MK[$`!*^_`"2OO@`@K[4`%*^P``",@QOXC,(`!`"`B"&,9````,"X(0`"&P(P +M1C<```(2`C!4``$D`A4``*"0(92>```P"/OP`DC[X`((^W`!R/M@`8C[4`%(^T +M`!"/LP`,C[(`"(^Q``2/L````^``"">]`#`T`X```$,0(:Q`&>`0`/_QC[\` +M)!5`_^0KPE`!$`#_UHXF```0`/\4)!8``A``_Q(D%@`!$,(``R0")0!4PO\/ +MCB4``!``_PP``+`AC*8`!(R''=``@$@A,,8!`)2D```\`F0`/`/(``!F$`L` +MXA`&`$0`&U"```$```'-)`@`'P``4!(!"A`&,$(``51```6-)@``)0C__U4` +M__L!"A`&C28``"0"`"8`2$`C-`>``"0#`!<`QS`A`&@8(R0"``&,Q1@4`&(0 +M!"0#`!@`:!@C`4(0(3P$``$`8A`&-(3__P"D*"0``A1``*(H):S%&!2-)@`` +M)0/_\#P%__X`QS`AC,(8%#P$``$``QM`-*4?_S2$X```11`D`&08)`!#$"6L +MPA@4`^``"``````\`H`")[W_P"1"%10#H!@A)$0`0(Q%``",1@`$C$<`"(Q( +M``RL90``K&8`!*QG``BL:``,)$(`$!1$__8D8P`0`^``"">]`$`GO?\0K[X` +MX">^`!``!SP`K[<`W*^V`-BOL@#(K[$`Q`"@D"$`@(@A```H(0/`("$`P+@A +M)[8`D"0&`("OJ`"TK[\`Y*^T`-"OL`#`K[4`U``'A`,,`'(-K[,`S`+`("$` +M`"@A#`!R#20&`"".0@`$CB,;^```0"$P0B``C'0``!!``/ROH`"XAB(;Q)8C +M&\0"`"`A`%`0*E1```$`8"`A``04```"A`,J`@!`%$```@(`."$D!P`_``<4 +M```"A`,J`@`_4$``!)8C&\@6```()[4`LI8C&\@\`H`")$(R;``#&$``8A@A +MA&@``">U`+*OM0``CH8`#">S`+`"`$@A`B`@(0+`*"$"0#@A`H!0(0P`1=(" +M8%@A/`*``HQ"4YQ80``$CB(;^`P`07("P"`ACB(;^`)@,"$"H#@AC$(`&`+@ +M2"$"("`AC$(`"">E`!``0/@)`D!`(98C'/J7H@"N,&,`\"1"``0L8P`P%&`` +MOZ>B`*Z7HP"R)`(`/P/`("$`0Q`C,$7__P``,"&4@P"`),8``2C'`!``HQ@A +M,&+__RQ"`$`40``#I(,`@"0"`#^D@@"`%.#_]22$``*.(AOXC$,``*1%`"2, +M8@`$E$(`*"Q"``(00``G/`*``I8B'/@L0@!"$$``!X^B`+2.0@`$)`,4`#!" +M-P!00P!\ED,``(^B`+040``%-`6A@(^B`+@00``8/`*``C0%H8```#`A``80 +M@">C`!``0Q`AE$,``)1"``*.)`````,:```"$@`T0@#_-&,`_P`"%``P8___ +M),8``0!#."4`A2`A)*(`!"C#`""LAP``%&#_[3!%__\\`H`"C$)3G"A"``(0 +M0`!7`````)>C`):7I`"4EZ(`DC!C`#\PA``_``0D```#'@`P0@`_`&08)0`" +M$@``8A@EEZ(`D)>D`)R.)0``,$(`/P!B."67HP">EZ(`FC"$`#\P8P`_``0D +M```#'@`P0@`_`&08)0`"$@``8A@EEZ(`F#0&@```IB@A,$(`/ZRG&327I`"B +M`&(X)9>C`*27H@"N,(0`/S!C`#\`!"0```,>`#!"`#\`9!@E``(2`(XE```` +M8A@EEZ(`H`"F*"&LIQDX,$(`/P!B."67I`"JEZ,`K)>B`*B.)0``,&,`/S"$ +M`#\`!"0```,>`#!"`#\`IB@A`&08)0`"$@"LIR(T`&(8)9>B`*:.)0``C[\` +MY#!"`#\`8C@E`*8H(:RG(CB.(P``C[X`X(^W`-R/M@#8C[4`U(^T`-"/LP#, +MC[(`R(^Q`,2/L`#````0(0!F&"$D!``_K&09/`/@``@GO0#P#`!!D`)`0 +M`/^HEZ,`EB0"";008@`0/`-F9HZ"``0T8V9GE$(`)`!#`!@``A?#```8$``# +M&$,`8C@C`L`H(0(@("$,`$]_^`` +M!SP`)(4;<``'/`,#H#`AK[\`$`P`080``$`AC[\`$`/@``@GO0`@,(3__S"E +M__\PQO__``<\```(1```Q$@C`(50(P#%&",`!Q0#$,4`#``()`,!(@`84&`` +M`0```]_]"OMP`<,)?__P`'/``NX@`" +MK[8`&*^U`!2OM``0K[,`#*^R``BOL0`$K[\`(*^P````H(@A`,"P(0$`J"$` +M!Z0#``"8(202``$40``T```8(0``@"$`$A!``%$0(91"````4!`K$$``"@`3 +M$$`FXO__`D(0*A!```8`$Q!`)F(``29#``$P4___,'+__P`3$$``$AA``%8@ +M(0!V0"$`41`A`'$8(91F``"$AP``E$4``(4(```,`$*T`@`@(0`")```!"0# +M`!`80`!U&"$`E"`J%(``#*1B```N`@!`$$``"B8"``$"`!`A)@,``3!P__\` +M`A!``%40(2X#`$`48/_YI%0``"8"``$P4/__+@(`0!1`_]$`$A!`)`,``8^_ +M`""/MP`]^]"OO@0@K[\$)*^W!!ROM@08K[4$%*^T +M!!"OLP0,K[($"*^Q!`2OL`0`C0(`!(R#&_BOI`/(,$0W`"0"%0"OJ`/8KZ4# +MS*^F`]"OIP/4`2#P(8QC```0@@'&KZ`#W"R"%0$00`'()`(D`"0"$@`0@@'# +M)`(4`%""`;\D8P`LCZ0#U(^E`]"/I@/B`[@` +M`QQ```0D0)3%``8`!"0#``,<`Z^D`^"OHP/D``"H(0``B"$GI`.X`B40!S!" +M``$80``%+J,``A!@`.$FM0`!I)$``"2$``(F,0`!+B(`!!1`__8")1`'CZ@# +MW(^G`]B5!@`$A.0``(T%```GIP/`#`!"S">H`\2/M@/`CZ(#Q`!6$"L40`"` +M`!80@`!6$"$``A"``%80(0`"$("OH@/LKZ`#\(^C`]R/I`/LC&(`")>C`[H` +M1*@A-`+>K1!B`4*7L0.X)[(A0`(F(4`"XB&``R8 +MA@`/J&<``+AG``.H:``$N&@`!ZAE``BX90`+J&8`#+AF``\DA``0%(+_[B1C +M`!"7L0.Z`N`@(0`1@(`"$8`A`!"`@`(5@"&6%``&)@4`""80`!``%(A`#`!R +M``(@,"$"`"@A`B`P(0P`<@`"8"`AAJ<``@*`("$"X"@A`F`P(0P`0O0"0$`A +M$$``D`[@`@!`AB00``)D$``.) +M!0`$F04`!XD&``B9!@`+B0<`#)D'``^H9```N&0``ZAE``2X90`'J&8`"+AF +M``NH9P`,N&<`#R4(`!`5`O_N)&,`$(^H`_"/HP/LCZ(#Q";6``$E"`"`)&,` +M5`!6$"NOJ`/P$$#_B*^C`^R/IP/G`[H`1!`A +M``480`!D&"&45```-`+>K0"FJ",0X@"!E',`````B"$#H)`A`!6!@(^H`]@" +M$8`A`!"`0`(=@"&&1P$XE00``(8(`3@"@"@A#`!"M`)@,"&/HP/8AD<".(8( +M`CB49````H`H(:9"``@"8#`A#`!"M"8Q``$N(P!`ID(`B!1@_^DF4@`")`(` +M`A1``$6'HP$&CZ<#X`!G$"H40``$CZ@#Y`!H$"H00``ICZ4#S(^E`\P,`$-( +M)Z0`"`!`2"$``A_"EZ(`AI>E`[B/I@/0``(4```")\*/IP/4``(4`P$C&"$` +M1!`A``(00P`#&$.GQ0`"IZ(``*?%``"DPP``I.(``(^H`]2/HP/(E0(``(QD +M&_@D`P`_`&(8(Z2#`"2/OP0DC[X$((^W!!R/M@08C[4$%(^T!!"/LP0,C[($ +M"(^Q!`2/L`0``^``"">]!#`,`$-()Z0`B`!`2"$``A_"EZ(!!I>E`[H!(Q@A +M``(4```")\(``A0#`$00(0`"$$.GQ0`"CZ0#T*>B``"GQ0``CZ4#U``#&$.D +M@P``$`#_V:2B``"/I@/,)Z0`"">E`(@,`$.4)Z<``@!`2"&7HP`"``(GPI>B +M`(8``QP```,OP@`"%````C?"``,<`P`"%`.7J`.XEZ<#N@!E&"$`1A`ACZ4# +MT(^F`]0!)"`A``0@0P`#&$,``A!#I*0``*>C``"DP@``I\<``A``_[JGR``` +M``"((0.@@"$`%1&``%$0(0`"$$``71`AA$@!.(^B`]B&!P$X`H`H(91$```" +M8#`A#`!"M"8Q``$N(P!`I@(`"!1@__$F$``"CZ4#S`P`0T@GI``(`$!((0`" +M'\*7H@"&EZ4#N(^F`]0``A0```(GP@`"%`,`1!`ACZ0#T`$C&"$``A!#``,8 +M0Z2#``"GH@``I,(``*?%``(0`/^2I\4``(T"``"-!0`$C08`"(T'``RL8@`` +MK&4`!*QF``BL9P`,)0@`$!4$__8D8P`0$`#_-8^H`_",AP``C(@`!(R"``B, +MA@`,K&<``*QH``2L8@`(K&8`#"2$`!`4A?_V)&,`$!``_O:7L0.Z)[,!"`)@ +M("$`$8"``A&`(0`0@(`"%8`AEA0`!B8%``@GL@$@`!2(0`(@,"$,`'(`)A`` +M$`(`*"$"(#`A#`!R``)`("&&IP`")[`#.`*`("$"8"@A`D`P(0P`0O0"`$`A +M$$#_98^E`_`"`$`A`+T0(21#`3@P8@`#$$``%R>D`[@`@!`AB08``)D&``.) +M!P`$F0<`!XD$``B9!``+B04`#)D%``^H9@``N&8``ZAG``2X9P`'J&0`"+AD +M``NH90`,N&4`#R4(`!`5`O_N)&,`$!``_O*/J`/PC08``(T'``2-`@`(C04` +M#*QF``"L9P`$K&(`"*QE``PE"``0%03_]B1C`!`0`/[ECZ@#\"1C`"P0`/Y! +MKZ,#W!``__TD8P`@$((``R0")0`4@OX\CZ0#U!``__B +M``:4H@`*`2(8*@$C$`L``A0```),`Y>B``:/IP`@`2(8*@$C$`L``A0```(4 +M`P`'($``1"`C``0D```$3`.OH@`T!2``L`$@$"&/HP`D``(4```"3`,!(Q`J +M5$```0$@&"&6I!O*``,4`!"```,``DP#``040``"3`.7H@`$EZ,``I>D```! +M(B@J`2,P*@$D."H!)1`+`288"P$G(`NF`@`*I@,`#*8$``ZF"0`(I@D`!J8) +M``2F"0`"I@D``)9"```L0D``5$``#*8)`!XSPQ``$&``BHY"``240@`.`2(0 +M*E1```0!(!`A$&``@HY"``240@`.I@(`'I8"``Z/IP`HCJ0;^*3B``"6`P`` +M``,4```"%`.NH@6]`'"6YP!R`J`@(2;F`'0"@"@A#`!' +MYR>H`!"/I``PCZ<`+`"3&",`XQ`J`.(8"Y>B`!8``QP```-,`P$B&"H`0%`A +M`2,0"X^C`#0`8A`J$$``"(^G`"`!*A`J`2`@(0%"(`H`!!0```(4`Z^B`#2/ +MIP`@`2H0*@%"2`H`!Q!``2(0(P`"%````DP#!2``.`$@$"&/HP`D``(4```" +M3`,!(Q`J$$```@!@,"$!(#`AEZ4`$)>C`!27I``2``84```"3`,!)1`J`2(H +M"P$J,"H!(S@J`21`*@$@$"$!1A`*`2<8"P$H(`NF`@`0I@,`%*8$`!BF!0`< +MI@,`$J8$`!:F!0`:EJ(;RA!```R/I``H``(00*8"`!"F`@`6I@(`%*8"`!*6 +MHAO*``(00*8"`!BF`@`40@`,$`#_4```$"$0`/\A)N8``C)C`/@TOI``LCD4`$):$```,`$>I`*8H(0!`,"$`0"`A +M`L(H*S)C`/@D`@#@5&+^VP#`L"%4H``!`L`@(1``_M`PEO__C((;^`"@8"$G +MO?_@C$(``"0%``B,0@`$@$X`(HF"``"9@@`#B8,`!)F#``>)A``(F80`"XF( +M``R9B``/JZ(``+NB``.KHP`$NZ,`!ZND``B[I``+JZ@`#+NH``^)@@`0F8(` +M$XF#`!29@P`7B80`&)F$`!N)B``KI``8 +MNZ0`&ZNH`!R[J``?``580`%]&"&48@````!((0``:"$`3A`CI&(```%]0"&% +M`@``!$(``:4````D`@`($2(`.0`)$$``3!`AE$,``(4*```E(@`!,$G__Q%# +M`">5!```+2(`$%1`__$!?4`A`7T@(82"```H0@!`%$``!`%L$"$D`@`_I((` +M``%L$"&40@``A(0``"2E``$`1Q`C*$,````#$`L``A!``$80(91#````!"!` +M,*7__P"&("$LH@`/%$#_TJ2#```D!0`(``480`!]$"&41```)*(``3!%__\` +M;!@A+*(`#Q1`__BD9````^``"">]`"`10``%)((``2VB`#,40``")(+__R2" +M``&E`@``):(``3!-__\0`/_0``!((1``_\XD"0`/)[W_P*^S`"ROL@`HK[$` +M)#"2__^OOP`PK[``(`"@B"$D$P`_```@(0`$$,``41`AE$,````$$$`DA@`! +M$&``!0!=*"$PQ/__+((`"!1`__:DHP```("`(2>G`!`"0"`A)Z@`$@.@*"$, +M`$B(`@`P(1(```L``"`AEZ4`$``$$$``71`AE$(``!!%``4D@P`!,&3__P"0 +M$"L40/_Y``000)>C`!"7H@`2$&(`#P`$$,``41`AC$(`!!!```,`!!#``%$0 +M(913``("8!`AC[\`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`0!1R__$````` +M$`#_]`!1$"$GO?_`K[``(##P__^OM@`XK[4`-*^T`#"OLP`LK[(`*`"@F"&O +MOP`\K[$`)`#`D"$!`*@A``"@(0``L"$2```-```H(0`%$(``11`A``(00`!2 +M$"&41``()*,``0`%$$`P9?__`%T0(0"P&"L48/_UI$0``)9D```#H"@A)Z<` +M$">H`!(,`$B(`@`P(1(```X``"@AEZ<`$)>F`!(`!1!``%T0(91#```DI``! +M`&<0)A!F`#<`HJ`*,(7__P"P$"L40/_W``400``4@(``%HB``A2`(0(VB"$` +M$(!``!&(0`(RB"$"$H`AE@<`!I8H``:69```EZ4`$)>F`!(,`$A-``!((::B +M``:6!P`$EB@`!)9D``"7I0`0EZ8`$@P`2$T``$@AIJ(`!)8'``*6*``"EF0` +M`)>E`!"7I@`2#`!(30``2"&FH@`"E@<``)8H``"69```EZ4`$)>F`!(,`$A- +M``!((::B``"/OP`\C[8`.(^U`#2/M``PC[,`+(^R`"B/L0`DC[``(`/@``@G +MO0!`$`#_S0"@L"$PY___,0C__W#H$`(PBO__,*7__S#&__\D!`!D$$``'@`` +M&"$D`@`!$,4`*0!)(`L!11@C``,00`!#$"$``A#``$,0(0`"$(``Q1@C`$,` +M&E!@``$```'-```0$@`"%````AP#!&``&BAB`&540``,)`(`9%$@``)2"'/HDR``(,$(`\"Q"`#`40``/)&<`"(S$``0D`@!5K*(` +M$"0"``&LH@`8``00P`!$$"$``A"`)`,`%`!($"&LHP`,K*(`'`/@``BLI``` +MC&0`!"0"`".LH@`0)`(``:RB`!@`!!#``$00(0`"$(`D`P`4K*,`#!``__(` +M1Q`A)[W_\*^P``"OOP`$E((<^@"@@"$P0@#P+$(`,!1``"$D!0`'#`!*]P`` +M````0"`A)`8`)```."$,`#_<)`4``20#``$D!P!K```P(1!#`!`D!`!KC@4` +M!```0"$`Y1`K$$``!@"F&"L48``#`(4H*Q"@``./OP`$)`@``8^_``2/L``` +M`0`0(0/@``@GO0`0)`(`-R0'`%,D!`!3$`#_[:X"`!`,`$KW``````!`("$D +M!@`E```X(0P`/]PD!0`&.$0`/R0&`$``!#`*),,`-R3%`",`9"@+)`,`%``$ +M&`LD0@`$)`<`,@!$.`NN`P`,K@4`$!``_]:4``%$,``11`AC,0`!(S(`!```A"``.(0(21"``@`B!@K%&``'JS" +M`!P0H``:)`/__ZS$``B,PP``/`*``XQ$FE`D9___``<8P(S"`!P`9Q@A``,8 +M@`!D&"&LQP``C$4`$(QB`!B,Q``()&,`"`!%$",``A!``((@(P"($"NLPP`< +M%$```ZS$``A4X/_KC,,``"0#``$#X``(`&`0(8S)``P!)!`K%$#_^P``&"&, +MX@``)$+__Q"B__">]__"OL0`$K*``%`"@B"$D +M!0`'K[\`#*^R``BOL```#`!*]P"`@"$`0"`A)`4``20&`"0,`#_<```X(0!` +MD"$D`@`!4D(`!XXB`!R/OP`,C[(`"(^Q``2/L````^``"">]`!`"`"`A)`4` +M!PP`2O>$4````$`@(20%``0D!@`@#``_W```."$2$@`.`$`8(5(`_^ZN(``4 +M)`(``A("``<``Q!`)`(``Q8"_^F/OP`,``,00!``_^6N(@`4$`#__21"__L0 +M`/_AKB(`%">]_^"OM0`4,+4!`*^S``ROOP`8K[0`$*^R``BOL0`$K[```!*@ +M`'H`@)@AC)`<"(X"```80``B``"@(281`#"2)@`'DF0=S)(J``0`!A#``$80 +M(P`"$(``4!`AC$,`+#P"@`(D0E.@``,8@`!B&"&,8@``EF@=T@`$2$`T`X<` +M`21((0`*4(`"`"`A)`4`#@``."$`0/@)`4.0(0!`,"&.`P``CF(``":4``$" +M@Q@J`%(0(:Q&```48/_A)C$`'!:@``J/OP`8CG`<$(X"```80``&``"@(8X# +M`"PD`@`"$&(`"B81`#"/OP`8C[4`%(^T`!"/LP`,C[(`"(^Q``2/L````^`` +M"">]`""2)@`'DF0=S)(J``0`!A#``$80(P`"$(``4!`AC$,`+#P"@`(D55.@ +M``,8@`!U&"&,8@``EF@=T@`$2$`T`X<``21((0`*4(`"`"`A)`4`#@``."$` +M0/@)`4.0(0!`,"&.8@```@`@(20%``X`4A`AK$8``)(C``4D!P`!)I0``0`# +M$(`48``+`D*0(8X"```"@A`J$$#_T28Q`!R.(__\)`(``E!B_]>2)@`'$`#_ +MS(^_`!B2)@`'DF,=S)9H'=(`!A#``$80(P`"$(``4!`AC$(`+``#2$```A"` +M`%40(8Q"````0/@)`2-((0!`,"&.8@```%(0(:Q&```0`/_DC@(``!``_X>, +MD!P8C(<``#0"@`",B1W0`.(X(8SF`!PY*``!)`,`"20"`!,PQC^``&@0"SP% +M`!L\`P`V`&@H"P!&$"4`11`E/`,?@`!#$"6LX@`]`!`,`"E6/`6``!``__@``!`A$&#_[R1"__\0`/_Y +M`B`@(8S"`!2,QP`0)`,``0!#$`0`@$@A`,!`(0#C&`2,Q@`,)$+__SP$``\T +MA/P`)&/__P`"$H``1!`DC2<``#!C`_\`8A@E``8U`#P"#_``PC`D``4H@`!F +M&"4`Y3@AK.,00(TD``"-`P`@/`(`#S1"__\`8C@D$&```P"%("$\`@`0`.(X +M)8T"``2LAQ#`,$8`(#!"``000``&/`0`((TB````11`AC$,1``!D&"6L0Q$` +M$,``!@````"-(P```&48(8QB$0`T0@(`K&(1``/@``@`````)[W_\*^_``2O +ML```C(@;^(RP``B,HP`$C0<`""0"``$"`D@$`.DX)3!J``(P8P`!`*`P(:T' +M``@08``$`@`H(8T"``P`21`EK0(`#!%```0`````C0(`$`!)$"6M`@`0#`!/ +MH``````"`!`AC[\`!(^P```#X``()[T`$(R$&_@D`@`!`*(0!(R&``B,AP`, +MC(,`$``"$"<`PC`D`&(8)`#B."2L@P`0K(8`"`/@``BLAP`,C((````%*(`D +MI0@``$40(:Q&```#X``(`````(R#```D`@`!`*(0!*QB"$`#X``(`````(R" +M&_B,0P`()`(``0"B,`0`9A@D``4H@"2E"@`08``*```0(8R$````A1`AC$(` +M`#!"``,40``$`````(R""$``1A`D``(0*P/@``@`````)[W_\``&$$"OL@`( +MK[$`!*^P``"OOP`,`$80(0"`B"$``A#`C(0```!&$"$D`P`!`*,8!`"@D"$` +M`H"`K(,(@`(@("$,`$NL`D`H(280__\00``')`0`"@8"``:.(@``#`!JH@`` +M```0`/_V`B`@(8XB``"/OP`,C[(`"(^Q``2/L```K$`(@`/@``@GO0`0$*`` +M%0"@."&0H@`.``(1`C!"``$00``1C.(`"#P#W_\`!B`K-&/__P!#$"0`!"=` +M`$00):SB``B,YP`@4.``!XSB``B0X@`.``(1`C!"``%40/_RC.(`"(SB``@\ +M`]__``8@*S1C__\`0Q`D``0O0#P#_W\`11`E-&/__P!#$"0`!"7``$00)0/@ +M``BLX@`(``@0P`!($",GO?_```(0@*^^`#"OMP`LK[4`)*^T`""OLP`] +M`$`,`"F&/`6``!)@`!HD`__P)G0`"#*"``\D0@`G`$,H)`*#&"0`91`A`$,0 +M*Q1```<`8"`AO'$``"1C`!``A1`A`$,0*Q!`__L``````@`@(0)@*"$,`$^< +M)`8``:^B``B.@@``CH,`"``"C8(P=7__,C$``0(`("$,`"E6/`6``(Y#```\ +M`H!`CD4`#`!B&"2.1``(CZ(`"``%+0(PEG__``,8*Q1```LPI0`?4&``"@/` +M*"%6(`!*C\(`3(^C``0"MA`A`%<0(P!B$"L00``0`M<0(P/`*"$"`"`A#`!+ +MY"0&``&/HP`,$&#_N(^B``!00/^WCZ(`#(Q%`#`"`"`A#`!+Y```,"$0`/^Q +MCZ(`#`(`("$\!8``#``IA@*BJ"$28``<)F4`"#"B``^.A``()`/_\"1"`"<` +MHR@D`$,P)"0"@```@B`D,J-__P"F$"$`@R`E`$40*ZZ$``@40``'`*`8(;RQ +M```DI0`0`&80(0!%$"L00/_[``````)@*"$"`"`A#`!/G"0&``$L0@`!KZ(` +M#`(`("$,`"E6/`6``(^B``P00/_,`\`H(8Y$``".10`(/`+_OS1"__\\`W__ +M`((@)#1C__\D`H```(,@)`"B*"2N10`($`#_OJY$``"2`QW,E@@=THQ$`#P` +M`TA``2-((0"%$"&01@`$)`4`#@`&$,``1A`C``(0@`!$$"&,0P`L/`*``B1" +M4Z```QB``&(8(8QB````0/@))`<``1``_Z(`0+@A)[W_P*^T`""OL@`8K[$` +M%*^P`!"OOP`TK[X`,*^W`"ROM@`HK[4`)*^S`!R,@ALT`("0(8R^`"@`H(`A +M`,"@(22Q``B,LP!0C*0`3!1``!&OH```4F``!9/#``".8@`$%$``#`````"3 +MPP``,&(`#!1```N(@`,D\(`%HXC```\!/[_ +M,$(`#RQ"``$TA/__`&08)``"%@``8A@E$`#^SZXC```D`@!`$&+^L20#``,2 +M8/ZO)`)__X9C`1108OZL)`,``U3@_JHD`P`#CB(``#!"#_\H0@$!%$#^I20# +M``*.`@!8C$(`)"Q"``)00/ZACB0`!!``_IZ.0QO4,$(`0!!`_FPD`G__%H+^ +M:@````"60AOTK@(`.!``_F4`0*`A#`!3DHY$&W0``A"``%(0(1``_BN,51P$ +M)[W_T*^R``@`H)`A)*4`"#"B``^OM0`4K[,`#*^Q``2OL```K[\`(*^W`!RO +MM@`8K[0`$"0#__`D0@`GCE0`,`"C*"0`0S`D`*80(0!%$"L`@*@A)E``&":3 +M``B.E@!0CI<`*"21!(`40``'`*`8(;RQ```DI0`0`&80(0!%$"L00/_[```` +M``*@("$"0"@A#`!/G"0&``$00`!F)`,`#9("``..8P`,,$(``1!``*DP:0`? +M)`(``:Y"`$"6`@`&``(00C!"#_^F0@!&E@(``*9"`$22`@`"D@,``Z))`$HP +M0@`/``,9`@!#$"&F0@!(DF(`!#!"``$00`"2`````!+```4D"@`>@L(`NA1` +M``(`0%`A)`H`'I("``,P0@`!$$``:RE"_^P40``.CB,!""0"`2<08@!D``,0 +MP`!#$"$`"B'`/`-F9@!$$"$T8V9G`$,`&``"%\,``!@0``,8@P!B&".2`@`" +M,$(`#Q1```6N(P$(D@(``P`"$0(00``6`````(XD`'B.)0!\CF(``"2E``$` +M`A6"+*,``0"#("$P0@`!KB0`>*XE`'P40`!!```P(9("``(P0@`/$$``.``& +M&(```AB``'$8(8QB`,`D0@`!K&(`P)("``4``A'"$$``!`````".(@!<)$(` +M`:XB`%R2`@`#``(0PC!"``$40``,```8(8ZB&T0P0@`!$$``"8^_`""2X@`$ +M,$(``11```:/MP```!#$"4` +MB2`AK(((P(T#``",Y0`<`&D8(8QB"<`T1`$!-$(``0"%$`NL8@G`C.0`)%"` +M``J-!```C0(``#P#`/\T8___`(,8)#P$`0``9!@E`$D0(:Q#"0"-!```C.,` +M(#P"``\T0O__`(D@(1!@``,`8B@D/`(`$`"B*"6LA1#`C.(`(%!```N,Y0`$ +MC.(`!#!"`!!00``'C.4`!(T#````:1@AC&()P#1"`@"L8@G`C.4`!#"B``00 +M0``(,*(`((T"```\!``@`$D0(8Q#$0``9!@EK$,1`#"B`"`00``')`(``HT# +M````:1@AC&(1`#1"`@"L8A$`)`(``E%"`%>-`P``)`(``U%"`$B-`P``)`(` +M!%%"`#^-`P``,*(`"%!``!2-!```C.(`*%!``!&-!```C0,````+$$`D0@!0 +MK&(+`(SC`"B-`@``K$,+!(T#``"-`AL`K&(+"(T#````:1@AC&()P#1"$`"L +M8@G`C00``(T%&_@D!OP`C((`I(RC``P\!_P``$80)#!C`_\`0Q`EK((`I(T$ +M``",HP`,-.?__XR"`*@P8P/_`$80)`!#$"6L@@"HC00``(RC``R,@@"L,&,# +M_P!&$"0`0Q`EK((`K(T&``",H@`0/`0#_XS#`*0``A0``$00)`!G&"0`8A@E +MK,,`I(T#````:1@AC&(1`#1"`0"L8A$``^``"```````:1@AC&()P#1"`""L +M8@G`$`#_OC"B``@\!``$`&D8(8QB"<`T0@!BK&()P(T#````:1@AC&(1``!$ +M$"6L8A$`$`#_KR0"``0\!``E`&D8(8QB"<`T0@"BK&()P(T#````:1@AC&(1 +M``!$$"6L8A$`$`#_H"0"``,\!0`($`#_2S2E(*HGO?_PK[$`!*^P``"OOP`( +MC*(`A"0&``0`H(`A%$``!@"`B"&/OP`(C[$`!(^P```#X``()[T`$`P`2\", +MI0!LC@4`;`P`2Y$"("`A#`![S8X$`(00`/_SK@``A">]_^"OLP`,K[(`"*^Q +M``2OOP`0K[````"`F"$`P(@A$,``*222'!R.4`"$$@``+0`````F!``(```H +M(0P`<@TD!@`8E@(`#HX$`"B.)0`$CB8`##!"#_\,`'(``((@(98"``Z.)``, +ME@,`#C!"#_\`1!`A)`3P`#!"#_\`9!@D`&(8):8#``Z.,0``%B#_[0````"6 +M`@`.E@,`"JX2`$PP0@__)$(`!`!D&"0P0@__`&(8):8#``H"8"`A`@`H(0P` +M6@L``#`AC[\`$(^S``R/L@`(C[$`!(^P```#X``()[T`(`P`>[HD!`#<`$"` +M(0!`("$``"@A#`!R#20&`%PF`@!]_["OL``P`("`(:^S`#ROL0`TK[\`0*^R`#@#H"`A```H(281'!P` +MP)@A)`8`+`P`<@V.,@"$CB(`!(X&&_@``AA``&(8(3P"@`(D0C58``,8@`!B +M&"&,9``$C&4`"(QC```DA``!)`(`!:^B``BOI0`4KZ0`$*^C``R,PP`()`(` +M`B0&``0P8P`@`@`@(20%``448``=KZ(```P`4L(R" +M&_@0`/^IE$D`>HR"&_@0`/^FE$D`?(R"&_@0`/^CE$D`?HR"&_@0`/^@C$D` +M@(R"&_@0`/^=C$D`A(R"&_@0`/^:C$D`B(R"&_@0`/^7C$D`C(R"&_@0`/^4 +MC$D`D(R"&_@0`/^1C$D`E(R"&_@0`/^.C$D`F(R"&_@0`/^+C$D`G(R"&_@0 +M`/^(C$D`H``%$,``11`A``(0P`!%$",GO?_@``(0@*^S``ROL@`(K[$`!*^P +M``"OOP`0`(*`(8X"``@`@)`A`."8(1!```@F$0`(C[\`$(^S``R/L@`(C[$` +M!(^P```#X``()[T`(`(@("$``"@A#`!R#20&`1PF1!P<$(#_\R0"``:,@P`$ +M$&+_\"0"``&N`@`()@,`/"0%``,D`@`!)*7__ZQB```$H?_])&,`"`)@."$F +M(@`$)F,`((SE``",Y@`$C.@`"(SI``RL10``K$8`!*Q(``BL20`,).<`$!3C +M__8D0@`0C.,``(SE``2,Y@`(K$,``*Q%``2L1@`(KB0`6`P`5,T"("`A`B`@ +M(0P`4_D``"@A#`!S%R8D`%P0`/_+C[\`$``%$,``11`A``(0P`!%$",``A"` +M`((@(2>]__`D`@`&K[\``!#"``XDA0`(+,(`!Q!```)!P`(F0<`"XD)``R9"0`/J(,` +M`+B#``.HA@`$N(8`!ZB'``BXAP`+J(D`#+B)``\E"``0%0+_[B2$`!"!`@`` +MH((```"@("$,`%/Y)`4``1``_]N/OP``C0(``(T&``2-!P`(C0D`#*R"``"L +MA@`$K(<`"*R)``PE"``0%0/_]B2$`!`0`/_M```````%$,``11`A``(0P`!% +M$",GO?_P``(0@*^P````@H`AK[(`"*^Q``2OOP`,)A$`"(XB`'@`@)`A/`6` +M`CP$@`(DA!8X)*46#!1```XD!@$'#`!S'B8$`&0"("`A```H(0P`<@TD!@$< +MK@``"(^_``R/L@`(C[$`!(^P```#X``()[T`$`P`<=<`````)@4`9`P`$.0" +M0"`A$`#_[0`````GO?_PK[(`"*^Q``2OL```K[\`#`"`D"$``(@A))``"(X" +M```"("@A)A`!'"8Q``$40``*`D`@(2HB``140/_YC@(``(^_``R/L@`(C[$` +M!(^P```#X``()[T`$`P`4H0`````$`#_]2HB``0GO?_PK[``````*"$D!@`X +MK[\`!`P`<@T`@(`A#`!S%P(`("&/OP`$C[``````$"$#X``()[T`$`/@``B, +M@@`4)[W_\*^Q``2OL```K[\`"`P`]__"OL0`$`("((:^R``BOL```K[\`#`#`@"$,`'(8 +M`*"0(8XB`"A00``5K@``((X"`"2N$``@K@(``(XB`!A40``*K%(`(*XR`!0, +M`'(=KC``&(^_``R/L@`(C[$`!(^P```#X``()[T`$(Y#`"2.(@`8K$,``!`` +M__0`````K@```!``_^Z.(@`8,,;__P`&$,``1A`C``(0@`!$$"&40P`P/`L0 +M8C$(__\Q*?__)`(7<``%4,`U:TW3.08``0`)2$`D!0`$)`<`$`!#&`H1```) +M)`0`%"0"`%`D!0`()`0`*`!&(`L`YB@+)`(`0"0'`"``1C@+<&48`@#D("$` +M:P`9```8$``#&8(!0Q`A)$(`%0!#`!M08``!```!S0``$!(``````````'!% +M&`(`9!`A`$D0(0/@``@P0O__,,;__P`&$,``1A`C``(0@`!$$"&41``P)`,7 +M<#P"$&(`A!@+``,8P#1"3=,`8@`9``40P```&!```QF"`$,0(21"`!4`0P`; +M4&```0```OI```$,``!#"E`/^/ +MI@`$`,`H(3"E`/^OI0`$%.#_YP*P$"&2H@``%$``,P``H"$:P``2``"`(0`0 +M$,``4!`C``(0@`!3$"&,0P`H)`(``0*10"$FAP`!`@`H(0(@("$08@`<)`8` +M`28"``$P4`#_`A80*A1`__$`$!#`HC0`89)B`["B(@!B)N(``:(B`#R28P.O +M`N,0*U1```$"X!@AHB,`/8^_`#2/O@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/ +ML@`8C[$`%(^P`!`#X``()[T`0*$0`&,,`%.F,/0`_P(7$"L00``"`@`8(0+@ +M&"$0`/_=,'<`_P``@"$00``D``#P(1K``!P``)`A`K`H(9"C``$`$A#``%(0 +M(X^G`````A"``%,P(3!B`(`P8P!_$&<`0@#`("%00``%D*,``8^I``00:0`^ +M)`(``9"C``&0P@`V,&,`?S!"`']08@`JC,,`*"9"``$P4@#_`E80*A1`_^<" +ML"@ADJ(``"8#``$P<`#_`@(0*Q1`_]X`````DB@`/```@"$""!`K$$``%8XI +M`#@`$!#``%`0(P`"$(`D!@`!`%,H(0(&$`0!(A`D`I$@(28'``$00``&)H,` +M`:"0`&.,H@`L)\0``1!&``@P=`#_,/``_P(($"L40/_N`!`0P*(T`&$0`/^C +MHCX`8A``__@PG@#_)`(``0)`*"$"("`A%&+_TR0&``$,`%.F``````)7$"L0 +M0``"`D`8(0+@&"$0`/_+,'<`_R0"``$0`/_"K((`*">]__"OL```))``E`(` +M("$``"@AK[\`!`P`<@TD!@!\#`!ROP```````RB``*,H(0`%*$"N!0!4C[\` +M!(^P```#X``()[T`$``$)@``!2X```0F`P`%+@,`!C8```8V`P"%$"H`ID`J +M%$``"`"&."H1```$`*`8(0#`&"$`Q!`J`((8"@/@``@`8!`A$.#__0"`&"$` +MP!@A`*80*A``__D`HA@+D*<``#"$__\0X``+```8(0`#$$``11`AE$(``@"" +M$"L40``%)&8``3##__\`9Q`K5$#_^``#$$`#X``(`&`0(2>]_\"OO@`PK[4` +M)*^S`!ROL0`4K[\`-*^W`"ROM@`HK[0`(*^R`!BOL``0C((;=)2C``J,MP!0 +M``(2`@"`F"$`H*@A,'$/_S!>``&,M@!,C*,`*```$"&0A1@#$N``&I"$&`>. +MH@`\``(20C!"``$40``-CM0`/(YB&]Q00``+CJ(`/)!B``0P0@`!5$``!XZB +M`#R08@``)`,`"#!"``P00P`=`````(ZB`#PD`_W_`$,0)*ZB`#R.8AP84H(` +M#I+"`("6P@`>C[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4 +MC[``$`/@``@GO0!`4$#_\Y;"`!Z6I``*CH4#M`P`5/8PA`__$`#_[H^_`#00 +MH``/)O``E"0"``%0@@$"D@(`/52```N"!``FD@,`/0`#$,``0Q`C``(0@`!4 +M$"&,0P`L)`(``5!B`/*2@@`#@@0`)H(%`"@,`%3?@@8`*0P``Y*#`S``0Q`C -M)$+__Q``_PVB`@`]``(80`!B&"$``QC``'08(8QB`"@01/[[`````!``__62 -M@@`#)[W_L``*5@`Q:P#_K[X`0*^W`#ROM0`T`("X(:^T`#"OL0`D`*"H(:^_ -M`$2OM@`XK[,`+*^R`"BOL``@`,"((:^H```!(*`A``KV`PP`<5ROJP`$``,H -M@`"C*"$`!2!`KZ0`"*^@`!"2XQ@#$J`!"9+D&`>.H@!8)K``E!!@``2,4P`\ -M)`(``5""`8B28@,O`!&P0`+0D"&21``!CZ,``#""`/\08`$=KZ(`#"0"``$0 -M8@$3)(,`(Y("`#PF)0`!`*(0*A!``!D```````480`!E$"$``A#``%,0(21& -M`"@`<"`A`M$0(0`"$,``4Q`AC$,`*(S"```"T#@A)*4``11#``HDQ@`8D.,` -M`9""``$`0Q`K5$```:"#``&2`@`\`*(0*A1`_^\DA``"6B``%9("`#Z"`@`F -M@@0`)P`1&$``<"@A)$+__@!$&"J`I@```(,0"P`"%@```AX#),(``@!#$"H0 -M0`#@D*0``"2"``2@H@``)`0``:(1`%ROI``0D@(`/E!```,`$1!`$%$`#@`1 -M$$``4!`A@$,````#$(``0Q`A``(00`!`&"$D1``/*$(```""&`L``QD#H@,` -M*:(#`":B`P`HH@``/@`1D$`"4!`AD$(``2Q"`#T40``0CZ(`$!H@``X"41@A -MD@0`/0`#&,``!!!``$00(0`"$,``]`%`0`/^4H,(``#(F`/\F!P`]#`!2E0)@("&/I0`($`#_3JX%`%@D -M8P`"`,,0*A!`_Q\D@@`"$`#_'J"C```P8@#_+$(`911`_NNB0P`!)`(`9!`` -M_NBB0@`!*H,`"B0"``D`0Z`*/`*``B1"1!``%!B`CZ4`#`!B&"&,8P````40 -MP@""$",``QC"`$,0(:)"``&/J``$`N`@(0*@*"$"@#`A#``RXP/`."&2`@`H -MD@,`)I(%`#ZB`@`IH@,`**(>`":/H@`(,*0`_Q"```.N`@!0$)$`-"J"``)> -M@/\,`!&00)(#`%TD`@#_$$,``B1B``&B`@!=`M$0(0`"$,``4Q`A)$<`,(#B -M``0#PA`J5$#^_P`1D$".`@`P4B(`!8X"`"RN$0`PK@``+*X``#2.`@`LC@,` -M-"1"``$`?B`A*$,`!*X$`#048/[PK@(`+*X``"RN```T`M`H(22"``*`I@`` -M*$,``"2$``4`@Q`+``(0@R3#``(`0Q`J$$``!Y"C``"`X@`$`$80*A!```0D -M!``!)&+__Z"B```D!``!$`#^VJ^D`!!40``#H@4`/1``_\JB```^DD(``2Q" -M`"Y40``$H@``/B0"`!2B0@`!H@``/HYB`R2/HP`(``(00@!B$",0`/^]K@(` -M6"1"``$"(A`J$$#^=P`1L$"28@,P`!%`0`$1&"$"(B@A``400`!%$"$``QC` -M``(0P`!S&"$`4Q`AD&,`,)!"`#!08OYH`*"((8YG```DI0`!`*<0*A!`_F0` -MH#`A``400`!%$"$``A#``%,0(21$`#`!$1`A``(0P`!3$"&00P`PD((``!!B -M``]`"`0`/_TKB<;V*XG'#00`/_QK(`;V!``_^^N)QO( -M$`#_[:XG&V@0`/_KIB<;W!``_^FN)QO@$`#_YZR`!:@0`/_EKB<;U!``_^.N -M)QNT$`#_X:(G&[L0`/_?HB<;Y1``_]VN)QO,)(0;H@P`<)T`X"@A$`#_V``` -M```\$X`#CF2*M!"```8\`H`#C$**N!!&``H`````#`!Z:@`````,`'I7`D`@ -M(:YBBK0\`H`#K%**N#P3@`..9(JT5(```P(`*"$0`/_$)!0``@P`<)T"0#`A -MCF**M!``_[^N(AO\$`#_O:XG&VP0`/^[KB<;O!``_[FN)QN<$`#_MZ8G&\00 -M`/^UIB<;P!``_[.F)QO"$`#_L:8G&\8PX@#_$`#_KJR"&S@PX@#_$`#_JZR" -M&SP0`/^IKB<;-(R"``0`X"@A#``9T8Q$```40``"`$"@(:XP&^P0`/^@KC`; -MZ">]__"OL```K(4;"`"`@"&OOP`$#``4;20%``&.!1L(#``LN@(`("$"`"`A -M#``4;0``*"&/OP`$C[````/@``@GO0`0)[W_\*^_```,`&M,`````(^_```# -MX``()[T`$">]_]``H!`AK[```#P%@```@(`AK[\`)*^^`""OMP`XX$&`@"`"`A```H(0``,"$,`"SJ```X(1;@`!,`%B@K -M,B,W`"0")0"F$AMPIA,;?*(4&WZB%1M_IA$;]`#`,`''0)@07[`P`<5P`````)&,` -MR"QE`,B.!!A``$40(0!`,"$D"```)`D`R`P`<70`8#@A$`#_VP`````,`%)> -M`B`@(0`"&(``]`""4@AMR$`#_ZP`"BP(0`/_IE)$;, -MD1LL$`#_Y8R1&S`0`/_CC)$;2!``_^&,D1M,$`#_WXR1&U`0X/_=)!(`!B2% -M&Z@D!@`&#`!PG0#@("$0`/_7`````!``_]6,D1M4$`#_TR03``X0X/_1)!(` -M$`#@*"$,`"Q8)`8`$!``_\P`````$`#_RHR1&^P`@#@A```P(1"@``@``!@A -M`,<0!B3&``$P0@`!``,80`#%("L4@/_Z`&(8)0/@``@`8!`A)[W_\*^R``BO -ML0`$K[```*^_``R,H@!,)+``"`"@B"&020!`C$H`/*R@`!R,HP`<``D00`!) -M$"$``A#`K*,`&`!*0"&1!0`PC@,`#(X'``0D`O_@`&(8)#"E`!\D`N__`.(X -M)`!E&"6N!P`$K@,`#(T#`"@D`@`#`(`X(1!B`"L`P)`AC@,`"(X$``0\`O_P -M-$+__P!B&"0\`@$``((@)3P"``$`8A@EK@0`!*X#``B.(@`(/`,`/SP$X?\` -M0Q`E-(3__S)#``\`1!`D``,>0`!#$"6N(@`(C@(`!#P#_P\T8___`$,0)#P# -M`#``0Q`E/`,&``!#$"6N`@`$CB(`"(XD`"0\`P"``$,0):XB``BN)```C[\` -M#(^R``B/L0`$C[````/@``@GO0`0CB(`"#P#@``\!?X/`$,0):XB``B0A!T` -MC.8<5(X#``P`!!!``$00(0`"$,``1A`AD$(`,#2E__\`91@D,$(`'P`"%0`` -M8A@EK@,`#(T#`"@\`H`")$)$```#&(``8A@ACB4`"(QB```!0"`A,*4/_P$@ -M,"$`0/@)```X(8X#``@D!(``,$)__P!D&"0`8A@E$`#_L:X#``@GO?_@K[`` -M$`"@@"$#H"@AK[$`%*^_`!@,`"WM`("((5(```$```'-CZ,`!(^B```T"8`` -M``,=@``"$H(`8A@E`'`X(0#P$"$D0O__`%``&XXC``"6)1N"-`B```!I&"$R -M"O__```0$@``````````<%`X`JQG`"B.(@````<8P"1F__P`21`AK$8`+(XB -M```D9O^P`.4@(0!)$"&L1@`PCB(``"3C``$`92`*`$@0(:Q$`#2.(@``/`,` -M@`(#,"4`2!`AK$8`((XB&X@00``AC[\`&(XB``".)1N0`$@0(:Q*`0".)``` -MCB,;B`"(("&,@@$```,<`#!"__\`0Q`EK((!`(XB&XR.(P```.(0(0!H&"$P -M0O__K&(`_!"@``>.(@``/`0``@!($"&,0P#\`&08):Q#`/R.(@``/`0``0!) -M$"&,0P#\`&08):Q#`/R/OP`8C[$`%(^P`!`#X``()[T`(">]_]"OL@`(,)(` -M_Z^W`!ROM@`8K[4`%*^T`!"OLP`,K[```*^_`""OL0`$`*"@(0#`J"$`X+`A -M`0"X(0$@@"$!0)@A$D``#"0"``&/OP`@C[<`'(^V`!B/M0`4C[0`$(^S``R/ -ML@`(C[$`!(^P```#X``()[T`,`P`>EFH"("`A`@`0(1``_Z^NX```#`!Z:@(@("$0`/^K -M)`(``B>]__`LH@`$K[(`"*^Q``2OL```K[\`#`"@B"$`@(`A%$``"`#`D"$D -M`O__C[\`#(^R``B/L0`$C[````/@``@GO0`0#`!A$9"$``"2!````!$0@`!0 -M$"$,`&$BK%(`'!``__(``!`A,*4`_R>]__`LH@`*K[\``!!```TD!___/`.` -M`@`%$(`D8T1`)*4``0!#$"$0@``&,*4`_XQ'```,`&(NC(0`$"0'__\``C@* -MC[\```#@$"$#X``()[T`$#"E`/\GO?_P+*(``J^_```00``()`/__R2E``$0 -M@``%,*4`_PP`8E^,A``0)`/__P`"&`J/OP```&`0(0/@``@GO0`0)[W_\*^_ -M```\`H`"D$)$:`"`2"$`X%`A,*,`_Q!``!]_^"OL0`$K[\`%*^T`!"OLP`,K[(`"*^P```\`H`"D$)$ -M:!!```D`@(@AC[\`%(^T`!"/LP`,C[(`"(^Q``2/L````^``"">]`"".,@`4 -MD(0```P`83,F4P`(CE````P`84R2)```$@#_\8^_`!0,`&$SDB0``(Y"``". -M%```C$(``!1```*N0@``KE(`!`P`84R2)```D@(`!"0#``%00P`BC@(`"%1` -M``<"`"`AD@(`"5!``!N2!0`(4$,`$I(%``@"`"`A```H(0P`<*HD!@`,#`!A -M,Y(D``".8@`$K@```*YP``2L4```DB0```P`84P"@(`A%H#_W8^_`!00`/_, -MC[0`$(XB``R.)``$C@8`#`!`^`F.!P`0$`#_Z@(`("$0`/_YCB(`"``"$(`` -M41`AC$(`'%!`_^,"`"`A`$#X"8XD``00`/_?`@`@(2>]__"OOP``#`!A,Y"$ -M``"/OP`````0(0/@``@GO0`0)[W_\*^_```,`&%,D(0``(^_`````!`A`^`` -M"">]`!`\`H`"H$!$:`/@``@``!`A)`,``3P"@`*@0T1H`^``"```$"$GO?_P -MK[```*^_``0,`'"U`("`(0P`6L<"`"`A#`!F*8X$`!`,`%IS`@`@(0P`6L\" -M`"`A#`!PN@````"/OP`$C[``````$"$#X``()[T`$">]__"OOP``#`!H%HR$ -M`!"/OP```^``"">]`!`GO?_PK[$`!*^P```PT0#_,+``_P(`*"$"(#`AK[(` -M"*^_``P,`&'W`("0(0)`("$"`"@A%$``"0(@,"$``!@AC[\`#(^R``B/L0`$ -MC[````!@$"$#X``()[T`$`P`8A8`````%$#_]@!`&"$"0"`A`@`H(0P`8?<" -M(#`A%$#_\"0#``<0`/_N```8(2>]__"OOP``/`*``I!&10,PI0#_`*`X(0`` -M0"$``"@A#`!AYP``2"&/OP```^``"">]`!`PI0#_)[W_\`"@,"&OOP``#`!A -M8P``*"&/OP```^``"">]`!`GO?_PK[```#"P`/^OL0`$`@`H(:^_``@,`%LK -M`("((0(`,"$"("`A#`!:^P``*"$"("`A#`!;'@(`*"&/OP`(C[$`!(^P```# -MX``()[T`$">]__"OOP``/`*``I!#1&D`P#@A)`(`0#AC``(D!@(``$,P"S#G -M`/\PI0#_)`@``@P`8><``$@AC[\```/@``@GO0`0)[W_\##&`/^OOP``#`!A -M8S"E`/^/OP```^``"">]`!`GO?_PK[$`!*^P```PT0#_,+#__Z^R``@"`"@A -M`("0(:^_``P,`%M9`B`P(0)`("$"`"@A#`!:^P(@,"$"0"`A`@`H(0P`6T@" -M(#`AC[\`#(^R``B/L0`$C[````/@``@GO0`0)[W_\*^R``BOOP`,K[$`!*^P -M```0H``.`("0(9##``,D`@"!$&(`/2AB`((00``E)`(`@B0"`(`08@`+/!&` -M`@)`("$``"@A#`!C$@``,"&/OP`,C[(`"(^Q``2/L````^``"">]`!`F,$?" -M`@`P(0P`8J4D!0`&EB-'P@(`,"$"0"`A,&(`_P`"$@```QH"`$,0)0``*"$D -M!P`"IB)'P@P`8E\``````D`@(0``*"$``#`A#`!B+@``."$0`/_EC[\`#%1B -M_]\"0"`AD,,`!SP0@`(F$4?",&,`#S1E`!`"(#`A/`*``@P`8J6@0T?&E@-' -MP@(@,"$"0"`A,&(`_P`"$@```QH"`$,0)0``*"$D!P`"$`#_XJ8"1\(\`H`" -M)$9'P0``*"$D!P`!$`#_W*!`1\$GO?_@K[(`&*^P`!``H)`A`,"`(20%``$# -MH#`AK[$`%*^_`!P,`&*E`("((9>B```L0@`"$$``"@(@("$20``,C[\`')(# -M``-08``DE@,``"0"``)08@`+E@(```(@("$``"@A#`!C$@``,"&/OP`]`"`40/_V`B`@(9("``<\$(`#,$(`#S1%`!`#H#`A -M#`!BI:("BKR2!8J\`B`@(0``,"$TI0`0#`!BUP`````"("`A```H(0``,"$, -M`&)?```X(1``_^:/OP`<)`(``11B_]\"("`A`Z`P(0P`8J4D!0`&EZ(```(@ -M("$D!0`&,$+__0!`,"$0`/_KIZ(``">]_^"OL0`4K[``$*^_`!ROL@`8`,"` -M(1"@`$@`@(@AD,,``U!@`"*4PP``)`(``E!B``N4P@```B`@(0``*"$,`&,2 -M```P(8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(!1`__<``"@AD-``!P.@,"$R -M$``/-A``$`P`8J4"`"@A`B`@(0(`*"$D!@`!#`!BUP`````"("`A```H(0`` -M,"$,`&)?```X(1``_^B/OP`<)!(``1!R`!B```" -M("`A)`4`!C1"``(`0#`A$`#_U:>B```\`H`"C$)$;%!`_\&/OP`]__"OL0`$K[\`"*^P```0H``-`("( -M(9##``$``"@A```P(0``."$\`H`##`!B7Z!#BKV/OP`(C[$`!(^P```#X``( -M)[T`$#P"@`.01HJ])`4``PP`8M]__"OL```K[\` -M!`#`."$`@(`A$*``$0``0"&4PP``)`(#`#!E_P`0H@!5**(#`1!``#0D`@8` -M)`(!`!"B`"HD`@(`$*(`"3P"@`("`"`A```H(0P`8Q(``#`AC[\`!(^P```# -MX``()[T`$)!"1&DD`P!`.$(``@!B*`LE!``!``@8P#P"@`(`:!@C)$9%'#"( -M`/\`9A@A``42`BT$``2@8@`7%(#_]:!E`!:4XP`$)`<`+@(`("$L8@`N`&(X -M"P``*"$,`&)?``````(`("$``"@A```P(0P`8BX``#@A$`#_WX^_``24PP`$ -M)`<`$CP&@`(L8@`2`&(X"Q``__`DQD3\$*(`%R0"!P`4HO_0`@`@(3P"@`*0 -M0D1I)`4`0"0#`@`X0@`"`&(H"R4$``$`"!C`/`*``@!H&",D1D6$,(@`_P!F -M&"$`!1("+00`!*!B`!<4@/_UH&4`%A``_]24XP`$E,,`!"0'``H\!H`"+&(` -M"@!B.`L0`/_1),9%$#!C`/\L8@`$%$``"#P"@`(\!H`"D,-$?)3G``0DQD1\ -M`.,0*Q``_\8`8C@*)$(P```#&(``8A@AC&8``)3G``0``"@AD,,```#C$"L0 -M`/^]`&(X"B>]__```"@AK[\```P`8Q(``#`AC[\```/@``@GO0`0)[W_X`"@ -M$"&OL``0K[\`%`.@,"$D!0`$%$``!0"`@"&/OP`4C[``$`/@``@GO0`@#`!B -MI0````"3HP`!/`*``B1&1\```"@A)`<``0(`("$,`&)?H$-'P`(`("$``"@A -M```P(0P`8BX``#@A$`#_[8^_`!0GO?_@K[$`%*^P`!"OOP`8`,"((1"@`!L` -M@(`AD,,``2QB``(00``=```H(11@`!\#H#`A)`4``0P`8J4#H#`AEZ(``"Q" -M``(00``3`@`@(20%``0,`&+7```P(0(`("$D!0`!)`8``0P`8M<``````@`@ -M(0``*"$``#`A#`!B7P``."&/OP`8C[$`%(^P`!`#X``()[T`(```*"$,`&,2 -M```P(1``__B/OP`8#`!BI20%``22)@`!EZ(``%!&``@D!0`!`@`@(0P`8M]_^"OL@`8K[$`%`"@ -MD"$`P(@A)`4``0.@,"&OL``0K[\`'`P`8J4`@(`AEZ(```(`("$``"@A%$`` -M%P``,"$60``'`````(^_`!R/L@`8C[$`%(^P`!`#X``()[T`()8G``22)@`' -M/`*``B1"1'0`PC`A#`!B7P`'."L"`"`A```H(0``,"$,`&(N```X(1``_^Z/ -MOP`<#`!C$@`````0`/_JC[\`'">]__"OOP``$*``"0#`2"&0PP`#)`(``0`` -M*"$``#`A$&(`!@``."$,`&,2`````(^_```#X``()[T`$)$C``<\`H`")$)$ -M=`!B&"&1*``!D&(`````*"$02``#```P(9$B``&@8@``#`!B7P`````0`/_P -MC[\``">]_^"OLP`,K[```*^_`!2OM``0K[(`"*^Q``0`P(`A$*``"`"`F"&0 -MT0`#)`(``@``*"$2(@`+```P(0P`8Q(`````C[\`%(^T`!"/LP`,C[(`"(^Q -M``2/L````^``"">]`"`\`H`"D$-%'9("``<\$H`")E1'Q`!#$"LD!0`%%$`` -M!`*`,"$``"@A$`#_ZP``,"$,`&*E`````)8&``261$?$```H(2S"``(P@P#_ -M`,*("P`$(@(``QH``&08)0*`,"$"(#@A`F`@(0P`8E^F0T?$`F`@(0``*"$` -M`#`A#`!B+@``."$0`/_7C[\`%">]_^"OLP`,K[(`"*^Q``2OL```K[\`$#P0 -M@`,`P)@AC@:*P`"`D"$`H(@A/`2``CP%@`(DA!&`#`!P="2E$9".`HK`)$(` -M`1(@``>N`HK`EF,``"0"``$08@`A)`(``E!B``B69@`&C[\`$(^S``R/L@`( -MC[$`!(^P```#X``()[T`(##%``\DH___,&+__RQ"``(00``$,&+__S#"`(`4 -M0``,,&+__RQ"``(00/_N,,(`@%1`_^V/OP`0`D`@(0``,"$,`%MA`````!`` -M_^>/OP`0`D`@(1``__HD!@`!)!```0(`*"$"0"`A#`!;820&``$F`@`!,%`` -M_RX"``,40/_Y`@`H(200``$"`"@A`D`@(0P`6V$``#`A)@(``3!0`/\N`@`# -M5$#_^0(`*"$0`/_.C[\`$">]__"OL```K[\`!!"@``<`@(`AD,(``A!```@` -M```````H(0P`8Q(``#`AC[\`!(^P```#X``()[T`$`P`7>X``````@`@(0`` -M*"$``#`A#`!B7P``."$0`/_UC[\`!#P"@`*00D7L$$```CP"@`*@2$1I`^`` -M"``````GO?_PK[```*^_``0\`H`"D$)%[```*"$40``%`("`(8^_``2/L``` -M`^``"">]`!`,`%LTC(0`$(X$`!`,`%LT)`4``0(`("$,`%I-)`4``A``__2/ -MOP`$)[W_\*^_```\`H`"D$)%[!1```0``"@AC[\```/@``@GO0`0#`!:30`` -M```0`/_[C[\```/@``@``````^``"``````GO?_@K[$`%*^P`!"OOP`8`*"( -M(12@`($`@(`A/`*``B1&1[B0P@`#,$,`8"0"`"`08@`)*&(`(1!``'(D`@!` -M4&``"I#&``*.!``0```H(0P`8Q(``#`AC[\`&(^Q`!2/L``0`^``"">]`"`L -MP@`-$$#_]3P#@`(`!A"`)&,1G`!#$"&,0@```$``"`````".!``0/`:``@(@ -M*"$,`%MZ),9'N!``_^V/OP`8C@0`$#P&@`("("@A#`!;QR3&1[@0`/_FC[\` -M&(X$`!`\!H`"`B`H(0P`7`LDQD>X$`#_WX^_`!B.!``0/`:``@(@*"$,`%QE -M),9'N!``_]B/OP`8C@0`$#P&@`("("@A#`!X$`#_RH^_`!B.!``0/`:``@(@*"$,`%T2),9'N!`` -M_\./OP`8C@0`$"0%``$,`&*E`Z`P(8X$`!`\!H`"`B`H(0P`72\DQD>XC@0` -M$">F``(,`&*E)`4``9>B```00/^REZ(``E1`_[&/OP`8`@`@(0P`6DTD!0`# -M$`#_K(^_`!B.!``0/`:``@(@*"$,`%UJ),9'N!``_Z6/OP`8C@0`$#P&@`(" -M("@A#`!=E"3&1[@0`/^>C[\`&(X$`!`\!H`"`B`H(0P`7;(DQD>X$`#_EX^_ -M`!@48O^1C@0`$`P`7CP"("@A$`#_D8^_`!B,A``0/`:``B3&1[@,`&(/```H -M(1``_WL\`H`")[W_\*^_```\`H`"D$)%[#"C`/\PZ@#_$$``"`#`*"$!`#@A -M`4`P(0$@0"$08``*+&(``Q1```0`8"@AC[\```/@``@GO0`0#`!:%0`````0 -M`/_[C[\```P`7H(`````$`#_]X^_```GO?_@K[$`!#"Q`/^OLP`,K[(`"`"` -MF"$`$9#``B`@(:^_`!`,`&$SK[````)1$"$``A"``%$0(SP#@`,D8Z&```(0 -M@`!#$"$D0P`8E&0`!!"```H"41`A-`+__Q""``8`!"("D&(`!3P#@`(D8T3\ -MH&0`":!B``@"41`A``(0@`!1$",\`X`#)&.A@``"$(``0Q`A)$,`&)1E``8P -MI/__4(``\B0#``,T`O__$((`[B2B``*D8@`&D&0`!SP#@`(D8T3\``(2`J!B -M``N@9``*/`*``@`1&$`D0D?@`&*`(9(%``&2!@``/`2``@P`<'0DA!'0D@(` -M`11``,X\!H`"`E$0(0`"$(``41`C/`.``R1CH8```A"``$,0(91$`"`0@``) -M)$,`(#0"__\0@@`&``0B`I!B``$\`X`")&-$_*!D``V@8@`,`E$0(0`"$(`` -M41`C/`.``R1DH8```C"``,00(21#`""48@`$)$+__RQ"`$`00``B`E$0(3P% -M@`(D@@`JD&,`!22D1(``PC`A)(0``@#$$"4D8P`",$(``Z"C1(`00`"6),,` -M0`!@$"&(PP``F,,``XC%``28Q0`'B,<`")C'``N(R``,F,@`#ZB#``"X@P`# -MJ(4`!+B%``>HAP`(N(<`"ZB(``RXB``/),8`$!3"_^XDA``0`E$0(0`"$(`` -M41`C/`.``R1HH8```CB``.@P(23#`""48@`&)$+__RQ"`"!00``IE,(`*)!C -M``<\!8`")0(`:B1C``(`XA`A)*1$Q*"C1,2(20``F$D``XA*``282@`'B$,` -M")A#``N(10`,F$4`#ZB)``*XB0`%J(H`!KB*``FH@P`*N(,`#:B%``ZXA0`1 -MB$D`$)A)`!.(2@`4F$H`%XA#`!B80P`;B$4`')A%`!^HB0`2N(D`%:B*`!:X -MB@`9J(,`&KB#`!VHA0`>N(4`(93"`"@D0O__+$(`$!!``!@DPP`HD&(``3P% -M@`(E`P"*)$(``@#C&"$DI$3HH*)$Z(AF``"89@`#B&<`!)AG``>(:``(F&@` -M"XAI``R8:0`/J(8``KB&``6HAP`&N(<`":B(``JXB``-J(D`#KB)`!$F9@`0 -M`B`@(0)@*"$,`&&()`<``Q!```DD`___C[\`$(^S``R/L@`(C[$`!(^P```` -M8!`A`^``"">]`"`D`P`!/`*``J!#1>R.9``0```H(0P`6QXD$``!CF0`$`P` -M6QXD!0`!CF0`$#(%__\,`%M()`8``28"``$``A8```*&`RH"``,40/_XCF0` -M$"00``$R!?__#`!;2```,"$F`@`!``(6```"A@,J`@`#5$#_^(YD`!`,`&%, -M`B`@(1``_]<``!@AC,D``(S*``2,P@`(C,4`#*R)``"LB@`$K((`"*R%``PD -MQ@`0%,/_]B2$`!`0`/]T`E$0(23&11R0P@`'D@0``#!"`-\T0P`@`$08"CP$ -M@`(`8"@A)(01Z`P`<'2@PP`'$`#_*`)1$"$D`P`#/`*``A``_Q>@0T4&)[W_ -M\*^_``2OL````("`(0P`83.0A```/`*``J!`1>P,`&*2C@0`$`P`84R2!``` -MC[\`!(^P`````!`A`^``"">]`!`GO?_@`(`0(20$`#2OM0`4K[0`$*^S``RO -ML@`(K[$`!*^P``"OOP`8`*"8(0#`H"$`X*@A`0"0(0P`>E]`""0@@`H`*(H)0/@``B@A0`H)[W_\`"`$"&OL```K[\`!`"@("$0 -MH``(,%``_PP`>FH`````/`*``@`0&(`D0D?0`&(8(:Q@``"/OP`$C[`````` -M$"$#X``()[T`$#"$`/\`!!C``&08(0`#&(`\`H`"`&08(R1"1]``!""`)[W_ -M\`""("$\`H`#K[$`!*^_``BOL```)$*A@``#&(",D````&(8(9!D`!L`X(@A -M/`B``CP'@`*N!0`@K@8`)"8)`!PDYX-@)0B#P```*"$"`#`A#`!Q"`(`4"&. -M`@`<%$``!P!`("&N,```C[\`"(^Q``2/L````^``"">]`!`,`'$F`````!`` -M__BN,```)[W_\*^P``"OOP`$$*``!`"@@"&,H@`<%$``!0!`("&/OP`$C[`` -M``/@``@GO0`0#`!Q+0`````,`'$?C@0`'!``__>N```<)[W_\*^P````H(`A -MK[\`"*^Q``0,`'%"`("((8X"`"``0/@)C@0`)`P`<5`"("`A#`!Q20(@("&2 -M!``HC[\`"*(``"B/L0`$C[```"0#``$D`@`"`&00"@/@``@GO0`0)[W_\*^_ -M``",P@`L`$#X"8S$`#"/OP```^``"">]`!`PA`#_%(``!``````\`H`#`^`` -M")!"H9L#X``(```0(3"$`/\4@``$`````#P"@`,#X``(C$*AE`/@``@``!`A -M,(0`_Q2```4`````/`*``XQ"H90#X``()$(!``/@``@``!`A)[W_\#"$`/\4 -M@``%K[\``#P"@`*,0D?4$$``!`````"/OP```^``"">]`!`,`'"U``````P` -M83,``"`A$`#_^8^_```GO?_P,(0`_Q2```6OOP``/`*``HQ"1]000``$```` -M`(^_```#X``()[T`$`P`<+H`````#`!A3```("$0`/_YC[\``">]__"OL``` -M,)``_Z^Q``2OOP`(#`!PM3P1@`,6```&DB**Q!!```L\`H`#DB**Q"1"``&B -M(HK$#`!PN@````"/OP`(C[$`!(^P```#X``()[T`$`P`<4*,1*&8$`#_])(B -MBL0GO?_PK[```*^_``0,`'"U,)``_Q8```8\!(`#D(**Q"1"__\P0P#_$&`` -M!Z""BL0,`'"Z`````(^_``2/L````^``"">]`!`\`H`##`!Q28Q$H9@0`/_V -M`````">]__`PI0#_K[\```P`8QHPQ@#_C[\```/@``@GO0`0)[W_\*^Q``2O -MOP`(K[```(R"`!@`@(@AC%````P`81&2!`"0C@(`'%1```^.`@`@KA$`'(XB -M`!B.`P`HKA$`(*Q```"2!`"0)&,``0P`82*N`P`HC[\`"(^Q``2/L````^`` -M"">]`!",0@`8$`#_\:Q1```GO?_@K[0`$#"4`/\N@@`"K[8`&*^U`!2OL0`$ -MK[\`'*^S``ROL@`(K[````"@L"$`P*@A,/$`_Q1```PD`P`/C[\`'(^V`!B/ -MM0`4C[0`$(^S``R/L@`(C[$`!(^P````8!`A`^``"">]`"`,`'I7)`0`H`!` -M@"$00/_Q)`,`"@``*"$D!@"@#`!PJ@!`("$"@"`A#`!A`*(4`)`"@"`A#`!@ -M^*X"``BB`@"1)`0'`"0"`/^B$0"3#`!Z5Z8"`(0`0(@A$$#_WB0#`*D`0"`A -M```H(20&!P`,`'"JK@(`&`P`>E]__"OOP`` -MC(,`%#$I`/^@90``C(,`%*!G``&,@P`4H&@``HR%`!2D9@`0#`!G(*RI`!2/ -MOP```^``"">]`!`GO?_PK[\`#*^R``BOL0`$K[````"`D"&0A`"0,+``_PP` -M81$PT0#_`@`H(0(@,"$,`&>%`D`@(9)$`)`,`&$B`$"`(0(`$"&/OP`,C[(` -M"(^Q``2/L````^``"">]`!`GO?_PK[\```P`9OXPI0#_C[\```/@``@GO0`0 -M)[W_\*^_``ROL@`(K[$`!*^P````@)`AD(0`D#"P`/\,`&$1,-$`_P(`*"$" -M(#`A#`!GDP)`("&21`"0#`!A(@!`@"$"`!`AC[\`#(^R``B/L0`$C[````/@ -M``@GO0`0)[W_X*^S``ROL@`(K[$`!*^P``"OOP`0`("((9"$`)``P)`A`."8 -M(0P`81$PL`#_CB(`*!!``!\"("`ACB,`'!!@``<`8"@AC&(`&(Q"```40``" -MKB(`'*X@`"".(@`HK'(`!"1"__^N(@`H)`(``:!P``"L]_^"OLP`,K[(`"*^Q``2OL```K[\` -M$`"`B"&0A`"0`,"`(0#@F"$,`&$1,+(`_XXB`"@00``A`````(XF`!P0P``7 -M)`(`H8S"`!B,0@``%$```JXB`!RN(``@CB(`*"0#``<``$)$+__ZXB`"@` -MP"@A`B`@(:#2``"LTP`(H,,``PP`95*@PP`!DB0`D`P`82(`0(`A)`(`H0`0 -M$`J/OP`0C[,`#(^R``B/L0`$C[````/@``@GO0`@#`!A(I(D`)`0`/_V)`(` -M`R>]__"OL```K[\`!`P`:"0`@(`A#`!Z:HX$`!`,`'IJC@0`&`P`>FJ.!`!T -M#`!Z:HX$`!0,`'IJ`@`@(8^_``2/L````^``"">]`!`GO?_PK[(`"*^Q``2O -ML```K[\`#`"`B"&0A`"0,+``_PP`81$`P)`A)@/__RQB``800``;,@(`$``# -M$(`\`X`")&,1^`!#$"&,0@```$``"`````"6(@"$ID(```P`82*2)`"0```0 -M(8^_``R/L@`(C[$`!(^P```#X``()[T`$!``__62(@"5$`#_\Y(B`)00`/_Q -MEB(`B!``_^^6(@"&$$``!3(%``\,`&A<`B`@(1``_^JF0@``#`!A(I(D`)`0 -M`/_I)`(``B>]__"OL@`(K[$`!*^P``"OOP`,`("0(9"$`)`PL0#_#`!A$3#0 -M__\F(___+&(`!Q!``",R(@`0``,0@#P#@`(D8Q(0`$,0(8Q"````0``(```` -M`*90`(0,`&$BDD0`D```$"&/OP`,C[(`"(^Q``2/L````^``"">]`!`R!0#_ -MHE``E0P`9O@"0"`A$`#_\@`````0`/_PHE``E!``_^ZF4`"($`#_[*90`(8" -M`"@A#`!H9@)`("$0`/_G`````!!```8R)0`/,@8`_PP`:(4"0"`A$`#_X``` -M```,`&$BDD0`D!``_]\D`@`")[W_\#"E`/^OOP``#`!H0##&`/^/OP```^`` -M"">]`!`GO?_@K[,`#*^R``BOL0`$K[\`%*^T`!"OL```C)0`"#"S`/\PQ@#_ -M`!,00(Z#`!@`1A`A``(1@`!BB"$2(``0`("0(3(B``\D0@!/)`/_\`!#*"0" -M(Q@D`&40(0!#$"L40``'`&`@(;QQ```D8P`0`(40(0!#$"L00/_[`````(XE -M`#PD`@`!$*(`"@``("&/OP`4C[0`$(^S``R/L@`(C[$`!(^P````@!`A`^`` -M"">]`"``!A$``%,0(0!%@`0"0"`A#`!D-P(`*"$40``(`!,0@`!4$"&N(``` -MC$,`@```("&L0P"`$`#_Z:X@`#P"0"`A#`!D*P(`*"$40/_D)`0`I1``__,` -M$Q"`)[W_\#"$`/^OL```K[\`!`P`80@`H(`AC$,``#!C`/\`0Q@AK@,`"(Q" -M`"0P0@`?+$,`!`!`*"$48``"H@(`DR0%``,PI`#_``0AP"2$"``,`'I7H@4` -MDP!`&"&N`@`P$$``(B0$`*@``A`C,$('_P!B$"$D!`@@#`!Z5ZX"`"P`0!@A -MK@(`-!!``!@D!`"J``(0(S!"`!\`8A`A)`0#``P`>E>N`@`XK@(`>!!```\D -M!``!D@0`D#P%@`(F!P"<`@`P(0P`8)HDI9BD)`(`_Z8"`(0"`"`A#`!CG:8` -M`(8\`H`"K%!'V```("&/OP`$C[````"`$"$#X``()[T`$">]_^"OL@`(K[$` -M!*^_`!BOM0`4K[0`$*^S``ROL````("((9"$`)`,`&$(CC,`"`!`D"&.8@`` -M)`/__@!#$"2N8@``)`(``JYB``".8@``,$(``A1`__TD`@`&KF(`:)(B`).. -M)``P```H(0`",<`DQ@@`#`!PJ@`"@$".)``T```H(20&"""N(``\#`!PJJX@ -M`$"2)@"3)B0`1```*"$,`'"J``8PP)(F`),``"@A)B0`7`P`<*H`!C#`KF`` -M;(XE`"P2```,``"@(0"@("$\`@!`-$*``":4``&L@@```I`8*R0"``&L@@`( -MK(``/!1@__]`!",0@`<$`#_\:Q1``",A@`(```@(:S%`'2,PP!T+(($``!E&"008``# -M)(0``11`__H``````^``"```$"&,A@`(```X(8S"```LZ`0`).<``31"0`"L -MP@``C,0`>(S"`'",PP```$00)3!C0``48``#`$40)!4`__,`````C,,``"0$ -MO_\``A`K`&08)`/@``BLPP``)[W_\*^E``"OI@`$CZ4``(^B``2/HP``C(8` -M"*RB``BL8``,C,(`````("$T0D``K,(``*S'`'",P@!X`$<0)!1```]_^"OL0`4K[``$*^_`!B0Z0``C((`")#H``&OI0``KZ8`!(Q# -M`!@`"8!``@B`(0`0$8``8A@AKZ,`"(^E``@`"$$`CZ8```$)0"$D!P`!`("( -M(0$'.`0,`&1-`!"`@`(1&"&,8@!$5$``#(QC`%R/H@``K&(`1`(1&"&/I``$ -MC[\`&(^Q`!2/L``0```0(:QD`%P#X``()[T`((^B```0`/_UK&(``">]_^"O -MOP`0D.@```#@8"&0YP`!C(D`"``($$``1U@AKZ4````+:("OI@`$KZ``"(TC -M`!@!I!`A`(!0(8Q$`%P`!SD```L1@`!B&"$`Z#@A)`(``:^C``P`XG`$KZ0` -M"```,"&-(@``+,@$``&J*"$T0D``K2(``(TB`'@`3C@D$.``!B3&``&/H@`( -MCZ,``(^D``2L0P``K*0`7(TB```P0D``%$```P`````5`/_M`````(TB```D -M`[__`$,0)!#@``6M(@``C[\`$```$"$#X``()[T`((^C``@`"Q"`CZ4``(^F -M``0`2A`AK$,`7`%`("$,`&1L`8`X(1``__./OP`0)[W_T*^S`!ROL@`8K[$` -M%*^_`""OL``0`*"0(8R#``B0I0```("((9)$``&,8P`8``400`!$$"$``A&` -M`&(8(:^C``"/HP````0A``"%("$D`@`!`()@!```6"$``)@ACD@`"!!@`!,` -M`%`ACZ0``(^E``"/H@``)`/_\`"#("0P0@`/)$(`3P!#$"0`@B`A`*,H)`"% -M$"L40``&`````+RQ```DI0`0`(40*Q!`__P`````CZ(``(Q#`#PD`@`!$&(` -M"20$`*&/OP`@C[,`'(^R`!B/L0`4C[``$`"`$"$#X``()[T`,(XP`#PM`D`! -M)`E```$"2`L2```Z`0E`(XX&`!R,P@``%$```JXB`#RN(`!`EB,`B@`)%``T -M18"`)&/__S1$`(`D`@`!K-$```(*F`JN`@``%0``**8C`(JN!0`$CD,`!(X$ -M``0D`H#_`&H8(0""("2LT@`()&=``"1B$``D92``)&8P`*X$``2N`@`,K@4` -M$*X&`!2N!P`8K@,`"!%@``(!25`AK7```!4`_]4"`%@A`8`H(0P`9#<"("`A -M%$``!P(@("$"8"@A`@`P(0P`9&P"0#@A$`#_P@``("$"8"@A`@`P(0P`9)8" -M0#@A$`#_O```("$0`/_9K@0`!!``_[@D!`"F)[W_\*^_```,`&37`````(^_ -M```#X``()[T`$">]__"OOP``#`!DUP````"/OP```^``"">]`!`GO?^PK[,` -M+*^_`$2OO@!`K[<`/*^V`#BOM0`TK[0`,*^R`"BOL0`DK[``((R"``BOH``( -MKZ``#*^B``",50!L`("8(:^@`!`2H``2KZ``%)""`),00``/``"@(20"``$" -M@A`$`J(0)#*%`/\D!@`!)I0``0``."$``$`A%$``I20)``B28@"3`H(0*Q1` -M__0D`@`!CZ,``(QU`'RL=0!\$J``C(^_`$2OH``$CZ0`!))B`),``*`A$$`` -M?P`$N"L`%Q"``%,0(21"`$2OH@`8`N#P(1+@`(TD`@`!)H,`$`!B$`0"HA`D -M4$``;))B`)./H@``CZ0`&(Q#`!@`'A&``&*P(1+``!",A0``,L(`#R1"`$\D -M`__P`$,P)`+#&"0`9A`A`$,0*Q1```<`8"`AO'$``"1C`!``AA`A`$,0*Q!` -M__L`````4*``5))B`),PH@`/)$(`+R0#__``0S`D`*,8)`!F$"$`0Q`K%$`` -M!P!@("&\<0``)&,`$`"&$"$`0Q`K$$#_^P````",H@`$,$(`@!!``!$````` -M5H``/Y)B`).,H@`$)`,`0``"%`(P0@!_5$,`.9)B`).,H@`$,$*``%!``#62 -M8@"3C*(`!"0#_W\`0Q`DK*(`!(RB`!R,0@`($$``!@````",0P`$C$0`"*^B -M`!"OHP`4KZ0`#(RB``",HP`$)`3_X#!C`&@48``[`$20)(RB``2/HP`(CZ0` -M#``"%`(P0G__`&(8(0"#(".OHP`(KZ0`##*0`/\R\0#_`F`@(0(`*"$,`&B7 -M`B`P(5)```>.9`"8CD(`'(^C`!",0@`($$,`"0````".9`"8CZ@`%(^I``P" -M`"@A`B`X(0P`7Q```#`AKZ``"!9`_Z\"0"@ADF(`DX^D`!@FE``!`H(0*R2$ -M``BOI``8%$#_B"?>``*/H@`$)$(``:^B``0L0@`"%$#_>8^D``2/OP!$C[X` -M0(^W`#R/M@`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`%"NP``, -M$`#_SC*0`/\0`/]U`H(0!`P`7Q".9`"8$`#_6I)B`),GO?_PK[$`!*^_``RO -ML@`(K[```)""`)`\`X`")&-'U``"$(",D@`(`$,0(20#``$`@(@AK$,``(Y0 -M``2.0@`(`@(0)!!``"@R`@!`KE``!!1``"$`````,@(`!!1``!H`````,@(` -M`A1``!,`````,@(``11```P`````,@(!`!!`_^T`````CD(`1#!"#``00/_I -M``````P`9IH"("`A$`#_Y0`````,`&5@`B`@(1``__,R`@$`#`!FZ@(@("$0 -M`/_L,@(``0P`9JH"("`A$`#_Y3("``(,`&9O`B`@(1``_]XR`@`$DB,`D#P" -M@`*/OP`,C[(`"(^Q``2/L```)$)'U``#&(``8A@AK&````/@``@GO0`0)[W_ -M\*^Q``2OOP`(K[```(R0``@`@(@AC(0`F```*"$``#`A```X(0P`7EL``$`A -MC@,`%#P"`?\T0O__`&(8)*X#`!2.`@!LK@(`;(X"`'RN`@!\C@(`6P``0"&/OP`(C[$`!(^P```#X``()[T`$">]__"OOP``E(,` -MA`"`$"&,A`"8I$,`CB0#`("D0P"$```H(0``,"$``#@A#`!><0``0"&/OP`` -M`^``"">]`!`GO?_PK[```*^_``BOL0`$C((```"`@"$00``"C)$`"*R```". -M(@!$,$(!`!1```T`````CB(`1#!"`@!00``#H@``DB0"``*B`@"2D@@`DHX$ -M`)@``"@A```P(0P`7E0``#@ACB(`1#!"`(!40``9E@(`A(XB`$0P0@"`%$`` -M!20"``*6`P"$)`(`@!!B``?@``0"$0`/_SC[\`"(X$`)@` -M`"@AI@(`CB0"`("F`@"$```P(0``."$,`%Z```!`(1``_]X`````)[W_\*^P -M````@(`A/`2``J^_``0,`'!T)(02+)8"`(R/OP`$)$(``:8"`(R/L````^`` -M"">]`!",@@`(``4N0*Q%`!0D`@`!`^``"*2"`(2,B0`(,*4`_P`%$<"-(P`8 -M`&(@(1"``!$D`@`!,((`#R1"`$\D`__P`$-`)`"#&"0`:!`A`$,0*Q1```<` -M8#@AO'$``"1C`!``Z!`A`$,0*Q!`__L`````)`(``0"B$`2(@P`HF(,`*XB% -M`"R8A0`OJ,,``+C#``.HQ0`$N,4`!P/@``BM(@!L)[W_X*^S``ROL0`$K[`` -M`*^_`!2OM``0K[(`"(R4``B0IP``D*8``8Z#`!@`!Q!``$80(0`"$8``0X@A -M`*"`(1(@`!``@)@A,B(`#R1"`$\D`__P`$,H)`(C&"0`91`A`$,0*Q1```<` -M8"`AO'$``"1C`!``A1`A`$,0*Q!`__L`````CB(`/``&&0``9Q@A)`0``0!D -MD`000``*```8(8^_`!2/M``0C[,`#(^R``B/L0`$C[````!@$"$#X``()[T` -M(`)@("$,`&0W`D`H(11``"H"8"`AD@,``B0"``$08@`BE@(`$!!@`!P````` -MC@,`%!!@``,``B0`/`(@``""("6N)```D@(``)($``$D`P#```(0@`!4$"$\ -M!@#``&0P"HQ%`(`D0P"`$(``"9("``(``A2``,(0)0"B$"6L8@``)`(``:XB -M`#P0`/_4```8(1``__@``A"```(4`#1"@``0`/_HKB(``#P#0````A0`$`#_ -M^P!#$"4,`&0K`D`H(11`_\8D`P"D$`#_TY(#``(PI0#_,,8`_P`%*$``IB@A -M``4H@`"D*"&,HP!$$&``!```$"&,8@`]_]"O -MLP`<,-,`_Z^R`!@`$Q$`,+(`_Z^U`"2OM``@K[$`%*^_`"BOL``0`("((0!2 -M$"$`$AA`)`0``0!$(`0`FJ.!``T#`!Z:HX$`'B2!`"0#`!@QHX%`)R/OP`$ -MC[````/@``@GO0`0C(0`"#"E`/\PQP#_``400(R&`!@`1Q`A``(1@`!&$"&, -M0@````48@`!D&"$\!@`!,$*``#3&``$00``%`&`H(8QB`(``1A`E`^``"*QB -M`(",8P"`/`(``22E`(`4X``"`&(0)31B``$#X``(K*(``(R"``@PI0#_``4H -M@`"B*"&,H@"`/`,``31C``$`0Q`D`^``"``"$"LGO?_PK[$`!*^_``BOL``` -MC)``"#P"`$`PL?__C@8`@```*"$D!P`U`,(0):X"`(`\!H`")`($`!(B``PD -MQD7PC@8`1"0#_]4`$1(``,,P)`#"$"6N`@!$C[\`"(^Q``2/L````^``"">] -M`!`,`&)?`````!``__..!@!$C(,`"#"E`/\\"``!/`?__@`%$(`PQ@#_-0@` -M`33G__X0P``%`$,@(8R"`(``2!`E`^``"*R"`(",@@"``$<0)`/@``BL@@"` -M)[W_X*^R``BOOP`0K[,`#*^Q``2OL```C((`"#"E`/\PQ@#_C$,`&``%*$`` -MIB@A``41@`"`D"$`8B`A$(``#S""``\D0@!/)`/_\`!#,"0`@Q@D`&80(0!# -M$"L40``'`&`@(;QQ```D8P`0`(80(0!#$"L00/_[```````%F(`"]`""L0`!<$@#_]JQ``$00`/_QC@(`&">]__`T`K]H$*(`!*^_``"/ -MOP```^``"">]`!`D`@`!5(+__(^_```,`&VM`````!``__B/OP``)[W_\"0$ -M``&OOP``#`!H^#0%OVB/OP```^``"">]`!`GO?_PK[\```"`*"&,A`"(#`!T -M[P`$((*/OP`````0(0/@``@GO0`0`^``"```$"$GO?_P/`*``J^P```D4$:< -M/`*``B1"1H`"`A`K$$``!:^_``2/OP`$C[````/@``@GO0`0C@(```!`^`DF -M$/_\/`*``B1"1H`"`A`K4$#_^HX"```0`/_TC[\`!``$$",`@B`D``04``!$ -M(",`!!&``((@(0`$$0``@B`A/`*``B1",!0`!":"`((@(0/@``B`@@``&(`` -M%"0(`!0H@R<1)`(G$`"#$`MP2#`"`((@(QC```M`!4@`0`)(`!"B__X`11@C -M/`<``P!`*"$$8``(-.<-0`##,",

    ] -M_^"OOP`0#`!I7``````00`!#C[\`$$"`X`````````````````!`@.@````` -M````````````/`.``+QI```\`H``)&,`$#1"#_\`0Q`K$$#_^@````!``H`` -M````````````````/`/__S1C__@`0Q`D-$(``T""@`````````````````!` -M@.``````````````````0(#H`````````````````#P#@`"\:```/`*``"1C -M`!`T0@__`$,0*Q!`__H`````0`*``````````````````#P#__\T8__X`$,0 -M)#1"``-`@H``````````````````0`*``*^B``"/H@``CZ(``"0#__P`0Q`D -MKZ(``(^B``!`@H``C[\`$`/@``@GO0`@/`2@P#2$`"",A0``)`+^_SP#H,`` -MHB@DK(4``(R%```D`OW_-&,`D`"B*"2LA0``C&4``#2E``$#X``(K&4``#P# -MH)`T8T``C&4``"0"__P\!*"0`*(H)*QE```TA$`$C(4``#P#__PT8___`*,H -M)#P"H)"LA0``-$*8<(Q%```TI0`/K$4``(R%```\`@`!`*,8)`!B*"4#X``( -MK(4``#P#H,`T8P`@C&(``#1"`P`#X``(K&(``#P%H,`TI0!@C*8``#P#__X\ -M`@`!``0A@#1C__\`@B`D`,,8)`!D,"6LI@``C*8``#P"``(`PC`E`^``"*RF -M```PA`#_``01@#P&H,`\!:#`,$<`0"0"``$TQ@!@$((`"C2E`&2,PP``)`+_ -MOS1C`#"LPP``C,,```!B$"0`1Q@E`^``"*S#``",HP``)`+__@!B&"00`/_S -MK*,``">]__"OL```K[\`!`P`:5PPD`#_`$`P(3P#H,`D`@`!$@(`%S1C`&`` -M$!`G/`.@P``0(<`T8P!@``(1P#!%`(`PA`"`C&,``!#```HD`O]_`&(0)`!% -M&"6/OP`$C[```#P"H,`T0@!@K$,```/@``@GO0`0`&(0)!``__<`1!@EC&,` -M`%#```,T8P$`)`+^_P!B&"0\`J#`-$(`8*Q#```0`/_B`!`0)R>]__"OOP`$ -M#`!I7*^P````0(`A/`*``@P`:>F01$8J/`*``@P`:@"01$8I/`*@P#P#[_\T -M0@!@-&/__XQ%```2```4/`(0``"C*"0\`J#`-$(`8#P#H,"L10``-&,`((QE -M```D`N__/`2@P`"B*"0TA`"0K&4``(R%``"/OP`$C[```#2E``*LA0```^`` -M"">]`!`0`/_M`*(H)4`(8```````-0@``4"(8`````````````/@``@````` -M/`.@`!"```XT8P0`**(`$!!```LD`O__)*7__Q"B``@`````D&(``"2E__\D -M8P`!H((``"0"__\4HO_Z)(0``0/@``@`````)[W_X`.@("&OOP`0#`!J620% -M``^3HP``C[\`$#P$@`(``Q!")(5'X#!"``$P8P`!H(-'X*"B``$#X``()[T` -M(">]_^`\`Z#`K[\`$#1C`)",8@``/`6@P#2E`&"OH@``CZ(``#P$_O\TA/__ -M-$(`!*^B``"/H@``K&(``(RB``"OH@``CZ(```!$$"2OH@``CZ(```P`:QVL -MH@``#`!IV0``("$,`&U)``````P`::L`````)`(#Z*^B``"/H@``)$+__Z^B -M``"/HP``)`+__Q1B__H\!*#`-(0`8(R"```\`__O-&/__Z^B``"/H@```$,0 -M)*^B``"/H@``#`!INZR"```,`&HJ``````P`:T0`````#`!K<0`````,`&IK -M`````#P"@`(,`&OU@$1&*`P`:E$`````C[\`$`/@``@GO0`@/`*@P#P%_^\T -M0@!@-*7__XQ#``!0@``#`&48)#P"`!``8A@E/`*@P#1"`&`#X``(K$,``">] -M__"OL```K[\`!`P`:5P`@(`A`$`P(3P#H,`D`@`5)`0`"0!0(`HT8P!H/`*@ -MP(QE```T0@!@K&0``(Q%```2```%/`*@P!#``",D`O[_-*4!`#P"H,`T0@!@ -MK$4``!(``!F,10``%,``%3P"$``\`N__-$+__P"B*"0\`J#`-$(`8*Q%``", -M10``%@``!H^_``10P``$-*4!`"0"_O\`HB@DC[\`!(^P```\`J#`-$(`8*Q% -M```#X``()[T`$!``_^X`HB@E4,#__3P"$``0`/_H/`+O_Q``_]X`HB@D/`:@ -MP#P"__TTQ@!@$(``!C1"__^,PP``/`(``@!B&"4#X``(K,,``(S#````8A@D -M`^``"*S#```\!J#`/`+^_S3&`&`0@``&-$+__XS#```\`@$``&(8)0/@``BL -MPP``C,,```!B&"0#X``(K,,``#P$H,`TA``@C(,``#P"__LT0O__`&(8)`/@ -M``BL@P``*((`!!!```L`````)`(``0"",`0`!A`G/`.@L8QC``!0H``"`&(8 -M)`!F&"4\`:"QK",```/@``@`````/`*@L31"``B,0P``)`(``0""$`0``C`G -M)`(``1"@``8`@A`$`&88)#P"H+$T0@`(`^``"*Q#```0`/_[`&(8)3P$H,`T -MA``@C(,``#P"__]_^"O -ML0`4K[``$*^_`!@,`&P^``````!`@"$\`H`#K%"A@"11H8`D`@`!$@(`40`` -M```6```"-`+P`*XB``0\$(`#)A"A@#P"H*"N`@`4)`(``JX"`!@F!@`<)`0` -M`20%``$,`&M2K@``$"8&`!XD!`!`#`!K4B0%``$F!@`@)`0`00P`:U(D!0`! -M)@8`(B0$`$(,`&M2)`4``28&`"0D!`!##`!K4B0%``&6`@`D)`4`("8&`"H` -M`A!"+$,`(`!#*`L,`&M2)`0`1"8&`"8D!`!D#`!K4B0%``&6`@`F)`4`$"8& -M`&H``A!"+$,`$`!#*`L,`&M2)`0`928&`"@D!`!U#`!K4B0%``&6`@`D)`4` -M""8&`(H``A!"+$,`"`!#*`L,`&M2)`0`=B8&``PD!``=#`!K4B0%``$F!@`* -M)`0`'B0%``$,`&M2)A``"`(`,"$D!``?#`!K4B0%``&/OP`8C[$`%(^P`!`# -MX``()[T`(`P`:]D#H"`AEZ(````"&@(0]`!`\`H`"`^`` -M"*Q$1BP\`H`"`^``"(Q"1BP\`E'K-$*%'P""`!D\`H`"```@$``$(8(#X``( -MK$1&,#P"@`(#X``(C$)&,#P"@`(#X``(C$)&-#P"@`(D0C!4``08@`!B&"$` -M!!!`)[W_\#P(H,`P1P`.+((`"*^_``2OL```-0@`8!1```4`@#`AC[\`!(^P -M```#X``()[T`$(T%```\`H`"K$9&-"0"__$`HA`D`$]`!`\`J$` -M.(0``@""("&4@@```^``"*2B```#@#@A/!R``R>]__"OOP```X`0(3P<@`,,`&M,)YS&L#P"O\``0``(`````">] -M__"OOP`$K[````.`@"$\'(`##`!L@B>]`!`#X``(```0(2>]_^"OL@`(K[```*^_`!"OLP`,K[$`!`"`@"$``"@A -M)!(``0``&"$#@)@A/!R``R>*(+__Q!``!,D`O__)`+_ -M_5""``(``"`A)(0``20#``$08``)``090#P"@`,D0HK(`&(8(3P"@``D0@,` -MK$,`%#P"@`*L1$8\`,#@(0/@``@`H!`A5(+_\22$``$\`H`"C$)&/!Q`_^XD -M1?__)`7__1``_^L`0B@+/`*``"1"`P"L0``4/`*``A``_^6L1$8\`X`0(3P< -M@`,GG,:P`^``"`!`X"$#@!`A/!R``R>]__"OOP``/`6` -M`I"B1D`00``$```@(8^_```#X``()[T`$#P"@``D0@,`C$(`-"0#``$`0/@) -MH*-&0!``__>/OP``)[W_\#P"@`"OOP``)$(#`(Q#`!0`!"8```0F`Q!@`!(P -MA0#_C&0``(QB``P`0/@)`````#P"@``D0P,`C&(`1!1```0``"`AC[\```/@ -M``@GO0`0K&``1`P`;:,`````$`#_^H^_``",0P`8$`#_[0`````GO?_PK[\` -M!*^P`````#`A/`>````&$(`DY0,`),8``3P#@`(`11`A)&.R8"C$`$"L0P`` -M5(#_]SP'@``\`@`(-$(`%:SB`P`\`H`")$*R"*RB`$`\`H`")$*R+*RB`!`\ -M`H`")$*Q-*RB`$@\`H`")$*T1*RB`"`\`H`")$*T6*RB`!P``#`AK*``3*R@ -M`#@``"@A``88P`!E&"$\`H`#)$**R``#&(``8A@A)*4``3P"@`(D0K)@**0` -M"*QB```4@/_U``88P"3&``$HP@`"%$#_\```*"$\$(``/`*``B80`P`D0K)H -MK@(`,#P"@`(D0K.8)`3__@P`;)JN`@`T#`!LYB0$__X,`'RO``````P`;)H` -M`"`A#`!LY@``("&N``!$C[\`!(^P```#X``()[T`$!"@``H``#`A)*7__P"% -M$"&`0P``)`(``Q!B``0D!@`!5*#_^B2E__\``#`A`^``"`#`$"$```%-`^`` -M"``````GO?_PK[\```P`:1@`````C[\```/@``@GO0`0)[W_\*^_``2OL``` -M/`*``HQ"1D040``5/`*``B101K@\`H`")$)&N!("``XD`P`!C@(`#`!`^`D" -M`"`A$$``#XX"`!@T0@`!K@(`&#P"@`(F$``@)$)&N%8"__:.`@`,)`,``3P" -M@`*L0T9$C[\`!(^P```#X``()[T`$"0#__X0`/_Q`$,0)">]__"OOP``#`!M -MV0`````,`&W;``````P`!H0`````#`!WP@`````#X``(``````/@``@````` -M)[W_\``$)@"OL```)`(`"@`$A@.OOP`$$@(`!R0$``T,`&TL`@`@(8^_``2/ -ML````^``"">]`!`,`&TL`````!``__<```````0F`">]__"OOP``#`!MW0`$ -M)@./OP```^``"">]`!`GO?_PK[```*^_``0`@(`AD(0````$)@`4@``$C[\` -M!(^P```#X``()[T`$``$)@,,`&W=)A```9($````!"8`5(#_^P`$)@,0`/_U -MC[\`!">]__`D!0`0)`8`*P``."&OOP``#`!N;P``0"&/OP```^``"">]`!`G -MO?^PK[4`-"0"`"`D%0`PK[X`0*^W`#ROM@`XK[0`,*^S`"ROL@`HK[\`1*^Q -M`"2OL``@`$BH"@"`D"$`H)@A`,#P(0#@N"$!(+`A``"@(0.T&"$FE``!*H(` -M(!1`__R@=0```E,0)11``"4``*`A)`(`,"04``&CH@```I80*@+"H`LD`@`M -M$N(`%@*=$"$FE/__!H``"(^_`$0"G1`A@$0```P`;=TFE/__!H'__`*=$"&/ -MOP!$C[X`0(^W`#R/M@`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">] -M`%"`0O__)H/__P!5$"8`8J`*`[00(1``_^:@5P``$$#_WP*6$"H``(`A`D`@ -M(0)@*"$"`#`A#``$XP/`."$\!(`")(02,`"#$"&00P```[00(0)`("$"8"@A -M`@`P(0/`."$,``-$H$,```!`D"$`0Q`E`&"8(11`_^LFE``!$`#_QP*6$"H` -MH%`A`,!8(0#@8"$`@!@A```0(2>]__`!`$@A`$`@(0!@*"$!0#`A`6`X(:^_ -M```,`&X5`8!`(8^_```#X``()[T`$"0'``$0@``9```0(9""`````AX`$&`` -M%`"`,"$`Q!`C*$((`0`".`H``QX#)`(`"A!B```%1@_^\`Q!`C`.`0(0/@``@` -M````)[W_@`"%$"6OO@!PK[<`;*^V`&BOM0!DK[0`8*^S`%ROL@!8K[\`=*^Q -M`%2OL`!0`("0(0"@F"$`P*@A`."P(0$`\"$#H*`A%$``&@``N"$D`@`P)[0` -M`:.B```2G0`(`N`0(2:4__^2@@``)O<``:*B```6G?_[)K4``0+@$"&BH``` -MC[\`=(^^`'"/MP!LC[8`:(^U`&2/M`!@C[,`7(^R`%B/L0!4C[``4`/@``@G -MO0"`$$#_Z0``````%H?#`D`@(0)@*"$"`#`A#``$XP+`."$#PQ`AD$(```)` -M("$"8"@AHH(```(`,"$,``-$`L`X(0!`D"$`0Q`E`&"8(11`_^XFE``!$`#_ -MU``````GO?]PK[X`@`"`\"$`P"`AK[<`?*^V`'BOM0!TK[0`<*^S`&ROL@!H -MK[\`A*^Q`&2OL`!@`,"@(0"@N"$,`&Z``."H(0``D"$``)@AK[T`1*^@`%00 -M0`%D``"P(8*"```FE``!$$``#@!`B"$D`@`E$B(`&`(@("$"X"@A`\#X"0`` -M``"/H@!4)$(``:^B`%2"@@``)I0``11`__0`0(@ACZ(`5(^_`(2/O@"`C[<` -M?(^V`'B/M0!TC[0`<(^S`&R/L@!HC[$`9(^P`&`#X``()[T`D(*1```D`@`M -M)I0``0``*"&OH`!0$B(!.J^@`$@D`@`P4B(!,X*1``"OH`!,)B+_T"Q"``H0 -M0``.)`(`+H^C`$@``Q"``$,0(0`"$$``41`A@I$``"1"_]"OH@!()B+_T"Q" -M``H40/_U)I0``20"`"X2(@$1CZ(`3"0"`&P2(@$'KZ``0"8B_[XP0P#_+&(` -M-Q!``!HF(O_;``,0@#P#@`(D8Q*D`$,0(8Q"````0``(`````!"@`/(D`O_\ -M)J(`!R0#__@`0Z@DCK(``(ZS``0FM0`()`(`9!(B`.`D`@!$$B(`W@`````D -M`@``)`/__P)"D"0"8Y@D)B+_VS!#`/\L8@!4$$``RP`#$(`\`X`")&,3@`!# -M$"&,0@```$``"``````D!``P`\#X"0+@*"$D!`!X`\#X"0+@*"$D`@`!)`,` -M"*^B`$ROHP!()B+_O#!$`/\L@@`U4$``$J^]`$0\`X`"``00@"1C%-``0Q`A -MC$(```!```@`````/`B``B4($D0"0"`A`F`H(0.@,"$D!P`*#`!NG0`````` -M0+`AK[T`1(^B`$B/HP!``%:`(R8"__\`0X`+CZ(`3!!```,D$0`@%&``.B01 -M`#"/H@!0%$``#H^B`$`"`!`A&$``"B80__\"("`A`\#X"0+@*"&/HP!4`@`0 -M(280__\D8P`!'$#_^*^C`%2/H@!`%$``(@!`("$"P!`A&$``#B;6__^/H@!$ -M`N`H(8!1```D0@`!KZ(`1`/`^`D"("`ACZ,`5`+`$"$FUO__)&,``1Q`__2O -MHP!4CZ(`4%!`_UF"@@```@`0(1A`_U4F$/__)`0`(`/`^`D"X"@ACZ,`5`(` -M$"$F$/__)&,``1Q`__BOHP!4$`#_2X*"```#P/@)`N`H(8^C`%0D8P`!$`#_ -MVJ^C`%0`8"`A`\#X"0+@*"&/HP!4KZ``0"1C``$0`/_`KZ,`5#P(@`(E"!(P -M`D`@(0)@*"$#H#`A$`#_JR0'`!`\"(`"$`#_^24($E`D!``E`\#X"0+@*"$0 -M`/^HCZ(`2(^V`$@6P``%)L;__R06`$`D`@`@`$6P"B;&__\8P/^=``"`(0`0 -M%H`$00`$``````(2*`<0```'`!(GPQ!```0"$R@&`!`0(P!2$`0`HB@E`A(@ -M!S"B``$#L!@A%$```B0$`#$D!``N)A```0(&$"H40/_LH&0``!``_X>OO0!$ -M)J(``R0#__P`0Z@D@K$``P+@*"$FM0`$$`#_``(@("$FH@`#)`/__`!#J"2. -MH@``)K4`!!!``!FOH@!$#`!N@(^D`$100``-/`2``H^C`$2`8@``$$#_<``` -ML"&/HP!$)M8``0!V$"&`0@``5$#__2;6``$0`/]ICZ(`2`P`;?!``_^VOH@!$/`*``A``__PD0A)\)`0`)0/`^`D"X"@A -M`B`@(0/`^`D"X"@ACZ,`5"1C``(0`/]3KZ,`5`9!_RG`!2OJ``@ -MKZD`)*^J`"@,`&[AKZL`+(^_```#X``()[T`,">]__`D`B=T$*(`!*^_``"/ -MOP```^``"">]`!`D`@`!5(+__(^_```,`&T;`````!``__B/OP``)[W_\"0$ -M``&OOP``#`!PAR0%)W2/OP```^``"">]`!`DQO__)`+__Q#"``@`@!@AD*(` -M`"3&__\DI0`!H&(``"0"__\4PO_Z)&,``0/@``@`@!`A),;__R0"__\0P@`& -M`(`8(23&__\D`O__H&4``!3"__PD8P`!`^``"`"`$"$\`X`"C&)&5"1"``$# -MX``(K&)&5#P#@`*,8D94)[W_\!!```:OOP``C&)&5"1"__\00``%```@(:QB -M1E2/OP```^``"">]`!`,`'>$`````!``__H`````)[W_\`"@$"$`P!@A`0!@ -M(0$@:"&OL0`$`6"((0#@6"&OL````(`H(0%`@"$"("`A`$`P(0!@."$!8$`A -M`8!((:^_``@,`'(H`:!0(:X1``"/OP`(C[$`!(^P```#X``()[T`$">]__"O -ML```K[\`!(R#`#0D`@`0$&(`!P"`@"$,`',.`@`@(8^_``2/L````^``"">] -M`!`,`')E`````!``__<`````/`*``XQ$G#0GO?_PK[\```P`=Q\DA``8C[\` -M``/@``@GO0`0/`*``P/@``B,0IPT)[W_\*^_```,`'/B`````(^_```#X``( -M)[T`$">]__``H!`A`,`8(0$`6"&OL0`$`4"((0#@4"&OL````(`H(0$@@"$" -M("`A`$`P(0!@."$!0$`AK[\`"`P`=1(!8$@AKA$``(^_``B/L0`$C[````/@ -M``@GO0`0)[W_\*^_```,`'4:`````(^_```#X``()[T`$">]__"OOP``#`!U -MB`````"/OP```^``"">]`!`GO?_PK[\```P`=:$`````C[\```/@``@GO0`0 -M)[W_\*^_```,`'6W`````(^_```#X``()[T`$">]__"OOP``#`!USP````"/ -MOP```^``"">]`!`GO?_PK[\```P`=>,`````C[\```/@``@GO0`0)[W_\*^_ -M```,`'8,`````(^_```#X``()[T`$">]__"OOP``#`!V,P````"/OP```^`` -M"">]`!`#X``(K*0``#P"@`(#X``(C$)&=#P"@`*,0D9TC$,`#`/@``B,0@`( -M)[W_\`"@$"$`P!@AK[$`!*^P```!`(@A`."`(0"`*"$`0#`A`&`X(:^_``@, -M`'X3`0`@(:X1``"/OP`(C[$`!(^P```#X``()[T`$">]__"OOP``#`!^-P`` -M``"/OP```^``"">]`!`GO?_PK[\``(R"`"@40``$`(`H(8^_```#X``()[T` -M$`P`?<2,A``($`#_^X^_```GO?_PK[\```P`>'$`````C[\```/@``@GO0`0 -M)[W_\*^_```,`'AT`````(^_```#X``()[T`$">]__"OOP``#`!XN@````"/ -MOP```^``"">]`!`GO?_PK[\```P`>1H`````C[\```/@``@GO0`0)[W_\*^_ -M```,`'DW`````(^_```#X``()[T`$">]__"OOP`$K[````P`>5L`H(`AK@(` -M`(^_``2/L````^``"">]`!`GO?_PK[\```P`>5T`````C[\```/@``@GO0`0 -M)[W_\*^_```,`'EC`````(^_```#X``()[T`$">]__"OOP``#`!Y:@````"/ -MOP```^``"">]`!`GO?_PK[\```P`>=\`````C[\```/@``@GO0`0)[W_\*^_ -M```,`'H-`````(^_```#X``()[T`$"0#``4\`H`#K$.<,#P"@`,GO?_PK$"< -M.#P"@`.OL```K[\`!`"`@"&L1)PT/`*``JQ`1E2.`@`0`$#X"8X$`!0,`'-Z -M`````!``__N.`@`0)[W_\`$J$"&OL0`$`("((:XF`!`DA``8`*`P(:XG`!2N -M(@`,KBD``*XJ``2N*0`(`B`H(:^_``ROL@`(K[````P`=]$!`)`A/`*``HQ% -M1G0F,`!(/`:``@(`("$DQM$D#`!^!@(`."$\`X`"E&1&4"0"``2N$0`L)(4` -M`:XB`#0D`@`!KB(`.*X@`#RN(`!XKB``?"8B`("D9490IB0`1"0#``4D8___ -MK$````1A__TD0@`$KC(`F`P`@40"("`A/`2``P(@*"$,`';M)(2]__`!*A`AK[$`!`"` -MB"&N)@`0)(0`&`"@,"&N)P`4KB(`#*XI``"N*@`$KBD`"`(@*"&OOP`,K[(` -M"*^P```,`'?1`0"0(3P"@`*,149T)C``2#P&@`("`"`A),;1)`P`?@8"`#@A -M/`.``I1D1E`D`@`$KA$`+"2%``&N(@`T)`(``:XB`#BN(``\KB``>*X@`'PF -M(@"`I&5&4*8D`$0D`P`%)&/__ZQ````$8?_])$(`!*XR`)@,`(%$`B`@(3P$ -M@`,"("@A#`!V[22$G#P"("`A#`"!*`(@*"&/OP`,C[(`"(^Q``2/L````^`` -M"">]`!`GO?_PK[```"2#`$BOOP`$C&(`*`"`@"$40``4`&`H(3P$@`,"`"@A -M#`!V[R2$G#R.`@`P4$```HX%`"".!0`LC@@`F(X)``"."@`$C@8`$(X'`!0, -M`'(H`@`@(8^_``2/L````^``"">]`!`,`'W$C&0`"!``_^L\!(`#)[W_\*^P -M````@(`A/`2``R2$G#ROOP`$#`!V[P(`*"$\`X`"C&)&5"1"``&L8D94/`*` -M`HQ$1DR,@P"<$'``'CP"@`*,0D9,%&+_^P!@("$\`X`"C&)&5"1"__\00``2 -M`````*QB1E0F!`!(#`!^(*8``$2.!``8)@,`&!"#``>/OP`$C&(`!*R"``2, -M8@`$K&,`!*Q$``"N`P`8C[````/@``@GO0`0#`!WA```("$0`/_M`````#P% -M@`*.`@"]`!`,`'>$`````!``__H`````)`/_^P"`*"&L@``X`$,0)#P$@`,D -MA)P\%$#_[*S"`#0,`'9[`````!``_^@`````)[W_\*^_````@#`A/`*``HQ# -M1E0D8P`!K$-&5(R"`#@00``))`/_^XR"`#0`@"@AK(``.`!#$"0\!(`#)(2< -M/!!```ZLP@`T/`.``HQB1E0D0O__$$``!0``("&L8D94C[\```/@``@GO0`0 -M#`!WA``````0`/_Z``````P`=GL`````$`#_\``````GO?_PK[\``#P"@`*, -M0T94)&,``:Q#1E2,@P!X+&(`"!!```H``Q"`/`.``B1C%?``0Q`AC$(```!` -M``@`````)`(`!*R"`'RL@`!X#`!RW@`````\`X`"C&)&5"1"__\00``%```` -M`*QB1E2/OP```^``"">]`!`,`'>$```@(1``__H`````)[W_\*^_``BOL0`$ -MK[```#P#@`.,<)PT/!&``HXB1E0D0@`!KB)&5(QBG#0D0P!(C&(`*!1``!$` -M8"@AC@(`-#P$@`,D`P`0`@`H(1!#``,DA)P\#`!VJJX#`#2.)$94#`!WA``` -M``"/OP`(C[$`!(^P```#X``()[T`$`P`?<2,9``($`#_[HX"`#0GO?_PK[`` -M`*^_``0\`H`#C$*<-!""`#L`@(`A/`*``HQ#1E0D8P`!K$-&5`P``@`@(3P#@`*,8D94)$+__Q!```8`````K&)&5(^_``2/L````^`` -M"">]`!`,`'>$```@(1``__D`````)(2]`!`,`'3F`````!`` -M__N/OP``)[W_\*^_``",I``L/`.``HQB1E0D0@`!K&)&5(R#`'@L8@`($$`` -M"@`#$(`\`X`")&,6,`!#$"&,0@```$``"``````D`@`'K((`?*R``'@,`'+> -M`````#P#@`*,8D94)$+__Q!```4`````K&)&5(^_```#X``()[T`$`P`=X0` -M`"`A$`#_^@`````0`/_N)`(``R>]__"OOP``/`.``XQBBW`D0@`!`$`@(0P` -M:5BL8HMP$`#_^CP#@`,\`H`#)$*+>`""$",GO?_P``(10Z^P`````H!``@*` -M(0`0$0`"`H`A`!`2``("@"$`$!0``@*`(0`0@",\`H`#)$*,&``02P`\!H`" -M/`B``@$B2"$E"!90```X(20*$``DQM&X)`4`'Z^_``BOL0`$#`!QZP"`B"$\ -M!(`#`B`H(0(`,"$,`';@)(2]`"`60/_X/`*``R1"BW@00/_U -M)%``H#P"@`,D0HMX$@+_\280_V`,`'*$`@`@(1``__H\`H`#)`(``12"_^@D -M`CJ8/`*``R11BW@``(`A#`!T>`(@("$F$/__)`+__Q8"__LF,0"@$`#_W20" -M.I@GO?_P)`0``:^_```,`'2@)`4ZF(^_```#X``()[T`$">]__```"`AK[\` -M``P`=*`D!3J8C[\```/@``@GO0`0`^``"``````\`H`")$+3?*R"```#X``( -MK(``!">]__"OOP``C((`!(R#````8/@)`$`@(8^_```#X``()[T`$">]__"O -MOP``/`*``XQ"G#0`@!@A`*`P(0!`("$,`'0Z`&`H(8^_```#X``()[T`$">] -M__`D`B[@$*(`!*^_``"/OP```^``"">]`!`D`@`!5(+__(^_```\!(`##`!T -MX22$G!@0`/_WC[\``">]__`D!``!K[\```P`=/LD!2[@C[\```/@``@GO0`0 -MK(``%*R%``"LA@`$K(@`"*R)``RLAP`0`^``"*R``!@GO?_PK[\```P`=:$` -M````C[\```/@``@GO0`0)[W_\*^P```\$(`#C@*<+!1```6OOP`$C[\`!(^P -M```#X``()[T`$$`(8````````0`@(3P!__\T(?_^`0%`)$"(8``````````` -M```````PA``!C@.<+(QB`!BN`IPLC&4`%*Q@`!1`"&```````#"$``$!!$`E -M0(A@`````````````````(QB``R,9@`0`$#X"8QD``".`IPL%$#_XH^_``00 -M`/_>C[```">]__"OOP``#`!U(0````"/OP```^``"">]`!!`"&````````$` -M*"$\`?__-"'__@$!0"1`B&``````````````````,*4``8R"`!0\!H`#)$(` -M`:R"`!2,@P`4)`(``1!B``H`````0`A@```````PI0`!`05`)4"(8``````` -M``````/@``@`````C,*<+*R"`!@0`/_TK,2<+">]__`PA``"$(``!:^_```0 -MH``#`*`@(0P`=5,`````/`.``HQB1E0D0O__$$``!0``("&L8D94C[\```/@ -M``@GO0`0#`!WA``````0`/_Z`````(R#```\`H`")$(Q>``#&(``8B@AC*(` -M`#P"@`(D0C)H`&(X(3P"@`(D0C'P`(`P(8RD````8A@A/`*``B1"MIA0@@`# -MC,(`"`/@``@`````K*(``(S"`!"L8@``$`#_^JSF``",@P``/`*``B1",7@` -M`QB``&(X(3P"@`(D0C)HC(4`"(SD````8C`A/`*``B1",?`0A0`#`&(8(0/@ -M``@`````/`*``B1"MIBLX@``K&```!``__FLP```/`2``XR"G"`40``1```` -M`$`(8````````0`8(3P!__\T(?_^`0%`)$"(8``````````````````P8P`! -M/`*``ZQ#G"@D`P`!/`*``ZQ#G"2,@IP@)$(``0/@``BL@IP@/`*``XQ#G"`D -M8___K$.<((Q"G"`40``,/`*``ZQ`G"0\`H`#C$*<*$`(8```````,$(``0$" -M0"5`B&```````````````````^``"`````!`"&````````$`,"$\`?__-"'_ -M_@$!0"1`B&``````````````````,,8``22"__HD`P`!/`6@P`!#&`0L@@`& -M$$``$S2E`!1``V``)`($``""$`0`0!`G`&(8)$"#8`````````````````!` -M"&```````##&``$!!D`E0(A@`````````````^``"`````",H@``,$(``0`# -M$`L0`/_SK*(``$`(8````````0`P(3P!__\T(?_^`0%`)$"(8``````````` -M```````PQ@`!)(+_^B0#``$\!:#``$,8!"R"``800``2-*4`%$`#8``D`@0` -M`((0!`!B&"5`@V``````````````````0`A@```````PQ@`!`09`)4"(8``` -M``````````/@``@`````C*(```!#$"40`/_TK*(``"R"``8D!0`$`((H"T`# -M:``D`@0``*(0!`!`$"<`8A@D0(-H`````````````^``"``````D`B[@$*(` -M`R0"``$#X``(`````!2"__T\`H`#K$"<)!``__H`````)[W_\"0$``&OOP`` -M#`!V0"0%+N"/OP```^``"">]`!`GO?_P```@(:^_```,`'9`)`4NX(^_```# -MX``()[T`$"0#``$\`H`"K$-&5"0%`!\D@P`$)*7__R0"__^L8```%*+__"1C -M``0D`P`%/`*``ZR```"L0YPP)`,``3P"@`,#X``(K$.<.">]__"OOP`$K[`` -M``"`@"$,`&DQC(0````"$(`"`H`AC@,`!(^_``2/L```)&+_Z``#$`H#X``( -M)[T`$">]_^"OL@`(K[$`!*^P``"OOP`0K[,`#(RS`"",HP`D`("`(0`3$(`` -MH)`A`&`@(11@`!X"`H@ACB(`!"9#`!@``"`A`'(@"R0#``$40``$`F,8!(X" -M````0Q`EK@(``(XC``148``+C&(`!*XD``0,`';1`D`@(8^_`!"/LP`,C[(` -M"(^Q``2/L````^``"">]`""L@P``K((`!(QB``2L9``$$`#_\JQ$```,`'=F -M`````!``_^&.(@`$C*<`("2C`!@`!1@*``<0@`"","&,P@`$`&`H(1!B`!(D -MR``$C&(``(QC``2L0P`$C*,`!*RE``2L8@``K*4``(T"```40``&)`(``8R# -M````XA`$``(0)P!B&"2L@P```^``"`````!08/_VC0(``(QC``!09?_RK,`` -M!(RB``2L8@`$C*(`!*RE``2L0P``K*4``!``_^JLPP`$/`6``XRCG#2,@@`@ -MC&,`(`!#$"H40``%)`,``8RBG#2,0@`T$$```P`````\`H`#K$.<.`/@``@` -M````/`*``R1"G#0`!C"``,(P(2>]__``H"`AK,4``*^_```,`',.`````(^_ -M```#X``()[T`$`/@``@``````^``"``````\`X`#C&*<,">]__"OOP``)$+_ -M_Q!```2L8IPPC[\```/@``@GO0`0#`!V_P`````0`/_[C[\``#P%@`.,HYPP -M/`*``Q1@`!:,1)PTC((`-!1``!,\`H`#C(,`("1"G#P``QB``&(8(8QB``10 -M0``$C&,`!(Q"``"L8@`$C&,`!"1B_^@``Q`*$$0``R0#``$\`H`#K$.<."0" -M``6LHIPP`^``"`````"LA0`(K(0`!`/@``BLA```)[W_\*^_```\`X`"C&)& -M5"1"``&L8D94)(3_Z(R"`#040``1/`*``XR#`"`D0IP\``,8@`!B&"&,8@`$ -M4$``!(QC``2,0@``K&(`!(QC``0D8O_H``,0"A!$``HD`P`!/`*``ZQ#G#@\ -M`H`"C$1&5`P`=X0DA/__C[\```/@``@GO0`0)`,`!3P"@`,0`/_VK$.<,(R& -M```DH@`8```8(13```0`11@+K(,```/@``BLI``DC,(`!*QF``"L8@`$C,(` -M!*S#``00`/_XK$,``(R#```08``,)&+_Z(QE``!0HP`)K(```(QB``2LH@`$ -MC&(`!*QC``2L10``K&,``*R%```D8O_H``,0"E1```&L0``D`^``"`````"L -MH``DC(,``"2B`!@`!1`*$$,`"@!`*"&,0@``C*,`!*Q#``2,HP`$K*4`!*QB -M``"LI0```^``"``````00/_]`````(Q#```08@`)`````(Q"``2L8@`$C*(` -M!*RE``2L0P``K*4```/@``BL@P```^``"*R````GO?_PK[$`!*^_``ROL@`( -MK[````"`B"$6(``%/!*``SP"@`.,0IPL%$``+P````".4)PTC@(`-!1```0\ -M`H`#C$*<.!!``!,`````/`2``PP`=FPDA)P\$@(`"0!`("$\`X`#C&*]`!`\`H`"K%%&5!``__B/OP`,#`!U3#P2@`,0 -M`/_/`````">]__"OOP``#`!WQ@`````\!(`#)[W_\*^_```,`'9L)(2]__"OL````,`H(:^_``0,`'<;`("` -M(:X``!BN```,K@``$(^_``2/L````^``"">]`!`GO?_PK[$`!*^_``ROL@`( -MK[```(R2``@`@(@A`+(0*A1```]`!`,`'/B`````!``__N/OP``)[W_\*^_```` -MH#`A#`!WWHRE`""/OP```^``"">]`!`GO?_PK[\```P`=_8`````C[\```/@ -M``@GO0`0)[W_\*^_```,`'@"`````(^_```#X``()[T`$">]__"OOP``#`!W -MW@``,"&/OP```^``"">]`!`GO?_PK[\```P`>`(`````C[\```/@``@GO0`0 -M)[W_\"0"*OBOL0`$K[```*^_``@`H(@A$*(`%@"`@"$D`BKX$B(`!@````"/ -MOP`(C[$`!(^P```#X``()[T`$!8`__H\`H`#)%&]__`D!``!K[\```P`>#PD!2KXC[\```/@``@GO0`0 -M)[W_\```("&OOP``#`!X/"0%*OB/OP```^``"">]`!"LA0```^``"*R```0G -MO?_PK[$`!*^P``"OOP`,K[(`"#P"@`,`@(`AC%*<-"01``$\`X`"C&)&5"1" -M``&L8D94C((``!!``!<\!(`#$B``!`````".`@``)$+__ZX"```\`X`"C&)& -M5"1"__\00``)`````*QB1E0"(!`AC[\`#(^R``B/L0`$C[````/@``@GO0`0 -M#`!WA```("$0`/_V`````(R#G#0D`@`!K&(`>(R"G#0,`'*ZK$``?`)`*"$, -M`'=$)@0`!#P"@`(,`'>$C$1&5(Y#`'PH8@`$%$``!BAD``94@``$``"((20" -M``808@`(`````(X"```40/_3`````!8@_^<\!(`#$`#_U``````,`'-Z```` -M`!``__>.`@``)[W_X*^Q``2OOP`0K[,`#*^R``BOL```/`6``P"`B"&,LIPT -M/`.``HQB1E0D0@`!K&)&5(RCG#0D`@`#``!`(0``2"&L8@!XC**<-*Q``'R, -MI)PT#`!^-R2$`$B.0@!\CB,``!1@``,L4``!%@``(CP#@`,\`H`#C$*<-"1% -M`$B,H@`H%$``&``````2```$`````(XB```D0O__KB(``#P#@`*,8D94)$+_ -M_Q!```H`````K&)&5`(`$"&/OP`0C[,`#(^R``B/L0`$C[````/@``@GO0`@ -M#`!WA```("$0`/_U``````P`?<2,I``($`#_Y@````",8IPT)!,``ZQ3`'B, -M8IPT#`!RNJQ``'PF)``$#`!W1`)`*"$\`H`"#`!WA(Q$1E2.0P!\*&(`!A!` -M``TD`@`&*&(`!%!```,``(`A4',``0``@"&.(@``%$#_R3P"@`,6`/_G/`.` -M`Q``_\4`````5&+_^8XB```,`'-Z`````!``__6.(@``)[W_\*^P``"OOP`$ -M)!```3P"@`*,0T94)&,``:Q#1E2,@@``&$``$21#__^L@P``/`.``HQB1E0D -M0O__$$``!P``("&L8D94`@`0(8^_``2/L````^``"">]`!`,`'>$`````!`` -M__@`````$`#_\```@"$GO?_PK[\`!*^P````@!@A/!"``HX"1E0D0@`!K@)& -M5(R"``",A0`$)(0`!"1"``$4H``.K&(``(X"1E0D0O__$$``!@``("&N`D94 -MC[\`!(^P```#X``()[T`$`P`=X0`````$`#_^0`````,`'=3`````"0#``>L -M0`!XK$,`?`P`]__"OOP``#`"!:B2$``B/OP```^``"">]`!`GO?_@K[,` -M#*^Q``2OOP`0K[(`"*^P```\`H`#`("((8Q2G#0D$P`!/`.``HQB1E0D0@`! -MK&)&5(R"``Q00``&CB,`#"9#`!B,8@`0)$(``:QB`!".(P`,)`(``E!B`%F. -M)0`0DB(``!1``"X\`X`#4F``%HXB``PD`@`!KC(`!*(B```\`X`"C&)&5"1" -M__\00``*`````*QB1E0"8!`AC[\`$(^S``R/L@`(C[$`!(^P```#X``()[T` -M(`P`=X0``"`A$`#_]0````!00``&CB,`#"9#`!B,8@`0)$+__ZQB`!".(P`, -M)`(``1!B``D`````CB,`#"0"``(48O_A``````P`>#4F1``8$`#_W0`````, -M`'@G)D0`&!``__:.(P`,C&*<-"00``&L4`!XC&*<-`P`"XF -M1``8$`#_I0`````GO?_PK[```*^_``0`@"@A)!```3P"@`*,0T94)&,``:Q# -M1E20@@``5$``$```@"$\`H`#C$*<-(R#``R@L```)$8`&`#`("$08``$K*(` -M!(S"`!`D0@`!K,(`$(RC``PD`@`"$&(`$``````\`X`"C&)&5"1"__\00``' -M```@(:QB1E0"`!`AC[\`!(^P```#X``()[T`$`P`=X0`````$`#_^``````, -M`'@NC*4`$!``_^X`````)[W_\*^P``"OOP`,K[(`"*^Q``0`@(`A/`*``HQ# -M1E0D8P`!K$-&5(R"``@40``K))(`"(X"``Q00``'C@,`#(X#``0D8P`8C&(` -M$"1"__^L8@`0C@,`#"0"``%08@`;C@0`!(X#``PD`@`"4&(`$XX$``2N```$ -MH@```#P#@`*,8D94)$+__Q!```@`````K&)&5(^_``R/L@`(C[$`!(^P```# -MX``()[T`$`P`=X0``"`A$`#_]P`````,`'@U)(0`&!``_^RN```$#`!X)R2$ -M`!@0`/_DC@,`#`P`=U,"0"`AC@,`#`!`B"$D`@`!4&(`"(X%``0D`@`'KB(` -M?*X@`'@,`'+>`B`@(1``_\J.`@`,)B0`&`P`>"`"0#`A$`#_]B0"``]`!`GO?_````H(20&`"ROL``PK[\` -M-`P`<*H`@(`A)`+__Z.B`"BOH@``KZ(`!*^B``BOH@`,KZ(`$*^B`!2OH@`8 -MKZ(`(*^B`"0\`H`"C$1&6*.@`!P\`X`"C&)&5"1"``&L8D94`Z`P(0P`@/4D -M!0!>#`"!S`````"/H@`$7$```:X"``"/H@`(7$```:X"``2/H@`,7$```:X" -M`!R/H@`07$```:X"`""/H@`87$```:X"`"@"`!`AC[\`-(^P`#`#X``()[T` -M0">]__`T`K>8K[$`!*^P``"OOP`(`*"((1"B``\`@(`A-`*WF!(B``6/OP`( -MC[$`!(^P```#X``()[T`$%8`__N/OP`(/`2``PP`@>4DA)S$$`#_]H^_``@\ -M!8`#)*6B(#P&@`0\!(`#)`(``0#%,",DA)S$%@+_Z@``."$,`(';`````!`` -M_^8)[W_\"0$``&OOP``#`!ZIS0%MYB/OP```^``"">]`!`GO?_P```@ -M(:^_```,`'JG-`6WF(^_```#X``()[T`$)""``PPI?__``4:`C1"`("@@@`, -M,$(`?Z"#``2@A0```^``"*""``PGO?_P/`6@P#P&__ROOP`$K[```#2E`"`0 -M@``;-,;__XR#```D`@`#-&,``P!@@"&L@P``C*,```!F&"2LHP``H@``!`P` -M:^2B`@`,/`,;3C1C@;4`0P`9`@`@(0``$!```A."#`!ZV@!`*"$D`@`'H@(` -M"(^_``2B```$C[````/@``@GO0`0/`*``A``_^0D1$9@$(``$#"E`/^,A``` -M`X`8(3P<@`,GG,:PD((`%#!"`"`00/_]`````*"%``"0@@`4,$(`(!!`__T` -M`````^``"`!@X"$\`H`"$`#_[R1$1F`0@``,/`*``HR$`````!@AD((`%#!" -M``$00``$`````)""```D`P`!H*(```/@``@`8!`A$`#_]"1$1F`GO?_@K[`` -M$*^_`!BOL0`4`("`(0.`B"$\'(`#)YS&L!"```T\`H`"`@`@(0P`>QT#H"@A -M$$#__0(`("$"(.`ADZ(``(^_`!B/L0`4C[``$`/@``@GO0`@$`#_\R101F`G -MO?_@K[(`"*^Q``2OL```K[\`$*^S``P`@(@A`*"0(0#`@"$#@)@A/!R``R>< -MQK`0@``5/`*``@(`$"$40``))A#__P)@X"&/OP`0C[,`#(^R``B/L0`$C[`` -M``/@``@GO0`@DD4```(@("$,`'L))E(``0(`$"$40/_Z)A#__Q``__`````` -M$`#_ZR111F`GO?_@K[(`"*^Q``2OL```K[\`$*^S``P`@(@A`*"0(0#`@"$# -M@)@A/!R``R>]`"`0`/_B)%%&8">]_\"OL@`(K[\`$*^S``ROL0`$K[```*^F`"BOIP`L -MKZ@`,*^I`#2OJ@`XKZL`/```D"$#@)@A/!R``R>]`$`TA``4C(,``"8B__H`11`$`&(8)1``__&L@P``C[``*`P`:^2, -MD0````(1`@!0`!M2```!```!S9(C``0"("`AHB``!#!P`/\``!`2,$+__PP` -M>MH`0"@AHC``!!``_]\`````C(,``#P"@`*,4D9LK$!&;)!B``0P4`#^H'`` -M!(R1``@J(@`&$$``"SP$H,!``V``)`($``(B$`0`0!`G`&(8)$"#8``````` -M`````!``_\H`````-(0`%(R%```F(__Z)`(``0!B$`0PHP`!```H(0!B*`H0 -M`/_`K(4``!``_[Z,D@`(C)(`!(^B`"@0`/^ZK((`!!``_YPD1$9@)[W_X*^P -M`!"OOP`8K[$`%`"`,"$`H(`A``!`(0.`B"$\'(`#)YS&L!"``"8D!P`$C,0` -M""B"``8`XB`*0`-H`"0"!```@A`$`$`0)P!B&"1`@V@````````````````` -MC,8```.@("$D!0`!D,(`"#!#``X09P`+K@```"0"``P08@`(``````(@X"&/ -MOP`8C[$`%(^P`!`!`!`A`^``"">]`""0P@``#`!MEJ.B```00/_U)`@``20" -M``$0`/_RK@(``#P"@`(0`/_9)$9&8">]__`\`H``K[(`"*^_``ROL0`$K[`` -M`"1"`P",0@`T`$#X"20$__\`0)`A/`*``HQ$1F@D`@`!/`6@P"2#__H`8A@$ -M*((`!A!``#,TI0`40`-@`"0"!```@A`$`$`0)P!B&"1`@V`````````````` -M````/!"``B801F`\$8``)C$#``P`>N0"`"`ACB(`-`!`^`D``"`ACB,`%#P" -M@`(D0NT0K'```*QB``0\`H`")$+MH*QB``@\`H`")$+L)*QB``P\`H`")$+L -ML*QB`!`\`H`")$+NX*QB`!0\`H`")$+PO*QB`!@\`H`")$+N,*QB`!R.(@`T -M`$#X"0)`("&/OP`,C[(`"(^Q``2/L````^``"">]`!",H@``,$(``0`#$`NL -MH@``$`#_TSP0@`(\`X`"C&)&<">]__`00``$K[\``(^_```#X``()[T`$"0" -M``$,`'QCK&)&]_]"O -ML@`8)`+__R2R__^OL0`4K[\`(*^S`!ROL``0$D(`:P"`B"$\`X`"C&)&5"1" -M``&L8D94CB0`"(XE``R.(P`0```0(0""("$`HR@A`*,P*P"&("$GLP`(KB0` -M"*XE``P"8"`A`B`H(:^@```,`((1KZ``"(^P``@2```B`B`@(5(```R.`P`8 -MC@,``%!P``BOH``(C@(`!*QB``2.`@`$KA``!*Q#``"N$```KZ,`"(X#`!B. -M(@`(`$,0*U1``&./HP``CB(`"%!B`%F.`P`]`!`,`'>$```@ -M(1``__@`````C@(`&(X#`!R.!@`@C@<`)`!G&"$`9R@K`$80(0!%$"&N`@`8 -MK@,`'`P`?ED"`"`ACB,``%1@``.,8@`$$`#_X:XP``"N`P``K@(`!(QB``2L -M<``$$`#_VZQ0``",@@`,`$,0*U1`__..(P``C((`#!``_\B.`@`,)[W_\*^_ -M```\`H`"C$-&5"1C``&L0T94C((``!"B`!8`````C*(``(RC``2L0P`$C*,` -M!*RE``2L8@``K*4``*R@`"@\`X`"C&)&5"1"__\00``%```@(:QB1E2/OP`` -M`^``"">]`!`,`'>$`````!``__H`````4*#_\JR@`"B,HP``4&7_[JR```", -MH@`$K&(`!(RB``2LI0`$K$,``*RE```0`/_FK(,``">]_^"OI0``)`4``:^_ -M`!2OL``0KZ8`!`P`?+P`@(`ACZ(``(^_`!2N`@`4CZ(`!*X"`!B/L``0`^`` -M"">]`"`GO?_PK[\```P`?,,`````C[\```/@``@GO0`0```0(0``&"&LA0`( -MK(8`#*R'`!"L@``HK(0`!*R$``"L@@`8K(,`'*R"`"`#X``(K(,`)```$"$` -M`!@AK(4`"*R&``RLAP`0K(``**R$``2LA```K((`&*R#`!RL@@`@`^``"*R# -M`"0GO?_PK[```*^_``2,@@`H`("`(11```T`@"@AC@,``!!P``>/OP`$C@(` -M!*QB``2.`@`$KA``!*Q#``"N$```C[````/@``@GO0`0#`!]Q(R$``@0`/_R -MC@,``">]_^"OM0`0K[0`#*^S``BOL@`$K[```*^_`!2,@@`H`("`(0"`*"$` -MP)`A`."8(0$`H"$40``0`2"H(8X$``BN$@`8KA,`'*X4`""N%0`D#`!]=@(` -M*"&/OP`4C[4`$(^T``R/LP`(C[(`!(^P```#X``()[T`(`P`?<2,A``($`#_ -M[XX$``@GO?_@K[(`"*^_`!2OM0`0K[0`#*^Q``2OL```C((`((R*`"0`0%@A -M`$H0)1!``!H`@)`AC((`"(R0`"",D0`DC)0`&(R5`!R,0P`,C$(`"`(`,"$` -M<1@A`'$@*P!0$"$`1!`A`%1`(P!U("L!!$`C`'5((R4E__\LHO__)03__P"" -M("$!:!`K%$``#0(@."$1:``)`4D0*X^_`!2/M0`0C[0`#(^R``B/L0`$C[`` -M``/@``@GO0`@4$#_^(^_`!0,``-$``````(C`!D``"`0```H$@*E."$````` -M`(``$W(B````Y1`K`.`H(7!P`````"`2`H0P(0#","$`P"`AKD0`&*Y%`!P0 -M`/_DC[\`%">]_^`\`H`"K[\`%*^P`!`D0T9XC&,`!(Q"1G@`@(`A`&`P(0!` -M*"&OHP`$#`!][Z^B```\"(`"/`F``B8$`!PE"/LD)2G[="0%``4D!@`!#`!U -M$@(`."$,`&OO`````#P#@`*L8D?<0(!(`````````````````$""6``````` -M```````````,`'6()@0`'`P`=@PD!``%/`*``JQ01G2/OP`4C[``$`/@``@G -MO0`@)[W_\*^_```,`&OO`````#P#@`*L8D?<0(!(`````````````````$"" -M6``````````````````,`'8S)`0`!8^_```D`@`#`^``"">]`!`GO?_PK[\` -M``P`?-@`P"`A/`2``PP`=O$DA)P\C[\```/@``@GO0`0)[W_\"0"-K"OL0`$ -MK[```*^_``@`H(@A$*(`$0"`@"$D`C:P$B(`!CP"@`./OP`(C[$`!(^P```# -MX``()[T`$!8`__HD4:#8#`!U&B8D`!P,`'W_`B`@(1``__6/OP`()`(``52" -M_^\D`C:P/`2``PP`?ITDA*#8$`#_ZB0"-K`GO?_P)`0``:^_```,`'[G)`4V -ML(^_```#X``()[T`$">]__```"`AK[\```P`?NMC@`8`.@8(8QB``0DZP`(-$(``1``_]NL8@`$+0("`!!``((` -M"!I"``@@P@`$$,`!@A`A)$H`"(V#``R-20`(``0@@B0"``$`@A`$`&(8):V# -M``RLZ@`,K.D`"*TG``RM1P`(*6,``"5B``,!8Q`*C88`#``"$(,D`P`!`$,@ -M!`#$$"M40``[C80`$`"&$"040``,``L0P``$($`D`O_\`6(0)`"&&"048``% -M)$L`!``$($``AA`D$$#__25K``0`"Q#``8(0(21)``@!8&@A`2!0(8U'``Q0 -MZ@`.)6L``8SB``0D`__^`$-`)`$%,",HP@`04$``/XSI``@$PP`U`.@8(8SG -M``Q4ZO_WC.(`!"5K``$Q8@`#%$#_[B5*``@QH@`#)2G_^!!``"4EK?__C2(` -M"!!)__LQH@`#C8,`#``$($``9!`K5$``"HV$`!`0@``'`(,0)%1`_]H`"Q#` -M``0@0`"#$"00`/_[)6L`!(V$`!`D`__^C((`!`!#$"0`11@K%&``!`!%,",H -MP@`04$```P"`."$0`/]Z``!8(33#``$`A2`A-*(``:SB``2MA``0K(,`!!`` -M_W(DZP`(C8(`#``$&"<`0Q`D$`#_VZV"``R,8@`$C.H`#(SI``@T0@`!).L` -M"*QB``00`/]DK4D`"(SJ``P`Y4`A-*(``0$&&"$TQ``!K4D`"*SB``2MB``8 -M).L`"*QF``"M!``$K0X`"!``_W*M*@`,$&``!@`((,(L8@`%$$``'BQB`!4` -M"!&")$0`.``$$,`!@A`A)$H`"(U)``@1*@`1)(,``XTB``0D`__^`$,0)`$" -M$"M00/]XC2H`#(TI``@1*@`&)`/__HTB``0`0Q`D`0(0*U1`__J-*0`($`#_ -M;HTJ``PH@@```&(@"XV#``P0`/]E``0@@Q1`_^0D9`!;+&(`51!```0L8@%5 -M``@3`A``_]XD1`!N$$``!"QB!54`"!/"$`#_V21$`'=00/_7)`0`?@`(%((0 -M`/_4)$0`?!!@``8`!5C"+&(`!1!``!TL8@`5``41@B1+`#@`"Q#``8(0(21* -M``B-1P`,4.K_'25K``&,X@`$)`/__@!#0"0!!3`C*,(`$%!```8E:___!,,` -M!@#H&"&,YP`,5.K_]XSB``00`/\/)6L``8QB``2,Z@`,C.D`"#1"``$0`/[_ -M).L`"!1`_^4D:P!;+&(`51!```0L8@%5``43`A``_]\D2P!N$$``!"QB!54` -M!1/"$`#_VB1+`'=00/_8)`L`?@`%%((0`/_5)$L`?`"`6"$0H`!````8(22I -M__B-)@`$)`+__HR$`!``PD`D`2A0(8U#``011`!U`&(8)#C"``$P0@`!K4,` -M!!!```H``&`AC*7_^"5B`!`!)4@CC20`"!""`&@!!4`AC2<`#*SD``BLAP`, -M`4,0(9!"``]_]"OL@`8K[\` -M**^U`"2OM``@K[,`'*^Q`!2OL``0`("0(3P"@`*,0T94)&,``0P`@&6L0T94 -M`$"H(8Y"!!`00``:)E0$$*^@```,`'=3`H`@(8Q3`$`"0"`A`$"`(0P`?S2. -M90```$"((0(`("$00``L`@`H(20"``>N`@!\#`!RWJX``'BN<0`$CD($$%1` -M_^XF5`00CZ(``!1``!<`````#`"!:@.@("$\`X`"C&)&5"1"__\00``,```` -M`*QB1E0"H!`AC[\`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P -M#`!WA```("$0`/_S``````P`=U,#H"`A`$`H(0P`=T0"@"`ACZ(``!1`__D` -M````$`#_X0`````,`'=$`Z`@(1``_]B.0@00)[W_\*^_```\`X`"C&)&5"1" -M__\00``%```@(:QB1E2/OP```^``"">]`!`,`'>$`````!``__H`````)[W_ -M\*^P``"OOP`$#`!_%P"`@"&N``00C[\`!(^P```#X``()[T`$">]__"OL``` -MK[\`#*^R``BOL0`$`("`(3P"@`*,0T94)&,``:Q#1E2,@@00))($$!1``!," -M0(@A/`.``HQB1E0D0O__$$``"@````"L8D94#`"!:@)`("&/OP`,C[(`"(^Q -M``2/L````^``"">]`!`,`'>$```@(1``__4`````#`!W4P(@("$D`P`%K$,` -M?*Q``'@,`'+>`$`@(8X"!!`40/_W`````!``_^,`````C*<``!#@``8`@!@A -MC(8``%3```6,X@`$K(<``*R@```#X``(`````(S$``2LP@`$C&,``*SD``2L -M0P``$`#_]ZR'``!-96UO6YC179T1&ES<&%T8VA,;V]P`````%1A0@`!8 -M*(``6%2``%AH@`!9%(``68R``%H@@`!:/(``6G"``%J$@`!:F(``6JR``%L( -M@`!;6(``5^"``%N8@`!7X(``5^"``%?@@`!7X(``5^"``%NP@`!;V(``6_R` -M`%PT@`!D@`!X`"1)9#H@+R]D97!O="]S=R]B -M`Y*#`[``0Q`C +M)$+__Q``_PNB`@`]``(8P`!B&",``QB``'08(8QB`"P01/[Y`````!``__62 +M@@`#)[W_L``*5@`Q:P#_K[<`/*^V`#BOM0`T`("P(:^T`#"OL0`D`*"H(:^_ +M`$2OO@!`K[,`+*^R`"BOL``@`,"((:^H```!(*`A``J^`PP`.H@!8)K``E!!@``2,4P`\ +M)`(``5""`8^28@.O`!'P0`/0D"&21``!CZ,``#""`/\08`$CKZ(`#"0"``$0 +M8@$9)(,`(Y("`#PF)0`!`*(0*A!``!H`!1#``$40(P`"$(``4Q`A``480`!P +M("$D1@`L`!$0P`!1$",``A"``%,0(8Q#`"R,P@```]`X(22E``$40P`*),8` +M')#C``&0@@`!`$,0*U1```&@@P`!D@(`/`"B$"H40/_N)(0``EH@`!62`@`^ +M@@(`)H($`"<`$1A``'`H(21"__X`1!@J@*8```"#$`L``A8```(>`R3"``(` +M0Q`J$$``Y9"D```D@@`$H*(``"0$``&B$0!]`%`0`/^3H,(``#(F`/\F +M!P`]#`!3R0)@("&/I0`($`#_2JX%`%@D8P`"`,,0*A!`_QHD@@`"$`#_&:"C +M```P8@#_+$(`911`_N6B0P`!)`(`9!``_N*B0@`!*H,`"B0"``D`0Z`*/`*` +M`B1"4[``%!B`CZ4`#`!B&"&,8P````40P@""$",``QC"`$,0(:)"``&/J``$ +M`L`@(0*@*"$"@#`A#``RY@+@."&2`@`HD@,`)I(%`#ZB`@`IH@,`**(7`":/ +MH@`(,*0`_Q"```.N`@!0$)$`-2J"``)>@/\'`!&00)(#`%TD`@#_$$,``B1B +M``&B`@!=`!$0P`!1$",``A"``%,0(21'`#"`X@`(`N(0*E1`_OD`$9!`C@(` +M,%(B``6.`@`LKA$`,*X``"RN```TC@(`+(X#`#0D0@`!`'<@(2A#``2N!``T +M%&#^ZJX"`"RN```LK@``-`/0*"$D@@`"@*8``"A#```DA``%`(,0"P`"$(,D +MPP`"`$,0*A!```>0HP``@.(`"`!&$"H00``$)`0``21B__^@H@``)`0``1`` +M_M2OI``05$```Z(%`#T0`/_)H@``/I)"``$L0@`N5$``!*(``#XD`@`4HD(` +M`:(``#Z.8@.DCZ,`"``"$$(`8A`C$`#_O*X"`%@D0@`!`B(0*A!`_G``$?!` +MDF(#L``10,`!$1@C`B(H(0`%$,``11`C``,8@``"$(``]`"`0`/_Y`.`0(12@``,``````^`` +M"*R`!:@$H@`,C(,<(!B@``8D`@`%C(,<(%!B``2,@@6H`^``"`````",@@6H +M`$40(0/@``BL@@6H)`(`!11B__,`````$`#_]@`````DI?__)[W_X"RB`".O +MM0`4K[0`$*^R``BOL0`$K[```*^_`!BOLP`,`("((0#`D"$`X(`A`0"H(1!` +M``L``*`A/`.``@`%$(`D8Q98`$,0(8Q"````0``(``````P`+'$`X"@A`$"@ +M(5:@``&NM```C[\`&(^U`!2/M``0C[,`#(^R``B/L0`$C[````/@``@GO0`@ +M$`#_]*XG&]RN)QPX$`#_\:R`&]P0`/_OKB<;S!``_^VN)QMH$`#_ZZ8G&^`0 +M`/_IKB<;Y!``_^>L@`6H$`#_Y:XG&]@0`/_CKB<;N!``_^&B)QN_$`#_WZ(G +M&^D0`/_=KB<;T"2$&Z8,`'(``.`H(1``_]@`````/!.``XYDFE00@``&/`*` +M`XQ"FE@01@`*``````P`>\T`````#`![N@)`("&N8II4/`*``ZQ2FE@\$X`# +MCF2:5%2```,"`"@A$`#_Q"04``(,`'(``D`P(8YBFE00`/^_KB(<`!``_[VN +M)QML$`#_NZXG&\`0`/^YKB<;H!``_[>F)QO($`#_M:8G&\00`/^SIB<;QA`` +M_[&F)QO*,.(`_Q``_ZZL@ALX,.(`_Q``_ZNL@AL\$`#_J:XG&S2,@@`$`.`H +M(0P`&>2,1```%$```@!`H"&N,!OP$`#_H*XP&^P0`/^>KB<=U">]__"OL``` +MK(4;"`"`@"&OOP`$#``4<20%``&.!1L(#``LO0(`("$"`"`A#``4<0``*"&/ +MOP`$C[````/@``@GO0`0)[W_\*^_```,`&RO`````(^_```#X``()[T`$">] +M_]"OL0`$K[````"@B"$`@(`A/`6``*^_`"2OO@`@K[<`'*^V`!BOM0`4K[0` +M$*^S``ROL@`(`."8(3#2__\!`*`A`2"H(0%`\"$!8+`A#``IAH^W`#0,`'+> +MC@08"`(`("$``"@A```P(0P`+.T``#@A%N``$P`6*"LR(S<`)`(E`*82&W"F +M$QN`HA0;@J(5&X.N$1MT$&(`8```*"$D`A4`4&(``20%``&.!!A`#`!RWJX% +M&`0,`',E)@07[``6*"L,``I(`@`@(0P`")4"`"`A#`!REP`````,`'(8```` +M`"8%&W`#P#`A#``WV`(`("&/HP`P$L``.:QB```,`'(=``````P`]_^`LH@`/K[4`%*^T`!"OLP`,K[(`"*^Q``2OL```K[\` +M&`#`H"$`X(`A`0"H(0``B"$``)`A$$``4@``F"$\`X`"``40@"1C%N0`0Q`A +MC$(```!```@`````$.``'202`-``X!@A)((;'"2%&UR,1@``C$<`!(Q(``B, +M20`,K&8``*QG``2L:``(K&D`#"1"`!`41?_V)&,`$"2#&_@F`@!`)(0;:(R% +M``",A@`$C(<`"(R(``RL10``K$8`!*Q'``BL2``,)(0`$!2#__8D0@`0%F`` +M!P`````60``#`````%8```&N$0``5H```:Z2``!6H``!KK,``(^_`!B/M0`4 +MC[0`$(^S``R/L@`(C[$`!(^P```#X``()[T`((R"&W00`/_K``*+`A``_^F4 +MD1MP$`#_YXR1&RP0`/_EC)$;,!``_^.,D1M($`#_X8R1&TP0`/_?C)$;4!#@ +M_]TD$@`&)(4;K"0&``8,`'(``.`@(1``_]<`````$`#_U8R1&U00`/_3)!,` +M#A#@_]$D$@`0`.`H(0P`+%LD!@`0$`#_S``````0`/_*C)$;\`"`."$``#`A +M$*``"```&"$`QQ`&),8``3!"``$``QA``,4@*Q2`__H`8A@E`^``"`!@$"$G +MO?_PK[(`"*^Q``2OL```K[\`#(RB`$PDL``(`*"((9!*`$",2P`\K*``'(RC +M`!P`"A#``$H0(P`"$("LHP`8`$M`(9$%`#2.`P`,C@<`!"0"_^``8A@D,*4` +M'R0"[_\`XC@D`&48):X'``2N`P`,C0,`+"0"``,`@#@A$&(`*P#`D"&.`P`( +MC@0`!#P"__`T0O__`&(8)#P"`0``@B`E/`(``0!B&"6N!``$K@,`"(XB``@\ +M`P`_/`3A_P!#$"4TA/__,D,`#P!$$"0``QY``$,0):XB``B.`@`$/`/_#S1C +M__\`0Q`D/`,`,`!#$"4\`P8``$,0):X"``2.(@`(CB0`)#P#`(``0Q`EKB(` +M"*XD``"/OP`,C[(`"(^Q``2/L````^``"">]`!".(@`(/`.``#P%_@\`0Q`E +MKB(`")"$'02,YAQ8C@,`#``$$,``1!`C``(0@`!&$"&00@`T-*7__P!E&"0P +M0@`?``(5``!B&"6N`P`,C0,`+#P"@`*0Y!W,)$)3H``#&(``8A@ACB4`")3H +M'=*,8@````1(0`$D2"$PI0__`6`@(0%`,"$`0/@)```X(8X#``@D!(``,$)_ +M_P!D&"0`8A@E$`#_K:X#``@GO?_@K[``$`"@@"$#H"@AK[$`%*^_`!@,`"WP +M`("((5(```$```'-CZ,`!(^B```T"8````,=@``"$H(`8A@E`'`X(0#P$"$D +M0O__`%``&XXC``"6)1N&-`B```!I&"$R"O__```0$@``````````<%`X`JQG +M`"B.(@````<8P"1F__P`21`AK$8`+(XB```D9O^P`.4@(0!)$"&L1@`PCB(` +M`"3C``$`92`*`$@0(:Q$`#2.(@``/`,`@`(#,"4`2!`AK$8`((XB&XP00``A +MC[\`&(XB``".)1N4`$@0(:Q*`0".)```CB,;C`"(("&,@@$```,<`#!"__\` +M0Q`EK((!`(XB&Y".(P```.(0(0!H&"$P0O__K&(`_!"@``>.(@``/`0``@!( +M$"&,0P#\`&08):Q#`/R.(@``/`0``0!)$"&,0P#\`&08):Q#`/R/OP`8C[$` +M%(^P`!`#X``()[T`(">]_]"OL@`(,)(`_Z^W`!ROM@`8K[4`%*^T`!"OLP`, +MK[```*^_`""OL0`$`*"@(0#`J"$`X+`A`0"X(0$@@"$!0)@A$D``#"0"``&/ +MOP`@C[<`'(^V`!B/M0`4C[0`$(^S``R/L@`(C[$`!(^P```#X``()[T`,`P` +M>[HD!``L`$"((1(@__$D`@`"`B`@(0``*"$,`'(-)`8`+"0"``*N\0``/`:` +M`:("```D`@`*)B@`&"3&;X@``"`A```H(0(@."&B8@``KC0`!*XU``BN-@`, +M#`!AO*(@```,`'NZ)`0%$`!`@"$00``JKB(`%`!`("$``"@A#`!R#20&!1`F +M!P`(K@<`#*X0``2,Y@`$K@``"*X````"`"`A```H(22E``$D@@`0+*,`0*R` +M`!"LP@``)(0`%!1@__D`0#`A`B`@(0)`*"$,`&"3K.(`!!1```,`````$`#_ +MO```$"$,`&&K`B`@(8XE`!@,`&'J`D`@(8XD`!0,`'O-`$"`(0P`>\T"("`A +M`@`0(1``_Z^NX```#`![S0(@("$0`/^K)`(``B>]__`LH@`$K[(`"*^Q``2O +ML```K[\`#`"@B"$`@(`A%$``"`#`D"$D`O__C[\`#(^R``B/L0`$C[````/@ +M``@GO0`0#`!B=)"$``"2!````!$0@`!0$"$,`&*%K%(`'!``__(``!`A,*4` +M_R>]__`LH@`*K[\``!!```TD!___/`.``@`%$(`D8U/@)*4``0!#$"$0@``& +M,*4`_XQ'```,`&.1C(0`$"0'__\``C@*C[\```#@$"$#X``()[T`$#"E`/\G +MO?_P+*(``J^_```00``()`/__R2E``$0@``%,*4`_PP`8\*,A``0)`/__P`" +M&`J/OP```&`0(0/@``@GO0`0)[W_\*^_````@%@A,*,`_Q$``!@PQ@#_/`*` +M`I!"5`A00``5C6D`%%#```^,A``$)`(``5#"``2,A``$C[\```/@``@GO0`0 +MC6(`#"1E__\`X#`A,*4`_P!`^`D!`#@A$`#_]X^_``"-8@`($`#_^"1E__^- +M:0`4C20`"!"`_^\E*@`(C((``!1```*M(@`(K4H`!#C"``$L0@`!)&/__Z"# +M``B@@@`)H(``!*R'``RLB``0C2(`!*R```"L1```/`*``I!"5`@40/_]`!``0/@)C(0`!!``__N/ +MOP``C(8`%"0%``&,PP`($&#_]23'``B,8@``%$```JS"``BLYP`$)`(``:!B +M``2L:``(C,(`!(R$`!BL8```K,,`!`P`8>:L0P``$`#_YX^_```GO?_@K[,` +M#*^Q``2OL```K[\`%*^T`!"OL@`(`("((8XR`!20A```#`!BEB93``B.4``` +M#`!BKY(D```2```EC[\`%`P`8I:2)```CD(``(X4``",0@``%$```JY"``"N +M4@`$#`!BKY(D``"2`@`$)`,``5!#`">.`@`(5$``!P(`("&2`@`)4$``()(% +M``A00P`7D@4`"`(`("$``"@A#`!R#20&``P,`&*6DB0``(YB``2N````KG`` +M!*Q0``"2)```#`!BKP*`@"$6@/_=C[\`%(^T`!"/LP`,C[(`"(^Q``2/L``` +M`^``"">]`"".(@`,CB0`!(X&``P`0/@)C@<`$!``_^4"`"`A$`#_^8XB``@` +M`A"``%$0(8Q"`!Q00/_>`@`@(0!`^`F.)``$$`#_V@(`("$GO?_PK[\```P` +M8I:0A```C[\`````$"$#X``()[T`$">]__"OOP``#`!BKY"$``"/OP`````0 +M(0/@``@GO0`0/`*``J!`5`@#X``(```0(20#``$\`H`"H$-4"`/@``@``!`A +M)[W_\*^P``"OOP`$#`!R&`"`@"$,`%PP`@`@(0P`9XR.!``0#`!;X@(`("$, +M`%PX`@`@(0P`]`!`GO?_PK[\```P` +M:7F,A``0C[\```/@``@GO0`0)[W_\*^Q``2OL```,-$`_S"P`/\"`"@A`B`P +M(:^R``BOOP`,#`!C6@"`D"$"0"`A`@`H(11```D"(#`A```8(8^_``R/L@`( +MC[$`!(^P````8!`A`^``"">]`!`,`&-Y`````!1`__8`0!@A`D`@(0(`*"$, +M`&-:`B`P(11`__`D`P`'$`#_[@``&"$GO?_PK[\``#P"@`*01E2C,*4`_P"@ +M."$``$`A```H(0P`8TH``$@AC[\```/@``@GO0`0,*4`_R>]__``H#`AK[\` +M``P`8L8``"@AC[\```/@``@GO0`0)[W_\*^P```PL`#_K[$`!`(`*"&OOP`( +M#`!]`!`GO?_PK[\``#P"@`*00U0)`,`X(20"`$`X8P`")`8"``!# +M,`LPYP#_,*4`_R0(``(,`&-*``!((8^_```#X``()[T`$">]__`PQ@#_K[\` +M``P`8L8PI0#_C[\```/@``@GO0`0)[W_\*^Q``2OL```,-$`_S"P__^OL@`( +M`@`H(0"`D"&OOP`,#`!]__"OL@`(K[\`#*^Q +M``2OL```$*``#@"`D"&0PP`#)`(`@1!B`#TH8@""$$``)20"`((D`@"`$&(` +M"SP1@`("0"`A```H(0P`9'4``#`AC[\`#(^R``B/L0`$C[````/@``@GO0`0 +M)C!78@(`,"$,`&0()`4`!I8C5V("`#`A`D`@(3!B`/\``A(```,:`@!#$"4` +M`"@A)`<``J8B5V(,`&/"``````)`("$``"@A```P(0P`8Y$``#@A$`#_Y8^_ +M``Q48O_?`D`@(9##``<\$(`")A%78C!C``\T90`0`B`P(3P"@`(,`&0(H$-7 +M9I8#5V("(#`A`D`@(3!B`/\``A(```,:`@!#$"4``"@A)`<``A``_^*F`E=B +M/`*``B1&5V$``"@A)`<``1``_]R@0%=A)[W_X*^R`!BOL``0`*"0(0#`@"$D +M!0`!`Z`P(:^Q`!2OOP`<#`!D"`"`B"&7H@``+$(``A!```H"("`A$D``#(^_ +M`!R2`P`#4&``))8#```D`@`"4&(`"Y8"```"("`A```H(0P`9'4``#`AC[\` +M'(^R`!B/L0`4C[``$`/@``@GO0`@%$#_]@(@("&2`@`'/!"``S!"``\T10`0 +M`Z`P(0P`9`BB`IIB +M```"("`A)`4`!C!"__T`0#`A$`#_ZZ>B```GO?_@K[$`%*^P`!"OOP`]`"`40/_W```H(9#0``<# +MH#`A,A``#S80`!`,`&0(`@`H(0(@("$"`"@A)`8``0P`9#H``````B`@(0`` +M*"$``#`A#`!CP@``."$0`/_HC[\`'"02``$0<@`7)`(``E1B_]\"("`AD,(` +M!Q1`_]P\`H`"D$)4"11B_]H``"@A)`4``0P`9`@#H#`AEZ(``"Q"``,00/_1 +M/`.``I8"``:L]`!`\`H`#D$::720%``,,`&0Z)!```0(@("$D!0`!#`!D.B0&``$" +M`"@A`B`@(0P`7,HD!@`!)@(``3!0`/\N`@`#%$#_^0(`*"$D$``!`@`H(0(@ +M("$,`%S*```P(28"``$P4`#_+@(``Q1`__D"`"@A$`#_WX^_``@GO?_PK[`` +M`*^_``0`P#@A`("`(1"@`!$``$`AE,,``"0"`P`P9?\`$*(`52BB`P$00``T +M)`(&`"0"`0`0H@`J)`("`!"B``D\`H`"`@`@(0``*"$,`&1U```P(8^_``2/ +ML````^``"">]`!"00E0))`,`0#A"``(`8B@+)00``0`(&,`\`H`"`&@8(R1& +M5+PPB`#_`&88(0`%$@(M!``$H&(`%Q2`__6@90`6E.,`!"0'`"X"`"`A+&(` +M+@!B.`L``"@A#`!CP@`````"`"`A```H(0``,"$,`&.1```X(1``_]^/OP`$ +ME,,`!"0'`!(\!H`"+&(`$@!B.`L0`/_P),94G!"B`!] +M_^``H!`AK[``$*^_`!0#H#`A)`4`!!1```4`@(`AC[\`%(^P`!`#X``()[T` +M(`P`9`@`````DZ,``3P"@`(D1E=@```H(20'``$"`"`A#`!CPJ!#5V`"`"`A +M```H(0``,"$,`&.1```X(1``_^V/OP`4)[W_X*^Q`!2OL``0K[\`&`#`B"$0 +MH``;`("`(9##``$L8@`"$$``'0``*"$48``?`Z`P(20%``$,`&0(`Z`P(9>B +M```L0@`"$$``$P(`("$D!0`$#`!D.@``,"$"`"`A)`4``20&``$,`&0Z```` +M``(`("$``"@A```P(0P`8\(``#@AC[\`&(^Q`!2/L``0`^``"">]`"```"@A +M#`!D=0``,"$0`/_XC[\`&`P`9`@D!0`$DB8``9>B``!01@`()`4``0(`("$, +M`&0Z)`4`!`(`("$D!0`!$`#_XP``,"$``#`A$`#_X`(`("$GO?_@K[(`&*^Q +M`!0`H)`A`,"((20%``$#H#`AK[``$*^_`!P,`&0(`("`(9>B```"`"`A```H +M(11``!<``#`A%D``!P````"/OP`]`""6)P`$ +MDB8`!SP"@`(D0E04`,(P(0P`8\(`!S@K`@`@(0``*"$``#`A#`!CD0``."$0 +M`/_NC[\`'`P`9'4`````$`#_ZH^_`!PGO?_PK[\``!"@``D`P$@AD,,``R0" +M``$``"@A```P(1!B``8``#@A#`!D=0````"/OP```^``"">]`!"1(P`'/`*` +M`B1"5!0`8A@AD2@``9!B`````"@A$$@``P``,"&1(@`!H&(```P`8\(````` +M$`#_\(^_```GO?_@K[,`#*^P``"OOP`4K[0`$*^R``BOL0`$`,"`(1"@``@` +M@)@AD-$``R0"``(``"@A$B(`"P``,"$,`&1U`````(^_`!2/M``0C[,`#(^R +M``B/L0`$C[````/@``@GO0`@/`*``I!#5+V2`@`'/!*``B945V0`0Q`K)`4` +M!11```0"@#`A```H(1``_^L``#`A#`!D"`````"6!@`$ED179```*"$LP@`" +M,(,`_P#"B`L`!"("``,:``!D&"4"@#`A`B`X(0)@("$,`&/"ID-79`)@("$` +M`"@A```P(0P`8Y$``#@A$`#_UX^_`!0GO?_@K[,`#*^R``BOL0`$K[```*^_ +M`!`\$(`#`,"8(8X&FF``@)`A`*"((3P$@`(\!8`")(07(`P`<=]`"`PQ0`/)*/__S!B__\L0@`"$$``!#!B__\P +MP@"`%$``##!B__\L0@`"$$#_[C#"`(!40/_MC[\`$`)`("$``#`A#`!]`!`,`%]7``````(` +M("$``"@A```P(0P`8\(``#@A$`#_]8^_``0\`H`"D$)5C!!```(\`H`"H$A4 +M"0/@``@`````)[W_\*^P``"OOP`$/`*``I!"58P``"@A%$``!0"`@"&/OP`$ +MC[````/@``@GO0`0#`!]__"OOP``/`*``I!"58P40``$```H(8^_```#X``()[T`$`P` +M6[P`````$`#_^X^_```#X``(``````/@``@`````)[W_X*^Q`!2OL``0K[\` +M&`"@B"$4H`"!`("`(3P"@`(D1E=8D,(``S!#`&`D`@`@$&(`"2AB`"$00`!R +M)`(`0%!@``J0Q@`"C@0`$```*"$,`&1U```P(8^_`!B/L0`4C[``$`/@``@G +MO0`@+,(`#1!`__4\`X`"``80@"1C%SP`0Q`AC$(```!```@`````C@0`$#P& +M@`("("@A#`!>R3& +M5U@0`/_#C[\`&(X$`!`D!0`!#`!D"`.@,"&.!``0/`:``@(@*"$,`%Z8),97 +M6(X$`!`GI@`"#`!D""0%``&7H@``$$#_LI>B``)40/^QC[\`&`(`("$,`%N\ +M)`4``Q``_ZR/OP`8C@0`$#P&@`("("@A#`!>TR3&5U@0`/^EC[\`&(X$`!`\ +M!H`"`B`H(0P`7OTDQE=8$`#_GH^_`!B.!``0/`:``@(@*"$,`%\;),976!`` +M_Y>/OP`8%&+_D8X$`!`,`%^E`B`H(1``_Y&/OP`8C(0`$#P&@`(DQE=8#`!C +M<@``*"$0`/][/`*``B>]__"OOP``/`*``I!"58PPHP#_,.H`_Q!```@`P"@A +M`0`X(0%`,"$!($`A$&``"BQB``,40``$`&`H(8^_```#X``()[T`$`P`6X,` +M````$`#_^X^_```,`%_K`````!``__>/OP``)[W_X*^Q``0PL0#_K[,`#*^R +M``@`@)@A`!&0P`(@("&OOP`0#`!BEJ^P```"41`A``(0@`!1$",\`X`#)&.Q +M(``"$(``0Q`A)$,`&)1D``00@``*`E$0(30"__\0@@`&``0B`I!B``4\`X`" +M)&-4G*!D``F@8@`(`E$0(0`"$(``41`C/`.``R1CL2```A"``$,0(21#`!B4 +M9``&$(``"SP"@`(T`O__$((`"#P"@`*08@`'/`.``B1C5)P`!"("H&0`"Z!B +M``H\`H`"`!$80"1"5X``8H`AD@4``9(&```\!(`"#`!QUR2$%W"2`@`!%$`` +MSCP&@`("41`A``(0@`!1$",\`X`#)&.Q(``"$(``0Q`AE$0`(!"```DD0P`@ +M-`+__Q""``8`!"("D&(``3P#@`(D8U2(QP`(F,<`"XC(``R8R``/J(,``+B#``.HA0`$ +MN(4`!ZB'``BXAP`+J(@`#+B(``\DQ@`0%,+_[B2$`!`"41`A``(0@`!1$",\ +M`X`#)&BQ(``".(``Z#`A),,`()1B``8D0O__+$(`(%!``"F4P@`HD&,`!SP% +M@`(E`@!J)&,``@#B$"$DI%1DH*-49(A)``"820`#B$H`!)A*``>(0P`(F$,` +M"XA%``R810`/J(D``KB)``6HB@`&N(H`":B#``JX@P`-J(4`#KB%`!&(20`0 +MF$D`$XA*`!282@`7B$,`&)A#`!N(10`2!```,$(`WS1#`"``1!@*/`2``@!@ +M*"$DA!>(#`!QUZ##``<0`/\H`E$0(2>]__"OOP`$K[````"`@"$,`&*6D(0` +M`#P"@`*@0%6,#`!C]8X$`!`,`&*OD@0``(^_``2/L``````0(0/@``@GO0`0 +M)[W_X`"`$"$D!``TK[4`%*^T`!"OLP`,K[(`"*^Q``2OL```K[\`&`"@F"$` +MP*`A`."H(0$`D"$,`'NZ,%$`_P!`@"$2```/)`(``@(`("$``"@A#`!R#20& +M`#0\`H`")$)7<``1&(``8A@AKE```*X3`""N%``LKA4`,*QP`````!`AC[\` +M&(^U`!2/M``0C[,`#(^R``B/L0`$C[````/@``@GO0`@D((`*`"B*"4#X``( +MH(4`*">]__``@!`AK[```*^_``0`H"`A$*``"#!0`/\,`'O-`````#P"@`(` +M$!B`)$)7<`!B&"&L8```C[\`!(^P`````!`A`^``"">]`!`PA`#_``08P`!D +M&"$``QB`/`*``@!D&",D0E=P``0@@">]__``@B`A/`*``Z^Q``2OOP`(K[`` +M`"1"L2```QB`C)````!B&"&09``;`."((3P(@`(\!X`"K@4`(*X&`"0F"0`< +M).>(["4(B4P``"@A`@`P(0P`]__"OL```K[\`!!"@ +M``0`H(`AC*(`'!1```4`0"`AC[\`!(^P```#X``()[T`$`P`]__"OL````*"`(:^_``BOL0`$#`!RI0"`B"&.`@`@ +M`$#X"8X$`"0,`'*S`B`@(0P`]__"OOP``C,(`+`!`^`F,Q``PC[\```/@ +M``@GO0`0,(0`_Q2```0`````/`*``P/@``B00K$[`^``"```$"$PA`#_%(`` +M!``````\`H`#`^``"(Q"L30#X``(```0(3"$`/\4@``%`````#P"@`.,0K$T +M`^``""1"`0`#X``(```0(2>]__`PA`#_%(``!:^_```\`H`"C$)7=!!```0` +M````C[\```/@``@GO0`0#`!R&``````,`&*6```@(1``__F/OP``)[W_\#"$ +M`/\4@``%K[\``#P"@`*,0E=T$$``!`````"/OP```^``"">]`!`,`'(=```` +M``P`8J\``"`A$`#_^8^_```GO?_PK[```#"0`/^OL0`$K[\`"`P`]`!`,`'*EC$2Q.!``__22(IID)[W_\*^P``"OOP`$#`!R&#"0 +M`/\6```&/`2``Y""FF0D0O__,$,`_Q!@``>@@IID#`!R'0````"/OP`$C[`` +M``/@``@GO0`0/`*``PP`]__"OL0`$K[\`"*^P``",@@`8`("((8Q0```, +M`&)TD@0`D(X"`!Q40``/C@(`(*X1`!R.(@`8C@,`**X1`""L0```D@0`D"1C +M``$,`&*%K@,`*(^_``B/L0`$C[````/@``@GO0`0C$(`&!``__&L40``)[W_ +MX*^T`!`PE`#_+H(``J^V`!BOM0`4K[$`!*^_`!ROLP`,K[(`"*^P````H+`A +M`,"H(3#Q`/\40``,)`,`#X^_`!R/M@`8C[4`%(^T`!"/LP`,C[(`"(^Q``2/ +ML````&`0(0/@``@GO0`@#`![NB0$`*``0(`A$$#_\20#``H``"@A)`8`H`P` +M<@T`0"`A`H`@(0P`8F.B%`"0`H`@(0P`8ENN`@`(H@(`D20$!P`D`@#_HA$` +MDPP`>[JF`@"$`$"((1!`_]XD`P"I`$`@(0``*"$D!@<`#`!R#:X"`!@,`'NZ +M)`0#`*X"`'000/_4)`,``0!`D"&N```[HD!``<`$`@(20&`!P``"@A#`!R#:X"`!0"@"`A#`!DP`(`*"$40/^V)`,` +M+ZZP`````!@A$`#_LJX6`)@GO?_PK[\``(R#`!0Q*0#_H&4``(R#`!2@9P`! +MC(,`%*!H``*,A0`4I&8`$`P`:(.LJ0`4C[\```/@``@GO0`0)[W_\*^_``RO +ML@`(K[$`!*^P````@)`AD(0`D#"P`/\,`&)T,-$`_P(`*"$"(#`A#`!HZ`)` +M("&21`"0#`!BA0!`@"$"`!`AC[\`#(^R``B/L0`$C[````/@``@GO0`0)[W_ +M\*^_```,`&AA,*4`_X^_```#X``()[T`$">]__"OOP`,K[(`"*^Q``2OL``` +M`("0(9"$`)`PL`#_#`!B=##1`/\"`"@A`B`P(0P`:/8"0"`ADD0`D`P`8H4` +M0(`A`@`0(8^_``R/L@`(C[$`!(^P```#X``()[T`$">]_^"OLP`,K[(`"*^Q +M``2OL```K[\`$`"`B"&0A`"0`,"0(0#@F"$,`&)T,+``_XXB`"@00``?`B`@ +M(8XC`!P08``'`&`H(8QB`!B,0@``%$```JXB`!RN(``@CB(`**QR``0D0O__ +MKB(`*"0"``&@<```K',`"*!B``,,`&:\H&```9(D`)`,`&*%`$"`(20"`*(` +M$!`*C[\`$(^S``R/L@`(C[$`!(^P```#X``()[T`(`P`8H62)`"0$`#_]B0" +M``,GO?_@K[,`#*^R``BOL0`$K[```*^_`!``@(@AD(0`D`#`@"$`X)@A#`!B +M=#"R`/^.(@`H$$``(0````".)@`<$,``%R0"`*&,P@`8C$(``!1```*N(@`< +MKB``((XB`"@D`P`!K-``!"1"__^N(@`H`,`H(0(@("&@T@``K-,`"*##``,, +M`&:UH,,``9(D`)`,`&*%`$"`(20"`*$`$!`*C[\`$(^S``R/L@`(C[$`!(^P +M```#X``()[T`(`P`8H62)`"0$`#_]B0"``,GO?_PK[```*^_``0,`&F'`("` +M(0P`>\V.!``0#`![S8X$`!@,`'O-C@0`=`P`>\V.!``4#`![S0(`("&/OP`$ +MC[````/@``@GO0`0)[W_\*^R``BOL0`$K[```*^_``P`@(@AD(0`D#"P`/\, +M`&)T`,"0(28#__\L8@`&$$``&S("`!```Q"`/`.``B1C%Y@`0Q`AC$(```!` +M``@`````EB(`A*9"```,`&*%DB0`D```$"&/OP`,C[(`"(^Q``2/L````^`` +M"">]`!`0`/_UDB(`E1``__.2(@"4$`#_\98B`(@0`/_OEB(`AA!```4R!0`/ +M#`!IOP(@("$0`/_JID(```P`8H62)`"0$`#_Z20"``(GO?_PK[(`"*^Q``2O +ML```K[\`#`"`D"&0A`"0,+$`_PP`8G0PT/__)B/__RQB``<00``C,B(`$``# +M$(`\`X`")&,7L`!#$"&,0@```$``"`````"F4`"$#`!BA9)$`)```!`AC[\` +M#(^R``B/L0`$C[````/@``@GO0`0,@4`_Z)0`)4,`&A;`D`@(1``__(````` +M$`#_\*)0`)00`/_NIE``B!``_^RF4`"&`@`H(0P`:] +M__`PI0#_K[\```P`::,PQ@#_C[\```/@``@GO0`0)[W_X*^S``ROL@`(K[$` +M!*^_`!2OM``0K[```(R4``@PLP#_,,8`_P`3$$".@P`8`$80(0`"$8``8H@A +M$B``$`"`D"$R(@`/)$(`3R0#__``0R@D`B,8)`!E$"$`0Q`K%$``!P!@("&\ +M<0``)&,`$`"%$"$`0Q`K$$#_^P````".)0`\)`(``1"B``H``"`AC[\`%(^T +M`!"/LP`,C[(`"(^Q``2/L````(`0(0/@``@GO0`@``81``!3$"$`18`$`D`@ +M(0P`99H"`"@A%$``"``3$(``5!`AKB```(Q#`(```"`AK$,`@!``_^FN(``\ +M`D`@(0P`98X"`"@A%$#_Y"0$`*40`/_S`!,0@">]__`PA`#_K[```*^_``0, +M`&)K`*"`(8Q#```P8P#_`$,8(:X#``B,0@`D,$(`'RQ#``0`0"@A%&```J(" +M`),D!0`#,*0`_P`$(<`DA`@`#`![NJ(%`),`0!@AK@(`,!!``"(D!`"H``(0 +M(S!"!_\`8A`A)`0((`P`>[JN`@`L`$`8(:X"`#000``8)`0`J@`"$",P0@`? +M`&(0(20$`P`,`'NZK@(`.*X"`'@00``/)`0``9($`)`\!8`")@<`G`(`,"$, +M`&'])*6>,"0"`/^F`@"$`@`@(0P`90"F``"&/`*``JQ05W@``"`AC[\`!(^P +M````@!`A`^``"">]`!`GO?_@K[(`"*^Q``2OOP`8K[4`%*^T`!"OLP`,K[`` +M``"`B"&0A`"0#`!B:XXS``@`0)`ACF(``"0#__X`0Q`DKF(``"0"``*N8@`` +MCF(``#!"``(40/_])`(`!JYB`&B2(@"3CB0`,```*"$``C'`),8(``P`<@T` +M`H!`CB0`-```*"$D!@@@KB``/`P`<@VN(`!`DB8`DR8D`$0``"@A#`!R#0`& +M,,"2)@"3```H(28D`%P,`'(-``8PP*Y@`&R.)0`L$@``#```H"$`H"`A/`(` +M0#1"@``FE``!K((```*0&"LD`@`!K((`"*R``#P48/_W)(0`0*YE`!B.0@`$ +M,$(`$%!```2.,``XCF(`1*YB`$2.,``XCC(`>```H"&.`P`$)`*`_R05``$` +M8A@D/`*``B1"E<2N0@`$KA(`'*X#``2N%0``KE$```(`("$,`&5Q)I0``2Z" +M`$`F$``@%$#_[R92``P\`@!`-$(`0*YB`(".8P"`/`+__C1"__X`8A@D)`(! +M1ZYC`("N8@`()`(`_Z8B`(2F(`"&C[\`&*YU``"/M``0C[4`%(^S``R/L@`( +MC[$`!(^P```#X``()[T`(">]__"OL0`$K[\`"*^P``",@@`<`("((8Q0```, +M`&)TD@0`D(X"`#Q40``/C@(`0*X1`#R.(@`] +M__"OI0``KZ8`!(^E``"/H@`$CZ,``(R&``BLH@`(K&``#(S"`````"`A-$)` +M`*S"``"LQP!PC,(`>`!'$"040``'+(,$`!!@``4DA``!C,(``#!"0``40/_W +M`````(S#```L@@0`)`2__P!D&"2LPP```^``"">]`!`GO?_@K[$`%*^P`!"O +MOP`8D.D``(R"``B0Z``!KZ4``*^F``2,0P`8``F`0`((@"$`$!&``&(8(:^C +M``B/I0`(``A!`(^F```!"4`A)`<``0"`B"$!!S@$#`!EL``0@(`"$1@AC&(` +M1%1```R,8P!]`""/H@``$`#_]:QB```GO?_@K[\`$)#H````X&`AD.<``8R)``@` +M"!!``$=8(:^E````"VB`KZ8`!*^@``B-(P`8`:00(0"`4"&,1`!<``]`""/HP`(``L0@(^E``"/I@`$`$H0(:Q#`%P!0"`A#`!ESP&` +M."$0`/_SC[\`$">]_]"OLP`]`#".,``\+0)``20)0``!`D@+$@``.@$)0"..!@`< +MC,(``!1```*N(@`\KB``0)8C`(H`"10`-$6`@"1C__\T1`"`)`(``:S1```" +M"I@*K@(``!4``"BF(P"*K@4`!(Y#``2.!``$)`*`_P!J&"$`@B`DK-(`""1G +M0``D8A``)&4@`"1F,`"N!``$K@(`#*X%`!"N!@`4K@<`&*X#``@18``"`4E0 +M(:UP```5`/_5`@!8(0&`*"$,`&6:`B`@(11```<"("`A`F`H(0(`,"$,`&7/ +M`D`X(1``_\(``"`A`F`H(0(`,"$,`&7Y`D`X(1``_[P``"`A$`#_V:X$``00 +M`/^X)`0`IB>]__"OOP``#`!F.@````"/OP```^``"">]`!`GO?_PK[\```P` +M9CH`````C[\```/@``@GO0`0)[W_L*^S`"ROOP!$K[X`0*^W`#ROM@`XK[4` +M-*^T`#"OL@`HK[$`)*^P`"",@@`(KZ``"*^@``ROH@``C%4`;`"`F"&OH``0 +M$J``$J^@`!20@@"3$$``#P``H"$D`@`!`H(0!`*B$"0RA0#_)`8``2:4``$` +M`#@A``!`(11``*4D"0`(DF(`DP*"$"L40/_T)`(``8^C``",=0!\K'4`?!*@ +M`(R/OP!$KZ``!(^D``228@"3``"@(1!``'\`!+@K`!<0@`!3$"$D0@!$KZ(` +M&`+@\"$2X`"-)`(``2:#`!``8A`$`J(0)%!``&R28@"3CZ(``(^D`!B,0P`8 +M`!X1@`!BL"$2P``0C(4``#+"``\D0@!/)`/_\`!#,"0"PQ@D`&80(0!#$"L4 +M0``'`&`@(;QQ```D8P`0`(80(0!#$"L00/_[`````%"@`%228@"3,*(`#R1" +M`"\D`__P`$,P)`"C&"0`9A`A`$,0*Q1```<`8"`AO'$``"1C`!``AA`A`$,0 +M*Q!`__L`````C*(`!#!"`(`00``1`````%:``#^28@"3C*(`!"0#`$```A0" +M,$(`?U1#`#F28@"3C*(`!#!"@`!00``UDF(`DXRB``0D`_]_`$,0)*RB``2, +MH@`,@(`!)(C`)`\`H`"C[\`#(^R``B/L0`$C[```"1" +M5W0``QB``&(8(:Q@```#X``()[T`$">]__"OL0`$K[\`"*^P``",D``(`("( +M(8R$`)@``"@A```P(0``."$,`%_$``!`(8X#`!0\`@'_-$+__P!B&"2N`P`4 +MC@(`;*X"`&R.`@!\K@(`?(X"`'`40/_^)`+__ZX"`'2.`@!$,$(!`!!```0D +M`@`!KB(``"0"``.F(@"$CB0`F```*"$``#`A```X(0P`7\0``$`AC[\`"(^Q +M``2/L````^``"">]`!`GO?_PK[\``)2#`(0`@!`AC(0`F*1#`(XD`P"`I$,` +MA```*"$``#`A```X(0P`7]H``$`AC[\```/@``@GO0`0)[W_\*^P``"OOP`( +MK[$`!(R"````@(`A$$```HR1``BL@```CB(`1#!"`0`40``-`````(XB`$0P +M0@(`4$```Z(``)(D`@`"H@(`DI((`)*.!`"8```H(0``,"$,`%^]```X(8XB +M`$0P0@"`5$``&98"`(2.(@!$,$(`@!1```4D`@`"E@,`A"0"`(`08@`')`(` +M`J8"`(2/OP`(C[$`!(^P```#X``()[T`$)8"`(Z.!`"8```H(:8"`(0``#`A +M```X(0P`7^<``$`A$`#_\X^_``B.!`"8```H(:8"`(XD`@"`I@(`A```,"$` +M`#@A#`!?Z0``0"$0`/_>`````">]__"OL````("`(3P$@`*OOP`$#`!QUR2$ +M%\R6`@",C[\`!"1"``&F`@",C[````/@``@GO0`0C((`"``%+D"L10`4)`(` +M`0/@``BD@@"$C(D`"#"E`/\`!1'`C2,`&`!B("$0@``1)`(``3""``\D0@!/ +M)`/_\`!#0"0`@Q@D`&@0(0!#$"L40``'`&`X(;QQ```D8P`0`.@0(0!#$"L0 +M0/_[`````"0"``$`HA`$B(,`*)B#`"N(A0`LF(4`+ZC#``"XPP`#J,4`!+C% +M``<#X``(K2(`;">]_^"OLP`,K[$`!*^P``"OOP`4K[0`$*^R``B,E``(D*<` +M`)"F``&.@P`8``<00`!&$"$``A&``$.((0"@@"$2(``0`("8(3(B``\D0@!/ +M)`/_\`!#*"0"(Q@D`&40(0!#$"L40``'`&`@(;QQ```D8P`0`(40(0!#$"L0 +M0/_[`````(XB`#P`!AD``&<8(20$``$`9)`$$$``"@``&"&/OP`4C[0`$(^S +M``R/L@`(C[$`!(^P````8!`A`^``"">]`"`"8"`A#`!EF@)`*"$40``J`F`@ +M(9(#``(D`@`!$&(`(I8"`!`08``<`````(X#`!008``#``(D`#P"(```@B`E +MKB0``)("``"2!``!)`,`P``"$(``5!`A/`8`P`!D,`J,10"`)$,`@!"```F2 +M`@`"``(4@`#"$"4`HA`EK&(``"0"``&N(@`\$`#_U```&"$0`/_X``(0@``" +M%``T0H``$`#_Z*XB```\`T````(4`!``__L`0Q`E#`!EC@)`*"$40/_&)`,` +MI!``_].2`P`",*4`_S#&`/\`!2A``*8H(0`%*(``I"@AC*,`1!!@``0``!`A +MC&(`'(Q"``B00@`#`^``"``````GO?_0K[,`'##3`/^OL@`8`!,1`#"R`/^O +MM0`DK[0`(*^Q`!2OOP`HK[``$`"`B"$`4A`A`!(80"0$``$`1"`$`',8(8XE +M``BOH``(KZ``#*^C``"OI``$CZ(``(RC`!@``*@A``(1@`!B("$0@``0``"@ +M(3""``\D0@!/)`/_\`!#,"0`@Q@D`&80(0!#$"L40``'`&`H(;QQ```D8P`0 +M`*80(0!#$"L00/_[`````(R"`#P40`!#)`,`HX^B`````A"``%$0(8Q%`$00 +MH``]```8(3"B``\D0@`O)`/_\`!#,"0`HQ@D`&80(0!#$"L40``'`&`@(;QQ +M```D8P`0`(80(0!#$"L00/_[`````(RB`!R,0P`($&``!0````",=``$C&(` +M"`!@J"&OH@`,C*(``(RC``0D!/_@,&,`:!1@``L`1(`DC*(`!(^C``@``A0" +M,$)__P!B&"&OHP`(CZ(`#(^C``@`0Q`CKZ(`#`(@("$"0"@A#`!I^@)@,"%2 +M```:CB0`F(X"`!R,0@`($%4`"0````".)`"8CZD`#`)`*"$``#`A`F`X(0P` +M8'D"@$`AKZ``"!8`_\8"`"@A```8(8^_`"B/M0`DC[0`((^S`!R/L@`8C[$` +M%(^P`!``8!`A`^``"">]`#"/J0`,`D`H(0``,"$"8#@A#`!@>0*`0"$0`/_L +M`````(R"``@D!0`!C$(`1#!#`,`D`@"`4&(`!)2"`(0``"@A`^``"`"@$"%4 +M0__]```H(1``__L`````)[W_\*^_``2OL````("`(8R$``@D`_^XC((`"`!# +M$"2L@@`(C((``"0#__X`0Q`DK((``"0"``*L@@``#`![S8X$`#`,`'O-C@0` +M-`P`>\V.!`!XD@0`D`P`8BF.!0"]_^"OL@`(K[\`$*^S``ROL0`$ +MK[```(R"``@PI0#_,,8`_XQ#`!@`!2A``*8H(0`%$8``@)`A`&(@(1"```\P +M@@`/)$(`3R0#__``0S`D`(,8)`!F$"$`0Q`K%$``!P!@("&\<0``)&,`$`"& +M$"$`0Q`K$$#_^P``````!9B``G(0(8Q$`$00@``Q,((`#R1"`"\D`__P`$,P +M)`"#&"0`9A`A`$,0*Q1```<`8"@AO'$``"1C`!``IA`A`$,0*Q!`__L````` +MC(,``"0"_^``8H@D$B``"R8B`"``41`K`B`8(11```<"("@AO'$``"1C`!`D +MH@`@`$,0*Q!`__L`````C(,`'"0"``&L@@``K'(``*R```0,`&5QC'``"!(@ +M`!,"]__`D!``!K[\```P`:ELT!;]HC[\```/@ +M``@GO0`0)[W_\*^_````@"@AC(0`B`P`=E(`!"""C[\`````$"$#X``()[T` +M$`/@``@``!`A)[W_\#P"@`*OL```)%!6/#P"@`(D0E8@`@(0*Q!```6OOP`$ +MC[\`!(^P```#X``()[T`$(X"````0/@))A#__#P"@`(D0E8@`@(0*U!`__J. +M`@``$`#_](^_``0`!!`C`((@)``$%```1"`C``01@`""("$`!!$``((@(3P" +M@`(D0C7```0F@@""("$#X``(@((``!B``!0D"``4*(,G$20")Q``@Q`+<$@P +M`@""(",8P``+0`5(`$`"2``0HO_^`$48(SP'``,`0"@A!&``"#3G#4``PS`C +M',#_]P`````<@/_O*(,G$0/@``@`````$`#_^`!G&"$#X``(``````/@``@` +M````/`*@P#1"`*",0@```^``"#!"``\GO?_@K[\`$`P`:K\`````$$``0X^_ +M`!!`@.``````````````````0(#H`````````````````#P#@`"\:0``/`*` +M`"1C`!`T0@__`$,0*Q!`__H`````0`*``````````````````#P#__\T8__X +M`$,0)#1"``-`@H``````````````````0(#@`````````````````$"`Z``` +M```````````````\`X``O&@``#P"@``D8P`0-$(/_P!#$"L00/_Z`````$`" +M@``````````````````\`___-&/_^`!#$"0T0@`#0(*````````````````` +M`$`"@`"OH@``CZ(``(^B```D`__\`$,0)*^B``"/H@``0(*``(^_`!`#X``( +M)[T`(#P$H,`TA``@C(4``"0"_O\\`Z#``*(H)*R%``",A0``)`+]_S1C`)`` +MHB@DK(4``(QE```TI0`!`^``"*QE```\`Z"0-&-``(QE```D`O_\/`2@D`"B +M*"2L90``-(1`!(R%```\`__\-&/__P"C*"0\`J"0K(4``#1"F'",10``-*4` +M#ZQ%``",A0``/`(``0"C&"0`8B@E`^``"*R%```\`Z#`-&,`((QB```T0@,` +M`^``"*QB```\!:#`-*4`8(RF```\`__^/`(``0`$(8`T8___`((@)`##&"0` +M9#`EK*8``(RF```\`@`"`,(P)0/@``BLI@``,(0`_P`$$8`\!J#`/`6@P#!' +M`$`D`@`!-,8`8!""``HTI0!DC,,``"0"_[\T8P`PK,,``(S#````8A`D`$<8 +M)0/@``BLPP``C*,``"0"__X`8A@D$`#_\ZRC```GO?_PK[```*^_``0,`&J_ +M,)``_P!`,"$\`Z#`)`(``1("`!]_^`#H"`AK[\`$`P`:[PD!0`/DZ,``(^_`!`\!(`"``,00B2% +M5X`P0@`!,&,``:"#5X"@H@`!`^``"">]`"`GO?_@/`.@P*^_`!`T8P"0C&(` +M`#P%H,`TI0!@KZ(``(^B```\!/[_-(3__S1"``2OH@``CZ(``*QB``",H@`` +MKZ(``(^B````1!`DKZ(``(^B```,`&R`K*(```P`:SP``"`A#`!NK``````, +M`&L.`````"0"`^BOH@``CZ(``"1"__^OH@``CZ,``"0"__\48O_Z/`2@P#2$ +M`&",@@``/`/_[S1C__^OH@``CZ(```!#$"2OH@``CZ(```P`:QZL@@``#`!K +MC0`````,`&RG``````P`;-0`````#`!KS@`````\`H`"#`!M6(!$5<@,`&NT +M`````(^_`!`#X``()[T`(#P"H,`\!?_O-$(`8#2E__^,0P``4(```P!E&"0\ +M`@`0`&(8)3P"H,`T0@!@`^``"*Q#```GO?_PK[```*^_``0,`&J_`("`(0!` +M,"$\`Z#`)`(`%20$``D`4"`*-&,`:#P"H,",90``-$(`8*QD``",10``$@`` +M!3P"H,`0P``C)`+^_S2E`0`\`J#`-$(`8*Q%```2```9C$4``!3``!4\`A`` +M/`+O_S1"__\`HB@D/`*@P#1"`&"L10``C$4``!8```:/OP`$4,``!#2E`0`D +M`O[_`*(H)(^_``2/L```/`*@P#1"`&"L10```^``"">]`!`0`/_N`*(H)5#` +M__T\`A``$`#_Z#P"[_\0`/_>`*(H)#P&H,`\`O_]-,8`8!"```8T0O__C,,` +M`#P"``(`8A@E`^``"*S#``",PP```&(8)`/@``BLPP``/`:@P#P"_O\TQ@!@ +M$(``!C1"__^,PP``/`(!``!B&"4#X``(K,,``(S#````8A@D`^``"*S#```\ +M!*#`-(0`((R#```\`O_[-$+__P!B&"0#X``(K(,``"B"``000``+`````"0" +M``$`@C`$``80)SP#H+&,8P``4*```@!B&"0`9A@E/`&@L:PC```#X``(```` +M`#P"H+$T0@`(C$,``"0"``$`@A`$``(P)R0"``$0H``&`((0!`!F&"0\`J"Q +M-$(`"`/@``BL0P``$`#_^P!B&"4\!*#`-(0`((R#```\`O_W-$+__P!B&"0# +MX``(K(,``#P"H,`T0@`@)`,``:Q#```0`/_\/`*@P">]_^"OLP`,K[(`"*^Q +M``2OL```/`*``Z^_`!",0[$D``000`"@D"$`8H`A`,"8(12@``@``(@AC[\` +M$(^S``R/L@`(C[$`!(^P```#X``()[T`(``1($`"9"@A)C$``0P`;:H"!"`A +M`C(0*U1`__H`$2!`$`#_\8^_`!`GO?_@K[$`%*^P`!"OOP`8#`!MH0`````` +M0(`A/`*``ZQ0L2`D4;$@)`(``1("`%$`````%@```C0"\`"N(@`$/!"``R80 +ML2`\`J"@K@(`%"0"``*N`@`8)@8`'"0$``$D!0`!#`!LM:X``!`F!@`>)`0` +M0`P`;+4D!0`!)@8`("0$`$$,`&RU)`4``28&`"(D!`!"#`!LM20%``$F!@`D +M)`0`0PP`;+4D!0`!E@(`)"0%`"`F!@`J``(00BQ#`"``0R@+#`!LM20$`$0F +M!@`F)`0`9`P`;+4D!0`!E@(`)B0%`!`F!@!J``(00BQ#`!``0R@+#`!LM20$ +M`&4F!@`H)`0`=0P`;+4D!0`!E@(`)"0%``@F!@"*``(00BQ#``@`0R@+#`!L +MM20$`'8F!@`,)`0`'0P`;+4D!0`!)@8`"B0$`!XD!0`!#`!LM280``@"`#`A +M)`0`'PP`;+4D!0`!C[\`&(^Q`!2/L``0`^``"">]`"`,`&T\`Z`@(9>B```` +M`AH"$'#_K3P"``$D`@`"5&+_K#P0@`,0`/^H/`(`!">]__``@"@AK[\```P` +M;:HD!`AXC[\```/@``@GO0`0/`*``@/@``BL1%7,/`*``@/@``B,0E7,/`)1 +MZS1"A1\`@@`9/`*``@``(!``!"&"`^``"*Q$5=`\`H`"`^``"(Q"5=`\`H`" +M`^``"(Q"5=0\`H`")$(V```$&(``8A@A``000">]__`\"*#`,$<`#BR"``BO +MOP`$K[```#4(`&`40``%`(`P(8^_``2/L````^``"">]`!"-!0``/`*``JQ& +M5=0D`O_Q`*(0)`!'*"6,9```-*4``0P`;42M!0``/`*``"1"`P",1``4```H +M(1"```0D!B6`C((`%`!`^`F,A```#`!M1P`````,`&U*`$`@(4`(8``````` +M`0"`(3P!__\T(?_^`0%`)$"(8``````````````````,`&U2,A```3P#@`*L +M8E=\0(!(`````````````````$""6`````````````````!`"&```````#(0 +M``$!$$`E0(A@`````````````````!``_\>/OP`$/`*@LS1"`!R,0@``)[W_ +M\*^B``"/H@``,$(``0/@``@GO0`0/`*A`#B$``(`@B`AE((```/@``BDH@`` +M`X`X(3P<@`,GG-90``000`!$$"$``AF``$,0(0`"$(``1!`A``(0@`!$$"$\ +M`VC;``(A@#1CBZT`@P`8``07PP``&!```QL#`&(@(SP"%/@T0K6)`((`&``$ +M'\,``!`0``(30P!#*",`!1!``$40(0`"&8``0Q`A``(0@`!%$"$``A"``$40 +M(0`"$4``@B@C0`9(`$`#2```9A@C/`(``P1@``HT0@U``&40*A1`__D````` +M`(,@(UR`_^4\`A3X`.#@(0/@``@`````$`#_]@!B&"$GO?_PK[\```.`$"$\ +M'(`##`!LKR>4GG-90`@#@(8^_``2/L``````0(0/@``@GO0`0`^``"```$"$GO?_@K[(` +M"*^P``"OOP`0K[,`#*^Q``0`@(`A```H(202``$``!@A`X"8(3P<@`,GG-90 +M)`+__A""`#]`"",@@`4 +MC(0``!``__(D!0`$5(+_V"80``$\`H`"C$)5V!Q`_]4D4O__)!+__1``_](` +M0I`+/`*``"1"`P"L0``8/`*``A``_\RL1%78)`4``0``&"$#@#`A/!R``R>< +MUE`D`O_^$((`'BB"__\00``3)`+__R0"__U0@@`"```@(22$``$D`P`!$&`` +M"0`$&4`\`H`#)$*::`!B&"$\`H``)$(#`*Q#`!0\`H`"K$15W`#`X"$#X``( +M`*`0(52"__$DA``!/`*``HQ"5=P<0/_N)$7__R0%__T0`/_K`$(H"SP"@``D +M0@,`K$``%#P"@`(0`/_EK$15W`.`$"$\'(`#)YS64`/@``@`0.`A`X`0(3P< +M@`,GG-90`^``"`!`X"$GO?_PK[\``#P%@`*0HE7@$$``!```("&/OP```^`` +M"">]`!`\`H``)$(#`(Q"`#0D`P`!`$#X":"C5>`0`/_WC[\``">]__`\`H`` +MK[\``"1"`P",0P`4``0F```$)@,08``2,(4`_XQD``",8@`,`$#X"0`````\ +M`H``)$,#`(QB`$040``$```@(8^_```#X``()[T`$*Q@`$0,`&\&`````!`` +M__J/OP``C$,`&!``_^T`````)[W_\*^_``2OL``````P(3P'@```!A"`).4# +M`"3&``$\`X`"`$40(21CM^PHQ`!`K$,``%2`__<\!X``/`(`"#1"`!6LX@,` +M/`*``B1"MY2LH@!`/`*``B1"M[BLH@`0/`*``B1"ML"LH@!(/`*``B1"N="L +MH@`@/`*``B1"N>2LH@`<```P(:R@`$RLH``X```H(0`&&,``91@A/`*``R1" +MFF@``QB``&(8(22E``$\`H`")$*W["BD``BL8@``%(#_]0`&&,`DQ@`!*,(` +M`A1`__```"@A/!"``#P"@`(F$`,`)$*W]*X"`#`\`H`")$*Y)"0$__X,`&W] +MK@(`-`P`;DDD!/_^#`!^$@`````,`&W]```@(0P`;DD``"`AK@``1(^_``2/ +ML````^``"">]`!`0H``*```P(22E__\`A1`A@$,``"0"``,08@`$)`8``52@ +M__HDI?__```P(0/@``@`P!`A```!30/@``@`````)[W_\*^_```,`&I[```` +M`(^_```#X``()[T`$">]__"OOP`$K[```#P"@`*,0E7D%$``%3P"@`(D4%98 +M/`*``B1"5E@2`@`.)`,``8X"``P`0/@)`@`@(1!```^.`@`8-$(``:X"`!@\ +M`H`")A``("1"5EA6`O_VC@(`#"0#``$\`H`"K$-5Y(^_``2/L````^``"">] +M`!`D`__^$`#_\0!#$"0GO?_PK[\```P`;SP`````#`!O/@`````,``:$```` +M``P`>24``````^``"``````#X``(`````">]__``!"8`K[```"0"``H`!(8# +MK[\`!!("``]`!``!"8##`!O +M0"80``&2!`````0F`%2`__L`!"8#$`#_]8^_``0GO?_P)`4`$"0&`"L``#@A +MK[\```P`;](``$`AC[\```/@``@GO0`0)[W_L*^U`#0D`@`@)!4`,*^^`$"O +MMP`\K[8`.*^T`#"OLP`LK[(`**^_`$2OL0`DK[``(`!(J`H`@)`A`*"8(0#` +M\"$`X+@A`2"P(0``H"$#M!@A)I0``2J"`"`40/_\H'4```)3$"440``E``"@ +M(20"`#`D%``!HZ(```*6$"H"PJ`+)`(`+1+B`!8"G1`A)I3__P:```B/OP!$ +M`IT0(8!$```,`&]`)I3__P:!__P"G1`AC[\`1(^^`$"/MP`\C[8`.(^U`#2/ +MM``PC[,`+(^R`"B/L0`DC[``(`/@``@GO0!0@$+__R:#__\`51`F`&*@"@.T +M$"$0`/_FH%<``!!`_]\"EA`J``"`(0)`("$"8"@A`@`P(0P`!.,#P#@A/`2` +M`B2$%]``@Q`AD$,```.T$"$"0"`A`F`H(0(`,"$#P#@A#``#1*!#````0)`A +M`$,0)0!@F"$40/_K)I0``1``_\<"EA`J`*!0(0#`6"$`X&`A`(`8(0``$"$G +MO?_P`0!((0!`("$`8"@A`4`P(0%@."&OOP``#`!O>`&`0"&/OP```^``"">] +M`!`D!P`!$(``&0``$"&0@@````(>`!!@`!0`@#`A`,00(RA""`$``C@*``,> +M`R0"``H08@`')`(`#1!B``4D8O_@+$4`7R0"``A48@`!``4X"A#@``4DQ@`! +MD,(````"'@!48/_O`,00(P#@$"$#X``(`````">]_X``A1`EK[X`<*^W`&RO +MM@!HK[4`9*^T`&"OLP!T``&CH@``$IT`"`+@$"$FE/__DH(` +M`";W``&BH@``%IW_^R:U``$"X!`AHJ```(^_`'2/O@!PC[<`;(^V`&B/M0!D +MC[0`8(^S`%R/L@!8C[$`5(^P`%`#X``()[T`@!!`_^D``````!:'PP)`("$" +M8"@A`@`P(0P`!.,"P#@A`\,0(9!"```"0"`A`F`H(:*"```"`#`A#``#1`+` +M."$`0)`A`$,0)0!@F"$40/_N)I0``1``_]0`````)[W_<*^^`(``@/`A`,`@ +M(:^W`'ROM@!XK[4`=*^T`'"OLP!LK[(`:*^_`(2OL0!DK[``8`#`H"$`H+@A +M#`!OXP#@J"$``)`A``"8(:^]`$2OH`!4$$`!9```L"&"@@``)I0``1!```X` +M0(@A)`(`)1(B`!@"("`A`N`H(0/`^`D`````CZ(`5"1"``&OH@!4@H(``":4 +M``$40/_T`$"((8^B`%2/OP"$C[X`@(^W`'R/M@!XC[4`=(^T`'"/LP!LC[(` +M:(^Q`&2/L`!@`^``"">]`)""D0``)`(`+2:4``$``"@AKZ``4!(B`3JOH`!( +M)`(`,%(B`3."D0``KZ``3"8B_]`L0@`*$$``#B0"`"Z/HP!(``,0@`!#$"$` +M`A!``%$0(8*1```D0O_0KZ(`2"8B_]`L0@`*%$#_]2:4``$D`@`N$B(!$8^B +M`$PD`@!L$B(!!Z^@`$`F(O^^,$,`_RQB`#<00``:)B+_VP`#$(`\`X`")&,8 +M1`!#$"&,0@```$``"``````0H`#R)`+__":B```/`^`D"X"@A)`(``20#``BOH@!,KZ,`2"8B_[PP1`#_+((` +M-5!``!*OO0!$/`.``@`$$(`D8QIP`$,0(8Q"````0``(`````#P(@`(E"!?D +M`D`@(0)@*"$#H#`A)`<`"@P`<````````$"P(:^]`$2/H@!(CZ,`0`!6@",F +M`O__`$.`"X^B`$P00``#)!$`(!1@`#HD$0`PCZ(`4!1```Z/H@!``@`0(1A` +M``HF$/__`B`@(0/`^`D"X"@ACZ,`5`(`$"$F$/__)&,``1Q`__BOHP!4CZ(` +M0!1``"(`0"`A`L`0(1A```XFUO__CZ(`1`+@*"&`40``)$(``:^B`$0#P/@) +M`B`@(8^C`%0"P!`A)M;__R1C``$<0/_TKZ,`5(^B`%!00/]9@H(```(`$"$8 +M0/]5)A#__R0$`"`#P/@)`N`H(8^C`%0"`!`A)A#__R1C``$<0/_XKZ,`5!`` +M_TN"@@```\#X"0+@*"&/HP!4)&,``1``_]JOHP!4`&`@(0/`^`D"X"@ACZ,` +M5*^@`$`D8P`!$`#_P*^C`%0\"(`")0@7T`)`("$"8"@A`Z`P(1``_ZLD!P`0 +M/`B``A``__DE"!?P)`0`)0/`^`D"X"@A$`#_J(^B`$B/M@!(%L``!2;&__\D +M%@!`)`(`(`!%L`HFQO__&,#_G0``@"$`$!:`!$$`!``````"$B@'$```!P`2 +M)\,00``$`A,H!@`0$",`4A`$`*(H)0(2(`]_]"OOP``/`*``@"`&"&,1%7HKZ4` +M%*^F`!BOIP`<`&`P(0``*"$GIP`4KZ@`(*^I`"2OJ@`H#`!P1*^K`"R/OP`` +M`^``"">]`#`GO?_P)`(G=!"B``2OOP``C[\```/@``@GO0`0)`(``52"__R/ +MOP``#`!N?@`````0`/_XC[\``">]__`D!``!K[\```P`<>HD!2=TC[\```/@ +M``@GO0`0),;__R0"__\0P@`(`(`8(9"B```DQO__)*4``:!B```D`O__%,+_ +M^B1C``$#X``(`(`0(23&__\D`O__$,(`!@"`&"$DQO__)`+__Z!E```4PO_\ +M)&,``0/@``@`@!`A/`.``HQB5?0D0@`!`^``"*QB5?0\`X`"C&)5]">]__`0 +M0``&K[\``(QB5?0D0O__$$``!0``("&L8E7TC[\```/@``@GO0`0#`!XYP`` +M```0`/_Z`````">]__``H!`A`,`8(0$`8"$!(&@AK[$`!`%@B"$`X%@AK[`` +M``"`*"$!0(`A`B`@(0!`,"$`8#@A`6!`(0&`2"&OOP`(#`!SBP&@4"&N$0`` +MC[\`"(^Q``2/L````^``"">]`!`GO?_PK[```*^_``2,@P`T)`(`$!!B``<` +M@(`A#`!T<0(`("&/OP`$C[````/@``@GO0`0#`!SR``````0`/_W`````#P" +M@`.,1*O4)[W_\*^_```,`'B")(0`&(^_```#X``()[T`$#P"@`,#X``(C$*K +MU">]__"OOP``#`!U10````"/OP```^``"">]`!`GO?_P`*`0(0#`&"$!`%@A +MK[$`!`%`B"$`X%`AK[````"`*"$!((`A`B`@(0!`,"$`8#@A`4!`(:^_``@, +M`'9U`6!((:X1``"/OP`(C[$`!(^P```#X``()[T`$">]__"OOP``#`!V?0`` +M``"/OP```^``"">]`!`GO?_PK[\```P`=NL`````C[\```/@``@GO0`0)[W_ +M\*^_```,`'<$`````(^_```#X``()[T`$">]__"OOP``#`!W&@````"/OP`` +M`^``"">]`!`GO?_PK[\```P`=S(`````C[\```/@``@GO0`0)[W_\*^_```, +M`'=&`````(^_```#X``()[T`$">]__"OOP``#`!W;P````"/OP```^``"">] +M`!`GO?_PK[\```P`=Y8`````C[\```/@``@GO0`0`^``"*RD```\`H`"`^`` +M"(Q"5A0\`H`"C$)6%(Q#``P#X``(C$(`"">]__``H!`A`,`8(:^Q``2OL``` +M`0"((0#@@"$`@"@A`$`P(0!@."&OOP`(#`!_=@$`("&N$0``C[\`"(^Q``2/ +ML````^``"">]`!`GO?_PK[\```P`?YH`````C[\```/@``@GO0`0)[W_\*^_ +M``",@@`H%$``!`"`*"&/OP```^``"">]`!`,`'\GC(0`"!``__N/OP``)[W_ +M\*^_```,`'G4`````(^_```#X``()[T`$">]__"OOP``#`!YUP````"/OP`` +M`^``"">]`!`GO?_PK[\```P`>AT`````C[\```/@``@GO0`0)[W_\*^_```, +M`'I]`````(^_```#X``()[T`$">]__"OOP``#`!ZF@````"/OP```^``"">] +M`!`GO?_PK[\`!*^P```,`'J^`*"`(:X"``"/OP`$C[````/@``@GO0`0)[W_ +M\*^_```,`'K``````(^_```#X``()[T`$">]__"OOP``#`!ZQ@````"/OP`` +M`^``"">]`!`GO?_PK[\```P`>LT`````C[\```/@``@GO0`0)[W_\*^_```, +M`'M"`````(^_```#X``()[T`$">]__"OOP``#`![<`````"/OP```^``"">] +M`!`D`P`%/`*``ZQ#J]`\`H`#)[W_\*Q`J]@\`H`#K[```*^_``0`@(`AK$2K +MU#P"@`*L0%7TC@(`$`!`^`F.!``4#`!TW0`````0`/_[C@(`$">]__`!*A`A +MK[$`!`"`B"&N)@`0)(0`&`"@,"&N)P`4KB(`#*XI``"N*@`$KBD`"`(@*"&O +MOP`,K[(`"*^P```,`'DT`0"0(3P"@`*,1584)C``2#P&@`("`"`A),;6L`P` +M?VD"`#@A/`.``I1D5?`D`@`$KA$`+"2%``&N(@`T)`(``:XB`#BN(``\KB`` +M>*X@`'PF(@"`I&55\*8D`$0D`P`%)&/__ZQ````$8?_])$(`!*XR`)@,`(*G +M`B`@(3P$@`,"("@A#`!X4"2$J]P"("`A#`""BP(@*"&/OP`,C[(`"(^Q``2/ +ML````^``"">]`!`GO?_P`2H0(:^Q``0`@(@AKB8`$"2$`!@`H#`AKB<`%*XB +M``RN*0``KBH`!*XI``@"("@AK[\`#*^R``BOL```#`!Y-`$`D"$\`H`"C$56 +M%"8P`$@\!H`"`@`@(23&UK`,`']I`@`X(3P#@`*49%7P)`(`!*X1`"PDA0`! +MKB(`-"0"``&N(@`XKB``/*X@`'BN(`!\)B(`@*1E5?"F)`!$)`,`!21C__^L +M0```!&'__21"``2N,@"8#`""IP(@("$\!(`#`B`H(0P`>%`DA*O<`B`@(0P` +M@HL"("@AC[\`#(^R``B/L0`$C[````/@``@GO0`0)[W_\*^P```D@P!(K[\` +M!(QB`"@`@(`A%$``%`!@*"$\!(`#`@`H(0P`>%(DA*O]__"OL````("`(3P$@`,DA*O%("`"@A/`.``HQB5?0D0@`!K&)5]#P"@`*,1%7LC(,`G!!P`!X\`H`"C$)5 +M[!1B__L`8"`A/`.``HQB5?0D0O__$$``$@````"L8E7T)@0`2`P`?X.F``!$ +MC@0`&"8#`!@0@P`'C[\`!(QB``2L@@`$C&(`!*QC``2L1```K@,`&(^P```# +MX``()[T`$`P`>.<``"`A$`#_[0`````\!8`"C@(`G(RC5>P4]__"OOP`(K[$`!*^P```\`H`#C%"KU#P1@`*.(E7T)$(` +M`:XB5?2.`@`T/`2``R2$J]P00``2`@`H(8X"`#0T0@`!K@(`-(XB5?0D0O__ +M$$``!P``("&N(E7TC[\`"(^Q``2/L````^``"">]`!`,`'CG`````!``__@` +M````#`!X#0`````0`/_MC@(`-">]__"OL```K[\`"*^Q``0`@(`A/`.``HQB +M5?0D0@`!K&)5](R"`#0D`__\`$,8)#!"``,00``+))$`&*R#`#2.(@`,`(`H +M(11``!D`0"`AC@(`-#P$@`,"`"@A$$``$"2$J]P\`X`"C&)5]"1"__\00``' +M```@(:QB5?2/OP`(C[$`!(^P```#X``()[T`$`P`>.<`````$`#_^``````, +M`'?>`````!``_^X`````#`!XR0`````0`/_EKB``#">]__"OOP```(`P(3P" +M@`*,0U7T)&,``:Q#5?2,@P`X)`(``5!B`!&,@@`T$&```B1B__^L@@`X/`.` +M`HQB5?0D0O__$$``!0``("&L8E7TC[\```/@``@GO0`0#`!XYP`````0`/_Z +M`````"0#__L`@"@AK(``.`!#$"0\!(`#)(2KW!1`_^RLP@`T#`!WW@`````0 +M`/_H`````">]__"OOP```(`P(3P"@`*,0U7T)&,``:Q#5?2,@@`X$$``"20# +M__N,@@`T`(`H(:R``#@`0Q`D/`2``R2$J]P00``.K,(`-#P#@`*,8E7T)$+_ +M_Q!```4``"`AK&)5](^_```#X``()[T`$`P`>.<`````$`#_^@`````,`'?> +M`````!``__``````)[W_\*^_```\`H`"C$-5]"1C``&L0U7TC(,`>"QB``@0 +M0``*``,0@#P#@`(D8QN0`$,0(8Q"````0``(`````"0"``2L@@!\K(``>`P` +M=$$`````/`.``HQB5?0D0O__$$``!0````"L8E7TC[\```/@``@GO0`0#`!X +MYP``("$0`/_Z`````">]__"OOP`(K[$`!*^P```\`X`#C'"KU#P1@`*.(E7T +M)$(``:XB5?2,8JO4)$,`2(QB`"@40``1`&`H(8X"`#0\!(`#)`,`$`(`*"$0 +M0P`#)(2KW`P`>`VN`P`TCB15]`P`>.<`````C[\`"(^Q``2/L````^``"">] +M`!`,`'\GC&0`"!``_^Z.`@`T)[W_\*^P``"OOP`$/`*``XQ"J]00@@`[`("` +M(3P"@`*,0U7T)&,``:Q#5?0,`'28`@`@(28%`$B,H@`H%$``+0````".`P!\ +M)`(`!A!B`!``````C@,`>"QB``@00``,``,0@#P#@`(D8QNP`$,0(8Q"```` +M0``(`````(X"`#000``3/`2``R0"`!"N`@`T#`!T00(`("$\`X`"C&)5]"1" +M__\00``&`````*QB5?2/OP`$C[````/@``@GO0`0#`!XYP``("$0`/_Y```` +M`"2$J]P,`'@-`@`H(1``_^LD`@`0)`(`!JX"`'P0`/_HK@``>`P`?R>,I``( +M$`#_THX#`'P,`'3=`````!``_\,`````)[W_X*^R``BOL```K[\`$*^S``RO +ML0`$`("`(0"@D"$\`X`"C&)5]"1"``&L8E7TC((`-!!``$0``)@A,$(``5!` +M``D\!(`#))$`&(XS``P28``$`F`@(0P`>,D"`"@AKB``##P$@`,DA*O<#`!X +M4@(`*"&.`@`P4$``!JX2`"".`@`@`D(0*A!```*N$@`LKA(`(#P"@`,D4:O< +M`B`@(0P`>%`"`"@AC@(`-!!``"("("`A,$(``1!```8\`H`#$F``!`)@("$, +M`'BG`@`H(3P"@`.,0JO4$@(`%"0#``$,`'@T`@`@(3P#@`*,8E7T)$+__Q!` +M``D`````K&)5](^_`!"/LP`,C[(`"(^Q``2/L````^``"">]`"`,`'CG```@ +M(1``__8`````/`*``Q``_^VL0ZO8#`!WW@(`*"$0`/_D/`*``SP$@`,DA*O< +M#`!X#0(`*"$0`/_#/`2``R>]__`\`H`#K[\``(Q#J]0`@!`A/`2``Q!#``0D +MA*NXC[\```/@``@GO0`0#`!V20`````0`/_[C[\``">]__"OOP``C*0`+#P# +M@`*,8E7T)$(``:QB5?2,@P!X+&(`"!!```H``Q"`/`.``B1C&]``0Q`AC$(` +M``!```@`````)`(`!ZR"`'RL@`!X#`!T00`````\`X`"C&)5]"1"__\00``% +M`````*QB5?2/OP```^``"">]`!`,`'CG```@(1``__H`````$`#_[B0"``,G +MO?_PK[\``#P#@`.,8IL0)$(``0!`("$,`&J[K&*;$!``__H\`X`#/`*``R1" +MFQ@`@A`C)[W_\``"$4.OL`````*`0`("@"$`$!$``@*`(0`0$@`"`H`A`!`4 +M``("@"$`$(`C/`*``R1"F[@`$$L`/`:``CP(@`(!(D@A)0@;\```."$D"A`` +M),;71"0%`!^OOP`(K[$`!`P`]_^`D`CJ8K[,`#*^R``BOOP`0K[$`!*^P +M````H)@A$*(`&`"`D"$D`CJ8$F(`"`````"/OP`0C[,`#(^R``B/L0`$C[`` +M``/@``@GO0`@%D#_^#P"@`,D0IL8$$#_]210`*`\`H`#)$*;&!("__$F$/]@ +M#`!SYP(`("$0`/_Z/`*``R0"``$4@O_H)`(ZF#P"@`,D49L8``"`(0P`==L" +M("`A)A#__R0"__\6`O_[)C$`H!``_]TD`CJ8)[W_\"0$``&OOP``#`!V`R0% +M.IB/OP```^``"">]`!`GO?_P```@(:^_```,`'8#)`4ZF(^_```#X``()[T` +M$`/@``@`````/`*``B1"V0BL@@```^``"*R```0GO?_PK[\``(R"``2,@P`` +M`&#X"0!`("&/OP```^``"">]`!`GO?_PK[\``#P"@`.,0JO4`(`8(0"@,"$` +M0"`A#`!UG0!@*"&/OP```^``"">]`!`GO?_P)`(NX!"B``2OOP``C[\```/@ +M``@GO0`0)`(``52"__R/OP``/`2``PP`=D0DA*NX$`#_]X^_```GO?_P)`0` +M`:^_```,`'9>)`4NX(^_```#X``()[T`$*R``!2LA0``K(8`!*R(``BLB0`, +MK(<`$`/@``BL@``8)[W_\*^_```,`'<$`````(^_```#X``()[T`$">]__"O +ML```/!"``XX"J\P40``%K[\`!(^_``2/L````^``"">]`!!`"&````````$` +M("$\`?__-"'__@$!0"1`B&``````````````````,(0``8X#J\R,8@`8K@*K +MS(QE`!2L8``40`A@```````PA``!`01`)4"(8`````````````````",8@`, +MC&8`$`!`^`F,9```C@*KS!1`_^*/OP`$$`#_WH^P```GO?_PK[\```P`=H0` +M````C[\```/@``@GO0`00`A@```````!`"@A/`'__S0A__X!`4`D0(A@```` +M`````````````#"E``&,@@`4/`:``R1"``&L@@`4C(,`%"0"``$08@`*```` +M`$`(8```````,*4``0$%0"5`B&`````````````#X``(`````(S"J\RL@@`8 +M$`#_]*S$J\PGO?_P,(0``A"```6OOP``$*```P"@("$,`':V`````#P#@`*, +M8E7T)$+__Q!```4``"`AK&)5](^_```#X``()[T`$`P`>.<`````$`#_^@`` +M``",@P``/`*``B1"-R```QB``&(H(8RB```\`H`")$(X$`!B."$\`H`")$(W +MF`"`,"&,I````&(8(3P"@`(D0KPD4((``XS"``@#X``(`````*RB``",P@`0 +MK&(``!``__JLY@``C(,``#P"@`(D0C<@``,8@`!B."$\`H`")$(X$(R%``B, +MY````&(P(3P"@`(D0C>8$(4``P!B&"$#X``(`````#P"@`(D0KPDK.(``*Q@ +M```0`/_YK,```#P$@`.,@JO`%$``$0````!`"&````````$`&"$\`?__-"'_ +M_@$!0"1`B&``````````````````,&,``3P"@`.L0ZO()`,``3P"@`.L0ZO$ +MC(*KP"1"``$#X``(K(*KP#P"@`.,0ZO`)&/__ZQ#J\",0JO`%$``##P"@`.L +M0*O$/`*``XQ"J\A`"&```````#!"``$!`D`E0(A@``````````````````/@ +M``@`````0`A@```````!`#`A/`'__S0A__X!`4`D0(A@```````````````` +M`##&``$D@O_Z)`,``3P%H,``0Q@$+((`!A!``!,TI0`40`-@`"0"!```@A`$ +M`$`0)P!B&"1`@V``````````````````0`A@```````PQ@`!`09`)4"(8``` +M``````````/@``@`````C*(``#!"``$``Q`+$`#_\ZRB``!`"&````````$` +M,"$\`?__-"'__@$!0"1`B&``````````````````,,8``22"__HD`P`!/`6@ +MP`!#&`0L@@`&$$``$C2E`!1``V``)`($``""$`0`8A@E0(-@```````````` +M`````$`(8```````,,8``0$&0"5`B&`````````````#X``(`````(RB```` +M0Q`E$`#_]*RB```L@@`&)`4`!`""*`M``V@`)`($``"B$`0`0!`G`&(8)$"# +M:`````````````/@``@`````)`(NX!"B``,D`@`!`^``"``````4@O_]/`*` +M`ZQ`J\00`/_Z`````">]__`D!``!K[\```P`=Z,D!2[@C[\```/@``@GO0`0 +M)[W_\```("&OOP``#`!WHR0%+N"/OP```^``"">]`!`D`P`!/`*``JQ#5?0D +M!0`?)(,`!"2E__\D`O__K&```!2B__PD8P`$)`,`!3P"@`.L@```K$.KT"0# +M``$\`H`#`^``"*Q#J]@GO?_PK[\`!*^P````@(`A#`!JE(R$`````A"``@*` +M(8X#``2/OP`$C[```"1B_^@``Q`*`^``"">]`!`GO?_@K[(`"*^Q``2OL``` +MK[\`$*^S``R,LP`@C*,`)`"`@"$`$Q"``*"0(0!@("$48``>`@*((8XB``0F +M0P`8```@(0!R(`LD`P`!%$``!`)C&`2.`@```$,0):X"``".(P`$5&``"XQB +M``2N)``$#`!X-`)`("&/OP`0C[,`#(^R``B/L0`$C[````/@``@GO0`@K(,` +M`*R"``2,8@`$K&0`!!``__*L1```#`!XR0`````0`/_ACB(`!(RG`"`DHP`8 +M``48"@`'$(``@C`AC,(`!`!@*"$08@`2),@`!(QB``",8P`$K$,`!(RC``2L +MI0`$K&(``*RE``"-`@``%$``!B0"``&,@P```.(0!``"$"<`8A@DK(,```/@ +M``@`````4&#_]HT"``",8P``4&7_\JS```2,H@`$K&(`!(RB``2LI0`$K$,` +M`*RE```0`/_JK,,`!#P%@`.,HZO4C((`((QC`"``0Q`J%$``!20#``&,HJO4 +MC$(`-!!```,`````/`*``ZQ#J]@#X``(`````#P"@`,D0JO4``8P@`#","$G +MO?_P`*`@(:S%``"OOP``#`!T<0````"/OP```^``"">]`!`#X``(``````/@ +M``@`````/`.``XQBJ]`GO?_PK[\``"1"__\00``$K&*KT(^_```#X``()[T` +M$`P`>&(`````$`#_^X^_```\!8`#C*.KT#P"@`,48``6C$2KU(R"`#040``3 +M/`*``XR#`"`D0JO<``,8@`!B&"&,8@`$4$``!(QC``2,0@``K&(`!(QC``0D +M8O_H``,0"A!$``,D`P`!/`*``ZQ#J]@D`@`%K**KT`/@``@`````K(4`"*R$ +M``0#X``(K(0``">]__"OOP``/`.``HQB5?0D0@`!K&)5]"2$_^B,@@`T%$`` +M$3P"@`.,@P`@)$*KW``#&(``8A@AC&(`!%!```2,8P`$C$(``*QB``2,8P`$ +M)&+_Z``#$`H01``*)`,``3P"@`.L0ZO8/`*``HQ$5?0,`'CG)(3__X^_```# +MX``()[T`$"0#``4\`H`#$`#_]JQ#J]",A@``)*(`&```&"$4P``$`$48"ZR# +M```#X``(K*0`)(S"``2L9@``K&(`!(S"``2LPP`$$`#_^*Q#``",@P``$&`` +M#"1B_^B,90``4*,`":R```",8@`$K*(`!(QB``2L8P`$K$4``*QC``"LA0`` +M)&+_Z``#$`I40``!K$``)`/@``@`````K*``)(R#```DH@`8``40"A!#``H` +M0"@AC$(``(RC``2L0P`$C*,`!*RE``2L8@``K*4```/@``@`````$$#__0`` +M``",0P``$&(`"0````",0@`$K&(`!(RB``2LI0`$K$,``*RE```#X``(K(,` +M``/@``BL@```)[W_\*^Q``2OOP`,K[(`"*^P````@(@A%B``!3P2@`,\`H`# +MC$*KS!1``"\`````CE"KU(X"`#040``$/`*``XQ"J]@00``3`````#P$@`,, +M`'?/)(2KW!("``D`0"`A/`.``XQBK&`DA``,)@4`#"1"``$,``+^K&*L8*Y0 +MJ]0D`@`%/`.``ZQBJ]`\`H`#K$"KV!8@`!``````/`.``JQ@5?0\`H`#C$*K +MS!!```6/OP`,C&)5]"1"``$0`/_6K&)5](^R``B/L0`$C[````/@``@GO0`0 +M/`*``JQ15?00`/_XC[\`#`P`=J\\$H`#$`#_SP`````GO?_PK[\```P`>2D` +M````/`2``R>]__"OOP``#`!WSR2$J]P\`X`#K&"KV"1$``P\`X`##``##ZQB +MJ]0GO?_PK[````#`*"&OOP`$#`!X?@"`@"&N```8K@``#*X``!"/OP`$C[`` +M``/@``@GO0`0)[W_\*^Q``2OOP`,K[(`"*^P``",D@`(`("((0"R$"H40``' +M)(3_Z(^_``R/L@`(C[$`!(^P```#X``()[T`$(XP`!@,`'5%KB``&%(```&N +M,@`4)`(``1``__.N(@`8)[W_\*^_``",P@``%$``!`"@,"&/OP```^``"">] +M`!`,`'E!C*4`(!``__N/OP``)[W_\*^_``",@@`0`(`P(11```HDA/_HC,(` +M&!!```B/OP``C,,`%(S"``BLP``8`$,0*A1```0`8"@AC[\```/@``@GO0`0 +M#`!U10`````0`/_[C[\``">]__"OOP```*`P(0P`>4&,I0`@C[\```/@``@G +MO0`0)[W_\*^_```,`'E9`````(^_```#X``()[T`$">]__"OOP``#`!Y90`` +M``"/OP```^``"">]`!`GO?_PK[\```P`>4$``#`AC[\```/@``@GO0`0)[W_ +M\*^_```,`'EE`````(^_```#X``()[T`$">]__`D`BKXK[$`!*^P``"OOP`( +M`*"((1"B`!8`@(`A)`(J^!(B``8`````C[\`"(^Q``2/L````^``"">]`!`6 +M`/_Z/`*``R11J]PD`O_\$B+_]B8P`(0F(@`$$@+_\R80__P,`(+-`@`@(1`` +M__LF(@`$)`(``52"_^HD`BKX/`2``PP`=[TDA*O<$`#_Y20"*O@GO?_P)`0` +M`:^_```,`'F?)`4J^(^_```#X``()[T`$">]__```"`AK[\```P`>9\D!2KX +MC[\```/@``@GO0`0K(4```/@``BL@``$)[W_\*^Q``2OL```K[\`#*^R``@\ +M`H`#`("`(8Q2J]0D$0`!/`.``HQB5?0D0@`!K&)5](R"```00``7/`2``Q(@ +M``0`````C@(``"1"__^N`@``/`.``HQB5?0D0O__$$``"0````"L8E7T`B`0 +M(8^_``R/L@`(C[$`!(^P```#X``()[T`$`P`>.<``"`A$`#_]@````",@ZO4 +M)`(``:QB`'B,@JO4#`!T':Q``'P"0"@A#`!XIR8$``0\`H`"#`!XYXQ$5?2. +M0P!\*&(`!!1```8H9``&5(``!```B"$D`@`&$&(`"`````".`@``%$#_TP`` +M```6(/_G/`2``Q``_]0`````#`!TW0`````0`/_WC@(``">]_^"OL0`$K[\` +M$*^S``ROL@`(K[```#P%@`,`@(@AC+*KU#P#@`*,8E7T)$(``:QB5?2,HZO4 +M)`(``P``0"$``$@AK&(`>(RBJ]2L0`!\C*2KU`P`?YHDA`!(CD(`?(XC```4 +M8``#+%```18``"(\`X`#/`*``XQ"J]0D10!(C*(`*!1``!@`````$@``!``` +M``".(@``)$+__ZXB```\`X`"C&)5]"1"__\00``*`````*QB5?0"`!`AC[\` +M$(^S``R/L@`(C[$`!(^P```#X``()[T`(`P`>.<``"`A$`#_]0`````,`'\G +MC*0`"!``_^8`````C&*KU"03``.L4P!XC&*KU`P`=!VL0`!\)B0`!`P`>*<" +M0"@A/`*``@P`>.>,1%7TCD,`?"AB``800``-)`(`!BAB``100``#``"`(5!S +M``$``(`ACB(``!1`_\D\`H`#%@#_YSP#@`,0`/_%`````%1B__F.(@``#`!T +MW0`````0`/_UCB(``">]__"OL```K[\`!"00``$\`H`"C$-5]"1C``&L0U7T +MC((``!A``!$D0___K(,``#P#@`*,8E7T)$+__Q!```<``"`AK&)5]`(`$"&/ +MOP`$C[````/@``@GO0`0#`!XYP`````0`/_X`````!``__```(`A)[W_\*^_ +M``2OL````(`8(3P0@`*.`E7T)$(``:X"5?2,@@``C(4`!"2$``0D0@`!%*`` +M#JQB``".`E7T)$+__Q!```8``"`AK@)5](^_``2/L````^``"">]`!`,`'CG +M`````!``__D`````#`!XM@`````D`P`'K$``>*Q#`'P,`'1!`$`@(1``_^L` +M`````^``"(R"```D`@`!K((`#*R```B@@````^``"*R```0GO?_PK[\```P` +M@LTDA``(C[\```/@``@GO0`0)[W_X*^S``ROL0`$K[\`$*^R``BOL```/`*` +M`P"`B"&,4JO4)!,``3P#@`*,8E7T)$(``:QB5?2,@@`,4$``!HXC``PF0P`8 +MC&(`$"1"``&L8@`0CB,`#"0"``)08@!9CB4`$)(B```40``N/`.``U)@`!:. +M(@`,)`(``:XR``2B(@``/`.``HQB5?0D0O__$$``"@````"L8E7T`F`0(8^_ +M`!"/LP`,C[(`"(^Q``2/L````^``"">]`"`,`'CG```@(1``__4`````4$`` +M!HXC``PF0P`8C&(`$"1"__^L8@`0CB,`#"0"``$08@`)`````(XC``PD`@`" +M%&+_X0`````,`'F8)D0`&!``_]T`````#`!YBB9$`!@0`/_VCB,`#(QBJ]0D +M$``!K%``>(QBJ]0,`'0=K$``?`)`*"$,`'BG)B0`"(XB``P04``8`D`H(3P" +M@`(,`'CGC$15](Y#`'PH8@`$%$``!BAD``94@``$``"8(20"``808@`(```` +M`)(B```00/^Y`````!9@_^0\`X`#$`#_S(XB``P,`'3=`````!``__8````` +MCB0`!`P`>7LDA``8$`#_YCP"@`(,`'F1)D0`&!``_Z4`````)[W_\*^P``"O +MOP`$`(`H(200``$\`H`"C$-5]"1C``&L0U7TD((``%1``!```(`A/`*``XQ" +MJ]2,@P`,H+```"1&`!@`P"`A$&``!*RB``2,P@`0)$(``:S"`!",HP`,)`(` +M`A!B`!``````/`.``HQB5?0D0O__$$``!P``("&L8E7T`@`0(8^_``2/L``` +M`^``"">]`!`,`'CG`````!``__@`````#`!YD8RE`!`0`/_N`````">]__"O +ML```K[\`#*^R``BOL0`$`("`(3P"@`*,0U7T)&,``:Q#5?2,@@`(%$``*R22 +M``B.`@`,4$``!XX#``R.`P`$)&,`&(QB`!`D0O__K&(`$(X#``PD`@`!4&(` +M&XX$``2.`P`,)`(``E!B`!..!``$K@``!*(````\`X`"C&)5]"1"__\00``( +M`````*QB5?2/OP`,C[(`"(^Q``2/L````^``"">]`!`,`'CG```@(1``__<` +M````#`!YF"2$`!@0`/_LK@``!`P`>8HDA``8$`#_Y(X#``P,`'BV`D`@(8X# +M``P`0(@A)`(``5!B``B.!0`$)`(`!ZXB`'RN(`!X#`!T00(@("$0`/_*C@(` +M#"8D`!@,`'F#`D`P(1``__8D`@`')[W_\*^_``2OL```/`*``HQ&5?@`@"@A +M/`.``HQB5?0D0@`!K&)5]`P`@)<`P"`A#`"#+P!`@"$"`!`AC[\`!(^P```# +MX``()[T`$">]__"OOP`````P(1"```0`@"@A/`*``@P`@N*,1%7XC[\```/@ +M``@GO0`0)[W_P```*"$D!@`LK[``,*^_`#0,`'(-`("`(20"__^CH@`HKZ(` +M`*^B``2OH@`(KZ(`#*^B`!"OH@`4KZ(`&*^B`""OH@`D/`*``HQ$5?BCH``< +M/`.``HQB5?0D0@`!K&)5]`.@,"$,`()8)`4`7@P`@R\`````CZ(`!%Q```&N +M`@``CZ(`"%Q```&N`@`$CZ(`#%Q```&N`@`]`$`GO?_P-`*WF*^Q``2OL```K[\` +M"`"@B"$0H@`/`("`(30"MY@2(@`%C[\`"(^Q``2/L````^``"">]`!!6`/_[ +MC[\`"#P$@`,,`(-()(2L9!``__:/OP`(/`6``R2EL<`\!H`$/`2``R0"``$` +MQ3`C)(2L9!8"_^H``#@A#`"#/@`````0`/_G-`*WF">]__`D!``!K[\```P` +M?`HT!;>8C[\```/@``@GO0`0)[W_\```("&OOP``#`!\"C0%MYB/OP```^`` +M"">]`!"0@@`,,*7__P`%&@(T0@"`H((`##!"`'^@@P`$H(4```/@``B@@@`, +M)[W_\#P%H,`\!O_\K[\`!*^P```TI0`@$(``&S3&__^,@P``)`(``S1C``,` +M8(`AK(,``(RC````9A@DK*,``*(```0,`&U'H@(`##P#&TXT8X&U`$,`&0(` +M("$``!`0``(3@@P`?#T`0"@A)`(`!Z("``B/OP`$H@``!(^P```#X``()[T` +M$#P"@`(0`/_D)$16`!"``!`PI0#_C(0```.`&"$\'(`#)YS64)""`!0P0@`@ +M$$#__0````"@A0``D((`%#!"`"`00/_]``````/@``@`8.`A/`*``A``_^\D +M1%8`$(``##P"@`*,A``````8(9""`!0P0@`!$$``!`````"0@@``)`,``:"B +M```#X``(`&`0(1``__0D1%8`)[W_X*^P`!"OOP`8K[$`%`"`@"$#@(@A/!R` +M`R> +M/`*``HXC``0``Q"``$,0(0`"@$`"("`A#`!\@`)@*"$`0!@A)`0`9!1```HF +M$/__)`+__Q("``<\`H``)$(#`(Q"`$@`0/@)`````!``__("("`A`D#@(8^_ +M`!"/LP`,C[(`"(^Q``2/L````&`0(0/@``@GO0`@$`#_XB115@`GO?_`K[(` +M"*^_`!"OLP`,K[$`!*^P``"OI@`HKZ<`+*^H`#"OJ0`TKZH`.*^K`#P``)`A +M`X"8(3P<@`,GG-90$(``9#P"@`(LH@`($$``&CP#@`(`!1"`)&,;_`!#$"&, +M0@```$``"`````",@P``/`*``B0%``&L158,D&(`!#10``&@<``$C)$`""HB +M``800``2/`2@P$`#8``D`@0``B(0!`!B&"5`@V```````````````````F#@ +M(0)`$"&/OP`0C[,`#(^R``B/L0`$C[````/@``@GO0!`-(0`%(R#```F(O_Z +M`$40!`!B&"40`/_QK(,``(^P`"@,`&U'C)$````"$0(`4``;4@```0```]_^"OL``0K[\`&*^Q`!0`@#`A`*"`(0`` +M0"$#@(@A/!R``R>]`!`D`@`!#`!]QJQB5A`0`/_ZC[\````` +M$"$``!@AK(4`$*R```"L@@`(`^``"*R#``R,@@``$$``$0````",@P``4&`` +M#(R"``",90``4*,`"*R```",8@`$K*(`!(QB``2L8P`$K$4``*QC``"LA0`` +MC((``%1`__*,@P```^``"``````GO?_0K[(`&"0"__\DLO__K[$`%*^_`""O +MLP`]`#`,`'CG```@(1``_\P`````C@(`&(X#`!R.!@`@ +MC@<`)`!G&"$`9T`K`$80(0!($"&N`@`8K@,`'`P`?MD"`"@A$`#_L(X"``R. +M(@`,`$,0*Q1```2/HP``CB(`#!``_Z..`@`@5&```XQB``00`/^HK[```*X# +M``"N`@`$C&(`!*QP``00`/^BK%```">]__"OL0`$K[```*^_``@`@(@A`*"` +M(3P#@`*,8E7T)$(``:QB5?0D`@`!K*(`*(RC`!B,@@`(`$,0*U1``"V.(P`` +MC((`"%!B`#2,HP`]__"OOP``/`*``HQ#5?0D8P`!K$-5](R" +M```0H@`6`````(RB``",HP`$K$,`!(RC``2LI0`$K&(``*RE``"LH``H/`.` +M`HQB5?0D0O__$$``!0``("&L8E7TC[\```/@``@GO0`0#`!XYP`````0`/_Z +M`````%"@__*LH``HC*,``%!E_^ZL@```C*(`!*QB``2,H@`$K*4`!*Q#``"L +MI0``$`#_YJR#```GO?_@KZ4``"0%``&OOP`4K[``$*^F``0,`'X?`("`(8^B +M``"/OP`4K@(`%(^B``2N`@`8C[``$`/@``@GO0`@)[W_\*^_```,`'XF```` +M`(^_```#X``()[T`$```$"$``!@AK(4`"*R&``RLAP`0K(``**R$``2LA``` +MK((`&*R#`!RL@@`@`^``"*R#`"0``!`A```8(:R%``BLA@`,K(<`$*R``"BL +MA``$K(0``*R"`!BL@P`,A``($`#_\HX#```GO?_@K[4`$*^T``ROLP`( +MK[(`!*^P``"OOP`4C((`*`"`@"$`@"@A`,"0(0#@F"$!`*`A%$``$`$@J"&. +M!``(KA(`&*X3`!RN%``@KA4`)`P`?MD"`"@AC[\`%(^U`!"/M``,C[,`"(^R +M``2/L````^``"">]`"`,`'\GC(0`"!``_^^.!``()[W_X*^R``BOOP`4K[4` +M$*^T``ROL0`$K[```(R"`"",B@`D`$!8(0!*$"400``:`("0(8R"``B,D``@ +MC)$`)(R4`!B,E0`]__"OOP``#`!M4@`````\ +M`X`"K&)7?$"`2`````````````````!`@E@`````````````````#`!WEB0$ +M``6/OP``)`(``P/@``@GO0`0)[W_\*^_```,`'X[`,`@(3P$@`,,`'A4)(2K +MW(^_```#X``()[T`$">]__`D`C:PK[$`!*^P``"OOP`(`*"((1"B`!$`@(`A +M)`(VL!(B``8\`H`#C[\`"(^Q``2/L````^``"">]`!`6`/_Z)%&P>`P`=GTF +M)``<#`!_8@(@("$0`/_UC[\`""0"``%4@O_O)`(VL#P$@`,,`(``)(2P>!`` +M_^HD`C:P)[W_\"0$``&OOP``#`"`2B0%-K"/OP```^``"">]`!`GO?_P```@ +M(:^_```,`(!*)`4VL(^_```#X``()[T`$*R%``"LA@`$K(``#*R```@``$`A +M`(`X(24(``$DX@`(+0,`@*SB`!"LX@`4%&#_^@!`."$PHP`'4&```P``&"$D +M`@`(`$,8(R1B`!``PA`K4$```XR"``0#X``(K(````"C&"&L@P`0-$(``0/@ +M``BL8@`$C((```"`8"$00``=``!8(02@`!L`````)*4`"RBB`!=40``#)`4` +M$"0"__@`HB@D+*(!^!!``/``!1I"`*P0(21)``B-)P`,$.D`#P`%6,*,XP`$ +M)`+__HSJ``P`8D`D`.@8(8QB``2,Z0`().L`"#1"``&M20`(K&(`!*TJ``P# +MX``(`6`0(21)`!"-)P`,5.G_\(SC``0E:P`"C8<`&"6.`!`0[@`N)`/__HSB +M``0`0T`D`04P(RC"`!!40``.K8X`'`#E0"$TH@`!`088(33$``$DZP`(K.(` +M!*V(`!BL9@``K00`!*T.``BMB``<$`#_XZT.``P$P``'K8X`&`#H&"&,8@`$ +M).L`"#1"``$0`/_;K&(`!"T"`@`00`""``@:0@`((,(`!!#``8(0(21*``B- +M@P`,C4D`"``$(((D`@`!`((0!`!B&"6M@P`,K.H`#*SI``BM)P`,K4<`""EC +M```E8@`#`6,0"HV&``P``A"#)`,``0!#(`0`Q!`K5$``.XV$`!``AA`D%$`` +M#``+$,``!"!`)`+__`%B$"0`AA@D%&``!21+``0`!"!``(80)!!`__TE:P`$ +M``L0P`&"$"$D20`(`6!H(0$@4"&-1P`,4.H`#B5K``&,X@`$)`/__@!#0"0! +M!3`C*,(`$%!``#^,Z0`(!,,`-0#H&"&,YP`,5.K_]XSB``0E:P`!,6(``Q1` +M_^XE2@`(,:(``R4I__@00``E):W__XTB``@02?_[,:(``XV#``P`!"!``&00 +M*U1```J-A``0$(``!P"#$"140/_:``L0P``$($``@Q`D$`#_^R5K``2-A``0 +M)`/__HR"``0`0Q`D`$48*Q1@``0`13`C*,(`$%!```,`@#@A$`#_>@``6"$T +MPP`!`(4@(32B``&LX@`$K80`$*R#``00`/]R).L`"(V"``P`!!@G`$,0)!`` +M_]NM@@`,C&(`!(SJ``R,Z0`(-$(``23K``BL8@`$$`#_9*U)``B,Z@`,`.5` +M(32B``$!!A@A-,0``:U)``BLX@`$K8@`&"3K``BL9@``K00`!*T.``@0`/]R +MK2H`#!!@``8`""#"+&(`!1!``!XL8@`5``@1@B1$`#@`!!#``8(0(21*``B- +M20`($2H`$22#``.-(@`$)`/__@!#$"0!`A`K4$#_>(TJ``R-*0`($2H`!B0# +M__Z-(@`$`$,0)`$"$"M40/_ZC2D`"!``_VZ-*@`,*((```!B(`N-@P`,$`#_ +M90`$((,40/_D)&0`6RQB`%400``$+&(!50`($P(0`/_>)$0`;A!```0L8@55 +M``@3PA``_]DD1`!W4$#_UR0$`'X`"!2"$`#_U"1$`'P08``&``58PBQB``40 +M0``=+&(`%0`%$8(D2P`X``L0P`&"$"$D2@`(C4<`#%#J_QTE:P`!C.(`!"0# +M__X`0T`D`04P(RC"`!!00``&)6O__P3#``8`Z!@AC.<`#%3J__>,X@`$$`#_ +M#R5K``&,8@`$C.H`#(SI``@T0@`!$`#^_R3K``@40/_E)&L`6RQB`%400``$ +M+&(!50`%$P(0`/_?)$L`;A!```0L8@55``43PA``_]HD2P!W4$#_V"0+`'X` +M!12"$`#_U21+`'P`@%@A$*``0```&"$DJ?_XC28`!"0"__Z,A``0`,)`)`$H +M4"&-0P`$$40`=0!B&"0XP@`!,$(``:U#``000``*``!@(8RE__@E8@`0`25( +M(XTD``@0@@!H`05`(8TG``RLY``(K(<`#`%#$"&00@`'.$(``3!"``$00``, +M-0(``16```4!`T`AC4,`""5B`!!08@!4)`P``8U&``B-1P`,K.8`"*S'``PU +M`@`!`2@8(:TB``05@``3K&@``"T"`@!00``3``@:0@`((,(`!!#``6(0(21' +M``B-8P`,C.8`"``$(((D`@`!`((0!`!B&"6M8P`,K2<`#*TF``BLR0`,K.D` +M""0#``$#X``(`&`0(1!@``8`""#"+&(`!1!``!\L8@`5``@1@B1$`#@`!!#` +M`6(0(21'``B,Y@`($,<`$B2#``.,P@`$)`/__@!#$"0!`A`K4$#_YXS'``R, +MQ@`(4,?_Y(S'``R,P@`$)`/__@!#$"0!`A`K5$#_^8S&``@0`/_*S#`)"LP@",K,D`=*S``(2LP`"`K,,`?`/@``BL +MA@`,)[W_\*^_```\`X`"C&)5]"1"``&L8E7T/`*``HQ"5>P40``1`$`8(:R$ +M`)P\`H`"K$15[#P#@`*,8E7T)$+__Q!```4`````K&)5](^_```#X``()[T` +M$`P`>.<``"`A$`#_^@`````0@__P/`*``HQ"5>R,8P"<%&+_^P`````0@__K +M/`*``HQB`)RL@@"<$`#_YJQD`)R,@@``$$``$0````",@P``4&``#(R"``", +M90``4*,`"*R```",8@`$K*(`!(QB``2L8P`$K$4``*QC``"LA0``C((``%1` +M__*,@P```^``"``````GO?_0K[(`&*^_`"BOM0`DK[0`(*^S`!ROL0`4K[`` +M$`"`D"$\`H`"C$-5]"1C``$,`('(K$-5]`!`J"&.0@00$$``&B94!!"OH``` +M#`!XM@*`("&,4P!``D`@(0!`@"$,`("7CF4```!`B"$"`"`A$$``+`(`*"$D +M`@`'K@(`?`P`=$&N``!XKG$`!(Y"!!!40/_N)E0$$(^B```40``7``````P` +M@LT#H"`A/`.``HQB5?0D0O__$$``#`````"L8E7T`J`0(8^_`"B/M0`DC[0` +M((^S`!R/L@`8C[$`%(^P`!`#X``()[T`,`P`>.<``"`A$`#_\P`````,`'BV +M`Z`@(0!`*"$,`'BG`H`@(8^B```40/_Y`````!``_^$`````#`!XIP.@("$0 +M`/_8CD($$">]__"OOP``/`.``HQB5?0D0O__$$``!0``("&L8E7TC[\```/@ +M``@GO0`0#`!XYP`````0`/_Z`````">]__"OL```K[\`!`P`@'H`@(`AK@`$ +M$(^_``2/L````^``"">]`!`GO?_PK[```*^_``ROL@`(K[$`!`"`@"$\`H`" +MC$-5]"1C``&L0U7TC(($$"22!!`40``3`D"((3P#@`*,8E7T)$+__Q!```H` +M````K&)5]`P`@LT"0"`AC[\`#(^R``B/L0`$C[````/@``@GO0`0#`!XYP`` +M("$0`/_U``````P`>+8"("`A)`,`!:Q#`'RL0`!X#`!T00!`("&.`@00%$#_ +M]P`````0`/_C`````(RG```0X``&`(`8(8R&``!4P``%C.(`!*R'``"LH``` +M`^``"`````",Q``$K,(`!(QC``"LY``$K$,``!``__>LAP```````$UE;6]R +M>2!UF4@5'@Z("5D("!2 +M>#H@)61="@H``%1!4D=?=V1C5'A-X@`!WN(``=[B``'>X@`!W +MN(``=[B``'>X@`!WN(``=[B``'>X@`!WN(``=[B``'>X@`!WN(``=[B``'>X +M@`!WN(``=\B``'?<@`!W\(``>$PD260Z("\O9&5P;W0O4-A8VAE +M+F,C."`D``"``+#8@`"H%(``I^2``+$@@`"H%(``J!2``*@4@`"H%(``J!2` +M`*@4@`"H%(``J!2``*@4@`"H%(``J!2``*@4@`"Q1(``L52``*@4@`"H%(`` +MJ!2``*@4@`"H%(``J!2``*@4@`"H%(``J!2``*@4@`"H%(``J!2``*@4@`"H +M%(``L50D260Z("\O9&5P;W0OL@`"G?(``L+B``*>L@`"GK(``IZR` -M`*>L@`"GK(``IZR``*>L@`"GK(``IZR``*>L@`"GK(``IZR``+#<@`"P[(`` -MIZR``*>L@`"GK(``IZR``*>L@`"GK(``IZR``*>L@`"GK(``IZR``*>L@`"G -MK(``IZR``*>L@`"P["1)9#H@+R]D97!O="]S=R]BR``4'T@`%!_(`!0@2``4(0@`%"&(`!0B2``4(P -M@`%"/(`!0DB``4)4@`%"8(`!0FR``4)X@`%"A(`!0I"``4*<@`%"J(`!0K2` -M`4+`@`%"X(`!0NR``4+X@`%#!(`!0Q"``4,<@`%#*(`!0S2``4-`@`%#3(`! -M0UB``4-D@`%#<"XN+RXN+RXN+RXN+RXN+VAA;"]W9&,O=&%R9V5T+W-R8R]A -M(`!7'B``5T(@`%<>(`!71R``5V`@`%=B(`! -M79"``5V8@`%=H(`!7:B``5VP@`%<>(`!7;B``5W$@`%=T(`!7=B``5WT@`%@ -MY(`!8B2``6'`@`%AS(`!8B2``6'4@`%AW(`!8>2``6'L@`%A](`!8?R``6(< -M@`%B)(`!8BR``6)(55-".B5S(%LE9%T*`````'9E;F1OIB` -M`7JT@`%Z4(`!>M"``7I0@`%Z[(`!>PB``7LD@`%[0(`!>UR``7NX@`%[U(`! -M>_!/=F5R:61E(#H@)60@96X@.B`E9`H```!#;VYF:6<@.B`E>`H`````@`&* -MZ(`!BO"``8L4@`&+'(`!BR2``8LL@`&+L(`!B[2``8O8@`&+\(`!B_B``8P` -M@`&,"$4*```P,3(S-#4V-S@Y04)#1$5&`````#`Q,C,T-38W.#D``#`Q,C,T +M4&]W97(N8R,U("0`@`#5H(``UCB``-4D@`#6E(``UU@D260Z("\O9&5P;W0O +M(@`%'E(`!1Z"``4>L@`%'N(`! +M1\2``4?0+BXO+BXO+BXO+BXO+BXO:&%L+W=D8R]T87)G970O(`! +M@91/=F5R:61E(#H@)60@96X@.B`E9`H```!#;VYF:6<@.B`E>`H`````@`&0 +M=(`!D'R``9"@@`&0J(`!D+"``9"X@`&1/(`!D4"``9%D@`&1?(`!D82``9&, +M@`&1E$4*```P,3(S-#4V-S@Y04)#1$5&`````#`Q,C,T-38W.#D``#`Q,C,T M-38W.#EA8F-D968`````/$YO="!A('-T_8 -M@`'OF(`![YB``>^8@`'P((`![TR``?"<@`'PI``!`@(#`P,#!`0$!`0$!`0% +M("`@(````"4P-%@@````("`@("````"``=-`@`'3+(`!TRR``=,L@`'30(`! +MTT"``=-`@`'30(`!U'R``=3D@`'4Y(`!U.2``=28@`'4F(`!U)B``=28@`'7 +M"(`!UPB``=;T@`'7/(`!UPB``=<(@`'7"(`!UPA)9&QE(%1HBTX`WHM.`-Z+3@``"86'Z`#2Y^@`TN?N@-+G[H -M#2Y^@`TN``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V9>``"88```G1```)T0``"= -M&```G1@``)T0``"89``!S@```X$"#WN!`@][@-$/>X$!#WN!`0``"B -M!```````````````"`````@````(``"B"-:^1XC6OD>(T#Y'B-`^1XC0/D>( -M``"B#&0L`4!D+`%`9$+!8&1"P6!D0L%@``"B'!B#@`H8@X`*&&.`"AB#@`H8 -M@X`*``"B,````````````````````0@`````````#``````````T````!0`` -M`$``````````1`````@```!(````"````$P````0````4`````````!4```` -M'P``"``````````(!`````````@(````````"`P````````($`````````@4 -M````````"!@````````('`````````@@````````""0````````2,``````` -M`!)P````````$#@````````0>````````!"X````````$/@````````1.``` -M`````!%X````````$;@````````1^````````!(X````````$G@````````2 -MN````````!+X````````$S@````````3>````````!.X````````$_@````` -M```4.````````!1X````````%+@````````4^````````!4X````````%7@` -M```````5N````````!7X````````%C@````````6>````````!:X```````` -M%O@````````7.````````!=X````````%[@````````7^````````!`\```` -M````$'P````````0O````````!#\````````$3P````````1?````````!&\ -M````````$?P````````2/````````!)\````````$KP````````2_``````` -M`!,\````````$WP````````3O````````!/\````````%#P````````4?``` -M`````(`$````````@`@```````"`#````````(`8````````@"````````"` -M)````````(`H````,```@"P`!___``"`,`'___\``(`T````,0``@#@````` -M``"`/````````(!(````````@%0```````"`6````````(!<___'_P``@&`` -M```/``"`@````````("$````````@(@```````"`C````````("0```````` -M@)0```````"`F````````(#`*H(P&@``@,0%W`'@``"`R!]`)Q```(#,`?0` -M````@-```!X<``"`U``"JJH``(#8`@!550``@-P```````"`X/____\``(#D -M``#__P``@.@```````"`[````````(#P````````@/0```````"`^``````` -M`(#\````B```AP````````"'!````(P``(<(````Y```APP```+5``"'$``` -M`````(<4````````AQ@```"@``"''````'1P``)@(````````F`RMA(X9``"8$'THX````)@4G`J?:P``F!P````` -M``"8+``"H`(``)@\``(!````F$`@:@%Z``"83!*$(SP``)A4```(60``F0`` -M``````"9!````````)D(````````F0P`@`````"9$`````$``)D<```,@``` -MF2`%$`````"9*`````$``)DL````!```F3```$B"``"9-!X?("(``)DX"@L, -M#0``F3P````_``"90`````0``)E(DH"R$@``F51=4.&(``"96````/\``)E< -M`$MJC@``F6@```/.``"92JJJJJ``"9Z#Q& -M9'@``)GL````J@``HA``@&,S``"B%``0;!```*(8`)Q`8```HB`!B##&``"B -M)```!````*(H```)M0``HBP```````"B-"`@("```*(X("`@(```HCP3R(FO -M``"B0#A)"B```*)$``![M@``HD@/_S_\``"B3````````*)0````````HE0` -M``````";`````````)L$`````0``FP@````"``";#`````,``)L0````!``` -MFQ0````%``";&`````@``)L<````"0``FR`````*``";)`````L``)LH```` -M#```FRP````-``";,````!```)LT````$0``FS@````2``";/````!,``)M` -M````%```FT0````5``";2````!@``)M,````&0``FU`````:``";5````!L` -M`)M8````'```FUP````=``";8````"```)MD````(0``FV@````B``";;``` -M`",``)MP````)```FW0````E``";>````"@``)M\````*0``FX`````J``"; -MA````"L``)N(````+```FXP````M``";D````#```)N4````,0``FY@````R -M``";G````#,``)N@````-```FZ0````U``";J````#4``)NL````-0``F[`` -M```U``";M````#4``)NX````-0``F[P````U``";P````#4``)O$````-0`` -MF\@````U``";S````#4``)O0````-0``F]0````U``";V````#4``)O<```` -M-0``F^`````U``";Y````#4``)OH````-0``F^P````U``";\````#4``)OT -M````-0``F_@````0``";_````!H``)H`````!P````<``)H$````1P```$<` -M`)H(````AP```(<``)H,```!H````:```)H0```!X````>```)H4````(``` -M`"```)H8````8````&```)H<```!H0```:$``)H@```!X0```>$``)HD```` -M(0```"$``)HH````80```&$``)HL```!8@```6(``)HP```!H@```:(``)HT -M```!X@```>(``)HX````(@```"(``)H\````8@```&(``)I````!8P```6,` -M`)I$```!HP```:,``)I(```!XP```>,``)I,````(P```",``)I0````8P`` -M`&,``)I4```!A````80``)I8```!Q````<0``)I<````!`````0``)I@```! -MZ@````L``)ID````*@```$L``)IH````:@```(L``)IL````J@```:P``)IP -M```!JP```>P``)IT```!ZP```"P``)IX````*P```!(``)I\````:P```%(` -M`)J`````JP```)(``)J$```!K````9,``)J(```![````=,``)J,````+``` -M`!,``)J0````.@```%,``)J4````>@```),``)J8````N@```90``)J<```! -MNP```=0``)J@```!^P```!0``)JD````.P```#H``)JH````>P```'H``)JL -M````NP```+H``)JP```!O````;L``)JT```!_````?L``)JX````/````#L` -M`)J\````?````'L``)K`````O````+L``)K$````_````;P``)K(````_``` -M`?P``)K,````_````#P``)K0````_````'P``)K4````_````+P``)K8```` -M_````/P``)K<````_````/P``)K@````_````/P``)KD````_````/P``)KH -M````_````/P``)KL````_````/P``)KP````_````/P``)KT````_````/P` -M`)KX````_````/P``)K\````_````/P``)C4````(```F-`#!@0(`P<$"`,& -M!`@#!@0(`P<$"```F-P`H,#``*#`P`#@P,``X,#``.#`P```F)P*````"@`` -M``H````*````"@``````F)P`````````````````````````````F)P`@``` -M`(````"`````@````(``````F)P`*@```"H````J````*@```"H`````F)P` -M`0````$````!`````0````$`````F)P````````````````````````````` -MF)P`&````!@````8````&````!@`````F)P`8````&````!N````;@```&X` -M````F)P`QP```,<```#'````QP```,<`````F)P`2P```$L```!+````2P`` -M`$L`````F)P$2```!$@```1(```$2```!$@`````F)P`3````$P```!,```` -M3````$P`````F)P`Y````.0```#D````Y````.0`````F)P````````````` -M````````````````F)P`_````/P```#\````_````/P`````F)P`_P```/\` -M``#_````_P```/\`````F)P$/P``!#\```0_```$/P``!#\`````F)P,#``` -M#`P```P,```,#```#`P`````F)P"&0```AD```(9```"&0```AD`````F)P` -M)````"0````D````)````"0`````F)P`M````+0```"T````M````+0````` -MF)P`F0```)D```"9````F0```)D`````F)P`4````%````!0````4````%`` -M````F)P`*@```"H````J````*@```"H`````F)P`$@```!(````2````$@`` -M`!(`````F)S`,@``P#(``,`R``#`,@``P#(`````F)P!=````70```%T```! -M=````70`````F)P`$0```!$````1````$0```!$`````F)R&*```AB@``(8H -M``"&*```AB@`````F)PQA```,80``#&$```QA```,80`````F)P`\@"``/(` -M@`#R`(``\@"``/(`@```F)P`)P`9`"<`&0`G`!D`)P`9`"<`&0``F)P````# -M`````P````,````#`````P``F)P`````````````````````````````F)P` -M``"R````L@```+(```"R````L@``F)P`L"&$`+`AA`"P(80`L"&$`+`AA``` -MF)P`026D`$$EI`!!):0`026D`$$EI```F)P`$9(@`!&2(``1DB``$9(@`!&2 -M(```F)P`&D@``!I(```:2```&D@``!I(````F-@`"P(P``L",``+`C``"P(P -M``L",```F)P```"4````E````)0```"4````E```F)P```"1````D0```)$` -M``"1````D0``F)P````2````$@```!(````2````$@``F)P```"`````@``` -M`(````"`````@```F)P```#9````V0```-D```#9````V0``F)P```!@```` -M8````&````!@````8```F)P```#P````\````/````#P````\```F)P```"B -M````H@```*(```"B````H@``F)P```!2````4@```%(```!2````4@``F)P` -M``#4````U````-0```#4````U```F)P``!3,```4S```%,P``!3,```4S``` -MF)P```2,```$C```!(P```2,```$C```F,0````#`````P````,````#```` -M`X``\02``/5L@`$,<`````,`!@`)`#\```````D````$``0``0`!``$````` -M``````````9&1S@```````````````````0````!``$```````````````1& -M1S<```````````````````,``0`!``$```````````````-&1S8````````` -M``````````0```````$```````````````%&1S4```````````````````0` -M`0`!``````````````````!&1S0```````````````````0````!```````` -M`````/____Y&1S,```````````````````,``0`!`````````````/____U& -M1S(```````````````````0``````````````````/____Q&1S$````````` -M``````````(``0`!`````````````/____I&1S`````````````````````` -M````````````````````````````````````````````````"`````$``P`` -M````````````````````!D9'-P```````````````````@`````````````` -M`````````$9'-@```````````````````0``````````````````_____49' -M-0``````````````````````````````````````____^D9'-``````````` -M```````````!``$`````````````____^$9',P`````````````````````! -M``$````!``$`````____]D9',@`````````````````````!`````0`!``$` -M````____\T9',0`````````````````````!`````0`!`````0``____\$9' -M,``````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````" -M````!`````H````!`````P````H````"````!0````H````"````!`````H` -M```"`````P````H``````````@````,```````````````"``D1X@`)$@(`" -M1,2``D3H@`)$?/\``0P"!@`-`P`'``````X*!```"```&0``````%1L/'PL% -M```````)```8```4&AX`````%P`3'0`6$AP1$``"8EH``/#<*``$```!;C8` -M``@``&=(``!G2```9T@``&=(``!G2` +M50!:`%\`9```````"@`4`!X`*``R`#P`1@!0`%H`9```*%`6+%@H```)#14` +M````,```@!4``(`5``"`%0``@!4``(`5```00``O_`\`+_P/`"_\'P`O_`\` +M+_P/```01``O_`\`+_P/`"_\'P`O_`\`+_P/```02``O_`\`+_P/`"_\'P`O +M_`\`+_P/```03``O_`\`+_P/`"_\'P`O_`\`+_P/```04``O_`\`+_P/`"_\ +M'P`O_`\`+_P/```05``O_`\`+_P/`"_\'P`O_`\`+_P/```06``O_`\`+_P/ +M`"_\'P`O_`\`+_P/```07``O_`\`+_P/`"_\'P`O_`\`+_P/```08``O_`\` +M+_P/`"_\'P`O_`\`+_P/```09``O_`\`+_P/`"_\'P`O_`\`+_P/```0,``` +M`C````'@````L````6````'@```0<````6@```'@```!N````8P```'@```0 +ML```#F```!&````?'```/C@``!&````0\```H.```4!H``!8@```L.```4!H +M``"`%`/H`^@&X`;@!"`$(`A`"$`&X`;@``"`'!*-DZ<)B!//!.`3E1+@$ZL) +MB!//``"8!``````````#```````````````#``"8(`("`@`"`@(``@$"``(" +M`@`"`@(```"8)```#@X```X.```'!P``#@X```X.``"8*`H"``$*`@`!!0(! +M``H"``$*`@`!``"8-```#@X```X.```.#@``#@X```X.``"8.`````<````' +M````"P````L````+``"81!-R%AP3BTX`WHM.`-Z+3@``"86'Z` +M#2Y^@`TN?N@-+G[H#2Y^@`TN``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V9>``"8 +M8```G1```)T0``"=&```G1@``)T0``"89``!S@```X$"#WN!`@][@- +M$/>X$!#WN!`0``"B!```````````````"`````@````(``"B"-:^1XC6OD>( +MT#Y'B-`^1XC0/D>(``"B#&0L`4!D+`%`9$+!8&1"P6!D0L%@``"B'!B#@`H8 +M@X`*&&.`"AB#@`H8@X`*``"B,````````````````````0@`````````#``` +M```````T````!0```$``````````1`````@```!(````"````$P````0```` +M4`````````!4````'P``"``````````(!`````````@(````````"`P````` +M```($`````````@4````````"!@````````('`````````@@````````""0` +M```````2,````````!)P````````$#@````````0>````````!"X```````` +M$/@````````1.````````!%X````````$;@````````1^````````!(X```` +M````$G@````````2N````````!+X````````$S@````````3>````````!.X +M````````$_@````````4.````````!1X````````%+@````````4^``````` +M`!4X````````%7@````````5N````````!7X````````%C@````````6>``` +M`````!:X````````%O@````````7.````````!=X````````%[@````````7 +M^````````!`\````````$'P````````0O````````!#\````````$3P````` +M```1?````````!&\````````$?P````````2/````````!)\````````$KP` +M```````2_````````!,\````````$WP````````3O````````!/\```````` +M%#P````````4?````````(`$````````@`@```````"`#````````(`8```` +M````@"````````"`)````````(`H````,```@"P`!___``"`,`'___\``(`T +M````,0``@#@```````"`/````````(!(````````@%0```````"`6``````` +M`(!<___'_P``@&`````/``"`@````````("$````````@(@```````"`C``` +M`````("0````````@)0```````"`F````````(#`*H(P&@``@,0%W`'@``"` +MR!]`)Q```(#,`?0`````@-```!X<``"`U``"JJH``(#8`@!550``@-P````` +M``"`X/____\``(#D``#__P``@.@```````"`[````````(#P````````@/0` +M``````"`^````````(#\````B```AP````````"'!````(P``(<(````Y``` +MAPP```+5``"'$````````(<4````````AQ@```"@``"''````'1P``)@(````````F`RMA(X9``"8$'THX````)@4 +MG`J?:P``F!P```````"8+``"H`(``)@\``(!````F$`@:@%Z``"83!*$(SP` +M`)A4```(60``F0````````"9!````````)D(````````F0P`@`````"9$``` +M``$``)D<```,@```F2`%$`````"9*`````$``)DL````!```F3```$B"``"9 +M-!X?("(``)DX"@L,#0``F3P````_``"90`````0``)E(DH"R$@``F51=4.&( +M``"96````/\``)E<`$MJC@``F6@```/.``"92JJJJJ``"9Z#Q&9'@``)GL````J@``HA``@&,S``"B%``0;!```*(8`)Q` +M8```HB`!B##&``"B)```!````*(H```)M0``HBP```````"B-"`@("```*(X +M("`@(```HCP3R(FO``"B0#A)"B```*)$``![M@``HD@/_S_\``"B3``````` +M`*)0````````HE0```````";`````````)L$`````0``FP@````"``";#``` +M``,``)L0````!```FQ0````%``";&`````@``)L<````"0``FR`````*``"; +M)`````L``)LH````#```FRP````-``";,````!```)LT````$0``FS@````2 +M``";/````!,``)M`````%```FT0````5``";2````!@``)M,````&0``FU`` +M```:``";5````!L``)M8````'```FUP````=``";8````"```)MD````(0`` +MFV@````B``";;````",``)MP````)```FW0````E``";>````"@``)M\```` +M*0``FX`````J``";A````"L``)N(````+```FXP````M``";D````#```)N4 +M````,0``FY@````R``";G````#,``)N@````-```FZ0````U``";J````#4` +M`)NL````-0``F[`````U``";M````#4``)NX````-0``F[P````U``";P``` +M`#4``)O$````-0``F\@````U``";S````#4``)O0````-0``F]0````U``"; +MV````#4``)O<````-0``F^`````U``";Y````#4``)OH````-0``F^P````U +M``";\````#4``)OT````-0``F_@````0``";_````!H``)H`````!P````<` +M`)H$````1P```$<``)H(````AP```(<``)H,```!H````:```)H0```!X``` +M`>```)H4````(````"```)H8````8````&```)H<```!H0```:$``)H@```! +MX0```>$``)HD````(0```"$``)HH````80```&$``)HL```!8@```6(``)HP +M```!H@```:(``)HT```!X@```>(``)HX````(@```"(``)H\````8@```&(` +M`)I````!8P```6,``)I$```!HP```:,``)I(```!XP```>,``)I,````(P`` +M`",``)I0````8P```&,``)I4```!A````80``)I8```!Q````<0``)I<```` +M!`````0``)I@```!Z@````L``)ID````*@```$L``)IH````:@```(L``)IL +M````J@```:P``)IP```!JP```>P``)IT```!ZP```"P``)IX````*P```!(` +M`)I\````:P```%(``)J`````JP```)(``)J$```!K````9,``)J(```![``` +M`=,``)J,````+````!,``)J0````.@```%,``)J4````>@```),``)J8```` +MN@```90``)J<```!NP```=0``)J@```!^P```!0``)JD````.P```#H``)JH +M````>P```'H``)JL````NP```+H``)JP```!O````;L``)JT```!_````?L` +M`)JX````/````#L``)J\````?````'L``)K`````O````+L``)K$````_``` +M`;P``)K(````_````?P``)K,````_````#P``)K0````_````'P``)K4```` +M_````+P``)K8````_````/P``)K<````_````/P``)K@````_````/P``)KD +M````_````/P``)KH````_````/P``)KL````_````/P``)KP````_````/P` +M`)KT````_````/P``)KX````_````/P``)K\````_````/P``)C4````(``` +MF-`#!@0(`P<$"`,&!`@#!@0(`P<$"```F-P`H,#``*#`P`#@P,``X,#``.#` +MP```F)P*````"@````H````*````"@``````F)P````````````````````` +M````````F)P`@````(````"`````@````(``````F)P`*@```"H````J```` +M*@```"H`````F)P``0````$````!`````0````$`````F)P````````````` +M````````````````F)P`&````!@````8````&````!@`````F)P`8````&`` +M``!N````;@```&X`````F)P`QP```,<```#'````QP```,<`````F)P`2P`` +M`$L```!+````2P```$L`````F)P$2```!$@```1(```$2```!$@`````F)P` +M3````$P```!,````3````$P`````F)P`Y````.0```#D````Y````.0````` +MF)P`````````````````````````````F)P`_````/P```#\````_````/P` +M````F)P`_P```/\```#_````_P```/\`````F)P$/P``!#\```0_```$/P`` +M!#\`````F)P,#```#`P```P,```,#```#`P`````F)P"&0```AD```(9```" +M&0```AD`````F)P`)````"0````D````)````"0`````F)P`M````+0```"T +M````M````+0`````F)P`F0```)D```"9````F0```)D`````F)P`4````%`` +M``!0````4````%``````F)P`*@```"H````J````*@```"H`````F)P`$@`` +M`!(````2````$@```!(`````F)S`,@``P#(``,`R``#`,@``P#(`````F)P! +M=````70```%T```!=````70`````F)P`$0```!$````1````$0```!$````` +MF)R&*```AB@``(8H``"&*```AB@`````F)PQA```,80``#&$```QA```,80` +M````F)P`\@"``/(`@`#R`(``\@"``/(`@```F)P`)P`9`"<`&0`G`!D`)P`9 +M`"<`&0``F)P````#`````P````,````#`````P``F)P````````````````` +M````````````F)P```"R````L@```+(```"R````L@``F)P`L"&$`+`AA`"P +M(80`L"&$`+`AA```F)P`026D`$$EI`!!):0`026D`$$EI```F)P`$9(@`!&2 +M(``1DB``$9(@`!&2(```F)P`&D@``!I(```:2```&D@``!I(````F-@`"P(P +M``L",``+`C``"P(P``L",```F)P```"4````E````)0```"4````E```F)P` +M``"1````D0```)$```"1````D0``F)P````2````$@```!(````2````$@`` +MF)P```"`````@````(````"`````@```F)P```#9````V0```-D```#9```` +MV0``F)P```!@````8````&````!@````8```F)P```#P````\````/````#P +M````\```F)P```"B````H@```*(```"B````H@``F)P```!2````4@```%(` +M``!2````4@``F)P```#4````U````-0```#4````U```F)P``!3,```4S``` +M%,P``!3,```4S```F)P```2,```$C```!(P```2,```$C```F,0````#```` +M`P````,````#`````X``\V"``/BD@`$/J`````,`!@`)`#\```````D````$ +M``0``0`!``$```````````````9&1S@```````````````````0````!``$` +M``````````````1&1S<```````````````````,``0`!``$````````````` +M``-&1S8```````````````````0```````$```````````````%&1S4````` +M``````````````0``0`!``````````````````!&1S0````````````````` +M``0````!`````````````/____Y&1S,```````````````````,``0`!```` +M`````````/____U&1S(```````````````````0``````````````````/__ +M__Q&1S$```````````````````(``0`!`````````````/____I&1S`````` +M```````````````````````````````````````````````````````````` +M````"`````$``P``````````````````````!D9'-P`````````````````` +M`@```````````````````````$9'-@```````````````````0`````````` +M````````_____49'-0``````````````````````````````````````____ +M^D9'-``````````````````````!``$`````````````____^$9',P`````` +M```````````````!``$````!``$`````____]D9',@`````````````````` +M```!`````0`!``$`````____\T9',0`````````````````````!`````0`! +M`````0``____\$9',``````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````"````!`````H````!`````P````H````"````!0````H` +M```"````!`````H````"`````P````H``````````@````,````````````` +M``"``E08@`)4((`"5&2``E2(@`)4'/\``0P"!@`-`P`'``````X*!```"``` +M&0``````%1L/'PL%```````)```8```4&AX`````%P`3'0`6$AP1$``"8EH` +M`/#<*``$```!;C8``$@`%```@`!X -M2``5``"``'A(`!8``(``>$@`%P``@`!X2``8``"``'A(`!D``(``>$@`4``3 -M`%$`$P!3`!,`5@`3`%4`$P!5`!,`@``3`($`$P```,(```#$````Q0```-`` -M``#:````Y````,(```##````U````/(```$-```!*``````````````````` -M`!#_``````````````````````````````````````````````$`````%W`5 -M&`L`C``"`0`\`#P```````$`````(R@>>`\`$@`#`0`\`#P```````$````` -M+N`G$`H`F`($`@`P`#````````$`````1E`V3`X`)`(&`@`P`#````````$` -M````7`!X```````$````!1E!I%`X`)`H& -M`@`>`!X```````$````!7<"!L`D`L`P*`P`:`!H```````$````!C*"J4`T` -M2`P.`P`:`!H```````$````!NX#(9`@`8`P3`P`:`!H```````$````!TO#7 -M/`P`;`P7`P`:`!H````````````````````````````````````````````` +M``````````````````"``K"P```````3``"``'B4$1,``(``>)0`,```@`!X +ME``4``"``'B4`!4``(``>)0`%@``@`!XE``7``"``'B4`!@``(``>)0`&0`` +M@`!XE`!0`!,`40`3`%,`$P!6`!,`50`3`%4`$P"``!,`@0`3````P@```,0` +M``#%````T````-H```#D````P@```,,```#4````\@```0T```$H```````` +M````````````$/\````````````````````````````````````````````` +M`0````$`````%W`5&`L`C``"`0`\`#P```````$````!`````",H'G@/`!(` +M`P$`/``\```````!`````0`````NX"<0"@"8`@0"`#``,````````0````$` +M````1E`V3`X`)`(&`@`P`#````````$````!`````%W`0Y0)`+`$"@,`+``L +M```````!`````0````",H%G8#0!(!`X#`"P`+````````0````$`````NX!K +M"`@`8`03`P`L`"P```````$````!`````-+P```````!`````0`` +M``%&4&D4#@`D"@8"`!X`'@```````0````$````!7<"!L`D`L`P*`P`:`!H` +M``````$````!`````8R@JE`-`$@,#@,`&@`:```````!`````0````&[@,AD +M"`!@#!,#`!H`&@```````0````$````!TO#7/`P`;`P7`P`:`!H````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!D```` +M,@4+,@<(```````````````````(_P`````````````````````````````` +M```````````````!`````0`````+N`J,"P"&``(!`'@`>````````0````$` +M````$90//`\`"0`#`0!X`'@```````$````!`````!=P$X@*`(P"!`(`8`!@ +M```````!`````0`````C*!LF#@`2`@8"`&``8````````0````$`````+N`A +MR@D`F`0*`P!8`%@```````$````!`````$90+.P-`"0$#@,`6`!8```````! +M`````0````!=P#6$"``P!!,#`%@`6````````0````$`````:7@Y.@P`-@07 +M`P!8`%@````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````&0````R````!P````````````````````C_```````````````` +M``````````````````````````````$````!``````7>#P`$``,!`/``\````````0````$`````"[@) +MQ`H`A@($`@#``,````````$````!`````!&4#9,.``D"!@(`P`#````````! +M`````0`````7`!X```````$````!`````5W`0Y0)`+`$#@,`&@`:```````!`````0`` +M``&,H%G8#0!(!!$#`!H`&@```````0````$````!NX!K"`@`8`06`P`:`!H` +M``````$````!`````=+P`!X```````$````!`````490:10. +M`"0-!@(`'@`>```````!`````0````%=P(&P"0"P#PH#`!H`&@```````0`` +M``$````!C*"J4`T`2`\.`P`:`!H```````$````!`````;N`R&0(`&`/$P,` +M&@`:```````!`````0````'2\-<\#`!L#Q<#`!H`&@`````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` @@ -3258,47 +3378,10 @@ M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````````````````````````````````&0````R -M!0LR!P@```````````````````C_```````````````````````````````` -M``````````````$````!%W`5&`L`C``"`0`B`"(```````$````!(R@>>`\` -M$@`$`0`B`"(```````$````!+N`G$`H`F`('`@`>`!X```````$````!1E`V -M3`X`)`()`@`>`!X```````$````!7>`\`$@0#`0`\`#P```````$`````+N`G -M=`H`&`8$`0`P`#````````$`````1E`W%`X`)`8&`@`P`#````````$````` -M7`!X` -M``````$````!1E!I%`X`)`T&`@`>`!X```````$````!7<"!L`D`L`\*`P`: -M`!H```````$````!C*"J4`T`2`\.`P`:`!H```````$````!NX#(9`@`8`\3 -M`P`:`!H```````$````!TO#7/`P`;`\7`P`:`!H````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M```````````````````````````````````````````````````````````` -M`````````````````````````````````````````&0````R"0XR"P<````` -M``````````````3_```````````````````````````````````````````` -M``$````"`^@#A!L`@@```0$Z`3H```````$````"!]`'"!H$A`$!`0$"`*(` -M``````$````"%7P0S!D$BP$"`@$"`*(```````$````"*O@;O!@$E@$$9`$" -M`*(````````````````````````````````````````````````````````` +M"0XR"P<```````````````````3_```````````````````````````````` +M``````````````$````!`````@/H`X0;`((```$!.@$Z```````!`````0`` +M``('T`<(&@2$`0$!`0(`H@```````0````$````"%7P0S!D$BP$"`@$"`*(` +M``````$````!`````BKX&[P8!)8!!&0!`@"B```````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` @@ -3313,16 +3396,20 @@ M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` -M`````,@```!D`````P````````````````8``&P`V`&\`XP%5`JP```````` M```````````````````````````````````````````````````````````` -M````````#?\``````````````````````````````````````````````0`` -M``,`^@#(`P`!`/&$@`'"5(`!ZTB``=-<@`'\/(`!V4B``>&D```` -M`#P$@``DA````^`((3P%@``DI0``/!^``B?_1N``OR@B!!$``0``````OR@@ -M`"#X(0/@,"$#X`@A/!J``B=:1W@\'X`")_]'#`-?T"($$0`!``````-?T"`` -M(/@A`T#X"0``````P$`A`^`((3P)@`(E*4=D/!^``B?_1T`!/T@B!!$``0`` -M```!/T@@`"#X(0$H0"(\`H`")$)'7`!```@`````!!$``0`````#Z$`B`0#X -M(0/@``@```````````"`0"$`H$@A/`N``B5K1W2-(@``K0(``"4I``0E"``$ -0%0O_^P`````#X``(```````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````,@```!D +M````#`````"``D^<``````````"``4Q,@`%-`(`!362``4W8`````````!D` +M```R````2P```%````!3````50```%<```!8````6@```@````<@```"```` +M!R````(````"`````@````(````"`````@````(````"```````````````` +M```````$`PD$!`,@`#8#00!T`&@`90!R`&\` +#include + +#include "libfdt_internal.h" + +int fdt_check_header(const void *fdt) +{ + if (fdt_magic(fdt) == FDT_MAGIC) { + /* Complete tree */ + if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) + return -FDT_ERR_BADVERSION; + } else if (fdt_magic(fdt) == FDT_SW_MAGIC) { + /* Unfinished sequential-write blob */ + if (fdt_size_dt_struct(fdt) == 0) + return -FDT_ERR_BADSTATE; + } else { + return -FDT_ERR_BADMAGIC; + } + + return 0; +} + +const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) +{ + const char *p; + + if (fdt_version(fdt) >= 0x11) + if (((offset + len) < offset) + || ((offset + len) > fdt_size_dt_struct(fdt))) + return NULL; + + p = _fdt_offset_ptr(fdt, offset); + + if (p + len < p) + return NULL; + return p; +} + +uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) +{ + const uint32_t *tagp, *lenp; + uint32_t tag; + int offset = startoffset; + const char *p; + + *nextoffset = -FDT_ERR_TRUNCATED; + tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE); + if (!tagp) + return FDT_END; /* premature end */ + tag = fdt32_to_cpu(*tagp); + offset += FDT_TAGSIZE; + + *nextoffset = -FDT_ERR_BADSTRUCTURE; + switch (tag) { + case FDT_BEGIN_NODE: + /* skip name */ + do { + p = fdt_offset_ptr(fdt, offset++, 1); + } while (p && (*p != '\0')); + if (!p) + return FDT_END; /* premature end */ + break; + + case FDT_PROP: + lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp)); + if (!lenp) + return FDT_END; /* premature end */ + /* skip-name offset, length and value */ + offset += sizeof(struct fdt_property) - FDT_TAGSIZE + + fdt32_to_cpu(*lenp); + break; + + case FDT_END: + case FDT_END_NODE: + case FDT_NOP: + break; + + default: + return FDT_END; + } + + if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset)) + return FDT_END; /* premature end */ + + *nextoffset = FDT_TAGALIGN(offset); + return tag; +} + +int _fdt_check_node_offset(const void *fdt, int offset) +{ + if ((offset < 0) || (offset % FDT_TAGSIZE) + || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE)) + return -FDT_ERR_BADOFFSET; + + return offset; +} + +int fdt_next_node(const void *fdt, int offset, int *depth) +{ + int nextoffset = 0; + uint32_t tag; + + if (offset >= 0) + if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0) + return nextoffset; + + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + + switch (tag) { + case FDT_PROP: + case FDT_NOP: + break; + + case FDT_BEGIN_NODE: + if (depth) + (*depth)++; + break; + + case FDT_END_NODE: + if (depth && ((--(*depth)) < 0)) + return nextoffset; + break; + + case FDT_END: + if ((nextoffset >= 0) + || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth)) + return -FDT_ERR_NOTFOUND; + else + return nextoffset; + } + } while (tag != FDT_BEGIN_NODE); + + return offset; +} + +const char *_fdt_find_string(const char *strtab, int tabsize, const char *s) +{ + int len = strlen(s) + 1; + const char *last = strtab + tabsize - len; + const char *p; + + for (p = strtab; p <= last; p++) + if (memcmp(p, s, len) == 0) + return p; + return NULL; +} + +int fdt_move(const void *fdt, void *buf, int bufsize) +{ + FDT_CHECK_HEADER(fdt); + + if (fdt_totalsize(fdt) > bufsize) + return -FDT_ERR_NOSPACE; + + memmove(buf, fdt, fdt_totalsize(fdt)); + return 0; +} diff --git a/sys/contrib/libfdt/fdt.h b/sys/contrib/libfdt/fdt.h new file mode 100644 index 000000000000..48ccfd910000 --- /dev/null +++ b/sys/contrib/libfdt/fdt.h @@ -0,0 +1,60 @@ +#ifndef _FDT_H +#define _FDT_H + +#ifndef __ASSEMBLY__ + +struct fdt_header { + uint32_t magic; /* magic word FDT_MAGIC */ + uint32_t totalsize; /* total size of DT block */ + uint32_t off_dt_struct; /* offset to structure */ + uint32_t off_dt_strings; /* offset to strings */ + uint32_t off_mem_rsvmap; /* offset to memory reserve map */ + uint32_t version; /* format version */ + uint32_t last_comp_version; /* last compatible version */ + + /* version 2 fields below */ + uint32_t boot_cpuid_phys; /* Which physical CPU id we're + booting on */ + /* version 3 fields below */ + uint32_t size_dt_strings; /* size of the strings block */ + + /* version 17 fields below */ + uint32_t size_dt_struct; /* size of the structure block */ +}; + +struct fdt_reserve_entry { + uint64_t address; + uint64_t size; +}; + +struct fdt_node_header { + uint32_t tag; + char name[0]; +}; + +struct fdt_property { + uint32_t tag; + uint32_t len; + uint32_t nameoff; + char data[0]; +}; + +#endif /* !__ASSEMBLY */ + +#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ +#define FDT_TAGSIZE sizeof(uint32_t) + +#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ +#define FDT_END_NODE 0x2 /* End node */ +#define FDT_PROP 0x3 /* Property: name off, + size, content */ +#define FDT_NOP 0x4 /* nop */ +#define FDT_END 0x9 + +#define FDT_V1_SIZE (7*sizeof(uint32_t)) +#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t)) +#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t)) +#define FDT_V16_SIZE FDT_V3_SIZE +#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t)) + +#endif /* _FDT_H */ diff --git a/sys/contrib/libfdt/fdt_ro.c b/sys/contrib/libfdt/fdt_ro.c new file mode 100644 index 000000000000..951cc740b3f4 --- /dev/null +++ b/sys/contrib/libfdt/fdt_ro.c @@ -0,0 +1,523 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +static int _fdt_nodename_eq(const void *fdt, int offset, + const char *s, int len) +{ + const char *p = fdt_offset_ptr(fdt, offset + FDT_TAGSIZE, len+1); + + if (! p) + /* short match */ + return 0; + + if (memcmp(p, s, len) != 0) + return 0; + + if (p[len] == '\0') + return 1; + else if (!memchr(s, '@', len) && (p[len] == '@')) + return 1; + else + return 0; +} + +const char *fdt_string(const void *fdt, int stroffset) +{ + return (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset; +} + +static int _fdt_string_eq(const void *fdt, int stroffset, + const char *s, int len) +{ + const char *p = fdt_string(fdt, stroffset); + + return (strlen(p) == len) && (memcmp(p, s, len) == 0); +} + +int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) +{ + FDT_CHECK_HEADER(fdt); + *address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address); + *size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size); + return 0; +} + +int fdt_num_mem_rsv(const void *fdt) +{ + int i = 0; + + while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0) + i++; + return i; +} + +int fdt_subnode_offset_namelen(const void *fdt, int offset, + const char *name, int namelen) +{ + int depth; + + FDT_CHECK_HEADER(fdt); + + for (depth = 0; + (offset >= 0) && (depth >= 0); + offset = fdt_next_node(fdt, offset, &depth)) + if ((depth == 1) + && _fdt_nodename_eq(fdt, offset, name, namelen)) + return offset; + + if (depth < 0) + return -FDT_ERR_NOTFOUND; + return offset; /* error */ +} + +int fdt_subnode_offset(const void *fdt, int parentoffset, + const char *name) +{ + return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name)); +} + +int fdt_path_offset(const void *fdt, const char *path) +{ + const char *end = path + strlen(path); + const char *p = path; + int offset = 0; + + FDT_CHECK_HEADER(fdt); + + /* see if we have an alias */ + if (*path != '/') { + const char *q = strchr(path, '/'); + + if (!q) + q = end; + + p = fdt_get_alias_namelen(fdt, p, q - p); + if (!p) + return -FDT_ERR_BADPATH; + offset = fdt_path_offset(fdt, p); + + p = q; + } + + while (*p) { + const char *q; + + while (*p == '/') + p++; + if (! *p) + return offset; + q = strchr(p, '/'); + if (! q) + q = end; + + offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p); + if (offset < 0) + return offset; + + p = q; + } + + return offset; +} + +const char *fdt_get_name(const void *fdt, int nodeoffset, int *len) +{ + const struct fdt_node_header *nh = _fdt_offset_ptr(fdt, nodeoffset); + int err; + + if (((err = fdt_check_header(fdt)) != 0) + || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0)) + goto fail; + + if (len) + *len = strlen(nh->name); + + return nh->name; + + fail: + if (len) + *len = err; + return NULL; +} + +const struct fdt_property *fdt_get_property_namelen(const void *fdt, + int nodeoffset, + const char *name, + int namelen, int *lenp) +{ + uint32_t tag; + const struct fdt_property *prop; + int offset, nextoffset; + int err; + + if (((err = fdt_check_header(fdt)) != 0) + || ((err = _fdt_check_node_offset(fdt, nodeoffset)) < 0)) + goto fail; + + nextoffset = err; + do { + offset = nextoffset; + + tag = fdt_next_tag(fdt, offset, &nextoffset); + switch (tag) { + case FDT_END: + if (nextoffset < 0) + err = nextoffset; + else + /* FDT_END tag with unclosed nodes */ + err = -FDT_ERR_BADSTRUCTURE; + goto fail; + + case FDT_PROP: + prop = _fdt_offset_ptr(fdt, offset); + if (_fdt_string_eq(fdt, fdt32_to_cpu(prop->nameoff), + name, namelen)) { + /* Found it! */ + if (lenp) + *lenp = fdt32_to_cpu(prop->len); + + return prop; + } + break; + } + } while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE)); + + err = -FDT_ERR_NOTFOUND; + fail: + if (lenp) + *lenp = err; + return NULL; +} + +const struct fdt_property *fdt_get_property(const void *fdt, + int nodeoffset, + const char *name, int *lenp) +{ + return fdt_get_property_namelen(fdt, nodeoffset, name, + strlen(name), lenp); +} + +const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, + const char *name, int namelen, int *lenp) +{ + const struct fdt_property *prop; + + prop = fdt_get_property_namelen(fdt, nodeoffset, name, namelen, lenp); + if (! prop) + return NULL; + + return prop->data; +} + +const void *fdt_getprop(const void *fdt, int nodeoffset, + const char *name, int *lenp) +{ + return fdt_getprop_namelen(fdt, nodeoffset, name, strlen(name), lenp); +} + +uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) +{ + const uint32_t *php; + int len; + + /* FIXME: This is a bit sub-optimal, since we potentially scan + * over all the properties twice. */ + php = fdt_getprop(fdt, nodeoffset, "phandle", &len); + if (!php || (len != sizeof(*php))) { + php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len); + if (!php || (len != sizeof(*php))) + return 0; + } + + return fdt32_to_cpu(*php); +} + +const char *fdt_get_alias_namelen(const void *fdt, + const char *name, int namelen) +{ + int aliasoffset; + + aliasoffset = fdt_path_offset(fdt, "/aliases"); + if (aliasoffset < 0) + return NULL; + + return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL); +} + +const char *fdt_get_alias(const void *fdt, const char *name) +{ + return fdt_get_alias_namelen(fdt, name, strlen(name)); +} + +int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen) +{ + int pdepth = 0, p = 0; + int offset, depth, namelen; + const char *name; + + FDT_CHECK_HEADER(fdt); + + if (buflen < 2) + return -FDT_ERR_NOSPACE; + + for (offset = 0, depth = 0; + (offset >= 0) && (offset <= nodeoffset); + offset = fdt_next_node(fdt, offset, &depth)) { + while (pdepth > depth) { + do { + p--; + } while (buf[p-1] != '/'); + pdepth--; + } + + if (pdepth >= depth) { + name = fdt_get_name(fdt, offset, &namelen); + if (!name) + return namelen; + if ((p + namelen + 1) <= buflen) { + memcpy(buf + p, name, namelen); + p += namelen; + buf[p++] = '/'; + pdepth++; + } + } + + if (offset == nodeoffset) { + if (pdepth < (depth + 1)) + return -FDT_ERR_NOSPACE; + + if (p > 1) /* special case so that root path is "/", not "" */ + p--; + buf[p] = '\0'; + return 0; + } + } + + if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) + return -FDT_ERR_BADOFFSET; + else if (offset == -FDT_ERR_BADOFFSET) + return -FDT_ERR_BADSTRUCTURE; + + return offset; /* error from fdt_next_node() */ +} + +int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, + int supernodedepth, int *nodedepth) +{ + int offset, depth; + int supernodeoffset = -FDT_ERR_INTERNAL; + + FDT_CHECK_HEADER(fdt); + + if (supernodedepth < 0) + return -FDT_ERR_NOTFOUND; + + for (offset = 0, depth = 0; + (offset >= 0) && (offset <= nodeoffset); + offset = fdt_next_node(fdt, offset, &depth)) { + if (depth == supernodedepth) + supernodeoffset = offset; + + if (offset == nodeoffset) { + if (nodedepth) + *nodedepth = depth; + + if (supernodedepth > depth) + return -FDT_ERR_NOTFOUND; + else + return supernodeoffset; + } + } + + if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) + return -FDT_ERR_BADOFFSET; + else if (offset == -FDT_ERR_BADOFFSET) + return -FDT_ERR_BADSTRUCTURE; + + return offset; /* error from fdt_next_node() */ +} + +int fdt_node_depth(const void *fdt, int nodeoffset) +{ + int nodedepth; + int err; + + err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth); + if (err) + return (err < 0) ? err : -FDT_ERR_INTERNAL; + return nodedepth; +} + +int fdt_parent_offset(const void *fdt, int nodeoffset) +{ + int nodedepth = fdt_node_depth(fdt, nodeoffset); + + if (nodedepth < 0) + return nodedepth; + return fdt_supernode_atdepth_offset(fdt, nodeoffset, + nodedepth - 1, NULL); +} + +int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, + const char *propname, + const void *propval, int proplen) +{ + int offset; + const void *val; + int len; + + FDT_CHECK_HEADER(fdt); + + /* FIXME: The algorithm here is pretty horrible: we scan each + * property of a node in fdt_getprop(), then if that didn't + * find what we want, we scan over them again making our way + * to the next node. Still it's the easiest to implement + * approach; performance can come later. */ + for (offset = fdt_next_node(fdt, startoffset, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + val = fdt_getprop(fdt, offset, propname, &len); + if (val && (len == proplen) + && (memcmp(val, propval, len) == 0)) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} + +int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle) +{ + int offset; + + if ((phandle == 0) || (phandle == -1)) + return -FDT_ERR_BADPHANDLE; + + FDT_CHECK_HEADER(fdt); + + /* FIXME: The algorithm here is pretty horrible: we + * potentially scan each property of a node in + * fdt_get_phandle(), then if that didn't find what + * we want, we scan over them again making our way to the next + * node. Still it's the easiest to implement approach; + * performance can come later. */ + for (offset = fdt_next_node(fdt, -1, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + if (fdt_get_phandle(fdt, offset) == phandle) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} + +static int _fdt_stringlist_contains(const char *strlist, int listlen, + const char *str) +{ + int len = strlen(str); + const char *p; + + while (listlen >= len) { + if (memcmp(str, strlist, len+1) == 0) + return 1; + p = memchr(strlist, '\0', listlen); + if (!p) + return 0; /* malformed strlist.. */ + listlen -= (p-strlist) + 1; + strlist = p + 1; + } + return 0; +} + +int fdt_node_check_compatible(const void *fdt, int nodeoffset, + const char *compatible) +{ + const void *prop; + int len; + + prop = fdt_getprop(fdt, nodeoffset, "compatible", &len); + if (!prop) + return len; + if (_fdt_stringlist_contains(prop, len, compatible)) + return 0; + else + return 1; +} + +int fdt_node_offset_by_compatible(const void *fdt, int startoffset, + const char *compatible) +{ + int offset, err; + + FDT_CHECK_HEADER(fdt); + + /* FIXME: The algorithm here is pretty horrible: we scan each + * property of a node in fdt_node_check_compatible(), then if + * that didn't find what we want, we scan over them again + * making our way to the next node. Still it's the easiest to + * implement approach; performance can come later. */ + for (offset = fdt_next_node(fdt, startoffset, NULL); + offset >= 0; + offset = fdt_next_node(fdt, offset, NULL)) { + err = fdt_node_check_compatible(fdt, offset, compatible); + if ((err < 0) && (err != -FDT_ERR_NOTFOUND)) + return err; + else if (err == 0) + return offset; + } + + return offset; /* error from fdt_next_node() */ +} diff --git a/sys/contrib/libfdt/fdt_rw.c b/sys/contrib/libfdt/fdt_rw.c new file mode 100644 index 000000000000..994037bbbda9 --- /dev/null +++ b/sys/contrib/libfdt/fdt_rw.c @@ -0,0 +1,465 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +static int _fdt_blocks_misordered(const void *fdt, + int mem_rsv_size, int struct_size) +{ + return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8)) + || (fdt_off_dt_struct(fdt) < + (fdt_off_mem_rsvmap(fdt) + mem_rsv_size)) + || (fdt_off_dt_strings(fdt) < + (fdt_off_dt_struct(fdt) + struct_size)) + || (fdt_totalsize(fdt) < + (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); +} + +static int _fdt_rw_check_header(void *fdt) +{ + FDT_CHECK_HEADER(fdt); + + if (fdt_version(fdt) < 17) + return -FDT_ERR_BADVERSION; + if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry), + fdt_size_dt_struct(fdt))) + return -FDT_ERR_BADLAYOUT; + if (fdt_version(fdt) > 17) + fdt_set_version(fdt, 17); + + return 0; +} + +#define FDT_RW_CHECK_HEADER(fdt) \ + { \ + int err; \ + if ((err = _fdt_rw_check_header(fdt)) != 0) \ + return err; \ + } + +static inline int _fdt_data_size(void *fdt) +{ + return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); +} + +static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen) +{ + char *p = splicepoint; + char *end = (char *)fdt + _fdt_data_size(fdt); + + if (((p + oldlen) < p) || ((p + oldlen) > end)) + return -FDT_ERR_BADOFFSET; + if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt))) + return -FDT_ERR_NOSPACE; + memmove(p + newlen, p + oldlen, end - p - oldlen); + return 0; +} + +static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p, + int oldn, int newn) +{ + int delta = (newn - oldn) * sizeof(*p); + int err; + err = _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p)); + if (err) + return err; + fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta); + fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); + return 0; +} + +static int _fdt_splice_struct(void *fdt, void *p, + int oldlen, int newlen) +{ + int delta = newlen - oldlen; + int err; + + if ((err = _fdt_splice(fdt, p, oldlen, newlen))) + return err; + + fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta); + fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); + return 0; +} + +static int _fdt_splice_string(void *fdt, int newlen) +{ + void *p = (char *)fdt + + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); + int err; + + if ((err = _fdt_splice(fdt, p, 0, newlen))) + return err; + + fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen); + return 0; +} + +static int _fdt_find_add_string(void *fdt, const char *s) +{ + char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); + const char *p; + char *new; + int len = strlen(s) + 1; + int err; + + p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s); + if (p) + /* found it */ + return (p - strtab); + + new = strtab + fdt_size_dt_strings(fdt); + err = _fdt_splice_string(fdt, len); + if (err) + return err; + + memcpy(new, s, len); + return (new - strtab); +} + +int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size) +{ + struct fdt_reserve_entry *re; + int err; + + FDT_RW_CHECK_HEADER(fdt); + + re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt)); + err = _fdt_splice_mem_rsv(fdt, re, 0, 1); + if (err) + return err; + + re->address = cpu_to_fdt64(address); + re->size = cpu_to_fdt64(size); + return 0; +} + +int fdt_del_mem_rsv(void *fdt, int n) +{ + struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n); + int err; + + FDT_RW_CHECK_HEADER(fdt); + + if (n >= fdt_num_mem_rsv(fdt)) + return -FDT_ERR_NOTFOUND; + + err = _fdt_splice_mem_rsv(fdt, re, 1, 0); + if (err) + return err; + return 0; +} + +static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name, + int len, struct fdt_property **prop) +{ + int oldlen; + int err; + + *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); + if (! (*prop)) + return oldlen; + + if ((err = _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen), + FDT_TAGALIGN(len)))) + return err; + + (*prop)->len = cpu_to_fdt32(len); + return 0; +} + +static int _fdt_add_property(void *fdt, int nodeoffset, const char *name, + int len, struct fdt_property **prop) +{ + int proplen; + int nextoffset; + int namestroff; + int err; + + if ((nextoffset = _fdt_check_node_offset(fdt, nodeoffset)) < 0) + return nextoffset; + + namestroff = _fdt_find_add_string(fdt, name); + if (namestroff < 0) + return namestroff; + + *prop = _fdt_offset_ptr_w(fdt, nextoffset); + proplen = sizeof(**prop) + FDT_TAGALIGN(len); + + err = _fdt_splice_struct(fdt, *prop, 0, proplen); + if (err) + return err; + + (*prop)->tag = cpu_to_fdt32(FDT_PROP); + (*prop)->nameoff = cpu_to_fdt32(namestroff); + (*prop)->len = cpu_to_fdt32(len); + return 0; +} + +int fdt_set_name(void *fdt, int nodeoffset, const char *name) +{ + char *namep; + int oldlen, newlen; + int err; + + FDT_RW_CHECK_HEADER(fdt); + + namep = (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen); + if (!namep) + return oldlen; + + newlen = strlen(name); + + err = _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1), + FDT_TAGALIGN(newlen+1)); + if (err) + return err; + + memcpy(namep, name, newlen+1); + return 0; +} + +int fdt_setprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + struct fdt_property *prop; + int err; + + FDT_RW_CHECK_HEADER(fdt); + + err = _fdt_resize_property(fdt, nodeoffset, name, len, &prop); + if (err == -FDT_ERR_NOTFOUND) + err = _fdt_add_property(fdt, nodeoffset, name, len, &prop); + if (err) + return err; + + memcpy(prop->data, val, len); + return 0; +} + +int fdt_delprop(void *fdt, int nodeoffset, const char *name) +{ + struct fdt_property *prop; + int len, proplen; + + FDT_RW_CHECK_HEADER(fdt); + + prop = fdt_get_property_w(fdt, nodeoffset, name, &len); + if (! prop) + return len; + + proplen = sizeof(*prop) + FDT_TAGALIGN(len); + return _fdt_splice_struct(fdt, prop, proplen, 0); +} + +int fdt_add_subnode_namelen(void *fdt, int parentoffset, + const char *name, int namelen) +{ + struct fdt_node_header *nh; + int offset, nextoffset; + int nodelen; + int err; + uint32_t tag; + uint32_t *endtag; + + FDT_RW_CHECK_HEADER(fdt); + + offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen); + if (offset >= 0) + return -FDT_ERR_EXISTS; + else if (offset != -FDT_ERR_NOTFOUND) + return offset; + + /* Try to place the new node after the parent's properties */ + fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */ + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + } while ((tag == FDT_PROP) || (tag == FDT_NOP)); + + nh = _fdt_offset_ptr_w(fdt, offset); + nodelen = sizeof(*nh) + FDT_TAGALIGN(namelen+1) + FDT_TAGSIZE; + + err = _fdt_splice_struct(fdt, nh, 0, nodelen); + if (err) + return err; + + nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); + memset(nh->name, 0, FDT_TAGALIGN(namelen+1)); + memcpy(nh->name, name, namelen); + endtag = (uint32_t *)((char *)nh + nodelen - FDT_TAGSIZE); + *endtag = cpu_to_fdt32(FDT_END_NODE); + + return offset; +} + +int fdt_add_subnode(void *fdt, int parentoffset, const char *name) +{ + return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name)); +} + +int fdt_del_node(void *fdt, int nodeoffset) +{ + int endoffset; + + FDT_RW_CHECK_HEADER(fdt); + + endoffset = _fdt_node_end_offset(fdt, nodeoffset); + if (endoffset < 0) + return endoffset; + + return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset), + endoffset - nodeoffset, 0); +} + +static void _fdt_packblocks(const char *old, char *new, + int mem_rsv_size, int struct_size) +{ + int mem_rsv_off, struct_off, strings_off; + + mem_rsv_off = FDT_ALIGN(sizeof(struct fdt_header), 8); + struct_off = mem_rsv_off + mem_rsv_size; + strings_off = struct_off + struct_size; + + memmove(new + mem_rsv_off, old + fdt_off_mem_rsvmap(old), mem_rsv_size); + fdt_set_off_mem_rsvmap(new, mem_rsv_off); + + memmove(new + struct_off, old + fdt_off_dt_struct(old), struct_size); + fdt_set_off_dt_struct(new, struct_off); + fdt_set_size_dt_struct(new, struct_size); + + memmove(new + strings_off, old + fdt_off_dt_strings(old), + fdt_size_dt_strings(old)); + fdt_set_off_dt_strings(new, strings_off); + fdt_set_size_dt_strings(new, fdt_size_dt_strings(old)); +} + +int fdt_open_into(const void *fdt, void *buf, int bufsize) +{ + int err; + int mem_rsv_size, struct_size; + int newsize; + const char *fdtstart = fdt; + const char *fdtend = fdtstart + fdt_totalsize(fdt); + char *tmp; + + FDT_CHECK_HEADER(fdt); + + mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) + * sizeof(struct fdt_reserve_entry); + + if (fdt_version(fdt) >= 17) { + struct_size = fdt_size_dt_struct(fdt); + } else { + struct_size = 0; + while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END) + ; + if (struct_size < 0) + return struct_size; + } + + if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) { + /* no further work necessary */ + err = fdt_move(fdt, buf, bufsize); + if (err) + return err; + fdt_set_version(buf, 17); + fdt_set_size_dt_struct(buf, struct_size); + fdt_set_totalsize(buf, bufsize); + return 0; + } + + /* Need to reorder */ + newsize = FDT_ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size + + struct_size + fdt_size_dt_strings(fdt); + + if (bufsize < newsize) + return -FDT_ERR_NOSPACE; + + /* First attempt to build converted tree at beginning of buffer */ + tmp = buf; + /* But if that overlaps with the old tree... */ + if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) { + /* Try right after the old tree instead */ + tmp = (char *)(uintptr_t)fdtend; + if ((tmp + newsize) > ((char *)buf + bufsize)) + return -FDT_ERR_NOSPACE; + } + + _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size); + memmove(buf, tmp, newsize); + + fdt_set_magic(buf, FDT_MAGIC); + fdt_set_totalsize(buf, bufsize); + fdt_set_version(buf, 17); + fdt_set_last_comp_version(buf, 16); + fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt)); + + return 0; +} + +int fdt_pack(void *fdt) +{ + int mem_rsv_size; + + FDT_RW_CHECK_HEADER(fdt); + + mem_rsv_size = (fdt_num_mem_rsv(fdt)+1) + * sizeof(struct fdt_reserve_entry); + _fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt)); + fdt_set_totalsize(fdt, _fdt_data_size(fdt)); + + return 0; +} diff --git a/sys/contrib/libfdt/fdt_strerror.c b/sys/contrib/libfdt/fdt_strerror.c new file mode 100644 index 000000000000..e6c3ceee8c58 --- /dev/null +++ b/sys/contrib/libfdt/fdt_strerror.c @@ -0,0 +1,96 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +struct fdt_errtabent { + const char *str; +}; + +#define FDT_ERRTABENT(val) \ + [(val)] = { .str = #val, } + +static struct fdt_errtabent fdt_errtable[] = { + FDT_ERRTABENT(FDT_ERR_NOTFOUND), + FDT_ERRTABENT(FDT_ERR_EXISTS), + FDT_ERRTABENT(FDT_ERR_NOSPACE), + + FDT_ERRTABENT(FDT_ERR_BADOFFSET), + FDT_ERRTABENT(FDT_ERR_BADPATH), + FDT_ERRTABENT(FDT_ERR_BADSTATE), + + FDT_ERRTABENT(FDT_ERR_TRUNCATED), + FDT_ERRTABENT(FDT_ERR_BADMAGIC), + FDT_ERRTABENT(FDT_ERR_BADVERSION), + FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE), + FDT_ERRTABENT(FDT_ERR_BADLAYOUT), +}; +#define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0])) + +const char *fdt_strerror(int errval) +{ + if (errval > 0) + return ""; + else if (errval == 0) + return ""; + else if (errval > -FDT_ERRTABSIZE) { + const char *s = fdt_errtable[-errval].str; + + if (s) + return s; + } + + return ""; +} diff --git a/sys/contrib/libfdt/fdt_sw.c b/sys/contrib/libfdt/fdt_sw.c new file mode 100644 index 000000000000..55ebebf1eb20 --- /dev/null +++ b/sys/contrib/libfdt/fdt_sw.c @@ -0,0 +1,256 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +static int _fdt_sw_check_header(void *fdt) +{ + if (fdt_magic(fdt) != FDT_SW_MAGIC) + return -FDT_ERR_BADMAGIC; + /* FIXME: should check more details about the header state */ + return 0; +} + +#define FDT_SW_CHECK_HEADER(fdt) \ + { \ + int err; \ + if ((err = _fdt_sw_check_header(fdt)) != 0) \ + return err; \ + } + +static void *_fdt_grab_space(void *fdt, size_t len) +{ + int offset = fdt_size_dt_struct(fdt); + int spaceleft; + + spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt) + - fdt_size_dt_strings(fdt); + + if ((offset + len < offset) || (offset + len > spaceleft)) + return NULL; + + fdt_set_size_dt_struct(fdt, offset + len); + return _fdt_offset_ptr_w(fdt, offset); +} + +int fdt_create(void *buf, int bufsize) +{ + void *fdt = buf; + + if (bufsize < sizeof(struct fdt_header)) + return -FDT_ERR_NOSPACE; + + memset(buf, 0, bufsize); + + fdt_set_magic(fdt, FDT_SW_MAGIC); + fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION); + fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); + fdt_set_totalsize(fdt, bufsize); + + fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header), + sizeof(struct fdt_reserve_entry))); + fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt)); + fdt_set_off_dt_strings(fdt, bufsize); + + return 0; +} + +int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size) +{ + struct fdt_reserve_entry *re; + int offset; + + FDT_SW_CHECK_HEADER(fdt); + + if (fdt_size_dt_struct(fdt)) + return -FDT_ERR_BADSTATE; + + offset = fdt_off_dt_struct(fdt); + if ((offset + sizeof(*re)) > fdt_totalsize(fdt)) + return -FDT_ERR_NOSPACE; + + re = (struct fdt_reserve_entry *)((char *)fdt + offset); + re->address = cpu_to_fdt64(addr); + re->size = cpu_to_fdt64(size); + + fdt_set_off_dt_struct(fdt, offset + sizeof(*re)); + + return 0; +} + +int fdt_finish_reservemap(void *fdt) +{ + return fdt_add_reservemap_entry(fdt, 0, 0); +} + +int fdt_begin_node(void *fdt, const char *name) +{ + struct fdt_node_header *nh; + int namelen = strlen(name) + 1; + + FDT_SW_CHECK_HEADER(fdt); + + nh = _fdt_grab_space(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen)); + if (! nh) + return -FDT_ERR_NOSPACE; + + nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE); + memcpy(nh->name, name, namelen); + return 0; +} + +int fdt_end_node(void *fdt) +{ + uint32_t *en; + + FDT_SW_CHECK_HEADER(fdt); + + en = _fdt_grab_space(fdt, FDT_TAGSIZE); + if (! en) + return -FDT_ERR_NOSPACE; + + *en = cpu_to_fdt32(FDT_END_NODE); + return 0; +} + +static int _fdt_find_add_string(void *fdt, const char *s) +{ + char *strtab = (char *)fdt + fdt_totalsize(fdt); + const char *p; + int strtabsize = fdt_size_dt_strings(fdt); + int len = strlen(s) + 1; + int struct_top, offset; + + p = _fdt_find_string(strtab - strtabsize, strtabsize, s); + if (p) + return p - strtab; + + /* Add it */ + offset = -strtabsize - len; + struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); + if (fdt_totalsize(fdt) + offset < struct_top) + return 0; /* no more room :( */ + + memcpy(strtab + offset, s, len); + fdt_set_size_dt_strings(fdt, strtabsize + len); + return offset; +} + +int fdt_property(void *fdt, const char *name, const void *val, int len) +{ + struct fdt_property *prop; + int nameoff; + + FDT_SW_CHECK_HEADER(fdt); + + nameoff = _fdt_find_add_string(fdt, name); + if (nameoff == 0) + return -FDT_ERR_NOSPACE; + + prop = _fdt_grab_space(fdt, sizeof(*prop) + FDT_TAGALIGN(len)); + if (! prop) + return -FDT_ERR_NOSPACE; + + prop->tag = cpu_to_fdt32(FDT_PROP); + prop->nameoff = cpu_to_fdt32(nameoff); + prop->len = cpu_to_fdt32(len); + memcpy(prop->data, val, len); + return 0; +} + +int fdt_finish(void *fdt) +{ + char *p = (char *)fdt; + uint32_t *end; + int oldstroffset, newstroffset; + uint32_t tag; + int offset, nextoffset; + + FDT_SW_CHECK_HEADER(fdt); + + /* Add terminator */ + end = _fdt_grab_space(fdt, sizeof(*end)); + if (! end) + return -FDT_ERR_NOSPACE; + *end = cpu_to_fdt32(FDT_END); + + /* Relocate the string table */ + oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt); + newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); + memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt)); + fdt_set_off_dt_strings(fdt, newstroffset); + + /* Walk the structure, correcting string offsets */ + offset = 0; + while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) { + if (tag == FDT_PROP) { + struct fdt_property *prop = + _fdt_offset_ptr_w(fdt, offset); + int nameoff; + + nameoff = fdt32_to_cpu(prop->nameoff); + nameoff += fdt_size_dt_strings(fdt); + prop->nameoff = cpu_to_fdt32(nameoff); + } + offset = nextoffset; + } + if (nextoffset < 0) + return nextoffset; + + /* Finally, adjust the header */ + fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt)); + fdt_set_magic(fdt, FDT_MAGIC); + return 0; +} diff --git a/sys/contrib/libfdt/fdt_wip.c b/sys/contrib/libfdt/fdt_wip.c new file mode 100644 index 000000000000..6025fa1fe8fe --- /dev/null +++ b/sys/contrib/libfdt/fdt_wip.c @@ -0,0 +1,118 @@ +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 "libfdt_env.h" + +#include +#include + +#include "libfdt_internal.h" + +int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + void *propval; + int proplen; + + propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen); + if (! propval) + return proplen; + + if (proplen != len) + return -FDT_ERR_NOSPACE; + + memcpy(propval, val, len); + return 0; +} + +static void _fdt_nop_region(void *start, int len) +{ + uint32_t *p; + + for (p = start; (char *)p < ((char *)start + len); p++) + *p = cpu_to_fdt32(FDT_NOP); +} + +int fdt_nop_property(void *fdt, int nodeoffset, const char *name) +{ + struct fdt_property *prop; + int len; + + prop = fdt_get_property_w(fdt, nodeoffset, name, &len); + if (! prop) + return len; + + _fdt_nop_region(prop, len + sizeof(*prop)); + + return 0; +} + +int _fdt_node_end_offset(void *fdt, int offset) +{ + int depth = 0; + + while ((offset >= 0) && (depth >= 0)) + offset = fdt_next_node(fdt, offset, &depth); + + return offset; +} + +int fdt_nop_node(void *fdt, int nodeoffset) +{ + int endoffset; + + endoffset = _fdt_node_end_offset(fdt, nodeoffset); + if (endoffset < 0) + return endoffset; + + _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), + endoffset - nodeoffset); + return 0; +} diff --git a/sys/contrib/libfdt/libfdt.h b/sys/contrib/libfdt/libfdt.h new file mode 100644 index 000000000000..18de52b844c5 --- /dev/null +++ b/sys/contrib/libfdt/libfdt.h @@ -0,0 +1,1132 @@ +#ifndef _LIBFDT_H +#define _LIBFDT_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 +#include + +#define FDT_FIRST_SUPPORTED_VERSION 0x10 +#define FDT_LAST_SUPPORTED_VERSION 0x11 + +/* Error codes: informative error codes */ +#define FDT_ERR_NOTFOUND 1 + /* FDT_ERR_NOTFOUND: The requested node or property does not exist */ +#define FDT_ERR_EXISTS 2 + /* FDT_ERR_EXISTS: Attemped to create a node or property which + * already exists */ +#define FDT_ERR_NOSPACE 3 + /* FDT_ERR_NOSPACE: Operation needed to expand the device + * tree, but its buffer did not have sufficient space to + * contain the expanded tree. Use fdt_open_into() to move the + * device tree to a buffer with more space. */ + +/* Error codes: codes for bad parameters */ +#define FDT_ERR_BADOFFSET 4 + /* FDT_ERR_BADOFFSET: Function was passed a structure block + * offset which is out-of-bounds, or which points to an + * unsuitable part of the structure for the operation. */ +#define FDT_ERR_BADPATH 5 + /* FDT_ERR_BADPATH: Function was passed a badly formatted path + * (e.g. missing a leading / for a function which requires an + * absolute path) */ +#define FDT_ERR_BADPHANDLE 6 + /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle + * value. phandle values of 0 and -1 are not permitted. */ +#define FDT_ERR_BADSTATE 7 + /* FDT_ERR_BADSTATE: Function was passed an incomplete device + * tree created by the sequential-write functions, which is + * not sufficiently complete for the requested operation. */ + +/* Error codes: codes for bad device tree blobs */ +#define FDT_ERR_TRUNCATED 8 + /* FDT_ERR_TRUNCATED: Structure block of the given device tree + * ends without an FDT_END tag. */ +#define FDT_ERR_BADMAGIC 9 + /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a + * device tree at all - it is missing the flattened device + * tree magic number. */ +#define FDT_ERR_BADVERSION 10 + /* FDT_ERR_BADVERSION: Given device tree has a version which + * can't be handled by the requested operation. For + * read-write functions, this may mean that fdt_open_into() is + * required to convert the tree to the expected version. */ +#define FDT_ERR_BADSTRUCTURE 11 + /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt + * structure block or other serious error (e.g. misnested + * nodes, or subnodes preceding properties). */ +#define FDT_ERR_BADLAYOUT 12 + /* FDT_ERR_BADLAYOUT: For read-write functions, the given + * device tree has it's sub-blocks in an order that the + * function can't handle (memory reserve map, then structure, + * then strings). Use fdt_open_into() to reorganize the tree + * into a form suitable for the read-write operations. */ + +/* "Can't happen" error indicating a bug in libfdt */ +#define FDT_ERR_INTERNAL 13 + /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion. + * Should never be returned, if it is, it indicates a bug in + * libfdt itself. */ + +#define FDT_ERR_MAX 13 + +/**********************************************************************/ +/* Low-level functions (you probably don't need these) */ +/**********************************************************************/ + +const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int checklen); +static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen) +{ + return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen); +} + +uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); + +/**********************************************************************/ +/* Traversal functions */ +/**********************************************************************/ + +int fdt_next_node(const void *fdt, int offset, int *depth); + +/**********************************************************************/ +/* General functions */ +/**********************************************************************/ + +#define fdt_get_header(fdt, field) \ + (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field)) +#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) +#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) +#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) +#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings)) +#define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap)) +#define fdt_version(fdt) (fdt_get_header(fdt, version)) +#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version)) +#define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys)) +#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings)) +#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct)) + +#define __fdt_set_hdr(name) \ + static inline void fdt_set_##name(void *fdt, uint32_t val) \ + { \ + struct fdt_header *fdth = (struct fdt_header*)fdt; \ + fdth->name = cpu_to_fdt32(val); \ + } +__fdt_set_hdr(magic); +__fdt_set_hdr(totalsize); +__fdt_set_hdr(off_dt_struct); +__fdt_set_hdr(off_dt_strings); +__fdt_set_hdr(off_mem_rsvmap); +__fdt_set_hdr(version); +__fdt_set_hdr(last_comp_version); +__fdt_set_hdr(boot_cpuid_phys); +__fdt_set_hdr(size_dt_strings); +__fdt_set_hdr(size_dt_struct); +#undef __fdt_set_hdr + +/** + * fdt_check_header - sanity check a device tree or possible device tree + * @fdt: pointer to data which might be a flattened device tree + * + * fdt_check_header() checks that the given buffer contains what + * appears to be a flattened device tree with sane information in its + * header. + * + * returns: + * 0, if the buffer appears to contain a valid device tree + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings, as above + */ +int fdt_check_header(const void *fdt); + +/** + * fdt_move - move a device tree around in memory + * @fdt: pointer to the device tree to move + * @buf: pointer to memory where the device is to be moved + * @bufsize: size of the memory space at buf + * + * fdt_move() relocates, if possible, the device tree blob located at + * fdt to the buffer at buf of size bufsize. The buffer may overlap + * with the existing device tree blob at fdt. Therefore, + * fdt_move(fdt, fdt, fdt_totalsize(fdt)) + * should always succeed. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_move(const void *fdt, void *buf, int bufsize); + +/**********************************************************************/ +/* Read-only functions */ +/**********************************************************************/ + +/** + * fdt_string - retrieve a string from the strings block of a device tree + * @fdt: pointer to the device tree blob + * @stroffset: offset of the string within the strings block (native endian) + * + * fdt_string() retrieves a pointer to a single string from the + * strings block of the device tree blob at fdt. + * + * returns: + * a pointer to the string, on success + * NULL, if stroffset is out of bounds + */ +const char *fdt_string(const void *fdt, int stroffset); + +/** + * fdt_num_mem_rsv - retrieve the number of memory reserve map entries + * @fdt: pointer to the device tree blob + * + * Returns the number of entries in the device tree blob's memory + * reservation map. This does not include the terminating 0,0 entry + * or any other (0,0) entries reserved for expansion. + * + * returns: + * the number of entries + */ +int fdt_num_mem_rsv(const void *fdt); + +/** + * fdt_get_mem_rsv - retrieve one memory reserve map entry + * @fdt: pointer to the device tree blob + * @address, @size: pointers to 64-bit variables + * + * On success, *address and *size will contain the address and size of + * the n-th reserve map entry from the device tree blob, in + * native-endian format. + * + * returns: + * 0, on success + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size); + +/** + * fdt_subnode_offset_namelen - find a subnode based on substring + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * @namelen: number of characters of name to consider + * + * Identical to fdt_subnode_offset(), but only examine the first + * namelen characters of name for matching the subnode name. This is + * useful for finding subnodes based on a portion of a larger string, + * such as a full path. + */ +int fdt_subnode_offset_namelen(const void *fdt, int parentoffset, + const char *name, int namelen); +/** + * fdt_subnode_offset - find a subnode of a given node + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * + * fdt_subnode_offset() finds a subnode of the node at structure block + * offset parentoffset with the given name. name may include a unit + * address, in which case fdt_subnode_offset() will find the subnode + * with that unit address, or the unit address may be omitted, in + * which case fdt_subnode_offset() will find an arbitrary subnode + * whose name excluding unit address matches the given name. + * + * returns: + * structure block offset of the requested subnode (>=0), on success + * -FDT_ERR_NOTFOUND, if the requested subnode does not exist + * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name); + +/** + * fdt_path_offset - find a tree node by its full path + * @fdt: pointer to the device tree blob + * @path: full path of the node to locate + * + * fdt_path_offset() finds a node of a given path in the device tree. + * Each path component may omit the unit address portion, but the + * results of this are undefined if any such path component is + * ambiguous (that is if there are multiple nodes at the relevant + * level matching the given component, differentiated only by unit + * address). + * + * returns: + * structure block offset of the node with the requested path (>=0), on success + * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid + * -FDT_ERR_NOTFOUND, if the requested node does not exist + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_path_offset(const void *fdt, const char *path); + +/** + * fdt_get_name - retrieve the name of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of the starting node + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_name() retrieves the name (including unit address) of the + * device tree node at structure block offset nodeoffset. If lenp is + * non-NULL, the length of this name is also returned, in the integer + * pointed to by lenp. + * + * returns: + * pointer to the node's name, on success + * If lenp is non-NULL, *lenp contains the length of that name (>=0) + * NULL, on error + * if lenp is non-NULL *lenp contains an error code (<0): + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp); + +/** + * fdt_get_property_namelen - find a property based on substring + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @namelen: number of characters of name to consider + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * Identical to fdt_get_property_namelen(), but only examine the first + * namelen characters of name for matching the property name. + */ +const struct fdt_property *fdt_get_property_namelen(const void *fdt, + int nodeoffset, + const char *name, + int namelen, int *lenp); + +/** + * fdt_get_property - find a given property in a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_get_property() retrieves a pointer to the fdt_property + * structure within the device tree blob corresponding to the property + * named 'name' of the node at offset nodeoffset. If lenp is + * non-NULL, the length of the property value is also returned, in the + * integer pointed to by lenp. + * + * returns: + * pointer to the structure representing the property + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_NOTFOUND, node does not have named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset, + const char *name, int *lenp); +static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset, + const char *name, + int *lenp) +{ + return (struct fdt_property *)(uintptr_t) + fdt_get_property(fdt, nodeoffset, name, lenp); +} + +/** + * fdt_getprop_namelen - get property value based on substring + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @namelen: number of characters of name to consider + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * Identical to fdt_getprop(), but only examine the first namelen + * characters of name for matching the property name. + */ +const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, + const char *name, int namelen, int *lenp); + +/** + * fdt_getprop - retrieve the value of a given property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to find + * @name: name of the property to find + * @lenp: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_getprop() retrieves a pointer to the value of the property + * named 'name' of the node at offset nodeoffset (this will be a + * pointer to within the device blob itself, not a copy of the value). + * If lenp is non-NULL, the length of the property value is also + * returned, in the integer pointed to by lenp. + * + * returns: + * pointer to the property's value + * if lenp is non-NULL, *lenp contains the length of the property + * value (>=0) + * NULL, on error + * if lenp is non-NULL, *lenp contains an error code (<0): + * -FDT_ERR_NOTFOUND, node does not have named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +const void *fdt_getprop(const void *fdt, int nodeoffset, + const char *name, int *lenp); +static inline void *fdt_getprop_w(void *fdt, int nodeoffset, + const char *name, int *lenp) +{ + return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp); +} + +/** + * fdt_get_phandle - retrieve the phandle of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of the node + * + * fdt_get_phandle() retrieves the phandle of the device tree node at + * structure block offset nodeoffset. + * + * returns: + * the phandle of the node at nodeoffset, on success (!= 0, != -1) + * 0, if the node has no phandle, or another error occurs + */ +uint32_t fdt_get_phandle(const void *fdt, int nodeoffset); + +/** + * fdt_get_alias_namelen - get alias based on substring + * @fdt: pointer to the device tree blob + * @name: name of the alias th look up + * @namelen: number of characters of name to consider + * + * Identical to fdt_get_alias(), but only examine the first namelen + * characters of name for matching the alias name. + */ +const char *fdt_get_alias_namelen(const void *fdt, + const char *name, int namelen); + +/** + * fdt_get_alias - retreive the path referenced by a given alias + * @fdt: pointer to the device tree blob + * @name: name of the alias th look up + * + * fdt_get_alias() retrieves the value of a given alias. That is, the + * value of the property named 'name' in the node /aliases. + * + * returns: + * a pointer to the expansion of the alias named 'name', of it exists + * NULL, if the given alias or the /aliases node does not exist + */ +const char *fdt_get_alias(const void *fdt, const char *name); + +/** + * fdt_get_path - determine the full path of a node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose path to find + * @buf: character buffer to contain the returned path (will be overwritten) + * @buflen: size of the character buffer at buf + * + * fdt_get_path() computes the full path of the node at offset + * nodeoffset, and records that path in the buffer at buf. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + * 0, on success + * buf contains the absolute path of the node at + * nodeoffset, as a NUL-terminated string. + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1) + * characters and will not fit in the given buffer. + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen); + +/** + * fdt_supernode_atdepth_offset - find a specific ancestor of a node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * @supernodedepth: depth of the ancestor to find + * @nodedepth: pointer to an integer variable (will be overwritten) or NULL + * + * fdt_supernode_atdepth_offset() finds an ancestor of the given node + * at a specific depth from the root (where the root itself has depth + * 0, its immediate subnodes depth 1 and so forth). So + * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL); + * will always return 0, the offset of the root node. If the node at + * nodeoffset has depth D, then: + * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL); + * will return nodeoffset itself. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + + * structure block offset of the node at node offset's ancestor + * of depth supernodedepth (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag +* -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, + int supernodedepth, int *nodedepth); + +/** + * fdt_node_depth - find the depth of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * + * fdt_node_depth() finds the depth of a given node. The root node + * has depth 0, its immediate subnodes depth 1 and so forth. + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset. + * + * returns: + * depth of the node at nodeoffset (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_depth(const void *fdt, int nodeoffset); + +/** + * fdt_parent_offset - find the parent of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose parent to find + * + * fdt_parent_offset() locates the parent node of a given node (that + * is, it finds the offset of the node which contains the node at + * nodeoffset as a subnode). + * + * NOTE: This function is expensive, as it must scan the device tree + * structure from the start to nodeoffset, *twice*. + * + * returns: + * structure block offset of the parent of the node at nodeoffset + * (>=0), on success + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_parent_offset(const void *fdt, int nodeoffset); + +/** + * fdt_node_offset_by_prop_value - find nodes with a given property value + * @fdt: pointer to the device tree blob + * @startoffset: only find nodes after this offset + * @propname: property name to check + * @propval: property value to search for + * @proplen: length of the value in propval + * + * fdt_node_offset_by_prop_value() returns the offset of the first + * node after startoffset, which has a property named propname whose + * value is of length proplen and has value equal to propval; or if + * startoffset is -1, the very first such node in the tree. + * + * To iterate through all nodes matching the criterion, the following + * idiom can be used: + * offset = fdt_node_offset_by_prop_value(fdt, -1, propname, + * propval, proplen); + * while (offset != -FDT_ERR_NOTFOUND) { + * // other code here + * offset = fdt_node_offset_by_prop_value(fdt, offset, propname, + * propval, proplen); + * } + * + * Note the -1 in the first call to the function, if 0 is used here + * instead, the function will never locate the root node, even if it + * matches the criterion. + * + * returns: + * structure block offset of the located node (>= 0, >startoffset), + * on success + * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the + * tree after startoffset + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, + const char *propname, + const void *propval, int proplen); + +/** + * fdt_node_offset_by_phandle - find the node with a given phandle + * @fdt: pointer to the device tree blob + * @phandle: phandle value + * + * fdt_node_offset_by_phandle() returns the offset of the node + * which has the given phandle value. If there is more than one node + * in the tree with the given phandle (an invalid tree), results are + * undefined. + * + * returns: + * structure block offset of the located node (>= 0), on success + * -FDT_ERR_NOTFOUND, no node with that phandle exists + * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1) + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle); + +/** + * fdt_node_check_compatible: check a node's compatible property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of a tree node + * @compatible: string to match against + * + * + * fdt_node_check_compatible() returns 0 if the given node contains a + * 'compatible' property with the given string as one of its elements, + * it returns non-zero otherwise, or on error. + * + * returns: + * 0, if the node has a 'compatible' property listing the given string + * 1, if the node has a 'compatible' property, but it does not list + * the given string + * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property + * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_check_compatible(const void *fdt, int nodeoffset, + const char *compatible); + +/** + * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value + * @fdt: pointer to the device tree blob + * @startoffset: only find nodes after this offset + * @compatible: 'compatible' string to match against + * + * fdt_node_offset_by_compatible() returns the offset of the first + * node after startoffset, which has a 'compatible' property which + * lists the given compatible string; or if startoffset is -1, the + * very first such node in the tree. + * + * To iterate through all nodes matching the criterion, the following + * idiom can be used: + * offset = fdt_node_offset_by_compatible(fdt, -1, compatible); + * while (offset != -FDT_ERR_NOTFOUND) { + * // other code here + * offset = fdt_node_offset_by_compatible(fdt, offset, compatible); + * } + * + * Note the -1 in the first call to the function, if 0 is used here + * instead, the function will never locate the root node, even if it + * matches the criterion. + * + * returns: + * structure block offset of the located node (>= 0, >startoffset), + * on success + * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the + * tree after startoffset + * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, standard meanings + */ +int fdt_node_offset_by_compatible(const void *fdt, int startoffset, + const char *compatible); + +/**********************************************************************/ +/* Write-in-place functions */ +/**********************************************************************/ + +/** + * fdt_setprop_inplace - change a property's value, but not its size + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: pointer to data to replace the property value with + * @len: length of the property value + * + * fdt_setprop_inplace() replaces the value of a given property with + * the data in val, of length len. This function cannot change the + * size of a property, and so will only work if len is equal to the + * current length of the property. + * + * This function will alter only the bytes in the blob which contain + * the given property value, and will not alter or move any other part + * of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, if len is not equal to the property's current length + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, + const void *val, int len); + +/** + * fdt_setprop_inplace_cell - change the value of a single-cell property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: cell (32-bit integer) value to replace the property with + * + * fdt_setprop_inplace_cell() replaces the value of a given property + * with the 32-bit integer cell value in val, converting val to + * big-endian if necessary. This function cannot change the size of a + * property, and so will only work if the property already exists and + * has length 4. + * + * This function will alter only the bytes in the blob which contain + * the given property value, and will not alter or move any other part + * of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, if the property's length is not equal to 4 + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset, + const char *name, uint32_t val) +{ + val = cpu_to_fdt32(val); + return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val)); +} + +/** + * fdt_nop_property - replace a property with nop tags + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to nop + * @name: name of the property to nop + * + * fdt_nop_property() will replace a given property's representation + * in the blob with FDT_NOP tags, effectively removing it from the + * tree. + * + * This function will alter only the bytes in the blob which contain + * the property, and will not alter or move any other part of the + * tree. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_nop_property(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_nop_node - replace a node (subtree) with nop tags + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to nop + * + * fdt_nop_node() will replace a given node's representation in the + * blob, including all its subnodes, if any, with FDT_NOP tags, + * effectively removing it from the tree. + * + * This function will alter only the bytes in the blob which contain + * the node and its properties and subnodes, and will not alter or + * move any other part of the tree. + * + * returns: + * 0, on success + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_nop_node(void *fdt, int nodeoffset); + +/**********************************************************************/ +/* Sequential write functions */ +/**********************************************************************/ + +int fdt_create(void *buf, int bufsize); +int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size); +int fdt_finish_reservemap(void *fdt); +int fdt_begin_node(void *fdt, const char *name); +int fdt_property(void *fdt, const char *name, const void *val, int len); +static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val) +{ + val = cpu_to_fdt32(val); + return fdt_property(fdt, name, &val, sizeof(val)); +} +#define fdt_property_string(fdt, name, str) \ + fdt_property(fdt, name, str, strlen(str)+1) +int fdt_end_node(void *fdt); +int fdt_finish(void *fdt); + +/**********************************************************************/ +/* Read-write functions */ +/**********************************************************************/ + +int fdt_open_into(const void *fdt, void *buf, int bufsize); +int fdt_pack(void *fdt); + +/** + * fdt_add_mem_rsv - add one memory reserve map entry + * @fdt: pointer to the device tree blob + * @address, @size: 64-bit values (native endian) + * + * Adds a reserve map entry to the given blob reserving a region at + * address address of length size. + * + * This function will insert data into the reserve map and will + * therefore change the indexes of some entries in the table. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new reservation entry + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size); + +/** + * fdt_del_mem_rsv - remove a memory reserve map entry + * @fdt: pointer to the device tree blob + * @n: entry to remove + * + * fdt_del_mem_rsv() removes the n-th memory reserve map entry from + * the blob. + * + * This function will delete data from the reservation table and will + * therefore change the indexes of some entries in the table. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there + * are less than n+1 reserve map entries) + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_del_mem_rsv(void *fdt, int n); + +/** + * fdt_set_name - change the name of a given node + * @fdt: pointer to the device tree blob + * @nodeoffset: structure block offset of a node + * @name: name to give the node + * + * fdt_set_name() replaces the name (including unit address, if any) + * of the given node with the given string. NOTE: this function can't + * efficiently check if the new name is unique amongst the given + * node's siblings; results are undefined if this function is invoked + * with a name equal to one of the given node's siblings. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob + * to contain the new name + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, standard meanings + */ +int fdt_set_name(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_setprop - create or change a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: pointer to data to set the property value to + * @len: length of the property value + * + * fdt_setprop() sets the value of the named property in the given + * node to the given value and length, creating the property if it + * does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len); + +/** + * fdt_setprop_cell - set a property to a single cell value + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @val: 32-bit integer value for the property (native endian) + * + * fdt_setprop_cell() sets the value of the named property in the + * given node to the given cell value (converting to big-endian if + * necessary), or creates a new property with that value if it does + * not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name, + uint32_t val) +{ + val = cpu_to_fdt32(val); + return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val)); +} + +/** + * fdt_setprop_string - set a property to a string value + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @str: string value for the property + * + * fdt_setprop_string() sets the value of the named property in the + * given node to the given string value (using the length of the + * string to determine the new length of the property), or creates a + * new property with that value if it does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#define fdt_setprop_string(fdt, nodeoffset, name, str) \ + fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) + +/** + * fdt_delprop - delete a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to nop + * @name: name of the property to nop + * + * fdt_del_property() will delete the given property. + * + * This function will delete data from the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOTFOUND, node does not have the named property + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_delprop(void *fdt, int nodeoffset, const char *name); + +/** + * fdt_add_subnode_namelen - creates a new node based on substring + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * @namelen: number of characters of name to consider + * + * Identical to fdt_add_subnode(), but use only the first namelen + * characters of name as the name of the new node. This is useful for + * creating subnodes based on a portion of a larger string, such as a + * full path. + */ +int fdt_add_subnode_namelen(void *fdt, int parentoffset, + const char *name, int namelen); + +/** + * fdt_add_subnode - creates a new node + * @fdt: pointer to the device tree blob + * @parentoffset: structure block offset of a node + * @name: name of the subnode to locate + * + * fdt_add_subnode() creates a new node as a subnode of the node at + * structure block offset parentoffset, with the given name (which + * should include the unit address, if any). + * + * This function will insert data into the blob, and will therefore + * change the offsets of some existing nodes. + + * returns: + * structure block offset of the created nodeequested subnode (>=0), on success + * -FDT_ERR_NOTFOUND, if the requested subnode does not exist + * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag + * -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of + * the given name + * -FDT_ERR_NOSPACE, if there is insufficient free space in the + * blob to contain the new node + * -FDT_ERR_NOSPACE + * -FDT_ERR_BADLAYOUT + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings. + */ +int fdt_add_subnode(void *fdt, int parentoffset, const char *name); + +/** + * fdt_del_node - delete a node (subtree) + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node to nop + * + * fdt_del_node() will remove the given node, including all its + * subnodes if any, from the blob. + * + * This function will delete data from the blob, and will therefore + * change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_del_node(void *fdt, int nodeoffset); + +/**********************************************************************/ +/* Debugging / informational functions */ +/**********************************************************************/ + +const char *fdt_strerror(int errval); + +#endif /* _LIBFDT_H */ diff --git a/sys/contrib/libfdt/libfdt_env.h b/sys/contrib/libfdt/libfdt_env.h new file mode 100644 index 000000000000..449bf602daf1 --- /dev/null +++ b/sys/contrib/libfdt/libfdt_env.h @@ -0,0 +1,23 @@ +#ifndef _LIBFDT_ENV_H +#define _LIBFDT_ENV_H + +#include +#include +#include + +#define _B(n) ((unsigned long long)((uint8_t *)&x)[n]) +static inline uint32_t fdt32_to_cpu(uint32_t x) +{ + return (_B(0) << 24) | (_B(1) << 16) | (_B(2) << 8) | _B(3); +} +#define cpu_to_fdt32(x) fdt32_to_cpu(x) + +static inline uint64_t fdt64_to_cpu(uint64_t x) +{ + return (_B(0) << 56) | (_B(1) << 48) | (_B(2) << 40) | (_B(3) << 32) + | (_B(4) << 24) | (_B(5) << 16) | (_B(6) << 8) | _B(7); +} +#define cpu_to_fdt64(x) fdt64_to_cpu(x) +#undef _B + +#endif /* _LIBFDT_ENV_H */ diff --git a/sys/contrib/libfdt/libfdt_internal.h b/sys/contrib/libfdt/libfdt_internal.h new file mode 100644 index 000000000000..d2dcbd65ee30 --- /dev/null +++ b/sys/contrib/libfdt/libfdt_internal.h @@ -0,0 +1,94 @@ +#ifndef _LIBFDT_INTERNAL_H +#define _LIBFDT_INTERNAL_H +/* + * libfdt - Flat Device Tree manipulation + * Copyright (C) 2006 David Gibson, IBM Corporation. + * + * libfdt is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * + * a) This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * Alternatively, + * + * b) 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 + +#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) +#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) + +#define FDT_CHECK_HEADER(fdt) \ + { \ + int err; \ + if ((err = fdt_check_header(fdt)) != 0) \ + return err; \ + } + +int _fdt_check_node_offset(const void *fdt, int offset); +const char *_fdt_find_string(const char *strtab, int tabsize, const char *s); +int _fdt_node_end_offset(void *fdt, int nodeoffset); + +static inline const void *_fdt_offset_ptr(const void *fdt, int offset) +{ + return (const char *)fdt + fdt_off_dt_struct(fdt) + offset; +} + +static inline void *_fdt_offset_ptr_w(void *fdt, int offset) +{ + return (void *)(uintptr_t)_fdt_offset_ptr(fdt, offset); +} + +static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n) +{ + const struct fdt_reserve_entry *rsv_table = + (const struct fdt_reserve_entry *) + ((const char *)fdt + fdt_off_mem_rsvmap(fdt)); + + return rsv_table + n; +} +static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n) +{ + return (void *)(uintptr_t)_fdt_mem_rsv(fdt, n); +} + +#define FDT_SW_MAGIC (~FDT_MAGIC) + +#endif /* _LIBFDT_INTERNAL_H */ diff --git a/sys/contrib/ngatm/netnatm/api/cc_conn.c b/sys/contrib/ngatm/netnatm/api/cc_conn.c index c57bc1a2b234..2ba972aa0091 100644 --- a/sys/contrib/ngatm/netnatm/api/cc_conn.c +++ b/sys/contrib/ngatm/netnatm/api/cc_conn.c @@ -768,7 +768,7 @@ cc_party_drop_ack_ind(struct ccconn *conn, party = cc_party_find(conn, drop->epref.epref); if (party == NULL) { cc_party_log(party, "no party for %s", - ptab[CONN_SIG_DROP_PARTY_ACK_IND]); + cc_conn_sigtab[CONN_SIG_DROP_PARTY_ACK_IND]); return; } switch (party->state) { diff --git a/sys/contrib/pf/net/if_pfsync.c b/sys/contrib/pf/net/if_pfsync.c index 0925edb094b9..946611859175 100644 --- a/sys/contrib/pf/net/if_pfsync.c +++ b/sys/contrib/pf/net/if_pfsync.c @@ -465,7 +465,7 @@ pfsync_insert_net_state(struct pfsync_state *sp, u_int8_t chksum_flag) st->direction = sp->direction; st->log = sp->log; st->timeout = sp->timeout; - st->allow_opts = sp->allow_opts; + st->state_flags = sp->state_flags; bcopy(sp->id, &st->id, sizeof(st->id)); st->creatorid = sp->creatorid; @@ -1578,7 +1578,7 @@ pfsync_pack_state(u_int8_t action, struct pf_state *st, int flags) sp->proto = st->proto; sp->direction = st->direction; sp->log = st->log; - sp->allow_opts = st->allow_opts; + sp->state_flags = st->state_flags; sp->timeout = st->timeout; if (flags & PFSYNC_FLAG_STALE) diff --git a/sys/contrib/pf/net/if_pfsync.h b/sys/contrib/pf/net/if_pfsync.h index f7edca3e4003..f306610fb3d5 100644 --- a/sys/contrib/pf/net/if_pfsync.h +++ b/sys/contrib/pf/net/if_pfsync.h @@ -80,7 +80,7 @@ struct pfsync_state { u_int8_t proto; u_int8_t direction; u_int8_t log; - u_int8_t allow_opts; + u_int8_t state_flags; u_int8_t timeout; u_int8_t sync_flags; u_int8_t updates; diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c index e8031ac7dfec..ebe73c2e9320 100644 --- a/sys/contrib/pf/net/pf.c +++ b/sys/contrib/pf/net/pf.c @@ -253,6 +253,13 @@ int pf_test_fragment(struct pf_rule **, int, struct pfi_kif *, struct mbuf *, void *, struct pf_pdesc *, struct pf_rule **, struct pf_ruleset **); +int pf_tcp_track_full(struct pf_state_peer *, + struct pf_state_peer *, struct pf_state **, + struct pfi_kif *, struct mbuf *, int, + struct pf_pdesc *, u_short *, int *); +int pf_tcp_track_sloppy(struct pf_state_peer *, + struct pf_state_peer *, struct pf_state **, + struct pf_pdesc *, u_short *); int pf_test_state_tcp(struct pf_state **, int, struct pfi_kif *, struct mbuf *, int, void *, struct pf_pdesc *, u_short *); @@ -3528,7 +3535,10 @@ cleanup: s->nat_rule.ptr = nr; s->anchor.ptr = a; STATE_INC_COUNTERS(s); - s->allow_opts = r->allow_opts; + if (r->allow_opts) + s->state_flags |= PFSTATE_ALLOWOPTS; + if (r->rule_flag & PFRULE_STATESLOPPY) + s->state_flags |= PFSTATE_SLOPPY; s->log = r->log & PF_LOG_ALL; if (nr != NULL) s->log |= nr->log & PF_LOG_ALL; @@ -3925,7 +3935,10 @@ cleanup: s->nat_rule.ptr = nr; s->anchor.ptr = a; STATE_INC_COUNTERS(s); - s->allow_opts = r->allow_opts; + if (r->allow_opts) + s->state_flags |= PFSTATE_ALLOWOPTS; + if (r->rule_flag & PFRULE_STATESLOPPY) + s->state_flags |= PFSTATE_SLOPPY; s->log = r->log & PF_LOG_ALL; if (nr != NULL) s->log |= nr->log & PF_LOG_ALL; @@ -4238,7 +4251,10 @@ cleanup: s->nat_rule.ptr = nr; s->anchor.ptr = a; STATE_INC_COUNTERS(s); - s->allow_opts = r->allow_opts; + if (r->allow_opts) + s->state_flags |= PFSTATE_ALLOWOPTS; + if (r->rule_flag & PFRULE_STATESLOPPY) + s->state_flags |= PFSTATE_SLOPPY; s->log = r->log & PF_LOG_ALL; if (nr != NULL) s->log |= nr->log & PF_LOG_ALL; @@ -4525,7 +4541,10 @@ cleanup: s->nat_rule.ptr = nr; s->anchor.ptr = a; STATE_INC_COUNTERS(s); - s->allow_opts = r->allow_opts; + if (r->allow_opts) + s->state_flags |= PFSTATE_ALLOWOPTS; + if (r->rule_flag & PFRULE_STATESLOPPY) + s->state_flags |= PFSTATE_SLOPPY; s->log = r->log & PF_LOG_ALL; if (nr != NULL) s->log |= nr->log & PF_LOG_ALL; @@ -4665,6 +4684,430 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif, return (PF_PASS); } +int +pf_tcp_track_full(struct pf_state_peer *src, struct pf_state_peer *dst, + struct pf_state **state, struct pfi_kif *kif, struct mbuf *m, int off, + struct pf_pdesc *pd, u_short *reason, int *copyback) +{ + struct tcphdr *th = pd->hdr.tcp; + u_int16_t win = ntohs(th->th_win); + u_int32_t ack, end, seq, orig_seq; + u_int8_t sws, dws; + int ackskew; + + if (src->wscale && dst->wscale && !(th->th_flags & TH_SYN)) { + sws = src->wscale & PF_WSCALE_MASK; + dws = dst->wscale & PF_WSCALE_MASK; + } else + sws = dws = 0; + + /* + * Sequence tracking algorithm from Guido van Rooij's paper: + * http://www.madison-gurkha.com/publications/tcp_filtering/ + * tcp_filtering.ps + */ + + orig_seq = seq = ntohl(th->th_seq); + if (src->seqlo == 0) { + /* First packet from this end. Set its state */ + + if ((pd->flags & PFDESC_TCP_NORM || dst->scrub) && + src->scrub == NULL) { + if (pf_normalize_tcp_init(m, off, pd, th, src, dst)) { + REASON_SET(reason, PFRES_MEMORY); + return (PF_DROP); + } + } + + /* Deferred generation of sequence number modulator */ + if (dst->seqdiff && !src->seqdiff) { +#ifdef __FreeBSD__ + while ((src->seqdiff = pf_new_isn(*state) - seq) == 0) + ; +#else + while ((src->seqdiff = tcp_rndiss_next() - seq) == 0) + ; +#endif + ack = ntohl(th->th_ack) - dst->seqdiff; + pf_change_a(&th->th_seq, &th->th_sum, htonl(seq + + src->seqdiff), 0); + pf_change_a(&th->th_ack, &th->th_sum, htonl(ack), 0); + *copyback = 1; + } else { + ack = ntohl(th->th_ack); + } + + end = seq + pd->p_len; + if (th->th_flags & TH_SYN) { + end++; + if (dst->wscale & PF_WSCALE_FLAG) { + src->wscale = pf_get_wscale(m, off, th->th_off, + pd->af); + if (src->wscale & PF_WSCALE_FLAG) { + /* Remove scale factor from initial + * window */ + sws = src->wscale & PF_WSCALE_MASK; + win = ((u_int32_t)win + (1 << sws) - 1) + >> sws; + dws = dst->wscale & PF_WSCALE_MASK; + } else { + /* fixup other window */ + dst->max_win <<= dst->wscale & + PF_WSCALE_MASK; + /* in case of a retrans SYN|ACK */ + dst->wscale = 0; + } + } + } + if (th->th_flags & TH_FIN) + end++; + + src->seqlo = seq; + if (src->state < TCPS_SYN_SENT) + src->state = TCPS_SYN_SENT; + + /* + * May need to slide the window (seqhi may have been set by + * the crappy stack check or if we picked up the connection + * after establishment) + */ + if (src->seqhi == 1 || + SEQ_GEQ(end + MAX(1, dst->max_win << dws), src->seqhi)) + src->seqhi = end + MAX(1, dst->max_win << dws); + if (win > src->max_win) + src->max_win = win; + + } else { + ack = ntohl(th->th_ack) - dst->seqdiff; + if (src->seqdiff) { + /* Modulate sequence numbers */ + pf_change_a(&th->th_seq, &th->th_sum, htonl(seq + + src->seqdiff), 0); + pf_change_a(&th->th_ack, &th->th_sum, htonl(ack), 0); + *copyback = 1; + } + end = seq + pd->p_len; + if (th->th_flags & TH_SYN) + end++; + if (th->th_flags & TH_FIN) + end++; + } + + if ((th->th_flags & TH_ACK) == 0) { + /* Let it pass through the ack skew check */ + ack = dst->seqlo; + } else if ((ack == 0 && + (th->th_flags & (TH_ACK|TH_RST)) == (TH_ACK|TH_RST)) || + /* broken tcp stacks do not set ack */ + (dst->state < TCPS_SYN_SENT)) { + /* + * Many stacks (ours included) will set the ACK number in an + * FIN|ACK if the SYN times out -- no sequence to ACK. + */ + ack = dst->seqlo; + } + + if (seq == end) { + /* Ease sequencing restrictions on no data packets */ + seq = src->seqlo; + end = seq; + } + + ackskew = dst->seqlo - ack; + + + /* + * Need to demodulate the sequence numbers in any TCP SACK options + * (Selective ACK). We could optionally validate the SACK values + * against the current ACK window, either forwards or backwards, but + * I'm not confident that SACK has been implemented properly + * everywhere. It wouldn't surprise me if several stacks accidently + * SACK too far backwards of previously ACKed data. There really aren't + * any security implications of bad SACKing unless the target stack + * doesn't validate the option length correctly. Someone trying to + * spoof into a TCP connection won't bother blindly sending SACK + * options anyway. + */ + if (dst->seqdiff && (th->th_off << 2) > sizeof(struct tcphdr)) { + if (pf_modulate_sack(m, off, pd, th, dst)) + *copyback = 1; + } + + +#define MAXACKWINDOW (0xffff + 1500) /* 1500 is an arbitrary fudge factor */ + if (SEQ_GEQ(src->seqhi, end) && + /* Last octet inside other's window space */ + SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)) && + /* Retrans: not more than one window back */ + (ackskew >= -MAXACKWINDOW) && + /* Acking not more than one reassembled fragment backwards */ + (ackskew <= (MAXACKWINDOW << sws)) && + /* Acking not more than one window forward */ + ((th->th_flags & TH_RST) == 0 || orig_seq == src->seqlo || + (orig_seq == src->seqlo + 1) || (pd->flags & PFDESC_IP_REAS) == 0)) { + /* Require an exact/+1 sequence match on resets when possible */ + + if (dst->scrub || src->scrub) { + if (pf_normalize_tcp_stateful(m, off, pd, reason, th, + *state, src, dst, copyback)) + return (PF_DROP); + } + + /* update max window */ + if (src->max_win < win) + src->max_win = win; + /* synchronize sequencing */ + if (SEQ_GT(end, src->seqlo)) + src->seqlo = end; + /* slide the window of what the other end can send */ + if (SEQ_GEQ(ack + (win << sws), dst->seqhi)) + dst->seqhi = ack + MAX((win << sws), 1); + + + /* update states */ + if (th->th_flags & TH_SYN) + if (src->state < TCPS_SYN_SENT) + src->state = TCPS_SYN_SENT; + if (th->th_flags & TH_FIN) + if (src->state < TCPS_CLOSING) + src->state = TCPS_CLOSING; + if (th->th_flags & TH_ACK) { + if (dst->state == TCPS_SYN_SENT) { + dst->state = TCPS_ESTABLISHED; + if (src->state == TCPS_ESTABLISHED && + (*state)->src_node != NULL && + pf_src_connlimit(state)) { + REASON_SET(reason, PFRES_SRCLIMIT); + return (PF_DROP); + } + } else if (dst->state == TCPS_CLOSING) + dst->state = TCPS_FIN_WAIT_2; + } + if (th->th_flags & TH_RST) + src->state = dst->state = TCPS_TIME_WAIT; + + /* update expire time */ + (*state)->expire = time_second; + if (src->state >= TCPS_FIN_WAIT_2 && + dst->state >= TCPS_FIN_WAIT_2) + (*state)->timeout = PFTM_TCP_CLOSED; + else if (src->state >= TCPS_CLOSING && + dst->state >= TCPS_CLOSING) + (*state)->timeout = PFTM_TCP_FIN_WAIT; + else if (src->state < TCPS_ESTABLISHED || + dst->state < TCPS_ESTABLISHED) + (*state)->timeout = PFTM_TCP_OPENING; + else if (src->state >= TCPS_CLOSING || + dst->state >= TCPS_CLOSING) + (*state)->timeout = PFTM_TCP_CLOSING; + else + (*state)->timeout = PFTM_TCP_ESTABLISHED; + + /* Fall through to PASS packet */ + + } else if ((dst->state < TCPS_SYN_SENT || + dst->state >= TCPS_FIN_WAIT_2 || + src->state >= TCPS_FIN_WAIT_2) && + SEQ_GEQ(src->seqhi + MAXACKWINDOW, end) && + /* Within a window forward of the originating packet */ + SEQ_GEQ(seq, src->seqlo - MAXACKWINDOW)) { + /* Within a window backward of the originating packet */ + + /* + * This currently handles three situations: + * 1) Stupid stacks will shotgun SYNs before their peer + * replies. + * 2) When PF catches an already established stream (the + * firewall rebooted, the state table was flushed, routes + * changed...) + * 3) Packets get funky immediately after the connection + * closes (this should catch Solaris spurious ACK|FINs + * that web servers like to spew after a close) + * + * This must be a little more careful than the above code + * since packet floods will also be caught here. We don't + * update the TTL here to mitigate the damage of a packet + * flood and so the same code can handle awkward establishment + * and a loosened connection close. + * In the establishment case, a correct peer response will + * validate the connection, go through the normal state code + * and keep updating the state TTL. + */ + + if (pf_status.debug >= PF_DEBUG_MISC) { + printf("pf: loose state match: "); + pf_print_state(*state); + pf_print_flags(th->th_flags); + printf(" seq=%u (%u) ack=%u len=%u ackskew=%d " + "pkts=%llu:%llu\n", seq, orig_seq, ack, pd->p_len, +#ifdef __FreeBSD__ + ackskew, (unsigned long long)(*state)->packets[0], + (unsigned long long)(*state)->packets[1]); +#else + ackskew, (*state)->packets[0], + (*state)->packets[1]); +#endif + } + + if (dst->scrub || src->scrub) { + if (pf_normalize_tcp_stateful(m, off, pd, reason, th, + *state, src, dst, copyback)) + return (PF_DROP); + } + + /* update max window */ + if (src->max_win < win) + src->max_win = win; + /* synchronize sequencing */ + if (SEQ_GT(end, src->seqlo)) + src->seqlo = end; + /* slide the window of what the other end can send */ + if (SEQ_GEQ(ack + (win << sws), dst->seqhi)) + dst->seqhi = ack + MAX((win << sws), 1); + + /* + * Cannot set dst->seqhi here since this could be a shotgunned + * SYN and not an already established connection. + */ + + if (th->th_flags & TH_FIN) + if (src->state < TCPS_CLOSING) + src->state = TCPS_CLOSING; + if (th->th_flags & TH_RST) + src->state = dst->state = TCPS_TIME_WAIT; + + /* Fall through to PASS packet */ + + } else { + if ((*state)->dst.state == TCPS_SYN_SENT && + (*state)->src.state == TCPS_SYN_SENT) { + /* Send RST for state mismatches during handshake */ + if (!(th->th_flags & TH_RST)) +#ifdef __FreeBSD__ + pf_send_tcp(m, (*state)->rule.ptr, pd->af, +#else + pf_send_tcp((*state)->rule.ptr, pd->af, +#endif + pd->dst, pd->src, th->th_dport, + th->th_sport, ntohl(th->th_ack), 0, + TH_RST, 0, 0, + (*state)->rule.ptr->return_ttl, 1, 0, + pd->eh, kif->pfik_ifp); + src->seqlo = 0; + src->seqhi = 1; + src->max_win = 1; + } else if (pf_status.debug >= PF_DEBUG_MISC) { + printf("pf: BAD state: "); + pf_print_state(*state); + pf_print_flags(th->th_flags); + printf(" seq=%u (%u) ack=%u len=%u ackskew=%d " +#ifdef notyet + "pkts=%llu:%llu dir=%s,%s\n", +#else + "pkts=%llu:%llu%s\n", +#endif + seq, orig_seq, ack, pd->p_len, ackskew, +#ifdef __FreeBSD__ + (unsigned long long)(*state)->packets[0], + (unsigned long long)(*state)->packets[1], +#else + (*state)->packets[0], (*state)->packets[1], +#endif +#ifdef notyet + direction == PF_IN ? "in" : "out", + direction == (*state)->direction ? "fwd" : "rev"); +#else + ""); +#endif + printf("pf: State failure on: %c %c %c %c | %c %c\n", + SEQ_GEQ(src->seqhi, end) ? ' ' : '1', + SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)) ? + ' ': '2', + (ackskew >= -MAXACKWINDOW) ? ' ' : '3', + (ackskew <= (MAXACKWINDOW << sws)) ? ' ' : '4', + SEQ_GEQ(src->seqhi + MAXACKWINDOW, end) ?' ' :'5', + SEQ_GEQ(seq, src->seqlo - MAXACKWINDOW) ?' ' :'6'); + } + REASON_SET(reason, PFRES_BADSTATE); + return (PF_DROP); + } + + /* Any packets which have gotten here are to be passed */ + return (PF_PASS); +} + +int +pf_tcp_track_sloppy(struct pf_state_peer *src, struct pf_state_peer *dst, + struct pf_state **state, struct pf_pdesc *pd, u_short *reason) +{ + struct tcphdr *th = pd->hdr.tcp; + + if (th->th_flags & TH_SYN) + if (src->state < TCPS_SYN_SENT) + src->state = TCPS_SYN_SENT; + if (th->th_flags & TH_FIN) + if (src->state < TCPS_CLOSING) + src->state = TCPS_CLOSING; + if (th->th_flags & TH_ACK) { + if (dst->state == TCPS_SYN_SENT) { + dst->state = TCPS_ESTABLISHED; + if (src->state == TCPS_ESTABLISHED && + (*state)->src_node != NULL && + pf_src_connlimit(state)) { + REASON_SET(reason, PFRES_SRCLIMIT); + return (PF_DROP); + } + } else if (dst->state == TCPS_CLOSING) { + dst->state = TCPS_FIN_WAIT_2; + } else if (src->state == TCPS_SYN_SENT && + dst->state < TCPS_SYN_SENT) { + /* + * Handle a special sloppy case where we only see one + * half of the connection. If there is a ACK after + * the initial SYN without ever seeing a packet from + * the destination, set the connection to established. + */ + dst->state = src->state = TCPS_ESTABLISHED; + if ((*state)->src_node != NULL && + pf_src_connlimit(state)) { + REASON_SET(reason, PFRES_SRCLIMIT); + return (PF_DROP); + } + } else if (src->state == TCPS_CLOSING && + dst->state == TCPS_ESTABLISHED && + dst->seqlo == 0) { + /* + * Handle the closing of half connections where we + * don't see the full bidirectional FIN/ACK+ACK + * handshake. + */ + dst->state = TCPS_CLOSING; + } + } + if (th->th_flags & TH_RST) + src->state = dst->state = TCPS_TIME_WAIT; + + /* update expire time */ + (*state)->expire = time_second; + if (src->state >= TCPS_FIN_WAIT_2 && + dst->state >= TCPS_FIN_WAIT_2) + (*state)->timeout = PFTM_TCP_CLOSED; + else if (src->state >= TCPS_CLOSING && + dst->state >= TCPS_CLOSING) + (*state)->timeout = PFTM_TCP_FIN_WAIT; + else if (src->state < TCPS_ESTABLISHED || + dst->state < TCPS_ESTABLISHED) + (*state)->timeout = PFTM_TCP_OPENING; + else if (src->state >= TCPS_CLOSING || + dst->state >= TCPS_CLOSING) + (*state)->timeout = PFTM_TCP_CLOSING; + else + (*state)->timeout = PFTM_TCP_ESTABLISHED; + + return (PF_PASS); +} + + int pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif, struct mbuf *m, int off, void *h, struct pf_pdesc *pd, @@ -4672,10 +5115,6 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif, { struct pf_state_cmp key; struct tcphdr *th = pd->hdr.tcp; - u_int16_t win = ntohs(th->th_win); - u_int32_t ack, end, seq, orig_seq; - u_int8_t sws, dws; - int ackskew; int copyback = 0; struct pf_state_peer *src, *dst; @@ -4826,337 +5265,15 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif, return (PF_DROP); } - if (src->wscale && dst->wscale && !(th->th_flags & TH_SYN)) { - sws = src->wscale & PF_WSCALE_MASK; - dws = dst->wscale & PF_WSCALE_MASK; - } else - sws = dws = 0; - - /* - * Sequence tracking algorithm from Guido van Rooij's paper: - * http://www.madison-gurkha.com/publications/tcp_filtering/ - * tcp_filtering.ps - */ - - orig_seq = seq = ntohl(th->th_seq); - if (src->seqlo == 0) { - /* First packet from this end. Set its state */ - - if ((pd->flags & PFDESC_TCP_NORM || dst->scrub) && - src->scrub == NULL) { - if (pf_normalize_tcp_init(m, off, pd, th, src, dst)) { - REASON_SET(reason, PFRES_MEMORY); - return (PF_DROP); - } - } - - /* Deferred generation of sequence number modulator */ - if (dst->seqdiff && !src->seqdiff) { -#ifdef __FreeBSD__ - while ((src->seqdiff = pf_new_isn(*state) - seq) == 0) - ; -#else - while ((src->seqdiff = tcp_rndiss_next() - seq) == 0) - ; -#endif - ack = ntohl(th->th_ack) - dst->seqdiff; - pf_change_a(&th->th_seq, &th->th_sum, htonl(seq + - src->seqdiff), 0); - pf_change_a(&th->th_ack, &th->th_sum, htonl(ack), 0); - copyback = 1; - } else { - ack = ntohl(th->th_ack); - } - - end = seq + pd->p_len; - if (th->th_flags & TH_SYN) { - end++; - if (dst->wscale & PF_WSCALE_FLAG) { - src->wscale = pf_get_wscale(m, off, th->th_off, - pd->af); - if (src->wscale & PF_WSCALE_FLAG) { - /* Remove scale factor from initial - * window */ - sws = src->wscale & PF_WSCALE_MASK; - win = ((u_int32_t)win + (1 << sws) - 1) - >> sws; - dws = dst->wscale & PF_WSCALE_MASK; - } else { - /* fixup other window */ - dst->max_win <<= dst->wscale & - PF_WSCALE_MASK; - /* in case of a retrans SYN|ACK */ - dst->wscale = 0; - } - } - } - if (th->th_flags & TH_FIN) - end++; - - src->seqlo = seq; - if (src->state < TCPS_SYN_SENT) - src->state = TCPS_SYN_SENT; - - /* - * May need to slide the window (seqhi may have been set by - * the crappy stack check or if we picked up the connection - * after establishment) - */ - if (src->seqhi == 1 || - SEQ_GEQ(end + MAX(1, dst->max_win << dws), src->seqhi)) - src->seqhi = end + MAX(1, dst->max_win << dws); - if (win > src->max_win) - src->max_win = win; - + if ((*state)->state_flags & PFSTATE_SLOPPY) { + if (pf_tcp_track_sloppy(src, dst, state, pd, reason) == PF_DROP) + return (PF_DROP); } else { - ack = ntohl(th->th_ack) - dst->seqdiff; - if (src->seqdiff) { - /* Modulate sequence numbers */ - pf_change_a(&th->th_seq, &th->th_sum, htonl(seq + - src->seqdiff), 0); - pf_change_a(&th->th_ack, &th->th_sum, htonl(ack), 0); - copyback = 1; - } - end = seq + pd->p_len; - if (th->th_flags & TH_SYN) - end++; - if (th->th_flags & TH_FIN) - end++; + if (pf_tcp_track_full(src, dst, state, kif, m, off, pd, reason, + ©back) == PF_DROP) + return (PF_DROP); } - if ((th->th_flags & TH_ACK) == 0) { - /* Let it pass through the ack skew check */ - ack = dst->seqlo; - } else if ((ack == 0 && - (th->th_flags & (TH_ACK|TH_RST)) == (TH_ACK|TH_RST)) || - /* broken tcp stacks do not set ack */ - (dst->state < TCPS_SYN_SENT)) { - /* - * Many stacks (ours included) will set the ACK number in an - * FIN|ACK if the SYN times out -- no sequence to ACK. - */ - ack = dst->seqlo; - } - - if (seq == end) { - /* Ease sequencing restrictions on no data packets */ - seq = src->seqlo; - end = seq; - } - - ackskew = dst->seqlo - ack; - - - /* - * Need to demodulate the sequence numbers in any TCP SACK options - * (Selective ACK). We could optionally validate the SACK values - * against the current ACK window, either forwards or backwards, but - * I'm not confident that SACK has been implemented properly - * everywhere. It wouldn't surprise me if several stacks accidently - * SACK too far backwards of previously ACKed data. There really aren't - * any security implications of bad SACKing unless the target stack - * doesn't validate the option length correctly. Someone trying to - * spoof into a TCP connection won't bother blindly sending SACK - * options anyway. - */ - if (dst->seqdiff && (th->th_off << 2) > sizeof(struct tcphdr)) { - if (pf_modulate_sack(m, off, pd, th, dst)) - copyback = 1; - } - - -#define MAXACKWINDOW (0xffff + 1500) /* 1500 is an arbitrary fudge factor */ - if (SEQ_GEQ(src->seqhi, end) && - /* Last octet inside other's window space */ - SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)) && - /* Retrans: not more than one window back */ - (ackskew >= -MAXACKWINDOW) && - /* Acking not more than one reassembled fragment backwards */ - (ackskew <= (MAXACKWINDOW << sws)) && - /* Acking not more than one window forward */ - ((th->th_flags & TH_RST) == 0 || orig_seq == src->seqlo || - (orig_seq == src->seqlo + 1) || (pd->flags & PFDESC_IP_REAS) == 0)) { - /* Require an exact/+1 sequence match on resets when possible */ - - if (dst->scrub || src->scrub) { - if (pf_normalize_tcp_stateful(m, off, pd, reason, th, - *state, src, dst, ©back)) - return (PF_DROP); - } - - /* update max window */ - if (src->max_win < win) - src->max_win = win; - /* synchronize sequencing */ - if (SEQ_GT(end, src->seqlo)) - src->seqlo = end; - /* slide the window of what the other end can send */ - if (SEQ_GEQ(ack + (win << sws), dst->seqhi)) - dst->seqhi = ack + MAX((win << sws), 1); - - - /* update states */ - if (th->th_flags & TH_SYN) - if (src->state < TCPS_SYN_SENT) - src->state = TCPS_SYN_SENT; - if (th->th_flags & TH_FIN) - if (src->state < TCPS_CLOSING) - src->state = TCPS_CLOSING; - if (th->th_flags & TH_ACK) { - if (dst->state == TCPS_SYN_SENT) { - dst->state = TCPS_ESTABLISHED; - if (src->state == TCPS_ESTABLISHED && - (*state)->src_node != NULL && - pf_src_connlimit(state)) { - REASON_SET(reason, PFRES_SRCLIMIT); - return (PF_DROP); - } - } else if (dst->state == TCPS_CLOSING) - dst->state = TCPS_FIN_WAIT_2; - } - if (th->th_flags & TH_RST) - src->state = dst->state = TCPS_TIME_WAIT; - - /* update expire time */ - (*state)->expire = time_second; - if (src->state >= TCPS_FIN_WAIT_2 && - dst->state >= TCPS_FIN_WAIT_2) - (*state)->timeout = PFTM_TCP_CLOSED; - else if (src->state >= TCPS_CLOSING && - dst->state >= TCPS_CLOSING) - (*state)->timeout = PFTM_TCP_FIN_WAIT; - else if (src->state < TCPS_ESTABLISHED || - dst->state < TCPS_ESTABLISHED) - (*state)->timeout = PFTM_TCP_OPENING; - else if (src->state >= TCPS_CLOSING || - dst->state >= TCPS_CLOSING) - (*state)->timeout = PFTM_TCP_CLOSING; - else - (*state)->timeout = PFTM_TCP_ESTABLISHED; - - /* Fall through to PASS packet */ - - } else if ((dst->state < TCPS_SYN_SENT || - dst->state >= TCPS_FIN_WAIT_2 || - src->state >= TCPS_FIN_WAIT_2) && - SEQ_GEQ(src->seqhi + MAXACKWINDOW, end) && - /* Within a window forward of the originating packet */ - SEQ_GEQ(seq, src->seqlo - MAXACKWINDOW)) { - /* Within a window backward of the originating packet */ - - /* - * This currently handles three situations: - * 1) Stupid stacks will shotgun SYNs before their peer - * replies. - * 2) When PF catches an already established stream (the - * firewall rebooted, the state table was flushed, routes - * changed...) - * 3) Packets get funky immediately after the connection - * closes (this should catch Solaris spurious ACK|FINs - * that web servers like to spew after a close) - * - * This must be a little more careful than the above code - * since packet floods will also be caught here. We don't - * update the TTL here to mitigate the damage of a packet - * flood and so the same code can handle awkward establishment - * and a loosened connection close. - * In the establishment case, a correct peer response will - * validate the connection, go through the normal state code - * and keep updating the state TTL. - */ - - if (pf_status.debug >= PF_DEBUG_MISC) { - printf("pf: loose state match: "); - pf_print_state(*state); - pf_print_flags(th->th_flags); - printf(" seq=%u (%u) ack=%u len=%u ackskew=%d " - "pkts=%llu:%llu\n", seq, orig_seq, ack, pd->p_len, -#ifdef __FreeBSD__ - ackskew, (unsigned long long)(*state)->packets[0], - (unsigned long long)(*state)->packets[1]); -#else - ackskew, (*state)->packets[0], - (*state)->packets[1]); -#endif - } - - if (dst->scrub || src->scrub) { - if (pf_normalize_tcp_stateful(m, off, pd, reason, th, - *state, src, dst, ©back)) - return (PF_DROP); - } - - /* update max window */ - if (src->max_win < win) - src->max_win = win; - /* synchronize sequencing */ - if (SEQ_GT(end, src->seqlo)) - src->seqlo = end; - /* slide the window of what the other end can send */ - if (SEQ_GEQ(ack + (win << sws), dst->seqhi)) - dst->seqhi = ack + MAX((win << sws), 1); - - /* - * Cannot set dst->seqhi here since this could be a shotgunned - * SYN and not an already established connection. - */ - - if (th->th_flags & TH_FIN) - if (src->state < TCPS_CLOSING) - src->state = TCPS_CLOSING; - if (th->th_flags & TH_RST) - src->state = dst->state = TCPS_TIME_WAIT; - - /* Fall through to PASS packet */ - - } else { - if ((*state)->dst.state == TCPS_SYN_SENT && - (*state)->src.state == TCPS_SYN_SENT) { - /* Send RST for state mismatches during handshake */ - if (!(th->th_flags & TH_RST)) -#ifdef __FreeBSD__ - pf_send_tcp(m, (*state)->rule.ptr, pd->af, -#else - pf_send_tcp((*state)->rule.ptr, pd->af, -#endif - pd->dst, pd->src, th->th_dport, - th->th_sport, ntohl(th->th_ack), 0, - TH_RST, 0, 0, - (*state)->rule.ptr->return_ttl, 1, 0, - pd->eh, kif->pfik_ifp); - src->seqlo = 0; - src->seqhi = 1; - src->max_win = 1; - } else if (pf_status.debug >= PF_DEBUG_MISC) { - printf("pf: BAD state: "); - pf_print_state(*state); - pf_print_flags(th->th_flags); - printf(" seq=%u (%u) ack=%u len=%u ackskew=%d " - "pkts=%llu:%llu dir=%s,%s\n", - seq, orig_seq, ack, pd->p_len, ackskew, -#ifdef __FreeBSD__ - (unsigned long long)(*state)->packets[0], - (unsigned long long)(*state)->packets[1], -#else - (*state)->packets[0], (*state)->packets[1], -#endif - direction == PF_IN ? "in" : "out", - direction == (*state)->direction ? "fwd" : "rev"); - printf("pf: State failure on: %c %c %c %c | %c %c\n", - SEQ_GEQ(src->seqhi, end) ? ' ' : '1', - SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)) ? - ' ': '2', - (ackskew >= -MAXACKWINDOW) ? ' ' : '3', - (ackskew <= (MAXACKWINDOW << sws)) ? ' ' : '4', - SEQ_GEQ(src->seqhi + MAXACKWINDOW, end) ?' ' :'5', - SEQ_GEQ(seq, src->seqlo - MAXACKWINDOW) ?' ' :'6'); - } - REASON_SET(reason, PFRES_BADSTATE); - return (PF_DROP); - } - - /* Any packets which have gotten here are to be passed */ - /* translate source/destination address, if necessary */ if (STATE_TRANSLATE(*state)) { if (direction == PF_OUT) @@ -5533,8 +5650,9 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif, copyback = 1; } - if (!SEQ_GEQ(src->seqhi, seq) || - !SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws))) { + if (!((*state)->state_flags & PFSTATE_SLOPPY) && + (!SEQ_GEQ(src->seqhi, seq) || + !SEQ_GEQ(seq, src->seqlo - (dst->max_win << dws)))) { if (pf_status.debug >= PF_DEBUG_MISC) { printf("pf: BAD ICMP %d:%d ", icmptype, pd->hdr.icmp->icmp_code); @@ -7052,7 +7170,7 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0, done: if (action == PF_PASS && h->ip_hl > 5 && - !((s && s->allow_opts) || r->allow_opts)) { + !((s && s->state_flags & PFSTATE_ALLOWOPTS) || r->allow_opts)) { action = PF_DROP; REASON_SET(&reason, PFRES_IPOPTIONS); log = 1; @@ -7513,7 +7631,7 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0, done: /* handle dangerous IPv6 extension headers. */ if (action == PF_PASS && rh_cnt && - !((s && s->allow_opts) || r->allow_opts)) { + !((s && s->state_flags & PFSTATE_ALLOWOPTS) || r->allow_opts)) { action = PF_DROP; REASON_SET(&reason, PFRES_IPOPTIONS); log = 1; diff --git a/sys/contrib/pf/net/pfvar.h b/sys/contrib/pf/net/pfvar.h index 32e721c5733f..de175b1a0213 100644 --- a/sys/contrib/pf/net/pfvar.h +++ b/sys/contrib/pf/net/pfvar.h @@ -700,6 +700,7 @@ struct pf_rule { /* rule flags again */ #define PFRULE_IFBOUND 0x00010000 /* if-bound */ +#define PFRULE_STATESLOPPY 0x00020000 /* sloppy state tracking */ #define PFSTATE_HIWAT 10000 /* default state table size */ #define PFSTATE_ADAPT_START 6000 /* default adaptive timeout start */ @@ -800,7 +801,9 @@ struct pf_state { u_int8_t pad; #endif u_int8_t log; - u_int8_t allow_opts; + u_int8_t state_flags; +#define PFSTATE_ALLOWOPTS 0x01 +#define PFSTATE_SLOPPY 0x02 u_int8_t timeout; u_int8_t sync_flags; #define PFSTATE_NOSYNC 0x01 diff --git a/sys/contrib/rdma/krping/krping.c b/sys/contrib/rdma/krping/krping.c index db7c524549c9..d787965cd84b 100644 --- a/sys/contrib/rdma/krping/krping.c +++ b/sys/contrib/rdma/krping/krping.c @@ -112,109 +112,6 @@ struct krping_cb_list krping_cbs; #define RPING_BUFSIZE 128*1024 #define RPING_SQ_DEPTH 32 - -/* lifted from netinet/libalias/alias_proxy.c */ -static int inet_aton(const char *cp, struct in_addr *addr); -static int -inet_aton(cp, addr) - const char *cp; - struct in_addr *addr; -{ - u_long parts[4]; - in_addr_t val; - const char *c; - char *endptr; - int gotend, n; - - c = (const char *)cp; - n = 0; - /* - * Run through the string, grabbing numbers until - * the end of the string, or some error - */ - gotend = 0; - while (!gotend) { - unsigned long l; - - l = strtoul(c, &endptr, 0); - - if (l == ULONG_MAX || (l == 0 && endptr == c)) - return (0); - - val = (in_addr_t)l; - /* - * If the whole string is invalid, endptr will equal - * c.. this way we can make sure someone hasn't - * gone '.12' or something which would get past - * the next check. - */ - if (endptr == c) - return (0); - parts[n] = val; - c = endptr; - - /* Check the next character past the previous number's end */ - switch (*c) { - case '.' : - /* Make sure we only do 3 dots .. */ - if (n == 3) /* Whoops. Quit. */ - return (0); - n++; - c++; - break; - - case '\0': - gotend = 1; - break; - - default: - if (isspace((unsigned char)*c)) { - gotend = 1; - break; - } else - return (0); /* Invalid character, so fail */ - } - - } - - /* - * Concoct the address according to - * the number of parts specified. - */ - - switch (n) { - case 0: /* a -- 32 bits */ - /* - * Nothing is necessary here. Overflow checking was - * already done in strtoul(). - */ - break; - case 1: /* a.b -- 8.24 bits */ - if (val > 0xffffff || parts[0] > 0xff) - return (0); - val |= parts[0] << 24; - break; - - case 2: /* a.b.c -- 8.8.16 bits */ - if (val > 0xffff || parts[0] > 0xff || parts[1] > 0xff) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16); - break; - - case 3: /* a.b.c.d -- 8.8.8.8 bits */ - if (val > 0xff || parts[0] > 0xff || parts[1] > 0xff || - parts[2] > 0xff) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - } - - if (addr != NULL) - addr->s_addr = htonl(val); - return (1); -} - - static void krping_wait(struct krping_cb *cb, int state) { int rc; diff --git a/sys/contrib/x86emu/x86emu_util.c b/sys/contrib/x86emu/x86emu_util.c deleted file mode 100644 index 4172f94f135a..000000000000 --- a/sys/contrib/x86emu/x86emu_util.c +++ /dev/null @@ -1,211 +0,0 @@ -/* $OpenBSD: x86emu_util.c,v 1.5 2009/06/18 14:19:21 pirofti Exp $ */ -/* $NetBSD: x86emu_util.c,v 1.2 2007/12/04 17:32:22 joerg Exp $ */ - -/* - * - * Realmode X86 Emulator Library - * - * Copyright (C) 1996-1999 SciTech Software, Inc. - * Copyright (C) David Mosberger-Tang - * Copyright (C) 1999 Egbert Eich - * Copyright (C) 2007 Joerg Sonnenberger - * - * ======================================================================== - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and that - * both that copyright notice and this permission notice appear in - * supporting documentation, and that the name of the authors not be used - * in advertising or publicity pertaining to distribution of the software - * without specific, written prior permission. The authors makes no - * representations about the suitability of this software for any purpose. - * It is provided "as is" without express or implied warranty. - * - * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF - * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - * - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include - -#include -#include - - - -/* - * PARAMETERS: - * addr - Emulator memory address to read - * - * RETURNS: - * Byte value read from emulator memory. - * - * REMARKS: - * Reads a byte value from the emulator memory. - */ -static uint8_t -rdb(struct x86emu *emu, uint32_t addr) -{ - if (addr > emu->mem_size - 1) - x86emu_halt_sys(emu); - return emu->mem_base[addr]; -} - -/* - * PARAMETERS: - * addr - Emulator memory address to read - * - * RETURNS: - * Word value read from emulator memory. - * - * REMARKS: - * Reads a word value from the emulator memory. - */ -static uint16_t -rdw(struct x86emu *emu, uint32_t addr) -{ - if (addr > emu->mem_size - 2) - x86emu_halt_sys(emu); -#ifdef __STRICT_ALIGNMENT - if (addr & 1) { - u_int8_t *a = emu->mem_base + addr; - u_int16_t r; - - r = ((*(a + 0) << 0) & 0x00ff) | - ((*(a + 1) << 8) & 0xff00); - return r; - } else - return le32toh(*(u_int32_t *)(emu->mem_base + addr)); -#else - return le16toh(*(u_int16_t *)(emu->mem_base + addr)); -#endif -} - -/* - * PARAMETERS: - * addr - Emulator memory address to read - * - * RETURNS: - * Long value read from emulator memory. - * REMARKS: - * Reads a long value from the emulator memory. - */ -static uint32_t -rdl(struct x86emu *emu, uint32_t addr) -{ - if (addr > emu->mem_size - 4) - x86emu_halt_sys(emu); -#ifdef __STRICT_ALIGNMENT - if (addr & 3) { - u_int8_t *a = emu->mem_base + addr; - u_int32_t r; - - r = ((*(a + 0) << 0) & 0x000000ff) | - ((*(a + 1) << 8) & 0x0000ff00) | - ((*(a + 2) << 16) & 0x00ff0000) | - ((*(a + 3) << 24) & 0xff000000); - return r; - } else - return le32toh(*(u_int32_t *)(emu->mem_base + addr)); -#else - return le32toh(*(u_int32_t *)(emu->mem_base + addr)); -#endif -} - -/* - * PARAMETERS: - * addr - Emulator memory address to read - * val - Value to store - * - * REMARKS: - * Writes a byte value to emulator memory. - */ -static void -wrb(struct x86emu *emu, uint32_t addr, uint8_t val) -{ - if (addr > emu->mem_size - 1) - x86emu_halt_sys(emu); - emu->mem_base[addr] = val; -} - -/* - * PARAMETERS: - * addr - Emulator memory address to read - * val - Value to store - * - * REMARKS: - * Writes a word value to emulator memory. - */ -static void -wrw(struct x86emu *emu, uint32_t addr, uint16_t val) -{ - if (addr > emu->mem_size - 2) - x86emu_halt_sys(emu); -#ifdef __STRICT_ALIGNMENT - if (addr & 1) { - u_int8_t *a = emu->mem_base + addr; - - *((a + 0)) = (val >> 0) & 0xff; - *((a + 1)) = (val >> 8) & 0xff; - } else - *((u_int16_t *)(emu->mem_base + addr)) = htole16(val); -#else - *((u_int16_t *)(emu->mem_base + addr)) = htole16(val); -#endif -} - -/* - * PARAMETERS: - * addr - Emulator memory address to read - * val - Value to store - * - * REMARKS: - * Writes a long value to emulator memory. - */ -static void -wrl(struct x86emu *emu, uint32_t addr, uint32_t val) -{ - if (addr > emu->mem_size - 4) - x86emu_halt_sys(emu); -#ifdef __STRICT_ALIGNMENT - if (addr & 3) { - u_int8_t *a = emu->mem_base + addr; - - *((a + 0) = (val >> 0) & 0xff; - *((a + 1) = (val >> 8) & 0xff; - *((a + 2) = (val >> 16) & 0xff; - *((a + 3) = (val >> 24) & 0xff; - } else - *((u_int32_t *)(emu->mem_base + addr)) = htole32(val); -#else - *((u_int32_t *)(emu->mem_base + addr)) = htole32(val); -#endif -} - -/* Setup */ - -void -x86emu_init_default(struct x86emu *emu) -{ - int i; - - emu->emu_rdb = rdb; - emu->emu_rdw = rdw; - emu->emu_rdl = rdl; - emu->emu_wrb = wrb; - emu->emu_wrw = wrw; - emu->emu_wrl = wrl; - - for (i = 0; i < 256; i++) - emu->_x86emu_intrTab[i] = NULL; -} diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c index 1e3401601d8d..73de0c502405 100644 --- a/sys/ddb/db_command.c +++ b/sys/ddb/db_command.c @@ -652,7 +652,7 @@ db_kill(dummy1, dummy2, dummy3, dummy4) if (PROC_TRYLOCK(p) == 0) DB_ERROR(("Can't lock process with pid %ld\n", (long) pid)); else { - psignal(p, sig); + pksignal(p, sig, NULL); PROC_UNLOCK(p); } diff --git a/sys/ddb/db_ps.c b/sys/ddb/db_ps.c index 3f772865a5b6..2261721471de 100644 --- a/sys/ddb/db_ps.c +++ b/sys/ddb/db_ps.c @@ -136,7 +136,7 @@ db_ps(db_expr_t addr, boolean_t hasaddr, db_expr_t count, char *modif) if (TD_ON_LOCK(td)) lflag++; if (TD_IS_SLEEPING(td)) { - if (!td->td_flags & TDF_SINTR) + if (!(td->td_flags & TDF_SINTR)) dflag++; else sflag++; @@ -171,7 +171,7 @@ db_ps(db_expr_t addr, boolean_t hasaddr, db_expr_t count, char *modif) state[1] = '\0'; /* Additional process state flags. */ - if (!p->p_flag & P_INMEM) + if (!(p->p_flag & P_INMEM)) strlcat(state, "W", sizeof(state)); if (p->p_flag & P_TRACED) strlcat(state, "X", sizeof(state)); @@ -189,13 +189,19 @@ db_ps(db_expr_t addr, boolean_t hasaddr, db_expr_t count, char *modif) if (cred != NULL && jailed(cred)) strlcat(state, "J", sizeof(state)); db_printf(" %-6.6s ", state); - if (p->p_flag & P_HADTHREADS) + if (p->p_flag & P_HADTHREADS) { #ifdef __LP64__ - db_printf(" (threaded) %s\n", - p->p_comm); + db_printf(" (threaded) "); #else - db_printf(" (threaded) %s\n", p->p_comm); + db_printf(" (threaded) "); #endif + if (p->p_flag & P_SYSTEM) + db_printf("["); + db_printf("%s", p->p_comm); + if (p->p_flag & P_SYSTEM) + db_printf("]"); + db_printf("\n"); + } FOREACH_THREAD_IN_PROC(p, td) { dumpthread(p, td, p->p_flag & P_HADTHREADS); if (db_pager_quit) diff --git a/sys/ddb/db_thread.c b/sys/ddb/db_thread.c index e127eeae1b07..bf59f680b668 100644 --- a/sys/ddb/db_thread.c +++ b/sys/ddb/db_thread.c @@ -48,7 +48,7 @@ db_print_thread(void) pid = -1; if (kdb_thread->td_proc != NULL) pid = kdb_thread->td_proc->p_pid; - db_printf("[thread pid %d tid %ld ]\n", pid, (long)kdb_thread->td_tid); + db_printf("[ thread pid %d tid %ld ]\n", pid, (long)kdb_thread->td_tid); } void diff --git a/sys/dev/aac/aac.c b/sys/dev/aac/aac.c index 5c3180b8395c..363972ddea1b 100644 --- a/sys/dev/aac/aac.c +++ b/sys/dev/aac/aac.c @@ -33,7 +33,6 @@ __FBSDID("$FreeBSD$"); /* * Driver for the Adaptec 'FSA' family of PCI/SCSI RAID adapters. */ -#define AAC_DRIVER_VERSION 0x02000000 #define AAC_DRIVERNAME "aac" #include "opt_aac.h" @@ -107,28 +106,6 @@ static int aac_dequeue_fib(struct aac_softc *sc, int queue, static int aac_enqueue_response(struct aac_softc *sc, int queue, struct aac_fib *fib); -/* Falcon/PPC interface */ -static int aac_fa_get_fwstatus(struct aac_softc *sc); -static void aac_fa_qnotify(struct aac_softc *sc, int qbit); -static int aac_fa_get_istatus(struct aac_softc *sc); -static void aac_fa_clear_istatus(struct aac_softc *sc, int mask); -static void aac_fa_set_mailbox(struct aac_softc *sc, u_int32_t command, - u_int32_t arg0, u_int32_t arg1, - u_int32_t arg2, u_int32_t arg3); -static int aac_fa_get_mailbox(struct aac_softc *sc, int mb); -static void aac_fa_set_interrupts(struct aac_softc *sc, int enable); - -struct aac_interface aac_fa_interface = { - aac_fa_get_fwstatus, - aac_fa_qnotify, - aac_fa_get_istatus, - aac_fa_clear_istatus, - aac_fa_set_mailbox, - aac_fa_get_mailbox, - aac_fa_set_interrupts, - NULL, NULL, NULL -}; - /* StrongARM interface */ static int aac_sa_get_fwstatus(struct aac_softc *sc); static void aac_sa_qnotify(struct aac_softc *sc, int qbit); @@ -229,7 +206,7 @@ static int aac_query_disk(struct aac_softc *sc, caddr_t uptr); static int aac_get_pci_info(struct aac_softc *sc, caddr_t uptr); static int aac_supported_features(struct aac_softc *sc, caddr_t uptr); static void aac_ioctl_event(struct aac_softc *sc, - struct aac_event *event, void *arg); + struct aac_event *event, void *arg); static struct aac_mntinforesp * aac_get_container_info(struct aac_softc *sc, struct aac_fib *fib, int cid); @@ -354,7 +331,7 @@ aac_attach(struct aac_softc *sc) } mtx_lock(&sc->aac_io_lock); - callout_reset(&sc->aac_daemontime, 30 * 60 * hz, aac_daemon, sc); + callout_reset(&sc->aac_daemontime, 60 * hz, aac_daemon, sc); mtx_unlock(&sc->aac_io_lock); return(0); @@ -553,7 +530,7 @@ aac_alloc(struct aac_softc *sc) 0, /* flags */ NULL, NULL, /* No locking needed */ &sc->aac_fib_dmat)) { - device_printf(sc->aac_dev, "can't allocate FIB DMA tag\n");; + device_printf(sc->aac_dev, "can't allocate FIB DMA tag\n"); return (ENOMEM); } @@ -604,7 +581,7 @@ aac_alloc(struct aac_softc *sc) TAILQ_INIT(&sc->aac_fibmap_tqh); sc->aac_commands = malloc(sc->aac_max_fibs * sizeof(struct aac_command), M_AACBUF, M_WAITOK|M_ZERO); - while (sc->total_fibs < AAC_PREALLOCATE_FIBS) { + while (sc->total_fibs < sc->aac_max_fibs) { if (aac_alloc_commands(sc) != 0) break; } @@ -909,8 +886,11 @@ aac_new_intr(void *arg) mtx_unlock(&sc->aac_io_lock); } +/* + * Interrupt filter for !NEW_COMM interface. + */ int -aac_fast_intr(void *arg) +aac_filter(void *arg) { struct aac_softc *sc; u_int16_t reason; @@ -1215,7 +1195,6 @@ aac_bio_command(struct aac_softc *sc, struct aac_command **cmp) cm->cm_complete = aac_bio_complete; cm->cm_private = bp; cm->cm_timestamp = time_uptime; - cm->cm_queue = AAC_ADAP_NORM_CMD_QUEUE; /* build the FIB */ fib = cm->cm_fib; @@ -1370,7 +1349,6 @@ aac_wait_command(struct aac_command *cm) fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); /* Put the command on the ready queue and get things going */ - cm->cm_queue = AAC_ADAP_NORM_CMD_QUEUE; aac_enqueue_ready(cm); aac_startio(sc); error = msleep(cm, &sc->aac_io_lock, PRIBIO, "aacwait", 0); @@ -1420,6 +1398,7 @@ aac_release_command(struct aac_command *cm) cm->cm_flags = 0; cm->cm_complete = NULL; cm->cm_private = NULL; + cm->cm_queue = AAC_ADAP_NORM_CMD_QUEUE; cm->cm_fib->Header.XferState = AAC_FIBSTATE_EMPTY; cm->cm_fib->Header.StructType = AAC_FIBTYPE_TFIB; cm->cm_fib->Header.Flags = 0; @@ -2032,18 +2011,11 @@ aac_setup_intr(struct aac_softc *sc) } } else { if (bus_setup_intr(sc->aac_dev, sc->aac_irq, - INTR_TYPE_BIO, aac_fast_intr, NULL, + INTR_TYPE_BIO, aac_filter, NULL, sc, &sc->aac_intr)) { device_printf(sc->aac_dev, - "can't set up FAST interrupt\n"); - if (bus_setup_intr(sc->aac_dev, sc->aac_irq, - INTR_MPSAFE|INTR_TYPE_BIO, - NULL, (driver_intr_t *)aac_fast_intr, - sc, &sc->aac_intr)) { - device_printf(sc->aac_dev, - "can't set up MPSAFE interrupt\n"); - return (EINVAL); - } + "can't set up interrupt filter\n"); + return (EINVAL); } } return (0); @@ -2379,8 +2351,9 @@ aac_timeout(struct aac_softc *sc) /* && !(cm->cm_flags & AAC_CMD_TIMEDOUT) */) { cm->cm_flags |= AAC_CMD_TIMEDOUT; device_printf(sc->aac_dev, - "COMMAND %p TIMEOUT AFTER %d SECONDS\n", - cm, (int)(time_uptime-cm->cm_timestamp)); + "COMMAND %p (TYPE %d) TIMEOUT AFTER %d SECONDS\n", + cm, cm->cm_fib->Header.Command, + (int)(time_uptime-cm->cm_timestamp)); AAC_PRINT_FIB(sc, cm->cm_fib); timedout++; } @@ -2420,17 +2393,6 @@ aac_rx_get_fwstatus(struct aac_softc *sc) AAC_RX_OMR0 : AAC_RX_FWSTATUS)); } -static int -aac_fa_get_fwstatus(struct aac_softc *sc) -{ - int val; - - fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); - - val = AAC_MEM0_GETREG4(sc, AAC_FA_FWSTATUS); - return (val); -} - static int aac_rkt_get_fwstatus(struct aac_softc *sc) { @@ -2460,15 +2422,6 @@ aac_rx_qnotify(struct aac_softc *sc, int qbit) AAC_MEM0_SETREG4(sc, AAC_RX_IDBR, qbit); } -static void -aac_fa_qnotify(struct aac_softc *sc, int qbit) -{ - fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); - - AAC_MEM0_SETREG2(sc, AAC_FA_DOORBELL1, qbit); - AAC_FA_HACK(sc); -} - static void aac_rkt_qnotify(struct aac_softc *sc, int qbit) { @@ -2496,17 +2449,6 @@ aac_rx_get_istatus(struct aac_softc *sc) return(AAC_MEM0_GETREG4(sc, AAC_RX_ODBR)); } -static int -aac_fa_get_istatus(struct aac_softc *sc) -{ - int val; - - fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); - - val = AAC_MEM0_GETREG2(sc, AAC_FA_DOORBELL0); - return (val); -} - static int aac_rkt_get_istatus(struct aac_softc *sc) { @@ -2534,15 +2476,6 @@ aac_rx_clear_istatus(struct aac_softc *sc, int mask) AAC_MEM0_SETREG4(sc, AAC_RX_ODBR, mask); } -static void -aac_fa_clear_istatus(struct aac_softc *sc, int mask) -{ - fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); - - AAC_MEM0_SETREG2(sc, AAC_FA_DOORBELL0_CLEAR, mask); - AAC_FA_HACK(sc); -} - static void aac_rkt_clear_istatus(struct aac_softc *sc, int mask) { @@ -2580,24 +2513,6 @@ aac_rx_set_mailbox(struct aac_softc *sc, u_int32_t command, AAC_MEM1_SETREG4(sc, AAC_RX_MAILBOX + 16, arg3); } -static void -aac_fa_set_mailbox(struct aac_softc *sc, u_int32_t command, - u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3) -{ - fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); - - AAC_MEM1_SETREG4(sc, AAC_FA_MAILBOX, command); - AAC_FA_HACK(sc); - AAC_MEM1_SETREG4(sc, AAC_FA_MAILBOX + 4, arg0); - AAC_FA_HACK(sc); - AAC_MEM1_SETREG4(sc, AAC_FA_MAILBOX + 8, arg1); - AAC_FA_HACK(sc); - AAC_MEM1_SETREG4(sc, AAC_FA_MAILBOX + 12, arg2); - AAC_FA_HACK(sc); - AAC_MEM1_SETREG4(sc, AAC_FA_MAILBOX + 16, arg3); - AAC_FA_HACK(sc); -} - static void aac_rkt_set_mailbox(struct aac_softc *sc, u_int32_t command, u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3) @@ -2630,17 +2545,6 @@ aac_rx_get_mailbox(struct aac_softc *sc, int mb) return(AAC_MEM1_GETREG4(sc, AAC_RX_MAILBOX + (mb * 4))); } -static int -aac_fa_get_mailbox(struct aac_softc *sc, int mb) -{ - int val; - - fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, ""); - - val = AAC_MEM1_GETREG4(sc, AAC_FA_MAILBOX + (mb * 4)); - return (val); -} - static int aac_rkt_get_mailbox(struct aac_softc *sc, int mb) { @@ -2679,20 +2583,6 @@ aac_rx_set_interrupts(struct aac_softc *sc, int enable) } } -static void -aac_fa_set_interrupts(struct aac_softc *sc, int enable) -{ - fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "%sable interrupts", enable ? "en" : "dis"); - - if (enable) { - AAC_MEM0_SETREG2((sc), AAC_FA_MASK0_CLEAR, AAC_DB_INTERRUPTS); - AAC_FA_HACK(sc); - } else { - AAC_MEM0_SETREG2((sc), AAC_FA_MASK0, ~0); - AAC_FA_HACK(sc); - } -} - static void aac_rkt_set_interrupts(struct aac_softc *sc, int enable) { @@ -2876,10 +2766,8 @@ aac_describe_controller(struct aac_softc *sc) } device_printf(sc->aac_dev, "%s, aac driver %d.%d.%d-%d\n", adapter_type, - AAC_DRIVER_VERSION >> 24, - (AAC_DRIVER_VERSION >> 16) & 0xFF, - AAC_DRIVER_VERSION & 0xFF, - AAC_DRIVER_BUILD); + AAC_DRIVER_MAJOR_VERSION, AAC_DRIVER_MINOR_VERSION, + AAC_DRIVER_BUGFIX_LEVEL, AAC_DRIVER_BUILD); aac_release_sync_fib(sc); mtx_unlock(&sc->aac_io_lock); @@ -3364,10 +3252,16 @@ aac_rev_check(struct aac_softc *sc, caddr_t udata) * Doctor up the response struct. */ rev_check_resp.possiblyCompatible = 1; - rev_check_resp.adapterSWRevision.external.ul = - sc->aac_revision.external.ul; + rev_check_resp.adapterSWRevision.external.comp.major = + AAC_DRIVER_MAJOR_VERSION; + rev_check_resp.adapterSWRevision.external.comp.minor = + AAC_DRIVER_MINOR_VERSION; + rev_check_resp.adapterSWRevision.external.comp.type = + AAC_DRIVER_TYPE; + rev_check_resp.adapterSWRevision.external.comp.dash = + AAC_DRIVER_BUGFIX_LEVEL; rev_check_resp.adapterSWRevision.buildNumber = - sc->aac_revision.buildNumber; + AAC_DRIVER_BUILD; return(copyout((caddr_t)&rev_check_resp, udata, sizeof(struct aac_rev_check_resp))); @@ -3618,7 +3512,7 @@ aac_query_disk(struct aac_softc *sc, caddr_t uptr) query_disk.Lun = 0; query_disk.UnMapped = 0; sprintf(&query_disk.diskDeviceName[0], "%s%d", - disk->ad_disk->d_name, disk->ad_disk->d_unit); + disk->ad_disk->d_name, disk->ad_disk->d_unit); } mtx_unlock(&sc->aac_container_lock); diff --git a/sys/dev/aac/aac_cam.c b/sys/dev/aac/aac_cam.c index e38b0ab410be..c1164aa2d3f9 100644 --- a/sys/dev/aac/aac_cam.c +++ b/sys/dev/aac/aac_cam.c @@ -211,7 +211,7 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) { struct aac_cam *camsc; struct aac_softc *sc; - struct aac_srb32 *srb; + struct aac_srb *srb; struct aac_fib *fib; struct aac_command *cm; @@ -260,8 +260,11 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) cpi->hba_inquiry = PI_WIDE_16; cpi->target_sprt = 0; - /* Resetting via the passthrough causes problems. */ - cpi->hba_misc = PIM_NOBUSRESET; + /* + * Resetting via the passthrough or parallel bus scan + * causes problems. + */ + cpi->hba_misc = PIM_NOBUSRESET | PIM_SEQSCAN; cpi->hba_eng_cnt = 0; cpi->max_target = camsc->inf->TargetsPerBus; cpi->max_lun = 8; /* Per the controller spec */ @@ -272,10 +275,10 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) strncpy(cpi->hba_vid, "Adaptec", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); cpi->unit_number = cam_sim_unit(sim); - cpi->transport = XPORT_SPI; - cpi->transport_version = 2; - cpi->protocol = PROTO_SCSI; - cpi->protocol_version = SCSI_REV_2; + cpi->transport = XPORT_SPI; + cpi->transport_version = 2; + cpi->protocol = PROTO_SCSI; + cpi->protocol_version = SCSI_REV_2; ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); return; @@ -351,7 +354,7 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) } fib = cm->cm_fib; - srb = (struct aac_srb32 *)&fib->data[0]; + srb = (struct aac_srb *)&fib->data[0]; cm->cm_datalen = 0; switch (ccb->ccb_h.flags & CAM_DIR_MASK) { @@ -402,10 +405,10 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) if (ccb->ccb_h.flags & CAM_DATA_PHYS) { /* Send a 32bit command */ fib->Header.Command = ScsiPortCommand; - srb->sg_map32.SgCount = 1; - srb->sg_map32.SgEntry[0].SgAddress = + srb->sg_map.SgCount = 1; + srb->sg_map.SgEntry[0].SgAddress = (uint32_t)(uintptr_t)csio->data_ptr; - srb->sg_map32.SgEntry[0].SgByteCount = + srb->sg_map.SgEntry[0].SgByteCount = csio->dxfer_len; } else { /* @@ -414,15 +417,15 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) */ cm->cm_data = (void *)csio->data_ptr; cm->cm_datalen = csio->dxfer_len; - cm->cm_sgtable = &srb->sg_map32; + cm->cm_sgtable = &srb->sg_map; } } else { /* XXX Need to handle multiple s/g elements */ panic("aac_cam: multiple s/g elements"); } } else { - srb->sg_map32.SgCount = 0; - srb->sg_map32.SgEntry[0].SgByteCount = 0; + srb->sg_map.SgCount = 0; + srb->sg_map.SgEntry[0].SgByteCount = 0; srb->data_len = 0; } @@ -450,7 +453,6 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) cm->cm_complete = aac_cam_complete; cm->cm_private = ccb; cm->cm_timestamp = time_uptime; - cm->cm_queue = AAC_ADAP_NORM_CMD_QUEUE; fib->Header.XferState = AAC_FIBSTATE_HOSTOWNED | @@ -459,7 +461,7 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) AAC_FIBSTATE_REXPECTED | AAC_FIBSTATE_NORM; fib->Header.Size = sizeof(struct aac_fib_header) + - sizeof(struct aac_srb32); + sizeof(struct aac_srb); aac_enqueue_ready(cm); aac_startio(cm->cm_sc); diff --git a/sys/dev/aac/aac_pci.c b/sys/dev/aac/aac_pci.c index 17731a8032c2..bc993791f8ba 100644 --- a/sys/dev/aac/aac_pci.c +++ b/sys/dev/aac/aac_pci.c @@ -435,10 +435,6 @@ aac_pci_attach(device_t dev) fwprintf(sc, HBA_FLAGS_DBG_INIT_B, "set hardware up for StrongARM"); sc->aac_if = aac_sa_interface; break; - case AAC_HWIF_FALCON: - fwprintf(sc, HBA_FLAGS_DBG_INIT_B, "set hardware up for Falcon/PPC"); - sc->aac_if = aac_fa_interface; - break; case AAC_HWIF_RKT: fwprintf(sc, HBA_FLAGS_DBG_INIT_B, "set hardware up for Rocket/MIPS"); sc->aac_if = aac_rkt_interface; diff --git a/sys/dev/aac/aacreg.h b/sys/dev/aac/aacreg.h index db96ff206d94..5c849664a476 100644 --- a/sys/dev/aac/aacreg.h +++ b/sys/dev/aac/aacreg.h @@ -1363,7 +1363,7 @@ struct aac_close_command { /* * SCSI Passthrough structures */ -struct aac_srb32 { +struct aac_srb { u_int32_t function; u_int32_t bus; u_int32_t target; @@ -1374,7 +1374,7 @@ struct aac_srb32 { u_int32_t retry_limit; u_int32_t cdb_len; u_int8_t cdb[16]; - struct aac_sg_table sg_map32; + struct aac_sg_table sg_map; }; enum { @@ -1452,24 +1452,6 @@ enum { AAC_SRB_STS_ERROR_RECOVERY }; -/* - * Register set for adapters based on the Falcon bridge and PPC core - */ - -#define AAC_FA_DOORBELL0_CLEAR 0x00 -#define AAC_FA_DOORBELL1_CLEAR 0x02 -#define AAC_FA_DOORBELL0 0x04 -#define AAC_FA_DOORBELL1 0x06 -#define AAC_FA_MASK0_CLEAR 0x08 -#define AAC_FA_MASK1_CLEAR 0x0a -#define AAC_FA_MASK0 0x0c -#define AAC_FA_MASK1 0x0e -#define AAC_FA_MAILBOX 0x10 -#define AAC_FA_FWSTATUS 0x2c /* Mailbox 7 */ -#define AAC_FA_INTSRC 0x900 - -#define AAC_FA_HACK(sc) (void)AAC_MEM0_GETREG4(sc, AAC_FA_INTSRC) - /* * Register definitions for the Adaptec AAC-364 'Jalapeno I/II' adapters, based * on the SA110 'StrongArm'. diff --git a/sys/dev/aac/aacvar.h b/sys/dev/aac/aacvar.h index 7f64371ef86c..3ecb262ca7eb 100644 --- a/sys/dev/aac/aacvar.h +++ b/sys/dev/aac/aacvar.h @@ -37,6 +37,16 @@ #include #include +#define AAC_TYPE_DEVO 1 +#define AAC_TYPE_ALPHA 2 +#define AAC_TYPE_BETA 3 +#define AAC_TYPE_RELEASE 4 + +#define AAC_DRIVER_MAJOR_VERSION 2 +#define AAC_DRIVER_MINOR_VERSION 1 +#define AAC_DRIVER_BUGFIX_LEVEL 9 +#define AAC_DRIVER_TYPE AAC_TYPE_RELEASE + #ifndef AAC_DRIVER_BUILD # define AAC_DRIVER_BUILD 1 #endif @@ -56,13 +66,6 @@ */ #define AAC_ADAPTER_FIBS 8 -/* - * FIBs are allocated in page-size chunks and can grow up to the 512 - * limit imposed by the hardware. - */ -#define AAC_PREALLOCATE_FIBS 128 -#define AAC_NUM_MGT_FIB 8 - /* * The controller reports status events in AIFs. We hang on to a number of * these in order to pass them out to user-space management tools. @@ -326,7 +329,6 @@ struct aac_softc int aac_hwif; #define AAC_HWIF_I960RX 0 #define AAC_HWIF_STRONGARM 1 -#define AAC_HWIF_FALCON 2 #define AAC_HWIF_RKT 3 #define AAC_HWIF_NARK 4 #define AAC_HWIF_UNKNOWN -1 @@ -448,7 +450,7 @@ extern int aac_shutdown(device_t dev); extern int aac_suspend(device_t dev); extern int aac_resume(device_t dev); extern void aac_new_intr(void *arg); -extern int aac_fast_intr(void *arg); +extern int aac_filter(void *arg); extern void aac_submit_bio(struct bio *bp); extern void aac_biodone(struct bio *bp); extern void aac_startio(struct aac_softc *sc); diff --git a/sys/dev/acpi_support/acpi_aiboost.c b/sys/dev/acpi_support/acpi_aiboost.c index a8fe9cc4a45e..ab7433b54481 100644 --- a/sys/dev/acpi_support/acpi_aiboost.c +++ b/sys/dev/acpi_support/acpi_aiboost.c @@ -41,23 +41,25 @@ __FBSDID("$FreeBSD$"); #include #include -#define _COMPONENT ACPI_OEM +#define _COMPONENT ACPI_OEM ACPI_MODULE_NAME("AIBOOST") -#define DESCSTRLEN 32 -struct acpi_aiboost_element{ +#define DESCSTRLEN 32 + +struct acpi_aiboost_element { uint32_t id; - char desc[DESCSTRLEN]; + char desc[DESCSTRLEN]; }; + ACPI_SERIAL_DECL(aiboost, "ACPI AIBOOST"); -/**/ -struct acpi_aiboost_component{ - unsigned int num; - struct acpi_aiboost_element elem[1]; + +struct acpi_aiboost_component { + u_int num; + struct acpi_aiboost_element elem[0]; }; struct acpi_aiboost_softc { - int pid; + int pid; struct acpi_aiboost_component *temp; struct acpi_aiboost_component *volt; struct acpi_aiboost_component *fan; @@ -65,7 +67,7 @@ struct acpi_aiboost_softc { static int acpi_aiboost_probe(device_t dev); static int acpi_aiboost_attach(device_t dev); -static int acpi_aiboost_detach(device_t dev); +static int acpi_aiboost_detach(device_t dev); static device_method_t acpi_aiboost_methods[] = { /* Device interface */ @@ -85,46 +87,56 @@ static driver_t acpi_aiboost_driver = { static devclass_t acpi_aiboost_devclass; DRIVER_MODULE(acpi_aiboost, acpi, acpi_aiboost_driver, acpi_aiboost_devclass, - 0, 0); + 0, 0); MODULE_DEPEND(acpi_aiboost, acpi, 1, 1, 1); + static char *abs_id[] = {"ATK0110", NULL}; -/*VSIF, RVLT, SVLT, TSIF, RTMP, STMP FSIF, RFAN, SFAN */ +/* VSIF, RVLT, SVLT, TSIF, RTMP, STMP, FSIF, RFAN, SFAN */ -static ACPI_STATUS acpi_aiboost_getcomponent(device_t dev, char *name, struct acpi_aiboost_component **comp) +static ACPI_STATUS +acpi_aiboost_getcomponent(device_t dev, char *name, + struct acpi_aiboost_component **comp) { - ACPI_BUFFER buf, buf2; - ACPI_OBJECT *o,*elem,*subobj; + ACPI_BUFFER buf, buf2; + ACPI_OBJECT *elem, *o, *subobj; ACPI_STATUS status; - struct acpi_aiboost_component *c = NULL; - + struct acpi_aiboost_component *c; int i; + c = NULL; buf.Pointer = NULL; buf.Length = ACPI_ALLOCATE_BUFFER; buf2.Pointer = NULL; - status = AcpiEvaluateObject(acpi_get_handle(dev), name, NULL, &buf); - - if(ACPI_FAILURE(status)) - return status; - - o = buf.Pointer; - if(o->Type != ACPI_TYPE_PACKAGE) - goto error; - - elem = o->Package.Elements; - if(elem->Type != ACPI_TYPE_INTEGER) - goto error; - c = malloc(sizeof(struct acpi_aiboost_component) - + sizeof(struct acpi_aiboost_element) - * (elem->Integer.Value -1), - M_DEVBUF, M_ZERO|M_WAITOK); + if (ACPI_FAILURE(status)) + return (status); + + o = buf.Pointer; + if (o->Type != ACPI_TYPE_PACKAGE) { + device_printf(dev, "%s is not a package\n", name); + goto error; + } + + elem = o->Package.Elements; + if (elem->Type != ACPI_TYPE_INTEGER) { + device_printf(dev, "First item in %s is not a count\n", name); + goto error; + } + + if (elem->Integer.Value != o->Package.Count - 1) { + device_printf(dev, "Device count mismatch in %s\n", name); + goto error; + } + + c = malloc(sizeof(struct acpi_aiboost_component) + + sizeof(struct acpi_aiboost_element) * elem->Integer.Value, M_DEVBUF, + M_WAITOK | M_ZERO); *comp = c; c->num = elem->Integer.Value; - - for(i = 1 ; i < o->Package.Count; i++){ + + for (i = 1; i < o->Package.Count; i++) { elem = &o->Package.Elements[i]; if (elem->Type == ACPI_TYPE_ANY) { buf2.Pointer = NULL; @@ -132,196 +144,195 @@ static ACPI_STATUS acpi_aiboost_getcomponent(device_t dev, char *name, struct a status = AcpiEvaluateObject(elem->Reference.Handle, NULL, NULL, &buf2); - if (ACPI_FAILURE(status)){ - printf("FETCH OBJECT\n"); + if (ACPI_FAILURE(status)) { + device_printf(dev, + "Failed to fetch object for %s\n", name); goto error; } subobj = buf2.Pointer; } else if (elem->Type == ACPI_TYPE_PACKAGE) subobj = elem; else { - printf("NO PACKAGE\n"); + device_printf(dev, + "Subitem %d was not a package for %s\n", i, name); goto error; } - if(ACPI_FAILURE(acpi_PkgInt32(subobj,0, &c->elem[i -1].id))){ - printf("ID FAILED\n"); + status = acpi_PkgInt32(subobj, 0, &c->elem[i - 1].id); + if (ACPI_FAILURE(status)) { + device_printf(dev, + "Failed to fetch ID for subobject %d in %s\n", i, + name); goto error; } - status = acpi_PkgStr(subobj, 1, c->elem[i - 1].desc, - sizeof(c->elem[i - 1].desc)); - if(ACPI_FAILURE(status)){ - if(status == E2BIG){ + status = acpi_PkgStr(subobj, 1, c->elem[i - 1].desc, + sizeof(c->elem[i - 1].desc)); + if (ACPI_FAILURE(status)){ + if (status == E2BIG) { c->elem[i - 1].desc[DESCSTRLEN-1] = 0; - }else{ - printf("DESC FAILED %d\n", i-1); + } else { + device_printf(dev, + "Failed to fetch description for subobject %d in %s\n", + i, name); goto error; } } - + if (buf2.Pointer) { AcpiOsFree(buf2.Pointer); buf2.Pointer = NULL; } } - if(buf.Pointer) + if (buf.Pointer) AcpiOsFree(buf.Pointer); - return 0; + return (0); - error: - printf("BAD DATA\n"); - if(buf.Pointer) +error: + if (buf.Pointer) AcpiOsFree(buf.Pointer); - if(buf2.Pointer) + if (buf2.Pointer) AcpiOsFree(buf2.Pointer); - if(c) + if (c) free(c, M_DEVBUF); - return AE_BAD_DATA; + return (AE_BAD_DATA); } -static int +static int acpi_aiboost_get_value(ACPI_HANDLE handle, char *path, UINT32 number) { ACPI_OBJECT arg1, *ret; ACPI_OBJECT_LIST args; ACPI_BUFFER buf; - buf.Length = ACPI_ALLOCATE_BUFFER; - buf.Pointer = 0; int val; arg1.Type = ACPI_TYPE_INTEGER; arg1.Integer.Value = number; args.Count = 1; args.Pointer = &arg1; - - if(ACPI_FAILURE(AcpiEvaluateObject(handle, path, &args, &buf))){ - return -1; - } + buf.Length = ACPI_ALLOCATE_BUFFER; + buf.Pointer = NULL; + if (ACPI_FAILURE(AcpiEvaluateObject(handle, path, &args, &buf))) + return (-1); ret = buf.Pointer; - val = (ret->Type == ACPI_TYPE_INTEGER)? ret->Integer.Value : -1; + if (ret->Type == ACPI_TYPE_INTEGER) + val = ret->Integer.Value; + else + val = -1; AcpiOsFree(buf.Pointer); - return val; + return (val); } -static int acpi_aiboost_temp_sysctl(SYSCTL_HANDLER_ARGS) +static int +acpi_aiboost_temp_sysctl(SYSCTL_HANDLER_ARGS) { - device_t dev = arg1; - int function = oidp->oid_arg2; - int error = 0, val; + device_t dev; + int error, val; + + dev = arg1; ACPI_SERIAL_BEGIN(aiboost); - val = acpi_aiboost_get_value(acpi_get_handle(dev), "RTMP",function ); - error = sysctl_handle_int(oidp, &val, 0 , req); + val = acpi_aiboost_get_value(acpi_get_handle(dev), "RTMP", arg2); + error = sysctl_handle_int(oidp, &val, 0, req); ACPI_SERIAL_END(aiboost); - - return 0; + return (error); } -static int acpi_aiboost_volt_sysctl(SYSCTL_HANDLER_ARGS) +static int +acpi_aiboost_volt_sysctl(SYSCTL_HANDLER_ARGS) { - device_t dev = arg1; - int function = oidp->oid_arg2; - int error = 0, val; + device_t dev; + int error, val; + + dev = arg1; ACPI_SERIAL_BEGIN(aiboost); - val = acpi_aiboost_get_value(acpi_get_handle(dev), "RVLT", function); - error = sysctl_handle_int(oidp, &val, 0 , req); + val = acpi_aiboost_get_value(acpi_get_handle(dev), "RVLT", arg2); + error = sysctl_handle_int(oidp, &val, 0, req); ACPI_SERIAL_END(aiboost); - - return 0; + return (error); } -static int acpi_aiboost_fan_sysctl(SYSCTL_HANDLER_ARGS) +static int +acpi_aiboost_fan_sysctl(SYSCTL_HANDLER_ARGS) { - device_t dev = arg1; - int function = oidp->oid_arg2; - int error = 0, val; + device_t dev; + int error, val; + + dev = arg1; ACPI_SERIAL_BEGIN(aiboost); - val = acpi_aiboost_get_value(acpi_get_handle(dev), "RFAN", function); - error = sysctl_handle_int(oidp, &val, 0 , req); + val = acpi_aiboost_get_value(acpi_get_handle(dev), "RFAN", arg2); + error = sysctl_handle_int(oidp, &val, 0, req); ACPI_SERIAL_END(aiboost); - - return 0; + return (error); } static int acpi_aiboost_probe(device_t dev) { - int ret = ENXIO; - if (ACPI_ID_PROBE(device_get_parent(dev), dev, abs_id)) { - device_set_desc(dev, "ASUStek AIBOOSTER"); - ret = 0; - } - return (ret); + if (ACPI_ID_PROBE(device_get_parent(dev), dev, abs_id) == NULL) + return (ENXIO); + + device_set_desc(dev, "ASUStek AIBOOSTER"); + return (0); } static int acpi_aiboost_attach(device_t dev) { struct acpi_aiboost_softc *sc; - char nambuf[]="tempXXX"; + char nambuf[16]; int i; sc = device_get_softc(dev); - if(ACPI_FAILURE(acpi_aiboost_getcomponent(dev, "TSIF", &sc->temp))) + if (ACPI_FAILURE(acpi_aiboost_getcomponent(dev, "TSIF", &sc->temp))) goto error; - for(i= 0; i < sc->temp->num; i++){ - sprintf(nambuf,"temp%d", i); + for (i = 0; i < sc->temp->num; i++) { + snprintf(nambuf, sizeof(nambuf), "temp%d", i); SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), - OID_AUTO, nambuf, - CTLTYPE_INT|CTLFLAG_RD, dev, - sc->temp->elem[i].id, - acpi_aiboost_temp_sysctl, - "I", sc->temp->elem[i].desc); - } - if(ACPI_FAILURE(acpi_aiboost_getcomponent(dev, "VSIF", &sc->volt))) - goto error; - - for(i= 0; i < sc->volt->num; i++){ - sprintf(nambuf,"volt%d", i); - SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), - OID_AUTO, nambuf, - CTLTYPE_INT|CTLFLAG_RD, dev, - sc->volt->elem[i].id, - acpi_aiboost_volt_sysctl, - "I", sc->volt->elem[i].desc); + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + nambuf, CTLTYPE_INT | CTLFLAG_RD, dev, sc->temp->elem[i].id, + acpi_aiboost_temp_sysctl, "I", sc->temp->elem[i].desc); } - if(ACPI_FAILURE(acpi_aiboost_getcomponent(dev, "FSIF", &sc->fan))) + if (ACPI_FAILURE(acpi_aiboost_getcomponent(dev, "VSIF", &sc->volt))) goto error; - - for(i= 0; i < sc->fan->num; i++){ - sprintf(nambuf,"fan%d", i); + for (i = 0; i < sc->volt->num; i++) { + snprintf(nambuf, sizeof(nambuf), "volt%d", i); SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), - OID_AUTO, nambuf, - CTLTYPE_INT|CTLFLAG_RD, dev, - sc->fan->elem[i].id, - acpi_aiboost_fan_sysctl, - "I", sc->fan->elem[i].desc); + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + nambuf, CTLTYPE_INT | CTLFLAG_RD, dev, sc->volt->elem[i].id, + acpi_aiboost_volt_sysctl, "I", sc->volt->elem[i].desc); + } + + if (ACPI_FAILURE(acpi_aiboost_getcomponent(dev, "FSIF", &sc->fan))) + goto error; + for (i = 0; i < sc->fan->num; i++) { + snprintf(nambuf, sizeof(nambuf), "fan%d", i); + SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + nambuf, CTLTYPE_INT | CTLFLAG_RD, dev, sc->fan->elem[i].id, + acpi_aiboost_fan_sysctl, "I", sc->fan->elem[i].desc); } - return (0); error: - return EINVAL; + return (EINVAL); } -static int +static int acpi_aiboost_detach(device_t dev) { - struct acpi_aiboost_softc *sc = device_get_softc(dev); + struct acpi_aiboost_softc *sc; - if(sc->temp) + sc = device_get_softc(dev); + if (sc->temp) free(sc->temp, M_DEVBUF); - if(sc->volt) + if (sc->volt) free(sc->volt, M_DEVBUF); - if(sc->fan) + if (sc->fan) free(sc->fan, M_DEVBUF); return (0); } diff --git a/sys/dev/acpi_support/acpi_asus.c b/sys/dev/acpi_support/acpi_asus.c index 51ca6fa35458..f9b9389268a0 100644 --- a/sys/dev/acpi_support/acpi_asus.c +++ b/sys/dev/acpi_support/acpi_asus.c @@ -270,8 +270,8 @@ static struct acpi_asus_model acpi_asus_models[] = { .wled_set = "WLED", .brn_get = "GPLV", .brn_set = "SPLV", - .lcd_get = "\\_SB.PCI0.SBRG.EC0.RPIN", - .lcd_set = "\\_SB.PCI0.SBRG.EC0._Q10", + .lcd_get = "GBTL", + .lcd_set = "SBTL", .disp_get = "\\_SB.PCI0.PCE2.VGA.GETD", .disp_set = "SDSP", }, @@ -1134,26 +1134,7 @@ acpi_asus_sysctl_init(struct acpi_asus_softc *sc, int method) return (FALSE); case ACPI_ASUS_METHOD_LCD: if (sc->model->lcd_get) { - if (strncmp(sc->model->name, "G2K", 3) == 0) { - ACPI_BUFFER Buf; - ACPI_OBJECT Arg, Obj; - ACPI_OBJECT_LIST Args; - - Arg.Type = ACPI_TYPE_INTEGER; - Arg.Integer.Value = 0x11; - Args.Count = 1; - Args.Pointer = &Arg; - Buf.Length = sizeof(Obj); - Buf.Pointer = &Obj; - - status = AcpiEvaluateObject(sc->handle, - sc->model->lcd_get, &Args, &Buf); - if (ACPI_SUCCESS(status) && - Obj.Type == ACPI_TYPE_INTEGER) { - sc->s_lcd = Obj.Integer.Value; - return (TRUE); - } - } else if (strncmp(sc->model->name, "L3H", 3) == 0) { + if (strncmp(sc->model->name, "L3H", 3) == 0) { ACPI_BUFFER Buf; ACPI_OBJECT Arg[2], Obj; ACPI_OBJECT_LIST Args; diff --git a/sys/dev/acpi_support/acpi_ibm.c b/sys/dev/acpi_support/acpi_ibm.c index 25db9b0be961..2b6ac5dc1874 100644 --- a/sys/dev/acpi_support/acpi_ibm.c +++ b/sys/dev/acpi_support/acpi_ibm.c @@ -255,6 +255,7 @@ ACPI_SERIAL_DECL(ibm, "ACPI IBM extras"); static int acpi_ibm_probe(device_t dev); static int acpi_ibm_attach(device_t dev); static int acpi_ibm_detach(device_t dev); +static int acpi_ibm_resume(device_t dev); static void ibm_led(void *softc, int onoff); static void ibm_led_task(struct acpi_ibm_softc *sc, int pending __unused); @@ -273,6 +274,7 @@ static device_method_t acpi_ibm_methods[] = { DEVMETHOD(device_probe, acpi_ibm_probe), DEVMETHOD(device_attach, acpi_ibm_attach), DEVMETHOD(device_detach, acpi_ibm_detach), + DEVMETHOD(device_resume, acpi_ibm_resume), {0, 0} }; @@ -434,6 +436,34 @@ acpi_ibm_detach(device_t dev) return (0); } +static int +acpi_ibm_resume(device_t dev) +{ + struct acpi_ibm_softc *sc = device_get_softc(dev); + + ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); + + ACPI_SERIAL_BEGIN(ibm); + for (int i = 0; acpi_ibm_sysctls[i].name != NULL; i++) { + int val; + + if ((acpi_ibm_sysctls[i].access & CTLFLAG_RD) == 0) { + continue; + } + + val = acpi_ibm_sysctl_get(sc, i); + + if ((acpi_ibm_sysctls[i].access & CTLFLAG_WR) == 0) { + continue; + } + + acpi_ibm_sysctl_set(sc, i, val); + } + ACPI_SERIAL_END(ibm); + + return (0); +} + static int acpi_ibm_eventmask_set(struct acpi_ibm_softc *sc, int val) { @@ -496,7 +526,7 @@ out: static int acpi_ibm_sysctl_get(struct acpi_ibm_softc *sc, int method) { - ACPI_INTEGER val_ec; + UINT64 val_ec; int val = 0, key; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -627,7 +657,7 @@ static int acpi_ibm_sysctl_set(struct acpi_ibm_softc *sc, int method, int arg) { int val, step; - ACPI_INTEGER val_ec; + UINT64 val_ec; ACPI_OBJECT Arg; ACPI_OBJECT_LIST Args; ACPI_STATUS status; diff --git a/sys/dev/acpi_support/acpi_panasonic.c b/sys/dev/acpi_support/acpi_panasonic.c index 595ca08e524a..ad8b2391bc56 100644 --- a/sys/dev/acpi_support/acpi_panasonic.c +++ b/sys/dev/acpi_support/acpi_panasonic.c @@ -82,9 +82,9 @@ static int acpi_panasonic_attach(device_t dev); static int acpi_panasonic_detach(device_t dev); static int acpi_panasonic_shutdown(device_t dev); static int acpi_panasonic_sysctl(SYSCTL_HANDLER_ARGS); -static ACPI_INTEGER acpi_panasonic_sinf(ACPI_HANDLE h, ACPI_INTEGER index); -static void acpi_panasonic_sset(ACPI_HANDLE h, ACPI_INTEGER index, - ACPI_INTEGER val); +static UINT64 acpi_panasonic_sinf(ACPI_HANDLE h, UINT64 index); +static void acpi_panasonic_sset(ACPI_HANDLE h, UINT64 index, + UINT64 val); static int acpi_panasonic_hkey_event(struct acpi_panasonic_softc *sc, ACPI_HANDLE h, UINT32 *arg); static void acpi_panasonic_hkey_action(struct acpi_panasonic_softc *sc, @@ -265,12 +265,12 @@ out: return (error); } -static ACPI_INTEGER -acpi_panasonic_sinf(ACPI_HANDLE h, ACPI_INTEGER index) +static UINT64 +acpi_panasonic_sinf(ACPI_HANDLE h, UINT64 index) { ACPI_BUFFER buf; ACPI_OBJECT *res; - ACPI_INTEGER ret; + UINT64 ret; ACPI_SERIAL_ASSERT(panasonic); ret = -1; @@ -286,7 +286,7 @@ acpi_panasonic_sinf(ACPI_HANDLE h, ACPI_INTEGER index) } static void -acpi_panasonic_sset(ACPI_HANDLE h, ACPI_INTEGER index, ACPI_INTEGER val) +acpi_panasonic_sset(ACPI_HANDLE h, UINT64 index, UINT64 val) { ACPI_OBJECT_LIST args; ACPI_OBJECT obj[2]; @@ -394,7 +394,7 @@ acpi_panasonic_hkey_event(struct acpi_panasonic_softc *sc, ACPI_HANDLE h, { ACPI_BUFFER buf; ACPI_OBJECT *res; - ACPI_INTEGER val; + UINT64 val; int status; ACPI_SERIAL_ASSERT(panasonic); diff --git a/sys/dev/acpi_support/acpi_sony.c b/sys/dev/acpi_support/acpi_sony.c index 905461d1e121..2a0d40e52669 100644 --- a/sys/dev/acpi_support/acpi_sony.c +++ b/sys/dev/acpi_support/acpi_sony.c @@ -42,14 +42,21 @@ __FBSDID("$FreeBSD$"); #define _COMPONENT ACPI_OEM ACPI_MODULE_NAME("Sony") -#define ACPI_SONY_GET_BRIGHTNESS "GBRT" -#define ACPI_SONY_SET_BRIGHTNESS "SBRT" #define ACPI_SONY_GET_PID "GPID" /* * SNY5001 + * This is the ACPI handle for the "Sony Notebook Control" driver under + * Windows. + * It provides several methods within the ACPI namespace, including: * [GS]BRT [GS]PBR [GS]CTR [GS]PCR [GS]CMI [CDPW GCDP]? GWDP PWAK PWRN * + * SNY6001 + * This is the ACPI handle for the "Sony Programmable I/O" driver under + * Windows. + * It is not yet supported by this driver, but provides control over the + * power to the bluetooth, built-in camera and HSDPA modem devices in some + * laptops, and also allows some control of the fan speed. */ struct acpi_sony_softc { @@ -63,14 +70,17 @@ static struct acpi_sony_name_list char *comment; } acpi_sony_oids[] = { { "brightness", "GBRT", "SBRT", "Display Brightness"}, - { "ctr", "GCTR", "SCTR", "??"}, + { "brightness_default", "GPBR", "SPBR", "Default Display Brightness"}, + { "contrast", "GCTR", "SCTR", "Display Contrast"}, + { "bass_gain", "GMGB", "SMGB", "Multimedia Bass Gain"}, { "pcr", "GPCR", "SPCR", "???"}, #if 0 - { "cmi", "GCMI", "SCMI", "????"}, + { "cmi", "GCMI", "SCMI", "???"}, #endif - { "wdp", "GWDP", NULL, "?????"}, + { "wdp", "GWDP", NULL, "???"}, { "cdp", "GCDP", "CDPW", "CD Power"}, /*shares [\GL03]&0x8 flag*/ { "azp", "GAZP", "AZPW", "Audio Power"}, + { "lnp", "GLNP", "LNPW", "LAN Power"}, { NULL, NULL, NULL } }; diff --git a/sys/dev/acpi_support/acpi_wmi.c b/sys/dev/acpi_support/acpi_wmi.c index 07c2d712eb6c..9da790c5fdad 100644 --- a/sys/dev/acpi_support/acpi_wmi.c +++ b/sys/dev/acpi_support/acpi_wmi.c @@ -141,7 +141,7 @@ static void acpi_wmi_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context); static ACPI_STATUS acpi_wmi_ec_handler(UINT32 function, ACPI_PHYSICAL_ADDRESS address, UINT32 width, - ACPI_INTEGER *value, void *context, + UINT64 *value, void *context, void *region_context); /* helpers */ static ACPI_STATUS acpi_wmi_read_wdg_blocks(ACPI_HANDLE h); @@ -646,12 +646,12 @@ acpi_wmi_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context) */ static ACPI_STATUS acpi_wmi_ec_handler(UINT32 function, ACPI_PHYSICAL_ADDRESS address, - UINT32 width, ACPI_INTEGER *value, void *context, + UINT32 width, UINT64 *value, void *context, void *region_context) { struct acpi_wmi_softc *sc; int i; - ACPI_INTEGER ec_data; + UINT64 ec_data; UINT8 ec_addr; ACPI_STATUS status; @@ -672,7 +672,7 @@ acpi_wmi_ec_handler(UINT32 function, ACPI_PHYSICAL_ADDRESS address, case ACPI_READ: status = ACPI_EC_READ(sc->ec_dev, ec_addr, &ec_data, 1); if (ACPI_SUCCESS(status)) - *value |= ((ACPI_INTEGER)ec_data) << i; + *value |= ((UINT64)ec_data) << i; break; case ACPI_WRITE: ec_data = (UINT8)((*value) >> i); diff --git a/sys/dev/acpica/Osd/OsdHardware.c b/sys/dev/acpica/Osd/OsdHardware.c index cf3cdd74e736..822bf78545dc 100644 --- a/sys/dev/acpica/Osd/OsdHardware.c +++ b/sys/dev/acpica/Osd/OsdHardware.c @@ -145,7 +145,7 @@ AcpiOsReadPciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register, void *Value, ACPI_STATUS AcpiOsWritePciConfiguration (ACPI_PCI_ID *PciId, UINT32 Register, - ACPI_INTEGER Value, UINT32 Width) + UINT64 Value, UINT32 Width) { u_int32_t byte_width = Width / 8; diff --git a/sys/dev/acpica/Osd/OsdSchedule.c b/sys/dev/acpica/Osd/OsdSchedule.c index b8153a33fb7f..70717d5d6502 100644 --- a/sys/dev/acpica/Osd/OsdSchedule.c +++ b/sys/dev/acpica/Osd/OsdSchedule.c @@ -215,7 +215,7 @@ AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, } void -AcpiOsSleep(ACPI_INTEGER Milliseconds) +AcpiOsSleep(UINT64 Milliseconds) { int timo; diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index b31f1e7889e9..69f073974ab8 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -900,9 +900,6 @@ acpi_read_ivar(device_t dev, device_t child, int index, uintptr_t *result) case ACPI_IVAR_HANDLE: *(ACPI_HANDLE *)result = ad->ad_handle; break; - case ACPI_IVAR_MAGIC: - *(uintptr_t *)result = ad->ad_magic; - break; case ACPI_IVAR_PRIVATE: *(void **)result = ad->ad_private; break; @@ -938,9 +935,6 @@ acpi_write_ivar(device_t dev, device_t child, int index, uintptr_t value) case ACPI_IVAR_HANDLE: ad->ad_handle = (ACPI_HANDLE)value; break; - case ACPI_IVAR_MAGIC: - ad->ad_magic = (uintptr_t)value; - break; case ACPI_IVAR_PRIVATE: ad->ad_private = (void *)value; break; @@ -1523,7 +1517,7 @@ acpi_device_scan_children(device_t bus, device_t dev, int max_depth, ctx.arg = arg; ctx.parent = h; return (AcpiWalkNamespace(ACPI_TYPE_ANY, h, max_depth, - acpi_device_scan_cb, &ctx, NULL)); + acpi_device_scan_cb, NULL, &ctx, NULL)); } /* @@ -1649,7 +1643,7 @@ acpi_probe_children(device_t bus) */ ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "namespace scan\n")); AcpiWalkNamespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 100, acpi_probe_child, - bus, NULL); + NULL, bus, NULL); /* Pre-allocate resources for our rman from any sysresource devices. */ acpi_sysres_alloc(bus); @@ -1659,14 +1653,7 @@ acpi_probe_children(device_t bus) bus_generic_probe(bus); /* Probe/attach all children, created staticly and from the namespace. */ - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "first bus_generic_attach\n")); - bus_generic_attach(bus); - - /* - * Some of these children may have attached others as part of their attach - * process (eg. the root PCI bus driver), so rescan. - */ - ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "second bus_generic_attach\n")); + ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "acpi bus_generic_attach\n")); bus_generic_attach(bus); /* Attach wake sysctls. */ @@ -1691,14 +1678,14 @@ acpi_probe_order(ACPI_HANDLE handle, int *order) * 100000. CPUs */ AcpiGetType(handle, &type); - if (acpi_MatchHid(handle, "PNP0C01") || acpi_MatchHid(handle, "PNP0C02")) + if (type == ACPI_TYPE_PROCESSOR) *order = 1; - else if (acpi_MatchHid(handle, "PNP0C09")) + else if (acpi_MatchHid(handle, "PNP0C01") || acpi_MatchHid(handle, "PNP0C02")) *order = 2; - else if (acpi_MatchHid(handle, "PNP0C0F")) + else if (acpi_MatchHid(handle, "PNP0C09")) *order = 3; - else if (type == ACPI_TYPE_PROCESSOR) - *order = 100000; + else if (acpi_MatchHid(handle, "PNP0C0F")) + *order = 4; } /* @@ -2308,9 +2295,8 @@ acpi_sleep_force(void *arg) int acpi_ReqSleepState(struct acpi_softc *sc, int state) { -#if defined(__i386__) +#if defined(__amd64__) || defined(__i386__) struct apm_clone_data *clone; -#endif if (state < ACPI_STATE_S1 || state > ACPI_S_STATES_MAX) return (EINVAL); @@ -2325,7 +2311,6 @@ acpi_ReqSleepState(struct acpi_softc *sc, int state) return (ENXIO); } -#if defined(__amd64__) || defined(__i386__) /* If a suspend request is already in progress, just return. */ ACPI_LOCK(acpi); if (sc->acpi_next_sstate != 0) { @@ -2335,7 +2320,6 @@ acpi_ReqSleepState(struct acpi_softc *sc, int state) /* Record the pending state and notify all apm devices. */ sc->acpi_next_sstate = state; -#if defined(__i386__) STAILQ_FOREACH(clone, &sc->apm_cdevs, entries) { clone->notify_status = APM_EV_NONE; if ((clone->flags & ACPI_EVF_DEVD) == 0) { @@ -2343,7 +2327,6 @@ acpi_ReqSleepState(struct acpi_softc *sc, int state) KNOTE_UNLOCKED(&clone->sel_read.si_note, 0); } } -#endif /* If devd(8) is not running, immediately enter the sleep state. */ if (!devctl_process_running()) { @@ -2414,7 +2397,6 @@ acpi_AckSleepState(struct apm_clone_data *clone, int error) * are writable since read-only devices couldn't ack the request. */ sleeping = TRUE; -#if defined(__i386__) clone->notify_status = APM_EV_ACKED; STAILQ_FOREACH(clone, &sc->apm_cdevs, entries) { if ((clone->flags & ACPI_EVF_WRITE) != 0 && @@ -2423,7 +2405,6 @@ acpi_AckSleepState(struct apm_clone_data *clone, int error) break; } } -#endif /* If all devices have voted "yes", we will suspend now. */ if (sleeping) @@ -2779,7 +2760,7 @@ acpi_wake_prep_walk(int sstate) if (ACPI_SUCCESS(AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_SB_", &sb_handle))) AcpiWalkNamespace(ACPI_TYPE_DEVICE, sb_handle, 100, - acpi_wake_prep, &sstate, NULL); + acpi_wake_prep, NULL, &sstate, NULL); return (0); } diff --git a/sys/dev/acpica/acpi_acad.c b/sys/dev/acpica/acpi_acad.c index 638c09be635e..8153abc4f3b5 100644 --- a/sys/dev/acpica/acpi_acad.c +++ b/sys/dev/acpica/acpi_acad.c @@ -109,13 +109,14 @@ acpi_acad_get_status(void *context) ACPI_SERIAL_BEGIN(acad); if (newstatus != -1 && sc->status != newstatus) { sc->status = newstatus; + ACPI_SERIAL_END(acad); power_profile_set_state(newstatus ? POWER_PROFILE_PERFORMANCE : POWER_PROFILE_ECONOMY); ACPI_VPRINT(dev, acpi_device_get_parent_softc(dev), "%s Line\n", newstatus ? "On" : "Off"); acpi_UserNotify("ACAD", h, newstatus); - } - ACPI_SERIAL_END(acad); + } else + ACPI_SERIAL_END(acad); } static void diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c index 8fe9de6f61ce..06c295481322 100644 --- a/sys/dev/acpica/acpi_cpu.c +++ b/sys/dev/acpica/acpi_cpu.c @@ -255,7 +255,7 @@ acpi_cpu_probe(device_t dev) /* Mark this processor as in-use and save our derived id for attach. */ cpu_softc[cpu_id] = (void *)1; - acpi_set_magic(dev, cpu_id); + acpi_set_private(dev, (void*)(intptr_t)cpu_id); device_set_desc(dev, "ACPI CPU"); return (0); @@ -286,7 +286,7 @@ acpi_cpu_attach(device_t dev) sc = device_get_softc(dev); sc->cpu_dev = dev; sc->cpu_handle = acpi_get_handle(dev); - cpu_id = acpi_get_magic(dev); + cpu_id = (int)(intptr_t)acpi_get_private(dev); cpu_softc[cpu_id] = sc; pcpu_data = pcpu_find(cpu_id); pcpu_data->pc_device = dev; @@ -345,28 +345,11 @@ acpi_cpu_attach(device_t dev) } /* - * CPU capabilities are specified as a buffer of 32-bit integers: - * revision, count, and one or more capabilities. The revision of - * "1" is not specified anywhere but seems to match Linux. + * CPU capabilities are specified in + * Intel Processor Vendor-Specific ACPI Interface Specification. */ if (sc->cpu_features) { arglist.Pointer = arg; - arglist.Count = 1; - arg[0].Type = ACPI_TYPE_BUFFER; - arg[0].Buffer.Length = sizeof(cap_set); - arg[0].Buffer.Pointer = (uint8_t *)cap_set; - cap_set[0] = 1; /* revision */ - cap_set[1] = 1; /* number of capabilities integers */ - cap_set[2] = sc->cpu_features; - AcpiEvaluateObject(sc->cpu_handle, "_PDC", &arglist, NULL); - - /* - * On some systems we need to evaluate _OSC so that the ASL - * loads the _PSS and/or _PDC methods at runtime. - * - * TODO: evaluate failure of _OSC. - */ - arglist.Pointer = arg; arglist.Count = 4; arg[0].Type = ACPI_TYPE_BUFFER; arg[0].Buffer.Length = sizeof(cpu_oscuuid); @@ -378,20 +361,54 @@ acpi_cpu_attach(device_t dev) arg[3].Type = ACPI_TYPE_BUFFER; arg[3].Buffer.Length = sizeof(cap_set); /* Capabilities buffer */ arg[3].Buffer.Pointer = (uint8_t *)cap_set; - cap_set[0] = 0; - AcpiEvaluateObject(sc->cpu_handle, "_OSC", &arglist, NULL); + cap_set[0] = 0; /* status */ + cap_set[1] = sc->cpu_features; + status = AcpiEvaluateObject(sc->cpu_handle, "_OSC", &arglist, NULL); + if (ACPI_SUCCESS(status)) { + if (cap_set[0] != 0) + device_printf(dev, "_OSC returned status %#x\n", cap_set[0]); + } + else { + arglist.Pointer = arg; + arglist.Count = 1; + arg[0].Type = ACPI_TYPE_BUFFER; + arg[0].Buffer.Length = sizeof(cap_set); + arg[0].Buffer.Pointer = (uint8_t *)cap_set; + cap_set[0] = 1; /* revision */ + cap_set[1] = 1; /* number of capabilities integers */ + cap_set[2] = sc->cpu_features; + AcpiEvaluateObject(sc->cpu_handle, "_PDC", &arglist, NULL); + } } /* Probe for Cx state support. */ acpi_cpu_cx_probe(sc); - /* Finally, call identify and probe/attach for child devices. */ - bus_generic_probe(dev); - bus_generic_attach(dev); - return (0); } +static void +acpi_cpu_postattach(void *unused __unused) +{ + device_t *devices; + int err; + int i, n; + + err = devclass_get_devices(acpi_cpu_devclass, &devices, &n); + if (err != 0) { + printf("devclass_get_devices(acpi_cpu_devclass) failed\n"); + return; + } + for (i = 0; i < n; i++) + bus_generic_probe(devices[i]); + for (i = 0; i < n; i++) + bus_generic_attach(devices[i]); + free(devices, M_TEMP); +} + +SYSINIT(acpi_cpu, SI_SUB_CONFIGURE, SI_ORDER_MIDDLE, + acpi_cpu_postattach, NULL); + /* * Disable any entry to the idle function during suspend and re-enable it * during resume. diff --git a/sys/dev/acpica/acpi_dock.c b/sys/dev/acpica/acpi_dock.c index b7d2e3e444a4..2e77b934b96c 100644 --- a/sys/dev/acpica/acpi_dock.c +++ b/sys/dev/acpica/acpi_dock.c @@ -224,7 +224,7 @@ acpi_dock_insert_child(ACPI_HANDLE handle, UINT32 level, void *context, ACPI_INIT_WALK_INFO Info; AcpiNsWalkNamespace(ACPI_TYPE_ANY, handle, - 100, TRUE, AcpiNsInitOneDevice, &Info, NULL); + 100, TRUE, AcpiNsInitOneDevice, NULL, &Info, NULL); #endif dev = acpi_get_device(handle); @@ -249,7 +249,7 @@ acpi_dock_insert_children(device_t dev) status = AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_SB_", &sb_handle); if (ACPI_SUCCESS(status)) { AcpiWalkNamespace(ACPI_TYPE_DEVICE, sb_handle, - 100, acpi_dock_insert_child, dev, NULL); + 100, acpi_dock_insert_child, NULL, dev, NULL); } } @@ -319,7 +319,7 @@ acpi_dock_eject_children(device_t dev) status = AcpiGetHandle(ACPI_ROOT_OBJECT, "\\_SB_", &sb_handle); if (ACPI_SUCCESS(status)) { AcpiWalkNamespace(ACPI_TYPE_DEVICE, sb_handle, - 100, acpi_dock_eject_child, &dev, NULL); + 100, acpi_dock_eject_child, NULL, &dev, NULL); } } diff --git a/sys/dev/acpica/acpi_ec.c b/sys/dev/acpica/acpi_ec.c index a5a81dc632f4..d4ef0191b887 100644 --- a/sys/dev/acpica/acpi_ec.c +++ b/sys/dev/acpica/acpi_ec.c @@ -129,9 +129,6 @@ struct acpi_ec_params { int uid; }; -/* Indicate that this device has already been probed via ECDT. */ -#define DEV_ECDT(x) (acpi_get_magic(x) == (uintptr_t)&acpi_ec_devclass) - /* * Driver softc. */ @@ -226,7 +223,7 @@ static ACPI_STATUS EcSpaceSetup(ACPI_HANDLE Region, UINT32 Function, void *Context, void **return_Context); static ACPI_STATUS EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, - UINT32 width, ACPI_INTEGER *Value, + UINT32 width, UINT64 *Value, void *Context, void *RegionContext); static ACPI_STATUS EcWaitEvent(struct acpi_ec_softc *sc, EC_EVENT Event, u_int gen_count); @@ -241,9 +238,9 @@ static int acpi_ec_suspend(device_t dev); static int acpi_ec_resume(device_t dev); static int acpi_ec_shutdown(device_t dev); static int acpi_ec_read_method(device_t dev, u_int addr, - ACPI_INTEGER *val, int width); + UINT64 *val, int width); static int acpi_ec_write_method(device_t dev, u_int addr, - ACPI_INTEGER val, int width); + UINT64 val, int width); static device_method_t acpi_ec_methods[] = { /* Device interface */ @@ -332,7 +329,6 @@ acpi_ec_ecdt_probe(device_t parent) params->uid = ecdt->Uid; acpi_GetInteger(h, "_GLK", ¶ms->glk); acpi_set_private(child, params); - acpi_set_magic(child, (uintptr_t)&acpi_ec_devclass); /* Finish the attach process. */ if (device_probe_and_attach(child) != 0) @@ -348,6 +344,7 @@ acpi_ec_probe(device_t dev) ACPI_STATUS status; device_t peer; char desc[64]; + int ecdt; int ret; struct acpi_ec_params *params; static char *ec_ids[] = { "PNP0C09", NULL }; @@ -362,14 +359,14 @@ acpi_ec_probe(device_t dev) * duplicate probe. */ ret = ENXIO; - params = NULL; + ecdt = 0; buf.Pointer = NULL; buf.Length = ACPI_ALLOCATE_BUFFER; - if (DEV_ECDT(dev)) { - params = acpi_get_private(dev); + params = acpi_get_private(dev); + if (params != NULL) { + ecdt = 1; ret = 0; - } else if (!acpi_disabled("ec") && - ACPI_ID_PROBE(device_get_parent(dev), dev, ec_ids)) { + } else if (ACPI_ID_PROBE(device_get_parent(dev), dev, ec_ids)) { params = malloc(sizeof(struct acpi_ec_params), M_TEMP, M_WAITOK | M_ZERO); h = acpi_get_handle(dev); @@ -439,7 +436,7 @@ out: if (ret == 0) { snprintf(desc, sizeof(desc), "Embedded Controller: GPE %#x%s%s", params->gpe_bit, (params->glk) ? ", GLK" : "", - DEV_ECDT(dev) ? ", ECDT" : ""); + ecdt ? ", ECDT" : ""); device_set_desc_copy(dev, desc); } @@ -471,6 +468,7 @@ acpi_ec_attach(device_t dev) sc->ec_gpehandle = params->gpe_handle; sc->ec_uid = params->uid; sc->ec_suspending = FALSE; + acpi_set_private(dev, NULL); free(params, M_TEMP); /* Attach bus resources for data and command/status ports. */ @@ -583,7 +581,7 @@ acpi_ec_shutdown(device_t dev) /* Methods to allow other devices (e.g., smbat) to read/write EC space. */ static int -acpi_ec_read_method(device_t dev, u_int addr, ACPI_INTEGER *val, int width) +acpi_ec_read_method(device_t dev, u_int addr, UINT64 *val, int width) { struct acpi_ec_softc *sc; ACPI_STATUS status; @@ -596,7 +594,7 @@ acpi_ec_read_method(device_t dev, u_int addr, ACPI_INTEGER *val, int width) } static int -acpi_ec_write_method(device_t dev, u_int addr, ACPI_INTEGER val, int width) +acpi_ec_write_method(device_t dev, u_int addr, UINT64 val, int width) { struct acpi_ec_softc *sc; ACPI_STATUS status; @@ -726,7 +724,7 @@ EcSpaceSetup(ACPI_HANDLE Region, UINT32 Function, void *Context, static ACPI_STATUS EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width, - ACPI_INTEGER *Value, void *Context, void *RegionContext) + UINT64 *Value, void *Context, void *RegionContext) { struct acpi_ec_softc *sc = (struct acpi_ec_softc *)Context; ACPI_STATUS Status; @@ -767,7 +765,7 @@ EcSpaceHandler(UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 width, case ACPI_READ: Status = EcRead(sc, EcAddr, &EcData); if (ACPI_SUCCESS(Status)) - *Value |= ((ACPI_INTEGER)EcData) << i; + *Value |= ((UINT64)EcData) << i; break; case ACPI_WRITE: EcData = (UINT8)((*Value) >> i); diff --git a/sys/dev/acpica/acpi_hpet.c b/sys/dev/acpica/acpi_hpet.c index a41869543680..a98a8260f953 100644 --- a/sys/dev/acpica/acpi_hpet.c +++ b/sys/dev/acpica/acpi_hpet.c @@ -42,6 +42,9 @@ __FBSDID("$FreeBSD$"); #include #include +#define HPET_VENDID_AMD 0x4353 +#define HPET_VENDID_INTEL 0x8086 + ACPI_SERIAL_DECL(hpet, "ACPI HPET support"); static devclass_t acpi_hpet_devclass; @@ -61,8 +64,6 @@ static void acpi_hpet_test(struct acpi_hpet_softc *sc); static char *hpet_ids[] = { "PNP0103", NULL }; -#define DEV_HPET(x) (acpi_get_magic(x) == (uintptr_t)&acpi_hpet_devclass) - struct timecounter hpet_timecounter = { .tc_get_timecount = hpet_get_timecount, .tc_counter_mask = ~0u, @@ -133,8 +134,6 @@ acpi_hpet_identify(driver_t *driver, device_t parent) return; } - /* Record a magic value so we can detect this device later. */ - acpi_set_magic(child, (uintptr_t)&acpi_hpet_devclass); bus_set_resource(child, SYS_RES_MEMORY, 0, hpet->Address.Address, HPET_MEM_WIDTH); } @@ -146,7 +145,7 @@ acpi_hpet_probe(device_t dev) if (acpi_disabled("hpet")) return (ENXIO); - if (!DEV_HPET(dev) && + if (acpi_get_handle(dev) != NULL && (ACPI_ID_PROBE(device_get_parent(dev), dev, hpet_ids) == NULL || device_get_unit(dev) != 0)) return (ENXIO); @@ -159,9 +158,10 @@ static int acpi_hpet_attach(device_t dev) { struct acpi_hpet_softc *sc; - int rid; + int rid, num_timers; uint32_t val, val2; uintmax_t freq; + uint16_t vendor; ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); @@ -198,10 +198,21 @@ acpi_hpet_attach(device_t dev) freq = (1000000000000000LL + val / 2) / val; if (bootverbose) { val = bus_read_4(sc->mem_res, HPET_CAPABILITIES); + + /* + * ATI/AMD violates IA-PC HPET (High Precision Event Timers) + * Specification and provides an off by one number + * of timers/comparators. + * Additionally, they use unregistered value in VENDOR_ID field. + */ + num_timers = 1 + ((val & HPET_CAP_NUM_TIM) >> 8); + vendor = val >> 16; + if (vendor == HPET_VENDID_AMD && num_timers > 0) + num_timers--; device_printf(dev, "vend: 0x%x rev: 0x%x num: %d hz: %jd opts:%s%s\n", - val >> 16, val & HPET_CAP_REV_ID, - (val & HPET_CAP_NUM_TIM) >> 8, freq, + vendor, val & HPET_CAP_REV_ID, + num_timers, freq, (val & HPET_CAP_LEG_RT) ? " legacy_route" : "", (val & HPET_CAP_COUNT_SIZE) ? " 64-bit" : ""); } diff --git a/sys/dev/acpica/acpi_if.m b/sys/dev/acpica/acpi_if.m index 4d90109d7506..36fad85bd773 100644 --- a/sys/dev/acpica/acpi_if.m +++ b/sys/dev/acpica/acpi_if.m @@ -177,13 +177,13 @@ STATICMETHOD int get_features { # # device_t dev: EC device # u_int addr: Address to read from in EC space -# ACPI_INTEGER *val: Location to store read value +# UINT64 *val: Location to store read value # int width: Size of area to read in bytes # METHOD int ec_read { device_t dev; u_int addr; - ACPI_INTEGER *val; + UINT64 *val; int width; }; @@ -192,13 +192,13 @@ METHOD int ec_read { # # device_t dev: EC device # u_int addr: Address to write to in EC space -# ACPI_INTEGER val: Value to write +# UINT64 val: Value to write # int width: Size of value to write in bytes # METHOD int ec_write { device_t dev; u_int addr; - ACPI_INTEGER val; + UINT64 val; int width; }; diff --git a/sys/dev/acpica/acpi_package.c b/sys/dev/acpica/acpi_package.c index 55eaf93608ce..e38fea55521c 100644 --- a/sys/dev/acpica/acpi_package.c +++ b/sys/dev/acpica/acpi_package.c @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); */ int -acpi_PkgInt(ACPI_OBJECT *res, int idx, ACPI_INTEGER *dst) +acpi_PkgInt(ACPI_OBJECT *res, int idx, UINT64 *dst) { ACPI_OBJECT *obj; @@ -60,7 +60,7 @@ acpi_PkgInt(ACPI_OBJECT *res, int idx, ACPI_INTEGER *dst) int acpi_PkgInt32(ACPI_OBJECT *res, int idx, uint32_t *dst) { - ACPI_INTEGER tmp; + UINT64 tmp; int error; error = acpi_PkgInt(res, idx, &tmp); diff --git a/sys/dev/acpica/acpi_pci.c b/sys/dev/acpica/acpi_pci.c index 7c1bd86120e0..9cf064ee39d8 100644 --- a/sys/dev/acpica/acpi_pci.c +++ b/sys/dev/acpica/acpi_pci.c @@ -314,7 +314,7 @@ acpi_pci_attach(device_t dev) */ pci_add_children(dev, domain, busno, sizeof(struct acpi_pci_devinfo)); AcpiWalkNamespace(ACPI_TYPE_DEVICE, acpi_get_handle(dev), 1, - acpi_pci_save_handle, dev, NULL); + acpi_pci_save_handle, NULL, dev, NULL); return (bus_generic_attach(dev)); } diff --git a/sys/dev/acpica/acpi_powerres.c b/sys/dev/acpica/acpi_powerres.c index 0988871c246d..9c43c880ad9b 100644 --- a/sys/dev/acpica/acpi_powerres.c +++ b/sys/dev/acpica/acpi_powerres.c @@ -88,8 +88,8 @@ struct acpi_powerresource { TAILQ_ENTRY(acpi_powerresource) ap_link; TAILQ_HEAD(,acpi_powerreference) ap_references; ACPI_HANDLE ap_resource; - ACPI_INTEGER ap_systemlevel; - ACPI_INTEGER ap_order; + UINT64 ap_systemlevel; + UINT64 ap_order; int ap_state; }; diff --git a/sys/dev/acpica/acpi_smbat.c b/sys/dev/acpica/acpi_smbat.c index 145e240dca10..02a461e1ed6d 100644 --- a/sys/dev/acpica/acpi_smbat.c +++ b/sys/dev/acpica/acpi_smbat.c @@ -190,7 +190,7 @@ acpi_smbus_read_2(struct acpi_smbat_softc *sc, uint8_t addr, uint8_t cmd, uint16_t *ptr) { int error, to; - ACPI_INTEGER val; + UINT64 val; ACPI_SERIAL_ASSERT(smbat); @@ -257,7 +257,7 @@ static int acpi_smbus_read_multi_1(struct acpi_smbat_softc *sc, uint8_t addr, uint8_t cmd, uint8_t *ptr, uint16_t len) { - ACPI_INTEGER val; + UINT64 val; uint8_t to; int error; diff --git a/sys/dev/acpica/acpi_video.c b/sys/dev/acpica/acpi_video.c index e7e7d66ce074..94ef7be655b7 100644 --- a/sys/dev/acpica/acpi_video.c +++ b/sys/dev/acpica/acpi_video.c @@ -83,6 +83,7 @@ static struct acpi_video_output *acpi_video_vo_init(UINT32); static void acpi_video_vo_bind(struct acpi_video_output *, ACPI_HANDLE); static void acpi_video_vo_destroy(struct acpi_video_output *); static int acpi_video_vo_check_level(struct acpi_video_output *, int); +static void acpi_video_vo_notify_handler(ACPI_HANDLE, UINT32, void *); static int acpi_video_vo_active_sysctl(SYSCTL_HANDLER_ARGS); static int acpi_video_vo_bright_sysctl(SYSCTL_HANDLER_ARGS); static int acpi_video_vo_presets_sysctl(SYSCTL_HANDLER_ARGS); @@ -93,56 +94,61 @@ static void vid_set_switch_policy(ACPI_HANDLE, UINT32); static int vid_enum_outputs(ACPI_HANDLE, void(*)(ACPI_HANDLE, UINT32, void *), void *); static int vo_get_brightness_levels(ACPI_HANDLE, int **); +static int vo_get_brightness(ACPI_HANDLE); static void vo_set_brightness(ACPI_HANDLE, int); static UINT32 vo_get_device_status(ACPI_HANDLE); static UINT32 vo_get_graphics_state(ACPI_HANDLE); static void vo_set_device_state(ACPI_HANDLE, UINT32); /* events */ -#define VID_NOTIFY_SWITCHED 0x80 -#define VID_NOTIFY_REPROBE 0x81 +#define VID_NOTIFY_SWITCHED 0x80 +#define VID_NOTIFY_REPROBE 0x81 +#define VID_NOTIFY_CYCLE_BRN 0x85 +#define VID_NOTIFY_INC_BRN 0x86 +#define VID_NOTIFY_DEC_BRN 0x87 +#define VID_NOTIFY_ZERO_BRN 0x88 /* _DOS (Enable/Disable Output Switching) argument bits */ -#define DOS_SWITCH_MASK 3 -#define DOS_SWITCH_BY_OSPM 0 -#define DOS_SWITCH_BY_BIOS 1 -#define DOS_SWITCH_LOCKED 2 -#define DOS_BRIGHTNESS_BY_BIOS (1 << 2) +#define DOS_SWITCH_MASK 3 +#define DOS_SWITCH_BY_OSPM 0 +#define DOS_SWITCH_BY_BIOS 1 +#define DOS_SWITCH_LOCKED 2 +#define DOS_BRIGHTNESS_BY_OSPM (1 << 2) /* _DOD and subdev's _ADR */ -#define DOD_DEVID_MASK 0x0f00 -#define DOD_DEVID_MASK_FULL 0xffff -#define DOD_DEVID_MASK_DISPIDX 0x000f -#define DOD_DEVID_MASK_DISPPORT 0x00f0 -#define DOD_DEVID_MONITOR 0x0100 -#define DOD_DEVID_LCD 0x0110 -#define DOD_DEVID_TV 0x0200 -#define DOD_DEVID_EXT 0x0300 -#define DOD_DEVID_INTDFP 0x0400 -#define DOD_BIOS (1 << 16) -#define DOD_NONVGA (1 << 17) -#define DOD_HEAD_ID_SHIFT 18 -#define DOD_HEAD_ID_BITS 3 -#define DOD_HEAD_ID_MASK \ +#define DOD_DEVID_MASK 0x0f00 +#define DOD_DEVID_MASK_FULL 0xffff +#define DOD_DEVID_MASK_DISPIDX 0x000f +#define DOD_DEVID_MASK_DISPPORT 0x00f0 +#define DOD_DEVID_MONITOR 0x0100 +#define DOD_DEVID_LCD 0x0110 +#define DOD_DEVID_TV 0x0200 +#define DOD_DEVID_EXT 0x0300 +#define DOD_DEVID_INTDFP 0x0400 +#define DOD_BIOS (1 << 16) +#define DOD_NONVGA (1 << 17) +#define DOD_HEAD_ID_SHIFT 18 +#define DOD_HEAD_ID_BITS 3 +#define DOD_HEAD_ID_MASK \ (((1 << DOD_HEAD_ID_BITS) - 1) << DOD_HEAD_ID_SHIFT) -#define DOD_DEVID_SCHEME_STD (1 << 31) +#define DOD_DEVID_SCHEME_STD (1 << 31) /* _BCL related constants */ -#define BCL_FULLPOWER 0 -#define BCL_ECONOMY 1 +#define BCL_FULLPOWER 0 +#define BCL_ECONOMY 1 /* _DCS (Device Currrent Status) value bits and masks. */ -#define DCS_EXISTS (1 << 0) -#define DCS_ACTIVE (1 << 1) -#define DCS_READY (1 << 2) -#define DCS_FUNCTIONAL (1 << 3) -#define DCS_ATTACHED (1 << 4) +#define DCS_EXISTS (1 << 0) +#define DCS_ACTIVE (1 << 1) +#define DCS_READY (1 << 2) +#define DCS_FUNCTIONAL (1 << 3) +#define DCS_ATTACHED (1 << 4) /* _DSS (Device Set Status) argument bits and masks. */ -#define DSS_INACTIVE 0 -#define DSS_ACTIVE (1 << 0) -#define DSS_SETNEXT (1 << 30) -#define DSS_COMMIT (1 << 31) +#define DSS_INACTIVE 0 +#define DSS_ACTIVE (1 << 0) +#define DSS_SETNEXT (1 << 30) +#define DSS_COMMIT (1 << 31) static device_method_t acpi_video_methods[] = { DEVMETHOD(device_identify, acpi_video_identify), @@ -170,7 +176,13 @@ static struct sysctl_oid *acpi_video_sysctl_tree; static struct acpi_video_output_queue crt_units, tv_units, ext_units, lcd_units, other_units; +/* + * The 'video' lock protects the hierarchy of video output devices + * (the video "bus"). The 'video_output' lock protects per-output + * data is equivalent to a softc lock for each video output. + */ ACPI_SERIAL_DECL(video, "ACPI video"); +ACPI_SERIAL_DECL(video_output, "ACPI video output"); MALLOC_DEFINE(M_ACPIVIDEO, "acpivideo", "ACPI video extension"); static int @@ -236,12 +248,14 @@ acpi_video_attach(device_t dev) acpi_sc = devclass_get_softc(devclass_find("acpi"), 0); if (acpi_sc == NULL) return (ENXIO); + ACPI_SERIAL_BEGIN(video); if (acpi_video_sysctl_tree == NULL) { acpi_video_sysctl_tree = SYSCTL_ADD_NODE(&acpi_video_sysctl_ctx, SYSCTL_CHILDREN(acpi_sc->acpi_sysctl_tree), OID_AUTO, "video", CTLFLAG_RD, 0, "video extension control"); } + ACPI_SERIAL_END(video); sc->device = dev; sc->handle = acpi_get_handle(dev); @@ -261,7 +275,7 @@ acpi_video_attach(device_t dev) * brightness levels. */ vid_set_switch_policy(sc->handle, DOS_SWITCH_BY_OSPM | - DOS_BRIGHTNESS_BY_BIOS); + DOS_BRIGHTNESS_BY_OSPM); acpi_video_power_profile(sc); @@ -316,6 +330,7 @@ acpi_video_notify_handler(ACPI_HANDLE handle, UINT32 notify, void *context) dss_p = 0; lasthand = NULL; ACPI_SERIAL_BEGIN(video); + ACPI_SERIAL_BEGIN(video_output); STAILQ_FOREACH(vo, &sc->vid_outputs, vo_next) { dss = vo_get_graphics_state(vo->handle); dcs = vo_get_device_status(vo->handle); @@ -331,6 +346,7 @@ acpi_video_notify_handler(ACPI_HANDLE handle, UINT32 notify, void *context) } if (lasthand != NULL) vo_set_device_state(lasthand, dss_p|DSS_COMMIT); + ACPI_SERIAL_END(video_output); ACPI_SERIAL_END(video); break; case VID_NOTIFY_REPROBE: @@ -367,12 +383,14 @@ acpi_video_power_profile(void *context) return; ACPI_SERIAL_BEGIN(video); + ACPI_SERIAL_BEGIN(video_output); STAILQ_FOREACH(vo, &sc->vid_outputs, vo_next) { if (vo->vo_levels != NULL && vo->vo_brightness == -1) vo_set_brightness(vo->handle, state == POWER_PROFILE_ECONOMY ? vo->vo_economy : vo->vo_fullpower); } + ACPI_SERIAL_END(video_output); ACPI_SERIAL_END(video); } @@ -550,7 +568,7 @@ static void acpi_video_vo_bind(struct acpi_video_output *vo, ACPI_HANDLE handle) { - ACPI_SERIAL_ASSERT(video); + ACPI_SERIAL_BEGIN(video_output); if (vo->vo_levels != NULL) AcpiOsFree(vo->vo_levels); vo->handle = handle; @@ -565,6 +583,10 @@ acpi_video_vo_bind(struct acpi_video_output *vo, ACPI_HANDLE handle) /* XXX - see above. */ vo->vo_economy = vo->vo_levels[BCL_ECONOMY]; } + if (vo->vo_levels != NULL) + AcpiInstallNotifyHandler(handle, ACPI_DEVICE_NOTIFY, + acpi_video_vo_notify_handler, vo); + ACPI_SERIAL_END(video_output); } static void @@ -577,8 +599,11 @@ acpi_video_vo_destroy(struct acpi_video_output *vo) vo->vo_sysctl_tree = NULL; sysctl_ctx_free(&vo->vo_sysctl_ctx); } - if (vo->vo_levels != NULL) + if (vo->vo_levels != NULL) { + AcpiRemoveNotifyHandler(vo->handle, ACPI_DEVICE_NOTIFY, + acpi_video_vo_notify_handler); AcpiOsFree(vo->vo_levels); + } switch (vo->adr & DOD_DEVID_MASK) { case DOD_DEVID_MONITOR: @@ -605,7 +630,7 @@ acpi_video_vo_check_level(struct acpi_video_output *vo, int level) { int i; - ACPI_SERIAL_ASSERT(video); + ACPI_SERIAL_ASSERT(video_output); if (vo->vo_levels == NULL) return (ENODEV); for (i = 0; i < vo->vo_numlevels; i++) @@ -614,6 +639,79 @@ acpi_video_vo_check_level(struct acpi_video_output *vo, int level) return (EINVAL); } +static void +acpi_video_vo_notify_handler(ACPI_HANDLE handle, UINT32 notify, void *context) +{ + struct acpi_video_output *vo; + int i, j, level, new_level; + + vo = context; + ACPI_SERIAL_BEGIN(video_output); + if (vo->handle != handle) + goto out; + + switch (notify) { + case VID_NOTIFY_CYCLE_BRN: + if (vo->vo_numlevels <= 3) + goto out; + /* FALLTHROUGH */ + case VID_NOTIFY_INC_BRN: + case VID_NOTIFY_DEC_BRN: + case VID_NOTIFY_ZERO_BRN: + if (vo->vo_levels == NULL) + goto out; + level = vo_get_brightness(handle); + if (level < 0) + goto out; + break; + default: + printf("unknown notify event 0x%x from %s\n", + notify, acpi_name(handle)); + goto out; + } + + new_level = level; + switch (notify) { + case VID_NOTIFY_CYCLE_BRN: + for (i = 2; i < vo->vo_numlevels; i++) + if (vo->vo_levels[i] == level) { + new_level = vo->vo_numlevels > i + 1 ? + vo->vo_levels[i + 1] : vo->vo_levels[2]; + break; + } + break; + case VID_NOTIFY_INC_BRN: + case VID_NOTIFY_DEC_BRN: + for (i = 0; i < vo->vo_numlevels; i++) { + j = vo->vo_levels[i]; + if (notify == VID_NOTIFY_INC_BRN) { + if (j > level && + (j < new_level || level == new_level)) + new_level = j; + } else { + if (j < level && + (j > new_level || level == new_level)) + new_level = j; + } + } + break; + case VID_NOTIFY_ZERO_BRN: + for (i = 0; i < vo->vo_numlevels; i++) + if (vo->vo_levels[i] == 0) { + new_level = 0; + break; + } + break; + } + if (new_level != level) { + vo_set_brightness(handle, new_level); + vo->vo_brightness = new_level; + } + +out: + ACPI_SERIAL_END(video_output); +} + /* ARGSUSED */ static int acpi_video_vo_active_sysctl(SYSCTL_HANDLER_ARGS) @@ -624,7 +722,7 @@ acpi_video_vo_active_sysctl(SYSCTL_HANDLER_ARGS) vo = (struct acpi_video_output *)arg1; if (vo->handle == NULL) return (ENXIO); - ACPI_SERIAL_BEGIN(video); + ACPI_SERIAL_BEGIN(video_output); state = (vo_get_device_status(vo->handle) & DCS_ACTIVE) ? 1 : 0; err = sysctl_handle_int(oidp, &state, 0, req); if (err != 0 || req->newptr == NULL) @@ -632,7 +730,7 @@ acpi_video_vo_active_sysctl(SYSCTL_HANDLER_ARGS) vo_set_device_state(vo->handle, DSS_COMMIT | (state ? DSS_ACTIVE : DSS_INACTIVE)); out: - ACPI_SERIAL_END(video); + ACPI_SERIAL_END(video_output); return (err); } @@ -644,7 +742,7 @@ acpi_video_vo_bright_sysctl(SYSCTL_HANDLER_ARGS) int level, preset, err; vo = (struct acpi_video_output *)arg1; - ACPI_SERIAL_BEGIN(video); + ACPI_SERIAL_BEGIN(video_output); if (vo->handle == NULL) { err = ENXIO; goto out; @@ -674,7 +772,7 @@ acpi_video_vo_bright_sysctl(SYSCTL_HANDLER_ARGS) vo_set_brightness(vo->handle, (level == -1) ? preset : level); out: - ACPI_SERIAL_END(video); + ACPI_SERIAL_END(video_output); return (err); } @@ -686,7 +784,7 @@ acpi_video_vo_presets_sysctl(SYSCTL_HANDLER_ARGS) err = 0; vo = (struct acpi_video_output *)arg1; - ACPI_SERIAL_BEGIN(video); + ACPI_SERIAL_BEGIN(video_output); if (vo->handle == NULL) { err = ENXIO; goto out; @@ -717,7 +815,7 @@ acpi_video_vo_presets_sysctl(SYSCTL_HANDLER_ARGS) *preset = level; out: - ACPI_SERIAL_END(video); + ACPI_SERIAL_END(video_output); return (err); } @@ -729,7 +827,7 @@ acpi_video_vo_levels_sysctl(SYSCTL_HANDLER_ARGS) int err; vo = (struct acpi_video_output *)arg1; - ACPI_SERIAL_BEGIN(video); + ACPI_SERIAL_BEGIN(video_output); if (vo->vo_levels == NULL) { err = ENODEV; goto out; @@ -742,7 +840,7 @@ acpi_video_vo_levels_sysctl(SYSCTL_HANDLER_ARGS) vo->vo_numlevels * sizeof(*vo->vo_levels), req); out: - ACPI_SERIAL_END(video); + ACPI_SERIAL_END(video_output); return (err); } @@ -826,7 +924,7 @@ vid_enum_outputs(ACPI_HANDLE handle, argset.dod_pkg = res; argset.count = 0; status = AcpiWalkNamespace(ACPI_TYPE_DEVICE, handle, 1, - vid_enum_outputs_subr, &argset, NULL); + vid_enum_outputs_subr, NULL, &argset, NULL); if (ACPI_FAILURE(status)) printf("failed walking down %s - %s\n", acpi_name(handle), AcpiFormatException(status)); @@ -887,11 +985,31 @@ out: return (num); } +static int +vo_get_brightness(ACPI_HANDLE handle) +{ + UINT32 level; + ACPI_STATUS status; + + ACPI_SERIAL_ASSERT(video_output); + status = acpi_GetInteger(handle, "_BQC", &level); + if (ACPI_FAILURE(status)) { + printf("can't evaluate %s._BQC - %s\n", acpi_name(handle), + AcpiFormatException(status)); + return (-1); + } + if (level > 100) + return (-1); + + return (level); +} + static void vo_set_brightness(ACPI_HANDLE handle, int level) { ACPI_STATUS status; + ACPI_SERIAL_ASSERT(video_output); status = acpi_SetInteger(handle, "_BCM", level); if (ACPI_FAILURE(status)) printf("can't evaluate %s._BCM - %s\n", @@ -904,6 +1022,7 @@ vo_get_device_status(ACPI_HANDLE handle) UINT32 dcs; ACPI_STATUS status; + ACPI_SERIAL_ASSERT(video_output); dcs = 0; status = acpi_GetInteger(handle, "_DCS", &dcs); if (ACPI_FAILURE(status)) @@ -933,6 +1052,7 @@ vo_set_device_state(ACPI_HANDLE handle, UINT32 state) { ACPI_STATUS status; + ACPI_SERIAL_ASSERT(video_output); status = acpi_SetInteger(handle, "_DSS", state); if (ACPI_FAILURE(status)) printf("can't evaluate %s._DSS - %s\n", diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h index f4d27e4738cf..f30ee6490d36 100644 --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -88,7 +88,6 @@ struct acpi_softc { struct acpi_device { /* ACPI ivars */ ACPI_HANDLE ad_handle; - uintptr_t ad_magic; void *ad_private; int ad_flags; @@ -224,7 +223,7 @@ extern int acpi_quirks; * attach to ACPI. */ #define ACPI_IVAR_HANDLE 0x100 -#define ACPI_IVAR_MAGIC 0x101 +#define ACPI_IVAR_UNUSED 0x101 /* Unused/reserved. */ #define ACPI_IVAR_PRIVATE 0x102 #define ACPI_IVAR_FLAGS 0x103 @@ -250,7 +249,6 @@ static __inline void varp ## _set_ ## var(device_t dev, type t) \ } __ACPI_BUS_ACCESSOR(acpi, handle, ACPI, HANDLE, ACPI_HANDLE) -__ACPI_BUS_ACCESSOR(acpi, magic, ACPI, MAGIC, uintptr_t) __ACPI_BUS_ACCESSOR(acpi, private, ACPI, PRIVATE, void *) __ACPI_BUS_ACCESSOR(acpi, flags, ACPI, FLAGS, int) @@ -447,7 +445,7 @@ int acpi_acad_get_acline(int *); #define ACPI_PKG_VALID(pkg, size) \ ((pkg) != NULL && (pkg)->Type == ACPI_TYPE_PACKAGE && \ (pkg)->Package.Count >= (size)) -int acpi_PkgInt(ACPI_OBJECT *res, int idx, ACPI_INTEGER *dst); +int acpi_PkgInt(ACPI_OBJECT *res, int idx, UINT64 *dst); int acpi_PkgInt32(ACPI_OBJECT *res, int idx, uint32_t *dst); int acpi_PkgStr(ACPI_OBJECT *res, int idx, void *dst, size_t size); int acpi_PkgGas(device_t dev, ACPI_OBJECT *res, int idx, int *type, diff --git a/sys/dev/adb/adb.h b/sys/dev/adb/adb.h index 10c3db235900..acb5ae27d4c6 100644 --- a/sys/dev/adb/adb.h +++ b/sys/dev/adb/adb.h @@ -69,6 +69,7 @@ uint8_t adb_get_device_handler(device_t dev); uint8_t adb_set_device_handler(device_t dev, uint8_t newhandler); size_t adb_read_register(device_t dev, u_char reg, void *data); +size_t adb_write_register(device_t dev, u_char reg, size_t len, void *data); /* Bits for implementing ADB host bus adapters */ extern devclass_t adb_devclass; diff --git a/sys/dev/adb/adb_bus.c b/sys/dev/adb/adb_bus.c index faab048b52c9..fd46f27e9630 100644 --- a/sys/dev/adb/adb_bus.c +++ b/sys/dev/adb/adb_bus.c @@ -402,3 +402,21 @@ adb_read_register(device_t dev, u_char reg, void *data) return (result); } +size_t +adb_write_register(device_t dev, u_char reg, size_t len, void *data) +{ + struct adb_softc *sc; + struct adb_devinfo *dinfo; + size_t result; + + dinfo = device_get_ivars(dev); + sc = device_get_softc(device_get_parent(dev)); + + result = adb_send_raw_packet_sync(sc->sc_dev,dinfo->address, + ADB_COMMAND_LISTEN, reg, len, (u_char *)data, NULL); + + result = adb_send_raw_packet_sync(sc->sc_dev,dinfo->address, + ADB_COMMAND_TALK, reg, 0, NULL, NULL); + + return (result); +} diff --git a/sys/dev/adb/adb_mouse.c b/sys/dev/adb/adb_mouse.c index f602f1cd08df..7eecb7ad7611 100644 --- a/sys/dev/adb/adb_mouse.c +++ b/sys/dev/adb/adb_mouse.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,8 @@ static int adb_mouse_probe(device_t dev); static int adb_mouse_attach(device_t dev); static int adb_mouse_detach(device_t dev); +static void adb_init_trackpad(device_t dev); +static int adb_tapping_sysctl(SYSCTL_HANDLER_ARGS); static d_open_t ams_open; static d_close_t ams_close; @@ -77,6 +80,8 @@ struct adb_mouse_softc { u_char id[4]; int buttons; + u_int sc_tapping; + int button_buf; int last_buttons; int xdelta, ydelta; @@ -167,6 +172,8 @@ adb_mouse_attach(device_t dev) sc->mode.packetsize = 5; sc->buttons = 0; + sc->sc_tapping = 0; + sc->button_buf = 0; sc->last_buttons = 0; sc->packet_read_len = 0; @@ -205,6 +212,7 @@ adb_mouse_attach(device_t dev) case 3: sc->flags |= AMS_TOUCHPAD; sc->hw.type = MOUSE_PAD; + adb_init_trackpad(dev); description = "Touchpad"; break; } @@ -259,6 +267,70 @@ adb_mouse_detach(device_t dev) return (0); } +static void +adb_init_trackpad(device_t dev) +{ + struct adb_mouse_softc *sc; + struct sysctl_ctx_list *ctx; + struct sysctl_oid *tree; + + size_t r1_len; + u_char r1[8]; + u_char r2[8]; + + sc = device_get_softc(dev); + + r1_len = adb_read_register(dev, 1, r1); + + /* An Extended Mouse register1 must return 8 bytes. */ + if (r1_len != 8) + return; + + if((r1[6] != 0x0d)) + { + r1[6] = 0x0d; + + adb_write_register(dev, 1, 8, r1); + + r1_len = adb_read_register(dev, 1, r1); + + if (r1[6] != 0x0d) + { + device_printf(dev, "ADB Mouse = 0x%x " + "(non-Extended Mode)\n", r1[6]); + return; + } else { + device_printf(dev, "ADB Mouse = 0x%x " + "(Extended Mode)\n", r1[6]); + + /* Set ADB Extended Features to default values, + enabled. */ + r2[0] = 0x19; /* Clicking: 0x19 disabled 0x99 enabled */ + r2[1] = 0x94; /* Dragging: 0x14 disabled 0x94 enabled */ + r2[2] = 0x19; + r2[3] = 0xff; /* DragLock: 0xff disabled 0xb2 enabled */ + r2[4] = 0xb2; + r2[5] = 0x8a; + r2[6] = 0x1b; + + r2[7] = 0x57; /* 0x57 bits 3:0 for W mode */ + + adb_write_register(dev, 2, 8, r2); + + } + } + + /* + * Set up sysctl + */ + ctx = device_get_sysctl_ctx(dev); + tree = device_get_sysctl_tree(dev); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, "tapping", + CTLTYPE_INT | CTLFLAG_RW, sc, 0, adb_tapping_sysctl, + "I", "Tapping the pad causes button events"); + return; +} + static u_int adb_mouse_receive_packet(device_t dev, u_char status, u_char command, u_char reg, int len, u_char *data) @@ -266,7 +338,7 @@ adb_mouse_receive_packet(device_t dev, u_char status, u_char command, struct adb_mouse_softc *sc; int i = 0; int xdelta, ydelta; - int buttons; + int buttons, tmp_buttons; sc = device_get_softc(dev); @@ -298,6 +370,30 @@ adb_mouse_receive_packet(device_t dev, u_char status, u_char command, if (ydelta & (0x40 << 3*(len-2))) ydelta |= 0xffffffc0 << 3*(len - 2); + if ((sc->flags & AMS_TOUCHPAD) && (sc->sc_tapping == 1)) { + tmp_buttons = buttons; + if (buttons == 0x12) { + /* Map a double tap on button 3. + Keep the button state for the next sequence. + A double tap sequence is followed by a single tap + sequence. + */ + tmp_buttons = 0x3; + sc->button_buf = tmp_buttons; + } else if (buttons == 0x2) { + /* Map a single tap on button 2. But only if it is + not a successor from a double tap. + */ + if (sc->button_buf != 0x3) + tmp_buttons = 0x2; + else + tmp_buttons = 0; + + sc->button_buf = 0; + } + buttons = tmp_buttons; + } + /* * Some mice report high-numbered buttons on the wrong button number, * so set the highest-numbered real button as pressed if there are @@ -554,3 +650,36 @@ ams_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, return (0); } +static int +adb_tapping_sysctl(SYSCTL_HANDLER_ARGS) +{ + struct adb_mouse_softc *sc = arg1; + device_t dev; + int error; + u_char r2[8]; + u_int tapping; + + dev = sc->sc_dev; + tapping = sc->sc_tapping; + + error = sysctl_handle_int(oidp, &tapping, 0, req); + + if (error || !req->newptr) + return (error); + + if (tapping == 1) { + adb_read_register(dev, 2, r2); + r2[0] = 0x99; /* enable tapping. */ + adb_write_register(dev, 2, 8, r2); + sc->sc_tapping = 1; + } else if (tapping == 0) { + adb_read_register(dev, 2, r2); + r2[0] = 0x19; /* disable tapping. */ + adb_write_register(dev, 2, 8, r2); + sc->sc_tapping = 0; + } + else + return (EINVAL); + + return (0); +} diff --git a/sys/dev/adlink/adlink.c b/sys/dev/adlink/adlink.c index 3568e8f3858d..2d98f895d556 100644 --- a/sys/dev/adlink/adlink.c +++ b/sys/dev/adlink/adlink.c @@ -161,7 +161,8 @@ adlink_intr(void *arg) } static int -adlink_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +adlink_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { struct softc *sc; vm_offset_t o; diff --git a/sys/dev/ae/if_ae.c b/sys/dev/ae/if_ae.c index da26ee79951b..68181f4b6d4d 100644 --- a/sys/dev/ae/if_ae.c +++ b/sys/dev/ae/if_ae.c @@ -367,6 +367,7 @@ ae_attach(device_t dev) if (ifp == NULL) { device_printf(dev, "could not allocate ifnet structure.\n"); error = ENXIO; + goto fail; } ifp->if_softc = sc; @@ -1047,7 +1048,7 @@ ae_get_reg_eaddr(ae_softc_t *sc, uint32_t *eaddr) if (AE_CHECK_EADDR_VALID(eaddr) != 0) { if (bootverbose) device_printf(sc->dev, - "Ethetnet address registers are invalid.\n"); + "Ethernet address registers are invalid.\n"); return (EINVAL); } return (0); @@ -2077,7 +2078,7 @@ ae_rxfilter(ae_softc_t *sc) TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - crc = ether_crc32_le(LLADDR((struct sockaddr_dl *) + crc = ether_crc32_be(LLADDR((struct sockaddr_dl *) ifma->ifma_addr), ETHER_ADDR_LEN); mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); } diff --git a/sys/dev/age/if_age.c b/sys/dev/age/if_age.c index f2a3725d90d4..3c5a10797743 100644 --- a/sys/dev/age/if_age.c +++ b/sys/dev/age/if_age.c @@ -74,9 +74,6 @@ __FBSDID("$FreeBSD$"); /* "device miibus" required. See GENERIC if you get errors here. */ #include "miibus_if.h" -#ifndef IFCAP_VLAN_HWTSO -#define IFCAP_VLAN_HWTSO 0 -#endif #define AGE_CSUM_FEATURES (CSUM_TCP | CSUM_UDP) MODULE_DEPEND(age, pci, 1, 1, 1); @@ -633,8 +630,8 @@ age_attach(device_t dev) ether_ifattach(ifp, sc->age_eaddr); /* VLAN capability setup. */ - ifp->if_capabilities |= IFCAP_VLAN_MTU; - ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM; + ifp->if_capabilities |= IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | + IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO; ifp->if_capenable = ifp->if_capabilities; /* Tell the upper layer(s) we support long frames. */ @@ -1892,29 +1889,19 @@ age_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if ((mask & IFCAP_WOL_MAGIC) != 0 && (ifp->if_capabilities & IFCAP_WOL_MAGIC) != 0) ifp->if_capenable ^= IFCAP_WOL_MAGIC; - - if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && - (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) { - ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; - age_rxvlan(sc); - } if ((mask & IFCAP_VLAN_HWCSUM) != 0 && (ifp->if_capabilities & IFCAP_VLAN_HWCSUM) != 0) ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; if ((mask & IFCAP_VLAN_HWTSO) != 0 && (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) ifp->if_capenable ^= IFCAP_VLAN_HWTSO; - /* - * VLAN hardware tagging is required to do checksum - * offload or TSO on VLAN interface. Checksum offload - * on VLAN interface also requires hardware assistance - * of parent interface. - */ - if ((ifp->if_capenable & IFCAP_TXCSUM) == 0) - ifp->if_capenable &= ~IFCAP_VLAN_HWCSUM; - if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) - ifp->if_capenable &= - ~(IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM); + if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) { + ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) + ifp->if_capenable &= ~IFCAP_VLAN_HWTSO; + age_rxvlan(sc); + } AGE_UNLOCK(sc); VLAN_CAPABILITIES(ifp); break; @@ -3135,7 +3122,7 @@ age_rxfilter(struct age_softc *sc) TAILQ_FOREACH(ifma, &sc->age_ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - crc = ether_crc32_le(LLADDR((struct sockaddr_dl *) + crc = ether_crc32_be(LLADDR((struct sockaddr_dl *) ifma->ifma_addr), ETHER_ADDR_LEN); mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); } diff --git a/sys/dev/agp/agp.c b/sys/dev/agp/agp.c index db7856127f5a..c992c931846c 100644 --- a/sys/dev/agp/agp.c +++ b/sys/dev/agp/agp.c @@ -763,7 +763,7 @@ agp_allocate_user(device_t dev, agp_allocate *alloc) static int agp_deallocate_user(device_t dev, int id) { - struct agp_memory *mem = agp_find_memory(dev, id);; + struct agp_memory *mem = agp_find_memory(dev, id); if (mem) { AGP_FREE_MEMORY(dev, mem); @@ -868,7 +868,8 @@ agp_ioctl(struct cdev *kdev, u_long cmd, caddr_t data, int fflag, struct thread } static int -agp_mmap(struct cdev *kdev, vm_offset_t offset, vm_paddr_t *paddr, int prot) +agp_mmap(struct cdev *kdev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { device_t dev = kdev->si_drv1; struct agp_softc *sc = device_get_softc(dev); diff --git a/sys/dev/agp/agp_i810.c b/sys/dev/agp/agp_i810.c index a1758244dee7..be51bb231c2a 100644 --- a/sys/dev/agp/agp_i810.c +++ b/sys/dev/agp/agp_i810.c @@ -175,6 +175,8 @@ static const struct agp_i810_match { "Intel Q45 SVGA controller"}, {0x2E228086, CHIP_G4X, 0x00020000, "Intel G45 SVGA controller"}, + {0x2E328086, CHIP_G4X, 0x00020000, + "Intel G41 SVGA controller"}, {0, 0, 0, NULL} }; diff --git a/sys/dev/agp/agp_via.c b/sys/dev/agp/agp_via.c index 76ce382488bd..c561513b1d4d 100644 --- a/sys/dev/agp/agp_via.c +++ b/sys/dev/agp/agp_via.c @@ -165,39 +165,16 @@ agp_via_attach(device_t dev) struct agp_gatt *gatt; int error; u_int32_t agpsel; + u_int32_t capid; - /* XXX: This should be keying off of whether the bridge is AGP3 capable, - * rather than a bunch of device ids for chipsets that happen to do 8x. - */ - switch (pci_get_devid(dev)) { - case 0x01981106: - case 0x02591106: - case 0x02691106: - case 0x02961106: - case 0x03141106: - case 0x03241106: - case 0x03271106: - case 0x03641106: - case 0x31231106: - case 0x31681106: - case 0x31891106: - case 0x32051106: - case 0x32581106: - case 0xb1981106: - /* The newer VIA chipsets will select the AGP version based on - * what AGP versions the card supports. We still have to - * program it using the v2 registers if it has chosen to use - * compatibility mode. - */ + sc->regs = via_v2_regs; + + /* Look at the capability register to see if we handle AGP3 */ + capid = pci_read_config(dev, agp_find_caps(dev) + AGP_CAPID, 4); + if (((capid >> 20) & 0x0f) >= 3) { agpsel = pci_read_config(dev, AGP_VIA_AGPSEL, 1); if ((agpsel & (1 << 1)) == 0) sc->regs = via_v3_regs; - else - sc->regs = via_v2_regs; - break; - default: - sc->regs = via_v2_regs; - break; } error = agp_generic_attach(dev); @@ -235,7 +212,7 @@ agp_via_attach(device_t dev) pci_write_config(dev, sc->regs[REG_ATTBASE], gatt->ag_physical, 4); /* Enable the aperture. */ - gartctrl = pci_read_config(dev, sc->regs[REG_ATTBASE], 4); + gartctrl = pci_read_config(dev, sc->regs[REG_GARTCTRL], 4); pci_write_config(dev, sc->regs[REG_GARTCTRL], gartctrl | (3 << 7), 4); } @@ -268,7 +245,7 @@ agp_via_get_aperture(device_t dev) u_int32_t apsize; if (sc->regs == via_v2_regs) { - apsize = pci_read_config(dev, sc->regs[REG_APSIZE], 1) & 0x1f; + apsize = pci_read_config(dev, sc->regs[REG_APSIZE], 1); /* * The size is determined by the number of low bits of @@ -295,8 +272,14 @@ agp_via_get_aperture(device_t dev) return 0x04000000; case 0xf38: return 0x02000000; + case 0xf3c: + return 0x01000000; + case 0xf3e: + return 0x00800000; + case 0xf3f: + return 0x00400000; default: - device_printf(dev, "Invalid aperture setting 0x%x", + device_printf(dev, "Invalid aperture setting 0x%x\n", pci_read_config(dev, sc->regs[REG_APSIZE], 2)); return 0; } @@ -345,6 +328,15 @@ agp_via_set_aperture(device_t dev, u_int32_t aperture) case 0x02000000: key = 0xf38; break; + case 0x01000000: + key = 0xf3c; + break; + case 0x00800000: + key = 0xf3e; + break; + case 0x00400000: + key = 0xf3f; + break; default: device_printf(dev, "Invalid aperture size (%dMb)\n", aperture / 1024 / 1024); diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c index 273c276bd2a9..c34bffea7d57 100644 --- a/sys/dev/ahci/ahci.c +++ b/sys/dev/ahci/ahci.c @@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include /* local prototypes */ @@ -72,21 +71,22 @@ static void ahci_dmasetprd(void *arg, bus_dma_segment_t *segs, int nsegs, int er static void ahci_execute_transaction(struct ahci_slot *slot); static void ahci_timeout(struct ahci_slot *slot); static void ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et); -static int ahci_setup_fis(struct ahci_cmd_tab *ctp, union ccb *ccb, int tag); +static int ahci_setup_fis(device_t dev, struct ahci_cmd_tab *ctp, union ccb *ccb, int tag); static void ahci_dmainit(device_t dev); static void ahci_dmasetupc_cb(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); static void ahci_dmafini(device_t dev); static void ahci_slotsalloc(device_t dev); static void ahci_slotsfree(device_t dev); static void ahci_reset(device_t dev); -static void ahci_start(device_t dev); +static void ahci_start(device_t dev, int fbs); static void ahci_stop(device_t dev); static void ahci_clo(device_t dev); static void ahci_start_fr(device_t dev); static void ahci_stop_fr(device_t dev); static int ahci_sata_connect(struct ahci_channel *ch); -static int ahci_sata_phy_reset(device_t dev, int quick); +static int ahci_sata_phy_reset(device_t dev); +static int ahci_wait_ready(device_t dev, int t); static void ahci_issue_read_log(device_t dev); static void ahci_process_read_log(device_t dev, union ccb *ccb); @@ -96,23 +96,208 @@ static void ahcipoll(struct cam_sim *sim); MALLOC_DEFINE(M_AHCI, "AHCI driver", "AHCI driver data buffers"); -/* - * AHCI v1.x compliant SATA chipset support functions - */ +static struct { + uint32_t id; + uint8_t rev; + const char *name; + int quirks; +#define AHCI_Q_NOFORCE 1 +#define AHCI_Q_NOPMP 2 +#define AHCI_Q_NONCQ 4 +#define AHCI_Q_1CH 8 +#define AHCI_Q_2CH 16 +#define AHCI_Q_4CH 32 +#define AHCI_Q_EDGEIS 64 +#define AHCI_Q_SATA2 128 +#define AHCI_Q_NOBSYRES 256 +} ahci_ids[] = { + {0x43801002, 0x00, "ATI IXP600", 0}, + {0x43901002, 0x00, "ATI IXP700", 0}, + {0x43911002, 0x00, "ATI IXP700", 0}, + {0x43921002, 0x00, "ATI IXP700", 0}, + {0x43931002, 0x00, "ATI IXP700", 0}, + {0x43941002, 0x00, "ATI IXP800", 0}, + {0x43951002, 0x00, "ATI IXP800", 0}, + {0x26528086, 0x00, "Intel ICH6", AHCI_Q_NOFORCE}, + {0x26538086, 0x00, "Intel ICH6M", AHCI_Q_NOFORCE}, + {0x26818086, 0x00, "Intel ESB2", 0}, + {0x26828086, 0x00, "Intel ESB2", 0}, + {0x26838086, 0x00, "Intel ESB2", 0}, + {0x27c18086, 0x00, "Intel ICH7", 0}, + {0x27c38086, 0x00, "Intel ICH7", 0}, + {0x27c58086, 0x00, "Intel ICH7M", 0}, + {0x27c68086, 0x00, "Intel ICH7M", 0}, + {0x28218086, 0x00, "Intel ICH8", 0}, + {0x28228086, 0x00, "Intel ICH8", 0}, + {0x28248086, 0x00, "Intel ICH8", 0}, + {0x28298086, 0x00, "Intel ICH8M", 0}, + {0x282a8086, 0x00, "Intel ICH8M", 0}, + {0x29228086, 0x00, "Intel ICH9", 0}, + {0x29238086, 0x00, "Intel ICH9", 0}, + {0x29248086, 0x00, "Intel ICH9", 0}, + {0x29258086, 0x00, "Intel ICH9", 0}, + {0x29278086, 0x00, "Intel ICH9", 0}, + {0x29298086, 0x00, "Intel ICH9M", 0}, + {0x292a8086, 0x00, "Intel ICH9M", 0}, + {0x292b8086, 0x00, "Intel ICH9M", 0}, + {0x292c8086, 0x00, "Intel ICH9M", 0}, + {0x292f8086, 0x00, "Intel ICH9M", 0}, + {0x294d8086, 0x00, "Intel ICH9", 0}, + {0x294e8086, 0x00, "Intel ICH9M", 0}, + {0x3a058086, 0x00, "Intel ICH10", 0}, + {0x3a228086, 0x00, "Intel ICH10", 0}, + {0x3a258086, 0x00, "Intel ICH10", 0}, + {0x3b228086, 0x00, "Intel PCH", 0}, + {0x3b238086, 0x00, "Intel PCH", 0}, + {0x3b248086, 0x00, "Intel PCH", 0}, + {0x3b258086, 0x00, "Intel PCH", 0}, + {0x3b298086, 0x00, "Intel PCH", 0}, + {0x3b2b8086, 0x00, "Intel PCH", 0}, + {0x3b2c8086, 0x00, "Intel PCH", 0}, + {0x3b2f8086, 0x00, "Intel PCH", 0}, + {0x2361197b, 0x00, "JMicron JMB361", AHCI_Q_NOFORCE}, + {0x2363197b, 0x00, "JMicron JMB363", AHCI_Q_NOFORCE}, + {0x2365197b, 0x00, "JMicron JMB365", AHCI_Q_NOFORCE}, + {0x2366197b, 0x00, "JMicron JMB366", AHCI_Q_NOFORCE}, + {0x2368197b, 0x00, "JMicron JMB368", AHCI_Q_NOFORCE}, + {0x611111ab, 0x00, "Marvell 88SX6111", AHCI_Q_NOFORCE|AHCI_Q_1CH|AHCI_Q_EDGEIS}, + {0x612111ab, 0x00, "Marvell 88SX6121", AHCI_Q_NOFORCE|AHCI_Q_2CH|AHCI_Q_EDGEIS}, + {0x614111ab, 0x00, "Marvell 88SX6141", AHCI_Q_NOFORCE|AHCI_Q_4CH|AHCI_Q_EDGEIS}, + {0x614511ab, 0x00, "Marvell 88SX6145", AHCI_Q_NOFORCE|AHCI_Q_4CH|AHCI_Q_EDGEIS}, + {0x91231b4b, 0x11, "Marvell 88SE912x", AHCI_Q_NOBSYRES}, + {0x91231b4b, 0x00, "Marvell 88SE912x", AHCI_Q_EDGEIS|AHCI_Q_SATA2|AHCI_Q_NOBSYRES}, + {0x044c10de, 0x00, "NVIDIA MCP65", 0}, + {0x044d10de, 0x00, "NVIDIA MCP65", 0}, + {0x044e10de, 0x00, "NVIDIA MCP65", 0}, + {0x044f10de, 0x00, "NVIDIA MCP65", 0}, + {0x045c10de, 0x00, "NVIDIA MCP65", 0}, + {0x045d10de, 0x00, "NVIDIA MCP65", 0}, + {0x045e10de, 0x00, "NVIDIA MCP65", 0}, + {0x045f10de, 0x00, "NVIDIA MCP65", 0}, + {0x055010de, 0x00, "NVIDIA MCP67", 0}, + {0x055110de, 0x00, "NVIDIA MCP67", 0}, + {0x055210de, 0x00, "NVIDIA MCP67", 0}, + {0x055310de, 0x00, "NVIDIA MCP67", 0}, + {0x055410de, 0x00, "NVIDIA MCP67", 0}, + {0x055510de, 0x00, "NVIDIA MCP67", 0}, + {0x055610de, 0x00, "NVIDIA MCP67", 0}, + {0x055710de, 0x00, "NVIDIA MCP67", 0}, + {0x055810de, 0x00, "NVIDIA MCP67", 0}, + {0x055910de, 0x00, "NVIDIA MCP67", 0}, + {0x055A10de, 0x00, "NVIDIA MCP67", 0}, + {0x055B10de, 0x00, "NVIDIA MCP67", 0}, + {0x058410de, 0x00, "NVIDIA MCP67", 0}, + {0x07f010de, 0x00, "NVIDIA MCP73", 0}, + {0x07f110de, 0x00, "NVIDIA MCP73", 0}, + {0x07f210de, 0x00, "NVIDIA MCP73", 0}, + {0x07f310de, 0x00, "NVIDIA MCP73", 0}, + {0x07f410de, 0x00, "NVIDIA MCP73", 0}, + {0x07f510de, 0x00, "NVIDIA MCP73", 0}, + {0x07f610de, 0x00, "NVIDIA MCP73", 0}, + {0x07f710de, 0x00, "NVIDIA MCP73", 0}, + {0x07f810de, 0x00, "NVIDIA MCP73", 0}, + {0x07f910de, 0x00, "NVIDIA MCP73", 0}, + {0x07fa10de, 0x00, "NVIDIA MCP73", 0}, + {0x07fb10de, 0x00, "NVIDIA MCP73", 0}, + {0x0ad010de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad110de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad210de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad310de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad410de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad510de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad610de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad710de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad810de, 0x00, "NVIDIA MCP77", 0}, + {0x0ad910de, 0x00, "NVIDIA MCP77", 0}, + {0x0ada10de, 0x00, "NVIDIA MCP77", 0}, + {0x0adb10de, 0x00, "NVIDIA MCP77", 0}, + {0x0ab410de, 0x00, "NVIDIA MCP79", 0}, + {0x0ab510de, 0x00, "NVIDIA MCP79", 0}, + {0x0ab610de, 0x00, "NVIDIA MCP79", 0}, + {0x0ab710de, 0x00, "NVIDIA MCP79", 0}, + {0x0ab810de, 0x00, "NVIDIA MCP79", 0}, + {0x0ab910de, 0x00, "NVIDIA MCP79", 0}, + {0x0aba10de, 0x00, "NVIDIA MCP79", 0}, + {0x0abb10de, 0x00, "NVIDIA MCP79", 0}, + {0x0abc10de, 0x00, "NVIDIA MCP79", 0}, + {0x0abd10de, 0x00, "NVIDIA MCP79", 0}, + {0x0abe10de, 0x00, "NVIDIA MCP79", 0}, + {0x0abf10de, 0x00, "NVIDIA MCP79", 0}, + {0x0d8410de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8510de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8610de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8710de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8810de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8910de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8a10de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8b10de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8c10de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8d10de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8e10de, 0x00, "NVIDIA MCP89", 0}, + {0x0d8f10de, 0x00, "NVIDIA MCP89", 0}, + {0x33491106, 0x00, "VIA VT8251", 0}, + {0x62871106, 0x00, "VIA VT8251", 0}, + {0x11841039, 0x00, "SiS 966", 0}, + {0x11851039, 0x00, "SiS 968", 0}, + {0x01861039, 0x00, "SiS 968", 0}, + {0x00000000, 0x00, NULL, 0} +}; + static int ahci_probe(device_t dev) { + char buf[64]; + int i, valid = 0; + uint32_t devid = pci_get_devid(dev); + uint8_t revid = pci_get_revid(dev); - /* is this a possible AHCI candidate ? */ - if (pci_get_class(dev) != PCIC_STORAGE || - pci_get_subclass(dev) != PCIS_STORAGE_SATA) + /* Is this a possible AHCI candidate? */ + if (pci_get_class(dev) == PCIC_STORAGE && + pci_get_subclass(dev) == PCIS_STORAGE_SATA && + pci_get_progif(dev) == PCIP_STORAGE_SATA_AHCI_1_0) + valid = 1; + /* Is this a known AHCI chip? */ + for (i = 0; ahci_ids[i].id != 0; i++) { + if (ahci_ids[i].id == devid && + ahci_ids[i].rev <= revid && + (valid || !(ahci_ids[i].quirks & AHCI_Q_NOFORCE))) { + /* Do not attach JMicrons with single PCI function. */ + if (pci_get_vendor(dev) == 0x197b && + (pci_read_config(dev, 0xdf, 1) & 0x40) == 0) + return (ENXIO); + snprintf(buf, sizeof(buf), "%s AHCI SATA controller", + ahci_ids[i].name); + device_set_desc_copy(dev, buf); + return (BUS_PROBE_VENDOR); + } + } + if (!valid) return (ENXIO); + device_set_desc_copy(dev, "AHCI SATA controller"); + return (BUS_PROBE_VENDOR); +} - /* is this PCI device flagged as an AHCI compliant chip ? */ - if (pci_get_progif(dev) != PCIP_STORAGE_SATA_AHCI_1_0) +static int +ahci_ata_probe(device_t dev) +{ + char buf[64]; + int i; + uint32_t devid = pci_get_devid(dev); + uint8_t revid = pci_get_revid(dev); + + if ((intptr_t)device_get_ivars(dev) >= 0) return (ENXIO); - - device_set_desc_copy(dev, "AHCI controller"); + /* Is this a known AHCI chip? */ + for (i = 0; ahci_ids[i].id != 0; i++) { + if (ahci_ids[i].id == devid && + ahci_ids[i].rev <= revid) { + snprintf(buf, sizeof(buf), "%s AHCI SATA controller", + ahci_ids[i].name); + device_set_desc_copy(dev, buf); + return (BUS_PROBE_VENDOR); + } + } + device_set_desc_copy(dev, "AHCI SATA controller"); return (BUS_PROBE_VENDOR); } @@ -121,10 +306,18 @@ ahci_attach(device_t dev) { struct ahci_controller *ctlr = device_get_softc(dev); device_t child; - int error, unit, speed; + int error, unit, speed, i; + uint32_t devid = pci_get_devid(dev); + uint8_t revid = pci_get_revid(dev); u_int32_t version; ctlr->dev = dev; + i = 0; + while (ahci_ids[i].id != 0 && + (ahci_ids[i].id != devid || + ahci_ids[i].rev > revid)) + i++; + ctlr->quirks = ahci_ids[i].quirks; resource_int_value(device_get_name(dev), device_get_unit(dev), "ccc", &ctlr->ccc); /* if we have a memory BAR(5) we are likely on an AHCI part */ @@ -151,10 +344,34 @@ ahci_attach(device_t dev) rman_fini(&ctlr->sc_iomem); return (error); }; - /* Get the number of HW channels */ + /* Get the HW capabilities */ + version = ATA_INL(ctlr->r_mem, AHCI_VS); + ctlr->caps = ATA_INL(ctlr->r_mem, AHCI_CAP); + if (version >= 0x00010020) + ctlr->caps2 = ATA_INL(ctlr->r_mem, AHCI_CAP2); + if (ctlr->caps & AHCI_CAP_EMS) + ctlr->capsem = ATA_INL(ctlr->r_mem, AHCI_EM_CTL); ctlr->ichannels = ATA_INL(ctlr->r_mem, AHCI_PI); + if (ctlr->quirks & AHCI_Q_1CH) { + ctlr->caps &= ~AHCI_CAP_NPMASK; + ctlr->ichannels &= 0x01; + } + if (ctlr->quirks & AHCI_Q_2CH) { + ctlr->caps &= ~AHCI_CAP_NPMASK; + ctlr->caps |= 1; + ctlr->ichannels &= 0x03; + } + if (ctlr->quirks & AHCI_Q_4CH) { + ctlr->caps &= ~AHCI_CAP_NPMASK; + ctlr->caps |= 3; + ctlr->ichannels &= 0x0f; + } ctlr->channels = MAX(flsl(ctlr->ichannels), - (ATA_INL(ctlr->r_mem, AHCI_CAP) & AHCI_CAP_NPMASK) + 1); + (ctlr->caps & AHCI_CAP_NPMASK) + 1); + if (ctlr->quirks & AHCI_Q_NOPMP) + ctlr->caps &= ~AHCI_CAP_SPM; + if (ctlr->quirks & AHCI_Q_NONCQ) + ctlr->caps &= ~AHCI_CAP_SNCQ; /* Setup interrupts. */ if (ahci_setup_interrupt(dev)) { bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem); @@ -162,20 +379,18 @@ ahci_attach(device_t dev) return ENXIO; } /* Announce HW capabilities. */ - version = ATA_INL(ctlr->r_mem, AHCI_VS); - ctlr->caps = ATA_INL(ctlr->r_mem, AHCI_CAP); - if (version >= 0x00010020) - ctlr->caps2 = ATA_INL(ctlr->r_mem, AHCI_CAP2); speed = (ctlr->caps & AHCI_CAP_ISS) >> AHCI_CAP_ISS_SHIFT; device_printf(dev, - "AHCI v%x.%02x with %d %sGbps ports, Port Multiplier %s\n", + "AHCI v%x.%02x with %d %sGbps ports, Port Multiplier %s%s\n", ((version >> 20) & 0xf0) + ((version >> 16) & 0x0f), ((version >> 4) & 0xf0) + (version & 0x0f), (ctlr->caps & AHCI_CAP_NPMASK) + 1, ((speed == 1) ? "1.5":((speed == 2) ? "3": ((speed == 3) ? "6":"?"))), (ctlr->caps & AHCI_CAP_SPM) ? - "supported" : "not supported"); + "supported" : "not supported", + (ctlr->caps & AHCI_CAP_FBSS) ? + " with FBS" : ""); if (bootverbose) { device_printf(dev, "Caps:%s%s%s%s%s%s%s%s %sGbps", (ctlr->caps & AHCI_CAP_64BIT) ? " 64bit":"", @@ -207,6 +422,17 @@ ahci_attach(device_t dev) (ctlr->caps2 & AHCI_CAP2_NVMP) ? " NVMP":"", (ctlr->caps2 & AHCI_CAP2_BOH) ? " BOH":""); } + if (bootverbose && (ctlr->caps & AHCI_CAP_EMS)) { + device_printf(dev, "EM Caps:%s%s%s%s%s%s%s%s\n", + (ctlr->capsem & AHCI_EM_PM) ? " PM":"", + (ctlr->capsem & AHCI_EM_ALHD) ? " ALHD":"", + (ctlr->capsem & AHCI_EM_XMT) ? " XMT":"", + (ctlr->capsem & AHCI_EM_SMB) ? " SMB":"", + (ctlr->capsem & AHCI_EM_SGPIO) ? " SGPIO":"", + (ctlr->capsem & AHCI_EM_SES2) ? " SES-2":"", + (ctlr->capsem & AHCI_EM_SAFTE) ? " SAF-TE":"", + (ctlr->capsem & AHCI_EM_LED) ? " LED":""); + } /* Attach all channels on this controller */ for (unit = 0; unit < ctlr->channels; unit++) { if ((ctlr->ichannels & (1 << unit)) == 0) @@ -371,6 +597,12 @@ ahci_setup_interrupt(device_t dev) device_printf(dev, "unable to setup interrupt\n"); return ENXIO; } + if (ctlr->numirqs > 1) { + bus_describe_intr(dev, ctlr->irqs[i].r_irq, + ctlr->irqs[i].handle, + ctlr->irqs[i].mode == AHCI_IRQ_MODE_ONE ? + "ch%d" : "%d", i); + } } return (0); } @@ -397,13 +629,18 @@ ahci_intr(void *data) unit = irq->r_irq_rid - 1; is = ATA_INL(ctlr->r_mem, AHCI_IS); } + /* Some controllers have edge triggered IS. */ + if (ctlr->quirks & AHCI_Q_EDGEIS) + ATA_OUTL(ctlr->r_mem, AHCI_IS, is); for (; unit < ctlr->channels; unit++) { if ((is & (1 << unit)) != 0 && (arg = ctlr->interrupt[unit].argument)) { - ctlr->interrupt[unit].function(arg); - ATA_OUTL(ctlr->r_mem, AHCI_IS, 1 << unit); + ctlr->interrupt[unit].function(arg); } } + /* AHCI declares level triggered IS. */ + if (!(ctlr->quirks & AHCI_Q_EDGEIS)) + ATA_OUTL(ctlr->r_mem, AHCI_IS, is); } /* @@ -418,8 +655,14 @@ ahci_intr_one(void *data) int unit; unit = irq->r_irq_rid - 1; + /* Some controllers have edge triggered IS. */ + if (ctlr->quirks & AHCI_Q_EDGEIS) + ATA_OUTL(ctlr->r_mem, AHCI_IS, 1 << unit); if ((arg = ctlr->interrupt[unit].argument)) ctlr->interrupt[unit].function(arg); + /* AHCI declares level triggered IS. */ + if (!(ctlr->quirks & AHCI_Q_EDGEIS)) + ATA_OUTL(ctlr->r_mem, AHCI_IS, 1 << unit); } static struct resource * @@ -534,6 +777,25 @@ static driver_t ahci_driver = { sizeof(struct ahci_controller) }; DRIVER_MODULE(ahci, pci, ahci_driver, ahci_devclass, 0, 0); +static device_method_t ahci_ata_methods[] = { + DEVMETHOD(device_probe, ahci_ata_probe), + DEVMETHOD(device_attach, ahci_attach), + DEVMETHOD(device_detach, ahci_detach), + DEVMETHOD(device_suspend, ahci_suspend), + DEVMETHOD(device_resume, ahci_resume), + DEVMETHOD(bus_print_child, ahci_print_child), + DEVMETHOD(bus_alloc_resource, ahci_alloc_resource), + DEVMETHOD(bus_release_resource, ahci_release_resource), + DEVMETHOD(bus_setup_intr, ahci_setup_intr), + DEVMETHOD(bus_teardown_intr,ahci_teardown_intr), + { 0, 0 } +}; +static driver_t ahci_ata_driver = { + "ahci", + ahci_ata_methods, + sizeof(struct ahci_controller) +}; +DRIVER_MODULE(ahci, atapci, ahci_ata_driver, ahci_devclass, 0, 0); MODULE_VERSION(ahci, 1); MODULE_DEPEND(ahci, cam, 1, 1, 1); @@ -551,12 +813,14 @@ ahci_ch_attach(device_t dev) struct ahci_controller *ctlr = device_get_softc(device_get_parent(dev)); struct ahci_channel *ch = device_get_softc(dev); struct cam_devq *devq; - int rid, error; + int rid, error, i, sata_rev = 0; + u_int32_t version; ch->dev = dev; ch->unit = (intptr_t)device_get_ivars(dev); ch->caps = ctlr->caps; ch->caps2 = ctlr->caps2; + ch->quirks = ctlr->quirks; ch->numslots = ((ch->caps & AHCI_CAP_NCS) >> AHCI_CAP_NCS_SHIFT) + 1, mtx_init(&ch->mtx, "AHCI channel lock", NULL, MTX_DEF); resource_int_value(device_get_name(dev), @@ -569,9 +833,18 @@ ahci_ch_attach(device_t dev) pci_get_subvendor(ctlr->dev) == 0x1043 && pci_get_subdevice(ctlr->dev) == 0x81e4 && ch->unit == 0) - ch->sata_rev = 1; + sata_rev = 1; + if (ch->quirks & AHCI_Q_SATA2) + sata_rev = 2; resource_int_value(device_get_name(dev), - device_get_unit(dev), "sata_rev", &ch->sata_rev); + device_get_unit(dev), "sata_rev", &sata_rev); + for (i = 0; i < 16; i++) { + ch->user[i].revision = sata_rev; + ch->user[i].mode = 0; + ch->user[i].bytecount = 8192; + ch->user[i].tags = ch->numslots; + ch->curr[i] = ch->user[i]; + } rid = ch->unit; if (!(ch->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE))) @@ -593,6 +866,18 @@ ahci_ch_attach(device_t dev) error = ENXIO; goto err1; } + ch->chcaps = ATA_INL(ch->r_mem, AHCI_P_CMD); + version = ATA_INL(ctlr->r_mem, AHCI_VS); + if (version < 0x00010020 && (ctlr->caps & AHCI_CAP_FBSS)) + ch->chcaps |= AHCI_P_CMD_FBSCP; + if (bootverbose) { + device_printf(dev, "Caps:%s%s%s%s%s\n", + (ch->chcaps & AHCI_P_CMD_HPCP) ? " HPCP":"", + (ch->chcaps & AHCI_P_CMD_MPSP) ? " MPSP":"", + (ch->chcaps & AHCI_P_CMD_CPD) ? " CPD":"", + (ch->chcaps & AHCI_P_CMD_ESP) ? " ESP":"", + (ch->chcaps & AHCI_P_CMD_FBSCP) ? " FBSCP":""); + } /* Create the device queue for our SIM. */ devq = cam_simq_alloc(ch->numslots); if (devq == NULL) { @@ -602,7 +887,10 @@ ahci_ch_attach(device_t dev) } /* Construct SIM entry */ ch->sim = cam_sim_alloc(ahciaction, ahcipoll, "ahcich", ch, - device_get_unit(dev), &ch->mtx, ch->numslots, 0, devq); + device_get_unit(dev), &ch->mtx, + min(2, ch->numslots), + (ch->caps & AHCI_CAP_SNCQ) ? ch->numslots : 0, + devq); if (ch->sim == NULL) { device_printf(dev, "unable to allocate sim\n"); error = ENOMEM; @@ -706,7 +994,7 @@ ahci_ch_resume(device_t dev) ((ch->pm_level == 2 || ch->pm_level == 3) ? AHCI_P_CMD_ALPE : 0) | ((ch->pm_level > 2) ? AHCI_P_CMD_ASP : 0 ))); ahci_start_fr(dev); - ahci_start(dev); + ahci_start(dev, 1); return (0); } @@ -724,7 +1012,7 @@ static driver_t ahcich_driver = { ahcich_methods, sizeof(struct ahci_channel) }; -DRIVER_MODULE(ahcich, ahci, ahcich_driver, ahci_devclass, 0, 0); +DRIVER_MODULE(ahcich, ahci, ahcich_driver, ahcich_devclass, 0, 0); struct ahci_dc_cb_args { bus_addr_t maddr; @@ -736,6 +1024,7 @@ ahci_dmainit(device_t dev) { struct ahci_channel *ch = device_get_softc(dev); struct ahci_dc_cb_args dcba; + size_t rfsize; if (ch->caps & AHCI_CAP_64BIT) ch->dma.max_address = BUS_SPACE_MAXADDR; @@ -757,16 +1046,20 @@ ahci_dmainit(device_t dev) } ch->dma.work_bus = dcba.maddr; /* FIS receive area. */ - if (bus_dma_tag_create(bus_get_dma_tag(dev), 4096, 0, + if (ch->chcaps & AHCI_P_CMD_FBSCP) + rfsize = 4096; + else + rfsize = 256; + if (bus_dma_tag_create(bus_get_dma_tag(dev), rfsize, 0, ch->dma.max_address, BUS_SPACE_MAXADDR, - NULL, NULL, 4096, 1, 4096, + NULL, NULL, rfsize, 1, rfsize, 0, NULL, NULL, &ch->dma.rfis_tag)) goto error; if (bus_dmamem_alloc(ch->dma.rfis_tag, (void **)&ch->dma.rfis, 0, &ch->dma.rfis_map)) goto error; if (bus_dmamap_load(ch->dma.rfis_tag, ch->dma.rfis_map, ch->dma.rfis, - 4096, ahci_dmasetupc_cb, &dcba, 0) || dcba.error) { + rfsize, ahci_dmasetupc_cb, &dcba, 0) || dcba.error) { bus_dmamem_free(ch->dma.rfis_tag, ch->dma.rfis, ch->dma.rfis_map); goto error; } @@ -866,27 +1159,32 @@ ahci_slotsfree(device_t dev) } static void -ahci_phy_check_events(device_t dev) +ahci_phy_check_events(device_t dev, u_int32_t serr) { struct ahci_channel *ch = device_get_softc(dev); - u_int32_t error = ATA_INL(ch->r_mem, AHCI_P_SERR); - /* Clear error bits/interrupt */ - ATA_OUTL(ch->r_mem, AHCI_P_SERR, error); - /* If we have a connection event, deal with it */ - if ((error & ATA_SE_PHY_CHANGED) && (ch->pm_level == 0)) { + if ((serr & ATA_SE_PHY_CHANGED) && (ch->pm_level == 0)) { u_int32_t status = ATA_INL(ch->r_mem, AHCI_P_SSTS); - if (((status & ATA_SS_DET_MASK) == ATA_SS_DET_PHY_ONLINE) && - ((status & ATA_SS_SPD_MASK) != ATA_SS_SPD_NO_SPEED) && - ((status & ATA_SS_IPM_MASK) == ATA_SS_IPM_ACTIVE)) { - if (bootverbose) + union ccb *ccb; + + if (bootverbose) { + if (((status & ATA_SS_DET_MASK) == ATA_SS_DET_PHY_ONLINE) && + ((status & ATA_SS_SPD_MASK) != ATA_SS_SPD_NO_SPEED) && + ((status & ATA_SS_IPM_MASK) == ATA_SS_IPM_ACTIVE)) { device_printf(dev, "CONNECT requested\n"); - ahci_reset(dev); - } else { - if (bootverbose) + } else device_printf(dev, "DISCONNECT requested\n"); - ch->devices = 0; } + ahci_reset(dev); + if ((ccb = xpt_alloc_ccb_nowait()) == NULL) + return; + if (xpt_create_path(&ccb->ccb_h.path, NULL, + cam_sim_path(ch->sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + xpt_free_ccb(ccb); + return; + } + xpt_rescan(ccb); } } @@ -897,7 +1195,8 @@ ahci_notify_events(device_t dev, u_int32_t status) struct cam_path *dpath; int i; - ATA_OUTL(ch->r_mem, AHCI_P_SNTF, status); + if (ch->caps & AHCI_CAP_SSNTF) + ATA_OUTL(ch->r_mem, AHCI_P_SNTF, status); if (bootverbose) device_printf(dev, "SNTF 0x%04x\n", status); for (i = 0; i < 16; i++) { @@ -944,9 +1243,9 @@ ahci_ch_intr(void *data) { device_t dev = (device_t)data; struct ahci_channel *ch = device_get_softc(dev); - uint32_t istatus, sstatus, cstatus, sntf = 0, ok, err; + uint32_t istatus, sstatus, cstatus, serr = 0, sntf = 0, ok, err; enum ahci_err_type et; - int i, ccs, ncq_err = 0; + int i, ccs, port; /* Read and clear interrupt statuses. */ istatus = ATA_INL(ch->r_mem, AHCI_P_IS); @@ -956,26 +1255,67 @@ ahci_ch_intr(void *data) /* Read command statuses. */ sstatus = ATA_INL(ch->r_mem, AHCI_P_SACT); cstatus = ATA_INL(ch->r_mem, AHCI_P_CI); - if ((istatus & AHCI_P_IX_SDB) && (ch->caps & AHCI_CAP_SSNTF)) - sntf = ATA_INL(ch->r_mem, AHCI_P_SNTF); + if (istatus & AHCI_P_IX_SDB) { + if (ch->caps & AHCI_CAP_SSNTF) + sntf = ATA_INL(ch->r_mem, AHCI_P_SNTF); + else if (ch->fbs_enabled) { + u_int8_t *fis = ch->dma.rfis + 0x58; + + for (i = 0; i < 16; i++) { + if (fis[1] & 0x80) { + fis[1] &= 0x7f; + sntf |= 1 << i; + } + fis += 256; + } + } else { + u_int8_t *fis = ch->dma.rfis + 0x58; + + if (fis[1] & 0x80) + sntf = (1 << (fis[1] & 0x0f)); + } + } /* Process PHY events */ - if (istatus & (AHCI_P_IX_PRC | AHCI_P_IX_PC)) - ahci_phy_check_events(dev); + if (istatus & (AHCI_P_IX_PC | AHCI_P_IX_PRC | AHCI_P_IX_OF | + AHCI_P_IX_IF | AHCI_P_IX_HBD | AHCI_P_IX_HBF | AHCI_P_IX_TFE)) { + serr = ATA_INL(ch->r_mem, AHCI_P_SERR); + if (serr) { + ATA_OUTL(ch->r_mem, AHCI_P_SERR, serr); + ahci_phy_check_events(dev, serr); + } + } /* Process command errors */ - if (istatus & (AHCI_P_IX_IF | AHCI_P_IX_HBD | AHCI_P_IX_HBF | - AHCI_P_IX_TFE | AHCI_P_IX_OF)) { -//device_printf(dev, "%s ERROR is %08x cs %08x ss %08x rs %08x tfd %02x serr %08x\n", -// __func__, istatus, cstatus, sstatus, ch->rslots, ATA_INL(ch->r_mem, AHCI_P_TFD), -// ATA_INL(ch->r_mem, AHCI_P_SERR)); + if (istatus & (AHCI_P_IX_OF | AHCI_P_IX_IF | + AHCI_P_IX_HBD | AHCI_P_IX_HBF | AHCI_P_IX_TFE)) { ccs = (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_CCS_MASK) >> AHCI_P_CMD_CCS_SHIFT; +//device_printf(dev, "%s ERROR is %08x cs %08x ss %08x rs %08x tfd %02x serr %08x fbs %08x ccs %d\n", +// __func__, istatus, cstatus, sstatus, ch->rslots, ATA_INL(ch->r_mem, AHCI_P_TFD), +// serr, ATA_INL(ch->r_mem, AHCI_P_FBS), ccs); + port = -1; + if (ch->fbs_enabled) { + uint32_t fbs = ATA_INL(ch->r_mem, AHCI_P_FBS); + if (fbs & AHCI_P_FBS_SDE) { + port = (fbs & AHCI_P_FBS_DWE) + >> AHCI_P_FBS_DWE_SHIFT; + } else { + for (i = 0; i < 16; i++) { + if (ch->numrslotspd[i] == 0) + continue; + if (port == -1) + port = i; + else if (port != i) { + port = -2; + break; + } + } + } + } err = ch->rslots & (cstatus | sstatus); - /* Kick controller into sane state */ - ahci_stop(dev); - ahci_start(dev); } else { ccs = 0; err = 0; + port = -1; } /* Complete all successfull commands. */ ok = ch->rslots & ~(cstatus | sstatus); @@ -985,21 +1325,28 @@ ahci_ch_intr(void *data) } /* On error, complete the rest of commands with error statuses. */ if (err) { - if (!ch->readlog) - xpt_freeze_simq(ch->sim, ch->numrslots); if (ch->frozen) { union ccb *fccb = ch->frozen; ch->frozen = NULL; fccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; + if (!(fccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(fccb->ccb_h.path, 1); + fccb->ccb_h.status |= CAM_DEV_QFRZN; + } xpt_done(fccb); } for (i = 0; i < ch->numslots; i++) { /* XXX: reqests in loading state. */ if (((err >> i) & 1) == 0) continue; + if (port >= 0 && + ch->slot[i].ccb->ccb_h.target_id != port) + continue; if (istatus & AHCI_P_IX_TFE) { + if (port != -2) { /* Task File Error */ - if (ch->numtslots == 0) { + if (ch->numtslotspd[ + ch->slot[i].ccb->ccb_h.target_id] == 0) { /* Untagged operation. */ if (i == ccs) et = AHCI_ERR_TFE; @@ -1008,17 +1355,26 @@ ahci_ch_intr(void *data) } else { /* Tagged operation. */ et = AHCI_ERR_NCQ; - ncq_err = 1; } + } else { + et = AHCI_ERR_TFE; + ch->fatalerr = 1; + } } else if (istatus & AHCI_P_IX_IF) { - /* SATA error */ - et = AHCI_ERR_SATA; + if (ch->numtslots == 0 && i != ccs && port != -2) + et = AHCI_ERR_INNOCENT; + else + et = AHCI_ERR_SATA; } else et = AHCI_ERR_INVALID; ahci_end_transaction(&ch->slot[i], et); } - if (ncq_err) - ahci_issue_read_log(dev); + /* + * We can't reinit port if there are some other + * commands active, use resume to complete them. + */ + if (ch->rslots != 0) + ATA_OUTL(ch->r_mem, AHCI_P_FBS, AHCI_P_FBS_EN | AHCI_P_FBS_DEC); } /* Process NOTIFY events */ if (sntf) @@ -1030,20 +1386,39 @@ static int ahci_check_collision(device_t dev, union ccb *ccb) { struct ahci_channel *ch = device_get_softc(dev); + int t = ccb->ccb_h.target_id; if ((ccb->ccb_h.func_code == XPT_ATA_IO) && (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { - /* Tagged command while untagged are active. */ - if (ch->numrslots != 0 && ch->numtslots == 0) - return (1); - /* Tagged command while tagged to other target is active. */ - if (ch->numtslots != 0 && - ch->taggedtarget != ccb->ccb_h.target_id) + /* Tagged command while we have no supported tag free. */ + if (((~ch->oslots) & (0xffffffff >> (32 - + ch->curr[t].tags))) == 0) return (1); + /* If we have FBS */ + if (ch->fbs_enabled) { + /* Tagged command while untagged are active. */ + if (ch->numrslotspd[t] != 0 && ch->numtslotspd[t] == 0) + return (1); + } else { + /* Tagged command while untagged are active. */ + if (ch->numrslots != 0 && ch->numtslots == 0) + return (1); + /* Tagged command while tagged to other target is active. */ + if (ch->numtslots != 0 && + ch->taggedtarget != ccb->ccb_h.target_id) + return (1); + } } else { - /* Untagged command while tagged are active. */ - if (ch->numrslots != 0 && ch->numtslots != 0) - return (1); + /* If we have FBS */ + if (ch->fbs_enabled) { + /* Untagged command while tagged are active. */ + if (ch->numrslotspd[t] != 0 && ch->numtslotspd[t] != 0) + return (1); + } else { + /* Untagged command while tagged are active. */ + if (ch->numrslots != 0 && ch->numtslots != 0) + return (1); + } } if ((ccb->ccb_h.func_code == XPT_ATA_IO) && (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT))) { @@ -1063,15 +1438,21 @@ ahci_begin_transaction(device_t dev, union ccb *ccb) { struct ahci_channel *ch = device_get_softc(dev); struct ahci_slot *slot; - int tag; + int tag, tags; /* Choose empty slot. */ + tags = ch->numslots; + if ((ccb->ccb_h.func_code == XPT_ATA_IO) && + (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) + tags = ch->curr[ccb->ccb_h.target_id].tags; tag = ch->lastslot; - while (ch->slot[tag].state != AHCI_SLOT_EMPTY) { - if (++tag >= ch->numslots) + while (1) { + if (tag >= tags) tag = 0; - KASSERT(tag != ch->lastslot, ("ahci: ALL SLOTS BUSY!")); - } + if (ch->slot[tag].state == AHCI_SLOT_EMPTY) + break; + tag++; + }; ch->lastslot = tag; /* Occupy chosen slot. */ slot = &ch->slot[tag]; @@ -1080,10 +1461,13 @@ ahci_begin_transaction(device_t dev, union ccb *ccb) if (ch->numrslots == 0 && ch->pm_level > 3) callout_stop(&ch->pm_timer); /* Update channel stats. */ + ch->oslots |= (1 << slot->slot); ch->numrslots++; + ch->numrslotspd[ccb->ccb_h.target_id]++; if ((ccb->ccb_h.func_code == XPT_ATA_IO) && (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { ch->numtslots++; + ch->numtslotspd[ccb->ccb_h.target_id]++; ch->taggedtarget = ccb->ccb_h.target_id; } if ((ccb->ccb_h.func_code == XPT_ATA_IO) && @@ -1121,8 +1505,6 @@ ahci_dmasetprd(void *arg, bus_dma_segment_t *segs, int nsegs, int error) if (error) { device_printf(slot->dev, "DMA load error\n"); - if (!ch->readlog) - xpt_freeze_simq(ch->sim, 1); ahci_end_transaction(slot, AHCI_ERR_INVALID); return; } @@ -1153,16 +1535,16 @@ ahci_execute_transaction(struct ahci_slot *slot) struct ahci_cmd_list *clp; union ccb *ccb = slot->ccb; int port = ccb->ccb_h.target_id & 0x0f; - int fis_size; + int fis_size, i; + uint8_t *fis = ch->dma.rfis + 0x40; + uint8_t val; /* Get a piece of the workspace for this request */ ctp = (struct ahci_cmd_tab *) (ch->dma.work + AHCI_CT_OFFSET + (AHCI_CT_SIZE * slot->slot)); /* Setup the FIS for this request */ - if (!(fis_size = ahci_setup_fis(ctp, ccb, slot->slot))) { + if (!(fis_size = ahci_setup_fis(dev, ctp, ccb, slot->slot))) { device_printf(ch->dev, "Setting up SATA FIS failed\n"); - if (!ch->readlog) - xpt_freeze_simq(ch->sim, 1); ahci_end_transaction(slot, AHCI_ERR_INVALID); return; } @@ -1177,13 +1559,18 @@ ahci_execute_transaction(struct ahci_slot *slot) (port << 12); /* Special handling for Soft Reset command. */ if ((ccb->ccb_h.func_code == XPT_ATA_IO) && - (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && - (ccb->ataio.cmd.control & ATA_A_RESET)) { - /* Kick controller into sane state */ - ahci_stop(dev); - ahci_clo(dev); - ahci_start(dev); - clp->cmd_flags |= AHCI_CMD_RESET | AHCI_CMD_CLR_BUSY; + (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL)) { + if (ccb->ataio.cmd.control & ATA_A_RESET) { + /* Kick controller into sane state */ + ahci_stop(dev); + ahci_clo(dev); + ahci_start(dev, 0); + clp->cmd_flags |= AHCI_CMD_RESET | AHCI_CMD_CLR_BUSY; + } else { + /* Prepare FIS receive area for check. */ + for (i = 0; i < 20; i++) + fis[i] = 0xff; + } } clp->bytecount = 0; clp->cmd_table_phys = htole64(ch->dma.work_bus + AHCI_CT_OFFSET + @@ -1197,6 +1584,11 @@ ahci_execute_transaction(struct ahci_slot *slot) (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { ATA_OUTL(ch->r_mem, AHCI_P_SACT, 1 << slot->slot); } + /* If FBS is enabled, set PMP port. */ + if (ch->fbs_enabled) { + ATA_OUTL(ch->r_mem, AHCI_P_FBS, AHCI_P_FBS_EN | + (port << AHCI_P_FBS_DEV_SHIFT)); + } /* Issue command to the controller. */ slot->state = AHCI_SLOT_RUNNING; ch->rslots |= (1 << slot->slot); @@ -1219,60 +1611,166 @@ ahci_execute_transaction(struct ahci_slot *slot) et = AHCI_ERR_TFE; break; } + /* Workaround for ATI SB600/SB700 chipsets. */ + if (ccb->ccb_h.target_id == 15 && + pci_get_vendor(device_get_parent(dev)) == 0x1002 && + (ATA_INL(ch->r_mem, AHCI_P_IS) & AHCI_P_IX_IPM)) { + et = AHCI_ERR_TIMEOUT; + break; + } } if (timeout && (count >= timeout)) { device_printf(ch->dev, "Poll timeout on slot %d\n", slot->slot); + device_printf(dev, "is %08x cs %08x ss %08x " + "rs %08x tfd %02x serr %08x\n", + ATA_INL(ch->r_mem, AHCI_P_IS), + ATA_INL(ch->r_mem, AHCI_P_CI), + ATA_INL(ch->r_mem, AHCI_P_SACT), ch->rslots, + ATA_INL(ch->r_mem, AHCI_P_TFD), + ATA_INL(ch->r_mem, AHCI_P_SERR)); et = AHCI_ERR_TIMEOUT; } - if (et != AHCI_ERR_NONE) { - /* Kick controller into sane state */ - ahci_stop(ch->dev); - ahci_start(ch->dev); - xpt_freeze_simq(ch->sim, 1); + /* Marvell controllers do not wait for readyness. */ + if ((ch->quirks & AHCI_Q_NOBSYRES) && + (ccb->ccb_h.func_code == XPT_ATA_IO) && + (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && + (ccb->ataio.cmd.control & ATA_A_RESET) == 0) { + while ((val = fis[2]) & (ATA_S_BUSY | ATA_S_DRQ)) { + DELAY(1000); + if (count++ >= timeout) { + device_printf(dev, "device is not " + "ready after soft-reset: " + "tfd = %08x\n", val); + et = AHCI_ERR_TIMEOUT; + break; + } + } } ahci_end_transaction(slot, et); + /* Kick controller into sane state and enable FBS. */ + if ((ccb->ccb_h.func_code == XPT_ATA_IO) && + (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && + (ccb->ataio.cmd.control & ATA_A_RESET) == 0) { + ahci_stop(ch->dev); + ahci_start(ch->dev, 1); + } return; } /* Start command execution timeout */ - callout_reset(&slot->timeout, (int)ccb->ccb_h.timeout * hz / 1000, + callout_reset(&slot->timeout, (int)ccb->ccb_h.timeout * hz / 2000, (timeout_t*)ahci_timeout, slot); return; } +/* Must be called with channel locked. */ +static void +ahci_process_timeout(device_t dev) +{ + struct ahci_channel *ch = device_get_softc(dev); + int i; + + mtx_assert(&ch->mtx, MA_OWNED); + /* Handle the rest of commands. */ + for (i = 0; i < ch->numslots; i++) { + /* Do we have a running request on slot? */ + if (ch->slot[i].state < AHCI_SLOT_RUNNING) + continue; + ahci_end_transaction(&ch->slot[i], AHCI_ERR_TIMEOUT); + } +} + +/* Must be called with channel locked. */ +static void +ahci_rearm_timeout(device_t dev) +{ + struct ahci_channel *ch = device_get_softc(dev); + int i; + + mtx_assert(&ch->mtx, MA_OWNED); + for (i = 0; i < ch->numslots; i++) { + struct ahci_slot *slot = &ch->slot[i]; + + /* Do we have a running request on slot? */ + if (slot->state < AHCI_SLOT_RUNNING) + continue; + if ((ch->toslots & (1 << i)) == 0) + continue; + callout_reset(&slot->timeout, + (int)slot->ccb->ccb_h.timeout * hz / 2000, + (timeout_t*)ahci_timeout, slot); + } +} + /* Locked by callout mechanism. */ static void ahci_timeout(struct ahci_slot *slot) { device_t dev = slot->dev; struct ahci_channel *ch = device_get_softc(dev); + uint32_t sstatus; + int ccs; int i; /* Check for stale timeout. */ - if (slot->state != AHCI_SLOT_RUNNING) + if (slot->state < AHCI_SLOT_RUNNING) return; - device_printf(dev, "Timeout on slot %d\n", slot->slot); - /* Kick controller into sane state. */ - ahci_stop(ch->dev); - ahci_start(ch->dev); + /* Check if slot was not being executed last time we checked. */ + if (slot->state < AHCI_SLOT_EXECUTING) { + /* Check if slot started executing. */ + sstatus = ATA_INL(ch->r_mem, AHCI_P_SACT); + ccs = (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_CCS_MASK) + >> AHCI_P_CMD_CCS_SHIFT; + if ((sstatus & (1 << slot->slot)) != 0 || ccs == slot->slot || + ch->fbs_enabled) + slot->state = AHCI_SLOT_EXECUTING; - if (!ch->readlog) - xpt_freeze_simq(ch->sim, ch->numrslots); - /* Handle command with timeout. */ - ahci_end_transaction(&ch->slot[slot->slot], AHCI_ERR_TIMEOUT); - /* Handle the rest of commands. */ + callout_reset(&slot->timeout, + (int)slot->ccb->ccb_h.timeout * hz / 2000, + (timeout_t*)ahci_timeout, slot); + return; + } + + device_printf(dev, "Timeout on slot %d\n", slot->slot); + device_printf(dev, "is %08x cs %08x ss %08x rs %08x tfd %02x serr %08x\n", + ATA_INL(ch->r_mem, AHCI_P_IS), ATA_INL(ch->r_mem, AHCI_P_CI), + ATA_INL(ch->r_mem, AHCI_P_SACT), ch->rslots, + ATA_INL(ch->r_mem, AHCI_P_TFD), ATA_INL(ch->r_mem, AHCI_P_SERR)); + + /* Handle frozen command. */ if (ch->frozen) { union ccb *fccb = ch->frozen; ch->frozen = NULL; fccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; + if (!(fccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(fccb->ccb_h.path, 1); + fccb->ccb_h.status |= CAM_DEV_QFRZN; + } xpt_done(fccb); } - for (i = 0; i < ch->numslots; i++) { - /* Do we have a running request on slot? */ - if (ch->slot[i].state < AHCI_SLOT_RUNNING) - continue; - ahci_end_transaction(&ch->slot[i], AHCI_ERR_INNOCENT); + if (!ch->fbs_enabled) { + /* Without FBS we know real timeout source. */ + ch->fatalerr = 1; + /* Handle command with timeout. */ + ahci_end_transaction(&ch->slot[slot->slot], AHCI_ERR_TIMEOUT); + /* Handle the rest of commands. */ + for (i = 0; i < ch->numslots; i++) { + /* Do we have a running request on slot? */ + if (ch->slot[i].state < AHCI_SLOT_RUNNING) + continue; + ahci_end_transaction(&ch->slot[i], AHCI_ERR_INNOCENT); + } + } else { + /* With FBS we wait for other commands timeout and pray. */ + if (ch->toslots == 0) + xpt_freeze_simq(ch->sim, 1); + ch->toslots |= (1 << slot->slot); + if ((ch->rslots & ~ch->toslots) == 0) + ahci_process_timeout(dev); + else + device_printf(dev, " ... waiting for slots %08x\n", + ch->rslots & ~ch->toslots); } } @@ -1296,12 +1794,19 @@ ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et) if ((et == AHCI_ERR_TFE) || (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT)) { u_int8_t *fis = ch->dma.rfis + 0x40; - uint16_t tfd = ATA_INL(ch->r_mem, AHCI_P_TFD); bus_dmamap_sync(ch->dma.rfis_tag, ch->dma.rfis_map, BUS_DMASYNC_POSTREAD); - res->status = tfd; - res->error = tfd >> 8; + if (ch->fbs_enabled) { + fis += ccb->ccb_h.target_id * 256; + res->status = fis[2]; + res->error = fis[3]; + } else { + uint16_t tfd = ATA_INL(ch->r_mem, AHCI_P_TFD); + + res->status = tfd; + res->error = tfd >> 8; + } res->lba_low = fis[4]; res->lba_mid = fis[5]; res->lba_high = fis[6]; @@ -1320,10 +1825,16 @@ ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et) BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(ch->dma.data_tag, slot->dma.data_map); } + if (et != AHCI_ERR_NONE) + ch->eslots |= (1 << slot->slot); + /* In case of error, freeze device for proper recovery. */ + if ((et != AHCI_ERR_NONE) && (!ch->readlog) && + !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(ccb->ccb_h.path, 1); + ccb->ccb_h.status |= CAM_DEV_QFRZN; + } /* Set proper result status. */ ccb->ccb_h.status &= ~CAM_STATUS_MASK; - if (et != AHCI_ERR_NONE) - ccb->ccb_h.status |= CAM_RELEASE_SIMQ; switch (et) { case AHCI_ERR_NONE: ccb->ccb_h.status |= CAM_REQ_CMP; @@ -1331,12 +1842,14 @@ ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et) ccb->csio.scsi_status = SCSI_STATUS_OK; break; case AHCI_ERR_INVALID: + ch->fatalerr = 1; ccb->ccb_h.status |= CAM_REQ_INVALID; break; case AHCI_ERR_INNOCENT: ccb->ccb_h.status |= CAM_REQUEUE_REQ; break; case AHCI_ERR_TFE: + case AHCI_ERR_NCQ: if (ccb->ccb_h.func_code == XPT_SCSI_IO) { ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; @@ -1345,26 +1858,44 @@ ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et) } break; case AHCI_ERR_SATA: - ccb->ccb_h.status |= CAM_UNCOR_PARITY; + ch->fatalerr = 1; + if (!ch->readlog) { + xpt_freeze_simq(ch->sim, 1); + ccb->ccb_h.status &= ~CAM_STATUS_MASK; + ccb->ccb_h.status |= CAM_RELEASE_SIMQ; + } + ccb->ccb_h.status |= CAM_UNCOR_PARITY; break; case AHCI_ERR_TIMEOUT: + if (!ch->readlog) { + xpt_freeze_simq(ch->sim, 1); + ccb->ccb_h.status &= ~CAM_STATUS_MASK; + ccb->ccb_h.status |= CAM_RELEASE_SIMQ; + } ccb->ccb_h.status |= CAM_CMD_TIMEOUT; break; - case AHCI_ERR_NCQ: - ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; default: + ch->fatalerr = 1; ccb->ccb_h.status |= CAM_REQ_CMP_ERR; } /* Free slot. */ + ch->oslots &= ~(1 << slot->slot); ch->rslots &= ~(1 << slot->slot); ch->aslots &= ~(1 << slot->slot); + if (et != AHCI_ERR_TIMEOUT) { + if (ch->toslots == (1 << slot->slot)) + xpt_release_simq(ch->sim, TRUE); + ch->toslots &= ~(1 << slot->slot); + } slot->state = AHCI_SLOT_EMPTY; slot->ccb = NULL; /* Update channel stats. */ ch->numrslots--; + ch->numrslotspd[ccb->ccb_h.target_id]--; if ((ccb->ccb_h.func_code == XPT_ATA_IO) && (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { ch->numtslots--; + ch->numtslotspd[ccb->ccb_h.target_id]--; } /* If it was first request of reset sequence and there is no error, * proceed to second request. */ @@ -1376,20 +1907,41 @@ ahci_end_transaction(struct ahci_slot *slot, enum ahci_err_type et) ahci_begin_transaction(dev, ccb); return; } - /* If it was NCQ command error, put result on hold. */ - if (et == AHCI_ERR_NCQ) { - ch->hold[slot->slot] = ccb; - } else if (ch->readlog) /* If it was our READ LOG command - process it. */ + /* If it was our READ LOG command - process it. */ + if (ch->readlog) { ahci_process_read_log(dev, ccb); - else + /* If it was NCQ command error, put result on hold. */ + } else if (et == AHCI_ERR_NCQ) { + ch->hold[slot->slot] = ccb; + ch->numhslots++; + } else xpt_done(ccb); /* Unfreeze frozen command. */ - if (ch->frozen && ch->numrslots == 0) { + if (ch->frozen && !ahci_check_collision(dev, ch->frozen)) { union ccb *fccb = ch->frozen; ch->frozen = NULL; ahci_begin_transaction(dev, fccb); xpt_release_simq(ch->sim, TRUE); } + /* If we have no other active commands, ... */ + if (ch->rslots == 0) { + /* if there was fatal error - reset port. */ + if (ch->toslots != 0 || ch->fatalerr) { + ahci_reset(dev); + } else { + /* if we have slots in error, we can reinit port. */ + if (ch->eslots != 0) { + ahci_stop(dev); + ahci_start(dev, 1); + } + /* if there commands on hold, we can do READ LOG. */ + if (!ch->readlog && ch->numhslots) + ahci_issue_read_log(dev); + } + /* If all the rest of commands are in timeout - give them chance. */ + } else if ((ch->rslots & ~ch->toslots) == 0 && + et != AHCI_ERR_TIMEOUT) + ahci_rearm_timeout(dev); /* Start PM timer. */ if (ch->numrslots == 0 && ch->pm_level > 3) { callout_schedule(&ch->pm_timer, @@ -1435,7 +1987,8 @@ ahci_issue_read_log(device_t dev) ataio->cmd.lba_low = 0x10; ataio->cmd.lba_mid = 0; ataio->cmd.lba_mid_exp = 0; - + /* Freeze SIM while doing READ LOG EXT. */ + xpt_freeze_simq(ch->sim, 1); ahci_begin_transaction(dev, ccb); } @@ -1474,6 +2027,7 @@ ahci_process_read_log(device_t dev, union ccb *ccb) } xpt_done(ch->hold[i]); ch->hold[i] = NULL; + ch->numhslots--; } } else { if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) @@ -1486,14 +2040,16 @@ ahci_process_read_log(device_t dev, union ccb *ccb) continue; xpt_done(ch->hold[i]); ch->hold[i] = NULL; + ch->numhslots--; } } free(ccb->ataio.data_ptr, M_AHCI); xpt_free_ccb(ccb); + xpt_release_simq(ch->sim, TRUE); } static void -ahci_start(device_t dev) +ahci_start(device_t dev, int fbs) { struct ahci_channel *ch = device_get_softc(dev); u_int32_t cmd; @@ -1502,6 +2058,12 @@ ahci_start(device_t dev) ATA_OUTL(ch->r_mem, AHCI_P_SERR, 0xFFFFFFFF); /* Clear any interrupts pending on this channel */ ATA_OUTL(ch->r_mem, AHCI_P_IS, 0xFFFFFFFF); + /* Configure FIS-based switching if supported. */ + if (ch->chcaps & AHCI_P_CMD_FBSCP) { + ch->fbs_enabled = (fbs && ch->pm_present) ? 1 : 0; + ATA_OUTL(ch->r_mem, AHCI_P_FBS, + ch->fbs_enabled ? AHCI_P_FBS_EN : 0); + } /* Start operations on this channel */ cmd = ATA_INL(ch->r_mem, AHCI_P_CMD); ATA_OUTL(ch->r_mem, AHCI_P_CMD, cmd | AHCI_P_CMD_ST | @@ -1527,6 +2089,7 @@ ahci_stop(device_t dev) break; } } while (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_CR); + ch->eslots = 0; } static void @@ -1595,7 +2158,7 @@ ahci_wait_ready(device_t dev, int t) (ATA_S_BUSY | ATA_S_DRQ)) { DELAY(1000); if (timeout++ > t) { - device_printf(dev, "port is not ready (timeout %dms) " + device_printf(dev, "device is not ready (timeout %dms) " "tfd = %08x\n", t, val); return (EBUSY); } @@ -1612,14 +2175,18 @@ ahci_reset(device_t dev) struct ahci_controller *ctlr = device_get_softc(device_get_parent(dev)); int i; + xpt_freeze_simq(ch->sim, 1); if (bootverbose) device_printf(dev, "AHCI reset...\n"); - xpt_freeze_simq(ch->sim, ch->numrslots); /* Requeue freezed command. */ if (ch->frozen) { union ccb *fccb = ch->frozen; ch->frozen = NULL; fccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; + if (!(fccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(fccb->ccb_h.path, 1); + fccb->ccb_h.status |= CAM_DEV_QFRZN; + } xpt_done(fccb); } /* Kill the engine and requeue all running commands. */ @@ -1631,10 +2198,24 @@ ahci_reset(device_t dev) /* XXX; Commands in loading state. */ ahci_end_transaction(&ch->slot[i], AHCI_ERR_INNOCENT); } + for (i = 0; i < ch->numslots; i++) { + if (!ch->hold[i]) + continue; + xpt_done(ch->hold[i]); + ch->hold[i] = NULL; + ch->numhslots--; + } + if (ch->toslots != 0) + xpt_release_simq(ch->sim, TRUE); + ch->eslots = 0; + ch->toslots = 0; + ch->fatalerr = 0; + /* Tell the XPT about the event */ + xpt_async(AC_BUS_RESET, ch->path, NULL); /* Disable port interrupts */ ATA_OUTL(ch->r_mem, AHCI_P_IE, 0); /* Reset and reconnect PHY, */ - if (!ahci_sata_phy_reset(dev, 0)) { + if (!ahci_sata_phy_reset(dev)) { if (bootverbose) device_printf(dev, "AHCI reset done: phy reset found no device\n"); @@ -1642,14 +2223,13 @@ ahci_reset(device_t dev) /* Enable wanted port interrupts */ ATA_OUTL(ch->r_mem, AHCI_P_IE, (AHCI_P_IX_CPD | AHCI_P_IX_PRC | AHCI_P_IX_PC)); + xpt_release_simq(ch->sim, TRUE); return; } /* Wait for clearing busy status. */ - if (ahci_wait_ready(dev, 10000)) { - device_printf(dev, "device ready timeout\n"); + if (ahci_wait_ready(dev, 15000)) ahci_clo(dev); - } - ahci_start(dev); + ahci_start(dev, 1); ch->devices = 1; /* Enable wanted port interrupts */ ATA_OUTL(ch->r_mem, AHCI_P_IE, @@ -1660,13 +2240,13 @@ ahci_reset(device_t dev) AHCI_P_IX_DS | AHCI_P_IX_PS | (ctlr->ccc ? 0 : AHCI_P_IX_DHR))); if (bootverbose) device_printf(dev, "AHCI reset done: device found\n"); - /* Tell the XPT about the event */ - xpt_async(AC_BUS_RESET, ch->path, NULL); + xpt_release_simq(ch->sim, TRUE); } static int -ahci_setup_fis(struct ahci_cmd_tab *ctp, union ccb *ccb, int tag) +ahci_setup_fis(device_t dev, struct ahci_cmd_tab *ctp, union ccb *ccb, int tag) { + struct ahci_channel *ch = device_get_softc(dev); u_int8_t *fis = &ctp->cfis[0]; bzero(ctp->cfis, 64); @@ -1675,7 +2255,8 @@ ahci_setup_fis(struct ahci_cmd_tab *ctp, union ccb *ccb, int tag) if (ccb->ccb_h.func_code == XPT_SCSI_IO) { fis[1] |= 0x80; fis[2] = ATA_PACKET_CMD; - if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) + if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && + ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) fis[3] = ATA_F_DMA; else { fis[5] = ccb->csio.dxfer_len; @@ -1752,24 +2333,18 @@ ahci_sata_connect(struct ahci_channel *ch) } static int -ahci_sata_phy_reset(device_t dev, int quick) +ahci_sata_phy_reset(device_t dev) { struct ahci_channel *ch = device_get_softc(dev); + int sata_rev; uint32_t val; - if (quick) { - val = ATA_INL(ch->r_mem, AHCI_P_SCTL); - if ((val & ATA_SC_DET_MASK) == ATA_SC_DET_IDLE) - return (ahci_sata_connect(ch)); - } - - if (bootverbose) - device_printf(dev, "hardware reset ...\n"); - if (ch->sata_rev == 1) + sata_rev = ch->user[ch->pm_present ? 15 : 0].revision; + if (sata_rev == 1) val = ATA_SC_SPD_SPEED_GEN1; - else if (ch->sata_rev == 2) + else if (sata_rev == 2) val = ATA_SC_SPD_SPEED_GEN2; - else if (ch->sata_rev == 3) + else if (sata_rev == 3) val = ATA_SC_SPD_SPEED_GEN3; else val = 0; @@ -1781,7 +2356,12 @@ ahci_sata_phy_reset(device_t dev, int quick) ATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 : (ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER))); DELAY(5000); - return (ahci_sata_connect(ch)); + if (!ahci_sata_connect(ch)) { + if (ch->pm_level > 0) + ATA_OUTL(ch->r_mem, AHCI_P_SCTL, ATA_SC_DET_DISABLE); + return (0); + } + return (1); } static void @@ -1826,10 +2406,24 @@ ahciaction(struct cam_sim *sim, union ccb *ccb) case XPT_SET_TRAN_SETTINGS: { struct ccb_trans_settings *cts = &ccb->cts; + struct ahci_device *d; - if (cts->xport_specific.sata.valid & CTS_SATA_VALID_PM) { + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + d = &ch->curr[ccb->ccb_h.target_id]; + else + d = &ch->user[ccb->ccb_h.target_id]; + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_REVISION) + d->revision = cts->xport_specific.sata.revision; + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_MODE) + d->mode = cts->xport_specific.sata.mode; + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT) + d->bytecount = min(8192, cts->xport_specific.sata.bytecount); + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_TAGS) + d->tags = min(ch->numslots, cts->xport_specific.sata.tags); + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_PM) ch->pm_present = cts->xport_specific.sata.pm_present; - } + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_ATAPI) + d->atapi = cts->xport_specific.sata.atapi; ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); break; @@ -1838,36 +2432,43 @@ ahciaction(struct cam_sim *sim, union ccb *ccb) /* Get default/user set transfer settings for the target */ { struct ccb_trans_settings *cts = &ccb->cts; + struct ahci_device *d; uint32_t status; + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + d = &ch->curr[ccb->ccb_h.target_id]; + else + d = &ch->user[ccb->ccb_h.target_id]; cts->protocol = PROTO_ATA; cts->protocol_version = PROTO_VERSION_UNSPECIFIED; cts->transport = XPORT_SATA; cts->transport_version = XPORT_VERSION_UNSPECIFIED; cts->proto_specific.valid = 0; cts->xport_specific.sata.valid = 0; - if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + if (cts->type == CTS_TYPE_CURRENT_SETTINGS && + (ccb->ccb_h.target_id == 15 || + (ccb->ccb_h.target_id == 0 && !ch->pm_present))) { status = ATA_INL(ch->r_mem, AHCI_P_SSTS) & ATA_SS_SPD_MASK; - else - status = ATA_INL(ch->r_mem, AHCI_P_SCTL) & ATA_SC_SPD_MASK; - if (status & ATA_SS_SPD_GEN3) { - cts->xport_specific.sata.bitrate = 600000; - cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED; - } else if (status & ATA_SS_SPD_GEN2) { - cts->xport_specific.sata.bitrate = 300000; - cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED; - } else if (status & ATA_SS_SPD_GEN1) { - cts->xport_specific.sata.bitrate = 150000; - cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED; - } - if (cts->type == CTS_TYPE_CURRENT_SETTINGS) { - cts->xport_specific.sata.pm_present = - (ATA_INL(ch->r_mem, AHCI_P_CMD) & AHCI_P_CMD_PMA) ? - 1 : 0; + if (status & 0x0f0) { + cts->xport_specific.sata.revision = + (status & 0x0f0) >> 4; + cts->xport_specific.sata.valid |= + CTS_SATA_VALID_REVISION; + } } else { - cts->xport_specific.sata.pm_present = ch->pm_present; + cts->xport_specific.sata.revision = d->revision; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_REVISION; } + cts->xport_specific.sata.mode = d->mode; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_MODE; + cts->xport_specific.sata.bytecount = d->bytecount; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_BYTECOUNT; + cts->xport_specific.sata.pm_present = ch->pm_present; cts->xport_specific.sata.valid |= CTS_SATA_VALID_PM; + cts->xport_specific.sata.tags = d->tags; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_TAGS; + cts->xport_specific.sata.atapi = d->atapi; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_ATAPI; ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); break; @@ -1917,14 +2518,16 @@ ahciaction(struct cam_sim *sim, union ccb *ccb) struct ccb_pathinq *cpi = &ccb->cpi; cpi->version_num = 1; /* XXX??? */ - cpi->hba_inquiry = PI_SDTR_ABLE | PI_TAG_ABLE; + cpi->hba_inquiry = PI_SDTR_ABLE; + if (ch->caps & AHCI_CAP_SNCQ) + cpi->hba_inquiry |= PI_TAG_ABLE; if (ch->caps & AHCI_CAP_SPM) cpi->hba_inquiry |= PI_SATAPM; cpi->target_sprt = 0; cpi->hba_misc = PIM_SEQSCAN; cpi->hba_eng_cnt = 0; if (ch->caps & AHCI_CAP_SPM) - cpi->max_target = 14; + cpi->max_target = 15; else cpi->max_target = 0; cpi->max_lun = 0; diff --git a/sys/dev/ahci/ahci.h b/sys/dev/ahci/ahci.h index 9b5726ac8056..d4c73c9cfe57 100644 --- a/sys/dev/ahci/ahci.h +++ b/sys/dev/ahci/ahci.h @@ -186,6 +186,20 @@ #define AHCI_CCCC_EN 0x00000001 #define AHCI_CCCP 0x18 +#define AHCI_EM_LOC 0x1C +#define AHCI_EM_CTL 0x20 +#define AHCI_EM_MR 0x00000001 +#define AHCI_EM_TM 0x00000100 +#define AHCI_EM_RST 0x00000200 +#define AHCI_EM_LED 0x00010000 +#define AHCI_EM_SAFTE 0x00020000 +#define AHCI_EM_SES2 0x00040000 +#define AHCI_EM_SGPIO 0x00080000 +#define AHCI_EM_SMB 0x01000000 +#define AHCI_EM_XMT 0x02000000 +#define AHCI_EM_ALHD 0x04000000 +#define AHCI_EM_PM 0x08000000 + #define AHCI_CAP2 0x24 #define AHCI_CAP2_BOH 0x00000001 #define AHCI_CAP2_NVMP 0x00000002 @@ -233,8 +247,11 @@ #define AHCI_P_CMD_CPS 0x00010000 #define AHCI_P_CMD_PMA 0x00020000 #define AHCI_P_CMD_HPCP 0x00040000 -#define AHCI_P_CMD_ISP 0x00080000 +#define AHCI_P_CMD_MPSP 0x00080000 #define AHCI_P_CMD_CPD 0x00100000 +#define AHCI_P_CMD_ESP 0x00200000 +#define AHCI_P_CMD_FBSCP 0x00400000 +#define AHCI_P_CMD_APSTE 0x00800000 #define AHCI_P_CMD_ATAPI 0x01000000 #define AHCI_P_CMD_DLAE 0x02000000 #define AHCI_P_CMD_ALPE 0x04000000 @@ -254,6 +271,15 @@ #define AHCI_P_CI 0x38 #define AHCI_P_SNTF 0x3C #define AHCI_P_FBS 0x40 +#define AHCI_P_FBS_EN 0x00000001 +#define AHCI_P_FBS_DEC 0x00000002 +#define AHCI_P_FBS_SDE 0x00000004 +#define AHCI_P_FBS_DEV 0x00000f00 +#define AHCI_P_FBS_DEV_SHIFT 8 +#define AHCI_P_FBS_ADO 0x0000f000 +#define AHCI_P_FBS_ADO_SHIFT 12 +#define AHCI_P_FBS_DWE 0x000f0000 +#define AHCI_P_FBS_DWE_SHIFT 16 /* Just to be sure, if building as module. */ #if MAXPHYS < 512 * 1024 @@ -328,7 +354,7 @@ enum ahci_slot_states { AHCI_SLOT_EMPTY, AHCI_SLOT_LOADING, AHCI_SLOT_RUNNING, - AHCI_SLOT_WAITING + AHCI_SLOT_EXECUTING }; struct ahci_slot { @@ -340,6 +366,14 @@ struct ahci_slot { struct callout timeout; /* Execution timeout */ }; +struct ahci_device { + int revision; + int mode; + u_int bytecount; + u_int atapi; + u_int tags; +}; + /* structure describing an ATA channel */ struct ahci_channel { device_t dev; /* Device handle */ @@ -352,24 +386,36 @@ struct ahci_channel { struct cam_path *path; uint32_t caps; /* Controller capabilities */ uint32_t caps2; /* Controller capabilities */ + uint32_t chcaps; /* Channel capabilities */ + int quirks; int numslots; /* Number of present slots */ int pm_level; /* power management level */ - int sata_rev; /* Maximum allowed SATA generation */ struct ahci_slot slot[AHCI_MAX_SLOTS]; union ccb *hold[AHCI_MAX_SLOTS]; struct mtx mtx; /* state lock */ int devices; /* What is present */ int pm_present; /* PM presence reported */ + int fbs_enabled; /* FIS-based switching enabled */ + uint32_t oslots; /* Occupied slots */ uint32_t rslots; /* Running slots */ uint32_t aslots; /* Slots with atomic commands */ + uint32_t eslots; /* Slots in error */ + uint32_t toslots; /* Slots in timeout */ int numrslots; /* Number of running slots */ + int numrslotspd[16];/* Number of running slots per dev */ int numtslots; /* Number of tagged slots */ + int numtslotspd[16];/* Number of tagged slots per dev */ + int numhslots; /* Number of holden slots */ int readlog; /* Our READ LOG active */ + int fatalerr; /* Fatal error happend */ int lastslot; /* Last used slot */ int taggedtarget; /* Last tagged target */ union ccb *frozen; /* Frozen command */ struct callout pm_timer; /* Power management events */ + + struct ahci_device user[16]; /* User-specified settings */ + struct ahci_device curr[16]; /* Current settings */ }; /* structure describing a AHCI controller */ @@ -390,6 +436,8 @@ struct ahci_controller { } irqs[16]; uint32_t caps; /* Controller capabilities */ uint32_t caps2; /* Controller capabilities */ + uint32_t capsem; /* Controller capabilities */ + int quirks; int numirqs; int channels; int ichannels; diff --git a/sys/dev/aic7xxx/ahd_pci.c b/sys/dev/aic7xxx/ahd_pci.c index f077c89d73ad..3a0116160083 100644 --- a/sys/dev/aic7xxx/ahd_pci.c +++ b/sys/dev/aic7xxx/ahd_pci.c @@ -134,6 +134,7 @@ ahd_pci_attach(device_t dev) return (error); } + ahd_sysctl(ahd); ahd_attach(ahd); return (0); } @@ -198,6 +199,7 @@ ahd_pci_map_registers(struct ahd_softc *ahd) bus_release_resource(ahd->dev_softc, regs_type, regs_id, regs); regs = NULL; + AHD_CORRECTABLE_ERROR(ahd); } else { command &= ~PCIM_CMD_PORTEN; aic_pci_write_config(ahd->dev_softc, @@ -214,6 +216,7 @@ ahd_pci_map_registers(struct ahd_softc *ahd) if (regs == NULL) { device_printf(ahd->dev_softc, "can't allocate register resources\n"); + AHD_UNCORRECTABLE_ERROR(ahd); return (ENOMEM); } ahd->tags[0] = rman_get_bustag(regs); @@ -226,6 +229,7 @@ ahd_pci_map_registers(struct ahd_softc *ahd) if (regs2 == NULL) { device_printf(ahd->dev_softc, "can't allocate register resources\n"); + AHD_UNCORRECTABLE_ERROR(ahd); return (ENOMEM); } ahd->tags[1] = rman_get_bustag(regs2); diff --git a/sys/dev/aic7xxx/aic79xx.c b/sys/dev/aic7xxx/aic79xx.c index aa771af927d7..feee494e0529 100644 --- a/sys/dev/aic7xxx/aic79xx.c +++ b/sys/dev/aic7xxx/aic79xx.c @@ -401,6 +401,7 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd) if (scb == NULL) { printf("%s: Warning - GSFIFO SCB %d invalid\n", ahd_name(ahd), scbid); + AHD_CORRECTABLE_ERROR(ahd); continue; } /* @@ -525,6 +526,7 @@ rescan_fifos: if (scb == NULL) { printf("%s: Warning - DMA-up and complete " "SCB %d invalid\n", ahd_name(ahd), scbid); + AHD_CORRECTABLE_ERROR(ahd); continue; } hscb_ptr = (uint8_t *)scb->hscb; @@ -546,6 +548,7 @@ rescan_fifos: if (scb == NULL) { printf("%s: Warning - Complete Qfrz SCB %d invalid\n", ahd_name(ahd), scbid); + AHD_CORRECTABLE_ERROR(ahd); continue; } @@ -563,6 +566,7 @@ rescan_fifos: if (scb == NULL) { printf("%s: Warning - Complete SCB %d invalid\n", ahd_name(ahd), scbid); + AHD_CORRECTABLE_ERROR(ahd); continue; } @@ -870,6 +874,7 @@ ahd_run_qoutfifo(struct ahd_softc *ahd) "(cmdcmplt)\nQOUTPOS = %d\n", ahd_name(ahd), scb_index, ahd->qoutfifonext); + AHD_CORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); } else if ((completion->sg_status & SG_STATUS_VALID) != 0) { ahd_handle_scb_status(ahd, scb); @@ -897,9 +902,11 @@ ahd_handle_hwerrint(struct ahd_softc *ahd) error = ahd_inb(ahd, ERROR); for (i = 0; i < num_errors; i++) { - if ((error & ahd_hard_errors[i].errno) != 0) + if ((error & ahd_hard_errors[i].errno) != 0) { printf("%s: hwerrint, %s\n", ahd_name(ahd), ahd_hard_errors[i].errmesg); + AHD_UNCORRECTABLE_ERROR(ahd); + } } ahd_dump_card_state(ahd); @@ -990,6 +997,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ahd_name(ahd)); ahd_dump_card_state(ahd); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); + AHD_UNCORRECTABLE_ERROR(ahd); break; case STATUS_OVERRUN: { @@ -1005,6 +1013,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) printf("SCB %d Packetized Status Overrun", scbid); ahd_dump_card_state(ahd); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); + AHD_UNCORRECTABLE_ERROR(ahd); break; } case CFG4ISTAT_INTR: @@ -1017,6 +1026,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) if (scb == NULL) { ahd_dump_card_state(ahd); printf("CFG4ISTAT: Free SCB %d referenced", scbid); + AHD_FATAL_ERROR(ahd); panic("For safety"); } ahd_outq(ahd, HADDR, scb->sense_busaddr); @@ -1044,6 +1054,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) case P_MESGIN: ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); printf("%s: Issued Bus Reset.\n", ahd_name(ahd)); + AHD_UNCORRECTABLE_ERROR(ahd); break; case P_COMMAND: { @@ -1068,6 +1079,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) scbid = ahd_get_scbptr(ahd); scb = ahd_lookup_scb(ahd, scbid); if (scb == NULL) { + AHD_CORRECTABLE_ERROR(ahd); printf("Invalid phase with no valid SCB. " "Resetting bus.\n"); ahd_reset_channel(ahd, 'A', @@ -1127,6 +1139,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) #ifdef AHD_DEBUG if ((ahd_debug & AHD_SHOW_RECOVERY) != 0) { ahd_print_path(ahd, scb); + AHD_CORRECTABLE_ERROR(ahd); printf("Unexpected command phase from " "packetized target\n"); } @@ -1214,6 +1227,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) && bus_phase != P_MESGOUT) { printf("ahd_intr: HOST_MSG_LOOP bad " "phase 0x%x\n", bus_phase); + AHD_CORRECTABLE_ERROR(ahd); /* * Probably transitioned to bus free before * we got here. Just punt the message. @@ -1316,6 +1330,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ahd_name(ahd), 'A', SCSIID_TARGET(ahd, ahd_inb(ahd, SAVED_SCSIID)), lastphase, ahd_inb(ahd, SCSISIGI)); + AHD_CORRECTABLE_ERROR(ahd); break; } case MISSED_BUSFREE: @@ -1328,6 +1343,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ahd_name(ahd), 'A', SCSIID_TARGET(ahd, ahd_inb(ahd, SAVED_SCSIID)), lastphase, ahd_inb(ahd, SCSISIGI)); + AHD_CORRECTABLE_ERROR(ahd); ahd_restart(ahd); return; } @@ -1387,6 +1403,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) devinfo.lun); scbid = ahd_get_scbptr(ahd); scb = ahd_lookup_scb(ahd, scbid); + AHD_CORRECTABLE_ERROR(ahd); if (scb != NULL && (scb->flags & SCB_RECOVERY_SCB) != 0) /* @@ -1570,11 +1587,13 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) printf("%s: SCSI offset overrun detected. Resetting bus.\n", ahd_name(ahd)); + AHD_CORRECTABLE_ERROR(ahd); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); } else if ((status & SCSIRSTI) != 0) { printf("%s: Someone reset channel A\n", ahd_name(ahd)); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/FALSE); + AHD_UNCORRECTABLE_ERROR(ahd); } else if ((status & SCSIPERR) != 0) { /* Make sure the sequencer is in a safe location. */ @@ -1619,6 +1638,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) "valid during SELTO scb(0x%x)\n", ahd_name(ahd), scbid); ahd_dump_card_state(ahd); + AHD_UNCORRECTABLE_ERROR(ahd); } else { struct ahd_devinfo devinfo; #ifdef AHD_DEBUG @@ -1654,6 +1674,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) } else if (status3 != 0) { printf("%s: SCSI Cell parity error SSTAT3 == 0x%x\n", ahd_name(ahd), status3); + AHD_CORRECTABLE_ERROR(ahd); ahd_outb(ahd, CLRSINT3, status3); } else if ((lqistat1 & (LQIPHASE_LQ|LQIPHASE_NLQ)) != 0) { @@ -1712,6 +1733,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) "during unexpected busfree\n", ahd_name(ahd), scbid, mode); packetized = 0; + AHD_CORRECTABLE_ERROR(ahd); } else packetized = (scb->flags & SCB_PACKETIZED) != 0; clear_fifo = 1; @@ -1856,6 +1878,7 @@ ahd_handle_transmission_error(struct ahd_softc *ahd) ahd_scsisigi_print(curphase, &cur_col, 50); ahd_perrdiag_print(perrdiag, &cur_col, 50); printf("\n"); + AHD_CORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); } @@ -1864,6 +1887,7 @@ ahd_handle_transmission_error(struct ahd_softc *ahd) printf("%s: Gross protocol error during incoming " "packet. lqistat1 == 0x%x. Resetting bus.\n", ahd_name(ahd), lqistat1); + AHD_UNCORRECTABLE_ERROR(ahd); } ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); return; @@ -1891,6 +1915,7 @@ ahd_handle_transmission_error(struct ahd_softc *ahd) */ ahd_outb(ahd, LQCTL2, LQIRETRY); printf("LQIRetry for LQICRCI_LQ to release ACK\n"); + AHD_CORRECTABLE_ERROR(ahd); } else if ((lqistat1 & LQICRCI_NLQ) != 0) { /* * We detected a CRC error in a NON-LQ packet. @@ -1942,6 +1967,7 @@ ahd_handle_transmission_error(struct ahd_softc *ahd) if (scb == NULL) { printf("%s: No SCB valid for LQICRC_NLQ. " "Resetting bus\n", ahd_name(ahd)); + AHD_UNCORRECTABLE_ERROR(ahd); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); return; } @@ -1999,9 +2025,11 @@ ahd_handle_lqiphase_error(struct ahd_softc *ahd, u_int lqistat1) && (ahd_inb(ahd, MDFFSTAT) & DLZERO) != 0) { if ((lqistat1 & LQIPHASE_LQ) != 0) { printf("LQIRETRY for LQIPHASE_LQ\n"); + AHD_CORRECTABLE_ERROR(ahd); ahd_outb(ahd, LQCTL2, LQIRETRY); } else if ((lqistat1 & LQIPHASE_NLQ) != 0) { printf("LQIRETRY for LQIPHASE_NLQ\n"); + AHD_CORRECTABLE_ERROR(ahd); ahd_outb(ahd, LQCTL2, LQIRETRY); } else panic("ahd_handle_lqiphase_error: No phase errors\n"); @@ -2010,6 +2038,7 @@ ahd_handle_lqiphase_error(struct ahd_softc *ahd, u_int lqistat1) ahd_unpause(ahd); } else { printf("Reseting Channel for LQI Phase error\n"); + AHD_CORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); } @@ -2099,6 +2128,7 @@ ahd_handle_pkt_busfree(struct ahd_softc *ahd, u_int busfreetime) ahd_print_path(ahd, scb); printf("Probable outgoing LQ CRC error. " "Retrying command\n"); + AHD_CORRECTABLE_ERROR(ahd); } scb->crc_retry_count++; } else { @@ -2134,6 +2164,7 @@ ahd_handle_pkt_busfree(struct ahd_softc *ahd, u_int busfreetime) scb = ahd_lookup_scb(ahd, scbid); ahd_print_path(ahd, scb); printf("Unexpected PKT busfree condition\n"); + AHD_UNCORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); ahd_abort_scbs(ahd, SCB_GET_TARGET(ahd, scb), 'A', SCB_GET_LUN(scb), SCB_GET_TAG(scb), @@ -2143,6 +2174,7 @@ ahd_handle_pkt_busfree(struct ahd_softc *ahd, u_int busfreetime) return (1); } printf("%s: Unexpected PKT busfree condition\n", ahd_name(ahd)); + AHD_UNCORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); /* Restart the sequencer. */ return (1); @@ -2421,6 +2453,7 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) ahd_lookup_phase_entry(lastphase)->phasemsg, aborted, ahd_inw(ahd, PRGMCNT)); + AHD_UNCORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); if (lastphase != P_BUSFREE) ahd_force_renegotiation(ahd, &devinfo); @@ -2456,6 +2489,7 @@ ahd_handle_proto_violation(struct ahd_softc *ahd) ahd_print_devinfo(ahd, &devinfo); printf("Target did not send an IDENTIFY message. " "LASTPHASE = 0x%x.\n", lastphase); + AHD_UNCORRECTABLE_ERROR(ahd); scb = NULL; } else if (scb == NULL) { /* @@ -2464,12 +2498,14 @@ ahd_handle_proto_violation(struct ahd_softc *ahd) */ ahd_print_devinfo(ahd, &devinfo); printf("No SCB found during protocol violation\n"); + AHD_UNCORRECTABLE_ERROR(ahd); goto proto_violation_reset; } else { aic_set_transaction_status(scb, CAM_SEQUENCE_FAIL); if ((seq_flags & NO_CDB_SENT) != 0) { ahd_print_path(ahd, scb); printf("No or incomplete CDB sent to device.\n"); + AHD_UNCORRECTABLE_ERROR(ahd); } else if ((ahd_inb_scbram(ahd, SCB_CONTROL) & STATUS_RCVD) == 0) { /* @@ -2484,6 +2520,7 @@ ahd_handle_proto_violation(struct ahd_softc *ahd) } else { ahd_print_path(ahd, scb); printf("Unknown protocol violation.\n"); + AHD_UNCORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); } } @@ -2499,6 +2536,7 @@ proto_violation_reset: found = ahd_reset_channel(ahd, 'A', TRUE); printf("%s: Issued Channel %c Bus Reset. " "%d SCBs aborted\n", ahd_name(ahd), 'A', found); + AHD_UNCORRECTABLE_ERROR(ahd); } else { /* * Leave the selection hardware off in case @@ -2521,6 +2559,7 @@ proto_violation_reset: } printf("Protocol violation %s. Attempting to abort.\n", ahd_lookup_phase_entry(curphase)->phasemsg); + AHD_UNCORRECTABLE_ERROR(ahd); } } @@ -2602,6 +2641,7 @@ ahd_clear_critical_section(struct ahd_softc *ahd) "%s: First Instruction 0x%x now 0x%x\n", ahd_name(ahd), ahd_name(ahd), first_instr, seqaddr); + AHD_FATAL_ERROR(ahd); ahd_dump_card_state(ahd); panic("critical section loop"); } @@ -3566,6 +3606,7 @@ ahd_setup_initiator_msgout(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, } else if (scb == NULL) { printf("%s: WARNING. No pending message for " "I_T msgin. Issuing NO-OP\n", ahd_name(ahd)); + AHD_CORRECTABLE_ERROR(ahd); ahd->msgout_buf[ahd->msgout_index++] = MSG_NOOP; ahd->msgout_len++; ahd->msg_type = MSG_TYPE_INITIATOR_MSGOUT; @@ -3596,6 +3637,7 @@ ahd_setup_initiator_msgout(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, ahd->msgout_len++; ahd_print_path(ahd, scb); printf("Bus Device Reset Message Sent\n"); + AHD_CORRECTABLE_ERROR(ahd); /* * Clear our selection hardware in advance of * the busfree. We may have an entry in the waiting @@ -3615,6 +3657,7 @@ ahd_setup_initiator_msgout(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, ahd_print_path(ahd, scb); printf("Abort%s Message Sent\n", (scb->hscb->control & TAG_ENB) != 0 ? " Tag" : ""); + AHD_CORRECTABLE_ERROR(ahd); /* * Clear our selection hardware in advance of * the busfree. We may have an entry in the waiting @@ -3638,6 +3681,7 @@ ahd_setup_initiator_msgout(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, "does not have a waiting message\n"); printf("SCSIID = %x, target_mask = %x\n", scb->hscb->scsiid, devinfo->target_mask); + AHD_FATAL_ERROR(ahd); panic("SCB = %d, SCB Control = %x:%x, MSG_OUT = %x " "SCB flags = %x", SCB_GET_TAG(scb), scb->hscb->control, ahd_inb_scbram(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT), @@ -5129,9 +5173,11 @@ ahd_handle_devreset(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, lun, AC_SENT_BDR, NULL); if (message != NULL - && (verbose_level <= bootverbose)) + && (verbose_level <= bootverbose)) { + AHD_CORRECTABLE_ERROR(ahd); printf("%s: %s on %c:%d. %d SCBs aborted\n", ahd_name(ahd), message, devinfo->channel, devinfo->target, found); + } } #ifdef AHD_TARGET_MODE @@ -5509,6 +5555,7 @@ ahd_reset(struct ahd_softc *ahd, int reinit) if (wait == 0) { printf("%s: WARNING - Failed chip reset! " "Trying to initialize anyway.\n", ahd_name(ahd)); + AHD_FATAL_ERROR(ahd); } ahd_outb(ahd, HCNTRL, ahd->pause); @@ -5630,6 +5677,7 @@ ahd_init_scbdata(struct ahd_softc *ahd) scb_data->maxhscbs = ahd_probe_scbs(ahd); if (scb_data->maxhscbs == 0) { printf("%s: No SCB space found\n", ahd_name(ahd)); + AHD_FATAL_ERROR(ahd); return (ENXIO); } @@ -6474,6 +6522,7 @@ ahd_init(struct ahd_softc *ahd) printf("%s: WARNING. Termination is not configured correctly.\n" "%s: WARNING. SCSI bus operations may FAIL.\n", ahd_name(ahd), ahd_name(ahd)); + AHD_CORRECTABLE_ERROR(ahd); } init_done: ahd_restart(ahd); @@ -6830,6 +6879,7 @@ ahd_default_config(struct ahd_softc *ahd) if (ahd_alloc_tstate(ahd, ahd->our_id, 'A') == NULL) { printf("%s: unable to allocate ahd_tmode_tstate. " "Failing attach\n", ahd_name(ahd)); + AHD_FATAL_ERROR(ahd); return (ENOMEM); } @@ -6909,6 +6959,7 @@ ahd_parse_cfgdata(struct ahd_softc *ahd, struct seeprom_config *sc) if (ahd_alloc_tstate(ahd, ahd->our_id, 'A') == NULL) { printf("%s: unable to allocate ahd_tmode_tstate. " "Failing attach\n", ahd_name(ahd)); + AHD_FATAL_ERROR(ahd); return (ENOMEM); } @@ -7135,6 +7186,7 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd) if (maxloops == 0) { printf("Infinite interrupt loop, INTSTAT = %x", ahd_inb(ahd, INTSTAT)); + AHD_FATAL_ERROR(ahd); } ahd->qfreeze_cnt++; ahd_outw(ahd, KERNEL_QFREEZE_COUNT, ahd->qfreeze_cnt); @@ -7440,6 +7492,7 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel, if (scb == NULL) { printf("qinpos = %d, SCB index = %d\n", qinpos, ahd->qinfifo[qinpos]); + AHD_FATAL_ERROR(ahd); panic("Loop 1\n"); } @@ -8195,20 +8248,26 @@ ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) switch (SIU_PKTFAIL_CODE(siu)) { case SIU_PFC_NONE: printf("No packet failure found\n"); + AHD_UNCORRECTABLE_ERROR(ahd); break; case SIU_PFC_CIU_FIELDS_INVALID: printf("Invalid Command IU Field\n"); + AHD_UNCORRECTABLE_ERROR(ahd); break; case SIU_PFC_TMF_NOT_SUPPORTED: printf("TMF not supportd\n"); + AHD_UNCORRECTABLE_ERROR(ahd); break; case SIU_PFC_TMF_FAILED: printf("TMF failed\n"); + AHD_UNCORRECTABLE_ERROR(ahd); break; case SIU_PFC_INVALID_TYPE_CODE: printf("Invalid L_Q Type code\n"); + AHD_UNCORRECTABLE_ERROR(ahd); break; case SIU_PFC_ILLEGAL_REQUEST: + AHD_UNCORRECTABLE_ERROR(ahd); printf("Illegal request\n"); default: break; @@ -9281,6 +9340,7 @@ ahd_recover_commands(struct ahd_softc *ahd) printf("%s: Recovery Initiated - Card was %spaused\n", ahd_name(ahd), was_paused ? "" : "not "); + AHD_CORRECTABLE_ERROR(ahd); ahd_dump_card_state(ahd); ahd_pause_and_flushwork(ahd); @@ -9507,6 +9567,7 @@ ahd_other_scb_timeout(struct ahd_softc *ahd, struct scb *scb, (scb->flags & SCB_OTHERTCL_TIMEOUT) != 0 ? " again\n" : "\n"); + AHD_UNCORRECTABLE_ERROR(ahd); newtimeout = aic_get_timeout(scb); scb->flags |= SCB_OTHERTCL_TIMEOUT; found = 0; @@ -9929,6 +9990,7 @@ ahd_handle_en_lun(struct ahd_softc *ahd, struct cam_sim *sim, union ccb *ccb) if (lstate != NULL) { xpt_print_path(ccb->ccb_h.path); printf("Lun already enabled\n"); + AHD_CORRECTABLE_ERROR(ahd); ccb->ccb_h.status = CAM_LUN_ALRDY_ENA; return; } diff --git a/sys/dev/aic7xxx/aic79xx.h b/sys/dev/aic7xxx/aic79xx.h index e9c8847905b3..f59d7740a588 100644 --- a/sys/dev/aic7xxx/aic79xx.h +++ b/sys/dev/aic7xxx/aic79xx.h @@ -1061,6 +1061,27 @@ typedef enum { #define AHD_MODE_UNKNOWN_MSK AHD_MK_MSK(AHD_MODE_UNKNOWN) #define AHD_MODE_ANY_MSK (~0) +typedef enum { + AHD_SYSCTL_ROOT, + AHD_SYSCTL_SUMMARY, + AHD_SYSCTL_DEBUG, + AHD_SYSCTL_NUMBER +} ahd_sysctl_types_t; + +typedef enum { + AHD_ERRORS_CORRECTABLE, + AHD_ERRORS_UNCORRECTABLE, + AHD_ERRORS_FATAL, + AHD_ERRORS_NUMBER +} ahd_sysctl_errors_t; + +#define AHD_CORRECTABLE_ERROR(sc) \ + (((sc)->summerr[AHD_ERRORS_CORRECTABLE])++) +#define AHD_UNCORRECTABLE_ERROR(sc) \ + (((sc)->summerr[AHD_ERRORS_UNCORRECTABLE])++) +#define AHD_FATAL_ERROR(sc) \ + (((sc)->summerr[AHD_ERRORS_FATAL])++) + typedef uint8_t ahd_mode_state; typedef void ahd_callback_t (void *); @@ -1158,6 +1179,13 @@ struct ahd_softc { uint32_t cmdcmplt_counts[AHD_STAT_BUCKETS]; uint32_t cmdcmplt_total; + /* + * Errors statistics and printouts. + */ + struct sysctl_ctx_list sysctl_ctx[AHD_SYSCTL_NUMBER]; + struct sysctl_oid *sysctl_tree[AHD_SYSCTL_NUMBER]; + u_int summerr[AHD_ERRORS_NUMBER]; + /* * Card characteristics */ diff --git a/sys/dev/aic7xxx/aic79xx_osm.c b/sys/dev/aic7xxx/aic79xx_osm.c index e375d2450568..375de63ae82e 100644 --- a/sys/dev/aic7xxx/aic79xx_osm.c +++ b/sys/dev/aic7xxx/aic79xx_osm.c @@ -77,6 +77,67 @@ static int ahd_create_path(struct ahd_softc *ahd, char channel, u_int target, u_int lun, struct cam_path **path); +static const char *ahd_sysctl_node_elements[] = { + "root", + "summary", + "debug" +}; + +#ifndef NO_SYSCTL_DESCR +static const char *ahd_sysctl_node_descriptions[] = { + "root error collection for aic79xx controllers", + "summary collection for aic79xx controllers", + "debug collection for aic79xx controllers" +}; +#endif + +static const char *ahd_sysctl_errors_elements[] = { + "Cerrors", + "Uerrors", + "Ferrors" +}; + +#ifndef NO_SYSCTL_DESCR +static const char *ahd_sysctl_errors_descriptions[] = { + "Correctable errors", + "Uncorrectable errors", + "Fatal errors" +}; +#endif + +static int +ahd_set_debugcounters(SYSCTL_HANDLER_ARGS) +{ + struct ahd_softc *sc; + int error, tmpv; + + tmpv = 0; + sc = arg1; + error = sysctl_handle_int(oidp, &tmpv, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + if (tmpv < 0 || tmpv >= AHD_ERRORS_NUMBER) + return (EINVAL); + sc->summerr[arg2] = tmpv; + return (0); +} + +static int +ahd_clear_allcounters(SYSCTL_HANDLER_ARGS) +{ + struct ahd_softc *sc; + int error, tmpv; + + tmpv = 0; + sc = arg1; + error = sysctl_handle_int(oidp, &tmpv, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + if (tmpv != 0) + bzero(sc->summerr, sizeof(sc->summerr)); + return (0); +} + static int ahd_create_path(struct ahd_softc *ahd, char channel, u_int target, u_int lun, struct cam_path **path) @@ -88,6 +149,48 @@ ahd_create_path(struct ahd_softc *ahd, char channel, u_int target, path_id, target, lun)); } +void +ahd_sysctl(struct ahd_softc *ahd) +{ + u_int i; + + for (i = 0; i < AHD_SYSCTL_NUMBER; i++) + sysctl_ctx_init(&ahd->sysctl_ctx[i]); + + ahd->sysctl_tree[AHD_SYSCTL_ROOT] = + SYSCTL_ADD_NODE(&ahd->sysctl_ctx[AHD_SYSCTL_ROOT], + SYSCTL_STATIC_CHILDREN(_hw), OID_AUTO, + device_get_nameunit(ahd->dev_softc), CTLFLAG_RD, 0, + ahd_sysctl_node_descriptions[AHD_SYSCTL_ROOT]); + SYSCTL_ADD_PROC(&ahd->sysctl_ctx[AHD_SYSCTL_ROOT], + SYSCTL_CHILDREN(ahd->sysctl_tree[AHD_SYSCTL_ROOT]), + OID_AUTO, "clear", CTLTYPE_UINT | CTLFLAG_RW, ahd, + 0, ahd_clear_allcounters, "IU", + "Clear all counters"); + + for (i = AHD_SYSCTL_SUMMARY; i < AHD_SYSCTL_NUMBER; i++) + ahd->sysctl_tree[i] = + SYSCTL_ADD_NODE(&ahd->sysctl_ctx[i], + SYSCTL_CHILDREN(ahd->sysctl_tree[AHD_SYSCTL_ROOT]), + OID_AUTO, ahd_sysctl_node_elements[i], + CTLFLAG_RD, 0, + ahd_sysctl_node_descriptions[i]); + + for (i = AHD_ERRORS_CORRECTABLE; i < AHD_ERRORS_NUMBER; i++) { + SYSCTL_ADD_UINT(&ahd->sysctl_ctx[AHD_SYSCTL_SUMMARY], + SYSCTL_CHILDREN(ahd->sysctl_tree[AHD_SYSCTL_SUMMARY]), + OID_AUTO, ahd_sysctl_errors_elements[i], + CTLFLAG_RD, &ahd->summerr[i], i, + ahd_sysctl_errors_descriptions[i]); + SYSCTL_ADD_PROC(&ahd->sysctl_ctx[AHD_SYSCTL_DEBUG], + SYSCTL_CHILDREN(ahd->sysctl_tree[AHD_SYSCTL_DEBUG]), + OID_AUTO, ahd_sysctl_errors_elements[i], + CTLFLAG_RW | CTLTYPE_UINT, ahd, i, + ahd_set_debugcounters, "IU", + ahd_sysctl_errors_descriptions[i]); + } +} + int ahd_map_int(struct ahd_softc *ahd) { diff --git a/sys/dev/aic7xxx/aic79xx_osm.h b/sys/dev/aic7xxx/aic79xx_osm.h index b786cec2baf4..692f3f9eed12 100644 --- a/sys/dev/aic7xxx/aic79xx_osm.h +++ b/sys/dev/aic7xxx/aic79xx_osm.h @@ -51,6 +51,7 @@ #include #include #include +#include #define AIC_PCI_CONFIG 1 #include @@ -259,6 +260,7 @@ void ahd_platform_free(struct ahd_softc *ahd); int ahd_map_int(struct ahd_softc *ahd); int ahd_attach(struct ahd_softc *); int ahd_softc_comp(struct ahd_softc *lahd, struct ahd_softc *rahd); +void ahd_sysctl(struct ahd_softc *ahd); int ahd_detach(device_t); #define ahd_platform_init(arg) diff --git a/sys/dev/aic7xxx/aic79xx_pci.c b/sys/dev/aic7xxx/aic79xx_pci.c index d19313a96a72..1e3bbed392f1 100644 --- a/sys/dev/aic7xxx/aic79xx_pci.c +++ b/sys/dev/aic7xxx/aic79xx_pci.c @@ -89,6 +89,7 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor) #define ID_AHA_39320D_B 0x801C900500419005ull #define ID_AHA_39320D_HP 0x8011900500AC0E11ull #define ID_AHA_39320D_B_HP 0x801C900500AC0E11ull +#define ID_AHA_39320LPE 0x8017900500459005ull #define ID_AIC7902_PCI_REV_A4 0x3 #define ID_AIC7902_PCI_REV_B0 0x10 #define SUBID_HP 0x0E11 @@ -204,6 +205,12 @@ struct ahd_pci_identity ahd_pci_ident_table [] = "Adaptec (HP OEM) 39320D Ultra320 SCSI adapter", ahd_aic7902_setup }, + { + ID_AHA_39320LPE, + ID_ALL_MASK, + "Adaptec 39320LPE Ultra320 SCSI adapter", + ahd_aic7902_setup + }, /* Generic chip probes for devices we don't know 'exactly' */ { ID_AIC7901 & ID_9005_GENERIC_MASK, @@ -241,10 +248,10 @@ static const char *pci_bus_modes[] = "PCI bus mode unknown", "PCI bus mode unknown", "PCI bus mode unknown", - "PCI-X 101-133Mhz", - "PCI-X 67-100Mhz", - "PCI-X 50-66Mhz", - "PCI 33 or 66Mhz" + "PCI-X 101-133MHz", + "PCI-X 67-100MHz", + "PCI-X 50-66MHz", + "PCI 33 or 66MHz" }; #define TESTMODE 0x00000800ul diff --git a/sys/dev/aic7xxx/aicasm/Makefile b/sys/dev/aic7xxx/aicasm/Makefile index 222c96a717e0..9c7349390f0a 100644 --- a/sys/dev/aic7xxx/aicasm/Makefile +++ b/sys/dev/aic7xxx/aicasm/Makefile @@ -15,7 +15,7 @@ SRCS= ${GENHDRS} ${CSRCS} ${YSRCS} ${LSRCS} CLEANFILES+= ${GENHDRS} ${YSRCS:R:C/(.*)/\1.output/g} DPADD= ${LIBL} LDADD= -ll -WARNS?= 6 +WARNS?= 5 # Correct path for kernel builds # Don't rely on the kernel's .depend file diff --git a/sys/dev/aic7xxx/aicasm/aicasm.c b/sys/dev/aic7xxx/aicasm/aicasm.c index 6ba57bcc29ec..6c88f90000a0 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm.c +++ b/sys/dev/aic7xxx/aicasm/aicasm.c @@ -306,7 +306,7 @@ main(int argc, char *argv[]) } static void -usage() +usage(void) { (void)fprintf(stderr, @@ -318,7 +318,7 @@ usage() } static void -back_patch() +back_patch(void) { struct instruction *cur_instr; @@ -347,7 +347,7 @@ back_patch() } static void -output_code() +output_code(void) { struct instruction *cur_instr; patch_t *cur_patch; @@ -639,6 +639,8 @@ output_listing(char *ifilename) } instrptr++; } + free(func_values); + /* Dump the remainder of the file */ while(fgets(buf, sizeof(buf), ifile) != NULL) fprintf(listfile, " %s", buf); @@ -731,7 +733,7 @@ stop(const char *string, int err_code) } struct instruction * -seq_alloc() +seq_alloc(void) { struct instruction *new_instr; @@ -745,7 +747,7 @@ seq_alloc() } critical_section_t * -cs_alloc() +cs_alloc(void) { critical_section_t *new_cs; @@ -759,7 +761,7 @@ cs_alloc() } scope_t * -scope_alloc() +scope_alloc(void) { scope_t *new_scope; diff --git a/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l index b8700eb4adf3..ad06507486f9 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l +++ b/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l @@ -152,7 +152,7 @@ MCARG [^(), \t]+ %% int -mmwrap() +mmwrap(void) { stop("EOF encountered in macro call", EX_DATAERR); return (1); diff --git a/sys/dev/aic7xxx/aicasm/aicasm_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_scan.l index 9dd98946159e..28218621aea0 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm_scan.l +++ b/sys/dev/aic7xxx/aicasm/aicasm_scan.l @@ -590,7 +590,7 @@ next_substitution(struct symbol *mac_symbol, const char *body_pos, } int -yywrap() +yywrap(void) { include_t *include; diff --git a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c index e7bbb699bf63..2e5d5c4feed1 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c +++ b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c @@ -129,7 +129,7 @@ symbol_delete(symbol_t *symbol) } void -symtable_open() +symtable_open(void) { symtable = dbopen(/*filename*/NULL, O_CREAT | O_NONBLOCK | O_RDWR, /*mode*/0, DB_HASH, @@ -143,7 +143,7 @@ symtable_open() } void -symtable_close() +symtable_close(void) { if (symtable != NULL) { DBT key; diff --git a/sys/dev/alc/if_alc.c b/sys/dev/alc/if_alc.c index a53af779b03c..e95b04453cd9 100644 --- a/sys/dev/alc/if_alc.c +++ b/sys/dev/alc/if_alc.c @@ -84,9 +84,6 @@ __FBSDID("$FreeBSD$"); #else #define ALC_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) #endif -#ifndef IFCAP_VLAN_HWTSO -#define IFCAP_VLAN_HWTSO 0 -#endif MODULE_DEPEND(alc, pci, 1, 1, 1); MODULE_DEPEND(alc, ether, 1, 1, 1); @@ -234,6 +231,16 @@ alc_miibus_readreg(device_t dev, int phy, int reg) if (phy != sc->alc_phyaddr) return (0); + /* + * For AR8132 fast ethernet controller, do not report 1000baseT + * capability to mii(4). Even though AR8132 uses the same + * model/revision number of F1 gigabit PHY, the PHY has no + * ability to establish 1000baseT link. + */ + if ((sc->alc_flags & ALC_FLAG_FASTETHER) != 0 && + reg == MII_EXTSR) + return (0); + CSR_WRITE_4(sc, ALC_MDIO, MDIO_OP_EXECUTE | MDIO_OP_READ | MDIO_SUP_PREAMBLE | MDIO_CLK_25_4 | MDIO_REG_ADDR(reg)); for (i = ALC_PHY_TIMEOUT; i > 0; i--) { @@ -746,8 +753,8 @@ alc_attach(device_t dev) ether_ifattach(ifp, sc->alc_eaddr); /* VLAN capability setup. */ - ifp->if_capabilities |= IFCAP_VLAN_MTU; - ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM; + ifp->if_capabilities |= IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | + IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO; ifp->if_capenable = ifp->if_capabilities; /* * XXX @@ -1781,7 +1788,7 @@ alc_encap(struct alc_softc *sc, struct mbuf **m_head) struct tcphdr *tcp; bus_dma_segment_t txsegs[ALC_MAXTXSEGS]; bus_dmamap_t map; - uint32_t cflags, hdrlen, ip_off, poff, vtag; + uint32_t cflags, hdrlen, poff, vtag; int error, idx, nsegs, prod; ALC_LOCK_ASSERT(sc); @@ -1791,7 +1798,7 @@ alc_encap(struct alc_softc *sc, struct mbuf **m_head) m = *m_head; ip = NULL; tcp = NULL; - ip_off = poff = 0; + poff = 0; if ((m->m_pkthdr.csum_flags & (ALC_CSUM_FEATURES | CSUM_TSO)) != 0) { /* * AR8131/AR8132 requires offset of TCP/UDP header in its @@ -1801,7 +1808,6 @@ alc_encap(struct alc_softc *sc, struct mbuf **m_head) * cycles on FreeBSD so fast host CPU is required to get * smooth TSO performance. */ - struct ether_header *eh; if (M_WRITABLE(m) == 0) { /* Get a writable copy. */ @@ -1815,32 +1821,13 @@ alc_encap(struct alc_softc *sc, struct mbuf **m_head) *m_head = m; } - ip_off = sizeof(struct ether_header); - m = m_pullup(m, ip_off); + m = m_pullup(m, sizeof(struct ether_header) + sizeof(struct ip)); if (m == NULL) { *m_head = NULL; return (ENOBUFS); } - eh = mtod(m, struct ether_header *); - /* - * Check if hardware VLAN insertion is off. - * Additional check for LLC/SNAP frame? - */ - if (eh->ether_type == htons(ETHERTYPE_VLAN)) { - ip_off = sizeof(struct ether_vlan_header); - m = m_pullup(m, ip_off); - if (m == NULL) { - *m_head = NULL; - return (ENOBUFS); - } - } - m = m_pullup(m, ip_off + sizeof(struct ip)); - if (m == NULL) { - *m_head = NULL; - return (ENOBUFS); - } - ip = (struct ip *)(mtod(m, char *) + ip_off); - poff = ip_off + (ip->ip_hl << 2); + ip = (struct ip *)(mtod(m, char *) + sizeof(struct ether_header)); + poff = sizeof(struct ether_header) + (ip->ip_hl << 2); if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { m = m_pullup(m, poff + sizeof(struct tcphdr)); if (m == NULL) { @@ -2123,6 +2110,7 @@ alc_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) (ifp->if_capenable & IFCAP_TSO4) != 0) { ifp->if_capenable &= ~IFCAP_TSO4; ifp->if_hwassist &= ~CSUM_TSO; + VLAN_CAPABILITIES(ifp); } ALC_UNLOCK(sc); } @@ -2194,14 +2182,6 @@ alc_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if ((mask & IFCAP_VLAN_HWTSO) != 0 && (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) ifp->if_capenable ^= IFCAP_VLAN_HWTSO; - /* - * VLAN hardware tagging is required to do checksum - * offload or TSO on VLAN interface. Checksum offload - * on VLAN interface also requires hardware checksum - * offload of parent interface. - */ - if ((ifp->if_capenable & IFCAP_TXCSUM) == 0) - ifp->if_capenable &= ~IFCAP_VLAN_HWCSUM; if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) ifp->if_capenable &= ~(IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM); @@ -3466,7 +3446,7 @@ alc_rxfilter(struct alc_softc *sc) TAILQ_FOREACH(ifma, &sc->alc_ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - crc = ether_crc32_le(LLADDR((struct sockaddr_dl *) + crc = ether_crc32_be(LLADDR((struct sockaddr_dl *) ifma->ifma_addr), ETHER_ADDR_LEN); mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); } diff --git a/sys/dev/ale/if_ale.c b/sys/dev/ale/if_ale.c index 65e068fa5db3..76f1b74f2afa 100644 --- a/sys/dev/ale/if_ale.c +++ b/sys/dev/ale/if_ale.c @@ -78,9 +78,6 @@ __FBSDID("$FreeBSD$"); /* For more information about Tx checksum offload issues see ale_encap(). */ #define ALE_CSUM_FEATURES (CSUM_TCP | CSUM_UDP) -#ifndef IFCAP_VLAN_HWTSO -#define IFCAP_VLAN_HWTSO 0 -#endif MODULE_DEPEND(ale, pci, 1, 1, 1); MODULE_DEPEND(ale, ether, 1, 1, 1); @@ -617,8 +614,8 @@ ale_attach(device_t dev) ether_ifattach(ifp, sc->ale_eaddr); /* VLAN capability setup. */ - ifp->if_capabilities |= IFCAP_VLAN_MTU; - ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM; + ifp->if_capabilities |= IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | + IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO; ifp->if_capenable = ifp->if_capabilities; /* * Even though controllers supported by ale(3) have Rx checksum @@ -2003,29 +2000,19 @@ ale_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if ((mask & IFCAP_WOL_MAGIC) != 0 && (ifp->if_capabilities & IFCAP_WOL_MAGIC) != 0) ifp->if_capenable ^= IFCAP_WOL_MAGIC; - - if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && - (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) { - ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; - ale_rxvlan(sc); - } if ((mask & IFCAP_VLAN_HWCSUM) != 0 && (ifp->if_capabilities & IFCAP_VLAN_HWCSUM) != 0) ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; if ((mask & IFCAP_VLAN_HWTSO) != 0 && (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) ifp->if_capenable ^= IFCAP_VLAN_HWTSO; - /* - * VLAN hardware tagging is required to do checksum - * offload or TSO on VLAN interface. Checksum offload - * on VLAN interface also requires hardware checksum - * offload of parent interface. - */ - if ((ifp->if_capenable & IFCAP_TXCSUM) == 0) - ifp->if_capenable &= ~IFCAP_VLAN_HWCSUM; - if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) - ifp->if_capenable &= - ~(IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM); + if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) { + ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) + ifp->if_capenable &= ~IFCAP_VLAN_HWTSO; + ale_rxvlan(sc); + } ALE_UNLOCK(sc); VLAN_CAPABILITIES(ifp); break; @@ -3060,7 +3047,7 @@ ale_rxfilter(struct ale_softc *sc) TAILQ_FOREACH(ifma, &sc->ale_ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; - crc = ether_crc32_le(LLADDR((struct sockaddr_dl *) + crc = ether_crc32_be(LLADDR((struct sockaddr_dl *) ifma->ifma_addr), ETHER_ADDR_LEN); mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); } diff --git a/sys/dev/amd/amd.c b/sys/dev/amd/amd.c index 53753994ec8d..f4b3d80f5f2c 100644 --- a/sys/dev/amd/amd.c +++ b/sys/dev/amd/amd.c @@ -1657,7 +1657,7 @@ amdhandlemsgreject(struct amd_softc *amd) tinfo_sync_period[pDCB->SyncPeriod - 4]; pDCB->tinfo.goal.offset = pDCB->SyncOffset; pDCB->tinfo.current.period = - tinfo_sync_period[pDCB->SyncPeriod - 4];; + tinfo_sync_period[pDCB->SyncPeriod - 4]; pDCB->tinfo.current.offset = pDCB->SyncOffset; /* diff --git a/sys/dev/amdsbwd/amdsbwd.c b/sys/dev/amdsbwd/amdsbwd.c new file mode 100644 index 000000000000..418e1941f2a7 --- /dev/null +++ b/sys/dev/amdsbwd/amdsbwd.c @@ -0,0 +1,431 @@ +/*- + * Copyright (c) 2009 Andriy Gapon + * 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. + */ + +/* + * This is a driver for watchdog timer present in AMD SB600/SB7xx + * south bridges and other watchdog timers advertised via WDRT ACPI table. + * Please see the following specifications for the descriptions of the + * registers and flags: + * - AMD SB600 Register Reference Guide, Public Version, Rev. 3.03 (SB600 RRG) + * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/46155_sb600_rrg_pub_3.03.pdf + * - AMD SB700/710/750 Register Reference Guide (RRG) + * http://developer.amd.com/assets/43009_sb7xx_rrg_pub_1.00.pdf + * - AMD SB700/710/750 Register Programming Requirements (RPR) + * http://developer.amd.com/assets/42413_sb7xx_rpr_pub_1.00.pdf + * Please see the following for Watchdog Resource Table specification: + * - Watchdog Timer Hardware Requirements for Windows Server 2003 (WDRT) + * http://www.microsoft.com/whdc/system/sysinternals/watchdog.mspx + * AMD SB600/SB7xx watchdog hardware seems to conform to the above, + * but my system doesn't provide the table. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* RRG 2.3.3.1.1, page 161. */ +#define AMDSB_PMIO_INDEX 0xcd6 +#define AMDSB_PMIO_DATA (PMIO_INDEX + 1) +#define AMDSB_PMIO_WIDTH 2 +/* RRG 2.3.3.2, page 181. */ +#define AMDSB_PM_RESET_STATUS0 0x44 +#define AMDSB_PM_RESET_STATUS1 0x45 +#define AMDSB_WD_RST_STS 0x02 +/* RRG 2.3.3.2, page 188; RPR 2.36, page 30. */ +#define AMDSB_PM_WDT_CTRL 0x69 +#define AMDSB_WDT_DISABLE 0x01 +#define AMDSB_WDT_RES_MASK (0x02 | 0x04) +#define AMDSB_WDT_RES_32US 0x00 +#define AMDSB_WDT_RES_10MS 0x02 +#define AMDSB_WDT_RES_100MS 0x04 +#define AMDSB_WDT_RES_1S 0x06 +#define AMDSB_PM_WDT_BASE_LSB 0x6c +#define AMDSB_PM_WDT_BASE_MSB 0x6f +/* RRG 2.3.4, page 223, WDRT. */ +#define AMDSB_WD_CTRL 0x00 +#define AMDSB_WD_RUN 0x01 +#define AMDSB_WD_FIRED 0x02 +#define AMDSB_WD_SHUTDOWN 0x04 +#define AMDSB_WD_DISABLE 0x08 +#define AMDSB_WD_RESERVED 0x70 +#define AMDSB_WD_RELOAD 0x80 +#define AMDSB_WD_COUNT 0x04 +#define AMDSB_WD_COUNT_MASK 0xffff +#define AMDSB_WDIO_REG_WIDTH 4 +/* WDRT */ +#define MAXCOUNT_MIN_VALUE 511 +/* RRG 2.3.1.1, page 122; SB600 RRG 2.3.1.1, page 97. */ +#define AMDSB7xx_SMBUS_DEVID 0x43851002 + +#define amdsbwd_verbose_printf(dev, ...) \ + do { \ + if (bootverbose) \ + device_printf(dev, __VA_ARGS__);\ + } while (0) + +struct amdsbwd_softc { + device_t dev; + eventhandler_tag ev_tag; + struct resource *res_ctrl; + struct resource *res_count; + int rid_ctrl; + int rid_count; + int ms_per_tick; + int max_ticks; + int active; + unsigned int timeout; +}; + +static void amdsbwd_identify(driver_t *driver, device_t parent); +static int amdsbwd_probe(device_t dev); +static int amdsbwd_attach(device_t dev); +static int amdsbwd_detach(device_t dev); + +static device_method_t amdsbwd_methods[] = { + DEVMETHOD(device_identify, amdsbwd_identify), + DEVMETHOD(device_probe, amdsbwd_probe), + DEVMETHOD(device_attach, amdsbwd_attach), + DEVMETHOD(device_detach, amdsbwd_detach), +#if 0 + DEVMETHOD(device_shutdown, amdsbwd_detach), +#endif + {0, 0} +}; + +static devclass_t amdsbwd_devclass; +static driver_t amdsbwd_driver = { + "amdsbwd", + amdsbwd_methods, + sizeof(struct amdsbwd_softc) +}; + +DRIVER_MODULE(amdsbwd, isa, amdsbwd_driver, amdsbwd_devclass, NULL, NULL); + + +static uint8_t +pmio_read(struct resource *res, uint8_t reg) +{ + bus_write_1(res, 0, reg); /* Index */ + return (bus_read_1(res, 1)); /* Data */ +} + +static void +pmio_write(struct resource *res, uint8_t reg, uint8_t val) +{ + bus_write_1(res, 0, reg); /* Index */ + bus_write_1(res, 1, val); /* Data */ +} + +static uint32_t +wdctrl_read(struct amdsbwd_softc *sc) +{ + return (bus_read_4(sc->res_ctrl, 0)); +} + +static void +wdctrl_write(struct amdsbwd_softc *sc, uint32_t val) +{ + bus_write_4(sc->res_ctrl, 0, val); +} + +static __unused uint32_t +wdcount_read(struct amdsbwd_softc *sc) +{ + return (bus_read_4(sc->res_count, 0)); +} + +static void +wdcount_write(struct amdsbwd_softc *sc, uint32_t val) +{ + bus_write_4(sc->res_count, 0, val); +} + +static void +amdsbwd_tmr_enable(struct amdsbwd_softc *sc) +{ + uint32_t val; + + val = wdctrl_read(sc); + val |= AMDSB_WD_RUN; + wdctrl_write(sc, val); + sc->active = 1; + amdsbwd_verbose_printf(sc->dev, "timer enabled\n"); +} + +static void +amdsbwd_tmr_disable(struct amdsbwd_softc *sc) +{ + uint32_t val; + + val = wdctrl_read(sc); + val &= ~AMDSB_WD_RUN; + wdctrl_write(sc, val); + sc->active = 0; + amdsbwd_verbose_printf(sc->dev, "timer disabled\n"); +} + +static void +amdsbwd_tmr_reload(struct amdsbwd_softc *sc) +{ + uint32_t val; + + val = wdctrl_read(sc); + val |= AMDSB_WD_RELOAD; + wdctrl_write(sc, val); +} + +static void +amdsbwd_tmr_set(struct amdsbwd_softc *sc, uint16_t timeout) +{ + + timeout &= AMDSB_WD_COUNT_MASK; + wdcount_write(sc, timeout); + sc->timeout = timeout; + amdsbwd_verbose_printf(sc->dev, "timeout set to %u ticks\n", timeout); +} + +static void +amdsbwd_event(void *arg, unsigned int cmd, int *error) +{ + struct amdsbwd_softc *sc = arg; + unsigned int timeout; + + /* convert from power-of-two-ns to WDT ticks */ + cmd &= WD_INTERVAL; + if (cmd < WD_TO_1SEC) + cmd = 0; + timeout = ((uint64_t)1 << (cmd - WD_TO_1MS)) / sc->ms_per_tick; + if (timeout > sc->max_ticks) + timeout = sc->max_ticks; + if (cmd) { + if (timeout != sc->timeout) { + amdsbwd_tmr_set(sc, timeout); + if (!sc->active) + amdsbwd_tmr_enable(sc); + } + amdsbwd_tmr_reload(sc); + *error = 0; + } else { + if (sc->active) + amdsbwd_tmr_disable(sc); + } +} + +static void +amdsbwd_identify(driver_t *driver, device_t parent) +{ + device_t child; + device_t smb_dev; + + if (resource_disabled("amdsbwd", 0)) + return; + if (device_find_child(parent, "amdsbwd", -1) != NULL) + return; + + /* + * Try to identify SB600/SB7xx by PCI Device ID of SMBus device + * that should be present at bus 0, device 20, function 0. + */ + smb_dev = pci_find_bsf(0, 20, 0); + if (smb_dev == NULL) + return; + if (pci_get_devid(smb_dev) != AMDSB7xx_SMBUS_DEVID) + return; + + child = BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, "amdsbwd", -1); + if (child == NULL) + device_printf(parent, "add amdsbwd child failed\n"); +} + +static int +amdsbwd_probe(device_t dev) +{ + struct resource *res; + uint32_t addr; + uint32_t val; + int rid; + int rc; + int i; + + /* Do not claim some ISA PnP device by accident. */ + if (isa_get_logicalid(dev) != 0) + return (ENXIO); + + rc = bus_set_resource(dev, SYS_RES_IOPORT, 0, AMDSB_PMIO_INDEX, + AMDSB_PMIO_WIDTH); + if (rc != 0) { + device_printf(dev, "bus_set_resource for IO failed\n"); + return (ENXIO); + } + rid = 0; + res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0ul, ~0ul, + AMDSB_PMIO_WIDTH, RF_ACTIVE | RF_SHAREABLE); + if (res == NULL) { + device_printf(dev, "bus_alloc_resource for IO failed\n"); + return (ENXIO); + } + + /* Report cause of previous reset for user's convenience. */ + val = pmio_read(res, AMDSB_PM_RESET_STATUS0); + if (val != 0) + amdsbwd_verbose_printf(dev, "ResetStatus0 = %#04x\n", val); + val = pmio_read(res, AMDSB_PM_RESET_STATUS1); + if (val != 0) + amdsbwd_verbose_printf(dev, "ResetStatus1 = %#04x\n", val); + if ((val & AMDSB_WD_RST_STS) != 0) + device_printf(dev, "Previous Reset was caused by Watchdog\n"); + + /* Find base address of memory mapped WDT registers. */ + for (addr = 0, i = 0; i < 4; i++) { + addr <<= 8; + addr |= pmio_read(res, AMDSB_PM_WDT_BASE_MSB - i); + } + amdsbwd_verbose_printf(dev, "memory base address = %#010x\n", addr); + rc = bus_set_resource(dev, SYS_RES_MEMORY, 0, addr + AMDSB_WD_CTRL, + AMDSB_WDIO_REG_WIDTH); + if (rc != 0) { + device_printf(dev, "bus_set_resource for control failed\n"); + return (ENXIO); + } + rc = bus_set_resource(dev, SYS_RES_MEMORY, 1, addr + AMDSB_WD_COUNT, + AMDSB_WDIO_REG_WIDTH); + if (rc != 0) { + device_printf(dev, "bus_set_resource for count failed\n"); + return (ENXIO); + } + + /* Set watchdog timer tick to 10ms. */ + val = pmio_read(res, AMDSB_PM_WDT_CTRL); + val &= ~AMDSB_WDT_RES_MASK; + val |= AMDSB_WDT_RES_10MS; + pmio_write(res, AMDSB_PM_WDT_CTRL, val); + + /* Enable watchdog device (in stopped state). */ + val = pmio_read(res, AMDSB_PM_WDT_CTRL); + val &= ~AMDSB_WDT_DISABLE; + pmio_write(res, AMDSB_PM_WDT_CTRL, val); + + /* + * XXX TODO: Ensure that watchdog decode is enabled + * (register 0x41, bit 3). + */ + bus_release_resource(dev, SYS_RES_IOPORT, rid, res); + bus_delete_resource(dev, SYS_RES_IOPORT, rid); + + device_set_desc(dev, "AMD SB600/SB7xx Watchdog Timer"); + return (0); +} + +static int +amdsbwd_attach_sb(device_t dev, struct amdsbwd_softc *sc) +{ + sc->max_ticks = UINT16_MAX; + sc->ms_per_tick = 10; + sc->rid_ctrl = 0; + sc->rid_count = 1; + + sc->res_ctrl = bus_alloc_resource_any(dev, SYS_RES_MEMORY, + &sc->rid_ctrl, RF_ACTIVE); + if (sc->res_ctrl == NULL) { + device_printf(dev, "bus_alloc_resource for ctrl failed\n"); + return (ENXIO); + } + sc->res_count = bus_alloc_resource_any(dev, SYS_RES_MEMORY, + &sc->rid_count, RF_ACTIVE); + if (sc->res_count == NULL) { + device_printf(dev, "bus_alloc_resource for count failed\n"); + return (ENXIO); + } + return (0); +} + +static int +amdsbwd_attach(device_t dev) +{ + struct amdsbwd_softc *sc; + int rc; + + sc = device_get_softc(dev); + sc->dev = dev; + + rc = amdsbwd_attach_sb(dev, sc); + if (rc != 0) + goto fail; + + /* Setup initial state of Watchdog Control. */ + wdctrl_write(sc, AMDSB_WD_FIRED); + + if (wdctrl_read(sc) & AMDSB_WD_DISABLE) { + device_printf(dev, "watchdog hardware is disabled\n"); + goto fail; + } + + sc->ev_tag = EVENTHANDLER_REGISTER(watchdog_list, amdsbwd_event, sc, + EVENTHANDLER_PRI_ANY); + + return (0); + +fail: + amdsbwd_detach(dev); + return (ENXIO); +} + +static int +amdsbwd_detach(device_t dev) +{ + struct amdsbwd_softc *sc; + + sc = device_get_softc(dev); + if (sc->ev_tag != NULL) + EVENTHANDLER_DEREGISTER(watchdog_list, sc->ev_tag); + + if (sc->active) + amdsbwd_tmr_disable(sc); + + if (sc->res_ctrl != NULL) + bus_release_resource(dev, SYS_RES_MEMORY, sc->rid_ctrl, + sc->res_ctrl); + + if (sc->res_count != NULL) + bus_release_resource(dev, SYS_RES_MEMORY, sc->rid_count, + sc->res_count); + + return (0); +} + diff --git a/sys/dev/amr/amr.c b/sys/dev/amr/amr.c index 2061fcc801f9..5ccf9b8a1a5b 100644 --- a/sys/dev/amr/amr.c +++ b/sys/dev/amr/amr.c @@ -221,11 +221,11 @@ amr_attach(struct amr_softc *sc) sc->amr_submit_command = amr_std_submit_command; sc->amr_get_work = amr_std_get_work; sc->amr_poll_command = amr_std_poll_command; - amr_std_attach_mailbox(sc);; + amr_std_attach_mailbox(sc); } #ifdef AMR_BOARD_INIT - if ((AMR_IS_QUARTZ(sc) ? amr_quartz_init(sc) : amr_std_init(sc)))) + if ((AMR_IS_QUARTZ(sc) ? amr_quartz_init(sc) : amr_std_init(sc))) return(ENXIO); #endif diff --git a/sys/dev/an/if_an.c b/sys/dev/an/if_an.c index 1d22322d8f7e..6d9ef96831bd 100644 --- a/sys/dev/an/if_an.c +++ b/sys/dev/an/if_an.c @@ -140,9 +140,11 @@ static void an_reset(struct an_softc *); static int an_init_mpi350_desc(struct an_softc *); static int an_ioctl(struct ifnet *, u_long, caddr_t); static void an_init(void *); +static void an_init_locked(struct an_softc *); static int an_init_tx_ring(struct an_softc *); static void an_start(struct ifnet *); -static void an_watchdog(struct ifnet *); +static void an_start_locked(struct ifnet *); +static void an_watchdog(struct an_softc *); static void an_rxeof(struct an_softc *); static void an_txeof(struct an_softc *, int); @@ -314,7 +316,7 @@ an_pci_probe(device_t dev) struct an_softc *sc = device_get_softc(dev); mtx_init(&sc->an_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF | MTX_RECURSE); + MTX_DEF); return(0); } @@ -347,10 +349,6 @@ an_probe(device_t dev) * to be able to issue commands and call some of the * other routines. */ - sc->an_bhandle = rman_get_bushandle(sc->port_res); - sc->an_btag = rman_get_bustag(sc->port_res); - sc->an_unit = device_get_unit(dev); - ssid.an_len = sizeof(ssid); ssid.an_type = AN_RID_SSIDLIST; @@ -360,7 +358,7 @@ an_probe(device_t dev) CSR_WRITE_2(sc, AN_EVENT_ACK(sc->mpi350), 0xFFFF); mtx_init(&sc->an_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF | MTX_RECURSE); + MTX_DEF); AN_LOCK(sc); an_reset(sc); @@ -600,8 +598,7 @@ an_init_mpi350_desc(struct an_softc *sc) cmd_struct.an_parm1 = AN_RX_DESC_OFFSET; cmd_struct.an_parm2 = AN_MAX_RX_DESC; if (an_cmd_struct(sc, &cmd_struct, &reply)) { - printf("an%d: failed to allocate RX descriptor\n", - sc->an_unit); + if_printf(sc->an_ifp, "failed to allocate RX descriptor\n"); return(EIO); } @@ -629,8 +626,7 @@ an_init_mpi350_desc(struct an_softc *sc) cmd_struct.an_parm1 = AN_TX_DESC_OFFSET; cmd_struct.an_parm2 = AN_MAX_TX_DESC; if (an_cmd_struct(sc, &cmd_struct, &reply)) { - printf("an%d: failed to allocate TX descriptor\n", - sc->an_unit); + if_printf(sc->an_ifp, "failed to allocate TX descriptor\n"); return(EIO); } @@ -659,8 +655,7 @@ an_init_mpi350_desc(struct an_softc *sc) cmd_struct.an_parm1 = AN_HOST_DESC_OFFSET; cmd_struct.an_parm2 = 1; if (an_cmd_struct(sc, &cmd_struct, &reply)) { - printf("an%d: failed to allocate host descriptor\n", - sc->an_unit); + if_printf(sc->an_ifp, "failed to allocate host descriptor\n"); return(EIO); } @@ -678,7 +673,7 @@ an_init_mpi350_desc(struct an_softc *sc) } int -an_attach(struct an_softc *sc, int unit, int flags) +an_attach(struct an_softc *sc, int flags) { struct ifnet *ifp; int error = EIO; @@ -687,7 +682,7 @@ an_attach(struct an_softc *sc, int unit, int flags) ifp = sc->an_ifp = if_alloc(IFT_ETHER); if (ifp == NULL) { - printf("an%d: can not if_alloc()\n", sc->an_unit); + device_printf(sc->an_dev, "can not if_alloc()\n"); goto fail; } @@ -708,7 +703,7 @@ an_attach(struct an_softc *sc, int unit, int flags) /* Load factory config */ if (an_cmd(sc, AN_CMD_READCFG, 0)) { - printf("an%d: failed to load config data\n", sc->an_unit); + device_printf(sc->an_dev, "failed to load config data\n"); goto fail; } @@ -716,7 +711,7 @@ an_attach(struct an_softc *sc, int unit, int flags) sc->an_config.an_type = AN_RID_GENCONFIG; sc->an_config.an_len = sizeof(struct an_ltv_genconfig); if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_config)) { - printf("an%d: read record failed\n", sc->an_unit); + device_printf(sc->an_dev, "read record failed\n"); goto fail; } @@ -724,7 +719,7 @@ an_attach(struct an_softc *sc, int unit, int flags) sc->an_caps.an_type = AN_RID_CAPABILITIES; sc->an_caps.an_len = sizeof(struct an_ltv_caps); if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_caps)) { - printf("an%d: read record failed\n", sc->an_unit); + device_printf(sc->an_dev, "read record failed\n"); goto fail; } @@ -732,7 +727,7 @@ an_attach(struct an_softc *sc, int unit, int flags) sc->an_ssidlist.an_type = AN_RID_SSIDLIST; sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist_new); if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) { - printf("an%d: read record failed\n", sc->an_unit); + device_printf(sc->an_dev, "read record failed\n"); goto fail; } @@ -740,7 +735,7 @@ an_attach(struct an_softc *sc, int unit, int flags) sc->an_aplist.an_type = AN_RID_APLIST; sc->an_aplist.an_len = sizeof(struct an_ltv_aplist); if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_aplist)) { - printf("an%d: read record failed\n", sc->an_unit); + device_printf(sc->an_dev, "read record failed\n"); goto fail; } @@ -751,26 +746,25 @@ an_attach(struct an_softc *sc, int unit, int flags) sc->an_rssimap.an_type = AN_RID_RSSI_MAP; sc->an_rssimap.an_len = sizeof(struct an_ltv_rssi_map); if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_rssimap)) { - printf("an%d: unable to get RSSI <-> dBM map\n", sc->an_unit); + device_printf(sc->an_dev, + "unable to get RSSI <-> dBM map\n"); } else { - printf("an%d: got RSSI <-> dBM map\n", sc->an_unit); + device_printf(sc->an_dev, "got RSSI <-> dBM map\n"); sc->an_have_rssimap = 1; } } else { - printf("an%d: no RSSI <-> dBM map\n", sc->an_unit); + device_printf(sc->an_dev, "no RSSI <-> dBM map\n"); } #endif AN_UNLOCK(sc); ifp->if_softc = sc; - sc->an_unit = unit; if_initname(ifp, device_get_name(sc->an_dev), device_get_unit(sc->an_dev)); ifp->if_mtu = ETHERMTU; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = an_ioctl; ifp->if_start = an_start; - ifp->if_watchdog = an_watchdog; ifp->if_init = an_init; ifp->if_baudrate = 10000000; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); @@ -907,9 +901,9 @@ an_rxeof(struct an_softc *sc) + sizeof(rx_frame); /* Check for insane frame length */ if (len > sizeof(sc->buf_802_11)) { - printf("an%d: oversized packet " + if_printf(ifp, "oversized packet " "received (%d, %d)\n", - sc->an_unit, len, MCLBYTES); + len, MCLBYTES); ifp->if_ierrors++; return; } @@ -933,9 +927,9 @@ an_rxeof(struct an_softc *sc) + ieee80211_header_len; /* Check for insane frame length */ if (len > sizeof(sc->buf_802_11)) { - printf("an%d: oversized packet " + if_printf(ifp, "oversized packet " "received (%d, %d)\n", - sc->an_unit, len, MCLBYTES); + len, MCLBYTES); ifp->if_ierrors++; return; } @@ -993,9 +987,9 @@ an_rxeof(struct an_softc *sc) len = rx_frame_802_3.an_rx_802_3_payload_len; if (len > sizeof(sc->buf_802_11)) { m_freem(m); - printf("an%d: oversized packet " + if_printf(ifp, "oversized packet " "received (%d, %d)\n", - sc->an_unit, len, MCLBYTES); + len, MCLBYTES); ifp->if_ierrors++; return; } @@ -1073,9 +1067,9 @@ an_rxeof(struct an_softc *sc) len = an_rx_desc.an_len + 12; if (len > MCLBYTES) { m_freem(m); - printf("an%d: oversized packet " + if_printf(ifp, "oversized packet " "received (%d, %d)\n", - sc->an_unit, len, MCLBYTES); + len, MCLBYTES); ifp->if_ierrors++; return; } @@ -1116,9 +1110,8 @@ an_rxeof(struct an_softc *sc) ((u_int32_t *)(void *)&an_rx_desc)[i]); } else { - printf("an%d: Didn't get valid RX packet " + if_printf(ifp, "Didn't get valid RX packet " "%x %x %d\n", - sc->an_unit, an_rx_desc.an_done, an_rx_desc.an_valid, an_rx_desc.an_len); } @@ -1135,7 +1128,7 @@ an_txeof(struct an_softc *sc, int status) AN_LOCK_ASSERT(sc); ifp = sc->an_ifp; - ifp->if_timer = 0; + sc->an_timer = 0; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; if (!sc->mpi350) { @@ -1188,6 +1181,8 @@ an_stats_update(void *xsc) sc = xsc; AN_LOCK_ASSERT(sc); ifp = sc->an_ifp; + if (sc->an_timer > 0 && --sc->an_timer == 0) + an_watchdog(sc); sc->an_status.an_type = AN_RID_STATUS; sc->an_status.an_len = sizeof(struct an_ltv_status); @@ -1279,7 +1274,7 @@ an_intr(void *xsc) CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), AN_INTRS(sc->mpi350)); if ((ifp->if_flags & IFF_UP) && !IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - an_start(ifp); + an_start_locked(ifp); AN_UNLOCK(sc); @@ -1393,7 +1388,7 @@ an_reset(struct an_softc *sc) an_cmd(sc, AN_CMD_NOOP2, 0); if (an_cmd(sc, AN_CMD_FORCE_SYNCLOSS, 0) == ETIMEDOUT) - printf("an%d: reset failed\n", sc->an_unit); + if_printf(sc->an_ifp, "reset failed\n"); an_cmd(sc, AN_CMD_DISABLE, 0); @@ -1410,6 +1405,7 @@ an_read_record(struct an_softc *sc, struct an_ltv_gen *ltv) struct an_card_rid_desc an_rid_desc; struct an_command cmd; struct an_reply reply; + struct ifnet *ifp; u_int16_t *ptr; u_int8_t *ptr2; int i, len; @@ -1418,16 +1414,17 @@ an_read_record(struct an_softc *sc, struct an_ltv_gen *ltv) if (ltv->an_len < 4 || ltv->an_type == 0) return(EINVAL); + ifp = sc->an_ifp; if (!sc->mpi350){ /* Tell the NIC to enter record read mode. */ if (an_cmd(sc, AN_CMD_ACCESS|AN_ACCESS_READ, ltv->an_type)) { - printf("an%d: RID access failed\n", sc->an_unit); + if_printf(ifp, "RID access failed\n"); return(EIO); } /* Seek to the record. */ if (an_seek(sc, ltv->an_type, 0, AN_BAP1)) { - printf("an%d: seek to record failed\n", sc->an_unit); + if_printf(ifp, "seek to record failed\n"); return(EIO); } @@ -1439,8 +1436,8 @@ an_read_record(struct an_softc *sc, struct an_ltv_gen *ltv) */ len = CSR_READ_2(sc, AN_DATA1); if (len > (ltv->an_len - 2)) { - printf("an%d: record length mismatch -- expected %d, " - "got %d for Rid %x\n", sc->an_unit, + if_printf(ifp, "record length mismatch -- expected %d, " + "got %d for Rid %x\n", ltv->an_len - 2, len, ltv->an_type); len = ltv->an_len - 2; } else { @@ -1476,8 +1473,8 @@ an_read_record(struct an_softc *sc, struct an_ltv_gen *ltv) if (an_cmd_struct(sc, &cmd, &reply) || reply.an_status & AN_CMD_QUAL_MASK) { - printf("an%d: failed to read RID %x %x %x %x %x, %d\n", - sc->an_unit, ltv->an_type, + if_printf(ifp, "failed to read RID %x %x %x %x %x, %d\n", + ltv->an_type, reply.an_status, reply.an_resp0, reply.an_resp1, @@ -1493,8 +1490,8 @@ an_read_record(struct an_softc *sc, struct an_ltv_gen *ltv) len = an_rid_desc.an_len; if (len > (ltv->an_len - 2)) { - printf("an%d: record length mismatch -- expected %d, " - "got %d for Rid %x\n", sc->an_unit, + if_printf(ifp, "record length mismatch -- expected %d, " + "got %d for Rid %x\n", ltv->an_len - 2, len, ltv->an_type); len = ltv->an_len - 2; } else { @@ -1586,8 +1583,9 @@ an_write_record(struct an_softc *sc, struct an_ltv_gen *ltv) DELAY(100000); if ((i = an_cmd_struct(sc, &cmd, &reply))) { - printf("an%d: failed to write RID 1 %x %x %x %x %x, %d\n", - sc->an_unit, ltv->an_type, + if_printf(sc->an_ifp, + "failed to write RID 1 %x %x %x %x %x, %d\n", + ltv->an_type, reply.an_status, reply.an_resp0, reply.an_resp1, @@ -1598,8 +1596,9 @@ an_write_record(struct an_softc *sc, struct an_ltv_gen *ltv) if (reply.an_status & AN_CMD_QUAL_MASK) { - printf("an%d: failed to write RID 2 %x %x %x %x %x, %d\n", - sc->an_unit, ltv->an_type, + if_printf(sc->an_ifp, + "failed to write RID 2 %x %x %x %x %x, %d\n", + ltv->an_type, reply.an_status, reply.an_resp0, reply.an_resp1, @@ -1623,11 +1622,11 @@ an_dump_record(struct an_softc *sc, struct an_ltv_gen *ltv, char *string) char buf[17], temp; len = ltv->an_len - 4; - printf("an%d: RID %4x, Length %4d, Mode %s\n", - sc->an_unit, ltv->an_type, ltv->an_len - 4, string); + if_printf(sc->an_ifp, "RID %4x, Length %4d, Mode %s\n", + ltv->an_type, ltv->an_len - 4, string); if (an_dump == 1 || (an_dump == ltv->an_type)) { - printf("an%d:\t", sc->an_unit); + if_printf(sc->an_ifp, "\t"); bzero(buf,sizeof(buf)); ptr2 = (u_int8_t *)<v->an_val; @@ -1642,7 +1641,7 @@ an_dump_record(struct an_softc *sc, struct an_ltv_gen *ltv, char *string) if (++count == 16) { count = 0; printf("%s\n",buf); - printf("an%d:\t", sc->an_unit); + if_printf(sc->an_ifp, "\t"); bzero(buf,sizeof(buf)); } } @@ -1669,7 +1668,7 @@ an_seek(struct an_softc *sc, int id, int off, int chan) offreg = AN_OFF1; break; default: - printf("an%d: invalid data path: %x\n", sc->an_unit, chan); + if_printf(sc->an_ifp, "invalid data path: %x\n", chan); return(EIO); } @@ -1743,8 +1742,8 @@ an_alloc_nicmem(struct an_softc *sc, int len, int *id) int i; if (an_cmd(sc, AN_CMD_ALLOC_MEM, len)) { - printf("an%d: failed to allocate %d bytes on NIC\n", - sc->an_unit, len); + if_printf(sc->an_ifp, "failed to allocate %d bytes on NIC\n", + len); return(ENOMEM); } @@ -1826,9 +1825,7 @@ an_setdef(struct an_softc *sc, struct an_req *areq) case AN_RID_WEP_PERM: case AN_RID_LEAPUSERNAME: case AN_RID_LEAPPASSWORD: - AN_UNLOCK(sc); - an_init(sc); - AN_LOCK(sc); + an_init_locked(sc); /* Disable the MAC. */ an_cmd(sc, AN_CMD_DISABLE, 0); @@ -1863,17 +1860,14 @@ an_setdef(struct an_softc *sc, struct an_req *areq) } break; default: - printf("an%d: unknown RID: %x\n", sc->an_unit, areq->an_type); + if_printf(ifp, "unknown RID: %x\n", areq->an_type); return; } /* Reinitialize the card. */ - if (ifp->if_flags) { - AN_UNLOCK(sc); - an_init(sc); - AN_LOCK(sc); - } + if (ifp->if_flags) + an_init_locked(sc); return; } @@ -1891,11 +1885,8 @@ an_promisc(struct an_softc *sc, int promisc) if (sc->mpi350) an_init_mpi350_desc(sc); } - if (sc->an_monitor || sc->an_was_monitor) { - AN_UNLOCK(sc); - an_init(sc); - AN_LOCK(sc); - } + if (sc->an_monitor || sc->an_was_monitor) + an_init_locked(sc); sc->an_was_monitor = sc->an_monitor; an_cmd(sc, AN_CMD_SET_MODE, promisc ? 0xffff : 0); @@ -1949,20 +1940,14 @@ an_ioctl(struct ifnet *ifp, u_long command, caddr_t data) !(ifp->if_flags & IFF_PROMISC) && sc->an_if_flags & IFF_PROMISC) { an_promisc(sc, 0); - } else { - AN_UNLOCK(sc); - an_init(sc); - AN_LOCK(sc); - } + } else + an_init_locked(sc); } else { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { - AN_UNLOCK(sc); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) an_stop(sc); - AN_LOCK(sc); - } } - AN_UNLOCK(sc); sc->an_if_flags = ifp->if_flags; + AN_UNLOCK(sc); error = 0; break; case SIOCSIFMEDIA: @@ -2486,7 +2471,6 @@ an_ioctl(struct ifnet *ifp, u_long command, caddr_t data) AN_UNLOCK(sc); break; } - AN_UNLOCK(sc); if (ireq->i_val == 4) { config->an_home_product |= AN_HOME_NETWORK; ireq->i_val = 0; @@ -2498,10 +2482,9 @@ an_ioctl(struct ifnet *ifp, u_long command, caddr_t data) = config->an_home_product; /* update configuration */ - an_init(sc); + an_init_locked(sc); bzero(&sc->areq, sizeof(struct an_ltv_key)); - AN_LOCK(sc); sc->areq.an_len = sizeof(struct an_ltv_key); sc->areq.an_type = AN_RID_WEP_PERM; key->kindex = 0xffff; @@ -2584,6 +2567,9 @@ an_ioctl(struct ifnet *ifp, u_long command, caddr_t data) an_setdef(sc, &sc->areq); AN_UNLOCK(sc); break; + default: + AN_UNLOCK(sc); + break; } /* @@ -2633,14 +2619,21 @@ static void an_init(void *xsc) { struct an_softc *sc = xsc; - struct ifnet *ifp = sc->an_ifp; AN_LOCK(sc); + an_init_locked(sc); + AN_UNLOCK(sc); +} - if (sc->an_gone) { - AN_UNLOCK(sc); +static void +an_init_locked(struct an_softc *sc) +{ + struct ifnet *ifp; + + AN_LOCK_ASSERT(sc); + ifp = sc->an_ifp; + if (sc->an_gone) return; - } if (ifp->if_drv_flags & IFF_DRV_RUNNING) an_stop(sc); @@ -2653,9 +2646,7 @@ an_init(void *xsc) if (sc->mpi350) an_init_mpi350_desc(sc); if (an_init_tx_ring(sc)) { - printf("an%d: tx buffer allocation " - "failed\n", sc->an_unit); - AN_UNLOCK(sc); + if_printf(ifp, "tx buffer allocation failed\n"); return; } } @@ -2695,8 +2686,7 @@ an_init(void *xsc) sc->an_ssidlist.an_type = AN_RID_SSIDLIST; sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist_new); if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) { - printf("an%d: failed to set ssid list\n", sc->an_unit); - AN_UNLOCK(sc); + if_printf(ifp, "failed to set ssid list\n"); return; } @@ -2704,8 +2694,7 @@ an_init(void *xsc) sc->an_aplist.an_type = AN_RID_APLIST; sc->an_aplist.an_len = sizeof(struct an_ltv_aplist); if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_aplist)) { - printf("an%d: failed to set AP list\n", sc->an_unit); - AN_UNLOCK(sc); + if_printf(ifp, "failed to set AP list\n"); return; } @@ -2713,15 +2702,13 @@ an_init(void *xsc) sc->an_config.an_len = sizeof(struct an_ltv_genconfig); sc->an_config.an_type = AN_RID_GENCONFIG; if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_config)) { - printf("an%d: failed to set configuration\n", sc->an_unit); - AN_UNLOCK(sc); + if_printf(ifp, "failed to set configuration\n"); return; } /* Enable the MAC */ if (an_cmd(sc, AN_CMD_ENABLE, 0)) { - printf("an%d: failed to enable MAC\n", sc->an_unit); - AN_UNLOCK(sc); + if_printf(ifp, "failed to enable MAC\n"); return; } @@ -2735,13 +2722,23 @@ an_init(void *xsc) ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; callout_reset(&sc->an_stat_ch, hz, an_stats_update, sc); - AN_UNLOCK(sc); return; } static void an_start(struct ifnet *ifp) +{ + struct an_softc *sc; + + sc = ifp->if_softc; + AN_LOCK(sc); + an_start_locked(ifp); + AN_UNLOCK(sc); +} + +static void +an_start_locked(struct ifnet *ifp) { struct an_softc *sc; struct mbuf *m0 = NULL; @@ -2754,6 +2751,7 @@ an_start(struct ifnet *ifp) sc = ifp->if_softc; + AN_LOCK_ASSERT(sc); if (sc->an_gone) return; @@ -2776,7 +2774,6 @@ an_start(struct ifnet *ifp) idx = sc->an_rdata.an_tx_prod; - AN_LOCK(sc); if (!sc->mpi350) { bzero((char *)&tx_frame_802_3, sizeof(tx_frame_802_3)); @@ -2803,7 +2800,7 @@ an_start(struct ifnet *ifp) tx_frame_802_3.an_tx_802_3_payload_len, (caddr_t)&sc->an_txbuf); - txcontrol = AN_TXCTL_8023; + txcontrol = AN_TXCTL_8023 | AN_TXCTL_HW(sc->mpi350); /* write the txcontrol only */ an_write_data(sc, id, 0x08, (caddr_t)&txcontrol, sizeof(txcontrol)); @@ -2827,14 +2824,14 @@ an_start(struct ifnet *ifp) sc->an_rdata.an_tx_ring[idx] = id; if (an_cmd(sc, AN_CMD_TX, id)) - printf("an%d: xmit failed\n", sc->an_unit); + if_printf(ifp, "xmit failed\n"); AN_INC(idx, AN_TX_RING_CNT); /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->an_timer = 5; } } else { /* MPI-350 */ /* Disable interrupts. */ @@ -2866,7 +2863,7 @@ an_start(struct ifnet *ifp) tx_frame_802_3.an_tx_802_3_payload_len, (caddr_t)&sc->an_txbuf); - txcontrol = AN_TXCTL_8023; + txcontrol = AN_TXCTL_8023 | AN_TXCTL_HW(sc->mpi350); /* write the txcontrol only */ bcopy((caddr_t)&txcontrol, &buf[0x08], sizeof(txcontrol)); @@ -2888,7 +2885,7 @@ an_start(struct ifnet *ifp) tx_frame_802_3.an_tx_802_3_payload_len; an_tx_desc.an_phys = sc->an_tx_buffer[idx].an_dma_paddr; - for (i = 0; i < sizeof(an_tx_desc) / 4 ; i++) { + for (i = sizeof(an_tx_desc) / 4 - 1; i >= 0; i--) { CSR_MEM_AUX_WRITE_4(sc, AN_TX_DESC_OFFSET /* zero for now */ + (0 * sizeof(an_tx_desc)) @@ -2911,13 +2908,12 @@ an_start(struct ifnet *ifp) /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->an_timer = 5; } /* Re-enable interrupts. */ CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), AN_INTRS(sc->mpi350)); } - AN_UNLOCK(sc); if (m0 != NULL) ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -2933,12 +2929,10 @@ an_stop(struct an_softc *sc) struct ifnet *ifp; int i; - AN_LOCK(sc); + AN_LOCK_ASSERT(sc); - if (sc->an_gone) { - AN_UNLOCK(sc); + if (sc->an_gone) return; - } ifp = sc->an_ifp; @@ -2957,36 +2951,27 @@ an_stop(struct an_softc *sc) free(sc->an_flash_buffer, M_DEVBUF); sc->an_flash_buffer = NULL; } - - AN_UNLOCK(sc); - - return; } static void -an_watchdog(struct ifnet *ifp) +an_watchdog(struct an_softc *sc) { - struct an_softc *sc; + struct ifnet *ifp; - sc = ifp->if_softc; - AN_LOCK(sc); + AN_LOCK_ASSERT(sc); - if (sc->an_gone) { - AN_UNLOCK(sc); + if (sc->an_gone) return; - } - printf("an%d: device timeout\n", sc->an_unit); + ifp = sc->an_ifp; + if_printf(ifp, "device timeout\n"); an_reset(sc); if (sc->mpi350) an_init_mpi350_desc(sc); - AN_UNLOCK(sc); - an_init(sc); + an_init_locked(sc); ifp->if_oerrors++; - - return; } int @@ -2995,10 +2980,12 @@ an_shutdown(device_t dev) struct an_softc *sc; sc = device_get_softc(dev); + AN_LOCK(sc); an_stop(sc); sc->an_gone = 1; + AN_UNLOCK(sc); - return 0; + return (0); } void @@ -3016,7 +3003,7 @@ an_resume(device_t dev) an_reset(sc); if (sc->mpi350) an_init_mpi350_desc(sc); - an_init(sc); + an_init_locked(sc); /* Recovery temporary keys */ for (i = 0; i < 4; i++) { @@ -3028,7 +3015,7 @@ an_resume(device_t dev) } if (ifp->if_flags & IFF_UP) - an_start(ifp); + an_start_locked(ifp); AN_UNLOCK(sc); return; @@ -3127,7 +3114,7 @@ an_cache_store(struct an_softc *sc, struct ether_header *eh, struct mbuf *m, } #ifdef SIGDEBUG - printf("an: q value %x (MSB=0x%x, LSB=0x%x) \n", + if_printf(sc->an_ifp, "q value %x (MSB=0x%x, LSB=0x%x) \n", rx_rssi & 0xffff, rx_rssi >> 8, rx_rssi & 0xff); #endif @@ -3253,12 +3240,12 @@ an_media_change(struct ifnet *ifp) int otype = sc->an_config.an_opmode; int orate = sc->an_tx_rate; + AN_LOCK(sc); sc->an_tx_rate = ieee80211_media2rate( IFM_SUBTYPE(sc->an_ifmedia.ifm_cur->ifm_media)); if (sc->an_tx_rate < 0) sc->an_tx_rate = 0; - AN_LOCK(sc); if (orate != sc->an_tx_rate) { /* Read the current configuration */ sc->an_config.an_type = AN_RID_GENCONFIG; @@ -3279,11 +3266,11 @@ an_media_change(struct ifnet *ifp) sc->an_config.an_opmode &= ~AN_OPMODE_INFRASTRUCTURE_STATION; else sc->an_config.an_opmode |= AN_OPMODE_INFRASTRUCTURE_STATION; - AN_UNLOCK(sc); if (otype != sc->an_config.an_opmode || orate != sc->an_tx_rate) - an_init(sc); + an_init_locked(sc); + AN_UNLOCK(sc); return(0); } @@ -3304,7 +3291,6 @@ an_media_status(struct ifnet *ifp, struct ifmediareq *imr) imr->ifm_active = sc->an_ifmedia.ifm_cur->ifm_media; imr->ifm_status = IFM_AVALID|IFM_ACTIVE; } - AN_UNLOCK(sc); if (sc->an_tx_rate == 0) { imr->ifm_active = IFM_IEEE80211|IFM_AUTO; @@ -3317,6 +3303,7 @@ an_media_status(struct ifnet *ifp, struct ifmediareq *imr) imr->ifm_status = IFM_AVALID; if (status.an_opmode & AN_STATUS_OPMODE_ASSOCIATED) imr->ifm_status |= IFM_ACTIVE; + AN_UNLOCK(sc); } /********************** Cisco utility support routines *************/ @@ -3561,14 +3548,13 @@ cmdreset(struct ifnet *ifp) int status; struct an_softc *sc = ifp->if_softc; + AN_LOCK(sc); an_stop(sc); - AN_LOCK(sc); an_cmd(sc, AN_CMD_DISABLE, 0); if (!(status = WaitBusy(ifp, AN_TIMEOUT))) { - printf("an%d: Waitbusy hang b4 RESET =%d\n", - sc->an_unit, status); + if_printf(ifp, "Waitbusy hang b4 RESET =%d\n", status); AN_UNLOCK(sc); return -EBUSY; } @@ -3578,8 +3564,7 @@ cmdreset(struct ifnet *ifp) if (!(status = WaitBusy(ifp, 100))) { - printf("an%d: Waitbusy hang AFTER RESET =%d\n", - sc->an_unit, status); + if_printf(ifp, "Waitbusy hang AFTER RESET =%d\n", status); AN_UNLOCK(sc); return -EBUSY; } @@ -3687,8 +3672,7 @@ flashpchar(struct ifnet *ifp, int byte, int dwelltime) /* timeout for busy clear wait */ if (waittime <= 0) { - printf("an%d: flash putchar busywait timeout! \n", - sc->an_unit); + if_printf(ifp, "flash putchar busywait timeout!\n"); return -1; } /* @@ -3754,9 +3738,7 @@ flashrestart(struct ifnet *ifp) FLASH_DELAY(sc, 1024); /* Added 12/7/00 */ - AN_UNLOCK(sc); - an_init(sc); - AN_LOCK(sc); + an_init_locked(sc); FLASH_DELAY(sc, 1024); /* Added 12/7/00 */ return status; @@ -3774,8 +3756,7 @@ flashcard(struct ifnet *ifp, struct aironet_ioctl *l_ioctl) sc = ifp->if_softc; if (sc->mpi350) { - printf("an%d: flashing not supported on MPI 350 yet\n", - sc->an_unit); + if_printf(ifp, "flashing not supported on MPI 350 yet\n"); return(-1); } status = l_ioctl->command; @@ -3820,7 +3801,7 @@ flashcard(struct ifnet *ifp, struct aironet_ioctl *l_ioctl) break; case AIROFLPUTBUF: /* Send 32k to card */ if (l_ioctl->len > FLASH_SIZE) { - printf("an%d: Buffer to big, %x %x\n", sc->an_unit, + if_printf(ifp, "Buffer to big, %x %x\n", l_ioctl->len, FLASH_SIZE); return -EINVAL; } @@ -3837,8 +3818,7 @@ flashcard(struct ifnet *ifp, struct aironet_ioctl *l_ioctl) break; case AIRORESTART: if ((status = flashrestart(ifp)) != 0) { - printf("an%d: FLASHRESTART returned %d\n", - sc->an_unit, status); + if_printf(ifp, "FLASHRESTART returned %d\n", status); return -EIO; } else return 0; diff --git a/sys/dev/an/if_an_isa.c b/sys/dev/an/if_an_isa.c index 80933b18ada1..19e5cd07552d 100644 --- a/sys/dev/an/if_an_isa.c +++ b/sys/dev/an/if_an_isa.c @@ -111,11 +111,9 @@ an_attach_isa(device_t dev) an_alloc_port(dev, sc->port_rid, 1); an_alloc_irq(dev, sc->irq_rid, 0); - sc->an_bhandle = rman_get_bushandle(sc->port_res); - sc->an_btag = rman_get_bustag(sc->port_res); sc->an_dev = dev; - error = an_attach(sc, device_get_unit(dev), flags); + error = an_attach(sc, flags); if (error) { an_release_resources(dev); return (error); diff --git a/sys/dev/an/if_an_pccard.c b/sys/dev/an/if_an_pccard.c index b475265d84b0..bdd40f3dfe59 100644 --- a/sys/dev/an/if_an_pccard.c +++ b/sys/dev/an/if_an_pccard.c @@ -141,11 +141,9 @@ an_pccard_attach(device_t dev) an_alloc_irq(dev, sc->irq_rid, 0); - sc->an_bhandle = rman_get_bushandle(sc->port_res); - sc->an_btag = rman_get_bustag(sc->port_res); sc->an_dev = dev; - error = an_attach(sc, device_get_unit(dev), flags); + error = an_attach(sc, flags); if (error) goto fail; diff --git a/sys/dev/an/if_an_pci.c b/sys/dev/an/if_an_pci.c index d13e3ab59718..2d0d2b5a6672 100644 --- a/sys/dev/an/if_an_pci.c +++ b/sys/dev/an/if_an_pci.c @@ -103,6 +103,7 @@ struct an_type { static struct an_type an_devs[] = { { AIRONET_VENDORID, AIRONET_DEVICEID_35x, "Cisco Aironet 350 Series" }, + { AIRONET_VENDORID, AIRONET_DEVICEID_MPI350, "Cisco Aironet MPI350" }, { AIRONET_VENDORID, AIRONET_DEVICEID_4500, "Aironet PCI4500" }, { AIRONET_VENDORID, AIRONET_DEVICEID_4800, "Aironet PCI4800" }, { AIRONET_VENDORID, AIRONET_DEVICEID_4xxx, "Aironet PCI4500/PCI4800" }, @@ -133,13 +134,6 @@ an_probe_pci(device_t dev) t++; } - if (pci_get_vendor(dev) == AIRONET_VENDORID && - pci_get_device(dev) == AIRONET_DEVICEID_MPI350) { - device_set_desc(dev, "Cisco Aironet MPI350"); - an_pci_probe(dev); - return(BUS_PROBE_DEFAULT); - } - return(ENXIO); } @@ -149,10 +143,9 @@ an_attach_pci(dev) { u_int32_t command; struct an_softc *sc; - int unit, flags, error = 0; + int flags, error = 0; sc = device_get_softc(dev); - unit = device_get_unit(dev); flags = device_get_flags(dev); if (pci_get_vendor(dev) == AIRONET_VENDORID && @@ -169,7 +162,7 @@ an_attach_pci(dev) command = pci_read_config(dev, PCIR_COMMAND, 4); if (!(command & PCIM_CMD_PORTEN)) { - printf("an%d: failed to enable I/O ports!\n", unit); + device_printf(dev, "failed to enable I/O ports!\n"); error = ENXIO; goto fail; } @@ -178,35 +171,28 @@ an_attach_pci(dev) error = an_alloc_port(dev, sc->port_rid, 1); if (error) { - printf("an%d: couldn't map ports\n", unit); + device_printf(dev, "couldn't map ports\n"); goto fail; } - sc->an_btag = rman_get_bustag(sc->port_res); - sc->an_bhandle = rman_get_bushandle(sc->port_res); - /* Allocate memory for MPI350 */ if (sc->mpi350) { /* Allocate memory */ sc->mem_rid = PCIR_BAR(1); error = an_alloc_memory(dev, sc->mem_rid, 1); if (error) { - printf("an%d: couldn't map memory\n", unit); + device_printf(dev, "couldn't map memory\n"); goto fail; } - sc->an_mem_btag = rman_get_bustag(sc->mem_res); - sc->an_mem_bhandle = rman_get_bushandle(sc->mem_res); /* Allocate aux. memory */ sc->mem_aux_rid = PCIR_BAR(2); error = an_alloc_aux_memory(dev, sc->mem_aux_rid, AN_AUX_MEM_SIZE); if (error) { - printf("an%d: couldn't map aux memory\n", unit); + device_printf(dev, "couldn't map aux memory\n"); goto fail; } - sc->an_mem_aux_btag = rman_get_bustag(sc->mem_aux_res); - sc->an_mem_aux_bhandle = rman_get_bushandle(sc->mem_aux_res); /* Allocate DMA region */ error = bus_dma_tag_create(NULL, /* parent */ @@ -222,7 +208,7 @@ an_attach_pci(dev) NULL, /* lockarg */ &sc->an_dtag); if (error) { - printf("an%d: couldn't get DMA region\n", unit); + device_printf(dev, "couldn't get DMA region\n"); goto fail; } } @@ -230,12 +216,14 @@ an_attach_pci(dev) /* Allocate interrupt */ error = an_alloc_irq(dev, 0, RF_SHAREABLE); if (error) { + device_printf(dev, "couldn't get interrupt\n"); goto fail; } sc->an_dev = dev; - error = an_attach(sc, device_get_unit(dev), flags); + error = an_attach(sc, flags); if (error) { + device_printf(dev, "couldn't attach\n"); goto fail; } @@ -244,6 +232,8 @@ an_attach_pci(dev) */ error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, NULL, an_intr, sc, &sc->irq_handle); + if (error) + device_printf(dev, "couldn't setup interrupt\n"); fail: if (error) diff --git a/sys/dev/an/if_anreg.h b/sys/dev/an/if_anreg.h index ec0ad2bc4a80..279e65b8e1e0 100644 --- a/sys/dev/an/if_anreg.h +++ b/sys/dev/an/if_anreg.h @@ -45,47 +45,39 @@ /* * register space access macros */ -#define CSR_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->an_btag, sc->an_bhandle, reg, val) +#define CSR_WRITE_2(sc, reg, val) bus_write_2(sc->port_res, reg, val) -#define CSR_READ_2(sc, reg) \ - bus_space_read_2(sc->an_btag, sc->an_bhandle, reg) +#define CSR_READ_2(sc, reg) bus_read_2(sc->port_res, reg) -#define CSR_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->an_btag, sc->an_bhandle, reg, val) +#define CSR_WRITE_1(sc, reg, val) bus_write_1(sc->port_res, reg, val) -#define CSR_READ_1(sc, reg) \ - bus_space_read_1(sc->an_btag, sc->an_bhandle, reg) +#define CSR_READ_1(sc, reg) bus_read_1(sc->port_res, reg) /* * memory space access macros */ -#define CSR_MEM_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->an_mem_btag, sc->an_mem_bhandle, reg, val) +#define CSR_MEM_WRITE_2(sc, reg, val) bus_write_2(sc->mem_res, reg, val) -#define CSR_MEM_READ_2(sc, reg) \ - bus_space_read_2(sc->an_mem_btag, sc->an_mem_bhandle, reg) +#define CSR_MEM_READ_2(sc, reg) bus_read_2(sc->mem_res, reg) -#define CSR_MEM_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->an_mem_btag, sc->an_mem_bhandle, reg, val) +#define CSR_MEM_WRITE_1(sc, reg, val) bus_write_1(sc->mem_res, reg, val) -#define CSR_MEM_READ_1(sc, reg) \ - bus_space_read_1(sc->an_mem_btag, sc->an_mem_bhandle, reg) +#define CSR_MEM_READ_1(sc, reg) bus_read_1(sc->mem_res, reg) /* * aux. memory space access macros */ #define CSR_MEM_AUX_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->an_mem_aux_btag, sc->an_mem_aux_bhandle, reg, val) + bus_write_4(sc->mem_aux_res, reg, val) #define CSR_MEM_AUX_READ_4(sc, reg) \ - bus_space_read_4(sc->an_mem_aux_btag, sc->an_mem_aux_bhandle, reg) + bus_read_4(sc->mem_aux_res, reg) #define CSR_MEM_AUX_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->an_mem_aux_btag, sc->an_mem_aux_bhandle, reg, val) + bus_write_1(sc->mem_aux_res, reg, val) #define CSR_MEM_AUX_READ_1(sc, reg) \ - bus_space_read_1(sc->an_mem_aux_btag, sc->an_mem_aux_bhandle, reg) + bus_read_1(sc->mem_aux_res, reg) /* * Size of Aironet I/O space. @@ -394,13 +386,18 @@ struct an_txframe_802_3 { #define AN_PAYLOADTYPE_ETHER 0x0000 #define AN_PAYLOADTYPE_LLC 0x0010 -#define AN_TXCTL_80211 \ - (AN_TXCTL_TXOK_INTR|AN_TXCTL_TXERR_INTR|AN_HEADERTYPE_80211| \ - AN_PAYLOADTYPE_LLC|AN_TXCTL_NORELEASE) +#define AN_TXCTL_80211 (AN_HEADERTYPE_80211|AN_PAYLOADTYPE_LLC) -#define AN_TXCTL_8023 \ - (AN_TXCTL_TXOK_INTR|AN_TXCTL_TXERR_INTR|AN_HEADERTYPE_8023| \ - AN_PAYLOADTYPE_ETHER|AN_TXCTL_NORELEASE) +#define AN_TXCTL_8023 (AN_HEADERTYPE_8023|AN_PAYLOADTYPE_ETHER) + +/* + * Additions to transmit control bits for MPI350 + */ +#define AN_TXCTL_HW(x) \ + ( x ? (AN_TXCTL_NORELEASE) \ + : \ + (AN_TXCTL_TXOK_INTR|AN_TXCTL_TXERR_INTR|AN_TXCTL_NORELEASE) \ + ) #define AN_TXGAP_80211 0 #define AN_TXGAP_8023 0 @@ -442,8 +439,6 @@ struct an_tx_ring_data { struct an_softc { struct ifnet *an_ifp; - int an_unit; - int port_rid; /* resource id for port range */ struct resource* port_res; /* resource for port range */ int mem_rid; /* resource id for memory range */ @@ -456,11 +451,6 @@ struct an_softc { void* irq_handle; /* handle for irq handler */ struct resource* irq_res; /* resource for irq */ - bus_space_handle_t an_bhandle_p; - bus_space_handle_t an_bhandle; - bus_space_tag_t an_btag; - bus_space_handle_t an_mem_bhandle; - bus_space_tag_t an_mem_btag; bus_space_handle_t an_mem_aux_bhandle; bus_space_tag_t an_mem_aux_btag; bus_dma_tag_t an_dtag; @@ -491,6 +481,7 @@ struct an_softc { struct ifmedia an_ifmedia; int an_monitor; int an_was_monitor; + int an_timer; u_char buf_802_11[MCLBYTES]; struct an_req areq; unsigned short* an_flash_buffer; @@ -513,7 +504,7 @@ int an_pci_probe (device_t); int an_probe (device_t); int an_shutdown (device_t); void an_resume (device_t); -int an_attach (struct an_softc *, int, int); +int an_attach (struct an_softc *, int); int an_detach (device_t); void an_stop (struct an_softc *); diff --git a/sys/dev/arcmsr/arcmsr.c b/sys/dev/arcmsr/arcmsr.c index 09bce1b9455f..93466eb4a862 100644 --- a/sys/dev/arcmsr/arcmsr.c +++ b/sys/dev/arcmsr/arcmsr.c @@ -55,6 +55,8 @@ ** 1.20.00.14 02/05/2007 Erich Chen bug fix for incorrect ccb_h.status report ** and cause g_vfs_done() read write error ** 1.20.00.15 10/10/2007 Erich Chen support new RAID adapter type ARC120x +** 1.20.00.16 10/10/2009 Erich Chen Bug fix for RAID adapter type ARC120x +** bus_dmamem_alloc() with BUS_DMA_ZERO ****************************************************************************************** * $FreeBSD$ */ @@ -1938,7 +1940,7 @@ static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb, switch (pccb->csio.cdb_io.cdb_bytes[0]) { case INQUIRY: { unsigned char inqdata[36]; - char *buffer=pccb->csio.data_ptr;; + char *buffer=pccb->csio.data_ptr; if (pccb->ccb_h.target_lun) { pccb->ccb_h.status |= CAM_SEL_TIMEOUT; @@ -2903,7 +2905,7 @@ static u_int32_t arcmsr_initialize(device_t dev) } /* Allocation for our srbs */ if(bus_dmamem_alloc(acb->srb_dmat, (void **)&acb->uncacheptr - , BUS_DMA_WAITOK | BUS_DMA_COHERENT, &acb->srb_dmamap) != 0) { + , BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_ZERO, &acb->srb_dmamap) != 0) { bus_dma_tag_destroy(acb->srb_dmat); bus_dma_tag_destroy(acb->dm_segs_dmat); bus_dma_tag_destroy(acb->parent_dmat); diff --git a/sys/dev/arcmsr/arcmsr.h b/sys/dev/arcmsr/arcmsr.h index 0b573816a184..7d8e24bcbdd7 100644 --- a/sys/dev/arcmsr/arcmsr.h +++ b/sys/dev/arcmsr/arcmsr.h @@ -37,7 +37,7 @@ ************************************************************************** * $FreeBSD$ */ -#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.15 2007-10-07" +#define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.16 2009-10-10" #define ARCMSR_SCSI_INITIATOR_ID 255 #define ARCMSR_DEV_SECTOR_SIZE 512 #define ARCMSR_MAX_XFER_SECTORS 4096 diff --git a/sys/dev/asr/asr.c b/sys/dev/asr/asr.c index 2bc5e2277246..ae363d0045d4 100644 --- a/sys/dev/asr/asr.c +++ b/sys/dev/asr/asr.c @@ -130,7 +130,6 @@ #include #include #include -#include #include #include diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 1460a2117d4f..73dfa94fd83e 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -50,6 +50,15 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef ATA_CAM +#include +#include +#include +#include +#include +#endif + +#ifndef ATA_CAM /* device structure */ static d_ioctl_t ata_ioctl; static struct cdevsw ata_cdevsw = { @@ -58,14 +67,21 @@ static struct cdevsw ata_cdevsw = { .d_ioctl = ata_ioctl, .d_name = "ata", }; +#endif /* prototypes */ +#ifndef ATA_CAM static void ata_boot_attach(void); static device_t ata_add_child(device_t, struct ata_device *, int); +#else +static void ataaction(struct cam_sim *sim, union ccb *ccb); +static void atapoll(struct cam_sim *sim); +#endif static void ata_conn_event(void *, int); static void bswap(int8_t *, int); static void btrim(int8_t *, int); static void bpack(int8_t *, int8_t *, int); +static void ata_interrupt_locked(void *data); /* global vars */ MALLOC_DEFINE(M_ATA, "ata_generic", "ATA driver generic layer"); @@ -115,6 +131,10 @@ ata_attach(device_t dev) { struct ata_channel *ch = device_get_softc(dev); int error, rid; +#ifdef ATA_CAM + struct cam_devq *devq; + int i; +#endif /* check that we have a virgin channel to attach */ if (ch->r_irq) @@ -129,11 +149,23 @@ ata_attach(device_t dev) mtx_init(&ch->queue_mtx, "ATA queue lock", NULL, MTX_DEF); TAILQ_INIT(&ch->ata_queue); TASK_INIT(&ch->conntask, 0, ata_conn_event, dev); +#ifdef ATA_CAM + for (i = 0; i < 16; i++) { + ch->user[i].mode = 0; + if (ch->flags & ATA_SATA) + ch->user[i].bytecount = 8192; + else + ch->user[i].bytecount = MAXPHYS; + ch->curr[i] = ch->user[i]; + } +#endif /* reset the controller HW, the channel and device(s) */ while (ATA_LOCKING(dev, ATA_LF_LOCK) != ch->unit) pause("ataatch", 1); +#ifndef ATA_CAM ATA_RESET(dev); +#endif ATA_LOCKING(dev, ATA_LF_UNLOCK); /* allocate DMA resources if DMA HW present*/ @@ -154,18 +186,61 @@ ata_attach(device_t dev) return error; } +#ifndef ATA_CAM /* probe and attach devices on this channel unless we are in early boot */ if (!ata_delayed_attach) ata_identify(dev); - return 0; + return (0); +#else + mtx_lock(&ch->state_mtx); + /* Create the device queue for our SIM. */ + devq = cam_simq_alloc(1); + if (devq == NULL) { + device_printf(dev, "Unable to allocate simq\n"); + error = ENOMEM; + goto err1; + } + /* Construct SIM entry */ + ch->sim = cam_sim_alloc(ataaction, atapoll, "ata", ch, + device_get_unit(dev), &ch->state_mtx, 1, 0, devq); + if (ch->sim == NULL) { + device_printf(dev, "unable to allocate sim\n"); + error = ENOMEM; + goto err2; + } + if (xpt_bus_register(ch->sim, dev, 0) != CAM_SUCCESS) { + device_printf(dev, "unable to register xpt bus\n"); + error = ENXIO; + goto err2; + } + if (xpt_create_path(&ch->path, /*periph*/NULL, cam_sim_path(ch->sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + device_printf(dev, "unable to create path\n"); + error = ENXIO; + goto err3; + } + mtx_unlock(&ch->state_mtx); + return (0); + +err3: + xpt_bus_deregister(cam_sim_path(ch->sim)); +err2: + cam_sim_free(ch->sim, /*free_devq*/TRUE); +err1: + bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq); + mtx_unlock(&ch->state_mtx); + return (error); +#endif } int ata_detach(device_t dev) { struct ata_channel *ch = device_get_softc(dev); +#ifndef ATA_CAM device_t *children; int nchildren, i; +#endif /* check that we have a valid channel to detach */ if (!ch->r_irq) @@ -176,6 +251,7 @@ ata_detach(device_t dev) ch->state |= ATA_STALL_QUEUE; mtx_unlock(&ch->state_mtx); +#ifndef ATA_CAM /* detach & delete all children */ if (!device_get_children(dev, &children, &nchildren)) { for (i = 0; i < nchildren; i++) @@ -183,8 +259,18 @@ ata_detach(device_t dev) device_delete_child(dev, children[i]); free(children, M_TEMP); } +#endif taskqueue_drain(taskqueue_thread, &ch->conntask); +#ifdef ATA_CAM + mtx_lock(&ch->state_mtx); + xpt_async(AC_LOST_DEVICE, ch->path, NULL); + xpt_free_path(ch->path); + xpt_bus_deregister(cam_sim_path(ch->sim)); + cam_sim_free(ch->sim, /*free_devq*/TRUE); + mtx_unlock(&ch->state_mtx); +#endif + /* release resources */ bus_teardown_intr(dev, ch->r_irq, ch->ih); bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq); @@ -202,9 +288,26 @@ ata_detach(device_t dev) static void ata_conn_event(void *context, int dummy) { - device_t dev = (device_t)context; + device_t dev = (device_t)context; +#ifdef ATA_CAM + struct ata_channel *ch = device_get_softc(dev); + union ccb *ccb; - ata_reinit(dev); + mtx_lock(&ch->state_mtx); + ata_reinit(dev); + mtx_unlock(&ch->state_mtx); + if ((ccb = xpt_alloc_ccb()) == NULL) + return; + if (xpt_create_path(&ccb->ccb_h.path, NULL, + cam_sim_path(ch->sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + xpt_free_ccb(ccb); + return; + } + xpt_rescan(ccb); +#else + ata_reinit(dev); +#endif } int @@ -212,6 +315,7 @@ ata_reinit(device_t dev) { struct ata_channel *ch = device_get_softc(dev); struct ata_request *request; +#ifndef ATA_CAM device_t *children; int nchildren, i; @@ -298,7 +402,25 @@ ata_reinit(device_t dev) /* kick off requests on the queue */ ata_start(dev); - return 0; +#else + xpt_freeze_simq(ch->sim, 1); + if ((request = ch->running)) { + ch->running = NULL; + if (ch->state == ATA_ACTIVE) + ch->state = ATA_IDLE; + callout_stop(&request->callout); + if (ch->dma.unload) + ch->dma.unload(request); + request->result = ERESTART; + ata_cam_end_transaction(dev, request); + } + /* reset the controller HW, the channel and device(s) */ + ATA_RESET(dev); + /* Tell the XPT about the event */ + xpt_async(AC_BUS_RESET, ch->path, NULL); + xpt_release_simq(ch->sim, TRUE); +#endif + return(0); } int @@ -310,6 +432,7 @@ ata_suspend(device_t dev) if (!dev || !(ch = device_get_softc(dev))) return ENXIO; +#ifndef ATA_CAM /* wait for the channel to be IDLE or detached before suspending */ while (ch->r_irq) { mtx_lock(&ch->state_mtx); @@ -322,7 +445,8 @@ ata_suspend(device_t dev) tsleep(ch, PRIBIO, "atasusp", hz/10); } ATA_LOCKING(dev, ATA_LF_UNLOCK); - return 0; +#endif + return(0); } int @@ -337,18 +461,36 @@ ata_resume(device_t dev) /* reinit the devices, we dont know what mode/state they are in */ error = ata_reinit(dev); +#ifndef ATA_CAM /* kick off requests on the queue */ ata_start(dev); +#endif return error; } void ata_interrupt(void *data) +{ +#ifdef ATA_CAM + struct ata_channel *ch = (struct ata_channel *)data; + + mtx_lock(&ch->state_mtx); +#endif + ata_interrupt_locked(data); +#ifdef ATA_CAM + mtx_unlock(&ch->state_mtx); +#endif +} + +static void +ata_interrupt_locked(void *data) { struct ata_channel *ch = (struct ata_channel *)data; struct ata_request *request; +#ifndef ATA_CAM mtx_lock(&ch->state_mtx); +#endif do { /* ignore interrupt if its not for us */ if (ch->hw.status && !ch->hw.status(ch->dev)) @@ -374,18 +516,71 @@ ata_interrupt(void *data) ch->running = NULL; if (ch->state == ATA_ACTIVE) ch->state = ATA_IDLE; +#ifdef ATA_CAM + ata_cam_end_transaction(ch->dev, request); +#else mtx_unlock(&ch->state_mtx); ATA_LOCKING(ch->dev, ATA_LF_UNLOCK); ata_finish(request); +#endif return; } } while (0); +#ifndef ATA_CAM mtx_unlock(&ch->state_mtx); +#endif +} + +void +ata_print_cable(device_t dev, u_int8_t *who) +{ + device_printf(dev, + "DMA limited to UDMA33, %s found non-ATA66 cable\n", who); +} + +int +ata_check_80pin(device_t dev, int mode) +{ + struct ata_device *atadev = device_get_softc(dev); + + if (!ata_dma_check_80pin) { + if (bootverbose) + device_printf(dev, "Skipping 80pin cable check\n"); + return mode; + } + + if (mode > ATA_UDMA2 && !(atadev->param.hwres & ATA_CABLE_ID)) { + ata_print_cable(dev, "device"); + mode = ATA_UDMA2; + } + return mode; +} + +void +ata_setmode(device_t dev) +{ + struct ata_channel *ch = device_get_softc(device_get_parent(dev)); + struct ata_device *atadev = device_get_softc(dev); + int error, mode, pmode; + + mode = atadev->mode; + do { + pmode = mode = ata_limit_mode(dev, mode, ATA_DMA_MAX); + mode = ATA_SETMODE(device_get_parent(dev), atadev->unit, mode); + if ((ch->flags & (ATA_CHECKS_CABLE | ATA_SATA)) == 0) + mode = ata_check_80pin(dev, mode); + } while (pmode != mode); /* Interate till successfull negotiation. */ + error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); + if (bootverbose) + device_printf(dev, "%ssetting %s\n", + (error) ? "FAILURE " : "", ata_mode2str(mode)); + atadev->mode = mode; } /* * device related interfaces */ +#ifndef ATA_CAM static int ata_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int32_t flag, struct thread *td) @@ -467,6 +662,7 @@ ata_ioctl(struct cdev *dev, u_long cmd, caddr_t data, } return error; } +#endif int ata_device_ioctl(device_t dev, u_long cmd, caddr_t data) @@ -549,11 +745,12 @@ ata_device_ioctl(device_t dev, u_long cmd, caddr_t data) case IOCATASMODE: atadev->mode = *mode; - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); return 0; case IOCATAGMODE: - *mode = atadev->mode; + *mode = atadev->mode | + (ATA_GETREV(device_get_parent(dev), atadev->unit) << 8); return 0; case IOCATASSPINDOWN: atadev->spindown = *mode; @@ -566,6 +763,7 @@ ata_device_ioctl(device_t dev, u_long cmd, caddr_t data) } } +#ifndef ATA_CAM static void ata_boot_attach(void) { @@ -590,11 +788,12 @@ ata_boot_attach(void) mtx_unlock(&Giant); /* newbus suckage dealt with, release Giant */ } - +#endif /* * misc support functions */ +#ifndef ATA_CAM static device_t ata_add_child(device_t parent, struct ata_device *atadev, int unit) { @@ -609,6 +808,7 @@ ata_add_child(device_t parent, struct ata_device *atadev, int unit) } return child; } +#endif int ata_getparam(struct ata_device *atadev, int init) @@ -705,6 +905,7 @@ ata_getparam(struct ata_device *atadev, int init) return error; } +#ifndef ATA_CAM int ata_identify(device_t dev) { @@ -778,6 +979,7 @@ ata_identify(device_t dev) mtx_unlock(&Giant); return 0; } +#endif void ata_default_registers(device_t dev) @@ -798,10 +1000,10 @@ ata_default_registers(device_t dev) void ata_modify_if_48bit(struct ata_request *request) { - struct ata_channel *ch = device_get_softc(device_get_parent(request->dev)); + struct ata_channel *ch = device_get_softc(request->parent); struct ata_device *atadev = device_get_softc(request->dev); - atadev->flags &= ~ATA_D_48BIT_ACTIVE; + request->flags &= ~ATA_R_48BIT; if (((request->u.ata.lba + request->u.ata.count) >= ATA_MAX_28BIT_LBA || request->u.ata.count > 256) && @@ -875,7 +1077,7 @@ ata_modify_if_48bit(struct ata_request *request) default: return; } - atadev->flags |= ATA_D_48BIT_ACTIVE; + request->flags |= ATA_R_48BIT; } else if (atadev->param.support.command2 & ATA_SUPPORT_ADDRESS48) { @@ -893,7 +1095,7 @@ ata_modify_if_48bit(struct ata_request *request) default: return; } - atadev->flags |= ATA_D_48BIT_ACTIVE; + request->flags |= ATA_R_48BIT; } } @@ -920,7 +1122,7 @@ ata_unit2str(struct ata_device *atadev) return str; } -char * +const char * ata_mode2str(int mode) { switch (mode) { @@ -942,9 +1144,6 @@ ata_mode2str(int mode) case ATA_UDMA6: return "UDMA133"; case ATA_SA150: return "SATA150"; case ATA_SA300: return "SATA300"; - case ATA_USB: return "USB"; - case ATA_USB1: return "USB1"; - case ATA_USB2: return "USB2"; default: if (mode & ATA_DMA_MASK) return "BIOSDMA"; @@ -953,13 +1152,25 @@ ata_mode2str(int mode) } } -int -ata_atapi(device_t dev) +const char * +ata_satarev2str(int rev) { - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); + switch (rev) { + case 0: return ""; + case 1: return "SATA 1.5Gb/s"; + case 2: return "SATA 3Gb/s"; + case 3: return "SATA 6Gb/s"; + case 0xff: return "SATA"; + default: return "???"; + } +} - return (ch->devices & (ATA_ATAPI_MASTER << atadev->unit)); +int +ata_atapi(device_t dev, int target) +{ + struct ata_channel *ch = device_get_softc(dev); + + return (ch->devices & (ATA_ATAPI_MASTER << target)); } int @@ -1084,6 +1295,372 @@ bpack(int8_t *src, int8_t *dst, int len) dst[j] = 0x00; } +#ifdef ATA_CAM +void +ata_cam_begin_transaction(device_t dev, union ccb *ccb) +{ + struct ata_channel *ch = device_get_softc(dev); + struct ata_request *request; + + if (!(request = ata_alloc_request())) { + device_printf(dev, "FAILURE - out of memory in start\n"); + ccb->ccb_h.status = CAM_REQ_INVALID; + xpt_done(ccb); + return; + } + bzero(request, sizeof(*request)); + + /* setup request */ + request->dev = NULL; + request->parent = dev; + request->unit = ccb->ccb_h.target_id; + if (ccb->ccb_h.func_code == XPT_ATA_IO) { + request->data = ccb->ataio.data_ptr; + request->bytecount = ccb->ataio.dxfer_len; + request->u.ata.command = ccb->ataio.cmd.command; + request->u.ata.feature = ((uint16_t)ccb->ataio.cmd.features_exp << 8) | + (uint16_t)ccb->ataio.cmd.features; + request->u.ata.count = ((uint16_t)ccb->ataio.cmd.sector_count_exp << 8) | + (uint16_t)ccb->ataio.cmd.sector_count; + if (ccb->ataio.cmd.flags & CAM_ATAIO_48BIT) { + request->flags |= ATA_R_48BIT; + request->u.ata.lba = + ((uint64_t)ccb->ataio.cmd.lba_high_exp << 40) | + ((uint64_t)ccb->ataio.cmd.lba_mid_exp << 32) | + ((uint64_t)ccb->ataio.cmd.lba_low_exp << 24); + } else { + request->u.ata.lba = + ((uint64_t)(ccb->ataio.cmd.device & 0x0f) << 24); + } + request->u.ata.lba |= ((uint64_t)ccb->ataio.cmd.lba_high << 16) | + ((uint64_t)ccb->ataio.cmd.lba_mid << 8) | + (uint64_t)ccb->ataio.cmd.lba_low; + if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && + ccb->ataio.cmd.flags & CAM_ATAIO_DMA) + request->flags |= ATA_R_DMA; + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) + request->flags |= ATA_R_READ; + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) + request->flags |= ATA_R_WRITE; + } else { + request->data = ccb->csio.data_ptr; + request->bytecount = ccb->csio.dxfer_len; + bcopy((ccb->ccb_h.flags & CAM_CDB_POINTER) ? + ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes, + request->u.atapi.ccb, ccb->csio.cdb_len); + request->flags |= ATA_R_ATAPI; + if (ch->curr[ccb->ccb_h.target_id].atapi == 16) + request->flags |= ATA_R_ATAPI16; + if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && + ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) + request->flags |= ATA_R_DMA; + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) + request->flags |= ATA_R_READ; + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) + request->flags |= ATA_R_WRITE; + } + request->transfersize = min(request->bytecount, + ch->curr[ccb->ccb_h.target_id].bytecount); + request->retries = 0; + request->timeout = (ccb->ccb_h.timeout + 999) / 1000; + callout_init_mtx(&request->callout, &ch->state_mtx, CALLOUT_RETURNUNLOCKED); + request->ccb = ccb; + + ch->running = request; + ch->state = ATA_ACTIVE; + if (ch->hw.begin_transaction(request) == ATA_OP_FINISHED) { + ch->running = NULL; + ch->state = ATA_IDLE; + ata_cam_end_transaction(dev, request); + return; + } +} + +void +ata_cam_end_transaction(device_t dev, struct ata_request *request) +{ + struct ata_channel *ch = device_get_softc(dev); + union ccb *ccb = request->ccb; + int fatalerr = 0; + + ccb->ccb_h.status &= ~CAM_STATUS_MASK; + if (request->flags & ATA_R_TIMEOUT) { + xpt_freeze_simq(ch->sim, 1); + ccb->ccb_h.status &= ~CAM_STATUS_MASK; + ccb->ccb_h.status |= CAM_CMD_TIMEOUT | CAM_RELEASE_SIMQ; + fatalerr = 1; + } else if (request->status & ATA_S_ERROR) { + if (ccb->ccb_h.func_code == XPT_ATA_IO) { + ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; + } else { + ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; + ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; + } + } else if (request->result == ERESTART) + ccb->ccb_h.status |= CAM_REQUEUE_REQ; + else if (request->result != 0) + ccb->ccb_h.status |= CAM_REQ_CMP_ERR; + else + ccb->ccb_h.status |= CAM_REQ_CMP; + if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP && + !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(ccb->ccb_h.path, 1); + ccb->ccb_h.status |= CAM_DEV_QFRZN; + } + if (ccb->ccb_h.func_code == XPT_ATA_IO && + ((request->status & ATA_S_ERROR) || + (ccb->ataio.cmd.flags & CAM_ATAIO_NEEDRESULT))) { + struct ata_res *res = &ccb->ataio.res; + res->status = request->status; + res->error = request->error; + res->lba_low = request->u.ata.lba; + res->lba_mid = request->u.ata.lba >> 8; + res->lba_high = request->u.ata.lba >> 16; + res->device = request->u.ata.lba >> 24; + res->lba_low_exp = request->u.ata.lba >> 24; + res->lba_mid_exp = request->u.ata.lba >> 32; + res->lba_high_exp = request->u.ata.lba >> 40; + res->sector_count = request->u.ata.count; + res->sector_count_exp = request->u.ata.count >> 8; + } + ata_free_request(request); + xpt_done(ccb); + /* Do error recovery if needed. */ + if (fatalerr) + ata_reinit(dev); +} + +static void +ataaction(struct cam_sim *sim, union ccb *ccb) +{ + device_t dev; + struct ata_channel *ch; + + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("ataaction func_code=%x\n", + ccb->ccb_h.func_code)); + + ch = (struct ata_channel *)cam_sim_softc(sim); + dev = ch->dev; + switch (ccb->ccb_h.func_code) { + /* Common cases first */ + case XPT_ATA_IO: /* Execute the requested I/O operation */ + case XPT_SCSI_IO: + if ((ch->devices & ((ATA_ATA_MASTER | ATA_ATAPI_MASTER) + << ccb->ccb_h.target_id)) == 0) { + ccb->ccb_h.status = CAM_SEL_TIMEOUT; + xpt_done(ccb); + break; + } + if (ch->running) + device_printf(dev, "already running!\n"); + if (ccb->ccb_h.func_code == XPT_ATA_IO && + (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && + (ccb->ataio.cmd.control & ATA_A_RESET)) { + struct ata_res *res = &ccb->ataio.res; + + bzero(res, sizeof(*res)); + if (ch->devices & (ATA_ATA_MASTER << ccb->ccb_h.target_id)) { + res->lba_high = 0; + res->lba_mid = 0; + } else { + res->lba_high = 0xeb; + res->lba_mid = 0x14; + } + ccb->ccb_h.status = CAM_REQ_CMP; + xpt_done(ccb); + break; + } + ata_cam_begin_transaction(dev, ccb); + break; + case XPT_EN_LUN: /* Enable LUN as a target */ + case XPT_TARGET_IO: /* Execute target I/O request */ + case XPT_ACCEPT_TARGET_IO: /* Accept Host Target Mode CDB */ + case XPT_CONT_TARGET_IO: /* Continue Host Target I/O Connection*/ + case XPT_ABORT: /* Abort the specified CCB */ + /* XXX Implement */ + ccb->ccb_h.status = CAM_REQ_INVALID; + xpt_done(ccb); + break; + case XPT_SET_TRAN_SETTINGS: + { + struct ccb_trans_settings *cts = &ccb->cts; + struct ata_cam_device *d; + + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + d = &ch->curr[ccb->ccb_h.target_id]; + else + d = &ch->user[ccb->ccb_h.target_id]; + if (ch->flags & ATA_SATA) { + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_REVISION) + d->revision = cts->xport_specific.sata.revision; + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_MODE) { + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) { + d->mode = ATA_SETMODE(ch->dev, + ccb->ccb_h.target_id, + cts->xport_specific.sata.mode); + } else + d->mode = cts->xport_specific.sata.mode; + } + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT) + d->bytecount = min(8192, cts->xport_specific.sata.bytecount); + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_ATAPI) + d->atapi = cts->xport_specific.sata.atapi; + } else { + if (cts->xport_specific.ata.valid & CTS_ATA_VALID_MODE) { + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) { + d->mode = ATA_SETMODE(ch->dev, + ccb->ccb_h.target_id, + cts->xport_specific.ata.mode); + } else + d->mode = cts->xport_specific.ata.mode; + } + if (cts->xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT) + d->bytecount = cts->xport_specific.ata.bytecount; + if (cts->xport_specific.ata.valid & CTS_ATA_VALID_ATAPI) + d->atapi = cts->xport_specific.ata.atapi; + } + ccb->ccb_h.status = CAM_REQ_CMP; + xpt_done(ccb); + break; + } + case XPT_GET_TRAN_SETTINGS: + { + struct ccb_trans_settings *cts = &ccb->cts; + struct ata_cam_device *d; + + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + d = &ch->curr[ccb->ccb_h.target_id]; + else + d = &ch->user[ccb->ccb_h.target_id]; + cts->protocol = PROTO_ATA; + cts->protocol_version = PROTO_VERSION_UNSPECIFIED; + if (ch->flags & ATA_SATA) { + cts->transport = XPORT_SATA; + cts->transport_version = XPORT_VERSION_UNSPECIFIED; + cts->xport_specific.sata.valid = 0; + cts->xport_specific.sata.mode = d->mode; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_MODE; + cts->xport_specific.sata.bytecount = d->bytecount; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_BYTECOUNT; + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) { + cts->xport_specific.sata.revision = + ATA_GETREV(dev, ccb->ccb_h.target_id); + if (cts->xport_specific.sata.revision != 0xff) { + cts->xport_specific.sata.valid |= + CTS_SATA_VALID_REVISION; + } + } else { + cts->xport_specific.sata.revision = d->revision; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_REVISION; + } + cts->xport_specific.sata.atapi = d->atapi; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_ATAPI; + } else { + cts->transport = XPORT_ATA; + cts->transport_version = XPORT_VERSION_UNSPECIFIED; + cts->xport_specific.ata.valid = 0; + cts->xport_specific.ata.mode = d->mode; + cts->xport_specific.ata.valid |= CTS_ATA_VALID_MODE; + cts->xport_specific.ata.bytecount = d->bytecount; + cts->xport_specific.ata.valid |= CTS_ATA_VALID_BYTECOUNT; + cts->xport_specific.ata.atapi = d->atapi; + cts->xport_specific.ata.valid |= CTS_ATA_VALID_ATAPI; + } + ccb->ccb_h.status = CAM_REQ_CMP; + xpt_done(ccb); + break; + } +#if 0 + case XPT_CALC_GEOMETRY: + { + struct ccb_calc_geometry *ccg; + uint32_t size_mb; + uint32_t secs_per_cylinder; + + ccg = &ccb->ccg; + size_mb = ccg->volume_size + / ((1024L * 1024L) / ccg->block_size); + if (size_mb >= 1024 && (aha->extended_trans != 0)) { + if (size_mb >= 2048) { + ccg->heads = 255; + ccg->secs_per_track = 63; + } else { + ccg->heads = 128; + ccg->secs_per_track = 32; + } + } else { + ccg->heads = 64; + ccg->secs_per_track = 32; + } + secs_per_cylinder = ccg->heads * ccg->secs_per_track; + ccg->cylinders = ccg->volume_size / secs_per_cylinder; + ccb->ccb_h.status = CAM_REQ_CMP; + xpt_done(ccb); + break; + } +#endif + case XPT_RESET_BUS: /* Reset the specified SCSI bus */ + case XPT_RESET_DEV: /* Bus Device Reset the specified SCSI device */ + ata_reinit(dev); + ccb->ccb_h.status = CAM_REQ_CMP; + xpt_done(ccb); + break; + case XPT_TERM_IO: /* Terminate the I/O process */ + /* XXX Implement */ + ccb->ccb_h.status = CAM_REQ_INVALID; + xpt_done(ccb); + break; + case XPT_PATH_INQ: /* Path routing inquiry */ + { + struct ccb_pathinq *cpi = &ccb->cpi; + + cpi->version_num = 1; /* XXX??? */ + cpi->hba_inquiry = PI_SDTR_ABLE; + cpi->target_sprt = 0; + cpi->hba_misc = PIM_SEQSCAN; + cpi->hba_eng_cnt = 0; + if (ch->flags & ATA_NO_SLAVE) + cpi->max_target = 0; + else + cpi->max_target = 1; + cpi->max_lun = 0; + cpi->initiator_id = 0; + cpi->bus_id = cam_sim_bus(sim); + if (ch->flags & ATA_SATA) + cpi->base_transfer_speed = 150000; + else + cpi->base_transfer_speed = 3300; + strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); + strncpy(cpi->hba_vid, "ATA", HBA_IDLEN); + strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); + cpi->unit_number = cam_sim_unit(sim); + if (ch->flags & ATA_SATA) + cpi->transport = XPORT_SATA; + else + cpi->transport = XPORT_ATA; + cpi->transport_version = XPORT_VERSION_UNSPECIFIED; + cpi->protocol = PROTO_ATA; + cpi->protocol_version = PROTO_VERSION_UNSPECIFIED; + cpi->maxio = ch->dma.max_iosize ? ch->dma.max_iosize : DFLTPHYS; + cpi->ccb_h.status = CAM_REQ_CMP; + xpt_done(ccb); + break; + } + default: + ccb->ccb_h.status = CAM_REQ_INVALID; + xpt_done(ccb); + break; + } +} + +static void +atapoll(struct cam_sim *sim) +{ + struct ata_channel *ch = (struct ata_channel *)cam_sim_softc(sim); + + ata_interrupt_locked(ch); +} +#endif /* * module handeling @@ -1091,10 +1668,13 @@ bpack(int8_t *src, int8_t *dst, int len) static int ata_module_event_handler(module_t mod, int what, void *arg) { +#ifndef ATA_CAM static struct cdev *atacdev; +#endif switch (what) { case MOD_LOAD: +#ifndef ATA_CAM /* register controlling device */ atacdev = make_dev(&ata_cdevsw, 0, UID_ROOT, GID_OPERATOR, 0600, "ata"); @@ -1112,11 +1692,14 @@ ata_module_event_handler(module_t mod, int what, void *arg) free(ata_delayed_attach, M_TEMP); } } +#endif return 0; case MOD_UNLOAD: +#ifndef ATA_CAM /* deregister controlling device */ destroy_dev(atacdev); +#endif return 0; default: @@ -1127,6 +1710,9 @@ ata_module_event_handler(module_t mod, int what, void *arg) static moduledata_t ata_moduledata = { "ata", ata_module_event_handler, NULL }; DECLARE_MODULE(ata, ata_moduledata, SI_SUB_CONFIGURE, SI_ORDER_SECOND); MODULE_VERSION(ata, 1); +#ifdef ATA_CAM +MODULE_DEPEND(ata, cam, 1, 1, 1); +#endif static void ata_init(void) diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h index 4bb45e48f64c..3d5d36e59f1b 100644 --- a/sys/dev/ata/ata-all.h +++ b/sys/dev/ata/ata-all.h @@ -26,6 +26,11 @@ * $FreeBSD$ */ +#if 0 +#define ATA_LEGACY_SUPPORT /* Enable obsolete features that break + * some modern devices */ +#endif + /* ATA register defines */ #define ATA_DATA 0 /* (RW) data */ @@ -81,7 +86,11 @@ #define ATA_PC98_CTLOFFSET 0x10c /* do for PC98 devices */ #define ATA_A_IDS 0x02 /* disable interrupts */ #define ATA_A_RESET 0x04 /* RESET controller */ -#define ATA_A_4BIT 0x08 /* 4 head bits */ +#ifdef ATA_LEGACY_SUPPORT +#define ATA_A_4BIT 0x08 /* 4 head bits: obsolete 1996 */ +#else +#define ATA_A_4BIT 0x00 +#endif #define ATA_A_HOB 0x80 /* High Order Byte enable */ /* SATA register defines */ @@ -246,7 +255,7 @@ #define ATA_AHCI_CL_OFFSET 0 #define ATA_AHCI_FB_OFFSET (ATA_AHCI_CL_SIZE * 32) #define ATA_AHCI_CT_OFFSET (ATA_AHCI_FB_OFFSET + 4096) -#define ATA_AHCI_CT_SIZE (1024 + 128) +#define ATA_AHCI_CT_SIZE (2176 + 128) struct ata_ahci_dma_prd { u_int64_t dba; @@ -260,7 +269,7 @@ struct ata_ahci_cmd_tab { u_int8_t cfis[64]; u_int8_t acmd[32]; u_int8_t reserved[32]; -#define ATA_AHCI_DMA_ENTRIES 64 +#define ATA_AHCI_DMA_ENTRIES 129 struct ata_ahci_dma_prd prd_tab[ATA_AHCI_DMA_ENTRIES]; } __packed; @@ -336,6 +345,10 @@ struct ata_ahci_cmd_list { #define ATA_OP_FINISHED 1 #define ATA_MAX_28BIT_LBA 268435455UL +#ifndef ATA_REQUEST_TIMEOUT +#define ATA_REQUEST_TIMEOUT 10 +#endif + /* structure used for composite atomic operations */ #define MAX_COMPOSITES 32 /* u_int32_t bits */ struct ata_composite { @@ -355,6 +368,7 @@ struct ata_composite { struct ata_request { device_t dev; /* device handle */ device_t parent; /* channel handle */ + int unit; /* physical unit */ union { struct { u_int8_t command; /* command reg */ @@ -380,6 +394,7 @@ struct ata_request { #define ATA_R_DMA 0x00000010 #define ATA_R_QUIET 0x00000020 #define ATA_R_TIMEOUT 0x00000040 +#define ATA_R_48BIT 0x00000080 #define ATA_R_ORDERED 0x00000100 #define ATA_R_AT_HEAD 0x00000200 @@ -387,6 +402,9 @@ struct ata_request { #define ATA_R_THREAD 0x00000800 #define ATA_R_DIRECT 0x00001000 +#define ATA_R_ATAPI16 0x00010000 +#define ATA_R_ATAPI_INTR 0x00020000 + #define ATA_R_DEBUG 0x10000000 #define ATA_R_DANGER1 0x20000000 #define ATA_R_DANGER2 0x40000000 @@ -407,6 +425,9 @@ struct ata_request { struct ata_composite *composite; /* for composite atomic ops */ void *driver; /* driver specific */ TAILQ_ENTRY(ata_request) chain; /* list management */ +#ifdef ATA_CAM + union ccb *ccb; +#endif }; /* define this for debugging request processing */ @@ -414,7 +435,7 @@ struct ata_request { #define ATA_DEBUG_RQ(request, string) \ { \ if (request->flags & ATA_R_DEBUG) \ - device_printf(request->dev, "req=%p %s " string "\n", \ + device_printf(request->parent, "req=%p %s " string "\n", \ request, ata_cmd2str(request)); \ } #else @@ -440,7 +461,6 @@ struct ata_device { #define ATA_D_USE_CHS 0x0001 #define ATA_D_MEDIA_CHANGED 0x0002 #define ATA_D_ENC_PRESENT 0x0004 -#define ATA_D_48BIT_ACTIVE 0x0008 }; /* structure for holding DMA Physical Region Descriptors (PRD) entries */ @@ -474,7 +494,7 @@ struct ata_dma { u_int8_t *work; /* workspace */ bus_addr_t work_bus; /* bus address of dmatab */ -#define ATA_DMA_SLOTS 32 +#define ATA_DMA_SLOTS 1 int dma_slots; /* DMA slots allocated */ struct ata_dmaslot slot[ATA_DMA_SLOTS]; u_int32_t alignment; /* DMA SG list alignment */ @@ -514,6 +534,15 @@ struct ata_resource { int offset; }; +#ifdef ATA_CAM +struct ata_cam_device { + u_int revision; + int mode; + u_int bytecount; + u_int atapi; +}; +#endif + /* structure describing an ATA channel */ struct ata_channel { device_t dev; /* device handle */ @@ -530,6 +559,9 @@ struct ata_channel { #define ATA_ATAPI_DMA_RO 0x04 #define ATA_NO_48BIT_DMA 0x08 #define ATA_ALWAYS_DMASTAT 0x10 +#define ATA_CHECKS_CABLE 0x20 +#define ATA_NO_ATAPI_DMA 0x40 +#define ATA_SATA 0x80 int pm_level; /* power management level */ int devices; /* what is present */ @@ -550,6 +582,12 @@ struct ata_channel { struct ata_request *freezepoint; /* composite freezepoint */ struct ata_request *running; /* currently running request */ struct task conntask; /* PHY events handling task */ +#ifdef ATA_CAM + struct cam_sim *sim; + struct cam_path *path; + struct ata_cam_device user[16]; /* User-specified settings */ + struct ata_cam_device curr[16]; /* Current settings */ +#endif }; /* disk bay/enclosure related */ @@ -583,12 +621,20 @@ void ata_default_registers(device_t dev); void ata_modify_if_48bit(struct ata_request *request); void ata_udelay(int interval); char *ata_unit2str(struct ata_device *atadev); -char *ata_mode2str(int mode); -int ata_atapi(device_t dev); +const char *ata_mode2str(int mode); +const char *ata_satarev2str(int rev); +int ata_atapi(device_t dev, int target); int ata_pmode(struct ata_params *ap); int ata_wmode(struct ata_params *ap); int ata_umode(struct ata_params *ap); int ata_limit_mode(device_t dev, int mode, int maxmode); +void ata_setmode(device_t dev); +void ata_print_cable(device_t dev, u_int8_t *who); +int ata_check_80pin(device_t dev, int mode); +#ifdef ATA_CAM +void ata_cam_begin_transaction(device_t dev, union ccb *ccb); +void ata_cam_end_transaction(device_t dev, struct ata_request *request); +#endif /* ata-queue.c: */ int ata_controlcmd(device_t dev, u_int8_t command, u_int16_t feature, u_int64_t lba, u_int16_t count); @@ -618,7 +664,8 @@ void ata_sata_phy_check_events(device_t dev); int ata_sata_scr_read(struct ata_channel *ch, int port, int reg, uint32_t *val); int ata_sata_scr_write(struct ata_channel *ch, int port, int reg, uint32_t val); int ata_sata_phy_reset(device_t dev, int port, int quick); -void ata_sata_setmode(device_t dev, int mode); +int ata_sata_setmode(device_t dev, int target, int mode); +int ata_sata_getrev(device_t dev, int target); int ata_request2fis_h2d(struct ata_request *request, u_int8_t *fis); void ata_pm_identify(device_t dev); diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c index c699a05f52e3..c6b50ddeb43d 100644 --- a/sys/dev/ata/ata-disk.c +++ b/sys/dev/ata/ata-disk.c @@ -126,16 +126,20 @@ ad_attach(device_t dev) adp->disk->d_name = "ad"; adp->disk->d_drv1 = dev; adp->disk->d_maxsize = ch->dma.max_iosize ? ch->dma.max_iosize : DFLTPHYS; + if (atadev->param.support.command2 & ATA_SUPPORT_ADDRESS48) + adp->disk->d_maxsize = min(adp->disk->d_maxsize, 65536 * DEV_BSIZE); + else /* 28bit ATA command limit */ + adp->disk->d_maxsize = min(adp->disk->d_maxsize, 256 * DEV_BSIZE); adp->disk->d_sectorsize = DEV_BSIZE; adp->disk->d_mediasize = DEV_BSIZE * (off_t)adp->total_secs; adp->disk->d_fwsectors = adp->sectors; adp->disk->d_fwheads = adp->heads; adp->disk->d_unit = device_get_unit(dev); if (atadev->param.support.command2 & ATA_SUPPORT_FLUSHCACHE) - adp->disk->d_flags = DISKFLAG_CANFLUSHCACHE; + adp->disk->d_flags |= DISKFLAG_CANFLUSHCACHE; if ((atadev->param.support.command2 & ATA_SUPPORT_CFA) || atadev->param.config == ATA_PROTO_CFA) - adp->disk->d_flags = DISKFLAG_CANDELETE; + adp->disk->d_flags |= DISKFLAG_CANDELETE; strlcpy(adp->disk->d_ident, atadev->param.serial, sizeof(adp->disk->d_ident)); disk_create(adp->disk, DISK_VERSION); @@ -230,7 +234,7 @@ ad_spindown(void *priv) } request->dev = dev; request->flags = ATA_R_CONTROL; - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; request->retries = 1; request->callback = ad_power_callback; request->u.ata.command = ATA_STANDBY_IMMEDIATE; @@ -262,10 +266,10 @@ ad_strategy(struct bio *bp) if (atadev->spindown_state) { device_printf(dev, "request while spun down, starting.\n"); atadev->spindown_state = 0; - request->timeout = 31; + request->timeout = MAX(ATA_REQUEST_TIMEOUT, 31); } else { - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; } request->retries = 2; request->data = bp->bio_data; @@ -381,7 +385,7 @@ ad_init(device_t dev) { struct ata_device *atadev = device_get_softc(dev); - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); /* enable readahead caching */ if (atadev->param.support.command1 & ATA_SUPPORT_LOOKAHEAD) @@ -397,7 +401,7 @@ ad_init(device_t dev) /* use multiple sectors/interrupt if device supports it */ if (ad_version(atadev->param.version_major)) { - int secsperint = max(1, min(atadev->param.sectors_intr, 16)); + int secsperint = max(1, min(atadev->param.sectors_intr & 0xff, 16)); if (!ata_controlcmd(dev, ATA_SET_MULTI, 0, 0, secsperint)) atadev->max_iosize = secsperint * DEV_BSIZE; @@ -468,7 +472,7 @@ ad_set_geometry(device_t dev) request->u.ata.count = 0; request->u.ata.feature = 0; request->flags = ATA_R_CONTROL | ATA_R_QUIET; - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; request->retries = 0; ata_queue_request(request); if (request->status & ATA_S_ERROR) @@ -487,7 +491,7 @@ ad_set_geometry(device_t dev) request->u.ata.count = 1; request->u.ata.feature = 0; request->flags = ATA_R_CONTROL; - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; request->retries = 0; ata_queue_request(request); if (request->status & ATA_S_ERROR) @@ -533,12 +537,13 @@ ad_describe(device_t dev) strncpy(product, atadev->param.model, 40); } - device_printf(dev, "%juMB <%s%s %.8s> at ata%d-%s %s%s\n", + device_printf(dev, "%juMB <%s%s %.8s> at ata%d-%s %s%s %s\n", adp->total_secs / (1048576 / DEV_BSIZE), vendor, product, atadev->param.revision, device_get_unit(ch->dev), ata_unit2str(atadev), (adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "", - ata_mode2str(atadev->mode)); + ata_mode2str(atadev->mode), + ata_satarev2str(ATA_GETREV(device_get_parent(dev), atadev->unit))); if (bootverbose) { device_printf(dev, "%ju sectors [%juC/%dH/%dS] " "%d sectors/interrupt %d depth queue\n", adp->total_secs, diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c index 770b13f0e3c9..478693dd759c 100644 --- a/sys/dev/ata/ata-dma.c +++ b/sys/dev/ata/ata-dma.c @@ -76,9 +76,9 @@ ata_dmainit(device_t dev) ch->dma.alignment = 2; ch->dma.boundary = 65536; ch->dma.segsize = 65536; - ch->dma.max_iosize = 128 * DEV_BSIZE; + ch->dma.max_iosize = MIN((ATA_DMA_ENTRIES - 1) * PAGE_SIZE, MAXPHYS); ch->dma.max_address = BUS_SPACE_MAXADDR_32BIT; - ch->dma.dma_slots = 6; + ch->dma.dma_slots = 1; if (bus_dma_tag_create(bus_get_dma_tag(dev), ch->dma.alignment, 0, ch->dma.max_address, BUS_SPACE_MAXADDR, @@ -256,37 +256,36 @@ static int ata_dmaload(struct ata_request *request, void *addr, int *entries) { struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); struct ata_dmasetprd_args dspa; int error; ATA_DEBUG_RQ(request, "dmaload"); if (request->dma) { - device_printf(request->dev, + device_printf(request->parent, "FAILURE - already active DMA on this device\n"); return EIO; } if (!request->bytecount) { - device_printf(request->dev, + device_printf(request->parent, "FAILURE - zero length DMA transfer attempted\n"); return EIO; } if (request->bytecount & (ch->dma.alignment - 1)) { - device_printf(request->dev, + device_printf(request->parent, "FAILURE - odd-sized DMA transfer attempt %d %% %d\n", request->bytecount, ch->dma.alignment); return EIO; } if (request->bytecount > ch->dma.max_iosize) { - device_printf(request->dev, + device_printf(request->parent, "FAILURE - oversized DMA transfer attempt %d > %d\n", request->bytecount, ch->dma.max_iosize); return EIO; } - /* set our slot, unit for simplicity XXX SOS NCQ will change that */ - request->dma = &ch->dma.slot[atadev->unit]; + /* set our slot. XXX SOS NCQ will change that */ + request->dma = &ch->dma.slot[0]; if (addr) dspa.dmatab = addr; @@ -297,7 +296,7 @@ ata_dmaload(struct ata_request *request, void *addr, int *entries) request->data, request->bytecount, ch->dma.setprd, &dspa, BUS_DMA_NOWAIT)) || (error = dspa.error)) { - device_printf(request->dev, "FAILURE - load data\n"); + device_printf(request->parent, "FAILURE - load data\n"); goto error; } diff --git a/sys/dev/ata/ata-lowlevel.c b/sys/dev/ata/ata-lowlevel.c index c46caa680135..566b8f676a59 100644 --- a/sys/dev/ata/ata-lowlevel.c +++ b/sys/dev/ata/ata-lowlevel.c @@ -47,7 +47,7 @@ __FBSDID("$FreeBSD$"); /* prototypes */ static int ata_generic_status(device_t dev); -static int ata_wait(struct ata_channel *ch, struct ata_device *, u_int8_t); +static int ata_wait(struct ata_channel *ch, int unit, u_int8_t); static void ata_pio_read(struct ata_request *, int); static void ata_pio_write(struct ata_request *, int); static void ata_tf_read(struct ata_request *); @@ -77,20 +77,19 @@ int ata_begin_transaction(struct ata_request *request) { struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); int dummy, error; ATA_DEBUG_RQ(request, "begin transaction"); /* disable ATAPI DMA writes if HW doesn't support it */ + if ((ch->flags & ATA_NO_ATAPI_DMA) && + (request->flags & ATA_R_ATAPI) == ATA_R_ATAPI) + request->flags &= ~ATA_R_DMA; if ((ch->flags & ATA_ATAPI_DMA_RO) && ((request->flags & (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE)) == (ATA_R_ATAPI | ATA_R_DMA | ATA_R_WRITE))) request->flags &= ~ATA_R_DMA; - /* check for 48 bit access and convert if needed */ - ata_modify_if_48bit(request); - switch (request->flags & (ATA_R_ATAPI | ATA_R_DMA)) { /* ATA PIO data transfer and control commands */ @@ -101,7 +100,7 @@ ata_begin_transaction(struct ata_request *request) /* issue command */ if (ch->hw.command(request)) { - device_printf(request->dev, "error issuing %s command\n", + device_printf(request->parent, "error issuing %s command\n", ata_cmd2str(request)); request->result = EIO; goto begin_finished; @@ -122,8 +121,8 @@ ata_begin_transaction(struct ata_request *request) /* if write command output the data */ if (write) { - if (ata_wait(ch, atadev, (ATA_S_READY | ATA_S_DRQ)) < 0) { - device_printf(request->dev, + if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { + device_printf(request->parent, "timeout waiting for write DRQ\n"); request->result = EIO; goto begin_finished; @@ -137,14 +136,14 @@ ata_begin_transaction(struct ata_request *request) case ATA_R_DMA: /* check sanity, setup SG list and DMA engine */ if ((error = ch->dma.load(request, NULL, &dummy))) { - device_printf(request->dev, "setting up DMA failed\n"); + device_printf(request->parent, "setting up DMA failed\n"); request->result = error; goto begin_finished; } /* issue command */ if (ch->hw.command(request)) { - device_printf(request->dev, "error issuing %s command\n", + device_printf(request->parent, "error issuing %s command\n", ata_cmd2str(request)); request->result = EIO; goto begin_finished; @@ -152,7 +151,7 @@ ata_begin_transaction(struct ata_request *request) /* start DMA engine */ if (ch->dma.start && ch->dma.start(request)) { - device_printf(request->dev, "error starting DMA\n"); + device_printf(request->parent, "error starting DMA\n"); request->result = EIO; goto begin_finished; } @@ -162,7 +161,7 @@ ata_begin_transaction(struct ata_request *request) case ATA_R_ATAPI: /* is this just a POLL DSC command ? */ if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); DELAY(10); if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) request->result = EBUSY; @@ -171,7 +170,7 @@ ata_begin_transaction(struct ata_request *request) /* start ATAPI operation */ if (ch->hw.command(request)) { - device_printf(request->dev, "error issuing ATA PACKET command\n"); + device_printf(request->parent, "error issuing ATA PACKET command\n"); request->result = EIO; goto begin_finished; } @@ -181,7 +180,7 @@ ata_begin_transaction(struct ata_request *request) case ATA_R_ATAPI|ATA_R_DMA: /* is this just a POLL DSC command ? */ if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit)); DELAY(10); if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) request->result = EBUSY; @@ -190,14 +189,14 @@ ata_begin_transaction(struct ata_request *request) /* check sanity, setup SG list and DMA engine */ if ((error = ch->dma.load(request, NULL, &dummy))) { - device_printf(request->dev, "setting up DMA failed\n"); + device_printf(request->parent, "setting up DMA failed\n"); request->result = error; goto begin_finished; } /* start ATAPI operation */ if (ch->hw.command(request)) { - device_printf(request->dev, "error issuing ATA PACKET command\n"); + device_printf(request->parent, "error issuing ATA PACKET command\n"); request->result = EIO; goto begin_finished; } @@ -229,7 +228,6 @@ int ata_end_transaction(struct ata_request *request) { struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); int length; ATA_DEBUG_RQ(request, "end transaction"); @@ -266,8 +264,8 @@ ata_end_transaction(struct ata_request *request) if (request->u.ata.command != ATA_ATAPI_IDENTIFY) flags |= ATA_S_READY; - if (ata_wait(ch, atadev, flags) < 0) { - device_printf(request->dev, + if (ata_wait(ch, request->unit, flags) < 0) { + device_printf(request->parent, "timeout waiting for read DRQ\n"); request->result = EIO; goto end_finished; @@ -290,8 +288,8 @@ ata_end_transaction(struct ata_request *request) if (request->flags & ATA_R_WRITE) { /* if we get an error here we are done with the HW */ - if (ata_wait(ch, atadev, (ATA_S_READY | ATA_S_DRQ)) < 0) { - device_printf(request->dev, + if (ata_wait(ch, request->unit, (ATA_S_READY | ATA_S_DRQ)) < 0) { + device_printf(request->parent, "timeout waiting for write DRQ\n"); request->status = ATA_IDX_INB(ch, ATA_STATUS); goto end_finished; @@ -347,20 +345,19 @@ ata_end_transaction(struct ata_request *request) DELAY(10); if (!(request->status & ATA_S_DRQ)) { - device_printf(request->dev, "command interrupt without DRQ\n"); + device_printf(request->parent, "command interrupt without DRQ\n"); request->status = ATA_S_ERROR; goto end_finished; } ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, - (atadev->param.config & - ATA_PROTO_MASK)== ATA_PROTO_ATAPI_12 ? 6 : 8); + (request->flags & ATA_R_ATAPI16) ? 8 : 6); /* return wait for interrupt */ goto end_continue; case ATAPI_P_WRITE: if (request->flags & ATA_R_READ) { request->status = ATA_S_ERROR; - device_printf(request->dev, + device_printf(request->parent, "%s trying to write on read buffer\n", ata_cmd2str(request)); goto end_finished; @@ -378,7 +375,7 @@ ata_end_transaction(struct ata_request *request) case ATAPI_P_READ: if (request->flags & ATA_R_WRITE) { request->status = ATA_S_ERROR; - device_printf(request->dev, + device_printf(request->parent, "%s trying to read on write buffer\n", ata_cmd2str(request)); goto end_finished; @@ -393,7 +390,7 @@ ata_end_transaction(struct ata_request *request) goto end_continue; case ATAPI_P_DONEDRQ: - device_printf(request->dev, + device_printf(request->parent, "WARNING - %s DONEDRQ non conformant device\n", ata_cmd2str(request)); if (request->flags & ATA_R_READ) { @@ -415,7 +412,7 @@ ata_end_transaction(struct ata_request *request) goto end_finished; default: - device_printf(request->dev, "unknown transfer phase\n"); + device_printf(request->parent, "unknown transfer phase\n"); request->status = ATA_S_ERROR; } @@ -603,7 +600,7 @@ ata_generic_status(device_t dev) } static int -ata_wait(struct ata_channel *ch, struct ata_device *atadev, u_int8_t mask) +ata_wait(struct ata_channel *ch, int unit, u_int8_t mask) { u_int8_t status; int timeout = 0; @@ -616,7 +613,7 @@ ata_wait(struct ata_channel *ch, struct ata_device *atadev, u_int8_t mask) /* if drive fails status, reselect the drive and try again */ if (status == 0xff) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(unit)); timeout += 1000; DELAY(1000); continue; @@ -657,14 +654,13 @@ int ata_generic_command(struct ata_request *request) { struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); /* select device */ - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit)); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit)); /* ready to issue command ? */ - if (ata_wait(ch, atadev, 0) < 0) { - device_printf(request->dev, "timeout waiting to issue command\n"); + if (ata_wait(ch, request->unit, 0) < 0) { + device_printf(request->parent, "timeout waiting to issue command\n"); return -1; } @@ -673,6 +669,7 @@ ata_generic_command(struct ata_request *request) if (request->flags & ATA_R_ATAPI) { int timeout = 5000; + int res; /* issue packet command to controller */ if (request->flags & ATA_R_DMA) { @@ -688,9 +685,16 @@ ata_generic_command(struct ata_request *request) ATA_IDX_OUTB(ch, ATA_COMMAND, ATA_PACKET_CMD); /* command interrupt device ? just return and wait for interrupt */ - if ((atadev->param.config & ATA_DRQ_MASK) == ATA_DRQ_INTR) + if (request->flags & ATA_R_ATAPI_INTR) return 0; + /* command processed ? */ + res = ata_wait(ch, request->unit, 0); + if (res != 0) { + if (res < 0) + device_printf(request->parent, "timeout waiting for PACKET command\n"); + return (-1); + } /* wait for ready to write ATAPI command block */ while (timeout--) { int reason = ATA_IDX_INB(ch, ATA_IREASON); @@ -702,7 +706,7 @@ ata_generic_command(struct ata_request *request) DELAY(20); } if (timeout <= 0) { - device_printf(request->dev, "timeout waiting for ATAPI ready\n"); + device_printf(request->parent, "timeout waiting for ATAPI ready\n"); request->result = EIO; return -1; } @@ -712,8 +716,7 @@ ata_generic_command(struct ata_request *request) /* output command block */ ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (int16_t *)request->u.atapi.ccb, - (atadev->param.config & ATA_PROTO_MASK) == - ATA_PROTO_ATAPI_12 ? 6 : 8); + (request->flags & ATA_R_ATAPI16) ? 8 : 6); } else { ch->hw.tf_write(request); @@ -728,9 +731,8 @@ static void ata_tf_read(struct ata_request *request) { struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_4BIT | ATA_A_HOB); request->u.ata.count = (ATA_IDX_INB(ch, ATA_COUNT) << 8); request->u.ata.lba = @@ -758,9 +760,11 @@ static void ata_tf_write(struct ata_request *request) { struct ata_channel *ch = device_get_softc(request->parent); +#ifndef ATA_CAM struct ata_device *atadev = device_get_softc(request->dev); +#endif - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature >> 8); ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count >> 8); @@ -771,11 +775,12 @@ ata_tf_write(struct ata_request *request) ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 40); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(atadev->unit)); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(request->unit)); } else { ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); +#ifndef ATA_CAM if (atadev->flags & ATA_D_USE_CHS) { int heads, sectors; @@ -793,18 +798,21 @@ ata_tf_write(struct ata_request *request) (request->u.ata.lba / (sectors * heads))); ATA_IDX_OUTB(ch, ATA_CYL_MSB, (request->u.ata.lba / (sectors * heads)) >> 8); - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit) | + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit) | (((request->u.ata.lba% (sectors * heads)) / sectors) & 0xf)); } else { +#endif ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); ATA_IDX_OUTB(ch, ATA_DRIVE, - ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit) | + ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit) | ((request->u.ata.lba >> 24) & 0x0f)); +#ifndef ATA_CAM } +#endif } } @@ -825,7 +833,7 @@ ata_pio_read(struct ata_request *request, int length) size / sizeof(int32_t)); if (request->transfersize < length) { - device_printf(request->dev, "WARNING - %s read data overrun %d>%d\n", + device_printf(request->parent, "WARNING - %s read data overrun %d>%d\n", ata_cmd2str(request), length, request->transfersize); for (resid = request->transfersize; resid < length; resid += sizeof(int16_t)) @@ -850,7 +858,7 @@ ata_pio_write(struct ata_request *request, int length) size / sizeof(int32_t)); if (request->transfersize < length) { - device_printf(request->dev, "WARNING - %s write data underrun %d>%d\n", + device_printf(request->parent, "WARNING - %s write data underrun %d>%d\n", ata_cmd2str(request), length, request->transfersize); for (resid = request->transfersize; resid < length; resid += sizeof(int16_t)) diff --git a/sys/dev/ata/ata-pci.c b/sys/dev/ata/ata-pci.c index 9a0af1cf55c0..527107363fea 100644 --- a/sys/dev/ata/ata-pci.c +++ b/sys/dev/ata/ata-pci.c @@ -55,10 +55,6 @@ static MALLOC_DEFINE(M_ATAPCI, "ata_pci", "ATA driver PCI"); /* misc defines */ #define IOMASK 0xfffffffc -/* local prototypes */ -static int ata_generic_chipinit(device_t dev); -static void ata_generic_setmode(device_t dev, int mode); - /* * generic PCI ATA device probe */ @@ -189,91 +185,138 @@ ata_pci_resume(device_t dev) return error; } +int +ata_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) +{ + + return (BUS_READ_IVAR(device_get_parent(dev), dev, which, result)); +} + +int +ata_pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value) +{ + + return (BUS_WRITE_IVAR(device_get_parent(dev), dev, which, value)); +} + +uint32_t +ata_pci_read_config(device_t dev, device_t child, int reg, int width) +{ + + return (pci_read_config(dev, reg, width)); +} + +void +ata_pci_write_config(device_t dev, device_t child, int reg, + uint32_t val, int width) +{ + + pci_write_config(dev, reg, val, width); +} + struct resource * ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { - struct ata_pci_controller *controller = device_get_softc(dev); - int unit = ((struct ata_channel *)device_get_softc(child))->unit; - struct resource *res = NULL; - int myrid; + struct ata_pci_controller *controller = device_get_softc(dev); + struct resource *res = NULL; - if (type == SYS_RES_IOPORT) { - switch (*rid) { - case ATA_IOADDR_RID: - if (controller->legacy) { - start = (unit ? ATA_SECONDARY : ATA_PRIMARY); - count = ATA_IOSIZE; - end = start + count - 1; - } - myrid = PCIR_BAR(0) + (unit << 3); - res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, &myrid, - start, end, count, flags); - break; + if (device_get_devclass(child) == ata_devclass) { + int unit = ((struct ata_channel *)device_get_softc(child))->unit; + int myrid; - case ATA_CTLADDR_RID: - if (controller->legacy) { - start = (unit ? ATA_SECONDARY : ATA_PRIMARY) + ATA_CTLOFFSET; - count = ATA_CTLIOSIZE; - end = start + count - 1; - } - myrid = PCIR_BAR(1) + (unit << 3); - res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, &myrid, - start, end, count, flags); - break; - } - } - if (type == SYS_RES_IRQ && *rid == ATA_IRQ_RID) { - if (controller->legacy) { - int irq = (unit == 0 ? 14 : 15); + if (type == SYS_RES_IOPORT) { + switch (*rid) { + case ATA_IOADDR_RID: + if (controller->legacy) { + start = (unit ? ATA_SECONDARY : ATA_PRIMARY); + count = ATA_IOSIZE; + end = start + count - 1; + } + myrid = PCIR_BAR(0) + (unit << 3); + res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, &myrid, + start, end, count, flags); + break; + case ATA_CTLADDR_RID: + if (controller->legacy) { + start = (unit ? ATA_SECONDARY : ATA_PRIMARY) + + ATA_CTLOFFSET; + count = ATA_CTLIOSIZE; + end = start + count - 1; + } + myrid = PCIR_BAR(1) + (unit << 3); + res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, &myrid, + start, end, count, flags); + break; + } + } + if (type == SYS_RES_IRQ && *rid == ATA_IRQ_RID) { + if (controller->legacy) { + int irq = (unit == 0 ? 14 : 15); - res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, - SYS_RES_IRQ, rid, irq, irq, 1, flags); + res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, + SYS_RES_IRQ, rid, irq, irq, 1, flags); + } else + res = controller->r_irq; + } + } else { + if (type == SYS_RES_IRQ) { + if (*rid != ATA_IRQ_RID) + return (NULL); + res = controller->r_irq; + } else { + res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, + type, rid, start, end, count, flags); + } } - else - res = controller->r_irq; - } - return res; + return (res); } int ata_pci_release_resource(device_t dev, device_t child, int type, int rid, struct resource *r) { - struct ata_pci_controller *controller = device_get_softc(dev); - int unit = ((struct ata_channel *)device_get_softc(child))->unit; - if (type == SYS_RES_IOPORT) { - switch (rid) { - case ATA_IOADDR_RID: - return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, - PCIR_BAR(0) + (unit << 3), r); - break; + if (device_get_devclass(child) == ata_devclass) { + struct ata_pci_controller *controller = device_get_softc(dev); + int unit = ((struct ata_channel *)device_get_softc(child))->unit; - case ATA_CTLADDR_RID: - return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, - PCIR_BAR(1) + (unit << 3), r); - break; - default: - return ENOENT; + if (type == SYS_RES_IOPORT) { + switch (rid) { + case ATA_IOADDR_RID: + return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, + PCIR_BAR(0) + (unit << 3), r); + case ATA_CTLADDR_RID: + return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, + PCIR_BAR(1) + (unit << 3), r); + default: + return ENOENT; + } + } + if (type == SYS_RES_IRQ) { + if (rid != ATA_IRQ_RID) + return ENOENT; + if (controller->legacy) { + return BUS_RELEASE_RESOURCE(device_get_parent(dev), child, + SYS_RES_IRQ, rid, r); + } else + return 0; + } + } else { + if (type == SYS_RES_IRQ) { + if (rid != ATA_IRQ_RID) + return (ENOENT); + return (0); + } else { + return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child, + type, rid, r)); + } } - } - if (type == SYS_RES_IRQ) { - if (rid != ATA_IRQ_RID) - return ENOENT; - - if (controller->legacy) { - return BUS_RELEASE_RESOURCE(device_get_parent(dev), child, - SYS_RES_IRQ, rid, r); - } - else - return 0; - } - return EINVAL; + return (EINVAL); } int @@ -281,58 +324,60 @@ ata_pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, driver_filter_t *filter, driver_intr_t *function, void *argument, void **cookiep) { - struct ata_pci_controller *controller = device_get_softc(dev); - - if (controller->legacy) { - return BUS_SETUP_INTR(device_get_parent(dev), child, irq, - flags, filter, function, argument, cookiep); - } - else { struct ata_pci_controller *controller = device_get_softc(dev); - int unit = ((struct ata_channel *)device_get_softc(child))->unit; - if (filter != NULL) { - printf("ata-pci.c: we cannot use a filter here\n"); - return (EINVAL); + if (controller->legacy) { + return BUS_SETUP_INTR(device_get_parent(dev), child, irq, + flags, filter, function, argument, cookiep); + } else { + struct ata_pci_controller *controller = device_get_softc(dev); + int unit; + + if (filter != NULL) { + printf("ata-pci.c: we cannot use a filter here\n"); + return (EINVAL); + } + if (device_get_devclass(child) == ata_devclass) + unit = ((struct ata_channel *)device_get_softc(child))->unit; + else + unit = ATA_PCI_MAX_CH - 1; + controller->interrupt[unit].function = function; + controller->interrupt[unit].argument = argument; + *cookiep = controller; + return 0; } - controller->interrupt[unit].function = function; - controller->interrupt[unit].argument = argument; - *cookiep = controller; - return 0; - } } int ata_pci_teardown_intr(device_t dev, device_t child, struct resource *irq, void *cookie) { - struct ata_pci_controller *controller = device_get_softc(dev); - - if (controller->legacy) { - return BUS_TEARDOWN_INTR(device_get_parent(dev), child, irq, cookie); - } - else { struct ata_pci_controller *controller = device_get_softc(dev); - int unit = ((struct ata_channel *)device_get_softc(child))->unit; - controller->interrupt[unit].function = NULL; - controller->interrupt[unit].argument = NULL; - return 0; - } + if (controller->legacy) { + return BUS_TEARDOWN_INTR(device_get_parent(dev), child, irq, cookie); + } else { + struct ata_pci_controller *controller = device_get_softc(dev); + int unit; + + if (device_get_devclass(child) == ata_devclass) + unit = ((struct ata_channel *)device_get_softc(child))->unit; + else + unit = ATA_PCI_MAX_CH - 1; + controller->interrupt[unit].function = NULL; + controller->interrupt[unit].argument = NULL; + return 0; + } } -static void -ata_generic_setmode(device_t dev, int mode) +int +ata_generic_setmode(device_t dev, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); - mode = ata_limit_mode(dev, mode, ATA_UDMA2); - mode = ata_check_80pin(dev, mode); - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; + return (min(mode, ATA_UDMA2)); } -static int +int ata_generic_chipinit(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); @@ -409,8 +454,7 @@ ata_pci_status(device_t dev) (ch->dma.flags & ATA_DMA_ACTIVE))) { int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; - if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) != - ATA_BMSTAT_INTERRUPT) + if ((bmstat & ATA_BMSTAT_INTERRUPT) == 0) return 0; ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR); DELAY(1); @@ -477,7 +521,7 @@ ata_pci_dmareset(device_t dev) ch->dma.flags &= ~ATA_DMA_ACTIVE; ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR); if ((request = ch->running)) { - device_printf(request->dev, "DMA reset calling unload\n"); + device_printf(dev, "DMA reset calling unload\n"); ch->dma.unload(request); } } @@ -510,12 +554,16 @@ static device_method_t ata_pci_methods[] = { DEVMETHOD(device_shutdown, bus_generic_shutdown), /* bus methods */ + DEVMETHOD(bus_read_ivar, ata_pci_read_ivar), + DEVMETHOD(bus_write_ivar, ata_pci_write_ivar), DEVMETHOD(bus_alloc_resource, ata_pci_alloc_resource), DEVMETHOD(bus_release_resource, ata_pci_release_resource), DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), DEVMETHOD(bus_setup_intr, ata_pci_setup_intr), DEVMETHOD(bus_teardown_intr, ata_pci_teardown_intr), + DEVMETHOD(pci_read_config, ata_pci_read_config), + DEVMETHOD(pci_write_config, ata_pci_write_config), { 0, 0 } }; @@ -537,6 +585,8 @@ ata_pcichannel_probe(device_t dev) { char buffer[32]; + if ((intptr_t)device_get_ivars(dev) < 0) + return (ENXIO); sprintf(buffer, "ATA channel %d", (int)(intptr_t)device_get_ivars(dev)); device_set_desc_copy(dev, buffer); @@ -649,16 +699,30 @@ ata_pcichannel_reset(device_t dev) ata_generic_reset(dev); } -static void -ata_pcichannel_setmode(device_t parent, device_t dev) +static int +ata_pcichannel_setmode(device_t dev, int target, int mode) { - struct ata_pci_controller *ctlr = device_get_softc(GRANDPARENT(dev)); - struct ata_device *atadev = device_get_softc(dev); - int mode = atadev->mode; + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); - ctlr->setmode(dev, ATA_PIO_MAX); - if (mode >= ATA_DMA) - ctlr->setmode(dev, mode); + if (ctlr->setmode) + return (ctlr->setmode(dev, target, mode)); + else + return (ata_generic_setmode(dev, target, mode)); +} + +static int +ata_pcichannel_getrev(device_t dev, int target) +{ + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + struct ata_channel *ch = device_get_softc(dev); + + if (ch->flags & ATA_SATA) { + if (ctlr->getrev) + return (ctlr->getrev(dev, target)); + else + return (0xff); + } else + return (0); } static device_method_t ata_pcichannel_methods[] = { @@ -672,6 +736,7 @@ static device_method_t ata_pcichannel_methods[] = { /* ATA methods */ DEVMETHOD(ata_setmode, ata_pcichannel_setmode), + DEVMETHOD(ata_getrev, ata_pcichannel_getrev), DEVMETHOD(ata_locking, ata_pcichannel_locking), DEVMETHOD(ata_reset, ata_pcichannel_reset), @@ -711,7 +776,7 @@ ata_generic_intr(void *data) struct ata_channel *ch; int unit; - for (unit = 0; unit < ctlr->channels; unit++) { + for (unit = 0; unit < ATA_PCI_MAX_CH; unit++) { if ((ch = ctlr->interrupt[unit].argument)) ctlr->interrupt[unit].function(ch); } @@ -800,31 +865,6 @@ ata_find_chip(device_t dev, struct ata_chip_id *index, int slot) return (NULL); } -void -ata_print_cable(device_t dev, u_int8_t *who) -{ - device_printf(dev, - "DMA limited to UDMA33, %s found non-ATA66 cable\n", who); -} - -int -ata_check_80pin(device_t dev, int mode) -{ - struct ata_device *atadev = device_get_softc(dev); - - if (!ata_dma_check_80pin) { - if (bootverbose) - device_printf(dev, "Skipping 80pin cable check\n"); - return mode; - } - - if (mode > ATA_UDMA2 && !(atadev->param.hwres & ATA_CABLE_ID)) { - ata_print_cable(dev, "device"); - mode = ATA_UDMA2; - } - return mode; -} - char * ata_pcivendor2str(device_t dev) { @@ -841,6 +881,7 @@ ata_pcivendor2str(device_t dev) case ATA_ITE_ID: return "ITE"; case ATA_JMICRON_ID: return "JMicron"; case ATA_MARVELL_ID: return "Marvell"; + case ATA_MARVELL2_ID: return "Marvell"; case ATA_NATIONAL_ID: return "National"; case ATA_NETCELL_ID: return "Netcell"; case ATA_NVIDIA_ID: return "nVidia"; diff --git a/sys/dev/ata/ata-pci.h b/sys/dev/ata/ata-pci.h index 788adaf193ca..1378f879ce0c 100644 --- a/sys/dev/ata/ata-pci.h +++ b/sys/dev/ata/ata-pci.h @@ -36,6 +36,8 @@ struct ata_chip_id { char *text; }; +#define ATA_PCI_MAX_CH 8 + /* structure describing a PCI ATA controller */ struct ata_pci_controller { device_t dev; @@ -61,11 +63,12 @@ struct ata_pci_controller { int (*ch_resume)(device_t); int (*locking)(device_t, int); void (*reset)(device_t); - void (*setmode)(device_t, int); + int (*setmode)(device_t, int, int); + int (*getrev)(device_t, int); struct { void (*function)(void *); void *argument; - } interrupt[8]; /* XXX SOS max ch# for now */ + } interrupt[ATA_PCI_MAX_CH]; void *chipset_data; }; @@ -81,6 +84,7 @@ struct ata_pci_controller { #define ATA_ACER_LABS_ID 0x10b9 #define ATA_ALI_1533 0x153310b9 +#define ATA_ALI_5228 0x522810b9 #define ATA_ALI_5229 0x522910b9 #define ATA_ALI_5281 0x528110b9 #define ATA_ALI_5287 0x528710b9 @@ -97,6 +101,7 @@ struct ata_pci_controller { #define ATA_ADAPTEC_ID 0x9005 #define ATA_ADAPTEC_1420 0x02419005 +#define ATA_ADAPTEC_1430 0x02439005 #define ATA_ATI_ID 0x1002 #define ATA_ATI_IXP200 0x43491002 @@ -195,7 +200,12 @@ struct ata_pci_controller { #define ATA_I82801JD_AH 0x3a028086 #define ATA_I82801JD_R1 0x3a058086 #define ATA_I82801JD_S2 0x3a068086 +#define ATA_I82801JI_S1 0x3a208086 +#define ATA_I82801JI_AH 0x3a228086 +#define ATA_I82801JI_R1 0x3a258086 +#define ATA_I82801JI_S2 0x3a268086 #define ATA_I31244 0x32008086 +#define ATA_ISCH 0x811a8086 #define ATA_ITE_ID 0x1283 #define ATA_IT8211F 0x82111283 @@ -216,10 +226,16 @@ struct ata_pci_controller { #define ATA_M88SX5080 0x508011ab #define ATA_M88SX5081 0x508111ab #define ATA_M88SX6041 0x604111ab +#define ATA_M88SX6042 0x604211ab #define ATA_M88SX6081 0x608111ab +#define ATA_M88SX7042 0x704211ab #define ATA_M88SX6101 0x610111ab +#define ATA_M88SX6102 0x610211ab +#define ATA_M88SX6111 0x611111ab #define ATA_M88SX6121 0x612111ab +#define ATA_M88SX6141 0x614111ab #define ATA_M88SX6145 0x614511ab +#define ATA_MARVELL2_ID 0x1b4b #define ATA_MICRON_ID 0x1042 #define ATA_MICRON_RZ1000 0x10001042 @@ -257,6 +273,15 @@ struct ata_pci_controller { #define ATA_NFORCE_MCP61_S2 0x03f610de #define ATA_NFORCE_MCP61_S3 0x03f710de #define ATA_NFORCE_MCP65 0x044810de +#define ATA_NFORCE_MCP65_A0 0x044c10de +#define ATA_NFORCE_MCP65_A1 0x044d10de +#define ATA_NFORCE_MCP65_A2 0x044e10de +#define ATA_NFORCE_MCP65_A3 0x044f10de +#define ATA_NFORCE_MCP65_A4 0x045c10de +#define ATA_NFORCE_MCP65_A5 0x045d10de +#define ATA_NFORCE_MCP65_A6 0x045e10de +#define ATA_NFORCE_MCP65_A7 0x045f10de +#define ATA_NFORCE_MCP67 0x056010de #define ATA_NFORCE_MCP67_A0 0x055010de #define ATA_NFORCE_MCP67_A1 0x055110de #define ATA_NFORCE_MCP67_A2 0x055210de @@ -270,7 +295,6 @@ struct ata_pci_controller { #define ATA_NFORCE_MCP67_AA 0x055A10de #define ATA_NFORCE_MCP67_AB 0x055B10de #define ATA_NFORCE_MCP67_AC 0x058410de -#define ATA_NFORCE_MCP67 0x056010de #define ATA_NFORCE_MCP73 0x056c10de #define ATA_NFORCE_MCP73_A0 0x07f010de #define ATA_NFORCE_MCP73_A1 0x07f110de @@ -285,6 +309,42 @@ struct ata_pci_controller { #define ATA_NFORCE_MCP73_AA 0x07fa10de #define ATA_NFORCE_MCP73_AB 0x07fb10de #define ATA_NFORCE_MCP77 0x075910de +#define ATA_NFORCE_MCP77_A0 0x0ad010de +#define ATA_NFORCE_MCP77_A1 0x0ad110de +#define ATA_NFORCE_MCP77_A2 0x0ad210de +#define ATA_NFORCE_MCP77_A3 0x0ad310de +#define ATA_NFORCE_MCP77_A4 0x0ad410de +#define ATA_NFORCE_MCP77_A5 0x0ad510de +#define ATA_NFORCE_MCP77_A6 0x0ad610de +#define ATA_NFORCE_MCP77_A7 0x0ad710de +#define ATA_NFORCE_MCP77_A8 0x0ad810de +#define ATA_NFORCE_MCP77_A9 0x0ad910de +#define ATA_NFORCE_MCP77_AA 0x0ada10de +#define ATA_NFORCE_MCP77_AB 0x0adb10de +#define ATA_NFORCE_MCP79_A0 0x0ab410de +#define ATA_NFORCE_MCP79_A1 0x0ab510de +#define ATA_NFORCE_MCP79_A2 0x0ab610de +#define ATA_NFORCE_MCP79_A3 0x0ab710de +#define ATA_NFORCE_MCP79_A4 0x0ab810de +#define ATA_NFORCE_MCP79_A5 0x0ab910de +#define ATA_NFORCE_MCP79_A6 0x0aba10de +#define ATA_NFORCE_MCP79_A7 0x0abb10de +#define ATA_NFORCE_MCP79_A8 0x0abc10de +#define ATA_NFORCE_MCP79_A9 0x0abd10de +#define ATA_NFORCE_MCP79_AA 0x0abe10de +#define ATA_NFORCE_MCP79_AB 0x0abf10de +#define ATA_NFORCE_MCP89_A0 0x0d8410de +#define ATA_NFORCE_MCP89_A1 0x0d8510de +#define ATA_NFORCE_MCP89_A2 0x0d8610de +#define ATA_NFORCE_MCP89_A3 0x0d8710de +#define ATA_NFORCE_MCP89_A4 0x0d8810de +#define ATA_NFORCE_MCP89_A5 0x0d8910de +#define ATA_NFORCE_MCP89_A6 0x0d8a10de +#define ATA_NFORCE_MCP89_A7 0x0d8b10de +#define ATA_NFORCE_MCP89_A8 0x0d8c10de +#define ATA_NFORCE_MCP89_A9 0x0d8d10de +#define ATA_NFORCE_MCP89_AA 0x0d8e10de +#define ATA_NFORCE_MCP89_AB 0x0d8f10de #define ATA_PROMISE_ID 0x105a #define ATA_PDC20246 0x4d33105a @@ -415,6 +475,8 @@ struct ata_pci_controller { #define ATA_VIA8237 0x32271106 #define ATA_VIA8237A 0x05911106 #define ATA_VIA8237S 0x53371106 +#define ATA_VIA8237_5372 0x53721106 +#define ATA_VIA8237_7372 0x73721106 #define ATA_VIA8251 0x33491106 #define ATA_VIA8361 0x31121106 #define ATA_VIA8363 0x03051106 @@ -423,6 +485,11 @@ struct ata_pci_controller { #define ATA_VIA6410 0x31641106 #define ATA_VIA6420 0x31491106 #define ATA_VIA6421 0x32491106 +#define ATA_VIACX700IDE 0x05811106 +#define ATA_VIACX700 0x83241106 +#define ATA_VIASATAIDE 0x53241106 +#define ATA_VIAVX800 0x83531106 +#define ATA_VIAVX855 0x84091106 /* global prototypes ata-pci.c */ int ata_pci_probe(device_t dev); @@ -430,6 +497,11 @@ int ata_pci_attach(device_t dev); int ata_pci_detach(device_t dev); int ata_pci_suspend(device_t dev); int ata_pci_resume(device_t dev); +int ata_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result); +int ata_pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value); +uint32_t ata_pci_read_config(device_t dev, device_t child, int reg, int width); +void ata_pci_write_config(device_t dev, device_t child, int reg, + uint32_t val, int width); struct resource * ata_pci_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags); int ata_pci_release_resource(device_t dev, device_t child, int type, int rid, struct resource *r); int ata_pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, driver_filter_t *filter, driver_intr_t *function, void *argument, void **cookiep); @@ -443,22 +515,16 @@ void ata_pci_dmafini(device_t dev); char *ata_pcivendor2str(device_t dev); int ata_legacy(device_t); void ata_generic_intr(void *data); +int ata_generic_chipinit(device_t dev); +int ata_generic_setmode(device_t dev, int target, int mode); int ata_setup_interrupt(device_t dev, void *intr_func); void ata_set_desc(device_t dev); struct ata_chip_id *ata_match_chip(device_t dev, struct ata_chip_id *index); struct ata_chip_id *ata_find_chip(device_t dev, struct ata_chip_id *index, int slot); -void ata_print_cable(device_t dev, u_int8_t *who); -int ata_check_80pin(device_t dev, int mode); int ata_mode2idx(int mode); /* global prototypes from chipsets/ata-*.c */ int ata_ahci_chipinit(device_t); -int ata_ahci_ch_attach(device_t dev); -int ata_ahci_ch_detach(device_t dev); -int ata_ahci_ch_suspend(device_t dev); -int ata_ahci_ch_resume(device_t dev); -int ata_ahci_ctlr_reset(device_t dev); -void ata_ahci_reset(device_t dev); int ata_marvell_edma_chipinit(device_t); int ata_sii_chipinit(device_t); @@ -474,12 +540,16 @@ static device_method_t __CONCAT(dname,_methods)[] = { \ DEVMETHOD(device_suspend, ata_pci_suspend), \ DEVMETHOD(device_resume, ata_pci_resume), \ DEVMETHOD(device_shutdown, bus_generic_shutdown), \ + DEVMETHOD(bus_read_ivar, ata_pci_read_ivar), \ + DEVMETHOD(bus_write_ivar, ata_pci_write_ivar), \ DEVMETHOD(bus_alloc_resource, ata_pci_alloc_resource), \ DEVMETHOD(bus_release_resource, ata_pci_release_resource), \ DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), \ DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), \ DEVMETHOD(bus_setup_intr, ata_pci_setup_intr), \ DEVMETHOD(bus_teardown_intr, ata_pci_teardown_intr), \ + DEVMETHOD(pci_read_config, ata_pci_read_config), \ + DEVMETHOD(pci_write_config, ata_pci_write_config), \ { 0, 0 } \ }; \ static driver_t __CONCAT(dname,_driver) = { \ diff --git a/sys/dev/ata/ata-queue.c b/sys/dev/ata/ata-queue.c index 87568844e58e..a3b1c4e4435c 100644 --- a/sys/dev/ata/ata-queue.c +++ b/sys/dev/ata/ata-queue.c @@ -52,17 +52,25 @@ void ata_queue_request(struct ata_request *request) { struct ata_channel *ch; + struct ata_device *atadev = device_get_softc(request->dev); /* treat request as virgin (this might be an ATA_R_REQUEUE) */ request->result = request->status = request->error = 0; - /* check that the device is still valid */ + /* Prepare paramers required by low-level code. */ + request->unit = atadev->unit; if (!(request->parent = device_get_parent(request->dev))) { request->result = ENXIO; if (request->callback) (request->callback)(request); return; } + if ((atadev->param.config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) + request->flags |= ATA_R_ATAPI16; + if ((atadev->param.config & ATA_DRQ_MASK) == ATA_DRQ_INTR) + request->flags |= ATA_R_ATAPI_INTR; + if ((request->flags & ATA_R_ATAPI) == 0) + ata_modify_if_48bit(request); ch = device_get_softc(request->parent); callout_init_mtx(&request->callout, &ch->state_mtx, CALLOUT_RETURNUNLOCKED); if (!request->callback && !(request->flags & ATA_R_REQUEUE)) @@ -133,9 +141,9 @@ ata_controlcmd(device_t dev, u_int8_t command, u_int16_t feature, if (atadev->spindown_state) { device_printf(dev, "request while spun down, starting.\n"); atadev->spindown_state = 0; - request->timeout = 31; + request->timeout = MAX(ATA_REQUEST_TIMEOUT, 31); } else { - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; } request->retries = 0; ata_queue_request(request); @@ -150,15 +158,11 @@ ata_atapicmd(device_t dev, u_int8_t *ccb, caddr_t data, int count, int flags, int timeout) { struct ata_request *request = ata_alloc_request(); - struct ata_device *atadev = device_get_softc(dev); int error = ENOMEM; if (request) { request->dev = dev; - if ((atadev->param.config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) - bcopy(ccb, request->u.atapi.ccb, 12); - else - bcopy(ccb, request->u.atapi.ccb, 16); + bcopy(ccb, request->u.atapi.ccb, 16); request->data = data; request->bytecount = count; request->transfersize = min(request->bytecount, 65534); @@ -393,7 +397,7 @@ ata_completed(void *context, int dummy) request->bytecount = sizeof(struct atapi_sense); request->donecount = 0; request->transfersize = sizeof(struct atapi_sense); - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; request->flags &= (ATA_R_ATAPI | ATA_R_QUIET | ATA_R_DEBUG); request->flags |= (ATA_R_READ | ATA_R_AT_HEAD | ATA_R_REQUEUE); ATA_DEBUG_RQ(request, "autoissue request sense"); @@ -507,11 +511,18 @@ ata_timeout(struct ata_request *request) */ if (ch->state == ATA_ACTIVE) { request->flags |= ATA_R_TIMEOUT; - mtx_unlock(&ch->state_mtx); - ATA_LOCKING(ch->dev, ATA_LF_UNLOCK); if (ch->dma.unload) ch->dma.unload(request); +#ifdef ATA_CAM + ch->running = NULL; + ch->state = ATA_IDLE; + ata_cam_end_transaction(ch->dev, request); +#endif + mtx_unlock(&ch->state_mtx); + ATA_LOCKING(ch->dev, ATA_LF_UNLOCK); +#ifndef ATA_CAM ata_finish(request); +#endif } else { mtx_unlock(&ch->state_mtx); diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c index fc6a23c04618..1e976078f613 100644 --- a/sys/dev/ata/ata-raid.c +++ b/sys/dev/ata/ata-raid.c @@ -273,7 +273,7 @@ ata_raid_flush(struct bio *bp) request->u.ata.lba = 0; request->u.ata.count = 0; request->u.ata.feature = 0; - request->timeout = 1; + request->timeout = ATA_REQUEST_TIMEOUT; request->retries = 0; request->flags |= ATA_R_ORDERED | ATA_R_DIRECT; ata_queue_request(request); @@ -407,7 +407,7 @@ ata_raid_strategy(struct bio *bp) if (rdp->status & AR_S_REBUILDING) blk = ((lba / rdp->interleave) * rdp->width) * rdp->interleave + (rdp->interleave * (drv % rdp->width)) + - lba % rdp->interleave;; + lba % rdp->interleave; if (bp->bio_cmd == BIO_READ) { int src_online = @@ -4371,7 +4371,7 @@ ata_raid_init_request(device_t dev, struct ar_softc *rdp, struct bio *bio) return NULL; } request->dev = dev; - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; request->retries = 2; request->callback = ata_raid_done; request->driver = rdp; @@ -4445,7 +4445,7 @@ ata_raid_rw(device_t dev, u_int64_t lba, void *data, u_int bcount, int flags) /* setup request */ request->dev = dev; - request->timeout = 10; + request->timeout = ATA_REQUEST_TIMEOUT; request->retries = 0; request->data = data; request->bytecount = bcount; diff --git a/sys/dev/ata/ata-sata.c b/sys/dev/ata/ata-sata.c index b00bf01e5085..d4c52fd475b6 100644 --- a/sys/dev/ata/ata-sata.c +++ b/sys/dev/ata/ata-sata.c @@ -209,48 +209,30 @@ ata_sata_phy_reset(device_t dev, int port, int quick) return 0; } -void -ata_sata_setmode(device_t dev, int mode) +int +ata_sata_setmode(device_t dev, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); - /* - * if we detect that the device isn't a real SATA device we limit - * the transfer mode to UDMA5/ATA100. - * this works around the problems some devices has with the - * Marvell 88SX8030 SATA->PATA converters and UDMA6/ATA133. - */ - if (atadev->param.satacapabilities != 0x0000 && - atadev->param.satacapabilities != 0xffff) { - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); + return (min(mode, ATA_UDMA5)); +} - /* on some drives we need to set the transfer mode */ - ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, - ata_limit_mode(dev, mode, ATA_UDMA6)); +int +ata_sata_getrev(device_t dev, int target) +{ + struct ata_channel *ch = device_get_softc(dev); - /* query SATA STATUS for the speed */ - if (ch->r_io[ATA_SSTATUS].res && - ((ATA_IDX_INL(ch, ATA_SSTATUS) & ATA_SS_CONWELL_MASK) == - ATA_SS_CONWELL_GEN2)) - atadev->mode = ATA_SA300; - else - atadev->mode = ATA_SA150; - } - else { - mode = ata_limit_mode(dev, mode, ATA_UDMA5); - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; - } + if (ch->r_io[ATA_SSTATUS].res) + return ((ATA_IDX_INL(ch, ATA_SSTATUS) & 0x0f0) >> 4); + return (0xff); } int ata_request2fis_h2d(struct ata_request *request, u_int8_t *fis) { - struct ata_device *atadev = device_get_softc(request->dev); if (request->flags & ATA_R_ATAPI) { fis[0] = 0x27; /* host to device */ - fis[1] = 0x80 | (atadev->unit & 0x0f); + fis[1] = 0x80 | (request->unit & 0x0f); fis[2] = ATA_PACKET_CMD; if (request->flags & (ATA_R_READ | ATA_R_WRITE)) fis[3] = ATA_F_DMA; @@ -263,16 +245,15 @@ ata_request2fis_h2d(struct ata_request *request, u_int8_t *fis) return 20; } else { - ata_modify_if_48bit(request); fis[0] = 0x27; /* host to device */ - fis[1] = 0x80 | (atadev->unit & 0x0f); + fis[1] = 0x80 | (request->unit & 0x0f); fis[2] = request->u.ata.command; fis[3] = request->u.ata.feature; fis[4] = request->u.ata.lba; fis[5] = request->u.ata.lba >> 8; fis[6] = request->u.ata.lba >> 16; fis[7] = ATA_D_LBA; - if (!(atadev->flags & ATA_D_48BIT_ACTIVE)) + if (!(request->flags & ATA_R_48BIT)) fis[7] |= (ATA_D_IBM | (request->u.ata.lba >> 24 & 0x0f)); fis[8] = request->u.ata.lba >> 24; fis[9] = request->u.ata.lba >> 32; @@ -339,9 +320,6 @@ ata_pm_identify(device_t dev) pm_chipid, pm_revision, pm_ports); } - /* realloc space for needed DMA slots */ - ch->dma.dma_slots = pm_ports; - /* reset all ports and register if anything connected */ for (port=0; port < pm_ports; port++) { u_int32_t signature; diff --git a/sys/dev/ata/ata-usb.c b/sys/dev/ata/ata-usb.c deleted file mode 100644 index a08b80ad7696..000000000000 --- a/sys/dev/ata/ata-usb.c +++ /dev/null @@ -1,1127 +0,0 @@ -/*- - * Copyright (c) 2006 - 2008 Søren Schmidt - * All rights reserved. - * - * Copyright (c) 2006 Hans Petter Selasky - * 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, - * without modification, immediately at the beginning of the file. - * 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 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 -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "usbdevs.h" -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#define ATAUSB_BULK_SIZE (1<<17) - -/* Command Block Wrapper */ -struct bbb_cbw { - uint8_t signature[4]; -#define CBWSIGNATURE 0x43425355 - - uint8_t tag[4]; - uint8_t transfer_length[4]; - uint8_t flags; -#define CBWFLAGS_OUT 0x00 -#define CBWFLAGS_IN 0x80 - - uint8_t lun; - uint8_t length; -#define CBWCDBLENGTH 16 - - uint8_t cdb[CBWCDBLENGTH]; -} __packed; - -/* Command Status Wrapper */ -struct bbb_csw { - uint8_t signature[4]; -#define CSWSIGNATURE 0x53425355 - - uint8_t tag[4]; - uint8_t residue[4]; - uint8_t status; -#define CSWSTATUS_GOOD 0x0 -#define CSWSTATUS_FAILED 0x1 -#define CSWSTATUS_PHASE 0x2 -} __packed; - -/* USB-ATA 'controller' softc */ -struct atausb2_softc { - struct bbb_cbw cbw; - struct bbb_csw csw; - struct mtx locked_mtx; - - struct ata_channel *locked_ch; - struct ata_channel *restart_ch; - struct ata_request *ata_request; - -#define ATAUSB_T_BBB_RESET1 0 -#define ATAUSB_T_BBB_RESET2 1 -#define ATAUSB_T_BBB_RESET3 2 -#define ATAUSB_T_BBB_COMMAND 3 -#define ATAUSB_T_BBB_DATA_READ 4 -#define ATAUSB_T_BBB_DATA_RD_CS 5 -#define ATAUSB_T_BBB_DATA_WRITE 6 -#define ATAUSB_T_BBB_DATA_WR_CS 7 -#define ATAUSB_T_BBB_STATUS 8 -#define ATAUSB_T_BBB_MAX 9 - -#define ATAUSB_T_MAX ATAUSB_T_BBB_MAX - - struct usb_xfer *xfer[ATAUSB_T_MAX]; - caddr_t ata_data; - device_t dev; - - uint32_t timeout; - uint32_t ata_donecount; - uint32_t ata_bytecount; - - uint8_t last_xfer_no; - uint8_t usb2_speed; - uint8_t intr_stalled; - uint8_t maxlun; - uint8_t iface_no; - uint8_t status_try; -}; - -static const int atausbdebug = 0; - -/* prototypes */ - -static device_probe_t atausb2_probe; -static device_attach_t atausb2_attach; -static device_detach_t atausb2_detach; - -static usb_callback_t atausb2_t_bbb_reset1_callback; -static usb_callback_t atausb2_t_bbb_reset2_callback; -static usb_callback_t atausb2_t_bbb_reset3_callback; -static usb_callback_t atausb2_t_bbb_command_callback; -static usb_callback_t atausb2_t_bbb_data_read_callback; -static usb_callback_t atausb2_t_bbb_data_rd_cs_callback; -static usb_callback_t atausb2_t_bbb_data_write_callback; -static usb_callback_t atausb2_t_bbb_data_wr_cs_callback; -static usb_callback_t atausb2_t_bbb_status_callback; -static usb_callback_t atausb2_tr_error; - -static void atausb2_cancel_request(struct atausb2_softc *sc); -static void atausb2_transfer_start(struct atausb2_softc *sc, uint8_t xfer_no); -static void atausb2_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer, - uint8_t next_xfer, uint8_t stall_xfer, usb_error_t error); -static int ata_usbchannel_begin_transaction(struct ata_request *request); -static int ata_usbchannel_end_transaction(struct ata_request *request); - -static device_probe_t ata_usbchannel_probe; -static device_attach_t ata_usbchannel_attach; -static device_detach_t ata_usbchannel_detach; - -static ata_setmode_t ata_usbchannel_setmode; -static ata_locking_t ata_usbchannel_locking; - -/* - * USB frontend part - */ - -struct usb_config atausb2_config[ATAUSB_T_BBB_MAX] = { - - [ATAUSB_T_BBB_RESET1] = { - .type = UE_CONTROL, - .endpoint = 0x00, /* Control pipe */ - .direction = UE_DIR_ANY, - .bufsize = sizeof(struct usb_device_request), - .flags = {}, - .callback = &atausb2_t_bbb_reset1_callback, - .timeout = 5000, /* 5 seconds */ - .interval = 500, /* 500 milliseconds */ - }, - - [ATAUSB_T_BBB_RESET2] = { - .type = UE_CONTROL, - .endpoint = 0x00, /* Control pipe */ - .direction = UE_DIR_ANY, - .bufsize = sizeof(struct usb_device_request), - .flags = {}, - .callback = &atausb2_t_bbb_reset2_callback, - .timeout = 5000, /* 5 seconds */ - .interval = 50, /* 50 milliseconds */ - }, - - [ATAUSB_T_BBB_RESET3] = { - .type = UE_CONTROL, - .endpoint = 0x00, /* Control pipe */ - .direction = UE_DIR_ANY, - .bufsize = sizeof(struct usb_device_request), - .flags = {}, - .callback = &atausb2_t_bbb_reset3_callback, - .timeout = 5000, /* 5 seconds */ - .interval = 50, /* 50 milliseconds */ - }, - - [ATAUSB_T_BBB_COMMAND] = { - .type = UE_BULK, - .endpoint = UE_ADDR_ANY, - .direction = UE_DIR_OUT, - .bufsize = sizeof(struct bbb_cbw), - .flags = {}, - .callback = &atausb2_t_bbb_command_callback, - .timeout = 5000, /* 5 seconds */ - }, - - [ATAUSB_T_BBB_DATA_READ] = { - .type = UE_BULK, - .endpoint = UE_ADDR_ANY, - .direction = UE_DIR_IN, - .bufsize = ATAUSB_BULK_SIZE, - .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,}, - .callback = &atausb2_t_bbb_data_read_callback, - .timeout = 0, /* overwritten later */ - }, - - [ATAUSB_T_BBB_DATA_RD_CS] = { - .type = UE_CONTROL, - .endpoint = 0x00, /* Control pipe */ - .direction = UE_DIR_ANY, - .bufsize = sizeof(struct usb_device_request), - .flags = {}, - .callback = &atausb2_t_bbb_data_rd_cs_callback, - .timeout = 5000, /* 5 seconds */ - }, - - [ATAUSB_T_BBB_DATA_WRITE] = { - .type = UE_BULK, - .endpoint = UE_ADDR_ANY, - .direction = UE_DIR_OUT, - .bufsize = ATAUSB_BULK_SIZE, - .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,}, - .callback = &atausb2_t_bbb_data_write_callback, - .timeout = 0, /* overwritten later */ - }, - - [ATAUSB_T_BBB_DATA_WR_CS] = { - .type = UE_CONTROL, - .endpoint = 0x00, /* Control pipe */ - .direction = UE_DIR_ANY, - .bufsize = sizeof(struct usb_device_request), - .flags = {}, - .callback = &atausb2_t_bbb_data_wr_cs_callback, - .timeout = 5000, /* 5 seconds */ - }, - - [ATAUSB_T_BBB_STATUS] = { - .type = UE_BULK, - .endpoint = UE_ADDR_ANY, - .direction = UE_DIR_IN, - .bufsize = sizeof(struct bbb_csw), - .flags = {.short_xfer_ok = 1,}, - .callback = &atausb2_t_bbb_status_callback, - .timeout = 5000, /* ms */ - }, -}; - -static devclass_t atausb2_devclass; - -static device_method_t atausb2_methods[] = { - DEVMETHOD(device_probe, atausb2_probe), - DEVMETHOD(device_attach, atausb2_attach), - DEVMETHOD(device_detach, atausb2_detach), - {0, 0} -}; - -static driver_t atausb2_driver = { - .name = "atausb", - .methods = atausb2_methods, - .size = sizeof(struct atausb2_softc), -}; - -DRIVER_MODULE(atausb, uhub, atausb2_driver, atausb2_devclass, 0, 0); -MODULE_DEPEND(atausb, usb, 1, 1, 1); -MODULE_VERSION(atausb, 1); - -static int -atausb2_probe(device_t dev) -{ - struct usb_attach_arg *uaa = device_get_ivars(dev); - struct usb_interface_descriptor *id; - - if (uaa->usb_mode != USB_MODE_HOST) { - return (ENXIO); - } - if (uaa->use_generic == 0) { - /* give other drivers a try first */ - return (ENXIO); - } - id = usbd_get_interface_descriptor(uaa->iface); - if ((!id) || (id->bInterfaceClass != UICLASS_MASS)) { - return (ENXIO); - } - switch (id->bInterfaceSubClass) { - case UISUBCLASS_QIC157: - case UISUBCLASS_RBC: - case UISUBCLASS_SCSI: - case UISUBCLASS_SFF8020I: - case UISUBCLASS_SFF8070I: - case UISUBCLASS_UFI: - switch (id->bInterfaceProtocol) { - case UIPROTO_MASS_CBI: - case UIPROTO_MASS_CBI_I: - case UIPROTO_MASS_BBB: - case UIPROTO_MASS_BBB_OLD: - return (0); - default: - return (0); - } - break; - default: - return (0); - } -} - -static int -atausb2_attach(device_t dev) -{ - struct atausb2_softc *sc = device_get_softc(dev); - struct usb_attach_arg *uaa = device_get_ivars(dev); - struct usb_interface_descriptor *id; - const char *proto, *subclass; - struct usb_device_request request; - device_t child; - uint16_t i; - uint8_t maxlun; - uint8_t has_intr; - int err; - - device_set_usb_desc(dev); - - sc->dev = dev; - sc->maxlun = 0; - sc->locked_ch = NULL; - sc->restart_ch = NULL; - sc->usb2_speed = usbd_get_speed(uaa->device); - mtx_init(&sc->locked_mtx, "ATAUSB lock", NULL, (MTX_DEF | MTX_RECURSE)); - - id = usbd_get_interface_descriptor(uaa->iface); - switch (id->bInterfaceProtocol) { - case UIPROTO_MASS_BBB: - case UIPROTO_MASS_BBB_OLD: - proto = "Bulk-Only"; - break; - case UIPROTO_MASS_CBI: - proto = "CBI"; - break; - case UIPROTO_MASS_CBI_I: - proto = "CBI with CCI"; - break; - default: - proto = "Unknown"; - } - - switch (id->bInterfaceSubClass) { - case UISUBCLASS_RBC: - subclass = "RBC"; - break; - case UISUBCLASS_QIC157: - case UISUBCLASS_SFF8020I: - case UISUBCLASS_SFF8070I: - subclass = "ATAPI"; - break; - case UISUBCLASS_SCSI: - subclass = "SCSI"; - break; - case UISUBCLASS_UFI: - subclass = "UFI"; - break; - default: - subclass = "Unknown"; - } - - has_intr = (id->bInterfaceProtocol == UIPROTO_MASS_CBI_I); - sc->iface_no = id->bInterfaceNumber; - - device_printf(dev, "using %s over %s\n", subclass, proto); - if (strcmp(proto, "Bulk-Only") || - (strcmp(subclass, "ATAPI") && strcmp(subclass, "SCSI"))) { - goto detach; - } - err = usbd_transfer_setup(uaa->device, &uaa->info.bIfaceIndex, - sc->xfer, atausb2_config, ATAUSB_T_BBB_MAX, sc, - &sc->locked_mtx); - - /* skip reset first time */ - sc->last_xfer_no = ATAUSB_T_BBB_COMMAND; - - if (err) { - device_printf(sc->dev, "could not setup required " - "transfers, %s\n", usbd_errstr(err)); - goto detach; - } - /* get number of devices so we can add matching channels */ - request.bmRequestType = UT_READ_CLASS_INTERFACE; - request.bRequest = 0xfe; /* GET_MAX_LUN; */ - USETW(request.wValue, 0); - USETW(request.wIndex, sc->iface_no); - USETW(request.wLength, sizeof(maxlun)); - err = usbd_do_request(uaa->device, &Giant, &request, &maxlun); - - if (err) { - if (bootverbose) { - device_printf(sc->dev, "get maxlun not supported %s\n", - usbd_errstr(err)); - } - } else { - sc->maxlun = maxlun; - if (bootverbose) { - device_printf(sc->dev, "maxlun=%d\n", sc->maxlun); - } - } - - /* ata channels are children to this USB control device */ - for (i = 0; i <= sc->maxlun; i++) { - if ((child = device_add_child(sc->dev, "ata", - devclass_find_free_unit(ata_devclass, 2))) == NULL) { - device_printf(sc->dev, "failed to add ata child device\n"); - } else - device_set_ivars(child, (void *)(intptr_t)i); - } - bus_generic_attach(sc->dev); - - return (0); - -detach: - atausb2_detach(dev); - return (ENXIO); -} - -static int -atausb2_detach(device_t dev) -{ - struct atausb2_softc *sc = device_get_softc(dev); - device_t *children; - int nchildren, i; - - /* teardown our statemachine */ - - usbd_transfer_unsetup(sc->xfer, ATAUSB_T_MAX); - - /* detach & delete all children, if any */ - - if (!device_get_children(dev, &children, &nchildren)) { - for (i = 0; i < nchildren; i++) { - device_delete_child(dev, children[i]); - } - free(children, M_TEMP); - } - mtx_destroy(&sc->locked_mtx); - return (0); -} - -static void -atausb2_transfer_start(struct atausb2_softc *sc, uint8_t xfer_no) -{ - if (atausbdebug) { - device_printf(sc->dev, "BBB transfer %d\n", xfer_no); - } - if (sc->xfer[xfer_no]) { - sc->last_xfer_no = xfer_no; - usbd_transfer_start(sc->xfer[xfer_no]); - } else { - atausb2_cancel_request(sc); - } -} - -static void -atausb2_t_bbb_reset1_callback(struct usb_xfer *xfer, usb_error_t error) -{ - struct atausb2_softc *sc = usbd_xfer_softc(xfer); - struct usb_device_request req; - struct usb_page_cache *pc; - - switch (USB_GET_STATE(xfer)) { - case USB_ST_TRANSFERRED: - atausb2_transfer_start(sc, ATAUSB_T_BBB_RESET2); - return; - - case USB_ST_SETUP: - req.bmRequestType = UT_WRITE_CLASS_INTERFACE; - req.bRequest = 0xff; /* bulk-only reset */ - USETW(req.wValue, 0); - req.wIndex[0] = sc->iface_no; - req.wIndex[1] = 0; - USETW(req.wLength, 0); - - pc = usbd_xfer_get_frame(xfer, 0); - usbd_copy_in(pc, 0, &req, sizeof(req)); - - usbd_xfer_set_frame_len(xfer, 0, sizeof(req)); - usbd_xfer_set_frames(xfer, 1); - usbd_transfer_submit(xfer); - return; - - default: /* Error */ - atausb2_tr_error(xfer, error); - return; - - } -} - -static void -atausb2_t_bbb_reset2_callback(struct usb_xfer *xfer, usb_error_t error) -{ - atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_RESET3, - ATAUSB_T_BBB_DATA_READ, error); -} - -static void -atausb2_t_bbb_reset3_callback(struct usb_xfer *xfer, usb_error_t error) -{ - atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_COMMAND, - ATAUSB_T_BBB_DATA_WRITE, error); -} - -static void -atausb2_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer, - uint8_t next_xfer, uint8_t stall_xfer, usb_error_t error) -{ - struct atausb2_softc *sc = usbd_xfer_softc(xfer); - - switch (USB_GET_STATE(xfer)) { - case USB_ST_TRANSFERRED: -tr_transferred: - atausb2_transfer_start(sc, next_xfer); - return; - - case USB_ST_SETUP: - if (usbd_clear_stall_callback(xfer, sc->xfer[stall_xfer])) { - goto tr_transferred; - } - return; - - default: /* Error */ - atausb2_tr_error(xfer, error); - return; - - } -} - -static void -atausb2_t_bbb_command_callback(struct usb_xfer *xfer, usb_error_t error) -{ - struct atausb2_softc *sc = usbd_xfer_softc(xfer); - struct ata_request *request = sc->ata_request; - struct ata_channel *ch; - struct usb_page_cache *pc; - uint32_t tag; - - switch (USB_GET_STATE(xfer)) { - case USB_ST_TRANSFERRED: - atausb2_transfer_start - (sc, ((request->flags & ATA_R_READ) ? ATAUSB_T_BBB_DATA_READ : - (request->flags & ATA_R_WRITE) ? ATAUSB_T_BBB_DATA_WRITE : - ATAUSB_T_BBB_STATUS)); - return; - - case USB_ST_SETUP: - - sc->status_try = 0; - - if (request) { - ch = device_get_softc(request->parent); - - sc->timeout = (request->timeout * 1000) + 5000; - - tag = UGETDW(sc->cbw.tag) + 1; - - USETDW(sc->cbw.signature, CBWSIGNATURE); - USETDW(sc->cbw.tag, tag); - USETDW(sc->cbw.transfer_length, request->bytecount); - sc->cbw.flags = (request->flags & ATA_R_READ) ? CBWFLAGS_IN : CBWFLAGS_OUT; - sc->cbw.lun = ch->unit; - sc->cbw.length = 16; - bzero(sc->cbw.cdb, 16); - bcopy(request->u.atapi.ccb, sc->cbw.cdb, 12); /* XXX SOS */ - - pc = usbd_xfer_get_frame(xfer, 0); - usbd_copy_in(pc, 0, &sc->cbw, sizeof(sc->cbw)); - - usbd_xfer_set_frame_len(xfer, 0, sizeof(sc->cbw)); - usbd_transfer_submit(xfer); - } - return; - - default: /* Error */ - atausb2_tr_error(xfer, error); - return; - - } -} - -static void -atausb2_t_bbb_data_read_callback(struct usb_xfer *xfer, usb_error_t error) -{ - struct atausb2_softc *sc = usbd_xfer_softc(xfer); - uint32_t max_bulk = usbd_xfer_max_len(xfer); - struct usb_page_cache *pc; - int actlen, sumlen; - - usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL); - - switch (USB_GET_STATE(xfer)) { - case USB_ST_TRANSFERRED: - - pc = usbd_xfer_get_frame(xfer, 0); - usbd_copy_out(pc, 0, sc->ata_data, actlen); - - sc->ata_bytecount -= actlen; - sc->ata_data += actlen; - sc->ata_donecount += actlen; - - if (actlen < sumlen) { - /* short transfer */ - sc->ata_bytecount = 0; - } - case USB_ST_SETUP: - - if (atausbdebug > 1) { - device_printf(sc->dev, "%s: max_bulk=%d, ata_bytecount=%d\n", - __FUNCTION__, max_bulk, sc->ata_bytecount); - } - if (sc->ata_bytecount == 0) { - atausb2_transfer_start(sc, ATAUSB_T_BBB_STATUS); - return; - } - if (max_bulk > sc->ata_bytecount) { - max_bulk = sc->ata_bytecount; - } - usbd_xfer_set_timeout(xfer, sc->timeout); - usbd_xfer_set_frame_len(xfer, 0, max_bulk); - - usbd_transfer_submit(xfer); - return; - - default: /* Error */ - if (error == USB_ERR_CANCELLED) { - atausb2_tr_error(xfer, error); - } else { - atausb2_transfer_start(sc, ATAUSB_T_BBB_DATA_RD_CS); - } - return; - - } -} - -static void -atausb2_t_bbb_data_rd_cs_callback(struct usb_xfer *xfer, usb_error_t error) -{ - atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_STATUS, - ATAUSB_T_BBB_DATA_READ, error); -} - -static void -atausb2_t_bbb_data_write_callback(struct usb_xfer *xfer, usb_error_t error) -{ - struct atausb2_softc *sc = usbd_xfer_softc(xfer); - struct usb_page_cache *pc; - uint32_t max_bulk = usbd_xfer_max_len(xfer); - int actlen; - - usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); - - switch (USB_GET_STATE(xfer)) { - case USB_ST_TRANSFERRED: - - sc->ata_bytecount -= actlen; - sc->ata_data += actlen; - sc->ata_donecount += actlen; - - case USB_ST_SETUP: - - if (atausbdebug > 1) { - device_printf(sc->dev, "%s: max_bulk=%d, ata_bytecount=%d\n", - __FUNCTION__, max_bulk, sc->ata_bytecount); - } - if (sc->ata_bytecount == 0) { - atausb2_transfer_start(sc, ATAUSB_T_BBB_STATUS); - return; - } - if (max_bulk > sc->ata_bytecount) { - max_bulk = sc->ata_bytecount; - } - - pc = usbd_xfer_get_frame(xfer, 0); - usbd_copy_in(pc, 0, sc->ata_data, max_bulk); - usbd_xfer_set_frame_len(xfer, 0, max_bulk); - usbd_xfer_set_timeout(xfer, sc->timeout); - - usbd_transfer_submit(xfer); - return; - - default: /* Error */ - if (error == USB_ERR_CANCELLED) { - atausb2_tr_error(xfer, error); - } else { - atausb2_transfer_start(sc, ATAUSB_T_BBB_DATA_WR_CS); - } - return; - - } -} - -static void -atausb2_t_bbb_data_wr_cs_callback(struct usb_xfer *xfer, usb_error_t error) -{ - atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_STATUS, - ATAUSB_T_BBB_DATA_WRITE, error); -} - -static void -atausb2_t_bbb_status_callback(struct usb_xfer *xfer, usb_error_t error) -{ - struct atausb2_softc *sc = usbd_xfer_softc(xfer); - struct ata_request *request = sc->ata_request; - struct usb_page_cache *pc; - uint32_t residue; - int actlen; - - usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); - - switch (USB_GET_STATE(xfer)) { - case USB_ST_TRANSFERRED: - - if (actlen < sizeof(sc->csw)) { - bzero(&sc->csw, sizeof(sc->csw)); - } - pc = usbd_xfer_get_frame(xfer, 0); - usbd_copy_out(pc, 0, &sc->csw, actlen); - - if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { - request->donecount = sc->ata_donecount; - } - residue = UGETDW(sc->csw.residue); - - if (!residue) { - residue = (request->bytecount - request->donecount); - } - if (residue > request->bytecount) { - if (atausbdebug) { - device_printf(sc->dev, "truncating residue from %d " - "to %d bytes\n", residue, - request->bytecount); - } - residue = request->bytecount; - } - /* check CSW and handle eventual error */ - if (UGETDW(sc->csw.signature) != CSWSIGNATURE) { - if (atausbdebug) { - device_printf(sc->dev, "bad CSW signature 0x%08x != 0x%08x\n", - UGETDW(sc->csw.signature), CSWSIGNATURE); - } - goto tr_error; - } else if (UGETDW(sc->csw.tag) != UGETDW(sc->cbw.tag)) { - if (atausbdebug) { - device_printf(sc->dev, "bad CSW tag %d != %d\n", - UGETDW(sc->csw.tag), UGETDW(sc->cbw.tag)); - } - goto tr_error; - } else if (sc->csw.status > CSWSTATUS_PHASE) { - if (atausbdebug) { - device_printf(sc->dev, "bad CSW status %d > %d\n", - sc->csw.status, CSWSTATUS_PHASE); - } - goto tr_error; - } else if (sc->csw.status == CSWSTATUS_PHASE) { - if (atausbdebug) { - device_printf(sc->dev, "phase error residue = %d\n", residue); - } - goto tr_error; - } else if (request->donecount > request->bytecount) { - if (atausbdebug) { - device_printf(sc->dev, "buffer overrun %d > %d\n", - request->donecount, request->bytecount); - } - goto tr_error; - } else if (sc->csw.status == CSWSTATUS_FAILED) { - if (atausbdebug) { - device_printf(sc->dev, "CSWSTATUS_FAILED\n"); - } - request->error = ATA_E_ATAPI_SENSE_MASK; - } - sc->last_xfer_no = ATAUSB_T_BBB_COMMAND; - - sc->ata_request = NULL; - - /* drop the USB transfer lock while doing the ATA interrupt */ - mtx_unlock(&sc->locked_mtx); - - ata_interrupt(device_get_softc(request->parent)); - - mtx_lock(&sc->locked_mtx); - return; - - case USB_ST_SETUP: - usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); - usbd_transfer_submit(xfer); - return; - - default: -tr_error: - if (error == USB_ERR_CANCELLED || sc->status_try) { - atausb2_tr_error(xfer, error); - } else { - sc->status_try = 1; - atausb2_transfer_start(sc, ATAUSB_T_BBB_DATA_RD_CS); - } - return; - - } -} - -static void -atausb2_cancel_request(struct atausb2_softc *sc) -{ - struct ata_request *request; - - mtx_assert(&sc->locked_mtx, MA_OWNED); - - request = sc->ata_request; - sc->ata_request = NULL; - sc->last_xfer_no = ATAUSB_T_BBB_RESET1; - - if (request) { - request->error = ATA_E_ATAPI_SENSE_MASK; - - mtx_unlock(&sc->locked_mtx); - - ata_interrupt(device_get_softc(request->parent)); - - mtx_lock(&sc->locked_mtx); - } -} - -static void -atausb2_tr_error(struct usb_xfer *xfer, usb_error_t error) -{ - struct atausb2_softc *sc = usbd_xfer_softc(xfer); - - if (error != USB_ERR_CANCELLED) { - - if (atausbdebug) { - device_printf(sc->dev, "transfer failed, %s, in state %d " - "-> BULK reset\n", usbd_errstr(error), - sc->last_xfer_no); - } - } - atausb2_cancel_request(sc); -} - -/* - * ATA backend part - */ -struct atapi_inquiry { - uint8_t device_type; - uint8_t device_modifier; - uint8_t version; - uint8_t response_format; - uint8_t length; - uint8_t reserved[2]; - uint8_t flags; - uint8_t vendor[8]; - uint8_t product[16]; - uint8_t revision[4]; - /* uint8_t crap[60]; */ -} __packed; - -static int -ata_usbchannel_begin_transaction(struct ata_request *request) -{ - struct atausb2_softc *sc = - device_get_softc(device_get_parent(request->parent)); - int error; - - if (atausbdebug > 1) { - device_printf(request->dev, "begin_transaction %s\n", - ata_cmd2str(request)); - } - mtx_lock(&sc->locked_mtx); - - /* sanity, just in case */ - if (sc->ata_request) { - device_printf(request->dev, "begin is busy, " - "state = %d\n", sc->last_xfer_no); - request->result = EBUSY; - error = ATA_OP_FINISHED; - goto done; - } - /* - * XXX SOS convert the request into the format used, only BBB for - * now - */ - - /* ATA/ATAPI IDENTIFY needs special treatment */ - if (!(request->flags & ATA_R_ATAPI)) { - if (request->u.ata.command != ATA_ATAPI_IDENTIFY) { - device_printf(request->dev, "%s unsupported\n", - ata_cmd2str(request)); - request->result = EIO; - error = ATA_OP_FINISHED; - goto done; - } - request->flags |= ATA_R_ATAPI; - bzero(request->u.atapi.ccb, 16); - request->u.atapi.ccb[0] = ATAPI_INQUIRY; - request->u.atapi.ccb[4] = 255; /* sizeof(struct - * atapi_inquiry); */ - request->data += 256; /* arbitrary offset into ata_param */ - request->bytecount = 255; /* sizeof(struct - * atapi_inquiry); */ - } - if (sc->xfer[sc->last_xfer_no]) { - - sc->ata_request = request; - sc->ata_bytecount = request->bytecount; - sc->ata_data = request->data; - sc->ata_donecount = 0; - - usbd_transfer_start(sc->xfer[sc->last_xfer_no]); - error = ATA_OP_CONTINUES; - } else { - request->result = EIO; - error = ATA_OP_FINISHED; - } - -done: - mtx_unlock(&sc->locked_mtx); - return (error); -} - -static int -ata_usbchannel_end_transaction(struct ata_request *request) -{ - if (atausbdebug > 1) { - device_printf(request->dev, "end_transaction %s\n", - ata_cmd2str(request)); - } - /* - * XXX SOS convert the request from the format used, only BBB for - * now - */ - - /* ATA/ATAPI IDENTIFY needs special treatment */ - if ((request->flags & ATA_R_ATAPI) && - (request->u.atapi.ccb[0] == ATAPI_INQUIRY)) { - struct ata_device *atadev = device_get_softc(request->dev); - struct atapi_inquiry *inquiry = (struct atapi_inquiry *)request->data; - uint16_t *ptr; - - /* convert inquiry data into simple ata_param like format */ - atadev->param.config = ATA_PROTO_ATAPI | ATA_PROTO_ATAPI_12; - atadev->param.config |= (inquiry->device_type & 0x1f) << 8; - bzero(atadev->param.model, sizeof(atadev->param.model)); - strncpy(atadev->param.model, inquiry->vendor, 8); - strcpy(atadev->param.model, " "); - strncpy(atadev->param.model, inquiry->product, 16); - ptr = (uint16_t *)(atadev->param.model + sizeof(atadev->param.model)); - while (--ptr >= (uint16_t *)atadev->param.model) { - *ptr = ntohs(*ptr); - } - strncpy(atadev->param.revision, inquiry->revision, 4); - ptr = (uint16_t *)(atadev->param.revision + sizeof(atadev->param.revision)); - while (--ptr >= (uint16_t *)atadev->param.revision) { - *ptr = ntohs(*ptr); - } - request->result = 0; - } - return (ATA_OP_FINISHED); -} - -static int -ata_usbchannel_probe(device_t dev) -{ - char buffer[32]; - - snprintf(buffer, sizeof(buffer), "USB lun %d", - (int)(intptr_t)device_get_ivars(dev)); - device_set_desc_copy(dev, buffer); - - return (0); -} - -static int -ata_usbchannel_attach(device_t dev) -{ - struct ata_channel *ch = device_get_softc(dev); - - if (ch->attached) - return (0); - ch->attached = 1; - - /* initialize the softc basics */ - ch->dev = dev; - ch->unit = (intptr_t)device_get_ivars(dev); - ch->state = ATA_IDLE; - ch->hw.begin_transaction = ata_usbchannel_begin_transaction; - ch->hw.end_transaction = ata_usbchannel_end_transaction; - ch->hw.status = NULL; - ch->hw.command = NULL; - bzero(&ch->state_mtx, sizeof(struct mtx)); - mtx_init(&ch->state_mtx, "ATA state lock", NULL, MTX_DEF); - bzero(&ch->queue_mtx, sizeof(struct mtx)); - mtx_init(&ch->queue_mtx, "ATA queue lock", NULL, MTX_DEF); - TAILQ_INIT(&ch->ata_queue); - - /* XXX SOS reset the controller HW, the channel and device(s) */ - /* ATA_RESET(dev); */ - - /* probe and attach device on this channel */ - ch->devices = ATA_ATAPI_MASTER; - if (!ata_delayed_attach) { - ata_identify(dev); - } - return (0); -} - -static int -ata_usbchannel_detach(device_t dev) -{ - struct ata_channel *ch = device_get_softc(dev); - device_t *children; - int nchildren, i; - - if (!ch->attached) - return (0); - ch->attached = 0; - - /* detach & delete all children */ - if (!device_get_children(dev, &children, &nchildren)) { - for (i = 0; i < nchildren; i++) - if (children[i]) - device_delete_child(dev, children[i]); - free(children, M_TEMP); - } - mtx_destroy(&ch->state_mtx); - mtx_destroy(&ch->queue_mtx); - return (0); -} - -static void -ata_usbchannel_setmode(device_t parent, device_t dev) -{ - struct atausb2_softc *sc = device_get_softc(GRANDPARENT(dev)); - struct ata_device *atadev = device_get_softc(dev); - - if (sc->usb2_speed == USB_SPEED_HIGH) - atadev->mode = ATA_USB2; - else - atadev->mode = ATA_USB1; -} - -static int -ata_usbchannel_locking(device_t dev, int flags) -{ - struct atausb2_softc *sc = device_get_softc(device_get_parent(dev)); - struct ata_channel *ch = device_get_softc(dev); - int res = -1; - - mtx_lock(&sc->locked_mtx); - switch (flags) { - case ATA_LF_LOCK: - if (sc->locked_ch == NULL) - sc->locked_ch = ch; - if (sc->locked_ch != ch) - sc->restart_ch = ch; - break; - - case ATA_LF_UNLOCK: - if (sc->locked_ch == ch) { - sc->locked_ch = NULL; - if (sc->restart_ch) { - ch = sc->restart_ch; - sc->restart_ch = NULL; - mtx_unlock(&sc->locked_mtx); - ata_start(ch->dev); - return (res); - } - } - break; - - case ATA_LF_WHICH: - break; - } - if (sc->locked_ch) { - res = sc->locked_ch->unit; - } - mtx_unlock(&sc->locked_mtx); - return (res); -} - -static device_method_t ata_usbchannel_methods[] = { - /* device interface */ - DEVMETHOD(device_probe, ata_usbchannel_probe), - DEVMETHOD(device_attach, ata_usbchannel_attach), - DEVMETHOD(device_detach, ata_usbchannel_detach), - - /* ATA methods */ - DEVMETHOD(ata_setmode, ata_usbchannel_setmode), - DEVMETHOD(ata_locking, ata_usbchannel_locking), - /* DEVMETHOD(ata_reset, ata_usbchannel_reset), */ - - {0, 0} -}; - -static driver_t ata_usbchannel_driver = { - "ata", - ata_usbchannel_methods, - sizeof(struct ata_channel), -}; - -DRIVER_MODULE(ata, atausb, ata_usbchannel_driver, ata_devclass, 0, 0); -MODULE_DEPEND(atausb, ata, 1, 1, 1); diff --git a/sys/dev/ata/ata_if.m b/sys/dev/ata/ata_if.m index 8fcc3f267592..4b9fea37d3f1 100644 --- a/sys/dev/ata/ata_if.m +++ b/sys/dev/ata/ata_if.m @@ -57,17 +57,31 @@ HEADER { }; CODE { - static void ata_null_setmode(device_t parent, device_t dev) + static int ata_null_setmode(device_t dev, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); - atadev->mode = ata_limit_mode(dev, atadev->mode, ATA_PIO_MAX); + if (mode > ATA_PIO_MAX) + return (ATA_PIO_MAX); + return (mode); } }; -METHOD void setmode { - device_t channel; +METHOD int setmode { device_t dev; -} DEFAULT ata_null_setmode;; + int target; + int mode; +} DEFAULT ata_null_setmode; + +CODE { + static int ata_null_getrev(device_t dev, int target) + { + return (0); + } +}; + +METHOD int getrev { + device_t dev; + int target; +} DEFAULT ata_null_getrev; METHOD void reset { device_t channel; diff --git a/sys/dev/ata/atapi-cam.c b/sys/dev/ata/atapi-cam.c index cf90c49f7c33..e5b002a89ac8 100644 --- a/sys/dev/ata/atapi-cam.c +++ b/sys/dev/ata/atapi-cam.c @@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -109,7 +108,6 @@ static int atapi_cam_event_handler(module_t mod, int what, void *arg); /* internal functions */ static void reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason); static void setup_async_cb(struct atapi_xpt_softc *, uint32_t); -static void cam_rescan_callback(struct cam_periph *, union ccb *); static void cam_rescan(struct cam_sim *); static void free_hcb_and_ccb_done(struct atapi_hcb *, u_int32_t); static struct atapi_hcb *allocate_hcb(struct atapi_xpt_softc *, int, int, union ccb *); @@ -203,7 +201,7 @@ atapi_cam_attach(device_t dev) scp->parent = device_get_parent(dev); scp->ata_ch = device_get_softc(scp->parent); TAILQ_INIT(&scp->pending_hcbs); - unit = device_get_unit(dev); + unit = device_get_unit(device_get_parent(dev)); if ((devq = cam_simq_alloc(16)) == NULL) { error = ENOMEM; @@ -315,6 +313,7 @@ reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason) { switch (reason) { case BOOT_ATTACH: + case ATTACH: break; case RESET: xpt_async(AC_BUS_RESET, scp->path, NULL); @@ -322,8 +321,6 @@ reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason) { if (!dev_changed) break; - /*FALLTHROUGH*/ - case ATTACH: cam_rescan(scp->sim); break; } @@ -414,6 +411,12 @@ atapi_action(struct cam_sim *sim, union ccb *ccb) case ATA_UDMA6: cpi->base_transfer_speed = 133000; break; + case ATA_SA150: + cpi->base_transfer_speed = 150000; + break; + case ATA_SA300: + cpi->base_transfer_speed = 300000; + break; default: break; } @@ -629,7 +632,7 @@ atapi_action(struct cam_sim *sim, union ccb *ccb) request->data = buf; request->bytecount = len; request->transfersize = min(request->bytecount, 65534); - request->timeout = ccb_h->timeout / 1000; /* XXX lost granularity */ + request->timeout = (ccb_h->timeout + 999) / 1000; request->callback = &atapi_cb; request->flags = request_flags; @@ -679,8 +682,12 @@ action_invalid: static void atapi_poll(struct cam_sim *sim) { - /* do nothing - we do not actually service any interrupts */ - printf("atapi_poll called!\n"); + struct atapi_xpt_softc *softc = + (struct atapi_xpt_softc*)cam_sim_softc(sim); + + mtx_unlock(&softc->state_lock); + ata_interrupt(softc->ata_ch); + mtx_lock(&softc->state_lock); } static void @@ -732,7 +739,7 @@ atapi_cb(struct ata_request *request) request->data = (caddr_t)&csio->sense_data; request->bytecount = sizeof(struct atapi_sense); request->transfersize = min(request->bytecount, 65534); - request->timeout = csio->ccb_h.timeout / 1000; + request->timeout = (csio->ccb_h.timeout + 999) / 1000; request->retries = 2; request->flags = ATA_R_QUIET|ATA_R_ATAPI|ATA_R_IMMEDIATE; hcb->flags |= AUTOSENSE; @@ -815,42 +822,21 @@ atapi_async(void *callback_arg, u_int32_t code, } } -static void -cam_rescan_callback(struct cam_periph *periph, union ccb *ccb) -{ - if (ccb->ccb_h.status != CAM_REQ_CMP) { - CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, - ("Rescan failed, 0x%04x\n", ccb->ccb_h.status)); - } else { - CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, - ("Rescan succeeded\n")); - } - xpt_free_path(ccb->ccb_h.path); - xpt_free_ccb(ccb); -} - static void cam_rescan(struct cam_sim *sim) { - struct cam_path *path; union ccb *ccb; ccb = xpt_alloc_ccb_nowait(); if (ccb == NULL) return; - - if (xpt_create_path(&path, xpt_periph, cam_sim_path(sim), + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(sim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { xpt_free_ccb(ccb); return; } - - CAM_DEBUG(path, CAM_DEBUG_TRACE, ("Rescanning ATAPI bus.\n")); - xpt_setup_ccb(&ccb->ccb_h, path, 5/*priority (low)*/); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = cam_rescan_callback; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); + CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("Rescanning ATAPI bus.\n")); + xpt_rescan(ccb); /* scan is in progress now */ } diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c index aee837480a86..7e470ea26f67 100644 --- a/sys/dev/ata/atapi-cd.c +++ b/sys/dev/ata/atapi-cd.c @@ -126,7 +126,7 @@ acd_attach(device_t dev) } cdp->block_size = 2048; device_set_ivars(dev, cdp); - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); ata_controlcmd(dev, ATA_DEVICE_RESET, 0, 0, 0); acd_get_cap(dev); g_post_event(acd_geom_attach, dev, M_WAITOK, NULL); @@ -163,7 +163,7 @@ acd_reinit(device_t dev) if (!(ch->devices & (ATA_ATAPI_MASTER << atadev->unit))) return 1; - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); return 0; } @@ -700,7 +700,7 @@ acd_geom_access(struct g_provider *pp, int dr, int dw, int de) request->dev = dev; bcopy(ccb, request->u.atapi.ccb, 16); request->flags = ATA_R_ATAPI; - request->timeout = 5; + request->timeout = ATA_REQUEST_TIMEOUT; ata_queue_request(request); if (!request->error && (request->u.atapi.sense.key == 2 || @@ -863,9 +863,7 @@ acd_strategy(struct bio *bp) } request->dev = dev; request->bio = bp; - bcopy(ccb, request->u.atapi.ccb, - (atadev->param.config & ATA_PROTO_MASK) == - ATA_PROTO_ATAPI_12 ? 16 : 12); + bcopy(ccb, request->u.atapi.ccb, 16); request->data = bp->bio_data; request->bytecount = count * blocksize; request->transfersize = min(request->bytecount, 65534); @@ -1208,6 +1206,7 @@ acd_read_track_info(device_t dev, int32_t lba, struct acd_track_info *info) if ((error = ata_atapicmd(dev, ccb, (caddr_t)info, sizeof(*info), ATA_R_READ, 30))) return error; + info->data_length = ntohs(info->data_length); info->track_start_addr = ntohl(info->track_start_addr); info->next_writeable_addr = ntohl(info->next_writeable_addr); info->free_blocks = ntohl(info->free_blocks); @@ -1646,12 +1645,17 @@ acd_get_cap(device_t dev) for (count = 0 ; count < 5 ; count++) { if (!ata_atapicmd(dev, ccb, (caddr_t)&cdp->cap, sizeof(cdp->cap), ATA_R_READ | ATA_R_QUIET, 5)) { + cdp->cap.data_length = ntohs(cdp->cap.data_length); + cdp->cap.blk_desc_len = ntohs(cdp->cap.blk_desc_len); + cdp->cap.media = ntohs(cdp->cap.media); + cdp->cap.capabilities = ntohs(cdp->cap.capabilities); cdp->cap.max_read_speed = ntohs(cdp->cap.max_read_speed); + cdp->cap.max_vol_levels = ntohs(cdp->cap.max_vol_levels); + cdp->cap.buf_size = ntohs(cdp->cap.buf_size); cdp->cap.cur_read_speed = ntohs(cdp->cap.cur_read_speed); cdp->cap.max_write_speed = ntohs(cdp->cap.max_write_speed); cdp->cap.cur_write_speed = max(ntohs(cdp->cap.cur_write_speed),177); - cdp->cap.max_vol_levels = ntohs(cdp->cap.max_vol_levels); - cdp->cap.buf_size = ntohs(cdp->cap.buf_size); + cdp->cap.copy_protect_rev = ntohs(cdp->cap.copy_protect_rev); } } } @@ -1726,7 +1730,8 @@ acd_describe(device_t dev) printf("%s %dKB buffer", comma ? "," : "", cdp->cap.buf_size); comma = 1; } - printf("%s %s\n", comma ? "," : "", ata_mode2str(atadev->mode)); + printf("%s %s %s\n", comma ? "," : "", ata_mode2str(atadev->mode), + ata_satarev2str(ATA_GETREV(device_get_parent(dev), atadev->unit))); device_printf(dev, "Reads:"); comma = 0; @@ -1876,10 +1881,11 @@ acd_describe(device_t dev) "CDROM"); if (cdp->changer_info) printf("with %d CD changer ", cdp->changer_info->slots); - printf("<%.40s/%.8s> at ata%d-%s %s\n", + printf("<%.40s/%.8s> at ata%d-%s %s %s\n", atadev->param.model, atadev->param.revision, device_get_unit(ch->dev), ata_unit2str(atadev), - ata_mode2str(atadev->mode) ); + ata_mode2str(atadev->mode), + ata_satarev2str(ATA_GETREV(device_get_parent(dev), atadev->unit))); } } @@ -1907,8 +1913,7 @@ static devclass_t acd_devclass; static int acd_modevent(module_t mod, int what, void *arg) { - g_modevent(0, what, &acd_class); - return 0; + return g_modevent(0, what, &acd_class); } DRIVER_MODULE(acd, ata, acd_driver, acd_devclass, acd_modevent, NULL); diff --git a/sys/dev/ata/atapi-cd.h b/sys/dev/ata/atapi-cd.h index d78771a29aa3..74ce82e4f136 100644 --- a/sys/dev/ata/atapi-cd.h +++ b/sys/dev/ata/atapi-cd.h @@ -112,34 +112,34 @@ struct cappage { u_int8_t param_len; u_int16_t media; -#define MST_READ_CDR 0x0001 -#define MST_READ_CDRW 0x0002 -#define MST_READ_PACKET 0x0004 -#define MST_READ_DVDROM 0x0008 -#define MST_READ_DVDR 0x0010 -#define MST_READ_DVDRAM 0x0020 -#define MST_WRITE_CDR 0x0100 -#define MST_WRITE_CDRW 0x0200 -#define MST_WRITE_TEST 0x0400 -#define MST_WRITE_DVDR 0x1000 -#define MST_WRITE_DVDRAM 0x2000 +#define MST_READ_CDR 0x0100 +#define MST_READ_CDRW 0x0200 +#define MST_READ_PACKET 0x0400 +#define MST_READ_DVDROM 0x0800 +#define MST_READ_DVDR 0x1000 +#define MST_READ_DVDRAM 0x2000 +#define MST_WRITE_CDR 0x0001 +#define MST_WRITE_CDRW 0x0002 +#define MST_WRITE_TEST 0x0004 +#define MST_WRITE_DVDR 0x0010 +#define MST_WRITE_DVDRAM 0x0020 u_int16_t capabilities; -#define MST_AUDIO_PLAY 0x0001 -#define MST_COMPOSITE 0x0002 -#define MST_AUDIO_P1 0x0004 -#define MST_AUDIO_P2 0x0008 -#define MST_MODE2_f1 0x0010 -#define MST_MODE2_f2 0x0020 -#define MST_MULTISESSION 0x0040 -#define MST_BURNPROOF 0x0080 -#define MST_READ_CDDA 0x0100 -#define MST_CDDA_STREAM 0x0200 -#define MST_COMBINED_RW 0x0400 -#define MST_CORRECTED_RW 0x0800 -#define MST_SUPPORT_C2 0x1000 -#define MST_ISRC 0x2000 -#define MST_UPC 0x4000 +#define MST_AUDIO_PLAY 0x0100 +#define MST_COMPOSITE 0x0200 +#define MST_AUDIO_P1 0x0400 +#define MST_AUDIO_P2 0x0800 +#define MST_MODE2_f1 0x1000 +#define MST_MODE2_f2 0x2000 +#define MST_MULTISESSION 0x4000 +#define MST_BURNPROOF 0x8000 +#define MST_READ_CDDA 0x0001 +#define MST_CDDA_STREAM 0x0002 +#define MST_COMBINED_RW 0x0004 +#define MST_CORRECTED_RW 0x0008 +#define MST_SUPPORT_C2 0x0010 +#define MST_ISRC 0x0020 +#define MST_UPC 0x0040 u_int8_t mechanism; #define MST_LOCKABLE 0x01 diff --git a/sys/dev/ata/atapi-fd.c b/sys/dev/ata/atapi-fd.c index b8434b30433b..5572d1c27947 100644 --- a/sys/dev/ata/atapi-fd.c +++ b/sys/dev/ata/atapi-fd.c @@ -85,7 +85,7 @@ afd_attach(device_t dev) return ENOMEM; } device_set_ivars(dev, fdp); - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); if (afd_sense(dev)) { device_set_ivars(dev, NULL); @@ -152,7 +152,7 @@ afd_reinit(device_t dev) if (!(ch->devices & (ATA_ATAPI_MASTER << atadev->unit))) return 1; - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); return 0; } @@ -240,9 +240,7 @@ afd_strategy(struct bio *bp) } request->dev = dev; request->bio = bp; - bcopy(ccb, request->u.atapi.ccb, - (atadev->param.config & ATA_PROTO_MASK) == - ATA_PROTO_ATAPI_12 ? 16 : 12); + bcopy(ccb, request->u.atapi.ccb, 16); request->data = bp->bio_data; request->bytecount = count * fdp->sectorsize; request->transfersize = min(request->bytecount, 65534); @@ -402,10 +400,11 @@ afd_describe(device_t dev) else strcpy(sizestring, "(no media)"); - device_printf(dev, "%s <%.40s %.8s> at ata%d-%s %s\n", + device_printf(dev, "%s <%.40s %.8s> at ata%d-%s %s %s\n", sizestring, atadev->param.model, atadev->param.revision, device_get_unit(ch->dev), ata_unit2str(atadev), - ata_mode2str(atadev->mode)); + ata_mode2str(atadev->mode), + ata_satarev2str(ATA_GETREV(device_get_parent(dev), atadev->unit))); if (bootverbose) { device_printf(dev, "%ju sectors [%juC/%dH/%dS]\n", fdp->mediasize / fdp->sectorsize, diff --git a/sys/dev/ata/atapi-tape.c b/sys/dev/ata/atapi-tape.c index dd74461b72cb..b6ca4ad6e683 100644 --- a/sys/dev/ata/atapi-tape.c +++ b/sys/dev/ata/atapi-tape.c @@ -111,7 +111,7 @@ ast_attach(device_t dev) return ENOMEM; } device_set_ivars(dev, stp); - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); if (ast_sense(dev)) { device_set_ivars(dev, NULL); @@ -193,7 +193,7 @@ ast_reinit(device_t dev) if (!(ch->devices & (ATA_ATAPI_MASTER << atadev->unit))) return 1; - ATA_SETMODE(device_get_parent(dev), dev); + ata_setmode(dev); return 0; } @@ -373,7 +373,6 @@ static void ast_strategy(struct bio *bp) { device_t dev = bp->bio_dev->si_drv1; - struct ata_device *atadev = device_get_softc(dev); struct ast_softc *stp = device_get_ivars(dev); struct ata_request *request; u_int32_t blkcount; @@ -426,9 +425,7 @@ ast_strategy(struct bio *bp) } request->dev = dev; request->driver = bp; - bcopy(ccb, request->u.atapi.ccb, - (atadev->param.config & ATA_PROTO_MASK) == - ATA_PROTO_ATAPI_12 ? 16 : 12); + bcopy(ccb, request->u.atapi.ccb, 16); request->data = bp->bio_data; request->bytecount = blkcount * stp->blksize; request->transfersize = min(request->bytecount, 65534); @@ -676,7 +673,8 @@ ast_describe(device_t dev) printf("transfer limit %d blk%s, ", stp->cap.ctl, (stp->cap.ctl > 1) ? "s" : ""); printf("%dKB buffer, ", (stp->cap.buffer_size * DEV_BSIZE) / 1024); - printf("%s\n", ata_mode2str(atadev->mode)); + printf("%s %s\n", ata_mode2str(atadev->mode), + ata_satarev2str(ATA_GETREV(device_get_parent(dev), atadev->unit))); device_printf(dev, "Medium: "); switch (stp->cap.medium_type) { case 0x00: @@ -707,10 +705,11 @@ ast_describe(device_t dev) printf("\n"); } else { - device_printf(dev, "TAPE <%.40s/%.8s> at ata%d-%s %s\n", + device_printf(dev, "TAPE <%.40s/%.8s> at ata%d-%s %s %s\n", atadev->param.model, atadev->param.revision, device_get_unit(ch->dev), ata_unit2str(atadev), - ata_mode2str(atadev->mode)); + ata_mode2str(atadev->mode), + ata_satarev2str(ATA_GETREV(device_get_parent(dev), atadev->unit))); } } diff --git a/sys/dev/ata/chipsets/ata-acard.c b/sys/dev/ata/chipsets/ata-acard.c index c52c2cbc0883..bb81c48dc4cf 100644 --- a/sys/dev/ata/chipsets/ata-acard.c +++ b/sys/dev/ata/chipsets/ata-acard.c @@ -61,8 +61,8 @@ struct ata_serialize { static int ata_acard_chipinit(device_t dev); static int ata_acard_ch_attach(device_t dev); static int ata_acard_status(device_t dev); -static void ata_acard_850_setmode(device_t dev, int mode); -static void ata_acard_86X_setmode(device_t dev, int mode); +static int ata_acard_850_setmode(device_t dev, int target, int mode); +static int ata_acard_86X_setmode(device_t dev, int target, int mode); static int ata_serialize(device_t dev, int flags); static void ata_serialize_init(struct ata_serialize *serial); @@ -130,6 +130,7 @@ ata_acard_ch_attach(device_t dev) return ENXIO; ch->hw.status = ata_acard_status; + ch->flags |= ATA_NO_ATAPI_DMA; return 0; } @@ -162,79 +163,52 @@ ata_acard_status(device_t dev) return 1; } -static void -ata_acard_850_setmode(device_t dev, int mode) +static int +ata_acard_850_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; - - mode = ata_limit_mode(dev, mode, - ata_atapi(dev) ? ATA_PIO_MAX : ctlr->chip->max_dma); + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + mode = min(mode, ctlr->chip->max_dma); /* XXX SOS missing WDMA0+1 + PIO modes */ if (mode >= ATA_WDMA2) { - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { - u_int8_t reg54 = pci_read_config(gparent, 0x54, 1); + u_int8_t reg54 = pci_read_config(parent, 0x54, 1); reg54 &= ~(0x03 << (devno << 1)); if (mode >= ATA_UDMA0) reg54 |= (((mode & ATA_MODE_MASK) + 1) << (devno << 1)); - pci_write_config(gparent, 0x54, reg54, 1); - pci_write_config(gparent, 0x4a, 0xa6, 1); - pci_write_config(gparent, 0x40 + (devno << 1), 0x0301, 2); - atadev->mode = mode; - return; - } + pci_write_config(parent, 0x54, reg54, 1); + pci_write_config(parent, 0x4a, 0xa6, 1); + pci_write_config(parent, 0x40 + (devno << 1), 0x0301, 2); } /* we could set PIO mode timings, but we assume the BIOS did that */ + return (mode); } -static void -ata_acard_86X_setmode(device_t dev, int mode) +static int +ata_acard_86X_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; - - mode = ata_limit_mode(dev, mode, - ata_atapi(dev) ? ATA_PIO_MAX : ctlr->chip->max_dma); - - mode = ata_check_80pin(dev, mode); - - /* XXX SOS missing WDMA0+1 + PIO modes */ - if (mode >= ATA_WDMA2) { - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { - u_int16_t reg44 = pci_read_config(gparent, 0x44, 2); + mode = min(mode, ctlr->chip->max_dma); + /* XXX SOS missing WDMA0+1 + PIO modes */ + if (mode >= ATA_WDMA2) { + u_int16_t reg44 = pci_read_config(parent, 0x44, 2); - reg44 &= ~(0x000f << (devno << 2)); - if (mode >= ATA_UDMA0) - reg44 |= (((mode & ATA_MODE_MASK) + 1) << (devno << 2)); - pci_write_config(gparent, 0x44, reg44, 2); - pci_write_config(gparent, 0x4a, 0xa6, 1); - pci_write_config(gparent, 0x40 + devno, 0x31, 1); - atadev->mode = mode; - return; + reg44 &= ~(0x000f << (devno << 2)); + if (mode >= ATA_UDMA0) + reg44 |= (((mode & ATA_MODE_MASK) + 1) << (devno << 2)); + pci_write_config(parent, 0x44, reg44, 2); + pci_write_config(parent, 0x4a, 0xa6, 1); + pci_write_config(parent, 0x40 + devno, 0x31, 1); } - } - /* we could set PIO mode timings, but we assume the BIOS did that */ + /* we could set PIO mode timings, but we assume the BIOS did that */ + return (mode); } static void diff --git a/sys/dev/ata/chipsets/ata-acerlabs.c b/sys/dev/ata/chipsets/ata-acerlabs.c index cf503c591b2d..b7f11472da29 100644 --- a/sys/dev/ata/chipsets/ata-acerlabs.c +++ b/sys/dev/ata/chipsets/ata-acerlabs.c @@ -56,7 +56,7 @@ static int ata_ali_chipinit(device_t dev); static int ata_ali_ch_attach(device_t dev); static int ata_ali_sata_ch_attach(device_t dev); static void ata_ali_reset(device_t dev); -static void ata_ali_setmode(device_t dev, int mode); +static int ata_ali_setmode(device_t dev, int target, int mode); /* misc defines */ #define ALI_OLD 0x01 @@ -79,6 +79,7 @@ ata_ali_probe(device_t dev) { ATA_ALI_5288, 0x00, 4, ALI_SATA, ATA_SA300, "M5288" }, { ATA_ALI_5287, 0x00, 4, ALI_SATA, ATA_SA150, "M5287" }, { ATA_ALI_5281, 0x00, 2, ALI_SATA, ATA_SA150, "M5281" }, + { ATA_ALI_5228, 0xc5, 0, ALI_NEW, ATA_UDMA6, "M5228" }, { ATA_ALI_5229, 0xc5, 0, ALI_NEW, ATA_UDMA6, "M5229" }, { ATA_ALI_5229, 0xc4, 0, ALI_NEW, ATA_UDMA5, "M5229" }, { ATA_ALI_5229, 0xc2, 0, ALI_NEW, ATA_UDMA4, "M5229" }, @@ -113,6 +114,7 @@ ata_ali_chipinit(device_t dev) ctlr->ch_attach = ata_ali_sata_ch_attach; ctlr->ch_detach = ata_pci_ch_detach; ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; /* AHCI mode is correctly supported only on the ALi 5288. */ if ((ctlr->chip->chipid == ATA_ALI_5288) && @@ -140,11 +142,14 @@ ata_ali_chipinit(device_t dev) /* use device interrupt as byte count end */ pci_write_config(dev, 0x4a, pci_read_config(dev, 0x4a, 1) | 0x20, 1); - /* enable cable detection and UDMA support on newer chips */ - pci_write_config(dev, 0x4b, pci_read_config(dev, 0x4b, 1) | 0x09, 1); + /* enable cable detection and UDMA support on revisions < 0xc7 */ + if (ctlr->chip->chiprev < 0xc7) + pci_write_config(dev, 0x4b, pci_read_config(dev, 0x4b, 1) | + 0x09, 1); - /* enable ATAPI UDMA mode */ - pci_write_config(dev, 0x53, pci_read_config(dev, 0x53, 1) | 0x01, 1); + /* enable ATAPI UDMA mode (even if we are going to do PIO) */ + pci_write_config(dev, 0x53, pci_read_config(dev, 0x53, 1) | + (ctlr->chip->chiprev >= 0xc7 ? 0x03 : 0x01), 1); /* only chips with revision > 0xc4 can do 48bit DMA */ if (ctlr->chip->chiprev <= 0xc4) @@ -176,6 +181,8 @@ ata_ali_ch_attach(device_t dev) if (ata_pci_ch_attach(dev)) return ENXIO; + if (ctlr->chip->cfg2 & ALI_NEW && ctlr->chip->chiprev < 0xc7) + ch->flags |= ATA_CHECKS_CABLE; /* older chips can't do 48bit DMA transfers */ if (ctlr->chip->chiprev <= 0xc4) ch->flags |= ATA_NO_48BIT_DMA; @@ -202,7 +209,7 @@ ata_ali_sata_ch_attach(device_t dev) io = res->bars[0]; ctlio = res->bars[1]; } - + ata_pci_dmainit(dev); for (i = ATA_DATA; i <= ATA_COMMAND; i ++) { ch->r_io[i].res = io; ch->r_io[i].offset = i + (unit10 ? 8 : 0); @@ -218,6 +225,7 @@ ata_ali_sata_ch_attach(device_t dev) } } ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; /* XXX SOS PHY handling awkward in ALI chip not supported yet */ ata_pci_hw(dev); @@ -257,67 +265,56 @@ ata_ali_reset(device_t dev) } } -static void -ata_ali_setmode(device_t dev, int mode) +static int +ata_ali_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int piomode; + u_int32_t piotimings[] = + { 0x006d0003, 0x00580002, 0x00440001, 0x00330001, + 0x00310001, 0x006d0003, 0x00330001, 0x00310001 }; + u_int8_t udma[] = {0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0d}; + u_int32_t word54; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); + mode = min(mode, ctlr->chip->max_dma); - if (ctlr->chip->cfg2 & ALI_NEW) { - if (mode > ATA_UDMA2 && - pci_read_config(gparent, 0x4a, 1) & (1 << ch->unit)) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; + if (ctlr->chip->cfg2 & ALI_NEW && ctlr->chip->chiprev < 0xc7) { + if (mode > ATA_UDMA2 && + pci_read_config(parent, 0x4a, 1) & (1 << ch->unit)) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } } - } - else - mode = ata_check_80pin(dev, mode); - - if (ctlr->chip->cfg2 & ALI_OLD) { - /* doesn't support ATAPI DMA on write */ - ch->flags |= ATA_ATAPI_DMA_RO; - if (ch->devices & ATA_ATAPI_MASTER && ch->devices & ATA_ATAPI_SLAVE) { - /* doesn't support ATAPI DMA on two ATAPI devices */ - device_printf(dev, "two atapi devices on this channel, no DMA\n"); - mode = ata_limit_mode(dev, mode, ATA_PIO_MAX); + if (ctlr->chip->cfg2 & ALI_OLD) { + /* doesn't support ATAPI DMA on write */ + ch->flags |= ATA_ATAPI_DMA_RO; + if (ch->devices & ATA_ATAPI_MASTER && + ch->devices & ATA_ATAPI_SLAVE) { + /* doesn't support ATAPI DMA on two ATAPI devices */ + device_printf(dev, "two atapi devices on this channel," + " no DMA\n"); + mode = min(mode, ATA_PIO_MAX); + } } - } - - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { + /* Set UDMA mode */ + word54 = pci_read_config(parent, 0x54, 4); if (mode >= ATA_UDMA0) { - u_int8_t udma[] = {0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0d}; - u_int32_t word54 = pci_read_config(gparent, 0x54, 4); - word54 &= ~(0x000f000f << (devno << 2)); word54 |= (((udma[mode&ATA_MODE_MASK]<<16)|0x05)<<(devno<<2)); - pci_write_config(gparent, 0x54, word54, 4); - pci_write_config(gparent, 0x58 + (ch->unit << 2), - 0x00310001, 4); + piomode = ATA_PIO4; } else { - u_int32_t piotimings[] = - { 0x006d0003, 0x00580002, 0x00440001, 0x00330001, - 0x00310001, 0x00440001, 0x00330001, 0x00310001}; - - pci_write_config(gparent, 0x54, pci_read_config(gparent, 0x54, 4) & - ~(0x0008000f << (devno << 2)), 4); - pci_write_config(gparent, 0x58 + (ch->unit << 2), - piotimings[ata_mode2idx(mode)], 4); + word54 &= ~(0x0008000f << (devno << 2)); + piomode = mode; } - atadev->mode = mode; - } + pci_write_config(parent, 0x54, word54, 4); + /* Set PIO/WDMA mode */ + pci_write_config(parent, 0x58 + (ch->unit << 2), + piotimings[ata_mode2idx(piomode)], 4); + return (mode); } ATA_DECLARE_DRIVER(ata_ali); diff --git a/sys/dev/ata/chipsets/ata-adaptec.c b/sys/dev/ata/chipsets/ata-adaptec.c index 6b92ee4a67a5..26c11f206907 100644 --- a/sys/dev/ata/chipsets/ata-adaptec.c +++ b/sys/dev/ata/chipsets/ata-adaptec.c @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); /* misc defines */ #define MV_60XX 60 //must match ata_marvell.c's definition +#define MV_7042 72 //must match ata_marvell.c's definition /* @@ -64,6 +65,7 @@ ata_adaptec_probe(device_t dev) struct ata_pci_controller *ctlr = device_get_softc(dev); static struct ata_chip_id ids[] = {{ ATA_ADAPTEC_1420, 0, 4, MV_60XX, ATA_SA300, "1420SA" }, + { ATA_ADAPTEC_1430, 0, 4, MV_7042, ATA_SA300, "1430SA" }, { 0, 0, 0, 0, 0, 0}}; if (pci_get_vendor(dev) != ATA_ADAPTEC_ID) diff --git a/sys/dev/ata/chipsets/ata-ahci.c b/sys/dev/ata/chipsets/ata-ahci.c index 79544bb85546..6811c795c85c 100644 --- a/sys/dev/ata/chipsets/ata-ahci.c +++ b/sys/dev/ata/chipsets/ata-ahci.c @@ -52,6 +52,12 @@ __FBSDID("$FreeBSD$"); #include /* local prototypes */ +static int ata_ahci_ch_attach(device_t dev); +static int ata_ahci_ch_detach(device_t dev); +static int ata_ahci_ch_suspend(device_t dev); +static int ata_ahci_ch_resume(device_t dev); +static int ata_ahci_ctlr_reset(device_t dev); +static void ata_ahci_reset(device_t dev); static int ata_ahci_suspend(device_t dev); static int ata_ahci_status(device_t dev); static int ata_ahci_begin_transaction(struct ata_request *request); @@ -97,6 +103,49 @@ ata_ahci_probe(device_t dev) return (BUS_PROBE_GENERIC); } +static int +ata_ahci_ata_probe(device_t dev) +{ + struct ata_pci_controller *ctlr = device_get_softc(dev); + + if ((intptr_t)device_get_ivars(dev) >= 0) + return (ENXIO); + device_set_desc_copy(dev, "AHCI SATA controller"); + ctlr->chipinit = ata_ahci_chipinit; + return (BUS_PROBE_GENERIC); +} + +static int +ata_ahci_ata_attach(device_t dev) +{ + struct ata_pci_controller *ctlr = device_get_softc(dev); + device_t child; + int unit; + + /* do chipset specific setups only needed once */ + ctlr->legacy = 0; + ctlr->ichannels = -1; + ctlr->ch_attach = ata_pci_ch_attach; + ctlr->ch_detach = ata_pci_ch_detach; + ctlr->dev = dev; + if (ctlr->chipinit(dev)) + return ENXIO; + /* attach all channels on this controller */ + for (unit = 0; unit < ctlr->channels; unit++) { + if ((ctlr->ichannels & (1 << unit)) == 0) + continue; + child = device_add_child(dev, "ata", + ((unit == 0 || unit == 1) && ctlr->legacy) ? + unit : devclass_find_free_unit(ata_devclass, 2)); + if (child == NULL) + device_printf(dev, "failed to add ata child device\n"); + else + device_set_ivars(child, (void *)(intptr_t)unit); + } + bus_generic_attach(dev); + return 0; +} + int ata_ahci_chipinit(device_t dev) { @@ -129,9 +178,15 @@ ata_ahci_chipinit(device_t dev) /* get the number of HW channels */ ctlr->ichannels = ATA_INL(ctlr->r_res2, ATA_AHCI_PI); - ctlr->channels = - MAX(flsl(ctlr->ichannels), + ctlr->channels = MAX(flsl(ctlr->ichannels), (ATA_INL(ctlr->r_res2, ATA_AHCI_CAP) & ATA_AHCI_CAP_NPMASK) + 1); + if (pci_get_devid(dev) == ATA_M88SX6111) + ctlr->channels = 1; + else if (pci_get_devid(dev) == ATA_M88SX6121) + ctlr->channels = 2; + else if (pci_get_devid(dev) == ATA_M88SX6141 || + pci_get_devid(dev) == ATA_M88SX6145) + ctlr->channels = 4; ctlr->reset = ata_ahci_reset; ctlr->ch_attach = ata_ahci_ch_attach; @@ -139,6 +194,7 @@ ata_ahci_chipinit(device_t dev) ctlr->ch_suspend = ata_ahci_ch_suspend; ctlr->ch_resume = ata_ahci_ch_resume; ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; ctlr->suspend = ata_ahci_suspend; ctlr->resume = ata_ahci_ctlr_reset; @@ -183,7 +239,7 @@ ata_ahci_chipinit(device_t dev) return 0; } -int +static int ata_ahci_ctlr_reset(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); @@ -228,7 +284,7 @@ ata_ahci_suspend(device_t dev) return 0; } -int +static int ata_ahci_ch_attach(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); @@ -254,12 +310,14 @@ ata_ahci_ch_attach(device_t dev) ch->hw.softreset = ata_ahci_softreset; ch->hw.pm_read = ata_ahci_pm_read; ch->hw.pm_write = ata_ahci_pm_write; + ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; ata_ahci_ch_resume(dev); return 0; } -int +static int ata_ahci_ch_detach(device_t dev) { @@ -268,7 +326,7 @@ ata_ahci_ch_detach(device_t dev) return (0); } -int +static int ata_ahci_ch_suspend(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); @@ -293,7 +351,7 @@ ata_ahci_ch_suspend(device_t dev) return (0); } -int +static int ata_ahci_ch_resume(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); @@ -385,23 +443,22 @@ ata_ahci_status(device_t dev) static int ata_ahci_begin_transaction(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); struct ata_ahci_cmd_tab *ctp; struct ata_ahci_cmd_list *clp; int offset = ch->unit << 7; - int port = atadev->unit & 0x0f; + int port = request->unit & 0x0f; int entries = 0; int fis_size; /* get a piece of the workspace for this request */ ctp = (struct ata_ahci_cmd_tab *) - (ch->dma.work + ATA_AHCI_CT_OFFSET + (ATA_AHCI_CT_SIZE*request->tag)); + (ch->dma.work + ATA_AHCI_CT_OFFSET); /* setup the FIS for this request */ if (!(fis_size = ata_ahci_setup_fis(ctp, request))) { - device_printf(request->dev, "setting up SATA FIS failed\n"); + device_printf(request->parent, "setting up SATA FIS failed\n"); request->result = EIO; return ATA_OP_FINISHED; } @@ -409,7 +466,7 @@ ata_ahci_begin_transaction(struct ata_request *request) /* if request moves data setup and load SG list */ if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { if (ch->dma.load(request, ctp->prd_tab, &entries)) { - device_printf(request->dev, "setting up DMA failed\n"); + device_printf(request->parent, "setting up DMA failed\n"); request->result = EIO; return ATA_OP_FINISHED; } @@ -417,7 +474,7 @@ ata_ahci_begin_transaction(struct ata_request *request) /* setup the command list entry */ clp = (struct ata_ahci_cmd_list *) - (ch->dma.work + ATA_AHCI_CL_OFFSET + (ATA_AHCI_CL_SIZE*request->tag)); + (ch->dma.work + ATA_AHCI_CL_OFFSET); clp->prd_length = entries; clp->cmd_flags = (request->flags & ATA_R_WRITE ? ATA_AHCI_CMD_WRITE : 0) | @@ -426,12 +483,7 @@ ata_ahci_begin_transaction(struct ata_request *request) (fis_size / sizeof(u_int32_t)) | (port << 12); clp->bytecount = 0; - clp->cmd_table_phys = htole64(ch->dma.work_bus + ATA_AHCI_CT_OFFSET + - (ATA_AHCI_CT_SIZE * request->tag)); - - /* clear eventual ACTIVE bit */ - ATA_IDX_OUTL(ch, ATA_SACTIVE, - ATA_IDX_INL(ch, ATA_SACTIVE) & (1 << request->tag)); + clp->cmd_table_phys = htole64(ch->dma.work_bus + ATA_AHCI_CT_OFFSET); /* set command type bit */ if (request->flags & ATA_R_ATAPI) @@ -444,7 +496,7 @@ ata_ahci_begin_transaction(struct ata_request *request) ~ATA_AHCI_P_CMD_ATAPI); /* issue command to controller */ - ATA_OUTL(ctlr->r_res2, ATA_AHCI_P_CI + offset, (1 << request->tag)); + ATA_OUTL(ctlr->r_res2, ATA_AHCI_P_CI + offset, 1); if (!(request->flags & ATA_R_ATAPI)) { /* device reset doesn't interrupt */ @@ -476,7 +528,7 @@ ata_ahci_begin_transaction(struct ata_request *request) static int ata_ahci_end_transaction(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); struct ata_ahci_cmd_list *clp; u_int32_t tf_data; @@ -495,13 +547,12 @@ ata_ahci_end_transaction(struct ata_request *request) /* on control commands read back registers to the request struct */ if (request->flags & ATA_R_CONTROL) { - struct ata_device *atadev = device_get_softc(request->dev); u_int8_t *fis = ch->dma.work + ATA_AHCI_FB_OFFSET + 0x40; request->u.ata.count = fis[12] | ((u_int16_t)fis[13] << 8); request->u.ata.lba = fis[4] | ((u_int64_t)fis[5] << 8) | ((u_int64_t)fis[6] << 16); - if (atadev->flags & ATA_D_48BIT_ACTIVE) + if (request->flags & ATA_R_48BIT) request->u.ata.lba |= ((u_int64_t)fis[8] << 24) | ((u_int64_t)fis[9] << 32) | ((u_int64_t)fis[10] << 40); @@ -511,7 +562,7 @@ ata_ahci_end_transaction(struct ata_request *request) /* record how much data we actually moved */ clp = (struct ata_ahci_cmd_list *) - (ch->dma.work + ATA_AHCI_CL_OFFSET + (ATA_AHCI_CL_SIZE*request->tag)); + (ch->dma.work + ATA_AHCI_CL_OFFSET); request->donecount = clp->bytecount; /* release SG list etc */ @@ -605,9 +656,9 @@ ata_ahci_pm_write(device_t dev, int port, int reg, u_int32_t value) ctp->cfis[3] = reg; ctp->cfis[7] = port | ATA_D_LBA; ctp->cfis[12] = value & 0xff; - ctp->cfis[4] = (value >> 8) & 0xff;; - ctp->cfis[5] = (value >> 16) & 0xff;; - ctp->cfis[6] = (value >> 24) & 0xff;; + ctp->cfis[4] = (value >> 8) & 0xff; + ctp->cfis[5] = (value >> 16) & 0xff; + ctp->cfis[6] = (value >> 24) & 0xff; ctp->cfis[15] = ATA_A_4BIT; if (ata_ahci_issue_cmd(dev, 0, 100)) { @@ -776,11 +827,10 @@ ata_ahci_hardreset(device_t dev, int port, uint32_t *signature) static u_int32_t ata_ahci_softreset(device_t dev, int port) { - struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); struct ata_channel *ch = device_get_softc(dev); - int offset = ch->unit << 7; struct ata_ahci_cmd_tab *ctp = (struct ata_ahci_cmd_tab *)(ch->dma.work + ATA_AHCI_CT_OFFSET); + u_int8_t *fis = ch->dma.work + ATA_AHCI_FB_OFFSET + 0x40; if (bootverbose) device_printf(dev, "software reset port %d...\n", port); @@ -817,10 +867,13 @@ ata_ahci_softreset(device_t dev, int port) return (-1); } - return ATA_INL(ctlr->r_res2, ATA_AHCI_P_SIG + offset); + return (((u_int32_t)fis[6] << 24) | + ((u_int32_t)fis[5] << 16) | + ((u_int32_t)fis[4] << 8) | + (u_int32_t)fis[12]); } -void +static void ata_ahci_reset(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); @@ -852,9 +905,12 @@ ata_ahci_reset(device_t dev) ((ch->pm_level == 0) ? ATA_AHCI_P_IX_PRC | ATA_AHCI_P_IX_PC : 0) | ATA_AHCI_P_IX_DP | ATA_AHCI_P_IX_UF | ATA_AHCI_P_IX_SDB | ATA_AHCI_P_IX_DS | ATA_AHCI_P_IX_PS | ATA_AHCI_P_IX_DHR)); - - /* only probe for PortMultiplier if HW has support */ - if (ATA_INL(ctlr->r_res2, ATA_AHCI_CAP) & ATA_AHCI_CAP_SPM) { + /* + * Only probe for PortMultiplier if HW has support. + * Ignore Marvell, which is not working, + */ + if ((ATA_INL(ctlr->r_res2, ATA_AHCI_CAP) & ATA_AHCI_CAP_SPM) && + pci_get_vendor(ctlr->dev) != 0x11ab) { signature = ata_ahci_softreset(dev, ATA_PM); /* Workaround for some ATI chips, failing to soft-reset * when port multiplicator supported, but absent. @@ -931,3 +987,26 @@ ata_ahci_setup_fis(struct ata_ahci_cmd_tab *ctp, struct ata_request *request) } ATA_DECLARE_DRIVER(ata_ahci); +static device_method_t ata_ahci_ata_methods[] = { + DEVMETHOD(device_probe, ata_ahci_ata_probe), + DEVMETHOD(device_attach, ata_ahci_ata_attach), + DEVMETHOD(device_detach, ata_pci_detach), + DEVMETHOD(device_suspend, ata_pci_suspend), + DEVMETHOD(device_resume, ata_pci_resume), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(bus_read_ivar, ata_pci_read_ivar), + DEVMETHOD(bus_write_ivar, ata_pci_write_ivar), + DEVMETHOD(bus_alloc_resource, ata_pci_alloc_resource), + DEVMETHOD(bus_release_resource, ata_pci_release_resource), + DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), + DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_setup_intr, ata_pci_setup_intr), + DEVMETHOD(bus_teardown_intr, ata_pci_teardown_intr), + { 0, 0 } +}; +static driver_t ata_ahci_ata_driver = { + "atapci", + ata_ahci_ata_methods, + sizeof(struct ata_pci_controller) +}; +DRIVER_MODULE(ata_ahci_ata, atapci, ata_ahci_ata_driver, ata_pci_devclass, 0, 0); diff --git a/sys/dev/ata/chipsets/ata-amd.c b/sys/dev/ata/chipsets/ata-amd.c index 9c14e99cba4c..589ffa0e8cb8 100644 --- a/sys/dev/ata/chipsets/ata-amd.c +++ b/sys/dev/ata/chipsets/ata-amd.c @@ -52,16 +52,16 @@ __FBSDID("$FreeBSD$"); #include /* local prototypes */ +static int ata_amd_ch_attach(device_t dev); static int ata_amd_chipinit(device_t dev); -static void ata_amd_setmode(device_t dev, int mode); +static int ata_amd_setmode(device_t dev, int target, int mode); /* misc defines */ #define AMD_BUG 0x01 #define AMD_CABLE 0x02 - /* - * American Micro Devices (AMD) chipset support functions + * Advanced Micro Devices (AMD) chipset support functions */ static int ata_amd_probe(device_t dev) @@ -100,50 +100,57 @@ ata_amd_chipinit(device_t dev) else pci_write_config(dev, 0x41, pci_read_config(dev, 0x41, 1) | 0xf0, 1); + ctlr->ch_attach = ata_amd_ch_attach; ctlr->setmode = ata_amd_setmode; return 0; } -static void -ata_amd_setmode(device_t dev, int mode) +static int +ata_amd_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - u_int8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; - int modes[7] = { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }; - int devno = (ch->unit << 1) + atadev->unit; - int reg = 0x53 - devno; - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int piomode; + u_int8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0xa8, 0x22, 0x20 }; + int modes[7] = { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }; + int reg = 0x53 - devno; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - - if (ctlr->chip->cfg1 & AMD_CABLE) { - if (mode > ATA_UDMA2 && - !(pci_read_config(gparent, 0x42, 1) & (1 << devno))) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; + mode = min(mode, ctlr->chip->max_dma); + if (ctlr->chip->cfg1 & AMD_CABLE) { + if (mode > ATA_UDMA2 && + !(pci_read_config(parent, 0x42, 1) & (1 << devno))) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } } - } - else - mode = ata_check_80pin(dev, mode); + /* Set UDMA timings. */ + if (mode >= ATA_UDMA0) { + pci_write_config(parent, reg, modes[mode & ATA_MODE_MASK], 1); + piomode = ATA_PIO4; + } else { + pci_write_config(parent, reg, 0x8b, 1); + piomode = mode; + } + /* Set WDMA/PIO timings. */ + pci_write_config(parent, reg - 0x08, timings[ata_mode2idx(piomode)], 1); + return (mode); +} +static int +ata_amd_ch_attach(device_t dev) +{ + struct ata_pci_controller *ctlr; + struct ata_channel *ch; + int error; - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", ata_mode2str(mode), - ctlr->chip->text); - if (!error) { - pci_write_config(gparent, reg - 0x08, timings[ata_mode2idx(mode)], 1); - if (mode >= ATA_UDMA0) - pci_write_config(gparent, reg, modes[mode & ATA_MODE_MASK], 1); - else - pci_write_config(gparent, reg, 0x8b, 1); - atadev->mode = mode; - } + ctlr = device_get_softc(device_get_parent(dev)); + ch = device_get_softc(dev); + error = ata_pci_ch_attach(dev); + if (ctlr->chip->cfg1 & AMD_CABLE) + ch->flags |= ATA_CHECKS_CABLE; + return (error); } ATA_DECLARE_DRIVER(ata_amd); diff --git a/sys/dev/ata/chipsets/ata-ati.c b/sys/dev/ata/chipsets/ata-ati.c index 1dffa918fde2..1dfd84b81f48 100644 --- a/sys/dev/ata/chipsets/ata-ati.c +++ b/sys/dev/ata/chipsets/ata-ati.c @@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -54,10 +53,8 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_ati_chipinit(device_t dev); -static void ata_ati_setmode(device_t dev, int mode); -static void ata_ati_ahci_enable(device_t dev); -static int ata_ati_ahci_chipinit(device_t dev); -static int ata_ati_ahci_resume(device_t dev); +static int ata_ati_ixp700_ch_attach(device_t dev); +static int ata_ati_setmode(device_t dev, int target, int mode); /* misc defines */ #define ATI_PATA 0x01 @@ -66,13 +63,6 @@ static int ata_ati_ahci_resume(device_t dev); #define SII_MEMIO 1 #define SII_BUG 0x04 -/* Misc Control Register */ -#define ATI_PCI_MISC_CTRL 0x40 -#define ATI_PCI_MISCCTRL_ENABLE_WR 0x00000001 - -/* Watchdog Control/Status Register */ -#define ATI_PCI_WD_CTRL 0x44 -#define ATI_PCI_WDCTRL_ENABLE 0x0001 /* * ATI chipset support functions @@ -121,19 +111,7 @@ ata_ati_probe(device_t dev) ctlr->chipinit = ata_sii_chipinit; break; case ATI_AHCI: - /* - * Force AHCI mode if IDE mode is set from BIOS. - */ - if ((ctlr->chip->chipid == ATA_ATI_IXP600_S1 || - ctlr->chip->chipid == ATA_ATI_IXP700_S1) && - pci_get_subclass(dev) == PCIS_STORAGE_IDE) { - struct pci_devinfo *dinfo = device_get_ivars(dev); - pcicfgregs *cfg = &dinfo->cfg; - cfg->subclass = PCIS_STORAGE_SATA; - cfg->progif = PCIP_STORAGE_SATA_AHCI_1_0; - ata_ati_ahci_enable(dev); - } - ctlr->chipinit = ata_ati_ahci_chipinit; + ctlr->chipinit = ata_ahci_chipinit; break; } return (BUS_PROBE_DEFAULT); @@ -143,117 +121,121 @@ static int ata_ati_chipinit(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); + device_t smbdev; + uint8_t satacfg; if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; - /* IXP600 only has 1 PATA channel */ - if (ctlr->chip->chipid == ATA_ATI_IXP600) + switch (ctlr->chip->chipid) { + case ATA_ATI_IXP600: + /* IXP600 only has 1 PATA channel */ ctlr->channels = 1; + break; + case ATA_ATI_IXP700: + /* + * When "combined mode" is enabled, an additional PATA channel is + * emulated with two SATA ports and appears on this device. + * This mode can only be detected via SMB controller. + */ + smbdev = pci_find_device(ATA_ATI_ID, 0x4385); + if (smbdev != NULL) { + satacfg = pci_read_config(smbdev, 0xad, 1); + if (bootverbose) + device_printf(dev, "SATA controller %s (%s%s channel)\n", + (satacfg & 0x01) == 0 ? "disabled" : "enabled", + (satacfg & 0x08) == 0 ? "" : "combined mode, ", + (satacfg & 0x10) == 0 ? "primary" : "secondary"); + ctlr->chipset_data = (void *)(uintptr_t)satacfg; + /* + * If SATA controller is enabled but combined mode is disabled, + * we have only one PATA channel. Ignore a non-existent channel. + */ + if ((satacfg & 0x09) == 0x01) + ctlr->ichannels &= ~(1 << ((satacfg & 0x10) >> 4)); + else { + ctlr->ch_attach = ata_ati_ixp700_ch_attach; + } + } + break; + } ctlr->setmode = ata_ati_setmode; return 0; } -static void -ata_ati_setmode(device_t dev, int mode) +static int +ata_ati_ixp700_ch_attach(device_t dev) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int offset = (devno ^ 0x01) << 3; - int error; - u_int8_t piotimings[] = { 0x5d, 0x47, 0x34, 0x22, 0x20, 0x34, 0x22, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; - u_int8_t dmatimings[] = { 0x77, 0x21, 0x20 }; + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + struct ata_channel *ch = device_get_softc(dev); + uint8_t satacfg = (uint8_t)(uintptr_t)ctlr->chipset_data; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); + /* Setup the usual register normal pci style. */ + if (ata_pci_ch_attach(dev)) + return ENXIO; - mode = ata_check_80pin(dev, mode); + /* One of channels is PATA, another is SATA. */ + if (ch->unit == ((satacfg & 0x10) >> 4)) + ch->flags |= ATA_SATA; + return (0); +} - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); +static int +ata_ati_setmode(device_t dev, int target, int mode) +{ + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int offset = (devno ^ 0x01) << 3; + int piomode; + u_int8_t piotimings[] = { 0x5d, 0x47, 0x34, 0x22, 0x20 }; + u_int8_t dmatimings[] = { 0x77, 0x21, 0x20 }; - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { + mode = min(mode, ctlr->chip->max_dma); if (mode >= ATA_UDMA0) { - pci_write_config(gparent, 0x56, - (pci_read_config(gparent, 0x56, 2) & + /* Set UDMA mode, enable UDMA, set WDMA2/PIO4 */ + pci_write_config(parent, 0x56, + (pci_read_config(parent, 0x56, 2) & ~(0xf << (devno << 2))) | ((mode & ATA_MODE_MASK) << (devno << 2)), 2); - pci_write_config(gparent, 0x54, - pci_read_config(gparent, 0x54, 1) | + pci_write_config(parent, 0x54, + pci_read_config(parent, 0x54, 1) | (0x01 << devno), 1); - pci_write_config(gparent, 0x44, - (pci_read_config(gparent, 0x44, 4) & + pci_write_config(parent, 0x44, + (pci_read_config(parent, 0x44, 4) & ~(0xff << offset)) | (dmatimings[2] << offset), 4); - } - else if (mode >= ATA_WDMA0) { - pci_write_config(gparent, 0x54, - pci_read_config(gparent, 0x54, 1) & + piomode = ATA_PIO4; + } else if (mode >= ATA_WDMA0) { + /* Disable UDMA, set WDMA mode and timings, calculate PIO. */ + pci_write_config(parent, 0x54, + pci_read_config(parent, 0x54, 1) & ~(0x01 << devno), 1); - pci_write_config(gparent, 0x44, - (pci_read_config(gparent, 0x44, 4) & + pci_write_config(parent, 0x44, + (pci_read_config(parent, 0x44, 4) & ~(0xff << offset)) | (dmatimings[mode & ATA_MODE_MASK] << offset), 4); - } - else - pci_write_config(gparent, 0x54, - pci_read_config(gparent, 0x54, 1) & + piomode = (mode == ATA_WDMA0) ? ATA_PIO0 : + (mode == ATA_WDMA1) ? ATA_PIO3 : ATA_PIO4; + } else { + /* Disable UDMA, set requested PIO. */ + pci_write_config(parent, 0x54, + pci_read_config(parent, 0x54, 1) & ~(0x01 << devno), 1); - - pci_write_config(gparent, 0x4a, - (pci_read_config(gparent, 0x4a, 2) & + piomode = mode; + } + /* Set PIO mode and timings, calculated above. */ + pci_write_config(parent, 0x4a, + (pci_read_config(parent, 0x4a, 2) & ~(0xf << (devno << 2))) | - (((mode - ATA_PIO0) & ATA_MODE_MASK) << (devno<<2)),2); - pci_write_config(gparent, 0x40, - (pci_read_config(gparent, 0x40, 4) & + ((piomode - ATA_PIO0) << (devno<<2)),2); + pci_write_config(parent, 0x40, + (pci_read_config(parent, 0x40, 4) & ~(0xff << offset)) | - (piotimings[ata_mode2idx(mode)] << offset), 4); - atadev->mode = mode; - } -} - -static void -ata_ati_ahci_enable(device_t dev) -{ - struct pci_devinfo *dinfo = device_get_ivars(dev); - pcicfgregs *cfg = &dinfo->cfg; - uint32_t ctrl; - - ctrl = pci_read_config(dev, ATI_PCI_MISC_CTRL, 4); - pci_write_config(dev, ATI_PCI_MISC_CTRL, - ctrl | ATI_PCI_MISCCTRL_ENABLE_WR, 4); - pci_write_config(dev, PCIR_SUBCLASS, cfg->subclass, 1); - pci_write_config(dev, PCIR_PROGIF, cfg->progif, 1); - pci_write_config(dev, ATI_PCI_WD_CTRL, - pci_read_config(dev, ATI_PCI_WD_CTRL, 2) | ATI_PCI_WDCTRL_ENABLE, 2); - pci_write_config(dev, ATI_PCI_MISC_CTRL, - ctrl & ~ATI_PCI_MISCCTRL_ENABLE_WR, 4); -} - -static int -ata_ati_ahci_chipinit(device_t dev) -{ - struct ata_pci_controller *ctlr = device_get_softc(dev); - int error; - - error = ata_ahci_chipinit(dev); - ctlr->resume = ata_ati_ahci_resume; - return (error); -} - -static int -ata_ati_ahci_resume(device_t dev) -{ - - ata_ati_ahci_enable(dev); - return (ata_ahci_ctlr_reset(dev)); + (piotimings[ata_mode2idx(piomode)] << offset), 4); + return (mode); } ATA_DECLARE_DRIVER(ata_ati); diff --git a/sys/dev/ata/chipsets/ata-cenatek.c b/sys/dev/ata/chipsets/ata-cenatek.c index 8f6474cc57ab..cc54d2bbc20a 100644 --- a/sys/dev/ata/chipsets/ata-cenatek.c +++ b/sys/dev/ata/chipsets/ata-cenatek.c @@ -51,11 +51,6 @@ __FBSDID("$FreeBSD$"); #include #include -/* local prototypes */ -static int ata_cenatek_chipinit(device_t dev); -static void ata_cenatek_setmode(device_t dev, int mode); - - /* * Cenatek chipset support functions */ @@ -67,32 +62,9 @@ ata_cenatek_probe(device_t dev) if (pci_get_devid(dev) != ATA_CENATEK_ROCKET) return ENXIO; - ctlr->chipinit = ata_cenatek_chipinit; + ctlr->chipinit = ata_generic_chipinit; device_set_desc(dev, "Cenatek Rocket Drive controller"); return (BUS_PROBE_DEFAULT); } -static int -ata_cenatek_chipinit(device_t dev) -{ - struct ata_pci_controller *ctlr = device_get_softc(dev); - - if (ata_setup_interrupt(dev, ata_generic_intr)) - return ENXIO; - - ctlr->setmode = ata_cenatek_setmode; - return 0; -} - -static void -ata_cenatek_setmode(device_t dev, int mode) -{ - struct ata_device *atadev = device_get_softc(dev); - - mode = ata_limit_mode(dev, mode, ATA_UDMA2); - mode = ata_check_80pin(dev, mode); - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; -} - ATA_DECLARE_DRIVER(ata_cenatek); diff --git a/sys/dev/ata/chipsets/ata-cypress.c b/sys/dev/ata/chipsets/ata-cypress.c index ffa9782fa8b6..e4c1a93d0347 100644 --- a/sys/dev/ata/chipsets/ata-cypress.c +++ b/sys/dev/ata/chipsets/ata-cypress.c @@ -53,7 +53,7 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_cypress_chipinit(device_t dev); -static void ata_cypress_setmode(device_t dev, int mode); +static int ata_cypress_setmode(device_t dev, int target, int mode); /* @@ -93,29 +93,20 @@ ata_cypress_chipinit(device_t dev) return 0; } -static void -ata_cypress_setmode(device_t dev, int mode) +static int +ata_cypress_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int error; + device_t parent = device_get_parent(dev); + struct ata_channel *ch = device_get_softc(dev); - mode = ata_limit_mode(dev, mode, ATA_WDMA2); + mode = min(mode, ATA_WDMA2); - /* XXX SOS missing WDMA0+1 + PIO modes */ - if (mode == ATA_WDMA2) { - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - if (bootverbose) - device_printf(dev, "%ssetting WDMA2 on Cypress chip\n", - error ? "FAILURE " : ""); - if (!error) { - pci_write_config(gparent, ch->unit ? 0x4e : 0x4c, 0x2020, 2); - atadev->mode = mode; - return; + /* XXX SOS missing WDMA0+1 + PIO modes */ + if (mode == ATA_WDMA2) { + pci_write_config(parent, ch->unit ? 0x4e : 0x4c, 0x2020, 2); } - } - /* we could set PIO mode timings, but we assume the BIOS did that */ + /* we could set PIO mode timings, but we assume the BIOS did that */ + return (mode); } ATA_DECLARE_DRIVER(ata_cypress); diff --git a/sys/dev/ata/chipsets/ata-cyrix.c b/sys/dev/ata/chipsets/ata-cyrix.c index ddfa56245b7b..5a008562147d 100644 --- a/sys/dev/ata/chipsets/ata-cyrix.c +++ b/sys/dev/ata/chipsets/ata-cyrix.c @@ -53,7 +53,8 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_cyrix_chipinit(device_t dev); -static void ata_cyrix_setmode(device_t dev, int mode); +static int ata_cyrix_ch_attach(device_t dev); +static int ata_cyrix_setmode(device_t dev, int target, int mode); /* @@ -79,53 +80,57 @@ ata_cyrix_chipinit(device_t dev) if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; - + ctlr->ch_attach = ata_cyrix_ch_attach; ctlr->setmode = ata_cyrix_setmode; return 0; } -static void -ata_cyrix_setmode(device_t dev, int mode) +static int +ata_cyrix_ch_attach(device_t dev) { - struct ata_pci_controller *ctlr = device_get_softc(GRANDPARENT(dev)); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - u_int32_t piotiming[] = - { 0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010 }; - u_int32_t dmatiming[] = { 0x00077771, 0x00012121, 0x00002020 }; - u_int32_t udmatiming[] = { 0x00921250, 0x00911140, 0x00911030 }; - int error; + struct ata_channel *ch = device_get_softc(dev); + int error; + + error = ata_pci_ch_attach(dev); + ch->dma.alignment = 16; + ch->dma.max_iosize = 64 * DEV_BSIZE; + return (error); +} - mode = ata_limit_mode(dev, mode, ATA_UDMA2); - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); +static int +ata_cyrix_setmode(device_t dev, int target, int mode) +{ + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int piomode; + u_int32_t piotiming[] = + { 0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010 }; + u_int32_t dmatiming[] = { 0x00077771, 0x00012121, 0x00002020 }; + u_int32_t udmatiming[] = { 0x00921250, 0x00911140, 0x00911030 }; - if (bootverbose) - device_printf(dev, "%ssetting %s on Cyrix chip\n", - (error) ? "FAILURE " : "", ata_mode2str(mode)); - - if (!error) { + mode = min(mode, ATA_UDMA2); /* dont try to set the mode if we dont have the resource */ if (ctlr->r_res1) { - ch->dma.alignment = 16; - ch->dma.max_iosize = 64 * DEV_BSIZE; - - if (mode >= ATA_UDMA0) { + if (mode >= ATA_UDMA0) { + /* Set UDMA timings, and PIO4. */ + ATA_OUTL(ch->r_io[ATA_BMCMD_PORT].res, + 0x24 + (devno << 3), udmatiming[mode & ATA_MODE_MASK]); + piomode = ATA_PIO4; + } else if (mode >= ATA_WDMA0) { + /* Set WDMA timings, and respective PIO mode. */ + ATA_OUTL(ch->r_io[ATA_BMCMD_PORT].res, + 0x24 + (devno << 3), dmatiming[mode & ATA_MODE_MASK]); + piomode = (mode == ATA_WDMA0) ? ATA_PIO0 : + (mode == ATA_WDMA1) ? ATA_PIO3 : ATA_PIO4; + } else + piomode = mode; + /* Set PIO mode calculated above. */ ATA_OUTL(ch->r_io[ATA_BMCMD_PORT].res, - 0x24 + (devno << 3), udmatiming[mode & ATA_MODE_MASK]); - } - else if (mode >= ATA_WDMA0) { - ATA_OUTL(ch->r_io[ATA_BMCMD_PORT].res, - 0x24 + (devno << 3), dmatiming[mode & ATA_MODE_MASK]); - } - else { - ATA_OUTL(ch->r_io[ATA_BMCMD_PORT].res, - 0x20 + (devno << 3), piotiming[mode & ATA_MODE_MASK]); - } + 0x20 + (devno << 3), piotiming[ata_mode2idx(piomode)]); } - atadev->mode = mode; - } + return (mode); } ATA_DECLARE_DRIVER(ata_cyrix); diff --git a/sys/dev/ata/chipsets/ata-highpoint.c b/sys/dev/ata/chipsets/ata-highpoint.c index 101b054f483d..511366a78e1b 100644 --- a/sys/dev/ata/chipsets/ata-highpoint.c +++ b/sys/dev/ata/chipsets/ata-highpoint.c @@ -54,7 +54,7 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_highpoint_chipinit(device_t dev); static int ata_highpoint_ch_attach(device_t dev); -static void ata_highpoint_setmode(device_t dev, int mode); +static int ata_highpoint_setmode(device_t dev, int target, int mode); static int ata_highpoint_check_80pin(device_t dev, int mode); /* misc defines */ @@ -143,26 +143,27 @@ ata_highpoint_chipinit(device_t dev) static int ata_highpoint_ch_attach(device_t dev) { - struct ata_channel *ch = device_get_softc(dev); + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + struct ata_channel *ch = device_get_softc(dev); - /* setup the usual register normal pci style */ - if (ata_pci_ch_attach(dev)) - return ENXIO; - - ch->flags |= ATA_ALWAYS_DMASTAT; - return 0; + /* setup the usual register normal pci style */ + if (ata_pci_ch_attach(dev)) + return (ENXIO); + ch->flags |= ATA_ALWAYS_DMASTAT; + ch->flags |= ATA_CHECKS_CABLE; + if (ctlr->chip->cfg1 == HPT_366) + ch->flags |= ATA_NO_ATAPI_DMA; + return (0); } -static void -ata_highpoint_setmode(device_t dev, int mode) +static int +ata_highpoint_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; - u_int32_t timings33[][4] = { + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + u_int32_t timings33[][4] = { /* HPT366 HPT370 HPT372 HPT374 mode */ { 0x40d0a7aa, 0x06914e57, 0x0d029d5e, 0x0ac1f48a }, /* PIO 0 */ { 0x40d0a7a3, 0x06914e43, 0x0d029d26, 0x0ac1f465 }, /* PIO 1 */ @@ -179,51 +180,41 @@ ata_highpoint_setmode(device_t dev, int mode) { 0x10c9a731, 0x16454e31, 0x1c8a9c62, 0x12ac8242 }, /* UDMA 4 */ { 0, 0x16454e31, 0x1c8a9c62, 0x12848242 }, /* UDMA 5 */ { 0, 0, 0x1c869c62, 0x12808242 } /* UDMA 6 */ - }; + }; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - - if (ctlr->chip->cfg1 == HPT_366 && ata_atapi(dev)) - mode = ata_limit_mode(dev, mode, ATA_PIO_MAX); - - mode = ata_highpoint_check_80pin(dev, mode); - - /* - * most if not all HPT chips cant really handle that the device is - * running at ATA_UDMA6/ATA133 speed, so we cheat at set the device to - * a max of ATA_UDMA5/ATA100 to guard against suboptimal performance - */ - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, - ata_limit_mode(dev, mode, ATA_UDMA5)); - if (bootverbose) - device_printf(dev, "%ssetting %s on HighPoint chip\n", - (error) ? "FAILURE " : "", ata_mode2str(mode)); - if (!error) - pci_write_config(gparent, 0x40 + (devno << 2), + mode = min(mode, ctlr->chip->max_dma); + mode = ata_highpoint_check_80pin(dev, mode); + /* + * most if not all HPT chips cant really handle that the device is + * running at ATA_UDMA6/ATA133 speed, so we cheat at set the device to + * a max of ATA_UDMA5/ATA100 to guard against suboptimal performance + */ + mode = min(mode, ATA_UDMA5); + pci_write_config(parent, 0x40 + (devno << 2), timings33[ata_mode2idx(mode)][ctlr->chip->cfg1], 4); - atadev->mode = mode; + return (mode); } static int ata_highpoint_check_80pin(device_t dev, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); u_int8_t reg, val, res; - if (ctlr->chip->cfg1 == HPT_374 && pci_get_function(gparent) == 1) { + if (ctlr->chip->cfg1 == HPT_374 && pci_get_function(parent) == 1) { reg = ch->unit ? 0x57 : 0x53; - val = pci_read_config(gparent, reg, 1); - pci_write_config(gparent, reg, val | 0x80, 1); + val = pci_read_config(parent, reg, 1); + pci_write_config(parent, reg, val | 0x80, 1); } else { reg = 0x5b; - val = pci_read_config(gparent, reg, 1); - pci_write_config(gparent, reg, val & 0xfe, 1); + val = pci_read_config(parent, reg, 1); + pci_write_config(parent, reg, val & 0xfe, 1); } - res = pci_read_config(gparent, 0x5a, 1) & (ch->unit ? 0x1:0x2); - pci_write_config(gparent, reg, val, 1); + res = pci_read_config(parent, 0x5a, 1) & (ch->unit ? 0x1:0x2); + pci_write_config(parent, reg, val, 1); if (mode > ATA_UDMA2 && res) { ata_print_cable(dev, "controller"); diff --git a/sys/dev/ata/chipsets/ata-intel.c b/sys/dev/ata/chipsets/ata-intel.c index c8ed0c05c0ba..4c15013951ef 100644 --- a/sys/dev/ata/chipsets/ata-intel.c +++ b/sys/dev/ata/chipsets/ata-intel.c @@ -55,9 +55,10 @@ __FBSDID("$FreeBSD$"); static int ata_intel_chipinit(device_t dev); static int ata_intel_ch_attach(device_t dev); static void ata_intel_reset(device_t dev); -static void ata_intel_old_setmode(device_t dev, int mode); -static void ata_intel_new_setmode(device_t dev, int mode); -static void ata_intel_sata_setmode(device_t dev, int mode); +static int ata_intel_old_setmode(device_t dev, int target, int mode); +static int ata_intel_new_setmode(device_t dev, int target, int mode); +static int ata_intel_sch_setmode(device_t dev, int target, int mode); +static int ata_intel_sata_getrev(device_t dev, int target); static int ata_intel_31244_ch_attach(device_t dev); static int ata_intel_31244_ch_detach(device_t dev); static int ata_intel_31244_status(device_t dev); @@ -135,7 +136,28 @@ ata_intel_probe(device_t dev) { ATA_I82801JD_AH, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" }, { ATA_I82801JD_R1, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" }, { ATA_I82801JD_S2, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" }, + { ATA_I82801JI_S1, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" }, + { ATA_I82801JI_AH, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" }, + { ATA_I82801JI_R1, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" }, + { ATA_I82801JI_S2, 0, INTEL_AHCI, 0, ATA_SA300, "ICH10" }, + { 0x3a208086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a218086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a228086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a238086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a248086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a258086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a268086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a278086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a288086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a298086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a2a8086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a2b8086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a2c8086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a2d8086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a2e8086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, + { 0x3a2f8086, 0, INTEL_AHCI, 0, ATA_SA300, "PCH" }, { ATA_I31244, 0, 0, 2, ATA_SA150, "31244" }, + { ATA_ISCH, 0, 0, 1, ATA_UDMA5, "SCH" }, { 0, 0, 0, 0, 0, 0}}; if (pci_get_vendor(dev) != ATA_INTEL_ID) @@ -177,8 +199,15 @@ ata_intel_chipinit(device_t dev) ctlr->reset = ata_intel_31244_reset; } ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; + } + /* SCH */ + else if (ctlr->chip->chipid == ATA_ISCH) { + ctlr->channels = 1; + ctlr->ch_attach = ata_intel_ch_attach; + ctlr->ch_detach = ata_pci_ch_detach; + ctlr->setmode = ata_intel_sch_setmode; } - /* non SATA intel chips goes here */ else if (ctlr->chip->max_dma < ATA_SA150) { ctlr->channels = ctlr->chip->cfg2; @@ -210,9 +239,8 @@ ata_intel_chipinit(device_t dev) ctlr->r_rid2 = PCIR_BAR(5); if ((ctlr->r_res2 = bus_alloc_resource_any(dev, ctlr->r_type2, &ctlr->r_rid2, RF_ACTIVE))) - ctlr->setmode = ata_intel_sata_setmode; - else - ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_intel_sata_getrev; + ctlr->setmode = ata_sata_setmode; } return 0; } @@ -236,6 +264,13 @@ ata_intel_ch_attach(device_t dev) } ch->flags |= ATA_ALWAYS_DMASTAT; + if (ctlr->chip->max_dma >= ATA_SA150) { + if (ctlr->chip->cfg1 == 0 && + (pci_read_config(device_get_parent(dev), 0x90, 1) & 0x04) == 0) + ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; + } else if (ctlr->chip->chipid != ATA_ISCH) + ch->flags |= ATA_CHECKS_CABLE; return 0; } @@ -255,11 +290,8 @@ ata_intel_reset(device_t dev) /* ICH5 in compat mode has SATA ports as master/slave on 1 channel */ if (pci_read_config(parent, 0x90, 1) & 0x04) mask = 0x0003; - else { + else mask = (0x0001 << ch->unit); - /* XXX SOS should be in intel_ch_attach if we grow it */ - ch->flags |= ATA_NO_SLAVE; - } } pci_write_config(parent, 0x92, pci_read_config(parent, 0x92, 2) & ~mask, 2); DELAY(10); @@ -275,80 +307,70 @@ ata_intel_reset(device_t dev) ata_generic_reset(dev); } -static void -ata_intel_old_setmode(device_t dev, int mode) +static int +ata_intel_old_setmode(device_t dev, int target, int mode) { - /* NOT YET */ + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + + mode = min(mode, ctlr->chip->max_dma); + return (mode); } -static void -ata_intel_new_setmode(device_t dev, int mode) +static int +ata_intel_new_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - u_int32_t reg40 = pci_read_config(gparent, 0x40, 4); - u_int8_t reg44 = pci_read_config(gparent, 0x44, 1); - u_int8_t reg48 = pci_read_config(gparent, 0x48, 1); - u_int16_t reg4a = pci_read_config(gparent, 0x4a, 2); - u_int16_t reg54 = pci_read_config(gparent, 0x54, 2); - u_int32_t mask40 = 0, new40 = 0; - u_int8_t mask44 = 0, new44 = 0; - int error; - u_int8_t timings[] = { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23, - 0x23, 0x23, 0x23, 0x23, 0x23, 0x23 }; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int piomode; + u_int32_t reg40 = pci_read_config(parent, 0x40, 4); + u_int8_t reg44 = pci_read_config(parent, 0x44, 1); + u_int8_t reg48 = pci_read_config(parent, 0x48, 1); + u_int16_t reg4a = pci_read_config(parent, 0x4a, 2); + u_int16_t reg54 = pci_read_config(parent, 0x54, 2); + u_int32_t mask40 = 0, new40 = 0; + u_int8_t mask44 = 0, new44 = 0; + u_int8_t timings[] = { 0x00, 0x00, 0x10, 0x21, 0x23, 0x00, 0x21, 0x23 }; + u_int8_t utimings[] = { 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02 }; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - - if ( mode > ATA_UDMA2 && !(reg54 & (0x10 << devno))) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; - } - - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { - if (mode >= ATA_UDMA0) { - u_int8_t utimings[] = { 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10 }; - - pci_write_config(gparent, 0x48, reg48 | (0x0001 << devno), 2); - pci_write_config(gparent, 0x4a, - (reg4a & ~(0x3 << (devno << 2))) | - (utimings[mode & ATA_MODE_MASK] << (devno<<2)), 2); + mode = min(mode, ctlr->chip->max_dma); + if (mode > ATA_UDMA2 && !(reg54 & (0x10 << devno))) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; } - else { - pci_write_config(gparent, 0x48, reg48 & ~(0x0001 << devno), 2); - pci_write_config(gparent, 0x4a, (reg4a & ~(0x3 << (devno << 2))),2); + /* Enable/disable UDMA and set timings. */ + if (mode >= ATA_UDMA0) { + pci_write_config(parent, 0x48, reg48 | (0x0001 << devno), 2); + pci_write_config(parent, 0x4a, + (reg4a & ~(0x3 << (devno << 2))) | + (utimings[mode & ATA_MODE_MASK] << (devno<<2)), 2); + piomode = ATA_PIO4; + } else { + pci_write_config(parent, 0x48, reg48 & ~(0x0001 << devno), 2); + pci_write_config(parent, 0x4a, (reg4a & ~(0x3 << (devno << 2))),2); + piomode = mode; } reg54 |= 0x0400; - if (mode >= ATA_UDMA2) - reg54 |= (0x1 << devno); - else - reg54 &= ~(0x1 << devno); + /* Set UDMA reference clock (33/66/133MHz). */ + reg54 &= ~(0x1001 << devno); if (mode >= ATA_UDMA5) reg54 |= (0x1000 << devno); - else - reg54 &= ~(0x1000 << devno); - - pci_write_config(gparent, 0x54, reg54, 2); - + else if (mode >= ATA_UDMA3) + reg54 |= (0x1 << devno); + pci_write_config(parent, 0x54, reg54, 2); + /* Allow PIO/WDMA timing controls. */ reg40 &= ~0x00ff00ff; reg40 |= 0x40774077; - - if (atadev->unit == ATA_MASTER) { + /* Set PIO/WDMA timings. */ + if (target == 0) { mask40 = 0x3300; - new40 = timings[ata_mode2idx(mode)] << 8; - } - else { + new40 = timings[ata_mode2idx(piomode)] << 8; + } else { mask44 = 0x0f; - new44 = ((timings[ata_mode2idx(mode)] & 0x30) >> 2) | - (timings[ata_mode2idx(mode)] & 0x03); + new44 = ((timings[ata_mode2idx(piomode)] & 0x30) >> 2) | + (timings[ata_mode2idx(piomode)] & 0x03); } if (ch->unit) { mask40 <<= 16; @@ -356,43 +378,50 @@ ata_intel_new_setmode(device_t dev, int mode) mask44 <<= 4; new44 <<= 4; } - pci_write_config(gparent, 0x40, (reg40 & ~mask40) | new40, 4); - pci_write_config(gparent, 0x44, (reg44 & ~mask44) | new44, 1); - - atadev->mode = mode; - } + pci_write_config(parent, 0x40, (reg40 & ~mask40) | new40, 4); + pci_write_config(parent, 0x44, (reg44 & ~mask44) | new44, 1); + return (mode); } -static void -ata_intel_sata_setmode(device_t dev, int mode) +static int +ata_intel_sch_setmode(device_t dev, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + u_int8_t dtim = 0x80 + (target << 2); + u_int32_t tim = pci_read_config(parent, dtim, 4); + int piomode; - if (atadev->param.satacapabilities != 0x0000 && - atadev->param.satacapabilities != 0xffff) { + mode = min(mode, ctlr->chip->max_dma); + if (mode >= ATA_UDMA0) { + tim |= (0x1 << 31); + tim &= ~(0x7 << 16); + tim |= ((mode & ATA_MODE_MASK) << 16); + piomode = ATA_PIO4; + } else if (mode >= ATA_WDMA0) { + tim &= ~(0x1 << 31); + tim &= ~(0x3 << 8); + tim |= ((mode & ATA_MODE_MASK) << 8); + piomode = (mode == ATA_WDMA0) ? ATA_PIO0 : + (mode == ATA_WDMA1) ? ATA_PIO3 : ATA_PIO4; + } else + piomode = mode; + tim &= ~(0x7); + tim |= (piomode & 0x7); + pci_write_config(parent, dtim, tim, 4); + return (mode); +} - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - int devno = (ch->unit << 1) + atadev->unit; - - /* on some drives we need to set the transfer mode */ - ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, - ata_limit_mode(dev, mode, ATA_UDMA6)); +static int +ata_intel_sata_getrev(device_t dev, int target) +{ + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; /* set ATA_SSTATUS register offset */ ATA_IDX_OUTL(ch, ATA_IDX_ADDR, devno * 0x100); - /* query SATA STATUS for the speed */ - if ((ATA_IDX_INL(ch, ATA_IDX_DATA) & ATA_SS_CONWELL_MASK) == - ATA_SS_CONWELL_GEN2) - atadev->mode = ATA_SA300; - else - atadev->mode = ATA_SA150; - } - else { - mode = ata_limit_mode(dev, mode, ATA_UDMA5); - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; - } + return ((ATA_IDX_INL(ch, ATA_IDX_DATA) & 0x0f0) >> 4); } static int @@ -435,6 +464,7 @@ ata_intel_31244_ch_attach(device_t dev) ch->r_io[ATA_BMDTP_PORT].offset = ch_offset + 0x74; ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; ata_pci_hw(dev); ch->hw.status = ata_intel_31244_status; ch->hw.tf_write = ata_intel_31244_tf_write; @@ -466,10 +496,12 @@ ata_intel_31244_status(device_t dev) static void ata_intel_31244_tf_write(struct ata_request *request) { - struct ata_channel *ch = device_get_softc(device_get_parent(request->dev)); + struct ata_channel *ch = device_get_softc(request->parent); +#ifndef ATA_CAM struct ata_device *atadev = device_get_softc(request->dev); +#endif - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { ATA_IDX_OUTW(ch, ATA_FEATURE, request->u.ata.feature); ATA_IDX_OUTW(ch, ATA_COUNT, request->u.ata.count); ATA_IDX_OUTW(ch, ATA_SECTOR, ((request->u.ata.lba >> 16) & 0xff00) | @@ -478,11 +510,12 @@ ata_intel_31244_tf_write(struct ata_request *request) ((request->u.ata.lba >> 8) & 0x00ff)); ATA_IDX_OUTW(ch, ATA_CYL_MSB, ((request->u.ata.lba >> 32) & 0xff00) | ((request->u.ata.lba >> 16) & 0x00ff)); - ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(atadev->unit)); + ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(request->unit)); } else { ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); ATA_IDX_OUTB(ch, ATA_COUNT, request->u.ata.count); +#ifndef ATA_CAM if (atadev->flags & ATA_D_USE_CHS) { int heads, sectors; @@ -499,18 +532,21 @@ ata_intel_31244_tf_write(struct ata_request *request) (request->u.ata.lba / (sectors * heads))); ATA_IDX_OUTB(ch, ATA_CYL_MSB, (request->u.ata.lba / (sectors * heads)) >> 8); - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit) | + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit) | (((request->u.ata.lba% (sectors * heads)) / sectors) & 0xf)); } else { +#endif ATA_IDX_OUTB(ch, ATA_SECTOR, request->u.ata.lba); ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); ATA_IDX_OUTB(ch, ATA_DRIVE, - ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit) | + ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit) | ((request->u.ata.lba >> 24) & 0x0f)); +#ifndef ATA_CAM } +#endif } } diff --git a/sys/dev/ata/chipsets/ata-ite.c b/sys/dev/ata/chipsets/ata-ite.c index 61879172aeb3..8c0a2c598f63 100644 --- a/sys/dev/ata/chipsets/ata-ite.c +++ b/sys/dev/ata/chipsets/ata-ite.c @@ -53,8 +53,9 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_ite_chipinit(device_t dev); -static void ata_ite_821x_setmode(device_t dev, int mode); -static void ata_ite_8213_setmode(device_t dev, int mode); +static int ata_ite_ch_attach(device_t dev); +static int ata_ite_821x_setmode(device_t dev, int target, int mode); +static int ata_ite_8213_setmode(device_t dev, int target, int mode); /* @@ -104,144 +105,128 @@ ata_ite_chipinit(device_t dev) pci_write_config(dev, 0x56, 0x31, 1); ctlr->setmode = ata_ite_821x_setmode; + /* No timing restrictions initally. */ + ctlr->chipset_data = (void *)0; } - + ctlr->ch_attach = ata_ite_ch_attach; return 0; } - -static void -ata_ite_821x_setmode(device_t dev, int mode) + +static int +ata_ite_ch_attach(device_t dev) { - device_t gparent = GRANDPARENT(dev); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; - - /* correct the mode for what the HW supports */ - mode = ata_limit_mode(dev, mode, ATA_UDMA6); - - /* check the CBLID bits for 80 conductor cable detection */ - if (mode > ATA_UDMA2 && (pci_read_config(gparent, 0x40, 2) & - (ch->unit ? (1<<3) : (1<<2)))) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; - } - - /* set the wanted mode on the device */ - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%s setting %s on ITE8212F chip\n", - (error) ? "failed" : "success", ata_mode2str(mode)); - - /* if the device accepted the mode change, setup the HW accordingly */ - if (!error) { - if (mode >= ATA_UDMA0) { - u_int8_t udmatiming[] = - { 0x44, 0x42, 0x31, 0x21, 0x11, 0xa2, 0x91 }; - - /* enable UDMA mode */ - pci_write_config(gparent, 0x50, - pci_read_config(gparent, 0x50, 1) & - ~(1 << (devno + 3)), 1); - - /* set UDMA timing */ - pci_write_config(gparent, - 0x56 + (ch->unit << 2) + atadev->unit, - udmatiming[mode & ATA_MODE_MASK], 1); - } - else { - u_int8_t chtiming[] = - { 0xaa, 0xa3, 0xa1, 0x33, 0x31, 0x88, 0x32, 0x31 }; - - /* disable UDMA mode */ - pci_write_config(gparent, 0x50, - pci_read_config(gparent, 0x50, 1) | - (1 << (devno + 3)), 1); - - /* set active and recover timing (shared between master & slave) */ - if (pci_read_config(gparent, 0x54 + (ch->unit << 2), 1) < - chtiming[ata_mode2idx(mode)]) - pci_write_config(gparent, 0x54 + (ch->unit << 2), - chtiming[ata_mode2idx(mode)], 1); - } - atadev->mode = mode; - } + struct ata_channel *ch = device_get_softc(dev); + int error; + + error = ata_pci_ch_attach(dev); + ch->flags |= ATA_CHECKS_CABLE; + return (error); } -static void -ata_ite_8213_setmode(device_t dev, int mode) +static int +ata_ite_821x_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_device *atadev = device_get_softc(dev); - u_int16_t reg40 = pci_read_config(gparent, 0x40, 2); - u_int8_t reg44 = pci_read_config(gparent, 0x44, 1); - u_int8_t reg48 = pci_read_config(gparent, 0x48, 1); - u_int16_t reg4a = pci_read_config(gparent, 0x4a, 2); - u_int16_t reg54 = pci_read_config(gparent, 0x54, 2); - u_int16_t mask40 = 0, new40 = 0; - u_int8_t mask44 = 0, new44 = 0; - int devno = atadev->unit; - int error; - u_int8_t timings[] = { 0x00, 0x00, 0x10, 0x21, 0x23, 0x10, 0x21, 0x23, - 0x23, 0x23, 0x23, 0x23, 0x23, 0x23 }; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int piomode; + uint8_t *timings = (uint8_t*)(&ctlr->chipset_data); + u_int8_t udmatiming[] = + { 0x44, 0x42, 0x31, 0x21, 0x11, 0xa2, 0x91 }; + u_int8_t chtiming[] = + { 0xaa, 0xa3, 0xa1, 0x33, 0x31, 0x88, 0x32, 0x31 }; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - - if (mode > ATA_UDMA2 && !(reg54 & (0x10 << devno))) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; - } - - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { + mode = min(mode, ctlr->chip->max_dma); + /* check the CBLID bits for 80 conductor cable detection */ + if (mode > ATA_UDMA2 && (pci_read_config(parent, 0x40, 2) & + (ch->unit ? (1<<3) : (1<<2)))) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } if (mode >= ATA_UDMA0) { - u_int8_t utimings[] = { 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10 }; + /* enable UDMA mode */ + pci_write_config(parent, 0x50, + pci_read_config(parent, 0x50, 1) & + ~(1 << (devno + 3)), 1); + /* set UDMA timing */ + pci_write_config(parent, + 0x56 + (ch->unit << 2) + target, + udmatiming[mode & ATA_MODE_MASK], 1); + piomode = ATA_PIO4; + } else { + /* disable UDMA mode */ + pci_write_config(parent, 0x50, + pci_read_config(parent, 0x50, 1) | + (1 << (devno + 3)), 1); + piomode = mode; + } + timings[devno] = chtiming[ata_mode2idx(piomode)]; + /* set active and recover timing (shared between master & slave) */ + pci_write_config(parent, 0x54 + (ch->unit << 2), + max(timings[ch->unit << 1], timings[(ch->unit << 1) + 1]), 1); + return (mode); +} - pci_write_config(gparent, 0x48, reg48 | (0x0001 << devno), 2); - pci_write_config(gparent, 0x4a, - (reg4a & ~(0x3 << (devno << 2))) | - (utimings[mode & ATA_MODE_MASK] << (devno<<2)), 2); +static int +ata_ite_8213_setmode(device_t dev, int target, int mode) +{ + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + int piomode; + u_int16_t reg40 = pci_read_config(parent, 0x40, 2); + u_int8_t reg44 = pci_read_config(parent, 0x44, 1); + u_int8_t reg48 = pci_read_config(parent, 0x48, 1); + u_int16_t reg4a = pci_read_config(parent, 0x4a, 2); + u_int16_t reg54 = pci_read_config(parent, 0x54, 2); + u_int16_t mask40 = 0, new40 = 0; + u_int8_t mask44 = 0, new44 = 0; + u_int8_t timings[] = { 0x00, 0x00, 0x10, 0x21, 0x23, 0x00, 0x21, 0x23 }; + u_int8_t utimings[] = { 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02 }; + + mode = min(mode, ctlr->chip->max_dma); + + if (mode > ATA_UDMA2 && !(reg54 & (0x10 << target))) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; } - else { - pci_write_config(gparent, 0x48, reg48 & ~(0x0001 << devno), 2); - pci_write_config(gparent, 0x4a, (reg4a & ~(0x3 << (devno << 2))),2); + /* Enable/disable UDMA and set timings. */ + if (mode >= ATA_UDMA0) { + pci_write_config(parent, 0x48, reg48 | (0x0001 << target), 2); + pci_write_config(parent, 0x4a, + (reg4a & ~(0x3 << (target << 2))) | + (utimings[mode & ATA_MODE_MASK] << (target<<2)), 2); + piomode = ATA_PIO4; + } else { + pci_write_config(parent, 0x48, reg48 & ~(0x0001 << target), 2); + pci_write_config(parent, 0x4a, (reg4a & ~(0x3 << (target << 2))),2); + piomode = mode; } - if (mode >= ATA_UDMA2) - reg54 |= (0x1 << devno); - else - reg54 &= ~(0x1 << devno); + /* Set UDMA reference clock (33/66/133MHz). */ + reg54 &= ~(0x1001 << target); if (mode >= ATA_UDMA5) - reg54 |= (0x1000 << devno); - else - reg54 &= ~(0x1000 << devno); - pci_write_config(gparent, 0x54, reg54, 2); - + reg54 |= (0x1000 << target); + else if (mode >= ATA_UDMA3) + reg54 |= (0x1 << target); + pci_write_config(parent, 0x54, reg54, 2); + /* Allow PIO/WDMA timing controls. */ reg40 &= 0xff00; reg40 |= 0x4033; - if (atadev->unit == ATA_MASTER) { - reg40 |= (ata_atapi(dev) ? 0x04 : 0x00); + /* Set PIO/WDMA timings. */ + if (target == 0) { + reg40 |= (ata_atapi(dev, target) ? 0x04 : 0x00); mask40 = 0x3300; - new40 = timings[ata_mode2idx(mode)] << 8; + new40 = timings[ata_mode2idx(piomode)] << 8; } else { - reg40 |= (ata_atapi(dev) ? 0x40 : 0x00); + reg40 |= (ata_atapi(dev, target) ? 0x40 : 0x00); mask44 = 0x0f; - new44 = ((timings[ata_mode2idx(mode)] & 0x30) >> 2) | - (timings[ata_mode2idx(mode)] & 0x03); + new44 = ((timings[ata_mode2idx(piomode)] & 0x30) >> 2) | + (timings[ata_mode2idx(piomode)] & 0x03); } - pci_write_config(gparent, 0x40, (reg40 & ~mask40) | new40, 4); - pci_write_config(gparent, 0x44, (reg44 & ~mask44) | new44, 1); - - atadev->mode = mode; - } + pci_write_config(parent, 0x40, (reg40 & ~mask40) | new40, 4); + pci_write_config(parent, 0x44, (reg44 & ~mask44) | new44, 1); + return (mode); } ATA_DECLARE_DRIVER(ata_ite); diff --git a/sys/dev/ata/chipsets/ata-jmicron.c b/sys/dev/ata/chipsets/ata-jmicron.c index 91108af80935..13524f1e7c6e 100644 --- a/sys/dev/ata/chipsets/ata-jmicron.c +++ b/sys/dev/ata/chipsets/ata-jmicron.c @@ -54,11 +54,7 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_jmicron_chipinit(device_t dev); static int ata_jmicron_ch_attach(device_t dev); -static int ata_jmicron_ch_detach(device_t dev); -static int ata_jmicron_ch_suspend(device_t dev); -static int ata_jmicron_ch_resume(device_t dev); -static void ata_jmicron_reset(device_t dev); -static void ata_jmicron_setmode(device_t dev, int mode); +static int ata_jmicron_setmode(device_t dev, int target, int mode); /* * JMicron chipset support functions @@ -70,10 +66,10 @@ ata_jmicron_probe(device_t dev) struct ata_chip_id *idx; static struct ata_chip_id ids[] = {{ ATA_JMB360, 0, 1, 0, ATA_SA300, "JMB360" }, - { ATA_JMB361, 0, 1, 1, ATA_SA300, "JMB361" }, - { ATA_JMB363, 0, 2, 1, ATA_SA300, "JMB363" }, - { ATA_JMB365, 0, 1, 2, ATA_SA300, "JMB365" }, - { ATA_JMB366, 0, 2, 2, ATA_SA300, "JMB366" }, + { ATA_JMB361, 0, 1, 1, ATA_UDMA6, "JMB361" }, + { ATA_JMB363, 0, 2, 1, ATA_UDMA6, "JMB363" }, + { ATA_JMB365, 0, 1, 2, ATA_UDMA6, "JMB365" }, + { ATA_JMB366, 0, 2, 2, ATA_UDMA6, "JMB366" }, { ATA_JMB368, 0, 0, 1, ATA_UDMA6, "JMB368" }, { 0, 0, 0, 0, 0, 0}}; char buffer[64]; @@ -84,13 +80,8 @@ ata_jmicron_probe(device_t dev) if (!(idx = ata_match_chip(dev, ids))) return ENXIO; - if ((pci_read_config(dev, 0xdf, 1) & 0x40) && - (pci_get_function(dev) == (pci_read_config(dev, 0x40, 1) & 0x02 >> 1))) - sprintf(buffer, "JMicron %s %s controller", - idx->text, ata_mode2str(ATA_UDMA6)); - else - sprintf(buffer, "JMicron %s %s controller", - idx->text, ata_mode2str(idx->max_dma)); + sprintf(buffer, "JMicron %s %s controller", + idx->text, ata_mode2str(idx->max_dma)); device_set_desc_copy(dev, buffer); ctlr->chip = idx; ctlr->chipinit = ata_jmicron_chipinit; @@ -101,7 +92,7 @@ static int ata_jmicron_chipinit(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); - int error; + device_t child; if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; @@ -113,7 +104,7 @@ ata_jmicron_chipinit(device_t dev) return 0; /* otherwise we are on the PATA part */ - ctlr->ch_attach = ata_pci_ch_attach; + ctlr->ch_attach = ata_jmicron_ch_attach; ctlr->ch_detach = ata_pci_ch_detach; ctlr->reset = ata_generic_reset; ctlr->setmode = ata_jmicron_setmode; @@ -123,21 +114,19 @@ ata_jmicron_chipinit(device_t dev) /* set controller configuration to a combined setup we support */ pci_write_config(dev, 0x40, 0x80c0a131, 4); pci_write_config(dev, 0x80, 0x01200000, 4); - - if (ctlr->chip->cfg1 && (error = ata_ahci_chipinit(dev))) - return error; - + /* Create AHCI subdevice if AHCI part present. */ + if (ctlr->chip->cfg1) { + child = device_add_child(dev, NULL, -1); + if (child != NULL) { + device_set_ivars(child, (void *)(intptr_t)-1); + bus_generic_attach(dev); + } + } ctlr->ch_attach = ata_jmicron_ch_attach; - ctlr->ch_detach = ata_jmicron_ch_detach; - ctlr->ch_suspend = ata_jmicron_ch_suspend; - ctlr->ch_resume = ata_jmicron_ch_resume; - ctlr->reset = ata_jmicron_reset; + ctlr->ch_detach = ata_pci_ch_detach; + ctlr->reset = ata_generic_reset; ctlr->setmode = ata_jmicron_setmode; - - /* set the number of HW channels */ - ctlr->channels = ctlr->chip->cfg1 + ctlr->chip->cfg2; - ctlr->ichannels |= ((0xffffffffU >> (32 - ctlr->chip->cfg2)) - << ctlr->chip->cfg1); + ctlr->channels = ctlr->chip->cfg2; } return 0; } @@ -145,94 +134,27 @@ ata_jmicron_chipinit(device_t dev) static int ata_jmicron_ch_attach(device_t dev) { - struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); - struct ata_channel *ch = device_get_softc(dev); - int error; - - if (ch->unit >= ctlr->chip->cfg1) { - ch->unit -= ctlr->chip->cfg1; + struct ata_channel *ch = device_get_softc(dev); + int error; + error = ata_pci_ch_attach(dev); - ch->unit += ctlr->chip->cfg1; - } - else - error = ata_ahci_ch_attach(dev); - return error; + ch->flags |= ATA_CHECKS_CABLE; + return (error); } static int -ata_jmicron_ch_detach(device_t dev) +ata_jmicron_setmode(device_t dev, int target, int mode) { - struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); - struct ata_channel *ch = device_get_softc(dev); - int error; - - if (ch->unit >= ctlr->chip->cfg1) { - ch->unit -= ctlr->chip->cfg1; - error = ata_pci_ch_detach(dev); - ch->unit += ctlr->chip->cfg1; - } - else - error = ata_ahci_ch_detach(dev); - - return (error); -} - -static int -ata_jmicron_ch_suspend(device_t dev) -{ - struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); - struct ata_channel *ch = device_get_softc(dev); - int error = 0; - - if (ch->unit < ctlr->chip->cfg1) - error = ata_ahci_ch_suspend(dev); - return error; -} - -static int -ata_jmicron_ch_resume(device_t dev) -{ - struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); - struct ata_channel *ch = device_get_softc(dev); - int error = 0; - - if (ch->unit < ctlr->chip->cfg1) - error = ata_ahci_ch_resume(dev); - return (error); -} - -static void -ata_jmicron_reset(device_t dev) -{ - struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); - struct ata_channel *ch = device_get_softc(dev); - - if (ch->unit >= ctlr->chip->cfg1) - ata_generic_reset(dev); - else - ata_ahci_reset(dev); -} - -static void -ata_jmicron_setmode(device_t dev, int mode) -{ - struct ata_pci_controller *ctlr = device_get_softc(GRANDPARENT(dev)); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - - if (pci_read_config(dev, 0xdf, 1) & 0x40 || ch->unit >= ctlr->chip->cfg1) { - struct ata_device *atadev = device_get_softc(dev); + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + mode = min(mode, ctlr->chip->max_dma); /* check for 80pin cable present */ - if (pci_read_config(dev, 0x40, 1) & 0x08) - mode = ata_limit_mode(dev, mode, ATA_UDMA2); - else - mode = ata_limit_mode(dev, mode, ATA_UDMA6); - - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; - } - else - ata_sata_setmode(dev, mode); + if (mode > ATA_UDMA2 && pci_read_config(dev, 0x40, 1) & 0x08) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } + /* Nothing to do to setup mode, the controller snoop SET_FEATURE cmd. */ + return (mode); } ATA_DECLARE_DRIVER(ata_jmicron); diff --git a/sys/dev/ata/chipsets/ata-marvell.c b/sys/dev/ata/chipsets/ata-marvell.c index dd6b96fcbf3f..8b8c0041b107 100644 --- a/sys/dev/ata/chipsets/ata-marvell.c +++ b/sys/dev/ata/chipsets/ata-marvell.c @@ -52,9 +52,10 @@ __FBSDID("$FreeBSD$"); #include /* local prototypes */ -static int ata_marvell_pata_chipinit(device_t dev); -static int ata_marvell_pata_ch_attach(device_t dev); -static void ata_marvell_pata_setmode(device_t dev, int mode); +static int ata_marvell_chipinit(device_t dev); +static int ata_marvell_ch_attach(device_t dev); +static int ata_marvell_setmode(device_t dev, int target, int mode); +static int ata_marvell_dummy_chipinit(device_t dev); static int ata_marvell_edma_ch_attach(device_t dev); static int ata_marvell_edma_ch_detach(device_t dev); static int ata_marvell_edma_status(device_t dev); @@ -67,8 +68,10 @@ static void ata_marvell_edma_dmainit(device_t dev); /* misc defines */ #define MV_50XX 50 #define MV_60XX 60 +#define MV_6042 62 +#define MV_7042 72 #define MV_61XX 61 - +#define MV_91XX 91 /* * Marvell chipset support functions @@ -102,13 +105,20 @@ ata_marvell_probe(device_t dev) { ATA_M88SX5080, 0, 8, MV_50XX, ATA_SA150, "88SX5080" }, { ATA_M88SX5081, 0, 8, MV_50XX, ATA_SA150, "88SX5081" }, { ATA_M88SX6041, 0, 4, MV_60XX, ATA_SA300, "88SX6041" }, + { ATA_M88SX6042, 0, 4, MV_6042, ATA_SA300, "88SX6042" }, { ATA_M88SX6081, 0, 8, MV_60XX, ATA_SA300, "88SX6081" }, - { ATA_M88SX6101, 0, 1, MV_61XX, ATA_UDMA6, "88SX6101" }, - { ATA_M88SX6121, 0, 1, MV_61XX, ATA_UDMA6, "88SX6121" }, - { ATA_M88SX6145, 0, 2, MV_61XX, ATA_UDMA6, "88SX6145" }, + { ATA_M88SX7042, 0, 4, MV_7042, ATA_SA300, "88SX7042" }, + { ATA_M88SX6101, 0, 0, MV_61XX, ATA_UDMA6, "88SX6101" }, + { ATA_M88SX6102, 0, 0, MV_61XX, ATA_UDMA6, "88SX6102" }, + { ATA_M88SX6111, 0, 1, MV_61XX, ATA_UDMA6, "88SX6111" }, + { ATA_M88SX6121, 0, 2, MV_61XX, ATA_UDMA6, "88SX6121" }, + { ATA_M88SX6141, 0, 4, MV_61XX, ATA_UDMA6, "88SX6141" }, + { ATA_M88SX6145, 0, 4, MV_61XX, ATA_UDMA6, "88SX6145" }, + { 0x91a41b4b, 0, 0, MV_91XX, ATA_UDMA6, "88SE912x" }, { 0, 0, 0, 0, 0, 0}}; - if (pci_get_vendor(dev) != ATA_MARVELL_ID) + if (pci_get_vendor(dev) != ATA_MARVELL_ID && + pci_get_vendor(dev) != ATA_MARVELL2_ID) return ENXIO; if (!(ctlr->chip = ata_match_chip(dev, ids))) @@ -119,56 +129,80 @@ ata_marvell_probe(device_t dev) switch (ctlr->chip->cfg2) { case MV_50XX: case MV_60XX: + case MV_6042: + case MV_7042: ctlr->chipinit = ata_marvell_edma_chipinit; break; case MV_61XX: - ctlr->chipinit = ata_marvell_pata_chipinit; + ctlr->chipinit = ata_marvell_chipinit; + break; + case MV_91XX: + ctlr->chipinit = ata_marvell_dummy_chipinit; break; } return (BUS_PROBE_DEFAULT); } static int -ata_marvell_pata_chipinit(device_t dev) +ata_marvell_chipinit(device_t dev) { - struct ata_pci_controller *ctlr = device_get_softc(dev); + struct ata_pci_controller *ctlr = device_get_softc(dev); + device_t child; - if (ata_setup_interrupt(dev, ata_generic_intr)) - return ENXIO; - - ctlr->ch_attach = ata_marvell_pata_ch_attach; - ctlr->ch_detach = ata_pci_ch_detach; - ctlr->setmode = ata_marvell_pata_setmode; - ctlr->channels = ctlr->chip->cfg1; - return 0; + if (ata_setup_interrupt(dev, ata_generic_intr)) + return ENXIO; + /* Create AHCI subdevice if AHCI part present. */ + if (ctlr->chip->cfg1) { + child = device_add_child(dev, NULL, -1); + if (child != NULL) { + device_set_ivars(child, (void *)(intptr_t)-1); + bus_generic_attach(dev); + } + } + ctlr->ch_attach = ata_marvell_ch_attach; + ctlr->ch_detach = ata_pci_ch_detach; + ctlr->reset = ata_generic_reset; + ctlr->setmode = ata_marvell_setmode; + ctlr->channels = 1; + return (0); } static int -ata_marvell_pata_ch_attach(device_t dev) +ata_marvell_ch_attach(device_t dev) { - struct ata_channel *ch = device_get_softc(dev); + struct ata_channel *ch = device_get_softc(dev); + int error; - /* setup the usual register normal pci style */ - if (ata_pci_ch_attach(dev)) - return ENXIO; - - /* dont use 32 bit PIO transfers */ + error = ata_pci_ch_attach(dev); + /* dont use 32 bit PIO transfers */ ch->flags |= ATA_USE_16BIT; - - return 0; + ch->flags |= ATA_CHECKS_CABLE; + return (error); } -static void -ata_marvell_pata_setmode(device_t dev, int mode) +static int +ata_marvell_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_device *atadev = device_get_softc(dev); + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + struct ata_channel *ch = device_get_softc(dev); - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - mode = ata_check_80pin(dev, mode); - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; + mode = min(mode, ctlr->chip->max_dma); + /* Check for 80pin cable present. */ + if (mode > ATA_UDMA2 && ATA_IDX_INB(ch, ATA_BMDEVSPEC_0) & 0x01) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } + /* Nothing to do to setup mode, the controller snoop SET_FEATURE cmd. */ + return (mode); +} + +static int +ata_marvell_dummy_chipinit(device_t dev) +{ + struct ata_pci_controller *ctlr = device_get_softc(dev); + + ctlr->channels = 0; + return (0); } int @@ -195,6 +229,7 @@ ata_marvell_edma_chipinit(device_t dev) ctlr->ch_detach = ata_marvell_edma_ch_detach; ctlr->reset = ata_marvell_edma_reset; ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; ctlr->channels = ctlr->chip->cfg1; /* clear host controller interrupts */ @@ -251,6 +286,8 @@ ata_marvell_edma_ch_attach(device_t dev) ch->r_io[ATA_SCONTROL].offset = 0x00108 + ATA_MV_HOST_BASE(ch); break; case MV_60XX: + case MV_6042: + case MV_7042: ch->r_io[ATA_SSTATUS].res = ctlr->r_res1; ch->r_io[ATA_SSTATUS].offset = 0x02300 + ATA_MV_EDMA_BASE(ch); ch->r_io[ATA_SERROR].res = ctlr->r_res1; @@ -264,6 +301,7 @@ ata_marvell_edma_ch_attach(device_t dev) ch->flags |= ATA_NO_SLAVE; ch->flags |= ATA_USE_16BIT; /* XXX SOS needed ? */ + ch->flags |= ATA_SATA; ata_generic_hw(dev); ch->hw.begin_transaction = ata_marvell_edma_begin_transaction; ch->hw.end_transaction = ata_marvell_edma_end_transaction; @@ -346,7 +384,7 @@ ata_marvell_edma_status(device_t dev) static int ata_marvell_edma_begin_transaction(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); u_int32_t req_in; u_int8_t *bytep; @@ -355,7 +393,9 @@ ata_marvell_edma_begin_transaction(struct ata_request *request) /* only DMA R/W goes through the EMDA machine */ if (request->u.ata.command != ATA_READ_DMA && - request->u.ata.command != ATA_WRITE_DMA) { + request->u.ata.command != ATA_WRITE_DMA && + request->u.ata.command != ATA_READ_DMA48 && + request->u.ata.command != ATA_WRITE_DMA48) { /* disable the EDMA machinery */ if (ATA_INL(ctlr->r_res1, 0x02028 + ATA_MV_EDMA_BASE(ch)) & 0x00000001) @@ -363,12 +403,9 @@ ata_marvell_edma_begin_transaction(struct ata_request *request) return ata_begin_transaction(request); } - /* check for 48 bit access and convert if needed */ - ata_modify_if_48bit(request); - /* check sanity, setup SG list and DMA engine */ if ((error = ch->dma.load(request, NULL, NULL))) { - device_printf(request->dev, "setting up DMA failed\n"); + device_printf(request->parent, "setting up DMA failed\n"); request->result = error; return ATA_OP_FINISHED; } @@ -384,35 +421,61 @@ ata_marvell_edma_begin_transaction(struct ata_request *request) request->dma->sg_bus & 0xffffffff); le32enc(bytep + 1 * sizeof(u_int32_t), (u_int64_t)request->dma->sg_bus >> 32); - le16enc(bytep + 4 * sizeof(u_int16_t), - (request->flags & ATA_R_READ ? 0x01 : 0x00) | (request->tag << 1)); + if (ctlr->chip->cfg2 != MV_6042 && ctlr->chip->cfg2 != MV_7042) { + le16enc(bytep + 4 * sizeof(u_int16_t), + (request->flags & ATA_R_READ ? 0x01 : 0x00) | (request->tag << 1)); - i = 10; - bytep[i++] = (request->u.ata.count >> 8) & 0xff; - bytep[i++] = 0x10 | ATA_COUNT; - bytep[i++] = request->u.ata.count & 0xff; - bytep[i++] = 0x10 | ATA_COUNT; + i = 10; + bytep[i++] = (request->u.ata.count >> 8) & 0xff; + bytep[i++] = 0x10 | ATA_COUNT; + bytep[i++] = request->u.ata.count & 0xff; + bytep[i++] = 0x10 | ATA_COUNT; - bytep[i++] = (request->u.ata.lba >> 24) & 0xff; - bytep[i++] = 0x10 | ATA_SECTOR; - bytep[i++] = request->u.ata.lba & 0xff; - bytep[i++] = 0x10 | ATA_SECTOR; + bytep[i++] = (request->u.ata.lba >> 24) & 0xff; + bytep[i++] = 0x10 | ATA_SECTOR; + bytep[i++] = request->u.ata.lba & 0xff; + bytep[i++] = 0x10 | ATA_SECTOR; - bytep[i++] = (request->u.ata.lba >> 32) & 0xff; - bytep[i++] = 0x10 | ATA_CYL_LSB; - bytep[i++] = (request->u.ata.lba >> 8) & 0xff; - bytep[i++] = 0x10 | ATA_CYL_LSB; + bytep[i++] = (request->u.ata.lba >> 32) & 0xff; + bytep[i++] = 0x10 | ATA_CYL_LSB; + bytep[i++] = (request->u.ata.lba >> 8) & 0xff; + bytep[i++] = 0x10 | ATA_CYL_LSB; - bytep[i++] = (request->u.ata.lba >> 40) & 0xff; - bytep[i++] = 0x10 | ATA_CYL_MSB; - bytep[i++] = (request->u.ata.lba >> 16) & 0xff; - bytep[i++] = 0x10 | ATA_CYL_MSB; + bytep[i++] = (request->u.ata.lba >> 40) & 0xff; + bytep[i++] = 0x10 | ATA_CYL_MSB; + bytep[i++] = (request->u.ata.lba >> 16) & 0xff; + bytep[i++] = 0x10 | ATA_CYL_MSB; - bytep[i++] = ATA_D_LBA | ATA_D_IBM | ((request->u.ata.lba >> 24) & 0xf); - bytep[i++] = 0x10 | ATA_DRIVE; + bytep[i++] = ATA_D_LBA | ATA_D_IBM | ((request->u.ata.lba >> 24) & 0xf); + bytep[i++] = 0x10 | ATA_DRIVE; - bytep[i++] = request->u.ata.command; - bytep[i++] = 0x90 | ATA_COMMAND; + bytep[i++] = request->u.ata.command; + bytep[i++] = 0x90 | ATA_COMMAND; + } else { + le32enc(bytep + 2 * sizeof(u_int32_t), + (request->flags & ATA_R_READ ? 0x01 : 0x00) | (request->tag << 1)); + + i = 16; + bytep[i++] = 0; + bytep[i++] = 0; + bytep[i++] = request->u.ata.command; + bytep[i++] = request->u.ata.feature & 0xff; + + bytep[i++] = request->u.ata.lba & 0xff; + bytep[i++] = (request->u.ata.lba >> 8) & 0xff; + bytep[i++] = (request->u.ata.lba >> 16) & 0xff; + bytep[i++] = ATA_D_LBA | ATA_D_IBM | ((request->u.ata.lba >> 24) & 0x0f); + + bytep[i++] = (request->u.ata.lba >> 24) & 0xff; + bytep[i++] = (request->u.ata.lba >> 32) & 0xff; + bytep[i++] = (request->u.ata.lba >> 40) & 0xff; + bytep[i++] = (request->u.ata.feature >> 8) & 0xff; + + bytep[i++] = request->u.ata.count & 0xff; + bytep[i++] = (request->u.ata.count >> 8) & 0xff; + bytep[i++] = 0; + bytep[i++] = 0; + } bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); @@ -438,7 +501,7 @@ ata_marvell_edma_begin_transaction(struct ata_request *request) static int ata_marvell_edma_end_transaction(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); int offset = (ch->unit > 3 ? 0x30014 : 0x20014); u_int32_t icr = ATA_INL(ctlr->r_res1, offset); @@ -557,7 +620,8 @@ ata_marvell_edma_dmainit(device_t dev) ch->dma.max_address = BUS_SPACE_MAXADDR; /* chip does not reliably do 64K DMA transfers */ - ch->dma.max_iosize = 64 * DEV_BSIZE; + if (ctlr->chip->cfg2 == MV_50XX || ctlr->chip->cfg2 == MV_60XX) + ch->dma.max_iosize = 64 * DEV_BSIZE; } ATA_DECLARE_DRIVER(ata_marvell); diff --git a/sys/dev/ata/chipsets/ata-micron.c b/sys/dev/ata/chipsets/ata-micron.c index ce7587430406..2b74a3305880 100644 --- a/sys/dev/ata/chipsets/ata-micron.c +++ b/sys/dev/ata/chipsets/ata-micron.c @@ -51,11 +51,6 @@ __FBSDID("$FreeBSD$"); #include #include -/* local prototypes */ -static int ata_micron_chipinit(device_t dev); -static void ata_micron_setmode(device_t dev, int mode); - - /* * Cenatek chipset support functions */ @@ -68,34 +63,10 @@ ata_micron_probe(device_t dev) pci_get_devid(dev) == ATA_MICRON_RZ1001) { device_set_desc(dev, "RZ 100? ATA controller !WARNING! data loss/corruption risk"); - ctlr->chipinit = ata_micron_chipinit; + ctlr->chipinit = ata_generic_chipinit; return (BUS_PROBE_DEFAULT); } - else - return ENXIO; -} - -static int -ata_micron_chipinit(device_t dev) -{ - struct ata_pci_controller *ctlr = device_get_softc(dev); - - if (ata_setup_interrupt(dev, ata_generic_intr)) - return ENXIO; - - ctlr->setmode = ata_micron_setmode; - return 0; -} - -static void -ata_micron_setmode(device_t dev, int mode) -{ - struct ata_device *atadev = device_get_softc(dev); - - mode = ata_limit_mode(dev, mode, ATA_UDMA2); - mode = ata_check_80pin(dev, mode); - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; + return (ENXIO); } ATA_DECLARE_DRIVER(ata_micron); diff --git a/sys/dev/ata/chipsets/ata-national.c b/sys/dev/ata/chipsets/ata-national.c index 840360ad2b66..20cafa533a83 100644 --- a/sys/dev/ata/chipsets/ata-national.c +++ b/sys/dev/ata/chipsets/ata-national.c @@ -53,8 +53,8 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_national_chipinit(device_t dev); -static void ata_national_setmode(device_t dev, int mode); - +static int ata_national_ch_attach(device_t dev); +static int ata_national_setmode(device_t dev, int target, int mode); /* * National chipset support functions @@ -81,53 +81,55 @@ ata_national_chipinit(device_t dev) if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; + ctlr->ch_attach = ata_national_ch_attach; ctlr->setmode = ata_national_setmode; return 0; } -static void -ata_national_setmode(device_t dev, int mode) +static int +ata_national_ch_attach(device_t dev) { - device_t gparent = GRANDPARENT(dev); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - u_int32_t piotiming[] = - { 0x9172d132, 0x21717121, 0x00803020, 0x20102010, 0x00100010, - 0x00803020, 0x20102010, 0x00100010, - 0x00100010, 0x00100010, 0x00100010 }; - u_int32_t dmatiming[] = { 0x80077771, 0x80012121, 0x80002020 }; - u_int32_t udmatiming[] = { 0x80921250, 0x80911140, 0x80911030 }; - int error; + struct ata_channel *ch = device_get_softc(dev); + int error; + + error = ata_pci_ch_attach(dev); + ch->dma.alignment = 16; + ch->dma.max_iosize = 64 * DEV_BSIZE; + return (error); +} - ch->dma.alignment = 16; - ch->dma.max_iosize = 64 * DEV_BSIZE; +static int +ata_national_setmode(device_t dev, int target, int mode) +{ + device_t parent = device_get_parent(dev); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int piomode; + u_int32_t piotiming[] = + { 0x9172d132, 0x21717121, 0x00803020, 0x20102010, 0x00100010, + 0x9172d132, 0x20102010, 0x00100010 }; + u_int32_t dmatiming[] = { 0x80077771, 0x80012121, 0x80002020 }; + u_int32_t udmatiming[] = { 0x80921250, 0x80911140, 0x80911030 }; - mode = ata_limit_mode(dev, mode, ATA_UDMA2); + mode = min(mode, ATA_UDMA2); - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%s setting %s on National chip\n", - (error) ? "failed" : "success", ata_mode2str(mode)); - if (!error) { if (mode >= ATA_UDMA0) { - pci_write_config(gparent, 0x44 + (devno << 3), + pci_write_config(parent, 0x44 + (devno << 3), udmatiming[mode & ATA_MODE_MASK], 4); - } - else if (mode >= ATA_WDMA0) { - pci_write_config(gparent, 0x44 + (devno << 3), + piomode = ATA_PIO4; + } else if (mode >= ATA_WDMA0) { + pci_write_config(parent, 0x44 + (devno << 3), dmatiming[mode & ATA_MODE_MASK], 4); - } - else { - pci_write_config(gparent, 0x44 + (devno << 3), - pci_read_config(gparent, 0x44 + (devno << 3), 4) | + piomode = mode; + } else { + pci_write_config(parent, 0x44 + (devno << 3), + pci_read_config(parent, 0x44 + (devno << 3), 4) | 0x80000000, 4); + piomode = mode; } - pci_write_config(gparent, 0x40 + (devno << 3), - piotiming[ata_mode2idx(mode)], 4); - atadev->mode = mode; - } + pci_write_config(parent, 0x40 + (devno << 3), + piotiming[ata_mode2idx(piomode)], 4); + return (mode); } ATA_DECLARE_DRIVER(ata_national); diff --git a/sys/dev/ata/chipsets/ata-netcell.c b/sys/dev/ata/chipsets/ata-netcell.c index c07df0ea2a57..8e5a9cbe8d29 100644 --- a/sys/dev/ata/chipsets/ata-netcell.c +++ b/sys/dev/ata/chipsets/ata-netcell.c @@ -54,8 +54,7 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_netcell_chipinit(device_t dev); static int ata_netcell_ch_attach(device_t dev); -static void ata_netcell_setmode(device_t dev, int mode); - +static int ata_netcell_setmode(device_t dev, int target, int mode); /* * NetCell chipset support functions @@ -82,7 +81,6 @@ ata_netcell_chipinit(device_t dev) return ENXIO; ctlr->ch_attach = ata_netcell_ch_attach; - ctlr->ch_detach = ata_pci_ch_detach; ctlr->setmode = ata_netcell_setmode; return 0; } @@ -98,19 +96,16 @@ ata_netcell_ch_attach(device_t dev) /* the NetCell only supports 16 bit PIO transfers */ ch->flags |= ATA_USE_16BIT; - + /* It is a hardware RAID without cable. */ + ch->flags |= ATA_CHECKS_CABLE; return 0; } -static void -ata_netcell_setmode(device_t dev, int mode) +static int +ata_netcell_setmode(device_t dev, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); - mode = ata_limit_mode(dev, mode, ATA_UDMA2); - mode = ata_check_80pin(dev, mode); - if (!ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - atadev->mode = mode; + return (min(mode, ATA_UDMA6)); } ATA_DECLARE_DRIVER(ata_netcell); diff --git a/sys/dev/ata/chipsets/ata-nvidia.c b/sys/dev/ata/chipsets/ata-nvidia.c index 95be37c30829..79064f883a37 100644 --- a/sys/dev/ata/chipsets/ata-nvidia.c +++ b/sys/dev/ata/chipsets/ata-nvidia.c @@ -56,7 +56,7 @@ static int ata_nvidia_chipinit(device_t dev); static int ata_nvidia_ch_attach(device_t dev); static int ata_nvidia_status(device_t dev); static void ata_nvidia_reset(device_t dev); -static void ata_nvidia_setmode(device_t dev, int mode); +static int ata_nvidia_setmode(device_t dev, int target, int mode); /* misc defines */ #define NV4 0x01 @@ -97,6 +97,14 @@ ata_nvidia_probe(device_t dev) { ATA_NFORCE_MCP61_S2, 0, NV4|NVQ, 0, ATA_SA300, "nForce MCP61" }, { ATA_NFORCE_MCP61_S3, 0, NV4|NVQ, 0, ATA_SA300, "nForce MCP61" }, { ATA_NFORCE_MCP65, 0, 0, 0, ATA_UDMA6, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A2, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A3, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A4, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A5, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A6, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, + { ATA_NFORCE_MCP65_A7, 0, NVAHCI, 0, ATA_SA300, "nForce MCP65" }, { ATA_NFORCE_MCP67, 0, 0, 0, ATA_UDMA6, "nForce MCP67" }, { ATA_NFORCE_MCP67_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" }, { ATA_NFORCE_MCP67_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP67" }, @@ -125,6 +133,42 @@ ata_nvidia_probe(device_t dev) { ATA_NFORCE_MCP73_AA, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" }, { ATA_NFORCE_MCP73_AB, 0, NVAHCI, 0, ATA_SA300, "nForce MCP73" }, { ATA_NFORCE_MCP77, 0, 0, 0, ATA_UDMA6, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A2, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A3, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A4, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A5, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A6, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A7, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A8, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_A9, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_AA, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP77_AB, 0, NVAHCI, 0, ATA_SA300, "nForce MCP77" }, + { ATA_NFORCE_MCP79_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A2, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A3, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A4, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A5, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A6, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A7, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A8, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_A9, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_AA, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP79_AB, 0, NVAHCI, 0, ATA_SA300, "nForce MCP79" }, + { ATA_NFORCE_MCP89_A0, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A1, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A2, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A3, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A4, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A5, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A6, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A7, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A8, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_A9, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_AA, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, + { ATA_NFORCE_MCP89_AB, 0, NVAHCI, 0, ATA_SA300, "nForce MCP89" }, { 0, 0, 0, 0, 0, 0}} ; if (pci_get_vendor(dev) != ATA_NVIDIA_ID) @@ -165,7 +209,8 @@ ata_nvidia_chipinit(device_t dev) /* enable control access */ pci_write_config(dev, 0x50, pci_read_config(dev, 0x50, 1) | 0x04,1); - + /* MCP55 seems to need some time to allow r_res2 read. */ + DELAY(10); if (ctlr->chip->cfg1 & NVQ) { /* clear interrupt status */ ATA_OUTL(ctlr->r_res2, offset, 0x00ff00ff); @@ -186,6 +231,7 @@ ata_nvidia_chipinit(device_t dev) } } ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; } else { /* disable prefetch, postwrite */ @@ -214,7 +260,7 @@ ata_nvidia_ch_attach(device_t dev) ch->hw.status = ata_nvidia_status; ch->flags |= ATA_NO_SLAVE; - + ch->flags |= ATA_SATA; return 0; } @@ -254,36 +300,29 @@ ata_nvidia_reset(device_t dev) ata_generic_reset(dev); } -static void -ata_nvidia_setmode(device_t dev, int mode) +static int +ata_nvidia_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - u_int8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; - int modes[7] = { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }; - int devno = (ch->unit << 1) + atadev->unit; - int reg = 0x63 - devno; - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int piomode; + u_int8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0xa8, 0x22, 0x20 }; + int modes[7] = { 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6, 0xc7 }; + int reg = 0x63 - devno; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - mode = ata_check_80pin(dev, mode); + mode = min(mode, ctlr->chip->max_dma); - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", ata_mode2str(mode), - ctlr->chip->text); - if (!error) { - pci_write_config(gparent, reg - 0x08, timings[ata_mode2idx(mode)], 1); - if (mode >= ATA_UDMA0) - pci_write_config(gparent, reg, modes[mode & ATA_MODE_MASK], 1); - else - pci_write_config(gparent, reg, 0x8b, 1); - atadev->mode = mode; - } + if (mode >= ATA_UDMA0) { + pci_write_config(parent, reg, modes[mode & ATA_MODE_MASK], 1); + piomode = ATA_PIO4; + } else { + pci_write_config(parent, reg, 0x8b, 1); + piomode = mode; + } + pci_write_config(parent, reg - 0x08, timings[ata_mode2idx(piomode)], 1); + return (mode); } ATA_DECLARE_DRIVER(ata_nvidia); diff --git a/sys/dev/ata/chipsets/ata-promise.c b/sys/dev/ata/chipsets/ata-promise.c index 37863ce7ff25..3054552c305b 100644 --- a/sys/dev/ata/chipsets/ata-promise.c +++ b/sys/dev/ata/chipsets/ata-promise.c @@ -58,7 +58,7 @@ static int ata_promise_status(device_t dev); static int ata_promise_dmastart(struct ata_request *request); static int ata_promise_dmastop(struct ata_request *request); static void ata_promise_dmareset(device_t dev); -static void ata_promise_setmode(device_t dev, int mode); +static int ata_promise_setmode(device_t dev, int target, int mode); static int ata_promise_tx2_ch_attach(device_t dev); static int ata_promise_tx2_status(device_t dev); static int ata_promise_mio_ch_attach(device_t dev); @@ -72,7 +72,8 @@ static int ata_promise_mio_pm_write(device_t dev, int port, int reg, u_int32_t r static u_int32_t ata_promise_mio_softreset(device_t dev, int port); static void ata_promise_mio_dmainit(device_t dev); static void ata_promise_mio_setprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); -static void ata_promise_mio_setmode(device_t dev, int mode); +static int ata_promise_mio_setmode(device_t dev, int target, int mode); +static int ata_promise_mio_getrev(device_t dev, int target); static void ata_promise_sx4_intr(void *data); static int ata_promise_sx4_command(struct ata_request *request); static int ata_promise_apkt(u_int8_t *bytep, struct ata_request *request); @@ -217,7 +218,7 @@ static int ata_promise_chipinit(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); - int fake_reg, stat_reg; + int stat_reg; if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; @@ -311,7 +312,6 @@ ata_promise_chipinit(device_t dev) case PR_SATA: ctlr->channels = 4; sata150: - fake_reg = 0x60; stat_reg = 0x6c; break; @@ -322,13 +322,12 @@ sata150: default: ctlr->channels = 4; sataii: - fake_reg = 0x54; stat_reg = 0x60; break; } /* prime fake interrupt register */ - ATA_OUTL(ctlr->r_res2, fake_reg, 0xffffffff); + ctlr->chipset_data = (void *)(uintptr_t)0xffffffff; /* clear SATA status and unmask interrupts */ ATA_OUTL(ctlr->r_res2, stat_reg, 0x000000ff); @@ -341,6 +340,7 @@ sataii: ctlr->ch_detach = ata_promise_mio_ch_detach; ctlr->reset = ata_promise_mio_reset; ctlr->setmode = ata_promise_mio_setmode; + ctlr->getrev = ata_promise_mio_getrev; return 0; } @@ -369,6 +369,8 @@ ata_promise_ch_attach(device_t dev) } ch->hw.status = ata_promise_status; + ch->flags |= ATA_NO_ATAPI_DMA; + ch->flags |= ATA_CHECKS_CABLE; return 0; } @@ -387,11 +389,10 @@ ata_promise_status(device_t dev) static int ata_promise_dmastart(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { ATA_OUTB(ctlr->r_res1, 0x11, ATA_INB(ctlr->r_res1, 0x11) | (ch->unit ? 0x08 : 0x02)); ATA_OUTL(ctlr->r_res1, ch->unit ? 0x24 : 0x20, @@ -411,12 +412,11 @@ ata_promise_dmastart(struct ata_request *request) static int ata_promise_dmastop(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); int error; - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { ATA_OUTB(ctlr->r_res1, 0x11, ATA_INB(ctlr->r_res1, 0x11) & ~(ch->unit ? 0x08 : 0x02)); ATA_OUTL(ctlr->r_res1, ch->unit ? 0x24 : 0x20, 0); @@ -440,15 +440,13 @@ ata_promise_dmareset(device_t dev) ch->flags &= ~ATA_DMA_ACTIVE; } -static void -ata_promise_setmode(device_t dev, int mode) +static int +ata_promise_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; u_int32_t timings[][2] = { /* PR_OLD PR_NEW mode */ { 0x004ff329, 0x004fff2f }, /* PIO 0 */ @@ -467,18 +465,16 @@ ata_promise_setmode(device_t dev, int mode) { 0, 0x004127f3 } /* UDMA 5 */ }; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); + mode = min(mode, ctlr->chip->max_dma); switch (ctlr->chip->cfg1) { case PR_OLD: case PR_NEW: - if (mode > ATA_UDMA2 && (pci_read_config(gparent, 0x50, 2) & + if (mode > ATA_UDMA2 && (pci_read_config(parent, 0x50, 2) & (ch->unit ? 1 << 11 : 1 << 10))) { ata_print_cable(dev, "controller"); mode = ATA_UDMA2; } - if (ata_atapi(dev) && mode > ATA_PIO_MAX) - mode = ata_limit_mode(dev, mode, ATA_PIO_MAX); break; case PR_TX: @@ -501,19 +497,10 @@ ata_promise_setmode(device_t dev, int mode) break; } - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { if (ctlr->chip->cfg1 < PR_TX) - pci_write_config(gparent, 0x60 + (devno << 2), + pci_write_config(parent, 0x60 + (devno << 2), timings[ata_mode2idx(mode)][ctlr->chip->cfg1], 4); - atadev->mode = mode; - } - return; + return (mode); } static int @@ -525,6 +512,7 @@ ata_promise_tx2_ch_attach(device_t dev) return ENXIO; ch->hw.status = ata_promise_tx2_status; + ch->flags |= ATA_CHECKS_CABLE; return 0; } @@ -567,8 +555,10 @@ ata_promise_mio_ch_attach(device_t dev) ch->r_io[ATA_SCONTROL].res = ctlr->r_res2; ch->r_io[ATA_SCONTROL].offset = 0x408 + (ch->unit << 8); ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; } ch->flags |= ATA_USE_16BIT; + ch->flags |= ATA_CHECKS_CABLE; ata_generic_hw(dev); if (ctlr->chip->cfg2 & PR_SX4X) { @@ -598,38 +588,23 @@ ata_promise_mio_intr(void *data) struct ata_pci_controller *ctlr = data; struct ata_channel *ch; u_int32_t vector; - int unit, fake_reg; - - switch (ctlr->chip->cfg2) { - case PR_PATA: - case PR_CMBO: - case PR_SATA: - fake_reg = 0x60; - break; - case PR_CMBO2: - case PR_SATA2: - default: - fake_reg = 0x54; - break; - } + int unit; /* * since reading interrupt status register on early "mio" chips * clears the status bits we cannot read it for each channel later on * in the generic interrupt routine. - * store the bits in an unused register in the chip so we can read - * it from there safely to get around this "feature". */ vector = ATA_INL(ctlr->r_res2, 0x040); ATA_OUTL(ctlr->r_res2, 0x040, vector); - ATA_OUTL(ctlr->r_res2, fake_reg, vector); + ctlr->chipset_data = (void *)(uintptr_t)vector; for (unit = 0; unit < ctlr->channels; unit++) { if ((ch = ctlr->interrupt[unit].argument)) ctlr->interrupt[unit].function(ch); } - ATA_OUTL(ctlr->r_res2, fake_reg, 0xffffffff); + ctlr->chipset_data = (void *)(uintptr_t)0xffffffff; } static int @@ -637,25 +612,23 @@ ata_promise_mio_status(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); struct ata_channel *ch = device_get_softc(dev); - u_int32_t fake_reg, stat_reg, vector, status; + u_int32_t stat_reg, vector, status; switch (ctlr->chip->cfg2) { case PR_PATA: case PR_CMBO: case PR_SATA: - fake_reg = 0x60; stat_reg = 0x6c; break; case PR_CMBO2: case PR_SATA2: default: - fake_reg = 0x54; stat_reg = 0x60; break; } /* read and acknowledge interrupt */ - vector = ATA_INL(ctlr->r_res2, fake_reg); + vector = (uint32_t)(uintptr_t)ctlr->chipset_data; /* read and clear interface status */ status = ATA_INL(ctlr->r_res2, stat_reg); @@ -682,9 +655,8 @@ ata_promise_mio_status(device_t dev) static int ata_promise_mio_command(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); u_int32_t *wordp = (u_int32_t *)ch->dma.work; @@ -693,7 +665,7 @@ ata_promise_mio_command(struct ata_request *request) if ((ctlr->chip->cfg2 == PR_SATA2) || ((ctlr->chip->cfg2 == PR_CMBO2) && (ch->unit < 2))) { /* set portmultiplier port */ - ATA_OUTB(ctlr->r_res2, 0x4e8 + (ch->unit << 8), atadev->unit & 0x0f); + ATA_OUTB(ctlr->r_res2, 0x4e8 + (ch->unit << 8), request->unit & 0x0f); } /* XXX SOS add ATAPI commands support later */ @@ -832,7 +804,8 @@ ata_promise_mio_reset(device_t dev) device_printf(dev, "promise_mio_reset devices=%08x\n", ch->devices); - } + } else + ch->devices = 0; /* reset and enable plug/unplug intr */ ATA_OUTL(ctlr->r_res2, 0x060, (0x00000011 << ch->unit)); @@ -968,6 +941,7 @@ ata_promise_mio_dmainit(device_t dev) ata_dmainit(dev); /* note start and stop are not used here */ ch->dma.setprd = ata_promise_mio_setprd; + ch->dma.max_iosize = 65536; } @@ -1000,20 +974,35 @@ ata_promise_mio_setprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) args->nsegs = nsegs; } -static void -ata_promise_mio_setmode(device_t dev, int mode) +static int +ata_promise_mio_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + struct ata_channel *ch = device_get_softc(dev); - if ( (ctlr->chip->cfg2 == PR_SATA) || - ((ctlr->chip->cfg2 == PR_CMBO) && (ch->unit < 2)) || - (ctlr->chip->cfg2 == PR_SATA2) || - ((ctlr->chip->cfg2 == PR_CMBO2) && (ch->unit < 2))) - ata_sata_setmode(dev, mode); - else - ata_promise_setmode(dev, mode); + if ( (ctlr->chip->cfg2 == PR_SATA) || + ((ctlr->chip->cfg2 == PR_CMBO) && (ch->unit < 2)) || + (ctlr->chip->cfg2 == PR_SATA2) || + ((ctlr->chip->cfg2 == PR_CMBO2) && (ch->unit < 2))) + mode = ata_sata_setmode(dev, target, mode); + else + mode = ata_promise_setmode(dev, target, mode); + return (mode); +} + +static int +ata_promise_mio_getrev(device_t dev, int target) +{ + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + struct ata_channel *ch = device_get_softc(dev); + + if ( (ctlr->chip->cfg2 == PR_SATA) || + ((ctlr->chip->cfg2 == PR_CMBO) && (ch->unit < 2)) || + (ctlr->chip->cfg2 == PR_SATA2) || + ((ctlr->chip->cfg2 == PR_CMBO2) && (ch->unit < 2))) + return (ata_sata_getrev(dev, target)); + else + return (0); } static void @@ -1051,7 +1040,7 @@ ata_promise_sx4_intr(void *data) static int ata_promise_sx4_command(struct ata_request *request) { - device_t gparent = GRANDPARENT(request->dev); + device_t gparent = device_get_parent(request->parent); struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(request->parent); struct ata_dma_prdentry *prd; @@ -1158,15 +1147,14 @@ ata_promise_sx4_command(struct ata_request *request) static int ata_promise_apkt(u_int8_t *bytep, struct ata_request *request) { - struct ata_device *atadev = device_get_softc(request->dev); int i = 12; bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_PDC_WAIT_NBUSY|ATA_DRIVE; - bytep[i++] = ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit); + bytep[i++] = ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit); bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_CTL; bytep[i++] = ATA_A_4BIT; - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { bytep[i++] = ATA_PDC_2B | ATA_PDC_WRITE_REG | ATA_FEATURE; bytep[i++] = request->u.ata.feature >> 8; bytep[i++] = request->u.ata.feature; @@ -1183,7 +1171,7 @@ ata_promise_apkt(u_int8_t *bytep, struct ata_request *request) bytep[i++] = request->u.ata.lba >> 40; bytep[i++] = request->u.ata.lba >> 16; bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_DRIVE; - bytep[i++] = ATA_D_LBA | ATA_DEV(atadev->unit); + bytep[i++] = ATA_D_LBA | ATA_DEV(request->unit); } else { bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_FEATURE; @@ -1197,8 +1185,7 @@ ata_promise_apkt(u_int8_t *bytep, struct ata_request *request) bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_CYL_MSB; bytep[i++] = request->u.ata.lba >> 16; bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_DRIVE; - bytep[i++] = (atadev->flags & ATA_D_USE_CHS ? 0 : ATA_D_LBA) | - ATA_D_IBM | ATA_DEV(atadev->unit) | + bytep[i++] = ATA_D_LBA | ATA_D_IBM | ATA_DEV(request->unit) | ((request->u.ata.lba >> 24)&0xf); } bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_END | ATA_COMMAND; diff --git a/sys/dev/ata/chipsets/ata-serverworks.c b/sys/dev/ata/chipsets/ata-serverworks.c index eca72d477808..033d985157d4 100644 --- a/sys/dev/ata/chipsets/ata-serverworks.c +++ b/sys/dev/ata/chipsets/ata-serverworks.c @@ -41,6 +41,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef __powerpc__ +#include +#endif #include #include #include @@ -57,7 +60,7 @@ static int ata_serverworks_ch_attach(device_t dev); static int ata_serverworks_ch_detach(device_t dev); static void ata_serverworks_tf_read(struct ata_request *request); static void ata_serverworks_tf_write(struct ata_request *request); -static void ata_serverworks_setmode(device_t dev, int mode); +static int ata_serverworks_setmode(device_t dev, int target, int mode); #ifdef __powerpc__ static int ata_serverworks_status(device_t dev); #endif @@ -77,7 +80,7 @@ ata_serverworks_probe(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); static struct ata_chip_id ids[] = - {{ ATA_ROSB4, 0x00, SWKS_33, 0, ATA_UDMA2, "ROSB4" }, + {{ ATA_ROSB4, 0x00, SWKS_33, 0, ATA_WDMA2, "ROSB4" }, { ATA_CSB5, 0x92, SWKS_100, 0, ATA_UDMA5, "CSB5" }, { ATA_CSB5, 0x00, SWKS_66, 0, ATA_UDMA4, "CSB5" }, { ATA_CSB6, 0x00, SWKS_100, 0, ATA_UDMA5, "CSB6" }, @@ -106,6 +109,13 @@ static int ata_serverworks_status(device_t dev) { struct ata_channel *ch = device_get_softc(dev); + struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); + + /* + * Check if this interrupt belongs to our channel. + */ + if (!(ATA_INL(ctlr->r_res2, 0x1f80) & (1 << ch->unit))) + return (0); /* * We need to do a 4-byte read on the status reg before the values @@ -137,6 +147,7 @@ ata_serverworks_chipinit(device_t dev) ctlr->ch_attach = ata_serverworks_ch_attach; ctlr->ch_detach = ata_serverworks_ch_detach; ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; return 0; } else if (ctlr->chip->cfg1 == SWKS_33) { @@ -203,13 +214,35 @@ ata_serverworks_ch_attach(device_t dev) ch->r_io[ATA_SCONTROL].offset = ch_offset + 0x48; ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; ata_pci_hw(dev); ch->hw.tf_read = ata_serverworks_tf_read; ch->hw.tf_write = ata_serverworks_tf_write; #ifdef __powerpc__ ch->hw.status = ata_serverworks_status; + + /* Make sure that our interrupt is edge triggered */ + powerpc_config_intr(bus_get_resource_start(device_get_parent(dev), + SYS_RES_IRQ, 0), INTR_TRIGGER_EDGE, INTR_POLARITY_HIGH); #endif + if (ctlr->chip->chipid == ATA_K2) { + /* + * The revision 1 K2 SATA controller has interesting bugs. Patch them. + * These magic numbers regulate interrupt delivery in the first few + * cases and are pure magic in the last case. + * + * Values obtained from the Darwin driver. + */ + + ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, 0x04); + ATA_IDX_OUTL(ch, ATA_SERROR, 0xffffffff); + ATA_IDX_OUTL(ch, ATA_SCONTROL, 0x00000300); + ATA_OUTL(ctlr->r_res2, ch_offset + 0x88, 0); + ATA_OUTL(ctlr->r_res2, ch_offset + 0x80, + ATA_INL(ctlr->r_res2, ch_offset + 0x80) & ~0x00040000); + } + /* chip does not reliably do 64K DMA transfers */ ch->dma.max_iosize = 64 * DEV_BSIZE; @@ -228,9 +261,8 @@ static void ata_serverworks_tf_read(struct ata_request *request) { struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { u_int16_t temp; request->u.ata.count = ATA_IDX_INW(ch, ATA_COUNT); @@ -257,9 +289,11 @@ static void ata_serverworks_tf_write(struct ata_request *request) { struct ata_channel *ch = device_get_softc(request->parent); +#ifndef ATA_CAM struct ata_device *atadev = device_get_softc(request->dev); +#endif - if (atadev->flags & ATA_D_48BIT_ACTIVE) { + if (request->flags & ATA_R_48BIT) { ATA_IDX_OUTW(ch, ATA_FEATURE, request->u.ata.feature); ATA_IDX_OUTW(ch, ATA_COUNT, request->u.ata.count); ATA_IDX_OUTW(ch, ATA_SECTOR, ((request->u.ata.lba >> 16) & 0xff00) | @@ -268,11 +302,12 @@ ata_serverworks_tf_write(struct ata_request *request) ((request->u.ata.lba >> 8) & 0x00ff)); ATA_IDX_OUTW(ch, ATA_CYL_MSB, ((request->u.ata.lba >> 32) & 0xff00) | ((request->u.ata.lba >> 16) & 0x00ff)); - ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(atadev->unit)); + ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(request->unit)); } else { ATA_IDX_OUTW(ch, ATA_FEATURE, request->u.ata.feature); ATA_IDX_OUTW(ch, ATA_COUNT, request->u.ata.count); +#ifndef ATA_CAM if (atadev->flags & ATA_D_USE_CHS) { int heads, sectors; @@ -289,79 +324,81 @@ ata_serverworks_tf_write(struct ata_request *request) (request->u.ata.lba / (sectors * heads))); ATA_IDX_OUTW(ch, ATA_CYL_MSB, (request->u.ata.lba / (sectors * heads)) >> 8); - ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit) | + ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(request->unit) | (((request->u.ata.lba% (sectors * heads)) / sectors) & 0xf)); } else { +#endif ATA_IDX_OUTW(ch, ATA_SECTOR, request->u.ata.lba); ATA_IDX_OUTW(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTW(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); ATA_IDX_OUTW(ch, ATA_DRIVE, - ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit) | + ATA_D_IBM | ATA_D_LBA | ATA_DEV(request->unit) | ((request->u.ata.lba >> 24) & 0x0f)); +#ifndef ATA_CAM } +#endif } } -static void -ata_serverworks_setmode(device_t dev, int mode) +static int +ata_serverworks_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int offset = (devno ^ 0x01) << 3; - int error; - u_int8_t piotimings[] = { 0x5d, 0x47, 0x34, 0x22, 0x20, 0x34, 0x22, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; - u_int8_t dmatimings[] = { 0x77, 0x21, 0x20 }; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int offset = (devno ^ 0x01) << 3; + int piomode; + u_int8_t piotimings[] = { 0x5d, 0x47, 0x34, 0x22, 0x20 }; + u_int8_t dmatimings[] = { 0x77, 0x21, 0x20 }; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - - mode = ata_check_80pin(dev, mode); - - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { + mode = min(mode, ctlr->chip->max_dma); if (mode >= ATA_UDMA0) { - pci_write_config(gparent, 0x56, - (pci_read_config(gparent, 0x56, 2) & + /* Set UDMA mode, enable UDMA, set WDMA2/PIO4 */ + pci_write_config(parent, 0x56, + (pci_read_config(parent, 0x56, 2) & ~(0xf << (devno << 2))) | ((mode & ATA_MODE_MASK) << (devno << 2)), 2); - pci_write_config(gparent, 0x54, - pci_read_config(gparent, 0x54, 1) | + pci_write_config(parent, 0x54, + pci_read_config(parent, 0x54, 1) | (0x01 << devno), 1); - pci_write_config(gparent, 0x44, - (pci_read_config(gparent, 0x44, 4) & + pci_write_config(parent, 0x44, + (pci_read_config(parent, 0x44, 4) & ~(0xff << offset)) | (dmatimings[2] << offset), 4); - } - else if (mode >= ATA_WDMA0) { - pci_write_config(gparent, 0x54, - pci_read_config(gparent, 0x54, 1) & + piomode = ATA_PIO4; + } else if (mode >= ATA_WDMA0) { + /* Disable UDMA, set WDMA mode and timings, calculate PIO. */ + pci_write_config(parent, 0x54, + pci_read_config(parent, 0x54, 1) & ~(0x01 << devno), 1); - pci_write_config(gparent, 0x44, - (pci_read_config(gparent, 0x44, 4) & + pci_write_config(parent, 0x44, + (pci_read_config(parent, 0x44, 4) & ~(0xff << offset)) | (dmatimings[mode & ATA_MODE_MASK] << offset), 4); - } - else - pci_write_config(gparent, 0x54, - pci_read_config(gparent, 0x54, 1) & + piomode = (mode == ATA_WDMA0) ? ATA_PIO0 : + (mode == ATA_WDMA1) ? ATA_PIO3 : ATA_PIO4; + } else { + /* Disable UDMA, set requested PIO. */ + pci_write_config(parent, 0x54, + pci_read_config(parent, 0x54, 1) & ~(0x01 << devno), 1); - - pci_write_config(gparent, 0x40, - (pci_read_config(gparent, 0x40, 4) & + piomode = mode; + } + /* Set PIO mode and timings, calculated above. */ + if (ctlr->chip->cfg1 != SWKS_33) { + pci_write_config(parent, 0x4a, + (pci_read_config(parent, 0x4a, 2) & + ~(0xf << (devno << 2))) | + ((piomode - ATA_PIO0) << (devno<<2)),2); + } + pci_write_config(parent, 0x40, + (pci_read_config(parent, 0x40, 4) & ~(0xff << offset)) | - (piotimings[ata_mode2idx(mode)] << offset), 4); - atadev->mode = mode; - } + (piotimings[ata_mode2idx(piomode)] << offset), 4); + return (mode); } ATA_DECLARE_DRIVER(ata_serverworks); diff --git a/sys/dev/ata/chipsets/ata-siliconimage.c b/sys/dev/ata/chipsets/ata-siliconimage.c index 232592e071a2..081bee5b9a37 100644 --- a/sys/dev/ata/chipsets/ata-siliconimage.c +++ b/sys/dev/ata/chipsets/ata-siliconimage.c @@ -54,12 +54,12 @@ __FBSDID("$FreeBSD$"); /* local prototypes */ static int ata_cmd_ch_attach(device_t dev); static int ata_cmd_status(device_t dev); -static void ata_cmd_setmode(device_t dev, int mode); +static int ata_cmd_setmode(device_t dev, int target, int mode); static int ata_sii_ch_attach(device_t dev); static int ata_sii_ch_detach(device_t dev); static int ata_sii_status(device_t dev); static void ata_sii_reset(device_t dev); -static void ata_sii_setmode(device_t dev, int mode); +static int ata_sii_setmode(device_t dev, int target, int mode); static int ata_siiprb_ch_attach(device_t dev); static int ata_siiprb_ch_detach(device_t dev); static int ata_siiprb_status(device_t dev); @@ -145,6 +145,7 @@ ata_sii_chipinit(device_t dev) ctlr->ch_detach = ata_siiprb_ch_detach; ctlr->reset = ata_siiprb_reset; ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; ctlr->channels = (ctlr->chip->cfg2 == SII_4CH) ? 4 : 2; /* reset controller */ @@ -193,6 +194,7 @@ ata_sii_chipinit(device_t dev) if (ctlr->chip->max_dma >= ATA_SA150) { ctlr->reset = ata_sii_reset; ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; } else ctlr->setmode = ata_sii_setmode; @@ -246,59 +248,37 @@ ata_cmd_status(device_t dev) return 0; } -static void -ata_cmd_setmode(device_t dev, int mode) +static int +ata_cmd_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; - - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - - mode = ata_check_80pin(dev, mode); - - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; int treg = 0x54 + ((devno < 3) ? (devno << 1) : 7); int ureg = ch->unit ? 0x7b : 0x73; - - if (mode >= ATA_UDMA0) { - int udmatimings[][2] = { { 0x31, 0xc2 }, { 0x21, 0x82 }, + int piomode; + uint8_t piotimings[] = { 0xa9, 0x57, 0x44, 0x32, 0x3f, 0x87, 0x32, 0x3f }; + uint8_t udmatimings[][2] = { { 0x31, 0xc2 }, { 0x21, 0x82 }, { 0x11, 0x42 }, { 0x25, 0x8a }, { 0x15, 0x4a }, { 0x05, 0x0a } }; - u_int8_t umode = pci_read_config(gparent, ureg, 1); + mode = min(mode, ctlr->chip->max_dma); + if (mode >= ATA_UDMA0) { + u_int8_t umode = pci_read_config(parent, ureg, 1); - umode &= ~(atadev->unit == ATA_MASTER ? 0x35 : 0xca); - umode |= udmatimings[mode & ATA_MODE_MASK][atadev->unit]; - pci_write_config(gparent, ureg, umode, 1); + umode &= ~(target == 0 ? 0x35 : 0xca); + umode |= udmatimings[mode & ATA_MODE_MASK][target]; + pci_write_config(parent, ureg, umode, 1); + piomode = ATA_PIO4; + } else { + pci_write_config(parent, ureg, + pci_read_config(parent, ureg, 1) & + ~(target == 0 ? 0x35 : 0xca), 1); + piomode = mode; } - else if (mode >= ATA_WDMA0) { - int dmatimings[] = { 0x87, 0x32, 0x3f }; - - pci_write_config(gparent, treg, dmatimings[mode & ATA_MODE_MASK],1); - pci_write_config(gparent, ureg, - pci_read_config(gparent, ureg, 1) & - ~(atadev->unit == ATA_MASTER ? 0x35 : 0xca), 1); - } - else { - int piotimings[] = { 0xa9, 0x57, 0x44, 0x32, 0x3f }; - pci_write_config(gparent, treg, - piotimings[(mode & ATA_MODE_MASK) - ATA_PIO0], 1); - pci_write_config(gparent, ureg, - pci_read_config(gparent, ureg, 1) & - ~(atadev->unit == ATA_MASTER ? 0x35 : 0xca), 1); - } - atadev->mode = mode; - } + pci_write_config(parent, treg, piotimings[ata_mode2idx(piomode)], 1); + return (mode); } static int @@ -335,6 +315,7 @@ ata_sii_ch_attach(device_t dev) ch->r_io[ATA_SCONTROL].res = ctlr->r_res2; ch->r_io[ATA_SCONTROL].offset = 0x100 + (unit01 << 7) + (unit10 << 8); ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; /* enable PHY state change interrupt */ ATA_OUTL(ctlr->r_res2, 0x148 + (unit01 << 7) + (unit10 << 8),(1 << 16)); @@ -348,6 +329,8 @@ ata_sii_ch_attach(device_t dev) ata_pci_hw(dev); ch->hw.status = ata_sii_status; + if (ctlr->chip->cfg2 & SII_SETCLK) + ch->flags |= ATA_CHECKS_CABLE; return 0; } @@ -385,69 +368,53 @@ ata_sii_reset(device_t dev) ata_generic_reset(dev); } -static void -ata_sii_setmode(device_t dev, int mode) +static int +ata_sii_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int rego = (ch->unit << 4) + (atadev->unit << 1); - int mreg = ch->unit ? 0x84 : 0x80; - int mask = 0x03 << (atadev->unit << 2); - int mval = pci_read_config(gparent, mreg, 1) & ~mask; - int error; - - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - - if (ctlr->chip->cfg2 & SII_SETCLK) { - if (mode > ATA_UDMA2 && (pci_read_config(gparent, 0x79, 1) & - (ch->unit ? 0x02 : 0x01))) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; - } - } - else - mode = ata_check_80pin(dev, mode); - - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (error) - return; - - if (mode >= ATA_UDMA0) { - u_int8_t udmatimings[] = { 0xf, 0xb, 0x7, 0x5, 0x3, 0x2, 0x1 }; - u_int8_t ureg = 0xac + rego; - - pci_write_config(gparent, mreg, - mval | (0x03 << (atadev->unit << 2)), 1); - pci_write_config(gparent, ureg, - (pci_read_config(gparent, ureg, 1) & ~0x3f) | - udmatimings[mode & ATA_MODE_MASK], 1); - - } - else if (mode >= ATA_WDMA0) { - u_int8_t dreg = 0xa8 + rego; - u_int16_t dmatimings[] = { 0x2208, 0x10c2, 0x10c1 }; - - pci_write_config(gparent, mreg, - mval | (0x02 << (atadev->unit << 2)), 1); - pci_write_config(gparent, dreg, dmatimings[mode & ATA_MODE_MASK], 2); - - } - else { + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int rego = (ch->unit << 4) + (target << 1); + int mreg = ch->unit ? 0x84 : 0x80; + int mask = 0x03 << (target << 2); + int mval = pci_read_config(parent, mreg, 1) & ~mask; + int piomode; u_int8_t preg = 0xa4 + rego; + u_int8_t dreg = 0xa8 + rego; + u_int8_t ureg = 0xac + rego; u_int16_t piotimings[] = { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1 }; + u_int16_t dmatimings[] = { 0x2208, 0x10c2, 0x10c1 }; + u_int8_t udmatimings[] = { 0xf, 0xb, 0x7, 0x5, 0x3, 0x2, 0x1 }; - pci_write_config(gparent, mreg, - mval | (0x01 << (atadev->unit << 2)), 1); - pci_write_config(gparent, preg, piotimings[mode & ATA_MODE_MASK], 2); - } - atadev->mode = mode; + mode = min(mode, ctlr->chip->max_dma); + + if (ctlr->chip->cfg2 & SII_SETCLK) { + if (mode > ATA_UDMA2 && (pci_read_config(parent, 0x79, 1) & + (ch->unit ? 0x02 : 0x01))) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } + } + if (mode >= ATA_UDMA0) { + pci_write_config(parent, mreg, + mval | (0x03 << (target << 2)), 1); + pci_write_config(parent, ureg, + (pci_read_config(parent, ureg, 1) & ~0x3f) | + udmatimings[mode & ATA_MODE_MASK], 1); + piomode = ATA_PIO4; + } else if (mode >= ATA_WDMA0) { + pci_write_config(parent, mreg, + mval | (0x02 << (target << 2)), 1); + pci_write_config(parent, dreg, dmatimings[mode & ATA_MODE_MASK], 2); + piomode = (mode == ATA_WDMA0) ? ATA_PIO0 : + (mode == ATA_WDMA1) ? ATA_PIO3 : ATA_PIO4; + } else { + pci_write_config(parent, mreg, + mval | (0x01 << (target << 2)), 1); + piomode = mode; + } + pci_write_config(parent, preg, piotimings[ata_mode2idx(piomode)], 2); + return (mode); } @@ -457,7 +424,7 @@ struct ata_siiprb_dma_prdentry { u_int32_t control; } __packed; -#define ATA_SIIPRB_DMA_ENTRIES 125 +#define ATA_SIIPRB_DMA_ENTRIES 129 struct ata_siiprb_ata_command { struct ata_siiprb_dma_prdentry prd[ATA_SIIPRB_DMA_ENTRIES]; } __packed; @@ -504,7 +471,8 @@ ata_siiprb_ch_attach(device_t dev) ch->hw.softreset = ata_siiprb_softreset; ch->hw.pm_read = ata_siiprb_pm_read; ch->hw.pm_write = ata_siiprb_pm_write; - + ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; return 0; } @@ -542,7 +510,7 @@ ata_siiprb_status(device_t dev) static int ata_siiprb_begin_transaction(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); struct ata_siiprb_command *prb; struct ata_siiprb_dma_prdentry *prd; @@ -556,28 +524,25 @@ ata_siiprb_begin_transaction(struct ata_request *request) } /* get a piece of the workspace for this request */ - prb = (struct ata_siiprb_command *) - (ch->dma.work + (sizeof(struct ata_siiprb_command) * request->tag)); + prb = (struct ata_siiprb_command *)ch->dma.work; /* clear the prb structure */ bzero(prb, sizeof(struct ata_siiprb_command)); /* setup the FIS for this request */ if (!ata_request2fis_h2d(request, &prb->fis[0])) { - device_printf(request->dev, "setting up SATA FIS failed\n"); + device_printf(request->parent, "setting up SATA FIS failed\n"); request->result = EIO; return ATA_OP_FINISHED; } /* setup transfer type */ if (request->flags & ATA_R_ATAPI) { - struct ata_device *atadev = device_get_softc(request->dev); - bcopy(request->u.atapi.ccb, prb->u.atapi.ccb, 16); - if ((atadev->param.config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) - ATA_OUTL(ctlr->r_res2, 0x1004 + offset, 0x00000020); - else + if (request->flags & ATA_R_ATAPI16) ATA_OUTL(ctlr->r_res2, 0x1000 + offset, 0x00000020); + else + ATA_OUTL(ctlr->r_res2, 0x1004 + offset, 0x00000020); if (request->flags & ATA_R_READ) prb->control = htole16(0x0010); if (request->flags & ATA_R_WRITE) @@ -590,19 +555,16 @@ ata_siiprb_begin_transaction(struct ata_request *request) /* if request moves data setup and load SG list */ if (request->flags & (ATA_R_READ | ATA_R_WRITE)) { if (ch->dma.load(request, prd, NULL)) { - device_printf(request->dev, "setting up DMA failed\n"); + device_printf(request->parent, "setting up DMA failed\n"); request->result = EIO; return ATA_OP_FINISHED; } } /* activate the prb */ - prb_bus = ch->dma.work_bus + - (sizeof(struct ata_siiprb_command) * request->tag); - ATA_OUTL(ctlr->r_res2, - 0x1c00 + offset + (request->tag * sizeof(u_int64_t)), prb_bus); - ATA_OUTL(ctlr->r_res2, - 0x1c04 + offset + (request->tag * sizeof(u_int64_t)), prb_bus>>32); + prb_bus = ch->dma.work_bus; + ATA_OUTL(ctlr->r_res2, 0x1c00 + offset, prb_bus); + ATA_OUTL(ctlr->r_res2, 0x1c04 + offset, prb_bus>>32); /* start the timeout */ callout_reset(&request->callout, request->timeout * hz, @@ -613,7 +575,7 @@ ata_siiprb_begin_transaction(struct ata_request *request) static int ata_siiprb_end_transaction(struct ata_request *request) { - struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); + struct ata_pci_controller *ctlr=device_get_softc(device_get_parent(request->parent)); struct ata_channel *ch = device_get_softc(request->parent); struct ata_siiprb_command *prb; int offset = ch->unit * 0x2000; @@ -623,7 +585,7 @@ ata_siiprb_end_transaction(struct ata_request *request) callout_stop(&request->callout); prb = (struct ata_siiprb_command *) - ((u_int8_t *)rman_get_virtual(ctlr->r_res2)+(request->tag << 7)+offset); + ((u_int8_t *)rman_get_virtual(ctlr->r_res2) + offset); /* any controller errors flagged ? */ if ((error = ATA_INL(ctlr->r_res2, 0x1024 + offset))) { @@ -659,12 +621,10 @@ ata_siiprb_end_transaction(struct ata_request *request) /* on control commands read back registers to the request struct */ if (request->flags & ATA_R_CONTROL) { - struct ata_device *atadev = device_get_softc(request->dev); - request->u.ata.count = prb->fis[12] | ((u_int16_t)prb->fis[13] << 8); request->u.ata.lba = prb->fis[4] | ((u_int64_t)prb->fis[5] << 8) | ((u_int64_t)prb->fis[6] << 16); - if (atadev->flags & ATA_D_48BIT_ACTIVE) + if (request->flags & ATA_R_48BIT) request->u.ata.lba |= ((u_int64_t)prb->fis[8] << 24) | ((u_int64_t)prb->fis[9] << 32) | ((u_int64_t)prb->fis[10] << 40); @@ -757,9 +717,9 @@ ata_siiprb_pm_write(device_t dev, int port, int reg, u_int32_t value) prb->fis[3] = reg; prb->fis[7] = port; prb->fis[12] = value & 0xff; - prb->fis[4] = (value >> 8) & 0xff;; - prb->fis[5] = (value >> 16) & 0xff;; - prb->fis[6] = (value >> 24) & 0xff;; + prb->fis[4] = (value >> 8) & 0xff; + prb->fis[5] = (value >> 16) & 0xff; + prb->fis[6] = (value >> 24) & 0xff; if (ata_siiprb_issue_cmd(dev)) { device_printf(dev, "error writing PM port\n"); return ATA_E_ABORT; @@ -907,6 +867,7 @@ ata_siiprb_dmainit(device_t dev) /* note start and stop are not used here */ ch->dma.setprd = ata_siiprb_dmasetprd; ch->dma.max_address = BUS_SPACE_MAXADDR; + ch->dma.max_iosize = (ATA_SIIPRB_DMA_ENTRIES - 1) * PAGE_SIZE; } ATA_DECLARE_DRIVER(ata_sii); diff --git a/sys/dev/ata/chipsets/ata-sis.c b/sys/dev/ata/chipsets/ata-sis.c index 5c74e56edf20..80225053c4d0 100644 --- a/sys/dev/ata/chipsets/ata-sis.c +++ b/sys/dev/ata/chipsets/ata-sis.c @@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$"); static int ata_sis_chipinit(device_t dev); static int ata_sis_ch_attach(device_t dev); static void ata_sis_reset(device_t dev); -static void ata_sis_setmode(device_t dev, int mode); +static int ata_sis_setmode(device_t dev, int target, int mode); /* misc defines */ #define SIS_33 1 @@ -191,6 +191,7 @@ ata_sis_chipinit(device_t dev) ctlr->reset = ata_sis_reset; } ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; return 0; default: return ENXIO; @@ -217,6 +218,7 @@ ata_sis_ch_attach(device_t dev) ch->r_io[ATA_SCONTROL].res = ctlr->r_res2; ch->r_io[ATA_SCONTROL].offset = 0x08 + offset; ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; /* XXX SOS PHY hotplug handling missing in SiS chip ?? */ /* XXX SOS unknown how to enable PHY state change interrupt */ @@ -230,40 +232,30 @@ ata_sis_reset(device_t dev) ata_generic_reset(dev); } -static void -ata_sis_setmode(device_t dev, int mode) +static int +ata_sis_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + atadev->unit; - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); + mode = min(mode, ctlr->chip->max_dma); - if (ctlr->chip->cfg1 == SIS_133NEW) { - if (mode > ATA_UDMA2 && - pci_read_config(gparent, ch->unit ? 0x52 : 0x50,2) & 0x8000) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; - } - } - else { - if (mode > ATA_UDMA2 && - pci_read_config(gparent, 0x48, 1)&(ch->unit ? 0x20 : 0x10)) { - ata_print_cable(dev, "controller"); - mode = ATA_UDMA2; - } - } + if (ctlr->chip->cfg1 == SIS_133NEW) { + if (mode > ATA_UDMA2 && + pci_read_config(parent, ch->unit ? 0x52 : 0x50,2) & 0x8000) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } + } else { + if (mode > ATA_UDMA2 && + pci_read_config(parent, 0x48, 1)&(ch->unit ? 0x20 : 0x10)) { + ata_print_cable(dev, "controller"); + mode = ATA_UDMA2; + } + } - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", - ata_mode2str(mode), ctlr->chip->text); - if (!error) { switch (ctlr->chip->cfg1) { case SIS_133NEW: { u_int32_t timings[] = @@ -272,8 +264,8 @@ ata_sis_setmode(device_t dev, int mode) 0x0509347c, 0x0509325c, 0x0509323c, 0x0509322c, 0x0509321c}; u_int32_t reg; - reg = (pci_read_config(gparent, 0x57, 1)&0x40?0x70:0x40)+(devno<<2); - pci_write_config(gparent, reg, timings[ata_mode2idx(mode)], 4); + reg = (pci_read_config(parent, 0x57, 1)&0x40?0x70:0x40)+(devno<<2); + pci_write_config(parent, reg, timings[ata_mode2idx(mode)], 4); break; } case SIS_133OLD: { @@ -283,7 +275,7 @@ ata_sis_setmode(device_t dev, int mode) u_int16_t reg = 0x40 + (devno << 1); - pci_write_config(gparent, reg, timings[ata_mode2idx(mode)], 2); + pci_write_config(parent, reg, timings[ata_mode2idx(mode)], 2); break; } case SIS_100NEW: { @@ -292,7 +284,7 @@ ata_sis_setmode(device_t dev, int mode) 0x0031, 0x8b31, 0x8731, 0x8531, 0x8431, 0x8231, 0x8131 }; u_int16_t reg = 0x40 + (devno << 1); - pci_write_config(gparent, reg, timings[ata_mode2idx(mode)], 2); + pci_write_config(parent, reg, timings[ata_mode2idx(mode)], 2); break; } case SIS_100OLD: @@ -303,12 +295,11 @@ ata_sis_setmode(device_t dev, int mode) 0x0301, 0xf301, 0xd301, 0xb301, 0xa301, 0x9301, 0x8301 }; u_int16_t reg = 0x40 + (devno << 1); - pci_write_config(gparent, reg, timings[ata_mode2idx(mode)], 2); + pci_write_config(parent, reg, timings[ata_mode2idx(mode)], 2); break; } } - atadev->mode = mode; - } + return (mode); } ATA_DECLARE_DRIVER(ata_sis); diff --git a/sys/dev/ata/chipsets/ata-via.c b/sys/dev/ata/chipsets/ata-via.c index daed0db13af2..ec22020a0e78 100644 --- a/sys/dev/ata/chipsets/ata-via.c +++ b/sys/dev/ata/chipsets/ata-via.c @@ -56,9 +56,12 @@ static int ata_via_chipinit(device_t dev); static int ata_via_ch_attach(device_t dev); static int ata_via_ch_detach(device_t dev); static void ata_via_reset(device_t dev); -static void ata_via_old_setmode(device_t dev, int mode); +static int ata_via_old_setmode(device_t dev, int target, int mode); static void ata_via_southbridge_fixup(device_t dev); -static void ata_via_new_setmode(device_t dev, int mode); +static int ata_via_new_setmode(device_t dev, int target, int mode); +static int ata_via_sata_ch_attach(device_t dev); +static int ata_via_sata_getrev(device_t dev, int target); +static int ata_via_sata_setmode(device_t dev, int target, int mode); /* misc defines */ #define VIA33 0 @@ -70,6 +73,7 @@ static void ata_via_new_setmode(device_t dev, int mode); #define VIABUG 0x02 #define VIABAR 0x04 #define VIAAHCI 0x08 +#define VIASATA 0x10 /* @@ -95,7 +99,12 @@ ata_via_probe(device_t dev) { ATA_VIA8237, 0x00, VIA133, 0x00, ATA_UDMA6, "8237" }, { ATA_VIA8237A, 0x00, VIA133, 0x00, ATA_UDMA6, "8237A" }, { ATA_VIA8237S, 0x00, VIA133, 0x00, ATA_UDMA6, "8237S" }, + { ATA_VIA8237_5372, 0x00, VIA133, 0x00, ATA_UDMA6, "8237" }, + { ATA_VIA8237_7372, 0x00, VIA133, 0x00, ATA_UDMA6, "8237" }, { ATA_VIA8251, 0x00, VIA133, 0x00, ATA_UDMA6, "8251" }, + { ATA_VIACX700, 0x00, VIA133, VIASATA, ATA_SA150, "CX700" }, + { ATA_VIAVX800, 0x00, VIA133, VIASATA, ATA_SA150, "VX800" }, + { ATA_VIAVX855, 0x00, VIA133, 0x00, ATA_UDMA6, "VX855" }, { 0, 0, 0, 0, 0, 0 }}; static struct ata_chip_id new_ids[] = {{ ATA_VIA6410, 0x00, 0, 0x00, ATA_UDMA6, "6410" }, @@ -103,13 +112,17 @@ ata_via_probe(device_t dev) { ATA_VIA6421, 0x00, 6, VIABAR, ATA_SA150, "6421" }, { ATA_VIA8237A, 0x00, 7, 0x00, ATA_SA150, "8237A" }, { ATA_VIA8237S, 0x00, 7, 0x00, ATA_SA150, "8237S" }, + { ATA_VIA8237_5372, 0x00, 7, 0x00, ATA_SA300, "8237" }, + { ATA_VIA8237_7372, 0x00, 7, 0x00, ATA_SA300, "8237" }, { ATA_VIA8251, 0x00, 0, VIAAHCI, ATA_SA300, "8251" }, { 0, 0, 0, 0, 0, 0 }}; if (pci_get_vendor(dev) != ATA_VIA_ID) return ENXIO; - if (pci_get_devid(dev) == ATA_VIA82C571) { + if (pci_get_devid(dev) == ATA_VIA82C571 || + pci_get_devid(dev) == ATA_VIACX700IDE || + pci_get_devid(dev) == ATA_VIASATAIDE) { if (!(ctlr->chip = ata_find_chip(dev, ids, -99))) return ENXIO; } @@ -130,12 +143,21 @@ ata_via_chipinit(device_t dev) if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; - - if (ctlr->chip->max_dma >= ATA_SA150) { - /* do we have AHCI capability ? */ - if ((ctlr->chip->cfg2 == VIAAHCI) && ata_ahci_chipinit(dev) != ENXIO) - return 0; + /* AHCI SATA */ + if (ctlr->chip->cfg2 & VIAAHCI) { + if (ata_ahci_chipinit(dev) != ENXIO) + return (0); + } + /* 2 SATA without SATA registers on first channel + 1 PATA on second */ + if (ctlr->chip->cfg2 & VIASATA) { + ctlr->ch_attach = ata_via_sata_ch_attach; + ctlr->setmode = ata_via_sata_setmode; + ctlr->getrev = ata_via_sata_getrev; + return 0; + } + /* Legacy SATA/SATA+PATA with SATA registers in BAR(5). */ + if (ctlr->chip->max_dma >= ATA_SA150) { ctlr->r_type2 = SYS_RES_IOPORT; ctlr->r_rid2 = PCIR_BAR(5); if ((ctlr->r_res2 = bus_alloc_resource_any(dev, ctlr->r_type2, @@ -144,13 +166,12 @@ ata_via_chipinit(device_t dev) ctlr->ch_detach = ata_via_ch_detach; ctlr->reset = ata_via_reset; } - if (ctlr->chip->cfg2 & VIABAR) { ctlr->channels = 3; ctlr->setmode = ata_via_new_setmode; - } - else + } else ctlr->setmode = ata_sata_setmode; + ctlr->getrev = ata_sata_getrev; return 0; } @@ -229,6 +250,7 @@ ata_via_ch_attach(device_t dev) ch->r_io[ATA_SCONTROL].res = ctlr->r_res2; ch->r_io[ATA_SCONTROL].offset = 0x08 + (ch->unit << ctlr->chip->cfg1); ch->flags |= ATA_NO_SLAVE; + ch->flags |= ATA_SATA; /* XXX SOS PHY hotplug handling missing in VIA chip ?? */ /* XXX SOS unknown how to enable PHY state change interrupt */ @@ -273,75 +295,63 @@ ata_via_reset(device_t dev) ata_generic_reset(dev); } -static void -ata_via_new_setmode(device_t dev, int mode) +static int +ata_via_new_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); - if ((ctlr->chip->cfg2 & VIABAR) && (ch->unit > 1)) { - u_int8_t pio_timings[] = { 0xa8, 0x65, 0x65, 0x32, 0x20, - 0x65, 0x32, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; - u_int8_t dma_timings[] = { 0xee, 0xe8, 0xe6, 0xe4, 0xe2, 0xe1, 0xe0 }; + if ((ctlr->chip->cfg2 & VIABAR) && (ch->unit > 1)) { + int piomode; + u_int8_t pio_timings[] = { 0xa8, 0x65, 0x65, 0x32, 0x20 }; + u_int8_t dma_timings[] = { 0xee, 0xe8, 0xe6, 0xe4, 0xe2, 0xe1, 0xe0 }; - mode = ata_check_80pin(dev, ata_limit_mode(dev, mode, ATA_UDMA6)); - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", ata_mode2str(mode), - ctlr->chip->text); - if (!error) { - pci_write_config(gparent, 0xab, pio_timings[ata_mode2idx(mode)], 1); - if (mode >= ATA_UDMA0) - pci_write_config(gparent, 0xb3, + /* This chip can't do WDMA. */ + if (mode >= ATA_WDMA0 && mode < ATA_UDMA0) + mode = ATA_PIO4; + if (mode >= ATA_UDMA0) { + pci_write_config(parent, 0xb3, dma_timings[mode & ATA_MODE_MASK], 1); - atadev->mode = mode; - } - } - else - ata_sata_setmode(dev, mode); + piomode = ATA_PIO4; + } else + piomode = mode; + pci_write_config(parent, 0xab, pio_timings[ata_mode2idx(piomode)], 1); + } else + mode = ata_sata_setmode(dev, target, mode); + return (mode); } -static void -ata_via_old_setmode(device_t dev, int mode) +static int +ata_via_old_setmode(device_t dev, int target, int mode) { - device_t gparent = GRANDPARENT(dev); - struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - struct ata_device *atadev = device_get_softc(dev); - u_int8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; - int modes[][7] = { - { 0xc2, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00 }, /* VIA ATA33 */ - { 0xee, 0xec, 0xea, 0xe9, 0xe8, 0x00, 0x00 }, /* VIA ATA66 */ - { 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0x00 }, /* VIA ATA100 */ - { 0xf7, 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0 } }; /* VIA ATA133 */ - int devno = (ch->unit << 1) + atadev->unit; - int reg = 0x53 - devno; - int error; + device_t parent = device_get_parent(dev); + struct ata_pci_controller *ctlr = device_get_softc(parent); + struct ata_channel *ch = device_get_softc(dev); + int devno = (ch->unit << 1) + target; + int reg = 0x53 - devno; + int piomode; + uint8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0xa8, 0x22, 0x20 }; + uint8_t modes[][7] = { + { 0xc2, 0xc1, 0xc0, 0x00, 0x00, 0x00, 0x00 }, /* VIA ATA33 */ + { 0xee, 0xec, 0xea, 0xe9, 0xe8, 0x00, 0x00 }, /* VIA ATA66 */ + { 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0, 0x00 }, /* VIA ATA100 */ + { 0xf7, 0xf7, 0xf6, 0xf4, 0xf2, 0xf1, 0xf0 } }; /* VIA ATA133 */ - mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); - mode = ata_check_80pin(dev, mode); - - error = ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode); - if (bootverbose) - device_printf(dev, "%ssetting %s on %s chip\n", - (error) ? "FAILURE " : "", ata_mode2str(mode), - ctlr->chip->text); - if (!error) { - if (ctlr->chip->cfg1 != VIA133) - pci_write_config(gparent, reg - 0x08,timings[ata_mode2idx(mode)],1); - if (mode >= ATA_UDMA0) - pci_write_config(gparent, reg, + mode = min(mode, ctlr->chip->max_dma); + /* Set UDMA timings */ + if (mode >= ATA_UDMA0) { + pci_write_config(parent, reg, modes[ctlr->chip->cfg1][mode & ATA_MODE_MASK], 1); - else - pci_write_config(gparent, reg, 0x8b, 1); - atadev->mode = mode; - } + piomode = ATA_PIO4; + } else { + pci_write_config(parent, reg, 0x8b, 1); + piomode = mode; + } + /* Set WDMA/PIO timings */ + if (ctlr->chip->cfg1 != VIA133) + pci_write_config(parent, reg - 0x08,timings[ata_mode2idx(piomode)], 1); + return (mode); } static void @@ -372,5 +382,37 @@ ata_via_southbridge_fixup(device_t dev) free(children, M_TEMP); } +static int +ata_via_sata_ch_attach(device_t dev) +{ + struct ata_channel *ch = device_get_softc(dev); + + if (ata_pci_ch_attach(dev)) + return ENXIO; + if (ch->unit == 0) + ch->flags |= ATA_SATA; + return (0); +} + +static int +ata_via_sata_getrev(device_t dev, int target) +{ + struct ata_channel *ch = device_get_softc(dev); + + if (ch->unit == 0) + return (1); + return (0); +} + +static int +ata_via_sata_setmode(device_t dev, int target, int mode) +{ + struct ata_channel *ch = device_get_softc(dev); + + if (ch->unit == 0) + return (mode); + return (ata_via_old_setmode(dev, target, mode)); +} + ATA_DECLARE_DRIVER(ata_via); MODULE_DEPEND(ata_via, ata_ahci, 1, 1, 1); diff --git a/sys/dev/ath/ath_hal/ah.h b/sys/dev/ath/ath_hal/ah.h index f7434f87eef5..26288489a8cf 100644 --- a/sys/dev/ath/ath_hal/ah.h +++ b/sys/dev/ath/ath_hal/ah.h @@ -638,7 +638,11 @@ struct ath_hal { HAL_BOOL longCal, HAL_BOOL *isCalDone); HAL_BOOL __ahdecl(*ah_resetCalValid)(struct ath_hal *, const struct ieee80211_channel *); + HAL_BOOL __ahdecl(*ah_setTxPower)(struct ath_hal *, + const struct ieee80211_channel *, uint16_t *); HAL_BOOL __ahdecl(*ah_setTxPowerLimit)(struct ath_hal *, uint32_t); + HAL_BOOL __ahdecl(*ah_setBoardValues)(struct ath_hal *, + const struct ieee80211_channel *); /* Transmit functions */ HAL_BOOL __ahdecl(*ah_updateTxTrigLevel)(struct ath_hal*, diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v14.h b/sys/dev/ath/ath_hal/ah_eeprom_v14.h index 90e2c7479bb6..d2caa8087bf7 100644 --- a/sys/dev/ath/ath_hal/ah_eeprom_v14.h +++ b/sys/dev/ath/ath_hal/ah_eeprom_v14.h @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ah_eeprom_v14.h,v 1.3 2008/11/10 04:08:00 sam Exp $ + * $FreeBSD$ */ #ifndef _AH_EEPROM_V14_H_ #define _AH_EEPROM_V14_H_ @@ -76,6 +76,7 @@ #define AR5416_EEPMISC_BIG_ENDIAN 0x01 #define FREQ2FBIN(x,y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5)) #define AR5416_MAX_CHAINS 3 +#define AR5416_PWR_TABLE_OFFSET_DB -5 #define AR5416_ANT_16S 25 #define AR5416_NUM_ANT_CHAIN_FIELDS 7 diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v4k.c b/sys/dev/ath/ath_hal/ah_eeprom_v4k.c new file mode 100644 index 000000000000..03bb04c08a53 --- /dev/null +++ b/sys/dev/ath/ath_hal/ah_eeprom_v4k.c @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2009 Rui Paulo + * Copyright (c) 2008 Sam Leffler, Errno Consulting + * Copyright (c) 2008 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ +#include "opt_ah.h" + +#include "ah.h" +#include "ah_internal.h" +#include "ah_eeprom_v14.h" +#include "ah_eeprom_v4k.h" + +static HAL_STATUS +v4kEepromGet(struct ath_hal *ah, int param, void *val) +{ +#define CHAN_A_IDX 0 +#define CHAN_B_IDX 1 +#define IS_VERS(op, v) ((pBase->version & AR5416_EEP_VER_MINOR_MASK) op (v)) + HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + const MODAL_EEP4K_HEADER *pModal = &ee->ee_base.modalHeader; + const BASE_EEP4K_HEADER *pBase = &ee->ee_base.baseEepHeader; + uint32_t sum; + uint8_t *macaddr; + int i; + + switch (param) { + case AR_EEP_NFTHRESH_5: + *(int16_t *)val = pModal[0].noiseFloorThreshCh[0]; + return HAL_OK; + case AR_EEP_NFTHRESH_2: + *(int16_t *)val = pModal[1].noiseFloorThreshCh[0]; + return HAL_OK; + case AR_EEP_MACADDR: /* Get MAC Address */ + sum = 0; + macaddr = val; + for (i = 0; i < 6; i++) { + macaddr[i] = pBase->macAddr[i]; + sum += pBase->macAddr[i]; + } + if (sum == 0 || sum == 0xffff*3) { + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: bad mac address %s\n", + __func__, ath_hal_ether_sprintf(macaddr)); + return HAL_EEBADMAC; + } + return HAL_OK; + case AR_EEP_REGDMN_0: + return pBase->regDmn[0]; + case AR_EEP_REGDMN_1: + return pBase->regDmn[1]; + case AR_EEP_OPCAP: + return pBase->deviceCap; + case AR_EEP_OPMODE: + return pBase->opCapFlags; + case AR_EEP_RFSILENT: + return pBase->rfSilent; + case AR_EEP_OB_5: + return pModal[CHAN_A_IDX].ob; + case AR_EEP_DB_5: + return pModal[CHAN_A_IDX].db; + case AR_EEP_OB_2: + return pModal[CHAN_B_IDX].ob; + case AR_EEP_DB_2: + return pModal[CHAN_B_IDX].db; + case AR_EEP_TXMASK: + return pBase->txMask; + case AR_EEP_RXMASK: + return pBase->rxMask; + case AR_EEP_RXGAIN_TYPE: + return AR5416_EEP_RXGAIN_ORIG; + case AR_EEP_TXGAIN_TYPE: + return IS_VERS(>=, AR5416_EEP_MINOR_VER_19) ? + pBase->txGainType : AR5416_EEP_TXGAIN_ORIG; +#if 0 + case AR_EEP_OL_PWRCTRL: + HALASSERT(val == AH_NULL); + return pBase->openLoopPwrCntl ? HAL_OK : HAL_EIO; +#endif + case AR_EEP_AMODE: + HALASSERT(val == AH_NULL); + return pBase->opCapFlags & AR5416_OPFLAGS_11A ? + HAL_OK : HAL_EIO; + case AR_EEP_BMODE: + case AR_EEP_GMODE: + HALASSERT(val == AH_NULL); + return pBase->opCapFlags & AR5416_OPFLAGS_11G ? + HAL_OK : HAL_EIO; + case AR_EEP_32KHZCRYSTAL: + case AR_EEP_COMPRESS: + case AR_EEP_FASTFRAME: /* XXX policy decision, h/w can do it */ + case AR_EEP_WRITEPROTECT: /* NB: no write protect bit */ + HALASSERT(val == AH_NULL); + /* fall thru... */ + case AR_EEP_MAXQCU: /* NB: not in opCapFlags */ + case AR_EEP_KCENTRIES: /* NB: not in opCapFlags */ + return HAL_EIO; + case AR_EEP_AES: + case AR_EEP_BURST: + case AR_EEP_RFKILL: + case AR_EEP_TURBO5DISABLE: + case AR_EEP_TURBO2DISABLE: + HALASSERT(val == AH_NULL); + return HAL_OK; + case AR_EEP_ANTGAINMAX_2: + *(int8_t *) val = ee->ee_antennaGainMax[1]; + return HAL_OK; + case AR_EEP_ANTGAINMAX_5: + *(int8_t *) val = ee->ee_antennaGainMax[0]; + return HAL_OK; + default: + HALASSERT(0); + return HAL_EINVAL; + } +#undef IS_VERS +#undef CHAN_A_IDX +#undef CHAN_B_IDX +} + +static HAL_BOOL +v4kEepromSet(struct ath_hal *ah, int param, int v) +{ + HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + + switch (param) { + case AR_EEP_ANTGAINMAX_2: + ee->ee_antennaGainMax[1] = (int8_t) v; + return HAL_OK; + case AR_EEP_ANTGAINMAX_5: + ee->ee_antennaGainMax[0] = (int8_t) v; + return HAL_OK; + } + return HAL_EINVAL; +} + +static HAL_BOOL +v4kEepromDiag(struct ath_hal *ah, int request, + const void *args, uint32_t argsize, void **result, uint32_t *resultsize) +{ + HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + + switch (request) { + case HAL_DIAG_EEPROM: + *result = &ee->ee_base; + *resultsize = sizeof(ee->ee_base); + return AH_TRUE; + } + return AH_FALSE; +} + +/* Do structure specific swaps if Eeprom format is non native to host */ +static void +eepromSwap(struct ar5416eeprom_4k *ee) +{ + uint32_t integer, i; + uint16_t word; + MODAL_EEP4K_HEADER *pModal; + + /* convert Base Eep header */ + word = __bswap16(ee->baseEepHeader.length); + ee->baseEepHeader.length = word; + + word = __bswap16(ee->baseEepHeader.checksum); + ee->baseEepHeader.checksum = word; + + word = __bswap16(ee->baseEepHeader.version); + ee->baseEepHeader.version = word; + + word = __bswap16(ee->baseEepHeader.regDmn[0]); + ee->baseEepHeader.regDmn[0] = word; + + word = __bswap16(ee->baseEepHeader.regDmn[1]); + ee->baseEepHeader.regDmn[1] = word; + + word = __bswap16(ee->baseEepHeader.rfSilent); + ee->baseEepHeader.rfSilent = word; + + word = __bswap16(ee->baseEepHeader.blueToothOptions); + ee->baseEepHeader.blueToothOptions = word; + + word = __bswap16(ee->baseEepHeader.deviceCap); + ee->baseEepHeader.deviceCap = word; + + /* convert Modal Eep header */ + pModal = &ee->modalHeader; + + /* XXX linux/ah_osdep.h only defines __bswap32 for BE */ + integer = __bswap32(pModal->antCtrlCommon); + pModal->antCtrlCommon = integer; + + for (i = 0; i < AR5416_4K_MAX_CHAINS; i++) { + integer = __bswap32(pModal->antCtrlChain[i]); + pModal->antCtrlChain[i] = integer; + } + + for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) { + word = __bswap16(pModal->spurChans[i].spurChan); + pModal->spurChans[i].spurChan = word; + } +} + +static uint16_t +v4kEepromGetSpurChan(struct ath_hal *ah, int ix, HAL_BOOL is2GHz) +{ + HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + + HALASSERT(0 <= ix && ix < AR5416_EEPROM_MODAL_SPURS); + HALASSERT(is2GHz); + return ee->ee_base.modalHeader.spurChans[ix].spurChan; +} + +/************************************************************************** + * fbin2freq + * + * Get channel value from binary representation held in eeprom + * RETURNS: the frequency in MHz + */ +static uint16_t +fbin2freq(uint8_t fbin, HAL_BOOL is2GHz) +{ + /* + * Reserved value 0xFF provides an empty definition both as + * an fbin and as a frequency - do not convert + */ + if (fbin == AR5416_BCHAN_UNUSED) + return fbin; + return (uint16_t)((is2GHz) ? (2300 + fbin) : (4800 + 5 * fbin)); +} + +/* + * Copy EEPROM Conformance Testing Limits contents + * into the allocated space + */ +/* USE CTLS from chain zero */ +#define CTL_CHAIN 0 + +static void +v4kEepromReadCTLInfo(struct ath_hal *ah, HAL_EEPROM_v4k *ee) +{ + RD_EDGES_POWER *rep = ee->ee_rdEdgesPower; + int i, j; + + HALASSERT(AR5416_NUM_CTLS <= sizeof(ee->ee_rdEdgesPower)/NUM_EDGES); + + for (i = 0; ee->ee_base.ctlIndex[i] != 0 && i < AR5416_4K_NUM_CTLS; i++) { + for (j = 0; j < NUM_EDGES; j ++) { + /* XXX Confirm this is the right thing to do when an invalid channel is stored */ + if (ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].bChannel == AR5416_BCHAN_UNUSED) { + rep[j].rdEdge = 0; + rep[j].twice_rdEdgePower = 0; + rep[j].flag = 0; + } else { + rep[j].rdEdge = fbin2freq( + ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].bChannel, + (ee->ee_base.ctlIndex[i] & CTL_MODE_M) != CTL_11A); + rep[j].twice_rdEdgePower = MS(ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].tPowerFlag, CAL_CTL_EDGES_POWER); + rep[j].flag = MS(ee->ee_base.ctlData[i].ctlEdges[CTL_CHAIN][j].tPowerFlag, CAL_CTL_EDGES_FLAG) != 0; + } + } + rep += NUM_EDGES; + } + ee->ee_numCtls = i; + HALDEBUG(ah, HAL_DEBUG_ATTACH | HAL_DEBUG_EEPROM, + "%s Numctls = %u\n",__func__,i); +} + +/* + * Reclaim any EEPROM-related storage. + */ +static void +v4kEepromDetach(struct ath_hal *ah) +{ + HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + + ath_hal_free(ee); + AH_PRIVATE(ah)->ah_eeprom = AH_NULL; +} + +#define owl_get_eep_ver(_ee) \ + (((_ee)->ee_base.baseEepHeader.version >> 12) & 0xF) +#define owl_get_eep_rev(_ee) \ + (((_ee)->ee_base.baseEepHeader.version) & 0xFFF) + +HAL_STATUS +ath_hal_v4kEepromAttach(struct ath_hal *ah) +{ +#define NW(a) (sizeof(a) / sizeof(uint16_t)) + HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + uint16_t *eep_data, magic; + HAL_BOOL need_swap; + u_int w, off, len; + uint32_t sum; + + HALASSERT(ee == AH_NULL); + + if (!ath_hal_eepromRead(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s Error reading Eeprom MAGIC\n", __func__); + return HAL_EEREAD; + } + HALDEBUG(ah, HAL_DEBUG_ATTACH, "%s Eeprom Magic = 0x%x\n", + __func__, magic); + if (magic != AR5416_EEPROM_MAGIC) { + HALDEBUG(ah, HAL_DEBUG_ANY, "Bad magic number\n"); + return HAL_EEMAGIC; + } + + ee = ath_hal_malloc(sizeof(HAL_EEPROM_v4k)); + if (ee == AH_NULL) { + /* XXX message */ + return HAL_ENOMEM; + } + + eep_data = (uint16_t *)&ee->ee_base; + for (w = 0; w < NW(struct ar5416eeprom_4k); w++) { + off = owl_eep_start_loc + w; /* NB: AP71 starts at 0 */ + if (!ath_hal_eepromRead(ah, off, &eep_data[w])) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s eeprom read error at offset 0x%x\n", + __func__, off); + return HAL_EEREAD; + } + } + /* Convert to eeprom native eeprom endian format */ + if (isBigEndian()) { + for (w = 0; w < NW(struct ar5416eeprom_4k); w++) + eep_data[w] = __bswap16(eep_data[w]); + } + + /* + * At this point, we're in the native eeprom endian format + * Now, determine the eeprom endian by looking at byte 26?? + */ + need_swap = ((ee->ee_base.baseEepHeader.eepMisc & AR5416_EEPMISC_BIG_ENDIAN) != 0) ^ isBigEndian(); + if (need_swap) { + HALDEBUG(ah, HAL_DEBUG_ATTACH | HAL_DEBUG_EEPROM, + "Byte swap EEPROM contents.\n"); + len = __bswap16(ee->ee_base.baseEepHeader.length); + } else { + len = ee->ee_base.baseEepHeader.length; + } + len = AH_MIN(len, sizeof(struct ar5416eeprom_4k)) / sizeof(uint16_t); + + /* Apply the checksum, done in native eeprom format */ + /* XXX - Need to check to make sure checksum calculation is done + * in the correct endian format. Right now, it seems it would + * cast the raw data to host format and do the calculation, which may + * not be correct as the calculation may need to be done in the native + * eeprom format + */ + sum = 0; + for (w = 0; w < len; w++) { + sum ^= eep_data[w]; + } + /* Check CRC - Attach should fail on a bad checksum */ + if (sum != 0xffff) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "Bad EEPROM checksum 0x%x (Len=%u)\n", sum, len); + return HAL_EEBADSUM; + } + + if (need_swap) + eepromSwap(&ee->ee_base); /* byte swap multi-byte data */ + + /* swap words 0+2 so version is at the front */ + magic = eep_data[0]; + eep_data[0] = eep_data[2]; + eep_data[2] = magic; + + HALDEBUG(ah, HAL_DEBUG_ATTACH | HAL_DEBUG_EEPROM, + "%s Eeprom Version %u.%u\n", __func__, + owl_get_eep_ver(ee), owl_get_eep_rev(ee)); + + /* NB: must be after all byte swapping */ + if (owl_get_eep_ver(ee) != AR5416_EEP_VER) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "Bad EEPROM version 0x%x\n", owl_get_eep_ver(ee)); + return HAL_EEBADSUM; + } + + v4kEepromReadCTLInfo(ah, ee); /* Get CTLs */ + + AH_PRIVATE(ah)->ah_eeprom = ee; + AH_PRIVATE(ah)->ah_eeversion = ee->ee_base.baseEepHeader.version; + AH_PRIVATE(ah)->ah_eepromDetach = v4kEepromDetach; + AH_PRIVATE(ah)->ah_eepromGet = v4kEepromGet; + AH_PRIVATE(ah)->ah_eepromSet = v4kEepromSet; + AH_PRIVATE(ah)->ah_getSpurChan = v4kEepromGetSpurChan; + AH_PRIVATE(ah)->ah_eepromDiag = v4kEepromDiag; + return HAL_OK; +#undef NW +} diff --git a/sys/dev/ath/ath_hal/ah_eeprom_v4k.h b/sys/dev/ath/ath_hal/ah_eeprom_v4k.h new file mode 100644 index 000000000000..fd0c69979a42 --- /dev/null +++ b/sys/dev/ath/ath_hal/ah_eeprom_v4k.h @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2009 Rui Paulo + * Copyright (c) 2008 Sam Leffler, Errno Consulting + * Copyright (c) 2008 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ +#ifndef _AH_EEPROM_V4K_H_ +#define _AH_EEPROM_V4K_H_ + +#include "ah_eeprom.h" +#include "ah_eeprom_v14.h" + +#undef owl_eep_start_loc +#ifdef __LINUX_ARM_ARCH__ /* AP71 */ +#define owl_eep_start_loc 0 +#else +#define owl_eep_start_loc 64 +#endif + +// 16-bit offset location start of calibration struct +#define AR5416_4K_EEP_START_LOC 64 +#define AR5416_4K_NUM_2G_CAL_PIERS 3 +#define AR5416_4K_NUM_2G_CCK_TARGET_POWERS 3 +#define AR5416_4K_NUM_2G_20_TARGET_POWERS 3 +#define AR5416_4K_NUM_2G_40_TARGET_POWERS 3 +#define AR5416_4K_NUM_CTLS 12 +#define AR5416_4K_NUM_BAND_EDGES 4 +#define AR5416_4K_NUM_PD_GAINS 2 +#define AR5416_4K_MAX_CHAINS 1 + +/* + * NB: The format in EEPROM has words 0 and 2 swapped (i.e. version + * and length are swapped). We reverse their position after reading + * the data into host memory so the version field is at the same + * offset as in previous EEPROM layouts. This makes utilities that + * inspect the EEPROM contents work without looking at the PCI device + * id which may or may not be reliable. + */ +typedef struct BaseEepHeader4k { + uint16_t version; /* NB: length in EEPROM */ + uint16_t checksum; + uint16_t length; /* NB: version in EEPROM */ + uint8_t opCapFlags; + uint8_t eepMisc; + uint16_t regDmn[2]; + uint8_t macAddr[6]; + uint8_t rxMask; + uint8_t txMask; + uint16_t rfSilent; + uint16_t blueToothOptions; + uint16_t deviceCap; + uint32_t binBuildNumber; + uint8_t deviceType; + uint8_t txGainType; /* high power tx gain table support */ +} __packed BASE_EEP4K_HEADER; // 32 B + +typedef struct ModalEepHeader4k { + uint32_t antCtrlChain[AR5416_4K_MAX_CHAINS]; // 12 + uint32_t antCtrlCommon; // 4 + int8_t antennaGainCh[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t switchSettling; // 1 + uint8_t txRxAttenCh[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t rxTxMarginCh[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t adcDesiredSize; // 1 + int8_t pgaDesiredSize; // 1 + uint8_t xlnaGainCh[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t txEndToXpaOff; // 1 + uint8_t txEndToRxOn; // 1 + uint8_t txFrameToXpaOn; // 1 + uint8_t thresh62; // 1 + uint8_t noiseFloorThreshCh[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t xpdGain; // 1 + uint8_t xpd; // 1 + int8_t iqCalICh[AR5416_4K_MAX_CHAINS]; // 1 + int8_t iqCalQCh[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t pdGainOverlap; // 1 + uint8_t ob; // 1 + uint8_t db; // 1 + uint8_t xpaBiasLvl; // 1 +#if 0 + uint8_t pwrDecreaseFor2Chain; // 1 + uint8_t pwrDecreaseFor3Chain; // 1 -> 48 B +#endif + uint8_t txFrameToDataStart; // 1 + uint8_t txFrameToPaOn; // 1 + uint8_t ht40PowerIncForPdadc; // 1 + uint8_t bswAtten[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t bswMargin[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t swSettleHt40; // 1 + uint8_t xatten2Db[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t xatten2Margin[AR5416_4K_MAX_CHAINS]; // 1 + uint8_t ob_ch1; // 1 -> ob and db become chain specific from AR9280 + uint8_t db_ch1; // 1 + uint8_t flagBits; // 1 +#define AR5416_EEP_FLAG_USEANT1 0x01 /* +1 configured antenna */ +#define AR5416_EEP_FLAG_FORCEXPAON 0x02 /* force XPA bit for 5G */ +#define AR5416_EEP_FLAG_LOCALBIAS 0x04 /* enable local bias */ +#define AR5416_EEP_FLAG_FEMBANDSELECT 0x08 /* FEM band select used */ +#define AR5416_EEP_FLAG_XLNABUFIN 0x10 +#define AR5416_EEP_FLAG_XLNAISEL 0x60 +#define AR5416_EEP_FLAG_XLNAISEL_S 5 +#define AR5416_EEP_FLAG_XLNABUFMODE 0x80 + uint8_t miscBits; // [0..1]: bb_tx_dac_scale_cck + uint16_t xpaBiasLvlFreq[3]; // 6 + uint8_t futureModal[2]; // 2 + + SPUR_CHAN spurChans[AR5416_EEPROM_MODAL_SPURS]; // 20 B +} __packed MODAL_EEP4K_HEADER; // == 68 B + +typedef struct CalCtlData4k { + CAL_CTL_EDGES ctlEdges[AR5416_4K_MAX_CHAINS][AR5416_4K_NUM_BAND_EDGES]; +} __packed CAL_CTL_DATA_4K; + +typedef struct calDataPerFreq4k { + uint8_t pwrPdg[AR5416_4K_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; + uint8_t vpdPdg[AR5416_4K_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; +} __packed CAL_DATA_PER_FREQ_4K; + +struct ar5416eeprom_4k { + BASE_EEP4K_HEADER baseEepHeader; // 32 B + uint8_t custData[20]; // 20 B + MODAL_EEP4K_HEADER modalHeader; // 68 B + uint8_t calFreqPier2G[AR5416_4K_NUM_2G_CAL_PIERS]; + CAL_DATA_PER_FREQ_4K calPierData2G[AR5416_4K_MAX_CHAINS][AR5416_4K_NUM_2G_CAL_PIERS]; + CAL_TARGET_POWER_LEG calTargetPowerCck[AR5416_4K_NUM_2G_CCK_TARGET_POWERS]; + CAL_TARGET_POWER_LEG calTargetPower2G[AR5416_4K_NUM_2G_20_TARGET_POWERS]; + CAL_TARGET_POWER_HT calTargetPower2GHT20[AR5416_4K_NUM_2G_20_TARGET_POWERS]; + CAL_TARGET_POWER_HT calTargetPower2GHT40[AR5416_4K_NUM_2G_40_TARGET_POWERS]; + uint8_t ctlIndex[AR5416_4K_NUM_CTLS]; + CAL_CTL_DATA_4K ctlData[AR5416_4K_NUM_CTLS]; + uint8_t padding; +} __packed; + +typedef struct { + struct ar5416eeprom_4k ee_base; +#define NUM_EDGES 8 + uint16_t ee_numCtls; + RD_EDGES_POWER ee_rdEdgesPower[NUM_EDGES*AR5416_4K_NUM_CTLS]; + /* XXX these are dynamically calculated for use by shared code */ + int8_t ee_antennaGainMax[2]; +} HAL_EEPROM_v4k; +#endif /* _AH_EEPROM_V4K_H_ */ diff --git a/sys/dev/ath/ath_hal/ah_regdomain.c b/sys/dev/ath/ath_hal/ah_regdomain.c index fd138a48735e..515c753a1f08 100644 --- a/sys/dev/ath/ath_hal/ah_regdomain.c +++ b/sys/dev/ath/ath_hal/ah_regdomain.c @@ -170,6 +170,7 @@ enum { WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */ WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */ + WORB_WORLD = 0x6B, /* WorldB (WOB SKU) */ MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */ MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */ @@ -432,6 +433,7 @@ static REG_DMN_PAIR_MAPPING regDomainPairs[] = { {EU1_WORLD, EU1_WORLD, EU1_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, {WOR9_WORLD, WOR9_WORLD, WOR9_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, {WORA_WORLD, WORA_WORLD, WORA_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, + {WORB_WORLD, WORB_WORLD, WORB_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, CTRY_DEFAULT }, }; /* @@ -1681,6 +1683,31 @@ static REG_DOMAIN regDomains[] = { WG1_2467_2467), .chan11g_turbo = BM1(T3_2437_2437)}, + {.regDmnEnum = WORB_WORLD, + .conformanceTestLimit = NO_CTL, + .dfsMask = DFS_FCC3 | DFS_ETSI, + .pscan = PSCAN_WWR, + .flags = DISALLOW_ADHOC_11A, + .chan11a = BM4(W1_5260_5320, + W1_5180_5240, + W1_5745_5825, + W1_5500_5700), + .chan11b = BM7(W1_2412_2412, + W1_2437_2442, + W1_2462_2462, + W1_2472_2472, + W1_2417_2432, + W1_2447_2457, + W1_2467_2467), + .chan11g = BM7(WG1_2412_2412, + WG1_2437_2442, + WG1_2462_2462, + WG1_2472_2472, + WG1_2417_2432, + WG1_2447_2457, + WG1_2467_2467), + .chan11g_turbo = BM1(T3_2437_2437)}, + {.regDmnEnum = NULL1, .conformanceTestLimit = NO_CTL, } diff --git a/sys/dev/ath/ath_hal/ar5210/ar5210_reset.c b/sys/dev/ath/ath_hal/ar5210/ar5210_reset.c index dd35e2b7bf0e..43e97ede3bb5 100644 --- a/sys/dev/ath/ath_hal/ar5210/ar5210_reset.c +++ b/sys/dev/ath/ath_hal/ar5210/ar5210_reset.c @@ -87,7 +87,7 @@ ar5210Reset(struct ath_hal *ah, HAL_OPMODE opmode, if (!IEEE80211_IS_CHAN_5GHZ(chan)) { /* Only 11a mode */ - HALDEBUG(ah, HAL_DEBUG_ANY, "%s: channel not 5Ghz\n", __func__); + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: channel not 5GHz\n", __func__); FAIL(HAL_EINVAL); } /* diff --git a/sys/dev/ath/ath_hal/ar5211/ar5211_reset.c b/sys/dev/ath/ath_hal/ar5211/ar5211_reset.c index 1ed6214bf29a..438bf5c8d767 100644 --- a/sys/dev/ath/ath_hal/ar5211/ar5211_reset.c +++ b/sys/dev/ath/ath_hal/ar5211/ar5211_reset.c @@ -136,7 +136,7 @@ static void ar5211GetLowerUpperPcdacs(uint16_t pcdac, uint16_t channel, const PCDACS_EEPROM *pSrcStruct, uint16_t *pLowerPcdac, uint16_t *pUpperPcdac); -static void ar5211SetRfgain(struct ath_hal *, const GAIN_VALUES *);; +static void ar5211SetRfgain(struct ath_hal *, const GAIN_VALUES *); static void ar5211RequestRfgain(struct ath_hal *); static HAL_BOOL ar5211InvalidGainReadback(struct ath_hal *, GAIN_VALUES *); static HAL_BOOL ar5211IsGainAdjustNeeded(struct ath_hal *, const GAIN_VALUES *); diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212.h b/sys/dev/ath/ath_hal/ar5212/ar5212.h index 4f60c3bcb183..6590eb4a2026 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212.h +++ b/sys/dev/ath/ath_hal/ar5212/ar5212.h @@ -327,6 +327,9 @@ struct ath_hal_5212 { uint16_t *ah_pcdacTable; u_int ah_pcdacTableSize; uint16_t ah_ratesArray[16]; + + uint8_t ah_txTrigLev; /* current Tx trigger level */ + uint8_t ah_maxTxTrigLev; /* max tx trigger level */ }; #define AH5212(_ah) ((struct ath_hal_5212 *)(_ah)) diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c index ace6989747e9..78571227f6b1 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c @@ -248,6 +248,9 @@ ar5212InitState(struct ath_hal_5212 *ahp, uint16_t devid, HAL_SOFTC sc, ahp->ah_acktimeout = (u_int) -1; ahp->ah_ctstimeout = (u_int) -1; ahp->ah_sifstime = (u_int) -1; + ahp->ah_txTrigLev = INIT_TX_FIFO_THRESHOLD, + ahp->ah_maxTxTrigLev = MAX_TX_FIFO_THRESHOLD, + OS_MEMCPY(&ahp->ah_bssidmask, defbssidmask, IEEE80211_ADDR_LEN); #undef N } diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_interrupts.c b/sys/dev/ath/ath_hal/ar5212/ar5212_interrupts.c index b9cee9ab23be..47f9e7400f9e 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_interrupts.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_interrupts.c @@ -76,7 +76,7 @@ ar5212GetPendingInterrupts(struct ath_hal *ah, HAL_INT *masked) isr = OS_REG_READ(ah, AR_ISR_RAC); if (isr == 0xffffffff) { *masked = 0; - return AH_FALSE;; + return AH_FALSE; } *masked = isr & HAL_INT_COMMON; diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_power.c b/sys/dev/ath/ath_hal/ar5212/ar5212_power.c index aca52adf797d..3f755bdcfe9e 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_power.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_power.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5212_power.c,v 1.4 2008/11/10 04:08:03 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" @@ -38,8 +38,8 @@ static HAL_BOOL ar5212SetPowerModeAwake(struct ath_hal *ah, int setChip) { #define AR_SCR_MASK \ - (AR_SCR_SLDUR|AR_SCR_SLE|AR_SCR_SLE|AR_SCR_SLDTP|AR_SCR_SLDWP|\ - AR_SCR_SLEPOL|AR_SCR_MIBIE) + (AR_SCR_SLDUR|AR_SCR_SLE|AR_SCR_SLDTP|AR_SCR_SLDWP|\ + AR_SCR_SLEPOL|AR_SCR_MIBIE|AR_SCR_UNKNOWN) #define POWER_UP_TIME 2000 uint32_t scr, val; int i; diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c b/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c index ecdf34ebe46f..ed9de14d00a0 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c +++ b/sys/dev/ath/ath_hal/ar5212/ar5212_xmit.c @@ -48,16 +48,19 @@ ar5212UpdateTxTrigLevel(struct ath_hal *ah, HAL_BOOL bIncTrigLevel) uint32_t txcfg, curLevel, newLevel; HAL_INT omask; + if (ahp->ah_txTrigLev >= ahp->ah_maxTxTrigLev) + return AH_FALSE; + /* * Disable interrupts while futzing with the fifo level. */ - omask = ar5212SetInterrupts(ah, ahp->ah_maskReg &~ HAL_INT_GLOBAL); + omask = ah->ah_setInterrupts(ah, ahp->ah_maskReg &~ HAL_INT_GLOBAL); txcfg = OS_REG_READ(ah, AR_TXCFG); curLevel = MS(txcfg, AR_FTRIG); newLevel = curLevel; if (bIncTrigLevel) { /* increase the trigger level */ - if (curLevel < MAX_TX_FIFO_THRESHOLD) + if (curLevel < ahp->ah_maxTxTrigLev) newLevel++; } else if (curLevel > MIN_TX_FIFO_THRESHOLD) newLevel--; @@ -66,8 +69,10 @@ ar5212UpdateTxTrigLevel(struct ath_hal *ah, HAL_BOOL bIncTrigLevel) OS_REG_WRITE(ah, AR_TXCFG, (txcfg &~ AR_FTRIG) | SM(newLevel, AR_FTRIG)); + ahp->ah_txTrigLev = newLevel; + /* re-enable chip interrupts */ - ar5212SetInterrupts(ah, omask); + ah->ah_setInterrupts(ah, omask); return (newLevel != curLevel); } diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212reg.h b/sys/dev/ath/ath_hal/ar5212/ar5212reg.h index ef6d600fd35b..f99b203e95f0 100644 --- a/sys/dev/ath/ath_hal/ar5212/ar5212reg.h +++ b/sys/dev/ath/ath_hal/ar5212/ar5212reg.h @@ -700,6 +700,7 @@ #define AR_SCR_SLDWP 0x00080000 /* sleep duration write policy */ #define AR_SCR_SLEPOL 0x00100000 /* sleep policy mode */ #define AR_SCR_MIBIE 0x00200000 /* sleep perf cntrs MIB intr ena */ +#define AR_SCR_UNKNOWN 0x00400000 #define AR_INTPEND_TRUE 0x00000001 /* interrupt pending */ diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416.h b/sys/dev/ath/ath_hal/ar5416/ar5416.h index a02f7322f8dc..8d1484b60aa7 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416.h @@ -21,6 +21,7 @@ #include "ar5212/ar5212.h" #include "ar5416_cal.h" +#include "ah_eeprom_v14.h" /* for CAL_TARGET_POWER_* */ #define AR5416_MAGIC 0x20065416 @@ -44,6 +45,7 @@ typedef struct { #define AR5416_CCA_MAX_GOOD_VALUE -85 #define AR5416_CCA_MAX_HIGH_VALUE -62 #define AR5416_CCA_MIN_BAD_VALUE -140 +#define AR9285_CCA_MAX_GOOD_VALUE -118 #define AR5416_SPUR_RSSI_THRESH 40 @@ -178,12 +180,27 @@ extern HAL_RFGAIN ar5416GetRfgain(struct ath_hal *ah); extern HAL_BOOL ar5416Disable(struct ath_hal *ah); extern HAL_BOOL ar5416ChipReset(struct ath_hal *ah, const struct ieee80211_channel *); +extern HAL_BOOL ar5416SetBoardValues(struct ath_hal *, + const struct ieee80211_channel *); extern HAL_BOOL ar5416SetResetReg(struct ath_hal *, uint32_t type); extern HAL_BOOL ar5416SetTxPowerLimit(struct ath_hal *ah, uint32_t limit); +extern HAL_BOOL ar5416SetTransmitPower(struct ath_hal *, + const struct ieee80211_channel *, uint16_t *); extern HAL_BOOL ar5416GetChipPowerLimits(struct ath_hal *ah, struct ieee80211_channel *chan); extern void ar5416GetChannelCenters(struct ath_hal *, const struct ieee80211_channel *chan, CHAN_CENTERS *centers); +extern void ar5416GetTargetPowers(struct ath_hal *ah, + const struct ieee80211_channel *chan, + CAL_TARGET_POWER_HT *powInfo, + uint16_t numChannels, CAL_TARGET_POWER_HT *pNewPower, + uint16_t numRates, HAL_BOOL isHt40Target); +extern void ar5416GetTargetPowersLeg(struct ath_hal *ah, + const struct ieee80211_channel *chan, + CAL_TARGET_POWER_LEG *powInfo, + uint16_t numChannels, CAL_TARGET_POWER_LEG *pNewPower, + uint16_t numRates, HAL_BOOL isExtTarget); + extern HAL_BOOL ar5416StopTxDma(struct ath_hal *ah, u_int q); extern HAL_BOOL ar5416SetupTxDesc(struct ath_hal *ah, struct ath_desc *ds, diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c b/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c index 6134a207cede..b10296c4e683 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_ani.c @@ -183,7 +183,7 @@ ar5416AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) if (level >= params->maxNoiseImmunityLevel) { HALDEBUG(ah, HAL_DEBUG_ANY, - "%s: level out of range (%u > %u)\n", + "%s: immunity level out of range (%u > %u)\n", __func__, level, params->maxNoiseImmunityLevel); return AH_FALSE; } @@ -267,7 +267,7 @@ ar5416AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) if (level >= params->maxFirstepLevel) { HALDEBUG(ah, HAL_DEBUG_ANY, - "%s: level out of range (%u > %u)\n", + "%s: firstep level out of range (%u > %u)\n", __func__, level, params->maxFirstepLevel); return AH_FALSE; } @@ -285,7 +285,7 @@ ar5416AniControl(struct ath_hal *ah, HAL_ANI_CMD cmd, int param) if (level >= params->maxSpurImmunityLevel) { HALDEBUG(ah, HAL_DEBUG_ANY, - "%s: level out of range (%u > %u)\n", + "%s: spur immunity level out of range (%u > %u)\n", __func__, level, params->maxSpurImmunityLevel); return AH_FALSE; } diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c index e59a09962be6..a0bf7bdd627e 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c @@ -89,6 +89,8 @@ ar5416InitState(struct ath_hal_5416 *ahp5416, uint16_t devid, HAL_SOFTC sc, ah->ah_perCalibrationN = ar5416PerCalibrationN, ah->ah_resetCalValid = ar5416ResetCalValid, ah->ah_setTxPowerLimit = ar5416SetTxPowerLimit; + ah->ah_setTxPower = ar5416SetTransmitPower; + ah->ah_setBoardValues = ar5416SetBoardValues; /* Transmit functions */ ah->ah_stopTxDma = ar5416StopTxDma; diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c index 1d68c6842415..358a0eed245d 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_beacon.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_beacon.c,v 1.8 2008/11/11 01:03:12 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcdc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcdc.c index 2e580bdd37ee..9083d3ab6563 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcdc.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcdc.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_cal_adcdc.c,v 1.2 2008/11/11 17:43:23 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcgain.c b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcgain.c index ce38b03fd243..4af1ca4d670c 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcgain.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_adcgain.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_cal_adcgain.c,v 1.2 2008/11/11 17:43:23 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c index 931249e3075c..82555b274c6d 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal_iq.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_cal_iq.c,v 1.2 2008/11/11 17:43:23 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_eeprom.c b/sys/dev/ath/ath_hal/ar5416/ar5416_eeprom.c index 812159f0e44d..2947726d8ebc 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_eeprom.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_eeprom.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_eeprom.c,v 1.6 2008/11/10 04:08:04 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c b/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c index 9defa1c6e5fc..dc56d15114ee 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_gpio.c @@ -146,7 +146,9 @@ ar5416GpioGet(struct ath_hal *ah, uint32_t gpio) * Read output value for all gpio's, shift it, * and verify whether the specific bit is set. */ - if (AR_SREV_MERLIN_10_OR_LATER(ah)) + if (AR_SREV_KITE_10_OR_LATER(ah)) + bits = MS(OS_REG_READ(ah, AR_GPIO_IN_OUT), AR9285_GPIO_IN_VAL); + else if (AR_SREV_MERLIN_10_OR_LATER(ah)) bits = MS(OS_REG_READ(ah, AR_GPIO_IN_OUT), AR928X_GPIO_IN_VAL); else bits = MS(OS_REG_READ(ah, AR_GPIO_IN_OUT), AR_GPIO_IN_VAL); diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c b/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c index 7b6f951175f0..4b66d04fefa2 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c @@ -104,7 +104,7 @@ ar5416GetPendingInterrupts(struct ath_hal *ah, HAL_INT *masked) isr = OS_REG_READ(ah, AR_ISR_RAC); if (isr == 0xffffffff) { *masked = 0; - return AH_FALSE;; + return AH_FALSE; } *masked = isr & HAL_INT_COMMON; diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_keycache.c b/sys/dev/ath/ath_hal/ar5416/ar5416_keycache.c index cb8ad71db485..533fe03e22f6 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_keycache.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_keycache.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_keycache.c,v 1.3 2008/11/10 04:08:04 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c index 0ed704fd4adf..ac6009bac8ba 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_misc.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_misc.c,v 1.12 2008/11/27 22:30:07 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" @@ -30,7 +30,7 @@ #include "ar5416/ar5416phy.h" /* - * Return the wireless modes (a,b,g,t) supported by hardware. + * Return the wireless modes (a,b,g,n,t) supported by hardware. * * This value is what is actually supported by the hardware * and is unaffected by regulatory/country code settings. diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_phy.c b/sys/dev/ath/ath_hal/ar5416/ar5416_phy.c index f8f5b2a80c23..0f99399f308c 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_phy.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_phy.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_phy.c,v 1.4 2008/11/27 22:30:08 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_power.c b/sys/dev/ath/ath_hal/ar5416/ar5416_power.c index b83b0f8951dd..c3b1285f375a 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_power.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_power.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_power.c,v 1.6 2008/11/11 00:11:30 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c b/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c index e8883737eaaf..4a480aa91e42 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_recv.c @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416_recv.c,v 1.7 2008/11/11 20:46:06 sam Exp $ + * $FreeBSD$ */ #include "opt_ah.h" diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c index 1b75715f1dfa..d506a6aaf0a6 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c @@ -45,9 +45,6 @@ static void ar5416InitIMR(struct ath_hal *ah, HAL_OPMODE opmode); static void ar5416InitQoS(struct ath_hal *ah); static void ar5416InitUserSettings(struct ath_hal *ah); -static HAL_BOOL ar5416SetTransmitPower(struct ath_hal *ah, - const struct ieee80211_channel *chan, uint16_t *rfXpdGain); - #if 0 static HAL_BOOL ar5416ChannelChange(struct ath_hal *, const struct ieee80211_channel *); #endif @@ -56,7 +53,6 @@ static void ar5416SetDeltaSlope(struct ath_hal *, const struct ieee80211_channel static HAL_BOOL ar5416SetResetPowerOn(struct ath_hal *ah); static HAL_BOOL ar5416SetReset(struct ath_hal *ah, int type); static void ar5416InitPLL(struct ath_hal *ah, const struct ieee80211_channel *chan); -static HAL_BOOL ar5416SetBoardValues(struct ath_hal *, const struct ieee80211_channel *); static HAL_BOOL ar5416SetPowerPerRateTable(struct ath_hal *ah, struct ar5416eeprom *pEepData, const struct ieee80211_channel *chan, int16_t *ratesArray, @@ -69,14 +65,6 @@ static HAL_BOOL ar5416SetPowerCalTable(struct ath_hal *ah, int16_t *pTxPowerIndexOffset); static uint16_t ar5416GetMaxEdgePower(uint16_t freq, CAL_CTL_EDGES *pRdEdgesPower, HAL_BOOL is2GHz); -static void ar5416GetTargetPowers(struct ath_hal *ah, - const struct ieee80211_channel *chan, CAL_TARGET_POWER_HT *powInfo, - uint16_t numChannels, CAL_TARGET_POWER_HT *pNewPower, - uint16_t numRates, HAL_BOOL isHt40Target); -static void ar5416GetTargetPowersLeg(struct ath_hal *ah, - const struct ieee80211_channel *chan, CAL_TARGET_POWER_LEG *powInfo, - uint16_t numChannels, CAL_TARGET_POWER_LEG *pNewPower, - uint16_t numRates, HAL_BOOL isExtTarget); static int16_t interpolate(uint16_t target, uint16_t srcLeft, uint16_t srcRight, int16_t targetLeft, int16_t targetRight); @@ -224,7 +212,7 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode, OS_REG_WRITE(ah, AR_SELFGEN_MASK, AH5416(ah)->ah_tx_chainmask); /* Setup the transmit power values. */ - if (!ar5416SetTransmitPower(ah, chan, rfXpdGain)) { + if (!ah->ah_setTxPower(ah, chan, rfXpdGain)) { HALDEBUG(ah, HAL_DEBUG_ANY, "%s: error init'ing transmit power\n", __func__); FAIL(HAL_EIO); @@ -245,7 +233,7 @@ ar5416Reset(struct ath_hal *ah, HAL_OPMODE opmode, AH5416(ah)->ah_spurMitigate(ah, chan); /* Setup board specific options for EEPROM version 3 */ - if (!ar5416SetBoardValues(ah, chan)) { + if (!ah->ah_setBoardValues(ah, chan)) { HALDEBUG(ah, HAL_DEBUG_ANY, "%s: error setting board options\n", __func__); FAIL(HAL_EIO); @@ -448,6 +436,7 @@ ar5416ChannelChange(struct ath_hal *ah, const structu ieee80211_channel *chan) static void ar5416InitDMA(struct ath_hal *ah) { + struct ath_hal_5212 *ahp = AH5212(ah); /* * set AHB_MODE not to do cacheline prefetches @@ -466,7 +455,10 @@ ar5416InitDMA(struct ath_hal *ah) OS_REG_WRITE(ah, AR_RXCFG, (OS_REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_DMASZ_MASK) | AR_RXCFG_DMASZ_128B); - /* XXX restore TX trigger level */ + /* restore TX trigger level */ + OS_REG_WRITE(ah, AR_TXCFG, + (OS_REG_READ(ah, AR_TXCFG) &~ AR_FTRIG) | + SM(ahp->ah_txTrigLev, AR_FTRIG)); /* * Setup receive FIFO threshold to hold off TX activities @@ -793,7 +785,7 @@ typedef enum Ar5416_Rates { * Set the transmit power in the baseband for the given * operating channel and mode. */ -static HAL_BOOL +HAL_BOOL ar5416SetTransmitPower(struct ath_hal *ah, const struct ieee80211_channel *chan, uint16_t *rfXpdGain) { @@ -1185,7 +1177,7 @@ ar5416InitPLL(struct ath_hal *ah, const struct ieee80211_channel *chan) * Read EEPROM header info and program the device for correct operation * given the channel value. */ -static HAL_BOOL +HAL_BOOL ar5416SetBoardValues(struct ath_hal *ah, const struct ieee80211_channel *chan) { const HAL_EEPROM_v14 *ee = AH_PRIVATE(ah)->ah_eeprom; @@ -1622,7 +1614,7 @@ ar5416GetMaxEdgePower(uint16_t freq, CAL_CTL_EDGES *pRdEdgesPower, HAL_BOOL is2G * Return the rates of target power for the given target power table * channel, and number of channels */ -static void +void ar5416GetTargetPowers(struct ath_hal *ah, const struct ieee80211_channel *chan, CAL_TARGET_POWER_HT *powInfo, uint16_t numChannels, CAL_TARGET_POWER_HT *pNewPower, uint16_t numRates, @@ -1681,7 +1673,7 @@ ar5416GetTargetPowers(struct ath_hal *ah, const struct ieee80211_channel *chan, * Return the four rates of target power for the given target power table * channel, and number of channels */ -static void +void ar5416GetTargetPowersLeg(struct ath_hal *ah, const struct ieee80211_channel *chan, CAL_TARGET_POWER_LEG *powInfo, uint16_t numChannels, diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416desc.h b/sys/dev/ath/ath_hal/ar5416/ar5416desc.h index 7c60b24c89c9..e52ded63551f 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416desc.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416desc.h @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416desc.h,v 1.7 2008/11/11 00:11:30 sam Exp $ + * $FreeBSD$ */ #ifndef _ATH_AR5416_DESC_H_ #define _ATH_AR5416_DESC_H diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416phy.h b/sys/dev/ath/ath_hal/ar5416/ar5416phy.h index 416aae68d23d..d5185b6ffdcc 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416phy.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416phy.h @@ -14,7 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $Id: ar5416phy.h,v 1.10 2008/11/11 20:46:06 sam Exp $ + * $FreeBSD$ */ #ifndef _DEV_ATH_AR5416PHY_H_ #define _DEV_ATH_AR5416PHY_H_ @@ -48,6 +48,7 @@ #define AR_PHY_FC_SHORT_GI_40 0x00000080 /* allow short GI for HT 40 */ #define AR_PHY_FC_WALSH 0x00000100 /* walsh spatial spreading for 2 chains,2 streams TX */ #define AR_PHY_FC_SINGLE_HT_LTF1 0x00000200 /* single length (4us) 1st HT long training symbol */ +#define AR_PHY_FC_ENABLE_DAC_FIFO 0x00000800 #define AR_PHY_TIMING2 0x9810 /* Timing Control 2 */ #define AR_PHY_TIMING2_USE_FORCE 0x00001000 @@ -78,6 +79,20 @@ #define AR_PHY_GAIN_2GHZ_BSW_ATTEN 0x0000001F #define AR_PHY_GAIN_2GHZ_BSW_ATTEN_S 0 +#define AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN 0x003E0000 +#define AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN_S 17 +#define AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN 0x0001F000 +#define AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN_S 12 +#define AR_PHY_GAIN_2GHZ_XATTEN2_DB 0x00000FC0 +#define AR_PHY_GAIN_2GHZ_XATTEN2_DB_S 6 +#define AR_PHY_GAIN_2GHZ_XATTEN1_DB 0x0000003F +#define AR_PHY_GAIN_2GHZ_XATTEN1_DB_S 0 + +#define AR9280_PHY_RXGAIN_TXRX_ATTEN 0x00003F80 +#define AR9280_PHY_RXGAIN_TXRX_ATTEN_S 7 +#define AR9280_PHY_RXGAIN_TXRX_MARGIN 0x001FC000 +#define AR9280_PHY_RXGAIN_TXRX_MARGIN_S 14 + #define AR_PHY_EXT_CCA 0x99bc #define AR_PHY_EXT_CCA_CYCPWR_THR1 0x0000FE00 #define AR_PHY_EXT_CCA_CYCPWR_THR1_S 9 @@ -207,6 +222,9 @@ #define AR_PHY_TPCRG1_PD_GAIN_3 0x00300000 #define AR_PHY_TPCRG1_PD_GAIN_3_S 20 +#define AR_PHY_TPCRG1_PD_CAL_ENABLE 0x00400000 +#define AR_PHY_TPCRG1_PD_CAL_ENABLE_S 22 + #define AR_PHY_VIT_MASK2_M_46_61 0xa3a0 #define AR_PHY_MASK2_M_31_45 0xa3a4 #define AR_PHY_MASK2_M_16_30 0xa3a8 @@ -247,4 +265,5 @@ #define AR_PHY_CL_CAL_CTL 0xA358 /* carrier leak cal control */ #define AR_PHY_CL_CAL_ENABLE 0x00000002 +#define AR_PHY_PARALLEL_CAL_ENABLE 0x00000001 #endif /* _DEV_ATH_AR5416PHY_H_ */ diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h index 3afb16325fd0..cab34ccd7f55 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar5416reg.h +++ b/sys/dev/ath/ath_hal/ar5416/ar5416reg.h @@ -70,8 +70,20 @@ #define AR_AN_RF5G1_CH1 0x783C #define AR_AN_TOP2 0x7894 #define AR_AN_SYNTH9 0x7868 -#define AR9285_AN_RF2G3 0x7828 +#define AR9285_AN_RF2G1 0x7820 +#define AR9285_AN_RF2G2 0x7824 +#define AR9285_AN_RF2G3 0x7828 +#define AR9285_AN_RF2G4 0x782C +#define AR9285_AN_RF2G6 0x7834 +#define AR9285_AN_RF2G7 0x7838 +#define AR9285_AN_RF2G8 0x783C +#define AR9285_AN_RF2G9 0x7840 +#define AR9285_AN_RXTXBB1 0x7854 +#define AR9285_AN_TOP2 0x7868 #define AR9285_AN_TOP3 0x786c +#define AR9285_AN_TOP4 0x7870 +#define AR9285_AN_TOP4_DEFAULT 0x10142c00 + #define AR_RESET_TSF 0x8020 #define AR_RXFIFO_CFG 0x8114 #define AR_PHY_ERR_1 0x812c @@ -359,42 +371,83 @@ #define AR_AN_SYNTH9_REFDIVA_S 27 /* AR9285 Analog registers */ -#define AR9285_AN_RF2G3_OB_0 0x00E00000 -#define AR9285_AN_RF2G3_OB_0_S 21 -#define AR9285_AN_RF2G3_OB_1 0x001C0000 -#define AR9285_AN_RF2G3_OB_1_S 18 -#define AR9285_AN_RF2G3_OB_2 0x00038000 -#define AR9285_AN_RF2G3_OB_2_S 15 -#define AR9285_AN_RF2G3_OB_3 0x00007000 -#define AR9285_AN_RF2G3_OB_3_S 12 -#define AR9285_AN_RF2G3_OB_4 0x00000E00 -#define AR9285_AN_RF2G3_OB_4_S 9 +#define AR9285_AN_RF2G1_ENPACAL 0x00000800 +#define AR9285_AN_RF2G1_ENPACAL_S 11 +#define AR9285_AN_RF2G1_PDPADRV1 0x02000000 +#define AR9285_AN_RF2G1_PDPADRV1_S 25 +#define AR9285_AN_RF2G1_PDPADRV2 0x01000000 +#define AR9285_AN_RF2G1_PDPADRV2_S 24 +#define AR9285_AN_RF2G1_PDPAOUT 0x00800000 +#define AR9285_AN_RF2G1_PDPAOUT_S 23 -#define AR9285_AN_RF2G3_DB1_0 0x000001C0 -#define AR9285_AN_RF2G3_DB1_0_S 6 -#define AR9285_AN_RF2G3_DB1_1 0x00000038 -#define AR9285_AN_RF2G3_DB1_1_S 3 -#define AR9285_AN_RF2G3_DB1_2 0x00000007 -#define AR9285_AN_RF2G3_DB1_2_S 0 -#define AR9285_AN_RF2G4 0x782C -#define AR9285_AN_RF2G4_DB1_3 0xE0000000 -#define AR9285_AN_RF2G4_DB1_3_S 29 -#define AR9285_AN_RF2G4_DB1_4 0x1C000000 -#define AR9285_AN_RF2G4_DB1_4_S 26 +#define AR9285_AN_RF2G2_OFFCAL 0x00001000 +#define AR9285_AN_RF2G2_OFFCAL_S 12 -#define AR9285_AN_RF2G4_DB2_0 0x03800000 -#define AR9285_AN_RF2G4_DB2_0_S 23 -#define AR9285_AN_RF2G4_DB2_1 0x00700000 -#define AR9285_AN_RF2G4_DB2_1_S 20 -#define AR9285_AN_RF2G4_DB2_2 0x000E0000 -#define AR9285_AN_RF2G4_DB2_2_S 17 -#define AR9285_AN_RF2G4_DB2_3 0x0001C000 -#define AR9285_AN_RF2G4_DB2_3_S 14 -#define AR9285_AN_RF2G4_DB2_4 0x00003800 -#define AR9285_AN_RF2G4_DB2_4_S 11 +#define AR9285_AN_RF2G3_PDVCCOMP 0x02000000 +#define AR9285_AN_RF2G3_PDVCCOMP_S 25 +#define AR9285_AN_RF2G3_OB_0 0x00E00000 +#define AR9285_AN_RF2G3_OB_0_S 21 +#define AR9285_AN_RF2G3_OB_1 0x001C0000 +#define AR9285_AN_RF2G3_OB_1_S 18 +#define AR9285_AN_RF2G3_OB_2 0x00038000 +#define AR9285_AN_RF2G3_OB_2_S 15 +#define AR9285_AN_RF2G3_OB_3 0x00007000 +#define AR9285_AN_RF2G3_OB_3_S 12 +#define AR9285_AN_RF2G3_OB_4 0x00000E00 +#define AR9285_AN_RF2G3_OB_4_S 9 + +#define AR9285_AN_RF2G3_DB1_0 0x000001C0 +#define AR9285_AN_RF2G3_DB1_0_S 6 +#define AR9285_AN_RF2G3_DB1_1 0x00000038 +#define AR9285_AN_RF2G3_DB1_1_S 3 +#define AR9285_AN_RF2G3_DB1_2 0x00000007 +#define AR9285_AN_RF2G3_DB1_2_S 0 + +#define AR9285_AN_RF2G4_DB1_3 0xE0000000 +#define AR9285_AN_RF2G4_DB1_3_S 29 +#define AR9285_AN_RF2G4_DB1_4 0x1C000000 +#define AR9285_AN_RF2G4_DB1_4_S 26 + +#define AR9285_AN_RF2G4_DB2_0 0x03800000 +#define AR9285_AN_RF2G4_DB2_0_S 23 +#define AR9285_AN_RF2G4_DB2_1 0x00700000 +#define AR9285_AN_RF2G4_DB2_1_S 20 +#define AR9285_AN_RF2G4_DB2_2 0x000E0000 +#define AR9285_AN_RF2G4_DB2_2_S 17 +#define AR9285_AN_RF2G4_DB2_3 0x0001C000 +#define AR9285_AN_RF2G4_DB2_3_S 14 +#define AR9285_AN_RF2G4_DB2_4 0x00003800 +#define AR9285_AN_RF2G4_DB2_4_S 11 + +#define AR9285_AN_RF2G6_CCOMP 0x00007800 +#define AR9285_AN_RF2G6_CCOMP_S 11 +#define AR9285_AN_RF2G6_OFFS 0x03f00000 +#define AR9285_AN_RF2G6_OFFS_S 20 + +#define AR9271_AN_RF2G6_OFFS 0x07f00000 +#define AR9271_AN_RF2G6_OFFS_S 20 + +#define AR9285_AN_RF2G7_PWDDB 0x00000002 +#define AR9285_AN_RF2G7_PWDDB_S 1 +#define AR9285_AN_RF2G7_PADRVGN2TAB0 0xE0000000 +#define AR9285_AN_RF2G7_PADRVGN2TAB0_S 29 + +#define AR9285_AN_RF2G8_PADRVGN2TAB0 0x0001C000 +#define AR9285_AN_RF2G8_PADRVGN2TAB0_S 14 + +#define AR9285_AN_RXTXBB1_PDRXTXBB1 0x00000020 +#define AR9285_AN_RXTXBB1_PDRXTXBB1_S 5 +#define AR9285_AN_RXTXBB1_PDV2I 0x00000080 +#define AR9285_AN_RXTXBB1_PDV2I_S 7 +#define AR9285_AN_RXTXBB1_PDDACIF 0x00000100 +#define AR9285_AN_RXTXBB1_PDDACIF_S 8 +#define AR9285_AN_RXTXBB1_SPARE9 0x00000001 +#define AR9285_AN_RXTXBB1_SPARE9_S 0 #define AR9285_AN_TOP3_XPABIAS_LVL 0x0000000C #define AR9285_AN_TOP3_XPABIAS_LVL_S 2 +#define AR9285_AN_TOP3_PWDDAC 0x00800000 +#define AR9285_AN_TOP3_PWDDAC_S 23 /* Sleep control */ #define AR5416_SLEEP1_CAB_TIMEOUT 0xFFE00000 /* Cab timeout (TU) */ @@ -472,6 +525,7 @@ #define AR_PCU_TXBUF_CTRL_SIZE_MASK 0x7FF #define AR_PCU_TXBUF_CTRL_USABLE_SIZE 0x700 +#define AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE 0x380 /* Eeprom defines */ #define AR_EEPROM_STATUS_DATA_VAL 0x0000ffff @@ -522,6 +576,8 @@ #define AR_XSREV_REVISION_MERLIN_21 2 /* Merlin 2.1 */ #define AR_XSREV_VERSION_KITE 0xC0 /* Kite Version */ #define AR_XSREV_REVISION_KITE_10 0 /* Kite 1.0 */ +#define AR_XSREV_REVISION_KITE_11 1 /* Kite 1.1 */ +#define AR_XSREV_REVISION_KITE_12 2 /* Kite 1.2 */ #define AR_SREV_OWL_20_OR_LATER(_ah) \ (AH_PRIVATE((_ah))->ah_macVersion >= AR_XSREV_VERSION_SOWL || \ @@ -544,7 +600,7 @@ (AH_PRIVATE((_ah))->ah_macVersion >= AR_XSREV_VERSION_MERLIN) #define AR_SREV_MERLIN_20(_ah) \ (AR_SREV_MERLIN(_ah) && \ - AH_PRIVATE((_ah))->ah_macRev >= AR_XSREV_REVISION_MERLIN_20) + AH_PRIVATE((_ah))->ah_macRev == AR_XSREV_REVISION_MERLIN_20) #define AR_SREV_MERLIN_20_OR_LATER(_ah) \ (AR_SREV_MERLIN_20(_ah) || \ AH_PRIVATE((_ah))->ah_macVersion > AR_XSREV_VERSION_MERLIN) @@ -553,4 +609,16 @@ (AH_PRIVATE((_ah))->ah_macVersion == AR_XSREV_VERSION_KITE) #define AR_SREV_KITE_10_OR_LATER(_ah) \ (AH_PRIVATE((_ah))->ah_macVersion >= AR_XSREV_VERSION_KITE) +#define AR_SREV_KITE_11(_ah) \ + (AR_SREV_KITE(ah) && \ + AH_PRIVATE((_ah))->ah_macRev == AR_XSREV_REVISION_KITE_11) +#define AR_SREV_KITE_11_OR_LATER(_ah) \ + (AR_SREV_KITE_11(_ah) || \ + AH_PRIVATE((_ah))->ah_macRev >= AR_XSREV_REVISION_KITE_11) +#define AR_SREV_KITE_12(_ah) \ + (AR_SREV_KITE(ah) && \ + AH_PRIVATE((_ah))->ah_macRev == AR_XSREV_REVISION_KITE_12) +#define AR_SREV_KITE_12_OR_LATER(_ah) \ + (AR_SREV_KITE_12(_ah) || \ + AH_PRIVATE((_ah))->ah_macRev >= AR_XSREV_REVISION_KITE_12) #endif /* _DEV_ATH_AR5416REG_H */ diff --git a/sys/dev/ath/ath_hal/ar5416/ar9280.h b/sys/dev/ath/ath_hal/ar5416/ar9280.h index f2e97d9680cf..59039f0157ee 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar9280.h +++ b/sys/dev/ath/ath_hal/ar5416/ar9280.h @@ -30,11 +30,16 @@ struct ath_hal_9280 { #define AH9280(_ah) ((struct ath_hal_9280 *)(_ah)) #define AR9280_DEFAULT_RXCHAINMASK 3 +#define AR9285_DEFAULT_RXCHAINMASK 1 #define AR9280_DEFAULT_TXCHAINMASK 1 +#define AR9285_DEFAULT_TXCHAINMASK 1 HAL_BOOL ar9280RfAttach(struct ath_hal *, HAL_STATUS *); struct ath_hal; HAL_BOOL ar9280SetAntennaSwitch(struct ath_hal *, HAL_ANT_SETTING); +void ar9280SpurMitigate(struct ath_hal *, + const struct ieee80211_channel *); + #endif /* _ATH_AR9280_H_ */ diff --git a/sys/dev/ath/ath_hal/ar5416/ar9280_attach.c b/sys/dev/ath/ath_hal/ar5416/ar9280_attach.c index d998af05943b..8436482b11c8 100644 --- a/sys/dev/ath/ath_hal/ar5416/ar9280_attach.c +++ b/sys/dev/ath/ath_hal/ar5416/ar9280_attach.c @@ -64,8 +64,6 @@ static void ar9280ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); static HAL_BOOL ar9280FillCapabilityInfo(struct ath_hal *ah); static void ar9280WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan); -static void ar9280SpurMitigate(struct ath_hal *ah, - const struct ieee80211_channel *chan); static void ar9280AniSetup(struct ath_hal *ah) @@ -360,7 +358,7 @@ ar9280WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan) #define AR_SPUR_FEEQ_BOUND_HT40 19 #define AR_SPUR_FEEQ_BOUND_HT20 10 -static void +void ar9280SpurMitigate(struct ath_hal *ah, const struct ieee80211_channel *chan) { static const int pilot_mask_reg[4] = { AR_PHY_TIMING7, AR_PHY_TIMING8, diff --git a/sys/dev/ath/ath_hal/ar5416/ar9285.c b/sys/dev/ath/ath_hal/ar5416/ar9285.c new file mode 100644 index 000000000000..800c92fa1b68 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar9285.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2008-2009 Sam Leffler, Errno Consulting + * Copyright (c) 2008 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ +#include "opt_ah.h" + +#include "ah.h" +#include "ah_internal.h" + +#include "ah_eeprom_v14.h" + +#include "ar5416/ar9280.h" +#include "ar5416/ar9285.h" +#include "ar5416/ar5416reg.h" +#include "ar5416/ar5416phy.h" + +static void +ar9285GetNoiseFloor(struct ath_hal *ah, int16_t nfarray[]) +{ + int16_t nf; + + nf = MS(OS_REG_READ(ah, AR_PHY_CCA), AR9280_PHY_MINCCA_PWR); + if (nf & 0x100) + nf = 0 - ((nf ^ 0x1ff) + 1); + HALDEBUG(ah, HAL_DEBUG_NFCAL, + "NF calibrated [ctl] [chain 0] is %d\n", nf); + nfarray[0] = nf; + + nfarray[1] = 0; + + nf = MS(OS_REG_READ(ah, AR_PHY_EXT_CCA), AR9280_PHY_EXT_MINCCA_PWR); + if (nf & 0x100) + nf = 0 - ((nf ^ 0x1ff) + 1); + HALDEBUG(ah, HAL_DEBUG_NFCAL, + "NF calibrated [ext] [chain 0] is %d\n", nf); + nfarray[3] = nf; + + nfarray[4] = 0; +} + +HAL_BOOL +ar9285RfAttach(struct ath_hal *ah, HAL_STATUS *status) +{ + if (ar9280RfAttach(ah, status) == AH_FALSE) + return AH_FALSE; + + AH_PRIVATE(ah)->ah_getNoiseFloor = ar9285GetNoiseFloor; + + return AH_TRUE; +} diff --git a/sys/dev/ath/ath_hal/ar5416/ar9285.h b/sys/dev/ath/ath_hal/ar5416/ar9285.h new file mode 100644 index 000000000000..1ee058bf3120 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar9285.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2008-2009 Sam Leffler, Errno Consulting + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ +#ifndef _ATH_AR9285_H_ +#define _ATH_AR9285_H_ + +#include "ar5416/ar5416.h" + +struct ath_hal_9285 { + struct ath_hal_5416 ah_5416; + + HAL_INI_ARRAY ah_ini_txgain; + HAL_INI_ARRAY ah_ini_rxgain; +}; +#define AH9285(_ah) ((struct ath_hal_9285 *)(_ah)) + +#define AR9285_DEFAULT_RXCHAINMASK 1 +#define AR9285_DEFAULT_TXCHAINMASK 1 + + +HAL_BOOL ar9285SetAntennaSwitch(struct ath_hal *, HAL_ANT_SETTING); +HAL_BOOL ar9285RfAttach(struct ath_hal *, HAL_STATUS *); + +extern HAL_BOOL ar9285SetTransmitPower(struct ath_hal *, + const struct ieee80211_channel *, uint16_t *); +extern HAL_BOOL ar9285SetBoardValues(struct ath_hal *, + const struct ieee80211_channel *); + +#endif /* _ATH_AR9285_H_ */ diff --git a/sys/dev/ath/ath_hal/ar5416/ar9285.ini b/sys/dev/ath/ath_hal/ar5416/ar9285.ini new file mode 100644 index 000000000000..ef0ff2de89ea --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar9285.ini @@ -0,0 +1,699 @@ +/* + * Copyright (c) 2008-2009 Atheros Communications Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +/* AR9285 Revsion 10 */ +static const u_int32_t ar9285Modes[][6] = { + { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, + { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, + { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, + { 0x000010f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008 }, + { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, + { 0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b, 0x0988004f }, + { 0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440, 0x00006880 }, + { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, + { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, + { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, + { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, + { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, + { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, + { 0x00009840, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e }, + { 0x00009844, 0x0372161e, 0x0372161e, 0x03720020, 0x03720020, 0x037216a0 }, + { 0x00009848, 0x00001066, 0x00001066, 0x0000004e, 0x0000004e, 0x00001059 }, + { 0x00009850, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2 }, + { 0x00009858, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e }, + { 0x0000985c, 0x3139605e, 0x3139605e, 0x3136605e, 0x3136605e, 0x3139605e }, + { 0x00009860, 0x00058d18, 0x00058d18, 0x00058d20, 0x00058d20, 0x00058d18 }, + { 0x00009864, 0x0000fe00, 0x0000fe00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, + { 0x00009868, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0 }, + { 0x0000986c, 0x06903081, 0x06903081, 0x06903881, 0x06903881, 0x06903881 }, + { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, + { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, + { 0x00009924, 0xd00a8007, 0xd00a8007, 0xd00a800d, 0xd00a800d, 0xd00a800d }, + { 0x00009944, 0xdfbc1010, 0xdfbc1010, 0xdfbc1020, 0xdfbc1020, 0xdfbc1010 }, + { 0x00009960, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00009964, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x000099b8, 0x00cf4d1c, 0x00cf4d1c, 0x00cf4d1c, 0x00cf4d1c, 0x00cf4d1c }, + { 0x000099bc, 0x00000600, 0x00000600, 0x00000c00, 0x00000c00, 0x00000c00 }, + { 0x000099c0, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4 }, + { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, + { 0x000099c8, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329 }, + { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, + { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, + { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00009a00, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 }, + { 0x00009a04, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 }, + { 0x00009a08, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 }, + { 0x00009a0c, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 }, + { 0x00009a10, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 }, + { 0x00009a14, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 }, + { 0x00009a18, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 }, + { 0x00009a1c, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, + { 0x00009a20, 0x00000000, 0x00000000, 0x00068114, 0x00068114, 0x00000000 }, + { 0x00009a24, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 }, + { 0x00009a28, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 }, + { 0x00009a2c, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 }, + { 0x00009a30, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 }, + { 0x00009a34, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 }, + { 0x00009a38, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 }, + { 0x00009a3c, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 }, + { 0x00009a40, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 }, + { 0x00009a44, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 }, + { 0x00009a48, 0x00000000, 0x00000000, 0x00068284, 0x00068284, 0x00000000 }, + { 0x00009a4c, 0x00000000, 0x00000000, 0x00068288, 0x00068288, 0x00000000 }, + { 0x00009a50, 0x00000000, 0x00000000, 0x00068220, 0x00068220, 0x00000000 }, + { 0x00009a54, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 }, + { 0x00009a58, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 }, + { 0x00009a5c, 0x00000000, 0x00000000, 0x00068304, 0x00068304, 0x00000000 }, + { 0x00009a60, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 }, + { 0x00009a64, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 }, + { 0x00009a68, 0x00000000, 0x00000000, 0x00068380, 0x00068380, 0x00000000 }, + { 0x00009a6c, 0x00000000, 0x00000000, 0x00068384, 0x00068384, 0x00000000 }, + { 0x00009a70, 0x00000000, 0x00000000, 0x00068700, 0x00068700, 0x00000000 }, + { 0x00009a74, 0x00000000, 0x00000000, 0x00068704, 0x00068704, 0x00000000 }, + { 0x00009a78, 0x00000000, 0x00000000, 0x00068708, 0x00068708, 0x00000000 }, + { 0x00009a7c, 0x00000000, 0x00000000, 0x0006870c, 0x0006870c, 0x00000000 }, + { 0x00009a80, 0x00000000, 0x00000000, 0x00068780, 0x00068780, 0x00000000 }, + { 0x00009a84, 0x00000000, 0x00000000, 0x00068784, 0x00068784, 0x00000000 }, + { 0x00009a88, 0x00000000, 0x00000000, 0x00068b04, 0x00068b04, 0x00000000 }, + { 0x00009a8c, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 }, + { 0x00009a90, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 }, + { 0x00009a94, 0x00000000, 0x00000000, 0x00068b0c, 0x00068b0c, 0x00000000 }, + { 0x00009a98, 0x00000000, 0x00000000, 0x00068b80, 0x00068b80, 0x00000000 }, + { 0x00009a9c, 0x00000000, 0x00000000, 0x00068b84, 0x00068b84, 0x00000000 }, + { 0x00009aa0, 0x00000000, 0x00000000, 0x00068b88, 0x00068b88, 0x00000000 }, + { 0x00009aa4, 0x00000000, 0x00000000, 0x00068b8c, 0x00068b8c, 0x00000000 }, + { 0x00009aa8, 0x00000000, 0x00000000, 0x000b8b90, 0x000b8b90, 0x00000000 }, + { 0x00009aac, 0x00000000, 0x00000000, 0x000b8f80, 0x000b8f80, 0x00000000 }, + { 0x00009ab0, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, + { 0x00009ab4, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 }, + { 0x00009ab8, 0x00000000, 0x00000000, 0x000b8f8c, 0x000b8f8c, 0x00000000 }, + { 0x00009abc, 0x00000000, 0x00000000, 0x000b8f90, 0x000b8f90, 0x00000000 }, + { 0x00009ac0, 0x00000000, 0x00000000, 0x000bb30c, 0x000bb30c, 0x00000000 }, + { 0x00009ac4, 0x00000000, 0x00000000, 0x000bb310, 0x000bb310, 0x00000000 }, + { 0x00009ac8, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 }, + { 0x00009acc, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 }, + { 0x00009ad0, 0x00000000, 0x00000000, 0x000bb324, 0x000bb324, 0x00000000 }, + { 0x00009ad4, 0x00000000, 0x00000000, 0x000bb704, 0x000bb704, 0x00000000 }, + { 0x00009ad8, 0x00000000, 0x00000000, 0x000f96a4, 0x000f96a4, 0x00000000 }, + { 0x00009adc, 0x00000000, 0x00000000, 0x000f96a8, 0x000f96a8, 0x00000000 }, + { 0x00009ae0, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 }, + { 0x00009ae4, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 }, + { 0x00009ae8, 0x00000000, 0x00000000, 0x000f9720, 0x000f9720, 0x00000000 }, + { 0x00009aec, 0x00000000, 0x00000000, 0x000f9724, 0x000f9724, 0x00000000 }, + { 0x00009af0, 0x00000000, 0x00000000, 0x000f9728, 0x000f9728, 0x00000000 }, + { 0x00009af4, 0x00000000, 0x00000000, 0x000f972c, 0x000f972c, 0x00000000 }, + { 0x00009af8, 0x00000000, 0x00000000, 0x000f97a0, 0x000f97a0, 0x00000000 }, + { 0x00009afc, 0x00000000, 0x00000000, 0x000f97a4, 0x000f97a4, 0x00000000 }, + { 0x00009b00, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 }, + { 0x00009b04, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 }, + { 0x00009b08, 0x00000000, 0x00000000, 0x000fb7b4, 0x000fb7b4, 0x00000000 }, + { 0x00009b0c, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 }, + { 0x00009b10, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 }, + { 0x00009b14, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 }, + { 0x00009b18, 0x00000000, 0x00000000, 0x000fb7ad, 0x000fb7ad, 0x00000000 }, + { 0x00009b1c, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 }, + { 0x00009b20, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 }, + { 0x00009b24, 0x00000000, 0x00000000, 0x000fb7b9, 0x000fb7b9, 0x00000000 }, + { 0x00009b28, 0x00000000, 0x00000000, 0x000fb7c5, 0x000fb7c5, 0x00000000 }, + { 0x00009b2c, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 }, + { 0x00009b30, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 }, + { 0x00009b34, 0x00000000, 0x00000000, 0x000fb7d5, 0x000fb7d5, 0x00000000 }, + { 0x00009b38, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 }, + { 0x00009b3c, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 }, + { 0x00009b40, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 }, + { 0x00009b44, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 }, + { 0x00009b48, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 }, + { 0x00009b4c, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 }, + { 0x00009b50, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 }, + { 0x00009b54, 0x00000000, 0x00000000, 0x000fb7c7, 0x000fb7c7, 0x00000000 }, + { 0x00009b58, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 }, + { 0x00009b5c, 0x00000000, 0x00000000, 0x000fb7cf, 0x000fb7cf, 0x00000000 }, + { 0x00009b60, 0x00000000, 0x00000000, 0x000fb7d7, 0x000fb7d7, 0x00000000 }, + { 0x00009b64, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b68, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b6c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b70, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b74, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b78, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b7c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b80, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b84, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b88, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b8c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b90, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b94, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b98, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009b9c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009ba0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009ba4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009ba8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bac, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bb0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bb4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bb8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bbc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bc0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bc4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bc8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bcc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bd0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bd4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bd8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bdc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009be0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009be4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009be8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bec, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bf0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bf4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bf8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x00009bfc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, + { 0x0000aa00, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 }, + { 0x0000aa04, 0x00000000, 0x00000000, 0x00068080, 0x00068080, 0x00000000 }, + { 0x0000aa08, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 }, + { 0x0000aa0c, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 }, + { 0x0000aa10, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 }, + { 0x0000aa14, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 }, + { 0x0000aa18, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 }, + { 0x0000aa1c, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 }, + { 0x0000aa20, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 }, + { 0x0000aa24, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, + { 0x0000aa28, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, + { 0x0000aa2c, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 }, + { 0x0000aa30, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 }, + { 0x0000aa34, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 }, + { 0x0000aa38, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 }, + { 0x0000aa3c, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 }, + { 0x0000aa40, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 }, + { 0x0000aa44, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 }, + { 0x0000aa48, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 }, + { 0x0000aa4c, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 }, + { 0x0000aa50, 0x00000000, 0x00000000, 0x000681ac, 0x000681ac, 0x00000000 }, + { 0x0000aa54, 0x00000000, 0x00000000, 0x0006821c, 0x0006821c, 0x00000000 }, + { 0x0000aa58, 0x00000000, 0x00000000, 0x00068224, 0x00068224, 0x00000000 }, + { 0x0000aa5c, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 }, + { 0x0000aa60, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 }, + { 0x0000aa64, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 }, + { 0x0000aa68, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 }, + { 0x0000aa6c, 0x00000000, 0x00000000, 0x00068310, 0x00068310, 0x00000000 }, + { 0x0000aa70, 0x00000000, 0x00000000, 0x00068788, 0x00068788, 0x00000000 }, + { 0x0000aa74, 0x00000000, 0x00000000, 0x0006878c, 0x0006878c, 0x00000000 }, + { 0x0000aa78, 0x00000000, 0x00000000, 0x00068790, 0x00068790, 0x00000000 }, + { 0x0000aa7c, 0x00000000, 0x00000000, 0x00068794, 0x00068794, 0x00000000 }, + { 0x0000aa80, 0x00000000, 0x00000000, 0x00068798, 0x00068798, 0x00000000 }, + { 0x0000aa84, 0x00000000, 0x00000000, 0x0006879c, 0x0006879c, 0x00000000 }, + { 0x0000aa88, 0x00000000, 0x00000000, 0x00068b89, 0x00068b89, 0x00000000 }, + { 0x0000aa8c, 0x00000000, 0x00000000, 0x00068b8d, 0x00068b8d, 0x00000000 }, + { 0x0000aa90, 0x00000000, 0x00000000, 0x00068b91, 0x00068b91, 0x00000000 }, + { 0x0000aa94, 0x00000000, 0x00000000, 0x00068b95, 0x00068b95, 0x00000000 }, + { 0x0000aa98, 0x00000000, 0x00000000, 0x00068b99, 0x00068b99, 0x00000000 }, + { 0x0000aa9c, 0x00000000, 0x00000000, 0x00068ba5, 0x00068ba5, 0x00000000 }, + { 0x0000aaa0, 0x00000000, 0x00000000, 0x00068ba9, 0x00068ba9, 0x00000000 }, + { 0x0000aaa4, 0x00000000, 0x00000000, 0x00068bad, 0x00068bad, 0x00000000 }, + { 0x0000aaa8, 0x00000000, 0x00000000, 0x000b8b0c, 0x000b8b0c, 0x00000000 }, + { 0x0000aaac, 0x00000000, 0x00000000, 0x000b8f10, 0x000b8f10, 0x00000000 }, + { 0x0000aab0, 0x00000000, 0x00000000, 0x000b8f14, 0x000b8f14, 0x00000000 }, + { 0x0000aab4, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, + { 0x0000aab8, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, + { 0x0000aabc, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 }, + { 0x0000aac0, 0x00000000, 0x00000000, 0x000bb380, 0x000bb380, 0x00000000 }, + { 0x0000aac4, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 }, + { 0x0000aac8, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 }, + { 0x0000aacc, 0x00000000, 0x00000000, 0x000bb38c, 0x000bb38c, 0x00000000 }, + { 0x0000aad0, 0x00000000, 0x00000000, 0x000bb394, 0x000bb394, 0x00000000 }, + { 0x0000aad4, 0x00000000, 0x00000000, 0x000bb798, 0x000bb798, 0x00000000 }, + { 0x0000aad8, 0x00000000, 0x00000000, 0x000f970c, 0x000f970c, 0x00000000 }, + { 0x0000aadc, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 }, + { 0x0000aae0, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 }, + { 0x0000aae4, 0x00000000, 0x00000000, 0x000f9718, 0x000f9718, 0x00000000 }, + { 0x0000aae8, 0x00000000, 0x00000000, 0x000f9705, 0x000f9705, 0x00000000 }, + { 0x0000aaec, 0x00000000, 0x00000000, 0x000f9709, 0x000f9709, 0x00000000 }, + { 0x0000aaf0, 0x00000000, 0x00000000, 0x000f970d, 0x000f970d, 0x00000000 }, + { 0x0000aaf4, 0x00000000, 0x00000000, 0x000f9711, 0x000f9711, 0x00000000 }, + { 0x0000aaf8, 0x00000000, 0x00000000, 0x000f9715, 0x000f9715, 0x00000000 }, + { 0x0000aafc, 0x00000000, 0x00000000, 0x000f9719, 0x000f9719, 0x00000000 }, + { 0x0000ab00, 0x00000000, 0x00000000, 0x000fb7a4, 0x000fb7a4, 0x00000000 }, + { 0x0000ab04, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 }, + { 0x0000ab08, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 }, + { 0x0000ab0c, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 }, + { 0x0000ab10, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 }, + { 0x0000ab14, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 }, + { 0x0000ab18, 0x00000000, 0x00000000, 0x000fb7bc, 0x000fb7bc, 0x00000000 }, + { 0x0000ab1c, 0x00000000, 0x00000000, 0x000fb7a1, 0x000fb7a1, 0x00000000 }, + { 0x0000ab20, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 }, + { 0x0000ab24, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 }, + { 0x0000ab28, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 }, + { 0x0000ab2c, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 }, + { 0x0000ab30, 0x00000000, 0x00000000, 0x000fb7bd, 0x000fb7bd, 0x00000000 }, + { 0x0000ab34, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 }, + { 0x0000ab38, 0x00000000, 0x00000000, 0x000fb7cd, 0x000fb7cd, 0x00000000 }, + { 0x0000ab3c, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 }, + { 0x0000ab40, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 }, + { 0x0000ab44, 0x00000000, 0x00000000, 0x000fb7c2, 0x000fb7c2, 0x00000000 }, + { 0x0000ab48, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 }, + { 0x0000ab4c, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 }, + { 0x0000ab50, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 }, + { 0x0000ab54, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 }, + { 0x0000ab58, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 }, + { 0x0000ab5c, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 }, + { 0x0000ab60, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 }, + { 0x0000ab64, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab68, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab6c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab70, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab74, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab78, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab7c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab80, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab84, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab88, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab8c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab90, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab94, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab98, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000ab9c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000aba0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000aba4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000aba8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abac, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abb0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abb4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abb8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abbc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abc0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abc4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abc8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abcc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abd0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abd4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abd8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abdc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abe0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abe4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abe8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abec, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abf0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abf4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abf8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000abfc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, + { 0x0000a204, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 }, + { 0x0000a20c, 0x00000014, 0x00000014, 0x00000000, 0x00000000, 0x0001f000 }, + { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, + { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, + { 0x0000a250, 0x001ff000, 0x001ff000, 0x001ca000, 0x001ca000, 0x001da000 }, + { 0x0000a274, 0x0a81c652, 0x0a81c652, 0x0a820652, 0x0a820652, 0x0a82a652 }, + { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000a304, 0x00000000, 0x00000000, 0x00007201, 0x00007201, 0x00000000 }, + { 0x0000a308, 0x00000000, 0x00000000, 0x00010408, 0x00010408, 0x00000000 }, + { 0x0000a30c, 0x00000000, 0x00000000, 0x0001860a, 0x0001860a, 0x00000000 }, + { 0x0000a310, 0x00000000, 0x00000000, 0x00020818, 0x00020818, 0x00000000 }, + { 0x0000a314, 0x00000000, 0x00000000, 0x00024858, 0x00024858, 0x00000000 }, + { 0x0000a318, 0x00000000, 0x00000000, 0x00026859, 0x00026859, 0x00000000 }, + { 0x0000a31c, 0x00000000, 0x00000000, 0x0002985b, 0x0002985b, 0x00000000 }, + { 0x0000a320, 0x00000000, 0x00000000, 0x0002c89a, 0x0002c89a, 0x00000000 }, + { 0x0000a324, 0x00000000, 0x00000000, 0x0002e89b, 0x0002e89b, 0x00000000 }, + { 0x0000a328, 0x00000000, 0x00000000, 0x0003089c, 0x0003089c, 0x00000000 }, + { 0x0000a32c, 0x00000000, 0x00000000, 0x0003289d, 0x0003289d, 0x00000000 }, + { 0x0000a330, 0x00000000, 0x00000000, 0x0003489e, 0x0003489e, 0x00000000 }, + { 0x0000a334, 0x00000000, 0x00000000, 0x000388de, 0x000388de, 0x00000000 }, + { 0x0000a338, 0x00000000, 0x00000000, 0x0003b91e, 0x0003b91e, 0x00000000 }, + { 0x0000a33c, 0x00000000, 0x00000000, 0x0003d95e, 0x0003d95e, 0x00000000 }, + { 0x0000a340, 0x00000000, 0x00000000, 0x000419df, 0x000419df, 0x00000000 }, + { 0x0000a344, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, +}; + +static const u_int32_t ar9285Common[][2] = { + { 0x0000000c, 0x00000000 }, + { 0x00000030, 0x00020045 }, + { 0x00000034, 0x00000005 }, + { 0x00000040, 0x00000000 }, + { 0x00000044, 0x00000008 }, + { 0x00000048, 0x00000008 }, + { 0x0000004c, 0x00000010 }, + { 0x00000050, 0x00000000 }, + { 0x00000054, 0x0000001f }, + { 0x00000800, 0x00000000 }, + { 0x00000804, 0x00000000 }, + { 0x00000808, 0x00000000 }, + { 0x0000080c, 0x00000000 }, + { 0x00000810, 0x00000000 }, + { 0x00000814, 0x00000000 }, + { 0x00000818, 0x00000000 }, + { 0x0000081c, 0x00000000 }, + { 0x00000820, 0x00000000 }, + { 0x00000824, 0x00000000 }, + { 0x00001040, 0x002ffc0f }, + { 0x00001044, 0x002ffc0f }, + { 0x00001048, 0x002ffc0f }, + { 0x0000104c, 0x002ffc0f }, + { 0x00001050, 0x002ffc0f }, + { 0x00001054, 0x002ffc0f }, + { 0x00001058, 0x002ffc0f }, + { 0x0000105c, 0x002ffc0f }, + { 0x00001060, 0x002ffc0f }, + { 0x00001064, 0x002ffc0f }, + { 0x00001230, 0x00000000 }, + { 0x00001270, 0x00000000 }, + { 0x00001038, 0x00000000 }, + { 0x00001078, 0x00000000 }, + { 0x000010b8, 0x00000000 }, + { 0x000010f8, 0x00000000 }, + { 0x00001138, 0x00000000 }, + { 0x00001178, 0x00000000 }, + { 0x000011b8, 0x00000000 }, + { 0x000011f8, 0x00000000 }, + { 0x00001238, 0x00000000 }, + { 0x00001278, 0x00000000 }, + { 0x000012b8, 0x00000000 }, + { 0x000012f8, 0x00000000 }, + { 0x00001338, 0x00000000 }, + { 0x00001378, 0x00000000 }, + { 0x000013b8, 0x00000000 }, + { 0x000013f8, 0x00000000 }, + { 0x00001438, 0x00000000 }, + { 0x00001478, 0x00000000 }, + { 0x000014b8, 0x00000000 }, + { 0x000014f8, 0x00000000 }, + { 0x00001538, 0x00000000 }, + { 0x00001578, 0x00000000 }, + { 0x000015b8, 0x00000000 }, + { 0x000015f8, 0x00000000 }, + { 0x00001638, 0x00000000 }, + { 0x00001678, 0x00000000 }, + { 0x000016b8, 0x00000000 }, + { 0x000016f8, 0x00000000 }, + { 0x00001738, 0x00000000 }, + { 0x00001778, 0x00000000 }, + { 0x000017b8, 0x00000000 }, + { 0x000017f8, 0x00000000 }, + { 0x0000103c, 0x00000000 }, + { 0x0000107c, 0x00000000 }, + { 0x000010bc, 0x00000000 }, + { 0x000010fc, 0x00000000 }, + { 0x0000113c, 0x00000000 }, + { 0x0000117c, 0x00000000 }, + { 0x000011bc, 0x00000000 }, + { 0x000011fc, 0x00000000 }, + { 0x0000123c, 0x00000000 }, + { 0x0000127c, 0x00000000 }, + { 0x000012bc, 0x00000000 }, + { 0x000012fc, 0x00000000 }, + { 0x0000133c, 0x00000000 }, + { 0x0000137c, 0x00000000 }, + { 0x000013bc, 0x00000000 }, + { 0x000013fc, 0x00000000 }, + { 0x0000143c, 0x00000000 }, + { 0x0000147c, 0x00000000 }, + { 0x00004030, 0x00000002 }, + { 0x0000403c, 0x00000002 }, + { 0x00004024, 0x0000001f }, + { 0x00004060, 0x00000000 }, + { 0x00004064, 0x00000000 }, + { 0x00007010, 0x00000031 }, + { 0x00007034, 0x00000002 }, + { 0x00007038, 0x000004c2 }, + { 0x00008004, 0x00000000 }, + { 0x00008008, 0x00000000 }, + { 0x0000800c, 0x00000000 }, + { 0x00008018, 0x00000700 }, + { 0x00008020, 0x00000000 }, + { 0x00008038, 0x00000000 }, + { 0x0000803c, 0x00000000 }, + { 0x00008048, 0x00000000 }, + { 0x00008054, 0x00000000 }, + { 0x00008058, 0x00000000 }, + { 0x0000805c, 0x000fc78f }, + { 0x00008060, 0x0000000f }, + { 0x00008064, 0x00000000 }, + { 0x00008070, 0x00000000 }, + { 0x000080c0, 0x2a80001a }, + { 0x000080c4, 0x05dc01e0 }, + { 0x000080c8, 0x1f402710 }, + { 0x000080cc, 0x01f40000 }, + { 0x000080d0, 0x00001e00 }, + { 0x000080d4, 0x00000000 }, + { 0x000080d8, 0x00400000 }, + { 0x000080e0, 0xffffffff }, + { 0x000080e4, 0x0000ffff }, + { 0x000080e8, 0x003f3f3f }, + { 0x000080ec, 0x00000000 }, + { 0x000080f0, 0x00000000 }, + { 0x000080f4, 0x00000000 }, + { 0x000080f8, 0x00000000 }, + { 0x000080fc, 0x00020000 }, + { 0x00008100, 0x00020000 }, + { 0x00008104, 0x00000001 }, + { 0x00008108, 0x00000052 }, + { 0x0000810c, 0x00000000 }, + { 0x00008110, 0x00000168 }, + { 0x00008118, 0x000100aa }, + { 0x0000811c, 0x00003210 }, + { 0x00008120, 0x08f04800 }, + { 0x00008124, 0x00000000 }, + { 0x00008128, 0x00000000 }, + { 0x0000812c, 0x00000000 }, + { 0x00008130, 0x00000000 }, + { 0x00008134, 0x00000000 }, + { 0x00008138, 0x00000000 }, + { 0x0000813c, 0x00000000 }, + { 0x00008144, 0x00000000 }, + { 0x00008168, 0x00000000 }, + { 0x0000816c, 0x00000000 }, + { 0x00008170, 0x32143320 }, + { 0x00008174, 0xfaa4fa50 }, + { 0x00008178, 0x00000100 }, + { 0x0000817c, 0x00000000 }, + { 0x000081c0, 0x00000000 }, + { 0x000081d0, 0x00003210 }, + { 0x000081ec, 0x00000000 }, + { 0x000081f0, 0x00000000 }, + { 0x000081f4, 0x00000000 }, + { 0x000081f8, 0x00000000 }, + { 0x000081fc, 0x00000000 }, + { 0x00008200, 0x00000000 }, + { 0x00008204, 0x00000000 }, + { 0x00008208, 0x00000000 }, + { 0x0000820c, 0x00000000 }, + { 0x00008210, 0x00000000 }, + { 0x00008214, 0x00000000 }, + { 0x00008218, 0x00000000 }, + { 0x0000821c, 0x00000000 }, + { 0x00008220, 0x00000000 }, + { 0x00008224, 0x00000000 }, + { 0x00008228, 0x00000000 }, + { 0x0000822c, 0x00000000 }, + { 0x00008230, 0x00000000 }, + { 0x00008234, 0x00000000 }, + { 0x00008238, 0x00000000 }, + { 0x0000823c, 0x00000000 }, + { 0x00008240, 0x00100000 }, + { 0x00008244, 0x0010f400 }, + { 0x00008248, 0x00000100 }, + { 0x0000824c, 0x0001e800 }, + { 0x00008250, 0x00000000 }, + { 0x00008254, 0x00000000 }, + { 0x00008258, 0x00000000 }, + { 0x0000825c, 0x400000ff }, + { 0x00008260, 0x00080922 }, + { 0x00008264, 0xa8a00010 }, + { 0x00008270, 0x00000000 }, + { 0x00008274, 0x40000000 }, + { 0x00008278, 0x003e4180 }, + { 0x0000827c, 0x00000000 }, + { 0x00008284, 0x0000002c }, + { 0x00008288, 0x0000002c }, + { 0x0000828c, 0x00000000 }, + { 0x00008294, 0x00000000 }, + { 0x00008298, 0x00000000 }, + { 0x0000829c, 0x00000000 }, + { 0x00008300, 0x00000040 }, + { 0x00008314, 0x00000000 }, + { 0x00008328, 0x00000000 }, + { 0x0000832c, 0x00000001 }, + { 0x00008330, 0x00000302 }, + { 0x00008334, 0x00000e00 }, + { 0x00008338, 0x00000000 }, + { 0x0000833c, 0x00000000 }, + { 0x00008340, 0x00010380 }, + { 0x00008344, 0x00481043 }, + { 0x00009808, 0x00000000 }, + { 0x0000980c, 0xafe68e30 }, + { 0x00009810, 0xfd14e000 }, + { 0x00009814, 0x9c0a9f6b }, + { 0x0000981c, 0x00000000 }, + { 0x0000982c, 0x0000a000 }, + { 0x00009830, 0x00000000 }, + { 0x0000983c, 0x00200400 }, + { 0x0000984c, 0x0040233c }, + { 0x00009854, 0x00000044 }, + { 0x00009900, 0x00000000 }, + { 0x00009904, 0x00000000 }, + { 0x00009908, 0x00000000 }, + { 0x0000990c, 0x00000000 }, + { 0x00009910, 0x01002310 }, + { 0x0000991c, 0x10000fff }, + { 0x00009920, 0x04900000 }, + { 0x00009928, 0x00000001 }, + { 0x0000992c, 0x00000004 }, + { 0x00009934, 0x1e1f2022 }, + { 0x00009938, 0x0a0b0c0d }, + { 0x0000993c, 0x00000000 }, + { 0x00009940, 0x14750604 }, + { 0x00009948, 0x9280c00a }, + { 0x0000994c, 0x00020028 }, + { 0x00009954, 0x5f3ca3de }, + { 0x00009958, 0x2108ecff }, + { 0x00009968, 0x000003ce }, + { 0x00009970, 0x1927b515 }, + { 0x00009974, 0x00000000 }, + { 0x00009978, 0x00000001 }, + { 0x0000997c, 0x00000000 }, + { 0x00009980, 0x00000000 }, + { 0x00009984, 0x00000000 }, + { 0x00009988, 0x00000000 }, + { 0x0000998c, 0x00000000 }, + { 0x00009990, 0x00000000 }, + { 0x00009994, 0x00000000 }, + { 0x00009998, 0x00000000 }, + { 0x0000999c, 0x00000000 }, + { 0x000099a0, 0x00000000 }, + { 0x000099a4, 0x00000001 }, + { 0x000099a8, 0x201fff00 }, + { 0x000099ac, 0x2def0a00 }, + { 0x000099b0, 0x03051000 }, + { 0x000099b4, 0x00000820 }, + { 0x000099dc, 0x00000000 }, + { 0x000099e0, 0x00000000 }, + { 0x000099e4, 0xaaaaaaaa }, + { 0x000099e8, 0x3c466478 }, + { 0x000099ec, 0x0cc80caa }, + { 0x000099f0, 0x00000000 }, + { 0x0000a208, 0x803e6788 }, + { 0x0000a210, 0x4080a333 }, + { 0x0000a214, 0x00206c10 }, + { 0x0000a218, 0x009c4060 }, + { 0x0000a220, 0x01834061 }, + { 0x0000a224, 0x00000400 }, + { 0x0000a228, 0x000003b5 }, + { 0x0000a22c, 0x00000000 }, + { 0x0000a234, 0x20202020 }, + { 0x0000a238, 0x20202020 }, + { 0x0000a244, 0x00000000 }, + { 0x0000a248, 0xfffffffc }, + { 0x0000a24c, 0x00000000 }, + { 0x0000a254, 0x00000000 }, + { 0x0000a258, 0x0ccb5380 }, + { 0x0000a25c, 0x15151501 }, + { 0x0000a260, 0xdfa90f01 }, + { 0x0000a268, 0x00000000 }, + { 0x0000a26c, 0x0ebae9e6 }, + { 0x0000d270, 0x0d820820 }, + { 0x0000a278, 0x39ce739c }, + { 0x0000a27c, 0x050e039c }, + { 0x0000d35c, 0x07ffffef }, + { 0x0000d360, 0x0fffffe7 }, + { 0x0000d364, 0x17ffffe5 }, + { 0x0000d368, 0x1fffffe4 }, + { 0x0000d36c, 0x37ffffe3 }, + { 0x0000d370, 0x3fffffe3 }, + { 0x0000d374, 0x57ffffe3 }, + { 0x0000d378, 0x5fffffe2 }, + { 0x0000d37c, 0x7fffffe2 }, + { 0x0000d380, 0x7f3c7bba }, + { 0x0000d384, 0xf3307ff0 }, + { 0x0000a388, 0x0c000000 }, + { 0x0000a38c, 0x20202020 }, + { 0x0000a390, 0x20202020 }, + { 0x0000a394, 0x39ce739c }, + { 0x0000a398, 0x0000039c }, + { 0x0000a39c, 0x00000001 }, + { 0x0000a3a0, 0x00000000 }, + { 0x0000a3a4, 0x00000000 }, + { 0x0000a3a8, 0x00000000 }, + { 0x0000a3ac, 0x00000000 }, + { 0x0000a3b0, 0x00000000 }, + { 0x0000a3b4, 0x00000000 }, + { 0x0000a3b8, 0x00000000 }, + { 0x0000a3bc, 0x00000000 }, + { 0x0000a3c0, 0x00000000 }, + { 0x0000a3c4, 0x00000000 }, + { 0x0000a3cc, 0x20202020 }, + { 0x0000a3d0, 0x20202020 }, + { 0x0000a3d4, 0x20202020 }, + { 0x0000a3dc, 0x39ce739c }, + { 0x0000a3e0, 0x0000039c }, + { 0x0000a3e4, 0x00000000 }, + { 0x0000a3e8, 0x18c43433 }, + { 0x0000a3ec, 0x00f70081 }, + { 0x00007800, 0x00140000 }, + { 0x00007804, 0x0e4548d8 }, + { 0x00007808, 0x54214514 }, + { 0x0000780c, 0x02025820 }, + { 0x00007810, 0x71c0d388 }, + { 0x00007814, 0x924934a8 }, + { 0x0000781c, 0x00000000 }, + { 0x00007820, 0x00000c04 }, + { 0x00007824, 0x00d86fff }, + { 0x00007828, 0x26d2491b }, + { 0x0000782c, 0x6e36d97b }, + { 0x00007830, 0xedb6d96c }, + { 0x00007834, 0x71400086 }, + { 0x00007838, 0xfac68800 }, + { 0x0000783c, 0x0001fffe }, + { 0x00007840, 0xffeb1a20 }, + { 0x00007844, 0x000c0db6 }, + { 0x00007848, 0x6db61b6f }, + { 0x0000784c, 0x6d9b66db }, + { 0x00007850, 0x6d8c6dba }, + { 0x00007854, 0x00040000 }, + { 0x00007858, 0xdb003012 }, + { 0x0000785c, 0x04924914 }, + { 0x00007860, 0x21084210 }, + { 0x00007864, 0xf7d7ffde }, + { 0x00007868, 0xc2034080 }, + { 0x0000786c, 0x48609eb4 }, + { 0x00007870, 0x10142c00 }, +}; + +static const u_int32_t ar9285PciePhy_clkreq_always_on_L1[][2] = { + {0x00004040, 0x9248fd00 }, + {0x00004040, 0x24924924 }, + {0x00004040, 0xa8000019 }, + {0x00004040, 0x13160820 }, + {0x00004040, 0xe5980560 }, + {0x00004040, 0xc01dcffd }, + {0x00004040, 0x1aaabe41 }, + {0x00004040, 0xbe105554 }, + {0x00004040, 0x00043007 }, + {0x00004044, 0x00000000 }, +}; + +static const u_int32_t ar9285PciePhy_clkreq_off_L1[][2] = { + {0x00004040, 0x9248fd00 }, + {0x00004040, 0x24924924 }, + {0x00004040, 0xa8000019 }, + {0x00004040, 0x13160820 }, + {0x00004040, 0xe5980560 }, + {0x00004040, 0xc01dcffc }, + {0x00004040, 0x1aaabe41 }, + {0x00004040, 0xbe105554 }, + {0x00004040, 0x00043007 }, + {0x00004044, 0x00000000 }, +}; diff --git a/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c b/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c new file mode 100644 index 000000000000..946133a396f0 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar9285_attach.c @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2008-2009 Sam Leffler, Errno Consulting + * Copyright (c) 2008 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ +#include "opt_ah.h" + +#include "ah.h" +#include "ah_internal.h" +#include "ah_devid.h" + +#include "ah_eeprom_v4k.h" /* XXX for tx/rx gain */ + +#include "ar5416/ar9280.h" +#include "ar5416/ar9285.h" +#include "ar5416/ar5416reg.h" +#include "ar5416/ar5416phy.h" + +#include "ar5416/ar9285.ini" +#include "ar5416/ar9285v2.ini" +#include "ar5416/ar9280v2.ini" /* XXX ini for tx/rx gain */ + +static const HAL_PERCAL_DATA ar9280_iq_cal = { /* single sample */ + .calName = "IQ", .calType = IQ_MISMATCH_CAL, + .calNumSamples = MIN_CAL_SAMPLES, + .calCountMax = PER_MAX_LOG_COUNT, + .calCollect = ar5416IQCalCollect, + .calPostProc = ar5416IQCalibration +}; +static const HAL_PERCAL_DATA ar9280_adc_gain_cal = { /* single sample */ + .calName = "ADC Gain", .calType = ADC_GAIN_CAL, + .calNumSamples = MIN_CAL_SAMPLES, + .calCountMax = PER_MIN_LOG_COUNT, + .calCollect = ar5416AdcGainCalCollect, + .calPostProc = ar5416AdcGainCalibration +}; +static const HAL_PERCAL_DATA ar9280_adc_dc_cal = { /* single sample */ + .calName = "ADC DC", .calType = ADC_DC_CAL, + .calNumSamples = MIN_CAL_SAMPLES, + .calCountMax = PER_MIN_LOG_COUNT, + .calCollect = ar5416AdcDcCalCollect, + .calPostProc = ar5416AdcDcCalibration +}; +static const HAL_PERCAL_DATA ar9280_adc_init_dc_cal = { + .calName = "ADC Init DC", .calType = ADC_DC_INIT_CAL, + .calNumSamples = MIN_CAL_SAMPLES, + .calCountMax = INIT_LOG_COUNT, + .calCollect = ar5416AdcDcCalCollect, + .calPostProc = ar5416AdcDcCalibration +}; + +static void ar9285ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore); +static HAL_BOOL ar9285FillCapabilityInfo(struct ath_hal *ah); +static void ar9285WriteIni(struct ath_hal *ah, + const struct ieee80211_channel *chan); + +static void +ar9285AniSetup(struct ath_hal *ah) +{ + /* NB: disable ANI for reliable RIFS rx */ + ar5212AniAttach(ah, AH_NULL, AH_NULL, AH_FALSE); +} + +/* + * Attach for an AR9285 part. + */ +static struct ath_hal * +ar9285Attach(uint16_t devid, HAL_SOFTC sc, + HAL_BUS_TAG st, HAL_BUS_HANDLE sh, HAL_STATUS *status) +{ + struct ath_hal_9285 *ahp9285; + struct ath_hal_5212 *ahp; + struct ath_hal *ah; + uint32_t val; + HAL_STATUS ecode; + HAL_BOOL rfStatus; + + HALDEBUG(AH_NULL, HAL_DEBUG_ATTACH, "%s: sc %p st %p sh %p\n", + __func__, sc, (void*) st, (void*) sh); + + /* NB: memory is returned zero'd */ + ahp9285 = ath_hal_malloc(sizeof (struct ath_hal_9285)); + if (ahp9285 == AH_NULL) { + HALDEBUG(AH_NULL, HAL_DEBUG_ANY, + "%s: cannot allocate memory for state block\n", __func__); + *status = HAL_ENOMEM; + return AH_NULL; + } + ahp = AH5212(ahp9285); + ah = &ahp->ah_priv.h; + + ar5416InitState(AH5416(ah), devid, sc, st, sh, status); + + /* XXX override with 9285 specific state */ + /* override 5416 methods for our needs */ + ah->ah_setAntennaSwitch = ar9285SetAntennaSwitch; + ah->ah_configPCIE = ar9285ConfigPCIE; + ah->ah_setTxPower = ar9285SetTransmitPower; + ah->ah_setBoardValues = ar9285SetBoardValues; + + AH5416(ah)->ah_cal.iqCalData.calData = &ar9280_iq_cal; + AH5416(ah)->ah_cal.adcGainCalData.calData = &ar9280_adc_gain_cal; + AH5416(ah)->ah_cal.adcDcCalData.calData = &ar9280_adc_dc_cal; + AH5416(ah)->ah_cal.adcDcCalInitData.calData = &ar9280_adc_init_dc_cal; + AH5416(ah)->ah_cal.suppCals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL; + + AH5416(ah)->ah_spurMitigate = ar9280SpurMitigate; + AH5416(ah)->ah_writeIni = ar9285WriteIni; + AH5416(ah)->ah_rx_chainmask = AR9285_DEFAULT_RXCHAINMASK; + AH5416(ah)->ah_tx_chainmask = AR9285_DEFAULT_TXCHAINMASK; + + ahp->ah_maxTxTrigLev = MAX_TX_FIFO_THRESHOLD >> 1; + + if (!ar5416SetResetReg(ah, HAL_RESET_POWER_ON)) { + /* reset chip */ + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't reset chip\n", + __func__); + ecode = HAL_EIO; + goto bad; + } + + if (!ar5416SetPowerMode(ah, HAL_PM_AWAKE, AH_TRUE)) { + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: couldn't wakeup chip\n", + __func__); + ecode = HAL_EIO; + goto bad; + } + /* Read Revisions from Chips before taking out of reset */ + val = OS_REG_READ(ah, AR_SREV); + HALDEBUG(ah, HAL_DEBUG_ATTACH, + "%s: ID 0x%x VERSION 0x%x TYPE 0x%x REVISION 0x%x\n", + __func__, MS(val, AR_XSREV_ID), MS(val, AR_XSREV_VERSION), + MS(val, AR_XSREV_TYPE), MS(val, AR_XSREV_REVISION)); + /* NB: include chip type to differentiate from pre-Sowl versions */ + AH_PRIVATE(ah)->ah_macVersion = + (val & AR_XSREV_VERSION) >> AR_XSREV_TYPE_S; + AH_PRIVATE(ah)->ah_macRev = MS(val, AR_XSREV_REVISION); + AH_PRIVATE(ah)->ah_ispcie = (val & AR_XSREV_TYPE_HOST_MODE) == 0; + + /* setup common ini data; rf backends handle remainder */ + if (AR_SREV_KITE_12_OR_LATER(ah)) { + HAL_INI_INIT(&ahp->ah_ini_modes, ar9285Modes_v2, 6); + HAL_INI_INIT(&ahp->ah_ini_common, ar9285Common_v2, 2); + HAL_INI_INIT(&AH5416(ah)->ah_ini_pcieserdes, + ar9285PciePhy_clkreq_always_on_L1_v2, 2); + } else { + HAL_INI_INIT(&ahp->ah_ini_modes, ar9285Modes, 6); + HAL_INI_INIT(&ahp->ah_ini_common, ar9285Common, 2); + HAL_INI_INIT(&AH5416(ah)->ah_ini_pcieserdes, + ar9285PciePhy_clkreq_always_on_L1, 2); + } + ar5416AttachPCIE(ah); + + ecode = ath_hal_v4kEepromAttach(ah); + if (ecode != HAL_OK) + goto bad; + + if (!ar5416ChipReset(ah, AH_NULL)) { /* reset chip */ + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: chip reset failed\n", + __func__); + ecode = HAL_EIO; + goto bad; + } + + AH_PRIVATE(ah)->ah_phyRev = OS_REG_READ(ah, AR_PHY_CHIP_ID); + + if (!ar5212ChipTest(ah)) { + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: hardware self-test failed\n", + __func__); + ecode = HAL_ESELFTEST; + goto bad; + } + + /* + * Set correct Baseband to analog shift + * setting to access analog chips. + */ + OS_REG_WRITE(ah, AR_PHY(0), 0x00000007); + + /* Read Radio Chip Rev Extract */ + AH_PRIVATE(ah)->ah_analog5GhzRev = ar5416GetRadioRev(ah); + switch (AH_PRIVATE(ah)->ah_analog5GhzRev & AR_RADIO_SREV_MAJOR) { + case AR_RAD2133_SREV_MAJOR: /* Sowl: 2G/3x3 */ + case AR_RAD5133_SREV_MAJOR: /* Sowl: 2+5G/3x3 */ + break; + default: + if (AH_PRIVATE(ah)->ah_analog5GhzRev == 0) { + AH_PRIVATE(ah)->ah_analog5GhzRev = + AR_RAD5133_SREV_MAJOR; + break; + } +#ifdef AH_DEBUG + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s: 5G Radio Chip Rev 0x%02X is not supported by " + "this driver\n", __func__, + AH_PRIVATE(ah)->ah_analog5GhzRev); + ecode = HAL_ENOTSUPP; + goto bad; +#endif + } + rfStatus = ar9285RfAttach(ah, &ecode); + if (!rfStatus) { + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: RF setup failed, status %u\n", + __func__, ecode); + goto bad; + } + + HAL_INI_INIT(&ahp9285->ah_ini_rxgain, ar9280Modes_original_rxgain_v2, + 6); + /* setup txgain table */ + switch (ath_hal_eepromGet(ah, AR_EEP_TXGAIN_TYPE, AH_NULL)) { + case AR5416_EEP_TXGAIN_HIGH_POWER: + HAL_INI_INIT(&ahp9285->ah_ini_txgain, + ar9285Modes_high_power_tx_gain_v2, 6); + break; + case AR5416_EEP_TXGAIN_ORIG: + HAL_INI_INIT(&ahp9285->ah_ini_txgain, + ar9285Modes_original_tx_gain_v2, 6); + break; + default: + HALASSERT(AH_FALSE); + goto bad; /* XXX ? try to continue */ + } + + /* + * Got everything we need now to setup the capabilities. + */ + if (!ar9285FillCapabilityInfo(ah)) { + ecode = HAL_EEREAD; + goto bad; + } + + ecode = ath_hal_eepromGet(ah, AR_EEP_MACADDR, ahp->ah_macaddr); + if (ecode != HAL_OK) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s: error getting mac address from EEPROM\n", __func__); + goto bad; + } + /* XXX How about the serial number ? */ + /* Read Reg Domain */ + AH_PRIVATE(ah)->ah_currentRD = + ath_hal_eepromGet(ah, AR_EEP_REGDMN_0, AH_NULL); + + /* + * ah_miscMode is populated by ar5416FillCapabilityInfo() + * starting from griffin. Set here to make sure that + * AR_MISC_MODE_MIC_NEW_LOC_ENABLE is set before a GTK is + * placed into hardware. + */ + if (ahp->ah_miscMode != 0) + OS_REG_WRITE(ah, AR_MISC_MODE, ahp->ah_miscMode); + + ar9285AniSetup(ah); /* Anti Noise Immunity */ + ar5416InitNfHistBuff(AH5416(ah)->ah_cal.nfCalHist); + + HALDEBUG(ah, HAL_DEBUG_ATTACH, "%s: return\n", __func__); + + return ah; +bad: + if (ah != AH_NULL) + ah->ah_detach(ah); + if (status) + *status = ecode; + return AH_NULL; +} + +static void +ar9285ConfigPCIE(struct ath_hal *ah, HAL_BOOL restore) +{ + if (AH_PRIVATE(ah)->ah_ispcie && !restore) { + ath_hal_ini_write(ah, &AH5416(ah)->ah_ini_pcieserdes, 1, 0); + OS_DELAY(1000); + OS_REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); + OS_REG_WRITE(ah, AR_WA, AR9285_WA_DEFAULT); + } +} + +static void +ar9285WriteIni(struct ath_hal *ah, const struct ieee80211_channel *chan) +{ + u_int modesIndex, freqIndex; + int regWrites = 0; + + /* Setup the indices for the next set of register array writes */ + /* XXX Ignore 11n dynamic mode on the AR5416 for the moment */ + freqIndex = 2; + if (IEEE80211_IS_CHAN_HT40(chan)) + modesIndex = 3; + else if (IEEE80211_IS_CHAN_108G(chan)) + modesIndex = 5; + else + modesIndex = 4; + + /* Set correct Baseband to analog shift setting to access analog chips. */ + OS_REG_WRITE(ah, AR_PHY(0), 0x00000007); + OS_REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); + regWrites = ath_hal_ini_write(ah, &AH5212(ah)->ah_ini_modes, + modesIndex, regWrites); + if (AR_SREV_KITE_12_OR_LATER(ah)) { + regWrites = ath_hal_ini_write(ah, &AH9285(ah)->ah_ini_txgain, + modesIndex, regWrites); + } + regWrites = ath_hal_ini_write(ah, &AH5212(ah)->ah_ini_common, + 1, regWrites); + +} + +/* + * Fill all software cached or static hardware state information. + * Return failure if capabilities are to come from EEPROM and + * cannot be read. + */ +static HAL_BOOL +ar9285FillCapabilityInfo(struct ath_hal *ah) +{ + HAL_CAPABILITIES *pCap = &AH_PRIVATE(ah)->ah_caps; + + if (!ar5416FillCapabilityInfo(ah)) + return AH_FALSE; + pCap->halNumGpioPins = 12; + pCap->halWowSupport = AH_TRUE; + pCap->halWowMatchPatternExact = AH_TRUE; +#if 0 + pCap->halWowMatchPatternDword = AH_TRUE; +#endif + pCap->halCSTSupport = AH_TRUE; + pCap->halRifsRxSupport = AH_TRUE; + pCap->halRifsTxSupport = AH_TRUE; + pCap->halRtsAggrLimit = 64*1024; /* 802.11n max */ + pCap->halExtChanDfsSupport = AH_TRUE; +#if 0 + /* XXX bluetooth */ + pCap->halBtCoexSupport = AH_TRUE; +#endif + pCap->halAutoSleepSupport = AH_FALSE; /* XXX? */ +#if 0 + pCap->hal4kbSplitTransSupport = AH_FALSE; +#endif + pCap->halRxStbcSupport = 1; + pCap->halTxStbcSupport = 1; + + return AH_TRUE; +} + +HAL_BOOL +ar9285SetAntennaSwitch(struct ath_hal *ah, HAL_ANT_SETTING settings) +{ +#define ANTENNA0_CHAINMASK 0x1 +#define ANTENNA1_CHAINMASK 0x2 + struct ath_hal_5416 *ahp = AH5416(ah); + + /* Antenna selection is done by setting the tx/rx chainmasks approp. */ + switch (settings) { + case HAL_ANT_FIXED_A: + /* Enable first antenna only */ + ahp->ah_tx_chainmask = ANTENNA0_CHAINMASK; + ahp->ah_rx_chainmask = ANTENNA0_CHAINMASK; + break; + case HAL_ANT_FIXED_B: + /* Enable second antenna only, after checking capability */ + if (AH_PRIVATE(ah)->ah_caps.halTxChainMask > ANTENNA1_CHAINMASK) + ahp->ah_tx_chainmask = ANTENNA1_CHAINMASK; + ahp->ah_rx_chainmask = ANTENNA1_CHAINMASK; + break; + case HAL_ANT_VARIABLE: + /* Restore original chainmask settings */ + /* XXX */ + ahp->ah_tx_chainmask = AR5416_DEFAULT_TXCHAINMASK; + ahp->ah_rx_chainmask = AR5416_DEFAULT_RXCHAINMASK; + break; + } + return AH_TRUE; +#undef ANTENNA0_CHAINMASK +#undef ANTENNA1_CHAINMASK +} + +static const char* +ar9285Probe(uint16_t vendorid, uint16_t devid) +{ + if (vendorid == ATHEROS_VENDOR_ID && devid == AR9285_DEVID_PCIE) + return "Atheros 9285"; + return AH_NULL; +} +AH_CHIP(AR9285, ar9285Probe, ar9285Attach); diff --git a/sys/dev/ath/ath_hal/ar5416/ar9285_reset.c b/sys/dev/ath/ath_hal/ar5416/ar9285_reset.c new file mode 100644 index 000000000000..8c2de10c3c5a --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar9285_reset.c @@ -0,0 +1,951 @@ +/* + * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting + * Copyright (c) 2002-2008 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +/* + * This is almost the same as ar5416_reset.c but uses the v4k EEPROM and + * supports only 2Ghz operation. + */ + +#include "opt_ah.h" + +#include "ah.h" +#include "ah_internal.h" +#include "ah_devid.h" + +#include "ah_eeprom_v14.h" +#include "ah_eeprom_v4k.h" + +#include "ar5416/ar9285.h" +#include "ar5416/ar5416.h" +#include "ar5416/ar5416reg.h" +#include "ar5416/ar5416phy.h" + +/* Eeprom versioning macros. Returns true if the version is equal or newer than the ver specified */ +#define EEP_MINOR(_ah) \ + (AH_PRIVATE(_ah)->ah_eeversion & AR5416_EEP_VER_MINOR_MASK) +#define IS_EEP_MINOR_V2(_ah) (EEP_MINOR(_ah) >= AR5416_EEP_MINOR_VER_2) +#define IS_EEP_MINOR_V3(_ah) (EEP_MINOR(_ah) >= AR5416_EEP_MINOR_VER_3) + +/* Additional Time delay to wait after activiting the Base band */ +#define BASE_ACTIVATE_DELAY 100 /* 100 usec */ +#define PLL_SETTLE_DELAY 300 /* 300 usec */ +#define RTC_PLL_SETTLE_DELAY 1000 /* 1 ms */ + +static HAL_BOOL ar9285SetPowerPerRateTable(struct ath_hal *ah, + struct ar5416eeprom_4k *pEepData, + const struct ieee80211_channel *chan, int16_t *ratesArray, + uint16_t cfgCtl, uint16_t AntennaReduction, + uint16_t twiceMaxRegulatoryPower, + uint16_t powerLimit); +static HAL_BOOL ar9285SetPowerCalTable(struct ath_hal *ah, + struct ar5416eeprom_4k *pEepData, + const struct ieee80211_channel *chan, + int16_t *pTxPowerIndexOffset); +static int16_t interpolate(uint16_t target, uint16_t srcLeft, + uint16_t srcRight, int16_t targetLeft, int16_t targetRight); +static HAL_BOOL ar9285FillVpdTable(uint8_t, uint8_t, uint8_t *, uint8_t *, + uint16_t, uint8_t *); +static void ar9285GetGainBoundariesAndPdadcs(struct ath_hal *ah, + const struct ieee80211_channel *chan, CAL_DATA_PER_FREQ_4K *pRawDataSet, + uint8_t * bChans, uint16_t availPiers, + uint16_t tPdGainOverlap, int16_t *pMinCalPower, + uint16_t * pPdGainBoundaries, uint8_t * pPDADCValues, + uint16_t numXpdGains); +static HAL_BOOL getLowerUpperIndex(uint8_t target, uint8_t *pList, + uint16_t listSize, uint16_t *indexL, uint16_t *indexR); +static uint16_t ar9285GetMaxEdgePower(uint16_t, CAL_CTL_EDGES *); + +/* XXX gag, this is sick */ +typedef enum Ar5416_Rates { + rate6mb, rate9mb, rate12mb, rate18mb, + rate24mb, rate36mb, rate48mb, rate54mb, + rate1l, rate2l, rate2s, rate5_5l, + rate5_5s, rate11l, rate11s, rateXr, + rateHt20_0, rateHt20_1, rateHt20_2, rateHt20_3, + rateHt20_4, rateHt20_5, rateHt20_6, rateHt20_7, + rateHt40_0, rateHt40_1, rateHt40_2, rateHt40_3, + rateHt40_4, rateHt40_5, rateHt40_6, rateHt40_7, + rateDupCck, rateDupOfdm, rateExtCck, rateExtOfdm, + Ar5416RateSize +} AR5416_RATES; + +HAL_BOOL +ar9285SetTransmitPower(struct ath_hal *ah, + const struct ieee80211_channel *chan, uint16_t *rfXpdGain) +{ +#define POW_SM(_r, _s) (((_r) & 0x3f) << (_s)) +#define N(a) (sizeof (a) / sizeof (a[0])) + + MODAL_EEP4K_HEADER *pModal; + struct ath_hal_5212 *ahp = AH5212(ah); + int16_t ratesArray[Ar5416RateSize]; + int16_t txPowerIndexOffset = 0; + uint8_t ht40PowerIncForPdadc = 2; + int i; + + uint16_t cfgCtl; + uint16_t powerLimit; + uint16_t twiceAntennaReduction; + uint16_t twiceMaxRegulatoryPower; + int16_t maxPower; + HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + struct ar5416eeprom_4k *pEepData = &ee->ee_base; + + HALASSERT(AH_PRIVATE(ah)->ah_eeversion >= AR_EEPROM_VER14_1); + + /* Setup info for the actual eeprom */ + OS_MEMZERO(ratesArray, sizeof(ratesArray)); + cfgCtl = ath_hal_getctl(ah, chan); + powerLimit = chan->ic_maxregpower * 2; + twiceAntennaReduction = chan->ic_maxantgain; + twiceMaxRegulatoryPower = AH_MIN(MAX_RATE_POWER, AH_PRIVATE(ah)->ah_powerLimit); + pModal = &pEepData->modalHeader; + HALDEBUG(ah, HAL_DEBUG_RESET, "%s Channel=%u CfgCtl=%u\n", + __func__,chan->ic_freq, cfgCtl ); + + if (IS_EEP_MINOR_V2(ah)) { + ht40PowerIncForPdadc = pModal->ht40PowerIncForPdadc; + } + + if (!ar9285SetPowerPerRateTable(ah, pEepData, chan, + &ratesArray[0],cfgCtl, + twiceAntennaReduction, + twiceMaxRegulatoryPower, powerLimit)) { + HALDEBUG(ah, HAL_DEBUG_ANY, + "%s: unable to set tx power per rate table\n", __func__); + return AH_FALSE; + } + + if (!ar9285SetPowerCalTable(ah, pEepData, chan, &txPowerIndexOffset)) { + HALDEBUG(ah, HAL_DEBUG_ANY, "%s: unable to set power table\n", + __func__); + return AH_FALSE; + } + + maxPower = AH_MAX(ratesArray[rate6mb], ratesArray[rateHt20_0]); + maxPower = AH_MAX(maxPower, ratesArray[rate1l]); + + if (IEEE80211_IS_CHAN_HT40(chan)) { + maxPower = AH_MAX(maxPower, ratesArray[rateHt40_0]); + } + + ahp->ah_tx6PowerInHalfDbm = maxPower; + AH_PRIVATE(ah)->ah_maxPowerLevel = maxPower; + ahp->ah_txPowerIndexOffset = txPowerIndexOffset; + + /* + * txPowerIndexOffset is set by the SetPowerTable() call - + * adjust the rate table (0 offset if rates EEPROM not loaded) + */ + for (i = 0; i < N(ratesArray); i++) { + ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]); + if (ratesArray[i] > AR5416_MAX_RATE_POWER) + ratesArray[i] = AR5416_MAX_RATE_POWER; + ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2; + } + +#ifdef AH_EEPROM_DUMP + ar5416PrintPowerPerRate(ah, ratesArray); +#endif + + /* Write the OFDM power per rate set */ + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE1, + POW_SM(ratesArray[rate18mb], 24) + | POW_SM(ratesArray[rate12mb], 16) + | POW_SM(ratesArray[rate9mb], 8) + | POW_SM(ratesArray[rate6mb], 0) + ); + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE2, + POW_SM(ratesArray[rate54mb], 24) + | POW_SM(ratesArray[rate48mb], 16) + | POW_SM(ratesArray[rate36mb], 8) + | POW_SM(ratesArray[rate24mb], 0) + ); + + /* Write the CCK power per rate set */ + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE3, + POW_SM(ratesArray[rate2s], 24) + | POW_SM(ratesArray[rate2l], 16) + | POW_SM(ratesArray[rateXr], 8) /* XR target power */ + | POW_SM(ratesArray[rate1l], 0) + ); + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE4, + POW_SM(ratesArray[rate11s], 24) + | POW_SM(ratesArray[rate11l], 16) + | POW_SM(ratesArray[rate5_5s], 8) + | POW_SM(ratesArray[rate5_5l], 0) + ); + HALDEBUG(ah, HAL_DEBUG_RESET, + "%s AR_PHY_POWER_TX_RATE3=0x%x AR_PHY_POWER_TX_RATE4=0x%x\n", + __func__, OS_REG_READ(ah,AR_PHY_POWER_TX_RATE3), + OS_REG_READ(ah,AR_PHY_POWER_TX_RATE4)); + + /* Write the HT20 power per rate set */ + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE5, + POW_SM(ratesArray[rateHt20_3], 24) + | POW_SM(ratesArray[rateHt20_2], 16) + | POW_SM(ratesArray[rateHt20_1], 8) + | POW_SM(ratesArray[rateHt20_0], 0) + ); + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE6, + POW_SM(ratesArray[rateHt20_7], 24) + | POW_SM(ratesArray[rateHt20_6], 16) + | POW_SM(ratesArray[rateHt20_5], 8) + | POW_SM(ratesArray[rateHt20_4], 0) + ); + + if (IEEE80211_IS_CHAN_HT40(chan)) { + /* Write the HT40 power per rate set */ + /* Correct PAR difference between HT40 and HT20/LEGACY */ + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE7, + POW_SM(ratesArray[rateHt40_3] + ht40PowerIncForPdadc, 24) + | POW_SM(ratesArray[rateHt40_2] + ht40PowerIncForPdadc, 16) + | POW_SM(ratesArray[rateHt40_1] + ht40PowerIncForPdadc, 8) + | POW_SM(ratesArray[rateHt40_0] + ht40PowerIncForPdadc, 0) + ); + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE8, + POW_SM(ratesArray[rateHt40_7] + ht40PowerIncForPdadc, 24) + | POW_SM(ratesArray[rateHt40_6] + ht40PowerIncForPdadc, 16) + | POW_SM(ratesArray[rateHt40_5] + ht40PowerIncForPdadc, 8) + | POW_SM(ratesArray[rateHt40_4] + ht40PowerIncForPdadc, 0) + ); + /* Write the Dup/Ext 40 power per rate set */ + OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE9, + POW_SM(ratesArray[rateExtOfdm], 24) + | POW_SM(ratesArray[rateExtCck], 16) + | POW_SM(ratesArray[rateDupOfdm], 8) + | POW_SM(ratesArray[rateDupCck], 0) + ); + } + + return AH_TRUE; +#undef POW_SM +#undef N +} + +HAL_BOOL +ar9285SetBoardValues(struct ath_hal *ah, const struct ieee80211_channel *chan) +{ + const HAL_EEPROM_v4k *ee = AH_PRIVATE(ah)->ah_eeprom; + const struct ar5416eeprom_4k *eep = &ee->ee_base; + const MODAL_EEP4K_HEADER *pModal; + int i, regChainOffset; + uint8_t txRxAttenLocal; /* workaround for eeprom versions <= 14.2 */ + + HALASSERT(AH_PRIVATE(ah)->ah_eeversion >= AR_EEPROM_VER14_1); + pModal = &eep->modalHeader; + + /* NB: workaround for eeprom versions <= 14.2 */ + txRxAttenLocal = 23; + + OS_REG_WRITE(ah, AR_PHY_SWITCH_COM, pModal->antCtrlCommon); + for (i = 0; i < AR5416_4K_MAX_CHAINS; i++) { + if (AR_SREV_MERLIN(ah)) { + if (i >= 2) break; + } + if (AR_SREV_OWL_20_OR_LATER(ah) && + (AH5416(ah)->ah_rx_chainmask == 0x5 || + AH5416(ah)->ah_tx_chainmask == 0x5) && i != 0) { + /* Regs are swapped from chain 2 to 1 for 5416 2_0 with + * only chains 0 and 2 populated + */ + regChainOffset = (i == 1) ? 0x2000 : 0x1000; + } else { + regChainOffset = i * 0x1000; + } + + OS_REG_WRITE(ah, AR_PHY_SWITCH_CHAIN_0 + regChainOffset, pModal->antCtrlChain[i]); + OS_REG_WRITE(ah, AR_PHY_TIMING_CTRL4 + regChainOffset, + (OS_REG_READ(ah, AR_PHY_TIMING_CTRL4 + regChainOffset) & + ~(AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF)) | + SM(pModal->iqCalICh[i], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) | + SM(pModal->iqCalQCh[i], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF)); + + /* + * Large signal upgrade. + * XXX update + */ + + if ((i == 0) || AR_SREV_OWL_20_OR_LATER(ah)) { + OS_REG_WRITE(ah, AR_PHY_RXGAIN + regChainOffset, + (OS_REG_READ(ah, AR_PHY_RXGAIN + regChainOffset) & ~AR_PHY_RXGAIN_TXRX_ATTEN) | + SM(IS_EEP_MINOR_V3(ah) ? pModal->txRxAttenCh[i] : txRxAttenLocal, + AR_PHY_RXGAIN_TXRX_ATTEN)); + + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset, + (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) & ~AR_PHY_GAIN_2GHZ_RXTX_MARGIN) | + SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN)); + } + } + + OS_REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, pModal->switchSettling); + OS_REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_ADC, pModal->adcDesiredSize); + OS_REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_PGA, pModal->pgaDesiredSize); + OS_REG_WRITE(ah, AR_PHY_RF_CTL4, + SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAA_OFF) + | SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAB_OFF) + | SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAA_ON) + | SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAB_ON)); + + OS_REG_RMW_FIELD(ah, AR_PHY_RF_CTL3, AR_PHY_TX_END_TO_A2_RX_ON, pModal->txEndToRxOn); + + OS_REG_RMW_FIELD(ah, AR_PHY_CCA, AR9280_PHY_CCA_THRESH62, + pModal->thresh62); + OS_REG_RMW_FIELD(ah, AR_PHY_EXT_CCA0, AR_PHY_EXT_CCA0_THRESH62, + pModal->thresh62); + + /* Minor Version Specific application */ + if (IS_EEP_MINOR_V2(ah)) { + OS_REG_RMW_FIELD(ah, AR_PHY_RF_CTL2, AR_PHY_TX_FRAME_TO_DATA_START, pModal->txFrameToDataStart); + OS_REG_RMW_FIELD(ah, AR_PHY_RF_CTL2, AR_PHY_TX_FRAME_TO_PA_ON, pModal->txFrameToPaOn); + } + + if (IS_EEP_MINOR_V3(ah)) { + if (IEEE80211_IS_CHAN_HT40(chan)) { + /* Overwrite switch settling with HT40 value */ + OS_REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, pModal->swSettleHt40); + } + + if ((AR_SREV_OWL_20_OR_LATER(ah)) && + ( AH5416(ah)->ah_rx_chainmask == 0x5 || AH5416(ah)->ah_tx_chainmask == 0x5)){ + /* Reg Offsets are swapped for logical mapping */ + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x1000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x1000) & ~AR_PHY_GAIN_2GHZ_BSW_MARGIN) | + SM(pModal->bswMargin[2], AR_PHY_GAIN_2GHZ_BSW_MARGIN)); + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x1000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x1000) & ~AR_PHY_GAIN_2GHZ_BSW_ATTEN) | + SM(pModal->bswAtten[2], AR_PHY_GAIN_2GHZ_BSW_ATTEN)); + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x2000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x2000) & ~AR_PHY_GAIN_2GHZ_BSW_MARGIN) | + SM(pModal->bswMargin[1], AR_PHY_GAIN_2GHZ_BSW_MARGIN)); + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x2000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x2000) & ~AR_PHY_GAIN_2GHZ_BSW_ATTEN) | + SM(pModal->bswAtten[1], AR_PHY_GAIN_2GHZ_BSW_ATTEN)); + } else { + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x1000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x1000) & ~AR_PHY_GAIN_2GHZ_BSW_MARGIN) | + SM(pModal->bswMargin[1], AR_PHY_GAIN_2GHZ_BSW_MARGIN)); + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x1000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x1000) & ~AR_PHY_GAIN_2GHZ_BSW_ATTEN) | + SM(pModal->bswAtten[1], AR_PHY_GAIN_2GHZ_BSW_ATTEN)); + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x2000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x2000) & ~AR_PHY_GAIN_2GHZ_BSW_MARGIN) | + SM(pModal->bswMargin[2],AR_PHY_GAIN_2GHZ_BSW_MARGIN)); + OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x2000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x2000) & ~AR_PHY_GAIN_2GHZ_BSW_ATTEN) | + SM(pModal->bswAtten[2], AR_PHY_GAIN_2GHZ_BSW_ATTEN)); + } + OS_REG_RMW_FIELD(ah, AR_PHY_GAIN_2GHZ, AR_PHY_GAIN_2GHZ_BSW_MARGIN, pModal->bswMargin[0]); + OS_REG_RMW_FIELD(ah, AR_PHY_GAIN_2GHZ, AR_PHY_GAIN_2GHZ_BSW_ATTEN, pModal->bswAtten[0]); + } + return AH_TRUE; +} + +/* + * Helper functions common for AP/CB/XB + */ + +static HAL_BOOL +ar9285SetPowerPerRateTable(struct ath_hal *ah, struct ar5416eeprom_4k *pEepData, + const struct ieee80211_channel *chan, + int16_t *ratesArray, uint16_t cfgCtl, + uint16_t AntennaReduction, + uint16_t twiceMaxRegulatoryPower, + uint16_t powerLimit) +{ +#define N(a) (sizeof(a)/sizeof(a[0])) +/* Local defines to distinguish between extension and control CTL's */ +#define EXT_ADDITIVE (0x8000) +#define CTL_11G_EXT (CTL_11G | EXT_ADDITIVE) +#define CTL_11B_EXT (CTL_11B | EXT_ADDITIVE) + + uint16_t twiceMaxEdgePower = AR5416_MAX_RATE_POWER; + int i; + int16_t twiceLargestAntenna; + CAL_CTL_DATA_4K *rep; + CAL_TARGET_POWER_LEG targetPowerOfdm, targetPowerCck = {0, {0, 0, 0, 0}}; + CAL_TARGET_POWER_LEG targetPowerOfdmExt = {0, {0, 0, 0, 0}}, targetPowerCckExt = {0, {0, 0, 0, 0}}; + CAL_TARGET_POWER_HT targetPowerHt20, targetPowerHt40 = {0, {0, 0, 0, 0}}; + int16_t scaledPower, minCtlPower; + +#define SUB_NUM_CTL_MODES_AT_2G_40 3 /* excluding HT40, EXT-OFDM, EXT-CCK */ + static const uint16_t ctlModesFor11g[] = { + CTL_11B, CTL_11G, CTL_2GHT20, CTL_11B_EXT, CTL_11G_EXT, CTL_2GHT40 + }; + const uint16_t *pCtlMode; + uint16_t numCtlModes, ctlMode, freq; + CHAN_CENTERS centers; + + ar5416GetChannelCenters(ah, chan, ¢ers); + + /* Compute TxPower reduction due to Antenna Gain */ + + twiceLargestAntenna = pEepData->modalHeader.antennaGainCh[0]; + twiceLargestAntenna = (int16_t)AH_MIN((AntennaReduction) - twiceLargestAntenna, 0); + + /* XXX setup for 5212 use (really used?) */ + ath_hal_eepromSet(ah, AR_EEP_ANTGAINMAX_2, twiceLargestAntenna); + + /* + * scaledPower is the minimum of the user input power level and + * the regulatory allowed power level + */ + scaledPower = AH_MIN(powerLimit, twiceMaxRegulatoryPower + twiceLargestAntenna); + + /* Get target powers from EEPROM - our baseline for TX Power */ + /* Setup for CTL modes */ + numCtlModes = N(ctlModesFor11g) - SUB_NUM_CTL_MODES_AT_2G_40; /* CTL_11B, CTL_11G, CTL_2GHT20 */ + pCtlMode = ctlModesFor11g; + + ar5416GetTargetPowersLeg(ah, chan, pEepData->calTargetPowerCck, + AR5416_4K_NUM_2G_CCK_TARGET_POWERS, &targetPowerCck, 4, AH_FALSE); + ar5416GetTargetPowersLeg(ah, chan, pEepData->calTargetPower2G, + AR5416_4K_NUM_2G_20_TARGET_POWERS, &targetPowerOfdm, 4, AH_FALSE); + ar5416GetTargetPowers(ah, chan, pEepData->calTargetPower2GHT20, + AR5416_4K_NUM_2G_20_TARGET_POWERS, &targetPowerHt20, 8, AH_FALSE); + + if (IEEE80211_IS_CHAN_HT40(chan)) { + numCtlModes = N(ctlModesFor11g); /* All 2G CTL's */ + + ar5416GetTargetPowers(ah, chan, pEepData->calTargetPower2GHT40, + AR5416_4K_NUM_2G_40_TARGET_POWERS, &targetPowerHt40, 8, AH_TRUE); + /* Get target powers for extension channels */ + ar5416GetTargetPowersLeg(ah, chan, pEepData->calTargetPowerCck, + AR5416_4K_NUM_2G_CCK_TARGET_POWERS, &targetPowerCckExt, 4, AH_TRUE); + ar5416GetTargetPowersLeg(ah, chan, pEepData->calTargetPower2G, + AR5416_4K_NUM_2G_20_TARGET_POWERS, &targetPowerOfdmExt, 4, AH_TRUE); + } + + /* + * For MIMO, need to apply regulatory caps individually across dynamically + * running modes: CCK, OFDM, HT20, HT40 + * + * The outer loop walks through each possible applicable runtime mode. + * The inner loop walks through each ctlIndex entry in EEPROM. + * The ctl value is encoded as [7:4] == test group, [3:0] == test mode. + * + */ + for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) { + HAL_BOOL isHt40CtlMode = (pCtlMode[ctlMode] == CTL_5GHT40) || + (pCtlMode[ctlMode] == CTL_2GHT40); + if (isHt40CtlMode) { + freq = centers.ctl_center; + } else if (pCtlMode[ctlMode] & EXT_ADDITIVE) { + freq = centers.ext_center; + } else { + freq = centers.ctl_center; + } + + /* walk through each CTL index stored in EEPROM */ + for (i = 0; (i < AR5416_4K_NUM_CTLS) && pEepData->ctlIndex[i]; i++) { + uint16_t twiceMinEdgePower; + + /* compare test group from regulatory channel list with test mode from pCtlMode list */ + if ((((cfgCtl & ~CTL_MODE_M) | (pCtlMode[ctlMode] & CTL_MODE_M)) == pEepData->ctlIndex[i]) || + (((cfgCtl & ~CTL_MODE_M) | (pCtlMode[ctlMode] & CTL_MODE_M)) == + ((pEepData->ctlIndex[i] & CTL_MODE_M) | SD_NO_CTL))) { + rep = &(pEepData->ctlData[i]); + twiceMinEdgePower = ar9285GetMaxEdgePower(freq, + rep->ctlEdges[ + owl_get_ntxchains(AH5416(ah)->ah_tx_chainmask) - 1]); + if ((cfgCtl & ~CTL_MODE_M) == SD_NO_CTL) { + /* Find the minimum of all CTL edge powers that apply to this channel */ + twiceMaxEdgePower = AH_MIN(twiceMaxEdgePower, twiceMinEdgePower); + } else { + /* specific */ + twiceMaxEdgePower = twiceMinEdgePower; + break; + } + } + } + minCtlPower = (uint8_t)AH_MIN(twiceMaxEdgePower, scaledPower); + /* Apply ctl mode to correct target power set */ + switch(pCtlMode[ctlMode]) { + case CTL_11B: + for (i = 0; i < N(targetPowerCck.tPow2x); i++) { + targetPowerCck.tPow2x[i] = (uint8_t)AH_MIN(targetPowerCck.tPow2x[i], minCtlPower); + } + break; + case CTL_11A: + case CTL_11G: + for (i = 0; i < N(targetPowerOfdm.tPow2x); i++) { + targetPowerOfdm.tPow2x[i] = (uint8_t)AH_MIN(targetPowerOfdm.tPow2x[i], minCtlPower); + } + break; + case CTL_5GHT20: + case CTL_2GHT20: + for (i = 0; i < N(targetPowerHt20.tPow2x); i++) { + targetPowerHt20.tPow2x[i] = (uint8_t)AH_MIN(targetPowerHt20.tPow2x[i], minCtlPower); + } + break; + case CTL_11B_EXT: + targetPowerCckExt.tPow2x[0] = (uint8_t)AH_MIN(targetPowerCckExt.tPow2x[0], minCtlPower); + break; + case CTL_11G_EXT: + targetPowerOfdmExt.tPow2x[0] = (uint8_t)AH_MIN(targetPowerOfdmExt.tPow2x[0], minCtlPower); + break; + case CTL_5GHT40: + case CTL_2GHT40: + for (i = 0; i < N(targetPowerHt40.tPow2x); i++) { + targetPowerHt40.tPow2x[i] = (uint8_t)AH_MIN(targetPowerHt40.tPow2x[i], minCtlPower); + } + break; + default: + return AH_FALSE; + break; + } + } /* end ctl mode checking */ + + /* Set rates Array from collected data */ + ratesArray[rate6mb] = ratesArray[rate9mb] = ratesArray[rate12mb] = ratesArray[rate18mb] = ratesArray[rate24mb] = targetPowerOfdm.tPow2x[0]; + ratesArray[rate36mb] = targetPowerOfdm.tPow2x[1]; + ratesArray[rate48mb] = targetPowerOfdm.tPow2x[2]; + ratesArray[rate54mb] = targetPowerOfdm.tPow2x[3]; + ratesArray[rateXr] = targetPowerOfdm.tPow2x[0]; + + for (i = 0; i < N(targetPowerHt20.tPow2x); i++) { + ratesArray[rateHt20_0 + i] = targetPowerHt20.tPow2x[i]; + } + + ratesArray[rate1l] = targetPowerCck.tPow2x[0]; + ratesArray[rate2s] = ratesArray[rate2l] = targetPowerCck.tPow2x[1]; + ratesArray[rate5_5s] = ratesArray[rate5_5l] = targetPowerCck.tPow2x[2]; + ratesArray[rate11s] = ratesArray[rate11l] = targetPowerCck.tPow2x[3]; + if (IEEE80211_IS_CHAN_HT40(chan)) { + for (i = 0; i < N(targetPowerHt40.tPow2x); i++) { + ratesArray[rateHt40_0 + i] = targetPowerHt40.tPow2x[i]; + } + ratesArray[rateDupOfdm] = targetPowerHt40.tPow2x[0]; + ratesArray[rateDupCck] = targetPowerHt40.tPow2x[0]; + ratesArray[rateExtOfdm] = targetPowerOfdmExt.tPow2x[0]; + if (IEEE80211_IS_CHAN_2GHZ(chan)) { + ratesArray[rateExtCck] = targetPowerCckExt.tPow2x[0]; + } + } + return AH_TRUE; +#undef EXT_ADDITIVE +#undef CTL_11G_EXT +#undef CTL_11B_EXT +#undef SUB_NUM_CTL_MODES_AT_2G_40 +#undef N +} + +/************************************************************************** + * fbin2freq + * + * Get channel value from binary representation held in eeprom + * RETURNS: the frequency in MHz + */ +static uint16_t +fbin2freq(uint8_t fbin) +{ + /* + * Reserved value 0xFF provides an empty definition both as + * an fbin and as a frequency - do not convert + */ + if (fbin == AR5416_BCHAN_UNUSED) { + return fbin; + } + + return (uint16_t)(2300 + fbin); +} + +/* + * XXX almost the same as ar5416GetMaxEdgePower. + */ +static uint16_t +ar9285GetMaxEdgePower(uint16_t freq, CAL_CTL_EDGES *pRdEdgesPower) +{ + uint16_t twiceMaxEdgePower = AR5416_MAX_RATE_POWER; + int i; + + /* Get the edge power */ + for (i = 0; (i < AR5416_NUM_BAND_EDGES) && (pRdEdgesPower[i].bChannel != AR5416_BCHAN_UNUSED) ; i++) { + /* + * If there's an exact channel match or an inband flag set + * on the lower channel use the given rdEdgePower + */ + if (freq == fbin2freq(pRdEdgesPower[i].bChannel)) { + twiceMaxEdgePower = MS(pRdEdgesPower[i].tPowerFlag, CAL_CTL_EDGES_POWER); + break; + } else if ((i > 0) && (freq < fbin2freq(pRdEdgesPower[i].bChannel))) { + if (fbin2freq(pRdEdgesPower[i - 1].bChannel) < freq && (pRdEdgesPower[i - 1].tPowerFlag & CAL_CTL_EDGES_FLAG) != 0) { + twiceMaxEdgePower = MS(pRdEdgesPower[i - 1].tPowerFlag, CAL_CTL_EDGES_POWER); + } + /* Leave loop - no more affecting edges possible in this monotonic increasing list */ + break; + } + } + HALASSERT(twiceMaxEdgePower > 0); + return twiceMaxEdgePower; +} + + + +static HAL_BOOL +ar9285SetPowerCalTable(struct ath_hal *ah, struct ar5416eeprom_4k *pEepData, + const struct ieee80211_channel *chan, int16_t *pTxPowerIndexOffset) +{ + CAL_DATA_PER_FREQ_4K *pRawDataset; + uint8_t *pCalBChans = AH_NULL; + uint16_t pdGainOverlap_t2; + static uint8_t pdadcValues[AR5416_NUM_PDADC_VALUES]; + uint16_t gainBoundaries[AR5416_PD_GAINS_IN_MASK]; + uint16_t numPiers, i, j; + int16_t tMinCalPower; + uint16_t numXpdGain, xpdMask; + uint16_t xpdGainValues[AR5416_4K_NUM_PD_GAINS]; + uint32_t reg32, regOffset, regChainOffset; + + OS_MEMZERO(xpdGainValues, sizeof(xpdGainValues)); + + xpdMask = pEepData->modalHeader.xpdGain; + + if (IS_EEP_MINOR_V2(ah)) { + pdGainOverlap_t2 = pEepData->modalHeader.pdGainOverlap; + } else { + pdGainOverlap_t2 = (uint16_t)(MS(OS_REG_READ(ah, AR_PHY_TPCRG5), AR_PHY_TPCRG5_PD_GAIN_OVERLAP)); + } + + pCalBChans = pEepData->calFreqPier2G; + numPiers = AR5416_4K_NUM_2G_CAL_PIERS; + numXpdGain = 0; + /* Calculate the value of xpdgains from the xpdGain Mask */ + for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { + if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { + if (numXpdGain >= AR5416_4K_NUM_PD_GAINS) { + HALASSERT(0); + break; + } + xpdGainValues[numXpdGain] = (uint16_t)(AR5416_PD_GAINS_IN_MASK - i); + numXpdGain++; + } + } + + /* Write the detector gain biases and their number */ + OS_REG_WRITE(ah, AR_PHY_TPCRG1, (OS_REG_READ(ah, AR_PHY_TPCRG1) & + ~(AR_PHY_TPCRG1_NUM_PD_GAIN | AR_PHY_TPCRG1_PD_GAIN_1 | AR_PHY_TPCRG1_PD_GAIN_2 | AR_PHY_TPCRG1_PD_GAIN_3)) | + SM(numXpdGain - 1, AR_PHY_TPCRG1_NUM_PD_GAIN) | SM(xpdGainValues[0], AR_PHY_TPCRG1_PD_GAIN_1 ) | + SM(xpdGainValues[1], AR_PHY_TPCRG1_PD_GAIN_2) | SM(xpdGainValues[2], AR_PHY_TPCRG1_PD_GAIN_3)); + + for (i = 0; i < AR5416_MAX_CHAINS; i++) { + + if (AR_SREV_OWL_20_OR_LATER(ah) && + ( AH5416(ah)->ah_rx_chainmask == 0x5 || AH5416(ah)->ah_tx_chainmask == 0x5) && (i != 0)) { + /* Regs are swapped from chain 2 to 1 for 5416 2_0 with + * only chains 0 and 2 populated + */ + regChainOffset = (i == 1) ? 0x2000 : 0x1000; + } else { + regChainOffset = i * 0x1000; + } + + if (pEepData->baseEepHeader.txMask & (1 << i)) { + pRawDataset = pEepData->calPierData2G[i]; + + ar9285GetGainBoundariesAndPdadcs(ah, chan, pRawDataset, + pCalBChans, numPiers, + pdGainOverlap_t2, + &tMinCalPower, gainBoundaries, + pdadcValues, numXpdGain); + + if ((i == 0) || AR_SREV_OWL_20_OR_LATER(ah)) { + /* + * Note the pdadc table may not start at 0 dBm power, could be + * negative or greater than 0. Need to offset the power + * values by the amount of minPower for griffin + */ + + OS_REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset, + SM(pdGainOverlap_t2, AR_PHY_TPCRG5_PD_GAIN_OVERLAP) | + SM(gainBoundaries[0], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1) | + SM(gainBoundaries[1], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2) | + SM(gainBoundaries[2], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3) | + SM(gainBoundaries[3], AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4)); + } + + /* Write the power values into the baseband power table */ + regOffset = AR_PHY_BASE + (672 << 2) + regChainOffset; + + for (j = 0; j < 32; j++) { + reg32 = ((pdadcValues[4*j + 0] & 0xFF) << 0) | + ((pdadcValues[4*j + 1] & 0xFF) << 8) | + ((pdadcValues[4*j + 2] & 0xFF) << 16) | + ((pdadcValues[4*j + 3] & 0xFF) << 24) ; + OS_REG_WRITE(ah, regOffset, reg32); + +#ifdef PDADC_DUMP + ath_hal_printf(ah, "PDADC: Chain %d | PDADC %3d Value %3d | PDADC %3d Value %3d | PDADC %3d Value %3d | PDADC %3d Value %3d |\n", + i, + 4*j, pdadcValues[4*j], + 4*j+1, pdadcValues[4*j + 1], + 4*j+2, pdadcValues[4*j + 2], + 4*j+3, pdadcValues[4*j + 3]); +#endif + regOffset += 4; + } + } + } + *pTxPowerIndexOffset = 0; + + return AH_TRUE; +} + +static void +ar9285GetGainBoundariesAndPdadcs(struct ath_hal *ah, + const struct ieee80211_channel *chan, + CAL_DATA_PER_FREQ_4K *pRawDataSet, + uint8_t * bChans, uint16_t availPiers, + uint16_t tPdGainOverlap, int16_t *pMinCalPower, uint16_t * pPdGainBoundaries, + uint8_t * pPDADCValues, uint16_t numXpdGains) +{ + + int i, j, k; + int16_t ss; /* potentially -ve index for taking care of pdGainOverlap */ + uint16_t idxL, idxR, numPiers; /* Pier indexes */ + + /* filled out Vpd table for all pdGains (chanL) */ + static uint8_t vpdTableL[AR5416_4K_NUM_PD_GAINS][AR5416_MAX_PWR_RANGE_IN_HALF_DB]; + + /* filled out Vpd table for all pdGains (chanR) */ + static uint8_t vpdTableR[AR5416_4K_NUM_PD_GAINS][AR5416_MAX_PWR_RANGE_IN_HALF_DB]; + + /* filled out Vpd table for all pdGains (interpolated) */ + static uint8_t vpdTableI[AR5416_4K_NUM_PD_GAINS][AR5416_MAX_PWR_RANGE_IN_HALF_DB]; + + uint8_t *pVpdL, *pVpdR, *pPwrL, *pPwrR; + uint8_t minPwrT4[AR5416_4K_NUM_PD_GAINS]; + uint8_t maxPwrT4[AR5416_4K_NUM_PD_GAINS]; + int16_t vpdStep; + int16_t tmpVal; + uint16_t sizeCurrVpdTable, maxIndex, tgtIndex; + HAL_BOOL match; + int16_t minDelta = 0; + CHAN_CENTERS centers; + + ar5416GetChannelCenters(ah, chan, ¢ers); + + /* Trim numPiers for the number of populated channel Piers */ + for (numPiers = 0; numPiers < availPiers; numPiers++) { + if (bChans[numPiers] == AR5416_BCHAN_UNUSED) { + break; + } + } + + /* Find pier indexes around the current channel */ + match = getLowerUpperIndex((uint8_t)FREQ2FBIN(centers.synth_center, IEEE80211_IS_CHAN_2GHZ(chan)), + bChans, numPiers, &idxL, &idxR); + + if (match) { + /* Directly fill both vpd tables from the matching index */ + for (i = 0; i < numXpdGains; i++) { + minPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][0]; + maxPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][4]; + ar9285FillVpdTable(minPwrT4[i], maxPwrT4[i], + pRawDataSet[idxL].pwrPdg[i], + pRawDataSet[idxL].vpdPdg[i], + AR5416_PD_GAIN_ICEPTS, vpdTableI[i]); + } + } else { + for (i = 0; i < numXpdGains; i++) { + pVpdL = pRawDataSet[idxL].vpdPdg[i]; + pPwrL = pRawDataSet[idxL].pwrPdg[i]; + pVpdR = pRawDataSet[idxR].vpdPdg[i]; + pPwrR = pRawDataSet[idxR].pwrPdg[i]; + + /* Start Vpd interpolation from the max of the minimum powers */ + minPwrT4[i] = AH_MAX(pPwrL[0], pPwrR[0]); + + /* End Vpd interpolation from the min of the max powers */ + maxPwrT4[i] = AH_MIN(pPwrL[AR5416_PD_GAIN_ICEPTS - 1], pPwrR[AR5416_PD_GAIN_ICEPTS - 1]); + HALASSERT(maxPwrT4[i] > minPwrT4[i]); + + /* Fill pier Vpds */ + ar9285FillVpdTable(minPwrT4[i], maxPwrT4[i], pPwrL, pVpdL, + AR5416_PD_GAIN_ICEPTS, vpdTableL[i]); + ar9285FillVpdTable(minPwrT4[i], maxPwrT4[i], pPwrR, pVpdR, + AR5416_PD_GAIN_ICEPTS, vpdTableR[i]); + + /* Interpolate the final vpd */ + for (j = 0; j <= (maxPwrT4[i] - minPwrT4[i]) / 2; j++) { + vpdTableI[i][j] = (uint8_t)(interpolate((uint16_t)FREQ2FBIN(centers.synth_center, IEEE80211_IS_CHAN_2GHZ(chan)), + bChans[idxL], bChans[idxR], vpdTableL[i][j], vpdTableR[i][j])); + } + } + } + *pMinCalPower = (int16_t)(minPwrT4[0] / 2); + + k = 0; /* index for the final table */ + for (i = 0; i < numXpdGains; i++) { + if (i == (numXpdGains - 1)) { + pPdGainBoundaries[i] = (uint16_t)(maxPwrT4[i] / 2); + } else { + pPdGainBoundaries[i] = (uint16_t)((maxPwrT4[i] + minPwrT4[i+1]) / 4); + } + + pPdGainBoundaries[i] = (uint16_t)AH_MIN(AR5416_MAX_RATE_POWER, pPdGainBoundaries[i]); + + /* NB: only applies to owl 1.0 */ + if ((i == 0) && !AR_SREV_OWL_20_OR_LATER(ah) ) { + /* + * fix the gain delta, but get a delta that can be applied to min to + * keep the upper power values accurate, don't think max needs to + * be adjusted because should not be at that area of the table? + */ + minDelta = pPdGainBoundaries[0] - 23; + pPdGainBoundaries[0] = 23; + } + else { + minDelta = 0; + } + + /* Find starting index for this pdGain */ + if (i == 0) { + ss = 0; /* for the first pdGain, start from index 0 */ + } else { + /* need overlap entries extrapolated below. */ + ss = (int16_t)((pPdGainBoundaries[i-1] - (minPwrT4[i] / 2)) - tPdGainOverlap + 1 + minDelta); + } + vpdStep = (int16_t)(vpdTableI[i][1] - vpdTableI[i][0]); + vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); + /* + *-ve ss indicates need to extrapolate data below for this pdGain + */ + while ((ss < 0) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { + tmpVal = (int16_t)(vpdTableI[i][0] + ss * vpdStep); + pPDADCValues[k++] = (uint8_t)((tmpVal < 0) ? 0 : tmpVal); + ss++; + } + + sizeCurrVpdTable = (uint8_t)((maxPwrT4[i] - minPwrT4[i]) / 2 +1); + tgtIndex = (uint8_t)(pPdGainBoundaries[i] + tPdGainOverlap - (minPwrT4[i] / 2)); + maxIndex = (tgtIndex < sizeCurrVpdTable) ? tgtIndex : sizeCurrVpdTable; + + while ((ss < maxIndex) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { + pPDADCValues[k++] = vpdTableI[i][ss++]; + } + + vpdStep = (int16_t)(vpdTableI[i][sizeCurrVpdTable - 1] - vpdTableI[i][sizeCurrVpdTable - 2]); + vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); + /* + * for last gain, pdGainBoundary == Pmax_t2, so will + * have to extrapolate + */ + if (tgtIndex > maxIndex) { /* need to extrapolate above */ + while ((ss <= tgtIndex) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { + tmpVal = (int16_t)((vpdTableI[i][sizeCurrVpdTable - 1] + + (ss - maxIndex +1) * vpdStep)); + pPDADCValues[k++] = (uint8_t)((tmpVal > 255) ? 255 : tmpVal); + ss++; + } + } /* extrapolated above */ + } /* for all pdGainUsed */ + + /* Fill out pdGainBoundaries - only up to 2 allowed here, but hardware allows up to 4 */ + while (i < AR5416_PD_GAINS_IN_MASK) { + pPdGainBoundaries[i] = pPdGainBoundaries[i-1]; + i++; + } + + while (k < AR5416_NUM_PDADC_VALUES) { + pPDADCValues[k] = pPDADCValues[k-1]; + k++; + } + return; +} +/* + * XXX same as ar5416FillVpdTable + */ +static HAL_BOOL +ar9285FillVpdTable(uint8_t pwrMin, uint8_t pwrMax, uint8_t *pPwrList, + uint8_t *pVpdList, uint16_t numIntercepts, uint8_t *pRetVpdList) +{ + uint16_t i, k; + uint8_t currPwr = pwrMin; + uint16_t idxL, idxR; + + HALASSERT(pwrMax > pwrMin); + for (i = 0; i <= (pwrMax - pwrMin) / 2; i++) { + getLowerUpperIndex(currPwr, pPwrList, numIntercepts, + &(idxL), &(idxR)); + if (idxR < 1) + idxR = 1; /* extrapolate below */ + if (idxL == numIntercepts - 1) + idxL = (uint16_t)(numIntercepts - 2); /* extrapolate above */ + if (pPwrList[idxL] == pPwrList[idxR]) + k = pVpdList[idxL]; + else + k = (uint16_t)( ((currPwr - pPwrList[idxL]) * pVpdList[idxR] + (pPwrList[idxR] - currPwr) * pVpdList[idxL]) / + (pPwrList[idxR] - pPwrList[idxL]) ); + HALASSERT(k < 256); + pRetVpdList[i] = (uint8_t)k; + currPwr += 2; /* half dB steps */ + } + + return AH_TRUE; +} +static int16_t +interpolate(uint16_t target, uint16_t srcLeft, uint16_t srcRight, + int16_t targetLeft, int16_t targetRight) +{ + int16_t rv; + + if (srcRight == srcLeft) { + rv = targetLeft; + } else { + rv = (int16_t)( ((target - srcLeft) * targetRight + + (srcRight - target) * targetLeft) / (srcRight - srcLeft) ); + } + return rv; +} + +HAL_BOOL +getLowerUpperIndex(uint8_t target, uint8_t *pList, uint16_t listSize, + uint16_t *indexL, uint16_t *indexR) +{ + uint16_t i; + + /* + * Check first and last elements for beyond ordered array cases. + */ + if (target <= pList[0]) { + *indexL = *indexR = 0; + return AH_TRUE; + } + if (target >= pList[listSize-1]) { + *indexL = *indexR = (uint16_t)(listSize - 1); + return AH_TRUE; + } + + /* look for value being near or between 2 values in list */ + for (i = 0; i < listSize - 1; i++) { + /* + * If value is close to the current value of the list + * then target is not between values, it is one of the values + */ + if (pList[i] == target) { + *indexL = *indexR = i; + return AH_TRUE; + } + /* + * Look for value being between current value and next value + * if so return these 2 values + */ + if (target < pList[i + 1]) { + *indexL = i; + *indexR = (uint16_t)(i + 1); + return AH_FALSE; + } + } + HALASSERT(0); + *indexL = *indexR = 0; + return AH_FALSE; +} diff --git a/sys/dev/ath/ath_hal/ar5416/ar9285v2.ini b/sys/dev/ath/ath_hal/ar5416/ar9285v2.ini new file mode 100644 index 000000000000..2a9de1dba47f --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar9285v2.ini @@ -0,0 +1,746 @@ +/* + * Copyright (c) 2008-2009 Atheros Communications Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +/* AR9285 v1_2 PCI Register Writes. Created: 04/13/09 */ +static const u_int32_t ar9285Modes_v2[][6] = { + /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ + { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, + { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, + { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, + { 0x000010f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008 }, + { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, + { 0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b, 0x0988004f }, + { 0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440, 0x00006880 }, + { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, + { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, + { 0x00009824, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e }, + { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, + { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, + { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, + { 0x00009840, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e }, + { 0x00009844, 0x0372161e, 0x0372161e, 0x03721620, 0x03721620, 0x037216a0 }, + { 0x00009848, 0x00001066, 0x00001066, 0x00001053, 0x00001053, 0x00001059 }, + { 0x0000a848, 0x00001066, 0x00001066, 0x00001053, 0x00001053, 0x00001059 }, + { 0x00009850, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2 }, + { 0x00009858, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e }, + { 0x0000985c, 0x3139605e, 0x3139605e, 0x3137605e, 0x3137605e, 0x3139605e }, + { 0x00009860, 0x00058d18, 0x00058d18, 0x00058d20, 0x00058d20, 0x00058d18 }, + { 0x00009864, 0x0000fe00, 0x0000fe00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, + { 0x00009868, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0 }, + { 0x0000986c, 0x06903081, 0x06903081, 0x06903881, 0x06903881, 0x06903881 }, + { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, + { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, + { 0x00009924, 0xd00a8007, 0xd00a8007, 0xd00a800d, 0xd00a800d, 0xd00a800d }, + { 0x00009944, 0xffbc1010, 0xffbc1010, 0xffbc1020, 0xffbc1020, 0xffbc1010 }, + { 0x00009960, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00009964, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x000099b8, 0x0000421c, 0x0000421c, 0x0000421c, 0x0000421c, 0x0000421c }, + { 0x000099bc, 0x00000600, 0x00000600, 0x00000c00, 0x00000c00, 0x00000c00 }, + { 0x000099c0, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4 }, + { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, + { 0x000099c8, 0x6af6532f, 0x6af6532f, 0x6af6532f, 0x6af6532f, 0x6af6532f }, + { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, + { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, + { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00009a00, 0x00000000, 0x00000000, 0x00058084, 0x00058084, 0x00000000 }, + { 0x00009a04, 0x00000000, 0x00000000, 0x00058088, 0x00058088, 0x00000000 }, + { 0x00009a08, 0x00000000, 0x00000000, 0x0005808c, 0x0005808c, 0x00000000 }, + { 0x00009a0c, 0x00000000, 0x00000000, 0x00058100, 0x00058100, 0x00000000 }, + { 0x00009a10, 0x00000000, 0x00000000, 0x00058104, 0x00058104, 0x00000000 }, + { 0x00009a14, 0x00000000, 0x00000000, 0x00058108, 0x00058108, 0x00000000 }, + { 0x00009a18, 0x00000000, 0x00000000, 0x0005810c, 0x0005810c, 0x00000000 }, + { 0x00009a1c, 0x00000000, 0x00000000, 0x00058110, 0x00058110, 0x00000000 }, + { 0x00009a20, 0x00000000, 0x00000000, 0x00058114, 0x00058114, 0x00000000 }, + { 0x00009a24, 0x00000000, 0x00000000, 0x00058180, 0x00058180, 0x00000000 }, + { 0x00009a28, 0x00000000, 0x00000000, 0x00058184, 0x00058184, 0x00000000 }, + { 0x00009a2c, 0x00000000, 0x00000000, 0x00058188, 0x00058188, 0x00000000 }, + { 0x00009a30, 0x00000000, 0x00000000, 0x0005818c, 0x0005818c, 0x00000000 }, + { 0x00009a34, 0x00000000, 0x00000000, 0x00058190, 0x00058190, 0x00000000 }, + { 0x00009a38, 0x00000000, 0x00000000, 0x00058194, 0x00058194, 0x00000000 }, + { 0x00009a3c, 0x00000000, 0x00000000, 0x000581a0, 0x000581a0, 0x00000000 }, + { 0x00009a40, 0x00000000, 0x00000000, 0x0005820c, 0x0005820c, 0x00000000 }, + { 0x00009a44, 0x00000000, 0x00000000, 0x000581a8, 0x000581a8, 0x00000000 }, + { 0x00009a48, 0x00000000, 0x00000000, 0x00058284, 0x00058284, 0x00000000 }, + { 0x00009a4c, 0x00000000, 0x00000000, 0x00058288, 0x00058288, 0x00000000 }, + { 0x00009a50, 0x00000000, 0x00000000, 0x00058220, 0x00058220, 0x00000000 }, + { 0x00009a54, 0x00000000, 0x00000000, 0x00058290, 0x00058290, 0x00000000 }, + { 0x00009a58, 0x00000000, 0x00000000, 0x00058300, 0x00058300, 0x00000000 }, + { 0x00009a5c, 0x00000000, 0x00000000, 0x00058304, 0x00058304, 0x00000000 }, + { 0x00009a60, 0x00000000, 0x00000000, 0x00058308, 0x00058308, 0x00000000 }, + { 0x00009a64, 0x00000000, 0x00000000, 0x0005830c, 0x0005830c, 0x00000000 }, + { 0x00009a68, 0x00000000, 0x00000000, 0x00058380, 0x00058380, 0x00000000 }, + { 0x00009a6c, 0x00000000, 0x00000000, 0x00058384, 0x00058384, 0x00000000 }, + { 0x00009a70, 0x00000000, 0x00000000, 0x00068700, 0x00068700, 0x00000000 }, + { 0x00009a74, 0x00000000, 0x00000000, 0x00068704, 0x00068704, 0x00000000 }, + { 0x00009a78, 0x00000000, 0x00000000, 0x00068708, 0x00068708, 0x00000000 }, + { 0x00009a7c, 0x00000000, 0x00000000, 0x0006870c, 0x0006870c, 0x00000000 }, + { 0x00009a80, 0x00000000, 0x00000000, 0x00068780, 0x00068780, 0x00000000 }, + { 0x00009a84, 0x00000000, 0x00000000, 0x00068784, 0x00068784, 0x00000000 }, + { 0x00009a88, 0x00000000, 0x00000000, 0x00078b04, 0x00078b04, 0x00000000 }, + { 0x00009a8c, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 }, + { 0x00009a90, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 }, + { 0x00009a94, 0x00000000, 0x00000000, 0x00078b0c, 0x00078b0c, 0x00000000 }, + { 0x00009a98, 0x00000000, 0x00000000, 0x00078b80, 0x00078b80, 0x00000000 }, + { 0x00009a9c, 0x00000000, 0x00000000, 0x00078b84, 0x00078b84, 0x00000000 }, + { 0x00009aa0, 0x00000000, 0x00000000, 0x00078b88, 0x00078b88, 0x00000000 }, + { 0x00009aa4, 0x00000000, 0x00000000, 0x00078b8c, 0x00078b8c, 0x00000000 }, + { 0x00009aa8, 0x00000000, 0x00000000, 0x00078b90, 0x00078b90, 0x00000000 }, + { 0x00009aac, 0x00000000, 0x00000000, 0x000caf80, 0x000caf80, 0x00000000 }, + { 0x00009ab0, 0x00000000, 0x00000000, 0x000caf84, 0x000caf84, 0x00000000 }, + { 0x00009ab4, 0x00000000, 0x00000000, 0x000caf88, 0x000caf88, 0x00000000 }, + { 0x00009ab8, 0x00000000, 0x00000000, 0x000caf8c, 0x000caf8c, 0x00000000 }, + { 0x00009abc, 0x00000000, 0x00000000, 0x000caf90, 0x000caf90, 0x00000000 }, + { 0x00009ac0, 0x00000000, 0x00000000, 0x000db30c, 0x000db30c, 0x00000000 }, + { 0x00009ac4, 0x00000000, 0x00000000, 0x000db310, 0x000db310, 0x00000000 }, + { 0x00009ac8, 0x00000000, 0x00000000, 0x000db384, 0x000db384, 0x00000000 }, + { 0x00009acc, 0x00000000, 0x00000000, 0x000db388, 0x000db388, 0x00000000 }, + { 0x00009ad0, 0x00000000, 0x00000000, 0x000db324, 0x000db324, 0x00000000 }, + { 0x00009ad4, 0x00000000, 0x00000000, 0x000eb704, 0x000eb704, 0x00000000 }, + { 0x00009ad8, 0x00000000, 0x00000000, 0x000eb6a4, 0x000eb6a4, 0x00000000 }, + { 0x00009adc, 0x00000000, 0x00000000, 0x000eb6a8, 0x000eb6a8, 0x00000000 }, + { 0x00009ae0, 0x00000000, 0x00000000, 0x000eb710, 0x000eb710, 0x00000000 }, + { 0x00009ae4, 0x00000000, 0x00000000, 0x000eb714, 0x000eb714, 0x00000000 }, + { 0x00009ae8, 0x00000000, 0x00000000, 0x000eb720, 0x000eb720, 0x00000000 }, + { 0x00009aec, 0x00000000, 0x00000000, 0x000eb724, 0x000eb724, 0x00000000 }, + { 0x00009af0, 0x00000000, 0x00000000, 0x000eb728, 0x000eb728, 0x00000000 }, + { 0x00009af4, 0x00000000, 0x00000000, 0x000eb72c, 0x000eb72c, 0x00000000 }, + { 0x00009af8, 0x00000000, 0x00000000, 0x000eb7a0, 0x000eb7a0, 0x00000000 }, + { 0x00009afc, 0x00000000, 0x00000000, 0x000eb7a4, 0x000eb7a4, 0x00000000 }, + { 0x00009b00, 0x00000000, 0x00000000, 0x000eb7a8, 0x000eb7a8, 0x00000000 }, + { 0x00009b04, 0x00000000, 0x00000000, 0x000eb7b0, 0x000eb7b0, 0x00000000 }, + { 0x00009b08, 0x00000000, 0x00000000, 0x000eb7b4, 0x000eb7b4, 0x00000000 }, + { 0x00009b0c, 0x00000000, 0x00000000, 0x000eb7b8, 0x000eb7b8, 0x00000000 }, + { 0x00009b10, 0x00000000, 0x00000000, 0x000eb7a5, 0x000eb7a5, 0x00000000 }, + { 0x00009b14, 0x00000000, 0x00000000, 0x000eb7a9, 0x000eb7a9, 0x00000000 }, + { 0x00009b18, 0x00000000, 0x00000000, 0x000eb7ad, 0x000eb7ad, 0x00000000 }, + { 0x00009b1c, 0x00000000, 0x00000000, 0x000eb7b1, 0x000eb7b1, 0x00000000 }, + { 0x00009b20, 0x00000000, 0x00000000, 0x000eb7b5, 0x000eb7b5, 0x00000000 }, + { 0x00009b24, 0x00000000, 0x00000000, 0x000eb7b9, 0x000eb7b9, 0x00000000 }, + { 0x00009b28, 0x00000000, 0x00000000, 0x000eb7c5, 0x000eb7c5, 0x00000000 }, + { 0x00009b2c, 0x00000000, 0x00000000, 0x000eb7c9, 0x000eb7c9, 0x00000000 }, + { 0x00009b30, 0x00000000, 0x00000000, 0x000eb7d1, 0x000eb7d1, 0x00000000 }, + { 0x00009b34, 0x00000000, 0x00000000, 0x000eb7d5, 0x000eb7d5, 0x00000000 }, + { 0x00009b38, 0x00000000, 0x00000000, 0x000eb7d9, 0x000eb7d9, 0x00000000 }, + { 0x00009b3c, 0x00000000, 0x00000000, 0x000eb7c6, 0x000eb7c6, 0x00000000 }, + { 0x00009b40, 0x00000000, 0x00000000, 0x000eb7ca, 0x000eb7ca, 0x00000000 }, + { 0x00009b44, 0x00000000, 0x00000000, 0x000eb7ce, 0x000eb7ce, 0x00000000 }, + { 0x00009b48, 0x00000000, 0x00000000, 0x000eb7d2, 0x000eb7d2, 0x00000000 }, + { 0x00009b4c, 0x00000000, 0x00000000, 0x000eb7d6, 0x000eb7d6, 0x00000000 }, + { 0x00009b50, 0x00000000, 0x00000000, 0x000eb7c3, 0x000eb7c3, 0x00000000 }, + { 0x00009b54, 0x00000000, 0x00000000, 0x000eb7c7, 0x000eb7c7, 0x00000000 }, + { 0x00009b58, 0x00000000, 0x00000000, 0x000eb7cb, 0x000eb7cb, 0x00000000 }, + { 0x00009b5c, 0x00000000, 0x00000000, 0x000eb7cf, 0x000eb7cf, 0x00000000 }, + { 0x00009b60, 0x00000000, 0x00000000, 0x000eb7d7, 0x000eb7d7, 0x00000000 }, + { 0x00009b64, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b68, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b6c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b70, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b74, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b78, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b7c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b80, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b84, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b88, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b8c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b90, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b94, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b98, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009b9c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009ba0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009ba4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009ba8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bac, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bb0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bb4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bb8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bbc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bc0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bc4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bc8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bcc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bd0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bd4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bd8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bdc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009be0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009be4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009be8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bec, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bf0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bf4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bf8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x00009bfc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000aa00, 0x00000000, 0x00000000, 0x00058084, 0x00058084, 0x00000000 }, + { 0x0000aa04, 0x00000000, 0x00000000, 0x00058088, 0x00058088, 0x00000000 }, + { 0x0000aa08, 0x00000000, 0x00000000, 0x0005808c, 0x0005808c, 0x00000000 }, + { 0x0000aa0c, 0x00000000, 0x00000000, 0x00058100, 0x00058100, 0x00000000 }, + { 0x0000aa10, 0x00000000, 0x00000000, 0x00058104, 0x00058104, 0x00000000 }, + { 0x0000aa14, 0x00000000, 0x00000000, 0x00058108, 0x00058108, 0x00000000 }, + { 0x0000aa18, 0x00000000, 0x00000000, 0x0005810c, 0x0005810c, 0x00000000 }, + { 0x0000aa1c, 0x00000000, 0x00000000, 0x00058110, 0x00058110, 0x00000000 }, + { 0x0000aa20, 0x00000000, 0x00000000, 0x00058114, 0x00058114, 0x00000000 }, + { 0x0000aa24, 0x00000000, 0x00000000, 0x00058180, 0x00058180, 0x00000000 }, + { 0x0000aa28, 0x00000000, 0x00000000, 0x00058184, 0x00058184, 0x00000000 }, + { 0x0000aa2c, 0x00000000, 0x00000000, 0x00058188, 0x00058188, 0x00000000 }, + { 0x0000aa30, 0x00000000, 0x00000000, 0x0005818c, 0x0005818c, 0x00000000 }, + { 0x0000aa34, 0x00000000, 0x00000000, 0x00058190, 0x00058190, 0x00000000 }, + { 0x0000aa38, 0x00000000, 0x00000000, 0x00058194, 0x00058194, 0x00000000 }, + { 0x0000aa3c, 0x00000000, 0x00000000, 0x000581a0, 0x000581a0, 0x00000000 }, + { 0x0000aa40, 0x00000000, 0x00000000, 0x0005820c, 0x0005820c, 0x00000000 }, + { 0x0000aa44, 0x00000000, 0x00000000, 0x000581a8, 0x000581a8, 0x00000000 }, + { 0x0000aa48, 0x00000000, 0x00000000, 0x00058284, 0x00058284, 0x00000000 }, + { 0x0000aa4c, 0x00000000, 0x00000000, 0x00058288, 0x00058288, 0x00000000 }, + { 0x0000aa50, 0x00000000, 0x00000000, 0x00058220, 0x00058220, 0x00000000 }, + { 0x0000aa54, 0x00000000, 0x00000000, 0x00058290, 0x00058290, 0x00000000 }, + { 0x0000aa58, 0x00000000, 0x00000000, 0x00058300, 0x00058300, 0x00000000 }, + { 0x0000aa5c, 0x00000000, 0x00000000, 0x00058304, 0x00058304, 0x00000000 }, + { 0x0000aa60, 0x00000000, 0x00000000, 0x00058308, 0x00058308, 0x00000000 }, + { 0x0000aa64, 0x00000000, 0x00000000, 0x0005830c, 0x0005830c, 0x00000000 }, + { 0x0000aa68, 0x00000000, 0x00000000, 0x00058380, 0x00058380, 0x00000000 }, + { 0x0000aa6c, 0x00000000, 0x00000000, 0x00058384, 0x00058384, 0x00000000 }, + { 0x0000aa70, 0x00000000, 0x00000000, 0x00068700, 0x00068700, 0x00000000 }, + { 0x0000aa74, 0x00000000, 0x00000000, 0x00068704, 0x00068704, 0x00000000 }, + { 0x0000aa78, 0x00000000, 0x00000000, 0x00068708, 0x00068708, 0x00000000 }, + { 0x0000aa7c, 0x00000000, 0x00000000, 0x0006870c, 0x0006870c, 0x00000000 }, + { 0x0000aa80, 0x00000000, 0x00000000, 0x00068780, 0x00068780, 0x00000000 }, + { 0x0000aa84, 0x00000000, 0x00000000, 0x00068784, 0x00068784, 0x00000000 }, + { 0x0000aa88, 0x00000000, 0x00000000, 0x00078b04, 0x00078b04, 0x00000000 }, + { 0x0000aa8c, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 }, + { 0x0000aa90, 0x00000000, 0x00000000, 0x00078b08, 0x00078b08, 0x00000000 }, + { 0x0000aa94, 0x00000000, 0x00000000, 0x00078b0c, 0x00078b0c, 0x00000000 }, + { 0x0000aa98, 0x00000000, 0x00000000, 0x00078b80, 0x00078b80, 0x00000000 }, + { 0x0000aa9c, 0x00000000, 0x00000000, 0x00078b84, 0x00078b84, 0x00000000 }, + { 0x0000aaa0, 0x00000000, 0x00000000, 0x00078b88, 0x00078b88, 0x00000000 }, + { 0x0000aaa4, 0x00000000, 0x00000000, 0x00078b8c, 0x00078b8c, 0x00000000 }, + { 0x0000aaa8, 0x00000000, 0x00000000, 0x00078b90, 0x00078b90, 0x00000000 }, + { 0x0000aaac, 0x00000000, 0x00000000, 0x000caf80, 0x000caf80, 0x00000000 }, + { 0x0000aab0, 0x00000000, 0x00000000, 0x000caf84, 0x000caf84, 0x00000000 }, + { 0x0000aab4, 0x00000000, 0x00000000, 0x000caf88, 0x000caf88, 0x00000000 }, + { 0x0000aab8, 0x00000000, 0x00000000, 0x000caf8c, 0x000caf8c, 0x00000000 }, + { 0x0000aabc, 0x00000000, 0x00000000, 0x000caf90, 0x000caf90, 0x00000000 }, + { 0x0000aac0, 0x00000000, 0x00000000, 0x000db30c, 0x000db30c, 0x00000000 }, + { 0x0000aac4, 0x00000000, 0x00000000, 0x000db310, 0x000db310, 0x00000000 }, + { 0x0000aac8, 0x00000000, 0x00000000, 0x000db384, 0x000db384, 0x00000000 }, + { 0x0000aacc, 0x00000000, 0x00000000, 0x000db388, 0x000db388, 0x00000000 }, + { 0x0000aad0, 0x00000000, 0x00000000, 0x000db324, 0x000db324, 0x00000000 }, + { 0x0000aad4, 0x00000000, 0x00000000, 0x000eb704, 0x000eb704, 0x00000000 }, + { 0x0000aad8, 0x00000000, 0x00000000, 0x000eb6a4, 0x000eb6a4, 0x00000000 }, + { 0x0000aadc, 0x00000000, 0x00000000, 0x000eb6a8, 0x000eb6a8, 0x00000000 }, + { 0x0000aae0, 0x00000000, 0x00000000, 0x000eb710, 0x000eb710, 0x00000000 }, + { 0x0000aae4, 0x00000000, 0x00000000, 0x000eb714, 0x000eb714, 0x00000000 }, + { 0x0000aae8, 0x00000000, 0x00000000, 0x000eb720, 0x000eb720, 0x00000000 }, + { 0x0000aaec, 0x00000000, 0x00000000, 0x000eb724, 0x000eb724, 0x00000000 }, + { 0x0000aaf0, 0x00000000, 0x00000000, 0x000eb728, 0x000eb728, 0x00000000 }, + { 0x0000aaf4, 0x00000000, 0x00000000, 0x000eb72c, 0x000eb72c, 0x00000000 }, + { 0x0000aaf8, 0x00000000, 0x00000000, 0x000eb7a0, 0x000eb7a0, 0x00000000 }, + { 0x0000aafc, 0x00000000, 0x00000000, 0x000eb7a4, 0x000eb7a4, 0x00000000 }, + { 0x0000ab00, 0x00000000, 0x00000000, 0x000eb7a8, 0x000eb7a8, 0x00000000 }, + { 0x0000ab04, 0x00000000, 0x00000000, 0x000eb7b0, 0x000eb7b0, 0x00000000 }, + { 0x0000ab08, 0x00000000, 0x00000000, 0x000eb7b4, 0x000eb7b4, 0x00000000 }, + { 0x0000ab0c, 0x00000000, 0x00000000, 0x000eb7b8, 0x000eb7b8, 0x00000000 }, + { 0x0000ab10, 0x00000000, 0x00000000, 0x000eb7a5, 0x000eb7a5, 0x00000000 }, + { 0x0000ab14, 0x00000000, 0x00000000, 0x000eb7a9, 0x000eb7a9, 0x00000000 }, + { 0x0000ab18, 0x00000000, 0x00000000, 0x000eb7ad, 0x000eb7ad, 0x00000000 }, + { 0x0000ab1c, 0x00000000, 0x00000000, 0x000eb7b1, 0x000eb7b1, 0x00000000 }, + { 0x0000ab20, 0x00000000, 0x00000000, 0x000eb7b5, 0x000eb7b5, 0x00000000 }, + { 0x0000ab24, 0x00000000, 0x00000000, 0x000eb7b9, 0x000eb7b9, 0x00000000 }, + { 0x0000ab28, 0x00000000, 0x00000000, 0x000eb7c5, 0x000eb7c5, 0x00000000 }, + { 0x0000ab2c, 0x00000000, 0x00000000, 0x000eb7c9, 0x000eb7c9, 0x00000000 }, + { 0x0000ab30, 0x00000000, 0x00000000, 0x000eb7d1, 0x000eb7d1, 0x00000000 }, + { 0x0000ab34, 0x00000000, 0x00000000, 0x000eb7d5, 0x000eb7d5, 0x00000000 }, + { 0x0000ab38, 0x00000000, 0x00000000, 0x000eb7d9, 0x000eb7d9, 0x00000000 }, + { 0x0000ab3c, 0x00000000, 0x00000000, 0x000eb7c6, 0x000eb7c6, 0x00000000 }, + { 0x0000ab40, 0x00000000, 0x00000000, 0x000eb7ca, 0x000eb7ca, 0x00000000 }, + { 0x0000ab44, 0x00000000, 0x00000000, 0x000eb7ce, 0x000eb7ce, 0x00000000 }, + { 0x0000ab48, 0x00000000, 0x00000000, 0x000eb7d2, 0x000eb7d2, 0x00000000 }, + { 0x0000ab4c, 0x00000000, 0x00000000, 0x000eb7d6, 0x000eb7d6, 0x00000000 }, + { 0x0000ab50, 0x00000000, 0x00000000, 0x000eb7c3, 0x000eb7c3, 0x00000000 }, + { 0x0000ab54, 0x00000000, 0x00000000, 0x000eb7c7, 0x000eb7c7, 0x00000000 }, + { 0x0000ab58, 0x00000000, 0x00000000, 0x000eb7cb, 0x000eb7cb, 0x00000000 }, + { 0x0000ab5c, 0x00000000, 0x00000000, 0x000eb7cf, 0x000eb7cf, 0x00000000 }, + { 0x0000ab60, 0x00000000, 0x00000000, 0x000eb7d7, 0x000eb7d7, 0x00000000 }, + { 0x0000ab64, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab68, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab6c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab70, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab74, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab78, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab7c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab80, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab84, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab88, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab8c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab90, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab94, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab98, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000ab9c, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000aba0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000aba4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000aba8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abac, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abb0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abb4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abb8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abbc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abc0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abc4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abc8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abcc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abd0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abd4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abd8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abdc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abe0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abe4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abe8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abec, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abf0, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abf4, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abf8, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000abfc, 0x00000000, 0x00000000, 0x000eb7db, 0x000eb7db, 0x00000000 }, + { 0x0000a204, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 }, + { 0x0000a20c, 0x00000014, 0x00000014, 0x0001f000, 0x0001f000, 0x0001f000 }, + { 0x0000b20c, 0x00000014, 0x00000014, 0x0001f000, 0x0001f000, 0x0001f000 }, + { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, + { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, + { 0x0000a250, 0x0004f000, 0x0004f000, 0x0004a000, 0x0004a000, 0x0004a000 }, + { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, +}; + +static const u_int32_t ar9285Common_v2[][2] = { + { 0x0000000c, 0x00000000 }, + { 0x00000030, 0x00020045 }, + { 0x00000034, 0x00000005 }, + { 0x00000040, 0x00000000 }, + { 0x00000044, 0x00000008 }, + { 0x00000048, 0x00000008 }, + { 0x0000004c, 0x00000010 }, + { 0x00000050, 0x00000000 }, + { 0x00000054, 0x0000001f }, + { 0x00000800, 0x00000000 }, + { 0x00000804, 0x00000000 }, + { 0x00000808, 0x00000000 }, + { 0x0000080c, 0x00000000 }, + { 0x00000810, 0x00000000 }, + { 0x00000814, 0x00000000 }, + { 0x00000818, 0x00000000 }, + { 0x0000081c, 0x00000000 }, + { 0x00000820, 0x00000000 }, + { 0x00000824, 0x00000000 }, + { 0x00001040, 0x002ffc0f }, + { 0x00001044, 0x002ffc0f }, + { 0x00001048, 0x002ffc0f }, + { 0x0000104c, 0x002ffc0f }, + { 0x00001050, 0x002ffc0f }, + { 0x00001054, 0x002ffc0f }, + { 0x00001058, 0x002ffc0f }, + { 0x0000105c, 0x002ffc0f }, + { 0x00001060, 0x002ffc0f }, + { 0x00001064, 0x002ffc0f }, + { 0x00001230, 0x00000000 }, + { 0x00001270, 0x00000000 }, + { 0x00001038, 0x00000000 }, + { 0x00001078, 0x00000000 }, + { 0x000010b8, 0x00000000 }, + { 0x000010f8, 0x00000000 }, + { 0x00001138, 0x00000000 }, + { 0x00001178, 0x00000000 }, + { 0x000011b8, 0x00000000 }, + { 0x000011f8, 0x00000000 }, + { 0x00001238, 0x00000000 }, + { 0x00001278, 0x00000000 }, + { 0x000012b8, 0x00000000 }, + { 0x000012f8, 0x00000000 }, + { 0x00001338, 0x00000000 }, + { 0x00001378, 0x00000000 }, + { 0x000013b8, 0x00000000 }, + { 0x000013f8, 0x00000000 }, + { 0x00001438, 0x00000000 }, + { 0x00001478, 0x00000000 }, + { 0x000014b8, 0x00000000 }, + { 0x000014f8, 0x00000000 }, + { 0x00001538, 0x00000000 }, + { 0x00001578, 0x00000000 }, + { 0x000015b8, 0x00000000 }, + { 0x000015f8, 0x00000000 }, + { 0x00001638, 0x00000000 }, + { 0x00001678, 0x00000000 }, + { 0x000016b8, 0x00000000 }, + { 0x000016f8, 0x00000000 }, + { 0x00001738, 0x00000000 }, + { 0x00001778, 0x00000000 }, + { 0x000017b8, 0x00000000 }, + { 0x000017f8, 0x00000000 }, + { 0x0000103c, 0x00000000 }, + { 0x0000107c, 0x00000000 }, + { 0x000010bc, 0x00000000 }, + { 0x000010fc, 0x00000000 }, + { 0x0000113c, 0x00000000 }, + { 0x0000117c, 0x00000000 }, + { 0x000011bc, 0x00000000 }, + { 0x000011fc, 0x00000000 }, + { 0x0000123c, 0x00000000 }, + { 0x0000127c, 0x00000000 }, + { 0x000012bc, 0x00000000 }, + { 0x000012fc, 0x00000000 }, + { 0x0000133c, 0x00000000 }, + { 0x0000137c, 0x00000000 }, + { 0x000013bc, 0x00000000 }, + { 0x000013fc, 0x00000000 }, + { 0x0000143c, 0x00000000 }, + { 0x0000147c, 0x00000000 }, + { 0x00004030, 0x00000002 }, + { 0x0000403c, 0x00000002 }, + { 0x00004024, 0x0000001f }, + { 0x00004060, 0x00000000 }, + { 0x00004064, 0x00000000 }, + { 0x00007010, 0x00000031 }, + { 0x00007034, 0x00000002 }, + { 0x00007038, 0x000004c2 }, + { 0x00008004, 0x00000000 }, + { 0x00008008, 0x00000000 }, + { 0x0000800c, 0x00000000 }, + { 0x00008018, 0x00000700 }, + { 0x00008020, 0x00000000 }, + { 0x00008038, 0x00000000 }, + { 0x0000803c, 0x00000000 }, + { 0x00008048, 0x00000000 }, + { 0x00008054, 0x00000000 }, + { 0x00008058, 0x00000000 }, + { 0x0000805c, 0x000fc78f }, + { 0x00008060, 0x0000000f }, + { 0x00008064, 0x00000000 }, + { 0x00008070, 0x00000000 }, + { 0x000080c0, 0x2a80001a }, + { 0x000080c4, 0x05dc01e0 }, + { 0x000080c8, 0x1f402710 }, + { 0x000080cc, 0x01f40000 }, + { 0x000080d0, 0x00001e00 }, + { 0x000080d4, 0x00000000 }, + { 0x000080d8, 0x00400000 }, + { 0x000080e0, 0xffffffff }, + { 0x000080e4, 0x0000ffff }, + { 0x000080e8, 0x003f3f3f }, + { 0x000080ec, 0x00000000 }, + { 0x000080f0, 0x00000000 }, + { 0x000080f4, 0x00000000 }, + { 0x000080f8, 0x00000000 }, + { 0x000080fc, 0x00020000 }, + { 0x00008100, 0x00020000 }, + { 0x00008104, 0x00000001 }, + { 0x00008108, 0x00000052 }, + { 0x0000810c, 0x00000000 }, + { 0x00008110, 0x00000168 }, + { 0x00008118, 0x000100aa }, + { 0x0000811c, 0x00003210 }, + { 0x00008120, 0x08f04810 }, + { 0x00008124, 0x00000000 }, + { 0x00008128, 0x00000000 }, + { 0x0000812c, 0x00000000 }, + { 0x00008130, 0x00000000 }, + { 0x00008134, 0x00000000 }, + { 0x00008138, 0x00000000 }, + { 0x0000813c, 0x00000000 }, + { 0x00008144, 0xffffffff }, + { 0x00008168, 0x00000000 }, + { 0x0000816c, 0x00000000 }, + { 0x00008170, 0x32143320 }, + { 0x00008174, 0xfaa4fa50 }, + { 0x00008178, 0x00000100 }, + { 0x0000817c, 0x00000000 }, + { 0x000081c0, 0x00000000 }, + { 0x000081d0, 0x0000320a }, + { 0x000081ec, 0x00000000 }, + { 0x000081f0, 0x00000000 }, + { 0x000081f4, 0x00000000 }, + { 0x000081f8, 0x00000000 }, + { 0x000081fc, 0x00000000 }, + { 0x00008200, 0x00000000 }, + { 0x00008204, 0x00000000 }, + { 0x00008208, 0x00000000 }, + { 0x0000820c, 0x00000000 }, + { 0x00008210, 0x00000000 }, + { 0x00008214, 0x00000000 }, + { 0x00008218, 0x00000000 }, + { 0x0000821c, 0x00000000 }, + { 0x00008220, 0x00000000 }, + { 0x00008224, 0x00000000 }, + { 0x00008228, 0x00000000 }, + { 0x0000822c, 0x00000000 }, + { 0x00008230, 0x00000000 }, + { 0x00008234, 0x00000000 }, + { 0x00008238, 0x00000000 }, + { 0x0000823c, 0x00000000 }, + { 0x00008240, 0x00100000 }, + { 0x00008244, 0x0010f400 }, + { 0x00008248, 0x00000100 }, + { 0x0000824c, 0x0001e800 }, + { 0x00008250, 0x00000000 }, + { 0x00008254, 0x00000000 }, + { 0x00008258, 0x00000000 }, + { 0x0000825c, 0x400000ff }, + { 0x00008260, 0x00080922 }, + { 0x00008264, 0x88a00010 }, + { 0x00008270, 0x00000000 }, + { 0x00008274, 0x40000000 }, + { 0x00008278, 0x003e4180 }, + { 0x0000827c, 0x00000000 }, + { 0x00008284, 0x0000002c }, + { 0x00008288, 0x0000002c }, + { 0x0000828c, 0x00000000 }, + { 0x00008294, 0x00000000 }, + { 0x00008298, 0x00000000 }, + { 0x0000829c, 0x00000000 }, + { 0x00008300, 0x00000040 }, + { 0x00008314, 0x00000000 }, + { 0x00008328, 0x00000000 }, + { 0x0000832c, 0x00000001 }, + { 0x00008330, 0x00000302 }, + { 0x00008334, 0x00000e00 }, + { 0x00008338, 0x00ff0000 }, + { 0x0000833c, 0x00000000 }, + { 0x00008340, 0x00010380 }, + { 0x00008344, 0x00481043 }, + { 0x00009808, 0x00000000 }, + { 0x0000980c, 0xafe68e30 }, + { 0x00009810, 0xfd14e000 }, + { 0x00009814, 0x9c0a9f6b }, + { 0x0000981c, 0x00000000 }, + { 0x0000982c, 0x0000a000 }, + { 0x00009830, 0x00000000 }, + { 0x0000983c, 0x00200400 }, + { 0x0000984c, 0x0040233c }, + { 0x00009854, 0x00000044 }, + { 0x00009900, 0x00000000 }, + { 0x00009904, 0x00000000 }, + { 0x00009908, 0x00000000 }, + { 0x0000990c, 0x00000000 }, + { 0x00009910, 0x01002310 }, + { 0x0000991c, 0x10000fff }, + { 0x00009920, 0x04900000 }, + { 0x00009928, 0x00000001 }, + { 0x0000992c, 0x00000004 }, + { 0x00009934, 0x1e1f2022 }, + { 0x00009938, 0x0a0b0c0d }, + { 0x0000993c, 0x00000000 }, + { 0x00009940, 0x14750604 }, + { 0x00009948, 0x9280c00a }, + { 0x0000994c, 0x00020028 }, + { 0x00009954, 0x5f3ca3de }, + { 0x00009958, 0x2108ecff }, + { 0x00009968, 0x000003ce }, + { 0x00009970, 0x192bb514 }, + { 0x00009974, 0x00000000 }, + { 0x00009978, 0x00000001 }, + { 0x0000997c, 0x00000000 }, + { 0x00009980, 0x00000000 }, + { 0x00009984, 0x00000000 }, + { 0x00009988, 0x00000000 }, + { 0x0000998c, 0x00000000 }, + { 0x00009990, 0x00000000 }, + { 0x00009994, 0x00000000 }, + { 0x00009998, 0x00000000 }, + { 0x0000999c, 0x00000000 }, + { 0x000099a0, 0x00000000 }, + { 0x000099a4, 0x00000001 }, + { 0x000099a8, 0x201fff00 }, + { 0x000099ac, 0x2def0400 }, + { 0x000099b0, 0x03051000 }, + { 0x000099b4, 0x00000820 }, + { 0x000099dc, 0x00000000 }, + { 0x000099e0, 0x00000000 }, + { 0x000099e4, 0xaaaaaaaa }, + { 0x000099e8, 0x3c466478 }, + { 0x000099ec, 0x0cc80caa }, + { 0x000099f0, 0x00000000 }, + { 0x0000a208, 0x803e68c8 }, + { 0x0000a210, 0x4080a333 }, + { 0x0000a214, 0x00206c10 }, + { 0x0000a218, 0x009c4060 }, + { 0x0000a220, 0x01834061 }, + { 0x0000a224, 0x00000400 }, + { 0x0000a228, 0x000003b5 }, + { 0x0000a22c, 0x00000000 }, + { 0x0000a234, 0x20202020 }, + { 0x0000a238, 0x20202020 }, + { 0x0000a244, 0x00000000 }, + { 0x0000a248, 0xfffffffc }, + { 0x0000a24c, 0x00000000 }, + { 0x0000a254, 0x00000000 }, + { 0x0000a258, 0x0ccb5380 }, + { 0x0000a25c, 0x15151501 }, + { 0x0000a260, 0xdfa90f01 }, + { 0x0000a268, 0x00000000 }, + { 0x0000a26c, 0x0ebae9e6 }, + { 0x0000d270, 0x0d820820 }, + { 0x0000d35c, 0x07ffffef }, + { 0x0000d360, 0x0fffffe7 }, + { 0x0000d364, 0x17ffffe5 }, + { 0x0000d368, 0x1fffffe4 }, + { 0x0000d36c, 0x37ffffe3 }, + { 0x0000d370, 0x3fffffe3 }, + { 0x0000d374, 0x57ffffe3 }, + { 0x0000d378, 0x5fffffe2 }, + { 0x0000d37c, 0x7fffffe2 }, + { 0x0000d380, 0x7f3c7bba }, + { 0x0000d384, 0xf3307ff0 }, + { 0x0000a388, 0x0c000000 }, + { 0x0000a38c, 0x20202020 }, + { 0x0000a390, 0x20202020 }, + { 0x0000a39c, 0x00000001 }, + { 0x0000a3a0, 0x00000000 }, + { 0x0000a3a4, 0x00000000 }, + { 0x0000a3a8, 0x00000000 }, + { 0x0000a3ac, 0x00000000 }, + { 0x0000a3b0, 0x00000000 }, + { 0x0000a3b4, 0x00000000 }, + { 0x0000a3b8, 0x00000000 }, + { 0x0000a3bc, 0x00000000 }, + { 0x0000a3c0, 0x00000000 }, + { 0x0000a3c4, 0x00000000 }, + { 0x0000a3cc, 0x20202020 }, + { 0x0000a3d0, 0x20202020 }, + { 0x0000a3d4, 0x20202020 }, + { 0x0000a3e4, 0x00000000 }, + { 0x0000a3e8, 0x18c43433 }, + { 0x0000a3ec, 0x00f70081 }, + { 0x00007800, 0x00140000 }, + { 0x00007804, 0x0e4548d8 }, + { 0x00007808, 0x54214514 }, + { 0x0000780c, 0x02025830 }, + { 0x00007810, 0x71c0d388 }, + { 0x00007814, 0x924934a8 }, + { 0x0000781c, 0x00000000 }, + { 0x00007824, 0x00d86fff }, + { 0x00007828, 0x26d2491b }, + { 0x0000782c, 0x6e36d97b }, + { 0x00007830, 0xedb6d96e }, + { 0x00007834, 0x71400087 }, + { 0x0000783c, 0x0001fffe }, + { 0x00007840, 0xffeb1a20 }, + { 0x00007844, 0x000c0db6 }, + { 0x00007848, 0x6db61b6f }, + { 0x0000784c, 0x6d9b66db }, + { 0x00007850, 0x6d8c6dba }, + { 0x00007854, 0x00040000 }, + { 0x00007858, 0xdb003012 }, + { 0x0000785c, 0x04924914 }, + { 0x00007860, 0x21084210 }, + { 0x00007864, 0xf7d7ffde }, + { 0x00007868, 0xc2034080 }, + { 0x00007870, 0x10142c00 }, +}; + +static const u_int32_t ar9285Modes_high_power_tx_gain_v2[][6] = { + /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ + { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000a304, 0x00000000, 0x00000000, 0x00006200, 0x00006200, 0x00000000 }, + { 0x0000a308, 0x00000000, 0x00000000, 0x00008201, 0x00008201, 0x00000000 }, + { 0x0000a30c, 0x00000000, 0x00000000, 0x0000b240, 0x0000b240, 0x00000000 }, + { 0x0000a310, 0x00000000, 0x00000000, 0x0000d241, 0x0000d241, 0x00000000 }, + { 0x0000a314, 0x00000000, 0x00000000, 0x0000f600, 0x0000f600, 0x00000000 }, + { 0x0000a318, 0x00000000, 0x00000000, 0x00012800, 0x00012800, 0x00000000 }, + { 0x0000a31c, 0x00000000, 0x00000000, 0x00016802, 0x00016802, 0x00000000 }, + { 0x0000a320, 0x00000000, 0x00000000, 0x0001b805, 0x0001b805, 0x00000000 }, + { 0x0000a324, 0x00000000, 0x00000000, 0x00021a80, 0x00021a80, 0x00000000 }, + { 0x0000a328, 0x00000000, 0x00000000, 0x00028b00, 0x00028b00, 0x00000000 }, + { 0x0000a32c, 0x00000000, 0x00000000, 0x0002ab40, 0x0002ab40, 0x00000000 }, + { 0x0000a330, 0x00000000, 0x00000000, 0x0002cd80, 0x0002cd80, 0x00000000 }, + { 0x0000a334, 0x00000000, 0x00000000, 0x00033d82, 0x00033d82, 0x00000000 }, + { 0x0000a338, 0x0003891e, 0x0003891e, 0x0003891e, 0x0003891e, 0x00000000 }, + { 0x0000a33c, 0x0003a95e, 0x0003a95e, 0x0003a95e, 0x0003a95e, 0x00000000 }, + { 0x0000a340, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a344, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a348, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a34c, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a350, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a354, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x00007838, 0xfac68803, 0xfac68803, 0xfac68803, 0xfac68803, 0xfac68803 }, + { 0x0000786c, 0x08609ebe, 0x08609ebe, 0x08609ebe, 0x08609ebe, 0x08609ebe }, + { 0x00007820, 0x00000c00, 0x00000c00, 0x00000c00, 0x00000c00, 0x00000c00 }, + { 0x0000a274, 0x0a22a652, 0x0a22a652, 0x0a216652, 0x0a216652, 0x0a22a652 }, + { 0x0000a278, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7 }, + { 0x0000a27c, 0x050380e7, 0x050380e7, 0x050380e7, 0x050380e7, 0x050380e7 }, + { 0x0000a394, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7 }, + { 0x0000a398, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7 }, + { 0x0000a3dc, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7, 0x0e739ce7 }, + { 0x0000a3e0, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7 }, +}; + +static const u_int32_t ar9285Modes_original_tx_gain_v2[][6] = { + /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ + { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000a304, 0x00000000, 0x00000000, 0x00009200, 0x00009200, 0x00000000 }, + { 0x0000a308, 0x00000000, 0x00000000, 0x00010208, 0x00010208, 0x00000000 }, + { 0x0000a30c, 0x00000000, 0x00000000, 0x00019608, 0x00019608, 0x00000000 }, + { 0x0000a310, 0x00000000, 0x00000000, 0x00022618, 0x00022618, 0x00000000 }, + { 0x0000a314, 0x00000000, 0x00000000, 0x0002a6c9, 0x0002a6c9, 0x00000000 }, + { 0x0000a318, 0x00000000, 0x00000000, 0x00031710, 0x00031710, 0x00000000 }, + { 0x0000a31c, 0x00000000, 0x00000000, 0x00035718, 0x00035718, 0x00000000 }, + { 0x0000a320, 0x00000000, 0x00000000, 0x00038758, 0x00038758, 0x00000000 }, + { 0x0000a324, 0x00000000, 0x00000000, 0x0003c75a, 0x0003c75a, 0x00000000 }, + { 0x0000a328, 0x00000000, 0x00000000, 0x0004075c, 0x0004075c, 0x00000000 }, + { 0x0000a32c, 0x00000000, 0x00000000, 0x0004475e, 0x0004475e, 0x00000000 }, + { 0x0000a330, 0x00000000, 0x00000000, 0x0004679f, 0x0004679f, 0x00000000 }, + { 0x0000a334, 0x00000000, 0x00000000, 0x000487df, 0x000487df, 0x00000000 }, + { 0x0000a338, 0x0003891e, 0x0003891e, 0x0003891e, 0x0003891e, 0x00000000 }, + { 0x0000a33c, 0x0003a95e, 0x0003a95e, 0x0003a95e, 0x0003a95e, 0x00000000 }, + { 0x0000a340, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a344, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a348, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a34c, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a350, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x0000a354, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, + { 0x00007838, 0xfac68801, 0xfac68801, 0xfac68801, 0xfac68801, 0xfac68801 }, + { 0x0000786c, 0x48609eb4, 0x48609eb4, 0x48609eb4, 0x48609eb4, 0x48609eb4 }, + { 0x00007820, 0x00000c04, 0x00000c04, 0x00000c04, 0x00000c04, 0x00000c04 }, + { 0x0000a274, 0x0a21c652, 0x0a21c652, 0x0a21a652, 0x0a21a652, 0x0a22a652 }, + { 0x0000a278, 0x39ce739c, 0x39ce739c, 0x39ce739c, 0x39ce739c, 0x39ce739c }, + { 0x0000a27c, 0x050e039c, 0x050e039c, 0x050e039c, 0x050e039c, 0x050e039c }, + { 0x0000a394, 0x39ce739c, 0x39ce739c, 0x39ce739c, 0x39ce739c, 0x39ce739c }, + { 0x0000a398, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c }, + { 0x0000a3dc, 0x39ce739c, 0x39ce739c, 0x39ce739c, 0x39ce739c, 0x39ce739c }, + { 0x0000a3e0, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c }, +}; + +static const u_int32_t ar9285PciePhy_clkreq_always_on_L1_v2[][2] = { + {0x00004040, 0x9248fd00 }, + {0x00004040, 0x24924924 }, + {0x00004040, 0xa8000019 }, + {0x00004040, 0x13160820 }, + {0x00004040, 0xe5980560 }, + {0x00004040, 0xc01dcffd }, + {0x00004040, 0x1aaabe41 }, + {0x00004040, 0xbe105554 }, + {0x00004040, 0x00043007 }, + {0x00004044, 0x00000000 }, +}; + +static const u_int32_t ar9285PciePhy_clkreq_off_L1_v2[][2] = { + {0x00004040, 0x9248fd00 }, + {0x00004040, 0x24924924 }, + {0x00004040, 0xa8000019 }, + {0x00004040, 0x13160820 }, + {0x00004040, 0xe5980560 }, + {0x00004040, 0xc01dcffc }, + {0x00004040, 0x1aaabe41 }, + {0x00004040, 0xbe105554 }, + {0x00004040, 0x00043007 }, + {0x00004044, 0x00000000 }, +}; diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index b6fbaf857d64..d1ddb2dff6f7 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -42,9 +42,9 @@ __FBSDID("$FreeBSD$"); #include "opt_wlan.h" #include -#include +#include #include -#include +#include #include #include #include @@ -60,7 +60,7 @@ __FBSDID("$FreeBSD$"); #include #include - + #include #include #include @@ -81,7 +81,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef INET -#include +#include #include #endif @@ -467,7 +467,7 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) /* * Allocate hardware transmit queues: one queue for * beacon frames and one data queue for each QoS - * priority. Note that the hal handles reseting + * priority. Note that the hal handles resetting * these queues at the needed time. * * XXX PS-Poll @@ -560,7 +560,6 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) ifp->if_softc = sc; ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST; ifp->if_start = ath_start; - ifp->if_watchdog = NULL; ifp->if_ioctl = ath_ioctl; ifp->if_init = ath_init; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); @@ -621,6 +620,13 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) sc->sc_wmetkipmic = 1; } sc->sc_hasclrkey = ath_hal_ciphersupported(ah, HAL_CIPHER_CLR); + /* + * Check for multicast key search support. + */ + if (ath_hal_hasmcastkeysearch(sc->sc_ah) && + !ath_hal_getmcastkeysearch(sc->sc_ah)) { + ath_hal_setmcastkeysearch(sc->sc_ah, 1); + } sc->sc_mcastkey = ath_hal_getmcastkeysearch(ah); /* * Mark key cache slots associated with global keys @@ -752,7 +758,7 @@ ath_detach(struct ath_softc *sc) DPRINTF(sc, ATH_DEBUG_ANY, "%s: if_flags %x\n", __func__, ifp->if_flags); - /* + /* * NB: the order of these is important: * o stop the chip so no more interrupts will fire * o call the 802.11 layer before detaching the hal to @@ -1191,7 +1197,7 @@ ath_suspend(struct ath_softc *sc) /* * NB: don't worry about putting the chip in low power * mode; pci will power off our socket on suspend and - * cardbus detaches the device. + * CardBus detaches the device. */ } @@ -1469,7 +1475,7 @@ ath_bmiss_proc(void *arg, int pending) DPRINTF(sc, ATH_DEBUG_ANY, "%s: pending %u\n", __func__, pending); if (ath_hal_gethangstate(sc->sc_ah, 0xff, &hangs) && hangs != 0) { - if_printf(ifp, "bb hang detected (0x%x), reseting\n", hangs); + if_printf(ifp, "bb hang detected (0x%x), resetting\n", hangs); ath_reset(ifp); } else ieee80211_beacon_miss(ifp->if_l2com); @@ -1832,7 +1838,7 @@ ath_start(struct ifnet *ifp) * go out or none... */ STAILQ_INIT(&frags); - if ((m->m_flags & M_FRAG) && + if ((m->m_flags & M_FRAG) && !ath_txfrag_setup(sc, &frags, m, ni)) { DPRINTF(sc, ATH_DEBUG_XMIT, "%s: out of txfrag buffers\n", __func__); @@ -2039,7 +2045,7 @@ ath_keyset(struct ath_softc *sc, const struct ieee80211_key *k, if ((k->wk_flags & IEEE80211_KEY_GROUP) && sc->sc_mcastkey) { /* * Group keys on hardware that supports multicast frame - * key search use a mac that is the sender's address with + * key search use a MAC that is the sender's address with * the high bit set instead of the app-specified address. */ IEEE80211_ADDR_COPY(gmac, bss->ni_macaddr); @@ -2219,8 +2225,10 @@ ath_key_alloc(struct ieee80211vap *vap, struct ieee80211_key *k, * it permits us to support multiple users for adhoc and/or * multi-station operation. */ - if (k->wk_keyix != IEEE80211_KEYIX_NONE || /* global key */ - ((k->wk_flags & IEEE80211_KEY_GROUP) && !sc->sc_mcastkey)) { + if (k->wk_keyix != IEEE80211_KEYIX_NONE) { + /* + * Only global keys should have key index assigned. + */ if (!(&vap->iv_nw_keys[0] <= k && k < &vap->iv_nw_keys[IEEE80211_WEP_NKID])) { /* should not happen */ @@ -2228,12 +2236,21 @@ ath_key_alloc(struct ieee80211vap *vap, struct ieee80211_key *k, "%s: bogus group key\n", __func__); return 0; } + if (vap->iv_opmode != IEEE80211_M_HOSTAP || + !(k->wk_flags & IEEE80211_KEY_GROUP) || + !sc->sc_mcastkey) { + /* + * XXX we pre-allocate the global keys so + * have no way to check if they've already + * been allocated. + */ + *keyix = *rxkeyix = k - vap->iv_nw_keys; + return 1; + } /* - * XXX we pre-allocate the global keys so - * have no way to check if they've already been allocated. + * Group key and device supports multicast key search. */ - *keyix = *rxkeyix = k - vap->iv_nw_keys; - return 1; + k->wk_keyix = IEEE80211_KEYIX_NONE; } /* @@ -3339,7 +3356,7 @@ ath_descdma_setup(struct ath_softc *sc, } error = bus_dmamem_alloc(dd->dd_dmat, (void**) &dd->dd_desc, - BUS_DMA_NOWAIT | BUS_DMA_COHERENT, + BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &dd->dd_dmamap); if (error != 0) { if_printf(ifp, "unable to alloc memory for %u %s descriptors, " @@ -3775,7 +3792,7 @@ ath_rx_proc(void *arg, int npending) /* * If mbuf allocation failed previously there * will be no mbuf; try again to re-populate it. - */ + */ /* XXX make debug msg */ if_printf(ifp, "%s: no mbuf!\n", __func__); STAILQ_REMOVE_HEAD(&sc->sc_rxbuf, bf_list); @@ -3846,7 +3863,7 @@ ath_rx_proc(void *arg, int npending) bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_POSTREAD); - ath_handle_micerror(ic, + ath_handle_micerror(ic, mtod(m, struct ieee80211_frame *), sc->sc_splitmic ? rs->rs_keyix-32 : rs->rs_keyix); @@ -4023,7 +4040,7 @@ rx_accept: */ if (type == IEEE80211_FC0_TYPE_DATA) { const HAL_RATE_TABLE *rt = sc->sc_currates; - ath_led_event(sc, + ath_led_event(sc, rt->rateCodeToIndex[rs->rs_rate]); } else if (ticks - sc->sc_ledevent >= sc->sc_ledidle) ath_led_event(sc, 0); @@ -5305,7 +5322,7 @@ ath_startrecv(struct ath_softc *sc) return 0; } -/* +/* * Update internal state after a channel change. */ static void @@ -5325,7 +5342,7 @@ ath_chan_change(struct ath_softc *sc, struct ieee80211_channel *chan) /* * Set/change channels. If the channel is really being changed, - * it's done by reseting the chip. To accomplish this we must + * it's done by resetting the chip. To accomplish this we must * first cleanup any pending DMA, then restart stuff after a la * ath_init. */ @@ -5352,7 +5369,7 @@ ath_chan_set(struct ath_softc *sc, struct ieee80211_channel *chan) ath_stoprecv(sc); /* turn off frame recv */ if (!ath_hal_reset(ah, sc->sc_opmode, chan, AH_TRUE, &status)) { if_printf(ifp, "%s: unable to reset " - "channel %u (%u Mhz, flags 0x%x), hal status %u\n", + "channel %u (%u MHz, flags 0x%x), hal status %u\n", __func__, ieee80211_chan2ieee(ic, chan), chan->ic_freq, chan->ic_flags, status); return EIO; @@ -5524,7 +5541,7 @@ ath_set_channel(struct ieee80211com *ic) sc->sc_syncbeacon = 1; } -/* +/* * Walk the vap list and check if there any vap's in RUN state. */ static int @@ -5786,7 +5803,7 @@ ath_newassoc(struct ieee80211_node *ni, int isnew) an->an_mgmtrix = ath_tx_findrix(sc, tp->mgmtrate); ath_rate_newassoc(sc, an, isnew); - if (isnew && + if (isnew && (vap->iv_flags & IEEE80211_F_PRIVACY) == 0 && sc->sc_hasclrkey && ni->ni_ucastkey.wk_keyix == IEEE80211_KEYIX_NONE) ath_setup_stationkey(ni); @@ -6031,7 +6048,7 @@ ath_setcurmode(struct ath_softc *sc, enum ieee80211_phymode mode) sc->sc_protrix = ath_tx_findrix(sc, 2*2); else sc->sc_protrix = ath_tx_findrix(sc, 2*1); - /* NB: caller is responsible for reseting rate control state */ + /* NB: caller is responsible for resetting rate control state */ #undef N } @@ -6106,7 +6123,7 @@ ath_watchdog(void *arg) if (ath_hal_gethangstate(sc->sc_ah, 0xffff, &hangs) && hangs != 0) { if_printf(ifp, "%s hang detected (0x%x)\n", - hangs & 0xff ? "bb" : "mac", hangs); + hangs & 0xff ? "bb" : "mac", hangs); } else if_printf(ifp, "device timeout\n"); ath_reset(ifp); @@ -6787,7 +6804,7 @@ ath_tx_raw_start(struct ath_softc *sc, struct ieee80211_node *ni, if (IFF_DUMPPKTS(sc, ATH_DEBUG_XMIT)) ieee80211_dump_pkt(ic, mtod(m0, caddr_t), m0->m_len, sc->sc_hwmap[rix].ieeerate, -1); - + if (ieee80211_radiotap_active_vap(vap)) { u_int64_t tsf = ath_hal_gettsf64(ah); @@ -6945,6 +6962,8 @@ ath_announce(struct ath_softc *sc) if_printf(ifp, "using %u rx buffers\n", ath_rxbuf); if (ath_txbuf != ATH_TXBUF) if_printf(ifp, "using %u tx buffers\n", ath_txbuf); + if (sc->sc_mcastkey && bootverbose) + if_printf(ifp, "using multicast key search\n"); } #ifdef IEEE80211_SUPPORT_TDMA diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h index 29efc4c88cb1..31b1d4c00d5c 100644 --- a/sys/dev/ath/if_athvar.h +++ b/sys/dev/ath/if_athvar.h @@ -580,14 +580,12 @@ void ath_intr(void *); ath_hal_setcapability(_ah, HAL_CAP_TPC, 1, _v, NULL) #define ath_hal_hasbursting(_ah) \ (ath_hal_getcapability(_ah, HAL_CAP_BURST, 0, NULL) == HAL_OK) -#ifdef notyet +#define ath_hal_setmcastkeysearch(_ah, _v) \ + ath_hal_setcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 0, _v, NULL) #define ath_hal_hasmcastkeysearch(_ah) \ (ath_hal_getcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 0, NULL) == HAL_OK) #define ath_hal_getmcastkeysearch(_ah) \ (ath_hal_getcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 1, NULL) == HAL_OK) -#else -#define ath_hal_getmcastkeysearch(_ah) 0 -#endif #define ath_hal_hasfastframes(_ah) \ (ath_hal_getcapability(_ah, HAL_CAP_FASTFRAME, 0, NULL) == HAL_OK) #define ath_hal_hasbssidmask(_ah) \ diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c index 59d96322a62f..600020fae6de 100644 --- a/sys/dev/atkbdc/atkbd.c +++ b/sys/dev/atkbdc/atkbd.c @@ -1091,32 +1091,35 @@ get_typematic(keyboard_t *kbd) { #if defined(__i386__) || defined(__amd64__) /* - * Only some systems allow us to retrieve the keyboard repeat + * Only some systems allow us to retrieve the keyboard repeat * rate previously set via the BIOS... */ x86regs_t regs; uint8_t *p; + if (x86bios_get_intr(0x15) == 0 || x86bios_get_intr(0x16) == 0) + return (ENODEV); + /* Is BIOS system configuration table supported? */ - bzero(®s, sizeof(regs)); + x86bios_init_regs(®s); regs.R_AH = 0xc0; x86bios_intr(®s, 0x15); if ((regs.R_FLG & PSL_C) != 0 || regs.R_AH != 0) return (ENODEV); - /* Is int 16, function 0x09 supported? */ + /* Is int 0x16, function 0x09 supported? */ p = x86bios_offset((regs.R_ES << 4) + regs.R_BX); if (readw(p) < 5 || (readb(p + 6) & 0x40) == 0) return (ENODEV); - /* Is int 16, function 0x0306 supported? */ - bzero(®s, sizeof(regs)); + /* Is int 0x16, function 0x0306 supported? */ + x86bios_init_regs(®s); regs.R_AH = 0x09; x86bios_intr(®s, 0x16); if ((regs.R_AL & 0x08) == 0) return (ENODEV); - bzero(®s, sizeof(regs)); + x86bios_init_regs(®s); regs.R_AX = 0x0306; x86bios_intr(®s, 0x16); kbd->kb_delay1 = typematic_delay(regs.R_BH << 5); diff --git a/sys/dev/atkbdc/psm.c b/sys/dev/atkbdc/psm.c index 93c9acb7a9c4..30113bdad11a 100644 --- a/sys/dev/atkbdc/psm.c +++ b/sys/dev/atkbdc/psm.c @@ -343,6 +343,9 @@ static devclass_t psm_devclass; #define PSM_FLAGS_FINGERDOWN 0x0001 /* VersaPad finger down */ /* Tunables */ +static int tap_enabled = -1; +TUNABLE_INT("hw.psm.tap_enabled", &tap_enabled); + static int synaptics_support = 0; TUNABLE_INT("hw.psm.synaptics_support", &synaptics_support); @@ -901,6 +904,36 @@ doopen(struct psm_softc *sc, int command_byte) } } + /* + * A user may want to disable tap and drag gestures on a Synaptics + * TouchPad when it operates in Relative Mode. + */ + if (sc->hw.model == MOUSE_MODEL_GENERIC) { + if (tap_enabled > 0) { + /* + * Enable tap & drag gestures. We use a Mode Byte + * and clear the DisGest bit (see §2.5 of Synaptics + * TouchPad Interfacing Guide). + */ + VLOG(2, (LOG_DEBUG, + "psm%d: enable tap and drag gestures\n", + sc->unit)); + mouse_ext_command(sc->kbdc, 0x00); + set_mouse_sampling_rate(sc->kbdc, 20); + } else if (tap_enabled == 0) { + /* + * Disable tap & drag gestures. We use a Mode Byte + * and set the DisGest bit (see §2.5 of Synaptics + * TouchPad Interfacing Guide). + */ + VLOG(2, (LOG_DEBUG, + "psm%d: disable tap and drag gestures\n", + sc->unit)); + mouse_ext_command(sc->kbdc, 0x04); + set_mouse_sampling_rate(sc->kbdc, 20); + } + } + /* enable the mouse device */ if (!enable_aux_dev(sc->kbdc)) { /* MOUSE ERROR: failed to enable the mouse because: @@ -2261,6 +2294,8 @@ static int pkterrthresh = 2; SYSCTL_INT(_debug_psm, OID_AUTO, pkterrthresh, CTLFLAG_RW, &pkterrthresh, 0, "Number of error packets allowed before reinitializing the mouse"); +SYSCTL_INT(_hw_psm, OID_AUTO, tap_enabled, CTLFLAG_RW, &tap_enabled, 0, + "Enable tap and drag gestures"); static int tap_threshold = PSM_TAP_THRESHOLD; SYSCTL_INT(_hw_psm, OID_AUTO, tap_threshold, CTLFLAG_RW, &tap_threshold, 0, "Button tap threshold"); diff --git a/sys/dev/auxio/auxio.c b/sys/dev/auxio/auxio.c index 9943a0afd600..35fd307a97a4 100644 --- a/sys/dev/auxio/auxio.c +++ b/sys/dev/auxio/auxio.c @@ -56,7 +56,7 @@ */ /* - * AUXIO registers support on the sbus & ebus2, used for the floppy driver + * AUXIO registers support on the SBus & EBus2, used for the floppy driver * and to control the system LED, for the BLINK option. */ @@ -85,8 +85,8 @@ __FBSDID("$FreeBSD$"); #include /* - * on sun4u, auxio exists with one register (LED) on the sbus, and 5 - * registers on the ebus2 (pci) (LED, PCIMODE, FREQUENCY, SCSI + * On sun4u, auxio exists with one register (LED) on the SBus, and 5 + * registers on the EBus2 (pci) (LED, PCIMODE, FREQUENCY, SCSI * OSCILLATOR, and TEMP SENSE. */ @@ -141,7 +141,10 @@ static driver_t auxio_sbus_driver = { }; static devclass_t auxio_devclass; -DRIVER_MODULE(auxio, sbus, auxio_sbus_driver, auxio_devclass, 0, 0); +/* The probe order is handled by sbus(4). */ +EARLY_DRIVER_MODULE(auxio, sbus, auxio_sbus_driver, auxio_devclass, 0, 0, + BUS_PASS_DEFAULT); +MODULE_DEPEND(auxio, sbus, 1, 1, 1); /* EBus */ static device_method_t auxio_ebus_methods[] = { @@ -157,7 +160,9 @@ static driver_t auxio_ebus_driver = { sizeof(struct auxio_softc) }; -DRIVER_MODULE(auxio, ebus, auxio_ebus_driver, auxio_devclass, 0, 0); +EARLY_DRIVER_MODULE(auxio, ebus, auxio_ebus_driver, auxio_devclass, 0, 0, + BUS_PASS_DEFAULT); +MODULE_DEPEND(auxio, ebus, 1, 1, 1); MODULE_VERSION(auxio, 1); #define AUXIO_LOCK_INIT(sc) \ diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c index 431ed9f24f79..8b6f2226a1ff 100644 --- a/sys/dev/bce/if_bce.c +++ b/sys/dev/bce/if_bce.c @@ -293,12 +293,12 @@ static void bce_dump_enet (struct bce_softc *, struct mbuf *); static void bce_dump_mbuf (struct bce_softc *, struct mbuf *); static void bce_dump_tx_mbuf_chain (struct bce_softc *, u16, int); static void bce_dump_rx_mbuf_chain (struct bce_softc *, u16, int); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT static void bce_dump_pg_mbuf_chain (struct bce_softc *, u16, int); #endif static void bce_dump_txbd (struct bce_softc *, int, struct tx_bd *); static void bce_dump_rxbd (struct bce_softc *, int, struct rx_bd *); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT static void bce_dump_pgbd (struct bce_softc *, int, struct rx_bd *); #endif static void bce_dump_l2fhdr (struct bce_softc *, int, struct l2_fhdr *); @@ -306,7 +306,7 @@ static void bce_dump_ctx (struct bce_softc *, u16); static void bce_dump_ftqs (struct bce_softc *); static void bce_dump_tx_chain (struct bce_softc *, u16, int); static void bce_dump_rx_chain (struct bce_softc *, u16, int); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT static void bce_dump_pg_chain (struct bce_softc *, u16, int); #endif static void bce_dump_status_block (struct bce_softc *); @@ -371,6 +371,9 @@ static void bce_release_resources (struct bce_softc *); static int bce_fw_sync (struct bce_softc *, u32); static void bce_load_rv2p_fw (struct bce_softc *, u32 *, u32, u32); static void bce_load_cpu_fw (struct bce_softc *, struct cpu_reg *, struct fw_info *); +static void bce_start_cpu (struct bce_softc *, struct cpu_reg *); +static void bce_halt_cpu (struct bce_softc *, struct cpu_reg *); +static void bce_start_rxp_cpu (struct bce_softc *); static void bce_init_rxp_cpu (struct bce_softc *); static void bce_init_txp_cpu (struct bce_softc *); static void bce_init_tpat_cpu (struct bce_softc *); @@ -393,13 +396,14 @@ static int bce_init_rx_chain (struct bce_softc *); static void bce_fill_rx_chain (struct bce_softc *); static void bce_free_rx_chain (struct bce_softc *); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT static int bce_get_pg_buf (struct bce_softc *, struct mbuf *, u16 *, u16 *); static int bce_init_pg_chain (struct bce_softc *); static void bce_fill_pg_chain (struct bce_softc *); static void bce_free_pg_chain (struct bce_softc *); #endif +static struct mbuf *bce_tso_setup (struct bce_softc *, struct mbuf **, u16 *); static int bce_tx_encap (struct bce_softc *, struct mbuf **); static void bce_start_locked (struct ifnet *); static void bce_start (struct ifnet *); @@ -602,10 +606,11 @@ bce_print_adapter_info(struct bce_softc *sc) /* Firmware version and device features. */ printf("B/C (%s); Flags (", sc->bce_bc_ver); -#ifdef ZERO_COPY_SOCKETS - printf("SPLT "); +#ifdef BCE_JUMBO_HDRSPLIT + printf("SPLT"); i++; #endif + if (sc->bce_flags & BCE_USING_MSI_FLAG) { if (i > 0) printf("|"); printf("MSI"); i++; @@ -613,7 +618,7 @@ bce_print_adapter_info(struct bce_softc *sc) if (sc->bce_flags & BCE_USING_MSIX_FLAG) { if (i > 0) printf("|"); - printf("MSI-X "); i++; + printf("MSI-X"); i++; } if (sc->bce_phy_flags & BCE_PHY_2_5G_CAPABLE_FLAG) { @@ -1053,7 +1058,8 @@ bce_attach(device_t dev) if (bce_tso_enable) { ifp->if_hwassist = BCE_IF_HWASSIST | CSUM_TSO; - ifp->if_capabilities = BCE_IF_CAPABILITIES | IFCAP_TSO4; + ifp->if_capabilities = BCE_IF_CAPABILITIES | IFCAP_TSO4 | + IFCAP_VLAN_HWTSO; } else { ifp->if_hwassist = BCE_IF_HWASSIST; ifp->if_capabilities = BCE_IF_CAPABILITIES; @@ -1066,7 +1072,7 @@ bce_attach(device_t dev) * This may change later if the MTU size is set to * something other than 1500. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT sc->rx_bd_mbuf_alloc_size = MHLEN; /* Make sure offset is 16 byte aligned for hardware. */ sc->rx_bd_mbuf_align_pad = roundup2((MSIZE - MHLEN), 16) - @@ -2835,7 +2841,7 @@ bce_dma_free(struct bce_softc *sc) } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* Free, unmap and destroy all page buffer descriptor chain pages. */ for (i = 0; i < PG_PAGES; i++ ) { if (sc->pg_bd_chain[i] != NULL) { @@ -2899,7 +2905,7 @@ bce_dma_free(struct bce_softc *sc) sc->rx_mbuf_tag = NULL; } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* Unload and destroy the page mbuf maps. */ for (i = 0; i < TOTAL_PG_BD; i++) { if (sc->pg_mbuf_map[i] != NULL) { @@ -2976,6 +2982,7 @@ bce_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error) /* |PG Buffers | none | none | none | none | */ /* |TX Buffers | none | none | none | none | */ /* |Chain Pages(1) | 4KiB | 4KiB | 4KiB | 4KiB | */ +/* |Context Memory | | | | | */ /* +-----------------+----------+----------+----------+----------+ */ /* */ /* (1) Must align with CPU page size (BCM_PAGE_SZIE). */ @@ -3345,7 +3352,7 @@ bce_dma_alloc(device_t dev) /* * Create a DMA tag for RX mbufs. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT max_size = max_seg_size = ((sc->rx_bd_mbuf_alloc_size < MCLBYTES) ? MCLBYTES : sc->rx_bd_mbuf_alloc_size); #else @@ -3386,7 +3393,7 @@ bce_dma_alloc(device_t dev) } } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* * Create a DMA tag for the page buffer descriptor chain, * allocate and clear the memory, and fetch the physical @@ -3665,15 +3672,10 @@ bce_load_cpu_fw(struct bce_softc *sc, struct cpu_reg *cpu_reg, struct fw_info *fw) { u32 offset; - u32 val; DBENTER(BCE_VERBOSE_RESET); - /* Halt the CPU. */ - val = REG_RD_IND(sc, cpu_reg->mode); - val |= cpu_reg->mode_value_halt; - REG_WR_IND(sc, cpu_reg->mode, val); - REG_WR_IND(sc, cpu_reg->state, cpu_reg->state_value_clear); + bce_halt_cpu(sc, cpu_reg); /* Load the Text area. */ offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base); @@ -3726,9 +3728,28 @@ bce_load_cpu_fw(struct bce_softc *sc, struct cpu_reg *cpu_reg, } } - /* Clear the pre-fetch instruction. */ - REG_WR_IND(sc, cpu_reg->inst, 0); - REG_WR_IND(sc, cpu_reg->pc, fw->start_addr); + /* Clear the pre-fetch instruction and set the FW start address. */ + REG_WR_IND(sc, cpu_reg->inst, 0); + REG_WR_IND(sc, cpu_reg->pc, fw->start_addr); + + DBEXIT(BCE_VERBOSE_RESET); +} + + +/****************************************************************************/ +/* Starts the RISC processor. */ +/* */ +/* Assumes the CPU starting address has already been set. */ +/* */ +/* Returns: */ +/* Nothing. */ +/****************************************************************************/ +static void +bce_start_cpu(struct bce_softc *sc, struct cpu_reg *cpu_reg) +{ + u32 val; + + DBENTER(BCE_VERBOSE_RESET); /* Start the CPU. */ val = REG_RD_IND(sc, cpu_reg->mode); @@ -3740,6 +3761,62 @@ bce_load_cpu_fw(struct bce_softc *sc, struct cpu_reg *cpu_reg, } +/****************************************************************************/ +/* Halts the RISC processor. */ +/* */ +/* Returns: */ +/* Nothing. */ +/****************************************************************************/ +static void +bce_halt_cpu(struct bce_softc *sc, struct cpu_reg *cpu_reg) +{ + u32 val; + + DBENTER(BCE_VERBOSE_RESET); + + /* Halt the CPU. */ + val = REG_RD_IND(sc, cpu_reg->mode); + val |= cpu_reg->mode_value_halt; + REG_WR_IND(sc, cpu_reg->mode, val); + REG_WR_IND(sc, cpu_reg->state, cpu_reg->state_value_clear); + + DBEXIT(BCE_VERBOSE_RESET); +} + + +/****************************************************************************/ +/* Initialize the RX CPU. */ +/* */ +/* Returns: */ +/* Nothing. */ +/****************************************************************************/ +static void +bce_start_rxp_cpu(struct bce_softc *sc) +{ + struct cpu_reg cpu_reg; + + DBENTER(BCE_VERBOSE_RESET); + + cpu_reg.mode = BCE_RXP_CPU_MODE; + cpu_reg.mode_value_halt = BCE_RXP_CPU_MODE_SOFT_HALT; + cpu_reg.mode_value_sstep = BCE_RXP_CPU_MODE_STEP_ENA; + cpu_reg.state = BCE_RXP_CPU_STATE; + cpu_reg.state_value_clear = 0xffffff; + cpu_reg.gpr0 = BCE_RXP_CPU_REG_FILE; + cpu_reg.evmask = BCE_RXP_CPU_EVENT_MASK; + cpu_reg.pc = BCE_RXP_CPU_PROGRAM_COUNTER; + cpu_reg.inst = BCE_RXP_CPU_INSTRUCTION; + cpu_reg.bp = BCE_RXP_CPU_HW_BREAKPOINT; + cpu_reg.spad_base = BCE_RXP_SCRATCH; + cpu_reg.mips_view_base = 0x8000000; + + DBPRINT(sc, BCE_INFO_RESET, "Starting RX firmware.\n"); + bce_start_cpu(sc, &cpu_reg); + + DBEXIT(BCE_VERBOSE_RESET); +} + + /****************************************************************************/ /* Initialize the RX CPU. */ /* */ @@ -3833,6 +3910,8 @@ bce_init_rxp_cpu(struct bce_softc *sc) DBPRINT(sc, BCE_INFO_RESET, "Loading RX firmware.\n"); bce_load_cpu_fw(sc, &cpu_reg, &fw); + /* Delay RXP start until initialization is complete. */ + DBEXIT(BCE_VERBOSE_RESET); } @@ -3929,6 +4008,7 @@ bce_init_txp_cpu(struct bce_softc *sc) DBPRINT(sc, BCE_INFO_RESET, "Loading TX firmware.\n"); bce_load_cpu_fw(sc, &cpu_reg, &fw); + bce_start_cpu(sc, &cpu_reg); DBEXIT(BCE_VERBOSE_RESET); } @@ -4026,6 +4106,7 @@ bce_init_tpat_cpu(struct bce_softc *sc) DBPRINT(sc, BCE_INFO_RESET, "Loading TPAT firmware.\n"); bce_load_cpu_fw(sc, &cpu_reg, &fw); + bce_start_cpu(sc, &cpu_reg); DBEXIT(BCE_VERBOSE_RESET); } @@ -4123,6 +4204,7 @@ bce_init_cp_cpu(struct bce_softc *sc) DBPRINT(sc, BCE_INFO_RESET, "Loading CP firmware.\n"); bce_load_cpu_fw(sc, &cpu_reg, &fw); + bce_start_cpu(sc, &cpu_reg); DBEXIT(BCE_VERBOSE_RESET); } @@ -4220,6 +4302,7 @@ bce_init_com_cpu(struct bce_softc *sc) DBPRINT(sc, BCE_INFO_RESET, "Loading COM firmware.\n"); bce_load_cpu_fw(sc, &cpu_reg, &fw); + bce_start_cpu(sc, &cpu_reg); DBEXIT(BCE_VERBOSE_RESET); } @@ -4473,7 +4556,7 @@ bce_stop(struct bce_softc *sc) bce_disable_intr(sc); /* Free RX buffers. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT bce_free_pg_chain(sc); #endif bce_free_rx_chain(sc); @@ -4665,6 +4748,12 @@ bce_chipinit(struct bce_softc *sc) /* Initialize the on-boards CPUs */ bce_init_cpus(sc); + /* Enable management frames (NC-SI) to flow to the MCP. */ + if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) { + val = REG_RD(sc, BCE_RPM_MGMT_PKT_CTRL) | BCE_RPM_MGMT_PKT_CTRL_MGMT_EN; + REG_WR(sc, BCE_RPM_MGMT_PKT_CTRL, val); + } + /* Prepare NVRAM for access. */ if (bce_init_nvram(sc)) { rc = ENODEV; @@ -4845,6 +4934,15 @@ bce_blockinit(struct bce_softc *sc) /* Enable link state change interrupt generation. */ REG_WR(sc, BCE_HC_ATTN_BITS_ENABLE, STATUS_ATTN_BITS_LINK_STATE); + /* Enable the RXP. */ + bce_start_rxp_cpu(sc); + + /* Disable management frames (NC-SI) from flowing to the MCP. */ + if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) { + val = REG_RD(sc, BCE_RPM_MGMT_PKT_CTRL) & ~BCE_RPM_MGMT_PKT_CTRL_MGMT_EN; + REG_WR(sc, BCE_RPM_MGMT_PKT_CTRL, val); + } + /* Enable all remaining blocks in the MAC. */ if ((BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5709) || (BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5716)) @@ -4910,7 +5008,7 @@ bce_get_rx_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, goto bce_get_rx_buf_exit); /* This is a new mbuf allocation. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT MGETHDR(m_new, M_DONTWAIT, MT_DATA); #else if (sc->rx_bd_mbuf_alloc_size <= MCLBYTES) @@ -4991,7 +5089,7 @@ bce_get_rx_buf_exit: } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /****************************************************************************/ /* Encapsulate an mbuf cluster into the page chain. */ /* */ @@ -5100,7 +5198,7 @@ bce_get_pg_buf_exit: return(rc); } -#endif /* ZERO_COPY_SOCKETS */ +#endif /* BCE_JUMBO_HDRSPLIT */ /****************************************************************************/ /* Initialize the TX context memory. */ @@ -5456,7 +5554,7 @@ bce_free_rx_chain(struct bce_softc *sc) } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /****************************************************************************/ /* Allocate memory and initialize the page data structures. */ /* Assumes that bce_init_rx_chain() has not already been called. */ @@ -5620,7 +5718,7 @@ bce_free_pg_chain(struct bce_softc *sc) DBEXIT(BCE_VERBOSE_RESET | BCE_VERBOSE_RECV | BCE_VERBOSE_UNLOAD); } -#endif /* ZERO_COPY_SOCKETS */ +#endif /* BCE_JUMBO_HDRSPLIT */ /****************************************************************************/ @@ -5790,10 +5888,11 @@ bce_rx_intr(struct bce_softc *sc) { struct ifnet *ifp = sc->bce_ifp; struct l2_fhdr *l2fhdr; + struct ether_vlan_header *vh; unsigned int pkt_len; u16 sw_rx_cons, sw_rx_cons_idx, hw_rx_cons; u32 status; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT unsigned int rem_len; u16 sw_pg_cons, sw_pg_cons_idx; #endif @@ -5809,7 +5908,7 @@ bce_rx_intr(struct bce_softc *sc) bus_dmamap_sync(sc->rx_bd_chain_tag, sc->rx_bd_chain_map[i], BUS_DMASYNC_POSTREAD); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* Prepare the page chain pages to be accessed by the host CPU. */ for (int i = 0; i < PG_PAGES; i++) bus_dmamap_sync(sc->pg_bd_chain_tag, @@ -5821,7 +5920,7 @@ bce_rx_intr(struct bce_softc *sc) /* Get working copies of the driver's view of the consumer indices. */ sw_rx_cons = sc->rx_cons; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT sw_pg_cons = sc->pg_cons; #endif @@ -5851,22 +5950,29 @@ bce_rx_intr(struct bce_softc *sc) DBRUN(sc->debug_rx_mbuf_alloc--); sc->free_rx_bd++; - /* - * Frames received on the NetXteme II are prepended with an - * l2_fhdr structure which provides status information about - * the received frame (including VLAN tags and checksum info). - * The frames are also automatically adjusted to align the IP - * header (i.e. two null bytes are inserted before the Ethernet - * header). As a result the data DMA'd by the controller into - * the mbuf is as follows: - * - * +---------+-----+---------------------+-----+ - * | l2_fhdr | pad | packet data | FCS | - * +---------+-----+---------------------+-----+ - * - * The l2_fhdr needs to be checked and skipped and the FCS needs - * to be stripped before sending the packet up the stack. - */ + if(m0 == NULL) { + DBPRINT(sc, BCE_EXTREME_RECV, "%s(): Oops! Empty mbuf pointer " + "found in sc->rx_mbuf_ptr[0x%04X]!\n", + __FUNCTION__, sw_rx_cons_idx); + goto bce_rx_int_next_rx; + } + + /* + * Frames received on the NetXteme II are prepended with an + * l2_fhdr structure which provides status information about + * the received frame (including VLAN tags and checksum info). + * The frames are also automatically adjusted to align the IP + * header (i.e. two null bytes are inserted before the Ethernet + * header). As a result the data DMA'd by the controller into + * the mbuf is as follows: + * + * +---------+-----+---------------------+-----+ + * | l2_fhdr | pad | packet data | FCS | + * +---------+-----+---------------------+-----+ + * + * The l2_fhdr needs to be checked and skipped and the FCS needs + * to be stripped before sending the packet up the stack. + */ l2fhdr = mtod(m0, struct l2_fhdr *); /* Get the packet data + FCS length and the status. */ @@ -5882,7 +5988,7 @@ bce_rx_intr(struct bce_softc *sc) */ m_adj(m0, sizeof(struct l2_fhdr) + ETHER_ALIGN); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* * Check whether the received frame fits in a single * mbuf or not (i.e. packet data + FCS <= @@ -6038,12 +6144,37 @@ bce_rx_intr(struct bce_softc *sc) /* Attach the VLAN tag. */ if (status & L2_FHDR_STATUS_L2_VLAN_TAG) { + if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) { #if __FreeBSD_version < 700000 - VLAN_INPUT_TAG(ifp, m0, l2fhdr->l2_fhdr_vlan_tag, continue); + VLAN_INPUT_TAG(ifp, m0, + l2fhdr->l2_fhdr_vlan_tag, continue); #else - m0->m_pkthdr.ether_vtag = l2fhdr->l2_fhdr_vlan_tag; - m0->m_flags |= M_VLANTAG; + m0->m_pkthdr.ether_vtag = + l2fhdr->l2_fhdr_vlan_tag; + m0->m_flags |= M_VLANTAG; #endif + } else { + /* + * bce(4) controllers can't disable VLAN + * tag stripping if management firmware + * (ASF/IPMI/UMP) is running. So we always + * strip VLAN tag and manually reconstruct + * the VLAN frame by appending stripped + * VLAN tag in driver if VLAN tag stripping + * was disabled. + * + * TODO: LLC SNAP handling. + */ + bcopy(mtod(m0, uint8_t *), + mtod(m0, uint8_t *) - ETHER_VLAN_ENCAP_LEN, + ETHER_ADDR_LEN * 2); + m0->m_data -= ETHER_VLAN_ENCAP_LEN; + vh = mtod(m0, struct ether_vlan_header *); + vh->evl_encap_proto = htons(ETHERTYPE_VLAN); + vh->evl_tag = htons(l2fhdr->l2_fhdr_vlan_tag); + m0->m_pkthdr.len += ETHER_VLAN_ENCAP_LEN; + m0->m_len += ETHER_VLAN_ENCAP_LEN; + } } /* Increment received packet statistics. */ @@ -6056,7 +6187,7 @@ bce_rx_int_next_rx: if (m0) { /* Make sure we don't lose our place when we release the lock. */ sc->rx_cons = sw_rx_cons; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT sc->pg_cons = sw_pg_cons; #endif @@ -6066,7 +6197,7 @@ bce_rx_int_next_rx: /* Recover our place. */ sw_rx_cons = sc->rx_cons; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT sw_pg_cons = sc->pg_cons; #endif } @@ -6077,7 +6208,7 @@ bce_rx_int_next_rx: } /* No new packets to process. Refill the RX and page chains and exit. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT sc->pg_cons = sw_pg_cons; bce_fill_pg_chain(sc); #endif @@ -6090,7 +6221,7 @@ bce_rx_int_next_rx: bus_dmamap_sync(sc->rx_bd_chain_tag, sc->rx_bd_chain_map[i], BUS_DMASYNC_PREWRITE); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT for (int i = 0; i < PG_PAGES; i++) bus_dmamap_sync(sc->pg_bd_chain_tag, sc->pg_bd_chain_map[i], BUS_DMASYNC_PREWRITE); @@ -6336,7 +6467,7 @@ bce_init_locked(struct bce_softc *sc) * Calculate and program the hardware Ethernet MTU * size. Be generous on the receive if we have room. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT if (ifp->if_mtu <= (sc->rx_bd_mbuf_data_len + sc->pg_bd_mbuf_alloc_size)) ether_mtu = sc->rx_bd_mbuf_data_len + sc->pg_bd_mbuf_alloc_size; #else @@ -6368,7 +6499,7 @@ bce_init_locked(struct bce_softc *sc) /* Program appropriate promiscuous/multicast filtering. */ bce_set_rx_mode(sc); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT DBPRINT(sc, BCE_INFO_LOAD, "%s(): pg_bd_mbuf_alloc_size = %d\n", __FUNCTION__, sc->pg_bd_mbuf_alloc_size); @@ -6387,6 +6518,7 @@ bce_init_locked(struct bce_softc *sc) bce_ifmedia_upd_locked(ifp); + /* Let the OS know the driver is up and running. */ ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; @@ -6455,6 +6587,110 @@ bce_init(void *xsc) } +static struct mbuf * +bce_tso_setup(struct bce_softc *sc, struct mbuf **m_head, u16 *flags) +{ + struct mbuf *m; + struct ether_header *eh; + struct ip *ip; + struct tcphdr *th; + u16 etype; + int hdr_len, ip_hlen = 0, tcp_hlen = 0, ip_len = 0; + + DBRUN(sc->requested_tso_frames++); + /* Controller requires to monify mbuf chains. */ + if (M_WRITABLE(*m_head) == 0) { + m = m_dup(*m_head, M_DONTWAIT); + m_freem(*m_head); + if (m == NULL) { + sc->mbuf_alloc_failed_count++; + *m_head = NULL; + return (NULL); + } + *m_head = m; + } + /* + * For TSO the controller needs two pieces of info, + * the MSS and the IP+TCP options length. + */ + m = m_pullup(*m_head, sizeof(struct ether_header) + sizeof(struct ip)); + if (m == NULL) { + *m_head = NULL; + return (NULL); + } + eh = mtod(m, struct ether_header *); + etype = ntohs(eh->ether_type); + + /* Check for supported TSO Ethernet types (only IPv4 for now) */ + switch (etype) { + case ETHERTYPE_IP: + ip = (struct ip *)(m->m_data + sizeof(struct ether_header)); + /* TSO only supported for TCP protocol. */ + if (ip->ip_p != IPPROTO_TCP) { + BCE_PRINTF("%s(%d): TSO enabled for non-TCP frame!.\n", + __FILE__, __LINE__); + m_freem(*m_head); + *m_head = NULL; + return (NULL); + } + + /* Get IP header length in bytes (min 20) */ + ip_hlen = ip->ip_hl << 2; + m = m_pullup(*m_head, sizeof(struct ether_header) + ip_hlen + + sizeof(struct tcphdr)); + if (m == NULL) { + *m_head = NULL; + return (NULL); + } + + /* Get the TCP header length in bytes (min 20) */ + th = (struct tcphdr *)((caddr_t)ip + ip_hlen); + tcp_hlen = (th->th_off << 2); + + /* Make sure all IP/TCP options live in the same buffer. */ + m = m_pullup(*m_head, sizeof(struct ether_header)+ ip_hlen + + tcp_hlen); + if (m == NULL) { + *m_head = NULL; + return (NULL); + } + + /* IP header length and checksum will be calc'd by hardware */ + ip_len = ip->ip_len; + ip->ip_len = 0; + ip->ip_sum = 0; + break; + case ETHERTYPE_IPV6: + BCE_PRINTF("%s(%d): TSO over IPv6 not supported!.\n", + __FILE__, __LINE__); + m_freem(*m_head); + *m_head = NULL; + return (NULL); + /* NOT REACHED */ + default: + BCE_PRINTF("%s(%d): TSO enabled for unsupported protocol!.\n", + __FILE__, __LINE__); + m_freem(*m_head); + *m_head = NULL; + return (NULL); + } + + hdr_len = sizeof(struct ether_header) + ip_hlen + tcp_hlen; + + DBPRINT(sc, BCE_EXTREME_SEND, "%s(): hdr_len = %d, e_hlen = %d, " + "ip_hlen = %d, tcp_hlen = %d, ip_len = %d\n", + __FUNCTION__, hdr_len, sizeof(struct ether_header), ip_hlen, + tcp_hlen, ip_len); + + /* Set the LSO flag in the TX BD */ + *flags |= TX_BD_FLAGS_SW_LSO; + /* Set the length of IP + TCP options (in 32 bit words) */ + *flags |= (((ip_hlen + tcp_hlen - sizeof(struct ip) - + sizeof(struct tcphdr)) >> 2) << 8); + return (*m_head); +} + + /****************************************************************************/ /* Encapsultes an mbuf cluster into the tx_bd chain structure and makes the */ /* memory visible to the controller. */ @@ -6471,12 +6707,8 @@ bce_tx_encap(struct bce_softc *sc, struct mbuf **m_head) bus_dmamap_t map; struct tx_bd *txbd = NULL; struct mbuf *m0; - struct ether_vlan_header *eh; - struct ip *ip; - struct tcphdr *th; - u16 prod, chain_prod, etype, mss = 0, vlan_tag = 0, flags = 0; + u16 prod, chain_prod, mss = 0, vlan_tag = 0, flags = 0; u32 prod_bseq; - int hdr_len = 0, e_hlen = 0, ip_hlen = 0, tcp_hlen = 0, ip_len = 0; #ifdef BCE_DEBUG u16 debug_prod; @@ -6493,72 +6725,16 @@ bce_tx_encap(struct bce_softc *sc, struct mbuf **m_head) /* Transfer any checksum offload flags to the bd. */ m0 = *m_head; if (m0->m_pkthdr.csum_flags) { - if (m0->m_pkthdr.csum_flags & CSUM_IP) - flags |= TX_BD_FLAGS_IP_CKSUM; - if (m0->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)) - flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; if (m0->m_pkthdr.csum_flags & CSUM_TSO) { - /* For TSO the controller needs two pieces of info, */ - /* the MSS and the IP+TCP options length. */ + m0 = bce_tso_setup(sc, m_head, &flags); + if (m0 == NULL) + goto bce_tx_encap_exit; mss = htole16(m0->m_pkthdr.tso_segsz); - - /* Map the header and find the Ethernet type & header length */ - eh = mtod(m0, struct ether_vlan_header *); - if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { - etype = ntohs(eh->evl_proto); - e_hlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; - } else { - etype = ntohs(eh->evl_encap_proto); - e_hlen = ETHER_HDR_LEN; - } - - /* Check for supported TSO Ethernet types (only IPv4 for now) */ - switch (etype) { - case ETHERTYPE_IP: - ip = (struct ip *)(m0->m_data + e_hlen); - - /* TSO only supported for TCP protocol */ - if (ip->ip_p != IPPROTO_TCP) { - BCE_PRINTF("%s(%d): TSO enabled for non-TCP frame!.\n", - __FILE__, __LINE__); - goto bce_tx_encap_skip_tso; - } - - /* Get IP header length in bytes (min 20) */ - ip_hlen = ip->ip_hl << 2; - - /* Get the TCP header length in bytes (min 20) */ - th = (struct tcphdr *)((caddr_t)ip + ip_hlen); - tcp_hlen = (th->th_off << 2); - - /* IP header length and checksum will be calc'd by hardware */ - ip_len = ip->ip_len; - ip->ip_len = 0; - ip->ip_sum = 0; - break; - case ETHERTYPE_IPV6: - BCE_PRINTF("%s(%d): TSO over IPv6 not supported!.\n", - __FILE__, __LINE__); - goto bce_tx_encap_skip_tso; - default: - BCE_PRINTF("%s(%d): TSO enabled for unsupported protocol!.\n", - __FILE__, __LINE__); - goto bce_tx_encap_skip_tso; - } - - hdr_len = e_hlen + ip_hlen + tcp_hlen; - - DBPRINT(sc, BCE_EXTREME_SEND, - "%s(): hdr_len = %d, e_hlen = %d, ip_hlen = %d, tcp_hlen = %d, ip_len = %d\n", - __FUNCTION__, hdr_len, e_hlen, ip_hlen, tcp_hlen, ip_len); - - /* Set the LSO flag in the TX BD */ - flags |= TX_BD_FLAGS_SW_LSO; - /* Set the length of IP + TCP options (in 32 bit words) */ - flags |= (((ip_hlen + tcp_hlen - 40) >> 2) << 8); - -bce_tx_encap_skip_tso: - DBRUN(sc->requested_tso_frames++); + } else { + if (m0->m_pkthdr.csum_flags & CSUM_IP) + flags |= TX_BD_FLAGS_IP_CKSUM; + if (m0->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)) + flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; } } @@ -6583,7 +6759,7 @@ bce_tx_encap_skip_tso: sc->fragmented_mbuf_count++; /* Try to defrag the mbuf. */ - m0 = m_defrag(*m_head, M_DONTWAIT); + m0 = m_collapse(*m_head, M_DONTWAIT, BCE_MAX_SEGMENTS); if (m0 == NULL) { /* Defrag was unsuccessful */ m_freem(*m_head); @@ -6859,7 +7035,7 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) struct bce_softc *sc = ifp->if_softc; struct ifreq *ifr = (struct ifreq *) data; struct mii_data *mii; - int mask, error = 0; + int mask, error = 0, reinit; DBENTER(BCE_VERBOSE_MISC); @@ -6880,8 +7056,17 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) BCE_LOCK(sc); ifp->if_mtu = ifr->ifr_mtu; - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; -#ifdef ZERO_COPY_SOCKETS + reinit = 0; + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + /* + * Because allocation size is used in RX + * buffer allocation, stop controller if + * it is already running. + */ + bce_stop(sc); + reinit = 1; + } +#ifdef BCE_JUMBO_HDRSPLIT /* No buffer allocation size changes are necessary. */ #else /* Recalculate our buffer allocation sizes. */ @@ -6898,7 +7083,8 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) } #endif - bce_init_locked(sc); + if (reinit != 0) + bce_init_locked(sc); BCE_UNLOCK(sc); break; @@ -6932,7 +7118,6 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) } BCE_UNLOCK(sc); - error = 0; break; @@ -6942,10 +7127,8 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) DBPRINT(sc, BCE_VERBOSE_MISC, "Received SIOCADDMULTI/SIOCDELMULTI\n"); BCE_LOCK(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) bce_set_rx_mode(sc); - error = 0; - } BCE_UNLOCK(sc); break; @@ -6965,50 +7148,53 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) mask = ifr->ifr_reqcap ^ ifp->if_capenable; DBPRINT(sc, BCE_INFO_MISC, "Received SIOCSIFCAP = 0x%08X\n", (u32) mask); - /* Toggle the TX checksum capabilites enable flag. */ - if (mask & IFCAP_TXCSUM) { + /* Toggle the TX checksum capabilities enable flag. */ + if (mask & IFCAP_TXCSUM && + ifp->if_capabilities & IFCAP_TXCSUM) { ifp->if_capenable ^= IFCAP_TXCSUM; if (IFCAP_TXCSUM & ifp->if_capenable) - ifp->if_hwassist = BCE_IF_HWASSIST; + ifp->if_hwassist |= BCE_IF_HWASSIST; else - ifp->if_hwassist = 0; + ifp->if_hwassist &= ~BCE_IF_HWASSIST; } /* Toggle the RX checksum capabilities enable flag. */ - if (mask & IFCAP_RXCSUM) { + if (mask & IFCAP_RXCSUM && + ifp->if_capabilities & IFCAP_RXCSUM) ifp->if_capenable ^= IFCAP_RXCSUM; - if (IFCAP_RXCSUM & ifp->if_capenable) - ifp->if_hwassist = BCE_IF_HWASSIST; - else - ifp->if_hwassist = 0; - } /* Toggle the TSO capabilities enable flag. */ - if (bce_tso_enable && (mask & IFCAP_TSO4)) { + if (bce_tso_enable && (mask & IFCAP_TSO4) && + ifp->if_capabilities & IFCAP_TSO4) { ifp->if_capenable ^= IFCAP_TSO4; - if (IFCAP_RXCSUM & ifp->if_capenable) - ifp->if_hwassist = BCE_IF_HWASSIST; + if (IFCAP_TSO4 & ifp->if_capenable) + ifp->if_hwassist |= CSUM_TSO; else - ifp->if_hwassist = 0; + ifp->if_hwassist &= ~CSUM_TSO; } - /* Toggle VLAN_MTU capabilities enable flag. */ - if (mask & IFCAP_VLAN_MTU) { - BCE_PRINTF("%s(%d): Changing VLAN_MTU not supported.\n", - __FILE__, __LINE__); - } + if (mask & IFCAP_VLAN_HWCSUM && + ifp->if_capabilities & IFCAP_VLAN_HWCSUM) + ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; - /* Toggle VLANHWTAG capabilities enabled flag. */ - if (mask & IFCAP_VLAN_HWTAGGING) { - if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) - BCE_PRINTF("%s(%d): Cannot change VLAN_HWTAGGING while " - "management firmware (ASF/IPMI/UMP) is running!\n", - __FILE__, __LINE__); - else - BCE_PRINTF("%s(%d): Changing VLAN_HWTAGGING not supported!\n", - __FILE__, __LINE__); + if ((mask & IFCAP_VLAN_HWTSO) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) + ifp->if_capenable ^= IFCAP_VLAN_HWTSO; + /* + * Don't actually disable VLAN tag stripping as + * management firmware (ASF/IPMI/UMP) requires the + * feature. If VLAN tag stripping is disabled driver + * will manually reconstruct the VLAN frame by + * appending stripped VLAN tag. + */ + if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING)) { + ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) + == 0) + ifp->if_capenable &= ~IFCAP_VLAN_HWTSO; } - + VLAN_CAPABILITIES(ifp); break; default: /* We don't know how to handle the IOCTL, pass it on. */ @@ -7584,7 +7770,7 @@ bce_tick(void *xsc) bce_stats_update(sc); /* Top off the receive and page chains. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT bce_fill_pg_chain(sc); #endif bce_fill_rx_chain(sc); @@ -7764,7 +7950,7 @@ bce_sysctl_dump_tx_chain(SYSCTL_HANDLER_ARGS) } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /****************************************************************************/ /* Provides a sysctl interface to allow dumping the page chain. */ /* */ @@ -8392,7 +8578,7 @@ bce_add_sysctls(struct bce_softc *sc) (void *)sc, 0, bce_sysctl_dump_tx_chain, "I", "Dump tx_bd chain"); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "dump_pg_chain", CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, @@ -8687,7 +8873,7 @@ bce_dump_rx_mbuf_chain(struct bce_softc *sc, u16 chain_prod, int count) } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /****************************************************************************/ /* Prints out the mbufs in the mbuf page chain. */ /* */ @@ -8811,7 +8997,7 @@ bce_dump_rxbd(struct bce_softc *sc, int idx, struct rx_bd *rxbd) } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /****************************************************************************/ /* Prints out a rx_bd structure in the page chain. */ /* */ @@ -9298,7 +9484,7 @@ bce_dump_rx_chain(struct bce_softc *sc, u16 rx_prod, int count) } -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /****************************************************************************/ /* Prints out the page chain. */ /* */ @@ -9779,7 +9965,7 @@ bce_dump_driver_state(struct bce_softc *sc) "0x%08X:%08X - (sc->rx_bd_chain) rx_bd chain virtual address\n", val_hi, val_lo); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT val_hi = BCE_ADDR_HI(sc->pg_bd_chain); val_lo = BCE_ADDR_LO(sc->pg_bd_chain); BCE_PRINTF( @@ -9799,7 +9985,7 @@ bce_dump_driver_state(struct bce_softc *sc) "0x%08X:%08X - (sc->rx_mbuf_ptr) rx mbuf chain virtual address\n", val_hi, val_lo); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT val_hi = BCE_ADDR_HI(sc->pg_mbuf_ptr); val_lo = BCE_ADDR_LO(sc->pg_mbuf_ptr); BCE_PRINTF( @@ -9852,7 +10038,7 @@ bce_dump_driver_state(struct bce_softc *sc) BCE_PRINTF(" 0x%08X - (sc->free_rx_bd) free rx_bd's\n", sc->free_rx_bd); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT BCE_PRINTF(" 0x%04X(0x%04X) - (sc->pg_prod) page producer index\n", sc->pg_prod, (u16) PG_CHAIN_IDX(sc->pg_prod)); @@ -10038,9 +10224,9 @@ bce_dump_bc_state(struct bce_softc *sc) BCE_PRINTF("0x%08X - (0x%06X) state\n", val, BCE_BC_STATE); - val = bce_shmem_rd(sc, BCE_BC_CONDITION); + val = bce_shmem_rd(sc, BCE_BC_STATE_CONDITION); BCE_PRINTF("0x%08X - (0x%06X) condition\n", - val, BCE_BC_CONDITION); + val, BCE_BC_STATE_CONDITION); val = bce_shmem_rd(sc, BCE_BC_STATE_DEBUG_CMD); BCE_PRINTF("0x%08X - (0x%06X) debug_cmd\n", @@ -10358,7 +10544,7 @@ bce_breakpoint(struct bce_softc *sc) bce_dump_tpat_state(sc, 0); bce_dump_cp_state(sc, 0); bce_dump_com_state(sc, 0); -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT bce_dump_pgbd(sc, 0, NULL); bce_dump_pg_mbuf_chain(sc, 0, USABLE_PG_BD); bce_dump_pg_chain(sc, 0, USABLE_PG_BD); diff --git a/sys/dev/bce/if_bcereg.h b/sys/dev/bce/if_bcereg.h index cd75f0c7cd7a..a437686478e6 100644 --- a/sys/dev/bce/if_bcereg.h +++ b/sys/dev/bce/if_bcereg.h @@ -3715,6 +3715,10 @@ struct l2_fhdr { #define BCE_RPM_CONFIG_SORT_VECT_VAL (0xfL<<4) #define BCE_RPM_CONFIG_IGNORE_VLAN (1L<<31) +#define BCE_RPM_MGMT_PKT_CTRL 0x0000180c +#define BCE_RPM_MGMT_PKT_CTRL_MGMT_DISCARD_EN (1L<<30) +#define BCE_RPM_MGMT_PKT_CTRL_MGMT_EN (1L<<31) + #define BCE_RPM_VLAN_MATCH0 0x00001810 #define BCE_RPM_VLAN_MATCH0_RPM_VLAN_MTCH0_VALUE (0xfffL<<0) @@ -6216,7 +6220,7 @@ struct l2_fhdr { #define RX_PAGE(x) (((x) & ~USABLE_RX_BD_PER_PAGE) >> (BCM_PAGE_BITS - 4)) #define RX_IDX(x) ((x) & USABLE_RX_BD_PER_PAGE) -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* * To accomodate jumbo frames, the page chain should * be 4 times larger than the receive chain. @@ -6238,7 +6242,7 @@ struct l2_fhdr { #define PG_PAGE(x) (((x) & ~USABLE_PG_BD_PER_PAGE) >> (BCM_PAGE_BITS - 4)) #define PG_IDX(x) ((x) & USABLE_PG_BD_PER_PAGE) -#endif /* ZERO_COPY_SOCKETS */ +#endif /* BCE_JUMBO_HDRSPLIT */ #define CTX_INIT_RETRY_COUNT 10 @@ -6517,7 +6521,7 @@ struct bce_softc u16 tx_cons; u32 tx_prod_bseq; /* Counts the bytes used. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT u16 pg_prod; u16 pg_cons; #endif @@ -6534,7 +6538,7 @@ struct bce_softc int rx_bd_mbuf_data_len; int rx_bd_mbuf_align_pad; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT int pg_bd_mbuf_alloc_size; #endif @@ -6556,7 +6560,7 @@ struct bce_softc struct rx_bd *rx_bd_chain[RX_PAGES]; bus_addr_t rx_bd_chain_paddr[RX_PAGES]; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* H/W maintained page buffer descriptor chain structure. */ bus_dma_tag_t pg_bd_chain_tag; bus_dmamap_t pg_bd_chain_map[PG_PAGES]; @@ -6593,7 +6597,7 @@ struct bce_softc bus_dma_tag_t rx_mbuf_tag; bus_dma_tag_t tx_mbuf_tag; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT bus_dma_tag_t pg_mbuf_tag; #endif @@ -6605,7 +6609,7 @@ struct bce_softc bus_dmamap_t rx_mbuf_map[TOTAL_RX_BD]; struct mbuf *rx_mbuf_ptr[TOTAL_RX_BD]; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT /* S/W maintained mbuf page chain structure. */ bus_dmamap_t pg_mbuf_map[TOTAL_PG_BD]; struct mbuf *pg_mbuf_ptr[TOTAL_PG_BD]; @@ -6617,7 +6621,7 @@ struct bce_softc u16 used_tx_bd; u16 max_tx_bd; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT u16 free_pg_bd; u16 max_pg_bd; #endif @@ -6705,7 +6709,7 @@ struct bce_softc int debug_tx_mbuf_alloc; int debug_rx_mbuf_alloc; -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT int debug_pg_mbuf_alloc; #endif @@ -6722,7 +6726,7 @@ struct bce_softc u32 rx_low_watermark; /* Lowest number of rx_bd's free. */ u32 rx_empty_count; /* Number of times the RX chain was empty. */ -#ifdef ZERO_COPY_SOCKETS +#ifdef BCE_JUMBO_HDRSPLIT u32 pg_low_watermark; /* Lowest number of pages free. */ u32 pg_empty_count; /* Number of times the page chain was empty. */ #endif diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c index db65ec2caada..9c478352c156 100644 --- a/sys/dev/bge/if_bge.c +++ b/sys/dev/bge/if_bge.c @@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -95,6 +96,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -170,6 +172,7 @@ static const struct bge_type { { BCOM_VENDORID, BCOM_DEVICEID_BCM5720 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5721 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5722 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5723 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5750 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5750M }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5751 }, @@ -184,12 +187,22 @@ static const struct bge_type { { BCOM_VENDORID, BCOM_DEVICEID_BCM5754M }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5755 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5755M }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5756 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5761 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5761E }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5761S }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5761SE }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5764 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5780 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5780S }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5781 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5782 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5784 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5785F }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5785G }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5786 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5787 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM5787F }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5787M }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5788 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5789 }, @@ -198,11 +211,19 @@ static const struct bge_type { { BCOM_VENDORID, BCOM_DEVICEID_BCM5903M }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5906 }, { BCOM_VENDORID, BCOM_DEVICEID_BCM5906M }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM57760 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM57780 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM57788 }, + { BCOM_VENDORID, BCOM_DEVICEID_BCM57790 }, { SK_VENDORID, SK_DEVICEID_ALTIMA }, { TC_VENDORID, TC_DEVICEID_3C996 }, + { FJTSU_VENDORID, FJTSU_DEVICEID_PW008GE4 }, + { FJTSU_VENDORID, FJTSU_DEVICEID_PW008GE5 }, + { FJTSU_VENDORID, FJTSU_DEVICEID_PP250450 }, + { 0, 0 } }; @@ -216,10 +237,11 @@ static const struct bge_vendor { { BCOM_VENDORID, "Broadcom" }, { SK_VENDORID, "SysKonnect" }, { TC_VENDORID, "3Com" }, + { FJTSU_VENDORID, "Fujitsu" }, { 0, NULL } }; - + static const struct bge_revision { uint32_t br_chipid; const char *br_name; @@ -271,12 +293,18 @@ static const struct bge_revision { { BGE_CHIPID_BCM5755_A1, "BCM5755 A1" }, { BGE_CHIPID_BCM5755_A2, "BCM5755 A2" }, { BGE_CHIPID_BCM5722_A0, "BCM5722 A0" }, + { BGE_CHIPID_BCM5761_A0, "BCM5761 A0" }, + { BGE_CHIPID_BCM5761_A1, "BCM5761 A1" }, + { BGE_CHIPID_BCM5784_A0, "BCM5784 A0" }, + { BGE_CHIPID_BCM5784_A1, "BCM5784 A1" }, /* 5754 and 5787 share the same ASIC ID */ - { BGE_CHIPID_BCM5787_A0, "BCM5754/5787 A0" }, + { BGE_CHIPID_BCM5787_A0, "BCM5754/5787 A0" }, { BGE_CHIPID_BCM5787_A1, "BCM5754/5787 A1" }, { BGE_CHIPID_BCM5787_A2, "BCM5754/5787 A2" }, { BGE_CHIPID_BCM5906_A1, "BCM5906 A1" }, { BGE_CHIPID_BCM5906_A2, "BCM5906 A2" }, + { BGE_CHIPID_BCM57780_A0, "BCM57780 A0" }, + { BGE_CHIPID_BCM57780_A1, "BCM57780 A1" }, { 0, NULL } }; @@ -297,9 +325,13 @@ static const struct bge_revision bge_majorrevs[] = { { BGE_ASICREV_BCM5780, "unknown BCM5780" }, { BGE_ASICREV_BCM5714, "unknown BCM5714" }, { BGE_ASICREV_BCM5755, "unknown BCM5755" }, + { BGE_ASICREV_BCM5761, "unknown BCM5761" }, + { BGE_ASICREV_BCM5784, "unknown BCM5784" }, + { BGE_ASICREV_BCM5785, "unknown BCM5785" }, /* 5754 and 5787 share the same ASIC ID */ { BGE_ASICREV_BCM5787, "unknown BCM5754/5787" }, { BGE_ASICREV_BCM5906, "unknown BCM5906" }, + { BGE_ASICREV_BCM57780, "unknown BCM57780" }, { 0, NULL } }; @@ -309,6 +341,7 @@ static const struct bge_revision bge_majorrevs[] = { #define BGE_IS_5705_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_5705_PLUS) #define BGE_IS_5714_FAMILY(sc) ((sc)->bge_flags & BGE_FLAG_5714_FAMILY) #define BGE_IS_575X_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_575X_PLUS) +#define BGE_IS_5755_PLUS(sc) ((sc)->bge_flags & BGE_FLAG_5755_PLUS) const struct bge_revision * bge_lookup_rev(uint32_t); const struct bge_vendor * bge_lookup_vendor(uint16_t); @@ -331,16 +364,20 @@ static int bge_get_eaddr_nvram(struct bge_softc *, uint8_t[]); static int bge_get_eaddr_eeprom(struct bge_softc *, uint8_t[]); static int bge_get_eaddr(struct bge_softc *, uint8_t[]); -static void bge_txeof(struct bge_softc *); -static int bge_rxeof(struct bge_softc *); +static void bge_txeof(struct bge_softc *, uint16_t); +static int bge_rxeof(struct bge_softc *, uint16_t, int); static void bge_asf_driver_up (struct bge_softc *); static void bge_tick(void *); static void bge_stats_update(struct bge_softc *); static void bge_stats_update_regs(struct bge_softc *); +static struct mbuf *bge_setup_tso(struct bge_softc *, struct mbuf *, + uint16_t *); static int bge_encap(struct bge_softc *, struct mbuf **, uint32_t *); static void bge_intr(void *); +static int bge_msi_intr(void *); +static void bge_intr_task(void *, int); static void bge_start_locked(struct ifnet *); static void bge_start(struct ifnet *); static int bge_ioctl(struct ifnet *, u_long, caddr_t); @@ -363,8 +400,8 @@ static void bge_setpromisc(struct bge_softc *); static void bge_setmulti(struct bge_softc *); static void bge_setvlan(struct bge_softc *); -static int bge_newbuf_std(struct bge_softc *, int, struct mbuf *); -static int bge_newbuf_jumbo(struct bge_softc *, int, struct mbuf *); +static int bge_newbuf_std(struct bge_softc *, int); +static int bge_newbuf_jumbo(struct bge_softc *, int); static int bge_init_rx_ring_std(struct bge_softc *); static void bge_free_rx_ring_std(struct bge_softc *); static int bge_init_rx_ring_jumbo(struct bge_softc *); @@ -384,7 +421,7 @@ static uint32_t bge_readreg_ind(struct bge_softc *, int); #endif static void bge_writemem_direct(struct bge_softc *, int, int); static void bge_writereg_ind(struct bge_softc *, int, int); -static void bge_set_max_readrq(struct bge_softc *, int); +static void bge_set_max_readrq(struct bge_softc *); static int bge_miibus_readreg(device_t, int, int); static int bge_miibus_writereg(device_t, int, int, int); @@ -528,25 +565,23 @@ bge_writemem_ind(struct bge_softc *sc, int off, int val) * PCI Express only */ static void -bge_set_max_readrq(struct bge_softc *sc, int expr_ptr) +bge_set_max_readrq(struct bge_softc *sc) { device_t dev; uint16_t val; - KASSERT((sc->bge_flags & BGE_FLAG_PCIE) && expr_ptr != 0, - ("%s: not applicable", __func__)); - dev = sc->bge_dev; - val = pci_read_config(dev, expr_ptr + BGE_PCIE_DEVCTL, 2); - if ((val & BGE_PCIE_DEVCTL_MAX_READRQ_MASK) != + val = pci_read_config(dev, sc->bge_expcap + PCIR_EXPRESS_DEVICE_CTL, 2); + if ((val & PCIM_EXP_CTL_MAX_READ_REQUEST) != BGE_PCIE_DEVCTL_MAX_READRQ_4096) { if (bootverbose) device_printf(dev, "adjust device control 0x%04x ", val); - val &= ~BGE_PCIE_DEVCTL_MAX_READRQ_MASK; + val &= ~PCIM_EXP_CTL_MAX_READ_REQUEST; val |= BGE_PCIE_DEVCTL_MAX_READRQ_4096; - pci_write_config(dev, expr_ptr + BGE_PCIE_DEVCTL, val, 2); + pci_write_config(dev, sc->bge_expcap + PCIR_EXPRESS_DEVICE_CTL, + val, 2); if (bootverbose) printf("-> 0x%04x\n", val); } @@ -867,7 +902,8 @@ bge_miibus_statchg(device_t dev) mii = device_get_softc(sc->bge_miibus); BGE_CLRBIT(sc, BGE_MAC_MODE, BGE_MACMODE_PORTMODE); - if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) + if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T || + IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_SX) BGE_SETBIT(sc, BGE_MAC_MODE, BGE_PORTMODE_GMII); else BGE_SETBIT(sc, BGE_MAC_MODE, BGE_PORTMODE_MII); @@ -882,49 +918,46 @@ bge_miibus_statchg(device_t dev) * Intialize a standard receive ring descriptor. */ static int -bge_newbuf_std(struct bge_softc *sc, int i, struct mbuf *m) +bge_newbuf_std(struct bge_softc *sc, int i) { - struct mbuf *m_new = NULL; + struct mbuf *m; struct bge_rx_bd *r; - struct bge_dmamap_arg ctx; - int error; - - if (m == NULL) { - m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); - if (m_new == NULL) - return (ENOBUFS); - m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; - } else { - m_new = m; - m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; - m_new->m_data = m_new->m_ext.ext_buf; - } + bus_dma_segment_t segs[1]; + bus_dmamap_t map; + int error, nsegs; + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) + return (ENOBUFS); + m->m_len = m->m_pkthdr.len = MCLBYTES; if ((sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) == 0) - m_adj(m_new, ETHER_ALIGN); - sc->bge_cdata.bge_rx_std_chain[i] = m_new; - r = &sc->bge_ldata.bge_rx_std_ring[i]; - ctx.bge_maxsegs = 1; - ctx.sc = sc; - error = bus_dmamap_load(sc->bge_cdata.bge_mtag, - sc->bge_cdata.bge_rx_std_dmamap[i], mtod(m_new, void *), - m_new->m_len, bge_dma_map_addr, &ctx, BUS_DMA_NOWAIT); - if (error || ctx.bge_maxsegs == 0) { - if (m == NULL) { - sc->bge_cdata.bge_rx_std_chain[i] = NULL; - m_freem(m_new); - } - return (ENOMEM); + m_adj(m, ETHER_ALIGN); + + error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_rx_mtag, + sc->bge_cdata.bge_rx_std_sparemap, m, segs, &nsegs, 0); + if (error != 0) { + m_freem(m); + return (error); } - r->bge_addr.bge_addr_lo = BGE_ADDR_LO(ctx.bge_busaddr); - r->bge_addr.bge_addr_hi = BGE_ADDR_HI(ctx.bge_busaddr); + if (sc->bge_cdata.bge_rx_std_chain[i] != NULL) { + bus_dmamap_sync(sc->bge_cdata.bge_rx_mtag, + sc->bge_cdata.bge_rx_std_dmamap[i], BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->bge_cdata.bge_rx_mtag, + sc->bge_cdata.bge_rx_std_dmamap[i]); + } + map = sc->bge_cdata.bge_rx_std_dmamap[i]; + sc->bge_cdata.bge_rx_std_dmamap[i] = sc->bge_cdata.bge_rx_std_sparemap; + sc->bge_cdata.bge_rx_std_sparemap = map; + sc->bge_cdata.bge_rx_std_chain[i] = m; + r = &sc->bge_ldata.bge_rx_std_ring[sc->bge_std]; + r->bge_addr.bge_addr_lo = BGE_ADDR_LO(segs[0].ds_addr); + r->bge_addr.bge_addr_hi = BGE_ADDR_HI(segs[0].ds_addr); r->bge_flags = BGE_RXBDFLAG_END; - r->bge_len = m_new->m_len; + r->bge_len = segs[0].ds_len; r->bge_idx = i; - bus_dmamap_sync(sc->bge_cdata.bge_mtag, - sc->bge_cdata.bge_rx_std_dmamap[i], - BUS_DMASYNC_PREREAD); + bus_dmamap_sync(sc->bge_cdata.bge_rx_mtag, + sc->bge_cdata.bge_rx_std_dmamap[i], BUS_DMASYNC_PREREAD); return (0); } @@ -934,48 +967,49 @@ bge_newbuf_std(struct bge_softc *sc, int i, struct mbuf *m) * a jumbo buffer from the pool managed internally by the driver. */ static int -bge_newbuf_jumbo(struct bge_softc *sc, int i, struct mbuf *m) +bge_newbuf_jumbo(struct bge_softc *sc, int i) { bus_dma_segment_t segs[BGE_NSEG_JUMBO]; + bus_dmamap_t map; struct bge_extrx_bd *r; - struct mbuf *m_new = NULL; - int nsegs; - int error; + struct mbuf *m; + int error, nsegs; - if (m == NULL) { - MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) - return (ENOBUFS); + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) + return (ENOBUFS); - m_cljget(m_new, M_DONTWAIT, MJUM9BYTES); - if (!(m_new->m_flags & M_EXT)) { - m_freem(m_new); - return (ENOBUFS); - } - m_new->m_len = m_new->m_pkthdr.len = MJUM9BYTES; - } else { - m_new = m; - m_new->m_len = m_new->m_pkthdr.len = MJUM9BYTES; - m_new->m_data = m_new->m_ext.ext_buf; + m_cljget(m, M_DONTWAIT, MJUM9BYTES); + if (!(m->m_flags & M_EXT)) { + m_freem(m); + return (ENOBUFS); } - + m->m_len = m->m_pkthdr.len = MJUM9BYTES; if ((sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) == 0) - m_adj(m_new, ETHER_ALIGN); + m_adj(m, ETHER_ALIGN); error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_mtag_jumbo, - sc->bge_cdata.bge_rx_jumbo_dmamap[i], - m_new, segs, &nsegs, BUS_DMA_NOWAIT); - if (error) { - if (m == NULL) - m_freem(m_new); + sc->bge_cdata.bge_rx_jumbo_sparemap, m, segs, &nsegs, 0); + if (error != 0) { + m_freem(m); return (error); } - sc->bge_cdata.bge_rx_jumbo_chain[i] = m_new; + if (sc->bge_cdata.bge_rx_jumbo_chain[i] == NULL) { + bus_dmamap_sync(sc->bge_cdata.bge_mtag_jumbo, + sc->bge_cdata.bge_rx_jumbo_dmamap[i], BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->bge_cdata.bge_mtag_jumbo, + sc->bge_cdata.bge_rx_jumbo_dmamap[i]); + } + map = sc->bge_cdata.bge_rx_jumbo_dmamap[i]; + sc->bge_cdata.bge_rx_jumbo_dmamap[i] = + sc->bge_cdata.bge_rx_jumbo_sparemap; + sc->bge_cdata.bge_rx_jumbo_sparemap = map; + sc->bge_cdata.bge_rx_jumbo_chain[i] = m; /* * Fill in the extended RX buffer descriptor. */ - r = &sc->bge_ldata.bge_rx_jumbo_ring[i]; + r = &sc->bge_ldata.bge_rx_jumbo_ring[sc->bge_jumbo]; r->bge_flags = BGE_RXBDFLAG_JUMBO_RING | BGE_RXBDFLAG_END; r->bge_idx = i; r->bge_len3 = r->bge_len2 = r->bge_len1 = 0; @@ -1001,9 +1035,8 @@ bge_newbuf_jumbo(struct bge_softc *sc, int i, struct mbuf *m) panic("%s: %d segments\n", __func__, nsegs); } - bus_dmamap_sync(sc->bge_cdata.bge_mtag, - sc->bge_cdata.bge_rx_jumbo_dmamap[i], - BUS_DMASYNC_PREREAD); + bus_dmamap_sync(sc->bge_cdata.bge_mtag_jumbo, + sc->bge_cdata.bge_rx_jumbo_dmamap[i], BUS_DMASYNC_PREREAD); return (0); } @@ -1017,16 +1050,18 @@ bge_newbuf_jumbo(struct bge_softc *sc, int i, struct mbuf *m) static int bge_init_rx_ring_std(struct bge_softc *sc) { - int i; + int error, i; + bzero(sc->bge_ldata.bge_rx_std_ring, BGE_STD_RX_RING_SZ); + sc->bge_std = 0; for (i = 0; i < BGE_SSLOTS; i++) { - if (bge_newbuf_std(sc, i, NULL) == ENOBUFS) - return (ENOBUFS); + if ((error = bge_newbuf_std(sc, i)) != 0) + return (error); + BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); }; bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag, - sc->bge_cdata.bge_rx_std_ring_map, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_PREWRITE); sc->bge_std = i - 1; bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, sc->bge_std); @@ -1041,10 +1076,10 @@ bge_free_rx_ring_std(struct bge_softc *sc) for (i = 0; i < BGE_STD_RX_RING_CNT; i++) { if (sc->bge_cdata.bge_rx_std_chain[i] != NULL) { - bus_dmamap_sync(sc->bge_cdata.bge_mtag, + bus_dmamap_sync(sc->bge_cdata.bge_rx_mtag, sc->bge_cdata.bge_rx_std_dmamap[i], BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(sc->bge_cdata.bge_mtag, + bus_dmamap_unload(sc->bge_cdata.bge_rx_mtag, sc->bge_cdata.bge_rx_std_dmamap[i]); m_freem(sc->bge_cdata.bge_rx_std_chain[i]); sc->bge_cdata.bge_rx_std_chain[i] = NULL; @@ -1058,16 +1093,18 @@ static int bge_init_rx_ring_jumbo(struct bge_softc *sc) { struct bge_rcb *rcb; - int i; + int error, i; + bzero(sc->bge_ldata.bge_rx_jumbo_ring, BGE_JUMBO_RX_RING_SZ); + sc->bge_jumbo = 0; for (i = 0; i < BGE_JUMBO_RX_RING_CNT; i++) { - if (bge_newbuf_jumbo(sc, i, NULL) == ENOBUFS) - return (ENOBUFS); + if ((error = bge_newbuf_jumbo(sc, i)) != 0) + return (error); + BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); }; bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag, - sc->bge_cdata.bge_rx_jumbo_ring_map, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_PREWRITE); sc->bge_jumbo = i - 1; @@ -1111,10 +1148,10 @@ bge_free_tx_ring(struct bge_softc *sc) for (i = 0; i < BGE_TX_RING_CNT; i++) { if (sc->bge_cdata.bge_tx_chain[i] != NULL) { - bus_dmamap_sync(sc->bge_cdata.bge_mtag, + bus_dmamap_sync(sc->bge_cdata.bge_tx_mtag, sc->bge_cdata.bge_tx_dmamap[i], BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(sc->bge_cdata.bge_mtag, + bus_dmamap_unload(sc->bge_cdata.bge_tx_mtag, sc->bge_cdata.bge_tx_dmamap[i]); m_freem(sc->bge_cdata.bge_tx_chain[i]); sc->bge_cdata.bge_tx_chain[i] = NULL; @@ -1130,6 +1167,10 @@ bge_init_tx_ring(struct bge_softc *sc) sc->bge_txcnt = 0; sc->bge_tx_saved_considx = 0; + bzero(sc->bge_ldata.bge_tx_ring, BGE_TX_RING_SZ); + bus_dmamap_sync(sc->bge_cdata.bge_tx_ring_tag, + sc->bge_cdata.bge_tx_ring_map, BUS_DMASYNC_PREWRITE); + /* Initialize transmit producer index for host-memory send ring. */ sc->bge_tx_prodidx = 0; bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, sc->bge_tx_prodidx); @@ -1247,11 +1288,11 @@ bge_sig_post_reset(sc, type) if (sc->bge_asf_mode & ASF_NEW_HANDSHAKE) { switch (type) { case BGE_RESET_START: - bge_writemem_ind(sc, BGE_SDI_STATUS, 0x80000001); + bge_writemem_ind(sc, BGE_SDI_STATUS, 0x80000001); /* START DONE */ break; case BGE_RESET_STOP: - bge_writemem_ind(sc, BGE_SDI_STATUS, 0x80000002); + bge_writemem_ind(sc, BGE_SDI_STATUS, 0x80000002); break; } } @@ -1586,7 +1627,9 @@ bge_blockinit(struct bge_softc *sc) else val = BGE_STD_RX_RING_CNT / 8; CSR_WRITE_4(sc, BGE_RBDI_STD_REPL_THRESH, val); - CSR_WRITE_4(sc, BGE_RBDI_JUMBO_REPL_THRESH, BGE_JUMBO_RX_RING_CNT/8); + if (BGE_IS_JUMBO_CAPABLE(sc)) + CSR_WRITE_4(sc, BGE_RBDI_JUMBO_REPL_THRESH, + BGE_JUMBO_RX_RING_CNT/8); /* * Disable all unused send rings by setting the 'ring disabled' @@ -1628,8 +1671,10 @@ bge_blockinit(struct bge_softc *sc) /* Initialize RX ring indexes */ bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, 0); - bge_writembx(sc, BGE_MBX_RX_JUMBO_PROD_LO, 0); - bge_writembx(sc, BGE_MBX_RX_MINI_PROD_LO, 0); + if (BGE_IS_JUMBO_CAPABLE(sc)) + bge_writembx(sc, BGE_MBX_RX_JUMBO_PROD_LO, 0); + if (sc->bge_asicrev == BGE_ASICREV_BCM5700) + bge_writembx(sc, BGE_MBX_RX_MINI_PROD_LO, 0); /* * Set up RX return ring 0 @@ -1643,7 +1688,7 @@ bge_blockinit(struct bge_softc *sc) RCB_WRITE_4(sc, vrcb, bge_hostaddr.bge_addr_lo, taddr.bge_addr_lo); RCB_WRITE_4(sc, vrcb, bge_nicaddr, 0x00000000); RCB_WRITE_4(sc, vrcb, bge_maxlen_flags, - BGE_RCB_MAXLEN_FLAGS(sc->bge_return_ring_cnt, 0)); + BGE_RCB_MAXLEN_FLAGS(sc->bge_return_ring_cnt, 0)); /* Set random backoff seed for TX */ CSR_WRITE_4(sc, BGE_TX_RANDOM_BACKOFF, @@ -1718,8 +1763,15 @@ bge_blockinit(struct bge_softc *sc) sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx = 0; sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx = 0; + /* Set up status block size. */ + if (sc->bge_asicrev == BGE_ASICREV_BCM5700 && + sc->bge_chipid != BGE_CHIPID_BCM5700_C0) + val = BGE_STATBLKSZ_FULL; + else + val = BGE_STATBLKSZ_32BYTE; + /* Turn on host coalescing state machine */ - CSR_WRITE_4(sc, BGE_HCC_MODE, BGE_HCCMODE_ENABLE); + CSR_WRITE_4(sc, BGE_HCC_MODE, val | BGE_HCCMODE_ENABLE); /* Turn on RX BD completion state machine and enable attentions */ CSR_WRITE_4(sc, BGE_RBDC_MODE, @@ -1732,13 +1784,20 @@ bge_blockinit(struct bge_softc *sc) if (!(BGE_IS_5705_PLUS(sc))) CSR_WRITE_4(sc, BGE_RXLS_MODE, BGE_RXLSMODE_ENABLE); + val = BGE_MACMODE_TXDMA_ENB | BGE_MACMODE_RXDMA_ENB | + BGE_MACMODE_RX_STATS_CLEAR | BGE_MACMODE_TX_STATS_CLEAR | + BGE_MACMODE_RX_STATS_ENB | BGE_MACMODE_TX_STATS_ENB | + BGE_MACMODE_FRMHDR_DMA_ENB; + + if (sc->bge_flags & BGE_FLAG_TBI) + val |= BGE_PORTMODE_TBI; + else if (sc->bge_flags & BGE_FLAG_MII_SERDES) + val |= BGE_PORTMODE_GMII; + else + val |= BGE_PORTMODE_MII; + /* Turn on DMA, clear stats */ - CSR_WRITE_4(sc, BGE_MAC_MODE, BGE_MACMODE_TXDMA_ENB | - BGE_MACMODE_RXDMA_ENB | BGE_MACMODE_RX_STATS_CLEAR | - BGE_MACMODE_TX_STATS_CLEAR | BGE_MACMODE_RX_STATS_ENB | - BGE_MACMODE_TX_STATS_ENB | BGE_MACMODE_FRMHDR_DMA_ENB | - ((sc->bge_flags & BGE_FLAG_TBI) ? - BGE_PORTMODE_TBI : BGE_PORTMODE_MII)); + CSR_WRITE_4(sc, BGE_MAC_MODE, val); /* Set misc. local control, enable interrupts on attentions */ CSR_WRITE_4(sc, BGE_MISC_LOCAL_CTL, BGE_MLC_INTR_ONATTN); @@ -1758,9 +1817,8 @@ bge_blockinit(struct bge_softc *sc) val = BGE_WDMAMODE_ENABLE | BGE_WDMAMODE_ALL_ATTNS; /* Enable host coalescing bug fix. */ - if (sc->bge_asicrev == BGE_ASICREV_BCM5755 || - sc->bge_asicrev == BGE_ASICREV_BCM5787) - val |= 1 << 29; + if (BGE_IS_5755_PLUS(sc)) + val |= BGE_WDMAMODE_STATUS_TAG_FIX; /* Turn on write DMA state machine */ CSR_WRITE_4(sc, BGE_WDMA_MODE, val); @@ -1768,8 +1826,16 @@ bge_blockinit(struct bge_softc *sc) /* Turn on read DMA state machine */ val = BGE_RDMAMODE_ENABLE | BGE_RDMAMODE_ALL_ATTNS; + if (sc->bge_asicrev == BGE_ASICREV_BCM5784 || + sc->bge_asicrev == BGE_ASICREV_BCM5785 || + sc->bge_asicrev == BGE_ASICREV_BCM57780) + val |= BGE_RDMAMODE_BD_SBD_CRPT_ATTN | + BGE_RDMAMODE_MBUF_RBD_CRPT_ATTN | + BGE_RDMAMODE_MBUF_SBD_CRPT_ATTN; if (sc->bge_flags & BGE_FLAG_PCIE) val |= BGE_RDMAMODE_FIFO_LONG_BURST; + if (sc->bge_flags & BGE_FLAG_TSO) + val |= BGE_RDMAMODE_TSO4_ENABLE; CSR_WRITE_4(sc, BGE_RDMA_MODE, val); DELAY(40); @@ -1790,10 +1856,16 @@ bge_blockinit(struct bge_softc *sc) CSR_WRITE_4(sc, BGE_SBDC_MODE, BGE_SBDCMODE_ENABLE); /* Turn on send data completion state machine */ - CSR_WRITE_4(sc, BGE_SDC_MODE, BGE_SDCMODE_ENABLE); + val = BGE_SDCMODE_ENABLE; + if (sc->bge_asicrev == BGE_ASICREV_BCM5761) + val |= BGE_SDCMODE_CDELAY; + CSR_WRITE_4(sc, BGE_SDC_MODE, val); /* Turn on send data initiator state machine */ - CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE); + if (sc->bge_flags & BGE_FLAG_TSO) + CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE | 0x08); + else + CSR_WRITE_4(sc, BGE_SDI_MODE, BGE_SDIMODE_ENABLE); /* Turn on send BD initiator state machine */ CSR_WRITE_4(sc, BGE_SBDI_MODE, BGE_SBDIMODE_ENABLE); @@ -1865,7 +1937,7 @@ bge_lookup_vendor(uint16_t vid) for (v = bge_vendors; v->v_name != NULL; v++) if (v->v_id == vid) return (v); - + panic("%s: unknown vendor %d", __func__, vid); return (NULL); } @@ -1897,8 +1969,11 @@ bge_probe(device_t dev) const struct bge_vendor *v; uint32_t id; - id = pci_read_config(dev, BGE_PCI_MISC_CTL, 4) & - BGE_PCIMISCCTL_ASICREV; + id = pci_read_config(dev, BGE_PCI_MISC_CTL, 4) >> + BGE_PCIMISCCTL_ASICREV_SHIFT; + if (BGE_ASICREV(id) == BGE_ASICREV_USE_PRODID_REG) + id = pci_read_config(dev, + BGE_PCI_PRODID_ASICREV, 4); br = bge_lookup_rev(id); v = bge_lookup_vendor(vid); { @@ -1915,13 +1990,9 @@ bge_probe(device_t dev) br != NULL ? br->br_name : "NetXtreme Ethernet Controller"); } - snprintf(buf, 96, "%s, %sASIC rev. %#04x", model, - br != NULL ? "" : "unknown ", id >> 16); + snprintf(buf, 96, "%s, %sASIC rev. %#08x", model, + br != NULL ? "" : "unknown ", id); device_set_desc_copy(dev, buf); - if (pci_get_subvendor(dev) == DELL_VENDORID) - sc->bge_flags |= BGE_FLAG_NO_3LED; - if (did == BCOM_DEVICEID_BCM5755M) - sc->bge_flags |= BGE_FLAG_ADJUST_TRIM; return (0); } t++; @@ -1938,9 +2009,12 @@ bge_dma_free(struct bge_softc *sc) /* Destroy DMA maps for RX buffers. */ for (i = 0; i < BGE_STD_RX_RING_CNT; i++) { if (sc->bge_cdata.bge_rx_std_dmamap[i]) - bus_dmamap_destroy(sc->bge_cdata.bge_mtag, + bus_dmamap_destroy(sc->bge_cdata.bge_rx_mtag, sc->bge_cdata.bge_rx_std_dmamap[i]); } + if (sc->bge_cdata.bge_rx_std_sparemap) + bus_dmamap_destroy(sc->bge_cdata.bge_rx_mtag, + sc->bge_cdata.bge_rx_std_sparemap); /* Destroy DMA maps for jumbo RX buffers. */ for (i = 0; i < BGE_JUMBO_RX_RING_CNT; i++) { @@ -1948,16 +2022,21 @@ bge_dma_free(struct bge_softc *sc) bus_dmamap_destroy(sc->bge_cdata.bge_mtag_jumbo, sc->bge_cdata.bge_rx_jumbo_dmamap[i]); } + if (sc->bge_cdata.bge_rx_jumbo_sparemap) + bus_dmamap_destroy(sc->bge_cdata.bge_mtag_jumbo, + sc->bge_cdata.bge_rx_jumbo_sparemap); /* Destroy DMA maps for TX buffers. */ for (i = 0; i < BGE_TX_RING_CNT; i++) { if (sc->bge_cdata.bge_tx_dmamap[i]) - bus_dmamap_destroy(sc->bge_cdata.bge_mtag, + bus_dmamap_destroy(sc->bge_cdata.bge_tx_mtag, sc->bge_cdata.bge_tx_dmamap[i]); } - if (sc->bge_cdata.bge_mtag) - bus_dma_tag_destroy(sc->bge_cdata.bge_mtag); + if (sc->bge_cdata.bge_rx_mtag) + bus_dma_tag_destroy(sc->bge_cdata.bge_rx_mtag); + if (sc->bge_cdata.bge_tx_mtag) + bus_dma_tag_destroy(sc->bge_cdata.bge_tx_mtag); /* Destroy standard RX ring. */ @@ -2049,15 +2128,22 @@ bge_dma_alloc(device_t dev) { struct bge_dmamap_arg ctx; struct bge_softc *sc; + bus_addr_t lowaddr; + bus_size_t sbsz, txsegsz, txmaxsegsz; int i, error; sc = device_get_softc(dev); + lowaddr = BUS_SPACE_MAXADDR; + if ((sc->bge_flags & BGE_FLAG_40BIT_BUG) != 0) + lowaddr = BGE_DMA_MAXADDR; + if ((sc->bge_flags & BGE_FLAG_4G_BNDRY_BUG) != 0) + lowaddr = BUS_SPACE_MAXADDR_32BIT; /* * Allocate the parent bus DMA tag appropriate for PCI. */ error = bus_dma_tag_create(bus_get_dma_tag(sc->bge_dev), - 1, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, + 1, 0, lowaddr, BUS_SPACE_MAXADDR, NULL, NULL, BUS_SPACE_MAXSIZE_32BIT, 0, BUS_SPACE_MAXSIZE_32BIT, 0, NULL, NULL, &sc->bge_cdata.bge_parent_tag); @@ -2068,21 +2154,47 @@ bge_dma_alloc(device_t dev) } /* - * Create tag for mbufs. + * Create tag for Tx mbufs. */ + if (sc->bge_flags & BGE_FLAG_TSO) { + txsegsz = BGE_TSOSEG_SZ; + txmaxsegsz = 65535 + sizeof(struct ether_vlan_header); + } else { + txsegsz = MCLBYTES; + txmaxsegsz = MCLBYTES * BGE_NSEG_NEW; + } error = bus_dma_tag_create(sc->bge_cdata.bge_parent_tag, 1, - 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, - NULL, MCLBYTES * BGE_NSEG_NEW, BGE_NSEG_NEW, MCLBYTES, - BUS_DMA_ALLOCNOW, NULL, NULL, &sc->bge_cdata.bge_mtag); + 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, + txmaxsegsz, BGE_NSEG_NEW, txsegsz, 0, NULL, NULL, + &sc->bge_cdata.bge_tx_mtag); if (error) { - device_printf(sc->bge_dev, "could not allocate dma tag\n"); + device_printf(sc->bge_dev, "could not allocate TX dma tag\n"); + return (ENOMEM); + } + + /* + * Create tag for Rx mbufs. + */ + error = bus_dma_tag_create(sc->bge_cdata.bge_parent_tag, 1, 0, + BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, 1, + MCLBYTES, 0, NULL, NULL, &sc->bge_cdata.bge_rx_mtag); + + if (error) { + device_printf(sc->bge_dev, "could not allocate RX dma tag\n"); return (ENOMEM); } /* Create DMA maps for RX buffers. */ + error = bus_dmamap_create(sc->bge_cdata.bge_rx_mtag, 0, + &sc->bge_cdata.bge_rx_std_sparemap); + if (error) { + device_printf(sc->bge_dev, + "can't create spare DMA map for RX\n"); + return (ENOMEM); + } for (i = 0; i < BGE_STD_RX_RING_CNT; i++) { - error = bus_dmamap_create(sc->bge_cdata.bge_mtag, 0, + error = bus_dmamap_create(sc->bge_cdata.bge_rx_mtag, 0, &sc->bge_cdata.bge_rx_std_dmamap[i]); if (error) { device_printf(sc->bge_dev, @@ -2093,11 +2205,11 @@ bge_dma_alloc(device_t dev) /* Create DMA maps for TX buffers. */ for (i = 0; i < BGE_TX_RING_CNT; i++) { - error = bus_dmamap_create(sc->bge_cdata.bge_mtag, 0, + error = bus_dmamap_create(sc->bge_cdata.bge_tx_mtag, 0, &sc->bge_cdata.bge_tx_dmamap[i]); if (error) { device_printf(sc->bge_dev, - "can't create DMA map for RX\n"); + "can't create DMA map for TX\n"); return (ENOMEM); } } @@ -2182,6 +2294,13 @@ bge_dma_alloc(device_t dev) sc->bge_ldata.bge_rx_jumbo_ring_paddr = ctx.bge_busaddr; /* Create DMA maps for jumbo RX buffers. */ + error = bus_dmamap_create(sc->bge_cdata.bge_mtag_jumbo, + 0, &sc->bge_cdata.bge_rx_jumbo_sparemap); + if (error) { + device_printf(sc->bge_dev, + "can't create spare DMA map for jumbo RX\n"); + return (ENOMEM); + } for (i = 0; i < BGE_JUMBO_RX_RING_CNT; i++) { error = bus_dmamap_create(sc->bge_cdata.bge_mtag_jumbo, 0, &sc->bge_cdata.bge_rx_jumbo_dmamap[i]); @@ -2262,14 +2381,25 @@ bge_dma_alloc(device_t dev) sc->bge_ldata.bge_tx_ring_paddr = ctx.bge_busaddr; - /* Create tag for status block. */ + /* + * Create tag for status block. + * Because we only use single Tx/Rx/Rx return ring, use + * minimum status block size except BCM5700 AX/BX which + * seems to want to see full status block size regardless + * of configured number of ring. + */ + if (sc->bge_asicrev == BGE_ASICREV_BCM5700 && + sc->bge_chipid != BGE_CHIPID_BCM5700_C0) + sbsz = BGE_STATUS_BLK_SZ; + else + sbsz = 32; error = bus_dma_tag_create(sc->bge_cdata.bge_parent_tag, PAGE_SIZE, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, - NULL, BGE_STATUS_BLK_SZ, 1, BGE_STATUS_BLK_SZ, 0, - NULL, NULL, &sc->bge_cdata.bge_status_tag); + NULL, sbsz, 1, sbsz, 0, NULL, NULL, &sc->bge_cdata.bge_status_tag); if (error) { - device_printf(sc->bge_dev, "could not allocate dma tag\n"); + device_printf(sc->bge_dev, + "could not allocate status dma tag\n"); return (ENOMEM); } @@ -2280,7 +2410,7 @@ bge_dma_alloc(device_t dev) if (error) return (ENOMEM); - bzero((char *)sc->bge_ldata.bge_status_block, BGE_STATUS_BLK_SZ); + bzero((char *)sc->bge_ldata.bge_status_block, sbsz); /* Load the address of the status block. */ ctx.sc = sc; @@ -2288,7 +2418,7 @@ bge_dma_alloc(device_t dev) error = bus_dmamap_load(sc->bge_cdata.bge_status_tag, sc->bge_cdata.bge_status_map, sc->bge_ldata.bge_status_block, - BGE_STATUS_BLK_SZ, bge_dma_map_addr, &ctx, BUS_DMA_NOWAIT); + sbsz, bge_dma_map_addr, &ctx, BUS_DMA_NOWAIT); if (error) return (ENOMEM); @@ -2331,7 +2461,6 @@ bge_dma_alloc(device_t dev) return (0); } -#if __FreeBSD_version > 602105 /* * Return true if this device has more than one port. */ @@ -2380,7 +2509,6 @@ bge_can_use_msi(struct bge_softc *sc) } return (can_use_msi); } -#endif static int bge_attach(device_t dev) @@ -2389,11 +2517,13 @@ bge_attach(device_t dev) struct bge_softc *sc; uint32_t hwcfg = 0, misccfg; u_char eaddr[ETHER_ADDR_LEN]; - int error, reg, rid, trys; + int error, msicount, reg, rid, trys; sc = device_get_softc(dev); sc->bge_dev = dev; + TASK_INIT(&sc->bge_intr_task, 0, bge_intr_task, sc); + /* * Map control/status registers. */ @@ -2411,8 +2541,11 @@ bge_attach(device_t dev) /* Save various chip information. */ sc->bge_chipid = - pci_read_config(dev, BGE_PCI_MISC_CTL, 4) & - BGE_PCIMISCCTL_ASICREV; + pci_read_config(dev, BGE_PCI_MISC_CTL, 4) >> + BGE_PCIMISCCTL_ASICREV_SHIFT; + if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_USE_PRODID_REG) + sc->bge_chipid = pci_read_config(dev, BGE_PCI_PRODID_ASICREV, + 4); sc->bge_asicrev = BGE_ASICREV(sc->bge_chipid); sc->bge_chiprev = BGE_CHIPREV(sc->bge_chipid); @@ -2431,6 +2564,15 @@ bge_attach(device_t dev) /* Save chipset family. */ switch (sc->bge_asicrev) { + case BGE_ASICREV_BCM5755: + case BGE_ASICREV_BCM5761: + case BGE_ASICREV_BCM5784: + case BGE_ASICREV_BCM5785: + case BGE_ASICREV_BCM5787: + case BGE_ASICREV_BCM57780: + sc->bge_flags |= BGE_FLAG_5755_PLUS | BGE_FLAG_575X_PLUS | + BGE_FLAG_5705_PLUS; + break; case BGE_ASICREV_BCM5700: case BGE_ASICREV_BCM5701: case BGE_ASICREV_BCM5703: @@ -2444,8 +2586,6 @@ bge_attach(device_t dev) /* FALLTHROUGH */ case BGE_ASICREV_BCM5750: case BGE_ASICREV_BCM5752: - case BGE_ASICREV_BCM5755: - case BGE_ASICREV_BCM5787: case BGE_ASICREV_BCM5906: sc->bge_flags |= BGE_FLAG_575X_PLUS; /* FALLTHROUGH */ @@ -2463,16 +2603,33 @@ bge_attach(device_t dev) sc->bge_flags |= BGE_FLAG_ADC_BUG; if (sc->bge_chipid == BGE_CHIPID_BCM5704_A0) sc->bge_flags |= BGE_FLAG_5704_A0_BUG; + if (pci_get_subvendor(dev) == DELL_VENDORID) + sc->bge_flags |= BGE_FLAG_NO_3LED; + if (pci_get_device(dev) == BCOM_DEVICEID_BCM5755M) + sc->bge_flags |= BGE_FLAG_ADJUST_TRIM; if (BGE_IS_5705_PLUS(sc) && !(sc->bge_flags & BGE_FLAG_ADJUST_TRIM)) { if (sc->bge_asicrev == BGE_ASICREV_BCM5755 || + sc->bge_asicrev == BGE_ASICREV_BCM5761 || + sc->bge_asicrev == BGE_ASICREV_BCM5784 || sc->bge_asicrev == BGE_ASICREV_BCM5787) { - if (sc->bge_chipid != BGE_CHIPID_BCM5722_A0) + if (pci_get_device(dev) != BCOM_DEVICEID_BCM5722 && + pci_get_device(dev) != BCOM_DEVICEID_BCM5756) sc->bge_flags |= BGE_FLAG_JITTER_BUG; } else if (sc->bge_asicrev != BGE_ASICREV_BCM5906) sc->bge_flags |= BGE_FLAG_BER_BUG; } + /* + * All controllers that are not 5755 or higher have 4GB + * boundary DMA bug. + * Whenever an address crosses a multiple of the 4GB boundary + * (including 4GB, 8Gb, 12Gb, etc.) and makes the transition + * from 0xX_FFFF_FFFF to 0x(X+1)_0000_0000 an internal DMA + * state machine will lockup and cause the device to hang. + */ + if (BGE_IS_5755_PLUS(sc) == 0) + sc->bge_flags |= BGE_FLAG_4G_BNDRY_BUG; /* * We could possibly check for BCOM_DEVICEID_BCM5788 in bge_probe() @@ -2483,45 +2640,68 @@ bge_attach(device_t dev) misccfg == BGE_MISCCFG_BOARD_ID_5788M) sc->bge_flags |= BGE_FLAG_5788; + /* + * Some controllers seem to require a special firmware to use + * TSO. But the firmware is not available to FreeBSD and Linux + * claims that the TSO performed by the firmware is slower than + * hardware based TSO. Moreover the firmware based TSO has one + * known bug which can't handle TSO if ethernet header + IP/TCP + * header is greater than 80 bytes. The workaround for the TSO + * bug exist but it seems it's too expensive than not using + * TSO at all. Some hardwares also have the TSO bug so limit + * the TSO to the controllers that are not affected TSO issues + * (e.g. 5755 or higher). + */ + if (BGE_IS_5755_PLUS(sc)) { + /* + * BCM5754 and BCM5787 shares the same ASIC id so + * explicit device id check is required. + * Due to unknown reason TSO does not work on BCM5755M. + */ + if (pci_get_device(dev) != BCOM_DEVICEID_BCM5754 && + pci_get_device(dev) != BCOM_DEVICEID_BCM5754M && + pci_get_device(dev) != BCOM_DEVICEID_BCM5755M) + sc->bge_flags |= BGE_FLAG_TSO; + } + /* * Check if this is a PCI-X or PCI Express device. */ -#if __FreeBSD_version > 602101 if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) { /* * Found a PCI Express capabilities register, this * must be a PCI Express device. */ - if (reg != 0) { - sc->bge_flags |= BGE_FLAG_PCIE; -#else - if (BGE_IS_5705_PLUS(sc)) { - reg = pci_read_config(dev, BGE_PCIE_CAPID_REG, 4); - if ((reg & 0xFF) == BGE_PCIE_CAPID) { - sc->bge_flags |= BGE_FLAG_PCIE; - reg = BGE_PCIE_CAPID; -#endif - bge_set_max_readrq(sc, reg); - } + sc->bge_flags |= BGE_FLAG_PCIE; + sc->bge_expcap = reg; + bge_set_max_readrq(sc); } else { /* * Check if the device is in PCI-X Mode. * (This bit is not valid on PCI Express controllers.) */ + if (pci_find_extcap(dev, PCIY_PCIX, ®) == 0) + sc->bge_pcixcap = reg; if ((pci_read_config(dev, BGE_PCI_PCISTATE, 4) & BGE_PCISTATE_PCI_BUSMODE) == 0) sc->bge_flags |= BGE_FLAG_PCIX; } -#if __FreeBSD_version > 602105 - { - int msicount; - - /* - * Allocate the interrupt, using MSI if possible. These devices - * support 8 MSI messages, but only the first one is used in - * normal operation. - */ + /* + * The 40bit DMA bug applies to the 5714/5715 controllers and is + * not actually a MAC controller bug but an issue with the embedded + * PCIe to PCI-X bridge in the device. Use 40bit DMA workaround. + */ + if (BGE_IS_5714_FAMILY(sc) && (sc->bge_flags & BGE_FLAG_PCIX)) + sc->bge_flags |= BGE_FLAG_40BIT_BUG; + /* + * Allocate the interrupt, using MSI if possible. These devices + * support 8 MSI messages, but only the first one is used in + * normal operation. + */ + rid = 0; + if (pci_find_extcap(sc->bge_dev, PCIY_MSI, ®) == 0) { + sc->bge_msicap = reg; if (bge_can_use_msi(sc)) { msicount = pci_msi_count(dev); if (msicount > 1) @@ -2531,12 +2711,8 @@ bge_attach(device_t dev) if (msicount == 1 && pci_alloc_msi(dev, &msicount) == 0) { rid = 1; sc->bge_flags |= BGE_FLAG_MSI; - } else - rid = 0; + } } -#else - rid = 0; -#endif sc->bge_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE); @@ -2570,9 +2746,8 @@ bge_attach(device_t dev) & BGE_HWCFG_ASF) { sc->bge_asf_mode |= ASF_ENABLE; sc->bge_asf_mode |= ASF_STACKUP; - if (sc->bge_asicrev == BGE_ASICREV_BCM5750) { + if (BGE_IS_575X_PLUS(sc)) sc->bge_asf_mode |= ASF_NEW_HANDSHAKE; - } } } @@ -2635,13 +2810,16 @@ bge_attach(device_t dev) ifp->if_ioctl = bge_ioctl; ifp->if_start = bge_start; ifp->if_init = bge_init; - ifp->if_mtu = ETHERMTU; ifp->if_snd.ifq_drv_maxlen = BGE_TX_RING_CNT - 1; IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); IFQ_SET_READY(&ifp->if_snd); ifp->if_hwassist = BGE_CSUM_FEATURES; ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; + if ((sc->bge_flags & BGE_FLAG_TSO) != 0) { + ifp->if_hwassist |= CSUM_TSO; + ifp->if_capabilities |= IFCAP_TSO4 | IFCAP_VLAN_HWTSO; + } #ifdef IFCAP_VLAN_HWCSUM ifp->if_capabilities |= IFCAP_VLAN_HWCSUM; #endif @@ -2656,7 +2834,7 @@ bge_attach(device_t dev) */ if (sc->bge_chipid == BGE_CHIPID_BCM5700_B0) { ifp->if_capabilities &= ~IFCAP_HWCSUM; - ifp->if_capenable &= IFCAP_HWCSUM; + ifp->if_capenable &= ~IFCAP_HWCSUM; ifp->if_hwassist = 0; } @@ -2682,12 +2860,14 @@ bge_attach(device_t dev) hwcfg = ntohl(hwcfg); } - if ((hwcfg & BGE_HWCFG_MEDIA) == BGE_MEDIA_FIBER) - sc->bge_flags |= BGE_FLAG_TBI; - /* The SysKonnect SK-9D41 is a 1000baseSX card. */ - if ((pci_read_config(dev, BGE_PCI_SUBSYS, 4) >> 16) == SK_SUBSYSID_9D41) - sc->bge_flags |= BGE_FLAG_TBI; + if ((pci_read_config(dev, BGE_PCI_SUBSYS, 4) >> 16) == + SK_SUBSYSID_9D41 || (hwcfg & BGE_HWCFG_MEDIA) == BGE_MEDIA_FIBER) { + if (BGE_IS_5714_FAMILY(sc)) + sc->bge_flags |= BGE_FLAG_MII_SERDES; + else + sc->bge_flags |= BGE_FLAG_TBI; + } if (sc->bge_flags & BGE_FLAG_TBI) { ifmedia_init(&sc->bge_ifmedia, IFM_IMASK, bge_ifmedia_upd, @@ -2750,12 +2930,36 @@ again: ether_ifattach(ifp, eaddr); callout_init_mtx(&sc->bge_stat_ch, &sc->bge_mtx, 0); + /* Tell upper layer we support long frames. */ + ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); + /* * Hookup IRQ last. */ #if __FreeBSD_version > 700030 - error = bus_setup_intr(dev, sc->bge_irq, INTR_TYPE_NET | INTR_MPSAFE, - NULL, bge_intr, sc, &sc->bge_intrhand); + if (BGE_IS_5755_PLUS(sc) && sc->bge_flags & BGE_FLAG_MSI) { + /* Take advantage of single-shot MSI. */ + CSR_WRITE_4(sc, BGE_MSI_MODE, CSR_READ_4(sc, BGE_MSI_MODE) & + ~BGE_MSIMODE_ONE_SHOT_DISABLE); + sc->bge_tq = taskqueue_create_fast("bge_taskq", M_WAITOK, + taskqueue_thread_enqueue, &sc->bge_tq); + if (sc->bge_tq == NULL) { + device_printf(dev, "could not create taskqueue.\n"); + ether_ifdetach(ifp); + error = ENXIO; + goto fail; + } + taskqueue_start_threads(&sc->bge_tq, 1, PI_NET, "%s taskq", + device_get_nameunit(sc->bge_dev)); + error = bus_setup_intr(dev, sc->bge_irq, + INTR_TYPE_NET | INTR_MPSAFE, bge_msi_intr, NULL, sc, + &sc->bge_intrhand); + if (error) + ether_ifdetach(ifp); + } else + error = bus_setup_intr(dev, sc->bge_irq, + INTR_TYPE_NET | INTR_MPSAFE, NULL, bge_intr, sc, + &sc->bge_intrhand); #else error = bus_setup_intr(dev, sc->bge_irq, INTR_TYPE_NET | INTR_MPSAFE, bge_intr, sc, &sc->bge_intrhand); @@ -2797,6 +3001,8 @@ bge_detach(device_t dev) callout_drain(&sc->bge_stat_ch); + if (sc->bge_tq) + taskqueue_drain(sc->bge_tq, &sc->bge_intr_task); ether_ifdetach(ifp); if (sc->bge_flags & BGE_FLAG_TBI) { @@ -2818,6 +3024,9 @@ bge_release_resources(struct bge_softc *sc) dev = sc->bge_dev; + if (sc->bge_tq != NULL) + taskqueue_free(sc->bge_tq); + if (sc->bge_intrhand != NULL) bus_teardown_intr(dev, sc->bge_irq, sc->bge_intrhand); @@ -2825,10 +3034,8 @@ bge_release_resources(struct bge_softc *sc) bus_release_resource(dev, SYS_RES_IRQ, sc->bge_flags & BGE_FLAG_MSI ? 1 : 0, sc->bge_irq); -#if __FreeBSD_version > 602105 if (sc->bge_flags & BGE_FLAG_MSI) pci_release_msi(dev); -#endif if (sc->bge_res != NULL) bus_release_resource(dev, SYS_RES_MEMORY, @@ -2849,6 +3056,7 @@ bge_reset(struct bge_softc *sc) device_t dev; uint32_t cachesize, command, pcistate, reset, val; void (*write_op)(struct bge_softc *, int, int); + uint16_t devctl; int i; dev = sc->bge_dev; @@ -2873,8 +3081,7 @@ bge_reset(struct bge_softc *sc) /* Disable fastboot on controllers that support it. */ if (sc->bge_asicrev == BGE_ASICREV_BCM5752 || - sc->bge_asicrev == BGE_ASICREV_BCM5755 || - sc->bge_asicrev == BGE_ASICREV_BCM5787) { + BGE_IS_5755_PLUS(sc)) { if (bootverbose) device_printf(sc->bge_dev, "Disabling fastboot\n"); CSR_WRITE_4(sc, BGE_FASTBOOT_PC, 0x0); @@ -2900,7 +3107,7 @@ bge_reset(struct bge_softc *sc) } } - /* + /* * Set GPHY Power Down Override to leave GPHY * powered up in D0 uninitialized. */ @@ -2928,11 +3135,20 @@ bge_reset(struct bge_softc *sc) val = pci_read_config(dev, 0xC4, 4); pci_write_config(dev, 0xC4, val | (1 << 15), 4); } - /* - * Set PCIE max payload size to 128 bytes and clear error - * status. - */ - pci_write_config(dev, 0xD8, 0xF5000, 4); + devctl = pci_read_config(dev, + sc->bge_expcap + PCIR_EXPRESS_DEVICE_CTL, 2); + /* Clear enable no snoop and disable relaxed ordering. */ + devctl &= ~(PCIM_EXP_CTL_RELAXED_ORD_ENABLE | + PCIM_EXP_CTL_NOSNOOP_ENABLE); + /* Set PCIE max payload size to 128. */ + devctl &= ~PCIM_EXP_CTL_MAX_PAYLOAD; + pci_write_config(dev, sc->bge_expcap + PCIR_EXPRESS_DEVICE_CTL, + devctl, 2); + /* Clear error status. */ + pci_write_config(dev, sc->bge_expcap + PCIR_EXPRESS_DEVICE_STA, + PCIM_EXP_STA_CORRECTABLE_ERROR | + PCIM_EXP_STA_NON_FATAL_ERROR | PCIM_EXP_STA_FATAL_ERROR | + PCIM_EXP_STA_UNSUPPORTED_REQ, 2); } /* Reset some of the PCI state that got zapped by reset. */ @@ -2947,8 +3163,10 @@ bge_reset(struct bge_softc *sc) if (BGE_IS_5714_FAMILY(sc)) { /* This chip disables MSI on reset. */ if (sc->bge_flags & BGE_FLAG_MSI) { - val = pci_read_config(dev, BGE_PCI_MSI_CTL, 2); - pci_write_config(dev, BGE_PCI_MSI_CTL, + val = pci_read_config(dev, + sc->bge_msicap + PCIR_MSI_CTRL, 2); + pci_write_config(dev, + sc->bge_msicap + PCIR_MSI_CTRL, val | PCIM_MSICTRL_MSI_ENABLE, 2); val = CSR_READ_4(sc, BGE_MSI_MODE); CSR_WRITE_4(sc, BGE_MSI_MODE, @@ -3051,15 +3269,13 @@ bge_reset(struct bge_softc *sc) */ static int -bge_rxeof(struct bge_softc *sc) +bge_rxeof(struct bge_softc *sc, uint16_t rx_prod, int holdlck) { struct ifnet *ifp; int rx_npkts = 0, stdcnt = 0, jumbocnt = 0; - uint16_t rx_prod, rx_cons; + uint16_t rx_cons; - BGE_LOCK_ASSERT(sc); rx_cons = sc->bge_rx_saved_considx; - rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; /* Nothing to do. */ if (rx_cons == rx_prod) @@ -3070,10 +3286,11 @@ bge_rxeof(struct bge_softc *sc) bus_dmamap_sync(sc->bge_cdata.bge_rx_return_ring_tag, sc->bge_cdata.bge_rx_return_ring_map, BUS_DMASYNC_POSTREAD); bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag, - sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_POSTREAD); - if (BGE_IS_JUMBO_CAPABLE(sc)) + sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_POSTWRITE); + if (ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN > + (MCLBYTES - ETHER_ALIGN)) bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag, - sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTREAD); + sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTWRITE); while (rx_cons != rx_prod) { struct bge_rx_bd *cur_rx; @@ -3102,47 +3319,31 @@ bge_rxeof(struct bge_softc *sc) } if (cur_rx->bge_flags & BGE_RXBDFLAG_JUMBO_RING) { - BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); - bus_dmamap_sync(sc->bge_cdata.bge_mtag_jumbo, - sc->bge_cdata.bge_rx_jumbo_dmamap[rxidx], - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(sc->bge_cdata.bge_mtag_jumbo, - sc->bge_cdata.bge_rx_jumbo_dmamap[rxidx]); - m = sc->bge_cdata.bge_rx_jumbo_chain[rxidx]; - sc->bge_cdata.bge_rx_jumbo_chain[rxidx] = NULL; jumbocnt++; + m = sc->bge_cdata.bge_rx_jumbo_chain[rxidx]; if (cur_rx->bge_flags & BGE_RXBDFLAG_ERROR) { - ifp->if_ierrors++; - bge_newbuf_jumbo(sc, sc->bge_jumbo, m); + BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); continue; } - if (bge_newbuf_jumbo(sc, - sc->bge_jumbo, NULL) == ENOBUFS) { - ifp->if_ierrors++; - bge_newbuf_jumbo(sc, sc->bge_jumbo, m); + if (bge_newbuf_jumbo(sc, rxidx) != 0) { + BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); + ifp->if_iqdrops++; continue; } + BGE_INC(sc->bge_jumbo, BGE_JUMBO_RX_RING_CNT); } else { - BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); - bus_dmamap_sync(sc->bge_cdata.bge_mtag, - sc->bge_cdata.bge_rx_std_dmamap[rxidx], - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(sc->bge_cdata.bge_mtag, - sc->bge_cdata.bge_rx_std_dmamap[rxidx]); - m = sc->bge_cdata.bge_rx_std_chain[rxidx]; - sc->bge_cdata.bge_rx_std_chain[rxidx] = NULL; stdcnt++; if (cur_rx->bge_flags & BGE_RXBDFLAG_ERROR) { - ifp->if_ierrors++; - bge_newbuf_std(sc, sc->bge_std, m); + BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); continue; } - if (bge_newbuf_std(sc, sc->bge_std, - NULL) == ENOBUFS) { - ifp->if_ierrors++; - bge_newbuf_std(sc, sc->bge_std, m); + m = sc->bge_cdata.bge_rx_std_chain[rxidx]; + if (bge_newbuf_std(sc, rxidx) != 0) { + BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); + ifp->if_iqdrops++; continue; } + BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); } ifp->if_ipackets++; @@ -3190,20 +3391,25 @@ bge_rxeof(struct bge_softc *sc) #endif } - BGE_UNLOCK(sc); - (*ifp->if_input)(ifp, m); - BGE_LOCK(sc); + if (holdlck != 0) { + BGE_UNLOCK(sc); + (*ifp->if_input)(ifp, m); + BGE_LOCK(sc); + } else + (*ifp->if_input)(ifp, m); rx_npkts++; if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) return (rx_npkts); } + bus_dmamap_sync(sc->bge_cdata.bge_rx_return_ring_tag, + sc->bge_cdata.bge_rx_return_ring_map, BUS_DMASYNC_PREREAD); if (stdcnt > 0) bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag, sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_PREWRITE); - if (BGE_IS_JUMBO_CAPABLE(sc) && jumbocnt > 0) + if (jumbocnt > 0) bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag, sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_PREWRITE); @@ -3225,7 +3431,7 @@ bge_rxeof(struct bge_softc *sc) } static void -bge_txeof(struct bge_softc *sc) +bge_txeof(struct bge_softc *sc, uint16_t tx_cons) { struct bge_tx_bd *cur_tx = NULL; struct ifnet *ifp; @@ -3233,21 +3439,18 @@ bge_txeof(struct bge_softc *sc) BGE_LOCK_ASSERT(sc); /* Nothing to do. */ - if (sc->bge_tx_saved_considx == - sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx) + if (sc->bge_tx_saved_considx == tx_cons) return; ifp = sc->bge_ifp; bus_dmamap_sync(sc->bge_cdata.bge_tx_ring_tag, - sc->bge_cdata.bge_tx_ring_map, - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + sc->bge_cdata.bge_tx_ring_map, BUS_DMASYNC_POSTWRITE); /* * Go through our tx ring and free mbufs for those * frames that have been sent. */ - while (sc->bge_tx_saved_considx != - sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx) { + while (sc->bge_tx_saved_considx != tx_cons) { uint32_t idx = 0; idx = sc->bge_tx_saved_considx; @@ -3255,10 +3458,10 @@ bge_txeof(struct bge_softc *sc) if (cur_tx->bge_flags & BGE_TXBDFLAG_END) ifp->if_opackets++; if (sc->bge_cdata.bge_tx_chain[idx] != NULL) { - bus_dmamap_sync(sc->bge_cdata.bge_mtag, + bus_dmamap_sync(sc->bge_cdata.bge_tx_mtag, sc->bge_cdata.bge_tx_dmamap[idx], BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(sc->bge_cdata.bge_mtag, + bus_dmamap_unload(sc->bge_cdata.bge_tx_mtag, sc->bge_cdata.bge_tx_dmamap[idx]); m_freem(sc->bge_cdata.bge_tx_chain[idx]); sc->bge_cdata.bge_tx_chain[idx] = NULL; @@ -3278,6 +3481,7 @@ static int bge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) { struct bge_softc *sc = ifp->if_softc; + uint16_t rx_prod, tx_cons; uint32_t statusword; int rx_npkts = 0; @@ -3288,13 +3492,17 @@ bge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) } bus_dmamap_sync(sc->bge_cdata.bge_status_tag, - sc->bge_cdata.bge_status_map, BUS_DMASYNC_POSTREAD); + sc->bge_cdata.bge_status_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; + tx_cons = sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx; statusword = atomic_readandclear_32( &sc->bge_ldata.bge_status_block->bge_status); bus_dmamap_sync(sc->bge_cdata.bge_status_tag, - sc->bge_cdata.bge_status_map, BUS_DMASYNC_PREREAD); + sc->bge_cdata.bge_status_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* Note link event. It will be processed by POLL_AND_CHECK_STATUS. */ if (statusword & BGE_STATFLAG_LINKSTATE_CHANGED) @@ -3307,12 +3515,12 @@ bge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) bge_link_upd(sc); sc->rxcycles = count; - rx_npkts = bge_rxeof(sc); + rx_npkts = bge_rxeof(sc, rx_prod, 1); if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { BGE_UNLOCK(sc); return (rx_npkts); } - bge_txeof(sc); + bge_txeof(sc, tx_cons); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) bge_start_locked(ifp); @@ -3321,12 +3529,76 @@ bge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) } #endif /* DEVICE_POLLING */ +static int +bge_msi_intr(void *arg) +{ + struct bge_softc *sc; + + sc = (struct bge_softc *)arg; + /* + * This interrupt is not shared and controller already + * disabled further interrupt. + */ + taskqueue_enqueue(sc->bge_tq, &sc->bge_intr_task); + return (FILTER_HANDLED); +} + +static void +bge_intr_task(void *arg, int pending) +{ + struct bge_softc *sc; + struct ifnet *ifp; + uint32_t status; + uint16_t rx_prod, tx_cons; + + sc = (struct bge_softc *)arg; + ifp = sc->bge_ifp; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; + + /* Get updated status block. */ + bus_dmamap_sync(sc->bge_cdata.bge_status_tag, + sc->bge_cdata.bge_status_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + /* Save producer/consumer indexess. */ + rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; + tx_cons = sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx; + status = sc->bge_ldata.bge_status_block->bge_status; + sc->bge_ldata.bge_status_block->bge_status = 0; + bus_dmamap_sync(sc->bge_cdata.bge_status_tag, + sc->bge_cdata.bge_status_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + /* Let controller work. */ + bge_writembx(sc, BGE_MBX_IRQ0_LO, 0); + + if ((status & BGE_STATFLAG_LINKSTATE_CHANGED) != 0) { + BGE_LOCK(sc); + bge_link_upd(sc); + BGE_UNLOCK(sc); + } + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + /* Check RX return ring producer/consumer. */ + bge_rxeof(sc, rx_prod, 0); + } + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + BGE_LOCK(sc); + /* Check TX ring producer/consumer. */ + bge_txeof(sc, tx_cons); + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + bge_start_locked(ifp); + BGE_UNLOCK(sc); + } +} + static void bge_intr(void *xsc) { struct bge_softc *sc; struct ifnet *ifp; uint32_t statusword; + uint16_t rx_prod, tx_cons; sc = xsc; @@ -3370,9 +3642,14 @@ bge_intr(void *xsc) /* Make sure the descriptor ring indexes are coherent. */ bus_dmamap_sync(sc->bge_cdata.bge_status_tag, - sc->bge_cdata.bge_status_map, BUS_DMASYNC_POSTREAD); + sc->bge_cdata.bge_status_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + rx_prod = sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx; + tx_cons = sc->bge_ldata.bge_status_block->bge_idx[0].bge_tx_cons_idx; + sc->bge_ldata.bge_status_block->bge_status = 0; bus_dmamap_sync(sc->bge_cdata.bge_status_tag, - sc->bge_cdata.bge_status_map, BUS_DMASYNC_PREREAD); + sc->bge_cdata.bge_status_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); if ((sc->bge_asicrev == BGE_ASICREV_BCM5700 && sc->bge_chipid != BGE_CHIPID_BCM5700_B2) || @@ -3381,12 +3658,12 @@ bge_intr(void *xsc) if (ifp->if_drv_flags & IFF_DRV_RUNNING) { /* Check RX return ring producer/consumer. */ - bge_rxeof(sc); + bge_rxeof(sc, rx_prod, 1); } if (ifp->if_drv_flags & IFF_DRV_RUNNING) { /* Check TX ring producer/consumer. */ - bge_txeof(sc); + bge_txeof(sc, tx_cons); } if (ifp->if_drv_flags & IFF_DRV_RUNNING && @@ -3404,7 +3681,7 @@ bge_asf_driver_up(struct bge_softc *sc) if (sc->bge_asf_count) sc->bge_asf_count --; else { - sc->bge_asf_count = 5; + sc->bge_asf_count = 2; bge_writemem_ind(sc, BGE_SOFTWARE_GENCOMM_FW, BGE_FW_DRV_ALIVE); bge_writemem_ind(sc, BGE_SOFTWARE_GENNCOMM_FW_LEN, 4); @@ -3478,7 +3755,9 @@ bge_stats_update_regs(struct bge_softc *sc) ifp->if_collisions += CSR_READ_4(sc, BGE_MAC_STATS + offsetof(struct bge_mac_stats_regs, etherStatsCollisions)); + ifp->if_ierrors += CSR_READ_4(sc, BGE_RXLP_LOCSTAT_OUT_OF_BDS); ifp->if_ierrors += CSR_READ_4(sc, BGE_RXLP_LOCSTAT_IFIN_DROPS); + ifp->if_ierrors += CSR_READ_4(sc, BGE_RXLP_LOCSTAT_IFIN_ERRORS); } static void @@ -3546,7 +3825,7 @@ bge_cksum_pad(struct mbuf *m) last = n; } } - + /* Now zero the pad area, to avoid the bge cksum-assist bug. */ memset(mtod(last, caddr_t) + last->m_len, 0, padlen); last->m_len += padlen; @@ -3555,6 +3834,59 @@ bge_cksum_pad(struct mbuf *m) return (0); } +static struct mbuf * +bge_setup_tso(struct bge_softc *sc, struct mbuf *m, uint16_t *mss) +{ + struct ip *ip; + struct tcphdr *tcp; + struct mbuf *n; + uint16_t hlen; + uint32_t poff; + + if (M_WRITABLE(m) == 0) { + /* Get a writable copy. */ + n = m_dup(m, M_DONTWAIT); + m_freem(m); + if (n == NULL) + return (NULL); + m = n; + } + m = m_pullup(m, sizeof(struct ether_header) + sizeof(struct ip)); + if (m == NULL) + return (NULL); + ip = (struct ip *)(mtod(m, char *) + sizeof(struct ether_header)); + poff = sizeof(struct ether_header) + (ip->ip_hl << 2); + m = m_pullup(m, poff + sizeof(struct tcphdr)); + if (m == NULL) + return (NULL); + tcp = (struct tcphdr *)(mtod(m, char *) + poff); + m = m_pullup(m, poff + (tcp->th_off << 2)); + if (m == NULL) + return (NULL); + /* + * It seems controller doesn't modify IP length and TCP pseudo + * checksum. These checksum computed by upper stack should be 0. + */ + *mss = m->m_pkthdr.tso_segsz; + ip->ip_sum = 0; + ip->ip_len = htons(*mss + (ip->ip_hl << 2) + (tcp->th_off << 2)); + /* Clear pseudo checksum computed by TCP stack. */ + tcp->th_sum = 0; + /* + * Broadcom controllers uses different descriptor format for + * TSO depending on ASIC revision. Due to TSO-capable firmware + * license issue and lower performance of firmware based TSO + * we only support hardware based TSO which is applicable for + * BCM5755 or newer controllers. Hardware based TSO uses 11 + * bits to store MSS and upper 5 bits are used to store IP/TCP + * header length(including IP/TCP options). The header length + * is expressed as 32 bits unit. + */ + hlen = ((ip->ip_hl << 2) + (tcp->th_off << 2)) >> 2; + *mss |= (hlen << 11); + return (m); +} + /* * Encapsulate an mbuf chain in the tx ring by coupling the mbuf data * pointers to descriptors. @@ -3567,11 +3899,19 @@ bge_encap(struct bge_softc *sc, struct mbuf **m_head, uint32_t *txidx) struct bge_tx_bd *d; struct mbuf *m = *m_head; uint32_t idx = *txidx; - uint16_t csum_flags; + uint16_t csum_flags, mss, vlan_tag; int nsegs, i, error; csum_flags = 0; - if (m->m_pkthdr.csum_flags) { + mss = 0; + vlan_tag = 0; + if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0) { + *m_head = m = bge_setup_tso(sc, m, &mss); + if (*m_head == NULL) + return (ENOBUFS); + csum_flags |= BGE_TXBDFLAG_CPU_PRE_DMA | + BGE_TXBDFLAG_CPU_POST_DMA; + } else if ((m->m_pkthdr.csum_flags & BGE_CSUM_FEATURES) != 0) { if (m->m_pkthdr.csum_flags & CSUM_IP) csum_flags |= BGE_TXBDFLAG_IP_CSUM; if (m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)) { @@ -3589,8 +3929,25 @@ bge_encap(struct bge_softc *sc, struct mbuf **m_head, uint32_t *txidx) csum_flags |= BGE_TXBDFLAG_IP_FRAG; } + if ((m->m_pkthdr.csum_flags & CSUM_TSO) == 0 && + sc->bge_forced_collapse > 0 && + (sc->bge_flags & BGE_FLAG_PCIE) != 0 && m->m_next != NULL) { + /* + * Forcedly collapse mbuf chains to overcome hardware + * limitation which only support a single outstanding + * DMA read operation. + */ + if (sc->bge_forced_collapse == 1) + m = m_defrag(m, M_DONTWAIT); + else + m = m_collapse(m, M_DONTWAIT, sc->bge_forced_collapse); + if (m == NULL) + m = *m_head; + *m_head = m; + } + map = sc->bge_cdata.bge_tx_dmamap[idx]; - error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_mtag, map, m, segs, + error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_tx_mtag, map, m, segs, &nsegs, BUS_DMA_NOWAIT); if (error == EFBIG) { m = m_collapse(m, M_DONTWAIT, BGE_NSEG_NEW); @@ -3600,8 +3957,8 @@ bge_encap(struct bge_softc *sc, struct mbuf **m_head, uint32_t *txidx) return (ENOBUFS); } *m_head = m; - error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_mtag, map, m, - segs, &nsegs, BUS_DMA_NOWAIT); + error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_tx_mtag, map, + m, segs, &nsegs, BUS_DMA_NOWAIT); if (error) { m_freem(m); *m_head = NULL; @@ -3610,23 +3967,37 @@ bge_encap(struct bge_softc *sc, struct mbuf **m_head, uint32_t *txidx) } else if (error != 0) return (error); - /* - * Sanity check: avoid coming within 16 descriptors - * of the end of the ring. - */ - if (nsegs > (BGE_TX_RING_CNT - sc->bge_txcnt - 16)) { - bus_dmamap_unload(sc->bge_cdata.bge_mtag, map); + /* Check if we have enough free send BDs. */ + if (sc->bge_txcnt + nsegs >= BGE_TX_RING_CNT) { + bus_dmamap_unload(sc->bge_cdata.bge_tx_mtag, map); return (ENOBUFS); } - bus_dmamap_sync(sc->bge_cdata.bge_mtag, map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(sc->bge_cdata.bge_tx_mtag, map, BUS_DMASYNC_PREWRITE); +#if __FreeBSD_version > 700022 + if (m->m_flags & M_VLANTAG) { + csum_flags |= BGE_TXBDFLAG_VLAN_TAG; + vlan_tag = m->m_pkthdr.ether_vtag; + } +#else + { + struct m_tag *mtag; + + if ((mtag = VLAN_OUTPUT_TAG(sc->bge_ifp, m)) != NULL) { + csum_flags |= BGE_TXBDFLAG_VLAN_TAG; + vlan_tag = VLAN_TAG_VALUE(mtag); + } + } +#endif for (i = 0; ; i++) { d = &sc->bge_ldata.bge_tx_ring[idx]; d->bge_addr.bge_addr_lo = BGE_ADDR_LO(segs[i].ds_addr); d->bge_addr.bge_addr_hi = BGE_ADDR_HI(segs[i].ds_addr); d->bge_len = segs[i].ds_len; d->bge_flags = csum_flags; + d->bge_vlan_tag = vlan_tag; + d->bge_mss = mss; if (i == nsegs - 1) break; BGE_INC(idx, BGE_TX_RING_CNT); @@ -3635,26 +4006,6 @@ bge_encap(struct bge_softc *sc, struct mbuf **m_head, uint32_t *txidx) /* Mark the last segment as end of packet... */ d->bge_flags |= BGE_TXBDFLAG_END; - /* ... and put VLAN tag into first segment. */ - d = &sc->bge_ldata.bge_tx_ring[*txidx]; -#if __FreeBSD_version > 700022 - if (m->m_flags & M_VLANTAG) { - d->bge_flags |= BGE_TXBDFLAG_VLAN_TAG; - d->bge_vlan_tag = m->m_pkthdr.ether_vtag; - } else - d->bge_vlan_tag = 0; -#else - { - struct m_tag *mtag; - - if ((mtag = VLAN_OUTPUT_TAG(sc->bge_ifp, m)) != NULL) { - d->bge_flags |= BGE_TXBDFLAG_VLAN_TAG; - d->bge_vlan_tag = VLAN_TAG_VALUE(mtag); - } else - d->bge_vlan_tag = 0; - } -#endif - /* * Insure that the map for this transmission * is placed at the array index of the last descriptor @@ -3679,18 +4030,25 @@ static void bge_start_locked(struct ifnet *ifp) { struct bge_softc *sc; - struct mbuf *m_head = NULL; + struct mbuf *m_head; uint32_t prodidx; - int count = 0; + int count; sc = ifp->if_softc; + BGE_LOCK_ASSERT(sc); - if (!sc->bge_link || IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + if (!sc->bge_link || + (ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING) return; prodidx = sc->bge_tx_prodidx; - while(sc->bge_cdata.bge_tx_chain[prodidx] == NULL) { + for (count = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd);) { + if (sc->bge_txcnt > BGE_TX_RING_CNT - 16) { + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; @@ -3743,22 +4101,22 @@ bge_start_locked(struct ifnet *ifp) #endif } - if (count == 0) - /* No packets were dequeued. */ - return; - - /* Transmit. */ - bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, prodidx); - /* 5700 b2 errata */ - if (sc->bge_chiprev == BGE_CHIPREV_5700_BX) + if (count > 0) { + bus_dmamap_sync(sc->bge_cdata.bge_tx_ring_tag, + sc->bge_cdata.bge_tx_ring_map, BUS_DMASYNC_PREWRITE); + /* Transmit. */ bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, prodidx); + /* 5700 b2 errata */ + if (sc->bge_chiprev == BGE_CHIPREV_5700_BX) + bge_writembx(sc, BGE_MBX_TX_HOST_PROD0_LO, prodidx); - sc->bge_tx_prodidx = prodidx; + sc->bge_tx_prodidx = prodidx; - /* - * Set a timeout in case the chip goes out to lunch. - */ - sc->bge_timer = 5; + /* + * Set a timeout in case the chip goes out to lunch. + */ + sc->bge_timer = 5; + } } /* @@ -3831,7 +4189,11 @@ bge_init_locked(struct bge_softc *sc) bge_setvlan(sc); /* Init RX ring. */ - bge_init_rx_ring_std(sc); + if (bge_init_rx_ring_std(sc) != 0) { + device_printf(sc->bge_dev, "no memory for std Rx buffers.\n"); + bge_stop(sc); + return; + } /* * Workaround for a bug in 5705 ASIC rev A0. Poll the NIC's @@ -3852,8 +4214,14 @@ bge_init_locked(struct bge_softc *sc) } /* Init jumbo RX ring. */ - if (ifp->if_mtu > (ETHERMTU + ETHER_HDR_LEN + ETHER_CRC_LEN)) - bge_init_rx_ring_jumbo(sc); + if (ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN > + (MCLBYTES - ETHER_ALIGN)) { + if (bge_init_rx_ring_jumbo(sc) != 0) { + device_printf(sc->bge_dev, "no memory for std Rx buffers.\n"); + bge_stop(sc); + return; + } + } /* Init our RX return ring index. */ sc->bge_rx_saved_considx = 0; @@ -3888,7 +4256,7 @@ bge_init_locked(struct bge_softc *sc) BGE_CLRBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR); bge_writembx(sc, BGE_MBX_IRQ0_LO, 0); } - + bge_ifmedia_upd_locked(ifp); ifp->if_drv_flags |= IFF_DRV_RUNNING; @@ -4144,12 +4512,18 @@ bge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) ifp->if_capenable ^= IFCAP_HWCSUM; if (IFCAP_HWCSUM & ifp->if_capenable && IFCAP_HWCSUM & ifp->if_capabilities) - ifp->if_hwassist = BGE_CSUM_FEATURES; + ifp->if_hwassist |= BGE_CSUM_FEATURES; else - ifp->if_hwassist = 0; -#ifdef VLAN_CAPABILITIES - VLAN_CAPABILITIES(ifp); -#endif + ifp->if_hwassist &= ~BGE_CSUM_FEATURES; + } + + if ((mask & IFCAP_TSO4) != 0 && + (ifp->if_capabilities & IFCAP_TSO4) != 0) { + ifp->if_capenable ^= IFCAP_TSO4; + if ((ifp->if_capenable & IFCAP_TSO4) != 0) + ifp->if_hwassist |= CSUM_TSO; + else + ifp->if_hwassist &= ~CSUM_TSO; } if (mask & IFCAP_VLAN_MTU) { @@ -4158,16 +4532,21 @@ bge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) bge_init(sc); } - if (mask & IFCAP_VLAN_HWTAGGING) { + if ((mask & IFCAP_VLAN_HWTSO) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) + ifp->if_capenable ^= IFCAP_VLAN_HWTSO; + if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) { ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) + ifp->if_capenable &= ~IFCAP_VLAN_HWTSO; BGE_LOCK(sc); bge_setvlan(sc); BGE_UNLOCK(sc); -#ifdef VLAN_CAPABILITIES - VLAN_CAPABILITIES(ifp); -#endif } - +#ifdef VLAN_CAPABILITIES + VLAN_CAPABILITIES(ifp); +#endif break; default: error = ether_ioctl(ifp, command, data); @@ -4205,19 +4584,23 @@ static void bge_stop(struct bge_softc *sc) { struct ifnet *ifp; - struct ifmedia_entry *ifm; - struct mii_data *mii = NULL; - int mtmp, itmp; BGE_LOCK_ASSERT(sc); ifp = sc->bge_ifp; - if ((sc->bge_flags & BGE_FLAG_TBI) == 0) - mii = device_get_softc(sc->bge_miibus); - callout_stop(&sc->bge_stat_ch); + /* Disable host interrupts. */ + BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR); + bge_writembx(sc, BGE_MBX_IRQ0_LO, 1); + + /* + * Tell firmware we're shutting down. + */ + bge_stop_fw(sc); + bge_sig_pre_reset(sc, BGE_RESET_STOP); + /* * Disable all of the receiver blocks. */ @@ -4257,21 +4640,11 @@ bge_stop(struct bge_softc *sc) BGE_CLRBIT(sc, BGE_MARB_MODE, BGE_MARBMODE_ENABLE); } - /* Disable host interrupts. */ - BGE_SETBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR); - bge_writembx(sc, BGE_MBX_IRQ0_LO, 1); - - /* - * Tell firmware we're shutting down. - */ - - bge_stop_fw(sc); - bge_sig_pre_reset(sc, BGE_RESET_STOP); bge_reset(sc); bge_sig_legacy(sc, BGE_RESET_STOP); bge_sig_post_reset(sc, BGE_RESET_STOP); - /* + /* * Keep the ASF firmware running if up. */ if (sc->bge_asf_mode & ASF_STACKUP) @@ -4289,27 +4662,6 @@ bge_stop(struct bge_softc *sc) /* Free TX buffers. */ bge_free_tx_ring(sc); - /* - * Isolate/power down the PHY, but leave the media selection - * unchanged so that things will be put back to normal when - * we bring the interface back up. - */ - if ((sc->bge_flags & BGE_FLAG_TBI) == 0) { - itmp = ifp->if_flags; - ifp->if_flags |= IFF_UP; - /* - * If we are called from bge_detach(), mii is already NULL. - */ - if (mii != NULL) { - ifm = mii->mii_media.ifm_cur; - mtmp = ifm->ifm_media; - ifm->ifm_media = IFM_ETHER | IFM_NONE; - mii_mediachg(mii); - ifm->ifm_media = mtmp; - } - ifp->if_flags = itmp; - } - sc->bge_tx_saved_considx = BGE_TXCONS_UNSET; /* Clear MAC's link state (PHY may still have link UP). */ @@ -4515,6 +4867,26 @@ bge_add_sysctls(struct bge_softc *sc) #endif + /* + * A common design characteristic for many Broadcom client controllers + * is that they only support a single outstanding DMA read operation + * on the PCIe bus. This means that it will take twice as long to fetch + * a TX frame that is split into header and payload buffers as it does + * to fetch a single, contiguous TX frame (2 reads vs. 1 read). For + * these controllers, coalescing buffers to reduce the number of memory + * reads is effective way to get maximum performance(about 940Mbps). + * Without collapsing TX buffers the maximum TCP bulk transfer + * performance is about 850Mbps. However forcing coalescing mbufs + * consumes a lot of CPU cycles, so leave it off by default. + */ + SYSCTL_ADD_INT(ctx, children, OID_AUTO, "forced_collapse", + CTLFLAG_RW, &sc->bge_forced_collapse, 0, + "Number of fragmented TX buffers of a frame allowed before " + "forced collapsing"); + resource_int_value(device_get_name(sc->bge_dev), + device_get_unit(sc->bge_dev), "forced_collapse", + &sc->bge_forced_collapse); + if (BGE_IS_5705_PLUS(sc)) return; @@ -4611,7 +4983,7 @@ bge_add_sysctls(struct bge_softc *sc) BGE_SYSCTL_STAT(sc, ctx, "Multiple Collision Frames", children, txstats.dot3StatsMultipleCollisionFrames, "MultipleCollisionFrames"); - BGE_SYSCTL_STAT(sc, ctx, "Deferred Transmissions", + BGE_SYSCTL_STAT(sc, ctx, "Deferred Transmissions", children, txstats.dot3StatsDeferredTransmissions, "DeferredTransmissions"); BGE_SYSCTL_STAT(sc, ctx, "Excessive Collisions", @@ -4620,7 +4992,7 @@ bge_add_sysctls(struct bge_softc *sc) BGE_SYSCTL_STAT(sc, ctx, "Late Collisions", children, txstats.dot3StatsLateCollisions, "LateCollisions"); - BGE_SYSCTL_STAT(sc, ctx, "Outbound Unicast Packets", + BGE_SYSCTL_STAT(sc, ctx, "Outbound Unicast Packets", children, txstats.ifHCOutUcastPkts, "UcastPkts"); BGE_SYSCTL_STAT(sc, ctx, "Outbound Multicast Packets", children, txstats.ifHCOutMulticastPkts, "MulticastPkts"); @@ -4689,6 +5061,8 @@ bge_sysctl_debug_info(SYSCTL_HANDLER_ARGS) } printf("Hardware Flags:\n"); + if (BGE_IS_5755_PLUS(sc)) + printf(" - 5755 Plus\n"); if (BGE_IS_575X_PLUS(sc)) printf(" - 575X Plus\n"); if (BGE_IS_5705_PLUS(sc)) diff --git a/sys/dev/bge/if_bgereg.h b/sys/dev/bge/if_bgereg.h index 66e36b57c159..e7388bf9f965 100644 --- a/sys/dev/bge/if_bgereg.h +++ b/sys/dev/bge/if_bgereg.h @@ -218,6 +218,7 @@ #define BGE_PCI_UNDI_TX_BD_PRODIDX_LO 0xAC #define BGE_PCI_ISR_MBX_HI 0xB0 #define BGE_PCI_ISR_MBX_LO 0xB4 +#define BGE_PCI_PRODID_ASICREV 0xBC /* PCI Misc. Host control register */ #define BGE_PCIMISCCTL_CLEAR_INTA 0x00000001 @@ -229,6 +230,7 @@ #define BGE_PCIMISCCTL_REG_WORDSWAP 0x00000040 #define BGE_PCIMISCCTL_INDIRECT_ACCESS 0x00000080 #define BGE_PCIMISCCTL_ASICREV 0xFFFF0000 +#define BGE_PCIMISCCTL_ASICREV_SHIFT 16 #define BGE_HIF_SWAP_OPTIONS (BGE_PCIMISCCTL_ENDIAN_WORDSWAP) #if BYTE_ORDER == LITTLE_ENDIAN @@ -245,66 +247,72 @@ (BGE_HIF_SWAP_OPTIONS|BGE_PCIMISCCTL_CLEAR_INTA| \ BGE_PCIMISCCTL_MASK_PCI_INTR|BGE_PCIMISCCTL_INDIRECT_ACCESS) -#define BGE_CHIPID_TIGON_I 0x40000000 -#define BGE_CHIPID_TIGON_II 0x60000000 -#define BGE_CHIPID_BCM5700_A0 0x70000000 -#define BGE_CHIPID_BCM5700_A1 0x70010000 -#define BGE_CHIPID_BCM5700_B0 0x71000000 -#define BGE_CHIPID_BCM5700_B1 0x71010000 -#define BGE_CHIPID_BCM5700_B2 0x71020000 -#define BGE_CHIPID_BCM5700_B3 0x71030000 -#define BGE_CHIPID_BCM5700_ALTIMA 0x71040000 -#define BGE_CHIPID_BCM5700_C0 0x72000000 -#define BGE_CHIPID_BCM5701_A0 0x00000000 /* grrrr */ -#define BGE_CHIPID_BCM5701_B0 0x01000000 -#define BGE_CHIPID_BCM5701_B2 0x01020000 -#define BGE_CHIPID_BCM5701_B5 0x01050000 -#define BGE_CHIPID_BCM5703_A0 0x10000000 -#define BGE_CHIPID_BCM5703_A1 0x10010000 -#define BGE_CHIPID_BCM5703_A2 0x10020000 -#define BGE_CHIPID_BCM5703_A3 0x10030000 -#define BGE_CHIPID_BCM5703_B0 0x11000000 -#define BGE_CHIPID_BCM5704_A0 0x20000000 -#define BGE_CHIPID_BCM5704_A1 0x20010000 -#define BGE_CHIPID_BCM5704_A2 0x20020000 -#define BGE_CHIPID_BCM5704_A3 0x20030000 -#define BGE_CHIPID_BCM5704_B0 0x21000000 -#define BGE_CHIPID_BCM5705_A0 0x30000000 -#define BGE_CHIPID_BCM5705_A1 0x30010000 -#define BGE_CHIPID_BCM5705_A2 0x30020000 -#define BGE_CHIPID_BCM5705_A3 0x30030000 -#define BGE_CHIPID_BCM5750_A0 0x40000000 -#define BGE_CHIPID_BCM5750_A1 0x40010000 -#define BGE_CHIPID_BCM5750_A3 0x40030000 -#define BGE_CHIPID_BCM5750_B0 0x41000000 -#define BGE_CHIPID_BCM5750_B1 0x41010000 -#define BGE_CHIPID_BCM5750_C0 0x42000000 -#define BGE_CHIPID_BCM5750_C1 0x42010000 -#define BGE_CHIPID_BCM5750_C2 0x42020000 -#define BGE_CHIPID_BCM5714_A0 0x50000000 -#define BGE_CHIPID_BCM5752_A0 0x60000000 -#define BGE_CHIPID_BCM5752_A1 0x60010000 -#define BGE_CHIPID_BCM5752_A2 0x60020000 -#define BGE_CHIPID_BCM5714_B0 0x80000000 -#define BGE_CHIPID_BCM5714_B3 0x80030000 -#define BGE_CHIPID_BCM5715_A0 0x90000000 -#define BGE_CHIPID_BCM5715_A1 0x90010000 -#define BGE_CHIPID_BCM5715_A3 0x90030000 -#define BGE_CHIPID_BCM5755_A0 0xa0000000 -#define BGE_CHIPID_BCM5755_A1 0xa0010000 -#define BGE_CHIPID_BCM5755_A2 0xa0020000 -#define BGE_CHIPID_BCM5722_A0 0xa2000000 -#define BGE_CHIPID_BCM5754_A0 0xb0000000 -#define BGE_CHIPID_BCM5754_A1 0xb0010000 -#define BGE_CHIPID_BCM5754_A2 0xb0020000 -#define BGE_CHIPID_BCM5787_A0 0xb0000000 -#define BGE_CHIPID_BCM5787_A1 0xb0010000 -#define BGE_CHIPID_BCM5787_A2 0xb0020000 -#define BGE_CHIPID_BCM5906_A1 0xc0010000 -#define BGE_CHIPID_BCM5906_A2 0xc0020000 +#define BGE_CHIPID_TIGON_I 0x4000 +#define BGE_CHIPID_TIGON_II 0x6000 +#define BGE_CHIPID_BCM5700_A0 0x7000 +#define BGE_CHIPID_BCM5700_A1 0x7001 +#define BGE_CHIPID_BCM5700_B0 0x7100 +#define BGE_CHIPID_BCM5700_B1 0x7101 +#define BGE_CHIPID_BCM5700_B2 0x7102 +#define BGE_CHIPID_BCM5700_B3 0x7103 +#define BGE_CHIPID_BCM5700_ALTIMA 0x7104 +#define BGE_CHIPID_BCM5700_C0 0x7200 +#define BGE_CHIPID_BCM5701_A0 0x0000 /* grrrr */ +#define BGE_CHIPID_BCM5701_B0 0x0100 +#define BGE_CHIPID_BCM5701_B2 0x0102 +#define BGE_CHIPID_BCM5701_B5 0x0105 +#define BGE_CHIPID_BCM5703_A0 0x1000 +#define BGE_CHIPID_BCM5703_A1 0x1001 +#define BGE_CHIPID_BCM5703_A2 0x1002 +#define BGE_CHIPID_BCM5703_A3 0x1003 +#define BGE_CHIPID_BCM5703_B0 0x1100 +#define BGE_CHIPID_BCM5704_A0 0x2000 +#define BGE_CHIPID_BCM5704_A1 0x2001 +#define BGE_CHIPID_BCM5704_A2 0x2002 +#define BGE_CHIPID_BCM5704_A3 0x2003 +#define BGE_CHIPID_BCM5704_B0 0x2100 +#define BGE_CHIPID_BCM5705_A0 0x3000 +#define BGE_CHIPID_BCM5705_A1 0x3001 +#define BGE_CHIPID_BCM5705_A2 0x3002 +#define BGE_CHIPID_BCM5705_A3 0x3003 +#define BGE_CHIPID_BCM5750_A0 0x4000 +#define BGE_CHIPID_BCM5750_A1 0x4001 +#define BGE_CHIPID_BCM5750_A3 0x4000 +#define BGE_CHIPID_BCM5750_B0 0x4100 +#define BGE_CHIPID_BCM5750_B1 0x4101 +#define BGE_CHIPID_BCM5750_C0 0x4200 +#define BGE_CHIPID_BCM5750_C1 0x4201 +#define BGE_CHIPID_BCM5750_C2 0x4202 +#define BGE_CHIPID_BCM5714_A0 0x5000 +#define BGE_CHIPID_BCM5752_A0 0x6000 +#define BGE_CHIPID_BCM5752_A1 0x6001 +#define BGE_CHIPID_BCM5752_A2 0x6002 +#define BGE_CHIPID_BCM5714_B0 0x8000 +#define BGE_CHIPID_BCM5714_B3 0x8003 +#define BGE_CHIPID_BCM5715_A0 0x9000 +#define BGE_CHIPID_BCM5715_A1 0x9001 +#define BGE_CHIPID_BCM5715_A3 0x9003 +#define BGE_CHIPID_BCM5755_A0 0xa000 +#define BGE_CHIPID_BCM5755_A1 0xa001 +#define BGE_CHIPID_BCM5755_A2 0xa002 +#define BGE_CHIPID_BCM5722_A0 0xa200 +#define BGE_CHIPID_BCM5754_A0 0xb000 +#define BGE_CHIPID_BCM5754_A1 0xb001 +#define BGE_CHIPID_BCM5754_A2 0xb002 +#define BGE_CHIPID_BCM5761_A0 0x5761000 +#define BGE_CHIPID_BCM5761_A1 0x5761100 +#define BGE_CHIPID_BCM5784_A0 0x5784000 +#define BGE_CHIPID_BCM5784_A1 0x5784100 +#define BGE_CHIPID_BCM5787_A0 0xb000 +#define BGE_CHIPID_BCM5787_A1 0xb001 +#define BGE_CHIPID_BCM5787_A2 0xb002 +#define BGE_CHIPID_BCM5906_A1 0xc001 +#define BGE_CHIPID_BCM5906_A2 0xc002 +#define BGE_CHIPID_BCM57780_A0 0x57780000 +#define BGE_CHIPID_BCM57780_A1 0x57780001 /* shorthand one */ -#define BGE_ASICREV(x) ((x) >> 28) +#define BGE_ASICREV(x) ((x) >> 12) #define BGE_ASICREV_BCM5701 0x00 #define BGE_ASICREV_BCM5703 0x01 #define BGE_ASICREV_BCM5704 0x02 @@ -319,9 +327,16 @@ #define BGE_ASICREV_BCM5754 0x0b #define BGE_ASICREV_BCM5787 0x0b #define BGE_ASICREV_BCM5906 0x0c +/* Should consult BGE_PCI_PRODID_ASICREV for ChipID */ +#define BGE_ASICREV_USE_PRODID_REG 0x0f +/* BGE_PCI_PRODID_ASICREV ASIC rev. identifiers. */ +#define BGE_ASICREV_BCM5761 0x5761 +#define BGE_ASICREV_BCM5784 0x5784 +#define BGE_ASICREV_BCM5785 0x5785 +#define BGE_ASICREV_BCM57780 0x57780 /* chip revisions */ -#define BGE_CHIPREV(x) ((x) >> 24) +#define BGE_CHIPREV(x) ((x) >> 8) #define BGE_CHIPREV_5700_AX 0x70 #define BGE_CHIPREV_5700_BX 0x71 #define BGE_CHIPREV_5700_CX 0x72 @@ -331,6 +346,9 @@ #define BGE_CHIPREV_5704_BX 0x21 #define BGE_CHIPREV_5750_AX 0x40 #define BGE_CHIPREV_5750_BX 0x41 +/* BGE_PCI_PRODID_ASICREV chip rev. identifiers. */ +#define BGE_CHIPREV_5761_AX 0x57611 +#define BGE_CHIPREV_5784_AX 0x57841 /* PCI DMA Read/Write Control register */ #define BGE_PCIDMARWCTL_MINDMA 0x000000FF @@ -861,6 +879,7 @@ #define BGE_SDCMODE_RESET 0x00000001 #define BGE_SDCMODE_ENABLE 0x00000002 #define BGE_SDCMODE_ATTN 0x00000004 +#define BGE_SDCMODE_CDELAY 0x00000010 /* Send Data completion status register */ #define BGE_SDCSTAT_ATTN 0x00000004 @@ -1378,8 +1397,13 @@ #define BGE_RDMAMODE_PCI_FIFOOREAD_ATTN 0x00000100 #define BGE_RDMAMODE_LOCWRITE_TOOBIG 0x00000200 #define BGE_RDMAMODE_ALL_ATTNS 0x000003FC +#define BGE_RDMAMODE_BD_SBD_CRPT_ATTN 0x00000800 +#define BGE_RDMAMODE_MBUF_RBD_CRPT_ATTN 0x00001000 +#define BGE_RDMAMODE_MBUF_SBD_CRPT_ATTN 0x00002000 #define BGE_RDMAMODE_FIFO_SIZE_128 0x00020000 #define BGE_RDMAMODE_FIFO_LONG_BURST 0x00030000 +#define BGE_RDMAMODE_TSO4_ENABLE 0x08000000 +#define BGE_RDMAMODE_TSO6_ENABLE 0x10000000 /* Read DMA status register */ #define BGE_RDMASTAT_PCI_TGT_ABRT_ATTN 0x00000004 @@ -1409,6 +1433,7 @@ #define BGE_WDMAMODE_PCI_FIFOOREAD_ATTN 0x00000100 #define BGE_WDMAMODE_LOCREAD_TOOBIG 0x00000200 #define BGE_WDMAMODE_ALL_ATTNS 0x000003FC +#define BGE_WDMAMODE_STATUS_TAG_FIX 0x20000000 /* Write DMA status register */ #define BGE_WDMASTAT_PCI_TGT_ABRT_ATTN 0x00000004 @@ -1682,11 +1707,8 @@ /* MSI mode register */ #define BGE_MSIMODE_RESET 0x00000001 #define BGE_MSIMODE_ENABLE 0x00000002 -#define BGE_MSIMODE_PCI_TGT_ABRT_ATTN 0x00000004 -#define BGE_MSIMODE_PCI_MSTR_ABRT_ATTN 0x00000008 -#define BGE_MSIMODE_PCI_PERR_ATTN 0x00000010 -#define BGE_MSIMODE_MSI_FIFOUFLOW_ATTN 0x00000020 -#define BGE_MSIMODE_MSI_FIFOOFLOW_ATTN 0x00000040 +#define BGE_MSIMODE_ONE_SHOT_DISABLE 0x00000020 +#define BGE_MSIMODE_MULTIVEC_ENABLE 0x00000080 /* MSI status register */ #define BGE_MSISTAT_PCI_TGT_ABRT_ATTN 0x00000004 @@ -1887,7 +1909,7 @@ /* * This magic number is written to the firmware mailbox at 0xb50 * before a software reset is issued. After the internal firmware - * has completed its initialization it will write the opposite of + * has completed its initialization it will write the opposite of * this value, ~BGE_MAGIC_NUMBER, to the same location, allowing the * driver to synchronize with the firmware. */ @@ -1929,11 +1951,11 @@ struct bge_tx_bd { uint16_t bge_flags; uint16_t bge_len; uint16_t bge_vlan_tag; - uint16_t bge_rsvd; + uint16_t bge_mss; #else uint16_t bge_len; uint16_t bge_flags; - uint16_t bge_rsvd; + uint16_t bge_mss; uint16_t bge_vlan_tag; #endif }; @@ -2101,6 +2123,7 @@ struct bge_status_block { #define BCOM_DEVICEID_BCM5720 0x1658 #define BCOM_DEVICEID_BCM5721 0x1659 #define BCOM_DEVICEID_BCM5722 0x165A +#define BCOM_DEVICEID_BCM5723 0x165B #define BCOM_DEVICEID_BCM5750 0x1676 #define BCOM_DEVICEID_BCM5750M 0x167C #define BCOM_DEVICEID_BCM5751 0x1677 @@ -2115,13 +2138,23 @@ struct bge_status_block { #define BCOM_DEVICEID_BCM5754M 0x1672 #define BCOM_DEVICEID_BCM5755 0x167B #define BCOM_DEVICEID_BCM5755M 0x1673 +#define BCOM_DEVICEID_BCM5756 0x1674 +#define BCOM_DEVICEID_BCM5761 0x1681 +#define BCOM_DEVICEID_BCM5761E 0x1680 +#define BCOM_DEVICEID_BCM5761S 0x1688 +#define BCOM_DEVICEID_BCM5761SE 0x1689 +#define BCOM_DEVICEID_BCM5764 0x1684 #define BCOM_DEVICEID_BCM5780 0x166A #define BCOM_DEVICEID_BCM5780S 0x166B #define BCOM_DEVICEID_BCM5781 0x16DD #define BCOM_DEVICEID_BCM5782 0x1696 +#define BCOM_DEVICEID_BCM5784 0x1698 +#define BCOM_DEVICEID_BCM5785F 0x16a0 +#define BCOM_DEVICEID_BCM5785G 0x1699 #define BCOM_DEVICEID_BCM5786 0x169A #define BCOM_DEVICEID_BCM5787 0x169B #define BCOM_DEVICEID_BCM5787M 0x1693 +#define BCOM_DEVICEID_BCM5787F 0x167f #define BCOM_DEVICEID_BCM5788 0x169C #define BCOM_DEVICEID_BCM5789 0x169D #define BCOM_DEVICEID_BCM5901 0x170D @@ -2129,6 +2162,10 @@ struct bge_status_block { #define BCOM_DEVICEID_BCM5903M 0x16FF #define BCOM_DEVICEID_BCM5906 0x1712 #define BCOM_DEVICEID_BCM5906M 0x1713 +#define BCOM_DEVICEID_BCM57760 0x1690 +#define BCOM_DEVICEID_BCM57780 0x1692 +#define BCOM_DEVICEID_BCM57788 0x1691 +#define BCOM_DEVICEID_BCM57790 0x1694 /* * Alteon AceNIC PCI vendor/device ID. @@ -2178,6 +2215,14 @@ struct bge_status_block { */ #define SUN_VENDORID 0x108e +/* + * Fujitsu vendor/device IDs + */ +#define FJTSU_VENDORID 0x10cf +#define FJTSU_DEVICEID_PW008GE5 0x11a1 +#define FJTSU_DEVICEID_PW008GE4 0x11a2 +#define FJTSU_DEVICEID_PP250450 0x11cc /* PRIMEPOWER250/450 LAN */ + /* * Offset of MAC address inside EEPROM. */ @@ -2439,15 +2484,16 @@ struct bge_gib { #define BGE_MSLOTS 256 #define BGE_JSLOTS 384 -#define BGE_JRAWLEN (BGE_JUMBO_FRAMELEN + ETHER_ALIGN) -#define BGE_JLEN (BGE_JRAWLEN + (sizeof(uint64_t) - \ - (BGE_JRAWLEN % sizeof(uint64_t)))) -#define BGE_JPAGESZ PAGE_SIZE -#define BGE_RESID (BGE_JPAGESZ - (BGE_JLEN * BGE_JSLOTS) % BGE_JPAGESZ) -#define BGE_JMEM ((BGE_JLEN * BGE_JSLOTS) + BGE_RESID) - #define BGE_NSEG_JUMBO 4 -#define BGE_NSEG_NEW 32 +#define BGE_NSEG_NEW 32 +#define BGE_TSOSEG_SZ 4096 + +/* Maximum DMA address for controllers that have 40bit DMA address bug. */ +#if (BUS_SPACE_MAXADDR < 0xFFFFFFFFFF) +#define BGE_DMA_MAXADDR BUS_SPACE_MAXADDR +#else +#define BGE_DMA_MAXADDR 0xFFFFFFFFFF +#endif /* * Ring structures. Most of these reside in host memory and we tell @@ -2498,10 +2544,13 @@ struct bge_chain_data { bus_dma_tag_t bge_tx_ring_tag; bus_dma_tag_t bge_status_tag; bus_dma_tag_t bge_stats_tag; - bus_dma_tag_t bge_mtag; /* mbuf mapping tag */ - bus_dma_tag_t bge_mtag_jumbo; /* mbuf mapping tag */ + bus_dma_tag_t bge_rx_mtag; /* Rx mbuf mapping tag */ + bus_dma_tag_t bge_tx_mtag; /* Tx mbuf mapping tag */ + bus_dma_tag_t bge_mtag_jumbo; /* Jumbo mbuf mapping tag */ bus_dmamap_t bge_tx_dmamap[BGE_TX_RING_CNT]; + bus_dmamap_t bge_rx_std_sparemap; bus_dmamap_t bge_rx_std_dmamap[BGE_STD_RX_RING_CNT]; + bus_dmamap_t bge_rx_jumbo_sparemap; bus_dmamap_t bge_rx_jumbo_dmamap[BGE_JUMBO_RX_RING_CNT]; bus_dmamap_t bge_rx_std_ring_map; bus_dmamap_t bge_rx_jumbo_ring_map; @@ -2546,18 +2595,26 @@ struct bge_softc { struct resource *bge_irq; struct resource *bge_res; struct ifmedia bge_ifmedia; /* TBI media info */ + int bge_expcap; + int bge_msicap; + int bge_pcixcap; uint32_t bge_flags; #define BGE_FLAG_TBI 0x00000001 #define BGE_FLAG_JUMBO 0x00000002 #define BGE_FLAG_WIRESPEED 0x00000004 #define BGE_FLAG_EADDR 0x00000008 +#define BGE_FLAG_MII_SERDES 0x00000010 #define BGE_FLAG_MSI 0x00000100 #define BGE_FLAG_PCIX 0x00000200 #define BGE_FLAG_PCIE 0x00000400 +#define BGE_FLAG_TSO 0x00000800 #define BGE_FLAG_5700_FAMILY 0x00001000 #define BGE_FLAG_5705_PLUS 0x00002000 #define BGE_FLAG_5714_FAMILY 0x00004000 #define BGE_FLAG_575X_PLUS 0x00008000 +#define BGE_FLAG_5755_PLUS 0x00010000 +#define BGE_FLAG_40BIT_BUG 0x00020000 +#define BGE_FLAG_4G_BNDRY_BUG 0x00040000 #define BGE_FLAG_RX_ALIGNBUG 0x00100000 #define BGE_FLAG_NO_3LED 0x00200000 #define BGE_FLAG_ADC_BUG 0x00400000 @@ -2568,8 +2625,8 @@ struct bge_softc { #define BGE_FLAG_CRC_BUG 0x08000000 #define BGE_FLAG_5788 0x20000000 uint32_t bge_chipid; - uint8_t bge_asicrev; - uint8_t bge_chiprev; + uint32_t bge_asicrev; + uint32_t bge_chiprev; uint8_t bge_asf_mode; uint8_t bge_asf_count; struct bge_ring_data bge_ldata; /* rings */ @@ -2592,6 +2649,7 @@ struct bge_softc { int bge_link; /* link state */ int bge_link_evt; /* pending link event */ int bge_timer; + int bge_forced_collapse; struct callout bge_stat_ch; uint32_t bge_rx_discards; uint32_t bge_tx_discards; @@ -2599,6 +2657,8 @@ struct bge_softc { #ifdef DEVICE_POLLING int rxcycles; #endif /* DEVICE_POLLING */ + struct task bge_intr_task; + struct taskqueue *bge_tq; }; #define BGE_LOCK_INIT(_sc, _name) \ diff --git a/sys/dev/bktr/bktr_i2c.c b/sys/dev/bktr/bktr_i2c.c index 403225818eae..06a65473084e 100644 --- a/sys/dev/bktr/bktr_i2c.c +++ b/sys/dev/bktr/bktr_i2c.c @@ -331,7 +331,7 @@ bti2c_smb_readb(device_t dev, u_char slave, char cmd, char *byte) /* clear status bits */ OUTL(sc,BKTR_INT_STAT, (BT848_INT_RACK | BT848_INT_I2CDONE)); - OUTL(sc,BKTR_I2C_DATA_CTL, ((slave & 0xff) << 24) | (u_char)cmd);; + OUTL(sc,BKTR_I2C_DATA_CTL, ((slave & 0xff) << 24) | (u_char)cmd); BTI2C_DEBUG(printf("r%lx/", (u_long)(((slave & 0xff) << 24) | (u_char)cmd))); diff --git a/sys/dev/bktr/bktr_os.c b/sys/dev/bktr/bktr_os.c index 327c4bbdb959..b667700228d2 100644 --- a/sys/dev/bktr/bktr_os.c +++ b/sys/dev/bktr/bktr_os.c @@ -794,7 +794,8 @@ bktr_ioctl( struct cdev *dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct thr * */ static int -bktr_mmap( struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot ) +bktr_mmap( struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr ) { int unit; bktr_ptr_t bktr; diff --git a/sys/dev/bwi/if_bwi.c b/sys/dev/bwi/if_bwi.c index 327b7368b773..2604d8389ed5 100644 --- a/sys/dev/bwi/if_bwi.c +++ b/sys/dev/bwi/if_bwi.c @@ -106,7 +106,7 @@ static void bwi_start(struct ifnet *); static void bwi_start_locked(struct ifnet *); static int bwi_raw_xmit(struct ieee80211_node *, struct mbuf *, const struct ieee80211_bpf_params *); -static void bwi_watchdog(struct ifnet *); +static void bwi_watchdog(void *); static void bwi_scan_start(struct ieee80211com *); static void bwi_set_channel(struct ieee80211com *); static void bwi_scan_end(struct ieee80211com *); @@ -464,10 +464,10 @@ bwi_attach(struct bwi_softc *sc) ifp->if_init = bwi_init; ifp->if_ioctl = bwi_ioctl; ifp->if_start = bwi_start; - ifp->if_watchdog = bwi_watchdog; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); + callout_init_mtx(&sc->sc_watchdog_timer, &sc->sc_mtx, 0); /* * Setup ratesets, phytype, channels and get MAC address @@ -581,6 +581,7 @@ bwi_detach(struct bwi_softc *sc) bwi_stop(sc, 1); callout_drain(&sc->sc_led_blink_ch); callout_drain(&sc->sc_calib_ch); + callout_drain(&sc->sc_watchdog_timer); ieee80211_ifdetach(ic); for (i = 0; i < sc->sc_nmac; ++i) @@ -1295,6 +1296,7 @@ bwi_init_statechg(struct bwi_softc *sc, int statechg) sc->sc_flags &= ~BWI_F_STOP; ifp->if_drv_flags |= IFF_DRV_RUNNING; + callout_reset(&sc->sc_watchdog_timer, hz, bwi_watchdog, sc); /* Enable intrs */ bwi_enable_intrs(sc, BWI_INIT_INTRS); @@ -1433,7 +1435,7 @@ bwi_start_locked(struct ifnet *ifp) tbd->tbd_idx = idx; if (trans) - ifp->if_timer = 5; + sc->sc_tx_timer = 5; } static int @@ -1474,7 +1476,7 @@ bwi_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, if (++tbd->tbd_used + BWI_TX_NSPRDESC >= BWI_TX_NDESC) ifp->if_drv_flags |= IFF_DRV_OACTIVE; tbd->tbd_idx = (idx + 1) % BWI_TX_NDESC; - ifp->if_timer = 5; + sc->sc_tx_timer = 5; } else { /* NB: m is reclaimed on encap failure */ ieee80211_free_node(ni); @@ -1485,17 +1487,20 @@ bwi_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, } static void -bwi_watchdog(struct ifnet *ifp) +bwi_watchdog(void *arg) { - struct bwi_softc *sc = ifp->if_softc; + struct bwi_softc *sc; + struct ifnet *ifp; - BWI_LOCK(sc); - if ((ifp->if_drv_flags & IFF_DRV_RUNNING)) { + sc = arg; + ifp = sc->sc_ifp; + BWI_ASSERT_LOCKED(sc); + if (sc->sc_tx_timer != 0 && --sc->sc_tx_timer == 0) { if_printf(ifp, "watchdog timeout\n"); ifp->if_oerrors++; taskqueue_enqueue(sc->sc_tq, &sc->sc_restart_task); } - BWI_UNLOCK(sc); + callout_reset(&sc->sc_watchdog_timer, hz, bwi_watchdog, sc); } static void @@ -1551,7 +1556,7 @@ bwi_stop_locked(struct bwi_softc *sc, int statechg) bwi_bbp_power_off(sc); sc->sc_tx_timer = 0; - ifp->if_timer = 0; + callout_stop(&sc->sc_watchdog_timer); ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); } @@ -3420,7 +3425,7 @@ _bwi_txeof(struct bwi_softc *sc, uint16_t tx_id, int acked, int data_txcnt) tb->tb_mbuf = NULL; if (tbd->tbd_used == 0) - ifp->if_timer = 0; + sc->sc_tx_timer = 0; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; } @@ -3922,7 +3927,7 @@ bwi_led_attach(struct bwi_softc *sc) "%dth led, act %d, lowact %d\n", i, led->l_act, led->l_flags & BWI_LED_F_ACTLOW); } - callout_init(&sc->sc_led_blink_ch, CALLOUT_MPSAFE); + callout_init_mtx(&sc->sc_led_blink_ch, &sc->sc_mtx, 0); } static __inline uint16_t diff --git a/sys/dev/bwi/if_bwivar.h b/sys/dev/bwi/if_bwivar.h index af4b0ea5cc12..22a1b1ebb039 100644 --- a/sys/dev/bwi/if_bwivar.h +++ b/sys/dev/bwi/if_bwivar.h @@ -578,6 +578,7 @@ struct bwi_softc { bus_space_handle_t sc_mem_bh; struct callout sc_calib_ch; + struct callout sc_watchdog_timer; struct bwi_regwin *sc_cur_regwin; struct bwi_regwin sc_com_regwin; diff --git a/sys/dev/bwn/if_bwn.c b/sys/dev/bwn/if_bwn.c new file mode 100644 index 000000000000..7d1e66344500 --- /dev/null +++ b/sys/dev/bwn/if_bwn.c @@ -0,0 +1,14342 @@ +/*- + * Copyright (c) 2009-2010 Weongyo Jeong + * 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, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * The Broadcom Wireless LAN controller driver. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +SYSCTL_NODE(_hw, OID_AUTO, bwn, CTLFLAG_RD, 0, "Broadcom driver parameters"); + +/* + * Tunable & sysctl variables. + */ + +#ifdef BWN_DEBUG +static int bwn_debug = 0; +SYSCTL_INT(_hw_bwn, OID_AUTO, debug, CTLFLAG_RW, &bwn_debug, 0, + "Broadcom debugging printfs"); +TUNABLE_INT("hw.bwn.debug", &bwn_debug); +enum { + BWN_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ + BWN_DEBUG_RECV = 0x00000002, /* basic recv operation */ + BWN_DEBUG_STATE = 0x00000004, /* 802.11 state transitions */ + BWN_DEBUG_TXPOW = 0x00000008, /* tx power processing */ + BWN_DEBUG_RESET = 0x00000010, /* reset processing */ + BWN_DEBUG_OPS = 0x00000020, /* bwn_ops processing */ + BWN_DEBUG_BEACON = 0x00000040, /* beacon handling */ + BWN_DEBUG_WATCHDOG = 0x00000080, /* watchdog timeout */ + BWN_DEBUG_INTR = 0x00000100, /* ISR */ + BWN_DEBUG_CALIBRATE = 0x00000200, /* periodic calibration */ + BWN_DEBUG_NODE = 0x00000400, /* node management */ + BWN_DEBUG_LED = 0x00000800, /* led management */ + BWN_DEBUG_CMD = 0x00001000, /* cmd submission */ + BWN_DEBUG_LO = 0x00002000, /* LO */ + BWN_DEBUG_FW = 0x00004000, /* firmware */ + BWN_DEBUG_WME = 0x00008000, /* WME */ + BWN_DEBUG_RF = 0x00010000, /* RF */ + BWN_DEBUG_FATAL = 0x80000000, /* fatal errors */ + BWN_DEBUG_ANY = 0xffffffff +}; +#define DPRINTF(sc, m, fmt, ...) do { \ + if (sc->sc_debug & (m)) \ + printf(fmt, __VA_ARGS__); \ +} while (0) +#else +#define DPRINTF(sc, m, fmt, ...) do { (void) sc; } while (0) +#endif + +static int bwn_bfp = 0; /* use "Bad Frames Preemption" */ +SYSCTL_INT(_hw_bwn, OID_AUTO, bfp, CTLFLAG_RW, &bwn_bfp, 0, + "uses Bad Frames Preemption"); +static int bwn_bluetooth = 1; +SYSCTL_INT(_hw_bwn, OID_AUTO, bluetooth, CTLFLAG_RW, &bwn_bluetooth, 0, + "turns on Bluetooth Coexistence"); +static int bwn_hwpctl = 0; +SYSCTL_INT(_hw_bwn, OID_AUTO, hwpctl, CTLFLAG_RW, &bwn_hwpctl, 0, + "uses H/W power control"); +static int bwn_msi_disable = 0; /* MSI disabled */ +TUNABLE_INT("hw.bwn.msi_disable", &bwn_msi_disable); +static int bwn_usedma = 1; +SYSCTL_INT(_hw_bwn, OID_AUTO, usedma, CTLFLAG_RD, &bwn_usedma, 0, + "uses DMA"); +TUNABLE_INT("hw.bwn.usedma", &bwn_usedma); +static int bwn_wme = 1; +SYSCTL_INT(_hw_bwn, OID_AUTO, wme, CTLFLAG_RW, &bwn_wme, 0, + "uses WME support"); + +static int bwn_attach_pre(struct bwn_softc *); +static int bwn_attach_post(struct bwn_softc *); +static void bwn_sprom_bugfixes(struct siba_softc *); +static void bwn_init(void *); +static int bwn_init_locked(struct bwn_softc *); +static int bwn_ioctl(struct ifnet *, u_long, caddr_t); +static void bwn_start(struct ifnet *); +static int bwn_attach_core(struct bwn_mac *); +static void bwn_reset_core(struct bwn_mac *, uint32_t); +static int bwn_phy_getinfo(struct bwn_mac *, int); +static int bwn_chiptest(struct bwn_mac *); +static int bwn_setup_channels(struct bwn_mac *, int, int); +static int bwn_phy_g_attach(struct bwn_mac *); +static void bwn_phy_g_detach(struct bwn_mac *); +static void bwn_phy_g_init_pre(struct bwn_mac *); +static int bwn_phy_g_prepare_hw(struct bwn_mac *); +static int bwn_phy_g_init(struct bwn_mac *); +static void bwn_phy_g_exit(struct bwn_mac *); +static uint16_t bwn_phy_g_read(struct bwn_mac *, uint16_t); +static void bwn_phy_g_write(struct bwn_mac *, uint16_t, + uint16_t); +static uint16_t bwn_phy_g_rf_read(struct bwn_mac *, uint16_t); +static void bwn_phy_g_rf_write(struct bwn_mac *, uint16_t, + uint16_t); +static int bwn_phy_g_hwpctl(struct bwn_mac *); +static void bwn_phy_g_rf_onoff(struct bwn_mac *, int); +static int bwn_phy_g_switch_channel(struct bwn_mac *, uint32_t); +static uint32_t bwn_phy_g_get_default_chan(struct bwn_mac *); +static void bwn_phy_g_set_antenna(struct bwn_mac *, int); +static int bwn_phy_g_im(struct bwn_mac *, int); +static int bwn_phy_g_recalc_txpwr(struct bwn_mac *, int); +static void bwn_phy_g_set_txpwr(struct bwn_mac *); +static void bwn_phy_g_task_15s(struct bwn_mac *); +static void bwn_phy_g_task_60s(struct bwn_mac *); +static uint16_t bwn_phy_g_txctl(struct bwn_mac *); +static void bwn_phy_switch_analog(struct bwn_mac *, int); +static uint16_t bwn_shm_read_2(struct bwn_mac *, uint16_t, uint16_t); +static void bwn_shm_write_2(struct bwn_mac *, uint16_t, uint16_t, + uint16_t); +static uint32_t bwn_shm_read_4(struct bwn_mac *, uint16_t, uint16_t); +static void bwn_shm_write_4(struct bwn_mac *, uint16_t, uint16_t, + uint32_t); +static void bwn_shm_ctlword(struct bwn_mac *, uint16_t, + uint16_t); +static void bwn_addchannels(struct ieee80211_channel [], int, int *, + const struct bwn_channelinfo *, int); +static int bwn_raw_xmit(struct ieee80211_node *, struct mbuf *, + const struct ieee80211_bpf_params *); +static void bwn_newassoc(struct ieee80211_node *, int); +static void bwn_updateslot(struct ifnet *); +static void bwn_update_promisc(struct ifnet *); +static void bwn_wme_init(struct bwn_mac *); +static int bwn_wme_update(struct ieee80211com *); +static struct ieee80211_node *bwn_node_alloc(struct ieee80211vap *, + const uint8_t [IEEE80211_ADDR_LEN]); +static void bwn_wme_clear(struct bwn_softc *); +static void bwn_wme_load(struct bwn_mac *); +static void bwn_wme_loadparams(struct bwn_mac *, + const struct wmeParams *, uint16_t); +static void bwn_node_cleanup(struct ieee80211_node *); +static void bwn_scan_start(struct ieee80211com *); +static void bwn_scan_end(struct ieee80211com *); +static void bwn_set_channel(struct ieee80211com *); +static struct ieee80211vap *bwn_vap_create(struct ieee80211com *, + const char [IFNAMSIZ], int, int, + int, const uint8_t [IEEE80211_ADDR_LEN], + const uint8_t [IEEE80211_ADDR_LEN]); +static void bwn_vap_delete(struct ieee80211vap *); +static void bwn_stop(struct bwn_softc *, int); +static void bwn_stop_locked(struct bwn_softc *, int); +static int bwn_core_init(struct bwn_mac *); +static void bwn_core_start(struct bwn_mac *); +static void bwn_core_exit(struct bwn_mac *); +static void bwn_fix_imcfglobug(struct bwn_mac *); +static void bwn_bt_disable(struct bwn_mac *); +static int bwn_chip_init(struct bwn_mac *); +static uint64_t bwn_hf_read(struct bwn_mac *); +static void bwn_hf_write(struct bwn_mac *, uint64_t); +static void bwn_set_txretry(struct bwn_mac *, int, int); +static void bwn_rate_init(struct bwn_mac *); +static void bwn_set_phytxctl(struct bwn_mac *); +static void bwn_spu_setdelay(struct bwn_mac *, int); +static void bwn_bt_enable(struct bwn_mac *); +static void bwn_set_macaddr(struct bwn_mac *); +static void bwn_crypt_init(struct bwn_mac *); +static void bwn_chip_exit(struct bwn_mac *); +static int bwn_fw_fillinfo(struct bwn_mac *); +static int bwn_fw_loaducode(struct bwn_mac *); +static int bwn_gpio_init(struct bwn_mac *); +static int bwn_fw_loadinitvals(struct bwn_mac *); +static int bwn_phy_init(struct bwn_mac *); +static void bwn_set_txantenna(struct bwn_mac *, int); +static void bwn_set_opmode(struct bwn_mac *); +static void bwn_gpio_cleanup(struct bwn_mac *); +static void bwn_rate_write(struct bwn_mac *, uint16_t, int); +static uint8_t bwn_plcp_getcck(const uint8_t); +static uint8_t bwn_plcp_getofdm(const uint8_t); +static void bwn_pio_init(struct bwn_mac *); +static uint16_t bwn_pio_idx2base(struct bwn_mac *, int); +static void bwn_pio_set_txqueue(struct bwn_mac *, struct bwn_pio_txqueue *, + int); +static void bwn_pio_setupqueue_rx(struct bwn_mac *, + struct bwn_pio_rxqueue *, int); +static void bwn_destroy_queue_tx(struct bwn_pio_txqueue *); +static uint16_t bwn_pio_read_2(struct bwn_mac *, struct bwn_pio_txqueue *, + uint16_t); +static void bwn_pio_cancel_tx_packets(struct bwn_pio_txqueue *); +static int bwn_pio_rx(struct bwn_pio_rxqueue *); +static uint8_t bwn_pio_rxeof(struct bwn_pio_rxqueue *); +static void bwn_pio_handle_txeof(struct bwn_mac *, + const struct bwn_txstatus *); +static uint16_t bwn_pio_rx_read_2(struct bwn_pio_rxqueue *, uint16_t); +static uint32_t bwn_pio_rx_read_4(struct bwn_pio_rxqueue *, uint16_t); +static void bwn_pio_rx_write_2(struct bwn_pio_rxqueue *, uint16_t, + uint16_t); +static void bwn_pio_rx_write_4(struct bwn_pio_rxqueue *, uint16_t, + uint32_t); +static int bwn_pio_tx_start(struct bwn_mac *, struct ieee80211_node *, + struct mbuf *); +static struct bwn_pio_txqueue *bwn_pio_select(struct bwn_mac *, uint8_t); +static uint32_t bwn_pio_write_multi_4(struct bwn_mac *, + struct bwn_pio_txqueue *, uint32_t, const void *, int); +static void bwn_pio_write_4(struct bwn_mac *, struct bwn_pio_txqueue *, + uint16_t, uint32_t); +static uint16_t bwn_pio_write_multi_2(struct bwn_mac *, + struct bwn_pio_txqueue *, uint16_t, const void *, int); +static uint16_t bwn_pio_write_mbuf_2(struct bwn_mac *, + struct bwn_pio_txqueue *, uint16_t, struct mbuf *); +static struct bwn_pio_txqueue *bwn_pio_parse_cookie(struct bwn_mac *, + uint16_t, struct bwn_pio_txpkt **); +static void bwn_dma_init(struct bwn_mac *); +static void bwn_dma_rxdirectfifo(struct bwn_mac *, int, uint8_t); +static int bwn_dma_mask2type(uint64_t); +static uint64_t bwn_dma_mask(struct bwn_mac *); +static uint16_t bwn_dma_base(int, int); +static void bwn_dma_ringfree(struct bwn_dma_ring **); +static void bwn_dma_32_getdesc(struct bwn_dma_ring *, + int, struct bwn_dmadesc_generic **, + struct bwn_dmadesc_meta **); +static void bwn_dma_32_setdesc(struct bwn_dma_ring *, + struct bwn_dmadesc_generic *, bus_addr_t, uint16_t, int, + int, int); +static void bwn_dma_32_start_transfer(struct bwn_dma_ring *, int); +static void bwn_dma_32_suspend(struct bwn_dma_ring *); +static void bwn_dma_32_resume(struct bwn_dma_ring *); +static int bwn_dma_32_get_curslot(struct bwn_dma_ring *); +static void bwn_dma_32_set_curslot(struct bwn_dma_ring *, int); +static void bwn_dma_64_getdesc(struct bwn_dma_ring *, + int, struct bwn_dmadesc_generic **, + struct bwn_dmadesc_meta **); +static void bwn_dma_64_setdesc(struct bwn_dma_ring *, + struct bwn_dmadesc_generic *, bus_addr_t, uint16_t, int, + int, int); +static void bwn_dma_64_start_transfer(struct bwn_dma_ring *, int); +static void bwn_dma_64_suspend(struct bwn_dma_ring *); +static void bwn_dma_64_resume(struct bwn_dma_ring *); +static int bwn_dma_64_get_curslot(struct bwn_dma_ring *); +static void bwn_dma_64_set_curslot(struct bwn_dma_ring *, int); +static int bwn_dma_allocringmemory(struct bwn_dma_ring *); +static void bwn_dma_setup(struct bwn_dma_ring *); +static void bwn_dma_free_ringmemory(struct bwn_dma_ring *); +static void bwn_dma_cleanup(struct bwn_dma_ring *); +static void bwn_dma_free_descbufs(struct bwn_dma_ring *); +static int bwn_dma_tx_reset(struct bwn_mac *, uint16_t, int); +static void bwn_dma_rx(struct bwn_dma_ring *); +static int bwn_dma_rx_reset(struct bwn_mac *, uint16_t, int); +static void bwn_dma_free_descbuf(struct bwn_dma_ring *, + struct bwn_dmadesc_meta *); +static void bwn_dma_set_redzone(struct bwn_dma_ring *, struct mbuf *); +static int bwn_dma_gettype(struct bwn_mac *); +static void bwn_dma_ring_addr(void *, bus_dma_segment_t *, int, int); +static int bwn_dma_freeslot(struct bwn_dma_ring *); +static int bwn_dma_nextslot(struct bwn_dma_ring *, int); +static void bwn_dma_rxeof(struct bwn_dma_ring *, int *); +static int bwn_dma_newbuf(struct bwn_dma_ring *, + struct bwn_dmadesc_generic *, struct bwn_dmadesc_meta *, + int); +static void bwn_dma_buf_addr(void *, bus_dma_segment_t *, int, + bus_size_t, int); +static uint8_t bwn_dma_check_redzone(struct bwn_dma_ring *, struct mbuf *); +static void bwn_dma_handle_txeof(struct bwn_mac *, + const struct bwn_txstatus *); +static int bwn_dma_tx_start(struct bwn_mac *, struct ieee80211_node *, + struct mbuf *); +static int bwn_dma_getslot(struct bwn_dma_ring *); +static struct bwn_dma_ring *bwn_dma_select(struct bwn_mac *, + uint8_t); +static int bwn_dma_attach(struct bwn_mac *); +static struct bwn_dma_ring *bwn_dma_ringsetup(struct bwn_mac *, + int, int, int); +static struct bwn_dma_ring *bwn_dma_parse_cookie(struct bwn_mac *, + const struct bwn_txstatus *, uint16_t, int *); +static void bwn_dma_free(struct bwn_mac *); +static void bwn_phy_g_init_sub(struct bwn_mac *); +static uint8_t bwn_has_hwpctl(struct bwn_mac *); +static void bwn_phy_init_b5(struct bwn_mac *); +static void bwn_phy_init_b6(struct bwn_mac *); +static void bwn_phy_init_a(struct bwn_mac *); +static void bwn_loopback_calcgain(struct bwn_mac *); +static uint16_t bwn_rf_init_bcm2050(struct bwn_mac *); +static void bwn_lo_g_init(struct bwn_mac *); +static void bwn_lo_g_adjust(struct bwn_mac *); +static void bwn_lo_get_powervector(struct bwn_mac *); +static struct bwn_lo_calib *bwn_lo_calibset(struct bwn_mac *, + const struct bwn_bbatt *, const struct bwn_rfatt *); +static void bwn_lo_write(struct bwn_mac *, struct bwn_loctl *); +static void bwn_phy_hwpctl_init(struct bwn_mac *); +static void bwn_phy_g_switch_chan(struct bwn_mac *, int, uint8_t); +static void bwn_phy_g_set_txpwr_sub(struct bwn_mac *, + const struct bwn_bbatt *, const struct bwn_rfatt *, + uint8_t); +static void bwn_phy_g_set_bbatt(struct bwn_mac *, uint16_t); +static uint16_t bwn_rf_2050_rfoverval(struct bwn_mac *, uint16_t, uint32_t); +static void bwn_spu_workaround(struct bwn_mac *, uint8_t); +static void bwn_wa_init(struct bwn_mac *); +static void bwn_ofdmtab_write_2(struct bwn_mac *, uint16_t, uint16_t, + uint16_t); +static void bwn_dummy_transmission(struct bwn_mac *, int, int); +static void bwn_ofdmtab_write_4(struct bwn_mac *, uint16_t, uint16_t, + uint32_t); +static void bwn_gtab_write(struct bwn_mac *, uint16_t, uint16_t, + uint16_t); +static void bwn_ram_write(struct bwn_mac *, uint16_t, uint32_t); +static void bwn_mac_suspend(struct bwn_mac *); +static void bwn_mac_enable(struct bwn_mac *); +static void bwn_psctl(struct bwn_mac *, uint32_t); +static int16_t bwn_nrssi_read(struct bwn_mac *, uint16_t); +static void bwn_nrssi_offset(struct bwn_mac *); +static void bwn_nrssi_threshold(struct bwn_mac *); +static void bwn_nrssi_slope_11g(struct bwn_mac *); +static void bwn_set_all_gains(struct bwn_mac *, int16_t, int16_t, + int16_t); +static void bwn_set_original_gains(struct bwn_mac *); +static void bwn_hwpctl_early_init(struct bwn_mac *); +static void bwn_hwpctl_init_gphy(struct bwn_mac *); +static uint16_t bwn_phy_g_chan2freq(uint8_t); +static int bwn_fw_gets(struct bwn_mac *, enum bwn_fwtype); +static int bwn_fw_get(struct bwn_mac *, enum bwn_fwtype, + const char *, struct bwn_fwfile *); +static void bwn_release_firmware(struct bwn_mac *); +static void bwn_do_release_fw(struct bwn_fwfile *); +static uint16_t bwn_fwcaps_read(struct bwn_mac *); +static int bwn_fwinitvals_write(struct bwn_mac *, + const struct bwn_fwinitvals *, size_t, size_t); +static int bwn_switch_channel(struct bwn_mac *, int); +static uint16_t bwn_ant2phy(int); +static void bwn_mac_write_bssid(struct bwn_mac *); +static void bwn_mac_setfilter(struct bwn_mac *, uint16_t, + const uint8_t *); +static void bwn_key_dowrite(struct bwn_mac *, uint8_t, uint8_t, + const uint8_t *, size_t, const uint8_t *); +static void bwn_key_macwrite(struct bwn_mac *, uint8_t, + const uint8_t *); +static void bwn_key_write(struct bwn_mac *, uint8_t, uint8_t, + const uint8_t *); +static void bwn_phy_exit(struct bwn_mac *); +static void bwn_core_stop(struct bwn_mac *); +static int bwn_switch_band(struct bwn_softc *, + struct ieee80211_channel *); +static void bwn_phy_reset(struct bwn_mac *); +static int bwn_newstate(struct ieee80211vap *, enum ieee80211_state, int); +static void bwn_set_pretbtt(struct bwn_mac *); +static int bwn_intr(void *); +static void bwn_intrtask(void *, int); +static void bwn_restart(struct bwn_mac *, const char *); +static void bwn_intr_ucode_debug(struct bwn_mac *); +static void bwn_intr_tbtt_indication(struct bwn_mac *); +static void bwn_intr_atim_end(struct bwn_mac *); +static void bwn_intr_beacon(struct bwn_mac *); +static void bwn_intr_pmq(struct bwn_mac *); +static void bwn_intr_noise(struct bwn_mac *); +static void bwn_intr_txeof(struct bwn_mac *); +static void bwn_hwreset(void *, int); +static void bwn_handle_fwpanic(struct bwn_mac *); +static void bwn_load_beacon0(struct bwn_mac *); +static void bwn_load_beacon1(struct bwn_mac *); +static uint32_t bwn_jssi_read(struct bwn_mac *); +static void bwn_noise_gensample(struct bwn_mac *); +static void bwn_handle_txeof(struct bwn_mac *, + const struct bwn_txstatus *); +static void bwn_rxeof(struct bwn_mac *, struct mbuf *, const void *); +static void bwn_phy_txpower_check(struct bwn_mac *, uint32_t); +static void bwn_start_locked(struct ifnet *); +static int bwn_tx_start(struct bwn_softc *, struct ieee80211_node *, + struct mbuf *); +static int bwn_tx_isfull(struct bwn_softc *, struct mbuf *); +static int bwn_set_txhdr(struct bwn_mac *, + struct ieee80211_node *, struct mbuf *, struct bwn_txhdr *, + uint16_t); +static void bwn_plcp_genhdr(struct bwn_plcp4 *, const uint16_t, + const uint8_t); +static uint8_t bwn_antenna_sanitize(struct bwn_mac *, uint8_t); +static uint8_t bwn_get_fbrate(uint8_t); +static int bwn_phy_shm_tssi_read(struct bwn_mac *, uint16_t); +static void bwn_phy_g_setatt(struct bwn_mac *, int *, int *); +static void bwn_phy_lock(struct bwn_mac *); +static void bwn_phy_unlock(struct bwn_mac *); +static void bwn_rf_lock(struct bwn_mac *); +static void bwn_rf_unlock(struct bwn_mac *); +static void bwn_txpwr(void *, int); +static void bwn_tasks(void *); +static void bwn_task_15s(struct bwn_mac *); +static void bwn_task_30s(struct bwn_mac *); +static void bwn_task_60s(struct bwn_mac *); +static int bwn_plcp_get_ofdmrate(struct bwn_mac *, struct bwn_plcp6 *, + uint8_t); +static int bwn_plcp_get_cckrate(struct bwn_mac *, struct bwn_plcp6 *); +static void bwn_rx_radiotap(struct bwn_mac *, struct mbuf *, + const struct bwn_rxhdr4 *, struct bwn_plcp6 *, int, + int, int); +static void bwn_tsf_read(struct bwn_mac *, uint64_t *); +static void bwn_phy_g_dc_lookup_init(struct bwn_mac *, uint8_t); +static void bwn_set_slot_time(struct bwn_mac *, uint16_t); +static void bwn_watchdog(void *); +static void bwn_dma_stop(struct bwn_mac *); +static void bwn_pio_stop(struct bwn_mac *); +static void bwn_dma_ringstop(struct bwn_dma_ring **); +static void bwn_led_attach(struct bwn_mac *); +static void bwn_led_newstate(struct bwn_mac *, enum ieee80211_state); +static void bwn_led_event(struct bwn_mac *, int); +static void bwn_led_blink_start(struct bwn_mac *, int, int); +static void bwn_led_blink_next(void *); +static void bwn_led_blink_end(void *); +static void bwn_rfswitch(void *); +static void bwn_rf_turnon(struct bwn_mac *); +static void bwn_rf_turnoff(struct bwn_mac *); +static void bwn_phy_lp_init_pre(struct bwn_mac *); +static int bwn_phy_lp_init(struct bwn_mac *); +static uint16_t bwn_phy_lp_read(struct bwn_mac *, uint16_t); +static void bwn_phy_lp_write(struct bwn_mac *, uint16_t, uint16_t); +static void bwn_phy_lp_maskset(struct bwn_mac *, uint16_t, uint16_t, + uint16_t); +static uint16_t bwn_phy_lp_rf_read(struct bwn_mac *, uint16_t); +static void bwn_phy_lp_rf_write(struct bwn_mac *, uint16_t, uint16_t); +static void bwn_phy_lp_rf_onoff(struct bwn_mac *, int); +static int bwn_phy_lp_switch_channel(struct bwn_mac *, uint32_t); +static uint32_t bwn_phy_lp_get_default_chan(struct bwn_mac *); +static void bwn_phy_lp_set_antenna(struct bwn_mac *, int); +static void bwn_phy_lp_task_60s(struct bwn_mac *); +static void bwn_phy_lp_readsprom(struct bwn_mac *); +static void bwn_phy_lp_bbinit(struct bwn_mac *); +static void bwn_phy_lp_txpctl_init(struct bwn_mac *); +static void bwn_phy_lp_calib(struct bwn_mac *); +static void bwn_phy_lp_switch_analog(struct bwn_mac *, int); +static int bwn_phy_lp_b2062_switch_channel(struct bwn_mac *, uint8_t); +static int bwn_phy_lp_b2063_switch_channel(struct bwn_mac *, uint8_t); +static void bwn_phy_lp_set_anafilter(struct bwn_mac *, uint8_t); +static void bwn_phy_lp_set_gaintbl(struct bwn_mac *, uint32_t); +static void bwn_phy_lp_digflt_save(struct bwn_mac *); +static void bwn_phy_lp_get_txpctlmode(struct bwn_mac *); +static void bwn_phy_lp_set_txpctlmode(struct bwn_mac *, uint8_t); +static void bwn_phy_lp_bugfix(struct bwn_mac *); +static void bwn_phy_lp_digflt_restore(struct bwn_mac *); +static void bwn_phy_lp_tblinit(struct bwn_mac *); +static void bwn_phy_lp_bbinit_r2(struct bwn_mac *); +static void bwn_phy_lp_bbinit_r01(struct bwn_mac *); +static void bwn_phy_lp_b2062_init(struct bwn_mac *); +static void bwn_phy_lp_b2063_init(struct bwn_mac *); +static void bwn_phy_lp_rxcal_r2(struct bwn_mac *); +static void bwn_phy_lp_rccal_r12(struct bwn_mac *); +static void bwn_phy_lp_set_rccap(struct bwn_mac *); +static uint32_t bwn_phy_lp_roundup(uint32_t, uint32_t, uint8_t); +static void bwn_phy_lp_b2062_reset_pllbias(struct bwn_mac *); +static void bwn_phy_lp_b2062_vco_calib(struct bwn_mac *); +static void bwn_tab_write_multi(struct bwn_mac *, uint32_t, int, + const void *); +static void bwn_tab_read_multi(struct bwn_mac *, uint32_t, int, void *); +static struct bwn_txgain + bwn_phy_lp_get_txgain(struct bwn_mac *); +static uint8_t bwn_phy_lp_get_bbmult(struct bwn_mac *); +static void bwn_phy_lp_set_txgain(struct bwn_mac *, struct bwn_txgain *); +static void bwn_phy_lp_set_bbmult(struct bwn_mac *, uint8_t); +static void bwn_phy_lp_set_trsw_over(struct bwn_mac *, uint8_t, uint8_t); +static void bwn_phy_lp_set_rxgain(struct bwn_mac *, uint32_t); +static void bwn_phy_lp_set_deaf(struct bwn_mac *, uint8_t); +static int bwn_phy_lp_calc_rx_iq_comp(struct bwn_mac *, uint16_t); +static void bwn_phy_lp_clear_deaf(struct bwn_mac *, uint8_t); +static void bwn_phy_lp_tblinit_r01(struct bwn_mac *); +static void bwn_phy_lp_tblinit_r2(struct bwn_mac *); +static void bwn_phy_lp_tblinit_txgain(struct bwn_mac *); +static void bwn_tab_write(struct bwn_mac *, uint32_t, uint32_t); +static void bwn_phy_lp_b2062_tblinit(struct bwn_mac *); +static void bwn_phy_lp_b2063_tblinit(struct bwn_mac *); +static int bwn_phy_lp_loopback(struct bwn_mac *); +static void bwn_phy_lp_set_rxgain_idx(struct bwn_mac *, uint16_t); +static void bwn_phy_lp_ddfs_turnon(struct bwn_mac *, int, int, int, int, + int); +static uint8_t bwn_phy_lp_rx_iq_est(struct bwn_mac *, uint16_t, uint8_t, + struct bwn_phy_lp_iq_est *); +static void bwn_phy_lp_ddfs_turnoff(struct bwn_mac *); +static uint32_t bwn_tab_read(struct bwn_mac *, uint32_t); +static void bwn_phy_lp_set_txgain_dac(struct bwn_mac *, uint16_t); +static void bwn_phy_lp_set_txgain_pa(struct bwn_mac *, uint16_t); +static void bwn_phy_lp_set_txgain_override(struct bwn_mac *); +static uint16_t bwn_phy_lp_get_pa_gain(struct bwn_mac *); +static uint8_t bwn_nbits(int32_t); +static void bwn_phy_lp_gaintbl_write_multi(struct bwn_mac *, int, int, + struct bwn_txgain_entry *); +static void bwn_phy_lp_gaintbl_write(struct bwn_mac *, int, + struct bwn_txgain_entry); +static void bwn_phy_lp_gaintbl_write_r2(struct bwn_mac *, int, + struct bwn_txgain_entry); +static void bwn_phy_lp_gaintbl_write_r01(struct bwn_mac *, int, + struct bwn_txgain_entry); +static void bwn_sysctl_node(struct bwn_softc *); + +static struct resource_spec bwn_res_spec_legacy[] = { + { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE }, + { -1, 0, 0 } +}; + +static struct resource_spec bwn_res_spec_msi[] = { + { SYS_RES_IRQ, 1, RF_ACTIVE }, + { -1, 0, 0 } +}; + +static const struct bwn_channelinfo bwn_chantable_bg = { + .channels = { + { 2412, 1, 30 }, { 2417, 2, 30 }, { 2422, 3, 30 }, + { 2427, 4, 30 }, { 2432, 5, 30 }, { 2437, 6, 30 }, + { 2442, 7, 30 }, { 2447, 8, 30 }, { 2452, 9, 30 }, + { 2457, 10, 30 }, { 2462, 11, 30 }, { 2467, 12, 30 }, + { 2472, 13, 30 }, { 2484, 14, 30 } }, + .nchannels = 14 +}; + +static const struct bwn_channelinfo bwn_chantable_a = { + .channels = { + { 5170, 34, 30 }, { 5180, 36, 30 }, { 5190, 38, 30 }, + { 5200, 40, 30 }, { 5210, 42, 30 }, { 5220, 44, 30 }, + { 5230, 46, 30 }, { 5240, 48, 30 }, { 5260, 52, 30 }, + { 5280, 56, 30 }, { 5300, 60, 30 }, { 5320, 64, 30 }, + { 5500, 100, 30 }, { 5520, 104, 30 }, { 5540, 108, 30 }, + { 5560, 112, 30 }, { 5580, 116, 30 }, { 5600, 120, 30 }, + { 5620, 124, 30 }, { 5640, 128, 30 }, { 5660, 132, 30 }, + { 5680, 136, 30 }, { 5700, 140, 30 }, { 5745, 149, 30 }, + { 5765, 153, 30 }, { 5785, 157, 30 }, { 5805, 161, 30 }, + { 5825, 165, 30 }, { 5920, 184, 30 }, { 5940, 188, 30 }, + { 5960, 192, 30 }, { 5980, 196, 30 }, { 6000, 200, 30 }, + { 6020, 204, 30 }, { 6040, 208, 30 }, { 6060, 212, 30 }, + { 6080, 216, 30 } }, + .nchannels = 37 +}; + +static const struct bwn_channelinfo bwn_chantable_n = { + .channels = { + { 5160, 32, 30 }, { 5170, 34, 30 }, { 5180, 36, 30 }, + { 5190, 38, 30 }, { 5200, 40, 30 }, { 5210, 42, 30 }, + { 5220, 44, 30 }, { 5230, 46, 30 }, { 5240, 48, 30 }, + { 5250, 50, 30 }, { 5260, 52, 30 }, { 5270, 54, 30 }, + { 5280, 56, 30 }, { 5290, 58, 30 }, { 5300, 60, 30 }, + { 5310, 62, 30 }, { 5320, 64, 30 }, { 5330, 66, 30 }, + { 5340, 68, 30 }, { 5350, 70, 30 }, { 5360, 72, 30 }, + { 5370, 74, 30 }, { 5380, 76, 30 }, { 5390, 78, 30 }, + { 5400, 80, 30 }, { 5410, 82, 30 }, { 5420, 84, 30 }, + { 5430, 86, 30 }, { 5440, 88, 30 }, { 5450, 90, 30 }, + { 5460, 92, 30 }, { 5470, 94, 30 }, { 5480, 96, 30 }, + { 5490, 98, 30 }, { 5500, 100, 30 }, { 5510, 102, 30 }, + { 5520, 104, 30 }, { 5530, 106, 30 }, { 5540, 108, 30 }, + { 5550, 110, 30 }, { 5560, 112, 30 }, { 5570, 114, 30 }, + { 5580, 116, 30 }, { 5590, 118, 30 }, { 5600, 120, 30 }, + { 5610, 122, 30 }, { 5620, 124, 30 }, { 5630, 126, 30 }, + { 5640, 128, 30 }, { 5650, 130, 30 }, { 5660, 132, 30 }, + { 5670, 134, 30 }, { 5680, 136, 30 }, { 5690, 138, 30 }, + { 5700, 140, 30 }, { 5710, 142, 30 }, { 5720, 144, 30 }, + { 5725, 145, 30 }, { 5730, 146, 30 }, { 5735, 147, 30 }, + { 5740, 148, 30 }, { 5745, 149, 30 }, { 5750, 150, 30 }, + { 5755, 151, 30 }, { 5760, 152, 30 }, { 5765, 153, 30 }, + { 5770, 154, 30 }, { 5775, 155, 30 }, { 5780, 156, 30 }, + { 5785, 157, 30 }, { 5790, 158, 30 }, { 5795, 159, 30 }, + { 5800, 160, 30 }, { 5805, 161, 30 }, { 5810, 162, 30 }, + { 5815, 163, 30 }, { 5820, 164, 30 }, { 5825, 165, 30 }, + { 5830, 166, 30 }, { 5840, 168, 30 }, { 5850, 170, 30 }, + { 5860, 172, 30 }, { 5870, 174, 30 }, { 5880, 176, 30 }, + { 5890, 178, 30 }, { 5900, 180, 30 }, { 5910, 182, 30 }, + { 5920, 184, 30 }, { 5930, 186, 30 }, { 5940, 188, 30 }, + { 5950, 190, 30 }, { 5960, 192, 30 }, { 5970, 194, 30 }, + { 5980, 196, 30 }, { 5990, 198, 30 }, { 6000, 200, 30 }, + { 6010, 202, 30 }, { 6020, 204, 30 }, { 6030, 206, 30 }, + { 6040, 208, 30 }, { 6050, 210, 30 }, { 6060, 212, 30 }, + { 6070, 214, 30 }, { 6080, 216, 30 }, { 6090, 218, 30 }, + { 6100, 220, 30 }, { 6110, 222, 30 }, { 6120, 224, 30 }, + { 6130, 226, 30 }, { 6140, 228, 30 } }, + .nchannels = 110 +}; + +static const uint8_t bwn_b2063_chantable_data[33][12] = { + { 0x6f, 0x3c, 0x3c, 0x4, 0x5, 0x5, 0x5, 0x5, 0x77, 0x80, 0x80, 0x70 }, + { 0x6f, 0x2c, 0x2c, 0x4, 0x5, 0x5, 0x5, 0x5, 0x77, 0x80, 0x80, 0x70 }, + { 0x6f, 0x1c, 0x1c, 0x4, 0x5, 0x5, 0x5, 0x5, 0x77, 0x80, 0x80, 0x70 }, + { 0x6e, 0x1c, 0x1c, 0x4, 0x5, 0x5, 0x5, 0x5, 0x77, 0x80, 0x80, 0x70 }, + { 0x6e, 0xc, 0xc, 0x4, 0x5, 0x5, 0x5, 0x5, 0x77, 0x80, 0x80, 0x70 }, + { 0x6a, 0xc, 0xc, 0, 0x2, 0x5, 0xd, 0xd, 0x77, 0x80, 0x20, 0 }, + { 0x6a, 0xc, 0xc, 0, 0x1, 0x5, 0xd, 0xc, 0x77, 0x80, 0x20, 0 }, + { 0x6a, 0xc, 0xc, 0, 0x1, 0x4, 0xc, 0xc, 0x77, 0x80, 0x20, 0 }, + { 0x69, 0xc, 0xc, 0, 0x1, 0x4, 0xc, 0xc, 0x77, 0x70, 0x20, 0 }, + { 0x69, 0xc, 0xc, 0, 0x1, 0x4, 0xb, 0xc, 0x77, 0x70, 0x20, 0 }, + { 0x69, 0xc, 0xc, 0, 0, 0x4, 0xb, 0xb, 0x77, 0x60, 0x20, 0 }, + { 0x69, 0xc, 0xc, 0, 0, 0x3, 0xa, 0xb, 0x77, 0x60, 0x20, 0 }, + { 0x69, 0xc, 0xc, 0, 0, 0x3, 0xa, 0xa, 0x77, 0x60, 0x20, 0 }, + { 0x68, 0xc, 0xc, 0, 0, 0x2, 0x9, 0x9, 0x77, 0x60, 0x20, 0 }, + { 0x68, 0xc, 0xc, 0, 0, 0x1, 0x8, 0x8, 0x77, 0x50, 0x10, 0 }, + { 0x67, 0xc, 0xc, 0, 0, 0, 0x8, 0x8, 0x77, 0x50, 0x10, 0 }, + { 0x64, 0xc, 0xc, 0, 0, 0, 0x2, 0x1, 0x77, 0x20, 0, 0 }, + { 0x64, 0xc, 0xc, 0, 0, 0, 0x1, 0x1, 0x77, 0x20, 0, 0 }, + { 0x63, 0xc, 0xc, 0, 0, 0, 0x1, 0, 0x77, 0x10, 0, 0 }, + { 0x63, 0xc, 0xc, 0, 0, 0, 0, 0, 0x77, 0x10, 0, 0 }, + { 0x62, 0xc, 0xc, 0, 0, 0, 0, 0, 0x77, 0x10, 0, 0 }, + { 0x62, 0xc, 0xc, 0, 0, 0, 0, 0, 0x77, 0, 0, 0 }, + { 0x61, 0xc, 0xc, 0, 0, 0, 0, 0, 0x77, 0, 0, 0 }, + { 0x60, 0xc, 0xc, 0, 0, 0, 0, 0, 0x77, 0, 0, 0 }, + { 0x6e, 0xc, 0xc, 0, 0x9, 0xe, 0xf, 0xf, 0x77, 0xc0, 0x50, 0 }, + { 0x6e, 0xc, 0xc, 0, 0x9, 0xd, 0xf, 0xf, 0x77, 0xb0, 0x50, 0 }, + { 0x6e, 0xc, 0xc, 0, 0x8, 0xc, 0xf, 0xf, 0x77, 0xb0, 0x50, 0 }, + { 0x6d, 0xc, 0xc, 0, 0x8, 0xc, 0xf, 0xf, 0x77, 0xa0, 0x40, 0 }, + { 0x6d, 0xc, 0xc, 0, 0x8, 0xb, 0xf, 0xf, 0x77, 0xa0, 0x40, 0 }, + { 0x6d, 0xc, 0xc, 0, 0x8, 0xa, 0xf, 0xf, 0x77, 0xa0, 0x40, 0 }, + { 0x6c, 0xc, 0xc, 0, 0x7, 0x9, 0xf, 0xf, 0x77, 0x90, 0x40, 0 }, + { 0x6c, 0xc, 0xc, 0, 0x6, 0x8, 0xf, 0xf, 0x77, 0x90, 0x40, 0 }, + { 0x6c, 0xc, 0xc, 0, 0x5, 0x8, 0xf, 0xf, 0x77, 0x90, 0x40, 0 } +}; + +static const struct bwn_b206x_chan bwn_b2063_chantable[] = { + { 1, 2412, bwn_b2063_chantable_data[0] }, + { 2, 2417, bwn_b2063_chantable_data[0] }, + { 3, 2422, bwn_b2063_chantable_data[0] }, + { 4, 2427, bwn_b2063_chantable_data[1] }, + { 5, 2432, bwn_b2063_chantable_data[1] }, + { 6, 2437, bwn_b2063_chantable_data[1] }, + { 7, 2442, bwn_b2063_chantable_data[1] }, + { 8, 2447, bwn_b2063_chantable_data[1] }, + { 9, 2452, bwn_b2063_chantable_data[2] }, + { 10, 2457, bwn_b2063_chantable_data[2] }, + { 11, 2462, bwn_b2063_chantable_data[3] }, + { 12, 2467, bwn_b2063_chantable_data[3] }, + { 13, 2472, bwn_b2063_chantable_data[3] }, + { 14, 2484, bwn_b2063_chantable_data[4] }, + { 34, 5170, bwn_b2063_chantable_data[5] }, + { 36, 5180, bwn_b2063_chantable_data[6] }, + { 38, 5190, bwn_b2063_chantable_data[7] }, + { 40, 5200, bwn_b2063_chantable_data[8] }, + { 42, 5210, bwn_b2063_chantable_data[9] }, + { 44, 5220, bwn_b2063_chantable_data[10] }, + { 46, 5230, bwn_b2063_chantable_data[11] }, + { 48, 5240, bwn_b2063_chantable_data[12] }, + { 52, 5260, bwn_b2063_chantable_data[13] }, + { 56, 5280, bwn_b2063_chantable_data[14] }, + { 60, 5300, bwn_b2063_chantable_data[14] }, + { 64, 5320, bwn_b2063_chantable_data[15] }, + { 100, 5500, bwn_b2063_chantable_data[16] }, + { 104, 5520, bwn_b2063_chantable_data[17] }, + { 108, 5540, bwn_b2063_chantable_data[18] }, + { 112, 5560, bwn_b2063_chantable_data[19] }, + { 116, 5580, bwn_b2063_chantable_data[20] }, + { 120, 5600, bwn_b2063_chantable_data[21] }, + { 124, 5620, bwn_b2063_chantable_data[21] }, + { 128, 5640, bwn_b2063_chantable_data[22] }, + { 132, 5660, bwn_b2063_chantable_data[22] }, + { 136, 5680, bwn_b2063_chantable_data[22] }, + { 140, 5700, bwn_b2063_chantable_data[23] }, + { 149, 5745, bwn_b2063_chantable_data[23] }, + { 153, 5765, bwn_b2063_chantable_data[23] }, + { 157, 5785, bwn_b2063_chantable_data[23] }, + { 161, 5805, bwn_b2063_chantable_data[23] }, + { 165, 5825, bwn_b2063_chantable_data[23] }, + { 184, 4920, bwn_b2063_chantable_data[24] }, + { 188, 4940, bwn_b2063_chantable_data[25] }, + { 192, 4960, bwn_b2063_chantable_data[26] }, + { 196, 4980, bwn_b2063_chantable_data[27] }, + { 200, 5000, bwn_b2063_chantable_data[28] }, + { 204, 5020, bwn_b2063_chantable_data[29] }, + { 208, 5040, bwn_b2063_chantable_data[30] }, + { 212, 5060, bwn_b2063_chantable_data[31] }, + { 216, 5080, bwn_b2063_chantable_data[32] } +}; + +static const uint8_t bwn_b2062_chantable_data[22][12] = { + { 0xff, 0xff, 0xb5, 0x1b, 0x24, 0x32, 0x32, 0x88, 0x88, 0, 0, 0 }, + { 0, 0x22, 0x20, 0x84, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0x11, 0x10, 0x83, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0, 0, 0x83, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0x11, 0x20, 0x83, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0x11, 0x10, 0x84, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0x11, 0, 0x83, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0, 0, 0x63, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0, 0, 0x62, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0, 0, 0x30, 0x3c, 0x77, 0x37, 0xff, 0x88, 0, 0, 0 }, + { 0, 0, 0, 0x20, 0x3c, 0x77, 0x37, 0xff, 0x88, 0, 0, 0 }, + { 0, 0, 0, 0x10, 0x3c, 0x77, 0x37, 0xff, 0x88, 0, 0, 0 }, + { 0, 0, 0, 0, 0x3c, 0x77, 0x37, 0xff, 0x88, 0, 0, 0 }, + { 0x55, 0x77, 0x90, 0xf7, 0x3c, 0x77, 0x35, 0xff, 0xff, 0, 0, 0 }, + { 0x44, 0x77, 0x80, 0xe7, 0x3c, 0x77, 0x35, 0xff, 0xff, 0, 0, 0 }, + { 0x44, 0x66, 0x80, 0xe7, 0x3c, 0x77, 0x35, 0xff, 0xff, 0, 0, 0 }, + { 0x33, 0x66, 0x70, 0xc7, 0x3c, 0x77, 0x35, 0xff, 0xff, 0, 0, 0 }, + { 0x22, 0x55, 0x60, 0xd7, 0x3c, 0x77, 0x35, 0xff, 0xff, 0, 0, 0 }, + { 0x22, 0x55, 0x60, 0xc7, 0x3c, 0x77, 0x35, 0xff, 0xff, 0, 0, 0 }, + { 0x22, 0x44, 0x50, 0xc7, 0x3c, 0x77, 0x35, 0xff, 0xff, 0, 0, 0 }, + { 0x11, 0x44, 0x50, 0xa5, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 }, + { 0, 0x44, 0x40, 0xb6, 0x3c, 0x77, 0x35, 0xff, 0x88, 0, 0, 0 } +}; + +static const struct bwn_b206x_chan bwn_b2062_chantable[] = { + { 1, 2412, bwn_b2062_chantable_data[0] }, + { 2, 2417, bwn_b2062_chantable_data[0] }, + { 3, 2422, bwn_b2062_chantable_data[0] }, + { 4, 2427, bwn_b2062_chantable_data[0] }, + { 5, 2432, bwn_b2062_chantable_data[0] }, + { 6, 2437, bwn_b2062_chantable_data[0] }, + { 7, 2442, bwn_b2062_chantable_data[0] }, + { 8, 2447, bwn_b2062_chantable_data[0] }, + { 9, 2452, bwn_b2062_chantable_data[0] }, + { 10, 2457, bwn_b2062_chantable_data[0] }, + { 11, 2462, bwn_b2062_chantable_data[0] }, + { 12, 2467, bwn_b2062_chantable_data[0] }, + { 13, 2472, bwn_b2062_chantable_data[0] }, + { 14, 2484, bwn_b2062_chantable_data[0] }, + { 34, 5170, bwn_b2062_chantable_data[1] }, + { 38, 5190, bwn_b2062_chantable_data[2] }, + { 42, 5210, bwn_b2062_chantable_data[2] }, + { 46, 5230, bwn_b2062_chantable_data[3] }, + { 36, 5180, bwn_b2062_chantable_data[4] }, + { 40, 5200, bwn_b2062_chantable_data[5] }, + { 44, 5220, bwn_b2062_chantable_data[6] }, + { 48, 5240, bwn_b2062_chantable_data[3] }, + { 52, 5260, bwn_b2062_chantable_data[3] }, + { 56, 5280, bwn_b2062_chantable_data[3] }, + { 60, 5300, bwn_b2062_chantable_data[7] }, + { 64, 5320, bwn_b2062_chantable_data[8] }, + { 100, 5500, bwn_b2062_chantable_data[9] }, + { 104, 5520, bwn_b2062_chantable_data[10] }, + { 108, 5540, bwn_b2062_chantable_data[10] }, + { 112, 5560, bwn_b2062_chantable_data[10] }, + { 116, 5580, bwn_b2062_chantable_data[11] }, + { 120, 5600, bwn_b2062_chantable_data[12] }, + { 124, 5620, bwn_b2062_chantable_data[12] }, + { 128, 5640, bwn_b2062_chantable_data[12] }, + { 132, 5660, bwn_b2062_chantable_data[12] }, + { 136, 5680, bwn_b2062_chantable_data[12] }, + { 140, 5700, bwn_b2062_chantable_data[12] }, + { 149, 5745, bwn_b2062_chantable_data[12] }, + { 153, 5765, bwn_b2062_chantable_data[12] }, + { 157, 5785, bwn_b2062_chantable_data[12] }, + { 161, 5805, bwn_b2062_chantable_data[12] }, + { 165, 5825, bwn_b2062_chantable_data[12] }, + { 184, 4920, bwn_b2062_chantable_data[13] }, + { 188, 4940, bwn_b2062_chantable_data[14] }, + { 192, 4960, bwn_b2062_chantable_data[15] }, + { 196, 4980, bwn_b2062_chantable_data[16] }, + { 200, 5000, bwn_b2062_chantable_data[17] }, + { 204, 5020, bwn_b2062_chantable_data[18] }, + { 208, 5040, bwn_b2062_chantable_data[19] }, + { 212, 5060, bwn_b2062_chantable_data[20] }, + { 216, 5080, bwn_b2062_chantable_data[21] } +}; + +/* for LP PHY */ +static const struct bwn_rxcompco bwn_rxcompco_5354[] = { + { 1, -66, 15 }, { 2, -66, 15 }, { 3, -66, 15 }, { 4, -66, 15 }, + { 5, -66, 15 }, { 6, -66, 15 }, { 7, -66, 14 }, { 8, -66, 14 }, + { 9, -66, 14 }, { 10, -66, 14 }, { 11, -66, 14 }, { 12, -66, 13 }, + { 13, -66, 13 }, { 14, -66, 13 }, +}; + +/* for LP PHY */ +static const struct bwn_rxcompco bwn_rxcompco_r12[] = { + { 1, -64, 13 }, { 2, -64, 13 }, { 3, -64, 13 }, { 4, -64, 13 }, + { 5, -64, 12 }, { 6, -64, 12 }, { 7, -64, 12 }, { 8, -64, 12 }, + { 9, -64, 12 }, { 10, -64, 11 }, { 11, -64, 11 }, { 12, -64, 11 }, + { 13, -64, 11 }, { 14, -64, 10 }, { 34, -62, 24 }, { 38, -62, 24 }, + { 42, -62, 24 }, { 46, -62, 23 }, { 36, -62, 24 }, { 40, -62, 24 }, + { 44, -62, 23 }, { 48, -62, 23 }, { 52, -62, 23 }, { 56, -62, 22 }, + { 60, -62, 22 }, { 64, -62, 22 }, { 100, -62, 16 }, { 104, -62, 16 }, + { 108, -62, 15 }, { 112, -62, 14 }, { 116, -62, 14 }, { 120, -62, 13 }, + { 124, -62, 12 }, { 128, -62, 12 }, { 132, -62, 12 }, { 136, -62, 11 }, + { 140, -62, 10 }, { 149, -61, 9 }, { 153, -61, 9 }, { 157, -61, 9 }, + { 161, -61, 8 }, { 165, -61, 8 }, { 184, -62, 25 }, { 188, -62, 25 }, + { 192, -62, 25 }, { 196, -62, 25 }, { 200, -62, 25 }, { 204, -62, 25 }, + { 208, -62, 25 }, { 212, -62, 25 }, { 216, -62, 26 }, +}; + +static const struct bwn_rxcompco bwn_rxcompco_r2 = { 0, -64, 0 }; + +static const uint8_t bwn_tab_sigsq_tbl[] = { + 0xde, 0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xcf, 0xcd, + 0xca, 0xc7, 0xc4, 0xc1, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0x00, + 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, + 0xbe, 0xbe, 0xbe, 0xbe, 0xc1, 0xc4, 0xc7, 0xca, 0xcd, + 0xcf, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, +}; + +static const uint8_t bwn_tab_pllfrac_tbl[] = { + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +}; + +static const uint16_t bwn_tabl_iqlocal_tbl[] = { + 0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, + 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0200, 0x0300, 0x0400, 0x0600, + 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, + 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const uint16_t bwn_tab_noise_g1[] = BWN_TAB_NOISE_G1; +static const uint16_t bwn_tab_noise_g2[] = BWN_TAB_NOISE_G2; +static const uint16_t bwn_tab_noisescale_g1[] = BWN_TAB_NOISESCALE_G1; +static const uint16_t bwn_tab_noisescale_g2[] = BWN_TAB_NOISESCALE_G2; +static const uint16_t bwn_tab_noisescale_g3[] = BWN_TAB_NOISESCALE_G3; +const uint8_t bwn_bitrev_table[256] = BWN_BITREV_TABLE; + +#define VENDOR_LED_ACT(vendor) \ +{ \ + .vid = PCI_VENDOR_##vendor, \ + .led_act = { BWN_VENDOR_LED_ACT_##vendor } \ +} + +static const struct { + uint16_t vid; + uint8_t led_act[BWN_LED_MAX]; +} bwn_vendor_led_act[] = { + VENDOR_LED_ACT(COMPAQ), + VENDOR_LED_ACT(ASUSTEK) +}; + +static const uint8_t bwn_default_led_act[BWN_LED_MAX] = + { BWN_VENDOR_LED_ACT_DEFAULT }; + +#undef VENDOR_LED_ACT + +static const struct { + int on_dur; + int off_dur; +} bwn_led_duration[109] = { + [0] = { 400, 100 }, + [2] = { 150, 75 }, + [4] = { 90, 45 }, + [11] = { 66, 34 }, + [12] = { 53, 26 }, + [18] = { 42, 21 }, + [22] = { 35, 17 }, + [24] = { 32, 16 }, + [36] = { 21, 10 }, + [48] = { 16, 8 }, + [72] = { 11, 5 }, + [96] = { 9, 4 }, + [108] = { 7, 3 } +}; + +static const uint16_t bwn_wme_shm_offsets[] = { + [0] = BWN_WME_BESTEFFORT, + [1] = BWN_WME_BACKGROUND, + [2] = BWN_WME_VOICE, + [3] = BWN_WME_VIDEO, +}; + +static const struct siba_devid bwn_devs[] = { + SIBA_DEV(BROADCOM, 80211, 5, "Revision 5"), + SIBA_DEV(BROADCOM, 80211, 6, "Revision 6"), + SIBA_DEV(BROADCOM, 80211, 7, "Revision 7"), + SIBA_DEV(BROADCOM, 80211, 9, "Revision 9"), + SIBA_DEV(BROADCOM, 80211, 10, "Revision 10"), + SIBA_DEV(BROADCOM, 80211, 11, "Revision 11"), + SIBA_DEV(BROADCOM, 80211, 13, "Revision 13"), + SIBA_DEV(BROADCOM, 80211, 15, "Revision 15"), + SIBA_DEV(BROADCOM, 80211, 16, "Revision 16") +}; + +static int +bwn_probe(device_t dev) +{ + struct siba_dev_softc *sd = device_get_ivars(dev); + int i; + + for (i = 0; i < sizeof(bwn_devs) / sizeof(bwn_devs[0]); i++) { + if (sd->sd_id.sd_vendor == bwn_devs[i].sd_vendor && + sd->sd_id.sd_device == bwn_devs[i].sd_device && + sd->sd_id.sd_rev == bwn_devs[i].sd_rev) + return (BUS_PROBE_DEFAULT); + } + + return (ENXIO); +} + +static int +bwn_attach(device_t dev) +{ + struct bwn_mac *mac; + struct bwn_softc *sc = device_get_softc(dev); + struct siba_dev_softc *sd = device_get_ivars(dev); + struct siba_softc *siba = sd->sd_bus; + int error, i, msic, reg; + + sc->sc_dev = dev; + sc->sc_sd = sd; +#ifdef BWN_DEBUG + sc->sc_debug = bwn_debug; +#endif + + if ((sc->sc_flags & BWN_FLAG_ATTACHED) == 0) { + error = bwn_attach_pre(sc); + if (error != 0) + return (error); + bwn_sprom_bugfixes(sd->sd_bus); + sc->sc_flags |= BWN_FLAG_ATTACHED; + } + + if (!TAILQ_EMPTY(&sc->sc_maclist)) { + if (siba->siba_pci_did != 0x4313 && + siba->siba_pci_did != 0x431a && + siba->siba_pci_did != 0x4321) { + device_printf(sc->sc_dev, + "skip 802.11 cores\n"); + return (ENODEV); + } + } + + mac = (struct bwn_mac *)malloc(sizeof(*mac), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (mac == NULL) + return (ENOMEM); + mac->mac_sc = sc; + mac->mac_sd = sd; + mac->mac_status = BWN_MAC_STATUS_UNINIT; + if (bwn_bfp != 0) + mac->mac_flags |= BWN_MAC_FLAG_BADFRAME_PREEMP; + + TASK_INIT(&mac->mac_hwreset, 0, bwn_hwreset, mac); + TASK_INIT(&mac->mac_intrtask, 0, bwn_intrtask, mac); + TASK_INIT(&mac->mac_txpower, 0, bwn_txpwr, mac); + + error = bwn_attach_core(mac); + if (error) + goto fail0; + bwn_led_attach(mac); + + device_printf(sc->sc_dev, "WLAN (chipid %#x rev %u) " + "PHY (analog %d type %d rev %d) RADIO (manuf %#x ver %#x rev %d)\n", + sd->sd_bus->siba_chipid, sd->sd_id.sd_rev, + mac->mac_phy.analog, mac->mac_phy.type, mac->mac_phy.rev, + mac->mac_phy.rf_manuf, mac->mac_phy.rf_ver, + mac->mac_phy.rf_rev); + if (mac->mac_flags & BWN_MAC_FLAG_DMA) + device_printf(sc->sc_dev, "DMA (%d bits)\n", + mac->mac_method.dma.dmatype); + else + device_printf(sc->sc_dev, "PIO\n"); + + /* + * setup PCI resources and interrupt. + */ + if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) { + msic = pci_msi_count(dev); + if (bootverbose) + device_printf(sc->sc_dev, "MSI count : %d\n", msic); + } else + msic = 0; + + mac->mac_intr_spec = bwn_res_spec_legacy; + if (msic == BWN_MSI_MESSAGES && bwn_msi_disable == 0) { + if (pci_alloc_msi(dev, &msic) == 0) { + device_printf(sc->sc_dev, + "Using %d MSI messages\n", msic); + mac->mac_intr_spec = bwn_res_spec_msi; + mac->mac_msi = 1; + } + } + + error = bus_alloc_resources(dev, mac->mac_intr_spec, + mac->mac_res_irq); + if (error) { + device_printf(sc->sc_dev, + "couldn't allocate IRQ resources (%d)\n", error); + goto fail1; + } + + if (mac->mac_msi == 0) + error = bus_setup_intr(dev, mac->mac_res_irq[0], + INTR_TYPE_NET | INTR_MPSAFE, bwn_intr, NULL, mac, + &mac->mac_intrhand[0]); + else { + for (i = 0; i < BWN_MSI_MESSAGES; i++) { + error = bus_setup_intr(dev, mac->mac_res_irq[i], + INTR_TYPE_NET | INTR_MPSAFE, bwn_intr, NULL, mac, + &mac->mac_intrhand[i]); + if (error != 0) { + device_printf(sc->sc_dev, + "couldn't setup interrupt (%d)\n", error); + break; + } + } + } + + TAILQ_INSERT_TAIL(&sc->sc_maclist, mac, mac_list); + + /* + * calls attach-post routine + */ + if ((sc->sc_flags & BWN_FLAG_ATTACHED) != 0) + bwn_attach_post(sc); + + return (0); +fail1: + if (msic == BWN_MSI_MESSAGES && bwn_msi_disable == 0) + pci_release_msi(dev); +fail0: + free(mac, M_DEVBUF); + return (error); +} + +static int +bwn_is_valid_ether_addr(uint8_t *addr) +{ + char zero_addr[6] = { 0, 0, 0, 0, 0, 0 }; + + if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN))) + return (FALSE); + + return (TRUE); +} + +static int +bwn_attach_post(struct bwn_softc *sc) +{ + struct ieee80211com *ic; + struct ifnet *ifp = sc->sc_ifp; + struct siba_dev_softc *sd = sc->sc_sd; + struct siba_sprom *sprom = &sd->sd_bus->siba_sprom; + + ic = ifp->if_l2com; + ic->ic_ifp = ifp; + /* XXX not right but it's not used anywhere important */ + ic->ic_phytype = IEEE80211_T_OFDM; + ic->ic_opmode = IEEE80211_M_STA; + ic->ic_caps = + IEEE80211_C_STA /* station mode supported */ + | IEEE80211_C_MONITOR /* monitor mode */ + | IEEE80211_C_AHDEMO /* adhoc demo mode */ + | IEEE80211_C_SHPREAMBLE /* short preamble supported */ + | IEEE80211_C_SHSLOT /* short slot time supported */ + | IEEE80211_C_WME /* WME/WMM supported */ + | IEEE80211_C_WPA /* capable of WPA1+WPA2 */ + | IEEE80211_C_BGSCAN /* capable of bg scanning */ + | IEEE80211_C_TXPMGT /* capable of txpow mgt */ + ; + + /* call MI attach routine. */ + ieee80211_ifattach(ic, + bwn_is_valid_ether_addr(sprom->mac_80211a) ? sprom->mac_80211a : + sprom->mac_80211bg); + + ic->ic_headroom = sizeof(struct bwn_txhdr); + + /* override default methods */ + ic->ic_raw_xmit = bwn_raw_xmit; + ic->ic_newassoc = bwn_newassoc; + ic->ic_updateslot = bwn_updateslot; + ic->ic_update_promisc = bwn_update_promisc; + ic->ic_wme.wme_update = bwn_wme_update; + + ic->ic_node_alloc = bwn_node_alloc; + sc->sc_node_cleanup = ic->ic_node_cleanup; + ic->ic_node_cleanup = bwn_node_cleanup; + + ic->ic_scan_start = bwn_scan_start; + ic->ic_scan_end = bwn_scan_end; + ic->ic_set_channel = bwn_set_channel; + + ic->ic_vap_create = bwn_vap_create; + ic->ic_vap_delete = bwn_vap_delete; + + ieee80211_radiotap_attach(ic, + &sc->sc_tx_th.wt_ihdr, sizeof(sc->sc_tx_th), + BWN_TX_RADIOTAP_PRESENT, + &sc->sc_rx_th.wr_ihdr, sizeof(sc->sc_rx_th), + BWN_RX_RADIOTAP_PRESENT); + + bwn_sysctl_node(sc); + + if (bootverbose) + ieee80211_announce(ic); + return (0); +} + +static void +bwn_phy_detach(struct bwn_mac *mac) +{ + + if (mac->mac_phy.detach != NULL) + mac->mac_phy.detach(mac); +} + +static int +bwn_detach(device_t dev) +{ + struct bwn_softc *sc = device_get_softc(dev); + struct bwn_mac *mac = sc->sc_curmac; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + int i; + + sc->sc_flags |= BWN_FLAG_INVALID; + + if (device_is_attached(sc->sc_dev)) { + bwn_stop(sc, 1); + bwn_dma_free(mac); + callout_drain(&sc->sc_led_blink_ch); + callout_drain(&sc->sc_rfswitch_ch); + callout_drain(&sc->sc_task_ch); + callout_drain(&sc->sc_watchdog_ch); + bwn_phy_detach(mac); + if (ifp != NULL) { + ieee80211_draintask(ic, &mac->mac_hwreset); + ieee80211_draintask(ic, &mac->mac_txpower); + ieee80211_ifdetach(ic); + if_free(ifp); + } + } + taskqueue_drain(sc->sc_tq, &mac->mac_intrtask); + taskqueue_free(sc->sc_tq); + + for (i = 0; i < BWN_MSI_MESSAGES; i++) { + if (mac->mac_intrhand[i] != NULL) { + bus_teardown_intr(dev, mac->mac_res_irq[i], + mac->mac_intrhand[i]); + mac->mac_intrhand[i] = NULL; + } + } + bus_release_resources(dev, mac->mac_intr_spec, mac->mac_res_irq); + if (mac->mac_msi != 0) + pci_release_msi(dev); + + BWN_LOCK_DESTROY(sc); + return (0); +} + +static int +bwn_attach_pre(struct bwn_softc *sc) +{ + struct ifnet *ifp; + int error = 0; + + BWN_LOCK_INIT(sc); + TAILQ_INIT(&sc->sc_maclist); + callout_init_mtx(&sc->sc_rfswitch_ch, &sc->sc_mtx, 0); + callout_init_mtx(&sc->sc_task_ch, &sc->sc_mtx, 0); + callout_init_mtx(&sc->sc_watchdog_ch, &sc->sc_mtx, 0); + + sc->sc_tq = taskqueue_create_fast("bwn_taskq", M_NOWAIT, + taskqueue_thread_enqueue, &sc->sc_tq); + taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, + "%s taskq", device_get_nameunit(sc->sc_dev)); + + ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); + if (ifp == NULL) { + device_printf(sc->sc_dev, "can not if_alloc()\n"); + error = ENOSPC; + goto fail; + } + + /* set these up early for if_printf use */ + if_initname(ifp, device_get_name(sc->sc_dev), + device_get_unit(sc->sc_dev)); + + ifp->if_softc = sc; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_init = bwn_init; + ifp->if_ioctl = bwn_ioctl; + ifp->if_start = bwn_start; + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_READY(&ifp->if_snd); + + return (0); + +fail: BWN_LOCK_DESTROY(sc); + return (error); +} + +static void +bwn_sprom_bugfixes(struct siba_softc *siba) +{ +#define BWN_ISDEV(_vendor, _device, _subvendor, _subdevice) \ + ((siba->siba_pci_vid == PCI_VENDOR_##_vendor) && \ + (siba->siba_pci_did == _device) && \ + (siba->siba_pci_subvid == PCI_VENDOR_##_subvendor) && \ + (siba->siba_pci_subdid == _subdevice)) + + if (siba->siba_board_vendor == PCI_VENDOR_APPLE && + siba->siba_board_type == 0x4e && siba->siba_board_rev > 0x40) + siba->siba_sprom.bf_lo |= BWN_BFL_PACTRL; + if (siba->siba_board_vendor == SIBA_BOARDVENDOR_DELL && + siba->siba_chipid == 0x4301 && siba->siba_board_rev == 0x74) + siba->siba_sprom.bf_lo |= BWN_BFL_BTCOEXIST; + if (siba->siba_type == SIBA_TYPE_PCI) { + if (BWN_ISDEV(BROADCOM, 0x4318, ASUSTEK, 0x100f) || + BWN_ISDEV(BROADCOM, 0x4320, DELL, 0x0003) || + BWN_ISDEV(BROADCOM, 0x4320, HP, 0x12f8) || + BWN_ISDEV(BROADCOM, 0x4320, LINKSYS, 0x0013) || + BWN_ISDEV(BROADCOM, 0x4320, LINKSYS, 0x0014) || + BWN_ISDEV(BROADCOM, 0x4320, LINKSYS, 0x0015) || + BWN_ISDEV(BROADCOM, 0x4320, MOTOROLA, 0x7010)) + siba->siba_sprom.bf_lo &= ~BWN_BFL_BTCOEXIST; + } +#undef BWN_ISDEV +} + +static int +bwn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ +#define IS_RUNNING(ifp) \ + ((ifp->if_flags & IFF_UP) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) + struct bwn_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + struct ifreq *ifr = (struct ifreq *)data; + int error = 0, startall; + + switch (cmd) { + case SIOCSIFFLAGS: + startall = 0; + if (IS_RUNNING(ifp)) { + bwn_update_promisc(ifp); + } else if (ifp->if_flags & IFF_UP) { + if ((sc->sc_flags & BWN_FLAG_INVALID) == 0) { + bwn_init(sc); + startall = 1; + } + } else + bwn_stop(sc, 1); + if (startall) + ieee80211_start_all(ic); + break; + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); + break; + case SIOCGIFADDR: + error = ether_ioctl(ifp, cmd, data); + break; + default: + error = EINVAL; + break; + } + return (error); +} + +static void +bwn_start(struct ifnet *ifp) +{ + struct bwn_softc *sc = ifp->if_softc; + + BWN_LOCK(sc); + bwn_start_locked(ifp); + BWN_UNLOCK(sc); +} + +static void +bwn_start_locked(struct ifnet *ifp) +{ + struct bwn_softc *sc = ifp->if_softc; + struct bwn_mac *mac = sc->sc_curmac; + struct ieee80211_frame *wh; + struct ieee80211_node *ni; + struct ieee80211_key *k; + struct mbuf *m; + + BWN_ASSERT_LOCKED(sc); + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || mac == NULL || + mac->mac_status < BWN_MAC_STATUS_STARTED) + return; + + for (;;) { + IFQ_DRV_DEQUEUE(&ifp->if_snd, m); /* XXX: LOCK */ + if (m == NULL) + break; + + if (bwn_tx_isfull(sc, m)) + break; + ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; + if (ni == NULL) { + device_printf(sc->sc_dev, "unexpected NULL ni\n"); + m_freem(m); + ifp->if_oerrors++; + continue; + } + KASSERT(ni != NULL, ("%s:%d: fail", __func__, __LINE__)); + wh = mtod(m, struct ieee80211_frame *); + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + k = ieee80211_crypto_encap(ni, m); + if (k == NULL) { + ieee80211_free_node(ni); + m_freem(m); + ifp->if_oerrors++; + continue; + } + } + wh = NULL; /* Catch any invalid use */ + + if (bwn_tx_start(sc, ni, m) != 0) { + if (ni != NULL) + ieee80211_free_node(ni); + ifp->if_oerrors++; + continue; + } + + sc->sc_watchdog_timer = 5; + } +} + +static int +bwn_tx_isfull(struct bwn_softc *sc, struct mbuf *m) +{ + struct bwn_dma_ring *dr; + struct bwn_mac *mac = sc->sc_curmac; + struct bwn_pio_txqueue *tq; + struct ifnet *ifp = sc->sc_ifp; + int pktlen = roundup(m->m_pkthdr.len + BWN_HDRSIZE(mac), 4); + + BWN_ASSERT_LOCKED(sc); + + if (mac->mac_flags & BWN_MAC_FLAG_DMA) { + dr = bwn_dma_select(mac, M_WME_GETAC(m)); + if (dr->dr_stop == 1 || + bwn_dma_freeslot(dr) < BWN_TX_SLOTS_PER_FRAME) { + dr->dr_stop = 1; + goto full; + } + } else { + tq = bwn_pio_select(mac, M_WME_GETAC(m)); + if (tq->tq_free == 0 || pktlen > tq->tq_size || + pktlen > (tq->tq_size - tq->tq_used)) { + tq->tq_stop = 1; + goto full; + } + } + return (0); +full: + IFQ_DRV_PREPEND(&ifp->if_snd, m); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + return (1); +} + +static int +bwn_tx_start(struct bwn_softc *sc, struct ieee80211_node *ni, struct mbuf *m) +{ + struct bwn_mac *mac = sc->sc_curmac; + int error; + + BWN_ASSERT_LOCKED(sc); + + if (m->m_pkthdr.len < IEEE80211_MIN_LEN || mac == NULL) { + m_freem(m); + return (ENXIO); + } + + error = (mac->mac_flags & BWN_MAC_FLAG_DMA) ? + bwn_dma_tx_start(mac, ni, m) : bwn_pio_tx_start(mac, ni, m); + if (error) { + m_freem(m); + return (error); + } + return (0); +} + +static int +bwn_pio_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni, struct mbuf *m) +{ + struct bwn_pio_txpkt *tp; + struct bwn_pio_txqueue *tq = bwn_pio_select(mac, M_WME_GETAC(m)); + struct bwn_softc *sc = mac->mac_sc; + struct bwn_txhdr txhdr; + struct mbuf *m_new; + uint32_t ctl32; + int error; + uint16_t ctl16; + + BWN_ASSERT_LOCKED(sc); + + /* XXX TODO send packets after DTIM */ + + KASSERT(!TAILQ_EMPTY(&tq->tq_pktlist), ("%s: fail", __func__)); + tp = TAILQ_FIRST(&tq->tq_pktlist); + tp->tp_ni = ni; + tp->tp_m = m; + + error = bwn_set_txhdr(mac, ni, m, &txhdr, BWN_PIO_COOKIE(tq, tp)); + if (error) { + device_printf(sc->sc_dev, "tx fail\n"); + return (error); + } + + TAILQ_REMOVE(&tq->tq_pktlist, tp, tp_list); + tq->tq_used += roundup(m->m_pkthdr.len + BWN_HDRSIZE(mac), 4); + tq->tq_free--; + + if (mac->mac_sd->sd_id.sd_rev >= 8) { + /* + * XXX please removes m_defrag(9) + */ + m_new = m_defrag(m, M_DONTWAIT); + if (m_new == NULL) { + device_printf(sc->sc_dev, + "%s: can't defrag TX buffer\n", + __func__); + return (ENOBUFS); + } + if (m_new->m_next != NULL) + device_printf(sc->sc_dev, + "TODO: fragmented packets for PIO\n"); + tp->tp_m = m_new; + + /* send HEADER */ + ctl32 = bwn_pio_write_multi_4(mac, tq, + (BWN_PIO_READ_4(mac, tq, BWN_PIO8_TXCTL) | + BWN_PIO8_TXCTL_FRAMEREADY) & ~BWN_PIO8_TXCTL_EOF, + (const uint8_t *)&txhdr, BWN_HDRSIZE(mac)); + /* send BODY */ + ctl32 = bwn_pio_write_multi_4(mac, tq, ctl32, + mtod(m_new, const void *), m_new->m_pkthdr.len); + bwn_pio_write_4(mac, tq, BWN_PIO_TXCTL, + ctl32 | BWN_PIO8_TXCTL_EOF); + } else { + ctl16 = bwn_pio_write_multi_2(mac, tq, + (bwn_pio_read_2(mac, tq, BWN_PIO_TXCTL) | + BWN_PIO_TXCTL_FRAMEREADY) & ~BWN_PIO_TXCTL_EOF, + (const uint8_t *)&txhdr, BWN_HDRSIZE(mac)); + ctl16 = bwn_pio_write_mbuf_2(mac, tq, ctl16, m); + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, + ctl16 | BWN_PIO_TXCTL_EOF); + } + + return (0); +} + +static struct bwn_pio_txqueue * +bwn_pio_select(struct bwn_mac *mac, uint8_t prio) +{ + + if ((mac->mac_flags & BWN_MAC_FLAG_WME) == 0) + return (&mac->mac_method.pio.wme[WME_AC_BE]); + + switch (prio) { + case 0: + return (&mac->mac_method.pio.wme[WME_AC_BE]); + case 1: + return (&mac->mac_method.pio.wme[WME_AC_BK]); + case 2: + return (&mac->mac_method.pio.wme[WME_AC_VI]); + case 3: + return (&mac->mac_method.pio.wme[WME_AC_VO]); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (NULL); +} + +static int +bwn_dma_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni, struct mbuf *m) +{ +#define BWN_GET_TXHDRCACHE(slot) \ + &(txhdr_cache[(slot / BWN_TX_SLOTS_PER_FRAME) * BWN_HDRSIZE(mac)]) + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_dma_ring *dr = bwn_dma_select(mac, M_WME_GETAC(m)); + struct bwn_dmadesc_generic *desc; + struct bwn_dmadesc_meta *mt; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + uint8_t *txhdr_cache = (uint8_t *)dr->dr_txhdr_cache; + int error, slot, backup[2] = { dr->dr_curslot, dr->dr_usedslot }; + + BWN_ASSERT_LOCKED(sc); + KASSERT(!dr->dr_stop, ("%s:%d: fail", __func__, __LINE__)); + + /* XXX send after DTIM */ + + slot = bwn_dma_getslot(dr); + dr->getdesc(dr, slot, &desc, &mt); + KASSERT(mt->mt_txtype == BWN_DMADESC_METATYPE_HEADER, + ("%s:%d: fail", __func__, __LINE__)); + + error = bwn_set_txhdr(dr->dr_mac, ni, m, + (struct bwn_txhdr *)BWN_GET_TXHDRCACHE(slot), + BWN_DMA_COOKIE(dr, slot)); + if (error) + goto fail; + error = bus_dmamap_load(dr->dr_txring_dtag, mt->mt_dmap, + BWN_GET_TXHDRCACHE(slot), BWN_HDRSIZE(mac), bwn_dma_ring_addr, + &mt->mt_paddr, BUS_DMA_NOWAIT); + if (error) { + if_printf(ifp, "%s: can't load TX buffer (1) %d\n", + __func__, error); + goto fail; + } + bus_dmamap_sync(dr->dr_txring_dtag, mt->mt_dmap, + BUS_DMASYNC_PREWRITE); + dr->setdesc(dr, desc, mt->mt_paddr, BWN_HDRSIZE(mac), 1, 0, 0); + bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, + BUS_DMASYNC_PREWRITE); + + slot = bwn_dma_getslot(dr); + dr->getdesc(dr, slot, &desc, &mt); + KASSERT(mt->mt_txtype == BWN_DMADESC_METATYPE_BODY && + mt->mt_islast == 1, ("%s:%d: fail", __func__, __LINE__)); + mt->mt_m = m; + mt->mt_ni = ni; + + error = bus_dmamap_load_mbuf(dma->txbuf_dtag, mt->mt_dmap, m, + bwn_dma_buf_addr, &mt->mt_paddr, BUS_DMA_NOWAIT); + if (error && error != EFBIG) { + if_printf(ifp, "%s: can't load TX buffer (1) %d\n", + __func__, error); + goto fail; + } + if (error) { /* error == EFBIG */ + struct mbuf *m_new; + + m_new = m_defrag(m, M_DONTWAIT); + if (m_new == NULL) { + if_printf(ifp, "%s: can't defrag TX buffer\n", + __func__); + error = ENOBUFS; + goto fail; + } else { + m = m_new; + } + + mt->mt_m = m; + error = bus_dmamap_load_mbuf(dma->txbuf_dtag, mt->mt_dmap, + m, bwn_dma_buf_addr, &mt->mt_paddr, BUS_DMA_NOWAIT); + if (error) { + if_printf(ifp, "%s: can't load TX buffer (2) %d\n", + __func__, error); + goto fail; + } + } + bus_dmamap_sync(dma->txbuf_dtag, mt->mt_dmap, BUS_DMASYNC_PREWRITE); + dr->setdesc(dr, desc, mt->mt_paddr, m->m_pkthdr.len, 0, 1, 1); + bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, + BUS_DMASYNC_PREWRITE); + + /* XXX send after DTIM */ + + dr->start_transfer(dr, bwn_dma_nextslot(dr, slot)); + return (0); +fail: + dr->dr_curslot = backup[0]; + dr->dr_usedslot = backup[1]; + return (error); +#undef BWN_GET_TXHDRCACHE +} + +static void +bwn_watchdog(void *arg) +{ + struct bwn_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + + if (sc->sc_watchdog_timer != 0 && --sc->sc_watchdog_timer == 0) { + if_printf(ifp, "device timeout\n"); + ifp->if_oerrors++; + } + callout_schedule(&sc->sc_watchdog_ch, hz); +} + +static int +bwn_attach_core(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + int error, have_bg = 0, have_a = 0; + uint32_t high; + + KASSERT(sd->sd_id.sd_rev >= 5, + ("unsupported revision %d", sd->sd_id.sd_rev)); + + siba_powerup(siba, 0); + + high = siba_read_4(sd, SIBA_TGSHIGH); + bwn_reset_core(mac, + (high & BWN_TGSHIGH_HAVE_2GHZ) ? BWN_TGSLOW_SUPPORT_G : 0); + error = bwn_phy_getinfo(mac, high); + if (error) + goto fail; + + have_a = (high & BWN_TGSHIGH_HAVE_5GHZ) ? 1 : 0; + have_bg = (high & BWN_TGSHIGH_HAVE_2GHZ) ? 1 : 0; + if (siba->siba_pci_did != 0x4312 && siba->siba_pci_did != 0x4319 && + siba->siba_pci_did != 0x4324) { + have_a = have_bg = 0; + if (mac->mac_phy.type == BWN_PHYTYPE_A) + have_a = 1; + else if (mac->mac_phy.type == BWN_PHYTYPE_G || + mac->mac_phy.type == BWN_PHYTYPE_N || + mac->mac_phy.type == BWN_PHYTYPE_LP) + have_bg = 1; + else + KASSERT(0 == 1, ("%s: unknown phy type (%d)", __func__, + mac->mac_phy.type)); + } + /* XXX turns off PHY A because it's not supported */ + if (mac->mac_phy.type != BWN_PHYTYPE_LP && + mac->mac_phy.type != BWN_PHYTYPE_N) { + have_a = 0; + have_bg = 1; + } + + if (mac->mac_phy.type == BWN_PHYTYPE_G) { + mac->mac_phy.attach = bwn_phy_g_attach; + mac->mac_phy.detach = bwn_phy_g_detach; + mac->mac_phy.prepare_hw = bwn_phy_g_prepare_hw; + mac->mac_phy.init_pre = bwn_phy_g_init_pre; + mac->mac_phy.init = bwn_phy_g_init; + mac->mac_phy.exit = bwn_phy_g_exit; + mac->mac_phy.phy_read = bwn_phy_g_read; + mac->mac_phy.phy_write = bwn_phy_g_write; + mac->mac_phy.rf_read = bwn_phy_g_rf_read; + mac->mac_phy.rf_write = bwn_phy_g_rf_write; + mac->mac_phy.use_hwpctl = bwn_phy_g_hwpctl; + mac->mac_phy.rf_onoff = bwn_phy_g_rf_onoff; + mac->mac_phy.switch_analog = bwn_phy_switch_analog; + mac->mac_phy.switch_channel = bwn_phy_g_switch_channel; + mac->mac_phy.get_default_chan = bwn_phy_g_get_default_chan; + mac->mac_phy.set_antenna = bwn_phy_g_set_antenna; + mac->mac_phy.set_im = bwn_phy_g_im; + mac->mac_phy.recalc_txpwr = bwn_phy_g_recalc_txpwr; + mac->mac_phy.set_txpwr = bwn_phy_g_set_txpwr; + mac->mac_phy.task_15s = bwn_phy_g_task_15s; + mac->mac_phy.task_60s = bwn_phy_g_task_60s; + } else if (mac->mac_phy.type == BWN_PHYTYPE_LP) { + mac->mac_phy.init_pre = bwn_phy_lp_init_pre; + mac->mac_phy.init = bwn_phy_lp_init; + mac->mac_phy.phy_read = bwn_phy_lp_read; + mac->mac_phy.phy_write = bwn_phy_lp_write; + mac->mac_phy.phy_maskset = bwn_phy_lp_maskset; + mac->mac_phy.rf_read = bwn_phy_lp_rf_read; + mac->mac_phy.rf_write = bwn_phy_lp_rf_write; + mac->mac_phy.rf_onoff = bwn_phy_lp_rf_onoff; + mac->mac_phy.switch_analog = bwn_phy_lp_switch_analog; + mac->mac_phy.switch_channel = bwn_phy_lp_switch_channel; + mac->mac_phy.get_default_chan = bwn_phy_lp_get_default_chan; + mac->mac_phy.set_antenna = bwn_phy_lp_set_antenna; + mac->mac_phy.task_60s = bwn_phy_lp_task_60s; + } else { + device_printf(sc->sc_dev, "unsupported PHY type (%d)\n", + mac->mac_phy.type); + error = ENXIO; + goto fail; + } + + mac->mac_phy.gmode = have_bg; + if (mac->mac_phy.attach != NULL) { + error = mac->mac_phy.attach(mac); + if (error) { + device_printf(sc->sc_dev, "failed\n"); + goto fail; + } + } + + bwn_reset_core(mac, have_bg ? BWN_TGSLOW_SUPPORT_G : 0); + + error = bwn_chiptest(mac); + if (error) + goto fail; + error = bwn_setup_channels(mac, have_bg, have_a); + if (error) { + device_printf(sc->sc_dev, "failed to setup channels\n"); + goto fail; + } + + if (sc->sc_curmac == NULL) + sc->sc_curmac = mac; + + error = bwn_dma_attach(mac); + if (error != 0) { + device_printf(sc->sc_dev, "failed to initialize DMA\n"); + goto fail; + } + + mac->mac_phy.switch_analog(mac, 0); + + siba_dev_down(sd, 0); +fail: + siba_powerdown(siba); + return (error); +} + +static void +bwn_reset_core(struct bwn_mac *mac, uint32_t flags) +{ + struct siba_dev_softc *sd = mac->mac_sd; + uint32_t low, ctl; + + flags |= (BWN_TGSLOW_PHYCLOCK_ENABLE | BWN_TGSLOW_PHYRESET); + + siba_dev_up(sd, flags); + DELAY(2000); + + low = (siba_read_4(sd, SIBA_TGSLOW) | SIBA_TGSLOW_FGC) & + ~BWN_TGSLOW_PHYRESET; + siba_write_4(sd, SIBA_TGSLOW, low); + siba_read_4(sd, SIBA_TGSLOW); + DELAY(1000); + siba_write_4(sd, SIBA_TGSLOW, low & ~SIBA_TGSLOW_FGC); + siba_read_4(sd, SIBA_TGSLOW); + DELAY(1000); + + if (mac->mac_phy.switch_analog != NULL) + mac->mac_phy.switch_analog(mac, 1); + + ctl = BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_GMODE; + if (flags & BWN_TGSLOW_SUPPORT_G) + ctl |= BWN_MACCTL_GMODE; + BWN_WRITE_4(mac, BWN_MACCTL, ctl | BWN_MACCTL_IHR_ON); +} + +static int +bwn_phy_getinfo(struct bwn_mac *mac, int tgshigh) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_softc *sc = mac->mac_sc; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + uint32_t tmp; + + /* PHY */ + tmp = BWN_READ_2(mac, BWN_PHYVER); + phy->gmode = (tgshigh & BWN_TGSHIGH_HAVE_2GHZ) ? 1 : 0; + phy->rf_on = 1; + phy->analog = (tmp & BWN_PHYVER_ANALOG) >> 12; + phy->type = (tmp & BWN_PHYVER_TYPE) >> 8; + phy->rev = (tmp & BWN_PHYVER_VERSION); + if ((phy->type == BWN_PHYTYPE_A && phy->rev >= 4) || + (phy->type == BWN_PHYTYPE_B && phy->rev != 2 && + phy->rev != 4 && phy->rev != 6 && phy->rev != 7) || + (phy->type == BWN_PHYTYPE_G && phy->rev > 9) || + (phy->type == BWN_PHYTYPE_N && phy->rev > 4) || + (phy->type == BWN_PHYTYPE_LP && phy->rev > 2)) + goto unsupphy; + + /* RADIO */ + if (siba->siba_chipid == 0x4317) { + if (siba->siba_chiprev == 0) + tmp = 0x3205017f; + else if (siba->siba_chiprev == 1) + tmp = 0x4205017f; + else + tmp = 0x5205017f; + } else { + BWN_WRITE_2(mac, BWN_RFCTL, BWN_RFCTL_ID); + tmp = BWN_READ_2(mac, BWN_RFDATALO); + BWN_WRITE_2(mac, BWN_RFCTL, BWN_RFCTL_ID); + tmp |= (uint32_t)BWN_READ_2(mac, BWN_RFDATAHI) << 16; + } + phy->rf_rev = (tmp & 0xf0000000) >> 28; + phy->rf_ver = (tmp & 0x0ffff000) >> 12; + phy->rf_manuf = (tmp & 0x00000fff); + if (phy->rf_manuf != 0x17f) /* 0x17f is broadcom */ + goto unsupradio; + if ((phy->type == BWN_PHYTYPE_A && (phy->rf_ver != 0x2060 || + phy->rf_rev != 1 || phy->rf_manuf != 0x17f)) || + (phy->type == BWN_PHYTYPE_B && (phy->rf_ver & 0xfff0) != 0x2050) || + (phy->type == BWN_PHYTYPE_G && phy->rf_ver != 0x2050) || + (phy->type == BWN_PHYTYPE_N && + phy->rf_ver != 0x2055 && phy->rf_ver != 0x2056) || + (phy->type == BWN_PHYTYPE_LP && + phy->rf_ver != 0x2062 && phy->rf_ver != 0x2063)) + goto unsupradio; + + return (0); +unsupphy: + device_printf(sc->sc_dev, "unsupported PHY (type %#x, rev %#x, " + "analog %#x)\n", + phy->type, phy->rev, phy->analog); + return (ENXIO); +unsupradio: + device_printf(sc->sc_dev, "unsupported radio (manuf %#x, ver %#x, " + "rev %#x)\n", + phy->rf_manuf, phy->rf_ver, phy->rf_rev); + return (ENXIO); +} + +static int +bwn_chiptest(struct bwn_mac *mac) +{ +#define TESTVAL0 0x55aaaa55 +#define TESTVAL1 0xaa5555aa + struct bwn_softc *sc = mac->mac_sc; + struct siba_dev_softc *sd = mac->mac_sd; + uint32_t v, backup; + + BWN_LOCK(sc); + + backup = bwn_shm_read_4(mac, BWN_SHARED, 0); + + bwn_shm_write_4(mac, BWN_SHARED, 0, TESTVAL0); + if (bwn_shm_read_4(mac, BWN_SHARED, 0) != TESTVAL0) + goto error; + bwn_shm_write_4(mac, BWN_SHARED, 0, TESTVAL1); + if (bwn_shm_read_4(mac, BWN_SHARED, 0) != TESTVAL1) + goto error; + + bwn_shm_write_4(mac, BWN_SHARED, 0, backup); + + if ((sd->sd_id.sd_rev >= 3) && (sd->sd_id.sd_rev <= 10)) { + BWN_WRITE_2(mac, BWN_TSF_CFP_START, 0xaaaa); + BWN_WRITE_4(mac, BWN_TSF_CFP_START, 0xccccbbbb); + if (BWN_READ_2(mac, BWN_TSF_CFP_START_LOW) != 0xbbbb) + goto error; + if (BWN_READ_2(mac, BWN_TSF_CFP_START_HIGH) != 0xcccc) + goto error; + } + BWN_WRITE_4(mac, BWN_TSF_CFP_START, 0); + + v = BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_GMODE; + if (v != (BWN_MACCTL_GMODE | BWN_MACCTL_IHR_ON)) + goto error; + + BWN_UNLOCK(sc); + return (0); +error: + BWN_UNLOCK(sc); + device_printf(sc->sc_dev, "failed to validate the chipaccess\n"); + return (ENODEV); +} + +#define IEEE80211_CHAN_HTG (IEEE80211_CHAN_HT | IEEE80211_CHAN_G) +#define IEEE80211_CHAN_HTA (IEEE80211_CHAN_HT | IEEE80211_CHAN_A) + +static int +bwn_setup_channels(struct bwn_mac *mac, int have_bg, int have_a) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + memset(ic->ic_channels, 0, sizeof(ic->ic_channels)); + ic->ic_nchans = 0; + + if (have_bg) + bwn_addchannels(ic->ic_channels, IEEE80211_CHAN_MAX, + &ic->ic_nchans, &bwn_chantable_bg, IEEE80211_CHAN_G); + if (mac->mac_phy.type == BWN_PHYTYPE_N) { + if (have_a) + bwn_addchannels(ic->ic_channels, IEEE80211_CHAN_MAX, + &ic->ic_nchans, &bwn_chantable_n, + IEEE80211_CHAN_HTA); + } else { + if (have_a) + bwn_addchannels(ic->ic_channels, IEEE80211_CHAN_MAX, + &ic->ic_nchans, &bwn_chantable_a, + IEEE80211_CHAN_A); + } + + mac->mac_phy.supports_2ghz = have_bg; + mac->mac_phy.supports_5ghz = have_a; + + return (ic->ic_nchans == 0 ? ENXIO : 0); +} + +static uint32_t +bwn_shm_read_4(struct bwn_mac *mac, uint16_t way, uint16_t offset) +{ + uint32_t ret; + + BWN_ASSERT_LOCKED(mac->mac_sc); + + if (way == BWN_SHARED) { + KASSERT((offset & 0x0001) == 0, + ("%s:%d warn", __func__, __LINE__)); + if (offset & 0x0003) { + bwn_shm_ctlword(mac, way, offset >> 2); + ret = BWN_READ_2(mac, BWN_SHM_DATA_UNALIGNED); + ret <<= 16; + bwn_shm_ctlword(mac, way, (offset >> 2) + 1); + ret |= BWN_READ_2(mac, BWN_SHM_DATA); + goto out; + } + offset >>= 2; + } + bwn_shm_ctlword(mac, way, offset); + ret = BWN_READ_4(mac, BWN_SHM_DATA); +out: + return (ret); +} + +static uint16_t +bwn_shm_read_2(struct bwn_mac *mac, uint16_t way, uint16_t offset) +{ + uint16_t ret; + + BWN_ASSERT_LOCKED(mac->mac_sc); + + if (way == BWN_SHARED) { + KASSERT((offset & 0x0001) == 0, + ("%s:%d warn", __func__, __LINE__)); + if (offset & 0x0003) { + bwn_shm_ctlword(mac, way, offset >> 2); + ret = BWN_READ_2(mac, BWN_SHM_DATA_UNALIGNED); + goto out; + } + offset >>= 2; + } + bwn_shm_ctlword(mac, way, offset); + ret = BWN_READ_2(mac, BWN_SHM_DATA); +out: + + return (ret); +} + +static void +bwn_shm_ctlword(struct bwn_mac *mac, uint16_t way, + uint16_t offset) +{ + uint32_t control; + + control = way; + control <<= 16; + control |= offset; + BWN_WRITE_4(mac, BWN_SHM_CONTROL, control); +} + +static void +bwn_shm_write_4(struct bwn_mac *mac, uint16_t way, uint16_t offset, + uint32_t value) +{ + BWN_ASSERT_LOCKED(mac->mac_sc); + + if (way == BWN_SHARED) { + KASSERT((offset & 0x0001) == 0, + ("%s:%d warn", __func__, __LINE__)); + if (offset & 0x0003) { + bwn_shm_ctlword(mac, way, offset >> 2); + BWN_WRITE_2(mac, BWN_SHM_DATA_UNALIGNED, + (value >> 16) & 0xffff); + bwn_shm_ctlword(mac, way, (offset >> 2) + 1); + BWN_WRITE_2(mac, BWN_SHM_DATA, value & 0xffff); + return; + } + offset >>= 2; + } + bwn_shm_ctlword(mac, way, offset); + BWN_WRITE_4(mac, BWN_SHM_DATA, value); +} + +static void +bwn_shm_write_2(struct bwn_mac *mac, uint16_t way, uint16_t offset, + uint16_t value) +{ + BWN_ASSERT_LOCKED(mac->mac_sc); + + if (way == BWN_SHARED) { + KASSERT((offset & 0x0001) == 0, + ("%s:%d warn", __func__, __LINE__)); + if (offset & 0x0003) { + bwn_shm_ctlword(mac, way, offset >> 2); + BWN_WRITE_2(mac, BWN_SHM_DATA_UNALIGNED, value); + return; + } + offset >>= 2; + } + bwn_shm_ctlword(mac, way, offset); + BWN_WRITE_2(mac, BWN_SHM_DATA, value); +} + +static void +bwn_addchan(struct ieee80211_channel *c, int freq, int flags, int ieee, + int txpow) +{ + + c->ic_freq = freq; + c->ic_flags = flags; + c->ic_ieee = ieee; + c->ic_minpower = 0; + c->ic_maxpower = 2 * txpow; + c->ic_maxregpower = txpow; +} + +static void +bwn_addchannels(struct ieee80211_channel chans[], int maxchans, int *nchans, + const struct bwn_channelinfo *ci, int flags) +{ + struct ieee80211_channel *c; + int i; + + c = &chans[*nchans]; + + for (i = 0; i < ci->nchannels; i++) { + const struct bwn_channel *hc; + + hc = &ci->channels[i]; + if (*nchans >= maxchans) + break; + bwn_addchan(c, hc->freq, flags, hc->ieee, hc->maxTxPow); + c++, (*nchans)++; + if (flags == IEEE80211_CHAN_G || flags == IEEE80211_CHAN_HTG) { + /* g channel have a separate b-only entry */ + if (*nchans >= maxchans) + break; + c[0] = c[-1]; + c[-1].ic_flags = IEEE80211_CHAN_B; + c++, (*nchans)++; + } + if (flags == IEEE80211_CHAN_HTG) { + /* HT g channel have a separate g-only entry */ + if (*nchans >= maxchans) + break; + c[-1].ic_flags = IEEE80211_CHAN_G; + c[0] = c[-1]; + c[0].ic_flags &= ~IEEE80211_CHAN_HT; + c[0].ic_flags |= IEEE80211_CHAN_HT20; /* HT20 */ + c++, (*nchans)++; + } + if (flags == IEEE80211_CHAN_HTA) { + /* HT a channel have a separate a-only entry */ + if (*nchans >= maxchans) + break; + c[-1].ic_flags = IEEE80211_CHAN_A; + c[0] = c[-1]; + c[0].ic_flags &= ~IEEE80211_CHAN_HT; + c[0].ic_flags |= IEEE80211_CHAN_HT20; /* HT20 */ + c++, (*nchans)++; + } + } +} + +static int +bwn_phy_g_attach(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_sprom *sprom = &sd->sd_bus->siba_sprom; + unsigned int i; + int16_t pab0 = (int16_t)(sprom->pa0b0), pab1 = (int16_t)(sprom->pa0b1), + pab2 = (int16_t)(sprom->pa0b2); + static int8_t bwn_phy_g_tssi2dbm_table[] = BWN_PHY_G_TSSI2DBM_TABLE; + int8_t bg = (int8_t)sprom->tssi_bg; + + if ((sd->sd_bus->siba_chipid == 0x4301) && (phy->rf_ver != 0x2050)) + device_printf(sc->sc_dev, "not supported anymore\n"); + + pg->pg_flags = 0; + if (pab0 == 0 || pab1 == 0 || pab2 == 0 || pab0 == -1 || pab1 == -1 || + pab2 == -1) { + pg->pg_idletssi = 52; + pg->pg_tssi2dbm = bwn_phy_g_tssi2dbm_table; + return (0); + } + + pg->pg_idletssi = (bg == 0 || bg == -1) ? 62 : bg; + pg->pg_tssi2dbm = (uint8_t *)malloc(64, M_DEVBUF, M_NOWAIT | M_ZERO); + if (pg->pg_tssi2dbm == NULL) { + device_printf(sc->sc_dev, "failed to allocate buffer\n"); + return (ENOMEM); + } + for (i = 0; i < 64; i++) { + int32_t m1, m2, f, q, delta; + int8_t j = 0; + + m1 = BWN_TSSI2DBM(16 * pab0 + i * pab1, 32); + m2 = MAX(BWN_TSSI2DBM(32768 + i * pab2, 256), 1); + f = 256; + + do { + if (j > 15) { + device_printf(sc->sc_dev, + "failed to generate tssi2dBm\n"); + free(pg->pg_tssi2dbm, M_DEVBUF); + return (ENOMEM); + } + q = BWN_TSSI2DBM(f * 4096 - BWN_TSSI2DBM(m2 * f, 16) * + f, 2048); + delta = abs(q - f); + f = q; + j++; + } while (delta >= 2); + + pg->pg_tssi2dbm[i] = MIN(MAX(BWN_TSSI2DBM(m1 * f, 8192), -127), + 128); + } + + pg->pg_flags |= BWN_PHY_G_FLAG_TSSITABLE_ALLOC; + return (0); +} + +static void +bwn_phy_g_detach(struct bwn_mac *mac) +{ + struct bwn_phy_g *pg = &mac->mac_phy.phy_g; + + if (pg->pg_flags & BWN_PHY_G_FLAG_TSSITABLE_ALLOC) { + free(pg->pg_tssi2dbm, M_DEVBUF); + pg->pg_tssi2dbm = NULL; + } + pg->pg_flags = 0; +} + +static void +bwn_phy_g_init_pre(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + void *tssi2dbm; + int idletssi; + unsigned int i; + + tssi2dbm = pg->pg_tssi2dbm; + idletssi = pg->pg_idletssi; + + memset(pg, 0, sizeof(*pg)); + + pg->pg_tssi2dbm = tssi2dbm; + pg->pg_idletssi = idletssi; + + memset(pg->pg_minlowsig, 0xff, sizeof(pg->pg_minlowsig)); + + for (i = 0; i < N(pg->pg_nrssi); i++) + pg->pg_nrssi[i] = -1000; + for (i = 0; i < N(pg->pg_nrssi_lt); i++) + pg->pg_nrssi_lt[i] = i; + pg->pg_lofcal = 0xffff; + pg->pg_initval = 0xffff; + pg->pg_immode = BWN_IMMODE_NONE; + pg->pg_ofdmtab_dir = BWN_OFDMTAB_DIR_UNKNOWN; + pg->pg_avgtssi = 0xff; + + pg->pg_loctl.tx_bias = 0xff; + TAILQ_INIT(&pg->pg_loctl.calib_list); +} + +static int +bwn_phy_g_prepare_hw(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + struct siba_softc *bus = mac->mac_sd->sd_bus; + static const struct bwn_rfatt rfatt0[] = { + { 3, 0 }, { 1, 0 }, { 5, 0 }, { 7, 0 }, { 9, 0 }, { 2, 0 }, + { 0, 0 }, { 4, 0 }, { 6, 0 }, { 8, 0 }, { 1, 1 }, { 2, 1 }, + { 3, 1 }, { 4, 1 } + }; + static const struct bwn_rfatt rfatt1[] = { + { 2, 1 }, { 4, 1 }, { 6, 1 }, { 8, 1 }, { 10, 1 }, { 12, 1 }, + { 14, 1 } + }; + static const struct bwn_rfatt rfatt2[] = { + { 0, 1 }, { 2, 1 }, { 4, 1 }, { 6, 1 }, { 8, 1 }, { 9, 1 }, + { 9, 1 } + }; + static const struct bwn_bbatt bbatt_0[] = { + { 0 }, { 1 }, { 2 }, { 3 }, { 4 }, { 5 }, { 6 }, { 7 }, { 8 } + }; + + KASSERT(phy->type == BWN_PHYTYPE_G, ("%s fail", __func__)); + + if (phy->rf_ver == 0x2050 && phy->rf_rev < 6) + pg->pg_bbatt.att = 0; + else + pg->pg_bbatt.att = 2; + + /* prepare Radio Attenuation */ + pg->pg_rfatt.padmix = 0; + + if (bus->siba_board_vendor == SIBA_BOARDVENDOR_BCM && + bus->siba_board_type == SIBA_BOARD_BCM4309G) { + if (bus->siba_board_rev < 0x43) { + pg->pg_rfatt.att = 2; + goto done; + } else if (bus->siba_board_rev < 0x51) { + pg->pg_rfatt.att = 3; + goto done; + } + } + + if (phy->type == BWN_PHYTYPE_A) { + pg->pg_rfatt.att = 0x60; + goto done; + } + + switch (phy->rf_ver) { + case 0x2050: + switch (phy->rf_rev) { + case 0: + pg->pg_rfatt.att = 5; + goto done; + case 1: + if (phy->type == BWN_PHYTYPE_G) { + if (bus->siba_board_vendor == + SIBA_BOARDVENDOR_BCM && + bus->siba_board_type == + SIBA_BOARD_BCM4309G && + bus->siba_board_rev >= 30) + pg->pg_rfatt.att = 3; + else if (bus->siba_board_vendor == + SIBA_BOARDVENDOR_BCM && + bus->siba_board_type == SIBA_BOARD_BU4306) + pg->pg_rfatt.att = 3; + else + pg->pg_rfatt.att = 1; + } else { + if (bus->siba_board_vendor == + SIBA_BOARDVENDOR_BCM && + bus->siba_board_type == + SIBA_BOARD_BCM4309G && + bus->siba_board_rev >= 30) + pg->pg_rfatt.att = 7; + else + pg->pg_rfatt.att = 6; + } + goto done; + case 2: + if (phy->type == BWN_PHYTYPE_G) { + if (bus->siba_board_vendor == + SIBA_BOARDVENDOR_BCM && + bus->siba_board_type == + SIBA_BOARD_BCM4309G && + bus->siba_board_rev >= 30) + pg->pg_rfatt.att = 3; + else if (bus->siba_board_vendor == + SIBA_BOARDVENDOR_BCM && + bus->siba_board_type == SIBA_BOARD_BU4306) + pg->pg_rfatt.att = 5; + else if (bus->siba_chipid == 0x4320) + pg->pg_rfatt.att = 4; + else + pg->pg_rfatt.att = 3; + } else + pg->pg_rfatt.att = 6; + goto done; + case 3: + pg->pg_rfatt.att = 5; + goto done; + case 4: + case 5: + pg->pg_rfatt.att = 1; + goto done; + case 6: + case 7: + pg->pg_rfatt.att = 5; + goto done; + case 8: + pg->pg_rfatt.att = 0xa; + pg->pg_rfatt.padmix = 1; + goto done; + case 9: + default: + pg->pg_rfatt.att = 5; + goto done; + } + break; + case 0x2053: + switch (phy->rf_rev) { + case 1: + pg->pg_rfatt.att = 6; + goto done; + } + break; + } + pg->pg_rfatt.att = 5; +done: + pg->pg_txctl = (bwn_phy_g_txctl(mac) << 4); + + if (!bwn_has_hwpctl(mac)) { + lo->rfatt.array = rfatt0; + lo->rfatt.len = N(rfatt0); + lo->rfatt.min = 0; + lo->rfatt.max = 9; + goto genbbatt; + } + if (phy->rf_ver == 0x2050 && phy->rf_rev == 8) { + lo->rfatt.array = rfatt1; + lo->rfatt.len = N(rfatt1); + lo->rfatt.min = 0; + lo->rfatt.max = 14; + goto genbbatt; + } + lo->rfatt.array = rfatt2; + lo->rfatt.len = N(rfatt2); + lo->rfatt.min = 0; + lo->rfatt.max = 9; +genbbatt: + lo->bbatt.array = bbatt_0; + lo->bbatt.len = N(bbatt_0); + lo->bbatt.min = 0; + lo->bbatt.max = 8; + + BWN_READ_4(mac, BWN_MACCTL); + if (phy->rev == 1) { + phy->gmode = 0; + bwn_reset_core(mac, 0); + bwn_phy_g_init_sub(mac); + phy->gmode = 1; + bwn_reset_core(mac, BWN_TGSLOW_SUPPORT_G); + } + return (0); +} + +static uint16_t +bwn_phy_g_txctl(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + + if (phy->rf_ver != 0x2050) + return (0); + if (phy->rf_rev == 1) + return (BWN_TXCTL_PA2DB | BWN_TXCTL_TXMIX); + if (phy->rf_rev < 6) + return (BWN_TXCTL_PA2DB); + if (phy->rf_rev == 8) + return (BWN_TXCTL_TXMIX); + return (0); +} + +static int +bwn_phy_g_init(struct bwn_mac *mac) +{ + + bwn_phy_g_init_sub(mac); + return (0); +} + +static void +bwn_phy_g_exit(struct bwn_mac *mac) +{ + struct bwn_txpwr_loctl *lo = &mac->mac_phy.phy_g.pg_loctl; + struct bwn_lo_calib *cal, *tmp; + + if (lo == NULL) + return; + TAILQ_FOREACH_SAFE(cal, &lo->calib_list, list, tmp) { + TAILQ_REMOVE(&lo->calib_list, cal, list); + free(cal, M_DEVBUF); + } +} + +static uint16_t +bwn_phy_g_read(struct bwn_mac *mac, uint16_t reg) +{ + + BWN_WRITE_2(mac, BWN_PHYCTL, reg); + return (BWN_READ_2(mac, BWN_PHYDATA)); +} + +static void +bwn_phy_g_write(struct bwn_mac *mac, uint16_t reg, uint16_t value) +{ + + BWN_WRITE_2(mac, BWN_PHYCTL, reg); + BWN_WRITE_2(mac, BWN_PHYDATA, value); +} + +static uint16_t +bwn_phy_g_rf_read(struct bwn_mac *mac, uint16_t reg) +{ + + KASSERT(reg != 1, ("%s:%d: fail", __func__, __LINE__)); + BWN_WRITE_2(mac, BWN_RFCTL, reg | 0x80); + return (BWN_READ_2(mac, BWN_RFDATALO)); +} + +static void +bwn_phy_g_rf_write(struct bwn_mac *mac, uint16_t reg, uint16_t value) +{ + + KASSERT(reg != 1, ("%s:%d: fail", __func__, __LINE__)); + BWN_WRITE_2(mac, BWN_RFCTL, reg); + BWN_WRITE_2(mac, BWN_RFDATALO, value); +} + +static int +bwn_phy_g_hwpctl(struct bwn_mac *mac) +{ + + return (mac->mac_phy.rev >= 6); +} + +static void +bwn_phy_g_rf_onoff(struct bwn_mac *mac, int on) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + unsigned int channel; + uint16_t rfover, rfoverval; + + if (on) { + if (phy->rf_on) + return; + + BWN_PHY_WRITE(mac, 0x15, 0x8000); + BWN_PHY_WRITE(mac, 0x15, 0xcc00); + BWN_PHY_WRITE(mac, 0x15, (phy->gmode ? 0xc0 : 0x0)); + if (pg->pg_flags & BWN_PHY_G_FLAG_RADIOCTX_VALID) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, + pg->pg_radioctx_over); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + pg->pg_radioctx_overval); + pg->pg_flags &= ~BWN_PHY_G_FLAG_RADIOCTX_VALID; + } + channel = phy->chan; + bwn_phy_g_switch_chan(mac, 6, 1); + bwn_phy_g_switch_chan(mac, channel, 0); + return; + } + + rfover = BWN_PHY_READ(mac, BWN_PHY_RFOVER); + rfoverval = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL); + pg->pg_radioctx_over = rfover; + pg->pg_radioctx_overval = rfoverval; + pg->pg_flags |= BWN_PHY_G_FLAG_RADIOCTX_VALID; + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, rfover | 0x008c); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfoverval & 0xff73); +} + +static int +bwn_phy_g_switch_channel(struct bwn_mac *mac, uint32_t newchan) +{ + + if ((newchan < 1) || (newchan > 14)) + return (EINVAL); + bwn_phy_g_switch_chan(mac, newchan, 0); + + return (0); +} + +static uint32_t +bwn_phy_g_get_default_chan(struct bwn_mac *mac) +{ + + return (1); +} + +static void +bwn_phy_g_set_antenna(struct bwn_mac *mac, int antenna) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint64_t hf; + int autodiv = 0; + uint16_t tmp; + + if (antenna == BWN_ANTAUTO0 || antenna == BWN_ANTAUTO1) + autodiv = 1; + + hf = bwn_hf_read(mac) & ~BWN_HF_UCODE_ANTDIV_HELPER; + bwn_hf_write(mac, hf); + + BWN_PHY_WRITE(mac, BWN_PHY_BBANDCFG, + (BWN_PHY_READ(mac, BWN_PHY_BBANDCFG) & ~BWN_PHY_BBANDCFG_RXANT) | + ((autodiv ? BWN_ANTAUTO1 : antenna) + << BWN_PHY_BBANDCFG_RXANT_SHIFT)); + + if (autodiv) { + tmp = BWN_PHY_READ(mac, BWN_PHY_ANTDWELL); + if (antenna == BWN_ANTAUTO1) + tmp &= ~BWN_PHY_ANTDWELL_AUTODIV1; + else + tmp |= BWN_PHY_ANTDWELL_AUTODIV1; + BWN_PHY_WRITE(mac, BWN_PHY_ANTDWELL, tmp); + } + tmp = BWN_PHY_READ(mac, BWN_PHY_ANTWRSETT); + if (autodiv) + tmp |= BWN_PHY_ANTWRSETT_ARXDIV; + else + tmp &= ~BWN_PHY_ANTWRSETT_ARXDIV; + BWN_PHY_WRITE(mac, BWN_PHY_ANTWRSETT, tmp); + if (phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_OFDM61, + BWN_PHY_READ(mac, BWN_PHY_OFDM61) | BWN_PHY_OFDM61_10); + BWN_PHY_WRITE(mac, BWN_PHY_DIVSRCHGAINBACK, + (BWN_PHY_READ(mac, BWN_PHY_DIVSRCHGAINBACK) & 0xff00) | + 0x15); + if (phy->rev == 2) + BWN_PHY_WRITE(mac, BWN_PHY_ADIVRELATED, 8); + else + BWN_PHY_WRITE(mac, BWN_PHY_ADIVRELATED, + (BWN_PHY_READ(mac, BWN_PHY_ADIVRELATED) & 0xff00) | + 8); + } + if (phy->rev >= 6) + BWN_PHY_WRITE(mac, BWN_PHY_OFDM9B, 0xdc); + + hf |= BWN_HF_UCODE_ANTDIV_HELPER; + bwn_hf_write(mac, hf); +} + +static int +bwn_phy_g_im(struct bwn_mac *mac, int mode) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + + KASSERT(phy->type == BWN_PHYTYPE_G, ("%s: fail", __func__)); + KASSERT(mode == BWN_IMMODE_NONE, ("%s: fail", __func__)); + + if (phy->rev == 0 || !phy->gmode) + return (ENODEV); + + pg->pg_aci_wlan_automatic = 0; + return (0); +} + +static int +bwn_phy_g_recalc_txpwr(struct bwn_mac *mac, int ignore_tssi) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; + struct siba_softc *siba = mac->mac_sd->sd_bus; + unsigned int tssi; + int cck, ofdm; + int power; + int rfatt, bbatt; + unsigned int max; + + KASSERT(phy->type == BWN_PHYTYPE_G, ("%s: fail", __func__)); + + cck = bwn_phy_shm_tssi_read(mac, BWN_SHARED_TSSI_CCK); + ofdm = bwn_phy_shm_tssi_read(mac, BWN_SHARED_TSSI_OFDM_G); + if (cck < 0 && ofdm < 0) { + if (ignore_tssi == 0) + return (BWN_TXPWR_RES_DONE); + cck = 0; + ofdm = 0; + } + tssi = (cck < 0) ? ofdm : ((ofdm < 0) ? cck : (cck + ofdm) / 2); + if (pg->pg_avgtssi != 0xff) + tssi = (tssi + pg->pg_avgtssi) / 2; + pg->pg_avgtssi = tssi; + KASSERT(tssi < BWN_TSSI_MAX, ("%s:%d: fail", __func__, __LINE__)); + + max = siba->siba_sprom.maxpwr_bg; + if (siba->siba_sprom.bf_lo & BWN_BFL_PACTRL) + max -= 3; + if (max >= 120) { + device_printf(sc->sc_dev, "invalid max TX-power value\n"); + siba->siba_sprom.maxpwr_bg = max = 80; + } + + power = MIN(MAX((phy->txpower < 0) ? 0 : (phy->txpower << 2), 0), max) - + (pg->pg_tssi2dbm[MIN(MAX(pg->pg_idletssi - pg->pg_curtssi + + tssi, 0x00), 0x3f)]); + if (power == 0) + return (BWN_TXPWR_RES_DONE); + + rfatt = -((power + 7) / 8); + bbatt = (-(power / 2)) - (4 * rfatt); + if ((rfatt == 0) && (bbatt == 0)) + return (BWN_TXPWR_RES_DONE); + pg->pg_bbatt_delta = bbatt; + pg->pg_rfatt_delta = rfatt; + return (BWN_TXPWR_RES_NEED_ADJUST); +} + +static void +bwn_phy_g_set_txpwr(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; + int rfatt, bbatt; + uint8_t txctl; + + bwn_mac_suspend(mac); + + BWN_ASSERT_LOCKED(sc); + + bbatt = pg->pg_bbatt.att; + bbatt += pg->pg_bbatt_delta; + rfatt = pg->pg_rfatt.att; + rfatt += pg->pg_rfatt_delta; + + bwn_phy_g_setatt(mac, &bbatt, &rfatt); + txctl = pg->pg_txctl; + if ((phy->rf_ver == 0x2050) && (phy->rf_rev == 2)) { + if (rfatt <= 1) { + if (txctl == 0) { + txctl = BWN_TXCTL_PA2DB | BWN_TXCTL_TXMIX; + rfatt += 2; + bbatt += 2; + } else if (mac->mac_sd->sd_bus->siba_sprom. + bf_lo & + BWN_BFL_PACTRL) { + bbatt += 4 * (rfatt - 2); + rfatt = 2; + } + } else if (rfatt > 4 && txctl) { + txctl = 0; + if (bbatt < 3) { + rfatt -= 3; + bbatt += 2; + } else { + rfatt -= 2; + bbatt -= 2; + } + } + } + pg->pg_txctl = txctl; + bwn_phy_g_setatt(mac, &bbatt, &rfatt); + pg->pg_rfatt.att = rfatt; + pg->pg_bbatt.att = bbatt; + + DPRINTF(sc, BWN_DEBUG_TXPOW, "%s: adjust TX power\n", __func__); + + bwn_phy_lock(mac); + bwn_rf_lock(mac); + bwn_phy_g_set_txpwr_sub(mac, &pg->pg_bbatt, &pg->pg_rfatt, + pg->pg_txctl); + bwn_rf_unlock(mac); + bwn_phy_unlock(mac); + + bwn_mac_enable(mac); +} + +static void +bwn_phy_g_task_15s(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + unsigned long expire, now; + struct bwn_lo_calib *cal, *tmp; + uint8_t expired = 0; + + bwn_mac_suspend(mac); + + if (lo == NULL) + goto fail; + + BWN_GETTIME(now); + if (bwn_has_hwpctl(mac)) { + expire = now - BWN_LO_PWRVEC_EXPIRE; + if (time_before(lo->pwr_vec_read_time, expire)) { + bwn_lo_get_powervector(mac); + bwn_phy_g_dc_lookup_init(mac, 0); + } + goto fail; + } + + expire = now - BWN_LO_CALIB_EXPIRE; + TAILQ_FOREACH_SAFE(cal, &lo->calib_list, list, tmp) { + if (!time_before(cal->calib_time, expire)) + continue; + if (BWN_BBATTCMP(&cal->bbatt, &pg->pg_bbatt) && + BWN_RFATTCMP(&cal->rfatt, &pg->pg_rfatt)) { + KASSERT(!expired, ("%s:%d: fail", __func__, __LINE__)); + expired = 1; + } + + DPRINTF(sc, BWN_DEBUG_LO, "expired BB %u RF %u %u I %d Q %d\n", + cal->bbatt.att, cal->rfatt.att, cal->rfatt.padmix, + cal->ctl.i, cal->ctl.q); + + TAILQ_REMOVE(&lo->calib_list, cal, list); + free(cal, M_DEVBUF); + } + if (expired || TAILQ_EMPTY(&lo->calib_list)) { + cal = bwn_lo_calibset(mac, &pg->pg_bbatt, + &pg->pg_rfatt); + if (cal == NULL) { + device_printf(sc->sc_dev, + "failed to recalibrate LO\n"); + goto fail; + } + TAILQ_INSERT_TAIL(&lo->calib_list, cal, list); + bwn_lo_write(mac, &cal->ctl); + } + +fail: + bwn_mac_enable(mac); +} + +static void +bwn_phy_g_task_60s(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint8_t old = phy->chan; + + if (!(mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_RSSI)) + return; + + bwn_mac_suspend(mac); + bwn_nrssi_slope_11g(mac); + if ((phy->rf_ver == 0x2050) && (phy->rf_rev == 8)) { + bwn_switch_channel(mac, (old >= 8) ? 1 : 13); + bwn_switch_channel(mac, old); + } + bwn_mac_enable(mac); +} + +static void +bwn_phy_switch_analog(struct bwn_mac *mac, int on) +{ + + BWN_WRITE_2(mac, BWN_PHY0, on ? 0 : 0xf4); +} + +static int +bwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, + const struct ieee80211_bpf_params *params) +{ + struct ieee80211com *ic = ni->ni_ic; + struct ifnet *ifp = ic->ic_ifp; + struct bwn_softc *sc = ifp->if_softc; + struct bwn_mac *mac = sc->sc_curmac; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || + mac->mac_status < BWN_MAC_STATUS_STARTED) { + ieee80211_free_node(ni); + m_freem(m); + return (ENETDOWN); + } + + BWN_LOCK(sc); + if (bwn_tx_isfull(sc, m)) { + ieee80211_free_node(ni); + m_freem(m); + ifp->if_oerrors++; + BWN_UNLOCK(sc); + return (ENOBUFS); + } + + if (bwn_tx_start(sc, ni, m) != 0) { + if (ni != NULL) + ieee80211_free_node(ni); + ifp->if_oerrors++; + } + sc->sc_watchdog_timer = 5; + BWN_UNLOCK(sc); + return (0); +} + +/* + * Setup driver-specific state for a newly associated node. + * Note that we're called also on a re-associate, the isnew + * param tells us if this is the first time or not. + */ +static void +bwn_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct ieee80211vap *vap = ni->ni_vap; + + ieee80211_amrr_node_init(&BWN_VAP(vap)->bv_amrr, + &BWN_NODE(ni)->bn_amn, ni); +} + +/* + * Callback from the 802.11 layer to update the slot time + * based on the current setting. We use it to notify the + * firmware of ERP changes and the f/w takes care of things + * like slot time and preamble. + */ +static void +bwn_updateslot(struct ifnet *ifp) +{ + struct bwn_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + struct bwn_mac *mac; + + BWN_LOCK(sc); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + mac = (struct bwn_mac *)sc->sc_curmac; + bwn_set_slot_time(mac, + (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20); + } + BWN_UNLOCK(sc); +} + +/* + * Callback from the 802.11 layer after a promiscuous mode change. + * Note this interface does not check the operating mode as this + * is an internal callback and we are expected to honor the current + * state (e.g. this is used for setting the interface in promiscuous + * mode when operating in hostap mode to do ACS). + */ +static void +bwn_update_promisc(struct ifnet *ifp) +{ + struct bwn_softc *sc = ifp->if_softc; + struct bwn_mac *mac = sc->sc_curmac; + + BWN_LOCK(sc); + mac = sc->sc_curmac; + if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { + if (ifp->if_flags & IFF_PROMISC) + sc->sc_filters |= BWN_MACCTL_PROMISC; + else + sc->sc_filters &= ~BWN_MACCTL_PROMISC; + bwn_set_opmode(mac); + } + BWN_UNLOCK(sc); +} + +/* + * Callback from the 802.11 layer to update WME parameters. + */ +static int +bwn_wme_update(struct ieee80211com *ic) +{ + struct bwn_softc *sc = ic->ic_ifp->if_softc; + struct bwn_mac *mac = sc->sc_curmac; + struct wmeParams *wmep; + int i; + + BWN_LOCK(sc); + mac = sc->sc_curmac; + if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { + bwn_mac_suspend(mac); + for (i = 0; i < N(sc->sc_wmeParams); i++) { + wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[i]; + bwn_wme_loadparams(mac, wmep, bwn_wme_shm_offsets[i]); + } + bwn_mac_enable(mac); + } + BWN_UNLOCK(sc); + return (0); +} + +static struct ieee80211_node * +bwn_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) +{ + struct ieee80211com *ic = vap->iv_ic; + struct bwn_softc *sc = ic->ic_ifp->if_softc; + const size_t space = sizeof(struct bwn_node); + struct bwn_node *bn; + + bn = malloc(space, M_80211_NODE, M_NOWAIT|M_ZERO); + if (bn == NULL) { + /* XXX stat+msg */ + return (NULL); + } + DPRINTF(sc, BWN_DEBUG_NODE, "%s: bn %p\n", __func__, bn); + return (&bn->bn_node); +} + +static void +bwn_node_cleanup(struct ieee80211_node *ni) +{ + struct ieee80211com *ic = ni->ni_ic; + struct bwn_softc *sc = ic->ic_ifp->if_softc; + + sc->sc_node_cleanup(ni); +} + +static void +bwn_scan_start(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct bwn_softc *sc = ifp->if_softc; + struct bwn_mac *mac; + + BWN_LOCK(sc); + mac = sc->sc_curmac; + if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { + sc->sc_filters |= BWN_MACCTL_BEACON_PROMISC; + bwn_set_opmode(mac); + /* disable CFP update during scan */ + bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_SKIP_CFP_UPDATE); + } + BWN_UNLOCK(sc); +} + +static void +bwn_scan_end(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct bwn_softc *sc = ifp->if_softc; + struct bwn_mac *mac; + + BWN_LOCK(sc); + mac = sc->sc_curmac; + if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { + sc->sc_filters &= ~BWN_MACCTL_BEACON_PROMISC; + bwn_set_opmode(mac); + bwn_hf_write(mac, bwn_hf_read(mac) & ~BWN_HF_SKIP_CFP_UPDATE); + } + BWN_UNLOCK(sc); +} + +static void +bwn_set_channel(struct ieee80211com *ic) +{ + struct ifnet *ifp = ic->ic_ifp; + struct bwn_softc *sc = ifp->if_softc; + struct bwn_mac *mac = sc->sc_curmac; + struct bwn_phy *phy = &mac->mac_phy; + int chan, error; + + BWN_LOCK(sc); + + error = bwn_switch_band(sc, ic->ic_curchan); + if (error) + goto fail;; + bwn_mac_suspend(mac); + bwn_set_txretry(mac, BWN_RETRY_SHORT, BWN_RETRY_LONG); + chan = ieee80211_chan2ieee(ic, ic->ic_curchan); + if (chan != phy->chan) + bwn_switch_channel(mac, chan); + + /* TX power level */ + if (ic->ic_curchan->ic_maxpower != 0 && + ic->ic_curchan->ic_maxpower != phy->txpower) { + phy->txpower = ic->ic_curchan->ic_maxpower / 2; + bwn_phy_txpower_check(mac, BWN_TXPWR_IGNORE_TIME | + BWN_TXPWR_IGNORE_TSSI); + } + + bwn_set_txantenna(mac, BWN_ANT_DEFAULT); + if (phy->set_antenna) + phy->set_antenna(mac, BWN_ANT_DEFAULT); + + if (sc->sc_rf_enabled != phy->rf_on) { + if (sc->sc_rf_enabled) { + bwn_rf_turnon(mac); + if (!(mac->mac_flags & BWN_MAC_FLAG_RADIO_ON)) + device_printf(sc->sc_dev, + "please turns on the RF switch\n"); + } else + bwn_rf_turnoff(mac); + } + + bwn_mac_enable(mac); + +fail: + /* + * Setup radio tap channel freq and flags + */ + sc->sc_tx_th.wt_chan_freq = sc->sc_rx_th.wr_chan_freq = + htole16(ic->ic_curchan->ic_freq); + sc->sc_tx_th.wt_chan_flags = sc->sc_rx_th.wr_chan_flags = + htole16(ic->ic_curchan->ic_flags & 0xffff); + + BWN_UNLOCK(sc); +} + +static struct ieee80211vap * +bwn_vap_create(struct ieee80211com *ic, + const char name[IFNAMSIZ], int unit, int opmode, int flags, + const uint8_t bssid[IEEE80211_ADDR_LEN], + const uint8_t mac0[IEEE80211_ADDR_LEN]) +{ + struct ifnet *ifp = ic->ic_ifp; + struct bwn_softc *sc = ifp->if_softc; + struct ieee80211vap *vap; + struct bwn_vap *bvp; + uint8_t mac[IEEE80211_ADDR_LEN]; + + IEEE80211_ADDR_COPY(mac, mac0); + switch (opmode) { + case IEEE80211_M_HOSTAP: + case IEEE80211_M_MBSS: + case IEEE80211_M_STA: + case IEEE80211_M_WDS: + case IEEE80211_M_MONITOR: + case IEEE80211_M_IBSS: + case IEEE80211_M_AHDEMO: + break; + default: + return (NULL); + } + + IEEE80211_ADDR_COPY(sc->sc_macaddr, mac0); + + bvp = (struct bwn_vap *) malloc(sizeof(struct bwn_vap), + M_80211_VAP, M_NOWAIT | M_ZERO); + if (bvp == NULL) { + device_printf(sc->sc_dev, "failed to allocate a buffer\n"); + return (NULL); + } + vap = &bvp->bv_vap; + ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac); + IEEE80211_ADDR_COPY(vap->iv_myaddr, mac); + /* override with driver methods */ + bvp->bv_newstate = vap->iv_newstate; + vap->iv_newstate = bwn_newstate; + + /* override max aid so sta's cannot assoc when we're out of sta id's */ + vap->iv_max_aid = BWN_STAID_MAX; + + ieee80211_amrr_init(&bvp->bv_amrr, vap, + IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD, + IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD, + 500 /*ms*/); + + /* complete setup */ + ieee80211_vap_attach(vap, ieee80211_media_change, + ieee80211_media_status); + return (vap); +} + +static void +bwn_vap_delete(struct ieee80211vap *vap) +{ + struct bwn_vap *bvp = BWN_VAP(vap); + + ieee80211_amrr_cleanup(&bvp->bv_amrr); + ieee80211_vap_detach(vap); + free(bvp, M_80211_VAP); +} + +static void +bwn_init(void *arg) +{ + struct bwn_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + int error = 0; + + DPRINTF(sc, BWN_DEBUG_ANY, "%s: if_flags 0x%x\n", + __func__, ifp->if_flags); + + BWN_LOCK(sc); + error = bwn_init_locked(sc); + BWN_UNLOCK(sc); + + if (error == 0) + ieee80211_start_all(ic); /* start all vap's */ +} + +static int +bwn_init_locked(struct bwn_softc *sc) +{ + struct bwn_mac *mac; + struct ifnet *ifp = sc->sc_ifp; + int error; + + BWN_ASSERT_LOCKED(sc); + + bzero(sc->sc_bssid, IEEE80211_ADDR_LEN); + sc->sc_flags |= BWN_FLAG_NEED_BEACON_TP; + sc->sc_filters = 0; + bwn_wme_clear(sc); + sc->sc_beacons[0] = sc->sc_beacons[1] = 0; + sc->sc_rf_enabled = 1; + + mac = sc->sc_curmac; + if (mac->mac_status == BWN_MAC_STATUS_UNINIT) { + error = bwn_core_init(mac); + if (error != 0) + return (error); + } + if (mac->mac_status == BWN_MAC_STATUS_INITED) + bwn_core_start(mac); + + bwn_set_opmode(mac); + bwn_set_pretbtt(mac); + bwn_spu_setdelay(mac, 0); + bwn_set_macaddr(mac); + + ifp->if_drv_flags |= IFF_DRV_RUNNING; + callout_reset(&sc->sc_rfswitch_ch, hz, bwn_rfswitch, sc); + callout_reset(&sc->sc_watchdog_ch, hz, bwn_watchdog, sc); + + return (0); +} + +static void +bwn_stop(struct bwn_softc *sc, int statechg) +{ + + BWN_LOCK(sc); + bwn_stop_locked(sc, statechg); + BWN_UNLOCK(sc); +} + +static void +bwn_stop_locked(struct bwn_softc *sc, int statechg) +{ + struct bwn_mac *mac = sc->sc_curmac; + struct ifnet *ifp = sc->sc_ifp; + + BWN_ASSERT_LOCKED(sc); + + if (mac->mac_status >= BWN_MAC_STATUS_INITED) { + /* XXX FIXME opmode not based on VAP */ + bwn_set_opmode(mac); + bwn_set_macaddr(mac); + } + + if (mac->mac_status >= BWN_MAC_STATUS_STARTED) + bwn_core_stop(mac); + + callout_stop(&sc->sc_led_blink_ch); + sc->sc_led_blinking = 0; + + bwn_core_exit(mac); + sc->sc_rf_enabled = 0; + + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); +} + +static void +bwn_wme_clear(struct bwn_softc *sc) +{ +#define MS(_v, _f) (((_v) & _f) >> _f##_S) + struct wmeParams *p; + unsigned int i; + + KASSERT(N(bwn_wme_shm_offsets) == N(sc->sc_wmeParams), + ("%s:%d: fail", __func__, __LINE__)); + + for (i = 0; i < N(sc->sc_wmeParams); i++) { + p = &(sc->sc_wmeParams[i]); + + switch (bwn_wme_shm_offsets[i]) { + case BWN_WME_VOICE: + p->wmep_txopLimit = 0; + p->wmep_aifsn = 2; + /* XXX FIXME: log2(cwmin) */ + p->wmep_logcwmin = MS(0x0001, WME_PARAM_LOGCWMIN); + p->wmep_logcwmax = MS(0x0001, WME_PARAM_LOGCWMAX); + break; + case BWN_WME_VIDEO: + p->wmep_txopLimit = 0; + p->wmep_aifsn = 2; + /* XXX FIXME: log2(cwmin) */ + p->wmep_logcwmin = MS(0x0001, WME_PARAM_LOGCWMIN); + p->wmep_logcwmax = MS(0x0001, WME_PARAM_LOGCWMAX); + break; + case BWN_WME_BESTEFFORT: + p->wmep_txopLimit = 0; + p->wmep_aifsn = 3; + /* XXX FIXME: log2(cwmin) */ + p->wmep_logcwmin = MS(0x0001, WME_PARAM_LOGCWMIN); + p->wmep_logcwmax = MS(0x03ff, WME_PARAM_LOGCWMAX); + break; + case BWN_WME_BACKGROUND: + p->wmep_txopLimit = 0; + p->wmep_aifsn = 7; + /* XXX FIXME: log2(cwmin) */ + p->wmep_logcwmin = MS(0x0001, WME_PARAM_LOGCWMIN); + p->wmep_logcwmax = MS(0x03ff, WME_PARAM_LOGCWMAX); + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + } +} + +static int +bwn_core_init(struct bwn_mac *mac) +{ +#ifdef BWN_DEBUG + struct bwn_softc *sc = mac->mac_sc; +#endif + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + struct siba_sprom *sprom = &siba->siba_sprom; + uint64_t hf; + int error; + + KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, + ("%s:%d: fail", __func__, __LINE__)); + + siba_powerup(siba, 0); + if (!siba_dev_isup(sd)) + bwn_reset_core(mac, + mac->mac_phy.gmode ? BWN_TGSLOW_SUPPORT_G : 0); + + mac->mac_flags &= ~BWN_MAC_FLAG_DFQVALID; + mac->mac_flags |= BWN_MAC_FLAG_RADIO_ON; + mac->mac_phy.hwpctl = (bwn_hwpctl) ? 1 : 0; + BWN_GETTIME(mac->mac_phy.nexttime); + mac->mac_phy.txerrors = BWN_TXERROR_MAX; + bzero(&mac->mac_stats, sizeof(mac->mac_stats)); + mac->mac_stats.link_noise = -95; + mac->mac_reason_intr = 0; + bzero(mac->mac_reason, sizeof(mac->mac_reason)); + mac->mac_intr_mask = BWN_INTR_MASKTEMPLATE; +#ifdef BWN_DEBUG + if (sc->sc_debug & BWN_DEBUG_XMIT) + mac->mac_intr_mask &= ~BWN_INTR_PHY_TXERR; +#endif + mac->mac_suspended = 1; + mac->mac_task_state = 0; + memset(&mac->mac_noise, 0, sizeof(mac->mac_noise)); + + mac->mac_phy.init_pre(mac); + + siba_pcicore_intr(&siba->siba_pci, sd); + + bwn_fix_imcfglobug(mac); + bwn_bt_disable(mac); + if (mac->mac_phy.prepare_hw) { + error = mac->mac_phy.prepare_hw(mac); + if (error) + goto fail0; + } + error = bwn_chip_init(mac); + if (error) + goto fail0; + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_COREREV, + mac->mac_sd->sd_id.sd_rev); + hf = bwn_hf_read(mac); + if (mac->mac_phy.type == BWN_PHYTYPE_G) { + hf |= BWN_HF_GPHY_SYM_WORKAROUND; + if (sprom->bf_lo & BWN_BFL_PACTRL) + hf |= BWN_HF_PAGAINBOOST_OFDM_ON; + if (mac->mac_phy.rev == 1) + hf |= BWN_HF_GPHY_DC_CANCELFILTER; + } + if (mac->mac_phy.rf_ver == 0x2050) { + if (mac->mac_phy.rf_rev < 6) + hf |= BWN_HF_FORCE_VCO_RECALC; + if (mac->mac_phy.rf_rev == 6) + hf |= BWN_HF_4318_TSSI; + } + if (sprom->bf_lo & BWN_BFL_CRYSTAL_NOSLOW) + hf |= BWN_HF_SLOWCLOCK_REQ_OFF; + if ((siba->siba_type == SIBA_TYPE_PCI) && + (siba->siba_pci.spc_dev->sd_id.sd_rev <= 10)) + hf |= BWN_HF_PCI_SLOWCLOCK_WORKAROUND; + hf &= ~BWN_HF_SKIP_CFP_UPDATE; + bwn_hf_write(mac, hf); + + bwn_set_txretry(mac, BWN_RETRY_SHORT, BWN_RETRY_LONG); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_SHORT_RETRY_FALLBACK, 3); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_LONG_RETRY_FALLBACK, 2); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_MAXTIME, 1); + + bwn_rate_init(mac); + bwn_set_phytxctl(mac); + + bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_CONT_MIN, + (mac->mac_phy.type == BWN_PHYTYPE_B) ? 0x1f : 0xf); + bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_CONT_MAX, 0x3ff); + + if (siba->siba_type == SIBA_TYPE_PCMCIA || bwn_usedma == 0) + bwn_pio_init(mac); + else + bwn_dma_init(mac); + if (error) + goto fail1; + bwn_wme_init(mac); + bwn_spu_setdelay(mac, 1); + bwn_bt_enable(mac); + + siba_powerup(siba, !(sprom->bf_lo & BWN_BFL_CRYSTAL_NOSLOW)); + bwn_set_macaddr(mac); + bwn_crypt_init(mac); + + /* XXX LED initializatin */ + + mac->mac_status = BWN_MAC_STATUS_INITED; + + return (error); + +fail1: + bwn_chip_exit(mac); +fail0: + siba_powerdown(siba); + KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, + ("%s:%d: fail", __func__, __LINE__)); + return (error); +} + +static void +bwn_core_start(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + uint32_t tmp; + + KASSERT(mac->mac_status == BWN_MAC_STATUS_INITED, + ("%s:%d: fail", __func__, __LINE__)); + + if (mac->mac_sd->sd_id.sd_rev < 5) + return; + + while (1) { + tmp = BWN_READ_4(mac, BWN_XMITSTAT_0); + if (!(tmp & 0x00000001)) + break; + tmp = BWN_READ_4(mac, BWN_XMITSTAT_1); + } + + bwn_mac_enable(mac); + BWN_WRITE_4(mac, BWN_INTR_MASK, mac->mac_intr_mask); + callout_reset(&sc->sc_task_ch, hz * 15, bwn_tasks, mac); + + mac->mac_status = BWN_MAC_STATUS_STARTED; +} + +static void +bwn_core_exit(struct bwn_mac *mac) +{ + uint32_t macctl; + + BWN_ASSERT_LOCKED(mac->mac_sc); + + KASSERT(mac->mac_status <= BWN_MAC_STATUS_INITED, + ("%s:%d: fail", __func__, __LINE__)); + + if (mac->mac_status != BWN_MAC_STATUS_INITED) + return; + mac->mac_status = BWN_MAC_STATUS_UNINIT; + + macctl = BWN_READ_4(mac, BWN_MACCTL); + macctl &= ~BWN_MACCTL_MCODE_RUN; + macctl |= BWN_MACCTL_MCODE_JMP0; + BWN_WRITE_4(mac, BWN_MACCTL, macctl); + + bwn_dma_stop(mac); + bwn_pio_stop(mac); + bwn_chip_exit(mac); + mac->mac_phy.switch_analog(mac, 0); + siba_dev_down(mac->mac_sd, 0); + siba_powerdown(mac->mac_sd->sd_bus); +} + +static void +bwn_fix_imcfglobug(struct bwn_mac *mac) +{ + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + uint32_t tmp; + + if (siba->siba_pci.spc_dev == NULL) + return; + if (siba->siba_pci.spc_dev->sd_id.sd_device != SIBA_DEVID_PCI || + siba->siba_pci.spc_dev->sd_id.sd_rev > 5) + return; + + tmp = siba_read_4(sd, SIBA_IMCFGLO) & + ~(SIBA_IMCFGLO_REQTO | SIBA_IMCFGLO_SERTO); + switch (siba->siba_type) { + case SIBA_TYPE_PCI: + case SIBA_TYPE_PCMCIA: + tmp |= 0x32; + break; + case SIBA_TYPE_SSB: + tmp |= 0x53; + break; + } + siba_write_4(sd, SIBA_IMCFGLO, tmp); +} + +static void +bwn_bt_disable(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + + (void)sc; + /* XXX do nothing yet */ +} + +static int +bwn_chip_init(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint32_t macctl; + int error; + + macctl = BWN_MACCTL_IHR_ON | BWN_MACCTL_SHM_ON | BWN_MACCTL_STA; + if (phy->gmode) + macctl |= BWN_MACCTL_GMODE; + BWN_WRITE_4(mac, BWN_MACCTL, macctl); + + error = bwn_fw_fillinfo(mac); + if (error) + return (error); + error = bwn_fw_loaducode(mac); + if (error) + return (error); + + error = bwn_gpio_init(mac); + if (error) + return (error); + + error = bwn_fw_loadinitvals(mac); + if (error) { + bwn_gpio_cleanup(mac); + return (error); + } + phy->switch_analog(mac, 1); + error = bwn_phy_init(mac); + if (error) { + bwn_gpio_cleanup(mac); + return (error); + } + if (phy->set_im) + phy->set_im(mac, BWN_IMMODE_NONE); + if (phy->set_antenna) + phy->set_antenna(mac, BWN_ANT_DEFAULT); + bwn_set_txantenna(mac, BWN_ANT_DEFAULT); + + if (phy->type == BWN_PHYTYPE_B) + BWN_WRITE_2(mac, 0x005e, BWN_READ_2(mac, 0x005e) | 0x0004); + BWN_WRITE_4(mac, 0x0100, 0x01000000); + if (mac->mac_sd->sd_id.sd_rev < 5) + BWN_WRITE_4(mac, 0x010c, 0x01000000); + + BWN_WRITE_4(mac, BWN_MACCTL, + BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_STA); + BWN_WRITE_4(mac, BWN_MACCTL, + BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_STA); + bwn_shm_write_2(mac, BWN_SHARED, 0x0074, 0x0000); + + bwn_set_opmode(mac); + if (mac->mac_sd->sd_id.sd_rev < 3) { + BWN_WRITE_2(mac, 0x060e, 0x0000); + BWN_WRITE_2(mac, 0x0610, 0x8000); + BWN_WRITE_2(mac, 0x0604, 0x0000); + BWN_WRITE_2(mac, 0x0606, 0x0200); + } else { + BWN_WRITE_4(mac, 0x0188, 0x80000000); + BWN_WRITE_4(mac, 0x018c, 0x02000000); + } + BWN_WRITE_4(mac, BWN_INTR_REASON, 0x00004000); + BWN_WRITE_4(mac, BWN_DMA0_INTR_MASK, 0x0001dc00); + BWN_WRITE_4(mac, BWN_DMA1_INTR_MASK, 0x0000dc00); + BWN_WRITE_4(mac, BWN_DMA2_INTR_MASK, 0x0000dc00); + BWN_WRITE_4(mac, BWN_DMA3_INTR_MASK, 0x0001dc00); + BWN_WRITE_4(mac, BWN_DMA4_INTR_MASK, 0x0000dc00); + BWN_WRITE_4(mac, BWN_DMA5_INTR_MASK, 0x0000dc00); + siba_write_4(mac->mac_sd, SIBA_TGSLOW, + siba_read_4(mac->mac_sd, SIBA_TGSLOW) | 0x00100000); + BWN_WRITE_2(mac, BWN_POWERUP_DELAY, + mac->mac_sd->sd_bus->siba_cc.scc_powerup_delay); + return (error); +} + +/* read hostflags */ +static uint64_t +bwn_hf_read(struct bwn_mac *mac) +{ + uint64_t ret; + + ret = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFHI); + ret <<= 16; + ret |= bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFMI); + ret <<= 16; + ret |= bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFLO); + return (ret); +} + +static void +bwn_hf_write(struct bwn_mac *mac, uint64_t value) +{ + + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_HFLO, + (value & 0x00000000ffffull)); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_HFMI, + (value & 0x0000ffff0000ull) >> 16); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_HFHI, + (value & 0xffff00000000ULL) >> 32); +} + +static void +bwn_set_txretry(struct bwn_mac *mac, int s, int l) +{ + + bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_SHORT_RETRY, MIN(s, 0xf)); + bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_LONG_RETRY, MIN(l, 0xf)); +} + +static void +bwn_rate_init(struct bwn_mac *mac) +{ + + switch (mac->mac_phy.type) { + case BWN_PHYTYPE_A: + case BWN_PHYTYPE_G: + case BWN_PHYTYPE_LP: + case BWN_PHYTYPE_N: + bwn_rate_write(mac, BWN_OFDM_RATE_6MB, 1); + bwn_rate_write(mac, BWN_OFDM_RATE_12MB, 1); + bwn_rate_write(mac, BWN_OFDM_RATE_18MB, 1); + bwn_rate_write(mac, BWN_OFDM_RATE_24MB, 1); + bwn_rate_write(mac, BWN_OFDM_RATE_36MB, 1); + bwn_rate_write(mac, BWN_OFDM_RATE_48MB, 1); + bwn_rate_write(mac, BWN_OFDM_RATE_54MB, 1); + if (mac->mac_phy.type == BWN_PHYTYPE_A) + break; + /* FALLTHROUGH */ + case BWN_PHYTYPE_B: + bwn_rate_write(mac, BWN_CCK_RATE_1MB, 0); + bwn_rate_write(mac, BWN_CCK_RATE_2MB, 0); + bwn_rate_write(mac, BWN_CCK_RATE_5MB, 0); + bwn_rate_write(mac, BWN_CCK_RATE_11MB, 0); + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } +} + +static void +bwn_rate_write(struct bwn_mac *mac, uint16_t rate, int ofdm) +{ + uint16_t offset; + + if (ofdm) { + offset = 0x480; + offset += (bwn_plcp_getofdm(rate) & 0x000f) * 2; + } else { + offset = 0x4c0; + offset += (bwn_plcp_getcck(rate) & 0x000f) * 2; + } + bwn_shm_write_2(mac, BWN_SHARED, offset + 0x20, + bwn_shm_read_2(mac, BWN_SHARED, offset)); +} + +static uint8_t +bwn_plcp_getcck(const uint8_t bitrate) +{ + + switch (bitrate) { + case BWN_CCK_RATE_1MB: + return (0x0a); + case BWN_CCK_RATE_2MB: + return (0x14); + case BWN_CCK_RATE_5MB: + return (0x37); + case BWN_CCK_RATE_11MB: + return (0x6e); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (0); +} + +static uint8_t +bwn_plcp_getofdm(const uint8_t bitrate) +{ + + switch (bitrate) { + case BWN_OFDM_RATE_6MB: + return (0xb); + case BWN_OFDM_RATE_9MB: + return (0xf); + case BWN_OFDM_RATE_12MB: + return (0xa); + case BWN_OFDM_RATE_18MB: + return (0xe); + case BWN_OFDM_RATE_24MB: + return (0x9); + case BWN_OFDM_RATE_36MB: + return (0xd); + case BWN_OFDM_RATE_48MB: + return (0x8); + case BWN_OFDM_RATE_54MB: + return (0xc); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (0); +} + +static void +bwn_set_phytxctl(struct bwn_mac *mac) +{ + uint16_t ctl; + + ctl = (BWN_TX_PHY_ENC_CCK | BWN_TX_PHY_ANT01AUTO | + BWN_TX_PHY_TXPWR); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_BEACON_PHYCTL, ctl); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_ACKCTS_PHYCTL, ctl); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_PHYCTL, ctl); +} + +static void +bwn_pio_init(struct bwn_mac *mac) +{ + struct bwn_pio *pio = &mac->mac_method.pio; + + BWN_WRITE_4(mac, BWN_MACCTL, BWN_READ_4(mac, BWN_MACCTL) + & ~BWN_MACCTL_BIGENDIAN); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_RX_PADOFFSET, 0); + + bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_BK], 0); + bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_BE], 1); + bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_VI], 2); + bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_VO], 3); + bwn_pio_set_txqueue(mac, &pio->mcast, 4); + bwn_pio_setupqueue_rx(mac, &pio->rx, 0); +} + +static void +bwn_pio_set_txqueue(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, + int index) +{ + struct bwn_pio_txpkt *tp; + unsigned int i; + + tq->tq_base = bwn_pio_idx2base(mac, index) + BWN_PIO_TXQOFFSET(mac); + tq->tq_index = index; + + tq->tq_free = BWN_PIO_MAX_TXPACKETS; + if (mac->mac_sd->sd_id.sd_rev >= 8) + tq->tq_size = 1920; + else { + tq->tq_size = bwn_pio_read_2(mac, tq, BWN_PIO_TXQBUFSIZE); + tq->tq_size -= 80; + } + + TAILQ_INIT(&tq->tq_pktlist); + for (i = 0; i < N(tq->tq_pkts); i++) { + tp = &(tq->tq_pkts[i]); + tp->tp_index = i; + tp->tp_queue = tq; + TAILQ_INSERT_TAIL(&tq->tq_pktlist, tp, tp_list); + } +} + +static uint16_t +bwn_pio_idx2base(struct bwn_mac *mac, int index) +{ + struct bwn_softc *sc = mac->mac_sc; + static const uint16_t bases[] = { + BWN_PIO_BASE0, + BWN_PIO_BASE1, + BWN_PIO_BASE2, + BWN_PIO_BASE3, + BWN_PIO_BASE4, + BWN_PIO_BASE5, + BWN_PIO_BASE6, + BWN_PIO_BASE7, + }; + static const uint16_t bases_rev11[] = { + BWN_PIO11_BASE0, + BWN_PIO11_BASE1, + BWN_PIO11_BASE2, + BWN_PIO11_BASE3, + BWN_PIO11_BASE4, + BWN_PIO11_BASE5, + }; + + if (mac->mac_sd->sd_id.sd_rev >= 11) { + if (index >= N(bases_rev11)) + device_printf(sc->sc_dev, "%s: warning\n", __func__); + return (bases_rev11[index]); + } + if (index >= N(bases)) + device_printf(sc->sc_dev, "%s: warning\n", __func__); + return (bases[index]); +} + +static void +bwn_pio_setupqueue_rx(struct bwn_mac *mac, struct bwn_pio_rxqueue *prq, + int index) +{ + + prq->prq_mac = mac; + prq->prq_rev = mac->mac_sd->sd_id.sd_rev; + prq->prq_base = bwn_pio_idx2base(mac, index) + BWN_PIO_RXQOFFSET(mac); + bwn_dma_rxdirectfifo(mac, index, 1); +} + +static void +bwn_destroy_pioqueue_tx(struct bwn_pio_txqueue *tq) +{ + if (tq == NULL) + return; + bwn_pio_cancel_tx_packets(tq); +} + +static void +bwn_destroy_queue_tx(struct bwn_pio_txqueue *pio) +{ + + bwn_destroy_pioqueue_tx(pio); +} + +static uint16_t +bwn_pio_read_2(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, + uint16_t offset) +{ + + return (BWN_READ_2(mac, tq->tq_base + offset)); +} + +static void +bwn_dma_rxdirectfifo(struct bwn_mac *mac, int idx, uint8_t enable) +{ + uint32_t ctl; + int type; + uint16_t base; + + type = bwn_dma_mask2type(bwn_dma_mask(mac)); + base = bwn_dma_base(type, idx); + if (type == BWN_DMA_64BIT) { + ctl = BWN_READ_4(mac, base + BWN_DMA64_RXCTL); + ctl &= ~BWN_DMA64_RXDIRECTFIFO; + if (enable) + ctl |= BWN_DMA64_RXDIRECTFIFO; + BWN_WRITE_4(mac, base + BWN_DMA64_RXCTL, ctl); + } else { + ctl = BWN_READ_4(mac, base + BWN_DMA32_RXCTL); + ctl &= ~BWN_DMA32_RXDIRECTFIFO; + if (enable) + ctl |= BWN_DMA32_RXDIRECTFIFO; + BWN_WRITE_4(mac, base + BWN_DMA32_RXCTL, ctl); + } +} + +static uint64_t +bwn_dma_mask(struct bwn_mac *mac) +{ + uint32_t tmp; + uint16_t base; + + tmp = BWN_READ_4(mac, SIBA_TGSHIGH); + if (tmp & SIBA_TGSHIGH_DMA64) + return (BWN_DMA_BIT_MASK(64)); + base = bwn_dma_base(0, 0); + BWN_WRITE_4(mac, base + BWN_DMA32_TXCTL, BWN_DMA32_TXADDREXT_MASK); + tmp = BWN_READ_4(mac, base + BWN_DMA32_TXCTL); + if (tmp & BWN_DMA32_TXADDREXT_MASK) + return (BWN_DMA_BIT_MASK(32)); + + return (BWN_DMA_BIT_MASK(30)); +} + +static int +bwn_dma_mask2type(uint64_t dmamask) +{ + + if (dmamask == BWN_DMA_BIT_MASK(30)) + return (BWN_DMA_30BIT); + if (dmamask == BWN_DMA_BIT_MASK(32)) + return (BWN_DMA_32BIT); + if (dmamask == BWN_DMA_BIT_MASK(64)) + return (BWN_DMA_64BIT); + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (BWN_DMA_30BIT); +} + +static void +bwn_pio_cancel_tx_packets(struct bwn_pio_txqueue *tq) +{ + struct bwn_pio_txpkt *tp; + unsigned int i; + + for (i = 0; i < N(tq->tq_pkts); i++) { + tp = &(tq->tq_pkts[i]); + if (tp->tp_m) { + m_freem(tp->tp_m); + tp->tp_m = NULL; + } + } +} + +static uint16_t +bwn_dma_base(int type, int controller_idx) +{ + static const uint16_t map64[] = { + BWN_DMA64_BASE0, + BWN_DMA64_BASE1, + BWN_DMA64_BASE2, + BWN_DMA64_BASE3, + BWN_DMA64_BASE4, + BWN_DMA64_BASE5, + }; + static const uint16_t map32[] = { + BWN_DMA32_BASE0, + BWN_DMA32_BASE1, + BWN_DMA32_BASE2, + BWN_DMA32_BASE3, + BWN_DMA32_BASE4, + BWN_DMA32_BASE5, + }; + + if (type == BWN_DMA_64BIT) { + KASSERT(controller_idx >= 0 && controller_idx < N(map64), + ("%s:%d: fail", __func__, __LINE__)); + return (map64[controller_idx]); + } + KASSERT(controller_idx >= 0 && controller_idx < N(map32), + ("%s:%d: fail", __func__, __LINE__)); + return (map32[controller_idx]); +} + +static void +bwn_dma_init(struct bwn_mac *mac) +{ + struct bwn_dma *dma = &mac->mac_method.dma; + + /* setup TX DMA channels. */ + bwn_dma_setup(dma->wme[WME_AC_BK]); + bwn_dma_setup(dma->wme[WME_AC_BE]); + bwn_dma_setup(dma->wme[WME_AC_VI]); + bwn_dma_setup(dma->wme[WME_AC_VO]); + bwn_dma_setup(dma->mcast); + /* setup RX DMA channel. */ + bwn_dma_setup(dma->rx); +} + +static struct bwn_dma_ring * +bwn_dma_ringsetup(struct bwn_mac *mac, int controller_index, + int for_tx, int type) +{ + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_dma_ring *dr; + struct bwn_dmadesc_generic *desc; + struct bwn_dmadesc_meta *mt; + struct bwn_softc *sc = mac->mac_sc; + int error, i; + + dr = malloc(sizeof(*dr), M_DEVBUF, M_NOWAIT | M_ZERO); + if (dr == NULL) + goto out; + dr->dr_numslots = BWN_RXRING_SLOTS; + if (for_tx) + dr->dr_numslots = BWN_TXRING_SLOTS; + + dr->dr_meta = malloc(dr->dr_numslots * sizeof(struct bwn_dmadesc_meta), + M_DEVBUF, M_NOWAIT | M_ZERO); + if (dr->dr_meta == NULL) + goto fail0; + + dr->dr_type = type; + dr->dr_mac = mac; + dr->dr_base = bwn_dma_base(type, controller_index); + dr->dr_index = controller_index; + if (type == BWN_DMA_64BIT) { + dr->getdesc = bwn_dma_64_getdesc; + dr->setdesc = bwn_dma_64_setdesc; + dr->start_transfer = bwn_dma_64_start_transfer; + dr->suspend = bwn_dma_64_suspend; + dr->resume = bwn_dma_64_resume; + dr->get_curslot = bwn_dma_64_get_curslot; + dr->set_curslot = bwn_dma_64_set_curslot; + } else { + dr->getdesc = bwn_dma_32_getdesc; + dr->setdesc = bwn_dma_32_setdesc; + dr->start_transfer = bwn_dma_32_start_transfer; + dr->suspend = bwn_dma_32_suspend; + dr->resume = bwn_dma_32_resume; + dr->get_curslot = bwn_dma_32_get_curslot; + dr->set_curslot = bwn_dma_32_set_curslot; + } + if (for_tx) { + dr->dr_tx = 1; + dr->dr_curslot = -1; + } else { + if (dr->dr_index == 0) { + dr->dr_rx_bufsize = BWN_DMA0_RX_BUFFERSIZE; + dr->dr_frameoffset = BWN_DMA0_RX_FRAMEOFFSET; + } else + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + + error = bwn_dma_allocringmemory(dr); + if (error) + goto fail2; + + if (for_tx) { + /* + * Assumption: BWN_TXRING_SLOTS can be divided by + * BWN_TX_SLOTS_PER_FRAME + */ + KASSERT(BWN_TXRING_SLOTS % BWN_TX_SLOTS_PER_FRAME == 0, + ("%s:%d: fail", __func__, __LINE__)); + + dr->dr_txhdr_cache = + malloc((dr->dr_numslots / BWN_TX_SLOTS_PER_FRAME) * + BWN_HDRSIZE(mac), M_DEVBUF, M_NOWAIT | M_ZERO); + KASSERT(dr->dr_txhdr_cache != NULL, + ("%s:%d: fail", __func__, __LINE__)); + + /* + * Create TX ring DMA stuffs + */ + error = bus_dma_tag_create(dma->parent_dtag, + BWN_ALIGN, 0, + BUS_SPACE_MAXADDR, + BUS_SPACE_MAXADDR, + NULL, NULL, + BWN_HDRSIZE(mac), + 1, + BUS_SPACE_MAXSIZE_32BIT, + 0, + NULL, NULL, + &dr->dr_txring_dtag); + if (error) { + device_printf(sc->sc_dev, + "can't create TX ring DMA tag: TODO frees\n"); + goto fail1; + } + + for (i = 0; i < dr->dr_numslots; i += 2) { + dr->getdesc(dr, i, &desc, &mt); + + mt->mt_txtype = BWN_DMADESC_METATYPE_HEADER; + mt->mt_m = NULL; + mt->mt_ni = NULL; + mt->mt_islast = 0; + error = bus_dmamap_create(dr->dr_txring_dtag, 0, + &mt->mt_dmap); + if (error) { + device_printf(sc->sc_dev, + "can't create RX buf DMA map\n"); + goto fail1; + } + + dr->getdesc(dr, i + 1, &desc, &mt); + + mt->mt_txtype = BWN_DMADESC_METATYPE_BODY; + mt->mt_m = NULL; + mt->mt_ni = NULL; + mt->mt_islast = 1; + error = bus_dmamap_create(dma->txbuf_dtag, 0, + &mt->mt_dmap); + if (error) { + device_printf(sc->sc_dev, + "can't create RX buf DMA map\n"); + goto fail1; + } + } + } else { + error = bus_dmamap_create(dma->rxbuf_dtag, 0, + &dr->dr_spare_dmap); + if (error) { + device_printf(sc->sc_dev, + "can't create RX buf DMA map\n"); + goto out; /* XXX wrong! */ + } + + for (i = 0; i < dr->dr_numslots; i++) { + dr->getdesc(dr, i, &desc, &mt); + + error = bus_dmamap_create(dma->rxbuf_dtag, 0, + &mt->mt_dmap); + if (error) { + device_printf(sc->sc_dev, + "can't create RX buf DMA map\n"); + goto out; /* XXX wrong! */ + } + error = bwn_dma_newbuf(dr, desc, mt, 1); + if (error) { + device_printf(sc->sc_dev, + "failed to allocate RX buf\n"); + goto out; /* XXX wrong! */ + } + } + + bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, + BUS_DMASYNC_PREWRITE); + + dr->dr_usedslot = dr->dr_numslots; + } + + out: + return (dr); + +fail2: + free(dr->dr_txhdr_cache, M_DEVBUF); +fail1: + free(dr->dr_meta, M_DEVBUF); +fail0: + free(dr, M_DEVBUF); + return (NULL); +} + +static void +bwn_dma_ringfree(struct bwn_dma_ring **dr) +{ + + if (dr == NULL) + return; + + bwn_dma_free_descbufs(*dr); + bwn_dma_free_ringmemory(*dr); + + free((*dr)->dr_txhdr_cache, M_DEVBUF); + free((*dr)->dr_meta, M_DEVBUF); + free(*dr, M_DEVBUF); + + *dr = NULL; +} + +static void +bwn_dma_32_getdesc(struct bwn_dma_ring *dr, int slot, + struct bwn_dmadesc_generic **gdesc, struct bwn_dmadesc_meta **meta) +{ + struct bwn_dmadesc32 *desc; + + *meta = &(dr->dr_meta[slot]); + desc = dr->dr_ring_descbase; + desc = &(desc[slot]); + + *gdesc = (struct bwn_dmadesc_generic *)desc; +} + +static void +bwn_dma_32_setdesc(struct bwn_dma_ring *dr, + struct bwn_dmadesc_generic *desc, bus_addr_t dmaaddr, uint16_t bufsize, + int start, int end, int irq) +{ + struct bwn_dmadesc32 *descbase = dr->dr_ring_descbase; + uint32_t addr, addrext, ctl; + int slot; + + slot = (int)(&(desc->dma.dma32) - descbase); + KASSERT(slot >= 0 && slot < dr->dr_numslots, + ("%s:%d: fail", __func__, __LINE__)); + + addr = (uint32_t) (dmaaddr & ~SIBA_DMA_TRANSLATION_MASK); + addrext = (uint32_t) (dmaaddr & SIBA_DMA_TRANSLATION_MASK) >> 30; + addr |= siba_dma_translation(dr->dr_mac->mac_sd); + ctl = bufsize & BWN_DMA32_DCTL_BYTECNT; + if (slot == dr->dr_numslots - 1) + ctl |= BWN_DMA32_DCTL_DTABLEEND; + if (start) + ctl |= BWN_DMA32_DCTL_FRAMESTART; + if (end) + ctl |= BWN_DMA32_DCTL_FRAMEEND; + if (irq) + ctl |= BWN_DMA32_DCTL_IRQ; + ctl |= (addrext << BWN_DMA32_DCTL_ADDREXT_SHIFT) + & BWN_DMA32_DCTL_ADDREXT_MASK; + + desc->dma.dma32.control = htole32(ctl); + desc->dma.dma32.address = htole32(addr); +} + +static void +bwn_dma_32_start_transfer(struct bwn_dma_ring *dr, int slot) +{ + + BWN_DMA_WRITE(dr, BWN_DMA32_TXINDEX, + (uint32_t)(slot * sizeof(struct bwn_dmadesc32))); +} + +static void +bwn_dma_32_suspend(struct bwn_dma_ring *dr) +{ + + BWN_DMA_WRITE(dr, BWN_DMA32_TXCTL, + BWN_DMA_READ(dr, BWN_DMA32_TXCTL) | BWN_DMA32_TXSUSPEND); +} + +static void +bwn_dma_32_resume(struct bwn_dma_ring *dr) +{ + + BWN_DMA_WRITE(dr, BWN_DMA32_TXCTL, + BWN_DMA_READ(dr, BWN_DMA32_TXCTL) & ~BWN_DMA32_TXSUSPEND); +} + +static int +bwn_dma_32_get_curslot(struct bwn_dma_ring *dr) +{ + uint32_t val; + + val = BWN_DMA_READ(dr, BWN_DMA32_RXSTATUS); + val &= BWN_DMA32_RXDPTR; + + return (val / sizeof(struct bwn_dmadesc32)); +} + +static void +bwn_dma_32_set_curslot(struct bwn_dma_ring *dr, int slot) +{ + + BWN_DMA_WRITE(dr, BWN_DMA32_RXINDEX, + (uint32_t) (slot * sizeof(struct bwn_dmadesc32))); +} + +static void +bwn_dma_64_getdesc(struct bwn_dma_ring *dr, int slot, + struct bwn_dmadesc_generic **gdesc, struct bwn_dmadesc_meta **meta) +{ + struct bwn_dmadesc64 *desc; + + *meta = &(dr->dr_meta[slot]); + desc = dr->dr_ring_descbase; + desc = &(desc[slot]); + + *gdesc = (struct bwn_dmadesc_generic *)desc; +} + +static void +bwn_dma_64_setdesc(struct bwn_dma_ring *dr, + struct bwn_dmadesc_generic *desc, bus_addr_t dmaaddr, uint16_t bufsize, + int start, int end, int irq) +{ + struct bwn_dmadesc64 *descbase = dr->dr_ring_descbase; + int slot; + uint32_t ctl0 = 0, ctl1 = 0; + uint32_t addrlo, addrhi; + uint32_t addrext; + + slot = (int)(&(desc->dma.dma64) - descbase); + KASSERT(slot >= 0 && slot < dr->dr_numslots, + ("%s:%d: fail", __func__, __LINE__)); + + addrlo = (uint32_t) (dmaaddr & 0xffffffff); + addrhi = (((uint64_t) dmaaddr >> 32) & ~SIBA_DMA_TRANSLATION_MASK); + addrext = (((uint64_t) dmaaddr >> 32) & SIBA_DMA_TRANSLATION_MASK) >> + 30; + addrhi |= (siba_dma_translation(dr->dr_mac->mac_sd) << 1); + if (slot == dr->dr_numslots - 1) + ctl0 |= BWN_DMA64_DCTL0_DTABLEEND; + if (start) + ctl0 |= BWN_DMA64_DCTL0_FRAMESTART; + if (end) + ctl0 |= BWN_DMA64_DCTL0_FRAMEEND; + if (irq) + ctl0 |= BWN_DMA64_DCTL0_IRQ; + ctl1 |= bufsize & BWN_DMA64_DCTL1_BYTECNT; + ctl1 |= (addrext << BWN_DMA64_DCTL1_ADDREXT_SHIFT) + & BWN_DMA64_DCTL1_ADDREXT_MASK; + + desc->dma.dma64.control0 = htole32(ctl0); + desc->dma.dma64.control1 = htole32(ctl1); + desc->dma.dma64.address_low = htole32(addrlo); + desc->dma.dma64.address_high = htole32(addrhi); +} + +static void +bwn_dma_64_start_transfer(struct bwn_dma_ring *dr, int slot) +{ + + BWN_DMA_WRITE(dr, BWN_DMA64_TXINDEX, + (uint32_t)(slot * sizeof(struct bwn_dmadesc64))); +} + +static void +bwn_dma_64_suspend(struct bwn_dma_ring *dr) +{ + + BWN_DMA_WRITE(dr, BWN_DMA64_TXCTL, + BWN_DMA_READ(dr, BWN_DMA64_TXCTL) | BWN_DMA64_TXSUSPEND); +} + +static void +bwn_dma_64_resume(struct bwn_dma_ring *dr) +{ + + BWN_DMA_WRITE(dr, BWN_DMA64_TXCTL, + BWN_DMA_READ(dr, BWN_DMA64_TXCTL) & ~BWN_DMA64_TXSUSPEND); +} + +static int +bwn_dma_64_get_curslot(struct bwn_dma_ring *dr) +{ + uint32_t val; + + val = BWN_DMA_READ(dr, BWN_DMA64_RXSTATUS); + val &= BWN_DMA64_RXSTATDPTR; + + return (val / sizeof(struct bwn_dmadesc64)); +} + +static void +bwn_dma_64_set_curslot(struct bwn_dma_ring *dr, int slot) +{ + + BWN_DMA_WRITE(dr, BWN_DMA64_RXINDEX, + (uint32_t)(slot * sizeof(struct bwn_dmadesc64))); +} + +static int +bwn_dma_allocringmemory(struct bwn_dma_ring *dr) +{ + struct bwn_mac *mac = dr->dr_mac; + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_softc *sc = mac->mac_sc; + int error; + + error = bus_dma_tag_create(dma->parent_dtag, + BWN_ALIGN, 0, + BUS_SPACE_MAXADDR, + BUS_SPACE_MAXADDR, + NULL, NULL, + BWN_DMA_RINGMEMSIZE, + 1, + BUS_SPACE_MAXSIZE_32BIT, + 0, + NULL, NULL, + &dr->dr_ring_dtag); + if (error) { + device_printf(sc->sc_dev, + "can't create TX ring DMA tag: TODO frees\n"); + return (-1); + } + + error = bus_dmamem_alloc(dr->dr_ring_dtag, + &dr->dr_ring_descbase, BUS_DMA_WAITOK | BUS_DMA_ZERO, + &dr->dr_ring_dmap); + if (error) { + device_printf(sc->sc_dev, + "can't allocate DMA mem: TODO frees\n"); + return (-1); + } + error = bus_dmamap_load(dr->dr_ring_dtag, dr->dr_ring_dmap, + dr->dr_ring_descbase, BWN_DMA_RINGMEMSIZE, + bwn_dma_ring_addr, &dr->dr_ring_dmabase, BUS_DMA_NOWAIT); + if (error) { + device_printf(sc->sc_dev, + "can't load DMA mem: TODO free\n"); + return (-1); + } + + return (0); +} + +static void +bwn_dma_setup(struct bwn_dma_ring *dr) +{ + uint64_t ring64; + uint32_t addrext, ring32, value; + uint32_t trans = siba_dma_translation(dr->dr_mac->mac_sd); + + if (dr->dr_tx) { + dr->dr_curslot = -1; + + if (dr->dr_type == BWN_DMA_64BIT) { + ring64 = (uint64_t)(dr->dr_ring_dmabase); + addrext = ((ring64 >> 32) & SIBA_DMA_TRANSLATION_MASK) + >> 30; + value = BWN_DMA64_TXENABLE; + value |= (addrext << BWN_DMA64_TXADDREXT_SHIFT) + & BWN_DMA64_TXADDREXT_MASK; + BWN_DMA_WRITE(dr, BWN_DMA64_TXCTL, value); + BWN_DMA_WRITE(dr, BWN_DMA64_TXRINGLO, + (ring64 & 0xffffffff)); + BWN_DMA_WRITE(dr, BWN_DMA64_TXRINGHI, + ((ring64 >> 32) & + ~SIBA_DMA_TRANSLATION_MASK) | (trans << 1)); + } else { + ring32 = (uint32_t)(dr->dr_ring_dmabase); + addrext = (ring32 & SIBA_DMA_TRANSLATION_MASK) >> 30; + value = BWN_DMA32_TXENABLE; + value |= (addrext << BWN_DMA32_TXADDREXT_SHIFT) + & BWN_DMA32_TXADDREXT_MASK; + BWN_DMA_WRITE(dr, BWN_DMA32_TXCTL, value); + BWN_DMA_WRITE(dr, BWN_DMA32_TXRING, + (ring32 & ~SIBA_DMA_TRANSLATION_MASK) | trans); + } + return; + } + + /* + * set for RX + */ + dr->dr_usedslot = dr->dr_numslots; + + if (dr->dr_type == BWN_DMA_64BIT) { + ring64 = (uint64_t)(dr->dr_ring_dmabase); + addrext = ((ring64 >> 32) & SIBA_DMA_TRANSLATION_MASK) >> 30; + value = (dr->dr_frameoffset << BWN_DMA64_RXFROFF_SHIFT); + value |= BWN_DMA64_RXENABLE; + value |= (addrext << BWN_DMA64_RXADDREXT_SHIFT) + & BWN_DMA64_RXADDREXT_MASK; + BWN_DMA_WRITE(dr, BWN_DMA64_RXCTL, value); + BWN_DMA_WRITE(dr, BWN_DMA64_RXRINGLO, (ring64 & 0xffffffff)); + BWN_DMA_WRITE(dr, BWN_DMA64_RXRINGHI, + ((ring64 >> 32) & ~SIBA_DMA_TRANSLATION_MASK) + | (trans << 1)); + BWN_DMA_WRITE(dr, BWN_DMA64_RXINDEX, dr->dr_numslots * + sizeof(struct bwn_dmadesc64)); + } else { + ring32 = (uint32_t)(dr->dr_ring_dmabase); + addrext = (ring32 & SIBA_DMA_TRANSLATION_MASK) >> 30; + value = (dr->dr_frameoffset << BWN_DMA32_RXFROFF_SHIFT); + value |= BWN_DMA32_RXENABLE; + value |= (addrext << BWN_DMA32_RXADDREXT_SHIFT) + & BWN_DMA32_RXADDREXT_MASK; + BWN_DMA_WRITE(dr, BWN_DMA32_RXCTL, value); + BWN_DMA_WRITE(dr, BWN_DMA32_RXRING, + (ring32 & ~SIBA_DMA_TRANSLATION_MASK) | trans); + BWN_DMA_WRITE(dr, BWN_DMA32_RXINDEX, dr->dr_numslots * + sizeof(struct bwn_dmadesc32)); + } +} + +static void +bwn_dma_free_ringmemory(struct bwn_dma_ring *dr) +{ + + bus_dmamap_unload(dr->dr_ring_dtag, dr->dr_ring_dmap); + bus_dmamem_free(dr->dr_ring_dtag, dr->dr_ring_descbase, + dr->dr_ring_dmap); +} + +static void +bwn_dma_cleanup(struct bwn_dma_ring *dr) +{ + + if (dr->dr_tx) { + bwn_dma_tx_reset(dr->dr_mac, dr->dr_base, dr->dr_type); + if (dr->dr_type == BWN_DMA_64BIT) { + BWN_DMA_WRITE(dr, BWN_DMA64_TXRINGLO, 0); + BWN_DMA_WRITE(dr, BWN_DMA64_TXRINGHI, 0); + } else + BWN_DMA_WRITE(dr, BWN_DMA32_TXRING, 0); + } else { + bwn_dma_rx_reset(dr->dr_mac, dr->dr_base, dr->dr_type); + if (dr->dr_type == BWN_DMA_64BIT) { + BWN_DMA_WRITE(dr, BWN_DMA64_RXRINGLO, 0); + BWN_DMA_WRITE(dr, BWN_DMA64_RXRINGHI, 0); + } else + BWN_DMA_WRITE(dr, BWN_DMA32_RXRING, 0); + } +} + +static void +bwn_dma_free_descbufs(struct bwn_dma_ring *dr) +{ + struct bwn_dmadesc_generic *desc; + struct bwn_dmadesc_meta *meta; + struct bwn_mac *mac = dr->dr_mac; + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_softc *sc = mac->mac_sc; + int i; + + if (!dr->dr_usedslot) + return; + for (i = 0; i < dr->dr_numslots; i++) { + dr->getdesc(dr, i, &desc, &meta); + + if (meta->mt_m == NULL) { + if (!dr->dr_tx) + device_printf(sc->sc_dev, "%s: not TX?\n", + __func__); + continue; + } + if (dr->dr_tx) { + if (meta->mt_txtype == BWN_DMADESC_METATYPE_HEADER) + bus_dmamap_unload(dr->dr_txring_dtag, + meta->mt_dmap); + else if (meta->mt_txtype == BWN_DMADESC_METATYPE_BODY) + bus_dmamap_unload(dma->txbuf_dtag, + meta->mt_dmap); + } else + bus_dmamap_unload(dma->rxbuf_dtag, meta->mt_dmap); + bwn_dma_free_descbuf(dr, meta); + } +} + +static int +bwn_dma_tx_reset(struct bwn_mac *mac, uint16_t base, + int type) +{ + struct bwn_softc *sc = mac->mac_sc; + uint32_t value; + int i; + uint16_t offset; + + for (i = 0; i < 10; i++) { + offset = (type == BWN_DMA_64BIT) ? BWN_DMA64_TXSTATUS : + BWN_DMA32_TXSTATUS; + value = BWN_READ_4(mac, base + offset); + if (type == BWN_DMA_64BIT) { + value &= BWN_DMA64_TXSTAT; + if (value == BWN_DMA64_TXSTAT_DISABLED || + value == BWN_DMA64_TXSTAT_IDLEWAIT || + value == BWN_DMA64_TXSTAT_STOPPED) + break; + } else { + value &= BWN_DMA32_TXSTATE; + if (value == BWN_DMA32_TXSTAT_DISABLED || + value == BWN_DMA32_TXSTAT_IDLEWAIT || + value == BWN_DMA32_TXSTAT_STOPPED) + break; + } + DELAY(1000); + } + offset = (type == BWN_DMA_64BIT) ? BWN_DMA64_TXCTL : BWN_DMA32_TXCTL; + BWN_WRITE_4(mac, base + offset, 0); + for (i = 0; i < 10; i++) { + offset = (type == BWN_DMA_64BIT) ? BWN_DMA64_TXSTATUS : + BWN_DMA32_TXSTATUS; + value = BWN_READ_4(mac, base + offset); + if (type == BWN_DMA_64BIT) { + value &= BWN_DMA64_TXSTAT; + if (value == BWN_DMA64_TXSTAT_DISABLED) { + i = -1; + break; + } + } else { + value &= BWN_DMA32_TXSTATE; + if (value == BWN_DMA32_TXSTAT_DISABLED) { + i = -1; + break; + } + } + DELAY(1000); + } + if (i != -1) { + device_printf(sc->sc_dev, "%s: timed out\n", __func__); + return (ENODEV); + } + DELAY(1000); + + return (0); +} + +static int +bwn_dma_rx_reset(struct bwn_mac *mac, uint16_t base, + int type) +{ + struct bwn_softc *sc = mac->mac_sc; + uint32_t value; + int i; + uint16_t offset; + + offset = (type == BWN_DMA_64BIT) ? BWN_DMA64_RXCTL : BWN_DMA32_RXCTL; + BWN_WRITE_4(mac, base + offset, 0); + for (i = 0; i < 10; i++) { + offset = (type == BWN_DMA_64BIT) ? BWN_DMA64_RXSTATUS : + BWN_DMA32_RXSTATUS; + value = BWN_READ_4(mac, base + offset); + if (type == BWN_DMA_64BIT) { + value &= BWN_DMA64_RXSTAT; + if (value == BWN_DMA64_RXSTAT_DISABLED) { + i = -1; + break; + } + } else { + value &= BWN_DMA32_RXSTATE; + if (value == BWN_DMA32_RXSTAT_DISABLED) { + i = -1; + break; + } + } + DELAY(1000); + } + if (i != -1) { + device_printf(sc->sc_dev, "%s: timed out\n", __func__); + return (ENODEV); + } + + return (0); +} + +static void +bwn_dma_free_descbuf(struct bwn_dma_ring *dr, + struct bwn_dmadesc_meta *meta) +{ + + if (meta->mt_m != NULL) { + m_freem(meta->mt_m); + meta->mt_m = NULL; + } + if (meta->mt_ni != NULL) { + ieee80211_free_node(meta->mt_ni); + meta->mt_ni = NULL; + } +} + +static void +bwn_dma_set_redzone(struct bwn_dma_ring *dr, struct mbuf *m) +{ + struct bwn_rxhdr4 *rxhdr; + unsigned char *frame; + + rxhdr = mtod(m, struct bwn_rxhdr4 *); + rxhdr->frame_len = 0; + + KASSERT(dr->dr_rx_bufsize >= dr->dr_frameoffset + + sizeof(struct bwn_plcp6) + 2, + ("%s:%d: fail", __func__, __LINE__)); + frame = mtod(m, char *) + dr->dr_frameoffset; + memset(frame, 0xff, sizeof(struct bwn_plcp6) + 2 /* padding */); +} + +static uint8_t +bwn_dma_check_redzone(struct bwn_dma_ring *dr, struct mbuf *m) +{ + unsigned char *f = mtod(m, char *) + dr->dr_frameoffset; + + return ((f[0] & f[1] & f[2] & f[3] & f[4] & f[5] & f[6] & f[7]) + == 0xff); +} + +static void +bwn_wme_init(struct bwn_mac *mac) +{ + + bwn_wme_load(mac); + + /* enable WME support. */ + bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_EDCF); + BWN_WRITE_2(mac, BWN_IFSCTL, BWN_READ_2(mac, BWN_IFSCTL) | + BWN_IFSCTL_USE_EDCF); +} + +static void +bwn_spu_setdelay(struct bwn_mac *mac, int idle) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + uint16_t delay; /* microsec */ + + delay = (mac->mac_phy.type == BWN_PHYTYPE_A) ? 3700 : 1050; + if (ic->ic_opmode == IEEE80211_M_IBSS || idle) + delay = 500; + if ((mac->mac_phy.rf_ver == 0x2050) && (mac->mac_phy.rf_rev == 8)) + delay = max(delay, (uint16_t)2400); + + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_SPU_WAKEUP, delay); +} + +static void +bwn_bt_enable(struct bwn_mac *mac) +{ + struct siba_sprom *sprom = &mac->mac_sd->sd_bus->siba_sprom; + uint64_t hf; + + if (bwn_bluetooth == 0) + return; + if ((sprom->bf_lo & BWN_BFL_BTCOEXIST) == 0) + return; + if (mac->mac_phy.type != BWN_PHYTYPE_B && !mac->mac_phy.gmode) + return; + + hf = bwn_hf_read(mac); + if (sprom->bf_lo & BWN_BFL_BTCMOD) + hf |= BWN_HF_BT_COEXISTALT; + else + hf |= BWN_HF_BT_COEXIST; + bwn_hf_write(mac, hf); +} + +static void +bwn_set_macaddr(struct bwn_mac *mac) +{ + + bwn_mac_write_bssid(mac); + bwn_mac_setfilter(mac, BWN_MACFILTER_SELF, mac->mac_sc->sc_macaddr); +} + +static void +bwn_clear_keys(struct bwn_mac *mac) +{ + int i; + + for (i = 0; i < mac->mac_max_nr_keys; i++) { + KASSERT(i >= 0 && i < mac->mac_max_nr_keys, + ("%s:%d: fail", __func__, __LINE__)); + + bwn_key_dowrite(mac, i, BWN_SEC_ALGO_NONE, + NULL, BWN_SEC_KEYSIZE, NULL); + if ((i <= 3) && !BWN_SEC_NEWAPI(mac)) { + bwn_key_dowrite(mac, i + 4, BWN_SEC_ALGO_NONE, + NULL, BWN_SEC_KEYSIZE, NULL); + } + mac->mac_key[i].keyconf = NULL; + } +} + +static void +bwn_crypt_init(struct bwn_mac *mac) +{ + + mac->mac_max_nr_keys = (mac->mac_sd->sd_id.sd_rev >= 5) ? 58 : 20; + KASSERT(mac->mac_max_nr_keys <= N(mac->mac_key), + ("%s:%d: fail", __func__, __LINE__)); + mac->mac_ktp = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_KEY_TABLEP); + mac->mac_ktp *= 2; + if (mac->mac_sd->sd_id.sd_rev >= 5) { + BWN_WRITE_2(mac, BWN_RCMTA_COUNT, + mac->mac_max_nr_keys - 8); + } + bwn_clear_keys(mac); +} + +static void +bwn_chip_exit(struct bwn_mac *mac) +{ + + bwn_phy_exit(mac); + bwn_gpio_cleanup(mac); +} + +static int +bwn_fw_fillinfo(struct bwn_mac *mac) +{ + int error; + + error = bwn_fw_gets(mac, BWN_FWTYPE_DEFAULT); + if (error == 0) + return (0); + error = bwn_fw_gets(mac, BWN_FWTYPE_OPENSOURCE); + if (error == 0) + return (0); + return (error); +} + +static int +bwn_gpio_init(struct bwn_mac *mac) +{ + struct siba_softc *bus = mac->mac_sd->sd_bus; + struct siba_dev_softc *sd; + uint32_t mask = 0x0000001f, set = 0x0000000f; + + BWN_WRITE_4(mac, BWN_MACCTL, + BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_GPOUT_MASK); + BWN_WRITE_2(mac, BWN_GPIO_MASK, + BWN_READ_2(mac, BWN_GPIO_MASK) | 0x000f); + + if (bus->siba_chipid == 0x4301) { + mask |= 0x0060; + set |= 0x0060; + } + if (bus->siba_sprom.bf_lo & BWN_BFL_PACTRL) { + BWN_WRITE_2(mac, BWN_GPIO_MASK, + BWN_READ_2(mac, BWN_GPIO_MASK) | 0x0200); + mask |= 0x0200; + set |= 0x0200; + } + if (mac->mac_sd->sd_id.sd_rev >= 2) + mask |= 0x0010; + sd = (bus->siba_cc.scc_dev != NULL) ? bus->siba_cc.scc_dev : + bus->siba_pci.spc_dev; + if (sd == NULL) + return (0); + siba_write_4(sd, BWN_GPIOCTL, + (siba_read_4(sd, BWN_GPIOCTL) & mask) | set); + + return (0); +} + +static int +bwn_fw_loadinitvals(struct bwn_mac *mac) +{ +#define GETFWOFFSET(fwp, offset) \ + ((const struct bwn_fwinitvals *)((const char *)fwp.fw->data + offset)) + const size_t hdr_len = sizeof(struct bwn_fwhdr); + const struct bwn_fwhdr *hdr; + struct bwn_fw *fw = &mac->mac_fw; + int error; + + hdr = (const struct bwn_fwhdr *)(fw->initvals.fw->data); + error = bwn_fwinitvals_write(mac, GETFWOFFSET(fw->initvals, hdr_len), + be32toh(hdr->size), fw->initvals.fw->datasize - hdr_len); + if (error) + return (error); + if (fw->initvals_band.fw) { + hdr = (const struct bwn_fwhdr *)(fw->initvals_band.fw->data); + error = bwn_fwinitvals_write(mac, + GETFWOFFSET(fw->initvals_band, hdr_len), + be32toh(hdr->size), + fw->initvals_band.fw->datasize - hdr_len); + } + return (error); +#undef GETFWOFFSET +} + +static int +bwn_phy_init(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + int error; + + mac->mac_phy.chan = mac->mac_phy.get_default_chan(mac); + mac->mac_phy.rf_onoff(mac, 1); + error = mac->mac_phy.init(mac); + if (error) { + device_printf(sc->sc_dev, "PHY init failed\n"); + goto fail0; + } + error = bwn_switch_channel(mac, + mac->mac_phy.get_default_chan(mac)); + if (error) { + device_printf(sc->sc_dev, + "failed to switch default channel\n"); + goto fail1; + } + return (0); +fail1: + if (mac->mac_phy.exit) + mac->mac_phy.exit(mac); +fail0: + mac->mac_phy.rf_onoff(mac, 0); + + return (error); +} + +static void +bwn_set_txantenna(struct bwn_mac *mac, int antenna) +{ + uint16_t ant; + uint16_t tmp; + + ant = bwn_ant2phy(antenna); + + /* For ACK/CTS */ + tmp = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_ACKCTS_PHYCTL); + tmp = (tmp & ~BWN_TX_PHY_ANT) | ant; + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_ACKCTS_PHYCTL, tmp); + /* For Probe Resposes */ + tmp = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_PHYCTL); + tmp = (tmp & ~BWN_TX_PHY_ANT) | ant; + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_PHYCTL, tmp); +} + +static void +bwn_set_opmode(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t ctl; + uint16_t cfp_pretbtt; + + ctl = BWN_READ_4(mac, BWN_MACCTL); + ctl &= ~(BWN_MACCTL_HOSTAP | BWN_MACCTL_PASS_CTL | + BWN_MACCTL_PASS_BADPLCP | BWN_MACCTL_PASS_BADFCS | + BWN_MACCTL_PROMISC | BWN_MACCTL_BEACON_PROMISC); + ctl |= BWN_MACCTL_STA; + + if (ic->ic_opmode == IEEE80211_M_HOSTAP || + ic->ic_opmode == IEEE80211_M_MBSS) + ctl |= BWN_MACCTL_HOSTAP; + else if (ic->ic_opmode == IEEE80211_M_IBSS) + ctl &= ~BWN_MACCTL_STA; + ctl |= sc->sc_filters; + + if (mac->mac_sd->sd_id.sd_rev <= 4) + ctl |= BWN_MACCTL_PROMISC; + + BWN_WRITE_4(mac, BWN_MACCTL, ctl); + + cfp_pretbtt = 2; + if ((ctl & BWN_MACCTL_STA) && !(ctl & BWN_MACCTL_HOSTAP)) { + if (mac->mac_sd->sd_bus->siba_chipid == 0x4306 && + mac->mac_sd->sd_bus->siba_chiprev == 3) + cfp_pretbtt = 100; + else + cfp_pretbtt = 50; + } + BWN_WRITE_2(mac, 0x612, cfp_pretbtt); +} + +static void +bwn_gpio_cleanup(struct bwn_mac *mac) +{ + struct siba_softc *bus = mac->mac_sd->sd_bus; + struct siba_dev_softc *gpiodev, *pcidev = NULL; + + pcidev = bus->siba_pci.spc_dev; + gpiodev = bus->siba_cc.scc_dev ? bus->siba_cc.scc_dev : pcidev; + if (!gpiodev) + return; + siba_write_4(gpiodev, BWN_GPIOCTL, 0); +} + +static int +bwn_dma_gettype(struct bwn_mac *mac) +{ + uint32_t tmp; + uint16_t base; + + tmp = BWN_READ_4(mac, SIBA_TGSHIGH); + if (tmp & SIBA_TGSHIGH_DMA64) + return (BWN_DMA_64BIT); + base = bwn_dma_base(0, 0); + BWN_WRITE_4(mac, base + BWN_DMA32_TXCTL, BWN_DMA32_TXADDREXT_MASK); + tmp = BWN_READ_4(mac, base + BWN_DMA32_TXCTL); + if (tmp & BWN_DMA32_TXADDREXT_MASK) + return (BWN_DMA_32BIT); + + return (BWN_DMA_30BIT); +} + +static void +bwn_dma_ring_addr(void *arg, bus_dma_segment_t *seg, int nseg, int error) +{ + if (!error) { + KASSERT(nseg == 1, ("too many segments(%d)\n", nseg)); + *((bus_addr_t *)arg) = seg->ds_addr; + } +} + +static void +bwn_phy_g_init_sub(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + uint16_t i, tmp; + + if (phy->rev == 1) + bwn_phy_init_b5(mac); + else + bwn_phy_init_b6(mac); + + if (phy->rev >= 2 || phy->gmode) + bwn_phy_init_a(mac); + + if (phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, 0); + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL, 0); + } + if (phy->rev == 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0); + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xc0); + } + if (phy->rev > 5) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x400); + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xc0); + } + if (phy->gmode || phy->rev >= 2) { + tmp = BWN_PHY_READ(mac, BWN_PHY_VERSION_OFDM); + tmp &= BWN_PHYVER_VERSION; + if (tmp == 3 || tmp == 5) { + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc2), 0x1816); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc3), 0x8006); + } + if (tmp == 5) { + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xcc), 0x00ff, + 0x1f00); + } + } + if ((phy->rev <= 2 && phy->gmode) || phy->rev >= 2) + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x7e), 0x78); + if (phy->rf_rev == 8) { + BWN_PHY_SET(mac, BWN_PHY_EXTG(0x01), 0x80); + BWN_PHY_SET(mac, BWN_PHY_OFDM(0x3e), 0x4); + } + if (BWN_HAS_LOOPBACK(phy)) + bwn_loopback_calcgain(mac); + + if (phy->rf_rev != 8) { + if (pg->pg_initval == 0xffff) + pg->pg_initval = bwn_rf_init_bcm2050(mac); + else + BWN_RF_WRITE(mac, 0x0078, pg->pg_initval); + } + bwn_lo_g_init(mac); + if (BWN_HAS_TXMAG(phy)) { + BWN_RF_WRITE(mac, 0x52, + (BWN_RF_READ(mac, 0x52) & 0xff00) + | pg->pg_loctl.tx_bias | + pg->pg_loctl.tx_magn); + } else { + BWN_RF_SETMASK(mac, 0x52, 0xfff0, pg->pg_loctl.tx_bias); + } + if (phy->rev >= 6) { + BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x36), 0x0fff, + (pg->pg_loctl.tx_bias << 12)); + } + if (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_PACTRL) + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x8075); + else + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x807f); + if (phy->rev < 2) + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x101); + else + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x202); + if (phy->gmode || phy->rev >= 2) { + bwn_lo_g_adjust(mac); + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8078); + } + + if (!(mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_RSSI)) { + for (i = 0; i < 64; i++) { + BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_CTRL, i); + BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_DATA, + (uint16_t)MIN(MAX(bwn_nrssi_read(mac, i) - 0xffff, + -32), 31)); + } + bwn_nrssi_threshold(mac); + } else if (phy->gmode || phy->rev >= 2) { + if (pg->pg_nrssi[0] == -1000) { + KASSERT(pg->pg_nrssi[1] == -1000, + ("%s:%d: fail", __func__, __LINE__)); + bwn_nrssi_slope_11g(mac); + } else + bwn_nrssi_threshold(mac); + } + if (phy->rf_rev == 8) + BWN_PHY_WRITE(mac, BWN_PHY_EXTG(0x05), 0x3230); + bwn_phy_hwpctl_init(mac); + if ((mac->mac_sd->sd_bus->siba_chipid == 0x4306 + && mac->mac_sd->sd_bus->siba_chippkg == 2) || 0) { + BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0xbfff); + BWN_PHY_MASK(mac, BWN_PHY_OFDM(0xc3), 0x7fff); + } +} + +static uint8_t +bwn_has_hwpctl(struct bwn_mac *mac) +{ + + if (mac->mac_phy.hwpctl == 0 || mac->mac_phy.use_hwpctl == NULL) + return (0); + return (mac->mac_phy.use_hwpctl(mac)); +} + +static void +bwn_phy_init_b5(struct bwn_mac *mac) +{ + struct siba_softc *bus = mac->mac_sd->sd_bus; + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + uint16_t offset, value; + uint8_t old_channel; + + if (phy->analog == 1) + BWN_RF_SET(mac, 0x007a, 0x0050); + if ((bus->siba_board_vendor != SIBA_BOARDVENDOR_BCM) && + (bus->siba_board_type != SIBA_BOARD_BU4306)) { + value = 0x2120; + for (offset = 0x00a8; offset < 0x00c7; offset++) { + BWN_PHY_WRITE(mac, offset, value); + value += 0x202; + } + } + BWN_PHY_SETMASK(mac, 0x0035, 0xf0ff, 0x0700); + if (phy->rf_ver == 0x2050) + BWN_PHY_WRITE(mac, 0x0038, 0x0667); + + if (phy->gmode || phy->rev >= 2) { + if (phy->rf_ver == 0x2050) { + BWN_RF_SET(mac, 0x007a, 0x0020); + BWN_RF_SET(mac, 0x0051, 0x0004); + } + BWN_WRITE_2(mac, BWN_PHY_RADIO, 0x0000); + + BWN_PHY_SET(mac, 0x0802, 0x0100); + BWN_PHY_SET(mac, 0x042b, 0x2000); + + BWN_PHY_WRITE(mac, 0x001c, 0x186a); + + BWN_PHY_SETMASK(mac, 0x0013, 0x00ff, 0x1900); + BWN_PHY_SETMASK(mac, 0x0035, 0xffc0, 0x0064); + BWN_PHY_SETMASK(mac, 0x005d, 0xff80, 0x000a); + } + + if (mac->mac_flags & BWN_MAC_FLAG_BADFRAME_PREEMP) + BWN_PHY_SET(mac, BWN_PHY_RADIO_BITFIELD, (1 << 11)); + + if (phy->analog == 1) { + BWN_PHY_WRITE(mac, 0x0026, 0xce00); + BWN_PHY_WRITE(mac, 0x0021, 0x3763); + BWN_PHY_WRITE(mac, 0x0022, 0x1bc3); + BWN_PHY_WRITE(mac, 0x0023, 0x06f9); + BWN_PHY_WRITE(mac, 0x0024, 0x037e); + } else + BWN_PHY_WRITE(mac, 0x0026, 0xcc00); + BWN_PHY_WRITE(mac, 0x0030, 0x00c6); + BWN_WRITE_2(mac, 0x03ec, 0x3f22); + + if (phy->analog == 1) + BWN_PHY_WRITE(mac, 0x0020, 0x3e1c); + else + BWN_PHY_WRITE(mac, 0x0020, 0x301c); + + if (phy->analog == 0) + BWN_WRITE_2(mac, 0x03e4, 0x3000); + + old_channel = phy->chan; + bwn_phy_g_switch_chan(mac, 7, 0); + + if (phy->rf_ver != 0x2050) { + BWN_RF_WRITE(mac, 0x0075, 0x0080); + BWN_RF_WRITE(mac, 0x0079, 0x0081); + } + + BWN_RF_WRITE(mac, 0x0050, 0x0020); + BWN_RF_WRITE(mac, 0x0050, 0x0023); + + if (phy->rf_ver == 0x2050) { + BWN_RF_WRITE(mac, 0x0050, 0x0020); + BWN_RF_WRITE(mac, 0x005a, 0x0070); + } + + BWN_RF_WRITE(mac, 0x005b, 0x007b); + BWN_RF_WRITE(mac, 0x005c, 0x00b0); + BWN_RF_SET(mac, 0x007a, 0x0007); + + bwn_phy_g_switch_chan(mac, old_channel, 0); + BWN_PHY_WRITE(mac, 0x0014, 0x0080); + BWN_PHY_WRITE(mac, 0x0032, 0x00ca); + BWN_PHY_WRITE(mac, 0x002a, 0x88a3); + + bwn_phy_g_set_txpwr_sub(mac, &pg->pg_bbatt, &pg->pg_rfatt, + pg->pg_txctl); + + if (phy->rf_ver == 0x2050) + BWN_RF_WRITE(mac, 0x005d, 0x000d); + + BWN_WRITE_2(mac, 0x03e4, (BWN_READ_2(mac, 0x03e4) & 0xffc0) | 0x0004); +} + +static void +bwn_loopback_calcgain(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + uint16_t backup_phy[16] = { 0 }; + uint16_t backup_radio[3]; + uint16_t backup_bband; + uint16_t i, j, loop_i_max; + uint16_t trsw_rx; + uint16_t loop1_outer_done, loop1_inner_done; + + backup_phy[0] = BWN_PHY_READ(mac, BWN_PHY_CRS0); + backup_phy[1] = BWN_PHY_READ(mac, BWN_PHY_CCKBBANDCFG); + backup_phy[2] = BWN_PHY_READ(mac, BWN_PHY_RFOVER); + backup_phy[3] = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL); + if (phy->rev != 1) { + backup_phy[4] = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVER); + backup_phy[5] = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVERVAL); + } + backup_phy[6] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x5a)); + backup_phy[7] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x59)); + backup_phy[8] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x58)); + backup_phy[9] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x0a)); + backup_phy[10] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x03)); + backup_phy[11] = BWN_PHY_READ(mac, BWN_PHY_LO_MASK); + backup_phy[12] = BWN_PHY_READ(mac, BWN_PHY_LO_CTL); + backup_phy[13] = BWN_PHY_READ(mac, BWN_PHY_CCK(0x2b)); + backup_phy[14] = BWN_PHY_READ(mac, BWN_PHY_PGACTL); + backup_phy[15] = BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE); + backup_bband = pg->pg_bbatt.att; + backup_radio[0] = BWN_RF_READ(mac, 0x52); + backup_radio[1] = BWN_RF_READ(mac, 0x43); + backup_radio[2] = BWN_RF_READ(mac, 0x7a); + + BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0x3fff); + BWN_PHY_SET(mac, BWN_PHY_CCKBBANDCFG, 0x8000); + BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0002); + BWN_PHY_MASK(mac, BWN_PHY_RFOVERVAL, 0xfffd); + BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0001); + BWN_PHY_MASK(mac, BWN_PHY_RFOVERVAL, 0xfffe); + if (phy->rev != 1) { + BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0001); + BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffe); + BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0002); + BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffd); + } + BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x000c); + BWN_PHY_SET(mac, BWN_PHY_RFOVERVAL, 0x000c); + BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0030); + BWN_PHY_SETMASK(mac, BWN_PHY_RFOVERVAL, 0xffcf, 0x10); + + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), 0x0780); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), 0xc810); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0x000d); + + BWN_PHY_SET(mac, BWN_PHY_CCK(0x0a), 0x2000); + if (phy->rev != 1) { + BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0004); + BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffb); + } + BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x03), 0xff9f, 0x40); + + if (phy->rf_rev == 8) + BWN_RF_WRITE(mac, 0x43, 0x000f); + else { + BWN_RF_WRITE(mac, 0x52, 0); + BWN_RF_SETMASK(mac, 0x43, 0xfff0, 0x9); + } + bwn_phy_g_set_bbatt(mac, 11); + + if (phy->rev >= 3) + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0xc020); + else + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8020); + BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, 0); + + BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x2b), 0xffc0, 0x01); + BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x2b), 0xc0ff, 0x800); + + BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0100); + BWN_PHY_MASK(mac, BWN_PHY_RFOVERVAL, 0xcfff); + + if (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_EXTLNA) { + if (phy->rev >= 7) { + BWN_PHY_SET(mac, BWN_PHY_RFOVER, 0x0800); + BWN_PHY_SET(mac, BWN_PHY_RFOVERVAL, 0x8000); + } + } + BWN_RF_MASK(mac, 0x7a, 0x00f7); + + j = 0; + loop_i_max = (phy->rf_rev == 8) ? 15 : 9; + for (i = 0; i < loop_i_max; i++) { + for (j = 0; j < 16; j++) { + BWN_RF_WRITE(mac, 0x43, i); + BWN_PHY_SETMASK(mac, BWN_PHY_RFOVERVAL, 0xf0ff, + (j << 8)); + BWN_PHY_SETMASK(mac, BWN_PHY_PGACTL, 0x0fff, 0xa000); + BWN_PHY_SET(mac, BWN_PHY_PGACTL, 0xf000); + DELAY(20); + if (BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE) >= 0xdfc) + goto done0; + } + } +done0: + loop1_outer_done = i; + loop1_inner_done = j; + if (j >= 8) { + BWN_PHY_SET(mac, BWN_PHY_RFOVERVAL, 0x30); + trsw_rx = 0x1b; + for (j = j - 8; j < 16; j++) { + BWN_PHY_SETMASK(mac, BWN_PHY_RFOVERVAL, 0xf0ff, j << 8); + BWN_PHY_SETMASK(mac, BWN_PHY_PGACTL, 0x0fff, 0xa000); + BWN_PHY_SET(mac, BWN_PHY_PGACTL, 0xf000); + DELAY(20); + trsw_rx -= 3; + if (BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE) >= 0xdfc) + goto done1; + } + } else + trsw_rx = 0x18; +done1: + + if (phy->rev != 1) { + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, backup_phy[4]); + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL, backup_phy[5]); + } + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), backup_phy[6]); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), backup_phy[7]); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), backup_phy[8]); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x0a), backup_phy[9]); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x03), backup_phy[10]); + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, backup_phy[11]); + BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, backup_phy[12]); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), backup_phy[13]); + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, backup_phy[14]); + + bwn_phy_g_set_bbatt(mac, backup_bband); + + BWN_RF_WRITE(mac, 0x52, backup_radio[0]); + BWN_RF_WRITE(mac, 0x43, backup_radio[1]); + BWN_RF_WRITE(mac, 0x7a, backup_radio[2]); + + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, backup_phy[2] | 0x0003); + DELAY(10); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, backup_phy[2]); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, backup_phy[3]); + BWN_PHY_WRITE(mac, BWN_PHY_CRS0, backup_phy[0]); + BWN_PHY_WRITE(mac, BWN_PHY_CCKBBANDCFG, backup_phy[1]); + + pg->pg_max_lb_gain = + ((loop1_inner_done * 6) - (loop1_outer_done * 4)) - 11; + pg->pg_trsw_rx_gain = trsw_rx * 2; +} + +static uint16_t +bwn_rf_init_bcm2050(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint32_t tmp1 = 0, tmp2 = 0; + uint16_t rcc, i, j, pgactl, cck0, cck1, cck2, cck3, rfover, rfoverval, + analogover, analogoverval, crs0, classctl, lomask, loctl, syncctl, + radio0, radio1, radio2, reg0, reg1, reg2, radio78, reg, index; + static const uint8_t rcc_table[] = { + 0x02, 0x03, 0x01, 0x0f, + 0x06, 0x07, 0x05, 0x0f, + 0x0a, 0x0b, 0x09, 0x0f, + 0x0e, 0x0f, 0x0d, 0x0f, + }; + + loctl = lomask = reg0 = classctl = crs0 = analogoverval = analogover = + rfoverval = rfover = cck3 = 0; + radio0 = BWN_RF_READ(mac, 0x43); + radio1 = BWN_RF_READ(mac, 0x51); + radio2 = BWN_RF_READ(mac, 0x52); + pgactl = BWN_PHY_READ(mac, BWN_PHY_PGACTL); + cck0 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x5a)); + cck1 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x59)); + cck2 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x58)); + + if (phy->type == BWN_PHYTYPE_B) { + cck3 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x30)); + reg0 = BWN_READ_2(mac, 0x3ec); + + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), 0xff); + BWN_WRITE_2(mac, 0x3ec, 0x3f3f); + } else if (phy->gmode || phy->rev >= 2) { + rfover = BWN_PHY_READ(mac, BWN_PHY_RFOVER); + rfoverval = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL); + analogover = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVER); + analogoverval = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVERVAL); + crs0 = BWN_PHY_READ(mac, BWN_PHY_CRS0); + classctl = BWN_PHY_READ(mac, BWN_PHY_CLASSCTL); + + BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0003); + BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffc); + BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0x7fff); + BWN_PHY_MASK(mac, BWN_PHY_CLASSCTL, 0xfffc); + if (BWN_HAS_LOOPBACK(phy)) { + lomask = BWN_PHY_READ(mac, BWN_PHY_LO_MASK); + loctl = BWN_PHY_READ(mac, BWN_PHY_LO_CTL); + if (phy->rev >= 3) + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0xc020); + else + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8020); + BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, 0); + } + + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVERVAL, + BWN_LPD(0, 1, 1))); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, + bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVER, 0)); + } + BWN_WRITE_2(mac, 0x3e2, BWN_READ_2(mac, 0x3e2) | 0x8000); + + syncctl = BWN_PHY_READ(mac, BWN_PHY_SYNCCTL); + BWN_PHY_MASK(mac, BWN_PHY_SYNCCTL, 0xff7f); + reg1 = BWN_READ_2(mac, 0x3e6); + reg2 = BWN_READ_2(mac, 0x3f4); + + if (phy->analog == 0) + BWN_WRITE_2(mac, 0x03e6, 0x0122); + else { + if (phy->analog >= 2) + BWN_PHY_SETMASK(mac, BWN_PHY_CCK(0x03), 0xffbf, 0x40); + BWN_WRITE_2(mac, BWN_CHANNEL_EXT, + (BWN_READ_2(mac, BWN_CHANNEL_EXT) | 0x2000)); + } + + reg = BWN_RF_READ(mac, 0x60); + index = (reg & 0x001e) >> 1; + rcc = (((rcc_table[index] << 1) | (reg & 0x0001)) | 0x0020); + + if (phy->type == BWN_PHYTYPE_B) + BWN_RF_WRITE(mac, 0x78, 0x26); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVERVAL, + BWN_LPD(0, 1, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xbfaf); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), 0x1403); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, BWN_PHY_RFOVERVAL, + BWN_LPD(0, 0, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xbfa0); + BWN_RF_SET(mac, 0x51, 0x0004); + if (phy->rf_rev == 8) + BWN_RF_WRITE(mac, 0x43, 0x1f); + else { + BWN_RF_WRITE(mac, 0x52, 0); + BWN_RF_SETMASK(mac, 0x43, 0xfff0, 0x0009); + } + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0); + + for (i = 0; i < 16; i++) { + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), 0x0480); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), 0xc810); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0x000d); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0); + DELAY(10); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xefb0); + DELAY(10); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 0))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xfff0); + DELAY(20); + tmp1 += BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0); + } + DELAY(10); + + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0); + tmp1++; + tmp1 >>= 9; + + for (i = 0; i < 16; i++) { + radio78 = (BWN_BITREV4(i) << 1) | 0x0020; + BWN_RF_WRITE(mac, 0x78, radio78); + DELAY(10); + for (j = 0; j < 16; j++) { + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), 0x0d80); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), 0xc810); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0x000d); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0); + DELAY(10); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xefb0); + DELAY(10); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 0))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xfff0); + DELAY(10); + tmp2 += BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), 0); + if (phy->gmode || phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, + bwn_rf_2050_rfoverval(mac, + BWN_PHY_RFOVERVAL, BWN_LPD(1, 0, 1))); + } + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xafb0); + } + tmp2++; + tmp2 >>= 8; + if (tmp1 < tmp2) + break; + } + + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pgactl); + BWN_RF_WRITE(mac, 0x51, radio1); + BWN_RF_WRITE(mac, 0x52, radio2); + BWN_RF_WRITE(mac, 0x43, radio0); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x5a), cck0); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x59), cck1); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x58), cck2); + BWN_WRITE_2(mac, 0x3e6, reg1); + if (phy->analog != 0) + BWN_WRITE_2(mac, 0x3f4, reg2); + BWN_PHY_WRITE(mac, BWN_PHY_SYNCCTL, syncctl); + bwn_spu_workaround(mac, phy->chan); + if (phy->type == BWN_PHYTYPE_B) { + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), cck3); + BWN_WRITE_2(mac, 0x3ec, reg0); + } else if (phy->gmode) { + BWN_WRITE_2(mac, BWN_PHY_RADIO, + BWN_READ_2(mac, BWN_PHY_RADIO) + & 0x7fff); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, rfover); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfoverval); + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, analogover); + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL, + analogoverval); + BWN_PHY_WRITE(mac, BWN_PHY_CRS0, crs0); + BWN_PHY_WRITE(mac, BWN_PHY_CLASSCTL, classctl); + if (BWN_HAS_LOOPBACK(phy)) { + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, lomask); + BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, loctl); + } + } + + return ((i > 15) ? radio78 : rcc); +} + +static void +bwn_phy_init_b6(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + uint16_t offset, val; + uint8_t old_channel; + + KASSERT(!(phy->rf_rev == 6 || phy->rf_rev == 7), + ("%s:%d: fail", __func__, __LINE__)); + + BWN_PHY_WRITE(mac, 0x003e, 0x817a); + BWN_RF_WRITE(mac, 0x007a, BWN_RF_READ(mac, 0x007a) | 0x0058); + if (phy->rf_rev == 4 || phy->rf_rev == 5) { + BWN_RF_WRITE(mac, 0x51, 0x37); + BWN_RF_WRITE(mac, 0x52, 0x70); + BWN_RF_WRITE(mac, 0x53, 0xb3); + BWN_RF_WRITE(mac, 0x54, 0x9b); + BWN_RF_WRITE(mac, 0x5a, 0x88); + BWN_RF_WRITE(mac, 0x5b, 0x88); + BWN_RF_WRITE(mac, 0x5d, 0x88); + BWN_RF_WRITE(mac, 0x5e, 0x88); + BWN_RF_WRITE(mac, 0x7d, 0x88); + bwn_hf_write(mac, + bwn_hf_read(mac) | BWN_HF_TSSI_RESET_PSM_WORKAROUN); + } + if (phy->rf_rev == 8) { + BWN_RF_WRITE(mac, 0x51, 0); + BWN_RF_WRITE(mac, 0x52, 0x40); + BWN_RF_WRITE(mac, 0x53, 0xb7); + BWN_RF_WRITE(mac, 0x54, 0x98); + BWN_RF_WRITE(mac, 0x5a, 0x88); + BWN_RF_WRITE(mac, 0x5b, 0x6b); + BWN_RF_WRITE(mac, 0x5c, 0x0f); + if (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_ALTIQ) { + BWN_RF_WRITE(mac, 0x5d, 0xfa); + BWN_RF_WRITE(mac, 0x5e, 0xd8); + } else { + BWN_RF_WRITE(mac, 0x5d, 0xf5); + BWN_RF_WRITE(mac, 0x5e, 0xb8); + } + BWN_RF_WRITE(mac, 0x0073, 0x0003); + BWN_RF_WRITE(mac, 0x007d, 0x00a8); + BWN_RF_WRITE(mac, 0x007c, 0x0001); + BWN_RF_WRITE(mac, 0x007e, 0x0008); + } + for (val = 0x1e1f, offset = 0x0088; offset < 0x0098; offset++) { + BWN_PHY_WRITE(mac, offset, val); + val -= 0x0202; + } + for (val = 0x3e3f, offset = 0x0098; offset < 0x00a8; offset++) { + BWN_PHY_WRITE(mac, offset, val); + val -= 0x0202; + } + for (val = 0x2120, offset = 0x00a8; offset < 0x00c8; offset++) { + BWN_PHY_WRITE(mac, offset, (val & 0x3f3f)); + val += 0x0202; + } + if (phy->type == BWN_PHYTYPE_G) { + BWN_RF_SET(mac, 0x007a, 0x0020); + BWN_RF_SET(mac, 0x0051, 0x0004); + BWN_PHY_SET(mac, 0x0802, 0x0100); + BWN_PHY_SET(mac, 0x042b, 0x2000); + BWN_PHY_WRITE(mac, 0x5b, 0); + BWN_PHY_WRITE(mac, 0x5c, 0); + } + + old_channel = phy->chan; + bwn_phy_g_switch_chan(mac, (old_channel >= 8) ? 1 : 13, 0); + + BWN_RF_WRITE(mac, 0x0050, 0x0020); + BWN_RF_WRITE(mac, 0x0050, 0x0023); + DELAY(40); + if (phy->rf_rev < 6 || phy->rf_rev == 8) { + BWN_RF_WRITE(mac, 0x7c, BWN_RF_READ(mac, 0x7c) | 0x0002); + BWN_RF_WRITE(mac, 0x50, 0x20); + } + if (phy->rf_rev <= 2) { + BWN_RF_WRITE(mac, 0x7c, 0x20); + BWN_RF_WRITE(mac, 0x5a, 0x70); + BWN_RF_WRITE(mac, 0x5b, 0x7b); + BWN_RF_WRITE(mac, 0x5c, 0xb0); + } + BWN_RF_SETMASK(mac, 0x007a, 0x00f8, 0x0007); + + bwn_phy_g_switch_chan(mac, old_channel, 0); + + BWN_PHY_WRITE(mac, 0x0014, 0x0200); + if (phy->rf_rev >= 6) + BWN_PHY_WRITE(mac, 0x2a, 0x88c2); + else + BWN_PHY_WRITE(mac, 0x2a, 0x8ac0); + BWN_PHY_WRITE(mac, 0x0038, 0x0668); + bwn_phy_g_set_txpwr_sub(mac, &pg->pg_bbatt, &pg->pg_rfatt, + pg->pg_txctl); + if (phy->rf_rev <= 5) + BWN_PHY_SETMASK(mac, 0x5d, 0xff80, 0x0003); + if (phy->rf_rev <= 2) + BWN_RF_WRITE(mac, 0x005d, 0x000d); + + if (phy->analog == 4) { + BWN_WRITE_2(mac, 0x3e4, 9); + BWN_PHY_MASK(mac, 0x61, 0x0fff); + } else + BWN_PHY_SETMASK(mac, 0x0002, 0xffc0, 0x0004); + if (phy->type == BWN_PHYTYPE_B) + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + else if (phy->type == BWN_PHYTYPE_G) + BWN_WRITE_2(mac, 0x03e6, 0x0); +} + +static void +bwn_phy_init_a(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + + KASSERT(phy->type == BWN_PHYTYPE_A || phy->type == BWN_PHYTYPE_G, + ("%s:%d: fail", __func__, __LINE__)); + + if (phy->rev >= 6) { + if (phy->type == BWN_PHYTYPE_A) + BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x1b), ~0x1000); + if (BWN_PHY_READ(mac, BWN_PHY_ENCORE) & BWN_PHY_ENCORE_EN) + BWN_PHY_SET(mac, BWN_PHY_ENCORE, 0x0010); + else + BWN_PHY_MASK(mac, BWN_PHY_ENCORE, ~0x1010); + } + + bwn_wa_init(mac); + + if (phy->type == BWN_PHYTYPE_G && + (mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_PACTRL)) + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x6e), 0xe000, 0x3cf); +} + +static void +bwn_wa_write_noisescale(struct bwn_mac *mac, const uint16_t *nst) +{ + int i; + + for (i = 0; i < BWN_TAB_NOISESCALE_SIZE; i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_NOISESCALE, i, nst[i]); +} + +static void +bwn_wa_agc(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + + if (phy->rev == 1) { + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 0, 254); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 1, 13); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 2, 19); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1_R1, 3, 25); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 0, 0x2710); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 1, 0x9b83); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 2, 0x9b83); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, 3, 0x0f8d); + BWN_PHY_WRITE(mac, BWN_PHY_LMS, 4); + } else { + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 0, 254); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 1, 13); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 2, 19); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC1, 3, 25); + } + + BWN_PHY_SETMASK(mac, BWN_PHY_CCKSHIFTBITS_WA, (uint16_t)~0xff00, + 0x5700); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x1a), ~0x007f, 0x000f); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x1a), ~0x3f80, 0x2b80); + BWN_PHY_SETMASK(mac, BWN_PHY_ANTWRSETT, 0xf0ff, 0x0300); + BWN_RF_SET(mac, 0x7a, 0x0008); + BWN_PHY_SETMASK(mac, BWN_PHY_N1P1GAIN, ~0x000f, 0x0008); + BWN_PHY_SETMASK(mac, BWN_PHY_P1P2GAIN, ~0x0f00, 0x0600); + BWN_PHY_SETMASK(mac, BWN_PHY_N1N2GAIN, ~0x0f00, 0x0700); + BWN_PHY_SETMASK(mac, BWN_PHY_N1P1GAIN, ~0x0f00, 0x0100); + if (phy->rev == 1) + BWN_PHY_SETMASK(mac, BWN_PHY_N1N2GAIN, ~0x000f, 0x0007); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x88), ~0x00ff, 0x001c); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x88), ~0x3f00, 0x0200); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x96), ~0x00ff, 0x001c); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x89), ~0x00ff, 0x0020); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x89), ~0x3f00, 0x0200); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x82), ~0x00ff, 0x002e); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x96), (uint16_t)~0xff00, 0x1a00); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x81), ~0x00ff, 0x0028); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x81), (uint16_t)~0xff00, 0x2c00); + if (phy->rev == 1) { + BWN_PHY_WRITE(mac, BWN_PHY_PEAK_COUNT, 0x092b); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x1b), ~0x001e, 0x0002); + } else { + BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x1b), ~0x001e); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x1f), 0x287a); + BWN_PHY_SETMASK(mac, BWN_PHY_LPFGAINCTL, ~0x000f, 0x0004); + if (phy->rev >= 6) { + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x22), 0x287a); + BWN_PHY_SETMASK(mac, BWN_PHY_LPFGAINCTL, + (uint16_t)~0xf000, 0x3000); + } + } + BWN_PHY_SETMASK(mac, BWN_PHY_DIVSRCHIDX, 0x8080, 0x7874); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x8e), 0x1c00); + if (phy->rev == 1) { + BWN_PHY_SETMASK(mac, BWN_PHY_DIVP1P2GAIN, ~0x0f00, 0x0600); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x8b), 0x005e); + BWN_PHY_SETMASK(mac, BWN_PHY_ANTWRSETT, ~0x00ff, 0x001e); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x8d), 0x0002); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 0, 0); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 1, 7); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 2, 16); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3_R1, 3, 28); + } else { + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 0, 0); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 1, 7); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 2, 16); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC3, 3, 28); + } + if (phy->rev >= 6) { + BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x26), ~0x0003); + BWN_PHY_MASK(mac, BWN_PHY_OFDM(0x26), ~0x1000); + } + BWN_PHY_READ(mac, BWN_PHY_VERSION_OFDM); +} + +static void +bwn_wa_grev1(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + int i; + static const uint16_t bwn_tab_finefreqg[] = BWN_TAB_FINEFREQ_G; + static const uint32_t bwn_tab_retard[] = BWN_TAB_RETARD; + static const uint32_t bwn_tab_rotor[] = BWN_TAB_ROTOR; + + KASSERT(phy->type == BWN_PHYTYPE_G, ("%s fail", __func__)); + + /* init CRSTHRES and ANTDWELL */ + if (phy->rev == 1) { + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1_R1, 0x4f19); + } else if (phy->rev == 2) { + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x1861); + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0271); + BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800); + } else { + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x0098); + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0070); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc9), 0x0080); + BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800); + } + BWN_PHY_SETMASK(mac, BWN_PHY_CRS0, ~0x03c0, 0xd000); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0x2c), 0x005a); + BWN_PHY_WRITE(mac, BWN_PHY_CCKSHIFTBITS, 0x0026); + + /* XXX support PHY-A??? */ + for (i = 0; i < N(bwn_tab_finefreqg); i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DACRFPABB, i, + bwn_tab_finefreqg[i]); + + /* XXX support PHY-A??? */ + if (phy->rev == 1) + for (i = 0; i < N(bwn_tab_noise_g1); i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i, + bwn_tab_noise_g1[i]); + else + for (i = 0; i < N(bwn_tab_noise_g2); i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i, + bwn_tab_noise_g2[i]); + + + for (i = 0; i < N(bwn_tab_rotor); i++) + bwn_ofdmtab_write_4(mac, BWN_OFDMTAB_ROTOR, i, + bwn_tab_rotor[i]); + + /* XXX support PHY-A??? */ + if (phy->rev >= 6) { + if (BWN_PHY_READ(mac, BWN_PHY_ENCORE) & + BWN_PHY_ENCORE_EN) + bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g3); + else + bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g2); + } else + bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g1); + + for (i = 0; i < N(bwn_tab_retard); i++) + bwn_ofdmtab_write_4(mac, BWN_OFDMTAB_ADVRETARD, i, + bwn_tab_retard[i]); + + if (phy->rev == 1) { + for (i = 0; i < 16; i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI_R1, + i, 0x0020); + } else { + for (i = 0; i < 32; i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI, i, 0x0820); + } + + bwn_wa_agc(mac); +} + +static void +bwn_wa_grev26789(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + int i; + static const uint16_t bwn_tab_sigmasqr2[] = BWN_TAB_SIGMASQR2; + uint16_t ofdmrev; + + KASSERT(phy->type == BWN_PHYTYPE_G, ("%s fail", __func__)); + + bwn_gtab_write(mac, BWN_GTAB_ORIGTR, 0, 0xc480); + + /* init CRSTHRES and ANTDWELL */ + if (phy->rev == 1) + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1_R1, 0x4f19); + else if (phy->rev == 2) { + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x1861); + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0271); + BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800); + } else { + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES1, 0x0098); + BWN_PHY_WRITE(mac, BWN_PHY_CRSTHRES2, 0x0070); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xc9), 0x0080); + BWN_PHY_SET(mac, BWN_PHY_ANTDWELL, 0x0800); + } + + for (i = 0; i < 64; i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_RSSI, i, i); + + /* XXX support PHY-A??? */ + if (phy->rev == 1) + for (i = 0; i < N(bwn_tab_noise_g1); i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i, + bwn_tab_noise_g1[i]); + else + for (i = 0; i < N(bwn_tab_noise_g2); i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_AGC2, i, + bwn_tab_noise_g2[i]); + + /* XXX support PHY-A??? */ + if (phy->rev >= 6) { + if (BWN_PHY_READ(mac, BWN_PHY_ENCORE) & + BWN_PHY_ENCORE_EN) + bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g3); + else + bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g2); + } else + bwn_wa_write_noisescale(mac, bwn_tab_noisescale_g1); + + for (i = 0; i < N(bwn_tab_sigmasqr2); i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_MINSIGSQ, i, + bwn_tab_sigmasqr2[i]); + + if (phy->rev == 1) { + for (i = 0; i < 16; i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI_R1, i, + 0x0020); + } else { + for (i = 0; i < 32; i++) + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_WRSSI, i, 0x0820); + } + + bwn_wa_agc(mac); + + ofdmrev = BWN_PHY_READ(mac, BWN_PHY_VERSION_OFDM) & BWN_PHYVER_VERSION; + if (ofdmrev > 2) { + if (phy->type == BWN_PHYTYPE_A) + BWN_PHY_WRITE(mac, BWN_PHY_PWRDOWN, 0x1808); + else + BWN_PHY_WRITE(mac, BWN_PHY_PWRDOWN, 0x1000); + } else { + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DAC, 3, 0x1044); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DAC, 4, 0x7201); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_DAC, 6, 0x0040); + } + + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_0F, 2, 15); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_0F, 3, 20); +} + +static void +bwn_wa_init(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct siba_softc *bus = mac->mac_sd->sd_bus; + + KASSERT(phy->type == BWN_PHYTYPE_G, ("%s fail", __func__)); + + switch (phy->rev) { + case 1: + bwn_wa_grev1(mac); + break; + case 2: + case 6: + case 7: + case 8: + case 9: + bwn_wa_grev26789(mac); + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + + if (bus->siba_board_vendor != SIBA_BOARDVENDOR_BCM || + bus->siba_board_type != SIBA_BOARD_BU4306 || + bus->siba_board_rev != 0x17) { + if (phy->rev < 2) { + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX_R1, 1, + 0x0002); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX_R1, 2, + 0x0001); + } else { + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, 1, 0x0002); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, 2, 0x0001); + if ((bus->siba_sprom.bf_lo & BWN_BFL_EXTLNA) && + (phy->rev >= 7)) { + BWN_PHY_MASK(mac, BWN_PHY_EXTG(0x11), 0xf7ff); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, + 0x0020, 0x0001); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, + 0x0021, 0x0001); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, + 0x0022, 0x0001); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, + 0x0023, 0x0000); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, + 0x0000, 0x0000); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_GAINX, + 0x0003, 0x0002); + } + } + } + if (bus->siba_sprom.bf_lo & BWN_BFL_FEM) { + BWN_PHY_WRITE(mac, BWN_PHY_GTABCTL, 0x3120); + BWN_PHY_WRITE(mac, BWN_PHY_GTABDATA, 0xc480); + } + + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_11, 0, 0); + bwn_ofdmtab_write_2(mac, BWN_OFDMTAB_UNKNOWN_11, 1, 0); +} + +static void +bwn_ofdmtab_write_2(struct bwn_mac *mac, uint16_t table, uint16_t offset, + uint16_t value) +{ + struct bwn_phy_g *pg = &mac->mac_phy.phy_g; + uint16_t addr; + + addr = table + offset; + if ((pg->pg_ofdmtab_dir != BWN_OFDMTAB_DIR_WRITE) || + (addr - 1 != pg->pg_ofdmtab_addr)) { + BWN_PHY_WRITE(mac, BWN_PHY_OTABLECTL, addr); + pg->pg_ofdmtab_dir = BWN_OFDMTAB_DIR_WRITE; + } + pg->pg_ofdmtab_addr = addr; + BWN_PHY_WRITE(mac, BWN_PHY_OTABLEI, value); +} + +static void +bwn_ofdmtab_write_4(struct bwn_mac *mac, uint16_t table, uint16_t offset, + uint32_t value) +{ + struct bwn_phy_g *pg = &mac->mac_phy.phy_g; + uint16_t addr; + + addr = table + offset; + if ((pg->pg_ofdmtab_dir != BWN_OFDMTAB_DIR_WRITE) || + (addr - 1 != pg->pg_ofdmtab_addr)) { + BWN_PHY_WRITE(mac, BWN_PHY_OTABLECTL, addr); + pg->pg_ofdmtab_dir = BWN_OFDMTAB_DIR_WRITE; + } + pg->pg_ofdmtab_addr = addr; + + BWN_PHY_WRITE(mac, BWN_PHY_OTABLEI, value); + BWN_PHY_WRITE(mac, BWN_PHY_OTABLEQ, (value >> 16)); +} + +static void +bwn_gtab_write(struct bwn_mac *mac, uint16_t table, uint16_t offset, + uint16_t value) +{ + + BWN_PHY_WRITE(mac, BWN_PHY_GTABCTL, table + offset); + BWN_PHY_WRITE(mac, BWN_PHY_GTABDATA, value); +} + +static void +bwn_dummy_transmission(struct bwn_mac *mac, int ofdm, int paon) +{ + struct bwn_phy *phy = &mac->mac_phy; + unsigned int i, max_loop; + uint16_t value; + uint32_t buffer[5] = { + 0x00000000, 0x00d40000, 0x00000000, 0x01000000, 0x00000000 + }; + + if (ofdm) { + max_loop = 0x1e; + buffer[0] = 0x000201cc; + } else { + max_loop = 0xfa; + buffer[0] = 0x000b846e; + } + + BWN_ASSERT_LOCKED(mac->mac_sc); + + for (i = 0; i < 5; i++) + bwn_ram_write(mac, i * 4, buffer[i]); + + BWN_WRITE_2(mac, 0x0568, 0x0000); + BWN_WRITE_2(mac, 0x07c0, + (mac->mac_sd->sd_id.sd_rev < 11) ? 0x0000 : 0x0100); + value = ((phy->type == BWN_PHYTYPE_A) ? 0x41 : 0x40); + BWN_WRITE_2(mac, 0x050c, value); + if (phy->type == BWN_PHYTYPE_LP) + BWN_WRITE_2(mac, 0x0514, 0x1a02); + BWN_WRITE_2(mac, 0x0508, 0x0000); + BWN_WRITE_2(mac, 0x050a, 0x0000); + BWN_WRITE_2(mac, 0x054c, 0x0000); + BWN_WRITE_2(mac, 0x056a, 0x0014); + BWN_WRITE_2(mac, 0x0568, 0x0826); + BWN_WRITE_2(mac, 0x0500, 0x0000); + if (phy->type == BWN_PHYTYPE_LP) + BWN_WRITE_2(mac, 0x0502, 0x0050); + else + BWN_WRITE_2(mac, 0x0502, 0x0030); + + if (phy->rf_ver == 0x2050 && phy->rf_rev <= 0x5) + BWN_RF_WRITE(mac, 0x0051, 0x0017); + for (i = 0x00; i < max_loop; i++) { + value = BWN_READ_2(mac, 0x050e); + if (value & 0x0080) + break; + DELAY(10); + } + for (i = 0x00; i < 0x0a; i++) { + value = BWN_READ_2(mac, 0x050e); + if (value & 0x0400) + break; + DELAY(10); + } + for (i = 0x00; i < 0x19; i++) { + value = BWN_READ_2(mac, 0x0690); + if (!(value & 0x0100)) + break; + DELAY(10); + } + if (phy->rf_ver == 0x2050 && phy->rf_rev <= 0x5) + BWN_RF_WRITE(mac, 0x0051, 0x0037); +} + +static void +bwn_ram_write(struct bwn_mac *mac, uint16_t offset, uint32_t val) +{ + uint32_t macctl; + + KASSERT(offset % 4 == 0, ("%s:%d: fail", __func__, __LINE__)); + + macctl = BWN_READ_4(mac, BWN_MACCTL); + if (macctl & BWN_MACCTL_BIGENDIAN) + printf("TODO: need swap\n"); + + BWN_WRITE_4(mac, BWN_RAM_CONTROL, offset); + BWN_BARRIER(mac, BUS_SPACE_BARRIER_WRITE); + BWN_WRITE_4(mac, BWN_RAM_DATA, val); +} + +static void +bwn_lo_write(struct bwn_mac *mac, struct bwn_loctl *ctl) +{ + uint16_t value; + + KASSERT(mac->mac_phy.type == BWN_PHYTYPE_G, + ("%s:%d: fail", __func__, __LINE__)); + + value = (uint8_t) (ctl->q); + value |= ((uint8_t) (ctl->i)) << 8; + BWN_PHY_WRITE(mac, BWN_PHY_LO_CTL, value); +} + +static uint16_t +bwn_lo_calcfeed(struct bwn_mac *mac, + uint16_t lna, uint16_t pga, uint16_t trsw_rx) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint16_t rfover; + uint16_t feedthrough; + + if (phy->gmode) { + lna <<= BWN_PHY_RFOVERVAL_LNA_SHIFT; + pga <<= BWN_PHY_RFOVERVAL_PGA_SHIFT; + + KASSERT((lna & ~BWN_PHY_RFOVERVAL_LNA) == 0, + ("%s:%d: fail", __func__, __LINE__)); + KASSERT((pga & ~BWN_PHY_RFOVERVAL_PGA) == 0, + ("%s:%d: fail", __func__, __LINE__)); + + trsw_rx &= (BWN_PHY_RFOVERVAL_TRSWRX | BWN_PHY_RFOVERVAL_BW); + + rfover = BWN_PHY_RFOVERVAL_UNK | pga | lna | trsw_rx; + if ((mac->mac_sd->sd_bus->siba_sprom.bf_lo & BWN_BFL_EXTLNA) + && phy->rev > 6) + rfover |= BWN_PHY_RFOVERVAL_EXTLNA; + + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xe300); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfover); + DELAY(10); + rfover |= BWN_PHY_RFOVERVAL_BW_LBW; + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfover); + DELAY(10); + rfover |= BWN_PHY_RFOVERVAL_BW_LPF; + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, rfover); + DELAY(10); + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xf300); + } else { + pga |= BWN_PHY_PGACTL_UNKNOWN; + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pga); + DELAY(10); + pga |= BWN_PHY_PGACTL_LOWBANDW; + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pga); + DELAY(10); + pga |= BWN_PHY_PGACTL_LPF; + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, pga); + } + DELAY(21); + feedthrough = BWN_PHY_READ(mac, BWN_PHY_LO_LEAKAGE); + + return (feedthrough); +} + +static uint16_t +bwn_lo_txctl_regtable(struct bwn_mac *mac, + uint16_t *value, uint16_t *pad_mix_gain) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint16_t reg, v, padmix; + + if (phy->type == BWN_PHYTYPE_B) { + v = 0x30; + if (phy->rf_rev <= 5) { + reg = 0x43; + padmix = 0; + } else { + reg = 0x52; + padmix = 5; + } + } else { + if (phy->rev >= 2 && phy->rf_rev == 8) { + reg = 0x43; + v = 0x10; + padmix = 2; + } else { + reg = 0x52; + v = 0x30; + padmix = 5; + } + } + if (value) + *value = v; + if (pad_mix_gain) + *pad_mix_gain = padmix; + + return (reg); +} + +static void +bwn_lo_measure_txctl_values(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + uint16_t reg, mask; + uint16_t trsw_rx, pga; + uint16_t rf_pctl_reg; + + static const uint8_t tx_bias_values[] = { + 0x09, 0x08, 0x0a, 0x01, 0x00, + 0x02, 0x05, 0x04, 0x06, + }; + static const uint8_t tx_magn_values[] = { + 0x70, 0x40, + }; + + if (!BWN_HAS_LOOPBACK(phy)) { + rf_pctl_reg = 6; + trsw_rx = 2; + pga = 0; + } else { + int lb_gain; + + trsw_rx = 0; + lb_gain = pg->pg_max_lb_gain / 2; + if (lb_gain > 10) { + rf_pctl_reg = 0; + pga = abs(10 - lb_gain) / 6; + pga = MIN(MAX(pga, 0), 15); + } else { + int cmp_val; + int tmp; + + pga = 0; + cmp_val = 0x24; + if ((phy->rev >= 2) && + (phy->rf_ver == 0x2050) && (phy->rf_rev == 8)) + cmp_val = 0x3c; + tmp = lb_gain; + if ((10 - lb_gain) < cmp_val) + tmp = (10 - lb_gain); + if (tmp < 0) + tmp += 6; + else + tmp += 3; + cmp_val /= 4; + tmp /= 4; + if (tmp >= cmp_val) + rf_pctl_reg = cmp_val; + else + rf_pctl_reg = tmp; + } + } + BWN_RF_SETMASK(mac, 0x43, 0xfff0, rf_pctl_reg); + bwn_phy_g_set_bbatt(mac, 2); + + reg = bwn_lo_txctl_regtable(mac, &mask, NULL); + mask = ~mask; + BWN_RF_MASK(mac, reg, mask); + + if (BWN_HAS_TXMAG(phy)) { + int i, j; + int feedthrough; + int min_feedth = 0xffff; + uint8_t tx_magn, tx_bias; + + for (i = 0; i < N(tx_magn_values); i++) { + tx_magn = tx_magn_values[i]; + BWN_RF_SETMASK(mac, 0x52, 0xff0f, tx_magn); + for (j = 0; j < N(tx_bias_values); j++) { + tx_bias = tx_bias_values[j]; + BWN_RF_SETMASK(mac, 0x52, 0xfff0, tx_bias); + feedthrough = bwn_lo_calcfeed(mac, 0, pga, + trsw_rx); + if (feedthrough < min_feedth) { + lo->tx_bias = tx_bias; + lo->tx_magn = tx_magn; + min_feedth = feedthrough; + } + if (lo->tx_bias == 0) + break; + } + BWN_RF_WRITE(mac, 0x52, + (BWN_RF_READ(mac, 0x52) + & 0xff00) | lo->tx_bias | lo-> + tx_magn); + } + } else { + lo->tx_magn = 0; + lo->tx_bias = 0; + BWN_RF_MASK(mac, 0x52, 0xfff0); + } + + BWN_GETTIME(lo->txctl_measured_time); +} + +static void +bwn_lo_get_powervector(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + int i; + uint64_t tmp; + uint64_t power_vector = 0; + + for (i = 0; i < 8; i += 2) { + tmp = bwn_shm_read_2(mac, BWN_SHARED, 0x310 + i); + power_vector |= (tmp << (i * 8)); + bwn_shm_write_2(mac, BWN_SHARED, 0x310 + i, 0); + } + if (power_vector) + lo->power_vector = power_vector; + + BWN_GETTIME(lo->pwr_vec_read_time); +} + +static void +bwn_lo_measure_gain_values(struct bwn_mac *mac, int16_t max_rx_gain, + int use_trsw_rx) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + uint16_t tmp; + + if (max_rx_gain < 0) + max_rx_gain = 0; + + if (BWN_HAS_LOOPBACK(phy)) { + int trsw_rx = 0; + int trsw_rx_gain; + + if (use_trsw_rx) { + trsw_rx_gain = pg->pg_trsw_rx_gain / 2; + if (max_rx_gain >= trsw_rx_gain) { + trsw_rx_gain = max_rx_gain - trsw_rx_gain; + trsw_rx = 0x20; + } + } else + trsw_rx_gain = max_rx_gain; + if (trsw_rx_gain < 9) { + pg->pg_lna_lod_gain = 0; + } else { + pg->pg_lna_lod_gain = 1; + trsw_rx_gain -= 8; + } + trsw_rx_gain = MIN(MAX(trsw_rx_gain, 0), 0x2d); + pg->pg_pga_gain = trsw_rx_gain / 3; + if (pg->pg_pga_gain >= 5) { + pg->pg_pga_gain -= 5; + pg->pg_lna_gain = 2; + } else + pg->pg_lna_gain = 0; + } else { + pg->pg_lna_gain = 0; + pg->pg_trsw_rx_gain = 0x20; + if (max_rx_gain >= 0x14) { + pg->pg_lna_lod_gain = 1; + pg->pg_pga_gain = 2; + } else if (max_rx_gain >= 0x12) { + pg->pg_lna_lod_gain = 1; + pg->pg_pga_gain = 1; + } else if (max_rx_gain >= 0xf) { + pg->pg_lna_lod_gain = 1; + pg->pg_pga_gain = 0; + } else { + pg->pg_lna_lod_gain = 0; + pg->pg_pga_gain = 0; + } + } + + tmp = BWN_RF_READ(mac, 0x7a); + if (pg->pg_lna_lod_gain == 0) + tmp &= ~0x0008; + else + tmp |= 0x0008; + BWN_RF_WRITE(mac, 0x7a, tmp); +} + +static void +bwn_lo_save(struct bwn_mac *mac, struct bwn_lo_g_value *sav) +{ + struct siba_sprom *sprom = &mac->mac_sd->sd_bus->siba_sprom; + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + struct timespec ts; + uint16_t tmp; + + if (bwn_has_hwpctl(mac)) { + sav->phy_lomask = BWN_PHY_READ(mac, BWN_PHY_LO_MASK); + sav->phy_extg = BWN_PHY_READ(mac, BWN_PHY_EXTG(0x01)); + sav->phy_dacctl_hwpctl = BWN_PHY_READ(mac, BWN_PHY_DACCTL); + sav->phy_cck4 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x14)); + sav->phy_hpwr_tssictl = BWN_PHY_READ(mac, BWN_PHY_HPWR_TSSICTL); + + BWN_PHY_SET(mac, BWN_PHY_HPWR_TSSICTL, 0x100); + BWN_PHY_SET(mac, BWN_PHY_EXTG(0x01), 0x40); + BWN_PHY_SET(mac, BWN_PHY_DACCTL, 0x40); + BWN_PHY_SET(mac, BWN_PHY_CCK(0x14), 0x200); + } + if (phy->type == BWN_PHYTYPE_B && + phy->rf_ver == 0x2050 && phy->rf_rev < 6) { + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x16), 0x410); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x17), 0x820); + } + if (phy->rev >= 2) { + sav->phy_analogover = BWN_PHY_READ(mac, BWN_PHY_ANALOGOVER); + sav->phy_analogoverval = + BWN_PHY_READ(mac, BWN_PHY_ANALOGOVERVAL); + sav->phy_rfover = BWN_PHY_READ(mac, BWN_PHY_RFOVER); + sav->phy_rfoverval = BWN_PHY_READ(mac, BWN_PHY_RFOVERVAL); + sav->phy_classctl = BWN_PHY_READ(mac, BWN_PHY_CLASSCTL); + sav->phy_cck3 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x3e)); + sav->phy_crs0 = BWN_PHY_READ(mac, BWN_PHY_CRS0); + + BWN_PHY_MASK(mac, BWN_PHY_CLASSCTL, 0xfffc); + BWN_PHY_MASK(mac, BWN_PHY_CRS0, 0x7fff); + BWN_PHY_SET(mac, BWN_PHY_ANALOGOVER, 0x0003); + BWN_PHY_MASK(mac, BWN_PHY_ANALOGOVERVAL, 0xfffc); + if (phy->type == BWN_PHYTYPE_G) { + if ((phy->rev >= 7) && + (sprom->bf_lo & BWN_BFL_EXTLNA)) { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x933); + } else { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0x133); + } + } else { + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, 0); + } + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x3e), 0); + } + sav->reg0 = BWN_READ_2(mac, 0x3f4); + sav->reg1 = BWN_READ_2(mac, 0x3e2); + sav->rf0 = BWN_RF_READ(mac, 0x43); + sav->rf1 = BWN_RF_READ(mac, 0x7a); + sav->phy_pgactl = BWN_PHY_READ(mac, BWN_PHY_PGACTL); + sav->phy_cck2 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x2a)); + sav->phy_syncctl = BWN_PHY_READ(mac, BWN_PHY_SYNCCTL); + sav->phy_dacctl = BWN_PHY_READ(mac, BWN_PHY_DACCTL); + + if (!BWN_HAS_TXMAG(phy)) { + sav->rf2 = BWN_RF_READ(mac, 0x52); + sav->rf2 &= 0x00f0; + } + if (phy->type == BWN_PHYTYPE_B) { + sav->phy_cck0 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x30)); + sav->phy_cck1 = BWN_PHY_READ(mac, BWN_PHY_CCK(0x06)); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), 0x00ff); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x06), 0x3f3f); + } else { + BWN_WRITE_2(mac, 0x3e2, BWN_READ_2(mac, 0x3e2) + | 0x8000); + } + BWN_WRITE_2(mac, 0x3f4, BWN_READ_2(mac, 0x3f4) + & 0xf000); + + tmp = + (phy->type == BWN_PHYTYPE_G) ? BWN_PHY_LO_MASK : BWN_PHY_CCK(0x2e); + BWN_PHY_WRITE(mac, tmp, 0x007f); + + tmp = sav->phy_syncctl; + BWN_PHY_WRITE(mac, BWN_PHY_SYNCCTL, tmp & 0xff7f); + tmp = sav->rf1; + BWN_RF_WRITE(mac, 0x007a, tmp & 0xfff0); + + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2a), 0x8a3); + if (phy->type == BWN_PHYTYPE_G || + (phy->type == BWN_PHYTYPE_B && + phy->rf_ver == 0x2050 && phy->rf_rev >= 6)) { + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), 0x1003); + } else + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2b), 0x0802); + if (phy->rev >= 2) + bwn_dummy_transmission(mac, 0, 1); + bwn_phy_g_switch_chan(mac, 6, 0); + BWN_RF_READ(mac, 0x51); + if (phy->type == BWN_PHYTYPE_G) + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0); + + nanouptime(&ts); + if (time_before(lo->txctl_measured_time, + (ts.tv_nsec / 1000000 + ts.tv_sec * 1000) - BWN_LO_TXCTL_EXPIRE)) + bwn_lo_measure_txctl_values(mac); + + if (phy->type == BWN_PHYTYPE_G && phy->rev >= 3) + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0xc078); + else { + if (phy->type == BWN_PHYTYPE_B) + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x8078); + else + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, 0x8078); + } +} + +static void +bwn_lo_restore(struct bwn_mac *mac, struct bwn_lo_g_value *sav) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + uint16_t tmp; + + if (phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, 0xe300); + tmp = (pg->pg_pga_gain << 8); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, tmp | 0xa0); + DELAY(5); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, tmp | 0xa2); + DELAY(2); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, tmp | 0xa3); + } else { + tmp = (pg->pg_pga_gain | 0xefa0); + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, tmp); + } + if (phy->type == BWN_PHYTYPE_G) { + if (phy->rev >= 3) + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0xc078); + else + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2e), 0x8078); + if (phy->rev >= 2) + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x0202); + else + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2f), 0x0101); + } + BWN_WRITE_2(mac, 0x3f4, sav->reg0); + BWN_PHY_WRITE(mac, BWN_PHY_PGACTL, sav->phy_pgactl); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x2a), sav->phy_cck2); + BWN_PHY_WRITE(mac, BWN_PHY_SYNCCTL, sav->phy_syncctl); + BWN_PHY_WRITE(mac, BWN_PHY_DACCTL, sav->phy_dacctl); + BWN_RF_WRITE(mac, 0x43, sav->rf0); + BWN_RF_WRITE(mac, 0x7a, sav->rf1); + if (!BWN_HAS_TXMAG(phy)) { + tmp = sav->rf2; + BWN_RF_SETMASK(mac, 0x52, 0xff0f, tmp); + } + BWN_WRITE_2(mac, 0x3e2, sav->reg1); + if (phy->type == BWN_PHYTYPE_B && + phy->rf_ver == 0x2050 && phy->rf_rev <= 5) { + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x30), sav->phy_cck0); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x06), sav->phy_cck1); + } + if (phy->rev >= 2) { + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVER, sav->phy_analogover); + BWN_PHY_WRITE(mac, BWN_PHY_ANALOGOVERVAL, + sav->phy_analogoverval); + BWN_PHY_WRITE(mac, BWN_PHY_CLASSCTL, sav->phy_classctl); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVER, sav->phy_rfover); + BWN_PHY_WRITE(mac, BWN_PHY_RFOVERVAL, sav->phy_rfoverval); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x3e), sav->phy_cck3); + BWN_PHY_WRITE(mac, BWN_PHY_CRS0, sav->phy_crs0); + } + if (bwn_has_hwpctl(mac)) { + tmp = (sav->phy_lomask & 0xbfff); + BWN_PHY_WRITE(mac, BWN_PHY_LO_MASK, tmp); + BWN_PHY_WRITE(mac, BWN_PHY_EXTG(0x01), sav->phy_extg); + BWN_PHY_WRITE(mac, BWN_PHY_DACCTL, sav->phy_dacctl_hwpctl); + BWN_PHY_WRITE(mac, BWN_PHY_CCK(0x14), sav->phy_cck4); + BWN_PHY_WRITE(mac, BWN_PHY_HPWR_TSSICTL, sav->phy_hpwr_tssictl); + } + bwn_phy_g_switch_chan(mac, sav->old_channel, 1); +} + +static int +bwn_lo_probe_loctl(struct bwn_mac *mac, + struct bwn_loctl *probe, struct bwn_lo_g_sm *d) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_loctl orig, test; + struct bwn_loctl prev = { -100, -100 }; + static const struct bwn_loctl modifiers[] = { + { 1, 1,}, { 1, 0,}, { 1, -1,}, { 0, -1,}, + { -1, -1,}, { -1, 0,}, { -1, 1,}, { 0, 1,} + }; + int begin, end, lower = 0, i; + uint16_t feedth; + + if (d->curstate == 0) { + begin = 1; + end = 8; + } else if (d->curstate % 2 == 0) { + begin = d->curstate - 1; + end = d->curstate + 1; + } else { + begin = d->curstate - 2; + end = d->curstate + 2; + } + if (begin < 1) + begin += 8; + if (end > 8) + end -= 8; + + memcpy(&orig, probe, sizeof(struct bwn_loctl)); + i = begin; + d->curstate = i; + while (1) { + KASSERT(i >= 1 && i <= 8, ("%s:%d: fail", __func__, __LINE__)); + memcpy(&test, &orig, sizeof(struct bwn_loctl)); + test.i += modifiers[i - 1].i * d->multipler; + test.q += modifiers[i - 1].q * d->multipler; + if ((test.i != prev.i || test.q != prev.q) && + (abs(test.i) <= 16 && abs(test.q) <= 16)) { + bwn_lo_write(mac, &test); + feedth = bwn_lo_calcfeed(mac, pg->pg_lna_gain, + pg->pg_pga_gain, pg->pg_trsw_rx_gain); + if (feedth < d->feedth) { + memcpy(probe, &test, + sizeof(struct bwn_loctl)); + lower = 1; + d->feedth = feedth; + if (d->nmeasure < 2 && !BWN_HAS_LOOPBACK(phy)) + break; + } + } + memcpy(&prev, &test, sizeof(prev)); + if (i == end) + break; + if (i == 8) + i = 1; + else + i++; + d->curstate = i; + } + + return (lower); +} + +static void +bwn_lo_probe_sm(struct bwn_mac *mac, struct bwn_loctl *loctl, int *rxgain) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_lo_g_sm d; + struct bwn_loctl probe; + int lower, repeat, cnt = 0; + uint16_t feedth; + + d.nmeasure = 0; + d.multipler = 1; + if (BWN_HAS_LOOPBACK(phy)) + d.multipler = 3; + + memcpy(&d.loctl, loctl, sizeof(struct bwn_loctl)); + repeat = (BWN_HAS_LOOPBACK(phy)) ? 4 : 1; + + do { + bwn_lo_write(mac, &d.loctl); + feedth = bwn_lo_calcfeed(mac, pg->pg_lna_gain, + pg->pg_pga_gain, pg->pg_trsw_rx_gain); + if (feedth < 0x258) { + if (feedth >= 0x12c) + *rxgain += 6; + else + *rxgain += 3; + feedth = bwn_lo_calcfeed(mac, pg->pg_lna_gain, + pg->pg_pga_gain, pg->pg_trsw_rx_gain); + } + d.feedth = feedth; + d.curstate = 0; + do { + KASSERT(d.curstate >= 0 && d.curstate <= 8, + ("%s:%d: fail", __func__, __LINE__)); + memcpy(&probe, &d.loctl, + sizeof(struct bwn_loctl)); + lower = bwn_lo_probe_loctl(mac, &probe, &d); + if (!lower) + break; + if ((probe.i == d.loctl.i) && (probe.q == d.loctl.q)) + break; + memcpy(&d.loctl, &probe, sizeof(struct bwn_loctl)); + d.nmeasure++; + } while (d.nmeasure < 24); + memcpy(loctl, &d.loctl, sizeof(struct bwn_loctl)); + + if (BWN_HAS_LOOPBACK(phy)) { + if (d.feedth > 0x1194) + *rxgain -= 6; + else if (d.feedth < 0x5dc) + *rxgain += 3; + if (cnt == 0) { + if (d.feedth <= 0x5dc) { + d.multipler = 1; + cnt++; + } else + d.multipler = 2; + } else if (cnt == 2) + d.multipler = 1; + } + bwn_lo_measure_gain_values(mac, *rxgain, BWN_HAS_LOOPBACK(phy)); + } while (++cnt < repeat); +} + +static struct bwn_lo_calib * +bwn_lo_calibset(struct bwn_mac *mac, + const struct bwn_bbatt *bbatt, const struct bwn_rfatt *rfatt) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_loctl loctl = { 0, 0 }; + struct bwn_lo_calib *cal; + struct bwn_lo_g_value sval = { 0 }; + int rxgain; + uint16_t pad, reg, value; + + sval.old_channel = phy->chan; + bwn_mac_suspend(mac); + bwn_lo_save(mac, &sval); + + reg = bwn_lo_txctl_regtable(mac, &value, &pad); + BWN_RF_SETMASK(mac, 0x43, 0xfff0, rfatt->att); + BWN_RF_SETMASK(mac, reg, ~value, (rfatt->padmix ? value :0)); + + rxgain = (rfatt->att * 2) + (bbatt->att / 2); + if (rfatt->padmix) + rxgain -= pad; + if (BWN_HAS_LOOPBACK(phy)) + rxgain += pg->pg_max_lb_gain; + bwn_lo_measure_gain_values(mac, rxgain, BWN_HAS_LOOPBACK(phy)); + bwn_phy_g_set_bbatt(mac, bbatt->att); + bwn_lo_probe_sm(mac, &loctl, &rxgain); + + bwn_lo_restore(mac, &sval); + bwn_mac_enable(mac); + + cal = malloc(sizeof(*cal), M_DEVBUF, M_NOWAIT | M_ZERO); + if (!cal) { + device_printf(mac->mac_sc->sc_dev, "out of memory\n"); + return (NULL); + } + memcpy(&cal->bbatt, bbatt, sizeof(*bbatt)); + memcpy(&cal->rfatt, rfatt, sizeof(*rfatt)); + memcpy(&cal->ctl, &loctl, sizeof(loctl)); + + BWN_GETTIME(cal->calib_time); + + return (cal); +} + +static struct bwn_lo_calib * +bwn_lo_get_calib(struct bwn_mac *mac, const struct bwn_bbatt *bbatt, + const struct bwn_rfatt *rfatt) +{ + struct bwn_txpwr_loctl *lo = &mac->mac_phy.phy_g.pg_loctl; + struct bwn_lo_calib *c; + + TAILQ_FOREACH(c, &lo->calib_list, list) { + if (!BWN_BBATTCMP(&c->bbatt, bbatt)) + continue; + if (!BWN_RFATTCMP(&c->rfatt, rfatt)) + continue; + return (c); + } + + c = bwn_lo_calibset(mac, bbatt, rfatt); + if (!c) + return (NULL); + TAILQ_INSERT_TAIL(&lo->calib_list, c, list); + + return (c); +} + +static void +bwn_phy_g_dc_lookup_init(struct bwn_mac *mac, uint8_t update) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_softc *sc = mac->mac_sc; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + const struct bwn_rfatt *rfatt; + const struct bwn_bbatt *bbatt; + uint64_t pvector; + int i; + int rf_offset, bb_offset; + uint8_t changed = 0; + + KASSERT(BWN_DC_LT_SIZE == 32, ("%s:%d: fail", __func__, __LINE__)); + KASSERT(lo->rfatt.len * lo->bbatt.len <= 64, + ("%s:%d: fail", __func__, __LINE__)); + + pvector = lo->power_vector; + if (!update && !pvector) + return; + + bwn_mac_suspend(mac); + + for (i = 0; i < BWN_DC_LT_SIZE * 2; i++) { + struct bwn_lo_calib *cal; + int idx; + uint16_t val; + + if (!update && !(pvector & (((uint64_t)1ULL) << i))) + continue; + bb_offset = i / lo->rfatt.len; + rf_offset = i % lo->rfatt.len; + bbatt = &(lo->bbatt.array[bb_offset]); + rfatt = &(lo->rfatt.array[rf_offset]); + + cal = bwn_lo_calibset(mac, bbatt, rfatt); + if (!cal) { + device_printf(sc->sc_dev, "LO: Could not " + "calibrate DC table entry\n"); + continue; + } + val = (uint8_t)(cal->ctl.q); + val |= ((uint8_t)(cal->ctl.i)) << 4; + free(cal, M_DEVBUF); + + idx = i / 2; + if (i % 2) + lo->dc_lt[idx] = (lo->dc_lt[idx] & 0x00ff) + | ((val & 0x00ff) << 8); + else + lo->dc_lt[idx] = (lo->dc_lt[idx] & 0xff00) + | (val & 0x00ff); + changed = 1; + } + if (changed) { + for (i = 0; i < BWN_DC_LT_SIZE; i++) + BWN_PHY_WRITE(mac, 0x3a0 + i, lo->dc_lt[i]); + } + bwn_mac_enable(mac); +} + +static void +bwn_lo_fixup_rfatt(struct bwn_rfatt *rf) +{ + + if (!rf->padmix) + return; + if ((rf->att != 1) && (rf->att != 2) && (rf->att != 3)) + rf->att = 4; +} + +static void +bwn_lo_g_adjust(struct bwn_mac *mac) +{ + struct bwn_phy_g *pg = &mac->mac_phy.phy_g; + struct bwn_lo_calib *cal; + struct bwn_rfatt rf; + + memcpy(&rf, &pg->pg_rfatt, sizeof(rf)); + bwn_lo_fixup_rfatt(&rf); + + cal = bwn_lo_get_calib(mac, &pg->pg_bbatt, &rf); + if (!cal) + return; + bwn_lo_write(mac, &cal->ctl); +} + +static void +bwn_lo_g_init(struct bwn_mac *mac) +{ + + if (!bwn_has_hwpctl(mac)) + return; + + bwn_lo_get_powervector(mac); + bwn_phy_g_dc_lookup_init(mac, 1); +} + +static void +bwn_mac_suspend(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + int i; + uint32_t tmp; + + KASSERT(mac->mac_suspended >= 0, + ("%s:%d: fail", __func__, __LINE__)); + + if (mac->mac_suspended == 0) { + bwn_psctl(mac, BWN_PS_AWAKE); + BWN_WRITE_4(mac, BWN_MACCTL, + BWN_READ_4(mac, BWN_MACCTL) + & ~BWN_MACCTL_ON); + BWN_READ_4(mac, BWN_MACCTL); + for (i = 35; i; i--) { + tmp = BWN_READ_4(mac, BWN_INTR_REASON); + if (tmp & BWN_INTR_MAC_SUSPENDED) + goto out; + DELAY(10); + } + for (i = 40; i; i--) { + tmp = BWN_READ_4(mac, BWN_INTR_REASON); + if (tmp & BWN_INTR_MAC_SUSPENDED) + goto out; + DELAY(1000); + } + device_printf(sc->sc_dev, "MAC suspend failed\n"); + } +out: + mac->mac_suspended++; +} + +static void +bwn_mac_enable(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + uint16_t state; + + state = bwn_shm_read_2(mac, BWN_SHARED, + BWN_SHARED_UCODESTAT); + if (state != BWN_SHARED_UCODESTAT_SUSPEND && + state != BWN_SHARED_UCODESTAT_SLEEP) + device_printf(sc->sc_dev, "warn: firmware state (%d)\n", state); + + mac->mac_suspended--; + KASSERT(mac->mac_suspended >= 0, + ("%s:%d: fail", __func__, __LINE__)); + if (mac->mac_suspended == 0) { + BWN_WRITE_4(mac, BWN_MACCTL, + BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_ON); + BWN_WRITE_4(mac, BWN_INTR_REASON, BWN_INTR_MAC_SUSPENDED); + BWN_READ_4(mac, BWN_MACCTL); + BWN_READ_4(mac, BWN_INTR_REASON); + bwn_psctl(mac, 0); + } +} + +static void +bwn_psctl(struct bwn_mac *mac, uint32_t flags) +{ + int i; + uint16_t ucstat; + + KASSERT(!((flags & BWN_PS_ON) && (flags & BWN_PS_OFF)), + ("%s:%d: fail", __func__, __LINE__)); + KASSERT(!((flags & BWN_PS_AWAKE) && (flags & BWN_PS_ASLEEP)), + ("%s:%d: fail", __func__, __LINE__)); + + /* XXX forcibly awake and hwps-off */ + + BWN_WRITE_4(mac, BWN_MACCTL, + (BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_AWAKE) & + ~BWN_MACCTL_HWPS); + BWN_READ_4(mac, BWN_MACCTL); + if (mac->mac_sd->sd_id.sd_rev >= 5) { + for (i = 0; i < 100; i++) { + ucstat = bwn_shm_read_2(mac, BWN_SHARED, + BWN_SHARED_UCODESTAT); + if (ucstat != BWN_SHARED_UCODESTAT_SLEEP) + break; + DELAY(10); + } + } +} + +static int16_t +bwn_nrssi_read(struct bwn_mac *mac, uint16_t offset) +{ + + BWN_PHY_WRITE(mac, BWN_PHY_NRSSI_CTRL, offset); + return ((int16_t)BWN_PHY_READ(mac, BWN_PHY_NRSSI_DATA)); +} + +static void +bwn_nrssi_threshold(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct siba_softc *siba = mac->mac_sd->sd_bus; + int32_t a, b; + int16_t tmp16; + uint16_t tmpu16; + + KASSERT(phy->type == BWN_PHYTYPE_G, ("%s: fail", __func__)); + + if (phy->gmode && (siba->siba_sprom.bf_lo & BWN_BFL_RSSI)) { + if (!pg->pg_aci_wlan_automatic && pg->pg_aci_enable) { + a = 0x13; + b = 0x12; + } else { + a = 0xe; + b = 0x11; + } + + a = a * (pg->pg_nrssi[1] - pg->pg_nrssi[0]); + a += (pg->pg_nrssi[0] << 6); + a += (a < 32) ? 31 : 32; + a = a >> 6; + a = MIN(MAX(a, -31), 31); + + b = b * (pg->pg_nrssi[1] - pg->pg_nrssi[0]); + b += (pg->pg_nrssi[0] << 6); + if (b < 32) + b += 31; + else + b += 32; + b = b >> 6; + b = MIN(MAX(b, -31), 31); + + tmpu16 = BWN_PHY_READ(mac, 0x048a) & 0xf000; + tmpu16 |= ((uint32_t)b & 0x0000003f); + tmpu16 |= (((uint32_t)a & 0x0000003f) << 6); + BWN_PHY_WRITE(mac, 0x048a, tmpu16); + return; + } + + tmp16 = bwn_nrssi_read(mac, 0x20); + if (tmp16 >= 0x20) + tmp16 -= 0x40; + BWN_PHY_SETMASK(mac, 0x048a, 0xf000, (tmp16 < 3) ? 0x09eb : 0x0aed); +} + +static void +bwn_nrssi_slope_11g(struct bwn_mac *mac) +{ +#define SAVE_RF_MAX 3 +#define SAVE_PHY_COMM_MAX 4 +#define SAVE_PHY3_MAX 8 + static const uint16_t save_rf_regs[SAVE_RF_MAX] = + { 0x7a, 0x52, 0x43 }; + static const uint16_t save_phy_comm_regs[SAVE_PHY_COMM_MAX] = + { 0x15, 0x5a, 0x59, 0x58 }; + static const uint16_t save_phy3_regs[SAVE_PHY3_MAX] = { + 0x002e, 0x002f, 0x080f, BWN_PHY_G_LOCTL, + 0x0801, 0x0060, 0x0014, 0x0478 + }; + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + int32_t i, tmp32, phy3_idx = 0; + uint16_t delta, tmp; + uint16_t save_rf[SAVE_RF_MAX]; + uint16_t save_phy_comm[SAVE_PHY_COMM_MAX]; + uint16_t save_phy3[SAVE_PHY3_MAX]; + uint16_t ant_div, phy0, chan_ex; + int16_t nrssi0, nrssi1; + + KASSERT(phy->type == BWN_PHYTYPE_G, + ("%s:%d: fail", __func__, __LINE__)); + + if (phy->rf_rev >= 9) + return; + if (phy->rf_rev == 8) + bwn_nrssi_offset(mac); + + BWN_PHY_MASK(mac, BWN_PHY_G_CRS, 0x7fff); + BWN_PHY_MASK(mac, 0x0802, 0xfffc); + + /* + * Save RF/PHY registers for later restoration + */ + ant_div = BWN_READ_2(mac, 0x03e2); + BWN_WRITE_2(mac, 0x03e2, BWN_READ_2(mac, 0x03e2) | 0x8000); + for (i = 0; i < SAVE_RF_MAX; ++i) + save_rf[i] = BWN_RF_READ(mac, save_rf_regs[i]); + for (i = 0; i < SAVE_PHY_COMM_MAX; ++i) + save_phy_comm[i] = BWN_PHY_READ(mac, save_phy_comm_regs[i]); + + phy0 = BWN_READ_2(mac, BWN_PHY0); + chan_ex = BWN_READ_2(mac, BWN_CHANNEL_EXT); + if (phy->rev >= 3) { + for (i = 0; i < SAVE_PHY3_MAX; ++i) + save_phy3[i] = BWN_PHY_READ(mac, save_phy3_regs[i]); + BWN_PHY_WRITE(mac, 0x002e, 0); + BWN_PHY_WRITE(mac, BWN_PHY_G_LOCTL, 0); + switch (phy->rev) { + case 4: + case 6: + case 7: + BWN_PHY_SET(mac, 0x0478, 0x0100); + BWN_PHY_SET(mac, 0x0801, 0x0040); + break; + case 3: + case 5: + BWN_PHY_MASK(mac, 0x0801, 0xffbf); + break; + } + BWN_PHY_SET(mac, 0x0060, 0x0040); + BWN_PHY_SET(mac, 0x0014, 0x0200); + } + /* + * Calculate nrssi0 + */ + BWN_RF_SET(mac, 0x007a, 0x0070); + bwn_set_all_gains(mac, 0, 8, 0); + BWN_RF_MASK(mac, 0x007a, 0x00f7); + if (phy->rev >= 2) { + BWN_PHY_SETMASK(mac, 0x0811, 0xffcf, 0x0030); + BWN_PHY_SETMASK(mac, 0x0812, 0xffcf, 0x0010); + } + BWN_RF_SET(mac, 0x007a, 0x0080); + DELAY(20); + + nrssi0 = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f); + if (nrssi0 >= 0x0020) + nrssi0 -= 0x0040; + + /* + * Calculate nrssi1 + */ + BWN_RF_MASK(mac, 0x007a, 0x007f); + if (phy->rev >= 2) + BWN_PHY_SETMASK(mac, 0x0003, 0xff9f, 0x0040); + + BWN_WRITE_2(mac, BWN_CHANNEL_EXT, + BWN_READ_2(mac, BWN_CHANNEL_EXT) | 0x2000); + BWN_RF_SET(mac, 0x007a, 0x000f); + BWN_PHY_WRITE(mac, 0x0015, 0xf330); + if (phy->rev >= 2) { + BWN_PHY_SETMASK(mac, 0x0812, 0xffcf, 0x0020); + BWN_PHY_SETMASK(mac, 0x0811, 0xffcf, 0x0020); + } + + bwn_set_all_gains(mac, 3, 0, 1); + if (phy->rf_rev == 8) { + BWN_RF_WRITE(mac, 0x0043, 0x001f); + } else { + tmp = BWN_RF_READ(mac, 0x0052) & 0xff0f; + BWN_RF_WRITE(mac, 0x0052, tmp | 0x0060); + tmp = BWN_RF_READ(mac, 0x0043) & 0xfff0; + BWN_RF_WRITE(mac, 0x0043, tmp | 0x0009); + } + BWN_PHY_WRITE(mac, 0x005a, 0x0480); + BWN_PHY_WRITE(mac, 0x0059, 0x0810); + BWN_PHY_WRITE(mac, 0x0058, 0x000d); + DELAY(20); + nrssi1 = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f); + + /* + * Install calculated narrow RSSI values + */ + if (nrssi1 >= 0x0020) + nrssi1 -= 0x0040; + if (nrssi0 == nrssi1) + pg->pg_nrssi_slope = 0x00010000; + else + pg->pg_nrssi_slope = 0x00400000 / (nrssi0 - nrssi1); + if (nrssi0 >= -4) { + pg->pg_nrssi[0] = nrssi1; + pg->pg_nrssi[1] = nrssi0; + } + + /* + * Restore saved RF/PHY registers + */ + if (phy->rev >= 3) { + for (phy3_idx = 0; phy3_idx < 4; ++phy3_idx) { + BWN_PHY_WRITE(mac, save_phy3_regs[phy3_idx], + save_phy3[phy3_idx]); + } + } + if (phy->rev >= 2) { + BWN_PHY_MASK(mac, 0x0812, 0xffcf); + BWN_PHY_MASK(mac, 0x0811, 0xffcf); + } + + for (i = 0; i < SAVE_RF_MAX; ++i) + BWN_RF_WRITE(mac, save_rf_regs[i], save_rf[i]); + + BWN_WRITE_2(mac, 0x03e2, ant_div); + BWN_WRITE_2(mac, 0x03e6, phy0); + BWN_WRITE_2(mac, BWN_CHANNEL_EXT, chan_ex); + + for (i = 0; i < SAVE_PHY_COMM_MAX; ++i) + BWN_PHY_WRITE(mac, save_phy_comm_regs[i], save_phy_comm[i]); + + bwn_spu_workaround(mac, phy->chan); + BWN_PHY_SET(mac, 0x0802, (0x0001 | 0x0002)); + bwn_set_original_gains(mac); + BWN_PHY_SET(mac, BWN_PHY_G_CRS, 0x8000); + if (phy->rev >= 3) { + for (; phy3_idx < SAVE_PHY3_MAX; ++phy3_idx) { + BWN_PHY_WRITE(mac, save_phy3_regs[phy3_idx], + save_phy3[phy3_idx]); + } + } + + delta = 0x1f - pg->pg_nrssi[0]; + for (i = 0; i < 64; i++) { + tmp32 = (((i - delta) * pg->pg_nrssi_slope) / 0x10000) + 0x3a; + tmp32 = MIN(MAX(tmp32, 0), 0x3f); + pg->pg_nrssi_lt[i] = tmp32; + } + + bwn_nrssi_threshold(mac); +#undef SAVE_RF_MAX +#undef SAVE_PHY_COMM_MAX +#undef SAVE_PHY3_MAX +} + +static void +bwn_nrssi_offset(struct bwn_mac *mac) +{ +#define SAVE_RF_MAX 2 +#define SAVE_PHY_COMM_MAX 10 +#define SAVE_PHY6_MAX 8 + static const uint16_t save_rf_regs[SAVE_RF_MAX] = + { 0x7a, 0x43 }; + static const uint16_t save_phy_comm_regs[SAVE_PHY_COMM_MAX] = { + 0x0001, 0x0811, 0x0812, 0x0814, + 0x0815, 0x005a, 0x0059, 0x0058, + 0x000a, 0x0003 + }; + static const uint16_t save_phy6_regs[SAVE_PHY6_MAX] = { + 0x002e, 0x002f, 0x080f, 0x0810, + 0x0801, 0x0060, 0x0014, 0x0478 + }; + struct bwn_phy *phy = &mac->mac_phy; + int i, phy6_idx = 0; + uint16_t save_rf[SAVE_RF_MAX]; + uint16_t save_phy_comm[SAVE_PHY_COMM_MAX]; + uint16_t save_phy6[SAVE_PHY6_MAX]; + int16_t nrssi; + uint16_t saved = 0xffff; + + for (i = 0; i < SAVE_PHY_COMM_MAX; ++i) + save_phy_comm[i] = BWN_PHY_READ(mac, save_phy_comm_regs[i]); + for (i = 0; i < SAVE_RF_MAX; ++i) + save_rf[i] = BWN_RF_READ(mac, save_rf_regs[i]); + + BWN_PHY_MASK(mac, 0x0429, 0x7fff); + BWN_PHY_SETMASK(mac, 0x0001, 0x3fff, 0x4000); + BWN_PHY_SET(mac, 0x0811, 0x000c); + BWN_PHY_SETMASK(mac, 0x0812, 0xfff3, 0x0004); + BWN_PHY_MASK(mac, 0x0802, ~(0x1 | 0x2)); + if (phy->rev >= 6) { + for (i = 0; i < SAVE_PHY6_MAX; ++i) + save_phy6[i] = BWN_PHY_READ(mac, save_phy6_regs[i]); + + BWN_PHY_WRITE(mac, 0x002e, 0); + BWN_PHY_WRITE(mac, 0x002f, 0); + BWN_PHY_WRITE(mac, 0x080f, 0); + BWN_PHY_WRITE(mac, 0x0810, 0); + BWN_PHY_SET(mac, 0x0478, 0x0100); + BWN_PHY_SET(mac, 0x0801, 0x0040); + BWN_PHY_SET(mac, 0x0060, 0x0040); + BWN_PHY_SET(mac, 0x0014, 0x0200); + } + BWN_RF_SET(mac, 0x007a, 0x0070); + BWN_RF_SET(mac, 0x007a, 0x0080); + DELAY(30); + + nrssi = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f); + if (nrssi >= 0x20) + nrssi -= 0x40; + if (nrssi == 31) { + for (i = 7; i >= 4; i--) { + BWN_RF_WRITE(mac, 0x007b, i); + DELAY(20); + nrssi = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & + 0x003f); + if (nrssi >= 0x20) + nrssi -= 0x40; + if (nrssi < 31 && saved == 0xffff) + saved = i; + } + if (saved == 0xffff) + saved = 4; + } else { + BWN_RF_MASK(mac, 0x007a, 0x007f); + if (phy->rev != 1) { + BWN_PHY_SET(mac, 0x0814, 0x0001); + BWN_PHY_MASK(mac, 0x0815, 0xfffe); + } + BWN_PHY_SET(mac, 0x0811, 0x000c); + BWN_PHY_SET(mac, 0x0812, 0x000c); + BWN_PHY_SET(mac, 0x0811, 0x0030); + BWN_PHY_SET(mac, 0x0812, 0x0030); + BWN_PHY_WRITE(mac, 0x005a, 0x0480); + BWN_PHY_WRITE(mac, 0x0059, 0x0810); + BWN_PHY_WRITE(mac, 0x0058, 0x000d); + if (phy->rev == 0) + BWN_PHY_WRITE(mac, 0x0003, 0x0122); + else + BWN_PHY_SET(mac, 0x000a, 0x2000); + if (phy->rev != 1) { + BWN_PHY_SET(mac, 0x0814, 0x0004); + BWN_PHY_MASK(mac, 0x0815, 0xfffb); + } + BWN_PHY_SETMASK(mac, 0x0003, 0xff9f, 0x0040); + BWN_RF_SET(mac, 0x007a, 0x000f); + bwn_set_all_gains(mac, 3, 0, 1); + BWN_RF_SETMASK(mac, 0x0043, 0x00f0, 0x000f); + DELAY(30); + nrssi = (int16_t) ((BWN_PHY_READ(mac, 0x047f) >> 8) & 0x003f); + if (nrssi >= 0x20) + nrssi -= 0x40; + if (nrssi == -32) { + for (i = 0; i < 4; i++) { + BWN_RF_WRITE(mac, 0x007b, i); + DELAY(20); + nrssi = (int16_t)((BWN_PHY_READ(mac, + 0x047f) >> 8) & 0x003f); + if (nrssi >= 0x20) + nrssi -= 0x40; + if (nrssi > -31 && saved == 0xffff) + saved = i; + } + if (saved == 0xffff) + saved = 3; + } else + saved = 0; + } + BWN_RF_WRITE(mac, 0x007b, saved); + + /* + * Restore saved RF/PHY registers + */ + if (phy->rev >= 6) { + for (phy6_idx = 0; phy6_idx < 4; ++phy6_idx) { + BWN_PHY_WRITE(mac, save_phy6_regs[phy6_idx], + save_phy6[phy6_idx]); + } + } + if (phy->rev != 1) { + for (i = 3; i < 5; i++) + BWN_PHY_WRITE(mac, save_phy_comm_regs[i], + save_phy_comm[i]); + } + for (i = 5; i < SAVE_PHY_COMM_MAX; i++) + BWN_PHY_WRITE(mac, save_phy_comm_regs[i], save_phy_comm[i]); + + for (i = SAVE_RF_MAX - 1; i >= 0; --i) + BWN_RF_WRITE(mac, save_rf_regs[i], save_rf[i]); + + BWN_PHY_WRITE(mac, 0x0802, BWN_PHY_READ(mac, 0x0802) | 0x1 | 0x2); + BWN_PHY_SET(mac, 0x0429, 0x8000); + bwn_set_original_gains(mac); + if (phy->rev >= 6) { + for (; phy6_idx < SAVE_PHY6_MAX; ++phy6_idx) { + BWN_PHY_WRITE(mac, save_phy6_regs[phy6_idx], + save_phy6[phy6_idx]); + } + } + + BWN_PHY_WRITE(mac, save_phy_comm_regs[0], save_phy_comm[0]); + BWN_PHY_WRITE(mac, save_phy_comm_regs[2], save_phy_comm[2]); + BWN_PHY_WRITE(mac, save_phy_comm_regs[1], save_phy_comm[1]); +} + +static void +bwn_set_all_gains(struct bwn_mac *mac, int16_t first, int16_t second, + int16_t third) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint16_t i; + uint16_t start = 0x08, end = 0x18; + uint16_t tmp; + uint16_t table; + + if (phy->rev <= 1) { + start = 0x10; + end = 0x20; + } + + table = BWN_OFDMTAB_GAINX; + if (phy->rev <= 1) + table = BWN_OFDMTAB_GAINX_R1; + for (i = 0; i < 4; i++) + bwn_ofdmtab_write_2(mac, table, i, first); + + for (i = start; i < end; i++) + bwn_ofdmtab_write_2(mac, table, i, second); + + if (third != -1) { + tmp = ((uint16_t) third << 14) | ((uint16_t) third << 6); + BWN_PHY_SETMASK(mac, 0x04a0, 0xbfbf, tmp); + BWN_PHY_SETMASK(mac, 0x04a1, 0xbfbf, tmp); + BWN_PHY_SETMASK(mac, 0x04a2, 0xbfbf, tmp); + } + bwn_dummy_transmission(mac, 0, 1); +} + +static void +bwn_set_original_gains(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + uint16_t i, tmp; + uint16_t table; + uint16_t start = 0x0008, end = 0x0018; + + if (phy->rev <= 1) { + start = 0x0010; + end = 0x0020; + } + + table = BWN_OFDMTAB_GAINX; + if (phy->rev <= 1) + table = BWN_OFDMTAB_GAINX_R1; + for (i = 0; i < 4; i++) { + tmp = (i & 0xfffc); + tmp |= (i & 0x0001) << 1; + tmp |= (i & 0x0002) >> 1; + + bwn_ofdmtab_write_2(mac, table, i, tmp); + } + + for (i = start; i < end; i++) + bwn_ofdmtab_write_2(mac, table, i, i - start); + + BWN_PHY_SETMASK(mac, 0x04a0, 0xbfbf, 0x4040); + BWN_PHY_SETMASK(mac, 0x04a1, 0xbfbf, 0x4040); + BWN_PHY_SETMASK(mac, 0x04a2, 0xbfbf, 0x4000); + bwn_dummy_transmission(mac, 0, 1); +} + +static void +bwn_phy_hwpctl_init(struct bwn_mac *mac) +{ + struct siba_softc *bus = mac->mac_sd->sd_bus; + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_rfatt old_rfatt, rfatt; + struct bwn_bbatt old_bbatt, bbatt; + uint8_t old_txctl = 0; + + KASSERT(phy->type == BWN_PHYTYPE_G, + ("%s:%d: fail", __func__, __LINE__)); + + if ((bus->siba_board_vendor == SIBA_BOARDVENDOR_BCM) && + (bus->siba_board_type == SIBA_BOARD_BU4306)) + return; + + BWN_PHY_WRITE(mac, 0x0028, 0x8018); + + BWN_WRITE_2(mac, BWN_PHY0, BWN_READ_2(mac, BWN_PHY0) & 0xffdf); + + if (!phy->gmode) + return; + bwn_hwpctl_early_init(mac); + if (pg->pg_curtssi == 0) { + if (phy->rf_ver == 0x2050 && phy->analog == 0) { + BWN_RF_SETMASK(mac, 0x0076, 0x00f7, 0x0084); + } else { + memcpy(&old_rfatt, &pg->pg_rfatt, sizeof(old_rfatt)); + memcpy(&old_bbatt, &pg->pg_bbatt, sizeof(old_bbatt)); + old_txctl = pg->pg_txctl; + + bbatt.att = 11; + if (phy->rf_rev == 8) { + rfatt.att = 15; + rfatt.padmix = 1; + } else { + rfatt.att = 9; + rfatt.padmix = 0; + } + bwn_phy_g_set_txpwr_sub(mac, &bbatt, &rfatt, 0); + } + bwn_dummy_transmission(mac, 0, 1); + pg->pg_curtssi = BWN_PHY_READ(mac, BWN_PHY_TSSI); + if (phy->rf_ver == 0x2050 && phy->analog == 0) + BWN_RF_MASK(mac, 0x0076, 0xff7b); + else + bwn_phy_g_set_txpwr_sub(mac, &old_bbatt, + &old_rfatt, old_txctl); + } + bwn_hwpctl_init_gphy(mac); + + /* clear TSSI */ + bwn_shm_write_2(mac, BWN_SHARED, 0x0058, 0x7f7f); + bwn_shm_write_2(mac, BWN_SHARED, 0x005a, 0x7f7f); + bwn_shm_write_2(mac, BWN_SHARED, 0x0070, 0x7f7f); + bwn_shm_write_2(mac, BWN_SHARED, 0x0072, 0x7f7f); +} + +static void +bwn_hwpctl_early_init(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + + if (!bwn_has_hwpctl(mac)) { + BWN_PHY_WRITE(mac, 0x047a, 0xc111); + return; + } + + BWN_PHY_MASK(mac, 0x0036, 0xfeff); + BWN_PHY_WRITE(mac, 0x002f, 0x0202); + BWN_PHY_SET(mac, 0x047c, 0x0002); + BWN_PHY_SET(mac, 0x047a, 0xf000); + if (phy->rf_ver == 0x2050 && phy->rf_rev == 8) { + BWN_PHY_SETMASK(mac, 0x047a, 0xff0f, 0x0010); + BWN_PHY_SET(mac, 0x005d, 0x8000); + BWN_PHY_SETMASK(mac, 0x004e, 0xffc0, 0x0010); + BWN_PHY_WRITE(mac, 0x002e, 0xc07f); + BWN_PHY_SET(mac, 0x0036, 0x0400); + } else { + BWN_PHY_SET(mac, 0x0036, 0x0200); + BWN_PHY_SET(mac, 0x0036, 0x0400); + BWN_PHY_MASK(mac, 0x005d, 0x7fff); + BWN_PHY_MASK(mac, 0x004f, 0xfffe); + BWN_PHY_SETMASK(mac, 0x004e, 0xffc0, 0x0010); + BWN_PHY_WRITE(mac, 0x002e, 0xc07f); + BWN_PHY_SETMASK(mac, 0x047a, 0xff0f, 0x0010); + } +} + +static void +bwn_hwpctl_init_gphy(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + int i; + uint16_t nr_written = 0, tmp, value; + uint8_t rf, bb; + + if (!bwn_has_hwpctl(mac)) { + bwn_hf_write(mac, bwn_hf_read(mac) & ~BWN_HF_HW_POWERCTL); + return; + } + + BWN_PHY_SETMASK(mac, 0x0036, 0xffc0, + (pg->pg_idletssi - pg->pg_curtssi)); + BWN_PHY_SETMASK(mac, 0x0478, 0xff00, + (pg->pg_idletssi - pg->pg_curtssi)); + + for (i = 0; i < 32; i++) + bwn_ofdmtab_write_2(mac, 0x3c20, i, pg->pg_tssi2dbm[i]); + for (i = 32; i < 64; i++) + bwn_ofdmtab_write_2(mac, 0x3c00, i - 32, pg->pg_tssi2dbm[i]); + for (i = 0; i < 64; i += 2) { + value = (uint16_t) pg->pg_tssi2dbm[i]; + value |= ((uint16_t) pg->pg_tssi2dbm[i + 1]) << 8; + BWN_PHY_WRITE(mac, 0x380 + (i / 2), value); + } + + for (rf = 0; rf < lo->rfatt.len; rf++) { + for (bb = 0; bb < lo->bbatt.len; bb++) { + if (nr_written >= 0x40) + return; + tmp = lo->bbatt.array[bb].att; + tmp <<= 8; + if (phy->rf_rev == 8) + tmp |= 0x50; + else + tmp |= 0x40; + tmp |= lo->rfatt.array[rf].att; + BWN_PHY_WRITE(mac, 0x3c0 + nr_written, tmp); + nr_written++; + } + } + + BWN_PHY_MASK(mac, 0x0060, 0xffbf); + BWN_PHY_WRITE(mac, 0x0014, 0x0000); + + KASSERT(phy->rev >= 6, ("%s:%d: fail", __func__, __LINE__)); + BWN_PHY_SET(mac, 0x0478, 0x0800); + BWN_PHY_MASK(mac, 0x0478, 0xfeff); + BWN_PHY_MASK(mac, 0x0801, 0xffbf); + + bwn_phy_g_dc_lookup_init(mac, 1); + bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_HW_POWERCTL); +} + +static void +bwn_phy_g_switch_chan(struct bwn_mac *mac, int channel, uint8_t spu) +{ + struct siba_softc *siba = mac->mac_sd->sd_bus; + + if (spu != 0) + bwn_spu_workaround(mac, channel); + + BWN_WRITE_2(mac, BWN_CHANNEL, bwn_phy_g_chan2freq(channel)); + + if (channel == 14) { + if (siba->siba_sprom.ccode == SIBA_CCODE_JAPAN) + bwn_hf_write(mac, + bwn_hf_read(mac) & ~BWN_HF_JAPAN_CHAN14_OFF); + else + bwn_hf_write(mac, + bwn_hf_read(mac) | BWN_HF_JAPAN_CHAN14_OFF); + BWN_WRITE_2(mac, BWN_CHANNEL_EXT, + BWN_READ_2(mac, BWN_CHANNEL_EXT) | (1 << 11)); + return; + } + + BWN_WRITE_2(mac, BWN_CHANNEL_EXT, + BWN_READ_2(mac, BWN_CHANNEL_EXT) & 0xf7bf); +} + +static uint16_t +bwn_phy_g_chan2freq(uint8_t channel) +{ + static const uint8_t bwn_phy_g_rf_channels[] = BWN_PHY_G_RF_CHANNELS; + + KASSERT(channel >= 1 && channel <= 14, + ("%s:%d: fail", __func__, __LINE__)); + + return (bwn_phy_g_rf_channels[channel - 1]); +} + +static void +bwn_phy_g_set_txpwr_sub(struct bwn_mac *mac, const struct bwn_bbatt *bbatt, + const struct bwn_rfatt *rfatt, uint8_t txctl) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct bwn_txpwr_loctl *lo = &pg->pg_loctl; + uint16_t bb, rf; + uint16_t tx_bias, tx_magn; + + bb = bbatt->att; + rf = rfatt->att; + tx_bias = lo->tx_bias; + tx_magn = lo->tx_magn; + if (tx_bias == 0xff) + tx_bias = 0; + + pg->pg_txctl = txctl; + memmove(&pg->pg_rfatt, rfatt, sizeof(*rfatt)); + pg->pg_rfatt.padmix = (txctl & BWN_TXCTL_TXMIX) ? 1 : 0; + memmove(&pg->pg_bbatt, bbatt, sizeof(*bbatt)); + bwn_phy_g_set_bbatt(mac, bb); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_RADIO_ATT, rf); + if (phy->rf_ver == 0x2050 && phy->rf_rev == 8) + BWN_RF_WRITE(mac, 0x43, (rf & 0x000f) | (txctl & 0x0070)); + else { + BWN_RF_SETMASK(mac, 0x43, 0xfff0, (rf & 0x000f)); + BWN_RF_SETMASK(mac, 0x52, ~0x0070, (txctl & 0x0070)); + } + if (BWN_HAS_TXMAG(phy)) + BWN_RF_WRITE(mac, 0x52, tx_magn | tx_bias); + else + BWN_RF_SETMASK(mac, 0x52, 0xfff0, (tx_bias & 0x000f)); + bwn_lo_g_adjust(mac); +} + +static void +bwn_phy_g_set_bbatt(struct bwn_mac *mac, + uint16_t bbatt) +{ + struct bwn_phy *phy = &mac->mac_phy; + + if (phy->analog == 0) { + BWN_WRITE_2(mac, BWN_PHY0, + (BWN_READ_2(mac, BWN_PHY0) & 0xfff0) | bbatt); + return; + } + if (phy->analog > 1) { + BWN_PHY_SETMASK(mac, BWN_PHY_DACCTL, 0xffc3, bbatt << 2); + return; + } + BWN_PHY_SETMASK(mac, BWN_PHY_DACCTL, 0xff87, bbatt << 3); +} + +static uint16_t +bwn_rf_2050_rfoverval(struct bwn_mac *mac, uint16_t reg, uint32_t lpd) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_g *pg = &phy->phy_g; + struct siba_sprom *sprom = &(mac->mac_sd->sd_bus->siba_sprom); + int max_lb_gain; + uint16_t extlna; + uint16_t i; + + if (phy->gmode == 0) + return (0); + + if (BWN_HAS_LOOPBACK(phy)) { + max_lb_gain = pg->pg_max_lb_gain; + max_lb_gain += (phy->rf_rev == 8) ? 0x3e : 0x26; + if (max_lb_gain >= 0x46) { + extlna = 0x3000; + max_lb_gain -= 0x46; + } else if (max_lb_gain >= 0x3a) { + extlna = 0x1000; + max_lb_gain -= 0x3a; + } else if (max_lb_gain >= 0x2e) { + extlna = 0x2000; + max_lb_gain -= 0x2e; + } else { + extlna = 0; + max_lb_gain -= 0x10; + } + + for (i = 0; i < 16; i++) { + max_lb_gain -= (i * 6); + if (max_lb_gain < 6) + break; + } + + if ((phy->rev < 7) || !(sprom->bf_lo & BWN_BFL_EXTLNA)) { + if (reg == BWN_PHY_RFOVER) { + return (0x1b3); + } else if (reg == BWN_PHY_RFOVERVAL) { + extlna |= (i << 8); + switch (lpd) { + case BWN_LPD(0, 1, 1): + return (0x0f92); + case BWN_LPD(0, 0, 1): + case BWN_LPD(1, 0, 1): + return (0x0092 | extlna); + case BWN_LPD(1, 0, 0): + return (0x0093 | extlna); + } + KASSERT(0 == 1, + ("%s:%d: fail", __func__, __LINE__)); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } else { + if (reg == BWN_PHY_RFOVER) + return (0x9b3); + if (reg == BWN_PHY_RFOVERVAL) { + if (extlna) + extlna |= 0x8000; + extlna |= (i << 8); + switch (lpd) { + case BWN_LPD(0, 1, 1): + return (0x8f92); + case BWN_LPD(0, 0, 1): + return (0x8092 | extlna); + case BWN_LPD(1, 0, 1): + return (0x2092 | extlna); + case BWN_LPD(1, 0, 0): + return (0x2093 | extlna); + } + KASSERT(0 == 1, + ("%s:%d: fail", __func__, __LINE__)); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + return (0); + } + + if ((phy->rev < 7) || + !(sprom->bf_lo & BWN_BFL_EXTLNA)) { + if (reg == BWN_PHY_RFOVER) { + return (0x1b3); + } else if (reg == BWN_PHY_RFOVERVAL) { + switch (lpd) { + case BWN_LPD(0, 1, 1): + return (0x0fb2); + case BWN_LPD(0, 0, 1): + return (0x00b2); + case BWN_LPD(1, 0, 1): + return (0x30b2); + case BWN_LPD(1, 0, 0): + return (0x30b3); + } + KASSERT(0 == 1, + ("%s:%d: fail", __func__, __LINE__)); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } else { + if (reg == BWN_PHY_RFOVER) { + return (0x9b3); + } else if (reg == BWN_PHY_RFOVERVAL) { + switch (lpd) { + case BWN_LPD(0, 1, 1): + return (0x8fb2); + case BWN_LPD(0, 0, 1): + return (0x80b2); + case BWN_LPD(1, 0, 1): + return (0x20b2); + case BWN_LPD(1, 0, 0): + return (0x20b3); + } + KASSERT(0 == 1, + ("%s:%d: fail", __func__, __LINE__)); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + return (0); +} + +static void +bwn_spu_workaround(struct bwn_mac *mac, uint8_t channel) +{ + + if (mac->mac_phy.rf_ver != 0x2050 || mac->mac_phy.rf_rev >= 6) + return; + BWN_WRITE_2(mac, BWN_CHANNEL, (channel <= 10) ? + bwn_phy_g_chan2freq(channel + 4) : bwn_phy_g_chan2freq(1)); + DELAY(1000); + BWN_WRITE_2(mac, BWN_CHANNEL, bwn_phy_g_chan2freq(channel)); +} + +static int +bwn_fw_gets(struct bwn_mac *mac, enum bwn_fwtype type) +{ + struct bwn_softc *sc = mac->mac_sc; + struct bwn_fw *fw = &mac->mac_fw; + const uint8_t rev = mac->mac_sd->sd_id.sd_rev; + const char *filename; + uint32_t high; + int error; + + /* microcode */ + if (rev >= 5 && rev <= 10) + filename = "ucode5"; + else if (rev >= 11 && rev <= 12) + filename = "ucode11"; + else if (rev == 13) + filename = "ucode13"; + else if (rev == 14) + filename = "ucode14"; + else if (rev >= 15) + filename = "ucode15"; + else { + device_printf(sc->sc_dev, "no ucode for rev %d\n", rev); + bwn_release_firmware(mac); + return (EOPNOTSUPP); + } + error = bwn_fw_get(mac, type, filename, &fw->ucode); + if (error) { + bwn_release_firmware(mac); + return (error); + } + + /* PCM */ + KASSERT(fw->no_pcmfile == 0, ("%s:%d fail", __func__, __LINE__)); + if (rev >= 5 && rev <= 10) { + error = bwn_fw_get(mac, type, "pcm5", &fw->pcm); + if (error == ENOENT) + fw->no_pcmfile = 1; + else if (error) { + bwn_release_firmware(mac); + return (error); + } + } else if (rev < 11) { + device_printf(sc->sc_dev, "no PCM for rev %d\n", rev); + return (EOPNOTSUPP); + } + + /* initvals */ + high = siba_read_4(mac->mac_sd, SIBA_TGSHIGH); + switch (mac->mac_phy.type) { + case BWN_PHYTYPE_A: + if (rev < 5 || rev > 10) + goto fail1; + if (high & BWN_TGSHIGH_HAVE_2GHZ) + filename = "a0g1initvals5"; + else + filename = "a0g0initvals5"; + break; + case BWN_PHYTYPE_G: + if (rev >= 5 && rev <= 10) + filename = "b0g0initvals5"; + else if (rev >= 13) + filename = "b0g0initvals13"; + else + goto fail1; + break; + case BWN_PHYTYPE_LP: + if (rev == 13) + filename = "lp0initvals13"; + else if (rev == 14) + filename = "lp0initvals14"; + else if (rev >= 15) + filename = "lp0initvals15"; + else + goto fail1; + break; + case BWN_PHYTYPE_N: + if (rev >= 11 && rev <= 12) + filename = "n0initvals11"; + else + goto fail1; + break; + default: + goto fail1; + } + error = bwn_fw_get(mac, type, filename, &fw->initvals); + if (error) { + bwn_release_firmware(mac); + return (error); + } + + /* bandswitch initvals */ + switch (mac->mac_phy.type) { + case BWN_PHYTYPE_A: + if (rev >= 5 && rev <= 10) { + if (high & BWN_TGSHIGH_HAVE_2GHZ) + filename = "a0g1bsinitvals5"; + else + filename = "a0g0bsinitvals5"; + } else if (rev >= 11) + filename = NULL; + else + goto fail1; + break; + case BWN_PHYTYPE_G: + if (rev >= 5 && rev <= 10) + filename = "b0g0bsinitvals5"; + else if (rev >= 11) + filename = NULL; + else + goto fail1; + break; + case BWN_PHYTYPE_LP: + if (rev == 13) + filename = "lp0bsinitvals13"; + else if (rev == 14) + filename = "lp0bsinitvals14"; + else if (rev >= 15) + filename = "lp0bsinitvals15"; + else + goto fail1; + break; + case BWN_PHYTYPE_N: + if (rev >= 11 && rev <= 12) + filename = "n0bsinitvals11"; + else + goto fail1; + break; + default: + goto fail1; + } + error = bwn_fw_get(mac, type, filename, &fw->initvals_band); + if (error) { + bwn_release_firmware(mac); + return (error); + } + return (0); +fail1: + device_printf(sc->sc_dev, "no INITVALS for rev %d\n", rev); + bwn_release_firmware(mac); + return (EOPNOTSUPP); +} + +static int +bwn_fw_get(struct bwn_mac *mac, enum bwn_fwtype type, + const char *name, struct bwn_fwfile *bfw) +{ + const struct bwn_fwhdr *hdr; + struct bwn_softc *sc = mac->mac_sc; + const struct firmware *fw; + char namebuf[64]; + + if (name == NULL) { + bwn_do_release_fw(bfw); + return (0); + } + if (bfw->filename != NULL) { + if (bfw->type == type && (strcmp(bfw->filename, name) == 0)) + return (0); + bwn_do_release_fw(bfw); + } + + snprintf(namebuf, sizeof(namebuf), "bwn%s_v4_%s%s", + (type == BWN_FWTYPE_OPENSOURCE) ? "-open" : "", + (mac->mac_phy.type == BWN_PHYTYPE_LP) ? "lp_" : "", name); + /* XXX Sleeping on "fwload" with the non-sleepable locks held */ + fw = firmware_get(namebuf); + if (fw == NULL) { + device_printf(sc->sc_dev, "the fw file(%s) not found\n", + namebuf); + return (ENOENT); + } + if (fw->datasize < sizeof(struct bwn_fwhdr)) + goto fail; + hdr = (const struct bwn_fwhdr *)(fw->data); + switch (hdr->type) { + case BWN_FWTYPE_UCODE: + case BWN_FWTYPE_PCM: + if (be32toh(hdr->size) != + (fw->datasize - sizeof(struct bwn_fwhdr))) + goto fail; + /* FALLTHROUGH */ + case BWN_FWTYPE_IV: + if (hdr->ver != 1) + goto fail; + break; + default: + goto fail; + } + bfw->filename = name; + bfw->fw = fw; + bfw->type = type; + return (0); +fail: + device_printf(sc->sc_dev, "the fw file(%s) format error\n", namebuf); + if (fw != NULL) + firmware_put(fw, FIRMWARE_UNLOAD); + return (EPROTO); +} + +static void +bwn_release_firmware(struct bwn_mac *mac) +{ + + bwn_do_release_fw(&mac->mac_fw.ucode); + bwn_do_release_fw(&mac->mac_fw.pcm); + bwn_do_release_fw(&mac->mac_fw.initvals); + bwn_do_release_fw(&mac->mac_fw.initvals_band); +} + +static void +bwn_do_release_fw(struct bwn_fwfile *bfw) +{ + + if (bfw->fw != NULL) + firmware_put(bfw->fw, FIRMWARE_UNLOAD); + bfw->fw = NULL; + bfw->filename = NULL; +} + +static int +bwn_fw_loaducode(struct bwn_mac *mac) +{ +#define GETFWOFFSET(fwp, offset) \ + ((const uint32_t *)((const char *)fwp.fw->data + offset)) +#define GETFWSIZE(fwp, offset) \ + ((fwp.fw->datasize - offset) / sizeof(uint32_t)) + struct bwn_softc *sc = mac->mac_sc; + const uint32_t *data; + unsigned int i; + uint32_t ctl; + uint16_t date, fwcaps, time; + int error = 0; + + ctl = BWN_READ_4(mac, BWN_MACCTL); + ctl |= BWN_MACCTL_MCODE_JMP0; + KASSERT(!(ctl & BWN_MACCTL_MCODE_RUN), ("%s:%d: fail", __func__, + __LINE__)); + BWN_WRITE_4(mac, BWN_MACCTL, ctl); + for (i = 0; i < 64; i++) + bwn_shm_write_2(mac, BWN_SCRATCH, i, 0); + for (i = 0; i < 4096; i += 2) + bwn_shm_write_2(mac, BWN_SHARED, i, 0); + + data = GETFWOFFSET(mac->mac_fw.ucode, sizeof(struct bwn_fwhdr)); + bwn_shm_ctlword(mac, BWN_UCODE | BWN_SHARED_AUTOINC, 0x0000); + for (i = 0; i < GETFWSIZE(mac->mac_fw.ucode, sizeof(struct bwn_fwhdr)); + i++) { + BWN_WRITE_4(mac, BWN_SHM_DATA, be32toh(data[i])); + DELAY(10); + } + + if (mac->mac_fw.pcm.fw) { + data = GETFWOFFSET(mac->mac_fw.pcm, sizeof(struct bwn_fwhdr)); + bwn_shm_ctlword(mac, BWN_HW, 0x01ea); + BWN_WRITE_4(mac, BWN_SHM_DATA, 0x00004000); + bwn_shm_ctlword(mac, BWN_HW, 0x01eb); + for (i = 0; i < GETFWSIZE(mac->mac_fw.pcm, + sizeof(struct bwn_fwhdr)); i++) { + BWN_WRITE_4(mac, BWN_SHM_DATA, be32toh(data[i])); + DELAY(10); + } + } + + BWN_WRITE_4(mac, BWN_INTR_REASON, BWN_INTR_ALL); + BWN_WRITE_4(mac, BWN_MACCTL, + (BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_MCODE_JMP0) | + BWN_MACCTL_MCODE_RUN); + + for (i = 0; i < 21; i++) { + if (BWN_READ_4(mac, BWN_INTR_REASON) == BWN_INTR_MAC_SUSPENDED) + break; + if (i >= 20) { + device_printf(sc->sc_dev, "ucode timeout\n"); + error = ENXIO; + goto error; + } + DELAY(50000); + } + BWN_READ_4(mac, BWN_INTR_REASON); + + mac->mac_fw.rev = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_UCODE_REV); + if (mac->mac_fw.rev <= 0x128) { + device_printf(sc->sc_dev, "the firmware is too old\n"); + error = EOPNOTSUPP; + goto error; + } + mac->mac_fw.patch = bwn_shm_read_2(mac, BWN_SHARED, + BWN_SHARED_UCODE_PATCH); + date = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_UCODE_DATE); + mac->mac_fw.opensource = (date == 0xffff); + if (bwn_wme != 0) + mac->mac_flags |= BWN_MAC_FLAG_WME; + mac->mac_flags |= BWN_MAC_FLAG_HWCRYPTO; + + time = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_UCODE_TIME); + if (mac->mac_fw.opensource == 0) { + device_printf(sc->sc_dev, + "firmware version (rev %u patch %u date %#x time %#x)\n", + mac->mac_fw.rev, mac->mac_fw.patch, date, time); + if (mac->mac_fw.no_pcmfile) + device_printf(sc->sc_dev, + "no HW crypto acceleration due to pcm5\n"); + } else { + mac->mac_fw.patch = time; + fwcaps = bwn_fwcaps_read(mac); + if (!(fwcaps & BWN_FWCAPS_HWCRYPTO) || mac->mac_fw.no_pcmfile) { + device_printf(sc->sc_dev, + "disabling HW crypto acceleration\n"); + mac->mac_flags &= ~BWN_MAC_FLAG_HWCRYPTO; + } + if (!(fwcaps & BWN_FWCAPS_WME)) { + device_printf(sc->sc_dev, "disabling WME support\n"); + mac->mac_flags &= ~BWN_MAC_FLAG_WME; + } + } + + if (BWN_ISOLDFMT(mac)) + device_printf(sc->sc_dev, "using old firmware image\n"); + + return (0); + +error: + BWN_WRITE_4(mac, BWN_MACCTL, + (BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_MCODE_RUN) | + BWN_MACCTL_MCODE_JMP0); + + return (error); +#undef GETFWSIZE +#undef GETFWOFFSET +} + +/* OpenFirmware only */ +static uint16_t +bwn_fwcaps_read(struct bwn_mac *mac) +{ + + KASSERT(mac->mac_fw.opensource == 1, + ("%s:%d: fail", __func__, __LINE__)); + return (bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_FWCAPS)); +} + +static int +bwn_fwinitvals_write(struct bwn_mac *mac, const struct bwn_fwinitvals *ivals, + size_t count, size_t array_size) +{ +#define GET_NEXTIV16(iv) \ + ((const struct bwn_fwinitvals *)((const uint8_t *)(iv) + \ + sizeof(uint16_t) + sizeof(uint16_t))) +#define GET_NEXTIV32(iv) \ + ((const struct bwn_fwinitvals *)((const uint8_t *)(iv) + \ + sizeof(uint16_t) + sizeof(uint32_t))) + struct bwn_softc *sc = mac->mac_sc; + const struct bwn_fwinitvals *iv; + uint16_t offset; + size_t i; + uint8_t bit32; + + KASSERT(sizeof(struct bwn_fwinitvals) == 6, + ("%s:%d: fail", __func__, __LINE__)); + iv = ivals; + for (i = 0; i < count; i++) { + if (array_size < sizeof(iv->offset_size)) + goto fail; + array_size -= sizeof(iv->offset_size); + offset = be16toh(iv->offset_size); + bit32 = (offset & BWN_FWINITVALS_32BIT) ? 1 : 0; + offset &= BWN_FWINITVALS_OFFSET_MASK; + if (offset >= 0x1000) + goto fail; + if (bit32) { + if (array_size < sizeof(iv->data.d32)) + goto fail; + array_size -= sizeof(iv->data.d32); + BWN_WRITE_4(mac, offset, be32toh(iv->data.d32)); + iv = GET_NEXTIV32(iv); + } else { + + if (array_size < sizeof(iv->data.d16)) + goto fail; + array_size -= sizeof(iv->data.d16); + BWN_WRITE_2(mac, offset, be16toh(iv->data.d16)); + + iv = GET_NEXTIV16(iv); + } + } + if (array_size != 0) + goto fail; + return (0); +fail: + device_printf(sc->sc_dev, "initvals: invalid format\n"); + return (EPROTO); +#undef GET_NEXTIV16 +#undef GET_NEXTIV32 +} + +static int +bwn_switch_channel(struct bwn_mac *mac, int chan) +{ + struct bwn_phy *phy = &(mac->mac_phy); + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint16_t channelcookie, savedcookie; + int error; + + if (chan == 0xffff) + chan = phy->get_default_chan(mac); + + channelcookie = chan; + if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) + channelcookie |= 0x100; + savedcookie = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_CHAN); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_CHAN, channelcookie); + error = phy->switch_channel(mac, chan); + if (error) + goto fail; + + mac->mac_phy.chan = chan; + DELAY(8000); + return (0); +fail: + device_printf(sc->sc_dev, "failed to switch channel\n"); + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_CHAN, savedcookie); + return (error); +} + +static uint16_t +bwn_ant2phy(int antenna) +{ + + switch (antenna) { + case BWN_ANT0: + return (BWN_TX_PHY_ANT0); + case BWN_ANT1: + return (BWN_TX_PHY_ANT1); + case BWN_ANT2: + return (BWN_TX_PHY_ANT2); + case BWN_ANT3: + return (BWN_TX_PHY_ANT3); + case BWN_ANTAUTO: + return (BWN_TX_PHY_ANT01AUTO); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (0); +} + +static void +bwn_wme_load(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + int i; + + KASSERT(N(bwn_wme_shm_offsets) == N(sc->sc_wmeParams), + ("%s:%d: fail", __func__, __LINE__)); + + bwn_mac_suspend(mac); + for (i = 0; i < N(sc->sc_wmeParams); i++) + bwn_wme_loadparams(mac, &(sc->sc_wmeParams[i]), + bwn_wme_shm_offsets[i]); + bwn_mac_enable(mac); +} + +static void +bwn_wme_loadparams(struct bwn_mac *mac, + const struct wmeParams *p, uint16_t shm_offset) +{ +#define SM(_v, _f) (((_v) << _f##_S) & _f) + struct bwn_softc *sc = mac->mac_sc; + uint16_t params[BWN_NR_WMEPARAMS]; + int slot, tmp; + unsigned int i; + + slot = BWN_READ_2(mac, BWN_RNG) & + SM(p->wmep_logcwmin, WME_PARAM_LOGCWMIN); + + memset(¶ms, 0, sizeof(params)); + + DPRINTF(sc, BWN_DEBUG_WME, "wmep_txopLimit %d wmep_logcwmin %d " + "wmep_logcwmax %d wmep_aifsn %d\n", p->wmep_txopLimit, + p->wmep_logcwmin, p->wmep_logcwmax, p->wmep_aifsn); + + params[BWN_WMEPARAM_TXOP] = p->wmep_txopLimit * 32; + params[BWN_WMEPARAM_CWMIN] = SM(p->wmep_logcwmin, WME_PARAM_LOGCWMIN); + params[BWN_WMEPARAM_CWMAX] = SM(p->wmep_logcwmax, WME_PARAM_LOGCWMAX); + params[BWN_WMEPARAM_CWCUR] = SM(p->wmep_logcwmin, WME_PARAM_LOGCWMIN); + params[BWN_WMEPARAM_AIFS] = p->wmep_aifsn; + params[BWN_WMEPARAM_BSLOTS] = slot; + params[BWN_WMEPARAM_REGGAP] = slot + p->wmep_aifsn; + + for (i = 0; i < N(params); i++) { + if (i == BWN_WMEPARAM_STATUS) { + tmp = bwn_shm_read_2(mac, BWN_SHARED, + shm_offset + (i * 2)); + tmp |= 0x100; + bwn_shm_write_2(mac, BWN_SHARED, shm_offset + (i * 2), + tmp); + } else { + bwn_shm_write_2(mac, BWN_SHARED, shm_offset + (i * 2), + params[i]); + } + } +} + +static void +bwn_mac_write_bssid(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + uint32_t tmp; + int i; + uint8_t mac_bssid[IEEE80211_ADDR_LEN * 2]; + + bwn_mac_setfilter(mac, BWN_MACFILTER_BSSID, sc->sc_bssid); + memcpy(mac_bssid, sc->sc_macaddr, IEEE80211_ADDR_LEN); + memcpy(mac_bssid + IEEE80211_ADDR_LEN, sc->sc_bssid, + IEEE80211_ADDR_LEN); + + for (i = 0; i < N(mac_bssid); i += sizeof(uint32_t)) { + tmp = (uint32_t) (mac_bssid[i + 0]); + tmp |= (uint32_t) (mac_bssid[i + 1]) << 8; + tmp |= (uint32_t) (mac_bssid[i + 2]) << 16; + tmp |= (uint32_t) (mac_bssid[i + 3]) << 24; + bwn_ram_write(mac, 0x20 + i, tmp); + } +} + +static void +bwn_mac_setfilter(struct bwn_mac *mac, uint16_t offset, + const uint8_t *macaddr) +{ + static const uint8_t zero[IEEE80211_ADDR_LEN] = { 0 }; + uint16_t data; + + if (!mac) + macaddr = zero; + + offset |= 0x0020; + BWN_WRITE_2(mac, BWN_MACFILTER_CONTROL, offset); + + data = macaddr[0]; + data |= macaddr[1] << 8; + BWN_WRITE_2(mac, BWN_MACFILTER_DATA, data); + data = macaddr[2]; + data |= macaddr[3] << 8; + BWN_WRITE_2(mac, BWN_MACFILTER_DATA, data); + data = macaddr[4]; + data |= macaddr[5] << 8; + BWN_WRITE_2(mac, BWN_MACFILTER_DATA, data); +} + +static void +bwn_key_dowrite(struct bwn_mac *mac, uint8_t index, uint8_t algorithm, + const uint8_t *key, size_t key_len, const uint8_t *mac_addr) +{ + uint8_t buf[BWN_SEC_KEYSIZE] = { 0, }; + uint8_t per_sta_keys_start = 8; + + if (BWN_SEC_NEWAPI(mac)) + per_sta_keys_start = 4; + + KASSERT(index < mac->mac_max_nr_keys, + ("%s:%d: fail", __func__, __LINE__)); + KASSERT(key_len <= BWN_SEC_KEYSIZE, + ("%s:%d: fail", __func__, __LINE__)); + + if (index >= per_sta_keys_start) + bwn_key_macwrite(mac, index, NULL); + if (key) + memcpy(buf, key, key_len); + bwn_key_write(mac, index, algorithm, buf); + if (index >= per_sta_keys_start) + bwn_key_macwrite(mac, index, mac_addr); + + mac->mac_key[index].algorithm = algorithm; +} + +static void +bwn_key_macwrite(struct bwn_mac *mac, uint8_t index, const uint8_t *addr) +{ + uint32_t addrtmp[2] = { 0, 0 }; + uint8_t start = 8; + + if (BWN_SEC_NEWAPI(mac)) + start = 4; + + KASSERT(index >= start, + ("%s:%d: fail", __func__, __LINE__)); + index -= start; + + if (addr) { + addrtmp[0] = addr[0]; + addrtmp[0] |= ((uint32_t) (addr[1]) << 8); + addrtmp[0] |= ((uint32_t) (addr[2]) << 16); + addrtmp[0] |= ((uint32_t) (addr[3]) << 24); + addrtmp[1] = addr[4]; + addrtmp[1] |= ((uint32_t) (addr[5]) << 8); + } + + if (mac->mac_sd->sd_id.sd_rev >= 5) { + bwn_shm_write_4(mac, BWN_RCMTA, (index * 2) + 0, addrtmp[0]); + bwn_shm_write_2(mac, BWN_RCMTA, (index * 2) + 1, addrtmp[1]); + } else { + if (index >= 8) { + bwn_shm_write_4(mac, BWN_SHARED, + BWN_SHARED_PSM + (index * 6) + 0, addrtmp[0]); + bwn_shm_write_2(mac, BWN_SHARED, + BWN_SHARED_PSM + (index * 6) + 4, addrtmp[1]); + } + } +} + +static void +bwn_key_write(struct bwn_mac *mac, uint8_t index, uint8_t algorithm, + const uint8_t *key) +{ + unsigned int i; + uint32_t offset; + uint16_t kidx, value; + + kidx = BWN_SEC_KEY2FW(mac, index); + bwn_shm_write_2(mac, BWN_SHARED, + BWN_SHARED_KEYIDX_BLOCK + (kidx * 2), (kidx << 4) | algorithm); + + offset = mac->mac_ktp + (index * BWN_SEC_KEYSIZE); + for (i = 0; i < BWN_SEC_KEYSIZE; i += 2) { + value = key[i]; + value |= (uint16_t)(key[i + 1]) << 8; + bwn_shm_write_2(mac, BWN_SHARED, offset + i, value); + } +} + +static void +bwn_phy_exit(struct bwn_mac *mac) +{ + + mac->mac_phy.rf_onoff(mac, 0); + if (mac->mac_phy.exit != NULL) + mac->mac_phy.exit(mac); +} + +static void +bwn_dma_free(struct bwn_mac *mac) +{ + struct bwn_dma *dma; + + if ((mac->mac_flags & BWN_MAC_FLAG_DMA) == 0) + return; + dma = &mac->mac_method.dma; + + bwn_dma_ringfree(&dma->rx); + bwn_dma_ringfree(&dma->wme[WME_AC_BK]); + bwn_dma_ringfree(&dma->wme[WME_AC_BE]); + bwn_dma_ringfree(&dma->wme[WME_AC_VI]); + bwn_dma_ringfree(&dma->wme[WME_AC_VO]); + bwn_dma_ringfree(&dma->mcast); +} + +static void +bwn_core_stop(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + + BWN_ASSERT_LOCKED(sc); + + if (mac->mac_status < BWN_MAC_STATUS_STARTED) + return; + + callout_stop(&sc->sc_rfswitch_ch); + callout_stop(&sc->sc_task_ch); + callout_stop(&sc->sc_watchdog_ch); + sc->sc_watchdog_timer = 0; + BWN_WRITE_4(mac, BWN_INTR_MASK, 0); + BWN_READ_4(mac, BWN_INTR_MASK); + bwn_mac_suspend(mac); + + mac->mac_status = BWN_MAC_STATUS_INITED; +} + +static int +bwn_switch_band(struct bwn_softc *sc, struct ieee80211_channel *chan) +{ + struct bwn_mac *up_dev = NULL; + struct bwn_mac *down_dev; + struct bwn_mac *mac; + int err, status; + uint8_t gmode; + + BWN_ASSERT_LOCKED(sc); + + TAILQ_FOREACH(mac, &sc->sc_maclist, mac_list) { + if (IEEE80211_IS_CHAN_2GHZ(chan) && + mac->mac_phy.supports_2ghz) { + up_dev = mac; + gmode = 1; + } else if (IEEE80211_IS_CHAN_5GHZ(chan) && + mac->mac_phy.supports_5ghz) { + up_dev = mac; + gmode = 0; + } else { + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (EINVAL); + } + if (up_dev != NULL) + break; + } + if (up_dev == NULL) { + device_printf(sc->sc_dev, "Could not find a device\n"); + return (ENODEV); + } + if (up_dev == sc->sc_curmac && sc->sc_curmac->mac_phy.gmode == gmode) + return (0); + + device_printf(sc->sc_dev, "switching to %s-GHz band\n", + IEEE80211_IS_CHAN_2GHZ(chan) ? "2" : "5"); + + down_dev = sc->sc_curmac;; + status = down_dev->mac_status; + if (status >= BWN_MAC_STATUS_STARTED) + bwn_core_stop(down_dev); + if (status >= BWN_MAC_STATUS_INITED) + bwn_core_exit(down_dev); + + if (down_dev != up_dev) + bwn_phy_reset(down_dev); + + up_dev->mac_phy.gmode = gmode; + if (status >= BWN_MAC_STATUS_INITED) { + err = bwn_core_init(up_dev); + if (err) { + device_printf(sc->sc_dev, + "fatal: failed to initialize for %s-GHz\n", + IEEE80211_IS_CHAN_2GHZ(chan) ? "2" : "5"); + goto fail; + } + } + if (status >= BWN_MAC_STATUS_STARTED) + bwn_core_start(up_dev); + KASSERT(up_dev->mac_status == status, ("%s: fail", __func__)); + sc->sc_curmac = up_dev; + + return (0); +fail: + sc->sc_curmac = NULL; + return (err); +} + +static void +bwn_rf_turnon(struct bwn_mac *mac) +{ + + bwn_mac_suspend(mac); + mac->mac_phy.rf_onoff(mac, 1); + mac->mac_phy.rf_on = 1; + bwn_mac_enable(mac); +} + +static void +bwn_rf_turnoff(struct bwn_mac *mac) +{ + + bwn_mac_suspend(mac); + mac->mac_phy.rf_onoff(mac, 0); + mac->mac_phy.rf_on = 0; + bwn_mac_enable(mac); +} + +static void +bwn_phy_reset(struct bwn_mac *mac) +{ + struct siba_dev_softc *sd = mac->mac_sd; + + siba_write_4(sd, SIBA_TGSLOW, + ((siba_read_4(sd, SIBA_TGSLOW) & ~BWN_TGSLOW_SUPPORT_G) | + BWN_TGSLOW_PHYRESET) | SIBA_TGSLOW_FGC); + DELAY(1000); + siba_write_4(sd, SIBA_TGSLOW, + (siba_read_4(sd, SIBA_TGSLOW) & ~SIBA_TGSLOW_FGC) | + BWN_TGSLOW_PHYRESET); + DELAY(1000); +} + +static int +bwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) +{ + struct bwn_vap *bvp = BWN_VAP(vap); + struct ieee80211com *ic= vap->iv_ic; + struct ifnet *ifp = ic->ic_ifp; + enum ieee80211_state ostate = vap->iv_state; + struct bwn_softc *sc = ifp->if_softc; + struct bwn_mac *mac = sc->sc_curmac; + int error; + + DPRINTF(sc, BWN_DEBUG_STATE, "%s: %s -> %s\n", __func__, + ieee80211_state_name[vap->iv_state], + ieee80211_state_name[nstate]); + + error = bvp->bv_newstate(vap, nstate, arg); + if (error != 0) + return (error); + + BWN_LOCK(sc); + + bwn_led_newstate(mac, nstate); + + /* + * Clear the BSSID when we stop a STA + */ + if (vap->iv_opmode == IEEE80211_M_STA) { + if (ostate == IEEE80211_S_RUN && nstate != IEEE80211_S_RUN) { + /* + * Clear out the BSSID. If we reassociate to + * the same AP, this will reinialize things + * correctly... + */ + if (ic->ic_opmode == IEEE80211_M_STA && + (sc->sc_flags & BWN_FLAG_INVALID) == 0) { + memset(sc->sc_bssid, 0, IEEE80211_ADDR_LEN); + bwn_set_macaddr(mac); + } + } + } + + if (vap->iv_opmode == IEEE80211_M_MONITOR || + vap->iv_opmode == IEEE80211_M_AHDEMO) { + /* XXX nothing to do? */ + } else if (nstate == IEEE80211_S_RUN) { + memcpy(sc->sc_bssid, vap->iv_bss->ni_bssid, IEEE80211_ADDR_LEN); + memcpy(sc->sc_macaddr, IF_LLADDR(ifp), IEEE80211_ADDR_LEN); + bwn_set_opmode(mac); + bwn_set_pretbtt(mac); + bwn_spu_setdelay(mac, 0); + bwn_set_macaddr(mac); + } + + BWN_UNLOCK(sc); + + return (error); +} + +static void +bwn_set_pretbtt(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + uint16_t pretbtt; + + if (ic->ic_opmode == IEEE80211_M_IBSS) + pretbtt = 2; + else + pretbtt = (mac->mac_phy.type == BWN_PHYTYPE_A) ? 120 : 250; + bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PRETBTT, pretbtt); + BWN_WRITE_2(mac, BWN_TSF_CFP_PRETBTT, pretbtt); +} + +static int +bwn_intr(void *arg) +{ + struct bwn_mac *mac = arg; + struct bwn_softc *sc = mac->mac_sc; + struct siba_softc *siba = mac->mac_sd->sd_bus; + uint32_t reason; + + if (mac->mac_status < BWN_MAC_STATUS_STARTED || siba->siba_invalid) + return (FILTER_STRAY); + + reason = BWN_READ_4(mac, BWN_INTR_REASON); + if (reason == 0xffffffff) /* shared IRQ */ + return (FILTER_STRAY); + reason &= mac->mac_intr_mask; + if (reason == 0) + return (FILTER_HANDLED); + + mac->mac_reason[0] = BWN_READ_4(mac, BWN_DMA0_REASON) & 0x0001dc00; + mac->mac_reason[1] = BWN_READ_4(mac, BWN_DMA1_REASON) & 0x0000dc00; + mac->mac_reason[2] = BWN_READ_4(mac, BWN_DMA2_REASON) & 0x0000dc00; + mac->mac_reason[3] = BWN_READ_4(mac, BWN_DMA3_REASON) & 0x0001dc00; + mac->mac_reason[4] = BWN_READ_4(mac, BWN_DMA4_REASON) & 0x0000dc00; + BWN_WRITE_4(mac, BWN_INTR_REASON, reason); + BWN_WRITE_4(mac, BWN_DMA0_REASON, mac->mac_reason[0]); + BWN_WRITE_4(mac, BWN_DMA1_REASON, mac->mac_reason[1]); + BWN_WRITE_4(mac, BWN_DMA2_REASON, mac->mac_reason[2]); + BWN_WRITE_4(mac, BWN_DMA3_REASON, mac->mac_reason[3]); + BWN_WRITE_4(mac, BWN_DMA4_REASON, mac->mac_reason[4]); + + /* Disable interrupts. */ + BWN_WRITE_4(mac, BWN_INTR_MASK, 0); + + mac->mac_reason_intr = reason; + + BWN_BARRIER(mac, BUS_SPACE_BARRIER_READ); + BWN_BARRIER(mac, BUS_SPACE_BARRIER_WRITE); + + taskqueue_enqueue_fast(sc->sc_tq, &mac->mac_intrtask); + return (FILTER_HANDLED); +} + +static void +bwn_intrtask(void *arg, int npending) +{ + struct bwn_mac *mac = arg; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct siba_softc *siba = mac->mac_sd->sd_bus; + uint32_t merged = 0; + int i, tx = 0, rx = 0; + + BWN_LOCK(sc); + if (mac->mac_status < BWN_MAC_STATUS_STARTED || siba->siba_invalid) { + BWN_UNLOCK(sc); + return; + } + + for (i = 0; i < N(mac->mac_reason); i++) + merged |= mac->mac_reason[i]; + + if (mac->mac_reason_intr & BWN_INTR_MAC_TXERR) + device_printf(sc->sc_dev, "MAC trans error\n"); + + if (mac->mac_reason_intr & BWN_INTR_PHY_TXERR) { + DPRINTF(sc, BWN_DEBUG_INTR, "%s: PHY trans error\n", __func__); + mac->mac_phy.txerrors--; + if (mac->mac_phy.txerrors == 0) { + mac->mac_phy.txerrors = BWN_TXERROR_MAX; + bwn_restart(mac, "PHY TX errors"); + } + } + + if (merged & (BWN_DMAINTR_FATALMASK | BWN_DMAINTR_NONFATALMASK)) { + if (merged & BWN_DMAINTR_FATALMASK) { + device_printf(sc->sc_dev, + "Fatal DMA error: %#x %#x %#x %#x %#x %#x\n", + mac->mac_reason[0], mac->mac_reason[1], + mac->mac_reason[2], mac->mac_reason[3], + mac->mac_reason[4], mac->mac_reason[5]); + bwn_restart(mac, "DMA error"); + BWN_UNLOCK(sc); + return; + } + if (merged & BWN_DMAINTR_NONFATALMASK) { + device_printf(sc->sc_dev, + "DMA error: %#x %#x %#x %#x %#x %#x\n", + mac->mac_reason[0], mac->mac_reason[1], + mac->mac_reason[2], mac->mac_reason[3], + mac->mac_reason[4], mac->mac_reason[5]); + } + } + + if (mac->mac_reason_intr & BWN_INTR_UCODE_DEBUG) + bwn_intr_ucode_debug(mac); + if (mac->mac_reason_intr & BWN_INTR_TBTT_INDI) + bwn_intr_tbtt_indication(mac); + if (mac->mac_reason_intr & BWN_INTR_ATIM_END) + bwn_intr_atim_end(mac); + if (mac->mac_reason_intr & BWN_INTR_BEACON) + bwn_intr_beacon(mac); + if (mac->mac_reason_intr & BWN_INTR_PMQ) + bwn_intr_pmq(mac); + if (mac->mac_reason_intr & BWN_INTR_NOISESAMPLE_OK) + bwn_intr_noise(mac); + + if (mac->mac_flags & BWN_MAC_FLAG_DMA) { + if (mac->mac_reason[0] & BWN_DMAINTR_RX_DONE) { + bwn_dma_rx(mac->mac_method.dma.rx); + rx = 1; + } + } else + rx = bwn_pio_rx(&mac->mac_method.pio.rx); + + KASSERT(!(mac->mac_reason[1] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); + KASSERT(!(mac->mac_reason[2] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); + KASSERT(!(mac->mac_reason[3] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); + KASSERT(!(mac->mac_reason[4] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); + KASSERT(!(mac->mac_reason[5] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); + + if (mac->mac_reason_intr & BWN_INTR_TX_OK) { + bwn_intr_txeof(mac); + tx = 1; + } + + BWN_WRITE_4(mac, BWN_INTR_MASK, mac->mac_intr_mask); + + if (sc->sc_blink_led != NULL && sc->sc_led_blink) { + int evt = BWN_LED_EVENT_NONE; + + if (tx && rx) { + if (sc->sc_rx_rate > sc->sc_tx_rate) + evt = BWN_LED_EVENT_RX; + else + evt = BWN_LED_EVENT_TX; + } else if (tx) { + evt = BWN_LED_EVENT_TX; + } else if (rx) { + evt = BWN_LED_EVENT_RX; + } else if (rx == 0) { + evt = BWN_LED_EVENT_POLL; + } + + if (evt != BWN_LED_EVENT_NONE) + bwn_led_event(mac, evt); + } + + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) { + if (!IFQ_IS_EMPTY(&ifp->if_snd)) + bwn_start_locked(ifp); + } + + BWN_BARRIER(mac, BUS_SPACE_BARRIER_READ); + BWN_BARRIER(mac, BUS_SPACE_BARRIER_WRITE); + + BWN_UNLOCK(sc); +} + +static void +bwn_restart(struct bwn_mac *mac, const char *msg) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + if (mac->mac_status < BWN_MAC_STATUS_INITED) + return; + + device_printf(sc->sc_dev, "HW reset: %s\n", msg); + ieee80211_runtask(ic, &mac->mac_hwreset); +} + +static void +bwn_intr_ucode_debug(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + uint16_t reason; + + if (mac->mac_fw.opensource == 0) + return; + + reason = bwn_shm_read_2(mac, BWN_SCRATCH, BWN_DEBUGINTR_REASON_REG); + switch (reason) { + case BWN_DEBUGINTR_PANIC: + bwn_handle_fwpanic(mac); + break; + case BWN_DEBUGINTR_DUMP_SHM: + device_printf(sc->sc_dev, "BWN_DEBUGINTR_DUMP_SHM\n"); + break; + case BWN_DEBUGINTR_DUMP_REGS: + device_printf(sc->sc_dev, "BWN_DEBUGINTR_DUMP_REGS\n"); + break; + case BWN_DEBUGINTR_MARKER: + device_printf(sc->sc_dev, "BWN_DEBUGINTR_MARKER\n"); + break; + default: + device_printf(sc->sc_dev, + "ucode debug unknown reason: %#x\n", reason); + } + + bwn_shm_write_2(mac, BWN_SCRATCH, BWN_DEBUGINTR_REASON_REG, + BWN_DEBUGINTR_ACK); +} + +static void +bwn_intr_tbtt_indication(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + + if (ic->ic_opmode != IEEE80211_M_HOSTAP) + bwn_psctl(mac, 0); + if (ic->ic_opmode == IEEE80211_M_IBSS) + mac->mac_flags |= BWN_MAC_FLAG_DFQVALID; +} + +static void +bwn_intr_atim_end(struct bwn_mac *mac) +{ + + if (mac->mac_flags & BWN_MAC_FLAG_DFQVALID) { + BWN_WRITE_4(mac, BWN_MACCMD, + BWN_READ_4(mac, BWN_MACCMD) | BWN_MACCMD_DFQ_VALID); + mac->mac_flags &= ~BWN_MAC_FLAG_DFQVALID; + } +} + +static void +bwn_intr_beacon(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + uint32_t cmd, beacon0, beacon1; + + if (ic->ic_opmode == IEEE80211_M_HOSTAP || + ic->ic_opmode == IEEE80211_M_MBSS) + return; + + mac->mac_intr_mask &= ~BWN_INTR_BEACON; + + cmd = BWN_READ_4(mac, BWN_MACCMD); + beacon0 = (cmd & BWN_MACCMD_BEACON0_VALID); + beacon1 = (cmd & BWN_MACCMD_BEACON1_VALID); + + if (beacon0 && beacon1) { + BWN_WRITE_4(mac, BWN_INTR_REASON, BWN_INTR_BEACON); + mac->mac_intr_mask |= BWN_INTR_BEACON; + return; + } + + if (sc->sc_flags & BWN_FLAG_NEED_BEACON_TP) { + sc->sc_flags &= ~BWN_FLAG_NEED_BEACON_TP; + bwn_load_beacon0(mac); + bwn_load_beacon1(mac); + cmd = BWN_READ_4(mac, BWN_MACCMD); + cmd |= BWN_MACCMD_BEACON0_VALID; + BWN_WRITE_4(mac, BWN_MACCMD, cmd); + } else { + if (!beacon0) { + bwn_load_beacon0(mac); + cmd = BWN_READ_4(mac, BWN_MACCMD); + cmd |= BWN_MACCMD_BEACON0_VALID; + BWN_WRITE_4(mac, BWN_MACCMD, cmd); + } else if (!beacon1) { + bwn_load_beacon1(mac); + cmd = BWN_READ_4(mac, BWN_MACCMD); + cmd |= BWN_MACCMD_BEACON1_VALID; + BWN_WRITE_4(mac, BWN_MACCMD, cmd); + } + } +} + +static void +bwn_intr_pmq(struct bwn_mac *mac) +{ + uint32_t tmp; + + while (1) { + tmp = BWN_READ_4(mac, BWN_PS_STATUS); + if (!(tmp & 0x00000008)) + break; + } + BWN_WRITE_2(mac, BWN_PS_STATUS, 0x0002); +} + +static void +bwn_intr_noise(struct bwn_mac *mac) +{ + struct bwn_phy_g *pg = &mac->mac_phy.phy_g; + uint16_t tmp; + uint8_t noise[4]; + uint8_t i, j; + int32_t average; + + if (mac->mac_phy.type != BWN_PHYTYPE_G) + return; + + KASSERT(mac->mac_noise.noi_running, ("%s: fail", __func__)); + *((uint32_t *)noise) = htole32(bwn_jssi_read(mac)); + if (noise[0] == 0x7f || noise[1] == 0x7f || noise[2] == 0x7f || + noise[3] == 0x7f) + goto new; + + KASSERT(mac->mac_noise.noi_nsamples < 8, + ("%s:%d: fail", __func__, __LINE__)); + i = mac->mac_noise.noi_nsamples; + noise[0] = MIN(MAX(noise[0], 0), N(pg->pg_nrssi_lt) - 1); + noise[1] = MIN(MAX(noise[1], 0), N(pg->pg_nrssi_lt) - 1); + noise[2] = MIN(MAX(noise[2], 0), N(pg->pg_nrssi_lt) - 1); + noise[3] = MIN(MAX(noise[3], 0), N(pg->pg_nrssi_lt) - 1); + mac->mac_noise.noi_samples[i][0] = pg->pg_nrssi_lt[noise[0]]; + mac->mac_noise.noi_samples[i][1] = pg->pg_nrssi_lt[noise[1]]; + mac->mac_noise.noi_samples[i][2] = pg->pg_nrssi_lt[noise[2]]; + mac->mac_noise.noi_samples[i][3] = pg->pg_nrssi_lt[noise[3]]; + mac->mac_noise.noi_nsamples++; + if (mac->mac_noise.noi_nsamples == 8) { + average = 0; + for (i = 0; i < 8; i++) { + for (j = 0; j < 4; j++) + average += mac->mac_noise.noi_samples[i][j]; + } + average = (((average / 32) * 125) + 64) / 128; + tmp = (bwn_shm_read_2(mac, BWN_SHARED, 0x40c) / 128) & 0x1f; + if (tmp >= 8) + average += 2; + else + average -= 25; + average -= (tmp == 8) ? 72 : 48; + + mac->mac_stats.link_noise = average; + mac->mac_noise.noi_running = 0; + return; + } +new: + bwn_noise_gensample(mac); +} + +static int +bwn_pio_rx(struct bwn_pio_rxqueue *prq) +{ + struct bwn_mac *mac = prq->prq_mac; + struct bwn_softc *sc = mac->mac_sc; + unsigned int i; + + BWN_ASSERT_LOCKED(sc); + + if (mac->mac_status < BWN_MAC_STATUS_STARTED) + return (0); + + for (i = 0; i < 5000; i++) { + if (bwn_pio_rxeof(prq) == 0) + break; + } + if (i >= 5000) + device_printf(sc->sc_dev, "too many RX frames in PIO mode\n"); + return ((i > 0) ? 1 : 0); +} + +static void +bwn_dma_rx(struct bwn_dma_ring *dr) +{ + int slot, curslot; + + KASSERT(!dr->dr_tx, ("%s:%d: fail", __func__, __LINE__)); + curslot = dr->get_curslot(dr); + KASSERT(curslot >= 0 && curslot < dr->dr_numslots, + ("%s:%d: fail", __func__, __LINE__)); + + slot = dr->dr_curslot; + for (; slot != curslot; slot = bwn_dma_nextslot(dr, slot)) + bwn_dma_rxeof(dr, &slot); + + bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, + BUS_DMASYNC_PREWRITE); + + dr->set_curslot(dr, slot); + dr->dr_curslot = slot; +} + +static void +bwn_intr_txeof(struct bwn_mac *mac) +{ + struct bwn_txstatus stat; + uint32_t stat0, stat1; + uint16_t tmp; + + BWN_ASSERT_LOCKED(mac->mac_sc); + + while (1) { + stat0 = BWN_READ_4(mac, BWN_XMITSTAT_0); + if (!(stat0 & 0x00000001)) + break; + stat1 = BWN_READ_4(mac, BWN_XMITSTAT_1); + + stat.cookie = (stat0 >> 16); + stat.seq = (stat1 & 0x0000ffff); + stat.phy_stat = ((stat1 & 0x00ff0000) >> 16); + tmp = (stat0 & 0x0000ffff); + stat.framecnt = ((tmp & 0xf000) >> 12); + stat.rtscnt = ((tmp & 0x0f00) >> 8); + stat.sreason = ((tmp & 0x001c) >> 2); + stat.pm = (tmp & 0x0080) ? 1 : 0; + stat.im = (tmp & 0x0040) ? 1 : 0; + stat.ampdu = (tmp & 0x0020) ? 1 : 0; + stat.ack = (tmp & 0x0002) ? 1 : 0; + + bwn_handle_txeof(mac, &stat); + } +} + +static void +bwn_hwreset(void *arg, int npending) +{ + struct bwn_mac *mac = arg; + struct bwn_softc *sc = mac->mac_sc; + int error = 0; + int prev_status; + + BWN_LOCK(sc); + + prev_status = mac->mac_status; + if (prev_status >= BWN_MAC_STATUS_STARTED) + bwn_core_stop(mac); + if (prev_status >= BWN_MAC_STATUS_INITED) + bwn_core_exit(mac); + + if (prev_status >= BWN_MAC_STATUS_INITED) { + error = bwn_core_init(mac); + if (error) + goto out; + } + if (prev_status >= BWN_MAC_STATUS_STARTED) + bwn_core_start(mac); +out: + if (error) { + device_printf(sc->sc_dev, "%s: failed (%d)\n", __func__, error); + sc->sc_curmac = NULL; + } + BWN_UNLOCK(sc); +} + +static void +bwn_handle_fwpanic(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + uint16_t reason; + + reason = bwn_shm_read_2(mac, BWN_SCRATCH, BWN_FWPANIC_REASON_REG); + device_printf(sc->sc_dev,"fw panic (%u)\n", reason); + + if (reason == BWN_FWPANIC_RESTART) + bwn_restart(mac, "ucode panic"); +} + +static void +bwn_load_beacon0(struct bwn_mac *mac) +{ + + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); +} + +static void +bwn_load_beacon1(struct bwn_mac *mac) +{ + + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); +} + +static uint32_t +bwn_jssi_read(struct bwn_mac *mac) +{ + uint32_t val = 0; + + val = bwn_shm_read_2(mac, BWN_SHARED, 0x08a); + val <<= 16; + val |= bwn_shm_read_2(mac, BWN_SHARED, 0x088); + + return (val); +} + +static void +bwn_noise_gensample(struct bwn_mac *mac) +{ + uint32_t jssi = 0x7f7f7f7f; + + bwn_shm_write_2(mac, BWN_SHARED, 0x088, (jssi & 0x0000ffff)); + bwn_shm_write_2(mac, BWN_SHARED, 0x08a, (jssi & 0xffff0000) >> 16); + BWN_WRITE_4(mac, BWN_MACCMD, + BWN_READ_4(mac, BWN_MACCMD) | BWN_MACCMD_BGNOISE); +} + +static int +bwn_dma_freeslot(struct bwn_dma_ring *dr) +{ + BWN_ASSERT_LOCKED(dr->dr_mac->mac_sc); + + return (dr->dr_numslots - dr->dr_usedslot); +} + +static int +bwn_dma_nextslot(struct bwn_dma_ring *dr, int slot) +{ + BWN_ASSERT_LOCKED(dr->dr_mac->mac_sc); + + KASSERT(slot >= -1 && slot <= dr->dr_numslots - 1, + ("%s:%d: fail", __func__, __LINE__)); + if (slot == dr->dr_numslots - 1) + return (0); + return (slot + 1); +} + +static void +bwn_dma_rxeof(struct bwn_dma_ring *dr, int *slot) +{ + struct bwn_mac *mac = dr->dr_mac; + struct bwn_softc *sc = mac->mac_sc; + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_dmadesc_generic *desc; + struct bwn_dmadesc_meta *meta; + struct bwn_rxhdr4 *rxhdr; + struct ifnet *ifp = sc->sc_ifp; + struct mbuf *m; + uint32_t macstat; + int32_t tmp; + int cnt = 0; + uint16_t len; + + dr->getdesc(dr, *slot, &desc, &meta); + + bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, BUS_DMASYNC_POSTREAD); + m = meta->mt_m; + + if (bwn_dma_newbuf(dr, desc, meta, 0)) { + ifp->if_ierrors++; + return; + } + + rxhdr = mtod(m, struct bwn_rxhdr4 *); + len = le16toh(rxhdr->frame_len); + if (len <= 0) { + ifp->if_ierrors++; + return; + } + if (bwn_dma_check_redzone(dr, m)) { + device_printf(sc->sc_dev, "redzone error.\n"); + bwn_dma_set_redzone(dr, m); + bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, + BUS_DMASYNC_PREWRITE); + return; + } + if (len > dr->dr_rx_bufsize) { + tmp = len; + while (1) { + dr->getdesc(dr, *slot, &desc, &meta); + bwn_dma_set_redzone(dr, meta->mt_m); + bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, + BUS_DMASYNC_PREWRITE); + *slot = bwn_dma_nextslot(dr, *slot); + cnt++; + tmp -= dr->dr_rx_bufsize; + if (tmp <= 0) + break; + } + device_printf(sc->sc_dev, "too small buffer " + "(len %u buffer %u dropped %d)\n", + len, dr->dr_rx_bufsize, cnt); + return; + } + macstat = le32toh(rxhdr->mac_status); + if (macstat & BWN_RX_MAC_FCSERR) { + if (!(mac->mac_sc->sc_filters & BWN_MACCTL_PASS_BADFCS)) { + device_printf(sc->sc_dev, "RX drop\n"); + return; + } + } + + m->m_pkthdr.rcvif = ifp; + m->m_len = m->m_pkthdr.len = len + dr->dr_frameoffset; + m_adj(m, dr->dr_frameoffset); + + bwn_rxeof(dr->dr_mac, m, rxhdr); +} + +static void +bwn_handle_txeof(struct bwn_mac *mac, const struct bwn_txstatus *status) +{ + struct bwn_dma_ring *dr; + struct bwn_dmadesc_generic *desc; + struct bwn_dmadesc_meta *meta; + struct bwn_node *bn; + struct bwn_pio_txqueue *tq; + struct bwn_pio_txpkt *tp = NULL; + struct bwn_softc *sc = mac->mac_sc; + struct bwn_stats *stats = &mac->mac_stats; + struct ieee80211_node *ni; + int slot; + + BWN_ASSERT_LOCKED(mac->mac_sc); + + if (status->im) + device_printf(sc->sc_dev, "TODO: STATUS IM\n"); + if (status->ampdu) + device_printf(sc->sc_dev, "TODO: STATUS AMPDU\n"); + if (status->rtscnt) { + if (status->rtscnt == 0xf) + stats->rtsfail++; + else + stats->rts++; + } + + if (mac->mac_flags & BWN_MAC_FLAG_DMA) { + if (status->ack) { + dr = bwn_dma_parse_cookie(mac, status, + status->cookie, &slot); + if (dr == NULL) { + device_printf(sc->sc_dev, + "failed to parse cookie\n"); + return; + } + while (1) { + dr->getdesc(dr, slot, &desc, &meta); + if (meta->mt_islast) { + ni = meta->mt_ni; + bn = (struct bwn_node *)ni; + ieee80211_amrr_tx_complete(&bn->bn_amn, + status->ack, 0); + break; + } + slot = bwn_dma_nextslot(dr, slot); + } + } + bwn_dma_handle_txeof(mac, status); + } else { + if (status->ack) { + tq = bwn_pio_parse_cookie(mac, status->cookie, &tp); + if (tq == NULL) { + device_printf(sc->sc_dev, + "failed to parse cookie\n"); + return; + } + ni = tp->tp_ni; + bn = (struct bwn_node *)ni; + ieee80211_amrr_tx_complete(&bn->bn_amn, status->ack, 0); + } + bwn_pio_handle_txeof(mac, status); + } + + bwn_phy_txpower_check(mac, 0); +} + +static uint8_t +bwn_pio_rxeof(struct bwn_pio_rxqueue *prq) +{ + struct bwn_mac *mac = prq->prq_mac; + struct bwn_softc *sc = mac->mac_sc; + struct bwn_rxhdr4 rxhdr; + struct ifnet *ifp = sc->sc_ifp; + struct mbuf *m; + uint32_t ctl32, macstat, v32; + unsigned int i, padding; + uint16_t ctl16, len, v16; + unsigned char *mp; + char *data; + + memset(&rxhdr, 0, sizeof(rxhdr)); + + if (prq->prq_rev >= 8) { + ctl32 = bwn_pio_rx_read_4(prq, BWN_PIO8_RXCTL); + if (!(ctl32 & BWN_PIO8_RXCTL_FRAMEREADY)) + return (0); + bwn_pio_rx_write_4(prq, BWN_PIO8_RXCTL, + BWN_PIO8_RXCTL_FRAMEREADY); + for (i = 0; i < 10; i++) { + ctl32 = bwn_pio_rx_read_4(prq, BWN_PIO8_RXCTL); + if (ctl32 & BWN_PIO8_RXCTL_DATAREADY) + goto ready; + DELAY(10); + } + } else { + ctl16 = bwn_pio_rx_read_2(prq, BWN_PIO_RXCTL); + if (!(ctl16 & BWN_PIO_RXCTL_FRAMEREADY)) + return (0); + bwn_pio_rx_write_2(prq, BWN_PIO_RXCTL, + BWN_PIO_RXCTL_FRAMEREADY); + for (i = 0; i < 10; i++) { + ctl16 = bwn_pio_rx_read_2(prq, BWN_PIO_RXCTL); + if (ctl16 & BWN_PIO_RXCTL_DATAREADY) + goto ready; + DELAY(10); + } + } + device_printf(sc->sc_dev, "%s: timed out\n", __func__); + return (1); +ready: + if (prq->prq_rev >= 8) + siba_read_multi_4(mac->mac_sd, &rxhdr, sizeof(rxhdr), + prq->prq_base + BWN_PIO8_RXDATA); + else + siba_read_multi_2(mac->mac_sd, &rxhdr, sizeof(rxhdr), + prq->prq_base + BWN_PIO_RXDATA); + len = le16toh(rxhdr.frame_len); + if (len > 0x700) { + device_printf(sc->sc_dev, "%s: len is too big\n", __func__); + goto error; + } + if (len == 0) { + device_printf(sc->sc_dev, "%s: len is 0\n", __func__); + goto error; + } + + macstat = le32toh(rxhdr.mac_status); + if (macstat & BWN_RX_MAC_FCSERR) { + if (!(mac->mac_sc->sc_filters & BWN_MACCTL_PASS_BADFCS)) { + device_printf(sc->sc_dev, "%s: FCS error", __func__); + goto error; + } + } + + padding = (macstat & BWN_RX_MAC_PADDING) ? 2 : 0; + KASSERT(len + padding <= MCLBYTES, ("too big..\n")); + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) { + device_printf(sc->sc_dev, "%s: out of memory", __func__); + goto error; + } + mp = mtod(m, unsigned char *); + if (prq->prq_rev >= 8) { + siba_read_multi_4(mac->mac_sd, mp + padding, (len & ~3), + prq->prq_base + BWN_PIO8_RXDATA); + if (len & 3) { + v32 = bwn_pio_rx_read_4(prq, BWN_PIO8_RXDATA); + data = &(mp[len + padding - 1]); + switch (len & 3) { + case 3: + *data = (v32 >> 16); + data--; + case 2: + *data = (v32 >> 8); + data--; + case 1: + *data = v32; + } + } + } else { + siba_read_multi_2(mac->mac_sd, mp + padding, (len & ~1), + prq->prq_base + BWN_PIO_RXDATA); + if (len & 1) { + v16 = bwn_pio_rx_read_2(prq, BWN_PIO_RXDATA); + mp[len + padding - 1] = v16; + } + } + + m->m_pkthdr.rcvif = ifp; + m->m_len = m->m_pkthdr.len = len + padding; + + bwn_rxeof(prq->prq_mac, m, &rxhdr); + + return (1); +error: + if (prq->prq_rev >= 8) + bwn_pio_rx_write_4(prq, BWN_PIO8_RXCTL, + BWN_PIO8_RXCTL_DATAREADY); + else + bwn_pio_rx_write_2(prq, BWN_PIO_RXCTL, BWN_PIO_RXCTL_DATAREADY); + return (1); +} + +static int +bwn_dma_newbuf(struct bwn_dma_ring *dr, struct bwn_dmadesc_generic *desc, + struct bwn_dmadesc_meta *meta, int init) +{ + struct bwn_mac *mac = dr->dr_mac; + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_rxhdr4 *hdr; + bus_dmamap_t map; + bus_addr_t paddr; + struct mbuf *m; + int error; + + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) { + error = ENOBUFS; + + /* + * If the NIC is up and running, we need to: + * - Clear RX buffer's header. + * - Restore RX descriptor settings. + */ + if (init) + return (error); + else + goto back; + } + m->m_len = m->m_pkthdr.len = MCLBYTES; + + bwn_dma_set_redzone(dr, m); + + /* + * Try to load RX buf into temporary DMA map + */ + error = bus_dmamap_load_mbuf(dma->rxbuf_dtag, dr->dr_spare_dmap, m, + bwn_dma_buf_addr, &paddr, BUS_DMA_NOWAIT); + if (error) { + m_freem(m); + + /* + * See the comment above + */ + if (init) + return (error); + else + goto back; + } + + if (!init) + bus_dmamap_unload(dma->rxbuf_dtag, meta->mt_dmap); + meta->mt_m = m; + meta->mt_paddr = paddr; + + /* + * Swap RX buf's DMA map with the loaded temporary one + */ + map = meta->mt_dmap; + meta->mt_dmap = dr->dr_spare_dmap; + dr->dr_spare_dmap = map; + +back: + /* + * Clear RX buf header + */ + hdr = mtod(meta->mt_m, struct bwn_rxhdr4 *); + bzero(hdr, sizeof(*hdr)); + bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, + BUS_DMASYNC_PREWRITE); + + /* + * Setup RX buf descriptor + */ + dr->setdesc(dr, desc, paddr, meta->mt_m->m_len - + sizeof(*hdr), 0, 0, 0); + return (error); +} + +static void +bwn_dma_buf_addr(void *arg, bus_dma_segment_t *seg, int nseg, + bus_size_t mapsz __unused, int error) +{ + + if (!error) { + KASSERT(nseg == 1, ("too many segments(%d)\n", nseg)); + *((bus_addr_t *)arg) = seg->ds_addr; + } +} + +static int +bwn_hwrate2ieeerate(int rate) +{ + + switch (rate) { + case BWN_CCK_RATE_1MB: + return (2); + case BWN_CCK_RATE_2MB: + return (4); + case BWN_CCK_RATE_5MB: + return (11); + case BWN_CCK_RATE_11MB: + return (22); + case BWN_OFDM_RATE_6MB: + return (12); + case BWN_OFDM_RATE_9MB: + return (18); + case BWN_OFDM_RATE_12MB: + return (24); + case BWN_OFDM_RATE_18MB: + return (36); + case BWN_OFDM_RATE_24MB: + return (48); + case BWN_OFDM_RATE_36MB: + return (72); + case BWN_OFDM_RATE_48MB: + return (96); + case BWN_OFDM_RATE_54MB: + return (108); + default: + printf("Ooops\n"); + return (0); + } +} + +static void +bwn_rxeof(struct bwn_mac *mac, struct mbuf *m, const void *_rxhdr) +{ + const struct bwn_rxhdr4 *rxhdr = _rxhdr; + struct bwn_plcp6 *plcp; + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211_frame_min *wh; + struct ieee80211_node *ni; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t macstat; + int padding, rate, rssi = 0, noise = 0, type; + uint16_t phytype, phystat0, phystat3, chanstat; + unsigned char *mp = mtod(m, unsigned char *); + static int rx_mac_dec_rpt = 0; + + BWN_ASSERT_LOCKED(sc); + + phystat0 = le16toh(rxhdr->phy_status0); + phystat3 = le16toh(rxhdr->phy_status3); + macstat = le32toh(rxhdr->mac_status); + chanstat = le16toh(rxhdr->channel); + phytype = chanstat & BWN_RX_CHAN_PHYTYPE; + + if (macstat & BWN_RX_MAC_FCSERR) + device_printf(sc->sc_dev, "TODO RX: RX_FLAG_FAILED_FCS_CRC\n"); + if (phystat0 & (BWN_RX_PHYST0_PLCPHCF | BWN_RX_PHYST0_PLCPFV)) + device_printf(sc->sc_dev, "TODO RX: RX_FLAG_FAILED_PLCP_CRC\n"); + if (macstat & BWN_RX_MAC_DECERR) + goto drop; + + padding = (macstat & BWN_RX_MAC_PADDING) ? 2 : 0; + if (m->m_pkthdr.len < (sizeof(struct bwn_plcp6) + padding)) { + device_printf(sc->sc_dev, "frame too short (length=%d)\n", + m->m_pkthdr.len); + goto drop; + } + plcp = (struct bwn_plcp6 *)(mp + padding); + m_adj(m, sizeof(struct bwn_plcp6) + padding); + if (m->m_pkthdr.len < IEEE80211_MIN_LEN) { + device_printf(sc->sc_dev, "frame too short (length=%d)\n", + m->m_pkthdr.len); + goto drop; + } + wh = mtod(m, struct ieee80211_frame_min *); + + if (macstat & BWN_RX_MAC_DEC && rx_mac_dec_rpt++ < 50) + device_printf(sc->sc_dev, + "RX decryption attempted (old %d keyidx %#x)\n", + BWN_ISOLDFMT(mac), + (macstat & BWN_RX_MAC_KEYIDX) >> BWN_RX_MAC_KEYIDX_SHIFT); + + /* XXX calculating RSSI & noise & antenna */ + + if (phystat0 & BWN_RX_PHYST0_OFDM) + rate = bwn_plcp_get_ofdmrate(mac, plcp, + phytype == BWN_PHYTYPE_A); + else + rate = bwn_plcp_get_cckrate(mac, plcp); + if (rate == -1) { + if (!(mac->mac_sc->sc_filters & BWN_MACCTL_PASS_BADPLCP)) + goto drop; + } + sc->sc_rx_rate = bwn_hwrate2ieeerate(rate); + + /* RX radio tap */ + if (ieee80211_radiotap_active(ic)) + bwn_rx_radiotap(mac, m, rxhdr, plcp, rate, rssi, noise); + m_adj(m, -IEEE80211_CRC_LEN); + + rssi = rxhdr->phy.abg.rssi; /* XXX incorrect RSSI calculation? */ + noise = mac->mac_stats.link_noise; + + BWN_UNLOCK(sc); + + ni = ieee80211_find_rxnode(ic, wh); + if (ni != NULL) { + type = ieee80211_input(ni, m, rssi, noise); + ieee80211_free_node(ni); + } else + type = ieee80211_input_all(ic, m, rssi, noise); + + BWN_LOCK(sc); + return; +drop: + device_printf(sc->sc_dev, "%s: dropped\n", __func__); +} + +static void +bwn_dma_handle_txeof(struct bwn_mac *mac, + const struct bwn_txstatus *status) +{ + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_dma_ring *dr; + struct bwn_dmadesc_generic *desc; + struct bwn_dmadesc_meta *meta; + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211_node *ni; + struct ifnet *ifp = sc->sc_ifp; + struct mbuf *m; + int slot; + + BWN_ASSERT_LOCKED(sc); + + dr = bwn_dma_parse_cookie(mac, status, status->cookie, &slot); + if (dr == NULL) { + device_printf(sc->sc_dev, "failed to parse cookie\n"); + return; + } + KASSERT(dr->dr_tx, ("%s:%d: fail", __func__, __LINE__)); + + while (1) { + KASSERT(slot >= 0 && slot < dr->dr_numslots, + ("%s:%d: fail", __func__, __LINE__)); + dr->getdesc(dr, slot, &desc, &meta); + + if (meta->mt_txtype == BWN_DMADESC_METATYPE_HEADER) + bus_dmamap_unload(dr->dr_txring_dtag, meta->mt_dmap); + else if (meta->mt_txtype == BWN_DMADESC_METATYPE_BODY) + bus_dmamap_unload(dma->txbuf_dtag, meta->mt_dmap); + + if (meta->mt_islast) { + KASSERT(meta->mt_m != NULL, + ("%s:%d: fail", __func__, __LINE__)); + + ni = meta->mt_ni; + m = meta->mt_m; + if (ni != NULL) { + /* + * Do any tx complete callback. Note this must + * be done before releasing the node reference. + */ + if (m->m_flags & M_TXCB) + ieee80211_process_callback(ni, m, 0); + ieee80211_free_node(ni); + meta->mt_ni = NULL; + } + m_freem(m); + meta->mt_m = NULL; + } else { + KASSERT(meta->mt_m == NULL, + ("%s:%d: fail", __func__, __LINE__)); + } + + dr->dr_usedslot--; + if (meta->mt_islast) { + ifp->if_opackets++; + break; + } + slot = bwn_dma_nextslot(dr, slot); + } + sc->sc_watchdog_timer = 0; + if (dr->dr_stop) { + KASSERT(bwn_dma_freeslot(dr) >= BWN_TX_SLOTS_PER_FRAME, + ("%s:%d: fail", __func__, __LINE__)); + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + dr->dr_stop = 0; + } +} + +static void +bwn_pio_handle_txeof(struct bwn_mac *mac, + const struct bwn_txstatus *status) +{ + struct bwn_pio_txqueue *tq; + struct bwn_pio_txpkt *tp = NULL; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + + BWN_ASSERT_LOCKED(sc); + + tq = bwn_pio_parse_cookie(mac, status->cookie, &tp); + if (tq == NULL) + return; + + tq->tq_used -= roundup(tp->tp_m->m_pkthdr.len + BWN_HDRSIZE(mac), 4); + tq->tq_free++; + + if (tp->tp_ni != NULL) { + /* + * Do any tx complete callback. Note this must + * be done before releasing the node reference. + */ + if (tp->tp_m->m_flags & M_TXCB) + ieee80211_process_callback(tp->tp_ni, tp->tp_m, 0); + ieee80211_free_node(tp->tp_ni); + tp->tp_ni = NULL; + } + m_freem(tp->tp_m); + tp->tp_m = NULL; + TAILQ_INSERT_TAIL(&tq->tq_pktlist, tp, tp_list); + + ifp->if_opackets++; + + sc->sc_watchdog_timer = 0; + if (tq->tq_stop) { + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + tq->tq_stop = 0; + } +} + +static void +bwn_phy_txpower_check(struct bwn_mac *mac, uint32_t flags) +{ + struct bwn_softc *sc = mac->mac_sc; + struct bwn_phy *phy = &mac->mac_phy; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct siba_softc *siba = mac->mac_sd->sd_bus; + unsigned long now; + int result; + + BWN_GETTIME(now); + + if (!(flags & BWN_TXPWR_IGNORE_TIME) && time_before(now, phy->nexttime)) + return; + phy->nexttime = now + 2 * 1000; + + if (siba->siba_board_vendor == SIBA_BOARDVENDOR_BCM && + siba->siba_board_type == SIBA_BOARD_BU4306) + return; + + if (phy->recalc_txpwr != NULL) { + result = phy->recalc_txpwr(mac, + (flags & BWN_TXPWR_IGNORE_TSSI) ? 1 : 0); + if (result == BWN_TXPWR_RES_DONE) + return; + KASSERT(result == BWN_TXPWR_RES_NEED_ADJUST, + ("%s: fail", __func__)); + KASSERT(phy->set_txpwr != NULL, ("%s: fail", __func__)); + + ieee80211_runtask(ic, &mac->mac_txpower); + } +} + +static uint16_t +bwn_pio_rx_read_2(struct bwn_pio_rxqueue *prq, uint16_t offset) +{ + + return (BWN_READ_2(prq->prq_mac, prq->prq_base + offset)); +} + +static uint32_t +bwn_pio_rx_read_4(struct bwn_pio_rxqueue *prq, uint16_t offset) +{ + + return (BWN_READ_4(prq->prq_mac, prq->prq_base + offset)); +} + +static void +bwn_pio_rx_write_2(struct bwn_pio_rxqueue *prq, uint16_t offset, uint16_t value) +{ + + BWN_WRITE_2(prq->prq_mac, prq->prq_base + offset, value); +} + +static void +bwn_pio_rx_write_4(struct bwn_pio_rxqueue *prq, uint16_t offset, uint32_t value) +{ + + BWN_WRITE_4(prq->prq_mac, prq->prq_base + offset, value); +} + +static int +bwn_ieeerate2hwrate(struct bwn_softc *sc, int rate) +{ + + switch (rate) { + /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ + case 12: + return (BWN_OFDM_RATE_6MB); + case 18: + return (BWN_OFDM_RATE_9MB); + case 24: + return (BWN_OFDM_RATE_12MB); + case 36: + return (BWN_OFDM_RATE_18MB); + case 48: + return (BWN_OFDM_RATE_24MB); + case 72: + return (BWN_OFDM_RATE_36MB); + case 96: + return (BWN_OFDM_RATE_48MB); + case 108: + return (BWN_OFDM_RATE_54MB); + /* CCK rates (NB: not IEEE std, device-specific) */ + case 2: + return (BWN_CCK_RATE_1MB); + case 4: + return (BWN_CCK_RATE_2MB); + case 11: + return (BWN_CCK_RATE_5MB); + case 22: + return (BWN_CCK_RATE_11MB); + } + + device_printf(sc->sc_dev, "unsupported rate %d\n", rate); + return (BWN_CCK_RATE_1MB); +} + +static int +bwn_set_txhdr(struct bwn_mac *mac, struct ieee80211_node *ni, + struct mbuf *m, struct bwn_txhdr *txhdr, uint16_t cookie) +{ + const struct bwn_phy *phy = &mac->mac_phy; + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211_frame *wh; + struct ieee80211_frame *protwh; + struct ieee80211_frame_cts *cts; + struct ieee80211_frame_rts *rts; + const struct ieee80211_txparam *tp; + struct ieee80211vap *vap = ni->ni_vap; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct mbuf *mprot; + unsigned int len; + uint32_t macctl = 0; + int protdur, rts_rate, rts_rate_fb, ismcast, isshort, rix, type; + uint16_t phyctl = 0; + uint8_t rate, rate_fb; + + wh = mtod(m, struct ieee80211_frame *); + memset(txhdr, 0, sizeof(*txhdr)); + + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); + isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0; + + /* + * Find TX rate + */ + tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; + if (type != IEEE80211_FC0_TYPE_DATA || (m->m_flags & M_EAPOL)) + rate = rate_fb = tp->mgmtrate; + else if (ismcast) + rate = rate_fb = tp->mcastrate; + else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) + rate = rate_fb = tp->ucastrate; + else { + rix = ieee80211_amrr_choose(ni, &BWN_NODE(ni)->bn_amn); + rate = ni->ni_txrate; + + if (rix > 0) + rate_fb = ni->ni_rates.rs_rates[rix - 1] & + IEEE80211_RATE_VAL; + else + rate_fb = rate; + } + + sc->sc_tx_rate = rate; + + rate = bwn_ieeerate2hwrate(sc, rate); + rate_fb = bwn_ieeerate2hwrate(sc, rate_fb); + + txhdr->phyrate = (BWN_ISOFDMRATE(rate)) ? bwn_plcp_getofdm(rate) : + bwn_plcp_getcck(rate); + bcopy(wh->i_fc, txhdr->macfc, sizeof(txhdr->macfc)); + bcopy(wh->i_addr1, txhdr->addr1, IEEE80211_ADDR_LEN); + + if ((rate_fb == rate) || + (*(u_int16_t *)wh->i_dur & htole16(0x8000)) || + (*(u_int16_t *)wh->i_dur == htole16(0))) + txhdr->dur_fb = *(u_int16_t *)wh->i_dur; + else + txhdr->dur_fb = ieee80211_compute_duration(ic->ic_rt, + m->m_pkthdr.len, rate, isshort); + + /* XXX TX encryption */ + bwn_plcp_genhdr(BWN_ISOLDFMT(mac) ? + (struct bwn_plcp4 *)(&txhdr->body.old.plcp) : + (struct bwn_plcp4 *)(&txhdr->body.new.plcp), + m->m_pkthdr.len + IEEE80211_CRC_LEN, rate); + bwn_plcp_genhdr((struct bwn_plcp4 *)(&txhdr->plcp_fb), + m->m_pkthdr.len + IEEE80211_CRC_LEN, rate_fb); + + txhdr->eftypes |= (BWN_ISOFDMRATE(rate_fb)) ? BWN_TX_EFT_FB_OFDM : + BWN_TX_EFT_FB_CCK; + txhdr->chan = phy->chan; + phyctl |= (BWN_ISOFDMRATE(rate)) ? BWN_TX_PHY_ENC_OFDM : + BWN_TX_PHY_ENC_CCK; + if (isshort && (rate == BWN_CCK_RATE_2MB || rate == BWN_CCK_RATE_5MB || + rate == BWN_CCK_RATE_11MB)) + phyctl |= BWN_TX_PHY_SHORTPRMBL; + + /* XXX TX antenna selection */ + + switch (bwn_antenna_sanitize(mac, 0)) { + case 0: + phyctl |= BWN_TX_PHY_ANT01AUTO; + break; + case 1: + phyctl |= BWN_TX_PHY_ANT0; + break; + case 2: + phyctl |= BWN_TX_PHY_ANT1; + break; + case 3: + phyctl |= BWN_TX_PHY_ANT2; + break; + case 4: + phyctl |= BWN_TX_PHY_ANT3; + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + + if (!ismcast) + macctl |= BWN_TX_MAC_ACK; + + macctl |= (BWN_TX_MAC_HWSEQ | BWN_TX_MAC_START_MSDU); + if (!IEEE80211_IS_MULTICAST(wh->i_addr1) && + m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold) + macctl |= BWN_TX_MAC_LONGFRAME; + + if (ic->ic_flags & IEEE80211_F_USEPROT) { + /* XXX RTS rate is always 1MB??? */ + rts_rate = BWN_CCK_RATE_1MB; + rts_rate_fb = bwn_get_fbrate(rts_rate); + + protdur = ieee80211_compute_duration(ic->ic_rt, + m->m_pkthdr.len, rate, isshort) + + + ieee80211_ack_duration(ic->ic_rt, rate, isshort); + + if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) { + cts = (struct ieee80211_frame_cts *)(BWN_ISOLDFMT(mac) ? + (txhdr->body.old.rts_frame) : + (txhdr->body.new.rts_frame)); + mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, + protdur); + KASSERT(mprot != NULL, ("failed to alloc mbuf\n")); + bcopy(mtod(mprot, uint8_t *), (uint8_t *)cts, + mprot->m_pkthdr.len); + m_freem(mprot); + macctl |= BWN_TX_MAC_SEND_CTSTOSELF; + len = sizeof(struct ieee80211_frame_cts); + } else { + rts = (struct ieee80211_frame_rts *)(BWN_ISOLDFMT(mac) ? + (txhdr->body.old.rts_frame) : + (txhdr->body.new.rts_frame)); + protdur += ieee80211_ack_duration(ic->ic_rt, rate, + isshort); + mprot = ieee80211_alloc_rts(ic, wh->i_addr1, + wh->i_addr2, protdur); + KASSERT(mprot != NULL, ("failed to alloc mbuf\n")); + bcopy(mtod(mprot, uint8_t *), (uint8_t *)rts, + mprot->m_pkthdr.len); + m_freem(mprot); + macctl |= BWN_TX_MAC_SEND_RTSCTS; + len = sizeof(struct ieee80211_frame_rts); + } + len += IEEE80211_CRC_LEN; + bwn_plcp_genhdr((struct bwn_plcp4 *)((BWN_ISOLDFMT(mac)) ? + &txhdr->body.old.rts_plcp : + &txhdr->body.new.rts_plcp), len, rts_rate); + bwn_plcp_genhdr((struct bwn_plcp4 *)&txhdr->rts_plcp_fb, len, + rts_rate_fb); + + protwh = (struct ieee80211_frame *)(BWN_ISOLDFMT(mac) ? + (&txhdr->body.old.rts_frame) : + (&txhdr->body.new.rts_frame)); + txhdr->rts_dur_fb = *(u_int16_t *)protwh->i_dur; + + if (BWN_ISOFDMRATE(rts_rate)) { + txhdr->eftypes |= BWN_TX_EFT_RTS_OFDM; + txhdr->phyrate_rts = bwn_plcp_getofdm(rts_rate); + } else { + txhdr->eftypes |= BWN_TX_EFT_RTS_CCK; + txhdr->phyrate_rts = bwn_plcp_getcck(rts_rate); + } + txhdr->eftypes |= (BWN_ISOFDMRATE(rts_rate_fb)) ? + BWN_TX_EFT_RTS_FBOFDM : BWN_TX_EFT_RTS_FBCCK; + } + + if (BWN_ISOLDFMT(mac)) + txhdr->body.old.cookie = htole16(cookie); + else + txhdr->body.new.cookie = htole16(cookie); + + txhdr->macctl = htole32(macctl); + txhdr->phyctl = htole16(phyctl); + + /* + * TX radio tap + */ + if (ieee80211_radiotap_active_vap(vap)) { + sc->sc_tx_th.wt_flags = 0; + if (wh->i_fc[1] & IEEE80211_FC1_WEP) + sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP; + if (isshort && + (rate == BWN_CCK_RATE_2MB || rate == BWN_CCK_RATE_5MB || + rate == BWN_CCK_RATE_11MB)) + sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + sc->sc_tx_th.wt_rate = rate; + + ieee80211_radiotap_tx(vap, m); + } + + return (0); +} + +static void +bwn_plcp_genhdr(struct bwn_plcp4 *plcp, const uint16_t octets, + const uint8_t rate) +{ + uint32_t d, plen; + uint8_t *raw = plcp->o.raw; + + if (BWN_ISOFDMRATE(rate)) { + d = bwn_plcp_getofdm(rate); + KASSERT(!(octets & 0xf000), + ("%s:%d: fail", __func__, __LINE__)); + d |= (octets << 5); + plcp->o.data = htole32(d); + } else { + plen = octets * 16 / rate; + if ((octets * 16 % rate) > 0) { + plen++; + if ((rate == BWN_CCK_RATE_11MB) + && ((octets * 8 % 11) < 4)) { + raw[1] = 0x84; + } else + raw[1] = 0x04; + } else + raw[1] = 0x04; + plcp->o.data |= htole32(plen << 16); + raw[0] = bwn_plcp_getcck(rate); + } +} + +static uint8_t +bwn_antenna_sanitize(struct bwn_mac *mac, uint8_t n) +{ + uint8_t mask; + + if (n == 0) + return (0); + if (mac->mac_phy.gmode) + mask = mac->mac_sd->sd_bus->siba_sprom.ant_bg; + else + mask = mac->mac_sd->sd_bus->siba_sprom.ant_a; + if (!(mask & (1 << (n - 1)))) + return (0); + return (n); +} + +static uint8_t +bwn_get_fbrate(uint8_t bitrate) +{ + switch (bitrate) { + case BWN_CCK_RATE_1MB: + return (BWN_CCK_RATE_1MB); + case BWN_CCK_RATE_2MB: + return (BWN_CCK_RATE_1MB); + case BWN_CCK_RATE_5MB: + return (BWN_CCK_RATE_2MB); + case BWN_CCK_RATE_11MB: + return (BWN_CCK_RATE_5MB); + case BWN_OFDM_RATE_6MB: + return (BWN_CCK_RATE_5MB); + case BWN_OFDM_RATE_9MB: + return (BWN_OFDM_RATE_6MB); + case BWN_OFDM_RATE_12MB: + return (BWN_OFDM_RATE_9MB); + case BWN_OFDM_RATE_18MB: + return (BWN_OFDM_RATE_12MB); + case BWN_OFDM_RATE_24MB: + return (BWN_OFDM_RATE_18MB); + case BWN_OFDM_RATE_36MB: + return (BWN_OFDM_RATE_24MB); + case BWN_OFDM_RATE_48MB: + return (BWN_OFDM_RATE_36MB); + case BWN_OFDM_RATE_54MB: + return (BWN_OFDM_RATE_48MB); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (0); +} + +static uint32_t +bwn_pio_write_multi_4(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, + uint32_t ctl, const void *_data, int len) +{ + uint32_t value = 0; + const uint8_t *data = _data; + + ctl |= BWN_PIO8_TXCTL_0_7 | BWN_PIO8_TXCTL_8_15 | + BWN_PIO8_TXCTL_16_23 | BWN_PIO8_TXCTL_24_31; + bwn_pio_write_4(mac, tq, BWN_PIO8_TXCTL, ctl); + + siba_write_multi_4(mac->mac_sd, data, (len & ~3), + tq->tq_base + BWN_PIO8_TXDATA); + if (len & 3) { + ctl &= ~(BWN_PIO8_TXCTL_8_15 | BWN_PIO8_TXCTL_16_23 | + BWN_PIO8_TXCTL_24_31); + data = &(data[len - 1]); + switch (len & 3) { + case 3: + ctl |= BWN_PIO8_TXCTL_16_23; + value |= (uint32_t)(*data) << 16; + data--; + case 2: + ctl |= BWN_PIO8_TXCTL_8_15; + value |= (uint32_t)(*data) << 8; + data--; + case 1: + value |= (uint32_t)(*data); + } + bwn_pio_write_4(mac, tq, BWN_PIO8_TXCTL, ctl); + bwn_pio_write_4(mac, tq, BWN_PIO8_TXDATA, value); + } + + return (ctl); +} + +static void +bwn_pio_write_4(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, + uint16_t offset, uint32_t value) +{ + + BWN_WRITE_4(mac, tq->tq_base + offset, value); +} + +static uint16_t +bwn_pio_write_multi_2(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, + uint16_t ctl, const void *_data, int len) +{ + const uint8_t *data = _data; + + ctl |= BWN_PIO_TXCTL_WRITELO | BWN_PIO_TXCTL_WRITEHI; + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); + + siba_write_multi_2(mac->mac_sd, data, (len & ~1), + tq->tq_base + BWN_PIO_TXDATA); + if (len & 1) { + ctl &= ~BWN_PIO_TXCTL_WRITEHI; + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXDATA, data[len - 1]); + } + + return (ctl); +} + +static uint16_t +bwn_pio_write_mbuf_2(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, + uint16_t ctl, struct mbuf *m0) +{ + int i, j = 0; + uint16_t data = 0; + const uint8_t *buf; + struct mbuf *m = m0; + + ctl |= BWN_PIO_TXCTL_WRITELO | BWN_PIO_TXCTL_WRITEHI; + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); + + for (; m != NULL; m = m->m_next) { + buf = mtod(m, const uint8_t *); + for (i = 0; i < m->m_len; i++) { + if (!((j++) % 2)) + data |= buf[i]; + else { + data |= (buf[i] << 8); + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXDATA, data); + data = 0; + } + } + } + if (m0->m_pkthdr.len % 2) { + ctl &= ~BWN_PIO_TXCTL_WRITEHI; + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); + BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXDATA, data); + } + + return (ctl); +} + +static void +bwn_set_slot_time(struct bwn_mac *mac, uint16_t time) +{ + + if (mac->mac_phy.type != BWN_PHYTYPE_G) + return; + BWN_WRITE_2(mac, 0x684, 510 + time); + bwn_shm_write_2(mac, BWN_SHARED, 0x0010, time); +} + +static struct bwn_dma_ring * +bwn_dma_select(struct bwn_mac *mac, uint8_t prio) +{ + + if ((mac->mac_flags & BWN_MAC_FLAG_WME) == 0) + return (mac->mac_method.dma.wme[WME_AC_BE]); + + switch (prio) { + case 3: + return (mac->mac_method.dma.wme[WME_AC_VO]); + case 2: + return (mac->mac_method.dma.wme[WME_AC_VI]); + case 0: + return (mac->mac_method.dma.wme[WME_AC_BE]); + case 1: + return (mac->mac_method.dma.wme[WME_AC_BK]); + } + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + return (NULL); +} + +static int +bwn_dma_getslot(struct bwn_dma_ring *dr) +{ + int slot; + + BWN_ASSERT_LOCKED(dr->dr_mac->mac_sc); + + KASSERT(dr->dr_tx, ("%s:%d: fail", __func__, __LINE__)); + KASSERT(!(dr->dr_stop), ("%s:%d: fail", __func__, __LINE__)); + KASSERT(bwn_dma_freeslot(dr) != 0, ("%s:%d: fail", __func__, __LINE__)); + + slot = bwn_dma_nextslot(dr, dr->dr_curslot); + KASSERT(!(slot & ~0x0fff), ("%s:%d: fail", __func__, __LINE__)); + dr->dr_curslot = slot; + dr->dr_usedslot++; + + return (slot); +} + +static int +bwn_phy_shm_tssi_read(struct bwn_mac *mac, uint16_t shm_offset) +{ + const uint8_t ofdm = (shm_offset != BWN_SHARED_TSSI_CCK); + unsigned int a, b, c, d; + unsigned int avg; + uint32_t tmp; + + tmp = bwn_shm_read_4(mac, BWN_SHARED, shm_offset); + a = tmp & 0xff; + b = (tmp >> 8) & 0xff; + c = (tmp >> 16) & 0xff; + d = (tmp >> 24) & 0xff; + if (a == 0 || a == BWN_TSSI_MAX || b == 0 || b == BWN_TSSI_MAX || + c == 0 || c == BWN_TSSI_MAX || d == 0 || d == BWN_TSSI_MAX) + return (ENOENT); + bwn_shm_write_4(mac, BWN_SHARED, shm_offset, + BWN_TSSI_MAX | (BWN_TSSI_MAX << 8) | + (BWN_TSSI_MAX << 16) | (BWN_TSSI_MAX << 24)); + + if (ofdm) { + a = (a + 32) & 0x3f; + b = (b + 32) & 0x3f; + c = (c + 32) & 0x3f; + d = (d + 32) & 0x3f; + } + + avg = (a + b + c + d + 2) / 4; + if (ofdm) { + if (bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFLO) + & BWN_HF_4DB_CCK_POWERBOOST) + avg = (avg >= 13) ? (avg - 13) : 0; + } + return (avg); +} + +static void +bwn_phy_g_setatt(struct bwn_mac *mac, int *bbattp, int *rfattp) +{ + struct bwn_txpwr_loctl *lo = &mac->mac_phy.phy_g.pg_loctl; + int rfatt = *rfattp; + int bbatt = *bbattp; + + while (1) { + if (rfatt > lo->rfatt.max && bbatt > lo->bbatt.max - 4) + break; + if (rfatt < lo->rfatt.min && bbatt < lo->bbatt.min + 4) + break; + if (bbatt > lo->bbatt.max && rfatt > lo->rfatt.max - 1) + break; + if (bbatt < lo->bbatt.min && rfatt < lo->rfatt.min + 1) + break; + if (bbatt > lo->bbatt.max) { + bbatt -= 4; + rfatt += 1; + continue; + } + if (bbatt < lo->bbatt.min) { + bbatt += 4; + rfatt -= 1; + continue; + } + if (rfatt > lo->rfatt.max) { + rfatt -= 1; + bbatt += 4; + continue; + } + if (rfatt < lo->rfatt.min) { + rfatt += 1; + bbatt -= 4; + continue; + } + break; + } + + *rfattp = MIN(MAX(rfatt, lo->rfatt.min), lo->rfatt.max); + *bbattp = MIN(MAX(bbatt, lo->bbatt.min), lo->bbatt.max); +} + +static void +bwn_phy_lock(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + + KASSERT(mac->mac_sd->sd_id.sd_rev >= 3, + ("%s: unsupported rev %d", __func__, mac->mac_sd->sd_id.sd_rev)); + + if (ic->ic_opmode != IEEE80211_M_HOSTAP) + bwn_psctl(mac, BWN_PS_AWAKE); +} + +static void +bwn_phy_unlock(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + + KASSERT(mac->mac_sd->sd_id.sd_rev >= 3, + ("%s: unsupported rev %d", __func__, mac->mac_sd->sd_id.sd_rev)); + + if (ic->ic_opmode != IEEE80211_M_HOSTAP) + bwn_psctl(mac, 0); +} + +static void +bwn_rf_lock(struct bwn_mac *mac) +{ + + BWN_WRITE_4(mac, BWN_MACCTL, + BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_RADIO_LOCK); + BWN_READ_4(mac, BWN_MACCTL); + DELAY(10); +} + +static void +bwn_rf_unlock(struct bwn_mac *mac) +{ + + BWN_READ_2(mac, BWN_PHYVER); + BWN_WRITE_4(mac, BWN_MACCTL, + BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_RADIO_LOCK); +} + +static struct bwn_pio_txqueue * +bwn_pio_parse_cookie(struct bwn_mac *mac, uint16_t cookie, + struct bwn_pio_txpkt **pack) +{ + struct bwn_pio *pio = &mac->mac_method.pio; + struct bwn_pio_txqueue *tq = NULL; + unsigned int index; + + switch (cookie & 0xf000) { + case 0x1000: + tq = &pio->wme[WME_AC_BK]; + break; + case 0x2000: + tq = &pio->wme[WME_AC_BE]; + break; + case 0x3000: + tq = &pio->wme[WME_AC_VI]; + break; + case 0x4000: + tq = &pio->wme[WME_AC_VO]; + break; + case 0x5000: + tq = &pio->mcast; + break; + } + KASSERT(tq != NULL, ("%s:%d: fail", __func__, __LINE__)); + if (tq == NULL) + return (NULL); + index = (cookie & 0x0fff); + KASSERT(index < N(tq->tq_pkts), ("%s:%d: fail", __func__, __LINE__)); + if (index >= N(tq->tq_pkts)) + return (NULL); + *pack = &tq->tq_pkts[index]; + KASSERT(*pack != NULL, ("%s:%d: fail", __func__, __LINE__)); + return (tq); +} + +static void +bwn_txpwr(void *arg, int npending) +{ + struct bwn_mac *mac = arg; + struct bwn_softc *sc = mac->mac_sc; + + BWN_LOCK(sc); + if (mac && mac->mac_status >= BWN_MAC_STATUS_STARTED && + mac->mac_phy.set_txpwr != NULL) + mac->mac_phy.set_txpwr(mac); + BWN_UNLOCK(sc); +} + +static void +bwn_task_15s(struct bwn_mac *mac) +{ + uint16_t reg; + + if (mac->mac_fw.opensource) { + reg = bwn_shm_read_2(mac, BWN_SCRATCH, BWN_WATCHDOG_REG); + if (reg) { + bwn_restart(mac, "fw watchdog"); + return; + } + bwn_shm_write_2(mac, BWN_SCRATCH, BWN_WATCHDOG_REG, 1); + } + if (mac->mac_phy.task_15s) + mac->mac_phy.task_15s(mac); + + mac->mac_phy.txerrors = BWN_TXERROR_MAX; +} + +static void +bwn_task_30s(struct bwn_mac *mac) +{ + + if (mac->mac_phy.type != BWN_PHYTYPE_G || mac->mac_noise.noi_running) + return; + mac->mac_noise.noi_running = 1; + mac->mac_noise.noi_nsamples = 0; + + bwn_noise_gensample(mac); +} + +static void +bwn_task_60s(struct bwn_mac *mac) +{ + + if (mac->mac_phy.task_60s) + mac->mac_phy.task_60s(mac); + bwn_phy_txpower_check(mac, BWN_TXPWR_IGNORE_TIME); +} + +static void +bwn_tasks(void *arg) +{ + struct bwn_mac *mac = arg; + struct bwn_softc *sc = mac->mac_sc; + + BWN_ASSERT_LOCKED(sc); + if (mac->mac_status != BWN_MAC_STATUS_STARTED) + return; + + if (mac->mac_task_state % 4 == 0) + bwn_task_60s(mac); + if (mac->mac_task_state % 2 == 0) + bwn_task_30s(mac); + bwn_task_15s(mac); + + mac->mac_task_state++; + callout_reset(&sc->sc_task_ch, hz * 15, bwn_tasks, mac); +} + +static int +bwn_plcp_get_ofdmrate(struct bwn_mac *mac, struct bwn_plcp6 *plcp, uint8_t a) +{ + struct bwn_softc *sc = mac->mac_sc; + + KASSERT(a == 0, ("not support APHY\n")); + + switch (plcp->o.raw[0] & 0xf) { + case 0xb: + return (BWN_OFDM_RATE_6MB); + case 0xf: + return (BWN_OFDM_RATE_9MB); + case 0xa: + return (BWN_OFDM_RATE_12MB); + case 0xe: + return (BWN_OFDM_RATE_18MB); + case 0x9: + return (BWN_OFDM_RATE_24MB); + case 0xd: + return (BWN_OFDM_RATE_36MB); + case 0x8: + return (BWN_OFDM_RATE_48MB); + case 0xc: + return (BWN_OFDM_RATE_54MB); + } + device_printf(sc->sc_dev, "incorrect OFDM rate %d\n", + plcp->o.raw[0] & 0xf); + return (-1); +} + +static int +bwn_plcp_get_cckrate(struct bwn_mac *mac, struct bwn_plcp6 *plcp) +{ + struct bwn_softc *sc = mac->mac_sc; + + switch (plcp->o.raw[0]) { + case 0x0a: + return (BWN_CCK_RATE_1MB); + case 0x14: + return (BWN_CCK_RATE_2MB); + case 0x37: + return (BWN_CCK_RATE_5MB); + case 0x6e: + return (BWN_CCK_RATE_11MB); + } + device_printf(sc->sc_dev, "incorrect CCK rate %d\n", plcp->o.raw[0]); + return (-1); +} + +static void +bwn_rx_radiotap(struct bwn_mac *mac, struct mbuf *m, + const struct bwn_rxhdr4 *rxhdr, struct bwn_plcp6 *plcp, int rate, + int rssi, int noise) +{ + struct bwn_softc *sc = mac->mac_sc; + const struct ieee80211_frame_min *wh; + uint64_t tsf; + uint16_t low_mactime_now; + + if (htole16(rxhdr->phy_status0) & BWN_RX_PHYST0_SHORTPRMBL) + sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + + wh = mtod(m, const struct ieee80211_frame_min *); + if (wh->i_fc[1] & IEEE80211_FC1_WEP) + sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_WEP; + + bwn_tsf_read(mac, &tsf); + low_mactime_now = tsf; + tsf = tsf & ~0xffffULL; + tsf += le16toh(rxhdr->mac_time); + if (low_mactime_now < le16toh(rxhdr->mac_time)) + tsf -= 0x10000; + + sc->sc_rx_th.wr_tsf = tsf; + sc->sc_rx_th.wr_rate = rate; + sc->sc_rx_th.wr_antsignal = rssi; + sc->sc_rx_th.wr_antnoise = noise; +} + +static void +bwn_tsf_read(struct bwn_mac *mac, uint64_t *tsf) +{ + uint32_t low, high; + + KASSERT(mac->mac_sd->sd_id.sd_rev >= 3, + ("%s:%d: fail", __func__, __LINE__)); + + low = BWN_READ_4(mac, BWN_REV3PLUS_TSF_LOW); + high = BWN_READ_4(mac, BWN_REV3PLUS_TSF_HIGH); + *tsf = high; + *tsf <<= 32; + *tsf |= low; +} + +static int +bwn_dma_attach(struct bwn_mac *mac) +{ + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_softc *sc = mac->mac_sc; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + bus_addr_t lowaddr = 0; + int error; + + if (siba->siba_type == SIBA_TYPE_PCMCIA || bwn_usedma == 0) + return (0); + + KASSERT(mac->mac_sd->sd_id.sd_rev >= 5, ("%s: fail", __func__)); + + mac->mac_flags |= BWN_MAC_FLAG_DMA; + + dma->dmatype = bwn_dma_gettype(mac); + if (dma->dmatype == BWN_DMA_30BIT) + lowaddr = BWN_BUS_SPACE_MAXADDR_30BIT; + else if (dma->dmatype == BWN_DMA_32BIT) + lowaddr = BUS_SPACE_MAXADDR_32BIT; + else + lowaddr = BUS_SPACE_MAXADDR; + + /* + * Create top level DMA tag + */ + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), /* parent */ + BWN_ALIGN, 0, /* alignment, bounds */ + lowaddr, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MAXBSIZE, /* maxsize */ + BUS_SPACE_UNRESTRICTED, /* nsegments */ + BUS_SPACE_MAXSIZE, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &dma->parent_dtag); + if (error) { + device_printf(sc->sc_dev, "can't create parent DMA tag\n"); + return (error); + } + + /* + * Create TX/RX mbuf DMA tag + */ + error = bus_dma_tag_create(dma->parent_dtag, + 1, + 0, + BUS_SPACE_MAXADDR, + BUS_SPACE_MAXADDR, + NULL, NULL, + MCLBYTES, + 1, + BUS_SPACE_MAXSIZE_32BIT, + 0, + NULL, NULL, + &dma->rxbuf_dtag); + if (error) { + device_printf(sc->sc_dev, "can't create mbuf DMA tag\n"); + goto fail0; + } + error = bus_dma_tag_create(dma->parent_dtag, + 1, + 0, + BUS_SPACE_MAXADDR, + BUS_SPACE_MAXADDR, + NULL, NULL, + MCLBYTES, + 1, + BUS_SPACE_MAXSIZE_32BIT, + 0, + NULL, NULL, + &dma->txbuf_dtag); + if (error) { + device_printf(sc->sc_dev, "can't create mbuf DMA tag\n"); + goto fail1; + } + + dma->wme[WME_AC_BK] = bwn_dma_ringsetup(mac, 0, 1, dma->dmatype); + if (!dma->wme[WME_AC_BK]) + goto fail2; + + dma->wme[WME_AC_BE] = bwn_dma_ringsetup(mac, 1, 1, dma->dmatype); + if (!dma->wme[WME_AC_BE]) + goto fail3; + + dma->wme[WME_AC_VI] = bwn_dma_ringsetup(mac, 2, 1, dma->dmatype); + if (!dma->wme[WME_AC_VI]) + goto fail4; + + dma->wme[WME_AC_VO] = bwn_dma_ringsetup(mac, 3, 1, dma->dmatype); + if (!dma->wme[WME_AC_VO]) + goto fail5; + + dma->mcast = bwn_dma_ringsetup(mac, 4, 1, dma->dmatype); + if (!dma->mcast) + goto fail6; + dma->rx = bwn_dma_ringsetup(mac, 0, 0, dma->dmatype); + if (!dma->rx) + goto fail7; + + return (error); + +fail7: bwn_dma_ringfree(&dma->mcast); +fail6: bwn_dma_ringfree(&dma->wme[WME_AC_VO]); +fail5: bwn_dma_ringfree(&dma->wme[WME_AC_VI]); +fail4: bwn_dma_ringfree(&dma->wme[WME_AC_BE]); +fail3: bwn_dma_ringfree(&dma->wme[WME_AC_BK]); +fail2: bus_dma_tag_destroy(dma->txbuf_dtag); +fail1: bus_dma_tag_destroy(dma->rxbuf_dtag); +fail0: bus_dma_tag_destroy(dma->parent_dtag); + return (error); +} + +static struct bwn_dma_ring * +bwn_dma_parse_cookie(struct bwn_mac *mac, const struct bwn_txstatus *status, + uint16_t cookie, int *slot) +{ + struct bwn_dma *dma = &mac->mac_method.dma; + struct bwn_dma_ring *dr; + struct bwn_softc *sc = mac->mac_sc; + + BWN_ASSERT_LOCKED(mac->mac_sc); + + switch (cookie & 0xf000) { + case 0x1000: + dr = dma->wme[WME_AC_BK]; + break; + case 0x2000: + dr = dma->wme[WME_AC_BE]; + break; + case 0x3000: + dr = dma->wme[WME_AC_VI]; + break; + case 0x4000: + dr = dma->wme[WME_AC_VO]; + break; + case 0x5000: + dr = dma->mcast; + break; + default: + dr = NULL; + KASSERT(0 == 1, + ("invalid cookie value %d", cookie & 0xf000)); + } + *slot = (cookie & 0x0fff); + if (*slot < 0 || *slot >= dr->dr_numslots) { + /* + * XXX FIXME: sometimes H/W returns TX DONE events duplicately + * that it occurs events which have same H/W sequence numbers. + * When it's occurred just prints a WARNING msgs and ignores. + */ + KASSERT(status->seq == dma->lastseq, + ("%s:%d: fail", __func__, __LINE__)); + device_printf(sc->sc_dev, + "out of slot ranges (0 < %d < %d)\n", *slot, + dr->dr_numslots); + return (NULL); + } + dma->lastseq = status->seq; + return (dr); +} + +static void +bwn_dma_stop(struct bwn_mac *mac) +{ + struct bwn_dma *dma; + + if ((mac->mac_flags & BWN_MAC_FLAG_DMA) == 0) + return; + dma = &mac->mac_method.dma; + + bwn_dma_ringstop(&dma->rx); + bwn_dma_ringstop(&dma->wme[WME_AC_BK]); + bwn_dma_ringstop(&dma->wme[WME_AC_BE]); + bwn_dma_ringstop(&dma->wme[WME_AC_VI]); + bwn_dma_ringstop(&dma->wme[WME_AC_VO]); + bwn_dma_ringstop(&dma->mcast); +} + +static void +bwn_dma_ringstop(struct bwn_dma_ring **dr) +{ + + if (dr == NULL) + return; + + bwn_dma_cleanup(*dr); +} + +static void +bwn_pio_stop(struct bwn_mac *mac) +{ + struct bwn_pio *pio; + + if (mac->mac_flags & BWN_MAC_FLAG_DMA) + return; + pio = &mac->mac_method.pio; + + bwn_destroy_queue_tx(&pio->mcast); + bwn_destroy_queue_tx(&pio->wme[WME_AC_VO]); + bwn_destroy_queue_tx(&pio->wme[WME_AC_VI]); + bwn_destroy_queue_tx(&pio->wme[WME_AC_BE]); + bwn_destroy_queue_tx(&pio->wme[WME_AC_BK]); +} + +static void +bwn_led_attach(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct siba_softc *siba = mac->mac_sd->sd_bus; + const uint8_t *led_act = NULL; + uint16_t val[BWN_LED_MAX]; + int i; + + sc->sc_led_idle = (2350 * hz) / 1000; + sc->sc_led_blink = 1; + + for (i = 0; i < N(bwn_vendor_led_act); ++i) { + if (siba->siba_pci_subvid == bwn_vendor_led_act[i].vid) { + led_act = bwn_vendor_led_act[i].led_act; + break; + } + } + if (led_act == NULL) + led_act = bwn_default_led_act; + + val[0] = siba->siba_sprom.gpio0; + val[1] = siba->siba_sprom.gpio1; + val[2] = siba->siba_sprom.gpio2; + val[3] = siba->siba_sprom.gpio3; + + for (i = 0; i < BWN_LED_MAX; ++i) { + struct bwn_led *led = &sc->sc_leds[i]; + + if (val[i] == 0xff) { + led->led_act = led_act[i]; + } else { + if (val[i] & BWN_LED_ACT_LOW) + led->led_flags |= BWN_LED_F_ACTLOW; + led->led_act = val[i] & BWN_LED_ACT_MASK; + } + led->led_mask = (1 << i); + + if (led->led_act == BWN_LED_ACT_BLINK_SLOW || + led->led_act == BWN_LED_ACT_BLINK_POLL || + led->led_act == BWN_LED_ACT_BLINK) { + led->led_flags |= BWN_LED_F_BLINK; + if (led->led_act == BWN_LED_ACT_BLINK_POLL) + led->led_flags |= BWN_LED_F_POLLABLE; + else if (led->led_act == BWN_LED_ACT_BLINK_SLOW) + led->led_flags |= BWN_LED_F_SLOW; + + if (sc->sc_blink_led == NULL) { + sc->sc_blink_led = led; + if (led->led_flags & BWN_LED_F_SLOW) + BWN_LED_SLOWDOWN(sc->sc_led_idle); + } + } + + DPRINTF(sc, BWN_DEBUG_LED, + "%dth led, act %d, lowact %d\n", i, + led->led_act, led->led_flags & BWN_LED_F_ACTLOW); + } + callout_init_mtx(&sc->sc_led_blink_ch, &sc->sc_mtx, 0); +} + +static __inline uint16_t +bwn_led_onoff(const struct bwn_led *led, uint16_t val, int on) +{ + + if (led->led_flags & BWN_LED_F_ACTLOW) + on = !on; + if (on) + val |= led->led_mask; + else + val &= ~led->led_mask; + return val; +} + +static void +bwn_led_newstate(struct bwn_mac *mac, enum ieee80211_state nstate) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint16_t val; + int i; + + if (nstate == IEEE80211_S_INIT) { + callout_stop(&sc->sc_led_blink_ch); + sc->sc_led_blinking = 0; + } + + if ((ic->ic_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; + + val = BWN_READ_2(mac, BWN_GPIO_CONTROL); + for (i = 0; i < BWN_LED_MAX; ++i) { + struct bwn_led *led = &sc->sc_leds[i]; + int on; + + if (led->led_act == BWN_LED_ACT_UNKN || + led->led_act == BWN_LED_ACT_NULL) + continue; + + if ((led->led_flags & BWN_LED_F_BLINK) && + nstate != IEEE80211_S_INIT) + continue; + + switch (led->led_act) { + case BWN_LED_ACT_ON: /* Always on */ + on = 1; + break; + case BWN_LED_ACT_OFF: /* Always off */ + case BWN_LED_ACT_5GHZ: /* TODO: 11A */ + on = 0; + break; + default: + on = 1; + switch (nstate) { + case IEEE80211_S_INIT: + on = 0; + break; + case IEEE80211_S_RUN: + if (led->led_act == BWN_LED_ACT_11G && + ic->ic_curmode != IEEE80211_MODE_11G) + on = 0; + break; + default: + if (led->led_act == BWN_LED_ACT_ASSOC) + on = 0; + break; + } + break; + } + + val = bwn_led_onoff(led, val, on); + } + BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); +} + +static void +bwn_led_event(struct bwn_mac *mac, int event) +{ + struct bwn_softc *sc = mac->mac_sc; + struct bwn_led *led = sc->sc_blink_led; + int rate; + + if (event == BWN_LED_EVENT_POLL) { + if ((led->led_flags & BWN_LED_F_POLLABLE) == 0) + return; + if (ticks - sc->sc_led_ticks < sc->sc_led_idle) + return; + } + + sc->sc_led_ticks = ticks; + if (sc->sc_led_blinking) + return; + + switch (event) { + case BWN_LED_EVENT_RX: + rate = sc->sc_rx_rate; + break; + case BWN_LED_EVENT_TX: + rate = sc->sc_tx_rate; + break; + case BWN_LED_EVENT_POLL: + rate = 0; + break; + default: + panic("unknown LED event %d\n", event); + break; + } + bwn_led_blink_start(mac, bwn_led_duration[rate].on_dur, + bwn_led_duration[rate].off_dur); +} + +static void +bwn_led_blink_start(struct bwn_mac *mac, int on_dur, int off_dur) +{ + struct bwn_softc *sc = mac->mac_sc; + struct bwn_led *led = sc->sc_blink_led; + uint16_t val; + + val = BWN_READ_2(mac, BWN_GPIO_CONTROL); + val = bwn_led_onoff(led, val, 1); + BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); + + if (led->led_flags & BWN_LED_F_SLOW) { + BWN_LED_SLOWDOWN(on_dur); + BWN_LED_SLOWDOWN(off_dur); + } + + sc->sc_led_blinking = 1; + sc->sc_led_blink_offdur = off_dur; + + callout_reset(&sc->sc_led_blink_ch, on_dur, bwn_led_blink_next, mac); +} + +static void +bwn_led_blink_next(void *arg) +{ + struct bwn_mac *mac = arg; + struct bwn_softc *sc = mac->mac_sc; + uint16_t val; + + val = BWN_READ_2(mac, BWN_GPIO_CONTROL); + val = bwn_led_onoff(sc->sc_blink_led, val, 0); + BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); + + callout_reset(&sc->sc_led_blink_ch, sc->sc_led_blink_offdur, + bwn_led_blink_end, mac); +} + +static void +bwn_led_blink_end(void *arg) +{ + struct bwn_mac *mac = arg; + struct bwn_softc *sc = mac->mac_sc; + + sc->sc_led_blinking = 0; +} + +static int +bwn_suspend(device_t dev) +{ + struct bwn_softc *sc = device_get_softc(dev); + + bwn_stop(sc, 1); + return (0); +} + +static int +bwn_resume(device_t dev) +{ + struct bwn_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->sc_ifp; + + if (ifp->if_flags & IFF_UP) + bwn_init(sc); + return (0); +} + +static void +bwn_rfswitch(void *arg) +{ + struct bwn_softc *sc = arg; + struct bwn_mac *mac = sc->sc_curmac; + int cur = 0, prev = 0; + + KASSERT(mac->mac_status >= BWN_MAC_STATUS_STARTED, + ("%s: invalid MAC status %d", __func__, mac->mac_status)); + + if (mac->mac_phy.rf_rev >= 3 || mac->mac_phy.type == BWN_PHYTYPE_LP) { + if (!(BWN_READ_4(mac, BWN_RF_HWENABLED_HI) + & BWN_RF_HWENABLED_HI_MASK)) + cur = 1; + } else { + if (BWN_READ_2(mac, BWN_RF_HWENABLED_LO) + & BWN_RF_HWENABLED_LO_MASK) + cur = 1; + } + + if (mac->mac_flags & BWN_MAC_FLAG_RADIO_ON) + prev = 1; + + if (cur != prev) { + if (cur) + mac->mac_flags |= BWN_MAC_FLAG_RADIO_ON; + else + mac->mac_flags &= ~BWN_MAC_FLAG_RADIO_ON; + + device_printf(sc->sc_dev, + "status of RF switch is changed to %s\n", + cur ? "ON" : "OFF"); + if (cur != mac->mac_phy.rf_on) { + if (cur) + bwn_rf_turnon(mac); + else + bwn_rf_turnoff(mac); + } + } + + callout_schedule(&sc->sc_rfswitch_ch, hz); +} + +static void +bwn_phy_lp_init_pre(struct bwn_mac *mac) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_lp *plp = &phy->phy_lp; + + plp->plp_antenna = BWN_ANT_DEFAULT; +} + +static int +bwn_phy_lp_init(struct bwn_mac *mac) +{ + static const struct bwn_stxtable tables[] = { + { 2, 6, 0x3d, 3, 0x01 }, { 1, 12, 0x4c, 1, 0x01 }, + { 1, 8, 0x50, 0, 0x7f }, { 0, 8, 0x44, 0, 0xff }, + { 1, 0, 0x4a, 0, 0xff }, { 0, 4, 0x4d, 0, 0xff }, + { 1, 4, 0x4e, 0, 0xff }, { 0, 12, 0x4f, 0, 0x0f }, + { 1, 0, 0x4f, 4, 0x0f }, { 3, 0, 0x49, 0, 0x0f }, + { 4, 3, 0x46, 4, 0x07 }, { 3, 15, 0x46, 0, 0x01 }, + { 4, 0, 0x46, 1, 0x07 }, { 3, 8, 0x48, 4, 0x07 }, + { 3, 11, 0x48, 0, 0x0f }, { 3, 4, 0x49, 4, 0x0f }, + { 2, 15, 0x45, 0, 0x01 }, { 5, 13, 0x52, 4, 0x07 }, + { 6, 0, 0x52, 7, 0x01 }, { 5, 3, 0x41, 5, 0x07 }, + { 5, 6, 0x41, 0, 0x0f }, { 5, 10, 0x42, 5, 0x07 }, + { 4, 15, 0x42, 0, 0x01 }, { 5, 0, 0x42, 1, 0x07 }, + { 4, 11, 0x43, 4, 0x0f }, { 4, 7, 0x43, 0, 0x0f }, + { 4, 6, 0x45, 1, 0x01 }, { 2, 7, 0x40, 4, 0x0f }, + { 2, 11, 0x40, 0, 0x0f } + }; + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct bwn_softc *sc = mac->mac_sc; + const struct bwn_stxtable *st; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + int i, error; + uint16_t tmp; + + bwn_phy_lp_readsprom(mac); /* XXX bad place */ + bwn_phy_lp_bbinit(mac); + + /* initialize RF */ + BWN_PHY_SET(mac, BWN_PHY_4WIRECTL, 0x2); + DELAY(1); + BWN_PHY_MASK(mac, BWN_PHY_4WIRECTL, 0xfffd); + DELAY(1); + + if (mac->mac_phy.rf_ver == 0x2062) + bwn_phy_lp_b2062_init(mac); + else { + bwn_phy_lp_b2063_init(mac); + + /* synchronize stx table. */ + for (i = 0; i < N(tables); i++) { + st = &tables[i]; + tmp = BWN_RF_READ(mac, st->st_rfaddr); + tmp >>= st->st_rfshift; + tmp <<= st->st_physhift; + BWN_PHY_SETMASK(mac, + BWN_PHY_OFDM(0xf2 + st->st_phyoffset), + ~(st->st_mask << st->st_physhift), tmp); + } + + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xf0), 0x5f80); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xf1), 0); + } + + /* calibrate RC */ + if (mac->mac_phy.rev >= 2) + bwn_phy_lp_rxcal_r2(mac); + else if (!plp->plp_rccap) { + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + bwn_phy_lp_rccal_r12(mac); + } else + bwn_phy_lp_set_rccap(mac); + + error = bwn_phy_lp_switch_channel(mac, 7); + if (error) + device_printf(sc->sc_dev, + "failed to change channel 7 (%d)\n", error); + bwn_phy_lp_txpctl_init(mac); + bwn_phy_lp_calib(mac); + return (0); +} + +static uint16_t +bwn_phy_lp_read(struct bwn_mac *mac, uint16_t reg) +{ + + BWN_WRITE_2(mac, BWN_PHYCTL, reg); + return (BWN_READ_2(mac, BWN_PHYDATA)); +} + +static void +bwn_phy_lp_write(struct bwn_mac *mac, uint16_t reg, uint16_t value) +{ + + BWN_WRITE_2(mac, BWN_PHYCTL, reg); + BWN_WRITE_2(mac, BWN_PHYDATA, value); +} + +static void +bwn_phy_lp_maskset(struct bwn_mac *mac, uint16_t reg, uint16_t mask, + uint16_t set) +{ + + BWN_WRITE_2(mac, BWN_PHYCTL, reg); + BWN_WRITE_2(mac, BWN_PHYDATA, + (BWN_READ_2(mac, BWN_PHYDATA) & mask) | set); +} + +static uint16_t +bwn_phy_lp_rf_read(struct bwn_mac *mac, uint16_t reg) +{ + + KASSERT(reg != 1, ("unaccessible register %d", reg)); + if (mac->mac_phy.rev < 2 && reg != 0x4001) + reg |= 0x100; + if (mac->mac_phy.rev >= 2) + reg |= 0x200; + BWN_WRITE_2(mac, BWN_RFCTL, reg); + return BWN_READ_2(mac, BWN_RFDATALO); +} + +static void +bwn_phy_lp_rf_write(struct bwn_mac *mac, uint16_t reg, uint16_t value) +{ + + KASSERT(reg != 1, ("unaccessible register %d", reg)); + BWN_WRITE_2(mac, BWN_RFCTL, reg); + BWN_WRITE_2(mac, BWN_RFDATALO, value); +} + +static void +bwn_phy_lp_rf_onoff(struct bwn_mac *mac, int on) +{ + + if (on) { + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xe0ff); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, + (mac->mac_phy.rev >= 2) ? 0xf7f7 : 0xffe7); + return; + } + + if (mac->mac_phy.rev >= 2) { + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0x83ff); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x1f00); + BWN_PHY_MASK(mac, BWN_PHY_AFE_DDFS, 0x80ff); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xdfff); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x0808); + return; + } + + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xe0ff); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x1f00); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xfcff); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x0018); +} + +static int +bwn_phy_lp_switch_channel(struct bwn_mac *mac, uint32_t chan) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_lp *plp = &phy->phy_lp; + int error; + + if (phy->rf_ver == 0x2063) { + error = bwn_phy_lp_b2063_switch_channel(mac, chan); + if (error) + return (error); + } else { + error = bwn_phy_lp_b2062_switch_channel(mac, chan); + if (error) + return (error); + bwn_phy_lp_set_anafilter(mac, chan); + bwn_phy_lp_set_gaintbl(mac, ieee80211_ieee2mhz(chan, 0)); + } + + plp->plp_chan = chan; + BWN_WRITE_2(mac, BWN_CHANNEL, chan); + return (0); +} + +static uint32_t +bwn_phy_lp_get_default_chan(struct bwn_mac *mac) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + device_printf(sc->sc_dev, "correct?\n"); + + return (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ? 1 : 36); +} + +static void +bwn_phy_lp_set_antenna(struct bwn_mac *mac, int antenna) +{ + struct bwn_phy *phy = &mac->mac_phy; + struct bwn_phy_lp *plp = &phy->phy_lp; + + if (phy->rev >= 2 || antenna > BWN_ANTAUTO1) + return; + + bwn_hf_write(mac, bwn_hf_read(mac) & ~BWN_HF_UCODE_ANTDIV_HELPER); + BWN_PHY_SETMASK(mac, BWN_PHY_CRSGAIN_CTL, 0xfffd, antenna & 0x2); + BWN_PHY_SETMASK(mac, BWN_PHY_CRSGAIN_CTL, 0xfffe, antenna & 0x1); + bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_UCODE_ANTDIV_HELPER); + plp->plp_antenna = antenna; +} + +static void +bwn_phy_lp_task_60s(struct bwn_mac *mac) +{ + + bwn_phy_lp_calib(mac); +} + +static void +bwn_phy_lp_readsprom(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + struct siba_sprom *sprom = &siba->siba_sprom; + + device_printf(sc->sc_dev, "XXX using %dghz\n", + IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ? 2 : 5); + + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + plp->plp_txisoband_m = sprom->tri2g; + plp->plp_bxarch = sprom->bxa2g; + plp->plp_rxpwroffset = sprom->rxpo2g; + plp->plp_rssivf = sprom->rssismf2g; + plp->plp_rssivc = sprom->rssismc2g; + plp->plp_rssigs = sprom->rssisav2g; + return; + } + + plp->plp_txisoband_l = sprom->tri5gl; + plp->plp_txisoband_m = sprom->tri5g; + plp->plp_txisoband_h = sprom->tri5gh; + plp->plp_bxarch = sprom->bxa5g; + plp->plp_rxpwroffset = sprom->rxpo5g; + plp->plp_rssivf = sprom->rssismf5g; + plp->plp_rssivc = sprom->rssismc5g; + plp->plp_rssigs = sprom->rssisav5g; +} + +static void +bwn_phy_lp_bbinit(struct bwn_mac *mac) +{ + + bwn_phy_lp_tblinit(mac); + if (mac->mac_phy.rev >= 2) + bwn_phy_lp_bbinit_r2(mac); + else + bwn_phy_lp_bbinit_r01(mac); +} + +static void +bwn_phy_lp_txpctl_init(struct bwn_mac *mac) +{ + struct bwn_txgain gain_2ghz = { 4, 12, 12, 0 }; + struct bwn_txgain gain_5ghz = { 7, 15, 14, 0 }; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + bwn_phy_lp_set_txgain(mac, + IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ? &gain_2ghz : &gain_5ghz); + bwn_phy_lp_set_bbmult(mac, 150); +} + +static void +bwn_phy_lp_calib(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + const struct bwn_rxcompco *rc = NULL; + struct bwn_txgain ogain; + int i, omode, oafeovr, orf, obbmult; + uint8_t mode, fc = 0; + + if (plp->plp_chanfullcal != plp->plp_chan) { + plp->plp_chanfullcal = plp->plp_chan; + fc = 1; + } + + bwn_mac_suspend(mac); + + /* BlueTooth Coexistance Override */ + BWN_WRITE_2(mac, BWN_BTCOEX_CTL, 0x3); + BWN_WRITE_2(mac, BWN_BTCOEX_TXCTL, 0xff); + + if (mac->mac_phy.rev >= 2) + bwn_phy_lp_digflt_save(mac); + bwn_phy_lp_get_txpctlmode(mac); + mode = plp->plp_txpctlmode; + bwn_phy_lp_set_txpctlmode(mac, BWN_PHYLP_TXPCTL_OFF); + if (mac->mac_phy.rev == 0 && mode != BWN_PHYLP_TXPCTL_OFF) + bwn_phy_lp_bugfix(mac); + if (mac->mac_phy.rev >= 2 && fc == 1) { + bwn_phy_lp_get_txpctlmode(mac); + omode = plp->plp_txpctlmode; + oafeovr = BWN_PHY_READ(mac, BWN_PHY_AFE_CTL_OVR) & 0x40; + if (oafeovr) + ogain = bwn_phy_lp_get_txgain(mac); + orf = BWN_PHY_READ(mac, BWN_PHY_RF_PWR_OVERRIDE) & 0xff; + obbmult = bwn_phy_lp_get_bbmult(mac); + bwn_phy_lp_set_txpctlmode(mac, BWN_PHYLP_TXPCTL_OFF); + if (oafeovr) + bwn_phy_lp_set_txgain(mac, &ogain); + bwn_phy_lp_set_bbmult(mac, obbmult); + bwn_phy_lp_set_txpctlmode(mac, omode); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_PWR_OVERRIDE, 0xff00, orf); + } + bwn_phy_lp_set_txpctlmode(mac, mode); + if (mac->mac_phy.rev >= 2) + bwn_phy_lp_digflt_restore(mac); + + /* do RX IQ Calculation; assumes that noise is true. */ + if (siba->siba_chipid == 0x5354) { + for (i = 0; i < N(bwn_rxcompco_5354); i++) { + if (bwn_rxcompco_5354[i].rc_chan == plp->plp_chan) + rc = &bwn_rxcompco_5354[i]; + } + } else if (mac->mac_phy.rev >= 2) + rc = &bwn_rxcompco_r2; + else { + for (i = 0; i < N(bwn_rxcompco_r12); i++) { + if (bwn_rxcompco_r12[i].rc_chan == plp->plp_chan) + rc = &bwn_rxcompco_r12[i]; + } + } + if (rc == NULL) + goto fail; + + BWN_PHY_SETMASK(mac, BWN_PHY_RX_COMP_COEFF_S, 0xff00, rc->rc_c1); + BWN_PHY_SETMASK(mac, BWN_PHY_RX_COMP_COEFF_S, 0x00ff, rc->rc_c0 << 8); + + bwn_phy_lp_set_trsw_over(mac, 1 /* TX */, 0 /* RX */); + + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x8); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xfff7, 0); + } else { + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x20); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xffdf, 0); + } + + bwn_phy_lp_set_rxgain(mac, 0x2d5d); + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVR, 0xfffe); + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVRVAL, 0xfffe); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x800); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0x800); + bwn_phy_lp_set_deaf(mac, 0); + /* XXX no checking return value? */ + (void)bwn_phy_lp_calc_rx_iq_comp(mac, 0xfff0); + bwn_phy_lp_clear_deaf(mac, 0); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xfffc); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xfff7); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xffdf); + + /* disable RX GAIN override. */ + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xfffe); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xffef); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xffbf); + if (mac->mac_phy.rev >= 2) { + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, 0xfeff); + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, 0xfbff); + BWN_PHY_MASK(mac, BWN_PHY_OFDM(0xe5), 0xfff7); + } + } else { + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, 0xfdff); + } + + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVR, 0xfffe); + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVRVAL, 0xf7ff); +fail: + bwn_mac_enable(mac); +} + +static void +bwn_phy_lp_switch_analog(struct bwn_mac *mac, int on) +{ + + if (on) { + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVR, 0xfff8); + return; + } + + BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVRVAL, 0x0007); + BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVR, 0x0007); +} + +static int +bwn_phy_lp_b2063_switch_channel(struct bwn_mac *mac, uint8_t chan) +{ + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + static const struct bwn_b206x_chan *bc = NULL; + uint32_t count, freqref, freqvco, freqxtal, val[3], timeout, timeoutref, + tmp[6]; + uint16_t old, scale, tmp16; + int i, div; + + for (i = 0; i < N(bwn_b2063_chantable); i++) { + if (bwn_b2063_chantable[i].bc_chan == chan) { + bc = &bwn_b2063_chantable[i]; + break; + } + } + if (bc == NULL) + return (EINVAL); + + BWN_RF_WRITE(mac, BWN_B2063_LOGEN_VCOBUF1, bc->bc_data[0]); + BWN_RF_WRITE(mac, BWN_B2063_LOGEN_MIXER2, bc->bc_data[1]); + BWN_RF_WRITE(mac, BWN_B2063_LOGEN_BUF2, bc->bc_data[2]); + BWN_RF_WRITE(mac, BWN_B2063_LOGEN_RCCR1, bc->bc_data[3]); + BWN_RF_WRITE(mac, BWN_B2063_A_RX_1ST3, bc->bc_data[4]); + BWN_RF_WRITE(mac, BWN_B2063_A_RX_2ND1, bc->bc_data[5]); + BWN_RF_WRITE(mac, BWN_B2063_A_RX_2ND4, bc->bc_data[6]); + BWN_RF_WRITE(mac, BWN_B2063_A_RX_2ND7, bc->bc_data[7]); + BWN_RF_WRITE(mac, BWN_B2063_A_RX_PS6, bc->bc_data[8]); + BWN_RF_WRITE(mac, BWN_B2063_TX_RF_CTL2, bc->bc_data[9]); + BWN_RF_WRITE(mac, BWN_B2063_TX_RF_CTL5, bc->bc_data[10]); + BWN_RF_WRITE(mac, BWN_B2063_PA_CTL11, bc->bc_data[11]); + + old = BWN_RF_READ(mac, BWN_B2063_COM15); + BWN_RF_SET(mac, BWN_B2063_COM15, 0x1e); + + freqxtal = siba->siba_cc.scc_pmu.freq * 1000; + freqvco = bc->bc_freq << ((bc->bc_freq > 4000) ? 1 : 2); + freqref = freqxtal * 3; + div = (freqxtal <= 26000000 ? 1 : 2); + timeout = ((((8 * freqxtal) / (div * 5000000)) + 1) >> 1) - 1; + timeoutref = ((((8 * freqxtal) / (div * (timeout + 1))) + + 999999) / 1000000) + 1; + + BWN_RF_WRITE(mac, BWN_B2063_JTAG_VCO_CALIB3, 0x2); + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_VCO_CALIB6, + 0xfff8, timeout >> 2); + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_VCO_CALIB7, + 0xff9f,timeout << 5); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_VCO_CALIB5, timeoutref); + + val[0] = bwn_phy_lp_roundup(freqxtal, 1000000, 16); + val[1] = bwn_phy_lp_roundup(freqxtal, 1000000 * div, 16); + val[2] = bwn_phy_lp_roundup(freqvco, 3, 16); + + count = (bwn_phy_lp_roundup(val[2], val[1] + 16, 16) * (timeout + 1) * + (timeoutref + 1)) - 1; + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_VCO_CALIB7, + 0xf0, count >> 8); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_VCO_CALIB8, count & 0xff); + + tmp[0] = ((val[2] * 62500) / freqref) << 4; + tmp[1] = ((val[2] * 62500) % freqref) << 4; + while (tmp[1] >= freqref) { + tmp[0]++; + tmp[1] -= freqref; + } + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_SG1, 0xffe0, tmp[0] >> 4); + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_SG2, 0xfe0f, tmp[0] << 4); + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_SG2, 0xfff0, tmp[0] >> 16); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_SG3, (tmp[1] >> 8) & 0xff); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_SG4, tmp[1] & 0xff); + + BWN_RF_WRITE(mac, BWN_B2063_JTAG_LF1, 0xb9); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_LF2, 0x88); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_LF3, 0x28); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_LF4, 0x63); + + tmp[2] = ((41 * (val[2] - 3000)) /1200) + 27; + tmp[3] = bwn_phy_lp_roundup(132000 * tmp[0], 8451, 16); + + if ((tmp[3] + tmp[2] - 1) / tmp[2] > 60) { + scale = 1; + tmp[4] = ((tmp[3] + tmp[2]) / (tmp[2] << 1)) - 8; + } else { + scale = 0; + tmp[4] = ((tmp[3] + (tmp[2] >> 1)) / tmp[2]) - 8; + } + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_CP2, 0xffc0, tmp[4]); + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_CP2, 0xffbf, scale << 6); + + tmp[5] = bwn_phy_lp_roundup(100 * val[0], val[2], 16) * (tmp[4] * 8) * + (scale + 1); + if (tmp[5] > 150) + tmp[5] = 0; + + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_CP3, 0xffe0, tmp[5]); + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_CP3, 0xffdf, scale << 5); + + BWN_RF_SETMASK(mac, BWN_B2063_JTAG_XTAL_12, 0xfffb, 0x4); + if (freqxtal > 26000000) + BWN_RF_SET(mac, BWN_B2063_JTAG_XTAL_12, 0x2); + else + BWN_RF_MASK(mac, BWN_B2063_JTAG_XTAL_12, 0xfd); + + if (val[0] == 45) + BWN_RF_SET(mac, BWN_B2063_JTAG_VCO1, 0x2); + else + BWN_RF_MASK(mac, BWN_B2063_JTAG_VCO1, 0xfd); + + BWN_RF_SET(mac, BWN_B2063_PLL_SP2, 0x3); + DELAY(1); + BWN_RF_MASK(mac, BWN_B2063_PLL_SP2, 0xfffc); + + /* VCO Calibration */ + BWN_RF_MASK(mac, BWN_B2063_PLL_SP1, ~0x40); + tmp16 = BWN_RF_READ(mac, BWN_B2063_JTAG_CALNRST) & 0xf8; + BWN_RF_WRITE(mac, BWN_B2063_JTAG_CALNRST, tmp16); + DELAY(1); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_CALNRST, tmp16 | 0x4); + DELAY(1); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_CALNRST, tmp16 | 0x6); + DELAY(1); + BWN_RF_WRITE(mac, BWN_B2063_JTAG_CALNRST, tmp16 | 0x7); + DELAY(300); + BWN_RF_SET(mac, BWN_B2063_PLL_SP1, 0x40); + + BWN_RF_WRITE(mac, BWN_B2063_COM15, old); + return (0); +} + +static int +bwn_phy_lp_b2062_switch_channel(struct bwn_mac *mac, uint8_t chan) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + const struct bwn_b206x_chan *bc = NULL; + uint32_t freqxtal = siba->siba_cc.scc_pmu.freq * 1000; + uint32_t tmp[9]; + int i; + + for (i = 0; i < N(bwn_b2062_chantable); i++) { + if (bwn_b2062_chantable[i].bc_chan == chan) { + bc = &bwn_b2062_chantable[i]; + break; + } + } + + if (bc == NULL) + return (EINVAL); + + BWN_RF_SET(mac, BWN_B2062_S_RFPLLCTL14, 0x04); + BWN_RF_WRITE(mac, BWN_B2062_N_LGENATUNE0, bc->bc_data[0]); + BWN_RF_WRITE(mac, BWN_B2062_N_LGENATUNE2, bc->bc_data[1]); + BWN_RF_WRITE(mac, BWN_B2062_N_LGENATUNE3, bc->bc_data[2]); + BWN_RF_WRITE(mac, BWN_B2062_N_TX_TUNE, bc->bc_data[3]); + BWN_RF_WRITE(mac, BWN_B2062_S_LGENG_CTL1, bc->bc_data[4]); + BWN_RF_WRITE(mac, BWN_B2062_N_LGENACTL5, bc->bc_data[5]); + BWN_RF_WRITE(mac, BWN_B2062_N_LGENACTL6, bc->bc_data[6]); + BWN_RF_WRITE(mac, BWN_B2062_N_TX_PGA, bc->bc_data[7]); + BWN_RF_WRITE(mac, BWN_B2062_N_TX_PAD, bc->bc_data[8]); + + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL33, 0xcc); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL34, 0x07); + bwn_phy_lp_b2062_reset_pllbias(mac); + tmp[0] = freqxtal / 1000; + tmp[1] = plp->plp_div * 1000; + tmp[2] = tmp[1] * ieee80211_ieee2mhz(chan, 0); + if (ieee80211_ieee2mhz(chan, 0) < 4000) + tmp[2] *= 2; + tmp[3] = 48 * tmp[0]; + tmp[5] = tmp[2] / tmp[3]; + tmp[6] = tmp[2] % tmp[3]; + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL26, tmp[5]); + tmp[4] = tmp[6] * 0x100; + tmp[5] = tmp[4] / tmp[3]; + tmp[6] = tmp[4] % tmp[3]; + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL27, tmp[5]); + tmp[4] = tmp[6] * 0x100; + tmp[5] = tmp[4] / tmp[3]; + tmp[6] = tmp[4] % tmp[3]; + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL28, tmp[5]); + tmp[4] = tmp[6] * 0x100; + tmp[5] = tmp[4] / tmp[3]; + tmp[6] = tmp[4] % tmp[3]; + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL29, + tmp[5] + ((2 * tmp[6]) / tmp[3])); + tmp[7] = BWN_RF_READ(mac, BWN_B2062_S_RFPLLCTL19); + tmp[8] = ((2 * tmp[2] * (tmp[7] + 1)) + (3 * tmp[0])) / (6 * tmp[0]); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL23, (tmp[8] >> 8) + 16); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL24, tmp[8] & 0xff); + + bwn_phy_lp_b2062_vco_calib(mac); + if (BWN_RF_READ(mac, BWN_B2062_S_RFPLLCTL3) & 0x10) { + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL33, 0xfc); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL34, 0); + bwn_phy_lp_b2062_reset_pllbias(mac); + bwn_phy_lp_b2062_vco_calib(mac); + if (BWN_RF_READ(mac, BWN_B2062_S_RFPLLCTL3) & 0x10) { + BWN_RF_MASK(mac, BWN_B2062_S_RFPLLCTL14, ~0x04); + return (EIO); + } + } + BWN_RF_MASK(mac, BWN_B2062_S_RFPLLCTL14, ~0x04); + return (0); +} + +static void +bwn_phy_lp_set_anafilter(struct bwn_mac *mac, uint8_t channel) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + uint16_t tmp = (channel == 14); + + if (mac->mac_phy.rev < 2) { + BWN_PHY_SETMASK(mac, BWN_PHY_LP_PHY_CTL, 0xfcff, tmp << 9); + if ((mac->mac_phy.rev == 1) && (plp->plp_rccap)) + bwn_phy_lp_set_rccap(mac); + return; + } + + BWN_RF_WRITE(mac, BWN_B2063_TX_BB_SP3, 0x3f); +} + +static void +bwn_phy_lp_set_gaintbl(struct bwn_mac *mac, uint32_t freq) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint16_t iso, tmp[3]; + + KASSERT(mac->mac_phy.rev < 2, ("%s:%d: fail", __func__, __LINE__)); + + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + iso = plp->plp_txisoband_m; + else if (freq <= 5320) + iso = plp->plp_txisoband_l; + else if (freq <= 5700) + iso = plp->plp_txisoband_m; + else + iso = plp->plp_txisoband_h; + + tmp[0] = ((iso - 26) / 12) << 12; + tmp[1] = tmp[0] + 0x1000; + tmp[2] = tmp[0] + 0x2000; + + bwn_tab_write_multi(mac, BWN_TAB_2(13, 0), 3, tmp); + bwn_tab_write_multi(mac, BWN_TAB_2(12, 0), 3, tmp); +} + +static void +bwn_phy_lp_digflt_save(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + int i; + static const uint16_t addr[] = { + BWN_PHY_OFDM(0xc1), BWN_PHY_OFDM(0xc2), + BWN_PHY_OFDM(0xc3), BWN_PHY_OFDM(0xc4), + BWN_PHY_OFDM(0xc5), BWN_PHY_OFDM(0xc6), + BWN_PHY_OFDM(0xc7), BWN_PHY_OFDM(0xc8), + BWN_PHY_OFDM(0xcf), + }; + static const uint16_t val[] = { + 0xde5e, 0xe832, 0xe331, 0x4d26, + 0x0026, 0x1420, 0x0020, 0xfe08, + 0x0008, + }; + + for (i = 0; i < N(addr); i++) { + plp->plp_digfilt[i] = BWN_PHY_READ(mac, addr[i]); + BWN_PHY_WRITE(mac, addr[i], val[i]); + } +} + +static void +bwn_phy_lp_get_txpctlmode(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct bwn_softc *sc = mac->mac_sc; + uint16_t ctl; + + ctl = BWN_PHY_READ(mac, BWN_PHY_TX_PWR_CTL_CMD); + switch (ctl & BWN_PHY_TX_PWR_CTL_CMD_MODE) { + case BWN_PHY_TX_PWR_CTL_CMD_MODE_OFF: + plp->plp_txpctlmode = BWN_PHYLP_TXPCTL_OFF; + break; + case BWN_PHY_TX_PWR_CTL_CMD_MODE_SW: + plp->plp_txpctlmode = BWN_PHYLP_TXPCTL_ON_SW; + break; + case BWN_PHY_TX_PWR_CTL_CMD_MODE_HW: + plp->plp_txpctlmode = BWN_PHYLP_TXPCTL_ON_HW; + break; + default: + plp->plp_txpctlmode = BWN_PHYLP_TXPCTL_UNKNOWN; + device_printf(sc->sc_dev, "unknown command mode\n"); + break; + } +} + +static void +bwn_phy_lp_set_txpctlmode(struct bwn_mac *mac, uint8_t mode) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + uint16_t ctl; + uint8_t old; + + bwn_phy_lp_get_txpctlmode(mac); + old = plp->plp_txpctlmode; + if (old == mode) + return; + plp->plp_txpctlmode = mode; + + if (old != BWN_PHYLP_TXPCTL_ON_HW && mode == BWN_PHYLP_TXPCTL_ON_HW) { + BWN_PHY_SETMASK(mac, BWN_PHY_TX_PWR_CTL_CMD, 0xff80, + plp->plp_tssiidx); + BWN_PHY_SETMASK(mac, BWN_PHY_TX_PWR_CTL_NNUM, + 0x8fff, ((uint16_t)plp->plp_tssinpt << 16)); + + /* disable TX GAIN override */ + if (mac->mac_phy.rev < 2) + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, 0xfeff); + else { + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, 0xff7f); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, 0xbfff); + } + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVR, 0xffbf); + + plp->plp_txpwridx = -1; + } + if (mac->mac_phy.rev >= 2) { + if (mode == BWN_PHYLP_TXPCTL_ON_HW) + BWN_PHY_SET(mac, BWN_PHY_OFDM(0xd0), 0x2); + else + BWN_PHY_MASK(mac, BWN_PHY_OFDM(0xd0), 0xfffd); + } + + /* writes TX Power Control mode */ + switch (plp->plp_txpctlmode) { + case BWN_PHYLP_TXPCTL_OFF: + ctl = BWN_PHY_TX_PWR_CTL_CMD_MODE_OFF; + break; + case BWN_PHYLP_TXPCTL_ON_HW: + ctl = BWN_PHY_TX_PWR_CTL_CMD_MODE_HW; + break; + case BWN_PHYLP_TXPCTL_ON_SW: + ctl = BWN_PHY_TX_PWR_CTL_CMD_MODE_SW; + break; + default: + ctl = 0; + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + BWN_PHY_SETMASK(mac, BWN_PHY_TX_PWR_CTL_CMD, + (uint16_t)~BWN_PHY_TX_PWR_CTL_CMD_MODE, ctl); +} + +static void +bwn_phy_lp_bugfix(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct bwn_softc *sc = mac->mac_sc; + const unsigned int size = 256; + struct bwn_txgain tg; + uint32_t rxcomp, txgain, coeff, rfpwr, *tabs; + uint16_t tssinpt, tssiidx, value[2]; + uint8_t mode; + int8_t txpwridx; + + tabs = (uint32_t *)malloc(sizeof(uint32_t) * size, M_DEVBUF, + M_NOWAIT | M_ZERO); + if (tabs == NULL) { + device_printf(sc->sc_dev, "failed to allocate buffer.\n"); + return; + } + + bwn_phy_lp_get_txpctlmode(mac); + mode = plp->plp_txpctlmode; + txpwridx = plp->plp_txpwridx; + tssinpt = plp->plp_tssinpt; + tssiidx = plp->plp_tssiidx; + + bwn_tab_read_multi(mac, + (mac->mac_phy.rev < 2) ? BWN_TAB_4(10, 0x140) : + BWN_TAB_4(7, 0x140), size, tabs); + + bwn_phy_lp_tblinit(mac); + bwn_phy_lp_bbinit(mac); + bwn_phy_lp_txpctl_init(mac); + bwn_phy_lp_rf_onoff(mac, 1); + bwn_phy_lp_set_txpctlmode(mac, BWN_PHYLP_TXPCTL_OFF); + + bwn_tab_write_multi(mac, + (mac->mac_phy.rev < 2) ? BWN_TAB_4(10, 0x140) : + BWN_TAB_4(7, 0x140), size, tabs); + + BWN_WRITE_2(mac, BWN_CHANNEL, plp->plp_chan); + plp->plp_tssinpt = tssinpt; + plp->plp_tssiidx = tssiidx; + bwn_phy_lp_set_anafilter(mac, plp->plp_chan); + if (txpwridx != -1) { + /* set TX power by index */ + plp->plp_txpwridx = txpwridx; + bwn_phy_lp_get_txpctlmode(mac); + if (plp->plp_txpctlmode != BWN_PHYLP_TXPCTL_OFF) + bwn_phy_lp_set_txpctlmode(mac, BWN_PHYLP_TXPCTL_ON_SW); + if (mac->mac_phy.rev >= 2) { + rxcomp = bwn_tab_read(mac, + BWN_TAB_4(7, txpwridx + 320)); + txgain = bwn_tab_read(mac, + BWN_TAB_4(7, txpwridx + 192)); + tg.tg_pad = (txgain >> 16) & 0xff; + tg.tg_gm = txgain & 0xff; + tg.tg_pga = (txgain >> 8) & 0xff; + tg.tg_dac = (rxcomp >> 28) & 0xff; + bwn_phy_lp_set_txgain(mac, &tg); + } else { + rxcomp = bwn_tab_read(mac, + BWN_TAB_4(10, txpwridx + 320)); + txgain = bwn_tab_read(mac, + BWN_TAB_4(10, txpwridx + 192)); + BWN_PHY_SETMASK(mac, BWN_PHY_TX_GAIN_CTL_OVERRIDE_VAL, + 0xf800, (txgain >> 4) & 0x7fff); + bwn_phy_lp_set_txgain_dac(mac, txgain & 0x7); + bwn_phy_lp_set_txgain_pa(mac, (txgain >> 24) & 0x7f); + } + bwn_phy_lp_set_bbmult(mac, (rxcomp >> 20) & 0xff); + + /* set TX IQCC */ + value[0] = (rxcomp >> 10) & 0x3ff; + value[1] = rxcomp & 0x3ff; + bwn_tab_write_multi(mac, BWN_TAB_2(0, 80), 2, value); + + coeff = bwn_tab_read(mac, + (mac->mac_phy.rev >= 2) ? BWN_TAB_4(7, txpwridx + 448) : + BWN_TAB_4(10, txpwridx + 448)); + bwn_tab_write(mac, BWN_TAB_2(0, 85), coeff & 0xffff); + if (mac->mac_phy.rev >= 2) { + rfpwr = bwn_tab_read(mac, + BWN_TAB_4(7, txpwridx + 576)); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_PWR_OVERRIDE, 0xff00, + rfpwr & 0xffff); + } + bwn_phy_lp_set_txgain_override(mac); + } + if (plp->plp_rccap) + bwn_phy_lp_set_rccap(mac); + bwn_phy_lp_set_antenna(mac, plp->plp_antenna); + bwn_phy_lp_set_txpctlmode(mac, mode); + free(tabs, M_DEVBUF); +} + +static void +bwn_phy_lp_digflt_restore(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + int i; + static const uint16_t addr[] = { + BWN_PHY_OFDM(0xc1), BWN_PHY_OFDM(0xc2), + BWN_PHY_OFDM(0xc3), BWN_PHY_OFDM(0xc4), + BWN_PHY_OFDM(0xc5), BWN_PHY_OFDM(0xc6), + BWN_PHY_OFDM(0xc7), BWN_PHY_OFDM(0xc8), + BWN_PHY_OFDM(0xcf), + }; + + for (i = 0; i < N(addr); i++) + BWN_PHY_WRITE(mac, addr[i], plp->plp_digfilt[i]); +} + +static void +bwn_phy_lp_tblinit(struct bwn_mac *mac) +{ + uint32_t freq = ieee80211_ieee2mhz(bwn_phy_lp_get_default_chan(mac), 0); + + if (mac->mac_phy.rev < 2) { + bwn_phy_lp_tblinit_r01(mac); + bwn_phy_lp_tblinit_txgain(mac); + bwn_phy_lp_set_gaintbl(mac, freq); + return; + } + + bwn_phy_lp_tblinit_r2(mac); + bwn_phy_lp_tblinit_txgain(mac); +} + +struct bwn_wpair { + uint16_t reg; + uint16_t value; +}; + +struct bwn_smpair { + uint16_t offset; + uint16_t mask; + uint16_t set; +}; + +static void +bwn_phy_lp_bbinit_r2(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + static const struct bwn_wpair v1[] = { + { BWN_PHY_AFE_DAC_CTL, 0x50 }, + { BWN_PHY_AFE_CTL, 0x8800 }, + { BWN_PHY_AFE_CTL_OVR, 0 }, + { BWN_PHY_AFE_CTL_OVRVAL, 0 }, + { BWN_PHY_RF_OVERRIDE_0, 0 }, + { BWN_PHY_RF_OVERRIDE_2, 0 }, + { BWN_PHY_OFDM(0xf9), 0 }, + { BWN_PHY_TR_LOOKUP_1, 0 } + }; + static const struct bwn_smpair v2[] = { + { BWN_PHY_OFDMSYNCTHRESH0, 0xff00, 0xb4 }, + { BWN_PHY_DCOFFSETTRANSIENT, 0xf8ff, 0x200 }, + { BWN_PHY_DCOFFSETTRANSIENT, 0xff00, 0x7f }, + { BWN_PHY_GAINDIRECTMISMATCH, 0xff0f, 0x40 }, + { BWN_PHY_PREAMBLECONFIRMTO, 0xff00, 0x2 } + }; + static const struct bwn_smpair v3[] = { + { BWN_PHY_OFDM(0xfe), 0xffe0, 0x1f }, + { BWN_PHY_OFDM(0xff), 0xffe0, 0xc }, + { BWN_PHY_OFDM(0x100), 0xff00, 0x19 }, + { BWN_PHY_OFDM(0xff), 0x03ff, 0x3c00 }, + { BWN_PHY_OFDM(0xfe), 0xfc1f, 0x3e0 }, + { BWN_PHY_OFDM(0xff), 0xffe0, 0xc }, + { BWN_PHY_OFDM(0x100), 0x00ff, 0x1900 }, + { BWN_PHY_CLIPCTRTHRESH, 0x83ff, 0x5800 }, + { BWN_PHY_CLIPCTRTHRESH, 0xffe0, 0x12 }, + { BWN_PHY_GAINMISMATCH, 0x0fff, 0x9000 }, + + }; + int i; + + for (i = 0; i < N(v1); i++) + BWN_PHY_WRITE(mac, v1[i].reg, v1[i].value); + BWN_PHY_SET(mac, BWN_PHY_ADC_COMPENSATION_CTL, 0x10); + for (i = 0; i < N(v2); i++) + BWN_PHY_SETMASK(mac, v2[i].offset, v2[i].mask, v2[i].set); + + BWN_PHY_MASK(mac, BWN_PHY_CRSGAIN_CTL, ~0x4000); + BWN_PHY_MASK(mac, BWN_PHY_CRSGAIN_CTL, ~0x2000); + BWN_PHY_SET(mac, BWN_PHY_OFDM(0x10a), 0x1); + if (siba->siba_board_rev >= 0x18) { + bwn_tab_write(mac, BWN_TAB_4(17, 65), 0xec); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x10a), 0xff01, 0x14); + } else { + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0x10a), 0xff01, 0x10); + } + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xdf), 0xff00, 0xf4); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xdf), 0x00ff, 0xf100); + BWN_PHY_WRITE(mac, BWN_PHY_CLIPTHRESH, 0x48); + BWN_PHY_SETMASK(mac, BWN_PHY_HIGAINDB, 0xff00, 0x46); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xe4), 0xff00, 0x10); + BWN_PHY_SETMASK(mac, BWN_PHY_PWR_THRESH1, 0xfff0, 0x9); + BWN_PHY_MASK(mac, BWN_PHY_GAINDIRECTMISMATCH, ~0xf); + BWN_PHY_SETMASK(mac, BWN_PHY_VERYLOWGAINDB, 0x00ff, 0x5500); + BWN_PHY_SETMASK(mac, BWN_PHY_CLIPCTRTHRESH, 0xfc1f, 0xa0); + BWN_PHY_SETMASK(mac, BWN_PHY_GAINDIRECTMISMATCH, 0xe0ff, 0x300); + BWN_PHY_SETMASK(mac, BWN_PHY_HIGAINDB, 0x00ff, 0x2a00); + if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + BWN_PHY_SETMASK(mac, BWN_PHY_LOWGAINDB, 0x00ff, 0x2100); + BWN_PHY_SETMASK(mac, BWN_PHY_VERYLOWGAINDB, 0xff00, 0xa); + } else { + BWN_PHY_SETMASK(mac, BWN_PHY_LOWGAINDB, 0x00ff, 0x1e00); + BWN_PHY_SETMASK(mac, BWN_PHY_VERYLOWGAINDB, 0xff00, 0xd); + } + for (i = 0; i < N(v3); i++) + BWN_PHY_SETMASK(mac, v3[i].offset, v3[i].mask, v3[i].set); + if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + bwn_tab_write(mac, BWN_TAB_2(0x08, 0x14), 0); + bwn_tab_write(mac, BWN_TAB_2(0x08, 0x12), 0x40); + } + + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + BWN_PHY_SET(mac, BWN_PHY_CRSGAIN_CTL, 0x40); + BWN_PHY_SETMASK(mac, BWN_PHY_CRSGAIN_CTL, 0xf0ff, 0xb00); + BWN_PHY_SETMASK(mac, BWN_PHY_SYNCPEAKCNT, 0xfff8, 0x6); + BWN_PHY_SETMASK(mac, BWN_PHY_MINPWR_LEVEL, 0x00ff, 0x9d00); + BWN_PHY_SETMASK(mac, BWN_PHY_MINPWR_LEVEL, 0xff00, 0xa1); + BWN_PHY_MASK(mac, BWN_PHY_IDLEAFTERPKTRXTO, 0x00ff); + } else + BWN_PHY_MASK(mac, BWN_PHY_CRSGAIN_CTL, ~0x40); + + BWN_PHY_SETMASK(mac, BWN_PHY_CRS_ED_THRESH, 0xff00, 0xb3); + BWN_PHY_SETMASK(mac, BWN_PHY_CRS_ED_THRESH, 0x00ff, 0xad00); + BWN_PHY_SETMASK(mac, BWN_PHY_INPUT_PWRDB, 0xff00, plp->plp_rxpwroffset); + BWN_PHY_SET(mac, BWN_PHY_RESET_CTL, 0x44); + BWN_PHY_WRITE(mac, BWN_PHY_RESET_CTL, 0x80); + BWN_PHY_WRITE(mac, BWN_PHY_AFE_RSSI_CTL_0, 0xa954); + BWN_PHY_WRITE(mac, BWN_PHY_AFE_RSSI_CTL_1, + 0x2000 | ((uint16_t)plp->plp_rssigs << 10) | + ((uint16_t)plp->plp_rssivc << 4) | plp->plp_rssivf); + + if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + BWN_PHY_SET(mac, BWN_PHY_AFE_ADC_CTL_0, 0x1c); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_CTL, 0x00ff, 0x8800); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_ADC_CTL_1, 0xfc3c, 0x0400); + } + + bwn_phy_lp_digflt_save(mac); +} + +static void +bwn_phy_lp_bbinit_r01(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + static const struct bwn_smpair v1[] = { + { BWN_PHY_CLIPCTRTHRESH, 0xffe0, 0x0005 }, + { BWN_PHY_CLIPCTRTHRESH, 0xfc1f, 0x0180 }, + { BWN_PHY_CLIPCTRTHRESH, 0x83ff, 0x3c00 }, + { BWN_PHY_GAINDIRECTMISMATCH, 0xfff0, 0x0005 }, + { BWN_PHY_GAIN_MISMATCH_LIMIT, 0xffc0, 0x001a }, + { BWN_PHY_CRS_ED_THRESH, 0xff00, 0x00b3 }, + { BWN_PHY_CRS_ED_THRESH, 0x00ff, 0xad00 } + }; + static const struct bwn_smpair v2[] = { + { BWN_PHY_TR_LOOKUP_1, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_1, 0x3f00, 0x0900 }, + { BWN_PHY_TR_LOOKUP_2, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_2, 0xc0ff, 0x0b00 }, + { BWN_PHY_TR_LOOKUP_3, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_3, 0xc0ff, 0x0400 }, + { BWN_PHY_TR_LOOKUP_4, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_4, 0xc0ff, 0x0b00 }, + { BWN_PHY_TR_LOOKUP_5, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_5, 0xc0ff, 0x0900 }, + { BWN_PHY_TR_LOOKUP_6, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_6, 0xc0ff, 0x0b00 }, + { BWN_PHY_TR_LOOKUP_7, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_7, 0xc0ff, 0x0900 }, + { BWN_PHY_TR_LOOKUP_8, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_8, 0xc0ff, 0x0b00 } + }; + static const struct bwn_smpair v3[] = { + { BWN_PHY_TR_LOOKUP_1, 0xffc0, 0x0001 }, + { BWN_PHY_TR_LOOKUP_1, 0xc0ff, 0x0400 }, + { BWN_PHY_TR_LOOKUP_2, 0xffc0, 0x0001 }, + { BWN_PHY_TR_LOOKUP_2, 0xc0ff, 0x0500 }, + { BWN_PHY_TR_LOOKUP_3, 0xffc0, 0x0002 }, + { BWN_PHY_TR_LOOKUP_3, 0xc0ff, 0x0800 }, + { BWN_PHY_TR_LOOKUP_4, 0xffc0, 0x0002 }, + { BWN_PHY_TR_LOOKUP_4, 0xc0ff, 0x0a00 } + }; + static const struct bwn_smpair v4[] = { + { BWN_PHY_TR_LOOKUP_1, 0xffc0, 0x0004 }, + { BWN_PHY_TR_LOOKUP_1, 0xc0ff, 0x0800 }, + { BWN_PHY_TR_LOOKUP_2, 0xffc0, 0x0004 }, + { BWN_PHY_TR_LOOKUP_2, 0xc0ff, 0x0c00 }, + { BWN_PHY_TR_LOOKUP_3, 0xffc0, 0x0002 }, + { BWN_PHY_TR_LOOKUP_3, 0xc0ff, 0x0100 }, + { BWN_PHY_TR_LOOKUP_4, 0xffc0, 0x0002 }, + { BWN_PHY_TR_LOOKUP_4, 0xc0ff, 0x0300 } + }; + static const struct bwn_smpair v5[] = { + { BWN_PHY_TR_LOOKUP_1, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_1, 0xc0ff, 0x0900 }, + { BWN_PHY_TR_LOOKUP_2, 0xffc0, 0x000a }, + { BWN_PHY_TR_LOOKUP_2, 0xc0ff, 0x0b00 }, + { BWN_PHY_TR_LOOKUP_3, 0xffc0, 0x0006 }, + { BWN_PHY_TR_LOOKUP_3, 0xc0ff, 0x0500 }, + { BWN_PHY_TR_LOOKUP_4, 0xffc0, 0x0006 }, + { BWN_PHY_TR_LOOKUP_4, 0xc0ff, 0x0700 } + }; + int i; + uint16_t tmp, tmp2; + + BWN_PHY_MASK(mac, BWN_PHY_AFE_DAC_CTL, 0xf7ff); + BWN_PHY_WRITE(mac, BWN_PHY_AFE_CTL, 0); + BWN_PHY_WRITE(mac, BWN_PHY_AFE_CTL_OVR, 0); + BWN_PHY_WRITE(mac, BWN_PHY_RF_OVERRIDE_0, 0); + BWN_PHY_WRITE(mac, BWN_PHY_RF_OVERRIDE_2, 0); + BWN_PHY_SET(mac, BWN_PHY_AFE_DAC_CTL, 0x0004); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDMSYNCTHRESH0, 0xff00, 0x0078); + BWN_PHY_SETMASK(mac, BWN_PHY_CLIPCTRTHRESH, 0x83ff, 0x5800); + BWN_PHY_WRITE(mac, BWN_PHY_ADC_COMPENSATION_CTL, 0x0016); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_ADC_CTL_0, 0xfff8, 0x0004); + BWN_PHY_SETMASK(mac, BWN_PHY_VERYLOWGAINDB, 0x00ff, 0x5400); + BWN_PHY_SETMASK(mac, BWN_PHY_HIGAINDB, 0x00ff, 0x2400); + BWN_PHY_SETMASK(mac, BWN_PHY_LOWGAINDB, 0x00ff, 0x2100); + BWN_PHY_SETMASK(mac, BWN_PHY_VERYLOWGAINDB, 0xff00, 0x0006); + BWN_PHY_MASK(mac, BWN_PHY_RX_RADIO_CTL, 0xfffe); + for (i = 0; i < N(v1); i++) + BWN_PHY_SETMASK(mac, v1[i].offset, v1[i].mask, v1[i].set); + BWN_PHY_SETMASK(mac, BWN_PHY_INPUT_PWRDB, + 0xff00, plp->plp_rxpwroffset); + if ((siba->siba_sprom.bf_lo & BWN_BFL_FEM) && + ((IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) || + (siba->siba_sprom.bf_hi & BWN_BFH_LDO_PAREF))) { + siba_cc_pmu_set_ldovolt(&siba->siba_cc, SIBA_LDO_PAREF, 0x28); + siba_cc_pmu_set_ldoparef(&siba->siba_cc, 1); + if (mac->mac_phy.rev == 0) + BWN_PHY_SETMASK(mac, BWN_PHY_LP_RF_SIGNAL_LUT, + 0xffcf, 0x0010); + bwn_tab_write(mac, BWN_TAB_2(11, 7), 60); + } else { + siba_cc_pmu_set_ldoparef(&siba->siba_cc, 0); + BWN_PHY_SETMASK(mac, BWN_PHY_LP_RF_SIGNAL_LUT, 0xffcf, 0x0020); + bwn_tab_write(mac, BWN_TAB_2(11, 7), 100); + } + tmp = plp->plp_rssivf | plp->plp_rssivc << 4 | 0xa000; + BWN_PHY_WRITE(mac, BWN_PHY_AFE_RSSI_CTL_0, tmp); + if (siba->siba_sprom.bf_hi & BWN_BFH_RSSIINV) + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_RSSI_CTL_1, 0xf000, 0x0aaa); + else + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_RSSI_CTL_1, 0xf000, 0x02aa); + bwn_tab_write(mac, BWN_TAB_2(11, 1), 24); + BWN_PHY_SETMASK(mac, BWN_PHY_RX_RADIO_CTL, + 0xfff9, (plp->plp_bxarch << 1)); + if (mac->mac_phy.rev == 1 && + (siba->siba_sprom.bf_hi & BWN_BFH_FEM_BT)) { + for (i = 0; i < N(v2); i++) + BWN_PHY_SETMASK(mac, v2[i].offset, v2[i].mask, + v2[i].set); + } else if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) || + (siba->siba_board_type == 0x048a) || ((mac->mac_phy.rev == 0) && + (siba->siba_sprom.bf_lo & BWN_BFL_FEM))) { + for (i = 0; i < N(v3); i++) + BWN_PHY_SETMASK(mac, v3[i].offset, v3[i].mask, + v3[i].set); + } else if (mac->mac_phy.rev == 1 || + (siba->siba_sprom.bf_lo & BWN_BFL_FEM)) { + for (i = 0; i < N(v4); i++) + BWN_PHY_SETMASK(mac, v4[i].offset, v4[i].mask, + v4[i].set); + } else { + for (i = 0; i < N(v5); i++) + BWN_PHY_SETMASK(mac, v5[i].offset, v5[i].mask, + v5[i].set); + } + if (mac->mac_phy.rev == 1 && + (siba->siba_sprom.bf_hi & BWN_BFH_LDO_PAREF)) { + BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_5, BWN_PHY_TR_LOOKUP_1); + BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_6, BWN_PHY_TR_LOOKUP_2); + BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_7, BWN_PHY_TR_LOOKUP_3); + BWN_PHY_COPY(mac, BWN_PHY_TR_LOOKUP_8, BWN_PHY_TR_LOOKUP_4); + } + if ((siba->siba_sprom.bf_hi & BWN_BFH_FEM_BT) && + (siba->siba_chipid == 0x5354) && + (siba->siba_chippkg == SIBA_CHIPPACK_BCM4712S)) { + BWN_PHY_SET(mac, BWN_PHY_CRSGAIN_CTL, 0x0006); + BWN_PHY_WRITE(mac, BWN_PHY_GPIO_SELECT, 0x0005); + BWN_PHY_WRITE(mac, BWN_PHY_GPIO_OUTEN, 0xffff); + bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_PR45960W); + } + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + BWN_PHY_SET(mac, BWN_PHY_LP_PHY_CTL, 0x8000); + BWN_PHY_SET(mac, BWN_PHY_CRSGAIN_CTL, 0x0040); + BWN_PHY_SETMASK(mac, BWN_PHY_MINPWR_LEVEL, 0x00ff, 0xa400); + BWN_PHY_SETMASK(mac, BWN_PHY_CRSGAIN_CTL, 0xf0ff, 0x0b00); + BWN_PHY_SETMASK(mac, BWN_PHY_SYNCPEAKCNT, 0xfff8, 0x0007); + BWN_PHY_SETMASK(mac, BWN_PHY_DSSS_CONFIRM_CNT, 0xfff8, 0x0003); + BWN_PHY_SETMASK(mac, BWN_PHY_DSSS_CONFIRM_CNT, 0xffc7, 0x0020); + BWN_PHY_MASK(mac, BWN_PHY_IDLEAFTERPKTRXTO, 0x00ff); + } else { + BWN_PHY_MASK(mac, BWN_PHY_LP_PHY_CTL, 0x7fff); + BWN_PHY_MASK(mac, BWN_PHY_CRSGAIN_CTL, 0xffbf); + } + if (mac->mac_phy.rev == 1) { + tmp = BWN_PHY_READ(mac, BWN_PHY_CLIPCTRTHRESH); + tmp2 = (tmp & 0x03e0) >> 5; + tmp2 |= tmp2 << 5; + BWN_PHY_WRITE(mac, BWN_PHY_4C3, tmp2); + tmp = BWN_PHY_READ(mac, BWN_PHY_GAINDIRECTMISMATCH); + tmp2 = (tmp & 0x1f00) >> 8; + tmp2 |= tmp2 << 5; + BWN_PHY_WRITE(mac, BWN_PHY_4C4, tmp2); + tmp = BWN_PHY_READ(mac, BWN_PHY_VERYLOWGAINDB); + tmp2 = tmp & 0x00ff; + tmp2 |= tmp << 8; + BWN_PHY_WRITE(mac, BWN_PHY_4C5, tmp2); + } +} + +struct bwn_b2062_freq { + uint16_t freq; + uint8_t value[6]; +}; + +static void +bwn_phy_lp_b2062_init(struct bwn_mac *mac) +{ +#define CALC_CTL7(freq, div) \ + (((800000000 * (div) + (freq)) / (2 * (freq)) - 8) & 0xff) +#define CALC_CTL18(freq, div) \ + ((((100 * (freq) + 16000000 * (div)) / (32000000 * (div))) - 1) & 0xff) +#define CALC_CTL19(freq, div) \ + ((((2 * (freq) + 1000000 * (div)) / (2000000 * (div))) - 1) & 0xff) + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + static const struct bwn_b2062_freq freqdata_tab[] = { + { 12000, { 6, 6, 6, 6, 10, 6 } }, + { 13000, { 4, 4, 4, 4, 11, 7 } }, + { 14400, { 3, 3, 3, 3, 12, 7 } }, + { 16200, { 3, 3, 3, 3, 13, 8 } }, + { 18000, { 2, 2, 2, 2, 14, 8 } }, + { 19200, { 1, 1, 1, 1, 14, 9 } } + }; + static const struct bwn_wpair v1[] = { + { BWN_B2062_N_TXCTL3, 0 }, + { BWN_B2062_N_TXCTL4, 0 }, + { BWN_B2062_N_TXCTL5, 0 }, + { BWN_B2062_N_TXCTL6, 0 }, + { BWN_B2062_N_PDNCTL0, 0x40 }, + { BWN_B2062_N_PDNCTL0, 0 }, + { BWN_B2062_N_CALIB_TS, 0x10 }, + { BWN_B2062_N_CALIB_TS, 0 } + }; + const struct bwn_b2062_freq *f = NULL; + uint32_t xtalfreq, ref; + unsigned int i; + + bwn_phy_lp_b2062_tblinit(mac); + + for (i = 0; i < N(v1); i++) + BWN_RF_WRITE(mac, v1[i].reg, v1[i].value); + if (mac->mac_phy.rev > 0) + BWN_RF_WRITE(mac, BWN_B2062_S_BG_CTL1, + (BWN_RF_READ(mac, BWN_B2062_N_COM2) >> 1) | 0x80); + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + BWN_RF_SET(mac, BWN_B2062_N_TSSI_CTL0, 0x1); + else + BWN_RF_MASK(mac, BWN_B2062_N_TSSI_CTL0, ~0x1); + + KASSERT(siba->siba_cc.scc_caps & SIBA_CC_CAPS_PMU, + ("%s:%d: fail", __func__, __LINE__)); + xtalfreq = siba->siba_cc.scc_pmu.freq * 1000; + KASSERT(xtalfreq != 0, ("%s:%d: fail", __func__, __LINE__)); + + if (xtalfreq <= 30000000) { + plp->plp_div = 1; + BWN_RF_MASK(mac, BWN_B2062_S_RFPLLCTL1, 0xfffb); + } else { + plp->plp_div = 2; + BWN_RF_SET(mac, BWN_B2062_S_RFPLLCTL1, 0x4); + } + + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL7, + CALC_CTL7(xtalfreq, plp->plp_div)); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL18, + CALC_CTL18(xtalfreq, plp->plp_div)); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL19, + CALC_CTL19(xtalfreq, plp->plp_div)); + + ref = (1000 * plp->plp_div + 2 * xtalfreq) / (2000 * plp->plp_div); + ref &= 0xffff; + for (i = 0; i < N(freqdata_tab); i++) { + if (ref < freqdata_tab[i].freq) { + f = &freqdata_tab[i]; + break; + } + } + if (f == NULL) + f = &freqdata_tab[N(freqdata_tab) - 1]; + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL8, + ((uint16_t)(f->value[1]) << 4) | f->value[0]); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL9, + ((uint16_t)(f->value[3]) << 4) | f->value[2]); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL10, f->value[4]); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL11, f->value[5]); +#undef CALC_CTL7 +#undef CALC_CTL18 +#undef CALC_CTL19 +} + +static void +bwn_phy_lp_b2063_init(struct bwn_mac *mac) +{ + + bwn_phy_lp_b2063_tblinit(mac); + BWN_RF_WRITE(mac, BWN_B2063_LOGEN_SP5, 0); + BWN_RF_SET(mac, BWN_B2063_COM8, 0x38); + BWN_RF_WRITE(mac, BWN_B2063_REG_SP1, 0x56); + BWN_RF_MASK(mac, BWN_B2063_RX_BB_CTL2, ~0x2); + BWN_RF_WRITE(mac, BWN_B2063_PA_SP7, 0); + BWN_RF_WRITE(mac, BWN_B2063_TX_RF_SP6, 0x20); + BWN_RF_WRITE(mac, BWN_B2063_TX_RF_SP9, 0x40); + if (mac->mac_phy.rev == 2) { + BWN_RF_WRITE(mac, BWN_B2063_PA_SP3, 0xa0); + BWN_RF_WRITE(mac, BWN_B2063_PA_SP4, 0xa0); + BWN_RF_WRITE(mac, BWN_B2063_PA_SP2, 0x18); + } else { + BWN_RF_WRITE(mac, BWN_B2063_PA_SP3, 0x20); + BWN_RF_WRITE(mac, BWN_B2063_PA_SP2, 0x20); + } +} + +static void +bwn_phy_lp_rxcal_r2(struct bwn_mac *mac) +{ + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + static const struct bwn_wpair v1[] = { + { BWN_B2063_RX_BB_SP8, 0x0 }, + { BWN_B2063_RC_CALIB_CTL1, 0x7e }, + { BWN_B2063_RC_CALIB_CTL1, 0x7c }, + { BWN_B2063_RC_CALIB_CTL2, 0x15 }, + { BWN_B2063_RC_CALIB_CTL3, 0x70 }, + { BWN_B2063_RC_CALIB_CTL4, 0x52 }, + { BWN_B2063_RC_CALIB_CTL5, 0x1 }, + { BWN_B2063_RC_CALIB_CTL1, 0x7d } + }; + static const struct bwn_wpair v2[] = { + { BWN_B2063_TX_BB_SP3, 0x0 }, + { BWN_B2063_RC_CALIB_CTL1, 0x7e }, + { BWN_B2063_RC_CALIB_CTL1, 0x7c }, + { BWN_B2063_RC_CALIB_CTL2, 0x55 }, + { BWN_B2063_RC_CALIB_CTL3, 0x76 } + }; + uint32_t freqxtal = siba->siba_cc.scc_pmu.freq * 1000; + int i; + uint8_t tmp; + + tmp = BWN_RF_READ(mac, BWN_B2063_RX_BB_SP8) & 0xff; + + for (i = 0; i < 2; i++) + BWN_RF_WRITE(mac, v1[i].reg, v1[i].value); + BWN_RF_MASK(mac, BWN_B2063_PLL_SP1, 0xf7); + for (i = 2; i < N(v1); i++) + BWN_RF_WRITE(mac, v1[i].reg, v1[i].value); + for (i = 0; i < 10000; i++) { + if (BWN_RF_READ(mac, BWN_B2063_RC_CALIB_CTL6) & 0x2) + break; + DELAY(1000); + } + + if (!(BWN_RF_READ(mac, BWN_B2063_RC_CALIB_CTL6) & 0x2)) + BWN_RF_WRITE(mac, BWN_B2063_RX_BB_SP8, tmp); + + tmp = BWN_RF_READ(mac, BWN_B2063_TX_BB_SP3) & 0xff; + + for (i = 0; i < N(v2); i++) + BWN_RF_WRITE(mac, v2[i].reg, v2[i].value); + if (freqxtal == 24000000) { + BWN_RF_WRITE(mac, BWN_B2063_RC_CALIB_CTL4, 0xfc); + BWN_RF_WRITE(mac, BWN_B2063_RC_CALIB_CTL5, 0x0); + } else { + BWN_RF_WRITE(mac, BWN_B2063_RC_CALIB_CTL4, 0x13); + BWN_RF_WRITE(mac, BWN_B2063_RC_CALIB_CTL5, 0x1); + } + BWN_RF_WRITE(mac, BWN_B2063_PA_SP7, 0x7d); + for (i = 0; i < 10000; i++) { + if (BWN_RF_READ(mac, BWN_B2063_RC_CALIB_CTL6) & 0x2) + break; + DELAY(1000); + } + if (!(BWN_RF_READ(mac, BWN_B2063_RC_CALIB_CTL6) & 0x2)) + BWN_RF_WRITE(mac, BWN_B2063_TX_BB_SP3, tmp); + BWN_RF_WRITE(mac, BWN_B2063_RC_CALIB_CTL1, 0x7e); +} + +static void +bwn_phy_lp_rccal_r12(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct bwn_softc *sc = mac->mac_sc; + struct bwn_phy_lp_iq_est ie; + struct bwn_txgain tx_gains; + static const uint32_t pwrtbl[21] = { + 0x10000, 0x10557, 0x10e2d, 0x113e0, 0x10f22, 0x0ff64, + 0x0eda2, 0x0e5d4, 0x0efd1, 0x0fbe8, 0x0b7b8, 0x04b35, + 0x01a5e, 0x00a0b, 0x00444, 0x001fd, 0x000ff, 0x00088, + 0x0004c, 0x0002c, 0x0001a, + }; + uint32_t npwr, ipwr, sqpwr, tmp; + int loopback, i, j, sum, error; + uint16_t save[7]; + uint8_t txo, bbmult, txpctlmode; + + error = bwn_phy_lp_switch_channel(mac, 7); + if (error) + device_printf(sc->sc_dev, + "failed to change channel to 7 (%d)\n", error); + txo = (BWN_PHY_READ(mac, BWN_PHY_AFE_CTL_OVR) & 0x40) ? 1 : 0; + bbmult = bwn_phy_lp_get_bbmult(mac); + if (txo) + tx_gains = bwn_phy_lp_get_txgain(mac); + + save[0] = BWN_PHY_READ(mac, BWN_PHY_RF_OVERRIDE_0); + save[1] = BWN_PHY_READ(mac, BWN_PHY_RF_OVERRIDE_VAL_0); + save[2] = BWN_PHY_READ(mac, BWN_PHY_AFE_CTL_OVR); + save[3] = BWN_PHY_READ(mac, BWN_PHY_AFE_CTL_OVRVAL); + save[4] = BWN_PHY_READ(mac, BWN_PHY_RF_OVERRIDE_2); + save[5] = BWN_PHY_READ(mac, BWN_PHY_RF_OVERRIDE_2_VAL); + save[6] = BWN_PHY_READ(mac, BWN_PHY_LP_PHY_CTL); + + bwn_phy_lp_get_txpctlmode(mac); + txpctlmode = plp->plp_txpctlmode; + bwn_phy_lp_set_txpctlmode(mac, BWN_PHYLP_TXPCTL_OFF); + + /* disable CRS */ + bwn_phy_lp_set_deaf(mac, 1); + bwn_phy_lp_set_trsw_over(mac, 0, 1); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xfffb); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x4); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xfff7); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x8); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0x10); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x10); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xffdf); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x20); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xffbf); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x40); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0x7); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0x38); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xff3f); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0x100); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xfdff); + BWN_PHY_WRITE(mac, BWN_PHY_PS_CTL_OVERRIDE_VAL0, 0); + BWN_PHY_WRITE(mac, BWN_PHY_PS_CTL_OVERRIDE_VAL1, 1); + BWN_PHY_WRITE(mac, BWN_PHY_PS_CTL_OVERRIDE_VAL2, 0x20); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xfbff); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xf7ff); + BWN_PHY_WRITE(mac, BWN_PHY_TX_GAIN_CTL_OVERRIDE_VAL, 0); + BWN_PHY_WRITE(mac, BWN_PHY_RX_GAIN_CTL_OVERRIDE_VAL, 0x45af); + BWN_PHY_WRITE(mac, BWN_PHY_RF_OVERRIDE_2, 0x3ff); + + loopback = bwn_phy_lp_loopback(mac); + if (loopback == -1) + goto done; + bwn_phy_lp_set_rxgain_idx(mac, loopback); + BWN_PHY_SETMASK(mac, BWN_PHY_LP_PHY_CTL, 0xffbf, 0x40); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xfff8, 0x1); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xffc7, 0x8); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, 0xff3f, 0xc0); + + tmp = 0; + memset(&ie, 0, sizeof(ie)); + for (i = 128; i <= 159; i++) { + BWN_RF_WRITE(mac, BWN_B2062_N_RXBB_CALIB2, i); + sum = 0; + for (j = 5; j <= 25; j++) { + bwn_phy_lp_ddfs_turnon(mac, 1, 1, j, j, 0); + if (!(bwn_phy_lp_rx_iq_est(mac, 1000, 32, &ie))) + goto done; + sqpwr = ie.ie_ipwr + ie.ie_qpwr; + ipwr = ((pwrtbl[j - 5] >> 3) + 1) >> 1; + npwr = bwn_phy_lp_roundup(sqpwr, (j == 5) ? sqpwr : 0, + 12); + sum += ((ipwr - npwr) * (ipwr - npwr)); + if ((i == 128) || (sum < tmp)) { + plp->plp_rccap = i; + tmp = sum; + } + } + } + bwn_phy_lp_ddfs_turnoff(mac); +done: + /* restore CRS */ + bwn_phy_lp_clear_deaf(mac, 1); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_0, 0xff80); + BWN_PHY_MASK(mac, BWN_PHY_RF_OVERRIDE_2, 0xfc00); + + BWN_PHY_WRITE(mac, BWN_PHY_RF_OVERRIDE_VAL_0, save[1]); + BWN_PHY_WRITE(mac, BWN_PHY_RF_OVERRIDE_0, save[0]); + BWN_PHY_WRITE(mac, BWN_PHY_AFE_CTL_OVRVAL, save[3]); + BWN_PHY_WRITE(mac, BWN_PHY_AFE_CTL_OVR, save[2]); + BWN_PHY_WRITE(mac, BWN_PHY_RF_OVERRIDE_2_VAL, save[5]); + BWN_PHY_WRITE(mac, BWN_PHY_RF_OVERRIDE_2, save[4]); + BWN_PHY_WRITE(mac, BWN_PHY_LP_PHY_CTL, save[6]); + + bwn_phy_lp_set_bbmult(mac, bbmult); + if (txo) + bwn_phy_lp_set_txgain(mac, &tx_gains); + bwn_phy_lp_set_txpctlmode(mac, txpctlmode); + if (plp->plp_rccap) + bwn_phy_lp_set_rccap(mac); +} + +static void +bwn_phy_lp_set_rccap(struct bwn_mac *mac) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + uint8_t rc_cap = (plp->plp_rccap & 0x1f) >> 1; + + if (mac->mac_phy.rev == 1) + rc_cap = MIN(rc_cap + 5, 15); + + BWN_RF_WRITE(mac, BWN_B2062_N_RXBB_CALIB2, + MAX(plp->plp_rccap - 4, 0x80)); + BWN_RF_WRITE(mac, BWN_B2062_N_TXCTL_A, rc_cap | 0x80); + BWN_RF_WRITE(mac, BWN_B2062_S_RXG_CNT16, + ((plp->plp_rccap & 0x1f) >> 2) | 0x80); +} + +static uint32_t +bwn_phy_lp_roundup(uint32_t value, uint32_t div, uint8_t pre) +{ + uint32_t i, q, r; + + if (div == 0) + return (0); + + for (i = 0, q = value / div, r = value % div; i < pre; i++) { + q <<= 1; + if (r << 1 >= div) { + q++; + r = (r << 1) - div; + } + } + if (r << 1 >= div) + q++; + return (q); +} + +static void +bwn_phy_lp_b2062_reset_pllbias(struct bwn_mac *mac) +{ + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL2, 0xff); + DELAY(20); + if (siba->siba_chipid == 0x5354) { + BWN_RF_WRITE(mac, BWN_B2062_N_COM1, 4); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL2, 4); + } else { + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL2, 0); + } + DELAY(5); +} + +static void +bwn_phy_lp_b2062_vco_calib(struct bwn_mac *mac) +{ + + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL21, 0x42); + BWN_RF_WRITE(mac, BWN_B2062_S_RFPLLCTL21, 0x62); + DELAY(200); +} + +static void +bwn_phy_lp_b2062_tblinit(struct bwn_mac *mac) +{ +#define FLAG_A 0x01 +#define FLAG_G 0x02 + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + static const struct bwn_b206x_rfinit_entry bwn_b2062_init_tab[] = { + { BWN_B2062_N_COM4, 0x1, 0x0, FLAG_A | FLAG_G, }, + { BWN_B2062_N_PDNCTL1, 0x0, 0xca, FLAG_G, }, + { BWN_B2062_N_PDNCTL3, 0x0, 0x0, FLAG_A | FLAG_G, }, + { BWN_B2062_N_PDNCTL4, 0x15, 0x2a, FLAG_A | FLAG_G, }, + { BWN_B2062_N_LGENC, 0xDB, 0xff, FLAG_A, }, + { BWN_B2062_N_LGENATUNE0, 0xdd, 0x0, FLAG_A | FLAG_G, }, + { BWN_B2062_N_LGENATUNE2, 0xdd, 0x0, FLAG_A | FLAG_G, }, + { BWN_B2062_N_LGENATUNE3, 0x77, 0xB5, FLAG_A | FLAG_G, }, + { BWN_B2062_N_LGENACTL3, 0x0, 0xff, FLAG_A | FLAG_G, }, + { BWN_B2062_N_LGENACTL7, 0x33, 0x33, FLAG_A | FLAG_G, }, + { BWN_B2062_N_RXA_CTL1, 0x0, 0x0, FLAG_G, }, + { BWN_B2062_N_RXBB_CTL0, 0x82, 0x80, FLAG_A | FLAG_G, }, + { BWN_B2062_N_RXBB_GAIN1, 0x4, 0x4, FLAG_A | FLAG_G, }, + { BWN_B2062_N_RXBB_GAIN2, 0x0, 0x0, FLAG_A | FLAG_G, }, + { BWN_B2062_N_TXCTL4, 0x3, 0x3, FLAG_A | FLAG_G, }, + { BWN_B2062_N_TXCTL5, 0x2, 0x2, FLAG_A | FLAG_G, }, + { BWN_B2062_N_TX_TUNE, 0x88, 0x1b, FLAG_A | FLAG_G, }, + { BWN_B2062_S_COM4, 0x1, 0x0, FLAG_A | FLAG_G, }, + { BWN_B2062_S_PDS_CTL0, 0xff, 0xff, FLAG_A | FLAG_G, }, + { BWN_B2062_S_LGENG_CTL0, 0xf8, 0xd8, FLAG_A | FLAG_G, }, + { BWN_B2062_S_LGENG_CTL1, 0x3c, 0x24, FLAG_A | FLAG_G, }, + { BWN_B2062_S_LGENG_CTL8, 0x88, 0x80, FLAG_A | FLAG_G, }, + { BWN_B2062_S_LGENG_CTL10, 0x88, 0x80, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL0, 0x98, 0x98, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL1, 0x10, 0x10, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL5, 0x43, 0x43, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL6, 0x47, 0x47, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL7, 0xc, 0xc, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL8, 0x11, 0x11, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL9, 0x11, 0x11, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL10, 0xe, 0xe, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL11, 0x8, 0x8, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL12, 0x33, 0x33, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL13, 0xa, 0xa, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL14, 0x6, 0x6, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL18, 0x3e, 0x3e, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL19, 0x13, 0x13, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL21, 0x62, 0x62, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL22, 0x7, 0x7, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL23, 0x16, 0x16, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL24, 0x5c, 0x5c, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL25, 0x95, 0x95, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL30, 0xa0, 0xa0, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL31, 0x4, 0x4, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL33, 0xcc, 0xcc, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RFPLLCTL34, 0x7, 0x7, FLAG_A | FLAG_G, }, + { BWN_B2062_S_RXG_CNT8, 0xf, 0xf, FLAG_A, }, + }; + const struct bwn_b206x_rfinit_entry *br; + unsigned int i; + + for (i = 0; i < N(bwn_b2062_init_tab); i++) { + br = &bwn_b2062_init_tab[i]; + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + if (br->br_flags & FLAG_G) + BWN_RF_WRITE(mac, br->br_offset, br->br_valueg); + } else { + if (br->br_flags & FLAG_A) + BWN_RF_WRITE(mac, br->br_offset, br->br_valuea); + } + } +#undef FLAG_A +#undef FLAG_B +} + +static void +bwn_phy_lp_b2063_tblinit(struct bwn_mac *mac) +{ +#define FLAG_A 0x01 +#define FLAG_G 0x02 + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + static const struct bwn_b206x_rfinit_entry bwn_b2063_init_tab[] = { + { BWN_B2063_COM1, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM10, 0x1, 0x0, FLAG_A, }, + { BWN_B2063_COM16, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM17, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM18, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM19, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM20, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM21, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM22, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM23, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_COM24, 0x0, 0x0, FLAG_G, }, + { BWN_B2063_LOGEN_SP1, 0xe8, 0xd4, FLAG_A | FLAG_G, }, + { BWN_B2063_LOGEN_SP2, 0xa7, 0x53, FLAG_A | FLAG_G, }, + { BWN_B2063_LOGEN_SP4, 0xf0, 0xf, FLAG_A | FLAG_G, }, + { BWN_B2063_G_RX_SP1, 0x1f, 0x5e, FLAG_G, }, + { BWN_B2063_G_RX_SP2, 0x7f, 0x7e, FLAG_G, }, + { BWN_B2063_G_RX_SP3, 0x30, 0xf0, FLAG_G, }, + { BWN_B2063_G_RX_SP7, 0x7f, 0x7f, FLAG_A | FLAG_G, }, + { BWN_B2063_G_RX_SP10, 0xc, 0xc, FLAG_A | FLAG_G, }, + { BWN_B2063_A_RX_SP1, 0x3c, 0x3f, FLAG_A, }, + { BWN_B2063_A_RX_SP2, 0xfc, 0xfe, FLAG_A, }, + { BWN_B2063_A_RX_SP7, 0x8, 0x8, FLAG_A | FLAG_G, }, + { BWN_B2063_RX_BB_SP4, 0x60, 0x60, FLAG_A | FLAG_G, }, + { BWN_B2063_RX_BB_SP8, 0x30, 0x30, FLAG_A | FLAG_G, }, + { BWN_B2063_TX_RF_SP3, 0xc, 0xb, FLAG_A | FLAG_G, }, + { BWN_B2063_TX_RF_SP4, 0x10, 0xf, FLAG_A | FLAG_G, }, + { BWN_B2063_PA_SP1, 0x3d, 0xfd, FLAG_A | FLAG_G, }, + { BWN_B2063_TX_BB_SP1, 0x2, 0x2, FLAG_A | FLAG_G, }, + { BWN_B2063_BANDGAP_CTL1, 0x56, 0x56, FLAG_A | FLAG_G, }, + { BWN_B2063_JTAG_VCO2, 0xF7, 0xF7, FLAG_A | FLAG_G, }, + { BWN_B2063_G_RX_MIX3, 0x71, 0x71, FLAG_A | FLAG_G, }, + { BWN_B2063_G_RX_MIX4, 0x71, 0x71, FLAG_A | FLAG_G, }, + { BWN_B2063_A_RX_1ST2, 0xf0, 0x30, FLAG_A, }, + { BWN_B2063_A_RX_PS6, 0x77, 0x77, FLAG_A | FLAG_G, }, + { BWN_B2063_A_RX_MIX4, 0x3, 0x3, FLAG_A | FLAG_G, }, + { BWN_B2063_A_RX_MIX5, 0xf, 0xf, FLAG_A | FLAG_G, }, + { BWN_B2063_A_RX_MIX6, 0xf, 0xf, FLAG_A | FLAG_G, }, + { BWN_B2063_RX_TIA_CTL1, 0x77, 0x77, FLAG_A | FLAG_G, }, + { BWN_B2063_RX_TIA_CTL3, 0x77, 0x77, FLAG_A | FLAG_G, }, + { BWN_B2063_RX_BB_CTL2, 0x4, 0x4, FLAG_A | FLAG_G, }, + { BWN_B2063_PA_CTL1, 0x0, 0x4, FLAG_A, }, + { BWN_B2063_VREG_CTL1, 0x3, 0x3, FLAG_A | FLAG_G, }, + }; + const struct bwn_b206x_rfinit_entry *br; + unsigned int i; + + for (i = 0; i < N(bwn_b2063_init_tab); i++) { + br = &bwn_b2063_init_tab[i]; + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + if (br->br_flags & FLAG_G) + BWN_RF_WRITE(mac, br->br_offset, br->br_valueg); + } else { + if (br->br_flags & FLAG_A) + BWN_RF_WRITE(mac, br->br_offset, br->br_valuea); + } + } +#undef FLAG_A +#undef FLAG_B +} + +static void +bwn_tab_read_multi(struct bwn_mac *mac, uint32_t typenoffset, + int count, void *_data) +{ + unsigned int i; + uint32_t offset, type; + uint8_t *data = _data; + + type = BWN_TAB_GETTYPE(typenoffset); + offset = BWN_TAB_GETOFFSET(typenoffset); + KASSERT(offset <= 0xffff, ("%s:%d: fail", __func__, __LINE__)); + + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + + for (i = 0; i < count; i++) { + switch (type) { + case BWN_TAB_8BIT: + *data = BWN_PHY_READ(mac, BWN_PHY_TABLEDATALO) & 0xff; + data++; + break; + case BWN_TAB_16BIT: + *((uint16_t *)data) = BWN_PHY_READ(mac, + BWN_PHY_TABLEDATALO); + data += 2; + break; + case BWN_TAB_32BIT: + *((uint32_t *)data) = BWN_PHY_READ(mac, + BWN_PHY_TABLEDATAHI); + *((uint32_t *)data) <<= 16; + *((uint32_t *)data) |= BWN_PHY_READ(mac, + BWN_PHY_TABLEDATALO); + data += 4; + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + } +} + +static void +bwn_tab_write_multi(struct bwn_mac *mac, uint32_t typenoffset, + int count, const void *_data) +{ + uint32_t offset, type, value; + const uint8_t *data = _data; + unsigned int i; + + type = BWN_TAB_GETTYPE(typenoffset); + offset = BWN_TAB_GETOFFSET(typenoffset); + KASSERT(offset <= 0xffff, ("%s:%d: fail", __func__, __LINE__)); + + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + + for (i = 0; i < count; i++) { + switch (type) { + case BWN_TAB_8BIT: + value = *data; + data++; + KASSERT(!(value & ~0xff), + ("%s:%d: fail", __func__, __LINE__)); + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATALO, value); + break; + case BWN_TAB_16BIT: + value = *((const uint16_t *)data); + data += 2; + KASSERT(!(value & ~0xffff), + ("%s:%d: fail", __func__, __LINE__)); + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATALO, value); + break; + case BWN_TAB_32BIT: + value = *((const uint32_t *)data); + data += 4; + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATAHI, value >> 16); + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATALO, value); + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } + } +} + +static struct bwn_txgain +bwn_phy_lp_get_txgain(struct bwn_mac *mac) +{ + struct bwn_txgain tg; + uint16_t tmp; + + tg.tg_dac = (BWN_PHY_READ(mac, BWN_PHY_AFE_DAC_CTL) & 0x380) >> 7; + if (mac->mac_phy.rev < 2) { + tmp = BWN_PHY_READ(mac, + BWN_PHY_TX_GAIN_CTL_OVERRIDE_VAL) & 0x7ff; + tg.tg_gm = tmp & 0x0007; + tg.tg_pga = (tmp & 0x0078) >> 3; + tg.tg_pad = (tmp & 0x780) >> 7; + return (tg); + } + + tmp = BWN_PHY_READ(mac, BWN_PHY_TX_GAIN_CTL_OVERRIDE_VAL); + tg.tg_pad = BWN_PHY_READ(mac, BWN_PHY_OFDM(0xfb)) & 0xff; + tg.tg_gm = tmp & 0xff; + tg.tg_pga = (tmp >> 8) & 0xff; + return (tg); +} + +static uint8_t +bwn_phy_lp_get_bbmult(struct bwn_mac *mac) +{ + + return (bwn_tab_read(mac, BWN_TAB_2(0, 87)) & 0xff00) >> 8; +} + +static void +bwn_phy_lp_set_txgain(struct bwn_mac *mac, struct bwn_txgain *tg) +{ + uint16_t pa; + + if (mac->mac_phy.rev < 2) { + BWN_PHY_SETMASK(mac, BWN_PHY_TX_GAIN_CTL_OVERRIDE_VAL, 0xf800, + (tg->tg_pad << 7) | (tg->tg_pga << 3) | tg->tg_gm); + bwn_phy_lp_set_txgain_dac(mac, tg->tg_dac); + bwn_phy_lp_set_txgain_override(mac); + return; + } + + pa = bwn_phy_lp_get_pa_gain(mac); + BWN_PHY_WRITE(mac, BWN_PHY_TX_GAIN_CTL_OVERRIDE_VAL, + (tg->tg_pga << 8) | tg->tg_gm); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xfb), 0x8000, + tg->tg_pad | (pa << 6)); + BWN_PHY_WRITE(mac, BWN_PHY_OFDM(0xfc), (tg->tg_pga << 8) | tg->tg_gm); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xfd), 0x8000, + tg->tg_pad | (pa << 8)); + bwn_phy_lp_set_txgain_dac(mac, tg->tg_dac); + bwn_phy_lp_set_txgain_override(mac); +} + +static void +bwn_phy_lp_set_bbmult(struct bwn_mac *mac, uint8_t bbmult) +{ + + bwn_tab_write(mac, BWN_TAB_2(0, 87), (uint16_t)bbmult << 8); +} + +static void +bwn_phy_lp_set_trsw_over(struct bwn_mac *mac, uint8_t tx, uint8_t rx) +{ + uint16_t trsw = (tx << 1) | rx; + + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xfffc, trsw); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x3); +} + +static void +bwn_phy_lp_set_rxgain(struct bwn_mac *mac, uint32_t gain) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint16_t ext_lna, high_gain, lna, low_gain, trsw, tmp; + + if (mac->mac_phy.rev < 2) { + trsw = gain & 0x1; + lna = (gain & 0xfffc) | ((gain & 0xc) >> 2); + ext_lna = (gain & 2) >> 1; + + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xfffe, trsw); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, + 0xfbff, ext_lna << 10); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, + 0xf7ff, ext_lna << 11); + BWN_PHY_WRITE(mac, BWN_PHY_RX_GAIN_CTL_OVERRIDE_VAL, lna); + } else { + low_gain = gain & 0xffff; + high_gain = (gain >> 16) & 0xf; + ext_lna = (gain >> 21) & 0x1; + trsw = ~(gain >> 20) & 0x1; + + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0xfffe, trsw); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, + 0xfdff, ext_lna << 9); + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, + 0xfbff, ext_lna << 10); + BWN_PHY_WRITE(mac, BWN_PHY_RX_GAIN_CTL_OVERRIDE_VAL, low_gain); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_DDFS, 0xfff0, high_gain); + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + tmp = (gain >> 2) & 0x3; + BWN_PHY_SETMASK(mac, BWN_PHY_RF_OVERRIDE_2_VAL, + 0xe7ff, tmp<<11); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xe6), 0xffe7, + tmp << 3); + } + } + + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x1); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x10); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x40); + if (mac->mac_phy.rev >= 2) { + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x100); + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x400); + BWN_PHY_SET(mac, BWN_PHY_OFDM(0xe5), 0x8); + } + return; + } + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x200); +} + +static void +bwn_phy_lp_set_deaf(struct bwn_mac *mac, uint8_t user) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + + if (user) + plp->plp_crsusr_off = 1; + else + plp->plp_crssys_off = 1; + + BWN_PHY_SETMASK(mac, BWN_PHY_CRSGAIN_CTL, 0xff1f, 0x80); +} + +static void +bwn_phy_lp_clear_deaf(struct bwn_mac *mac, uint8_t user) +{ + struct bwn_phy_lp *plp = &mac->mac_phy.phy_lp; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + if (user) + plp->plp_crsusr_off = 0; + else + plp->plp_crssys_off = 0; + + if (plp->plp_crsusr_off || plp->plp_crssys_off) + return; + + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + BWN_PHY_SETMASK(mac, BWN_PHY_CRSGAIN_CTL, 0xff1f, 0x60); + else + BWN_PHY_SETMASK(mac, BWN_PHY_CRSGAIN_CTL, 0xff1f, 0x20); +} + +static unsigned int +bwn_sqrt(struct bwn_mac *mac, unsigned int x) +{ + /* Table holding (10 * sqrt(x)) for x between 1 and 256. */ + static uint8_t sqrt_table[256] = { + 10, 14, 17, 20, 22, 24, 26, 28, + 30, 31, 33, 34, 36, 37, 38, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 50, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 60, 61, 62, 63, + 64, 64, 65, 66, 67, 67, 68, 69, + 70, 70, 71, 72, 72, 73, 74, 74, + 75, 76, 76, 77, 78, 78, 79, 80, + 80, 81, 81, 82, 83, 83, 84, 84, + 85, 86, 86, 87, 87, 88, 88, 89, + 90, 90, 91, 91, 92, 92, 93, 93, + 94, 94, 95, 95, 96, 96, 97, 97, + 98, 98, 99, 100, 100, 100, 101, 101, + 102, 102, 103, 103, 104, 104, 105, 105, + 106, 106, 107, 107, 108, 108, 109, 109, + 110, 110, 110, 111, 111, 112, 112, 113, + 113, 114, 114, 114, 115, 115, 116, 116, + 117, 117, 117, 118, 118, 119, 119, 120, + 120, 120, 121, 121, 122, 122, 122, 123, + 123, 124, 124, 124, 125, 125, 126, 126, + 126, 127, 127, 128, 128, 128, 129, 129, + 130, 130, 130, 131, 131, 131, 132, 132, + 133, 133, 133, 134, 134, 134, 135, 135, + 136, 136, 136, 137, 137, 137, 138, 138, + 138, 139, 139, 140, 140, 140, 141, 141, + 141, 142, 142, 142, 143, 143, 143, 144, + 144, 144, 145, 145, 145, 146, 146, 146, + 147, 147, 147, 148, 148, 148, 149, 149, + 150, 150, 150, 150, 151, 151, 151, 152, + 152, 152, 153, 153, 153, 154, 154, 154, + 155, 155, 155, 156, 156, 156, 157, 157, + 157, 158, 158, 158, 159, 159, 159, 160 + }; + + if (x == 0) + return (0); + if (x >= 256) { + unsigned int tmp; + + for (tmp = 0; x >= (2 * tmp) + 1; x -= (2 * tmp++) + 1) + /* do nothing */ ; + return (tmp); + } + return (sqrt_table[x - 1] / 10); +} + +static int +bwn_phy_lp_calc_rx_iq_comp(struct bwn_mac *mac, uint16_t sample) +{ +#define CALC_COEFF(_v, _x, _y, _z) do { \ + int _t; \ + _t = _x - 20; \ + if (_t >= 0) { \ + _v = ((_y << (30 - _x)) + (_z >> (1 + _t))) / (_z >> _t); \ + } else { \ + _v = ((_y << (30 - _x)) + (_z << (-1 - _t))) / (_z << -_t); \ + } \ +} while (0) +#define CALC_COEFF2(_v, _x, _y, _z) do { \ + int _t; \ + _t = _x - 11; \ + if (_t >= 0) \ + tmp[3] = (_y << (31 - _x)) / (_z >> _t); \ + else \ + tmp[3] = (_y << (31 - _x)) / (_z << -_t); \ +} while (0) + struct bwn_phy_lp_iq_est ie; + uint16_t v0, v1; + int tmp[2], ret; + + v1 = BWN_PHY_READ(mac, BWN_PHY_RX_COMP_COEFF_S); + v0 = v1 >> 8; + v1 |= 0xff; + + BWN_PHY_SETMASK(mac, BWN_PHY_RX_COMP_COEFF_S, 0xff00, 0x00c0); + BWN_PHY_MASK(mac, BWN_PHY_RX_COMP_COEFF_S, 0x00ff); + + ret = bwn_phy_lp_rx_iq_est(mac, sample, 32, &ie); + if (ret == 0) + goto done; + + if (ie.ie_ipwr + ie.ie_qpwr < 2) { + ret = 0; + goto done; + } + + CALC_COEFF(tmp[0], bwn_nbits(ie.ie_iqprod), ie.ie_iqprod, ie.ie_ipwr); + CALC_COEFF2(tmp[1], bwn_nbits(ie.ie_qpwr), ie.ie_qpwr, ie.ie_ipwr); + + tmp[1] = -bwn_sqrt(mac, tmp[1] - (tmp[0] * tmp[0])); + v0 = tmp[0] >> 3; + v1 = tmp[1] >> 4; +done: + BWN_PHY_SETMASK(mac, BWN_PHY_RX_COMP_COEFF_S, 0xff00, v1); + BWN_PHY_SETMASK(mac, BWN_PHY_RX_COMP_COEFF_S, 0x00ff, v0 << 8); + return ret; +#undef CALC_COEFF +#undef CALC_COEFF2 +} + +static void +bwn_phy_lp_tblinit_r01(struct bwn_mac *mac) +{ + static const uint16_t noisescale[] = { + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa400, 0xa4a4, 0xa4a4, + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, + 0xa4a4, 0xa4a4, 0x00a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x4c00, 0x2d36, 0x0000, 0x0000, 0x4c00, 0x2d36, + }; + static const uint16_t crsgainnft[] = { + 0x0366, 0x036a, 0x036f, 0x0364, 0x0367, 0x036d, 0x0374, 0x037f, + 0x036f, 0x037b, 0x038a, 0x0378, 0x0367, 0x036d, 0x0375, 0x0381, + 0x0374, 0x0381, 0x0392, 0x03a9, 0x03c4, 0x03e1, 0x0001, 0x001f, + 0x0040, 0x005e, 0x007f, 0x009e, 0x00bd, 0x00dd, 0x00fd, 0x011d, + 0x013d, + }; + static const uint16_t filterctl[] = { + 0xa0fc, 0x10fc, 0x10db, 0x20b7, 0xff93, 0x10bf, 0x109b, 0x2077, + 0xff53, 0x0127, + }; + static const uint32_t psctl[] = { + 0x00010000, 0x000000a0, 0x00040000, 0x00000048, 0x08080101, + 0x00000080, 0x08080101, 0x00000040, 0x08080101, 0x000000c0, + 0x08a81501, 0x000000c0, 0x0fe8fd01, 0x000000c0, 0x08300105, + 0x000000c0, 0x08080201, 0x000000c0, 0x08280205, 0x000000c0, + 0xe80802fe, 0x000000c7, 0x28080206, 0x000000c0, 0x08080202, + 0x000000c0, 0x0ba87602, 0x000000c0, 0x1068013d, 0x000000c0, + 0x10280105, 0x000000c0, 0x08880102, 0x000000c0, 0x08280106, + 0x000000c0, 0xe80801fd, 0x000000c7, 0xa8080115, 0x000000c0, + }; + static const uint16_t ofdmcckgain_r0[] = { + 0x0001, 0x0001, 0x0001, 0x0001, 0x1001, 0x2001, 0x3001, 0x4001, + 0x5001, 0x6001, 0x7001, 0x7011, 0x7021, 0x2035, 0x2045, 0x2055, + 0x2065, 0x2075, 0x006d, 0x007d, 0x014d, 0x015d, 0x115d, 0x035d, + 0x135d, 0x055d, 0x155d, 0x0d5d, 0x1d5d, 0x2d5d, 0x555d, 0x655d, + 0x755d, + }; + static const uint16_t ofdmcckgain_r1[] = { + 0x5000, 0x6000, 0x7000, 0x0001, 0x1001, 0x2001, 0x3001, 0x4001, + 0x5001, 0x6001, 0x7001, 0x7011, 0x7021, 0x2035, 0x2045, 0x2055, + 0x2065, 0x2075, 0x006d, 0x007d, 0x014d, 0x015d, 0x115d, 0x035d, + 0x135d, 0x055d, 0x155d, 0x0d5d, 0x1d5d, 0x2d5d, 0x555d, 0x655d, + 0x755d, + }; + static const uint16_t gaindelta[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, + }; + static const uint32_t txpwrctl[] = { + 0x00000050, 0x0000004f, 0x0000004e, 0x0000004d, 0x0000004c, + 0x0000004b, 0x0000004a, 0x00000049, 0x00000048, 0x00000047, + 0x00000046, 0x00000045, 0x00000044, 0x00000043, 0x00000042, + 0x00000041, 0x00000040, 0x0000003f, 0x0000003e, 0x0000003d, + 0x0000003c, 0x0000003b, 0x0000003a, 0x00000039, 0x00000038, + 0x00000037, 0x00000036, 0x00000035, 0x00000034, 0x00000033, + 0x00000032, 0x00000031, 0x00000030, 0x0000002f, 0x0000002e, + 0x0000002d, 0x0000002c, 0x0000002b, 0x0000002a, 0x00000029, + 0x00000028, 0x00000027, 0x00000026, 0x00000025, 0x00000024, + 0x00000023, 0x00000022, 0x00000021, 0x00000020, 0x0000001f, + 0x0000001e, 0x0000001d, 0x0000001c, 0x0000001b, 0x0000001a, + 0x00000019, 0x00000018, 0x00000017, 0x00000016, 0x00000015, + 0x00000014, 0x00000013, 0x00000012, 0x00000011, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x000075a0, 0x000075a0, 0x000075a1, + 0x000075a1, 0x000075a2, 0x000075a2, 0x000075a3, 0x000075a3, + 0x000074b0, 0x000074b0, 0x000074b1, 0x000074b1, 0x000074b2, + 0x000074b2, 0x000074b3, 0x000074b3, 0x00006d20, 0x00006d20, + 0x00006d21, 0x00006d21, 0x00006d22, 0x00006d22, 0x00006d23, + 0x00006d23, 0x00004660, 0x00004660, 0x00004661, 0x00004661, + 0x00004662, 0x00004662, 0x00004663, 0x00004663, 0x00003e60, + 0x00003e60, 0x00003e61, 0x00003e61, 0x00003e62, 0x00003e62, + 0x00003e63, 0x00003e63, 0x00003660, 0x00003660, 0x00003661, + 0x00003661, 0x00003662, 0x00003662, 0x00003663, 0x00003663, + 0x00002e60, 0x00002e60, 0x00002e61, 0x00002e61, 0x00002e62, + 0x00002e62, 0x00002e63, 0x00002e63, 0x00002660, 0x00002660, + 0x00002661, 0x00002661, 0x00002662, 0x00002662, 0x00002663, + 0x00002663, 0x000025e0, 0x000025e0, 0x000025e1, 0x000025e1, + 0x000025e2, 0x000025e2, 0x000025e3, 0x000025e3, 0x00001de0, + 0x00001de0, 0x00001de1, 0x00001de1, 0x00001de2, 0x00001de2, + 0x00001de3, 0x00001de3, 0x00001d60, 0x00001d60, 0x00001d61, + 0x00001d61, 0x00001d62, 0x00001d62, 0x00001d63, 0x00001d63, + 0x00001560, 0x00001560, 0x00001561, 0x00001561, 0x00001562, + 0x00001562, 0x00001563, 0x00001563, 0x00000d60, 0x00000d60, + 0x00000d61, 0x00000d61, 0x00000d62, 0x00000d62, 0x00000d63, + 0x00000d63, 0x00000ce0, 0x00000ce0, 0x00000ce1, 0x00000ce1, + 0x00000ce2, 0x00000ce2, 0x00000ce3, 0x00000ce3, 0x00000e10, + 0x00000e10, 0x00000e11, 0x00000e11, 0x00000e12, 0x00000e12, + 0x00000e13, 0x00000e13, 0x00000bf0, 0x00000bf0, 0x00000bf1, + 0x00000bf1, 0x00000bf2, 0x00000bf2, 0x00000bf3, 0x00000bf3, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x04200000, 0x04000000, + 0x04200000, 0x04000000, 0x04200000, 0x04000000, 0x04200000, + 0x04000000, 0x04200000, 0x04000000, 0x000000ff, 0x000002fc, + 0x0000fa08, 0x00000305, 0x00000206, 0x00000304, 0x0000fb04, + 0x0000fcff, 0x000005fb, 0x0000fd01, 0x00000401, 0x00000006, + 0x0000ff03, 0x000007fc, 0x0000fc08, 0x00000203, 0x0000fffb, + 0x00000600, 0x0000fa01, 0x0000fc03, 0x0000fe06, 0x0000fe00, + 0x00000102, 0x000007fd, 0x000004fb, 0x000006ff, 0x000004fd, + 0x0000fdfa, 0x000007fb, 0x0000fdfa, 0x0000fa06, 0x00000500, + 0x0000f902, 0x000007fa, 0x0000fafa, 0x00000500, 0x000007fa, + 0x00000700, 0x00000305, 0x000004ff, 0x00000801, 0x00000503, + 0x000005f9, 0x00000404, 0x0000fb08, 0x000005fd, 0x00000501, + 0x00000405, 0x0000fb03, 0x000007fc, 0x00000403, 0x00000303, + 0x00000402, 0x0000faff, 0x0000fe05, 0x000005fd, 0x0000fe01, + 0x000007fa, 0x00000202, 0x00000504, 0x00000102, 0x000008fe, + 0x0000fa04, 0x0000fafc, 0x0000fe08, 0x000000f9, 0x000002fa, + 0x000003fe, 0x00000304, 0x000004f9, 0x00000100, 0x0000fd06, + 0x000008fc, 0x00000701, 0x00000504, 0x0000fdfe, 0x0000fdfc, + 0x000003fe, 0x00000704, 0x000002fc, 0x000004f9, 0x0000fdfd, + 0x0000fa07, 0x00000205, 0x000003fd, 0x000005fb, 0x000004f9, + 0x00000804, 0x0000fc06, 0x0000fcf9, 0x00000100, 0x0000fe05, + 0x00000408, 0x0000fb02, 0x00000304, 0x000006fe, 0x000004fa, + 0x00000305, 0x000008fc, 0x00000102, 0x000001fd, 0x000004fc, + 0x0000fe03, 0x00000701, 0x000001fb, 0x000001f9, 0x00000206, + 0x000006fd, 0x00000508, 0x00000700, 0x00000304, 0x000005fe, + 0x000005ff, 0x0000fa04, 0x00000303, 0x0000fefb, 0x000007f9, + 0x0000fefc, 0x000004fd, 0x000005fc, 0x0000fffd, 0x0000fc08, + 0x0000fbf9, 0x0000fd07, 0x000008fb, 0x0000fe02, 0x000006fb, + 0x00000702, + }; + + KASSERT(mac->mac_phy.rev < 2, ("%s:%d: fail", __func__, __LINE__)); + + bwn_tab_write_multi(mac, BWN_TAB_1(2, 0), N(bwn_tab_sigsq_tbl), + bwn_tab_sigsq_tbl); + bwn_tab_write_multi(mac, BWN_TAB_2(1, 0), N(noisescale), noisescale); + bwn_tab_write_multi(mac, BWN_TAB_2(14, 0), N(crsgainnft), crsgainnft); + bwn_tab_write_multi(mac, BWN_TAB_2(8, 0), N(filterctl), filterctl); + bwn_tab_write_multi(mac, BWN_TAB_4(9, 0), N(psctl), psctl); + bwn_tab_write_multi(mac, BWN_TAB_1(6, 0), N(bwn_tab_pllfrac_tbl), + bwn_tab_pllfrac_tbl); + bwn_tab_write_multi(mac, BWN_TAB_2(0, 0), N(bwn_tabl_iqlocal_tbl), + bwn_tabl_iqlocal_tbl); + if (mac->mac_phy.rev == 0) { + bwn_tab_write_multi(mac, BWN_TAB_2(13, 0), N(ofdmcckgain_r0), + ofdmcckgain_r0); + bwn_tab_write_multi(mac, BWN_TAB_2(12, 0), N(ofdmcckgain_r0), + ofdmcckgain_r0); + } else { + bwn_tab_write_multi(mac, BWN_TAB_2(13, 0), N(ofdmcckgain_r1), + ofdmcckgain_r1); + bwn_tab_write_multi(mac, BWN_TAB_2(12, 0), N(ofdmcckgain_r1), + ofdmcckgain_r1); + } + bwn_tab_write_multi(mac, BWN_TAB_2(15, 0), N(gaindelta), gaindelta); + bwn_tab_write_multi(mac, BWN_TAB_4(10, 0), N(txpwrctl), txpwrctl); +} + +static void +bwn_phy_lp_tblinit_r2(struct bwn_mac *mac) +{ + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + int i; + static const uint16_t noisescale[] = { + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x0000, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4 + }; + static const uint32_t filterctl[] = { + 0x000141fc, 0x000021fc, 0x000021b7, 0x0000416f, 0x0001ff27, + 0x0000217f, 0x00002137, 0x000040ef, 0x0001fea7, 0x0000024f + }; + static const uint32_t psctl[] = { + 0x00e38e08, 0x00e08e38, 0x00000000, 0x00000000, 0x00000000, + 0x00002080, 0x00006180, 0x00003002, 0x00000040, 0x00002042, + 0x00180047, 0x00080043, 0x00000041, 0x000020c1, 0x00046006, + 0x00042002, 0x00040000, 0x00002003, 0x00180006, 0x00080002 + }; + static const uint32_t gainidx[] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x10000001, 0x00000000, + 0x20000082, 0x00000000, 0x40000104, 0x00000000, 0x60004207, + 0x00000001, 0x7000838a, 0x00000001, 0xd021050d, 0x00000001, + 0xe041c683, 0x00000001, 0x50828805, 0x00000000, 0x80e34288, + 0x00000000, 0xb144040b, 0x00000000, 0xe1a6058e, 0x00000000, + 0x12064711, 0x00000001, 0xb0a18612, 0x00000010, 0xe1024794, + 0x00000010, 0x11630915, 0x00000011, 0x31c3ca1b, 0x00000011, + 0xc1848a9c, 0x00000018, 0xf1e50da0, 0x00000018, 0x22468e21, + 0x00000019, 0x4286d023, 0x00000019, 0xa347d0a4, 0x00000019, + 0xb36811a6, 0x00000019, 0xf3e89227, 0x00000019, 0x0408d329, + 0x0000001a, 0x244953aa, 0x0000001a, 0x346994ab, 0x0000001a, + 0x54aa152c, 0x0000001a, 0x64ca55ad, 0x0000001a, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x10000001, 0x00000000, 0x20000082, + 0x00000000, 0x40000104, 0x00000000, 0x60004207, 0x00000001, + 0x7000838a, 0x00000001, 0xd021050d, 0x00000001, 0xe041c683, + 0x00000001, 0x50828805, 0x00000000, 0x80e34288, 0x00000000, + 0xb144040b, 0x00000000, 0xe1a6058e, 0x00000000, 0x12064711, + 0x00000001, 0xb0a18612, 0x00000010, 0xe1024794, 0x00000010, + 0x11630915, 0x00000011, 0x31c3ca1b, 0x00000011, 0xc1848a9c, + 0x00000018, 0xf1e50da0, 0x00000018, 0x22468e21, 0x00000019, + 0x4286d023, 0x00000019, 0xa347d0a4, 0x00000019, 0xb36811a6, + 0x00000019, 0xf3e89227, 0x00000019, 0x0408d329, 0x0000001a, + 0x244953aa, 0x0000001a, 0x346994ab, 0x0000001a, 0x54aa152c, + 0x0000001a, 0x64ca55ad, 0x0000001a + }; + static const uint16_t auxgainidx[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0001, 0x0002, 0x0004, 0x0016, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, + 0x0004, 0x0016 + }; + static const uint16_t swctl[] = { + 0x0128, 0x0128, 0x0009, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0128, 0x0128, 0x0009, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0128, 0x0128, 0x0009, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0128, 0x0128, 0x0009, 0x0009, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018 + }; + static const uint8_t hf[] = { + 0x4b, 0x36, 0x24, 0x18, 0x49, 0x34, 0x23, 0x17, 0x48, + 0x33, 0x23, 0x17, 0x48, 0x33, 0x23, 0x17 + }; + static const uint32_t gainval[] = { + 0x00000008, 0x0000000e, 0x00000014, 0x0000001a, 0x000000fb, + 0x00000004, 0x00000008, 0x0000000d, 0x00000001, 0x00000004, + 0x00000007, 0x0000000a, 0x0000000d, 0x00000010, 0x00000012, + 0x00000015, 0x00000000, 0x00000006, 0x0000000c, 0x00000000, + 0x00000000, 0x00000000, 0x00000012, 0x00000000, 0x00000000, + 0x00000000, 0x00000018, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x0000001e, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, + 0x00000006, 0x00000009, 0x0000000c, 0x0000000f, 0x00000012, + 0x00000015, 0x00000018, 0x0000001b, 0x0000001e, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000009, + 0x000000f1, 0x00000000, 0x00000000 + }; + static const uint16_t gain[] = { + 0x0000, 0x0400, 0x0800, 0x0802, 0x0804, 0x0806, 0x0807, 0x0808, + 0x080a, 0x080b, 0x080c, 0x080e, 0x080f, 0x0810, 0x0812, 0x0813, + 0x0814, 0x0816, 0x0817, 0x081a, 0x081b, 0x081f, 0x0820, 0x0824, + 0x0830, 0x0834, 0x0837, 0x083b, 0x083f, 0x0840, 0x0844, 0x0857, + 0x085b, 0x085f, 0x08d7, 0x08db, 0x08df, 0x0957, 0x095b, 0x095f, + 0x0b57, 0x0b5b, 0x0b5f, 0x0f5f, 0x135f, 0x175f, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 + }; + static const uint32_t papdeps[] = { + 0x00000000, 0x00013ffc, 0x0001dff3, 0x0001bff0, 0x00023fe9, + 0x00021fdf, 0x00028fdf, 0x00033fd2, 0x00039fcb, 0x00043fc7, + 0x0004efc2, 0x00055fb5, 0x0005cfb0, 0x00063fa8, 0x00068fa3, + 0x00071f98, 0x0007ef92, 0x00084f8b, 0x0008df82, 0x00097f77, + 0x0009df69, 0x000a3f62, 0x000adf57, 0x000b6f4c, 0x000bff41, + 0x000c9f39, 0x000cff30, 0x000dbf27, 0x000e4f1e, 0x000edf16, + 0x000f7f13, 0x00102f11, 0x00110f10, 0x0011df11, 0x0012ef15, + 0x00143f1c, 0x00158f27, 0x00172f35, 0x00193f47, 0x001baf5f, + 0x001e6f7e, 0x0021cfa4, 0x0025bfd2, 0x002a2008, 0x002fb047, + 0x00360090, 0x003d40e0, 0x0045c135, 0x004fb189, 0x005ae1d7, + 0x0067221d, 0x0075025a, 0x007ff291, 0x007ff2bf, 0x007ff2e3, + 0x007ff2ff, 0x007ff315, 0x007ff329, 0x007ff33f, 0x007ff356, + 0x007ff36e, 0x007ff39c, 0x007ff441, 0x007ff506 + }; + static const uint32_t papdmult[] = { + 0x001111e0, 0x00652051, 0x00606055, 0x005b005a, 0x00555060, + 0x00511065, 0x004c806b, 0x0047d072, 0x00444078, 0x00400080, + 0x003ca087, 0x0039408f, 0x0035e098, 0x0032e0a1, 0x003030aa, + 0x002d80b4, 0x002ae0bf, 0x002880ca, 0x002640d6, 0x002410e3, + 0x002220f0, 0x002020ff, 0x001e510e, 0x001ca11e, 0x001b012f, + 0x00199140, 0x00182153, 0x0016c168, 0x0015817d, 0x00145193, + 0x001321ab, 0x001211c5, 0x001111e0, 0x001021fc, 0x000f321a, + 0x000e523a, 0x000d925c, 0x000cd27f, 0x000c12a5, 0x000b62cd, + 0x000ac2f8, 0x000a2325, 0x00099355, 0x00091387, 0x000883bd, + 0x000813f5, 0x0007a432, 0x00073471, 0x0006c4b5, 0x000664fc, + 0x00061547, 0x0005b598, 0x000565ec, 0x00051646, 0x0004d6a5, + 0x0004870a, 0x00044775, 0x000407e6, 0x0003d85e, 0x000398dd, + 0x00036963, 0x000339f2, 0x00030a89, 0x0002db28 + }; + static const uint32_t gainidx_a0[] = { + 0x001111e0, 0x00652051, 0x00606055, 0x005b005a, 0x00555060, + 0x00511065, 0x004c806b, 0x0047d072, 0x00444078, 0x00400080, + 0x003ca087, 0x0039408f, 0x0035e098, 0x0032e0a1, 0x003030aa, + 0x002d80b4, 0x002ae0bf, 0x002880ca, 0x002640d6, 0x002410e3, + 0x002220f0, 0x002020ff, 0x001e510e, 0x001ca11e, 0x001b012f, + 0x00199140, 0x00182153, 0x0016c168, 0x0015817d, 0x00145193, + 0x001321ab, 0x001211c5, 0x001111e0, 0x001021fc, 0x000f321a, + 0x000e523a, 0x000d925c, 0x000cd27f, 0x000c12a5, 0x000b62cd, + 0x000ac2f8, 0x000a2325, 0x00099355, 0x00091387, 0x000883bd, + 0x000813f5, 0x0007a432, 0x00073471, 0x0006c4b5, 0x000664fc, + 0x00061547, 0x0005b598, 0x000565ec, 0x00051646, 0x0004d6a5, + 0x0004870a, 0x00044775, 0x000407e6, 0x0003d85e, 0x000398dd, + 0x00036963, 0x000339f2, 0x00030a89, 0x0002db28 + }; + static const uint16_t auxgainidx_a0[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0002, 0x0014, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0002, 0x0014 + }; + static const uint32_t gainval_a0[] = { + 0x00000008, 0x0000000e, 0x00000014, 0x0000001a, 0x000000fb, + 0x00000004, 0x00000008, 0x0000000d, 0x00000001, 0x00000004, + 0x00000007, 0x0000000a, 0x0000000d, 0x00000010, 0x00000012, + 0x00000015, 0x00000000, 0x00000006, 0x0000000c, 0x00000000, + 0x00000000, 0x00000000, 0x00000012, 0x00000000, 0x00000000, + 0x00000000, 0x00000018, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x0000001e, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, + 0x00000006, 0x00000009, 0x0000000c, 0x0000000f, 0x00000012, + 0x00000015, 0x00000018, 0x0000001b, 0x0000001e, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000f, + 0x000000f7, 0x00000000, 0x00000000 + }; + static const uint16_t gain_a0[] = { + 0x0000, 0x0002, 0x0004, 0x0006, 0x0007, 0x0008, 0x000a, 0x000b, + 0x000c, 0x000e, 0x000f, 0x0010, 0x0012, 0x0013, 0x0014, 0x0016, + 0x0017, 0x001a, 0x001b, 0x001f, 0x0020, 0x0024, 0x0030, 0x0034, + 0x0037, 0x003b, 0x003f, 0x0040, 0x0044, 0x0057, 0x005b, 0x005f, + 0x00d7, 0x00db, 0x00df, 0x0157, 0x015b, 0x015f, 0x0357, 0x035b, + 0x035f, 0x075f, 0x0b5f, 0x0f5f, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 + }; + + KASSERT(mac->mac_phy.rev < 2, ("%s:%d: fail", __func__, __LINE__)); + + for (i = 0; i < 704; i++) + bwn_tab_write(mac, BWN_TAB_4(7, i), 0); + + bwn_tab_write_multi(mac, BWN_TAB_1(2, 0), N(bwn_tab_sigsq_tbl), + bwn_tab_sigsq_tbl); + bwn_tab_write_multi(mac, BWN_TAB_2(1, 0), N(noisescale), noisescale); + bwn_tab_write_multi(mac, BWN_TAB_4(11, 0), N(filterctl), filterctl); + bwn_tab_write_multi(mac, BWN_TAB_4(12, 0), N(psctl), psctl); + bwn_tab_write_multi(mac, BWN_TAB_4(13, 0), N(gainidx), gainidx); + bwn_tab_write_multi(mac, BWN_TAB_2(14, 0), N(auxgainidx), auxgainidx); + bwn_tab_write_multi(mac, BWN_TAB_2(15, 0), N(swctl), swctl); + bwn_tab_write_multi(mac, BWN_TAB_1(16, 0), N(hf), hf); + bwn_tab_write_multi(mac, BWN_TAB_4(17, 0), N(gainval), gainval); + bwn_tab_write_multi(mac, BWN_TAB_2(18, 0), N(gain), gain); + bwn_tab_write_multi(mac, BWN_TAB_1(6, 0), N(bwn_tab_pllfrac_tbl), + bwn_tab_pllfrac_tbl); + bwn_tab_write_multi(mac, BWN_TAB_2(0, 0), N(bwn_tabl_iqlocal_tbl), + bwn_tabl_iqlocal_tbl); + bwn_tab_write_multi(mac, BWN_TAB_4(9, 0), N(papdeps), papdeps); + bwn_tab_write_multi(mac, BWN_TAB_4(10, 0), N(papdmult), papdmult); + + if ((siba->siba_chipid == 0x4325) && (siba->siba_chiprev == 0)) { + bwn_tab_write_multi(mac, BWN_TAB_4(13, 0), N(gainidx_a0), + gainidx_a0); + bwn_tab_write_multi(mac, BWN_TAB_2(14, 0), N(auxgainidx_a0), + auxgainidx_a0); + bwn_tab_write_multi(mac, BWN_TAB_4(17, 0), N(gainval_a0), + gainval_a0); + bwn_tab_write_multi(mac, BWN_TAB_2(18, 0), N(gain_a0), gain_a0); + } +} + +static void +bwn_phy_lp_tblinit_txgain(struct bwn_mac *mac) +{ + struct siba_dev_softc *sd = mac->mac_sd; + struct siba_softc *siba = sd->sd_bus; + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + static struct bwn_txgain_entry txgain_r2[] = { + { 255, 255, 203, 0, 152 }, { 255, 255, 203, 0, 147 }, + { 255, 255, 203, 0, 143 }, { 255, 255, 203, 0, 139 }, + { 255, 255, 203, 0, 135 }, { 255, 255, 203, 0, 131 }, + { 255, 255, 203, 0, 128 }, { 255, 255, 203, 0, 124 }, + { 255, 255, 203, 0, 121 }, { 255, 255, 203, 0, 117 }, + { 255, 255, 203, 0, 114 }, { 255, 255, 203, 0, 111 }, + { 255, 255, 203, 0, 107 }, { 255, 255, 203, 0, 104 }, + { 255, 255, 203, 0, 101 }, { 255, 255, 203, 0, 99 }, + { 255, 255, 203, 0, 96 }, { 255, 255, 203, 0, 93 }, + { 255, 255, 203, 0, 90 }, { 255, 255, 203, 0, 88 }, + { 255, 255, 203, 0, 85 }, { 255, 255, 203, 0, 83 }, + { 255, 255, 203, 0, 81 }, { 255, 255, 203, 0, 78 }, + { 255, 255, 203, 0, 76 }, { 255, 255, 203, 0, 74 }, + { 255, 255, 203, 0, 72 }, { 255, 255, 203, 0, 70 }, + { 255, 255, 203, 0, 68 }, { 255, 255, 203, 0, 66 }, + { 255, 255, 203, 0, 64 }, { 255, 255, 197, 0, 64 }, + { 255, 255, 192, 0, 64 }, { 255, 255, 186, 0, 64 }, + { 255, 255, 181, 0, 64 }, { 255, 255, 176, 0, 64 }, + { 255, 255, 171, 0, 64 }, { 255, 255, 166, 0, 64 }, + { 255, 255, 161, 0, 64 }, { 255, 255, 157, 0, 64 }, + { 255, 255, 152, 0, 64 }, { 255, 255, 148, 0, 64 }, + { 255, 255, 144, 0, 64 }, { 255, 255, 140, 0, 64 }, + { 255, 255, 136, 0, 64 }, { 255, 255, 132, 0, 64 }, + { 255, 255, 128, 0, 64 }, { 255, 255, 124, 0, 64 }, + { 255, 255, 121, 0, 64 }, { 255, 255, 117, 0, 64 }, + { 255, 255, 114, 0, 64 }, { 255, 255, 111, 0, 64 }, + { 255, 255, 108, 0, 64 }, { 255, 255, 105, 0, 64 }, + { 255, 255, 102, 0, 64 }, { 255, 255, 99, 0, 64 }, + { 255, 255, 96, 0, 64 }, { 255, 255, 93, 0, 64 }, + { 255, 255, 91, 0, 64 }, { 255, 255, 88, 0, 64 }, + { 255, 255, 86, 0, 64 }, { 255, 255, 83, 0, 64 }, + { 255, 255, 81, 0, 64 }, { 255, 255, 79, 0, 64 }, + { 255, 255, 76, 0, 64 }, { 255, 255, 74, 0, 64 }, + { 255, 255, 72, 0, 64 }, { 255, 255, 70, 0, 64 }, + { 255, 255, 68, 0, 64 }, { 255, 255, 66, 0, 64 }, + { 255, 255, 64, 0, 64 }, { 255, 248, 64, 0, 64 }, + { 255, 248, 62, 0, 64 }, { 255, 241, 62, 0, 64 }, + { 255, 241, 60, 0, 64 }, { 255, 234, 60, 0, 64 }, + { 255, 234, 59, 0, 64 }, { 255, 227, 59, 0, 64 }, + { 255, 227, 57, 0, 64 }, { 255, 221, 57, 0, 64 }, + { 255, 221, 55, 0, 64 }, { 255, 215, 55, 0, 64 }, + { 255, 215, 54, 0, 64 }, { 255, 208, 54, 0, 64 }, + { 255, 208, 52, 0, 64 }, { 255, 203, 52, 0, 64 }, + { 255, 203, 51, 0, 64 }, { 255, 197, 51, 0, 64 }, + { 255, 197, 49, 0, 64 }, { 255, 191, 49, 0, 64 }, + { 255, 191, 48, 0, 64 }, { 255, 186, 48, 0, 64 }, + { 255, 186, 47, 0, 64 }, { 255, 181, 47, 0, 64 }, + { 255, 181, 45, 0, 64 }, { 255, 175, 45, 0, 64 }, + { 255, 175, 44, 0, 64 }, { 255, 170, 44, 0, 64 }, + { 255, 170, 43, 0, 64 }, { 255, 166, 43, 0, 64 }, + { 255, 166, 42, 0, 64 }, { 255, 161, 42, 0, 64 }, + { 255, 161, 40, 0, 64 }, { 255, 156, 40, 0, 64 }, + { 255, 156, 39, 0, 64 }, { 255, 152, 39, 0, 64 }, + { 255, 152, 38, 0, 64 }, { 255, 148, 38, 0, 64 }, + { 255, 148, 37, 0, 64 }, { 255, 143, 37, 0, 64 }, + { 255, 143, 36, 0, 64 }, { 255, 139, 36, 0, 64 }, + { 255, 139, 35, 0, 64 }, { 255, 135, 35, 0, 64 }, + { 255, 135, 34, 0, 64 }, { 255, 132, 34, 0, 64 }, + { 255, 132, 33, 0, 64 }, { 255, 128, 33, 0, 64 }, + { 255, 128, 32, 0, 64 }, { 255, 124, 32, 0, 64 }, + { 255, 124, 31, 0, 64 }, { 255, 121, 31, 0, 64 }, + { 255, 121, 30, 0, 64 }, { 255, 117, 30, 0, 64 }, + { 255, 117, 29, 0, 64 }, { 255, 114, 29, 0, 64 }, + { 255, 114, 29, 0, 64 }, { 255, 111, 29, 0, 64 }, + }; + static struct bwn_txgain_entry txgain_2ghz_r2[] = { + { 7, 99, 255, 0, 64 }, { 7, 96, 255, 0, 64 }, + { 7, 93, 255, 0, 64 }, { 7, 90, 255, 0, 64 }, + { 7, 88, 255, 0, 64 }, { 7, 85, 255, 0, 64 }, + { 7, 83, 255, 0, 64 }, { 7, 81, 255, 0, 64 }, + { 7, 78, 255, 0, 64 }, { 7, 76, 255, 0, 64 }, + { 7, 74, 255, 0, 64 }, { 7, 72, 255, 0, 64 }, + { 7, 70, 255, 0, 64 }, { 7, 68, 255, 0, 64 }, + { 7, 66, 255, 0, 64 }, { 7, 64, 255, 0, 64 }, + { 7, 64, 255, 0, 64 }, { 7, 62, 255, 0, 64 }, + { 7, 62, 248, 0, 64 }, { 7, 60, 248, 0, 64 }, + { 7, 60, 241, 0, 64 }, { 7, 59, 241, 0, 64 }, + { 7, 59, 234, 0, 64 }, { 7, 57, 234, 0, 64 }, + { 7, 57, 227, 0, 64 }, { 7, 55, 227, 0, 64 }, + { 7, 55, 221, 0, 64 }, { 7, 54, 221, 0, 64 }, + { 7, 54, 215, 0, 64 }, { 7, 52, 215, 0, 64 }, + { 7, 52, 208, 0, 64 }, { 7, 51, 208, 0, 64 }, + { 7, 51, 203, 0, 64 }, { 7, 49, 203, 0, 64 }, + { 7, 49, 197, 0, 64 }, { 7, 48, 197, 0, 64 }, + { 7, 48, 191, 0, 64 }, { 7, 47, 191, 0, 64 }, + { 7, 47, 186, 0, 64 }, { 7, 45, 186, 0, 64 }, + { 7, 45, 181, 0, 64 }, { 7, 44, 181, 0, 64 }, + { 7, 44, 175, 0, 64 }, { 7, 43, 175, 0, 64 }, + { 7, 43, 170, 0, 64 }, { 7, 42, 170, 0, 64 }, + { 7, 42, 166, 0, 64 }, { 7, 40, 166, 0, 64 }, + { 7, 40, 161, 0, 64 }, { 7, 39, 161, 0, 64 }, + { 7, 39, 156, 0, 64 }, { 7, 38, 156, 0, 64 }, + { 7, 38, 152, 0, 64 }, { 7, 37, 152, 0, 64 }, + { 7, 37, 148, 0, 64 }, { 7, 36, 148, 0, 64 }, + { 7, 36, 143, 0, 64 }, { 7, 35, 143, 0, 64 }, + { 7, 35, 139, 0, 64 }, { 7, 34, 139, 0, 64 }, + { 7, 34, 135, 0, 64 }, { 7, 33, 135, 0, 64 }, + { 7, 33, 132, 0, 64 }, { 7, 32, 132, 0, 64 }, + { 7, 32, 128, 0, 64 }, { 7, 31, 128, 0, 64 }, + { 7, 31, 124, 0, 64 }, { 7, 30, 124, 0, 64 }, + { 7, 30, 121, 0, 64 }, { 7, 29, 121, 0, 64 }, + { 7, 29, 117, 0, 64 }, { 7, 29, 117, 0, 64 }, + { 7, 29, 114, 0, 64 }, { 7, 28, 114, 0, 64 }, + { 7, 28, 111, 0, 64 }, { 7, 27, 111, 0, 64 }, + { 7, 27, 108, 0, 64 }, { 7, 26, 108, 0, 64 }, + { 7, 26, 104, 0, 64 }, { 7, 25, 104, 0, 64 }, + { 7, 25, 102, 0, 64 }, { 7, 25, 102, 0, 64 }, + { 7, 25, 99, 0, 64 }, { 7, 24, 99, 0, 64 }, + { 7, 24, 96, 0, 64 }, { 7, 23, 96, 0, 64 }, + { 7, 23, 93, 0, 64 }, { 7, 23, 93, 0, 64 }, + { 7, 23, 90, 0, 64 }, { 7, 22, 90, 0, 64 }, + { 7, 22, 88, 0, 64 }, { 7, 21, 88, 0, 64 }, + { 7, 21, 85, 0, 64 }, { 7, 21, 85, 0, 64 }, + { 7, 21, 83, 0, 64 }, { 7, 20, 83, 0, 64 }, + { 7, 20, 81, 0, 64 }, { 7, 20, 81, 0, 64 }, + { 7, 20, 78, 0, 64 }, { 7, 19, 78, 0, 64 }, + { 7, 19, 76, 0, 64 }, { 7, 19, 76, 0, 64 }, + { 7, 19, 74, 0, 64 }, { 7, 18, 74, 0, 64 }, + { 7, 18, 72, 0, 64 }, { 7, 18, 72, 0, 64 }, + { 7, 18, 70, 0, 64 }, { 7, 17, 70, 0, 64 }, + { 7, 17, 68, 0, 64 }, { 7, 17, 68, 0, 64 }, + { 7, 17, 66, 0, 64 }, { 7, 16, 66, 0, 64 }, + { 7, 16, 64, 0, 64 }, { 7, 16, 64, 0, 64 }, + { 7, 16, 62, 0, 64 }, { 7, 15, 62, 0, 64 }, + { 7, 15, 60, 0, 64 }, { 7, 15, 60, 0, 64 }, + { 7, 15, 59, 0, 64 }, { 7, 14, 59, 0, 64 }, + { 7, 14, 57, 0, 64 }, { 7, 14, 57, 0, 64 }, + { 7, 14, 55, 0, 64 }, { 7, 14, 55, 0, 64 }, + { 7, 14, 54, 0, 64 }, { 7, 13, 54, 0, 64 }, + { 7, 13, 52, 0, 64 }, { 7, 13, 52, 0, 64 }, + }; + static struct bwn_txgain_entry txgain_5ghz_r2[] = { + { 255, 255, 255, 0, 152 }, { 255, 255, 255, 0, 147 }, + { 255, 255, 255, 0, 143 }, { 255, 255, 255, 0, 139 }, + { 255, 255, 255, 0, 135 }, { 255, 255, 255, 0, 131 }, + { 255, 255, 255, 0, 128 }, { 255, 255, 255, 0, 124 }, + { 255, 255, 255, 0, 121 }, { 255, 255, 255, 0, 117 }, + { 255, 255, 255, 0, 114 }, { 255, 255, 255, 0, 111 }, + { 255, 255, 255, 0, 107 }, { 255, 255, 255, 0, 104 }, + { 255, 255, 255, 0, 101 }, { 255, 255, 255, 0, 99 }, + { 255, 255, 255, 0, 96 }, { 255, 255, 255, 0, 93 }, + { 255, 255, 255, 0, 90 }, { 255, 255, 255, 0, 88 }, + { 255, 255, 255, 0, 85 }, { 255, 255, 255, 0, 83 }, + { 255, 255, 255, 0, 81 }, { 255, 255, 255, 0, 78 }, + { 255, 255, 255, 0, 76 }, { 255, 255, 255, 0, 74 }, + { 255, 255, 255, 0, 72 }, { 255, 255, 255, 0, 70 }, + { 255, 255, 255, 0, 68 }, { 255, 255, 255, 0, 66 }, + { 255, 255, 255, 0, 64 }, { 255, 255, 248, 0, 64 }, + { 255, 255, 241, 0, 64 }, { 255, 255, 234, 0, 64 }, + { 255, 255, 227, 0, 64 }, { 255, 255, 221, 0, 64 }, + { 255, 255, 215, 0, 64 }, { 255, 255, 208, 0, 64 }, + { 255, 255, 203, 0, 64 }, { 255, 255, 197, 0, 64 }, + { 255, 255, 191, 0, 64 }, { 255, 255, 186, 0, 64 }, + { 255, 255, 181, 0, 64 }, { 255, 255, 175, 0, 64 }, + { 255, 255, 170, 0, 64 }, { 255, 255, 166, 0, 64 }, + { 255, 255, 161, 0, 64 }, { 255, 255, 156, 0, 64 }, + { 255, 255, 152, 0, 64 }, { 255, 255, 148, 0, 64 }, + { 255, 255, 143, 0, 64 }, { 255, 255, 139, 0, 64 }, + { 255, 255, 135, 0, 64 }, { 255, 255, 132, 0, 64 }, + { 255, 255, 128, 0, 64 }, { 255, 255, 124, 0, 64 }, + { 255, 255, 121, 0, 64 }, { 255, 255, 117, 0, 64 }, + { 255, 255, 114, 0, 64 }, { 255, 255, 111, 0, 64 }, + { 255, 255, 108, 0, 64 }, { 255, 255, 104, 0, 64 }, + { 255, 255, 102, 0, 64 }, { 255, 255, 99, 0, 64 }, + { 255, 255, 96, 0, 64 }, { 255, 255, 93, 0, 64 }, + { 255, 255, 90, 0, 64 }, { 255, 255, 88, 0, 64 }, + { 255, 255, 85, 0, 64 }, { 255, 255, 83, 0, 64 }, + { 255, 255, 81, 0, 64 }, { 255, 255, 78, 0, 64 }, + { 255, 255, 76, 0, 64 }, { 255, 255, 74, 0, 64 }, + { 255, 255, 72, 0, 64 }, { 255, 255, 70, 0, 64 }, + { 255, 255, 68, 0, 64 }, { 255, 255, 66, 0, 64 }, + { 255, 255, 64, 0, 64 }, { 255, 255, 64, 0, 64 }, + { 255, 255, 62, 0, 64 }, { 255, 248, 62, 0, 64 }, + { 255, 248, 60, 0, 64 }, { 255, 241, 60, 0, 64 }, + { 255, 241, 59, 0, 64 }, { 255, 234, 59, 0, 64 }, + { 255, 234, 57, 0, 64 }, { 255, 227, 57, 0, 64 }, + { 255, 227, 55, 0, 64 }, { 255, 221, 55, 0, 64 }, + { 255, 221, 54, 0, 64 }, { 255, 215, 54, 0, 64 }, + { 255, 215, 52, 0, 64 }, { 255, 208, 52, 0, 64 }, + { 255, 208, 51, 0, 64 }, { 255, 203, 51, 0, 64 }, + { 255, 203, 49, 0, 64 }, { 255, 197, 49, 0, 64 }, + { 255, 197, 48, 0, 64 }, { 255, 191, 48, 0, 64 }, + { 255, 191, 47, 0, 64 }, { 255, 186, 47, 0, 64 }, + { 255, 186, 45, 0, 64 }, { 255, 181, 45, 0, 64 }, + { 255, 181, 44, 0, 64 }, { 255, 175, 44, 0, 64 }, + { 255, 175, 43, 0, 64 }, { 255, 170, 43, 0, 64 }, + { 255, 170, 42, 0, 64 }, { 255, 166, 42, 0, 64 }, + { 255, 166, 40, 0, 64 }, { 255, 161, 40, 0, 64 }, + { 255, 161, 39, 0, 64 }, { 255, 156, 39, 0, 64 }, + { 255, 156, 38, 0, 64 }, { 255, 152, 38, 0, 64 }, + { 255, 152, 37, 0, 64 }, { 255, 148, 37, 0, 64 }, + { 255, 148, 36, 0, 64 }, { 255, 143, 36, 0, 64 }, + { 255, 143, 35, 0, 64 }, { 255, 139, 35, 0, 64 }, + { 255, 139, 34, 0, 64 }, { 255, 135, 34, 0, 64 }, + { 255, 135, 33, 0, 64 }, { 255, 132, 33, 0, 64 }, + { 255, 132, 32, 0, 64 }, { 255, 128, 32, 0, 64 } + }; + static struct bwn_txgain_entry txgain_r0[] = { + { 7, 15, 14, 0, 152 }, { 7, 15, 14, 0, 147 }, + { 7, 15, 14, 0, 143 }, { 7, 15, 14, 0, 139 }, + { 7, 15, 14, 0, 135 }, { 7, 15, 14, 0, 131 }, + { 7, 15, 14, 0, 128 }, { 7, 15, 14, 0, 124 }, + { 7, 15, 14, 0, 121 }, { 7, 15, 14, 0, 117 }, + { 7, 15, 14, 0, 114 }, { 7, 15, 14, 0, 111 }, + { 7, 15, 14, 0, 107 }, { 7, 15, 14, 0, 104 }, + { 7, 15, 14, 0, 101 }, { 7, 15, 14, 0, 99 }, + { 7, 15, 14, 0, 96 }, { 7, 15, 14, 0, 93 }, + { 7, 15, 14, 0, 90 }, { 7, 15, 14, 0, 88 }, + { 7, 15, 14, 0, 85 }, { 7, 15, 14, 0, 83 }, + { 7, 15, 14, 0, 81 }, { 7, 15, 14, 0, 78 }, + { 7, 15, 14, 0, 76 }, { 7, 15, 14, 0, 74 }, + { 7, 15, 14, 0, 72 }, { 7, 15, 14, 0, 70 }, + { 7, 15, 14, 0, 68 }, { 7, 15, 14, 0, 66 }, + { 7, 15, 14, 0, 64 }, { 7, 15, 14, 0, 62 }, + { 7, 15, 14, 0, 60 }, { 7, 15, 14, 0, 59 }, + { 7, 15, 14, 0, 57 }, { 7, 15, 13, 0, 72 }, + { 7, 15, 13, 0, 70 }, { 7, 15, 13, 0, 68 }, + { 7, 15, 13, 0, 66 }, { 7, 15, 13, 0, 64 }, + { 7, 15, 13, 0, 62 }, { 7, 15, 13, 0, 60 }, + { 7, 15, 13, 0, 59 }, { 7, 15, 13, 0, 57 }, + { 7, 15, 12, 0, 71 }, { 7, 15, 12, 0, 69 }, + { 7, 15, 12, 0, 67 }, { 7, 15, 12, 0, 65 }, + { 7, 15, 12, 0, 63 }, { 7, 15, 12, 0, 62 }, + { 7, 15, 12, 0, 60 }, { 7, 15, 12, 0, 58 }, + { 7, 15, 12, 0, 57 }, { 7, 15, 11, 0, 70 }, + { 7, 15, 11, 0, 68 }, { 7, 15, 11, 0, 66 }, + { 7, 15, 11, 0, 65 }, { 7, 15, 11, 0, 63 }, + { 7, 15, 11, 0, 61 }, { 7, 15, 11, 0, 59 }, + { 7, 15, 11, 0, 58 }, { 7, 15, 10, 0, 71 }, + { 7, 15, 10, 0, 69 }, { 7, 15, 10, 0, 67 }, + { 7, 15, 10, 0, 65 }, { 7, 15, 10, 0, 63 }, + { 7, 15, 10, 0, 61 }, { 7, 15, 10, 0, 60 }, + { 7, 15, 10, 0, 58 }, { 7, 15, 10, 0, 56 }, + { 7, 15, 9, 0, 70 }, { 7, 15, 9, 0, 68 }, + { 7, 15, 9, 0, 66 }, { 7, 15, 9, 0, 64 }, + { 7, 15, 9, 0, 62 }, { 7, 15, 9, 0, 60 }, + { 7, 15, 9, 0, 59 }, { 7, 14, 9, 0, 72 }, + { 7, 14, 9, 0, 70 }, { 7, 14, 9, 0, 68 }, + { 7, 14, 9, 0, 66 }, { 7, 14, 9, 0, 64 }, + { 7, 14, 9, 0, 62 }, { 7, 14, 9, 0, 60 }, + { 7, 14, 9, 0, 59 }, { 7, 13, 9, 0, 72 }, + { 7, 13, 9, 0, 70 }, { 7, 13, 9, 0, 68 }, + { 7, 13, 9, 0, 66 }, { 7, 13, 9, 0, 64 }, + { 7, 13, 9, 0, 63 }, { 7, 13, 9, 0, 61 }, + { 7, 13, 9, 0, 59 }, { 7, 13, 9, 0, 57 }, + { 7, 13, 8, 0, 72 }, { 7, 13, 8, 0, 70 }, + { 7, 13, 8, 0, 68 }, { 7, 13, 8, 0, 66 }, + { 7, 13, 8, 0, 64 }, { 7, 13, 8, 0, 62 }, + { 7, 13, 8, 0, 60 }, { 7, 13, 8, 0, 59 }, + { 7, 12, 8, 0, 72 }, { 7, 12, 8, 0, 70 }, + { 7, 12, 8, 0, 68 }, { 7, 12, 8, 0, 66 }, + { 7, 12, 8, 0, 64 }, { 7, 12, 8, 0, 62 }, + { 7, 12, 8, 0, 61 }, { 7, 12, 8, 0, 59 }, + { 7, 12, 7, 0, 73 }, { 7, 12, 7, 0, 71 }, + { 7, 12, 7, 0, 69 }, { 7, 12, 7, 0, 67 }, + { 7, 12, 7, 0, 65 }, { 7, 12, 7, 0, 63 }, + { 7, 12, 7, 0, 61 }, { 7, 12, 7, 0, 59 }, + { 7, 11, 7, 0, 72 }, { 7, 11, 7, 0, 70 }, + { 7, 11, 7, 0, 68 }, { 7, 11, 7, 0, 66 }, + { 7, 11, 7, 0, 65 }, { 7, 11, 7, 0, 63 }, + { 7, 11, 7, 0, 61 }, { 7, 11, 7, 0, 59 }, + { 7, 11, 6, 0, 73 }, { 7, 11, 6, 0, 71 } + }; + static struct bwn_txgain_entry txgain_2ghz_r0[] = { + { 4, 15, 9, 0, 64 }, { 4, 15, 9, 0, 62 }, + { 4, 15, 9, 0, 60 }, { 4, 15, 9, 0, 59 }, + { 4, 14, 9, 0, 72 }, { 4, 14, 9, 0, 70 }, + { 4, 14, 9, 0, 68 }, { 4, 14, 9, 0, 66 }, + { 4, 14, 9, 0, 64 }, { 4, 14, 9, 0, 62 }, + { 4, 14, 9, 0, 60 }, { 4, 14, 9, 0, 59 }, + { 4, 13, 9, 0, 72 }, { 4, 13, 9, 0, 70 }, + { 4, 13, 9, 0, 68 }, { 4, 13, 9, 0, 66 }, + { 4, 13, 9, 0, 64 }, { 4, 13, 9, 0, 63 }, + { 4, 13, 9, 0, 61 }, { 4, 13, 9, 0, 59 }, + { 4, 13, 9, 0, 57 }, { 4, 13, 8, 0, 72 }, + { 4, 13, 8, 0, 70 }, { 4, 13, 8, 0, 68 }, + { 4, 13, 8, 0, 66 }, { 4, 13, 8, 0, 64 }, + { 4, 13, 8, 0, 62 }, { 4, 13, 8, 0, 60 }, + { 4, 13, 8, 0, 59 }, { 4, 12, 8, 0, 72 }, + { 4, 12, 8, 0, 70 }, { 4, 12, 8, 0, 68 }, + { 4, 12, 8, 0, 66 }, { 4, 12, 8, 0, 64 }, + { 4, 12, 8, 0, 62 }, { 4, 12, 8, 0, 61 }, + { 4, 12, 8, 0, 59 }, { 4, 12, 7, 0, 73 }, + { 4, 12, 7, 0, 71 }, { 4, 12, 7, 0, 69 }, + { 4, 12, 7, 0, 67 }, { 4, 12, 7, 0, 65 }, + { 4, 12, 7, 0, 63 }, { 4, 12, 7, 0, 61 }, + { 4, 12, 7, 0, 59 }, { 4, 11, 7, 0, 72 }, + { 4, 11, 7, 0, 70 }, { 4, 11, 7, 0, 68 }, + { 4, 11, 7, 0, 66 }, { 4, 11, 7, 0, 65 }, + { 4, 11, 7, 0, 63 }, { 4, 11, 7, 0, 61 }, + { 4, 11, 7, 0, 59 }, { 4, 11, 6, 0, 73 }, + { 4, 11, 6, 0, 71 }, { 4, 11, 6, 0, 69 }, + { 4, 11, 6, 0, 67 }, { 4, 11, 6, 0, 65 }, + { 4, 11, 6, 0, 63 }, { 4, 11, 6, 0, 61 }, + { 4, 11, 6, 0, 60 }, { 4, 10, 6, 0, 72 }, + { 4, 10, 6, 0, 70 }, { 4, 10, 6, 0, 68 }, + { 4, 10, 6, 0, 66 }, { 4, 10, 6, 0, 64 }, + { 4, 10, 6, 0, 62 }, { 4, 10, 6, 0, 60 }, + { 4, 10, 6, 0, 59 }, { 4, 10, 5, 0, 72 }, + { 4, 10, 5, 0, 70 }, { 4, 10, 5, 0, 68 }, + { 4, 10, 5, 0, 66 }, { 4, 10, 5, 0, 64 }, + { 4, 10, 5, 0, 62 }, { 4, 10, 5, 0, 60 }, + { 4, 10, 5, 0, 59 }, { 4, 9, 5, 0, 70 }, + { 4, 9, 5, 0, 68 }, { 4, 9, 5, 0, 66 }, + { 4, 9, 5, 0, 64 }, { 4, 9, 5, 0, 63 }, + { 4, 9, 5, 0, 61 }, { 4, 9, 5, 0, 59 }, + { 4, 9, 4, 0, 71 }, { 4, 9, 4, 0, 69 }, + { 4, 9, 4, 0, 67 }, { 4, 9, 4, 0, 65 }, + { 4, 9, 4, 0, 63 }, { 4, 9, 4, 0, 62 }, + { 4, 9, 4, 0, 60 }, { 4, 9, 4, 0, 58 }, + { 4, 8, 4, 0, 70 }, { 4, 8, 4, 0, 68 }, + { 4, 8, 4, 0, 66 }, { 4, 8, 4, 0, 65 }, + { 4, 8, 4, 0, 63 }, { 4, 8, 4, 0, 61 }, + { 4, 8, 4, 0, 59 }, { 4, 7, 4, 0, 68 }, + { 4, 7, 4, 0, 66 }, { 4, 7, 4, 0, 64 }, + { 4, 7, 4, 0, 62 }, { 4, 7, 4, 0, 61 }, + { 4, 7, 4, 0, 59 }, { 4, 7, 3, 0, 67 }, + { 4, 7, 3, 0, 65 }, { 4, 7, 3, 0, 63 }, + { 4, 7, 3, 0, 62 }, { 4, 7, 3, 0, 60 }, + { 4, 6, 3, 0, 65 }, { 4, 6, 3, 0, 63 }, + { 4, 6, 3, 0, 61 }, { 4, 6, 3, 0, 60 }, + { 4, 6, 3, 0, 58 }, { 4, 5, 3, 0, 68 }, + { 4, 5, 3, 0, 66 }, { 4, 5, 3, 0, 64 }, + { 4, 5, 3, 0, 62 }, { 4, 5, 3, 0, 60 }, + { 4, 5, 3, 0, 59 }, { 4, 5, 3, 0, 57 }, + { 4, 4, 2, 0, 83 }, { 4, 4, 2, 0, 81 }, + { 4, 4, 2, 0, 78 }, { 4, 4, 2, 0, 76 }, + { 4, 4, 2, 0, 74 }, { 4, 4, 2, 0, 72 } + }; + static struct bwn_txgain_entry txgain_5ghz_r0[] = { + { 7, 15, 15, 0, 99 }, { 7, 15, 15, 0, 96 }, + { 7, 15, 15, 0, 93 }, { 7, 15, 15, 0, 90 }, + { 7, 15, 15, 0, 88 }, { 7, 15, 15, 0, 85 }, + { 7, 15, 15, 0, 83 }, { 7, 15, 15, 0, 81 }, + { 7, 15, 15, 0, 78 }, { 7, 15, 15, 0, 76 }, + { 7, 15, 15, 0, 74 }, { 7, 15, 15, 0, 72 }, + { 7, 15, 15, 0, 70 }, { 7, 15, 15, 0, 68 }, + { 7, 15, 15, 0, 66 }, { 7, 15, 15, 0, 64 }, + { 7, 15, 15, 0, 62 }, { 7, 15, 15, 0, 60 }, + { 7, 15, 15, 0, 59 }, { 7, 15, 15, 0, 57 }, + { 7, 15, 15, 0, 55 }, { 7, 15, 14, 0, 72 }, + { 7, 15, 14, 0, 70 }, { 7, 15, 14, 0, 68 }, + { 7, 15, 14, 0, 66 }, { 7, 15, 14, 0, 64 }, + { 7, 15, 14, 0, 62 }, { 7, 15, 14, 0, 60 }, + { 7, 15, 14, 0, 58 }, { 7, 15, 14, 0, 56 }, + { 7, 15, 14, 0, 55 }, { 7, 15, 13, 0, 71 }, + { 7, 15, 13, 0, 69 }, { 7, 15, 13, 0, 67 }, + { 7, 15, 13, 0, 65 }, { 7, 15, 13, 0, 63 }, + { 7, 15, 13, 0, 62 }, { 7, 15, 13, 0, 60 }, + { 7, 15, 13, 0, 58 }, { 7, 15, 13, 0, 56 }, + { 7, 15, 12, 0, 72 }, { 7, 15, 12, 0, 70 }, + { 7, 15, 12, 0, 68 }, { 7, 15, 12, 0, 66 }, + { 7, 15, 12, 0, 64 }, { 7, 15, 12, 0, 62 }, + { 7, 15, 12, 0, 60 }, { 7, 15, 12, 0, 59 }, + { 7, 15, 12, 0, 57 }, { 7, 15, 11, 0, 73 }, + { 7, 15, 11, 0, 71 }, { 7, 15, 11, 0, 69 }, + { 7, 15, 11, 0, 67 }, { 7, 15, 11, 0, 65 }, + { 7, 15, 11, 0, 63 }, { 7, 15, 11, 0, 61 }, + { 7, 15, 11, 0, 60 }, { 7, 15, 11, 0, 58 }, + { 7, 15, 10, 0, 71 }, { 7, 15, 10, 0, 69 }, + { 7, 15, 10, 0, 67 }, { 7, 15, 10, 0, 65 }, + { 7, 15, 10, 0, 63 }, { 7, 15, 10, 0, 61 }, + { 7, 15, 10, 0, 60 }, { 7, 15, 10, 0, 58 }, + { 7, 15, 9, 0, 70 }, { 7, 15, 9, 0, 68 }, + { 7, 15, 9, 0, 66 }, { 7, 15, 9, 0, 64 }, + { 7, 15, 9, 0, 62 }, { 7, 15, 9, 0, 61 }, + { 7, 15, 9, 0, 59 }, { 7, 15, 9, 0, 57 }, + { 7, 15, 9, 0, 56 }, { 7, 14, 9, 0, 68 }, + { 7, 14, 9, 0, 66 }, { 7, 14, 9, 0, 65 }, + { 7, 14, 9, 0, 63 }, { 7, 14, 9, 0, 61 }, + { 7, 14, 9, 0, 59 }, { 7, 14, 9, 0, 58 }, + { 7, 13, 9, 0, 70 }, { 7, 13, 9, 0, 68 }, + { 7, 13, 9, 0, 66 }, { 7, 13, 9, 0, 64 }, + { 7, 13, 9, 0, 63 }, { 7, 13, 9, 0, 61 }, + { 7, 13, 9, 0, 59 }, { 7, 13, 9, 0, 57 }, + { 7, 13, 8, 0, 70 }, { 7, 13, 8, 0, 68 }, + { 7, 13, 8, 0, 66 }, { 7, 13, 8, 0, 64 }, + { 7, 13, 8, 0, 62 }, { 7, 13, 8, 0, 60 }, + { 7, 13, 8, 0, 59 }, { 7, 13, 8, 0, 57 }, + { 7, 12, 8, 0, 70 }, { 7, 12, 8, 0, 68 }, + { 7, 12, 8, 0, 66 }, { 7, 12, 8, 0, 64 }, + { 7, 12, 8, 0, 62 }, { 7, 12, 8, 0, 61 }, + { 7, 12, 8, 0, 59 }, { 7, 12, 8, 0, 57 }, + { 7, 12, 7, 0, 70 }, { 7, 12, 7, 0, 68 }, + { 7, 12, 7, 0, 66 }, { 7, 12, 7, 0, 64 }, + { 7, 12, 7, 0, 62 }, { 7, 12, 7, 0, 61 }, + { 7, 12, 7, 0, 59 }, { 7, 12, 7, 0, 57 }, + { 7, 11, 7, 0, 70 }, { 7, 11, 7, 0, 68 }, + { 7, 11, 7, 0, 66 }, { 7, 11, 7, 0, 64 }, + { 7, 11, 7, 0, 62 }, { 7, 11, 7, 0, 61 }, + { 7, 11, 7, 0, 59 }, { 7, 11, 7, 0, 57 }, + { 7, 11, 6, 0, 69 }, { 7, 11, 6, 0, 67 }, + { 7, 11, 6, 0, 65 }, { 7, 11, 6, 0, 63 }, + { 7, 11, 6, 0, 62 }, { 7, 11, 6, 0, 60 } + }; + static struct bwn_txgain_entry txgain_r1[] = { + { 7, 15, 14, 0, 152 }, { 7, 15, 14, 0, 147 }, + { 7, 15, 14, 0, 143 }, { 7, 15, 14, 0, 139 }, + { 7, 15, 14, 0, 135 }, { 7, 15, 14, 0, 131 }, + { 7, 15, 14, 0, 128 }, { 7, 15, 14, 0, 124 }, + { 7, 15, 14, 0, 121 }, { 7, 15, 14, 0, 117 }, + { 7, 15, 14, 0, 114 }, { 7, 15, 14, 0, 111 }, + { 7, 15, 14, 0, 107 }, { 7, 15, 14, 0, 104 }, + { 7, 15, 14, 0, 101 }, { 7, 15, 14, 0, 99 }, + { 7, 15, 14, 0, 96 }, { 7, 15, 14, 0, 93 }, + { 7, 15, 14, 0, 90 }, { 7, 15, 14, 0, 88 }, + { 7, 15, 14, 0, 85 }, { 7, 15, 14, 0, 83 }, + { 7, 15, 14, 0, 81 }, { 7, 15, 14, 0, 78 }, + { 7, 15, 14, 0, 76 }, { 7, 15, 14, 0, 74 }, + { 7, 15, 14, 0, 72 }, { 7, 15, 14, 0, 70 }, + { 7, 15, 14, 0, 68 }, { 7, 15, 14, 0, 66 }, + { 7, 15, 14, 0, 64 }, { 7, 15, 14, 0, 62 }, + { 7, 15, 14, 0, 60 }, { 7, 15, 14, 0, 59 }, + { 7, 15, 14, 0, 57 }, { 7, 15, 13, 0, 72 }, + { 7, 15, 13, 0, 70 }, { 7, 15, 14, 0, 68 }, + { 7, 15, 14, 0, 66 }, { 7, 15, 14, 0, 64 }, + { 7, 15, 14, 0, 62 }, { 7, 15, 14, 0, 60 }, + { 7, 15, 14, 0, 59 }, { 7, 15, 14, 0, 57 }, + { 7, 15, 13, 0, 72 }, { 7, 15, 13, 0, 70 }, + { 7, 15, 13, 0, 68 }, { 7, 15, 13, 0, 66 }, + { 7, 15, 13, 0, 64 }, { 7, 15, 13, 0, 62 }, + { 7, 15, 13, 0, 60 }, { 7, 15, 13, 0, 59 }, + { 7, 15, 13, 0, 57 }, { 7, 15, 12, 0, 71 }, + { 7, 15, 12, 0, 69 }, { 7, 15, 12, 0, 67 }, + { 7, 15, 12, 0, 65 }, { 7, 15, 12, 0, 63 }, + { 7, 15, 12, 0, 62 }, { 7, 15, 12, 0, 60 }, + { 7, 15, 12, 0, 58 }, { 7, 15, 12, 0, 57 }, + { 7, 15, 11, 0, 70 }, { 7, 15, 11, 0, 68 }, + { 7, 15, 11, 0, 66 }, { 7, 15, 11, 0, 65 }, + { 7, 15, 11, 0, 63 }, { 7, 15, 11, 0, 61 }, + { 7, 15, 11, 0, 59 }, { 7, 15, 11, 0, 58 }, + { 7, 15, 10, 0, 71 }, { 7, 15, 10, 0, 69 }, + { 7, 15, 10, 0, 67 }, { 7, 15, 10, 0, 65 }, + { 7, 15, 10, 0, 63 }, { 7, 15, 10, 0, 61 }, + { 7, 15, 10, 0, 60 }, { 7, 15, 10, 0, 58 }, + { 7, 15, 10, 0, 56 }, { 7, 15, 9, 0, 70 }, + { 7, 15, 9, 0, 68 }, { 7, 15, 9, 0, 66 }, + { 7, 15, 9, 0, 64 }, { 7, 15, 9, 0, 62 }, + { 7, 15, 9, 0, 60 }, { 7, 15, 9, 0, 59 }, + { 7, 14, 9, 0, 72 }, { 7, 14, 9, 0, 70 }, + { 7, 14, 9, 0, 68 }, { 7, 14, 9, 0, 66 }, + { 7, 14, 9, 0, 64 }, { 7, 14, 9, 0, 62 }, + { 7, 14, 9, 0, 60 }, { 7, 14, 9, 0, 59 }, + { 7, 13, 9, 0, 72 }, { 7, 13, 9, 0, 70 }, + { 7, 13, 9, 0, 68 }, { 7, 13, 9, 0, 66 }, + { 7, 13, 9, 0, 64 }, { 7, 13, 9, 0, 63 }, + { 7, 13, 9, 0, 61 }, { 7, 13, 9, 0, 59 }, + { 7, 13, 9, 0, 57 }, { 7, 13, 8, 0, 72 }, + { 7, 13, 8, 0, 70 }, { 7, 13, 8, 0, 68 }, + { 7, 13, 8, 0, 66 }, { 7, 13, 8, 0, 64 }, + { 7, 13, 8, 0, 62 }, { 7, 13, 8, 0, 60 }, + { 7, 13, 8, 0, 59 }, { 7, 12, 8, 0, 72 }, + { 7, 12, 8, 0, 70 }, { 7, 12, 8, 0, 68 }, + { 7, 12, 8, 0, 66 }, { 7, 12, 8, 0, 64 }, + { 7, 12, 8, 0, 62 }, { 7, 12, 8, 0, 61 }, + { 7, 12, 8, 0, 59 }, { 7, 12, 7, 0, 73 }, + { 7, 12, 7, 0, 71 }, { 7, 12, 7, 0, 69 }, + { 7, 12, 7, 0, 67 }, { 7, 12, 7, 0, 65 }, + { 7, 12, 7, 0, 63 }, { 7, 12, 7, 0, 61 }, + { 7, 12, 7, 0, 59 }, { 7, 11, 7, 0, 72 }, + { 7, 11, 7, 0, 70 }, { 7, 11, 7, 0, 68 }, + { 7, 11, 7, 0, 66 }, { 7, 11, 7, 0, 65 }, + { 7, 11, 7, 0, 63 }, { 7, 11, 7, 0, 61 }, + { 7, 11, 7, 0, 59 }, { 7, 11, 6, 0, 73 }, + { 7, 11, 6, 0, 71 } + }; + static struct bwn_txgain_entry txgain_2ghz_r1[] = { + { 4, 15, 15, 0, 90 }, { 4, 15, 15, 0, 88 }, + { 4, 15, 15, 0, 85 }, { 4, 15, 15, 0, 83 }, + { 4, 15, 15, 0, 81 }, { 4, 15, 15, 0, 78 }, + { 4, 15, 15, 0, 76 }, { 4, 15, 15, 0, 74 }, + { 4, 15, 15, 0, 72 }, { 4, 15, 15, 0, 70 }, + { 4, 15, 15, 0, 68 }, { 4, 15, 15, 0, 66 }, + { 4, 15, 15, 0, 64 }, { 4, 15, 15, 0, 62 }, + { 4, 15, 15, 0, 60 }, { 4, 15, 15, 0, 59 }, + { 4, 15, 14, 0, 72 }, { 4, 15, 14, 0, 70 }, + { 4, 15, 14, 0, 68 }, { 4, 15, 14, 0, 66 }, + { 4, 15, 14, 0, 64 }, { 4, 15, 14, 0, 62 }, + { 4, 15, 14, 0, 60 }, { 4, 15, 14, 0, 59 }, + { 4, 15, 13, 0, 72 }, { 4, 15, 13, 0, 70 }, + { 4, 15, 13, 0, 68 }, { 4, 15, 13, 0, 66 }, + { 4, 15, 13, 0, 64 }, { 4, 15, 13, 0, 62 }, + { 4, 15, 13, 0, 60 }, { 4, 15, 13, 0, 59 }, + { 4, 15, 12, 0, 72 }, { 4, 15, 12, 0, 70 }, + { 4, 15, 12, 0, 68 }, { 4, 15, 12, 0, 66 }, + { 4, 15, 12, 0, 64 }, { 4, 15, 12, 0, 62 }, + { 4, 15, 12, 0, 60 }, { 4, 15, 12, 0, 59 }, + { 4, 15, 11, 0, 72 }, { 4, 15, 11, 0, 70 }, + { 4, 15, 11, 0, 68 }, { 4, 15, 11, 0, 66 }, + { 4, 15, 11, 0, 64 }, { 4, 15, 11, 0, 62 }, + { 4, 15, 11, 0, 60 }, { 4, 15, 11, 0, 59 }, + { 4, 15, 10, 0, 72 }, { 4, 15, 10, 0, 70 }, + { 4, 15, 10, 0, 68 }, { 4, 15, 10, 0, 66 }, + { 4, 15, 10, 0, 64 }, { 4, 15, 10, 0, 62 }, + { 4, 15, 10, 0, 60 }, { 4, 15, 10, 0, 59 }, + { 4, 15, 9, 0, 72 }, { 4, 15, 9, 0, 70 }, + { 4, 15, 9, 0, 68 }, { 4, 15, 9, 0, 66 }, + { 4, 15, 9, 0, 64 }, { 4, 15, 9, 0, 62 }, + { 4, 15, 9, 0, 60 }, { 4, 15, 9, 0, 59 }, + { 4, 14, 9, 0, 72 }, { 4, 14, 9, 0, 70 }, + { 4, 14, 9, 0, 68 }, { 4, 14, 9, 0, 66 }, + { 4, 14, 9, 0, 64 }, { 4, 14, 9, 0, 62 }, + { 4, 14, 9, 0, 60 }, { 4, 14, 9, 0, 59 }, + { 4, 13, 9, 0, 72 }, { 4, 13, 9, 0, 70 }, + { 4, 13, 9, 0, 68 }, { 4, 13, 9, 0, 66 }, + { 4, 13, 9, 0, 64 }, { 4, 13, 9, 0, 63 }, + { 4, 13, 9, 0, 61 }, { 4, 13, 9, 0, 59 }, + { 4, 13, 9, 0, 57 }, { 4, 13, 8, 0, 72 }, + { 4, 13, 8, 0, 70 }, { 4, 13, 8, 0, 68 }, + { 4, 13, 8, 0, 66 }, { 4, 13, 8, 0, 64 }, + { 4, 13, 8, 0, 62 }, { 4, 13, 8, 0, 60 }, + { 4, 13, 8, 0, 59 }, { 4, 12, 8, 0, 72 }, + { 4, 12, 8, 0, 70 }, { 4, 12, 8, 0, 68 }, + { 4, 12, 8, 0, 66 }, { 4, 12, 8, 0, 64 }, + { 4, 12, 8, 0, 62 }, { 4, 12, 8, 0, 61 }, + { 4, 12, 8, 0, 59 }, { 4, 12, 7, 0, 73 }, + { 4, 12, 7, 0, 71 }, { 4, 12, 7, 0, 69 }, + { 4, 12, 7, 0, 67 }, { 4, 12, 7, 0, 65 }, + { 4, 12, 7, 0, 63 }, { 4, 12, 7, 0, 61 }, + { 4, 12, 7, 0, 59 }, { 4, 11, 7, 0, 72 }, + { 4, 11, 7, 0, 70 }, { 4, 11, 7, 0, 68 }, + { 4, 11, 7, 0, 66 }, { 4, 11, 7, 0, 65 }, + { 4, 11, 7, 0, 63 }, { 4, 11, 7, 0, 61 }, + { 4, 11, 7, 0, 59 }, { 4, 11, 6, 0, 73 }, + { 4, 11, 6, 0, 71 }, { 4, 11, 6, 0, 69 }, + { 4, 11, 6, 0, 67 }, { 4, 11, 6, 0, 65 }, + { 4, 11, 6, 0, 63 }, { 4, 11, 6, 0, 61 }, + { 4, 11, 6, 0, 60 }, { 4, 10, 6, 0, 72 }, + { 4, 10, 6, 0, 70 }, { 4, 10, 6, 0, 68 }, + { 4, 10, 6, 0, 66 }, { 4, 10, 6, 0, 64 }, + { 4, 10, 6, 0, 62 }, { 4, 10, 6, 0, 60 } + }; + static struct bwn_txgain_entry txgain_5ghz_r1[] = { + { 7, 15, 15, 0, 99 }, { 7, 15, 15, 0, 96 }, + { 7, 15, 15, 0, 93 }, { 7, 15, 15, 0, 90 }, + { 7, 15, 15, 0, 88 }, { 7, 15, 15, 0, 85 }, + { 7, 15, 15, 0, 83 }, { 7, 15, 15, 0, 81 }, + { 7, 15, 15, 0, 78 }, { 7, 15, 15, 0, 76 }, + { 7, 15, 15, 0, 74 }, { 7, 15, 15, 0, 72 }, + { 7, 15, 15, 0, 70 }, { 7, 15, 15, 0, 68 }, + { 7, 15, 15, 0, 66 }, { 7, 15, 15, 0, 64 }, + { 7, 15, 15, 0, 62 }, { 7, 15, 15, 0, 60 }, + { 7, 15, 15, 0, 59 }, { 7, 15, 15, 0, 57 }, + { 7, 15, 15, 0, 55 }, { 7, 15, 14, 0, 72 }, + { 7, 15, 14, 0, 70 }, { 7, 15, 14, 0, 68 }, + { 7, 15, 14, 0, 66 }, { 7, 15, 14, 0, 64 }, + { 7, 15, 14, 0, 62 }, { 7, 15, 14, 0, 60 }, + { 7, 15, 14, 0, 58 }, { 7, 15, 14, 0, 56 }, + { 7, 15, 14, 0, 55 }, { 7, 15, 13, 0, 71 }, + { 7, 15, 13, 0, 69 }, { 7, 15, 13, 0, 67 }, + { 7, 15, 13, 0, 65 }, { 7, 15, 13, 0, 63 }, + { 7, 15, 13, 0, 62 }, { 7, 15, 13, 0, 60 }, + { 7, 15, 13, 0, 58 }, { 7, 15, 13, 0, 56 }, + { 7, 15, 12, 0, 72 }, { 7, 15, 12, 0, 70 }, + { 7, 15, 12, 0, 68 }, { 7, 15, 12, 0, 66 }, + { 7, 15, 12, 0, 64 }, { 7, 15, 12, 0, 62 }, + { 7, 15, 12, 0, 60 }, { 7, 15, 12, 0, 59 }, + { 7, 15, 12, 0, 57 }, { 7, 15, 11, 0, 73 }, + { 7, 15, 11, 0, 71 }, { 7, 15, 11, 0, 69 }, + { 7, 15, 11, 0, 67 }, { 7, 15, 11, 0, 65 }, + { 7, 15, 11, 0, 63 }, { 7, 15, 11, 0, 61 }, + { 7, 15, 11, 0, 60 }, { 7, 15, 11, 0, 58 }, + { 7, 15, 10, 0, 71 }, { 7, 15, 10, 0, 69 }, + { 7, 15, 10, 0, 67 }, { 7, 15, 10, 0, 65 }, + { 7, 15, 10, 0, 63 }, { 7, 15, 10, 0, 61 }, + { 7, 15, 10, 0, 60 }, { 7, 15, 10, 0, 58 }, + { 7, 15, 9, 0, 70 }, { 7, 15, 9, 0, 68 }, + { 7, 15, 9, 0, 66 }, { 7, 15, 9, 0, 64 }, + { 7, 15, 9, 0, 62 }, { 7, 15, 9, 0, 61 }, + { 7, 15, 9, 0, 59 }, { 7, 15, 9, 0, 57 }, + { 7, 15, 9, 0, 56 }, { 7, 14, 9, 0, 68 }, + { 7, 14, 9, 0, 66 }, { 7, 14, 9, 0, 65 }, + { 7, 14, 9, 0, 63 }, { 7, 14, 9, 0, 61 }, + { 7, 14, 9, 0, 59 }, { 7, 14, 9, 0, 58 }, + { 7, 13, 9, 0, 70 }, { 7, 13, 9, 0, 68 }, + { 7, 13, 9, 0, 66 }, { 7, 13, 9, 0, 64 }, + { 7, 13, 9, 0, 63 }, { 7, 13, 9, 0, 61 }, + { 7, 13, 9, 0, 59 }, { 7, 13, 9, 0, 57 }, + { 7, 13, 8, 0, 70 }, { 7, 13, 8, 0, 68 }, + { 7, 13, 8, 0, 66 }, { 7, 13, 8, 0, 64 }, + { 7, 13, 8, 0, 62 }, { 7, 13, 8, 0, 60 }, + { 7, 13, 8, 0, 59 }, { 7, 13, 8, 0, 57 }, + { 7, 12, 8, 0, 70 }, { 7, 12, 8, 0, 68 }, + { 7, 12, 8, 0, 66 }, { 7, 12, 8, 0, 64 }, + { 7, 12, 8, 0, 62 }, { 7, 12, 8, 0, 61 }, + { 7, 12, 8, 0, 59 }, { 7, 12, 8, 0, 57 }, + { 7, 12, 7, 0, 70 }, { 7, 12, 7, 0, 68 }, + { 7, 12, 7, 0, 66 }, { 7, 12, 7, 0, 64 }, + { 7, 12, 7, 0, 62 }, { 7, 12, 7, 0, 61 }, + { 7, 12, 7, 0, 59 }, { 7, 12, 7, 0, 57 }, + { 7, 11, 7, 0, 70 }, { 7, 11, 7, 0, 68 }, + { 7, 11, 7, 0, 66 }, { 7, 11, 7, 0, 64 }, + { 7, 11, 7, 0, 62 }, { 7, 11, 7, 0, 61 }, + { 7, 11, 7, 0, 59 }, { 7, 11, 7, 0, 57 }, + { 7, 11, 6, 0, 69 }, { 7, 11, 6, 0, 67 }, + { 7, 11, 6, 0, 65 }, { 7, 11, 6, 0, 63 }, + { 7, 11, 6, 0, 62 }, { 7, 11, 6, 0, 60 } + }; + + if (mac->mac_phy.rev != 0 && mac->mac_phy.rev != 1) { + if (siba->siba_sprom.bf_hi & BWN_BFH_NOPA) + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_r2); + else if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, + txgain_2ghz_r2); + else + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, + txgain_5ghz_r2); + return; + } + + if (mac->mac_phy.rev == 0) { + if ((siba->siba_sprom.bf_hi & BWN_BFH_NOPA) || + (siba->siba_sprom.bf_lo & BWN_BFL_HGPA)) + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_r0); + else if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, + txgain_2ghz_r0); + else + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, + txgain_5ghz_r0); + return; + } + + if ((siba->siba_sprom.bf_hi & BWN_BFH_NOPA) || + (siba->siba_sprom.bf_lo & BWN_BFL_HGPA)) + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_r1); + else if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_2ghz_r1); + else + bwn_phy_lp_gaintbl_write_multi(mac, 0, 128, txgain_5ghz_r1); +} + +static void +bwn_tab_write(struct bwn_mac *mac, uint32_t typeoffset, uint32_t value) +{ + uint32_t offset, type; + + type = BWN_TAB_GETTYPE(typeoffset); + offset = BWN_TAB_GETOFFSET(typeoffset); + KASSERT(offset <= 0xffff, ("%s:%d: fail", __func__, __LINE__)); + + switch (type) { + case BWN_TAB_8BIT: + KASSERT(!(value & ~0xff), ("%s:%d: fail", __func__, __LINE__)); + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATALO, value); + break; + case BWN_TAB_16BIT: + KASSERT(!(value & ~0xffff), + ("%s:%d: fail", __func__, __LINE__)); + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATALO, value); + break; + case BWN_TAB_32BIT: + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATAHI, value >> 16); + BWN_PHY_WRITE(mac, BWN_PHY_TABLEDATALO, value); + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + } +} + +static int +bwn_phy_lp_loopback(struct bwn_mac *mac) +{ + struct bwn_phy_lp_iq_est ie; + int i, index = -1; + uint32_t tmp; + + memset(&ie, 0, sizeof(ie)); + + bwn_phy_lp_set_trsw_over(mac, 1, 1); + BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVR, 1); + BWN_PHY_MASK(mac, BWN_PHY_AFE_CTL_OVRVAL, 0xfffe); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x800); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0x800); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x8); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0x8); + BWN_RF_WRITE(mac, BWN_B2062_N_TXCTL_A, 0x80); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_0, 0x80); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_VAL_0, 0x80); + for (i = 0; i < 32; i++) { + bwn_phy_lp_set_rxgain_idx(mac, i); + bwn_phy_lp_ddfs_turnon(mac, 1, 1, 5, 5, 0); + if (!(bwn_phy_lp_rx_iq_est(mac, 1000, 32, &ie))) + continue; + tmp = (ie.ie_ipwr + ie.ie_qpwr) / 1000; + if ((tmp > 4000) && (tmp < 10000)) { + index = i; + break; + } + } + bwn_phy_lp_ddfs_turnoff(mac); + return (index); +} + +static void +bwn_phy_lp_set_rxgain_idx(struct bwn_mac *mac, uint16_t idx) +{ + + bwn_phy_lp_set_rxgain(mac, bwn_tab_read(mac, BWN_TAB_2(12, idx))); +} + +static void +bwn_phy_lp_ddfs_turnon(struct bwn_mac *mac, int i_on, int q_on, + int incr1, int incr2, int scale_idx) +{ + + bwn_phy_lp_ddfs_turnoff(mac); + BWN_PHY_MASK(mac, BWN_PHY_AFE_DDFS_POINTER_INIT, 0xff80); + BWN_PHY_MASK(mac, BWN_PHY_AFE_DDFS_POINTER_INIT, 0x80ff); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_DDFS_INCR_INIT, 0xff80, incr1); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_DDFS_INCR_INIT, 0x80ff, incr2 << 8); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_DDFS, 0xfff7, i_on << 3); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_DDFS, 0xffef, q_on << 4); + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_DDFS, 0xff9f, scale_idx << 5); + BWN_PHY_MASK(mac, BWN_PHY_AFE_DDFS, 0xfffb); + BWN_PHY_SET(mac, BWN_PHY_AFE_DDFS, 0x2); + BWN_PHY_SET(mac, BWN_PHY_LP_PHY_CTL, 0x20); +} + +static uint8_t +bwn_phy_lp_rx_iq_est(struct bwn_mac *mac, uint16_t sample, uint8_t time, + struct bwn_phy_lp_iq_est *ie) +{ + int i; + + BWN_PHY_MASK(mac, BWN_PHY_CRSGAIN_CTL, 0xfff7); + BWN_PHY_WRITE(mac, BWN_PHY_IQ_NUM_SMPLS_ADDR, sample); + BWN_PHY_SETMASK(mac, BWN_PHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xff00, time); + BWN_PHY_MASK(mac, BWN_PHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xfeff); + BWN_PHY_SET(mac, BWN_PHY_IQ_ENABLE_WAIT_TIME_ADDR, 0x200); + + for (i = 0; i < 500; i++) { + if (!(BWN_PHY_READ(mac, + BWN_PHY_IQ_ENABLE_WAIT_TIME_ADDR) & 0x200)) + break; + DELAY(1000); + } + if ((BWN_PHY_READ(mac, BWN_PHY_IQ_ENABLE_WAIT_TIME_ADDR) & 0x200)) { + BWN_PHY_SET(mac, BWN_PHY_CRSGAIN_CTL, 0x8); + return 0; + } + + ie->ie_iqprod = BWN_PHY_READ(mac, BWN_PHY_IQ_ACC_HI_ADDR); + ie->ie_iqprod <<= 16; + ie->ie_iqprod |= BWN_PHY_READ(mac, BWN_PHY_IQ_ACC_LO_ADDR); + ie->ie_ipwr = BWN_PHY_READ(mac, BWN_PHY_IQ_I_PWR_ACC_HI_ADDR); + ie->ie_ipwr <<= 16; + ie->ie_ipwr |= BWN_PHY_READ(mac, BWN_PHY_IQ_I_PWR_ACC_LO_ADDR); + ie->ie_qpwr = BWN_PHY_READ(mac, BWN_PHY_IQ_Q_PWR_ACC_HI_ADDR); + ie->ie_qpwr <<= 16; + ie->ie_qpwr |= BWN_PHY_READ(mac, BWN_PHY_IQ_Q_PWR_ACC_LO_ADDR); + + BWN_PHY_SET(mac, BWN_PHY_CRSGAIN_CTL, 0x8); + return 1; +} + +static uint32_t +bwn_tab_read(struct bwn_mac *mac, uint32_t typeoffset) +{ + uint32_t offset, type, value; + + type = BWN_TAB_GETTYPE(typeoffset); + offset = BWN_TAB_GETOFFSET(typeoffset); + KASSERT(offset <= 0xffff, ("%s:%d: fail", __func__, __LINE__)); + + switch (type) { + case BWN_TAB_8BIT: + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + value = BWN_PHY_READ(mac, BWN_PHY_TABLEDATALO) & 0xff; + break; + case BWN_TAB_16BIT: + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + value = BWN_PHY_READ(mac, BWN_PHY_TABLEDATALO); + break; + case BWN_TAB_32BIT: + BWN_PHY_WRITE(mac, BWN_PHY_TABLE_ADDR, offset); + value = BWN_PHY_READ(mac, BWN_PHY_TABLEDATAHI); + value <<= 16; + value |= BWN_PHY_READ(mac, BWN_PHY_TABLEDATALO); + break; + default: + KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); + value = 0; + } + + return (value); +} + +static void +bwn_phy_lp_ddfs_turnoff(struct bwn_mac *mac) +{ + + BWN_PHY_MASK(mac, BWN_PHY_AFE_DDFS, 0xfffd); + BWN_PHY_MASK(mac, BWN_PHY_LP_PHY_CTL, 0xffdf); +} + +static void +bwn_phy_lp_set_txgain_dac(struct bwn_mac *mac, uint16_t dac) +{ + uint16_t ctl; + + ctl = BWN_PHY_READ(mac, BWN_PHY_AFE_DAC_CTL) & 0xc7f; + ctl |= dac << 7; + BWN_PHY_SETMASK(mac, BWN_PHY_AFE_DAC_CTL, 0xf000, ctl); +} + +static void +bwn_phy_lp_set_txgain_pa(struct bwn_mac *mac, uint16_t gain) +{ + + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xfb), 0xe03f, gain << 6); + BWN_PHY_SETMASK(mac, BWN_PHY_OFDM(0xfd), 0x80ff, gain << 8); +} + +static void +bwn_phy_lp_set_txgain_override(struct bwn_mac *mac) +{ + + if (mac->mac_phy.rev < 2) + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x100); + else { + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x80); + BWN_PHY_SET(mac, BWN_PHY_RF_OVERRIDE_2, 0x4000); + } + BWN_PHY_SET(mac, BWN_PHY_AFE_CTL_OVR, 0x40); +} + +static uint16_t +bwn_phy_lp_get_pa_gain(struct bwn_mac *mac) +{ + + return BWN_PHY_READ(mac, BWN_PHY_OFDM(0xfb)) & 0x7f; +} + +static uint8_t +bwn_nbits(int32_t val) +{ + uint32_t tmp; + uint8_t nbits = 0; + + for (tmp = abs(val); tmp != 0; tmp >>= 1) + nbits++; + return (nbits); +} + +static void +bwn_phy_lp_gaintbl_write_multi(struct bwn_mac *mac, int offset, int count, + struct bwn_txgain_entry *table) +{ + int i; + + for (i = offset; i < count; i++) + bwn_phy_lp_gaintbl_write(mac, i, table[i]); +} + +static void +bwn_phy_lp_gaintbl_write(struct bwn_mac *mac, int offset, + struct bwn_txgain_entry data) +{ + + if (mac->mac_phy.rev >= 2) + bwn_phy_lp_gaintbl_write_r2(mac, offset, data); + else + bwn_phy_lp_gaintbl_write_r01(mac, offset, data); +} + +static void +bwn_phy_lp_gaintbl_write_r2(struct bwn_mac *mac, int offset, + struct bwn_txgain_entry te) +{ + struct bwn_softc *sc = mac->mac_sc; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + + KASSERT(mac->mac_phy.rev >= 2, ("%s:%d: fail", __func__, __LINE__)); + + tmp = (te.te_pad << 16) | (te.te_pga << 8) | te.te_gm; + if (mac->mac_phy.rev >= 3) { + tmp |= ((IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) ? + (0x10 << 24) : (0x70 << 24)); + } else { + tmp |= ((IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) ? + (0x14 << 24) : (0x7f << 24)); + } + bwn_tab_write(mac, BWN_TAB_4(7, 0xc0 + offset), tmp); + bwn_tab_write(mac, BWN_TAB_4(7, 0x140 + offset), + te.te_bbmult << 20 | te.te_dac << 28); +} + +static void +bwn_phy_lp_gaintbl_write_r01(struct bwn_mac *mac, int offset, + struct bwn_txgain_entry te) +{ + + KASSERT(mac->mac_phy.rev < 2, ("%s:%d: fail", __func__, __LINE__)); + + bwn_tab_write(mac, BWN_TAB_4(10, 0xc0 + offset), + (te.te_pad << 11) | (te.te_pga << 7) | (te.te_gm << 4) | + te.te_dac); + bwn_tab_write(mac, BWN_TAB_4(10, 0x140 + offset), te.te_bbmult << 20); +} + +static void +bwn_sysctl_node(struct bwn_softc *sc) +{ + device_t dev = sc->sc_dev; + struct bwn_mac *mac; + struct bwn_stats *stats; + + /* XXX assume that count of MAC is only 1. */ + + if ((mac = sc->sc_curmac) == NULL) + return; + stats = &mac->mac_stats; + + SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "linknoise", CTLFLAG_RW, &stats->rts, 0, "Noise level"); + SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "rts", CTLFLAG_RW, &stats->rts, 0, "RTS"); + SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "rtsfail", CTLFLAG_RW, &stats->rtsfail, 0, "RTS failed to send"); + +#ifdef BWN_DEBUG + SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "debug", CTLFLAG_RW, &sc->sc_debug, 0, "Debug flags"); +#endif +} + +static void +bwn_identify(driver_t *driver, device_t parent) +{ + + BUS_ADD_CHILD(parent, 0, "bwn", -1); +} + +static device_method_t bwn_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, bwn_identify), + DEVMETHOD(device_probe, bwn_probe), + DEVMETHOD(device_attach, bwn_attach), + DEVMETHOD(device_detach, bwn_detach), + DEVMETHOD(device_suspend, bwn_suspend), + DEVMETHOD(device_resume, bwn_resume), + { 0,0 } +}; +static driver_t bwn_driver = { + "bwn", + bwn_methods, + sizeof(struct bwn_softc) +}; +static devclass_t bwn_devclass; +DRIVER_MODULE(bwn, siba_bwn, bwn_driver, bwn_devclass, 0, 0); +MODULE_DEPEND(bwn, siba_bwn, 1, 1, 1); +MODULE_DEPEND(bwn, wlan, 1, 1, 1); /* 802.11 media layer */ +MODULE_DEPEND(bwn, firmware, 1, 1, 1); /* firmware support */ +MODULE_DEPEND(bwn, wlan_amrr, 1, 1, 1); diff --git a/sys/dev/bwn/if_bwnreg.h b/sys/dev/bwn/if_bwnreg.h new file mode 100644 index 000000000000..71f56f4da507 --- /dev/null +++ b/sys/dev/bwn/if_bwnreg.h @@ -0,0 +1,998 @@ +/*- + * Copyright (c) 2009-2010 Weongyo Jeong + * 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, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * 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. + * + * $FreeBSD$ + */ + +#ifndef _IF_BWNREG_H +#define _IF_BWNREG_H + +#define PCI_VENDOR_COMPAQ 0x0e11 +#define PCI_VENDOR_DELL 0x1028 +#define PCI_VENDOR_HP 0x103c +#define PCI_VENDOR_ASUSTEK 0x1043 +#define PCI_VENDOR_MOTOROLA 0x1057 +#define PCI_VENDOR_APPLE 0x106b +#define PCI_VENDOR_BROADCOM 0x14e4 +#define PCI_VENDOR_LINKSYS 0x1737 + +#define BWN_BFL_BTCOEXIST 0x0001 +#define BWN_BFL_PACTRL 0x0002 +#define BWN_BFL_RSSI 0x0008 +#define BWN_BFL_CRYSTAL_NOSLOW 0x0020 +#define BWN_BFL_FEM 0x0800 +#define BWN_BFL_EXTLNA 0x1000 +#define BWN_BFL_HGPA 0x2000 /* had high gain PA */ +#define BWN_BFL_BTCMOD 0x4000 +#define BWN_BFL_ALTIQ 0x8000 + +#define BWN_BFH_NOPA 0x0001 +#define BWN_BFH_RSSIINV 0x0002 +#define BWN_BFH_LDO_PAREF 0x0004 +#define BWN_BFH_FEM_BT 0x0040 + +#define BWN_TGSLOW_SUPPORT_G 0x20000000 +#define BWN_TGSLOW_PHYRESET 0x00080000 +#define BWN_TGSLOW_PHYCLOCK_ENABLE 0x00040000 +#define BWN_TGSHIGH_HAVE_2GHZ 0x00010000 +#define BWN_TGSHIGH_HAVE_5GHZ 0x00020000 + +#define BWN_PHYTYPE_A 0x00 +#define BWN_PHYTYPE_B 0x01 +#define BWN_PHYTYPE_G 0x02 +#define BWN_PHYTYPE_N 0x04 +#define BWN_PHYTYPE_LP 0x05 + +#define BWN_DMA0_REASON 0x20 +#define BWN_DMA0_INTR_MASK 0x24 +#define BWN_DMA1_REASON 0x28 +#define BWN_DMA1_INTR_MASK 0x2c +#define BWN_DMA2_REASON 0x30 +#define BWN_DMA2_INTR_MASK 0x34 +#define BWN_DMA3_REASON 0x38 +#define BWN_DMA3_INTR_MASK 0x3c +#define BWN_DMA4_REASON 0x40 +#define BWN_DMA4_INTR_MASK 0x44 +#define BWN_DMA5_INTR_MASK 0x4c +#define BWN_MACCTL 0x120 +#define BWN_MACCTL_ON 0x00000001 +#define BWN_MACCTL_MCODE_RUN 0x00000002 +#define BWN_MACCTL_MCODE_JMP0 0x00000004 +#define BWN_MACCTL_SHM_ON 0x00000100 +#define BWN_MACCTL_IHR_ON 0x00000400 +#define BWN_MACCTL_GPOUT_MASK 0x0000c000 +#define BWN_MACCTL_BIGENDIAN 0x00010000 +#define BWN_MACCTL_STA 0x00020000 +#define BWN_MACCTL_HOSTAP 0x00040000 +#define BWN_MACCTL_RADIO_LOCK 0x00080000 +#define BWN_MACCTL_BEACON_PROMISC 0x00100000 +#define BWN_MACCTL_PASS_BADPLCP 0x00200000 +#define BWN_MACCTL_PASS_CTL 0x00400000 +#define BWN_MACCTL_PASS_BADFCS 0x00800000 +#define BWN_MACCTL_PROMISC 0x01000000 +#define BWN_MACCTL_HWPS 0x02000000 +#define BWN_MACCTL_AWAKE 0x04000000 +#define BWN_MACCTL_GMODE 0x80000000 +#define BWN_MACCMD 0x124 /* MAC command */ +#define BWN_MACCMD_BEACON0_VALID 0x00000001 +#define BWN_MACCMD_BEACON1_VALID 0x00000002 +#define BWN_MACCMD_DFQ_VALID 0x00000004 +#define BWN_MACCMD_BGNOISE 0x00000010 +#define BWN_INTR_REASON 0x128 +#define BWN_INTR_MASK 0x12c +#define BWN_RAM_CONTROL 0x130 +#define BWN_RAM_DATA 0x134 +#define BWN_PS_STATUS 0x140 +#define BWN_RF_HWENABLED_HI 0x158 +#define BWN_RF_HWENABLED_HI_MASK (1 << 16) +#define BWN_SHM_CONTROL 0x160 +#define BWN_SHM_DATA 0x164 +#define BWN_SHM_DATA_UNALIGNED 0x166 +#define BWN_XMITSTAT_0 0x170 +#define BWN_XMITSTAT_1 0x174 +#define BWN_REV3PLUS_TSF_LOW 0x180 /* core rev >= 3 only */ +#define BWN_REV3PLUS_TSF_HIGH 0x184 /* core rev >= 3 only */ +#define BWN_TSF_CFP_START 0x18c + +/* 32-bit DMA */ +#define BWN_DMA32_BASE0 0x200 +#define BWN_DMA32_BASE1 0x220 +#define BWN_DMA32_BASE2 0x240 +#define BWN_DMA32_BASE3 0x260 +#define BWN_DMA32_BASE4 0x280 +#define BWN_DMA32_BASE5 0x2a0 +/* 64-bit DMA */ +#define BWN_DMA64_BASE0 0x200 +#define BWN_DMA64_BASE1 0x240 +#define BWN_DMA64_BASE2 0x280 +#define BWN_DMA64_BASE3 0x2c0 +#define BWN_DMA64_BASE4 0x300 +#define BWN_DMA64_BASE5 0x340 + +/* PIO on core rev < 11 */ +#define BWN_PIO_BASE0 0x300 +#define BWN_PIO_BASE1 0x310 +#define BWN_PIO_BASE2 0x320 +#define BWN_PIO_BASE3 0x330 +#define BWN_PIO_BASE4 0x340 +#define BWN_PIO_BASE5 0x350 +#define BWN_PIO_BASE6 0x360 +#define BWN_PIO_BASE7 0x370 +/* PIO on core rev >= 11 */ +#define BWN_PIO11_BASE0 0x200 +#define BWN_PIO11_BASE1 0x240 +#define BWN_PIO11_BASE2 0x280 +#define BWN_PIO11_BASE3 0x2c0 +#define BWN_PIO11_BASE4 0x300 +#define BWN_PIO11_BASE5 0x340 + +#define BWN_GPIOCTL 0x06c +#define BWN_PHYVER 0x3e0 +#define BWN_PHYVER_ANALOG 0xf000 +#define BWN_PHYVER_TYPE 0x0f00 +#define BWN_PHYVER_VERSION 0x00ff +#define BWN_PHY_RADIO 0x3e2 +#define BWN_PHY0 0x3e6 +#define BWN_CHANNEL 0x3f0 +#define BWN_CHANNEL_EXT 0x3f4 +#define BWN_RFCTL 0x3f6 +#define BWN_RFCTL_ID 0x01 +#define BWN_RFDATAHI 0x3f8 +#define BWN_RFDATALO 0x3fa +#define BWN_PHYCTL 0x3fc +#define BWN_PHYDATA 0x3fe +#define BWN_MACFILTER_CONTROL 0x420 +#define BWN_MACFILTER_DATA 0x422 +#define BWN_RCMTA_COUNT 0x43c +#define BWN_RF_HWENABLED_LO 0x49a +#define BWN_RF_HWENABLED_LO_MASK (1 << 4) +#define BWN_GPIO_CONTROL 0x49c +#define BWN_GPIO_MASK 0x49e +#define BWN_TSF_CFP_START_LOW 0x604 +#define BWN_TSF_CFP_START_HIGH 0x606 +#define BWN_TSF_CFP_PRETBTT 0x612 +#define BWN_RNG 0x65a +#define BWN_IFSCTL 0x688 /* Interframe space control */ +#define BWN_IFSCTL_USE_EDCF 0x0004 +#define BWN_POWERUP_DELAY 0x6a8 +#define BWN_BTCOEX_CTL 0x6b4 +#define BWN_BTCOEX_TXCTL 0x6b8 + +#define BWN_UCODE 0x0 +#define BWN_HW 0x3 +#define BWN_RCMTA 0x4 + +#define BWN_TSSI_MAX 0x7f +#define BWN_SHARED 0x1 +#define BWN_SHARED_UCODE_REV 0x0000 +#define BWN_SHARED_UCODE_PATCH 0x0002 +#define BWN_SHARED_UCODE_DATE 0x0004 +#define BWN_SHARED_UCODE_TIME 0x0006 +#define BWN_SHARED_COREREV 0x0016 +#define BWN_SHARED_ACKCTS_PHYCTL 0x0022 +#define BWN_SHARED_RX_PADOFFSET 0x0034 +#define BWN_SHARED_UCODESTAT 0x0040 +#define BWN_SHARED_UCODESTAT_SUSPEND 3 +#define BWN_SHARED_UCODESTAT_SLEEP 4 +#define BWN_SHARED_FWCAPS 0x0042 +#define BWN_SHARED_SHORT_RETRY_FALLBACK 0x0044 +#define BWN_SHARED_LONG_RETRY_FALLBACK 0x0046 +#define BWN_SHARED_BEACON_PHYCTL 0x0054 +#define BWN_SHARED_KEY_TABLEP 0x0056 +#define BWN_SHARED_TSSI_CCK 0x0058 +#define BWN_SHARED_HFLO 0x005e /* low hostflag */ +#define BWN_SHARED_HFMI 0x0060 /* middle hostflag */ +#define BWN_SHARED_HFHI 0x0062 /* high hostflag */ +#define BWN_SHARED_RADIO_ATT 0x0064 +#define BWN_SHARED_TSSI_OFDM_G 0x0070 +#define BWN_SHARED_PROBE_RESP_MAXTIME 0x0074 +#define BWN_SHARED_SPU_WAKEUP 0x0094 +#define BWN_SHARED_PRETBTT 0x0096 +#define BWN_SHARED_CHAN 0x00a0 +#define BWN_SHARED_AUTOINC 0x0100 +#define BWN_SHARED_PROBE_RESP_PHYCTL 0x0188 +#define BWN_SHARED_EDCFQ 0x0240 +#define BWN_SHARED_KEYIDX_BLOCK 0x05d4 +#define BWN_SHARED_PSM 0x05f4 + +/* SHM_SCRATCH offsets */ +#define BWN_SCRATCH 0x2 +#define BWN_SCRATCH_CONT_MIN 0x0003 +#define BWN_SCRATCH_CONT_MAX 0x0004 +#define BWN_SCRATCH_SHORT_RETRY 0x0006 +#define BWN_SCRATCH_LONG_RETRY 0x0007 + +/* Generic-Interrupt reasons. */ +#define BWN_INTR_MAC_SUSPENDED 0x00000001 +#define BWN_INTR_BEACON 0x00000002 +#define BWN_INTR_TBTT_INDI 0x00000004 +#define BWN_INTR_ATIM_END 0x00000020 +#define BWN_INTR_PMQ 0x00000040 +#define BWN_INTR_MAC_TXERR 0x00000200 +#define BWN_INTR_PHY_TXERR 0x00000800 +#define BWN_INTR_DMA 0x00008000 +#define BWN_INTR_TXFIFO_FLUSH_OK 0x00010000 +#define BWN_INTR_NOISESAMPLE_OK 0x00040000 +#define BWN_INTR_UCODE_DEBUG 0x08000000 +#define BWN_INTR_RFKILL 0x10000000 +#define BWN_INTR_TX_OK 0x20000000 +#define BWN_INTR_ALL 0xffffffff +#define BWN_INTR_MASKTEMPLATE \ + (BWN_INTR_TBTT_INDI | BWN_INTR_ATIM_END | BWN_INTR_PMQ | \ + BWN_INTR_MAC_TXERR | BWN_INTR_PHY_TXERR | BWN_INTR_DMA | \ + BWN_INTR_TXFIFO_FLUSH_OK | BWN_INTR_NOISESAMPLE_OK | \ + BWN_INTR_UCODE_DEBUG | BWN_INTR_RFKILL | BWN_INTR_TX_OK) + +#define BWN_HF_UCODE_ANTDIV_HELPER 0x000000000001ull +#define BWN_HF_GPHY_SYM_WORKAROUND 0x000000000002ull +#define BWN_HF_4DB_CCK_POWERBOOST 0x000000000008ull +#define BWN_HF_BT_COEXIST 0x000000000010ull +#define BWN_HF_GPHY_DC_CANCELFILTER 0x000000000020ull +#define BWN_HF_PAGAINBOOST_OFDM_ON 0x000000000040ull +#define BWN_HF_JAPAN_CHAN14_OFF 0x000000000080ull +#define BWN_HF_EDCF 0x000000000100ull +#define BWN_HF_TSSI_RESET_PSM_WORKAROUN 0x000000000200ull +#define BWN_HF_SLOWCLOCK_REQ_OFF 0x000000000400ull +#define BWN_HF_ACI_WORKAROUND 0x000000000800ull +#define BWN_HF_2060_RADIO_WORKAROUND 0x000000001000ull +#define BWN_HF_FORCE_VCO_RECALC 0x000000040000ull +#define BWN_HF_PCI_SLOWCLOCK_WORKAROUND 0x000000080000ull +#define BWN_HF_4318_TSSI 0x000000200000ull +#define BWN_HF_HW_POWERCTL 0x000000800000ull +#define BWN_HF_BT_COEXISTALT 0x000001000000ull +#define BWN_HF_SKIP_CFP_UPDATE 0x000004000000ull +#define BWN_HF_PR45960W 0x080000000000ULL + +#define BWN_TX_PHY_ENC_CCK 0x0000 +#define BWN_TX_PHY_ENC_OFDM 0x0001 +#define BWN_TX_PHY_SHORTPRMBL 0x0010 +#define BWN_TX_PHY_ANT 0x03c0 +#define BWN_TX_PHY_ANT0 0x0000 +#define BWN_TX_PHY_ANT1 0x0040 +#define BWN_TX_PHY_ANT01AUTO 0x00c0 +#define BWN_TX_PHY_ANT2 0x0100 +#define BWN_TX_PHY_ANT3 0x0200 +#define BWN_TX_PHY_TXPWR 0xfc00 +#define BWN_TX_MAC_ACK 0x00000001 /* immediate ACK */ +#define BWN_TX_MAC_LONGFRAME 0x00000002 +#define BWN_TX_MAC_SEND_RTSCTS 0x00000004 +#define BWN_TX_MAC_START_MSDU 0x00000008 +#define BWN_TX_MAC_HWSEQ 0x00000010 +#define BWN_TX_MAC_5GHZ 0x00000080 +#define BWN_TX_MAC_SEND_CTSTOSELF 0x00000800 +#define BWN_TX_EFT_FB_CCK 0x00 +#define BWN_TX_EFT_FB_OFDM 0x01 +#define BWN_TX_EFT_RTS_CCK 0x00 +#define BWN_TX_EFT_RTS_OFDM 0x04 +#define BWN_TX_EFT_RTS_FBCCK 0x00 +#define BWN_TX_EFT_RTS_FBOFDM 0x10 + +#define BWN_PIO_TXCTL 0x00 +#define BWN_PIO_TXCTL_WRITELO 0x0001 +#define BWN_PIO_TXCTL_WRITEHI 0x0002 +#define BWN_PIO_TXCTL_EOF 0x0004 +#define BWN_PIO_TXCTL_FRAMEREADY 0x0008 +#define BWN_PIO_TXDATA 0x02 +#define BWN_PIO_TXQBUFSIZE 0x04 +#define BWN_PIO_RXCTL 0x00 +#define BWN_PIO_RXCTL_FRAMEREADY 0x0001 +#define BWN_PIO_RXCTL_DATAREADY 0x0002 +#define BWN_PIO_RXDATA 0x02 +#define BWN_PIO8_TXCTL 0x00 +#define BWN_PIO8_TXCTL_0_7 0x00000001 +#define BWN_PIO8_TXCTL_8_15 0x00000002 +#define BWN_PIO8_TXCTL_16_23 0x00000004 +#define BWN_PIO8_TXCTL_24_31 0x00000008 +#define BWN_PIO8_TXCTL_EOF 0x00000010 +#define BWN_PIO8_TXCTL_FRAMEREADY 0x00000080 +#define BWN_PIO8_TXDATA 0x04 +#define BWN_PIO8_RXCTL 0x00 +#define BWN_PIO8_RXCTL_FRAMEREADY 0x00000001 +#define BWN_PIO8_RXCTL_DATAREADY 0x00000002 +#define BWN_PIO8_RXDATA 0x04 + +#define BWN_DMA32_TXCTL 0x00 +#define BWN_DMA32_TXENABLE 0x00000001 +#define BWN_DMA32_TXSUSPEND 0x00000002 +#define BWN_DMA32_TXADDREXT_MASK 0x00030000 +#define BWN_DMA32_TXADDREXT_SHIFT 16 +#define BWN_DMA32_TXRING 0x04 +#define BWN_DMA32_TXINDEX 0x08 +#define BWN_DMA32_TXSTATUS 0x0c +#define BWN_DMA32_TXSTATE 0x0000f000 +#define BWN_DMA32_TXSTAT_DISABLED 0x00000000 +#define BWN_DMA32_TXSTAT_IDLEWAIT 0x00002000 +#define BWN_DMA32_TXSTAT_STOPPED 0x00003000 +#define BWN_DMA32_RXCTL 0x10 +#define BWN_DMA32_RXENABLE 0x00000001 +#define BWN_DMA32_RXFROFF_SHIFT 1 +#define BWN_DMA32_RXDIRECTFIFO 0x00000100 +#define BWN_DMA32_RXADDREXT_MASK 0x00030000 +#define BWN_DMA32_RXADDREXT_SHIFT 16 +#define BWN_DMA32_RXRING 0x14 +#define BWN_DMA32_RXINDEX 0x18 +#define BWN_DMA32_RXSTATUS 0x1c +#define BWN_DMA32_RXDPTR 0x00000fff +#define BWN_DMA32_RXSTATE 0x0000f000 +#define BWN_DMA32_RXSTAT_DISABLED 0x00000000 +#define BWN_DMA64_TXCTL 0x00 +#define BWN_DMA64_TXENABLE 0x00000001 +#define BWN_DMA64_TXSUSPEND 0x00000002 +#define BWN_DMA64_TXADDREXT_MASK 0x00030000 +#define BWN_DMA64_TXADDREXT_SHIFT 16 +#define BWN_DMA64_TXINDEX 0x04 +#define BWN_DMA64_TXRINGLO 0x08 +#define BWN_DMA64_TXRINGHI 0x0c +#define BWN_DMA64_TXSTATUS 0x10 +#define BWN_DMA64_TXSTAT 0xf0000000 +#define BWN_DMA64_TXSTAT_DISABLED 0x00000000 +#define BWN_DMA64_TXSTAT_IDLEWAIT 0x20000000 +#define BWN_DMA64_TXSTAT_STOPPED 0x30000000 +#define BWN_DMA64_RXCTL 0x20 +#define BWN_DMA64_RXENABLE 0x00000001 +#define BWN_DMA64_RXFROFF_SHIFT 1 +#define BWN_DMA64_RXDIRECTFIFO 0x00000100 +#define BWN_DMA64_RXADDREXT_MASK 0x00030000 +#define BWN_DMA64_RXADDREXT_SHIFT 16 +#define BWN_DMA64_RXINDEX 0x24 +#define BWN_DMA64_RXRINGLO 0x28 +#define BWN_DMA64_RXRINGHI 0x2c +#define BWN_DMA64_RXSTATUS 0x30 +#define BWN_DMA64_RXSTATDPTR 0x00001fff +#define BWN_DMA64_RXSTAT 0xf0000000 +#define BWN_DMA64_RXSTAT_DISABLED 0x00000000 +#define BWN_DMA_RINGMEMSIZE PAGE_SIZE +#define BWN_DMA0_RX_FRAMEOFFSET 30 + +#define BWN_TXRING_SLOTS 64 +#define BWN_RXRING_SLOTS 64 +#define BWN_DMA0_RX_BUFFERSIZE IEEE80211_MAX_LEN + +#define BWN_PHYROUTE_BASE 0x0000 +#define BWN_PHYROUTE_OFDM_GPHY 0x0400 +#define BWN_PHYROUTE_EXT_GPHY 0x0800 +#define BWN_PHY_CCK(reg) ((reg) | BWN_PHYROUTE_BASE) +#define BWN_PHY_N_BMODE(reg) ((reg) | BWN_PHYROUTE_N_BMODE) +#define BWN_PHY_OFDM(reg) ((reg) | BWN_PHYROUTE_OFDM_GPHY) +#define BWN_PHY_EXTG(reg) ((reg) | BWN_PHYROUTE_EXT_GPHY) + +#define BWN_PHY_VERSION_OFDM BWN_PHY_OFDM(0x00) +#define BWN_PHY_BBANDCFG BWN_PHY_OFDM(0x01) +#define BWN_PHY_BBANDCFG_RXANT 0x180 +#define BWN_PHY_BBANDCFG_RXANT_SHIFT 7 +#define BWN_PHY_PWRDOWN BWN_PHY_OFDM(0x03) +#define BWN_PHY_CRSTHRES1_R1 BWN_PHY_OFDM(0x06) +#define BWN_PHY_CRSGAIN_CTL BWN_PHY_OFDM(0x10) +#define BWN_PHY_MINPWR_LEVEL BWN_PHY_OFDM(0x16) +#define BWN_PHY_OFDMSYNCTHRESH0 BWN_PHY_OFDM(0x17) +#define BWN_PHY_IDLEAFTERPKTRXTO BWN_PHY_OFDM(0x1a) +#define BWN_PHY_LNAHPFCTL BWN_PHY_OFDM(0x1c) +#define BWN_PHY_DCOFFSETTRANSIENT BWN_PHY_OFDM(0x1c) /* for LP */ +#define BWN_PHY_PREAMBLECONFIRMTO BWN_PHY_OFDM(0x1e) +#define BWN_PHY_CLIPTHRESH BWN_PHY_OFDM(0x1f) +#define BWN_PHY_LPFGAINCTL BWN_PHY_OFDM(0x20) +#define BWN_PHY_CLIPCTRTHRESH BWN_PHY_OFDM(0x20) /* for LP */ +#define BWN_PHY_HIGAINDB BWN_PHY_OFDM(0x23) +#define BWN_PHY_LOWGAINDB BWN_PHY_OFDM(0x24) +#define BWN_PHY_VERYLOWGAINDB BWN_PHY_OFDM(0x25) +#define BWN_PHY_GAINMISMATCH BWN_PHY_OFDM(0x26) +#define BWN_PHY_ADIVRELATED BWN_PHY_OFDM(0x27) +#define BWN_PHY_GAINDIRECTMISMATCH BWN_PHY_OFDM(0x27) /* for LP */ +#define BWN_PHY_CRS0 BWN_PHY_OFDM(0x29) +#define BWN_PHY_CRS0_EN 0x4000 +#define BWN_PHY_PWR_THRESH1 BWN_PHY_OFDM(0x29) /* for LP */ +#define BWN_PHY_ANTDWELL BWN_PHY_OFDM(0x2b) +#define BWN_PHY_ANTDWELL_AUTODIV1 0x0100 +#define BWN_PHY_DSSS_CONFIRM_CNT BWN_PHY_OFDM(0x2f) /* DSSS Confirm Cnt */ +#define BWN_PHY_PEAK_COUNT BWN_PHY_OFDM(0x30) +#define BWN_PHY_GAIN_MISMATCH_LIMIT BWN_PHY_OFDM(0x31) +#define BWN_PHY_CRS_ED_THRESH BWN_PHY_OFDM(0x32) +#define BWN_PHY_INPUT_PWRDB BWN_PHY_OFDM(0x34) +#define BWN_PHY_AFE_ADC_CTL_0 BWN_PHY_OFDM(0x36) +#define BWN_PHY_AFE_ADC_CTL_1 BWN_PHY_OFDM(0x37) +#define BWN_PHY_AFE_DAC_CTL BWN_PHY_OFDM(0x39) +#define BWN_PHY_AFE_CTL BWN_PHY_OFDM(0x3a) +#define BWN_PHY_AFE_CTL_OVR BWN_PHY_OFDM(0x3b) +#define BWN_PHY_AFE_CTL_OVRVAL BWN_PHY_OFDM(0x3c) +#define BWN_PHY_AFE_RSSI_CTL_0 BWN_PHY_OFDM(0x3d) +#define BWN_PHY_AFE_RSSI_CTL_1 BWN_PHY_OFDM(0x3e) +#define BWN_PHY_LP_PHY_CTL BWN_PHY_OFDM(0x48) +#define BWN_PHY_ENCORE BWN_PHY_OFDM(0x49) +#define BWN_PHY_ENCORE_EN 0x0200 +#define BWN_PHY_RESET_CTL BWN_PHY_OFDM(0x4a) +#define BWN_PHY_RF_OVERRIDE_0 BWN_PHY_OFDM(0x4c) +#define BWN_PHY_RF_OVERRIDE_VAL_0 BWN_PHY_OFDM(0x4d) +#define BWN_PHY_TR_LOOKUP_1 BWN_PHY_OFDM(0x4e) +#define BWN_PHY_TR_LOOKUP_2 BWN_PHY_OFDM(0x4F) +#define BWN_PHY_LMS BWN_PHY_OFDM(0x55) +#define BWN_PHY_TABLE_ADDR BWN_PHY_OFDM(0x55) /* for LP */ +#define BWN_PHY_TABLEDATALO BWN_PHY_OFDM(0x56) +#define BWN_PHY_TABLEDATAHI BWN_PHY_OFDM(0x57) +#define BWN_PHY_OFDM61 BWN_PHY_OFDM(0x61) +#define BWN_PHY_OFDM61_10 0x0010 +#define BWN_PHY_ADC_COMPENSATION_CTL BWN_PHY_OFDM(0x70) +#define BWN_PHY_OTABLECTL BWN_PHY_OFDM(0x72) +#define BWN_PHY_OTABLENR_SHIFT 10 +#define BWN_PHY_OTABLEI BWN_PHY_OFDM(0x73) +#define BWN_PHY_OTABLEQ BWN_PHY_OFDM(0x74) +#define BWN_PHY_HPWR_TSSICTL BWN_PHY_OFDM(0x78) +#define BWN_PHY_IQ_ENABLE_WAIT_TIME_ADDR BWN_PHY_OFDM(0x81) +#define BWN_PHY_IQ_NUM_SMPLS_ADDR BWN_PHY_OFDM(0x82) +#define BWN_PHY_IQ_ACC_HI_ADDR BWN_PHY_OFDM(0x83) +#define BWN_PHY_IQ_ACC_LO_ADDR BWN_PHY_OFDM(0x84) +#define BWN_PHY_IQ_I_PWR_ACC_HI_ADDR BWN_PHY_OFDM(0x85) +#define BWN_PHY_IQ_I_PWR_ACC_LO_ADDR BWN_PHY_OFDM(0x86) +#define BWN_PHY_IQ_Q_PWR_ACC_HI_ADDR BWN_PHY_OFDM(0x87) +#define BWN_PHY_IQ_Q_PWR_ACC_LO_ADDR BWN_PHY_OFDM(0x88) +#define BWN_PHY_ANTWRSETT BWN_PHY_OFDM(0x8c) +#define BWN_PHY_ANTWRSETT_ARXDIV 0x2000 +#define BWN_PHY_OFDM9B BWN_PHY_OFDM(0x9b) +#define BWN_PHY_A_PHY_CTL_ADDR BWN_PHY_OFDM(0x9c) +#define BWN_PHY_RX_COMP_COEFF_S BWN_PHY_OFDM(0x9e) +#define BWN_PHY_N1P1GAIN BWN_PHY_OFDM(0xa0) +#define BWN_PHY_SMPL_PLAY_COUNT BWN_PHY_OFDM(0xa0) /* for LP */ +#define BWN_PHY_P1P2GAIN BWN_PHY_OFDM(0xa1) +#define BWN_PHY_SMPL_PLAY_BUFFER_CTL BWN_PHY_OFDM(0xA1) /* for LP */ +#define BWN_PHY_N1N2GAIN BWN_PHY_OFDM(0xa2) +#define BWN_PHY_4WIRECTL BWN_PHY_OFDM(0xa2) /* for LP */ +#define BWN_PHY_TX_PWR_CTL_CMD BWN_PHY_OFDM(0xa4) +#define BWN_PHY_TX_PWR_CTL_CMD_MODE 0xe000 +#define BWN_PHY_TX_PWR_CTL_CMD_MODE_OFF 0x0000 +#define BWN_PHY_TX_PWR_CTL_CMD_MODE_SW 0x8000 +#define BWN_PHY_TX_PWR_CTL_CMD_MODE_HW 0xe000 +#define BWN_PHY_CCKSHIFTBITS_WA BWN_PHY_OFDM(0xa5) +#define BWN_PHY_TX_PWR_CTL_NNUM BWN_PHY_OFDM(0xa5) /* for LP */ +#define BWN_PHY_CCKSHIFTBITS BWN_PHY_OFDM(0xa7) +#define BWN_PHY_DIVSRCHIDX BWN_PHY_OFDM(0xa8) +#define BWN_PHY_DIVP1P2GAIN BWN_PHY_OFDM(0xab) +#define BWN_PHY_LP_RF_SIGNAL_LUT BWN_PHY_OFDM(0xac) +#define BWN_PHY_DIVSRCHGAINBACK BWN_PHY_OFDM(0xad) +#define BWN_PHY_RX_RADIO_CTL BWN_PHY_OFDM(0xae) +#define BWN_PHY_RF_OVERRIDE_2 BWN_PHY_OFDM(0xb0) +#define BWN_PHY_RF_OVERRIDE_2_VAL BWN_PHY_OFDM(0xb1) +#define BWN_PHY_PS_CTL_OVERRIDE_VAL0 BWN_PHY_OFDM(0xB2) +#define BWN_PHY_PS_CTL_OVERRIDE_VAL1 BWN_PHY_OFDM(0xB3) +#define BWN_PHY_PS_CTL_OVERRIDE_VAL2 BWN_PHY_OFDM(0xB4) +#define BWN_PHY_TX_GAIN_CTL_OVERRIDE_VAL BWN_PHY_OFDM(0xB5) +#define BWN_PHY_RX_GAIN_CTL_OVERRIDE_VAL BWN_PHY_OFDM(0xB6) +#define BWN_PHY_AFE_DDFS BWN_PHY_OFDM(0xb7) +#define BWN_PHY_AFE_DDFS_POINTER_INIT BWN_PHY_OFDM(0xB8) +#define BWN_PHY_AFE_DDFS_INCR_INIT BWN_PHY_OFDM(0xB9) +#define BWN_PHY_TR_LOOKUP_3 BWN_PHY_OFDM(0xbb) +#define BWN_PHY_TR_LOOKUP_4 BWN_PHY_OFDM(0xbc) +#define BWN_PHY_GPIO_OUTEN BWN_PHY_OFDM(0xbe) +#define BWN_PHY_GPIO_SELECT BWN_PHY_OFDM(0xbf) +#define BWN_PHY_CRSTHRES1 BWN_PHY_OFDM(0xc0) +#define BWN_PHY_CRSTHRES2 BWN_PHY_OFDM(0xc1) +#define BWN_PHY_4C3 BWN_PHY_OFDM(0xC3) +#define BWN_PHY_4C4 BWN_PHY_OFDM(0xC4) +#define BWN_PHY_4C5 BWN_PHY_OFDM(0xC5) +#define BWN_PHY_TR_LOOKUP_5 BWN_PHY_OFDM(0xC7) +#define BWN_PHY_TR_LOOKUP_6 BWN_PHY_OFDM(0xC8) +#define BWN_PHY_TR_LOOKUP_7 BWN_PHY_OFDM(0xC9) +#define BWN_PHY_TR_LOOKUP_8 BWN_PHY_OFDM(0xCA) +#define BWN_PHY_RF_PWR_OVERRIDE BWN_PHY_OFDM(0xd3) + +#define BWN_OFDMTAB(number, offset) \ + (((number) << BWN_PHY_OTABLENR_SHIFT) | (offset)) +#define BWN_OFDMTAB_AGC1 BWN_OFDMTAB(0x00, 0) +#define BWN_OFDMTAB_GAIN0 BWN_OFDMTAB(0x00, 0) +#define BWN_OFDMTAB_GAINX BWN_OFDMTAB(0x01, 0) +#define BWN_OFDMTAB_GAIN1 BWN_OFDMTAB(0x01, 4) +#define BWN_OFDMTAB_AGC3 BWN_OFDMTAB(0x02, 0) +#define BWN_OFDMTAB_GAIN2 BWN_OFDMTAB(0x02, 3) +#define BWN_OFDMTAB_LNAHPFGAIN1 BWN_OFDMTAB(0x03, 0) +#define BWN_OFDMTAB_WRSSI BWN_OFDMTAB(0x04, 0) +#define BWN_OFDMTAB_NOISESCALE BWN_OFDMTAB(0x05, 0) +#define BWN_OFDMTAB_AGC2 BWN_OFDMTAB(0x06, 0) +#define BWN_OFDMTAB_ROTOR BWN_OFDMTAB(0x08, 0) +#define BWN_OFDMTAB_ADVRETARD BWN_OFDMTAB(0x09, 0) +#define BWN_OFDMTAB_DAC BWN_OFDMTAB(0x0c, 0) +#define BWN_OFDMTAB_DC BWN_OFDMTAB(0x0e, 7) +#define BWN_OFDMTAB_PWRDYN2 BWN_OFDMTAB(0x0e, 12) +#define BWN_OFDMTAB_UNKNOWN_0F BWN_OFDMTAB(0x0f, 0) +#define BWN_OFDMTAB_UNKNOWN_APHY BWN_OFDMTAB(0x0f, 7) +#define BWN_OFDMTAB_LPFGAIN BWN_OFDMTAB(0x0f, 12) +#define BWN_OFDMTAB_RSSI BWN_OFDMTAB(0x10, 0) +#define BWN_OFDMTAB_UNKNOWN_11 BWN_OFDMTAB(0x11, 4) +#define BWN_OFDMTAB_AGC1_R1 BWN_OFDMTAB(0x13, 0) +#define BWN_OFDMTAB_GAINX_R1 BWN_OFDMTAB(0x14, 0) +#define BWN_OFDMTAB_MINSIGSQ BWN_OFDMTAB(0x14, 0) +#define BWN_OFDMTAB_AGC3_R1 BWN_OFDMTAB(0x15, 0) +#define BWN_OFDMTAB_WRSSI_R1 BWN_OFDMTAB(0x15, 4) +#define BWN_OFDMTAB_DACRFPABB BWN_OFDMTAB(0x16, 0) + +#define BWN_PHY_CCKBBANDCFG BWN_PHY_CCK(0x01) +#define BWN_PHY_PGACTL BWN_PHY_CCK(0x15) +#define BWN_PHY_PGACTL_LPF 0x1000 +#define BWN_PHY_PGACTL_LOWBANDW 0x0040 +#define BWN_PHY_PGACTL_UNKNOWN 0xefa0 +#define BWN_PHY_TSSI BWN_PHY_CCK(0x29) +#define BWN_PHY_LO_LEAKAGE BWN_PHY_CCK(0x2d) +#define BWN_PHY_SYNCPEAKCNT BWN_PHY_CCK(0x30) +#define BWN_PHY_SYNCCTL BWN_PHY_CCK(0x35) +#define BWN_PHY_DACCTL BWN_PHY_CCK(0x60) + +#define BWN_PHY_CLASSCTL BWN_PHY_EXTG(0x02) +#define BWN_PHY_GTABCTL BWN_PHY_EXTG(0x03) +#define BWN_PHY_GTABNR_SHIFT 10 +#define BWN_PHY_GTABDATA BWN_PHY_EXTG(0x04) +#define BWN_PHY_LO_MASK BWN_PHY_EXTG(0x0f) +#define BWN_PHY_LO_CTL BWN_PHY_EXTG(0x10) +#define BWN_PHY_RFOVER BWN_PHY_EXTG(0x11) +#define BWN_PHY_RFOVERVAL BWN_PHY_EXTG(0x12) +#define BWN_PHY_RFOVERVAL_EXTLNA 0x8000 +#define BWN_PHY_RFOVERVAL_LNA 0x7000 +#define BWN_PHY_RFOVERVAL_LNA_SHIFT 12 +#define BWN_PHY_RFOVERVAL_PGA 0x0f00 +#define BWN_PHY_RFOVERVAL_PGA_SHIFT 8 +#define BWN_PHY_RFOVERVAL_UNK 0x0010 +#define BWN_PHY_RFOVERVAL_TRSWRX 0x00e0 +#define BWN_PHY_RFOVERVAL_BW 0x0003 +#define BWN_PHY_RFOVERVAL_BW_LPF 0x0001 +#define BWN_PHY_RFOVERVAL_BW_LBW 0x0002 +#define BWN_PHY_ANALOGOVER BWN_PHY_EXTG(0x14) +#define BWN_PHY_ANALOGOVERVAL BWN_PHY_EXTG(0x15) + +#define BWN_GTAB(number, offset) \ + (((number) << BWN_PHY_GTABNR_SHIFT) | (offset)) +#define BWN_GTAB_ORIGTR BWN_GTAB(0x2e, 0x298) + +#define BWN_PHY_G_LOCTL 0x0810 +#define BWN_PHY_RADIO_BITFIELD 0x0401 +#define BWN_PHY_G_CRS 0x0429 +#define BWN_PHY_NRSSI_CTRL 0x0803 +#define BWN_PHY_NRSSI_DATA 0x0804 +#define BWN_FWCAPS_HWCRYPTO 0x0001 +#define BWN_FWCAPS_WME 0x0002 +#define BWN_MACFILTER_SELF 0x0000 +#define BWN_MACFILTER_BSSID 0x0003 +#define BWN_SEC_KEYSIZE 16 +#define BWN_SEC_ALGO_NONE 0 +#define BWN_LED_BEHAVIOUR 0x7f +#define BWN_LED_ACTIVELOW 0x80 + +#define BWN_DEBUGINTR_REASON_REG 63 +#define BWN_DEBUGINTR_PANIC 0 +#define BWN_DEBUGINTR_DUMP_SHM 1 +#define BWN_DEBUGINTR_DUMP_REGS 2 +#define BWN_DEBUGINTR_MARKER 3 +#define BWN_DEBUGINTR_ACK 0xffff + +#define BWN_FWPANIC_REASON_REG 3 +#define BWN_FWPANIC_DIE 0 +#define BWN_FWPANIC_RESTART 1 +#define BWN_WATCHDOG_REG 1 + +#define BWN_CCK_RATE_1MB 0x02 +#define BWN_CCK_RATE_2MB 0x04 +#define BWN_CCK_RATE_5MB 0x0b +#define BWN_CCK_RATE_11MB 0x16 +#define BWN_OFDM_RATE_6MB 0x0c +#define BWN_OFDM_RATE_9MB 0x12 +#define BWN_OFDM_RATE_12MB 0x18 +#define BWN_OFDM_RATE_18MB 0x24 +#define BWN_OFDM_RATE_24MB 0x30 +#define BWN_OFDM_RATE_36MB 0x48 +#define BWN_OFDM_RATE_48MB 0x60 +#define BWN_OFDM_RATE_54MB 0x6c + +#define BWN_RX_CHAN_PHYTYPE 0x0007 +#define BWN_RX_PHYST0_GAINCTL 0x4000 +#define BWN_RX_PHYST0_PLCPHCF 0x0200 +#define BWN_RX_PHYST0_PLCPFV 0x0100 +#define BWN_RX_PHYST0_SHORTPRMBL 0x0080 +#define BWN_RX_PHYST0_OFDM 0x0001 +#define BWN_RX_PHYST3_TRSTATE 0x0400 +#define BWN_RX_MAC_KEYIDX 0x000007e0 +#define BWN_RX_MAC_KEYIDX_SHIFT 5 +#define BWN_RX_MAC_DECERR 0x00000010 +#define BWN_RX_MAC_DEC 0x00000008 +#define BWN_RX_MAC_PADDING 0x00000004 +#define BWN_RX_MAC_FCSERR 0x00000001 + +#define BWN_PS_ON (1 << 0) +#define BWN_PS_OFF (1 << 1) +#define BWN_PS_AWAKE (1 << 2) +#define BWN_PS_ASLEEP (1 << 3) + +#define BWN_TAB_NOISESCALE_SIZE 27 + +/* + * SPROM GPIO + */ +#define BWN_LED_ACT_LOW 0x80 +#define BWN_LED_ACT_MASK 0x7f +#define BWN_LED_ACT_OFF 0 +#define BWN_LED_ACT_ON 1 +#define BWN_LED_ACT_BLINK 2 +#define BWN_LED_ACT_RF_ENABLED 3 +#define BWN_LED_ACT_5GHZ 4 +#define BWN_LED_ACT_2GHZ 5 +#define BWN_LED_ACT_11G 6 +#define BWN_LED_ACT_BLINK_SLOW 7 +#define BWN_LED_ACT_BLINK_POLL 8 +#define BWN_LED_ACT_UNKN 9 +#define BWN_LED_ACT_ASSOC 10 +#define BWN_LED_ACT_NULL 11 + +#define BWN_VENDOR_LED_ACT_COMPAQ \ + BWN_LED_ACT_RF_ENABLED, \ + BWN_LED_ACT_2GHZ, \ + BWN_LED_ACT_5GHZ, \ + BWN_LED_ACT_OFF + +#define BWN_VENDOR_LED_ACT_ASUSTEK \ + BWN_LED_ACT_ASSOC, \ + BWN_LED_ACT_2GHZ, \ + BWN_LED_ACT_5GHZ, \ + BWN_LED_ACT_OFF + +#define BWN_VENDOR_LED_ACT_DEFAULT \ + BWN_LED_ACT_BLINK, \ + BWN_LED_ACT_2GHZ, \ + BWN_LED_ACT_5GHZ, \ + BWN_LED_ACT_OFF + +#define BWN_TAB_ROTOR \ +{ \ + 0xfeb93ffd, 0xfec63ffd, 0xfed23ffd, 0xfedf3ffd, 0xfeec3ffe, \ + 0xfef83ffe, 0xff053ffe, 0xff113ffe, 0xff1e3ffe, 0xff2a3fff, \ + 0xff373fff, 0xff443fff, 0xff503fff, 0xff5d3fff, 0xff693fff, \ + 0xff763fff, 0xff824000, 0xff8f4000, 0xff9b4000, 0xffa84000, \ + 0xffb54000, 0xffc14000, 0xffce4000, 0xffda4000, 0xffe74000, \ + 0xfff34000, 0x00004000, 0x000d4000, 0x00194000, 0x00264000, \ + 0x00324000, 0x003f4000, 0x004b4000, 0x00584000, 0x00654000, \ + 0x00714000, 0x007e4000, 0x008a3fff, 0x00973fff, 0x00a33fff, \ + 0x00b03fff, 0x00bc3fff, 0x00c93fff, 0x00d63fff, 0x00e23ffe, \ + 0x00ef3ffe, 0x00fb3ffe, 0x01083ffe, 0x01143ffe, 0x01213ffd, \ + 0x012e3ffd, 0x013a3ffd, 0x01473ffd \ +} + +#define BWN_TAB_RETARD \ +{ \ + 0xdb93cb87, 0xd666cf64, 0xd1fdd358, 0xcda6d826, 0xca38dd9f, \ + 0xc729e2b4, 0xc469e88e, 0xc26aee2b, 0xc0def46c, 0xc073fa62, \ + 0xc01d00d5, 0xc0760743, 0xc1560d1e, 0xc2e51369, 0xc4ed18ff, \ + 0xc7ac1ed7, 0xcb2823b2, 0xcefa28d9, 0xd2f62d3f, 0xd7bb3197, \ + 0xdce53568, 0xe1fe3875, 0xe7d13b35, 0xed663d35, 0xf39b3ec4, \ + 0xf98e3fa7, 0x00004000, 0x06723fa7, 0x0c653ec4, 0x129a3d35, \ + 0x182f3b35, 0x1e023875, 0x231b3568, 0x28453197, 0x2d0a2d3f, \ + 0x310628d9, 0x34d823b2, 0x38541ed7, 0x3b1318ff, 0x3d1b1369, \ + 0x3eaa0d1e, 0x3f8a0743, 0x3fe300d5, 0x3f8dfa62, 0x3f22f46c, \ + 0x3d96ee2b, 0x3b97e88e, 0x38d7e2b4, 0x35c8dd9f, 0x325ad826, \ + 0x2e03d358, 0x299acf64, 0x246dcb87, \ +} + +#define BWN_TAB_FINEFREQ_G \ +{ \ + 0x0089, 0x02e9, 0x0409, 0x04e9, 0x05a9, 0x0669, 0x0709, 0x0789, \ + 0x0829, 0x08a9, 0x0929, 0x0989, 0x0a09, 0x0a69, 0x0ac9, 0x0b29, \ + 0x0ba9, 0x0be9, 0x0c49, 0x0ca9, 0x0d09, 0x0d69, 0x0da9, 0x0e09, \ + 0x0e69, 0x0ea9, 0x0f09, 0x0f49, 0x0fa9, 0x0fe9, 0x1029, 0x1089, \ + 0x10c9, 0x1109, 0x1169, 0x11a9, 0x11e9, 0x1229, 0x1289, 0x12c9, \ + 0x1309, 0x1349, 0x1389, 0x13c9, 0x1409, 0x1449, 0x14a9, 0x14e9, \ + 0x1529, 0x1569, 0x15a9, 0x15e9, 0x1629, 0x1669, 0x16a9, 0x16e8, \ + 0x1728, 0x1768, 0x17a8, 0x17e8, 0x1828, 0x1868, 0x18a8, 0x18e8, \ + 0x1928, 0x1968, 0x19a8, 0x19e8, 0x1a28, 0x1a68, 0x1aa8, 0x1ae8, \ + 0x1b28, 0x1b68, 0x1ba8, 0x1be8, 0x1c28, 0x1c68, 0x1ca8, 0x1ce8, \ + 0x1d28, 0x1d68, 0x1dc8, 0x1e08, 0x1e48, 0x1e88, 0x1ec8, 0x1f08, \ + 0x1f48, 0x1f88, 0x1fe8, 0x2028, 0x2068, 0x20a8, 0x2108, 0x2148, \ + 0x2188, 0x21c8, 0x2228, 0x2268, 0x22c8, 0x2308, 0x2348, 0x23a8, \ + 0x23e8, 0x2448, 0x24a8, 0x24e8, 0x2548, 0x25a8, 0x2608, 0x2668, \ + 0x26c8, 0x2728, 0x2787, 0x27e7, 0x2847, 0x28c7, 0x2947, 0x29a7, \ + 0x2a27, 0x2ac7, 0x2b47, 0x2be7, 0x2ca7, 0x2d67, 0x2e47, 0x2f67, \ + 0x3247, 0x3526, 0x3646, 0x3726, 0x3806, 0x38a6, 0x3946, 0x39e6, \ + 0x3a66, 0x3ae6, 0x3b66, 0x3bc6, 0x3c45, 0x3ca5, 0x3d05, 0x3d85, \ + 0x3de5, 0x3e45, 0x3ea5, 0x3ee5, 0x3f45, 0x3fa5, 0x4005, 0x4045, \ + 0x40a5, 0x40e5, 0x4145, 0x4185, 0x41e5, 0x4225, 0x4265, 0x42c5, \ + 0x4305, 0x4345, 0x43a5, 0x43e5, 0x4424, 0x4464, 0x44c4, 0x4504, \ + 0x4544, 0x4584, 0x45c4, 0x4604, 0x4644, 0x46a4, 0x46e4, 0x4724, \ + 0x4764, 0x47a4, 0x47e4, 0x4824, 0x4864, 0x48a4, 0x48e4, 0x4924, \ + 0x4964, 0x49a4, 0x49e4, 0x4a24, 0x4a64, 0x4aa4, 0x4ae4, 0x4b23, \ + 0x4b63, 0x4ba3, 0x4be3, 0x4c23, 0x4c63, 0x4ca3, 0x4ce3, 0x4d23, \ + 0x4d63, 0x4da3, 0x4de3, 0x4e23, 0x4e63, 0x4ea3, 0x4ee3, 0x4f23, \ + 0x4f63, 0x4fc3, 0x5003, 0x5043, 0x5083, 0x50c3, 0x5103, 0x5143, \ + 0x5183, 0x51e2, 0x5222, 0x5262, 0x52a2, 0x52e2, 0x5342, 0x5382, \ + 0x53c2, 0x5402, 0x5462, 0x54a2, 0x5502, 0x5542, 0x55a2, 0x55e2, \ + 0x5642, 0x5682, 0x56e2, 0x5722, 0x5782, 0x57e1, 0x5841, 0x58a1, \ + 0x5901, 0x5961, 0x59c1, 0x5a21, 0x5aa1, 0x5b01, 0x5b81, 0x5be1, \ + 0x5c61, 0x5d01, 0x5d80, 0x5e20, 0x5ee0, 0x5fa0, 0x6080, 0x61c0, \ +} + +#define BWN_TAB_NOISE_G1 \ +{ \ + 0x013c, 0x01f5, 0x031a, 0x0631, 0x0001, 0x0001, 0x0001, 0x0001, \ +} + +#define BWN_TAB_NOISE_G2 \ +{ \ + 0x5484, 0x3c40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \ +} + +#define BWN_TAB_NOISESCALE_G1 \ +{ \ + 0x6c77, 0x5162, 0x3b40, 0x3335, 0x2f2d, 0x2a2a, 0x2527, 0x1f21, \ + 0x1a1d, 0x1719, 0x1616, 0x1414, 0x1414, 0x1400, 0x1414, 0x1614, \ + 0x1716, 0x1a19, 0x1f1d, 0x2521, 0x2a27, 0x2f2a, 0x332d, 0x3b35, \ + 0x5140, 0x6c62, 0x0077, \ +} + +#define BWN_TAB_NOISESCALE_G2 \ +{ \ + 0xd8dd, 0xcbd4, 0xbcc0, 0xb6b7, 0xb2b0, 0xadad, 0xa7a9, 0x9fa1, \ + 0x969b, 0x9195, 0x8f8f, 0x8a8a, 0x8a8a, 0x8a00, 0x8a8a, 0x8f8a, \ + 0x918f, 0x9695, 0x9f9b, 0xa7a1, 0xada9, 0xb2ad, 0xb6b0, 0xbcb7, \ + 0xcbc0, 0xd8d4, 0x00dd, \ +} + +#define BWN_TAB_NOISESCALE_G3 \ +{ \ + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, \ + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa400, 0xa4a4, 0xa4a4, \ + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, \ + 0xa4a4, 0xa4a4, 0x00a4, \ +} + +#define BWN_TAB_SIGMASQR2 \ +{ \ + 0x00de, 0x00dc, 0x00da, 0x00d8, 0x00d6, 0x00d4, 0x00d2, 0x00cf, \ + 0x00cd, 0x00ca, 0x00c7, 0x00c4, 0x00c1, 0x00be, 0x00be, 0x00be, \ + 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, \ + 0x00be, 0x00be, 0x0000, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, \ + 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, \ + 0x00c1, 0x00c4, 0x00c7, 0x00ca, 0x00cd, 0x00cf, 0x00d2, 0x00d4, \ + 0x00d6, 0x00d8, 0x00da, 0x00dc, 0x00de, \ +} + +#define BWN_PHY_G_TSSI2DBM_TABLE \ +{ \ + 77, 77, 77, 76, 76, 76, 75, 75, 74, 74, 73, 73, 73, 72, 72, 71, \ + 71, 70, 70, 69, 68, 68, 67, 67, 66, 65, 65, 64, 63, 63, 62, 61, \ + 60, 59, 58, 57, 56, 55, 54, 53, 52, 50, 49, 47, 45, 43, 40, 37, \ + 33, 28, 22, 14, 5, -7, -20, -20, -20, -20, -20, -20, -20, -20, \ + -20, -20 \ +} + +#define BWN_PHY_G_RF_CHANNELS \ +{ \ + 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 84, \ +} + +#define BWN_BITREV_TABLE \ +{ \ + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, \ + 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, \ + 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, \ + 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, \ + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, \ + 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, \ + 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, \ + 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, \ + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, \ + 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, 0xc6, \ + 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, \ + 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, \ + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, \ + 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, \ + 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, \ + 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, \ + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, \ + 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, \ + 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, \ + 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, \ + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, \ + 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, \ + 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, \ + 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, \ + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, \ + 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff \ +} + +/* + * LP PHY + */ + +#define BWN_TAB_TYPEMASK 0xf0000000 +#define BWN_TAB_GETTYPE(v) ((v) & BWN_TAB_TYPEMASK) +#define BWN_TAB_GETOFFSET(v) ((v) & ~BWN_TAB_TYPEMASK) +#define BWN_TAB_8BIT 0x10000000 +#define BWN_TAB_16BIT 0x20000000 +#define BWN_TAB_32BIT 0x30000000 +#define BWN_TAB_1(table, offset) \ + (((table) << 10) | (offset) | BWN_TAB_8BIT) +#define BWN_TAB_2(table, offset) \ + (((table) << 10) | (offset) | BWN_TAB_16BIT) +#define BWN_TAB_4(table, offset) \ + (((table) << 10) | (offset) | BWN_TAB_32BIT) + +#define BWN_LP_RADIO(radio_reg) (radio_reg) +#define BWN_LP_NORTH(radio_reg) BWN_LP_RADIO(radio_reg) +#define BWN_LP_SOUTH(radio_reg) BWN_LP_RADIO((radio_reg) | 0x4000) + +#define BWN_B2062_N_COM1 BWN_LP_NORTH(0x000) +#define BWN_B2062_N_COM2 BWN_LP_NORTH(0x002) +#define BWN_B2062_N_COM4 BWN_LP_NORTH(0x004) +#define BWN_B2062_N_PDNCTL0 BWN_LP_NORTH(0x010) +#define BWN_B2062_N_PDNCTL1 BWN_LP_NORTH(0x011) +#define BWN_B2062_N_PDNCTL3 BWN_LP_NORTH(0x013) +#define BWN_B2062_N_PDNCTL4 BWN_LP_NORTH(0x014) +#define BWN_B2062_N_LGENC BWN_LP_NORTH(0x017) +#define BWN_B2062_N_LGENATUNE0 BWN_LP_NORTH(0x01E) +#define BWN_B2062_N_LGENATUNE2 BWN_LP_NORTH(0x020) +#define BWN_B2062_N_LGENATUNE3 BWN_LP_NORTH(0x021) +#define BWN_B2062_N_LGENACTL3 BWN_LP_NORTH(0x022) +#define BWN_B2062_N_LGENACTL5 BWN_LP_NORTH(0x024) +#define BWN_B2062_N_LGENACTL6 BWN_LP_NORTH(0x025) +#define BWN_B2062_N_LGENACTL7 BWN_LP_NORTH(0x026) +#define BWN_B2062_N_RXA_CTL1 BWN_LP_NORTH(0x028) +#define BWN_B2062_N_RXBB_CTL0 BWN_LP_NORTH(0x02F) +#define BWN_B2062_N_RXBB_GAIN1 BWN_LP_NORTH(0x033) +#define BWN_B2062_N_RXBB_GAIN2 BWN_LP_NORTH(0x034) +#define BWN_B2062_N_RXBB_CALIB2 BWN_LP_NORTH(0x03A) +#define BWN_B2062_N_TXCTL3 BWN_LP_NORTH(0x048) +#define BWN_B2062_N_TXCTL4 BWN_LP_NORTH(0x049) +#define BWN_B2062_N_TXCTL5 BWN_LP_NORTH(0x04A) +#define BWN_B2062_N_TXCTL6 BWN_LP_NORTH(0x04B) +#define BWN_B2062_N_TXCTL_A BWN_LP_NORTH(0x04F) +#define BWN_B2062_N_TX_TUNE BWN_LP_NORTH(0x052) +#define BWN_B2062_N_TX_PAD BWN_LP_NORTH(0x053) +#define BWN_B2062_N_TX_PGA BWN_LP_NORTH(0x054) +#define BWN_B2062_N_TSSI_CTL0 BWN_LP_NORTH(0x057) +#define BWN_B2062_N_CALIB_TS BWN_LP_NORTH(0x05D) +#define BWN_B2062_S_COM4 BWN_LP_SOUTH(0x004) +#define BWN_B2062_S_PDS_CTL0 BWN_LP_SOUTH(0x010) +#define BWN_B2062_S_BG_CTL1 BWN_LP_SOUTH(0x015) +#define BWN_B2062_S_LGENG_CTL0 BWN_LP_SOUTH(0x017) +#define BWN_B2062_S_LGENG_CTL1 BWN_LP_SOUTH(0x018) +#define BWN_B2062_S_LGENG_CTL8 BWN_LP_SOUTH(0x01F) +#define BWN_B2062_S_LGENG_CTL10 BWN_LP_SOUTH(0x021) +#define BWN_B2062_S_RFPLLCTL0 BWN_LP_SOUTH(0x034) +#define BWN_B2062_S_RFPLLCTL1 BWN_LP_SOUTH(0x035) +#define BWN_B2062_S_RFPLLCTL2 BWN_LP_SOUTH(0x036) +#define BWN_B2062_S_RFPLLCTL3 BWN_LP_SOUTH(0x037) +#define BWN_B2062_S_RFPLLCTL5 BWN_LP_SOUTH(0x039) +#define BWN_B2062_S_RFPLLCTL6 BWN_LP_SOUTH(0x03A) +#define BWN_B2062_S_RFPLLCTL7 BWN_LP_SOUTH(0x03B) +#define BWN_B2062_S_RFPLLCTL8 BWN_LP_SOUTH(0x03C) +#define BWN_B2062_S_RFPLLCTL9 BWN_LP_SOUTH(0x03D) +#define BWN_B2062_S_RFPLLCTL10 BWN_LP_SOUTH(0x03E) +#define BWN_B2062_S_RFPLLCTL11 BWN_LP_SOUTH(0x03F) +#define BWN_B2062_S_RFPLLCTL12 BWN_LP_SOUTH(0x040) +#define BWN_B2062_S_RFPLLCTL13 BWN_LP_SOUTH(0x041) +#define BWN_B2062_S_RFPLLCTL14 BWN_LP_SOUTH(0x042) +#define BWN_B2062_S_RFPLLCTL18 BWN_LP_SOUTH(0x046) +#define BWN_B2062_S_RFPLLCTL19 BWN_LP_SOUTH(0x047) +#define BWN_B2062_S_RFPLLCTL21 BWN_LP_SOUTH(0x049) +#define BWN_B2062_S_RFPLLCTL22 BWN_LP_SOUTH(0x04A) +#define BWN_B2062_S_RFPLLCTL23 BWN_LP_SOUTH(0x04B) +#define BWN_B2062_S_RFPLLCTL24 BWN_LP_SOUTH(0x04C) +#define BWN_B2062_S_RFPLLCTL25 BWN_LP_SOUTH(0x04D) +#define BWN_B2062_S_RFPLLCTL26 BWN_LP_SOUTH(0x04E) +#define BWN_B2062_S_RFPLLCTL27 BWN_LP_SOUTH(0x04F) +#define BWN_B2062_S_RFPLLCTL28 BWN_LP_SOUTH(0x050) +#define BWN_B2062_S_RFPLLCTL29 BWN_LP_SOUTH(0x051) +#define BWN_B2062_S_RFPLLCTL30 BWN_LP_SOUTH(0x052) +#define BWN_B2062_S_RFPLLCTL31 BWN_LP_SOUTH(0x053) +#define BWN_B2062_S_RFPLLCTL33 BWN_LP_SOUTH(0x055) +#define BWN_B2062_S_RFPLLCTL34 BWN_LP_SOUTH(0x056) +#define BWN_B2062_S_RXG_CNT8 BWN_LP_SOUTH(0x05F) +#define BWN_B2062_S_RXG_CNT16 BWN_LP_SOUTH(0x067) +#define BWN_B2063_COM1 BWN_LP_RADIO(0x000) +#define BWN_B2063_COM8 BWN_LP_RADIO(0x008) +#define BWN_B2063_COM10 BWN_LP_RADIO(0x00A) +#define BWN_B2063_COM15 BWN_LP_RADIO(0x00F) +#define BWN_B2063_COM16 BWN_LP_RADIO(0x010) +#define BWN_B2063_COM17 BWN_LP_RADIO(0x011) +#define BWN_B2063_COM18 BWN_LP_RADIO(0x012) +#define BWN_B2063_COM19 BWN_LP_RADIO(0x013) +#define BWN_B2063_COM20 BWN_LP_RADIO(0x014) +#define BWN_B2063_COM21 BWN_LP_RADIO(0x015) +#define BWN_B2063_COM22 BWN_LP_RADIO(0x016) +#define BWN_B2063_COM23 BWN_LP_RADIO(0x017) +#define BWN_B2063_COM24 BWN_LP_RADIO(0x018) +#define BWN_B2063_PLL_SP1 BWN_LP_RADIO(0x01A) +#define BWN_B2063_PLL_SP2 BWN_LP_RADIO(0x01B) +#define BWN_B2063_LOGEN_SP1 BWN_LP_RADIO(0x01C) +#define BWN_B2063_LOGEN_SP2 BWN_LP_RADIO(0x01D) +#define BWN_B2063_LOGEN_SP4 BWN_LP_RADIO(0x01F) +#define BWN_B2063_LOGEN_SP5 BWN_LP_RADIO(0x020) +#define BWN_B2063_G_RX_SP1 BWN_LP_RADIO(0x021) +#define BWN_B2063_G_RX_SP2 BWN_LP_RADIO(0x022) +#define BWN_B2063_G_RX_SP3 BWN_LP_RADIO(0x023) +#define BWN_B2063_G_RX_SP7 BWN_LP_RADIO(0x027) +#define BWN_B2063_G_RX_SP10 BWN_LP_RADIO(0x02A) +#define BWN_B2063_A_RX_SP1 BWN_LP_RADIO(0x02C) +#define BWN_B2063_A_RX_SP2 BWN_LP_RADIO(0x02D) +#define BWN_B2063_A_RX_SP7 BWN_LP_RADIO(0x032) +#define BWN_B2063_RX_BB_SP3 BWN_LP_RADIO(0x035) +#define BWN_B2063_RX_BB_SP4 BWN_LP_RADIO(0x036) +#define BWN_B2063_RX_BB_SP8 BWN_LP_RADIO(0x03A) +#define BWN_B2063_TX_RF_SP3 BWN_LP_RADIO(0x03D) +#define BWN_B2063_TX_RF_SP4 BWN_LP_RADIO(0x03E) +#define BWN_B2063_TX_RF_SP6 BWN_LP_RADIO(0x040) +#define BWN_B2063_TX_RF_SP9 BWN_LP_RADIO(0x043) +#define BWN_B2063_PA_SP1 BWN_LP_RADIO(0x04C) +#define BWN_B2063_PA_SP2 BWN_LP_RADIO(0x04D) +#define BWN_B2063_PA_SP3 BWN_LP_RADIO(0x04E) +#define BWN_B2063_PA_SP4 BWN_LP_RADIO(0x04F) +#define BWN_B2063_PA_SP7 BWN_LP_RADIO(0x052) +#define BWN_B2063_TX_BB_SP1 BWN_LP_RADIO(0x053) +#define BWN_B2063_TX_BB_SP3 BWN_LP_RADIO(0x055) +#define BWN_B2063_REG_SP1 BWN_LP_RADIO(0x056) +#define BWN_B2063_BANDGAP_CTL1 BWN_LP_RADIO(0x057) +#define BWN_B2063_RC_CALIB_CTL1 BWN_LP_RADIO(0x05A) +#define BWN_B2063_RC_CALIB_CTL2 BWN_LP_RADIO(0x05B) +#define BWN_B2063_RC_CALIB_CTL3 BWN_LP_RADIO(0x05C) +#define BWN_B2063_RC_CALIB_CTL4 BWN_LP_RADIO(0x05D) +#define BWN_B2063_RC_CALIB_CTL5 BWN_LP_RADIO(0x05E) +#define BWN_B2063_RC_CALIB_CTL6 BWN_LP_RADIO(0x05F) +#define BWN_B2063_JTAG_CALNRST BWN_LP_RADIO(0x064) +#define BWN_B2063_JTAG_CP2 BWN_LP_RADIO(0x068) +#define BWN_B2063_JTAG_CP3 BWN_LP_RADIO(0x069) +#define BWN_B2063_JTAG_LF1 BWN_LP_RADIO(0x06C) +#define BWN_B2063_JTAG_LF2 BWN_LP_RADIO(0x06D) +#define BWN_B2063_JTAG_LF3 BWN_LP_RADIO(0x06E) +#define BWN_B2063_JTAG_LF4 BWN_LP_RADIO(0x06F) +#define BWN_B2063_JTAG_SG1 BWN_LP_RADIO(0x070) +#define BWN_B2063_JTAG_SG2 BWN_LP_RADIO(0x071) +#define BWN_B2063_JTAG_SG3 BWN_LP_RADIO(0x072) +#define BWN_B2063_JTAG_SG4 BWN_LP_RADIO(0x073) +#define BWN_B2063_JTAG_VCO1 BWN_LP_RADIO(0x075) +#define BWN_B2063_JTAG_VCO2 BWN_LP_RADIO(0x076) +#define BWN_B2063_JTAG_VCO_CALIB3 BWN_LP_RADIO(0x079) +#define BWN_B2063_JTAG_VCO_CALIB5 BWN_LP_RADIO(0x07B) +#define BWN_B2063_JTAG_VCO_CALIB6 BWN_LP_RADIO(0x07C) +#define BWN_B2063_JTAG_VCO_CALIB7 BWN_LP_RADIO(0x07D) +#define BWN_B2063_JTAG_VCO_CALIB8 BWN_LP_RADIO(0x07E) +#define BWN_B2063_JTAG_XTAL_12 BWN_LP_RADIO(0x081) +#define BWN_B2063_LOGEN_RCCR1 BWN_LP_RADIO(0x0A1) +#define BWN_B2063_LOGEN_VCOBUF1 BWN_LP_RADIO(0x0A2) +#define BWN_B2063_LOGEN_MIXER2 BWN_LP_RADIO(0x0A4) +#define BWN_B2063_LOGEN_BUF2 BWN_LP_RADIO(0x0A6) +#define BWN_B2063_G_RX_MIX3 BWN_LP_RADIO(0x0C4) +#define BWN_B2063_G_RX_MIX4 BWN_LP_RADIO(0x0C5) +#define BWN_B2063_A_RX_1ST2 BWN_LP_RADIO(0x0CF) +#define BWN_B2063_A_RX_1ST3 BWN_LP_RADIO(0x0D0) +#define BWN_B2063_A_RX_2ND1 BWN_LP_RADIO(0x0D3) +#define BWN_B2063_A_RX_2ND4 BWN_LP_RADIO(0x0D6) +#define BWN_B2063_A_RX_2ND7 BWN_LP_RADIO(0x0D9) +#define BWN_B2063_A_RX_PS6 BWN_LP_RADIO(0x0DF) +#define BWN_B2063_A_RX_MIX4 BWN_LP_RADIO(0x0E3) +#define BWN_B2063_A_RX_MIX5 BWN_LP_RADIO(0x0E4) +#define BWN_B2063_A_RX_MIX6 BWN_LP_RADIO(0x0E5) +#define BWN_B2063_RX_TIA_CTL1 BWN_LP_RADIO(0x0EC) +#define BWN_B2063_RX_TIA_CTL3 BWN_LP_RADIO(0x0EE) +#define BWN_B2063_RX_BB_CTL2 BWN_LP_RADIO(0x0F3) +#define BWN_B2063_TX_RF_CTL2 BWN_LP_RADIO(0x100) +#define BWN_B2063_TX_RF_CTL5 BWN_LP_RADIO(0x103) +#define BWN_B2063_PA_CTL1 BWN_LP_RADIO(0x10B) +#define BWN_B2063_PA_CTL11 BWN_LP_RADIO(0x115) +#define BWN_B2063_VREG_CTL1 BWN_LP_RADIO(0x11D) + +#endif /* !_IF_BWNREG_H */ diff --git a/sys/dev/bwn/if_bwnvar.h b/sys/dev/bwn/if_bwnvar.h new file mode 100644 index 000000000000..61598c2f390d --- /dev/null +++ b/sys/dev/bwn/if_bwnvar.h @@ -0,0 +1,959 @@ +/*- + * Copyright (c) 2009-2010 Weongyo Jeong + * 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, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * 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. + * + * $FreeBSD$ + */ + +#ifndef _IF_BWNVAR_H +#define _IF_BWNVAR_H + +struct siba_dev_softc; +struct bwn_softc; +struct bwn_mac; + +#define N(a) (sizeof(a) / sizeof(a[0])) +#define BWN_ALIGN 0x1000 +#define BWN_BUS_SPACE_MAXADDR_30BIT 0x3fffffff +#define BWN_RETRY_SHORT 7 +#define BWN_RETRY_LONG 4 +#define BWN_STAID_MAX 64 +#define BWN_TXPWR_IGNORE_TIME (1 << 0) +#define BWN_TXPWR_IGNORE_TSSI (1 << 1) +#define BWN_HAS_TXMAG(phy) \ + (((phy)->rev >= 2) && ((phy)->rf_ver == 0x2050) && \ + ((phy)->rf_rev == 8)) +#define BWN_HAS_LOOPBACK(phy) \ + (((phy)->rev > 1) || ((phy)->gmode)) +#define BWN_TXERROR_MAX 1000 +#define BWN_GETTIME(v) do { \ + struct timespec ts; \ + nanouptime(&ts); \ + (v) = ts.tv_nsec / 1000000 + ts.tv_sec * 1000; \ +} while (0) +#define BWN_ISOLDFMT(mac) ((mac)->mac_fw.rev <= 351) +#define BWN_TSSI2DBM(num, den) \ + ((int32_t)((num < 0) ? num / den : (num + den / 2) / den)) +#define BWN_HDRSIZE(mac) \ + ((BWN_ISOLDFMT(mac)) ? (100 + sizeof(struct bwn_plcp6)) : \ + (104 + sizeof(struct bwn_plcp6))) +#define BWN_PIO_COOKIE(tq, tp) \ + ((uint16_t)((((uint16_t)tq->tq_index + 1) << 12) | tp->tp_index)) +#define BWN_DMA_COOKIE(dr, slot) \ + ((uint16_t)(((uint16_t)dr->dr_index + 1) << 12) | (uint16_t)slot) +#define BWN_READ_2(mac, o) (siba_read_2(mac->mac_sd, o)) +#define BWN_READ_4(mac, o) (siba_read_4(mac->mac_sd, o)) +#define BWN_WRITE_2(mac, o, v) (siba_write_2(mac->mac_sd, o, v)) +#define BWN_WRITE_4(mac, o, v) (siba_write_4(mac->mac_sd, o, v)) +#define BWN_PIO_TXQOFFSET(mac) \ + ((mac->mac_sd->sd_id.sd_rev >= 11) ? 0x18 : 0) +#define BWN_PIO_RXQOFFSET(mac) \ + ((mac->mac_sd->sd_id.sd_rev >= 11) ? 0x38 : 8) +#define BWN_SEC_NEWAPI(mac) (mac->mac_fw.rev >= 351) +#define BWN_SEC_KEY2FW(mac, idx) \ + (BWN_SEC_NEWAPI(mac) ? idx : ((idx >= 4) ? idx - 4 : idx)) +#define BWN_RF_READ(mac, r) (mac->mac_phy.rf_read(mac, r)) +#define BWN_RF_WRITE(mac, r, v) (mac->mac_phy.rf_write(mac, r, v)) +#define BWN_RF_MASK(mac, o, m) \ + BWN_RF_WRITE(mac, o, BWN_RF_READ(mac, o) & m) +#define BWN_RF_SETMASK(mac, offset, mask, set) \ + BWN_RF_WRITE(mac, offset, (BWN_RF_READ(mac, offset) & mask) | set) +#define BWN_RF_SET(mac, offset, set) \ + BWN_RF_WRITE(mac, offset, BWN_RF_READ(mac, offset) | set) +#define BWN_PHY_READ(mac, r) (mac->mac_phy.phy_read(mac, r)) +#define BWN_PHY_WRITE(mac, r, v) \ + (mac->mac_phy.phy_write(mac, r, v)) +#define BWN_PHY_SET(mac, offset, set) do { \ + if (mac->mac_phy.phy_maskset != NULL) { \ + KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \ + mac->mac_suspended > 0, \ + ("dont access PHY or RF registers after turning on MAC")); \ + mac->mac_phy.phy_maskset(mac, offset, 0xffff, set); \ + } else \ + BWN_PHY_WRITE(mac, offset, \ + BWN_PHY_READ(mac, offset) | (set)); \ +} while (0) +#define BWN_PHY_SETMASK(mac, offset, mask, set) do { \ + if (mac->mac_phy.phy_maskset != NULL) { \ + KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \ + mac->mac_suspended > 0, \ + ("dont access PHY or RF registers after turning on MAC")); \ + mac->mac_phy.phy_maskset(mac, offset, mask, set); \ + } else \ + BWN_PHY_WRITE(mac, offset, \ + (BWN_PHY_READ(mac, offset) & (mask)) | (set)); \ +} while (0) +#define BWN_PHY_MASK(mac, offset, mask) do { \ + if (mac->mac_phy.phy_maskset != NULL) { \ + KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \ + mac->mac_suspended > 0, \ + ("dont access PHY or RF registers after turning on MAC")); \ + mac->mac_phy.phy_maskset(mac, offset, mask, 0); \ + } else \ + BWN_PHY_WRITE(mac, offset, \ + BWN_PHY_READ(mac, offset) & mask); \ +} while (0) +#define BWN_PHY_COPY(mac, dst, src) do { \ + KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED || \ + mac->mac_suspended > 0, \ + ("dont access PHY or RF registers after turning on MAC")); \ + BWN_PHY_WRITE(mac, dst, BWN_PHY_READ(mac, src)); \ +} while (0) +#define BWN_LO_CALIB_EXPIRE (1000 * (30 - 2)) +#define BWN_LO_PWRVEC_EXPIRE (1000 * (30 - 2)) +#define BWN_LO_TXCTL_EXPIRE (1000 * (180 - 4)) +#define BWN_DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) +#define BWN_LPD(L, P, D) (((L) << 2) | ((P) << 1) | ((D) << 0)) +#define BWN_BITREV4(tmp) (BWN_BITREV8(tmp) >> 4) +#define BWN_BITREV8(byte) (bwn_bitrev_table[byte]) +#define BWN_BBATTCMP(a, b) ((a)->att == (b)->att) +#define BWN_RFATTCMP(a, b) \ + (((a)->att == (b)->att) && ((a)->padmix == (b)->padmix)) +#define BWN_PIO_WRITE_2(mac, tq, offset, value) \ + BWN_WRITE_2(mac, (tq)->tq_base + offset, value) +#define BWN_PIO_READ_4(mac, tq, offset) \ + BWN_READ_4(mac, tq->tq_base + offset) +#define BWN_ISCCKRATE(rate) \ + (rate == BWN_CCK_RATE_1MB || rate == BWN_CCK_RATE_2MB || \ + rate == BWN_CCK_RATE_5MB || rate == BWN_CCK_RATE_11MB) +#define BWN_ISOFDMRATE(rate) (!BWN_ISCCKRATE(rate)) +#define BWN_BARRIER(mac, flags) siba_barrier(mac->mac_sd, flags) +#define BWN_DMA_READ(dr, offset) \ + (BWN_READ_4(dr->dr_mac, dr->dr_base + offset)) +#define BWN_DMA_WRITE(dr, offset, value) \ + (BWN_WRITE_4(dr->dr_mac, dr->dr_base + offset, value)) + +struct bwn_rate { + uint16_t rateid; + uint32_t flags; +}; + +#define BWN_ANT0 0 +#define BWN_ANT1 1 +#define BWN_ANTAUTO0 2 +#define BWN_ANTAUTO1 3 +#define BWN_ANT2 4 +#define BWN_ANT3 8 +#define BWN_ANTAUTO BWN_ANTAUTO0 +#define BWN_ANT_DEFAULT BWN_ANTAUTO +#define BWN_TX_SLOTS_PER_FRAME 2 + +struct bwn_channel { + unsigned freq; + unsigned ieee; + unsigned maxTxPow; +}; + +struct bwn_channelinfo { + struct bwn_channel channels[IEEE80211_CHAN_MAX]; + unsigned nchannels; +}; + +struct bwn_bbatt { + uint8_t att; +}; + +struct bwn_bbatt_list { + const struct bwn_bbatt *array; + uint8_t len; + uint8_t min; + uint8_t max; +}; + +struct bwn_rfatt { + uint8_t att; + int padmix; +}; + +struct bwn_rfatt_list { + const struct bwn_rfatt *array; + uint8_t len; + uint8_t min; + uint8_t max; +}; + +#define BWN_DC_LT_SIZE 32 + +struct bwn_loctl { + int8_t i; + int8_t q; +}; + +struct bwn_lo_calib { + struct bwn_bbatt bbatt; + struct bwn_rfatt rfatt; + struct bwn_loctl ctl; + unsigned long calib_time; + TAILQ_ENTRY(bwn_lo_calib) list; +}; + +struct bwn_rxhdr4 { + uint16_t frame_len; + uint8_t pad1[2]; + uint16_t phy_status0; + union { + struct { + uint8_t rssi; + uint8_t sig_qual; + } __packed abg; + struct { + int8_t power0; + int8_t power1; + } __packed n; + } __packed phy; + uint16_t phy_status2; + uint16_t phy_status3; + uint32_t mac_status; + uint16_t mac_time; + uint16_t channel; +} __packed; + +struct bwn_txstatus { + uint16_t cookie; + uint16_t seq; + uint8_t phy_stat; + uint8_t framecnt; + uint8_t rtscnt; + uint8_t sreason; + uint8_t pm; + uint8_t im; + uint8_t ampdu; + uint8_t ack; +}; + +#define BWN_TXCTL_PA3DB 0x40 +#define BWN_TXCTL_PA2DB 0x20 +#define BWN_TXCTL_TXMIX 0x10 + +struct bwn_txpwr_loctl { + struct bwn_rfatt_list rfatt; + struct bwn_bbatt_list bbatt; + uint16_t dc_lt[BWN_DC_LT_SIZE]; + TAILQ_HEAD(, bwn_lo_calib) calib_list; + unsigned long pwr_vec_read_time; + unsigned long txctl_measured_time; + uint8_t tx_bias; + uint8_t tx_magn; + uint64_t power_vector; +}; + +#define BWN_OFDMTAB_DIR_UNKNOWN 0 +#define BWN_OFDMTAB_DIR_READ 1 +#define BWN_OFDMTAB_DIR_WRITE 2 + +struct bwn_phy_g { + unsigned pg_flags; +#define BWN_PHY_G_FLAG_TSSITABLE_ALLOC (1 << 0) +#define BWN_PHY_G_FLAG_RADIOCTX_VALID (1 << 1) + int pg_aci_enable; + int pg_aci_wlan_automatic; + int pg_aci_hw_rssi; + int pg_rf_on; + uint16_t pg_radioctx_over; + uint16_t pg_radioctx_overval; + uint16_t pg_minlowsig[2]; + uint16_t pg_minlowsigpos[2]; + int8_t *pg_tssi2dbm; + int pg_idletssi; + int pg_curtssi; + uint8_t pg_avgtssi; + struct bwn_bbatt pg_bbatt; + struct bwn_rfatt pg_rfatt; + uint8_t pg_txctl; + int pg_bbatt_delta; + int pg_rfatt_delta; + + struct bwn_txpwr_loctl pg_loctl; + int16_t pg_max_lb_gain; + int16_t pg_trsw_rx_gain; + int16_t pg_lna_lod_gain; + int16_t pg_lna_gain; + int16_t pg_pga_gain; + int pg_immode; +#define BWN_INTERFSTACK_SIZE 26 + uint32_t pg_interfstack[BWN_INTERFSTACK_SIZE]; + + int16_t pg_nrssi[2]; + int32_t pg_nrssi_slope; + int8_t pg_nrssi_lt[64]; + + uint16_t pg_lofcal; + + uint16_t pg_initval; + uint16_t pg_ofdmtab_addr; + unsigned pg_ofdmtab_dir; +}; + +#define BWN_IMMODE_NONE 0 +#define BWN_IMMODE_NONWLAN 1 +#define BWN_IMMODE_MANUAL 2 +#define BWN_IMMODE_AUTO 3 +#define BWN_TXPWR_RES_NEED_ADJUST 0 +#define BWN_TXPWR_RES_DONE 1 + +#define BWN_PHYLP_TXPCTL_UNKNOWN 0 +#define BWN_PHYLP_TXPCTL_OFF 1 +#define BWN_PHYLP_TXPCTL_ON_SW 2 +#define BWN_PHYLP_TXPCTL_ON_HW 3 + +struct bwn_phy_lp { + uint8_t plp_chan; + uint8_t plp_chanfullcal; + int32_t plp_antenna; + uint8_t plp_txpctlmode; + uint8_t plp_txisoband_h; + uint8_t plp_txisoband_m; + uint8_t plp_txisoband_l; + uint8_t plp_rxpwroffset; + int8_t plp_txpwridx; + uint16_t plp_tssiidx; + uint16_t plp_tssinpt; + uint8_t plp_rssivf; + uint8_t plp_rssivc; + uint8_t plp_rssigs; + uint8_t plp_rccap; + uint8_t plp_bxarch; + uint8_t plp_crsusr_off; + uint8_t plp_crssys_off; + uint32_t plp_div; + int32_t plp_tonefreq; + uint16_t plp_digfilt[9]; +}; + +/* for LP */ +struct bwn_txgain { + uint16_t tg_gm; + uint16_t tg_pga; + uint16_t tg_pad; + uint16_t tg_dac; +}; + +struct bwn_rxcompco { + uint8_t rc_chan; + int8_t rc_c1; + int8_t rc_c0; +}; + +struct bwn_phy_lp_iq_est { + uint32_t ie_iqprod; + uint32_t ie_ipwr; + uint32_t ie_qpwr; +}; + +struct bwn_txgain_entry { + uint8_t te_gm; + uint8_t te_pga; + uint8_t te_pad; + uint8_t te_dac; + uint8_t te_bbmult; +}; + +/* only for LP PHY */ +struct bwn_stxtable { + uint16_t st_phyoffset; + uint16_t st_physhift; + uint16_t st_rfaddr; + uint16_t st_rfshift; + uint16_t st_mask; +}; + +struct bwn_b206x_chan { + uint8_t bc_chan; + uint16_t bc_freq; + const uint8_t *bc_data; +}; + +struct bwn_b206x_rfinit_entry { + uint16_t br_offset; + uint16_t br_valuea; + uint16_t br_valueg; + uint8_t br_flags; +}; + +struct bwn_phy { + uint8_t type; + uint8_t rev; + uint8_t analog; + + int supports_2ghz; + int supports_5ghz; + + int gmode; + struct bwn_phy_g phy_g; + struct bwn_phy_lp phy_lp; + + uint16_t rf_manuf; + uint16_t rf_ver; + uint8_t rf_rev; + int rf_on; + + int txpower; + int hwpctl; + unsigned long nexttime; + unsigned int chan; + int txerrors; + + int (*attach)(struct bwn_mac *); + void (*detach)(struct bwn_mac *); + int (*prepare_hw)(struct bwn_mac *); + void (*init_pre)(struct bwn_mac *); + int (*init)(struct bwn_mac *); + void (*exit)(struct bwn_mac *); + uint16_t (*phy_read)(struct bwn_mac *, uint16_t); + void (*phy_write)(struct bwn_mac *, uint16_t, + uint16_t); + void (*phy_maskset)(struct bwn_mac *, + uint16_t, uint16_t, uint16_t); + uint16_t (*rf_read)(struct bwn_mac *, uint16_t); + void (*rf_write)(struct bwn_mac *, uint16_t, + uint16_t); + int (*use_hwpctl)(struct bwn_mac *); + void (*rf_onoff)(struct bwn_mac *, int); + void (*switch_analog)(struct bwn_mac *, int); + int (*switch_channel)(struct bwn_mac *, + unsigned int); + uint32_t (*get_default_chan)(struct bwn_mac *); + void (*set_antenna)(struct bwn_mac *, int); + int (*set_im)(struct bwn_mac *, int); + int (*recalc_txpwr)(struct bwn_mac *, int); + void (*set_txpwr)(struct bwn_mac *); + void (*task_15s)(struct bwn_mac *); + void (*task_60s)(struct bwn_mac *); +}; + +struct bwn_chan_band { + uint32_t flags; + uint8_t nchan; +#define BWN_MAX_CHAN_PER_BAND 14 + uint8_t chan[BWN_MAX_CHAN_PER_BAND]; +}; + +#define BWN_NR_WMEPARAMS 16 +enum { + BWN_WMEPARAM_TXOP = 0, + BWN_WMEPARAM_CWMIN, + BWN_WMEPARAM_CWMAX, + BWN_WMEPARAM_CWCUR, + BWN_WMEPARAM_AIFS, + BWN_WMEPARAM_BSLOTS, + BWN_WMEPARAM_REGGAP, + BWN_WMEPARAM_STATUS, +}; + +#define BWN_WME_PARAMS(queue) \ + (BWN_SHARED_EDCFQ + (BWN_NR_WMEPARAMS * sizeof(uint16_t) * (queue))) +#define BWN_WME_BACKGROUND BWN_WME_PARAMS(0) +#define BWN_WME_BESTEFFORT BWN_WME_PARAMS(1) +#define BWN_WME_VIDEO BWN_WME_PARAMS(2) +#define BWN_WME_VOICE BWN_WME_PARAMS(3) + +/* + * Radio capture format. + */ +#define BWN_RX_RADIOTAP_PRESENT ( \ + (1 << IEEE80211_RADIOTAP_TSFT) | \ + (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_CHANNEL) | \ + (1 << IEEE80211_RADIOTAP_ANTENNA) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ + 0) + +struct bwn_rx_radiotap_header { + struct ieee80211_radiotap_header wr_ihdr; + uint64_t wr_tsf; + u_int8_t wr_flags; + u_int8_t wr_rate; + u_int16_t wr_chan_freq; + u_int16_t wr_chan_flags; + int8_t wr_antsignal; + int8_t wr_antnoise; + u_int8_t wr_antenna; +}; + +#define BWN_TX_RADIOTAP_PRESENT ( \ + (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_CHANNEL) | \ + (1 << IEEE80211_RADIOTAP_DBM_TX_POWER) | \ + (1 << IEEE80211_RADIOTAP_ANTENNA) | \ + 0) + +struct bwn_tx_radiotap_header { + struct ieee80211_radiotap_header wt_ihdr; + u_int8_t wt_flags; + u_int8_t wt_rate; + u_int16_t wt_chan_freq; + u_int16_t wt_chan_flags; + u_int8_t wt_txpower; + u_int8_t wt_antenna; +}; + +struct bwn_stats { + int32_t rtsfail; + int32_t rts; + int32_t link_noise; +}; + +/* Noise Calculation (Link Quality) */ +struct bwn_noise { + uint8_t noi_running; + uint8_t noi_nsamples; + int8_t noi_samples[8][4]; +}; + +#define BWN_DMA_30BIT 30 +#define BWN_DMA_32BIT 32 +#define BWN_DMA_64BIT 64 + +struct bwn_dmadesc_meta { + bus_dmamap_t mt_dmap; + bus_addr_t mt_paddr; + struct mbuf *mt_m; + struct ieee80211_node *mt_ni; + uint8_t mt_txtype; +#define BWN_DMADESC_METATYPE_HEADER 0 +#define BWN_DMADESC_METATYPE_BODY 1 + uint8_t mt_islast; +}; + +#define BWN_DMAINTR_FATALMASK \ + ((1 << 10) | (1 << 11) | (1 << 12) | (1 << 14) | (1 << 15)) +#define BWN_DMAINTR_NONFATALMASK (1 << 13) +#define BWN_DMAINTR_RX_DONE (1 << 16) + +#define BWN_DMA32_DCTL_BYTECNT 0x00001fff +#define BWN_DMA32_DCTL_ADDREXT_MASK 0x00030000 +#define BWN_DMA32_DCTL_ADDREXT_SHIFT 16 +#define BWN_DMA32_DCTL_DTABLEEND 0x10000000 +#define BWN_DMA32_DCTL_IRQ 0x20000000 +#define BWN_DMA32_DCTL_FRAMEEND 0x40000000 +#define BWN_DMA32_DCTL_FRAMESTART 0x80000000 +struct bwn_dmadesc32 { + uint32_t control; + uint32_t address; +} __packed; + +#define BWN_DMA64_DCTL0_DTABLEEND 0x10000000 +#define BWN_DMA64_DCTL0_IRQ 0x20000000 +#define BWN_DMA64_DCTL0_FRAMEEND 0x40000000 +#define BWN_DMA64_DCTL0_FRAMESTART 0x80000000 +#define BWN_DMA64_DCTL1_BYTECNT 0x00001fff +#define BWN_DMA64_DCTL1_ADDREXT_MASK 0x00030000 +#define BWN_DMA64_DCTL1_ADDREXT_SHIFT 16 +struct bwn_dmadesc64 { + uint32_t control0; + uint32_t control1; + uint32_t address_low; + uint32_t address_high; +} __packed; + +struct bwn_dmadesc_generic { + union { + struct bwn_dmadesc32 dma32; + struct bwn_dmadesc64 dma64; + } __packed dma; +} __packed; + +struct bwn_dma_ring; + +struct bwn_dma_ring { + struct bwn_mac *dr_mac; + const struct bwn_dma_ops *dr_ops; + struct bwn_dmadesc_meta *dr_meta; + void *dr_txhdr_cache; + bus_dma_tag_t dr_ring_dtag; + bus_dma_tag_t dr_txring_dtag; + bus_dmamap_t dr_spare_dmap; /* only for RX */ + bus_dmamap_t dr_ring_dmap; + bus_addr_t dr_txring_paddr; + void *dr_ring_descbase; + bus_addr_t dr_ring_dmabase; + int dr_numslots; + int dr_usedslot; + int dr_curslot; + uint32_t dr_frameoffset; + uint16_t dr_rx_bufsize; + uint16_t dr_base; + int dr_index; + uint8_t dr_tx; + uint8_t dr_stop; + int dr_type; + + void (*getdesc)(struct bwn_dma_ring *, + int, struct bwn_dmadesc_generic **, + struct bwn_dmadesc_meta **); + void (*setdesc)(struct bwn_dma_ring *, + struct bwn_dmadesc_generic *, + bus_addr_t, uint16_t, int, int, + int); + void (*start_transfer)(struct bwn_dma_ring *, + int); + void (*suspend)(struct bwn_dma_ring *); + void (*resume)(struct bwn_dma_ring *); + int (*get_curslot)(struct bwn_dma_ring *); + void (*set_curslot)(struct bwn_dma_ring *, + int); +}; + +struct bwn_dma { + int dmatype; + bus_dma_tag_t parent_dtag; + bus_dma_tag_t rxbuf_dtag; + bus_dma_tag_t txbuf_dtag; + + struct bwn_dma_ring *wme[5]; + struct bwn_dma_ring *mcast; + struct bwn_dma_ring *rx; + uint64_t lastseq; /* XXX FIXME */ +}; + +struct bwn_pio_rxqueue { + struct bwn_mac *prq_mac; + uint16_t prq_base; + uint8_t prq_rev; +}; + +struct bwn_pio_txqueue; +struct bwn_pio_txpkt { + struct bwn_pio_txqueue *tp_queue; + struct ieee80211_node *tp_ni; + struct mbuf *tp_m; + uint8_t tp_index; + TAILQ_ENTRY(bwn_pio_txpkt) tp_list; +}; + +#define BWN_PIO_MAX_TXPACKETS 32 +struct bwn_pio_txqueue { + uint16_t tq_base; + uint16_t tq_size; + uint16_t tq_used; + uint16_t tq_free; + uint8_t tq_stop; + uint8_t tq_index; + struct bwn_pio_txpkt tq_pkts[BWN_PIO_MAX_TXPACKETS]; + TAILQ_HEAD(, bwn_pio_txpkt) tq_pktlist; +}; + +struct bwn_pio { + struct bwn_pio_txqueue wme[5]; + struct bwn_pio_txqueue mcast; + struct bwn_pio_rxqueue rx; +}; + +struct bwn_plcp4 { + union { + uint32_t data; + uint8_t raw[4]; + } __packed o; +} __packed; + +struct bwn_plcp6 { + union { + uint32_t data; + uint8_t raw[6]; + } __packed o; +} __packed; + +struct bwn_txhdr { + uint32_t macctl; + uint8_t macfc[2]; + uint16_t tx_festime; + uint16_t phyctl; + uint16_t phyctl_1; + uint16_t phyctl_1fb; + uint16_t phyctl_1rts; + uint16_t phyctl_1rtsfb; + uint8_t phyrate; + uint8_t phyrate_rts; + uint8_t eftypes; /* extra frame types */ + uint8_t chan; + uint8_t iv[16]; + uint8_t addr1[IEEE80211_ADDR_LEN]; + uint16_t tx_festime_fb; + struct bwn_plcp6 rts_plcp_fb; + uint16_t rts_dur_fb; + struct bwn_plcp6 plcp_fb; + uint16_t dur_fb; + uint16_t mimo_modelen; + uint16_t mimo_ratelen_fb; + uint32_t timeout; + + union { + /* format <= r351 */ + struct { + uint8_t pad0[2]; + uint16_t cookie; + uint16_t tx_status; + struct bwn_plcp6 rts_plcp; + uint8_t rts_frame[16]; + uint8_t pad1[2];; + struct bwn_plcp6 plcp; + } __packed old; + /* format > r410 */ + struct { + uint16_t mimo_antenna; + uint16_t preload_size; + uint8_t pad0[2]; + uint16_t cookie; + uint16_t tx_status; + struct bwn_plcp6 rts_plcp; + uint8_t rts_frame[16]; + uint8_t pad1[2]; + struct bwn_plcp6 plcp; + } __packed new; + } __packed body; +} __packed; + +#define BWN_FWTYPE_UCODE 'u' +#define BWN_FWTYPE_PCM 'p' +#define BWN_FWTYPE_IV 'i' +struct bwn_fwhdr { + uint8_t type; + uint8_t ver; + uint8_t pad[2]; + uint32_t size; +} __packed; + +#define BWN_FWINITVALS_OFFSET_MASK 0x7fff +#define BWN_FWINITVALS_32BIT 0x8000 +struct bwn_fwinitvals { + uint16_t offset_size; + union { + uint16_t d16; + uint32_t d32; + } __packed data; +} __packed; + +enum bwn_fwtype { + BWN_FWTYPE_DEFAULT, + BWN_FWTYPE_OPENSOURCE, + BWN_NR_FWTYPES, +}; + +struct bwn_fwfile { + const char *filename; + const struct firmware *fw; + enum bwn_fwtype type; +}; + +struct bwn_key { + void *keyconf; + uint8_t algorithm; +}; + +struct bwn_fw { + struct bwn_fwfile ucode; + struct bwn_fwfile pcm; + struct bwn_fwfile initvals; + struct bwn_fwfile initvals_band; + + uint16_t rev; + uint16_t patch; + uint8_t opensource; + uint8_t no_pcmfile; +}; + +struct bwn_lo_g_sm { + int curstate; + int nmeasure; + int multipler; + uint16_t feedth; + struct bwn_loctl loctl; +}; + +struct bwn_lo_g_value { + uint8_t old_channel; + uint16_t phy_lomask; + uint16_t phy_extg; + uint16_t phy_dacctl_hwpctl; + uint16_t phy_dacctl; + uint16_t phy_hpwr_tssictl; + uint16_t phy_analogover; + uint16_t phy_analogoverval; + uint16_t phy_rfover; + uint16_t phy_rfoverval; + uint16_t phy_classctl; + uint16_t phy_crs0; + uint16_t phy_pgactl; + uint16_t phy_syncctl; + uint16_t phy_cck0; + uint16_t phy_cck1; + uint16_t phy_cck2; + uint16_t phy_cck3; + uint16_t phy_cck4; + uint16_t reg0; + uint16_t reg1; + uint16_t rf0; + uint16_t rf1; + uint16_t rf2; +}; + +#define BWN_LED_MAX 4 + +#define BWN_LED_EVENT_NONE -1 +#define BWN_LED_EVENT_POLL 0 +#define BWN_LED_EVENT_TX 1 +#define BWN_LED_EVENT_RX 2 +#define BWN_LED_SLOWDOWN(dur) (dur) = (((dur) * 3) / 2) + +struct bwn_led { + uint8_t led_flags; /* BWN_LED_F_ */ + uint8_t led_act; /* BWN_LED_ACT_ */ + uint8_t led_mask; +}; + +#define BWN_LED_F_ACTLOW 0x1 +#define BWN_LED_F_BLINK 0x2 +#define BWN_LED_F_POLLABLE 0x4 +#define BWN_LED_F_SLOW 0x8 + +struct bwn_mac { + struct bwn_softc *mac_sc; + struct siba_dev_softc *mac_sd; + unsigned mac_status; +#define BWN_MAC_STATUS_UNINIT 0 +#define BWN_MAC_STATUS_INITED 1 +#define BWN_MAC_STATUS_STARTED 2 + unsigned mac_flags; + /* use "Bad Frames Preemption" */ +#define BWN_MAC_FLAG_BADFRAME_PREEMP (1 << 0) +#define BWN_MAC_FLAG_DFQVALID (1 << 1) +#define BWN_MAC_FLAG_RADIO_ON (1 << 2) +#define BWN_MAC_FLAG_DMA (1 << 3) +#define BWN_MAC_FLAG_WME (1 << 4) +#define BWN_MAC_FLAG_HWCRYPTO (1 << 5) + + struct resource_spec *mac_intr_spec; +#define BWN_MSI_MESSAGES 1 + struct resource *mac_res_irq[BWN_MSI_MESSAGES]; + void *mac_intrhand[BWN_MSI_MESSAGES]; + int mac_msi; + + struct bwn_noise mac_noise; + struct bwn_phy mac_phy; + struct bwn_stats mac_stats; + uint32_t mac_reason_intr; + uint32_t mac_reason[6]; + uint32_t mac_intr_mask; + int mac_suspended; + + struct bwn_fw mac_fw; + + union { + struct bwn_dma dma; + struct bwn_pio pio; + } mac_method; + + uint16_t mac_ktp; /* Key table pointer */ + uint8_t mac_max_nr_keys; + struct bwn_key mac_key[58]; + + unsigned int mac_task_state; + struct task mac_intrtask; + struct task mac_hwreset; + struct task mac_txpower; + + TAILQ_ENTRY(bwn_mac) mac_list; +}; + +struct bwn_node { + struct ieee80211_node bn_node; /* must be the first */ + struct ieee80211_amrr_node bn_amn; +}; +#define BWN_NODE(ni) ((struct bwn_node *)(ni)) + +/* + * Driver-specific vap state. + */ +struct bwn_vap { + struct ieee80211vap bv_vap; /* base class */ + struct ieee80211_amrr bv_amrr; + int (*bv_newstate)(struct ieee80211vap *, + enum ieee80211_state, int); +}; +#define BWN_VAP(vap) ((struct bwn_vap *)(vap)) +#define BWN_VAP_CONST(vap) ((const struct mwl_vap *)(vap)) + +struct bwn_softc { + device_t sc_dev; + struct siba_dev_softc *sc_sd; + struct mtx sc_mtx; + struct ifnet *sc_ifp; + unsigned sc_flags; +#define BWN_FLAG_ATTACHED (1 << 0) +#define BWN_FLAG_INVALID (1 << 1) +#define BWN_FLAG_NEED_BEACON_TP (1 << 2) + unsigned sc_debug; + + struct bwn_mac *sc_curmac; + TAILQ_HEAD(, bwn_mac) sc_maclist; + + uint8_t sc_macaddr[IEEE80211_ADDR_LEN]; + uint8_t sc_bssid[IEEE80211_ADDR_LEN]; + unsigned int sc_filters; + uint8_t sc_beacons[2]; + uint8_t sc_rf_enabled; + + struct wmeParams sc_wmeParams[4]; + + struct callout sc_rfswitch_ch; /* for laptop */ + struct callout sc_task_ch; + struct callout sc_watchdog_ch; + int sc_watchdog_timer; + struct taskqueue *sc_tq; /* private task queue */ + int (*sc_newstate)(struct ieee80211com *, + enum ieee80211_state, int); + void (*sc_node_cleanup)( + struct ieee80211_node *); + + int sc_rx_rate; + int sc_tx_rate; + + int sc_led_blinking; + int sc_led_ticks; + struct bwn_led *sc_blink_led; + struct callout sc_led_blink_ch; + int sc_led_blink_offdur; + struct bwn_led sc_leds[BWN_LED_MAX]; + int sc_led_idle; + int sc_led_blink; + + struct bwn_tx_radiotap_header sc_tx_th; + struct bwn_rx_radiotap_header sc_rx_th; +}; + +#define BWN_LOCK_INIT(sc) \ + mtx_init(&(sc)->sc_mtx, device_get_nameunit((sc)->sc_dev), \ + MTX_NETWORK_LOCK, MTX_DEF) +#define BWN_LOCK_DESTROY(sc) mtx_destroy(&(sc)->sc_mtx) +#define BWN_LOCK(sc) mtx_lock(&(sc)->sc_mtx) +#define BWN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) +#define BWN_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) + +#endif /* !_IF_BWNVAR_H */ diff --git a/sys/dev/cardbus/cardbus.c b/sys/dev/cardbus/cardbus.c index 8a333ada3388..6edf183c8bef 100644 --- a/sys/dev/cardbus/cardbus.c +++ b/sys/dev/cardbus/cardbus.c @@ -80,8 +80,6 @@ static void cardbus_driver_added(device_t cbdev, driver_t *driver); static int cardbus_probe(device_t cbdev); static int cardbus_read_ivar(device_t cbdev, device_t child, int which, uintptr_t *result); -static void cardbus_release_all_resources(device_t cbdev, - struct cardbus_devinfo *dinfo); /************************************************************************/ /* Probe/Attach */ @@ -226,16 +224,11 @@ cardbus_detach_card(device_t cbdev) for (tmp = 0; tmp < numdevs; tmp++) { struct cardbus_devinfo *dinfo = device_get_ivars(devlist[tmp]); - int status = device_get_state(devlist[tmp]); if (dinfo->pci.cfg.dev != devlist[tmp]) device_printf(cbdev, "devinfo dev mismatch\n"); - if (status == DS_ATTACHED || status == DS_BUSY) - device_detach(devlist[tmp]); - cardbus_release_all_resources(cbdev, dinfo); cardbus_device_destroy(dinfo); - device_delete_child(cbdev, devlist[tmp]); - pci_freecfg((struct pci_devinfo *)dinfo); + pci_delete_child(cbdev, devlist[tmp]); } POWER_DISABLE_SOCKET(device_get_parent(cbdev), cbdev); free(devlist, M_TEMP); @@ -283,28 +276,6 @@ cardbus_driver_added(device_t cbdev, driver_t *driver) free(devlist, M_TEMP); } -static void -cardbus_release_all_resources(device_t cbdev, struct cardbus_devinfo *dinfo) -{ - struct resource_list_entry *rle; - device_t dev; - - /* Turn off access to resources we're about to free */ - dev = dinfo->pci.cfg.dev; - pci_write_config(dev, PCIR_COMMAND, - pci_read_config(dev, PCIR_COMMAND, 2) & - ~(PCIM_CMD_MEMEN | PCIM_CMD_PORTEN), 2); - /* Free all allocated resources */ - STAILQ_FOREACH(rle, &dinfo->pci.resources, link) { - if (rle->res) { - BUS_RELEASE_RESOURCE(device_get_parent(cbdev), - cbdev, rle->type, rle->rid, rle->res); - rle->res = NULL; - } - } - resource_list_free(&dinfo->pci.resources); -} - /************************************************************************/ /* Other Bus Methods */ /************************************************************************/ diff --git a/sys/dev/cardbus/cardbus_cis.c b/sys/dev/cardbus/cardbus_cis.c index 7e589498fbf1..2cfea19203f3 100644 --- a/sys/dev/cardbus/cardbus_cis.c +++ b/sys/dev/cardbus/cardbus_cis.c @@ -402,16 +402,11 @@ static int cardbus_read_tuple_mem(device_t cbdev, struct resource *res, uint32_t start, uint32_t *off, int *tupleid, int *len, uint8_t *tupledata) { - bus_space_tag_t bt; - bus_space_handle_t bh; int ret; - bt = rman_get_bustag(res); - bh = rman_get_bushandle(res); - - *tupleid = bus_space_read_1(bt, bh, start + *off); - *len = bus_space_read_1(bt, bh, start + *off + 1); - bus_space_read_region_1(bt, bh, *off + start + 2, tupledata, *len); + *tupleid = bus_read_1(res, start + *off); + *len = bus_read_1(res, start + *off + 1); + bus_read_region_1(res, *off + start + 2, tupledata, *len); ret = 0; *off += *len + 2; return (ret); @@ -435,9 +430,7 @@ cardbus_read_tuple_finish(device_t cbdev, device_t child, int rid, { if (res != CIS_CONFIG_SPACE) { bus_release_resource(child, SYS_RES_MEMORY, rid, res); - if (rid == PCIM_CIS_ASI_ROM) - pci_write_config(child, rid, pci_read_config(child, - rid, 4) & ~PCIR_BIOS, 4); + bus_delete_resource(child, SYS_RES_MEMORY, rid); } } @@ -482,14 +475,9 @@ cardbus_read_tuple_init(device_t cbdev, device_t child, uint32_t *start, return (NULL); } DEVPRINTF((cbdev, "CIS Mapped to %#lx\n", rman_get_start(res))); - if (*rid == PCIR_BIOS) - pci_write_config(child, *rid, - rman_get_start(res) | PCIM_BIOS_ENABLE, 4); /* Flip to the right ROM image if CIS is in ROM */ if (space == PCIM_CIS_ASI_ROM) { - bus_space_tag_t bt; - bus_space_handle_t bh; uint32_t imagesize; uint32_t imagebase = 0; uint32_t pcidata; @@ -497,19 +485,16 @@ cardbus_read_tuple_init(device_t cbdev, device_t child, uint32_t *start, int romnum = 0; int imagenum; - bt = rman_get_bustag(res); - bh = rman_get_bushandle(res); - imagenum = (*start & PCIM_CIS_ROM_MASK) >> 28; for (romnum = 0;; romnum++) { - romsig = bus_space_read_2(bt, bh, + romsig = bus_read_2(res, imagebase + CARDBUS_EXROM_SIGNATURE); if (romsig != 0xaa55) { device_printf(cbdev, "Bad header in rom %d: " "[%x] %04x\n", romnum, imagebase + CARDBUS_EXROM_SIGNATURE, romsig); - bus_release_resource(child, SYS_RES_MEMORY, - *rid, res); + cardbus_read_tuple_finish(cbdev, child, *rid, + res); *rid = 0; return (NULL); } @@ -522,9 +507,9 @@ cardbus_read_tuple_init(device_t cbdev, device_t child, uint32_t *start, break; /* Find out where the next Option ROM image is */ - pcidata = imagebase + bus_space_read_2(bt, bh, + pcidata = imagebase + bus_read_2(res, imagebase + CARDBUS_EXROM_DATA_PTR); - imagesize = bus_space_read_2(bt, bh, + imagesize = bus_read_2(res, pcidata + CARDBUS_EXROM_DATA_IMAGE_LENGTH); if (imagesize == 0) { @@ -541,12 +526,12 @@ cardbus_read_tuple_init(device_t cbdev, device_t child, uint32_t *start, /* Image size is in 512 byte units */ imagesize <<= 9; - if ((bus_space_read_1(bt, bh, pcidata + + if ((bus_read_1(res, pcidata + CARDBUS_EXROM_DATA_INDICATOR) & 0x80) != 0) { device_printf(cbdev, "Cannot find CIS in " "Option ROM\n"); - bus_release_resource(child, SYS_RES_MEMORY, - *rid, res); + cardbus_read_tuple_finish(cbdev, child, *rid, + res); *rid = 0; return (NULL); } diff --git a/sys/dev/ce/if_ce.c b/sys/dev/ce/if_ce.c index 2118c3d8cefb..f04fd0916e64 100644 --- a/sys/dev/ce/if_ce.c +++ b/sys/dev/ce/if_ce.c @@ -171,11 +171,11 @@ typedef struct _drv_t { node_p node; struct ifqueue queue; struct ifqueue hi_queue; - short timeout; - struct callout timeout_handle; #else struct ifnet *ifp; #endif + short timeout; + struct callout timeout_handle; #if __FreeBSD_version >= 500000 struct cdev *devt; #else /* __FreeBSD_version < 500000 */ @@ -211,13 +211,13 @@ static void ce_up (drv_t *d); static void ce_start (drv_t *d); static void ce_down (drv_t *d); static void ce_watchdog (drv_t *d); +static void ce_watchdog_timer (void *arg); #ifdef NETGRAPH extern struct ng_type typestruct; #else static void ce_ifstart (struct ifnet *ifp); static void ce_tlf (struct sppp *sp); static void ce_tls (struct sppp *sp); -static void ce_ifwatchdog (struct ifnet *ifp); static int ce_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data); static void ce_initialize (void *softc); #endif @@ -677,6 +677,7 @@ static int ce_attach (device_t dev) continue; d = c->sys; + callout_init (&d->timeout_handle, CALLOUT_MPSAFE); #ifdef NETGRAPH if (ng_make_node_common (&typestruct, &d->node) != 0) { printf ("%s: cannot make common node\n", d->name); @@ -685,7 +686,6 @@ static int ce_attach (device_t dev) } #if __FreeBSD_version >= 500000 NG_NODE_SET_PRIVATE (d->node, d); - callout_init (&d->timeout_handle, CALLOUT_MPSAFE); #else d->node->private = d; #endif @@ -731,7 +731,6 @@ static int ce_attach (device_t dev) d->ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST; d->ifp->if_ioctl = ce_sioctl; d->ifp->if_start = ce_ifstart; - d->ifp->if_watchdog = ce_ifwatchdog; d->ifp->if_init = ce_initialize; d->rqueue.ifq_maxlen = IFQ_MAXLEN; #if __FreeBSD_version >= 500000 @@ -806,6 +805,7 @@ static int ce_detach (device_t dev) if (! d || ! d->chan) continue; + callout_stop (&d->timeout_handle); #ifndef NETGRAPH /* Detach from the packet filter list of interfaces. */ bpfdetach (d->ifp); @@ -855,13 +855,12 @@ static int ce_detach (device_t dev) TAU32_DestructiveHalt (b->ddk.pControllerObject, 0); bus_release_resource (dev, SYS_RES_MEMORY, PCIR_BAR(0), bd->ce_res); - s = splimp (); - CE_LOCK (bd); for (c = b->chan; c < b->chan + NCHAN; ++c) { drv_t *d = (drv_t*) c->sys; if (! d || ! d->chan) continue; + callout_drain (&d->timeout_handle); channel [b->num * NCHAN + c->num] = 0; /* Deallocate buffers. */ ce_bus_dma_mem_free (&d->dmamem); @@ -869,8 +868,6 @@ static int ce_detach (device_t dev) adapter [b->num] = 0; ce_bus_dma_mem_free (&bd->dmamem); free (b, M_DEVBUF); - CE_UNLOCK (bd); - splx (s); #if __FreeBSD_version >= 504000 mtx_destroy (&bd->ce_mtx); #endif @@ -888,13 +885,6 @@ static void ce_ifstart (struct ifnet *ifp) CE_UNLOCK (bd); } -static void ce_ifwatchdog (struct ifnet *ifp) -{ - drv_t *d = ifp->if_softc; - - ce_watchdog (d); -} - static void ce_tlf (struct sppp *sp) { drv_t *d = SP2IFP(sp)->if_softc; @@ -989,6 +979,7 @@ static void ce_down (drv_t *d) ce_set_rts (d->chan, 0); d->running = 0; + callout_stop (&d->timeout_handle); } /* @@ -1055,11 +1046,7 @@ static void ce_send (drv_t *d) } m_freem (m); /* Set up transmit timeout, if the transmit ring is not empty.*/ -#ifdef NETGRAPH d->timeout = 10; -#else - d->ifp->if_timer = 10; -#endif } #ifndef NETGRAPH #if __FreeBSD_version >= 600034 @@ -1082,6 +1069,7 @@ static void ce_start (drv_t *d) if (! d->chan->rts) ce_set_rts (d->chan, 1); ce_send (d); + callout_reset (&d->timeout_handle, hz, ce_watchdog_timer, d); } } @@ -1092,11 +1080,8 @@ static void ce_start (drv_t *d) */ static void ce_watchdog (drv_t *d) { - bdrv_t *bd = d->board->sys; CE_DEBUG (d, ("device timeout\n")); if (d->running) { - int s = splimp (); - CE_LOCK (bd); ce_set_dtr (d->chan, 0); ce_set_rts (d->chan, 0); /* ce_stop_chan (d->chan);*/ @@ -1104,25 +1089,35 @@ static void ce_watchdog (drv_t *d) ce_set_dtr (d->chan, 1); ce_set_rts (d->chan, 1); ce_start (d); - CE_UNLOCK (bd); - splx (s); } } +static void ce_watchdog_timer (void *arg) +{ + drv_t *d = arg; + bdrv_t *bd = d->board->sys; + + CE_LOCK(bd); + if (d->timeout == 1) + ce_watchdog (d); + if (d->timeout) + d->timeout--; + callout_reset (&d->timeout_handle, hz, ce_watchdog_timer, d); + CE_UNLOCK(bd); +} + static void ce_transmit (ce_chan_t *c, void *attachment, int len) { drv_t *d = c->sys; -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_opackets; #if __FreeBSD_version >= 600034 d->ifp->if_flags &= ~IFF_DRV_OACTIVE; #else d->ifp->if_flags &= ~IFF_OACTIVE; #endif - d->ifp->if_timer = 0; #endif ce_start (d); } @@ -1195,16 +1190,14 @@ static void ce_error (ce_chan_t *c, int data) break; case CE_UNDERRUN: CE_DEBUG (d, ("underrun error\n")); -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_oerrors; #if __FreeBSD_version >= 600034 d->ifp->if_flags &= ~IFF_DRV_OACTIVE; #else d->ifp->if_flags &= ~IFF_OACTIVE; #endif - d->ifp->if_timer = 0; #endif ce_start (d); break; @@ -2507,19 +2500,6 @@ static int ng_ce_rmnode (node_p node) return 0; } -static void ng_ce_watchdog (void *arg) -{ - drv_t *d = arg; - - if (d) { - if (d->timeout == 1) - ce_watchdog (d); - if (d->timeout) - d->timeout--; - callout_reset (&d->timeout_handle, hz, ng_ce_watchdog, d); - } -} - static int ng_ce_connect (hook_p hook) { #if __FreeBSD_version >= 500000 @@ -2530,7 +2510,7 @@ static int ng_ce_connect (hook_p hook) if (d) { CE_DEBUG (d, ("Connect\n")); - callout_reset (&d->timeout_handle, hz, ng_ce_watchdog, d); + callout_reset (&d->timeout_handle, hz, ce_watchdog_timer, d); } return 0; diff --git a/sys/dev/cfe/cfe_api.c b/sys/dev/cfe/cfe_api.c index 15f6ae7ab2c6..bf3fa66e895e 100644 --- a/sys/dev/cfe/cfe_api.c +++ b/sys/dev/cfe/cfe_api.c @@ -160,7 +160,7 @@ cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen) { cfe_xiocb_t xiocb; - xiocb.xiocb_fcode = CFE_CMD_ENV_SET; + xiocb.xiocb_fcode = CFE_CMD_ENV_ENUM; xiocb.xiocb_status = 0; xiocb.xiocb_handle = 0; xiocb.xiocb_flags = 0; diff --git a/sys/dev/cfe/cfe_console.c b/sys/dev/cfe/cfe_console.c index 2c38096859f2..1461ef21119f 100644 --- a/sys/dev/cfe/cfe_console.c +++ b/sys/dev/cfe/cfe_console.c @@ -84,14 +84,12 @@ CONSOLE_DRIVER(cfe); static void cn_drvinit(void *unused) { - char output[32]; struct tty *tp; if (cfe_consdev.cn_pri != CN_DEAD && cfe_consdev.cn_name[0] != '\0') { tp = tty_alloc(&cfe_ttydevsw, NULL); - tty_makedev(tp, NULL, "%s", output); - tty_makealias(tp, "cfecons"); + tty_makedev(tp, NULL, "cfecons"); } } @@ -117,15 +115,21 @@ cfe_tty_close(struct tty *tp) static void cfe_tty_outwakeup(struct tty *tp) { - int len; + int len, written, rc; u_char buf[CFEBURSTLEN]; for (;;) { len = ttydisc_getc(tp, buf, sizeof buf); if (len == 0) break; - while (cfe_write(conhandle, buf, len) == 0) - continue; + + written = 0; + while (written < len) { + rc = cfe_write(conhandle, &buf[written], len - written); + if (rc < 0) + break; + written += rc; + } } } @@ -184,13 +188,9 @@ cfe_cnterm(struct consdev *cp) static int cfe_cngetc(struct consdev *cp) { - int result; unsigned char ch; - while ((result = cfe_read(conhandle, &ch, 1)) == 0) - continue; - - if (result > 0) { + if (cfe_read(conhandle, &ch, 1) == 1) { #if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) int kdb_brk; diff --git a/sys/dev/cfe/cfe_env.c b/sys/dev/cfe/cfe_env.c new file mode 100644 index 000000000000..a72e46e141a8 --- /dev/null +++ b/sys/dev/cfe/cfe_env.c @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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. + */ + +#include +#include +#include + +#include + +__FBSDID("$FreeBSD$"); + +#ifndef CFE_ENV_SIZE +#define CFE_ENV_SIZE PAGE_SIZE /* default is one page */ +#endif + +extern void cfe_env_init(void); + +static char cfe_env_buf[CFE_ENV_SIZE]; + +void +cfe_env_init(void) +{ + int idx, len; + char name[64], val[128], *cp, *cplim; + + cp = cfe_env_buf; + cplim = cp + CFE_ENV_SIZE; + + idx = 0; + while (1) { + if (cfe_enumenv(idx, name, sizeof(name), val, sizeof(val)) != 0) + break; + + if (bootverbose) + printf("Importing CFE env: \"%s=%s\"\n", name, val); + + /* + * name=val\0\0 + */ + len = strlen(name) + 1 + strlen(val) + 1 + 1; + if (cplim - cp < len) + printf("No space to store CFE env: \"%s=%s\"\n", + name, val); + else + cp += sprintf(cp, "%s=%s", name, val) + 1; + ++idx; + } + *cp++ = '\0'; + + kern_envp = cfe_env_buf; +} diff --git a/sys/dev/ciss/ciss.c b/sys/dev/ciss/ciss.c index 39836ea7ea70..66a046d8105a 100644 --- a/sys/dev/ciss/ciss.c +++ b/sys/dev/ciss/ciss.c @@ -173,8 +173,6 @@ static void ciss_unmap_request(struct ciss_request *cr); static int ciss_cam_init(struct ciss_softc *sc); static void ciss_cam_rescan_target(struct ciss_softc *sc, int bus, int target); -static void ciss_cam_rescan_all(struct ciss_softc *sc); -static void ciss_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb); static void ciss_cam_action(struct cam_sim *sim, union ccb *ccb); static int ciss_cam_action_io(struct cam_sim *sim, struct ccb_scsiio *csio); static int ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio); @@ -418,6 +416,7 @@ ciss_attach(device_t dev) sc = device_get_softc(dev); sc->ciss_dev = dev; + mtx_init(&sc->ciss_mtx, "cissmtx", NULL, MTX_DEF); /* * Do PCI-specific init. @@ -430,7 +429,6 @@ ciss_attach(device_t dev) */ ciss_initq_free(sc); ciss_initq_notify(sc); - mtx_init(&sc->ciss_mtx, "cissmtx", NULL, MTX_DEF); callout_init_mtx(&sc->ciss_periodic, &sc->ciss_mtx, 0); /* @@ -496,8 +494,11 @@ ciss_attach(device_t dev) error = 0; out: - if (error != 0) + if (error != 0) { + /* ciss_free() expects the mutex to be held */ + mtx_lock(&sc->ciss_mtx); ciss_free(sc); + } return(error); } @@ -2860,13 +2861,6 @@ ciss_cam_init(struct ciss_softc *sc) mtx_unlock(&sc->ciss_mtx); } - /* - * Initiate a rescan of the bus. - */ - mtx_lock(&sc->ciss_mtx); - ciss_cam_rescan_all(sc); - mtx_unlock(&sc->ciss_mtx); - return(0); } @@ -2876,53 +2870,26 @@ ciss_cam_init(struct ciss_softc *sc) static void ciss_cam_rescan_target(struct ciss_softc *sc, int bus, int target) { - struct cam_path *path; union ccb *ccb; debug_called(1); - if ((ccb = malloc(sizeof(union ccb), CISS_MALLOC_CLASS, M_NOWAIT | M_ZERO)) == NULL) { + if ((ccb = xpt_alloc_ccb_nowait()) == NULL) { ciss_printf(sc, "rescan failed (can't allocate CCB)\n"); return; } - if (xpt_create_path(&path, xpt_periph, cam_sim_path(sc->ciss_cam_sim[bus]), - target, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, + cam_sim_path(sc->ciss_cam_sim[bus]), + target, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { ciss_printf(sc, "rescan failed (can't create path)\n"); - free(ccb, CISS_MALLOC_CLASS); + xpt_free_ccb(ccb); return; } - - xpt_setup_ccb(&ccb->ccb_h, path, 5/*priority (low)*/); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = ciss_cam_rescan_callback; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); - + xpt_rescan(ccb); /* scan is now in progress */ } -static void -ciss_cam_rescan_all(struct ciss_softc *sc) -{ - int i; - - /* Rescan the logical buses */ - for (i = 0; i < sc->ciss_max_logical_bus; i++) - ciss_cam_rescan_target(sc, i, CAM_TARGET_WILDCARD); - /* Rescan the physical buses */ - for (i = CISS_PHYSICAL_BASE; i < sc->ciss_max_physical_bus + - CISS_PHYSICAL_BASE; i++) - ciss_cam_rescan_target(sc, i, CAM_TARGET_WILDCARD); -} - -static void -ciss_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb) -{ - xpt_free_path(ccb->ccb_h.path); - free(ccb, CISS_MALLOC_CLASS); -} - /************************************************************************ * Handle requests coming from CAM */ @@ -3098,6 +3065,7 @@ ciss_cam_action_io(struct cam_sim *sim, struct ccb_scsiio *csio) */ if ((error = ciss_get_request(sc, &cr)) != 0) { xpt_freeze_simq(sim, 1); + csio->ccb_h.status |= CAM_RELEASE_SIMQ; csio->ccb_h.status |= CAM_REQUEUE_REQ; return(error); } @@ -3149,8 +3117,8 @@ ciss_cam_action_io(struct cam_sim *sim, struct ccb_scsiio *csio) */ if ((error = ciss_start(cr)) != 0) { xpt_freeze_simq(sim, 1); + csio->ccb_h.status |= CAM_RELEASE_SIMQ; if (error == EINPROGRESS) { - csio->ccb_h.status |= CAM_RELEASE_SIMQ; error = 0; } else { csio->ccb_h.status |= CAM_REQUEUE_REQ; @@ -3178,7 +3146,7 @@ ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio) if (CISS_IS_PHYSICAL(bus)) { if (sc->ciss_physical[CISS_CAM_TO_PBUS(bus)][target].cp_online != 1) { - csio->ccb_h.status = CAM_SEL_TIMEOUT; + csio->ccb_h.status |= CAM_SEL_TIMEOUT; xpt_done((union ccb *)csio); return(1); } else @@ -3191,7 +3159,7 @@ ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio) * Other errors might be better. */ if (sc->ciss_logical[bus][target].cl_status != CISS_LD_ONLINE) { - csio->ccb_h.status = CAM_SEL_TIMEOUT; + csio->ccb_h.status |= CAM_SEL_TIMEOUT; xpt_done((union ccb *)csio); return(1); } @@ -3205,7 +3173,7 @@ ciss_cam_emulate(struct ciss_softc *sc, struct ccb_scsiio *csio) if (((csio->ccb_h.flags & CAM_CDB_POINTER) ? *(u_int8_t *)csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes[0]) == SYNCHRONIZE_CACHE) { ciss_flush_adapter(sc); - csio->ccb_h.status = CAM_REQ_CMP; + csio->ccb_h.status |= CAM_REQ_CMP; xpt_done((union ccb *)csio); return(1); } @@ -3266,13 +3234,13 @@ ciss_cam_complete(struct ciss_request *cr) /* no status due to adapter error */ case -1: debug(0, "adapter error"); - csio->ccb_h.status = CAM_REQ_CMP_ERR; + csio->ccb_h.status |= CAM_REQ_CMP_ERR; break; /* no status due to command completed OK */ case SCSI_STATUS_OK: /* CISS_SCSI_STATUS_GOOD */ debug(2, "SCSI_STATUS_OK"); - csio->ccb_h.status = CAM_REQ_CMP; + csio->ccb_h.status |= CAM_REQ_CMP; break; /* check condition, sense data included */ @@ -3283,7 +3251,7 @@ ciss_cam_complete(struct ciss_request *cr) bcopy(&ce->sense_info[0], &csio->sense_data, ce->sense_length); csio->sense_len = ce->sense_length; csio->resid = ce->residual_count; - csio->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; + csio->ccb_h.status |= CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; #ifdef CISS_DEBUG { struct scsi_sense_data *sns = (struct scsi_sense_data *)&ce->sense_info[0]; @@ -3294,21 +3262,18 @@ ciss_cam_complete(struct ciss_request *cr) case SCSI_STATUS_BUSY: /* CISS_SCSI_STATUS_BUSY */ debug(0, "SCSI_STATUS_BUSY"); - csio->ccb_h.status = CAM_SCSI_BUSY; + csio->ccb_h.status |= CAM_SCSI_BUSY; break; default: debug(0, "unknown status 0x%x", csio->scsi_status); - csio->ccb_h.status = CAM_REQ_CMP_ERR; + csio->ccb_h.status |= CAM_REQ_CMP_ERR; break; } /* handle post-command fixup */ ciss_cam_complete_fixup(sc, csio); - /* tell CAM we're ready for more commands */ - csio->ccb_h.status |= CAM_RELEASE_SIMQ; - ciss_release_request(cr); xpt_done((union ccb *)csio); } @@ -3321,10 +3286,15 @@ ciss_cam_complete_fixup(struct ciss_softc *sc, struct ccb_scsiio *csio) { struct scsi_inquiry_data *inq; struct ciss_ldrive *cl; + uint8_t *cdb; int bus, target; - if (((csio->ccb_h.flags & CAM_CDB_POINTER) ? - *(u_int8_t *)csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes[0]) == INQUIRY) { + cdb = (csio->ccb_h.flags & CAM_CDB_POINTER) ? + (uint8_t *)csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes; + if (cdb[0] == INQUIRY && + (cdb[1] & SI_EVPD) == 0 && + (csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN && + csio->dxfer_len >= SHORT_INQUIRY_LENGTH) { inq = (struct scsi_inquiry_data *)csio->data_ptr; target = csio->ccb_h.target_id; diff --git a/sys/dev/cm/if_cm_isa.c b/sys/dev/cm/if_cm_isa.c index 2986c6074793..fb3660e8545a 100644 --- a/sys/dev/cm/if_cm_isa.c +++ b/sys/dev/cm/if_cm_isa.c @@ -18,13 +18,6 @@ __FBSDID("$FreeBSD$"); * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/dev/cm/smc90cx6.c b/sys/dev/cm/smc90cx6.c index 1dda17ff6b3f..0e9015ea17c8 100644 --- a/sys/dev/cm/smc90cx6.c +++ b/sys/dev/cm/smc90cx6.c @@ -18,13 +18,6 @@ __FBSDID("$FreeBSD$"); * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -124,7 +117,7 @@ static void cm_reset_locked(struct cm_softc *); void cm_start(struct ifnet *); void cm_start_locked(struct ifnet *); int cm_ioctl(struct ifnet *, unsigned long, caddr_t); -void cm_watchdog(struct ifnet *); +void cm_watchdog(void *); void cm_srint_locked(void *vsc); static void cm_tint_locked(struct cm_softc *, int); void cm_reconwatch_locked(void *); @@ -194,11 +187,9 @@ cm_attach(dev) ifp->if_output = arc_output; ifp->if_start = cm_start; ifp->if_ioctl = cm_ioctl; - ifp->if_watchdog = cm_watchdog; ifp->if_init = cm_init; /* XXX IFQ_SET_READY(&ifp->if_snd); */ ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; - ifp->if_timer = 0; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX; arc_ifattach(ifp, linkaddress); @@ -210,6 +201,7 @@ cm_attach(dev) #endif callout_init_mtx(&sc->sc_recon_ch, &sc->sc_mtx, 0); + callout_init_mtx(&sc->sc_watchdog_timer, &sc->sc_mtx, 0); if_printf(ifp, "link addr 0x%02x (%d)\n", linkaddress, linkaddress); return 0; @@ -315,6 +307,7 @@ cm_reset_locked(sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + callout_reset(&sc->sc_watchdog_timer, hz, cm_watchdog, sc); cm_start_locked(ifp); } @@ -332,7 +325,8 @@ cm_stop_locked(sc) GETREG(CMRESET); /* Stop watchdog timer */ - sc->sc_ifp->if_timer = 0; + callout_stop(&sc->sc_watchdog_timer); + sc->sc_timer = 0; } void @@ -464,7 +458,7 @@ cm_start_locked(ifp) PUTREG(CMCMD, CM_TX(buffer)); PUTREG(CMSTAT, sc->sc_intmask); - ifp->if_timer = ARCTIMEOUT; + sc->sc_timer = ARCTIMEOUT; } m_freem(m); @@ -627,7 +621,7 @@ cm_tint_locked(sc, isr) if (isr & CM_TMA || sc->sc_broadcast[buffer]) ifp->if_opackets++; #ifdef CMRETRANSMIT - else if (ifp->if_flags & IFF_LINK2 && ifp->if_timer > 0 + else if (ifp->if_flags & IFF_LINK2 && sc->sc_timer > 0 && --sc->sc_retransmits[buffer] > 0) { /* retransmit same buffer */ PUTREG(CMCMD, CM_TX(buffer)); @@ -657,7 +651,7 @@ cm_tint_locked(sc, isr) */ PUTREG(CMCMD, CM_TX(buffer)); /* init watchdog timer */ - ifp->if_timer = ARCTIMEOUT; + sc->sc_timer = ARCTIMEOUT; #if defined(CM_DEBUG) && (CM_DEBUG > 1) if_printf(ifp, @@ -669,7 +663,7 @@ cm_tint_locked(sc, isr) sc->sc_intmask &= ~CM_TA; PUTREG(CMSTAT, sc->sc_intmask); /* ... and watchdog timer */ - ifp->if_timer = 0; + sc->sc_timer = 0; #ifdef CM_DEBUG if_printf(ifp, "tint: no more buffers to send, status 0x%02x\n", @@ -920,12 +914,13 @@ cm_ioctl(ifp, command, data) * retransmission is implemented). */ void -cm_watchdog(ifp) - struct ifnet *ifp; +cm_watchdog(void *arg) { - struct cm_softc *sc = ifp->if_softc; + struct cm_softc *sc; - CM_LOCK(sc); + sc = arg; + callout_reset(&sc->sc_watchdog_timer, hz, cm_watchdog, sc); + if (sc->sc_timer == 0 || --sc->sc_timer > 0) + return; PUTREG(CMCMD, CM_TXDIS); - CM_UNLOCK(sc); } diff --git a/sys/dev/cm/smc90cx6reg.h b/sys/dev/cm/smc90cx6reg.h index b020c8685f60..2fec634db496 100644 --- a/sys/dev/cm/smc90cx6reg.h +++ b/sys/dev/cm/smc90cx6reg.h @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/dev/cm/smc90cx6var.h b/sys/dev/cm/smc90cx6var.h index fe9cdbcb2094..f3fd24d7a4a5 100644 --- a/sys/dev/cm/smc90cx6var.h +++ b/sys/dev/cm/smc90cx6var.h @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -77,6 +70,8 @@ struct cm_softc { u_long sc_reconcount_excessive; /* for the above */ #define ARC_EXCESSIVE_RECONS 20 #define ARC_EXCESSIVE_RECONS_REWARN 400 + struct callout sc_watchdog_timer; + int sc_timer; u_char sc_intmask; u_char sc_rx_act; /* 2..3 */ u_char sc_tx_act; /* 0..1 */ diff --git a/sys/dev/cp/if_cp.c b/sys/dev/cp/if_cp.c index 75e329738aa3..f6eeed5058e0 100644 --- a/sys/dev/cp/if_cp.c +++ b/sys/dev/cp/if_cp.c @@ -117,12 +117,12 @@ typedef struct _drv_t { node_p node; struct ifqueue queue; struct ifqueue hi_queue; - short timeout; - struct callout timeout_handle; #else struct ifqueue queue; struct ifnet *ifp; #endif + short timeout; + struct callout timeout_handle; struct cdev *devt; } drv_t; @@ -151,13 +151,13 @@ static void cp_up (drv_t *d); static void cp_start (drv_t *d); static void cp_down (drv_t *d); static void cp_watchdog (drv_t *d); +static void cp_watchdog_timer (void *arg); #ifdef NETGRAPH extern struct ng_type typestruct; #else static void cp_ifstart (struct ifnet *ifp); static void cp_tlf (struct sppp *sp); static void cp_tls (struct sppp *sp); -static void cp_ifwatchdog (struct ifnet *ifp); static int cp_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data); static void cp_initialize (void *softc); #endif @@ -490,6 +490,7 @@ static int cp_attach (device_t dev) d->board = b; d->chan = c; c->sys = d; + callout_init (&d->timeout_handle, CALLOUT_MPSAFE); #ifdef NETGRAPH if (ng_make_node_common (&typestruct, &d->node) != 0) { printf ("%s: cannot make common node\n", d->name); @@ -508,7 +509,6 @@ static int cp_attach (device_t dev) d->hi_queue.ifq_maxlen = IFQ_MAXLEN; mtx_init (&d->queue.ifq_mtx, "cp_queue", NULL, MTX_DEF); mtx_init (&d->hi_queue.ifq_mtx, "cp_queue_hi", NULL, MTX_DEF); - callout_init (&d->timeout_handle, CALLOUT_MPSAFE); #else /*NETGRAPH*/ d->ifp = if_alloc(IFT_PPP); if (d->ifp == NULL) { @@ -521,7 +521,6 @@ static int cp_attach (device_t dev) d->ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST; d->ifp->if_ioctl = cp_sioctl; d->ifp->if_start = cp_ifstart; - d->ifp->if_watchdog = cp_ifwatchdog; d->ifp->if_init = cp_initialize; d->queue.ifq_maxlen = NRBUF; mtx_init (&d->queue.ifq_mtx, "cp_queue", NULL, MTX_DEF); @@ -603,6 +602,7 @@ static int cp_detach (device_t dev) if (! d || ! d->chan->type) continue; + callout_stop (&d->timeout_handle); #ifndef NETGRAPH /* Detach from the packet filter list of interfaces. */ bpfdetach (d->ifp); @@ -639,12 +639,12 @@ static int cp_detach (device_t dev) callout_drain (&led_timo[b->num]); splx (s); - s = splimp (); for (c = b->chan; c < b->chan + NCHAN; ++c) { drv_t *d = (drv_t*) c->sys; if (! d || ! d->chan->type) continue; + callout_drain (&d->timeout_handle); channel [b->num*NCHAN + c->num] = 0; /* Deallocate buffers. */ cp_bus_dma_mem_free (&d->dmamem); @@ -652,7 +652,6 @@ static int cp_detach (device_t dev) adapter [b->num] = 0; cp_bus_dma_mem_free (&bd->dmamem); free (b, M_DEVBUF); - splx (s); mtx_destroy (&bd->cp_mtx); return 0; } @@ -668,13 +667,6 @@ static void cp_ifstart (struct ifnet *ifp) CP_UNLOCK (bd); } -static void cp_ifwatchdog (struct ifnet *ifp) -{ - drv_t *d = ifp->if_softc; - - cp_watchdog (d); -} - static void cp_tlf (struct sppp *sp) { drv_t *d = SP2IFP(sp)->if_softc; @@ -766,6 +758,7 @@ static void cp_down (drv_t *d) cp_set_rts (d->chan, 0); d->running = 0; + callout_stop (&d->timeout_handle); } /* @@ -827,11 +820,7 @@ static void cp_send (drv_t *d) } m_freem (m); /* Set up transmit timeout, if the transmit ring is not empty.*/ -#ifdef NETGRAPH d->timeout = 10; -#else - d->ifp->if_timer = 10; -#endif } #ifndef NETGRAPH d->ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -850,6 +839,7 @@ static void cp_start (drv_t *d) if (! d->chan->rts) cp_set_rts (d->chan, 1); cp_send (d); + callout_reset (&d->timeout_handle, hz, cp_watchdog_timer, d); } } @@ -860,12 +850,8 @@ static void cp_start (drv_t *d) */ static void cp_watchdog (drv_t *d) { - bdrv_t *bd = d->board->sys; CP_DEBUG (d, ("device timeout\n")); if (d->running) { - int s = splimp (); - - CP_LOCK (bd); cp_stop_chan (d->chan); cp_stop_e1 (d->chan); cp_start_e1 (d->chan); @@ -873,21 +859,31 @@ static void cp_watchdog (drv_t *d) cp_set_dtr (d->chan, 1); cp_set_rts (d->chan, 1); cp_start (d); - CP_UNLOCK (bd); - splx (s); } } +static void cp_watchdog_timer (void *arg) +{ + drv_t *d = arg; + bdrv_t *bd = d->board->sys; + + CP_LOCK (bd); + if (d->timeout == 1) + cp_watchdog (d); + if (d->timeout) + d->timeout--; + callout_reset (&d->timeout_handle, hz, cp_watchdog_timer, d); + CP_UNLOCK (bd); +} + static void cp_transmit (cp_chan_t *c, void *attachment, int len) { drv_t *d = c->sys; -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_opackets; d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - d->ifp->if_timer = 0; #endif cp_start (d); } @@ -958,12 +954,10 @@ static void cp_error (cp_chan_t *c, int data) break; case CP_UNDERRUN: CP_DEBUG (d, ("underrun error\n")); -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_oerrors; d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - d->ifp->if_timer = 0; #endif cp_start (d); break; @@ -2198,26 +2192,13 @@ static int ng_cp_rmnode (node_p node) return 0; } -static void ng_cp_watchdog (void *arg) -{ - drv_t *d = arg; - - if (d) { - if (d->timeout == 1) - cp_watchdog (d); - if (d->timeout) - d->timeout--; - callout_reset (&d->timeout_handle, hz, ng_cp_watchdog, d); - } -} - static int ng_cp_connect (hook_p hook) { drv_t *d = NG_NODE_PRIVATE (NG_HOOK_NODE (hook)); if (d) { CP_DEBUG (d, ("Connect\n")); - callout_reset (&d->timeout_handle, hz, ng_cp_watchdog, d); + callout_reset (&d->timeout_handle, hz, cp_watchdog_timer, d); } return 0; diff --git a/sys/dev/cs/if_cs.c b/sys/dev/cs/if_cs.c index 826f4adb3c64..b32a03d57cf0 100644 --- a/sys/dev/cs/if_cs.c +++ b/sys/dev/cs/if_cs.c @@ -475,7 +475,7 @@ int cs_attach(device_t dev) { int error, media=0; - struct cs_softc *sc = device_get_softc(dev);; + struct cs_softc *sc = device_get_softc(dev); struct ifnet *ifp; sc->dev = dev; @@ -852,7 +852,7 @@ cs_write_mbufs( struct cs_softc *sc, struct mbuf *m ) * Ignore empty parts */ if (!len) - continue; + continue; /* * Find actual data address diff --git a/sys/dev/cs/if_csreg.h b/sys/dev/cs/if_csreg.h index 114800e8c062..be41e5c516d2 100644 --- a/sys/dev/cs/if_csreg.h +++ b/sys/dev/cs/if_csreg.h @@ -539,6 +539,8 @@ static __inline uint16_t cs_inw(struct cs_softc *sc, int off) { + if (off & 1) + device_printf(sc->dev, "BUG: inw to an odd address.\n"); return ((inb(sc->nic_addr + off) & 0xff) | (inb(sc->nic_addr + off + 1) << 8)); } diff --git a/sys/dev/ct/ct_isa.c b/sys/dev/ct/ct_isa.c index a1e30457b189..693572fe1c69 100644 --- a/sys/dev/ct/ct_isa.c +++ b/sys/dev/ct/ct_isa.c @@ -316,7 +316,7 @@ ct_isa_attach(device_t dev) break; } #if 0 - printf("%s: chiprev %s chipclk %d Mhz\n", + printf("%s: chiprev %s chipclk %d MHz\n", slp->sl_dev.dv_xname, s, ct->sc_chipclk); #endif diff --git a/sys/dev/ctau/if_ct.c b/sys/dev/ctau/if_ct.c index de3408b983ff..125dfa5ed803 100644 --- a/sys/dev/ctau/if_ct.c +++ b/sys/dev/ctau/if_ct.c @@ -118,12 +118,12 @@ typedef struct _drv_t { node_p node; struct ifqueue queue; struct ifqueue hi_queue; - short timeout; - struct callout timeout_handle; #else struct ifqueue queue; struct ifnet *ifp; #endif + short timeout; + struct callout timeout_handle; struct cdev *devt; } drv_t; @@ -155,13 +155,13 @@ static void ct_up (drv_t *d); static void ct_start (drv_t *d); static void ct_down (drv_t *d); static void ct_watchdog (drv_t *d); +static void ct_watchdog_timer (void *arg); #ifdef NETGRAPH extern struct ng_type typestruct; #else static void ct_ifstart (struct ifnet *ifp); static void ct_tlf (struct sppp *sp); static void ct_tls (struct sppp *sp); -static void ct_ifwatchdog (struct ifnet *ifp); static int ct_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data); static void ct_initialize (void *softc); #endif @@ -701,6 +701,7 @@ static int ct_attach (device_t dev) c->sys = d; channel [b->num*NCHAN + c->num] = d; sprintf (d->name, "ct%d.%d", b->num, c->num); + callout_init (&d->timeout_handle, CALLOUT_MPSAFE); #ifdef NETGRAPH if (ng_make_node_common (&typestruct, &d->node) != 0) { @@ -724,8 +725,7 @@ static int ct_attach (device_t dev) d->queue.ifq_maxlen = IFQ_MAXLEN; d->hi_queue.ifq_maxlen = IFQ_MAXLEN; mtx_init (&d->queue.ifq_mtx, "ct_queue", NULL, MTX_DEF); - mtx_init (&d->hi_queue.ifq_mtx, "ct_queue_hi", NULL, MTX_DEF); - callout_init (&d->timeout_handle, CALLOUT_MPSAFE); + mtx_init (&d->hi_queue.ifq_mtx, "ct_queue_hi", NULL, MTX_DEF); #else /*NETGRAPH*/ d->ifp = if_alloc(IFT_PPP); if (d->ifp == NULL) { @@ -742,7 +742,6 @@ static int ct_attach (device_t dev) d->ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST; d->ifp->if_ioctl = ct_sioctl; d->ifp->if_start = ct_ifstart; - d->ifp->if_watchdog = ct_ifwatchdog; d->ifp->if_init = ct_initialize; d->queue.ifq_maxlen = NBUF; mtx_init (&d->queue.ifq_mtx, "ct_queue", NULL, MTX_DEF); @@ -816,6 +815,7 @@ static int ct_detach (device_t dev) if (!d || !d->chan->type) continue; + callout_stop (&d->timeout_handle); #ifdef NETGRAPH if (d->node) { ng_rmnode_self (d->node); @@ -845,12 +845,12 @@ static int ct_detach (device_t dev) callout_drain (&led_timo[b->num]); splx (s); - s = splimp (); for (c = b->chan; c < b->chan + NCHAN; ++c) { drv_t *d = (drv_t*) c->sys; if (!d || !d->chan->type) continue; + callout_drain(&d->timeout_handle); /* Deallocate buffers. */ ct_bus_dma_mem_free (&d->dmamem); @@ -858,7 +858,6 @@ static int ct_detach (device_t dev) bd->board = 0; adapter [b->num] = 0; free (b, M_DEVBUF); - splx (s); mtx_destroy (&bd->ct_mtx); @@ -876,13 +875,6 @@ static void ct_ifstart (struct ifnet *ifp) CT_UNLOCK (bd); } -static void ct_ifwatchdog (struct ifnet *ifp) -{ - drv_t *d = ifp->if_softc; - - ct_watchdog (d); -} - static void ct_tlf (struct sppp *sp) { drv_t *d = SP2IFP(sp)->if_softc; @@ -970,6 +962,7 @@ static void ct_down (drv_t *d) ct_set_dtr (d->chan, 0); ct_set_rts (d->chan, 0); d->running = 0; + callout_stop (&d->timeout_handle); splx (s); } @@ -1033,11 +1026,7 @@ static void ct_send (drv_t *d) /* Set up transmit timeout, if the transmit ring is not empty. * Transmit timeout is 10 seconds. */ -#ifdef NETGRAPH d->timeout = 10; -#else - d->ifp->if_timer = 10; -#endif } #ifndef NETGRAPH d->ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -1058,6 +1047,7 @@ static void ct_start (drv_t *d) if (! d->chan->rts) ct_set_rts (d->chan, 1); ct_send (d); + callout_reset (&d->timeout_handle, hz, ct_watchdog_timer, d); } splx (s); @@ -1070,11 +1060,7 @@ static void ct_start (drv_t *d) */ static void ct_watchdog (drv_t *d) { - bdrv_t *bd = d->bd; - int s; - s = splimp (); - CT_LOCK (bd); CT_DEBUG (d, ("device timeout\n")); if (d->running) { ct_setup_chan (d->chan); @@ -1083,8 +1069,20 @@ static void ct_watchdog (drv_t *d) ct_set_rts (d->chan, 1); ct_start (d); } +} + +static void ct_watchdog_timer (void *arg) +{ + drv_t *d = arg; + bdrv_t *bd = d->bd; + + CT_LOCK (bd); + if (d->timeout == 1) + ct_watchdog (d); + if (d->timeout) + d->timeout--; + callout_reset (&d->timeout_handle, hz, ct_watchdog_timer, d); CT_UNLOCK (bd); - splx (s); } /* @@ -1096,12 +1094,10 @@ static void ct_transmit (ct_chan_t *c, void *attachment, int len) if (!d) return; -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_opackets; d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - d->ifp->if_timer = 0; #endif ct_start (d); } @@ -1181,12 +1177,10 @@ static void ct_error (ct_chan_t *c, int data) break; case CT_UNDERRUN: CT_DEBUG (d, ("underrun error\n")); -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_oerrors; d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - d->ifp->if_timer = 0; #endif ct_start (d); break; @@ -2142,20 +2136,6 @@ static int ng_ct_rmnode (node_p node) return 0; } -static void ng_ct_watchdog (void *arg) -{ - drv_t *d = arg; - - if (!d) - return; - - if (d->timeout == 1) - ct_watchdog (d); - if (d->timeout) - d->timeout--; - callout_reset (&d->timeout_handle, hz, ng_ct_watchdog, d); -} - static int ng_ct_connect (hook_p hook) { drv_t *d = NG_NODE_PRIVATE (NG_HOOK_NODE (hook)); @@ -2163,7 +2143,7 @@ static int ng_ct_connect (hook_p hook) if (!d) return 0; - callout_reset (&d->timeout_handle, hz, ng_ct_watchdog, d); + callout_reset (&d->timeout_handle, hz, ct_watchdog_timer, d); return 0; } diff --git a/sys/dev/cx/if_cx.c b/sys/dev/cx/if_cx.c index c0d354ae2d45..4e9750e14836 100644 --- a/sys/dev/cx/if_cx.c +++ b/sys/dev/cx/if_cx.c @@ -143,12 +143,12 @@ typedef struct _drv_t { node_p node; struct ifqueue lo_queue; struct ifqueue hi_queue; - short timeout; - struct callout timeout_handle; #else struct ifqueue queue; struct ifnet *ifp; #endif + short timeout; + struct callout timeout_handle; struct cdev *devt; async_q aqueue; #define CX_READ 1 @@ -197,6 +197,7 @@ static void cx_softintr (void *); static void *cx_fast_ih; static void cx_down (drv_t *d); static void cx_watchdog (drv_t *d); +static void cx_watchdog_timer (void *arg); static void cx_carrier (void *arg); #ifdef NETGRAPH @@ -205,7 +206,6 @@ extern struct ng_type typestruct; static void cx_ifstart (struct ifnet *ifp); static void cx_tlf (struct sppp *sp); static void cx_tls (struct sppp *sp); -static void cx_ifwatchdog (struct ifnet *ifp); static int cx_sioctl (struct ifnet *ifp, u_long cmd, caddr_t data); static void cx_initialize (void *softc); #endif @@ -811,6 +811,7 @@ static int cx_attach (device_t dev) case T_UNIV_RS232: case T_UNIV_RS449: case T_UNIV_V35: + callout_init (&d->timeout_handle, CALLOUT_MPSAFE); #ifdef NETGRAPH if (ng_make_node_common (&typestruct, &d->node) != 0) { printf ("%s: cannot make common node\n", d->name); @@ -834,7 +835,6 @@ static int cx_attach (device_t dev) d->hi_queue.ifq_maxlen = IFQ_MAXLEN; mtx_init (&d->lo_queue.ifq_mtx, "cx_queue_lo", NULL, MTX_DEF); mtx_init (&d->hi_queue.ifq_mtx, "cx_queue_hi", NULL, MTX_DEF); - callout_init (&d->timeout_handle, CALLOUT_MPSAFE); #else /*NETGRAPH*/ d->ifp = if_alloc(IFT_PPP); if (d->ifp == NULL) { @@ -851,7 +851,6 @@ static int cx_attach (device_t dev) d->ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST; d->ifp->if_ioctl = cx_sioctl; d->ifp->if_start = cx_ifstart; - d->ifp->if_watchdog = cx_ifwatchdog; d->ifp->if_init = cx_initialize; d->queue.ifq_maxlen = 2; mtx_init (&d->queue.ifq_mtx, "cx_queue", NULL, MTX_DEF); @@ -959,6 +958,7 @@ static int cx_detach (device_t dev) d->tty = NULL; } + callout_stop (&d->timeout_handle); #ifdef NETGRAPH if (d->node) { ng_rmnode_self (d->node); @@ -992,6 +992,7 @@ static int cx_detach (device_t dev) continue; callout_drain (&d->dcd_timeout_handle); + callout_drain (&d->timeout_handle); } splx (s); @@ -1026,13 +1027,6 @@ static void cx_ifstart (struct ifnet *ifp) CX_UNLOCK (bd); } -static void cx_ifwatchdog (struct ifnet *ifp) -{ - drv_t *d = ifp->if_softc; - - cx_watchdog (d); -} - static void cx_tlf (struct sppp *sp) { drv_t *d = SP2IFP(sp)->if_softc; @@ -1129,6 +1123,7 @@ static void cx_down (drv_t *d) cx_set_dtr (d->chan, 0); cx_set_rts (d->chan, 0); d->running = 0; + callout_stop (&d->timeout_handle); splx (s); } @@ -1191,11 +1186,7 @@ static void cx_send (drv_t *d) m_freem (m); /* Set up transmit timeout, 10 seconds. */ -#ifdef NETGRAPH d->timeout = 10; -#else - d->ifp->if_timer = 10; -#endif } #ifndef NETGRAPH d->ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -1215,6 +1206,7 @@ static void cx_start (drv_t *d) if (! d->chan->rts) cx_set_rts (d->chan, 1); cx_send (d); + callout_reset (&d->timeout_handle, hz, cx_watchdog_timer, d); } splx (s); } @@ -1226,10 +1218,7 @@ static void cx_start (drv_t *d) */ static void cx_watchdog (drv_t *d) { - bdrv_t *bd = d->board->sys; - int s = splhigh (); - CX_LOCK (bd); CX_DEBUG (d, ("device timeout\n")); if (d->running) { cx_setup_chan (d->chan); @@ -1238,8 +1227,20 @@ static void cx_watchdog (drv_t *d) cx_set_rts (d->chan, 1); cx_start (d); } +} + +static void cx_watchdog_timer (void *arg) +{ + drv_t *d = arg; + bdrv_t *bd = d->board->sys; + + CX_LOCK (bd); + if (d->timeout == 1) + cx_watchdog (d); + if (d->timeout) + d->timeout--; + callout_reset (&d->timeout_handle, hz, cx_watchdog_timer, d); CX_UNLOCK (bd); - splx (s); } /* @@ -1262,12 +1263,10 @@ static void cx_transmit (cx_chan_t *c, void *attachment, int len) } return; } -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_opackets; d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - d->ifp->if_timer = 0; #endif cx_start (d); } @@ -1421,14 +1420,12 @@ static void cx_error (cx_chan_t *c, int data) case CX_UNDERRUN: CX_DEBUG (d, ("underrun error\n")); if (c->mode != M_ASYNC) { -#ifdef NETGRAPH d->timeout = 0; -#else +#ifndef NETGRAPH ++d->ifp->if_oerrors; d->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - d->ifp->if_timer = 0; - cx_start (d); #endif + cx_start (d); } break; case CX_BREAK: @@ -2477,22 +2474,11 @@ static int ng_cx_rmnode (node_p node) return 0; } -static void ng_cx_watchdog (void *arg) -{ - drv_t *d = arg; - - if (d->timeout == 1) - cx_watchdog (d); - if (d->timeout) - d->timeout--; - callout_reset (&d->timeout_handle, hz, ng_cx_watchdog, d); -} - static int ng_cx_connect (hook_p hook) { drv_t *d = NG_NODE_PRIVATE (NG_HOOK_NODE (hook)); - callout_reset (&d->timeout_handle, hz, ng_cx_watchdog, d); + callout_reset (&d->timeout_handle, hz, cx_watchdog_timer, d); return 0; } diff --git a/sys/dev/cxgb/common/cxgb_ael1002.c b/sys/dev/cxgb/common/cxgb_ael1002.c index c92abda4c364..ec5ffe7aedb5 100644 --- a/sys/dev/cxgb/common/cxgb_ael1002.c +++ b/sys/dev/cxgb/common/cxgb_ael1002.c @@ -45,16 +45,30 @@ enum { enum { AEL100X_TX_DISABLE = 9, AEL100X_TX_CONFIG1 = 0xc002, + AEL1002_PWR_DOWN_HI = 0xc011, AEL1002_PWR_DOWN_LO = 0xc012, AEL1002_XFI_EQL = 0xc015, AEL1002_LB_EN = 0xc017, + AEL_OPT_SETTINGS = 0xc017, AEL_I2C_CTRL = 0xc30a, AEL_I2C_DATA = 0xc30b, AEL_I2C_STAT = 0xc30c, + AEL2005_GPIO_CTRL = 0xc214, AEL2005_GPIO_STAT = 0xc215, + + AEL2020_GPIO_INTR = 0xc103, + AEL2020_GPIO_CTRL = 0xc108, + AEL2020_GPIO_STAT = 0xc10c, + AEL2020_GPIO_CFG = 0xc110, + + AEL2020_GPIO_SDA = 0, + AEL2020_GPIO_MODDET = 1, + AEL2020_GPIO_0 = 3, + AEL2020_GPIO_1 = 2, + AEL2020_GPIO_LSTAT = AEL2020_GPIO_1, }; enum { edc_none, edc_sr, edc_twinax }; @@ -81,7 +95,7 @@ struct reg_val { unsigned short set_bits; }; -static int get_module_type(struct cphy *phy); +static int ael2xxx_get_module_type(struct cphy *phy, int delay_ms); static int set_phy_regs(struct cphy *phy, const struct reg_val *rv) { @@ -108,6 +122,9 @@ static void ael100x_txon(struct cphy *phy) msleep(30); } +/* + * Read an 8-bit word from a device attached to the PHY's i2c bus. + */ static int ael_i2c_rd(struct cphy *phy, int dev_addr, int word_addr) { int i, err; @@ -131,11 +148,14 @@ static int ael_i2c_rd(struct cphy *phy, int dev_addr, int word_addr) return data >> 8; } } - CH_WARN(phy->adapter, "PHY %u I2C read of addr %u timed out\n", - phy->addr, word_addr); + CH_WARN(phy->adapter, "PHY %u i2c read of dev.addr %x.%x timed out\n", + phy->addr, dev_addr, word_addr); return -ETIMEDOUT; } +/* + * Write an 8-bit word to a device attached to the PHY's i2c bus. + */ static int ael_i2c_wr(struct cphy *phy, int dev_addr, int word_addr, int data) { int i, err; @@ -158,8 +178,8 @@ static int ael_i2c_wr(struct cphy *phy, int dev_addr, int word_addr, int data) if ((stat & 3) == 1) return 0; } - CH_WARN(phy->adapter, "PHY %u I2C Write of addr %u timed out\n", - phy->addr, word_addr); + CH_WARN(phy->adapter, "PHY %u i2c Write of dev.addr %x.%x = %#x timed out\n", + phy->addr, dev_addr, word_addr, data); return -ETIMEDOUT; } @@ -230,9 +250,9 @@ static int ael1002_get_module_type(struct cphy *phy, int delay_ms) if (delay_ms) msleep(delay_ms); - v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0); + v = ael2xxx_get_module_type(phy, delay_ms); - return v == -ETIMEDOUT ? phy_modtype_none : get_module_type(phy); + return (v == -ETIMEDOUT ? phy_modtype_none : v); } static int ael1002_reset(struct cphy *phy, int wait) @@ -312,12 +332,13 @@ static struct cphy_ops ael1002_ops = { }; #endif -int t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_ael1002_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { int err; + struct cphy *phy = &pinfo->phy; - cphy_init(phy, adapter, phy_addr, &ael1002_ops, mdio_ops, + cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1002_ops, mdio_ops, SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, "10GBASE-R"); ael100x_txon(phy); @@ -366,12 +387,6 @@ static int ael1006_reset(struct cphy *phy, int wait) } -static int ael1006_power_down(struct cphy *phy, int enable) -{ - return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, - BMCR_PDOWN, enable ? BMCR_PDOWN : 0); -} - #ifdef C99_NOT_SUPPORTED static struct cphy_ops ael1006_ops = { ael1006_reset, @@ -385,7 +400,7 @@ static struct cphy_ops ael1006_ops = { NULL, NULL, get_link_status_r, - ael1006_power_down, + ael1002_power_down, }; #else static struct cphy_ops ael1006_ops = { @@ -395,20 +410,97 @@ static struct cphy_ops ael1006_ops = { .intr_clear = t3_phy_lasi_intr_clear, .intr_handler = t3_phy_lasi_intr_handler, .get_link_status = get_link_status_r, - .power_down = ael1006_power_down, + .power_down = ael1002_power_down, }; #endif -int t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_ael1006_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { - cphy_init(phy, adapter, phy_addr, &ael1006_ops, mdio_ops, + struct cphy *phy = &pinfo->phy; + + cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael1006_ops, mdio_ops, SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE, "10GBASE-SR"); + phy->modtype = phy_modtype_sr; ael100x_txon(phy); return 0; } +/* + * Decode our module type. + */ +static int ael2xxx_get_module_type(struct cphy *phy, int delay_ms) +{ + int v; + + if (delay_ms) + msleep(delay_ms); + + v = get_phytrans_type(phy); + if (v == phy_transtype_sfp) { + /* SFP: see SFF-8472 for below */ + + v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 3); + if (v < 0) + return v; + + if (v == 0x1) + return phy_modtype_twinax; + if (v == 0x10) + return phy_modtype_sr; + if (v == 0x20) + return phy_modtype_lr; + if (v == 0x40) + return phy_modtype_lrm; + + v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 6); + if (v < 0) + return v; + if (v != 4) + return phy_modtype_unknown; + + v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 10); + if (v < 0) + return v; + + if (v & 0x80) { + v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); + if (v < 0) + return v; + return v > 10 ? phy_modtype_twinax_long : + phy_modtype_twinax; + } + } else if (v == phy_transtype_xfp) { + /* XFP: See INF-8077i for details. */ + + v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 127); + if (v < 0) + return v; + + if (v != 1) { + /* XXX: set page select to table 1 yourself */ + return phy_modtype_unknown; + } + + v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 131); + if (v < 0) + return v; + v &= 0xf0; + if (v == 0x10) + return phy_modtype_lrm; + if (v == 0x40) + return phy_modtype_lr; + if (v == 0x80) + return phy_modtype_sr; + } + + return phy_modtype_unknown; +} + +/* + * Code to support the Aeluros/NetLogic 2005 10Gb PHY. + */ static int ael2005_setup_sr_edc(struct cphy *phy) { static struct reg_val regs[] = { @@ -1103,72 +1195,21 @@ static int ael2005_setup_twinax_edc(struct cphy *phy, int modtype) return err; } -static int get_module_type(struct cphy *phy) +static int ael2005_get_module_type(struct cphy *phy, int delay_ms) { int v; + unsigned int stat; - v = get_phytrans_type(phy); - if (v == phy_transtype_sfp) { - /* SFP: see SFF-8472 for below */ + v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); + if (v) + return v; - v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 3); - if (v < 0) - return v; + if (stat & (1 << 8)) /* module absent */ + return phy_modtype_none; - if (v == 0x1) - return phy_modtype_twinax; - if (v == 0x10) - return phy_modtype_sr; - if (v == 0x20) - return phy_modtype_lr; - if (v == 0x40) - return phy_modtype_lrm; - - v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 6); - if (v < 0) - return v; - if (v != 4) - return phy_modtype_unknown; - - v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 10); - if (v < 0) - return v; - - if (v & 0x80) { - v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 0x12); - if (v < 0) - return v; - return v > 10 ? phy_modtype_twinax_long : - phy_modtype_twinax; - } - } else if (v == phy_transtype_xfp) { - /* XFP: See INF-8077i for details. */ - - v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 127); - if (v < 0) - return v; - - if (v != 1) { - /* XXX: set page select to table 1 yourself */ - return phy_modtype_unknown; - } - - v = ael_i2c_rd(phy, MODULE_DEV_ADDR, 131); - if (v < 0) - return v; - v &= 0xf0; - if (v == 0x10) - return phy_modtype_lrm; - if (v == 0x40) - return phy_modtype_lr; - if (v == 0x80) - return phy_modtype_sr; - } - - return phy_modtype_unknown; + return ael2xxx_get_module_type(phy, delay_ms); } - static int ael2005_intr_enable(struct cphy *phy) { int err = mdio_write(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, 0x200); @@ -1187,24 +1228,6 @@ static int ael2005_intr_clear(struct cphy *phy) return err ? err : t3_phy_lasi_intr_clear(phy); } -static int ael2005_get_module_type(struct cphy *phy, int delay_ms) -{ - int v; - unsigned int stat; - - v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2005_GPIO_CTRL, &stat); - if (v) - return v; - - if (stat & (1 << 8)) /* module absent */ - return phy_modtype_none; - - if (delay_ms) - msleep(delay_ms); - - return get_module_type(phy); -} - static int ael2005_reset(struct cphy *phy, int wait) { static struct reg_val regs0[] = { @@ -1223,7 +1246,8 @@ static int ael2005_reset(struct cphy *phy, int wait) { 0, 0, 0, 0 } }; - int err, lasi_ctrl; + int err; + unsigned int lasi_ctrl; err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); if (err) @@ -1246,7 +1270,7 @@ static int ael2005_reset(struct cphy *phy, int wait) return err; phy->modtype = (u8)err; - if (err == phy_modtype_none || err == phy_modtype_unknown) + if (err == phy_modtype_none) err = 0; else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) err = ael2005_setup_twinax_edc(phy, err); @@ -1311,8 +1335,8 @@ static int ael2005_intr_handler(struct cphy *phy) return ret; } -#ifdef C99_NOT_SUPPORTED static struct cphy_ops ael2005_ops = { +#ifdef C99_NOT_SUPPORTED ael2005_reset, ael2005_intr_enable, ael2005_intr_disable, @@ -1325,9 +1349,7 @@ static struct cphy_ops ael2005_ops = { NULL, get_link_status_r, ael1002_power_down, -}; #else -static struct cphy_ops ael2005_ops = { .reset = ael2005_reset, .intr_enable = ael2005_intr_enable, .intr_disable = ael2005_intr_disable, @@ -1335,14 +1357,16 @@ static struct cphy_ops ael2005_ops = { .intr_handler = ael2005_intr_handler, .get_link_status = get_link_status_r, .power_down = ael1002_power_down, -}; #endif +}; -int t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_ael2005_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { int err; - cphy_init(phy, adapter, phy_addr, &ael2005_ops, mdio_ops, + struct cphy *phy = &pinfo->phy; + + cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2005_ops, mdio_ops, SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | SUPPORTED_IRQ, "10GBASE-R"); msleep(125); @@ -1356,6 +1380,713 @@ int t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, 1 << 5); } +/* + * Setup EDC and other parameters for operation with an optical module. + */ +static int ael2020_setup_sr_edc(struct cphy *phy) +{ + static struct reg_val regs[] = { + { MDIO_DEV_PMA_PMD, 0xcc01, 0xffff, 0x488a }, + + { MDIO_DEV_PMA_PMD, 0xcb1b, 0xffff, 0x0200 }, + { MDIO_DEV_PMA_PMD, 0xcb1c, 0xffff, 0x00f0 }, + { MDIO_DEV_PMA_PMD, 0xcc06, 0xffff, 0x00e0 }, + + /* end */ + { 0, 0, 0, 0 } + }; + int err; + + err = set_phy_regs(phy, regs); + msleep(50); + if (err) + return err; + + phy->priv = edc_sr; + return 0; +} + +/* + * Setup EDC and other parameters for operation with an TWINAX module. + */ +static int ael2020_setup_twinax_edc(struct cphy *phy, int modtype) +{ + static struct reg_val uCclock40MHz[] = { + { MDIO_DEV_PMA_PMD, 0xff28, 0xffff, 0x4001 }, + { MDIO_DEV_PMA_PMD, 0xff2a, 0xffff, 0x0002 }, + { 0, 0, 0, 0 } + }; + + static struct reg_val uCclockActivate[] = { + { MDIO_DEV_PMA_PMD, 0xd000, 0xffff, 0x5200 }, + { 0, 0, 0, 0 } + }; + + static struct reg_val uCactivate[] = { + { MDIO_DEV_PMA_PMD, 0xd080, 0xffff, 0x0100 }, + { MDIO_DEV_PMA_PMD, 0xd092, 0xffff, 0x0000 }, + { 0, 0, 0, 0 } + }; + + static u16 twinax_edc[] = { + 0xd800, 0x4009, + 0xd801, 0x2fff, + 0xd802, 0x300f, + 0xd803, 0x40aa, + 0xd804, 0x401c, + 0xd805, 0x401e, + 0xd806, 0x2ff4, + 0xd807, 0x3dc4, + 0xd808, 0x2035, + 0xd809, 0x3035, + 0xd80a, 0x6524, + 0xd80b, 0x2cb2, + 0xd80c, 0x3012, + 0xd80d, 0x1002, + 0xd80e, 0x26e2, + 0xd80f, 0x3022, + 0xd810, 0x1002, + 0xd811, 0x27d2, + 0xd812, 0x3022, + 0xd813, 0x1002, + 0xd814, 0x2822, + 0xd815, 0x3012, + 0xd816, 0x1002, + 0xd817, 0x2492, + 0xd818, 0x3022, + 0xd819, 0x1002, + 0xd81a, 0x2772, + 0xd81b, 0x3012, + 0xd81c, 0x1002, + 0xd81d, 0x23d2, + 0xd81e, 0x3022, + 0xd81f, 0x1002, + 0xd820, 0x22cd, + 0xd821, 0x301d, + 0xd822, 0x27f2, + 0xd823, 0x3022, + 0xd824, 0x1002, + 0xd825, 0x5553, + 0xd826, 0x0307, + 0xd827, 0x2522, + 0xd828, 0x3022, + 0xd829, 0x1002, + 0xd82a, 0x2142, + 0xd82b, 0x3012, + 0xd82c, 0x1002, + 0xd82d, 0x4016, + 0xd82e, 0x5e63, + 0xd82f, 0x0344, + 0xd830, 0x2142, + 0xd831, 0x3012, + 0xd832, 0x1002, + 0xd833, 0x400e, + 0xd834, 0x2522, + 0xd835, 0x3022, + 0xd836, 0x1002, + 0xd837, 0x2b52, + 0xd838, 0x3012, + 0xd839, 0x1002, + 0xd83a, 0x2742, + 0xd83b, 0x3022, + 0xd83c, 0x1002, + 0xd83d, 0x25e2, + 0xd83e, 0x3022, + 0xd83f, 0x1002, + 0xd840, 0x2fa4, + 0xd841, 0x3dc4, + 0xd842, 0x6624, + 0xd843, 0x414b, + 0xd844, 0x56b3, + 0xd845, 0x03c6, + 0xd846, 0x866b, + 0xd847, 0x400c, + 0xd848, 0x2712, + 0xd849, 0x3012, + 0xd84a, 0x1002, + 0xd84b, 0x2c4b, + 0xd84c, 0x309b, + 0xd84d, 0x56b3, + 0xd84e, 0x03c3, + 0xd84f, 0x866b, + 0xd850, 0x400c, + 0xd851, 0x2272, + 0xd852, 0x3022, + 0xd853, 0x1002, + 0xd854, 0x2742, + 0xd855, 0x3022, + 0xd856, 0x1002, + 0xd857, 0x25e2, + 0xd858, 0x3022, + 0xd859, 0x1002, + 0xd85a, 0x2fb4, + 0xd85b, 0x3dc4, + 0xd85c, 0x6624, + 0xd85d, 0x56b3, + 0xd85e, 0x03c3, + 0xd85f, 0x866b, + 0xd860, 0x401c, + 0xd861, 0x2c45, + 0xd862, 0x3095, + 0xd863, 0x5b53, + 0xd864, 0x2372, + 0xd865, 0x3012, + 0xd866, 0x13c2, + 0xd867, 0x5cc3, + 0xd868, 0x2712, + 0xd869, 0x3012, + 0xd86a, 0x1312, + 0xd86b, 0x2b52, + 0xd86c, 0x3012, + 0xd86d, 0x1002, + 0xd86e, 0x2742, + 0xd86f, 0x3022, + 0xd870, 0x1002, + 0xd871, 0x2582, + 0xd872, 0x3022, + 0xd873, 0x1002, + 0xd874, 0x2142, + 0xd875, 0x3012, + 0xd876, 0x1002, + 0xd877, 0x628f, + 0xd878, 0x2985, + 0xd879, 0x33a5, + 0xd87a, 0x25e2, + 0xd87b, 0x3022, + 0xd87c, 0x1002, + 0xd87d, 0x5653, + 0xd87e, 0x03d2, + 0xd87f, 0x401e, + 0xd880, 0x6f72, + 0xd881, 0x1002, + 0xd882, 0x628f, + 0xd883, 0x2304, + 0xd884, 0x3c84, + 0xd885, 0x6436, + 0xd886, 0xdff4, + 0xd887, 0x6436, + 0xd888, 0x2ff5, + 0xd889, 0x3005, + 0xd88a, 0x8656, + 0xd88b, 0xdfba, + 0xd88c, 0x56a3, + 0xd88d, 0xd05a, + 0xd88e, 0x2972, + 0xd88f, 0x3012, + 0xd890, 0x1392, + 0xd891, 0xd05a, + 0xd892, 0x56a3, + 0xd893, 0xdfba, + 0xd894, 0x0383, + 0xd895, 0x6f72, + 0xd896, 0x1002, + 0xd897, 0x2b45, + 0xd898, 0x3005, + 0xd899, 0x4178, + 0xd89a, 0x5653, + 0xd89b, 0x0384, + 0xd89c, 0x2a62, + 0xd89d, 0x3012, + 0xd89e, 0x1002, + 0xd89f, 0x2f05, + 0xd8a0, 0x3005, + 0xd8a1, 0x41c8, + 0xd8a2, 0x5653, + 0xd8a3, 0x0382, + 0xd8a4, 0x0002, + 0xd8a5, 0x4218, + 0xd8a6, 0x2474, + 0xd8a7, 0x3c84, + 0xd8a8, 0x6437, + 0xd8a9, 0xdff4, + 0xd8aa, 0x6437, + 0xd8ab, 0x2ff5, + 0xd8ac, 0x3c05, + 0xd8ad, 0x8757, + 0xd8ae, 0xb888, + 0xd8af, 0x9787, + 0xd8b0, 0xdff4, + 0xd8b1, 0x6724, + 0xd8b2, 0x866a, + 0xd8b3, 0x6f72, + 0xd8b4, 0x1002, + 0xd8b5, 0x2641, + 0xd8b6, 0x3021, + 0xd8b7, 0x1001, + 0xd8b8, 0xc620, + 0xd8b9, 0x0000, + 0xd8ba, 0xc621, + 0xd8bb, 0x0000, + 0xd8bc, 0xc622, + 0xd8bd, 0x00ce, + 0xd8be, 0xc623, + 0xd8bf, 0x007f, + 0xd8c0, 0xc624, + 0xd8c1, 0x0032, + 0xd8c2, 0xc625, + 0xd8c3, 0x0000, + 0xd8c4, 0xc627, + 0xd8c5, 0x0000, + 0xd8c6, 0xc628, + 0xd8c7, 0x0000, + 0xd8c8, 0xc62c, + 0xd8c9, 0x0000, + 0xd8ca, 0x0000, + 0xd8cb, 0x2641, + 0xd8cc, 0x3021, + 0xd8cd, 0x1001, + 0xd8ce, 0xc502, + 0xd8cf, 0x53ac, + 0xd8d0, 0xc503, + 0xd8d1, 0x2cd3, + 0xd8d2, 0xc600, + 0xd8d3, 0x2a6e, + 0xd8d4, 0xc601, + 0xd8d5, 0x2a2c, + 0xd8d6, 0xc605, + 0xd8d7, 0x5557, + 0xd8d8, 0xc60c, + 0xd8d9, 0x5400, + 0xd8da, 0xc710, + 0xd8db, 0x0700, + 0xd8dc, 0xc711, + 0xd8dd, 0x0f06, + 0xd8de, 0xc718, + 0xd8df, 0x0700, + 0xd8e0, 0xc719, + 0xd8e1, 0x0f06, + 0xd8e2, 0xc720, + 0xd8e3, 0x4700, + 0xd8e4, 0xc721, + 0xd8e5, 0x0f06, + 0xd8e6, 0xc728, + 0xd8e7, 0x0700, + 0xd8e8, 0xc729, + 0xd8e9, 0x1207, + 0xd8ea, 0xc801, + 0xd8eb, 0x7f50, + 0xd8ec, 0xc802, + 0xd8ed, 0x7760, + 0xd8ee, 0xc803, + 0xd8ef, 0x7fce, + 0xd8f0, 0xc804, + 0xd8f1, 0x520e, + 0xd8f2, 0xc805, + 0xd8f3, 0x5c11, + 0xd8f4, 0xc806, + 0xd8f5, 0x3c51, + 0xd8f6, 0xc807, + 0xd8f7, 0x4061, + 0xd8f8, 0xc808, + 0xd8f9, 0x49c1, + 0xd8fa, 0xc809, + 0xd8fb, 0x3840, + 0xd8fc, 0xc80a, + 0xd8fd, 0x0000, + 0xd8fe, 0xc821, + 0xd8ff, 0x0002, + 0xd900, 0xc822, + 0xd901, 0x0046, + 0xd902, 0xc844, + 0xd903, 0x182f, + 0xd904, 0xc013, + 0xd905, 0xf341, + 0xd906, 0xc084, + 0xd907, 0x0030, + 0xd908, 0xc904, + 0xd909, 0x1401, + 0xd90a, 0xcb0c, + 0xd90b, 0x0004, + 0xd90c, 0xcb0e, + 0xd90d, 0xa00a, + 0xd90e, 0xcb0f, + 0xd90f, 0xc0c0, + 0xd910, 0xcb10, + 0xd911, 0xc0c0, + 0xd912, 0xcb11, + 0xd913, 0x00a0, + 0xd914, 0xcb12, + 0xd915, 0x0007, + 0xd916, 0xc241, + 0xd917, 0xa000, + 0xd918, 0xc243, + 0xd919, 0x7fe0, + 0xd91a, 0xc604, + 0xd91b, 0x000e, + 0xd91c, 0xc609, + 0xd91d, 0x00f5, + 0xd91e, 0xc611, + 0xd91f, 0x000e, + 0xd920, 0xc660, + 0xd921, 0x9600, + 0xd922, 0xc687, + 0xd923, 0x0004, + 0xd924, 0xc60a, + 0xd925, 0x04f5, + 0xd926, 0x0000, + 0xd927, 0x2641, + 0xd928, 0x3021, + 0xd929, 0x1001, + 0xd92a, 0xc620, + 0xd92b, 0x14e5, + 0xd92c, 0xc621, + 0xd92d, 0xc53d, + 0xd92e, 0xc622, + 0xd92f, 0x3cbe, + 0xd930, 0xc623, + 0xd931, 0x4452, + 0xd932, 0xc624, + 0xd933, 0xc5c5, + 0xd934, 0xc625, + 0xd935, 0xe01e, + 0xd936, 0xc627, + 0xd937, 0x0000, + 0xd938, 0xc628, + 0xd939, 0x0000, + 0xd93a, 0xc62c, + 0xd93b, 0x0000, + 0xd93c, 0x0000, + 0xd93d, 0x2b84, + 0xd93e, 0x3c74, + 0xd93f, 0x6435, + 0xd940, 0xdff4, + 0xd941, 0x6435, + 0xd942, 0x2806, + 0xd943, 0x3006, + 0xd944, 0x8565, + 0xd945, 0x2b24, + 0xd946, 0x3c24, + 0xd947, 0x6436, + 0xd948, 0x1002, + 0xd949, 0x2b24, + 0xd94a, 0x3c24, + 0xd94b, 0x6436, + 0xd94c, 0x4045, + 0xd94d, 0x8656, + 0xd94e, 0x5663, + 0xd94f, 0x0302, + 0xd950, 0x401e, + 0xd951, 0x1002, + 0xd952, 0x2807, + 0xd953, 0x31a7, + 0xd954, 0x20c4, + 0xd955, 0x3c24, + 0xd956, 0x6724, + 0xd957, 0x1002, + 0xd958, 0x2807, + 0xd959, 0x3187, + 0xd95a, 0x20c4, + 0xd95b, 0x3c24, + 0xd95c, 0x6724, + 0xd95d, 0x1002, + 0xd95e, 0x24f4, + 0xd95f, 0x3c64, + 0xd960, 0x6436, + 0xd961, 0xdff4, + 0xd962, 0x6436, + 0xd963, 0x1002, + 0xd964, 0x2006, + 0xd965, 0x3d76, + 0xd966, 0xc161, + 0xd967, 0x6134, + 0xd968, 0x6135, + 0xd969, 0x5443, + 0xd96a, 0x0303, + 0xd96b, 0x6524, + 0xd96c, 0x00fb, + 0xd96d, 0x1002, + 0xd96e, 0x20d4, + 0xd96f, 0x3c24, + 0xd970, 0x2025, + 0xd971, 0x3005, + 0xd972, 0x6524, + 0xd973, 0x1002, + 0xd974, 0xd019, + 0xd975, 0x2104, + 0xd976, 0x3c24, + 0xd977, 0x2105, + 0xd978, 0x3805, + 0xd979, 0x6524, + 0xd97a, 0xdff4, + 0xd97b, 0x4005, + 0xd97c, 0x6524, + 0xd97d, 0x2e8d, + 0xd97e, 0x303d, + 0xd97f, 0x2408, + 0xd980, 0x35d8, + 0xd981, 0x5dd3, + 0xd982, 0x0307, + 0xd983, 0x8887, + 0xd984, 0x63a7, + 0xd985, 0x8887, + 0xd986, 0x63a7, + 0xd987, 0xdffd, + 0xd988, 0x00f9, + 0xd989, 0x1002, + 0xd98a, 0x0000, + }; + int i, err; + + /* set uC clock and activate it */ + err = set_phy_regs(phy, uCclock40MHz); + msleep(500); + if (err) + return err; + err = set_phy_regs(phy, uCclockActivate); + msleep(500); + if (err) + return err; + + for (i = 0; i < ARRAY_SIZE(twinax_edc) && !err; i += 2) + err = mdio_write(phy, MDIO_DEV_PMA_PMD, twinax_edc[i], + twinax_edc[i + 1]); + /* activate uC */ + err = set_phy_regs(phy, uCactivate); + if (!err) + phy->priv = edc_twinax; + return err; +} + +/* + * Return Module Type. + */ +static int ael2020_get_module_type(struct cphy *phy, int delay_ms) +{ + int v; + unsigned int stat; + + v = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_STAT, &stat); + if (v) + return v; + + if (stat & (0x1 << (AEL2020_GPIO_MODDET*4))) { + /* module absent */ + return phy_modtype_none; + } + + return ael2xxx_get_module_type(phy, delay_ms); +} + +/* + * Enable PHY interrupts. We enable "Module Detection" interrupts (on any + * state transition) and then generic Link Alarm Status Interrupt (LASI). + */ +static int ael2020_intr_enable(struct cphy *phy) +{ + struct reg_val regs[] = { + { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CFG+AEL2020_GPIO_LSTAT, + 0xffff, 0x4 }, + { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, + 0xffff, 0x8 << (AEL2020_GPIO_LSTAT*4) }, + + { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, + 0xffff, 0x2 << (AEL2020_GPIO_MODDET*4) }, + + /* end */ + { 0, 0, 0, 0 } + }; + int err; + + err = set_phy_regs(phy, regs); + if (err) + return err; + + phy->caps |= POLL_LINK_1ST_TIME; + + /* enable standard Link Alarm Status Interrupts */ + err = t3_phy_lasi_intr_enable(phy); + if (err) + return err; + + return 0; +} + +/* + * Disable PHY interrupts. The mirror of the above ... + */ +static int ael2020_intr_disable(struct cphy *phy) +{ + struct reg_val regs[] = { + { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, + 0xffff, 0xb << (AEL2020_GPIO_LSTAT*4) }, + + { MDIO_DEV_PMA_PMD, AEL2020_GPIO_CTRL, + 0xffff, 0x1 << (AEL2020_GPIO_MODDET*4) }, + + /* end */ + { 0, 0, 0, 0 } + }; + int err; + + err = set_phy_regs(phy, regs); + if (err) + return err; + + /* disable standard Link Alarm Status Interrupts */ + return t3_phy_lasi_intr_disable(phy); +} + +/* + * Clear PHY interrupt state. + */ +static int ael2020_intr_clear(struct cphy *phy) +{ + unsigned int stat; + int err = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat); + return err ? err : t3_phy_lasi_intr_clear(phy); +} + +/* + * Common register settings for the AEL2020 when it comes out of reset. + */ +static struct reg_val ael2020_reset_regs[] = { + { MDIO_DEV_PMA_PMD, 0xc003, 0xffff, 0x3101 }, + + { MDIO_DEV_PMA_PMD, 0xcd40, 0xffff, 0x0001 }, + + { MDIO_DEV_PMA_PMD, 0xff02, 0xffff, 0x0023 }, + { MDIO_DEV_PMA_PMD, 0xff03, 0xffff, 0x0000 }, + { MDIO_DEV_PMA_PMD, 0xff04, 0xffff, 0x0000 }, + + /* end */ + { 0, 0, 0, 0 } +}; + +/* + * Reset the PHY and put it into a canonical operating state. + */ +static int ael2020_reset(struct cphy *phy, int wait) +{ + int err; + unsigned int lasi_ctrl; + + /* grab current interrupt state */ + err = mdio_read(phy, MDIO_DEV_PMA_PMD, LASI_CTRL, &lasi_ctrl); + if (err) + return err; + + err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, 125); + if (err) + return err; + msleep(100); + + /* basic initialization for all module types */ + phy->priv = edc_none; + err = set_phy_regs(phy, ael2020_reset_regs); + if (err) + return err; + + /* determine module type and perform appropriate initialization */ + err = ael2020_get_module_type(phy, 0); + if (err < 0) + return err; + phy->modtype = (u8)err; + if (err == phy_modtype_none) + err = 0; + else if (err == phy_modtype_twinax || err == phy_modtype_twinax_long) + err = ael2020_setup_twinax_edc(phy, err); + else + err = ael2020_setup_sr_edc(phy); + if (err) + return err; + + /* reset wipes out interrupts, reenable them if they were on */ + if (lasi_ctrl & 1) + err = ael2020_intr_enable(phy); + return err; +} + +/* + * Handle a PHY interrupt. + */ +static int ael2020_intr_handler(struct cphy *phy) +{ + unsigned int stat; + int ret, edc_needed, cause = 0; + + ret = mdio_read(phy, MDIO_DEV_PMA_PMD, AEL2020_GPIO_INTR, &stat); + if (ret) + return ret; + + if (stat & (0x1 << AEL2020_GPIO_MODDET)) { + /* modules have max 300 ms init time after hot plug */ + ret = ael2020_get_module_type(phy, 300); + if (ret < 0) + return ret; + + phy->modtype = (u8)ret; + if (ret == phy_modtype_none) + edc_needed = phy->priv; /* on unplug retain EDC */ + else if (ret == phy_modtype_twinax || + ret == phy_modtype_twinax_long) + edc_needed = edc_twinax; + else + edc_needed = edc_sr; + + if (edc_needed != phy->priv) { + ret = ael2020_reset(phy, 0); + return ret ? ret : cphy_cause_module_change; + } + cause = cphy_cause_module_change; + } + + ret = t3_phy_lasi_intr_handler(phy); + if (ret < 0) + return ret; + + ret |= cause; + if (!ret) + ret |= cphy_cause_link_change; + return ret; +} + +static struct cphy_ops ael2020_ops = { +#ifdef C99_NOT_SUPPORTED + ael2020_reset, + ael2020_intr_enable, + ael2020_intr_disable, + ael2020_intr_clear, + ael2020_intr_handler, + NULL, + NULL, + NULL, + NULL, + NULL, + get_link_status_r, + ael1002_power_down, +#else + .reset = ael2020_reset, + .intr_enable = ael2020_intr_enable, + .intr_disable = ael2020_intr_disable, + .intr_clear = ael2020_intr_clear, + .intr_handler = ael2020_intr_handler, + .get_link_status = get_link_status_r, + .power_down = ael1002_power_down, +#endif +}; + +int t3_ael2020_phy_prep(pinfo_t *pinfo, int phy_addr, + const struct mdio_ops *mdio_ops) +{ + int err; + struct cphy *phy = &pinfo->phy; + + cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &ael2020_ops, mdio_ops, + SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_FIBRE | + SUPPORTED_IRQ, "10GBASE-R"); + msleep(125); + + err = set_phy_regs(phy, ael2020_reset_regs); + if (err) + return err; + err = ael2020_get_module_type(phy, 0); + if (err >= 0) + phy->modtype = err; + + ael_laser_down(phy, 0); + return 0; +} + /* * Get link status for a 10GBASE-X device. */ @@ -1394,7 +2125,7 @@ static struct cphy_ops qt2045_ops = { NULL, NULL, get_link_status_x, - ael1006_power_down, + ael1002_power_down, }; #else static struct cphy_ops qt2045_ops = { @@ -1404,16 +2135,17 @@ static struct cphy_ops qt2045_ops = { .intr_clear = t3_phy_lasi_intr_clear, .intr_handler = t3_phy_lasi_intr_handler, .get_link_status = get_link_status_x, - .power_down = ael1006_power_down, + .power_down = ael1002_power_down, }; #endif -int t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_qt2045_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { unsigned int stat; + struct cphy *phy = &pinfo->phy; - cphy_init(phy, adapter, phy_addr, &qt2045_ops, mdio_ops, + cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &qt2045_ops, mdio_ops, SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, "10GBASE-CX4"); @@ -1437,14 +2169,15 @@ static int xaui_direct_get_link_status(struct cphy *phy, int *link_ok, { if (link_ok) { unsigned int status; + adapter_t *adapter = phy->adapter; - status = t3_read_reg(phy->adapter, + status = t3_read_reg(adapter, XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) | - t3_read_reg(phy->adapter, + t3_read_reg(adapter, XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) | - t3_read_reg(phy->adapter, + t3_read_reg(adapter, XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) | - t3_read_reg(phy->adapter, + t3_read_reg(adapter, XGM_REG(A_XGM_SERDES_STAT3, phy->addr)); *link_ok = !(status & F_LOWSIG0); } @@ -1487,10 +2220,10 @@ static struct cphy_ops xaui_direct_ops = { }; #endif -int t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_xaui_direct_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { - cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops, + cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &xaui_direct_ops, mdio_ops, SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, "10GBASE-CX4"); return 0; diff --git a/sys/dev/cxgb/common/cxgb_aq100x.c b/sys/dev/cxgb/common/cxgb_aq100x.c new file mode 100644 index 000000000000..46f07ca15304 --- /dev/null +++ b/sys/dev/cxgb/common/cxgb_aq100x.c @@ -0,0 +1,542 @@ +/************************************************************************** + +Copyright (c) 2009 Chelsio Inc. +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. Neither the name of the Chelsio Corporation 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 +__FBSDID("$FreeBSD$"); + +#include + +#undef msleep +#define msleep t3_os_sleep + +enum { + /* MDIO_DEV_PMA_PMD registers */ + AQ_LINK_STAT = 0xe800, + + /* MDIO_DEV_XGXS registers */ + AQ_XAUI_RX_CFG = 0xc400, + AQ_XAUI_KX_CFG = 0xc440, + AQ_XAUI_TX_CFG = 0xe400, + + /* MDIO_DEV_ANEG registers */ + AQ_100M_CTRL = 0x0010, + AQ_10G_CTRL = 0x0020, + AQ_1G_CTRL = 0xc400, + AQ_ANEG_STAT = 0xc800, + + /* MDIO_DEV_VEND1 registers */ + AQ_FW_VERSION = 0x0020, + AQ_THERMAL_THR = 0xc421, + AQ_THERMAL1 = 0xc820, + AQ_THERMAL2 = 0xc821, + AQ_IFLAG_GLOBAL = 0xfc00, + AQ_IMASK_GLOBAL = 0xff00, +}; + +#define AQBIT(x) (1 << (0x##x)) +#define ADV_1G_FULL AQBIT(f) +#define ADV_1G_HALF AQBIT(e) +#define ADV_10G_FULL AQBIT(c) + +#define AQ_WRITE_REGS(phy, regs) do { \ + int i; \ + for (i = 0; i < ARRAY_SIZE(regs); i++) { \ + (void) mdio_write(phy, regs[i].mmd, regs[i].reg, regs[i].val); \ + } \ +} while (0) +#define AQ_READ_REGS(phy, regs) do { \ + unsigned i, v; \ + for (i = 0; i < ARRAY_SIZE(regs); i++) { \ + (void) mdio_read(phy, regs[i].mmd, regs[i].reg, &v); \ + } \ +} while (0) + +/* + * Return value is temperature in celcius, 0xffff for error or don't know. + */ +static int +aq100x_temperature(struct cphy *phy) +{ + unsigned int v; + + if (mdio_read(phy, MDIO_DEV_VEND1, AQ_THERMAL2, &v) || + v == 0xffff || (v & 1) != 1) + return (0xffff); + + if (mdio_read(phy, MDIO_DEV_VEND1, AQ_THERMAL1, &v)) + return (0xffff); + + return ((int)((signed char)(v >> 8))); +} + +static int +aq100x_set_defaults(struct cphy *phy) +{ + return mdio_write(phy, MDIO_DEV_VEND1, AQ_THERMAL_THR, 0x6c00); +} + +static int +aq100x_reset(struct cphy *phy, int wait) +{ + int err; + err = t3_phy_reset(phy, MDIO_DEV_PMA_PMD, wait); + if (!err) + err = aq100x_set_defaults(phy); + return (err); +} + +static int +aq100x_intr_enable(struct cphy *phy) +{ + struct { + int mmd; + int reg; + int val; + } imasks[] = { + {MDIO_DEV_VEND1, 0xd400, AQBIT(e)}, + {MDIO_DEV_VEND1, 0xff01, AQBIT(2)}, + {MDIO_DEV_VEND1, AQ_IMASK_GLOBAL, AQBIT(0)} + }; + + AQ_WRITE_REGS(phy, imasks); + + return (0); +} + +static int +aq100x_intr_disable(struct cphy *phy) +{ + struct { + int mmd; + int reg; + int val; + } imasks[] = { + {MDIO_DEV_VEND1, 0xd400, 0}, + {MDIO_DEV_VEND1, 0xff01, 0}, + {MDIO_DEV_VEND1, AQ_IMASK_GLOBAL, 0} + }; + + AQ_WRITE_REGS(phy, imasks); + + return (0); +} + +static int +aq100x_intr_clear(struct cphy *phy) +{ + struct { + int mmd; + int reg; + } iclr[] = { + {MDIO_DEV_VEND1, 0xcc00}, + {MDIO_DEV_VEND1, AQ_IMASK_GLOBAL} /* needed? */ + }; + + AQ_READ_REGS(phy, iclr); + + return (0); +} + +static int +aq100x_vendor_intr(struct cphy *phy, int *rc) +{ + int err; + unsigned int cause, v; + + err = mdio_read(phy, MDIO_DEV_VEND1, 0xfc01, &cause); + if (err) + return (err); + + if (cause & AQBIT(2)) { + err = mdio_read(phy, MDIO_DEV_VEND1, 0xcc00, &v); + if (err) + return (err); + + if (v & AQBIT(e)) { + CH_WARN(phy->adapter, "PHY%d: temperature is now %dC\n", + phy->addr, aq100x_temperature(phy)); + + t3_set_reg_field(phy->adapter, A_T3DBG_GPIO_EN, + phy->addr ? F_GPIO10_OUT_VAL : F_GPIO6_OUT_VAL, 0); + + *rc |= cphy_cause_alarm; + } + + cause &= ~4; + } + + if (cause) + CH_WARN(phy->adapter, "PHY%d: unhandled vendor interrupt" + " (0x%x)\n", phy->addr, cause); + + return (0); + +} + +static int +aq100x_intr_handler(struct cphy *phy) +{ + int err, rc = 0; + unsigned int cause; + + err = mdio_read(phy, MDIO_DEV_VEND1, AQ_IFLAG_GLOBAL, &cause); + if (err) + return (err); + + if (cause & AQBIT(0)) { + err = aq100x_vendor_intr(phy, &rc); + if (err) + return (err); + cause &= ~AQBIT(0); + } + + if (cause) + CH_WARN(phy->adapter, "PHY%d: unhandled interrupt (0x%x)\n", + phy->addr, cause); + + return (rc); +} + +static int +aq100x_power_down(struct cphy *phy, int off) +{ + int err, wait = 500; + unsigned int v; + + err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, BMCR_PDOWN, + off ? BMCR_PDOWN : 0); + if (err || off) + return (v); + + msleep(300); + do { + err = mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMCR, &v); + if (err) + return (err); + v &= BMCR_RESET; + if (v) + msleep(10); + } while (v && --wait); + if (v) { + CH_WARN(phy->adapter, "PHY%d: power-up timed out (0x%x).\n", + phy->addr, v); + return (ETIMEDOUT); + } + + return (0); +} + +static int +aq100x_autoneg_enable(struct cphy *phy) +{ + int err; + + err = aq100x_power_down(phy, 0); + if (!err) + err = t3_mdio_change_bits(phy, MDIO_DEV_ANEG, MII_BMCR, + BMCR_RESET, BMCR_ANENABLE | BMCR_ANRESTART); + + return (err); +} + +static int +aq100x_autoneg_restart(struct cphy *phy) +{ + return aq100x_autoneg_enable(phy); +} + +static int +aq100x_advertise(struct cphy *phy, unsigned int advertise_map) +{ + unsigned int adv; + int err; + + /* 10G advertisement */ + adv = 0; + if (advertise_map & ADVERTISED_10000baseT_Full) + adv |= ADV_10G_FULL; + err = t3_mdio_change_bits(phy, MDIO_DEV_ANEG, AQ_10G_CTRL, + ADV_10G_FULL, adv); + if (err) + return (err); + + /* 1G advertisement */ + adv = 0; + if (advertise_map & ADVERTISED_1000baseT_Full) + adv |= ADV_1G_FULL; + if (advertise_map & ADVERTISED_1000baseT_Half) + adv |= ADV_1G_HALF; + err = t3_mdio_change_bits(phy, MDIO_DEV_ANEG, AQ_1G_CTRL, + ADV_1G_FULL | ADV_1G_HALF, adv); + if (err) + return (err); + + /* 100M, pause advertisement */ + adv = 0; + if (advertise_map & ADVERTISED_100baseT_Half) + adv |= ADVERTISE_100HALF; + if (advertise_map & ADVERTISED_100baseT_Full) + adv |= ADVERTISE_100FULL; + if (advertise_map & ADVERTISED_Pause) + adv |= ADVERTISE_PAUSE_CAP; + if (advertise_map & ADVERTISED_Asym_Pause) + adv |= ADVERTISE_PAUSE_ASYM; + err = t3_mdio_change_bits(phy, MDIO_DEV_ANEG, AQ_100M_CTRL, 0xfe0, adv); + + return (err); +} + +static int +aq100x_set_loopback(struct cphy *phy, int mmd, int dir, int enable) +{ + return t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, + BMCR_LOOPBACK, enable ? BMCR_LOOPBACK : 0); +} + +static int +aq100x_set_speed_duplex(struct cphy *phy, int speed, int duplex) +{ + int err, set; + + if (speed == SPEED_100) + set = BMCR_SPEED100; + else if (speed == SPEED_1000) + set = BMCR_SPEED1000; + else if (speed == SPEED_10000) + set = BMCR_SPEED1000 | BMCR_SPEED100; + else + return (EINVAL); + + if (duplex != DUPLEX_FULL) + return (EINVAL); + + err = t3_mdio_change_bits(phy, MDIO_DEV_ANEG, MII_BMCR, + BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART, 0); + if (err) + return (err); + + err = t3_mdio_change_bits(phy, MDIO_DEV_PMA_PMD, MII_BMCR, + BMCR_SPEED1000 | BMCR_SPEED100, set); + if (err) + return (err); + + return (0); +} + +static int +aq100x_get_link_status(struct cphy *phy, int *link_ok, int *speed, int *duplex, + int *fc) +{ + int err; + unsigned int v, link = 0; + + err = mdio_read(phy, MDIO_DEV_PMA_PMD, AQ_LINK_STAT, &v); + if (err) + return (err); + if (v == 0xffff || !(v & 1)) + goto done; + + err = mdio_read(phy, MDIO_DEV_ANEG, MII_BMCR, &v); + if (err) + return (err); + if (v & 0x8000) + goto done; + if (v & BMCR_ANENABLE) { + + err = mdio_read(phy, MDIO_DEV_ANEG, 1, &v); + if (err) + return (err); + if ((v & 0x20) == 0) + goto done; + + err = mdio_read(phy, MDIO_DEV_ANEG, AQ_ANEG_STAT, &v); + if (err) + return (err); + + if (speed) { + switch (v & 0x6) { + case 0x6: *speed = SPEED_10000; + break; + case 0x4: *speed = SPEED_1000; + break; + case 0x2: *speed = SPEED_100; + break; + case 0x0: *speed = SPEED_10; + break; + } + } + + if (duplex) + *duplex = v & 1 ? DUPLEX_FULL : DUPLEX_HALF; + + if (fc) { + unsigned int lpa, adv; + err = mdio_read(phy, MDIO_DEV_ANEG, 0x13, &lpa); + if (!err) + err = mdio_read(phy, MDIO_DEV_ANEG, + AQ_100M_CTRL, &adv); + if (err) + return err; + + if (lpa & adv & ADVERTISE_PAUSE_CAP) + *fc = PAUSE_RX | PAUSE_TX; + else if (lpa & ADVERTISE_PAUSE_CAP && + lpa & ADVERTISE_PAUSE_ASYM && + adv & ADVERTISE_PAUSE_ASYM) + *fc = PAUSE_TX; + else if (lpa & ADVERTISE_PAUSE_ASYM && + adv & ADVERTISE_PAUSE_CAP) + *fc = PAUSE_RX; + else + *fc = 0; + } + + } else { + err = mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMCR, &v); + if (err) + return (err); + + v &= BMCR_SPEED1000 | BMCR_SPEED100; + if (speed) { + if (v == (BMCR_SPEED1000 | BMCR_SPEED100)) + *speed = SPEED_10000; + else if (v == BMCR_SPEED1000) + *speed = SPEED_1000; + else if (v == BMCR_SPEED100) + *speed = SPEED_100; + else + *speed = SPEED_10; + } + + if (duplex) + *duplex = DUPLEX_FULL; + } + + link = 1; +done: + if (link_ok) + *link_ok = link; + return (0); +} + +static struct cphy_ops aq100x_ops = { + .reset = aq100x_reset, + .intr_enable = aq100x_intr_enable, + .intr_disable = aq100x_intr_disable, + .intr_clear = aq100x_intr_clear, + .intr_handler = aq100x_intr_handler, + .autoneg_enable = aq100x_autoneg_enable, + .autoneg_restart = aq100x_autoneg_restart, + .advertise = aq100x_advertise, + .set_loopback = aq100x_set_loopback, + .set_speed_duplex = aq100x_set_speed_duplex, + .get_link_status = aq100x_get_link_status, + .power_down = aq100x_power_down, +}; + +int +t3_aq100x_phy_prep(pinfo_t *pinfo, int phy_addr, + const struct mdio_ops *mdio_ops) +{ + struct cphy *phy = &pinfo->phy; + unsigned int v, v2, gpio, wait; + int err; + adapter_t *adapter = pinfo->adapter; + + cphy_init(&pinfo->phy, adapter, pinfo, phy_addr, &aq100x_ops, mdio_ops, + SUPPORTED_1000baseT_Full | SUPPORTED_10000baseT_Full | + SUPPORTED_TP | SUPPORTED_Autoneg | SUPPORTED_AUI | + SUPPORTED_MISC_IRQ, "1000/10GBASE-T"); + + /* + * Hard reset the PHY. + */ + gpio = phy_addr ? F_GPIO10_OUT_VAL : F_GPIO6_OUT_VAL; + t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, gpio, 0); + msleep(1); + t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, gpio, gpio); + + /* + * Give it enough time to load the firmware and get ready for mdio. + */ + msleep(1000); + wait = 500; /* in 10ms increments */ + do { + err = mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMCR, &v); + if (err || v == 0xffff) { + + /* Allow prep_adapter to succeed when ffff is read */ + + CH_WARN(adapter, "PHY%d: reset failed (0x%x, 0x%x).\n", + phy_addr, err, v); + goto done; + } + + v &= BMCR_RESET; + if (v) + msleep(10); + } while (v && --wait); + if (v) { + CH_WARN(adapter, "PHY%d: reset timed out (0x%x).\n", + phy_addr, v); + + goto done; /* let prep_adapter succeed */ + } + + /* Firmware version check. */ + (void) mdio_read(phy, MDIO_DEV_VEND1, AQ_FW_VERSION, &v); + if (v < 0x115) + CH_WARN(adapter, "PHY%d: unknown firmware %d.%d\n", phy_addr, + v >> 8, v & 0xff); + + /* The PHY should start in really-low-power mode. */ + (void) mdio_read(phy, MDIO_DEV_PMA_PMD, MII_BMCR, &v); + if ((v & BMCR_PDOWN) == 0) + CH_WARN(adapter, "PHY%d does not start in low power mode.\n", + phy_addr); + + /* + * Verify XAUI and 1000-X settings, but let prep succeed no matter what. + */ + v = v2 = 0; + (void) mdio_read(phy, MDIO_DEV_XGXS, AQ_XAUI_RX_CFG, &v); + (void) mdio_read(phy, MDIO_DEV_XGXS, AQ_XAUI_TX_CFG, &v2); + if (v != 0x1b || v2 != 0x1b) + CH_WARN(adapter, "PHY%d: incorrect XAUI settings " + "(0x%x, 0x%x).\n", phy_addr, v, v2); + v = 0; + (void) mdio_read(phy, MDIO_DEV_XGXS, AQ_XAUI_KX_CFG, &v); + if ((v & 0xf) != 0xf) + CH_WARN(adapter, "PHY%d: incorrect 1000-X settings " + "(0x%x).\n", phy_addr, v); + + (void) aq100x_set_defaults(phy); +done: + return (err); +} diff --git a/sys/dev/cxgb/common/cxgb_common.h b/sys/dev/cxgb/common/cxgb_common.h index 09e78407307c..1d325aedd906 100644 --- a/sys/dev/cxgb/common/cxgb_common.h +++ b/sys/dev/cxgb/common/cxgb_common.h @@ -56,7 +56,11 @@ enum { }; enum { - SUPPORTED_IRQ = 1 << 24 + SUPPORTED_LINK_IRQ = 1 << 24, + /* skip 25 */ + SUPPORTED_MISC_IRQ = 1 << 26, + SUPPORTED_IRQ = (SUPPORTED_LINK_IRQ | SUPPORTED_MISC_IRQ), + POLL_LINK_1ST_TIME = 1 << 27 }; enum { /* adapter interrupt-maintained statistics */ @@ -93,7 +97,7 @@ enum { enum { FW_VERSION_MAJOR = 7, - FW_VERSION_MINOR = 1, + FW_VERSION_MINOR = 8, FW_VERSION_MICRO = 0 }; @@ -388,11 +392,9 @@ struct adapter_params { const struct adapter_info *info; -#ifdef CONFIG_CHELSIO_T3_CORE unsigned short mtus[NMTUS]; unsigned short a_wnd[NCCTRL_WIN]; unsigned short b_wnd[NCCTRL_WIN]; -#endif unsigned int nports; /* # of ethernet ports */ unsigned int chan_map; /* bitmap of in-use Tx channels */ unsigned int stats_update_period; /* MAC stats accumulation period */ @@ -484,6 +486,7 @@ struct cmac { u64 rx_mcnt; unsigned int toggle_cnt; unsigned int txen; + unsigned int was_reset; u64 rx_pause; struct mac_stats stats; }; @@ -526,6 +529,7 @@ enum { cphy_cause_link_change = 1, cphy_cause_fifo_error = 2, cphy_cause_module_change = 4, + cphy_cause_alarm = 8, }; /* PHY module types */ @@ -563,9 +567,10 @@ struct cphy_ops { struct cphy { u8 addr; /* PHY address */ u8 modtype; /* PHY module type */ - short priv; /* scratch pad */ + unsigned int priv; /* scratch pad */ unsigned int caps; /* PHY capabilities */ adapter_t *adapter; /* associated adapter */ + pinfo_t *pinfo; /* associated port */ const char *desc; /* PHY description */ unsigned long fifo_errors; /* FIFO over/under-flows */ const struct cphy_ops *ops; /* PHY operations */ @@ -589,7 +594,7 @@ static inline int mdio_write(struct cphy *phy, int mmd, int reg, } /* Convenience initializer */ -static inline void cphy_init(struct cphy *phy, adapter_t *adapter, +static inline void cphy_init(struct cphy *phy, adapter_t *adapter, pinfo_t *pinfo, int phy_addr, struct cphy_ops *phy_ops, const struct mdio_ops *mdio_ops, unsigned int caps, const char *desc) @@ -597,6 +602,7 @@ static inline void cphy_init(struct cphy *phy, adapter_t *adapter, phy->addr = (u8)phy_addr; phy->caps = caps; phy->adapter = adapter; + phy->pinfo = pinfo; phy->desc = desc; phy->ops = phy_ops; if (mdio_ops) { @@ -642,11 +648,7 @@ static inline int is_10G(const adapter_t *adap) static inline int is_offload(const adapter_t *adap) { -#if defined(CONFIG_CHELSIO_T3_CORE) return adap->params.offload; -#else - return 0; -#endif } static inline unsigned int core_ticks_per_usec(const adapter_t *adap) @@ -742,7 +744,7 @@ int t3_cim_ctl_blk_read(adapter_t *adap, unsigned int addr, unsigned int n, int t3_mc7_bd_read(struct mc7 *mc7, unsigned int start, unsigned int n, u64 *buf); -int t3_mac_reset(struct cmac *mac); +int t3_mac_init(struct cmac *mac); void t3b_pcs_reset(struct cmac *mac); void t3_mac_disable_exact_filters(struct cmac *mac); void t3_mac_enable_exact_filters(struct cmac *mac); @@ -764,7 +766,6 @@ void t3_mc5_intr_handler(struct mc5 *mc5); int t3_read_mc5_range(const struct mc5 *mc5, unsigned int start, unsigned int n, u32 *buf); -#ifdef CONFIG_CHELSIO_T3_CORE int t3_tp_set_coalescing_size(adapter_t *adap, unsigned int size, int psh); void t3_tp_set_max_rxsize(adapter_t *adap, unsigned int size); void t3_tp_get_mib_stats(adapter_t *adap, struct tp_mib_stats *tps); @@ -785,7 +786,6 @@ void t3_get_tx_sched(adapter_t *adap, unsigned int sched, unsigned int *kbps, void t3_read_pace_tbl(adapter_t *adap, unsigned int pace_vals[NTX_SCHED]); void t3_set_pace_tbl(adapter_t *adap, unsigned int *pace_vals, unsigned int start, unsigned int n); -#endif int t3_get_up_la(adapter_t *adapter, u32 *stopped, u32 *index, u32 *size, void *data); @@ -827,25 +827,33 @@ int t3_vsc7323_enable(adapter_t *adap, int port, int which); int t3_vsc7323_disable(adapter_t *adap, int port, int which); const struct mac_stats *t3_vsc7323_update_stats(struct cmac *mac); +int t3_i2c_read8(adapter_t *adapter, int chained, u8 *valp); +int t3_i2c_write8(adapter_t *adapter, int chained, u8 val); + int t3_mi1_read(adapter_t *adapter, int phy_addr, int mmd_addr, int reg_addr, unsigned int *valp); int t3_mi1_write(adapter_t *adapter, int phy_addr, int mmd_addr, int reg_addr, unsigned int val); -int t3_mv88e1xxx_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_mv88e1xxx_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); -int t3_vsc8211_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_vsc8211_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); -int t3_ael1002_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_vsc8211_fifo_depth(adapter_t *adap, unsigned int mtu, int port); +int t3_ael1002_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); -int t3_ael1006_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_ael1006_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); -int t3_ael2005_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_ael2005_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); -int t3_qt2045_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_ael2020_phy_prep(pinfo_t *pinfo, int phy_addr, + const struct mdio_ops *mdio_ops); +int t3_qt2045_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); -int t3_tn1010_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_tn1010_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); -int t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_xaui_direct_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops); +int t3_aq100x_phy_prep(pinfo_t *pinfo, int phy_addr, + const struct mdio_ops *mdio_ops); #endif /* __CHELSIO_COMMON_H */ diff --git a/sys/dev/cxgb/common/cxgb_mv88e1xxx.c b/sys/dev/cxgb/common/cxgb_mv88e1xxx.c index 7d39def10dad..6281ac8944d2 100644 --- a/sys/dev/cxgb/common/cxgb_mv88e1xxx.c +++ b/sys/dev/cxgb/common/cxgb_mv88e1xxx.c @@ -294,12 +294,13 @@ static struct cphy_ops mv88e1xxx_ops = { }; #endif -int t3_mv88e1xxx_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_mv88e1xxx_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { + struct cphy *phy = &pinfo->phy; int err; - cphy_init(phy, adapter, phy_addr, &mv88e1xxx_ops, mdio_ops, + cphy_init(phy, pinfo->adapter, pinfo, phy_addr, &mv88e1xxx_ops, mdio_ops, SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII | SUPPORTED_TP | SUPPORTED_IRQ, "10/100/1000BASE-T"); diff --git a/sys/dev/cxgb/common/cxgb_regs.h b/sys/dev/cxgb/common/cxgb_regs.h index dd8db9ac537e..644fa26a3395 100644 --- a/sys/dev/cxgb/common/cxgb_regs.h +++ b/sys/dev/cxgb/common/cxgb_regs.h @@ -280,6 +280,11 @@ $FreeBSD$ #define V_RSPQ7STARVED(x) ((x) << S_RSPQ7STARVED) #define F_RSPQ7STARVED V_RSPQ7STARVED(1U) +#define S_RSPQXSTARVED 0 +#define M_RSPQXSTARVED 0xff +#define V_RSPQXSTARVED(x) ((x) << S_RSPQXSTARVED) +#define G_RSPQXSTARVED(x) (((x) >> S_RSPQXSTARVED) & M_RSPQXSTARVED) + #define S_RSPQ0DISABLED 8 #define V_RSPQ0DISABLED(x) ((x) << S_RSPQ0DISABLED) #define F_RSPQ0DISABLED V_RSPQ0DISABLED(1U) @@ -376,6 +381,11 @@ $FreeBSD$ #define V_FL15EMPTY(x) ((x) << S_FL15EMPTY) #define F_FL15EMPTY V_FL15EMPTY(1U) +#define S_FLXEMPTY 16 +#define M_FLXEMPTY 0xffff +#define V_FLXEMPTY(x) ((x) << S_FLXEMPTY) +#define G_FLXEMPTY(x) (((x) >> S_FLXEMPTY) & M_FLXEMPTY) + #define A_SG_EGR_PRI_CNT 0x50 #define S_EGRERROPCODE 24 @@ -6235,10 +6245,28 @@ $FreeBSD$ #define V_ACK(x) ((x) << S_ACK) #define F_ACK V_ACK(1U) +#define S_I2C_DATA 0 +#define M_I2C_DATA 0xff +#define V_I2C_DATA(x) ((x) << S_I2C_DATA) +#define G_I2C_DATA(x) (((x) >> S_I2C_DATA) & M_I2C_DATA) + +#define S_I2C_BUSY 31 +#define V_I2C_BUSY(x) ((x) << S_I2C_BUSY) +#define F_I2C_BUSY V_I2C_BUSY(1U) + +#define S_I2C_ACK 30 +#define V_I2C_ACK(x) ((x) << S_I2C_ACK) +#define F_I2C_ACK V_I2C_ACK(1U) + #define S_I2C_CONT 1 #define V_I2C_CONT(x) ((x) << S_I2C_CONT) #define F_I2C_CONT V_I2C_CONT(1U) +#define S_I2C_RDWR 0 +#define V_I2C_RDWR(x) ((x) << S_I2C_RDWR) +#define F_I2C_READ V_I2C_RDWR(0U) +#define F_I2C_WRITE V_I2C_RDWR(1U) + /* registers for module MI1 */ #define MI1_BASE_ADDR 0x6b0 diff --git a/sys/dev/cxgb/common/cxgb_t3_hw.c b/sys/dev/cxgb/common/cxgb_t3_hw.c index 5d6711e46870..188e4670768c 100644 --- a/sys/dev/cxgb/common/cxgb_t3_hw.c +++ b/sys/dev/cxgb/common/cxgb_t3_hw.c @@ -188,6 +188,62 @@ int t3_mc7_bd_read(struct mc7 *mc7, unsigned int start, unsigned int n, return 0; } +/* + * Low-level I2C read and write routines. These simply read and write a + * single byte with the option of indicating a "continue" if another operation + * is to be chained. Generally most code will use higher-level routines to + * read and write to I2C Slave Devices. + */ +#define I2C_ATTEMPTS 100 + +/* + * Read an 8-bit value from the I2C bus. If the "chained" parameter is + * non-zero then a STOP bit will not be written after the read command. On + * error (the read timed out, etc.), a negative errno will be returned (e.g. + * -EAGAIN, etc.). On success, the 8-bit value read from the I2C bus is + * stored into the buffer *valp and the value of the I2C ACK bit is returned + * as a 0/1 value. + */ +int t3_i2c_read8(adapter_t *adapter, int chained, u8 *valp) +{ + int ret; + u32 opval; + MDIO_LOCK(adapter); + t3_write_reg(adapter, A_I2C_OP, + F_I2C_READ | (chained ? F_I2C_CONT : 0)); + ret = t3_wait_op_done_val(adapter, A_I2C_OP, F_I2C_BUSY, 0, + I2C_ATTEMPTS, 10, &opval); + if (ret >= 0) { + ret = ((opval & F_I2C_ACK) == F_I2C_ACK); + *valp = G_I2C_DATA(t3_read_reg(adapter, A_I2C_DATA)); + } + MDIO_UNLOCK(adapter); + return ret; +} + +/* + * Write an 8-bit value to the I2C bus. If the "chained" parameter is + * non-zero, then a STOP bit will not be written after the write command. On + * error (the write timed out, etc.), a negative errno will be returned (e.g. + * -EAGAIN, etc.). On success, the value of the I2C ACK bit is returned as a + * 0/1 value. + */ +int t3_i2c_write8(adapter_t *adapter, int chained, u8 val) +{ + int ret; + u32 opval; + MDIO_LOCK(adapter); + t3_write_reg(adapter, A_I2C_DATA, V_I2C_DATA(val)); + t3_write_reg(adapter, A_I2C_OP, + F_I2C_WRITE | (chained ? F_I2C_CONT : 0)); + ret = t3_wait_op_done_val(adapter, A_I2C_OP, F_I2C_BUSY, 0, + I2C_ATTEMPTS, 10, &opval); + if (ret >= 0) + ret = ((opval & F_I2C_ACK) == F_I2C_ACK); + MDIO_UNLOCK(adapter); + return ret; +} + /* * Initialize MI1. */ @@ -515,7 +571,12 @@ static struct adapter_info t3_adap_info[] = { F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI, - &mi1_mdio_ext_ops, "Chelsio N310" } + &mi1_mdio_ext_ops, "Chelsio T310" }, + { 1, 0, 0, + F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | + F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL, + { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI, + &mi1_mdio_ext_ops, "Chelsio N320E-G2" }, }; /* @@ -528,7 +589,7 @@ const struct adapter_info *t3_get_adapter_info(unsigned int id) } struct port_type_info { - int (*phy_prep)(struct cphy *phy, adapter_t *adapter, int phy_addr, + int (*phy_prep)(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *ops); }; @@ -542,6 +603,8 @@ static struct port_type_info port_types[] = { { t3_qt2045_phy_prep }, { t3_ael1006_phy_prep }, { t3_tn1010_phy_prep }, + { t3_aq100x_phy_prep }, + { t3_ael2020_phy_prep }, }; #define VPD_ENTRY(name, len) \ @@ -669,6 +732,125 @@ static unsigned int hex2int(unsigned char c) return isdigit(c) ? c - '0' : toupper(c) - 'A' + 10; } +/** + * get_desc_len - get the length of a vpd descriptor. + * @adapter: the adapter + * @offset: first byte offset of the vpd descriptor + * + * Retrieves the length of the small/large resource + * data type starting at offset. + */ +static int get_desc_len(adapter_t *adapter, u32 offset) +{ + u32 read_offset, tmp, shift, len = 0; + u8 tag, buf[8]; + int ret; + + read_offset = offset & 0xfffffffc; + shift = offset & 0x03; + + ret = t3_seeprom_read(adapter, read_offset, &tmp); + if (ret < 0) + return ret; + + *((u32 *)buf) = cpu_to_le32(tmp); + + tag = buf[shift]; + if (tag & 0x80) { + ret = t3_seeprom_read(adapter, read_offset + 4, &tmp); + if (ret < 0) + return ret; + + *((u32 *)(&buf[4])) = cpu_to_le32(tmp); + len = (buf[shift + 1] & 0xff) + + ((buf[shift+2] << 8) & 0xff00) + 3; + } else + len = (tag & 0x07) + 1; + + return len; +} + +/** + * is_end_tag - Check if a vpd tag is the end tag. + * @adapter: the adapter + * @offset: first byte offset of the tag + * + * Checks if the tag located at offset is the end tag. + */ +static int is_end_tag(adapter_t * adapter, u32 offset) +{ + u32 read_offset, shift, ret, tmp; + u8 buf[4]; + + read_offset = offset & 0xfffffffc; + shift = offset & 0x03; + + ret = t3_seeprom_read(adapter, read_offset, &tmp); + if (ret) + return ret; + *((u32 *)buf) = cpu_to_le32(tmp); + + if (buf[shift] == 0x78) + return 1; + else + return 0; +} + +/** + * t3_get_vpd_len - computes the length of a vpd structure + * @adapter: the adapter + * @vpd: contains the offset of first byte of vpd + * + * Computes the lentgh of the vpd structure starting at vpd->offset. + */ + +int t3_get_vpd_len(adapter_t * adapter, struct generic_vpd *vpd) +{ + u32 len=0, offset; + int inc, ret; + + offset = vpd->offset; + + while (offset < (vpd->offset + MAX_VPD_BYTES)) { + ret = is_end_tag(adapter, offset); + if (ret < 0) + return ret; + else if (ret == 1) + break; + + inc = get_desc_len(adapter, offset); + if (inc < 0) + return inc; + len += inc; + offset += inc; + } + return (len + 1); +} + +/** + * t3_read_vpd - reads the stream of bytes containing a vpd structure + * @adapter: the adapter + * @vpd: contains a buffer that would hold the stream of bytes + * + * Reads the vpd structure starting at vpd->offset into vpd->data, + * the length of the byte stream to read is vpd->len. + */ + +int t3_read_vpd(adapter_t *adapter, struct generic_vpd *vpd) +{ + u32 i, ret; + + for (i = 0; i < vpd->len; i += 4) { + ret = t3_seeprom_read(adapter, vpd->offset + i, + (u32 *) &(vpd->data[i])); + if (ret) + return ret; + } + + return 0; +} + + /** * get_vpd_params - read VPD parameters from VPD EEPROM * @adapter: adapter to read @@ -1313,11 +1495,6 @@ static void t3_clear_faults(adapter_t *adapter, int port_id) struct port_info *pi = adap2pinfo(adapter, port_id); struct cmac *mac = &pi->mac; - t3_set_reg_field(adapter, A_XGM_TXFIFO_CFG + mac->offset, - F_ENDROPPKT, 0); - t3_mac_enable(mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); - t3_set_reg_field(adapter, A_XGM_STAT_CTRL + mac->offset, F_CLRSTATS, 1); - if (adapter->params.nports <= 2) { t3_xgm_intr_disable(adapter, pi->port_id); t3_read_reg(adapter, A_XGM_INT_STATUS + mac->offset); @@ -1339,7 +1516,7 @@ static void t3_clear_faults(adapter_t *adapter, int port_id) */ void t3_link_changed(adapter_t *adapter, int port_id) { - int link_ok, speed, duplex, fc, link_fault, link_change; + int link_ok, speed, duplex, fc, link_fault; struct port_info *pi = adap2pinfo(adapter, port_id); struct cphy *phy = &pi->phy; struct cmac *mac = &pi->mac; @@ -1353,6 +1530,16 @@ void t3_link_changed(adapter_t *adapter, int port_id) phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc); + if (lc->requested_fc & PAUSE_AUTONEG) + fc &= lc->requested_fc; + else + fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX); + + /* Update mac speed before checking for link fault. */ + if (link_ok && speed >= 0 && lc->autoneg == AUTONEG_ENABLE && + (speed != lc->speed || duplex != lc->duplex || fc != lc->fc)) + t3_mac_set_speed_duplex_fc(mac, speed, duplex, fc); + /* * Check for link faults if any of these is true: * a) A link fault is suspected, and PHY says link ok @@ -1368,11 +1555,8 @@ void t3_link_changed(adapter_t *adapter, int port_id) pi->link_fault = LF_YES; } - /* Don't report link up or any other change */ + /* Don't report link up */ link_ok = 0; - speed = lc->speed; - duplex = lc->duplex; - fc = lc->fc; } else { /* clear faults here if this was a false alarm. */ if (pi->link_fault == LF_MAYBE && @@ -1383,37 +1567,29 @@ void t3_link_changed(adapter_t *adapter, int port_id) } } - if (lc->requested_fc & PAUSE_AUTONEG) - fc &= lc->requested_fc; - else - fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX); - if (link_ok == lc->link_ok && speed == lc->speed && duplex == lc->duplex && fc == lc->fc) return; /* nothing changed */ - link_change = link_ok != lc->link_ok; lc->link_ok = (unsigned char)link_ok; lc->speed = speed < 0 ? SPEED_INVALID : speed; lc->duplex = duplex < 0 ? DUPLEX_INVALID : duplex; + lc->fc = fc; if (link_ok) { /* down -> up, or up -> up with changed settings */ - if (link_change && adapter->params.rev > 0 && - uses_xaui(adapter)) { - t3b_pcs_reset(mac); + if (adapter->params.rev > 0 && uses_xaui(adapter)) { t3_write_reg(adapter, A_XGM_XAUI_ACT_CTRL + mac->offset, F_TXACTENABLE | F_RXEN); } - if (speed >= 0 && lc->autoneg == AUTONEG_ENABLE) { - /* Set MAC settings to match PHY. */ - t3_mac_set_speed_duplex_fc(mac, speed, duplex, fc); - lc->fc = (unsigned char)fc; - } - + t3_set_reg_field(adapter, A_XGM_TXFIFO_CFG + mac->offset, + F_ENDROPPKT, 0); + t3_mac_enable(mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); + t3_set_reg_field(adapter, A_XGM_STAT_CTRL + mac->offset, + F_CLRSTATS, 1); t3_clear_faults(adapter, port_id); } else { @@ -1450,7 +1626,9 @@ void t3_link_changed(adapter_t *adapter, int port_id) t3_write_reg(adapter, A_XGM_RX_CTRL + mac->offset, F_RXEN); } - t3_os_link_changed(adapter, port_id, link_ok, speed, duplex, fc); + t3_os_link_changed(adapter, port_id, link_ok, speed, duplex, fc, + mac->was_reset); + mac->was_reset = 0; } /** @@ -1478,6 +1656,7 @@ int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc) if (fc & PAUSE_RX) lc->advertising |= ADVERTISED_Pause; } + phy->ops->advertise(phy, lc->advertising); if (lc->autoneg == AUTONEG_DISABLE) { @@ -1490,7 +1669,7 @@ int t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc) phy->ops->set_speed_duplex(phy, lc->speed, lc->duplex); /* PR 5666. Power phy up when doing an ifup */ if (!is_10G(phy->adapter)) - phy->ops->power_down(phy, 0); + phy->ops->power_down(phy, 0); } else phy->ops->autoneg_enable(phy); } else { @@ -2020,6 +2199,10 @@ int t3_phy_intr_handler(adapter_t *adapter) p->phy.fifo_errors++; if (phy_cause & cphy_cause_module_change) t3_os_phymod_changed(adapter, i); + if (phy_cause & cphy_cause_alarm) + CH_WARN(adapter, "Operation affected due to " + "adverse environment. Check the spec " + "sheet for corrective action."); } } @@ -3080,7 +3263,6 @@ static void tp_set_timers(adapter_t *adap, unsigned int core_clk) #undef SECONDS } -#ifdef CONFIG_CHELSIO_T3_CORE /** * t3_tp_set_coalescing_size - set receive coalescing size * @adap: the adapter @@ -3383,7 +3565,6 @@ int t3_set_proto_sram(adapter_t *adap, const u8 *data) } return 0; } -#endif /** * t3_config_trace_filter - configure one of the tracing filters @@ -3871,7 +4052,7 @@ static void config_pcie(adapter_t *adap) { 201, 321, 258, 450, 834, 1602 } }; - u16 val; + u16 val, devid; unsigned int log2_width, pldsize; unsigned int fst_trn_rx, fst_trn_tx, acklat, rpllmt; @@ -3880,6 +4061,18 @@ static void config_pcie(adapter_t *adap) &val); pldsize = (val & PCI_EXP_DEVCTL_PAYLOAD) >> 5; + /* + * Gen2 adapter pcie bridge compatibility requires minimum + * Max_Read_Request_size + */ + t3_os_pci_read_config_2(adap, 0x2, &devid); + if (devid == 0x37) { + t3_os_pci_write_config_2(adap, + adap->params.pci.pcie_cap_addr + PCI_EXP_DEVCTL, + val & ~PCI_EXP_DEVCTL_READRQ & ~PCI_EXP_DEVCTL_PAYLOAD); + pldsize = 0; + } + t3_os_pci_read_config_2(adap, adap->params.pci.pcie_cap_addr + PCI_EXP_LNKCTL, &val); @@ -3934,7 +4127,7 @@ int t3_init_hw(adapter_t *adapter, u32 fw_params) goto out_err; if (adapter->params.nports > 2) - t3_mac_reset(&adap2pinfo(adapter, 0)->mac); + t3_mac_init(&adap2pinfo(adapter, 0)->mac); if (vpd->mclk) { partition_mem(adapter, &adapter->params.tp); @@ -3955,14 +4148,12 @@ int t3_init_hw(adapter_t *adapter, u32 fw_params) if (tp_init(adapter, &adapter->params.tp)) goto out_err; -#ifdef CONFIG_CHELSIO_T3_CORE t3_tp_set_coalescing_size(adapter, min(adapter->params.sge.max_pkt_size, MAX_RX_COALESCING_LEN), 1); t3_tp_set_max_rxsize(adapter, min(adapter->params.sge.max_pkt_size, 16384U)); ulp_config(adapter, &adapter->params.tp); -#endif if (is_pcie(adapter)) config_pcie(adapter); else @@ -4098,15 +4289,25 @@ static void __devinit mc7_prep(adapter_t *adapter, struct mc7 *mc7, void mac_prep(struct cmac *mac, adapter_t *adapter, int index) { + u16 devid; + mac->adapter = adapter; mac->multiport = adapter->params.nports > 2; if (mac->multiport) { mac->ext_port = (unsigned char)index; mac->nucast = 8; - index = 0; } else mac->nucast = 1; + /* Gen2 adapter uses VPD xauicfg[] to notify driver which MAC + is connected to each port, its suppose to be using xgmac0 for both ports + */ + t3_os_pci_read_config_2(adapter, 0x2, &devid); + + if (mac->multiport || + (!adapter->params.vpd.xauicfg[1] && (devid==0x37))) + index = 0; + mac->offset = (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR) * index; if (adapter->params.rev == 0 && uses_xaui(adapter)) { @@ -4238,7 +4439,7 @@ int __devinit t3_prep_adapter(adapter_t *adapter, adapter->params.info = ai; adapter->params.nports = ai->nports0 + ai->nports1; - adapter->params.chan_map = !!ai->nports0 | (!!ai->nports1 << 1); + adapter->params.chan_map = (!!ai->nports0) | (!!ai->nports1 << 1); adapter->params.rev = t3_read_reg(adapter, A_PL_REV); /* @@ -4303,10 +4504,8 @@ int __devinit t3_prep_adapter(adapter_t *adapter, adapter->params.mc5.nroutes = 0; t3_mc5_prep(adapter, &adapter->mc5, MC5_MODE_144_BIT); -#ifdef CONFIG_CHELSIO_T3_CORE init_mtus(adapter->params.mtus); init_cong_ctrl(adapter->params.a_wnd, adapter->params.b_wnd); -#endif } early_hw_init(adapter, ai); @@ -4336,7 +4535,7 @@ int __devinit t3_prep_adapter(adapter_t *adapter, if (j >= ARRAY_SIZE(adapter->params.vpd.port_type)) return -EINVAL; } - ret = pti->phy_prep(&p->phy, adapter, ai->phy_base_addr + j, + ret = pti->phy_prep(p, ai->phy_base_addr + j, ai->mdio_ops); if (ret) return ret; @@ -4408,7 +4607,7 @@ int t3_reinit_adapter(adapter_t *adap) if (j >= ARRAY_SIZE(adap->params.vpd.port_type)) return -EINVAL; } - ret = pti->phy_prep(&p->phy, adap, p->phy.addr, NULL); + ret = pti->phy_prep(p, p->phy.addr, NULL); if (ret) return ret; p->phy.ops->power_down(&p->phy, 1); diff --git a/sys/dev/cxgb/common/cxgb_tn1010.c b/sys/dev/cxgb/common/cxgb_tn1010.c index 623f784a9eaa..45758288d2ce 100644 --- a/sys/dev/cxgb/common/cxgb_tn1010.c +++ b/sys/dev/cxgb/common/cxgb_tn1010.c @@ -209,10 +209,10 @@ static struct cphy_ops tn1010_ops = { }; #endif -int t3_tn1010_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +int t3_tn1010_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { - cphy_init(phy, adapter, phy_addr, &tn1010_ops, mdio_ops, + cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &tn1010_ops, mdio_ops, SUPPORTED_1000baseT_Full | SUPPORTED_10000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_AUI | SUPPORTED_TP, "1000/10GBASE-T"); diff --git a/sys/dev/cxgb/common/cxgb_version.h b/sys/dev/cxgb/common/cxgb_version.h deleted file mode 100644 index 3f4a652fb426..000000000000 --- a/sys/dev/cxgb/common/cxgb_version.h +++ /dev/null @@ -1,41 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -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. Neither the name of the Chelsio Corporation 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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$ - -***************************************************************************/ -/* - * Note that although this driver doesn't contain all of the functionality of the Linux driver - * the common code is 99% the same. Hence we keep the same version number to indicate what linux - * driver the common code corresponds to. - */ -#ifndef __CHELSIO_VERSION_H -#define __CHELSIO_VERSION_H -#define DRV_DESC "Chelsio T3 Network Driver" -#define DRV_NAME "cxgb" -#define DRV_VERSION "1.0.133" -#endif diff --git a/sys/dev/cxgb/common/cxgb_vsc8211.c b/sys/dev/cxgb/common/cxgb_vsc8211.c index 004f2f877262..9d8385973299 100644 --- a/sys/dev/cxgb/common/cxgb_vsc8211.c +++ b/sys/dev/cxgb/common/cxgb_vsc8211.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); enum { VSC8211_SIGDET_CTRL = 19, VSC8211_EXT_CTRL = 23, + VSC8211_PHY_CTRL = 24, VSC8211_INTR_ENABLE = 25, VSC8211_INTR_STATUS = 26, VSC8211_LED_CTRL = 27, @@ -375,13 +376,62 @@ static struct cphy_ops vsc8211_fiber_ops = { }; #endif -int t3_vsc8211_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr, +#define VSC8211_PHY_CTRL 24 + +#define S_VSC8211_TXFIFODEPTH 7 +#define M_VSC8211_TXFIFODEPTH 0x7 +#define V_VSC8211_TXFIFODEPTH(x) ((x) << S_VSC8211_TXFIFODEPTH) +#define G_VSC8211_TXFIFODEPTH(x) (((x) >> S_VSC8211_TXFIFODEPTH) & M_VSC8211_TXFIFODEPTH) + +#define S_VSC8211_RXFIFODEPTH 4 +#define M_VSC8211_RXFIFODEPTH 0x7 +#define V_VSC8211_RXFIFODEPTH(x) ((x) << S_VSC8211_RXFIFODEPTH) +#define G_VSC8211_RXFIFODEPTH(x) (((x) >> S_VSC8211_RXFIFODEPTH) & M_VSC8211_RXFIFODEPTH) + +int t3_vsc8211_fifo_depth(adapter_t *adap, unsigned int mtu, int port) +{ + /* TX FIFO Depth set bits 9:7 to 100 (IEEE mode) */ + unsigned int val = 4; + unsigned int currentregval; + unsigned int regval; + int err; + + /* Retrieve the port info structure from adater_t */ + struct port_info *portinfo = adap2pinfo(adap, port); + + /* What phy is this */ + struct cphy *phy = &portinfo->phy; + + /* Read the current value of the PHY control Register */ + err = mdio_read(phy, 0, VSC8211_PHY_CTRL, ¤tregval); + + if (err) + return err; + + /* IEEE mode supports up to 1518 bytes */ + /* mtu does not contain the header + FCS (18 bytes) */ + if (mtu > 1500) + /* + * If using a packet size > 1500 set TX FIFO Depth bits + * 9:7 to 011 (Jumbo packet mode) + */ + val = 3; + + regval = V_VSC8211_TXFIFODEPTH(val) | V_VSC8211_RXFIFODEPTH(val) | + (currentregval & ~V_VSC8211_TXFIFODEPTH(M_VSC8211_TXFIFODEPTH) & + ~V_VSC8211_RXFIFODEPTH(M_VSC8211_RXFIFODEPTH)); + + return mdio_write(phy, 0, VSC8211_PHY_CTRL, regval); +} + +int t3_vsc8211_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { + struct cphy *phy = &pinfo->phy; int err; unsigned int val; - cphy_init(phy, adapter, phy_addr, &vsc8211_ops, mdio_ops, + cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &vsc8211_ops, mdio_ops, SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII | SUPPORTED_TP | SUPPORTED_IRQ, "10/100/1000BASE-T"); diff --git a/sys/dev/cxgb/common/cxgb_xgmac.c b/sys/dev/cxgb/common/cxgb_xgmac.c index 677f349b0d50..853da35ddfe5 100644 --- a/sys/dev/cxgb/common/cxgb_xgmac.c +++ b/sys/dev/cxgb/common/cxgb_xgmac.c @@ -41,6 +41,28 @@ static inline int macidx(const struct cmac *mac) return mac->offset / (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR); } +/* + * Returns a reasonable A_XGM_RESET_CTRL value for the mac specified. + */ +static inline int xgm_reset_ctrl(const struct cmac *mac) +{ + adapter_t *adap = mac->adapter; + int val = F_MAC_RESET_ | F_XGMAC_STOP_EN; + + if (is_10G(adap)) { + int cfg = t3_read_reg(adap, A_XGM_PORT_CFG + mac->offset); + + val |= F_PCS_RESET_; + if (G_PORTSPEED(cfg) != 3) /* not running at 10G */ + val |= F_XG2G_RESET_; + } else if (uses_xaui(adap)) + val |= F_PCS_RESET_ | F_XG2G_RESET_; + else + val |= F_RGMII_RESET_ | F_XG2G_RESET_; + + return (val); +} + static void xaui_serdes_reset(struct cmac *mac) { static const unsigned int clear[] = { @@ -81,12 +103,12 @@ void t3b_pcs_reset(struct cmac *mac) } /** - * t3_mac_reset - reset a MAC - * @mac: the MAC to reset + * t3_mac_init - initialize a MAC + * @mac: the MAC to initialize * - * Reset the given MAC. + * Initialize the given MAC. */ -int t3_mac_reset(struct cmac *mac) +int t3_mac_init(struct cmac *mac) { static struct addr_val_pair mac_reset_avp[] = { { A_XGM_TX_CTRL, 0 }, @@ -138,7 +160,7 @@ int t3_mac_reset(struct cmac *mac) if (mac->multiport) { t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + oft, - MAX_FRAME_SIZE - 4); + V_RXMAXPKTSIZE(MAX_FRAME_SIZE - 4)); t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + oft, 0, F_DISPREAMBLE); t3_set_reg_field(adap, A_XGM_RX_CFG + oft, 0, F_COPYPREAMBLE | @@ -154,13 +176,7 @@ int t3_mac_reset(struct cmac *mac) V_RXMAXFRAMERSIZE(M_RXMAXFRAMERSIZE), V_RXMAXFRAMERSIZE(MAX_FRAME_SIZE) | F_RXENFRAMER); - val = F_MAC_RESET_ | F_XGMAC_STOP_EN; - if (!mac->multiport) - val |= F_XG2G_RESET_; - if (uses_xaui(adap)) - val |= F_PCS_RESET_; - else - val |= F_RGMII_RESET_; + val = xgm_reset_ctrl(mac); t3_write_reg(adap, A_XGM_RESET_CTRL + oft, val); (void) t3_read_reg(adap, A_XGM_RESET_CTRL + oft); /* flush */ if ((val & F_PCS_RESET_) && adap->params.rev) { @@ -172,16 +188,17 @@ int t3_mac_reset(struct cmac *mac) return 0; } -static int t3b2_mac_reset(struct cmac *mac) +static int t3_mac_reset(struct cmac *mac, int portspeed) { - u32 val; + u32 val, store_mps; adapter_t *adap = mac->adapter; unsigned int oft = mac->offset; int idx = macidx(mac); unsigned int store; /* Stop egress traffic to xgm*/ - if (!macidx(mac)) + store_mps = t3_read_reg(adap, A_MPS_CFG); + if (!idx) t3_set_reg_field(adap, A_MPS_CFG, F_PORT0ACTIVE, 0); else t3_set_reg_field(adap, A_MPS_CFG, F_PORT1ACTIVE, 0); @@ -198,7 +215,7 @@ static int t3b2_mac_reset(struct cmac *mac) /* Store A_TP_TX_DROP_CFG_CH0 */ t3_write_reg(adap, A_TP_PIO_ADDR, A_TP_TX_DROP_CFG_CH0 + idx); - store = t3_read_reg(adap, A_TP_TX_DROP_CFG_CH0 + idx); + store = t3_read_reg(adap, A_TP_PIO_DATA); msleep(10); @@ -209,44 +226,55 @@ static int t3b2_mac_reset(struct cmac *mac) /* Check for xgm Rx fifo empty */ /* Increased loop count to 1000 from 5 cover 1G and 100Mbps case */ if (t3_wait_op_done(adap, A_XGM_RX_MAX_PKT_SIZE_ERR_CNT + oft, - 0x80000000, 1, 1000, 2)) { - CH_ERR(adap, "MAC %d Rx fifo drain failed\n", - macidx(mac)); + 0x80000000, 1, 1000, 2) && portspeed < 0) { + CH_ERR(adap, "MAC %d Rx fifo drain failed\n", idx); return -1; } - t3_write_reg(adap, A_XGM_RESET_CTRL + oft, 0); /*MAC in reset*/ - (void) t3_read_reg(adap, A_XGM_RESET_CTRL + oft); /* flush */ + if (portspeed >= 0) { + u32 intr = t3_read_reg(adap, A_XGM_INT_ENABLE + oft); - val = F_MAC_RESET_; - if (is_10G(adap)) - val |= F_PCS_RESET_; - else if (uses_xaui(adap)) - val |= F_PCS_RESET_ | F_XG2G_RESET_; - else - val |= F_RGMII_RESET_ | F_XG2G_RESET_; - t3_write_reg(adap, A_XGM_RESET_CTRL + oft, val); - (void) t3_read_reg(adap, A_XGM_RESET_CTRL + oft); /* flush */ - if ((val & F_PCS_RESET_) && adap->params.rev) { - msleep(1); - t3b_pcs_reset(mac); + /* + * safespeedchange: wipes out pretty much all XGMAC registers. + */ + + t3_set_reg_field(adap, A_XGM_PORT_CFG + oft, + V_PORTSPEED(M_PORTSPEED) | F_SAFESPEEDCHANGE, + portspeed | F_SAFESPEEDCHANGE); + (void) t3_read_reg(adap, A_XGM_PORT_CFG + oft); + t3_set_reg_field(adap, A_XGM_PORT_CFG + oft, + F_SAFESPEEDCHANGE, 0); + (void) t3_read_reg(adap, A_XGM_PORT_CFG + oft); + t3_mac_init(mac); + + t3_write_reg(adap, A_XGM_INT_ENABLE + oft, intr); + } else { + + t3_write_reg(adap, A_XGM_RESET_CTRL + oft, 0); /*MAC in reset*/ + (void) t3_read_reg(adap, A_XGM_RESET_CTRL + oft); /* flush */ + + val = xgm_reset_ctrl(mac); + t3_write_reg(adap, A_XGM_RESET_CTRL + oft, val); + (void) t3_read_reg(adap, A_XGM_RESET_CTRL + oft); /* flush */ + if ((val & F_PCS_RESET_) && adap->params.rev) { + msleep(1); + t3b_pcs_reset(mac); + } + t3_write_reg(adap, A_XGM_RX_CFG + oft, + F_DISPAUSEFRAMES | F_EN1536BFRAMES | + F_RMFCS | F_ENJUMBO | F_ENHASHMCAST ); } - t3_write_reg(adap, A_XGM_RX_CFG + oft, - F_DISPAUSEFRAMES | F_EN1536BFRAMES | - F_RMFCS | F_ENJUMBO | F_ENHASHMCAST ); /* Restore the DROP_CFG */ t3_write_reg(adap, A_TP_PIO_ADDR, A_TP_TX_DROP_CFG_CH0 + idx); t3_write_reg(adap, A_TP_PIO_DATA, store); /* Resume egress traffic to xgm */ - if (!macidx(mac)) - t3_set_reg_field(adap, A_MPS_CFG, 0, F_PORT0ACTIVE); - else - t3_set_reg_field(adap, A_MPS_CFG, 0, F_PORT1ACTIVE); + t3_set_reg_field(adap, A_MPS_CFG, F_PORT1ACTIVE | F_PORT0ACTIVE, + store_mps); /* Set: re-enable NIC traffic */ - t3_set_reg_field(adap, A_MPS_CFG, F_ENFORCEPKT, 1); + t3_set_reg_field(adap, A_MPS_CFG, F_ENFORCEPKT, F_ENFORCEPKT); return 0; } @@ -409,6 +437,8 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu) int ipg; unsigned int thres, v, reg; adapter_t *adap = mac->adapter; + unsigned port_type = adap->params.vpd.port_type[macidx(mac)]; + unsigned int orig_mtu=mtu; /* * MAX_FRAME_SIZE inludes header + FCS, mtu doesn't. The HW max @@ -422,6 +452,14 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu) if (mac->multiport) return t3_vsc7323_set_mtu(adap, mtu - 4, mac->ext_port); + /* Modify the TX and RX fifo depth only if the card has a vsc8211 phy */ + if (port_type == 2) { + int err = t3_vsc8211_fifo_depth(adap,orig_mtu,macidx(mac)); + + if (err) + return err; + } + if (adap->params.rev >= T3_REV_B2 && (t3_read_reg(adap, A_XGM_RX_CTRL + mac->offset) & F_RXEN)) { t3_mac_disable_exact_filters(mac); @@ -470,7 +508,7 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu) thres /= 10; thres = mtu > thres ? (mtu - thres + 7) / 8 : 0; thres = max(thres, 8U); /* need at least 8 */ - ipg = (adap->params.rev == T3_REV_C) ? 0 : 1; + ipg = (port_type == 9 || adap->params.rev != T3_REV_C) ? 1 : 0; t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + mac->offset, V_TXFIFOTHRESH(M_TXFIFOTHRESH) | V_TXIPG(M_TXIPG), V_TXFIFOTHRESH(thres) | V_TXIPG(ipg)); @@ -507,10 +545,12 @@ int t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex, int fc) if (duplex >= 0 && duplex != DUPLEX_FULL) return -EINVAL; if (mac->multiport) { + u32 rx_max_pkt_size = + G_RXMAXPKTSIZE(t3_read_reg(adap, + A_XGM_RX_MAX_PKT_SIZE + oft)); val = t3_read_reg(adap, A_XGM_RXFIFO_CFG + oft); val &= ~V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM); - val |= V_RXFIFOPAUSEHWM(rx_fifo_hwm(t3_read_reg(adap, - A_XGM_RX_MAX_PKT_SIZE + oft)) / 8); + val |= V_RXFIFOPAUSEHWM(rx_fifo_hwm(rx_max_pkt_size) / 8); t3_write_reg(adap, A_XGM_RXFIFO_CFG + oft, val); t3_set_reg_field(adap, A_XGM_TX_CFG + oft, F_TXPAUSEEN, @@ -529,15 +569,27 @@ int t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex, int fc) else return -EINVAL; - t3_set_reg_field(adap, A_XGM_PORT_CFG + oft, - V_PORTSPEED(M_PORTSPEED), val); + if (!uses_xaui(adap)) /* T302 */ + t3_set_reg_field(adap, A_XGM_PORT_CFG + oft, + V_PORTSPEED(M_PORTSPEED), val); + else { + u32 old = t3_read_reg(adap, A_XGM_PORT_CFG + oft); + + if ((old & V_PORTSPEED(M_PORTSPEED)) != val) { + t3_mac_reset(mac, val); + mac->was_reset = 1; + } + } } val = t3_read_reg(adap, A_XGM_RXFIFO_CFG + oft); val &= ~V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM); - if (fc & PAUSE_TX) - val |= V_RXFIFOPAUSEHWM(rx_fifo_hwm(t3_read_reg(adap, - A_XGM_RX_MAX_PKT_SIZE + oft)) / 8); + if (fc & PAUSE_TX) { + u32 rx_max_pkt_size = + G_RXMAXPKTSIZE(t3_read_reg(adap, + A_XGM_RX_MAX_PKT_SIZE + oft)); + val |= V_RXFIFOPAUSEHWM(rx_fifo_hwm(rx_max_pkt_size) / 8); + } t3_write_reg(adap, A_XGM_RXFIFO_CFG + oft, val); t3_set_reg_field(adap, A_XGM_TX_CFG + oft, F_TXPAUSEEN, @@ -618,18 +670,12 @@ int t3_mac_disable(struct cmac *mac, int which) mac->txen = 0; } if (which & MAC_DIRECTION_RX) { - int val = F_MAC_RESET_; + int val = xgm_reset_ctrl(mac); t3_set_reg_field(mac->adapter, A_XGM_RESET_CTRL + mac->offset, F_PCS_RESET_, 0); msleep(100); t3_write_reg(adap, A_XGM_RX_CTRL + mac->offset, 0); - if (is_10G(adap)) - val |= F_PCS_RESET_; - else if (uses_xaui(adap)) - val |= F_PCS_RESET_ | F_XG2G_RESET_; - else - val |= F_RGMII_RESET_ | F_XG2G_RESET_; t3_write_reg(mac->adapter, A_XGM_RESET_CTRL + mac->offset, val); } return 0; @@ -650,10 +696,15 @@ int t3b2_mac_watchdog_task(struct cmac *mac) tx_xcnt = 1; /* By default tx_xcnt is making progress*/ tx_tcnt = mac->tx_tcnt; /* If tx_mcnt is progressing ignore tx_tcnt*/ if (tx_mcnt == mac->tx_mcnt && mac->rx_pause == s->rx_pause) { + u32 cfg, active, enforcepkt; + tx_xcnt = (G_TXSPI4SOPCNT(t3_read_reg(adap, A_XGM_TX_SPI4_SOP_EOP_CNT + mac->offset))); - if (tx_xcnt == 0) { + cfg = t3_read_reg(adap, A_MPS_CFG); + active = macidx(mac) ? cfg & F_PORT1ACTIVE : cfg & F_PORT0ACTIVE; + enforcepkt = cfg & F_ENFORCEPKT; + if (active && enforcepkt && (tx_xcnt == 0)) { t3_write_reg(adap, A_TP_PIO_ADDR, A_TP_TX_DROP_CNT_CH0 + macidx(mac)); tx_tcnt = (G_TXDROPCNTCH0RCVD(t3_read_reg(adap, @@ -691,7 +742,7 @@ out: t3_read_reg(adap, A_XGM_TX_CTRL + mac->offset); /* flush */ mac->toggle_cnt++; } else if (status == 2) { - t3b2_mac_reset(mac); + t3_mac_reset(mac, -1); mac->toggle_cnt = 0; } return status; diff --git a/sys/dev/cxgb/cxgb_adapter.h b/sys/dev/cxgb/cxgb_adapter.h index 2b25a34090c7..d4a66d68911d 100644 --- a/sys/dev/cxgb/cxgb_adapter.h +++ b/sys/dev/cxgb/cxgb_adapter.h @@ -46,6 +46,7 @@ $FreeBSD$ #include #include #include +#include #include #include @@ -58,10 +59,6 @@ $FreeBSD$ #include #include -#ifdef LRO_SUPPORTED -#include -#endif - struct adapter; struct sge_qset; extern int cxgb_debug; @@ -136,7 +133,6 @@ enum { }; #define IS_DOOMED(p) (p->flags & DOOMED) #define SET_DOOMED(p) do {p->flags |= DOOMED;} while (0) -#define DOOMED(p) (p->flags & DOOMED) #define IS_BUSY(sc) (sc->flags & CXGB_BUSY) #define SET_BUSY(sc) do {sc->flags |= CXGB_BUSY;} while (0) #define CLR_BUSY(sc) do {sc->flags &= ~CXGB_BUSY;} while (0) @@ -157,12 +153,10 @@ enum { TXQ_ETH = 0, #define WR_LEN (WR_FLITS * 8) #define PIO_LEN (WR_LEN - sizeof(struct cpl_tx_pkt_lso)) -#ifdef LRO_SUPPORTED struct lro_state { unsigned short enabled; struct lro_ctrl ctrl; }; -#endif #define RX_BUNDLE_SIZE 8 @@ -285,9 +279,7 @@ enum { struct sge_qset { struct sge_rspq rspq; struct sge_fl fl[SGE_RXQ_PER_SET]; -#ifdef LRO_SUPPORTED struct lro_state lro; -#endif struct sge_txq txq[SGE_TXQ_PER_SET]; uint32_t txq_stopped; /* which Tx queues are stopped */ uint64_t port_stats[SGE_PSTAT_MAX]; @@ -361,8 +353,6 @@ struct adapter { struct callout cxgb_tick_ch; struct callout sge_timer_ch; - unsigned int check_task_cnt; - /* Register lock for use by the hardware layer */ struct mtx mdio_lock; struct mtx elmer_lock; @@ -500,7 +490,7 @@ int t3_os_find_pci_capability(adapter_t *adapter, int cap); int t3_os_pci_save_state(struct adapter *adapter); int t3_os_pci_restore_state(struct adapter *adapter); void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, - int speed, int duplex, int fc); + int speed, int duplex, int fc, int mac_was_reset); void t3_os_phymod_changed(struct adapter *adap, int port_id); void t3_sge_err_intr_handler(adapter_t *adapter); int t3_offload_tx(struct t3cdev *, struct mbuf *); diff --git a/sys/dev/cxgb/cxgb_config.h b/sys/dev/cxgb/cxgb_config.h deleted file mode 100644 index 79af94ca8e00..000000000000 --- a/sys/dev/cxgb/cxgb_config.h +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************** - -Copyright (c) 2007-2008, Chelsio Inc. -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. Neither the name of the Chelsio Corporation 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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$ - -***************************************************************************/ -#ifndef _CXGB_CONFIG_H_ -#define _CXGB_CONFIG_H_ - -#define CONFIG_CHELSIO_T3_CORE - -#if __FreeBSD_version > 800053 -#define IFNET_MULTIQUEUE -#endif -#endif diff --git a/sys/dev/cxgb/cxgb_main.c b/sys/dev/cxgb/cxgb_main.c index 596609b89d95..5493b75d348f 100644 --- a/sys/dev/cxgb/cxgb_main.c +++ b/sys/dev/cxgb/cxgb_main.c @@ -84,11 +84,9 @@ __FBSDID("$FreeBSD$"); static int cxgb_setup_interrupts(adapter_t *); static void cxgb_teardown_interrupts(adapter_t *); -static int cxgb_begin_op(struct port_info *, const char *); -static int cxgb_begin_detach(struct port_info *); -static int cxgb_end_op(struct port_info *); static void cxgb_init(void *); -static int cxgb_init_synchronized(struct port_info *); +static int cxgb_init_locked(struct port_info *); +static int cxgb_uninit_locked(struct port_info *); static int cxgb_uninit_synchronized(struct port_info *); static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t); static int cxgb_media_change(struct ifnet *); @@ -116,7 +114,7 @@ static int cxgb_get_regs_len(void); static int offload_open(struct port_info *pi); static void touch_bars(device_t dev); static int offload_close(struct t3cdev *tdev); -int t3_detect_link_fault(adapter_t *adapter, int port_id); +static void cxgb_update_mac_settings(struct port_info *p); static device_method_t cxgb_controller_methods[] = { DEVMETHOD(device_probe, cxgb_controller_probe), @@ -291,7 +289,9 @@ struct cxgb_ident { {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"}, {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"}, {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"}, - {PCI_VENDOR_ID_CHELSIO, 0x0035, 6, "N310E"}, + {PCI_VENDOR_ID_CHELSIO, 0x0035, 6, "T3C10"}, + {PCI_VENDOR_ID_CHELSIO, 0x0036, 3, "S320E-CR"}, + {PCI_VENDOR_ID_CHELSIO, 0x0037, 7, "N320E-G2"}, {0, 0, 0, NULL} }; @@ -353,7 +353,6 @@ cxgb_controller_probe(device_t dev) const struct adapter_info *ai; char *ports, buf[80]; int nports; - struct adapter *sc = device_get_softc(dev); ai = cxgb_get_adapter_info(dev); if (ai == NULL) @@ -365,9 +364,7 @@ cxgb_controller_probe(device_t dev) else ports = "ports"; - snprintf(buf, sizeof(buf), "%s %sNIC, rev: %d nports: %d %s", - ai->desc, is_offload(sc) ? "R" : "", - sc->params.rev, nports, ports); + snprintf(buf, sizeof(buf), "%s, %d %s", ai->desc, nports, ports); device_set_desc_copy(dev, buf); return (BUS_PROBE_DEFAULT); } @@ -379,11 +376,7 @@ cxgb_controller_probe(device_t dev) static int upgrade_fw(adapter_t *sc) { -#ifdef FIRMWARE_LATEST const struct firmware *fw; -#else - struct firmware *fw; -#endif int status; if ((fw = firmware_get(FW_FNAME)) == NULL) { @@ -393,7 +386,8 @@ upgrade_fw(adapter_t *sc) device_printf(sc->dev, "updating firmware on card\n"); status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize); - device_printf(sc->dev, "firmware update returned %s %d\n", (status == 0) ? "success" : "fail", status); + device_printf(sc->dev, "firmware update returned %s %d\n", + status == 0 ? "success" : "fail", status); firmware_put(fw, FIRMWARE_UNLOAD); @@ -435,9 +429,7 @@ cxgb_controller_attach(device_t dev) int i, error = 0; uint32_t vers; int port_qsets = 1; -#ifdef MSI_SUPPORTED int msi_needed, reg; -#endif char buf[80]; sc = device_get_softc(dev); @@ -445,10 +437,6 @@ cxgb_controller_attach(device_t dev) sc->msi_count = 0; ai = cxgb_get_adapter_info(dev); - /* - * XXX not really related but a recent addition - */ -#ifdef MSI_SUPPORTED /* find the PCIe link width and set max read request to 4KB*/ if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) { uint16_t lnk, pectl; @@ -466,7 +454,7 @@ cxgb_controller_attach(device_t dev) "PCIe x%d Link, expect reduced performance\n", sc->link_width); } -#endif + touch_bars(dev); pci_enable_busmaster(dev); /* @@ -508,6 +496,9 @@ cxgb_controller_attach(device_t dev) sc->bh = rman_get_bushandle(sc->regs_res); sc->mmio_len = rman_get_size(sc->regs_res); + for (i = 0; i < MAX_NPORTS; i++) + sc->port[i].adapter = sc; + if (t3_prep_adapter(sc, ai, 1) < 0) { printf("prep adapter failed\n"); error = ENODEV; @@ -518,8 +509,6 @@ cxgb_controller_attach(device_t dev) * back to MSI. If that fails, then try falling back to the legacy * interrupt pin model. */ -#ifdef MSI_SUPPORTED - sc->msix_regs_rid = 0x20; if ((msi_allowed >= 2) && (sc->msix_regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, @@ -565,20 +554,14 @@ cxgb_controller_attach(device_t dev) device_printf(dev, "using MSI interrupts\n"); } } -#endif if (sc->msi_count == 0) { device_printf(dev, "using line interrupts\n"); sc->cxgb_intr = t3b_intr; } /* Create a private taskqueue thread for handling driver events */ -#ifdef TASKQUEUE_CURRENT sc->tq = taskqueue_create("cxgb_taskq", M_NOWAIT, taskqueue_thread_enqueue, &sc->tq); -#else - sc->tq = taskqueue_create_fast("cxgb_taskq", M_NOWAIT, - taskqueue_thread_enqueue, &sc->tq); -#endif if (sc->tq == NULL) { device_printf(dev, "failed to allocate controller task queue\n"); goto out; @@ -660,8 +643,8 @@ cxgb_controller_attach(device_t dev) G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers), G_FW_VERSION_MICRO(vers)); - snprintf(buf, sizeof(buf), "%s\t E/C: %s S/N: %s", - ai->desc, + snprintf(buf, sizeof(buf), "%s %sNIC\t E/C: %s S/N: %s", + ai->desc, is_offload(sc) ? "R" : "", sc->params.vpd.ec, sc->params.vpd.sn); device_set_desc_copy(dev, buf); @@ -764,7 +747,6 @@ cxgb_free(struct adapter *sc) * Release all interrupt resources. */ cxgb_teardown_interrupts(sc); -#ifdef MSI_SUPPORTED if (sc->flags & (USING_MSI | USING_MSIX)) { device_printf(sc->dev, "releasing msi message(s)\n"); pci_release_msi(sc->dev); @@ -776,7 +758,6 @@ cxgb_free(struct adapter *sc) bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid, sc->msix_regs_res); } -#endif /* * Free the adapter's taskqueue. @@ -910,11 +891,8 @@ cxgb_setup_interrupts(adapter_t *sc) sc->irq_rid = 0; } else { err = bus_setup_intr(sc->dev, sc->irq_res, - INTR_MPSAFE | INTR_TYPE_NET, -#ifdef INTR_FILTERS - NULL, -#endif - sc->cxgb_intr, sc, &sc->intr_tag); + INTR_MPSAFE | INTR_TYPE_NET, NULL, + sc->cxgb_intr, sc, &sc->intr_tag); if (err) { device_printf(sc->dev, @@ -943,10 +921,7 @@ cxgb_setup_interrupts(adapter_t *sc) } err = bus_setup_intr(sc->dev, res, INTR_MPSAFE | INTR_TYPE_NET, -#ifdef INTR_FILTERS - NULL, -#endif - t3_intr_msix, &sc->sge.qs[i], &tag); + NULL, t3_intr_msix, &sc->sge.qs[i], &tag); if (err) { device_printf(sc->dev, "Cannot set up interrupt " "for message %d (%d)\n", rid, err); @@ -996,26 +971,10 @@ cxgb_makedev(struct port_info *pi) return (0); } -#ifndef LRO_SUPPORTED -#ifdef IFCAP_LRO -#undef IFCAP_LRO -#endif -#define IFCAP_LRO 0x0 -#endif - -#ifdef TSO_SUPPORTED -#define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO) -/* Don't enable TSO6 yet */ -#define CXGB_CAP_ENABLE (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO4 | IFCAP_JUMBO_MTU | IFCAP_LRO) -#else -#define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_JUMBO_MTU) -/* Don't enable TSO6 yet */ -#define CXGB_CAP_ENABLE (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_JUMBO_MTU) -#define IFCAP_TSO4 0x0 -#define IFCAP_TSO6 0x0 -#define CSUM_TSO 0x0 -#endif - +#define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \ + IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \ + IFCAP_VLAN_HWTSO) +#define CXGB_CAP_ENABLE (CXGB_CAP & ~IFCAP_TSO6) static int cxgb_port_attach(device_t dev) @@ -1024,8 +983,7 @@ cxgb_port_attach(device_t dev) struct ifnet *ifp; int err; struct adapter *sc; - - + p = device_get_softc(dev); sc = p->adapter; snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d", @@ -1039,9 +997,6 @@ cxgb_port_attach(device_t dev) return (ENOMEM); } - /* - * Note that there is currently no watchdog timer. - */ if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_init = cxgb_init; ifp->if_softc = p; @@ -1049,24 +1004,20 @@ cxgb_port_attach(device_t dev) ifp->if_ioctl = cxgb_ioctl; ifp->if_start = cxgb_start; - - ifp->if_timer = 0; /* Disable ifnet watchdog */ - ifp->if_watchdog = NULL; - ifp->if_snd.ifq_drv_maxlen = cxgb_snd_queue_len; IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); IFQ_SET_READY(&ifp->if_snd); - ifp->if_hwassist = ifp->if_capabilities = ifp->if_capenable = 0; - ifp->if_capabilities |= CXGB_CAP; - ifp->if_capenable |= CXGB_CAP_ENABLE; - ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO); + ifp->if_capabilities = CXGB_CAP; + ifp->if_capenable = CXGB_CAP_ENABLE; + ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO; + /* - * disable TSO on 4-port - it isn't supported by the firmware yet + * Disable TSO on 4-port - it isn't supported by the firmware. */ - if (p->adapter->params.nports > 2) { - ifp->if_capabilities &= ~(IFCAP_TSO4 | IFCAP_TSO6); - ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_TSO6); + if (sc->params.nports > 2) { + ifp->if_capabilities &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO); + ifp->if_capenable &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO); ifp->if_hwassist &= ~CSUM_TSO; } @@ -1074,11 +1025,10 @@ cxgb_port_attach(device_t dev) ifp->if_transmit = cxgb_transmit; ifp->if_qflush = cxgb_qflush; - /* - * Only default to jumbo frames on 10GigE - */ - if (p->adapter->params.nports <= 2) +#ifdef DEFAULT_JUMBO + if (sc->params.nports <= 2) ifp->if_mtu = ETHERMTU_JUMBO; +#endif if ((err = cxgb_makedev(p)) != 0) { printf("makedev failed %d\n", err); return (err); @@ -1111,7 +1061,14 @@ cxgb_port_detach(device_t dev) p = device_get_softc(dev); sc = p->adapter; - cxgb_begin_detach(p); + /* Tell cxgb_ioctl and if_init that the port is going away */ + ADAPTER_LOCK(sc); + SET_DOOMED(p); + wakeup(&sc->flags); + while (IS_BUSY(sc)) + mtx_sleep(&sc->flags, &sc->lock, 0, "cxgbdtch", 0); + SET_BUSY(sc); + ADAPTER_UNLOCK(sc); if (p->port_cdev != NULL) destroy_dev(p->port_cdev); @@ -1131,7 +1088,10 @@ cxgb_port_detach(device_t dev) if_free(p->ifp); p->ifp = NULL; - cxgb_end_op(p); + ADAPTER_LOCK(sc); + CLR_BUSY(sc); + wakeup_one(&sc->flags); + ADAPTER_UNLOCK(sc); return (0); } @@ -1222,8 +1182,8 @@ t3_os_pci_restore_state(struct adapter *sc) /** * t3_os_link_changed - handle link status changes - * @adapter: the adapter associated with the link change - * @port_id: the port index whose limk status has changed + * @sc: the adapter associated with the link change + * @port_id: the port index whose link status has changed * @link_status: the new status of the link * @speed: the new speed setting * @duplex: the new duplex setting @@ -1235,7 +1195,7 @@ t3_os_pci_restore_state(struct adapter *sc) */ void t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed, - int duplex, int fc) + int duplex, int fc, int mac_was_reset) { struct port_info *pi = &adapter->port[port_id]; struct ifnet *ifp = pi->ifp; @@ -1243,6 +1203,13 @@ t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed, /* no race with detach, so ifp should always be good */ KASSERT(ifp, ("%s: if detached.", __func__)); + /* Reapply mac settings if they were lost due to a reset */ + if (mac_was_reset) { + PORT_LOCK(pi); + cxgb_update_mac_settings(pi); + PORT_UNLOCK(pi); + } + if (link_status) { ifp->if_baudrate = IF_Mbps(speed); if_link_state_change(ifp, LINK_STATE_UP); @@ -1570,11 +1537,7 @@ bind_qsets(adapter_t *sc) static void update_tpeeprom(struct adapter *adap) { -#ifdef FIRMWARE_LATEST const struct firmware *tpeeprom; -#else - struct firmware *tpeeprom; -#endif uint32_t version; unsigned int major, minor; @@ -1632,11 +1595,7 @@ release_tpeeprom: static int update_tpsram(struct adapter *adap) { -#ifdef FIRMWARE_LATEST const struct firmware *tpsram; -#else - struct firmware *tpsram; -#endif int ret; char rev, name[32]; @@ -1679,12 +1638,13 @@ cxgb_up(struct adapter *sc) { int err = 0; - ADAPTER_LOCK_ASSERT_NOTOWNED(sc); KASSERT(sc->open_device_map == 0, ("%s: device(s) already open (%x)", __func__, sc->open_device_map)); if ((sc->flags & FULL_INIT_DONE) == 0) { + ADAPTER_LOCK_ASSERT_NOTOWNED(sc); + if ((sc->flags & FW_UPTODATE) == 0) if ((err = upgrade_fw(sc))) goto out; @@ -1746,8 +1706,6 @@ out: static void cxgb_down(struct adapter *sc) { - ADAPTER_LOCK_ASSERT_NOTOWNED(sc); - t3_sge_stop(sc); t3_intr_disable(sc); } @@ -1758,8 +1716,6 @@ offload_open(struct port_info *pi) struct adapter *sc = pi->adapter; struct t3cdev *tdev = &sc->tdev; - ADAPTER_LOCK_ASSERT_NOTOWNED(sc); - setbit(&sc->open_device_map, OFFLOAD_DEVMAP_BIT); t3_tp_set_offload_mode(sc, 1); @@ -1793,95 +1749,6 @@ offload_close(struct t3cdev *tdev) return (0); } -/* - * Begin a synchronized operation. If this call succeeds, it is guaranteed that - * no one will remove the port or its ifp from underneath the caller. Caller is - * also granted exclusive access to open_device_map. - * - * operation here means init, uninit, detach, and ioctl service. - * - * May fail. - * EINTR (ctrl-c pressed during ifconfig for example). - * ENXIO (port is about to detach - due to kldunload for example). - */ -int -cxgb_begin_op(struct port_info *p, const char *wmsg) -{ - int rc = 0; - struct adapter *sc = p->adapter; - - ADAPTER_LOCK(sc); - - while (!IS_DOOMED(p) && IS_BUSY(sc)) { - if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, wmsg, 0)) { - rc = EINTR; - goto done; - } - } - - if (IS_DOOMED(p)) - rc = ENXIO; - else if (!IS_BUSY(sc)) - SET_BUSY(sc); - else { - KASSERT(0, ("%s: port %d, p->flags = %x , sc->flags = %x", - __func__, p->port_id, p->flags, sc->flags)); - rc = EDOOFUS; - } - -done: - ADAPTER_UNLOCK(sc); - return (rc); -} - -/* - * End a synchronized operation. Read comment block above cxgb_begin_op. - */ -int -cxgb_end_op(struct port_info *p) -{ - struct adapter *sc = p->adapter; - - ADAPTER_LOCK(sc); - KASSERT(IS_BUSY(sc), ("%s: not busy.", __func__)); - CLR_BUSY(sc); - wakeup_one(&sc->flags); - ADAPTER_UNLOCK(sc); - - return (0); -} - -/* - * Prepare for port detachment. Detach is a special kind of synchronized - * operation. Also read comment before cxgb_begin_op. - */ -static int -cxgb_begin_detach(struct port_info *p) -{ - struct adapter *sc = p->adapter; - - /* - * Inform those waiting for this port that it is going to be destroyed - * and they should not continue further. (They'll return with ENXIO). - */ - ADAPTER_LOCK(sc); - SET_DOOMED(p); - wakeup(&sc->flags); - ADAPTER_UNLOCK(sc); - - /* - * Wait for in-progress operations. - */ - ADAPTER_LOCK(sc); - while (IS_BUSY(sc)) { - mtx_sleep(&sc->flags, &sc->lock, 0, "cxgbdtch", 0); - } - SET_BUSY(sc); - ADAPTER_UNLOCK(sc); - - return (0); -} - /* * if_init for cxgb ports. */ @@ -1889,25 +1756,49 @@ static void cxgb_init(void *arg) { struct port_info *p = arg; + struct adapter *sc = p->adapter; - if (cxgb_begin_op(p, "cxgbinit")) - return; - - cxgb_init_synchronized(p); - cxgb_end_op(p); + ADAPTER_LOCK(sc); + cxgb_init_locked(p); /* releases adapter lock */ + ADAPTER_LOCK_ASSERT_NOTOWNED(sc); } static int -cxgb_init_synchronized(struct port_info *p) +cxgb_init_locked(struct port_info *p) { struct adapter *sc = p->adapter; struct ifnet *ifp = p->ifp; struct cmac *mac = &p->mac; - int i, rc; + int i, rc = 0, may_sleep = 0; + + ADAPTER_LOCK_ASSERT_OWNED(sc); + + while (!IS_DOOMED(p) && IS_BUSY(sc)) { + if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbinit", 0)) { + rc = EINTR; + goto done; + } + } + if (IS_DOOMED(p)) { + rc = ENXIO; + goto done; + } + KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__)); + + /* + * The code that runs during one-time adapter initialization can sleep + * so it's important not to hold any locks across it. + */ + may_sleep = sc->flags & FULL_INIT_DONE ? 0 : 1; + + if (may_sleep) { + SET_BUSY(sc); + ADAPTER_UNLOCK(sc); + } if (sc->open_device_map == 0) { if ((rc = cxgb_up(sc)) != 0) - return (rc); + goto done; if (is_offload(sc) && !ofld_disable && offload_open(p)) log(LOG_WARNING, @@ -1915,9 +1806,14 @@ cxgb_init_synchronized(struct port_info *p) } PORT_LOCK(p); + if (isset(&sc->open_device_map, p->port_id) && + (ifp->if_drv_flags & IFF_DRV_RUNNING)) { + PORT_UNLOCK(p); + goto done; + } t3_port_intr_enable(sc, p->port_id); if (!mac->multiport) - t3_mac_reset(mac); + t3_mac_init(mac); cxgb_update_mac_settings(p); t3_link_start(&p->phy, mac, &p->link_config); t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX); @@ -1938,7 +1834,48 @@ cxgb_init_synchronized(struct port_info *p) /* all ok */ setbit(&sc->open_device_map, p->port_id); - return (0); +done: + if (may_sleep) { + ADAPTER_LOCK(sc); + KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__)); + CLR_BUSY(sc); + wakeup_one(&sc->flags); + } + ADAPTER_UNLOCK(sc); + return (rc); +} + +static int +cxgb_uninit_locked(struct port_info *p) +{ + struct adapter *sc = p->adapter; + int rc; + + ADAPTER_LOCK_ASSERT_OWNED(sc); + + while (!IS_DOOMED(p) && IS_BUSY(sc)) { + if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbunin", 0)) { + rc = EINTR; + goto done; + } + } + if (IS_DOOMED(p)) { + rc = ENXIO; + goto done; + } + KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__)); + SET_BUSY(sc); + ADAPTER_UNLOCK(sc); + + rc = cxgb_uninit_synchronized(p); + + ADAPTER_LOCK(sc); + KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__)); + CLR_BUSY(sc); + wakeup_one(&sc->flags); +done: + ADAPTER_UNLOCK(sc); + return (rc); } /* @@ -1950,6 +1887,11 @@ cxgb_uninit_synchronized(struct port_info *pi) struct adapter *sc = pi->adapter; struct ifnet *ifp = pi->ifp; + /* + * taskqueue_drain may cause a deadlock if the adapter lock is held. + */ + ADAPTER_LOCK_ASSERT_NOTOWNED(sc); + /* * Clear this port's bit from the open device map, and then drain all * the tasks that can access/manipulate this port's port_info or ifp. @@ -1977,14 +1919,14 @@ cxgb_uninit_synchronized(struct port_info *pi) t3_set_reg_field(sc, A_XGM_RXFIFO_CFG + pi->mac.offset, V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM), 0); - DELAY(100); + DELAY(100 * 1000); /* Wait for TXFIFO empty */ t3_wait_op_done(sc, A_XGM_TXFIFO_CFG + pi->mac.offset, F_TXFIFO_EMPTY, 1, 20, 5); - DELAY(100); - t3_mac_disable(&pi->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); + DELAY(100 * 1000); + t3_mac_disable(&pi->mac, MAC_DIRECTION_RX); pi->phy.ops->power_down(&pi->phy, 1); @@ -1992,7 +1934,7 @@ cxgb_uninit_synchronized(struct port_info *pi) PORT_UNLOCK(pi); pi->link_config.link_ok = 0; - t3_os_link_changed(sc, pi->port_id, 0, 0, 0, 0); + t3_os_link_changed(sc, pi->port_id, 0, 0, 0, 0, 0); if ((sc->open_device_map & PORT_MASK) == 0) offload_close(&sc->tdev); @@ -2003,7 +1945,6 @@ cxgb_uninit_synchronized(struct port_info *pi) return (0); } -#ifdef LRO_SUPPORTED /* * Mark lro enabled or disabled in all qsets for this port */ @@ -2021,25 +1962,26 @@ cxgb_set_lro(struct port_info *p, int enabled) } return (0); } -#endif static int cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data) { struct port_info *p = ifp->if_softc; + struct adapter *sc = p->adapter; struct ifreq *ifr = (struct ifreq *)data; - int flags, error = 0, mtu, handle_unsynchronized = 0; + int flags, error = 0, mtu; uint32_t mask; - if ((error = cxgb_begin_op(p, "cxgbioct")) != 0) - return (error); - - /* - * Only commands that should be handled within begin-op/end-op are - * serviced in this switch statement. See handle_unsynchronized. - */ switch (command) { case SIOCSIFMTU: + ADAPTER_LOCK(sc); + error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); + if (error) { +fail: + ADAPTER_UNLOCK(sc); + return (error); + } + mtu = ifr->ifr_mtu; if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO)) { error = EINVAL; @@ -2049,68 +1991,96 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data) cxgb_update_mac_settings(p); PORT_UNLOCK(p); } - + ADAPTER_UNLOCK(sc); break; case SIOCSIFFLAGS: + ADAPTER_LOCK(sc); + if (IS_DOOMED(p)) { + error = ENXIO; + goto fail; + } if (ifp->if_flags & IFF_UP) { if (ifp->if_drv_flags & IFF_DRV_RUNNING) { flags = p->if_flags; if (((ifp->if_flags ^ flags) & IFF_PROMISC) || ((ifp->if_flags ^ flags) & IFF_ALLMULTI)) { + if (IS_BUSY(sc)) { + error = EBUSY; + goto fail; + } PORT_LOCK(p); cxgb_update_mac_settings(p); PORT_UNLOCK(p); } + ADAPTER_UNLOCK(sc); } else - error = cxgb_init_synchronized(p); + error = cxgb_init_locked(p); p->if_flags = ifp->if_flags; } else if (ifp->if_drv_flags & IFF_DRV_RUNNING) - error = cxgb_uninit_synchronized(p); - + error = cxgb_uninit_locked(p); + else + ADAPTER_UNLOCK(sc); + + ADAPTER_LOCK_ASSERT_NOTOWNED(sc); break; case SIOCADDMULTI: case SIOCDELMULTI: + ADAPTER_LOCK(sc); + error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); + if (error) + goto fail; + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { PORT_LOCK(p); cxgb_update_mac_settings(p); PORT_UNLOCK(p); } + ADAPTER_UNLOCK(sc); break; case SIOCSIFCAP: + ADAPTER_LOCK(sc); + error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0); + if (error) + goto fail; + mask = ifr->ifr_reqcap ^ ifp->if_capenable; if (mask & IFCAP_TXCSUM) { - if (IFCAP_TXCSUM & ifp->if_capenable) { - ifp->if_capenable &= ~(IFCAP_TXCSUM|IFCAP_TSO4); - ifp->if_hwassist &= ~(CSUM_TCP | CSUM_UDP - | CSUM_IP | CSUM_TSO); - } else { - ifp->if_capenable |= IFCAP_TXCSUM; - ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP - | CSUM_IP); + ifp->if_capenable ^= IFCAP_TXCSUM; + ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP); + + if (IFCAP_TSO & ifp->if_capenable && + !(IFCAP_TXCSUM & ifp->if_capenable)) { + ifp->if_capenable &= ~IFCAP_TSO; + ifp->if_hwassist &= ~CSUM_TSO; + if_printf(ifp, + "tso disabled due to -txcsum.\n"); } } - if (mask & IFCAP_RXCSUM) { + if (mask & IFCAP_RXCSUM) ifp->if_capenable ^= IFCAP_RXCSUM; - } if (mask & IFCAP_TSO4) { - if (IFCAP_TSO4 & ifp->if_capenable) { - ifp->if_capenable &= ~IFCAP_TSO4; - ifp->if_hwassist &= ~CSUM_TSO; - } else if (IFCAP_TXCSUM & ifp->if_capenable) { - ifp->if_capenable |= IFCAP_TSO4; - ifp->if_hwassist |= CSUM_TSO; + ifp->if_capenable ^= IFCAP_TSO4; + + if (IFCAP_TSO & ifp->if_capenable) { + if (IFCAP_TXCSUM & ifp->if_capenable) + ifp->if_hwassist |= CSUM_TSO; + else { + ifp->if_capenable &= ~IFCAP_TSO; + ifp->if_hwassist &= ~CSUM_TSO; + if_printf(ifp, + "enable txcsum first.\n"); + error = EAGAIN; + } } else - error = EINVAL; + ifp->if_hwassist &= ~CSUM_TSO; } -#ifdef LRO_SUPPORTED if (mask & IFCAP_LRO) { ifp->if_capenable ^= IFCAP_LRO; /* Safe to do this even if cxgb_up not called yet */ cxgb_set_lro(p, ifp->if_capenable & IFCAP_LRO); } -#endif if (mask & IFCAP_VLAN_HWTAGGING) { ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; if (ifp->if_drv_flags & IFF_DRV_RUNNING) { @@ -2127,34 +2097,22 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data) PORT_UNLOCK(p); } } - if (mask & IFCAP_VLAN_HWCSUM) { + if (mask & IFCAP_VLAN_HWTSO) + ifp->if_capenable ^= IFCAP_VLAN_HWTSO; + if (mask & IFCAP_VLAN_HWCSUM) ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; - } #ifdef VLAN_CAPABILITIES VLAN_CAPABILITIES(ifp); #endif + ADAPTER_UNLOCK(sc); + break; + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &p->media, command); break; default: - handle_unsynchronized = 1; - break; - } - - /* - * We don't want to call anything outside the driver while inside a - * begin-op/end-op block. If it calls us back (eg. ether_ioctl may - * call cxgb_init) we may deadlock if the state is already marked busy. - * - * XXX: this probably opens a small race window with kldunload... - */ - cxgb_end_op(p); - - /* The IS_DOOMED check is racy, we're clutching at straws here */ - if (handle_unsynchronized && !IS_DOOMED(p)) { - if (command == SIOCSIFMEDIA || command == SIOCGIFMEDIA) - error = ifmedia_ioctl(ifp, ifr, &p->media, command); - else - error = ether_ioctl(ifp, command, data); + error = ether_ioctl(ifp, command, data); } return (error); @@ -2335,6 +2293,19 @@ cxgb_ext_intr_handler(void *arg, int count) ADAPTER_UNLOCK(sc); } +static inline int +link_poll_needed(struct port_info *p) +{ + struct cphy *phy = &p->phy; + + if (phy->caps & POLL_LINK_1ST_TIME) { + p->phy.caps &= ~POLL_LINK_1ST_TIME; + return (1); + } + + return (p->link_fault || !(phy->caps & SUPPORTED_LINK_IRQ)); +} + static void check_link_status(adapter_t *sc) { @@ -2346,7 +2317,7 @@ check_link_status(adapter_t *sc) if (!isset(&sc->open_device_map, p->port_id)) continue; - if (p->link_fault || !(p->phy.caps & SUPPORTED_IRQ)) + if (link_poll_needed(p)) t3_link_changed(sc, i); } } @@ -2366,7 +2337,8 @@ check_t3b2_mac(struct adapter *sc) struct ifnet *ifp = p->ifp; #endif - if (!isset(&sc->open_device_map, p->port_id)) + if (!isset(&sc->open_device_map, p->port_id) || p->link_fault || + !p->link_config.link_ok) continue; KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING, @@ -2414,7 +2386,6 @@ cxgb_tick_handler(void *arg, int count) return; check_link_status(sc); - sc->check_task_cnt++; if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map) check_t3b2_mac(sc); diff --git a/sys/dev/cxgb/cxgb_offload.h b/sys/dev/cxgb/cxgb_offload.h index dccefdcbb702..a8b858e71031 100644 --- a/sys/dev/cxgb/cxgb_offload.h +++ b/sys/dev/cxgb/cxgb_offload.h @@ -33,8 +33,6 @@ $FreeBSD$ #ifndef _CXGB_OFFLOAD_H #define _CXGB_OFFLOAD_H -#include -#include #include #include diff --git a/sys/dev/cxgb/cxgb_osdep.h b/sys/dev/cxgb/cxgb_osdep.h index 6108214c0e70..5dc256dd23a6 100644 --- a/sys/dev/cxgb/cxgb_osdep.h +++ b/sys/dev/cxgb/cxgb_osdep.h @@ -41,13 +41,11 @@ $FreeBSD$ #include -#define CONFIG_CHELSIO_T3_CORE -#include - #ifndef _CXGB_OSDEP_H_ #define _CXGB_OSDEP_H_ typedef struct adapter adapter_t; +typedef struct port_info pinfo_t; struct sge_rspq; enum { @@ -90,33 +88,6 @@ struct t3_mbuf_hdr { #define MT_DONTFREE 128 -#if __FreeBSD_version > 700030 -#define INTR_FILTERS -#define FIRMWARE_LATEST -#endif - -#if ((__FreeBSD_version > 602103) && (__FreeBSD_version < 700000)) -#define FIRMWARE_LATEST -#endif - -#if __FreeBSD_version > 700000 -#define MSI_SUPPORTED -#define TSO_SUPPORTED -#define VLAN_SUPPORTED -#define TASKQUEUE_CURRENT -#else -#define if_name(ifp) (ifp)->if_xname -#define M_SANITY(m, n) -#endif - -#if __FreeBSD_version >= 701000 -#include "opt_inet.h" -#ifdef INET -#define LRO_SUPPORTED -#define TOE_SUPPORTED -#endif -#endif - #if __FreeBSD_version < 800054 #if defined (__GNUC__) #if #cpu(i386) || defined __i386 || defined i386 || defined __i386__ || #cpu(x86_64) || defined __x86_64__ @@ -247,10 +218,10 @@ static const int debug_flags = DBG_RX; #define MII_CTRL1000 MII_100T2CR #define ADVERTISE_PAUSE_CAP ANAR_FC -#define ADVERTISE_PAUSE_ASYM ANAR_X_PAUSE_ASYM -#define ADVERTISE_PAUSE ANAR_X_PAUSE_SYM -#define ADVERTISE_1000HALF ANAR_X_HD -#define ADVERTISE_1000FULL ANAR_X_FD +#define ADVERTISE_PAUSE_ASYM 0x800 +#define ADVERTISE_PAUSE ANAR_FC +#define ADVERTISE_1000HALF 0x100 +#define ADVERTISE_1000FULL 0x200 #define ADVERTISE_10FULL ANAR_10_FD #define ADVERTISE_10HALF ANAR_10 #define ADVERTISE_100FULL ANAR_TX_FD @@ -266,17 +237,18 @@ static const int debug_flags = DBG_RX; #define ADVERTISE_NPAGE ANAR_NP -/* Standard PCI Extended Capaibilities definitions */ -#define PCI_CAP_ID_VPD 0x03 -#define PCI_VPD_ADDR 2 +/* Standard PCI Extended Capabilities definitions */ +#define PCI_CAP_ID_VPD PCIY_VPD +#define PCI_VPD_ADDR PCIR_VPD_ADDR #define PCI_VPD_ADDR_F 0x8000 -#define PCI_VPD_DATA 4 +#define PCI_VPD_DATA PCIR_VPD_DATA -#define PCI_CAP_ID_EXP 0x10 -#define PCI_EXP_DEVCTL 8 -#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 -#define PCI_EXP_LNKCTL 16 -#define PCI_EXP_LNKSTA 18 +#define PCI_CAP_ID_EXP PCIY_EXPRESS +#define PCI_EXP_DEVCTL PCIR_EXPRESS_DEVICE_CTL +#define PCI_EXP_DEVCTL_PAYLOAD PCIM_EXP_CTL_MAX_PAYLOAD +#define PCI_EXP_DEVCTL_READRQ PCIM_EXP_CTL_MAX_READ_REQUEST +#define PCI_EXP_LNKCTL PCIR_EXPRESS_LINK_CTL +#define PCI_EXP_LNKSTA PCIR_EXPRESS_LINK_STA /* * Linux compatibility macros diff --git a/sys/dev/cxgb/cxgb_sge.c b/sys/dev/cxgb/cxgb_sge.c index 7565347c040c..184c5afcadf9 100644 --- a/sys/dev/cxgb/cxgb_sge.c +++ b/sys/dev/cxgb/cxgb_sge.c @@ -50,8 +50,12 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include +#include +#include +#include #include #include @@ -152,7 +156,7 @@ struct rx_desc { uint32_t len_gen; uint32_t gen2; uint32_t addr_hi; -} __packed;; +} __packed; struct rsp_desc { /* response queue descriptor */ struct rss_header rss_hdr; @@ -228,6 +232,8 @@ static uint8_t flit_desc_map[] = { #define TXQ_LOCK(qs) mtx_lock(&(qs)->lock) #define TXQ_UNLOCK(qs) mtx_unlock(&(qs)->lock) #define TXQ_RING_EMPTY(qs) drbr_empty((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr) +#define TXQ_RING_NEEDS_ENQUEUE(qs) \ + drbr_needs_enqueue((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr) #define TXQ_RING_FLUSH(qs) drbr_flush((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr) #define TXQ_RING_DEQUEUE_COND(qs, func, arg) \ drbr_dequeue_cond((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr, func, arg) @@ -541,8 +547,12 @@ t3_sge_prep(adapter_t *adap, struct sge_params *p) jumbo_q_size = min(nmbjumbo4/(3*nqsets), JUMBO_Q_SIZE); #endif while (!powerof2(jumbo_q_size)) - jumbo_q_size--; - + jumbo_q_size--; + + if (fl_q_size < (FL_Q_SIZE / 4) || jumbo_q_size < (JUMBO_Q_SIZE / 2)) + device_printf(adap->dev, + "Insufficient clusters and/or jumbo buffers.\n"); + /* XXX Does ETHER_ALIGN need to be accounted for here? */ p->max_pkt_size = adap->sge.qs[0].fl[1].buf_size - sizeof(struct cpl_rx_data); @@ -1139,10 +1149,9 @@ calc_tx_descs(const struct mbuf *m, int nsegs) return 1; flits = sgl_len(nsegs) + 2; -#ifdef TSO_SUPPORTED if (m->m_pkthdr.csum_flags & CSUM_TSO) flits++; -#endif + return flits_to_desc(flits); } @@ -1357,20 +1366,15 @@ write_wr_hdr_sgl(unsigned int ndesc, struct tx_desc *txd, struct txq_state *txqs } } -/* sizeof(*eh) + sizeof(*vhdr) + sizeof(*ip) + sizeof(*tcp) */ -#define TCPPKTHDRSIZE (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + 20 + 20) +/* sizeof(*eh) + sizeof(*ip) + sizeof(*tcp) */ +#define TCPPKTHDRSIZE (ETHER_HDR_LEN + 20 + 20) -#ifdef VLAN_SUPPORTED #define GET_VTAG(cntrl, m) \ do { \ if ((m)->m_flags & M_VLANTAG) \ cntrl |= F_TXPKT_VLAN_VLD | V_TXPKT_VLAN((m)->m_pkthdr.ether_vtag); \ } while (0) -#else -#define GET_VTAG(cntrl, m) -#endif - static int t3_encap(struct sge_qset *qs, struct mbuf **m) { @@ -1399,19 +1403,15 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) prefetch(txd); m0 = *m; - - DPRINTF("t3_encap port_id=%d qsidx=%d ", pi->port_id, pi->first_qset); - DPRINTF("mlen=%d txpkt_intf=%d tx_chan=%d\n", m[0]->m_pkthdr.len, pi->txpkt_intf, pi->tx_chan); - + mtx_assert(&qs->lock, MA_OWNED); cntrl = V_TXPKT_INTF(pi->txpkt_intf); KASSERT(m0->m_flags & M_PKTHDR, ("not packet header\n")); -#ifdef VLAN_SUPPORTED if (m0->m_nextpkt == NULL && m0->m_next != NULL && m0->m_pkthdr.csum_flags & (CSUM_TSO)) tso_info = V_LSO_MSS(m0->m_pkthdr.tso_segsz); -#endif + if (m0->m_nextpkt != NULL) { busdma_map_sg_vec(txq->entry_tag, txsd->map, m0, segs, &nsegs); ndesc = 1; @@ -1471,15 +1471,16 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) V_WR_GEN(txqs.gen)) | htonl(V_WR_TID(txq->token)); set_wr_hdr(wrp, wr_hi, wr_lo); wmb(); + ETHER_BPF_MTAP(pi->ifp, m0); wr_gen2(txd, txqs.gen); check_ring_tx_db(sc, txq); return (0); } else if (tso_info) { - int min_size = TCPPKTHDRSIZE, eth_type, tagged; + int eth_type; struct cpl_tx_pkt_lso *hdr = (struct cpl_tx_pkt_lso *)txd; + struct ether_header *eh; struct ip *ip; struct tcphdr *tcp; - char *pkthdr; txd->flit[2] = 0; GET_VTAG(cntrl, m0); @@ -1487,13 +1488,7 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) hdr->cntrl = htonl(cntrl); hdr->len = htonl(mlen | 0x80000000); - DPRINTF("tso buf len=%d\n", mlen); - - tagged = m0->m_flags & M_VLANTAG; - if (!tagged) - min_size -= ETHER_VLAN_ENCAP_LEN; - - if (__predict_false(mlen < min_size)) { + if (__predict_false(mlen < TCPPKTHDRSIZE)) { printf("mbuf=%p,len=%d,tso_segsz=%d,csum_flags=%#x,flags=%#x", m0, mlen, m0->m_pkthdr.tso_segsz, m0->m_pkthdr.csum_flags, m0->m_flags); @@ -1501,25 +1496,23 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) } /* Make sure that ether, ip, tcp headers are all in m0 */ - if (__predict_false(m0->m_len < min_size)) { - m0 = m_pullup(m0, min_size); + if (__predict_false(m0->m_len < TCPPKTHDRSIZE)) { + m0 = m_pullup(m0, TCPPKTHDRSIZE); if (__predict_false(m0 == NULL)) { /* XXX panic probably an overreaction */ panic("couldn't fit header into mbuf"); } } - pkthdr = m0->m_data; - if (tagged) { + eh = mtod(m0, struct ether_header *); + if (eh->ether_type == htons(ETHERTYPE_VLAN)) { eth_type = CPL_ETH_II_VLAN; - ip = (struct ip *)(pkthdr + ETHER_HDR_LEN + - ETHER_VLAN_ENCAP_LEN); + ip = (struct ip *)((struct ether_vlan_header *)eh + 1); } else { eth_type = CPL_ETH_II; - ip = (struct ip *)(pkthdr + ETHER_HDR_LEN); + ip = (struct ip *)(eh + 1); } - tcp = (struct tcphdr *)((uint8_t *)ip + - sizeof(*ip)); + tcp = (struct tcphdr *)(ip + 1); tso_info |= V_LSO_ETH_TYPE(eth_type) | V_LSO_IPHDR_WORDS(ip->ip_hl) | @@ -1527,12 +1520,10 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) hdr->lso_info = htonl(tso_info); if (__predict_false(mlen <= PIO_LEN)) { - /* pkt not undersized but fits in PIO_LEN + /* + * pkt not undersized but fits in PIO_LEN * Indicates a TSO bug at the higher levels. - * */ - DPRINTF("**5592 Fix** mbuf=%p,len=%d,tso_segsz=%d,csum_flags=%#x,flags=%#x", - m0, mlen, m0->m_pkthdr.tso_segsz, m0->m_pkthdr.csum_flags, m0->m_flags); txsd->m = NULL; m_copydata(m0, 0, mlen, (caddr_t)&txd->flit[3]); flits = (mlen + 7) / 8 + 3; @@ -1543,8 +1534,10 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) V_WR_GEN(txqs.gen) | V_WR_TID(txq->token)); set_wr_hdr(&hdr->wr, wr_hi, wr_lo); wmb(); + ETHER_BPF_MTAP(pi->ifp, m0); wr_gen2(txd, txqs.gen); check_ring_tx_db(sc, txq); + m_freem(m0); return (0); } flits = 3; @@ -1572,8 +1565,10 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) V_WR_GEN(txqs.gen) | V_WR_TID(txq->token)); set_wr_hdr(&cpl->wr, wr_hi, wr_lo); wmb(); + ETHER_BPF_MTAP(pi->ifp, m0); wr_gen2(txd, txqs.gen); check_ring_tx_db(sc, txq); + m_freem(m0); return (0); } flits = 2; @@ -1584,12 +1579,14 @@ t3_encap(struct sge_qset *qs, struct mbuf **m) sgl_flits = sgl_len(nsegs); + ETHER_BPF_MTAP(pi->ifp, m0); + KASSERT(ndesc <= 4, ("ndesc too large %d", ndesc)); wr_hi = htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | txqs.compl); wr_lo = htonl(V_WR_TID(txq->token)); write_wr_hdr_sgl(ndesc, txd, &txqs, txq, sgl, flits, sgl_flits, wr_hi, wr_lo); - check_ring_tx_db(pi->adapter, txq); + check_ring_tx_db(sc, txq); return (0); } @@ -1668,16 +1665,6 @@ cxgb_start_locked(struct sge_qset *qs) */ if (t3_encap(qs, &m_head) || m_head == NULL) break; - - /* Send a copy of the frame to the BPF listener */ - ETHER_BPF_MTAP(ifp, m_head); - - /* - * We sent via PIO, no longer need a copy - */ - if (m_head->m_nextpkt == NULL && - m_head->m_pkthdr.len <= PIO_LEN) - m_freem(m_head); m_head = NULL; } @@ -1708,7 +1695,7 @@ cxgb_transmit_locked(struct ifnet *ifp, struct sge_qset *qs, struct mbuf *m) * - there is space in hardware transmit queue */ if (check_pkt_coalesce(qs) == 0 && - TXQ_RING_EMPTY(qs) && avail > 4) { + !TXQ_RING_NEEDS_ENQUEUE(qs) && avail > 4) { if (t3_encap(qs, &m)) { if (m != NULL && (error = drbr_enqueue(ifp, br, m)) != 0) @@ -1720,17 +1707,6 @@ cxgb_transmit_locked(struct ifnet *ifp, struct sge_qset *qs, struct mbuf *m) */ txq->txq_direct_packets++; txq->txq_direct_bytes += m->m_pkthdr.len; - /* - ** Send a copy of the frame to the BPF - ** listener and set the watchdog on. - */ - ETHER_BPF_MTAP(ifp, m); - /* - * We sent via PIO, no longer need a copy - */ - if (m->m_pkthdr.len <= PIO_LEN) - m_freem(m); - } } else if ((error = drbr_enqueue(ifp, br, m)) != 0) return (error); @@ -2084,9 +2060,7 @@ t3_free_qset(adapter_t *sc, struct sge_qset *q) MTX_DESTROY(&q->rspq.lock); } -#ifdef LRO_SUPPORTED tcp_lro_free(&q->lro.ctrl); -#endif bzero(q, sizeof(*q)); } @@ -2671,7 +2645,6 @@ t3_sge_alloc_qset(adapter_t *sc, u_int id, int nports, int irq_vec_idx, q->fl[1].type = EXT_JUMBOP; #endif -#ifdef LRO_SUPPORTED /* Allocate and setup the lro_ctrl structure */ q->lro.enabled = !!(pi->ifp->if_capenable & IFCAP_LRO); ret = tcp_lro_init(&q->lro.ctrl); @@ -2680,7 +2653,6 @@ t3_sge_alloc_qset(adapter_t *sc, u_int id, int nports, int irq_vec_idx, goto err; } q->lro.ctrl.ifp = pi->ifp; -#endif mtx_lock_spin(&sc->sge.reg_lock); ret = -t3_sge_init_rspcntxt(sc, q->rspq.cntxt_id, irq_vec_idx, @@ -2781,16 +2753,12 @@ t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad) m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID|CSUM_DATA_VALID|CSUM_PSEUDO_HDR); m->m_pkthdr.csum_data = 0xffff; } - /* - * XXX need to add VLAN support for 6.x - */ -#ifdef VLAN_SUPPORTED - if (__predict_false(cpl->vlan_valid)) { + + if (cpl->vlan_valid) { m->m_pkthdr.ether_vtag = ntohs(cpl->vlan); m->m_flags |= M_VLANTAG; } -#endif - + m->m_pkthdr.rcvif = ifp; m->m_pkthdr.header = mtod(m, uint8_t *) + sizeof(*cpl) + ethpad; /* @@ -2970,11 +2938,9 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) struct rsp_desc *r = &rspq->desc[rspq->cidx]; int budget_left = budget; unsigned int sleeping = 0; -#ifdef LRO_SUPPORTED int lro_enabled = qs->lro.enabled; int skip_lro; struct lro_ctrl *lro_ctrl = &qs->lro.ctrl; -#endif struct mbuf *offload_mbufs[RX_BUNDLE_SIZE]; int ngathered = 0; #ifdef DEBUG @@ -3083,7 +3049,6 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) t3_rx_eth(adap, rspq, m, ethpad); -#ifdef LRO_SUPPORTED /* * The T304 sends incoming packets on any qset. If LRO * is also enabled, we could end up sending packet up @@ -3097,9 +3062,7 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) if (lro_enabled && lro_ctrl->lro_cnt && !skip_lro && (tcp_lro_rx(lro_ctrl, m, 0) == 0)) { /* successfully queue'd for LRO */ - } else -#endif - { + } else { /* * LRO not enabled, packet unsuitable for LRO, * or unable to queue. Pass it up right now in @@ -3118,14 +3081,12 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget) deliver_partial_bundle(&adap->tdev, rspq, offload_mbufs, ngathered); -#ifdef LRO_SUPPORTED /* Flush LRO */ while (!SLIST_EMPTY(&lro_ctrl->lro_active)) { struct lro_entry *queued = SLIST_FIRST(&lro_ctrl->lro_active); SLIST_REMOVE_HEAD(&lro_ctrl->lro_active, next); tcp_lro_flush(lro_ctrl, queued); } -#endif if (sleeping) check_ring_db(adap, qs, sleeping); @@ -3698,7 +3659,6 @@ t3_add_configured_sysctls(adapter_t *sc) CTLTYPE_STRING | CTLFLAG_RD, &qs->txq[TXQ_CTRL], 0, t3_dump_txq_ctrl, "A", "dump of the transmit queue"); -#ifdef LRO_SUPPORTED SYSCTL_ADD_INT(ctx, lropoidlist, OID_AUTO, "lro_queued", CTLFLAG_RD, &qs->lro.ctrl.lro_queued, 0, NULL); SYSCTL_ADD_INT(ctx, lropoidlist, OID_AUTO, "lro_flushed", @@ -3707,7 +3667,6 @@ t3_add_configured_sysctls(adapter_t *sc) CTLFLAG_RD, &qs->lro.ctrl.lro_bad_csum, 0, NULL); SYSCTL_ADD_INT(ctx, lropoidlist, OID_AUTO, "lro_cnt", CTLFLAG_RD, &qs->lro.ctrl.lro_cnt, 0, NULL); -#endif } /* Now add a node for mac stats. */ diff --git a/sys/dev/cxgb/cxgb_t3fw.h b/sys/dev/cxgb/cxgb_t3fw.h index dbc5dd818677..66c86ce6b821 100644 --- a/sys/dev/cxgb/cxgb_t3fw.h +++ b/sys/dev/cxgb/cxgb_t3fw.h @@ -32,8 +32,8 @@ $FreeBSD$ #define U (unsigned char) -static unsigned int t3fw_length = 30136; -static unsigned char t3fw[30136] = { +static unsigned int t3fw_length = 30840; +static unsigned char t3fw[30840] = { U 0x60, U 0x00, U 0x74, U 0x00, U 0x20, U 0x03, U 0x80, U 0x00, U 0x20, U 0x03, U 0x70, U 0x00, @@ -55,13 +55,13 @@ static unsigned char t3fw[30136] = { U 0x1F, U 0xFF, U 0xC0, U 0x00, U 0xE3, U 0x00, U 0x04, U 0x3C, U 0x02, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x69, U 0x88, + U 0x20, U 0x00, U 0x6C, U 0x34, U 0x1F, U 0xFF, U 0xC2, U 0x90, - U 0x20, U 0x00, U 0x69, U 0xD0, + U 0x20, U 0x00, U 0x6C, U 0x7C, U 0x1F, U 0xFF, U 0xC2, U 0x94, - U 0x20, U 0x00, U 0x6A, U 0x10, + U 0x20, U 0x00, U 0x6C, U 0xBC, U 0x1F, U 0xFF, U 0xC2, U 0x98, - U 0x20, U 0x00, U 0x6A, U 0x84, + U 0x20, U 0x00, U 0x6D, U 0x30, U 0x1F, U 0xFF, U 0xC2, U 0x9C, U 0x20, U 0x00, U 0x03, U 0xC0, U 0xC0, U 0x00, U 0x00, U 0xE4, @@ -324,83 +324,83 @@ static unsigned char t3fw[30136] = { U 0x1F, U 0xFF, U 0xC0, U 0x18, U 0xE3, U 0x00, U 0x05, U 0xE0, U 0x1F, U 0xFF, U 0xC0, U 0x18, - U 0x1F, U 0xFF, U 0xC2, U 0x8C, + U 0x1F, U 0xFF, U 0xC2, U 0x90, U 0xE3, U 0x00, U 0x05, U 0xE0, - U 0x1F, U 0xFF, U 0xC2, U 0x8C, - U 0x1F, U 0xFF, U 0xC2, U 0x8C, - U 0xE3, U 0x00, U 0x08, U 0x54, + U 0x1F, U 0xFF, U 0xC2, U 0x90, + U 0x1F, U 0xFF, U 0xC2, U 0x90, + U 0xE3, U 0x00, U 0x08, U 0x58, U 0x1F, U 0xFF, U 0xC2, U 0x90, U 0x1F, U 0xFF, U 0xC5, U 0x8C, - U 0xE3, U 0x00, U 0x08, U 0x54, + U 0xE3, U 0x00, U 0x08, U 0x58, U 0x20, U 0x00, U 0x00, U 0x00, U 0x20, U 0x00, U 0x01, U 0x6A, - U 0xE3, U 0x00, U 0x0B, U 0x50, + U 0xE3, U 0x00, U 0x0B, U 0x54, U 0x20, U 0x00, U 0x01, U 0x80, U 0x20, U 0x00, U 0x01, U 0x80, - U 0xE3, U 0x00, U 0x0C, U 0xBC, + U 0xE3, U 0x00, U 0x0C, U 0xC0, U 0x20, U 0x00, U 0x02, U 0x00, U 0x20, U 0x00, U 0x02, U 0x03, - U 0xE3, U 0x00, U 0x0C, U 0xBC, + U 0xE3, U 0x00, U 0x0C, U 0xC0, U 0x20, U 0x00, U 0x02, U 0x1C, U 0x20, U 0x00, U 0x02, U 0x20, - U 0xE3, U 0x00, U 0x0C, U 0xC0, + U 0xE3, U 0x00, U 0x0C, U 0xC4, U 0x20, U 0x00, U 0x02, U 0x20, U 0x20, U 0x00, U 0x02, U 0x26, - U 0xE3, U 0x00, U 0x0C, U 0xC4, + U 0xE3, U 0x00, U 0x0C, U 0xC8, U 0x20, U 0x00, U 0x02, U 0x3C, U 0x20, U 0x00, U 0x02, U 0x40, - U 0xE3, U 0x00, U 0x0C, U 0xCC, + U 0xE3, U 0x00, U 0x0C, U 0xD0, U 0x20, U 0x00, U 0x02, U 0x40, U 0x20, U 0x00, U 0x02, U 0x49, - U 0xE3, U 0x00, U 0x0C, U 0xD0, + U 0xE3, U 0x00, U 0x0C, U 0xD4, U 0x20, U 0x00, U 0x02, U 0x4C, U 0x20, U 0x00, U 0x02, U 0x50, - U 0xE3, U 0x00, U 0x0C, U 0xDC, + U 0xE3, U 0x00, U 0x0C, U 0xE0, U 0x20, U 0x00, U 0x02, U 0x50, U 0x20, U 0x00, U 0x02, U 0x59, - U 0xE3, U 0x00, U 0x0C, U 0xE0, + U 0xE3, U 0x00, U 0x0C, U 0xE4, U 0x20, U 0x00, U 0x02, U 0x5C, U 0x20, U 0x00, U 0x02, U 0x60, - U 0xE3, U 0x00, U 0x0C, U 0xEC, + U 0xE3, U 0x00, U 0x0C, U 0xF0, U 0x20, U 0x00, U 0x02, U 0x60, U 0x20, U 0x00, U 0x02, U 0x69, - U 0xE3, U 0x00, U 0x0C, U 0xF0, + U 0xE3, U 0x00, U 0x0C, U 0xF4, U 0x20, U 0x00, U 0x02, U 0x6C, U 0x20, U 0x00, U 0x02, U 0x70, - U 0xE3, U 0x00, U 0x0C, U 0xFC, + U 0xE3, U 0x00, U 0x0D, U 0x00, U 0x20, U 0x00, U 0x02, U 0x70, U 0x20, U 0x00, U 0x02, U 0x79, - U 0xE3, U 0x00, U 0x0D, U 0x00, + U 0xE3, U 0x00, U 0x0D, U 0x04, U 0x20, U 0x00, U 0x02, U 0x8C, U 0x20, U 0x00, U 0x02, U 0x8C, - U 0xE3, U 0x00, U 0x0D, U 0x0C, + U 0xE3, U 0x00, U 0x0D, U 0x10, U 0x20, U 0x00, U 0x02, U 0x90, U 0x20, U 0x00, U 0x02, U 0x93, - U 0xE3, U 0x00, U 0x0D, U 0x0C, + U 0xE3, U 0x00, U 0x0D, U 0x10, U 0x20, U 0x00, U 0x02, U 0xAC, U 0x20, U 0x00, U 0x02, U 0xB0, - U 0xE3, U 0x00, U 0x0D, U 0x10, + U 0xE3, U 0x00, U 0x0D, U 0x14, U 0x20, U 0x00, U 0x02, U 0xD0, U 0x20, U 0x00, U 0x02, U 0xF2, - U 0xE3, U 0x00, U 0x0D, U 0x14, + U 0xE3, U 0x00, U 0x0D, U 0x18, U 0x20, U 0x00, U 0x03, U 0xB0, U 0x20, U 0x00, U 0x03, U 0xB0, - U 0xE3, U 0x00, U 0x0D, U 0x38, + U 0xE3, U 0x00, U 0x0D, U 0x3C, U 0x20, U 0x00, U 0x03, U 0xB0, U 0x20, U 0x00, U 0x03, U 0xB0, - U 0xE3, U 0x00, U 0x0D, U 0x38, + U 0xE3, U 0x00, U 0x0D, U 0x3C, U 0x20, U 0x00, U 0x03, U 0xB0, U 0x20, U 0x00, U 0x03, U 0xB0, - U 0xE3, U 0x00, U 0x0D, U 0x38, + U 0xE3, U 0x00, U 0x0D, U 0x3C, U 0x20, U 0x00, U 0x03, U 0xB0, U 0x20, U 0x00, U 0x03, U 0xB0, - U 0xE3, U 0x00, U 0x0D, U 0x38, + U 0xE3, U 0x00, U 0x0D, U 0x3C, U 0x20, U 0x00, U 0x03, U 0xB0, - U 0x20, U 0x00, U 0x6B, U 0xA8, - U 0xE3, U 0x00, U 0x0D, U 0x38, - U 0x20, U 0x00, U 0x6B, U 0xA8, - U 0x20, U 0x00, U 0x6B, U 0xA8, - U 0xE3, U 0x00, U 0x75, U 0x30, + U 0x20, U 0x00, U 0x6E, U 0x54, + U 0xE3, U 0x00, U 0x0D, U 0x3C, + U 0x20, U 0x00, U 0x6E, U 0x54, + U 0x20, U 0x00, U 0x6E, U 0x54, + U 0xE3, U 0x00, U 0x77, U 0xE0, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, @@ -408,8 +408,8 @@ static unsigned char t3fw[30136] = { U 0x1F, U 0xFC, U 0x00, U 0x00, U 0x1F, U 0xFF, U 0xC5, U 0x90, U 0x1F, U 0xFF, U 0xC6, U 0x70, - U 0x20, U 0x00, U 0x6B, U 0xA8, - U 0x20, U 0x00, U 0x6B, U 0xA8, + U 0x20, U 0x00, U 0x6E, U 0x58, + U 0x20, U 0x00, U 0x6E, U 0x58, U 0xDE, U 0xFF, U 0xFE, U 0x00, U 0x00, U 0x00, U 0x08, U 0x0C, U 0xDE, U 0xAD, U 0xBE, U 0xEF, @@ -436,7 +436,6 @@ static unsigned char t3fw[30136] = { U 0x10, U 0x00, U 0x00, U 0x01, U 0x20, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x10, U 0x00, - U 0x7F, U 0xFF, U 0xFF, U 0xFF, U 0x40, U 0x00, U 0x00, U 0x00, U 0x05, U 0x00, U 0x00, U 0x00, U 0x80, U 0x00, U 0x00, U 0x19, @@ -461,15 +460,16 @@ static unsigned char t3fw[30136] = { U 0x60, U 0x40, U 0x00, U 0x00, U 0x1A, U 0x00, U 0x00, U 0x00, U 0x0C, U 0x00, U 0x00, U 0x00, + U 0x10, U 0x00, U 0x00, U 0x0A, U 0x00, U 0x00, U 0x30, U 0x00, - U 0x60, U 0x00, U 0x08, U 0x00, - U 0x80, U 0x00, U 0x00, U 0x1C, U 0x00, U 0x01, U 0x00, U 0x00, - U 0x80, U 0x00, U 0x00, U 0x1A, U 0x80, U 0x00, U 0x00, U 0x18, U 0xFC, U 0x00, U 0x00, U 0x00, U 0x80, U 0x00, U 0x00, U 0x01, U 0x00, U 0x00, U 0x40, U 0x00, + U 0x60, U 0x00, U 0x08, U 0x00, + U 0x80, U 0x00, U 0x00, U 0x1C, + U 0x80, U 0x00, U 0x00, U 0x1A, U 0x03, U 0x00, U 0x00, U 0x00, U 0x80, U 0x00, U 0x04, U 0x00, U 0x50, U 0x00, U 0x00, U 0x03, @@ -517,6 +517,7 @@ static unsigned char t3fw[30136] = { U 0x1F, U 0xFF, U 0xC4, U 0xD0, U 0x1F, U 0xFC, U 0xFF, U 0xD8, U 0x00, U 0x01, U 0x00, U 0x81, + U 0x7F, U 0xFF, U 0xFF, U 0xFF, U 0xE1, U 0x00, U 0x06, U 0x00, U 0x00, U 0x00, U 0x27, U 0x10, U 0x1F, U 0xFC, U 0xFE, U 0x30, @@ -615,70 +616,70 @@ static unsigned char t3fw[30136] = { U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x52, U 0xFC, - U 0x20, U 0x00, U 0x51, U 0xCC, - U 0x20, U 0x00, U 0x52, U 0xFC, - U 0x20, U 0x00, U 0x52, U 0xFC, - U 0x20, U 0x00, U 0x51, U 0x08, - U 0x20, U 0x00, U 0x51, U 0x08, - U 0x20, U 0x00, U 0x51, U 0x08, - U 0x20, U 0x00, U 0x4F, U 0x48, - U 0x20, U 0x00, U 0x4F, U 0x48, - U 0x20, U 0x00, U 0x4F, U 0x40, - U 0x20, U 0x00, U 0x4E, U 0xAC, - U 0x20, U 0x00, U 0x4D, U 0x54, - U 0x20, U 0x00, U 0x4B, U 0x34, - U 0x20, U 0x00, U 0x49, U 0x08, - U 0x00, U 0x00, U 0x00, U 0x00, - U 0x00, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x52, U 0xCC, + U 0x20, U 0x00, U 0x55, U 0x54, + U 0x20, U 0x00, U 0x54, U 0x24, + U 0x20, U 0x00, U 0x55, U 0x54, + U 0x20, U 0x00, U 0x55, U 0x54, + U 0x20, U 0x00, U 0x53, U 0x60, + U 0x20, U 0x00, U 0x53, U 0x60, + U 0x20, U 0x00, U 0x53, U 0x60, + U 0x20, U 0x00, U 0x51, U 0xA0, + U 0x20, U 0x00, U 0x51, U 0xA0, U 0x20, U 0x00, U 0x51, U 0x98, - U 0x20, U 0x00, U 0x52, U 0x3C, - U 0x20, U 0x00, U 0x52, U 0x3C, - U 0x20, U 0x00, U 0x4F, U 0xF0, - U 0x20, U 0x00, U 0x4F, U 0xF0, - U 0x20, U 0x00, U 0x4F, U 0xF0, - U 0x20, U 0x00, U 0x4F, U 0xF0, - U 0x20, U 0x00, U 0x4F, U 0xF0, - U 0x20, U 0x00, U 0x4F, U 0x38, - U 0x20, U 0x00, U 0x4F, U 0xF0, - U 0x20, U 0x00, U 0x4C, U 0x74, - U 0x20, U 0x00, U 0x4A, U 0xE4, - U 0x20, U 0x00, U 0x48, U 0xB4, + U 0x20, U 0x00, U 0x51, U 0x04, + U 0x20, U 0x00, U 0x4F, U 0xAC, + U 0x20, U 0x00, U 0x4D, U 0x8C, + U 0x20, U 0x00, U 0x4B, U 0x60, + U 0x00, U 0x00, U 0x00, U 0x00, + U 0x00, U 0x00, U 0x00, U 0x00, + U 0x20, U 0x00, U 0x55, U 0x24, + U 0x20, U 0x00, U 0x53, U 0xF0, + U 0x20, U 0x00, U 0x54, U 0x94, + U 0x20, U 0x00, U 0x54, U 0x94, + U 0x20, U 0x00, U 0x52, U 0x48, + U 0x20, U 0x00, U 0x52, U 0x48, + U 0x20, U 0x00, U 0x52, U 0x48, + U 0x20, U 0x00, U 0x52, U 0x48, + U 0x20, U 0x00, U 0x52, U 0x48, + U 0x20, U 0x00, U 0x51, U 0x90, + U 0x20, U 0x00, U 0x52, U 0x48, + U 0x20, U 0x00, U 0x4E, U 0xCC, + U 0x20, U 0x00, U 0x4D, U 0x3C, + U 0x20, U 0x00, U 0x4B, U 0x0C, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x0B, U 0xE0, - U 0x20, U 0x00, U 0x38, U 0xBC, - U 0x20, U 0x00, U 0x04, U 0xC0, - U 0x20, U 0x00, U 0x44, U 0xA8, - U 0x20, U 0x00, U 0x0B, U 0xD8, - U 0x20, U 0x00, U 0x3F, U 0xB4, - U 0x20, U 0x00, U 0x03, U 0xF0, - U 0x20, U 0x00, U 0x44, U 0x68, - U 0x20, U 0x00, U 0x48, U 0x90, - U 0x20, U 0x00, U 0x3C, U 0xC4, - U 0x20, U 0x00, U 0x3B, U 0xE0, - U 0x20, U 0x00, U 0x38, U 0x38, - U 0x20, U 0x00, U 0x36, U 0xC4, - U 0x20, U 0x00, U 0x34, U 0x34, - U 0x20, U 0x00, U 0x2F, U 0x94, - U 0x20, U 0x00, U 0x3A, U 0x3C, - U 0x20, U 0x00, U 0x2B, U 0xF4, - U 0x20, U 0x00, U 0x28, U 0x28, - U 0x20, U 0x00, U 0x65, U 0x34, - U 0x20, U 0x00, U 0x23, U 0xB4, - U 0x20, U 0x00, U 0x20, U 0x94, - U 0x20, U 0x00, U 0x20, U 0x40, - U 0x20, U 0x00, U 0x1D, U 0x2C, - U 0x20, U 0x00, U 0x18, U 0x40, - U 0x20, U 0x00, U 0x15, U 0x70, - U 0x20, U 0x00, U 0x0D, U 0xEC, - U 0x20, U 0x00, U 0x0C, U 0x24, - U 0x20, U 0x00, U 0x11, U 0x34, - U 0x20, U 0x00, U 0x13, U 0x20, - U 0x20, U 0x00, U 0x41, U 0xAC, - U 0x20, U 0x00, U 0x3C, U 0x78, U 0x20, U 0x00, U 0x0B, U 0xE8, + U 0x20, U 0x00, U 0x3A, U 0xA8, + U 0x20, U 0x00, U 0x04, U 0xC0, + U 0x20, U 0x00, U 0x46, U 0xFC, + U 0x20, U 0x00, U 0x0B, U 0xE0, + U 0x20, U 0x00, U 0x41, U 0xC0, + U 0x20, U 0x00, U 0x03, U 0xF0, + U 0x20, U 0x00, U 0x46, U 0xBC, + U 0x20, U 0x00, U 0x4A, U 0xE8, + U 0x20, U 0x00, U 0x3E, U 0xCC, + U 0x20, U 0x00, U 0x3D, U 0xE8, + U 0x20, U 0x00, U 0x3A, U 0x24, + U 0x20, U 0x00, U 0x38, U 0xB4, + U 0x20, U 0x00, U 0x36, U 0x24, + U 0x20, U 0x00, U 0x31, U 0x84, + U 0x20, U 0x00, U 0x3C, U 0x44, + U 0x20, U 0x00, U 0x2D, U 0xB0, + U 0x20, U 0x00, U 0x28, U 0x44, + U 0x20, U 0x00, U 0x67, U 0xD8, + U 0x20, U 0x00, U 0x23, U 0xD0, + U 0x20, U 0x00, U 0x20, U 0xB0, + U 0x20, U 0x00, U 0x20, U 0x5C, + U 0x20, U 0x00, U 0x1D, U 0x48, + U 0x20, U 0x00, U 0x18, U 0x40, + U 0x20, U 0x00, U 0x15, U 0x68, + U 0x20, U 0x00, U 0x0E, U 0x4C, + U 0x20, U 0x00, U 0x0C, U 0x2C, + U 0x20, U 0x00, U 0x11, U 0x2C, + U 0x20, U 0x00, U 0x13, U 0x18, + U 0x20, U 0x00, U 0x43, U 0xB8, + U 0x20, U 0x00, U 0x3E, U 0x80, + U 0x20, U 0x00, U 0x0B, U 0xF0, U 0x20, U 0x00, U 0x04, U 0xC0, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, @@ -850,22 +851,22 @@ static unsigned char t3fw[30136] = { U 0x0B, U 0xBB, U 0x90, U 0x00, U 0x53, U 0x00, U 0x00, U 0x00, U 0x63, U 0xFF, U 0xFC, U 0x00, - U 0x20, U 0x00, U 0x69, U 0x64, + U 0x20, U 0x00, U 0x6C, U 0x10, U 0x10, U 0xFF, U 0xFF, U 0x0A, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x69, U 0x88, + U 0x20, U 0x00, U 0x6C, U 0x34, U 0x00, U 0xD2, U 0x31, U 0x10, U 0xFF, U 0xFE, U 0x0A, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x69, U 0xD0, + U 0x20, U 0x00, U 0x6C, U 0x7C, U 0x00, U 0xD3, U 0x31, U 0x10, U 0xFF, U 0xFE, U 0x0A, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x6A, U 0x10, + U 0x20, U 0x00, U 0x6C, U 0xBC, U 0x00, U 0xD4, U 0x31, U 0x10, U 0xFF, U 0xFE, U 0x0A, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x20, U 0x00, U 0x6A, U 0x84, + U 0x20, U 0x00, U 0x6D, U 0x30, U 0x00, U 0xD5, U 0x31, U 0x10, U 0xFF, U 0xFE, U 0x0A, U 0x00, U 0x00, U 0x00, U 0x00, U 0x00, @@ -892,8 +893,8 @@ static unsigned char t3fw[30136] = { U 0xFA, U 0xD3, U 0x0F, U 0x77, U 0x6B, U 0x06, U 0x90, U 0x60, U 0xB4, U 0x66, U 0x77, U 0x63, - U 0xF8, U 0x54, U 0x15, U 0x50, - U 0x54, U 0x19, U 0xE6, U 0x0F, + U 0xF8, U 0x54, U 0x15, U 0xE6, + U 0x54, U 0x1A, U 0x91, U 0x0F, U 0x14, U 0x00, U 0x63, U 0xFF, U 0xF9, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, @@ -949,118 +950,119 @@ static unsigned char t3fw[30136] = { U 0x86, U 0x38, U 0x76, U 0xC0, U 0xDA, U 0x63, U 0xFF, U 0xD4, U 0x6C, U 0x10, U 0x12, U 0x16, - U 0xEE, U 0xD8, U 0xC1, U 0xF8, - U 0xC1, U 0xE7, U 0x2B, U 0x22, - U 0x1E, U 0x2C, U 0x22, U 0x1D, - U 0xC0, U 0xD0, U 0x7B, U 0xC1, - U 0x2F, U 0x29, U 0x20, U 0x06, - U 0xD7, U 0xB0, U 0x29, U 0x9C, - U 0xFA, U 0xCC, U 0x57, U 0x28, - U 0x20, U 0x70, U 0x28, U 0x8C, - U 0xFF, U 0x28, U 0x24, U 0x70, + U 0xEE, U 0xD8, U 0xC1, U 0xF9, + U 0xC1, U 0xE8, U 0xC1, U 0xC7, + U 0x2B, U 0x22, U 0x1E, U 0x28, + U 0x22, U 0x1D, U 0xC0, U 0xD0, + U 0x7B, U 0x81, U 0x31, U 0x29, + U 0x20, U 0x06, U 0x0B, U 0xB7, + U 0x02, U 0x29, U 0x9C, U 0xFA, + U 0x65, U 0x50, U 0x08, U 0x28, + U 0x20, U 0x72, U 0x28, U 0x8C, + U 0xFF, U 0x28, U 0x24, U 0x72, U 0x64, U 0x91, U 0x5C, U 0x2A, - U 0xB0, U 0x00, U 0x0E, U 0xA8, + U 0xB0, U 0x00, U 0x0C, U 0xA8, U 0x0C, U 0x64, U 0x81, U 0x67, - U 0x0F, U 0xA9, U 0x0C, U 0x64, - U 0x92, U 0xB3, U 0xC1, U 0xE9, - U 0x7E, U 0xA1, U 0x39, U 0x69, - U 0xAC, U 0x2F, U 0x60, U 0x00, - U 0x36, U 0x29, U 0x20, U 0x06, - U 0xD7, U 0xD0, U 0x29, U 0x9C, - U 0xFA, U 0xCC, U 0x57, U 0x28, - U 0x20, U 0x70, U 0x28, U 0x8C, - U 0xFF, U 0x28, U 0x24, U 0x70, - U 0x64, U 0x91, U 0x35, U 0x2A, - U 0xD0, U 0x00, U 0x0E, U 0xA8, - U 0x0C, U 0x64, U 0x81, U 0x64, - U 0x0F, U 0xA9, U 0x0C, U 0x64, - U 0x93, U 0x1B, U 0xC1, U 0xE9, - U 0x7E, U 0xA1, U 0x09, U 0x68, - U 0xAC, U 0x09, U 0xC0, U 0x20, - U 0xD1, U 0x0F, U 0x00, U 0x00, + U 0x0E, U 0xA9, U 0x0C, U 0x64, + U 0x92, U 0xB3, U 0x7F, U 0xA1, + U 0x37, U 0x69, U 0xAC, U 0x2F, + U 0x60, U 0x00, U 0x34, U 0x00, + U 0x00, U 0x28, U 0x20, U 0x06, + U 0xD7, U 0xD0, U 0x28, U 0x8C, + U 0xFA, U 0xCC, U 0x57, U 0x2A, + U 0x20, U 0x72, U 0x2A, U 0xAC, + U 0xFF, U 0x2A, U 0x24, U 0x72, + U 0x64, U 0x81, U 0x35, U 0x2A, + U 0xD0, U 0x00, U 0x0C, U 0xA9, + U 0x0C, U 0x64, U 0x91, U 0x64, + U 0x0E, U 0xAC, U 0x0C, U 0x64, + U 0xC3, U 0x1B, U 0x7F, U 0xA1, + U 0x07, U 0x68, U 0xAC, U 0x07, + U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x2D, U 0x25, U 0x02, U 0x8A, U 0x32, U 0xC0, U 0x90, - U 0x0A, U 0x6F, U 0x50, U 0x65, - U 0xF5, U 0xAD, U 0x29, U 0x24, - U 0x67, U 0x09, U 0x08, U 0x47, - U 0x65, U 0x85, U 0xA9, U 0x2F, - U 0x20, U 0x0C, U 0x18, U 0xEE, - U 0xB5, U 0x0C, U 0xFE, U 0x11, - U 0xA8, U 0xEE, U 0x28, U 0xE2, - U 0x86, U 0xB4, U 0x49, U 0x78, - U 0x93, U 0x02, U 0x60, U 0x05, - U 0x7A, U 0x19, U 0xEE, U 0xB1, - U 0x09, U 0xF9, U 0x0A, U 0x29, + U 0x0A, U 0x6E, U 0x50, U 0x65, + U 0xE5, U 0xB5, U 0x29, U 0x24, + U 0x67, U 0x09, U 0x0F, U 0x47, + U 0x65, U 0xF5, U 0xB1, U 0x2C, + U 0x20, U 0x0C, U 0x1F, U 0xEE, + U 0xB5, U 0x0C, U 0xCE, U 0x11, + U 0xAF, U 0xEE, U 0x29, U 0xE2, + U 0x86, U 0xB4, U 0x48, U 0x79, + U 0x83, U 0x02, U 0x60, U 0x05, + U 0x82, U 0x19, U 0xEE, U 0xB1, + U 0x09, U 0xC9, U 0x0A, U 0x29, U 0x92, U 0xA3, U 0x68, U 0x90, - U 0x07, U 0x88, U 0x20, U 0x09, - U 0x88, U 0x0C, U 0x65, U 0x85, - U 0x66, U 0x27, U 0xE2, U 0x85, - U 0x64, U 0x75, U 0x60, U 0x65, - U 0x55, U 0x8E, U 0x7B, U 0xC1, - U 0x04, U 0xD9, U 0xB0, U 0x60, - U 0x00, U 0x01, U 0xC0, U 0x90, - U 0x8B, U 0x94, U 0x1C, U 0xEE, - U 0xA8, U 0x0B, U 0x88, U 0x14, - U 0x8C, U 0xC4, U 0x0B, U 0x0B, - U 0x47, U 0xA8, U 0xCC, U 0x18, - U 0xEE, U 0xA6, U 0x09, U 0xBB, - U 0x10, U 0x08, U 0xCC, U 0x02, - U 0x9C, U 0x70, U 0x18, U 0xEE, - U 0xA4, U 0x1C, U 0xEE, U 0xA5, + U 0x07, U 0x8F, U 0x20, U 0x09, + U 0xFF, U 0x0C, U 0x65, U 0xF5, + U 0x6E, U 0x2F, U 0xE2, U 0x85, + U 0x64, U 0xF5, U 0x68, U 0x65, + U 0x55, U 0x96, U 0x28, U 0x22, + U 0x1D, U 0x7B, U 0x81, U 0x05, + U 0xD9, U 0xB0, U 0x60, U 0x00, + U 0x02, U 0x00, U 0xC0, U 0x90, + U 0x8B, U 0x94, U 0x17, U 0xEE, + U 0xA7, U 0x0B, U 0x88, U 0x14, + U 0x87, U 0x74, U 0x0B, U 0x0B, + U 0x47, U 0xA8, U 0x77, U 0x18, + U 0xEE, U 0xA5, U 0x09, U 0xBB, + U 0x10, U 0x08, U 0x77, U 0x02, + U 0x97, U 0xF0, U 0x18, U 0xEE, + U 0xA3, U 0x17, U 0xEE, U 0xA4, U 0x08, U 0xA8, U 0x01, U 0x0B, - U 0x88, U 0x02, U 0x0C, U 0x4C, - U 0x02, U 0x1B, U 0xEE, U 0xA1, - U 0x9C, U 0x71, U 0x0B, U 0x88, - U 0x02, U 0x98, U 0x72, U 0x2C, + U 0x88, U 0x02, U 0x07, U 0x47, + U 0x02, U 0x1B, U 0xEE, U 0xA0, + U 0x97, U 0xF1, U 0x0B, U 0x88, + U 0x02, U 0x98, U 0xF2, U 0x27, U 0x90, U 0x23, U 0x2B, U 0x90, - U 0x22, U 0x04, U 0xC8, U 0x10, - U 0x06, U 0xBB, U 0x10, U 0x0C, - U 0x4C, U 0x12, U 0x08, U 0xBB, + U 0x22, U 0x04, U 0x78, U 0x10, + U 0x06, U 0xBB, U 0x10, U 0x07, + U 0x47, U 0x12, U 0x08, U 0xBB, U 0x02, U 0x28, U 0x90, U 0x21, - U 0x07, U 0xCC, U 0x10, U 0x0C, - U 0x88, U 0x10, U 0x0C, U 0x88, + U 0x07, U 0x77, U 0x10, U 0x0C, + U 0x88, U 0x10, U 0x07, U 0x88, U 0x02, U 0x0B, U 0x88, U 0x02, - U 0x1C, U 0xEE, U 0x99, U 0x8B, - U 0x33, U 0x0C, U 0xBB, U 0x01, - U 0x8C, U 0x34, U 0x0B, U 0x88, - U 0x02, U 0x98, U 0x73, U 0x9C, - U 0x99, U 0x9C, U 0x74, U 0x8B, - U 0x95, U 0x8C, U 0x39, U 0x9B, - U 0x75, U 0x88, U 0x96, U 0x8B, - U 0x38, U 0x98, U 0x76, U 0x88, - U 0x97, U 0x9C, U 0x79, U 0x9B, - U 0x78, U 0x98, U 0x77, U 0x1C, - U 0xEE, U 0x90, U 0x28, U 0xE2, - U 0x85, U 0x0C, U 0xFC, U 0x08, - U 0x2D, U 0xC4, U 0xCF, U 0x08, + U 0x17, U 0xEE, U 0x98, U 0x8B, + U 0x33, U 0x07, U 0xBB, U 0x01, + U 0x87, U 0x34, U 0x0B, U 0x88, + U 0x02, U 0x98, U 0xF3, U 0x97, + U 0x99, U 0x97, U 0xF4, U 0x8B, + U 0x95, U 0x87, U 0x39, U 0x9B, + U 0xF5, U 0x88, U 0x96, U 0x8B, + U 0x38, U 0x98, U 0xF6, U 0x88, + U 0x97, U 0x97, U 0xF9, U 0x9B, + U 0xF8, U 0x98, U 0xF7, U 0x17, + U 0xEE, U 0x8F, U 0x28, U 0xE2, + U 0x85, U 0x07, U 0xC7, U 0x08, + U 0x2D, U 0x74, U 0xCF, U 0x08, U 0x48, U 0x0B, U 0x28, U 0xE6, - U 0x85, U 0x65, U 0x55, U 0x0B, - U 0x2B, U 0x22, U 0x1E, U 0x2D, - U 0x22, U 0x1D, U 0x7B, U 0xD9, + U 0x85, U 0x65, U 0x55, U 0x0F, + U 0x2B, U 0x22, U 0x1E, U 0x28, + U 0x22, U 0x1D, U 0x7B, U 0x89, U 0x02, U 0x2B, U 0x0A, U 0x00, - U 0x64, U 0xBF, U 0x06, U 0x2C, + U 0x64, U 0xBF, U 0x04, U 0x2C, U 0xB0, U 0x07, U 0x28, U 0xB0, U 0x00, U 0xDA, U 0x20, U 0x06, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xC0, U 0xD1, U 0x0B, U 0x80, U 0x00, U 0xDB, U 0xA0, U 0x65, U 0xAF, U 0xE7, U 0x63, - U 0xFE, U 0xEB, U 0x00, U 0x00, - U 0x29, U 0x20, U 0x70, U 0x65, + U 0xFE, U 0xE9, U 0x00, U 0x00, + U 0x29, U 0x20, U 0x72, U 0x65, U 0x9E, U 0x9C, U 0x60, U 0x04, - U 0xE4, U 0x2A, U 0x20, U 0x70, + U 0xE7, U 0x2A, U 0x20, U 0x72, U 0x65, U 0xAE, U 0xC3, U 0x60, - U 0x04, U 0xDB, U 0x00, U 0x00, + U 0x04, U 0xDE, U 0x00, U 0x00, U 0x2E, U 0xB0, U 0x03, U 0x2C, U 0x20, U 0x67, U 0xD4, U 0xE0, U 0x65, U 0xC1, U 0x05, U 0x8A, U 0x32, U 0x8C, U 0x33, U 0x0A, U 0xFF, U 0x50, U 0x0C, U 0x45, U 0x54, U 0xBC, U 0x55, U 0x64, - U 0xF4, U 0xE6, U 0x19, U 0xEE, - U 0x75, U 0x88, U 0x2A, U 0x09, + U 0xF4, U 0xEB, U 0x19, U 0xEE, + U 0x74, U 0x88, U 0x2A, U 0x09, U 0xA9, U 0x01, U 0x09, U 0x88, - U 0x0C, U 0x64, U 0x82, U 0x1B, + U 0x0C, U 0x64, U 0x82, U 0x1F, U 0xC0, U 0x92, U 0x60, U 0x00, U 0xDD, U 0x2E, U 0xD0, U 0x03, U 0x2A, U 0x20, U 0x67, U 0xD4, @@ -1068,11 +1070,11 @@ static unsigned char t3fw[30136] = { U 0x8A, U 0x32, U 0x8B, U 0x33, U 0x0A, U 0xFC, U 0x50, U 0x0B, U 0x45, U 0x54, U 0xBC, U 0x55, - U 0x64, U 0xC4, U 0xB9, U 0x19, - U 0xEE, U 0x6A, U 0x88, U 0x2A, + U 0x64, U 0xC4, U 0xBE, U 0x19, + U 0xEE, U 0x69, U 0x88, U 0x2A, U 0x09, U 0xA9, U 0x01, U 0x79, U 0x89, U 0xD5, U 0x0B, U 0xEA, - U 0x50, U 0x64, U 0xA4, U 0xDD, + U 0x50, U 0x64, U 0xA4, U 0xE3, U 0x0C, U 0xEE, U 0x11, U 0xC0, U 0xF0, U 0x2F, U 0x16, U 0x13, U 0x2E, U 0x16, U 0x16, U 0x8A, @@ -1081,7 +1083,7 @@ static unsigned char t3fw[30136] = { U 0xDF, U 0xC0, U 0xAA, U 0xEA, U 0x7E, U 0xAB, U 0x01, U 0xB1, U 0xCF, U 0x0B, U 0xA8, U 0x50, - U 0x65, U 0x83, U 0x42, U 0x88, + U 0x65, U 0x83, U 0x46, U 0x88, U 0x37, U 0xDB, U 0xC0, U 0xAE, U 0x89, U 0x99, U 0x1E, U 0x78, U 0x9B, U 0x02, U 0x2B, U 0xCC, @@ -1091,12 +1093,12 @@ static unsigned char t3fw[30136] = { U 0x1A, U 0x7F, U 0xC3, U 0x07, U 0x7F, U 0xC9, U 0x02, U 0x7E, U 0xAB, U 0x01, U 0xC0, U 0xB1, - U 0x65, U 0xB4, U 0x98, U 0x8B, + U 0x65, U 0xB4, U 0x9D, U 0x8B, U 0x35, U 0x2F, U 0x0A, U 0x00, U 0x2A, U 0x0A, U 0x00, U 0x7A, U 0xC3, U 0x05, U 0x64, U 0xC3, - U 0xC7, U 0x2F, U 0x0A, U 0x01, - U 0x65, U 0xF4, U 0x84, U 0x2B, + U 0xCB, U 0x2F, U 0x0A, U 0x01, + U 0x65, U 0xF4, U 0x89, U 0x2B, U 0x12, U 0x16, U 0x2B, U 0x16, U 0x19, U 0x00, U 0x51, U 0x04, U 0xC0, U 0xC1, U 0x00, U 0xCC, @@ -1105,7 +1107,7 @@ static unsigned char t3fw[30136] = { U 0xFC, U 0x13, U 0x2C, U 0x16, U 0x18, U 0x2B, U 0x12, U 0x1A, U 0x2A, U 0x12, U 0x1B, U 0xDC, - U 0x50, U 0x58, U 0x18, U 0xFA, + U 0x50, U 0x58, U 0x19, U 0xA4, U 0xC0, U 0xD0, U 0xC0, U 0x90, U 0x2E, U 0x5C, U 0xF4, U 0x2C, U 0x12, U 0x17, U 0x28, U 0x12, @@ -1122,25 +1124,25 @@ static unsigned char t3fw[30136] = { U 0x03, U 0x89, U 0x75, U 0xB1, U 0xEA, U 0x2A, U 0x74, U 0x03, U 0xB0, U 0x99, U 0x09, U 0x49, - U 0x0C, U 0x65, U 0x9D, U 0xB5, + U 0x0C, U 0x65, U 0x9D, U 0xB3, U 0x2B, U 0x20, U 0x67, U 0x2D, U 0x25, U 0x02, U 0x65, U 0xB3, - U 0xF4, U 0x2B, U 0x22, U 0x1E, + U 0xFA, U 0x2B, U 0x22, U 0x1E, U 0x2C, U 0x22, U 0x1D, U 0x7B, U 0xC9, U 0x01, U 0xC0, U 0xB0, - U 0x64, U 0xBD, U 0x9E, U 0x2C, + U 0x64, U 0xBD, U 0x9C, U 0x2C, U 0xB0, U 0x07, U 0x28, U 0xB0, U 0x00, U 0xDA, U 0x20, U 0x06, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xC0, U 0xD1, U 0x0B, U 0x80, U 0x00, U 0xDB, U 0xA0, U 0x65, U 0xAF, U 0xE7, U 0x63, - U 0xFD, U 0x83, U 0x89, U 0xBA, + U 0xFD, U 0x81, U 0x89, U 0xBA, U 0xB1, U 0x99, U 0x65, U 0x90, U 0x97, U 0x88, U 0x34, U 0x1C, - U 0xEE, U 0x26, U 0x98, U 0xBA, + U 0xEE, U 0x25, U 0x98, U 0xBA, U 0x8F, U 0x33, U 0x1E, U 0xEE, - U 0x1F, U 0x0F, U 0x4F, U 0x54, + U 0x1E, U 0x0F, U 0x4F, U 0x54, U 0x2F, U 0xB4, U 0x2C, U 0x8D, U 0x2A, U 0x8A, U 0x32, U 0x0E, U 0xDD, U 0x02, U 0x0C, U 0xAC, @@ -1154,7 +1156,7 @@ static unsigned char t3fw[30136] = { U 0x0C, U 0x41, U 0x7D, U 0xC9, U 0x49, U 0x2E, U 0xB0, U 0x12, U 0xB0, U 0xEE, U 0x65, U 0xE3, - U 0xC2, U 0xC0, U 0xD0, U 0x8E, + U 0xC6, U 0xC0, U 0xD0, U 0x8E, U 0x37, U 0x8C, U 0xB8, U 0x8A, U 0x36, U 0x8F, U 0xB9, U 0x7C, U 0xA3, U 0x07, U 0x7A, U 0xC9, @@ -1170,34 +1172,35 @@ static unsigned char t3fw[30136] = { U 0xB0, U 0x7D, U 0xA3, U 0x07, U 0x7A, U 0xD9, U 0x02, U 0x7C, U 0xEB, U 0x01, U 0xC0, U 0xB1, - U 0x64, U 0xB1, U 0x5D, U 0xC0, + U 0x64, U 0xB1, U 0x61, U 0xC0, U 0x91, U 0x29, U 0x24, U 0x67, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x8A, U 0xDA, U 0xB1, U 0xAA, U 0x64, U 0xA0, - U 0xBC, U 0x2E, U 0x20, U 0x67, + U 0xC0, U 0x2C, U 0x20, U 0x67, U 0x2D, U 0x25, U 0x02, U 0x65, - U 0xE3, U 0x0B, U 0x1F, U 0xED, - U 0xF9, U 0x8A, U 0x32, U 0x18, - U 0xED, U 0xFE, U 0x0F, U 0xAF, - U 0x01, U 0x08, U 0xFF, U 0x0C, - U 0x65, U 0xF2, U 0x86, U 0x0A, - U 0x48, U 0x51, U 0x6F, U 0x82, - U 0x02, U 0x60, U 0x02, U 0x7D, + U 0xC3, U 0x11, U 0x1D, U 0xED, + U 0xF8, U 0x8A, U 0x32, U 0x1E, + U 0xED, U 0xFD, U 0x0D, U 0xAD, + U 0x01, U 0x0E, U 0xDD, U 0x0C, + U 0x65, U 0xD2, U 0x8A, U 0x0A, + U 0x4E, U 0x51, U 0x6F, U 0xE2, + U 0x02, U 0x60, U 0x02, U 0x81, U 0xC0, U 0x90, U 0x29, U 0x24, - U 0x67, U 0x09, U 0x0A, U 0x47, - U 0x65, U 0xA2, U 0xF2, U 0x7B, - U 0xC9, U 0x01, U 0xC0, U 0xB0, - U 0x64, U 0xBC, U 0xAE, U 0x2C, + U 0x67, U 0x09, U 0x0F, U 0x47, + U 0x65, U 0xF2, U 0xF8, U 0x28, + U 0x22, U 0x1D, U 0x7B, U 0x89, + U 0x02, U 0x2B, U 0x0A, U 0x00, + U 0x64, U 0xBC, U 0xA8, U 0x2C, U 0xB0, U 0x07, U 0x28, U 0xB0, U 0x00, U 0xDA, U 0x20, U 0x06, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xC0, U 0xD1, U 0x0B, U 0x80, U 0x00, U 0xDB, U 0xA0, U 0x65, U 0xAF, U 0xE7, U 0x63, - U 0xFC, U 0x93, U 0x00, U 0x00, + U 0xFC, U 0x8D, U 0x00, U 0x00, U 0x0C, U 0xE9, U 0x50, U 0x64, - U 0x92, U 0xEB, U 0x0C, U 0xEF, + U 0x92, U 0xED, U 0x0C, U 0xEF, U 0x11, U 0xC0, U 0x80, U 0x28, U 0x16, U 0x11, U 0xAF, U 0xBF, U 0x2F, U 0x16, U 0x19, U 0x8E, @@ -1216,31 +1219,31 @@ static unsigned char t3fw[30136] = { U 0x1A, U 0x7A, U 0xE3, U 0x07, U 0x7A, U 0xE9, U 0x02, U 0x7F, U 0xBB, U 0x01, U 0xC0, U 0xC1, - U 0x65, U 0xC2, U 0xA4, U 0x8B, + U 0x65, U 0xC2, U 0xA5, U 0x8B, U 0x35, U 0x2C, U 0x0A, U 0x00, U 0x2A, U 0x0A, U 0x00, U 0x7A, U 0xE3, U 0x05, U 0x64, U 0xE1, U 0xCA, U 0x2C, U 0x0A, U 0x01, - U 0x64, U 0xCE, U 0x11, U 0x60, - U 0x02, U 0x8D, U 0x88, U 0x34, - U 0x1B, U 0xED, U 0xD1, U 0x98, + U 0x64, U 0xCE, U 0x0D, U 0x60, + U 0x02, U 0x8E, U 0x88, U 0x34, + U 0x1B, U 0xED, U 0xCF, U 0x98, U 0xDA, U 0x8F, U 0x33, U 0x1E, - U 0xED, U 0xCA, U 0x0F, U 0x4F, + U 0xED, U 0xC8, U 0x0F, U 0x4F, U 0x54, U 0x2F, U 0xD4, U 0x2C, U 0x8C, U 0x2A, U 0x8A, U 0x32, U 0x0E, U 0xCC, U 0x02, U 0x0B, U 0xAB, U 0x01, U 0x0C, U 0xBB, - U 0x0C, U 0x65, U 0xBF, U 0x0E, + U 0x0C, U 0x65, U 0xBF, U 0x0A, U 0x0A, U 0x49, U 0x51, U 0x6E, U 0x92, U 0x02, U 0x63, U 0xFF, - U 0x05, U 0x8A, U 0x33, U 0x0A, + U 0x01, U 0x8A, U 0x33, U 0x0A, U 0xAB, U 0x50, U 0x64, U 0xBE, - U 0xFD, U 0x2C, U 0xD0, U 0x13, + U 0xF9, U 0x2C, U 0xD0, U 0x13, U 0x0A, U 0xEE, U 0x51, U 0x0E, U 0xCE, U 0x01, U 0x0E, U 0x0E, U 0x41, U 0x0C, U 0x0C, U 0x41, U 0x0E, U 0xCC, U 0x0C, U 0x65, - U 0xCE, U 0xE8, U 0x2F, U 0xD0, + U 0xCE, U 0xE4, U 0x2F, U 0xD0, U 0x12, U 0xB0, U 0xFF, U 0x65, U 0xF2, U 0x6E, U 0xC0, U 0xB0, U 0x8E, U 0x37, U 0x8C, U 0xD8, @@ -1248,7 +1251,7 @@ static unsigned char t3fw[30136] = { U 0x09, U 0x7C, U 0xA3, U 0x07, U 0x7A, U 0xC9, U 0x02, U 0x7E, U 0xFB, U 0x01, U 0xC0, U 0xB1, - U 0x65, U 0xBE, U 0xC7, U 0x88, + U 0x65, U 0xBE, U 0xC3, U 0x88, U 0x35, U 0xDB, U 0xA0, U 0xAE, U 0x8E, U 0x78, U 0xEB, U 0x01, U 0xB1, U 0xAB, U 0x89, U 0xD7, @@ -1258,7 +1261,7 @@ static unsigned char t3fw[30136] = { U 0xA3, U 0x07, U 0x7A, U 0xB9, U 0x02, U 0x7D, U 0xEB, U 0x01, U 0xC0, U 0xC1, U 0x65, U 0xCE, - U 0xA1, U 0xC0, U 0x90, U 0x29, + U 0x9D, U 0xC0, U 0x90, U 0x29, U 0x24, U 0x67, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x88, U 0x37, U 0x8C, U 0x36, U 0x98, U 0x14, @@ -1276,7 +1279,7 @@ static unsigned char t3fw[30136] = { U 0x7A, U 0xE9, U 0x06, U 0x88, U 0x15, U 0x8E, U 0x16, U 0x78, U 0xEB, U 0x01, U 0xC0, U 0xF1, - U 0x65, U 0xF1, U 0xB9, U 0x29, + U 0x65, U 0xF1, U 0xBA, U 0x29, U 0x12, U 0x1A, U 0x2F, U 0x12, U 0x11, U 0x8A, U 0x35, U 0x2E, U 0x12, U 0x1B, U 0x9A, U 0x1A, @@ -1290,7 +1293,7 @@ static unsigned char t3fw[30136] = { U 0x2A, U 0x12, U 0x01, U 0x7A, U 0x8B, U 0x01, U 0xC0, U 0xF1, U 0x64, U 0xF0, U 0x81, U 0x60, - U 0x01, U 0x82, U 0x89, U 0x36, + U 0x01, U 0x83, U 0x89, U 0x36, U 0x8B, U 0x37, U 0x99, U 0x17, U 0x0B, U 0xE8, U 0x0C, U 0x98, U 0x1F, U 0x09, U 0xC9, U 0x0C, @@ -1307,7 +1310,7 @@ static unsigned char t3fw[30136] = { U 0x7F, U 0xA9, U 0x06, U 0x88, U 0x18, U 0x8F, U 0x19, U 0x78, U 0xFB, U 0x01, U 0xC0, U 0xE1, - U 0x65, U 0xE1, U 0x3D, U 0x29, + U 0x65, U 0xE1, U 0x3E, U 0x29, U 0x12, U 0x1A, U 0x2F, U 0x12, U 0x13, U 0x8A, U 0x35, U 0x2E, U 0x12, U 0x1B, U 0x9A, U 0x1B, @@ -1320,7 +1323,7 @@ static unsigned char t3fw[30136] = { U 0x0A, U 0x7E, U 0xA9, U 0x05, U 0x2A, U 0x12, U 0x03, U 0x7A, U 0x8B, U 0x01, U 0xC0, U 0xF1, - U 0x65, U 0xF1, U 0x09, U 0x2E, + U 0x65, U 0xF1, U 0x0A, U 0x2E, U 0x12, U 0x16, U 0x2E, U 0x16, U 0x19, U 0x2A, U 0x12, U 0x1B, U 0x00, U 0x51, U 0x04, U 0xC0, @@ -1334,74 +1337,74 @@ static unsigned char t3fw[30136] = { U 0x7F, U 0xCB, U 0x01, U 0xB1, U 0xAA, U 0x2A, U 0x16, U 0x1B, U 0x2C, U 0x16, U 0x1A, U 0x63, - U 0xFC, U 0x62, U 0x00, U 0x00, + U 0xFC, U 0x5E, U 0x00, U 0x00, U 0x7F, U 0xB3, U 0x02, U 0x63, U 0xFE, U 0x31, U 0x63, U 0xFE, U 0x2B, U 0x7E, U 0xB3, U 0x02, - U 0x63, U 0xFC, U 0x34, U 0x63, - U 0xFC, U 0x2E, U 0x00, U 0x00, + U 0x63, U 0xFC, U 0x30, U 0x63, + U 0xFC, U 0x2A, U 0x00, U 0x00, U 0x64, U 0x50, U 0xC0, U 0xDA, - U 0x20, U 0xDB, U 0xF0, U 0x58, - U 0x15, U 0xDE, U 0xC0, U 0x20, + U 0x20, U 0xDB, U 0xC0, U 0x58, + U 0x16, U 0x78, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xC0, U 0x91, - U 0x63, U 0xFD, U 0x7E, U 0x00, + U 0x63, U 0xFD, U 0x7A, U 0x00, U 0xC0, U 0x91, U 0x63, U 0xFA, - U 0x4C, U 0xDA, U 0x20, U 0xDB, + U 0x44, U 0xDA, U 0x20, U 0xDB, U 0x70, U 0xC0, U 0xD1, U 0x2E, U 0x0A, U 0x80, U 0xC0, U 0x9A, U 0x29, U 0x24, U 0x68, U 0x2C, - U 0x70, U 0x07, U 0x58, U 0x14, - U 0xCE, U 0xD2, U 0xA0, U 0xD1, - U 0x0F, U 0x03, U 0x4C, U 0x0B, - U 0x18, U 0xED, U 0x51, U 0xDB, - U 0xC0, U 0xA8, U 0x28, U 0x78, - U 0xC3, U 0x02, U 0x2B, U 0xCD, + U 0x70, U 0x07, U 0x58, U 0x15, + U 0x68, U 0xD2, U 0xA0, U 0xD1, + U 0x0F, U 0x03, U 0x47, U 0x0B, + U 0x18, U 0xED, U 0x4F, U 0xDB, + U 0x70, U 0xA8, U 0x28, U 0x78, + U 0x73, U 0x02, U 0x2B, U 0x7D, U 0xF8, U 0xD9, U 0xB0, U 0x63, - U 0xFA, U 0x65, U 0x00, U 0x00, + U 0xFA, U 0x61, U 0x00, U 0x00, U 0x2A, U 0x2C, U 0x74, U 0xDB, - U 0x40, U 0x58, U 0x0E, U 0x50, - U 0x63, U 0xFA, U 0xE8, U 0x00, - U 0x00, U 0x00, U 0x2D, U 0x25, - U 0x02, U 0x7B, U 0xC9, U 0x01, - U 0xC0, U 0xB0, U 0x64, U 0xB0, - U 0x17, U 0x2C, U 0xB0, U 0x07, - U 0x28, U 0xB0, U 0x00, U 0xDA, - U 0x20, U 0x06, U 0x88, U 0x0A, - U 0x28, U 0x82, U 0x4C, U 0xC0, - U 0xD1, U 0x0B, U 0x80, U 0x00, - U 0xDB, U 0xA0, U 0x65, U 0xAF, - U 0xE7, U 0xC0, U 0x20, U 0xD1, - U 0x0F, U 0xC0, U 0x91, U 0x63, - U 0xFC, U 0x04, U 0x02, U 0x2A, - U 0x02, U 0x58, U 0x02, U 0x50, - U 0x0A, U 0xA2, U 0x02, U 0x06, - U 0x00, U 0x00, U 0x02, U 0x2A, - U 0x02, U 0x58, U 0x02, U 0x4D, - U 0x0A, U 0xA2, U 0x02, U 0x06, - U 0x00, U 0x00, U 0xDB, U 0x70, - U 0xDA, U 0x20, U 0xC0, U 0xD1, - U 0x2E, U 0x0A, U 0x80, U 0xC0, - U 0x9E, U 0x29, U 0x24, U 0x68, - U 0x2C, U 0x70, U 0x07, U 0x58, - U 0x14, U 0xAE, U 0xC0, U 0x20, - U 0xD1, U 0x0F, U 0xC0, U 0x94, - U 0x63, U 0xFB, U 0xCF, U 0x00, - U 0xC0, U 0x96, U 0x63, U 0xFB, + U 0x40, U 0x58, U 0x0E, U 0xE3, + U 0x63, U 0xFA, U 0xE4, U 0x00, + U 0x00, U 0x29, U 0x22, U 0x1D, + U 0x2D, U 0x25, U 0x02, U 0x7B, + U 0x99, U 0x01, U 0xC0, U 0xB0, + U 0xC9, U 0xB6, U 0x2C, U 0xB0, + U 0x07, U 0x28, U 0xB0, U 0x00, + U 0xDA, U 0x20, U 0x06, U 0x88, + U 0x0A, U 0x28, U 0x82, U 0x4C, + U 0xC0, U 0xD1, U 0x0B, U 0x80, + U 0x00, U 0xDB, U 0xA0, U 0x65, + U 0xAF, U 0xE7, U 0xC0, U 0x20, + U 0xD1, U 0x0F, U 0xC0, U 0x91, + U 0x63, U 0xFB, U 0xFF, U 0x00, + U 0x02, U 0x2A, U 0x02, U 0x58, + U 0x02, U 0x4C, U 0x0A, U 0xA2, + U 0x02, U 0x06, U 0x00, U 0x00, + U 0x02, U 0x2A, U 0x02, U 0x58, + U 0x02, U 0x49, U 0x0A, U 0xA2, + U 0x02, U 0x06, U 0x00, U 0x00, + U 0xDB, U 0x70, U 0xDA, U 0x20, + U 0xC0, U 0xD1, U 0x2E, U 0x0A, + U 0x80, U 0xC0, U 0x9E, U 0x29, + U 0x24, U 0x68, U 0x2C, U 0x70, + U 0x07, U 0x58, U 0x15, U 0x47, + U 0xC0, U 0x20, U 0xD1, U 0x0F, + U 0xC0, U 0x94, U 0x63, U 0xFB, U 0xC9, U 0xC0, U 0x96, U 0x63, - U 0xFB, U 0xC4, U 0x00, U 0x00, + U 0xFB, U 0xC4, U 0xC0, U 0x96, + U 0x63, U 0xFB, U 0xBF, U 0x00, U 0x2A, U 0x2C, U 0x74, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0x5B, - U 0xFE, U 0x13, U 0xDB, U 0xA0, + U 0xFE, U 0x11, U 0xDB, U 0xA0, U 0xC2, U 0xA0, U 0x2A, U 0xB4, - U 0x00, U 0x2F, U 0x20, U 0x0C, + U 0x00, U 0x2C, U 0x20, U 0x0C, U 0x63, U 0xFF, U 0x27, U 0x00, U 0x8D, U 0x35, U 0x8C, U 0xB7, U 0x7D, U 0xCB, U 0x02, U 0x63, U 0xFD, U 0xD2, U 0x63, U 0xFC, - U 0x71, U 0x8F, U 0x35, U 0x8E, + U 0x6D, U 0x8F, U 0x35, U 0x8E, U 0xD7, U 0x7F, U 0xEB, U 0x02, U 0x63, U 0xFD, U 0xC5, U 0x63, - U 0xFC, U 0x64, U 0x00, U 0x00, + U 0xFC, U 0x60, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, @@ -1413,7 +1416,7 @@ static unsigned char t3fw[30136] = { U 0x2A, U 0x25, U 0x02, U 0x7B, U 0x89, U 0x01, U 0xDB, U 0xA0, U 0xC9, U 0xB9, U 0x13, U 0xED, - U 0x08, U 0xDA, U 0x20, U 0x28, + U 0x06, U 0xDA, U 0x20, U 0x28, U 0xB0, U 0x00, U 0x2C, U 0xB0, U 0x07, U 0x03, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xC0, @@ -1421,35 +1424,39 @@ static unsigned char t3fw[30136] = { U 0xDB, U 0xA0, U 0x65, U 0xAF, U 0xE7, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, - U 0x6C, U 0x10, U 0x04, U 0x29, + U 0x6C, U 0x10, U 0x04, U 0x2C, U 0x20, U 0x06, U 0x2A, U 0x21, - U 0x02, U 0x68, U 0x98, U 0x05, - U 0x28, U 0x9C, U 0xF9, U 0x65, - U 0x81, U 0x1A, U 0x0A, U 0x0A, - U 0x4C, U 0x65, U 0xA0, U 0xF0, - U 0x16, U 0xEC, U 0xFB, U 0x2B, - U 0x62, U 0x9E, U 0x1A, U 0xEC, - U 0xF8, U 0x6F, U 0xB8, U 0x02, - U 0x60, U 0x00, U 0xF1, U 0x2A, - U 0xA2, U 0x26, U 0x68, U 0xA0, - U 0x07, U 0x8B, U 0x20, U 0x0A, - U 0xBB, U 0x0C, U 0x65, U 0xB0, - U 0xE3, U 0x2A, U 0x62, U 0x9D, - U 0x64, U 0xA0, U 0xDD, U 0x2B, - U 0x20, U 0x0C, U 0x0C, U 0xBC, - U 0x11, U 0xA6, U 0xCC, U 0x2D, - U 0xC2, U 0x86, U 0x6F, U 0xD9, - U 0x02, U 0x60, U 0x00, U 0xD7, - U 0x1D, U 0xEC, U 0xEF, U 0x0D, + U 0x02, U 0x68, U 0xC8, U 0x05, + U 0x28, U 0xCC, U 0xF9, U 0x65, + U 0x81, U 0x2E, U 0x0A, U 0x09, + U 0x4C, U 0x65, U 0x91, U 0x04, + U 0x8F, U 0x30, U 0xC1, U 0xB8, + U 0x0F, U 0x8F, U 0x14, U 0x7F, + U 0xB0, U 0x05, U 0x28, U 0x21, + U 0x23, U 0x65, U 0x81, U 0x27, + U 0x16, U 0xEC, U 0xF5, U 0x29, + U 0x62, U 0x9E, U 0x6F, U 0x98, + U 0x02, U 0x60, U 0x00, U 0xF8, + U 0x19, U 0xEC, U 0xF1, U 0x29, + U 0x92, U 0x26, U 0x68, U 0x90, + U 0x07, U 0x8A, U 0x20, U 0x09, + U 0xAA, U 0x0C, U 0x65, U 0xA0, + U 0xE7, U 0x2A, U 0x62, U 0x9D, + U 0x64, U 0xA0, U 0xE1, U 0x2B, + U 0x20, U 0x0C, U 0x0C, U 0xB9, + U 0x11, U 0xA6, U 0x99, U 0x2D, + U 0x92, U 0x86, U 0x6F, U 0xD9, + U 0x02, U 0x60, U 0x00, U 0xDB, + U 0x1D, U 0xEC, U 0xE9, U 0x0D, U 0xBD, U 0x0A, U 0x2D, U 0xD2, U 0xA3, U 0x68, U 0xD0, U 0x07, U 0x8E, U 0x20, U 0x0D, U 0xEE, - U 0x0C, U 0x65, U 0xE0, U 0xC3, - U 0x27, U 0xC2, U 0x85, U 0xC0, - U 0xE0, U 0x64, U 0x70, U 0xBB, - U 0x1D, U 0xEC, U 0xF4, U 0x68, - U 0x43, U 0x4D, U 0x1C, U 0xEC, - U 0xF3, U 0x8A, U 0x2B, U 0x0C, + U 0x0C, U 0x65, U 0xE0, U 0xC7, + U 0x27, U 0x92, U 0x85, U 0xC0, + U 0xE0, U 0x64, U 0x70, U 0xBF, + U 0x1D, U 0xEC, U 0xEE, U 0x68, + U 0x43, U 0x4E, U 0x1C, U 0xEC, + U 0xED, U 0x8A, U 0x2B, U 0x0C, U 0xAA, U 0x02, U 0x9A, U 0x70, U 0x89, U 0x20, U 0x08, U 0x99, U 0x11, U 0x0D, U 0x99, U 0x02, @@ -1458,75 +1465,93 @@ static unsigned char t3fw[30136] = { U 0x9F, U 0x75, U 0x28, U 0x21, U 0x04, U 0x08, U 0x88, U 0x11, U 0x98, U 0x77, U 0x18, U 0xEC, - U 0xE4, U 0x0C, U 0xBF, U 0x11, + U 0xDE, U 0x0C, U 0xBF, U 0x11, U 0xA6, U 0xFF, U 0x2D, U 0xF2, U 0x85, U 0xA8, U 0xB8, U 0x2E, U 0x84, U 0xCF, U 0x2D, U 0xDC, U 0x28, U 0x2D, U 0xF6, U 0x85, U 0xC8, U 0x5A, U 0x2A, U 0x2C, U 0x74, U 0xDB, U 0x40, U 0x58, - U 0x0D, U 0xE7, U 0xD2, U 0xA0, + U 0x0E, U 0x76, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, - U 0x2C, U 0x9C, U 0xF9, U 0x64, - U 0xC0, U 0x8D, U 0x2C, U 0x20, - U 0x66, U 0x89, U 0x31, U 0xB1, - U 0xCC, U 0x0C, U 0x0C, U 0x47, - U 0x2C, U 0x24, U 0x66, U 0x6F, - U 0xC6, U 0x69, U 0x70, U 0x9E, - U 0x66, U 0x18, U 0xEC, U 0xDA, - U 0x89, U 0x30, U 0x8F, U 0x2B, - U 0x09, U 0x89, U 0x40, U 0x0B, - U 0x99, U 0x10, U 0x09, U 0xFF, - U 0x02, U 0x08, U 0xFF, U 0x02, - U 0x9F, U 0x70, U 0x8C, U 0x20, - U 0x08, U 0xCC, U 0x11, U 0x0D, - U 0xCC, U 0x02, U 0x9C, U 0x71, - U 0x8A, U 0x33, U 0x9A, U 0x73, - U 0x89, U 0x32, U 0x99, U 0x72, - U 0x88, U 0x2A, U 0x98, U 0x74, - U 0x8F, U 0x34, U 0x9F, U 0x75, - U 0x63, U 0xFF, U 0x82, U 0x00, + U 0x00, U 0x29, U 0xCC, U 0xF9, + U 0x64, U 0x90, U 0xB1, U 0x2C, + U 0x20, U 0x66, U 0x89, U 0x31, + U 0xB1, U 0xCC, U 0x0C, U 0x0C, + U 0x47, U 0x2C, U 0x24, U 0x66, + U 0x6E, U 0xC6, U 0x02, U 0x60, + U 0x00, U 0x85, U 0x09, U 0xF8, + U 0x50, U 0x65, U 0x80, U 0x7F, + U 0x1C, U 0xEC, U 0xD3, U 0x8A, + U 0x2B, U 0x0F, U 0x08, U 0x40, + U 0x0B, U 0x88, U 0x10, U 0x08, + U 0xAA, U 0x02, U 0x0C, U 0xAA, + U 0x02, U 0x9A, U 0x70, U 0x89, + U 0x20, U 0x08, U 0x99, U 0x11, + U 0x0D, U 0x99, U 0x02, U 0x99, + U 0x71, U 0x88, U 0x33, U 0x98, + U 0x73, U 0x8C, U 0x32, U 0x9C, + U 0x72, U 0x8A, U 0x2A, U 0x9A, + U 0x74, U 0x89, U 0x34, U 0x99, + U 0x75, U 0x63, U 0xFF, U 0x7D, U 0x00, U 0xCC, U 0x57, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x14, U 0xB8, + U 0x40, U 0x58, U 0x15, U 0x4D, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x15, U 0x47, + U 0xB6, U 0x58, U 0x15, U 0xDC, U 0x63, U 0xFF, U 0xE5, U 0x00, U 0xDA, U 0x20, U 0x58, U 0x15, - U 0x45, U 0x63, U 0xFF, U 0xDC, + U 0xDA, U 0x63, U 0xFF, U 0xDC, U 0x00, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, - U 0x50, U 0x58, U 0x15, U 0xC7, + U 0x50, U 0x58, U 0x16, U 0x68, U 0xD2, U 0xA0, U 0xD1, U 0x0F, + U 0xC8, U 0x58, U 0xDA, U 0x20, + U 0xDB, U 0x30, U 0x58, U 0x14, + U 0xBA, U 0x2A, U 0x21, U 0x02, + U 0x65, U 0xAF, U 0xBD, U 0xC0, + U 0x94, U 0x09, U 0xA9, U 0x02, + U 0x29, U 0x25, U 0x02, U 0x63, + U 0xFF, U 0xB2, U 0x00, U 0x00, U 0x2B, U 0x21, U 0x04, U 0x58, - U 0x13, U 0xDA, U 0x1D, U 0xEC, - U 0xBD, U 0x2B, U 0x20, U 0x0C, - U 0xC0, U 0xE0, U 0x2E, U 0x24, - U 0x66, U 0x63, U 0xFF, U 0x84, - U 0x2F, U 0x21, U 0x23, U 0xC0, - U 0xC8, U 0x7F, U 0xC3, U 0x02, - U 0x63, U 0xFF, U 0x79, U 0x2C, - U 0x20, U 0x66, U 0x2B, U 0x21, - U 0x04, U 0xB1, U 0xCC, U 0x0C, - U 0x0C, U 0x47, U 0x2C, U 0x24, - U 0x66, U 0x58, U 0x13, U 0xCF, - U 0x1D, U 0xEC, U 0xB3, U 0x2B, - U 0x20, U 0x0C, U 0xC0, U 0xE0, - U 0x2E, U 0x24, U 0x66, U 0x63, - U 0xFF, U 0x5A, U 0x00, U 0x00, + U 0x14, U 0x66, U 0x1D, U 0xEC, + U 0xAF, U 0xC0, U 0xE0, U 0x2E, + U 0x24, U 0x66, U 0x8F, U 0x30, + U 0x2B, U 0x20, U 0x0C, U 0x0F, + U 0x8F, U 0x14, U 0x63, U 0xFF, + U 0x66, U 0x29, U 0x21, U 0x38, + U 0xC0, U 0x88, U 0x79, U 0x83, + U 0x1F, U 0x8C, U 0x31, U 0x0C, + U 0xFC, U 0x50, U 0x64, U 0xCF, + U 0x56, U 0x2B, U 0x21, U 0x04, + U 0xC0, U 0xC0, U 0x58, U 0x14, + U 0x5B, U 0x1D, U 0xEC, U 0xA4, + U 0xC0, U 0xE0, U 0x8F, U 0x30, + U 0x2B, U 0x20, U 0x0C, U 0x0F, + U 0x8F, U 0x14, U 0x63, U 0xFF, + U 0x3E, U 0x2C, U 0x20, U 0x66, + U 0x2B, U 0x21, U 0x04, U 0xB1, + U 0xCC, U 0x0C, U 0x0C, U 0x47, + U 0x2C, U 0x24, U 0x66, U 0x58, + U 0x14, U 0x53, U 0x1D, U 0xEC, + U 0x9C, U 0xC0, U 0xE0, U 0x2E, + U 0x24, U 0x66, U 0x8F, U 0x30, + U 0x2B, U 0x20, U 0x0C, U 0x0F, + U 0x8F, U 0x14, U 0x63, U 0xFF, + U 0x1A, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0xB7, U 0xC0, U 0xA1, U 0x16, - U 0xEC, U 0xB0, U 0x15, U 0xEC, - U 0xA2, U 0xD7, U 0x20, U 0xD8, + U 0xEC, U 0x98, U 0x15, U 0xEC, + U 0x8A, U 0xD7, U 0x20, U 0xD8, U 0x40, U 0xB8, U 0x22, U 0xC0, U 0x40, U 0x05, U 0x35, U 0x02, U 0x96, U 0x71, U 0x95, U 0x70, U 0x02, U 0xA4, U 0x38, U 0x04, U 0x04, U 0x42, U 0xC9, U 0x4B, - U 0x1A, U 0xEC, U 0x95, U 0x19, - U 0xEC, U 0x96, U 0x29, U 0xA6, + U 0x1A, U 0xEC, U 0x7D, U 0x19, + U 0xEC, U 0x7E, U 0x29, U 0xA6, U 0x7E, U 0xC1, U 0x40, U 0xD3, U 0x0F, U 0x6D, U 0x4A, U 0x05, U 0x00, U 0x80, U 0x88, U 0x00, @@ -1535,34 +1560,34 @@ static unsigned char t3fw[30136] = { U 0x0F, U 0xC0, U 0x50, U 0x08, U 0xA5, U 0x38, U 0x75, U 0xB0, U 0xE3, U 0x63, U 0xFF, U 0xD7, - U 0x6C, U 0x10, U 0x08, U 0x93, - U 0x14, U 0x94, U 0x12, U 0x29, + U 0x6C, U 0x10, U 0x06, U 0x93, + U 0x13, U 0x94, U 0x11, U 0x29, U 0x20, U 0x06, U 0x65, U 0x52, U 0x88, U 0xC0, U 0x71, U 0x68, U 0x98, U 0x05, U 0x2A, U 0x9C, U 0xF9, U 0x65, U 0xA2, U 0x98, - U 0x16, U 0xEC, U 0x89, U 0x29, - U 0x21, U 0x02, U 0x8A, U 0x14, + U 0x16, U 0xEC, U 0x71, U 0x29, + U 0x21, U 0x02, U 0x8A, U 0x13, U 0x09, U 0x09, U 0x4C, U 0x65, - U 0x90, U 0xC7, U 0x8A, U 0xA0, + U 0x90, U 0xCD, U 0x8A, U 0xA0, U 0x0A, U 0x6A, U 0x51, U 0x2A, U 0xAC, U 0xFD, U 0x65, U 0xA0, - U 0xBC, U 0xCC, U 0x5F, U 0xDB, + U 0xC2, U 0xCC, U 0x5F, U 0xDB, U 0x30, U 0xDA, U 0x20, U 0x8C, - U 0x12, U 0x58, U 0x14, U 0x7C, - U 0xC0, U 0x51, U 0x9A, U 0x14, + U 0x11, U 0x58, U 0x15, U 0x00, + U 0xC0, U 0x51, U 0x9A, U 0x13, U 0xC7, U 0xBF, U 0x9B, U 0xA9, - U 0x8E, U 0x14, U 0x2E, U 0xE2, + U 0x8E, U 0x13, U 0x2E, U 0xE2, U 0x09, U 0x68, U 0xE0, U 0x60, U 0x2F, U 0x62, U 0x9E, U 0x1D, - U 0xEC, U 0x7A, U 0x6F, U 0xF8, - U 0x02, U 0x60, U 0x00, U 0x81, + U 0xEC, U 0x62, U 0x6F, U 0xF8, + U 0x02, U 0x60, U 0x00, U 0x84, U 0x2D, U 0xD2, U 0x26, U 0x68, U 0xD0, U 0x05, U 0x2F, U 0x22, - U 0x00, U 0x7D, U 0xF9, U 0x75, + U 0x00, U 0x7D, U 0xF9, U 0x78, U 0x2C, U 0x62, U 0x9D, U 0xC7, - U 0x90, U 0x64, U 0xC0, U 0x6D, - U 0x9C, U 0x11, U 0x8A, U 0x14, + U 0x90, U 0x64, U 0xC0, U 0x70, + U 0x9C, U 0x10, U 0x8A, U 0x13, U 0x2B, U 0x20, U 0x0C, U 0x2A, U 0xA0, U 0x20, U 0x0C, U 0xBD, U 0x11, U 0xA6, U 0xDD, U 0x0A, @@ -1570,16 +1595,16 @@ static unsigned char t3fw[30136] = { U 0x09, U 0x88, U 0x01, U 0x29, U 0xD2, U 0x86, U 0xAF, U 0x88, U 0x28, U 0x8C, U 0x09, U 0x79, - U 0x8B, U 0x55, U 0x1F, U 0xEC, - U 0x6C, U 0x0F, U 0xBF, U 0x0A, + U 0x8B, U 0x59, U 0x1F, U 0xEC, + U 0x54, U 0x0F, U 0xBF, U 0x0A, U 0x2F, U 0xF2, U 0xA3, U 0x68, U 0xF0, U 0x05, U 0x28, U 0x22, - U 0x00, U 0x7F, U 0x89, U 0x43, + U 0x00, U 0x7F, U 0x89, U 0x47, U 0x29, U 0xD2, U 0x85, U 0xD4, - U 0x90, U 0x65, U 0x90, U 0x77, - U 0x60, U 0x00, U 0x3D, U 0x00, + U 0x90, U 0x65, U 0x90, U 0x75, + U 0x60, U 0x00, U 0x43, U 0x00, U 0x00, U 0x2B, U 0x20, U 0x0C, - U 0x1F, U 0xEC, U 0x64, U 0x0C, + U 0x1F, U 0xEC, U 0x4C, U 0x0C, U 0xBD, U 0x11, U 0xA6, U 0xDD, U 0x29, U 0xD2, U 0x86, U 0x0F, U 0xBF, U 0x0A, U 0x6E, U 0x96, @@ -1588,47 +1613,47 @@ static unsigned char t3fw[30136] = { U 0x20, U 0x7F, U 0x89, U 0x05, U 0x29, U 0xD2, U 0x85, U 0x65, U 0x91, U 0x65, U 0xDA, U 0x20, - U 0x58, U 0x14, U 0xE7, U 0x60, - U 0x00, U 0x13, U 0xDA, U 0x20, - U 0xC0, U 0xB6, U 0x58, U 0x14, - U 0xE5, U 0x60, U 0x00, U 0x09, + U 0x58, U 0x15, U 0x6B, U 0xC9, + U 0x5C, U 0x60, U 0x01, U 0xFF, + U 0x00, U 0xDA, U 0x20, U 0xC0, + U 0xB6, U 0x58, U 0x15, U 0x68, + U 0x60, U 0x00, U 0x0C, U 0x00, U 0xC0, U 0x90, U 0x63, U 0xFF, - U 0xB9, U 0xDA, U 0x20, U 0x58, - U 0x14, U 0xE2, U 0x89, U 0x14, - U 0x89, U 0x91, U 0x09, U 0xFE, - U 0x50, U 0x65, U 0x51, U 0xE4, - U 0x8C, U 0x12, U 0x8D, U 0x14, - U 0xDA, U 0x20, U 0xDB, U 0xD0, - U 0x8D, U 0xD0, U 0x9E, U 0x10, - U 0x0D, U 0x6D, U 0x51, U 0x58, - U 0x13, U 0x54, U 0x9A, U 0x14, - U 0x64, U 0xA2, U 0x08, U 0xC7, - U 0x5F, U 0x8F, U 0xA1, U 0x95, - U 0xA9, U 0xC0, U 0x51, U 0x0F, - U 0x0F, U 0x47, U 0x9F, U 0x12, - U 0x63, U 0xFE, U 0xFB, U 0x00, - U 0xC0, U 0x91, U 0xC0, U 0xF1, - U 0x28, U 0x20, U 0x06, U 0x2C, - U 0x20, U 0x66, U 0x28, U 0x8C, - U 0xF9, U 0xA7, U 0xCC, U 0x0C, - U 0x0C, U 0x47, U 0x2C, U 0x24, - U 0x66, U 0x6F, U 0xC6, U 0x08, - U 0x8D, U 0x14, U 0x8D, U 0xD1, - U 0x70, U 0xDE, U 0x01, U 0xC0, - U 0x90, U 0xDD, U 0x90, U 0x64, + U 0xB5, U 0x00, U 0x00, U 0xDA, + U 0x20, U 0x58, U 0x15, U 0x64, + U 0x65, U 0x51, U 0xE4, U 0x8D, + U 0x13, U 0x8C, U 0x11, U 0xDB, + U 0xD0, U 0x8D, U 0xD0, U 0x02, + U 0x2A, U 0x02, U 0x0D, U 0x6D, + U 0x51, U 0x58, U 0x13, U 0xD6, + U 0x9A, U 0x13, U 0x64, U 0xA1, + U 0xCE, U 0xC7, U 0x5F, U 0x8F, + U 0xA1, U 0x95, U 0xA9, U 0xC0, + U 0x51, U 0x0F, U 0x0F, U 0x47, + U 0x9F, U 0x11, U 0x63, U 0xFE, + U 0xFD, U 0x00, U 0xC0, U 0x91, + U 0xC0, U 0xF1, U 0x28, U 0x20, + U 0x06, U 0x2C, U 0x20, U 0x66, + U 0x28, U 0x8C, U 0xF9, U 0xA7, + U 0xCC, U 0x0C, U 0x0C, U 0x47, + U 0x2C, U 0x24, U 0x66, U 0x6F, + U 0xC6, U 0x09, U 0x8D, U 0x13, + U 0x8D, U 0xD1, U 0x70, U 0xDE, + U 0x02, U 0x29, U 0x0A, U 0x00, + U 0x09, U 0x9D, U 0x02, U 0x64, U 0x81, U 0x59, U 0xC9, U 0xD3, - U 0x2A, U 0x12, U 0x01, U 0x2B, - U 0x21, U 0x04, U 0x58, U 0x13, - U 0x64, U 0x8A, U 0x14, U 0xC0, - U 0xB0, U 0x2B, U 0x24, U 0x66, - U 0x8E, U 0xA9, U 0x2A, U 0xA0, + U 0x8A, U 0x10, U 0x2B, U 0x21, + U 0x04, U 0x58, U 0x13, U 0xE6, + U 0x8A, U 0x13, U 0xC0, U 0xB0, + U 0x2B, U 0x24, U 0x66, U 0x2E, + U 0xA2, U 0x09, U 0x2A, U 0xA0, U 0x20, U 0x0E, U 0x28, U 0x14, - U 0x1C, U 0xEC, U 0x43, U 0x8D, - U 0x14, U 0x15, U 0xEC, U 0x37, + U 0x1C, U 0xEC, U 0x2B, U 0x8D, + U 0x13, U 0x15, U 0xEC, U 0x1F, U 0xC1, U 0x70, U 0x0A, U 0x77, U 0x36, U 0x85, U 0x56, U 0x2D, U 0xDC, U 0x28, U 0xAC, U 0x2C, - U 0x9C, U 0x13, U 0xDE, U 0xD0, + U 0x9C, U 0x12, U 0xDE, U 0xD0, U 0xA8, U 0x55, U 0x7C, U 0xD3, U 0x02, U 0x2E, U 0xDD, U 0xF8, U 0xD3, U 0xE0, U 0xDA, U 0x40, @@ -1642,22 +1667,22 @@ static unsigned char t3fw[30136] = { U 0x29, U 0xC2, U 0x85, U 0xAF, U 0x3F, U 0xAB, U 0x99, U 0x29, U 0xC6, U 0x85, U 0x1C, U 0xEC, - U 0x2C, U 0xDE, U 0xF0, U 0xAC, + U 0x14, U 0xDE, U 0xF0, U 0xAC, U 0x88, U 0x2D, U 0x84, U 0xCF, - U 0x28, U 0x12, U 0x03, U 0x29, - U 0x12, U 0x04, U 0x78, U 0xF3, + U 0x28, U 0x12, U 0x02, U 0x29, + U 0x12, U 0x03, U 0x78, U 0xF3, U 0x02, U 0x2E, U 0xFD, U 0xF8, U 0x28, U 0x90, U 0x20, U 0xD3, U 0xE0, U 0x07, U 0x88, U 0x0C, U 0xC1, U 0x70, U 0x08, U 0x08, U 0x47, U 0x28, U 0x94, U 0x20, U 0x08, U 0x77, U 0x36, U 0x65, - U 0x7F, U 0xAB, U 0x89, U 0x14, - U 0x13, U 0xEC, U 0x2A, U 0x89, + U 0x7F, U 0xAB, U 0x89, U 0x13, + U 0x13, U 0xEC, U 0x12, U 0x89, U 0x90, U 0xC0, U 0xF4, U 0x77, U 0x97, U 0x49, U 0x1B, U 0xEC, - U 0x28, U 0xC1, U 0xCA, U 0x28, - U 0x21, U 0x04, U 0x85, U 0x14, + U 0x10, U 0xC1, U 0xCA, U 0x28, + U 0x21, U 0x04, U 0x85, U 0x13, U 0x09, U 0x9E, U 0x40, U 0x06, U 0xEE, U 0x11, U 0x87, U 0x53, U 0x04, U 0x88, U 0x11, U 0x85, @@ -1668,83 +1693,57 @@ static unsigned char t3fw[30136] = { U 0xA4, U 0x97, U 0xA7, U 0x95, U 0xA6, U 0x03, U 0xFF, U 0x02, U 0x9F, U 0xA2, U 0x2C, U 0x20, - U 0x0C, U 0x1E, U 0xEC, U 0x11, + U 0x0C, U 0x1E, U 0xEB, U 0xF9, U 0xAE, U 0xCE, U 0x0C, U 0xCC, U 0x11, U 0x06, U 0xCC, U 0x08, U 0x2B, U 0xC2, U 0x85, U 0x2D, U 0xE4, U 0xCF, U 0x2B, U 0xBC, U 0x20, U 0x2B, U 0xC6, U 0x85, U 0x2A, U 0x2C, U 0x74, U 0x8B, - U 0x12, U 0x58, U 0x0D, U 0x14, + U 0x11, U 0x58, U 0x0D, U 0x91, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x28, U 0x20, U 0x3D, U 0xC0, U 0xE0, U 0x7C, U 0x87, U 0x7F, U 0x2E, U 0x24, U 0x67, U 0x0E, U 0x0A, U 0x47, U 0x65, U 0xA0, - U 0x7B, U 0x1A, U 0xEC, U 0x0F, + U 0x7B, U 0x1A, U 0xEB, U 0xF7, U 0x88, U 0x20, U 0x1E, U 0xEB, - U 0xFD, U 0x8F, U 0x14, U 0x8E, + U 0xE5, U 0x8F, U 0x13, U 0x8E, U 0xE4, U 0x8F, U 0xF4, U 0x08, U 0x88, U 0x11, U 0x0A, U 0x88, U 0x02, U 0x0F, U 0x8F, U 0x14, - U 0xAF, U 0xEE, U 0x1F, U 0xEC, - U 0x0A, U 0x98, U 0x91, U 0x0F, + U 0xAF, U 0xEE, U 0x1F, U 0xEB, + U 0xF2, U 0x98, U 0x91, U 0x0F, U 0xEE, U 0x02, U 0x9E, U 0x90, - U 0x1E, U 0xEC, U 0x09, U 0xC0, - U 0x80, U 0x1A, U 0xEB, U 0xFA, + U 0x1E, U 0xEB, U 0xF1, U 0xC0, + U 0x80, U 0x1A, U 0xEB, U 0xE2, U 0x2C, U 0xD2, U 0x85, U 0xAA, U 0xBA, U 0xB8, U 0xCC, U 0x28, U 0xA4, U 0xCF, U 0x2C, U 0xD6, U 0x85, U 0x2C, U 0x21, U 0x02, - U 0x2F, U 0x20, U 0x70, U 0x0E, + U 0x2F, U 0x20, U 0x72, U 0x0E, U 0xCC, U 0x02, U 0xB1, U 0xFF, - U 0x2F, U 0x24, U 0x70, U 0x2C, + U 0x2F, U 0x24, U 0x72, U 0x2C, U 0x25, U 0x02, U 0xC0, U 0x20, - U 0xD1, U 0x0F, U 0x87, U 0x14, + U 0xD1, U 0x0F, U 0x87, U 0x13, U 0x87, U 0x70, U 0x07, U 0x07, U 0x47, U 0x63, U 0xFD, U 0x6E, - U 0x28, U 0x21, U 0x23, U 0xC0, + U 0x28, U 0x21, U 0x38, U 0xC0, U 0x99, U 0x79, U 0x8B, U 0x02, U 0x63, U 0xFE, U 0x9A, U 0xDD, U 0xF0, U 0x63, U 0xFE, U 0x95, U 0x00, U 0xDA, U 0x20, U 0xDB, - U 0x30, U 0x8C, U 0x12, U 0xDD, - U 0x50, U 0x58, U 0x14, U 0xF4, + U 0x30, U 0x8C, U 0x11, U 0xDD, + U 0x50, U 0x58, U 0x15, U 0x84, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC0, U 0xE1, U 0x63, U 0xFF, - U 0x7A, U 0x8B, U 0x14, U 0x8C, - U 0x12, U 0xDD, U 0x50, U 0xC0, + U 0x7A, U 0x8B, U 0x13, U 0x8C, + U 0x11, U 0xDD, U 0x50, U 0xC0, U 0xAA, U 0x2E, U 0x0A, U 0x80, U 0x2A, U 0x24, U 0x68, U 0xDA, - U 0x20, U 0x58, U 0x13, U 0x60, + U 0x20, U 0x58, U 0x13, U 0xE4, U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x00, U 0x70, U 0x96, U 0x55, - U 0x2B, U 0x62, U 0x9E, U 0x6E, - U 0xB8, U 0x53, U 0x1D, U 0xEB, - U 0xD4, U 0x2D, U 0xD2, U 0x26, - U 0x68, U 0xD0, U 0x04, U 0x8E, - U 0x20, U 0x7D, U 0xE9, U 0x45, - U 0x2A, U 0x62, U 0x9D, U 0xCB, - U 0xAF, U 0x2B, U 0x21, U 0x04, - U 0x2C, U 0x20, U 0x66, U 0x58, - U 0x12, U 0xF8, U 0xC0, U 0x90, - U 0x29, U 0x24, U 0x66, U 0x82, - U 0x14, U 0x18, U 0xEB, U 0xE2, - U 0x8F, U 0x21, U 0x08, U 0xFF, - U 0x01, U 0x9F, U 0x21, U 0xC0, - U 0x20, U 0xD1, U 0x0F, U 0x00, - U 0x8B, U 0x10, U 0xC9, U 0xB8, - U 0x8C, U 0xA0, U 0x0C, U 0x6C, - U 0x51, U 0xCC, U 0xCC, U 0x8E, - U 0x24, U 0x1F, U 0xEB, U 0xD0, - U 0x8D, U 0xE1, U 0x9E, U 0x14, - U 0x0F, U 0xDD, U 0x02, U 0x9D, - U 0xE1, U 0x88, U 0x10, U 0x65, - U 0x8F, U 0xA9, U 0xC0, U 0x20, - U 0xD1, U 0x0F, U 0xDA, U 0x20, - U 0xC0, U 0xB6, U 0x58, U 0x14, - U 0x4D, U 0xC0, U 0x20, U 0xD1, - U 0x0F, U 0x00, U 0x00, U 0x00, + U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x06, U 0x29, U 0x21, U 0x02, U 0xC0, U 0xD0, U 0x75, U 0x97, U 0x10, U 0x2A, @@ -1754,7 +1753,7 @@ static unsigned char t3fw[30136] = { U 0x02, U 0x0D, U 0xD9, U 0x02, U 0x09, U 0x0C, U 0x4C, U 0x65, U 0xC1, U 0x82, U 0x16, U 0xEB, - U 0xB4, U 0x1E, U 0xEB, U 0xB2, + U 0xB6, U 0x1E, U 0xEB, U 0xB4, U 0x28, U 0x62, U 0x9E, U 0xC0, U 0xFA, U 0x78, U 0xF3, U 0x02, U 0x60, U 0x01, U 0x88, U 0x29, @@ -1768,13 +1767,13 @@ static unsigned char t3fw[30136] = { U 0xCC, U 0x29, U 0xC2, U 0x86, U 0xC0, U 0x8C, U 0x79, U 0x83, U 0x02, U 0x60, U 0x01, U 0x57, - U 0x19, U 0xEB, U 0xA7, U 0x09, + U 0x19, U 0xEB, U 0xA9, U 0x09, U 0xB9, U 0x0A, U 0x29, U 0x92, U 0xA3, U 0x68, U 0x90, U 0x07, U 0x88, U 0x20, U 0x09, U 0x88, U 0x0C, U 0x65, U 0x81, U 0x43, U 0x27, U 0xC2, U 0x85, U 0x1C, - U 0xEB, U 0xA9, U 0x64, U 0x71, + U 0xEB, U 0xAB, U 0x64, U 0x71, U 0x3A, U 0x89, U 0x31, U 0x09, U 0x8B, U 0x14, U 0x0C, U 0xBB, U 0x01, U 0x6F, U 0xB1, U 0x1D, @@ -1787,14 +1786,14 @@ static unsigned char t3fw[30136] = { U 0x3A, U 0x8A, U 0x10, U 0x2A, U 0xAC, U 0x18, U 0x89, U 0x34, U 0xC0, U 0xC4, U 0x7F, U 0x97, - U 0x3C, U 0x18, U 0xEB, U 0xAA, - U 0x1B, U 0xEB, U 0xA9, U 0x8F, + U 0x3C, U 0x18, U 0xEB, U 0xAB, + U 0x1B, U 0xEB, U 0xAA, U 0x8F, U 0x35, U 0x9C, U 0x71, U 0x9B, U 0x70, U 0x8B, U 0x20, U 0x9D, U 0x74, U 0x08, U 0xBB, U 0x02, U 0x9B, U 0x72, U 0xC0, U 0x82, U 0x98, U 0x75, U 0x1B, U 0xEB, - U 0xA5, U 0x0F, U 0x08, U 0x40, + U 0xA6, U 0x0F, U 0x08, U 0x40, U 0x9B, U 0x73, U 0x0F, U 0x88, U 0x11, U 0x98, U 0x77, U 0x7F, U 0xF7, U 0x0B, U 0x2F, U 0x21, @@ -1812,8 +1811,8 @@ static unsigned char t3fw[30136] = { U 0xF9, U 0x38, U 0x2F, U 0x3C, U 0x20, U 0x09, U 0x09, U 0x42, U 0x64, U 0x90, U 0x86, U 0x19, - U 0xEB, U 0x76, U 0x18, U 0xEB, - U 0x77, U 0x28, U 0x96, U 0x7E, + U 0xEB, U 0x78, U 0x18, U 0xEB, + U 0x79, U 0x28, U 0x96, U 0x7E, U 0x00, U 0xF0, U 0x88, U 0x00, U 0xA0, U 0x8C, U 0x00, U 0xF0, U 0x88, U 0x00, U 0xA0, U 0x8C, @@ -1824,21 +1823,21 @@ static unsigned char t3fw[30136] = { U 0x66, U 0x9D, U 0x89, U 0x30, U 0x77, U 0x97, U 0x38, U 0x8F, U 0x33, U 0x8A, U 0x32, U 0x18, - U 0xEB, U 0x80, U 0x07, U 0xBE, + U 0xEB, U 0x82, U 0x07, U 0xBE, U 0x0B, U 0x2C, U 0x21, U 0x04, U 0xB4, U 0xBB, U 0x04, U 0xCC, U 0x11, U 0x98, U 0xE0, U 0xC0, U 0x84, U 0x98, U 0xE1, U 0x88, U 0x2B, U 0x9D, U 0xE5, U 0x9A, U 0xE6, U 0x9F, U 0xE7, U 0x1A, - U 0xEB, U 0x78, U 0x09, U 0x9F, + U 0xEB, U 0x7A, U 0x09, U 0x9F, U 0x40, U 0x06, U 0xFF, U 0x11, U 0x0F, U 0xCC, U 0x02, U 0x0A, U 0x88, U 0x02, U 0x98, U 0xE2, U 0xC1, U 0xFC, U 0x0F, U 0xCC, U 0x02, U 0x2C, U 0xE6, U 0x04, U 0xC9, U 0xB8, U 0x2C, U 0x20, - U 0x0C, U 0x1E, U 0xEB, U 0x67, + U 0x0C, U 0x1E, U 0xEB, U 0x69, U 0x0C, U 0xCA, U 0x11, U 0xAE, U 0xCC, U 0x06, U 0xAA, U 0x08, U 0x29, U 0xA2, U 0x85, U 0x2D, @@ -1852,27 +1851,27 @@ static unsigned char t3fw[30136] = { U 0x72, U 0x63, U 0xFF, U 0x66, U 0x00, U 0xCC, U 0x57, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x13, U 0x4D, + U 0x40, U 0x58, U 0x13, U 0xEB, U 0xC0, U 0x20, U 0xD1, U 0x0F, - U 0xDA, U 0x20, U 0x58, U 0x13, - U 0xDD, U 0x63, U 0xFF, U 0xE8, + U 0xDA, U 0x20, U 0x58, U 0x14, + U 0x7B, U 0x63, U 0xFF, U 0xE8, U 0xC0, U 0xA0, U 0x63, U 0xFE, U 0x82, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x13, U 0xD9, + U 0xB6, U 0x58, U 0x14, U 0x77, U 0x63, U 0xFF, U 0xD9, U 0x00, U 0xDB, U 0x40, U 0x2A, U 0x2C, - U 0x74, U 0x58, U 0x0C, U 0x5A, + U 0x74, U 0x58, U 0x0C, U 0xF1, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x8A, U 0x10, U 0x2B, U 0x21, - U 0x04, U 0x58, U 0x12, U 0x6E, - U 0x1E, U 0xEB, U 0x44, U 0xC0, + U 0x04, U 0x58, U 0x13, U 0x0A, + U 0x1E, U 0xEB, U 0x46, U 0xC0, U 0xD0, U 0x2D, U 0x24, U 0x66, U 0x63, U 0xFE, U 0xB1, U 0x00, U 0x6C, U 0x10, U 0x06, U 0xD6, - U 0x20, U 0x19, U 0xEB, U 0x3F, - U 0x1E, U 0xEB, U 0x41, U 0x28, + U 0x20, U 0x19, U 0xEB, U 0x41, + U 0x1E, U 0xEB, U 0x43, U 0x28, U 0x61, U 0x02, U 0x17, U 0xEB, - U 0x3E, U 0x08, U 0x08, U 0x4C, + U 0x40, U 0x08, U 0x08, U 0x4C, U 0x65, U 0x80, U 0x5F, U 0x8A, U 0x30, U 0x0A, U 0x6A, U 0x51, U 0x69, U 0xA3, U 0x57, U 0x2B, @@ -1894,14 +1893,14 @@ static unsigned char t3fw[30136] = { U 0x22, U 0xD2, U 0x85, U 0xCF, U 0x25, U 0x60, U 0x00, U 0x0D, U 0x00, U 0xDA, U 0x60, U 0xC0, - U 0xB6, U 0x58, U 0x13, U 0xB5, + U 0xB6, U 0x58, U 0x14, U 0x53, U 0xC8, U 0x5A, U 0x60, U 0x01, U 0x0F, U 0x00, U 0xDA, U 0x60, - U 0x58, U 0x13, U 0xB2, U 0x65, + U 0x58, U 0x14, U 0x50, U 0x65, U 0x51, U 0x06, U 0xDC, U 0x40, U 0xDB, U 0x30, U 0x8D, U 0x30, U 0xDA, U 0x60, U 0x0D, U 0x6D, - U 0x51, U 0x58, U 0x12, U 0x27, + U 0x51, U 0x58, U 0x12, U 0xC3, U 0xD3, U 0xA0, U 0x64, U 0xA0, U 0xF3, U 0x84, U 0xA1, U 0xC0, U 0x51, U 0x04, U 0x04, U 0x47, @@ -1912,7 +1911,7 @@ static unsigned char t3fw[30136] = { U 0x2C, U 0x64, U 0x66, U 0x6F, U 0xC6, U 0x02, U 0x70, U 0x96, U 0x0A, U 0x2B, U 0x61, U 0x04, - U 0x58, U 0x12, U 0x3E, U 0xC0, + U 0x58, U 0x12, U 0xDA, U 0xC0, U 0xB0, U 0x2B, U 0x64, U 0x66, U 0x65, U 0x50, U 0xB4, U 0x2A, U 0x3C, U 0x10, U 0xC0, U 0xE7, @@ -1920,13 +1919,13 @@ static unsigned char t3fw[30136] = { U 0xC0, U 0xF0, U 0x02, U 0xDF, U 0x38, U 0x0F, U 0x0F, U 0x42, U 0x64, U 0xF0, U 0x90, U 0x19, - U 0xEB, U 0x0A, U 0x18, U 0xEB, - U 0x0B, U 0x28, U 0x96, U 0x7E, + U 0xEB, U 0x0C, U 0x18, U 0xEB, + U 0x0D, U 0x28, U 0x96, U 0x7E, U 0x8D, U 0x10, U 0x6D, U 0xDA, U 0x05, U 0x00, U 0xA0, U 0x88, U 0x00, U 0xC0, U 0x8C, U 0xC0, U 0xA0, U 0x89, U 0x30, U 0x1D, - U 0xEB, U 0x1A, U 0x77, U 0x97, + U 0xEB, U 0x1C, U 0x77, U 0x97, U 0x53, U 0x88, U 0x32, U 0x8C, U 0x10, U 0x8F, U 0x33, U 0x02, U 0xCE, U 0x0B, U 0xC0, U 0x24, @@ -1935,14 +1934,14 @@ static unsigned char t3fw[30136] = { U 0x22, U 0x11, U 0x8D, U 0x6B, U 0x9B, U 0xE5, U 0x9F, U 0xE7, U 0x98, U 0xE6, U 0x1F, U 0xEB, - U 0x10, U 0x09, U 0x98, U 0x40, + U 0x12, U 0x09, U 0x98, U 0x40, U 0x06, U 0x88, U 0x11, U 0x08, U 0x22, U 0x02, U 0x0F, U 0xDD, U 0x02, U 0xC1, U 0x8D, U 0x9D, U 0xE2, U 0x08, U 0x22, U 0x02, U 0x92, U 0xE4, U 0xB4, U 0xC2, U 0x2E, U 0x60, U 0x0C, U 0x1F, - U 0xEB, U 0x00, U 0x0C, U 0xE8, + U 0xEB, U 0x02, U 0x0C, U 0xE8, U 0x11, U 0xA7, U 0x88, U 0x2C, U 0x82, U 0x85, U 0xAF, U 0xEE, U 0x0C, U 0x22, U 0x0B, U 0x2B, @@ -1950,7 +1949,7 @@ static unsigned char t3fw[30136] = { U 0x85, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x28, U 0x60, U 0x0C, U 0xD2, U 0xA0, U 0x8C, U 0x11, - U 0x19, U 0xEA, U 0xF8, U 0x0C, + U 0x19, U 0xEA, U 0xFA, U 0x0C, U 0x8D, U 0x11, U 0xA9, U 0x88, U 0xA7, U 0xDD, U 0x2E, U 0xD2, U 0x85, U 0x2B, U 0x84, U 0xCF, @@ -1962,7 +1961,7 @@ static unsigned char t3fw[30136] = { U 0xFF, U 0x60, U 0x00, U 0x00, U 0x2A, U 0x6C, U 0x74, U 0xC0, U 0xB2, U 0xDC, U 0x20, U 0xDD, - U 0x40, U 0x58, U 0x12, U 0x1C, + U 0x40, U 0x58, U 0x12, U 0xB8, U 0xC0, U 0xB0, U 0x63, U 0xFF, U 0x63, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, @@ -1985,15 +1984,15 @@ static unsigned char t3fw[30136] = { U 0x40, U 0x7A, U 0xC1, U 0x0E, U 0xC8, U 0xAB, U 0xDB, U 0xD0, U 0xDA, U 0x30, U 0x2C, U 0x0A, - U 0x00, U 0x58, U 0x0A, U 0x76, + U 0x00, U 0x58, U 0x0A, U 0xFB, U 0x2E, U 0x31, U 0x02, U 0x0E, U 0x0F, U 0x4C, U 0xC8, U 0xFE, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x68, U 0x95, U 0xF8, U 0x28, U 0x31, U 0x02, U 0x08, U 0x08, U 0x4C, U 0x65, U 0x8F, U 0xEF, - U 0x1A, U 0xEA, U 0xC6, U 0x1C, - U 0xEA, U 0xC4, U 0x2B, U 0xA2, + U 0x1A, U 0xEA, U 0xC8, U 0x1C, + U 0xEA, U 0xC6, U 0x2B, U 0xA2, U 0x9E, U 0xC0, U 0x9A, U 0x7B, U 0x9B, U 0x46, U 0x2B, U 0xC2, U 0x26, U 0x68, U 0xB0, U 0x04, @@ -2001,11 +2000,11 @@ static unsigned char t3fw[30136] = { U 0x3B, U 0x29, U 0xA2, U 0x9D, U 0xC0, U 0xE3, U 0xCB, U 0x93, U 0x94, U 0x90, U 0x1B, U 0xEA, - U 0xD7, U 0x2D, U 0x31, U 0x04, + U 0xD8, U 0x2D, U 0x31, U 0x04, U 0x9B, U 0x96, U 0x08, U 0xDD, U 0x11, U 0x0E, U 0xDD, U 0x02, U 0x9D, U 0x97, U 0x9D, U 0x91, - U 0x12, U 0xEA, U 0xD4, U 0xC0, + U 0x12, U 0xEA, U 0xD5, U 0xC0, U 0xE5, U 0x24, U 0xC4, U 0xA2, U 0x2E, U 0x34, U 0x06, U 0x2F, U 0x31, U 0x02, U 0x28, U 0xA2, @@ -2014,227 +2013,229 @@ static unsigned char t3fw[30136] = { U 0xA6, U 0x9D, U 0x2F, U 0x35, U 0x02, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xDA, U 0x30, U 0xC0, - U 0xB6, U 0x58, U 0x13, U 0x3D, + U 0xB6, U 0x58, U 0x13, U 0xDB, U 0xC0, U 0x20, U 0xD1, U 0x0F, - U 0x6C, U 0x10, U 0x06, U 0x29, - U 0x20, U 0x06, U 0x68, U 0x98, - U 0x05, U 0x28, U 0x9C, U 0xF9, - U 0x65, U 0x82, U 0x5D, U 0x29, - U 0x21, U 0x02, U 0x09, U 0x09, - U 0x4C, U 0x65, U 0x92, U 0x10, - U 0xCD, U 0x51, U 0xDB, U 0x30, - U 0xDA, U 0x20, U 0x04, U 0x4C, - U 0x02, U 0x58, U 0x12, U 0xA1, - U 0xC0, U 0x51, U 0xD3, U 0xA0, - U 0xC7, U 0xAF, U 0x2A, U 0x36, - U 0x0A, U 0xC0, U 0xE0, U 0x19, - U 0xEA, U 0xA3, U 0x1D, U 0xEA, - U 0xA9, U 0x1F, U 0xEA, U 0xA2, - U 0x8A, U 0x3A, U 0x16, U 0xEA, - U 0x9F, U 0xB1, U 0xAC, U 0x64, - U 0xC1, U 0x35, U 0x28, U 0x62, + U 0x6C, U 0x10, U 0x06, U 0x2A, + U 0x20, U 0x06, U 0x94, U 0x10, + U 0x68, U 0xA8, U 0x05, U 0x28, + U 0xAC, U 0xF9, U 0x65, U 0x82, + U 0x50, U 0x29, U 0x21, U 0x02, + U 0x09, U 0x09, U 0x4C, U 0x65, + U 0x92, U 0x0A, U 0xCC, U 0x5F, + U 0xDB, U 0x30, U 0xDA, U 0x20, + U 0x8C, U 0x10, U 0x58, U 0x13, + U 0x3F, U 0xC0, U 0x51, U 0xD3, + U 0xA0, U 0xC7, U 0xAF, U 0x9A, + U 0x3A, U 0xC0, U 0xD0, U 0x1C, + U 0xEA, U 0xA5, U 0x14, U 0xEA, + U 0xAB, U 0x1E, U 0xEA, U 0xA4, + U 0x8F, U 0x3A, U 0x16, U 0xEA, + U 0xA1, U 0xB1, U 0xFB, U 0x64, + U 0xB1, U 0x31, U 0x28, U 0x62, U 0x9E, U 0x6F, U 0x88, U 0x02, - U 0x60, U 0x01, U 0xF1, U 0x29, - U 0xDC, U 0x33, U 0x29, U 0x92, + U 0x60, U 0x01, U 0xED, U 0x29, + U 0x4C, U 0x33, U 0x29, U 0x92, U 0x26, U 0x68, U 0x90, U 0x07, - U 0x8B, U 0x20, U 0x09, U 0xBB, - U 0x0C, U 0x65, U 0xB1, U 0xE0, - U 0x27, U 0x62, U 0x9D, U 0xC0, - U 0x8E, U 0x64, U 0x71, U 0xD8, + U 0x8A, U 0x20, U 0x09, U 0xAA, + U 0x0C, U 0x65, U 0xA1, U 0xDC, + U 0x2A, U 0x62, U 0x9D, U 0xC0, + U 0x8E, U 0x64, U 0xA1, U 0xD4, U 0x2B, U 0x20, U 0x0C, U 0x0C, - U 0xBC, U 0x11, U 0xA6, U 0xCC, - U 0x29, U 0xC2, U 0x86, U 0x79, - U 0x83, U 0x02, U 0x60, U 0x01, - U 0xD2, U 0x19, U 0xEA, U 0x91, - U 0x09, U 0xB9, U 0x0A, U 0x29, - U 0x92, U 0xA3, U 0x97, U 0x10, - U 0x68, U 0x90, U 0x08, U 0x28, - U 0x22, U 0x00, U 0x09, U 0x88, - U 0x0C, U 0x65, U 0x81, U 0xBB, - U 0x27, U 0xC2, U 0x85, U 0x64, - U 0x71, U 0xB5, U 0x29, U 0x20, - U 0x06, U 0x29, U 0x9C, U 0xF9, - U 0x64, U 0x91, U 0xEC, U 0x2C, + U 0xB7, U 0x11, U 0x06, U 0x77, + U 0x08, U 0x29, U 0x72, U 0x86, + U 0x79, U 0x83, U 0x02, U 0x60, + U 0x01, U 0xCD, U 0x0C, U 0xB9, + U 0x0A, U 0x29, U 0x92, U 0xA3, + U 0x68, U 0x90, U 0x08, U 0x2C, + U 0x22, U 0x00, U 0x09, U 0xCC, + U 0x0C, U 0x65, U 0xC1, U 0xBB, + U 0x27, U 0x72, U 0x85, U 0x64, + U 0x71, U 0xB5, U 0x28, U 0x20, + U 0x06, U 0x28, U 0x8C, U 0xF9, + U 0x64, U 0x81, U 0xE5, U 0x2C, U 0x20, U 0x66, U 0x89, U 0x31, U 0xB1, U 0xCC, U 0x0C, U 0x0C, U 0x47, U 0x2C, U 0x24, U 0x66, U 0x6E, U 0xC6, U 0x02, U 0x60, U 0x01, U 0xA1, U 0x09, U 0xF8, U 0x50, U 0x65, U 0x81, U 0x9B, - U 0x88, U 0x36, U 0x89, U 0xF4, - U 0x08, U 0x8C, U 0x14, U 0xAC, - U 0x99, U 0x1C, U 0xEA, U 0x81, - U 0x0C, U 0x99, U 0x02, U 0x2C, - U 0x21, U 0x04, U 0x99, U 0x70, - U 0x19, U 0xEA, U 0x98, U 0x08, - U 0x08, U 0x47, U 0x99, U 0x71, - U 0x89, U 0x2A, U 0x09, U 0x88, - U 0x10, U 0x08, U 0x99, U 0x02, - U 0x18, U 0xEA, U 0x95, U 0x08, - U 0x99, U 0x02, U 0x99, U 0x72, - U 0x28, U 0x30, U 0x13, U 0x29, - U 0x30, U 0x12, U 0x04, U 0x88, - U 0x10, U 0x06, U 0x99, U 0x10, - U 0x08, U 0x99, U 0x02, U 0x28, - U 0x30, U 0x2C, U 0x9A, U 0x74, - U 0x0C, U 0x88, U 0x10, U 0x08, - U 0xC8, U 0x02, U 0x09, U 0x88, - U 0x02, U 0x98, U 0x73, U 0x89, - U 0x37, U 0x99, U 0x75, U 0x88, - U 0x38, U 0x98, U 0x76, U 0x8A, - U 0x39, U 0xC0, U 0x81, U 0x9A, - U 0x77, U 0x1A, U 0xEA, U 0x88, - U 0x89, U 0x35, U 0x98, U 0x7B, - U 0x99, U 0x78, U 0x09, U 0x89, - U 0x14, U 0x0A, U 0x99, U 0x02, - U 0x99, U 0x7A, U 0x8A, U 0x30, - U 0x89, U 0x32, U 0x77, U 0xA7, - U 0x36, U 0x18, U 0xEA, U 0x76, - U 0x8F, U 0x33, U 0x98, U 0x7C, - U 0xC0, U 0x84, U 0x98, U 0x7D, - U 0x88, U 0x2B, U 0x2E, U 0x76, - U 0x11, U 0x29, U 0x76, U 0x12, - U 0x2F, U 0x76, U 0x13, U 0x19, - U 0xEA, U 0x70, U 0x0A, U 0x9F, - U 0x40, U 0x06, U 0xFF, U 0x11, - U 0x04, U 0xCA, U 0x11, U 0x09, - U 0x88, U 0x02, U 0x0F, U 0xAA, - U 0x02, U 0x98, U 0x7E, U 0xC1, - U 0xF9, U 0x0F, U 0xAA, U 0x02, - U 0x2A, U 0x76, U 0x10, U 0xC0, + U 0x2A, U 0x21, U 0x04, U 0x8C, + U 0xE4, U 0x88, U 0x36, U 0x1E, + U 0xEA, U 0x85, U 0x08, U 0x89, + U 0x14, U 0xA9, U 0xCC, U 0x08, + U 0x08, U 0x47, U 0x09, U 0x88, + U 0x10, U 0x19, U 0xEA, U 0x99, + U 0x0E, U 0xCC, U 0x02, U 0x9C, + U 0x70, U 0x99, U 0x71, U 0x8C, + U 0x2A, U 0x1E, U 0xEA, U 0x97, + U 0x08, U 0xCC, U 0x02, U 0x0E, + U 0xCC, U 0x02, U 0x9C, U 0x72, + U 0x2E, U 0x30, U 0x2C, U 0x29, + U 0x30, U 0x13, U 0x28, U 0x30, + U 0x12, U 0x04, U 0x99, U 0x10, + U 0x06, U 0x88, U 0x10, U 0x0C, + U 0xEE, U 0x10, U 0x9F, U 0x74, + U 0x0E, U 0xAE, U 0x02, U 0x09, + U 0x88, U 0x02, U 0x08, U 0xEE, + U 0x02, U 0x9E, U 0x73, U 0x8C, + U 0x37, U 0x04, U 0xAA, U 0x11, + U 0x9C, U 0x75, U 0x89, U 0x38, + U 0xC0, U 0xF4, U 0x99, U 0x76, + U 0x88, U 0x39, U 0xC0, U 0xC1, + U 0x98, U 0x77, U 0x18, U 0xEA, + U 0x89, U 0x8E, U 0x35, U 0x9C, + U 0x7B, U 0x9E, U 0x78, U 0x0E, + U 0x8E, U 0x14, U 0x08, U 0xEE, + U 0x02, U 0x9E, U 0x7A, U 0x8E, + U 0x30, U 0x1C, U 0xEA, U 0x79, + U 0x77, U 0xE7, U 0x30, U 0x88, + U 0x32, U 0x89, U 0x33, U 0x9C, + U 0x7C, U 0x9F, U 0x7D, U 0x0E, + U 0x9C, U 0x40, U 0x06, U 0xCC, + U 0x11, U 0x8F, U 0x2B, U 0x29, + U 0x76, U 0x13, U 0x2D, U 0x76, + U 0x11, U 0x28, U 0x76, U 0x12, + U 0x0C, U 0xAA, U 0x02, U 0x18, + U 0xEA, U 0x70, U 0xC1, U 0xC9, + U 0x0C, U 0xAA, U 0x02, U 0x2A, + U 0x76, U 0x10, U 0x08, U 0xFF, + U 0x02, U 0x9F, U 0x7E, U 0xC0, U 0xAA, U 0x60, U 0x00, U 0x01, - U 0xC0, U 0xA6, U 0xAD, U 0xBF, - U 0x0C, U 0xBC, U 0x11, U 0xA6, - U 0xCC, U 0x29, U 0xC2, U 0x85, - U 0x2E, U 0xF4, U 0xCF, U 0x09, - U 0xA9, U 0x0B, U 0x29, U 0xC6, - U 0x85, U 0x65, U 0x51, U 0x07, + U 0xC0, U 0xA6, U 0xA4, U 0xBC, + U 0x0C, U 0xB9, U 0x11, U 0xA6, + U 0x99, U 0x28, U 0x92, U 0x85, + U 0x2D, U 0xC4, U 0xCF, U 0x08, + U 0xA8, U 0x0B, U 0x28, U 0x96, + U 0x85, U 0x65, U 0x51, U 0x00, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x2B, U 0x20, U 0x0C, U 0x0C, - U 0xBC, U 0x11, U 0x06, U 0xCC, - U 0x08, U 0x28, U 0xC2, U 0x86, - U 0x09, U 0xB9, U 0x0A, U 0x6F, - U 0x89, U 0x02, U 0x60, U 0x01, - U 0x2E, U 0x29, U 0x92, U 0xA3, + U 0xB7, U 0x11, U 0x06, U 0x77, + U 0x08, U 0x2A, U 0x72, U 0x86, + U 0x0C, U 0xB9, U 0x0A, U 0x6F, + U 0xA9, U 0x02, U 0x60, U 0x01, + U 0x18, U 0x29, U 0x92, U 0xA3, U 0x68, U 0x90, U 0x08, U 0x2A, U 0x22, U 0x00, U 0x09, U 0xAA, - U 0x0C, U 0x65, U 0xA1, U 0x1F, - U 0x2A, U 0xC2, U 0x85, U 0x64, - U 0xA1, U 0x19, U 0x28, U 0x20, - U 0x3D, U 0x08, U 0x28, U 0x40, - U 0x64, U 0x80, U 0x8C, U 0x84, - U 0x35, U 0x04, U 0x84, U 0x14, - U 0x64, U 0x40, U 0x84, U 0x85, - U 0xF5, U 0x74, U 0x53, U 0x7F, - U 0x84, U 0x36, U 0x04, U 0x84, - U 0x14, U 0x64, U 0x40, U 0x77, - U 0x74, U 0x53, U 0x74, U 0x29, - U 0x30, U 0x13, U 0xC0, U 0x8C, - U 0x79, U 0x88, U 0x6C, U 0xC0, + U 0x0C, U 0x65, U 0xA1, U 0x09, + U 0x2A, U 0x72, U 0x85, U 0x64, + U 0xA1, U 0x03, U 0x2C, U 0x20, + U 0x3D, U 0x0C, U 0x2C, U 0x40, + U 0x64, U 0xC0, U 0x8C, U 0x8C, + U 0x35, U 0x0C, U 0x8C, U 0x14, + U 0x64, U 0xC0, U 0x84, U 0x8F, + U 0xE5, U 0x7C, U 0xF3, U 0x7F, + U 0x8C, U 0x36, U 0x0C, U 0x8C, + U 0x14, U 0x64, U 0xC0, U 0x77, + U 0x7C, U 0xF3, U 0x74, U 0x28, + U 0x30, U 0x13, U 0xC0, U 0xFC, + U 0x78, U 0xF8, U 0x6C, U 0xC0, U 0x90, U 0x29, U 0x24, U 0x67, - U 0x09, U 0x08, U 0x47, U 0x65, - U 0x80, U 0xED, U 0x88, U 0x20, - U 0x89, U 0xF4, U 0x84, U 0x35, - U 0x1F, U 0xEA, U 0x4B, U 0x04, - U 0x84, U 0x14, U 0xA4, U 0x94, - U 0x0F, U 0x44, U 0x02, U 0x94, - U 0xA0, U 0x14, U 0xEA, U 0x46, - U 0x08, U 0x88, U 0x11, U 0x04, - U 0x88, U 0x02, U 0x98, U 0xA1, - U 0x84, U 0x36, U 0x98, U 0xA3, - U 0x04, U 0x84, U 0x14, U 0xA4, - U 0x99, U 0x0F, U 0x99, U 0x02, - U 0x99, U 0xA2, U 0x19, U 0xEA, - U 0x42, U 0xAD, U 0xB4, U 0x28, - U 0xC2, U 0x85, U 0x2E, U 0x44, - U 0xCF, U 0x28, U 0x8C, U 0x10, - U 0x28, U 0xC6, U 0x85, U 0x28, - U 0x21, U 0x02, U 0x2F, U 0x20, - U 0x70, U 0x09, U 0x88, U 0x02, - U 0xB2, U 0xFF, U 0x2F, U 0x24, - U 0x70, U 0x28, U 0x25, U 0x02, + U 0x09, U 0x0C, U 0x47, U 0x65, + U 0xC0, U 0xD7, U 0x19, U 0xEA, + U 0x4F, U 0x18, U 0xEA, U 0x4D, + U 0x8F, U 0x20, U 0x8C, U 0x35, + U 0x08, U 0xFF, U 0x11, U 0x0C, + U 0x8C, U 0x14, U 0x08, U 0xFF, + U 0x02, U 0x88, U 0xE4, U 0x9F, + U 0xA1, U 0xAC, U 0x8C, U 0x09, + U 0xCC, U 0x02, U 0x9C, U 0xA0, + U 0x8C, U 0x36, U 0x9F, U 0xA3, + U 0x0C, U 0x8C, U 0x14, U 0xAC, + U 0x88, U 0x09, U 0x88, U 0x02, + U 0x98, U 0xA2, U 0x18, U 0xEA, + U 0x45, U 0xA4, U 0xBC, U 0x2F, + U 0x72, U 0x85, U 0x2D, U 0xC4, + U 0xCF, U 0x2F, U 0xFC, U 0x10, + U 0x2F, U 0x76, U 0x85, U 0x2F, + U 0x21, U 0x02, U 0x29, U 0x20, + U 0x72, U 0x08, U 0xFF, U 0x02, + U 0xB2, U 0x99, U 0x29, U 0x24, + U 0x72, U 0x2F, U 0x25, U 0x02, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0xCC, U 0x57, U 0xDA, - U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x12, U 0x1D, + U 0x20, U 0xDB, U 0x30, U 0x8C, + U 0x10, U 0x58, U 0x12, U 0xBC, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xC0, U 0x91, U 0x63, U 0xFF, U 0x8F, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x12, U 0xAB, + U 0xB6, U 0x58, U 0x13, U 0x4A, U 0x63, U 0xFF, U 0xE1, U 0x00, - U 0xDA, U 0x20, U 0x58, U 0x12, - U 0xA9, U 0x63, U 0xFF, U 0xD8, - U 0x8A, U 0x10, U 0x2B, U 0x21, - U 0x04, U 0x58, U 0x11, U 0x41, - U 0x1D, U 0xEA, U 0x20, U 0x1F, - U 0xEA, U 0x19, U 0x2B, U 0x20, - U 0x0C, U 0xC0, U 0xE0, U 0x2E, - U 0x24, U 0x66, U 0x8A, U 0x3A, - U 0x63, U 0xFE, U 0x48, U 0x00, - U 0x00, U 0xDA, U 0x20, U 0xDB, - U 0x30, U 0xDC, U 0x40, U 0xDD, - U 0x50, U 0x58, U 0x13, U 0x24, - U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x2A, U 0x2C, U 0x74, U 0xDB, - U 0x40, U 0x58, U 0x0B, U 0x1F, - U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x29, U 0x21, U 0x23, U 0xC0, - U 0x88, U 0x79, U 0x83, U 0x02, - U 0x63, U 0xFE, U 0x20, U 0x2A, - U 0x12, U 0x00, U 0x2C, U 0x20, - U 0x66, U 0x2B, U 0x21, U 0x04, - U 0x2C, U 0xCC, U 0x01, U 0x0C, - U 0x0C, U 0x47, U 0x2C, U 0x24, - U 0x66, U 0x58, U 0x11, U 0x2D, - U 0x1D, U 0xEA, U 0x0C, U 0x1F, - U 0xEA, U 0x05, U 0x2B, U 0x20, - U 0x0C, U 0xC0, U 0xE0, U 0x2E, - U 0x24, U 0x66, U 0x8A, U 0x3A, - U 0x63, U 0xFD, U 0xF8, U 0x00, - U 0xDA, U 0x20, U 0x58, U 0x12, - U 0x8C, U 0x63, U 0xFF, U 0x64, - U 0xDA, U 0x20, U 0x5B, U 0xFF, - U 0x1C, U 0xD2, U 0xA0, U 0xD1, - U 0x0F, U 0x00, U 0x00, U 0x00, + U 0xDA, U 0x20, U 0x58, U 0x13, + U 0x48, U 0x63, U 0xFF, U 0xD8, + U 0x2B, U 0x21, U 0x04, U 0x58, + U 0x11, U 0xDF, U 0x1E, U 0xEA, + U 0x1D, U 0x2B, U 0x20, U 0x0C, + U 0xC0, U 0xD0, U 0x2D, U 0x24, + U 0x66, U 0x8F, U 0x3A, U 0x63, + U 0xFE, U 0x4D, U 0xDA, U 0x20, + U 0xDB, U 0x30, U 0xDC, U 0x40, + U 0xDD, U 0x50, U 0x58, U 0x13, + U 0xD1, U 0xD2, U 0xA0, U 0xD1, + U 0x0F, U 0x2A, U 0x2C, U 0x74, + U 0x8B, U 0x10, U 0x58, U 0x0B, + U 0xB9, U 0xD2, U 0xA0, U 0xD1, + U 0x0F, U 0x29, U 0x21, U 0x38, + U 0xC0, U 0x88, U 0x79, U 0x83, + U 0x2E, U 0x8C, U 0x31, U 0x0C, + U 0xFC, U 0x50, U 0x64, U 0xCE, + U 0x22, U 0x2B, U 0x21, U 0x04, + U 0xC0, U 0xC0, U 0x58, U 0x11, + U 0xCE, U 0xC0, U 0xD0, U 0x1E, + U 0xEA, U 0x0C, U 0x8F, U 0x3A, + U 0x2B, U 0x20, U 0x0C, U 0x63, + U 0xFE, U 0x0D, U 0xDA, U 0x20, + U 0x58, U 0x13, U 0x30, U 0x63, + U 0xFF, U 0x7A, U 0xDA, U 0x20, + U 0x5B, U 0xFF, U 0x22, U 0xD2, + U 0xA0, U 0xD1, U 0x0F, U 0x00, + U 0x2C, U 0x20, U 0x66, U 0x2B, + U 0x21, U 0x04, U 0xB1, U 0xCC, + U 0x0C, U 0x0C, U 0x47, U 0x2C, + U 0x24, U 0x66, U 0x58, U 0x11, + U 0xC2, U 0x1E, U 0xEA, U 0x00, + U 0x2B, U 0x20, U 0x0C, U 0xC0, + U 0xD0, U 0x2D, U 0x24, U 0x66, + U 0x8F, U 0x3A, U 0x63, U 0xFD, + U 0xDA, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x08, U 0x95, - U 0x15, U 0xC0, U 0x61, U 0xC1, + U 0x14, U 0xC0, U 0x61, U 0xC1, U 0xB0, U 0xD9, U 0x40, U 0x2A, U 0x20, U 0x3D, U 0xC0, U 0x40, U 0x0B, U 0xAA, U 0x01, U 0x0A, U 0x64, U 0x38, U 0x2A, U 0x20, - U 0x06, U 0x29, U 0x16, U 0x06, + U 0x06, U 0x29, U 0x16, U 0x05, U 0x68, U 0xA8, U 0x05, U 0x2C, U 0xAC, U 0xF9, U 0x65, U 0xC3, - U 0x3B, U 0x1D, U 0xE9, U 0xF2, + U 0x3F, U 0x1D, U 0xE9, U 0xF2, U 0x64, U 0x40, U 0x05, U 0x2F, - U 0x12, U 0x05, U 0x64, U 0xF2, - U 0x9C, U 0x26, U 0x21, U 0x02, + U 0x12, U 0x04, U 0x64, U 0xF2, + U 0xA0, U 0x26, U 0x21, U 0x02, U 0x1E, U 0xE9, U 0xEE, U 0x06, U 0x06, U 0x4C, U 0x65, U 0x62, - U 0xE3, U 0x15, U 0xE9, U 0xEA, + U 0xE6, U 0x15, U 0xE9, U 0xEA, U 0x64, U 0x40, U 0xD9, U 0x8A, U 0x35, U 0x29, U 0x30, U 0x03, - U 0x9A, U 0x14, U 0x0A, U 0x99, + U 0x9A, U 0x13, U 0x0A, U 0x99, U 0x0C, U 0x64, U 0x90, U 0xCC, U 0x2C, U 0x20, U 0x0C, U 0x8B, - U 0x14, U 0x9C, U 0x11, U 0x0C, + U 0x13, U 0x9C, U 0x10, U 0x0C, U 0xCC, U 0x11, U 0xA5, U 0xCC, - U 0x9C, U 0x12, U 0x2C, U 0xC2, + U 0x9C, U 0x11, U 0x2C, U 0xC2, U 0x86, U 0xB4, U 0xBB, U 0x7C, U 0xB3, U 0x02, U 0x60, U 0x02, - U 0xD3, U 0x8F, U 0x11, U 0x0E, + U 0xD7, U 0x8F, U 0x10, U 0x0E, U 0xFE, U 0x0A, U 0x2E, U 0xE2, U 0xA3, U 0x68, U 0xE0, U 0x09, U 0x86, U 0x20, U 0xD3, U 0x0F, U 0x0E, U 0x66, U 0x0C, U 0x65, - U 0x62, U 0xBE, U 0x88, U 0x12, + U 0x62, U 0xC2, U 0x88, U 0x11, U 0x28, U 0x82, U 0x85, U 0x64, - U 0x82, U 0xB6, U 0x89, U 0x14, + U 0x82, U 0xBA, U 0x89, U 0x13, U 0x64, U 0x90, U 0x5E, U 0xDA, U 0x80, U 0xD9, U 0x30, U 0x8C, U 0x20, U 0x1E, U 0xE9, U 0xE8, U 0x1F, U 0xE9, U 0xE9, U 0x1D, - U 0xE9, U 0xD6, U 0x8B, U 0x14, + U 0xE9, U 0xD6, U 0x8B, U 0x13, U 0x8D, U 0xD4, U 0xD4, U 0xB0, U 0x7F, U 0xB7, U 0x18, U 0xB8, U 0x8A, U 0x29, U 0x3C, U 0x10, @@ -2256,78 +2257,79 @@ static unsigned char t3fw[30136] = { U 0x02, U 0x98, U 0xA2, U 0x2A, U 0xAC, U 0x10, U 0x19, U 0xE9, U 0xD4, U 0xC0, U 0xC0, U 0x8F, - U 0x14, U 0x1E, U 0xE9, U 0xC5, - U 0x86, U 0x12, U 0x8D, U 0x11, + U 0x13, U 0x1E, U 0xE9, U 0xC5, + U 0x86, U 0x11, U 0x8D, U 0x10, U 0x28, U 0x62, U 0x85, U 0xAE, U 0xDD, U 0x08, U 0xFF, U 0x0B, U 0x2C, U 0xD4, U 0xCF, U 0x28, U 0x21, U 0x02, U 0x2F, U 0x66, U 0x85, U 0x8B, U 0x35, U 0x2A, - U 0x20, U 0x70, U 0x09, U 0x88, + U 0x20, U 0x72, U 0x09, U 0x88, U 0x02, U 0xAB, U 0xAA, U 0x28, U 0x25, U 0x02, U 0x2A, U 0x24, - U 0x70, U 0xC0, U 0x20, U 0xD1, + U 0x72, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x29, U 0x52, U 0x9E, U 0x18, U 0xE9, U 0xB1, U 0x6F, U 0x98, U 0x02, U 0x60, U 0x02, - U 0x08, U 0x28, U 0x82, U 0x26, + U 0x0B, U 0x28, U 0x82, U 0x26, U 0x68, U 0x80, U 0x08, U 0x29, U 0x22, U 0x00, U 0x08, U 0x99, - U 0x0C, U 0x65, U 0x91, U 0xF9, + U 0x0C, U 0x65, U 0x91, U 0xFC, U 0x2A, U 0x52, U 0x9D, U 0xC1, - U 0xCA, U 0x9A, U 0x13, U 0x64, - U 0xA1, U 0xEF, U 0x2B, U 0x20, + U 0xCE, U 0x9A, U 0x12, U 0x64, + U 0xA1, U 0xF2, U 0x2B, U 0x20, U 0x0C, U 0x26, U 0x20, U 0x06, - U 0x0C, U 0xB8, U 0x11, U 0xA5, - U 0x88, U 0x2D, U 0x82, U 0x86, - U 0x0E, U 0xBE, U 0x0A, U 0x7D, - U 0xC3, U 0x02, U 0x60, U 0x02, - U 0x02, U 0x2E, U 0xE2, U 0xA3, - U 0x68, U 0xE0, U 0x08, U 0x2F, - U 0x22, U 0x00, U 0x0E, U 0xFF, - U 0x0C, U 0x65, U 0xF1, U 0xF3, - U 0x28, U 0x82, U 0x85, U 0xDE, - U 0x80, U 0x64, U 0x81, U 0xFF, - U 0x98, U 0x10, U 0x26, U 0x6C, - U 0xF9, U 0x64, U 0x61, U 0xFF, - U 0x2C, U 0x20, U 0x66, U 0x88, - U 0x31, U 0xB1, U 0xCC, U 0x0C, + U 0x0C, U 0xB8, U 0x11, U 0x05, + U 0x88, U 0x08, U 0x2D, U 0x82, + U 0x86, U 0x0E, U 0xBE, U 0x0A, + U 0x7D, U 0xC3, U 0x02, U 0x60, + U 0x02, U 0x05, U 0x2E, U 0xE2, + U 0xA3, U 0x68, U 0xE0, U 0x08, + U 0x2F, U 0x22, U 0x00, U 0x0E, + U 0xFF, U 0x0C, U 0x65, U 0xF1, + U 0xF6, U 0x28, U 0x82, U 0x85, + U 0xD7, U 0x80, U 0xDE, U 0x80, + U 0x64, U 0x82, U 0x00, U 0x98, + U 0x16, U 0x26, U 0x6C, U 0xF9, + U 0x64, U 0x62, U 0x01, U 0x2C, + U 0x20, U 0x66, U 0x88, U 0x31, + U 0x2C, U 0xCC, U 0x01, U 0x0C, U 0x0C, U 0x47, U 0x2C, U 0x24, U 0x66, U 0x6E, U 0xC6, U 0x02, U 0x60, U 0x01, U 0xBC, U 0x08, U 0xFD, U 0x50, U 0x65, U 0xD1, - U 0xB6, U 0x17, U 0xE9, U 0xB4, - U 0x19, U 0xE9, U 0x98, U 0x1A, - U 0xE9, U 0x9F, U 0x2C, U 0x21, + U 0xB6, U 0x1D, U 0xE9, U 0xB2, + U 0x1C, U 0xE9, U 0x97, U 0x19, + U 0xE9, U 0x9E, U 0x2A, U 0x21, U 0x04, U 0x8B, U 0x2D, U 0x28, U 0x30, U 0x10, U 0x2F, U 0x21, U 0x1D, U 0x0C, U 0x88, U 0x10, - U 0x0B, U 0xFB, U 0x09, U 0x0C, - U 0x88, U 0x02, U 0x0A, U 0x88, - U 0x02, U 0x09, U 0xBB, U 0x02, - U 0x64, U 0x41, U 0x52, U 0x89, - U 0x10, U 0xC0, U 0x4D, U 0x9B, - U 0x90, U 0x97, U 0x91, U 0x98, - U 0x92, U 0x8D, U 0x35, U 0xD9, - U 0xE0, U 0x64, U 0xD0, U 0x6C, - U 0xD7, U 0x30, U 0xDB, U 0xD0, - U 0xD8, U 0x30, U 0x7F, U 0xD7, - U 0x13, U 0x27, U 0x3C, U 0x10, - U 0xBC, U 0xE9, U 0x26, U 0x32, - U 0x16, U 0x8C, U 0x39, U 0x96, - U 0xE6, U 0x9C, U 0xE7, U 0x8A, - U 0x37, U 0xB4, U 0x38, U 0x9A, - U 0xE8, U 0x0B, U 0x13, U 0x14, - U 0x64, U 0x30, U 0x49, U 0x2A, - U 0x82, U 0x16, U 0x86, U 0x79, - U 0x9A, U 0x96, U 0x96, U 0x97, - U 0x8C, U 0x77, U 0x8A, U 0x7D, - U 0x9C, U 0x98, U 0x2B, U 0x82, - U 0x17, U 0x2C, U 0x7C, U 0x20, - U 0x9A, U 0x9A, U 0x2A, U 0x9C, - U 0x18, U 0x9B, U 0x99, U 0x86, - U 0x7B, U 0xB0, U 0x3B, U 0xB8, - U 0x89, U 0x6D, U 0xB9, U 0x21, + U 0x0B, U 0xFB, U 0x09, U 0x0A, + U 0x88, U 0x02, U 0x09, U 0x88, + U 0x02, U 0x0C, U 0xBB, U 0x02, + U 0x64, U 0x41, U 0x52, U 0x9B, + U 0x70, U 0x9D, U 0x71, U 0x98, + U 0x72, U 0xC0, U 0x4D, U 0x8D, + U 0x35, U 0xD9, U 0xE0, U 0x64, + U 0xD0, U 0x6E, U 0xD7, U 0x30, + U 0xDB, U 0xD0, U 0xD8, U 0x30, + U 0x7F, U 0xD7, U 0x14, U 0x27, + U 0x3C, U 0x10, U 0xBC, U 0xE9, + U 0x26, U 0x32, U 0x16, U 0x8C, + U 0x39, U 0x96, U 0xE6, U 0x9C, + U 0xE7, U 0x8A, U 0x37, U 0xB4, + U 0x38, U 0x2A, U 0xE6, U 0x08, + U 0x0B, U 0x13, U 0x14, U 0x64, + U 0x30, U 0x4A, U 0x2A, U 0x82, + U 0x16, U 0x86, U 0x79, U 0x9A, + U 0x96, U 0x96, U 0x97, U 0x8C, + U 0x77, U 0x8A, U 0x7D, U 0x9C, + U 0x98, U 0x2B, U 0x82, U 0x17, + U 0x2C, U 0x7C, U 0x20, U 0x9A, + U 0x9A, U 0x2A, U 0x9C, U 0x18, + U 0x9B, U 0x99, U 0x86, U 0x7B, + U 0xB0, U 0x3B, U 0x29, U 0x8C, + U 0x08, U 0x6D, U 0xB9, U 0x21, U 0x8B, U 0xC9, U 0x96, U 0xA5, U 0x26, U 0x92, U 0x16, U 0x2A, U 0xAC, U 0x18, U 0xB8, U 0x99, @@ -2347,9 +2349,9 @@ static unsigned char t3fw[30136] = { U 0x12, U 0x6D, U 0xAA, U 0x06, U 0x99, U 0x88, U 0x99, U 0x8B, U 0x28, U 0x8C, U 0x18, U 0xC0, - U 0xD0, U 0x1B, U 0xE9, U 0x83, - U 0x1C, U 0xE9, U 0x82, U 0x16, - U 0xE9, U 0x78, U 0xB1, U 0xFF, + U 0xD0, U 0x1B, U 0xE9, U 0x81, + U 0x1C, U 0xE9, U 0x80, U 0x16, + U 0xE9, U 0x76, U 0xB1, U 0xFF, U 0x2A, U 0x21, U 0x1C, U 0x23, U 0xE6, U 0x13, U 0x0F, U 0x0F, U 0x4F, U 0x26, U 0xE6, U 0x12, @@ -2357,187 +2359,193 @@ static unsigned char t3fw[30136] = { U 0xA9, U 0x06, U 0xC0, U 0xF0, U 0xC0, U 0x80, U 0x28, U 0x25, U 0x1D, U 0x05, U 0xF6, U 0x11, - U 0x1A, U 0xE9, U 0x71, U 0x8F, + U 0x1A, U 0xE9, U 0x6F, U 0x8F, U 0x20, U 0x2B, U 0xE6, U 0x15, U 0x2C, U 0xE6, U 0x16, U 0x2D, U 0xE6, U 0x17, U 0x26, U 0xE6, U 0x18, U 0x0A, U 0xFA, U 0x02, U 0x2A, U 0xE6, U 0x14, U 0x29, U 0x20, U 0x06, U 0x29, U 0x9C, - U 0xF9, U 0x64, U 0x90, U 0xFF, + U 0xF9, U 0x64, U 0x90, U 0xF8, U 0x29, U 0x20, U 0x0C, U 0x8D, - U 0x15, U 0xC0, U 0x80, U 0x1A, - U 0xE9, U 0x57, U 0x0C, U 0x9C, + U 0x14, U 0xC0, U 0x80, U 0x1A, + U 0xE9, U 0x56, U 0x0C, U 0x9C, U 0x11, U 0xAA, U 0x99, U 0xA5, U 0xCC, U 0xDA, U 0x20, U 0x2B, U 0xC2, U 0x85, U 0x28, U 0x94, U 0xCF, U 0x0B, U 0x4B, U 0x0B, U 0x2B, U 0xC6, U 0x85, U 0xC0, - U 0xB0, U 0x8C, U 0x16, U 0x58, - U 0x11, U 0x14, U 0xD2, U 0xA0, + U 0xB0, U 0x8C, U 0x15, U 0x58, + U 0x11, U 0xAF, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x8A, U 0x35, - U 0x6F, U 0xA5, U 0x48, U 0xD8, + U 0x6F, U 0xA5, U 0x46, U 0xD8, U 0x30, U 0x8B, U 0xD5, U 0x6D, U 0xA9, U 0x0C, U 0x8A, U 0x86, U 0x0A, U 0x8A, U 0x14, U 0xCB, - U 0xA9, U 0x7A, U 0xB3, U 0x37, + U 0xA7, U 0x7A, U 0xB3, U 0x35, U 0x28, U 0x8C, U 0x10, U 0xC0, U 0x80, U 0x28, U 0x24, U 0x67, U 0x08, U 0x0B, U 0x47, U 0x65, - U 0xB1, U 0x12, U 0xDA, U 0x20, + U 0xB1, U 0x0B, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0x2C, U 0x12, - U 0x06, U 0x58, U 0x11, U 0x37, + U 0x05, U 0x58, U 0x11, U 0xD2, U 0xD3, U 0xA0, U 0xC0, U 0xC1, U 0xC0, U 0xD0, U 0x2D, U 0xA4, - U 0x03, U 0x9C, U 0x15, U 0x63, - U 0xFD, U 0x26, U 0x86, U 0x36, - U 0x64, U 0x61, U 0x0C, U 0x89, - U 0x10, U 0xC0, U 0x4D, U 0x9B, - U 0x90, U 0x97, U 0x91, U 0x98, - U 0x92, U 0x63, U 0xFE, U 0xA4, - U 0xC0, U 0x81, U 0x63, U 0xFF, - U 0xC7, U 0x8A, U 0x15, U 0xCC, - U 0xA7, U 0xDA, U 0x20, U 0xDB, - U 0x30, U 0x8C, U 0x16, U 0x58, - U 0x11, U 0x2B, U 0xC0, U 0x20, - U 0xD1, U 0x0F, U 0xDA, U 0x20, - U 0xC0, U 0xB6, U 0x58, U 0x11, - U 0xBA, U 0x63, U 0xFF, U 0xE4, + U 0x03, U 0x9C, U 0x14, U 0x63, + U 0xFD, U 0x22, U 0x86, U 0x36, + U 0x64, U 0x61, U 0x05, U 0x9B, + U 0x70, U 0x9D, U 0x71, U 0x98, + U 0x72, U 0xC0, U 0x4D, U 0x63, + U 0xFE, U 0xA4, U 0xC0, U 0x81, + U 0x63, U 0xFF, U 0xC9, U 0x00, + U 0x88, U 0x14, U 0xCC, U 0x87, + U 0xDA, U 0x20, U 0xDB, U 0x30, + U 0x8C, U 0x15, U 0x58, U 0x11, + U 0xC6, U 0xC0, U 0x20, U 0xD1, + U 0x0F, U 0xDA, U 0x20, U 0xC0, + U 0xB6, U 0x58, U 0x12, U 0x55, + U 0x63, U 0xFF, U 0xE4, U 0x00, U 0x00, U 0xDA, U 0x20, U 0x8B, - U 0x11, U 0x58, U 0x11, U 0xB7, - U 0x63, U 0xFF, U 0xD9, U 0x00, - U 0x9E, U 0x17, U 0x8A, U 0x13, + U 0x10, U 0x58, U 0x12, U 0x52, + U 0x63, U 0xFF, U 0xD8, U 0x00, + U 0x9E, U 0x17, U 0x8A, U 0x12, U 0x2B, U 0x21, U 0x04, U 0x58, - U 0x10, U 0x4F, U 0x8E, U 0x17, - U 0xC0, U 0xB0, U 0x2B, U 0x24, + U 0x10, U 0xE8, U 0x8E, U 0x17, + U 0xC0, U 0x90, U 0x29, U 0x24, U 0x66, U 0x63, U 0xFE, U 0x34, U 0xC0, U 0x80, U 0x63, U 0xFE, - U 0x09, U 0xDA, U 0x20, U 0xDB, - U 0x30, U 0x8C, U 0x16, U 0xDD, - U 0x50, U 0x58, U 0x12, U 0x33, + U 0x06, U 0xDA, U 0x20, U 0xDB, + U 0x30, U 0x8C, U 0x15, U 0xDD, + U 0x50, U 0x58, U 0x12, U 0xDA, U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0xDA, U 0x20, U 0x58, U 0x11, - U 0xAB, U 0x63, U 0xFF, U 0xA8, - U 0x2D, U 0x21, U 0x23, U 0xC0, - U 0xC8, U 0x7D, U 0xC3, U 0x02, - U 0x63, U 0xFE, U 0x0D, U 0x8A, - U 0x13, U 0x2B, U 0x21, U 0x04, - U 0x2C, U 0x20, U 0x66, U 0x98, - U 0x17, U 0xB1, U 0xCC, U 0x0C, - U 0x0C, U 0x47, U 0x2C, U 0x24, - U 0x66, U 0x58, U 0x10, U 0x3D, - U 0x8E, U 0x17, U 0xC0, U 0xD0, - U 0x2D, U 0x24, U 0x66, U 0x63, - U 0xFD, U 0xEE, U 0x00, U 0x00, - U 0x26, U 0x21, U 0x23, U 0xB0, - U 0x66, U 0x06, U 0x06, U 0x4F, - U 0x26, U 0x25, U 0x23, U 0x65, - U 0x6E, U 0xF1, U 0x28, U 0x20, - U 0x6A, U 0x7F, U 0x87, U 0x05, - U 0x08, U 0x29, U 0x41, U 0x64, - U 0x90, U 0xA5, U 0xC0, U 0xD0, - U 0x1B, U 0xE9, U 0x1C, U 0x19, - U 0xE9, U 0x2B, U 0x26, U 0x20, - U 0x07, U 0x23, U 0xE6, U 0x1B, - U 0xB1, U 0x66, U 0x09, U 0xFA, - U 0x02, U 0x2B, U 0xE6, U 0x1A, - U 0x28, U 0x20, U 0x0A, U 0x2D, - U 0xE6, U 0x1D, U 0x2A, U 0xE6, - U 0x1E, U 0x09, U 0x88, U 0x02, - U 0x28, U 0xE6, U 0x1C, U 0x88, - U 0x26, U 0x06, U 0x06, U 0x47, - U 0x28, U 0xE6, U 0x20, U 0x2B, - U 0x22, U 0x08, U 0x26, U 0xE5, - U 0x3E, U 0x2B, U 0xE6, U 0x21, - U 0x2D, U 0x24, U 0x07, U 0x2C, - U 0x20, U 0x06, U 0x2A, U 0x20, - U 0x64, U 0x68, U 0xC3, U 0x47, - U 0xB4, U 0x44, U 0x63, U 0xFE, - U 0x9E, U 0xDB, U 0x30, U 0xDA, - U 0x20, U 0x8D, U 0x15, U 0xC0, - U 0xCE, U 0x2E, U 0x0A, U 0x80, - U 0x2C, U 0x24, U 0x68, U 0x8C, - U 0x16, U 0x58, U 0x10, U 0x7B, - U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x8E, U 0x10, U 0x2A, U 0x32, - U 0x16, U 0x16, U 0xE8, U 0xF3, - U 0x0A, U 0x2A, U 0x14, U 0x86, - U 0x66, U 0x2B, U 0xE6, U 0x12, - U 0x97, U 0xE1, U 0x27, U 0xE6, - U 0x13, U 0x28, U 0xE6, U 0x14, - U 0xAA, U 0x66, U 0x09, U 0x66, - U 0x02, U 0x96, U 0xE0, U 0x2E, - U 0xEC, U 0x48, U 0x69, U 0xED, - U 0x50, U 0xC1, U 0x46, U 0x63, - U 0xFD, U 0x7A, U 0x00, U 0x00, - U 0x64, U 0xAF, U 0xB4, U 0x19, - U 0xE8, U 0xE9, U 0x28, U 0x20, - U 0x16, U 0x89, U 0x92, U 0x0A, - U 0x88, U 0x0C, U 0x00, U 0x91, - U 0x04, U 0x00, U 0x88, U 0x1A, - U 0xA8, U 0xB8, U 0x98, U 0x29, - U 0x63, U 0xFF, U 0x9C, U 0x00, + U 0xDA, U 0x20, U 0x58, U 0x12, + U 0x46, U 0x63, U 0xFF, U 0xA7, + U 0x00, U 0x2B, U 0x21, U 0x38, + U 0xC0, U 0xA8, U 0x7B, U 0xAB, + U 0x02, U 0x60, U 0x01, U 0x04, + U 0x8C, U 0x31, U 0x0C, U 0xFC, + U 0x50, U 0x64, U 0xCE, U 0x04, + U 0x8A, U 0x12, U 0x2B, U 0x21, + U 0x04, U 0xC0, U 0xC0, U 0x98, + U 0x17, U 0x58, U 0x10, U 0xD6, + U 0x8E, U 0x17, U 0x63, U 0xFD, + U 0xF3, U 0x2D, U 0x21, U 0x38, + U 0x2D, U 0xDC, U 0xFF, U 0x0D, + U 0x0D, U 0x4F, U 0x2D, U 0x25, + U 0x38, U 0x65, U 0xDE, U 0xF7, + U 0x28, U 0x20, U 0x6A, U 0x7F, + U 0x87, U 0x05, U 0x08, U 0x26, + U 0x41, U 0x64, U 0x60, U 0xA3, + U 0xC0, U 0x90, U 0x16, U 0xE9, + U 0x1C, U 0x1C, U 0xE9, U 0x2A, + U 0x2A, U 0x20, U 0x07, U 0x23, + U 0xE6, U 0x1B, U 0xB1, U 0xAA, + U 0x0C, U 0xFD, U 0x02, U 0x26, + U 0xE6, U 0x1A, U 0x2B, U 0x20, + U 0x0A, U 0x29, U 0xE6, U 0x1D, + U 0x2D, U 0xE6, U 0x1E, U 0x0C, + U 0xBB, U 0x02, U 0x2B, U 0xE6, + U 0x1C, U 0x8B, U 0x26, U 0x0A, + U 0x0A, U 0x47, U 0x2B, U 0xE6, + U 0x20, U 0x8B, U 0x28, U 0x2A, + U 0xE5, U 0x3E, U 0x2B, U 0xE6, + U 0x21, U 0x29, U 0x24, U 0x07, + U 0x28, U 0x20, U 0x06, U 0x2A, + U 0x20, U 0x64, U 0x68, U 0x83, + U 0x46, U 0xB4, U 0x44, U 0x63, + U 0xFE, U 0xA5, U 0xDB, U 0x30, + U 0xDA, U 0x20, U 0x8C, U 0x15, + U 0x8D, U 0x14, U 0x2E, U 0x0A, + U 0x80, U 0xC0, U 0x8E, U 0x28, + U 0x24, U 0x68, U 0x58, U 0x11, + U 0x18, U 0xD2, U 0xA0, U 0xD1, + U 0x0F, U 0x2E, U 0x7C, U 0x48, + U 0x19, U 0xE8, U 0xF5, U 0x2A, + U 0x32, U 0x16, U 0x2B, U 0x76, + U 0x12, U 0x9D, U 0x71, U 0x2D, + U 0x76, U 0x13, U 0x28, U 0x76, + U 0x14, U 0x89, U 0x96, U 0x0A, + U 0x2A, U 0x14, U 0xAA, U 0x99, + U 0x0C, U 0x99, U 0x02, U 0x99, + U 0x70, U 0x69, U 0xED, U 0x71, + U 0xC1, U 0x46, U 0x63, U 0xFD, + U 0x81, U 0x00, U 0x00, U 0x00, + U 0x64, U 0xAF, U 0xB5, U 0x1D, + U 0xE8, U 0xEA, U 0x2C, U 0x20, + U 0x16, U 0x8D, U 0xD2, U 0x0A, + U 0xCC, U 0x0C, U 0x00, U 0xD1, + U 0x04, U 0x00, U 0xCC, U 0x1A, + U 0xAC, U 0xBC, U 0x9C, U 0x29, + U 0x63, U 0xFF, U 0x9D, U 0x00, U 0x2B, U 0x21, U 0x04, U 0x6E, U 0xB8, U 0x1E, U 0x2C, U 0x20, U 0x66, U 0xB8, U 0xCC, U 0x0C, U 0x0C, U 0x47, U 0x2C, U 0x24, U 0x66, U 0xC9, U 0xC0, U 0x9E, - U 0x17, U 0x8A, U 0x13, U 0x58, - U 0x10, U 0x04, U 0x8E, U 0x17, + U 0x17, U 0x8A, U 0x12, U 0x58, + U 0x10, U 0x9F, U 0x8E, U 0x17, U 0xC0, U 0x34, U 0x8F, U 0x20, U 0xC0, U 0xD0, U 0x2D, U 0x24, U 0x66, U 0xC0, U 0x68, U 0x26, U 0x24, U 0x06, U 0x63, U 0xFF, - U 0x2C, U 0x00, U 0x8D, U 0x35, + U 0x2E, U 0x8A, U 0x12, U 0x2B, + U 0x21, U 0x04, U 0x2C, U 0x20, + U 0x66, U 0x98, U 0x17, U 0xB1, + U 0xCC, U 0x0C, U 0x0C, U 0x47, + U 0x2C, U 0x24, U 0x66, U 0x58, + U 0x10, U 0x95, U 0x8E, U 0x17, + U 0x87, U 0x16, U 0xC0, U 0xD0, + U 0x2D, U 0x24, U 0x66, U 0x63, + U 0xFC, U 0xE6, U 0x8D, U 0x35, U 0xC0, U 0x80, U 0x64, U 0xD0, U 0x4A, U 0xD9, U 0xE0, U 0xDC, U 0x30, U 0xDB, U 0xE0, U 0xDF, - U 0x30, U 0x1A, U 0xE8, U 0xF4, + U 0x30, U 0x1A, U 0xE8, U 0xEC, U 0xB1, U 0x88, U 0xB4, U 0xFF, - U 0x17, U 0xE8, U 0xF4, U 0x86, - U 0xC9, U 0x24, U 0x9D, U 0xFF, - U 0x8D, U 0xC8, U 0x2C, U 0xCC, - U 0x10, U 0x2D, U 0x46, U 0x30, - U 0x07, U 0x67, U 0x01, U 0x2D, - U 0x46, U 0x32, U 0x0A, U 0x66, - U 0x01, U 0x1D, U 0xE8, U 0xEE, - U 0x26, U 0x46, U 0x31, U 0xAD, - U 0x6D, U 0x2D, U 0x46, U 0x33, - U 0x26, U 0xF2, U 0x15, U 0x97, - U 0xB7, U 0x96, U 0xB6, U 0x84, - U 0xC3, U 0xBC, U 0xBB, U 0x94, + U 0x16, U 0xE8, U 0xEC, U 0x84, + U 0xC9, U 0x2D, U 0x9D, U 0xFF, + U 0x87, U 0xC8, U 0x2C, U 0xCC, + U 0x10, U 0x27, U 0xD6, U 0x30, + U 0x06, U 0x46, U 0x01, U 0x27, + U 0xD6, U 0x32, U 0x0A, U 0x44, + U 0x01, U 0x17, U 0xE8, U 0xE6, + U 0x24, U 0xD6, U 0x31, U 0xA7, + U 0x47, U 0x27, U 0xD6, U 0x33, + U 0x24, U 0xF2, U 0x15, U 0x96, + U 0xB7, U 0x94, U 0xB6, U 0x8D, + U 0xC3, U 0xBC, U 0xBB, U 0x9D, U 0xB5, U 0x8D, U 0x35, U 0x29, U 0x9C, U 0x10, U 0x7D, U 0x83, U 0xC2, U 0x2F, U 0x21, U 0x1D, U 0xC1, U 0x46, U 0x63, U 0xFD, - U 0x4B, U 0x00, U 0x00, U 0x00, + U 0x33, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x29, U 0x20, U 0x06, U 0x28, U 0x9C, - U 0xF8, U 0x65, U 0x82, U 0xC3, + U 0xF8, U 0x65, U 0x82, U 0xBF, U 0x29, U 0x21, U 0x02, U 0x2B, U 0x20, U 0x0C, U 0x09, U 0x09, U 0x4C, U 0x65, U 0x90, U 0xE1, - U 0x16, U 0xE8, U 0xB9, U 0x0C, + U 0x16, U 0xE8, U 0xB2, U 0x0C, U 0xBA, U 0x11, U 0xA6, U 0xAA, U 0x2D, U 0xA2, U 0x86, U 0x2C, U 0x0A, U 0x12, U 0x7D, U 0xC3, - U 0x02, U 0x60, U 0x02, U 0x90, - U 0x19, U 0xE8, U 0xB5, U 0x09, + U 0x02, U 0x60, U 0x02, U 0x8C, + U 0x19, U 0xE8, U 0xAE, U 0x09, U 0xB9, U 0x0A, U 0x29, U 0x92, U 0xA3, U 0x68, U 0x90, U 0x07, U 0x8C, U 0x20, U 0x09, U 0xCC, - U 0x0C, U 0x65, U 0xC2, U 0x7C, + U 0x0C, U 0x65, U 0xC2, U 0x78, U 0x29, U 0xA2, U 0x85, U 0x64, - U 0x92, U 0x76, U 0x2D, U 0x62, - U 0x9E, U 0x1A, U 0xE8, U 0xAB, + U 0x92, U 0x72, U 0x2D, U 0x62, + U 0x9E, U 0x1A, U 0xE8, U 0xA4, U 0x6F, U 0xD8, U 0x02, U 0x60, - U 0x02, U 0x72, U 0x2A, U 0xA2, + U 0x02, U 0x6E, U 0x2A, U 0xA2, U 0x26, U 0x29, U 0x16, U 0x01, U 0x68, U 0xA0, U 0x08, U 0x2B, U 0x22, U 0x00, U 0x0A, U 0xBB, - U 0x0C, U 0x65, U 0xB2, U 0x60, + U 0x0C, U 0x65, U 0xB2, U 0x5C, U 0x29, U 0x62, U 0x9D, U 0xC1, - U 0x8C, U 0x64, U 0x92, U 0x58, + U 0x8C, U 0x64, U 0x92, U 0x54, U 0x2A, U 0x21, U 0x20, U 0x0A, U 0x80, U 0x60, U 0x99, U 0x10, U 0x2C, U 0x20, U 0x3C, U 0xC7, @@ -2569,14 +2577,14 @@ static unsigned char t3fw[30136] = { U 0x7C, U 0x8B, U 0x29, U 0xB0, U 0xCD, U 0x2D, U 0x25, U 0x23, U 0xC8, U 0x55, U 0xDA, U 0x20, - U 0xDB, U 0x30, U 0x58, U 0x0F, - U 0xFA, U 0x29, U 0x21, U 0x02, + U 0xDB, U 0x30, U 0x58, U 0x10, + U 0x8E, U 0x29, U 0x21, U 0x02, U 0xCC, U 0x96, U 0xC0, U 0xE8, U 0x0E, U 0x9E, U 0x02, U 0x2E, U 0x25, U 0x02, U 0xCC, U 0x57, U 0xDA, U 0x20, U 0xDB, U 0x30, - U 0xDC, U 0x40, U 0x58, U 0x10, - U 0x7A, U 0xC0, U 0x20, U 0xD1, + U 0xDC, U 0x40, U 0x58, U 0x11, + U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x2C, U 0x20, U 0x66, U 0x89, U 0x31, U 0xB1, U 0xCC, U 0x0C, U 0x0C, U 0x47, U 0x2C, @@ -2592,88 +2600,87 @@ static unsigned char t3fw[30136] = { U 0xFA, U 0x1A, U 0x0A, U 0x88, U 0x02, U 0x28, U 0x26, U 0x1B, U 0x2E, U 0x30, U 0x10, U 0xC0, - U 0xA0, U 0xC0, U 0xB0, U 0x88, - U 0x30, U 0x1C, U 0xE8, U 0x6E, - U 0x94, U 0x12, U 0x95, U 0x13, - U 0xC0, U 0x41, U 0x25, U 0x20, - U 0x3C, U 0x2C, U 0xC0, U 0x22, - U 0x08, U 0x8D, U 0x14, U 0x77, - U 0x87, U 0x05, U 0x2F, U 0x0A, - U 0x01, U 0x0C, U 0xFA, U 0x38, - U 0xC0, U 0xF2, U 0xC0, U 0x84, - U 0x08, U 0x58, U 0x01, U 0x0F, - U 0x5F, U 0x01, U 0x0F, U 0x4B, - U 0x38, U 0x05, U 0x35, U 0x40, - U 0x07, U 0xBB, U 0x10, U 0xC0, - U 0xF0, U 0x08, U 0x4F, U 0x38, - U 0x08, U 0xFF, U 0x10, U 0x0F, - U 0xBB, U 0x02, U 0x28, U 0xEC, - U 0xFE, U 0xC0, U 0xF0, U 0x08, - U 0x4F, U 0x38, U 0x84, U 0x2B, - U 0x0B, U 0xA8, U 0x10, U 0x0A, - U 0xFF, U 0x10, U 0x2A, U 0x21, - U 0x20, U 0x0F, U 0x88, U 0x02, - U 0x0B, U 0x88, U 0x02, U 0x08, - U 0x44, U 0x02, U 0x18, U 0xE8, - U 0x7D, U 0x8F, U 0x11, U 0x08, - U 0x44, U 0x02, U 0x28, U 0x21, - U 0x25, U 0x0A, U 0x2A, U 0x14, - U 0x08, U 0x28, U 0x14, U 0x04, - U 0x88, U 0x11, U 0x0A, U 0x88, - U 0x02, U 0x2A, U 0x21, U 0x04, - U 0x94, U 0xF0, U 0x8B, U 0x20, - U 0x04, U 0xE4, U 0x10, U 0x08, - U 0xBB, U 0x11, U 0x04, U 0xBB, - U 0x02, U 0xC0, U 0x4A, U 0x04, - U 0xBB, U 0x02, U 0x9B, U 0xF1, - U 0x84, U 0x2A, U 0x08, U 0xAB, - U 0x11, U 0x0B, U 0xEB, U 0x02, - U 0x94, U 0xF4, U 0x0A, U 0x54, - U 0x11, U 0x0B, U 0x44, U 0x02, - U 0x05, U 0x55, U 0x10, U 0x0D, - U 0x1B, U 0x40, U 0x94, U 0xF7, - U 0x07, U 0xBB, U 0x10, U 0x0B, - U 0x55, U 0x02, U 0x08, U 0x55, - U 0x02, U 0xC0, U 0x81, U 0x95, - U 0xF6, U 0x84, U 0x33, U 0xC0, - U 0x50, U 0x94, U 0xF3, U 0xB1, - U 0x94, U 0x8B, U 0x32, U 0x95, - U 0xF8, U 0x98, U 0xF9, U 0x9B, - U 0xF2, U 0xC0, U 0x80, U 0xC1, - U 0xBC, U 0x24, U 0x26, U 0x14, - U 0x98, U 0xFB, U 0x9B, U 0xF5, - U 0x99, U 0xFA, U 0x85, U 0x38, - U 0x95, U 0xFC, U 0x84, U 0x3A, - U 0x94, U 0xFD, U 0x8B, U 0x3B, - U 0x9B, U 0xFE, U 0x88, U 0x39, - U 0x98, U 0xFF, U 0x85, U 0x35, - U 0x25, U 0xF6, U 0x10, U 0x84, - U 0x36, U 0x85, U 0x13, U 0x24, - U 0xF6, U 0x11, U 0x8B, U 0x37, - U 0x84, U 0x12, U 0x2B, U 0xF6, - U 0x12, U 0xC0, U 0xB0, U 0x64, - U 0xC0, U 0x81, U 0x89, U 0x30, - U 0x77, U 0x97, U 0x46, U 0x8D, - U 0x32, U 0x88, U 0x33, U 0x2E, - U 0x30, U 0x10, U 0x8F, U 0x11, - U 0x1C, U 0xE8, U 0x40, U 0x09, - U 0x99, U 0x40, U 0x06, U 0x99, - U 0x11, U 0x2C, U 0xF6, U 0x14, - U 0xC0, U 0xC4, U 0x2C, U 0xF6, - U 0x15, U 0x8C, U 0x2B, U 0x2D, - U 0xF6, U 0x1A, U 0x28, U 0xF6, - U 0x1B, U 0x2B, U 0xF6, U 0x19, - U 0x04, U 0xA8, U 0x11, U 0x09, - U 0x88, U 0x02, U 0x08, U 0xEE, - U 0x02, U 0x19, U 0xE8, U 0x35, - U 0xC1, U 0x80, U 0x08, U 0xEE, - U 0x02, U 0x09, U 0xC9, U 0x02, - U 0x29, U 0xF6, U 0x16, U 0x2E, - U 0xF6, U 0x18, U 0xC0, U 0x9E, - U 0x60, U 0x00, U 0x04, U 0x00, - U 0x00, U 0x00, U 0xC0, U 0x9A, + U 0xA0, U 0xC0, U 0xB0, U 0x94, + U 0x12, U 0x95, U 0x13, U 0x1C, + U 0xE8, U 0x67, U 0x88, U 0x30, + U 0x2C, U 0xC0, U 0x22, U 0x08, + U 0x8D, U 0x14, U 0x77, U 0x87, + U 0x04, U 0xC0, U 0xF1, U 0x0C, + U 0xFA, U 0x38, U 0xC0, U 0x41, + U 0xC0, U 0xF2, U 0x25, U 0x20, + U 0x3C, U 0xC0, U 0x84, U 0x08, + U 0x58, U 0x01, U 0x0F, U 0x5F, + U 0x01, U 0x0F, U 0x4B, U 0x38, + U 0x05, U 0x35, U 0x40, U 0x07, + U 0xBB, U 0x10, U 0xC0, U 0xF0, + U 0x08, U 0x4F, U 0x38, U 0x08, + U 0xFF, U 0x10, U 0x0F, U 0xBB, + U 0x02, U 0x28, U 0xEC, U 0xFE, + U 0xC0, U 0xF0, U 0x08, U 0x4F, + U 0x38, U 0x84, U 0x2B, U 0x0B, + U 0xA8, U 0x10, U 0x0A, U 0xFF, + U 0x10, U 0x2A, U 0x21, U 0x20, + U 0x0F, U 0x88, U 0x02, U 0x0B, + U 0x88, U 0x02, U 0x08, U 0x44, + U 0x02, U 0x18, U 0xE8, U 0x75, + U 0x8F, U 0x11, U 0x08, U 0x44, + U 0x02, U 0x28, U 0x21, U 0x25, + U 0x0A, U 0x2A, U 0x14, U 0x08, + U 0x28, U 0x14, U 0x04, U 0x88, + U 0x11, U 0x0A, U 0x88, U 0x02, + U 0x2A, U 0x21, U 0x04, U 0x94, + U 0xF0, U 0x8B, U 0x20, U 0x04, + U 0xE4, U 0x10, U 0x08, U 0xBB, + U 0x11, U 0x04, U 0xBB, U 0x02, + U 0xC0, U 0x4A, U 0x04, U 0xBB, + U 0x02, U 0x9B, U 0xF1, U 0x84, + U 0x2A, U 0x08, U 0xAB, U 0x11, + U 0x0B, U 0xEB, U 0x02, U 0x94, + U 0xF4, U 0x0A, U 0x54, U 0x11, + U 0x0B, U 0x44, U 0x02, U 0x05, + U 0x55, U 0x10, U 0x0D, U 0x1B, + U 0x40, U 0x94, U 0xF7, U 0x07, + U 0xBB, U 0x10, U 0x0B, U 0x55, + U 0x02, U 0x08, U 0x55, U 0x02, + U 0xC0, U 0x81, U 0x95, U 0xF6, + U 0x84, U 0x33, U 0xC0, U 0x50, + U 0x94, U 0xF3, U 0xB1, U 0x94, + U 0x8B, U 0x32, U 0x95, U 0xF8, + U 0x98, U 0xF9, U 0x9B, U 0xF2, + U 0xC0, U 0x80, U 0xC1, U 0xBC, + U 0x24, U 0x26, U 0x14, U 0x99, + U 0xFA, U 0x9B, U 0xF5, U 0x98, + U 0xFB, U 0x85, U 0x38, U 0x95, + U 0xFC, U 0x84, U 0x3A, U 0x94, + U 0xFD, U 0x8B, U 0x3B, U 0x9B, + U 0xFE, U 0x88, U 0x39, U 0x98, + U 0xFF, U 0x85, U 0x35, U 0x25, + U 0xF6, U 0x10, U 0x84, U 0x36, + U 0x85, U 0x13, U 0x24, U 0xF6, + U 0x11, U 0x8B, U 0x37, U 0x84, + U 0x12, U 0x2B, U 0xF6, U 0x12, + U 0xC0, U 0xB0, U 0x64, U 0xC0, + U 0x7E, U 0x89, U 0x30, U 0x77, + U 0x97, U 0x43, U 0x8D, U 0x32, + U 0x88, U 0x33, U 0x2E, U 0x30, + U 0x10, U 0x8F, U 0x11, U 0x1C, + U 0xE8, U 0x39, U 0x09, U 0x99, + U 0x40, U 0x06, U 0x99, U 0x11, + U 0x2C, U 0xF6, U 0x14, U 0xC0, + U 0xC4, U 0x2C, U 0xF6, U 0x15, + U 0x8C, U 0x2B, U 0x2D, U 0xF6, + U 0x1A, U 0x28, U 0xF6, U 0x1B, + U 0x2B, U 0xF6, U 0x19, U 0x04, + U 0xA8, U 0x11, U 0x09, U 0x88, + U 0x02, U 0x08, U 0xEE, U 0x02, + U 0x19, U 0xE8, U 0x2F, U 0xC1, + U 0x80, U 0x08, U 0xEE, U 0x02, + U 0x09, U 0xC9, U 0x02, U 0x29, + U 0xF6, U 0x16, U 0x2E, U 0xF6, + U 0x18, U 0xC0, U 0x9E, U 0x60, + U 0x00, U 0x01, U 0xC0, U 0x9A, U 0x2F, U 0x20, U 0x0C, U 0x18, - U 0xE8, U 0x25, U 0x0C, U 0xFE, + U 0xE8, U 0x1F, U 0x0C, U 0xFE, U 0x11, U 0xA8, U 0xFF, U 0xA6, U 0xEE, U 0x2D, U 0xE2, U 0x85, U 0x2B, U 0xF4, U 0xCF, U 0x0D, @@ -2683,45 +2690,46 @@ static unsigned char t3fw[30136] = { U 0xAA, U 0x9A, U 0x26, U 0x0A, U 0x99, U 0x0C, U 0x09, U 0x09, U 0x48, U 0x29, U 0x25, U 0x25, - U 0x65, U 0x50, U 0x4C, U 0xC0, + U 0x65, U 0x50, U 0x50, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0xC0, U 0x9A, U 0x63, U 0xFF, U 0xC6, U 0xDA, U 0x20, U 0x58, - U 0x10, U 0x9D, U 0x63, U 0xFE, - U 0x34, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x10, U 0x9A, - U 0x63, U 0xFE, U 0x2A, U 0x00, - U 0x68, U 0x97, U 0x38, U 0xC0, - U 0x20, U 0xD1, U 0x0F, U 0x00, - U 0x00, U 0xDA, U 0x20, U 0xDB, - U 0x70, U 0x58, U 0x10, U 0x57, - U 0xC0, U 0xB0, U 0xC0, U 0xC1, - U 0x0A, U 0xCA, U 0x39, U 0x0A, - U 0xCB, U 0x38, U 0x65, U 0xBD, + U 0x11, U 0x33, U 0x63, U 0xFE, + U 0x38, U 0xDA, U 0x20, U 0xC0, + U 0xB6, U 0x58, U 0x11, U 0x30, + U 0x63, U 0xFE, U 0x2E, U 0x00, + U 0x68, U 0x97, U 0x3C, U 0x2B, + U 0x9C, U 0xFD, U 0x64, U 0xBE, + U 0x24, U 0xC0, U 0x20, U 0xD1, + U 0x0F, U 0xDA, U 0x20, U 0xDB, + U 0x70, U 0x58, U 0x10, U 0xEC, + U 0xC0, U 0xC0, U 0xC0, U 0xD1, + U 0x0A, U 0xDA, U 0x39, U 0x0A, + U 0xDC, U 0x38, U 0x65, U 0xCD, U 0xE0, U 0x63, U 0xFE, U 0x09, U 0x8A, U 0x10, U 0x2B, U 0x21, - U 0x04, U 0x58, U 0x0F, U 0x2A, + U 0x04, U 0x58, U 0x0F, U 0xBD, U 0xC0, U 0xB0, U 0x2B, U 0x24, U 0x66, U 0x63, U 0xFE, U 0x21, U 0xDB, U 0x40, U 0x2A, U 0x2C, - U 0x74, U 0x58, U 0x09, U 0x0F, + U 0x74, U 0x58, U 0x09, U 0x9D, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0x58, U 0x0F, - U 0x2F, U 0x63, U 0xFC, U 0xF7, + U 0xC2, U 0x63, U 0xFC, U 0xF7, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x29, U 0x0A, U 0x80, U 0x1E, U 0xE8, - U 0x1D, U 0x1F, U 0xE8, U 0x1D, - U 0x1C, U 0xE7, U 0xF5, U 0x0C, + U 0x15, U 0x1F, U 0xE8, U 0x15, + U 0x1C, U 0xE7, U 0xEE, U 0x0C, U 0x2B, U 0x11, U 0xAC, U 0xBB, U 0x2C, U 0x2C, U 0xFC, U 0x2D, U 0xB2, U 0x85, U 0x0F, U 0xCC, U 0x02, U 0x9E, U 0xD1, U 0x9C, U 0xD0, U 0xC0, U 0x51, U 0xC0, - U 0x70, U 0x13, U 0xE8, U 0x19, - U 0x14, U 0xE8, U 0x18, U 0x18, - U 0xE8, U 0x16, U 0x2A, U 0xB2, + U 0x70, U 0x13, U 0xE8, U 0x11, + U 0x14, U 0xE8, U 0x10, U 0x18, + U 0xE8, U 0x0E, U 0x2A, U 0xB2, U 0x85, U 0xA8, U 0x28, U 0x04, U 0x24, U 0x0A, U 0x23, U 0x46, U 0x91, U 0xA9, U 0x86, U 0xB8, @@ -2736,17 +2744,17 @@ static unsigned char t3fw[30136] = { U 0x9B, U 0x68, U 0x98, U 0x0B, U 0x2A, U 0x9C, U 0xF9, U 0x65, U 0xA1, U 0xB2, U 0x02, U 0x2A, - U 0x02, U 0x58, U 0x0F, U 0x11, + U 0x02, U 0x58, U 0x0F, U 0xA4, U 0x89, U 0x37, U 0x1B, U 0xE7, - U 0xDE, U 0xC8, U 0x91, U 0x64, + U 0xD7, U 0xC8, U 0x91, U 0x64, U 0x52, U 0x0E, U 0x2A, U 0x21, U 0x02, U 0x0A, U 0x0C, U 0x4C, U 0x65, U 0xC2, U 0x58, U 0x8D, - U 0x30, U 0x19, U 0xE7, U 0xD7, + U 0x30, U 0x19, U 0xE7, U 0xD0, U 0x74, U 0xD7, U 0x05, U 0x2E, U 0x21, U 0x23, U 0x65, U 0xE2, U 0x9E, U 0x2F, U 0x92, U 0x9E, - U 0x1A, U 0xE7, U 0xD3, U 0x6F, + U 0x1A, U 0xE7, U 0xCC, U 0x6F, U 0xF8, U 0x02, U 0x60, U 0x02, U 0x53, U 0x2A, U 0xA2, U 0x26, U 0x68, U 0xA0, U 0x08, U 0x2C, @@ -2754,20 +2762,20 @@ static unsigned char t3fw[30136] = { U 0x0C, U 0x65, U 0xC2, U 0x44, U 0x2A, U 0x92, U 0x9D, U 0x64, U 0xA2, U 0x3E, U 0x9A, U 0x15, - U 0x1F, U 0xE7, U 0xCD, U 0x8D, - U 0x67, U 0xC1, U 0xE6, U 0x64, - U 0xD0, U 0x0E, U 0x2B, U 0x62, - U 0x06, U 0x18, U 0xE7, U 0xCA, - U 0x64, U 0xB0, U 0x05, U 0x28, - U 0x80, U 0x21, U 0x7B, U 0x8B, - U 0x42, U 0x2B, U 0x20, U 0x0C, - U 0x18, U 0xE7, U 0xC5, U 0x0C, - U 0xBC, U 0x11, U 0xA8, U 0xCC, - U 0x29, U 0xC2, U 0x86, U 0x79, - U 0xEB, U 0x45, U 0x0F, U 0xBE, - U 0x0A, U 0x2E, U 0xE2, U 0xA3, - U 0x68, U 0xE0, U 0x04, U 0x8F, - U 0x20, U 0x7E, U 0xF9, U 0x37, + U 0x1F, U 0xE7, U 0xC6, U 0x8D, + U 0x67, U 0xC1, U 0xE6, U 0xC8, + U 0xDD, U 0x2B, U 0x62, U 0x06, + U 0x18, U 0xE7, U 0xC4, U 0x64, + U 0xB0, U 0x05, U 0x28, U 0x80, + U 0x21, U 0x7B, U 0x8B, U 0x43, + U 0x2B, U 0x20, U 0x0C, U 0x18, + U 0xE7, U 0xBE, U 0x0C, U 0xBC, + U 0x11, U 0xA8, U 0xCC, U 0x29, + U 0xC2, U 0x86, U 0x79, U 0xEB, + U 0x46, U 0x0F, U 0xBE, U 0x0A, + U 0x2E, U 0xE2, U 0xA3, U 0x68, + U 0xE0, U 0x05, U 0x2F, U 0x22, + U 0x00, U 0x7E, U 0xF9, U 0x37, U 0x2C, U 0xC2, U 0x85, U 0x9C, U 0x18, U 0x64, U 0xC2, U 0x33, U 0x2B, U 0x21, U 0x2F, U 0x87, @@ -2779,7 +2787,7 @@ static unsigned char t3fw[30136] = { U 0x55, U 0x60, U 0x00, U 0x1E, U 0x2A, U 0x20, U 0x0C, U 0xC1, U 0xB2, U 0x8C, U 0x20, U 0x58, - U 0x10, U 0x75, U 0x9A, U 0x18, + U 0x11, U 0x16, U 0x9A, U 0x18, U 0x64, U 0xA2, U 0x45, U 0x8D, U 0x67, U 0x63, U 0xFF, U 0xCF, U 0xC0, U 0xC0, U 0x63, U 0xFF, @@ -2794,7 +2802,7 @@ static unsigned char t3fw[30136] = { U 0x01, U 0x99, U 0xD7, U 0xA0, U 0xDA, U 0x20, U 0xDB, U 0x70, U 0xC1, U 0xC8, U 0x2D, U 0x21, - U 0x20, U 0x58, U 0x10, U 0x1B, + U 0x20, U 0x58, U 0x10, U 0xB0, U 0x8C, U 0x26, U 0x8B, U 0x27, U 0x9A, U 0x16, U 0x0C, U 0xBB, U 0x0C, U 0x7A, U 0xB3, U 0x34, @@ -2812,7 +2820,7 @@ static unsigned char t3fw[30136] = { U 0x02, U 0x60, U 0x00, U 0x97, U 0xCF, U 0x58, U 0x60, U 0x00, U 0x1F, U 0xDA, U 0x20, U 0x8B, - U 0x16, U 0x58, U 0x0F, U 0xE1, + U 0x16, U 0x58, U 0x10, U 0x76, U 0x65, U 0xA1, U 0x38, U 0x63, U 0xFF, U 0xBD, U 0xC0, U 0x81, U 0xC0, U 0x90, U 0x8F, U 0x18, @@ -2821,7 +2829,7 @@ static unsigned char t3fw[30136] = { U 0x97, U 0xF5, U 0x63, U 0xFF, U 0xD2, U 0xDB, U 0x30, U 0xDA, U 0x20, U 0xDC, U 0x40, U 0x58, - U 0x0F, U 0x85, U 0xC0, U 0x51, + U 0x10, U 0x1A, U 0xC0, U 0x51, U 0xD6, U 0xA0, U 0xC0, U 0xC0, U 0x2B, U 0xA0, U 0x10, U 0x2C, U 0xA4, U 0x03, U 0x9B, U 0x17, @@ -2846,7 +2854,7 @@ static unsigned char t3fw[30136] = { U 0x26, U 0x18, U 0x63, U 0xFE, U 0x96, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, - U 0x50, U 0x58, U 0x10, U 0x83, + U 0x50, U 0x58, U 0x11, U 0x24, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC0, U 0x30, U 0x2C, U 0x20, U 0x66, U 0x89, U 0x61, U 0xB1, @@ -2863,13 +2871,13 @@ static unsigned char t3fw[30136] = { U 0x8E, U 0x17, U 0x0C, U 0xDD, U 0x11, U 0x9E, U 0x10, U 0xAD, U 0x6D, U 0x2D, U 0xDC, U 0x20, - U 0x1E, U 0xE7, U 0x84, U 0x58, + U 0x1E, U 0xE7, U 0x7C, U 0x58, U 0x00, U 0xF9, U 0x23, U 0x26, U 0x18, U 0xDA, U 0x20, U 0x8B, U 0x16, U 0xDC, U 0x40, U 0x2F, U 0x22, U 0x13, U 0xDD, U 0x50, U 0xB1, U 0xFF, U 0x2F, U 0x26, - U 0x13, U 0x58, U 0x0F, U 0x24, + U 0x13, U 0x58, U 0x0F, U 0xB9, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0x28, U 0x20, U 0x3D, U 0x08, U 0x48, U 0x40, U 0x65, @@ -2888,34 +2896,34 @@ static unsigned char t3fw[30136] = { U 0x20, U 0x07, U 0x7F, U 0x02, U 0x8E, U 0x17, U 0xDA, U 0x20, U 0x9E, U 0x10, U 0x1E, U 0xE7, - U 0x6B, U 0x58, U 0x00, U 0x7D, + U 0x63, U 0x58, U 0x00, U 0x7D, U 0x63, U 0xFF, U 0x9A, U 0x00, U 0xC0, U 0x91, U 0x63, U 0xFF, U 0xD1, U 0x00, U 0x00, U 0x00, U 0x65, U 0x50, U 0x81, U 0xDA, U 0x20, U 0xDB, U 0x60, U 0xDC, - U 0x40, U 0x58, U 0x0F, U 0x3B, + U 0x40, U 0x58, U 0x0F, U 0xD0, U 0xC0, U 0x20, U 0xC0, U 0xF0, U 0x2F, U 0xA4, U 0x03, U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x0F, U 0xC9, + U 0xB6, U 0x58, U 0x10, U 0x5E, U 0x63, U 0xFF, U 0xE0, U 0x00, U 0x00, U 0x6F, U 0x95, U 0x02, U 0x63, U 0xFD, U 0x6C, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, U 0x50, U 0xC4, - U 0xE0, U 0x58, U 0x0E, U 0xBC, + U 0xE0, U 0x58, U 0x0F, U 0x51, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x8A, U 0x15, U 0x2B, U 0x21, - U 0x04, U 0x58, U 0x0E, U 0x5B, + U 0x04, U 0x58, U 0x0E, U 0xEE, U 0x23, U 0x24, U 0x66, U 0x28, U 0x60, U 0x10, U 0x98, U 0x17, U 0x63, U 0xFF, U 0x21, U 0x00, - U 0xDA, U 0x20, U 0x58, U 0x0F, - U 0xBC, U 0x63, U 0xFF, U 0xAB, + U 0xDA, U 0x20, U 0x58, U 0x10, + U 0x51, U 0x63, U 0xFF, U 0xAB, U 0xC8, U 0x58, U 0xDB, U 0x30, - U 0xDA, U 0x20, U 0x58, U 0x0E, - U 0xA1, U 0x2A, U 0x21, U 0x02, + U 0xDA, U 0x20, U 0x58, U 0x0F, + U 0x35, U 0x2A, U 0x21, U 0x02, U 0x65, U 0xAF, U 0x9C, U 0xC0, U 0x94, U 0x09, U 0xA9, U 0x02, U 0x29, U 0x25, U 0x02, U 0x63, @@ -2923,12 +2931,12 @@ static unsigned char t3fw[30136] = { U 0xDC, U 0x40, U 0xDD, U 0x50, U 0xC0, U 0xA3, U 0x2E, U 0x0A, U 0x80, U 0x2A, U 0x24, U 0x68, - U 0xDA, U 0x20, U 0x58, U 0x0E, - U 0xA9, U 0xD2, U 0xA0, U 0xD1, + U 0xDA, U 0x20, U 0x58, U 0x0F, + U 0x3E, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0x2B, - U 0x20, U 0x0C, U 0x58, U 0x0F, - U 0xC5, U 0x63, U 0xFF, U 0x6B, + U 0x20, U 0x0C, U 0x58, U 0x10, + U 0x66, U 0x63, U 0xFF, U 0x6B, U 0x6C, U 0x10, U 0x04, U 0x28, U 0x20, U 0x06, U 0xC0, U 0x62, U 0x28, U 0x8C, U 0xF8, U 0x65, @@ -2946,10 +2954,10 @@ static unsigned char t3fw[30136] = { U 0x03, U 0x0C, U 0xBB, U 0x01, U 0x2B, U 0x26, U 0x1B, U 0x64, U 0x40, U 0x69, U 0x29, U 0x20, - U 0x0C, U 0x1B, U 0xE7, U 0x0B, + U 0x0C, U 0x1B, U 0xE7, U 0x04, U 0x0C, U 0x9A, U 0x11, U 0x0B, U 0xAA, U 0x08, U 0x2F, U 0xA2, - U 0x86, U 0x1B, U 0xE7, U 0x09, + U 0x86, U 0x1B, U 0xE7, U 0x02, U 0x6F, U 0xF9, U 0x02, U 0x60, U 0x00, U 0xB6, U 0x0B, U 0x9B, U 0x0A, U 0x2B, U 0xB2, U 0xA3, @@ -2957,7 +2965,7 @@ static unsigned char t3fw[30136] = { U 0x22, U 0x00, U 0x0B, U 0xCC, U 0x0C, U 0x65, U 0xC0, U 0xA4, U 0x2B, U 0xA2, U 0x85, U 0x1D, - U 0xE7, U 0x2D, U 0x64, U 0xB0, + U 0xE7, U 0x25, U 0x64, U 0xB0, U 0x9B, U 0x8C, U 0x2B, U 0x24, U 0x21, U 0x04, U 0x0D, U 0xCC, U 0x02, U 0x9C, U 0xB0, U 0x88, @@ -2968,7 +2976,7 @@ static unsigned char t3fw[30136] = { U 0x98, U 0xB4, U 0x8F, U 0x34, U 0x94, U 0xB7, U 0x9F, U 0xB5, U 0xC0, U 0x40, U 0x1E, U 0xE6, - U 0xFE, U 0x2D, U 0xA2, U 0x85, + U 0xF7, U 0x2D, U 0xA2, U 0x85, U 0x0E, U 0x9E, U 0x08, U 0x25, U 0xE4, U 0xCF, U 0x2D, U 0xDC, U 0x28, U 0x2D, U 0xA6, U 0x85, @@ -2990,7 +2998,7 @@ static unsigned char t3fw[30136] = { U 0x25, U 0x25, U 0x02, U 0x7B, U 0xF9, U 0x01, U 0xC0, U 0xB0, U 0x64, U 0xBF, U 0xC4, U 0x13, - U 0xE6, U 0xDF, U 0x2C, U 0xB0, + U 0xE6, U 0xD8, U 0x2C, U 0xB0, U 0x07, U 0x28, U 0xB0, U 0x00, U 0xDA, U 0x20, U 0x03, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, @@ -2999,8 +3007,8 @@ static unsigned char t3fw[30136] = { U 0xAF, U 0xE7, U 0x63, U 0xFF, U 0xA6, U 0x2A, U 0x2C, U 0x74, U 0xC0, U 0xB0, U 0x2C, U 0x0A, - U 0x02, U 0x58, U 0x0D, U 0x95, - U 0x1C, U 0xE7, U 0x03, U 0x9C, + U 0x02, U 0x58, U 0x0E, U 0x28, + U 0x1C, U 0xE6, U 0xFB, U 0x9C, U 0xA0, U 0x8B, U 0x20, U 0x08, U 0xBB, U 0x11, U 0x06, U 0xBB, U 0x02, U 0x9B, U 0xA1, U 0x89, @@ -3009,10 +3017,10 @@ static unsigned char t3fw[30136] = { U 0x26, U 0x24, U 0x68, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, U 0x50, U 0x58, - U 0x0F, U 0xE1, U 0xD2, U 0xA0, + U 0x10, U 0x82, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0x2B, U 0x20, U 0x0C, U 0x58, - U 0x0F, U 0x58, U 0xC0, U 0x20, + U 0x0F, U 0xED, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x07, U 0x3D, U 0x14, U 0xC0, U 0x80, @@ -3023,14 +3031,14 @@ static unsigned char t3fw[30136] = { U 0x08, U 0x08, U 0x42, U 0x77, U 0x40, U 0x01, U 0xB1, U 0xDD, U 0x64, U 0x81, U 0x5A, U 0x1E, - U 0xE6, U 0xBB, U 0x19, U 0xE6, - U 0xBC, U 0x29, U 0xE6, U 0x7E, + U 0xE6, U 0xB4, U 0x19, U 0xE6, + U 0xB5, U 0x29, U 0xE6, U 0x7E, U 0xD3, U 0x0F, U 0x6D, U 0xDA, U 0x05, U 0x00, U 0x50, U 0x88, U 0x00, U 0x30, U 0x8C, U 0xC0, U 0xE0, U 0xC0, U 0x20, U 0x25, U 0xA0, U 0x3C, U 0x14, U 0xE6, - U 0xBA, U 0xB6, U 0xD3, U 0x8F, + U 0xB3, U 0xB6, U 0xD3, U 0x8F, U 0xC0, U 0xC0, U 0xD0, U 0x0F, U 0x87, U 0x14, U 0x24, U 0x40, U 0x22, U 0x0F, U 0x89, U 0x40, @@ -3050,7 +3058,7 @@ static unsigned char t3fw[30136] = { U 0x38, U 0x0A, U 0xEE, U 0x10, U 0x0E, U 0x88, U 0x02, U 0x0D, U 0x88, U 0x02, U 0x8D, U 0xAB, - U 0x1E, U 0xE6, U 0xAA, U 0x08, + U 0x1E, U 0xE6, U 0xA3, U 0x08, U 0xD8, U 0x02, U 0x0E, U 0x88, U 0x02, U 0x98, U 0xB0, U 0xC0, U 0xE8, U 0x04, U 0x28, U 0x10, @@ -3086,9 +3094,9 @@ static unsigned char t3fw[30136] = { U 0xC3, U 0x0B, U 0x34, U 0x0B, U 0x96, U 0x45, U 0x98, U 0x47, U 0x99, U 0x46, U 0x18, U 0xE6, - U 0x91, U 0x9F, U 0x41, U 0x04, + U 0x8A, U 0x9F, U 0x41, U 0x04, U 0x59, U 0x11, U 0x0E, U 0x99, - U 0x02, U 0x1F, U 0xE6, U 0x8F, + U 0x02, U 0x1F, U 0xE6, U 0x88, U 0x02, U 0x0E, U 0x47, U 0x08, U 0xD8, U 0x02, U 0x98, U 0x42, U 0x0E, U 0x99, U 0x02, U 0x9F, @@ -3096,15 +3104,15 @@ static unsigned char t3fw[30136] = { U 0x99, U 0x02, U 0x99, U 0x44, U 0x2F, U 0xA0, U 0x0C, U 0xB4, U 0x38, U 0x0C, U 0xF9, U 0x11, - U 0x14, U 0xE6, U 0x7E, U 0x1E, - U 0xE6, U 0x75, U 0xA4, U 0xFF, + U 0x14, U 0xE6, U 0x77, U 0x1E, + U 0xE6, U 0x6E, U 0xA4, U 0xFF, U 0xAE, U 0x99, U 0x2E, U 0x92, U 0x85, U 0x26, U 0xF4, U 0xCF, U 0x0E, U 0x88, U 0x0B, U 0x28, U 0x96, U 0x85, U 0xD1, U 0x0F, U 0x2B, U 0xA0, U 0x0C, U 0x1F, - U 0xE6, U 0x6F, U 0x1C, U 0xE6, - U 0x76, U 0x0C, U 0xBE, U 0x11, + U 0xE6, U 0x68, U 0x1C, U 0xE6, + U 0x6F, U 0x0C, U 0xBE, U 0x11, U 0xAC, U 0xBB, U 0xAF, U 0xEE, U 0x2D, U 0xE2, U 0x85, U 0x26, U 0xB4, U 0xCF, U 0x0D, U 0x3D, @@ -3119,7 +3127,7 @@ static unsigned char t3fw[30136] = { U 0x08, U 0x87, U 0x14, U 0x77, U 0x87, U 0x12, U 0xC0, U 0xB0, U 0xC0, U 0xA6, U 0x19, U 0xE6, - U 0x61, U 0x29, U 0x90, U 0x22, + U 0x5A, U 0x29, U 0x90, U 0x22, U 0xC0, U 0x30, U 0xCC, U 0x97, U 0xC0, U 0x31, U 0x60, U 0x00, U 0x03, U 0xC0, U 0xB0, U 0xC0, @@ -3170,7 +3178,7 @@ static unsigned char t3fw[30136] = { U 0x29, U 0x20, U 0x0C, U 0xD2, U 0xC0, U 0xC0, U 0x80, U 0x0C, U 0x9E, U 0x11, U 0x1B, U 0xE6, - U 0x34, U 0x1F, U 0xE6, U 0x2B, + U 0x2D, U 0x1F, U 0xE6, U 0x24, U 0xAB, U 0x99, U 0xAF, U 0xEE, U 0x2D, U 0xE2, U 0x85, U 0x28, U 0x94, U 0xCF, U 0x0D, U 0xAD, @@ -3214,492 +3222,609 @@ static unsigned char t3fw[30136] = { U 0x64, U 0x9F, U 0xEC, U 0xD1, U 0x0F, U 0xD2, U 0x40, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, - U 0x6C, U 0x10, U 0x08, U 0xD6, - U 0x30, U 0xC0, U 0x70, U 0x95, - U 0x15, U 0xDA, U 0x40, U 0x8E, - U 0x39, U 0x14, U 0xE5, U 0xFE, - U 0x9A, U 0x14, U 0x64, U 0xE0, - U 0x02, U 0x64, U 0x51, U 0xFC, - U 0x29, U 0x20, U 0x06, U 0x2A, - U 0x9C, U 0xF8, U 0x65, U 0xA2, - U 0x5F, U 0x2A, U 0x21, U 0x02, + U 0x6C, U 0x10, U 0x0A, U 0xD6, + U 0x30, U 0x2E, U 0x30, U 0x27, + U 0xD9, U 0x50, U 0xDA, U 0x40, + U 0x15, U 0xE5, U 0xF8, U 0x24, + U 0x30, U 0x26, U 0x9A, U 0x15, + U 0x29, U 0x16, U 0x04, U 0x64, + U 0xE0, U 0x02, U 0x64, U 0x93, + U 0x73, U 0x29, U 0x20, U 0x06, + U 0x2A, U 0x9C, U 0xF8, U 0x65, + U 0xA3, U 0xCE, U 0x2A, U 0x21, + U 0x02, U 0x27, U 0x0A, U 0x04, U 0x0A, U 0x0B, U 0x4C, U 0x65, - U 0xB2, U 0x1F, U 0x2C, U 0x32, - U 0x00, U 0x15, U 0xE5, U 0xF4, + U 0xB3, U 0x97, U 0x8C, U 0x30, U 0x74, U 0xC7, U 0x05, U 0x2D, - U 0x21, U 0x23, U 0x65, U 0xD3, - U 0x24, U 0x2E, U 0x52, U 0x9E, - U 0x1A, U 0xE5, U 0xF0, U 0x6F, - U 0xE8, U 0x02, U 0x60, U 0x02, - U 0x1B, U 0x2A, U 0xA2, U 0x26, - U 0x68, U 0xA0, U 0x08, U 0x2B, - U 0x22, U 0x00, U 0x0A, U 0xBB, - U 0x0C, U 0x65, U 0xB2, U 0x0C, - U 0x2E, U 0x52, U 0x9D, U 0x1D, - U 0xE5, U 0xEB, U 0x64, U 0xE2, - U 0x03, U 0x8B, U 0x38, U 0x64, - U 0xB2, U 0x2D, U 0x9E, U 0x16, - U 0xC8, U 0xBC, U 0x8D, U 0x69, - U 0x1E, U 0xE5, U 0xE8, U 0x64, - U 0xD0, U 0x05, U 0x2E, U 0xE0, - U 0x21, U 0x7B, U 0xEB, U 0x49, - U 0x2E, U 0x20, U 0x0C, U 0x18, - U 0xE5, U 0xE2, U 0x0C, U 0xEF, - U 0x11, U 0xA8, U 0xFF, U 0x29, - U 0xF2, U 0x86, U 0xC1, U 0x86, - U 0x79, U 0x8B, U 0x4A, U 0x17, - U 0xE5, U 0xDF, U 0x07, U 0xE7, - U 0x0A, U 0x27, U 0x72, U 0xA3, - U 0x68, U 0x70, U 0x04, U 0x88, - U 0x20, U 0x77, U 0x89, U 0x39, - U 0x25, U 0xF2, U 0x85, U 0x64, - U 0x52, U 0xA2, U 0x27, U 0x21, - U 0x2E, U 0x07, U 0xB7, U 0x36, - U 0x07, U 0xB9, U 0x0C, U 0x6F, - U 0x9D, U 0x01, U 0xD7, U 0xB0, - U 0x89, U 0x69, U 0x6E, U 0x92, - U 0x42, U 0x28, U 0x20, U 0x3D, - U 0x7B, U 0x87, U 0x3C, U 0x8A, - U 0x15, U 0xCD, U 0xAF, U 0x60, - U 0x00, U 0x18, U 0xC1, U 0xB2, + U 0x21, U 0x23, U 0x65, U 0xD4, + U 0xA0, U 0xC0, U 0xA6, U 0x2B, + U 0x0A, U 0x03, U 0x2C, U 0x22, + U 0x00, U 0x58, U 0x0F, U 0x2A, + U 0x64, U 0xA3, U 0xB9, U 0x17, + U 0xE5, U 0xE6, U 0x8E, U 0x38, + U 0x9A, U 0x16, U 0x64, U 0xE3, + U 0xBA, U 0x2F, U 0x60, U 0x27, + U 0x28, U 0x50, U 0x21, U 0xC9, + U 0xF3, U 0x7E, U 0x83, U 0x11, + U 0xC2, U 0xB0, U 0x8C, U 0x20, + U 0x2A, U 0x20, U 0x0C, U 0x58, + U 0x0F, U 0x49, U 0xD7, U 0xA0, + U 0xCD, U 0xA1, U 0x60, U 0x04, + U 0xA2, U 0x00, U 0xC2, U 0xB0, U 0x8C, U 0x20, U 0x2A, U 0x20, - U 0x0C, U 0x58, U 0x0E, U 0x90, - U 0xD5, U 0xA0, U 0x64, U 0xA2, - U 0xAC, U 0x8B, U 0x68, U 0x63, - U 0xFF, U 0xCB, U 0xC0, U 0x50, - U 0x63, U 0xFF, U 0xC3, U 0xC0, - U 0xE0, U 0x60, U 0x00, U 0x02, - U 0x2E, U 0x60, U 0x03, U 0x0E, - U 0x9B, U 0x0C, U 0x6E, U 0xB2, - U 0x0E, U 0xDC, U 0x70, U 0x0C, - U 0xEA, U 0x11, U 0xAA, U 0x6A, - U 0x2A, U 0xAC, U 0x28, U 0x5B, - U 0xFF, U 0xB6, U 0xD7, U 0xA0, - U 0xDA, U 0x20, U 0xDB, U 0x70, - U 0xC1, U 0xC4, U 0x2D, U 0x21, - U 0x1F, U 0x58, U 0x0E, U 0x38, - U 0x8C, U 0x26, U 0x8B, U 0x27, - U 0xD4, U 0xA0, U 0x0C, U 0xBB, - U 0x0C, U 0x7A, U 0xB3, U 0x25, - U 0x8A, U 0x63, U 0xC0, U 0x90, - U 0x9A, U 0x53, U 0x88, U 0x62, - U 0x99, U 0x58, U 0x98, U 0x52, - U 0x8F, U 0x65, U 0x9F, U 0x59, - U 0x8E, U 0x67, U 0x9E, U 0x5B, - U 0x8D, U 0x66, U 0x97, U 0x55, - U 0x9D, U 0x5A, U 0x8B, U 0x68, - U 0x7B, U 0x7B, U 0x74, U 0x8B, - U 0x15, U 0xCE, U 0xB3, U 0x60, - U 0x00, U 0x0D, U 0xDA, U 0x20, - U 0xDB, U 0x40, U 0x58, U 0x0E, - U 0x02, U 0x65, U 0xA1, U 0x0D, - U 0x63, U 0xFF, U 0xCC, U 0x00, - U 0xDA, U 0x20, U 0xDB, U 0x30, - U 0x8C, U 0x14, U 0x58, U 0x0D, - U 0xAA, U 0xD6, U 0xA0, U 0xC0, - U 0xC0, U 0xC0, U 0xD1, U 0x9D, - U 0x15, U 0x2C, U 0xA4, U 0x03, + U 0x0C, U 0x58, U 0x0F, U 0x1D, + U 0xD7, U 0xA0, U 0x64, U 0xA4, + U 0x86, U 0x2F, U 0x21, U 0x2E, + U 0x8B, U 0x68, U 0x0F, U 0xBF, + U 0x36, U 0x0F, U 0xB9, U 0x0C, + U 0x6F, U 0x9D, U 0x54, U 0x29, + U 0x60, U 0x27, U 0xD5, U 0xB0, + U 0x6E, U 0x92, U 0x05, U 0x28, + U 0x20, U 0x3D, U 0x7B, U 0x8F, + U 0x4C, U 0xDA, U 0x20, U 0xDB, + U 0x50, U 0xC1, U 0xC4, U 0x2D, + U 0x21, U 0x1F, U 0x58, U 0x0E, + U 0xE3, U 0x8B, U 0x26, U 0x9A, + U 0x18, U 0x9A, U 0x19, U 0x89, + U 0x27, U 0x2A, U 0xAC, U 0x38, + U 0x0B, U 0x99, U 0x0C, U 0x7A, + U 0x93, U 0x53, U 0x89, U 0x63, + U 0xC0, U 0x80, U 0x99, U 0x73, + U 0x8F, U 0x62, U 0x98, U 0x78, + U 0x9F, U 0x72, U 0x8E, U 0x65, + U 0x9E, U 0x79, U 0x8D, U 0x67, + U 0x9D, U 0x7B, U 0x8C, U 0x66, + U 0x95, U 0x75, U 0x9C, U 0x7A, + U 0x8E, U 0x68, U 0x7E, U 0x53, + U 0x02, U 0x60, U 0x00, U 0xB1, + U 0x8B, U 0x14, U 0x65, U 0xB0, + U 0x50, U 0x60, U 0x00, U 0x38, + U 0xDB, U 0xF0, U 0x63, U 0xFF, + U 0xA5, U 0x00, U 0x8A, U 0x14, + U 0xC9, U 0xA9, U 0x2E, U 0x60, + U 0x03, U 0x0E, U 0x9B, U 0x0C, + U 0x6E, U 0xB2, U 0xA5, U 0xDC, + U 0x50, U 0x0C, U 0xEA, U 0x11, + U 0xAA, U 0x6A, U 0x2A, U 0xAC, + U 0x28, U 0x5B, U 0xFF, U 0xB1, + U 0xD5, U 0xA0, U 0x63, U 0xFF, + U 0x93, U 0xC0, U 0xE0, U 0x63, + U 0xFF, U 0xE2, U 0xDA, U 0x20, + U 0x8B, U 0x18, U 0x58, U 0x0E, + U 0xA0, U 0x65, U 0xA2, U 0xB1, + U 0x63, U 0xFF, U 0x9E, U 0x00, + U 0x00, U 0xDA, U 0x20, U 0xDB, + U 0x30, U 0x8C, U 0x15, U 0x58, + U 0x0E, U 0x48, U 0xD6, U 0xA0, + U 0xC0, U 0xC0, U 0xC0, U 0xD1, + U 0x2D, U 0x16, U 0x04, U 0x2C, + U 0xA4, U 0x03, U 0xDC, U 0x70, U 0xDA, U 0x20, U 0xDB, U 0x60, - U 0xDF, U 0x70, U 0xDC, U 0x50, - U 0xC0, U 0xE0, U 0x25, U 0x60, - U 0x03, U 0x9E, U 0x10, U 0x1E, - U 0xE5, U 0xC1, U 0x0C, U 0x5D, - U 0x11, U 0xAD, U 0x6D, U 0x2D, - U 0xDC, U 0x28, U 0x5B, U 0xFF, - U 0x3F, U 0x8E, U 0x66, U 0xA5, - U 0xA8, U 0x8F, U 0x67, U 0x28, - U 0x64, U 0x03, U 0xAF, U 0x7F, - U 0x77, U 0xFB, U 0x01, U 0xB1, - U 0xEE, U 0x9E, U 0x66, U 0x9F, - U 0x67, U 0x8D, U 0x26, U 0x8C, - U 0x29, U 0xA4, U 0xDD, U 0x0D, - U 0xCC, U 0x0C, U 0x9D, U 0x26, - U 0x8B, U 0x68, U 0x0C, U 0x0C, - U 0x48, U 0x2C, U 0x25, U 0x25, - U 0x07, U 0xBB, U 0x0C, U 0x9B, - U 0x68, U 0x63, U 0xFE, U 0xC3, - U 0x2C, U 0x20, U 0x66, U 0x89, - U 0x61, U 0xB1, U 0xCC, U 0x0C, - U 0x0C, U 0x47, U 0x2C, U 0x24, - U 0x66, U 0x6E, U 0xC6, U 0x02, - U 0x60, U 0x00, U 0xB8, U 0x09, - U 0xFD, U 0x50, U 0x65, U 0xD0, - U 0xB2, U 0xCB, U 0xBF, U 0x8E, - U 0x69, U 0xCB, U 0xEB, U 0xDB, - U 0x60, U 0xDC, U 0x50, U 0xDF, - U 0x70, U 0xDA, U 0x20, U 0x1E, - U 0xE5, U 0xBC, U 0x2D, U 0x60, + U 0xDF, U 0x50, U 0x2D, U 0x60, + U 0x03, U 0xC0, U 0xE0, U 0x9E, + U 0x10, U 0x9D, U 0x17, U 0x1E, + U 0xE5, U 0xC1, U 0x0C, U 0xDD, + U 0x11, U 0x0D, U 0x6D, U 0x08, + U 0x2D, U 0xDC, U 0x28, U 0x5B, + U 0xFF, U 0x47, U 0x8E, U 0x66, + U 0x8F, U 0x67, U 0x88, U 0x17, + U 0xAF, U 0x5F, U 0xA8, U 0xA8, + U 0x28, U 0x64, U 0x03, U 0x75, + U 0xFB, U 0x01, U 0xB1, U 0xEE, + U 0x8A, U 0x18, U 0x9E, U 0x66, + U 0x9F, U 0x67, U 0x89, U 0x26, + U 0x88, U 0x29, U 0xAA, U 0x99, + U 0x09, U 0x88, U 0x0C, U 0x99, + U 0x26, U 0x8E, U 0x68, U 0x08, + U 0x08, U 0x48, U 0x05, U 0xEE, + U 0x0C, U 0x28, U 0x25, U 0x25, + U 0x15, U 0xE5, U 0x9B, U 0x9E, + U 0x68, U 0x65, U 0xEE, U 0xCC, + U 0x63, U 0xFE, U 0xE6, U 0x00, + U 0x00, U 0x00, U 0xC9, U 0x43, + U 0x2F, U 0x21, U 0x23, U 0x2B, + U 0x21, U 0x21, U 0x2F, U 0xFC, + U 0x01, U 0x0F, U 0x0F, U 0x4F, + U 0x2F, U 0x25, U 0x23, U 0x7F, + U 0xBB, U 0x02, U 0x60, U 0x03, + U 0x14, U 0x2C, U 0x20, U 0x66, + U 0x89, U 0x61, U 0xB1, U 0xCC, + U 0x0C, U 0x0C, U 0x47, U 0x2C, + U 0x24, U 0x66, U 0x6E, U 0xC6, + U 0x02, U 0x60, U 0x02, U 0x28, + U 0x09, U 0xFD, U 0x50, U 0x65, + U 0xD2, U 0x22, U 0x64, U 0xE1, + U 0xB6, U 0x2E, U 0x60, U 0x27, + U 0x64, U 0xE1, U 0xB0, U 0xDC, + U 0x70, U 0xDF, U 0x50, U 0xDA, + U 0x20, U 0xDB, U 0x60, U 0x1E, + U 0xE5, U 0xB2, U 0x2D, U 0x60, U 0x03, U 0xC0, U 0x80, U 0x98, U 0x10, U 0x0C, U 0xDD, U 0x11, U 0xAD, U 0x6D, U 0x2D, U 0xDC, - U 0x28, U 0x5B, U 0xFF, U 0x24, - U 0x8B, U 0x15, U 0xC9, U 0x42, - U 0x8A, U 0x26, U 0x29, U 0x22, - U 0x09, U 0x04, U 0xAA, U 0x08, - U 0x2A, U 0x26, U 0x06, U 0x0A, - U 0x99, U 0x0C, U 0x09, U 0x09, - U 0x48, U 0x29, U 0x25, U 0x25, - U 0x65, U 0xB1, U 0x3C, U 0xC0, - U 0x20, U 0xD1, U 0x0F, U 0x00, + U 0x28, U 0x5B, U 0xFF, U 0x22, + U 0x64, U 0x41, U 0x81, U 0xC0, + U 0x44, U 0x2B, U 0x0A, U 0x00, + U 0x8C, U 0x20, U 0x2A, U 0x20, + U 0x0C, U 0x58, U 0x0E, U 0xBF, + U 0x0A, U 0xA7, U 0x02, U 0x65, + U 0xA0, U 0x0F, U 0xC0, U 0xB0, + U 0x2C, U 0x22, U 0x00, U 0x2A, + U 0x20, U 0x0C, U 0x58, U 0x0E, + U 0xBB, U 0xD7, U 0xA0, U 0x64, + U 0xAF, U 0xEF, U 0xDA, U 0x20, + U 0xC1, U 0xBC, U 0xC1, U 0xC8, + U 0x2D, U 0x21, U 0x20, U 0x8F, + U 0x18, U 0x8E, U 0x26, U 0x89, + U 0x29, U 0xAF, U 0xEE, U 0x9E, + U 0x26, U 0x0E, U 0x99, U 0x0C, + U 0x09, U 0x09, U 0x48, U 0x29, + U 0x25, U 0x25, U 0x58, U 0x0E, + U 0x83, U 0xC0, U 0x90, U 0xC0, + U 0x50, U 0xC0, U 0xC2, U 0x88, + U 0x60, U 0x9A, U 0x19, U 0x1E, + U 0xE5, U 0x6E, U 0xC0, U 0xA1, + U 0x2E, U 0xE0, U 0x22, U 0x08, + U 0x8F, U 0x14, U 0x77, U 0x87, + U 0x04, U 0xC0, U 0x81, U 0x0E, + U 0x89, U 0x38, U 0xC0, U 0x80, + U 0x0B, U 0x93, U 0x10, U 0x2D, + U 0x20, U 0x3C, U 0x29, U 0x21, + U 0x20, U 0x0C, U 0xDC, U 0x01, + U 0x04, U 0xDB, U 0x01, U 0x09, + U 0x29, U 0x14, U 0x0B, U 0xA8, + U 0x38, U 0x0C, U 0xA5, U 0x38, + U 0x0D, U 0x3D, U 0x40, U 0x1C, + U 0xE5, U 0x85, U 0x8B, U 0x2B, + U 0x08, U 0x88, U 0x10, U 0x07, + U 0x55, U 0x10, U 0x08, U 0x55, + U 0x02, U 0x05, U 0x33, U 0x02, + U 0x28, U 0x21, U 0x25, U 0x0F, + U 0x15, U 0x40, U 0x03, U 0xBB, + U 0x02, U 0x0C, U 0xBB, U 0x02, + U 0x07, U 0x55, U 0x10, U 0x05, + U 0xD3, U 0x10, U 0x08, U 0x28, + U 0x14, U 0x0A, U 0xDD, U 0x11, + U 0x04, U 0x88, U 0x11, U 0x09, + U 0x88, U 0x02, U 0x05, U 0x33, + U 0x02, U 0x29, U 0x21, U 0x04, + U 0x08, U 0x33, U 0x02, U 0x9B, + U 0x70, U 0xC0, U 0x80, U 0x8A, + U 0x20, U 0x1B, U 0xE5, U 0x7E, + U 0x08, U 0xAA, U 0x11, U 0x0B, + U 0xAA, U 0x02, U 0x9A, U 0x71, + U 0xC0, U 0xA1, U 0x85, U 0x2A, + U 0x93, U 0x76, U 0x95, U 0x74, + U 0x08, U 0x93, U 0x11, U 0x03, + U 0xDD, U 0x02, U 0x0A, U 0xDD, + U 0x02, U 0x9D, U 0x77, U 0x8C, + U 0x63, U 0xC1, U 0xDC, U 0x9C, + U 0x73, U 0x8B, U 0x62, U 0x98, + U 0x78, U 0x9A, U 0x79, U 0x9B, + U 0x72, U 0x23, U 0x22, U 0x14, + U 0xC0, U 0xC0, U 0xB1, U 0x35, + U 0x25, U 0x26, U 0x14, U 0x9C, + U 0x7B, U 0x9D, U 0x75, U 0x93, + U 0x7A, U 0x2B, U 0x62, U 0x1A, + U 0x9B, U 0x7C, U 0x2A, U 0x62, + U 0x1C, U 0x9A, U 0x7D, U 0x28, + U 0x62, U 0x1D, U 0x98, U 0x7E, + U 0x25, U 0x62, U 0x1B, U 0x95, + U 0x7F, U 0x23, U 0x62, U 0x17, + U 0x23, U 0x76, U 0x10, U 0x2D, + U 0x62, U 0x18, U 0x2D, U 0x76, + U 0x11, U 0x2C, U 0x62, U 0x19, + U 0x2C, U 0x76, U 0x12, U 0x64, + U 0xE0, U 0xB9, U 0x8E, U 0x60, + U 0x77, U 0xE7, U 0x3D, U 0xC0, + U 0xFE, U 0x13, U 0xE5, U 0x46, + U 0x1D, U 0xE5, U 0x47, U 0xC1, + U 0x81, U 0x8A, U 0x62, U 0x8B, + U 0x63, U 0x04, U 0x95, U 0x11, + U 0x0E, U 0x9C, U 0x40, U 0x06, + U 0xCC, U 0x11, U 0x0C, U 0x55, + U 0x02, U 0x24, U 0x76, U 0x15, + U 0x08, U 0x55, U 0x02, U 0xC0, + U 0x80, U 0x2D, U 0x76, U 0x14, + U 0x8D, U 0x2B, U 0x2B, U 0x76, + U 0x1B, U 0x2A, U 0x76, U 0x1A, + U 0x28, U 0x76, U 0x19, U 0x25, + U 0x76, U 0x18, U 0x03, U 0xDD, + U 0x02, U 0x2D, U 0x76, U 0x16, + U 0x60, U 0x00, U 0x03, U 0x00, + U 0x00, U 0xC0, U 0xFA, U 0x2E, + U 0x20, U 0x0C, U 0x19, U 0xE5, + U 0x2D, U 0x18, U 0xE5, U 0x24, + U 0xA9, U 0xE9, U 0x0C, U 0xEE, + U 0x11, U 0xA8, U 0xEE, U 0xC0, + U 0x80, U 0x2D, U 0xE2, U 0x85, + U 0x28, U 0x94, U 0xCF, U 0x0D, + U 0xFD, U 0x0B, U 0x2D, U 0xE6, + U 0x85, U 0xDA, U 0x20, U 0x8B, + U 0x19, U 0x8C, U 0x15, U 0x8D, + U 0x14, U 0x58, U 0x0D, U 0x84, + U 0xD2, U 0xA0, U 0xD1, U 0x0F, + U 0xDC, U 0x70, U 0xDF, U 0x50, U 0xDB, U 0x60, U 0x2D, U 0x6C, - U 0x28, U 0xDF, U 0x70, U 0xDA, - U 0x20, U 0xC0, U 0xC0, U 0x1E, - U 0xE5, U 0xAC, U 0x9C, U 0x10, - U 0xDC, U 0x50, U 0x5B, U 0xFE, - U 0xB4, U 0x63, U 0xFF, U 0xC7, - U 0x00, U 0x2D, U 0x20, U 0x3D, - U 0x0D, U 0x4D, U 0x40, U 0x65, - U 0xDD, U 0xF9, U 0x6F, U 0xE5, - U 0x22, U 0xDA, U 0x30, U 0x8F, - U 0x45, U 0x6D, U 0xE9, U 0x0C, + U 0x28, U 0xC0, U 0xA0, U 0x1E, + U 0xE5, U 0x45, U 0x9A, U 0x10, + U 0xDA, U 0x20, U 0x5B, U 0xFE, + U 0x55, U 0x63, U 0xFE, U 0x53, + U 0x00, U 0x2B, U 0x20, U 0x3D, + U 0x0B, U 0x4B, U 0x40, U 0x65, + U 0xBC, U 0x82, U 0x6F, U 0xE5, + U 0x27, U 0xDA, U 0x30, U 0x8F, + U 0x55, U 0x6D, U 0xE9, U 0x0C, U 0x8E, U 0xAA, U 0x0E, U 0x8E, - U 0x14, U 0xC9, U 0xE3, U 0x7E, - U 0xF3, U 0x11, U 0x2A, U 0xAC, + U 0x14, U 0xC9, U 0xE8, U 0x7E, + U 0xF3, U 0x16, U 0x2A, U 0xAC, U 0x10, U 0xC0, U 0x90, U 0x29, U 0x24, U 0x67, U 0x09, U 0x0F, - U 0x47, U 0x64, U 0xFD, U 0xD7, - U 0x60, U 0x01, U 0x41, U 0x00, - U 0xC0, U 0x91, U 0x63, U 0xFF, - U 0xED, U 0x00, U 0x88, U 0x15, - U 0x65, U 0x81, U 0x4C, U 0xDA, + U 0x47, U 0x64, U 0xFC, U 0x60, + U 0x60, U 0x01, U 0x5F, U 0x00, + U 0xC0, U 0xFA, U 0x63, U 0xFF, + U 0x85, U 0xC0, U 0x91, U 0x63, + U 0xFF, U 0xE8, U 0x88, U 0x14, + U 0x65, U 0x81, U 0x68, U 0xDA, U 0x20, U 0xDB, U 0x60, U 0x8C, - U 0x14, U 0x58, U 0x0D, U 0x66, + U 0x15, U 0x58, U 0x0D, U 0x9B, U 0xC0, U 0x20, U 0xC0, U 0x90, U 0x29, U 0xA4, U 0x03, U 0xD1, - U 0x0F, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x0D, U 0xF4, - U 0x63, U 0xFF, U 0xDE, U 0x00, - U 0x8A, U 0x16, U 0x2B, U 0x21, - U 0x04, U 0x58, U 0x0C, U 0x8C, - U 0xC0, U 0xA0, U 0x2A, U 0x24, - U 0x66, U 0x8B, U 0x68, U 0x63, - U 0xFF, U 0x3A, U 0x00, U 0x00, + U 0x0F, U 0x8A, U 0x16, U 0x2B, + U 0x21, U 0x04, U 0x58, U 0x0C, + U 0xC2, U 0xC0, U 0xA0, U 0x2A, + U 0x24, U 0x66, U 0x8E, U 0x68, + U 0x63, U 0xFD, U 0xCA, U 0x00, U 0x00, U 0x2B, U 0x9C, U 0xF9, - U 0x65, U 0xB0, U 0xC5, U 0xDA, - U 0x20, U 0x58, U 0x0C, U 0x91, - U 0x63, U 0xFD, U 0x91, U 0x00, + U 0x65, U 0xB0, U 0xFD, U 0xDA, + U 0x20, U 0x58, U 0x0C, U 0xC7, + U 0x63, U 0xFC, U 0x22, U 0x00, + U 0x00, U 0xDA, U 0x20, U 0xC0, + U 0xB6, U 0x58, U 0x0E, U 0x20, + U 0x63, U 0xFF, U 0xBA, U 0x00, U 0x2B, U 0x20, U 0x0C, U 0x0C, - U 0xBA, U 0x11, U 0xA5, U 0xAA, - U 0x2F, U 0xA2, U 0x86, U 0xC1, - U 0xC2, U 0x7F, U 0xC3, U 0x02, - U 0x60, U 0x00, U 0xFC, U 0x0D, - U 0xB9, U 0x0A, U 0x29, U 0x92, - U 0xA3, U 0x68, U 0x90, U 0x07, - U 0x8C, U 0x20, U 0x09, U 0xCC, - U 0x0C, U 0x65, U 0xC0, U 0xEB, - U 0x26, U 0xA2, U 0x85, U 0x64, - U 0x60, U 0xE5, U 0x2C, U 0x20, + U 0xBE, U 0x11, U 0xA7, U 0xEE, + U 0x2D, U 0xE2, U 0x86, U 0xC1, + U 0xC2, U 0x7D, U 0xC3, U 0x02, + U 0x60, U 0x01, U 0x18, U 0x19, + U 0xE4, U 0xF1, U 0x09, U 0xB9, + U 0x0A, U 0x29, U 0x92, U 0xA3, + U 0x68, U 0x90, U 0x08, U 0x2A, + U 0x22, U 0x00, U 0x09, U 0xAA, + U 0x0C, U 0x65, U 0xA1, U 0x03, + U 0x26, U 0xE2, U 0x85, U 0x64, + U 0x60, U 0xFD, U 0x2C, U 0x20, U 0x66, U 0x89, U 0x31, U 0xB1, U 0xCC, U 0x0C, U 0x0C, U 0x47, U 0x2C, U 0x24, U 0x66, U 0x6F, U 0xC6, U 0x02, U 0x70, U 0x96, - U 0x0A, U 0xDA, U 0xE0, U 0x2B, + U 0x0C, U 0x8A, U 0x16, U 0x2B, U 0x21, U 0x04, U 0x58, U 0x0C, - U 0x74, U 0x27, U 0x24, U 0x66, - U 0x89, U 0x30, U 0x77, U 0x97, - U 0x4B, U 0x18, U 0xE5, U 0x59, - U 0x1D, U 0xE5, U 0x5A, U 0x8A, - U 0x32, U 0x8B, U 0x33, U 0xC0, - U 0xF4, U 0x2C, U 0x21, U 0x04, - U 0x09, U 0x9E, U 0x40, U 0x06, - U 0xEE, U 0x11, U 0x04, U 0xCC, - U 0x11, U 0x0E, U 0xCC, U 0x02, - U 0x9F, U 0x61, U 0xC1, U 0xE0, - U 0x0E, U 0xCC, U 0x02, U 0x9D, - U 0x60, U 0x8F, U 0x2B, U 0x9A, - U 0x66, U 0x9B, U 0x67, U 0x9C, - U 0x64, U 0x97, U 0x65, U 0x08, - U 0xFF, U 0x02, U 0x9F, U 0x62, - U 0x2F, U 0x20, U 0x0C, U 0x18, - U 0xE5, U 0x43, U 0x0C, U 0xFE, - U 0x11, U 0xA5, U 0xEE, U 0x2D, - U 0xE2, U 0x85, U 0xA8, U 0xFF, - U 0x27, U 0xF4, U 0xCF, U 0x2D, - U 0xDC, U 0x20, U 0x2D, U 0xE6, - U 0x85, U 0x8F, U 0x15, U 0x65, - U 0xF0, U 0x91, U 0xC0, U 0x20, - U 0xD1, U 0x0F, U 0x00, U 0x00, - U 0x2A, U 0x2C, U 0x74, U 0x8B, - U 0x14, U 0x58, U 0x06, U 0x43, - U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x00, U 0xDA, U 0x20, U 0xDB, - U 0xE0, U 0x58, U 0x0D, U 0xBC, - U 0x63, U 0xFE, U 0xFE, U 0x00, - U 0x00, U 0xDA, U 0x20, U 0xDB, - U 0x30, U 0x8C, U 0x14, U 0x8D, - U 0x15, U 0x58, U 0x0E, U 0x3E, - U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x00, U 0x00, U 0x88, U 0x15, - U 0xC8, U 0x88, U 0xDA, U 0x20, + U 0xA6, U 0xC0, U 0xD0, U 0x2D, + U 0x24, U 0x66, U 0x8E, U 0x30, + U 0x77, U 0xE7, U 0x4D, U 0x1C, + U 0xE4, U 0xF1, U 0x1B, U 0xE4, + U 0xF1, U 0x8F, U 0x32, U 0x88, + U 0x33, U 0xC0, U 0xA4, U 0x2D, + U 0x21, U 0x04, U 0x0E, U 0x99, + U 0x40, U 0x06, U 0x99, U 0x11, + U 0x04, U 0xDD, U 0x11, U 0x09, + U 0xDD, U 0x02, U 0x9A, U 0x61, + U 0xC1, U 0x90, U 0x09, U 0xDD, + U 0x02, U 0x9B, U 0x60, U 0xC0, + U 0x90, U 0x8B, U 0x2B, U 0x9D, + U 0x64, U 0x9F, U 0x66, U 0x98, + U 0x67, U 0x99, U 0x65, U 0x0C, + U 0xBB, U 0x02, U 0x9B, U 0x62, + U 0x28, U 0x20, U 0x0C, U 0x1A, + U 0xE4, U 0xDA, U 0xAA, U 0x8A, + U 0x0C, U 0x88, U 0x11, U 0xA7, + U 0x88, U 0x2F, U 0x82, U 0x85, + U 0x29, U 0xA4, U 0xCF, U 0x2F, + U 0xFC, U 0x20, U 0x2F, U 0x86, + U 0x85, U 0x8A, U 0x14, U 0x65, + U 0xA0, U 0xA6, U 0xC0, U 0x20, + U 0xD1, U 0x0F, U 0xB0, U 0xFC, + U 0x8B, U 0x14, U 0x2C, U 0x25, + U 0x23, U 0xC8, U 0xB7, U 0x02, + U 0x2A, U 0x02, U 0x06, U 0x6B, + U 0x02, U 0x58, U 0x0C, U 0xD7, + U 0x2A, U 0x21, U 0x02, U 0x65, + U 0xAE, U 0xF7, U 0xC0, U 0xD8, + U 0x0D, U 0xAD, U 0x02, U 0x2D, + U 0x25, U 0x02, U 0x63, U 0xFE, + U 0xEC, U 0x00, U 0x8E, U 0x14, + U 0xC8, U 0xE8, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0x58, U 0x0C, - U 0x9C, U 0x2A, U 0x21, U 0x02, - U 0x65, U 0xAE, U 0xDA, U 0xC0, - U 0x94, U 0x09, U 0xA9, U 0x02, - U 0x29, U 0x25, U 0x02, U 0x63, - U 0xFE, U 0xCF, U 0xDA, U 0x20, - U 0x2B, U 0x20, U 0x0C, U 0x58, - U 0x0D, U 0xC7, U 0x63, U 0xFE, - U 0xC4, U 0x27, U 0x24, U 0x68, - U 0xDA, U 0x20, U 0xDB, U 0x30, - U 0x2C, U 0x12, U 0x04, U 0x2D, - U 0x12, U 0x05, U 0x2E, U 0x0A, - U 0x80, U 0x58, U 0x0C, U 0xA1, - U 0x63, U 0xFC, U 0x7C, U 0x00, + U 0xD0, U 0x2A, U 0x21, U 0x02, + U 0x65, U 0xAE, U 0xDA, U 0x07, + U 0xAF, U 0x02, U 0x2F, U 0x25, + U 0x02, U 0x63, U 0xFE, U 0xD1, + U 0x00, U 0xDA, U 0x20, U 0xDB, + U 0x30, U 0x8C, U 0x15, U 0x8D, + U 0x14, U 0x58, U 0x0E, U 0x74, + U 0xD2, U 0xA0, U 0xD1, U 0x0F, + U 0xDA, U 0x20, U 0x2B, U 0x20, + U 0x0C, U 0x58, U 0x0D, U 0xDF, + U 0x63, U 0xFE, U 0xB6, U 0x00, + U 0xDA, U 0x20, U 0x2B, U 0x20, + U 0x0C, U 0x58, U 0x0E, U 0x01, + U 0x63, U 0xFE, U 0xAA, U 0xDA, + U 0x20, U 0xDB, U 0x30, U 0x8C, + U 0x15, U 0x2D, U 0x12, U 0x04, + U 0x2E, U 0x0A, U 0x80, U 0x28, + U 0x0A, U 0x00, U 0x28, U 0x24, + U 0x68, U 0x58, U 0x0C, U 0xCF, + U 0x63, U 0xFA, U 0xE5, U 0x00, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0x58, U 0x0D, - U 0xA5, U 0x8A, U 0x15, U 0xCD, - U 0xA1, U 0xDA, U 0x20, U 0x03, - U 0x3B, U 0x02, U 0x2C, U 0x12, - U 0x04, U 0x58, U 0x0D, U 0x0F, - U 0x27, U 0xA4, U 0x03, U 0xC0, - U 0x20, U 0xD1, U 0x0F, U 0x00, - U 0xC0, U 0x20, U 0xD1, U 0x0F, - U 0x2A, U 0x2C, U 0x74, U 0x8B, - U 0x14, U 0x58, U 0x06, U 0x20, - U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x6C, U 0x10, U 0x0C, U 0x28, - U 0x21, U 0x02, U 0x94, U 0x10, - U 0x08, U 0x08, U 0x4C, U 0x65, - U 0x83, U 0x62, U 0x1F, U 0xE5, - U 0x09, U 0x29, U 0xF2, U 0x9E, - U 0x6F, U 0x98, U 0x02, U 0x60, - U 0x03, U 0x66, U 0x1D, U 0xE5, - U 0x05, U 0x29, U 0xD2, U 0x26, - U 0x68, U 0x90, U 0x08, U 0x2A, - U 0x22, U 0x00, U 0x09, U 0xAA, - U 0x0C, U 0x65, U 0xA3, U 0x54, - U 0x2C, U 0xF2, U 0x9D, U 0x64, - U 0xC3, U 0x4E, U 0x2B, U 0x20, - U 0x0C, U 0x0C, U 0xB6, U 0x11, - U 0xAF, U 0x66, U 0x28, U 0x62, - U 0x86, U 0xC1, U 0xEC, U 0x78, - U 0xE3, U 0x02, U 0x60, U 0x03, - U 0x46, U 0x19, U 0xE4, U 0xFC, - U 0x09, U 0xB9, U 0x0A, U 0x29, - U 0x92, U 0xA3, U 0x68, U 0x90, - U 0x07, U 0x8A, U 0x20, U 0x09, + U 0xD3, U 0x89, U 0x14, U 0xCD, + U 0x92, U 0xDA, U 0x20, U 0xDB, + U 0x30, U 0x8C, U 0x15, U 0x58, + U 0x0D, U 0x3E, U 0xDB, U 0xA0, + U 0xC0, U 0x20, U 0xC0, U 0xA0, + U 0x2A, U 0xB4, U 0x03, U 0xD1, + U 0x0F, U 0xC0, U 0x20, U 0xD1, + U 0x0F, U 0x2A, U 0x2C, U 0x74, + U 0x8B, U 0x15, U 0x58, U 0x06, + U 0x47, U 0xD2, U 0xA0, U 0xD1, + U 0x0F, U 0x00, U 0x00, U 0x00, + U 0x6C, U 0x10, U 0x0E, U 0x28, + U 0x21, U 0x02, U 0x24, U 0x16, + U 0x01, U 0x08, U 0x08, U 0x4C, + U 0x65, U 0x83, U 0x95, U 0x1F, + U 0xE4, U 0x9A, U 0x29, U 0xF2, + U 0x9E, U 0x6F, U 0x98, U 0x02, + U 0x60, U 0x03, U 0x99, U 0x1E, + U 0xE4, U 0x96, U 0x29, U 0xE2, + U 0x26, U 0x68, U 0x90, U 0x08, + U 0x2A, U 0x22, U 0x00, U 0x09, U 0xAA, U 0x0C, U 0x65, U 0xA3, - U 0x32, U 0x24, U 0x62, U 0x85, - U 0x64, U 0x43, U 0x2C, U 0xC0, - U 0xE1, U 0x2A, U 0x31, U 0x09, - U 0xC0, U 0x70, U 0x27, U 0x24, - U 0x66, U 0x89, U 0x35, U 0x9A, - U 0x11, U 0x99, U 0x2A, U 0x88, - U 0x36, U 0x99, U 0x12, U 0x98, - U 0x2B, U 0x89, U 0x37, U 0x98, - U 0x13, U 0x99, U 0x2C, U 0x88, - U 0x38, U 0x99, U 0x14, U 0x08, - U 0x58, U 0x14, U 0x98, U 0x15, - U 0x98, U 0x2D, U 0x89, U 0x39, - U 0x2A, U 0x25, U 0x04, U 0x2E, - U 0x25, U 0x1D, U 0x29, U 0x25, - U 0x1C, U 0x28, U 0x30, U 0x28, - U 0xC0, U 0x92, U 0x28, U 0x24, - U 0x3C, U 0x2A, U 0x30, U 0x29, - U 0x08, U 0x08, U 0x47, U 0x98, - U 0x16, U 0x09, U 0x89, U 0x01, - U 0x2A, U 0x24, U 0x3D, U 0x2A, - U 0x31, U 0x15, U 0x99, U 0x17, - U 0x0A, U 0x09, U 0x41, U 0x09, - U 0xA9, U 0x0C, U 0x29, U 0x9C, - U 0xEC, U 0x29, U 0x25, U 0x1F, - U 0x7E, U 0x87, U 0x19, U 0x2D, - U 0x2A, U 0x00, U 0x0D, U 0xA0, - U 0x60, U 0x00, U 0x08, U 0x3E, - U 0x01, U 0x0A, U 0x3E, U 0xB1, - U 0xAD, U 0x08, U 0xDA, U 0x39, - U 0x0E, U 0xAA, U 0x11, U 0x0A, - U 0x99, U 0x0C, U 0x29, U 0x25, - U 0x1F, U 0x2A, U 0x21, U 0x1F, - U 0x18, U 0xE5, U 0x06, U 0x0A, - U 0x81, U 0x60, U 0xC1, U 0xD0, - U 0x94, U 0x1A, U 0x95, U 0x1B, - U 0x01, U 0x08, U 0x3E, U 0x00, - U 0x05, U 0x3E, U 0xB1, U 0x84, - U 0x05, U 0x48, U 0x39, U 0x84, - U 0x3C, U 0x25, U 0x9C, U 0xFC, - U 0x0D, U 0x88, U 0x36, U 0x29, - U 0x20, U 0x14, U 0x08, U 0xAA, - U 0x1C, U 0x8D, U 0x3D, U 0x27, - U 0x26, U 0x18, U 0x2E, U 0x26, - U 0x13, U 0x2E, U 0x26, U 0x14, - U 0x2E, U 0x26, U 0x15, U 0x27, - U 0x26, U 0x1B, U 0x2E, U 0x24, - U 0x6B, U 0x27, U 0x24, U 0x67, - U 0x27, U 0x24, U 0x68, U 0x08, - U 0x58, U 0x1C, U 0x09, U 0x09, - U 0x43, U 0x29, U 0x24, U 0x14, - U 0x29, U 0x32, U 0x11, U 0x2A, - U 0x25, U 0x2E, U 0x28, U 0x25, - U 0x2F, U 0x27, U 0x25, U 0x24, - U 0x27, U 0x25, U 0x25, U 0x27, - U 0x25, U 0x2C, U 0x27, U 0x25, - U 0x23, U 0x25, U 0x25, U 0x20, - U 0x24, U 0x25, U 0x21, U 0x2D, - U 0x25, U 0x22, U 0x84, U 0x1A, - U 0x2D, U 0x21, U 0x1C, U 0x85, - U 0x1B, U 0x6F, U 0xD2, U 0x02, - U 0x60, U 0x02, U 0x09, U 0xC0, - U 0xA0, U 0x99, U 0x18, U 0x6D, + U 0x87, U 0x24, U 0xF2, U 0x9D, + U 0x64, U 0x43, U 0x81, U 0x2A, + U 0x31, U 0x16, U 0x0A, U 0x4B, + U 0x41, U 0x2B, U 0x24, U 0x0B, + U 0xB4, U 0xBB, U 0x0B, U 0x0B, + U 0x47, U 0x2B, U 0x24, U 0x0C, + U 0x0C, U 0xB6, U 0x11, U 0xAF, + U 0x66, U 0x28, U 0x62, U 0x86, + U 0xC1, U 0xCC, U 0x78, U 0xC3, + U 0x02, U 0x60, U 0x03, U 0x6B, + U 0x19, U 0xE4, U 0x8A, U 0x09, + U 0xB9, U 0x0A, U 0x29, U 0x92, + U 0xA3, U 0x68, U 0x90, U 0x07, + U 0x8C, U 0x20, U 0x09, U 0xCC, + U 0x0C, U 0x65, U 0xC3, U 0x57, + U 0x27, U 0x62, U 0x85, U 0x64, + U 0x73, U 0x51, U 0x29, U 0x31, + U 0x09, U 0xC0, U 0xD0, U 0x2D, + U 0x24, U 0x66, U 0x8C, U 0x35, + U 0x99, U 0x13, U 0x9C, U 0x2A, + U 0x88, U 0x36, U 0x9C, U 0x14, + U 0x98, U 0x2B, U 0x8E, U 0x37, + U 0x98, U 0x15, U 0x9E, U 0x16, + U 0x9E, U 0x2C, U 0x8C, U 0x38, + U 0xC0, U 0xE1, U 0x0C, U 0x5C, + U 0x14, U 0x9C, U 0x17, U 0x9C, + U 0x2D, U 0x88, U 0x39, U 0x29, + U 0x25, U 0x04, U 0x2E, U 0x25, + U 0x1D, U 0x28, U 0x25, U 0x1C, + U 0x2C, U 0x30, U 0x28, U 0xC0, + U 0x82, U 0x2C, U 0x24, U 0x3C, + U 0x29, U 0x30, U 0x29, U 0x0C, + U 0x0C, U 0x47, U 0x08, U 0xC8, + U 0x01, U 0x29, U 0x24, U 0x3D, + U 0x29, U 0x31, U 0x15, U 0x98, + U 0x18, U 0x99, U 0x12, U 0x09, + U 0x08, U 0x41, U 0x08, U 0x99, + U 0x0C, U 0x29, U 0x9C, U 0xEC, + U 0x29, U 0x25, U 0x1F, U 0x7E, + U 0xC7, U 0x25, U 0x92, U 0x1C, + U 0x82, U 0x12, U 0x28, U 0x2A, + U 0x00, U 0x08, U 0x20, U 0x60, + U 0x99, U 0x1B, U 0x01, U 0x02, + U 0x3E, U 0x00, U 0x09, U 0x3E, + U 0xB1, U 0x28, U 0x09, U 0x82, + U 0x39, U 0x89, U 0x1B, U 0x0E, + U 0x22, U 0x11, U 0x02, U 0x99, + U 0x0C, U 0x82, U 0x1C, U 0x29, + U 0x25, U 0x1F, U 0x82, U 0x1C, + U 0x94, U 0x1D, U 0x95, U 0x1E, + U 0x24, U 0x21, U 0x1F, U 0x15, + U 0xE4, U 0x8F, U 0x04, U 0x51, + U 0x60, U 0x9A, U 0x10, U 0xC1, + U 0x80, U 0x2B, U 0x16, U 0x10, + U 0x25, U 0x20, U 0x14, U 0x96, + U 0x1F, U 0x05, U 0x05, U 0x43, + U 0x01, U 0x06, U 0x3E, U 0x00, + U 0x0D, U 0x3E, U 0xB1, U 0x6B, + U 0x0D, U 0xB6, U 0x39, U 0x8B, + U 0x3C, U 0x2D, U 0x9C, U 0xFC, + U 0x08, U 0x66, U 0x36, U 0x06, + U 0x44, U 0x1C, U 0x89, U 0x3D, + U 0x2E, U 0x26, U 0x13, U 0x2E, + U 0x26, U 0x14, U 0x2E, U 0x26, + U 0x15, U 0x2E, U 0x24, U 0x6B, + U 0x25, U 0x24, U 0x14, U 0x06, + U 0xD6, U 0x1C, U 0xC0, U 0x50, + U 0x25, U 0x26, U 0x18, U 0x25, + U 0x26, U 0x1B, U 0x25, U 0x24, + U 0x67, U 0x25, U 0x24, U 0x68, + U 0x28, U 0x32, U 0x11, U 0x25, + U 0x25, U 0x23, U 0x25, U 0x25, + U 0x24, U 0x25, U 0x25, U 0x25, + U 0x25, U 0x25, U 0x2C, U 0x29, + U 0x25, U 0x22, U 0x2D, U 0x25, + U 0x20, U 0x2B, U 0x25, U 0x21, + U 0x24, U 0x25, U 0x2E, U 0x26, + U 0x25, U 0x2F, U 0x14, U 0xE4, + U 0x76, U 0x16, U 0xE4, U 0x74, + U 0x1B, U 0xE4, U 0x5A, U 0x98, + U 0x19, U 0x2D, U 0x21, U 0x1C, + U 0xC0, U 0x84, U 0x98, U 0x71, + U 0x9B, U 0x70, U 0x89, U 0x20, + U 0x95, U 0x75, U 0x95, U 0x77, + U 0x95, U 0x7F, U 0x96, U 0x7C, + U 0x96, U 0x7E, U 0x98, U 0x79, + U 0x9B, U 0x78, U 0x94, U 0x73, + U 0x1B, U 0xE4, U 0x6E, U 0x14, + U 0xE4, U 0x6F, U 0x0C, U 0x38, + U 0x40, U 0x02, U 0x88, U 0x10, + U 0x0C, U 0x06, U 0x40, U 0x15, + U 0xE4, U 0x6B, U 0x01, U 0x66, + U 0x10, U 0x94, U 0x7D, U 0x9B, + U 0x74, U 0x84, U 0x1D, U 0x1B, + U 0xE4, U 0x4C, U 0x08, U 0x66, + U 0x02, U 0x95, U 0x7B, U 0x18, + U 0xE4, U 0x39, U 0x85, U 0x1E, + U 0x0B, U 0x99, U 0x02, U 0x99, + U 0x72, U 0x99, U 0x7A, U 0x08, + U 0x66, U 0x02, U 0x2B, U 0x12, + U 0x10, U 0x96, U 0x76, U 0x86, + U 0x1F, U 0x6F, U 0xD2, U 0x02, + U 0x60, U 0x01, U 0xC0, U 0xC0, + U 0xA0, U 0x99, U 0x1A, U 0x6D, U 0x08, U 0x0A, U 0xB1, U 0xAA, U 0x00, U 0xA1, U 0x04, U 0x00, - U 0xE9, U 0x1A, U 0x7D, U 0x9B, + U 0xE8, U 0x1A, U 0x7D, U 0x8B, U 0x02, U 0x63, U 0xFF, U 0xEE, - U 0x89, U 0x18, U 0xC0, U 0x80, - U 0xC0, U 0xE1, U 0xC0, U 0x70, - U 0xC0, U 0xD2, U 0x9B, U 0x1D, - U 0x95, U 0x1B, U 0x96, U 0x1C, - U 0x9C, U 0x1E, U 0x16, U 0xE4, - U 0xD1, U 0x2C, U 0x20, U 0x3D, - U 0x15, U 0xE4, U 0xE0, U 0x0C, - U 0x0B, U 0x40, U 0x0D, U 0xCC, - U 0x01, U 0x0B, U 0xE7, U 0x38, - U 0x1D, U 0xE4, U 0xC3, U 0x0A, - U 0x77, U 0x10, U 0x0C, U 0xE8, - U 0x38, U 0x0B, U 0x88, U 0x10, - U 0xC0, U 0xC4, U 0x9C, U 0x41, - U 0x08, U 0x77, U 0x02, U 0x9D, - U 0x40, U 0xB0, U 0xA8, U 0x09, - U 0x88, U 0x11, U 0x8B, U 0x20, - U 0x9C, U 0x49, U 0x9D, U 0x48, - U 0x95, U 0x4B, U 0x96, U 0x43, - U 0x08, U 0x77, U 0x02, U 0x86, - U 0x14, U 0x18, U 0xE4, U 0xD1, - U 0x15, U 0xE4, U 0xB9, U 0x08, - U 0x77, U 0x02, U 0x05, U 0xBB, - U 0x02, U 0x9B, U 0x4A, U 0x9B, - U 0x42, U 0x97, U 0x46, U 0x88, - U 0x12, U 0x87, U 0x11, U 0x08, - U 0xDA, U 0x14, U 0x9A, U 0x4E, - U 0x0D, U 0x88, U 0x10, U 0x0D, - U 0x77, U 0x11, U 0x08, U 0x77, - U 0x02, U 0x1A, U 0xE4, U 0xAC, - U 0x06, U 0xD8, U 0x14, U 0x0D, - U 0x66, U 0x10, U 0x08, U 0x77, - U 0x02, U 0x97, U 0x4F, U 0xC7, - U 0x8F, U 0x98, U 0x4D, U 0x98, - U 0x4C, U 0x98, U 0x45, U 0x87, - U 0x15, U 0x98, U 0x44, U 0x07, - U 0x15, U 0x14, U 0x0D, U 0x55, - U 0x11, U 0x0A, U 0x55, U 0x02, - U 0x95, U 0x47, U 0x15, U 0xE4, - U 0xC1, U 0x8A, U 0x26, U 0x2D, - U 0x46, U 0x10, U 0x2D, U 0x46, - U 0x18, U 0x2D, U 0x46, U 0x20, - U 0x2C, U 0x46, U 0x11, U 0x2C, - U 0x46, U 0x19, U 0x2C, U 0x46, - U 0x21, U 0x2B, U 0x46, U 0x12, - U 0x2B, U 0x46, U 0x1A, U 0x28, - U 0x46, U 0x14, U 0x28, U 0x46, - U 0x15, U 0x2B, U 0x46, U 0x22, - U 0x88, U 0x16, U 0x25, U 0x46, - U 0x24, U 0x25, U 0x46, U 0x26, - U 0x8B, U 0x17, U 0x0A, U 0x0C, - U 0x48, U 0x09, U 0x0D, U 0x48, - U 0x85, U 0x13, U 0x0E, U 0xDD, - U 0x11, U 0x05, U 0xCC, U 0x11, - U 0x08, U 0x39, U 0x40, U 0x0B, - U 0xEB, U 0x39, U 0x02, U 0x99, - U 0x10, U 0x1E, U 0xE4, U 0xB0, - U 0x0D, U 0xCC, U 0x02, U 0x0D, - U 0x55, U 0x11, U 0x08, U 0x2D, - U 0x40, U 0x06, U 0x55, U 0x02, - U 0x2E, U 0x46, U 0x13, U 0x16, - U 0xE4, U 0x7B, U 0x0F, U 0xDD, - U 0x11, U 0x25, U 0x46, U 0x16, - U 0x08, U 0x08, U 0x40, U 0x85, - U 0x1B, U 0x01, U 0x88, U 0x10, - U 0x0D, U 0xBB, U 0x02, U 0x86, - U 0x67, U 0x1D, U 0xE4, U 0xA7, - U 0x09, U 0x88, U 0x02, U 0x0C, - U 0xBB, U 0x02, U 0x19, U 0xE4, - U 0x77, U 0x1C, U 0xE4, U 0xA5, - U 0x2B, U 0x46, U 0x17, U 0x2D, - U 0x46, U 0x1B, U 0xA7, U 0x66, - U 0x1B, U 0xE4, U 0xA4, U 0xC0, - U 0x70, U 0x2C, U 0x46, U 0x1C, - U 0x09, U 0x88, U 0x02, U 0x8C, - U 0x1E, U 0x28, U 0x46, U 0x1E, - U 0x2B, U 0x46, U 0x23, U 0xC0, - U 0x90, U 0x8B, U 0x1D, U 0x29, - U 0x46, U 0x1D, U 0x29, U 0x46, - U 0x1F, U 0x18, U 0xE4, U 0x9D, - U 0x29, U 0x46, U 0x27, U 0x28, - U 0x46, U 0x25, U 0x29, U 0x31, - U 0x16, U 0x2E, U 0x20, U 0x06, - U 0x29, U 0x24, U 0x6A, U 0x24, - U 0x31, U 0x17, U 0x96, U 0x2D, - U 0x24, U 0x25, U 0x23, U 0x86, - U 0x1C, U 0xCC, U 0xE1, U 0x27, - U 0x24, U 0x07, U 0xC0, U 0xD7, - U 0x09, U 0x0E, U 0x40, U 0x64, - U 0xE0, U 0x82, U 0x9A, U 0x29, - U 0x09, U 0x28, U 0x41, U 0x64, - U 0x80, U 0x91, U 0x64, U 0x40, - U 0x9B, U 0x2D, U 0x24, U 0x06, - U 0xC0, U 0x98, U 0x09, U 0x49, - U 0x36, U 0x28, U 0x0A, U 0xA0, - U 0x24, U 0x62, U 0x85, U 0x01, - U 0xC4, U 0x04, U 0xA8, U 0x44, - U 0x28, U 0x21, U 0x04, U 0x24, - U 0x66, U 0x85, U 0x08, U 0x88, - U 0x11, U 0x8E, U 0x3F, U 0x8A, - U 0x3E, U 0x2D, U 0x32, U 0x10, - U 0x0E, U 0xA4, U 0x18, U 0x00, - U 0xC4, U 0x04, U 0x0E, U 0xAE, - U 0x18, U 0x00, U 0xEE, U 0x11, - U 0x0A, U 0xCA, U 0x53, U 0x0E, - U 0xDD, U 0x02, U 0xC0, U 0xE3, - U 0x0E, U 0x88, U 0x02, U 0x98, - U 0xC1, U 0x1E, U 0xE4, U 0x82, - U 0x09, U 0x08, U 0x4E, U 0x9E, - U 0xC0, U 0x8E, U 0x20, U 0x94, - U 0xC3, U 0x98, U 0xC5, U 0x9D, - U 0xC4, U 0x18, U 0xE4, U 0x4E, - U 0x1D, U 0xE4, U 0x7F, U 0x05, - U 0xEE, U 0x11, U 0x0E, U 0xAA, - U 0x02, U 0x0D, U 0xAA, U 0x02, - U 0xA8, U 0xB8, U 0x27, U 0x84, - U 0xCF, U 0x9A, U 0xC2, U 0x1E, - U 0xE4, U 0x40, U 0x24, U 0xF2, - U 0x9D, U 0x27, U 0xE4, U 0xA2, - U 0x24, U 0x4C, U 0x18, U 0x24, - U 0xF6, U 0x9D, U 0x65, U 0x50, - U 0x52, U 0xC0, U 0x20, U 0xD1, - U 0x0F, U 0x2D, U 0x24, U 0x06, - U 0xC0, U 0xA0, U 0xC0, U 0x98, - U 0x09, U 0x49, U 0x36, U 0x04, - U 0xA9, U 0x38, U 0x63, U 0xFF, - U 0x7F, U 0xC0, U 0xA0, U 0x63, - U 0xFE, U 0x07, U 0x00, U 0x00, - U 0x65, U 0x4F, U 0x6D, U 0xC0, + U 0x89, U 0x1A, U 0xC0, U 0xE2, + U 0xC0, U 0x81, U 0x2B, U 0x16, + U 0x10, U 0x95, U 0x1E, U 0x94, + U 0x1D, U 0x96, U 0x1F, U 0x2D, + U 0x20, U 0x3D, U 0x29, U 0x76, + U 0x1A, U 0x29, U 0x76, U 0x12, + U 0xC0, U 0x60, U 0x14, U 0xE4, + U 0x40, U 0xC0, U 0x50, U 0x24, + U 0x76, U 0x13, U 0x0D, U 0x0B, + U 0x40, U 0x84, U 0x17, U 0x0B, + U 0x85, U 0x38, U 0x0E, U 0xDD, + U 0x01, U 0x8B, U 0x14, U 0x1E, + U 0xE4, U 0x51, U 0x0A, U 0x55, + U 0x10, U 0x0D, U 0x86, U 0x38, + U 0x0B, U 0x66, U 0x10, U 0x06, + U 0x55, U 0x02, U 0x2E, U 0x76, + U 0x1B, U 0xB0, U 0xA6, U 0x0B, + U 0xDD, U 0x14, U 0xC0, U 0xE4, + U 0x2E, U 0x76, U 0x19, U 0x2E, + U 0x76, U 0x11, U 0x0D, U 0xBB, + U 0x10, U 0x8A, U 0x13, U 0x2D, + U 0x76, U 0x1E, U 0x09, U 0x66, + U 0x11, U 0x8D, U 0x16, U 0x06, + U 0x55, U 0x02, U 0x0D, U 0xAA, + U 0x11, U 0x16, U 0xE4, U 0x43, + U 0x0B, U 0xAA, U 0x02, U 0x0D, + U 0xDB, U 0x14, U 0x06, U 0x55, + U 0x02, U 0x0D, U 0xDD, U 0x10, + U 0x0B, U 0xAA, U 0x02, U 0x25, + U 0x76, U 0x16, U 0x04, U 0x16, + U 0x14, U 0x0D, U 0x66, U 0x11, + U 0x15, U 0xE4, U 0x1E, U 0x2A, + U 0x76, U 0x1F, U 0xC7, U 0xBF, + U 0x2B, U 0x76, U 0x1D, U 0x2B, + U 0x76, U 0x1C, U 0x2B, U 0x76, + U 0x15, U 0x2B, U 0x76, U 0x14, + U 0x1A, U 0xE4, U 0x17, U 0x25, + U 0x76, U 0x18, U 0x25, U 0x76, + U 0x10, U 0x0A, U 0x66, U 0x02, + U 0x26, U 0x76, U 0x17, U 0x0C, + U 0x26, U 0x40, U 0x0F, U 0x66, + U 0x11, U 0x8A, U 0x26, U 0x2B, + U 0x76, U 0x24, U 0x2B, U 0x76, + U 0x25, U 0x2E, U 0x76, U 0x21, + U 0x25, U 0x76, U 0x20, U 0x29, + U 0x76, U 0x22, U 0x85, U 0x18, + U 0x19, U 0xE4, U 0x30, U 0x1E, + U 0xE3, U 0xFA, U 0x8B, U 0x15, + U 0x8E, U 0xE7, U 0x29, U 0x76, + U 0x23, U 0x05, U 0x85, U 0x39, + U 0x89, U 0x10, U 0x88, U 0x19, + U 0x06, U 0x55, U 0x02, U 0x0D, + U 0xBB, U 0x11, U 0x0D, U 0xBB, + U 0x02, U 0xA4, U 0xEE, U 0x0A, + U 0x06, U 0x48, U 0x84, U 0x1D, + U 0x05, U 0x66, U 0x11, U 0x2B, + U 0x76, U 0x26, U 0x08, U 0x08, + U 0x48, U 0x0E, U 0x88, U 0x11, + U 0x2B, U 0x12, U 0x10, U 0x08, + U 0x66, U 0x02, U 0x06, U 0x55, + U 0x02, U 0x86, U 0x1F, U 0x25, + U 0x76, U 0x27, U 0x9E, U 0x2D, + U 0x85, U 0x1E, U 0x29, U 0x24, + U 0x6A, U 0x27, U 0x31, U 0x17, + U 0x2D, U 0x20, U 0x06, U 0x27, + U 0x25, U 0x38, U 0xCC, U 0xD3, + U 0xC0, U 0x80, U 0x28, U 0x24, + U 0x07, U 0xC0, U 0xD7, U 0x09, + U 0x0C, U 0x40, U 0x64, U 0xC0, + U 0x86, U 0x9A, U 0x29, U 0x09, + U 0x2E, U 0x41, U 0x64, U 0xE0, + U 0x96, U 0x64, U 0x70, U 0xA0, + U 0x2D, U 0x24, U 0x06, U 0xC0, + U 0x98, U 0x09, U 0x79, U 0x36, + U 0x01, U 0xC4, U 0x04, U 0x2E, + U 0x21, U 0x04, U 0x27, U 0x62, + U 0x85, U 0x28, U 0x0A, U 0xA0, + U 0xA8, U 0x77, U 0x08, U 0xEE, + U 0x11, U 0xC0, U 0x83, U 0x27, + U 0x66, U 0x85, U 0x2A, U 0x32, + U 0x10, U 0x8D, U 0x3F, U 0x08, + U 0xEE, U 0x02, U 0x8C, U 0x3E, + U 0x09, U 0x08, U 0x4E, U 0x0D, + U 0xC7, U 0x18, U 0x00, U 0xC4, + U 0x04, U 0x9E, U 0x41, U 0x0D, + U 0xCD, U 0x18, U 0x00, U 0xDD, + U 0x11, U 0x0D, U 0xAA, U 0x02, + U 0x1D, U 0xE4, U 0x08, U 0x0C, + U 0xCC, U 0x53, U 0x9D, U 0x40, + U 0x1D, U 0xE4, U 0x07, U 0x8E, + U 0x20, U 0x97, U 0x43, U 0x9A, + U 0x44, U 0x98, U 0x45, U 0x1A, + U 0xE3, U 0xD3, U 0x05, U 0xEE, + U 0x11, U 0x0E, U 0xCC, U 0x02, + U 0xAA, U 0xBA, U 0xC0, U 0xE0, + U 0x0D, U 0xCC, U 0x02, U 0x9C, + U 0x42, U 0x2E, U 0xA4, U 0xCF, + U 0x17, U 0xE3, U 0xC5, U 0x28, + U 0xF2, U 0x9D, U 0x2E, U 0x74, + U 0xA2, U 0x28, U 0x8C, U 0x18, + U 0x28, U 0xF6, U 0x9D, U 0x65, + U 0x50, U 0x55, U 0xC0, U 0x20, + U 0xD1, U 0x0F, U 0x00, U 0x00, + U 0x2D, U 0x24, U 0x06, U 0xC0, + U 0xA0, U 0xC0, U 0x98, U 0x09, + U 0x79, U 0x36, U 0x07, U 0xA9, + U 0x38, U 0x63, U 0xFF, U 0x7B, + U 0xC0, U 0xA0, U 0x63, U 0xFE, + U 0x50, U 0x00, U 0x00, U 0x00, + U 0x65, U 0x7F, U 0x68, U 0xC0, U 0x98, U 0xC0, U 0xA8, U 0x2A, U 0x24, U 0x06, U 0x63, U 0xFF, - U 0x6B, U 0x2D, U 0x24, U 0x06, + U 0x66, U 0x2D, U 0x24, U 0x06, U 0xC0, U 0x90, U 0x63, U 0xFF, - U 0x63, U 0xCC, U 0x57, U 0xDA, + U 0x5E, U 0xCC, U 0x57, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0x8C, - U 0x10, U 0x58, U 0x0C, U 0x2A, + U 0x11, U 0x58, U 0x0C, U 0x4A, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x0C, U 0xB9, + U 0xB6, U 0x58, U 0x0C, U 0xD9, U 0x63, U 0xFF, U 0xE5, U 0x00, U 0xDA, U 0x20, U 0x58, U 0x0C, - U 0xB7, U 0x63, U 0xFF, U 0xDC, + U 0xD7, U 0x63, U 0xFF, U 0xDC, U 0x2A, U 0x2C, U 0x74, U 0x8B, - U 0x10, U 0x58, U 0x05, U 0x38, + U 0x11, U 0x58, U 0x05, U 0x51, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x06, U 0x28, U 0x20, U 0x06, U 0x8A, U 0x33, U 0x6F, U 0x82, U 0x02, U 0x60, U 0x01, U 0x61, U 0xC0, U 0x50, - U 0x13, U 0xE4, U 0x20, U 0x29, - U 0x21, U 0x02, U 0x16, U 0xE4, - U 0x1F, U 0x69, U 0x92, U 0x04, + U 0x13, U 0xE3, U 0xA4, U 0x29, + U 0x21, U 0x02, U 0x16, U 0xE3, + U 0xA3, U 0x69, U 0x92, U 0x04, U 0x25, U 0x25, U 0x02, U 0xD9, U 0x50, U 0x2C, U 0x20, U 0x15, - U 0x9A, U 0x28, U 0x14, U 0xE4, - U 0x1D, U 0x8F, U 0x26, U 0x27, + U 0x9A, U 0x28, U 0x14, U 0xE3, + U 0xA1, U 0x8F, U 0x26, U 0x27, U 0x20, U 0x0B, U 0x0A, U 0xFE, U 0x0C, U 0x04, U 0x77, U 0x09, U 0x2B, U 0x71, U 0x1C, U 0x64, @@ -3732,13 +3857,13 @@ static unsigned char t3fw[30136] = { U 0xCC, U 0x28, U 0xC2, U 0x86, U 0x2E, U 0x0A, U 0x08, U 0x78, U 0xEB, U 0x61, U 0x1E, U 0xE3, - U 0xFB, U 0x0E, U 0xBE, U 0x0A, + U 0x7F, U 0x0E, U 0xBE, U 0x0A, U 0x2E, U 0xE2, U 0xA3, U 0x68, U 0xE0, U 0x05, U 0x28, U 0x22, U 0x00, U 0x7E, U 0x89, U 0x4F, U 0x29, U 0xC2, U 0x85, U 0x1E, - U 0xE4, U 0x07, U 0x64, U 0x90, - U 0x46, U 0x1F, U 0xE4, U 0x15, + U 0xE3, U 0x8B, U 0x64, U 0x90, + U 0x46, U 0x1F, U 0xE3, U 0x98, U 0x9E, U 0x90, U 0xC0, U 0x84, U 0x98, U 0x91, U 0x28, U 0x20, U 0x0A, U 0x95, U 0x93, U 0x0F, @@ -3752,7 +3877,7 @@ static unsigned char t3fw[30136] = { U 0x07, U 0x68, U 0xE3, U 0x43, U 0x29, U 0x21, U 0x02, U 0x2A, U 0xC2, U 0x85, U 0x1D, U 0xE3, - U 0xEE, U 0x2A, U 0xAC, U 0x20, + U 0x72, U 0x2A, U 0xAC, U 0x20, U 0xAD, U 0xBD, U 0x25, U 0xD4, U 0xCF, U 0x2A, U 0xC6, U 0x85, U 0x63, U 0xFF, U 0x4E, U 0x00, @@ -3761,7 +3886,7 @@ static unsigned char t3fw[30136] = { U 0x24, U 0x65, U 0xC9, U 0xF6, U 0x05, U 0xE4, U 0x31, U 0x00, U 0x02, U 0x00, U 0x2A, U 0x62, - U 0x82, U 0x1B, U 0xE3, U 0xF7, + U 0x82, U 0x1B, U 0xE3, U 0x7A, U 0x29, U 0x41, U 0x02, U 0x0B, U 0xAA, U 0x02, U 0x2A, U 0x66, U 0x82, U 0x09, U 0xE4, U 0x31, @@ -3821,7 +3946,7 @@ static unsigned char t3fw[30136] = { U 0x2D, U 0x20, U 0x6A, U 0x0D, U 0x2D, U 0x41, U 0x65, U 0xDF, U 0x7E, U 0xDA, U 0x20, U 0xC0, - U 0xB0, U 0x58, U 0x0C, U 0x75, + U 0xB0, U 0x58, U 0x0C, U 0xA1, U 0x64, U 0xAF, U 0x18, U 0xC0, U 0xF1, U 0x63, U 0xFE, U 0xEF, U 0x9F, U 0x27, U 0x63, U 0xFF, @@ -3831,8 +3956,8 @@ static unsigned char t3fw[30136] = { U 0x28, U 0x22, U 0x1F, U 0x65, U 0x8E, U 0x27, U 0x63, U 0xFF, U 0x6E, U 0x25, U 0x24, U 0x06, - U 0x25, U 0x25, U 0x02, U 0xC0, - U 0x90, U 0x63, U 0xFE, U 0x19, + U 0x29, U 0x21, U 0x02, U 0x63, + U 0xFE, U 0x1B, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x65, U 0x71, U 0x33, U 0x2B, U 0x4C, U 0x18, U 0xC0, U 0xC7, U 0x29, @@ -3840,14 +3965,14 @@ static unsigned char t3fw[30136] = { U 0xC0, U 0x80, U 0x09, U 0xA8, U 0x38, U 0x08, U 0x08, U 0x42, U 0x64, U 0x81, U 0x10, U 0x1C, - U 0xE3, U 0x8A, U 0x1A, U 0xE3, - U 0x8B, U 0x2A, U 0xC6, U 0x7E, + U 0xE3, U 0x0E, U 0x1A, U 0xE3, + U 0x0F, U 0x2A, U 0xC6, U 0x7E, U 0x2A, U 0x5C, U 0xFD, U 0xD3, U 0x0F, U 0x6D, U 0xAA, U 0x05, U 0x00, U 0xB0, U 0x88, U 0x00, U 0x90, U 0x8C, U 0x89, U 0x40, U 0xC0, U 0xA0, U 0x09, U 0x88, - U 0x47, U 0x1F, U 0xE3, U 0xB4, + U 0x47, U 0x1F, U 0xE3, U 0x37, U 0x08, U 0x0B, U 0x47, U 0x09, U 0x4C, U 0x50, U 0x09, U 0x0D, U 0x53, U 0x04, U 0xDD, U 0x10, @@ -3862,8 +3987,8 @@ static unsigned char t3fw[30136] = { U 0x9D, U 0x26, U 0x8E, U 0x40, U 0xC0, U 0x90, U 0x0E, U 0x5E, U 0x50, U 0x64, U 0xE0, U 0x97, - U 0x1C, U 0xE3, U 0x9A, U 0x1E, - U 0xE3, U 0x89, U 0x03, U 0x8B, + U 0x1C, U 0xE3, U 0x1D, U 0x1E, + U 0xE3, U 0x0D, U 0x03, U 0x8B, U 0x0B, U 0xC0, U 0xF4, U 0x9F, U 0xB1, U 0x9E, U 0xB0, U 0x2D, U 0x20, U 0x0A, U 0x99, U 0xB3, @@ -3877,14 +4002,14 @@ static unsigned char t3fw[30136] = { U 0x07, U 0x2F, U 0x20, U 0x06, U 0x2B, U 0x20, U 0x64, U 0x69, U 0xF3, U 0x39, U 0xCB, U 0xB6, - U 0x1D, U 0xE3, U 0x6B, U 0x23, + U 0x1D, U 0xE2, U 0xEF, U 0x23, U 0x20, U 0x16, U 0x8D, U 0xD2, U 0x0B, U 0x33, U 0x0C, U 0x00, U 0xD1, U 0x04, U 0x00, U 0x33, U 0x1A, U 0xB4, U 0x8D, U 0xA3, U 0xC3, U 0x93, U 0x29, U 0x22, - U 0x20, U 0x0C, U 0x13, U 0xE3, - U 0x6A, U 0x1F, U 0xE3, U 0x61, + U 0x20, U 0x0C, U 0x13, U 0xE2, + U 0xEE, U 0x1F, U 0xE2, U 0xE5, U 0x0C, U 0x2E, U 0x11, U 0xAF, U 0xEE, U 0xA3, U 0x22, U 0x29, U 0x24, U 0xCF, U 0x2F, U 0xE2, @@ -3893,16 +4018,16 @@ static unsigned char t3fw[30136] = { U 0x85, U 0xD1, U 0x0F, U 0x00, U 0x2E, U 0x20, U 0x0C, U 0xB4, U 0x8C, U 0x0C, U 0xEB, U 0x11, - U 0x1F, U 0xE3, U 0x61, U 0x1D, - U 0xE3, U 0x58, U 0xAF, U 0xEE, + U 0x1F, U 0xE2, U 0xE5, U 0x1D, + U 0xE2, U 0xDC, U 0xAF, U 0xEE, U 0xAD, U 0xBB, U 0x22, U 0xB2, U 0x85, U 0x29, U 0xE4, U 0xCF, U 0x02, U 0xC2, U 0x0B, U 0x22, U 0xB6, U 0x85, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x2E, U 0x20, U 0x0C, U 0x1C, - U 0xE3, U 0x51, U 0x1F, U 0xE3, - U 0x58, U 0x0C, U 0xEB, U 0x11, + U 0xE2, U 0xD5, U 0x1F, U 0xE2, + U 0xDC, U 0x0C, U 0xEB, U 0x11, U 0xAF, U 0xEE, U 0xAC, U 0xBB, U 0x22, U 0xB2, U 0x85, U 0x29, U 0xE4, U 0xCF, U 0x02, U 0x82, @@ -3916,18 +4041,18 @@ static unsigned char t3fw[30136] = { U 0xEE, U 0x12, U 0xDA, U 0x70, U 0xC0, U 0xB3, U 0x2C, U 0x3C, U 0x18, U 0xDD, U 0x50, U 0x58, - U 0x0A, U 0x7B, U 0x89, U 0x40, + U 0x0A, U 0x99, U 0x89, U 0x40, U 0xC0, U 0x80, U 0x63, U 0xFE, - U 0xE3, U 0xDE, U 0x60, U 0xDA, - U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0xDD, U 0x50, U 0x58, - U 0x00, U 0x05, U 0x9A, U 0x10, - U 0xDB, U 0x50, U 0x07, U 0x7A, - U 0x02, U 0x58, U 0x04, U 0x4C, - U 0x88, U 0x10, U 0x63, U 0xFE, - U 0xF8, U 0x00, U 0x00, U 0x00, + U 0xE3, U 0x06, U 0x6E, U 0x02, + U 0x02, U 0x2A, U 0x02, U 0xDB, + U 0x30, U 0xDC, U 0x40, U 0xDD, + U 0x50, U 0x58, U 0x00, U 0x04, + U 0x9A, U 0x10, U 0xDB, U 0x50, + U 0xDA, U 0x70, U 0x58, U 0x04, + U 0x65, U 0x88, U 0x10, U 0x63, + U 0xFE, U 0xF7, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x92, - U 0x12, U 0x1E, U 0xE3, U 0x42, + U 0x12, U 0x1E, U 0xE2, U 0xC6, U 0x8C, U 0x40, U 0xAE, U 0x2D, U 0x0C, U 0x8C, U 0x47, U 0x2E, U 0x3C, U 0x18, U 0x04, U 0xCA, @@ -3969,14 +4094,14 @@ static unsigned char t3fw[30136] = { U 0xC7, U 0x29, U 0xDD, U 0xF8, U 0x63, U 0xFF, U 0xC1, U 0x00, U 0xC0, U 0x23, U 0x8A, U 0x42, - U 0x1B, U 0xE3, U 0x47, U 0x00, + U 0x1B, U 0xE2, U 0xCB, U 0x00, U 0xCD, U 0x32, U 0x2D, U 0x44, U 0x02, U 0x9B, U 0x30, U 0x92, U 0x31, U 0x89, U 0x42, U 0x85, U 0x43, U 0x79, U 0xA1, U 0x05, - U 0x1E, U 0xE3, U 0x43, U 0x0E, + U 0x1E, U 0xE2, U 0xC7, U 0x0E, U 0x55, U 0x01, U 0x87, U 0x12, - U 0x1B, U 0xE3, U 0x34, U 0x89, + U 0x1B, U 0xE2, U 0xB7, U 0x89, U 0x70, U 0x95, U 0x35, U 0x0B, U 0x99, U 0x02, U 0x99, U 0x32, U 0x88, U 0x42, U 0x0A, U 0x88, @@ -4004,35 +4129,35 @@ static unsigned char t3fw[30136] = { U 0x5A, U 0x7F, U 0xE0, U 0x02, U 0x60, U 0x02, U 0x15, U 0x89, U 0x28, U 0x88, U 0x26, U 0x1F, - U 0xE3, U 0x26, U 0x09, U 0x88, + U 0xE2, U 0xAA, U 0x09, U 0x88, U 0x0C, U 0x65, U 0x82, U 0x0F, U 0x2E, U 0x20, U 0x0B, U 0x0F, U 0xEE, U 0x0B, U 0x2D, U 0xE0, U 0xFE, U 0x2E, U 0xE0, U 0xFF, U 0x08, U 0xDD, U 0x11, U 0x0E, - U 0xDD, U 0x02, U 0x1E, U 0xE3, - U 0x20, U 0xAE, U 0xDD, U 0x1E, - U 0xE3, U 0x20, U 0x1C, U 0xE3, - U 0x20, U 0x0E, U 0xDD, U 0x01, + U 0xDD, U 0x02, U 0x1E, U 0xE2, + U 0xA4, U 0xAE, U 0xDD, U 0x1E, + U 0xE2, U 0xA4, U 0x1C, U 0xE2, + U 0xA4, U 0x0E, U 0xDD, U 0x01, U 0x0D, U 0xCC, U 0x37, U 0xC1, U 0x80, U 0x08, U 0x48, U 0x37, U 0xB8, U 0x8D, U 0xB4, U 0x88, U 0x98, U 0x10, U 0x89, U 0x60, - U 0x1A, U 0xE2, U 0xDE, U 0x7B, + U 0x1A, U 0xE2, U 0x62, U 0x7B, U 0x96, U 0x21, U 0x8B, U 0x62, U 0x2A, U 0xA0, U 0x21, U 0x9C, U 0x14, U 0x7B, U 0xA3, U 0x17, U 0x9D, U 0x13, U 0x2A, U 0x20, U 0x0C, U 0x8B, U 0x10, U 0x8C, - U 0x20, U 0x58, U 0x0B, U 0x97, + U 0x20, U 0x58, U 0x0B, U 0xC3, U 0x8C, U 0x14, U 0x8D, U 0x13, U 0xDB, U 0xA0, U 0xCE, U 0xAC, U 0x60, U 0x01, U 0xC4, U 0x00, U 0x2E, U 0x20, U 0x0C, U 0x1B, - U 0xE2, U 0xD1, U 0x0C, U 0xEA, + U 0xE2, U 0x55, U 0x0C, U 0xEA, U 0x11, U 0x0B, U 0xAA, U 0x08, U 0x2B, U 0xA2, U 0x86, U 0x1F, - U 0xE2, U 0xCF, U 0x7B, U 0xDB, + U 0xE2, U 0x53, U 0x7B, U 0xDB, U 0x3B, U 0x0F, U 0xEF, U 0x0A, U 0x2F, U 0xF2, U 0xA3, U 0x68, U 0xF0, U 0x05, U 0x28, U 0x22, @@ -4053,13 +4178,13 @@ static unsigned char t3fw[30136] = { U 0x63, U 0xFF, U 0xDD, U 0x00, U 0x00, U 0x9D, U 0x13, U 0x9C, U 0x14, U 0xDA, U 0x20, U 0xDB, - U 0x70, U 0x58, U 0x0B, U 0x08, + U 0x70, U 0x58, U 0x0B, U 0x28, U 0x8B, U 0x15, U 0x8C, U 0x14, U 0x8D, U 0x13, U 0x65, U 0xA0, U 0x6A, U 0x8E, U 0x62, U 0x63, U 0xFF, U 0xCC, U 0x00, U 0xDA, U 0x20, U 0x8B, U 0x11, U 0xDC, - U 0x40, U 0x58, U 0x0A, U 0xAE, + U 0x40, U 0x58, U 0x0A, U 0xCE, U 0xD6, U 0xA0, U 0x8B, U 0x15, U 0xC0, U 0x51, U 0xDE, U 0x70, U 0xDA, U 0x20, U 0xDC, U 0x60, @@ -4067,7 +4192,7 @@ static unsigned char t3fw[30136] = { U 0x76, U 0x8D, U 0x13, U 0x8C, U 0x14, U 0xD9, U 0xA0, U 0x2E, U 0x20, U 0x0C, U 0x1B, U 0xE2, - U 0xAB, U 0x1F, U 0xE2, U 0xB2, + U 0x2F, U 0x1F, U 0xE2, U 0x36, U 0x0C, U 0xEA, U 0x11, U 0xAF, U 0xEF, U 0xC0, U 0xE0, U 0xAB, U 0xAA, U 0x2B, U 0xA2, U 0x85, @@ -4082,13 +4207,13 @@ static unsigned char t3fw[30136] = { U 0x07, U 0x5B, U 0xFF, U 0x09, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0xDB, U 0xE0, U 0xDA, - U 0x20, U 0x58, U 0x0B, U 0x29, + U 0x20, U 0x58, U 0x0B, U 0x49, U 0x65, U 0x50, U 0xEF, U 0x2A, U 0x20, U 0x14, U 0x0A, U 0x3A, U 0x40, U 0x65, U 0xA0, U 0xEB, U 0xDB, U 0x60, U 0xDC, U 0x40, U 0xDD, U 0x30, U 0x02, U 0x2A, - U 0x02, U 0x58, U 0x09, U 0x9C, + U 0x02, U 0x58, U 0x09, U 0xBA, U 0xD6, U 0xA0, U 0x64, U 0xA0, U 0xD5, U 0x84, U 0xA1, U 0x83, U 0xA0, U 0x04, U 0x04, U 0x47, @@ -4102,7 +4227,7 @@ static unsigned char t3fw[30136] = { U 0x93, U 0x29, U 0x24, U 0x06, U 0x2C, U 0x20, U 0x06, U 0xC0, U 0xB1, U 0x8D, U 0x64, U 0x1F, - U 0xE2, U 0x8A, U 0x9D, U 0x27, + U 0xE2, U 0x0E, U 0x9D, U 0x27, U 0x9D, U 0x28, U 0x9D, U 0x29, U 0x8F, U 0xF2, U 0x9D, U 0x26, U 0x00, U 0xF1, U 0x04, U 0x00, @@ -4118,7 +4243,7 @@ static unsigned char t3fw[30136] = { U 0xBB, U 0x36, U 0xC0, U 0xE2, U 0x0B, U 0x0B, U 0x47, U 0x0E, U 0xBB, U 0x37, U 0x2B, U 0x24, - U 0x16, U 0x18, U 0xE2, U 0x82, + U 0x16, U 0x18, U 0xE2, U 0x06, U 0x0A, U 0x09, U 0x45, U 0x0D, U 0x0B, U 0x42, U 0x2B, U 0x24, U 0x0B, U 0x29, U 0x24, U 0x0A, @@ -4130,19 +4255,19 @@ static unsigned char t3fw[30136] = { U 0xCC, U 0x36, U 0x2C, U 0x24, U 0x64, U 0x65, U 0xFD, U 0xEC, U 0x0C, U 0x0C, U 0x47, U 0x64, - U 0xCD, U 0xE6, U 0x18, U 0xE2, - U 0x6D, U 0x8E, U 0x28, U 0x88, + U 0xCD, U 0xE6, U 0x18, U 0xE1, + U 0xF1, U 0x8E, U 0x28, U 0x88, U 0x82, U 0x0C, U 0x9F, U 0x0C, U 0x00, U 0x81, U 0x04, U 0x00, U 0xFF, U 0x1A, U 0xAF, U 0xEE, U 0x9E, U 0x29, U 0x63, U 0xFD, - U 0xCF, U 0x1C, U 0xE2, U 0x9C, + U 0xCF, U 0x1C, U 0xE2, U 0x1D, U 0x63, U 0xFE, U 0x13, U 0x00, - U 0x1C, U 0xE2, U 0x93, U 0x63, + U 0x1C, U 0xE2, U 0x17, U 0x63, U 0xFE, U 0x0C, U 0x8D, U 0x65, U 0x63, U 0xFF, U 0xA5, U 0x00, U 0xDA, U 0x20, U 0x2B, U 0x20, - U 0x0C, U 0x58, U 0x0B, U 0x06, + U 0x0C, U 0x58, U 0x0B, U 0x32, U 0x64, U 0x5F, U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0xC0, U 0x20, U 0xD1, U 0x0F, @@ -4150,8 +4275,8 @@ static unsigned char t3fw[30136] = { U 0x16, U 0xC0, U 0x93, U 0x63, U 0xFF, U 0xA0, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, - U 0x60, U 0x17, U 0xE2, U 0x56, - U 0x1D, U 0xE2, U 0x59, U 0xC3, + U 0x60, U 0x17, U 0xE1, U 0xDA, + U 0x1D, U 0xE1, U 0xDD, U 0xC3, U 0x81, U 0x29, U 0x31, U 0x01, U 0x2A, U 0x30, U 0x08, U 0x29, U 0x24, U 0x0A, U 0x78, U 0xA1, @@ -4168,7 +4293,7 @@ static unsigned char t3fw[30136] = { U 0xFF, U 0x09, U 0x28, U 0xF1, U 0x1C, U 0x2B, U 0x24, U 0x14, U 0xA8, U 0xEE, U 0x2E, U 0xF5, - U 0x1C, U 0x64, U 0xA0, U 0xB5, + U 0x1C, U 0x64, U 0xA0, U 0xA9, U 0x2B, U 0x22, U 0x1E, U 0x28, U 0x22, U 0x1D, U 0x01, U 0x11, U 0x02, U 0x7B, U 0x89, U 0x01, @@ -4181,7 +4306,7 @@ static unsigned char t3fw[30136] = { U 0xDB, U 0xA0, U 0x65, U 0xAF, U 0xE7, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, U 0x50, U 0xDA, - U 0x20, U 0x58, U 0x00, U 0xD8, + U 0x20, U 0x58, U 0x00, U 0xDE, U 0x29, U 0x21, U 0x02, U 0x09, U 0x0B, U 0x4C, U 0xCA, U 0xB2, U 0xD2, U 0xA0, U 0xD1, U 0x0F, @@ -4191,138 +4316,144 @@ static unsigned char t3fw[30136] = { U 0x64, U 0xE0, U 0x2D, U 0x02, U 0x2A, U 0x02, U 0x03, U 0x3B, U 0x02, U 0xDC, U 0x40, U 0xDD, - U 0x50, U 0x58, U 0x00, U 0xCE, + U 0x50, U 0x58, U 0x00, U 0xD4, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x2B, U 0x20, U 0x14, U 0xB0, U 0xBB, U 0x2B, U 0x24, U 0x14, U 0x0B, U 0x0F, U 0x41, U 0x64, - U 0xF0, U 0x82, U 0x7C, U 0xB7, + U 0xF0, U 0x79, U 0x7C, U 0xB7, U 0xCA, U 0xC0, U 0xC1, U 0x0C, U 0x9C, U 0x02, U 0x2C, U 0x25, U 0x02, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x2E, U 0x20, U 0x06, - U 0x69, U 0xE2, U 0xC1, U 0x2F, - U 0x21, U 0x02, U 0x0F, U 0x0F, - U 0x4C, U 0x69, U 0xF1, U 0xB8, - U 0x26, U 0x24, U 0x06, U 0x26, - U 0x25, U 0x02, U 0x2B, U 0x22, - U 0x1E, U 0x28, U 0x22, U 0x1D, - U 0x2A, U 0x20, U 0x0B, U 0x29, - U 0x20, U 0x15, U 0x0D, U 0xAA, - U 0x09, U 0x2C, U 0xA1, U 0x1C, - U 0x26, U 0x24, U 0x15, U 0xAC, - U 0x99, U 0x29, U 0xA5, U 0x1C, - U 0x7B, U 0x81, U 0x4A, U 0x60, - U 0x00, U 0x49, U 0xB0, U 0xBB, + U 0x69, U 0xE2, U 0xC1, U 0x26, + U 0x24, U 0x06, U 0x2B, U 0x22, + U 0x1E, U 0x2F, U 0x22, U 0x1D, + U 0x29, U 0x20, U 0x0B, U 0x28, + U 0x20, U 0x15, U 0x0D, U 0x99, + U 0x09, U 0x2A, U 0x91, U 0x1C, + U 0x26, U 0x24, U 0x15, U 0xAA, + U 0x88, U 0x28, U 0x95, U 0x1C, + U 0x7B, U 0xF1, U 0x49, U 0x60, + U 0x00, U 0x48, U 0xB0, U 0xBB, U 0x2B, U 0x24, U 0x14, U 0x0B, - U 0x0D, U 0x41, U 0xCB, U 0xD6, - U 0x7C, U 0xB7, U 0x02, U 0x2C, - U 0x25, U 0x02, U 0x2B, U 0x22, - U 0x1E, U 0x2E, U 0x22, U 0x1D, - U 0x7B, U 0xE9, U 0x02, U 0x2B, - U 0x0A, U 0x00, U 0x64, U 0xB0, - U 0x17, U 0x2C, U 0xB0, U 0x07, - U 0x28, U 0xB0, U 0x00, U 0xDA, - U 0x20, U 0x07, U 0x88, U 0x0A, - U 0x28, U 0x82, U 0x4C, U 0xC0, - U 0xD1, U 0x0B, U 0x80, U 0x00, - U 0xDB, U 0xA0, U 0x65, U 0xAF, - U 0xE7, U 0xC0, U 0x20, U 0xD1, - U 0x0F, U 0x26, U 0x24, U 0x06, - U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0x26, U 0x24, U 0x06, U 0x63, - U 0xFF, U 0xC7, U 0xDB, U 0x60, - U 0x1D, U 0xE2, U 0x07, U 0x64, - U 0xBF, U 0x42, U 0x2C, U 0xB0, + U 0x0A, U 0x41, U 0x64, U 0xA0, + U 0x62, U 0x7C, U 0xB7, U 0x02, + U 0x2C, U 0x25, U 0x02, U 0x2B, + U 0x22, U 0x1E, U 0x2C, U 0x22, + U 0x1D, U 0xD3, U 0x0F, U 0x7B, + U 0xC9, U 0x01, U 0xC0, U 0xB0, + U 0xC9, U 0xB6, U 0x2C, U 0xB0, U 0x07, U 0x28, U 0xB0, U 0x00, U 0xDA, U 0x20, U 0x07, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xC0, U 0xD1, U 0x0B, U 0x80, U 0x00, U 0xDB, U 0xA0, U 0x65, - U 0xAF, U 0xE7, U 0x1D, U 0xE1, - U 0xFF, U 0x63, U 0xFF, U 0x24, + U 0xAF, U 0xE7, U 0xC0, U 0x20, + U 0xD1, U 0x0F, U 0x00, U 0x00, + U 0x26, U 0x24, U 0x06, U 0xD2, + U 0xA0, U 0xD1, U 0x0F, U 0x00, + U 0x00, U 0xDB, U 0x60, U 0x1D, + U 0xE1, U 0x8E, U 0x64, U 0xBF, + U 0x4F, U 0x2C, U 0xB0, U 0x07, + U 0x28, U 0xB0, U 0x00, U 0xDA, + U 0x20, U 0x07, U 0x88, U 0x0A, + U 0x28, U 0x82, U 0x4C, U 0xC0, + U 0xD1, U 0x0B, U 0x80, U 0x00, + U 0xDB, U 0xA0, U 0x65, U 0xAF, + U 0xE7, U 0x1D, U 0xE1, U 0x86, + U 0x63, U 0xFF, U 0x31, U 0x00, + U 0x26, U 0x24, U 0x06, U 0x63, + U 0xFF, U 0x9C, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x28, - U 0x20, U 0x06, U 0xC0, U 0x64, - U 0x6F, U 0x85, U 0x64, U 0xCA, - U 0x5B, U 0x29, U 0x20, U 0x14, - U 0x7D, U 0x97, U 0x26, U 0xDA, - U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x05, U 0x5D, U 0x02, - U 0x58, U 0x00, U 0x19, U 0x29, - U 0x21, U 0x02, U 0x09, U 0x0A, - U 0x4C, U 0xC8, U 0xA3, U 0xC0, - U 0x20, U 0xD1, U 0x0F, U 0x00, - U 0xC0, U 0xB1, U 0x0B, U 0x9B, - U 0x02, U 0x2B, U 0x25, U 0x02, - U 0xC0, U 0x20, U 0xD1, U 0x0F, - U 0x00, U 0x00, U 0x02, U 0x2A, + U 0x20, U 0x06, U 0x26, U 0x0A, + U 0x04, U 0x6F, U 0x85, U 0x63, + U 0x64, U 0x50, U 0x2A, U 0x29, + U 0x20, U 0x14, U 0x7D, U 0x97, + U 0x24, U 0x02, U 0x2A, U 0x02, + U 0xDB, U 0x30, U 0xDC, U 0x40, + U 0xDD, U 0x50, U 0x58, U 0x00, + U 0x19, U 0x29, U 0x21, U 0x02, + U 0x09, U 0x0A, U 0x4C, U 0xC8, + U 0xA2, U 0xC0, U 0x20, U 0xD1, + U 0x0F, U 0xC0, U 0xB1, U 0x0B, + U 0x9B, U 0x02, U 0x2B, U 0x25, + U 0x02, U 0xC0, U 0x20, U 0xD1, + U 0x0F, U 0x00, U 0x02, U 0x2A, U 0x02, U 0x03, U 0x3B, U 0x02, U 0x2C, U 0x0A, U 0x01, U 0x58, - U 0x00, U 0xCA, U 0xC9, U 0xAA, + U 0x00, U 0xD1, U 0xC9, U 0xAA, U 0xDA, U 0x20, U 0xDB, U 0x30, - U 0xDC, U 0x40, U 0x58, U 0x09, - U 0xE4, U 0x29, U 0xA0, U 0x11, + U 0xDC, U 0x40, U 0x58, U 0x0A, + U 0x05, U 0x29, U 0xA0, U 0x11, U 0xD3, U 0xA0, U 0x7E, U 0x97, U 0x08, U 0x2C, U 0x0A, U 0xFD, U 0x0C, U 0x9C, U 0x01, U 0x2C, U 0xA4, U 0x11, U 0xC0, U 0x51, U 0x2D, U 0x20, U 0x14, U 0x06, U 0xDD, U 0x02, U 0x2D, U 0x24, - U 0x14, U 0x63, U 0xFF, U 0xA2, + U 0x14, U 0x63, U 0xFF, U 0xA4, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, U 0x50, U 0xC0, U 0xE0, U 0x58, U 0x09, - U 0x64, U 0xD2, U 0xA0, U 0xD1, + U 0x85, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x16, - U 0xE1, U 0xDA, U 0x1C, U 0xE1, - U 0xDA, U 0x65, U 0x51, U 0x3B, + U 0xE1, U 0x5F, U 0x1C, U 0xE1, + U 0x5F, U 0x65, U 0x51, U 0x57, U 0xC0, U 0xE1, U 0x17, U 0xE1, - U 0xD6, U 0x28, U 0x21, U 0x02, - U 0x8B, U 0x20, U 0x08, U 0x08, - U 0x4C, U 0x65, U 0x80, U 0x7B, - U 0x29, U 0x32, U 0x00, U 0x09, - U 0x69, U 0x51, U 0x69, U 0x93, - U 0x72, U 0x2A, U 0x62, U 0x9E, - U 0x6E, U 0xA8, U 0x48, U 0x2A, + U 0x5B, U 0x28, U 0x21, U 0x02, + U 0x2D, U 0x22, U 0x00, U 0x08, + U 0x08, U 0x4C, U 0x65, U 0x80, + U 0x93, U 0x2B, U 0x32, U 0x00, + U 0x0B, U 0x69, U 0x51, U 0x29, + U 0x9C, U 0xFD, U 0x65, U 0x90, + U 0x87, U 0x2A, U 0x62, U 0x9E, + U 0x6E, U 0xA8, U 0x4C, U 0x2A, U 0x72, U 0x26, U 0x68, U 0xA0, - U 0x02, U 0x7A, U 0xB9, U 0x3F, - U 0x2A, U 0x62, U 0x9D, U 0xB4, - U 0x4F, U 0xCB, U 0xA7, U 0x2B, - U 0x20, U 0x0C, U 0x0C, U 0xBD, - U 0x11, U 0x06, U 0xDD, U 0x08, - U 0x28, U 0xD2, U 0x86, U 0x78, - U 0xFB, U 0x15, U 0x0C, U 0xBF, - U 0x0A, U 0x2F, U 0xF2, U 0xA3, - U 0x68, U 0xF0, U 0x04, U 0x88, - U 0x20, U 0x7F, U 0x89, U 0x07, + U 0x02, U 0x7A, U 0xD9, U 0x43, + U 0x2A, U 0x62, U 0x9D, U 0xCB, + U 0xAD, U 0x7C, U 0xBE, U 0x50, + U 0x2B, U 0x20, U 0x0C, U 0x0C, + U 0xBD, U 0x11, U 0xA6, U 0xDD, + U 0x28, U 0xD2, U 0x86, U 0x2F, + U 0x4C, U 0x04, U 0x78, U 0xFB, + U 0x16, U 0x0C, U 0xBF, U 0x0A, + U 0x2F, U 0xF2, U 0xA3, U 0x68, + U 0xF0, U 0x05, U 0x28, U 0x22, + U 0x00, U 0x7F, U 0x89, U 0x07, U 0x2D, U 0xD2, U 0x85, U 0xD3, - U 0x0F, U 0x65, U 0xD0, U 0x60, + U 0x0F, U 0x65, U 0xD0, U 0x74, U 0x2A, U 0x21, U 0x04, U 0x19, - U 0xE2, U 0x02, U 0xD3, U 0x0F, - U 0x7A, U 0x9B, U 0x1D, U 0xDA, - U 0x20, U 0x58, U 0x08, U 0x64, - U 0x60, U 0x00, U 0x24, U 0x00, - U 0x2C, U 0x21, U 0x04, U 0x1B, - U 0xE1, U 0xFD, U 0x7C, U 0xBB, - U 0x13, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x08, U 0x5F, - U 0xC9, U 0x53, U 0x60, U 0x00, - U 0xEF, U 0xDA, U 0x20, U 0x58, - U 0x0A, U 0x46, U 0x60, U 0x00, - U 0x06, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x0A, U 0x43, - U 0x65, U 0x50, U 0xDD, U 0xDC, - U 0x40, U 0xDB, U 0x30, U 0x8D, - U 0x30, U 0xDA, U 0x20, U 0x0D, - U 0x6D, U 0x51, U 0x58, U 0x08, - U 0xB8, U 0xD3, U 0xA0, U 0x64, - U 0xA0, U 0xCA, U 0x1C, U 0xE1, - U 0xB0, U 0xC0, U 0x51, U 0x84, - U 0xA1, U 0x8E, U 0xA0, U 0x04, - U 0x04, U 0x47, U 0x0E, U 0x0E, - U 0x47, U 0x63, U 0xFF, U 0x50, + U 0xE1, U 0x85, U 0xD3, U 0x0F, + U 0x7A, U 0x9B, U 0x2E, U 0xDA, + U 0x20, U 0x58, U 0x08, U 0x81, + U 0x60, U 0x00, U 0x35, U 0x00, + U 0x2D, U 0x21, U 0x04, U 0x1B, + U 0xE1, U 0x80, U 0x7D, U 0xBB, + U 0x24, U 0xDA, U 0x20, U 0xC0, + U 0xB6, U 0x58, U 0x08, U 0x7C, + U 0xCA, U 0x54, U 0x60, U 0x01, + U 0x03, U 0x0B, U 0x2B, U 0x50, + U 0x2B, U 0x24, U 0x0B, U 0xB4, + U 0xBB, U 0x0B, U 0x0B, U 0x47, + U 0x2B, U 0x24, U 0x0C, U 0x63, + U 0xFF, U 0xA0, U 0xDA, U 0x20, + U 0x58, U 0x0A, U 0x60, U 0x60, + U 0x00, U 0x06, U 0xDA, U 0x20, + U 0xC0, U 0xB6, U 0x58, U 0x0A, + U 0x5E, U 0x65, U 0x50, U 0xE0, + U 0xDC, U 0x40, U 0xDB, U 0x30, + U 0x2D, U 0x32, U 0x00, U 0x02, + U 0x2A, U 0x02, U 0x0D, U 0x6D, + U 0x51, U 0x58, U 0x08, U 0xD0, + U 0x1C, U 0xE1, U 0x30, U 0xD3, + U 0xA0, U 0x64, U 0xA0, U 0xC8, + U 0xC0, U 0x51, U 0x84, U 0xA1, + U 0x8E, U 0xA0, U 0x04, U 0x04, + U 0x47, U 0x0E, U 0x0E, U 0x47, + U 0x63, U 0xFF, U 0x35, U 0x00, U 0x00, U 0x2B, U 0x21, U 0x04, U 0xC0, U 0x8C, U 0x89, U 0x31, U 0xC0, U 0x70, U 0xDF, U 0x70, @@ -4332,23 +4463,23 @@ static unsigned char t3fw[30136] = { U 0xAE, U 0xCC, U 0x0C, U 0x0C, U 0x47, U 0x2C, U 0x24, U 0x66, U 0x7C, U 0xFB, U 0x09, U 0x9D, - U 0x10, U 0x58, U 0x08, U 0xCA, + U 0x10, U 0x58, U 0x08, U 0xE2, U 0x8D, U 0x10, U 0x27, U 0x24, U 0x66, U 0x94, U 0xD1, U 0x1E, - U 0xE1, U 0xB6, U 0xB8, U 0xDC, + U 0xE1, U 0x33, U 0xB8, U 0xDC, U 0x9E, U 0xD0, U 0x65, U 0x50, U 0x56, U 0xC0, U 0xD7, U 0xB8, U 0x3A, U 0xC0, U 0xB1, U 0xC0, U 0xF0, U 0x0C, U 0xBF, U 0x38, U 0x0F, U 0x0F, U 0x42, U 0xCB, - U 0xF1, U 0x19, U 0xE1, U 0x94, - U 0x18, U 0xE1, U 0x96, U 0x28, + U 0xF1, U 0x19, U 0xE1, U 0x12, + U 0x18, U 0xE1, U 0x14, U 0x28, U 0x96, U 0x7E, U 0xB0, U 0x4B, U 0xD3, U 0x0F, U 0x6D, U 0xBA, U 0x05, U 0x00, U 0xA0, U 0x88, U 0x00, U 0xC0, U 0x8C, U 0x2C, U 0x20, U 0x0C, U 0xC0, U 0x20, - U 0x1D, U 0xE1, U 0x9A, U 0x0C, + U 0x1D, U 0xE1, U 0x18, U 0x0C, U 0xCF, U 0x11, U 0xA6, U 0xFF, U 0x2E, U 0xF2, U 0x85, U 0xAD, U 0xCC, U 0x27, U 0xC4, U 0xCF, @@ -4358,12 +4489,12 @@ static unsigned char t3fw[30136] = { U 0x38, U 0x78, U 0xD0, U 0xCD, U 0x63, U 0xFF, U 0xC1, U 0x00, U 0x8E, U 0x30, U 0x0E, U 0x0E, - U 0x47, U 0x63, U 0xFE, U 0xBD, + U 0x47, U 0x63, U 0xFE, U 0xA1, U 0x2A, U 0x2C, U 0x74, U 0x2B, U 0x0A, U 0x01, U 0x04, U 0x4D, - U 0x02, U 0x58, U 0x08, U 0xBD, + U 0x02, U 0x58, U 0x08, U 0xD5, U 0x2F, U 0x20, U 0x0C, U 0x12, - U 0xE1, U 0x8B, U 0x0C, U 0xF9, + U 0xE1, U 0x09, U 0x0C, U 0xF9, U 0x11, U 0xA6, U 0x99, U 0xA2, U 0xFF, U 0x27, U 0xF4, U 0xCF, U 0x28, U 0x92, U 0x85, U 0xD2, @@ -4375,7 +4506,7 @@ static unsigned char t3fw[30136] = { U 0x60, U 0xCB, U 0x55, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0x05, U 0x5D, U 0x02, U 0x02, U 0x2A, - U 0x02, U 0x5B, U 0xFF, U 0x9B, + U 0x02, U 0x5B, U 0xFF, U 0x94, U 0x29, U 0x21, U 0x02, U 0x09, U 0x08, U 0x4C, U 0xC8, U 0x82, U 0xD2, U 0xA0, U 0xD1, U 0x0F, @@ -4394,7 +4525,7 @@ static unsigned char t3fw[30136] = { U 0x01, U 0x26, U 0x25, U 0x02, U 0x28, U 0x24, U 0x0A, U 0x0F, U 0xEE, U 0x01, U 0x2E, U 0x24, - U 0x14, U 0x58, U 0x01, U 0x0D, + U 0x14, U 0x58, U 0x01, U 0x0E, U 0x63, U 0xFF, U 0xA3, U 0x00, U 0x26, U 0x24, U 0x06, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, @@ -4402,18 +4533,18 @@ static unsigned char t3fw[30136] = { U 0x21, U 0x02, U 0xD6, U 0x20, U 0x08, U 0x08, U 0x4C, U 0x65, U 0x80, U 0x9D, U 0x2B, U 0x20, - U 0x0C, U 0x12, U 0xE1, U 0x5B, + U 0x0C, U 0x12, U 0xE0, U 0xD9, U 0x0C, U 0xB8, U 0x11, U 0xA2, U 0x88, U 0x2A, U 0x82, U 0x86, U 0xB5, U 0x49, U 0x7A, U 0x93, U 0x02, U 0x60, U 0x00, U 0x97, - U 0x19, U 0xE1, U 0x58, U 0x09, + U 0x19, U 0xE0, U 0xD6, U 0x09, U 0xB9, U 0x0A, U 0x29, U 0x92, U 0xA3, U 0x68, U 0x90, U 0x08, U 0x2A, U 0x62, U 0x00, U 0x09, U 0xAA, U 0x0C, U 0x65, U 0xA0, U 0x82, U 0x28, U 0x82, U 0x85, - U 0x1C, U 0xE1, U 0x63, U 0x64, + U 0x1C, U 0xE0, U 0xE1, U 0x64, U 0x80, U 0x79, U 0x9C, U 0x80, U 0xB8, U 0x87, U 0xB1, U 0x4B, U 0x9B, U 0x81, U 0x9B, U 0x10, @@ -4422,8 +4553,8 @@ static unsigned char t3fw[30136] = { U 0x0A, U 0x01, U 0xC0, U 0xD0, U 0x07, U 0x8D, U 0x38, U 0x0D, U 0x0D, U 0x42, U 0xCB, U 0xDE, - U 0x1F, U 0xE1, U 0x44, U 0x1E, - U 0xE1, U 0x45, U 0x2E, U 0xF6, + U 0x1F, U 0xE0, U 0xC2, U 0x1E, + U 0xE0, U 0xC3, U 0x2E, U 0xF6, U 0x7E, U 0xD8, U 0x30, U 0xD3, U 0x0F, U 0x6D, U 0x4A, U 0x05, U 0x00, U 0x80, U 0x88, U 0x00, @@ -4431,7 +4562,7 @@ static unsigned char t3fw[30136] = { U 0x08, U 0xC0, U 0xA0, U 0x00, U 0xEE, U 0x32, U 0x2E, U 0x74, U 0x00, U 0x28, U 0x60, U 0x0C, - U 0x19, U 0xE1, U 0x47, U 0x0C, + U 0x19, U 0xE0, U 0xC5, U 0x0C, U 0x8D, U 0x11, U 0xA2, U 0xDD, U 0xA9, U 0x88, U 0xC0, U 0x20, U 0x2C, U 0xD2, U 0x85, U 0x22, @@ -4443,18 +4574,18 @@ static unsigned char t3fw[30136] = { U 0x63, U 0xFF, U 0xB4, U 0x00, U 0xCC, U 0x58, U 0x2A, U 0x6C, U 0x74, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x07, U 0xF1, + U 0x40, U 0x58, U 0x08, U 0x09, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xDA, U 0x60, U 0x58, U 0x09, - U 0xBE, U 0x63, U 0xFF, U 0xE7, + U 0xD8, U 0x63, U 0xFF, U 0xE7, U 0xDD, U 0x40, U 0x2A, U 0x6C, U 0x74, U 0xC0, U 0xB0, U 0xDC, - U 0x70, U 0x58, U 0x08, U 0x65, + U 0x70, U 0x58, U 0x08, U 0x7D, U 0x2E, U 0x30, U 0x08, U 0x8B, U 0x10, U 0x00, U 0xEE, U 0x32, U 0x2E, U 0x74, U 0x00, U 0x28, - U 0x60, U 0x0C, U 0x19, U 0xE1, - U 0x30, U 0x0C, U 0x8D, U 0x11, + U 0x60, U 0x0C, U 0x19, U 0xE0, + U 0xAE, U 0x0C, U 0x8D, U 0x11, U 0xA2, U 0xDD, U 0xA9, U 0x88, U 0xC0, U 0x20, U 0x2C, U 0xD2, U 0x85, U 0x22, U 0x84, U 0xCF, @@ -4473,7 +4604,7 @@ static unsigned char t3fw[30136] = { U 0x02, U 0x2A, U 0x02, U 0x03, U 0x3B, U 0x02, U 0x04, U 0x4C, U 0x02, U 0xC0, U 0xD0, U 0x58, - U 0x00, U 0xBF, U 0xD2, U 0xA0, + U 0x00, U 0xC0, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x29, @@ -4501,7 +4632,7 @@ static unsigned char t3fw[30136] = { U 0x06, U 0x88, U 0x02, U 0x28, U 0x24, U 0x14, U 0x63, U 0xFF, U 0xC7, U 0x29, U 0x20, U 0x15, - U 0x1B, U 0xE0, U 0xFB, U 0x2A, + U 0x1B, U 0xE0, U 0x79, U 0x2A, U 0x20, U 0x0B, U 0xC0, U 0xC0, U 0x9C, U 0x24, U 0x0B, U 0xAA, U 0x09, U 0x2B, U 0xA1, U 0x1C, @@ -4512,10 +4643,10 @@ static unsigned char t3fw[30136] = { U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, U 0x50, U 0xC0, U 0xE0, U 0x58, U 0x08, - U 0x75, U 0xD2, U 0xA0, U 0xD1, + U 0x8F, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xCB, - U 0x55, U 0x13, U 0xE0, U 0xF6, + U 0x55, U 0x13, U 0xE0, U 0x74, U 0x25, U 0x22, U 0x1F, U 0x0D, U 0x46, U 0x11, U 0x06, U 0x55, U 0x0C, U 0xA3, U 0x23, U 0x26, @@ -4533,144 +4664,145 @@ static unsigned char t3fw[30136] = { U 0x24, U 0x4D, U 0xF8, U 0x24, U 0x26, U 0x1E, U 0x63, U 0xFF, U 0xD8, U 0x00, U 0x00, U 0x00, - U 0x6C, U 0x10, U 0x04, U 0x28, - U 0x20, U 0x06, U 0xD6, U 0x20, - U 0x6E, U 0x85, U 0x02, U 0x60, - U 0x00, U 0xDE, U 0x17, U 0xE0, - U 0xD5, U 0x1D, U 0xE0, U 0xDC, - U 0x19, U 0xE0, U 0xD5, U 0xC0, - U 0xC1, U 0xC0, U 0x20, U 0x2A, - U 0x8C, U 0xFC, U 0x64, U 0xA1, - U 0x32, U 0x2B, U 0x61, U 0x02, - U 0xB4, U 0x4E, U 0x0B, U 0x0B, - U 0x4C, U 0x65, U 0xB0, U 0xA8, - U 0x2B, U 0x60, U 0x0C, U 0x2A, - U 0x62, U 0x00, U 0x0C, U 0xB8, - U 0x11, U 0x07, U 0x88, U 0x08, - U 0x2F, U 0x82, U 0x86, U 0x09, - U 0xB9, U 0x0A, U 0x7F, U 0xE3, - U 0x02, U 0x60, U 0x00, U 0x9F, - U 0x29, U 0x92, U 0xA3, U 0x68, - U 0x90, U 0x05, U 0x09, U 0xAA, - U 0x0C, U 0x65, U 0xA0, U 0x93, - U 0x28, U 0x82, U 0x85, U 0x64, - U 0x80, U 0x8D, U 0xB8, U 0x89, - U 0x1B, U 0xE0, U 0xDA, U 0x94, - U 0x81, U 0x9B, U 0x80, U 0x65, - U 0x51, U 0x4D, U 0xC0, U 0xB7, - U 0xB8, U 0x38, U 0xC0, U 0xA1, - U 0xC0, U 0xE0, U 0x09, U 0xAE, - U 0x38, U 0x0E, U 0x0E, U 0x42, - U 0x64, U 0xE0, U 0x48, U 0x1A, - U 0xE0, U 0xB8, U 0x1F, U 0xE0, - U 0xB9, U 0x2F, U 0xA6, U 0x7E, - U 0xB0, U 0x4A, U 0x6D, U 0xAA, + U 0x6C, U 0x10, U 0x04, U 0xD6, + U 0x20, U 0x28, U 0x20, U 0x06, + U 0xC0, U 0x70, U 0x6E, U 0x85, + U 0x02, U 0x60, U 0x00, U 0xD4, + U 0x1D, U 0xE0, U 0x5B, U 0x19, + U 0xE0, U 0x53, U 0x12, U 0xE0, + U 0x51, U 0x2A, U 0x8C, U 0xFC, + U 0x64, U 0xA1, U 0x30, U 0x2B, + U 0x61, U 0x02, U 0xB4, U 0x4C, + U 0x0B, U 0x0B, U 0x4C, U 0x65, + U 0xB0, U 0xA2, U 0x2B, U 0x60, + U 0x0C, U 0x8A, U 0x60, U 0x0C, + U 0xB8, U 0x11, U 0x02, U 0x88, + U 0x08, U 0x2E, U 0x82, U 0x86, + U 0x09, U 0xB9, U 0x0A, U 0x7E, + U 0xC3, U 0x02, U 0x60, U 0x00, + U 0x9A, U 0x29, U 0x92, U 0xA3, + U 0x68, U 0x90, U 0x05, U 0x09, + U 0xAA, U 0x0C, U 0x65, U 0xA0, + U 0x8E, U 0x28, U 0x82, U 0x85, + U 0x64, U 0x80, U 0x88, U 0xB8, + U 0x89, U 0x1B, U 0xE0, U 0x57, + U 0x94, U 0x81, U 0x9B, U 0x80, + U 0x65, U 0x51, U 0x55, U 0xC0, + U 0xB7, U 0xB8, U 0x38, U 0x2A, + U 0x0A, U 0x01, U 0xC0, U 0xC0, + U 0x09, U 0xAC, U 0x38, U 0x0C, + U 0x0C, U 0x42, U 0x64, U 0xC0, + U 0x42, U 0x1F, U 0xE0, U 0x36, + U 0x1E, U 0xE0, U 0x38, U 0x2E, + U 0xF6, U 0x7E, U 0xB0, U 0x4A, + U 0xD3, U 0x0F, U 0x6D, U 0xAA, U 0x05, U 0x00, U 0x80, U 0x88, U 0x00, U 0x90, U 0x8C, U 0xC0, - U 0xA0, U 0x2E, U 0x60, U 0x0C, - U 0x0C, U 0xE8, U 0x11, U 0xA7, - U 0x88, U 0x2F, U 0x82, U 0x85, - U 0xAD, U 0xEE, U 0x0F, U 0x4F, - U 0x0B, U 0x2F, U 0x86, U 0x85, - U 0x2B, U 0x60, U 0x06, U 0x22, - U 0xE4, U 0xCF, U 0x68, U 0xB1, - U 0x2A, U 0x29, U 0x60, U 0x15, - U 0xC0, U 0xB2, U 0xC9, U 0x9A, - U 0xD2, U 0xA0, U 0x2D, U 0x61, - U 0x02, U 0x2B, U 0x64, U 0x06, - U 0x0C, U 0xDD, U 0x02, U 0x2D, - U 0x65, U 0x02, U 0xD1, U 0x0F, - U 0xC0, U 0xE0, U 0x08, U 0xAE, - U 0x38, U 0x7E, U 0xB0, U 0xB7, - U 0x63, U 0xFF, U 0xAB, U 0x00, - U 0x22, U 0x64, U 0x06, U 0xD2, + U 0xA0, U 0x29, U 0x60, U 0x0C, + U 0x0C, U 0x9C, U 0x11, U 0xA2, + U 0xCC, U 0x2B, U 0xC2, U 0x85, + U 0xAD, U 0x99, U 0x0B, U 0x4B, + U 0x0B, U 0x2B, U 0xC6, U 0x85, + U 0x28, U 0x60, U 0x06, U 0x27, + U 0x94, U 0xCF, U 0x68, U 0x81, + U 0x22, U 0x2D, U 0x60, U 0x15, + U 0xD2, U 0xA0, U 0xC9, U 0xD2, + U 0xC0, U 0xE2, U 0x2E, U 0x64, + U 0x06, U 0xD1, U 0x0F, U 0x00, + U 0xC0, U 0xF0, U 0x08, U 0xAF, + U 0x38, U 0x7F, U 0xB0, U 0xBD, + U 0x63, U 0xFF, U 0xB1, U 0x00, + U 0x27, U 0x64, U 0x06, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0xCC, U 0x57, U 0xDA, U 0x60, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x08, U 0x9D, + U 0x40, U 0x58, U 0x08, U 0xB9, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xDA, U 0x60, U 0x58, U 0x09, - U 0x2D, U 0x63, U 0xFF, U 0xE8, + U 0x49, U 0x63, U 0xFF, U 0xE8, U 0x00, U 0x28, U 0x22, U 0x1E, - U 0x29, U 0x22, U 0x1D, U 0x78, - U 0x99, U 0x02, U 0x28, U 0x0A, - U 0x00, U 0xC1, U 0x76, U 0xC1, - U 0xC1, U 0xC1, U 0xD2, U 0x1B, - U 0xE0, U 0xA5, U 0xC1, U 0x24, - U 0xAB, U 0x6B, U 0x64, U 0x80, - U 0x43, U 0x78, U 0x91, U 0x40, - U 0x2A, U 0x80, U 0x00, U 0x0C, - U 0xAF, U 0x0C, U 0x64, U 0xF0, - U 0xAE, U 0x0D, U 0xAE, U 0x0C, - U 0x64, U 0xE0, U 0xA8, U 0x02, - U 0xAF, U 0x0C, U 0x64, U 0xF0, - U 0xA2, U 0x07, U 0xAE, U 0x0C, - U 0x64, U 0xE0, U 0x9C, U 0x2F, - U 0xAC, U 0xE8, U 0x64, U 0xF0, - U 0x96, U 0x2E, U 0xAC, U 0xE7, - U 0x64, U 0xE0, U 0x90, U 0x2F, - U 0xAC, U 0xE6, U 0x64, U 0xF0, - U 0x8A, U 0x2A, U 0x80, U 0x07, - U 0x08, U 0xA8, U 0x0B, U 0x08, - U 0x8A, U 0x02, U 0x7B, U 0x83, - U 0x02, U 0x2A, U 0x8D, U 0xF8, - U 0xD8, U 0xA0, U 0x65, U 0xAF, - U 0xBB, U 0xC0, U 0x90, U 0x60, - U 0x00, U 0x73, U 0x00, U 0x00, + U 0x29, U 0x22, U 0x1D, U 0xD3, + U 0x0F, U 0x78, U 0x99, U 0x01, + U 0xC0, U 0x80, U 0xC1, U 0xD6, + U 0xC1, U 0xC1, U 0x1B, U 0xE0, + U 0x25, U 0xC1, U 0x22, U 0xAB, + U 0x6B, U 0x64, U 0x80, U 0x42, + U 0x78, U 0x91, U 0x3F, U 0x2A, + U 0x80, U 0x00, U 0x0C, U 0xAE, + U 0x0C, U 0x64, U 0xE0, U 0xBB, + U 0x02, U 0xAF, U 0x0C, U 0x64, + U 0xF0, U 0xB5, U 0x2E, U 0xAC, + U 0xEC, U 0x64, U 0xE0, U 0xAF, + U 0x0D, U 0xAF, U 0x0C, U 0x64, + U 0xF0, U 0xA9, U 0x2E, U 0xAC, + U 0xE8, U 0x64, U 0xE0, U 0xA3, + U 0x2F, U 0xAC, U 0xE7, U 0x64, + U 0xF0, U 0x9D, U 0x2E, U 0xAC, + U 0xE6, U 0x64, U 0xE0, U 0x97, + U 0x2F, U 0x80, U 0x07, U 0x08, + U 0xF8, U 0x0B, U 0xDA, U 0x80, + U 0x7B, U 0x83, U 0x02, U 0x2A, + U 0x8D, U 0xF8, U 0xD8, U 0xA0, + U 0x65, U 0xAF, U 0xBC, U 0x28, + U 0x61, U 0x23, U 0x08, U 0xD7, + U 0x39, U 0xD9, U 0x70, U 0x60, + U 0x00, U 0x7B, U 0x00, U 0x00, U 0x2B, U 0x60, U 0x0C, U 0x0C, - U 0xB8, U 0x11, U 0xA7, U 0x88, - U 0x2E, U 0x82, U 0x86, U 0x6E, - U 0xE8, U 0x79, U 0x09, U 0xBA, - U 0x0A, U 0x2A, U 0xA2, U 0xA3, - U 0x68, U 0xA0, U 0x04, U 0x8E, - U 0x60, U 0x7A, U 0xE9, U 0x6B, + U 0xB8, U 0x11, U 0xA2, U 0x88, + U 0x2C, U 0x82, U 0x86, U 0x2A, + U 0x0A, U 0x08, U 0x7C, U 0xAB, + U 0x7E, U 0x09, U 0xBA, U 0x0A, + U 0x2A, U 0xA2, U 0xA3, U 0x68, + U 0xA0, U 0x05, U 0x2C, U 0x62, + U 0x00, U 0x7A, U 0xC9, U 0x6F, U 0x2A, U 0x82, U 0x85, U 0x64, - U 0xA0, U 0x65, U 0x1F, U 0xE0, - U 0x8D, U 0xC0, U 0xE3, U 0x2E, - U 0x64, U 0x06, U 0x9E, U 0xA1, - U 0x9F, U 0xA0, U 0x1F, U 0xE0, - U 0xB9, U 0x2E, U 0x60, U 0x0A, - U 0x92, U 0xA3, U 0x0F, U 0xEE, - U 0x02, U 0x9E, U 0xA2, U 0x8E, - U 0x60, U 0x0F, U 0xEE, U 0x02, - U 0x9E, U 0xA4, U 0x2F, U 0x60, - U 0x14, U 0x7A, U 0xFF, U 0x47, - U 0x22, U 0xA4, U 0x17, U 0xAD, - U 0xBE, U 0x2F, U 0x82, U 0x85, - U 0x22, U 0xE4, U 0xCF, U 0x2F, - U 0xFC, U 0x18, U 0x2F, U 0x86, - U 0x85, U 0x63, U 0xFE, U 0x70, - U 0x2A, U 0x6C, U 0x74, U 0xC0, - U 0xB1, U 0xDC, U 0x90, U 0xDD, - U 0x40, U 0x58, U 0x07, U 0xA3, - U 0x1D, U 0xE0, U 0x72, U 0xC0, - U 0xC1, U 0x63, U 0xFE, U 0xC4, + U 0xA0, U 0x69, U 0x1F, U 0xE0, + U 0x0B, U 0x27, U 0x65, U 0x04, + U 0xC0, U 0xE3, U 0xC0, U 0xC4, + U 0x2E, U 0x64, U 0x06, U 0x9C, + U 0xA1, U 0x1C, U 0xE0, U 0x36, + U 0x9F, U 0xA0, U 0x2E, U 0x60, + U 0x0A, U 0x97, U 0xA3, U 0x0C, + U 0xEE, U 0x02, U 0x9E, U 0xA2, + U 0x8F, U 0x60, U 0x0C, U 0xFF, + U 0x02, U 0x9F, U 0xA4, U 0x2E, + U 0x60, U 0x14, U 0x7A, U 0xEF, + U 0x46, U 0x27, U 0xA4, U 0x17, + U 0xAD, U 0xBC, U 0x2F, U 0x82, + U 0x85, U 0x27, U 0xC4, U 0xCF, + U 0x2F, U 0xFC, U 0x20, U 0x2F, + U 0x86, U 0x85, U 0x63, U 0xFE, + U 0x69, U 0x2A, U 0x6C, U 0x74, + U 0xC0, U 0xB1, U 0xDC, U 0x90, + U 0xDD, U 0x40, U 0x58, U 0x07, + U 0xBA, U 0x1D, U 0xDF, U 0xEE, + U 0x63, U 0xFE, U 0xC1, U 0x00, U 0xD9, U 0xA0, U 0xDA, U 0x60, - U 0xDB, U 0x30, U 0xDC, U 0x40, - U 0xDD, U 0x50, U 0xC2, U 0xF0, - U 0xC1, U 0xE0, U 0x09, U 0xFE, - U 0x39, U 0x58, U 0x07, U 0xEA, + U 0xDB, U 0x30, U 0xC2, U 0xD0, + U 0xC1, U 0xE0, U 0xDC, U 0x40, + U 0x09, U 0xDE, U 0x39, U 0xDD, + U 0x50, U 0x58, U 0x08, U 0x03, U 0xD2, U 0xA0, U 0xD1, U 0x0F, - U 0xDA, U 0x60, U 0x58, U 0x08, - U 0xEF, U 0x63, U 0xFE, U 0xF0, - U 0x2C, U 0xA4, U 0x17, U 0x0D, - U 0xBE, U 0x08, U 0x29, U 0x82, - U 0x85, U 0x22, U 0xE4, U 0xCF, - U 0x29, U 0x9C, U 0x18, U 0x29, - U 0x86, U 0x85, U 0x64, U 0x50, - U 0x0C, U 0x2A, U 0x6C, U 0x74, - U 0x04, U 0x4B, U 0x02, U 0x58, - U 0x01, U 0x6B, U 0xD2, U 0xA0, - U 0xD1, U 0x0F, U 0xC0, U 0x20, - U 0xD1, U 0x0F, U 0x00, U 0x00, + U 0xDA, U 0x60, U 0x58, U 0x09, + U 0x08, U 0x63, U 0xFE, U 0xE4, + U 0x29, U 0x0A, U 0x01, U 0x29, + U 0xA4, U 0x17, U 0x0D, U 0xBF, + U 0x08, U 0x2E, U 0x82, U 0x85, + U 0x27, U 0xF4, U 0xCF, U 0x2E, + U 0xEC, U 0x20, U 0x2E, U 0x86, + U 0x85, U 0x64, U 0x50, U 0x0B, + U 0x2A, U 0x6C, U 0x74, U 0xDB, + U 0x40, U 0x58, U 0x01, U 0x7C, + U 0xD2, U 0xA0, U 0xD1, U 0x0F, + U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x06, U 0x2B, U 0x22, U 0x1E, U 0x28, U 0x22, U 0x1D, U 0x93, U 0x10, U 0x7B, U 0x89, U 0x01, U 0xC0, U 0xB0, U 0xC0, U 0xC9, U 0xC0, U 0x3B, U 0xC1, U 0xF2, U 0x04, U 0x06, - U 0x40, U 0x1D, U 0xE0, U 0x5B, + U 0x40, U 0x1D, U 0xDF, U 0xD8, U 0xC0, U 0xE2, U 0xC0, U 0x74, U 0x07, U 0x47, U 0x01, U 0x0E, U 0x4E, U 0x01, U 0xAD, U 0x2D, @@ -4711,7 +4843,7 @@ static unsigned char t3fw[30136] = { U 0x10, U 0x7C, U 0xB1, U 0x21, U 0x7A, U 0xB9, U 0x01, U 0xC0, U 0xB0, U 0xC9, U 0xB9, U 0x13, - U 0xE0, U 0x26, U 0xDA, U 0x20, + U 0xDF, U 0xA3, U 0xDA, U 0x20, U 0x28, U 0xB0, U 0x00, U 0x2C, U 0xB0, U 0x07, U 0x03, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, @@ -4729,13 +4861,13 @@ static unsigned char t3fw[30136] = { U 0x0E, U 0x1E, U 0x50, U 0x65, U 0xE1, U 0x9E, U 0x29, U 0x21, U 0x02, U 0xC0, U 0xC1, U 0x16, - U 0xE0, U 0x15, U 0x09, U 0x0B, + U 0xDF, U 0x92, U 0x09, U 0x0B, U 0x4C, U 0x65, U 0xB0, U 0x90, U 0x8A, U 0x30, U 0x0A, U 0x6E, U 0x51, U 0x68, U 0xE3, U 0x02, U 0x60, U 0x00, U 0x85, U 0x2F, - U 0x62, U 0x9E, U 0x1B, U 0xE0, - U 0x0E, U 0x6E, U 0xF8, U 0x53, + U 0x62, U 0x9E, U 0x1B, U 0xDF, + U 0x8B, U 0x6E, U 0xF8, U 0x53, U 0x2B, U 0xB2, U 0x26, U 0x68, U 0xB0, U 0x05, U 0x2E, U 0x22, U 0x00, U 0x7B, U 0xE9, U 0x47, @@ -4746,32 +4878,32 @@ static unsigned char t3fw[30136] = { U 0x11, U 0xA6, U 0xFF, U 0x29, U 0xF2, U 0x86, U 0x9E, U 0x12, U 0x79, U 0x8B, U 0x41, U 0x17, - U 0xE0, U 0x05, U 0x07, U 0xB7, + U 0xDF, U 0x82, U 0x07, U 0xB7, U 0x0A, U 0x27, U 0x72, U 0xA3, U 0x68, U 0x70, U 0x04, U 0x88, U 0x20, U 0x77, U 0x89, U 0x30, U 0x29, U 0xF2, U 0x85, U 0xDF, U 0x90, U 0xD7, U 0x90, U 0x65, U 0x90, U 0x65, U 0x2A, U 0x21, - U 0x04, U 0x19, U 0xE0, U 0x3C, + U 0x04, U 0x19, U 0xDF, U 0xB9, U 0x7A, U 0x9B, U 0x22, U 0xDA, - U 0x20, U 0x58, U 0x06, U 0x9F, + U 0x20, U 0x58, U 0x06, U 0xB6, U 0x60, U 0x00, U 0x29, U 0x00, U 0x2C, U 0x21, U 0x04, U 0x1B, - U 0xE0, U 0x38, U 0x7C, U 0xBB, + U 0xDF, U 0xB5, U 0x7C, U 0xBB, U 0x18, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x06, U 0x9A, + U 0xB6, U 0x58, U 0x06, U 0xB1, U 0xC9, U 0x58, U 0x60, U 0x01, U 0x4C, U 0xC0, U 0x90, U 0x63, U 0xFF, U 0xCC, U 0xDA, U 0x20, - U 0x58, U 0x08, U 0x7F, U 0x60, + U 0x58, U 0x08, U 0x98, U 0x60, U 0x00, U 0x06, U 0xDA, U 0x20, U 0xC0, U 0xB6, U 0x58, U 0x08, - U 0x7D, U 0x65, U 0x51, U 0x35, + U 0x96, U 0x65, U 0x51, U 0x35, U 0xDC, U 0x40, U 0xDB, U 0x30, U 0x8D, U 0x30, U 0xDA, U 0x20, U 0x0D, U 0x6D, U 0x51, U 0x58, - U 0x06, U 0xF2, U 0xC0, U 0xD0, + U 0x07, U 0x09, U 0xC0, U 0xD0, U 0xD3, U 0xA0, U 0x64, U 0xA1, U 0x20, U 0x29, U 0x21, U 0x02, U 0xC0, U 0x51, U 0x84, U 0xA1, @@ -4789,11 +4921,11 @@ static unsigned char t3fw[30136] = { U 0xBB, U 0x15, U 0x9F, U 0x13, U 0x9E, U 0x14, U 0x8A, U 0x10, U 0x8B, U 0x11, U 0x58, U 0x07, - U 0x02, U 0x8E, U 0x14, U 0x8F, + U 0x19, U 0x8E, U 0x14, U 0x8F, U 0x13, U 0xC0, U 0xD0, U 0x2D, U 0x24, U 0x66, U 0x8A, U 0x30, U 0xC0, U 0x92, U 0xC1, U 0xC8, - U 0x1B, U 0xDF, U 0xEC, U 0x7F, + U 0x1B, U 0xDF, U 0x68, U 0x7F, U 0xA6, U 0x09, U 0x9B, U 0xF0, U 0x99, U 0xF1, U 0x2C, U 0xF4, U 0x08, U 0x27, U 0xFC, U 0x10, @@ -4802,8 +4934,8 @@ static unsigned char t3fw[30136] = { U 0x51, U 0xC0, U 0x80, U 0x07, U 0x58, U 0x38, U 0x08, U 0x08, U 0x42, U 0x64, U 0x80, U 0x67, - U 0x18, U 0xDF, U 0xC8, U 0x19, - U 0xDF, U 0xC9, U 0x29, U 0x86, + U 0x18, U 0xDF, U 0x45, U 0x19, + U 0xDF, U 0x46, U 0x29, U 0x86, U 0x7E, U 0x6A, U 0x42, U 0x0A, U 0xD3, U 0x0F, U 0x6D, U 0xE9, U 0x05, U 0x00, U 0xA0, U 0x88, @@ -4814,7 +4946,7 @@ static unsigned char t3fw[30136] = { U 0x0B, U 0x2C, U 0x94, U 0x08, U 0x9B, U 0x90, U 0x9F, U 0x91, U 0x2F, U 0x20, U 0x0C, U 0x12, - U 0xDF, U 0xC8, U 0x0C, U 0xF8, + U 0xDF, U 0x45, U 0x0C, U 0xF8, U 0x11, U 0xA6, U 0x88, U 0x29, U 0x82, U 0x85, U 0xA2, U 0xFF, U 0x2D, U 0xF4, U 0xCF, U 0xD2, @@ -4822,7 +4954,7 @@ static unsigned char t3fw[30136] = { U 0x23, U 0x86, U 0x85, U 0xD1, U 0x0F, U 0x22, U 0x20, U 0x0C, U 0x89, U 0x12, U 0x18, U 0xDF, - U 0xC0, U 0x0C, U 0x2B, U 0x11, + U 0x3D, U 0x0C, U 0x2B, U 0x11, U 0xA6, U 0xBB, U 0xA8, U 0x22, U 0x2D, U 0x24, U 0xCF, U 0x2C, U 0xB2, U 0x85, U 0xD2, U 0xA0, @@ -4842,191 +4974,209 @@ static unsigned char t3fw[30136] = { U 0x9E, U 0x14, U 0x2A, U 0x2C, U 0x74, U 0xC0, U 0xB1, U 0xDC, U 0x70, U 0xDD, U 0x40, U 0x58, - U 0x06, U 0xDD, U 0x8E, U 0x14, + U 0x06, U 0xF4, U 0x8E, U 0x14, U 0xC0, U 0xD0, U 0x1B, U 0xDF, - U 0xB9, U 0xC1, U 0xC8, U 0x63, + U 0x35, U 0xC1, U 0xC8, U 0x63, U 0xFF, U 0x6A, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x28, - U 0x21, U 0x02, U 0x16, U 0xDF, - U 0x9D, U 0x08, U 0x08, U 0x4C, - U 0x65, U 0x82, U 0x19, U 0x29, - U 0x62, U 0x9E, U 0x6F, U 0x98, - U 0x02, U 0x60, U 0x02, U 0x20, - U 0x19, U 0xDF, U 0x98, U 0x29, - U 0x92, U 0x26, U 0x68, U 0x90, - U 0x07, U 0x8A, U 0x20, U 0x09, - U 0xAA, U 0x0C, U 0x65, U 0xA2, - U 0x0F, U 0x27, U 0x62, U 0x9D, - U 0xC0, U 0xCC, U 0x64, U 0x72, - U 0x07, U 0x2B, U 0x21, U 0x04, - U 0x8E, U 0x31, U 0xC0, U 0xA0, - U 0xDD, U 0xA0, U 0x0E, U 0xFE, - U 0x50, U 0x0E, U 0xCD, U 0x38, - U 0x6E, U 0xB8, U 0x10, U 0x2C, - U 0x20, U 0x66, U 0xB1, U 0xCC, - U 0x0C, U 0x0C, U 0x47, U 0x2C, - U 0x24, U 0x66, U 0x7C, U 0xDB, - U 0x02, U 0x60, U 0x01, U 0xEF, - U 0xC0, U 0xC1, U 0x29, U 0x30, - U 0x08, U 0x1B, U 0xDF, U 0x8A, - U 0x64, U 0x90, U 0x9C, U 0x2F, - U 0x0A, U 0xFF, U 0xC0, U 0xD3, - U 0xB0, U 0x9E, U 0x64, U 0xE1, - U 0x02, U 0x68, U 0x92, U 0x13, - U 0x64, U 0x50, U 0x88, U 0x2A, + U 0x21, U 0x02, U 0x17, U 0xDF, + U 0x1A, U 0x08, U 0x08, U 0x4C, + U 0x65, U 0x82, U 0x49, U 0x29, + U 0x72, U 0x9E, U 0x6F, U 0x98, + U 0x02, U 0x60, U 0x02, U 0x50, + U 0x19, U 0xDF, U 0x15, U 0x2A, + U 0x92, U 0x26, U 0x68, U 0xA0, + U 0x07, U 0x8B, U 0x20, U 0x0A, + U 0xBB, U 0x0C, U 0x65, U 0xB2, + U 0x3F, U 0x2A, U 0x72, U 0x9D, + U 0xC0, U 0xCC, U 0x64, U 0xA2, + U 0x37, U 0x1D, U 0xDF, U 0x11, + U 0xC0, U 0x60, U 0x2B, U 0x30, + U 0x08, U 0xC0, U 0xF1, U 0x64, + U 0xB0, U 0x71, U 0x2E, U 0x0A, + U 0xFF, U 0xB0, U 0xB8, U 0x64, + U 0x81, U 0x51, U 0x2D, U 0xBC, + U 0xFE, U 0x64, U 0xD0, U 0xF3, + U 0x64, U 0x50, U 0x5C, U 0x2A, U 0x2C, U 0x74, U 0x04, U 0x4B, - U 0x02, U 0x58, U 0x00, U 0x93, + U 0x02, U 0x58, U 0x00, U 0xAD, U 0x0A, U 0xA2, U 0x02, U 0x06, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x2B, U 0x20, U 0x0C, U 0x27, - U 0x21, U 0x04, U 0x0C, U 0xBC, - U 0x11, U 0xA6, U 0xCC, U 0x29, - U 0xC2, U 0x86, U 0x28, U 0x0A, - U 0x08, U 0x79, U 0x83, U 0x02, - U 0x60, U 0x01, U 0xB9, U 0x19, - U 0xDF, U 0x7A, U 0x09, U 0xB9, - U 0x0A, U 0x29, U 0x92, U 0xA3, - U 0x68, U 0x90, U 0x08, U 0x2E, - U 0x22, U 0x00, U 0x09, U 0xEE, - U 0x0C, U 0x65, U 0xE1, U 0xA4, - U 0x2E, U 0xC2, U 0x85, U 0x64, - U 0xE1, U 0x9E, U 0x26, U 0x20, - U 0x07, U 0x13, U 0xDF, U 0x83, - U 0x6E, U 0x7B, U 0x02, U 0x60, - U 0x01, U 0x9A, U 0x17, U 0xDF, - U 0x7A, U 0x1F, U 0xDF, U 0x83, - U 0x19, U 0xDF, U 0xB0, U 0xC0, - U 0xD2, U 0x28, U 0x20, U 0x0A, - U 0x93, U 0xE0, U 0x9D, U 0xE1, - U 0xA9, U 0x69, U 0x0F, U 0x88, - U 0x02, U 0x98, U 0xE2, U 0x2F, - U 0x90, U 0x80, U 0x2A, U 0x94, - U 0x80, U 0xB1, U 0xFF, U 0x07, - U 0xFF, U 0x02, U 0x9F, U 0xE3, - U 0x2E, U 0xC2, U 0x85, U 0x1F, - U 0xDF, U 0x6D, U 0x0E, U 0xDE, - U 0x0B, U 0xAF, U 0xBF, U 0x2A, - U 0xF4, U 0xCF, U 0x2E, U 0xC6, - U 0x85, U 0x65, U 0x5F, U 0x76, + U 0x00, U 0x1A, U 0xDF, U 0x15, + U 0x2C, U 0x20, U 0x07, U 0x6E, + U 0xBB, U 0x02, U 0x60, U 0x02, + U 0x22, U 0x18, U 0xDF, U 0x0B, + U 0x13, U 0xDF, U 0x15, U 0x1B, + U 0xDF, U 0x41, U 0xC0, U 0xE2, + U 0x29, U 0x20, U 0x0A, U 0x9A, + U 0xD0, U 0x9E, U 0xD1, U 0xAB, + U 0xCB, U 0x03, U 0x99, U 0x02, + U 0x99, U 0xD2, U 0x23, U 0xB0, + U 0x80, U 0x26, U 0xB4, U 0x80, + U 0xB1, U 0x33, U 0x08, U 0x33, + U 0x02, U 0x93, U 0xD3, U 0x18, + U 0xDE, U 0xFF, U 0x0C, U 0xFD, + U 0x11, U 0xA7, U 0xDD, U 0x2C, + U 0xD2, U 0x85, U 0xA8, U 0xF8, + U 0x26, U 0x84, U 0xCF, U 0x0C, + U 0xEC, U 0x0B, U 0x2C, U 0xD6, + U 0x85, U 0x65, U 0x5F, U 0xA2, U 0xC0, U 0x20, U 0xD1, U 0x0F, - U 0x28, U 0x30, U 0x10, U 0x29, - U 0x30, U 0x11, U 0x2E, U 0x30, - U 0x13, U 0x00, U 0x99, U 0x32, - U 0x00, U 0xED, U 0x32, U 0x64, - U 0x80, U 0xEE, U 0x2A, U 0x30, - U 0x14, U 0x1F, U 0xDF, U 0x9D, - U 0x00, U 0xAA, U 0x32, U 0x78, - U 0xEF, U 0x05, U 0x0F, U 0x9E, - U 0x09, U 0x2D, U 0xE4, U 0x7F, - U 0x1E, U 0xDF, U 0x9B, U 0x66, - U 0xA0, U 0x05, U 0x0F, U 0x98, - U 0x09, U 0x2A, U 0x84, U 0x80, - U 0xB4, U 0xA7, U 0x18, U 0xDF, - U 0x98, U 0xC7, U 0x6F, U 0x00, - U 0x91, U 0x04, U 0xAE, U 0x9E, - U 0xDD, U 0xE0, U 0x00, U 0xAF, - U 0x1A, U 0x00, U 0xC3, U 0x1A, - U 0x6E, U 0xE1, U 0x05, U 0x2D, - U 0xB2, U 0x00, U 0x0D, U 0xED, - U 0x0C, U 0x1E, U 0xDF, U 0x92, - U 0x08, U 0xD8, U 0x1C, U 0x06, - U 0x33, U 0x03, U 0xAE, U 0x88, - U 0x2A, U 0x84, U 0x8B, U 0x2E, - U 0xB0, U 0x2E, U 0x27, U 0x84, - U 0x8C, U 0x03, U 0xEE, U 0x01, - U 0x0F, U 0xEE, U 0x02, U 0x2E, - U 0xB4, U 0x2E, U 0x58, U 0x01, - U 0x8F, U 0x63, U 0xFE, U 0xFF, + U 0x2B, U 0x21, U 0x04, U 0x88, + U 0x31, U 0xDE, U 0x60, U 0x08, + U 0xF8, U 0x50, U 0x08, U 0xCE, + U 0x38, U 0x6E, U 0xB8, U 0x10, + U 0x2C, U 0x20, U 0x66, U 0xB1, + U 0xCC, U 0x0C, U 0x0C, U 0x47, + U 0x2C, U 0x24, U 0x66, U 0x7C, + U 0xEB, U 0x02, U 0x60, U 0x01, + U 0xAF, U 0x2E, U 0x30, U 0x10, + U 0x29, U 0x30, U 0x11, U 0x2C, + U 0x30, U 0x13, U 0x00, U 0x99, + U 0x32, U 0x00, U 0xCB, U 0x32, + U 0x64, U 0xE1, U 0x45, U 0x2A, + U 0x30, U 0x14, U 0x1E, U 0xDF, + U 0x25, U 0x00, U 0xAA, U 0x32, + U 0x78, U 0xCF, U 0x05, U 0x0E, + U 0x9C, U 0x09, U 0x2B, U 0xC4, + U 0x7F, U 0x1C, U 0xDF, U 0x22, + U 0x66, U 0xA0, U 0x05, U 0x0E, + U 0x98, U 0x09, U 0x2A, U 0x84, + U 0x80, U 0xB4, U 0xA7, U 0x18, + U 0xDF, U 0x20, U 0xC7, U 0x6F, + U 0x00, U 0x91, U 0x04, U 0xAC, + U 0x9C, U 0xDB, U 0xC0, U 0x00, + U 0xAE, U 0x1A, U 0x00, U 0xF3, + U 0x1A, U 0x6E, U 0xC1, U 0x04, + U 0x8B, U 0xD0, U 0x0B, U 0xCB, + U 0x0C, U 0x1C, U 0xDF, U 0x1A, + U 0x08, U 0xB8, U 0x1C, U 0x06, + U 0x33, U 0x03, U 0xAC, U 0x88, + U 0x2A, U 0x84, U 0x8B, U 0x2C, + U 0xD0, U 0x2E, U 0x27, U 0x84, + U 0x8C, U 0x03, U 0xCC, U 0x01, + U 0x0E, U 0xCC, U 0x02, U 0x2C, + U 0xD4, U 0x2E, U 0x58, U 0x01, + U 0xAD, U 0x63, U 0xFF, U 0x0B, + U 0x2F, U 0x20, U 0x0C, U 0x0C, + U 0xFB, U 0x11, U 0xA7, U 0xBB, + U 0x2D, U 0xB2, U 0x86, U 0xC0, + U 0x98, U 0x7D, U 0x93, U 0x02, + U 0x60, U 0x01, U 0x21, U 0x19, + U 0xDE, U 0xC8, U 0x09, U 0xF9, + U 0x0A, U 0x29, U 0x92, U 0xA3, + U 0x68, U 0x90, U 0x08, U 0x2D, + U 0x22, U 0x00, U 0x09, U 0xDD, + U 0x0C, U 0x65, U 0xD1, U 0x0C, + U 0x2D, U 0xB2, U 0x85, U 0xDE, + U 0x60, U 0x64, U 0xD1, U 0x04, + U 0x88, U 0x31, U 0x2B, U 0x21, + U 0x04, U 0x08, U 0xF8, U 0x50, + U 0x08, U 0xCE, U 0x38, U 0x6F, + U 0xB8, U 0x02, U 0x63, U 0xFE, + U 0xDF, U 0x2C, U 0x20, U 0x66, + U 0xB1, U 0xCC, U 0x0C, U 0x0C, + U 0x47, U 0x2C, U 0x24, U 0x66, + U 0x7C, U 0xE3, U 0x02, U 0x63, + U 0xFE, U 0xCE, U 0x9D, U 0x10, + U 0x60, U 0x01, U 0x31, U 0x00, U 0x29, U 0x31, U 0x08, U 0x29, U 0x25, U 0x04, U 0x28, U 0x30, - U 0x14, U 0x2E, U 0x31, U 0x09, - U 0xB0, U 0x88, U 0x64, U 0x80, - U 0xA3, U 0x2E, U 0x24, U 0x0A, - U 0xC0, U 0x81, U 0x2E, U 0x30, - U 0x16, U 0x2C, U 0xB4, U 0x23, - U 0x2E, U 0x24, U 0x0B, U 0xB4, - U 0xEF, U 0x2F, U 0x24, U 0x0C, - U 0x8C, U 0x37, U 0x8B, U 0x36, + U 0x14, U 0xB0, U 0x88, U 0x64, + U 0x80, U 0xA6, U 0x2B, U 0x31, + U 0x09, U 0x2B, U 0x24, U 0x0A, + U 0xC0, U 0x81, U 0x2B, U 0x30, + U 0x16, U 0x2F, U 0xD4, U 0x23, + U 0x2B, U 0x24, U 0x0B, U 0xB4, + U 0xBC, U 0x2C, U 0x24, U 0x0C, + U 0x8D, U 0x37, U 0x8B, U 0x36, U 0x29, U 0x25, U 0x04, U 0xDE, - U 0xB0, U 0xDF, U 0xC0, U 0x0C, - U 0x8F, U 0x39, U 0x0B, U 0x8E, - U 0x39, U 0x0F, U 0xEE, U 0x02, - U 0x64, U 0xEE, U 0xC4, U 0x08, - U 0x9F, U 0x11, U 0x01, U 0xC4, - U 0x04, U 0x8D, U 0x38, U 0x0C, - U 0xB8, U 0x18, U 0x00, U 0xC4, - U 0x04, U 0x0C, U 0xBE, U 0x18, - U 0x00, U 0xEE, U 0x11, U 0x0E, - U 0xDD, U 0x02, U 0xC0, U 0xE3, - U 0x0E, U 0xFF, U 0x02, U 0x1E, - U 0xDF, U 0x66, U 0x9F, U 0x71, - U 0x9E, U 0x70, U 0x1E, U 0xDF, - U 0x65, U 0x8F, U 0x20, U 0x98, - U 0x73, U 0x9D, U 0x74, U 0x05, - U 0xFF, U 0x11, U 0x0B, U 0xCD, - U 0x53, U 0xC1, U 0x80, U 0x98, - U 0x75, U 0x0F, U 0xDD, U 0x02, - U 0x0E, U 0xDD, U 0x02, U 0x9D, - U 0x72, U 0x1E, U 0xDF, U 0x24, - U 0x2A, U 0x24, U 0x66, U 0x2F, - U 0x62, U 0x9D, U 0x2A, U 0xE4, - U 0xA2, U 0x2F, U 0xFC, U 0x18, - U 0x2F, U 0x66, U 0x9D, U 0x63, - U 0xFE, U 0x71, U 0x00, U 0x00, - U 0x00, U 0x2F, U 0x30, U 0x12, - U 0x1B, U 0xDF, U 0x66, U 0x00, - U 0xFA, U 0x32, U 0x78, U 0xFF, - U 0x05, U 0x0B, U 0x98, U 0x0B, - U 0x2A, U 0x84, U 0x7F, U 0x66, - U 0xD0, U 0x05, U 0x0B, U 0x9A, - U 0x0B, U 0x2D, U 0xA4, U 0x80, + U 0xD0, U 0x0D, U 0x8E, U 0x39, + U 0xDC, U 0xB0, U 0x0B, U 0x8C, + U 0x39, U 0x0E, U 0xCC, U 0x02, + U 0x64, U 0xCE, U 0x78, U 0x08, + U 0x9C, U 0x11, U 0x01, U 0xC4, + U 0x04, U 0x8F, U 0x38, U 0x0D, + U 0xBE, U 0x18, U 0x00, U 0xC4, + U 0x04, U 0x0D, U 0xB8, U 0x18, + U 0x00, U 0x88, U 0x11, U 0x08, + U 0xFF, U 0x02, U 0xC0, U 0x83, + U 0x08, U 0xCC, U 0x02, U 0x18, + U 0xDE, U 0xD8, U 0x9C, U 0xA1, + U 0x98, U 0xA0, U 0x18, U 0xDE, + U 0xD7, U 0x8C, U 0x20, U 0x9E, + U 0xA3, U 0x9F, U 0xA4, U 0x05, + U 0xCC, U 0x11, U 0x0B, U 0xCF, + U 0x53, U 0xC1, U 0xE0, U 0x9E, + U 0xA5, U 0x0C, U 0xFF, U 0x02, + U 0x08, U 0xFF, U 0x02, U 0x9F, + U 0xA2, U 0x18, U 0xDE, U 0x96, + U 0x26, U 0x24, U 0x66, U 0x2C, + U 0x72, U 0x9D, U 0x26, U 0x84, + U 0xA2, U 0x2C, U 0xCC, U 0x18, + U 0x2C, U 0x76, U 0x9D, U 0x63, + U 0xFE, U 0x25, U 0x00, U 0x00, + U 0x00, U 0x2D, U 0x30, U 0x12, + U 0x1C, U 0xDE, U 0xD8, U 0x00, + U 0xDA, U 0x32, U 0x78, U 0xDF, + U 0x05, U 0x0C, U 0x9E, U 0x0B, + U 0x2A, U 0xE4, U 0x7F, U 0x66, + U 0xB0, U 0x05, U 0x0C, U 0x9F, + U 0x0B, U 0x2B, U 0xF4, U 0x80, U 0x2A, U 0x30, U 0x11, U 0x00, - U 0xAA, U 0x32, U 0x63, U 0xFF, - U 0x44, U 0x2F, U 0x24, U 0x0A, - U 0x9E, U 0x2B, U 0x63, U 0xFF, - U 0x56, U 0xCC, U 0x57, U 0xDA, + U 0xAA, U 0x32, U 0x63, U 0xFE, + U 0xEC, U 0x2E, U 0x24, U 0x0A, + U 0x2B, U 0x31, U 0x09, U 0x9B, + U 0x2B, U 0x63, U 0xFF, U 0x53, + U 0x00, U 0xCC, U 0x57, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x07, U 0x0E, + U 0x40, U 0x58, U 0x07, U 0x1B, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0xDA, U 0x20, U 0xC0, - U 0xB6, U 0x58, U 0x07, U 0x9D, + U 0xB6, U 0x58, U 0x07, U 0xAA, U 0x63, U 0xFF, U 0xE5, U 0x00, - U 0xDA, U 0x70, U 0x58, U 0x06, - U 0x36, U 0xC0, U 0xA0, U 0x2A, - U 0x24, U 0x66, U 0x63, U 0xFE, - U 0x02, U 0xDA, U 0x20, U 0x58, - U 0x07, U 0x98, U 0x63, U 0xFF, - U 0xCF, U 0xB1, U 0x69, U 0x28, - U 0x20, U 0x0A, U 0x86, U 0x20, - U 0x09, U 0x09, U 0x47, U 0x99, - U 0x11, U 0x29, U 0x24, U 0x07, - U 0x98, U 0x10, U 0x7F, U 0x81, - U 0x26, U 0x93, U 0xE0, U 0x27, - U 0xE5, U 0x0A, U 0x9A, U 0xE3, - U 0x88, U 0x10, U 0x9D, U 0xE1, - U 0x19, U 0xDF, U 0x42, U 0x8D, - U 0x11, U 0x09, U 0x6F, U 0x02, - U 0x9F, U 0xE4, U 0x2D, U 0xE4, - U 0x16, U 0x09, U 0x88, U 0x02, - U 0xC0, U 0xD3, U 0x98, U 0xE2, - U 0x2A, U 0x24, U 0x07, U 0x63, - U 0xFE, U 0x51, U 0x00, U 0x00, - U 0x1D, U 0xDF, U 0x0B, U 0x08, - U 0x68, U 0x11, U 0x8F, U 0x11, - U 0x89, U 0x2B, U 0x93, U 0xE0, - U 0x08, U 0xFF, U 0x02, U 0xC0, - U 0x8F, U 0x9F, U 0xE5, U 0x0D, - U 0x99, U 0x02, U 0x99, U 0xE2, - U 0x04, U 0x7F, U 0x11, U 0xC0, - U 0xD4, U 0x9D, U 0xE1, U 0x08, - U 0xFF, U 0x02, U 0x9F, U 0xE4, - U 0x63, U 0xFF, U 0xD0, U 0x00, + U 0x00, U 0xDB, U 0xF0, U 0xDA, + U 0x20, U 0x58, U 0x07, U 0xA7, + U 0x63, U 0xFF, U 0xD9, U 0x00, + U 0x00, U 0x58, U 0x06, U 0x3E, + U 0x1D, U 0xDE, U 0x7D, U 0xC0, + U 0xF1, U 0x26, U 0x24, U 0x66, + U 0x63, U 0xFE, U 0x41, U 0x00, + U 0x8B, U 0x20, U 0x28, U 0x0A, + U 0xFF, U 0xB1, U 0xCE, U 0x23, + U 0x20, U 0x0A, U 0x2C, U 0x21, + U 0x04, U 0x0E, U 0x0E, U 0x47, + U 0x2E, U 0x24, U 0x07, U 0x78, + U 0x31, U 0x35, U 0x9A, U 0xD0, + U 0x2C, U 0xD5, U 0x0A, U 0x96, + U 0xD3, U 0x19, U 0xDE, U 0xB1, + U 0x2E, U 0xD4, U 0x16, U 0xC0, + U 0x83, U 0x98, U 0xD1, U 0xC0, + U 0xE3, U 0x09, U 0xB8, U 0x02, + U 0x98, U 0xD4, U 0x09, U 0x39, + U 0x02, U 0x99, U 0xD2, U 0x26, + U 0x24, U 0x07, U 0x63, U 0xFD, + U 0xC9, U 0x58, U 0x06, U 0x2C, + U 0x8D, U 0x10, U 0x26, U 0x24, + U 0x66, U 0x2B, U 0x21, U 0x04, + U 0x2F, U 0x20, U 0x0C, U 0x63, + U 0xFD, U 0x86, U 0x00, U 0x00, + U 0x08, U 0xB8, U 0x11, U 0x19, + U 0xDE, U 0x75, U 0x08, U 0xEE, + U 0x02, U 0x88, U 0x2B, U 0x9E, + U 0xD5, U 0x9A, U 0xD0, U 0xC0, + U 0xEF, U 0x09, U 0x88, U 0x02, + U 0x98, U 0xD2, U 0x04, U 0xC9, + U 0x11, U 0x0E, U 0x99, U 0x02, + U 0x99, U 0xD4, U 0xC0, U 0xE4, + U 0x9E, U 0xD1, U 0x63, U 0xFF, + U 0xC1, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x85, U 0x21, U 0x0D, U 0x38, U 0x11, - U 0x14, U 0xDE, U 0xE9, U 0x86, + U 0x14, U 0xDE, U 0x54, U 0x86, U 0x22, U 0xA4, U 0x24, U 0x08, U 0x66, U 0x0C, U 0x96, U 0x22, U 0x05, U 0x33, U 0x0B, U 0x93, @@ -5040,12 +5190,12 @@ static unsigned char t3fw[30136] = { U 0x21, U 0x63, U 0xFF, U 0xE3, U 0x6C, U 0x10, U 0x0A, U 0xD6, U 0x20, U 0x94, U 0x18, U 0x17, - U 0xDE, U 0xDE, U 0xD9, U 0x30, + U 0xDE, U 0x49, U 0xD9, U 0x30, U 0xB8, U 0x38, U 0x98, U 0x19, U 0x99, U 0x14, U 0x65, U 0x52, - U 0x52, U 0xC0, U 0xE1, U 0xD2, + U 0x56, U 0xC0, U 0xE1, U 0xD2, U 0xE0, U 0x2E, U 0x61, U 0x02, - U 0x1D, U 0xDE, U 0xDB, U 0x0E, + U 0x1D, U 0xDE, U 0x46, U 0x0E, U 0x0E, U 0x4C, U 0x65, U 0xE1, U 0x62, U 0x8F, U 0x30, U 0x8E, U 0x19, U 0x0F, U 0x6F, U 0x51, @@ -5054,19 +5204,19 @@ static unsigned char t3fw[30136] = { U 0x29, U 0xD0, U 0x23, U 0x0E, U 0x8F, U 0x50, U 0x77, U 0xE6, U 0x6B, U 0x8F, U 0x18, U 0x1E, - U 0xDF, U 0x18, U 0xB0, U 0xFF, + U 0xDE, U 0x83, U 0xB0, U 0xFF, U 0x0F, U 0xF4, U 0x11, U 0x0F, U 0x1F, U 0x14, U 0x65, U 0x90, - U 0xCE, U 0x18, U 0xDF, U 0x15, + U 0xCE, U 0x18, U 0xDE, U 0x80, U 0x8C, U 0x60, U 0xA8, U 0xCC, U 0xC0, U 0xB1, U 0x19, U 0xDE, - U 0xC9, U 0x28, U 0x60, U 0x0B, + U 0x34, U 0x28, U 0x60, U 0x0B, U 0x09, U 0xCC, U 0x0B, U 0x0D, U 0x88, U 0x09, U 0x29, U 0x81, U 0x1C, U 0x28, U 0x81, U 0x1A, U 0x2A, U 0x0A, U 0x00, U 0x09, U 0x88, U 0x0C, U 0x08, U 0xBA, - U 0x38, U 0x1B, U 0xDF, U 0x0B, + U 0x38, U 0x1B, U 0xDE, U 0x76, U 0x0C, U 0xA9, U 0x0A, U 0x29, U 0x92, U 0x94, U 0x7B, U 0x9B, U 0x02, U 0x60, U 0x00, U 0x8C, @@ -5075,28 +5225,28 @@ static unsigned char t3fw[30136] = { U 0xA7, U 0xDD, U 0x29, U 0xD2, U 0x86, U 0xB8, U 0x48, U 0x79, U 0x83, U 0x02, U 0x60, U 0x00, - U 0xD2, U 0x19, U 0xDE, U 0xBB, + U 0xD2, U 0x19, U 0xDE, U 0x26, U 0x09, U 0xB8, U 0x0A, U 0x28, U 0x82, U 0xA3, U 0x98, U 0x17, U 0x68, U 0x80, U 0x02, U 0x60, U 0x00, U 0xA3, U 0x60, U 0x00, - U 0xA5, U 0x1A, U 0xDE, U 0xFF, + U 0xA5, U 0x1A, U 0xDE, U 0x6A, U 0x84, U 0x18, U 0x0A, U 0xEE, U 0x01, U 0xCA, U 0x98, U 0x1B, - U 0xDE, U 0xB2, U 0x8C, U 0x19, + U 0xDE, U 0x1D, U 0x8C, U 0x19, U 0x2B, U 0xB0, U 0x00, U 0x8C, U 0xC0, U 0x6E, U 0xB3, U 0x13, - U 0x1D, U 0xDE, U 0xAF, U 0x0C, + U 0x1D, U 0xDE, U 0x1A, U 0x0C, U 0x1C, U 0x52, U 0x0D, U 0xCC, U 0x0B, U 0x2D, U 0xC2, U 0x95, U 0xC0, U 0xA1, U 0x7E, U 0xDB, U 0xAE, U 0x60, U 0x00, U 0x38, U 0x0C, U 0x0C, U 0x53, U 0x60, U 0x00, U 0x09, U 0x00, U 0x00, - U 0x00, U 0x18, U 0xDE, U 0xF1, + U 0x00, U 0x18, U 0xDE, U 0x5C, U 0x8C, U 0x60, U 0xA8, U 0xCC, U 0xC0, U 0xB1, U 0x19, U 0xDE, - U 0xA5, U 0x28, U 0x60, U 0x0B, + U 0x10, U 0x28, U 0x60, U 0x0B, U 0x09, U 0xCC, U 0x0B, U 0x0D, U 0x88, U 0x09, U 0x29, U 0x81, U 0x1C, U 0x28, U 0x81, U 0x1A, @@ -5106,16 +5256,16 @@ static unsigned char t3fw[30136] = { U 0x29, U 0x92, U 0x94, U 0x7E, U 0x93, U 0x02, U 0x63, U 0xFF, U 0x72, U 0xDA, U 0x60, U 0xC0, - U 0xBA, U 0x58, U 0x07, U 0x29, + U 0xBA, U 0x58, U 0x07, U 0x30, U 0x64, U 0x50, U 0x73, U 0x60, - U 0x02, U 0x66, U 0x00, U 0x00, - U 0x1A, U 0xDE, U 0x98, U 0x8C, + U 0x02, U 0x6A, U 0x00, U 0x00, + U 0x1A, U 0xDE, U 0x03, U 0x8C, U 0x19, U 0x2A, U 0xA0, U 0x00, U 0x8C, U 0xC0, U 0x6E, U 0xA3, - U 0x1A, U 0x18, U 0xDE, U 0x94, + U 0x1A, U 0x18, U 0xDD, U 0xFF, U 0x0C, U 0x1C, U 0x52, U 0x08, U 0xCC, U 0x0B, U 0x18, U 0xDE, - U 0xDB, U 0x2B, U 0xC2, U 0x95, + U 0x46, U 0x2B, U 0xC2, U 0x95, U 0xC0, U 0xA1, U 0x78, U 0xB3, U 0x02, U 0x63, U 0xFF, U 0x3F, U 0x63, U 0xFF, U 0xC9, U 0x00, @@ -5124,25 +5274,25 @@ static unsigned char t3fw[30136] = { U 0x78, U 0x99, U 0x18, U 0x29, U 0xD2, U 0x85, U 0xC9, U 0x92, U 0x2B, U 0x72, U 0x9E, U 0x1D, - U 0xDE, U 0x89, U 0x6E, U 0xB8, + U 0xDD, U 0xF4, U 0x6E, U 0xB8, U 0x23, U 0x2D, U 0xD2, U 0x26, U 0x99, U 0x13, U 0x69, U 0xD0, U 0x0B, U 0x60, U 0x00, U 0x0D, U 0xDA, U 0x60, U 0x58, U 0x07, - U 0x13, U 0x60, U 0x00, U 0x17, + U 0x1A, U 0x60, U 0x00, U 0x17, U 0x00, U 0x88, U 0x60, U 0x7D, U 0x89, U 0x0A, U 0x9A, U 0x1A, U 0x29, U 0x72, U 0x9D, U 0x9C, U 0x12, U 0x99, U 0x15, U 0xCF, U 0x95, U 0xDA, U 0x60, U 0xC0, - U 0xB6, U 0x58, U 0x07, U 0x0C, - U 0x65, U 0x51, U 0xF5, U 0x8D, + U 0xB6, U 0x58, U 0x07, U 0x13, + U 0x65, U 0x51, U 0xF9, U 0x8D, U 0x14, U 0x8C, U 0x18, U 0xDB, U 0xD0, U 0x8D, U 0xD0, U 0x06, U 0x6A, U 0x02, U 0x0D, U 0x6D, - U 0x51, U 0x58, U 0x05, U 0x80, + U 0x51, U 0x58, U 0x05, U 0x85, U 0xD3, U 0xA0, U 0x9A, U 0x14, - U 0x64, U 0xA1, U 0xDD, U 0x82, + U 0x64, U 0xA1, U 0xE1, U 0x82, U 0xA0, U 0x85, U 0xA1, U 0xB8, U 0xAF, U 0x9F, U 0x19, U 0x05, U 0x05, U 0x47, U 0x02, U 0x02, @@ -5158,12 +5308,13 @@ static unsigned char t3fw[30136] = { U 0x66, U 0x7C, U 0xAB, U 0x11, U 0x9F, U 0x11, U 0x9E, U 0x1B, U 0x8A, U 0x15, U 0x58, U 0x05, - U 0x91, U 0x8E, U 0x1B, U 0x8F, + U 0x96, U 0x8E, U 0x1B, U 0x8F, U 0x11, U 0xC0, U 0xA0, U 0x2A, U 0x64, U 0x66, U 0x9F, U 0x11, - U 0x64, U 0xF0, U 0xE1, U 0x29, - U 0x12, U 0x03, U 0x28, U 0x12, - U 0x09, U 0x6D, U 0xF9, U 0x17, + U 0x64, U 0xF0, U 0xE5, U 0x89, + U 0x13, U 0x88, U 0x19, U 0x0F, + U 0xFD, U 0x02, U 0x2E, U 0x0A, + U 0x00, U 0x6D, U 0xD9, U 0x17, U 0x2F, U 0x81, U 0x03, U 0x00, U 0x90, U 0x8D, U 0xAE, U 0xFE, U 0x00, U 0x80, U 0x88, U 0x9F, @@ -5172,35 +5323,35 @@ static unsigned char t3fw[30136] = { U 0x99, U 0x00, U 0x90, U 0x8C, U 0x65, U 0x51, U 0x4E, U 0x8A, U 0x10, U 0x85, U 0x1A, U 0x8B, - U 0x30, U 0x1F, U 0xDE, U 0x6B, + U 0x30, U 0x1F, U 0xDD, U 0xD5, U 0x88, U 0x12, U 0x29, U 0x60, U 0x07, U 0x08, U 0x58, U 0x0A, U 0x2C, U 0x82, U 0x94, U 0x2D, U 0x61, U 0x04, U 0x0E, U 0xCC, U 0x0C, U 0x2C, U 0x86, U 0x94, U 0x6F, U 0xDB, U 0x3C, U 0x1C, - U 0xDE, U 0x95, U 0xAC, U 0x9C, + U 0xDD, U 0xFF, U 0xAC, U 0x9C, U 0x29, U 0xC0, U 0x80, U 0x0B, U 0x5D, U 0x50, U 0xA2, U 0x99, U 0x09, U 0x09, U 0x47, U 0x29, U 0xC4, U 0x80, U 0x65, U 0xD0, U 0xDA, U 0x2E, U 0x60, U 0x0C, - U 0xC0, U 0xD0, U 0x1F, U 0xDE, - U 0x54, U 0x0C, U 0xE8, U 0x11, + U 0xC0, U 0xD0, U 0x1F, U 0xDD, + U 0xBE, U 0x0C, U 0xE8, U 0x11, U 0xAF, U 0xEE, U 0xA7, U 0x88, U 0x22, U 0x82, U 0x85, U 0x2D, U 0xE4, U 0xCF, U 0x02, U 0x42, U 0x0B, U 0x22, U 0x86, U 0x85, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x8E, U 0x30, U 0x0E, U 0x0E, - U 0x47, U 0x63, U 0xFD, U 0xA6, + U 0x47, U 0x63, U 0xFD, U 0xA2, U 0xA2, U 0x9C, U 0x0C, U 0x0C, U 0x47, U 0x2C, U 0x64, U 0x07, U 0x7A, U 0xB6, U 0xCD, U 0x8B, U 0x60, U 0x2E, U 0x60, U 0x0A, U 0x28, U 0x0A, U 0xFF, U 0x08, U 0xE8, U 0x0C, U 0x64, U 0x81, - U 0x0E, U 0x18, U 0xDE, U 0x7E, + U 0x0E, U 0x18, U 0xDD, U 0xE8, U 0x83, U 0x16, U 0x82, U 0x13, U 0xB3, U 0x39, U 0x02, U 0x33, U 0x0B, U 0x2C, U 0x34, U 0x16, @@ -5212,7 +5363,7 @@ static unsigned char t3fw[30136] = { U 0x34, U 0x98, U 0x32, U 0xC0, U 0x80, U 0x28, U 0x64, U 0x07, U 0x2B, U 0x60, U 0x0C, U 0xD2, - U 0xA0, U 0x1C, U 0xDE, U 0x39, + U 0xA0, U 0x1C, U 0xDD, U 0xA3, U 0x0C, U 0xBE, U 0x11, U 0xA7, U 0xEE, U 0x2D, U 0xE2, U 0x85, U 0xAC, U 0xBB, U 0x28, U 0xB4, @@ -5232,15 +5383,15 @@ static unsigned char t3fw[30136] = { U 0xF1, U 0xC0, U 0x80, U 0x0C, U 0xF8, U 0x38, U 0x08, U 0x08, U 0x42, U 0x64, U 0x80, U 0x6B, - U 0x1B, U 0xDE, U 0x1A, U 0x19, - U 0xDE, U 0x1B, U 0x29, U 0xB6, + U 0x1B, U 0xDD, U 0x84, U 0x19, + U 0xDD, U 0x85, U 0x29, U 0xB6, U 0x7E, U 0x8D, U 0x18, U 0xB0, U 0xDD, U 0x6D, U 0xDA, U 0x05, U 0x00, U 0xA0, U 0x88, U 0x00, U 0xC0, U 0x8C, U 0xC0, U 0xA0, U 0x63, U 0xFE, U 0xF3, U 0x00, U 0x82, U 0x13, U 0x8B, U 0x16, - U 0x1D, U 0xDE, U 0x2B, U 0x28, + U 0x1D, U 0xDD, U 0x95, U 0x28, U 0x60, U 0x0A, U 0xC0, U 0xE0, U 0x2E, U 0xC4, U 0x80, U 0x0D, U 0x88, U 0x02, U 0x02, U 0xB2, @@ -5251,13 +5402,13 @@ static unsigned char t3fw[30136] = { U 0x0C, U 0x2D, U 0x11, U 0xA7, U 0xDD, U 0x28, U 0xD2, U 0x85, U 0x08, U 0xBB, U 0x0B, U 0x18, - U 0xDE, U 0x13, U 0x2B, U 0xD6, + U 0xDD, U 0x7D, U 0x2B, U 0xD6, U 0x85, U 0xA8, U 0x22, U 0x2E, U 0x24, U 0xCF, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x9E, U 0x1B, U 0x85, U 0x1A, U 0x2A, U 0x6C, U 0x74, U 0x8B, U 0x18, U 0x5B, - U 0xFF, U 0x17, U 0x8E, U 0x1B, + U 0xFF, U 0x16, U 0x8E, U 0x1B, U 0x63, U 0xFE, U 0xA3, U 0x00, U 0xC0, U 0x87, U 0xC0, U 0x90, U 0x0A, U 0xF9, U 0x38, U 0x79, @@ -5266,14 +5417,14 @@ static unsigned char t3fw[30136] = { U 0x0F, U 0x9E, U 0x1B, U 0x2A, U 0x6C, U 0x74, U 0xC0, U 0xB1, U 0x8D, U 0x18, U 0x58, U 0x05, - U 0x35, U 0x8E, U 0x1B, U 0x85, + U 0x39, U 0x8E, U 0x1B, U 0x85, U 0x1A, U 0x63, U 0xFE, U 0x7E, U 0x88, U 0x6B, U 0x82, U 0x13, U 0x89, U 0x16, U 0x08, U 0xBE, U 0x11, U 0x0E, U 0xCE, U 0x02, U 0x02, U 0x92, U 0x0B, U 0x9E, U 0x25, U 0xB4, U 0x99, U 0x1E, - U 0xDE, U 0x06, U 0x9F, U 0x20, + U 0xDD, U 0x70, U 0x9F, U 0x20, U 0x0E, U 0x88, U 0x02, U 0x98, U 0x22, U 0xC0, U 0xEF, U 0x04, U 0xD8, U 0x11, U 0x0E, U 0x88, @@ -5281,7 +5432,7 @@ static unsigned char t3fw[30136] = { U 0xE4, U 0x9E, U 0x21, U 0xC0, U 0x80, U 0xD2, U 0xA0, U 0x2B, U 0x60, U 0x0C, U 0x28, U 0x64, - U 0x07, U 0x1C, U 0xDD, U 0xF4, + U 0x07, U 0x1C, U 0xDD, U 0x5E, U 0x0C, U 0xBE, U 0x11, U 0xA7, U 0xEE, U 0x2D, U 0xE2, U 0x85, U 0xAC, U 0xBB, U 0x28, U 0xB4, @@ -5300,16 +5451,16 @@ static unsigned char t3fw[30136] = { U 0x6C, U 0x10, U 0x04, U 0x02, U 0x2A, U 0x02, U 0x03, U 0x3B, U 0x02, U 0x5B, U 0xFF, U 0xF6, - U 0x1C, U 0xDD, U 0xDC, U 0x1B, - U 0xDE, U 0x24, U 0xC7, U 0x9F, + U 0x1C, U 0xDD, U 0x46, U 0x1B, + U 0xDD, U 0x8E, U 0xC7, U 0x9F, U 0x88, U 0xB0, U 0x09, U 0xA9, U 0x03, U 0x09, U 0x8A, U 0x01, U 0x9A, U 0xB0, U 0x79, U 0x80, U 0x1E, U 0xC0, U 0xF0, U 0x0F, U 0xE4, U 0x31, U 0x1D, U 0xDD, - U 0xD3, U 0x00, U 0x02, U 0x00, + U 0x3D, U 0x00, U 0x02, U 0x00, U 0x2B, U 0xD2, U 0x82, U 0x1E, - U 0xDE, U 0x1D, U 0x2A, U 0xC1, + U 0xDD, U 0x87, U 0x2A, U 0xC1, U 0x02, U 0x0E, U 0xBB, U 0x02, U 0x2B, U 0xD6, U 0x82, U 0x0A, U 0xE4, U 0x31, U 0xD1, U 0x0F, @@ -5320,17 +5471,17 @@ static unsigned char t3fw[30136] = { U 0x31, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0xC0, U 0x0C, U 0xE4, U 0x31, - U 0x12, U 0xDD, U 0xC8, U 0x1A, - U 0xDD, U 0xC5, U 0x00, U 0x02, + U 0x12, U 0xDD, U 0x32, U 0x1A, + U 0xDD, U 0x2F, U 0x00, U 0x02, U 0x00, U 0x29, U 0xA2, U 0x82, - U 0x18, U 0xDE, U 0x11, U 0x1B, - U 0xDE, U 0x0F, U 0x26, U 0x21, + U 0x18, U 0xDD, U 0x7B, U 0x1B, + U 0xDD, U 0x79, U 0x26, U 0x21, U 0x02, U 0x0B, U 0x99, U 0x01, U 0x08, U 0x66, U 0x01, U 0x29, U 0xA6, U 0x82, U 0x26, U 0x25, U 0x02, U 0x06, U 0xE4, U 0x31, - U 0x14, U 0xDE, U 0x0C, U 0x15, - U 0xDE, U 0x07, U 0x23, U 0x6A, + U 0x14, U 0xDD, U 0x76, U 0x15, + U 0xDD, U 0x71, U 0x23, U 0x6A, U 0x90, U 0x23, U 0x26, U 0x12, U 0x85, U 0x50, U 0x24, U 0x26, U 0x11, U 0x25, U 0x26, U 0x13, @@ -5339,12 +5490,12 @@ static unsigned char t3fw[30136] = { U 0x6C, U 0x10, U 0x08, U 0xD6, U 0x10, U 0x2B, U 0x0A, U 0x64, U 0x29, U 0x1A, U 0xB4, U 0x1A, - U 0xDD, U 0xB2, U 0x0D, U 0x23, - U 0x11, U 0x1C, U 0xDD, U 0xB3, + U 0xDD, U 0x1C, U 0x0D, U 0x23, + U 0x11, U 0x1C, U 0xDD, U 0x1D, U 0x0F, U 0x25, U 0x11, U 0xB8, U 0x18, U 0x98, U 0x13, U 0x0E, U 0x55, U 0x11, U 0x18, U 0xDD, - U 0xFE, U 0xAC, U 0x55, U 0xA8, + U 0x68, U 0xAC, U 0x55, U 0xA8, U 0x38, U 0xAA, U 0x33, U 0x2C, U 0x80, U 0xFF, U 0x2A, U 0x80, U 0xFE, U 0xA9, U 0x33, U 0x28, @@ -5355,20 +5506,20 @@ static unsigned char t3fw[30136] = { U 0x11, U 0x09, U 0x88, U 0x02, U 0x08, U 0xAA, U 0x1C, U 0x28, U 0x8C, U 0x08, U 0x28, U 0x16, - U 0x04, U 0x58, U 0x08, U 0x4C, - U 0x14, U 0xDD, U 0xA4, U 0x0A, + U 0x04, U 0x58, U 0x08, U 0x61, + U 0x14, U 0xDD, U 0x0E, U 0x0A, U 0xA7, U 0x02, U 0x24, U 0x41, U 0x16, U 0x2A, U 0x30, U 0x80, U 0x2B, U 0x12, U 0x04, U 0x07, U 0xAA, U 0x28, U 0x58, U 0x08, - U 0x47, U 0xB1, U 0x33, U 0x8B, + U 0x5C, U 0xB1, U 0x33, U 0x8B, U 0x13, U 0xB4, U 0x55, U 0x9A, U 0x60, U 0x04, U 0xAC, U 0x28, U 0xB4, U 0x66, U 0x2C, U 0x56, U 0x27, U 0x7B, U 0x69, U 0xE0, - U 0x16, U 0xDD, U 0xDB, U 0x94, + U 0x16, U 0xDD, U 0x45, U 0x94, U 0x12, U 0xC0, U 0x50, U 0xC0, - U 0xD0, U 0x17, U 0xDD, U 0x97, + U 0xD0, U 0x17, U 0xDD, U 0x01, U 0x9D, U 0x15, U 0xD3, U 0x70, U 0xD4, U 0x10, U 0x2F, U 0x60, U 0x80, U 0x2E, U 0x60, U 0x82, @@ -5378,7 +5529,7 @@ static unsigned char t3fw[30136] = { U 0x40, U 0x2A, U 0x60, U 0x7F, U 0x0D, U 0xCC, U 0x28, U 0x2B, U 0x3A, U 0x20, U 0x0C, U 0xAA, - U 0x28, U 0x58, U 0x08, U 0x35, + U 0x28, U 0x58, U 0x08, U 0x4A, U 0xC0, U 0xB1, U 0x0A, U 0xBE, U 0x37, U 0x2E, U 0x35, U 0x40, U 0x8F, U 0x17, U 0x72, U 0xF9, @@ -5386,7 +5537,7 @@ static unsigned char t3fw[30136] = { U 0x40, U 0x2A, U 0x60, U 0x81, U 0x0D, U 0xCC, U 0x28, U 0x2B, U 0x3A, U 0x20, U 0x0C, U 0xAA, - U 0x28, U 0x58, U 0x08, U 0x2D, + U 0x28, U 0x58, U 0x08, U 0x42, U 0xC0, U 0xB1, U 0x0A, U 0xBE, U 0x37, U 0x2E, U 0x35, U 0x42, U 0xB2, U 0x33, U 0xB4, U 0x44, @@ -5399,17 +5550,17 @@ static unsigned char t3fw[30136] = { U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x21, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x27, - U 0x0A, U 0x00, U 0x1C, U 0xDD, - U 0x76, U 0x1F, U 0xDD, U 0x87, - U 0x1E, U 0xDD, U 0x8A, U 0x1D, - U 0xDD, U 0x73, U 0x1A, U 0xDD, - U 0xB5, U 0x1B, U 0xDD, U 0xC3, + U 0x0A, U 0x00, U 0x1C, U 0xDC, + U 0xE0, U 0x1F, U 0xDC, U 0xF1, + U 0x1E, U 0xDC, U 0xF4, U 0x1D, + U 0xDC, U 0xDD, U 0x1A, U 0xDD, + U 0x1F, U 0x1B, U 0xDD, U 0x2D, U 0xC0, U 0x28, U 0x24, U 0xB0, U 0x00, U 0x6D, U 0x2A, U 0x75, U 0xAA, U 0x48, U 0x28, U 0x80, U 0x80, U 0xC0, U 0x91, U 0x64, U 0x80, U 0x61, U 0x00, U 0x41, - U 0x04, U 0x15, U 0xDD, U 0x6E, + U 0x04, U 0x15, U 0xDC, U 0xD8, U 0xC0, U 0x31, U 0x25, U 0x50, U 0x2E, U 0x00, U 0x36, U 0x1A, U 0x06, U 0x55, U 0x01, U 0x05, @@ -5419,10 +5570,10 @@ static unsigned char t3fw[30136] = { U 0x97, U 0x4D, U 0x0D, U 0x59, U 0x0A, U 0x29, U 0x92, U 0x24, U 0x68, U 0x90, U 0x08, U 0x12, - U 0xDD, U 0xA7, U 0x02, U 0x42, + U 0xDD, U 0x11, U 0x02, U 0x42, U 0x08, U 0x72, U 0x99, U 0x3B, U 0x23, U 0x62, U 0x95, U 0x12, - U 0xDD, U 0x6B, U 0xCB, U 0x34, + U 0xDC, U 0xD5, U 0xCB, U 0x34, U 0x9F, U 0x30, U 0x02, U 0x82, U 0x02, U 0x0E, U 0x44, U 0x02, U 0xC0, U 0x92, U 0x99, U 0x31, @@ -5438,41 +5589,41 @@ static unsigned char t3fw[30136] = { U 0xB4, U 0x00, U 0xD1, U 0x0F, U 0xD1, U 0x0F, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0x1A, - U 0xDD, U 0x4F, U 0x2A, U 0xA0, + U 0xDC, U 0xB9, U 0x2A, U 0xA0, U 0x00, U 0x58, U 0x02, U 0x1C, U 0x5B, U 0xFF, U 0xD5, U 0x02, U 0x2A, U 0x02, U 0x03, U 0x3B, U 0x02, U 0x5B, U 0xFF, U 0xD1, - U 0x1B, U 0xDD, U 0x4D, U 0xC9, + U 0x1B, U 0xDC, U 0xB7, U 0xC9, U 0xA1, U 0x2C, U 0xB1, U 0x02, U 0xC0, U 0xD4, U 0x0D, U 0xCC, U 0x02, U 0x0C, U 0x0C, U 0x4F, U 0x2C, U 0xB5, U 0x02, U 0x0C, U 0xE4, U 0x31, U 0xD1, U 0x0F, U 0xC0, U 0xA0, U 0x0A, U 0xE4, - U 0x31, U 0x18, U 0xDD, U 0x43, + U 0x31, U 0x18, U 0xDC, U 0xAD, U 0x00, U 0x02, U 0x00, U 0x2F, - U 0x82, U 0x82, U 0x19, U 0xDD, - U 0x56, U 0x2E, U 0xB1, U 0x02, + U 0x82, U 0x82, U 0x19, U 0xDC, + U 0xC0, U 0x2E, U 0xB1, U 0x02, U 0x09, U 0xFF, U 0x02, U 0x2F, U 0x86, U 0x82, U 0x0E, U 0xE4, U 0x31, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x20, U 0x02, U 0xE4, U 0x31, - U 0x14, U 0xDD, U 0x3D, U 0x16, - U 0xDD, U 0x3A, U 0x00, U 0x02, + U 0x14, U 0xDC, U 0xA7, U 0x16, + U 0xDC, U 0xA4, U 0x00, U 0x02, U 0x00, U 0x22, U 0x62, U 0x82, U 0x23, U 0x41, U 0x02, U 0x73, U 0x2F, U 0x06, U 0x03, U 0xE4, U 0x31, U 0xC0, U 0x20, U 0xD1, - U 0x0F, U 0x19, U 0xDD, U 0x87, - U 0x1A, U 0xDD, U 0x86, U 0x28, + U 0x0F, U 0x19, U 0xDC, U 0xF1, + U 0x1A, U 0xDC, U 0xF0, U 0x28, U 0x41, U 0x02, U 0x0A, U 0x2A, U 0x01, U 0x09, U 0x88, U 0x01, U 0x2A, U 0x66, U 0x82, U 0x28, U 0x45, U 0x02, U 0x08, U 0xE4, - U 0x31, U 0x15, U 0xDD, U 0x7D, - U 0x12, U 0xDD, U 0x82, U 0x25, + U 0x31, U 0x15, U 0xDC, U 0xE7, + U 0x12, U 0xDC, U 0xEC, U 0x25, U 0x46, U 0x1D, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0x29, U 0x20, U 0x06, U 0x28, U 0x9C, @@ -5487,20 +5638,20 @@ static unsigned char t3fw[30136] = { U 0x22, U 0x09, U 0x0E, U 0xAE, U 0x0C, U 0x66, U 0xE0, U 0x78, U 0x2B, U 0x20, U 0x0C, U 0x1E, - U 0xDD, U 0x1F, U 0x0C, U 0xBC, + U 0xDC, U 0x89, U 0x0C, U 0xBC, U 0x11, U 0xAE, U 0xCC, U 0x28, - U 0xC2, U 0x86, U 0x19, U 0xDD, - U 0x1D, U 0x78, U 0xF3, U 0x02, + U 0xC2, U 0x86, U 0x19, U 0xDC, + U 0x87, U 0x78, U 0xF3, U 0x02, U 0x60, U 0x00, U 0xAD, U 0x09, U 0xB9, U 0x0A, U 0x29, U 0x92, U 0xA3, U 0x68, U 0x90, U 0x08, U 0x2E, U 0x22, U 0x00, U 0x09, U 0xEE, U 0x0C, U 0x65, U 0xE0, U 0x9B, U 0x29, U 0xC2, U 0x85, - U 0x1F, U 0xDD, U 0x27, U 0x64, + U 0x1F, U 0xDC, U 0x91, U 0x64, U 0x90, U 0x92, U 0x9F, U 0x90, - U 0xC0, U 0xE4, U 0x1F, U 0xDD, - U 0x34, U 0x9E, U 0x91, U 0x28, + U 0xC0, U 0xE4, U 0x1F, U 0xDC, + U 0x9D, U 0x9E, U 0x91, U 0x28, U 0x20, U 0x0A, U 0xC0, U 0xE0, U 0x9E, U 0x93, U 0x0F, U 0x88, U 0x02, U 0x98, U 0x92, U 0x88, @@ -5512,7 +5663,7 @@ static unsigned char t3fw[30136] = { U 0x20, U 0x06, U 0x29, U 0x20, U 0x64, U 0x68, U 0x83, U 0x33, U 0x28, U 0xC2, U 0x85, U 0x12, - U 0xDD, U 0x0E, U 0x28, U 0x8C, + U 0xDC, U 0x78, U 0x28, U 0x8C, U 0x20, U 0xA2, U 0xB2, U 0x2E, U 0x24, U 0xCF, U 0x28, U 0xC6, U 0x85, U 0xC0, U 0x20, U 0xD1, @@ -5521,16 +5672,16 @@ static unsigned char t3fw[30136] = { U 0x01, U 0x11, U 0x02, U 0x0A, U 0x2A, U 0x41, U 0x65, U 0xAF, U 0x52, U 0xDA, U 0x20, U 0xC0, - U 0xB0, U 0x58, U 0x05, U 0xD1, + U 0xB0, U 0x58, U 0x05, U 0xE3, U 0x64, U 0xAF, U 0xE5, U 0xC0, U 0x21, U 0xD1, U 0x0F, U 0x00, U 0x64, U 0x9F, U 0xC8, U 0x1F, - U 0xDC, U 0xFB, U 0x2D, U 0x20, + U 0xDC, U 0x65, U 0x2D, U 0x20, U 0x16, U 0x8F, U 0xF2, U 0x09, U 0xDD, U 0x0C, U 0x00, U 0xF1, U 0x04, U 0x00, U 0xDD, U 0x1A, U 0xAD, U 0xAD, U 0x9D, U 0x29, - U 0x12, U 0xDC, U 0xFC, U 0x28, + U 0x12, U 0xDC, U 0x66, U 0x28, U 0xC2, U 0x85, U 0xA2, U 0xB2, U 0x2E, U 0x24, U 0xCF, U 0x28, U 0x8C, U 0x20, U 0x28, U 0xC6, @@ -5538,10 +5689,10 @@ static unsigned char t3fw[30136] = { U 0x0F, U 0xC0, U 0x21, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x26, - U 0x0A, U 0x00, U 0x1B, U 0xDD, - U 0x40, U 0x15, U 0xDC, U 0xEC, + U 0x0A, U 0x00, U 0x1B, U 0xDC, + U 0xAA, U 0x15, U 0xDC, U 0x56, U 0x28, U 0x20, U 0x65, U 0x17, - U 0xDC, U 0xE9, U 0x28, U 0x8C, + U 0xDC, U 0x53, U 0x28, U 0x8C, U 0xFE, U 0x64, U 0x80, U 0x94, U 0x0C, U 0x4D, U 0x11, U 0x0D, U 0xBD, U 0x08, U 0x2C, U 0xD2, @@ -5582,27 +5733,27 @@ static unsigned char t3fw[30136] = { U 0xE4, U 0x31, U 0xD1, U 0x0F, U 0x00, U 0xDB, U 0x30, U 0xDA, U 0x20, U 0x5B, U 0xFF, U 0x94, - U 0x1B, U 0xDD, U 0x15, U 0x64, + U 0x1B, U 0xDC, U 0x7F, U 0x64, U 0xAF, U 0x5D, U 0x0C, U 0x4D, U 0x11, U 0xAD, U 0xBD, U 0x63, U 0xFF, U 0xA8, U 0x00, U 0x00, U 0x06, U 0xE4, U 0x31, U 0x00, U 0x02, U 0x00, U 0x2F, U 0x72, - U 0x82, U 0x18, U 0xDC, U 0xD4, + U 0x82, U 0x18, U 0xDC, U 0x3D, U 0x2E, U 0x51, U 0x02, U 0x08, U 0xFF, U 0x02, U 0x2F, U 0x76, U 0x82, U 0x0E, U 0xE4, U 0x31, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x30, U 0x03, U 0xE4, U 0x31, - U 0x16, U 0xDC, U 0xB3, U 0x15, - U 0xDC, U 0xB4, U 0x00, U 0x02, + U 0x16, U 0xDC, U 0x1D, U 0x15, + U 0xDC, U 0x1E, U 0x00, U 0x02, U 0x00, U 0x24, U 0x62, U 0x82, U 0x74, U 0x47, U 0x21, U 0x18, - U 0xDD, U 0x05, U 0x87, U 0x5A, + U 0xDC, U 0x6F, U 0x87, U 0x5A, U 0x08, U 0x48, U 0x01, U 0x28, U 0x66, U 0x82, U 0xCD, U 0x73, - U 0x19, U 0xDD, U 0x03, U 0x0C, + U 0x19, U 0xDC, U 0x6D, U 0x0C, U 0x2A, U 0x11, U 0xAA, U 0x99, U 0x22, U 0x92, U 0x83, U 0x29, U 0x92, U 0x84, U 0x72, U 0x91, @@ -5610,22 +5761,22 @@ static unsigned char t3fw[30136] = { U 0x29, U 0x2B, U 0x51, U 0x02, U 0x0B, U 0xE4, U 0x31, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, - U 0x1F, U 0xDC, U 0xFC, U 0x2E, + U 0x1F, U 0xDC, U 0x66, U 0x2E, U 0x51, U 0x02, U 0x0F, U 0xEE, U 0x01, U 0x2E, U 0x55, U 0x02, U 0x0E, U 0xE4, U 0x31, U 0xB0, U 0x2D, U 0xB1, U 0x7C, U 0x9C, - U 0x5A, U 0x12, U 0xDC, U 0xF7, + U 0x5A, U 0x12, U 0xDC, U 0x61, U 0x08, U 0xDD, U 0x11, U 0x2D, U 0x56, U 0x19, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x06, U 0x1B, - U 0xDC, U 0x9A, U 0x1E, U 0xDC, - U 0x9C, U 0x22, U 0xB0, U 0x00, - U 0x1A, U 0xDC, U 0xF3, U 0x6F, + U 0xDC, U 0x04, U 0x1E, U 0xDC, + U 0x06, U 0x22, U 0xB0, U 0x00, + U 0x1A, U 0xDC, U 0x5D, U 0x6F, U 0x23, U 0x72, U 0x1D, U 0xDC, - U 0xDA, U 0xC0, U 0x48, U 0x18, - U 0xDC, U 0xF2, U 0x1F, U 0xDC, - U 0xF0, U 0xDC, U 0x10, U 0xD5, + U 0x44, U 0xC0, U 0x48, U 0x18, + U 0xDC, U 0x5C, U 0x1F, U 0xDC, + U 0x5A, U 0xDC, U 0x10, U 0xD5, U 0xC0, U 0x83, U 0xF0, U 0x00, U 0x80, U 0x86, U 0x00, U 0x50, U 0x8A, U 0x6D, U 0x4A, U 0x4F, @@ -5651,13 +5802,13 @@ static unsigned char t3fw[30136] = { U 0x41, U 0x03, U 0x03, U 0x42, U 0xB1, U 0x38, U 0x08, U 0x08, U 0x42, U 0x98, U 0xF0, U 0xD1, - U 0x0F, U 0x1C, U 0xDC, U 0xD7, - U 0x13, U 0xDC, U 0xD8, U 0x27, + U 0x0F, U 0x1C, U 0xDC, U 0x41, + U 0x13, U 0xDC, U 0x42, U 0x27, U 0xB0, U 0x00, U 0x23, U 0x32, U 0xB5, U 0x64, U 0x70, U 0x57, U 0xC0, U 0x91, U 0xC0, U 0xD0, - U 0x16, U 0xDC, U 0xD6, U 0x15, - U 0xDC, U 0xD4, U 0xC0, U 0x40, + U 0x16, U 0xDC, U 0x40, U 0x15, + U 0xDC, U 0x3E, U 0xC0, U 0x40, U 0x2A, U 0xC0, U 0x00, U 0x03, U 0x88, U 0x43, U 0x28, U 0xC4, U 0x00, U 0x6D, U 0x79, U 0x3C, @@ -5681,11 +5832,11 @@ static unsigned char t3fw[30136] = { U 0xC4, U 0x00, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x40, U 0x04, U 0xE4, U 0x31, - U 0x15, U 0xDC, U 0xBE, U 0x00, + U 0x15, U 0xDC, U 0x28, U 0x00, U 0x02, U 0x00, U 0x88, U 0x50, - U 0x13, U 0xDC, U 0xBD, U 0xCB, + U 0x13, U 0xDC, U 0x27, U 0xCB, U 0x81, U 0x5B, U 0xFF, U 0xBD, - U 0x1C, U 0xDC, U 0xBC, U 0x0C, + U 0x1C, U 0xDC, U 0x26, U 0x0C, U 0x2D, U 0x11, U 0xAD, U 0xCC, U 0x2B, U 0xC2, U 0x82, U 0x2A, U 0xC2, U 0x83, U 0x94, U 0x50, @@ -5697,7 +5848,7 @@ static unsigned char t3fw[30136] = { U 0x14, U 0x60, U 0x00, U 0x05, U 0x0B, U 0xA9, U 0x0C, U 0x09, U 0x29, U 0x14, U 0x99, U 0x30, - U 0x15, U 0xDC, U 0x4F, U 0x2A, + U 0x15, U 0xDB, U 0xB9, U 0x2A, U 0x51, U 0x02, U 0x0A, U 0xE4, U 0x31, U 0x2A, U 0x2C, U 0xFC, U 0x58, U 0x00, U 0x4B, U 0x2B, @@ -5707,7 +5858,7 @@ static unsigned char t3fw[30136] = { U 0xC8, U 0xA4, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x04, U 0xE4, U 0x31, U 0x1E, - U 0xDC, U 0x43, U 0x00, U 0x02, + U 0xDB, U 0xAD, U 0x00, U 0x02, U 0x00, U 0x2D, U 0xE2, U 0x82, U 0x2F, U 0xBA, U 0xFF, U 0x2C, U 0x51, U 0x02, U 0x0F, U 0xDD, @@ -5719,13 +5870,13 @@ static unsigned char t3fw[30136] = { U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x13, - U 0xDC, U 0x9B, U 0xC0, U 0xD1, + U 0xDC, U 0x05, U 0xC0, U 0xD1, U 0x03, U 0x23, U 0x09, U 0x23, U 0x31, U 0x8D, U 0xC0, U 0xA0, U 0x6F, U 0x34, U 0x02, U 0x60, - U 0x00, U 0x8D, U 0x19, U 0xDC, - U 0x32, U 0x1B, U 0xDC, U 0x33, - U 0x17, U 0xDC, U 0x94, U 0x0C, + U 0x00, U 0x8D, U 0x19, U 0xDB, + U 0x9C, U 0x1B, U 0xDB, U 0x9D, + U 0x17, U 0xDB, U 0xFE, U 0x0C, U 0x28, U 0x11, U 0xA8, U 0x77, U 0x26, U 0x72, U 0x83, U 0x25, U 0x72, U 0x82, U 0x2C, U 0xFA, @@ -5762,7 +5913,7 @@ static unsigned char t3fw[30136] = { U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0xDB, U 0x30, U 0x86, U 0x20, U 0x15, - U 0xDC, U 0x0B, U 0x28, U 0x0A, + U 0xDB, U 0x75, U 0x28, U 0x0A, U 0x00, U 0x28, U 0x25, U 0x02, U 0xDA, U 0x20, U 0x28, U 0xB0, U 0x00, U 0x2C, U 0xB0, U 0x07, @@ -5770,7 +5921,7 @@ static unsigned char t3fw[30136] = { U 0x82, U 0x4C, U 0x2D, U 0x0A, U 0x01, U 0x0B, U 0x80, U 0x00, U 0xDB, U 0xA0, U 0x65, U 0xAF, - U 0xE6, U 0x1A, U 0xDC, U 0x04, + U 0xE6, U 0x1A, U 0xDB, U 0x6E, U 0x0A, U 0x4A, U 0x0A, U 0x29, U 0xA2, U 0xA3, U 0xC7, U 0xBF, U 0x76, U 0x91, U 0x01, U 0xD1, @@ -5778,8 +5929,8 @@ static unsigned char t3fw[30136] = { U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0xD1, U 0xC7, U 0xCF, U 0x1B, - U 0xDB, U 0xFE, U 0x19, U 0xDB, - U 0xFB, U 0x17, U 0xDB, U 0xF9, + U 0xDB, U 0x68, U 0x19, U 0xDB, + U 0x65, U 0x17, U 0xDB, U 0x63, U 0x0C, U 0x28, U 0x11, U 0xA8, U 0x77, U 0x86, U 0x75, U 0x85, U 0x74, U 0xC0, U 0xA0, U 0x76, @@ -5812,17 +5963,17 @@ static unsigned char t3fw[30136] = { U 0x51, U 0xD6, U 0xD2, U 0x80, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x29, - U 0x0A, U 0x80, U 0x1E, U 0xDC, - U 0x00, U 0x1F, U 0xDC, U 0x00, - U 0x1C, U 0xDB, U 0xD8, U 0x0C, + U 0x0A, U 0x80, U 0x1E, U 0xDB, + U 0x69, U 0x1F, U 0xDB, U 0x69, + U 0x1C, U 0xDB, U 0x42, U 0x0C, U 0x2B, U 0x11, U 0xAC, U 0xBB, U 0x2C, U 0x2C, U 0xFC, U 0x2D, U 0xB2, U 0x85, U 0x0F, U 0xCC, U 0x02, U 0x9E, U 0xD1, U 0x9C, U 0xD0, U 0xC0, U 0x51, U 0xC0, - U 0x70, U 0x13, U 0xDB, U 0xFC, - U 0x14, U 0xDB, U 0xFB, U 0x18, - U 0xDB, U 0xF9, U 0x2A, U 0xB2, + U 0x70, U 0x13, U 0xDB, U 0x65, + U 0x14, U 0xDB, U 0x64, U 0x18, + U 0xDB, U 0x62, U 0x2A, U 0xB2, U 0x85, U 0xA8, U 0x28, U 0x04, U 0x24, U 0x0A, U 0x23, U 0x46, U 0x91, U 0xA9, U 0x86, U 0xB8, @@ -5831,20 +5982,20 @@ static unsigned char t3fw[30136] = { U 0x9F, U 0x25, U 0x64, U 0x9F, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x19, - U 0xDC, U 0x2C, U 0x0C, U 0x2A, + U 0xDB, U 0x96, U 0x0C, U 0x2A, U 0x11, U 0xA9, U 0xA9, U 0x89, U 0x90, U 0xC4, U 0x84, U 0x79, - U 0x8B, U 0x76, U 0x1B, U 0xDC, - U 0x1A, U 0xAB, U 0xAC, U 0x2A, + U 0x8B, U 0x76, U 0x1B, U 0xDB, + U 0x84, U 0xAB, U 0xAC, U 0x2A, U 0xC2, U 0x83, U 0x2C, U 0xC2, U 0x84, U 0x7A, U 0xC1, U 0x68, U 0x8A, U 0xA0, U 0x2B, U 0xBC, U 0x30, U 0xD3, U 0xA0, U 0x64, U 0xA0, U 0x5E, U 0x0B, U 0x2B, U 0x0A, U 0x2C, U 0xB2, U 0xA3, - U 0x19, U 0xDB, U 0xE5, U 0x68, - U 0xC0, U 0x07, U 0x1D, U 0xDC, - U 0x20, U 0xD3, U 0x0F, U 0x7D, + U 0x19, U 0xDB, U 0x4E, U 0x68, + U 0xC0, U 0x07, U 0x1D, U 0xDB, + U 0x8A, U 0xD3, U 0x0F, U 0x7D, U 0xC9, U 0x4A, U 0xA9, U 0x29, U 0x29, U 0x9D, U 0x01, U 0x29, U 0x90, U 0x1F, U 0x68, U 0x91, @@ -5855,9 +6006,9 @@ static unsigned char t3fw[30136] = { U 0x2A, U 0x2C, U 0xFC, U 0x5B, U 0xFF, U 0xB3, U 0xD2, U 0x30, U 0xD1, U 0x0F, U 0x00, U 0x00, - U 0x13, U 0xDB, U 0xC5, U 0x03, + U 0x13, U 0xDB, U 0x80, U 0x03, U 0xA3, U 0x01, U 0x8C, U 0x31, - U 0x1D, U 0xDB, U 0xB6, U 0x0C, + U 0x1D, U 0xDB, U 0x20, U 0x0C, U 0x8C, U 0x14, U 0x0D, U 0xCC, U 0x01, U 0x2C, U 0xB6, U 0xA3, U 0x63, U 0xFF, U 0xDC, U 0x00, @@ -5868,20 +6019,20 @@ static unsigned char t3fw[30136] = { U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xDB, U 0x30, U 0xC0, U 0xD0, U 0x19, - U 0xDB, U 0xA1, U 0xDA, U 0x20, + U 0xDB, U 0x0B, U 0xDA, U 0x20, U 0x28, U 0x30, U 0x00, U 0x22, U 0x30, U 0x07, U 0x08, U 0x48, U 0x12, U 0x09, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xDC, U 0x20, U 0x0B, U 0x80, U 0x00, - U 0x1B, U 0xDB, U 0x9C, U 0x0C, + U 0x1B, U 0xDB, U 0x06, U 0x0C, U 0x4A, U 0x11, U 0xAB, U 0xAA, U 0x29, U 0xA2, U 0x84, U 0x09, U 0x29, U 0x0B, U 0x29, U 0xA6, U 0x84, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, - U 0x41, U 0x18, U 0xDB, U 0x95, - U 0x17, U 0xDB, U 0x97, U 0x0C, + U 0x41, U 0x18, U 0xDA, U 0xFF, + U 0x17, U 0xDB, U 0x01, U 0x0C, U 0x26, U 0x11, U 0xA7, U 0x27, U 0x27, U 0x70, U 0x30, U 0xA8, U 0x66, U 0x25, U 0x62, U 0x86, @@ -5889,17 +6040,17 @@ static unsigned char t3fw[30136] = { U 0x55, U 0x00, U 0x44, U 0x1A, U 0x75, U 0x41, U 0x48, U 0x22, U 0x62, U 0x84, U 0x15, U 0xDB, - U 0xB8, U 0x02, U 0x32, U 0x0B, + U 0x21, U 0x02, U 0x32, U 0x0B, U 0xC9, U 0x22, U 0x88, U 0x21, - U 0x17, U 0xDB, U 0x94, U 0x08, + U 0x17, U 0xDA, U 0xFE, U 0x08, U 0x84, U 0x14, U 0x07, U 0x44, U 0x01, U 0x75, U 0x49, U 0x05, U 0xC8, U 0x34, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xD1, U 0x0F, U 0x08, U 0x09, U 0x47, U 0x1D, - U 0xDB, U 0xEB, U 0xC0, U 0xB2, - U 0x8E, U 0x20, U 0x1F, U 0xDB, - U 0x82, U 0x0E, U 0x0E, U 0x43, + U 0xDB, U 0x55, U 0xC0, U 0xB2, + U 0x8E, U 0x20, U 0x1F, U 0xDA, + U 0xEC, U 0x0E, U 0x0E, U 0x43, U 0xAF, U 0xEC, U 0x2B, U 0xC4, U 0xA0, U 0x0F, U 0xEE, U 0x0A, U 0x2D, U 0xE6, U 0x24, U 0x2A, @@ -5909,55 +6060,55 @@ static unsigned char t3fw[30136] = { U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0xDB, U 0x30, U 0xC0, U 0xD0, U 0x18, - U 0xDB, U 0x78, U 0xDA, U 0x20, + U 0xDA, U 0xE2, U 0xDA, U 0x20, U 0x25, U 0x30, U 0x00, U 0x22, U 0x30, U 0x07, U 0x08, U 0x58, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xDC, U 0x20, U 0x0B, U 0x80, U 0x00, U 0x89, U 0x31, U 0x70, - U 0x9E, U 0x12, U 0x1B, U 0xDB, - U 0x72, U 0x0C, U 0x4A, U 0x11, + U 0x9E, U 0x12, U 0x1B, U 0xDA, + U 0xDC, U 0x0C, U 0x4A, U 0x11, U 0xAB, U 0xAA, U 0x29, U 0xA2, U 0x84, U 0x09, U 0x29, U 0x0B, U 0x29, U 0xA6, U 0x84, U 0xD1, U 0x0F, U 0x09, U 0xC9, U 0x52, U 0x68, U 0x53, U 0x26, U 0x00, - U 0x91, U 0x04, U 0x18, U 0xDB, - U 0x6D, U 0xC0, U 0xA1, U 0x2F, + U 0x91, U 0x04, U 0x18, U 0xDA, + U 0xD7, U 0xC0, U 0xA1, U 0x2F, U 0x81, U 0x12, U 0x00, U 0xAA, U 0x1A, U 0x0A, U 0xFF, U 0x02, U 0x2F, U 0x85, U 0x12, U 0x1E, - U 0xDB, U 0x67, U 0x0C, U 0x4D, + U 0xDA, U 0xD1, U 0x0C, U 0x4D, U 0x11, U 0xAE, U 0xDD, U 0x2C, U 0xD2, U 0x84, U 0x0C, U 0x2C, U 0x0B, U 0x2C, U 0xD6, U 0x84, U 0xD1, U 0x0F, U 0xC0, U 0x81, - U 0x1F, U 0xDB, U 0x64, U 0xB8, + U 0x1F, U 0xDA, U 0xCE, U 0xB8, U 0x9A, U 0x0A, U 0x0A, U 0x47, U 0x2E, U 0xF1, U 0x12, U 0x00, U 0xA1, U 0x04, U 0x00, U 0x88, U 0x1A, U 0x08, U 0xEE, U 0x02, U 0x2E, U 0xF5, U 0x12, U 0x1D, - U 0xDB, U 0x5C, U 0x0C, U 0x4C, + U 0xDA, U 0xC6, U 0x0C, U 0x4C, U 0x11, U 0xAD, U 0xCC, U 0x2B, U 0xC2, U 0x84, U 0x0B, U 0x2B, U 0x0B, U 0x2B, U 0xC6, U 0x84, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xDB, U 0x30, U 0xC0, U 0xD0, U 0x19, - U 0xDB, U 0x54, U 0xDA, U 0x20, + U 0xDA, U 0xBE, U 0xDA, U 0x20, U 0x28, U 0x30, U 0x00, U 0x22, U 0x30, U 0x07, U 0x09, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x4C, U 0xDC, U 0x20, U 0x0B, U 0x80, - U 0x00, U 0x1C, U 0xDB, U 0x4F, + U 0x00, U 0x1C, U 0xDA, U 0xB9, U 0x0C, U 0x4B, U 0x11, U 0xAC, U 0xBB, U 0x2A, U 0xB2, U 0x84, U 0x0A, U 0x2A, U 0x0B, U 0x2A, U 0xB6, U 0x84, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0xC0, - U 0x41, U 0x18, U 0xDB, U 0x49, - U 0x16, U 0xDB, U 0x4B, U 0x0C, + U 0x41, U 0x18, U 0xDA, U 0xB3, + U 0x16, U 0xDA, U 0xB5, U 0x0C, U 0x27, U 0x11, U 0xA6, U 0x26, U 0x26, U 0x60, U 0x30, U 0xA8, U 0x72, U 0x25, U 0x22, U 0x86, @@ -5968,7 +6119,7 @@ static unsigned char t3fw[30136] = { U 0x0B, U 0xD1, U 0x0F, U 0x00, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0x15, - U 0xDB, U 0xA5, U 0x02, U 0x49, + U 0xDB, U 0x10, U 0x02, U 0x49, U 0x14, U 0x29, U 0x56, U 0x11, U 0x24, U 0x52, U 0x12, U 0x02, U 0x08, U 0x43, U 0x0F, U 0x88, @@ -5984,8 +6135,8 @@ static unsigned char t3fw[30136] = { U 0x23, U 0x02, U 0x60, U 0x00, U 0xAC, U 0x64, U 0x20, U 0xA7, U 0xC0, U 0xA0, U 0x85, U 0x10, - U 0x13, U 0xDB, U 0x7E, U 0x16, - U 0xDB, U 0x94, U 0xC0, U 0x40, + U 0x13, U 0xDA, U 0xE8, U 0x16, + U 0xDA, U 0xFF, U 0xC0, U 0x40, U 0xA6, U 0xAA, U 0x2B, U 0xA2, U 0xAE, U 0x0B, U 0x19, U 0x41, U 0x64, U 0x90, U 0x66, U 0x68, @@ -6007,7 +6158,7 @@ static unsigned char t3fw[30136] = { U 0x00, U 0xB1, U 0x44, U 0x72, U 0x49, U 0xB1, U 0x60, U 0x00, U 0x4A, U 0x7F, U 0xBF, U 0x07, - U 0x15, U 0xDB, U 0x7F, U 0x63, + U 0x15, U 0xDA, U 0xEA, U 0x63, U 0xFF, U 0xB9, U 0x00, U 0x00, U 0x25, U 0x3A, U 0xE8, U 0x63, U 0xFF, U 0xB1, U 0x00, U 0x00, @@ -6027,9 +6178,9 @@ static unsigned char t3fw[30136] = { U 0x50, U 0x63, U 0xFF, U 0xA7, U 0xD1, U 0x0F, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0x1A, - U 0xDB, U 0x05, U 0x19, U 0xDB, - U 0x02, U 0x1C, U 0xDB, U 0x6A, - U 0x1B, U 0xDB, U 0x6B, U 0xC0, + U 0xDA, U 0x6F, U 0x19, U 0xDA, + U 0x6C, U 0x1C, U 0xDA, U 0xD5, + U 0x1B, U 0xDA, U 0xD6, U 0xC0, U 0x80, U 0xC0, U 0x71, U 0x60, U 0x00, U 0x0D, U 0x00, U 0x00, U 0x00, U 0x22, U 0xA4, U 0x30, @@ -6059,18 +6210,18 @@ static unsigned char t3fw[30136] = { U 0x98, U 0x2D, U 0x98, U 0x2E, U 0x98, U 0x2F, U 0x22, U 0x2C, U 0x40, U 0x63, U 0xFF, U 0x97, - U 0x1E, U 0xDA, U 0xE3, U 0x27, + U 0x1E, U 0xDA, U 0x4D, U 0x27, U 0xE6, U 0x80, U 0x27, U 0xE6, U 0x81, U 0xD1, U 0x0F, U 0x00, U 0xC0, U 0x20, U 0x63, U 0xFF, U 0x83, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, U 0x62, U 0xC0, U 0x41, U 0x12, - U 0xDA, U 0xDE, U 0x1A, U 0xDA, - U 0xDA, U 0x13, U 0xDB, U 0x45, + U 0xDA, U 0x48, U 0x1A, U 0xDA, + U 0x44, U 0x13, U 0xDA, U 0xB0, U 0x2A, U 0xA0, U 0x00, U 0x23, - U 0x32, U 0x2D, U 0x19, U 0xDB, - U 0x3F, U 0x2B, U 0xAC, U 0xFE, + U 0x32, U 0x2D, U 0x19, U 0xDA, + U 0xAA, U 0x2B, U 0xAC, U 0xFE, U 0x29, U 0x92, U 0xAE, U 0x6E, U 0xA3, U 0x02, U 0x60, U 0x00, U 0x8E, U 0x09, U 0x0E, U 0x40, @@ -6078,46 +6229,46 @@ static unsigned char t3fw[30136] = { U 0xCD, U 0x0E, U 0xDC, U 0x39, U 0x2C, U 0x25, U 0x16, U 0x64, U 0xB0, U 0x89, U 0x5B, U 0xFF, - U 0x9E, U 0x15, U 0xDB, U 0x3B, - U 0x1A, U 0xDA, U 0xE5, U 0x2B, + U 0x9E, U 0x15, U 0xDA, U 0xA6, + U 0x1A, U 0xDA, U 0xA0, U 0x2B, U 0x3A, U 0xE8, U 0x0A, U 0x3A, - U 0x01, U 0x58, U 0x05, U 0x76, + U 0x01, U 0x58, U 0x05, U 0x8B, U 0x2B, U 0x21, U 0x16, U 0x0A, U 0xBB, U 0x28, U 0xD3, U 0xA0, - U 0x2B, U 0x56, U 0x00, U 0x58, - U 0x05, U 0x8D, U 0x8B, U 0x50, + U 0x9B, U 0x50, U 0x58, U 0x05, + U 0xA2, U 0x2B, U 0x52, U 0x00, U 0x0A, U 0xBB, U 0x08, U 0x2A, U 0x0A, U 0x00, U 0x58, U 0x05, - U 0x8C, U 0x15, U 0xDB, U 0x32, + U 0xA1, U 0x15, U 0xDA, U 0x9D, U 0x2D, U 0x21, U 0x02, U 0x2C, U 0x3A, U 0xE8, U 0x0C, U 0x3C, U 0x28, U 0x04, U 0xDD, U 0x02, U 0x2D, U 0x25, U 0x02, U 0x9C, - U 0x50, U 0x58, U 0x05, U 0x84, + U 0x50, U 0x58, U 0x05, U 0x99, U 0x8B, U 0x50, U 0xAA, U 0xBB, U 0xC0, U 0xA1, U 0x58, U 0x05, - U 0x84, U 0x1C, U 0xDB, U 0x2B, + U 0x99, U 0x1C, U 0xDA, U 0x96, U 0x2D, U 0x21, U 0x02, U 0x0C, U 0x3C, U 0x28, U 0x06, U 0xDD, - U 0x02, U 0x13, U 0xDB, U 0x29, + U 0x02, U 0x13, U 0xDA, U 0x94, U 0x2D, U 0x25, U 0x02, U 0x9C, - U 0x30, U 0x58, U 0x05, U 0x7C, + U 0x30, U 0x58, U 0x05, U 0x91, U 0x8B, U 0x30, U 0xAA, U 0xBB, U 0xC0, U 0xA2, U 0x58, U 0x05, - U 0x7C, U 0x2A, U 0x21, U 0x02, + U 0x91, U 0x2A, U 0x21, U 0x02, U 0xC0, U 0xB4, U 0x0B, U 0xAA, U 0x02, U 0x0A, U 0x0A, U 0x4F, U 0x2A, U 0x25, U 0x02, U 0x58, - U 0x05, U 0x90, U 0xD1, U 0x0F, + U 0x05, U 0xA5, U 0xD1, U 0x0F, U 0x24, U 0x24, U 0x23, U 0xC3, U 0xCC, U 0x2C, U 0x25, U 0x16, U 0x63, U 0xFF, U 0x76, U 0x00, - U 0x18, U 0xDB, U 0x21, U 0x1C, - U 0xDB, U 0x1D, U 0x19, U 0xDB, - U 0x1E, U 0x1B, U 0xDB, U 0x1C, - U 0x17, U 0xDA, U 0xF0, U 0x85, + U 0x18, U 0xDA, U 0x8C, U 0x1C, + U 0xDA, U 0x88, U 0x19, U 0xDA, + U 0x89, U 0x1B, U 0xDA, U 0x87, + U 0x17, U 0xDA, U 0x5A, U 0x85, U 0x20, U 0x2E, U 0x0A, U 0xFD, - U 0x1F, U 0xDB, U 0x1D, U 0x2D, + U 0x1F, U 0xDA, U 0x88, U 0x2D, U 0x20, U 0x2E, U 0x24, U 0xF4, U 0x7A, U 0x24, U 0xF4, U 0x7E, U 0x24, U 0xF4, U 0x82, U 0x0E, @@ -6146,14 +6297,14 @@ static unsigned char t3fw[30136] = { U 0x6C, U 0x10, U 0x04, U 0x2A, U 0x0A, U 0x30, U 0x2B, U 0x0A, U 0x03, U 0x5B, U 0xFF, U 0x4D, - U 0x12, U 0xDA, U 0xF3, U 0xC3, + U 0x12, U 0xDA, U 0x5E, U 0xC3, U 0x90, U 0x29, U 0x26, U 0x16, U 0xC3, U 0xA1, U 0xC0, U 0xB3, U 0xC0, U 0x8A, U 0x28, U 0x26, U 0x17, U 0x5B, U 0xFF, U 0x48, U 0xC0, U 0x3C, U 0xC3, U 0xB1, U 0x2B, U 0x26, U 0x16, U 0x1A, - U 0xDA, U 0x87, U 0x2A, U 0xA0, + U 0xD9, U 0xF1, U 0x2A, U 0xA0, U 0x20, U 0x23, U 0x26, U 0x17, U 0x64, U 0xA0, U 0x79, U 0xC3, U 0xA2, U 0xC0, U 0xB1, U 0x5B, @@ -6184,24 +6335,24 @@ static unsigned char t3fw[30136] = { U 0x28, U 0x26, U 0x17, U 0xC2, U 0xFB, U 0x2F, U 0x26, U 0x16, U 0xC0, U 0xE7, U 0x2E, U 0x26, - U 0x17, U 0x1D, U 0xDA, U 0xDA, + U 0x17, U 0x1D, U 0xDA, U 0x45, U 0x2D, U 0x26, U 0x10, U 0xD1, U 0x0F, U 0xC3, U 0xA2, U 0xC0, U 0xB3, U 0x5B, U 0xFF, U 0x23, U 0x63, U 0xFF, U 0x82, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x1C, - U 0xDA, U 0xA4, U 0x1B, U 0xDA, - U 0x91, U 0x18, U 0xDA, U 0xD4, - U 0x17, U 0xDA, U 0xD5, U 0x16, - U 0xDA, U 0xD5, U 0x15, U 0xDA, - U 0xD5, U 0xC0, U 0xE0, U 0xC0, - U 0xD4, U 0x14, U 0xDA, U 0xA0, - U 0x1F, U 0xDA, U 0x5C, U 0xC0, + U 0xDA, U 0x0E, U 0x1B, U 0xD9, + U 0xF9, U 0x18, U 0xDA, U 0x3F, + U 0x17, U 0xDA, U 0x40, U 0x16, + U 0xDA, U 0x40, U 0x15, U 0xDA, + U 0x40, U 0xC0, U 0xE0, U 0xC0, + U 0xD4, U 0x14, U 0xDA, U 0x0A, + U 0x1F, U 0xD9, U 0xC6, U 0xC0, U 0x28, U 0x8F, U 0xF0, U 0x6D, U 0x2A, U 0x36, U 0xDA, U 0xC0, U 0xD9, U 0xC0, U 0x7C, U 0x5B, U 0x02, U 0x0F, U 0xC9, U 0x0C, - U 0x1C, U 0xDA, U 0x9A, U 0x0C, + U 0x1C, U 0xDA, U 0x04, U 0x0C, U 0x9C, U 0x28, U 0xA8, U 0xC3, U 0xA6, U 0xC2, U 0x2A, U 0x36, U 0x80, U 0x2A, U 0x25, U 0x84, @@ -6212,13 +6363,13 @@ static unsigned char t3fw[30136] = { U 0xB1, U 0xBB, U 0x2E, U 0x36, U 0x9F, U 0x2C, U 0x36, U 0x9E, U 0x2C, U 0x36, U 0x9D, U 0xB1, - U 0xAC, U 0x1C, U 0xDA, U 0x7B, - U 0x1B, U 0xDA, U 0xC3, U 0xC0, + U 0xAC, U 0x1C, U 0xD9, U 0xE3, + U 0x1B, U 0xDA, U 0x2E, U 0xC0, U 0x28, U 0x6D, U 0x2A, U 0x33, U 0xDA, U 0xC0, U 0xD9, U 0xC0, U 0x7C, U 0x5B, U 0x02, U 0x0F, - U 0xC9, U 0x0C, U 0x1C, U 0xDA, - U 0x89, U 0x0C, U 0x9C, U 0x28, + U 0xC9, U 0x0C, U 0x1C, U 0xD9, + U 0xF3, U 0x0C, U 0x9C, U 0x28, U 0xA8, U 0xC3, U 0xA6, U 0xC2, U 0x2A, U 0x36, U 0x80, U 0x2B, U 0x25, U 0x84, U 0xA4, U 0xC2, @@ -6228,14 +6379,14 @@ static unsigned char t3fw[30136] = { U 0x8A, U 0x2E, U 0x36, U 0x9F, U 0x2C, U 0x36, U 0x9E, U 0x2C, U 0x36, U 0x9D, U 0xB1, U 0xAC, - U 0xC0, U 0x79, U 0x19, U 0xDA, - U 0x79, U 0x1B, U 0xDA, U 0xB5, - U 0x13, U 0xDA, U 0xB3, U 0x1A, - U 0xDA, U 0xB3, U 0x18, U 0xDA, - U 0xB4, U 0x14, U 0xDA, U 0x7A, - U 0x16, U 0xDA, U 0xB4, U 0x04, + U 0xC0, U 0x79, U 0x19, U 0xD9, + U 0xE3, U 0x1B, U 0xDA, U 0x20, + U 0x13, U 0xDA, U 0x1E, U 0x1A, + U 0xDA, U 0x1E, U 0x18, U 0xDA, + U 0x1F, U 0x14, U 0xD9, U 0xE4, + U 0x16, U 0xDA, U 0x1F, U 0x04, U 0xF4, U 0x28, U 0x12, U 0xDA, - U 0xB3, U 0x04, U 0x66, U 0x0C, + U 0x1E, U 0x04, U 0x66, U 0x0C, U 0x04, U 0x05, U 0x06, U 0xA2, U 0x52, U 0xA8, U 0x58, U 0xAA, U 0x5A, U 0xA3, U 0x53, U 0x9B, @@ -6243,12 +6394,12 @@ static unsigned char t3fw[30136] = { U 0x27, U 0x84, U 0x8A, U 0xC0, U 0x91, U 0xC0, U 0xA5, U 0x2A, U 0x84, U 0x8C, U 0x29, U 0x84, - U 0x8B, U 0x17, U 0xDA, U 0xAC, - U 0x18, U 0xDA, U 0xAB, U 0xA7, + U 0x8B, U 0x17, U 0xDA, U 0x17, + U 0x18, U 0xDA, U 0x16, U 0xA7, U 0x57, U 0x26, U 0x36, U 0x1D, U 0x26, U 0x36, U 0x1E, U 0x2E, U 0x36, U 0x1F, U 0x16, U 0xDA, - U 0xA9, U 0x13, U 0xDA, U 0xA9, + U 0x14, U 0x13, U 0xDA, U 0x14, U 0xA6, U 0x55, U 0x04, U 0x33, U 0x0C, U 0x28, U 0x26, U 0xC8, U 0x2E, U 0x75, U 0x00, U 0x2D, @@ -6258,40 +6409,40 @@ static unsigned char t3fw[30136] = { U 0x26, U 0xE5, U 0x2E, U 0x26, U 0xE7, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x13, - U 0xDA, U 0x87, U 0x17, U 0xDA, - U 0x82, U 0x24, U 0x72, U 0x3D, + U 0xD9, U 0xF2, U 0x17, U 0xD9, + U 0xED, U 0x24, U 0x72, U 0x3D, U 0x22, U 0x32, U 0x93, U 0x7F, U 0x2F, U 0x0B, U 0x6D, U 0x08, U 0x05, U 0x28, U 0x32, U 0x93, U 0x7F, U 0x8F, U 0x02, U 0x63, U 0xFF, U 0xF3, U 0xC0, U 0xC4, - U 0xC0, U 0xB0, U 0x1A, U 0xDA, - U 0x16, U 0xC0, U 0x51, U 0xD9, + U 0xC0, U 0xB0, U 0x1A, U 0xD9, + U 0x80, U 0xC0, U 0x51, U 0xD9, U 0x40, U 0x04, U 0x59, U 0x39, U 0x29, U 0xA4, U 0x20, U 0x6E, U 0x44, U 0x02, U 0x0B, U 0xB5, U 0x02, U 0xC3, U 0x28, U 0x1E, - U 0xDA, U 0x11, U 0xDD, U 0xB0, + U 0xD9, U 0x7B, U 0xDD, U 0xB0, U 0x25, U 0xE4, U 0x22, U 0x05, U 0x2D, U 0x39, U 0x2D, U 0xE4, U 0x21, U 0xC0, U 0x50, U 0x1E, - U 0xDA, U 0x90, U 0x19, U 0xDA, - U 0x80, U 0x18, U 0xDA, U 0x80, - U 0x16, U 0xDA, U 0x82, U 0x1D, - U 0xDA, U 0x8E, U 0x94, U 0x10, + U 0xD9, U 0xFB, U 0x19, U 0xD9, + U 0xEB, U 0x18, U 0xD9, U 0xEB, + U 0x16, U 0xD9, U 0xED, U 0x1D, + U 0xD9, U 0xF9, U 0x94, U 0x10, U 0x2A, U 0x72, U 0x45, U 0x17, - U 0xDA, U 0x4C, U 0x6D, U 0xA9, + U 0xD9, U 0xB6, U 0x6D, U 0xA9, U 0x4B, U 0xD4, U 0x50, U 0xB3, U 0x55, U 0x7A, U 0x5B, U 0x17, U 0xDF, U 0x50, U 0x75, U 0x6B, - U 0x07, U 0x1F, U 0xDA, U 0x03, + U 0x07, U 0x1F, U 0xD9, U 0x6D, U 0x8F, U 0xF0, U 0x0F, U 0x5F, - U 0x0C, U 0x12, U 0xDA, U 0x44, + U 0x0C, U 0x12, U 0xD9, U 0xAE, U 0x02, U 0xF2, U 0x28, U 0xAE, U 0x22, U 0x22, U 0xD6, U 0x81, - U 0xD5, U 0x40, U 0x13, U 0xDA, - U 0x41, U 0x74, U 0x6B, U 0x07, - U 0x15, U 0xD9, U 0xFD, U 0x85, + U 0xD5, U 0x40, U 0x13, U 0xD9, + U 0xAB, U 0x74, U 0x6B, U 0x07, + U 0x15, U 0xD9, U 0x67, U 0x85, U 0x50, U 0x05, U 0x45, U 0x0C, U 0x03, U 0x53, U 0x28, U 0xB1, U 0x45, U 0xA7, U 0x3F, U 0xA8, @@ -6300,73 +6451,73 @@ static unsigned char t3fw[30136] = { U 0x9E, U 0x24, U 0x36, U 0x80, U 0x2B, U 0x36, U 0x9F, U 0x2B, U 0xF4, U 0x8B, U 0x2C, U 0xF4, - U 0x8C, U 0x14, U 0xDA, U 0x5C, + U 0x8C, U 0x14, U 0xD9, U 0xC7, U 0x24, U 0x42, U 0x4D, U 0xC0, U 0x30, U 0x04, U 0x14, U 0x14, U 0xC8, U 0x4C, U 0x6D, U 0x08, U 0x06, U 0xB1, U 0x33, U 0x04, U 0x14, U 0x14, U 0xC8, U 0x42, U 0x63, U 0xFF, U 0xF2, U 0x00, - U 0x15, U 0xD9, U 0xEA, U 0xC4, + U 0x15, U 0xD9, U 0x54, U 0xC4, U 0x40, U 0x00, U 0x31, U 0x04, - U 0x1A, U 0xD9, U 0xEB, U 0xC0, + U 0x1A, U 0xD9, U 0x55, U 0xC0, U 0xD1, U 0x93, U 0xA2, U 0x00, U 0xDD, U 0x1A, U 0xC1, U 0x38, U 0xB0, U 0xDD, U 0x9D, U 0xA3, - U 0x18, U 0xDA, U 0x50, U 0x2B, + U 0x18, U 0xD9, U 0xBB, U 0x2B, U 0x82, U 0x4D, U 0x29, U 0x82, U 0x4E, U 0x29, U 0xA5, U 0x1C, U 0x28, U 0x82, U 0x53, U 0x7A, U 0x87, U 0x1E, U 0x2C, U 0x54, U 0x00, U 0x8E, U 0x10, U 0x6F, U 0xE4, U 0x5D, U 0x12, U 0xD9, - U 0xE0, U 0x2F, U 0x21, U 0x1D, + U 0x4A, U 0x2F, U 0x21, U 0x1D, U 0x23, U 0x21, U 0x1C, U 0x2F, U 0x25, U 0x1B, U 0x04, U 0x33, U 0x0C, U 0x23, U 0x25, U 0x1C, U 0x23, U 0x25, U 0x1A, U 0xD1, U 0x0F, U 0xC0, U 0x62, U 0x18, - U 0xDA, U 0x3F, U 0x88, U 0x80, + U 0xD9, U 0xAA, U 0x88, U 0x80, U 0x7E, U 0x87, U 0xD9, U 0x89, U 0x10, U 0x26, U 0x54, U 0x00, U 0x6F, U 0x94, U 0x19, U 0x1B, - U 0xD9, U 0xD6, U 0x2A, U 0xB1, + U 0xD9, U 0x40, U 0x2A, U 0xB1, U 0x1C, U 0x0A, U 0x1A, U 0x14, U 0x04, U 0xAA, U 0x0C, U 0x2A, U 0xB5, U 0x1C, U 0x2A, U 0xB5, U 0x1D, U 0x2A, U 0xB5, U 0x1A, U 0x2A, U 0xB5, U 0x1B, U 0xD1, - U 0x0F, U 0x1B, U 0xD9, U 0xCF, + U 0x0F, U 0x1B, U 0xD9, U 0x39, U 0x2A, U 0xB1, U 0x1C, U 0x0A, U 0x1A, U 0x14, U 0x03, U 0xAA, U 0x0C, U 0x2A, U 0xB5, U 0x1C, U 0x2A, U 0xB5, U 0x1D, U 0x2A, U 0xB5, U 0x1A, U 0x2A, U 0xB5, U 0x1B, U 0xD1, U 0x0F, U 0x00, - U 0x1C, U 0xD9, U 0xC9, U 0x2B, + U 0x1C, U 0xD9, U 0x33, U 0x2B, U 0xC1, U 0x1D, U 0x2D, U 0xC1, U 0x1C, U 0x2B, U 0xC5, U 0x1B, U 0x03, U 0xDD, U 0x0C, U 0x2D, U 0xC5, U 0x1C, U 0x2D, U 0xC5, U 0x1A, U 0xD1, U 0x0F, U 0x00, U 0x6C, U 0x10, U 0x06, U 0x19, - U 0xD9, U 0xC2, U 0x14, U 0xDA, - U 0x26, U 0x12, U 0xDA, U 0x29, - U 0x15, U 0xDA, U 0x44, U 0xC7, + U 0xD9, U 0x2C, U 0x14, U 0xD9, + U 0x91, U 0x12, U 0xD9, U 0x94, + U 0x15, U 0xD9, U 0xAF, U 0xC7, U 0x3F, U 0xC0, U 0xE0, U 0x2E, U 0x56, U 0xA8, U 0x2E, U 0x56, U 0xA9, U 0x2E, U 0x56, U 0xAA, U 0x2E, U 0x56, U 0xAB, U 0x23, U 0x26, U 0x29, U 0x18, U 0xD9, - U 0xEA, U 0xDB, U 0x10, U 0x1C, - U 0xDA, U 0x3E, U 0xC0, U 0xD4, + U 0x52, U 0xDB, U 0x10, U 0x1C, + U 0xD9, U 0xA9, U 0xC0, U 0xD4, U 0x2A, U 0x42, U 0x45, U 0x2D, U 0x16, U 0x01, U 0x9C, U 0x10, U 0x00, U 0xB0, U 0x89, U 0x0A, U 0x88, U 0x0C, U 0x28, U 0x96, U 0x00, U 0x5B, U 0xFF, U 0x94, U 0x2B, U 0x22, U 0xE3, U 0x18, - U 0xD9, U 0xB2, U 0x0B, U 0x5B, + U 0xD9, U 0x1C, U 0x0B, U 0x5B, U 0x14, U 0x9B, U 0x84, U 0x2A, U 0x22, U 0xE4, U 0x8B, U 0x84, U 0xB1, U 0xAA, U 0x0A, U 0x5A, @@ -6378,27 +6529,27 @@ static unsigned char t3fw[30136] = { U 0x9F, U 0x87, U 0x5B, U 0xFF, U 0x45, U 0x5B, U 0xFF, U 0x16, U 0x23, U 0x46, U 0x3B, U 0xC1, - U 0xB0, U 0x1D, U 0xD9, U 0xA5, - U 0x1C, U 0xDA, U 0x03, U 0x2A, + U 0xB0, U 0x1D, U 0xD9, U 0x0F, + U 0x1C, U 0xD9, U 0x6D, U 0x2A, U 0xD1, U 0x02, U 0x2C, U 0x46, U 0x3A, U 0x0B, U 0xAA, U 0x02, U 0x0A, U 0x0A, U 0x4F, U 0x2A, U 0xD5, U 0x02, U 0x58, U 0x04, - U 0x7C, U 0x5B, U 0xFE, U 0xBF, + U 0x91, U 0x5B, U 0xFE, U 0xBF, U 0x5B, U 0xFE, U 0x98, U 0xC0, U 0x50, U 0xC0, U 0xB0, U 0x16, - U 0xD9, U 0x9B, U 0x14, U 0xD9, - U 0xA3, U 0x17, U 0xDA, U 0x12, + U 0xD9, U 0x05, U 0x14, U 0xD9, + U 0x0D, U 0x17, U 0xD9, U 0x7D, U 0xC0, U 0xC0, U 0xC7, U 0x3E, U 0x93, U 0x12, U 0x2C, U 0x26, U 0x2D, U 0xC0, U 0x30, U 0x60, - U 0x00, U 0x43, U 0x00, U 0x00, + U 0x00, U 0x44, U 0x00, U 0x00, U 0x00, U 0x7F, U 0x9F, U 0x0F, U 0xB1, U 0x55, U 0x09, U 0x19, U 0x14, U 0x65, U 0x9F, U 0xF4, U 0xC0, U 0x50, U 0x0A, U 0xA9, U 0x02, U 0x7F, U 0xA7, U 0xEF, - U 0x18, U 0xD9, U 0x8F, U 0xDA, + U 0x18, U 0xD8, U 0xF9, U 0xDA, U 0x50, U 0x08, U 0x58, U 0x0A, U 0x28, U 0x82, U 0x2C, U 0x2B, U 0x0A, U 0x00, U 0x0B, U 0x80, @@ -6406,63 +6557,67 @@ static unsigned char t3fw[30136] = { U 0xD2, U 0xA0, U 0xC0, U 0x91, U 0xC7, U 0xAF, U 0x00, U 0x99, U 0x1A, U 0x0A, U 0x99, U 0x03, - U 0x99, U 0x12, U 0xCE, U 0x33, - U 0x64, U 0x20, U 0x67, U 0xD3, + U 0x99, U 0x12, U 0xCE, U 0x38, + U 0x64, U 0x20, U 0x6B, U 0xD3, U 0x20, U 0x2B, U 0x20, U 0x07, - U 0x95, U 0x13, U 0x8C, U 0x12, - U 0x2A, U 0x62, U 0x82, U 0x7C, - U 0xA8, U 0x5F, U 0x18, U 0xD9, - U 0x81, U 0x08, U 0x58, U 0x0A, - U 0x28, U 0x82, U 0x2C, U 0xDA, - U 0x50, U 0x0B, U 0x80, U 0x00, - U 0xD2, U 0xA0, U 0x64, U 0x3F, - U 0xDA, U 0x8A, U 0x31, U 0x0A, - U 0x8A, U 0x14, U 0x04, U 0xAA, - U 0x01, U 0xC8, U 0x29, U 0x8B, - U 0x21, U 0x0B, U 0x8B, U 0x14, - U 0x04, U 0xBB, U 0x01, U 0x7B, - U 0xA9, U 0x45, U 0xDD, U 0xA0, - U 0x7A, U 0x7B, U 0x08, U 0x1D, - U 0xD9, U 0x79, U 0x2D, U 0xD2, - U 0x00, U 0x0D, U 0xAD, U 0x0C, - U 0xDB, U 0x30, U 0x19, U 0xD9, - U 0x73, U 0x1A, U 0xD9, U 0xB8, - U 0x28, U 0x12, U 0x03, U 0x0A, - U 0xDA, U 0x28, U 0x08, U 0x8C, - U 0x02, U 0x1D, U 0xD9, U 0xF5, + U 0x25, U 0x16, U 0x03, U 0x2C, + U 0x12, U 0x02, U 0x2A, U 0x62, + U 0x82, U 0x7C, U 0xA8, U 0x63, + U 0x18, U 0xD8, U 0xEB, U 0x01, + U 0x11, U 0x02, U 0x08, U 0x58, + U 0x0A, U 0x28, U 0x82, U 0x2C, + U 0xDA, U 0x50, U 0x0B, U 0x80, + U 0x00, U 0xD2, U 0xA0, U 0x64, + U 0x3F, U 0xD5, U 0x8A, U 0x31, + U 0x0A, U 0x8A, U 0x14, U 0x04, + U 0xAA, U 0x01, U 0xC8, U 0x2A, + U 0x2B, U 0x22, U 0x01, U 0x0B, + U 0x8B, U 0x14, U 0x04, U 0xBB, + U 0x01, U 0x7B, U 0xA9, U 0x45, + U 0xDD, U 0xA0, U 0x7A, U 0x7B, + U 0x08, U 0x1D, U 0xD8, U 0xE1, + U 0x2D, U 0xD2, U 0x00, U 0x0D, + U 0xAD, U 0x0C, U 0xDB, U 0x30, + U 0x19, U 0xD8, U 0xDC, U 0x1A, + U 0xD9, U 0x21, U 0x88, U 0x13, + U 0x0A, U 0xDA, U 0x28, U 0xDC, + U 0x80, U 0x1D, U 0xD9, U 0x5F, U 0x09, U 0x88, U 0x0A, U 0x28, U 0x82, U 0x3C, U 0x0D, U 0xAA, U 0x08, U 0x0B, U 0x80, U 0x00, - U 0x65, U 0x2F, U 0x97, U 0xD3, + U 0x65, U 0x2F, U 0x93, U 0xD3, U 0x20, U 0xC0, U 0xB0, U 0x63, - U 0xFF, U 0x97, U 0xCB, U 0x53, - U 0xB1, U 0x55, U 0x00, U 0x50, - U 0x04, U 0x0A, U 0x09, U 0x19, - U 0x63, U 0xFF, U 0x49, U 0x00, - U 0xDA, U 0xB0, U 0x7B, U 0x7B, - U 0x07, U 0x1A, U 0xD9, U 0x67, - U 0x8A, U 0xA0, U 0x0A, U 0xBA, - U 0x0C, U 0x1B, U 0xD9, U 0xA8, - U 0x8C, U 0x31, U 0x0B, U 0xAB, - U 0x28, U 0x0C, U 0x8A, U 0x14, - U 0x1C, U 0xD9, U 0xE6, U 0xAC, - U 0xBB, U 0x1C, U 0xD9, U 0xE5, - U 0x04, U 0xAA, U 0x01, U 0x2B, - U 0xC6, U 0x81, U 0x63, U 0xFF, - U 0x90, U 0x7F, U 0xA7, U 0xC7, - U 0x63, U 0xFF, U 0x62, U 0x00, + U 0xFF, U 0x94, U 0x00, U 0x00, + U 0x7F, U 0xAF, U 0x34, U 0xB1, + U 0x55, U 0x00, U 0x50, U 0x04, + U 0x0A, U 0x09, U 0x19, U 0x63, + U 0xFF, U 0x42, U 0xDA, U 0xB0, + U 0x7B, U 0x7B, U 0x08, U 0x1A, + U 0xD8, U 0xD0, U 0x2A, U 0xA2, + U 0x00, U 0x0A, U 0xBA, U 0x0C, + U 0x1B, U 0xD9, U 0x11, U 0x8C, + U 0x31, U 0x0B, U 0xAB, U 0x28, + U 0x0C, U 0x8A, U 0x14, U 0x1C, + U 0xD9, U 0x4F, U 0xAC, U 0xBB, + U 0x1C, U 0xD9, U 0x4F, U 0x04, + U 0xAA, U 0x01, U 0x2B, U 0xC6, + U 0x81, U 0x63, U 0xFF, U 0x8F, + U 0x64, U 0x5F, U 0x60, U 0xC0, + U 0x50, U 0xC0, U 0xB0, U 0xC7, + U 0xCE, U 0x9C, U 0x12, U 0x63, + U 0xFF, U 0x55, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x27, U 0x22, U 0x1E, U 0xC0, U 0x80, U 0x08, U 0xE4, U 0x31, U 0x1B, - U 0xD9, U 0x58, U 0x00, U 0x02, + U 0xD8, U 0xBE, U 0x00, U 0x02, U 0x00, U 0x2A, U 0xB2, U 0x82, - U 0x19, U 0xD9, U 0x58, U 0x00, + U 0x19, U 0xD8, U 0xBE, U 0x00, U 0x31, U 0x04, U 0xC0, U 0x61, U 0x00, U 0x66, U 0x1A, U 0x29, U 0x91, U 0x02, U 0x0A, U 0x6A, U 0x02, U 0x2A, U 0xB6, U 0x82, U 0x09, U 0xE4, U 0x31, U 0x15, - U 0xD9, U 0xB3, U 0x0C, U 0x38, + U 0xD9, U 0x19, U 0x0C, U 0x38, U 0x11, U 0xA8, U 0x53, U 0x28, U 0x32, U 0x82, U 0x24, U 0x32, U 0x84, U 0x2A, U 0x8C, U 0xFC, @@ -6478,8 +6633,8 @@ static unsigned char t3fw[30136] = { U 0xC0, U 0x2B, U 0x25, U 0x02, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC0, - U 0xE7, U 0x1D, U 0xD9, U 0x3B, - U 0x1C, U 0xD9, U 0x3D, U 0x0D, + U 0xE7, U 0x1D, U 0xD8, U 0xA1, + U 0x1C, U 0xD8, U 0xA3, U 0x0D, U 0x49, U 0x11, U 0xD7, U 0x20, U 0x8B, U 0x22, U 0x8A, U 0x20, U 0x0B, U 0x4B, U 0x0B, U 0xD2, @@ -6487,7 +6642,7 @@ static unsigned char t3fw[30136] = { U 0x9B, U 0x72, U 0x28, U 0x8C, U 0xF4, U 0xC8, U 0x34, U 0x6F, U 0x8E, U 0x02, U 0x60, U 0x00, - U 0xA2, U 0x1F, U 0xD9, U 0x33, + U 0xA3, U 0x1F, U 0xD8, U 0x99, U 0xA2, U 0x98, U 0xAF, U 0x7B, U 0x78, U 0xB3, U 0x34, U 0xC9, U 0x3D, U 0xC0, U 0x81, U 0xC0, @@ -6498,14 +6653,14 @@ static unsigned char t3fw[30136] = { U 0x05, U 0x00, U 0x30, U 0x88, U 0x00, U 0x50, U 0x8C, U 0x88, U 0x70, U 0x08, U 0x98, U 0x08, - U 0x78, U 0xB1, U 0x6C, U 0xD2, + U 0x78, U 0xB1, U 0x6D, U 0xD2, U 0xA0, U 0x98, U 0x70, U 0xD1, U 0x0F, U 0xC0, U 0xF0, U 0x03, U 0x8F, U 0x38, U 0x7F, U 0xE0, U 0xDE, U 0x63, U 0xFF, U 0xD8, U 0x02, U 0x7B, U 0x0C, U 0xAF, U 0xBB, U 0x0B, U 0x99, U 0x0C, - U 0x64, U 0x30, U 0x46, U 0xD8, + U 0x64, U 0x30, U 0x47, U 0xD8, U 0x30, U 0xC0, U 0xF1, U 0xC0, U 0x50, U 0x02, U 0xF5, U 0x38, U 0x05, U 0x05, U 0x42, U 0x64, @@ -6516,27 +6671,27 @@ static unsigned char t3fw[30136] = { U 0x05, U 0x00, U 0x80, U 0x88, U 0x00, U 0x20, U 0x8C, U 0x06, U 0x44, U 0x0C, U 0xC0, U 0x81, - U 0x25, U 0x0A, U 0x00, U 0x03, - U 0xB2, U 0x08, U 0x23, U 0x7C, - U 0x0C, U 0x03, U 0x85, U 0x38, - U 0x05, U 0x05, U 0x42, U 0x64, - U 0x50, U 0x59, U 0x2C, U 0xD6, - U 0x7E, U 0x6D, U 0x4A, U 0x05, - U 0x00, U 0x20, U 0x88, U 0x00, - U 0x30, U 0x8C, U 0xD2, U 0xA0, - U 0xA7, U 0x98, U 0xBC, U 0x88, - U 0x98, U 0x70, U 0xD1, U 0x0F, - U 0xD2, U 0xA0, U 0xBC, U 0x79, - U 0x99, U 0x70, U 0xD1, U 0x0F, - U 0xD2, U 0x30, U 0x2B, U 0xAD, - U 0x08, U 0xC0, U 0xF1, U 0xC0, - U 0x50, U 0x0B, U 0xF5, U 0x38, - U 0x05, U 0x05, U 0x42, U 0xCB, - U 0x55, U 0x2C, U 0xD6, U 0x7E, - U 0x08, U 0x3F, U 0x14, U 0xC1, - U 0x60, U 0x0F, U 0x66, U 0x0C, - U 0x06, U 0x46, U 0x36, U 0xD3, - U 0x0F, U 0x6D, U 0x6A, U 0x05, + U 0xC0, U 0x50, U 0x03, U 0xB2, + U 0x08, U 0x23, U 0x7C, U 0x0C, + U 0x03, U 0x85, U 0x38, U 0x05, + U 0x05, U 0x42, U 0x64, U 0x50, + U 0x5A, U 0x2C, U 0xD6, U 0x7E, + U 0xD3, U 0x0F, U 0x6D, U 0x4A, + U 0x05, U 0x00, U 0x20, U 0x88, + U 0x00, U 0x30, U 0x8C, U 0xD2, + U 0xA0, U 0xA7, U 0x98, U 0xBC, + U 0x88, U 0x98, U 0x70, U 0xD1, + U 0x0F, U 0xD2, U 0xA0, U 0xBC, + U 0x79, U 0x99, U 0x70, U 0xD1, + U 0x0F, U 0xD2, U 0x30, U 0x2B, + U 0xAD, U 0x08, U 0xC0, U 0xF1, + U 0xC0, U 0x50, U 0x0B, U 0xF5, + U 0x38, U 0x05, U 0x05, U 0x42, + U 0xCB, U 0x54, U 0x2C, U 0xD6, + U 0x7E, U 0x08, U 0x3F, U 0x14, + U 0x26, U 0x0A, U 0x10, U 0x0F, + U 0x66, U 0x0C, U 0x06, U 0x46, + U 0x36, U 0x6D, U 0x6A, U 0x05, U 0x00, U 0x20, U 0x88, U 0x00, U 0xB0, U 0x8C, U 0x82, U 0x70, U 0x63, U 0xFF, U 0x2D, U 0x00, @@ -6544,20 +6699,20 @@ static unsigned char t3fw[30136] = { U 0x38, U 0x75, U 0xE0, U 0x80, U 0x63, U 0xFF, U 0x7A, U 0x00, U 0xC0, U 0x60, U 0x02, U 0x86, - U 0x38, U 0x76, U 0xE0, U 0xA0, - U 0x63, U 0xFF, U 0x9A, U 0x00, + U 0x38, U 0x76, U 0xE0, U 0x9F, + U 0x63, U 0xFF, U 0x99, U 0x00, U 0xC0, U 0x50, U 0x03, U 0xF5, - U 0x38, U 0x75, U 0xE0, U 0xC3, - U 0x63, U 0xFF, U 0xBD, U 0x00, + U 0x38, U 0x75, U 0xE0, U 0xC4, + U 0x63, U 0xFF, U 0xBE, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xD6, U 0x20, U 0x68, U 0x52, U 0x0F, U 0x69, U 0x53, U 0x24, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x00, U 0xF0, + U 0x40, U 0x58, U 0x00, U 0xF2, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0x58, U 0x00, - U 0xED, U 0x9A, U 0x24, U 0x24, + U 0xEF, U 0x9A, U 0x24, U 0x24, U 0x24, U 0x0E, U 0xC0, U 0x21, U 0x22, U 0x64, U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, @@ -6575,8 +6730,8 @@ static unsigned char t3fw[30136] = { U 0x07, U 0x5B, U 0xFF, U 0xA0, U 0x69, U 0x51, U 0x1D, U 0xC0, U 0xE0, U 0x82, U 0x24, U 0x2A, - U 0x60, U 0x0F, U 0x18, U 0xD9, - U 0x66, U 0x2A, U 0x24, U 0x03, + U 0x60, U 0x0F, U 0x18, U 0xD8, + U 0xCD, U 0x2A, U 0x24, U 0x03, U 0x29, U 0x60, U 0x0E, U 0x8F, U 0x20, U 0x29, U 0x24, U 0x07, U 0x08, U 0xFF, U 0x02, U 0x9F, @@ -6584,12 +6739,12 @@ static unsigned char t3fw[30136] = { U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x94, - U 0x23, U 0x19, U 0xD9, U 0x5E, + U 0x23, U 0x19, U 0xD8, U 0xC5, U 0xC0, U 0xB3, U 0x08, U 0x3A, U 0x11, U 0x0B, U 0xAA, U 0x02, U 0x99, U 0x20, U 0x19, U 0xD8, - U 0xD2, U 0x9A, U 0x21, U 0x16, - U 0xD8, U 0xD0, U 0xC0, U 0x50, + U 0x38, U 0x9A, U 0x21, U 0x16, + U 0xD8, U 0x36, U 0xC0, U 0x50, U 0x28, U 0x92, U 0x9D, U 0x25, U 0x64, U 0xA2, U 0x28, U 0x8C, U 0x18, U 0x28, U 0x96, U 0x9D, @@ -6599,84 +6754,86 @@ static unsigned char t3fw[30136] = { U 0x23, U 0x24, U 0x06, U 0xB7, U 0x88, U 0x28, U 0x24, U 0x66, U 0xD1, U 0x0F, U 0x00, U 0x00, - U 0x6C, U 0x10, U 0x06, U 0x03, - U 0x5A, U 0x0C, U 0x0D, U 0x36, - U 0x11, U 0x0D, U 0x5C, U 0x11, - U 0xD8, U 0x20, U 0x8B, U 0x22, - U 0x82, U 0x21, U 0x0C, U 0xBB, - U 0x0C, U 0x06, U 0x55, U 0x0F, - U 0x9B, U 0x82, U 0x02, U 0x32, - U 0x0B, U 0x92, U 0x81, U 0x13, - U 0xD8, U 0xBC, U 0xD9, U 0x20, - U 0xA3, U 0x8F, U 0x64, U 0x50, - U 0x53, U 0x1C, U 0xD8, U 0xB8, - U 0xC0, U 0xD7, U 0x1B, U 0xD8, - U 0xB9, U 0xA2, U 0x56, U 0xC0, - U 0xE1, U 0x29, U 0x0A, U 0x00, - U 0x04, U 0xE9, U 0x38, U 0x09, - U 0x09, U 0x42, U 0x76, U 0xF3, - U 0x4A, U 0x04, U 0x43, U 0x02, - U 0xC9, U 0x9E, U 0x2B, U 0xC6, - U 0x7E, U 0x6D, U 0xAA, U 0x05, - U 0x00, U 0x20, U 0x88, U 0x00, - U 0x30, U 0x8C, U 0x89, U 0x81, - U 0xA9, U 0x59, U 0x09, U 0xFA, - U 0x0C, U 0x64, U 0xA0, U 0x79, - U 0x99, U 0x81, U 0x8A, U 0x82, - U 0xC8, U 0xAD, U 0xD2, U 0x90, - U 0xD1, U 0x0F, U 0xC0, U 0x60, - U 0x02, U 0xE6, U 0x38, U 0x76, - U 0xD0, U 0xDA, U 0x63, U 0xFF, - U 0xD4, U 0xC0, U 0x20, U 0xBC, - U 0x89, U 0x99, U 0x81, U 0x99, - U 0x80, U 0x92, U 0x82, U 0xD1, - U 0x0F, U 0x7F, U 0x23, U 0x04, - U 0x29, U 0x2D, U 0xF8, U 0x99, - U 0x81, U 0x65, U 0xBF, U 0xD9, - U 0x63, U 0xFF, U 0xE5, U 0x00, - U 0x02, U 0x8F, U 0x0C, U 0xA3, - U 0xFF, U 0x0F, U 0x33, U 0x12, - U 0x93, U 0x10, U 0x03, U 0xAA, - U 0x0C, U 0xD3, U 0x40, U 0xCB, - U 0x9E, U 0x2B, U 0xC6, U 0x7E, - U 0x86, U 0x10, U 0x6D, U 0x6A, + U 0x6C, U 0x10, U 0x06, U 0x0D, + U 0x3C, U 0x11, U 0x1A, U 0xD8, + U 0x28, U 0xD8, U 0x20, U 0x03, + U 0x5B, U 0x0C, U 0x86, U 0x22, + U 0x0D, U 0x55, U 0x11, U 0x82, + U 0x21, U 0xAA, U 0x89, U 0x02, + U 0x32, U 0x0B, U 0x92, U 0x81, + U 0x05, U 0x63, U 0x0C, U 0x93, + U 0x82, U 0x0C, U 0x55, U 0x0C, + U 0x79, U 0x2B, U 0x54, U 0xCB, + U 0x53, U 0x1C, U 0xD8, U 0x20, + U 0x1D, U 0xD8, U 0x1E, U 0xC0, + U 0xF7, U 0xA2, U 0x56, U 0xC0, + U 0x31, U 0xC0, U 0xA0, U 0x04, + U 0x3A, U 0x38, U 0x0A, U 0x0A, + U 0x42, U 0x76, U 0x93, U 0x43, + U 0x04, U 0x43, U 0x02, U 0xC9, + U 0xAB, U 0x2C, U 0xD6, U 0x7E, + U 0xD3, U 0x0F, U 0x6D, U 0xBA, U 0x05, U 0x00, U 0x20, U 0x88, - U 0x00, U 0x30, U 0x8C, U 0xBC, - U 0x82, U 0x29, U 0x0A, U 0x00, - U 0x04, U 0xF3, U 0x08, U 0x24, - U 0x0A, U 0x01, U 0x03, U 0x49, - U 0x38, U 0x09, U 0x09, U 0x42, - U 0xCA, U 0x98, U 0x2B, U 0xC6, - U 0x7E, U 0x6D, U 0xAA, U 0x05, + U 0x00, U 0x30, U 0x8C, U 0x82, + U 0x81, U 0xA2, U 0x52, U 0x72, + U 0x91, U 0x7D, U 0x92, U 0x81, + U 0x83, U 0x82, U 0xC8, U 0x3E, + U 0xD1, U 0x0F, U 0xC0, U 0x71, + U 0xC0, U 0x60, U 0x02, U 0x76, + U 0x38, U 0x76, U 0xF0, U 0xDB, + U 0x63, U 0xFF, U 0xD5, U 0x00, + U 0xC0, U 0x20, U 0xBC, U 0x89, + U 0x99, U 0x81, U 0x99, U 0x80, + U 0x92, U 0x82, U 0xD1, U 0x0F, + U 0x22, U 0x2D, U 0xF8, U 0x92, + U 0x81, U 0x63, U 0xFF, U 0xA2, + U 0x19, U 0xD8, U 0x09, U 0x02, + U 0x86, U 0x0C, U 0xA9, U 0x66, + U 0x96, U 0x11, U 0xD9, U 0x40, + U 0x06, U 0x36, U 0x12, U 0x96, + U 0x10, U 0x06, U 0xBB, U 0x0C, + U 0x64, U 0xA0, U 0x44, U 0x2C, + U 0xD6, U 0x7E, U 0x8A, U 0x10, + U 0xD3, U 0x0F, U 0x6D, U 0xAA, + U 0x05, U 0x00, U 0x20, U 0x88, + U 0x00, U 0x90, U 0x8C, U 0xBC, + U 0x82, U 0x83, U 0x11, U 0xC0, + U 0xE0, U 0xA4, U 0x33, U 0x24, + U 0x0A, U 0x01, U 0x03, U 0x4E, + U 0x38, U 0x0E, U 0x0E, U 0x42, + U 0xCA, U 0xEC, U 0x2C, U 0xD6, + U 0x7E, U 0x6D, U 0xBA, U 0x05, U 0x00, U 0x20, U 0x88, U 0x00, - U 0x30, U 0x8C, U 0x0F, U 0x59, - U 0x0C, U 0xA9, U 0x89, U 0xBC, - U 0x99, U 0x99, U 0x81, U 0x63, - U 0xFF, U 0x87, U 0xBC, U 0x89, - U 0x99, U 0x81, U 0x63, U 0xFF, - U 0x80, U 0xC0, U 0x60, U 0x02, - U 0xE6, U 0x38, U 0x76, U 0xD0, - U 0xBA, U 0x63, U 0xFF, U 0xB4, + U 0x30, U 0x8C, U 0x82, U 0x11, + U 0x02, U 0x52, U 0x0C, U 0xA2, + U 0x82, U 0xBC, U 0x22, U 0x92, + U 0x81, U 0x63, U 0xFF, U 0x83, + U 0xBC, U 0x82, U 0x92, U 0x81, + U 0x63, U 0xFF, U 0x7C, U 0x00, + U 0xC0, U 0x60, U 0x02, U 0x36, + U 0x38, U 0x76, U 0xF0, U 0xB5, + U 0x63, U 0xFF, U 0xAF, U 0x00, U 0xC0, U 0x70, U 0x02, U 0x47, - U 0x38, U 0x77, U 0xD0, U 0xD0, - U 0x63, U 0xFF, U 0xCA, U 0x00, - U 0x6C, U 0x10, U 0x04, U 0x14, - U 0xD8, U 0x95, U 0xC1, U 0x52, - U 0xA4, U 0x24, U 0xCA, U 0x30, - U 0x28, U 0x22, U 0x1D, U 0x73, - U 0x81, U 0x1B, U 0x29, U 0x21, - U 0x02, U 0xCD, U 0x95, U 0x2A, - U 0x30, U 0x00, U 0x75, U 0xA9, - U 0x12, U 0xDA, U 0x20, U 0x03, - U 0x3B, U 0x02, U 0x2C, U 0x30, - U 0x07, U 0x2D, U 0x0A, U 0x02, - U 0x58, U 0x01, U 0xC2, U 0x65, - U 0x3F, U 0xDD, U 0xD1, U 0x0F, - U 0x2B, U 0x30, U 0x07, U 0x03, - U 0xBB, U 0x0B, U 0xDA, U 0xB0, - U 0x74, U 0xB3, U 0x02, U 0x2A, - U 0xBD, U 0xF8, U 0xD3, U 0xA0, + U 0x38, U 0x77, U 0xF0, U 0xCC, U 0x63, U 0xFF, U 0xC6, U 0x00, + U 0x6C, U 0x10, U 0x04, U 0x14, + U 0xD7, U 0xFA, U 0xC1, U 0x52, + U 0xA4, U 0x24, U 0xCA, U 0x31, + U 0x28, U 0x22, U 0x1D, U 0x73, + U 0x81, U 0x1C, U 0x29, U 0x21, + U 0x02, U 0x65, U 0x90, U 0x16, + U 0x2A, U 0x30, U 0x00, U 0x75, + U 0xA9, U 0x12, U 0x02, U 0x2A, + U 0x02, U 0x03, U 0x3B, U 0x02, + U 0x2C, U 0x30, U 0x07, U 0xC0, + U 0xD2, U 0x58, U 0x01, U 0xD0, + U 0x65, U 0x3F, U 0xDC, U 0xD1, + U 0x0F, U 0x2B, U 0x30, U 0x07, + U 0x03, U 0xBB, U 0x0B, U 0x0B, + U 0xBA, U 0x02, U 0x74, U 0xB3, + U 0x02, U 0x2A, U 0xBD, U 0xF8, + U 0xD3, U 0xA0, U 0x63, U 0xFF, + U 0xC4, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x29, U 0x20, U 0x06, U 0xC0, U 0x70, U 0x6E, U 0x97, U 0x41, U 0x29, @@ -6691,8 +6848,8 @@ static unsigned char t3fw[30136] = { U 0x0E, U 0xC8, U 0xAB, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0x2C, U 0x0A, U 0x00, U 0x03, U 0x3D, - U 0x02, U 0x5B, U 0xF8, U 0x14, - U 0x64, U 0x50, U 0x75, U 0x2D, + U 0x02, U 0x5B, U 0xF7, U 0xFB, + U 0x64, U 0x50, U 0x74, U 0x2D, U 0x21, U 0x02, U 0x0D, U 0x0D, U 0x4C, U 0xC9, U 0xD3, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, @@ -6700,8 +6857,8 @@ static unsigned char t3fw[30136] = { U 0x64, U 0xE0, U 0x82, U 0x2F, U 0x21, U 0x02, U 0x0F, U 0x0F, U 0x4C, U 0x65, U 0xF0, U 0x91, - U 0x1A, U 0xD8, U 0x62, U 0x1C, - U 0xD8, U 0x60, U 0x29, U 0xA2, + U 0x1A, U 0xD7, U 0xC6, U 0x1C, + U 0xD7, U 0xC4, U 0x29, U 0xA2, U 0x9E, U 0xC0, U 0x8A, U 0x79, U 0x8B, U 0x5D, U 0x2B, U 0xC2, U 0x26, U 0x68, U 0xB0, U 0x04, @@ -6709,11 +6866,11 @@ static unsigned char t3fw[30136] = { U 0x52, U 0x29, U 0xA2, U 0x9D, U 0xC0, U 0xF3, U 0x64, U 0x90, U 0x4A, U 0x97, U 0x90, U 0x1D, - U 0xD8, U 0x73, U 0x2E, U 0x21, + U 0xD7, U 0xD6, U 0x2E, U 0x21, U 0x04, U 0x9D, U 0x96, U 0x08, U 0xEE, U 0x11, U 0x0F, U 0xEE, U 0x02, U 0x9E, U 0x97, U 0x9E, - U 0x91, U 0x18, U 0xD8, U 0x6F, + U 0x91, U 0x18, U 0xD7, U 0xD2, U 0xC0, U 0xE5, U 0x27, U 0xC4, U 0xA2, U 0x2E, U 0x24, U 0x06, U 0x2B, U 0xA2, U 0x9D, U 0x2F, @@ -6722,10 +6879,10 @@ static unsigned char t3fw[30136] = { U 0x2F, U 0x25, U 0x02, U 0x2B, U 0xA6, U 0x9D, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, - U 0x00, U 0x2F, U 0x30, U 0x00, - U 0x68, U 0xF9, U 0x38, U 0xDA, - U 0x20, U 0xDB, U 0x30, U 0xDC, - U 0x40, U 0x58, U 0x00, U 0x44, + U 0x2F, U 0x30, U 0x00, U 0x68, + U 0xF9, U 0x39, U 0xDA, U 0x20, + U 0xDB, U 0x30, U 0x04, U 0x4C, + U 0x02, U 0x58, U 0x00, U 0x44, U 0x63, U 0xFF, U 0x77, U 0x00, U 0x02, U 0x2A, U 0x02, U 0x2B, U 0x0A, U 0x06, U 0x58, U 0x00, @@ -6740,11 +6897,11 @@ static unsigned char t3fw[30136] = { U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x2A, U 0x2C, U 0x74, U 0x03, U 0x3B, U 0x02, U 0x04, U 0x4C, - U 0x02, U 0x5B, U 0xFE, U 0xF8, + U 0x02, U 0x5B, U 0xFE, U 0xF6, U 0x63, U 0xFF, U 0x3B, U 0x00, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0x2A, U 0x2C, U 0x74, U 0x5B, - U 0xFE, U 0xF5, U 0xC0, U 0x20, + U 0xFE, U 0xF3, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0xC8, U 0x3F, U 0x89, U 0x26, U 0x88, @@ -6754,7 +6911,7 @@ static unsigned char t3fw[30136] = { U 0x25, U 0x25, U 0xCC, U 0x52, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xDB, U 0x40, U 0x2A, U 0x2C, - U 0x74, U 0x5B, U 0xF9, U 0x3D, + U 0x74, U 0x5B, U 0xF9, U 0x36, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x04, U 0xD8, U 0x20, U 0xD7, U 0x30, U 0x82, @@ -6762,7 +6919,7 @@ static unsigned char t3fw[30136] = { U 0x05, U 0x22, U 0x0C, U 0x92, U 0x82, U 0x64, U 0x20, U 0x74, U 0x07, U 0x42, U 0x0B, U 0x13, - U 0xD8, U 0x21, U 0xD4, U 0x20, + U 0xD7, U 0x85, U 0xD4, U 0x20, U 0xA3, U 0x83, U 0x73, U 0x23, U 0x02, U 0x24, U 0x2D, U 0xF8, U 0x85, U 0x80, U 0x74, U 0x51, @@ -6776,12 +6933,12 @@ static unsigned char t3fw[30136] = { U 0x74, U 0x61, U 0x02, U 0x63, U 0xFF, U 0xE2, U 0xCA, U 0x98, U 0xC0, U 0x97, U 0xC0, U 0x41, - U 0x1B, U 0xD8, U 0xA0, U 0xC0, + U 0x1B, U 0xD8, U 0x05, U 0xC0, U 0xA0, U 0x0B, U 0x8B, U 0x0C, U 0x0B, U 0x4A, U 0x38, U 0x0A, U 0x0A, U 0x42, U 0xC9, U 0xAA, - U 0x1D, U 0xD8, U 0x0E, U 0x1C, - U 0xD8, U 0x0F, U 0x2C, U 0xD6, + U 0x1D, U 0xD7, U 0x72, U 0x1C, + U 0xD7, U 0x73, U 0x2C, U 0xD6, U 0x7E, U 0xC1, U 0x40, U 0xD3, U 0x0F, U 0x6D, U 0x4A, U 0x05, U 0x00, U 0x20, U 0x88, U 0x00, @@ -6795,8 +6952,8 @@ static unsigned char t3fw[30136] = { U 0x20, U 0x92, U 0x82, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x06, U 0xC0, - U 0xD7, U 0x1C, U 0xD7, U 0xFE, - U 0x1B, U 0xD8, U 0x00, U 0x0D, + U 0xD7, U 0x1C, U 0xD7, U 0x62, + U 0x1B, U 0xD7, U 0x64, U 0x0D, U 0x49, U 0x11, U 0xD7, U 0x20, U 0x2E, U 0x22, U 0x1F, U 0x28, U 0x22, U 0x1D, U 0x0E, U 0x4E, @@ -6806,7 +6963,7 @@ static unsigned char t3fw[30136] = { U 0xC8, U 0x34, U 0x6F, U 0xAE, U 0x02, U 0x60, U 0x00, U 0xCB, U 0x2F, U 0x0A, U 0x80, U 0x1A, - U 0xD8, U 0x04, U 0xA2, U 0x9E, + U 0xD7, U 0x68, U 0xA2, U 0x9E, U 0xAA, U 0x7A, U 0x7E, U 0xA3, U 0x3F, U 0xC9, U 0x3F, U 0xC0, U 0xE1, U 0xC0, U 0x50, U 0x02, @@ -6824,7 +6981,7 @@ static unsigned char t3fw[30136] = { U 0xD1, U 0x0F, U 0xC0, U 0x50, U 0x03, U 0xE5, U 0x38, U 0x75, U 0xD0, U 0xD3, U 0x63, U 0xFF, - U 0xCD, U 0x15, U 0xD7, U 0xF1, + U 0xCD, U 0x15, U 0xD7, U 0x55, U 0x02, U 0x7E, U 0x0C, U 0xA5, U 0xEE, U 0x64, U 0x30, U 0x51, U 0xC0, U 0xA1, U 0x25, U 0x0A, @@ -6880,7 +7037,7 @@ static unsigned char t3fw[30136] = { U 0x63, U 0xFF, U 0xB9, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x2A, U 0x20, U 0x15, U 0x29, U 0x20, - U 0x16, U 0x14, U 0xD7, U 0xAF, + U 0x16, U 0x14, U 0xD7, U 0x13, U 0x0A, U 0x99, U 0x0C, U 0xCB, U 0x9D, U 0x2E, U 0x20, U 0x0B, U 0x04, U 0xED, U 0x09, U 0x2B, @@ -6943,15 +7100,15 @@ static unsigned char t3fw[30136] = { U 0x6C, U 0x10, U 0x04, U 0x27, U 0x22, U 0x1E, U 0xC0, U 0x80, U 0x08, U 0xE4, U 0x31, U 0x1D, - U 0xD7, U 0x6F, U 0x00, U 0x02, + U 0xD6, U 0xD3, U 0x00, U 0x02, U 0x00, U 0x2C, U 0xD2, U 0x82, - U 0x1B, U 0xD7, U 0x6F, U 0x00, + U 0x1B, U 0xD6, U 0xD3, U 0x00, U 0x31, U 0x04, U 0xC0, U 0x61, U 0x00, U 0x66, U 0x1A, U 0x2B, U 0xB1, U 0x02, U 0x0C, U 0x6C, U 0x02, U 0x2C, U 0xD6, U 0x82, U 0x0B, U 0xE4, U 0x31, U 0x19, - U 0xD7, U 0xF2, U 0x0C, U 0x3A, + U 0xD7, U 0x57, U 0x0C, U 0x3A, U 0x11, U 0xAA, U 0x93, U 0x28, U 0x32, U 0x82, U 0x97, U 0x80, U 0x25, U 0x32, U 0x82, U 0x24, @@ -6965,19 +7122,31 @@ static unsigned char t3fw[30136] = { U 0x6A, U 0x02, U 0x2B, U 0x36, U 0x82, U 0x2A, U 0x25, U 0x02, U 0xD1, U 0x0F, U 0x00, U 0x00, + U 0x6C, U 0x10, U 0x04, U 0x18, + U 0xD6, U 0xBC, U 0x0C, U 0x27, + U 0x11, U 0x08, U 0x77, U 0x08, + U 0x26, U 0x72, U 0x86, U 0x25, + U 0x3C, U 0x04, U 0x76, U 0x5B, + U 0x13, U 0x15, U 0xD6, U 0xB8, + U 0x05, U 0x22, U 0x0A, U 0x22, + U 0x22, U 0xA3, U 0x68, U 0x20, + U 0x02, U 0x74, U 0x29, U 0x04, + U 0x22, U 0x72, U 0x85, U 0xD1, + U 0x0F, U 0xC0, U 0x20, U 0xD1, + U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x19, - U 0xD7, U 0x63, U 0x27, U 0x22, + U 0xD6, U 0xBB, U 0x27, U 0x22, U 0x1E, U 0xC0, U 0x80, U 0x09, U 0x77, U 0x02, U 0x08, U 0xE4, - U 0x31, U 0x1D, U 0xD7, U 0x54, + U 0x31, U 0x1D, U 0xD6, U 0xAC, U 0x00, U 0x02, U 0x00, U 0x2C, - U 0xD2, U 0x82, U 0x1B, U 0xD7, - U 0x54, U 0x00, U 0x31, U 0x04, + U 0xD2, U 0x82, U 0x1B, U 0xD6, + U 0xAC, U 0x00, U 0x31, U 0x04, U 0xC0, U 0x61, U 0x00, U 0x66, U 0x1A, U 0x2B, U 0xB1, U 0x02, U 0x0C, U 0x6C, U 0x02, U 0x2C, U 0xD6, U 0x82, U 0x0B, U 0xE4, - U 0x31, U 0x19, U 0xD7, U 0xD7, + U 0x31, U 0x19, U 0xD7, U 0x30, U 0x0C, U 0x3A, U 0x11, U 0xAA, U 0x93, U 0x28, U 0x32, U 0x82, U 0x97, U 0x80, U 0x25, U 0x32, @@ -6993,12 +7162,12 @@ static unsigned char t3fw[30136] = { U 0x2B, U 0x25, U 0x02, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x1B, - U 0xD7, U 0x3D, U 0x0C, U 0x2A, + U 0xD6, U 0x95, U 0x0C, U 0x2A, U 0x11, U 0xAB, U 0xAA, U 0x29, U 0xA2, U 0x86, U 0xB4, U 0x38, U 0x79, U 0x8B, U 0x22, U 0x1B, - U 0xD7, U 0x3A, U 0x19, U 0xD7, - U 0x61, U 0x0B, U 0x2B, U 0x0A, + U 0xD6, U 0x92, U 0x19, U 0xD6, + U 0xB8, U 0x0B, U 0x2B, U 0x0A, U 0x2B, U 0xB2, U 0xA3, U 0x09, U 0x29, U 0x08, U 0x68, U 0xB0, U 0x02, U 0x74, U 0xB9, U 0x0D, @@ -7008,12 +7177,12 @@ static unsigned char t3fw[30136] = { U 0xD1, U 0x0F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xC8, U 0x92, U 0xC0, U 0x20, U 0xD1, U 0x0F, - U 0xDA, U 0x20, U 0x5B, U 0xEF, - U 0x35, U 0xC0, U 0x20, U 0xD1, + U 0xDA, U 0x20, U 0x5B, U 0xEE, + U 0x94, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x00, U 0x00, U 0x00, U 0x6C, U 0x10, U 0x04, U 0x14, - U 0xD7, U 0x2A, U 0x28, U 0x42, - U 0x9E, U 0x19, U 0xD7, U 0x27, + U 0xD6, U 0x82, U 0x28, U 0x42, + U 0x9E, U 0x19, U 0xD6, U 0x7F, U 0x6F, U 0x88, U 0x02, U 0x60, U 0x00, U 0xBA, U 0x29, U 0x92, U 0x26, U 0x68, U 0x90, U 0x07, @@ -7022,7 +7191,7 @@ static unsigned char t3fw[30136] = { U 0x2A, U 0x42, U 0x9D, U 0xC0, U 0xDC, U 0x64, U 0xA0, U 0xA4, U 0x2B, U 0x20, U 0x0C, U 0x19, - U 0xD7, U 0x21, U 0x0C, U 0xBC, + U 0xD6, U 0x79, U 0x0C, U 0xBC, U 0x11, U 0xA4, U 0xCC, U 0x2E, U 0xC2, U 0x86, U 0x09, U 0xB9, U 0x0A, U 0x7E, U 0xD3, U 0x02, @@ -7037,16 +7206,16 @@ static unsigned char t3fw[30136] = { U 0x20, U 0x66, U 0xB8, U 0xCC, U 0x0C, U 0x0C, U 0x47, U 0x2C, U 0x24, U 0x66, U 0x65, U 0xC0, - U 0x7B, U 0x1C, U 0xD7, U 0x9C, - U 0x18, U 0xD7, U 0x28, U 0x1A, - U 0xD7, U 0x1E, U 0x19, U 0xD7, - U 0x2F, U 0x1D, U 0xD7, U 0x24, + U 0x7B, U 0x1C, U 0xD6, U 0xF5, + U 0x18, U 0xD6, U 0x7F, U 0x1A, + U 0xD6, U 0x76, U 0x19, U 0xD6, + U 0x86, U 0x1D, U 0xD6, U 0x7B, U 0xC0, U 0xE4, U 0x9E, U 0x51, U 0x9D, U 0x50, U 0x8F, U 0x20, U 0x93, U 0x57, U 0x93, U 0x55, U 0x99, U 0x53, U 0x9A, U 0x56, U 0x9A, U 0x54, U 0x08, U 0xFF, - U 0x02, U 0x1A, U 0xD7, U 0x3A, + U 0x02, U 0x1A, U 0xD6, U 0x96, U 0x9F, U 0x52, U 0x88, U 0x26, U 0x9F, U 0x5A, U 0x9E, U 0x59, U 0x9D, U 0x58, U 0x93, U 0x5E, @@ -7054,7 +7223,7 @@ static unsigned char t3fw[30136] = { U 0x9A, U 0x5B, U 0x08, U 0x08, U 0x48, U 0x05, U 0x88, U 0x11, U 0x98, U 0x5F, U 0xC0, U 0xD8, - U 0x1F, U 0xD7, U 0x08, U 0x0C, + U 0x1F, U 0xD6, U 0x60, U 0x0C, U 0xB9, U 0x11, U 0xA4, U 0x99, U 0x28, U 0x92, U 0x85, U 0xAF, U 0xBF, U 0x23, U 0xF4, U 0xCF, @@ -7064,12 +7233,12 @@ static unsigned char t3fw[30136] = { U 0x29, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0xCA, U 0x33, U 0xDA, U 0x20, U 0xC0, U 0xB6, U 0x5B, - U 0xFF, U 0x84, U 0xC7, U 0x2F, + U 0xFF, U 0x78, U 0xC7, U 0x2F, U 0xD1, U 0x0F, U 0xC9, U 0x3A, U 0xDA, U 0x20, U 0x5B, U 0xFF, - U 0x81, U 0xC7, U 0x2F, U 0xD1, + U 0x75, U 0xC7, U 0x2F, U 0xD1, U 0x0F, U 0xDB, U 0xD0, U 0x5B, - U 0xFE, U 0x1A, U 0x23, U 0x24, + U 0xFE, U 0x0C, U 0x23, U 0x24, U 0x66, U 0x2B, U 0x20, U 0x0C, U 0x63, U 0xFF, U 0x75, U 0x00, U 0xC7, U 0x2F, U 0xD1, U 0x0F, @@ -7082,52 +7251,53 @@ static unsigned char t3fw[30136] = { U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, U 0x50, U 0x2E, U 0x0A, - U 0x00, U 0x5B, U 0xFE, U 0x6A, + U 0x00, U 0x5B, U 0xFE, U 0x5E, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x2E, U 0x20, U 0x0C, U 0x18, - U 0xD6, U 0xE1, U 0x0C, U 0xEF, + U 0xD6, U 0x39, U 0x0C, U 0xEF, U 0x11, U 0xA8, U 0xFF, U 0x29, U 0xF2, U 0x86, U 0xC0, U 0x88, - U 0x79, U 0x8B, U 0x75, U 0x1A, - U 0xD6, U 0xDE, U 0x0A, U 0xEA, + U 0x79, U 0x8B, U 0x79, U 0x1A, + U 0xD6, U 0x36, U 0x0A, U 0xEA, U 0x0A, U 0x2A, U 0xA2, U 0xA3, U 0x68, U 0xA0, U 0x04, U 0x8B, - U 0x20, U 0x7A, U 0xB9, U 0x64, + U 0x20, U 0x7A, U 0xB9, U 0x68, U 0x23, U 0xF2, U 0x85, U 0x64, - U 0x30, U 0x5E, U 0x1C, U 0xD6, - U 0xE8, U 0x2A, U 0x0A, U 0x80, - U 0x2D, U 0x20, U 0x68, U 0x29, - U 0x20, U 0x67, U 0x28, U 0x21, - U 0x04, U 0x0B, U 0x99, U 0x11, - U 0x04, U 0x88, U 0x11, U 0x09, - U 0x88, U 0x02, U 0x08, U 0xDD, - U 0x02, U 0xC0, U 0x94, U 0x28, - U 0x4A, U 0x10, U 0x08, U 0xDD, - U 0x02, U 0x18, U 0xD6, U 0xE0, - U 0x99, U 0x31, U 0x98, U 0x30, - U 0x8B, U 0x2B, U 0x9A, U 0x37, - U 0x9D, U 0x34, U 0x0C, U 0xBB, - U 0x02, U 0x9B, U 0x32, U 0xC0, - U 0xC0, U 0x9C, U 0x35, U 0x9C, - U 0x36, U 0x2A, U 0x2C, U 0x74, - U 0xDB, U 0x40, U 0xC0, U 0xD3, - U 0x18, U 0xD6, U 0xCF, U 0x29, - U 0xF2, U 0x85, U 0xA8, U 0xEE, - U 0x29, U 0x9C, U 0x20, U 0x2C, - U 0xE4, U 0xCF, U 0x29, U 0xF6, - U 0x85, U 0x2D, U 0x24, U 0x06, - U 0xDD, U 0x40, U 0x5B, U 0xFD, - U 0xFA, U 0xD2, U 0xA0, U 0xD1, - U 0x0F, U 0xDA, U 0x20, U 0xDB, - U 0xE0, U 0x5B, U 0xFF, U 0x4C, + U 0x30, U 0x62, U 0x1B, U 0xD6, + U 0x40, U 0x29, U 0x0A, U 0x80, + U 0x2C, U 0x20, U 0x68, U 0x28, + U 0x20, U 0x67, U 0x2D, U 0x21, + U 0x04, U 0x0B, U 0x88, U 0x11, + U 0x04, U 0xDD, U 0x11, U 0x08, + U 0xDD, U 0x02, U 0x0D, U 0xCC, + U 0x02, U 0xC0, U 0x84, U 0x2D, + U 0x4A, U 0x10, U 0x0D, U 0xCC, + U 0x02, U 0x1D, U 0xD6, U 0x38, + U 0x98, U 0x31, U 0x9D, U 0x30, + U 0x8A, U 0x2B, U 0x99, U 0x37, + U 0x9C, U 0x34, U 0x0B, U 0xAA, + U 0x02, U 0xC0, U 0xC0, U 0x9C, + U 0x35, U 0x9C, U 0x36, U 0x9A, + U 0x32, U 0x2A, U 0x2C, U 0x74, + U 0xDB, U 0x40, U 0x28, U 0xF2, + U 0x85, U 0xC0, U 0xD3, U 0x28, + U 0x8C, U 0x20, U 0x28, U 0xF6, + U 0x85, U 0x2C, U 0x25, U 0x04, + U 0x2D, U 0x24, U 0x06, U 0x1F, + U 0xD6, U 0x23, U 0xDD, U 0x40, + U 0xAF, U 0xEE, U 0x2C, U 0xE4, + U 0xCF, U 0x5B, U 0xFD, U 0xEB, + U 0xD2, U 0xA0, U 0xD1, U 0x0F, + U 0x00, U 0xDA, U 0x20, U 0xDB, + U 0xE0, U 0x5B, U 0xFF, U 0x3F, U 0xC0, U 0x20, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x0A, U 0xD6, U 0x30, U 0x2A, U 0x20, U 0x06, - U 0x94, U 0x11, U 0x28, U 0xAC, - U 0xF8, U 0x65, U 0x83, U 0x87, - U 0x2B, U 0x21, U 0x22, U 0xC0, - U 0xF2, U 0x2A, U 0x21, U 0x24, - U 0x65, U 0x50, U 0x08, U 0x2A, + U 0x24, U 0x16, U 0x01, U 0x28, + U 0xAC, U 0xF8, U 0x65, U 0x83, + U 0x86, U 0x2B, U 0x21, U 0x22, + U 0xC0, U 0xF2, U 0x2A, U 0x21, + U 0x24, U 0xCC, U 0x57, U 0x2A, U 0xAC, U 0x01, U 0x0A, U 0x0A, U 0x4F, U 0x2A, U 0x25, U 0x24, U 0x7A, U 0xBB, U 0x02, U 0x60, @@ -7138,25 +7308,25 @@ static unsigned char t3fw[30136] = { U 0xC0, U 0x91, U 0x0E, U 0xDD, U 0x0C, U 0x65, U 0xD3, U 0x90, U 0x88, U 0x38, U 0x1E, U 0xD6, - U 0xAC, U 0x64, U 0x83, U 0x6B, + U 0x03, U 0x64, U 0x83, U 0x6B, U 0x8C, U 0x37, U 0xC0, U 0xB8, U 0xC0, U 0x96, U 0x0C, U 0xB9, U 0x39, U 0x99, U 0x14, U 0xB4, U 0x9A, U 0x9A, U 0x12, U 0x0D, U 0x99, U 0x11, U 0x99, U 0x13, - U 0x8F, U 0x67, U 0x18, U 0xD6, - U 0xA7, U 0xC9, U 0xFB, U 0x28, + U 0x8F, U 0x67, U 0x18, U 0xD5, + U 0xFE, U 0xC9, U 0xFB, U 0x28, U 0x80, U 0x21, U 0x7F, U 0x83, U 0x16, U 0x8B, U 0x14, U 0x2C, U 0x22, U 0x00, U 0x2A, U 0x20, - U 0x0C, U 0x5B, U 0xFF, U 0x62, + U 0x0C, U 0x5B, U 0xFF, U 0x61, U 0xD4, U 0xA0, U 0x64, U 0xA3, - U 0xA8, U 0x8F, U 0x67, U 0x60, + U 0xB3, U 0x8F, U 0x67, U 0x60, U 0x00, U 0x28, U 0x00, U 0x00, U 0x2B, U 0x20, U 0x0C, U 0x89, U 0x12, U 0x0C, U 0xBA, U 0x11, U 0xAE, U 0xAA, U 0x2C, U 0xA2, - U 0x86, U 0x1D, U 0xD6, U 0x9A, + U 0x86, U 0x1D, U 0xD5, U 0xF1, U 0x7C, U 0x9B, U 0x3E, U 0x0D, U 0xBD, U 0x0A, U 0x2D, U 0xD2, U 0xA3, U 0x68, U 0xD0, U 0x04, @@ -7168,15 +7338,15 @@ static unsigned char t3fw[30136] = { U 0x6F, U 0x9D, U 0x01, U 0xD7, U 0xF0, U 0xDA, U 0x20, U 0xDB, U 0x70, U 0xC1, U 0xC4, U 0x2D, - U 0x21, U 0x1F, U 0x5B, U 0xFF, - U 0x05, U 0x89, U 0x26, U 0x88, + U 0x21, U 0x1F, U 0x5B, U 0xFE, + U 0xF8, U 0x89, U 0x26, U 0x88, U 0x27, U 0xDD, U 0xA0, U 0x09, U 0x88, U 0x0C, U 0x7A, U 0x8B, U 0x17, U 0x9A, U 0x10, U 0x60, U 0x00, U 0x06, U 0xC0, U 0x40, U 0x63, U 0xFF, U 0xCC, U 0x00, U 0x00, U 0xDA, U 0x20, U 0x8B, - U 0x10, U 0x5B, U 0xFE, U 0xD5, + U 0x10, U 0x5B, U 0xFE, U 0xC8, U 0x8D, U 0x10, U 0x65, U 0xA2, U 0x67, U 0xC0, U 0xE0, U 0x9E, U 0x48, U 0x8C, U 0x64, U 0x9C, @@ -7188,7 +7358,7 @@ static unsigned char t3fw[30136] = { U 0x52, U 0x9D, U 0x10, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0x2C, U 0x12, U 0x01, U 0x5B, U 0xFE, - U 0x76, U 0x8D, U 0x10, U 0xC0, + U 0x69, U 0x8D, U 0x10, U 0xC0, U 0x51, U 0xD6, U 0xA0, U 0x8F, U 0xA7, U 0xC0, U 0xC0, U 0x8A, U 0x68, U 0x97, U 0x4D, U 0x9A, @@ -7224,15 +7394,15 @@ static unsigned char t3fw[30136] = { U 0x99, U 0x02, U 0x09, U 0x33, U 0x02, U 0x8A, U 0x2B, U 0x29, U 0x21, U 0x04, U 0x0B, U 0xAA, - U 0x02, U 0x1B, U 0xD6, U 0xE2, + U 0x02, U 0x1B, U 0xD6, U 0x3A, U 0x08, U 0x99, U 0x11, U 0x09, U 0x55, U 0x02, U 0x08, U 0x55, U 0x02, U 0x0B, U 0xAA, U 0x02, U 0x9A, U 0x40, U 0x89, U 0x20, U 0x88, U 0x14, U 0x08, U 0x99, U 0x11, U 0x09, U 0x88, U 0x02, - U 0x19, U 0xD6, U 0x63, U 0x1D, - U 0xD6, U 0xDC, U 0x09, U 0x88, + U 0x19, U 0xD5, U 0xBA, U 0x1D, + U 0xD6, U 0x34, U 0x09, U 0x88, U 0x02, U 0x98, U 0x41, U 0x8B, U 0x2A, U 0x93, U 0x46, U 0x95, U 0x47, U 0x83, U 0x15, U 0x0D, @@ -7249,11 +7419,11 @@ static unsigned char t3fw[30136] = { U 0x0E, U 0x48, U 0x2E, U 0x25, U 0x25, U 0x9B, U 0x67, U 0x2B, U 0x20, U 0x0C, U 0x87, U 0x13, - U 0x1E, U 0xD6, U 0x3D, U 0x0C, + U 0x1E, U 0xD5, U 0x94, U 0x0C, U 0xB9, U 0x11, U 0xAE, U 0x99, U 0x28, U 0x92, U 0x85, U 0xA7, U 0x88, U 0x28, U 0x96, U 0x85, - U 0x17, U 0xD6, U 0x41, U 0xC0, + U 0x17, U 0xD5, U 0x98, U 0xC0, U 0x90, U 0xA7, U 0xBB, U 0x29, U 0xB4, U 0xCF, U 0x87, U 0x18, U 0x63, U 0xFE, U 0x3C, U 0x00, @@ -7276,7 +7446,7 @@ static unsigned char t3fw[30136] = { U 0x1F, U 0x0A, U 0xBB, U 0x11, U 0x07, U 0x88, U 0x10, U 0x08, U 0xFF, U 0x02, U 0x0B, U 0xAA, - U 0x02, U 0x18, U 0xD6, U 0x35, + U 0x02, U 0x18, U 0xD5, U 0x8C, U 0x09, U 0x29, U 0x14, U 0x03, U 0xAA, U 0x02, U 0x2B, U 0x21, U 0x25, U 0x83, U 0x20, U 0x0B, @@ -7294,16 +7464,16 @@ static unsigned char t3fw[30136] = { U 0x4E, U 0x98, U 0x4F, U 0xC0, U 0x70, U 0x77, U 0xC7, U 0x01, U 0xC0, U 0x71, U 0x9A, U 0x47, - U 0x18, U 0xD6, U 0x9E, U 0x0B, + U 0x18, U 0xD5, U 0xF6, U 0x0B, U 0x7C, U 0x10, U 0x0C, U 0xEC, U 0x02, U 0x08, U 0xF8, U 0x02, - U 0x98, U 0x44, U 0x18, U 0xD6, - U 0x9B, U 0x0C, U 0xBC, U 0x02, + U 0x98, U 0x44, U 0x18, U 0xD5, + U 0xF3, U 0x0C, U 0xBC, U 0x02, U 0x08, U 0xCC, U 0x02, U 0x9C, U 0x40, U 0x2A, U 0x20, U 0x0C, U 0x29, U 0x5C, U 0xFE, U 0xC0, - U 0x80, U 0x1F, U 0xD6, U 0x07, - U 0x1C, U 0xD6, U 0x0F, U 0x0C, + U 0x80, U 0x1F, U 0xD5, U 0x5E, + U 0x1C, U 0xD5, U 0x66, U 0x0C, U 0xAE, U 0x11, U 0x2B, U 0x21, U 0x24, U 0xAC, U 0xAA, U 0xAF, U 0xEE, U 0xB0, U 0xBB, U 0x8F, @@ -7324,17 +7494,17 @@ static unsigned char t3fw[30136] = { U 0xC0, U 0x70, U 0x93, U 0x41, U 0x9F, U 0x44, U 0x99, U 0x46, U 0x9A, U 0x47, U 0x77, U 0xC7, - U 0x0A, U 0x1C, U 0xD5, U 0xF3, + U 0x0A, U 0x1C, U 0xD5, U 0x4A, U 0x2C, U 0xC0, U 0x22, U 0xC0, U 0x81, U 0x0C, U 0x87, U 0x38, - U 0x1C, U 0xD6, U 0x7F, U 0x0B, + U 0x1C, U 0xD5, U 0xD7, U 0x0B, U 0x78, U 0x10, U 0x08, U 0xE8, U 0x02, U 0x08, U 0xB8, U 0x02, U 0x0C, U 0x88, U 0x02, U 0x98, U 0x40, U 0x63, U 0xFF, U 0x80, U 0x00, U 0xCC, U 0x57, U 0xDA, U 0x20, U 0xDB, U 0x60, U 0x8C, - U 0x11, U 0x5B, U 0xFD, U 0xE3, + U 0x11, U 0x5B, U 0xFD, U 0xD6, U 0x29, U 0x21, U 0x02, U 0x68, U 0x98, U 0x06, U 0x68, U 0x94, U 0x03, U 0xC0, U 0x20, U 0xD1, @@ -7343,7 +7513,7 @@ static unsigned char t3fw[30136] = { U 0x1D, U 0x2A, U 0x25, U 0x02, U 0x7B, U 0x99, U 0x01, U 0xC0, U 0xB0, U 0x64, U 0xBF, U 0xE8, - U 0x13, U 0xD5, U 0xDE, U 0x2C, + U 0x13, U 0xD5, U 0x35, U 0x2C, U 0xB0, U 0x07, U 0x28, U 0xB0, U 0x00, U 0xDA, U 0x20, U 0x03, U 0x88, U 0x0A, U 0x28, U 0x82, @@ -7354,7 +7524,7 @@ static unsigned char t3fw[30136] = { U 0x68, U 0xA7, U 0x79, U 0xDA, U 0x20, U 0xDB, U 0x30, U 0xDC, U 0x40, U 0xDD, U 0x50, U 0x5B, - U 0xFE, U 0xE8, U 0xD2, U 0xA0, + U 0xFE, U 0xE7, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC1, U 0x6D, U 0xC1, U 0x9D, U 0x29, U 0x25, U 0x2C, U 0x60, U 0x00, U 0x04, @@ -7364,7 +7534,7 @@ static unsigned char t3fw[30136] = { U 0x20, U 0xDB, U 0x30, U 0x8C, U 0x11, U 0xDD, U 0x50, U 0x2E, U 0x0A, U 0x80, U 0x5B, U 0xFD, - U 0x51, U 0xD2, U 0xA0, U 0xD1, + U 0x44, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xC1, U 0x68, U 0xC1, U 0xA8, U 0x2A, U 0x25, U 0x2C, U 0x63, U 0xFF, U 0xDD, U 0x00, @@ -7375,77 +7545,79 @@ static unsigned char t3fw[30136] = { U 0x0B, U 0x48, U 0x2B, U 0x25, U 0x25, U 0x2A, U 0x2C, U 0x74, U 0xDB, U 0x60, U 0x2C, U 0x12, - U 0x01, U 0x5B, U 0xFD, U 0x94, + U 0x01, U 0x5B, U 0xFD, U 0x87, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0x2A, U 0x2C, U 0x74, U 0x8B, - U 0x11, U 0x5B, U 0xF6, U 0xCD, + U 0x11, U 0x5B, U 0xF6, U 0xB9, U 0xD2, U 0xA0, U 0xD1, U 0x0F, U 0xDA, U 0x20, U 0x5B, U 0xFE, - U 0x47, U 0x63, U 0xFF, U 0x38, + U 0x3A, U 0x63, U 0xFF, U 0x38, U 0x00, U 0xDA, U 0x20, U 0xC0, - U 0xB1, U 0x5B, U 0xFE, U 0x8B, - U 0x65, U 0xAF, U 0x2D, U 0x63, - U 0xFB, U 0xED, U 0xDA, U 0x20, - U 0x2B, U 0x20, U 0x0C, U 0x5B, - U 0xFE, U 0x5A, U 0x63, U 0xFF, - U 0x1F, U 0x00, U 0x00, U 0x00, - U 0x12, U 0xD6, U 0x42, U 0x82, + U 0xB1, U 0x5B, U 0xFE, U 0x8A, + U 0x64, U 0xAB, U 0xF1, U 0x65, + U 0x5F, U 0x35, U 0x2D, U 0x21, + U 0x24, U 0xB1, U 0xDD, U 0x2D, + U 0x25, U 0x24, U 0x63, U 0xFF, + U 0x1F, U 0xDA, U 0x20, U 0x2B, + U 0x20, U 0x0C, U 0x5B, U 0xFE, + U 0x56, U 0x63, U 0xFF, U 0x14, + U 0x12, U 0xD5, U 0x98, U 0x82, U 0x20, U 0x02, U 0x82, U 0x57, U 0xC8, U 0x21, U 0x63, U 0xFF, - U 0xFC, U 0x12, U 0xD6, U 0x3E, + U 0xFC, U 0x12, U 0xD5, U 0x94, U 0x03, U 0xE8, U 0x30, U 0x04, U 0xEE, U 0x30, U 0x05, U 0xB1, U 0x30, U 0x93, U 0x20, U 0x94, U 0x21, U 0x95, U 0x22, U 0x63, U 0xFF, U 0xFC, U 0x00, U 0x00, - U 0x10, U 0xD6, U 0x3A, U 0x91, + U 0x10, U 0xD5, U 0x90, U 0x91, U 0x00, U 0x92, U 0x01, U 0x93, U 0x02, U 0x94, U 0x03, U 0x11, - U 0xD6, U 0x11, U 0x82, U 0x10, + U 0xD5, U 0x67, U 0x82, U 0x10, U 0x01, U 0xEA, U 0x30, U 0xA2, U 0x11, U 0x01, U 0xF0, U 0x31, U 0xC0, U 0x40, U 0x04, U 0xE4, U 0x16, U 0x00, U 0x02, U 0x00, - U 0x11, U 0xD6, U 0x33, U 0x82, + U 0x11, U 0xD5, U 0x89, U 0x82, U 0x10, U 0x23, U 0x4A, U 0x00, U 0x03, U 0x22, U 0x02, U 0x92, - U 0x10, U 0x11, U 0xD5, U 0xFD, + U 0x10, U 0x11, U 0xD5, U 0x52, U 0xC0, U 0x21, U 0x92, U 0x10, U 0x04, U 0xE4, U 0x31, U 0x84, U 0x03, U 0x83, U 0x02, U 0x82, U 0x01, U 0x81, U 0x00, U 0x00, U 0xD2, U 0x30, U 0x01, U 0x23, U 0x00, U 0x00, U 0x00, U 0x00, - U 0x10, U 0xD6, U 0x2A, U 0x91, + U 0x10, U 0xD5, U 0x80, U 0x91, U 0x00, U 0x92, U 0x01, U 0x93, U 0x02, U 0x94, U 0x03, U 0x11, - U 0xD6, U 0x00, U 0x82, U 0x10, + U 0xD5, U 0x56, U 0x82, U 0x10, U 0x01, U 0xEA, U 0x30, U 0xA2, U 0x11, U 0x01, U 0xF1, U 0x31, U 0xC0, U 0x40, U 0x04, U 0xE4, U 0x16, U 0x00, U 0x02, U 0x00, - U 0x11, U 0xD6, U 0x21, U 0x82, - U 0x10, U 0x13, U 0xD5, U 0xA7, + U 0x11, U 0xD5, U 0x77, U 0x82, + U 0x10, U 0x13, U 0xD4, U 0xFB, U 0x03, U 0x22, U 0x02, U 0x92, U 0x10, U 0x04, U 0xE4, U 0x31, U 0x84, U 0x03, U 0x83, U 0x02, U 0x82, U 0x01, U 0x81, U 0x00, U 0x00, U 0xD3, U 0x30, U 0x01, U 0x33, U 0x00, U 0x00, U 0x00, - U 0x10, U 0xD6, U 0x1B, U 0x91, + U 0x10, U 0xD5, U 0x71, U 0x91, U 0x00, U 0x81, U 0x01, U 0x65, U 0x10, U 0x49, U 0x81, U 0x02, U 0x65, U 0x10, U 0x44, U 0x81, U 0x03, U 0xCF, U 0x1F, U 0x92, U 0x01, U 0x93, U 0x02, U 0x94, - U 0x03, U 0x11, U 0xD5, U 0xEE, + U 0x03, U 0x11, U 0xD5, U 0x44, U 0x82, U 0x10, U 0x01, U 0xEA, U 0x30, U 0xA2, U 0x11, U 0x01, U 0xF2, U 0x31, U 0xC0, U 0x40, U 0x04, U 0xE4, U 0x16, U 0x00, - U 0x02, U 0x00, U 0x11, U 0xD6, - U 0x0D, U 0x82, U 0x10, U 0x13, - U 0xD5, U 0x8E, U 0x03, U 0x22, + U 0x02, U 0x00, U 0x11, U 0xD5, + U 0x63, U 0x82, U 0x10, U 0x13, + U 0xD4, U 0xE3, U 0x03, U 0x22, U 0x02, U 0x92, U 0x10, U 0x04, U 0xE4, U 0x31, U 0x84, U 0x03, U 0x83, U 0x02, U 0x82, U 0x01, @@ -7453,7 +7625,7 @@ static unsigned char t3fw[30136] = { U 0x91, U 0x02, U 0x91, U 0x01, U 0x81, U 0x00, U 0x00, U 0xD4, U 0x30, U 0x01, U 0x43, U 0x00, - U 0x12, U 0xD5, U 0xBD, U 0xC0, + U 0x12, U 0xD5, U 0x12, U 0xC0, U 0x30, U 0x28, U 0x37, U 0x40, U 0x28, U 0x37, U 0x44, U 0x28, U 0x37, U 0x48, U 0x28, U 0x37, @@ -7461,19 +7633,19 @@ static unsigned char t3fw[30136] = { U 0x72, U 0x33, U 0xED, U 0x03, U 0x02, U 0x00, U 0x63, U 0xFF, U 0xFC, U 0x00, U 0x00, U 0x00, - U 0x10, U 0xD5, U 0xFF, U 0x91, + U 0x10, U 0xD5, U 0x55, U 0x91, U 0x00, U 0x92, U 0x01, U 0x93, U 0x02, U 0x94, U 0x03, U 0x11, - U 0xD5, U 0xFD, U 0x82, U 0x10, + U 0xD5, U 0x53, U 0x82, U 0x10, U 0x92, U 0x10, U 0x11, U 0xD5, - U 0xAF, U 0x83, U 0x10, U 0x03, + U 0x04, U 0x83, U 0x10, U 0x03, U 0x22, U 0x02, U 0x92, U 0x10, - U 0x11, U 0xD5, U 0xFA, U 0x12, - U 0xD5, U 0xC1, U 0x92, U 0x10, + U 0x11, U 0xD5, U 0x50, U 0x12, + U 0xD5, U 0x16, U 0x92, U 0x10, U 0xC0, U 0x40, U 0x04, U 0xE4, U 0x16, U 0x00, U 0x02, U 0x00, - U 0x11, U 0xD5, U 0xF1, U 0x82, - U 0x10, U 0x13, U 0xD5, U 0xA8, + U 0x11, U 0xD5, U 0x47, U 0x82, + U 0x10, U 0x13, U 0xD4, U 0xFD, U 0x03, U 0x22, U 0x02, U 0x92, U 0x10, U 0x04, U 0xE4, U 0x31, U 0x84, U 0x03, U 0x83, U 0x02, @@ -7534,38 +7706,42 @@ static unsigned char t3fw[30136] = { U 0x02, U 0x00, U 0xD1, U 0x0F, U 0x6C, U 0x10, U 0x02, U 0x02, U 0xE4, U 0x31, U 0xD1, U 0x0F, - U 0x0A, U 0x00, U 0x00, U 0x00, - U 0x43, U 0x68, U 0x65, U 0x6C, - U 0x73, U 0x69, U 0x6F, U 0x20, - U 0x46, U 0x57, U 0x20, U 0x44, - U 0x45, U 0x42, U 0x55, U 0x47, - U 0x3D, U 0x30, U 0x20, U 0x28, - U 0x42, U 0x75, U 0x69, U 0x6C, - U 0x74, U 0x20, U 0x57, U 0x65, - U 0x64, U 0x20, U 0x4F, U 0x63, - U 0x74, U 0x20, U 0x20, U 0x38, - U 0x20, U 0x31, U 0x35, U 0x3A, - U 0x35, U 0x30, U 0x3A, U 0x35, - U 0x30, U 0x20, U 0x50, U 0x44, - U 0x54, U 0x20, U 0x32, U 0x30, - U 0x30, U 0x38, U 0x20, U 0x6F, - U 0x6E, U 0x20, U 0x63, U 0x6C, - U 0x65, U 0x6F, U 0x70, U 0x61, - U 0x74, U 0x72, U 0x61, U 0x3A, + U 0x0A, U 0x00, U 0x43, U 0x68, + U 0x65, U 0x6C, U 0x73, U 0x69, + U 0x6F, U 0x20, U 0x46, U 0x57, + U 0x20, U 0x44, U 0x45, U 0x42, + U 0x55, U 0x47, U 0x3D, U 0x30, + U 0x20, U 0x28, U 0x42, U 0x75, + U 0x69, U 0x6C, U 0x74, U 0x20, + U 0x54, U 0x75, U 0x65, U 0x20, + U 0x4E, U 0x6F, U 0x76, U 0x20, + U 0x20, U 0x33, U 0x20, U 0x30, + U 0x36, U 0x3A, U 0x30, U 0x35, + U 0x3A, U 0x31, U 0x31, U 0x20, + U 0x50, U 0x53, U 0x54, U 0x20, + U 0x32, U 0x30, U 0x30, U 0x39, + U 0x20, U 0x6F, U 0x6E, U 0x20, + U 0x63, U 0x6C, U 0x65, U 0x6F, + U 0x70, U 0x61, U 0x74, U 0x72, + U 0x61, U 0x2E, U 0x61, U 0x73, + U 0x69, U 0x63, U 0x64, U 0x65, + U 0x73, U 0x69, U 0x67, U 0x6E, + U 0x65, U 0x72, U 0x73, U 0x2E, + U 0x63, U 0x6F, U 0x6D, U 0x3A, U 0x2F, U 0x68, U 0x6F, U 0x6D, U 0x65, U 0x2F, U 0x66, U 0x65, U 0x6C, U 0x69, U 0x78, U 0x2F, U 0x77, U 0x2F, U 0x66, U 0x77, - U 0x5F, U 0x37, U 0x2E, U 0x30, + U 0x5F, U 0x37, U 0x2E, U 0x37, U 0x29, U 0x2C, U 0x20, U 0x56, U 0x65, U 0x72, U 0x73, U 0x69, U 0x6F, U 0x6E, U 0x20, U 0x54, U 0x33, U 0x78, U 0x78, U 0x20, U 0x30, U 0x30, U 0x37, U 0x2E, - U 0x30, U 0x31, U 0x2E, U 0x30, + U 0x30, U 0x38, U 0x2E, U 0x30, U 0x30, U 0x20, U 0x2D, U 0x20, U 0x31, U 0x30, U 0x30, U 0x37, - U 0x30, U 0x31, U 0x30, U 0x30, - U 0x10, U 0x07, U 0x01, U 0x00, - U 0x6F, U 0x4E, U 0xF8, U 0xBB, + U 0x30, U 0x38, U 0x30, U 0x30, + U 0x10, U 0x07, U 0x08, U 0x00, + U 0x4F, U 0x43, U 0x3A, U 0x10, }; diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c index cf42ea0c94ae..a4f2ff669caf 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb.c @@ -138,8 +138,7 @@ open_rnic_dev(struct t3cdev *tdev) CTR2(KTR_IW_CXGB, "%s t3cdev %p", __FUNCTION__, tdev); if (!vers_printed++) - printf("Chelsio T3 RDMA Driver - version %s\n", - DRV_VERSION); + printf("Chelsio T3 RDMA Driver - version x.xx\n"); rnicp = (struct iwch_dev *)ib_alloc_device(sizeof(*rnicp)); if (!rnicp) { printf("Cannot allocate ib device\n"); diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c index c582dbda39cc..975b90854bd9 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_cm.c @@ -203,7 +203,7 @@ static int set_tcpinfo(struct iwch_ep *ep) ep->snd_seq = ti.tcpi_snd_nxt; ep->rcv_seq = ti.tcpi_rcv_nxt; - ep->emss = ti.__tcpi_snd_mss - sizeof(struct tcpiphdr); + ep->emss = ti.tcpi_snd_mss - sizeof(struct tcpiphdr); ep->hwtid = TOEPCB(ep->com.so)->tp_tid; /* XXX */ if (ti.tcpi_options & TCPI_OPT_TIMESTAMPS) ep->emss -= 12; diff --git a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c index 83c742fcae81..fd5149878176 100644 --- a/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c +++ b/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c @@ -675,7 +675,7 @@ static void __flush_qp(struct iwch_qp *qhp) qhp->refcnt++; mtx_unlock(&qhp->lock); - /* locking heirarchy: cq lock first, then qp lock. */ + /* locking hierarchy: cq lock first, then qp lock. */ mtx_lock(&rchp->lock); mtx_lock(&qhp->lock); cxio_flush_hw_cq(&rchp->cq); @@ -685,7 +685,7 @@ static void __flush_qp(struct iwch_qp *qhp) mtx_unlock(&rchp->lock); (*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context); - /* locking heirarchy: cq lock first, then qp lock. */ + /* locking hierarchy: cq lock first, then qp lock. */ mtx_lock(&schp->lock); mtx_lock(&qhp->lock); cxio_flush_hw_cq(&schp->cq); diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c index 76237fb99bc8..bbb594ac2b2c 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c @@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include #include diff --git a/sys/dev/cxgb/ulp/tom/cxgb_vm.c b/sys/dev/cxgb/ulp/tom/cxgb_vm.c index e7a38939a4b1..9f366e8b5d99 100644 --- a/sys/dev/cxgb/ulp/tom/cxgb_vm.c +++ b/sys/dev/cxgb/ulp/tom/cxgb_vm.c @@ -131,8 +131,7 @@ vm_fault_hold_user_pages(vm_map_t map, vm_offset_t addr, vm_page_t *mp, * taken away from us before it is held */ while (*pages == NULL) { - rv = vm_fault(map, va, prot, - (prot & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); + rv = vm_fault(map, va, prot, VM_FAULT_NORMAL); if (rv) goto error; *pages = pmap_extract_and_hold(pmap, va, prot); diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c index 64e7aeffa5e1..a1df655849f6 100644 --- a/sys/dev/dc/if_dc.c +++ b/sys/dev/dc/if_dc.c @@ -43,8 +43,9 @@ __FBSDID("$FreeBSD$"); * ASIX Electronics AX88140A (www.asix.com.tw) * ASIX Electronics AX88141 (www.asix.com.tw) * ADMtek AL981 (www.admtek.com.tw) - * ADMtek AN985 (www.admtek.com.tw) - * Netgear FA511 (www.netgear.com) Appears to be rebadged ADMTek AN985 + * ADMtek AN983 (www.admtek.com.tw) + * ADMtek CardBus AN985 (www.admtek.com.tw) + * Netgear FA511 (www.netgear.com) Appears to be rebadged ADMTek CardBus AN985 * Davicom DM9100, DM9102, DM9102A (www.davicom8.com) * Accton EN1217 (www.accton.com) * Xircom X3201 (www.xircom.com) @@ -161,14 +162,14 @@ static const struct dc_type dc_devs[] = { "Davicom DM9102 10/100BaseTX" }, { DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_AL981), 0, "ADMtek AL981 10/100BaseTX" }, + { DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_AN983), 0, + "ADMtek AN983 10/100BaseTX" }, { DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_AN985), 0, - "ADMtek AN985 10/100BaseTX" }, + "ADMtek AN985 CardBus 10/100BaseTX or clone" }, { DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_ADM9511), 0, "ADMtek ADM9511 10/100BaseTX" }, { DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_ADM9513), 0, "ADMtek ADM9513 10/100BaseTX" }, - { DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_FA511), 0, - "Netgear FA511 10/100BaseTX" }, { DC_DEVID(DC_VENDORID_ASIX, DC_DEVICEID_AX88140A), DC_REVISION_88141, "ASIX AX88141 10/100BaseTX" }, { DC_DEVID(DC_VENDORID_ASIX, DC_DEVICEID_AX88140A), 0, @@ -778,10 +779,10 @@ dc_miibus_readreg(device_t dev, int phy, int reg) bzero(&frame, sizeof(frame)); /* - * Note: both the AL981 and AN985 have internal PHYs, + * Note: both the AL981 and AN983 have internal PHYs, * however the AL981 provides direct access to the PHY - * registers while the AN985 uses a serial MII interface. - * The AN985's MII interface is also buggy in that you + * registers while the AN983 uses a serial MII interface. + * The AN983's MII interface is also buggy in that you * can read from any MII address (0 to 31), but only address 1 * behaves normally. To deal with both cases, we pretend * that the PHY is at MII address 1. @@ -1895,11 +1896,11 @@ dc_attach(device_t dev) sc->dc_pmode = DC_PMODE_MII; dc_read_srom(sc, sc->dc_romwidth); break; + case DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_AN983): case DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_AN985): case DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_ADM9511): case DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_ADM9513): case DC_DEVID(DC_VENDORID_DLINK, DC_DEVICEID_DRP32TXD): - case DC_DEVID(DC_VENDORID_ADMTEK, DC_DEVICEID_FA511): case DC_DEVID(DC_VENDORID_ABOCOM, DC_DEVICEID_FE2500): case DC_DEVID(DC_VENDORID_ABOCOM, DC_DEVICEID_FE2500MX): case DC_DEVID(DC_VENDORID_ACCTON, DC_DEVICEID_EN2242): @@ -1910,7 +1911,7 @@ dc_attach(device_t dev) case DC_DEVID(DC_VENDORID_MICROSOFT, DC_DEVICEID_MSMN130): case DC_DEVID(DC_VENDORID_LINKSYS, DC_DEVICEID_PCMPC200_AB08): case DC_DEVID(DC_VENDORID_LINKSYS, DC_DEVICEID_PCMPC200_AB09): - sc->dc_type = DC_TYPE_AN985; + sc->dc_type = DC_TYPE_AN983; sc->dc_flags |= DC_64BIT_HASH; sc->dc_flags |= DC_TX_USE_TX_INTR; sc->dc_flags |= DC_TX_ADMTEK_WAR; @@ -2057,7 +2058,7 @@ dc_attach(device_t dev) dc_read_eeprom(sc, (caddr_t)&eaddr, DC_EE_NODEADDR, 3, 0); break; case DC_TYPE_AL981: - case DC_TYPE_AN985: + case DC_TYPE_AN983: reg = CSR_READ_4(sc, DC_AL_PAR0); mac = (uint8_t *)&eaddr[0]; mac[0] = (reg >> 0) & 0xff; diff --git a/sys/dev/dc/if_dcreg.h b/sys/dev/dc/if_dcreg.h index cce2c1003585..20fd2ce1ba4f 100644 --- a/sys/dev/dc/if_dcreg.h +++ b/sys/dev/dc/if_dcreg.h @@ -72,7 +72,7 @@ #define DC_TYPE_21143 0x4 /* Intel 21143 */ #define DC_TYPE_ASIX 0x5 /* ASIX AX88140A/AX88141 */ #define DC_TYPE_AL981 0x6 /* ADMtek AL981 Comet */ -#define DC_TYPE_AN985 0x7 /* ADMtek AN985 Centaur */ +#define DC_TYPE_AN983 0x7 /* ADMtek AN983 Centaur */ #define DC_TYPE_DM9102 0x8 /* Davicom DM9102 */ #define DC_TYPE_PNICII 0x9 /* 82c115 PNIC II */ #define DC_TYPE_PNIC 0xA /* 82c168/82c169 PNIC I */ @@ -86,12 +86,12 @@ #define DC_IS_ADMTEK(x) \ (x->dc_type == DC_TYPE_AL981 || \ - x->dc_type == DC_TYPE_AN985) + x->dc_type == DC_TYPE_AN983) #define DC_IS_INTEL(x) (x->dc_type == DC_TYPE_21143) #define DC_IS_ASIX(x) (x->dc_type == DC_TYPE_ASIX) #define DC_IS_COMET(x) (x->dc_type == DC_TYPE_AL981) -#define DC_IS_CENTAUR(x) (x->dc_type == DC_TYPE_AN985) +#define DC_IS_CENTAUR(x) (x->dc_type == DC_TYPE_AN983) #define DC_IS_DAVICOM(x) (x->dc_type == DC_TYPE_DM9102) #define DC_IS_PNICII(x) (x->dc_type == DC_TYPE_PNICII) #define DC_IS_PNIC(x) (x->dc_type == DC_TYPE_PNIC) @@ -543,8 +543,8 @@ struct dc_mii_frame { */ /* - * ADMtek specific registers and constants for the AL981 and AN985. - * The AN985 doesn't use the magic PHY registers. + * ADMtek specific registers and constants for the AL981 and AN983. + * The AN983 doesn't use the magic PHY registers. */ #define DC_AL_CR 0x88 /* command register */ #define DC_AL_PAR0 0xA4 /* station address */ @@ -890,8 +890,8 @@ struct dc_softc { * ADMtek device IDs. */ #define DC_DEVICEID_AL981 0x0981 -#define DC_DEVICEID_AN985 0x0985 -#define DC_DEVICEID_FA511 0x1985 +#define DC_DEVICEID_AN983 0x0985 +#define DC_DEVICEID_AN985 0x1985 #define DC_DEVICEID_ADM9511 0x9511 #define DC_DEVICEID_ADM9513 0x9513 @@ -1002,7 +1002,7 @@ struct dc_softc { #define DC_VENDORID_MICROSOFT 0x1414 /* - * Supported Microsoft PCI and cardbus NICs. These are really + * Supported Microsoft PCI and CardBus NICs. These are really * ADMtek parts in disguise. */ diff --git a/sys/dev/de/if_de.c b/sys/dev/de/if_de.c index c3d283988aeb..a9b9f3125198 100644 --- a/sys/dev/de/if_de.c +++ b/sys/dev/de/if_de.c @@ -151,6 +151,7 @@ static void tulip_start_locked(tulip_softc_t * const sc); static struct mbuf * tulip_txput(tulip_softc_t * const sc, struct mbuf *m); static void tulip_txput_setup(tulip_softc_t * const sc); +static void tulip_watchdog(void *arg); struct mbuf * tulip_dequeue_mbuf(tulip_ringinfo_t *ri, tulip_descinfo_t *di, int sync); static void tulip_dma_map_addr(void *, bus_dma_segment_t *, int, int); @@ -2289,7 +2290,7 @@ tulip_identify_asante_nic(tulip_softc_t * const sc) mi->mi_gpr_length = 0; mi->mi_gpr_offset = 0; mi->mi_reset_length = 0; - mi->mi_reset_offset = 0;; + mi->mi_reset_offset = 0; mi->mi_phyaddr = TULIP_MII_NOPHY; for (idx = 20; idx > 0 && mi->mi_phyaddr == TULIP_MII_NOPHY; idx--) { @@ -3302,11 +3303,13 @@ tulip_init_locked(tulip_softc_t * const sc) TULIP_CSR_READ(sc, csr_status)); if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP) tulip_txput_setup(sc); + callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc); } else { CTR0(KTR_TULIP, "tulip_init_locked: not up, reset chip"); sc->tulip_ifp->if_drv_flags &= ~IFF_DRV_RUNNING; tulip_reset(sc); tulip_addr_filter(sc); + callout_stop(&sc->tulip_stat_timer); } } @@ -4319,23 +4322,17 @@ tulip_start_locked(tulip_softc_t * const sc) } } -/* - * Even though this routine runs at device spl, it does not break - * our use of splnet (splsoftnet under NetBSD) for the majority - * of this driver since - * if_watcbog is called from if_watchdog which is called from - * splsoftclock which is below spl[soft]net. - */ static void -tulip_ifwatchdog(struct ifnet *ifp) +tulip_watchdog(void *arg) { - TULIP_PERFSTART(ifwatchdog) - tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc; + TULIP_PERFSTART(stat) + tulip_softc_t *sc = arg; #if defined(TULIP_DEBUG) u_int32_t rxintrs; #endif - TULIP_LOCK(sc); + TULIP_LOCK_ASSERT(sc); + callout_reset(&sc->tulip_stat_timer, hz, tulip_watchdog, sc); #if defined(TULIP_DEBUG) rxintrs = sc->tulip_dbg.dbg_rxintrs - sc->tulip_dbg.dbg_last_rxintrs; if (rxintrs > sc->tulip_dbg.dbg_high_rxintrs_hz) @@ -4343,7 +4340,6 @@ tulip_ifwatchdog(struct ifnet *ifp) sc->tulip_dbg.dbg_last_rxintrs = sc->tulip_dbg.dbg_rxintrs; #endif /* TULIP_DEBUG */ - sc->tulip_ifp->if_timer = 1; /* * These should be rare so do a bulk test up front so we can just skip * them if needed. @@ -4381,11 +4377,11 @@ tulip_ifwatchdog(struct ifnet *ifp) tulip_init_locked(sc); } - TULIP_PERFEND(ifwatchdog); + TULIP_PERFEND(stat); TULIP_PERFMERGE(sc, perf_intr_cycles); TULIP_PERFMERGE(sc, perf_ifstart_cycles); TULIP_PERFMERGE(sc, perf_ifioctl_cycles); - TULIP_PERFMERGE(sc, perf_ifwatchdog_cycles); + TULIP_PERFMERGE(sc, perf_stat_cycles); TULIP_PERFMERGE(sc, perf_timeout_cycles); TULIP_PERFMERGE(sc, perf_ifstart_one_cycles); TULIP_PERFMERGE(sc, perf_txput_cycles); @@ -4395,14 +4391,13 @@ tulip_ifwatchdog(struct ifnet *ifp) TULIP_PERFMERGE(sc, perf_intr); TULIP_PERFMERGE(sc, perf_ifstart); TULIP_PERFMERGE(sc, perf_ifioctl); - TULIP_PERFMERGE(sc, perf_ifwatchdog); + TULIP_PERFMERGE(sc, perf_stat); TULIP_PERFMERGE(sc, perf_timeout); TULIP_PERFMERGE(sc, perf_ifstart_one); TULIP_PERFMERGE(sc, perf_txput); TULIP_PERFMERGE(sc, perf_txintr); TULIP_PERFMERGE(sc, perf_rxintr); TULIP_PERFMERGE(sc, perf_rxget); - TULIP_UNLOCK(sc); } static void @@ -4418,8 +4413,6 @@ tulip_attach(tulip_softc_t * const sc) ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST; ifp->if_ioctl = tulip_ifioctl; ifp->if_start = tulip_start; - ifp->if_watchdog = tulip_ifwatchdog; - ifp->if_timer = 1; ifp->if_init = tulip_init; IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; @@ -4839,6 +4832,7 @@ tulip_pci_attach(device_t dev) mtx_init(TULIP_MUTEX(sc), MTX_NETWORK_LOCK, device_get_nameunit(dev), MTX_DEF); callout_init_mtx(&sc->tulip_callout, TULIP_MUTEX(sc), 0); + callout_init_mtx(&sc->tulip_stat_timer, TULIP_MUTEX(sc), 0); tulips[unit] = sc; tulip_initcsrs(sc, csr_base + csroffset, csrsize); diff --git a/sys/dev/de/if_devar.h b/sys/dev/de/if_devar.h index b4feebc12aaa..8776be01c254 100644 --- a/sys/dev/de/if_devar.h +++ b/sys/dev/de/if_devar.h @@ -477,7 +477,7 @@ struct tulip_perfstat { u_quad_t perf_ifstart_cycles; u_quad_t perf_ifstart_one_cycles; u_quad_t perf_ifioctl_cycles; - u_quad_t perf_ifwatchdog_cycles; + u_quad_t perf_stat_cycles; u_quad_t perf_timeout_cycles; u_quad_t perf_txput_cycles; u_quad_t perf_txintr_cycles; @@ -487,7 +487,7 @@ struct tulip_perfstat { unsigned int perf_ifstart; unsigned int perf_ifstart_one; unsigned int perf_ifioctl; - unsigned int perf_ifwatchdog; + unsigned int perf_stat; unsigned int perf_timeout; unsigned int perf_txput; unsigned int perf_txintr; @@ -570,6 +570,7 @@ struct tulip_softc { tulip_srom_connection_t tulip_conntype; struct callout tulip_callout; struct mtx tulip_mutex; + struct callout tulip_stat_timer; }; #define tulip_curperfstats tulip_perfstats[TULIP_PERF_CURRENT] diff --git a/sys/dev/dpms/dpms.c b/sys/dev/dpms/dpms.c index c0476c5d36e7..fdfed2f6cedd 100644 --- a/sys/dev/dpms/dpms.c +++ b/sys/dev/dpms/dpms.c @@ -118,20 +118,14 @@ static driver_t dpms_driver = { static devclass_t dpms_devclass; -DRIVER_MODULE(dpms, vgapci, dpms_driver, dpms_devclass, NULL, NULL); +DRIVER_MODULE(dpms, vgapm, dpms_driver, dpms_devclass, NULL, NULL); MODULE_DEPEND(dpms, x86bios, 1, 1, 1); static void dpms_identify(driver_t *driver, device_t parent) { - /* - * XXX: The DPMS VBE only allows for manipulating a single - * monitor, but we don't know which one. Just attach to the - * first vgapci(4) device we encounter and hope it is the - * right one. - */ - if (devclass_get_device(dpms_devclass, 0) == NULL) + if (x86bios_match_device(0xc0000, device_get_parent(parent))) device_add_child(parent, "dpms", 0); } @@ -172,8 +166,11 @@ dpms_detach(device_t dev) static int dpms_suspend(device_t dev) { + struct dpms_softc *sc; - dpms_set_state(DPMS_OFF); + sc = device_get_softc(dev); + if ((sc->dpms_supported_states & DPMS_OFF) != 0) + dpms_set_state(DPMS_OFF); return (0); } @@ -192,15 +189,16 @@ dpms_call_bios(int subfunction, int *bh) { x86regs_t regs; - bzero(®s, sizeof(regs)); + if (x86bios_get_intr(0x10) == 0) + return (ENXIO); + + x86bios_init_regs(®s); regs.R_AX = VBE_DPMS_FUNCTION; regs.R_BL = subfunction; regs.R_BH = *bh; - regs.R_ES = 0; - regs.R_DI = 0; x86bios_intr(®s, 0x10); - if ((regs.R_EAX & 0xffff) != 0x004f) + if (regs.R_AX != 0x004f) return (ENXIO); *bh = regs.R_BH; diff --git a/sys/dev/dpt/dpt.h b/sys/dev/dpt/dpt.h index b1562d3cd3b2..c31e6e38e302 100644 --- a/sys/dev/dpt/dpt.h +++ b/sys/dev/dpt/dpt.h @@ -26,6 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * $FreeBSD$ */ /* @@ -39,9 +40,6 @@ * FreeBSD.ORG; Great O/S to work on and for. */ - -#ident "$FreeBSD$" - #ifndef _DPT_H #define _DPT_H diff --git a/sys/dev/dpt/dpt_scsi.c b/sys/dev/dpt/dpt_scsi.c index eb1f3f444626..2f72407f5d91 100644 --- a/sys/dev/dpt/dpt_scsi.c +++ b/sys/dev/dpt/dpt_scsi.c @@ -27,7 +27,6 @@ * SUCH DAMAGE. */ -#ident "$FreeBSD$" #include __FBSDID("$FreeBSD$"); diff --git a/sys/dev/drm/drmP.h b/sys/dev/drm/drmP.h index cad2cee623ae..f89e75032ecd 100644 --- a/sys/dev/drm/drmP.h +++ b/sys/dev/drm/drmP.h @@ -60,13 +60,17 @@ struct drm_file; #include #include #include +#include #include #include +#include #include #include #include #include #include +#include +#include #include #include #include @@ -91,9 +95,9 @@ struct drm_file; #include #include "dev/drm/drm.h" -#include "dev/drm/drm_linux_list.h" #include "dev/drm/drm_atomic.h" #include "dev/drm/drm_internal.h" +#include "dev/drm/drm_linux_list.h" #include #ifdef DRM_DEBUG @@ -147,6 +151,8 @@ MALLOC_DECLARE(DRM_MEM_AGPLISTS); MALLOC_DECLARE(DRM_MEM_CTXBITMAP); MALLOC_DECLARE(DRM_MEM_SGLISTS); MALLOC_DECLARE(DRM_MEM_DRAWABLE); +MALLOC_DECLARE(DRM_MEM_MM); +MALLOC_DECLARE(DRM_MEM_HASHTAB); SYSCTL_DECL(_hw_drm); @@ -193,6 +199,11 @@ typedef void irqreturn_t; #define IRQ_HANDLED /* nothing */ #define IRQ_NONE /* nothing */ +#define unlikely(x) __builtin_expect(!!(x), 0) +#define container_of(ptr, type, member) ({ \ + __typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + enum { DRM_IS_NOT_AGP, DRM_IS_AGP, @@ -223,23 +234,9 @@ typedef u_int8_t u8; * DRM_WRITEMEMORYBARRIER() prevents reordering of writes. * DRM_MEMORYBARRIER() prevents reordering of reads and writes. */ -#if defined(__i386__) -#define DRM_READMEMORYBARRIER() __asm __volatile( \ - "lock; addl $0,0(%%esp)" : : : "memory"); -#define DRM_WRITEMEMORYBARRIER() __asm __volatile("" : : : "memory"); -#define DRM_MEMORYBARRIER() __asm __volatile( \ - "lock; addl $0,0(%%esp)" : : : "memory"); -#elif defined(__alpha__) -#define DRM_READMEMORYBARRIER() alpha_mb(); -#define DRM_WRITEMEMORYBARRIER() alpha_wmb(); -#define DRM_MEMORYBARRIER() alpha_mb(); -#elif defined(__amd64__) -#define DRM_READMEMORYBARRIER() __asm __volatile( \ - "lock; addl $0,0(%%rsp)" : : : "memory"); -#define DRM_WRITEMEMORYBARRIER() __asm __volatile("" : : : "memory"); -#define DRM_MEMORYBARRIER() __asm __volatile( \ - "lock; addl $0,0(%%rsp)" : : : "memory"); -#endif +#define DRM_READMEMORYBARRIER() rmb() +#define DRM_WRITEMEMORYBARRIER() wmb() +#define DRM_MEMORYBARRIER() mb() #define DRM_READ8(map, offset) \ *(volatile u_int8_t *)(((vm_offset_t)(map)->handle) + \ diff --git a/sys/dev/drm/drm_hashtab.c b/sys/dev/drm/drm_hashtab.c new file mode 100644 index 000000000000..e98f1026cf52 --- /dev/null +++ b/sys/dev/drm/drm_hashtab.c @@ -0,0 +1,180 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple open hash tab implementation. + * + * Authors: + * Thomas Hellström + */ + +#include "dev/drm/drmP.h" +#include "dev/drm/drm_hashtab.h" + +#include + +int drm_ht_create(struct drm_open_hash *ht, unsigned int order) +{ + ht->size = 1 << order; + ht->order = order; + ht->table = NULL; + ht->table = hashinit(ht->size, DRM_MEM_HASHTAB, &ht->mask); + if (!ht->table) { + DRM_ERROR("Out of memory for hash table\n"); + return -ENOMEM; + } + return 0; +} + +void drm_ht_verbose_list(struct drm_open_hash *ht, unsigned long key) +{ + struct drm_hash_item *entry; + struct drm_hash_item_list *h_list; + unsigned int hashed_key; + int count = 0; + + hashed_key = hash32_buf(&key, sizeof(key), ht->order); + DRM_DEBUG("Key is 0x%08lx, Hashed key is 0x%08x\n", key, hashed_key); + h_list = &ht->table[hashed_key & ht->mask]; + LIST_FOREACH(entry, h_list, head) + DRM_DEBUG("count %d, key: 0x%08lx\n", count++, entry->key); +} + +static struct drm_hash_item * +drm_ht_find_key(struct drm_open_hash *ht, unsigned long key) +{ + struct drm_hash_item *entry; + struct drm_hash_item_list *h_list; + unsigned int hashed_key; + + hashed_key = hash32_buf(&key, sizeof(key), ht->order); + h_list = &ht->table[hashed_key & ht->mask]; + LIST_FOREACH(entry, h_list, head) { + if (entry->key == key) + return entry; + if (entry->key > key) + break; + } + return NULL; +} + + +int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item) +{ + struct drm_hash_item *entry, *parent; + struct drm_hash_item_list *h_list; + unsigned int hashed_key; + unsigned long key = item->key; + + hashed_key = hash32_buf(&key, sizeof(key), ht->order); + h_list = &ht->table[hashed_key & ht->mask]; + parent = NULL; + LIST_FOREACH(entry, h_list, head) { + if (entry->key == key) + return -EINVAL; + if (entry->key > key) + break; + parent = entry; + } + if (parent) { + LIST_INSERT_AFTER(parent, item, head); + } else { + LIST_INSERT_HEAD(h_list, item, head); + } + return 0; +} + +/* + * Just insert an item and return any "bits" bit key that hasn't been + * used before. + */ +int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, + unsigned long seed, int bits, int shift, + unsigned long add) +{ + int ret; + unsigned long mask = (1 << bits) - 1; + unsigned long first, unshifted_key = 0; + + unshifted_key = hash32_buf(&seed, sizeof(seed), unshifted_key); + first = unshifted_key; + do { + item->key = (unshifted_key << shift) + add; + ret = drm_ht_insert_item(ht, item); + if (ret) + unshifted_key = (unshifted_key + 1) & mask; + } while(ret && (unshifted_key != first)); + + if (ret) { + DRM_ERROR("Available key bit space exhausted\n"); + return -EINVAL; + } + return 0; +} + +int drm_ht_find_item(struct drm_open_hash *ht, unsigned long key, + struct drm_hash_item **item) +{ + struct drm_hash_item *entry; + + entry = drm_ht_find_key(ht, key); + if (!entry) + return -EINVAL; + + *item = entry; + return 0; +} + +int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key) +{ + struct drm_hash_item *entry; + + entry = drm_ht_find_key(ht, key); + if (entry) { + LIST_REMOVE(entry, head); + return 0; + } + return -EINVAL; +} + +int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item) +{ + LIST_REMOVE(item, head); + return 0; +} + +void drm_ht_remove(struct drm_open_hash *ht) +{ + if (ht->table) { + hashdestroy(ht->table, DRM_MEM_HASHTAB, ht->mask); + ht->table = NULL; + } +} diff --git a/sys/dev/drm/drm_hashtab.h b/sys/dev/drm/drm_hashtab.h new file mode 100644 index 000000000000..967022d7e623 --- /dev/null +++ b/sys/dev/drm/drm_hashtab.h @@ -0,0 +1,68 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismack, ND. USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple open hash tab implementation. + * + * Authors: + * Thomas Hellström + */ + +#ifndef DRM_HASHTAB_H +#define DRM_HASHTAB_H + +#define drm_hash_entry(_ptr, _type, _member) container_of(_ptr, _type, _member) + +struct drm_hash_item { + LIST_ENTRY(drm_hash_item) head; + unsigned long key; +}; + +struct drm_open_hash { + LIST_HEAD(drm_hash_item_list, drm_hash_item) *table; + unsigned int size; + unsigned int order; + unsigned long mask; +}; + +extern int drm_ht_create(struct drm_open_hash *ht, unsigned int order); +extern int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item); +extern int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, + unsigned long seed, int bits, int shift, + unsigned long add); +extern int drm_ht_find_item(struct drm_open_hash *ht, unsigned long key, struct drm_hash_item **item); + +extern void drm_ht_verbose_list(struct drm_open_hash *ht, unsigned long key); +extern int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key); +extern int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item); +extern void drm_ht_remove(struct drm_open_hash *ht); + +#endif diff --git a/sys/dev/drm/drm_linux_list.h b/sys/dev/drm/drm_linux_list.h index 809d8ed7a6a3..d4122583291c 100644 --- a/sys/dev/drm/drm_linux_list.h +++ b/sys/dev/drm/drm_linux_list.h @@ -32,12 +32,15 @@ #include __FBSDID("$FreeBSD$"); +#ifndef _DRM_LINUX_LIST_H_ +#define _DRM_LINUX_LIST_H_ + struct list_head { struct list_head *next, *prev; }; -/* Cheat, assume the list_head is at the start of the struct */ -#define list_entry(entry, type, member) (type *)(entry) +#define list_entry(ptr, type, member) container_of(ptr,type,member) +#define hlist_entry(ptr, type, member) container_of(ptr,type,member) static __inline__ void INIT_LIST_HEAD(struct list_head *head) { @@ -50,6 +53,14 @@ list_empty(struct list_head *head) { return (head)->next == head; } +static __inline__ void +list_add(struct list_head *new, struct list_head *head) { + (head)->next->prev = new; + (new)->next = (head)->next; + (new)->prev = head; + (head)->next = new; +} + static __inline__ void list_add_tail(struct list_head *entry, struct list_head *head) { (entry)->prev = (head)->prev; @@ -64,6 +75,13 @@ list_del(struct list_head *entry) { (entry)->prev->next = (entry)->next; } +static __inline__ void +list_del_init(struct list_head *entry) { + (entry)->next->prev = (entry)->prev; + (entry)->prev->next = (entry)->next; + INIT_LIST_HEAD(entry); +} + #define list_for_each(entry, head) \ for (entry = (head)->next; entry != head; entry = (entry)->next) @@ -76,3 +94,17 @@ list_del(struct list_head *entry) { entry != head; \ entry = temp, temp = entry->next) +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop cursor. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, __typeof(*pos), member), \ + n = list_entry(pos->member.next, __typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, __typeof(*n), member)) + +#endif /* _DRM_LINUX_LIST_H_ */ diff --git a/sys/dev/drm/drm_memory.c b/sys/dev/drm/drm_memory.c index 3819bab1b741..8eaf4d1e9e27 100644 --- a/sys/dev/drm/drm_memory.c +++ b/sys/dev/drm/drm_memory.c @@ -60,6 +60,8 @@ MALLOC_DEFINE(DRM_MEM_CTXBITMAP, "drm_ctxbitmap", "DRM CTXBITMAP Data Structures"); MALLOC_DEFINE(DRM_MEM_SGLISTS, "drm_sglists", "DRM SGLISTS Data Structures"); MALLOC_DEFINE(DRM_MEM_DRAWABLE, "drm_drawable", "DRM DRAWABLE Data Structures"); +MALLOC_DEFINE(DRM_MEM_MM, "drm_sman", "DRM MEMORY MANAGER Data Structures"); +MALLOC_DEFINE(DRM_MEM_HASHTAB, "drm_hashtab", "DRM HASHTABLE Data Structures"); void drm_mem_init(void) { diff --git a/sys/dev/drm/drm_mm.c b/sys/dev/drm/drm_mm.c new file mode 100644 index 000000000000..344436fd22d9 --- /dev/null +++ b/sys/dev/drm/drm_mm.c @@ -0,0 +1,368 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Generic simple memory manager implementation. Intended to be used as a base + * class implementation for more advanced memory managers. + * + * Note that the algorithm used is quite simple and there might be substantial + * performance gains if a smarter free list is implemented. Currently it is just an + * unordered stack of free regions. This could easily be improved if an RB-tree + * is used instead. At least if we expect heavy fragmentation. + * + * Aligned allocations can also see improvement. + * + * Authors: + * Thomas Hellström + */ + +#include "dev/drm/drmP.h" +#include "dev/drm/drm_mm.h" + +#define MM_UNUSED_TARGET 4 + +unsigned long drm_mm_tail_space(struct drm_mm *mm) +{ + struct list_head *tail_node; + struct drm_mm_node *entry; + + tail_node = mm->ml_entry.prev; + entry = list_entry(tail_node, struct drm_mm_node, ml_entry); + if (!entry->free) + return 0; + + return entry->size; +} + +int drm_mm_remove_space_from_tail(struct drm_mm *mm, unsigned long size) +{ + struct list_head *tail_node; + struct drm_mm_node *entry; + + tail_node = mm->ml_entry.prev; + entry = list_entry(tail_node, struct drm_mm_node, ml_entry); + if (!entry->free) + return -ENOMEM; + + if (entry->size <= size) + return -ENOMEM; + + entry->size -= size; + return 0; +} + +static struct drm_mm_node *drm_mm_kmalloc(struct drm_mm *mm, int atomic) +{ + struct drm_mm_node *child; + + if (atomic) + child = malloc(sizeof(*child), DRM_MEM_MM, M_NOWAIT); + else + child = malloc(sizeof(*child), DRM_MEM_MM, M_WAITOK); + + if (unlikely(child == NULL)) { + mtx_lock(&mm->unused_lock); + if (list_empty(&mm->unused_nodes)) + child = NULL; + else { + child = + list_entry(mm->unused_nodes.next, + struct drm_mm_node, fl_entry); + list_del(&child->fl_entry); + --mm->num_unused; + } + mtx_unlock(&mm->unused_lock); + } + return child; +} + +int drm_mm_pre_get(struct drm_mm *mm) +{ + struct drm_mm_node *node; + + mtx_lock(&mm->unused_lock); + while (mm->num_unused < MM_UNUSED_TARGET) { + mtx_unlock(&mm->unused_lock); + node = malloc(sizeof(*node), DRM_MEM_MM, M_WAITOK); + mtx_lock(&mm->unused_lock); + + if (unlikely(node == NULL)) { + int ret = (mm->num_unused < 2) ? -ENOMEM : 0; + mtx_unlock(&mm->unused_lock); + return ret; + } + ++mm->num_unused; + list_add_tail(&node->fl_entry, &mm->unused_nodes); + } + mtx_unlock(&mm->unused_lock); + return 0; +} + +static int drm_mm_create_tail_node(struct drm_mm *mm, + unsigned long start, + unsigned long size, int atomic) +{ + struct drm_mm_node *child; + + child = drm_mm_kmalloc(mm, atomic); + if (unlikely(child == NULL)) + return -ENOMEM; + + child->free = 1; + child->size = size; + child->start = start; + child->mm = mm; + + list_add_tail(&child->ml_entry, &mm->ml_entry); + list_add_tail(&child->fl_entry, &mm->fl_entry); + + return 0; +} + +int drm_mm_add_space_to_tail(struct drm_mm *mm, unsigned long size, int atomic) +{ + struct list_head *tail_node; + struct drm_mm_node *entry; + + tail_node = mm->ml_entry.prev; + entry = list_entry(tail_node, struct drm_mm_node, ml_entry); + if (!entry->free) { + return drm_mm_create_tail_node(mm, entry->start + entry->size, + size, atomic); + } + entry->size += size; + return 0; +} + +static struct drm_mm_node *drm_mm_split_at_start(struct drm_mm_node *parent, + unsigned long size, + int atomic) +{ + struct drm_mm_node *child; + + child = drm_mm_kmalloc(parent->mm, atomic); + if (unlikely(child == NULL)) + return NULL; + + INIT_LIST_HEAD(&child->fl_entry); + + child->free = 0; + child->size = size; + child->start = parent->start; + child->mm = parent->mm; + + list_add_tail(&child->ml_entry, &parent->ml_entry); + INIT_LIST_HEAD(&child->fl_entry); + + parent->size -= size; + parent->start += size; + return child; +} + + +struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, + unsigned long size, + unsigned alignment, + int atomic) +{ + + struct drm_mm_node *align_splitoff = NULL; + unsigned tmp = 0; + + if (alignment) + tmp = node->start % alignment; + + if (tmp) { + align_splitoff = + drm_mm_split_at_start(node, alignment - tmp, atomic); + if (unlikely(align_splitoff == NULL)) + return NULL; + } + + if (node->size == size) { + list_del_init(&node->fl_entry); + node->free = 0; + } else { + node = drm_mm_split_at_start(node, size, atomic); + } + + if (align_splitoff) + drm_mm_put_block(align_splitoff); + + return node; +} + +/* + * Put a block. Merge with the previous and / or next block if they are free. + * Otherwise add to the free stack. + */ + +void drm_mm_put_block(struct drm_mm_node *cur) +{ + + struct drm_mm *mm = cur->mm; + struct list_head *cur_head = &cur->ml_entry; + struct list_head *root_head = &mm->ml_entry; + struct drm_mm_node *prev_node = NULL; + struct drm_mm_node *next_node; + + int merged = 0; + + if (cur_head->prev != root_head) { + prev_node = + list_entry(cur_head->prev, struct drm_mm_node, ml_entry); + if (prev_node->free) { + prev_node->size += cur->size; + merged = 1; + } + } + if (cur_head->next != root_head) { + next_node = + list_entry(cur_head->next, struct drm_mm_node, ml_entry); + if (next_node->free) { + if (merged) { + prev_node->size += next_node->size; + list_del(&next_node->ml_entry); + list_del(&next_node->fl_entry); + if (mm->num_unused < MM_UNUSED_TARGET) { + list_add(&next_node->fl_entry, + &mm->unused_nodes); + ++mm->num_unused; + } else + free(next_node, DRM_MEM_MM); + } else { + next_node->size += cur->size; + next_node->start = cur->start; + merged = 1; + } + } + } + if (!merged) { + cur->free = 1; + list_add(&cur->fl_entry, &mm->fl_entry); + } else { + list_del(&cur->ml_entry); + if (mm->num_unused < MM_UNUSED_TARGET) { + list_add(&cur->fl_entry, &mm->unused_nodes); + ++mm->num_unused; + } else + free(cur, DRM_MEM_MM); + } +} + +struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, + unsigned long size, + unsigned alignment, int best_match) +{ + struct list_head *list; + const struct list_head *free_stack = &mm->fl_entry; + struct drm_mm_node *entry; + struct drm_mm_node *best; + unsigned long best_size; + unsigned wasted; + + best = NULL; + best_size = ~0UL; + + list_for_each(list, free_stack) { + entry = list_entry(list, struct drm_mm_node, fl_entry); + wasted = 0; + + if (entry->size < size) + continue; + + if (alignment) { + register unsigned tmp = entry->start % alignment; + if (tmp) + wasted += alignment - tmp; + } + + if (entry->size >= size + wasted) { + if (!best_match) + return entry; + if (size < best_size) { + best = entry; + best_size = entry->size; + } + } + } + + return best; +} + +int drm_mm_clean(struct drm_mm * mm) +{ + struct list_head *head = &mm->ml_entry; + + return (head->next->next == head); +} + +int drm_mm_init(struct drm_mm * mm, unsigned long start, unsigned long size) +{ + INIT_LIST_HEAD(&mm->ml_entry); + INIT_LIST_HEAD(&mm->fl_entry); + INIT_LIST_HEAD(&mm->unused_nodes); + mm->num_unused = 0; + mtx_init(&mm->unused_lock, "drm_unused", NULL, MTX_DEF); + + return drm_mm_create_tail_node(mm, start, size, 0); +} + +void drm_mm_takedown(struct drm_mm * mm) +{ + struct list_head *bnode = mm->fl_entry.next; + struct drm_mm_node *entry; + struct drm_mm_node *next; + + entry = list_entry(bnode, struct drm_mm_node, fl_entry); + + if (entry->ml_entry.next != &mm->ml_entry || + entry->fl_entry.next != &mm->fl_entry) { + DRM_ERROR("Memory manager not clean. Delaying takedown\n"); + return; + } + + list_del(&entry->fl_entry); + list_del(&entry->ml_entry); + free(entry, DRM_MEM_MM); + + mtx_lock(&mm->unused_lock); + list_for_each_entry_safe(entry, next, &mm->unused_nodes, fl_entry) { + list_del(&entry->fl_entry); + free(entry, DRM_MEM_MM); + --mm->num_unused; + } + mtx_unlock(&mm->unused_lock); + + mtx_destroy(&mm->unused_lock); + + KASSERT(mm->num_unused == 0, ("num_unused != 0")); +} diff --git a/sys/dev/drm/drm_mm.h b/sys/dev/drm/drm_mm.h new file mode 100644 index 000000000000..f7479cdc1f40 --- /dev/null +++ b/sys/dev/drm/drm_mm.h @@ -0,0 +1,100 @@ +/************************************************************************** + * + * Copyright 2006-2008 Tungsten Graphics, Inc., Cedar Park, TX. USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Authors: + * Thomas Hellstrom + */ + +#ifndef _DRM_MM_H_ +#define _DRM_MM_H_ + +#include "dev/drm/drm_linux_list.h" + +struct drm_mm_node { + struct list_head fl_entry; + struct list_head ml_entry; + int free; + unsigned long start; + unsigned long size; + struct drm_mm *mm; + void *private; +}; + +struct drm_mm { + struct list_head fl_entry; + struct list_head ml_entry; + struct list_head unused_nodes; + int num_unused; + struct mtx unused_lock; +}; + +/* + * Basic range manager support (drm_mm.c) + */ +extern struct drm_mm_node *drm_mm_get_block_generic(struct drm_mm_node *node, + unsigned long size, + unsigned alignment, + int atomic); +static inline struct drm_mm_node *drm_mm_get_block(struct drm_mm_node *parent, + unsigned long size, + unsigned alignment) +{ + return drm_mm_get_block_generic(parent, size, alignment, 0); +} +static inline struct drm_mm_node *drm_mm_get_block_atomic(struct drm_mm_node *parent, + unsigned long size, + unsigned alignment) +{ + return drm_mm_get_block_generic(parent, size, alignment, 1); +} +extern void drm_mm_put_block(struct drm_mm_node *cur); +extern struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm, + unsigned long size, + unsigned alignment, + int best_match); +extern int drm_mm_init(struct drm_mm *mm, unsigned long start, + unsigned long size); +extern void drm_mm_takedown(struct drm_mm *mm); +extern int drm_mm_clean(struct drm_mm *mm); +extern unsigned long drm_mm_tail_space(struct drm_mm *mm); +extern int drm_mm_remove_space_from_tail(struct drm_mm *mm, + unsigned long size); +extern int drm_mm_add_space_to_tail(struct drm_mm *mm, + unsigned long size, int atomic); +extern int drm_mm_pre_get(struct drm_mm *mm); + +static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) +{ + return block->mm; +} + +#endif diff --git a/sys/dev/drm/drm_pciids.h b/sys/dev/drm/drm_pciids.h index 7cc084c4713a..acebad4e002c 100644 --- a/sys/dev/drm/drm_pciids.h +++ b/sys/dev/drm/drm_pciids.h @@ -552,6 +552,7 @@ {0x8086, 0x2E02, CHIP_I9XX|CHIP_I965, "Intel Integrated Graphics Device"}, \ {0x8086, 0x2E12, CHIP_I9XX|CHIP_I965, "Intel Q45/Q43"}, \ {0x8086, 0x2E22, CHIP_I9XX|CHIP_I965, "Intel G45/G43"}, \ + {0x8086, 0x2E32, CHIP_I9XX|CHIP_I965, "Intel G41"}, \ {0, 0, 0, NULL} #define imagine_PCI_IDS \ diff --git a/sys/dev/drm/drm_scatter.c b/sys/dev/drm/drm_scatter.c index 5f8b29b001b7..b3ab63b630c9 100644 --- a/sys/dev/drm/drm_scatter.c +++ b/sys/dev/drm/drm_scatter.c @@ -47,79 +47,50 @@ drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather *request) { struct drm_sg_mem *entry; struct drm_dma_handle *dmah; - unsigned long pages; int ret; if (dev->sg) return EINVAL; entry = malloc(sizeof(*entry), DRM_MEM_SGLISTS, M_WAITOK | M_ZERO); - if (!entry) - return ENOMEM; - - pages = round_page(request->size) / PAGE_SIZE; - DRM_DEBUG("sg size=%ld pages=%ld\n", request->size, pages); - - entry->pages = pages; - - entry->busaddr = malloc(pages * sizeof(*entry->busaddr), DRM_MEM_PAGES, - M_WAITOK | M_ZERO); - if (!entry->busaddr) { - free(entry, DRM_MEM_SGLISTS); - return ENOMEM; - } + entry->pages = round_page(request->size) / PAGE_SIZE; + DRM_DEBUG("sg size=%ld pages=%d\n", request->size, entry->pages); + entry->busaddr = malloc(entry->pages * sizeof(*entry->busaddr), + DRM_MEM_PAGES, M_WAITOK | M_ZERO); dmah = malloc(sizeof(struct drm_dma_handle), DRM_MEM_DMA, - M_ZERO | M_NOWAIT); - if (dmah == NULL) { - free(entry->busaddr, DRM_MEM_PAGES); - free(entry, DRM_MEM_SGLISTS); - return ENOMEM; - } + M_WAITOK | M_ZERO); + entry->dmah = dmah; ret = bus_dma_tag_create(NULL, PAGE_SIZE, 0, /* tag, align, boundary */ BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, /* lowaddr, highaddr */ NULL, NULL, /* filtfunc, filtfuncargs */ - request->size, pages, /* maxsize, nsegs */ + request->size, entry->pages, /* maxsize, nsegs */ PAGE_SIZE, 0, /* maxsegsize, flags */ NULL, NULL, /* lockfunc, lockfuncargs */ &dmah->tag); if (ret != 0) { - free(dmah, DRM_MEM_DMA); - free(entry->busaddr, DRM_MEM_PAGES); - free(entry, DRM_MEM_SGLISTS); + drm_sg_cleanup(entry); return ENOMEM; } ret = bus_dmamem_alloc(dmah->tag, &dmah->vaddr, BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_NOCACHE, &dmah->map); if (ret != 0) { - bus_dma_tag_destroy(dmah->tag); - free(dmah, DRM_MEM_DMA); - free(entry->busaddr, DRM_MEM_PAGES); - free(entry, DRM_MEM_SGLISTS); + drm_sg_cleanup(entry); return ENOMEM; } + entry->handle = (unsigned long)dmah->vaddr; + entry->virtual = dmah->vaddr; + ret = bus_dmamap_load(dmah->tag, dmah->map, dmah->vaddr, request->size, drm_sg_alloc_cb, entry, BUS_DMA_NOWAIT); if (ret != 0) { - bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); - bus_dma_tag_destroy(dmah->tag); - free(dmah, DRM_MEM_DMA); - free(entry->busaddr, DRM_MEM_PAGES); - free(entry, DRM_MEM_SGLISTS); + drm_sg_cleanup(entry); return ENOMEM; } - entry->dmah = dmah; - entry->handle = (unsigned long)dmah->vaddr; - - DRM_DEBUG("sg alloc handle = %08lx\n", entry->handle); - - entry->virtual = (void *)entry->handle; - request->handle = entry->handle; - DRM_LOCK(); if (dev->sg) { DRM_UNLOCK(); @@ -129,6 +100,11 @@ drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather *request) dev->sg = entry; DRM_UNLOCK(); + DRM_DEBUG("handle=%08lx, kva=%p, contents=%08lx\n", entry->handle, + entry->virtual, *(unsigned long *)entry->virtual); + + request->handle = entry->handle; + return 0; } @@ -143,6 +119,8 @@ drm_sg_alloc_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) for(i = 0 ; i < nsegs ; i++) { entry->busaddr[i] = segs[i].ds_addr; + DRM_DEBUG("segment %d @ 0x%016lx\n", i, + (unsigned long)segs[i].ds_addr); } } @@ -162,9 +140,12 @@ drm_sg_cleanup(struct drm_sg_mem *entry) { struct drm_dma_handle *dmah = entry->dmah; - bus_dmamap_unload(dmah->tag, dmah->map); - bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); - bus_dma_tag_destroy(dmah->tag); + if (dmah->map != NULL) + bus_dmamap_unload(dmah->tag, dmah->map); + if (dmah->vaddr != NULL) + bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); + if (dmah->tag != NULL) + bus_dma_tag_destroy(dmah->tag); free(dmah, DRM_MEM_DMA); free(entry->busaddr, DRM_MEM_PAGES); free(entry, DRM_MEM_SGLISTS); diff --git a/sys/dev/drm/drm_sman.c b/sys/dev/drm/drm_sman.c new file mode 100644 index 000000000000..9f1132ce2b2f --- /dev/null +++ b/sys/dev/drm/drm_sman.c @@ -0,0 +1,352 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck., ND., USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple memory manager interface that keeps track on allocate regions on a + * per "owner" basis. All regions associated with an "owner" can be released + * with a simple call. Typically if the "owner" exists. The owner is any + * "unsigned long" identifier. Can typically be a pointer to a file private + * struct or a context identifier. + * + * Authors: + * Thomas Hellström + */ + +#include "dev/drm/drmP.h" +#include "dev/drm/drm_sman.h" + +struct drm_owner_item { + struct drm_hash_item owner_hash; + struct list_head sman_list; + struct list_head mem_blocks; +}; + +void drm_sman_takedown(struct drm_sman * sman) +{ + drm_ht_remove(&sman->user_hash_tab); + drm_ht_remove(&sman->owner_hash_tab); + if (sman->mm) + drm_free(sman->mm, sman->num_managers * sizeof(*sman->mm), + DRM_MEM_MM); +} + +int +drm_sman_init(struct drm_sman * sman, unsigned int num_managers, + unsigned int user_order, unsigned int owner_order) +{ + int ret = 0; + + sman->mm = (struct drm_sman_mm *) drm_calloc(num_managers, + sizeof(*sman->mm), DRM_MEM_MM); + if (!sman->mm) { + ret = -ENOMEM; + goto out; + } + sman->num_managers = num_managers; + INIT_LIST_HEAD(&sman->owner_items); + ret = drm_ht_create(&sman->owner_hash_tab, owner_order); + if (ret) + goto out1; + ret = drm_ht_create(&sman->user_hash_tab, user_order); + if (!ret) + goto out; + + drm_ht_remove(&sman->owner_hash_tab); +out1: + drm_free(sman->mm, num_managers * sizeof(*sman->mm), DRM_MEM_MM); +out: + return ret; +} + +static void *drm_sman_mm_allocate(void *private, unsigned long size, + unsigned alignment) +{ + struct drm_mm *mm = (struct drm_mm *) private; + struct drm_mm_node *tmp; + + tmp = drm_mm_search_free(mm, size, alignment, 1); + if (!tmp) { + return NULL; + } + tmp = drm_mm_get_block(tmp, size, alignment); + return tmp; +} + +static void drm_sman_mm_free(void *private, void *ref) +{ + struct drm_mm_node *node = (struct drm_mm_node *) ref; + + drm_mm_put_block(node); +} + +static void drm_sman_mm_destroy(void *private) +{ + struct drm_mm *mm = (struct drm_mm *) private; + drm_mm_takedown(mm); + drm_free(mm, sizeof(*mm), DRM_MEM_MM); +} + +static unsigned long drm_sman_mm_offset(void *private, void *ref) +{ + struct drm_mm_node *node = (struct drm_mm_node *) ref; + return node->start; +} + +int +drm_sman_set_range(struct drm_sman * sman, unsigned int manager, + unsigned long start, unsigned long size) +{ + struct drm_sman_mm *sman_mm; + struct drm_mm *mm; + int ret; + + KASSERT(manager < sman->num_managers, ("Invalid manager")); + + sman_mm = &sman->mm[manager]; + mm = malloc(sizeof(*mm), DRM_MEM_MM, M_WAITOK | M_ZERO); + if (!mm) { + return -ENOMEM; + } + sman_mm->private = mm; + ret = drm_mm_init(mm, start, size); + + if (ret) { + drm_free(mm, sizeof(*mm), DRM_MEM_MM); + return ret; + } + + sman_mm->allocate = drm_sman_mm_allocate; + sman_mm->free = drm_sman_mm_free; + sman_mm->destroy = drm_sman_mm_destroy; + sman_mm->offset = drm_sman_mm_offset; + + return 0; +} + +int +drm_sman_set_manager(struct drm_sman * sman, unsigned int manager, + struct drm_sman_mm * allocator) +{ + KASSERT(manager < sman->num_managers, ("Invalid manager")); + sman->mm[manager] = *allocator; + + return 0; +} + +static struct drm_owner_item *drm_sman_get_owner_item(struct drm_sman * sman, + unsigned long owner) +{ + int ret; + struct drm_hash_item *owner_hash_item; + struct drm_owner_item *owner_item; + + ret = drm_ht_find_item(&sman->owner_hash_tab, owner, &owner_hash_item); + if (!ret) { + return drm_hash_entry(owner_hash_item, struct drm_owner_item, + owner_hash); + } + + owner_item = malloc(sizeof(*owner_item), DRM_MEM_MM, M_WAITOK | M_ZERO); + if (!owner_item) + goto out; + + INIT_LIST_HEAD(&owner_item->mem_blocks); + owner_item->owner_hash.key = owner; + DRM_DEBUG("owner_item = %p, mem_blocks = %p\n", owner_item, &owner_item->mem_blocks); + if (drm_ht_insert_item(&sman->owner_hash_tab, &owner_item->owner_hash)) + goto out1; + + list_add_tail(&owner_item->sman_list, &sman->owner_items); + return owner_item; + +out1: + drm_free(owner_item, sizeof(*owner_item), DRM_MEM_MM); +out: + return NULL; +} + +struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int manager, + unsigned long size, unsigned alignment, + unsigned long owner) +{ + void *tmp; + struct drm_sman_mm *sman_mm; + struct drm_owner_item *owner_item; + struct drm_memblock_item *memblock; + + KASSERT(manager < sman->num_managers, ("Invalid manager")); + + sman_mm = &sman->mm[manager]; + tmp = sman_mm->allocate(sman_mm->private, size, alignment); + + if (!tmp) { + return NULL; + } + + memblock = malloc(sizeof(*memblock), DRM_MEM_MM, M_WAITOK | M_ZERO); + DRM_DEBUG("allocated mem_block %p\n", memblock); + if (!memblock) + goto out; + + memblock->mm_info = tmp; + memblock->mm = sman_mm; + memblock->sman = sman; + INIT_LIST_HEAD(&memblock->owner_list); + + if (drm_ht_just_insert_please + (&sman->user_hash_tab, &memblock->user_hash, + (unsigned long)memblock, 32, 0, 0)) + goto out1; + + owner_item = drm_sman_get_owner_item(sman, owner); + if (!owner_item) + goto out2; + + DRM_DEBUG("owner_item = %p, mem_blocks = %p\n", owner_item, &owner_item->mem_blocks); + DRM_DEBUG("owner_list.prev = %p, mem_blocks.prev = %p\n", memblock->owner_list.prev, owner_item->mem_blocks.prev); + DRM_DEBUG("owner_list.next = %p, mem_blocks.next = %p\n", memblock->owner_list.next, owner_item->mem_blocks.next); + list_add_tail(&memblock->owner_list, &owner_item->mem_blocks); + + DRM_DEBUG("Complete\n"); + return memblock; + +out2: + drm_ht_remove_item(&sman->user_hash_tab, &memblock->user_hash); +out1: + drm_free(memblock, sizeof(*memblock), DRM_MEM_MM); +out: + sman_mm->free(sman_mm->private, tmp); + + return NULL; +} + +static void drm_sman_free(struct drm_memblock_item *item) +{ + struct drm_sman *sman = item->sman; + + list_del(&item->owner_list); + drm_ht_remove_item(&sman->user_hash_tab, &item->user_hash); + item->mm->free(item->mm->private, item->mm_info); + drm_free(item, sizeof(*item), DRM_MEM_MM); +} + +int drm_sman_free_key(struct drm_sman *sman, unsigned int key) +{ + struct drm_hash_item *hash_item; + struct drm_memblock_item *memblock_item; + + if (drm_ht_find_item(&sman->user_hash_tab, key, &hash_item)) + return -EINVAL; + + memblock_item = drm_hash_entry(hash_item, struct drm_memblock_item, + user_hash); + drm_sman_free(memblock_item); + return 0; +} + +static void drm_sman_remove_owner(struct drm_sman *sman, + struct drm_owner_item *owner_item) +{ + list_del(&owner_item->sman_list); + drm_ht_remove_item(&sman->owner_hash_tab, &owner_item->owner_hash); + drm_free(owner_item, sizeof(*owner_item), DRM_MEM_MM); +} + +int drm_sman_owner_clean(struct drm_sman *sman, unsigned long owner) +{ + + struct drm_hash_item *hash_item; + struct drm_owner_item *owner_item; + + if (drm_ht_find_item(&sman->owner_hash_tab, owner, &hash_item)) { + return -1; + } + + owner_item = drm_hash_entry(hash_item, struct drm_owner_item, owner_hash); + DRM_DEBUG("cleaning owner_item %p\n", owner_item); + if (owner_item->mem_blocks.next == &owner_item->mem_blocks) { + drm_sman_remove_owner(sman, owner_item); + return -1; + } + + return 0; +} + +static void drm_sman_do_owner_cleanup(struct drm_sman *sman, + struct drm_owner_item *owner_item) +{ + struct drm_memblock_item *entry, *next; + + list_for_each_entry_safe(entry, next, &owner_item->mem_blocks, + owner_list) { + DRM_DEBUG("freeing mem_block %p\n", entry); + drm_sman_free(entry); + } + drm_sman_remove_owner(sman, owner_item); +} + +void drm_sman_owner_cleanup(struct drm_sman *sman, unsigned long owner) +{ + + struct drm_hash_item *hash_item; + struct drm_owner_item *owner_item; + + if (drm_ht_find_item(&sman->owner_hash_tab, owner, &hash_item)) { + + return; + } + + owner_item = drm_hash_entry(hash_item, struct drm_owner_item, owner_hash); + drm_sman_do_owner_cleanup(sman, owner_item); +} + +void drm_sman_cleanup(struct drm_sman *sman) +{ + struct drm_owner_item *entry, *next; + unsigned int i; + struct drm_sman_mm *sman_mm; + + DRM_DEBUG("sman = %p, owner_items = %p\n", + sman, &sman->owner_items); + list_for_each_entry_safe(entry, next, &sman->owner_items, sman_list) { + DRM_DEBUG("cleaning owner_item = %p\n", entry); + drm_sman_do_owner_cleanup(sman, entry); + } + if (sman->mm) { + for (i = 0; i < sman->num_managers; ++i) { + sman_mm = &sman->mm[i]; + if (sman_mm->private) { + sman_mm->destroy(sman_mm->private); + sman_mm->private = NULL; + } + } + } +} diff --git a/sys/dev/drm/drm_sman.h b/sys/dev/drm/drm_sman.h new file mode 100644 index 000000000000..28eb8817b989 --- /dev/null +++ b/sys/dev/drm/drm_sman.h @@ -0,0 +1,181 @@ +/************************************************************************** + * + * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Simple memory MANager interface that keeps track on allocate regions on a + * per "owner" basis. All regions associated with an "owner" can be released + * with a simple call. Typically if the "owner" exists. The owner is any + * "unsigned long" identifier. Can typically be a pointer to a file private + * struct or a context identifier. + * + * Authors: + * Thomas Hellström + */ + +#ifndef DRM_SMAN_H +#define DRM_SMAN_H + +#include "dev/drm/drm_hashtab.h" +#include "dev/drm/drm_linux_list.h" +#include "dev/drm/drm_mm.h" + +/* + * A class that is an abstration of a simple memory allocator. + * The sman implementation provides a default such allocator + * using the drm_mm.c implementation. But the user can replace it. + * See the SiS implementation, which may use the SiS FB kernel module + * for memory management. + */ + +struct drm_sman_mm { + /* private info. If allocated, needs to be destroyed by the destroy + function */ + void *private; + + /* Allocate a memory block with given size and alignment. + Return an opaque reference to the memory block */ + + void *(*allocate) (void *private, unsigned long size, + unsigned alignment); + + /* Free a memory block. "ref" is the opaque reference that we got from + the "alloc" function */ + + void (*free) (void *private, void *ref); + + /* Free all resources associated with this allocator */ + + void (*destroy) (void *private); + + /* Return a memory offset from the opaque reference returned from the + "alloc" function */ + + unsigned long (*offset) (void *private, void *ref); +}; + +struct drm_memblock_item { + struct list_head owner_list; + struct drm_hash_item user_hash; + void *mm_info; + struct drm_sman_mm *mm; + struct drm_sman *sman; +}; + +struct drm_sman { + struct drm_sman_mm *mm; + int num_managers; + struct drm_open_hash owner_hash_tab; + struct drm_open_hash user_hash_tab; + struct list_head owner_items; +}; + +/* + * Take down a memory manager. This function should only be called after a + * successful init and after a call to drm_sman_cleanup. + */ + +extern void drm_sman_takedown(struct drm_sman * sman); + +/* + * Allocate structures for a manager. + * num_managers are the number of memory pools to manage. (VRAM, AGP, ....) + * user_order is the log2 of the number of buckets in the user hash table. + * set this to approximately log2 of the max number of memory regions + * that will be allocated for _all_ pools together. + * owner_order is the log2 of the number of buckets in the owner hash table. + * set this to approximately log2 of + * the number of client file connections that will + * be using the manager. + * + */ + +extern int drm_sman_init(struct drm_sman * sman, unsigned int num_managers, + unsigned int user_order, unsigned int owner_order); + +/* + * Initialize a drm_mm.c allocator. Should be called only once for each + * manager unless a customized allogator is used. + */ + +extern int drm_sman_set_range(struct drm_sman * sman, unsigned int manager, + unsigned long start, unsigned long size); + +/* + * Initialize a customized allocator for one of the managers. + * (See the SiS module). The object pointed to by "allocator" is copied, + * so it can be destroyed after this call. + */ + +extern int drm_sman_set_manager(struct drm_sman * sman, unsigned int mananger, + struct drm_sman_mm * allocator); + +/* + * Allocate a memory block. Aligment is not implemented yet. + */ + +extern struct drm_memblock_item *drm_sman_alloc(struct drm_sman * sman, + unsigned int manager, + unsigned long size, + unsigned alignment, + unsigned long owner); +/* + * Free a memory block identified by its user hash key. + */ + +extern int drm_sman_free_key(struct drm_sman * sman, unsigned int key); + +/* + * returns 1 iff there are no stale memory blocks associated with this owner. + * Typically called to determine if we need to idle the hardware and call + * drm_sman_owner_cleanup. If there are no stale memory blocks, it removes all + * resources associated with owner. + */ + +extern int drm_sman_owner_clean(struct drm_sman * sman, unsigned long owner); + +/* + * Frees all stale memory blocks associated with this owner. Note that this + * requires that the hardware is finished with all blocks, so the graphics engine + * should be idled before this call is made. This function also frees + * any resources associated with "owner" and should be called when owner + * is not going to be referenced anymore. + */ + +extern void drm_sman_owner_cleanup(struct drm_sman * sman, unsigned long owner); + +/* + * Frees all stale memory blocks associated with the memory manager. + * See idling above. + */ + +extern void drm_sman_cleanup(struct drm_sman * sman); + +#endif diff --git a/sys/dev/drm/drm_vm.c b/sys/dev/drm/drm_vm.c index 7d5cd8d9963d..8f260fd9b102 100644 --- a/sys/dev/drm/drm_vm.c +++ b/sys/dev/drm/drm_vm.c @@ -31,8 +31,8 @@ __FBSDID("$FreeBSD$"); #include "dev/drm/drmP.h" #include "dev/drm/drm.h" -int drm_mmap(struct cdev *kdev, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +int drm_mmap(struct cdev *kdev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { struct drm_device *dev = drm_get_device_from_kdev(kdev); struct drm_file *file_priv = NULL; diff --git a/sys/dev/drm/i915_drv.c b/sys/dev/drm/i915_drv.c index b84e0183e2a8..8638df14bd32 100644 --- a/sys/dev/drm/i915_drv.c +++ b/sys/dev/drm/i915_drv.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include "dev/drm/drmP.h" #include "dev/drm/drm.h" +#include "dev/drm/drm_mm.h" #include "dev/drm/i915_drm.h" #include "dev/drm/i915_drv.h" #include "dev/drm/drm_pciids.h" diff --git a/sys/dev/drm/i915_drv.h b/sys/dev/drm/i915_drv.h index ac754139d352..f52ab50e47fe 100644 --- a/sys/dev/drm/i915_drv.h +++ b/sys/dev/drm/i915_drv.h @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #ifndef _I915_DRV_H_ #define _I915_DRV_H_ +#include "dev/drm/drm_mm.h" #include "dev/drm/i915_reg.h" /* General customization: @@ -236,9 +237,8 @@ typedef struct drm_i915_private { u8 saveCR[37]; struct { -#ifdef __linux__ struct drm_mm gtt_space; -#endif + /** * List of objects currently involved in rendering from the * ringbuffer. @@ -644,7 +644,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); (dev)->pci_device == 0x2A42 || \ (dev)->pci_device == 0x2E02 || \ (dev)->pci_device == 0x2E12 || \ - (dev)->pci_device == 0x2E22) + (dev)->pci_device == 0x2E22 || \ + (dev)->pci_device == 0x2E32) #define IS_I965GM(dev) ((dev)->pci_device == 0x2A02) @@ -653,6 +654,7 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); #define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \ (dev)->pci_device == 0x2E12 || \ (dev)->pci_device == 0x2E22 || \ + (dev)->pci_device == 0x2E32 || \ IS_GM45(dev)) #define IS_G33(dev) ((dev)->pci_device == 0x29C2 || \ diff --git a/sys/dev/drm/mach64_state.c b/sys/dev/drm/mach64_state.c index d59d55e7dd67..16848c23ac14 100644 --- a/sys/dev/drm/mach64_state.c +++ b/sys/dev/drm/mach64_state.c @@ -826,7 +826,7 @@ int mach64_dma_vertex(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_mach64_private_t *dev_priv = dev->dev_private; - drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_mach64_sarea_t *sarea_priv; drm_mach64_vertex_t *vertex = data; LOCK_TEST_WITH_RETURN(dev, file_priv); @@ -835,6 +835,7 @@ int mach64_dma_vertex(struct drm_device *dev, void *data, DRM_ERROR("called with no initialization\n"); return -EINVAL; } + sarea_priv = dev_priv->sarea_priv; DRM_DEBUG("pid=%d buf=%p used=%lu discard=%d\n", DRM_CURRENTPID, diff --git a/sys/dev/drm/r600_blit.c b/sys/dev/drm/r600_blit.c index 91690d24ccb1..a26f2c445b97 100644 --- a/sys/dev/drm/r600_blit.c +++ b/sys/dev/drm/r600_blit.c @@ -1367,7 +1367,7 @@ set_vtx_resource(drm_radeon_private_t *dev_priv, u64 gpu_addr) if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) || - /*((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880) ||*/ + ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880) || ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV710)) cp_set_surface_sync(dev_priv, R600_TC_ACTION_ENA, 48, gpu_addr); @@ -1509,7 +1509,7 @@ set_default_state(drm_radeon_private_t *dev_priv) case CHIP_RV610: case CHIP_RV620: case CHIP_RS780: - /*case CHIP_RS880:*/ + case CHIP_RS880: default: num_ps_gprs = 84; num_vs_gprs = 36; @@ -1591,7 +1591,7 @@ set_default_state(drm_radeon_private_t *dev_priv) if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) || ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) || ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) || - /*((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880) ||*/ + ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880) || ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV710)) sq_config = 0; else @@ -1719,7 +1719,10 @@ r600_blit_copy(struct drm_device *dev, u32 *vb; vb = (u32 *) ((char *)dev->agp_buffer_map->handle + - dev_priv->blit_vb->offset + dev_priv->blit_vb->used); + dev_priv->blit_vb->offset + dev_priv->blit_vb->used); + DRM_DEBUG("src=0x%016llx, dst=0x%016llx, size=%d\n", + (unsigned long long)src_gpu_addr, + (unsigned long long)dst_gpu_addr, size_bytes); if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { max_bytes = 8192; @@ -1757,7 +1760,7 @@ r600_blit_copy(struct drm_device *dev, return; set_shaders(dev); vb = (u32 *) ((char *)dev->agp_buffer_map->handle + - dev_priv->blit_vb->offset + dev_priv->blit_vb->used); + dev_priv->blit_vb->offset + dev_priv->blit_vb->used); } vb[0] = i2f(dst_x); @@ -1847,7 +1850,7 @@ r600_blit_copy(struct drm_device *dev, return; set_shaders(dev); vb = (u32 *) ((char *)dev->agp_buffer_map->handle + - dev_priv->blit_vb->offset + dev_priv->blit_vb->used); + dev_priv->blit_vb->offset + dev_priv->blit_vb->used); } vb[0] = i2f(dst_x / 4); @@ -1876,7 +1879,7 @@ r600_blit_copy(struct drm_device *dev, /* dst */ set_render_target(dev_priv, COLOR_8_8_8_8, - dst_x + cur_size, h, + (dst_x + cur_size) / 4, h, dst_gpu_addr); /* scissors */ @@ -1913,12 +1916,10 @@ r600_blit_swap(struct drm_device *dev, { drm_radeon_private_t *dev_priv = dev->dev_private; int cb_format, tex_format; + int sx2, sy2, dx2, dy2; u64 vb_addr; u32 *vb; - vb = (u32 *) ((char *)dev->agp_buffer_map->handle + - dev_priv->blit_vb->offset + dev_priv->blit_vb->used); - if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) { dev_priv->blit_vb->used = 0; radeon_cp_discard_buffer(dev, dev_priv->blit_vb); @@ -1926,20 +1927,14 @@ r600_blit_swap(struct drm_device *dev, if (!dev_priv->blit_vb) return; set_shaders(dev); - vb = (u32 *) ((char *)dev->agp_buffer_map->handle + - dev_priv->blit_vb->offset + dev_priv->blit_vb->used); } + vb = (u32 *) ((char *)dev->agp_buffer_map->handle + + dev_priv->blit_vb->offset + dev_priv->blit_vb->used); - if (cpp == 4) { - cb_format = COLOR_8_8_8_8; - tex_format = FMT_8_8_8_8; - } else if (cpp == 2) { - cb_format = COLOR_5_6_5; - tex_format = FMT_5_6_5; - } else { - cb_format = COLOR_8; - tex_format = FMT_8; - } + sx2 = sx + w; + sy2 = sy + h; + dx2 = dx + w; + dy2 = dy + h; vb[0] = i2f(dx); vb[1] = i2f(dy); @@ -1947,31 +1942,46 @@ r600_blit_swap(struct drm_device *dev, vb[3] = i2f(sy); vb[4] = i2f(dx); - vb[5] = i2f(dy + h); + vb[5] = i2f(dy2); vb[6] = i2f(sx); - vb[7] = i2f(sy + h); + vb[7] = i2f(sy2); - vb[8] = i2f(dx + w); - vb[9] = i2f(dy + h); - vb[10] = i2f(sx + w); - vb[11] = i2f(sy + h); + vb[8] = i2f(dx2); + vb[9] = i2f(dy2); + vb[10] = i2f(sx2); + vb[11] = i2f(sy2); + + switch(cpp) { + case 4: + cb_format = COLOR_8_8_8_8; + tex_format = FMT_8_8_8_8; + break; + case 2: + cb_format = COLOR_5_6_5; + tex_format = FMT_5_6_5; + break; + default: + cb_format = COLOR_8; + tex_format = FMT_8; + break; + } /* src */ set_tex_resource(dev_priv, tex_format, src_pitch / cpp, - sy + h, src_pitch / cpp, + sy2, src_pitch / cpp, src_gpu_addr); cp_set_surface_sync(dev_priv, - R600_TC_ACTION_ENA, (src_pitch * (sy + h)), src_gpu_addr); + R600_TC_ACTION_ENA, src_pitch * sy2, src_gpu_addr); /* dst */ set_render_target(dev_priv, cb_format, - dst_pitch / cpp, dy + h, + dst_pitch / cpp, dy2, dst_gpu_addr); /* scissors */ - set_scissors(dev_priv, dx, dy, dx + w, dy + h); + set_scissors(dev_priv, dx, dy, dx2, dy2); /* Vertex buffer setup */ vb_addr = dev_priv->gart_buffers_offset + @@ -1984,7 +1994,7 @@ r600_blit_swap(struct drm_device *dev, cp_set_surface_sync(dev_priv, R600_CB_ACTION_ENA | R600_CB0_DEST_BASE_ENA, - dst_pitch * (dy + h), dst_gpu_addr); + dst_pitch * dy2, dst_gpu_addr); dev_priv->blit_vb->used += 12 * 4; } diff --git a/sys/dev/drm/radeon_cp.c b/sys/dev/drm/radeon_cp.c index 734fafa445fb..2e85f115a6d4 100644 --- a/sys/dev/drm/radeon_cp.c +++ b/sys/dev/drm/radeon_cp.c @@ -1860,8 +1860,8 @@ struct drm_buf *radeon_freelist_get(struct drm_device * dev) for (t = 0; t < dev_priv->usec_timeout; t++) { u32 done_age = GET_SCRATCH(dev_priv, 1); DRM_DEBUG("done_age = %d\n", done_age); - for (i = start; i < dma->buf_count; i++) { - buf = dma->buflist[i]; + for (i = 0; i < dma->buf_count; i++) { + buf = dma->buflist[start]; buf_priv = buf->dev_private; if (buf->file_priv == NULL || (buf->pending && buf_priv->age <= @@ -1870,7 +1870,8 @@ struct drm_buf *radeon_freelist_get(struct drm_device * dev) buf->pending = 0; return buf; } - start = 0; + if (++start >= dma->buf_count) + start = 0; } if (t) { @@ -1879,47 +1880,9 @@ struct drm_buf *radeon_freelist_get(struct drm_device * dev) } } - DRM_DEBUG("returning NULL!\n"); return NULL; } -#if 0 -struct drm_buf *radeon_freelist_get(struct drm_device * dev) -{ - struct drm_device_dma *dma = dev->dma; - drm_radeon_private_t *dev_priv = dev->dev_private; - drm_radeon_buf_priv_t *buf_priv; - struct drm_buf *buf; - int i, t; - int start; - u32 done_age; - - done_age = radeon_read_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1)); - if (++dev_priv->last_buf >= dma->buf_count) - dev_priv->last_buf = 0; - - start = dev_priv->last_buf; - dev_priv->stats.freelist_loops++; - - for (t = 0; t < 2; t++) { - for (i = start; i < dma->buf_count; i++) { - buf = dma->buflist[i]; - buf_priv = buf->dev_private; - if (buf->file_priv == 0 || (buf->pending && - buf_priv->age <= - done_age)) { - dev_priv->stats.requested_bufs++; - buf->pending = 0; - return buf; - } - } - start = 0; - } - - return NULL; -} -#endif - void radeon_freelist_reset(struct drm_device * dev) { struct drm_device_dma *dma = dev->dma; diff --git a/sys/dev/drm/radeon_cs.c b/sys/dev/drm/radeon_cs.c index 4fc6e7ea22a2..b523126b9475 100644 --- a/sys/dev/drm/radeon_cs.c +++ b/sys/dev/drm/radeon_cs.c @@ -403,8 +403,8 @@ static inline int r600_cs_packet3(struct drm_radeon_cs_parser *parser, uint32_t DRM_ERROR("bad DRAW_INDEX\n"); break; } - ib_chunk->kdata[offset_dw + 1] = (offset & 0xffffffff); - ib_chunk->kdata[offset_dw + 2] = (upper_32_bits(offset) & 0xff); + ib_chunk->kdata[offset_dw + 1] += (offset & 0xffffffff); + ib_chunk->kdata[offset_dw + 2] += (upper_32_bits(offset) & 0xff); break; case R600_IT_DRAW_INDEX_AUTO: //DRM_INFO("R600_IT_DRAW_INDEX_AUTO\n"); @@ -433,8 +433,8 @@ static inline int r600_cs_packet3(struct drm_radeon_cs_parser *parser, uint32_t DRM_ERROR("bad WAIT_REG_MEM\n"); break; } - ib_chunk->kdata[offset_dw + 2] = (offset & 0xffffffff); - ib_chunk->kdata[offset_dw + 3] = (upper_32_bits(offset) & 0xff); + ib_chunk->kdata[offset_dw + 2] += (offset & 0xffffffff); + ib_chunk->kdata[offset_dw + 3] += (upper_32_bits(offset) & 0xff); } if (ret) DRM_ERROR("bad WAIT_REG_MEM\n"); @@ -469,7 +469,7 @@ static inline int r600_cs_packet3(struct drm_radeon_cs_parser *parser, uint32_t break; } ib_chunk->kdata[offset_dw + 2] += (offset & 0xffffffff); - ib_chunk->kdata[offset_dw + 3] |= (upper_32_bits(offset) & 0xff); + ib_chunk->kdata[offset_dw + 3] += (upper_32_bits(offset) & 0xff); } if (ret) DRM_ERROR("bad EVENT_WRITE\n"); @@ -488,7 +488,7 @@ static inline int r600_cs_packet3(struct drm_radeon_cs_parser *parser, uint32_t break; } ib_chunk->kdata[offset_dw + 2] += (offset & 0xffffffff); - ib_chunk->kdata[offset_dw + 3] |= (upper_32_bits(offset) & 0xff); + ib_chunk->kdata[offset_dw + 3] += (upper_32_bits(offset) & 0xff); break; case R600_IT_SET_CONFIG_REG: //DRM_INFO("R600_IT_SET_CONFIG_REG\n"); @@ -628,7 +628,7 @@ static inline int r600_cs_packet3(struct drm_radeon_cs_parser *parser, uint32_t if (ret) break; ib_chunk->kdata[offset_dw + (i * 7) + 0 + 2] += (offset & 0xffffffff); - ib_chunk->kdata[offset_dw + (i * 7) + 2 + 2] |= (upper_32_bits(offset) & 0xff); + ib_chunk->kdata[offset_dw + (i * 7) + 2 + 2] += (upper_32_bits(offset) & 0xff); break; } if (ret) diff --git a/sys/dev/drm/radeon_drv.h b/sys/dev/drm/radeon_drv.h index a1cd48bc20d3..d90d7cf048d6 100644 --- a/sys/dev/drm/radeon_drv.h +++ b/sys/dev/drm/radeon_drv.h @@ -143,15 +143,15 @@ enum radeon_family { CHIP_R600, CHIP_RV610, CHIP_RV630, + CHIP_RV670, CHIP_RV620, CHIP_RV635, - CHIP_RV670, CHIP_RS780, CHIP_RS880, CHIP_RV770, - CHIP_RV740, CHIP_RV730, CHIP_RV710, + CHIP_RV740, CHIP_LAST, }; diff --git a/sys/dev/drm/radeon_irq.c b/sys/dev/drm/radeon_irq.c index 7f6057396798..20b1e6de444c 100644 --- a/sys/dev/drm/radeon_irq.c +++ b/sys/dev/drm/radeon_irq.c @@ -194,6 +194,9 @@ irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS) u32 r500_disp_int; u32 tmp; + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) + return IRQ_NONE; + /* Only consider the bits we're interested in - others could be used * outside the DRM */ @@ -323,6 +326,9 @@ int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_pr drm_radeon_irq_emit_t *emit = data; int result; + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) + return -EINVAL; + LOCK_TEST_WITH_RETURN(dev, file_priv); if (!dev_priv) { @@ -363,6 +369,9 @@ void radeon_driver_irq_preinstall(struct drm_device * dev) (drm_radeon_private_t *) dev->dev_private; u32 dummy; + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) + return; + /* Disable *all* interrupts */ if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) RADEON_WRITE(R500_DxMODE_INT_MASK, 0); @@ -380,6 +389,9 @@ int radeon_driver_irq_postinstall(struct drm_device * dev) atomic_set(&dev_priv->swi_emitted, 0); DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) + return 0; + radeon_irq_set_state(dev, RADEON_SW_INT_ENABLE, 1); return 0; @@ -394,6 +406,9 @@ void radeon_driver_irq_uninstall(struct drm_device * dev) dev_priv->irq_enabled = 0; + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) + return; + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) RADEON_WRITE(R500_DxMODE_INT_MASK, 0); /* Disable *all* interrupts */ diff --git a/sys/dev/drm/radeon_state.c b/sys/dev/drm/radeon_state.c index e032b8f811ed..fd8388ffa599 100644 --- a/sys/dev/drm/radeon_state.c +++ b/sys/dev/drm/radeon_state.c @@ -3024,7 +3024,10 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil value = GET_SCRATCH(dev_priv, 2); break; case RADEON_PARAM_IRQ_NR: - value = dev->irq; + if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) + value = 0; + else + value = dev->irq; break; case RADEON_PARAM_GART_BASE: value = dev_priv->gart_vm_start; diff --git a/sys/dev/drm/via_3d_reg.h b/sys/dev/drm/via_3d_reg.h new file mode 100644 index 000000000000..7a5b3b6e5ba4 --- /dev/null +++ b/sys/dev/drm/via_3d_reg.h @@ -0,0 +1,1653 @@ +/*- + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef VIA_3D_REG_H +#define VIA_3D_REG_H +#define HC_REG_BASE 0x0400 + +#define HC_REG_TRANS_SPACE 0x0040 + +#define HC_ParaN_MASK 0xffffffff +#define HC_Para_MASK 0x00ffffff +#define HC_SubA_MASK 0xff000000 +#define HC_SubA_SHIFT 24 +/* Transmission Setting + */ +#define HC_REG_TRANS_SET 0x003c +#define HC_ParaSubType_MASK 0xff000000 +#define HC_ParaType_MASK 0x00ff0000 +#define HC_ParaOS_MASK 0x0000ff00 +#define HC_ParaAdr_MASK 0x000000ff +#define HC_ParaSubType_SHIFT 24 +#define HC_ParaType_SHIFT 16 +#define HC_ParaOS_SHIFT 8 +#define HC_ParaAdr_SHIFT 0 + +#define HC_ParaType_CmdVdata 0x0000 +#define HC_ParaType_NotTex 0x0001 +#define HC_ParaType_Tex 0x0002 +#define HC_ParaType_Palette 0x0003 +#define HC_ParaType_PreCR 0x0010 +#define HC_ParaType_Auto 0x00fe + +/* Transmission Space + */ +#define HC_REG_Hpara0 0x0040 +#define HC_REG_HpataAF 0x02fc + +/* Read + */ +#define HC_REG_HREngSt 0x0000 +#define HC_REG_HRFIFOempty 0x0004 +#define HC_REG_HRFIFOfull 0x0008 +#define HC_REG_HRErr 0x000c +#define HC_REG_FIFOstatus 0x0010 +/* HC_REG_HREngSt 0x0000 + */ +#define HC_HDASZC_MASK 0x00010000 +#define HC_HSGEMI_MASK 0x0000f000 +#define HC_HLGEMISt_MASK 0x00000f00 +#define HC_HCRSt_MASK 0x00000080 +#define HC_HSE0St_MASK 0x00000040 +#define HC_HSE1St_MASK 0x00000020 +#define HC_HPESt_MASK 0x00000010 +#define HC_HXESt_MASK 0x00000008 +#define HC_HBESt_MASK 0x00000004 +#define HC_HE2St_MASK 0x00000002 +#define HC_HE3St_MASK 0x00000001 +/* HC_REG_HRFIFOempty 0x0004 + */ +#define HC_HRZDempty_MASK 0x00000010 +#define HC_HRTXAempty_MASK 0x00000008 +#define HC_HRTXDempty_MASK 0x00000004 +#define HC_HWZDempty_MASK 0x00000002 +#define HC_HWCDempty_MASK 0x00000001 +/* HC_REG_HRFIFOfull 0x0008 + */ +#define HC_HRZDfull_MASK 0x00000010 +#define HC_HRTXAfull_MASK 0x00000008 +#define HC_HRTXDfull_MASK 0x00000004 +#define HC_HWZDfull_MASK 0x00000002 +#define HC_HWCDfull_MASK 0x00000001 +/* HC_REG_HRErr 0x000c + */ +#define HC_HAGPCMErr_MASK 0x80000000 +#define HC_HAGPCMErrC_MASK 0x70000000 +/* HC_REG_FIFOstatus 0x0010 + */ +#define HC_HRFIFOATall_MASK 0x80000000 +#define HC_HRFIFOATbusy_MASK 0x40000000 +#define HC_HRATFGMDo_MASK 0x00000100 +#define HC_HRATFGMDi_MASK 0x00000080 +#define HC_HRATFRZD_MASK 0x00000040 +#define HC_HRATFRTXA_MASK 0x00000020 +#define HC_HRATFRTXD_MASK 0x00000010 +#define HC_HRATFWZD_MASK 0x00000008 +#define HC_HRATFWCD_MASK 0x00000004 +#define HC_HRATTXTAG_MASK 0x00000002 +#define HC_HRATTXCH_MASK 0x00000001 + +/* AGP Command Setting + */ +#define HC_SubA_HAGPBstL 0x0060 +#define HC_SubA_HAGPBendL 0x0061 +#define HC_SubA_HAGPCMNT 0x0062 +#define HC_SubA_HAGPBpL 0x0063 +#define HC_SubA_HAGPBpH 0x0064 +/* HC_SubA_HAGPCMNT 0x0062 + */ +#define HC_HAGPCMNT_MASK 0x00800000 +#define HC_HCmdErrClr_MASK 0x00400000 +#define HC_HAGPBendH_MASK 0x0000ff00 +#define HC_HAGPBstH_MASK 0x000000ff +#define HC_HAGPBendH_SHIFT 8 +#define HC_HAGPBstH_SHIFT 0 +/* HC_SubA_HAGPBpL 0x0063 + */ +#define HC_HAGPBpL_MASK 0x00fffffc +#define HC_HAGPBpID_MASK 0x00000003 +#define HC_HAGPBpID_PAUSE 0x00000000 +#define HC_HAGPBpID_JUMP 0x00000001 +#define HC_HAGPBpID_STOP 0x00000002 +/* HC_SubA_HAGPBpH 0x0064 + */ +#define HC_HAGPBpH_MASK 0x00ffffff + +/* Miscellaneous Settings + */ +#define HC_SubA_HClipTB 0x0070 +#define HC_SubA_HClipLR 0x0071 +#define HC_SubA_HFPClipTL 0x0072 +#define HC_SubA_HFPClipBL 0x0073 +#define HC_SubA_HFPClipLL 0x0074 +#define HC_SubA_HFPClipRL 0x0075 +#define HC_SubA_HFPClipTBH 0x0076 +#define HC_SubA_HFPClipLRH 0x0077 +#define HC_SubA_HLP 0x0078 +#define HC_SubA_HLPRF 0x0079 +#define HC_SubA_HSolidCL 0x007a +#define HC_SubA_HPixGC 0x007b +#define HC_SubA_HSPXYOS 0x007c +#define HC_SubA_HVertexCNT 0x007d + +#define HC_HClipT_MASK 0x00fff000 +#define HC_HClipT_SHIFT 12 +#define HC_HClipB_MASK 0x00000fff +#define HC_HClipB_SHIFT 0 +#define HC_HClipL_MASK 0x00fff000 +#define HC_HClipL_SHIFT 12 +#define HC_HClipR_MASK 0x00000fff +#define HC_HClipR_SHIFT 0 +#define HC_HFPClipBH_MASK 0x0000ff00 +#define HC_HFPClipBH_SHIFT 8 +#define HC_HFPClipTH_MASK 0x000000ff +#define HC_HFPClipTH_SHIFT 0 +#define HC_HFPClipRH_MASK 0x0000ff00 +#define HC_HFPClipRH_SHIFT 8 +#define HC_HFPClipLH_MASK 0x000000ff +#define HC_HFPClipLH_SHIFT 0 +#define HC_HSolidCH_MASK 0x000000ff +#define HC_HPixGC_MASK 0x00800000 +#define HC_HSPXOS_MASK 0x00fff000 +#define HC_HSPXOS_SHIFT 12 +#define HC_HSPYOS_MASK 0x00000fff + +/* Command + * Command A + */ +#define HC_HCmdHeader_MASK 0xfe000000 /*0xffe00000 */ +#define HC_HE3Fire_MASK 0x00100000 +#define HC_HPMType_MASK 0x000f0000 +#define HC_HEFlag_MASK 0x0000e000 +#define HC_HShading_MASK 0x00001c00 +#define HC_HPMValidN_MASK 0x00000200 +#define HC_HPLEND_MASK 0x00000100 +#define HC_HVCycle_MASK 0x000000ff +#define HC_HVCycle_Style_MASK 0x000000c0 +#define HC_HVCycle_ChgA_MASK 0x00000030 +#define HC_HVCycle_ChgB_MASK 0x0000000c +#define HC_HVCycle_ChgC_MASK 0x00000003 +#define HC_HPMType_Point 0x00000000 +#define HC_HPMType_Line 0x00010000 +#define HC_HPMType_Tri 0x00020000 +#define HC_HPMType_TriWF 0x00040000 +#define HC_HEFlag_NoAA 0x00000000 +#define HC_HEFlag_ab 0x00008000 +#define HC_HEFlag_bc 0x00004000 +#define HC_HEFlag_ca 0x00002000 +#define HC_HShading_Solid 0x00000000 +#define HC_HShading_FlatA 0x00000400 +#define HC_HShading_FlatB 0x00000800 +#define HC_HShading_FlatC 0x00000c00 +#define HC_HShading_Gouraud 0x00001000 +#define HC_HVCycle_Full 0x00000000 +#define HC_HVCycle_AFP 0x00000040 +#define HC_HVCycle_One 0x000000c0 +#define HC_HVCycle_NewA 0x00000000 +#define HC_HVCycle_AA 0x00000010 +#define HC_HVCycle_AB 0x00000020 +#define HC_HVCycle_AC 0x00000030 +#define HC_HVCycle_NewB 0x00000000 +#define HC_HVCycle_BA 0x00000004 +#define HC_HVCycle_BB 0x00000008 +#define HC_HVCycle_BC 0x0000000c +#define HC_HVCycle_NewC 0x00000000 +#define HC_HVCycle_CA 0x00000001 +#define HC_HVCycle_CB 0x00000002 +#define HC_HVCycle_CC 0x00000003 + +/* Command B + */ +#define HC_HLPrst_MASK 0x00010000 +#define HC_HLLastP_MASK 0x00008000 +#define HC_HVPMSK_MASK 0x00007f80 +#define HC_HBFace_MASK 0x00000040 +#define HC_H2nd1VT_MASK 0x0000003f +#define HC_HVPMSK_X 0x00004000 +#define HC_HVPMSK_Y 0x00002000 +#define HC_HVPMSK_Z 0x00001000 +#define HC_HVPMSK_W 0x00000800 +#define HC_HVPMSK_Cd 0x00000400 +#define HC_HVPMSK_Cs 0x00000200 +#define HC_HVPMSK_S 0x00000100 +#define HC_HVPMSK_T 0x00000080 + +/* Enable Setting + */ +#define HC_SubA_HEnable 0x0000 +#define HC_HenTXEnvMap_MASK 0x00200000 +#define HC_HenVertexCNT_MASK 0x00100000 +#define HC_HenCPUDAZ_MASK 0x00080000 +#define HC_HenDASZWC_MASK 0x00040000 +#define HC_HenFBCull_MASK 0x00020000 +#define HC_HenCW_MASK 0x00010000 +#define HC_HenAA_MASK 0x00008000 +#define HC_HenST_MASK 0x00004000 +#define HC_HenZT_MASK 0x00002000 +#define HC_HenZW_MASK 0x00001000 +#define HC_HenAT_MASK 0x00000800 +#define HC_HenAW_MASK 0x00000400 +#define HC_HenSP_MASK 0x00000200 +#define HC_HenLP_MASK 0x00000100 +#define HC_HenTXCH_MASK 0x00000080 +#define HC_HenTXMP_MASK 0x00000040 +#define HC_HenTXPP_MASK 0x00000020 +#define HC_HenTXTR_MASK 0x00000010 +#define HC_HenCS_MASK 0x00000008 +#define HC_HenFOG_MASK 0x00000004 +#define HC_HenABL_MASK 0x00000002 +#define HC_HenDT_MASK 0x00000001 + +/* Z Setting + */ +#define HC_SubA_HZWBBasL 0x0010 +#define HC_SubA_HZWBBasH 0x0011 +#define HC_SubA_HZWBType 0x0012 +#define HC_SubA_HZBiasL 0x0013 +#define HC_SubA_HZWBend 0x0014 +#define HC_SubA_HZWTMD 0x0015 +#define HC_SubA_HZWCDL 0x0016 +#define HC_SubA_HZWCTAGnum 0x0017 +#define HC_SubA_HZCYNum 0x0018 +#define HC_SubA_HZWCFire 0x0019 +/* HC_SubA_HZWBType + */ +#define HC_HZWBType_MASK 0x00800000 +#define HC_HZBiasedWB_MASK 0x00400000 +#define HC_HZONEasFF_MASK 0x00200000 +#define HC_HZOONEasFF_MASK 0x00100000 +#define HC_HZWBFM_MASK 0x00030000 +#define HC_HZWBLoc_MASK 0x0000c000 +#define HC_HZWBPit_MASK 0x00003fff +#define HC_HZWBFM_16 0x00000000 +#define HC_HZWBFM_32 0x00020000 +#define HC_HZWBFM_24 0x00030000 +#define HC_HZWBLoc_Local 0x00000000 +#define HC_HZWBLoc_SyS 0x00004000 +/* HC_SubA_HZWBend + */ +#define HC_HZWBend_MASK 0x00ffe000 +#define HC_HZBiasH_MASK 0x000000ff +#define HC_HZWBend_SHIFT 10 +/* HC_SubA_HZWTMD + */ +#define HC_HZWTMD_MASK 0x00070000 +#define HC_HEBEBias_MASK 0x00007f00 +#define HC_HZNF_MASK 0x000000ff +#define HC_HZWTMD_NeverPass 0x00000000 +#define HC_HZWTMD_LT 0x00010000 +#define HC_HZWTMD_EQ 0x00020000 +#define HC_HZWTMD_LE 0x00030000 +#define HC_HZWTMD_GT 0x00040000 +#define HC_HZWTMD_NE 0x00050000 +#define HC_HZWTMD_GE 0x00060000 +#define HC_HZWTMD_AllPass 0x00070000 +#define HC_HEBEBias_SHIFT 8 +/* HC_SubA_HZWCDL 0x0016 + */ +#define HC_HZWCDL_MASK 0x00ffffff +/* HC_SubA_HZWCTAGnum 0x0017 + */ +#define HC_HZWCTAGnum_MASK 0x00ff0000 +#define HC_HZWCTAGnum_SHIFT 16 +#define HC_HZWCDH_MASK 0x000000ff +#define HC_HZWCDH_SHIFT 0 +/* HC_SubA_HZCYNum 0x0018 + */ +#define HC_HZCYNum_MASK 0x00030000 +#define HC_HZCYNum_SHIFT 16 +#define HC_HZWCQWnum_MASK 0x00003fff +#define HC_HZWCQWnum_SHIFT 0 +/* HC_SubA_HZWCFire 0x0019 + */ +#define HC_ZWCFire_MASK 0x00010000 +#define HC_HZWCQWnumLast_MASK 0x00003fff +#define HC_HZWCQWnumLast_SHIFT 0 + +/* Stencil Setting + */ +#define HC_SubA_HSTREF 0x0023 +#define HC_SubA_HSTMD 0x0024 +/* HC_SubA_HSBFM + */ +#define HC_HSBFM_MASK 0x00030000 +#define HC_HSBLoc_MASK 0x0000c000 +#define HC_HSBPit_MASK 0x00003fff +/* HC_SubA_HSTREF + */ +#define HC_HSTREF_MASK 0x00ff0000 +#define HC_HSTOPMSK_MASK 0x0000ff00 +#define HC_HSTBMSK_MASK 0x000000ff +#define HC_HSTREF_SHIFT 16 +#define HC_HSTOPMSK_SHIFT 8 +/* HC_SubA_HSTMD + */ +#define HC_HSTMD_MASK 0x00070000 +#define HC_HSTOPSF_MASK 0x000001c0 +#define HC_HSTOPSPZF_MASK 0x00000038 +#define HC_HSTOPSPZP_MASK 0x00000007 +#define HC_HSTMD_NeverPass 0x00000000 +#define HC_HSTMD_LT 0x00010000 +#define HC_HSTMD_EQ 0x00020000 +#define HC_HSTMD_LE 0x00030000 +#define HC_HSTMD_GT 0x00040000 +#define HC_HSTMD_NE 0x00050000 +#define HC_HSTMD_GE 0x00060000 +#define HC_HSTMD_AllPass 0x00070000 +#define HC_HSTOPSF_KEEP 0x00000000 +#define HC_HSTOPSF_ZERO 0x00000040 +#define HC_HSTOPSF_REPLACE 0x00000080 +#define HC_HSTOPSF_INCRSAT 0x000000c0 +#define HC_HSTOPSF_DECRSAT 0x00000100 +#define HC_HSTOPSF_INVERT 0x00000140 +#define HC_HSTOPSF_INCR 0x00000180 +#define HC_HSTOPSF_DECR 0x000001c0 +#define HC_HSTOPSPZF_KEEP 0x00000000 +#define HC_HSTOPSPZF_ZERO 0x00000008 +#define HC_HSTOPSPZF_REPLACE 0x00000010 +#define HC_HSTOPSPZF_INCRSAT 0x00000018 +#define HC_HSTOPSPZF_DECRSAT 0x00000020 +#define HC_HSTOPSPZF_INVERT 0x00000028 +#define HC_HSTOPSPZF_INCR 0x00000030 +#define HC_HSTOPSPZF_DECR 0x00000038 +#define HC_HSTOPSPZP_KEEP 0x00000000 +#define HC_HSTOPSPZP_ZERO 0x00000001 +#define HC_HSTOPSPZP_REPLACE 0x00000002 +#define HC_HSTOPSPZP_INCRSAT 0x00000003 +#define HC_HSTOPSPZP_DECRSAT 0x00000004 +#define HC_HSTOPSPZP_INVERT 0x00000005 +#define HC_HSTOPSPZP_INCR 0x00000006 +#define HC_HSTOPSPZP_DECR 0x00000007 + +/* Alpha Setting + */ +#define HC_SubA_HABBasL 0x0030 +#define HC_SubA_HABBasH 0x0031 +#define HC_SubA_HABFM 0x0032 +#define HC_SubA_HATMD 0x0033 +#define HC_SubA_HABLCsat 0x0034 +#define HC_SubA_HABLCop 0x0035 +#define HC_SubA_HABLAsat 0x0036 +#define HC_SubA_HABLAop 0x0037 +#define HC_SubA_HABLRCa 0x0038 +#define HC_SubA_HABLRFCa 0x0039 +#define HC_SubA_HABLRCbias 0x003a +#define HC_SubA_HABLRCb 0x003b +#define HC_SubA_HABLRFCb 0x003c +#define HC_SubA_HABLRAa 0x003d +#define HC_SubA_HABLRAb 0x003e +/* HC_SubA_HABFM + */ +#define HC_HABFM_MASK 0x00030000 +#define HC_HABLoc_MASK 0x0000c000 +#define HC_HABPit_MASK 0x000007ff +/* HC_SubA_HATMD + */ +#define HC_HATMD_MASK 0x00000700 +#define HC_HATREF_MASK 0x000000ff +#define HC_HATMD_NeverPass 0x00000000 +#define HC_HATMD_LT 0x00000100 +#define HC_HATMD_EQ 0x00000200 +#define HC_HATMD_LE 0x00000300 +#define HC_HATMD_GT 0x00000400 +#define HC_HATMD_NE 0x00000500 +#define HC_HATMD_GE 0x00000600 +#define HC_HATMD_AllPass 0x00000700 +/* HC_SubA_HABLCsat + */ +#define HC_HABLCsat_MASK 0x00010000 +#define HC_HABLCa_MASK 0x0000fc00 +#define HC_HABLCa_C_MASK 0x0000c000 +#define HC_HABLCa_OPC_MASK 0x00003c00 +#define HC_HABLFCa_MASK 0x000003f0 +#define HC_HABLFCa_C_MASK 0x00000300 +#define HC_HABLFCa_OPC_MASK 0x000000f0 +#define HC_HABLCbias_MASK 0x0000000f +#define HC_HABLCbias_C_MASK 0x00000008 +#define HC_HABLCbias_OPC_MASK 0x00000007 +/*-- Define the input color. + */ +#define HC_XC_Csrc 0x00000000 +#define HC_XC_Cdst 0x00000001 +#define HC_XC_Asrc 0x00000002 +#define HC_XC_Adst 0x00000003 +#define HC_XC_Fog 0x00000004 +#define HC_XC_HABLRC 0x00000005 +#define HC_XC_minSrcDst 0x00000006 +#define HC_XC_maxSrcDst 0x00000007 +#define HC_XC_mimAsrcInvAdst 0x00000008 +#define HC_XC_OPC 0x00000000 +#define HC_XC_InvOPC 0x00000010 +#define HC_XC_OPCp5 0x00000020 +/*-- Define the input Alpha + */ +#define HC_XA_OPA 0x00000000 +#define HC_XA_InvOPA 0x00000010 +#define HC_XA_OPAp5 0x00000020 +#define HC_XA_0 0x00000000 +#define HC_XA_Asrc 0x00000001 +#define HC_XA_Adst 0x00000002 +#define HC_XA_Fog 0x00000003 +#define HC_XA_minAsrcFog 0x00000004 +#define HC_XA_minAsrcAdst 0x00000005 +#define HC_XA_maxAsrcFog 0x00000006 +#define HC_XA_maxAsrcAdst 0x00000007 +#define HC_XA_HABLRA 0x00000008 +#define HC_XA_minAsrcInvAdst 0x00000008 +#define HC_XA_HABLFRA 0x00000009 +/*-- + */ +#define HC_HABLCa_OPC (HC_XC_OPC << 10) +#define HC_HABLCa_InvOPC (HC_XC_InvOPC << 10) +#define HC_HABLCa_OPCp5 (HC_XC_OPCp5 << 10) +#define HC_HABLCa_Csrc (HC_XC_Csrc << 10) +#define HC_HABLCa_Cdst (HC_XC_Cdst << 10) +#define HC_HABLCa_Asrc (HC_XC_Asrc << 10) +#define HC_HABLCa_Adst (HC_XC_Adst << 10) +#define HC_HABLCa_Fog (HC_XC_Fog << 10) +#define HC_HABLCa_HABLRCa (HC_XC_HABLRC << 10) +#define HC_HABLCa_minSrcDst (HC_XC_minSrcDst << 10) +#define HC_HABLCa_maxSrcDst (HC_XC_maxSrcDst << 10) +#define HC_HABLFCa_OPC (HC_XC_OPC << 4) +#define HC_HABLFCa_InvOPC (HC_XC_InvOPC << 4) +#define HC_HABLFCa_OPCp5 (HC_XC_OPCp5 << 4) +#define HC_HABLFCa_Csrc (HC_XC_Csrc << 4) +#define HC_HABLFCa_Cdst (HC_XC_Cdst << 4) +#define HC_HABLFCa_Asrc (HC_XC_Asrc << 4) +#define HC_HABLFCa_Adst (HC_XC_Adst << 4) +#define HC_HABLFCa_Fog (HC_XC_Fog << 4) +#define HC_HABLFCa_HABLRCa (HC_XC_HABLRC << 4) +#define HC_HABLFCa_minSrcDst (HC_XC_minSrcDst << 4) +#define HC_HABLFCa_maxSrcDst (HC_XC_maxSrcDst << 4) +#define HC_HABLFCa_mimAsrcInvAdst (HC_XC_mimAsrcInvAdst << 4) +#define HC_HABLCbias_HABLRCbias 0x00000000 +#define HC_HABLCbias_Asrc 0x00000001 +#define HC_HABLCbias_Adst 0x00000002 +#define HC_HABLCbias_Fog 0x00000003 +#define HC_HABLCbias_Cin 0x00000004 +/* HC_SubA_HABLCop 0x0035 + */ +#define HC_HABLdot_MASK 0x00010000 +#define HC_HABLCop_MASK 0x00004000 +#define HC_HABLCb_MASK 0x00003f00 +#define HC_HABLCb_C_MASK 0x00003000 +#define HC_HABLCb_OPC_MASK 0x00000f00 +#define HC_HABLFCb_MASK 0x000000fc +#define HC_HABLFCb_C_MASK 0x000000c0 +#define HC_HABLFCb_OPC_MASK 0x0000003c +#define HC_HABLCshift_MASK 0x00000003 +#define HC_HABLCb_OPC (HC_XC_OPC << 8) +#define HC_HABLCb_InvOPC (HC_XC_InvOPC << 8) +#define HC_HABLCb_OPCp5 (HC_XC_OPCp5 << 8) +#define HC_HABLCb_Csrc (HC_XC_Csrc << 8) +#define HC_HABLCb_Cdst (HC_XC_Cdst << 8) +#define HC_HABLCb_Asrc (HC_XC_Asrc << 8) +#define HC_HABLCb_Adst (HC_XC_Adst << 8) +#define HC_HABLCb_Fog (HC_XC_Fog << 8) +#define HC_HABLCb_HABLRCa (HC_XC_HABLRC << 8) +#define HC_HABLCb_minSrcDst (HC_XC_minSrcDst << 8) +#define HC_HABLCb_maxSrcDst (HC_XC_maxSrcDst << 8) +#define HC_HABLFCb_OPC (HC_XC_OPC << 2) +#define HC_HABLFCb_InvOPC (HC_XC_InvOPC << 2) +#define HC_HABLFCb_OPCp5 (HC_XC_OPCp5 << 2) +#define HC_HABLFCb_Csrc (HC_XC_Csrc << 2) +#define HC_HABLFCb_Cdst (HC_XC_Cdst << 2) +#define HC_HABLFCb_Asrc (HC_XC_Asrc << 2) +#define HC_HABLFCb_Adst (HC_XC_Adst << 2) +#define HC_HABLFCb_Fog (HC_XC_Fog << 2) +#define HC_HABLFCb_HABLRCb (HC_XC_HABLRC << 2) +#define HC_HABLFCb_minSrcDst (HC_XC_minSrcDst << 2) +#define HC_HABLFCb_maxSrcDst (HC_XC_maxSrcDst << 2) +#define HC_HABLFCb_mimAsrcInvAdst (HC_XC_mimAsrcInvAdst << 2) +/* HC_SubA_HABLAsat 0x0036 + */ +#define HC_HABLAsat_MASK 0x00010000 +#define HC_HABLAa_MASK 0x0000fc00 +#define HC_HABLAa_A_MASK 0x0000c000 +#define HC_HABLAa_OPA_MASK 0x00003c00 +#define HC_HABLFAa_MASK 0x000003f0 +#define HC_HABLFAa_A_MASK 0x00000300 +#define HC_HABLFAa_OPA_MASK 0x000000f0 +#define HC_HABLAbias_MASK 0x0000000f +#define HC_HABLAbias_A_MASK 0x00000008 +#define HC_HABLAbias_OPA_MASK 0x00000007 +#define HC_HABLAa_OPA (HC_XA_OPA << 10) +#define HC_HABLAa_InvOPA (HC_XA_InvOPA << 10) +#define HC_HABLAa_OPAp5 (HC_XA_OPAp5 << 10) +#define HC_HABLAa_0 (HC_XA_0 << 10) +#define HC_HABLAa_Asrc (HC_XA_Asrc << 10) +#define HC_HABLAa_Adst (HC_XA_Adst << 10) +#define HC_HABLAa_Fog (HC_XA_Fog << 10) +#define HC_HABLAa_minAsrcFog (HC_XA_minAsrcFog << 10) +#define HC_HABLAa_minAsrcAdst (HC_XA_minAsrcAdst << 10) +#define HC_HABLAa_maxAsrcFog (HC_XA_maxAsrcFog << 10) +#define HC_HABLAa_maxAsrcAdst (HC_XA_maxAsrcAdst << 10) +#define HC_HABLAa_HABLRA (HC_XA_HABLRA << 10) +#define HC_HABLFAa_OPA (HC_XA_OPA << 4) +#define HC_HABLFAa_InvOPA (HC_XA_InvOPA << 4) +#define HC_HABLFAa_OPAp5 (HC_XA_OPAp5 << 4) +#define HC_HABLFAa_0 (HC_XA_0 << 4) +#define HC_HABLFAa_Asrc (HC_XA_Asrc << 4) +#define HC_HABLFAa_Adst (HC_XA_Adst << 4) +#define HC_HABLFAa_Fog (HC_XA_Fog << 4) +#define HC_HABLFAa_minAsrcFog (HC_XA_minAsrcFog << 4) +#define HC_HABLFAa_minAsrcAdst (HC_XA_minAsrcAdst << 4) +#define HC_HABLFAa_maxAsrcFog (HC_XA_maxAsrcFog << 4) +#define HC_HABLFAa_maxAsrcAdst (HC_XA_maxAsrcAdst << 4) +#define HC_HABLFAa_minAsrcInvAdst (HC_XA_minAsrcInvAdst << 4) +#define HC_HABLFAa_HABLFRA (HC_XA_HABLFRA << 4) +#define HC_HABLAbias_HABLRAbias 0x00000000 +#define HC_HABLAbias_Asrc 0x00000001 +#define HC_HABLAbias_Adst 0x00000002 +#define HC_HABLAbias_Fog 0x00000003 +#define HC_HABLAbias_Aaa 0x00000004 +/* HC_SubA_HABLAop 0x0037 + */ +#define HC_HABLAop_MASK 0x00004000 +#define HC_HABLAb_MASK 0x00003f00 +#define HC_HABLAb_OPA_MASK 0x00000f00 +#define HC_HABLFAb_MASK 0x000000fc +#define HC_HABLFAb_OPA_MASK 0x0000003c +#define HC_HABLAshift_MASK 0x00000003 +#define HC_HABLAb_OPA (HC_XA_OPA << 8) +#define HC_HABLAb_InvOPA (HC_XA_InvOPA << 8) +#define HC_HABLAb_OPAp5 (HC_XA_OPAp5 << 8) +#define HC_HABLAb_0 (HC_XA_0 << 8) +#define HC_HABLAb_Asrc (HC_XA_Asrc << 8) +#define HC_HABLAb_Adst (HC_XA_Adst << 8) +#define HC_HABLAb_Fog (HC_XA_Fog << 8) +#define HC_HABLAb_minAsrcFog (HC_XA_minAsrcFog << 8) +#define HC_HABLAb_minAsrcAdst (HC_XA_minAsrcAdst << 8) +#define HC_HABLAb_maxAsrcFog (HC_XA_maxAsrcFog << 8) +#define HC_HABLAb_maxAsrcAdst (HC_XA_maxAsrcAdst << 8) +#define HC_HABLAb_HABLRA (HC_XA_HABLRA << 8) +#define HC_HABLFAb_OPA (HC_XA_OPA << 2) +#define HC_HABLFAb_InvOPA (HC_XA_InvOPA << 2) +#define HC_HABLFAb_OPAp5 (HC_XA_OPAp5 << 2) +#define HC_HABLFAb_0 (HC_XA_0 << 2) +#define HC_HABLFAb_Asrc (HC_XA_Asrc << 2) +#define HC_HABLFAb_Adst (HC_XA_Adst << 2) +#define HC_HABLFAb_Fog (HC_XA_Fog << 2) +#define HC_HABLFAb_minAsrcFog (HC_XA_minAsrcFog << 2) +#define HC_HABLFAb_minAsrcAdst (HC_XA_minAsrcAdst << 2) +#define HC_HABLFAb_maxAsrcFog (HC_XA_maxAsrcFog << 2) +#define HC_HABLFAb_maxAsrcAdst (HC_XA_maxAsrcAdst << 2) +#define HC_HABLFAb_minAsrcInvAdst (HC_XA_minAsrcInvAdst << 2) +#define HC_HABLFAb_HABLFRA (HC_XA_HABLFRA << 2) +/* HC_SubA_HABLRAa 0x003d + */ +#define HC_HABLRAa_MASK 0x00ff0000 +#define HC_HABLRFAa_MASK 0x0000ff00 +#define HC_HABLRAbias_MASK 0x000000ff +#define HC_HABLRAa_SHIFT 16 +#define HC_HABLRFAa_SHIFT 8 +/* HC_SubA_HABLRAb 0x003e + */ +#define HC_HABLRAb_MASK 0x0000ff00 +#define HC_HABLRFAb_MASK 0x000000ff +#define HC_HABLRAb_SHIFT 8 + +/* Destination Setting + */ +#define HC_SubA_HDBBasL 0x0040 +#define HC_SubA_HDBBasH 0x0041 +#define HC_SubA_HDBFM 0x0042 +#define HC_SubA_HFBBMSKL 0x0043 +#define HC_SubA_HROP 0x0044 +/* HC_SubA_HDBFM 0x0042 + */ +#define HC_HDBFM_MASK 0x001f0000 +#define HC_HDBLoc_MASK 0x0000c000 +#define HC_HDBPit_MASK 0x00003fff +#define HC_HDBFM_RGB555 0x00000000 +#define HC_HDBFM_RGB565 0x00010000 +#define HC_HDBFM_ARGB4444 0x00020000 +#define HC_HDBFM_ARGB1555 0x00030000 +#define HC_HDBFM_BGR555 0x00040000 +#define HC_HDBFM_BGR565 0x00050000 +#define HC_HDBFM_ABGR4444 0x00060000 +#define HC_HDBFM_ABGR1555 0x00070000 +#define HC_HDBFM_ARGB0888 0x00080000 +#define HC_HDBFM_ARGB8888 0x00090000 +#define HC_HDBFM_ABGR0888 0x000a0000 +#define HC_HDBFM_ABGR8888 0x000b0000 +#define HC_HDBLoc_Local 0x00000000 +#define HC_HDBLoc_Sys 0x00004000 +/* HC_SubA_HROP 0x0044 + */ +#define HC_HROP_MASK 0x00000f00 +#define HC_HFBBMSKH_MASK 0x000000ff +#define HC_HROP_BLACK 0x00000000 +#define HC_HROP_DPon 0x00000100 +#define HC_HROP_DPna 0x00000200 +#define HC_HROP_Pn 0x00000300 +#define HC_HROP_PDna 0x00000400 +#define HC_HROP_Dn 0x00000500 +#define HC_HROP_DPx 0x00000600 +#define HC_HROP_DPan 0x00000700 +#define HC_HROP_DPa 0x00000800 +#define HC_HROP_DPxn 0x00000900 +#define HC_HROP_D 0x00000a00 +#define HC_HROP_DPno 0x00000b00 +#define HC_HROP_P 0x00000c00 +#define HC_HROP_PDno 0x00000d00 +#define HC_HROP_DPo 0x00000e00 +#define HC_HROP_WHITE 0x00000f00 + +/* Fog Setting + */ +#define HC_SubA_HFogLF 0x0050 +#define HC_SubA_HFogCL 0x0051 +#define HC_SubA_HFogCH 0x0052 +#define HC_SubA_HFogStL 0x0053 +#define HC_SubA_HFogStH 0x0054 +#define HC_SubA_HFogOOdMF 0x0055 +#define HC_SubA_HFogOOdEF 0x0056 +#define HC_SubA_HFogEndL 0x0057 +#define HC_SubA_HFogDenst 0x0058 +/* HC_SubA_FogLF 0x0050 + */ +#define HC_FogLF_MASK 0x00000010 +#define HC_FogEq_MASK 0x00000008 +#define HC_FogMD_MASK 0x00000007 +#define HC_FogMD_LocalFog 0x00000000 +#define HC_FogMD_LinearFog 0x00000002 +#define HC_FogMD_ExponentialFog 0x00000004 +#define HC_FogMD_Exponential2Fog 0x00000005 +/* #define HC_FogMD_FogTable 0x00000003 */ + +/* HC_SubA_HFogDenst 0x0058 + */ +#define HC_FogDenst_MASK 0x001fff00 +#define HC_FogEndL_MASK 0x000000ff + +/* Texture subtype definitions + */ +#define HC_SubType_Tex0 0x00000000 +#define HC_SubType_Tex1 0x00000001 +#define HC_SubType_TexGeneral 0x000000fe + +/* Attribute of texture n + */ +#define HC_SubA_HTXnL0BasL 0x0000 +#define HC_SubA_HTXnL1BasL 0x0001 +#define HC_SubA_HTXnL2BasL 0x0002 +#define HC_SubA_HTXnL3BasL 0x0003 +#define HC_SubA_HTXnL4BasL 0x0004 +#define HC_SubA_HTXnL5BasL 0x0005 +#define HC_SubA_HTXnL6BasL 0x0006 +#define HC_SubA_HTXnL7BasL 0x0007 +#define HC_SubA_HTXnL8BasL 0x0008 +#define HC_SubA_HTXnL9BasL 0x0009 +#define HC_SubA_HTXnLaBasL 0x000a +#define HC_SubA_HTXnLbBasL 0x000b +#define HC_SubA_HTXnLcBasL 0x000c +#define HC_SubA_HTXnLdBasL 0x000d +#define HC_SubA_HTXnLeBasL 0x000e +#define HC_SubA_HTXnLfBasL 0x000f +#define HC_SubA_HTXnL10BasL 0x0010 +#define HC_SubA_HTXnL11BasL 0x0011 +#define HC_SubA_HTXnL012BasH 0x0020 +#define HC_SubA_HTXnL345BasH 0x0021 +#define HC_SubA_HTXnL678BasH 0x0022 +#define HC_SubA_HTXnL9abBasH 0x0023 +#define HC_SubA_HTXnLcdeBasH 0x0024 +#define HC_SubA_HTXnLf1011BasH 0x0025 +#define HC_SubA_HTXnL0Pit 0x002b +#define HC_SubA_HTXnL1Pit 0x002c +#define HC_SubA_HTXnL2Pit 0x002d +#define HC_SubA_HTXnL3Pit 0x002e +#define HC_SubA_HTXnL4Pit 0x002f +#define HC_SubA_HTXnL5Pit 0x0030 +#define HC_SubA_HTXnL6Pit 0x0031 +#define HC_SubA_HTXnL7Pit 0x0032 +#define HC_SubA_HTXnL8Pit 0x0033 +#define HC_SubA_HTXnL9Pit 0x0034 +#define HC_SubA_HTXnLaPit 0x0035 +#define HC_SubA_HTXnLbPit 0x0036 +#define HC_SubA_HTXnLcPit 0x0037 +#define HC_SubA_HTXnLdPit 0x0038 +#define HC_SubA_HTXnLePit 0x0039 +#define HC_SubA_HTXnLfPit 0x003a +#define HC_SubA_HTXnL10Pit 0x003b +#define HC_SubA_HTXnL11Pit 0x003c +#define HC_SubA_HTXnL0_5WE 0x004b +#define HC_SubA_HTXnL6_bWE 0x004c +#define HC_SubA_HTXnLc_11WE 0x004d +#define HC_SubA_HTXnL0_5HE 0x0051 +#define HC_SubA_HTXnL6_bHE 0x0052 +#define HC_SubA_HTXnLc_11HE 0x0053 +#define HC_SubA_HTXnL0OS 0x0077 +#define HC_SubA_HTXnTB 0x0078 +#define HC_SubA_HTXnMPMD 0x0079 +#define HC_SubA_HTXnCLODu 0x007a +#define HC_SubA_HTXnFM 0x007b +#define HC_SubA_HTXnTRCH 0x007c +#define HC_SubA_HTXnTRCL 0x007d +#define HC_SubA_HTXnTBC 0x007e +#define HC_SubA_HTXnTRAH 0x007f +#define HC_SubA_HTXnTBLCsat 0x0080 +#define HC_SubA_HTXnTBLCop 0x0081 +#define HC_SubA_HTXnTBLMPfog 0x0082 +#define HC_SubA_HTXnTBLAsat 0x0083 +#define HC_SubA_HTXnTBLRCa 0x0085 +#define HC_SubA_HTXnTBLRCb 0x0086 +#define HC_SubA_HTXnTBLRCc 0x0087 +#define HC_SubA_HTXnTBLRCbias 0x0088 +#define HC_SubA_HTXnTBLRAa 0x0089 +#define HC_SubA_HTXnTBLRFog 0x008a +#define HC_SubA_HTXnBumpM00 0x0090 +#define HC_SubA_HTXnBumpM01 0x0091 +#define HC_SubA_HTXnBumpM10 0x0092 +#define HC_SubA_HTXnBumpM11 0x0093 +#define HC_SubA_HTXnLScale 0x0094 +#define HC_SubA_HTXSMD 0x0000 +/* HC_SubA_HTXnL012BasH 0x0020 + */ +#define HC_HTXnL0BasH_MASK 0x000000ff +#define HC_HTXnL1BasH_MASK 0x0000ff00 +#define HC_HTXnL2BasH_MASK 0x00ff0000 +#define HC_HTXnL1BasH_SHIFT 8 +#define HC_HTXnL2BasH_SHIFT 16 +/* HC_SubA_HTXnL345BasH 0x0021 + */ +#define HC_HTXnL3BasH_MASK 0x000000ff +#define HC_HTXnL4BasH_MASK 0x0000ff00 +#define HC_HTXnL5BasH_MASK 0x00ff0000 +#define HC_HTXnL4BasH_SHIFT 8 +#define HC_HTXnL5BasH_SHIFT 16 +/* HC_SubA_HTXnL678BasH 0x0022 + */ +#define HC_HTXnL6BasH_MASK 0x000000ff +#define HC_HTXnL7BasH_MASK 0x0000ff00 +#define HC_HTXnL8BasH_MASK 0x00ff0000 +#define HC_HTXnL7BasH_SHIFT 8 +#define HC_HTXnL8BasH_SHIFT 16 +/* HC_SubA_HTXnL9abBasH 0x0023 + */ +#define HC_HTXnL9BasH_MASK 0x000000ff +#define HC_HTXnLaBasH_MASK 0x0000ff00 +#define HC_HTXnLbBasH_MASK 0x00ff0000 +#define HC_HTXnLaBasH_SHIFT 8 +#define HC_HTXnLbBasH_SHIFT 16 +/* HC_SubA_HTXnLcdeBasH 0x0024 + */ +#define HC_HTXnLcBasH_MASK 0x000000ff +#define HC_HTXnLdBasH_MASK 0x0000ff00 +#define HC_HTXnLeBasH_MASK 0x00ff0000 +#define HC_HTXnLdBasH_SHIFT 8 +#define HC_HTXnLeBasH_SHIFT 16 +/* HC_SubA_HTXnLcdeBasH 0x0025 + */ +#define HC_HTXnLfBasH_MASK 0x000000ff +#define HC_HTXnL10BasH_MASK 0x0000ff00 +#define HC_HTXnL11BasH_MASK 0x00ff0000 +#define HC_HTXnL10BasH_SHIFT 8 +#define HC_HTXnL11BasH_SHIFT 16 +/* HC_SubA_HTXnL0Pit 0x002b + */ +#define HC_HTXnLnPit_MASK 0x00003fff +#define HC_HTXnEnPit_MASK 0x00080000 +#define HC_HTXnLnPitE_MASK 0x00f00000 +#define HC_HTXnLnPitE_SHIFT 20 +/* HC_SubA_HTXnL0_5WE 0x004b + */ +#define HC_HTXnL0WE_MASK 0x0000000f +#define HC_HTXnL1WE_MASK 0x000000f0 +#define HC_HTXnL2WE_MASK 0x00000f00 +#define HC_HTXnL3WE_MASK 0x0000f000 +#define HC_HTXnL4WE_MASK 0x000f0000 +#define HC_HTXnL5WE_MASK 0x00f00000 +#define HC_HTXnL1WE_SHIFT 4 +#define HC_HTXnL2WE_SHIFT 8 +#define HC_HTXnL3WE_SHIFT 12 +#define HC_HTXnL4WE_SHIFT 16 +#define HC_HTXnL5WE_SHIFT 20 +/* HC_SubA_HTXnL6_bWE 0x004c + */ +#define HC_HTXnL6WE_MASK 0x0000000f +#define HC_HTXnL7WE_MASK 0x000000f0 +#define HC_HTXnL8WE_MASK 0x00000f00 +#define HC_HTXnL9WE_MASK 0x0000f000 +#define HC_HTXnLaWE_MASK 0x000f0000 +#define HC_HTXnLbWE_MASK 0x00f00000 +#define HC_HTXnL7WE_SHIFT 4 +#define HC_HTXnL8WE_SHIFT 8 +#define HC_HTXnL9WE_SHIFT 12 +#define HC_HTXnLaWE_SHIFT 16 +#define HC_HTXnLbWE_SHIFT 20 +/* HC_SubA_HTXnLc_11WE 0x004d + */ +#define HC_HTXnLcWE_MASK 0x0000000f +#define HC_HTXnLdWE_MASK 0x000000f0 +#define HC_HTXnLeWE_MASK 0x00000f00 +#define HC_HTXnLfWE_MASK 0x0000f000 +#define HC_HTXnL10WE_MASK 0x000f0000 +#define HC_HTXnL11WE_MASK 0x00f00000 +#define HC_HTXnLdWE_SHIFT 4 +#define HC_HTXnLeWE_SHIFT 8 +#define HC_HTXnLfWE_SHIFT 12 +#define HC_HTXnL10WE_SHIFT 16 +#define HC_HTXnL11WE_SHIFT 20 +/* HC_SubA_HTXnL0_5HE 0x0051 + */ +#define HC_HTXnL0HE_MASK 0x0000000f +#define HC_HTXnL1HE_MASK 0x000000f0 +#define HC_HTXnL2HE_MASK 0x00000f00 +#define HC_HTXnL3HE_MASK 0x0000f000 +#define HC_HTXnL4HE_MASK 0x000f0000 +#define HC_HTXnL5HE_MASK 0x00f00000 +#define HC_HTXnL1HE_SHIFT 4 +#define HC_HTXnL2HE_SHIFT 8 +#define HC_HTXnL3HE_SHIFT 12 +#define HC_HTXnL4HE_SHIFT 16 +#define HC_HTXnL5HE_SHIFT 20 +/* HC_SubA_HTXnL6_bHE 0x0052 + */ +#define HC_HTXnL6HE_MASK 0x0000000f +#define HC_HTXnL7HE_MASK 0x000000f0 +#define HC_HTXnL8HE_MASK 0x00000f00 +#define HC_HTXnL9HE_MASK 0x0000f000 +#define HC_HTXnLaHE_MASK 0x000f0000 +#define HC_HTXnLbHE_MASK 0x00f00000 +#define HC_HTXnL7HE_SHIFT 4 +#define HC_HTXnL8HE_SHIFT 8 +#define HC_HTXnL9HE_SHIFT 12 +#define HC_HTXnLaHE_SHIFT 16 +#define HC_HTXnLbHE_SHIFT 20 +/* HC_SubA_HTXnLc_11HE 0x0053 + */ +#define HC_HTXnLcHE_MASK 0x0000000f +#define HC_HTXnLdHE_MASK 0x000000f0 +#define HC_HTXnLeHE_MASK 0x00000f00 +#define HC_HTXnLfHE_MASK 0x0000f000 +#define HC_HTXnL10HE_MASK 0x000f0000 +#define HC_HTXnL11HE_MASK 0x00f00000 +#define HC_HTXnLdHE_SHIFT 4 +#define HC_HTXnLeHE_SHIFT 8 +#define HC_HTXnLfHE_SHIFT 12 +#define HC_HTXnL10HE_SHIFT 16 +#define HC_HTXnL11HE_SHIFT 20 +/* HC_SubA_HTXnL0OS 0x0077 + */ +#define HC_HTXnL0OS_MASK 0x003ff000 +#define HC_HTXnLVmax_MASK 0x00000fc0 +#define HC_HTXnLVmin_MASK 0x0000003f +#define HC_HTXnL0OS_SHIFT 12 +#define HC_HTXnLVmax_SHIFT 6 +/* HC_SubA_HTXnTB 0x0078 + */ +#define HC_HTXnTB_MASK 0x00f00000 +#define HC_HTXnFLSe_MASK 0x0000e000 +#define HC_HTXnFLSs_MASK 0x00001c00 +#define HC_HTXnFLTe_MASK 0x00000380 +#define HC_HTXnFLTs_MASK 0x00000070 +#define HC_HTXnFLDs_MASK 0x0000000f +#define HC_HTXnTB_NoTB 0x00000000 +#define HC_HTXnTB_TBC_S 0x00100000 +#define HC_HTXnTB_TBC_T 0x00200000 +#define HC_HTXnTB_TB_S 0x00400000 +#define HC_HTXnTB_TB_T 0x00800000 +#define HC_HTXnFLSe_Nearest 0x00000000 +#define HC_HTXnFLSe_Linear 0x00002000 +#define HC_HTXnFLSe_NonLinear 0x00004000 +#define HC_HTXnFLSe_Sharp 0x00008000 +#define HC_HTXnFLSe_Flat_Gaussian_Cubic 0x0000c000 +#define HC_HTXnFLSs_Nearest 0x00000000 +#define HC_HTXnFLSs_Linear 0x00000400 +#define HC_HTXnFLSs_NonLinear 0x00000800 +#define HC_HTXnFLSs_Flat_Gaussian_Cubic 0x00001800 +#define HC_HTXnFLTe_Nearest 0x00000000 +#define HC_HTXnFLTe_Linear 0x00000080 +#define HC_HTXnFLTe_NonLinear 0x00000100 +#define HC_HTXnFLTe_Sharp 0x00000180 +#define HC_HTXnFLTe_Flat_Gaussian_Cubic 0x00000300 +#define HC_HTXnFLTs_Nearest 0x00000000 +#define HC_HTXnFLTs_Linear 0x00000010 +#define HC_HTXnFLTs_NonLinear 0x00000020 +#define HC_HTXnFLTs_Flat_Gaussian_Cubic 0x00000060 +#define HC_HTXnFLDs_Tex0 0x00000000 +#define HC_HTXnFLDs_Nearest 0x00000001 +#define HC_HTXnFLDs_Linear 0x00000002 +#define HC_HTXnFLDs_NonLinear 0x00000003 +#define HC_HTXnFLDs_Dither 0x00000004 +#define HC_HTXnFLDs_ConstLOD 0x00000005 +#define HC_HTXnFLDs_Ani 0x00000006 +#define HC_HTXnFLDs_AniDither 0x00000007 +/* HC_SubA_HTXnMPMD 0x0079 + */ +#define HC_HTXnMPMD_SMASK 0x00070000 +#define HC_HTXnMPMD_TMASK 0x00380000 +#define HC_HTXnLODDTf_MASK 0x00000007 +#define HC_HTXnXY2ST_MASK 0x00000008 +#define HC_HTXnMPMD_Tsingle 0x00000000 +#define HC_HTXnMPMD_Tclamp 0x00080000 +#define HC_HTXnMPMD_Trepeat 0x00100000 +#define HC_HTXnMPMD_Tmirror 0x00180000 +#define HC_HTXnMPMD_Twrap 0x00200000 +#define HC_HTXnMPMD_Ssingle 0x00000000 +#define HC_HTXnMPMD_Sclamp 0x00010000 +#define HC_HTXnMPMD_Srepeat 0x00020000 +#define HC_HTXnMPMD_Smirror 0x00030000 +#define HC_HTXnMPMD_Swrap 0x00040000 +/* HC_SubA_HTXnCLODu 0x007a + */ +#define HC_HTXnCLODu_MASK 0x000ffc00 +#define HC_HTXnCLODd_MASK 0x000003ff +#define HC_HTXnCLODu_SHIFT 10 +/* HC_SubA_HTXnFM 0x007b + */ +#define HC_HTXnFM_MASK 0x00ff0000 +#define HC_HTXnLoc_MASK 0x00000003 +#define HC_HTXnFM_INDEX 0x00000000 +#define HC_HTXnFM_Intensity 0x00080000 +#define HC_HTXnFM_Lum 0x00100000 +#define HC_HTXnFM_Alpha 0x00180000 +#define HC_HTXnFM_DX 0x00280000 +#define HC_HTXnFM_ARGB16 0x00880000 +#define HC_HTXnFM_ARGB32 0x00980000 +#define HC_HTXnFM_ABGR16 0x00a80000 +#define HC_HTXnFM_ABGR32 0x00b80000 +#define HC_HTXnFM_RGBA16 0x00c80000 +#define HC_HTXnFM_RGBA32 0x00d80000 +#define HC_HTXnFM_BGRA16 0x00e80000 +#define HC_HTXnFM_BGRA32 0x00f80000 +#define HC_HTXnFM_BUMPMAP 0x00380000 +#define HC_HTXnFM_Index1 (HC_HTXnFM_INDEX | 0x00000000) +#define HC_HTXnFM_Index2 (HC_HTXnFM_INDEX | 0x00010000) +#define HC_HTXnFM_Index4 (HC_HTXnFM_INDEX | 0x00020000) +#define HC_HTXnFM_Index8 (HC_HTXnFM_INDEX | 0x00030000) +#define HC_HTXnFM_T1 (HC_HTXnFM_Intensity | 0x00000000) +#define HC_HTXnFM_T2 (HC_HTXnFM_Intensity | 0x00010000) +#define HC_HTXnFM_T4 (HC_HTXnFM_Intensity | 0x00020000) +#define HC_HTXnFM_T8 (HC_HTXnFM_Intensity | 0x00030000) +#define HC_HTXnFM_L1 (HC_HTXnFM_Lum | 0x00000000) +#define HC_HTXnFM_L2 (HC_HTXnFM_Lum | 0x00010000) +#define HC_HTXnFM_L4 (HC_HTXnFM_Lum | 0x00020000) +#define HC_HTXnFM_L8 (HC_HTXnFM_Lum | 0x00030000) +#define HC_HTXnFM_AL44 (HC_HTXnFM_Lum | 0x00040000) +#define HC_HTXnFM_AL88 (HC_HTXnFM_Lum | 0x00050000) +#define HC_HTXnFM_A1 (HC_HTXnFM_Alpha | 0x00000000) +#define HC_HTXnFM_A2 (HC_HTXnFM_Alpha | 0x00010000) +#define HC_HTXnFM_A4 (HC_HTXnFM_Alpha | 0x00020000) +#define HC_HTXnFM_A8 (HC_HTXnFM_Alpha | 0x00030000) +#define HC_HTXnFM_DX1 (HC_HTXnFM_DX | 0x00010000) +#define HC_HTXnFM_DX23 (HC_HTXnFM_DX | 0x00020000) +#define HC_HTXnFM_DX45 (HC_HTXnFM_DX | 0x00030000) +#define HC_HTXnFM_RGB555 (HC_HTXnFM_ARGB16 | 0x00000000) +#define HC_HTXnFM_RGB565 (HC_HTXnFM_ARGB16 | 0x00010000) +#define HC_HTXnFM_ARGB1555 (HC_HTXnFM_ARGB16 | 0x00020000) +#define HC_HTXnFM_ARGB4444 (HC_HTXnFM_ARGB16 | 0x00030000) +#define HC_HTXnFM_ARGB0888 (HC_HTXnFM_ARGB32 | 0x00000000) +#define HC_HTXnFM_ARGB8888 (HC_HTXnFM_ARGB32 | 0x00010000) +#define HC_HTXnFM_BGR555 (HC_HTXnFM_ABGR16 | 0x00000000) +#define HC_HTXnFM_BGR565 (HC_HTXnFM_ABGR16 | 0x00010000) +#define HC_HTXnFM_ABGR1555 (HC_HTXnFM_ABGR16 | 0x00020000) +#define HC_HTXnFM_ABGR4444 (HC_HTXnFM_ABGR16 | 0x00030000) +#define HC_HTXnFM_ABGR0888 (HC_HTXnFM_ABGR32 | 0x00000000) +#define HC_HTXnFM_ABGR8888 (HC_HTXnFM_ABGR32 | 0x00010000) +#define HC_HTXnFM_RGBA5550 (HC_HTXnFM_RGBA16 | 0x00000000) +#define HC_HTXnFM_RGBA5551 (HC_HTXnFM_RGBA16 | 0x00020000) +#define HC_HTXnFM_RGBA4444 (HC_HTXnFM_RGBA16 | 0x00030000) +#define HC_HTXnFM_RGBA8880 (HC_HTXnFM_RGBA32 | 0x00000000) +#define HC_HTXnFM_RGBA8888 (HC_HTXnFM_RGBA32 | 0x00010000) +#define HC_HTXnFM_BGRA5550 (HC_HTXnFM_BGRA16 | 0x00000000) +#define HC_HTXnFM_BGRA5551 (HC_HTXnFM_BGRA16 | 0x00020000) +#define HC_HTXnFM_BGRA4444 (HC_HTXnFM_BGRA16 | 0x00030000) +#define HC_HTXnFM_BGRA8880 (HC_HTXnFM_BGRA32 | 0x00000000) +#define HC_HTXnFM_BGRA8888 (HC_HTXnFM_BGRA32 | 0x00010000) +#define HC_HTXnFM_VU88 (HC_HTXnFM_BUMPMAP | 0x00000000) +#define HC_HTXnFM_LVU655 (HC_HTXnFM_BUMPMAP | 0x00010000) +#define HC_HTXnFM_LVU888 (HC_HTXnFM_BUMPMAP | 0x00020000) +#define HC_HTXnLoc_Local 0x00000000 +#define HC_HTXnLoc_Sys 0x00000002 +#define HC_HTXnLoc_AGP 0x00000003 +/* HC_SubA_HTXnTRAH 0x007f + */ +#define HC_HTXnTRAH_MASK 0x00ff0000 +#define HC_HTXnTRAL_MASK 0x0000ff00 +#define HC_HTXnTBA_MASK 0x000000ff +#define HC_HTXnTRAH_SHIFT 16 +#define HC_HTXnTRAL_SHIFT 8 +/* HC_SubA_HTXnTBLCsat 0x0080 + *-- Define the input texture. + */ +#define HC_XTC_TOPC 0x00000000 +#define HC_XTC_InvTOPC 0x00000010 +#define HC_XTC_TOPCp5 0x00000020 +#define HC_XTC_Cbias 0x00000000 +#define HC_XTC_InvCbias 0x00000010 +#define HC_XTC_0 0x00000000 +#define HC_XTC_Dif 0x00000001 +#define HC_XTC_Spec 0x00000002 +#define HC_XTC_Tex 0x00000003 +#define HC_XTC_Cur 0x00000004 +#define HC_XTC_Adif 0x00000005 +#define HC_XTC_Fog 0x00000006 +#define HC_XTC_Atex 0x00000007 +#define HC_XTC_Acur 0x00000008 +#define HC_XTC_HTXnTBLRC 0x00000009 +#define HC_XTC_Ctexnext 0x0000000a +/*-- + */ +#define HC_HTXnTBLCsat_MASK 0x00800000 +#define HC_HTXnTBLCa_MASK 0x000fc000 +#define HC_HTXnTBLCb_MASK 0x00001f80 +#define HC_HTXnTBLCc_MASK 0x0000003f +#define HC_HTXnTBLCa_TOPC (HC_XTC_TOPC << 14) +#define HC_HTXnTBLCa_InvTOPC (HC_XTC_InvTOPC << 14) +#define HC_HTXnTBLCa_TOPCp5 (HC_XTC_TOPCp5 << 14) +#define HC_HTXnTBLCa_0 (HC_XTC_0 << 14) +#define HC_HTXnTBLCa_Dif (HC_XTC_Dif << 14) +#define HC_HTXnTBLCa_Spec (HC_XTC_Spec << 14) +#define HC_HTXnTBLCa_Tex (HC_XTC_Tex << 14) +#define HC_HTXnTBLCa_Cur (HC_XTC_Cur << 14) +#define HC_HTXnTBLCa_Adif (HC_XTC_Adif << 14) +#define HC_HTXnTBLCa_Fog (HC_XTC_Fog << 14) +#define HC_HTXnTBLCa_Atex (HC_XTC_Atex << 14) +#define HC_HTXnTBLCa_Acur (HC_XTC_Acur << 14) +#define HC_HTXnTBLCa_HTXnTBLRC (HC_XTC_HTXnTBLRC << 14) +#define HC_HTXnTBLCa_Ctexnext (HC_XTC_Ctexnext << 14) +#define HC_HTXnTBLCb_TOPC (HC_XTC_TOPC << 7) +#define HC_HTXnTBLCb_InvTOPC (HC_XTC_InvTOPC << 7) +#define HC_HTXnTBLCb_TOPCp5 (HC_XTC_TOPCp5 << 7) +#define HC_HTXnTBLCb_0 (HC_XTC_0 << 7) +#define HC_HTXnTBLCb_Dif (HC_XTC_Dif << 7) +#define HC_HTXnTBLCb_Spec (HC_XTC_Spec << 7) +#define HC_HTXnTBLCb_Tex (HC_XTC_Tex << 7) +#define HC_HTXnTBLCb_Cur (HC_XTC_Cur << 7) +#define HC_HTXnTBLCb_Adif (HC_XTC_Adif << 7) +#define HC_HTXnTBLCb_Fog (HC_XTC_Fog << 7) +#define HC_HTXnTBLCb_Atex (HC_XTC_Atex << 7) +#define HC_HTXnTBLCb_Acur (HC_XTC_Acur << 7) +#define HC_HTXnTBLCb_HTXnTBLRC (HC_XTC_HTXnTBLRC << 7) +#define HC_HTXnTBLCb_Ctexnext (HC_XTC_Ctexnext << 7) +#define HC_HTXnTBLCc_TOPC (HC_XTC_TOPC << 0) +#define HC_HTXnTBLCc_InvTOPC (HC_XTC_InvTOPC << 0) +#define HC_HTXnTBLCc_TOPCp5 (HC_XTC_TOPCp5 << 0) +#define HC_HTXnTBLCc_0 (HC_XTC_0 << 0) +#define HC_HTXnTBLCc_Dif (HC_XTC_Dif << 0) +#define HC_HTXnTBLCc_Spec (HC_XTC_Spec << 0) +#define HC_HTXnTBLCc_Tex (HC_XTC_Tex << 0) +#define HC_HTXnTBLCc_Cur (HC_XTC_Cur << 0) +#define HC_HTXnTBLCc_Adif (HC_XTC_Adif << 0) +#define HC_HTXnTBLCc_Fog (HC_XTC_Fog << 0) +#define HC_HTXnTBLCc_Atex (HC_XTC_Atex << 0) +#define HC_HTXnTBLCc_Acur (HC_XTC_Acur << 0) +#define HC_HTXnTBLCc_HTXnTBLRC (HC_XTC_HTXnTBLRC << 0) +#define HC_HTXnTBLCc_Ctexnext (HC_XTC_Ctexnext << 0) +/* HC_SubA_HTXnTBLCop 0x0081 + */ +#define HC_HTXnTBLdot_MASK 0x00c00000 +#define HC_HTXnTBLCop_MASK 0x00380000 +#define HC_HTXnTBLCbias_MASK 0x0007c000 +#define HC_HTXnTBLCshift_MASK 0x00001800 +#define HC_HTXnTBLAop_MASK 0x00000380 +#define HC_HTXnTBLAbias_MASK 0x00000078 +#define HC_HTXnTBLAshift_MASK 0x00000003 +#define HC_HTXnTBLCop_Add 0x00000000 +#define HC_HTXnTBLCop_Sub 0x00080000 +#define HC_HTXnTBLCop_Min 0x00100000 +#define HC_HTXnTBLCop_Max 0x00180000 +#define HC_HTXnTBLCop_Mask 0x00200000 +#define HC_HTXnTBLCbias_Cbias (HC_XTC_Cbias << 14) +#define HC_HTXnTBLCbias_InvCbias (HC_XTC_InvCbias << 14) +#define HC_HTXnTBLCbias_0 (HC_XTC_0 << 14) +#define HC_HTXnTBLCbias_Dif (HC_XTC_Dif << 14) +#define HC_HTXnTBLCbias_Spec (HC_XTC_Spec << 14) +#define HC_HTXnTBLCbias_Tex (HC_XTC_Tex << 14) +#define HC_HTXnTBLCbias_Cur (HC_XTC_Cur << 14) +#define HC_HTXnTBLCbias_Adif (HC_XTC_Adif << 14) +#define HC_HTXnTBLCbias_Fog (HC_XTC_Fog << 14) +#define HC_HTXnTBLCbias_Atex (HC_XTC_Atex << 14) +#define HC_HTXnTBLCbias_Acur (HC_XTC_Acur << 14) +#define HC_HTXnTBLCbias_HTXnTBLRC (HC_XTC_HTXnTBLRC << 14) +#define HC_HTXnTBLCshift_1 0x00000000 +#define HC_HTXnTBLCshift_2 0x00000800 +#define HC_HTXnTBLCshift_No 0x00001000 +#define HC_HTXnTBLCshift_DotP 0x00001800 +/*=* John Sheng [2003.7.18] texture combine *=*/ +#define HC_HTXnTBLDOT3 0x00080000 +#define HC_HTXnTBLDOT4 0x000C0000 + +#define HC_HTXnTBLAop_Add 0x00000000 +#define HC_HTXnTBLAop_Sub 0x00000080 +#define HC_HTXnTBLAop_Min 0x00000100 +#define HC_HTXnTBLAop_Max 0x00000180 +#define HC_HTXnTBLAop_Mask 0x00000200 +#define HC_HTXnTBLAbias_Inv 0x00000040 +#define HC_HTXnTBLAbias_Adif 0x00000000 +#define HC_HTXnTBLAbias_Fog 0x00000008 +#define HC_HTXnTBLAbias_Acur 0x00000010 +#define HC_HTXnTBLAbias_HTXnTBLRAbias 0x00000018 +#define HC_HTXnTBLAbias_Atex 0x00000020 +#define HC_HTXnTBLAshift_1 0x00000000 +#define HC_HTXnTBLAshift_2 0x00000001 +#define HC_HTXnTBLAshift_No 0x00000002 +/* #define HC_HTXnTBLAshift_DotP 0x00000003 */ +/* HC_SubA_HTXnTBLMPFog 0x0082 + */ +#define HC_HTXnTBLMPfog_MASK 0x00e00000 +#define HC_HTXnTBLMPfog_0 0x00000000 +#define HC_HTXnTBLMPfog_Adif 0x00200000 +#define HC_HTXnTBLMPfog_Fog 0x00400000 +#define HC_HTXnTBLMPfog_Atex 0x00600000 +#define HC_HTXnTBLMPfog_Acur 0x00800000 +#define HC_HTXnTBLMPfog_GHTXnTBLRFog 0x00a00000 +/* HC_SubA_HTXnTBLAsat 0x0083 + *-- Define the texture alpha input. + */ +#define HC_XTA_TOPA 0x00000000 +#define HC_XTA_InvTOPA 0x00000008 +#define HC_XTA_TOPAp5 0x00000010 +#define HC_XTA_Adif 0x00000000 +#define HC_XTA_Fog 0x00000001 +#define HC_XTA_Acur 0x00000002 +#define HC_XTA_HTXnTBLRA 0x00000003 +#define HC_XTA_Atex 0x00000004 +#define HC_XTA_Atexnext 0x00000005 +/*-- + */ +#define HC_HTXnTBLAsat_MASK 0x00800000 +#define HC_HTXnTBLAMB_MASK 0x00700000 +#define HC_HTXnTBLAa_MASK 0x0007c000 +#define HC_HTXnTBLAb_MASK 0x00000f80 +#define HC_HTXnTBLAc_MASK 0x0000001f +#define HC_HTXnTBLAMB_SHIFT 20 +#define HC_HTXnTBLAa_TOPA (HC_XTA_TOPA << 14) +#define HC_HTXnTBLAa_InvTOPA (HC_XTA_InvTOPA << 14) +#define HC_HTXnTBLAa_TOPAp5 (HC_XTA_TOPAp5 << 14) +#define HC_HTXnTBLAa_Adif (HC_XTA_Adif << 14) +#define HC_HTXnTBLAa_Fog (HC_XTA_Fog << 14) +#define HC_HTXnTBLAa_Acur (HC_XTA_Acur << 14) +#define HC_HTXnTBLAa_HTXnTBLRA (HC_XTA_HTXnTBLRA << 14) +#define HC_HTXnTBLAa_Atex (HC_XTA_Atex << 14) +#define HC_HTXnTBLAa_Atexnext (HC_XTA_Atexnext << 14) +#define HC_HTXnTBLAb_TOPA (HC_XTA_TOPA << 7) +#define HC_HTXnTBLAb_InvTOPA (HC_XTA_InvTOPA << 7) +#define HC_HTXnTBLAb_TOPAp5 (HC_XTA_TOPAp5 << 7) +#define HC_HTXnTBLAb_Adif (HC_XTA_Adif << 7) +#define HC_HTXnTBLAb_Fog (HC_XTA_Fog << 7) +#define HC_HTXnTBLAb_Acur (HC_XTA_Acur << 7) +#define HC_HTXnTBLAb_HTXnTBLRA (HC_XTA_HTXnTBLRA << 7) +#define HC_HTXnTBLAb_Atex (HC_XTA_Atex << 7) +#define HC_HTXnTBLAb_Atexnext (HC_XTA_Atexnext << 7) +#define HC_HTXnTBLAc_TOPA (HC_XTA_TOPA << 0) +#define HC_HTXnTBLAc_InvTOPA (HC_XTA_InvTOPA << 0) +#define HC_HTXnTBLAc_TOPAp5 (HC_XTA_TOPAp5 << 0) +#define HC_HTXnTBLAc_Adif (HC_XTA_Adif << 0) +#define HC_HTXnTBLAc_Fog (HC_XTA_Fog << 0) +#define HC_HTXnTBLAc_Acur (HC_XTA_Acur << 0) +#define HC_HTXnTBLAc_HTXnTBLRA (HC_XTA_HTXnTBLRA << 0) +#define HC_HTXnTBLAc_Atex (HC_XTA_Atex << 0) +#define HC_HTXnTBLAc_Atexnext (HC_XTA_Atexnext << 0) +/* HC_SubA_HTXnTBLRAa 0x0089 + */ +#define HC_HTXnTBLRAa_MASK 0x00ff0000 +#define HC_HTXnTBLRAb_MASK 0x0000ff00 +#define HC_HTXnTBLRAc_MASK 0x000000ff +#define HC_HTXnTBLRAa_SHIFT 16 +#define HC_HTXnTBLRAb_SHIFT 8 +#define HC_HTXnTBLRAc_SHIFT 0 +/* HC_SubA_HTXnTBLRFog 0x008a + */ +#define HC_HTXnTBLRFog_MASK 0x0000ff00 +#define HC_HTXnTBLRAbias_MASK 0x000000ff +#define HC_HTXnTBLRFog_SHIFT 8 +#define HC_HTXnTBLRAbias_SHIFT 0 +/* HC_SubA_HTXnLScale 0x0094 + */ +#define HC_HTXnLScale_MASK 0x0007fc00 +#define HC_HTXnLOff_MASK 0x000001ff +#define HC_HTXnLScale_SHIFT 10 +/* HC_SubA_HTXSMD 0x0000 + */ +#define HC_HTXSMD_MASK 0x00000080 +#define HC_HTXTMD_MASK 0x00000040 +#define HC_HTXNum_MASK 0x00000038 +#define HC_HTXTRMD_MASK 0x00000006 +#define HC_HTXCHCLR_MASK 0x00000001 +#define HC_HTXNum_SHIFT 3 + +/* Texture Palette n + */ +#define HC_SubType_TexPalette0 0x00000000 +#define HC_SubType_TexPalette1 0x00000001 +#define HC_SubType_FogTable 0x00000010 +#define HC_SubType_Stipple 0x00000014 +/* HC_SubA_TexPalette0 0x0000 + */ +#define HC_HTPnA_MASK 0xff000000 +#define HC_HTPnR_MASK 0x00ff0000 +#define HC_HTPnG_MASK 0x0000ff00 +#define HC_HTPnB_MASK 0x000000ff +/* HC_SubA_FogTable 0x0010 + */ +#define HC_HFPn3_MASK 0xff000000 +#define HC_HFPn2_MASK 0x00ff0000 +#define HC_HFPn1_MASK 0x0000ff00 +#define HC_HFPn_MASK 0x000000ff +#define HC_HFPn3_SHIFT 24 +#define HC_HFPn2_SHIFT 16 +#define HC_HFPn1_SHIFT 8 + +/* Auto Testing & Security + */ +#define HC_SubA_HenFIFOAT 0x0000 +#define HC_SubA_HFBDrawFirst 0x0004 +#define HC_SubA_HFBBasL 0x0005 +#define HC_SubA_HFBDst 0x0006 +/* HC_SubA_HenFIFOAT 0x0000 + */ +#define HC_HenFIFOAT_MASK 0x00000020 +#define HC_HenGEMILock_MASK 0x00000010 +#define HC_HenFBASwap_MASK 0x00000008 +#define HC_HenOT_MASK 0x00000004 +#define HC_HenCMDQ_MASK 0x00000002 +#define HC_HenTXCTSU_MASK 0x00000001 +/* HC_SubA_HFBDrawFirst 0x0004 + */ +#define HC_HFBDrawFirst_MASK 0x00000800 +#define HC_HFBQueue_MASK 0x00000400 +#define HC_HFBLock_MASK 0x00000200 +#define HC_HEOF_MASK 0x00000100 +#define HC_HFBBasH_MASK 0x000000ff + +/* GEMI Setting + */ +#define HC_SubA_HTArbRCM 0x0008 +#define HC_SubA_HTArbRZ 0x000a +#define HC_SubA_HTArbWZ 0x000b +#define HC_SubA_HTArbRTX 0x000c +#define HC_SubA_HTArbRCW 0x000d +#define HC_SubA_HTArbE2 0x000e +#define HC_SubA_HArbRQCM 0x0010 +#define HC_SubA_HArbWQCM 0x0011 +#define HC_SubA_HGEMITout 0x0020 +#define HC_SubA_HFthRTXD 0x0040 +#define HC_SubA_HFthRTXA 0x0044 +#define HC_SubA_HCMDQstL 0x0050 +#define HC_SubA_HCMDQendL 0x0051 +#define HC_SubA_HCMDQLen 0x0052 +/* HC_SubA_HTArbRCM 0x0008 + */ +#define HC_HTArbRCM_MASK 0x0000ffff +/* HC_SubA_HTArbRZ 0x000a + */ +#define HC_HTArbRZ_MASK 0x0000ffff +/* HC_SubA_HTArbWZ 0x000b + */ +#define HC_HTArbWZ_MASK 0x0000ffff +/* HC_SubA_HTArbRTX 0x000c + */ +#define HC_HTArbRTX_MASK 0x0000ffff +/* HC_SubA_HTArbRCW 0x000d + */ +#define HC_HTArbRCW_MASK 0x0000ffff +/* HC_SubA_HTArbE2 0x000e + */ +#define HC_HTArbE2_MASK 0x0000ffff +/* HC_SubA_HArbRQCM 0x0010 + */ +#define HC_HTArbRQCM_MASK 0x0000ffff +/* HC_SubA_HArbWQCM 0x0011 + */ +#define HC_HArbWQCM_MASK 0x0000ffff +/* HC_SubA_HGEMITout 0x0020 + */ +#define HC_HGEMITout_MASK 0x000f0000 +#define HC_HNPArbZC_MASK 0x0000ffff +#define HC_HGEMITout_SHIFT 16 +/* HC_SubA_HFthRTXD 0x0040 + */ +#define HC_HFthRTXD_MASK 0x00ff0000 +#define HC_HFthRZD_MASK 0x0000ff00 +#define HC_HFthWZD_MASK 0x000000ff +#define HC_HFthRTXD_SHIFT 16 +#define HC_HFthRZD_SHIFT 8 +/* HC_SubA_HFthRTXA 0x0044 + */ +#define HC_HFthRTXA_MASK 0x000000ff + +/****************************************************************************** +** Define the Halcyon Internal register access constants. For simulator only. +******************************************************************************/ +#define HC_SIMA_HAGPBstL 0x0000 +#define HC_SIMA_HAGPBendL 0x0001 +#define HC_SIMA_HAGPCMNT 0x0002 +#define HC_SIMA_HAGPBpL 0x0003 +#define HC_SIMA_HAGPBpH 0x0004 +#define HC_SIMA_HClipTB 0x0005 +#define HC_SIMA_HClipLR 0x0006 +#define HC_SIMA_HFPClipTL 0x0007 +#define HC_SIMA_HFPClipBL 0x0008 +#define HC_SIMA_HFPClipLL 0x0009 +#define HC_SIMA_HFPClipRL 0x000a +#define HC_SIMA_HFPClipTBH 0x000b +#define HC_SIMA_HFPClipLRH 0x000c +#define HC_SIMA_HLP 0x000d +#define HC_SIMA_HLPRF 0x000e +#define HC_SIMA_HSolidCL 0x000f +#define HC_SIMA_HPixGC 0x0010 +#define HC_SIMA_HSPXYOS 0x0011 +#define HC_SIMA_HCmdA 0x0012 +#define HC_SIMA_HCmdB 0x0013 +#define HC_SIMA_HEnable 0x0014 +#define HC_SIMA_HZWBBasL 0x0015 +#define HC_SIMA_HZWBBasH 0x0016 +#define HC_SIMA_HZWBType 0x0017 +#define HC_SIMA_HZBiasL 0x0018 +#define HC_SIMA_HZWBend 0x0019 +#define HC_SIMA_HZWTMD 0x001a +#define HC_SIMA_HZWCDL 0x001b +#define HC_SIMA_HZWCTAGnum 0x001c +#define HC_SIMA_HZCYNum 0x001d +#define HC_SIMA_HZWCFire 0x001e +/* #define HC_SIMA_HSBBasL 0x001d */ +/* #define HC_SIMA_HSBBasH 0x001e */ +/* #define HC_SIMA_HSBFM 0x001f */ +#define HC_SIMA_HSTREF 0x0020 +#define HC_SIMA_HSTMD 0x0021 +#define HC_SIMA_HABBasL 0x0022 +#define HC_SIMA_HABBasH 0x0023 +#define HC_SIMA_HABFM 0x0024 +#define HC_SIMA_HATMD 0x0025 +#define HC_SIMA_HABLCsat 0x0026 +#define HC_SIMA_HABLCop 0x0027 +#define HC_SIMA_HABLAsat 0x0028 +#define HC_SIMA_HABLAop 0x0029 +#define HC_SIMA_HABLRCa 0x002a +#define HC_SIMA_HABLRFCa 0x002b +#define HC_SIMA_HABLRCbias 0x002c +#define HC_SIMA_HABLRCb 0x002d +#define HC_SIMA_HABLRFCb 0x002e +#define HC_SIMA_HABLRAa 0x002f +#define HC_SIMA_HABLRAb 0x0030 +#define HC_SIMA_HDBBasL 0x0031 +#define HC_SIMA_HDBBasH 0x0032 +#define HC_SIMA_HDBFM 0x0033 +#define HC_SIMA_HFBBMSKL 0x0034 +#define HC_SIMA_HROP 0x0035 +#define HC_SIMA_HFogLF 0x0036 +#define HC_SIMA_HFogCL 0x0037 +#define HC_SIMA_HFogCH 0x0038 +#define HC_SIMA_HFogStL 0x0039 +#define HC_SIMA_HFogStH 0x003a +#define HC_SIMA_HFogOOdMF 0x003b +#define HC_SIMA_HFogOOdEF 0x003c +#define HC_SIMA_HFogEndL 0x003d +#define HC_SIMA_HFogDenst 0x003e +/*---- start of texture 0 setting ---- + */ +#define HC_SIMA_HTX0L0BasL 0x0040 +#define HC_SIMA_HTX0L1BasL 0x0041 +#define HC_SIMA_HTX0L2BasL 0x0042 +#define HC_SIMA_HTX0L3BasL 0x0043 +#define HC_SIMA_HTX0L4BasL 0x0044 +#define HC_SIMA_HTX0L5BasL 0x0045 +#define HC_SIMA_HTX0L6BasL 0x0046 +#define HC_SIMA_HTX0L7BasL 0x0047 +#define HC_SIMA_HTX0L8BasL 0x0048 +#define HC_SIMA_HTX0L9BasL 0x0049 +#define HC_SIMA_HTX0LaBasL 0x004a +#define HC_SIMA_HTX0LbBasL 0x004b +#define HC_SIMA_HTX0LcBasL 0x004c +#define HC_SIMA_HTX0LdBasL 0x004d +#define HC_SIMA_HTX0LeBasL 0x004e +#define HC_SIMA_HTX0LfBasL 0x004f +#define HC_SIMA_HTX0L10BasL 0x0050 +#define HC_SIMA_HTX0L11BasL 0x0051 +#define HC_SIMA_HTX0L012BasH 0x0052 +#define HC_SIMA_HTX0L345BasH 0x0053 +#define HC_SIMA_HTX0L678BasH 0x0054 +#define HC_SIMA_HTX0L9abBasH 0x0055 +#define HC_SIMA_HTX0LcdeBasH 0x0056 +#define HC_SIMA_HTX0Lf1011BasH 0x0057 +#define HC_SIMA_HTX0L0Pit 0x0058 +#define HC_SIMA_HTX0L1Pit 0x0059 +#define HC_SIMA_HTX0L2Pit 0x005a +#define HC_SIMA_HTX0L3Pit 0x005b +#define HC_SIMA_HTX0L4Pit 0x005c +#define HC_SIMA_HTX0L5Pit 0x005d +#define HC_SIMA_HTX0L6Pit 0x005e +#define HC_SIMA_HTX0L7Pit 0x005f +#define HC_SIMA_HTX0L8Pit 0x0060 +#define HC_SIMA_HTX0L9Pit 0x0061 +#define HC_SIMA_HTX0LaPit 0x0062 +#define HC_SIMA_HTX0LbPit 0x0063 +#define HC_SIMA_HTX0LcPit 0x0064 +#define HC_SIMA_HTX0LdPit 0x0065 +#define HC_SIMA_HTX0LePit 0x0066 +#define HC_SIMA_HTX0LfPit 0x0067 +#define HC_SIMA_HTX0L10Pit 0x0068 +#define HC_SIMA_HTX0L11Pit 0x0069 +#define HC_SIMA_HTX0L0_5WE 0x006a +#define HC_SIMA_HTX0L6_bWE 0x006b +#define HC_SIMA_HTX0Lc_11WE 0x006c +#define HC_SIMA_HTX0L0_5HE 0x006d +#define HC_SIMA_HTX0L6_bHE 0x006e +#define HC_SIMA_HTX0Lc_11HE 0x006f +#define HC_SIMA_HTX0L0OS 0x0070 +#define HC_SIMA_HTX0TB 0x0071 +#define HC_SIMA_HTX0MPMD 0x0072 +#define HC_SIMA_HTX0CLODu 0x0073 +#define HC_SIMA_HTX0FM 0x0074 +#define HC_SIMA_HTX0TRCH 0x0075 +#define HC_SIMA_HTX0TRCL 0x0076 +#define HC_SIMA_HTX0TBC 0x0077 +#define HC_SIMA_HTX0TRAH 0x0078 +#define HC_SIMA_HTX0TBLCsat 0x0079 +#define HC_SIMA_HTX0TBLCop 0x007a +#define HC_SIMA_HTX0TBLMPfog 0x007b +#define HC_SIMA_HTX0TBLAsat 0x007c +#define HC_SIMA_HTX0TBLRCa 0x007d +#define HC_SIMA_HTX0TBLRCb 0x007e +#define HC_SIMA_HTX0TBLRCc 0x007f +#define HC_SIMA_HTX0TBLRCbias 0x0080 +#define HC_SIMA_HTX0TBLRAa 0x0081 +#define HC_SIMA_HTX0TBLRFog 0x0082 +#define HC_SIMA_HTX0BumpM00 0x0083 +#define HC_SIMA_HTX0BumpM01 0x0084 +#define HC_SIMA_HTX0BumpM10 0x0085 +#define HC_SIMA_HTX0BumpM11 0x0086 +#define HC_SIMA_HTX0LScale 0x0087 +/*---- end of texture 0 setting ---- 0x008f + */ +#define HC_SIMA_TX0TX1_OFF 0x0050 +/*---- start of texture 1 setting ---- + */ +#define HC_SIMA_HTX1L0BasL (HC_SIMA_HTX0L0BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L1BasL (HC_SIMA_HTX0L1BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L2BasL (HC_SIMA_HTX0L2BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L3BasL (HC_SIMA_HTX0L3BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L4BasL (HC_SIMA_HTX0L4BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L5BasL (HC_SIMA_HTX0L5BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L6BasL (HC_SIMA_HTX0L6BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L7BasL (HC_SIMA_HTX0L7BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L8BasL (HC_SIMA_HTX0L8BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L9BasL (HC_SIMA_HTX0L9BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LaBasL (HC_SIMA_HTX0LaBasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LbBasL (HC_SIMA_HTX0LbBasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LcBasL (HC_SIMA_HTX0LcBasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LdBasL (HC_SIMA_HTX0LdBasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LeBasL (HC_SIMA_HTX0LeBasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LfBasL (HC_SIMA_HTX0LfBasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L10BasL (HC_SIMA_HTX0L10BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L11BasL (HC_SIMA_HTX0L11BasL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L012BasH (HC_SIMA_HTX0L012BasH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L345BasH (HC_SIMA_HTX0L345BasH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L678BasH (HC_SIMA_HTX0L678BasH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L9abBasH (HC_SIMA_HTX0L9abBasH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LcdeBasH (HC_SIMA_HTX0LcdeBasH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1Lf1011BasH (HC_SIMA_HTX0Lf1011BasH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L0Pit (HC_SIMA_HTX0L0Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L1Pit (HC_SIMA_HTX0L1Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L2Pit (HC_SIMA_HTX0L2Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L3Pit (HC_SIMA_HTX0L3Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L4Pit (HC_SIMA_HTX0L4Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L5Pit (HC_SIMA_HTX0L5Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L6Pit (HC_SIMA_HTX0L6Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L7Pit (HC_SIMA_HTX0L7Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L8Pit (HC_SIMA_HTX0L8Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L9Pit (HC_SIMA_HTX0L9Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LaPit (HC_SIMA_HTX0LaPit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LbPit (HC_SIMA_HTX0LbPit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LcPit (HC_SIMA_HTX0LcPit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LdPit (HC_SIMA_HTX0LdPit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LePit (HC_SIMA_HTX0LePit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LfPit (HC_SIMA_HTX0LfPit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L10Pit (HC_SIMA_HTX0L10Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L11Pit (HC_SIMA_HTX0L11Pit + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L0_5WE (HC_SIMA_HTX0L0_5WE + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L6_bWE (HC_SIMA_HTX0L6_bWE + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1Lc_11WE (HC_SIMA_HTX0Lc_11WE + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L0_5HE (HC_SIMA_HTX0L0_5HE + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L6_bHE (HC_SIMA_HTX0L6_bHE + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1Lc_11HE (HC_SIMA_HTX0Lc_11HE + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1L0OS (HC_SIMA_HTX0L0OS + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TB (HC_SIMA_HTX0TB + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1MPMD (HC_SIMA_HTX0MPMD + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1CLODu (HC_SIMA_HTX0CLODu + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1FM (HC_SIMA_HTX0FM + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TRCH (HC_SIMA_HTX0TRCH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TRCL (HC_SIMA_HTX0TRCL + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBC (HC_SIMA_HTX0TBC + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TRAH (HC_SIMA_HTX0TRAH + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LTC (HC_SIMA_HTX0LTC + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LTA (HC_SIMA_HTX0LTA + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLCsat (HC_SIMA_HTX0TBLCsat + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLCop (HC_SIMA_HTX0TBLCop + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLMPfog (HC_SIMA_HTX0TBLMPfog + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLAsat (HC_SIMA_HTX0TBLAsat + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLRCa (HC_SIMA_HTX0TBLRCa + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLRCb (HC_SIMA_HTX0TBLRCb + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLRCc (HC_SIMA_HTX0TBLRCc + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLRCbias (HC_SIMA_HTX0TBLRCbias + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLRAa (HC_SIMA_HTX0TBLRAa + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1TBLRFog (HC_SIMA_HTX0TBLRFog + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1BumpM00 (HC_SIMA_HTX0BumpM00 + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1BumpM01 (HC_SIMA_HTX0BumpM01 + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1BumpM10 (HC_SIMA_HTX0BumpM10 + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1BumpM11 (HC_SIMA_HTX0BumpM11 + HC_SIMA_TX0TX1_OFF) +#define HC_SIMA_HTX1LScale (HC_SIMA_HTX0LScale + HC_SIMA_TX0TX1_OFF) +/*---- end of texture 1 setting ---- 0xaf + */ +#define HC_SIMA_HTXSMD 0x00b0 +#define HC_SIMA_HenFIFOAT 0x00b1 +#define HC_SIMA_HFBDrawFirst 0x00b2 +#define HC_SIMA_HFBBasL 0x00b3 +#define HC_SIMA_HTArbRCM 0x00b4 +#define HC_SIMA_HTArbRZ 0x00b5 +#define HC_SIMA_HTArbWZ 0x00b6 +#define HC_SIMA_HTArbRTX 0x00b7 +#define HC_SIMA_HTArbRCW 0x00b8 +#define HC_SIMA_HTArbE2 0x00b9 +#define HC_SIMA_HGEMITout 0x00ba +#define HC_SIMA_HFthRTXD 0x00bb +#define HC_SIMA_HFthRTXA 0x00bc +/* Define the texture palette 0 + */ +#define HC_SIMA_HTP0 0x0100 +#define HC_SIMA_HTP1 0x0200 +#define HC_SIMA_FOGTABLE 0x0300 +#define HC_SIMA_STIPPLE 0x0400 +#define HC_SIMA_HE3Fire 0x0440 +#define HC_SIMA_TRANS_SET 0x0441 +#define HC_SIMA_HREngSt 0x0442 +#define HC_SIMA_HRFIFOempty 0x0443 +#define HC_SIMA_HRFIFOfull 0x0444 +#define HC_SIMA_HRErr 0x0445 +#define HC_SIMA_FIFOstatus 0x0446 + +/****************************************************************************** +** Define the AGP command header. +******************************************************************************/ +#define HC_ACMD_MASK 0xfe000000 +#define HC_ACMD_SUB_MASK 0x0c000000 +#define HC_ACMD_HCmdA 0xee000000 +#define HC_ACMD_HCmdB 0xec000000 +#define HC_ACMD_HCmdC 0xea000000 +#define HC_ACMD_H1 0xf0000000 +#define HC_ACMD_H2 0xf2000000 +#define HC_ACMD_H3 0xf4000000 +#define HC_ACMD_H4 0xf6000000 + +#define HC_ACMD_H1IO_MASK 0x000001ff +#define HC_ACMD_H2IO1_MASK 0x001ff000 +#define HC_ACMD_H2IO2_MASK 0x000001ff +#define HC_ACMD_H2IO1_SHIFT 12 +#define HC_ACMD_H2IO2_SHIFT 0 +#define HC_ACMD_H3IO_MASK 0x000001ff +#define HC_ACMD_H3COUNT_MASK 0x01fff000 +#define HC_ACMD_H3COUNT_SHIFT 12 +#define HC_ACMD_H4ID_MASK 0x000001ff +#define HC_ACMD_H4COUNT_MASK 0x01fffe00 +#define HC_ACMD_H4COUNT_SHIFT 9 + +/******************************************************************************** +** Define Header +********************************************************************************/ +#define HC_HEADER2 0xF210F110 + +/******************************************************************************** +** Define Dummy Value +********************************************************************************/ +#define HC_DUMMY 0xCCCCCCCC +/******************************************************************************** +** Define for DMA use +********************************************************************************/ +#define HALCYON_HEADER2 0XF210F110 +#define HALCYON_FIRECMD 0XEE100000 +#define HALCYON_FIREMASK 0XFFF00000 +#define HALCYON_CMDB 0XEC000000 +#define HALCYON_CMDBMASK 0XFFFE0000 +#define HALCYON_SUB_ADDR0 0X00000000 +#define HALCYON_HEADER1MASK 0XFFFFFC00 +#define HALCYON_HEADER1 0XF0000000 +#define HC_SubA_HAGPBstL 0x0060 +#define HC_SubA_HAGPBendL 0x0061 +#define HC_SubA_HAGPCMNT 0x0062 +#define HC_SubA_HAGPBpL 0x0063 +#define HC_SubA_HAGPBpH 0x0064 +#define HC_HAGPCMNT_MASK 0x00800000 +#define HC_HCmdErrClr_MASK 0x00400000 +#define HC_HAGPBendH_MASK 0x0000ff00 +#define HC_HAGPBstH_MASK 0x000000ff +#define HC_HAGPBendH_SHIFT 8 +#define HC_HAGPBstH_SHIFT 0 +#define HC_HAGPBpL_MASK 0x00fffffc +#define HC_HAGPBpID_MASK 0x00000003 +#define HC_HAGPBpID_PAUSE 0x00000000 +#define HC_HAGPBpID_JUMP 0x00000001 +#define HC_HAGPBpID_STOP 0x00000002 +#define HC_HAGPBpH_MASK 0x00ffffff + +#define VIA_VIDEO_HEADER5 0xFE040000 +#define VIA_VIDEO_HEADER6 0xFE050000 +#define VIA_VIDEO_HEADER7 0xFE060000 +#define VIA_VIDEOMASK 0xFFFF0000 +#endif diff --git a/sys/dev/drm/via_dma.c b/sys/dev/drm/via_dma.c new file mode 100644 index 000000000000..e1af2938072a --- /dev/null +++ b/sys/dev/drm/via_dma.c @@ -0,0 +1,760 @@ +/* via_dma.c -- DMA support for the VIA Unichrome/Pro + * + * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Copyright 2004 Digeo, Inc., Palo Alto, CA, U.S.A. + * All Rights Reserved. + * + * Copyright 2004 The Unichrome project. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Tungsten Graphics, + * Erdi Chen, + * Thomas Hellstrom. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "dev/drm/drmP.h" +#include "dev/drm/drm.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_drv.h" +#include "dev/drm/via_3d_reg.h" + +#define CMDBUF_ALIGNMENT_SIZE (0x100) +#define CMDBUF_ALIGNMENT_MASK (0x0ff) + +/* defines for VIA 3D registers */ +#define VIA_REG_STATUS 0x400 +#define VIA_REG_TRANSET 0x43C +#define VIA_REG_TRANSPACE 0x440 + +/* VIA_REG_STATUS(0x400): Engine Status */ +#define VIA_CMD_RGTR_BUSY 0x00000080 /* Command Regulator is busy */ +#define VIA_2D_ENG_BUSY 0x00000001 /* 2D Engine is busy */ +#define VIA_3D_ENG_BUSY 0x00000002 /* 3D Engine is busy */ +#define VIA_VR_QUEUE_BUSY 0x00020000 /* Virtual Queue is busy */ + +#define SetReg2DAGP(nReg, nData) { \ + *((uint32_t *)(vb)) = ((nReg) >> 2) | HALCYON_HEADER1; \ + *((uint32_t *)(vb) + 1) = (nData); \ + vb = ((uint32_t *)vb) + 2; \ + dev_priv->dma_low +=8; \ +} + +#define via_flush_write_combine() DRM_MEMORYBARRIER() + +#define VIA_OUT_RING_QW(w1,w2) \ + *vb++ = (w1); \ + *vb++ = (w2); \ + dev_priv->dma_low += 8; + +static void via_cmdbuf_start(drm_via_private_t * dev_priv); +static void via_cmdbuf_pause(drm_via_private_t * dev_priv); +static void via_cmdbuf_reset(drm_via_private_t * dev_priv); +static void via_cmdbuf_rewind(drm_via_private_t * dev_priv); +static int via_wait_idle(drm_via_private_t * dev_priv); +static void via_pad_cache(drm_via_private_t * dev_priv, int qwords); + +/* + * Free space in command buffer. + */ + +static uint32_t via_cmdbuf_space(drm_via_private_t * dev_priv) +{ + uint32_t agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr; + uint32_t hw_addr = *(dev_priv->hw_addr_ptr) - agp_base; + + return ((hw_addr <= dev_priv->dma_low) ? + (dev_priv->dma_high + hw_addr - dev_priv->dma_low) : + (hw_addr - dev_priv->dma_low)); +} + +/* + * How much does the command regulator lag behind? + */ + +static uint32_t via_cmdbuf_lag(drm_via_private_t * dev_priv) +{ + uint32_t agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr; + uint32_t hw_addr = *(dev_priv->hw_addr_ptr) - agp_base; + + return ((hw_addr <= dev_priv->dma_low) ? + (dev_priv->dma_low - hw_addr) : + (dev_priv->dma_wrap + dev_priv->dma_low - hw_addr)); +} + +/* + * Check that the given size fits in the buffer, otherwise wait. + */ + +static inline int +via_cmdbuf_wait(drm_via_private_t * dev_priv, unsigned int size) +{ + uint32_t agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr; + uint32_t cur_addr, hw_addr, next_addr; + volatile uint32_t *hw_addr_ptr; + uint32_t count; + hw_addr_ptr = dev_priv->hw_addr_ptr; + cur_addr = dev_priv->dma_low; + next_addr = cur_addr + size + 512 * 1024; + count = 1000000; + do { + hw_addr = *hw_addr_ptr - agp_base; + if (count-- == 0) { + DRM_ERROR + ("via_cmdbuf_wait timed out hw %x cur_addr %x next_addr %x\n", + hw_addr, cur_addr, next_addr); + return -1; + } + if ((cur_addr < hw_addr) && (next_addr >= hw_addr)) + DRM_UDELAY(1000); + } while ((cur_addr < hw_addr) && (next_addr >= hw_addr)); + return 0; +} + +/* + * Checks whether buffer head has reach the end. Rewind the ring buffer + * when necessary. + * + * Returns virtual pointer to ring buffer. + */ + +static inline uint32_t *via_check_dma(drm_via_private_t * dev_priv, + unsigned int size) +{ + if ((dev_priv->dma_low + size + 4 * CMDBUF_ALIGNMENT_SIZE) > + dev_priv->dma_high) { + via_cmdbuf_rewind(dev_priv); + } + if (via_cmdbuf_wait(dev_priv, size) != 0) { + return NULL; + } + + return (uint32_t *) (dev_priv->dma_ptr + dev_priv->dma_low); +} + +int via_dma_cleanup(struct drm_device * dev) +{ + if (dev->dev_private) { + drm_via_private_t *dev_priv = + (drm_via_private_t *) dev->dev_private; + + if (dev_priv->ring.virtual_start) { + via_cmdbuf_reset(dev_priv); + + drm_core_ioremapfree(&dev_priv->ring.map, dev); + dev_priv->ring.virtual_start = NULL; + } + + } + + return 0; +} + +static int via_initialize(struct drm_device * dev, + drm_via_private_t * dev_priv, + drm_via_dma_init_t * init) +{ + if (!dev_priv || !dev_priv->mmio) { + DRM_ERROR("via_dma_init called before via_map_init\n"); + return -EFAULT; + } + + if (dev_priv->ring.virtual_start != NULL) { + DRM_ERROR("called again without calling cleanup\n"); + return -EFAULT; + } + + if (!dev->agp || !dev->agp->base) { + DRM_ERROR("called with no agp memory available\n"); + return -EFAULT; + } + + if (dev_priv->chipset == VIA_DX9_0) { + DRM_ERROR("AGP DMA is not supported on this chip\n"); + return -EINVAL; + } + + dev_priv->ring.map.offset = dev->agp->base + init->offset; + dev_priv->ring.map.size = init->size; + dev_priv->ring.map.type = 0; + dev_priv->ring.map.flags = 0; + dev_priv->ring.map.mtrr = 0; + + drm_core_ioremap_wc(&dev_priv->ring.map, dev); + + if (dev_priv->ring.map.handle == NULL) { + via_dma_cleanup(dev); + DRM_ERROR("can not ioremap virtual address for" + " ring buffer\n"); + return -ENOMEM; + } + + dev_priv->ring.virtual_start = dev_priv->ring.map.handle; + + dev_priv->dma_ptr = dev_priv->ring.virtual_start; + dev_priv->dma_low = 0; + dev_priv->dma_high = init->size; + dev_priv->dma_wrap = init->size; + dev_priv->dma_offset = init->offset; + dev_priv->last_pause_ptr = NULL; + dev_priv->hw_addr_ptr = + (volatile uint32_t *)((char *)dev_priv->mmio->handle + + init->reg_pause_addr); + + via_cmdbuf_start(dev_priv); + + return 0; +} + +static int via_dma_init(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + drm_via_dma_init_t *init = data; + int retcode = 0; + + switch (init->func) { + case VIA_INIT_DMA: + if (!DRM_SUSER(DRM_CURPROC)) + retcode = -EPERM; + else + retcode = via_initialize(dev, dev_priv, init); + break; + case VIA_CLEANUP_DMA: + if (!DRM_SUSER(DRM_CURPROC)) + retcode = -EPERM; + else + retcode = via_dma_cleanup(dev); + break; + case VIA_DMA_INITIALIZED: + retcode = (dev_priv->ring.virtual_start != NULL) ? + 0 : -EFAULT; + break; + default: + retcode = -EINVAL; + break; + } + + return retcode; +} + +static int via_dispatch_cmdbuffer(struct drm_device * dev, drm_via_cmdbuffer_t * cmd) +{ + drm_via_private_t *dev_priv; + uint32_t *vb; + int ret; + + dev_priv = (drm_via_private_t *) dev->dev_private; + + if (dev_priv->ring.virtual_start == NULL) { + DRM_ERROR("called without initializing AGP ring buffer.\n"); + return -EFAULT; + } + + if (cmd->size > VIA_PCI_BUF_SIZE) { + return -ENOMEM; + } + + if (DRM_COPY_FROM_USER(dev_priv->pci_buf, cmd->buf, cmd->size)) + return -EFAULT; + + /* + * Running this function on AGP memory is dead slow. Therefore + * we run it on a temporary cacheable system memory buffer and + * copy it to AGP memory when ready. + */ + + if ((ret = + via_verify_command_stream((uint32_t *) dev_priv->pci_buf, + cmd->size, dev, 1))) { + return ret; + } + + vb = via_check_dma(dev_priv, (cmd->size < 0x100) ? 0x102 : cmd->size); + if (vb == NULL) { + return -EAGAIN; + } + + memcpy(vb, dev_priv->pci_buf, cmd->size); + + dev_priv->dma_low += cmd->size; + + /* + * Small submissions somehow stalls the CPU. (AGP cache effects?) + * pad to greater size. + */ + + if (cmd->size < 0x100) + via_pad_cache(dev_priv, (0x100 - cmd->size) >> 3); + via_cmdbuf_pause(dev_priv); + + return 0; +} + +int via_driver_dma_quiescent(struct drm_device * dev) +{ + drm_via_private_t *dev_priv = dev->dev_private; + + if (!via_wait_idle(dev_priv)) { + return -EBUSY; + } + return 0; +} + +static int via_flush_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + + LOCK_TEST_WITH_RETURN(dev, file_priv); + + return via_driver_dma_quiescent(dev); +} + +static int via_cmdbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_cmdbuffer_t *cmdbuf = data; + int ret; + + LOCK_TEST_WITH_RETURN(dev, file_priv); + + DRM_DEBUG("buf %p size %lu\n", cmdbuf->buf, cmdbuf->size); + + ret = via_dispatch_cmdbuffer(dev, cmdbuf); + if (ret) { + return ret; + } + + return 0; +} + +static int via_dispatch_pci_cmdbuffer(struct drm_device * dev, + drm_via_cmdbuffer_t * cmd) +{ + drm_via_private_t *dev_priv = dev->dev_private; + int ret; + + if (cmd->size > VIA_PCI_BUF_SIZE) { + return -ENOMEM; + } + if (DRM_COPY_FROM_USER(dev_priv->pci_buf, cmd->buf, cmd->size)) + return -EFAULT; + + if ((ret = + via_verify_command_stream((uint32_t *) dev_priv->pci_buf, + cmd->size, dev, 0))) { + return ret; + } + + ret = + via_parse_command_stream(dev, (const uint32_t *)dev_priv->pci_buf, + cmd->size); + return ret; +} + +static int via_pci_cmdbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_cmdbuffer_t *cmdbuf = data; + int ret; + + LOCK_TEST_WITH_RETURN(dev, file_priv); + + DRM_DEBUG("buf %p size %lu\n", cmdbuf->buf, cmdbuf->size); + + ret = via_dispatch_pci_cmdbuffer(dev, cmdbuf); + if (ret) { + return ret; + } + + return 0; +} + +static inline uint32_t *via_align_buffer(drm_via_private_t * dev_priv, + uint32_t * vb, int qw_count) +{ + for (; qw_count > 0; --qw_count) { + VIA_OUT_RING_QW(HC_DUMMY, HC_DUMMY); + } + return vb; +} + +/* + * This function is used internally by ring buffer management code. + * + * Returns virtual pointer to ring buffer. + */ +static inline uint32_t *via_get_dma(drm_via_private_t * dev_priv) +{ + return (uint32_t *) (dev_priv->dma_ptr + dev_priv->dma_low); +} + +/* + * Hooks a segment of data into the tail of the ring-buffer by + * modifying the pause address stored in the buffer itself. If + * the regulator has already paused, restart it. + */ +static int via_hook_segment(drm_via_private_t * dev_priv, + uint32_t pause_addr_hi, uint32_t pause_addr_lo, + int no_pci_fire) +{ + int paused, count; + volatile uint32_t *paused_at = dev_priv->last_pause_ptr; + uint32_t reader,ptr; + uint32_t diff; + + paused = 0; + via_flush_write_combine(); + (void) *(volatile uint32_t *)(via_get_dma(dev_priv) -1); + + *paused_at = pause_addr_lo; + via_flush_write_combine(); + (void) *paused_at; + + reader = *(dev_priv->hw_addr_ptr); + ptr = ((volatile char *)paused_at - dev_priv->dma_ptr) + + dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4; + + dev_priv->last_pause_ptr = via_get_dma(dev_priv) - 1; + + /* + * If there is a possibility that the command reader will + * miss the new pause address and pause on the old one, + * In that case we need to program the new start address + * using PCI. + */ + + diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff; + count = 10000000; + while(diff == 0 && count--) { + paused = (VIA_READ(0x41c) & 0x80000000); + if (paused) + break; + reader = *(dev_priv->hw_addr_ptr); + diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff; + } + + paused = VIA_READ(0x41c) & 0x80000000; + + if (paused && !no_pci_fire) { + reader = *(dev_priv->hw_addr_ptr); + diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff; + diff &= (dev_priv->dma_high - 1); + if (diff != 0 && diff < (dev_priv->dma_high >> 1)) { + DRM_ERROR("Paused at incorrect address. " + "0x%08x, 0x%08x 0x%08x\n", + ptr, reader, dev_priv->dma_diff); + } else if (diff == 0) { + /* + * There is a concern that these writes may stall the PCI bus + * if the GPU is not idle. However, idling the GPU first + * doesn't make a difference. + */ + + VIA_WRITE(VIA_REG_TRANSET, (HC_ParaType_PreCR << 16)); + VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_hi); + VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_lo); + VIA_READ(VIA_REG_TRANSPACE); + } + } + return paused; +} + +static int via_wait_idle(drm_via_private_t * dev_priv) +{ + int count = 10000000; + + while (!(VIA_READ(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) && --count) + ; + + while (count && (VIA_READ(VIA_REG_STATUS) & + (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | + VIA_3D_ENG_BUSY))) + --count; + return count; +} + +static uint32_t *via_align_cmd(drm_via_private_t * dev_priv, uint32_t cmd_type, + uint32_t addr, uint32_t * cmd_addr_hi, + uint32_t * cmd_addr_lo, int skip_wait) +{ + uint32_t agp_base; + uint32_t cmd_addr, addr_lo, addr_hi; + uint32_t *vb; + uint32_t qw_pad_count; + + if (!skip_wait) + via_cmdbuf_wait(dev_priv, 2 * CMDBUF_ALIGNMENT_SIZE); + + vb = via_get_dma(dev_priv); + VIA_OUT_RING_QW(HC_HEADER2 | ((VIA_REG_TRANSET >> 2) << 12) | + (VIA_REG_TRANSPACE >> 2), HC_ParaType_PreCR << 16); + agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr; + qw_pad_count = (CMDBUF_ALIGNMENT_SIZE >> 3) - + ((dev_priv->dma_low & CMDBUF_ALIGNMENT_MASK) >> 3); + + cmd_addr = (addr) ? addr : + agp_base + dev_priv->dma_low - 8 + (qw_pad_count << 3); + addr_lo = ((HC_SubA_HAGPBpL << 24) | (cmd_type & HC_HAGPBpID_MASK) | + (cmd_addr & HC_HAGPBpL_MASK)); + addr_hi = ((HC_SubA_HAGPBpH << 24) | (cmd_addr >> 24)); + + vb = via_align_buffer(dev_priv, vb, qw_pad_count - 1); + VIA_OUT_RING_QW(*cmd_addr_hi = addr_hi, *cmd_addr_lo = addr_lo); + return vb; +} + +static void via_cmdbuf_start(drm_via_private_t * dev_priv) +{ + uint32_t pause_addr_lo, pause_addr_hi; + uint32_t start_addr, start_addr_lo; + uint32_t end_addr, end_addr_lo; + uint32_t command; + uint32_t agp_base; + uint32_t ptr; + uint32_t reader; + int count; + + dev_priv->dma_low = 0; + + agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr; + start_addr = agp_base; + end_addr = agp_base + dev_priv->dma_high; + + start_addr_lo = ((HC_SubA_HAGPBstL << 24) | (start_addr & 0xFFFFFF)); + end_addr_lo = ((HC_SubA_HAGPBendL << 24) | (end_addr & 0xFFFFFF)); + command = ((HC_SubA_HAGPCMNT << 24) | (start_addr >> 24) | + ((end_addr & 0xff000000) >> 16)); + + dev_priv->last_pause_ptr = + via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, + &pause_addr_hi, &pause_addr_lo, 1) - 1; + + via_flush_write_combine(); + (void) *(volatile uint32_t *)dev_priv->last_pause_ptr; + + VIA_WRITE(VIA_REG_TRANSET, (HC_ParaType_PreCR << 16)); + VIA_WRITE(VIA_REG_TRANSPACE, command); + VIA_WRITE(VIA_REG_TRANSPACE, start_addr_lo); + VIA_WRITE(VIA_REG_TRANSPACE, end_addr_lo); + + VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_hi); + VIA_WRITE(VIA_REG_TRANSPACE, pause_addr_lo); + DRM_WRITEMEMORYBARRIER(); + VIA_WRITE(VIA_REG_TRANSPACE, command | HC_HAGPCMNT_MASK); + VIA_READ(VIA_REG_TRANSPACE); + + dev_priv->dma_diff = 0; + + count = 10000000; + while (!(VIA_READ(0x41c) & 0x80000000) && count--); + + reader = *(dev_priv->hw_addr_ptr); + ptr = ((volatile char *)dev_priv->last_pause_ptr - dev_priv->dma_ptr) + + dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4; + + /* + * This is the difference between where we tell the + * command reader to pause and where it actually pauses. + * This differs between hw implementation so we need to + * detect it. + */ + + dev_priv->dma_diff = ptr - reader; +} + +static void via_pad_cache(drm_via_private_t * dev_priv, int qwords) +{ + uint32_t *vb; + + via_cmdbuf_wait(dev_priv, qwords + 2); + vb = via_get_dma(dev_priv); + VIA_OUT_RING_QW(HC_HEADER2, HC_ParaType_NotTex << 16); + via_align_buffer(dev_priv, vb, qwords); +} + +static inline void via_dummy_bitblt(drm_via_private_t * dev_priv) +{ + uint32_t *vb = via_get_dma(dev_priv); + SetReg2DAGP(0x0C, (0 | (0 << 16))); + SetReg2DAGP(0x10, 0 | (0 << 16)); + SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xAA000000); +} + +static void via_cmdbuf_jump(drm_via_private_t * dev_priv) +{ + uint32_t agp_base; + uint32_t pause_addr_lo, pause_addr_hi; + uint32_t jump_addr_lo, jump_addr_hi; + volatile uint32_t *last_pause_ptr; + uint32_t dma_low_save1, dma_low_save2; + + agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr; + via_align_cmd(dev_priv, HC_HAGPBpID_JUMP, 0, &jump_addr_hi, + &jump_addr_lo, 0); + + dev_priv->dma_wrap = dev_priv->dma_low; + + /* + * Wrap command buffer to the beginning. + */ + + dev_priv->dma_low = 0; + if (via_cmdbuf_wait(dev_priv, CMDBUF_ALIGNMENT_SIZE) != 0) { + DRM_ERROR("via_cmdbuf_jump failed\n"); + } + + via_dummy_bitblt(dev_priv); + via_dummy_bitblt(dev_priv); + + last_pause_ptr = + via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi, + &pause_addr_lo, 0) - 1; + via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi, + &pause_addr_lo, 0); + + *last_pause_ptr = pause_addr_lo; + dma_low_save1 = dev_priv->dma_low; + + /* + * Now, set a trap that will pause the regulator if it tries to rerun the old + * command buffer. (Which may happen if via_hook_segment detecs a command regulator pause + * and reissues the jump command over PCI, while the regulator has already taken the jump + * and actually paused at the current buffer end). + * There appears to be no other way to detect this condition, since the hw_addr_pointer + * does not seem to get updated immediately when a jump occurs. + */ + + last_pause_ptr = + via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi, + &pause_addr_lo, 0) - 1; + via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi, + &pause_addr_lo, 0); + *last_pause_ptr = pause_addr_lo; + + dma_low_save2 = dev_priv->dma_low; + dev_priv->dma_low = dma_low_save1; + via_hook_segment(dev_priv, jump_addr_hi, jump_addr_lo, 0); + dev_priv->dma_low = dma_low_save2; + via_hook_segment(dev_priv, pause_addr_hi, pause_addr_lo, 0); +} + + +static void via_cmdbuf_rewind(drm_via_private_t * dev_priv) +{ + via_cmdbuf_jump(dev_priv); +} + +static void via_cmdbuf_flush(drm_via_private_t * dev_priv, uint32_t cmd_type) +{ + uint32_t pause_addr_lo, pause_addr_hi; + + via_align_cmd(dev_priv, cmd_type, 0, &pause_addr_hi, &pause_addr_lo, 0); + via_hook_segment(dev_priv, pause_addr_hi, pause_addr_lo, 0); +} + +static void via_cmdbuf_pause(drm_via_private_t * dev_priv) +{ + via_cmdbuf_flush(dev_priv, HC_HAGPBpID_PAUSE); +} + +static void via_cmdbuf_reset(drm_via_private_t * dev_priv) +{ + via_cmdbuf_flush(dev_priv, HC_HAGPBpID_STOP); + via_wait_idle(dev_priv); +} + +/* + * User interface to the space and lag functions. + */ + +static int via_cmdbuf_size(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_cmdbuf_size_t *d_siz = data; + int ret = 0; + uint32_t tmp_size, count; + drm_via_private_t *dev_priv; + + DRM_DEBUG("\n"); + LOCK_TEST_WITH_RETURN(dev, file_priv); + + dev_priv = (drm_via_private_t *) dev->dev_private; + + if (dev_priv->ring.virtual_start == NULL) { + DRM_ERROR("called without initializing AGP ring buffer.\n"); + return -EFAULT; + } + + count = 1000000; + tmp_size = d_siz->size; + switch (d_siz->func) { + case VIA_CMDBUF_SPACE: + while (((tmp_size = via_cmdbuf_space(dev_priv)) < d_siz->size) + && --count) { + if (!d_siz->wait) { + break; + } + } + if (!count) { + DRM_ERROR("VIA_CMDBUF_SPACE timed out.\n"); + ret = -EAGAIN; + } + break; + case VIA_CMDBUF_LAG: + while (((tmp_size = via_cmdbuf_lag(dev_priv)) > d_siz->size) + && --count) { + if (!d_siz->wait) { + break; + } + } + if (!count) { + DRM_ERROR("VIA_CMDBUF_LAG timed out.\n"); + ret = -EAGAIN; + } + break; + default: + ret = -EFAULT; + } + d_siz->size = tmp_size; + + return ret; +} + +struct drm_ioctl_desc via_ioctls[] = { + DRM_IOCTL_DEF(DRM_VIA_ALLOCMEM, via_mem_alloc, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_FREEMEM, via_mem_free, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_AGP_INIT, via_agp_init, DRM_AUTH|DRM_MASTER), + DRM_IOCTL_DEF(DRM_VIA_FB_INIT, via_fb_init, DRM_AUTH|DRM_MASTER), + DRM_IOCTL_DEF(DRM_VIA_MAP_INIT, via_map_init, DRM_AUTH|DRM_MASTER), + DRM_IOCTL_DEF(DRM_VIA_DEC_FUTEX, via_decoder_futex, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_DMA_INIT, via_dma_init, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_CMDBUFFER, via_cmdbuffer, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_FLUSH, via_flush_ioctl, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_PCICMD, via_pci_cmdbuffer, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_CMDBUF_SIZE, via_cmdbuf_size, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_WAIT_IRQ, via_wait_irq, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_DMA_BLIT, via_dma_blit, DRM_AUTH), + DRM_IOCTL_DEF(DRM_VIA_BLIT_SYNC, via_dma_blit_sync, DRM_AUTH) +}; + +int via_max_ioctl = DRM_ARRAY_SIZE(via_ioctls); diff --git a/sys/dev/drm/via_dmablit.c b/sys/dev/drm/via_dmablit.c new file mode 100644 index 000000000000..ea449f1f9929 --- /dev/null +++ b/sys/dev/drm/via_dmablit.c @@ -0,0 +1,801 @@ +/* via_dmablit.c -- PCI DMA BitBlt support for the VIA Unichrome/Pro + * + * Copyright (C) 2005 Thomas Hellstrom, All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Thomas Hellstrom. + * Partially based on code obtained from Digeo Inc. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Unmaps the DMA mappings. + * FIXME: Is this a NoOp on x86? Also + * FIXME: What happens if this one is called and a pending blit has previously done + * the same DMA mappings? + */ + +#include "dev/drm/drmP.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_drv.h" +#include "dev/drm/via_dmablit.h" + +#define VIA_PGDN(x) (((unsigned long)(x)) & ~PAGE_MASK) +#define VIA_PGOFF(x) (((unsigned long)(x)) & PAGE_MASK) +#define VIA_PFN(x) ((unsigned long)(x) >> PAGE_SHIFT) + +typedef struct _drm_via_descriptor { + uint32_t mem_addr; + uint32_t dev_addr; + uint32_t size; + uint32_t next; +} drm_via_descriptor_t; + +static void via_dmablit_timer(void *arg); + +/* + * Unmap a DMA mapping. + */ +static void +via_unmap_blit_from_device(drm_via_sg_info_t *vsg) +{ + int num_desc = vsg->num_desc; + unsigned cur_descriptor_page = num_desc / vsg->descriptors_per_page; + unsigned descriptor_this_page = num_desc % vsg->descriptors_per_page; + drm_via_descriptor_t *desc_ptr = vsg->desc_pages[cur_descriptor_page] + + descriptor_this_page; + dma_addr_t next = vsg->chain_start; + + while(num_desc--) { + if (descriptor_this_page-- == 0) { + cur_descriptor_page--; + descriptor_this_page = vsg->descriptors_per_page - 1; + desc_ptr = vsg->desc_pages[cur_descriptor_page] + + descriptor_this_page; + } + next = (dma_addr_t) desc_ptr->next; + desc_ptr--; + } +} + + +/* + * If mode = 0, count how many descriptors are needed. + * If mode = 1, Map the DMA pages for the device, put together and map also the descriptors. + * Descriptors are run in reverse order by the hardware because we are not allowed to update the + * 'next' field without syncing calls when the descriptor is already mapped. + */ +static void +via_map_blit_for_device(const drm_via_dmablit_t *xfer, + drm_via_sg_info_t *vsg, int mode) +{ + unsigned cur_descriptor_page = 0; + unsigned num_descriptors_this_page = 0; + unsigned char *mem_addr = xfer->mem_addr; + unsigned char *cur_mem; + unsigned char *first_addr = (unsigned char *)VIA_PGDN(mem_addr); + uint32_t fb_addr = xfer->fb_addr; + uint32_t cur_fb; + unsigned long line_len; + unsigned remaining_len; + int num_desc = 0; + int cur_line; + dma_addr_t next = 0 | VIA_DMA_DPR_EC; + drm_via_descriptor_t *desc_ptr = NULL; + + if (mode == 1) + desc_ptr = vsg->desc_pages[cur_descriptor_page]; + + for (cur_line = 0; cur_line < xfer->num_lines; ++cur_line) { + + line_len = xfer->line_length; + cur_fb = fb_addr; + cur_mem = mem_addr; + + while (line_len > 0) { + + remaining_len = min(PAGE_SIZE - VIA_PGOFF(cur_mem), + line_len); + line_len -= remaining_len; + + if (mode == 1) { + desc_ptr->mem_addr = + VM_PAGE_TO_PHYS( + vsg->pages[VIA_PFN(cur_mem) - + VIA_PFN(first_addr)]) + VIA_PGOFF(cur_mem); + desc_ptr->dev_addr = cur_fb; + + desc_ptr->size = remaining_len; + desc_ptr->next = (uint32_t) next; + + next = vtophys(desc_ptr); + + desc_ptr++; + if (++num_descriptors_this_page >= vsg->descriptors_per_page) { + num_descriptors_this_page = 0; + desc_ptr = vsg->desc_pages[++cur_descriptor_page]; + } + } + + num_desc++; + cur_mem += remaining_len; + cur_fb += remaining_len; + } + + mem_addr += xfer->mem_stride; + fb_addr += xfer->fb_stride; + } + + if (mode == 1) { + vsg->chain_start = next; + vsg->state = dr_via_device_mapped; + } + vsg->num_desc = num_desc; +} + + +/* + * Function that frees up all resources for a blit. It is usable even if the + * blit info has only been partially built as long as the status enum is consistent + * with the actual status of the used resources. + */ +static void +via_free_sg_info(drm_via_sg_info_t *vsg) +{ + vm_page_t page; + int i; + + switch(vsg->state) { + case dr_via_device_mapped: + via_unmap_blit_from_device(vsg); + case dr_via_desc_pages_alloc: + for (i=0; inum_desc_pages; ++i) { + if (vsg->desc_pages[i] != NULL) + free(vsg->desc_pages[i], DRM_MEM_PAGES); + } + free(vsg->desc_pages, DRM_MEM_DRIVER); + case dr_via_pages_locked: + for (i=0; i < vsg->num_pages; ++i) { + if ( NULL != (page = vsg->pages[i])) { + vm_page_lock_queues(); + vm_page_unwire(page, 0); + vm_page_unlock_queues(); + } + } + case dr_via_pages_alloc: + free(vsg->pages, DRM_MEM_DRIVER); + default: + vsg->state = dr_via_sg_init; + } + free(vsg->bounce_buffer, DRM_MEM_DRIVER); + vsg->bounce_buffer = NULL; + vsg->free_on_sequence = 0; +} + + +/* + * Fire a blit engine. + */ +static void +via_fire_dmablit(struct drm_device *dev, drm_via_sg_info_t *vsg, int engine) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; + + VIA_WRITE(VIA_PCI_DMA_MAR0 + engine*0x10, 0); + VIA_WRITE(VIA_PCI_DMA_DAR0 + engine*0x10, 0); + VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DD | VIA_DMA_CSR_TD | + VIA_DMA_CSR_DE); + VIA_WRITE(VIA_PCI_DMA_MR0 + engine*0x04, VIA_DMA_MR_CM | VIA_DMA_MR_TDIE); + VIA_WRITE(VIA_PCI_DMA_BCR0 + engine*0x10, 0); + VIA_WRITE(VIA_PCI_DMA_DPR0 + engine*0x10, vsg->chain_start); + DRM_WRITEMEMORYBARRIER(); + VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DE | VIA_DMA_CSR_TS); + VIA_READ(VIA_PCI_DMA_CSR0 + engine*0x04); +} + + +/* + * Obtain a page pointer array and lock all pages into system memory. A segmentation violation will + * occur here if the calling user does not have access to the submitted address. + */ +static int +via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer) +{ + unsigned long first_pfn = VIA_PFN(xfer->mem_addr); + vm_page_t m; + vm_map_t map; + int i; + + map = &curproc->p_vmspace->vm_map; + + vsg->num_pages = VIA_PFN(xfer->mem_addr + + (xfer->num_lines * xfer->mem_stride -1)) - first_pfn + 1; + + /* Make sure that the user has access to these pages */ + for(i = 0; i < vsg->num_pages; i++) { + if (vm_fault_quick((caddr_t)xfer->mem_addr + IDX_TO_OFF(i), + VM_PROT_RW) < 0) + return (-EACCES); + } + + if (NULL == (vsg->pages = malloc(sizeof(vm_page_t) * vsg->num_pages, + DRM_MEM_DRIVER, M_NOWAIT | M_ZERO))) + return -ENOMEM; + + for(i = 0; i < vsg->num_pages; i++) { + m = pmap_extract_and_hold(map->pmap, + (vm_offset_t)xfer->mem_addr + IDX_TO_OFF(i), VM_PROT_RW); + if (m == NULL) + break; + vm_page_lock_queues(); + vm_page_wire(m); + vm_page_unhold(m); + vm_page_unlock_queues(); + vsg->pages[i] = m; + } + vsg->state = dr_via_pages_locked; + + if (i != vsg->num_pages) + return -EINVAL; + + DRM_DEBUG("DMA pages locked\n"); + + return 0; +} + + +/* + * Allocate DMA capable memory for the blit descriptor chain, and an array that keeps track of the + * pages we allocate. We don't want to use kmalloc for the descriptor chain because it may be + * quite large for some blits, and pages don't need to be contingous. + */ +static int +via_alloc_desc_pages(drm_via_sg_info_t *vsg) +{ + int i; + + vsg->descriptors_per_page = PAGE_SIZE / sizeof(drm_via_descriptor_t); + vsg->num_desc_pages = (vsg->num_desc + vsg->descriptors_per_page - 1) / + vsg->descriptors_per_page; + + if (NULL == (vsg->desc_pages = malloc(vsg->num_desc_pages * + sizeof(void *), DRM_MEM_DRIVER, M_NOWAIT | M_ZERO))) + return -ENOMEM; + + vsg->state = dr_via_desc_pages_alloc; + for (i = 0; i < vsg->num_desc_pages; ++i) { + if (NULL == (vsg->desc_pages[i] = + (drm_via_descriptor_t *)malloc(PAGE_SIZE, DRM_MEM_PAGES, + M_NOWAIT | M_ZERO))) + return -ENOMEM; + } + DRM_DEBUG("Allocated %d pages for %d descriptors.\n", + vsg->num_desc_pages, vsg->num_desc); + + return 0; +} + + +static void +via_abort_dmablit(struct drm_device *dev, int engine) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; + + VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TA); +} + + +static void +via_dmablit_engine_off(struct drm_device *dev, int engine) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; + + VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TD | VIA_DMA_CSR_DD); +} + + +/* + * The dmablit part of the IRQ handler. Trying to do only reasonably fast things here. + * The rest, like unmapping and freeing memory for done blits is done in a separate workqueue + * task. Basically the task of the interrupt handler is to submit a new blit to the engine, while + * the workqueue task takes care of processing associated with the old blit. + */ +void +via_dmablit_handler(struct drm_device *dev, int engine, int from_irq) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; + drm_via_blitq_t *blitq = dev_priv->blit_queues + engine; + int cur; + int done_transfer; + uint32_t status = 0; + + DRM_DEBUG("DMA blit handler called. engine = %d, from_irq = %d, blitq = 0x%lx\n", + engine, from_irq, (unsigned long) blitq); + + mtx_lock(&blitq->blit_lock); + + done_transfer = blitq->is_active && + (( status = VIA_READ(VIA_PCI_DMA_CSR0 + engine*0x04)) & VIA_DMA_CSR_TD); + done_transfer = done_transfer || ( blitq->aborting && !(status & VIA_DMA_CSR_DE)); + + cur = blitq->cur; + if (done_transfer) { + + blitq->blits[cur]->aborted = blitq->aborting; + blitq->done_blit_handle++; + DRM_WAKEUP(&blitq->blit_queue[cur]); + + cur++; + if (cur >= VIA_NUM_BLIT_SLOTS) + cur = 0; + blitq->cur = cur; + + /* + * Clear transfer done flag. + */ + + VIA_WRITE(VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TD); + + blitq->is_active = 0; + blitq->aborting = 0; + + taskqueue_enqueue(taskqueue_swi, &blitq->wq); + + } else if (blitq->is_active && (ticks >= blitq->end)) { + + /* + * Abort transfer after one second. + */ + + via_abort_dmablit(dev, engine); + blitq->aborting = 1; + blitq->end = ticks + DRM_HZ; + } + + if (!blitq->is_active) { + if (blitq->num_outstanding) { + via_fire_dmablit(dev, blitq->blits[cur], engine); + blitq->is_active = 1; + blitq->cur = cur; + blitq->num_outstanding--; + blitq->end = ticks + DRM_HZ; + + if (!callout_pending(&blitq->poll_timer)) + callout_reset(&blitq->poll_timer, + 1, (timeout_t *)via_dmablit_timer, + (void *)blitq); + } else { + if (callout_pending(&blitq->poll_timer)) { + callout_stop(&blitq->poll_timer); + } + via_dmablit_engine_off(dev, engine); + } + } + + mtx_unlock(&blitq->blit_lock); +} + + +/* + * Check whether this blit is still active, performing necessary locking. + */ +static int +via_dmablit_active(drm_via_blitq_t *blitq, int engine, uint32_t handle, wait_queue_head_t **queue) +{ + uint32_t slot; + int active; + + mtx_lock(&blitq->blit_lock); + + /* + * Allow for handle wraparounds. + */ + active = ((blitq->done_blit_handle - handle) > (1 << 23)) && + ((blitq->cur_blit_handle - handle) <= (1 << 23)); + + if (queue && active) { + slot = handle - blitq->done_blit_handle + blitq->cur -1; + if (slot >= VIA_NUM_BLIT_SLOTS) { + slot -= VIA_NUM_BLIT_SLOTS; + } + *queue = blitq->blit_queue + slot; + } + + mtx_unlock(&blitq->blit_lock); + + return active; +} + + +/* + * Sync. Wait for at least three seconds for the blit to be performed. + */ +static int +via_dmablit_sync(struct drm_device *dev, uint32_t handle, int engine) +{ + + drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; + drm_via_blitq_t *blitq = dev_priv->blit_queues + engine; + wait_queue_head_t *queue; + int ret = 0; + + if (via_dmablit_active(blitq, engine, handle, &queue)) { + DRM_WAIT_ON(ret, *queue, 3 * DRM_HZ, + !via_dmablit_active(blitq, engine, handle, NULL)); + } + DRM_DEBUG("DMA blit sync handle 0x%x engine %d returned %d\n", + handle, engine, ret); + + return ret; +} + + +/* + * A timer that regularly polls the blit engine in cases where we don't have interrupts: + * a) Broken hardware (typically those that don't have any video capture facility). + * b) Blit abort. The hardware doesn't send an interrupt when a blit is aborted. + * The timer and hardware IRQ's can and do work in parallel. If the hardware has + * irqs, it will shorten the latency somewhat. + */ +static void +via_dmablit_timer(void *arg) +{ + drm_via_blitq_t *blitq = (drm_via_blitq_t *)arg; + struct drm_device *dev = blitq->dev; + int engine = (int) + (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues); + + DRM_DEBUG("Polling timer called for engine %d, jiffies %lu\n", engine, + (unsigned long) jiffies); + + via_dmablit_handler(dev, engine, 0); + + if (!callout_pending(&blitq->poll_timer)) { + callout_schedule(&blitq->poll_timer, 1); + + /* + * Rerun handler to delete timer if engines are off, and + * to shorten abort latency. This is a little nasty. + */ + + via_dmablit_handler(dev, engine, 0); + + } +} + + +/* + * Workqueue task that frees data and mappings associated with a blit. + * Also wakes up waiting processes. Each of these tasks handles one + * blit engine only and may not be called on each interrupt. + */ +static void +via_dmablit_workqueue(void *arg, int pending) +{ + drm_via_blitq_t *blitq = (drm_via_blitq_t *)arg; + struct drm_device *dev = blitq->dev; + drm_via_sg_info_t *cur_sg; + int cur_released; + + + DRM_DEBUG("task called for blit engine %ld\n",(unsigned long) + (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues)); + + mtx_lock(&blitq->blit_lock); + + while(blitq->serviced != blitq->cur) { + + cur_released = blitq->serviced++; + + DRM_DEBUG("Releasing blit slot %d\n", cur_released); + + if (blitq->serviced >= VIA_NUM_BLIT_SLOTS) + blitq->serviced = 0; + + cur_sg = blitq->blits[cur_released]; + blitq->num_free++; + + mtx_unlock(&blitq->blit_lock); + + DRM_WAKEUP(&blitq->busy_queue); + + via_free_sg_info(cur_sg); + free(cur_sg, DRM_MEM_DRIVER); + + mtx_lock(&blitq->blit_lock); + } + + mtx_unlock(&blitq->blit_lock); +} + + +/* + * Init all blit engines. Currently we use two, but some hardware have 4. + */ +void +via_init_dmablit(struct drm_device *dev) +{ + int i,j; + drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; + drm_via_blitq_t *blitq; + + for (i=0; i< VIA_NUM_BLIT_ENGINES; ++i) { + blitq = dev_priv->blit_queues + i; + blitq->dev = dev; + blitq->cur_blit_handle = 0; + blitq->done_blit_handle = 0; + blitq->head = 0; + blitq->cur = 0; + blitq->serviced = 0; + blitq->num_free = VIA_NUM_BLIT_SLOTS - 1; + blitq->num_outstanding = 0; + blitq->is_active = 0; + blitq->aborting = 0; + mtx_init(&blitq->blit_lock, "via_blit_lk", NULL, MTX_DEF); + for (j=0; jblit_queue + j); + } + DRM_INIT_WAITQUEUE(&blitq->busy_queue); + TASK_INIT(&blitq->wq, 0, via_dmablit_workqueue, blitq); + callout_init(&blitq->poll_timer, 0); + } +} + + +/* + * Build all info and do all mappings required for a blit. + */ +static int +via_build_sg_info(struct drm_device *dev, drm_via_sg_info_t *vsg, + drm_via_dmablit_t *xfer) +{ + int ret = 0; + + vsg->bounce_buffer = NULL; + + vsg->state = dr_via_sg_init; + + if (xfer->num_lines <= 0 || xfer->line_length <= 0) { + DRM_ERROR("Zero size bitblt.\n"); + return -EINVAL; + } + + /* + * Below check is a driver limitation, not a hardware one. We + * don't want to lock unused pages, and don't want to incoporate the + * extra logic of avoiding them. Make sure there are no. + * (Not a big limitation anyway.) + */ + if ((xfer->mem_stride - xfer->line_length) > 2 * PAGE_SIZE) { + DRM_ERROR("Too large system memory stride. Stride: %d, " + "Length: %d\n", xfer->mem_stride, xfer->line_length); + return -EINVAL; + } + + if ((xfer->mem_stride == xfer->line_length) && + (xfer->fb_stride == xfer->line_length)) { + xfer->mem_stride *= xfer->num_lines; + xfer->line_length = xfer->mem_stride; + xfer->fb_stride = xfer->mem_stride; + xfer->num_lines = 1; + } + + /* + * Don't lock an arbitrary large number of pages, since that causes a + * DOS security hole. + */ + if (xfer->num_lines > 2048 || + (xfer->num_lines*xfer->mem_stride > (2048*2048*4))) { + DRM_ERROR("Too large PCI DMA bitblt.\n"); + return -EINVAL; + } + + /* + * we allow a negative fb stride to allow flipping of images in + * transfer. + */ + if (xfer->mem_stride < xfer->line_length || + abs(xfer->fb_stride) < xfer->line_length) { + DRM_ERROR("Invalid frame-buffer / memory stride.\n"); + return -EINVAL; + } + + /* + * A hardware bug seems to be worked around if system memory addresses + * start on 16 byte boundaries. This seems a bit restrictive however. + * VIA is contacted about this. Meanwhile, impose the following + * restrictions: + */ +#ifdef VIA_BUGFREE + if ((((unsigned long)xfer->mem_addr & 3) != + ((unsigned long)xfer->fb_addr & 3)) || + ((xfer->num_lines > 1) && ((xfer->mem_stride & 3) != + (xfer->fb_stride & 3)))) { + DRM_ERROR("Invalid DRM bitblt alignment.\n"); + return -EINVAL; + } +#else + if ((((unsigned long)xfer->mem_addr & 15) || + ((unsigned long)xfer->fb_addr & 3)) || + ((xfer->num_lines > 1) && + ((xfer->mem_stride & 15) || (xfer->fb_stride & 3)))) { + DRM_ERROR("Invalid DRM bitblt alignment.\n"); + return -EINVAL; + } +#endif + + if (0 != (ret = via_lock_all_dma_pages(vsg, xfer))) { + DRM_ERROR("Could not lock DMA pages.\n"); + via_free_sg_info(vsg); + return ret; + } + + via_map_blit_for_device(xfer, vsg, 0); + if (0 != (ret = via_alloc_desc_pages(vsg))) { + DRM_ERROR("Could not allocate DMA descriptor pages.\n"); + via_free_sg_info(vsg); + return ret; + } + via_map_blit_for_device(xfer, vsg, 1); + + return 0; +} + + +/* + * Reserve one free slot in the blit queue. Will wait for one second for one + * to become available. Otherwise -EBUSY is returned. + */ +static int +via_dmablit_grab_slot(drm_via_blitq_t *blitq, int engine) +{ + struct drm_device *dev = blitq->dev; + int ret=0; + + DRM_DEBUG("Num free is %d\n", blitq->num_free); + mtx_lock(&blitq->blit_lock); + while(blitq->num_free == 0) { + mtx_unlock(&blitq->blit_lock); + + DRM_WAIT_ON(ret, blitq->busy_queue, DRM_HZ, + blitq->num_free > 0); + if (ret) { + return (-EINTR == ret) ? -EAGAIN : ret; + } + + mtx_lock(&blitq->blit_lock); + } + + blitq->num_free--; + mtx_unlock(&blitq->blit_lock); + + return 0; +} + + +/* + * Hand back a free slot if we changed our mind. + */ +static void +via_dmablit_release_slot(drm_via_blitq_t *blitq) +{ + + mtx_lock(&blitq->blit_lock); + blitq->num_free++; + mtx_unlock(&blitq->blit_lock); + DRM_WAKEUP( &blitq->busy_queue ); +} + + +/* + * Grab a free slot. Build blit info and queue a blit. + */ +static int +via_dmablit(struct drm_device *dev, drm_via_dmablit_t *xfer) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; + drm_via_sg_info_t *vsg; + drm_via_blitq_t *blitq; + int ret; + int engine; + + if (dev_priv == NULL) { + DRM_ERROR("Called without initialization.\n"); + return -EINVAL; + } + + engine = (xfer->to_fb) ? 0 : 1; + blitq = dev_priv->blit_queues + engine; + if (0 != (ret = via_dmablit_grab_slot(blitq, engine))) { + return ret; + } + if (NULL == (vsg = malloc(sizeof(*vsg), DRM_MEM_DRIVER, + M_NOWAIT | M_ZERO))) { + via_dmablit_release_slot(blitq); + return -ENOMEM; + } + if (0 != (ret = via_build_sg_info(dev, vsg, xfer))) { + via_dmablit_release_slot(blitq); + free(vsg, DRM_MEM_DRIVER); + return ret; + } + mtx_lock(&blitq->blit_lock); + + blitq->blits[blitq->head++] = vsg; + if (blitq->head >= VIA_NUM_BLIT_SLOTS) + blitq->head = 0; + blitq->num_outstanding++; + xfer->sync.sync_handle = ++blitq->cur_blit_handle; + + mtx_unlock(&blitq->blit_lock); + xfer->sync.engine = engine; + + via_dmablit_handler(dev, engine, 0); + + return 0; +} + + +/* + * Sync on a previously submitted blit. Note that the X server use signals + * extensively, and that there is a very big probability that this IOCTL will + * be interrupted by a signal. In that case it returns with -EAGAIN for the + * signal to be delivered. The caller should then reissue the IOCTL. This is + * similar to what is being done for drmGetLock(). + */ +int +via_dma_blit_sync( struct drm_device *dev, void *data, + struct drm_file *file_priv ) +{ + drm_via_blitsync_t *sync = data; + int err; + + if (sync->engine >= VIA_NUM_BLIT_ENGINES) + return -EINVAL; + + err = via_dmablit_sync(dev, sync->sync_handle, sync->engine); + + if (-EINTR == err) + err = -EAGAIN; + + return err; +} + + +/* + * Queue a blit and hand back a handle to be used for sync. This IOCTL may be + * interrupted by a signal while waiting for a free slot in the blit queue. + * In that case it returns with -EAGAIN and should be reissued. See the above + * IOCTL code. + */ +int +via_dma_blit( struct drm_device *dev, void *data, struct drm_file *file_priv ) +{ + drm_via_dmablit_t *xfer = data; + int err; + + err = via_dmablit(dev, xfer); + + return err; +} diff --git a/sys/dev/drm/via_dmablit.h b/sys/dev/drm/via_dmablit.h new file mode 100644 index 000000000000..c5463cbf0679 --- /dev/null +++ b/sys/dev/drm/via_dmablit.h @@ -0,0 +1,140 @@ +/* via_dmablit.h -- PCI DMA BitBlt support for the VIA Unichrome/Pro + * + * Copyright 2005 Thomas Hellstrom. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Thomas Hellstrom. + * Register info from Digeo Inc. + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _VIA_DMABLIT_H +#define _VIA_DMABLIT_H + +#define VIA_NUM_BLIT_ENGINES 2 +#define VIA_NUM_BLIT_SLOTS 8 + +struct _drm_via_descriptor; + +typedef struct _drm_via_sg_info { + vm_page_t *pages; + unsigned long num_pages; + struct _drm_via_descriptor **desc_pages; + int num_desc_pages; + int num_desc; + unsigned char *bounce_buffer; + dma_addr_t chain_start; + uint32_t free_on_sequence; + unsigned int descriptors_per_page; + int aborted; + enum { + dr_via_device_mapped, + dr_via_desc_pages_alloc, + dr_via_pages_locked, + dr_via_pages_alloc, + dr_via_sg_init + } state; +} drm_via_sg_info_t; + +typedef struct _drm_via_blitq { + struct drm_device *dev; + uint32_t cur_blit_handle; + uint32_t done_blit_handle; + unsigned serviced; + unsigned head; + unsigned cur; + unsigned num_free; + unsigned num_outstanding; + unsigned long end; + int aborting; + int is_active; + drm_via_sg_info_t *blits[VIA_NUM_BLIT_SLOTS]; + struct mtx blit_lock; + wait_queue_head_t blit_queue[VIA_NUM_BLIT_SLOTS]; + wait_queue_head_t busy_queue; + struct task wq; + struct callout poll_timer; +} drm_via_blitq_t; + + +/* + * PCI DMA Registers + * Channels 2 & 3 don't seem to be implemented in hardware. + */ + +#define VIA_PCI_DMA_MAR0 0xE40 /* Memory Address Register of Channel 0 */ +#define VIA_PCI_DMA_DAR0 0xE44 /* Device Address Register of Channel 0 */ +#define VIA_PCI_DMA_BCR0 0xE48 /* Byte Count Register of Channel 0 */ +#define VIA_PCI_DMA_DPR0 0xE4C /* Descriptor Pointer Register of Channel 0 */ + +#define VIA_PCI_DMA_MAR1 0xE50 /* Memory Address Register of Channel 1 */ +#define VIA_PCI_DMA_DAR1 0xE54 /* Device Address Register of Channel 1 */ +#define VIA_PCI_DMA_BCR1 0xE58 /* Byte Count Register of Channel 1 */ +#define VIA_PCI_DMA_DPR1 0xE5C /* Descriptor Pointer Register of Channel 1 */ + +#define VIA_PCI_DMA_MAR2 0xE60 /* Memory Address Register of Channel 2 */ +#define VIA_PCI_DMA_DAR2 0xE64 /* Device Address Register of Channel 2 */ +#define VIA_PCI_DMA_BCR2 0xE68 /* Byte Count Register of Channel 2 */ +#define VIA_PCI_DMA_DPR2 0xE6C /* Descriptor Pointer Register of Channel 2 */ + +#define VIA_PCI_DMA_MAR3 0xE70 /* Memory Address Register of Channel 3 */ +#define VIA_PCI_DMA_DAR3 0xE74 /* Device Address Register of Channel 3 */ +#define VIA_PCI_DMA_BCR3 0xE78 /* Byte Count Register of Channel 3 */ +#define VIA_PCI_DMA_DPR3 0xE7C /* Descriptor Pointer Register of Channel 3 */ + +#define VIA_PCI_DMA_MR0 0xE80 /* Mode Register of Channel 0 */ +#define VIA_PCI_DMA_MR1 0xE84 /* Mode Register of Channel 1 */ +#define VIA_PCI_DMA_MR2 0xE88 /* Mode Register of Channel 2 */ +#define VIA_PCI_DMA_MR3 0xE8C /* Mode Register of Channel 3 */ + +#define VIA_PCI_DMA_CSR0 0xE90 /* Command/Status Register of Channel 0 */ +#define VIA_PCI_DMA_CSR1 0xE94 /* Command/Status Register of Channel 1 */ +#define VIA_PCI_DMA_CSR2 0xE98 /* Command/Status Register of Channel 2 */ +#define VIA_PCI_DMA_CSR3 0xE9C /* Command/Status Register of Channel 3 */ + +#define VIA_PCI_DMA_PTR 0xEA0 /* Priority Type Register */ + +/* Define for DMA engine */ +/* DPR */ +#define VIA_DMA_DPR_EC (1<<1) /* end of chain */ +#define VIA_DMA_DPR_DDIE (1<<2) /* descriptor done interrupt enable */ +#define VIA_DMA_DPR_DT (1<<3) /* direction of transfer (RO) */ + +/* MR */ +#define VIA_DMA_MR_CM (1<<0) /* chaining mode */ +#define VIA_DMA_MR_TDIE (1<<1) /* transfer done interrupt enable */ +#define VIA_DMA_MR_HENDMACMD (1<<7) /* ? */ + +/* CSR */ +#define VIA_DMA_CSR_DE (1<<0) /* DMA enable */ +#define VIA_DMA_CSR_TS (1<<1) /* transfer start */ +#define VIA_DMA_CSR_TA (1<<2) /* transfer abort */ +#define VIA_DMA_CSR_TD (1<<3) /* transfer done */ +#define VIA_DMA_CSR_DD (1<<4) /* descriptor done */ +#define VIA_DMA_DPR_EC (1<<1) /* end of chain */ + + + +#endif diff --git a/sys/dev/drm/via_drm.h b/sys/dev/drm/via_drm.h new file mode 100644 index 000000000000..2f40cabd9918 --- /dev/null +++ b/sys/dev/drm/via_drm.h @@ -0,0 +1,279 @@ +/*- + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _VIA_DRM_H_ +#define _VIA_DRM_H_ + +/* WARNING: These defines must be the same as what the Xserver uses. + * if you change them, you must change the defines in the Xserver. + */ + +#ifndef _VIA_DEFINES_ +#define _VIA_DEFINES_ + +#if !defined(__KERNEL__) && !defined(_KERNEL) +#include "via_drmclient.h" +#endif + +#define VIA_NR_SAREA_CLIPRECTS 8 +#define VIA_NR_XVMC_PORTS 10 +#define VIA_NR_XVMC_LOCKS 5 +#define VIA_MAX_CACHELINE_SIZE 64 +#define XVMCLOCKPTR(saPriv,lockNo) \ + ((volatile struct drm_hw_lock *)(((((unsigned long) (saPriv)->XvMCLockArea) + \ + (VIA_MAX_CACHELINE_SIZE - 1)) & \ + ~(VIA_MAX_CACHELINE_SIZE - 1)) + \ + VIA_MAX_CACHELINE_SIZE*(lockNo))) + +/* Each region is a minimum of 64k, and there are at most 64 of them. + */ +#define VIA_NR_TEX_REGIONS 64 +#define VIA_LOG_MIN_TEX_REGION_SIZE 16 +#endif + +#define VIA_UPLOAD_TEX0IMAGE 0x1 /* handled clientside */ +#define VIA_UPLOAD_TEX1IMAGE 0x2 /* handled clientside */ +#define VIA_UPLOAD_CTX 0x4 +#define VIA_UPLOAD_BUFFERS 0x8 +#define VIA_UPLOAD_TEX0 0x10 +#define VIA_UPLOAD_TEX1 0x20 +#define VIA_UPLOAD_CLIPRECTS 0x40 +#define VIA_UPLOAD_ALL 0xff + +/* VIA specific ioctls */ +#define DRM_VIA_ALLOCMEM 0x00 +#define DRM_VIA_FREEMEM 0x01 +#define DRM_VIA_AGP_INIT 0x02 +#define DRM_VIA_FB_INIT 0x03 +#define DRM_VIA_MAP_INIT 0x04 +#define DRM_VIA_DEC_FUTEX 0x05 +#define NOT_USED +#define DRM_VIA_DMA_INIT 0x07 +#define DRM_VIA_CMDBUFFER 0x08 +#define DRM_VIA_FLUSH 0x09 +#define DRM_VIA_PCICMD 0x0a +#define DRM_VIA_CMDBUF_SIZE 0x0b +#define NOT_USED +#define DRM_VIA_WAIT_IRQ 0x0d +#define DRM_VIA_DMA_BLIT 0x0e +#define DRM_VIA_BLIT_SYNC 0x0f + +#define DRM_IOCTL_VIA_ALLOCMEM DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_ALLOCMEM, drm_via_mem_t) +#define DRM_IOCTL_VIA_FREEMEM DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_FREEMEM, drm_via_mem_t) +#define DRM_IOCTL_VIA_AGP_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_AGP_INIT, drm_via_agp_t) +#define DRM_IOCTL_VIA_FB_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_FB_INIT, drm_via_fb_t) +#define DRM_IOCTL_VIA_MAP_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_MAP_INIT, drm_via_init_t) +#define DRM_IOCTL_VIA_DEC_FUTEX DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_DEC_FUTEX, drm_via_futex_t) +#define DRM_IOCTL_VIA_DMA_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_DMA_INIT, drm_via_dma_init_t) +#define DRM_IOCTL_VIA_CMDBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_CMDBUFFER, drm_via_cmdbuffer_t) +#define DRM_IOCTL_VIA_FLUSH DRM_IO( DRM_COMMAND_BASE + DRM_VIA_FLUSH) +#define DRM_IOCTL_VIA_PCICMD DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_PCICMD, drm_via_cmdbuffer_t) +#define DRM_IOCTL_VIA_CMDBUF_SIZE DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_CMDBUF_SIZE, \ + drm_via_cmdbuf_size_t) +#define DRM_IOCTL_VIA_WAIT_IRQ DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_WAIT_IRQ, drm_via_irqwait_t) +#define DRM_IOCTL_VIA_DMA_BLIT DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_DMA_BLIT, drm_via_dmablit_t) +#define DRM_IOCTL_VIA_BLIT_SYNC DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_BLIT_SYNC, drm_via_blitsync_t) + +/* Indices into buf.Setup where various bits of state are mirrored per + * context and per buffer. These can be fired at the card as a unit, + * or in a piecewise fashion as required. + */ + +#define VIA_TEX_SETUP_SIZE 8 + +/* Flags for clear ioctl + */ +#define VIA_FRONT 0x1 +#define VIA_BACK 0x2 +#define VIA_DEPTH 0x4 +#define VIA_STENCIL 0x8 +#define VIA_MEM_VIDEO 0 /* matches drm constant */ +#define VIA_MEM_AGP 1 /* matches drm constant */ +#define VIA_MEM_SYSTEM 2 +#define VIA_MEM_MIXED 3 +#define VIA_MEM_UNKNOWN 4 + +typedef struct { + u32 offset; + u32 size; +} drm_via_agp_t; + +typedef struct { + u32 offset; + u32 size; +} drm_via_fb_t; + +typedef struct { + u32 context; + u32 type; + u32 size; + unsigned long index; + unsigned long offset; +} drm_via_mem_t; + +typedef struct _drm_via_init { + enum { + VIA_INIT_MAP = 0x01, + VIA_CLEANUP_MAP = 0x02 + } func; + + unsigned long sarea_priv_offset; + unsigned long fb_offset; + unsigned long mmio_offset; + unsigned long agpAddr; +} drm_via_init_t; + +typedef struct _drm_via_futex { + enum { + VIA_FUTEX_WAIT = 0x00, + VIA_FUTEX_WAKE = 0X01 + } func; + u32 ms; + u32 lock; + u32 val; +} drm_via_futex_t; + +typedef struct _drm_via_dma_init { + enum { + VIA_INIT_DMA = 0x01, + VIA_CLEANUP_DMA = 0x02, + VIA_DMA_INITIALIZED = 0x03 + } func; + + unsigned long offset; + unsigned long size; + unsigned long reg_pause_addr; +} drm_via_dma_init_t; + +typedef struct _drm_via_cmdbuffer { + char __user *buf; + unsigned long size; +} drm_via_cmdbuffer_t; + +/* Warning: If you change the SAREA structure you must change the Xserver + * structure as well */ + +typedef struct _drm_via_tex_region { + unsigned char next, prev; /* indices to form a circular LRU */ + unsigned char inUse; /* owned by a client, or free? */ + int age; /* tracked by clients to update local LRU's */ +} drm_via_tex_region_t; + +typedef struct _drm_via_sarea { + unsigned int dirty; + unsigned int nbox; + struct drm_clip_rect boxes[VIA_NR_SAREA_CLIPRECTS]; + drm_via_tex_region_t texList[VIA_NR_TEX_REGIONS + 1]; + int texAge; /* last time texture was uploaded */ + int ctxOwner; /* last context to upload state */ + int vertexPrim; + + /* + * Below is for XvMC. + * We want the lock integers alone on, and aligned to, a cache line. + * Therefore this somewhat strange construct. + */ + + char XvMCLockArea[VIA_MAX_CACHELINE_SIZE * (VIA_NR_XVMC_LOCKS + 1)]; + + unsigned int XvMCDisplaying[VIA_NR_XVMC_PORTS]; + unsigned int XvMCSubPicOn[VIA_NR_XVMC_PORTS]; + unsigned int XvMCCtxNoGrabbed; /* Last context to hold decoder */ + + /* Used by the 3d driver only at this point, for pageflipping: + */ + unsigned int pfCurrentOffset; +} drm_via_sarea_t; + +typedef struct _drm_via_cmdbuf_size { + enum { + VIA_CMDBUF_SPACE = 0x01, + VIA_CMDBUF_LAG = 0x02 + } func; + int wait; + u32 size; +} drm_via_cmdbuf_size_t; + +typedef enum { + VIA_IRQ_ABSOLUTE = 0x0, + VIA_IRQ_RELATIVE = 0x1, + VIA_IRQ_SIGNAL = 0x10000000, + VIA_IRQ_FORCE_SEQUENCE = 0x20000000 +} via_irq_seq_type_t; + +#define VIA_IRQ_FLAGS_MASK 0xF0000000 + +enum drm_via_irqs { + drm_via_irq_hqv0 = 0, + drm_via_irq_hqv1, + drm_via_irq_dma0_dd, + drm_via_irq_dma0_td, + drm_via_irq_dma1_dd, + drm_via_irq_dma1_td, + drm_via_irq_num +}; + +struct drm_via_wait_irq_request { + unsigned irq; + via_irq_seq_type_t type; + u32 sequence; + u32 signal; +}; + +typedef union drm_via_irqwait { + struct drm_via_wait_irq_request request; + struct drm_wait_vblank_reply reply; +} drm_via_irqwait_t; + +typedef struct drm_via_blitsync { + u32 sync_handle; + unsigned engine; +} drm_via_blitsync_t; + +/* - * Below,"flags" is currently unused but will be used for possible future + * extensions like kernel space bounce buffers for bad alignments and + * blit engine busy-wait polling for better latency in the absence of + * interrupts. + */ + +typedef struct drm_via_dmablit { + u32 num_lines; + u32 line_length; + + u32 fb_addr; + u32 fb_stride; + + unsigned char *mem_addr; + u32 mem_stride; + + u32 flags; + int to_fb; + + drm_via_blitsync_t sync; +} drm_via_dmablit_t; + +#endif /* _VIA_DRM_H_ */ diff --git a/sys/dev/drm/via_drv.c b/sys/dev/drm/via_drv.c new file mode 100644 index 000000000000..520518d5d7a1 --- /dev/null +++ b/sys/dev/drm/via_drv.c @@ -0,0 +1,123 @@ +/* via_drv.c -- VIA unichrome driver -*- linux-c -*- + * Created: Fri Aug 12 2005 by anholt@FreeBSD.org + */ +/*- + * Copyright 2005 Eric Anholt + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "dev/drm/drmP.h" +#include "dev/drm/drm.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_drv.h" +#include "dev/drm/drm_pciids.h" + +/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */ +static drm_pci_id_list_t via_pciidlist[] = { + viadrv_PCI_IDS +}; + +static void via_configure(struct drm_device *dev) +{ + dev->driver->driver_features = + DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_HAVE_IRQ; + + dev->driver->buf_priv_size = sizeof(drm_via_private_t); + dev->driver->load = via_driver_load; + dev->driver->unload = via_driver_unload; + dev->driver->lastclose = via_lastclose; + dev->driver->get_vblank_counter = via_get_vblank_counter; + dev->driver->enable_vblank = via_enable_vblank; + dev->driver->disable_vblank = via_disable_vblank; + dev->driver->irq_preinstall = via_driver_irq_preinstall; + dev->driver->irq_postinstall = via_driver_irq_postinstall; + dev->driver->irq_uninstall = via_driver_irq_uninstall; + dev->driver->irq_handler = via_driver_irq_handler; + dev->driver->dma_quiescent = via_driver_dma_quiescent; + + dev->driver->ioctls = via_ioctls; + dev->driver->max_ioctl = via_max_ioctl; + + dev->driver->name = DRIVER_NAME; + dev->driver->desc = DRIVER_DESC; + dev->driver->date = DRIVER_DATE; + dev->driver->major = DRIVER_MAJOR; + dev->driver->minor = DRIVER_MINOR; + dev->driver->patchlevel = DRIVER_PATCHLEVEL; +} + +static int +via_probe(device_t kdev) +{ + return drm_probe(kdev, via_pciidlist); +} + +static int +via_attach(device_t kdev) +{ + struct drm_device *dev = device_get_softc(kdev); + + dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER, + M_WAITOK | M_ZERO); + + via_configure(dev); + + return drm_attach(kdev, via_pciidlist); +} + +static int +via_detach(device_t kdev) +{ + struct drm_device *dev = device_get_softc(kdev); + int ret; + + ret = drm_detach(kdev); + + free(dev->driver, DRM_MEM_DRIVER); + + return ret; +} + +static device_method_t via_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, via_probe), + DEVMETHOD(device_attach, via_attach), + DEVMETHOD(device_detach, via_detach), + + { 0, 0 } +}; + +static driver_t via_driver = { + "drm", + via_methods, + sizeof(struct drm_device) +}; + +extern devclass_t drm_devclass; +DRIVER_MODULE(via, vgapci, via_driver, drm_devclass, 0, 0); +MODULE_DEPEND(via, drm, 1, 1, 1); diff --git a/sys/dev/drm/via_drv.h b/sys/dev/drm/via_drv.h new file mode 100644 index 000000000000..3b692f13a5e0 --- /dev/null +++ b/sys/dev/drm/via_drv.h @@ -0,0 +1,161 @@ +/*- + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _VIA_DRV_H_ +#define _VIA_DRV_H_ + +#include "dev/drm/drm_sman.h" +#define DRIVER_AUTHOR "Various" + +#define DRIVER_NAME "via" +#define DRIVER_DESC "VIA Unichrome / Pro" +#define DRIVER_DATE "20070202" + +#define DRIVER_MAJOR 2 +#define DRIVER_MINOR 11 +#define DRIVER_PATCHLEVEL 1 + +#include "dev/drm/via_verifier.h" + +#include "dev/drm/via_dmablit.h" + +#define VIA_PCI_BUF_SIZE 60000 +#define VIA_FIRE_BUF_SIZE 1024 +#define VIA_NUM_IRQS 4 + +typedef struct drm_via_ring_buffer { + drm_local_map_t map; + char *virtual_start; +} drm_via_ring_buffer_t; + +typedef uint32_t maskarray_t[5]; + +typedef struct drm_via_irq { + atomic_t irq_received; + uint32_t pending_mask; + uint32_t enable_mask; + wait_queue_head_t irq_queue; +} drm_via_irq_t; + +typedef struct drm_via_private { + drm_via_sarea_t *sarea_priv; + drm_local_map_t *sarea; + drm_local_map_t *fb; + drm_local_map_t *mmio; + unsigned long agpAddr; + wait_queue_head_t decoder_queue[VIA_NR_XVMC_LOCKS]; + char *dma_ptr; + unsigned int dma_low; + unsigned int dma_high; + unsigned int dma_offset; + uint32_t dma_wrap; + volatile uint32_t *last_pause_ptr; + volatile uint32_t *hw_addr_ptr; + drm_via_ring_buffer_t ring; + struct timeval last_vblank; + int last_vblank_valid; + unsigned usec_per_vblank; + atomic_t vbl_received; + drm_via_state_t hc_state; + char pci_buf[VIA_PCI_BUF_SIZE]; + const uint32_t *fire_offsets[VIA_FIRE_BUF_SIZE]; + uint32_t num_fire_offsets; + int chipset; + drm_via_irq_t via_irqs[VIA_NUM_IRQS]; + unsigned num_irqs; + maskarray_t *irq_masks; + uint32_t irq_enable_mask; + uint32_t irq_pending_mask; + int *irq_map; + unsigned int idle_fault; + struct drm_sman sman; + int vram_initialized; + int agp_initialized; + unsigned long vram_offset; + unsigned long agp_offset; + drm_via_blitq_t blit_queues[VIA_NUM_BLIT_ENGINES]; + uint32_t dma_diff; +} drm_via_private_t; + +enum via_family { + VIA_OTHER = 0, /* Baseline */ + VIA_PRO_GROUP_A, /* Another video engine and DMA commands */ + VIA_DX9_0 /* Same video as pro_group_a, but 3D is unsupported */ +}; + +/* VIA MMIO register access */ +#define VIA_BASE ((dev_priv->mmio)) + +#define VIA_READ(reg) DRM_READ32(VIA_BASE, reg) +#define VIA_WRITE(reg,val) DRM_WRITE32(VIA_BASE, reg, val) +#define VIA_READ8(reg) DRM_READ8(VIA_BASE, reg) +#define VIA_WRITE8(reg,val) DRM_WRITE8(VIA_BASE, reg, val) + +extern struct drm_ioctl_desc via_ioctls[]; +extern int via_max_ioctl; + +extern int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int via_mem_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int via_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int via_decoder_futex(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv); +extern int via_dma_blit_sync( struct drm_device *dev, void *data, struct drm_file *file_priv ); +extern int via_dma_blit( struct drm_device *dev, void *data, struct drm_file *file_priv ); + +extern int via_driver_load(struct drm_device *dev, unsigned long chipset); +extern int via_driver_unload(struct drm_device *dev); + +extern int via_init_context(struct drm_device * dev, int context); +extern int via_final_context(struct drm_device * dev, int context); + +extern int via_do_cleanup_map(struct drm_device * dev); +extern u32 via_get_vblank_counter(struct drm_device *dev, int crtc); +extern int via_enable_vblank(struct drm_device *dev, int crtc); +extern void via_disable_vblank(struct drm_device *dev, int crtc); + +extern irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS); +extern void via_driver_irq_preinstall(struct drm_device * dev); +extern int via_driver_irq_postinstall(struct drm_device *dev); +extern void via_driver_irq_uninstall(struct drm_device * dev); + +extern int via_dma_cleanup(struct drm_device * dev); +extern void via_init_command_verifier(void); +extern int via_driver_dma_quiescent(struct drm_device * dev); +extern void via_init_futex(drm_via_private_t *dev_priv); +extern void via_cleanup_futex(drm_via_private_t *dev_priv); +extern void via_release_futex(drm_via_private_t *dev_priv, int context); + +extern void via_reclaim_buffers_locked(struct drm_device *dev, + struct drm_file *file_priv); +extern void via_lastclose(struct drm_device *dev); + +extern void via_dmablit_handler(struct drm_device *dev, int engine, int from_irq); +extern void via_init_dmablit(struct drm_device *dev); + +#endif diff --git a/sys/dev/drm/via_irq.c b/sys/dev/drm/via_irq.c new file mode 100644 index 000000000000..20ec77a64abb --- /dev/null +++ b/sys/dev/drm/via_irq.c @@ -0,0 +1,392 @@ +/* via_irq.c + * + * Copyright 2004 BEAM Ltd. + * Copyright 2002 Tungsten Graphics, Inc. + * Copyright 2005 Thomas Hellstrom. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BEAM LTD, TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Terry Barnaby + * Keith Whitwell + * Thomas Hellstrom + * + * This code provides standard DRM access to the Via Unichrome / Pro Vertical blank + * interrupt, as well as an infrastructure to handle other interrupts of the chip. + * The refresh rate is also calculated for video playback sync purposes. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "dev/drm/drmP.h" +#include "dev/drm/drm.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_drv.h" + +#define VIA_REG_INTERRUPT 0x200 + +/* VIA_REG_INTERRUPT */ +#define VIA_IRQ_GLOBAL (1 << 31) +#define VIA_IRQ_VBLANK_ENABLE (1 << 19) +#define VIA_IRQ_VBLANK_PENDING (1 << 3) +#define VIA_IRQ_HQV0_ENABLE (1 << 11) +#define VIA_IRQ_HQV1_ENABLE (1 << 25) +#define VIA_IRQ_HQV0_PENDING (1 << 9) +#define VIA_IRQ_HQV1_PENDING (1 << 10) +#define VIA_IRQ_DMA0_DD_ENABLE (1 << 20) +#define VIA_IRQ_DMA0_TD_ENABLE (1 << 21) +#define VIA_IRQ_DMA1_DD_ENABLE (1 << 22) +#define VIA_IRQ_DMA1_TD_ENABLE (1 << 23) +#define VIA_IRQ_DMA0_DD_PENDING (1 << 4) +#define VIA_IRQ_DMA0_TD_PENDING (1 << 5) +#define VIA_IRQ_DMA1_DD_PENDING (1 << 6) +#define VIA_IRQ_DMA1_TD_PENDING (1 << 7) + + +/* + * Device-specific IRQs go here. This type might need to be extended with + * the register if there are multiple IRQ control registers. + * Currently we activate the HQV interrupts of Unichrome Pro group A. + */ + +static maskarray_t via_pro_group_a_irqs[] = { + {VIA_IRQ_HQV0_ENABLE, VIA_IRQ_HQV0_PENDING, 0x000003D0, 0x00008010, + 0x00000000 }, + {VIA_IRQ_HQV1_ENABLE, VIA_IRQ_HQV1_PENDING, 0x000013D0, 0x00008010, + 0x00000000 }, + {VIA_IRQ_DMA0_TD_ENABLE, VIA_IRQ_DMA0_TD_PENDING, VIA_PCI_DMA_CSR0, + VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008}, + {VIA_IRQ_DMA1_TD_ENABLE, VIA_IRQ_DMA1_TD_PENDING, VIA_PCI_DMA_CSR1, + VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008}, +}; +static int via_num_pro_group_a = DRM_ARRAY_SIZE(via_pro_group_a_irqs); +static int via_irqmap_pro_group_a[] = {0, 1, -1, 2, -1, 3}; + +static maskarray_t via_unichrome_irqs[] = { + {VIA_IRQ_DMA0_TD_ENABLE, VIA_IRQ_DMA0_TD_PENDING, VIA_PCI_DMA_CSR0, + VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008}, + {VIA_IRQ_DMA1_TD_ENABLE, VIA_IRQ_DMA1_TD_PENDING, VIA_PCI_DMA_CSR1, + VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008} +}; +static int via_num_unichrome = DRM_ARRAY_SIZE(via_unichrome_irqs); +static int via_irqmap_unichrome[] = {-1, -1, -1, 0, -1, 1}; + + +static unsigned time_diff(struct timeval *now, struct timeval *then) +{ + return (now->tv_usec >= then->tv_usec) ? + now->tv_usec - then->tv_usec : + 1000000 - (then->tv_usec - now->tv_usec); +} + +u32 via_get_vblank_counter(struct drm_device *dev, int crtc) +{ + drm_via_private_t *dev_priv = dev->dev_private; + if (crtc != 0) + return 0; + + return atomic_read(&dev_priv->vbl_received); +} + +irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS) +{ + struct drm_device *dev = (struct drm_device *) arg; + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + u32 status; + int handled = 0; + struct timeval cur_vblank; + drm_via_irq_t *cur_irq = dev_priv->via_irqs; + int i; + + status = VIA_READ(VIA_REG_INTERRUPT); + if (status & VIA_IRQ_VBLANK_PENDING) { + atomic_inc(&dev_priv->vbl_received); + if (!(atomic_read(&dev_priv->vbl_received) & 0x0F)) { + microtime(&cur_vblank); + if (dev_priv->last_vblank_valid) { + dev_priv->usec_per_vblank = + time_diff(&cur_vblank, + &dev_priv->last_vblank) >> 4; + } + dev_priv->last_vblank = cur_vblank; + dev_priv->last_vblank_valid = 1; + } + if (!(atomic_read(&dev_priv->vbl_received) & 0xFF)) { + DRM_DEBUG("US per vblank is: %u\n", + dev_priv->usec_per_vblank); + } + drm_handle_vblank(dev, 0); + handled = 1; + } + + for (i = 0; i < dev_priv->num_irqs; ++i) { + if (status & cur_irq->pending_mask) { + atomic_inc(&cur_irq->irq_received); + DRM_WAKEUP(&cur_irq->irq_queue); + handled = 1; + if (dev_priv->irq_map[drm_via_irq_dma0_td] == i) { + via_dmablit_handler(dev, 0, 1); + } else if (dev_priv->irq_map[drm_via_irq_dma1_td] == i) { + via_dmablit_handler(dev, 1, 1); + } + } + cur_irq++; + } + + /* Acknowlege interrupts */ + VIA_WRITE(VIA_REG_INTERRUPT, status); + + + if (handled) + return IRQ_HANDLED; + else + return IRQ_NONE; +} + +static __inline__ void viadrv_acknowledge_irqs(drm_via_private_t * dev_priv) +{ + u32 status; + + if (dev_priv) { + /* Acknowlege interrupts */ + status = VIA_READ(VIA_REG_INTERRUPT); + VIA_WRITE(VIA_REG_INTERRUPT, status | + dev_priv->irq_pending_mask); + } +} + +int via_enable_vblank(struct drm_device *dev, int crtc) +{ + drm_via_private_t *dev_priv = dev->dev_private; + u32 status; + + if (crtc != 0) { + DRM_ERROR("%s: bad crtc %d\n", __func__, crtc); + return -EINVAL; + } + + status = VIA_READ(VIA_REG_INTERRUPT); + VIA_WRITE(VIA_REG_INTERRUPT, status & VIA_IRQ_VBLANK_ENABLE); + + VIA_WRITE8(0x83d4, 0x11); + VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30); + + return 0; +} + +void via_disable_vblank(struct drm_device *dev, int crtc) +{ + drm_via_private_t *dev_priv = dev->dev_private; + + VIA_WRITE8(0x83d4, 0x11); + VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) & ~0x30); + + if (crtc != 0) + DRM_ERROR("%s: bad crtc %d\n", __func__, crtc); +} + +static int +via_driver_irq_wait(struct drm_device * dev, unsigned int irq, int force_sequence, + unsigned int *sequence) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + unsigned int cur_irq_sequence; + drm_via_irq_t *cur_irq; + int ret = 0; + maskarray_t *masks; + int real_irq; + + DRM_DEBUG("\n"); + + if (!dev_priv) { + DRM_ERROR("called with no initialization\n"); + return -EINVAL; + } + + if (irq >= drm_via_irq_num) { + DRM_ERROR("Trying to wait on unknown irq %d\n", irq); + return -EINVAL; + } + + real_irq = dev_priv->irq_map[irq]; + + if (real_irq < 0) { + DRM_ERROR("Video IRQ %d not available on this hardware.\n", + irq); + return -EINVAL; + } + + masks = dev_priv->irq_masks; + cur_irq = dev_priv->via_irqs + real_irq; + + if (masks[real_irq][2] && !force_sequence) { + DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * DRM_HZ, + ((VIA_READ(masks[irq][2]) & masks[irq][3]) == + masks[irq][4])); + cur_irq_sequence = atomic_read(&cur_irq->irq_received); + } else { + DRM_WAIT_ON(ret, cur_irq->irq_queue, 3 * DRM_HZ, + (((cur_irq_sequence = + atomic_read(&cur_irq->irq_received)) - + *sequence) <= (1 << 23))); + } + *sequence = cur_irq_sequence; + return ret; +} + + +/* + * drm_dma.h hooks + */ + +void via_driver_irq_preinstall(struct drm_device * dev) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + u32 status; + drm_via_irq_t *cur_irq; + int i; + + DRM_DEBUG("dev_priv: %p\n", dev_priv); + if (dev_priv) { + cur_irq = dev_priv->via_irqs; + + dev_priv->irq_enable_mask = VIA_IRQ_VBLANK_ENABLE; + dev_priv->irq_pending_mask = VIA_IRQ_VBLANK_PENDING; + + if (dev_priv->chipset == VIA_PRO_GROUP_A || + dev_priv->chipset == VIA_DX9_0) { + dev_priv->irq_masks = via_pro_group_a_irqs; + dev_priv->num_irqs = via_num_pro_group_a; + dev_priv->irq_map = via_irqmap_pro_group_a; + } else { + dev_priv->irq_masks = via_unichrome_irqs; + dev_priv->num_irqs = via_num_unichrome; + dev_priv->irq_map = via_irqmap_unichrome; + } + + for (i = 0; i < dev_priv->num_irqs; ++i) { + atomic_set(&cur_irq->irq_received, 0); + cur_irq->enable_mask = dev_priv->irq_masks[i][0]; + cur_irq->pending_mask = dev_priv->irq_masks[i][1]; + DRM_INIT_WAITQUEUE(&cur_irq->irq_queue); + dev_priv->irq_enable_mask |= cur_irq->enable_mask; + dev_priv->irq_pending_mask |= cur_irq->pending_mask; + cur_irq++; + + DRM_DEBUG("Initializing IRQ %d\n", i); + } + + dev_priv->last_vblank_valid = 0; + + /* Clear VSync interrupt regs */ + status = VIA_READ(VIA_REG_INTERRUPT); + VIA_WRITE(VIA_REG_INTERRUPT, status & + ~(dev_priv->irq_enable_mask)); + + /* Clear bits if they're already high */ + viadrv_acknowledge_irqs(dev_priv); + } +} + +int via_driver_irq_postinstall(struct drm_device *dev) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + u32 status; + + DRM_DEBUG("via_driver_irq_postinstall\n"); + if (!dev_priv) + return -EINVAL; + + status = VIA_READ(VIA_REG_INTERRUPT); + VIA_WRITE(VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL + | dev_priv->irq_enable_mask); + + /* Some magic, oh for some data sheets ! */ + VIA_WRITE8(0x83d4, 0x11); + VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) | 0x30); + + return 0; +} + +void via_driver_irq_uninstall(struct drm_device * dev) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + u32 status; + + DRM_DEBUG("\n"); + if (dev_priv) { + + /* Some more magic, oh for some data sheets ! */ + + VIA_WRITE8(0x83d4, 0x11); + VIA_WRITE8(0x83d5, VIA_READ8(0x83d5) & ~0x30); + + status = VIA_READ(VIA_REG_INTERRUPT); + VIA_WRITE(VIA_REG_INTERRUPT, status & + ~(VIA_IRQ_VBLANK_ENABLE | dev_priv->irq_enable_mask)); + } +} + +int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_irqwait_t *irqwait = data; + struct timeval now; + int ret = 0; + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + drm_via_irq_t *cur_irq = dev_priv->via_irqs; + int force_sequence; + + if (irqwait->request.irq >= dev_priv->num_irqs) { + DRM_ERROR("Trying to wait on unknown irq %d\n", + irqwait->request.irq); + return -EINVAL; + } + + cur_irq += irqwait->request.irq; + + switch (irqwait->request.type & ~VIA_IRQ_FLAGS_MASK) { + case VIA_IRQ_RELATIVE: + irqwait->request.sequence += + atomic_read(&cur_irq->irq_received); + irqwait->request.type &= ~_DRM_VBLANK_RELATIVE; + case VIA_IRQ_ABSOLUTE: + break; + default: + return -EINVAL; + } + + if (irqwait->request.type & VIA_IRQ_SIGNAL) { + DRM_ERROR("Signals on Via IRQs not implemented yet.\n"); + return -EINVAL; + } + + force_sequence = (irqwait->request.type & VIA_IRQ_FORCE_SEQUENCE); + + ret = via_driver_irq_wait(dev, irqwait->request.irq, force_sequence, + &irqwait->request.sequence); + microtime(&now); + irqwait->reply.tval_sec = now.tv_sec; + irqwait->reply.tval_usec = now.tv_usec; + + return ret; +} diff --git a/sys/dev/drm/via_map.c b/sys/dev/drm/via_map.c new file mode 100644 index 000000000000..5504a6b198d5 --- /dev/null +++ b/sys/dev/drm/via_map.c @@ -0,0 +1,137 @@ +/*- + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "dev/drm/drmP.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_drv.h" + +static int via_do_init_map(struct drm_device * dev, drm_via_init_t * init) +{ + drm_via_private_t *dev_priv = dev->dev_private; + + DRM_DEBUG("\n"); + + dev_priv->sarea = drm_getsarea(dev); + if (!dev_priv->sarea) { + DRM_ERROR("could not find sarea!\n"); + dev->dev_private = (void *)dev_priv; + via_do_cleanup_map(dev); + return -EINVAL; + } + + dev_priv->fb = drm_core_findmap(dev, init->fb_offset); + if (!dev_priv->fb) { + DRM_ERROR("could not find framebuffer!\n"); + dev->dev_private = (void *)dev_priv; + via_do_cleanup_map(dev); + return -EINVAL; + } + dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset); + if (!dev_priv->mmio) { + DRM_ERROR("could not find mmio region!\n"); + dev->dev_private = (void *)dev_priv; + via_do_cleanup_map(dev); + return -EINVAL; + } + + dev_priv->sarea_priv = + (drm_via_sarea_t *) ((u8 *) dev_priv->sarea->handle + + init->sarea_priv_offset); + + dev_priv->agpAddr = init->agpAddr; + + via_init_futex(dev_priv); + + via_init_dmablit(dev); + + dev->dev_private = (void *)dev_priv; + return 0; +} + +int via_do_cleanup_map(struct drm_device * dev) +{ + via_dma_cleanup(dev); + + return 0; +} + +int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_init_t *init = data; + + DRM_DEBUG("\n"); + + switch (init->func) { + case VIA_INIT_MAP: + return via_do_init_map(dev, init); + case VIA_CLEANUP_MAP: + return via_do_cleanup_map(dev); + } + + return -EINVAL; +} + +int via_driver_load(struct drm_device *dev, unsigned long chipset) +{ + drm_via_private_t *dev_priv; + int ret = 0; + + dev_priv = drm_alloc(sizeof(drm_via_private_t), DRM_MEM_DRIVER); + if (dev_priv == NULL) + return -ENOMEM; + + dev->dev_private = (void *)dev_priv; + + dev_priv->chipset = chipset; + + ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); + if (ret) { + drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); + return ret; + } + + ret = drm_vblank_init(dev, 1); + if (ret) { + drm_sman_takedown(&dev_priv->sman); + drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); + return ret; + } + + return 0; +} + +int via_driver_unload(struct drm_device *dev) +{ + drm_via_private_t *dev_priv = dev->dev_private; + + drm_sman_takedown(&dev_priv->sman); + + drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); + dev->dev_private = NULL; + + return 0; +} diff --git a/sys/dev/drm/via_mm.c b/sys/dev/drm/via_mm.c new file mode 100644 index 000000000000..9aaee9f4445c --- /dev/null +++ b/sys/dev/drm/via_mm.c @@ -0,0 +1,182 @@ +/*- + * Copyright 2006 Tungsten Graphics Inc., Bismarck, ND., USA. + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * Authors: Thomas Hellström + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "dev/drm/drmP.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_drv.h" +#include "dev/drm/drm_sman.h" + +#define VIA_MM_ALIGN_SHIFT 4 +#define VIA_MM_ALIGN_MASK ( (1 << VIA_MM_ALIGN_SHIFT) - 1) + +int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_agp_t *agp = data; + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + int ret; + + ret = drm_sman_set_range(&dev_priv->sman, VIA_MEM_AGP, 0, + agp->size >> VIA_MM_ALIGN_SHIFT); + + if (ret) { + DRM_ERROR("AGP memory manager initialisation error\n"); + return ret; + } + + dev_priv->agp_initialized = 1; + dev_priv->agp_offset = agp->offset; + + DRM_DEBUG("offset = %u, size = %u\n", agp->offset, agp->size); + return 0; +} + +int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_fb_t *fb = data; + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + int ret; + + ret = drm_sman_set_range(&dev_priv->sman, VIA_MEM_VIDEO, 0, + fb->size >> VIA_MM_ALIGN_SHIFT); + + if (ret) { + DRM_ERROR("VRAM memory manager initialisation error\n"); + return ret; + } + + dev_priv->vram_initialized = 1; + dev_priv->vram_offset = fb->offset; + + DRM_DEBUG("offset = %u, size = %u\n", fb->offset, fb->size); + + return 0; + +} + +int via_final_context(struct drm_device *dev, int context) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + + via_release_futex(dev_priv, context); + +#ifdef __linux__ + /* Linux specific until context tracking code gets ported to BSD */ + /* Last context, perform cleanup */ + if (dev->ctx_count == 1 && dev->dev_private) { + DRM_DEBUG("Last Context\n"); + drm_irq_uninstall(dev); + via_cleanup_futex(dev_priv); + via_do_cleanup_map(dev); + } +#endif + return 1; +} + +void via_lastclose(struct drm_device *dev) +{ + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + + if (!dev_priv) + return; + + drm_sman_cleanup(&dev_priv->sman); + dev_priv->vram_initialized = 0; + dev_priv->agp_initialized = 0; +} + +int via_mem_alloc(struct drm_device *dev, void *data, + struct drm_file *file_priv) +{ + drm_via_mem_t *mem = data; + int retval = 0; + struct drm_memblock_item *item; + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + unsigned long tmpSize; + + if (mem->type > VIA_MEM_AGP) { + DRM_ERROR("Unknown memory type allocation\n"); + return -EINVAL; + } + if (0 == ((mem->type == VIA_MEM_VIDEO) ? dev_priv->vram_initialized : + dev_priv->agp_initialized)) { + DRM_ERROR + ("Attempt to allocate from uninitialized memory manager.\n"); + return -EINVAL; + } + + tmpSize = (mem->size + VIA_MM_ALIGN_MASK) >> VIA_MM_ALIGN_SHIFT; + item = drm_sman_alloc(&dev_priv->sman, mem->type, tmpSize, 0, + (unsigned long)file_priv); + if (item) { + mem->offset = ((mem->type == VIA_MEM_VIDEO) ? + dev_priv->vram_offset : dev_priv->agp_offset) + + (item->mm-> + offset(item->mm, item->mm_info) << VIA_MM_ALIGN_SHIFT); + mem->index = item->user_hash.key; + } else { + mem->offset = 0; + mem->size = 0; + mem->index = 0; + DRM_DEBUG("Video memory allocation failed\n"); + retval = -ENOMEM; + } + + return retval; +} + +int via_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_private_t *dev_priv = dev->dev_private; + drm_via_mem_t *mem = data; + int ret; + + ret = drm_sman_free_key(&dev_priv->sman, mem->index); + DRM_DEBUG("free = 0x%lx\n", mem->index); + + return ret; +} + + +void via_reclaim_buffers_locked(struct drm_device * dev, + struct drm_file *file_priv) +{ + drm_via_private_t *dev_priv = dev->dev_private; + + if (drm_sman_owner_clean(&dev_priv->sman, (unsigned long)file_priv)) + return; + + if (dev->driver->dma_quiescent) + dev->driver->dma_quiescent(dev); + + drm_sman_owner_cleanup(&dev_priv->sman, (unsigned long)file_priv); + + return; +} diff --git a/sys/dev/drm/via_verifier.c b/sys/dev/drm/via_verifier.c new file mode 100644 index 000000000000..7169e64fe403 --- /dev/null +++ b/sys/dev/drm/via_verifier.c @@ -0,0 +1,1115 @@ +/*- + * Copyright 2004 The Unichrome Project. All Rights Reserved. + * Copyright 2005 Thomas Hellstrom. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S), AND/OR THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Thomas Hellstrom 2004, 2005. + * This code was written using docs obtained under NDA from VIA Inc. + * + * Don't run this code directly on an AGP buffer. Due to cache problems it will + * be very slow. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "dev/drm/via_3d_reg.h" +#include "dev/drm/drmP.h" +#include "dev/drm/drm.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_verifier.h" +#include "dev/drm/via_drv.h" + +typedef enum { + state_command, + state_header2, + state_header1, + state_vheader5, + state_vheader6, + state_error +} verifier_state_t; + +typedef enum { + no_check = 0, + check_for_header2, + check_for_header1, + check_for_header2_err, + check_for_header1_err, + check_for_fire, + check_z_buffer_addr0, + check_z_buffer_addr1, + check_z_buffer_addr_mode, + check_destination_addr0, + check_destination_addr1, + check_destination_addr_mode, + check_for_dummy, + check_for_dd, + check_texture_addr0, + check_texture_addr1, + check_texture_addr2, + check_texture_addr3, + check_texture_addr4, + check_texture_addr5, + check_texture_addr6, + check_texture_addr7, + check_texture_addr8, + check_texture_addr_mode, + check_for_vertex_count, + check_number_texunits, + forbidden_command +} hazard_t; + +/* + * Associates each hazard above with a possible multi-command + * sequence. For example an address that is split over multiple + * commands and that needs to be checked at the first command + * that does not include any part of the address. + */ + +static drm_via_sequence_t seqs[] = { + no_sequence, + no_sequence, + no_sequence, + no_sequence, + no_sequence, + no_sequence, + z_address, + z_address, + z_address, + dest_address, + dest_address, + dest_address, + no_sequence, + no_sequence, + tex_address, + tex_address, + tex_address, + tex_address, + tex_address, + tex_address, + tex_address, + tex_address, + tex_address, + tex_address, + no_sequence +}; + +typedef struct { + unsigned int code; + hazard_t hz; +} hz_init_t; + +static hz_init_t init_table1[] = { + {0xf2, check_for_header2_err}, + {0xf0, check_for_header1_err}, + {0xee, check_for_fire}, + {0xcc, check_for_dummy}, + {0xdd, check_for_dd}, + {0x00, no_check}, + {0x10, check_z_buffer_addr0}, + {0x11, check_z_buffer_addr1}, + {0x12, check_z_buffer_addr_mode}, + {0x13, no_check}, + {0x14, no_check}, + {0x15, no_check}, + {0x23, no_check}, + {0x24, no_check}, + {0x33, no_check}, + {0x34, no_check}, + {0x35, no_check}, + {0x36, no_check}, + {0x37, no_check}, + {0x38, no_check}, + {0x39, no_check}, + {0x3A, no_check}, + {0x3B, no_check}, + {0x3C, no_check}, + {0x3D, no_check}, + {0x3E, no_check}, + {0x40, check_destination_addr0}, + {0x41, check_destination_addr1}, + {0x42, check_destination_addr_mode}, + {0x43, no_check}, + {0x44, no_check}, + {0x50, no_check}, + {0x51, no_check}, + {0x52, no_check}, + {0x53, no_check}, + {0x54, no_check}, + {0x55, no_check}, + {0x56, no_check}, + {0x57, no_check}, + {0x58, no_check}, + {0x70, no_check}, + {0x71, no_check}, + {0x78, no_check}, + {0x79, no_check}, + {0x7A, no_check}, + {0x7B, no_check}, + {0x7C, no_check}, + {0x7D, check_for_vertex_count} +}; + +static hz_init_t init_table2[] = { + {0xf2, check_for_header2_err}, + {0xf0, check_for_header1_err}, + {0xee, check_for_fire}, + {0xcc, check_for_dummy}, + {0x00, check_texture_addr0}, + {0x01, check_texture_addr0}, + {0x02, check_texture_addr0}, + {0x03, check_texture_addr0}, + {0x04, check_texture_addr0}, + {0x05, check_texture_addr0}, + {0x06, check_texture_addr0}, + {0x07, check_texture_addr0}, + {0x08, check_texture_addr0}, + {0x09, check_texture_addr0}, + {0x20, check_texture_addr1}, + {0x21, check_texture_addr1}, + {0x22, check_texture_addr1}, + {0x23, check_texture_addr4}, + {0x2B, check_texture_addr3}, + {0x2C, check_texture_addr3}, + {0x2D, check_texture_addr3}, + {0x2E, check_texture_addr3}, + {0x2F, check_texture_addr3}, + {0x30, check_texture_addr3}, + {0x31, check_texture_addr3}, + {0x32, check_texture_addr3}, + {0x33, check_texture_addr3}, + {0x34, check_texture_addr3}, + {0x4B, check_texture_addr5}, + {0x4C, check_texture_addr6}, + {0x51, check_texture_addr7}, + {0x52, check_texture_addr8}, + {0x77, check_texture_addr2}, + {0x78, no_check}, + {0x79, no_check}, + {0x7A, no_check}, + {0x7B, check_texture_addr_mode}, + {0x7C, no_check}, + {0x7D, no_check}, + {0x7E, no_check}, + {0x7F, no_check}, + {0x80, no_check}, + {0x81, no_check}, + {0x82, no_check}, + {0x83, no_check}, + {0x85, no_check}, + {0x86, no_check}, + {0x87, no_check}, + {0x88, no_check}, + {0x89, no_check}, + {0x8A, no_check}, + {0x90, no_check}, + {0x91, no_check}, + {0x92, no_check}, + {0x93, no_check} +}; + +static hz_init_t init_table3[] = { + {0xf2, check_for_header2_err}, + {0xf0, check_for_header1_err}, + {0xcc, check_for_dummy}, + {0x00, check_number_texunits} +}; + +static hazard_t table1[256]; +static hazard_t table2[256]; +static hazard_t table3[256]; + +static __inline__ int +eat_words(const uint32_t ** buf, const uint32_t * buf_end, unsigned num_words) +{ + if ((buf_end - *buf) >= num_words) { + *buf += num_words; + return 0; + } + DRM_ERROR("Illegal termination of DMA command buffer\n"); + return 1; +} + +/* + * Partially stolen from drm_memory.h + */ + +static __inline__ drm_local_map_t *via_drm_lookup_agp_map(drm_via_state_t *seq, + unsigned long offset, + unsigned long size, + struct drm_device * dev) +{ + drm_local_map_t *map = seq->map_cache; + + if (map && map->offset <= offset + && (offset + size) <= (map->offset + map->size)) { + return map; + } + + TAILQ_FOREACH(map, &dev->maplist, link) { + if (map->offset <= offset + && (offset + size) <= (map->offset + map->size) + && !(map->flags & _DRM_RESTRICTED) + && (map->type == _DRM_AGP)) { + seq->map_cache = map; + return map; + } + } + return NULL; +} + +/* + * Require that all AGP texture levels reside in the same AGP map which should + * be mappable by the client. This is not a big restriction. + * FIXME: To actually enforce this security policy strictly, drm_rmmap + * would have to wait for dma quiescent before removing an AGP map. + * The via_drm_lookup_agp_map call in reality seems to take + * very little CPU time. + */ + +static __inline__ int finish_current_sequence(drm_via_state_t * cur_seq) +{ + switch (cur_seq->unfinished) { + case z_address: + DRM_DEBUG("Z Buffer start address is 0x%x\n", cur_seq->z_addr); + break; + case dest_address: + DRM_DEBUG("Destination start address is 0x%x\n", + cur_seq->d_addr); + break; + case tex_address: + if (cur_seq->agp_texture) { + unsigned start = + cur_seq->tex_level_lo[cur_seq->texture]; + unsigned end = cur_seq->tex_level_hi[cur_seq->texture]; + unsigned long lo = ~0, hi = 0, tmp; + uint32_t *addr, *pitch, *height, tex; + unsigned i; + int npot; + + if (end > 9) + end = 9; + if (start > 9) + start = 9; + + addr = + &(cur_seq->t_addr[tex = cur_seq->texture][start]); + pitch = &(cur_seq->pitch[tex][start]); + height = &(cur_seq->height[tex][start]); + npot = cur_seq->tex_npot[tex]; + for (i = start; i <= end; ++i) { + tmp = *addr++; + if (tmp < lo) + lo = tmp; + if (i == 0 && npot) + tmp += (*height++ * *pitch++); + else + tmp += (*height++ << *pitch++); + if (tmp > hi) + hi = tmp; + } + + if (!via_drm_lookup_agp_map + (cur_seq, lo, hi - lo, cur_seq->dev)) { + DRM_ERROR + ("AGP texture is not in allowed map\n"); + return 2; + } + } + break; + default: + break; + } + cur_seq->unfinished = no_sequence; + return 0; +} + +static __inline__ int +investigate_hazard(uint32_t cmd, hazard_t hz, drm_via_state_t * cur_seq) +{ + register uint32_t tmp, *tmp_addr; + + if (cur_seq->unfinished && (cur_seq->unfinished != seqs[hz])) { + int ret; + if ((ret = finish_current_sequence(cur_seq))) + return ret; + } + + switch (hz) { + case check_for_header2: + if (cmd == HALCYON_HEADER2) + return 1; + return 0; + case check_for_header1: + if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1) + return 1; + return 0; + case check_for_header2_err: + if (cmd == HALCYON_HEADER2) + return 1; + DRM_ERROR("Illegal DMA HALCYON_HEADER2 command\n"); + break; + case check_for_header1_err: + if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1) + return 1; + DRM_ERROR("Illegal DMA HALCYON_HEADER1 command\n"); + break; + case check_for_fire: + if ((cmd & HALCYON_FIREMASK) == HALCYON_FIRECMD) + return 1; + DRM_ERROR("Illegal DMA HALCYON_FIRECMD command\n"); + break; + case check_for_dummy: + if (HC_DUMMY == cmd) + return 0; + DRM_ERROR("Illegal DMA HC_DUMMY command\n"); + break; + case check_for_dd: + if (0xdddddddd == cmd) + return 0; + DRM_ERROR("Illegal DMA 0xdddddddd command\n"); + break; + case check_z_buffer_addr0: + cur_seq->unfinished = z_address; + cur_seq->z_addr = (cur_seq->z_addr & 0xFF000000) | + (cmd & 0x00FFFFFF); + return 0; + case check_z_buffer_addr1: + cur_seq->unfinished = z_address; + cur_seq->z_addr = (cur_seq->z_addr & 0x00FFFFFF) | + ((cmd & 0xFF) << 24); + return 0; + case check_z_buffer_addr_mode: + cur_seq->unfinished = z_address; + if ((cmd & 0x0000C000) == 0) + return 0; + DRM_ERROR("Attempt to place Z buffer in system memory\n"); + return 2; + case check_destination_addr0: + cur_seq->unfinished = dest_address; + cur_seq->d_addr = (cur_seq->d_addr & 0xFF000000) | + (cmd & 0x00FFFFFF); + return 0; + case check_destination_addr1: + cur_seq->unfinished = dest_address; + cur_seq->d_addr = (cur_seq->d_addr & 0x00FFFFFF) | + ((cmd & 0xFF) << 24); + return 0; + case check_destination_addr_mode: + cur_seq->unfinished = dest_address; + if ((cmd & 0x0000C000) == 0) + return 0; + DRM_ERROR + ("Attempt to place 3D drawing buffer in system memory\n"); + return 2; + case check_texture_addr0: + cur_seq->unfinished = tex_address; + tmp = (cmd >> 24); + tmp_addr = &cur_seq->t_addr[cur_seq->texture][tmp]; + *tmp_addr = (*tmp_addr & 0xFF000000) | (cmd & 0x00FFFFFF); + return 0; + case check_texture_addr1: + cur_seq->unfinished = tex_address; + tmp = ((cmd >> 24) - 0x20); + tmp += tmp << 1; + tmp_addr = &cur_seq->t_addr[cur_seq->texture][tmp]; + *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF) << 24); + tmp_addr++; + *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF00) << 16); + tmp_addr++; + *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF0000) << 8); + return 0; + case check_texture_addr2: + cur_seq->unfinished = tex_address; + cur_seq->tex_level_lo[tmp = cur_seq->texture] = cmd & 0x3F; + cur_seq->tex_level_hi[tmp] = (cmd & 0xFC0) >> 6; + return 0; + case check_texture_addr3: + cur_seq->unfinished = tex_address; + tmp = ((cmd >> 24) - HC_SubA_HTXnL0Pit); + if (tmp == 0 && + (cmd & HC_HTXnEnPit_MASK)) { + cur_seq->pitch[cur_seq->texture][tmp] = + (cmd & HC_HTXnLnPit_MASK); + cur_seq->tex_npot[cur_seq->texture] = 1; + } else { + cur_seq->pitch[cur_seq->texture][tmp] = + (cmd & HC_HTXnLnPitE_MASK) >> HC_HTXnLnPitE_SHIFT; + cur_seq->tex_npot[cur_seq->texture] = 0; + if (cmd & 0x000FFFFF) { + DRM_ERROR + ("Unimplemented texture level 0 pitch mode.\n"); + return 2; + } + } + return 0; + case check_texture_addr4: + cur_seq->unfinished = tex_address; + tmp_addr = &cur_seq->t_addr[cur_seq->texture][9]; + *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF) << 24); + return 0; + case check_texture_addr5: + case check_texture_addr6: + cur_seq->unfinished = tex_address; + /* + * Texture width. We don't care since we have the pitch. + */ + return 0; + case check_texture_addr7: + cur_seq->unfinished = tex_address; + tmp_addr = &(cur_seq->height[cur_seq->texture][0]); + tmp_addr[5] = 1 << ((cmd & 0x00F00000) >> 20); + tmp_addr[4] = 1 << ((cmd & 0x000F0000) >> 16); + tmp_addr[3] = 1 << ((cmd & 0x0000F000) >> 12); + tmp_addr[2] = 1 << ((cmd & 0x00000F00) >> 8); + tmp_addr[1] = 1 << ((cmd & 0x000000F0) >> 4); + tmp_addr[0] = 1 << (cmd & 0x0000000F); + return 0; + case check_texture_addr8: + cur_seq->unfinished = tex_address; + tmp_addr = &(cur_seq->height[cur_seq->texture][0]); + tmp_addr[9] = 1 << ((cmd & 0x0000F000) >> 12); + tmp_addr[8] = 1 << ((cmd & 0x00000F00) >> 8); + tmp_addr[7] = 1 << ((cmd & 0x000000F0) >> 4); + tmp_addr[6] = 1 << (cmd & 0x0000000F); + return 0; + case check_texture_addr_mode: + cur_seq->unfinished = tex_address; + if (2 == (tmp = cmd & 0x00000003)) { + DRM_ERROR + ("Attempt to fetch texture from system memory.\n"); + return 2; + } + cur_seq->agp_texture = (tmp == 3); + cur_seq->tex_palette_size[cur_seq->texture] = + (cmd >> 16) & 0x000000007; + return 0; + case check_for_vertex_count: + cur_seq->vertex_count = cmd & 0x0000FFFF; + return 0; + case check_number_texunits: + cur_seq->multitex = (cmd >> 3) & 1; + return 0; + default: + DRM_ERROR("Illegal DMA data: 0x%x\n", cmd); + return 2; + } + return 2; +} + +static __inline__ int +via_check_prim_list(uint32_t const **buffer, const uint32_t * buf_end, + drm_via_state_t * cur_seq) +{ + drm_via_private_t *dev_priv = + (drm_via_private_t *) cur_seq->dev->dev_private; + uint32_t a_fire, bcmd, dw_count; + int ret = 0; + int have_fire; + const uint32_t *buf = *buffer; + + while (buf < buf_end) { + have_fire = 0; + if ((buf_end - buf) < 2) { + DRM_ERROR + ("Unexpected termination of primitive list.\n"); + ret = 1; + break; + } + if ((*buf & HC_ACMD_MASK) != HC_ACMD_HCmdB) + break; + bcmd = *buf++; + if ((*buf & HC_ACMD_MASK) != HC_ACMD_HCmdA) { + DRM_ERROR("Expected Vertex List A command, got 0x%x\n", + *buf); + ret = 1; + break; + } + a_fire = + *buf++ | HC_HPLEND_MASK | HC_HPMValidN_MASK | + HC_HE3Fire_MASK; + + /* + * How many dwords per vertex ? + */ + + if (cur_seq->agp && ((bcmd & (0xF << 11)) == 0)) { + DRM_ERROR("Illegal B command vertex data for AGP.\n"); + ret = 1; + break; + } + + dw_count = 0; + if (bcmd & (1 << 7)) + dw_count += (cur_seq->multitex) ? 2 : 1; + if (bcmd & (1 << 8)) + dw_count += (cur_seq->multitex) ? 2 : 1; + if (bcmd & (1 << 9)) + dw_count++; + if (bcmd & (1 << 10)) + dw_count++; + if (bcmd & (1 << 11)) + dw_count++; + if (bcmd & (1 << 12)) + dw_count++; + if (bcmd & (1 << 13)) + dw_count++; + if (bcmd & (1 << 14)) + dw_count++; + + while (buf < buf_end) { + if (*buf == a_fire) { + if (dev_priv->num_fire_offsets >= + VIA_FIRE_BUF_SIZE) { + DRM_ERROR("Fire offset buffer full.\n"); + ret = 1; + break; + } + dev_priv->fire_offsets[dev_priv-> + num_fire_offsets++] = + buf; + have_fire = 1; + buf++; + if (buf < buf_end && *buf == a_fire) + buf++; + break; + } + if ((*buf == HALCYON_HEADER2) || + ((*buf & HALCYON_FIREMASK) == HALCYON_FIRECMD)) { + DRM_ERROR("Missing Vertex Fire command, " + "Stray Vertex Fire command or verifier " + "lost sync.\n"); + ret = 1; + break; + } + if ((ret = eat_words(&buf, buf_end, dw_count))) + break; + } + if (buf >= buf_end && !have_fire) { + DRM_ERROR("Missing Vertex Fire command or verifier " + "lost sync.\n"); + ret = 1; + break; + } + if (cur_seq->agp && ((buf - cur_seq->buf_start) & 0x01)) { + DRM_ERROR("AGP Primitive list end misaligned.\n"); + ret = 1; + break; + } + } + *buffer = buf; + return ret; +} + +static __inline__ verifier_state_t +via_check_header2(uint32_t const **buffer, const uint32_t * buf_end, + drm_via_state_t * hc_state) +{ + uint32_t cmd; + int hz_mode; + hazard_t hz; + const uint32_t *buf = *buffer; + const hazard_t *hz_table; + + if ((buf_end - buf) < 2) { + DRM_ERROR + ("Illegal termination of DMA HALCYON_HEADER2 sequence.\n"); + return state_error; + } + buf++; + cmd = (*buf++ & 0xFFFF0000) >> 16; + + switch (cmd) { + case HC_ParaType_CmdVdata: + if (via_check_prim_list(&buf, buf_end, hc_state)) + return state_error; + *buffer = buf; + return state_command; + case HC_ParaType_NotTex: + hz_table = table1; + break; + case HC_ParaType_Tex: + hc_state->texture = 0; + hz_table = table2; + break; + case (HC_ParaType_Tex | (HC_SubType_Tex1 << 8)): + hc_state->texture = 1; + hz_table = table2; + break; + case (HC_ParaType_Tex | (HC_SubType_TexGeneral << 8)): + hz_table = table3; + break; + case HC_ParaType_Auto: + if (eat_words(&buf, buf_end, 2)) + return state_error; + *buffer = buf; + return state_command; + case (HC_ParaType_Palette | (HC_SubType_Stipple << 8)): + if (eat_words(&buf, buf_end, 32)) + return state_error; + *buffer = buf; + return state_command; + case (HC_ParaType_Palette | (HC_SubType_TexPalette0 << 8)): + case (HC_ParaType_Palette | (HC_SubType_TexPalette1 << 8)): + DRM_ERROR("Texture palettes are rejected because of " + "lack of info how to determine their size.\n"); + return state_error; + case (HC_ParaType_Palette | (HC_SubType_FogTable << 8)): + DRM_ERROR("Fog factor palettes are rejected because of " + "lack of info how to determine their size.\n"); + return state_error; + default: + + /* + * There are some unimplemented HC_ParaTypes here, that + * need to be implemented if the Mesa driver is extended. + */ + + DRM_ERROR("Invalid or unimplemented HALCYON_HEADER2 " + "DMA subcommand: 0x%x. Previous dword: 0x%x\n", + cmd, *(buf - 2)); + *buffer = buf; + return state_error; + } + + while (buf < buf_end) { + cmd = *buf++; + if ((hz = hz_table[cmd >> 24])) { + if ((hz_mode = investigate_hazard(cmd, hz, hc_state))) { + if (hz_mode == 1) { + buf--; + break; + } + return state_error; + } + } else if (hc_state->unfinished && + finish_current_sequence(hc_state)) { + return state_error; + } + } + if (hc_state->unfinished && finish_current_sequence(hc_state)) { + return state_error; + } + *buffer = buf; + return state_command; +} + +static __inline__ verifier_state_t +via_parse_header2(drm_via_private_t * dev_priv, uint32_t const **buffer, + const uint32_t * buf_end, int *fire_count) +{ + uint32_t cmd; + const uint32_t *buf = *buffer; + const uint32_t *next_fire; + int burst = 0; + + next_fire = dev_priv->fire_offsets[*fire_count]; + buf++; + cmd = (*buf & 0xFFFF0000) >> 16; + VIA_WRITE(HC_REG_TRANS_SET + HC_REG_BASE, *buf++); + switch (cmd) { + case HC_ParaType_CmdVdata: + while ((buf < buf_end) && + (*fire_count < dev_priv->num_fire_offsets) && + (*buf & HC_ACMD_MASK) == HC_ACMD_HCmdB) { + while (buf <= next_fire) { + VIA_WRITE(HC_REG_TRANS_SPACE + HC_REG_BASE + + (burst & 63), *buf++); + burst += 4; + } + if ((buf < buf_end) + && ((*buf & HALCYON_FIREMASK) == HALCYON_FIRECMD)) + buf++; + + if (++(*fire_count) < dev_priv->num_fire_offsets) + next_fire = dev_priv->fire_offsets[*fire_count]; + } + break; + default: + while (buf < buf_end) { + + if (*buf == HC_HEADER2 || + (*buf & HALCYON_HEADER1MASK) == HALCYON_HEADER1 || + (*buf & VIA_VIDEOMASK) == VIA_VIDEO_HEADER5 || + (*buf & VIA_VIDEOMASK) == VIA_VIDEO_HEADER6) + break; + + VIA_WRITE(HC_REG_TRANS_SPACE + HC_REG_BASE + + (burst & 63), *buf++); + burst += 4; + } + } + *buffer = buf; + return state_command; +} + +static __inline__ int verify_mmio_address(uint32_t address) +{ + if ((address > 0x3FF) && (address < 0xC00)) { + DRM_ERROR("Invalid VIDEO DMA command. " + "Attempt to access 3D- or command burst area.\n"); + return 1; + } else if ((address > 0xCFF) && (address < 0x1300)) { + DRM_ERROR("Invalid VIDEO DMA command. " + "Attempt to access PCI DMA area.\n"); + return 1; + } else if (address > 0x13FF) { + DRM_ERROR("Invalid VIDEO DMA command. " + "Attempt to access VGA registers.\n"); + return 1; + } + return 0; +} + +static __inline__ int +verify_video_tail(uint32_t const **buffer, const uint32_t * buf_end, + uint32_t dwords) +{ + const uint32_t *buf = *buffer; + + if (buf_end - buf < dwords) { + DRM_ERROR("Illegal termination of video command.\n"); + return 1; + } + while (dwords--) { + if (*buf++) { + DRM_ERROR("Illegal video command tail.\n"); + return 1; + } + } + *buffer = buf; + return 0; +} + +static __inline__ verifier_state_t +via_check_header1(uint32_t const **buffer, const uint32_t * buf_end) +{ + uint32_t cmd; + const uint32_t *buf = *buffer; + verifier_state_t ret = state_command; + + while (buf < buf_end) { + cmd = *buf; + if ((cmd > ((0x3FF >> 2) | HALCYON_HEADER1)) && + (cmd < ((0xC00 >> 2) | HALCYON_HEADER1))) { + if ((cmd & HALCYON_HEADER1MASK) != HALCYON_HEADER1) + break; + DRM_ERROR("Invalid HALCYON_HEADER1 command. " + "Attempt to access 3D- or command burst area.\n"); + ret = state_error; + break; + } else if (cmd > ((0xCFF >> 2) | HALCYON_HEADER1)) { + if ((cmd & HALCYON_HEADER1MASK) != HALCYON_HEADER1) + break; + DRM_ERROR("Invalid HALCYON_HEADER1 command. " + "Attempt to access VGA registers.\n"); + ret = state_error; + break; + } else { + buf += 2; + } + } + *buffer = buf; + return ret; +} + +static __inline__ verifier_state_t +via_parse_header1(drm_via_private_t * dev_priv, uint32_t const **buffer, + const uint32_t * buf_end) +{ + register uint32_t cmd; + const uint32_t *buf = *buffer; + + while (buf < buf_end) { + cmd = *buf; + if ((cmd & HALCYON_HEADER1MASK) != HALCYON_HEADER1) + break; + VIA_WRITE((cmd & ~HALCYON_HEADER1MASK) << 2, *++buf); + buf++; + } + *buffer = buf; + return state_command; +} + +static __inline__ verifier_state_t +via_check_vheader5(uint32_t const **buffer, const uint32_t * buf_end) +{ + uint32_t data; + const uint32_t *buf = *buffer; + + if (buf_end - buf < 4) { + DRM_ERROR("Illegal termination of video header5 command\n"); + return state_error; + } + + data = *buf++ & ~VIA_VIDEOMASK; + if (verify_mmio_address(data)) + return state_error; + + data = *buf++; + if (*buf++ != 0x00F50000) { + DRM_ERROR("Illegal header5 header data\n"); + return state_error; + } + if (*buf++ != 0x00000000) { + DRM_ERROR("Illegal header5 header data\n"); + return state_error; + } + if (eat_words(&buf, buf_end, data)) + return state_error; + if ((data & 3) && verify_video_tail(&buf, buf_end, 4 - (data & 3))) + return state_error; + *buffer = buf; + return state_command; + +} + +static __inline__ verifier_state_t +via_parse_vheader5(drm_via_private_t * dev_priv, uint32_t const **buffer, + const uint32_t * buf_end) +{ + uint32_t addr, count, i; + const uint32_t *buf = *buffer; + + addr = *buf++ & ~VIA_VIDEOMASK; + i = count = *buf; + buf += 3; + while (i--) { + VIA_WRITE(addr, *buf++); + } + if (count & 3) + buf += 4 - (count & 3); + *buffer = buf; + return state_command; +} + +static __inline__ verifier_state_t +via_check_vheader6(uint32_t const **buffer, const uint32_t * buf_end) +{ + uint32_t data; + const uint32_t *buf = *buffer; + uint32_t i; + + if (buf_end - buf < 4) { + DRM_ERROR("Illegal termination of video header6 command\n"); + return state_error; + } + buf++; + data = *buf++; + if (*buf++ != 0x00F60000) { + DRM_ERROR("Illegal header6 header data\n"); + return state_error; + } + if (*buf++ != 0x00000000) { + DRM_ERROR("Illegal header6 header data\n"); + return state_error; + } + if ((buf_end - buf) < (data << 1)) { + DRM_ERROR("Illegal termination of video header6 command\n"); + return state_error; + } + for (i = 0; i < data; ++i) { + if (verify_mmio_address(*buf++)) + return state_error; + buf++; + } + data <<= 1; + if ((data & 3) && verify_video_tail(&buf, buf_end, 4 - (data & 3))) + return state_error; + *buffer = buf; + return state_command; +} + +static __inline__ verifier_state_t +via_parse_vheader6(drm_via_private_t * dev_priv, uint32_t const **buffer, + const uint32_t * buf_end) +{ + + uint32_t addr, count, i; + const uint32_t *buf = *buffer; + + i = count = *++buf; + buf += 3; + while (i--) { + addr = *buf++; + VIA_WRITE(addr, *buf++); + } + count <<= 1; + if (count & 3) + buf += 4 - (count & 3); + *buffer = buf; + return state_command; +} + +int +via_verify_command_stream(const uint32_t * buf, unsigned int size, + struct drm_device * dev, int agp) +{ + + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + drm_via_state_t *hc_state = &dev_priv->hc_state; + drm_via_state_t saved_state = *hc_state; + uint32_t cmd; + const uint32_t *buf_end = buf + (size >> 2); + verifier_state_t state = state_command; + int cme_video; + int supported_3d; + + cme_video = (dev_priv->chipset == VIA_PRO_GROUP_A || + dev_priv->chipset == VIA_DX9_0); + + supported_3d = dev_priv->chipset != VIA_DX9_0; + + hc_state->dev = dev; + hc_state->unfinished = no_sequence; + hc_state->map_cache = NULL; + hc_state->agp = agp; + hc_state->buf_start = buf; + dev_priv->num_fire_offsets = 0; + + while (buf < buf_end) { + + switch (state) { + case state_header2: + state = via_check_header2(&buf, buf_end, hc_state); + break; + case state_header1: + state = via_check_header1(&buf, buf_end); + break; + case state_vheader5: + state = via_check_vheader5(&buf, buf_end); + break; + case state_vheader6: + state = via_check_vheader6(&buf, buf_end); + break; + case state_command: + if ((HALCYON_HEADER2 == (cmd = *buf)) && + supported_3d) + state = state_header2; + else if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1) + state = state_header1; + else if (cme_video + && (cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER5) + state = state_vheader5; + else if (cme_video + && (cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER6) + state = state_vheader6; + else if ((cmd == HALCYON_HEADER2) && !supported_3d) { + DRM_ERROR("Accelerated 3D is not supported on this chipset yet.\n"); + state = state_error; + } else { + DRM_ERROR + ("Invalid / Unimplemented DMA HEADER command. 0x%x\n", + cmd); + state = state_error; + } + break; + case state_error: + default: + *hc_state = saved_state; + return -EINVAL; + } + } + if (state == state_error) { + *hc_state = saved_state; + return -EINVAL; + } + return 0; +} + +int +via_parse_command_stream(struct drm_device * dev, const uint32_t * buf, + unsigned int size) +{ + + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + uint32_t cmd; + const uint32_t *buf_end = buf + (size >> 2); + verifier_state_t state = state_command; + int fire_count = 0; + + while (buf < buf_end) { + + switch (state) { + case state_header2: + state = + via_parse_header2(dev_priv, &buf, buf_end, + &fire_count); + break; + case state_header1: + state = via_parse_header1(dev_priv, &buf, buf_end); + break; + case state_vheader5: + state = via_parse_vheader5(dev_priv, &buf, buf_end); + break; + case state_vheader6: + state = via_parse_vheader6(dev_priv, &buf, buf_end); + break; + case state_command: + if (HALCYON_HEADER2 == (cmd = *buf)) + state = state_header2; + else if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1) + state = state_header1; + else if ((cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER5) + state = state_vheader5; + else if ((cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER6) + state = state_vheader6; + else { + DRM_ERROR + ("Invalid / Unimplemented DMA HEADER command. 0x%x\n", + cmd); + state = state_error; + } + break; + case state_error: + default: + return -EINVAL; + } + } + if (state == state_error) { + return -EINVAL; + } + return 0; +} + +static void +setup_hazard_table(hz_init_t init_table[], hazard_t table[], int size) +{ + int i; + + for (i = 0; i < 256; ++i) { + table[i] = forbidden_command; + } + + for (i = 0; i < size; ++i) { + table[init_table[i].code] = init_table[i].hz; + } +} + +void via_init_command_verifier(void) +{ + setup_hazard_table(init_table1, table1, + sizeof(init_table1) / sizeof(hz_init_t)); + setup_hazard_table(init_table2, table2, + sizeof(init_table2) / sizeof(hz_init_t)); + setup_hazard_table(init_table3, table3, + sizeof(init_table3) / sizeof(hz_init_t)); +} diff --git a/sys/dev/drm/via_verifier.h b/sys/dev/drm/via_verifier.h new file mode 100644 index 000000000000..153b472c139b --- /dev/null +++ b/sys/dev/drm/via_verifier.h @@ -0,0 +1,65 @@ +/*- + * Copyright 2004 The Unichrome Project. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE UNICHROME PROJECT, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Thomas Hellström 2004. + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _VIA_VERIFIER_H_ +#define _VIA_VERIFIER_H_ + +typedef enum { + no_sequence = 0, + z_address, + dest_address, + tex_address +} drm_via_sequence_t; + +typedef struct { + unsigned texture; + uint32_t z_addr; + uint32_t d_addr; + uint32_t t_addr[2][10]; + uint32_t pitch[2][10]; + uint32_t height[2][10]; + uint32_t tex_level_lo[2]; + uint32_t tex_level_hi[2]; + uint32_t tex_palette_size[2]; + uint32_t tex_npot[2]; + drm_via_sequence_t unfinished; + int agp_texture; + int multitex; + struct drm_device *dev; + drm_local_map_t *map_cache; + uint32_t vertex_count; + int agp; + const uint32_t *buf_start; +} drm_via_state_t; + +extern int via_verify_command_stream(const uint32_t * buf, unsigned int size, + struct drm_device * dev, int agp); +extern int via_parse_command_stream(struct drm_device *dev, const uint32_t *buf, + unsigned int size); + +#endif diff --git a/sys/dev/drm/via_video.c b/sys/dev/drm/via_video.c new file mode 100644 index 000000000000..f903cf55f104 --- /dev/null +++ b/sys/dev/drm/via_video.c @@ -0,0 +1,96 @@ +/*- + * Copyright 2005 Thomas Hellstrom. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S), AND/OR THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Author: Thomas Hellstrom 2005. + * + * Video and XvMC related functions. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "dev/drm/drmP.h" +#include "dev/drm/via_drm.h" +#include "dev/drm/via_drv.h" + +void via_init_futex(drm_via_private_t * dev_priv) +{ + unsigned int i; + + DRM_DEBUG("\n"); + + for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i) { + DRM_INIT_WAITQUEUE(&(dev_priv->decoder_queue[i])); + XVMCLOCKPTR(dev_priv->sarea_priv, i)->lock = 0; + } +} + +void via_cleanup_futex(drm_via_private_t * dev_priv) +{ +} + +void via_release_futex(drm_via_private_t * dev_priv, int context) +{ + unsigned int i; + volatile int *lock; + + if (!dev_priv->sarea_priv) + return; + + for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i) { + lock = (volatile int *)XVMCLOCKPTR(dev_priv->sarea_priv, i); + if ((_DRM_LOCKING_CONTEXT(*lock) == context)) { + if (_DRM_LOCK_IS_HELD(*lock) + && (*lock & _DRM_LOCK_CONT)) { + DRM_WAKEUP(&(dev_priv->decoder_queue[i])); + } + *lock = 0; + } + } +} + +int via_decoder_futex(struct drm_device *dev, void *data, struct drm_file *file_priv) +{ + drm_via_futex_t *fx = data; + volatile int *lock; + drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; + drm_via_sarea_t *sAPriv = dev_priv->sarea_priv; + int ret = 0; + + DRM_DEBUG("\n"); + + if (fx->lock > VIA_NR_XVMC_LOCKS) + return -EFAULT; + + lock = (volatile int *)XVMCLOCKPTR(sAPriv, fx->lock); + + switch (fx->func) { + case VIA_FUTEX_WAIT: + DRM_WAIT_ON(ret, dev_priv->decoder_queue[fx->lock], + (fx->ms / 10) * (DRM_HZ / 100), *lock != fx->val); + return ret; + case VIA_FUTEX_WAKE: + DRM_WAKEUP(&(dev_priv->decoder_queue[fx->lock])); + return 0; + } + return 0; +} diff --git a/sys/dev/e1000/LICENSE b/sys/dev/e1000/LICENSE index d3f8bf5f367e..f70a7cbd4a1d 100644 --- a/sys/dev/e1000/LICENSE +++ b/sys/dev/e1000/LICENSE @@ -1,6 +1,6 @@ $FreeBSD$ - Copyright (c) 2001-2008, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/e1000/e1000_80003es2lan.c b/sys/dev/e1000/e1000_80003es2lan.c index 5c060869cf96..db32f8cbe363 100644 --- a/sys/dev/e1000/e1000_80003es2lan.c +++ b/sys/dev/e1000/e1000_80003es2lan.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -171,7 +171,7 @@ static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw) break; } - nvm->type = e1000_nvm_eeprom_spi; + nvm->type = e1000_nvm_eeprom_spi; size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >> E1000_EECD_SIZE_EX_SHIFT); @@ -206,17 +206,22 @@ static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw) static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw) { struct e1000_mac_info *mac = &hw->mac; - s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_init_mac_params_80003es2lan"); - /* Set media type */ + /* Set media type and media-dependent function pointers */ switch (hw->device_id) { case E1000_DEV_ID_80003ES2LAN_SERDES_DPT: hw->phy.media_type = e1000_media_type_internal_serdes; + mac->ops.check_for_link = e1000_check_for_serdes_link_generic; + mac->ops.setup_physical_interface = + e1000_setup_fiber_serdes_link_generic; break; default: hw->phy.media_type = e1000_media_type_copper; + mac->ops.check_for_link = e1000_check_for_copper_link_generic; + mac->ops.setup_physical_interface = + e1000_setup_copper_link_80003es2lan; break; } @@ -230,6 +235,8 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw) mac->arc_subsystem_valid = (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK) ? TRUE : FALSE; + /* Adaptive IFS not supported */ + mac->adaptive_ifs = FALSE; /* Function pointers */ @@ -241,27 +248,6 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw) mac->ops.init_hw = e1000_init_hw_80003es2lan; /* link setup */ mac->ops.setup_link = e1000_setup_link_generic; - /* physical interface link setup */ - mac->ops.setup_physical_interface = - (hw->phy.media_type == e1000_media_type_copper) - ? e1000_setup_copper_link_80003es2lan - : e1000_setup_fiber_serdes_link_generic; - /* check for link */ - switch (hw->phy.media_type) { - case e1000_media_type_copper: - mac->ops.check_for_link = e1000_check_for_copper_link_generic; - break; - case e1000_media_type_fiber: - mac->ops.check_for_link = e1000_check_for_fiber_link_generic; - break; - case e1000_media_type_internal_serdes: - mac->ops.check_for_link = e1000_check_for_serdes_link_generic; - break; - default: - ret_val = -E1000_ERR_CONFIG; - goto out; - break; - } /* check management mode */ mac->ops.check_mng_mode = e1000_check_mng_mode_generic; /* multicast address update */ @@ -270,8 +256,6 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw) mac->ops.write_vfta = e1000_write_vfta_generic; /* clearing VFTA */ mac->ops.clear_vfta = e1000_clear_vfta_generic; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_generic; /* read mac address */ mac->ops.read_mac_addr = e1000_read_mac_addr_80003es2lan; /* ID LED init */ @@ -290,8 +274,10 @@ static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw) /* link info */ mac->ops.get_link_up_info = e1000_get_link_up_info_80003es2lan; -out: - return ret_val; + /* set lan id for port to determine which phy lock to use */ + hw->mac.ops.set_lan_id(hw); + + return E1000_SUCCESS; } /** @@ -307,7 +293,6 @@ void e1000_init_function_pointers_80003es2lan(struct e1000_hw *hw) hw->mac.ops.init_params = e1000_init_mac_params_80003es2lan; hw->nvm.ops.init_params = e1000_init_nvm_params_80003es2lan; hw->phy.ops.init_params = e1000_init_phy_params_80003es2lan; - e1000_get_bus_info_pcie_generic(hw); } /** @@ -342,7 +327,6 @@ static void e1000_release_phy_80003es2lan(struct e1000_hw *hw) e1000_release_swfw_sync_80003es2lan(hw, mask); } - /** * e1000_acquire_mac_csr_80003es2lan - Acquire rights to access Kumeran register * @hw: pointer to the HW structure @@ -532,28 +516,36 @@ static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw, goto out; } - /* - * The "ready" bit in the MDIC register may be incorrectly set - * before the device has completed the "Page Select" MDI - * transaction. So we wait 200us after each MDI command... - */ - usec_delay(200); + if (hw->dev_spec._80003es2lan.mdic_wa_enable == TRUE) { + /* + * The "ready" bit in the MDIC register may be incorrectly set + * before the device has completed the "Page Select" MDI + * transaction. So we wait 200us after each MDI command... + */ + usec_delay(200); - /* ...and verify the command was successful. */ - ret_val = e1000_read_phy_reg_mdic(hw, page_select, &temp); + /* ...and verify the command was successful. */ + ret_val = e1000_read_phy_reg_mdic(hw, page_select, &temp); - if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) { - ret_val = -E1000_ERR_PHY; - e1000_release_phy_80003es2lan(hw); - goto out; + if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) { + ret_val = -E1000_ERR_PHY; + e1000_release_phy_80003es2lan(hw); + goto out; + } + + usec_delay(200); + + ret_val = e1000_read_phy_reg_mdic(hw, + MAX_PHY_REG_ADDRESS & offset, + data); + + usec_delay(200); + } else { + ret_val = e1000_read_phy_reg_mdic(hw, + MAX_PHY_REG_ADDRESS & offset, + data); } - usec_delay(200); - - ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, - data); - - usec_delay(200); e1000_release_phy_80003es2lan(hw); out: @@ -599,29 +591,36 @@ static s32 e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw, goto out; } + if (hw->dev_spec._80003es2lan.mdic_wa_enable == TRUE) { + /* + * The "ready" bit in the MDIC register may be incorrectly set + * before the device has completed the "Page Select" MDI + * transaction. So we wait 200us after each MDI command... + */ + usec_delay(200); - /* - * The "ready" bit in the MDIC register may be incorrectly set - * before the device has completed the "Page Select" MDI - * transaction. So we wait 200us after each MDI command... - */ - usec_delay(200); + /* ...and verify the command was successful. */ + ret_val = e1000_read_phy_reg_mdic(hw, page_select, &temp); - /* ...and verify the command was successful. */ - ret_val = e1000_read_phy_reg_mdic(hw, page_select, &temp); + if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) { + ret_val = -E1000_ERR_PHY; + e1000_release_phy_80003es2lan(hw); + goto out; + } - if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) { - ret_val = -E1000_ERR_PHY; - e1000_release_phy_80003es2lan(hw); - goto out; + usec_delay(200); + + ret_val = e1000_write_phy_reg_mdic(hw, + MAX_PHY_REG_ADDRESS & offset, + data); + + usec_delay(200); + } else { + ret_val = e1000_write_phy_reg_mdic(hw, + MAX_PHY_REG_ADDRESS & offset, + data); } - usec_delay(200); - - ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, - data); - - usec_delay(200); e1000_release_phy_80003es2lan(hw); out: @@ -802,13 +801,13 @@ static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw) index = phy_data & GG82563_DSPD_CABLE_LENGTH; - if (index >= GG82563_CABLE_LENGTH_TABLE_SIZE + 5) { - ret_val = E1000_ERR_PHY; + if (index >= GG82563_CABLE_LENGTH_TABLE_SIZE - 5) { + ret_val = -E1000_ERR_PHY; goto out; } phy->min_cable_length = e1000_gg82563_cable_length_table[index]; - phy->max_cable_length = e1000_gg82563_cable_length_table[index+5]; + phy->max_cable_length = e1000_gg82563_cable_length_table[index + 5]; phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; @@ -916,10 +915,9 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw) /* Initialize identification LED */ ret_val = mac->ops.id_led_init(hw); - if (ret_val) { + if (ret_val) DEBUGOUT("Error initializing identification LED\n"); /* This is not fatal and we should not stop init due to this */ - } /* Disabling VLAN filtering */ DEBUGOUT("Initializing the IEEE VLAN\n"); @@ -969,6 +967,19 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw) reg_data &= ~0x00100000; E1000_WRITE_REG_ARRAY(hw, E1000_FFLT, 0x0001, reg_data); + /* default to TRUE to enable the MDIC W/A */ + hw->dev_spec._80003es2lan.mdic_wa_enable = TRUE; + + ret_val = e1000_read_kmrn_reg_80003es2lan(hw, + E1000_KMRNCTRLSTA_OFFSET >> + E1000_KMRNCTRLSTA_OFFSET_SHIFT, + &i); + if (!ret_val) { + if ((i & E1000_KMRNCTRLSTA_OPMODE_MASK) == + E1000_KMRNCTRLSTA_OPMODE_INBAND_MDIO) + hw->dev_spec._80003es2lan.mdic_wa_enable = FALSE; + } + /* * Clear all of the statistics registers (clear on read). It is * important that we do this after we have tried to establish link @@ -1035,72 +1046,73 @@ static s32 e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw) DEBUGFUNC("e1000_copper_link_setup_gg82563_80003es2lan"); - if (!phy->reset_disable) { - ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, - &data); - if (ret_val) - goto out; + if (phy->reset_disable) + goto skip_reset; - data |= GG82563_MSCR_ASSERT_CRS_ON_TX; - /* Use 25MHz for both link down and 1000Base-T for Tx clock. */ - data |= GG82563_MSCR_TX_CLK_1000MBPS_25; + ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, + &data); + if (ret_val) + goto out; - ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, - data); - if (ret_val) - goto out; + data |= GG82563_MSCR_ASSERT_CRS_ON_TX; + /* Use 25MHz for both link down and 1000Base-T for Tx clock. */ + data |= GG82563_MSCR_TX_CLK_1000MBPS_25; - /* - * Options: - * MDI/MDI-X = 0 (default) - * 0 - Auto for all speeds - * 1 - MDI mode - * 2 - MDI-X mode - * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) - */ - ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_SPEC_CTRL, &data); - if (ret_val) - goto out; + ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, + data); + if (ret_val) + goto out; - data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK; + /* + * Options: + * MDI/MDI-X = 0 (default) + * 0 - Auto for all speeds + * 1 - MDI mode + * 2 - MDI-X mode + * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) + */ + ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_SPEC_CTRL, &data); + if (ret_val) + goto out; - switch (phy->mdix) { - case 1: - data |= GG82563_PSCR_CROSSOVER_MODE_MDI; - break; - case 2: - data |= GG82563_PSCR_CROSSOVER_MODE_MDIX; - break; - case 0: - default: - data |= GG82563_PSCR_CROSSOVER_MODE_AUTO; - break; - } - - /* - * Options: - * disable_polarity_correction = 0 (default) - * Automatic Correction for Reversed Cable Polarity - * 0 - Disabled - * 1 - Enabled - */ - data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE; - if (phy->disable_polarity_correction) - data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE; - - ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_SPEC_CTRL, data); - if (ret_val) - goto out; - - /* SW Reset the PHY so all changes take effect */ - ret_val = hw->phy.ops.commit(hw); - if (ret_val) { - DEBUGOUT("Error Resetting the PHY\n"); - goto out; - } + data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK; + switch (phy->mdix) { + case 1: + data |= GG82563_PSCR_CROSSOVER_MODE_MDI; + break; + case 2: + data |= GG82563_PSCR_CROSSOVER_MODE_MDIX; + break; + case 0: + default: + data |= GG82563_PSCR_CROSSOVER_MODE_AUTO; + break; } + /* + * Options: + * disable_polarity_correction = 0 (default) + * Automatic Correction for Reversed Cable Polarity + * 0 - Disabled + * 1 - Enabled + */ + data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE; + if (phy->disable_polarity_correction) + data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE; + + ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_SPEC_CTRL, data); + if (ret_val) + goto out; + + /* SW Reset the PHY so all changes take effect */ + ret_val = hw->phy.ops.commit(hw); + if (ret_val) { + DEBUGOUT("Error Resetting the PHY\n"); + goto out; + } + +skip_reset: /* Bypass Rx and Tx FIFO's */ ret_val = e1000_write_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL, @@ -1303,7 +1315,6 @@ static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex) tipg |= DEFAULT_TIPG_IPGT_10_100_80003ES2LAN; E1000_WRITE_REG(hw, E1000_TIPG, tipg); - do { ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); @@ -1357,7 +1368,6 @@ static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw) tipg |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN; E1000_WRITE_REG(hw, E1000_TIPG, tipg); - do { ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, ®_data); diff --git a/sys/dev/e1000/e1000_80003es2lan.h b/sys/dev/e1000/e1000_80003es2lan.h index 7bf8d9d54362..3ab1ec9d04e1 100644 --- a/sys/dev/e1000/e1000_80003es2lan.h +++ b/sys/dev/e1000/e1000_80003es2lan.h @@ -1,6 +1,6 @@ -/******************************************************************************* +/****************************************************************************** - Copyright (c) 2001-2008, Intel Corporation + Copyright (c) 2001-2009, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -29,9 +29,8 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ -/* $FreeBSD$ */ - +******************************************************************************/ +/*$FreeBSD$*/ #ifndef _E1000_80003ES2LAN_H_ #define _E1000_80003ES2LAN_H_ @@ -49,6 +48,9 @@ #define E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT 0x0000 #define E1000_KMRNCTRLSTA_OPMODE_E_IDLE 0x2000 +#define E1000_KMRNCTRLSTA_OPMODE_MASK 0x000C +#define E1000_KMRNCTRLSTA_OPMODE_INBAND_MDIO 0x0004 + #define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */ #define DEFAULT_TCTL_EXT_GCEX_80003ES2LAN 0x00010000 diff --git a/sys/dev/e1000/e1000_82540.c b/sys/dev/e1000/e1000_82540.c index 14dcbb3e35d3..80a5877725cf 100644 --- a/sys/dev/e1000/e1000_82540.c +++ b/sys/dev/e1000/e1000_82540.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -228,8 +228,6 @@ static s32 e1000_init_mac_params_82540(struct e1000_hw *hw) mac->ops.write_vfta = e1000_write_vfta_generic; /* clearing VFTA */ mac->ops.clear_vfta = e1000_clear_vfta_generic; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_generic; /* read mac address */ mac->ops.read_mac_addr = e1000_read_mac_addr_82540; /* ID LED init */ diff --git a/sys/dev/e1000/e1000_82541.c b/sys/dev/e1000/e1000_82541.c index 68d1b05a07b5..fd8d8ebbe746 100644 --- a/sys/dev/e1000/e1000_82541.c +++ b/sys/dev/e1000/e1000_82541.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -59,6 +59,7 @@ static s32 e1000_set_d3_lplu_state_82541(struct e1000_hw *hw, static s32 e1000_setup_led_82541(struct e1000_hw *hw); static s32 e1000_cleanup_led_82541(struct e1000_hw *hw); static void e1000_clear_hw_cntrs_82541(struct e1000_hw *hw); +static s32 e1000_read_mac_addr_82541(struct e1000_hw *hw); static s32 e1000_config_dsp_after_link_change_82541(struct e1000_hw *hw, bool link_up); static s32 e1000_phy_init_script_82541(struct e1000_hw *hw); @@ -259,8 +260,8 @@ static s32 e1000_init_mac_params_82541(struct e1000_hw *hw) mac->ops.write_vfta = e1000_write_vfta_generic; /* clearing VFTA */ mac->ops.clear_vfta = e1000_clear_vfta_generic; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_generic; + /* read mac address */ + mac->ops.read_mac_addr = e1000_read_mac_addr_82541; /* ID LED init */ mac->ops.id_led_init = e1000_id_led_init_generic; /* setup LED */ @@ -1292,3 +1293,35 @@ static void e1000_clear_hw_cntrs_82541(struct e1000_hw *hw) E1000_READ_REG(hw, E1000_MGTPDC); E1000_READ_REG(hw, E1000_MGTPTC); } + +/** + * e1000_read_mac_addr_82541 - Read device MAC address + * @hw: pointer to the HW structure + * + * Reads the device MAC address from the EEPROM and stores the value. + **/ +static s32 e1000_read_mac_addr_82541(struct e1000_hw *hw) +{ + s32 ret_val = E1000_SUCCESS; + u16 offset, nvm_data, i; + + DEBUGFUNC("e1000_read_mac_addr"); + + for (i = 0; i < ETH_ADDR_LEN; i += 2) { + offset = i >> 1; + ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data); + if (ret_val) { + DEBUGOUT("NVM Read Error\n"); + goto out; + } + hw->mac.perm_addr[i] = (u8)(nvm_data & 0xFF); + hw->mac.perm_addr[i+1] = (u8)(nvm_data >> 8); + } + + for (i = 0; i < ETH_ADDR_LEN; i++) + hw->mac.addr[i] = hw->mac.perm_addr[i]; + +out: + return ret_val; +} + diff --git a/sys/dev/e1000/e1000_82542.c b/sys/dev/e1000/e1000_82542.c index 46ef66a0a512..282814bb8934 100644 --- a/sys/dev/e1000/e1000_82542.c +++ b/sys/dev/e1000/e1000_82542.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -134,8 +134,6 @@ static s32 e1000_init_mac_params_82542(struct e1000_hw *hw) mac->ops.write_vfta = e1000_write_vfta_generic; /* clearing VFTA */ mac->ops.clear_vfta = e1000_clear_vfta_generic; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_generic; /* read mac address */ mac->ops.read_mac_addr = e1000_read_mac_addr_82542; /* set RAR */ diff --git a/sys/dev/e1000/e1000_82543.c b/sys/dev/e1000/e1000_82543.c index 97c7f3b2044f..4bb0cbdd5c33 100644 --- a/sys/dev/e1000/e1000_82543.c +++ b/sys/dev/e1000/e1000_82543.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2008, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -63,7 +63,6 @@ static s32 e1000_led_on_82543(struct e1000_hw *hw); static s32 e1000_led_off_82543(struct e1000_hw *hw); static void e1000_write_vfta_82543(struct e1000_hw *hw, u32 offset, u32 value); -static void e1000_mta_set_82543(struct e1000_hw *hw, u32 hash_value); static void e1000_clear_hw_cntrs_82543(struct e1000_hw *hw); static s32 e1000_config_mac_to_phy_82543(struct e1000_hw *hw); static bool e1000_init_phy_disabled_82543(struct e1000_hw *hw); @@ -75,6 +74,8 @@ static void e1000_shift_out_mdi_bits_82543(struct e1000_hw *hw, u32 data, u16 count); static bool e1000_tbi_compatibility_enabled_82543(struct e1000_hw *hw); static void e1000_set_tbi_sbp_82543(struct e1000_hw *hw, bool state); +static s32 e1000_read_mac_addr_82543(struct e1000_hw *hw); + /** * e1000_init_phy_params_82543 - Init PHY func ptrs. @@ -244,8 +245,8 @@ static s32 e1000_init_mac_params_82543(struct e1000_hw *hw) mac->ops.write_vfta = e1000_write_vfta_82543; /* clearing VFTA */ mac->ops.clear_vfta = e1000_clear_vfta_generic; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_82543; + /* read mac address */ + mac->ops.read_mac_addr = e1000_read_mac_addr_82543; /* turn on/off LED */ mac->ops.led_on = e1000_led_on_82543; mac->ops.led_off = e1000_led_off_82543; @@ -1476,45 +1477,6 @@ static void e1000_write_vfta_82543(struct e1000_hw *hw, u32 offset, u32 value) } } -/** - * e1000_mta_set_82543 - Set multicast filter table address - * @hw: pointer to the HW structure - * @hash_value: determines the MTA register and bit to set - * - * The multicast table address is a register array of 32-bit registers. - * The hash_value is used to determine what register the bit is in, the - * current value is read, the new bit is OR'd in and the new value is - * written back into the register. - **/ -static void e1000_mta_set_82543(struct e1000_hw *hw, u32 hash_value) -{ - u32 hash_bit, hash_reg, mta, temp; - - DEBUGFUNC("e1000_mta_set_82543"); - - hash_reg = (hash_value >> 5); - - /* - * If we are on an 82544 and we are trying to write an odd offset - * in the MTA, save off the previous entry before writing and - * restore the old value after writing. - */ - if ((hw->mac.type == e1000_82544) && (hash_reg & 1)) { - hash_reg &= (hw->mac.mta_reg_count - 1); - hash_bit = hash_value & 0x1F; - mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg); - mta |= (1 << hash_bit); - temp = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg - 1); - - E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg, mta); - E1000_WRITE_FLUSH(hw); - E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg - 1, temp); - E1000_WRITE_FLUSH(hw); - } else { - e1000_mta_set_generic(hw, hash_value); - } -} - /** * e1000_led_on_82543 - Turn on SW controllable LED * @hw: pointer to the HW structure @@ -1600,3 +1562,41 @@ static void e1000_clear_hw_cntrs_82543(struct e1000_hw *hw) E1000_READ_REG(hw, E1000_TSCTC); E1000_READ_REG(hw, E1000_TSCTFC); } + +/** + * e1000_read_mac_addr_82543 - Read device MAC address + * @hw: pointer to the HW structure + * + * Reads the device MAC address from the EEPROM and stores the value. + * Since devices with two ports use the same EEPROM, we increment the + * last bit in the MAC address for the second port. + * + **/ +s32 e1000_read_mac_addr_82543(struct e1000_hw *hw) +{ + s32 ret_val = E1000_SUCCESS; + u16 offset, nvm_data, i; + + DEBUGFUNC("e1000_read_mac_addr"); + + for (i = 0; i < ETH_ADDR_LEN; i += 2) { + offset = i >> 1; + ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data); + if (ret_val) { + DEBUGOUT("NVM Read Error\n"); + goto out; + } + hw->mac.perm_addr[i] = (u8)(nvm_data & 0xFF); + hw->mac.perm_addr[i+1] = (u8)(nvm_data >> 8); + } + + /* Flip last bit of mac address if we're on second port */ + if (hw->bus.func == E1000_FUNC_1) + hw->mac.perm_addr[5] ^= 1; + + for (i = 0; i < ETH_ADDR_LEN; i++) + hw->mac.addr[i] = hw->mac.perm_addr[i]; + +out: + return ret_val; +} diff --git a/sys/dev/e1000/e1000_82571.c b/sys/dev/e1000/e1000_82571.c index 18fe745b14a5..96a3b2f5397e 100644 --- a/sys/dev/e1000/e1000_82571.c +++ b/sys/dev/e1000/e1000_82571.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -46,7 +46,6 @@ * 82573E Gigabit Ethernet Controller (Copper) * 82573L Gigabit Ethernet Controller * 82574L Gigabit Network Connection - * 82574L Gigabit Network Connection * 82583V Gigabit Network Connection */ @@ -106,7 +105,6 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) phy->reset_delay_us = 100; phy->ops.acquire = e1000_get_hw_semaphore_82571; - phy->ops.check_polarity = e1000_check_polarity_igp; phy->ops.check_reset_block = e1000_check_reset_block_generic; phy->ops.release = e1000_put_hw_semaphore_82571; phy->ops.reset = e1000_phy_hw_reset_generic; @@ -121,6 +119,7 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) phy->type = e1000_phy_igp_2; phy->ops.get_cfg_done = e1000_get_cfg_done_82571; phy->ops.get_info = e1000_get_phy_info_igp; + phy->ops.check_polarity = e1000_check_polarity_igp; phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_igp; phy->ops.get_cable_length = e1000_get_cable_length_igp_2; phy->ops.read_reg = e1000_read_phy_reg_igp; @@ -132,6 +131,7 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) /* Verify PHY ID */ if (phy->id != IGP01E1000_I_PHY_ID) { ret_val = -E1000_ERR_PHY; + DEBUGOUT1("PHY ID unknown: type = 0x%08x\n", phy->id); goto out; } break; @@ -139,6 +139,7 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) phy->type = e1000_phy_m88; phy->ops.get_cfg_done = e1000_get_cfg_done_generic; phy->ops.get_info = e1000_get_phy_info_m88; + phy->ops.check_polarity = e1000_check_polarity_m88; phy->ops.commit = e1000_phy_sw_reset_generic; phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; phy->ops.get_cable_length = e1000_get_cable_length_m88; @@ -155,11 +156,12 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) goto out; } break; - case e1000_82583: case e1000_82574: + case e1000_82583: phy->type = e1000_phy_bm; phy->ops.get_cfg_done = e1000_get_cfg_done_generic; phy->ops.get_info = e1000_get_phy_info_m88; + phy->ops.check_polarity = e1000_check_polarity_m88; phy->ops.commit = e1000_phy_sw_reset_generic; phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; phy->ops.get_cable_length = e1000_get_cable_length_m88; @@ -266,28 +268,42 @@ static s32 e1000_init_nvm_params_82571(struct e1000_hw *hw) static s32 e1000_init_mac_params_82571(struct e1000_hw *hw) { struct e1000_mac_info *mac = &hw->mac; - s32 ret_val = E1000_SUCCESS; u32 swsm = 0; u32 swsm2 = 0; bool force_clear_smbi = FALSE; DEBUGFUNC("e1000_init_mac_params_82571"); - /* Set media type */ + /* Set media type and media-dependent function pointers */ switch (hw->device_id) { case E1000_DEV_ID_82571EB_FIBER: case E1000_DEV_ID_82572EI_FIBER: case E1000_DEV_ID_82571EB_QUAD_FIBER: hw->phy.media_type = e1000_media_type_fiber; + mac->ops.setup_physical_interface = + e1000_setup_fiber_serdes_link_82571; + mac->ops.check_for_link = e1000_check_for_fiber_link_generic; + mac->ops.get_link_up_info = + e1000_get_speed_and_duplex_fiber_serdes_generic; break; case E1000_DEV_ID_82571EB_SERDES: case E1000_DEV_ID_82571EB_SERDES_DUAL: case E1000_DEV_ID_82571EB_SERDES_QUAD: case E1000_DEV_ID_82572EI_SERDES: hw->phy.media_type = e1000_media_type_internal_serdes; + mac->ops.setup_physical_interface = + e1000_setup_fiber_serdes_link_82571; + mac->ops.check_for_link = e1000_check_for_serdes_link_82571; + mac->ops.get_link_up_info = + e1000_get_speed_and_duplex_fiber_serdes_generic; break; default: hw->phy.media_type = e1000_media_type_copper; + mac->ops.setup_physical_interface = + e1000_setup_copper_link_82571; + mac->ops.check_for_link = e1000_check_for_copper_link_generic; + mac->ops.get_link_up_info = + e1000_get_speed_and_duplex_copper_generic; break; } @@ -301,66 +317,25 @@ static s32 e1000_init_mac_params_82571(struct e1000_hw *hw) mac->arc_subsystem_valid = (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK) ? TRUE : FALSE; + /* Adaptive IFS supported */ + mac->adaptive_ifs = TRUE; /* Function pointers */ /* bus type/speed/width */ mac->ops.get_bus_info = e1000_get_bus_info_pcie_generic; - /* function id */ - switch (hw->mac.type) { - case e1000_82573: - case e1000_82574: - case e1000_82583: - mac->ops.set_lan_id = e1000_set_lan_id_single_port; - break; - default: - break; - } /* reset */ mac->ops.reset_hw = e1000_reset_hw_82571; /* hw initialization */ mac->ops.init_hw = e1000_init_hw_82571; /* link setup */ mac->ops.setup_link = e1000_setup_link_82571; - /* physical interface link setup */ - mac->ops.setup_physical_interface = - (hw->phy.media_type == e1000_media_type_copper) - ? e1000_setup_copper_link_82571 - : e1000_setup_fiber_serdes_link_82571; - /* check for link */ - switch (hw->phy.media_type) { - case e1000_media_type_copper: - mac->ops.check_for_link = e1000_check_for_copper_link_generic; - break; - case e1000_media_type_fiber: - mac->ops.check_for_link = e1000_check_for_fiber_link_generic; - break; - case e1000_media_type_internal_serdes: - mac->ops.check_for_link = e1000_check_for_serdes_link_82571; - break; - default: - ret_val = -E1000_ERR_CONFIG; - goto out; - break; - } - /* check management mode */ - switch (hw->mac.type) { - case e1000_82574: - case e1000_82583: - mac->ops.check_mng_mode = e1000_check_mng_mode_82574; - break; - default: - mac->ops.check_mng_mode = e1000_check_mng_mode_generic; - break; - } /* multicast address update */ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; /* writing VFTA */ mac->ops.write_vfta = e1000_write_vfta_generic; /* clearing VFTA */ mac->ops.clear_vfta = e1000_clear_vfta_82571; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_generic; /* read mac address */ mac->ops.read_mac_addr = e1000_read_mac_addr_82571; /* ID LED init */ @@ -371,24 +346,29 @@ static s32 e1000_init_mac_params_82571(struct e1000_hw *hw) mac->ops.setup_led = e1000_setup_led_generic; /* cleanup LED */ mac->ops.cleanup_led = e1000_cleanup_led_generic; - /* turn on/off LED */ - switch (hw->mac.type) { - case e1000_82574: - case e1000_82583: - mac->ops.led_on = e1000_led_on_82574; - break; - default: - mac->ops.led_on = e1000_led_on_generic; - break; - } + /* turn off LED */ mac->ops.led_off = e1000_led_off_generic; /* clear hardware counters */ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_82571; - /* link info */ - mac->ops.get_link_up_info = - (hw->phy.media_type == e1000_media_type_copper) - ? e1000_get_speed_and_duplex_copper_generic - : e1000_get_speed_and_duplex_fiber_serdes_generic; + + /* MAC-specific function pointers */ + switch (hw->mac.type) { + case e1000_82573: + mac->ops.set_lan_id = e1000_set_lan_id_single_port; + mac->ops.check_mng_mode = e1000_check_mng_mode_generic; + mac->ops.led_on = e1000_led_on_generic; + break; + case e1000_82574: + case e1000_82583: + mac->ops.set_lan_id = e1000_set_lan_id_single_port; + mac->ops.check_mng_mode = e1000_check_mng_mode_82574; + mac->ops.led_on = e1000_led_on_82574; + break; + default: + mac->ops.check_mng_mode = e1000_check_mng_mode_generic; + mac->ops.led_on = e1000_led_on_generic; + break; + } /* * Ensure that the inter-port SWSM.SMBI lock bit is clear before @@ -434,8 +414,7 @@ static s32 e1000_init_mac_params_82571(struct e1000_hw *hw) */ hw->dev_spec._82571.smb_counter = 0; -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -501,7 +480,6 @@ static s32 e1000_get_phy_id_82571(struct e1000_hw *hw) ret_val = -E1000_ERR_PHY; break; } - out: return ret_val; } @@ -512,7 +490,7 @@ out: * * Acquire the HW semaphore to access the PHY or NVM **/ -s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw) +static s32 e1000_get_hw_semaphore_82571(struct e1000_hw *hw) { u32 swsm; s32 ret_val = E1000_SUCCESS; @@ -577,7 +555,7 @@ out: * * Release hardware semaphore used to access the PHY or NVM **/ -void e1000_put_hw_semaphore_82571(struct e1000_hw *hw) +static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw) { u32 swsm; @@ -610,9 +588,9 @@ static s32 e1000_acquire_nvm_82571(struct e1000_hw *hw) goto out; switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: break; default: ret_val = e1000_acquire_nvm_generic(hw); @@ -831,7 +809,8 @@ static s32 e1000_get_cfg_done_82571(struct e1000_hw *hw) DEBUGFUNC("e1000_get_cfg_done_82571"); while (timeout) { - if (E1000_READ_REG(hw, E1000_EEMNGCTL) & E1000_NVM_CFG_DONE_PORT_0) + if (E1000_READ_REG(hw, E1000_EEMNGCTL) & + E1000_NVM_CFG_DONE_PORT_0) break; msec_delay(1); timeout--; @@ -966,9 +945,9 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw) * Ownership defaults to firmware after a reset. */ switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; @@ -1014,9 +993,9 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw) */ switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: msec_delay(25); break; default: @@ -1061,10 +1040,9 @@ static s32 e1000_init_hw_82571(struct e1000_hw *hw) /* Initialize identification LED */ ret_val = mac->ops.id_led_init(hw); - if (ret_val) { + if (ret_val) DEBUGOUT("Error initializing identification LED\n"); /* This is not fatal and we should not stop init due to this */ - } /* Disabling VLAN filtering */ DEBUGOUT("Initializing the IEEE VLAN\n"); @@ -1097,9 +1075,9 @@ static s32 e1000_init_hw_82571(struct e1000_hw *hw) /* ...for both queues. */ switch (mac->type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: e1000_enable_tx_pkt_filtering_generic(hw); reg_data = E1000_READ_REG(hw, E1000_GCR); reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; @@ -1108,8 +1086,8 @@ static s32 e1000_init_hw_82571(struct e1000_hw *hw) default: reg_data = E1000_READ_REG(hw, E1000_TXDCTL(1)); reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | - E1000_TXDCTL_FULL_TX_DESC_WB | - E1000_TXDCTL_COUNT_DESC; + E1000_TXDCTL_FULL_TX_DESC_WB | + E1000_TXDCTL_COUNT_DESC; E1000_WRITE_REG(hw, E1000_TXDCTL(1), reg_data); break; } @@ -1178,11 +1156,10 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) } /* Device Control */ - switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: reg = E1000_READ_REG(hw, E1000_CTRL); reg &= ~(1 << 29); E1000_WRITE_REG(hw, E1000_CTRL, reg); @@ -1193,9 +1170,9 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) /* Extended Device Control */ switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: reg = E1000_READ_REG(hw, E1000_CTRL_EXT); reg &= ~(1 << 23); reg |= (1 << 22); @@ -1205,7 +1182,6 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) break; } - if (hw->mac.type == e1000_82571) { reg = E1000_READ_REG(hw, E1000_PBA_ECC); reg |= E1000_PBA_ECC_CORR_EN; @@ -1216,7 +1192,6 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) * Workaround for hardware errata. * Ensure that DMA Dynamic Clock gating is disabled on 82571 and 82572 */ - if ((hw->mac.type == e1000_82571) || (hw->mac.type == e1000_82572)) { reg = E1000_READ_REG(hw, E1000_CTRL_EXT); @@ -1225,13 +1200,13 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) } /* PCI-Ex Control Registers */ - switch (hw->mac.type) { case e1000_82574: case e1000_82583: reg = E1000_READ_REG(hw, E1000_GCR); reg |= (1 << 22); E1000_WRITE_REG(hw, E1000_GCR, reg); + /* * Workaround for hardware errata. * apply workaround for hardware errata documented in errata @@ -1267,39 +1242,36 @@ static void e1000_clear_vfta_82571(struct e1000_hw *hw) DEBUGFUNC("e1000_clear_vfta_82571"); switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: if (hw->mng_cookie.vlan_id != 0) { /* - *The VFTA is a 4096b bit-field, each identifying - *a single VLAN ID. The following operations - *determine which 32b entry (i.e. offset) into the - *array we want to set the VLAN ID (i.e. bit) of - *the manageability unit. - */ + * The VFTA is a 4096b bit-field, each identifying + * a single VLAN ID. The following operations + * determine which 32b entry (i.e. offset) into the + * array we want to set the VLAN ID (i.e. bit) of + * the manageability unit. + */ vfta_offset = (hw->mng_cookie.vlan_id >> E1000_VFTA_ENTRY_SHIFT) & E1000_VFTA_ENTRY_MASK; vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id & E1000_VFTA_ENTRY_BIT_SHIFT_MASK); } - - for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { - /* - *If the offset we want to clear is the same offset of - *the manageability VLAN ID, then clear all bits except - *that of the manageability unit - */ - vfta_value = (offset == vfta_offset) ? - vfta_bit_in_reg : 0; - E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, - vfta_value); - E1000_WRITE_FLUSH(hw); - } break; default: break; } + for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { + /* + * If the offset we want to clear is the same offset of the + * manageability VLAN ID, then clear all bits except that of + * the manageability unit. + */ + vfta_value = (offset == vfta_offset) ? vfta_bit_in_reg : 0; + E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, vfta_value); + E1000_WRITE_FLUSH(hw); + } } /** @@ -1369,9 +1341,9 @@ static s32 e1000_setup_link_82571(struct e1000_hw *hw) * set it to full. */ switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: if (hw->fc.requested_mode == e1000_fc_default) hw->fc.requested_mode = e1000_fc_full; break; @@ -1460,7 +1432,7 @@ static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw) * Reports the link state as up or down. * * If autonegotiation is supported by the link partner, the link state is - * determined by the result of autongotiation. This is the most likely case. + * determined by the result of autonegotiation. This is the most likely case. * If autonegotiation is not supported by the link partner, and the link * has a valid signal, force the link up. * @@ -1472,7 +1444,7 @@ static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw) * 4) forced_up (the link has been forced up, it did not autonegotiate) * **/ -s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) +static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) { struct e1000_mac_info *mac = &hw->mac; u32 rxcw; @@ -1524,9 +1496,10 @@ s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) case e1000_serdes_link_autoneg_progress: if (rxcw & E1000_RXCW_C) { - /* We received /C/ ordered sets, meaning the + /* + * We received /C/ ordered sets, meaning the * link partner has autonegotiated, and we can - * trust the Link Up (LU) status bit + * trust the Link Up (LU) status bit. */ if (status & E1000_STATUS_LU) { mac->serdes_link_state = @@ -1534,13 +1507,14 @@ s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) DEBUGOUT("AN_PROG -> AN_UP\n"); mac->serdes_has_link = TRUE; } else { - /* Autoneg completed, but failed */ + /* Autoneg completed, but failed. */ mac->serdes_link_state = e1000_serdes_link_down; DEBUGOUT("AN_PROG -> DOWN\n"); } } else { - /* The link partner did not autoneg. + /* + * The link partner did not autoneg. * Force link up and full duplex, and change * state to forced. */ @@ -1565,9 +1539,11 @@ s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) case e1000_serdes_link_down: default: - /* The link was down but the receiver has now gained + /* + * The link was down but the receiver has now gained * valid sync, so lets see if we can bring the link - * up. */ + * up. + */ E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); E1000_WRITE_REG(hw, E1000_CTRL, (ctrl & ~E1000_CTRL_SLU)); @@ -1583,9 +1559,9 @@ s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) DEBUGOUT("ANYSTATE -> DOWN\n"); } else { /* - * We have sync, and can tolerate one - * invalid (IV) codeword before declaring - * link down, so reread to look again + * We have sync, and can tolerate one invalid (IV) + * codeword before declaring link down, so reread + * to look again. */ usec_delay(10); rxcw = E1000_READ_REG(hw, E1000_RXCW); @@ -1621,15 +1597,15 @@ static s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data) } switch (hw->mac.type) { + case e1000_82573: case e1000_82574: case e1000_82583: - case e1000_82573: - if(*data == ID_LED_RESERVED_F746) + if (*data == ID_LED_RESERVED_F746) *data = ID_LED_DEFAULT_82573; break; default: if (*data == ID_LED_RESERVED_0000 || - *data == ID_LED_RESERVED_FFFF) + *data == ID_LED_RESERVED_FFFF) *data = ID_LED_DEFAULT; break; } diff --git a/sys/dev/e1000/e1000_82575.c b/sys/dev/e1000/e1000_82575.c index 2f8e8ed31edb..4227556d5033 100644 --- a/sys/dev/e1000/e1000_82575.c +++ b/sys/dev/e1000/e1000_82575.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -59,16 +59,20 @@ static s32 e1000_phy_hw_reset_sgmii_82575(struct e1000_hw *hw); static s32 e1000_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, u16 *data); static s32 e1000_reset_hw_82575(struct e1000_hw *hw); +static s32 e1000_reset_hw_82580(struct e1000_hw *hw); +static s32 e1000_read_phy_reg_82580(struct e1000_hw *hw, + u32 offset, u16 *data); +static s32 e1000_write_phy_reg_82580(struct e1000_hw *hw, + u32 offset, u16 data); static s32 e1000_set_d0_lplu_state_82575(struct e1000_hw *hw, bool active); static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw); -static s32 e1000_setup_fiber_serdes_link_82575(struct e1000_hw *hw); +static s32 e1000_setup_serdes_link_82575(struct e1000_hw *hw); static s32 e1000_valid_led_default_82575(struct e1000_hw *hw, u16 *data); static s32 e1000_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, u16 data); static void e1000_clear_hw_cntrs_82575(struct e1000_hw *hw); static s32 e1000_acquire_swfw_sync_82575(struct e1000_hw *hw, u16 mask); -static s32 e1000_configure_pcs_link_82575(struct e1000_hw *hw); static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, u16 *speed, u16 *duplex); static s32 e1000_get_phy_id_82575(struct e1000_hw *hw); @@ -76,10 +80,18 @@ static void e1000_release_swfw_sync_82575(struct e1000_hw *hw, u16 mask); static bool e1000_sgmii_active_82575(struct e1000_hw *hw); static s32 e1000_reset_init_script_82575(struct e1000_hw *hw); static s32 e1000_read_mac_addr_82575(struct e1000_hw *hw); +static void e1000_config_collision_dist_82575(struct e1000_hw *hw); static void e1000_power_down_phy_copper_82575(struct e1000_hw *hw); -void e1000_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw); +static void e1000_shutdown_serdes_link_82575(struct e1000_hw *hw); +static void e1000_power_up_serdes_link_82575(struct e1000_hw *hw); static s32 e1000_set_pcie_completion_timeout(struct e1000_hw *hw); +static const u16 e1000_82580_rxpbs_table[] = + { 36, 72, 144, 1, 2, 4, 8, 16, + 35, 70, 140 }; +#define E1000_82580_RXPBS_TABLE_SIZE \ + (sizeof(e1000_82580_rxpbs_table)/sizeof(u16)) + /** * e1000_init_phy_params_82575 - Init PHY func ptrs. * @hw: pointer to the HW structure @@ -94,11 +106,11 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) if (hw->phy.media_type != e1000_media_type_copper) { phy->type = e1000_phy_none; goto out; - } else { - phy->ops.power_up = e1000_power_up_phy_copper; - phy->ops.power_down = e1000_power_down_phy_copper_82575; } + phy->ops.power_up = e1000_power_up_phy_copper; + phy->ops.power_down = e1000_power_down_phy_copper_82575; + phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; phy->reset_delay_us = 100; @@ -112,6 +124,10 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) phy->ops.reset = e1000_phy_hw_reset_sgmii_82575; phy->ops.read_reg = e1000_read_phy_reg_sgmii_82575; phy->ops.write_reg = e1000_write_phy_reg_sgmii_82575; + } else if (hw->mac.type >= e1000_82580) { + phy->ops.reset = e1000_phy_hw_reset_generic; + phy->ops.read_reg = e1000_read_phy_reg_82580; + phy->ops.write_reg = e1000_write_phy_reg_82580; } else { phy->ops.reset = e1000_phy_hw_reset_generic; phy->ops.read_reg = e1000_read_phy_reg_igp; @@ -140,6 +156,13 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82575; phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_generic; break; + case I82580_I_PHY_ID: + phy->type = e1000_phy_82580; + phy->ops.check_polarity = e1000_check_polarity_82577; + phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_82577; + phy->ops.get_cable_length = e1000_get_cable_length_82577; + phy->ops.get_info = e1000_get_phy_info_82577; + break; default: ret_val = -E1000_ERR_PHY; goto out; @@ -192,7 +215,7 @@ static s32 e1000_init_nvm_params_82575(struct e1000_hw *hw) /* EEPROM access above 16k is unsupported */ if (size > 14) size = 14; - nvm->word_size = 1 << size; + nvm->word_size = 1 << size; /* Function Pointers */ nvm->ops.acquire = e1000_acquire_nvm_82575; @@ -230,24 +253,40 @@ static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) dev_spec->sgmii_active = FALSE; ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); - if ((ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) == - E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES) { - hw->phy.media_type = e1000_media_type_internal_serdes; - ctrl_ext |= E1000_CTRL_I2C_ENA; - } else if (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_SGMII) { + switch (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) { + case E1000_CTRL_EXT_LINK_MODE_SGMII: dev_spec->sgmii_active = TRUE; ctrl_ext |= E1000_CTRL_I2C_ENA; - } else { + break; + case E1000_CTRL_EXT_LINK_MODE_1000BASE_KX: + case E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES: + hw->phy.media_type = e1000_media_type_internal_serdes; + ctrl_ext |= E1000_CTRL_I2C_ENA; + break; + default: ctrl_ext &= ~E1000_CTRL_I2C_ENA; + break; } + E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); + /* + * if using i2c make certain the MDICNFG register is cleared to prevent + * communications from being misrouted to the mdic registers + */ + if ((ctrl_ext & E1000_CTRL_I2C_ENA) && (hw->mac.type == e1000_82580)) + E1000_WRITE_REG(hw, E1000_MDICNFG, 0); + /* Set mta register count */ mac->mta_reg_count = 128; + /* Set uta register count */ + mac->uta_reg_count = (hw->mac.type == e1000_82575) ? 0 : 128; /* Set rar entry count */ mac->rar_entry_count = E1000_RAR_ENTRIES_82575; if (mac->type == e1000_82576) mac->rar_entry_count = E1000_RAR_ENTRIES_82576; + if (mac->type == e1000_82580) + mac->rar_entry_count = E1000_RAR_ENTRIES_82580; /* Set if part includes ASF firmware */ mac->asf_firmware_present = TRUE; /* Set if manageability features are enabled. */ @@ -260,6 +299,9 @@ static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) /* bus type/speed/width */ mac->ops.get_bus_info = e1000_get_bus_info_pcie_generic; /* reset */ + if (mac->type >= e1000_82580) + mac->ops.reset_hw = e1000_reset_hw_82580; + else mac->ops.reset_hw = e1000_reset_hw_82575; /* hw initialization */ mac->ops.init_hw = e1000_init_hw_82575; @@ -269,23 +311,25 @@ static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) mac->ops.setup_physical_interface = (hw->phy.media_type == e1000_media_type_copper) ? e1000_setup_copper_link_82575 - : e1000_setup_fiber_serdes_link_82575; + : e1000_setup_serdes_link_82575; /* physical interface shutdown */ - mac->ops.shutdown_serdes = e1000_shutdown_fiber_serdes_link_82575; + mac->ops.shutdown_serdes = e1000_shutdown_serdes_link_82575; + /* physical interface power up */ + mac->ops.power_up_serdes = e1000_power_up_serdes_link_82575; /* check for link */ mac->ops.check_for_link = e1000_check_for_link_82575; /* receive address register setting */ mac->ops.rar_set = e1000_rar_set_generic; /* read mac address */ mac->ops.read_mac_addr = e1000_read_mac_addr_82575; + /* configure collision distance */ + mac->ops.config_collision_dist = e1000_config_collision_dist_82575; /* multicast address update */ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; /* writing VFTA */ mac->ops.write_vfta = e1000_write_vfta_generic; /* clearing VFTA */ mac->ops.clear_vfta = e1000_clear_vfta_generic; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_generic; /* ID LED init */ mac->ops.id_led_init = e1000_id_led_init_generic; /* blink LED */ @@ -302,6 +346,9 @@ static s32 e1000_init_mac_params_82575(struct e1000_hw *hw) /* link info */ mac->ops.get_link_up_info = e1000_get_link_up_info_82575; + /* set lan id for port to determine which phy lock to use */ + hw->mac.ops.set_lan_id(hw); + return E1000_SUCCESS; } @@ -334,6 +381,10 @@ static s32 e1000_acquire_phy_82575(struct e1000_hw *hw) if (hw->bus.func == E1000_FUNC_1) mask = E1000_SWFW_PHY1_SM; + else if (hw->bus.func == E1000_FUNC_2) + mask = E1000_SWFW_PHY2_SM; + else if (hw->bus.func == E1000_FUNC_3) + mask = E1000_SWFW_PHY3_SM; return e1000_acquire_swfw_sync_82575(hw, mask); } @@ -352,6 +403,10 @@ static void e1000_release_phy_82575(struct e1000_hw *hw) if (hw->bus.func == E1000_FUNC_1) mask = E1000_SWFW_PHY1_SM; + else if (hw->bus.func == E1000_FUNC_2) + mask = E1000_SWFW_PHY2_SM; + else if (hw->bus.func == E1000_FUNC_3) + mask = E1000_SWFW_PHY3_SM; e1000_release_swfw_sync_82575(hw, mask); } @@ -368,47 +423,25 @@ static void e1000_release_phy_82575(struct e1000_hw *hw) static s32 e1000_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, u16 *data) { - struct e1000_phy_info *phy = &hw->phy; - u32 i, i2ccmd = 0; + s32 ret_val = -E1000_ERR_PARAM; DEBUGFUNC("e1000_read_phy_reg_sgmii_82575"); if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) { DEBUGOUT1("PHY Address %u is out of range\n", offset); - return -E1000_ERR_PARAM; + goto out; } - /* - * Set up Op-code, Phy Address, and register address in the I2CCMD - * register. The MAC will take care of interfacing with the - * PHY to retrieve the desired data. - */ - i2ccmd = ((offset << E1000_I2CCMD_REG_ADDR_SHIFT) | - (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | - (E1000_I2CCMD_OPCODE_READ)); + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; - E1000_WRITE_REG(hw, E1000_I2CCMD, i2ccmd); + ret_val = e1000_read_phy_reg_i2c(hw, offset, data); - /* Poll the ready bit to see if the I2C read completed */ - for (i = 0; i < E1000_I2CCMD_PHY_TIMEOUT; i++) { - usec_delay(50); - i2ccmd = E1000_READ_REG(hw, E1000_I2CCMD); - if (i2ccmd & E1000_I2CCMD_READY) - break; - } - if (!(i2ccmd & E1000_I2CCMD_READY)) { - DEBUGOUT("I2CCMD Read did not complete\n"); - return -E1000_ERR_PHY; - } - if (i2ccmd & E1000_I2CCMD_ERROR) { - DEBUGOUT("I2CCMD Error bit set\n"); - return -E1000_ERR_PHY; - } + hw->phy.ops.release(hw); - /* Need to byte-swap the 16-bit value. */ - *data = ((i2ccmd >> 8) & 0x00FF) | ((i2ccmd << 8) & 0xFF00); - - return E1000_SUCCESS; +out: + return ret_val; } /** @@ -423,49 +456,25 @@ static s32 e1000_read_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, static s32 e1000_write_phy_reg_sgmii_82575(struct e1000_hw *hw, u32 offset, u16 data) { - struct e1000_phy_info *phy = &hw->phy; - u32 i, i2ccmd = 0; - u16 phy_data_swapped; + s32 ret_val = -E1000_ERR_PARAM; DEBUGFUNC("e1000_write_phy_reg_sgmii_82575"); if (offset > E1000_MAX_SGMII_PHY_REG_ADDR) { DEBUGOUT1("PHY Address %d is out of range\n", offset); - return -E1000_ERR_PARAM; + goto out; } - /* Swap the data bytes for the I2C interface */ - phy_data_swapped = ((data >> 8) & 0x00FF) | ((data << 8) & 0xFF00); + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; - /* - * Set up Op-code, Phy Address, and register address in the I2CCMD - * register. The MAC will take care of interfacing with the - * PHY to retrieve the desired data. - */ - i2ccmd = ((offset << E1000_I2CCMD_REG_ADDR_SHIFT) | - (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | - E1000_I2CCMD_OPCODE_WRITE | - phy_data_swapped); + ret_val = e1000_write_phy_reg_i2c(hw, offset, data); - E1000_WRITE_REG(hw, E1000_I2CCMD, i2ccmd); + hw->phy.ops.release(hw); - /* Poll the ready bit to see if the I2C read completed */ - for (i = 0; i < E1000_I2CCMD_PHY_TIMEOUT; i++) { - usec_delay(50); - i2ccmd = E1000_READ_REG(hw, E1000_I2CCMD); - if (i2ccmd & E1000_I2CCMD_READY) - break; - } - if (!(i2ccmd & E1000_I2CCMD_READY)) { - DEBUGOUT("I2CCMD Write did not complete\n"); - return -E1000_ERR_PHY; - } - if (i2ccmd & E1000_I2CCMD_ERROR) { - DEBUGOUT("I2CCMD Error bit set\n"); - return -E1000_ERR_PHY; - } - - return E1000_SUCCESS; +out: + return ret_val; } /** @@ -480,6 +489,7 @@ static s32 e1000_get_phy_id_82575(struct e1000_hw *hw) struct e1000_phy_info *phy = &hw->phy; s32 ret_val = E1000_SUCCESS; u16 phy_id; + u32 ctrl_ext; DEBUGFUNC("e1000_get_phy_id_82575"); @@ -490,12 +500,19 @@ static s32 e1000_get_phy_id_82575(struct e1000_hw *hw) * work. The result of this function should mean phy->phy_addr * and phy->id are set correctly. */ - if (!(e1000_sgmii_active_82575(hw))) { + if (!e1000_sgmii_active_82575(hw)) { phy->addr = 1; ret_val = e1000_get_phy_id(hw); goto out; } + /* Power on sgmii phy if it is disabled */ + ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); + E1000_WRITE_REG(hw, E1000_CTRL_EXT, + ctrl_ext & ~E1000_CTRL_EXT_SDP3_DATA); + E1000_WRITE_FLUSH(hw); + msec_delay(300); + /* * The address field in the I2CCMD register is 3 bits and 0 is invalid. * Therefore, we need to test 1-7 @@ -522,10 +539,12 @@ static s32 e1000_get_phy_id_82575(struct e1000_hw *hw) if (phy->addr == 8) { phy->addr = 0; ret_val = -E1000_ERR_PHY; - goto out; + } else { + ret_val = e1000_get_phy_id(hw); } - ret_val = e1000_get_phy_id(hw); + /* restore previous sfp cage power state */ + E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); out: return ret_val; @@ -792,21 +811,23 @@ static s32 e1000_get_cfg_done_82575(struct e1000_hw *hw) if (hw->bus.func == E1000_FUNC_1) mask = E1000_NVM_CFG_DONE_PORT_1; + else if (hw->bus.func == E1000_FUNC_2) + mask = E1000_NVM_CFG_DONE_PORT_2; + else if (hw->bus.func == E1000_FUNC_3) + mask = E1000_NVM_CFG_DONE_PORT_3; while (timeout) { if (E1000_READ_REG(hw, E1000_EEMNGCTL) & mask) break; msec_delay(1); timeout--; } - if (!timeout) { + if (!timeout) DEBUGOUT("MNG configuration cycle has not completed.\n"); - } /* If EEPROM is not marked present, init the PHY manually */ if (((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) && - (hw->phy.type == e1000_phy_igp_3)) { + (hw->phy.type == e1000_phy_igp_3)) e1000_phy_init_script_igp3(hw); - } return ret_val; } @@ -828,14 +849,12 @@ static s32 e1000_get_link_up_info_82575(struct e1000_hw *hw, u16 *speed, DEBUGFUNC("e1000_get_link_up_info_82575"); - if (hw->phy.media_type != e1000_media_type_copper || - e1000_sgmii_active_82575(hw)) { + if (hw->phy.media_type != e1000_media_type_copper) ret_val = e1000_get_pcs_speed_and_duplex_82575(hw, speed, duplex); - } else { + else ret_val = e1000_get_speed_and_duplex_copper_generic(hw, speed, duplex); - } return ret_val; } @@ -854,9 +873,7 @@ static s32 e1000_check_for_link_82575(struct e1000_hw *hw) DEBUGFUNC("e1000_check_for_link_82575"); - /* SGMII link check is done through the PCS register. */ - if ((hw->phy.media_type != e1000_media_type_copper) || - (e1000_sgmii_active_82575(hw))) { + if (hw->phy.media_type != e1000_media_type_copper) { ret_val = e1000_get_pcs_speed_and_duplex_82575(hw, &speed, &duplex); /* @@ -872,6 +889,35 @@ static s32 e1000_check_for_link_82575(struct e1000_hw *hw) return ret_val; } +/** + * e1000_power_up_serdes_link_82575 - Power up the serdes link after shutdown + * @hw: pointer to the HW structure + **/ +static void e1000_power_up_serdes_link_82575(struct e1000_hw *hw) +{ + u32 reg; + + DEBUGFUNC("e1000_power_up_serdes_link_82575"); + + if ((hw->phy.media_type != e1000_media_type_internal_serdes) && + !e1000_sgmii_active_82575(hw)) + return; + + /* Enable PCS to turn on link */ + reg = E1000_READ_REG(hw, E1000_PCS_CFG0); + reg |= E1000_PCS_CFG_PCS_EN; + E1000_WRITE_REG(hw, E1000_PCS_CFG0, reg); + + /* Power up the laser */ + reg = E1000_READ_REG(hw, E1000_CTRL_EXT); + reg &= ~E1000_CTRL_EXT_SDP3_DATA; + E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg); + + /* flush the write to verify completion */ + E1000_WRITE_FLUSH(hw); + msec_delay(1); +} + /** * e1000_get_pcs_speed_and_duplex_82575 - Retrieve current speed/duplex * @hw: pointer to the HW structure @@ -930,31 +976,23 @@ static s32 e1000_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, } /** - * e1000_shutdown_fiber_serdes_link_82575 - Remove link during power down + * e1000_shutdown_serdes_link_82575 - Remove link during power down * @hw: pointer to the HW structure * - * In the case of fiber serdes shut down optics and PCS on driver unload + * In the case of serdes shut down sfp and PCS on driver unload * when management pass thru is not enabled. **/ -void e1000_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw) +void e1000_shutdown_serdes_link_82575(struct e1000_hw *hw) { u32 reg; - u16 eeprom_data = 0; - if (hw->phy.media_type != e1000_media_type_internal_serdes) + DEBUGFUNC("e1000_shutdown_serdes_link_82575"); + + if ((hw->phy.media_type != e1000_media_type_internal_serdes) && + !e1000_sgmii_active_82575(hw)) return; - if (hw->bus.func == E1000_FUNC_0) - hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); - else if (hw->bus.func == E1000_FUNC_1) - hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); - - /* - * If APM is not enabled in the EEPROM and management interface is - * not enabled, then power down. - */ - if (!(eeprom_data & E1000_NVM_APME_82575) && - !e1000_enable_mng_pass_thru(hw)) { + if (!e1000_enable_mng_pass_thru(hw)) { /* Disable PCS to turn off link */ reg = E1000_READ_REG(hw, E1000_PCS_CFG0); reg &= ~E1000_PCS_CFG_PCS_EN; @@ -962,10 +1000,10 @@ void e1000_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw) /* shutdown the laser */ reg = E1000_READ_REG(hw, E1000_CTRL_EXT); - reg |= E1000_CTRL_EXT_SDP7_DATA; + reg |= E1000_CTRL_EXT_SDP3_DATA; E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg); - /* flush the write to verfiy completion */ + /* flush the write to verify completion */ E1000_WRITE_FLUSH(hw); msec_delay(1); } @@ -973,45 +1011,6 @@ void e1000_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw) return; } -/** - * e1000_vmdq_set_loopback_pf - enable or disable vmdq loopback - * @hw: pointer to the HW structure - * @enable: state to enter, either enabled or disabled - * - * enables/disables L2 switch loopback functionality - **/ -void e1000_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable) -{ - u32 reg; - - reg = E1000_READ_REG(hw, E1000_DTXSWC); - if (enable) - reg |= E1000_DTXSWC_VMDQ_LOOPBACK_EN; - else - reg &= ~(E1000_DTXSWC_VMDQ_LOOPBACK_EN); - E1000_WRITE_REG(hw, E1000_DTXSWC, reg); -} - -/** - * e1000_vmdq_set_replication_pf - enable or disable vmdq replication - * @hw: pointer to the HW structure - * @enable: state to enter, either enabled or disabled - * - * enables/disables replication of packets across multiple pools - **/ -void e1000_vmdq_set_replication_pf(struct e1000_hw *hw, bool enable) -{ - u32 reg; - - reg = E1000_READ_REG(hw, E1000_VT_CTL); - if (enable) - reg |= E1000_VT_CTL_VM_REPL_EN; - else - reg &= ~(E1000_VT_CTL_VM_REPL_EN); - - E1000_WRITE_REG(hw, E1000_VT_CTL, reg); -} - /** * e1000_reset_hw_82575 - Reset hardware * @hw: pointer to the HW structure @@ -1111,6 +1110,11 @@ static s32 e1000_init_hw_82575(struct e1000_hw *hw) for (i = 0; i < mac->mta_reg_count; i++) E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0); + /* Zero out the Unicast HASH table */ + DEBUGOUT("Zeroing the UTA\n"); + for (i = 0; i < mac->uta_reg_count; i++) + E1000_WRITE_REG_ARRAY(hw, E1000_UTA, i, 0); + /* Setup link and flow control */ ret_val = mac->ops.setup_link(hw); @@ -1137,7 +1141,6 @@ static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) { u32 ctrl; s32 ret_val; - bool link; DEBUGFUNC("e1000_setup_copper_link_82575"); @@ -1146,6 +1149,20 @@ static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + ret_val = e1000_setup_serdes_link_82575(hw); + if (ret_val) + goto out; + + if (e1000_sgmii_active_82575(hw) && !hw->phy.reset_disable) { + /* allow time for SFP cage time to power up phy */ + msec_delay(300); + + ret_val = hw->phy.ops.reset(hw); + if (ret_val) { + DEBUGOUT("Error resetting the PHY.\n"); + goto out; + } + } switch (hw->phy.type) { case e1000_phy_m88: ret_val = e1000_copper_link_setup_m88(hw); @@ -1153,6 +1170,9 @@ static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) case e1000_phy_igp_3: ret_val = e1000_copper_link_setup_igp(hw); break; + case e1000_phy_82580: + ret_val = e1000_copper_link_setup_82577(hw); + break; default: ret_val = -E1000_ERR_PHY; break; @@ -1161,66 +1181,30 @@ static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) if (ret_val) goto out; - if (hw->mac.autoneg) { - /* - * Setup autoneg and flow control advertisement - * and perform autonegotiation. - */ - ret_val = e1000_copper_link_autoneg(hw); - if (ret_val) - goto out; - } else { - /* - * PHY will be set to 10H, 10F, 100H or 100F - * depending on user settings. - */ - DEBUGOUT("Forcing Speed and Duplex\n"); - ret_val = hw->phy.ops.force_speed_duplex(hw); - if (ret_val) { - DEBUGOUT("Error Forcing Speed and Duplex\n"); - goto out; - } - } - - ret_val = e1000_configure_pcs_link_82575(hw); - if (ret_val) - goto out; - - /* - * Check link status. Wait up to 100 microseconds for link to become - * valid. - */ - ret_val = e1000_phy_has_link_generic(hw, - COPPER_LINK_UP_LIMIT, - 10, - &link); - if (ret_val) - goto out; - - if (link) { - DEBUGOUT("Valid link established!!!\n"); - /* Config the MAC and PHY after link is up */ - e1000_config_collision_dist_generic(hw); - ret_val = e1000_config_fc_after_link_up_generic(hw); - } else { - DEBUGOUT("Unable to establish link!!!\n"); - } - + ret_val = e1000_setup_copper_link_generic(hw); out: return ret_val; } /** - * e1000_setup_fiber_serdes_link_82575 - Setup link for fiber/serdes + * e1000_setup_serdes_link_82575 - Setup link for serdes * @hw: pointer to the HW structure * - * Configures speed and duplex for fiber and serdes links. + * Configure the physical coding sub-layer (PCS) link. The PCS link is + * used on copper connections where the serialized gigabit media independent + * interface (sgmii), or serdes fiber is being used. Configures the link + * for auto-negotiation or forces speed/duplex. **/ -static s32 e1000_setup_fiber_serdes_link_82575(struct e1000_hw *hw) +static s32 e1000_setup_serdes_link_82575(struct e1000_hw *hw) { - u32 reg; + u32 ctrl_ext, ctrl_reg, reg; + bool pcs_autoneg; - DEBUGFUNC("e1000_setup_fiber_serdes_link_82575"); + DEBUGFUNC("e1000_setup_serdes_link_82575"); + + if ((hw->phy.media_type != e1000_media_type_internal_serdes) && + !e1000_sgmii_active_82575(hw)) + return E1000_SUCCESS; /* * On the 82575, SerDes loopback mode persists until it is @@ -1230,25 +1214,48 @@ static s32 e1000_setup_fiber_serdes_link_82575(struct e1000_hw *hw) */ E1000_WRITE_REG(hw, E1000_SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK); - /* Force link up, set 1gb */ - reg = E1000_READ_REG(hw, E1000_CTRL); - reg |= E1000_CTRL_SLU | E1000_CTRL_SPD_1000 | E1000_CTRL_FRCSPD; - if (hw->mac.type == e1000_82575 || hw->mac.type == e1000_82576) { - /* set both sw defined pins */ - reg |= E1000_CTRL_SWDPIN0 | E1000_CTRL_SWDPIN1; - } - E1000_WRITE_REG(hw, E1000_CTRL, reg); - /* Power on phy for 82576 fiber adapters */ - if (hw->mac.type == e1000_82576) { - reg = E1000_READ_REG(hw, E1000_CTRL_EXT); - reg &= ~E1000_CTRL_EXT_SDP7_DATA; - E1000_WRITE_REG(hw, E1000_CTRL_EXT, reg); + /* power on the sfp cage if present */ + ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); + ctrl_ext &= ~E1000_CTRL_EXT_SDP3_DATA; + E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); + + ctrl_reg = E1000_READ_REG(hw, E1000_CTRL); + ctrl_reg |= E1000_CTRL_SLU; + + /* set both sw defined pins on 82575/82576*/ + if (hw->mac.type == e1000_82575 || hw->mac.type == e1000_82576) + ctrl_reg |= E1000_CTRL_SWDPIN0 | E1000_CTRL_SWDPIN1; + + reg = E1000_READ_REG(hw, E1000_PCS_LCTL); + + /* default pcs_autoneg to the same setting as mac autoneg */ + pcs_autoneg = hw->mac.autoneg; + + switch (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) { + case E1000_CTRL_EXT_LINK_MODE_SGMII: + /* sgmii mode lets the phy handle forcing speed/duplex */ + pcs_autoneg = TRUE; + /* autoneg time out should be disabled for SGMII mode */ + reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT); + break; + case E1000_CTRL_EXT_LINK_MODE_1000BASE_KX: + /* disable PCS autoneg and support parallel detect only */ + pcs_autoneg = FALSE; + default: + /* + * non-SGMII modes only supports a speed of 1000/Full for the + * link so it is best to just force the MAC and let the pcs + * link either autoneg or be forced to 1000/Full + */ + ctrl_reg |= E1000_CTRL_SPD_1000 | E1000_CTRL_FRCSPD | + E1000_CTRL_FD | E1000_CTRL_FRCDPX; + + /* set speed of 1000/Full if speed/duplex is forced */ + reg |= E1000_PCS_LCTL_FSV_1000 | E1000_PCS_LCTL_FDV_FULL; + break; } - /* Set switch control to serdes energy detect */ - reg = E1000_READ_REG(hw, E1000_CONNSW); - reg |= E1000_CONNSW_ENRGSRC; - E1000_WRITE_REG(hw, E1000_CONNSW, reg); + E1000_WRITE_REG(hw, E1000_CTRL, ctrl_reg); /* * New SerDes mode allows for forcing speed or autonegotiating speed @@ -1256,35 +1263,31 @@ static s32 e1000_setup_fiber_serdes_link_82575(struct e1000_hw *hw) * mode that will be compatible with older link partners and switches. * However, both are supported by the hardware and some drivers/tools. */ - reg = E1000_READ_REG(hw, E1000_PCS_LCTL); - reg &= ~(E1000_PCS_LCTL_AN_ENABLE | E1000_PCS_LCTL_FLV_LINK_UP | - E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK); + E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK); - if (hw->mac.autoneg) { + /* + * We force flow control to prevent the CTRL register values from being + * overwritten by the autonegotiated flow control values + */ + reg |= E1000_PCS_LCTL_FORCE_FCTRL; + + if (pcs_autoneg) { /* Set PCS register for autoneg */ - reg |= E1000_PCS_LCTL_FSV_1000 | /* Force 1000 */ - E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */ - E1000_PCS_LCTL_AN_ENABLE | /* Enable Autoneg */ - E1000_PCS_LCTL_AN_RESTART; /* Restart autoneg */ - DEBUGOUT1("Configuring Autoneg; PCS_LCTL = 0x%08X\n", reg); + reg |= E1000_PCS_LCTL_AN_ENABLE | /* Enable Autoneg */ + E1000_PCS_LCTL_AN_RESTART; /* Restart autoneg */ + DEBUGOUT1("Configuring Autoneg:PCS_LCTL=0x%08X\n", reg); } else { - /* Set PCS register for forced speed */ - reg |= E1000_PCS_LCTL_FLV_LINK_UP | /* Force link up */ - E1000_PCS_LCTL_FSV_1000 | /* Force 1000 */ - E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */ - E1000_PCS_LCTL_FSD | /* Force Speed */ - E1000_PCS_LCTL_FORCE_LINK; /* Force Link */ - DEBUGOUT1("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg); - } - - if (hw->mac.type == e1000_82576) { - reg |= E1000_PCS_LCTL_FORCE_FCTRL; - e1000_force_mac_fc_generic(hw); + /* Set PCS register for forced link */ + reg |= E1000_PCS_LCTL_FSD; /* Force Speed */ + DEBUGOUT1("Configuring Forced Link:PCS_LCTL=0x%08X\n", reg); } E1000_WRITE_REG(hw, E1000_PCS_LCTL, reg); + if (!e1000_sgmii_active_82575(hw)) + e1000_force_mac_fc_generic(hw); + return E1000_SUCCESS; } @@ -1323,72 +1326,6 @@ out: return ret_val; } -/** - * e1000_configure_pcs_link_82575 - Configure PCS link - * @hw: pointer to the HW structure - * - * Configure the physical coding sub-layer (PCS) link. The PCS link is - * only used on copper connections where the serialized gigabit media - * independent interface (sgmii) is being used. Configures the link - * for auto-negotiation or forces speed/duplex. - **/ -static s32 e1000_configure_pcs_link_82575(struct e1000_hw *hw) -{ - struct e1000_mac_info *mac = &hw->mac; - u32 reg = 0; - - DEBUGFUNC("e1000_configure_pcs_link_82575"); - - if (hw->phy.media_type != e1000_media_type_copper || - !(e1000_sgmii_active_82575(hw))) - goto out; - - /* For SGMII, we need to issue a PCS autoneg restart */ - reg = E1000_READ_REG(hw, E1000_PCS_LCTL); - - /* AN time out should be disabled for SGMII mode */ - reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT); - - if (mac->autoneg) { - /* Make sure forced speed and force link are not set */ - reg &= ~(E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK); - - /* - * The PHY should be setup prior to calling this function. - * All we need to do is restart autoneg and enable autoneg. - */ - reg |= E1000_PCS_LCTL_AN_RESTART | E1000_PCS_LCTL_AN_ENABLE; - } else { - /* Set PCS register for forced speed */ - - /* Turn off bits for full duplex, speed, and autoneg */ - reg &= ~(E1000_PCS_LCTL_FSV_1000 | - E1000_PCS_LCTL_FSV_100 | - E1000_PCS_LCTL_FDV_FULL | - E1000_PCS_LCTL_AN_ENABLE); - - /* Check for duplex first */ - if (mac->forced_speed_duplex & E1000_ALL_FULL_DUPLEX) - reg |= E1000_PCS_LCTL_FDV_FULL; - - /* Now set speed */ - if (mac->forced_speed_duplex & E1000_ALL_100_SPEED) - reg |= E1000_PCS_LCTL_FSV_100; - - /* Force speed and force link */ - reg |= E1000_PCS_LCTL_FSD | - E1000_PCS_LCTL_FORCE_LINK | - E1000_PCS_LCTL_FLV_LINK_UP; - - DEBUGOUT1("Wrote 0x%08X to PCS_LCTL to configure forced link\n", - reg); - } - E1000_WRITE_REG(hw, E1000_PCS_LCTL, reg); - -out: - return E1000_SUCCESS; -} - /** * e1000_sgmii_active_82575 - Return sgmii state * @hw: pointer to the HW structure @@ -1466,6 +1403,28 @@ out: return ret_val; } +/** + * e1000_config_collision_dist_82575 - Configure collision distance + * @hw: pointer to the HW structure + * + * Configures the collision distance to the default value and is used + * during link setup. + **/ +static void e1000_config_collision_dist_82575(struct e1000_hw *hw) +{ + u32 tctl_ext; + + DEBUGFUNC("e1000_config_collision_dist_82575"); + + tctl_ext = E1000_READ_REG(hw, E1000_TCTL_EXT); + + tctl_ext &= ~E1000_TCTL_EXT_COLD; + tctl_ext |= E1000_COLLISION_DISTANCE << E1000_TCTL_EXT_COLD_SHIFT; + + E1000_WRITE_REG(hw, E1000_TCTL_EXT, tctl_ext); + E1000_WRITE_FLUSH(hw); +} + /** * e1000_power_down_phy_copper_82575 - Remove link during PHY power down * @hw: pointer to the HW structure @@ -1548,7 +1507,8 @@ static void e1000_clear_hw_cntrs_82575(struct e1000_hw *hw) E1000_READ_REG(hw, E1000_LENERRS); /* This register should not be read in copper configurations */ - if (hw->phy.media_type == e1000_media_type_internal_serdes) + if ((hw->phy.media_type == e1000_media_type_internal_serdes) || + e1000_sgmii_active_82575(hw)) E1000_READ_REG(hw, E1000_SCVPC); } @@ -1677,3 +1637,199 @@ out: return ret_val; } +/** + * e1000_vmdq_set_loopback_pf - enable or disable vmdq loopback + * @hw: pointer to the hardware struct + * @enable: state to enter, either enabled or disabled + * + * enables/disables L2 switch loopback functionality. + **/ +void e1000_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable) +{ + u32 dtxswc = E1000_READ_REG(hw, E1000_DTXSWC); + + if (enable) + dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN; + else + dtxswc &= ~E1000_DTXSWC_VMDQ_LOOPBACK_EN; + + E1000_WRITE_REG(hw, E1000_DTXSWC, dtxswc); +} + +/** + * e1000_vmdq_set_replication_pf - enable or disable vmdq replication + * @hw: pointer to the hardware struct + * @enable: state to enter, either enabled or disabled + * + * enables/disables replication of packets across multiple pools. + **/ +void e1000_vmdq_set_replication_pf(struct e1000_hw *hw, bool enable) +{ + u32 vt_ctl = E1000_READ_REG(hw, E1000_VT_CTL); + + if (enable) + vt_ctl |= E1000_VT_CTL_VM_REPL_EN; + else + vt_ctl &= ~E1000_VT_CTL_VM_REPL_EN; + + E1000_WRITE_REG(hw, E1000_VT_CTL, vt_ctl); +} + +/** + * e1000_read_phy_reg_82580 - Read 82580 MDI control register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * + * Reads the MDI control register in the PHY at offset and stores the + * information read to data. + **/ +static s32 e1000_read_phy_reg_82580(struct e1000_hw *hw, u32 offset, u16 *data) +{ + s32 ret_val; + + DEBUGFUNC("e1000_read_phy_reg_82580"); + + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + + ret_val = e1000_read_phy_reg_mdic(hw, offset, data); + + hw->phy.ops.release(hw); + +out: + return ret_val; +} + +/** + * e1000_write_phy_reg_82580 - Write 82580 MDI control register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write to register at offset + * + * Writes data to MDI control register in the PHY at offset. + **/ +static s32 e1000_write_phy_reg_82580(struct e1000_hw *hw, u32 offset, u16 data) +{ + s32 ret_val; + + DEBUGFUNC("e1000_write_phy_reg_82580"); + + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + + ret_val = e1000_write_phy_reg_mdic(hw, offset, data); + + hw->phy.ops.release(hw); + +out: + return ret_val; +} + +/** + * e1000_reset_hw_82580 - Reset hardware + * @hw: pointer to the HW structure + * + * This resets function or entire device (all ports, etc.) + * to a known state. + **/ +static s32 e1000_reset_hw_82580(struct e1000_hw *hw) +{ + s32 ret_val = E1000_SUCCESS; + /* BH SW mailbox bit in SW_FW_SYNC */ + u16 swmbsw_mask = E1000_SW_SYNCH_MB; + u32 ctrl, icr; + bool global_device_reset = hw->dev_spec._82575.global_device_reset; + + DEBUGFUNC("e1000_reset_hw_82580"); + + hw->dev_spec._82575.global_device_reset = FALSE; + + /* Get current control state. */ + ctrl = E1000_READ_REG(hw, E1000_CTRL); + + /* + * Prevent the PCI-E bus from sticking if there is no TLP connection + * on the last TLP read/write transaction when MAC is reset. + */ + ret_val = e1000_disable_pcie_master_generic(hw); + if (ret_val) + DEBUGOUT("PCI-E Master disable polling has failed.\n"); + + DEBUGOUT("Masking off all interrupts\n"); + E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); + E1000_WRITE_REG(hw, E1000_RCTL, 0); + E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP); + E1000_WRITE_FLUSH(hw); + + msec_delay(10); + + /* Determine whether or not a global dev reset is requested */ + if (global_device_reset && + e1000_acquire_swfw_sync_82575(hw, swmbsw_mask)) + global_device_reset = FALSE; + + if (global_device_reset && + !(E1000_READ_REG(hw, E1000_STATUS) & E1000_STAT_DEV_RST_SET)) + ctrl |= E1000_CTRL_DEV_RST; + else + ctrl |= E1000_CTRL_RST; + + E1000_WRITE_REG(hw, E1000_CTRL, ctrl); + + /* Add delay to insure DEV_RST has time to complete */ + if (global_device_reset) + msec_delay(5); + + ret_val = e1000_get_auto_rd_done_generic(hw); + if (ret_val) { + /* + * When auto config read does not complete, do not + * return with an error. This can happen in situations + * where there is no eeprom and prevents getting link. + */ + DEBUGOUT("Auto Read Done did not complete\n"); + } + + /* If EEPROM is not present, run manual init scripts */ + if ((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) + e1000_reset_init_script_82575(hw); + + /* clear global device reset status bit */ + E1000_WRITE_REG(hw, E1000_STATUS, E1000_STAT_DEV_RST_SET); + + /* Clear any pending interrupt events. */ + E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); + icr = E1000_READ_REG(hw, E1000_ICR); + + /* Install any alternate MAC address into RAR0 */ + ret_val = e1000_check_alt_mac_addr_generic(hw); + + /* Release semaphore */ + if (global_device_reset) + e1000_release_swfw_sync_82575(hw, swmbsw_mask); + + return ret_val; +} + +/** + * e1000_rxpbs_adjust_82580 - adjust RXPBS value to reflect actual RX PBA size + * @data: data received by reading RXPBS register + * + * The 82580 uses a table based approach for packet buffer allocation sizes. + * This function converts the retrieved value into the correct table value + * 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 + * 0x0 36 72 144 1 2 4 8 16 + * 0x8 35 70 140 rsv rsv rsv rsv rsv + */ +u16 e1000_rxpbs_adjust_82580(u32 data) +{ + u16 ret_val = 0; + + if (data < E1000_82580_RXPBS_TABLE_SIZE) + ret_val = e1000_82580_rxpbs_table[data]; + + return ret_val; +} diff --git a/sys/dev/e1000/e1000_82575.h b/sys/dev/e1000/e1000_82575.h index 34e0d29398f7..582f4a4058db 100644 --- a/sys/dev/e1000/e1000_82575.h +++ b/sys/dev/e1000/e1000_82575.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -51,10 +51,14 @@ */ #define E1000_RAR_ENTRIES_82575 16 #define E1000_RAR_ENTRIES_82576 24 +#define E1000_RAR_ENTRIES_82580 24 +#define E1000_SW_SYNCH_MB 0x00000100 +#define E1000_STAT_DEV_RST_SET 0x00100000 +#define E1000_CTRL_DEV_RST 0x20000000 #ifdef E1000_BIT_FIELDS struct e1000_adv_data_desc { - u64 buffer_addr; /* Address of the descriptor's data buffer */ + __le64 buffer_addr; /* Address of the descriptor's data buffer */ union { u32 data; struct { @@ -128,6 +132,7 @@ struct e1000_adv_context_desc { #define E1000_SRRCTL_DESCTYPE_HDR_REPLICATION 0x06000000 #define E1000_SRRCTL_DESCTYPE_HDR_REPLICATION_LARGE_PKT 0x08000000 #define E1000_SRRCTL_DESCTYPE_MASK 0x0E000000 +#define E1000_SRRCTL_TIMESTAMP 0x40000000 #define E1000_SRRCTL_DROP_EN 0x80000000 #define E1000_SRRCTL_BSIZEPKT_MASK 0x0000007F @@ -142,6 +147,7 @@ struct e1000_adv_context_desc { #define E1000_MRQC_RSS_FIELD_IPV4_UDP 0x00400000 #define E1000_MRQC_RSS_FIELD_IPV6_UDP 0x00800000 #define E1000_MRQC_RSS_FIELD_IPV6_UDP_EX 0x01000000 +#define E1000_MRQC_ENABLE_RSS_8Q 0x00000002 #define E1000_VMRCTL_MIRROR_PORT_SHIFT 8 #define E1000_VMRCTL_MIRROR_DSTPORT_MASK (7 << E1000_VMRCTL_MIRROR_PORT_SHIFT) @@ -185,31 +191,31 @@ struct e1000_adv_context_desc { /* Receive Descriptor - Advanced */ union e1000_adv_rx_desc { struct { - u64 pkt_addr; /* Packet buffer address */ - u64 hdr_addr; /* Header buffer address */ + __le64 pkt_addr; /* Packet buffer address */ + __le64 hdr_addr; /* Header buffer address */ } read; struct { struct { union { - u32 data; + __le32 data; struct { - u16 pkt_info; /* RSS type, Packet type */ - u16 hdr_info; /* Split Header, - * header buffer length */ + __le16 pkt_info; /*RSS type, Pkt type*/ + __le16 hdr_info; /* Split Header, + * header buffer len*/ } hs_rss; } lo_dword; union { - u32 rss; /* RSS Hash */ + __le32 rss; /* RSS Hash */ struct { - u16 ip_id; /* IP id */ - u16 csum; /* Packet Checksum */ + __le16 ip_id; /* IP id */ + __le16 csum; /* Packet Checksum */ } csum_ip; } hi_dword; } lower; struct { - u32 status_error; /* ext status/error */ - u16 length; /* Packet length */ - u16 vlan; /* VLAN tag */ + __le32 status_error; /* ext status/error */ + __le16 length; /* Packet length */ + __le16 vlan; /* VLAN tag */ } upper; } wb; /* writeback */ }; @@ -220,6 +226,8 @@ union e1000_adv_rx_desc { #define E1000_RXDADV_HDRBUFLEN_SHIFT 5 #define E1000_RXDADV_SPLITHEADER_EN 0x00001000 #define E1000_RXDADV_SPH 0x8000 +#define E1000_RXDADV_STAT_TS 0x10000 /* Pkt was time stamped */ +#define E1000_RXDADV_STAT_TSIP 0x08000 /* timestamp in packet */ #define E1000_RXDADV_ERR_HBO 0x00800000 /* RSS Hash results */ @@ -269,14 +277,14 @@ union e1000_adv_rx_desc { /* Transmit Descriptor - Advanced */ union e1000_adv_tx_desc { struct { - u64 buffer_addr; /* Address of descriptor's data buf */ - u32 cmd_type_len; - u32 olinfo_status; + __le64 buffer_addr; /* Address of descriptor's data buf */ + __le32 cmd_type_len; + __le32 olinfo_status; } read; struct { - u64 rsvd; /* Reserved */ - u32 nxtseq_seed; - u32 status; + __le64 rsvd; /* Reserved */ + __le32 nxtseq_seed; + __le32 status; } wb; }; @@ -303,10 +311,10 @@ union e1000_adv_tx_desc { /* Context descriptors */ struct e1000_adv_tx_context_desc { - u32 vlan_macip_lens; - u32 seqnum_seed; - u32 type_tucmd_mlhl; - u32 mss_l4len_idx; + __le32 vlan_macip_lens; + __le32 seqnum_seed; + __le32 type_tucmd_mlhl; + __le32 mss_l4len_idx; }; #define E1000_ADVTXD_MACLEN_SHIFT 9 /* Adv ctxt desc mac len shift */ @@ -378,6 +386,14 @@ struct e1000_adv_tx_context_desc { */ #define E1000_ETQF_FILTER_EAPOL 0 +#define E1000_FTQF_VF_BP 0x00008000 +#define E1000_FTQF_1588_TIME_STAMP 0x08000000 +#define E1000_FTQF_MASK 0xF0000000 +#define E1000_FTQF_MASK_PROTO_BP 0x10000000 +#define E1000_FTQF_MASK_SOURCE_ADDR_BP 0x20000000 +#define E1000_FTQF_MASK_DEST_ADDR_BP 0x40000000 +#define E1000_FTQF_MASK_SOURCE_PORT_BP 0x80000000 + #define E1000_NVM_APME_82575 0x0400 #define MAX_NUM_VFS 8 @@ -416,6 +432,9 @@ struct e1000_adv_tx_context_desc { #define E1000_VLVF_LVLAN 0x00100000 #define E1000_VLVF_VLANID_ENABLE 0x80000000 +#define E1000_VMVIR_VLANA_DEFAULT 0x40000000 /* Always use default VLAN */ +#define E1000_VMVIR_VLANA_NEVER 0x80000000 /* Never insert VLAN tag */ + #define E1000_VF_INIT_TIMEOUT 200 /* Number of retries to clear RSTI */ #define E1000_IOVCTL 0x05BBC @@ -424,8 +443,20 @@ struct e1000_adv_tx_context_desc { #define E1000_RPLOLR_STRVLAN 0x40000000 #define E1000_RPLOLR_STRCRC 0x80000000 +#define E1000_TCTL_EXT_COLD 0x000FFC00 +#define E1000_TCTL_EXT_COLD_SHIFT 10 + +#define E1000_DTXCTL_8023LL 0x0004 +#define E1000_DTXCTL_VLAN_ADDED 0x0008 +#define E1000_DTXCTL_OOS_ENABLE 0x0010 +#define E1000_DTXCTL_MDP_EN 0x0020 +#define E1000_DTXCTL_SPOOF_INT 0x0040 + #define ALL_QUEUES 0xFFFF +/* RX packet buffer size defines */ +#define E1000_RXPBS_SIZE_MASK_82576 0x0000007F void e1000_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable); void e1000_vmdq_set_replication_pf(struct e1000_hw *hw, bool enable); +u16 e1000_rxpbs_adjust_82580(u32 data); #endif /* _E1000_82575_H_ */ diff --git a/sys/dev/e1000/e1000_api.c b/sys/dev/e1000/e1000_api.c index 8188658d6bb1..bf9fa2abb903 100644 --- a/sys/dev/e1000/e1000_api.c +++ b/sys/dev/e1000/e1000_api.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -232,6 +232,7 @@ s32 e1000_set_mac_type(struct e1000_hw *hw) case E1000_DEV_ID_ICH8_IGP_M_AMT: case E1000_DEV_ID_ICH8_IGP_AMT: case E1000_DEV_ID_ICH8_IGP_C: + case E1000_DEV_ID_ICH8_82567V_3: mac->type = e1000_ich8lan; break; case E1000_DEV_ID_ICH9_IFE: @@ -269,9 +270,17 @@ s32 e1000_set_mac_type(struct e1000_hw *hw) case E1000_DEV_ID_82576_SERDES: case E1000_DEV_ID_82576_QUAD_COPPER: case E1000_DEV_ID_82576_NS: + case E1000_DEV_ID_82576_NS_SERDES: case E1000_DEV_ID_82576_SERDES_QUAD: mac->type = e1000_82576; break; + case E1000_DEV_ID_82580_COPPER: + case E1000_DEV_ID_82580_FIBER: + case E1000_DEV_ID_82580_SERDES: + case E1000_DEV_ID_82580_SGMII: + case E1000_DEV_ID_82580_COPPER_DUAL: + mac->type = e1000_82580; + break; default: /* Should never have loaded on this device */ ret_val = -E1000_ERR_MAC_INIT; @@ -362,6 +371,7 @@ s32 e1000_setup_init_funcs(struct e1000_hw *hw, bool init_device) break; case e1000_82575: case e1000_82576: + case e1000_82580: e1000_init_function_pointers_82575(hw); break; default: @@ -744,20 +754,6 @@ s32 e1000_validate_mdi_setting(struct e1000_hw *hw) return E1000_SUCCESS; } -/** - * e1000_mta_set - Sets multicast table bit - * @hw: pointer to the HW structure - * @hash_value: Multicast hash value. - * - * This sets the bit in the multicast table corresponding to the - * hash value. This is a function pointer entry point called by drivers. - **/ -void e1000_mta_set(struct e1000_hw *hw, u32 hash_value) -{ - if (hw->mac.ops.mta_set) - hw->mac.ops.mta_set(hw, hash_value); -} - /** * e1000_hash_mc_addr - Determines address location in multicast table * @hw: pointer to the HW structure @@ -1236,6 +1232,18 @@ void e1000_power_down_phy(struct e1000_hw *hw) hw->phy.ops.power_down(hw); } +/** + * e1000_power_up_fiber_serdes_link - Power up serdes link + * @hw: pointer to the HW structure + * + * Power on the optics and PCS. + **/ +void e1000_power_up_fiber_serdes_link(struct e1000_hw *hw) +{ + if (hw->mac.ops.power_up_serdes) + hw->mac.ops.power_up_serdes(hw); +} + /** * e1000_shutdown_fiber_serdes_link - Remove link during power down * @hw: pointer to the HW structure diff --git a/sys/dev/e1000/e1000_api.h b/sys/dev/e1000/e1000_api.h index b492e577b1a0..b7bc14c8f314 100644 --- a/sys/dev/e1000/e1000_api.h +++ b/sys/dev/e1000/e1000_api.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -47,6 +47,7 @@ extern void e1000_init_function_pointers_ich8lan(struct e1000_hw *hw); extern void e1000_init_function_pointers_82575(struct e1000_hw *hw); extern void e1000_rx_fifo_flush_82575(struct e1000_hw *hw); extern void e1000_init_function_pointers_vf(struct e1000_hw *hw); +extern void e1000_power_up_fiber_serdes_link(struct e1000_hw *hw); extern void e1000_shutdown_fiber_serdes_link(struct e1000_hw *hw); s32 e1000_set_mac_type(struct e1000_hw *hw); @@ -67,7 +68,6 @@ s32 e1000_get_speed_and_duplex(struct e1000_hw *hw, u16 *speed, s32 e1000_disable_pcie_master(struct e1000_hw *hw); void e1000_config_collision_dist(struct e1000_hw *hw); void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index); -void e1000_mta_set(struct e1000_hw *hw, u32 hash_value); u32 e1000_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr); void e1000_update_mc_addr_list(struct e1000_hw *hw, u8 *mc_addr_list, u32 mc_addr_count); diff --git a/sys/dev/e1000/e1000_defines.h b/sys/dev/e1000/e1000_defines.h index d845fb23dc65..4c80ca037026 100644 --- a/sys/dev/e1000/e1000_defines.h +++ b/sys/dev/e1000/e1000_defines.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -146,12 +146,12 @@ #define E1000_CTRL_EXT_SDP5_DATA 0x00000020 /* Value of SW Definable Pin 5 */ #define E1000_CTRL_EXT_PHY_INT E1000_CTRL_EXT_SDP5_DATA #define E1000_CTRL_EXT_SDP6_DATA 0x00000040 /* Value of SW Definable Pin 6 */ -#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ +#define E1000_CTRL_EXT_SDP3_DATA 0x00000080 /* Value of SW Definable Pin 3 */ /* SDP 4/5 (bits 8,9) are reserved in >= 82575 */ #define E1000_CTRL_EXT_SDP4_DIR 0x00000100 /* Direction of SDP4 0=in 1=out */ #define E1000_CTRL_EXT_SDP5_DIR 0x00000200 /* Direction of SDP5 0=in 1=out */ #define E1000_CTRL_EXT_SDP6_DIR 0x00000400 /* Direction of SDP6 0=in 1=out */ -#define E1000_CTRL_EXT_SDP7_DIR 0x00000800 /* Direction of SDP7 0=in 1=out */ +#define E1000_CTRL_EXT_SDP3_DIR 0x00000800 /* Direction of SDP3 0=in 1=out */ #define E1000_CTRL_EXT_ASDCHK 0x00001000 /* Initiate an ASD sequence */ #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ #define E1000_CTRL_EXT_IPS 0x00004000 /* Invert Power State */ @@ -161,6 +161,8 @@ #define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ #define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 +#define E1000_CTRL_EXT_LINK_MODE_82580_MASK 0x01C00000 /*82580 bit 24:22*/ +#define E1000_CTRL_EXT_LINK_MODE_1000BASE_KX 0x00400000 #define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 #define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000 #define E1000_CTRL_EXT_LINK_MODE_KMRN 0x00000000 @@ -386,6 +388,8 @@ #define E1000_SWFW_PHY0_SM 0x02 #define E1000_SWFW_PHY1_SM 0x04 #define E1000_SWFW_CSR_SM 0x08 +#define E1000_SWFW_PHY2_SM 0x20 +#define E1000_SWFW_PHY3_SM 0x40 /* FACTPS Definitions */ #define E1000_FACTPS_LFS 0x40000000 /* LAN Function Select */ @@ -697,6 +701,7 @@ /* Extended Configuration Control and Size */ #define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 #define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 +#define E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE 0x00000008 #define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000 #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16 @@ -769,6 +774,7 @@ #define E1000_ICR_ACK 0x00020000 /* Receive Ack frame */ #define E1000_ICR_MNG 0x00040000 /* Manageability event */ #define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */ +#define E1000_ICR_DRSTA 0x40000000 /* Device Reset Asserted */ #define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver * should claim the interrupt */ #define E1000_ICR_RXD_FIFO_PAR0 0x00100000 /* Q0 Rx desc FIFO parity error */ @@ -789,6 +795,7 @@ #define E1000_ICR_TXQ0 0x00400000 /* Tx Queue 0 Interrupt */ #define E1000_ICR_TXQ1 0x00800000 /* Tx Queue 1 Interrupt */ #define E1000_ICR_OTHER 0x01000000 /* Other Interrupts */ +#define E1000_ICR_FER 0x00400000 /* Fatal Error */ /* PBA ECC Register */ #define E1000_PBA_ECC_COUNTER_MASK 0xFFF00000 /* ECC counter mask */ @@ -860,6 +867,7 @@ #define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */ +#define E1000_IMS_DRSTA E1000_ICR_DRSTA /* Device Reset Asserted */ #define E1000_IMS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO * parity error */ #define E1000_IMS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO @@ -881,6 +889,7 @@ #define E1000_IMS_TXQ0 E1000_ICR_TXQ0 /* Tx Queue 0 Interrupt */ #define E1000_IMS_TXQ1 E1000_ICR_TXQ1 /* Tx Queue 1 Interrupt */ #define E1000_IMS_OTHER E1000_ICR_OTHER /* Other Interrupts */ +#define E1000_IMS_FER E1000_ICR_FER /* Fatal Error */ /* Extended Interrupt Mask Set */ #define E1000_EIMS_RX_QUEUE0 E1000_EICR_RX_QUEUE0 /* Rx Queue 0 Interrupt */ @@ -913,6 +922,7 @@ #define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */ +#define E1000_ICS_DRSTA E1000_ICR_DRSTA /* Device Reset Aserted */ #define E1000_ICS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* Q0 Rx desc FIFO * parity error */ #define E1000_ICS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* Q0 Tx desc FIFO @@ -1036,6 +1046,56 @@ #define E1000_RXCW_SYNCH 0x40000000 /* Receive config synch */ #define E1000_RXCW_ANC 0x80000000 /* Auto-neg complete */ +#define E1000_TSYNCTXCTL_VALID 0x00000001 /* tx timestamp valid */ +#define E1000_TSYNCTXCTL_ENABLED 0x00000010 /* enable tx timestampping */ + +#define E1000_TSYNCRXCTL_VALID 0x00000001 /* rx timestamp valid */ +#define E1000_TSYNCRXCTL_TYPE_MASK 0x0000000E /* rx type mask */ +#define E1000_TSYNCRXCTL_TYPE_L2_V2 0x00 +#define E1000_TSYNCRXCTL_TYPE_L4_V1 0x02 +#define E1000_TSYNCRXCTL_TYPE_L2_L4_V2 0x04 +#define E1000_TSYNCRXCTL_TYPE_ALL 0x08 +#define E1000_TSYNCRXCTL_TYPE_EVENT_V2 0x0A +#define E1000_TSYNCRXCTL_ENABLED 0x00000010 /* enable rx timestampping */ + +#define E1000_TSYNCRXCFG_PTP_V1_CTRLT_MASK 0x000000FF +#define E1000_TSYNCRXCFG_PTP_V1_SYNC_MESSAGE 0x00 +#define E1000_TSYNCRXCFG_PTP_V1_DELAY_REQ_MESSAGE 0x01 +#define E1000_TSYNCRXCFG_PTP_V1_FOLLOWUP_MESSAGE 0x02 +#define E1000_TSYNCRXCFG_PTP_V1_DELAY_RESP_MESSAGE 0x03 +#define E1000_TSYNCRXCFG_PTP_V1_MANAGEMENT_MESSAGE 0x04 + +#define E1000_TSYNCRXCFG_PTP_V2_MSGID_MASK 0x00000F00 +#define E1000_TSYNCRXCFG_PTP_V2_SYNC_MESSAGE 0x0000 +#define E1000_TSYNCRXCFG_PTP_V2_DELAY_REQ_MESSAGE 0x0100 +#define E1000_TSYNCRXCFG_PTP_V2_PATH_DELAY_REQ_MESSAGE 0x0200 +#define E1000_TSYNCRXCFG_PTP_V2_PATH_DELAY_RESP_MESSAGE 0x0300 +#define E1000_TSYNCRXCFG_PTP_V2_FOLLOWUP_MESSAGE 0x0800 +#define E1000_TSYNCRXCFG_PTP_V2_DELAY_RESP_MESSAGE 0x0900 +#define E1000_TSYNCRXCFG_PTP_V2_PATH_DELAY_FOLLOWUP_MESSAGE 0x0A00 +#define E1000_TSYNCRXCFG_PTP_V2_ANNOUNCE_MESSAGE 0x0B00 +#define E1000_TSYNCRXCFG_PTP_V2_SIGNALLING_MESSAGE 0x0C00 +#define E1000_TSYNCRXCFG_PTP_V2_MANAGEMENT_MESSAGE 0x0D00 + +#define E1000_TIMINCA_16NS_SHIFT 24 +/* TUPLE Filtering Configuration */ +#define E1000_TTQF_DISABLE_MASK 0xF0008000 /* TTQF Disable Mask */ +#define E1000_TTQF_QUEUE_ENABLE 0x100 /* TTQF Queue Enable Bit */ +#define E1000_TTQF_PROTOCOL_MASK 0xFF /* TTQF Protocol Mask */ +/* TTQF TCP Bit, shift with E1000_TTQF_PROTOCOL SHIFT */ +#define E1000_TTQF_PROTOCOL_TCP 0x0 +/* TTQF UDP Bit, shift with E1000_TTQF_PROTOCOL_SHIFT */ +#define E1000_TTQF_PROTOCOL_UDP 0x1 +/* TTQF SCTP Bit, shift with E1000_TTQF_PROTOCOL_SHIFT */ +#define E1000_TTQF_PROTOCOL_SCTP 0x2 +#define E1000_TTQF_PROTOCOL_SHIFT 5 /* TTQF Protocol Shift */ +#define E1000_TTQF_QUEUE_SHIFT 16 /* TTQF Queue Shfit */ +#define E1000_TTQF_RX_QUEUE_MASK 0x70000 /* TTQF Queue Mask */ +#define E1000_TTQF_MASK_ENABLE 0x10000000 /* TTQF Mask Enable Bit */ +#define E1000_IMIR_CLEAR_MASK 0xF001FFFF /* IMIR Reg Clear Mask */ +#define E1000_IMIR_PORT_BYPASS 0x20000 /* IMIR Port Bypass Bit */ +#define E1000_IMIR_PRIORITY_SHIFT 29 /* IMIR Priority Shift */ +#define E1000_IMIREXT_CLEAR_MASK 0x7FFFF /* IMIREXT Reg Clear Mask */ /* PCI Express Control */ #define E1000_GCR_RXD_NO_SNOOP 0x00000001 @@ -1227,6 +1287,10 @@ #define E1000_NVM_CFG_DONE_PORT_0 0x040000 /* MNG config cycle done */ #define E1000_NVM_CFG_DONE_PORT_1 0x080000 /* ...for second port */ +#define E1000_NVM_CFG_DONE_PORT_2 0x100000 /* ...for third port */ +#define E1000_NVM_CFG_DONE_PORT_3 0x200000 /* ...for fourth port */ + +#define NVM_82580_LAN_FUNC_OFFSET(a) (a ? (0x40 + (0x40 * a)) : 0) /* Mask bits for fields in Word 0x0f of the NVM */ #define NVM_WORD0F_PAUSE_MASK 0x3000 @@ -1346,6 +1410,7 @@ #define BME1000_E_PHY_ID_R2 0x01410CB1 #define I82577_E_PHY_ID 0x01540050 #define I82578_E_PHY_ID 0x004DD040 +#define I82580_I_PHY_ID 0x015403A0 #define IGP04E1000_E_PHY_ID 0x02A80391 #define M88_VENDOR 0x0141 @@ -1575,5 +1640,34 @@ #define E1000_LSECRXCTRL_RSV_MASK 0xFFFFFF33 +/* DMA Coalescing register fields */ +#define E1000_DMACR_DMACWT_MASK 0x00003FFF /* DMA Coalescing + * Watchdog Timer */ +#define E1000_DMACR_DMACTHR_MASK 0x00FF0000 /* DMA Coalescing Receive + * Threshold */ +#define E1000_DMACR_DMACTHR_SHIFT 16 +#define E1000_DMACR_DMAC_LX_MASK 0x30000000 /* Lx when no PCIe + * transactions */ +#define E1000_DMACR_DMAC_LX_SHIFT 28 +#define E1000_DMACR_DMAC_EN 0x80000000 /* Enable DMA Coalescing */ + +#define E1000_DMCTXTH_DMCTTHR_MASK 0x00000FFF /* DMA Coalescing Transmit + * Threshold */ + +#define E1000_DMCTLX_TTLX_MASK 0x00000FFF /* Time to LX request */ + +#define E1000_DMCRTRH_UTRESH_MASK 0x0007FFFF /* Receive Traffic Rate + * Threshold */ +#define E1000_DMCRTRH_LRPRCW 0x80000000 /* Rcv packet rate in + * current window */ + +#define E1000_DMCCNT_CCOUNT_MASK 0x01FFFFFF /* DMA Coal Rcv Traffic + * Current Cnt */ + +#define E1000_FCRTC_RTH_COAL_MASK 0x0003FFF0 /* Flow ctrl Rcv Threshold + * High val */ +#define E1000_FCRTC_RTH_COAL_SHIFT 4 +#define E1000_PCIEMISC_LX_DECISION 0x00000080 /* Lx power decision based + on DMA coal */ #endif /* _E1000_DEFINES_H_ */ diff --git a/sys/dev/e1000/e1000_hw.h b/sys/dev/e1000/e1000_hw.h index 6afa4fbb8bd5..fd30173c646f 100644 --- a/sys/dev/e1000/e1000_hw.h +++ b/sys/dev/e1000/e1000_hw.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -100,6 +100,7 @@ struct e1000_hw; #define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 #define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA #define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB +#define E1000_DEV_ID_ICH8_82567V_3 0x1501 #define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049 #define E1000_DEV_ID_ICH8_IGP_AMT 0x104A #define E1000_DEV_ID_ICH8_IGP_C 0x104B @@ -130,11 +131,17 @@ struct e1000_hw; #define E1000_DEV_ID_82576_SERDES 0x10E7 #define E1000_DEV_ID_82576_QUAD_COPPER 0x10E8 #define E1000_DEV_ID_82576_NS 0x150A -#define E1000_DEV_ID_82576_SERDES_QUAD 0x150D +#define E1000_DEV_ID_82576_NS_SERDES 0x1518 +#define E1000_DEV_ID_82576_SERDES_QUAD 0x150D #define E1000_DEV_ID_82575EB_COPPER 0x10A7 #define E1000_DEV_ID_82575EB_FIBER_SERDES 0x10A9 #define E1000_DEV_ID_82575GB_QUAD_COPPER 0x10D6 #define E1000_DEV_ID_82575GB_QUAD_COPPER_PM 0x10E2 +#define E1000_DEV_ID_82580_COPPER 0x150E +#define E1000_DEV_ID_82580_FIBER 0x150F +#define E1000_DEV_ID_82580_SERDES 0x1510 +#define E1000_DEV_ID_82580_SGMII 0x1511 +#define E1000_DEV_ID_82580_COPPER_DUAL 0x1516 #define E1000_REVISION_0 0 #define E1000_REVISION_1 1 #define E1000_REVISION_2 2 @@ -143,9 +150,13 @@ struct e1000_hw; #define E1000_FUNC_0 0 #define E1000_FUNC_1 1 +#define E1000_FUNC_2 2 +#define E1000_FUNC_3 3 #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN0 0 #define E1000_ALT_MAC_ADDRESS_OFFSET_LAN1 3 +#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN2 6 +#define E1000_ALT_MAC_ADDRESS_OFFSET_LAN3 9 enum e1000_mac_type { e1000_undefined = 0, @@ -173,6 +184,7 @@ enum e1000_mac_type { e1000_pchlan, e1000_82575, e1000_82576, + e1000_82580, e1000_num_macs /* List is 1-based, so subtract 1 for TRUE count. */ }; @@ -213,6 +225,7 @@ enum e1000_phy_type { e1000_phy_bm, e1000_phy_82578, e1000_phy_82577, + e1000_phy_82580, e1000_phy_vf, }; @@ -587,11 +600,11 @@ struct e1000_mac_operations { s32 (*reset_hw)(struct e1000_hw *); s32 (*init_hw)(struct e1000_hw *); void (*shutdown_serdes)(struct e1000_hw *); + void (*power_up_serdes)(struct e1000_hw *); s32 (*setup_link)(struct e1000_hw *); s32 (*setup_physical_interface)(struct e1000_hw *); s32 (*setup_led)(struct e1000_hw *); void (*write_vfta)(struct e1000_hw *, u32, u32); - void (*mta_set)(struct e1000_hw *, u32); void (*config_collision_dist)(struct e1000_hw *); void (*rar_set)(struct e1000_hw *, u8*, u32); s32 (*read_mac_addr)(struct e1000_hw *); @@ -615,11 +628,13 @@ struct e1000_phy_operations { s32 (*get_cable_length)(struct e1000_hw *); s32 (*get_info)(struct e1000_hw *); s32 (*read_reg)(struct e1000_hw *, u32, u16 *); + s32 (*read_reg_locked)(struct e1000_hw *, u32, u16 *); void (*release)(struct e1000_hw *); s32 (*reset)(struct e1000_hw *); s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); s32 (*write_reg)(struct e1000_hw *, u32, u16); + s32 (*write_reg_locked)(struct e1000_hw *, u32, u16); void (*power_up)(struct e1000_hw *); void (*power_down)(struct e1000_hw *); }; @@ -657,6 +672,7 @@ struct e1000_mac_info { u16 ifs_ratio; u16 ifs_step_size; u16 mta_reg_count; + u16 uta_reg_count; /* Maximum size of the MTA register table in all supported adapters */ #define MAX_MTA_REG 128 @@ -768,6 +784,10 @@ struct e1000_dev_spec_82571 { u32 smb_counter; }; +struct e1000_dev_spec_80003es2lan { + bool mdic_wa_enable; +}; + struct e1000_shadow_ram { u16 value; bool modified; @@ -778,6 +798,9 @@ struct e1000_shadow_ram { struct e1000_dev_spec_ich8lan { bool kmrn_lock_loss_workaround_enabled; struct e1000_shadow_ram shadow_ram[E1000_SHADOW_RAM_WORDS]; + E1000_MUTEX nvm_mutex; + E1000_MUTEX swflag_mutex; + bool nvm_k1_enabled; }; struct e1000_dev_spec_82575 { @@ -810,6 +833,7 @@ struct e1000_hw { struct e1000_dev_spec_82542 _82542; struct e1000_dev_spec_82543 _82543; struct e1000_dev_spec_82571 _82571; + struct e1000_dev_spec_80003es2lan _80003es2lan; struct e1000_dev_spec_ich8lan ich8lan; struct e1000_dev_spec_82575 _82575; struct e1000_dev_spec_vf vf; diff --git a/sys/dev/e1000/e1000_ich8lan.c b/sys/dev/e1000/e1000_ich8lan.c index a80955a5a367..c40085fcfd20 100644 --- a/sys/dev/e1000/e1000_ich8lan.c +++ b/sys/dev/e1000/e1000_ich8lan.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -68,10 +68,12 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw); static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw); static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw); static void e1000_release_swflag_ich8lan(struct e1000_hw *hw); +static s32 e1000_acquire_nvm_ich8lan(struct e1000_hw *hw); +static void e1000_release_nvm_ich8lan(struct e1000_hw *hw); static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw); static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw); -static s32 e1000_get_phy_info_ich8lan(struct e1000_hw *hw); +static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active); static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active); static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, @@ -95,6 +97,7 @@ static s32 e1000_get_link_up_info_ich8lan(struct e1000_hw *hw, static s32 e1000_cleanup_led_ich8lan(struct e1000_hw *hw); static s32 e1000_led_on_ich8lan(struct e1000_hw *hw); static s32 e1000_led_off_ich8lan(struct e1000_hw *hw); +static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); static s32 e1000_setup_led_pchlan(struct e1000_hw *hw); static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw); static s32 e1000_led_on_pchlan(struct e1000_hw *hw); @@ -103,7 +106,6 @@ static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank); static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout); static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw); -static s32 e1000_get_phy_info_ife_ich8lan(struct e1000_hw *hw); static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); static s32 e1000_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw); static s32 e1000_read_flash_byte_ich8lan(struct e1000_hw *hw, @@ -120,6 +122,10 @@ static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset, u8 size, u16 data); static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw); static void e1000_power_down_phy_copper_ich8lan(struct e1000_hw *hw); +static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw); +static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw); +static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw); +static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); /* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */ /* Offset 04h HSFSTS */ @@ -179,35 +185,58 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) phy->reset_delay_us = 100; phy->ops.acquire = e1000_acquire_swflag_ich8lan; - phy->ops.check_polarity = e1000_check_polarity_ife; phy->ops.check_reset_block = e1000_check_reset_block_ich8lan; - phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_ife; - phy->ops.get_cable_length = e1000_get_cable_length_igp_2; phy->ops.get_cfg_done = e1000_get_cfg_done_ich8lan; - phy->ops.get_info = e1000_get_phy_info_ich8lan; phy->ops.read_reg = e1000_read_phy_reg_hv; + phy->ops.read_reg_locked = e1000_read_phy_reg_hv_locked; phy->ops.release = e1000_release_swflag_ich8lan; phy->ops.reset = e1000_phy_hw_reset_ich8lan; - phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_ich8lan; - phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_ich8lan; + phy->ops.set_d0_lplu_state = e1000_set_lplu_state_pchlan; + phy->ops.set_d3_lplu_state = e1000_set_lplu_state_pchlan; phy->ops.write_reg = e1000_write_phy_reg_hv; + phy->ops.write_reg_locked = e1000_write_phy_reg_hv_locked; phy->ops.power_up = e1000_power_up_phy_copper; phy->ops.power_down = e1000_power_down_phy_copper_ich8lan; phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; phy->id = e1000_phy_unknown; - e1000_get_phy_id(hw); + ret_val = e1000_get_phy_id(hw); + if (ret_val) + goto out; + if ((phy->id == 0) || (phy->id == PHY_REVISION_MASK)) { + /* + * In case the PHY needs to be in mdio slow mode (eg. 82577), + * set slow mode and try to get the PHY id again. + */ + ret_val = e1000_set_mdio_slow_mode_hv(hw); + if (ret_val) + goto out; + ret_val = e1000_get_phy_id(hw); + if (ret_val) + goto out; + } phy->type = e1000_get_phy_type_from_id(phy->id); - if (phy->type == e1000_phy_82577) { + switch (phy->type) { + case e1000_phy_82577: phy->ops.check_polarity = e1000_check_polarity_82577; phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_82577; - phy->ops.get_cable_length = e1000_get_cable_length_82577; + phy->ops.get_cable_length = e1000_get_cable_length_82577; phy->ops.get_info = e1000_get_phy_info_82577; phy->ops.commit = e1000_phy_sw_reset_generic; + case e1000_phy_82578: + phy->ops.check_polarity = e1000_check_polarity_m88; + phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; + phy->ops.get_cable_length = e1000_get_cable_length_m88; + phy->ops.get_info = e1000_get_phy_info_m88; + break; + default: + ret_val = -E1000_ERR_PHY; + break; } +out: return ret_val; } @@ -229,12 +258,9 @@ static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw) phy->reset_delay_us = 100; phy->ops.acquire = e1000_acquire_swflag_ich8lan; - phy->ops.check_polarity = e1000_check_polarity_ife; phy->ops.check_reset_block = e1000_check_reset_block_ich8lan; - phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_ife; phy->ops.get_cable_length = e1000_get_cable_length_igp_2; phy->ops.get_cfg_done = e1000_get_cfg_done_ich8lan; - phy->ops.get_info = e1000_get_phy_info_ich8lan; phy->ops.read_reg = e1000_read_phy_reg_igp; phy->ops.release = e1000_release_swflag_ich8lan; phy->ops.reset = e1000_phy_hw_reset_ich8lan; @@ -273,12 +299,20 @@ static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw) case IGP03E1000_E_PHY_ID: phy->type = e1000_phy_igp_3; phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; + phy->ops.read_reg_locked = e1000_read_phy_reg_igp_locked; + phy->ops.write_reg_locked = e1000_write_phy_reg_igp_locked; + phy->ops.get_info = e1000_get_phy_info_igp; + phy->ops.check_polarity = e1000_check_polarity_igp; + phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_igp; break; case IFE_E_PHY_ID: case IFE_PLUS_E_PHY_ID: case IFE_C_E_PHY_ID: phy->type = e1000_phy_ife; phy->autoneg_mask = E1000_ALL_NOT_GIG; + phy->ops.get_info = e1000_get_phy_info_ife; + phy->ops.check_polarity = e1000_check_polarity_ife; + phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_ife; break; case BME1000_E_PHY_ID: phy->type = e1000_phy_bm; @@ -286,6 +320,9 @@ static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw) phy->ops.read_reg = e1000_read_phy_reg_bm; phy->ops.write_reg = e1000_write_phy_reg_bm; phy->ops.commit = e1000_phy_sw_reset_generic; + phy->ops.get_info = e1000_get_phy_info_m88; + phy->ops.check_polarity = e1000_check_polarity_m88; + phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; break; default: ret_val = -E1000_ERR_PHY; @@ -353,10 +390,13 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw) dev_spec->shadow_ram[i].value = 0xFFFF; } + E1000_MUTEX_INIT(&dev_spec->nvm_mutex); + E1000_MUTEX_INIT(&dev_spec->swflag_mutex); + /* Function Pointers */ - nvm->ops.acquire = e1000_acquire_swflag_ich8lan; + nvm->ops.acquire = e1000_acquire_nvm_ich8lan; + nvm->ops.release = e1000_release_nvm_ich8lan; nvm->ops.read = e1000_read_nvm_ich8lan; - nvm->ops.release = e1000_release_swflag_ich8lan; nvm->ops.update = e1000_update_nvm_checksum_ich8lan; nvm->ops.valid_led_default = e1000_valid_led_default_ich8lan; nvm->ops.validate = e1000_validate_nvm_checksum_ich8lan; @@ -393,6 +433,8 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw) mac->asf_firmware_present = TRUE; /* Set if manageability features are enabled. */ mac->arc_subsystem_valid = TRUE; + /* Adaptive IFS supported */ + mac->adaptive_ifs = TRUE; /* Function pointers */ @@ -409,15 +451,13 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw) /* physical interface setup */ mac->ops.setup_physical_interface = e1000_setup_copper_link_ich8lan; /* check for link */ - mac->ops.check_for_link = e1000_check_for_copper_link_generic; + mac->ops.check_for_link = e1000_check_for_copper_link_ich8lan; /* check management mode */ mac->ops.check_mng_mode = e1000_check_mng_mode_ich8lan; /* link info */ mac->ops.get_link_up_info = e1000_get_link_up_info_ich8lan; /* multicast address update */ mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic; - /* setting MTA */ - mac->ops.mta_set = e1000_mta_set_generic; /* clear hardware counters */ mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_ich8lan; @@ -460,10 +500,98 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw) if (mac->type == e1000_ich8lan) e1000_set_kmrn_lock_loss_workaround_ich8lan(hw, TRUE); - return E1000_SUCCESS; } +/** + * e1000_check_for_copper_link_ich8lan - Check for link (Copper) + * @hw: pointer to the HW structure + * + * Checks to see of the link status of the hardware has changed. If a + * change in link status has been detected, then we read the PHY registers + * to get the current speed/duplex if link exists. + **/ +static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) +{ + struct e1000_mac_info *mac = &hw->mac; + s32 ret_val; + bool link; + + DEBUGFUNC("e1000_check_for_copper_link_ich8lan"); + + /* + * We only want to go out to the PHY registers to see if Auto-Neg + * has completed and/or if our link status has changed. The + * get_link_status flag is set upon receiving a Link Status + * Change or Rx Sequence Error interrupt. + */ + if (!mac->get_link_status) { + ret_val = E1000_SUCCESS; + goto out; + } + + /* + * First we want to see if the MII Status Register reports + * link. If so, then we want to get the current speed/duplex + * of the PHY. + */ + ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); + if (ret_val) + goto out; + + if (hw->mac.type == e1000_pchlan) { + ret_val = e1000_k1_gig_workaround_hv(hw, link); + if (ret_val) + goto out; + } + + if (!link) + goto out; /* No link detected */ + + mac->get_link_status = FALSE; + + if (hw->phy.type == e1000_phy_82578) { + ret_val = e1000_link_stall_workaround_hv(hw); + if (ret_val) + goto out; + } + + /* + * Check if there was DownShift, must be checked + * immediately after link-up + */ + e1000_check_downshift_generic(hw); + + /* + * If we are forcing speed/duplex, then we simply return since + * we have already determined whether we have link or not. + */ + if (!mac->autoneg) { + ret_val = -E1000_ERR_CONFIG; + goto out; + } + + /* + * Auto-Neg is enabled. Auto Speed Detection takes care + * of MAC speed/duplex configuration. So we only need to + * configure Collision Distance in the MAC. + */ + e1000_config_collision_dist_generic(hw); + + /* + * Configure Flow Control now that Auto-Neg has completed. + * First, we need to restore the desired flow control + * settings because we may have had to re-autoneg with a + * different link partner. + */ + ret_val = e1000_config_fc_after_link_up_generic(hw); + if (ret_val) + DEBUGOUT("Error configuring flow control\n"); + +out: + return ret_val; +} + /** * e1000_init_function_pointers_ich8lan - Initialize ICH8 function pointers * @hw: pointer to the HW structure @@ -490,13 +618,42 @@ void e1000_init_function_pointers_ich8lan(struct e1000_hw *hw) } } +/** + * e1000_acquire_nvm_ich8lan - Acquire NVM mutex + * @hw: pointer to the HW structure + * + * Acquires the mutex for performing NVM operations. + **/ +static s32 e1000_acquire_nvm_ich8lan(struct e1000_hw *hw) +{ + DEBUGFUNC("e1000_acquire_nvm_ich8lan"); + + E1000_MUTEX_LOCK(&hw->dev_spec.ich8lan.nvm_mutex); + + return E1000_SUCCESS; +} + +/** + * e1000_release_nvm_ich8lan - Release NVM mutex + * @hw: pointer to the HW structure + * + * Releases the mutex used while performing NVM operations. + **/ +static void e1000_release_nvm_ich8lan(struct e1000_hw *hw) +{ + DEBUGFUNC("e1000_release_nvm_ich8lan"); + + E1000_MUTEX_UNLOCK(&hw->dev_spec.ich8lan.nvm_mutex); + + return; +} + /** * e1000_acquire_swflag_ich8lan - Acquire software control flag * @hw: pointer to the HW structure * - * Acquires the software control flag for performing NVM and PHY - * operations. This is a function pointer entry point only called by - * read/write routines for the PHY and NVM parts. + * Acquires the software control flag for performing PHY and select + * MAC CSR accesses. **/ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) { @@ -505,23 +662,39 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) DEBUGFUNC("e1000_acquire_swflag_ich8lan"); + E1000_MUTEX_LOCK(&hw->dev_spec.ich8lan.swflag_mutex); + while (timeout) { extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); + if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)) + break; - if (!(extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG)) { - extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; - E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl); - - extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); - if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) - break; - } msec_delay_irq(1); timeout--; } if (!timeout) { DEBUGOUT("SW/FW/HW has locked the resource for too long.\n"); + ret_val = -E1000_ERR_CONFIG; + goto out; + } + + timeout = SW_FLAG_TIMEOUT; + + extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; + E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl); + + while (timeout) { + extcnf_ctrl = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); + if (extcnf_ctrl & E1000_EXTCNF_CTRL_SWFLAG) + break; + + msec_delay_irq(1); + timeout--; + } + + if (!timeout) { + DEBUGOUT("Failed to acquire the semaphore.\n"); extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl); ret_val = -E1000_ERR_CONFIG; @@ -529,6 +702,9 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) } out: + if (ret_val) + E1000_MUTEX_UNLOCK(&hw->dev_spec.ich8lan.swflag_mutex); + return ret_val; } @@ -536,9 +712,8 @@ out: * e1000_release_swflag_ich8lan - Release software control flag * @hw: pointer to the HW structure * - * Releases the software control flag for performing NVM and PHY operations. - * This is a function pointer entry point only called by read/write - * routines for the PHY and NVM parts. + * Releases the software control flag for performing PHY and select + * MAC CSR accesses. **/ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) { @@ -550,6 +725,8 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; E1000_WRITE_REG(hw, E1000_EXTCNF_CTRL, extcnf_ctrl); + E1000_MUTEX_UNLOCK(&hw->dev_spec.ich8lan.swflag_mutex); + return; } @@ -593,6 +770,324 @@ static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw) : E1000_BLK_PHY_RESET; } +/** + * e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration + * @hw: pointer to the HW structure + * + * SW should configure the LCD from the NVM extended configuration region + * as a workaround for certain parts. + **/ +static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) +{ + struct e1000_phy_info *phy = &hw->phy; + u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; + s32 ret_val = E1000_SUCCESS; + u16 word_addr, reg_data, reg_addr, phy_page = 0; + + if (!(hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) && + !(hw->mac.type == e1000_pchlan)) + return ret_val; + + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + + /* + * Initialize the PHY from the NVM on ICH platforms. This + * is needed due to an issue where the NVM configuration is + * not properly autoloaded after power transitions. + * Therefore, after each PHY reset, we will load the + * configuration data out of the NVM manually. + */ + if ((hw->device_id == E1000_DEV_ID_ICH8_IGP_M_AMT) || + (hw->device_id == E1000_DEV_ID_ICH8_IGP_M) || + (hw->mac.type == e1000_pchlan)) + sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; + else + sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; + + data = E1000_READ_REG(hw, E1000_FEXTNVM); + if (!(data & sw_cfg_mask)) + goto out; + + /* Wait for basic configuration completes before proceeding */ + e1000_lan_init_done_ich8lan(hw); + + /* + * Make sure HW does not configure LCD from PHY + * extended configuration before SW configuration + */ + data = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); + if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) + goto out; + + cnf_size = E1000_READ_REG(hw, E1000_EXTCNF_SIZE); + cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK; + cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT; + if (!cnf_size) + goto out; + + cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; + cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; + + if (!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) && + (hw->mac.type == e1000_pchlan)) { + /* + * HW configures the SMBus address and LEDs when the + * OEM and LCD Write Enable bits are set in the NVM. + * When both NVM bits are cleared, SW will configure + * them instead. + */ + data = E1000_READ_REG(hw, E1000_STRAP); + data &= E1000_STRAP_SMBUS_ADDRESS_MASK; + reg_data = data >> E1000_STRAP_SMBUS_ADDRESS_SHIFT; + reg_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; + ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, + reg_data); + if (ret_val) + goto out; + + data = E1000_READ_REG(hw, E1000_LEDCTL); + ret_val = e1000_write_phy_reg_hv_locked(hw, HV_LED_CONFIG, + (u16)data); + if (ret_val) + goto out; + } + + /* Configure LCD from extended configuration region. */ + + /* cnf_base_addr is in DWORD */ + word_addr = (u16)(cnf_base_addr << 1); + + for (i = 0; i < cnf_size; i++) { + ret_val = hw->nvm.ops.read(hw, (word_addr + i * 2), 1, + ®_data); + if (ret_val) + goto out; + + ret_val = hw->nvm.ops.read(hw, (word_addr + i * 2 + 1), + 1, ®_addr); + if (ret_val) + goto out; + + /* Save off the PHY page for future writes. */ + if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) { + phy_page = reg_data; + continue; + } + + reg_addr &= PHY_REG_MASK; + reg_addr |= phy_page; + + ret_val = phy->ops.write_reg_locked(hw, (u32)reg_addr, + reg_data); + if (ret_val) + goto out; + } + +out: + hw->phy.ops.release(hw); + return ret_val; +} + +/** + * e1000_k1_gig_workaround_hv - K1 Si workaround + * @hw: pointer to the HW structure + * @link: link up bool flag + * + * If K1 is enabled for 1Gbps, the MAC might stall when transitioning + * from a lower speed. This workaround disables K1 whenever link is at 1Gig + * If link is down, the function will restore the default K1 setting located + * in the NVM. + **/ +static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link) +{ + s32 ret_val = E1000_SUCCESS; + u16 status_reg = 0; + bool k1_enable = hw->dev_spec.ich8lan.nvm_k1_enabled; + + DEBUGFUNC("e1000_k1_gig_workaround_hv"); + + if (hw->mac.type != e1000_pchlan) + goto out; + + /* Wrap the whole flow with the sw flag */ + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + + /* Disable K1 when link is 1Gbps, otherwise use the NVM setting */ + if (link) { + if (hw->phy.type == e1000_phy_82578) { + ret_val = hw->phy.ops.read_reg_locked(hw, BM_CS_STATUS, + &status_reg); + if (ret_val) + goto release; + + status_reg &= BM_CS_STATUS_LINK_UP | + BM_CS_STATUS_RESOLVED | + BM_CS_STATUS_SPEED_MASK; + + if (status_reg == (BM_CS_STATUS_LINK_UP | + BM_CS_STATUS_RESOLVED | + BM_CS_STATUS_SPEED_1000)) + k1_enable = FALSE; + } + + if (hw->phy.type == e1000_phy_82577) { + ret_val = hw->phy.ops.read_reg_locked(hw, HV_M_STATUS, + &status_reg); + if (ret_val) + goto release; + + status_reg &= HV_M_STATUS_LINK_UP | + HV_M_STATUS_AUTONEG_COMPLETE | + HV_M_STATUS_SPEED_MASK; + + if (status_reg == (HV_M_STATUS_LINK_UP | + HV_M_STATUS_AUTONEG_COMPLETE | + HV_M_STATUS_SPEED_1000)) + k1_enable = FALSE; + } + + /* Link stall fix for link up */ + ret_val = hw->phy.ops.write_reg_locked(hw, PHY_REG(770, 19), + 0x0100); + if (ret_val) + goto release; + + } else { + /* Link stall fix for link down */ + ret_val = hw->phy.ops.write_reg_locked(hw, PHY_REG(770, 19), + 0x4100); + if (ret_val) + goto release; + } + + ret_val = e1000_configure_k1_ich8lan(hw, k1_enable); + +release: + hw->phy.ops.release(hw); +out: + return ret_val; +} + +/** + * e1000_configure_k1_ich8lan - Configure K1 power state + * @hw: pointer to the HW structure + * @enable: K1 state to configure + * + * Configure the K1 power state based on the provided parameter. + * Assumes semaphore already acquired. + * + * Success returns 0, Failure returns -E1000_ERR_PHY (-2) + **/ +s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable) +{ + s32 ret_val = E1000_SUCCESS; + u32 ctrl_reg = 0; + u32 ctrl_ext = 0; + u32 reg = 0; + u16 kmrn_reg = 0; + + ret_val = e1000_read_kmrn_reg_locked(hw, + E1000_KMRNCTRLSTA_K1_CONFIG, + &kmrn_reg); + if (ret_val) + goto out; + + if (k1_enable) + kmrn_reg |= E1000_KMRNCTRLSTA_K1_ENABLE; + else + kmrn_reg &= ~E1000_KMRNCTRLSTA_K1_ENABLE; + + ret_val = e1000_write_kmrn_reg_locked(hw, + E1000_KMRNCTRLSTA_K1_CONFIG, + kmrn_reg); + if (ret_val) + goto out; + + usec_delay(20); + ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); + ctrl_reg = E1000_READ_REG(hw, E1000_CTRL); + + reg = ctrl_reg & ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100); + reg |= E1000_CTRL_FRCSPD; + E1000_WRITE_REG(hw, E1000_CTRL, reg); + + E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS); + usec_delay(20); + E1000_WRITE_REG(hw, E1000_CTRL, ctrl_reg); + E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext); + usec_delay(20); + +out: + return ret_val; +} + +/** + * e1000_oem_bits_config_ich8lan - SW-based LCD Configuration + * @hw: pointer to the HW structure + * @d0_state: boolean if entering d0 or d3 device state + * + * SW will configure Gbe Disable and LPLU based on the NVM. The four bits are + * collectively called OEM bits. The OEM Write Enable bit and SW Config bit + * in NVM determines whether HW should configure LPLU and Gbe Disable. + **/ +s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state) +{ + s32 ret_val = 0; + u32 mac_reg; + u16 oem_reg; + + if (hw->mac.type != e1000_pchlan) + return ret_val; + + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + + mac_reg = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); + if (mac_reg & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) + goto out; + + mac_reg = E1000_READ_REG(hw, E1000_FEXTNVM); + if (!(mac_reg & E1000_FEXTNVM_SW_CONFIG_ICH8M)) + goto out; + + mac_reg = E1000_READ_REG(hw, E1000_PHY_CTRL); + + ret_val = hw->phy.ops.read_reg_locked(hw, HV_OEM_BITS, &oem_reg); + if (ret_val) + goto out; + + oem_reg &= ~(HV_OEM_BITS_GBE_DIS | HV_OEM_BITS_LPLU); + + if (d0_state) { + if (mac_reg & E1000_PHY_CTRL_GBE_DISABLE) + oem_reg |= HV_OEM_BITS_GBE_DIS; + + if (mac_reg & E1000_PHY_CTRL_D0A_LPLU) + oem_reg |= HV_OEM_BITS_LPLU; + } else { + if (mac_reg & E1000_PHY_CTRL_NOND0A_GBE_DISABLE) + oem_reg |= HV_OEM_BITS_GBE_DIS; + + if (mac_reg & E1000_PHY_CTRL_NOND0A_LPLU) + oem_reg |= HV_OEM_BITS_LPLU; + } + /* Restart auto-neg to activate the bits */ + if (!hw->phy.ops.check_reset_block(hw)) + oem_reg |= HV_OEM_BITS_RESTART_AN; + ret_val = hw->phy.ops.write_reg_locked(hw, HV_OEM_BITS, oem_reg); + +out: + hw->phy.ops.release(hw); + + return ret_val; +} + + /** * e1000_hv_phy_powerdown_workaround_ich8lan - Power down workaround on Sx * @hw: pointer to the HW structure @@ -605,6 +1100,26 @@ s32 e1000_hv_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw) return hw->phy.ops.write_reg(hw, PHY_REG(768, 25), 0x0444); } +/** + * e1000_set_mdio_slow_mode_hv - Set slow MDIO access mode + * @hw: pointer to the HW structure + **/ +static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw) +{ + s32 ret_val; + u16 data; + + ret_val = hw->phy.ops.read_reg(hw, HV_KMRN_MODE_CTRL, &data); + if (ret_val) + return ret_val; + + data |= HV_KMRN_MDIO_SLOW; + + ret_val = hw->phy.ops.write_reg(hw, HV_KMRN_MODE_CTRL, data); + + return ret_val; +} + /** * e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be * done after every PHY reset. @@ -612,9 +1127,17 @@ s32 e1000_hv_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw) static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw) { s32 ret_val = E1000_SUCCESS; + u16 phy_data; if (hw->mac.type != e1000_pchlan) - return ret_val; + goto out; + + /* Set MDIO slow mode before any other MDIO access */ + if (hw->phy.type == e1000_phy_82577) { + ret_val = e1000_set_mdio_slow_mode_hv(hw); + if (ret_val) + goto out; + } /* Hanksville M Phy init for IEEE. */ if ((hw->revision_id == 2) && @@ -648,12 +1171,12 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw) /* Disable generation of early preamble */ ret_val = hw->phy.ops.write_reg(hw, PHY_REG(769, 25), 0x4431); if (ret_val) - return ret_val; + goto out; /* Preamble tuning for SSC */ ret_val = hw->phy.ops.write_reg(hw, PHY_REG(770, 16), 0xA204); if (ret_val) - return ret_val; + goto out; } if (hw->phy.type == e1000_phy_82578) { @@ -662,13 +1185,13 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw) ret_val = hw->phy.ops.write_reg(hw, (1 << 6) | 0x29, 0x66C0); if (ret_val) - return ret_val; + goto out; /* PHY config */ ret_val = hw->phy.ops.write_reg(hw, (1 << 6) | 0x1E, 0xFFFF); if (ret_val) - return ret_val; + goto out; } /* @@ -691,20 +1214,46 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw) */ ret_val = hw->phy.ops.write_reg(hw, PHY_REG(768, 25), 0x0400); if (ret_val) - return ret_val; + goto out; ret_val = hw->phy.ops.write_reg(hw, PHY_REG(768, 25), 0x0400); if (ret_val) - return ret_val; + goto out; } /* Select page 0 */ ret_val = hw->phy.ops.acquire(hw); if (ret_val) - return ret_val; - hw->phy.addr = 1; - e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0); - hw->phy.ops.release(hw); + goto out; + hw->phy.addr = 1; + ret_val = e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0); + hw->phy.ops.release(hw); + if (ret_val) + goto out; + + /* + * Configure the K1 Si workaround during phy reset assuming there is + * link so that it disables K1 if link is in 1Gbps. + */ + ret_val = e1000_k1_gig_workaround_hv(hw, TRUE); + if (ret_val) + goto out; + + /* Workaround for link disconnects on a busy hub in half duplex */ + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + ret_val = hw->phy.ops.read_reg_locked(hw, + PHY_REG(BM_PORT_CTRL_PAGE, 17), + &phy_data); + if (ret_val) + goto release; + ret_val = hw->phy.ops.write_reg_locked(hw, + PHY_REG(BM_PORT_CTRL_PAGE, 17), + phy_data & 0x00FF); +release: + hw->phy.ops.release(hw); +out: return ret_val; } @@ -752,10 +1301,8 @@ static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw) **/ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) { - struct e1000_phy_info *phy = &hw->phy; - u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; - s32 ret_val; - u16 word_addr, reg_data, reg_addr, phy_page = 0; + s32 ret_val = E1000_SUCCESS; + u16 reg; DEBUGFUNC("e1000_phy_hw_reset_ich8lan"); @@ -766,168 +1313,62 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) /* Allow time for h/w to get to a quiescent state after reset */ msec_delay(10); - if (hw->mac.type == e1000_pchlan) { + /* Perform any necessary post-reset workarounds */ + switch (hw->mac.type) { + case e1000_pchlan: ret_val = e1000_hv_phy_workarounds_ich8lan(hw); if (ret_val) goto out; + break; + default: + break; } - /* - * Initialize the PHY from the NVM on ICH platforms. This - * is needed due to an issue where the NVM configuration is - * not properly autoloaded after power transitions. - * Therefore, after each PHY reset, we will load the - * configuration data out of the NVM manually. - */ - if (hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) { - /* Check if SW needs configure the PHY */ - if ((hw->device_id == E1000_DEV_ID_ICH8_IGP_M_AMT) || - (hw->device_id == E1000_DEV_ID_ICH8_IGP_M)) - sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; - else - sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; + /* Dummy read to clear the phy wakeup bit after lcd reset */ + if (hw->mac.type == e1000_pchlan) + hw->phy.ops.read_reg(hw, BM_WUC, ®); - data = E1000_READ_REG(hw, E1000_FEXTNVM); - if (!(data & sw_cfg_mask)) - goto out; + /* Configure the LCD with the extended configuration region in NVM */ + ret_val = e1000_sw_lcd_config_ich8lan(hw); + if (ret_val) + goto out; - /* Wait for basic configuration completes before proceeding */ - e1000_lan_init_done_ich8lan(hw); - - /* - * Make sure HW does not configure LCD from PHY - * extended configuration before SW configuration - */ - data = E1000_READ_REG(hw, E1000_EXTCNF_CTRL); - if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) - goto out; - - cnf_size = E1000_READ_REG(hw, E1000_EXTCNF_SIZE); - cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK; - cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT; - if (!cnf_size) - goto out; - - cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; - cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; - - /* Configure LCD from extended configuration region. */ - - /* cnf_base_addr is in DWORD */ - word_addr = (u16)(cnf_base_addr << 1); - - for (i = 0; i < cnf_size; i++) { - ret_val = hw->nvm.ops.read(hw, (word_addr + i * 2), 1, - ®_data); - if (ret_val) - goto out; - - ret_val = hw->nvm.ops.read(hw, (word_addr + i * 2 + 1), - 1, ®_addr); - if (ret_val) - goto out; - - /* Save off the PHY page for future writes. */ - if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) { - phy_page = reg_data; - continue; - } - - reg_addr |= phy_page; - - ret_val = phy->ops.write_reg(hw, (u32)reg_addr, reg_data); - if (ret_val) - goto out; - } - } + /* Configure the LCD with the OEM bits in NVM */ + ret_val = e1000_oem_bits_config_ich8lan(hw, TRUE); out: return ret_val; } /** - * e1000_get_phy_info_ich8lan - Calls appropriate PHY type get_phy_info + * e1000_set_lplu_state_pchlan - Set Low Power Link Up state * @hw: pointer to the HW structure + * @active: TRUE to enable LPLU, FALSE to disable * - * Wrapper for calling the get_phy_info routines for the appropriate phy type. + * Sets the LPLU state according to the active flag. For PCH, if OEM write + * bit are disabled in the NVM, writing the LPLU bits in the MAC will not set + * the phy speed. This function will manually set the LPLU bit and restart + * auto-neg as hw would do. D3 and D0 LPLU will call the same function + * since it configures the same bit. **/ -static s32 e1000_get_phy_info_ich8lan(struct e1000_hw *hw) +static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active) { - s32 ret_val = -E1000_ERR_PHY_TYPE; + s32 ret_val = E1000_SUCCESS; + u16 oem_reg; - DEBUGFUNC("e1000_get_phy_info_ich8lan"); + DEBUGFUNC("e1000_set_lplu_state_pchlan"); - switch (hw->phy.type) { - case e1000_phy_ife: - ret_val = e1000_get_phy_info_ife_ich8lan(hw); - break; - case e1000_phy_igp_3: - case e1000_phy_bm: - case e1000_phy_82578: - case e1000_phy_82577: - ret_val = e1000_get_phy_info_igp(hw); - break; - default: - break; - } - - return ret_val; -} - -/** - * e1000_get_phy_info_ife_ich8lan - Retrieves various IFE PHY states - * @hw: pointer to the HW structure - * - * Populates "phy" structure with various feature states. - * This function is only called by other family-specific - * routines. - **/ -static s32 e1000_get_phy_info_ife_ich8lan(struct e1000_hw *hw) -{ - struct e1000_phy_info *phy = &hw->phy; - s32 ret_val; - u16 data; - bool link; - - DEBUGFUNC("e1000_get_phy_info_ife_ich8lan"); - - ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); + ret_val = hw->phy.ops.read_reg(hw, HV_OEM_BITS, &oem_reg); if (ret_val) goto out; - if (!link) { - DEBUGOUT("Phy info is only valid if link is up\n"); - ret_val = -E1000_ERR_CONFIG; - goto out; - } + if (active) + oem_reg |= HV_OEM_BITS_LPLU; + else + oem_reg &= ~HV_OEM_BITS_LPLU; - ret_val = phy->ops.read_reg(hw, IFE_PHY_SPECIAL_CONTROL, &data); - if (ret_val) - goto out; - phy->polarity_correction = (data & IFE_PSC_AUTO_POLARITY_DISABLE) - ? FALSE : TRUE; - - if (phy->polarity_correction) { - ret_val = e1000_check_polarity_ife(hw); - if (ret_val) - goto out; - } else { - /* Polarity is forced */ - phy->cable_polarity = (data & IFE_PSC_FORCE_POLARITY) - ? e1000_rev_polarity_reversed - : e1000_rev_polarity_normal; - } - - ret_val = phy->ops.read_reg(hw, IFE_PHY_MDIX_CONTROL, &data); - if (ret_val) - goto out; - - phy->is_mdix = (data & IFE_PMC_MDIX_STATUS) ? TRUE : FALSE; - - /* The following parameters are undefined for 10/100 operation. */ - phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; - phy->local_rx = e1000_1000t_rx_status_undefined; - phy->remote_rx = e1000_1000t_rx_status_undefined; + oem_reg |= HV_OEM_BITS_RESTART_AN; + ret_val = hw->phy.ops.write_reg(hw, HV_OEM_BITS, oem_reg); out: return ret_val; @@ -1170,7 +1611,7 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank) if (ret_val) goto out; if ((sig_byte & E1000_ICH_NVM_VALID_SIG_MASK) == - E1000_ICH_NVM_SIG_VALUE) { + E1000_ICH_NVM_SIG_VALUE) { *bank = 0; goto out; } @@ -1178,11 +1619,11 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank) /* Check bank 1 */ ret_val = e1000_read_flash_byte_ich8lan(hw, act_offset + bank1_offset, - &sig_byte); + &sig_byte); if (ret_val) goto out; if ((sig_byte & E1000_ICH_NVM_VALID_SIG_MASK) == - E1000_ICH_NVM_SIG_VALUE) { + E1000_ICH_NVM_SIG_VALUE) { *bank = 1; goto out; } @@ -1223,17 +1664,18 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, goto out; } - ret_val = nvm->ops.acquire(hw); - if (ret_val) - goto out; + nvm->ops.acquire(hw); ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); - if (ret_val != E1000_SUCCESS) - goto release; + if (ret_val != E1000_SUCCESS) { + DEBUGOUT("Could not detect valid bank, assuming bank 0\n"); + bank = 0; + } act_offset = (bank) ? nvm->flash_bank_size : 0; act_offset += offset; + ret_val = E1000_SUCCESS; for (i = 0; i < words; i++) { if ((dev_spec->shadow_ram) && (dev_spec->shadow_ram[offset+i].modified)) { @@ -1248,7 +1690,6 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, } } -release: nvm->ops.release(hw); out: @@ -1534,9 +1975,7 @@ static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, goto out; } - ret_val = nvm->ops.acquire(hw); - if (ret_val) - goto out; + nvm->ops.acquire(hw); for (i = 0; i < words; i++) { dev_spec->shadow_ram[offset+i].modified = TRUE; @@ -1577,9 +2016,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) if (nvm->type != e1000_nvm_flash_sw) goto out; - ret_val = nvm->ops.acquire(hw); - if (ret_val) - goto out; + nvm->ops.acquire(hw); /* * We're writing to the opposite bank so if we're on bank 1, @@ -1588,26 +2025,22 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) */ ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); if (ret_val != E1000_SUCCESS) { - nvm->ops.release(hw); - goto out; + DEBUGOUT("Could not detect valid bank, assuming bank 0\n"); + bank = 0; } if (bank == 0) { new_bank_offset = nvm->flash_bank_size; old_bank_offset = 0; ret_val = e1000_erase_flash_bank_ich8lan(hw, 1); - if (ret_val) { - nvm->ops.release(hw); - goto out; - } + if (ret_val) + goto release; } else { old_bank_offset = nvm->flash_bank_size; new_bank_offset = 0; ret_val = e1000_erase_flash_bank_ich8lan(hw, 0); - if (ret_val) { - nvm->ops.release(hw); - goto out; - } + if (ret_val) + goto release; } for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) { @@ -1662,8 +2095,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) */ if (ret_val) { DEBUGOUT("Flash commit failed.\n"); - nvm->ops.release(hw); - goto out; + goto release; } /* @@ -1674,18 +2106,15 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) */ act_offset = new_bank_offset + E1000_ICH_NVM_SIG_WORD; ret_val = e1000_read_flash_word_ich8lan(hw, act_offset, &data); - if (ret_val) { - nvm->ops.release(hw); - goto out; - } + if (ret_val) + goto release; + data &= 0xBFFF; ret_val = e1000_retry_write_flash_byte_ich8lan(hw, act_offset * 2 + 1, (u8)(data >> 8)); - if (ret_val) { - nvm->ops.release(hw); - goto out; - } + if (ret_val) + goto release; /* * And invalidate the previously valid segment by setting @@ -1695,10 +2124,8 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) */ act_offset = (old_bank_offset + E1000_ICH_NVM_SIG_WORD) * 2 + 1; ret_val = e1000_retry_write_flash_byte_ich8lan(hw, act_offset, 0); - if (ret_val) { - nvm->ops.release(hw); - goto out; - } + if (ret_val) + goto release; /* Great! Everything worked, we can now clear the cached entries. */ for (i = 0; i < E1000_SHADOW_RAM_WORDS; i++) { @@ -1706,14 +2133,17 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) dev_spec->shadow_ram[i].value = 0xFFFF; } +release: nvm->ops.release(hw); /* * Reload the EEPROM, or else modifications will not appear * until after the next adapter reset. */ - nvm->ops.reload(hw); - msec_delay(10); + if (!ret_val) { + nvm->ops.reload(hw); + msec_delay(10); + } out: if (ret_val) @@ -1829,10 +2259,10 @@ static s32 e1000_write_flash_data_ich8lan(struct e1000_hw *hw, u32 offset, * try...ICH_FLASH_CYCLE_REPEAT_COUNT times. */ hsfsts.regval = E1000_READ_FLASH_REG16(hw, ICH_FLASH_HSFSTS); - if (hsfsts.hsf_status.flcerr == 1) { + if (hsfsts.hsf_status.flcerr == 1) /* Repeat for some time before giving up. */ continue; - } else if (hsfsts.hsf_status.flcdone == 0) { + if (hsfsts.hsf_status.flcdone == 0) { DEBUGOUT("Timeout error - flash cycle " "did not complete."); break; @@ -1960,7 +2390,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank) /* Start with the base address, then add the sector offset. */ flash_linear_addr = hw->nvm.flash_base_addr; - flash_linear_addr += (bank) ? (sector_size * iteration) : 0; + flash_linear_addr += (bank) ? flash_bank_size : 0; for (j = 0; j < iteration ; j++) { do { @@ -2153,6 +2583,8 @@ static s32 e1000_get_bus_info_ich8lan(struct e1000_hw *hw) **/ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) { + struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; + u16 reg; u32 ctrl, icr, kab; s32 ret_val; @@ -2188,6 +2620,18 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) E1000_WRITE_REG(hw, E1000_PBS, E1000_PBS_16K); } + if (hw->mac.type == e1000_pchlan) { + /* Save the NVM K1 bit setting*/ + ret_val = e1000_read_nvm(hw, E1000_NVM_K1_CONFIG, 1, ®); + if (ret_val) + return ret_val; + + if (reg & E1000_NVM_K1_ENABLE) + dev_spec->nvm_k1_enabled = TRUE; + else + dev_spec->nvm_k1_enabled = FALSE; + } + ctrl = E1000_READ_REG(hw, E1000_CTRL); if (!hw->phy.ops.check_reset_block(hw) && !hw->phy.reset_disable) { @@ -2213,6 +2657,17 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) if (!ret_val) e1000_release_swflag_ich8lan(hw); + /* Perform any necessary post-reset workarounds */ + switch (hw->mac.type) { + case e1000_pchlan: + ret_val = e1000_hv_phy_workarounds_ich8lan(hw); + if (ret_val) + goto out; + break; + default: + break; + } + if (ctrl & E1000_CTRL_PHY_RST) ret_val = hw->phy.ops.get_cfg_done(hw); @@ -2229,6 +2684,23 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) DEBUGOUT("Auto Read Done did not complete\n"); } } + if (hw->mac.type == e1000_pchlan) + hw->phy.ops.read_reg(hw, BM_WUC, ®); + + ret_val = e1000_sw_lcd_config_ich8lan(hw); + if (ret_val) + goto out; + + ret_val = e1000_oem_bits_config_ich8lan(hw, TRUE); + if (ret_val) + goto out; + /* + * For PCH, this write will make sure that any noise + * will be detected as a CRC error and be dropped rather than show up + * as a bad packet to the DMA engine. + */ + if (hw->mac.type == e1000_pchlan) + E1000_WRITE_REG(hw, E1000_CRC_OFFSET, 0x65656565); E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff); icr = E1000_READ_REG(hw, E1000_ICR); @@ -2237,9 +2709,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) kab |= E1000_KABGTXD_BGSQLBIAS; E1000_WRITE_REG(hw, E1000_KABGTXD, kab); - if (hw->mac.type == e1000_pchlan) - ret_val = e1000_hv_phy_workarounds_ich8lan(hw); - +out: return ret_val; } @@ -2269,8 +2739,8 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw) /* Initialize identification LED */ ret_val = mac->ops.id_led_init(hw); if (ret_val) - /* This is not fatal and we should not stop init due to this */ DEBUGOUT("Error initializing identification LED\n"); + /* This is not fatal and we should not stop init due to this */ /* Setup the receive address. */ e1000_init_rx_addrs_generic(hw, mac->rar_entry_count); @@ -2316,7 +2786,7 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw) if (mac->type == e1000_ich8lan) snoop = PCIE_ICH8_SNOOP_ALL; else - snoop = (u32)~(PCIE_NO_SNOOP_ALL); + snoop = (u32) ~(PCIE_NO_SNOOP_ALL); e1000_set_pcie_no_snoop_generic(hw, snoop); ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT); @@ -2473,8 +2943,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw) * and increase the max iterations when polling the phy; * this fixes erroneous timeouts at 10Mbps. */ - ret_val = e1000_write_kmrn_reg_generic(hw, - E1000_KMRNCTRLSTA_TIMEOUTS, + ret_val = e1000_write_kmrn_reg_generic(hw, E1000_KMRNCTRLSTA_TIMEOUTS, 0xFFFF); if (ret_val) goto out; @@ -2788,6 +3257,7 @@ void e1000_disable_gig_wol_ich8lan(struct e1000_hw *hw) u32 phy_ctrl; switch (hw->mac.type) { + case e1000_ich8lan: case e1000_ich9lan: case e1000_ich10lan: case e1000_pchlan: @@ -2796,9 +3266,8 @@ void e1000_disable_gig_wol_ich8lan(struct e1000_hw *hw) E1000_PHY_CTRL_GBE_DISABLE; E1000_WRITE_REG(hw, E1000_PHY_CTRL, phy_ctrl); - /* Workaround SWFLAG unexpectedly set during S0->Sx */ if (hw->mac.type == e1000_pchlan) - usec_delay(500); + e1000_phy_hw_reset_ich8lan(hw); default: break; } @@ -2814,17 +3283,14 @@ void e1000_disable_gig_wol_ich8lan(struct e1000_hw *hw) **/ static s32 e1000_cleanup_led_ich8lan(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; - DEBUGFUNC("e1000_cleanup_led_ich8lan"); if (hw->phy.type == e1000_phy_ife) - ret_val = hw->phy.ops.write_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, - 0); - else - E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default); + return hw->phy.ops.write_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, + 0); - return ret_val; + E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default); + return E1000_SUCCESS; } /** @@ -2835,17 +3301,14 @@ static s32 e1000_cleanup_led_ich8lan(struct e1000_hw *hw) **/ static s32 e1000_led_on_ich8lan(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; - DEBUGFUNC("e1000_led_on_ich8lan"); if (hw->phy.type == e1000_phy_ife) - ret_val = hw->phy.ops.write_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, + return hw->phy.ops.write_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_ON)); - else - E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode2); - return ret_val; + E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode2); + return E1000_SUCCESS; } /** @@ -2856,18 +3319,14 @@ static s32 e1000_led_on_ich8lan(struct e1000_hw *hw) **/ static s32 e1000_led_off_ich8lan(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; - DEBUGFUNC("e1000_led_off_ich8lan"); if (hw->phy.type == e1000_phy_ife) - ret_val = hw->phy.ops.write_reg(hw, - IFE_PHY_SPECIAL_CONTROL_LED, + return hw->phy.ops.write_reg(hw, IFE_PHY_SPECIAL_CONTROL_LED, (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF)); - else - E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); - return ret_val; + E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_mode1); + return E1000_SUCCESS; } /** @@ -2982,18 +3441,17 @@ static s32 e1000_get_cfg_done_ich8lan(struct e1000_hw *hw) if (hw->mac.type >= e1000_pchlan) { u32 status = E1000_READ_REG(hw, E1000_STATUS); - if (status & E1000_STATUS_PHYRA) { + if (status & E1000_STATUS_PHYRA) E1000_WRITE_REG(hw, E1000_STATUS, status & ~E1000_STATUS_PHYRA); - } else + else DEBUGOUT("PHY Reset Asserted not set - needs delay\n"); } e1000_get_cfg_done_generic(hw); /* If EEPROM is not marked present, init the IGP 3 PHY manually */ - if ((hw->mac.type != e1000_ich10lan) && - (hw->mac.type != e1000_pchlan)) { + if (hw->mac.type <= e1000_ich9lan) { if (((E1000_READ_REG(hw, E1000_EECD) & E1000_EECD_PRES) == 0) && (hw->phy.type == e1000_phy_igp_3)) { e1000_phy_init_script_igp3(hw); diff --git a/sys/dev/e1000/e1000_ich8lan.h b/sys/dev/e1000/e1000_ich8lan.h index 5416eeb72b29..cc8ba16cb2af 100644 --- a/sys/dev/e1000/e1000_ich8lan.h +++ b/sys/dev/e1000/e1000_ich8lan.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -140,6 +140,35 @@ #define HV_TNCRS_UPPER PHY_REG(778, 29) /* Transmit with no CRS */ #define HV_TNCRS_LOWER PHY_REG(778, 30) +#define E1000_FCRTV_PCH 0x05F40 /* PCH Flow Control Refresh Timer Value */ + +#define E1000_NVM_K1_CONFIG 0x1B /* NVM K1 Config Word */ +#define E1000_NVM_K1_ENABLE 0x1 /* NVM Enable K1 bit */ + +/* SMBus Address Phy Register */ +#define HV_SMB_ADDR PHY_REG(768, 26) +#define HV_SMB_ADDR_PEC_EN 0x0200 +#define HV_SMB_ADDR_VALID 0x0080 + +/* Strapping Option Register - RO */ +#define E1000_STRAP 0x0000C +#define E1000_STRAP_SMBUS_ADDRESS_MASK 0x00FE0000 +#define E1000_STRAP_SMBUS_ADDRESS_SHIFT 17 + +/* OEM Bits Phy Register */ +#define HV_OEM_BITS PHY_REG(768, 25) +#define HV_OEM_BITS_LPLU 0x0004 /* Low Power Link Up */ +#define HV_OEM_BITS_GBE_DIS 0x0040 /* Gigabit Disable */ +#define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */ + +#define LCD_CFG_PHY_ADDR_BIT 0x0020 /* Phy address bit from LCD Config word */ + +/* KMRN Mode Control */ +#define HV_KMRN_MODE_CTRL PHY_REG(769, 16) +#define HV_KMRN_MDIO_SLOW 0x0400 + +#define SW_FLAG_TIMEOUT 1000 /* SW Semaphore flag timeout in milliseconds */ + /* * Additional interrupts need to be handled for ICH family: * DSW = The FW changed the status of the DISSW bit in FWSM @@ -169,6 +198,7 @@ void e1000_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, void e1000_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); void e1000_gig_downshift_workaround_ich8lan(struct e1000_hw *hw); void e1000_disable_gig_wol_ich8lan(struct e1000_hw *hw); +s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable); +s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_config); s32 e1000_hv_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); - #endif diff --git a/sys/dev/e1000/e1000_mac.c b/sys/dev/e1000/e1000_mac.c index db6e5f52e088..3c525c1f1f17 100644 --- a/sys/dev/e1000/e1000_mac.c +++ b/sys/dev/e1000/e1000_mac.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -78,7 +78,6 @@ void e1000_init_mac_ops_generic(struct e1000_hw *hw) mac->ops.update_mc_addr_list = e1000_null_update_mc; mac->ops.clear_vfta = e1000_null_mac_generic; mac->ops.write_vfta = e1000_null_write_vfta; - mac->ops.mta_set = e1000_null_mta_set; mac->ops.rar_set = e1000_rar_set_generic; mac->ops.validate_mdi_setting = e1000_validate_mdi_setting_generic; } @@ -143,16 +142,6 @@ void e1000_null_write_vfta(struct e1000_hw *hw, u32 a, u32 b) return; } -/** - * e1000_null_set_mta - No-op function, return void - * @hw: pointer to the HW structure - **/ -void e1000_null_mta_set(struct e1000_hw *hw, u32 a) -{ - DEBUGFUNC("e1000_null_mta_set"); - return; -} - /** * e1000_null_rar_set - No-op function, return void * @hw: pointer to the HW structure @@ -230,7 +219,6 @@ s32 e1000_get_bus_info_pcie_generic(struct e1000_hw *hw) { struct e1000_mac_info *mac = &hw->mac; struct e1000_bus_info *bus = &hw->bus; - s32 ret_val; u16 pcie_link_status; @@ -408,6 +396,11 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) if (hw->bus.func == E1000_FUNC_1) nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN1; + if (hw->bus.func == E1000_FUNC_2) + nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN2; + + if (hw->bus.func == E1000_FUNC_3) + nvm_alt_mac_addr_offset += E1000_ALT_MAC_ADDRESS_OFFSET_LAN3; for (i = 0; i < ETH_ADDR_LEN; i += 2) { offset = nvm_alt_mac_addr_offset + (i >> 1); ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data); @@ -477,42 +470,6 @@ void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) E1000_WRITE_FLUSH(hw); } -/** - * e1000_mta_set_generic - Set multicast filter table address - * @hw: pointer to the HW structure - * @hash_value: determines the MTA register and bit to set - * - * The multicast table address is a register array of 32-bit registers. - * The hash_value is used to determine what register the bit is in, the - * current value is read, the new bit is OR'd in and the new value is - * written back into the register. - **/ -void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value) -{ - u32 hash_bit, hash_reg, mta; - - DEBUGFUNC("e1000_mta_set_generic"); - /* - * The MTA is a register array of 32-bit registers. It is - * treated like an array of (32*mta_reg_count) bits. We want to - * set bit BitArray[hash_value]. So we figure out what register - * the bit is in, read it, OR in the new bit, then write - * back the new value. The (hw->mac.mta_reg_count - 1) serves as a - * mask to bits 31:5 of the hash value which gives us the - * register we're modifying. The hash bit within that register - * is determined by the lower 5 bits of the hash value. - */ - hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1); - hash_bit = hash_value & 0x1F; - - mta = E1000_READ_REG_ARRAY(hw, E1000_MTA, hash_reg); - - mta |= (1 << hash_bit); - - E1000_WRITE_REG_ARRAY(hw, E1000_MTA, hash_reg, mta); - E1000_WRITE_FLUSH(hw); -} - /** * e1000_update_mc_addr_list_generic - Update Multicast addresses * @hw: pointer to the HW structure @@ -556,8 +513,7 @@ void e1000_update_mc_addr_list_generic(struct e1000_hw *hw, * @mc_addr: pointer to a multicast address * * Generates a multicast address hash value which is used to determine - * the multicast filter table array address and new table value. See - * e1000_mta_set_generic() + * the multicast filter table array address and new table value. **/ u32 e1000_hash_mc_addr_generic(struct e1000_hw *hw, u8 *mc_addr) { @@ -750,12 +706,6 @@ s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) mac->get_link_status = FALSE; - if (hw->phy.type == e1000_phy_82578) { - ret_val = e1000_link_stall_workaround_hv(hw); - if (ret_val) - goto out; - } - /* * Check if there was DownShift, must be checked * immediately after link-up @@ -776,7 +726,7 @@ s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw) * of MAC speed/duplex configuration. So we only need to * configure Collision Distance in the MAC. */ - e1000_config_collision_dist_generic(hw); + mac->ops.config_collision_dist(hw); /* * Configure Flow Control now that Auto-Neg has completed. @@ -994,9 +944,8 @@ s32 e1000_setup_link_generic(struct e1000_hw *hw) * In the case of the phy reset being blocked, we already have a link. * We do not need to set it up again. */ - if (hw->phy.ops.check_reset_block) - if (hw->phy.ops.check_reset_block(hw)) - goto out; + if (e1000_check_reset_block(hw)) + goto out; /* * If requested flow control is set to default, set flow control @@ -1050,6 +999,7 @@ out: **/ s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw) { + struct e1000_mac_info *mac = &hw->mac; u32 ctrl; s32 ret_val = E1000_SUCCESS; @@ -1060,7 +1010,7 @@ s32 e1000_setup_fiber_serdes_link_generic(struct e1000_hw *hw) /* Take the link out of reset */ ctrl &= ~E1000_CTRL_LRST; - e1000_config_collision_dist_generic(hw); + mac->ops.config_collision_dist(hw); ret_val = e1000_commit_fc_settings_generic(hw); if (ret_val) @@ -1100,8 +1050,7 @@ out: * @hw: pointer to the HW structure * * Configures the collision distance to the default value and is used - * during link setup. Currently no func pointer exists and all - * implementations are handled in the generic version of this function. + * during link setup. **/ void e1000_config_collision_dist_generic(struct e1000_hw *hw) { @@ -1155,7 +1104,7 @@ s32 e1000_poll_fiber_serdes_link_generic(struct e1000_hw *hw) * link up if we detect a signal. This will allow us to * communicate with non-autonegotiating link partners. */ - ret_val = hw->mac.ops.check_for_link(hw); + ret_val = mac->ops.check_for_link(hw); if (ret_val) { DEBUGOUT("Error while checking for link\n"); goto out; @@ -1212,7 +1161,7 @@ s32 e1000_commit_fc_settings_generic(struct e1000_hw *hw) * Rx Flow control is enabled and Tx Flow control is disabled * by a software over-ride. Since there really isn't a way to * advertise that we are capable of Rx Pause ONLY, we will - * advertise that we support both symmetric and asymmetric RX + * advertise that we support both symmetric and asymmetric Rx * PAUSE. Later, we will disable the adapter's ability to send * PAUSE frames. */ @@ -1256,7 +1205,6 @@ out: **/ s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; u32 fcrtl = 0, fcrth = 0; DEBUGFUNC("e1000_set_fc_watermarks_generic"); @@ -1283,7 +1231,7 @@ s32 e1000_set_fc_watermarks_generic(struct e1000_hw *hw) E1000_WRITE_REG(hw, E1000_FCRTL, fcrtl); E1000_WRITE_REG(hw, E1000_FCRTH, fcrth); - return ret_val; + return E1000_SUCCESS; } /** @@ -1512,7 +1460,7 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) /* * Now we need to check if the user selected Rx ONLY * of pause frames. In this case, we had to advertise - * FULL flow control because we could not advertise RX + * FULL flow control because we could not advertise Rx * ONLY. Hence, we must now check to see if we need to * turn OFF the TRANSMISSION of PAUSE frames. */ @@ -1522,7 +1470,7 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) } else { hw->fc.current_mode = e1000_fc_rx_pause; DEBUGOUT("Flow Control = " - "RX PAUSE frames only.\r\n"); + "Rx PAUSE frames only.\r\n"); } } /* @@ -1538,7 +1486,7 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { hw->fc.current_mode = e1000_fc_tx_pause; - DEBUGOUT("Flow Control = TX PAUSE frames only.\r\n"); + DEBUGOUT("Flow Control = Tx PAUSE frames only.\r\n"); } /* * For transmitting PAUSE frames ONLY. @@ -1553,7 +1501,7 @@ s32 e1000_config_fc_after_link_up_generic(struct e1000_hw *hw) !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) && (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) { hw->fc.current_mode = e1000_fc_rx_pause; - DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); + DEBUGOUT("Flow Control = Rx PAUSE frames only.\r\n"); } else { /* * Per the IEEE spec, at this point flow control @@ -1895,19 +1843,10 @@ out: **/ s32 e1000_cleanup_led_generic(struct e1000_hw *hw) { - s32 ret_val = E1000_SUCCESS; - DEBUGFUNC("e1000_cleanup_led_generic"); - if (hw->mac.ops.cleanup_led != e1000_cleanup_led_generic) { - ret_val = -E1000_ERR_CONFIG; - goto out; - } - E1000_WRITE_REG(hw, E1000_LEDCTL, hw->mac.ledctl_default); - -out: - return ret_val; + return E1000_SUCCESS; } /** @@ -2033,7 +1972,7 @@ out: * e1000_disable_pcie_master_generic - Disables PCI-express master access * @hw: pointer to the HW structure * - * Returns 0 (E1000_SUCCESS) if successful, else returns -10 + * Returns E1000_SUCCESS if successful, else returns -10 * (-E1000_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused * the master requests to be disabled. * @@ -2066,7 +2005,6 @@ s32 e1000_disable_pcie_master_generic(struct e1000_hw *hw) if (!timeout) { DEBUGOUT("Master requests are pending.\n"); ret_val = -E1000_ERR_MASTER_REQUESTS_PENDING; - goto out; } out: @@ -2151,7 +2089,7 @@ out: * Verify that when not using auto-negotiation that MDI/MDIx is correctly * set, which is forced to MDI mode only. **/ -s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw) +static s32 e1000_validate_mdi_setting_generic(struct e1000_hw *hw) { s32 ret_val = E1000_SUCCESS; diff --git a/sys/dev/e1000/e1000_mac.h b/sys/dev/e1000/e1000_mac.h index b7a5b2c5ecb0..348d660f9734 100644 --- a/sys/dev/e1000/e1000_mac.h +++ b/sys/dev/e1000/e1000_mac.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -46,7 +46,6 @@ s32 e1000_null_link_info(struct e1000_hw *hw, u16 *s, u16 *d); bool e1000_null_mng_mode(struct e1000_hw *hw); void e1000_null_update_mc(struct e1000_hw *hw, u8 *h, u32 a); void e1000_null_write_vfta(struct e1000_hw *hw, u32 a, u32 b); -void e1000_null_mta_set(struct e1000_hw *hw, u32 a); void e1000_null_rar_set(struct e1000_hw *hw, u8 *h, u32 a); s32 e1000_blink_led_generic(struct e1000_hw *hw); s32 e1000_check_for_copper_link_generic(struct e1000_hw *hw); @@ -87,7 +86,6 @@ void e1000_clear_hw_cntrs_base_generic(struct e1000_hw *hw); void e1000_clear_vfta_generic(struct e1000_hw *hw); void e1000_config_collision_dist_generic(struct e1000_hw *hw); void e1000_init_rx_addrs_generic(struct e1000_hw *hw, u16 rar_count); -void e1000_mta_set_generic(struct e1000_hw *hw, u32 hash_value); void e1000_pcix_mmrbc_workaround_generic(struct e1000_hw *hw); void e1000_put_hw_semaphore_generic(struct e1000_hw *hw); void e1000_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); diff --git a/sys/dev/e1000/e1000_manage.c b/sys/dev/e1000/e1000_manage.c index b1f6541ad0c1..2cd85b3a9e8c 100644 --- a/sys/dev/e1000/e1000_manage.c +++ b/sys/dev/e1000/e1000_manage.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2008, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -74,7 +74,7 @@ s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw) { u32 hicr; s32 ret_val = E1000_SUCCESS; - u8 i; + u8 i; DEBUGFUNC("e1000_mng_enable_host_if_generic"); @@ -112,18 +112,17 @@ out: **/ bool e1000_check_mng_mode_generic(struct e1000_hw *hw) { - u32 fwsm; + u32 fwsm = E1000_READ_REG(hw, E1000_FWSM); DEBUGFUNC("e1000_check_mng_mode_generic"); - fwsm = E1000_READ_REG(hw, E1000_FWSM); return (fwsm & E1000_FWSM_MODE_MASK) == (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); } /** - * e1000_enable_tx_pkt_filtering_generic - Enable packet filtering on TX + * e1000_enable_tx_pkt_filtering_generic - Enable packet filtering on Tx * @hw: pointer to the HW structure * * Enables packet filtering on transmit packets if manageability is enabled @@ -136,13 +135,14 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) u32 offset; s32 ret_val, hdr_csum, csum; u8 i, len; - bool tx_filter = TRUE; DEBUGFUNC("e1000_enable_tx_pkt_filtering_generic"); + hw->mac.tx_pkt_filtering = TRUE; + /* No manageability, no filtering */ if (!hw->mac.ops.check_mng_mode(hw)) { - tx_filter = FALSE; + hw->mac.tx_pkt_filtering = FALSE; goto out; } @@ -152,18 +152,16 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) */ ret_val = hw->mac.ops.mng_enable_host_if(hw); if (ret_val != E1000_SUCCESS) { - tx_filter = FALSE; + hw->mac.tx_pkt_filtering = FALSE; goto out; } /* Read in the header. Length and offset are in dwords. */ len = E1000_MNG_DHCP_COOKIE_LENGTH >> 2; offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2; - for (i = 0; i < len; i++) { - *(buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, - E1000_HOST_IF, + for (i = 0; i < len; i++) + *(buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i); - } hdr_csum = hdr->checksum; hdr->checksum = 0; csum = e1000_calculate_checksum((u8 *)hdr, @@ -173,18 +171,19 @@ bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) * the cookie area isn't considered valid, in which case we * take the safe route of assuming Tx filtering is enabled. */ - if (hdr_csum != csum) - goto out; - if (hdr->signature != E1000_IAMT_SIGNATURE) + if ((hdr_csum != csum) || (hdr->signature != E1000_IAMT_SIGNATURE)) { + hw->mac.tx_pkt_filtering = TRUE; goto out; + } /* Cookie area is valid, make the final check for filtering. */ - if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) - tx_filter = FALSE; + if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) { + hw->mac.tx_pkt_filtering = FALSE; + goto out; + } out: - hw->mac.tx_pkt_filtering = tx_filter; - return tx_filter; + return hw->mac.tx_pkt_filtering; } /** @@ -344,10 +343,11 @@ out: } /** - * e1000_enable_mng_pass_thru - Enable processing of ARP's + * e1000_enable_mng_pass_thru - Check if management passthrough is needed * @hw: pointer to the HW structure * - * Verifies the hardware needs to allow ARPs to be processed by the host. + * Verifies the hardware needs to leave interface enabled so that frames can + * be directed to and from the management interface. **/ bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) { @@ -362,8 +362,7 @@ bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) manc = E1000_READ_REG(hw, E1000_MANC); - if (!(manc & E1000_MANC_RCV_TCO_EN) || - !(manc & E1000_MANC_EN_MAC_ADDR_FILTER)) + if (!(manc & E1000_MANC_RCV_TCO_EN)) goto out; if (hw->mac.arc_subsystem_valid) { diff --git a/sys/dev/e1000/e1000_osdep.h b/sys/dev/e1000/e1000_osdep.h index b478f29fb0f7..ff505cc19ca1 100644 --- a/sys/dev/e1000/e1000_osdep.h +++ b/sys/dev/e1000/e1000_osdep.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2008, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include #include @@ -57,10 +59,8 @@ #define ASSERT(x) if(!(x)) panic("EM: x") -/* The happy-fun DELAY macro is defined in /usr/src/sys/i386/include/clock.h */ #define usec_delay(x) DELAY(x) #define msec_delay(x) DELAY(1000*(x)) -/* TODO: Should we be paranoid about delaying in interrupt context? */ #define msec_delay_irq(x) DELAY(1000*(x)) #define MSGOUT(S, A, B) printf(S "\n", A, B) @@ -73,16 +73,21 @@ #define STATIC static #define FALSE 0 -#define false FALSE /* shared code stupidity */ +#define false FALSE #define TRUE 1 #define true TRUE #define CMD_MEM_WRT_INVALIDATE 0x0010 /* BIT_4 */ #define PCI_COMMAND_REGISTER PCIR_COMMAND -/* -** These typedefs are necessary due to the new -** shared code, they are native to Linux. -*/ +/* Mutex used in the shared code */ +#define E1000_MUTEX struct mtx +#define E1000_MUTEX_INIT(mutex) mtx_init((mutex), #mutex, \ + MTX_NETWORK_LOCK, MTX_DEF) +#define E1000_MUTEX_DESTROY(mutex) mtx_destroy(mutex) +#define E1000_MUTEX_LOCK(mutex) mtx_lock(mutex) +#define E1000_MUTEX_TRYLOCK(mutex) mtx_trylock(mutex) +#define E1000_MUTEX_UNLOCK(mutex) mtx_unlock(mutex) + typedef uint64_t u64; typedef uint32_t u32; typedef uint16_t u16; @@ -97,6 +102,28 @@ typedef boolean_t bool; #define __le32 u32 #define __le64 u64 +#if __FreeBSD_version < 800000 /* Now in HEAD */ +#if defined(__i386__) || defined(__amd64__) +#define mb() __asm volatile("mfence" ::: "memory") +#define wmb() __asm volatile("sfence" ::: "memory") +#define rmb() __asm volatile("lfence" ::: "memory") +#else +#define mb() +#define rmb() +#define wmb() +#endif +#endif /*__FreeBSD_version < 800000 */ + +#if defined(__i386__) || defined(__amd64__) +static __inline +void prefetch(void *x) +{ + __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x)); +} +#else +#define prefetch(x) +#endif + struct e1000_osdep { bus_space_tag_t mem_bus_space_tag; diff --git a/sys/dev/e1000/e1000_phy.c b/sys/dev/e1000/e1000_phy.c index 513f2e67fb4a..dbc422a53f48 100644 --- a/sys/dev/e1000/e1000_phy.c +++ b/sys/dev/e1000/e1000_phy.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -83,11 +83,13 @@ void e1000_init_phy_ops_generic(struct e1000_hw *hw) phy->ops.get_cable_length = e1000_null_ops_generic; phy->ops.get_info = e1000_null_ops_generic; phy->ops.read_reg = e1000_null_read_reg; + phy->ops.read_reg_locked = e1000_null_read_reg; phy->ops.release = e1000_null_phy_generic; phy->ops.reset = e1000_null_ops_generic; phy->ops.set_d0_lplu_state = e1000_null_lplu_state; phy->ops.set_d3_lplu_state = e1000_null_lplu_state; phy->ops.write_reg = e1000_null_write_reg; + phy->ops.write_reg_locked = e1000_null_write_reg; phy->ops.power_up = e1000_null_phy_generic; phy->ops.power_down = e1000_null_phy_generic; phy->ops.cfg_on_link_up = e1000_null_ops_generic; @@ -189,22 +191,9 @@ s32 e1000_get_phy_id(struct e1000_hw *hw) if (phy->id != 0 && phy->id != PHY_REVISION_MASK) goto out; - /* - * If the PHY ID is still unknown, we may have an 82577 without link. - * We will try again after setting Slow MDIC mode. No harm in trying - * again in this case since the PHY ID is unknown at this point anyway - */ - ret_val = e1000_set_mdio_slow_mode_hv(hw, TRUE); - if (ret_val) - goto out; - retry_count++; } out: - /* Revert to MDIO fast mode, if applicable */ - if (retry_count) - ret_val = e1000_set_mdio_slow_mode_hv(hw, FALSE); - return ret_val; } @@ -250,6 +239,11 @@ s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data) DEBUGFUNC("e1000_read_phy_reg_mdic"); + if (offset > MAX_PHY_REG_ADDRESS) { + DEBUGOUT1("PHY Address %d is out of range\n", offset); + return -E1000_ERR_PARAM; + } + /* * Set up Op-code, Phy Address, and register offset in the MDI * Control register. The MAC will take care of interfacing with the @@ -308,6 +302,11 @@ s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data) DEBUGFUNC("e1000_write_phy_reg_mdic"); + if (offset > MAX_PHY_REG_ADDRESS) { + DEBUGOUT1("PHY Address %d is out of range\n", offset); + return -E1000_ERR_PARAM; + } + /* * Set up Op-code, Phy Address, and register offset in the MDI * Control register. The MAC will take care of interfacing with the @@ -350,6 +349,105 @@ out: return ret_val; } +/** + * e1000_read_phy_reg_i2c - Read PHY register using i2c + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * + * Reads the PHY register at offset using the i2c interface and stores the + * retrieved information in data. + **/ +s32 e1000_read_phy_reg_i2c(struct e1000_hw *hw, u32 offset, u16 *data) +{ + struct e1000_phy_info *phy = &hw->phy; + u32 i, i2ccmd = 0; + + DEBUGFUNC("e1000_read_phy_reg_i2c"); + + /* + * Set up Op-code, Phy Address, and register address in the I2CCMD + * register. The MAC will take care of interfacing with the + * PHY to retrieve the desired data. + */ + i2ccmd = ((offset << E1000_I2CCMD_REG_ADDR_SHIFT) | + (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | + (E1000_I2CCMD_OPCODE_READ)); + + E1000_WRITE_REG(hw, E1000_I2CCMD, i2ccmd); + + /* Poll the ready bit to see if the I2C read completed */ + for (i = 0; i < E1000_I2CCMD_PHY_TIMEOUT; i++) { + usec_delay(50); + i2ccmd = E1000_READ_REG(hw, E1000_I2CCMD); + if (i2ccmd & E1000_I2CCMD_READY) + break; + } + if (!(i2ccmd & E1000_I2CCMD_READY)) { + DEBUGOUT("I2CCMD Read did not complete\n"); + return -E1000_ERR_PHY; + } + if (i2ccmd & E1000_I2CCMD_ERROR) { + DEBUGOUT("I2CCMD Error bit set\n"); + return -E1000_ERR_PHY; + } + + /* Need to byte-swap the 16-bit value. */ + *data = ((i2ccmd >> 8) & 0x00FF) | ((i2ccmd << 8) & 0xFF00); + + return E1000_SUCCESS; +} + +/** + * e1000_write_phy_reg_i2c - Write PHY register using i2c + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * + * Writes the data to PHY register at the offset using the i2c interface. + **/ +s32 e1000_write_phy_reg_i2c(struct e1000_hw *hw, u32 offset, u16 data) +{ + struct e1000_phy_info *phy = &hw->phy; + u32 i, i2ccmd = 0; + u16 phy_data_swapped; + + DEBUGFUNC("e1000_write_phy_reg_i2c"); + + /* Swap the data bytes for the I2C interface */ + phy_data_swapped = ((data >> 8) & 0x00FF) | ((data << 8) & 0xFF00); + + /* + * Set up Op-code, Phy Address, and register address in the I2CCMD + * register. The MAC will take care of interfacing with the + * PHY to retrieve the desired data. + */ + i2ccmd = ((offset << E1000_I2CCMD_REG_ADDR_SHIFT) | + (phy->addr << E1000_I2CCMD_PHY_ADDR_SHIFT) | + E1000_I2CCMD_OPCODE_WRITE | + phy_data_swapped); + + E1000_WRITE_REG(hw, E1000_I2CCMD, i2ccmd); + + /* Poll the ready bit to see if the I2C read completed */ + for (i = 0; i < E1000_I2CCMD_PHY_TIMEOUT; i++) { + usec_delay(50); + i2ccmd = E1000_READ_REG(hw, E1000_I2CCMD); + if (i2ccmd & E1000_I2CCMD_READY) + break; + } + if (!(i2ccmd & E1000_I2CCMD_READY)) { + DEBUGOUT("I2CCMD Write did not complete\n"); + return -E1000_ERR_PHY; + } + if (i2ccmd & E1000_I2CCMD_ERROR) { + DEBUGOUT("I2CCMD Error bit set\n"); + return -E1000_ERR_PHY; + } + + return E1000_SUCCESS; +} + /** * e1000_read_phy_reg_m88 - Read m88 PHY register * @hw: pointer to the HW structure @@ -414,42 +512,119 @@ out: } /** - * e1000_read_phy_reg_igp - Read igp PHY register + * __e1000_read_phy_reg_igp - Read igp PHY register * @hw: pointer to the HW structure * @offset: register offset to be read * @data: pointer to the read data + * @locked: semaphore has already been acquired or not * * Acquires semaphore, if necessary, then reads the PHY register at offset - * and storing the retrieved information in data. Release any acquired + * and stores the retrieved information in data. Release any acquired * semaphores before exiting. **/ -s32 e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) +static s32 __e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data, + bool locked) { s32 ret_val = E1000_SUCCESS; - DEBUGFUNC("e1000_read_phy_reg_igp"); + DEBUGFUNC("__e1000_read_phy_reg_igp"); - if (!(hw->phy.ops.acquire)) - goto out; + if (!locked) { + if (!(hw->phy.ops.acquire)) + goto out; - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + } if (offset > MAX_PHY_MULTI_PAGE_REG) { ret_val = e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, (u16)offset); - if (ret_val) { - hw->phy.ops.release(hw); - goto out; - } + if (ret_val) + goto release; } ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); - hw->phy.ops.release(hw); +release: + if (!locked) + hw->phy.ops.release(hw); +out: + return ret_val; +} + +/** + * e1000_read_phy_reg_igp - Read igp PHY register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * + * Acquires semaphore then reads the PHY register at offset and stores the + * retrieved information in data. + * Release the acquired semaphore before exiting. + **/ +s32 e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) +{ + return __e1000_read_phy_reg_igp(hw, offset, data, FALSE); +} + +/** + * e1000_read_phy_reg_igp_locked - Read igp PHY register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * + * Reads the PHY register at offset and stores the retrieved information + * in data. Assumes semaphore already acquired. + **/ +s32 e1000_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 *data) +{ + return __e1000_read_phy_reg_igp(hw, offset, data, TRUE); +} + +/** + * e1000_write_phy_reg_igp - Write igp PHY register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * @locked: semaphore has already been acquired or not + * + * Acquires semaphore, if necessary, then writes the data to PHY register + * at the offset. Release any acquired semaphores before exiting. + **/ +static s32 __e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data, + bool locked) +{ + s32 ret_val = E1000_SUCCESS; + + DEBUGFUNC("e1000_write_phy_reg_igp"); + + if (!locked) { + if (!(hw->phy.ops.acquire)) + goto out; + + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + } + + if (offset > MAX_PHY_MULTI_PAGE_REG) { + ret_val = e1000_write_phy_reg_mdic(hw, + IGP01E1000_PHY_PAGE_SELECT, + (u16)offset); + if (ret_val) + goto release; + } + + ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, + data); + +release: + if (!locked) + hw->phy.ops.release(hw); out: return ret_val; @@ -461,64 +636,55 @@ out: * @offset: register offset to write to * @data: data to write at register offset * - * Acquires semaphore, if necessary, then writes the data to PHY register + * Acquires semaphore then writes the data to PHY register * at the offset. Release any acquired semaphores before exiting. **/ s32 e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data) { - s32 ret_val = E1000_SUCCESS; - - DEBUGFUNC("e1000_write_phy_reg_igp"); - - if (!(hw->phy.ops.acquire)) - goto out; - - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; - - if (offset > MAX_PHY_MULTI_PAGE_REG) { - ret_val = e1000_write_phy_reg_mdic(hw, - IGP01E1000_PHY_PAGE_SELECT, - (u16)offset); - if (ret_val) { - hw->phy.ops.release(hw); - goto out; - } - } - - ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, - data); - - hw->phy.ops.release(hw); - -out: - return ret_val; + return __e1000_write_phy_reg_igp(hw, offset, data, FALSE); } /** - * e1000_read_kmrn_reg_generic - Read kumeran register + * e1000_write_phy_reg_igp_locked - Write igp PHY register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * + * Writes the data to PHY register at the offset. + * Assumes semaphore already acquired. + **/ +s32 e1000_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 data) +{ + return __e1000_write_phy_reg_igp(hw, offset, data, TRUE); +} + +/** + * __e1000_read_kmrn_reg - Read kumeran register * @hw: pointer to the HW structure * @offset: register offset to be read * @data: pointer to the read data + * @locked: semaphore has already been acquired or not * * Acquires semaphore, if necessary. Then reads the PHY register at offset * using the kumeran interface. The information retrieved is stored in data. * Release any acquired semaphores before exiting. **/ -s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data) +static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data, + bool locked) { u32 kmrnctrlsta; s32 ret_val = E1000_SUCCESS; - DEBUGFUNC("e1000_read_kmrn_reg_generic"); + DEBUGFUNC("__e1000_read_kmrn_reg"); - if (!(hw->phy.ops.acquire)) - goto out; + if (!locked) { + if (!(hw->phy.ops.acquire)) + goto out; - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + } kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; @@ -529,47 +695,112 @@ s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data) kmrnctrlsta = E1000_READ_REG(hw, E1000_KMRNCTRLSTA); *data = (u16)kmrnctrlsta; - hw->phy.ops.release(hw); + if (!locked) + hw->phy.ops.release(hw); out: return ret_val; } /** - * e1000_write_kmrn_reg_generic - Write kumeran register + * e1000_read_kmrn_reg_generic - Read kumeran register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * + * Acquires semaphore then reads the PHY register at offset using the + * kumeran interface. The information retrieved is stored in data. + * Release the acquired semaphore before exiting. + **/ +s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data) +{ + return __e1000_read_kmrn_reg(hw, offset, data, FALSE); +} + +/** + * e1000_read_kmrn_reg_locked - Read kumeran register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * + * Reads the PHY register at offset using the kumeran interface. The + * information retrieved is stored in data. + * Assumes semaphore already acquired. + **/ +s32 e1000_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data) +{ + return __e1000_read_kmrn_reg(hw, offset, data, TRUE); +} + +/** + * __e1000_write_kmrn_reg - Write kumeran register * @hw: pointer to the HW structure * @offset: register offset to write to * @data: data to write at register offset + * @locked: semaphore has already been acquired or not * * Acquires semaphore, if necessary. Then write the data to PHY register * at the offset using the kumeran interface. Release any acquired semaphores * before exiting. **/ -s32 e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data) +static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data, + bool locked) { u32 kmrnctrlsta; s32 ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_write_kmrn_reg_generic"); - if (!(hw->phy.ops.acquire)) - goto out; + if (!locked) { + if (!(hw->phy.ops.acquire)) + goto out; - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + goto out; + } kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & E1000_KMRNCTRLSTA_OFFSET) | data; E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA, kmrnctrlsta); usec_delay(2); - hw->phy.ops.release(hw); + + if (!locked) + hw->phy.ops.release(hw); out: return ret_val; } +/** + * e1000_write_kmrn_reg_generic - Write kumeran register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * + * Acquires semaphore then writes the data to the PHY register at the offset + * using the kumeran interface. Release the acquired semaphore before exiting. + **/ +s32 e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data) +{ + return __e1000_write_kmrn_reg(hw, offset, data, FALSE); +} + +/** + * e1000_write_kmrn_reg_locked - Write kumeran register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * + * Write the data to PHY register at the offset using the kumeran interface. + * Assumes semaphore already acquired. + **/ +s32 e1000_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data) +{ + return __e1000_write_kmrn_reg(hw, offset, data, TRUE); +} + /** * e1000_copper_link_setup_82577 - Setup 82577 PHY for copper link * @hw: pointer to the HW structure @@ -578,19 +809,26 @@ out: **/ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw) { - struct e1000_phy_info *phy = &hw->phy; s32 ret_val; u16 phy_data; DEBUGFUNC("e1000_copper_link_setup_82577"); - if (phy->reset_disable) { + if (hw->phy.reset_disable) { ret_val = E1000_SUCCESS; goto out; } + if (hw->phy.type == e1000_phy_82580) { + ret_val = hw->phy.ops.reset(hw); + if (ret_val) { + DEBUGOUT("Error resetting the PHY.\n"); + goto out; + } + } + /* Enable CRS on TX. This must be set for half-duplex operation. */ - ret_val = phy->ops.read_reg(hw, I82577_CFG_REG, &phy_data); + ret_val = hw->phy.ops.read_reg(hw, I82577_CFG_REG, &phy_data); if (ret_val) goto out; @@ -599,16 +837,7 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw) /* Enable downshift */ phy_data |= I82577_CFG_ENABLE_DOWNSHIFT; - ret_val = phy->ops.write_reg(hw, I82577_CFG_REG, phy_data); - if (ret_val) - goto out; - - /* Set number of link attempts before downshift */ - ret_val = phy->ops.read_reg(hw, I82577_CTRL_REG, &phy_data); - if (ret_val) - goto out; - phy_data &= ~I82577_CTRL_DOWNSHIFT_MASK; - ret_val = phy->ops.write_reg(hw, I82577_CTRL_REG, phy_data); + ret_val = hw->phy.ops.write_reg(hw, I82577_CFG_REG, phy_data); out: return ret_val; @@ -634,7 +863,7 @@ s32 e1000_copper_link_setup_m88(struct e1000_hw *hw) goto out; } - /* Enable CRS on TX. This must be set for half-duplex operation. */ + /* Enable CRS on Tx. This must be set for half-duplex operation. */ ret_val = phy->ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data); if (ret_val) goto out; @@ -1326,18 +1555,22 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) goto out; if (!link) { - /* - * We didn't get link. - * Reset the DSP and cross our fingers. - */ - ret_val = phy->ops.write_reg(hw, - M88E1000_PHY_PAGE_SELECT, - 0x001d); - if (ret_val) - goto out; - ret_val = e1000_phy_reset_dsp_generic(hw); - if (ret_val) - goto out; + if (hw->phy.type != e1000_phy_m88) { + DEBUGOUT("Link taking longer than expected.\n"); + } else { + /* + * We didn't get link. + * Reset the DSP and cross our fingers. + */ + ret_val = phy->ops.write_reg(hw, + M88E1000_PHY_PAGE_SELECT, + 0x001d); + if (ret_val) + goto out; + ret_val = e1000_phy_reset_dsp_generic(hw); + if (ret_val) + goto out; + } } /* Try once more */ @@ -1347,6 +1580,9 @@ s32 e1000_phy_force_speed_duplex_m88(struct e1000_hw *hw) goto out; } + if (hw->phy.type != e1000_phy_m88) + goto out; + ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); if (ret_val) goto out; @@ -1393,11 +1629,6 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw) DEBUGFUNC("e1000_phy_force_speed_duplex_ife"); - if (phy->type != e1000_phy_ife) { - ret_val = e1000_phy_force_speed_duplex_igp(hw); - goto out; - } - ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &data); if (ret_val) goto out; @@ -1625,12 +1856,11 @@ s32 e1000_check_downshift_generic(struct e1000_hw *hw) case e1000_phy_gg82563: case e1000_phy_bm: case e1000_phy_82578: - case e1000_phy_82577: offset = M88E1000_PHY_SPEC_STATUS; mask = M88E1000_PSSR_DOWNSHIFT; break; - case e1000_phy_igp_2: case e1000_phy_igp: + case e1000_phy_igp_2: case e1000_phy_igp_3: offset = IGP01E1000_PHY_LINK_HEALTH; mask = IGP01E1000_PLHR_SS_DOWNGRADE; @@ -1825,16 +2055,14 @@ s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, * it across the board. */ ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); - if (ret_val) { + if (ret_val) /* * If the first read fails, another entity may have * ownership of the resources, wait and try again to * see if they have relinquished the resources yet. */ usec_delay(usec_interval); - ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, - &phy_status); - } + ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); if (ret_val) break; if (phy_status & MII_SR_LINK_STATUS) @@ -1879,13 +2107,13 @@ s32 e1000_get_cable_length_m88(struct e1000_hw *hw) index = (phy_data & M88E1000_PSSR_CABLE_LENGTH) >> M88E1000_PSSR_CABLE_LENGTH_SHIFT; - if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE + 1) { - ret_val = E1000_ERR_PHY; + if (index >= M88E1000_CABLE_LENGTH_TABLE_SIZE - 1) { + ret_val = -E1000_ERR_PHY; goto out; } phy->min_cable_length = e1000_m88_cable_length_table[index]; - phy->max_cable_length = e1000_m88_cable_length_table[index+1]; + phy->max_cable_length = e1000_m88_cable_length_table[index + 1]; phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2; @@ -1986,7 +2214,7 @@ s32 e1000_get_phy_info_m88(struct e1000_hw *hw) DEBUGFUNC("e1000_get_phy_info_m88"); - if (hw->phy.media_type != e1000_media_type_copper) { + if (phy->media_type != e1000_media_type_copper) { DEBUGOUT("Phy info is only valid for copper media\n"); ret_val = -E1000_ERR_CONFIG; goto out; @@ -2088,7 +2316,7 @@ s32 e1000_get_phy_info_igp(struct e1000_hw *hw) if ((data & IGP01E1000_PSSR_SPEED_MASK) == IGP01E1000_PSSR_SPEED_1000MBPS) { - ret_val = hw->phy.ops.get_cable_length(hw); + ret_val = phy->ops.get_cable_length(hw); if (ret_val) goto out; @@ -2113,6 +2341,63 @@ out: return ret_val; } +/** + * e1000_get_phy_info_ife - Retrieves various IFE PHY states + * @hw: pointer to the HW structure + * + * Populates "phy" structure with various feature states. + **/ +s32 e1000_get_phy_info_ife(struct e1000_hw *hw) +{ + struct e1000_phy_info *phy = &hw->phy; + s32 ret_val; + u16 data; + bool link; + + DEBUGFUNC("e1000_get_phy_info_ife"); + + ret_val = e1000_phy_has_link_generic(hw, 1, 0, &link); + if (ret_val) + goto out; + + if (!link) { + DEBUGOUT("Phy info is only valid if link is up\n"); + ret_val = -E1000_ERR_CONFIG; + goto out; + } + + ret_val = phy->ops.read_reg(hw, IFE_PHY_SPECIAL_CONTROL, &data); + if (ret_val) + goto out; + phy->polarity_correction = (data & IFE_PSC_AUTO_POLARITY_DISABLE) + ? FALSE : TRUE; + + if (phy->polarity_correction) { + ret_val = e1000_check_polarity_ife(hw); + if (ret_val) + goto out; + } else { + /* Polarity is forced */ + phy->cable_polarity = (data & IFE_PSC_FORCE_POLARITY) + ? e1000_rev_polarity_reversed + : e1000_rev_polarity_normal; + } + + ret_val = phy->ops.read_reg(hw, IFE_PHY_MDIX_CONTROL, &data); + if (ret_val) + goto out; + + phy->is_mdix = (data & IFE_PMC_MDIX_STATUS) ? TRUE : FALSE; + + /* The following parameters are undefined for 10/100 operation. */ + phy->cable_length = E1000_CABLE_LENGTH_UNDEFINED; + phy->local_rx = e1000_1000t_rx_status_undefined; + phy->remote_rx = e1000_1000t_rx_status_undefined; + +out: + return ret_val; +} + /** * e1000_phy_sw_reset_generic - PHY software reset * @hw: pointer to the HW structure @@ -2302,7 +2587,7 @@ enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id) { enum e1000_phy_type phy_type = e1000_phy_unknown; - switch (phy_id) { + switch (phy_id) { case M88E1000_I_PHY_ID: case M88E1000_E_PHY_ID: case M88E1111_I_PHY_ID: @@ -2333,6 +2618,9 @@ enum e1000_phy_type e1000_get_phy_type_from_id(u32 phy_id) case I82577_E_PHY_ID: phy_type = e1000_phy_82577; break; + case I82580_I_PHY_ID: + phy_type = e1000_phy_82580; + break; default: phy_type = e1000_phy_unknown; break; @@ -2416,6 +2704,10 @@ s32 e1000_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) DEBUGFUNC("e1000_write_phy_reg_bm"); + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + /* Page 800 works differently than the rest so it has its own func */ if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, @@ -2423,10 +2715,6 @@ s32 e1000_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) goto out; } - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; - hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); if (offset > MAX_PHY_MULTI_PAGE_REG) { @@ -2446,18 +2734,15 @@ s32 e1000_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) /* Page is shifted left, PHY expects (page x 32) */ ret_val = e1000_write_phy_reg_mdic(hw, page_select, (page << page_shift)); - if (ret_val) { - hw->phy.ops.release(hw); + if (ret_val) goto out; - } } ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); - hw->phy.ops.release(hw); - out: + hw->phy.ops.release(hw); return ret_val; } @@ -2480,6 +2765,10 @@ s32 e1000_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) DEBUGFUNC("e1000_read_phy_reg_bm"); + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + /* Page 800 works differently than the rest so it has its own func */ if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, @@ -2487,10 +2776,6 @@ s32 e1000_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) goto out; } - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; - hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); if (offset > MAX_PHY_MULTI_PAGE_REG) { @@ -2510,17 +2795,14 @@ s32 e1000_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) /* Page is shifted left, PHY expects (page x 32) */ ret_val = e1000_write_phy_reg_mdic(hw, page_select, (page << page_shift)); - if (ret_val) { - hw->phy.ops.release(hw); + if (ret_val) goto out; - } } ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); - hw->phy.ops.release(hw); - out: + hw->phy.ops.release(hw); return ret_val; } @@ -2541,6 +2823,10 @@ s32 e1000_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) DEBUGFUNC("e1000_write_phy_reg_bm2"); + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + /* Page 800 works differently than the rest so it has its own func */ if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, @@ -2548,10 +2834,6 @@ s32 e1000_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) goto out; } - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; - hw->phy.addr = 1; if (offset > MAX_PHY_MULTI_PAGE_REG) { @@ -2560,17 +2842,14 @@ s32 e1000_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) ret_val = e1000_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, page); - if (ret_val) { - hw->phy.ops.release(hw); + if (ret_val) goto out; - } } ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); - hw->phy.ops.release(hw); - out: + hw->phy.ops.release(hw); return ret_val; } @@ -2590,6 +2869,10 @@ s32 e1000_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) DEBUGFUNC("e1000_write_phy_reg_bm2"); + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; + /* Page 800 works differently than the rest so it has its own func */ if (page == BM_WUC_PAGE) { ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, @@ -2597,10 +2880,6 @@ s32 e1000_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) goto out; } - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; - hw->phy.addr = 1; if (offset > MAX_PHY_MULTI_PAGE_REG) { @@ -2608,18 +2887,15 @@ s32 e1000_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) ret_val = e1000_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, page); - if (ret_val) { - hw->phy.ops.release(hw); + if (ret_val) goto out; - } } ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, data); - hw->phy.ops.release(hw); - out: + hw->phy.ops.release(hw); return ret_val; } @@ -2639,6 +2915,8 @@ out: * 3) Write the address using the address opcode (0x11) * 4) Read or write the data using the data opcode (0x12) * 5) Restore 769_17.2 to its original value + * + * Assumes semaphore already acquired. **/ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data, bool read) @@ -2646,7 +2924,6 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, s32 ret_val; u16 reg = BM_PHY_REG_NUM(offset); u16 phy_reg = 0; - u8 phy_acquired = 1; DEBUGFUNC("e1000_access_phy_wakeup_reg_bm"); @@ -2655,13 +2932,6 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, (!(E1000_READ_REG(hw, E1000_PHY_CTRL) & E1000_PHY_CTRL_GBE_DISABLE))) DEBUGOUT("Attempting to access page 800 while gig enabled.\n"); - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) { - DEBUGOUT("Could not acquire PHY\n"); - phy_acquired = 0; - goto out; - } - /* All operations in this function are phy address 1 */ hw->phy.addr = 1; @@ -2733,8 +3003,6 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, } out: - if (phy_acquired == 1) - hw->phy.ops.release(hw); return ret_val; } @@ -2775,31 +3043,70 @@ void e1000_power_down_phy_copper(struct e1000_hw *hw) msec_delay(1); } -s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow) +/** + * __e1000_read_phy_reg_hv - Read HV PHY register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * @locked: semaphore has already been acquired or not + * + * Acquires semaphore, if necessary, then reads the PHY register at offset + * and stores the retrieved information in data. Release any acquired + * semaphore before exiting. + **/ +static s32 __e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data, + bool locked) { - s32 ret_val = E1000_SUCCESS; - u16 data = 0; + s32 ret_val; + u16 page = BM_PHY_REG_PAGE(offset); + u16 reg = BM_PHY_REG_NUM(offset); - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - return ret_val; + DEBUGFUNC("__e1000_read_phy_reg_hv"); - /* Set MDIO mode - page 769, register 16: 0x2580==slow, 0x2180==fast */ - hw->phy.addr = 1; - ret_val = e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, - (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT)); - if (ret_val) { - hw->phy.ops.release(hw); - return ret_val; + if (!locked) { + ret_val = hw->phy.ops.acquire(hw); + if (ret_val) + return ret_val; } - ret_val = e1000_write_phy_reg_mdic(hw, BM_CS_CTRL1, - (0x2180 | (slow << 10))); - /* dummy read when reverting to fast mode - throw away result */ - if (!slow) - e1000_read_phy_reg_mdic(hw, BM_CS_CTRL1, &data); + /* Page 800 works differently than the rest so it has its own func */ + if (page == BM_WUC_PAGE) { + ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, + data, TRUE); + goto out; + } - hw->phy.ops.release(hw); + if (page > 0 && page < HV_INTC_FC_PAGE_START) { + ret_val = e1000_access_phy_debug_regs_hv(hw, offset, + data, TRUE); + goto out; + } + + hw->phy.addr = e1000_get_phy_addr_for_hv_page(page); + + if (page == HV_INTC_FC_PAGE_START) + page = 0; + + if (reg > MAX_PHY_MULTI_PAGE_REG) { + u32 phy_addr = hw->phy.addr; + + hw->phy.addr = 1; + + /* Page is shifted left, PHY expects (page x 32) */ + ret_val = e1000_write_phy_reg_mdic(hw, + IGP01E1000_PHY_PAGE_SELECT, + (page << IGP_PAGE_SHIFT)); + hw->phy.addr = phy_addr; + + if (ret_val) + goto out; + } + + ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, + data); +out: + if (!locked) + hw->phy.ops.release(hw); return ret_val; } @@ -2810,109 +3117,52 @@ s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow) * @offset: register offset to be read * @data: pointer to the read data * - * Acquires semaphore, if necessary, then reads the PHY register at offset - * and storing the retrieved information in data. Release any acquired - * semaphore before exiting. + * Acquires semaphore then reads the PHY register at offset and stores + * the retrieved information in data. Release the acquired semaphore + * before exiting. **/ s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data) { - s32 ret_val; - u16 page = BM_PHY_REG_PAGE(offset); - u16 reg = BM_PHY_REG_NUM(offset); - bool in_slow_mode = FALSE; - - DEBUGFUNC("e1000_read_phy_reg_hv"); - - /* Workaround failure in MDIO access while cable is disconnected */ - if ((hw->phy.type == e1000_phy_82577) && - !(E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU)) { - ret_val = e1000_set_mdio_slow_mode_hv(hw, TRUE); - if (ret_val) - goto out; - - in_slow_mode = TRUE; - } - - /* Page 800 works differently than the rest so it has its own func */ - if (page == BM_WUC_PAGE) { - ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, - data, TRUE); - goto out; - } - - if (page > 0 && page < HV_INTC_FC_PAGE_START) { - ret_val = e1000_access_phy_debug_regs_hv(hw, offset, - data, TRUE); - goto out; - } - - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; - - hw->phy.addr = e1000_get_phy_addr_for_hv_page(page); - - if (page == HV_INTC_FC_PAGE_START) - page = 0; - - if (reg > MAX_PHY_MULTI_PAGE_REG) { - if ((hw->phy.type != e1000_phy_82578) || - ((reg != I82578_ADDR_REG) && - (reg != I82578_ADDR_REG + 1))) { - u32 phy_addr = hw->phy.addr; - - hw->phy.addr = 1; - - /* Page is shifted left, PHY expects (page x 32) */ - ret_val = e1000_write_phy_reg_mdic(hw, - IGP01E1000_PHY_PAGE_SELECT, - (page << IGP_PAGE_SHIFT)); - if (ret_val) { - hw->phy.ops.release(hw); - goto out; - } - hw->phy.addr = phy_addr; - } - } - - ret_val = e1000_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, - data); - hw->phy.ops.release(hw); - -out: - /* Revert to MDIO fast mode, if applicable */ - if ((hw->phy.type == e1000_phy_82577) && in_slow_mode) - ret_val = e1000_set_mdio_slow_mode_hv(hw, FALSE); - - return ret_val; + return __e1000_read_phy_reg_hv(hw, offset, data, FALSE); } /** - * e1000_write_phy_reg_hv - Write HV PHY register + * e1000_read_phy_reg_hv_locked - Read HV PHY register + * @hw: pointer to the HW structure + * @offset: register offset to be read + * @data: pointer to the read data + * + * Reads the PHY register at offset and stores the retrieved information + * in data. Assumes semaphore already acquired. + **/ +s32 e1000_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 *data) +{ + return __e1000_read_phy_reg_hv(hw, offset, data, TRUE); +} + +/** + * __e1000_write_phy_reg_hv - Write HV PHY register * @hw: pointer to the HW structure * @offset: register offset to write to * @data: data to write at register offset + * @locked: semaphore has already been acquired or not * * Acquires semaphore, if necessary, then writes the data to PHY register * at the offset. Release any acquired semaphores before exiting. **/ -s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) +static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data, + bool locked) { s32 ret_val; u16 page = BM_PHY_REG_PAGE(offset); u16 reg = BM_PHY_REG_NUM(offset); - bool in_slow_mode = FALSE; - DEBUGFUNC("e1000_write_phy_reg_hv"); + DEBUGFUNC("__e1000_write_phy_reg_hv"); - /* Workaround failure in MDIO access while cable is disconnected */ - if ((hw->phy.type == e1000_phy_82577) && - !(E1000_READ_REG(hw, E1000_STATUS) & E1000_STATUS_LU)) { - ret_val = e1000_set_mdio_slow_mode_hv(hw, TRUE); + if (!locked) { + ret_val = hw->phy.ops.acquire(hw); if (ret_val) - goto out; - - in_slow_mode = TRUE; + return ret_val; } /* Page 800 works differently than the rest so it has its own func */ @@ -2928,10 +3178,6 @@ s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) goto out; } - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; - hw->phy.addr = e1000_get_phy_addr_for_hv_page(page); if (page == HV_INTC_FC_PAGE_START) @@ -2947,49 +3193,65 @@ s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) ((MAX_PHY_REG_ADDRESS & reg) == 0) && (data & (1 << 11))) { u16 data2 = 0x7EFF; - hw->phy.ops.release(hw); ret_val = e1000_access_phy_debug_regs_hv(hw, (1 << 6) | 0x3, &data2, FALSE); if (ret_val) goto out; - - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) - goto out; } if (reg > MAX_PHY_MULTI_PAGE_REG) { - if ((hw->phy.type != e1000_phy_82578) || - ((reg != I82578_ADDR_REG) && - (reg != I82578_ADDR_REG + 1))) { - u32 phy_addr = hw->phy.addr; + u32 phy_addr = hw->phy.addr; - hw->phy.addr = 1; + hw->phy.addr = 1; - /* Page is shifted left, PHY expects (page x 32) */ - ret_val = e1000_write_phy_reg_mdic(hw, - IGP01E1000_PHY_PAGE_SELECT, - (page << IGP_PAGE_SHIFT)); - if (ret_val) { - hw->phy.ops.release(hw); - goto out; - } - hw->phy.addr = phy_addr; - } + /* Page is shifted left, PHY expects (page x 32) */ + ret_val = e1000_write_phy_reg_mdic(hw, + IGP01E1000_PHY_PAGE_SELECT, + (page << IGP_PAGE_SHIFT)); + hw->phy.addr = phy_addr; + + if (ret_val) + goto out; } ret_val = e1000_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, data); - hw->phy.ops.release(hw); out: - /* Revert to MDIO fast mode, if applicable */ - if ((hw->phy.type == e1000_phy_82577) && in_slow_mode) - ret_val = e1000_set_mdio_slow_mode_hv(hw, FALSE); + if (!locked) + hw->phy.ops.release(hw); return ret_val; } +/** + * e1000_write_phy_reg_hv - Write HV PHY register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * + * Acquires semaphore then writes the data to PHY register at the offset. + * Release the acquired semaphores before exiting. + **/ +s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) +{ + return __e1000_write_phy_reg_hv(hw, offset, data, FALSE); +} + +/** + * e1000_write_phy_reg_hv_locked - Write HV PHY register + * @hw: pointer to the HW structure + * @offset: register offset to write to + * @data: data to write at register offset + * + * Writes the data to PHY register at the offset. Assumes semaphore + * already acquired. + **/ +s32 e1000_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 data) +{ + return __e1000_write_phy_reg_hv(hw, offset, data, TRUE); +} + /** * e1000_get_phy_addr_for_hv_page - Get PHY adrress based on page * @page: page to be accessed @@ -3011,10 +3273,9 @@ static u32 e1000_get_phy_addr_for_hv_page(u32 page) * @data: pointer to the data to be read or written * @read: determines if operation is read or written * - * Acquires semaphore, if necessary, then reads the PHY register at offset - * and storing the retreived information in data. Release any acquired - * semaphores before exiting. Note that the procedure to read these regs - * uses the address port and data port to read/write. + * Reads the PHY register at offset and stores the retreived information + * in data. Assumes semaphore already acquired. Note that the procedure + * to read these regs uses the address port and data port to read/write. **/ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, u16 *data, bool read) @@ -3022,7 +3283,6 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, s32 ret_val; u32 addr_reg = 0; u32 data_reg = 0; - u8 phy_acquired = 1; DEBUGFUNC("e1000_access_phy_debug_regs_hv"); @@ -3031,13 +3291,6 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, I82578_ADDR_REG : I82577_ADDR_REG; data_reg = addr_reg + 1; - ret_val = hw->phy.ops.acquire(hw); - if (ret_val) { - DEBUGOUT("Could not acquire PHY\n"); - phy_acquired = 0; - goto out; - } - /* All operations in this function are phy address 2 */ hw->phy.addr = 2; @@ -3060,8 +3313,6 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, } out: - if (phy_acquired == 1) - hw->phy.ops.release(hw); return ret_val; } @@ -3090,7 +3341,7 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw) hw->phy.ops.read_reg(hw, PHY_CONTROL, &data); if (data & PHY_CONTROL_LB) goto out; - + /* check if link is up and at 1Gbps */ ret_val = hw->phy.ops.read_reg(hw, BM_CS_STATUS, &data); if (ret_val) @@ -3309,7 +3560,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw) I82577_DSTATUS_CABLE_LENGTH_SHIFT; if (length == E1000_CABLE_LENGTH_UNDEFINED) - ret_val = E1000_ERR_PHY; + ret_val = -E1000_ERR_PHY; phy->cable_length = length; diff --git a/sys/dev/e1000/e1000_phy.h b/sys/dev/e1000/e1000_phy.h index 28ed0c15852f..692cbaa91eb9 100644 --- a/sys/dev/e1000/e1000_phy.h +++ b/sys/dev/e1000/e1000_phy.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -45,6 +45,7 @@ s32 e1000_check_polarity_m88(struct e1000_hw *hw); s32 e1000_check_polarity_igp(struct e1000_hw *hw); s32 e1000_check_polarity_ife(struct e1000_hw *hw); s32 e1000_check_reset_block_generic(struct e1000_hw *hw); +s32 e1000_phy_setup_autoneg(struct e1000_hw *hw); s32 e1000_copper_link_autoneg(struct e1000_hw *hw); s32 e1000_copper_link_setup_igp(struct e1000_hw *hw); s32 e1000_copper_link_setup_m88(struct e1000_hw *hw); @@ -57,19 +58,23 @@ s32 e1000_get_cfg_done_generic(struct e1000_hw *hw); s32 e1000_get_phy_id(struct e1000_hw *hw); s32 e1000_get_phy_info_igp(struct e1000_hw *hw); s32 e1000_get_phy_info_m88(struct e1000_hw *hw); +s32 e1000_get_phy_info_ife(struct e1000_hw *hw); s32 e1000_phy_sw_reset_generic(struct e1000_hw *hw); void e1000_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); s32 e1000_phy_hw_reset_generic(struct e1000_hw *hw); s32 e1000_phy_reset_dsp_generic(struct e1000_hw *hw); -s32 e1000_phy_setup_autoneg(struct e1000_hw *hw); s32 e1000_read_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 *data); +s32 e1000_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data); s32 e1000_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); +s32 e1000_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 *data); s32 e1000_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); s32 e1000_set_d3_lplu_state_generic(struct e1000_hw *hw, bool active); s32 e1000_setup_copper_link_generic(struct e1000_hw *hw); s32 e1000_wait_autoneg_generic(struct e1000_hw *hw); s32 e1000_write_kmrn_reg_generic(struct e1000_hw *hw, u32 offset, u16 data); +s32 e1000_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data); s32 e1000_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); +s32 e1000_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 data); s32 e1000_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); s32 e1000_phy_reset_dsp(struct e1000_hw *hw); s32 e1000_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, @@ -85,9 +90,12 @@ void e1000_power_up_phy_copper(struct e1000_hw *hw); void e1000_power_down_phy_copper(struct e1000_hw *hw); s32 e1000_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data); s32 e1000_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data); +s32 e1000_read_phy_reg_i2c(struct e1000_hw *hw, u32 offset, u16 *data); +s32 e1000_write_phy_reg_i2c(struct e1000_hw *hw, u32 offset, u16 data); s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data); +s32 e1000_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 *data); s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data); -s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow); +s32 e1000_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 data); s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw); s32 e1000_copper_link_setup_82577(struct e1000_hw *hw); s32 e1000_check_polarity_82577(struct e1000_hw *hw); @@ -140,7 +148,6 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw); #define I82577_CFG_ASSERT_CRS_ON_TX (1 << 15) #define I82577_CFG_ENABLE_DOWNSHIFT (3 << 10) /* auto downshift 100/10 */ #define I82577_CTRL_REG 23 -#define I82577_CTRL_DOWNSHIFT_MASK (7 << 10) /* 82577 specific PHY registers */ #define I82577_PHY_CTRL_2 18 @@ -175,6 +182,13 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw); #define BM_CS_STATUS_SPEED_MASK 0xC000 #define BM_CS_STATUS_SPEED_1000 0x8000 +/* 82577 Mobile Phy Status Register */ +#define HV_M_STATUS 26 +#define HV_M_STATUS_AUTONEG_COMPLETE 0x1000 +#define HV_M_STATUS_SPEED_MASK 0x0300 +#define HV_M_STATUS_SPEED_1000 0x0200 +#define HV_M_STATUS_LINK_UP 0x0040 + #define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 #define IGP01E1000_PHY_POLARITY_MASK 0x0078 @@ -220,6 +234,8 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw); #define E1000_KMRNCTRLSTA_TIMEOUTS 0x4 /* Kumeran Timeouts */ #define E1000_KMRNCTRLSTA_INBAND_PARAM 0x9 /* Kumeran InBand Parameters */ #define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ +#define E1000_KMRNCTRLSTA_K1_CONFIG 0x7 +#define E1000_KMRNCTRLSTA_K1_ENABLE 0x0002 #define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 #define IFE_PHY_SPECIAL_CONTROL 0x11 /* 100BaseTx PHY Special Control */ diff --git a/sys/dev/e1000/e1000_regs.h b/sys/dev/e1000/e1000_regs.h index 3a62d0a61a3a..56418a6b493e 100644 --- a/sys/dev/e1000/e1000_regs.h +++ b/sys/dev/e1000/e1000_regs.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -43,6 +43,12 @@ #define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ #define E1000_FLA 0x0001C /* Flash Access - RW */ #define E1000_MDIC 0x00020 /* MDI Control - RW */ +#define E1000_MDICNFG 0x00E04 /* MDI Config - RW */ +#define E1000_REGISTER_SET_SIZE 0x20000 /* CSR Size */ +#define E1000_EEPROM_INIT_CTRL_WORD_2 0x0F /* EEPROM Init Ctrl Word 2 */ +#define E1000_BARCTRL 0x5BBC /* BAR ctrl reg */ +#define E1000_BARCTRL_FLSIZE 0x0700 /* BAR ctrl Flsize */ +#define E1000_BARCTRL_CSRSIZE 0x2000 /* BAR ctrl CSR size */ #define E1000_SCTL 0x00024 /* SerDes Control - RW */ #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ #define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ @@ -121,11 +127,7 @@ #define E1000_RDPUCTL 0x025DC /* DMA Rx Descriptor uC Control - RW */ #define E1000_PBDIAG 0x02458 /* Packet Buffer Diagnostic - RW */ #define E1000_RXPBS 0x02404 /* Rx Packet Buffer Size - RW */ -#define E1000_RXCTL(_n) (0x0C014 + (0x40 * (_n))) -#define E1000_RQDPC(_n) (0x0C030 + (0x40 * (_n))) -#define E1000_TXCTL(_n) (0x0E014 + (0x40 * (_n))) -#define E1000_RXCTL(_n) (0x0C014 + (0x40 * (_n))) -#define E1000_RQDPC(_n) (0x0C030 + (0x40 * (_n))) +#define E1000_IRPBS 0x02404 /* Same as RXPBS, renamed for newer adapters - RW */ #define E1000_RDTR 0x02820 /* Rx Delay Timer - RW */ #define E1000_RADV 0x0282C /* Rx Interrupt Absolute Delay Timer - RW */ /* @@ -146,10 +148,15 @@ (0x0C00C + ((_n) * 0x40))) #define E1000_RDH(_n) ((_n) < 4 ? (0x02810 + ((_n) * 0x100)) : \ (0x0C010 + ((_n) * 0x40))) +#define E1000_RXCTL(_n) ((_n) < 4 ? (0x02814 + ((_n) * 0x100)) : \ + (0x0C014 + ((_n) * 0x40))) +#define E1000_DCA_RXCTRL(_n) E1000_RXCTL(_n) #define E1000_RDT(_n) ((_n) < 4 ? (0x02818 + ((_n) * 0x100)) : \ (0x0C018 + ((_n) * 0x40))) #define E1000_RXDCTL(_n) ((_n) < 4 ? (0x02828 + ((_n) * 0x100)) : \ (0x0C028 + ((_n) * 0x40))) +#define E1000_RQDPC(_n) ((_n) < 4 ? (0x02830 + ((_n) * 0x100)) : \ + (0x0C030 + ((_n) * 0x40))) #define E1000_TDBAL(_n) ((_n) < 4 ? (0x03800 + ((_n) * 0x100)) : \ (0x0E000 + ((_n) * 0x40))) #define E1000_TDBAH(_n) ((_n) < 4 ? (0x03804 + ((_n) * 0x100)) : \ @@ -158,17 +165,18 @@ (0x0E008 + ((_n) * 0x40))) #define E1000_TDH(_n) ((_n) < 4 ? (0x03810 + ((_n) * 0x100)) : \ (0x0E010 + ((_n) * 0x40))) +#define E1000_TXCTL(_n) ((_n) < 4 ? (0x03814 + ((_n) * 0x100)) : \ + (0x0E014 + ((_n) * 0x40))) +#define E1000_DCA_TXCTRL(_n) E1000_TXCTL(_n) #define E1000_TDT(_n) ((_n) < 4 ? (0x03818 + ((_n) * 0x100)) : \ (0x0E018 + ((_n) * 0x40))) #define E1000_TXDCTL(_n) ((_n) < 4 ? (0x03828 + ((_n) * 0x100)) : \ (0x0E028 + ((_n) * 0x40))) -#define E1000_TARC(_n) (0x03840 + (_n << 8)) -#define E1000_DCA_TXCTRL(_n) (0x03814 + (_n << 8)) -#define E1000_DCA_RXCTRL(_n) (0x02814 + (_n << 8)) #define E1000_TDWBAL(_n) ((_n) < 4 ? (0x03838 + ((_n) * 0x100)) : \ (0x0E038 + ((_n) * 0x40))) #define E1000_TDWBAH(_n) ((_n) < 4 ? (0x0383C + ((_n) * 0x100)) : \ (0x0E03C + ((_n) * 0x40))) +#define E1000_TARC(_n) (0x03840 + ((_n) * 0x100)) #define E1000_RSRPD 0x02C00 /* Rx Small Packet Detect - RW */ #define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */ #define E1000_TXDMAC 0x03000 /* Tx DMA Control - RW */ @@ -187,6 +195,7 @@ #define E1000_PBSLAC 0x03100 /* Packet Buffer Slave Access Control */ #define E1000_PBSLAD(_n) (0x03110 + (0x4 * (_n))) /* Packet Buffer DWORD (_n) */ #define E1000_TXPBS 0x03404 /* Tx Packet Buffer Size - RW */ +#define E1000_ITPBS 0x03404 /* Same as TXPBS, renamed for newer adpaters - RW */ #define E1000_TDFH 0x03410 /* Tx Data FIFO Head - RW */ #define E1000_TDFT 0x03418 /* Tx Data FIFO Tail - RW */ #define E1000_TDFHS 0x03420 /* Tx Data FIFO Head Saved - RW */ @@ -271,6 +280,7 @@ #define E1000_ICTXQMTC 0x0411C /* Interrupt Cause Tx Queue Min Thresh Count */ #define E1000_ICRXDMTC 0x04120 /* Interrupt Cause Rx Desc Min Thresh Count */ #define E1000_ICRXOC 0x04124 /* Interrupt Cause Receiver Overrun Count */ +#define E1000_CRC_OFFSET 0x05F50 /* CRC Offset register */ #define E1000_LSECTXUT 0x04300 /* LinkSec Tx Untagged Packet Count - OutPktsUntagged */ #define E1000_LSECTXPKTE 0x04304 /* LinkSec Encrypted Tx Packets Count - OutPktsEncrypted */ @@ -392,6 +402,7 @@ #define E1000_SWSM2 0x05B58 /* Driver-only SW semaphore (not used by BOOT agents) */ #define E1000_DCA_ID 0x05B70 /* DCA Requester ID Information - RO */ #define E1000_DCA_CTRL 0x05B74 /* DCA Control - RW */ +#define E1000_UFUSE 0x05B78 /* UFUSE - RO */ #define E1000_FFLT_DBG 0x05F04 /* Debug Register */ #define E1000_HICR 0x08F00 /* Host Interface Control */ @@ -437,6 +448,7 @@ #define E1000_VMOLR(_n) (0x05AD0 + (4 * (_n))) #define E1000_VLVF(_n) (0x05D00 + (4 * (_n))) /* VLAN Virtual Machine * Filter - RW */ +#define E1000_VMVIR(_n) (0x03700 + (4 * (_n))) /* Time Sync */ #define E1000_TSYNCRXCTL 0x0B620 /* Rx Time Sync Control register - RW */ #define E1000_TSYNCTXCTL 0x0B614 /* Tx Time Sync Control register - RW */ @@ -450,6 +462,8 @@ #define E1000_SYSTIML 0x0B600 /* System time register Low - RO */ #define E1000_SYSTIMH 0x0B604 /* System time register High - RO */ #define E1000_TIMINCA 0x0B608 /* Increment attributes register - RW */ +#define E1000_TSAUXC 0x0B640 /* Timesync Auxiliary Control register */ +#define E1000_SYSTIMR 0x0B6F8 /* System time register Residue */ #define E1000_RXMTRL 0x0B634 /* Time sync Rx EtherType and Msg Type - RW */ #define E1000_RXUDP 0x0B638 /* Time Sync Rx UDP Port - RW */ @@ -493,4 +507,15 @@ #define E1000_RTTBCNACH 0x0B214 /* Tx BCN Control High */ #define E1000_RTTBCNACL 0x0B210 /* Tx BCN Control Low */ +/* DMA Coalescing registers */ +#define E1000_DMACR 0x02508 /* Control Register */ +#define E1000_DMCTXTH 0x03550 /* Transmit Threshold */ +#define E1000_DMCTLX 0x02514 /* Time to Lx Request */ +#define E1000_DMCRTRH 0x05DD0 /* Receive Packet Rate Threshold */ +#define E1000_DMCCNT 0x05DD4 /* Current RX Count */ +#define E1000_FCRTC 0x02170 /* Flow Control Rx high watermark */ +#define E1000_PCIEMISC 0x05BB8 /* PCIE misc config register */ + +/* PCIe Parity Status Register */ +#define E1000_PCIEERRSTS 0x05BA8 #endif diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index 7a2dbad33de3..b45e4784014d 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -35,6 +35,7 @@ #ifdef HAVE_KERNEL_OPTION_HEADERS #include "opt_device_polling.h" #include "opt_inet.h" +#include "opt_altq.h" #endif #include @@ -94,7 +95,7 @@ int em_display_debug_stats = 0; /********************************************************************* * Driver version: *********************************************************************/ -char em_driver_version[] = "6.9.14"; +char em_driver_version[] = "6.9.25"; /********************************************************************* @@ -194,7 +195,7 @@ static em_vendor_info_t em_vendor_info_array[] = { 0x8086, E1000_DEV_ID_ICH8_IFE_GT, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_ICH8_IFE_G, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_ICH8_IGP_M, PCI_ANY_ID, PCI_ANY_ID, 0}, - + { 0x8086, E1000_DEV_ID_ICH8_82567V_3, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_ICH9_IGP_M_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_ICH9_IGP_AMT, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_ICH9_IGP_C, PCI_ANY_ID, PCI_ANY_ID, 0}, @@ -211,6 +212,10 @@ static em_vendor_info_t em_vendor_info_array[] = { 0x8086, E1000_DEV_ID_ICH10_R_BM_V, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_ICH10_D_BM_LM, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_ICH10_D_BM_LF, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_PCH_M_HV_LM, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_PCH_M_HV_LC, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_PCH_D_HV_DM, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_PCH_D_HV_DC, PCI_ANY_ID, PCI_ANY_ID, 0}, /* required last entry */ { 0, 0, 0, 0, 0} }; @@ -240,7 +245,6 @@ static int em_mq_start_locked(struct ifnet *, struct mbuf *); static void em_qflush(struct ifnet *); #endif static int em_ioctl(struct ifnet *, u_long, caddr_t); -static void em_watchdog(struct adapter *); static void em_init(void *); static void em_init_locked(struct adapter *); static void em_stop(void *); @@ -315,7 +319,9 @@ static void em_init_manageability(struct adapter *); static void em_release_manageability(struct adapter *); static void em_get_hw_control(struct adapter *); static void em_release_hw_control(struct adapter *); +static void em_get_wakeup(device_t); static void em_enable_wakeup(device_t); +static int em_enable_phy_wakeup(struct adapter *); #ifdef EM_LEGACY_IRQ static void em_intr(void *); @@ -490,7 +496,6 @@ em_attach(device_t dev) struct adapter *adapter; int tsize, rsize; int error = 0; - u16 eeprom_data, device_id; INIT_DEBUGOUT("em_attach: begin"); @@ -531,6 +536,7 @@ em_attach(device_t dev) ** identified */ if ((adapter->hw.mac.type == e1000_ich8lan) || + (adapter->hw.mac.type == e1000_pchlan) || (adapter->hw.mac.type == e1000_ich9lan) || (adapter->hw.mac.type == e1000_ich10lan)) { int rid = EM_BAR_TYPE_FLASH; @@ -728,6 +734,11 @@ em_attach(device_t dev) if (error) goto err_rx_struct; + /* + * Get Wake-on-Lan and Management info for later use + */ + em_get_wakeup(dev); + /* Setup OS specific network interface */ em_setup_interface(dev, adapter); @@ -742,69 +753,6 @@ em_attach(device_t dev) device_printf(dev, "PHY reset is blocked due to SOL/IDER session.\n"); - /* Determine if we have to control management hardware */ - adapter->has_manage = e1000_enable_mng_pass_thru(&adapter->hw); - - /* - * Setup Wake-on-Lan - */ - switch (adapter->hw.mac.type) { - - case e1000_82542: - case e1000_82543: - break; - case e1000_82546: - case e1000_82546_rev_3: - case e1000_82571: - case e1000_80003es2lan: - if (adapter->hw.bus.func == 1) - e1000_read_nvm(&adapter->hw, - NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); - else - e1000_read_nvm(&adapter->hw, - NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); - eeprom_data &= EM_EEPROM_APME; - break; - default: - /* APME bit in EEPROM is mapped to WUC.APME */ - eeprom_data = E1000_READ_REG(&adapter->hw, E1000_WUC) & - E1000_WUC_APME; - break; - } - if (eeprom_data) - adapter->wol = E1000_WUFC_MAG; - /* - * We have the eeprom settings, now apply the special cases - * where the eeprom may be wrong or the board won't support - * wake on lan on a particular port - */ - device_id = pci_get_device(dev); - switch (device_id) { - case E1000_DEV_ID_82546GB_PCIE: - adapter->wol = 0; - break; - case E1000_DEV_ID_82546EB_FIBER: - case E1000_DEV_ID_82546GB_FIBER: - case E1000_DEV_ID_82571EB_FIBER: - /* Wake events only supported on port A for dual fiber - * regardless of eeprom setting */ - if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & - E1000_STATUS_FUNC_1) - adapter->wol = 0; - break; - case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: - case E1000_DEV_ID_82571EB_QUAD_COPPER: - case E1000_DEV_ID_82571EB_QUAD_FIBER: - case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: - /* if quad port adapter, disable WoL on all but port A */ - if (global_quad_port_a != 0) - adapter->wol = 0; - /* Reset for multiple quad port adapters */ - if (++global_quad_port_a == 4) - global_quad_port_a = 0; - break; - } - /* Do we need workaround for 82544 PCI-X adapter? */ if (adapter->hw.bus.type == e1000_bus_type_pcix && adapter->hw.mac.type == e1000_82544) @@ -820,6 +768,10 @@ em_attach(device_t dev) em_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST); #endif + /* Non-AMT based hardware can now take control from firmware */ + if (adapter->has_manage && !adapter->has_amt) + em_get_hw_control(adapter); + /* Tell the stack that the interface is not active */ adapter->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); @@ -886,20 +838,6 @@ em_detach(device_t dev) em_release_manageability(adapter); - if (((adapter->hw.mac.type == e1000_82573) || - (adapter->hw.mac.type == e1000_82583) || - (adapter->hw.mac.type == e1000_ich8lan) || - (adapter->hw.mac.type == e1000_ich10lan) || - (adapter->hw.mac.type == e1000_ich9lan)) && - e1000_check_mng_mode(&adapter->hw)) - em_release_hw_control(adapter); - - if (adapter->wol) { - E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); - E1000_WRITE_REG(&adapter->hw, E1000_WUFC, adapter->wol); - em_enable_wakeup(dev); - } - EM_TX_UNLOCK(adapter); EM_CORE_UNLOCK(adapter); @@ -934,6 +872,7 @@ em_detach(device_t dev) adapter->rx_desc_base = NULL; } + em_release_hw_control(adapter); EM_TX_LOCK_DESTROY(adapter); EM_RX_LOCK_DESTROY(adapter); EM_CORE_LOCK_DESTROY(adapter); @@ -963,25 +902,9 @@ em_suspend(device_t dev) EM_CORE_LOCK(adapter); - EM_TX_LOCK(adapter); - em_stop(adapter); - EM_TX_UNLOCK(adapter); - em_release_manageability(adapter); - - if (((adapter->hw.mac.type == e1000_82573) || - (adapter->hw.mac.type == e1000_82583) || - (adapter->hw.mac.type == e1000_ich8lan) || - (adapter->hw.mac.type == e1000_ich10lan) || - (adapter->hw.mac.type == e1000_ich9lan)) && - e1000_check_mng_mode(&adapter->hw)) - em_release_hw_control(adapter); - - if (adapter->wol) { - E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); - E1000_WRITE_REG(&adapter->hw, E1000_WUFC, adapter->wol); - em_enable_wakeup(dev); - } + em_release_hw_control(adapter); + em_enable_wakeup(dev); EM_CORE_UNLOCK(adapter); @@ -1032,10 +955,10 @@ em_mq_start_locked(struct ifnet *ifp, struct mbuf *m) || (!adapter->link_active)) { error = drbr_enqueue(ifp, adapter->br, m); return (error); - } else if (drbr_empty(ifp, adapter->br) && + } else if (!drbr_needs_enqueue(ifp, adapter->br) && (adapter->num_tx_desc_avail > EM_TX_OP_THRESHOLD)) { if ((error = em_xmit(adapter, &m)) != 0) { - if (m != NULL) + if (m) error = drbr_enqueue(ifp, adapter->br, m); return (error); } else { @@ -1049,7 +972,7 @@ em_mq_start_locked(struct ifnet *ifp, struct mbuf *m) ** listener and set the watchdog on. */ ETHER_BPF_MTAP(ifp, m); - adapter->watchdog_timer = EM_TX_TIMEOUT; + adapter->watchdog_check = TRUE; } } else if ((error = drbr_enqueue(ifp, adapter->br, m)) != 0) return (error); @@ -1072,7 +995,7 @@ process: drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); ETHER_BPF_MTAP(ifp, next); /* Set the watchdog */ - adapter->watchdog_timer = EM_TX_TIMEOUT; + adapter->watchdog_check = TRUE; } if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) @@ -1151,7 +1074,7 @@ em_start_locked(struct ifnet *ifp) ETHER_BPF_MTAP(ifp, m_head); /* Set timeout in case hardware has problems transmitting. */ - adapter->watchdog_timer = EM_TX_TIMEOUT; + adapter->watchdog_check = TRUE; } if (adapter->num_tx_desc_avail <= EM_TX_OP_THRESHOLD) ifp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -1209,8 +1132,7 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data) em_init_locked(adapter); EM_CORE_UNLOCK(adapter); } - if (!(ifp->if_flags & IFF_NOARP)) - arp_ifinit(ifp, ifa); + arp_ifinit(ifp, ifa); } else #endif error = ether_ioctl(ifp, command, data); @@ -1244,6 +1166,9 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data) case e1000_80003es2lan: /* Limit Jumbo Frame size */ max_frame_size = 9234; break; + case e1000_pchlan: + max_frame_size = 4096; + break; /* Adapters that do not support jumbo frames */ case e1000_82542: case e1000_82583: @@ -1359,11 +1284,24 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data) reinit = 1; } #endif - if (mask & IFCAP_VLAN_HWTAGGING) { ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; reinit = 1; } + + if (mask & IFCAP_VLAN_HWFILTER) { + ifp->if_capenable ^= IFCAP_VLAN_HWFILTER; + reinit = 1; + } + + if ((mask & IFCAP_WOL) && + (ifp->if_capabilities & IFCAP_WOL) != 0) { + if (mask & IFCAP_WOL_MCAST) + ifp->if_capenable ^= IFCAP_WOL_MCAST; + if (mask & IFCAP_WOL_MAGIC) + ifp->if_capenable ^= IFCAP_WOL_MAGIC; + } + if (reinit && (ifp->if_drv_flags & IFF_DRV_RUNNING)) em_init(adapter); #if __FreeBSD_version >= 700000 @@ -1380,53 +1318,6 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data) return (error); } -/********************************************************************* - * Watchdog timer: - * - * This routine is called from the local timer every second. - * As long as transmit descriptors are being cleaned the value - * is non-zero and we do nothing. Reaching 0 indicates a tx hang - * and we then reset the device. - * - **********************************************************************/ - -static void -em_watchdog(struct adapter *adapter) -{ - - EM_CORE_LOCK_ASSERT(adapter); - - /* - ** The timer is set to 5 every time start queues a packet. - ** Then txeof keeps resetting it as long as it cleans at - ** least one descriptor. - ** Finally, anytime all descriptors are clean the timer is - ** set to 0. - */ - EM_TX_LOCK(adapter); - if ((adapter->watchdog_timer == 0) || (--adapter->watchdog_timer)) { - EM_TX_UNLOCK(adapter); - return; - } - - /* If we are in this routine because of pause frames, then - * don't reset the hardware. - */ - if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & - E1000_STATUS_TXOFF) { - adapter->watchdog_timer = EM_TX_TIMEOUT; - EM_TX_UNLOCK(adapter); - return; - } - - if (e1000_check_for_link(&adapter->hw) == 0) - device_printf(adapter->dev, "watchdog timeout -- resetting\n"); - adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - adapter->watchdog_events++; - EM_TX_UNLOCK(adapter); - - em_init_locked(adapter); -} /********************************************************************* * Init entry point @@ -1492,6 +1383,9 @@ em_init_locked(struct adapter *adapter) break; case e1000_ich9lan: case e1000_ich10lan: + case e1000_pchlan: + pba = E1000_PBA_10K; + break; case e1000_ich8lan: pba = E1000_PBA_8K; break; @@ -1534,18 +1428,17 @@ em_init_locked(struct adapter *adapter) /* Setup VLAN support, basic and offload if available */ E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERTYPE_VLAN); - -#if __FreeBSD_version < 700029 if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) { - u32 ctrl; - ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); - ctrl |= E1000_CTRL_VME; - E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); + if (ifp->if_capenable & IFCAP_VLAN_HWFILTER) + /* Use real VLAN Filter support */ + em_setup_vlan_hw_support(adapter); + else { + u32 ctrl; + ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); + ctrl |= E1000_CTRL_VME; + E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); + } } -#else - /* Use real VLAN Filter support */ - em_setup_vlan_hw_support(adapter); -#endif /* Set hardware offload abilities */ ifp->if_hwassist = 0; @@ -1614,6 +1507,10 @@ em_init_locked(struct adapter *adapter) #endif /* DEVICE_POLLING */ em_enable_intr(adapter); + /* AMT based hardware can now take control from firmware */ + if (adapter->has_manage && adapter->has_amt) + em_get_hw_control(adapter); + /* Don't reset the phy next time init gets called */ adapter->hw.phy.reset_disable = TRUE; } @@ -1649,13 +1546,13 @@ em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) if (cmd == POLL_AND_CHECK_STATUS) { reg_icr = E1000_READ_REG(&adapter->hw, E1000_ICR); + /* Link status change */ if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { - callout_stop(&adapter->timer); adapter->hw.mac.get_link_status = 1; em_update_link_status(adapter); - callout_reset(&adapter->timer, hz, - em_local_timer, adapter); } + if (reg_icr & E1000_ICR_RXO) + adapter->rx_overruns++; } EM_CORE_UNLOCK(adapter); @@ -1667,7 +1564,7 @@ em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) if (!drbr_empty(ifp, adapter->br)) em_mq_start_locked(ifp, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->snd)) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) em_start_locked(ifp); #endif EM_TX_UNLOCK(adapter); @@ -1769,7 +1666,7 @@ em_handle_rxtx(void *context, int pending) if (!drbr_empty(ifp, adapter->br)) em_mq_start_locked(ifp, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->snd)) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) em_start_locked(ifp); #endif EM_TX_UNLOCK(adapter); @@ -1933,7 +1830,7 @@ em_handle_tx(void *context, int pending) if (!drbr_empty(ifp, adapter->br)) em_mq_start_locked(ifp, NULL); #else - if (!IFQ_DRV_IS_EMPTY(&ifp->snd)) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) em_start_locked(ifp); #endif EM_TX_UNLOCK(adapter); @@ -2334,6 +2231,7 @@ em_xmit(struct adapter *adapter, struct mbuf **m_headp) */ tx_buffer = &adapter->tx_buffer_area[first]; tx_buffer->next_eop = last; + adapter->watchdog_time = ticks; /* * Advance the Transmit Descriptor Tail (TDT), this tells the E1000 @@ -2541,7 +2439,11 @@ em_set_multi(struct adapter *adapter) if (mta == NULL) panic("em_set_multi memory failure\n"); +#if __FreeBSD_version < 800000 + IF_ADDR_LOCK(ifp); +#else if_maddr_rlock(ifp); +#endif TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; @@ -2553,8 +2455,11 @@ em_set_multi(struct adapter *adapter) &mta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN); mcnt++; } +#if __FreeBSD_version < 800000 + IF_ADDR_UNLOCK(ifp); +#else if_maddr_runlock(ifp); - +#endif if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) { reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); reg_rctl |= E1000_RCTL_MPE; @@ -2590,8 +2495,10 @@ em_local_timer(void *arg) EM_CORE_LOCK_ASSERT(adapter); +#ifndef DEVICE_POLLING taskqueue_enqueue(adapter->tq, &adapter->rxtx_task); +#endif em_update_link_status(adapter); em_update_stats_counters(adapter); @@ -2605,13 +2512,21 @@ em_local_timer(void *arg) em_smartspeed(adapter); /* - * Each second we check the watchdog to - * protect against hardware hangs. + * We check the watchdog: the time since + * the last TX descriptor was cleaned. + * This implies a functional TX engine. */ - em_watchdog(adapter); + if ((adapter->watchdog_check == TRUE) && + (ticks - adapter->watchdog_time > EM_WATCHDOG)) + goto hung; callout_reset(&adapter->timer, hz, em_local_timer, adapter); - + return; +hung: + device_printf(adapter->dev, "Watchdog timeout -- resetting\n"); + adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + adapter->watchdog_events++; + em_init_locked(adapter); } static void @@ -2677,7 +2592,7 @@ em_update_link_status(struct adapter *adapter) device_printf(dev, "Link is Down\n"); adapter->link_active = 0; /* Link down, disable watchdog */ - adapter->watchdog_timer = FALSE; + adapter->watchdog_check = FALSE; if_link_state_change(ifp, LINK_STATE_DOWN); } } @@ -3093,15 +3008,6 @@ em_hardware_init(struct adapter *adapter) /* Issue a global reset */ e1000_reset_hw(&adapter->hw); - /* Get control from any management/hw control */ - if (((adapter->hw.mac.type == e1000_82573) || - (adapter->hw.mac.type == e1000_82583) || - (adapter->hw.mac.type == e1000_ich8lan) || - (adapter->hw.mac.type == e1000_ich10lan) || - (adapter->hw.mac.type == e1000_ich9lan)) && - e1000_check_mng_mode(&adapter->hw)) - em_get_hw_control(adapter); - /* When hardware is reset, fifo_head is also reset */ adapter->tx_fifo_head = 0; @@ -3151,6 +3057,9 @@ em_hardware_init(struct adapter *adapter) else adapter->hw.fc.requested_mode = e1000_fc_none; + /* Override - workaround for PCHLAN issue */ + if (adapter->hw.mac.type == e1000_pchlan) + adapter->hw.fc.requested_mode = e1000_fc_rx_pause; if (e1000_init_hw(&adapter->hw) < 0) { device_printf(dev, "Hardware Initialization Failed\n"); @@ -3221,18 +3130,34 @@ em_setup_interface(device_t dev, struct adapter *adapter) if (adapter->hw.mac.type >= e1000_82571) ifp->if_capenable |= IFCAP_TSO4; #endif - /* - * Tell the upper layer(s) we support long frames. + * Tell the upper layer(s) we + * support full VLAN capability */ ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; - ifp->if_capenable |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; + ifp->if_capenable |= (IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING); + + /* + ** Dont turn this on by default, if vlans are + ** created on another pseudo device (eg. lagg) + ** then vlan events are not passed thru, breaking + ** operation, but with HW FILTER off it works. If + ** using vlans directly on the em driver you can + ** enable this and get full hardware tag filtering. + */ + ifp->if_capabilities |= IFCAP_VLAN_HWFILTER; #ifdef DEVICE_POLLING ifp->if_capabilities |= IFCAP_POLLING; #endif + /* Limit WOL to MAGIC, not clear others are used */ + if (adapter->wol) { + ifp->if_capabilities |= IFCAP_WOL_MAGIC; + ifp->if_capenable |= IFCAP_WOL_MAGIC; + } + /* * Specify the media types supported by this adapter and register * callbacks to update media and link information @@ -3299,7 +3224,7 @@ em_smartspeed(struct adapter *adapter) PHY_1000T_CTRL, phy_tmp); adapter->smartspeed++; if(adapter->hw.mac.autoneg && - !e1000_phy_setup_autoneg(&adapter->hw) && + !e1000_copper_link_autoneg(&adapter->hw) && !e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_tmp)) { phy_tmp |= (MII_CR_AUTO_NEG_EN | @@ -3316,7 +3241,7 @@ em_smartspeed(struct adapter *adapter) phy_tmp |= CR_1000T_MS_ENABLE; e1000_write_phy_reg(&adapter->hw, PHY_1000T_CTRL, phy_tmp); if(adapter->hw.mac.autoneg && - !e1000_phy_setup_autoneg(&adapter->hw) && + !e1000_copper_link_autoneg(&adapter->hw) && !e1000_read_phy_reg(&adapter->hw, PHY_CONTROL, &phy_tmp)) { phy_tmp |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); @@ -3975,7 +3900,6 @@ static void em_txeof(struct adapter *adapter) { int first, last, done, num_avail; - u32 cleaned = 0; struct em_buffer *tx_buffer; struct e1000_tx_desc *tx_desc, *eop_desc; struct ifnet *ifp = adapter->ifp; @@ -4011,7 +3935,7 @@ em_txeof(struct adapter *adapter) tx_desc->upper.data = 0; tx_desc->lower.data = 0; tx_desc->buffer_addr = 0; - ++num_avail; ++cleaned; + ++num_avail; if (tx_buffer->m_head) { ifp->if_opackets++; @@ -4025,6 +3949,7 @@ em_txeof(struct adapter *adapter) tx_buffer->m_head = NULL; } tx_buffer->next_eop = -1; + adapter->watchdog_time = ticks; if (++first == adapter->num_tx_desc) first = 0; @@ -4050,20 +3975,17 @@ em_txeof(struct adapter *adapter) /* * If we have enough room, clear IFF_DRV_OACTIVE to * tell the stack that it is OK to send packets. - * If there are no pending descriptors, clear the timeout. + * If there are no pending descriptors, clear the watchdog. */ if (num_avail > EM_TX_CLEANUP_THRESHOLD) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; if (num_avail == adapter->num_tx_desc) { - adapter->watchdog_timer = 0; + adapter->watchdog_check = FALSE; adapter->num_tx_desc_avail = num_avail; return; } } - /* If any descriptors cleaned, reset the watchdog */ - if (cleaned) - adapter->watchdog_timer = EM_TX_TIMEOUT; adapter->num_tx_desc_avail = num_avail; return; } @@ -4071,7 +3993,7 @@ em_txeof(struct adapter *adapter) /********************************************************************* * * When Link is lost sometimes there is work still in the TX ring - * which will result in a watchdog, rather than allow that do an + * which may result in a watchdog, rather than allow that we do an * attempted cleanup and then reinit here. Note that this has been * seens mostly with fiber adapters. * @@ -4079,14 +4001,12 @@ em_txeof(struct adapter *adapter) static void em_tx_purge(struct adapter *adapter) { - if ((!adapter->link_active) && (adapter->watchdog_timer)) { + if ((!adapter->link_active) && (adapter->watchdog_check)) { EM_TX_LOCK(adapter); em_txeof(adapter); EM_TX_UNLOCK(adapter); - if (adapter->watchdog_timer) { /* Still not clean? */ - adapter->watchdog_timer = 0; + if (adapter->watchdog_check) /* Still outstanding? */ em_init_locked(adapter); - } } } @@ -4877,72 +4797,54 @@ em_release_manageability(struct adapter *adapter) } /* - * em_get_hw_control sets {CTRL_EXT|FWSM}:DRV_LOAD bit. - * For ASF and Pass Through versions of f/w this means that - * the driver is loaded. For AMT version (only with 82573) - * of the f/w this means that the network i/f is open. - * + * em_get_hw_control sets the {CTRL_EXT|FWSM}:DRV_LOAD bit. + * For ASF and Pass Through versions of f/w this means + * that the driver is loaded. For AMT version type f/w + * this means that the network i/f is open. */ static void em_get_hw_control(struct adapter *adapter) { u32 ctrl_ext, swsm; - /* Let firmware know the driver has taken over */ - switch (adapter->hw.mac.type) { - case e1000_82573: + if (adapter->hw.mac.type == e1000_82573) { swsm = E1000_READ_REG(&adapter->hw, E1000_SWSM); E1000_WRITE_REG(&adapter->hw, E1000_SWSM, swsm | E1000_SWSM_DRV_LOAD); - break; - case e1000_82571: - case e1000_82572: - case e1000_80003es2lan: - case e1000_ich8lan: - case e1000_ich9lan: - case e1000_ich10lan: - ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); - E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, - ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); - break; - default: - break; + return; } + /* else */ + ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); + E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, + ctrl_ext | E1000_CTRL_EXT_DRV_LOAD); + return; } /* * em_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit. - * For ASF and Pass Through versions of f/w this means that the - * driver is no longer loaded. For AMT version (only with 82573) i - * of the f/w this means that the network i/f is closed. - * + * For ASF and Pass Through versions of f/w this means that + * the driver is no longer loaded. For AMT versions of the + * f/w this means that the network i/f is closed. */ static void em_release_hw_control(struct adapter *adapter) { u32 ctrl_ext, swsm; - /* Let firmware taken over control of h/w */ - switch (adapter->hw.mac.type) { - case e1000_82573: + if (!adapter->has_manage) + return; + + if (adapter->hw.mac.type == e1000_82573) { swsm = E1000_READ_REG(&adapter->hw, E1000_SWSM); E1000_WRITE_REG(&adapter->hw, E1000_SWSM, swsm & ~E1000_SWSM_DRV_LOAD); - break; - case e1000_82571: - case e1000_82572: - case e1000_80003es2lan: - case e1000_ich8lan: - case e1000_ich9lan: - case e1000_ich10lan: - ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); - E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, - ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); - break; - default: - break; - + return; } + /* else */ + ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); + E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, + ctrl_ext & ~E1000_CTRL_EXT_DRV_LOAD); + return; } static int @@ -4957,30 +4859,252 @@ em_is_valid_ether_addr(u8 *addr) return (TRUE); } +/* +** Parse the interface capabilities with regard +** to both system management and wake-on-lan for +** later use. +*/ +static void +em_get_wakeup(device_t dev) +{ + struct adapter *adapter = device_get_softc(dev); + u16 eeprom_data = 0, device_id, apme_mask; + + adapter->has_manage = e1000_enable_mng_pass_thru(&adapter->hw); + apme_mask = EM_EEPROM_APME; + + switch (adapter->hw.mac.type) { + case e1000_82542: + case e1000_82543: + break; + case e1000_82544: + e1000_read_nvm(&adapter->hw, + NVM_INIT_CONTROL2_REG, 1, &eeprom_data); + apme_mask = EM_82544_APME; + break; + case e1000_82573: + case e1000_82583: + adapter->has_amt = TRUE; + /* Falls thru */ + case e1000_82546: + case e1000_82546_rev_3: + case e1000_82571: + case e1000_82572: + case e1000_80003es2lan: + if (adapter->hw.bus.func == 1) { + e1000_read_nvm(&adapter->hw, + NVM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); + break; + } else + e1000_read_nvm(&adapter->hw, + NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); + break; + case e1000_ich8lan: + case e1000_ich9lan: + case e1000_ich10lan: + case e1000_pchlan: + apme_mask = E1000_WUC_APME; + adapter->has_amt = TRUE; + eeprom_data = E1000_READ_REG(&adapter->hw, E1000_WUC); + break; + default: + e1000_read_nvm(&adapter->hw, + NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); + break; + } + if (eeprom_data & apme_mask) + adapter->wol = (E1000_WUFC_MAG | E1000_WUFC_MC); + /* + * We have the eeprom settings, now apply the special cases + * where the eeprom may be wrong or the board won't support + * wake on lan on a particular port + */ + device_id = pci_get_device(dev); + switch (device_id) { + case E1000_DEV_ID_82546GB_PCIE: + adapter->wol = 0; + break; + case E1000_DEV_ID_82546EB_FIBER: + case E1000_DEV_ID_82546GB_FIBER: + case E1000_DEV_ID_82571EB_FIBER: + /* Wake events only supported on port A for dual fiber + * regardless of eeprom setting */ + if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & + E1000_STATUS_FUNC_1) + adapter->wol = 0; + break; + case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3: + case E1000_DEV_ID_82571EB_QUAD_COPPER: + case E1000_DEV_ID_82571EB_QUAD_FIBER: + case E1000_DEV_ID_82571EB_QUAD_COPPER_LP: + /* if quad port adapter, disable WoL on all but port A */ + if (global_quad_port_a != 0) + adapter->wol = 0; + /* Reset for multiple quad port adapters */ + if (++global_quad_port_a == 4) + global_quad_port_a = 0; + break; + } + return; +} + + /* * Enable PCI Wake On Lan capability */ void em_enable_wakeup(device_t dev) { - u16 cap, status; - u8 id; + struct adapter *adapter = device_get_softc(dev); + struct ifnet *ifp = adapter->ifp; + u32 pmc, ctrl, ctrl_ext, rctl; + u16 status; - /* First find the capabilities pointer*/ - cap = pci_read_config(dev, PCIR_CAP_PTR, 2); - /* Read the PM Capabilities */ - id = pci_read_config(dev, cap, 1); - if (id != PCIY_PMG) /* Something wrong */ + if ((pci_find_extcap(dev, PCIY_PMG, &pmc) != 0)) return; - /* OK, we have the power capabilities, so - now get the status register */ - cap += PCIR_POWER_STATUS; - status = pci_read_config(dev, cap, 2); - status |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; - pci_write_config(dev, cap, status, 2); + + /* Advertise the wakeup capability */ + ctrl = E1000_READ_REG(&adapter->hw, E1000_CTRL); + ctrl |= (E1000_CTRL_SWDPIN2 | E1000_CTRL_SWDPIN3); + E1000_WRITE_REG(&adapter->hw, E1000_CTRL, ctrl); + E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); + + /* ICH workaround code */ + if ((adapter->hw.mac.type == e1000_ich8lan) || + (adapter->hw.mac.type == e1000_pchlan) || + (adapter->hw.mac.type == e1000_ich9lan) || + (adapter->hw.mac.type == e1000_ich10lan)) { + e1000_disable_gig_wol_ich8lan(&adapter->hw); + e1000_hv_phy_powerdown_workaround_ich8lan(&adapter->hw); + } + + /* Keep the laser running on Fiber adapters */ + if (adapter->hw.phy.media_type == e1000_media_type_fiber || + adapter->hw.phy.media_type == e1000_media_type_internal_serdes) { + ctrl_ext = E1000_READ_REG(&adapter->hw, E1000_CTRL_EXT); + ctrl_ext |= E1000_CTRL_EXT_SDP3_DATA; + E1000_WRITE_REG(&adapter->hw, E1000_CTRL_EXT, ctrl_ext); + } + + /* + ** Determine type of Wakeup: note that wol + ** is set with all bits on by default. + */ + if ((ifp->if_capenable & IFCAP_WOL_MAGIC) == 0) + adapter->wol &= ~E1000_WUFC_MAG; + + if ((ifp->if_capenable & IFCAP_WOL_MCAST) == 0) + adapter->wol &= ~E1000_WUFC_MC; + else { + rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); + rctl |= E1000_RCTL_MPE; + E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); + } + + if (adapter->hw.mac.type == e1000_pchlan) { + if (em_enable_phy_wakeup(adapter)) + return; + } else { + E1000_WRITE_REG(&adapter->hw, E1000_WUC, E1000_WUC_PME_EN); + E1000_WRITE_REG(&adapter->hw, E1000_WUFC, adapter->wol); + } + + if (adapter->hw.phy.type == e1000_phy_igp_3) + e1000_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw); + + /* Request PME */ + status = pci_read_config(dev, pmc + PCIR_POWER_STATUS, 2); + status &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE); + if (ifp->if_capenable & IFCAP_WOL) + status |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; + pci_write_config(dev, pmc + PCIR_POWER_STATUS, status, 2); + return; } +/* +** WOL in the newer chipset interfaces (pchlan) +** require thing to be copied into the phy +*/ +static int +em_enable_phy_wakeup(struct adapter *adapter) +{ + struct e1000_hw *hw = &adapter->hw; + u32 mreg, ret = 0; + u16 preg; + + /* copy MAC RARs to PHY RARs */ + for (int i = 0; i < adapter->hw.mac.rar_entry_count; i++) { + mreg = E1000_READ_REG(hw, E1000_RAL(i)); + e1000_write_phy_reg(hw, BM_RAR_L(i), (u16)(mreg & 0xFFFF)); + e1000_write_phy_reg(hw, BM_RAR_M(i), + (u16)((mreg >> 16) & 0xFFFF)); + mreg = E1000_READ_REG(hw, E1000_RAH(i)); + e1000_write_phy_reg(hw, BM_RAR_H(i), (u16)(mreg & 0xFFFF)); + e1000_write_phy_reg(hw, BM_RAR_CTRL(i), + (u16)((mreg >> 16) & 0xFFFF)); + } + + /* copy MAC MTA to PHY MTA */ + for (int i = 0; i < adapter->hw.mac.mta_reg_count; i++) { + mreg = E1000_READ_REG_ARRAY(hw, E1000_MTA, i); + e1000_write_phy_reg(hw, BM_MTA(i), (u16)(mreg & 0xFFFF)); + e1000_write_phy_reg(hw, BM_MTA(i) + 1, + (u16)((mreg >> 16) & 0xFFFF)); + } + + /* configure PHY Rx Control register */ + e1000_read_phy_reg(&adapter->hw, BM_RCTL, &preg); + mreg = E1000_READ_REG(hw, E1000_RCTL); + if (mreg & E1000_RCTL_UPE) + preg |= BM_RCTL_UPE; + if (mreg & E1000_RCTL_MPE) + preg |= BM_RCTL_MPE; + preg &= ~(BM_RCTL_MO_MASK); + if (mreg & E1000_RCTL_MO_3) + preg |= (((mreg & E1000_RCTL_MO_3) >> E1000_RCTL_MO_SHIFT) + << BM_RCTL_MO_SHIFT); + if (mreg & E1000_RCTL_BAM) + preg |= BM_RCTL_BAM; + if (mreg & E1000_RCTL_PMCF) + preg |= BM_RCTL_PMCF; + mreg = E1000_READ_REG(hw, E1000_CTRL); + if (mreg & E1000_CTRL_RFCE) + preg |= BM_RCTL_RFCE; + e1000_write_phy_reg(&adapter->hw, BM_RCTL, preg); + + /* enable PHY wakeup in MAC register */ + E1000_WRITE_REG(hw, E1000_WUC, + E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN); + E1000_WRITE_REG(hw, E1000_WUFC, adapter->wol); + + /* configure and enable PHY wakeup in PHY registers */ + e1000_write_phy_reg(&adapter->hw, BM_WUFC, adapter->wol); + e1000_write_phy_reg(&adapter->hw, BM_WUC, E1000_WUC_PME_EN); + + /* activate PHY wakeup */ + ret = hw->phy.ops.acquire(hw); + if (ret) { + printf("Could not acquire PHY\n"); + return ret; + } + e1000_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, + (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); + ret = e1000_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &preg); + if (ret) { + printf("Could not read PHY page 769\n"); + goto out; + } + preg |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT; + ret = e1000_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, preg); + if (ret) + printf("Could not set PHY Host Wakeup bit\n"); +out: + hw->phy.ops.release(hw); + + return ret; +} + /********************************************************************* * 82544 Coexistence issue workaround. diff --git a/sys/dev/e1000/if_em.h b/sys/dev/e1000/if_em.h index 7487a89e0d0b..fe5a99b3b99f 100644 --- a/sys/dev/e1000/if_em.h +++ b/sys/dev/e1000/if_em.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -54,7 +54,7 @@ #define EM_MIN_TXD 80 #define EM_MAX_TXD_82543 256 #define EM_MAX_TXD 4096 -#define EM_DEFAULT_TXD EM_MAX_TXD_82543 +#define EM_DEFAULT_TXD 1024 /* * EM_RXD - Maximum number of receive Descriptors @@ -72,7 +72,7 @@ #define EM_MIN_RXD 80 #define EM_MAX_RXD_82543 256 #define EM_MAX_RXD 4096 -#define EM_DEFAULT_RXD EM_MAX_RXD_82543 +#define EM_DEFAULT_RXD 1024 /* * EM_TIDV - Transmit Interrupt Delay Value @@ -135,9 +135,9 @@ #define EM_RADV 64 /* - * This parameter controls the duration of transmit watchdog timer. + * This parameter controls the max duration of transmit watchdog. */ -#define EM_TX_TIMEOUT 5 +#define EM_WATCHDOG (10 * hz) /* * This parameter controls when the driver calls the routine to reclaim @@ -189,6 +189,7 @@ #define ETHER_ALIGN 2 #define EM_FC_PAUSE_TIME 0x0680 #define EM_EEPROM_APME 0x400; +#define EM_82544_APME 0x0004; /* Code compatilbility between 6 and 7 */ #ifndef ETHER_BPF_MTAP @@ -308,7 +309,8 @@ struct adapter { struct ifmedia media; struct callout timer; struct callout tx_fifo_timer; - int watchdog_timer; + bool watchdog_check; + int watchdog_time; int msi; int if_flags; int max_frame_size; @@ -332,8 +334,9 @@ struct adapter { #endif /* Management and WOL features */ - int wol; - int has_manage; + u32 wol; + bool has_manage; + bool has_amt; /* Info about the board itself */ uint8_t link_active; @@ -417,6 +420,13 @@ struct adapter { boolean_t pcix_82544; boolean_t in_detach; +#ifdef EM_IEEE1588 + /* IEEE 1588 precision time support */ + struct cyclecounter cycles; + struct nettimer clock; + struct nettime_compare compare; + struct hwtstamp_ctrl hwtstamp; +#endif struct e1000_hw_stats stats; }; diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c index e6ad0fccc878..2eb113aa4d7c 100644 --- a/sys/dev/e1000/if_igb.c +++ b/sys/dev/e1000/if_igb.c @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -36,6 +36,7 @@ #ifdef HAVE_KERNEL_OPTION_HEADERS #include "opt_device_polling.h" #include "opt_inet.h" +#include "opt_altq.h" #endif #include @@ -101,7 +102,7 @@ int igb_display_debug_stats = 0; /********************************************************************* * Driver version: *********************************************************************/ -char igb_driver_version[] = "version - 1.7.3"; +char igb_driver_version[] = "version - 1.9.1"; /********************************************************************* @@ -123,12 +124,19 @@ static igb_vendor_info_t igb_vendor_info_array[] = PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82576, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82576_NS, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82576_NS_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82576_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82576_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82576_SERDES_QUAD, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82576_QUAD_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82580_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82580_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82580_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82580_SGMII, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82580_COPPER_DUAL, + PCI_ANY_ID, PCI_ANY_ID, 0}, /* required last entry */ { 0, 0, 0, 0, 0} }; @@ -159,7 +167,6 @@ static int igb_mq_start_locked(struct ifnet *, static void igb_qflush(struct ifnet *); #endif static int igb_ioctl(struct ifnet *, u_long, caddr_t); -static void igb_watchdog(struct adapter *); static void igb_init(void *); static void igb_init_locked(struct adapter *); static void igb_stop(void *); @@ -172,7 +179,7 @@ static int igb_allocate_legacy(struct adapter *); static int igb_setup_msix(struct adapter *); static void igb_free_pci_resources(struct adapter *); static void igb_local_timer(void *); -static int igb_hardware_init(struct adapter *); +static void igb_reset(struct adapter *); static void igb_setup_interface(device_t, struct adapter *); static int igb_allocate_queues(struct adapter *); static void igb_configure_queues(struct adapter *); @@ -190,13 +197,20 @@ static int igb_setup_receive_ring(struct rx_ring *); static void igb_initialize_receive_units(struct adapter *); static void igb_free_receive_structures(struct adapter *); static void igb_free_receive_buffers(struct rx_ring *); +static void igb_free_receive_ring(struct rx_ring *); static void igb_enable_intr(struct adapter *); static void igb_disable_intr(struct adapter *); static void igb_update_stats_counters(struct adapter *); static bool igb_txeof(struct tx_ring *); + +static __inline void igb_rx_discard(struct rx_ring *, + union e1000_adv_rx_desc *, int); +static __inline void igb_rx_input(struct rx_ring *, + struct ifnet *, struct mbuf *, u32); + static bool igb_rxeof(struct rx_ring *, int); -static void igb_rx_checksum(u32, struct mbuf *, bool); +static void igb_rx_checksum(u32, struct mbuf *, u32); static int igb_tx_ctx_setup(struct tx_ring *, struct mbuf *); static bool igb_tso_setup(struct tx_ring *, struct mbuf *, u32 *); static void igb_set_promisc(struct adapter *); @@ -230,16 +244,16 @@ static int igb_irq_fast(void *); static void igb_add_rx_process_limit(struct adapter *, const char *, const char *, int *, int); static void igb_handle_rxtx(void *context, int pending); -static void igb_handle_tx(void *context, int pending); -static void igb_handle_rx(void *context, int pending); +static void igb_handle_que(void *context, int pending); +static void igb_handle_link(void *context, int pending); /* These are MSIX only irq handlers */ -static void igb_msix_rx(void *); -static void igb_msix_tx(void *); +static void igb_msix_que(void *); static void igb_msix_link(void *); -/* Adaptive Interrupt Moderation */ -static void igb_update_aim(struct rx_ring *); +#ifdef DEVICE_POLLING +static poll_handler_t igb_poll; +#endif /* POLLING */ /********************************************************************* * FreeBSD Device Interface Entry Points @@ -276,31 +290,35 @@ TUNABLE_INT("hw.igb.rxd", &igb_rxd); TUNABLE_INT("hw.igb.txd", &igb_txd); /* -** These parameters are used in Adaptive -** Interrupt Moderation. The value is set -** into EITR and controls the interrupt -** frequency. A variable static scheme can -** be created by changing the assigned value -** of igb_ave_latency to the desired value, -** and then set igb_enable_aim to FALSE. -** This will result in all EITR registers -** getting set to that value statically. +** AIM: Adaptive Interrupt Moderation +** which means that the interrupt rate +** is varied over time based on the +** traffic for that interrupt vector */ static int igb_enable_aim = TRUE; TUNABLE_INT("hw.igb.enable_aim", &igb_enable_aim); -static int igb_low_latency = IGB_LOW_LATENCY; -TUNABLE_INT("hw.igb.low_latency", &igb_low_latency); -static int igb_ave_latency = IGB_AVE_LATENCY; -TUNABLE_INT("hw.igb.ave_latency", &igb_ave_latency); -static int igb_bulk_latency = IGB_BULK_LATENCY; -TUNABLE_INT("hw.igb.bulk_latency", &igb_bulk_latency); - + /* -** This will autoconfigure based on the number -** of CPUs if set to 0. Only a matched pair of -** TX and RX rings are allowed. + * MSIX should be the default for best performance, + * but this allows it to be forced off for testing. + */ +static int igb_enable_msix = 1; +TUNABLE_INT("hw.igb.enable_msix", &igb_enable_msix); + +/* + * Header split has seemed to be beneficial in + * many circumstances tested, however there have + * been some stability issues, so the default is + * off. + */ +static bool igb_header_split = FALSE; +TUNABLE_INT("hw.igb.hdr_split", &igb_header_split); + +/* +** This will autoconfigure based on +** the number of CPUs if left at 0. */ -static int igb_num_queues = 1; +static int igb_num_queues = 0; TUNABLE_INT("hw.igb.num_queues", &igb_num_queues); /* How many packets rxeof tries to clean at a time */ @@ -415,21 +433,6 @@ igb_attach(device_t dev) OID_AUTO, "enable_aim", CTLTYPE_INT|CTLFLAG_RW, &igb_enable_aim, 1, "Interrupt Moderation"); - SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), - OID_AUTO, "low_latency", CTLTYPE_INT|CTLFLAG_RW, - &igb_low_latency, 1, "Low Latency"); - - SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), - OID_AUTO, "ave_latency", CTLTYPE_INT|CTLFLAG_RW, - &igb_ave_latency, 1, "Average Latency"); - - SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), - SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), - OID_AUTO, "bulk_latency", CTLTYPE_INT|CTLFLAG_RW, - &igb_bulk_latency, 1, "Bulk Latency"); - callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0); /* Determine hardware and mac info */ @@ -540,17 +543,10 @@ igb_attach(device_t dev) goto err_late; } - /* Now Initialize the hardware */ - if (igb_hardware_init(adapter)) { - device_printf(dev, "Unable to initialize the hardware\n"); - error = EIO; - goto err_late; - } - /* ** Configure Interrupts */ - if (adapter->msix > 1) /* MSIX */ + if ((adapter->msix > 1) && (igb_enable_msix)) error = igb_allocate_msix(adapter); else /* MSI or Legacy */ error = igb_allocate_legacy(adapter); @@ -560,21 +556,8 @@ igb_attach(device_t dev) /* Setup OS specific network interface */ igb_setup_interface(dev, adapter); -#ifdef IGB_IEEE1588 - /* - ** Setup the timer: IEEE 1588 support - */ - adapter->cycles.read = igb_read_clock; - adapter->cycles.mask = (u64)-1; - adapter->cycles.mult = 1; - adapter->cycles.shift = IGB_TSYNC_SHIFT; - E1000_WRITE_REG(&adapter->hw, E1000_TIMINCA, (1<<24) | - IGB_TSYNC_CYCLE_TIME * IGB_TSYNC_SHIFT); - E1000_WRITE_REG(&adapter->hw, E1000_SYSTIML, 0x00000000); - E1000_WRITE_REG(&adapter->hw, E1000_SYSTIMH, 0xFF800000); - - // JFV - this is not complete yet -#endif + /* Now get a good starting state */ + igb_reset(adapter); /* Initialize statistics */ igb_update_stats_counters(adapter); @@ -646,6 +629,11 @@ igb_detach(device_t dev) return (EBUSY); } +#ifdef DEVICE_POLLING + if (ifp->if_capenable & IFCAP_POLLING) + ether_poll_deregister(ifp); +#endif + IGB_CORE_LOCK(adapter); adapter->in_detach = 1; igb_stop(adapter); @@ -787,8 +775,8 @@ igb_start_locked(struct tx_ring *txr, struct ifnet *ifp) /* Send a copy of the frame to the BPF listener */ ETHER_BPF_MTAP(ifp, m_head); - /* Set timeout in case hardware has problems transmitting. */ - txr->watchdog_timer = IGB_TX_TIMEOUT; + /* Set watchdog on */ + txr->watchdog_check = TRUE; } } @@ -842,59 +830,48 @@ igb_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr, struct mbuf *m) { struct adapter *adapter = txr->adapter; struct mbuf *next; - int err = 0; + int err = 0, enq; - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { - err = drbr_enqueue(ifp, txr->br, m); + IGB_TX_LOCK_ASSERT(txr); + + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING || adapter->link_active == 0) { + if (m != NULL) + err = drbr_enqueue(ifp, txr->br, m); return (err); } - if (m == NULL) /* Called by tasklet */ - goto process; - - /* If nothing queued go right to xmit */ - if (drbr_empty(ifp, txr->br)) { - if ((err = igb_xmit(txr, &m)) != 0) { - if (m != NULL) - err = drbr_enqueue(ifp, txr->br, m); - return (err); - } else { - /* Success, update stats */ - drbr_stats_update(ifp, m->m_pkthdr.len, m->m_flags); - /* Send a copy of the frame to the BPF listener */ - ETHER_BPF_MTAP(ifp, m); - /* Set the watchdog */ - txr->watchdog_timer = IGB_TX_TIMEOUT; - } - - } else if ((err = drbr_enqueue(ifp, txr->br, m)) != 0) - return (err); - -process: - if (drbr_empty(ifp, txr->br)) - return (err); - - /* Process the queue */ - while (TRUE) { - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) - break; + enq = 0; + if (m == NULL) { next = drbr_dequeue(ifp, txr->br); - if (next == NULL) - break; + } else if (drbr_needs_enqueue(ifp, txr->br)) { + if ((err = drbr_enqueue(ifp, txr->br, m)) != 0) + return (err); + next = drbr_dequeue(ifp, txr->br); + } else + next = m; + /* Process the queue */ + while (next != NULL) { if ((err = igb_xmit(txr, &next)) != 0) { if (next != NULL) err = drbr_enqueue(ifp, txr->br, next); break; } + enq++; drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); ETHER_BPF_MTAP(ifp, next); - /* Set the watchdog */ - txr->watchdog_timer = IGB_TX_TIMEOUT; + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + break; + if (txr->tx_avail <= IGB_TX_OP_THRESHOLD) { + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } + next = drbr_dequeue(ifp, txr->br); + } + if (enq > 0) { + /* Set the watchdog */ + txr->watchdog_check = TRUE; } - - if (txr->tx_avail <= IGB_TX_OP_THRESHOLD) - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - return (err); } @@ -1011,6 +988,9 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data) IGB_CORE_LOCK(adapter); igb_disable_intr(adapter); igb_set_multi(adapter); +#ifdef DEVICE_POLLING + if (!(ifp->if_capenable & IFCAP_POLLING)) +#endif igb_enable_intr(adapter); IGB_CORE_UNLOCK(adapter); } @@ -1037,6 +1017,26 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data) IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)"); reinit = 0; mask = ifr->ifr_reqcap ^ ifp->if_capenable; +#ifdef DEVICE_POLLING + if (mask & IFCAP_POLLING) { + if (ifr->ifr_reqcap & IFCAP_POLLING) { + error = ether_poll_register(igb_poll, ifp); + if (error) + return (error); + IGB_CORE_LOCK(adapter); + igb_disable_intr(adapter); + ifp->if_capenable |= IFCAP_POLLING; + IGB_CORE_UNLOCK(adapter); + } else { + error = ether_poll_deregister(ifp); + /* Enable interrupt even in error case */ + IGB_CORE_LOCK(adapter); + igb_enable_intr(adapter); + ifp->if_capenable &= ~IFCAP_POLLING; + IGB_CORE_UNLOCK(adapter); + } + } +#endif if (mask & IFCAP_HWCSUM) { ifp->if_capenable ^= IFCAP_HWCSUM; reinit = 1; @@ -1059,15 +1059,6 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data) break; } -#ifdef IGB_IEEE1588 - /* - ** IOCTL support for Precision Time (IEEE 1588) Support - */ - case SIOCSHWTSTAMP: - error = igb_hwtstamp_ioctl(adapter, ifp); - break; -#endif - default: error = ether_ioctl(ifp, command, data); break; @@ -1076,80 +1067,6 @@ igb_ioctl(struct ifnet *ifp, u_long command, caddr_t data) return (error); } -/********************************************************************* - * Watchdog timer: - * - * This routine is called from the local timer every second. - * As long as transmit descriptors are being cleaned the value - * is non-zero and we do nothing. Reaching 0 indicates a tx hang - * and we then reset the device. - * - **********************************************************************/ - -static void -igb_watchdog(struct adapter *adapter) -{ - struct tx_ring *txr = adapter->tx_rings; - bool tx_hang = FALSE; - - IGB_CORE_LOCK_ASSERT(adapter); - - /* - ** The timer is set to 5 every time start() queues a packet. - ** Then txeof keeps resetting it as long as it cleans at - ** least one descriptor. - ** Finally, anytime all descriptors are clean the timer is - ** set to 0. - ** - ** With TX Multiqueue we need to check every queue's timer, - ** if any time out we do the reset. - */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { - IGB_TX_LOCK(txr); - if (txr->watchdog_timer == 0 || - (--txr->watchdog_timer)) { - IGB_TX_UNLOCK(txr); - continue; - } else { - tx_hang = TRUE; - IGB_TX_UNLOCK(txr); - break; - } - } - if (tx_hang == FALSE) - return; - - /* If we are in this routine because of pause frames, then - * don't reset the hardware. - */ - if (E1000_READ_REG(&adapter->hw, E1000_STATUS) & - E1000_STATUS_TXOFF) { - txr = adapter->tx_rings; /* reset pointer */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { - IGB_TX_LOCK(txr); - txr->watchdog_timer = IGB_TX_TIMEOUT; - IGB_TX_UNLOCK(txr); - } - return; - } - - if (e1000_check_for_link(&adapter->hw) == 0) - device_printf(adapter->dev, "watchdog timeout -- resetting\n"); - - for (int i = 0; i < adapter->num_queues; i++, txr++) { - device_printf(adapter->dev, "Queue(%d) tdh = %d, tdt = %d\n", - i, E1000_READ_REG(&adapter->hw, E1000_TDH(i)), - E1000_READ_REG(&adapter->hw, E1000_TDT(i))); - device_printf(adapter->dev, "Queue(%d) desc avail = %d," - " Next Desc to Clean = %d\n", i, txr->tx_avail, - txr->next_to_clean); - } - - adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - adapter->watchdog_events++; - - igb_init_locked(adapter); -} /********************************************************************* * Init entry point @@ -1165,29 +1082,16 @@ igb_watchdog(struct adapter *adapter) static void igb_init_locked(struct adapter *adapter) { - struct rx_ring *rxr = adapter->rx_rings; - struct tx_ring *txr = adapter->tx_rings; struct ifnet *ifp = adapter->ifp; device_t dev = adapter->dev; - u32 pba = 0; INIT_DEBUGOUT("igb_init: begin"); IGB_CORE_LOCK_ASSERT(adapter); - igb_stop(adapter); + igb_disable_intr(adapter); + callout_stop(&adapter->timer); - /* - * Packet Buffer Allocation (PBA) - * Writing PBA sets the receive portion of the buffer - * the remainder is used for the transmit buffer. - */ - if (adapter->hw.mac.type == e1000_82575) { - INIT_DEBUGOUT1("igb_init: pba=%dK",pba); - pba = E1000_PBA_32K; /* 32K for Rx, 16K for Tx */ - E1000_WRITE_REG(&adapter->hw, E1000_PBA, pba); - } - /* Get the latest mac address, User can use a LAA */ bcopy(IF_LLADDR(adapter->ifp), adapter->hw.mac.addr, ETHER_ADDR_LEN); @@ -1195,11 +1099,7 @@ igb_init_locked(struct adapter *adapter) /* Put the address into the Receive Address Array */ e1000_rar_set(&adapter->hw, adapter->hw.mac.addr, 0); - /* Initialize the hardware */ - if (igb_hardware_init(adapter)) { - device_printf(dev, "Unable to initialize the hardware\n"); - return; - } + igb_reset(adapter); igb_update_link_status(adapter); E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERTYPE_VLAN); @@ -1239,7 +1139,6 @@ igb_init_locked(struct adapter *adapter) /* Prepare receive descriptors and buffers */ if (igb_setup_receive_structures(adapter)) { device_printf(dev, "Could not setup receive structures\n"); - igb_stop(adapter); return; } igb_initialize_receive_units(adapter); @@ -1259,25 +1158,20 @@ igb_init_locked(struct adapter *adapter) /* Set up VLAN tag offload and filter */ igb_setup_vlan_hw_support(adapter); - /* Set default RX interrupt moderation */ - for (int i = 0; i < adapter->num_queues; i++, rxr++) { - E1000_WRITE_REG(&adapter->hw, - E1000_EITR(rxr->msix), igb_ave_latency); - rxr->eitr_setting = igb_ave_latency; - } - - /* Set TX interrupt rate & reset TX watchdog */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { - E1000_WRITE_REG(&adapter->hw, - E1000_EITR(txr->msix), igb_ave_latency); - txr->watchdog_timer = FALSE; - } - + /* this clears any pending interrupts */ + E1000_READ_REG(&adapter->hw, E1000_ICR); +#ifdef DEVICE_POLLING + /* + * Only enable interrupts if we are not polling, make sure + * they are off otherwise. + */ + if (ifp->if_capenable & IFCAP_POLLING) + igb_disable_intr(adapter); + else +#endif /* DEVICE_POLLING */ { - /* this clears any pending interrupts */ - E1000_READ_REG(&adapter->hw, E1000_ICR); - igb_enable_intr(adapter); - E1000_WRITE_REG(&adapter->hw, E1000_ICS, E1000_ICS_LSC); + igb_enable_intr(adapter); + E1000_WRITE_REG(&adapter->hw, E1000_ICS, E1000_ICS_LSC); } /* Don't reset the phy next time init gets called */ @@ -1325,40 +1219,51 @@ igb_handle_rxtx(void *context, int pending) } static void -igb_handle_rx(void *context, int pending) +igb_handle_que(void *context, int pending) { - struct rx_ring *rxr = context; - struct adapter *adapter = rxr->adapter; - struct ifnet *ifp = adapter->ifp; - - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - if (igb_rxeof(rxr, adapter->rx_process_limit) != 0) - /* More to clean, schedule another task */ - taskqueue_enqueue(adapter->tq, &rxr->rx_task); - -} + struct igb_queue *que = context; + struct adapter *adapter = que->adapter; + struct tx_ring *txr = que->txr; + struct rx_ring *rxr = que->rxr; + struct ifnet *ifp = adapter->ifp; + u32 loop = IGB_MAX_LOOP; + bool more; -static void -igb_handle_tx(void *context, int pending) -{ - struct tx_ring *txr = context; - struct adapter *adapter = txr->adapter; - struct ifnet *ifp = adapter->ifp; + /* RX first */ + do { + more = igb_rxeof(rxr, -1); + } while (loop-- && more); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { - IGB_TX_LOCK(txr); - igb_txeof(txr); + if (IGB_TX_TRYLOCK(txr)) { + loop = IGB_MAX_LOOP; + do { + more = igb_txeof(txr); + } while (loop-- && more); #if __FreeBSD_version >= 800000 - if (!drbr_empty(ifp, txr->br)) - igb_mq_start_locked(ifp, txr, NULL); + igb_mq_start_locked(ifp, txr, NULL); #else if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) igb_start_locked(txr, ifp); #endif IGB_TX_UNLOCK(txr); } + + /* Reenable this interrupt */ +#ifdef DEVICE_POLLING + if (!(ifp->if_capenable & IFCAP_POLLING)) +#endif + E1000_WRITE_REG(&adapter->hw, E1000_EIMS, que->eims); } +/* Deal with link in a sleepable context */ +static void +igb_handle_link(void *context, int pending) +{ + struct adapter *adapter = context; + + adapter->hw.mac.get_link_status = 1; + igb_update_link_status(adapter); +} /********************************************************************* * @@ -1395,16 +1300,71 @@ igb_irq_fast(void *arg) taskqueue_enqueue(adapter->tq, &adapter->rxtx_task); /* Link status change */ - if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { - adapter->hw.mac.get_link_status = 1; - igb_update_link_status(adapter); - } + if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) + taskqueue_enqueue(adapter->tq, &adapter->link_task); if (reg_icr & E1000_ICR_RXO) adapter->rx_overruns++; return FILTER_HANDLED; } +#ifdef DEVICE_POLLING +/********************************************************************* + * + * Legacy polling routine + * + *********************************************************************/ +#if __FreeBSD_version >= 800000 +#define POLL_RETURN_COUNT(a) (a) +static int +#else +#define POLL_RETURN_COUNT(a) +static void +#endif +igb_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) +{ + struct adapter *adapter = ifp->if_softc; + struct rx_ring *rxr = adapter->rx_rings; + struct tx_ring *txr = adapter->tx_rings; + u32 reg_icr, rx_done = 0; + u32 loop = IGB_MAX_LOOP; + bool more; + + IGB_CORE_LOCK(adapter); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + IGB_CORE_UNLOCK(adapter); + return POLL_RETURN_COUNT(rx_done); + } + + if (cmd == POLL_AND_CHECK_STATUS) { + reg_icr = E1000_READ_REG(&adapter->hw, E1000_ICR); + /* Link status change */ + if (reg_icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) + taskqueue_enqueue(adapter->tq, &adapter->link_task); + + if (reg_icr & E1000_ICR_RXO) + adapter->rx_overruns++; + } + IGB_CORE_UNLOCK(adapter); + + /* TODO: rx_count */ + rx_done = igb_rxeof(rxr, count) ? 1 : 0; + + IGB_TX_LOCK(txr); + do { + more = igb_txeof(txr); + } while (loop-- && more); +#if __FreeBSD_version >= 800000 + if (!drbr_empty(ifp, txr->br)) + igb_mq_start_locked(ifp, txr, NULL); +#else + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + igb_start_locked(txr, ifp); +#endif + IGB_TX_UNLOCK(txr); + return POLL_RETURN_COUNT(rx_done); +} +#endif /* DEVICE_POLLING */ /********************************************************************* * @@ -1412,58 +1372,82 @@ igb_irq_fast(void *arg) * **********************************************************************/ static void -igb_msix_tx(void *arg) +igb_msix_que(void *arg) { - struct tx_ring *txr = arg; - struct adapter *adapter = txr->adapter; - u32 loop = IGB_MAX_LOOP; - bool more; + struct igb_queue *que = arg; + struct adapter *adapter = que->adapter; + struct tx_ring *txr = que->txr; + struct rx_ring *rxr = que->rxr; + u32 newitr = 0; + bool more_tx, more_rx; + + E1000_WRITE_REG(&adapter->hw, E1000_EIMC, que->eims); + ++que->irqs; - ++txr->tx_irq; IGB_TX_LOCK(txr); - - do { - more = igb_txeof(txr); - } while (loop-- && more); - + more_tx = igb_txeof(txr); IGB_TX_UNLOCK(txr); - /* Schedule a clean task */ - taskqueue_enqueue(adapter->tq, &txr->tx_task); + more_rx = igb_rxeof(rxr, adapter->rx_process_limit); - /* Reenable this interrupt */ - E1000_WRITE_REG(&adapter->hw, E1000_EIMS, txr->eims); - return; -} + if (igb_enable_aim == FALSE) + goto no_calc; + /* + ** Do Adaptive Interrupt Moderation: + ** - Write out last calculated setting + ** - Calculate based on average size over + ** the last interval. + */ + if (que->eitr_setting) + E1000_WRITE_REG(&adapter->hw, + E1000_EITR(que->msix), que->eitr_setting); + + que->eitr_setting = 0; -/********************************************************************* - * - * MSIX RX Interrupt Service routine - * - **********************************************************************/ + /* Idle, do nothing */ + if ((txr->bytes == 0) && (rxr->bytes == 0)) + goto no_calc; + + /* Used half Default if sub-gig */ + if (adapter->link_speed != 1000) + newitr = IGB_DEFAULT_ITR / 2; + else { + if ((txr->bytes) && (txr->packets)) + newitr = txr->bytes/txr->packets; + if ((rxr->bytes) && (rxr->packets)) + newitr = max(newitr, + (rxr->bytes / rxr->packets)); + newitr += 24; /* account for hardware frame, crc */ + /* set an upper boundary */ + newitr = min(newitr, 3000); + /* Be nice to the mid range */ + if ((newitr > 300) && (newitr < 1200)) + newitr = (newitr / 3); + else + newitr = (newitr / 2); + } + newitr &= 0x7FFC; /* Mask invalid bits */ + if (adapter->hw.mac.type == e1000_82575) + newitr |= newitr << 16; + else + newitr |= 0x8000000; + + /* save for next interrupt */ + que->eitr_setting = newitr; -static void -igb_msix_rx(void *arg) -{ - struct rx_ring *rxr = arg; - struct adapter *adapter = rxr->adapter; - u32 loop = IGB_MAX_LOOP; - bool more; + /* Reset state */ + txr->bytes = 0; + txr->packets = 0; + rxr->bytes = 0; + rxr->packets = 0; - ++rxr->rx_irq; - do { - more = igb_rxeof(rxr, adapter->rx_process_limit); - } while (loop-- && more); - - /* Update interrupt rate */ - if (igb_enable_aim == TRUE) - igb_update_aim(rxr); - - /* Schedule another clean */ - taskqueue_enqueue(adapter->tq, &rxr->rx_task); - - /* Reenable this interrupt */ - E1000_WRITE_REG(&adapter->hw, E1000_EIMS, rxr->eims); +no_calc: + /* Schedule a clean task if needed*/ + if (more_tx || more_rx) + taskqueue_enqueue(que->tq, &que->que_task); + else + /* Reenable this interrupt */ + E1000_WRITE_REG(&adapter->hw, E1000_EIMS, que->eims); return; } @@ -1484,8 +1468,7 @@ igb_msix_link(void *arg) icr = E1000_READ_REG(&adapter->hw, E1000_ICR); if (!(icr & E1000_ICR_LSC)) goto spurious; - adapter->hw.mac.get_link_status = 1; - igb_update_link_status(adapter); + taskqueue_enqueue(adapter->tq, &adapter->link_task); spurious: /* Rearm */ @@ -1495,59 +1478,6 @@ spurious: } -/* -** Routine to adjust the RX EITR value based on traffic, -** its a simple three state model, but seems to help. -** -** Note that the three EITR values are tuneable using -** sysctl in real time. The feature can be effectively -** nullified by setting them equal. -*/ -#define BULK_THRESHOLD 10000 -#define AVE_THRESHOLD 1600 - -static void -igb_update_aim(struct rx_ring *rxr) -{ - struct adapter *adapter = rxr->adapter; - u32 olditr, newitr; - - /* Update interrupt moderation based on traffic */ - olditr = rxr->eitr_setting; - newitr = olditr; - - /* Idle, don't change setting */ - if (rxr->bytes == 0) - return; - - if (olditr == igb_low_latency) { - if (rxr->bytes > AVE_THRESHOLD) - newitr = igb_ave_latency; - } else if (olditr == igb_ave_latency) { - if (rxr->bytes < AVE_THRESHOLD) - newitr = igb_low_latency; - else if (rxr->bytes > BULK_THRESHOLD) - newitr = igb_bulk_latency; - } else if (olditr == igb_bulk_latency) { - if (rxr->bytes < BULK_THRESHOLD) - newitr = igb_ave_latency; - } - - if (olditr != newitr) { - /* Change interrupt rate */ - rxr->eitr_setting = newitr; - if (adapter->hw.mac.type == e1000_82575) - newitr |= newitr << 16; - else - newitr |= 0x8000000; - E1000_WRITE_REG(&adapter->hw, E1000_EITR(rxr->me), newitr); - } - - rxr->bytes = 0; - return; -} - - /********************************************************************* * * Media Ioctl callback @@ -1780,15 +1710,14 @@ igb_xmit(struct tx_ring *txr, struct mbuf **m_headp) } else if (igb_tx_ctx_setup(txr, m_head)) olinfo_status |= E1000_TXD_POPTS_TXSM << 8; -#ifdef IGB_IEEE1588 - /* This is changing soon to an mtag detection */ - if (we detect this mbuf has a TSTAMP mtag) - cmd_type_len |= E1000_ADVTXD_MAC_TSTAMP; -#endif /* Calculate payload length */ olinfo_status |= ((m_head->m_pkthdr.len - hdrlen) << E1000_ADVTXD_PAYLEN_SHIFT); + /* 82575 needs the queue index added */ + if (adapter->hw.mac.type == e1000_82575) + olinfo_status |= txr->me << 4; + /* Set up our transmit descriptors */ i = txr->next_avail_desc; for (j = 0; j < nsegs; j++) { @@ -1801,8 +1730,7 @@ igb_xmit(struct tx_ring *txr, struct mbuf **m_headp) seg_len = segs[j].ds_len; txd->read.buffer_addr = htole64(seg_addr); - txd->read.cmd_type_len = htole32( - adapter->txd_cmd | cmd_type_len | seg_len); + txd->read.cmd_type_len = htole32(cmd_type_len | seg_len); txd->read.olinfo_status = htole32(olinfo_status); last = i; if (++i == adapter->num_tx_desc) @@ -1825,13 +1753,14 @@ igb_xmit(struct tx_ring *txr, struct mbuf **m_headp) * and Report Status (RS) */ txd->read.cmd_type_len |= - htole32(E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS); + htole32(E1000_ADVTXD_DCMD_EOP | E1000_ADVTXD_DCMD_RS); /* * Keep track in the first buffer which * descriptor will be written back */ tx_buffer = &txr->tx_buffers[first]; tx_buffer->next_eop = last; + txr->watchdog_time = ticks; /* * Advance the Transmit Descriptor Tail (TDT), this tells the E1000 @@ -1896,7 +1825,11 @@ igb_set_multi(struct adapter *adapter) IOCTL_DEBUGOUT("igb_set_multi: begin"); +#if __FreeBSD_version < 800000 + IF_ADDR_LOCK(ifp); +#else if_maddr_rlock(ifp); +#endif TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; @@ -1908,7 +1841,11 @@ igb_set_multi(struct adapter *adapter) &mta[mcnt * ETH_ADDR_LEN], ETH_ADDR_LEN); mcnt++; } +#if __FreeBSD_version < 800000 + IF_ADDR_UNLOCK(ifp); +#else if_maddr_runlock(ifp); +#endif if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) { reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); @@ -1920,17 +1857,20 @@ igb_set_multi(struct adapter *adapter) /********************************************************************* - * Timer routine - * - * This routine checks for link status and updates statistics. + * Timer routine: + * This routine checks for link status, + * updates statistics, and does the watchdog. * **********************************************************************/ static void igb_local_timer(void *arg) { - struct adapter *adapter = arg; - struct ifnet *ifp = adapter->ifp; + struct adapter *adapter = arg; + struct ifnet *ifp = adapter->ifp; + device_t dev = adapter->dev; + struct tx_ring *txr = adapter->tx_rings; + IGB_CORE_LOCK_ASSERT(adapter); @@ -1940,17 +1880,35 @@ igb_local_timer(void *arg) if (igb_display_debug_stats && ifp->if_drv_flags & IFF_DRV_RUNNING) igb_print_hw_stats(adapter); - /* - * Each second we check the watchdog to - * protect against hardware hangs. - */ - igb_watchdog(adapter); + /* + ** Watchdog: check for time since any descriptor was cleaned + */ + for (int i = 0; i < adapter->num_queues; i++, txr++) { + if (txr->watchdog_check == FALSE) + continue; + if ((ticks - txr->watchdog_time) > IGB_WATCHDOG) + goto timeout; + } /* Trigger an RX interrupt on all queues */ +#ifdef DEVICE_POLLING + if (!(ifp->if_capenable & IFCAP_POLLING)) +#endif E1000_WRITE_REG(&adapter->hw, E1000_EICS, adapter->rx_mask); - callout_reset(&adapter->timer, hz, igb_local_timer, adapter); + return; +timeout: + device_printf(adapter->dev, "Watchdog timeout -- resetting\n"); + device_printf(dev,"Queue(%d) tdh = %d, hw tdt = %d\n", txr->me, + E1000_READ_REG(&adapter->hw, E1000_TDH(txr->me)), + E1000_READ_REG(&adapter->hw, E1000_TDT(txr->me))); + device_printf(dev,"TX(%d) desc avail = %d," + "Next TX to Clean = %d\n", + txr->me, txr->tx_avail, txr->next_to_clean); + adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + adapter->watchdog_events++; + igb_init_locked(adapter); } static void @@ -2007,7 +1965,7 @@ igb_update_link_status(struct adapter *adapter) if_link_state_change(ifp, LINK_STATE_DOWN); /* Turn off watchdogs */ for (int i = 0; i < adapter->num_queues; i++, txr++) - txr->watchdog_timer = FALSE; + txr->watchdog_check = FALSE; } } @@ -2023,6 +1981,7 @@ igb_stop(void *arg) { struct adapter *adapter = arg; struct ifnet *ifp = adapter->ifp; + struct tx_ring *txr = adapter->tx_rings; IGB_CORE_LOCK_ASSERT(adapter); @@ -2035,6 +1994,13 @@ igb_stop(void *arg) /* Tell the stack that the interface is no longer active */ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + /* Unarm watchdog timer. */ + for (int i = 0; i < adapter->num_queues; i++, txr++) { + IGB_TX_LOCK(txr); + txr->watchdog_check = FALSE; + IGB_TX_UNLOCK(txr); + } + e1000_reset_hw(&adapter->hw); E1000_WRITE_REG(&adapter->hw, E1000_WUC, 0); } @@ -2138,6 +2104,8 @@ igb_allocate_legacy(struct adapter *adapter) * processing contexts. */ TASK_INIT(&adapter->rxtx_task, 0, igb_handle_rxtx, adapter); + /* Make tasklet for deferred link handling */ + TASK_INIT(&adapter->link_task, 0, igb_handle_link, adapter); adapter->tq = taskqueue_create_fast("igb_taskq", M_NOWAIT, taskqueue_thread_enqueue, &adapter->tq); taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s taskq", @@ -2158,96 +2126,56 @@ igb_allocate_legacy(struct adapter *adapter) /********************************************************************* * - * Setup the MSIX Interrupt handlers: + * Setup the MSIX Queue Interrupt handlers: * **********************************************************************/ static int igb_allocate_msix(struct adapter *adapter) { - device_t dev = adapter->dev; - struct tx_ring *txr = adapter->tx_rings; - struct rx_ring *rxr = adapter->rx_rings; - int error, rid, vector = 0; + device_t dev = adapter->dev; + struct igb_queue *que = adapter->queues; + int error, rid, vector = 0; - /* - * Setup the interrupt handlers - */ - /* TX Setup */ - for (int i = 0; i < adapter->num_queues; i++, vector++, txr++) { + for (int i = 0; i < adapter->num_queues; i++, vector++, que++) { rid = vector +1; - txr->res = bus_alloc_resource_any(dev, + que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE); - if (txr->res == NULL) { + if (que->res == NULL) { device_printf(dev, "Unable to allocate bus resource: " - "MSIX TX Interrupt\n"); + "MSIX Queue Interrupt\n"); return (ENXIO); } - error = bus_setup_intr(dev, txr->res, + error = bus_setup_intr(dev, que->res, INTR_TYPE_NET | INTR_MPSAFE, NULL, - igb_msix_tx, txr, &txr->tag); + igb_msix_que, que, &que->tag); if (error) { - txr->res = NULL; - device_printf(dev, "Failed to register TX handler"); + que->res = NULL; + device_printf(dev, "Failed to register Queue handler"); return (error); } - /* Make tasklet for deferred handling - one per queue */ - TASK_INIT(&txr->tx_task, 0, igb_handle_tx, txr); - txr->msix = vector; + que->msix = vector; if (adapter->hw.mac.type == e1000_82575) - txr->eims = E1000_EICR_TX_QUEUE0 << i; + que->eims = E1000_EICR_TX_QUEUE0 << i; else - txr->eims = 1 << vector; + que->eims = 1 << vector; /* ** Bind the msix vector, and thus the - ** ring to the corresponding cpu. + ** rings to the corresponding cpu. */ if (adapter->num_queues > 1) - bus_bind_intr(dev, txr->res, i); - } - - /* RX Setup */ - for (int i = 0; i < adapter->num_queues; i++, vector++, rxr++) { - rid = vector +1; - rxr->res = bus_alloc_resource_any(dev, - SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE); - if (rxr->res == NULL) { - device_printf(dev, - "Unable to allocate bus resource: " - "MSIX RX Interrupt\n"); - return (ENXIO); - } - error = bus_setup_intr(dev, rxr->res, - INTR_TYPE_NET | INTR_MPSAFE, NULL, - igb_msix_rx, rxr, &rxr->tag); - if (error) { - rxr->res = NULL; - device_printf(dev, "Failed to register RX handler"); - return (error); - } - /* Make tasklet for deferred handling - one per queue */ - TASK_INIT(&rxr->rx_task, 0, igb_handle_rx, rxr); - rxr->msix = vector; - if (adapter->hw.mac.type == e1000_82575) - rxr->eims = E1000_EICR_RX_QUEUE0 << i; - else - rxr->eims = 1 << vector; - /* Get a mask for local timer */ - adapter->rx_mask |= rxr->eims; - /* - ** Bind the msix vector, and thus the - ** ring to the corresponding cpu. - ** Notice that this makes an RX/TX pair - ** bound to each CPU, limited by the MSIX - ** vectors. - */ - if (adapter->num_queues > 1) - bus_bind_intr(dev, rxr->res, i); + bus_bind_intr(dev, que->res, i); + /* Make tasklet for deferred handling */ + TASK_INIT(&que->que_task, 0, igb_handle_que, que); + que->tq = taskqueue_create_fast("igb_que", M_NOWAIT, + taskqueue_thread_enqueue, &que->tq); + taskqueue_start_threads(&que->tq, 1, PI_NET, "%s que", + device_get_nameunit(adapter->dev)); } /* And Link */ - rid = vector +1; + rid = vector + 1; adapter->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE); if (adapter->res == NULL) { @@ -2263,9 +2191,12 @@ igb_allocate_msix(struct adapter *adapter) return (error); } adapter->linkvec = vector; - adapter->tq = taskqueue_create_fast("igb_taskq", M_NOWAIT, + + /* Make tasklet for deferred handling */ + TASK_INIT(&adapter->link_task, 0, igb_handle_link, adapter); + adapter->tq = taskqueue_create_fast("igb_link", M_NOWAIT, taskqueue_thread_enqueue, &adapter->tq); - taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s taskq", + taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s link", device_get_nameunit(adapter->dev)); return (0); @@ -2275,52 +2206,48 @@ igb_allocate_msix(struct adapter *adapter) static void igb_configure_queues(struct adapter *adapter) { - struct e1000_hw *hw = &adapter->hw; - struct tx_ring *txr; - struct rx_ring *rxr; + struct e1000_hw *hw = &adapter->hw; + struct igb_queue *que; + u32 tmp, ivar = 0; + u32 newitr = IGB_DEFAULT_ITR; + + /* First turn on RSS capability */ + if (adapter->hw.mac.type > e1000_82575) + E1000_WRITE_REG(hw, E1000_GPIE, + E1000_GPIE_MSIX_MODE | E1000_GPIE_EIAME | + E1000_GPIE_PBA | E1000_GPIE_NSICR); /* Turn on MSIX */ - /* - ** 82576 uses IVARs to route MSI/X - ** interrupts, its not very intuitive, - ** study the code carefully :) - */ - if (adapter->hw.mac.type == e1000_82576) { - u32 ivar = 0; - /* First turn on the capability */ - E1000_WRITE_REG(hw, E1000_GPIE, - E1000_GPIE_MSIX_MODE | - E1000_GPIE_EIAME | - E1000_GPIE_PBA | E1000_GPIE_NSICR); - /* RX */ + switch (adapter->hw.mac.type) { + case e1000_82580: + /* RX entries */ for (int i = 0; i < adapter->num_queues; i++) { - u32 index = i & 0x7; /* Each IVAR has two entries */ + u32 index = i >> 1; ivar = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index); - rxr = &adapter->rx_rings[i]; - if (i < 8) { - ivar &= 0xFFFFFF00; - ivar |= rxr->msix | E1000_IVAR_VALID; - } else { + que = &adapter->queues[i]; + if (i & 1) { ivar &= 0xFF00FFFF; - ivar |= (rxr->msix | E1000_IVAR_VALID) << 16; - } - E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, ivar); - adapter->eims_mask |= rxr->eims; - } - /* TX */ - for (int i = 0; i < adapter->num_queues; i++) { - u32 index = i & 0x7; /* Each IVAR has two entries */ - ivar = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index); - txr = &adapter->tx_rings[i]; - if (i < 8) { - ivar &= 0xFFFF00FF; - ivar |= (txr->msix | E1000_IVAR_VALID) << 8; + ivar |= (que->msix | E1000_IVAR_VALID) << 16; } else { - ivar &= 0x00FFFFFF; - ivar |= (txr->msix | E1000_IVAR_VALID) << 24; + ivar &= 0xFFFFFF00; + ivar |= que->msix | E1000_IVAR_VALID; } E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, ivar); - adapter->eims_mask |= txr->eims; + } + /* TX entries */ + for (int i = 0; i < adapter->num_queues; i++) { + u32 index = i >> 1; + ivar = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index); + que = &adapter->queues[i]; + if (i & 1) { + ivar &= 0x00FFFFFF; + ivar |= (que->msix | E1000_IVAR_VALID) << 24; + } else { + ivar &= 0xFFFF00FF; + ivar |= (que->msix | E1000_IVAR_VALID) << 8; + } + E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, ivar); + adapter->eims_mask |= que->eims; } /* And for the link interrupt */ @@ -2328,11 +2255,48 @@ igb_configure_queues(struct adapter *adapter) adapter->link_mask = 1 << adapter->linkvec; adapter->eims_mask |= adapter->link_mask; E1000_WRITE_REG(hw, E1000_IVAR_MISC, ivar); - } else - { /* 82575 */ - int tmp; + break; + case e1000_82576: + /* RX entries */ + for (int i = 0; i < adapter->num_queues; i++) { + u32 index = i & 0x7; /* Each IVAR has two entries */ + ivar = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index); + que = &adapter->queues[i]; + if (i < 8) { + ivar &= 0xFFFFFF00; + ivar |= que->msix | E1000_IVAR_VALID; + } else { + ivar &= 0xFF00FFFF; + ivar |= (que->msix | E1000_IVAR_VALID) << 16; + } + E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, ivar); + adapter->eims_mask |= que->eims; + } + /* TX entries */ + for (int i = 0; i < adapter->num_queues; i++) { + u32 index = i & 0x7; /* Each IVAR has two entries */ + ivar = E1000_READ_REG_ARRAY(hw, E1000_IVAR0, index); + que = &adapter->queues[i]; + if (i < 8) { + ivar &= 0xFFFF00FF; + ivar |= (que->msix | E1000_IVAR_VALID) << 8; + } else { + ivar &= 0x00FFFFFF; + ivar |= (que->msix | E1000_IVAR_VALID) << 24; + } + E1000_WRITE_REG_ARRAY(hw, E1000_IVAR0, index, ivar); + adapter->eims_mask |= que->eims; + } - /* enable MSI-X PBA support*/ + /* And for the link interrupt */ + ivar = (adapter->linkvec | E1000_IVAR_VALID) << 8; + adapter->link_mask = 1 << adapter->linkvec; + adapter->eims_mask |= adapter->link_mask; + E1000_WRITE_REG(hw, E1000_IVAR_MISC, ivar); + break; + + case e1000_82575: + /* enable MSI-X support*/ tmp = E1000_READ_REG(hw, E1000_CTRL_EXT); tmp |= E1000_CTRL_EXT_PBA_CLR; /* Auto-Mask interrupts upon ICR read. */ @@ -2340,20 +2304,15 @@ igb_configure_queues(struct adapter *adapter) tmp |= E1000_CTRL_EXT_IRCA; E1000_WRITE_REG(hw, E1000_CTRL_EXT, tmp); - /* TX */ + /* Queues */ for (int i = 0; i < adapter->num_queues; i++) { - txr = &adapter->tx_rings[i]; - E1000_WRITE_REG(hw, E1000_MSIXBM(txr->msix), - txr->eims); - adapter->eims_mask |= txr->eims; - } - - /* RX */ - for (int i = 0; i < adapter->num_queues; i++) { - rxr = &adapter->rx_rings[i]; - E1000_WRITE_REG(hw, E1000_MSIXBM(rxr->msix), - rxr->eims); - adapter->eims_mask |= rxr->eims; + que = &adapter->queues[i]; + tmp = E1000_EICR_RX_QUEUE0 << i; + tmp |= E1000_EICR_TX_QUEUE0 << i; + que->eims = tmp; + E1000_WRITE_REG_ARRAY(hw, E1000_MSIXBM(0), + i, que->eims); + adapter->eims_mask |= que->eims; } /* Link */ @@ -2361,7 +2320,21 @@ igb_configure_queues(struct adapter *adapter) E1000_EIMS_OTHER); adapter->link_mask |= E1000_EIMS_OTHER; adapter->eims_mask |= adapter->link_mask; + default: + break; } + + /* Set the starting interrupt rate */ + if (hw->mac.type == e1000_82575) + newitr |= newitr << 16; + else + newitr |= 0x8000000; + + for (int i = 0; i < adapter->num_queues; i++) { + que = &adapter->queues[i]; + E1000_WRITE_REG(hw, E1000_EITR(que->msix), newitr); + } + return; } @@ -2369,8 +2342,7 @@ igb_configure_queues(struct adapter *adapter) static void igb_free_pci_resources(struct adapter *adapter) { - struct tx_ring *txr = adapter->tx_rings; - struct rx_ring *rxr = adapter->rx_rings; + struct igb_queue *que = adapter->queues; device_t dev = adapter->dev; int rid; @@ -2386,26 +2358,17 @@ igb_free_pci_resources(struct adapter *adapter) goto mem; /* - * First release all the TX/RX interrupt resources: + * First release all the interrupt resources: */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { - rid = txr->msix + 1; - if (txr->tag != NULL) { - bus_teardown_intr(dev, txr->res, txr->tag); - txr->tag = NULL; + for (int i = 0; i < adapter->num_queues; i++, que++) { + rid = que->msix + 1; + if (que->tag != NULL) { + bus_teardown_intr(dev, que->res, que->tag); + que->tag = NULL; } - if (txr->res != NULL) - bus_release_resource(dev, SYS_RES_IRQ, rid, txr->res); - } - - for (int i = 0; i < adapter->num_queues; i++, rxr++) { - rid = rxr->msix + 1; - if (rxr->tag != NULL) { - bus_teardown_intr(dev, rxr->res, rxr->tag); - rxr->tag = NULL; - } - if (rxr->res != NULL) - bus_release_resource(dev, SYS_RES_IRQ, rid, rxr->res); + if (que->res != NULL) + bus_release_resource(dev, + SYS_RES_IRQ, rid, que->res); } /* Clean the Legacy or Link interrupt last */ @@ -2444,6 +2407,10 @@ igb_setup_msix(struct adapter *adapter) device_t dev = adapter->dev; int rid, want, queues, msgs; + /* tuneable override */ + if (igb_enable_msix == 0) + goto msi; + /* First try MSI/X */ rid = PCIR_BAR(IGB_MSIX_BAR); adapter->msix_mem = bus_alloc_resource_any(dev, @@ -2464,15 +2431,24 @@ igb_setup_msix(struct adapter *adapter) } /* Figure out a reasonable auto config value */ - queues = (mp_ncpus > ((msgs-1)/2)) ? (msgs-1)/2 : mp_ncpus; + queues = (mp_ncpus > (msgs-1)) ? (msgs-1) : mp_ncpus; + + /* Can have max of 4 queues on 82575 */ + if (adapter->hw.mac.type == e1000_82575) { + if (queues > 4) + queues = 4; + if (igb_num_queues > 4) + igb_num_queues = 4; + } if (igb_num_queues == 0) igb_num_queues = queues; + /* - ** Two vectors (RX/TX pair) per queue + ** One vector (RX/TX pair) per queue ** plus an additional for Link interrupt */ - want = (igb_num_queues * 2) + 1; + want = igb_num_queues + 1; if (msgs >= want) msgs = want; else { @@ -2497,24 +2473,70 @@ msi: /********************************************************************* * - * Initialize the hardware to a configuration - * as specified by the adapter structure. + * Set up an fresh starting state * **********************************************************************/ -static int -igb_hardware_init(struct adapter *adapter) +static void +igb_reset(struct adapter *adapter) { device_t dev = adapter->dev; - u32 rx_buffer_size; + struct e1000_hw *hw = &adapter->hw; + struct e1000_fc_info *fc = &hw->fc; + struct ifnet *ifp = adapter->ifp; + u32 pba = 0; + u16 hwm; - INIT_DEBUGOUT("igb_hardware_init: begin"); - - /* Issue a global reset */ - e1000_reset_hw(&adapter->hw); + INIT_DEBUGOUT("igb_reset: begin"); /* Let the firmware know the OS is in control */ igb_get_hw_control(adapter); + /* + * Packet Buffer Allocation (PBA) + * Writing PBA sets the receive portion of the buffer + * the remainder is used for the transmit buffer. + */ + switch (hw->mac.type) { + case e1000_82575: + pba = E1000_PBA_32K; + break; + case e1000_82576: + pba = E1000_PBA_64K; + break; + case e1000_82580: + pba = E1000_PBA_35K; + default: + break; + } + + /* Special needs in case of Jumbo frames */ + if ((hw->mac.type == e1000_82575) && (ifp->if_mtu > ETHERMTU)) { + u32 tx_space, min_tx, min_rx; + pba = E1000_READ_REG(hw, E1000_PBA); + tx_space = pba >> 16; + pba &= 0xffff; + min_tx = (adapter->max_frame_size + + sizeof(struct e1000_tx_desc) - ETHERNET_FCS_SIZE) * 2; + min_tx = roundup2(min_tx, 1024); + min_tx >>= 10; + min_rx = adapter->max_frame_size; + min_rx = roundup2(min_rx, 1024); + min_rx >>= 10; + if (tx_space < min_tx && + ((min_tx - tx_space) < pba)) { + pba = pba - (min_tx - tx_space); + /* + * if short on rx space, rx wins + * and must trump tx adjustment + */ + if (pba < min_rx) + pba = min_rx; + } + E1000_WRITE_REG(hw, E1000_PBA, pba); + } + + INIT_DEBUGOUT1("igb_init: pba=%dK",pba); + /* * These parameters control the automatic generation (Tx) and * response (Rx) to Ethernet PAUSE frames. @@ -2522,41 +2544,74 @@ igb_hardware_init(struct adapter *adapter) * received after sending an XOFF. * - Low water mark works best when it is very near the high water mark. * This allows the receiver to restart by sending XON when it has - * drained a bit. Here we use an arbitary value of 1500 which will - * restart after one full frame is pulled from the buffer. There - * could be several smaller frames in the buffer and if so they will - * not trigger the XON until their total number reduces the buffer - * by 1500. - * - The pause time is fairly large at 1000 x 512ns = 512 usec. + * drained a bit. */ - if (adapter->hw.mac.type == e1000_82576) - rx_buffer_size = ((E1000_READ_REG(&adapter->hw, - E1000_RXPBS) & 0xffff) << 10 ); - else - rx_buffer_size = ((E1000_READ_REG(&adapter->hw, - E1000_PBA) & 0xffff) << 10 ); + hwm = min(((pba << 10) * 9 / 10), + ((pba << 10) - 2 * adapter->max_frame_size)); - adapter->hw.fc.high_water = rx_buffer_size - - roundup2(adapter->max_frame_size, 1024); - adapter->hw.fc.low_water = adapter->hw.fc.high_water - 1500; + if (hw->mac.type < e1000_82576) { + fc->high_water = hwm & 0xFFF8; /* 8-byte granularity */ + fc->low_water = fc->high_water - 8; + } else { + fc->high_water = hwm & 0xFFF0; /* 16-byte granularity */ + fc->low_water = fc->high_water - 16; + } - adapter->hw.fc.pause_time = IGB_FC_PAUSE_TIME; - adapter->hw.fc.send_xon = TRUE; + fc->pause_time = IGB_FC_PAUSE_TIME; + fc->send_xon = TRUE; /* Set Flow control, use the tunable location if sane */ if ((igb_fc_setting >= 0) || (igb_fc_setting < 4)) - adapter->hw.fc.requested_mode = igb_fc_setting; + fc->requested_mode = igb_fc_setting; else - adapter->hw.fc.requested_mode = e1000_fc_none; + fc->requested_mode = e1000_fc_none; - if (e1000_init_hw(&adapter->hw) < 0) { + fc->current_mode = fc->requested_mode; + + /* Issue a global reset */ + e1000_reset_hw(hw); + E1000_WRITE_REG(hw, E1000_WUC, 0); + + if (e1000_init_hw(hw) < 0) device_printf(dev, "Hardware Initialization Failed\n"); - return (EIO); + + if (hw->mac.type == e1000_82580) { + u32 reg; + + hwm = (pba << 10) - (2 * adapter->max_frame_size); + /* + * 0x80000000 - enable DMA COAL + * 0x10000000 - use L0s as low power + * 0x20000000 - use L1 as low power + * X << 16 - exit dma coal when rx data exceeds X kB + * Y - upper limit to stay in dma coal in units of 32usecs + */ + E1000_WRITE_REG(hw, E1000_DMACR, + 0xA0000006 | ((hwm << 6) & 0x00FF0000)); + + /* set hwm to PBA - 2 * max frame size */ + E1000_WRITE_REG(hw, E1000_FCRTC, hwm); + /* + * This sets the time to wait before requesting transition to + * low power state to number of usecs needed to receive 1 512 + * byte frame at gigabit line rate + */ + E1000_WRITE_REG(hw, E1000_DMCTLX, 4); + + /* free space in tx packet buffer to wake from DMA coal */ + E1000_WRITE_REG(hw, E1000_DMCTXTH, + (20480 - (2 * adapter->max_frame_size)) >> 6); + + /* make low power state decision controlled by DMA coal */ + reg = E1000_READ_REG(hw, E1000_PCIEMISC); + E1000_WRITE_REG(hw, E1000_PCIEMISC, + reg | E1000_PCIEMISC_LX_DECISION); } - e1000_check_for_link(&adapter->hw); - - return (0); + E1000_WRITE_REG(&adapter->hw, E1000_VET, ETHERTYPE_VLAN); + e1000_get_phy_info(hw); + e1000_check_for_link(hw); + return; } /********************************************************************* @@ -2596,7 +2651,13 @@ igb_setup_interface(device_t dev, struct adapter *adapter) ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_VLAN_MTU; ifp->if_capabilities |= IFCAP_TSO4; ifp->if_capabilities |= IFCAP_JUMBO_MTU; + if (igb_header_split) + ifp->if_capabilities |= IFCAP_LRO; + ifp->if_capenable = ifp->if_capabilities; +#ifdef DEVICE_POLLING + ifp->if_capabilities |= IFCAP_POLLING; +#endif /* * Tell the upper layer(s) we support long frames. @@ -2732,22 +2793,31 @@ static int igb_allocate_queues(struct adapter *adapter) { device_t dev = adapter->dev; - struct tx_ring *txr; - struct rx_ring *rxr; + struct igb_queue *que = NULL; + struct tx_ring *txr = NULL; + struct rx_ring *rxr = NULL; int rsize, tsize, error = E1000_SUCCESS; int txconf = 0, rxconf = 0; - /* First allocate the TX ring struct memory */ + /* First allocate the top level queue structs */ + if (!(adapter->queues = + (struct igb_queue *) malloc(sizeof(struct igb_queue) * + adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) { + device_printf(dev, "Unable to allocate queue memory\n"); + error = ENOMEM; + goto fail; + } + + /* Next allocate the TX ring struct memory */ if (!(adapter->tx_rings = (struct tx_ring *) malloc(sizeof(struct tx_ring) * adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) { device_printf(dev, "Unable to allocate TX ring memory\n"); error = ENOMEM; - goto fail; + goto tx_fail; } - txr = adapter->tx_rings; - /* Next allocate the RX */ + /* Now allocate the RX */ if (!(adapter->rx_rings = (struct rx_ring *) malloc(sizeof(struct rx_ring) * adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) { @@ -2755,7 +2825,6 @@ igb_allocate_queues(struct adapter *adapter) error = ENOMEM; goto rx_fail; } - rxr = adapter->rx_rings; tsize = roundup2(adapter->num_tx_desc * sizeof(union e1000_adv_tx_desc), IGB_DBA_ALIGN); @@ -2833,6 +2902,16 @@ igb_allocate_queues(struct adapter *adapter) } } + /* + ** Finally set up the queue holding structs + */ + for (int i = 0; i < adapter->num_queues; i++) { + que = &adapter->queues[i]; + que->adapter = adapter; + que->txr = &adapter->tx_rings[i]; + que->rxr = &adapter->rx_rings[i]; + } + return (0); err_rx_desc: @@ -2843,7 +2922,12 @@ err_tx_desc: igb_dma_free(adapter, &txr->txdma); free(adapter->rx_rings, M_DEVBUF); rx_fail: +#if __FreeBSD_version >= 800000 + buf_ring_free(txr->br, M_DEVBUF); +#endif free(adapter->tx_rings, M_DEVBUF); +tx_fail: + free(adapter->queues, M_DEVBUF); fail: return (error); } @@ -2866,8 +2950,8 @@ igb_allocate_transmit_buffers(struct tx_ring *txr) /* * Setup DMA descriptor areas. */ - if ((error = bus_dma_tag_create(NULL, /* parent */ - PAGE_SIZE, 0, /* alignment, bounds */ + if ((error = bus_dma_tag_create(bus_get_dma_tag(dev), + 1, 0, /* alignment, bounds */ BUS_SPACE_MAXADDR, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ @@ -2920,6 +3004,7 @@ igb_setup_transmit_ring(struct tx_ring *txr) int i; /* Clear the old descriptor contents */ + IGB_TX_LOCK(txr); bzero((void *)txr->tx_base, (sizeof(union e1000_adv_tx_desc)) * adapter->num_tx_desc); /* Reset indices */ @@ -2945,7 +3030,7 @@ igb_setup_transmit_ring(struct tx_ring *txr) bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - + IGB_TX_UNLOCK(txr); } /********************************************************************* @@ -2973,48 +3058,50 @@ static void igb_initialize_transmit_units(struct adapter *adapter) { struct tx_ring *txr = adapter->tx_rings; + struct e1000_hw *hw = &adapter->hw; u32 tctl, txdctl; INIT_DEBUGOUT("igb_initialize_transmit_units: begin"); - /* Setup the Base and Length of the Tx Descriptor Rings */ + /* Setup the Tx Descriptor Rings */ for (int i = 0; i < adapter->num_queues; i++, txr++) { u64 bus_addr = txr->txdma.dma_paddr; - E1000_WRITE_REG(&adapter->hw, E1000_TDLEN(i), + E1000_WRITE_REG(hw, E1000_TDLEN(i), adapter->num_tx_desc * sizeof(struct e1000_tx_desc)); - E1000_WRITE_REG(&adapter->hw, E1000_TDBAH(i), + E1000_WRITE_REG(hw, E1000_TDBAH(i), (uint32_t)(bus_addr >> 32)); - E1000_WRITE_REG(&adapter->hw, E1000_TDBAL(i), + E1000_WRITE_REG(hw, E1000_TDBAL(i), (uint32_t)bus_addr); /* Setup the HW Tx Head and Tail descriptor pointers */ - E1000_WRITE_REG(&adapter->hw, E1000_TDT(i), 0); - E1000_WRITE_REG(&adapter->hw, E1000_TDH(i), 0); + E1000_WRITE_REG(hw, E1000_TDT(i), 0); + E1000_WRITE_REG(hw, E1000_TDH(i), 0); HW_DEBUGOUT2("Base = %x, Length = %x\n", - E1000_READ_REG(&adapter->hw, E1000_TDBAL(i)), - E1000_READ_REG(&adapter->hw, E1000_TDLEN(i))); + E1000_READ_REG(hw, E1000_TDBAL(i)), + E1000_READ_REG(hw, E1000_TDLEN(i))); - /* Setup Transmit Descriptor Base Settings */ - adapter->txd_cmd = E1000_TXD_CMD_IFCS; + txr->watchdog_check = FALSE; - txdctl = E1000_READ_REG(&adapter->hw, E1000_TXDCTL(i)); + txdctl = E1000_READ_REG(hw, E1000_TXDCTL(i)); + txdctl |= IGB_TX_PTHRESH; + txdctl |= IGB_TX_HTHRESH << 8; + txdctl |= IGB_TX_WTHRESH << 16; txdctl |= E1000_TXDCTL_QUEUE_ENABLE; - E1000_WRITE_REG(&adapter->hw, E1000_TXDCTL(i), txdctl); + E1000_WRITE_REG(hw, E1000_TXDCTL(i), txdctl); } /* Program the Transmit Control Register */ - tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL); + tctl = E1000_READ_REG(hw, E1000_TCTL); tctl &= ~E1000_TCTL_CT; tctl |= (E1000_TCTL_PSP | E1000_TCTL_RTLC | E1000_TCTL_EN | (E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT)); - e1000_config_collision_dist(&adapter->hw); + e1000_config_collision_dist(hw); /* This write will effectively turn on the transmit unit. */ - E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl); - + E1000_WRITE_REG(hw, E1000_TCTL, tctl); } /********************************************************************* @@ -3093,8 +3180,7 @@ igb_free_transmit_buffers(struct tx_ring *txr) /********************************************************************** * - * Setup work for hardware segmentation offload (TSO) on - * adapters using advanced tx descriptors (82575) + * Setup work for hardware segmentation offload (TSO) * **********************************************************************/ static boolean_t @@ -3165,6 +3251,9 @@ igb_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *hdrlen) /* MSS L4LEN IDX */ mss_l4len_idx |= (mp->m_pkthdr.tso_segsz << E1000_ADVTXD_MSS_SHIFT); mss_l4len_idx |= (tcp_hlen << E1000_ADVTXD_L4LEN_SHIFT); + /* 82575 needs the queue index added */ + if (adapter->hw.mac.type == e1000_82575) + mss_l4len_idx |= txr->me << 4; TXD->mss_l4len_idx = htole32(mss_l4len_idx); TXD->seqnum_seed = htole32(0); @@ -3192,7 +3281,7 @@ igb_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) struct adapter *adapter = txr->adapter; struct e1000_adv_tx_context_desc *TXD; struct igb_tx_buffer *tx_buffer; - uint32_t vlan_macip_lens = 0, type_tucmd_mlhl = 0; + u32 vlan_macip_lens, type_tucmd_mlhl, mss_l4len_idx; struct ether_vlan_header *eh; struct ip *ip = NULL; struct ip6_hdr *ip6; @@ -3204,6 +3293,7 @@ igb_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) if ((mp->m_pkthdr.csum_flags & CSUM_OFFLOAD) == 0) offload = FALSE; + vlan_macip_lens = type_tucmd_mlhl = mss_l4len_idx = 0; ctxd = txr->next_avail_desc; tx_buffer = &txr->tx_buffers[ctxd]; TXD = (struct e1000_adv_tx_context_desc *) &txr->tx_base[ctxd]; @@ -3283,11 +3373,15 @@ igb_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) break; } + /* 82575 needs the queue index added */ + if (adapter->hw.mac.type == e1000_82575) + mss_l4len_idx = txr->me << 4; + /* Now copy bits into descriptor */ TXD->vlan_macip_lens |= htole32(vlan_macip_lens); TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl); TXD->seqnum_seed = htole32(0); - TXD->mss_l4len_idx = htole32(0); + TXD->mss_l4len_idx = htole32(mss_l4len_idx); tx_buffer->m_head = NULL; tx_buffer->next_eop = -1; @@ -3314,8 +3408,7 @@ static bool igb_txeof(struct tx_ring *txr) { struct adapter *adapter = txr->adapter; - int first, last, done, num_avail; - u32 cleaned = 0; + int first, last, done; struct igb_tx_buffer *tx_buffer; struct e1000_tx_desc *tx_desc, *eop_desc; struct ifnet *ifp = adapter->ifp; @@ -3325,7 +3418,6 @@ igb_txeof(struct tx_ring *txr) if (txr->tx_avail == adapter->num_tx_desc) return FALSE; - num_avail = txr->tx_avail; first = txr->next_to_clean; tx_desc = &txr->tx_base[first]; tx_buffer = &txr->tx_buffers[first]; @@ -3343,7 +3435,7 @@ igb_txeof(struct tx_ring *txr) done = last; bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, - BUS_DMASYNC_POSTREAD); + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); while (eop_desc->upper.fields.status & E1000_TXD_STAT_DD) { /* We clean the range of the packet */ @@ -3351,10 +3443,11 @@ igb_txeof(struct tx_ring *txr) tx_desc->upper.data = 0; tx_desc->lower.data = 0; tx_desc->buffer_addr = 0; - ++num_avail; ++cleaned; + ++txr->tx_avail; if (tx_buffer->m_head) { - ifp->if_opackets++; + txr->bytes += + tx_buffer->m_head->m_pkthdr.len; bus_dmamap_sync(txr->txtag, tx_buffer->map, BUS_DMASYNC_POSTWRITE); @@ -3365,6 +3458,7 @@ igb_txeof(struct tx_ring *txr) tx_buffer->m_head = NULL; } tx_buffer->next_eop = -1; + txr->watchdog_time = ticks; if (++first == adapter->num_tx_desc) first = 0; @@ -3372,6 +3466,8 @@ igb_txeof(struct tx_ring *txr) tx_buffer = &txr->tx_buffers[first]; tx_desc = &txr->tx_base[first]; } + ++txr->packets; + ++ifp->if_opackets; /* See if we can continue to the next packet */ last = tx_buffer->next_eop; if (last != -1) { @@ -3388,26 +3484,19 @@ igb_txeof(struct tx_ring *txr) txr->next_to_clean = first; /* - * If we have enough room, clear IFF_DRV_OACTIVE to tell the stack - * that it is OK to send packets. - * If there are no pending descriptors, clear the timeout. Otherwise, - * if some descriptors have been freed, restart the timeout. + * If we have enough room, clear IFF_DRV_OACTIVE + * to tell the stack that it is OK to send packets. */ - if (num_avail > IGB_TX_CLEANUP_THRESHOLD) { + if (txr->tx_avail > IGB_TX_CLEANUP_THRESHOLD) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - /* All clean, turn off the timer */ - if (num_avail == adapter->num_tx_desc) { - txr->watchdog_timer = 0; - txr->tx_avail = num_avail; + /* All clean, turn off the watchdog */ + if (txr->tx_avail == adapter->num_tx_desc) { + txr->watchdog_check = FALSE; return FALSE; } } - /* Some cleaned, reset the timer */ - if (cleaned) - txr->watchdog_timer = IGB_TX_TIMEOUT; - txr->tx_avail = num_avail; - return TRUE; + return (TRUE); } @@ -3423,106 +3512,101 @@ static int igb_get_buf(struct rx_ring *rxr, int i, u8 clean) { struct adapter *adapter = rxr->adapter; + struct igb_rx_buf *rxbuf; struct mbuf *mh, *mp; - bus_dma_segment_t seg[2]; + bus_dma_segment_t hseg[1]; + bus_dma_segment_t pseg[1]; bus_dmamap_t map; - struct igb_rx_buffer *rx_buffer; - int error, nsegs; - int merr = 0; + int nsegs, error; - rx_buffer = &rxr->rx_buffers[i]; - - /* First get our header and payload mbuf */ - if (clean & IGB_CLEAN_HEADER) { + rxbuf = &rxr->rx_buffers[i]; + mh = mp = NULL; + if ((clean & IGB_CLEAN_HEADER) != 0) { mh = m_gethdr(M_DONTWAIT, MT_DATA); - if (mh == NULL) - goto remap; - } else /* reuse */ - mh = rxr->rx_buffers[i].m_head; - - mh->m_len = MHLEN; - mh->m_flags |= M_PKTHDR; - - if (clean & IGB_CLEAN_PAYLOAD) { - mp = m_getjcl(M_DONTWAIT, MT_DATA, - M_PKTHDR, adapter->rx_mbuf_sz); - if (mp == NULL) - goto remap; - mp->m_len = adapter->rx_mbuf_sz; - mp->m_flags &= ~M_PKTHDR; - } else { /* reusing */ - mp = rxr->rx_buffers[i].m_pack; - mp->m_len = adapter->rx_mbuf_sz; + if (mh == NULL) { + adapter->mbuf_header_failed++; + return (ENOBUFS); + } + mh->m_pkthdr.len = mh->m_len = MHLEN; + /* + * Because IGB_HDR_BUF size is less than MHLEN + * and we configure controller to split headers + * we can align mbuf on ETHER_ALIGN boundary. + */ + m_adj(mh, ETHER_ALIGN); + error = bus_dmamap_load_mbuf_sg(rxr->rx_htag, + rxr->rx_hspare_map, mh, hseg, &nsegs, 0); + if (error != 0) { + m_freem(mh); + return (error); + } + mh->m_flags &= ~M_PKTHDR; + } + if ((clean & IGB_CLEAN_PAYLOAD) != 0) { + mp = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, + adapter->rx_mbuf_sz); + if (mp == NULL) { + if (mh != NULL) { + adapter->mbuf_packet_failed++; + bus_dmamap_unload(rxr->rx_htag, + rxbuf->head_map); + mh->m_flags |= M_PKTHDR; + m_freem(mh); + } + return (ENOBUFS); + } + mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz; + error = bus_dmamap_load_mbuf_sg(rxr->rx_ptag, + rxr->rx_pspare_map, mp, pseg, &nsegs, 0); + if (error != 0) { + if (mh != NULL) { + bus_dmamap_unload(rxr->rx_htag, + rxbuf->head_map); + mh->m_flags |= M_PKTHDR; + m_freem(mh); + } + m_freem(mp); + return (error); + } mp->m_flags &= ~M_PKTHDR; } - /* - ** Need to create a chain for the following - ** dmamap call at this point. - */ - mh->m_next = mp; - mh->m_pkthdr.len = mh->m_len + mp->m_len; - /* Get the memory mapping */ - error = bus_dmamap_load_mbuf_sg(rxr->rxtag, - rxr->rx_spare_map, mh, seg, &nsegs, BUS_DMA_NOWAIT); - if (error != 0) { - printf("GET BUF: dmamap load failure - %d\n", error); - m_free(mh); - return (error); + /* Loading new DMA maps complete, unload maps for received buffers. */ + if ((clean & IGB_CLEAN_HEADER) != 0 && rxbuf->m_head != NULL) { + bus_dmamap_sync(rxr->rx_htag, rxbuf->head_map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(rxr->rx_htag, rxbuf->head_map); + } + if ((clean & IGB_CLEAN_PAYLOAD) != 0 && rxbuf->m_pack != NULL) { + bus_dmamap_sync(rxr->rx_ptag, rxbuf->pack_map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(rxr->rx_ptag, rxbuf->pack_map); } - /* Unload old mapping and update buffer struct */ - if (rx_buffer->m_head != NULL) - bus_dmamap_unload(rxr->rxtag, rx_buffer->map); - map = rx_buffer->map; - rx_buffer->map = rxr->rx_spare_map; - rxr->rx_spare_map = map; - rx_buffer->m_head = mh; - rx_buffer->m_pack = mp; - bus_dmamap_sync(rxr->rxtag, - rx_buffer->map, BUS_DMASYNC_PREREAD); - - /* Update descriptor */ - rxr->rx_base[i].read.hdr_addr = htole64(seg[0].ds_addr); - rxr->rx_base[i].read.pkt_addr = htole64(seg[1].ds_addr); + /* Reflect loaded dmamaps. */ + if ((clean & IGB_CLEAN_HEADER) != 0) { + map = rxbuf->head_map; + rxbuf->head_map = rxr->rx_hspare_map; + rxr->rx_hspare_map = map; + rxbuf->m_head = mh; + bus_dmamap_sync(rxr->rx_htag, rxbuf->head_map, + BUS_DMASYNC_PREREAD); + rxr->rx_base[i].read.hdr_addr = htole64(hseg[0].ds_addr); + } + if ((clean & IGB_CLEAN_PAYLOAD) != 0) { + map = rxbuf->pack_map; + rxbuf->pack_map = rxr->rx_pspare_map; + rxr->rx_pspare_map = map; + rxbuf->m_pack = mp; + bus_dmamap_sync(rxr->rx_ptag, rxbuf->pack_map, + BUS_DMASYNC_PREREAD); + rxr->rx_base[i].read.pkt_addr = htole64(pseg[0].ds_addr); + } return (0); - - /* - ** If we get here, we have an mbuf resource - ** issue, so we discard the incoming packet - ** and attempt to reuse existing mbufs next - ** pass thru the ring, but to do so we must - ** fix up the descriptor which had the address - ** clobbered with writeback info. - */ -remap: - adapter->mbuf_header_failed++; - merr = ENOBUFS; - /* Is there a reusable buffer? */ - mh = rxr->rx_buffers[i].m_head; - if (mh == NULL) /* Nope, init error */ - return (merr); - mp = rxr->rx_buffers[i].m_pack; - if (mp == NULL) /* Nope, init error */ - return (merr); - /* Get our old mapping */ - rx_buffer = &rxr->rx_buffers[i]; - error = bus_dmamap_load_mbuf_sg(rxr->rxtag, - rx_buffer->map, mh, seg, &nsegs, BUS_DMA_NOWAIT); - if (error != 0) { - /* We really have a problem */ - m_free(mh); - return (error); - } - /* Now fix the descriptor as needed */ - rxr->rx_base[i].read.hdr_addr = htole64(seg[0].ds_addr); - rxr->rx_base[i].read.pkt_addr = htole64(seg[1].ds_addr); - return (merr); } - /********************************************************************* * * Allocate memory for rx_buffer structures. Since we use one @@ -3536,55 +3620,82 @@ igb_allocate_receive_buffers(struct rx_ring *rxr) { struct adapter *adapter = rxr->adapter; device_t dev = adapter->dev; - struct igb_rx_buffer *rxbuf; + struct igb_rx_buf *rxbuf; int i, bsize, error; - bsize = sizeof(struct igb_rx_buffer) * adapter->num_rx_desc; + bsize = sizeof(struct igb_rx_buf) * adapter->num_rx_desc; if (!(rxr->rx_buffers = - (struct igb_rx_buffer *) malloc(bsize, + (struct igb_rx_buf *) malloc(bsize, M_DEVBUF, M_NOWAIT | M_ZERO))) { device_printf(dev, "Unable to allocate rx_buffer memory\n"); error = ENOMEM; goto fail; } - /* - ** The tag is made to accomodate the largest buffer size - ** with packet split (hence the two segments, even though - ** it may not always use this. - */ - if ((error = bus_dma_tag_create(NULL, /* parent */ - PAGE_SIZE, 0, /* alignment, bounds */ + if ((error = bus_dma_tag_create(bus_get_dma_tag(dev), + 1, 0, /* alignment, bounds */ BUS_SPACE_MAXADDR, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ - MJUM16BYTES, /* maxsize */ - 2, /* nsegments */ - MJUMPAGESIZE, /* maxsegsize */ + MSIZE, /* maxsize */ + 1, /* nsegments */ + MSIZE, /* maxsegsize */ 0, /* flags */ NULL, /* lockfunc */ NULL, /* lockfuncarg */ - &rxr->rxtag))) { + &rxr->rx_htag))) { device_printf(dev, "Unable to create RX DMA tag\n"); goto fail; } - /* Create the spare map (used by getbuf) */ - error = bus_dmamap_create(rxr->rxtag, BUS_DMA_NOWAIT, - &rxr->rx_spare_map); + if ((error = bus_dma_tag_create(bus_get_dma_tag(dev), + 1, 0, /* alignment, bounds */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MJUMPAGESIZE, /* maxsize */ + 1, /* nsegments */ + MJUMPAGESIZE, /* maxsegsize */ + 0, /* flags */ + NULL, /* lockfunc */ + NULL, /* lockfuncarg */ + &rxr->rx_ptag))) { + device_printf(dev, "Unable to create RX payload DMA tag\n"); + goto fail; + } + + /* Create the spare maps (used by getbuf) */ + error = bus_dmamap_create(rxr->rx_htag, BUS_DMA_NOWAIT, + &rxr->rx_hspare_map); if (error) { device_printf(dev, "%s: bus_dmamap_create header spare failed: %d\n", __func__, error); goto fail; } + error = bus_dmamap_create(rxr->rx_ptag, BUS_DMA_NOWAIT, + &rxr->rx_pspare_map); + if (error) { + device_printf(dev, + "%s: bus_dmamap_create packet spare failed: %d\n", + __func__, error); + goto fail; + } - for (i = 0; i < adapter->num_rx_desc; i++, rxbuf++) { + for (i = 0; i < adapter->num_rx_desc; i++) { rxbuf = &rxr->rx_buffers[i]; - error = bus_dmamap_create(rxr->rxtag, - BUS_DMA_NOWAIT, &rxbuf->map); + error = bus_dmamap_create(rxr->rx_htag, + BUS_DMA_NOWAIT, &rxbuf->head_map); if (error) { - device_printf(dev, "Unable to create RX DMA maps\n"); + device_printf(dev, + "Unable to create RX head DMA maps\n"); + goto fail; + } + error = bus_dmamap_create(rxr->rx_ptag, + BUS_DMA_NOWAIT, &rxbuf->pack_map); + if (error) { + device_printf(dev, + "Unable to create RX packet DMA maps\n"); goto fail; } } @@ -3597,6 +3708,37 @@ fail: return (error); } + +static void +igb_free_receive_ring(struct rx_ring *rxr) +{ + struct adapter *adapter; + struct igb_rx_buf *rxbuf; + int i; + + adapter = rxr->adapter; + for (i = 0; i < adapter->num_rx_desc; i++) { + rxbuf = &rxr->rx_buffers[i]; + if (rxbuf->m_head != NULL) { + bus_dmamap_sync(rxr->rx_htag, rxbuf->head_map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(rxr->rx_htag, rxbuf->head_map); + rxbuf->m_head->m_flags |= M_PKTHDR; + m_freem(rxbuf->m_head); + } + if (rxbuf->m_pack != NULL) { + bus_dmamap_sync(rxr->rx_ptag, rxbuf->pack_map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(rxr->rx_ptag, rxbuf->pack_map); + rxbuf->m_pack->m_flags |= M_PKTHDR; + m_freem(rxbuf->m_pack); + } + rxbuf->m_head = NULL; + rxbuf->m_pack = NULL; + } +} + + /********************************************************************* * * Initialize a receive ring and its buffers. @@ -3608,17 +3750,15 @@ igb_setup_receive_ring(struct rx_ring *rxr) struct adapter *adapter; struct ifnet *ifp; device_t dev; - struct igb_rx_buffer *rxbuf; struct lro_ctrl *lro = &rxr->lro; - int j, rsize; + int j, rsize, error = 0; adapter = rxr->adapter; dev = adapter->dev; ifp = adapter->ifp; - rxr->lro_enabled = FALSE; - rxr->hdr_split = FALSE; /* Clear the ring contents */ + IGB_RX_LOCK(rxr); rsize = roundup2(adapter->num_rx_desc * sizeof(union e1000_adv_rx_desc), IGB_DBA_ALIGN); bzero((void *)rxr->rx_base, rsize); @@ -3626,33 +3766,27 @@ igb_setup_receive_ring(struct rx_ring *rxr) /* ** Free current RX buffer structures and their mbufs */ - for (int i = 0; i < adapter->num_rx_desc; i++) { - rxbuf = &rxr->rx_buffers[i]; - bus_dmamap_sync(rxr->rxtag, rxbuf->map, - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(rxr->rxtag, rxbuf->map); - if (rxbuf->m_head) { - rxbuf->m_head->m_next = rxbuf->m_pack; - m_freem(rxbuf->m_head); - } - rxbuf->m_head = NULL; - rxbuf->m_pack = NULL; - } + igb_free_receive_ring(rxr); - /* Next replenish the ring */ + /* Now replenish the ring mbufs */ for (j = 0; j < adapter->num_rx_desc; j++) { - if (igb_get_buf(rxr, j, IGB_CLEAN_BOTH) == ENOBUFS) { - rxr->rx_buffers[j].m_head = NULL; - rxr->rx_buffers[j].m_pack = NULL; - rxr->rx_base[j].read.hdr_addr = 0; - rxr->rx_base[j].read.pkt_addr = 0; + if ((error = igb_get_buf(rxr, j, IGB_CLEAN_BOTH)) != 0) goto fail; - } } /* Setup our descriptor indices */ rxr->next_to_check = 0; rxr->last_cleaned = 0; + rxr->lro_enabled = FALSE; + + if (igb_header_split) + rxr->hdr_split = TRUE; + else + ifp->if_capabilities &= ~IFCAP_LRO; + + rxr->fmp = NULL; + rxr->lmp = NULL; + rxr->discard = FALSE; bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); @@ -3666,32 +3800,21 @@ igb_setup_receive_ring(struct rx_ring *rxr) if (ifp->if_capenable & IFCAP_LRO) { int err = tcp_lro_init(lro); if (err) { - device_printf(dev,"LRO Initialization failed!\n"); + device_printf(dev, "LRO Initialization failed!\n"); goto fail; } INIT_DEBUGOUT("RX LRO Initialized\n"); rxr->lro_enabled = TRUE; - rxr->hdr_split = TRUE; lro->ifp = adapter->ifp; } + IGB_RX_UNLOCK(rxr); return (0); + fail: - /* - * We need to clean up any buffers allocated - * so far, 'j' is the failing index. - */ - for (int i = 0; i < j; i++) { - rxbuf = &rxr->rx_buffers[i]; - if (rxbuf->m_head != NULL) { - bus_dmamap_sync(rxr->rxtag, rxbuf->map, - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(rxr->rxtag, rxbuf->map); - m_freem(rxbuf->m_head); - rxbuf->m_head = NULL; - } - } - return (ENOBUFS); + igb_free_receive_ring(rxr); + IGB_RX_UNLOCK(rxr); + return (error); } /********************************************************************* @@ -3719,17 +3842,8 @@ fail: */ rxr = adapter->rx_rings; for (--i; i > 0; i--, rxr++) { - for (j = 0; j < adapter->num_rx_desc; j++) { - struct igb_rx_buffer *rxbuf; - rxbuf = &rxr->rx_buffers[j]; - if (rxbuf->m_head != NULL) { - bus_dmamap_sync(rxr->rxtag, rxbuf->map, - BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(rxr->rxtag, rxbuf->map); - m_freem(rxbuf->m_head); - rxbuf->m_head = NULL; - } - } + for (j = 0; j < adapter->num_rx_desc; j++) + igb_free_receive_ring(rxr); } return (ENOBUFS); @@ -3745,6 +3859,7 @@ igb_initialize_receive_units(struct adapter *adapter) { struct rx_ring *rxr = adapter->rx_rings; struct ifnet *ifp = adapter->ifp; + struct e1000_hw *hw = &adapter->hw; u32 rctl, rxcsum, psize, srrctl = 0; INIT_DEBUGOUT("igb_initialize_receive_unit: begin"); @@ -3753,8 +3868,8 @@ igb_initialize_receive_units(struct adapter *adapter) * Make sure receives are disabled while setting * up the descriptor ring */ - rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); - E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); + rctl = E1000_READ_REG(hw, E1000_RCTL); + E1000_WRITE_REG(hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); /* ** Set up for header split @@ -3791,27 +3906,27 @@ igb_initialize_receive_units(struct adapter *adapter) u64 bus_addr = rxr->rxdma.dma_paddr; u32 rxdctl; - E1000_WRITE_REG(&adapter->hw, E1000_RDLEN(i), + E1000_WRITE_REG(hw, E1000_RDLEN(i), adapter->num_rx_desc * sizeof(struct e1000_rx_desc)); - E1000_WRITE_REG(&adapter->hw, E1000_RDBAH(i), + E1000_WRITE_REG(hw, E1000_RDBAH(i), (uint32_t)(bus_addr >> 32)); - E1000_WRITE_REG(&adapter->hw, E1000_RDBAL(i), + E1000_WRITE_REG(hw, E1000_RDBAL(i), (uint32_t)bus_addr); - E1000_WRITE_REG(&adapter->hw, E1000_SRRCTL(i), srrctl); + E1000_WRITE_REG(hw, E1000_SRRCTL(i), srrctl); /* Enable this Queue */ - rxdctl = E1000_READ_REG(&adapter->hw, E1000_RXDCTL(i)); + rxdctl = E1000_READ_REG(hw, E1000_RXDCTL(i)); rxdctl |= E1000_RXDCTL_QUEUE_ENABLE; rxdctl &= 0xFFF00000; rxdctl |= IGB_RX_PTHRESH; rxdctl |= IGB_RX_HTHRESH << 8; rxdctl |= IGB_RX_WTHRESH << 16; - E1000_WRITE_REG(&adapter->hw, E1000_RXDCTL(i), rxdctl); + E1000_WRITE_REG(hw, E1000_RXDCTL(i), rxdctl); } /* ** Setup for RX MultiQueue */ - rxcsum = E1000_READ_REG(&adapter->hw, E1000_RXCSUM); + rxcsum = E1000_READ_REG(hw, E1000_RXCSUM); if (adapter->num_queues >1) { u32 random[10], mrqc, shift = 0; union igb_reta { @@ -3827,13 +3942,13 @@ igb_initialize_receive_units(struct adapter *adapter) reta.bytes[i & 3] = (i % adapter->num_queues) << shift; if ((i & 3) == 3) - E1000_WRITE_REG(&adapter->hw, + E1000_WRITE_REG(hw, E1000_RETA(i >> 2), reta.dword); } /* Now fill in hash table */ mrqc = E1000_MRQC_ENABLE_RSS_4Q; for (int i = 0; i < 10; i++) - E1000_WRITE_REG_ARRAY(&adapter->hw, + E1000_WRITE_REG_ARRAY(hw, E1000_RSSRK(0), i, random[i]); mrqc |= (E1000_MRQC_RSS_FIELD_IPV4 | @@ -3845,7 +3960,7 @@ igb_initialize_receive_units(struct adapter *adapter) mrqc |=( E1000_MRQC_RSS_FIELD_IPV6_UDP_EX | E1000_MRQC_RSS_FIELD_IPV6_TCP_EX); - E1000_WRITE_REG(&adapter->hw, E1000_MRQC, mrqc); + E1000_WRITE_REG(hw, E1000_MRQC, mrqc); /* ** NOTE: Receive Full-Packet Checksum Offload @@ -3856,7 +3971,7 @@ igb_initialize_receive_units(struct adapter *adapter) rxcsum |= E1000_RXCSUM_PCSD; #if __FreeBSD_version >= 800000 /* For SCTP Offload */ - if ((adapter->hw.mac.type == e1000_82576) + if ((hw->mac.type == e1000_82576) && (ifp->if_capenable & IFCAP_RXCSUM)) rxcsum |= E1000_RXCSUM_CRCOFL; #endif @@ -3871,29 +3986,30 @@ igb_initialize_receive_units(struct adapter *adapter) } else rxcsum &= ~E1000_RXCSUM_TUOFL; } - E1000_WRITE_REG(&adapter->hw, E1000_RXCSUM, rxcsum); + E1000_WRITE_REG(hw, E1000_RXCSUM, rxcsum); /* Setup the Receive Control Register */ rctl &= ~(3 << E1000_RCTL_MO_SHIFT); rctl |= E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | - (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT); - + (hw->mac.mc_filter_type << E1000_RCTL_MO_SHIFT); + /* Strip CRC bytes. */ + rctl |= E1000_RCTL_SECRC; /* Make sure VLAN Filters are off */ rctl &= ~E1000_RCTL_VFE; /* Don't store bad packets */ rctl &= ~E1000_RCTL_SBP; /* Enable Receives */ - E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl); + E1000_WRITE_REG(hw, E1000_RCTL, rctl); /* * Setup the HW Rx Head and Tail Descriptor Pointers * - needs to be after enable */ for (int i = 0; i < adapter->num_queues; i++) { - E1000_WRITE_REG(&adapter->hw, E1000_RDH(i), 0); - E1000_WRITE_REG(&adapter->hw, E1000_RDT(i), + E1000_WRITE_REG(hw, E1000_RDH(i), 0); + E1000_WRITE_REG(hw, E1000_RDT(i), adapter->num_rx_desc - 1); } return; @@ -3927,48 +4043,112 @@ igb_free_receive_structures(struct adapter *adapter) static void igb_free_receive_buffers(struct rx_ring *rxr) { - struct adapter *adapter = rxr->adapter; - struct igb_rx_buffer *rx_buffer; + struct adapter *adapter = rxr->adapter; + struct igb_rx_buf *rxbuf; + int i; INIT_DEBUGOUT("free_receive_structures: begin"); - if (rxr->rx_spare_map) { - bus_dmamap_destroy(rxr->rxtag, rxr->rx_spare_map); - rxr->rx_spare_map = NULL; + if (rxr->rx_hspare_map != NULL) { + bus_dmamap_destroy(rxr->rx_htag, rxr->rx_hspare_map); + rxr->rx_hspare_map = NULL; + } + + if (rxr->rx_hspare_map != NULL) { + bus_dmamap_destroy(rxr->rx_ptag, rxr->rx_pspare_map); + rxr->rx_pspare_map = NULL; } /* Cleanup any existing buffers */ if (rxr->rx_buffers != NULL) { - rx_buffer = &rxr->rx_buffers[0]; - for (int i = 0; i < adapter->num_rx_desc; i++, rx_buffer++) { - if (rx_buffer->m_head != NULL) { - bus_dmamap_sync(rxr->rxtag, rx_buffer->map, + for (i = 0; i < adapter->num_rx_desc; i++) { + rxbuf = &rxr->rx_buffers[i]; + if (rxbuf->m_head != NULL) { + bus_dmamap_sync(rxr->rx_htag, rxbuf->head_map, BUS_DMASYNC_POSTREAD); - bus_dmamap_unload(rxr->rxtag, - rx_buffer->map); - m_freem(rx_buffer->m_head); - rx_buffer->m_head = NULL; - } else if (rx_buffer->map != NULL) - bus_dmamap_unload(rxr->rxtag, - rx_buffer->map); - if (rx_buffer->map != NULL) { - bus_dmamap_destroy(rxr->rxtag, - rx_buffer->map); - rx_buffer->map = NULL; + bus_dmamap_unload(rxr->rx_htag, + rxbuf->head_map); + rxbuf->m_head->m_flags |= M_PKTHDR; + m_freem(rxbuf->m_head); } + if (rxbuf->m_pack != NULL) { + bus_dmamap_sync(rxr->rx_ptag, rxbuf->pack_map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(rxr->rx_ptag, + rxbuf->pack_map); + rxbuf->m_pack->m_flags |= M_PKTHDR; + m_freem(rxbuf->m_pack); + } + rxbuf->m_head = NULL; + rxbuf->m_pack = NULL; + if (rxbuf->head_map != NULL) { + bus_dmamap_destroy(rxr->rx_htag, + rxbuf->head_map); + rxbuf->head_map = NULL; + } + if (rxbuf->pack_map != NULL) { + bus_dmamap_destroy(rxr->rx_ptag, + rxbuf->pack_map); + rxbuf->pack_map = NULL; + } + } + if (rxr->rx_buffers != NULL) { + free(rxr->rx_buffers, M_DEVBUF); + rxr->rx_buffers = NULL; } } - if (rxr->rx_buffers != NULL) { - free(rxr->rx_buffers, M_DEVBUF); - rxr->rx_buffers = NULL; + if (rxr->rx_htag != NULL) { + bus_dma_tag_destroy(rxr->rx_htag); + rxr->rx_htag = NULL; } - - if (rxr->rxtag != NULL) { - bus_dma_tag_destroy(rxr->rxtag); - rxr->rxtag = NULL; + if (rxr->rx_ptag != NULL) { + bus_dma_tag_destroy(rxr->rx_ptag); + rxr->rx_ptag = NULL; } } + +static __inline void +igb_rx_discard(struct rx_ring *rxr, union e1000_adv_rx_desc *cur, int i) +{ + + if (rxr->fmp != NULL) { + rxr->fmp->m_flags |= M_PKTHDR; + m_freem(rxr->fmp); + rxr->fmp = NULL; + rxr->lmp = NULL; + } +} + +static __inline void +igb_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype) +{ + + /* + * ATM LRO is only for IPv4/TCP packets and TCP checksum of the packet + * should be computed by hardware. Also it should not have VLAN tag in + * ethernet header. + */ + if (rxr->lro_enabled && + (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 && + (ptype & E1000_RXDADV_PKTTYPE_ETQF) == 0 && + (ptype & (E1000_RXDADV_PKTTYPE_IPV4 | E1000_RXDADV_PKTTYPE_TCP)) == + (E1000_RXDADV_PKTTYPE_IPV4 | E1000_RXDADV_PKTTYPE_TCP) && + (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) == + (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) { + /* + * Send to the stack if: + ** - LRO not enabled, or + ** - no LRO resources, or + ** - lro enqueue fails + */ + if (rxr->lro.lro_cnt != 0) + if (tcp_lro_rx(&rxr->lro, m, 0) == 0) + return; + } + (*ifp->if_input)(ifp, m); +} + /********************************************************************* * * This routine executes in interrupt context. It replenishes @@ -3984,45 +4164,51 @@ static bool igb_rxeof(struct rx_ring *rxr, int count) { struct adapter *adapter = rxr->adapter; - struct ifnet *ifp; + struct ifnet *ifp = adapter->ifp; struct lro_ctrl *lro = &rxr->lro; struct lro_entry *queued; - int i; - u32 staterr; + int i, prog = 0; + u32 ptype, staterr = 0; union e1000_adv_rx_desc *cur; - IGB_RX_LOCK(rxr); - ifp = adapter->ifp; - i = rxr->next_to_check; - cur = &rxr->rx_base[i]; - staterr = cur->wb.upper.status_error; - - if (!(staterr & E1000_RXD_STAT_DD)) { - IGB_RX_UNLOCK(rxr); - return FALSE; - } - - /* Sync the ring */ - bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, - BUS_DMASYNC_POSTREAD); /* Main clean loop */ - while ((staterr & E1000_RXD_STAT_DD) && - (count != 0) && - (ifp->if_drv_flags & IFF_DRV_RUNNING)) { + for (i = rxr->next_to_check; count > 0; prog++) { struct mbuf *sendmp, *mh, *mp; - u16 hlen, plen, hdr, ptype, len_adj, vtag; - u8 dopayload, accept_frame, eop; + u16 hlen, plen, hdr, vtag; + bool eop = FALSE; + u8 dopayload; - accept_frame = 1; - hlen = plen = len_adj = vtag = 0; + /* Sync the ring. */ + bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + cur = &rxr->rx_base[i]; + staterr = le32toh(cur->wb.upper.status_error); + if ((staterr & E1000_RXD_STAT_DD) == 0) + break; + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + break; + count--; sendmp = mh = mp = NULL; - ptype = (u16)(cur->wb.lower.lo_dword.data >> 4); + cur->wb.upper.status_error = 0; + plen = le16toh(cur->wb.upper.length); + ptype = le32toh(cur->wb.lower.lo_dword.data) & IGB_PKTTYPE_MASK; + hdr = le16toh(cur->wb.lower.lo_dword.hs_rss.hdr_info); + eop = ((staterr & E1000_RXD_STAT_EOP) == E1000_RXD_STAT_EOP); - /* Sync the buffers */ - bus_dmamap_sync(rxr->rxtag, rxr->rx_buffers[i].map, - BUS_DMASYNC_POSTREAD); + /* Make sure all segments of a bad packet are discarded */ + if (((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) != 0) || + (rxr->discard)) { + ifp->if_ierrors++; + ++rxr->rx_discarded; + if (!eop) /* Catch subsequent segs */ + rxr->discard = TRUE; + else + rxr->discard = FALSE; + igb_rx_discard(rxr, cur, i); + goto next_desc; + } /* ** The way the hardware is configured to @@ -4035,14 +4221,11 @@ igb_rxeof(struct rx_ring *rxr, int count) ** packet spans multiple descriptors, in that ** case only the first header is valid. */ - if ((rxr->hdr_split) && (rxr->fmp == NULL)){ - hdr = le16toh(cur-> - wb.lower.lo_dword.hs_rss.hdr_info); + if (rxr->hdr_split && rxr->fmp == NULL) { hlen = (hdr & E1000_RXDADV_HDRBUFLEN_MASK) >> E1000_RXDADV_HDRBUFLEN_SHIFT; if (hlen > IGB_HDR_BUF) hlen = IGB_HDR_BUF; - plen = le16toh(cur->wb.upper.length); /* Handle the header mbuf */ mh = rxr->rx_buffers[i].m_head; mh->m_len = hlen; @@ -4052,18 +4235,12 @@ igb_rxeof(struct rx_ring *rxr, int count) ** could be zero if its a small ** packet. */ - if (plen) { + if (plen > 0) { mp = rxr->rx_buffers[i].m_pack; mp->m_len = plen; - mp->m_next = NULL; - mp->m_flags &= ~M_PKTHDR; mh->m_next = mp; - mh->m_flags |= M_PKTHDR; dopayload = IGB_CLEAN_BOTH; rxr->rx_split_packets++; - } else { /* small packets */ - mh->m_flags &= ~M_PKTHDR; - mh->m_next = NULL; } } else { /* @@ -4072,139 +4249,75 @@ igb_rxeof(struct rx_ring *rxr, int count) ** split packet. */ mh = rxr->rx_buffers[i].m_pack; - mh->m_flags |= M_PKTHDR; - mh->m_len = le16toh(cur->wb.upper.length); + mh->m_len = plen; dopayload = IGB_CLEAN_PAYLOAD; } - if (staterr & E1000_RXD_STAT_EOP) { - count--; - eop = 1; + /* + ** get_buf will overwrite the writeback + ** descriptor so save the VLAN tag now. + */ + vtag = le16toh(cur->wb.upper.vlan); + if (igb_get_buf(rxr, i, dopayload) != 0) { + ifp->if_iqdrops++; /* - ** Strip CRC and account for frag - */ - if (mp) { - if (mp->m_len < ETHER_CRC_LEN) { - /* a frag, how much is left? */ - len_adj = ETHER_CRC_LEN - mp->m_len; - mp->m_len = 0; - } else - mp->m_len -= ETHER_CRC_LEN; - } else { /* not split */ - if (mh->m_len < ETHER_CRC_LEN) { - len_adj = ETHER_CRC_LEN - mh->m_len; - mh->m_len = 0; - } else - mh->m_len -= ETHER_CRC_LEN; - } - } else - eop = 0; - - if (staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) - accept_frame = 0; -#ifdef IGB_IEEE1588 - This linux code needs to be converted to work here - ----------------------------------------------------- - if (unlikely(staterr & E1000_RXD_STAT_TS)) { - u64 regval; - u64 ns; -// Create an mtag and set it up - struct skb_shared_hwtstamps *shhwtstamps = - skb_hwtstamps(skb); - - rd32(E1000_TSYNCRXCTL) & E1000_TSYNCRXCTL_VALID), - "igb: no RX time stamp available for time stamped packet"); - regval = rd32(E1000_RXSTMPL); - regval |= (u64)rd32(E1000_RXSTMPH) << 32; -// Do time conversion from the register - ns = timecounter_cyc2time(&adapter->clock, regval); - clocksync_update(&adapter->sync, ns); - memset(shhwtstamps, 0, sizeof(*shhwtstamps)); - shhwtstamps->hwtstamp = ns_to_ktime(ns); - shhwtstamps->syststamp = - clocksync_hw2sys(&adapter->sync, ns); - } -#endif - if (accept_frame) { - /* - ** get_buf will overwrite the writeback - ** descriptor so save the VLAN tag now. - */ - vtag = le16toh(cur->wb.upper.vlan); - if (igb_get_buf(rxr, i, dopayload) != 0) { - ifp->if_iqdrops++; - goto discard; - } - /* Initial frame - setup */ - if (rxr->fmp == NULL) { - mh->m_flags |= M_PKTHDR; - mh->m_pkthdr.len = mh->m_len; - rxr->fmp = mh; /* Store the first mbuf */ - rxr->lmp = mh; - if (mp) { /* Add payload if split */ - mh->m_pkthdr.len += mp->m_len; - rxr->lmp = mh->m_next; - } - } else { - /* Chain mbuf's together */ - mh->m_flags &= ~M_PKTHDR; - rxr->lmp->m_next = mh; - rxr->lmp = rxr->lmp->m_next; - rxr->fmp->m_pkthdr.len += mh->m_len; - /* Adjust for CRC frag */ - if (len_adj) { - rxr->lmp->m_len -= len_adj; - rxr->fmp->m_pkthdr.len -= len_adj; - } - } - - if (eop) { - bool sctp = ((ptype & 0x40) != 0); - rxr->fmp->m_pkthdr.rcvif = ifp; - ifp->if_ipackets++; - rxr->rx_packets++; - /* capture data for AIM */ - rxr->bytes += rxr->fmp->m_pkthdr.len; - rxr->rx_bytes += rxr->fmp->m_pkthdr.len; - - igb_rx_checksum(staterr, rxr->fmp, sctp); - if (staterr & E1000_RXD_STAT_VP) { - rxr->fmp->m_pkthdr.ether_vtag = vtag; - rxr->fmp->m_flags |= M_VLANTAG; - } -#if __FreeBSD_version >= 800000 - rxr->fmp->m_pkthdr.flowid = curcpu; - rxr->fmp->m_flags |= M_FLOWID; -#endif - sendmp = rxr->fmp; - rxr->fmp = NULL; - rxr->lmp = NULL; - } - } else { - ifp->if_ierrors++; -discard: - /* Reuse loaded DMA map and just update mbuf chain */ - if (hlen) { - mh = rxr->rx_buffers[i].m_head; - mh->m_len = MHLEN; - mh->m_next = NULL; - } - mp = rxr->rx_buffers[i].m_pack; - mp->m_len = mp->m_pkthdr.len = adapter->rx_mbuf_sz; - mp->m_data = mp->m_ext.ext_buf; - mp->m_next = NULL; - if (adapter->max_frame_size <= - (MCLBYTES - ETHER_ALIGN)) - m_adj(mp, ETHER_ALIGN); - if (rxr->fmp != NULL) { - /* handles the whole chain */ - m_freem(rxr->fmp); - rxr->fmp = NULL; - rxr->lmp = NULL; - } - sendmp = NULL; + * We've dropped a frame due to lack of resources + * so we should drop entire multi-segmented + * frames until we encounter EOP. + */ + if ((staterr & E1000_RXD_STAT_EOP) != 0) + rxr->discard = TRUE; + igb_rx_discard(rxr, cur, i); + goto next_desc; } + /* Initial frame - setup */ + if (rxr->fmp == NULL) { + mh->m_pkthdr.len = mh->m_len; + /* Store the first mbuf */ + rxr->fmp = mh; + rxr->lmp = mh; + if (mp != NULL) { + /* Add payload if split */ + mh->m_pkthdr.len += mp->m_len; + rxr->lmp = mh->m_next; + } + } else { + /* Chain mbuf's together */ + rxr->lmp->m_next = mh; + rxr->lmp = rxr->lmp->m_next; + rxr->fmp->m_pkthdr.len += mh->m_len; + } + + if (eop) { + rxr->fmp->m_pkthdr.rcvif = ifp; + ifp->if_ipackets++; + rxr->rx_packets++; + /* capture data for AIM */ + rxr->packets++; + rxr->bytes += rxr->fmp->m_pkthdr.len; + rxr->rx_bytes += rxr->fmp->m_pkthdr.len; + + if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) + igb_rx_checksum(staterr, rxr->fmp, ptype); + /* XXX igb(4) always strips VLAN. */ + if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 && + (staterr & E1000_RXD_STAT_VP) != 0) { + rxr->fmp->m_pkthdr.ether_vtag = vtag; + rxr->fmp->m_flags |= M_VLANTAG; + } +#if __FreeBSD_version >= 800000 + rxr->fmp->m_pkthdr.flowid = curcpu; + rxr->fmp->m_flags |= M_FLOWID; +#endif + sendmp = rxr->fmp; + /* Make sure to set M_PKTHDR. */ + sendmp->m_flags |= M_PKTHDR; + rxr->fmp = NULL; + rxr->lmp = NULL; + } + +next_desc: bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); @@ -4219,32 +4332,24 @@ discard: ** the following call so this ring's ** next_to_check is not gonna change. */ - if (sendmp != NULL) { - /* - ** Send to the stack if: - ** - LRO not enabled, or - ** - no LRO resources, or - ** - lro enqueue fails - */ - if ((!rxr->lro_enabled) || - ((!lro->lro_cnt) || (tcp_lro_rx(lro, sendmp, 0)))) - (*ifp->if_input)(ifp, sendmp); - } - - /* Get the next descriptor */ - cur = &rxr->rx_base[i]; - staterr = cur->wb.upper.status_error; + if (sendmp != NULL) + igb_rx_input(rxr, ifp, sendmp, ptype); } + + if (prog == 0) { + IGB_RX_UNLOCK(rxr); + return (FALSE); + } + rxr->next_to_check = i; - /* Advance the E1000's Receive Queue #0 "Tail Pointer". */ + /* Advance the E1000's Receive Queue "Tail Pointer". */ E1000_WRITE_REG(&adapter->hw, E1000_RDT(rxr->me), rxr->last_cleaned); /* * Flush any outstanding LRO work */ - while (!SLIST_EMPTY(&lro->lro_active)) { - queued = SLIST_FIRST(&lro->lro_active); + while ((queued = SLIST_FIRST(&lro->lro_active)) != NULL) { SLIST_REMOVE_HEAD(&lro->lro_active, next); tcp_lro_flush(lro, queued); } @@ -4255,15 +4360,12 @@ discard: ** We still have cleaning to do? ** Schedule another interrupt if so. */ - if (staterr & E1000_RXD_STAT_DD) { - E1000_WRITE_REG(&adapter->hw, E1000_EICS, rxr->eims); - return TRUE; - } + if ((staterr & E1000_RXD_STAT_DD) != 0) + return (TRUE); - return FALSE; + return (FALSE); } - /********************************************************************* * * Verify that the hardware indicated that the checksum is valid. @@ -4272,10 +4374,11 @@ discard: * *********************************************************************/ static void -igb_rx_checksum(u32 staterr, struct mbuf *mp, bool sctp) +igb_rx_checksum(u32 staterr, struct mbuf *mp, u32 ptype) { u16 status = (u16)staterr; u8 errors = (u8) (staterr >> 24); + int sctp; /* Ignore Checksum bit is set */ if (status & E1000_RXD_STAT_IXSM) { @@ -4283,6 +4386,11 @@ igb_rx_checksum(u32 staterr, struct mbuf *mp, bool sctp) return; } + if ((ptype & E1000_RXDADV_PKTTYPE_ETQF) == 0 && + (ptype & E1000_RXDADV_PKTTYPE_SCTP) != 0) + sctp = 1; + else + sctp = 0; if (status & E1000_RXD_STAT_IPCS) { /* Did it pass? */ if (!(errors & E1000_RXD_ERR_IPE)) { @@ -4302,7 +4410,7 @@ igb_rx_checksum(u32 staterr, struct mbuf *mp, bool sctp) /* Did it pass? */ if (!(errors & E1000_RXD_ERR_TCPE)) { mp->m_pkthdr.csum_flags |= type; - if (!sctp) + if (sctp == 0) mp->m_pkthdr.csum_data = htons(0xffff); } } @@ -4650,6 +4758,7 @@ static void igb_print_debug_info(struct adapter *adapter) { device_t dev = adapter->dev; + struct igb_queue *que = adapter->queues; struct rx_ring *rxr = adapter->rx_rings; struct tx_ring *txr = adapter->tx_rings; uint8_t *hw_addr = adapter->hw.hw_addr; @@ -4672,16 +4781,19 @@ igb_print_debug_info(struct adapter *adapter) adapter->hw.fc.high_water, adapter->hw.fc.low_water); - for (int i = 0; i < adapter->num_queues; i++, txr++) { - device_printf(dev, "Queue(%d) tdh = %d, tdt = %d\n", i, + for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) { + device_printf(dev, "Queue(%d) tdh = %d, tdt = %d ", i, E1000_READ_REG(&adapter->hw, E1000_TDH(i)), E1000_READ_REG(&adapter->hw, E1000_TDT(i))); + device_printf(dev, "rdh = %d, rdt = %d\n", + E1000_READ_REG(&adapter->hw, E1000_RDH(i)), + E1000_READ_REG(&adapter->hw, E1000_RDT(i))); device_printf(dev, "TX(%d) no descriptors avail event = %lld\n", txr->me, (long long)txr->no_desc_avail); - device_printf(dev, "TX(%d) MSIX IRQ Handled = %lld\n", txr->me, - (long long)txr->tx_irq); - device_printf(dev, "TX(%d) Packets sent = %lld\n", txr->me, - (long long)txr->tx_packets); + device_printf(dev, "TX(%d) Packets sent = %lld\n", + txr->me, (long long)txr->tx_packets); + device_printf(dev, "RX(%d) Packets received = %lld ", + rxr->me, (long long)rxr->rx_packets); } for (int i = 0; i < adapter->num_queues; i++, rxr++) { @@ -4691,20 +4803,20 @@ igb_print_debug_info(struct adapter *adapter) E1000_READ_REG(&adapter->hw, E1000_RDT(i))); device_printf(dev, "RX(%d) Packets received = %lld\n", rxr->me, (long long)rxr->rx_packets); - device_printf(dev, "RX(%d) Split Packets = %lld\n", rxr->me, + device_printf(dev, " Split Packets = %lld ", (long long)rxr->rx_split_packets); - device_printf(dev, "RX(%d) Byte count = %lld\n", rxr->me, + device_printf(dev, " Byte count = %lld\n", (long long)rxr->rx_bytes); - device_printf(dev, "RX(%d) MSIX IRQ Handled = %lld\n", rxr->me, - (long long)rxr->rx_irq); - device_printf(dev,"RX(%d) LRO Queued= %d\n", - rxr->me, lro->lro_queued); - device_printf(dev,"RX(%d) LRO Flushed= %d\n", - rxr->me, lro->lro_flushed); + device_printf(dev,"RX(%d) LRO Queued= %d ", + i, lro->lro_queued); + device_printf(dev,"LRO Flushed= %d\n",lro->lro_flushed); } - device_printf(dev, "LINK MSIX IRQ Handled = %u\n", adapter->link_irq); + for (int i = 0; i < adapter->num_queues; i++, que++) + device_printf(dev,"QUE(%d) IRQs = %llx\n", + i, (long long)que->irqs); + device_printf(dev, "LINK MSIX IRQ Handled = %u\n", adapter->link_irq); device_printf(dev, "Mbuf defrag failed = %ld\n", adapter->mbuf_defrag_failed); device_printf(dev, "Std mbuf header failed = %ld\n", @@ -4857,173 +4969,3 @@ igb_add_rx_process_limit(struct adapter *adapter, const char *name, SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)), OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW, limit, value, description); } - -#ifdef IGB_IEEE1588 -/* -** igb_hwtstamp_ioctl - control hardware time stamping -** -** Outgoing time stamping can be enabled and disabled. Play nice and -** disable it when requested, although it shouldn't case any overhead -** when no packet needs it. At most one packet in the queue may be -** marked for time stamping, otherwise it would be impossible to tell -** for sure to which packet the hardware time stamp belongs. -** -** Incoming time stamping has to be configured via the hardware -** filters. Not all combinations are supported, in particular event -** type has to be specified. Matching the kind of event packet is -** not supported, with the exception of "all V2 events regardless of -** level 2 or 4". -** -*/ -static int -igb_hwtstamp_ioctl(struct adapter *adapter, struct ifreq *ifr) -{ - struct e1000_hw *hw = &adapter->hw; - struct hwtstamp_ctrl *config; - u32 tsync_tx_ctl_bit = E1000_TSYNCTXCTL_ENABLED; - u32 tsync_rx_ctl_bit = E1000_TSYNCRXCTL_ENABLED; - u32 tsync_rx_ctl_type = 0; - u32 tsync_rx_cfg = 0; - int is_l4 = 0; - int is_l2 = 0; - u16 port = 319; /* PTP */ - u32 regval; - - config = (struct hwtstamp_ctrl *) ifr->ifr_data; - - /* reserved for future extensions */ - if (config->flags) - return (EINVAL); - - switch (config->tx_type) { - case HWTSTAMP_TX_OFF: - tsync_tx_ctl_bit = 0; - break; - case HWTSTAMP_TX_ON: - tsync_tx_ctl_bit = E1000_TSYNCTXCTL_ENABLED; - break; - default: - return (ERANGE); - } - - switch (config->rx_filter) { - case HWTSTAMP_FILTER_NONE: - tsync_rx_ctl_bit = 0; - break; - case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: - case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: - case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: - case HWTSTAMP_FILTER_ALL: - /* - * register TSYNCRXCFG must be set, therefore it is not - * possible to time stamp both Sync and Delay_Req messages - * => fall back to time stamping all packets - */ - tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_ALL; - config->rx_filter = HWTSTAMP_FILTER_ALL; - break; - case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: - tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L4_V1; - tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V1_SYNC_MESSAGE; - is_l4 = 1; - break; - case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: - tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L4_V1; - tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V1_DELAY_REQ_MESSAGE; - is_l4 = 1; - break; - case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: - case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: - tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L2_L4_V2; - tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V2_SYNC_MESSAGE; - is_l2 = 1; - is_l4 = 1; - config->rx_filter = HWTSTAMP_FILTER_SOME; - break; - case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: - case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: - tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_L2_L4_V2; - tsync_rx_cfg = E1000_TSYNCRXCFG_PTP_V2_DELAY_REQ_MESSAGE; - is_l2 = 1; - is_l4 = 1; - config->rx_filter = HWTSTAMP_FILTER_SOME; - break; - case HWTSTAMP_FILTER_PTP_V2_EVENT: - case HWTSTAMP_FILTER_PTP_V2_SYNC: - case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: - tsync_rx_ctl_type = E1000_TSYNCRXCTL_TYPE_EVENT_V2; - config->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; - is_l2 = 1; - break; - default: - return -ERANGE; - } - - /* enable/disable TX */ - regval = E1000_READ_REG(hw, E1000_TSYNCTXCTL); - regval = (regval & ~E1000_TSYNCTXCTL_ENABLED) | tsync_tx_ctl_bit; - E1000_WRITE_REG(hw, E1000_TSYNCTXCTL, regval); - - /* enable/disable RX, define which PTP packets are time stamped */ - regval = E1000_READ_REG(hw, E1000_TSYNCRXCTL); - regval = (regval & ~E1000_TSYNCRXCTL_ENABLED) | tsync_rx_ctl_bit; - regval = (regval & ~0xE) | tsync_rx_ctl_type; - E1000_WRITE_REG(hw, E1000_TSYNCRXCTL, regval); - E1000_WRITE_REG(hw, E1000_TSYNCRXCFG, tsync_rx_cfg); - - /* - * Ethertype Filter Queue Filter[0][15:0] = 0x88F7 - * (Ethertype to filter on) - * Ethertype Filter Queue Filter[0][26] = 0x1 (Enable filter) - * Ethertype Filter Queue Filter[0][30] = 0x1 (Enable Timestamping) - */ - E1000_WRITE_REG(hw, E1000_ETQF0, is_l2 ? 0x440088f7 : 0); - - /* L4 Queue Filter[0]: only filter by source and destination port */ - E1000_WRITE_REG(hw, E1000_SPQF0, htons(port)); - E1000_WRITE_REG(hw, E1000_IMIREXT(0), is_l4 ? - ((1<<12) | (1<<19) /* bypass size and control flags */) : 0); - E1000_WRITE_REG(hw, E1000_IMIR(0), is_l4 ? - (htons(port) - | (0<<16) /* immediate interrupt disabled */ - | 0 /* (1<<17) bit cleared: do not bypass - destination port check */) - : 0); - E1000_WRITE_REG(hw, E1000_FTQF0, is_l4 ? - (0x11 /* UDP */ - | (1<<15) /* VF not compared */ - | (1<<27) /* Enable Timestamping */ - | (7<<28) /* only source port filter enabled, - source/target address and protocol - masked */) - : ((1<<15) | (15<<28) /* all mask bits set = filter not - enabled */)); - - wrfl(); - - adapter->hwtstamp_ctrl = config; - - /* clear TX/RX time stamp registers, just to be sure */ - regval = E1000_READ_REG(hw, E1000_TXSTMPH); - regval = E1000_READ_REG(hw, E1000_RXSTMPH); - - return (error); -} - -/* -** igb_read_clock - read raw cycle counter (to be used by time counter) -*/ -static cycle_t igb_read_clock(const struct cyclecounter *tc) -{ - struct igb_adapter *adapter = - container_of(tc, struct igb_adapter, cycles); - struct e1000_hw *hw = &adapter->hw; - u64 stamp; - - stamp = E1000_READ_REG(hw, E1000_SYSTIML); - stamp |= (u64)E1000_READ_REG(hw, E1000_SYSTIMH) << 32ULL; - - return (stamp); -} - -#endif /* IGB_IEEE1588 */ diff --git a/sys/dev/e1000/if_igb.h b/sys/dev/e1000/if_igb.h index ddc4d8ae9e6a..fbcf4a03f857 100644 --- a/sys/dev/e1000/if_igb.h +++ b/sys/dev/e1000/if_igb.h @@ -1,6 +1,6 @@ /****************************************************************************** - Copyright (c) 2001-2009, Intel Corporation + Copyright (c) 2001-2010, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -128,7 +128,7 @@ /* * This parameter controls the duration of transmit watchdog timer. */ -#define IGB_TX_TIMEOUT 5 /* set to 5 seconds */ +#define IGB_WATCHDOG (10 * hz) /* * This parameter controls when the driver calls the routine to reclaim @@ -173,10 +173,16 @@ #define IGB_SMARTSPEED_DOWNSHIFT 3 #define IGB_SMARTSPEED_MAX 15 #define IGB_MAX_LOOP 10 -#define IGB_RX_PTHRESH 16 + +#define IGB_RX_PTHRESH (hw->mac.type <= e1000_82576 ? 16 : 8) #define IGB_RX_HTHRESH 8 #define IGB_RX_WTHRESH 1 +#define IGB_TX_PTHRESH 8 +#define IGB_TX_HTHRESH 1 +#define IGB_TX_WTHRESH ((hw->mac.type == e1000_82576 && \ + adapter->msix_mem) ? 1 : 16) + #define MAX_NUM_MULTICAST_ADDRESSES 128 #define PCI_ANY_ID (~0U) #define ETHER_ALIGN 2 @@ -225,6 +231,7 @@ #define IGB_TSO_SIZE (65535 + sizeof(struct ether_vlan_header)) #define IGB_TSO_SEG_SIZE 4096 /* Max dma segment size */ #define IGB_HDR_BUF 128 +#define IGB_PKTTYPE_MASK 0x0000FFF0 #define ETH_ZLEN 60 #define ETH_ADDR_LEN 6 @@ -235,17 +242,16 @@ #define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP) #endif -/* Header split codes for get_buf */ -#define IGB_CLEAN_HEADER 1 -#define IGB_CLEAN_PAYLOAD 2 -#define IGB_CLEAN_BOTH 3 +/* Define the starting Interrupt rate per Queue */ +#define IGB_INTS_PER_SEC 8000 +#define IGB_DEFAULT_ITR 1000000000/(IGB_INTS_PER_SEC * 256) + + +/* Header split codes for get_buf */ +#define IGB_CLEAN_HEADER 0x01 +#define IGB_CLEAN_PAYLOAD 0x02 +#define IGB_CLEAN_BOTH (IGB_CLEAN_HEADER | IGB_CLEAN_PAYLOAD) -/* - * Interrupt Moderation parameters - */ -#define IGB_LOW_LATENCY 128 -#define IGB_AVE_LATENCY 450 -#define IGB_BULK_LATENCY 1200 #define IGB_LINK_ITR 2000 /* Precision Time Sync (IEEE 1588) defines */ @@ -268,18 +274,33 @@ struct igb_dma_alloc { /* - * Transmit ring: one per tx queue +** Driver queue struct: this is the interrupt container +** for the associated tx and rx ring. +*/ +struct igb_queue { + struct adapter *adapter; + u32 msix; /* This queue's MSIX vector */ + u32 eims; /* This queue's EIMS bit */ + u32 eitr_setting; + struct resource *res; + void *tag; + struct tx_ring *txr; + struct rx_ring *rxr; + struct task que_task; + struct taskqueue *tq; + u64 irqs; +}; + +/* + * Transmit ring: one per queue */ struct tx_ring { struct adapter *adapter; u32 me; - u32 msix; /* This ring's MSIX vector */ - u32 eims; /* This ring's EIMS bit */ struct mtx tx_mtx; char mtx_name[16]; - struct igb_dma_alloc txdma; /* bus_dma glue for tx desc */ + struct igb_dma_alloc txdma; struct e1000_tx_desc *tx_base; - struct task tx_task; /* cleanup tasklet */ u32 next_avail_desc; u32 next_to_clean; volatile u16 tx_avail; @@ -287,37 +308,38 @@ struct tx_ring { #if __FreeBSD_version >= 800000 struct buf_ring *br; #endif - bus_dma_tag_t txtag; /* dma tag for tx */ - struct resource *res; - void *tag; + bus_dma_tag_t txtag; - u32 watchdog_timer; + u32 bytes; + u32 packets; + + bool watchdog_check; + int watchdog_time; u64 no_desc_avail; - u64 tx_irq; u64 tx_packets; }; /* - * Receive ring: one per rx queue + * Receive ring: one per queue */ struct rx_ring { struct adapter *adapter; u32 me; - u32 msix; /* This ring's MSIX vector */ - u32 eims; /* This ring's EIMS bit */ - struct igb_dma_alloc rxdma; /* bus_dma glue for tx desc */ + struct igb_dma_alloc rxdma; union e1000_adv_rx_desc *rx_base; struct lro_ctrl lro; bool lro_enabled; bool hdr_split; - struct task rx_task; /* cleanup tasklet */ + bool discard; struct mtx rx_mtx; char mtx_name[16]; u32 last_cleaned; u32 next_to_check; - struct igb_rx_buffer *rx_buffers; - bus_dma_tag_t rxtag; /* dma tag for tx */ - bus_dmamap_t rx_spare_map; + struct igb_rx_buf *rx_buffers; + bus_dma_tag_t rx_htag; /* dma tag for rx head */ + bus_dmamap_t rx_hspare_map; + bus_dma_tag_t rx_ptag; /* dma tag for rx packet */ + bus_dmamap_t rx_pspare_map; /* * First/last mbuf pointers, for * collecting multisegment RX packets. @@ -326,14 +348,11 @@ struct rx_ring { struct mbuf *lmp; u32 bytes; - u32 eitr_setting; - - struct resource *res; - void *tag; + u32 packets; /* Soft stats */ - u64 rx_irq; u64 rx_split_packets; + u64 rx_discarded; u64 rx_packets; u64 rx_bytes; }; @@ -342,7 +361,6 @@ struct adapter { struct ifnet *ifp; struct e1000_hw hw; - /* FreeBSD operating-system-specific structures. */ struct e1000_osdep osdep; struct device *dev; @@ -354,6 +372,7 @@ struct adapter { int linkvec; int link_mask; + struct task link_task; int link_irq; struct ifmedia media; @@ -364,9 +383,8 @@ struct adapter { int min_frame_size; struct mtx core_mtx; int igb_insert_vlan_header; - struct task link_task; struct task rxtx_task; - struct taskqueue *tq; /* private task queue */ + struct taskqueue *tq; /* adapter task queue */ u16 num_queues; eventhandler_tag vlan_attach; @@ -383,12 +401,14 @@ struct adapter { u16 link_duplex; u32 smartspeed; + /* Interface queues */ + struct igb_queue *queues; + /* * Transmit rings */ struct tx_ring *tx_rings; u16 num_tx_desc; - u32 txd_cmd; /* * Receive rings @@ -445,25 +465,29 @@ struct igb_tx_buffer { bus_dmamap_t map; /* bus_dma map for packet */ }; -struct igb_rx_buffer { +struct igb_rx_buf { struct mbuf *m_head; struct mbuf *m_pack; - bus_dmamap_t map; /* bus_dma map for packet */ + bus_dmamap_t head_map; /* bus_dma map for packet */ + bus_dmamap_t pack_map; /* bus_dma map for packet */ }; #define IGB_CORE_LOCK_INIT(_sc, _name) \ mtx_init(&(_sc)->core_mtx, _name, "IGB Core Lock", MTX_DEF) #define IGB_CORE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->core_mtx) -#define IGB_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->tx_mtx) -#define IGB_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_mtx) #define IGB_CORE_LOCK(_sc) mtx_lock(&(_sc)->core_mtx) -#define IGB_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_mtx) -#define IGB_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->tx_mtx) -#define IGB_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_mtx) #define IGB_CORE_UNLOCK(_sc) mtx_unlock(&(_sc)->core_mtx) -#define IGB_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->tx_mtx) -#define IGB_RX_UNLOCK(_sc) mtx_unlock(&(_sc)->rx_mtx) #define IGB_CORE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->core_mtx, MA_OWNED) + +#define IGB_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->tx_mtx) +#define IGB_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_mtx) +#define IGB_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->tx_mtx) +#define IGB_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->tx_mtx) +#define IGB_TX_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->tx_mtx, MA_OWNED) + +#define IGB_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_mtx) +#define IGB_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_mtx) +#define IGB_RX_UNLOCK(_sc) mtx_unlock(&(_sc)->rx_mtx) #define IGB_TX_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->tx_mtx, MA_OWNED) #endif /* _IGB_H_DEFINED_ */ diff --git a/sys/dev/ed/if_ed.c b/sys/dev/ed/if_ed.c index 12483a8608b0..e065a670d5cb 100644 --- a/sys/dev/ed/if_ed.c +++ b/sys/dev/ed/if_ed.c @@ -77,7 +77,8 @@ static int ed_ioctl(struct ifnet *, u_long, caddr_t); static void ed_start(struct ifnet *); static void ed_start_locked(struct ifnet *); static void ed_reset(struct ifnet *); -static void ed_watchdog(struct ifnet *); +static void ed_tick(void *); +static void ed_watchdog(struct ed_softc *); static void ed_ds_getmcaf(struct ed_softc *, uint32_t *); @@ -281,7 +282,6 @@ ed_attach(device_t dev) if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_start = ed_start; ifp->if_ioctl = ed_ioctl; - ifp->if_watchdog = ed_watchdog; ifp->if_init = ed_init; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; @@ -381,8 +381,8 @@ ed_detach(device_t dev) ed_stop(sc); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; ED_UNLOCK(sc); - callout_drain(&sc->tick_ch); ether_ifdetach(ifp); + callout_drain(&sc->tick_ch); } if (sc->irq_res != NULL && sc->irq_handle) bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); @@ -447,26 +447,42 @@ void ed_stop(struct ed_softc *sc) { ED_ASSERT_LOCKED(sc); - if (sc->sc_tick) - callout_stop(&sc->tick_ch); + callout_stop(&sc->tick_ch); ed_stop_hw(sc); } +/* + * Periodic timer used to drive the watchdog and attachment-specific + * tick handler. + */ +static void +ed_tick(void *arg) +{ + struct ed_softc *sc; + + sc = arg; + ED_ASSERT_LOCKED(sc); + if (sc->sc_tick) + sc->sc_tick(sc); + if (sc->tx_timer != 0 && --sc->tx_timer == 0) + ed_watchdog(sc); + callout_reset(&sc->tick_ch, hz, ed_tick, sc); +} + /* * Device timeout/watchdog routine. Entered if the device neglects to * generate an interrupt after a transmit has been started on it. */ static void -ed_watchdog(struct ifnet *ifp) +ed_watchdog(struct ed_softc *sc) { - struct ed_softc *sc = ifp->if_softc; + struct ifnet *ifp; + ifp = sc->ifp; log(LOG_ERR, "%s: device timeout\n", ifp->if_xname); ifp->if_oerrors++; - ED_LOCK(sc); ed_reset(ifp); - ED_UNLOCK(sc); } /* @@ -499,7 +515,7 @@ ed_init_locked(struct ed_softc *sc) /* reset transmitter flags */ sc->xmit_busy = 0; - ifp->if_timer = 0; + sc->tx_timer = 0; sc->txb_inuse = 0; sc->txb_new = 0; @@ -612,8 +628,7 @@ ed_init_locked(struct ed_softc *sc) */ ed_start_locked(ifp); - if (sc->sc_tick) - callout_reset(&sc->tick_ch, hz, sc->sc_tick, sc); + callout_reset(&sc->tick_ch, hz, ed_tick, sc); } /* @@ -622,7 +637,6 @@ ed_init_locked(struct ed_softc *sc) static __inline void ed_xmit(struct ed_softc *sc) { - struct ifnet *ifp = sc->ifp; unsigned short len; len = sc->txb_len[sc->txb_next_tx]; @@ -660,7 +674,7 @@ ed_xmit(struct ed_softc *sc) /* * Set a timer just in case we never hear from the board again */ - ifp->if_timer = 2; + sc->tx_timer = 2; } /* @@ -1023,7 +1037,7 @@ edintr(void *arg) /* * clear watchdog timer */ - ifp->if_timer = 0; + sc->tx_timer = 0; /* * Add in total number of collisions on last diff --git a/sys/dev/ed/if_ed_pccard.c b/sys/dev/ed/if_ed_pccard.c index 8ada18ea1ebe..b9c1cad334c6 100644 --- a/sys/dev/ed/if_ed_pccard.c +++ b/sys/dev/ed/if_ed_pccard.c @@ -250,7 +250,7 @@ static const struct ed_product { */ static int ed_pccard_probe(device_t); static int ed_pccard_attach(device_t); -static void ed_pccard_tick(void *); +static void ed_pccard_tick(struct ed_softc *); static int ed_pccard_dl100xx(device_t dev, const struct ed_product *); static void ed_pccard_dl100xx_mii_reset(struct ed_softc *sc); @@ -1196,9 +1196,8 @@ ed_child_detached(device_t dev, device_t child) } static void -ed_pccard_tick(void *arg) +ed_pccard_tick(struct ed_softc *sc) { - struct ed_softc *sc = arg; struct mii_data *mii; int media = 0; @@ -1223,7 +1222,6 @@ ed_pccard_tick(void *arg) } } - callout_reset(&sc->tick_ch, hz, ed_pccard_tick, sc); } static device_method_t ed_pccard_methods[] = { diff --git a/sys/dev/ed/if_edvar.h b/sys/dev/ed/if_edvar.h index 56e241ad797c..e344cd5f8f75 100644 --- a/sys/dev/ed/if_edvar.h +++ b/sys/dev/ed/if_edvar.h @@ -65,11 +65,12 @@ struct ed_softc { void (*mii_writebits)(struct ed_softc *, u_int, int); u_int (*mii_readbits)(struct ed_softc *, int); struct callout tick_ch; - void (*sc_tick)(void *); + void (*sc_tick)(struct ed_softc *); void (*readmem)(struct ed_softc *sc, bus_size_t src, uint8_t *dst, uint16_t amount); u_short (*sc_write_mbufs)(struct ed_softc *, struct mbuf *, bus_size_t); + int tx_timer; int nic_offset; /* NIC (DS8390) I/O bus address offset */ int asic_offset; /* ASIC I/O bus address offset */ diff --git a/sys/dev/ep/if_ep.c b/sys/dev/ep/if_ep.c index c5b516c783ea..59dd1c4cc99a 100644 --- a/sys/dev/ep/if_ep.c +++ b/sys/dev/ep/if_ep.c @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -91,10 +92,12 @@ static int ep_media2if_media[] = static void epinit(void *); static int epioctl(struct ifnet *, u_long, caddr_t); static void epstart(struct ifnet *); -static void epwatchdog(struct ifnet *); +static void ep_intr_locked(struct ep_softc *); static void epstart_locked(struct ifnet *); static void epinit_locked(struct ep_softc *); +static void eptick(void *); +static void epwatchdog(struct ep_softc *); /* if_media functions */ static int ep_ifmedia_upd(struct ifnet *); @@ -302,12 +305,12 @@ ep_attach(struct ep_softc *sc) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_start = epstart; ifp->if_ioctl = epioctl; - ifp->if_watchdog = epwatchdog; ifp->if_init = epinit; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); + callout_init_mtx(&sc->watchdog_timer, &sc->sc_mtx, 0); if (!sc->epb.mii_trans) { ifmedia_init(&sc->ifmedia, 0, ep_ifmedia_upd, ep_ifmedia_sts); @@ -361,6 +364,7 @@ ep_detach(device_t dev) ifp->if_drv_flags &= ~IFF_DRV_RUNNING; EP_UNLOCK(sc); ether_ifdetach(ifp); + callout_drain(&sc->watchdog_timer); ep_free(dev); if_free(ifp); @@ -457,6 +461,7 @@ epinit_locked(struct ep_softc *sc) GO_WINDOW(sc, 1); epstart_locked(ifp); + callout_reset(&sc->watchdog_timer, hz, eptick, sc); } static void @@ -556,7 +561,7 @@ startagain: BPF_MTAP(ifp, m0); - ifp->if_timer = 2; + sc->tx_timer = 2; ifp->if_opackets++; m_freem(m0); @@ -583,20 +588,26 @@ void ep_intr(void *arg) { struct ep_softc *sc; - int status; - struct ifnet *ifp; sc = (struct ep_softc *) arg; EP_LOCK(sc); + ep_intr_locked(sc); + EP_UNLOCK(sc); +} + +static void +ep_intr_locked(struct ep_softc *sc) +{ + int status; + struct ifnet *ifp; + /* XXX 4.x splbio'd here to reduce interruptability */ /* * quick fix: Try to detect an interrupt when the card goes away. */ - if (sc->gone || CSR_READ_2(sc, EP_STATUS) == 0xffff) { - EP_UNLOCK(sc); + if (sc->gone || CSR_READ_2(sc, EP_STATUS) == 0xffff) return; - } ifp = sc->ifp; CSR_WRITE_2(sc, EP_COMMAND, SET_INTR_MASK); /* disable all Ints */ @@ -612,14 +623,14 @@ rescan: epread(sc); if (status & S_TX_AVAIL) { /* we need ACK */ - ifp->if_timer = 0; + sc->tx_timer = 0; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; GO_WINDOW(sc, 1); CSR_READ_2(sc, EP_W1_FREE_TX); epstart_locked(ifp); } if (status & S_CARD_FAILURE) { - ifp->if_timer = 0; + sc->tx_timer = 0; #ifdef EP_LOCAL_STATS device_printf(sc->dev, "\n\tStatus: %x\n", status); GO_WINDOW(sc, 4); @@ -642,11 +653,10 @@ rescan: #endif epinit_locked(sc); - EP_UNLOCK(sc); return; } if (status & S_TX_COMPLETE) { - ifp->if_timer = 0; + sc->tx_timer = 0; /* * We need ACK. We do it at the end. * @@ -700,7 +710,6 @@ rescan: /* re-enable Ints */ CSR_WRITE_2(sc, EP_COMMAND, SET_INTR_MASK | S_5_INTS); - EP_UNLOCK(sc); } static void @@ -806,7 +815,7 @@ read_again: #endif EP_FRST(sc, F_RX_FIRST); status = CSR_READ_2(sc, EP_W1_RX_STATUS); - if (!status & ERR_RX_INCOMPLETE) { + if (!(status & ERR_RX_INCOMPLETE)) { /* * We see if by now, the packet has completly * arrived @@ -933,7 +942,6 @@ epioctl(struct ifnet *ifp, u_long cmd, caddr_t data) EP_LOCK(sc); if (((ifp->if_flags & IFF_UP) == 0) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) { - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; epstop(sc); } else /* reinitialize card on any parameter change */ @@ -966,15 +974,27 @@ epioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } static void -epwatchdog(struct ifnet *ifp) +eptick(void *arg) { - struct ep_softc *sc = ifp->if_softc; + struct ep_softc *sc; + sc = arg; + if (sc->tx_timer != 0 && --sc->tx_timer == 0) + epwatchdog(sc); + callout_reset(&sc->watchdog_timer, hz, eptick, sc); +} + +static void +epwatchdog(struct ep_softc *sc) +{ + struct ifnet *ifp; + + ifp = sc->ifp; if (sc->gone) return; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - epstart(ifp); - ep_intr(ifp->if_softc); + epstart_locked(ifp); + ep_intr_locked(sc); } static void @@ -997,4 +1017,7 @@ epstop(struct ep_softc *sc) CSR_WRITE_2(sc, EP_COMMAND, SET_RD_0_MASK); CSR_WRITE_2(sc, EP_COMMAND, SET_INTR_MASK); CSR_WRITE_2(sc, EP_COMMAND, SET_RX_FILTER); + + sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + callout_stop(&sc->watchdog_timer); } diff --git a/sys/dev/ep/if_epvar.h b/sys/dev/ep/if_epvar.h index 922a264620bc..c7b9cb39d5b0 100644 --- a/sys/dev/ep/if_epvar.h +++ b/sys/dev/ep/if_epvar.h @@ -45,6 +45,9 @@ struct ep_softc { bus_space_tag_t bst; void *ep_intrhand; + struct callout watchdog_timer; + int tx_timer; + u_short ep_connectors; /* Connectors on this card. */ u_char ep_connector; /* Configured connector. */ diff --git a/sys/dev/et/if_et.c b/sys/dev/et/if_et.c index 1e28f0be112e..77ee4ab8d497 100644 --- a/sys/dev/et/if_et.c +++ b/sys/dev/et/if_et.c @@ -32,9 +32,11 @@ * SUCH DAMAGE. * * $DragonFly: src/sys/dev/netif/et/if_et.c,v 1.10 2008/05/18 07:47:14 sephe Exp $ - * $FreeBSD$ */ +#include +__FBSDID("$FreeBSD$"); + #include #include #include @@ -76,6 +78,12 @@ MODULE_DEPEND(et, pci, 1, 1, 1); MODULE_DEPEND(et, ether, 1, 1, 1); MODULE_DEPEND(et, miibus, 1, 1, 1); +/* Tunables. */ +static int msi_disable = 0; +TUNABLE_INT("hw.et.msi_disable", &msi_disable); + +#define ET_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) + static int et_probe(device_t); static int et_attach(device_t); static int et_detach(device_t); @@ -138,7 +146,7 @@ static int et_stop_rxdma(struct et_softc *); static int et_stop_txdma(struct et_softc *); static int et_enable_txrx(struct et_softc *, int); static void et_reset(struct et_softc *); -static int et_bus_config(device_t); +static int et_bus_config(struct et_softc *); static void et_get_eaddr(device_t, uint8_t[]); static void et_setmulti(struct et_softc *); static void et_tick(void *); @@ -218,10 +226,10 @@ et_probe(device_t dev) for (d = et_devices; d->desc != NULL; ++d) { if (vid == d->vid && did == d->did) { device_set_desc(dev, d->desc); - return 0; + return (0); } } - return ENXIO; + return (ENXIO); } static int @@ -230,7 +238,7 @@ et_attach(device_t dev) struct et_softc *sc; struct ifnet *ifp; uint8_t eaddr[ETHER_ADDR_LEN]; - int error; + int cap, error, msic; sc = device_get_softc(dev); sc->dev = dev; @@ -263,25 +271,48 @@ et_attach(device_t dev) &sc->sc_mem_rid, RF_ACTIVE); if (sc->sc_mem_res == NULL) { device_printf(dev, "can't allocate IO memory\n"); - return ENXIO; + return (ENXIO); + } + + msic = 0; + if (pci_find_extcap(dev, PCIY_EXPRESS, &cap) == 0) { + sc->sc_expcap = cap; + sc->sc_flags |= ET_FLAG_PCIE; + msic = pci_msi_count(dev); + if (bootverbose) + device_printf(dev, "MSI count: %d\n", msic); + } + if (msic > 0 && msi_disable == 0) { + msic = 1; + if (pci_alloc_msi(dev, &msic) == 0) { + if (msic == 1) { + device_printf(dev, "Using %d MSI message\n", + msic); + sc->sc_flags |= ET_FLAG_MSI; + } else + pci_release_msi(dev); + } } - sc->sc_mem_bt = rman_get_bustag(sc->sc_mem_res); - sc->sc_mem_bh = rman_get_bushandle(sc->sc_mem_res); /* * Allocate IRQ */ - sc->sc_irq_rid = 0; - sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &sc->sc_irq_rid, - RF_SHAREABLE | RF_ACTIVE); + if ((sc->sc_flags & ET_FLAG_MSI) == 0) { + sc->sc_irq_rid = 0; + sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, + &sc->sc_irq_rid, RF_SHAREABLE | RF_ACTIVE); + } else { + sc->sc_irq_rid = 1; + sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, + &sc->sc_irq_rid, RF_ACTIVE); + } if (sc->sc_irq_res == NULL) { device_printf(dev, "can't allocate irq\n"); error = ENXIO; goto fail; } - error = et_bus_config(dev); + error = et_bus_config(sc); if (error) goto fail; @@ -305,7 +336,7 @@ et_attach(device_t dev) ifp->if_ioctl = et_ioctl; ifp->if_start = et_start; ifp->if_mtu = ETHERMTU; - ifp->if_capabilities = IFCAP_VLAN_MTU; + ifp->if_capabilities = IFCAP_TXCSUM | IFCAP_VLAN_MTU; ifp->if_capenable = ifp->if_capabilities; IFQ_SET_MAXLEN(&ifp->if_snd, ET_TX_NDESC); IFQ_SET_READY(&ifp->if_snd); @@ -322,14 +353,8 @@ et_attach(device_t dev) ether_ifattach(ifp, eaddr); callout_init_mtx(&sc->sc_tick, &sc->sc_mtx, 0); -#if __FreeBSD_version > 700030 error = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_NET | INTR_MPSAFE, - NULL, et_intr, sc, &sc->sc_irq_handle); -#else - error = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_NET | INTR_MPSAFE, - et_intr, sc, &sc->sc_irq_handle); -#endif - + NULL, et_intr, sc, &sc->sc_irq_handle); if (error) { ether_ifdetach(ifp); device_printf(dev, "can't setup intr\n"); @@ -338,10 +363,10 @@ et_attach(device_t dev) et_add_sysctls(sc); - return 0; + return (0); fail: et_detach(dev); - return error; + return (error); } static int @@ -368,6 +393,8 @@ et_detach(device_t dev) bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid, sc->sc_irq_res); } + if ((sc->sc_flags & ET_FLAG_MSI) != 0) + pci_release_msi(dev); if (sc->sc_mem_res != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mem_rid, @@ -378,9 +405,10 @@ et_detach(device_t dev) if_free(sc->ifp); et_dma_free(dev); - /* XXX Destroy lock here */ - return 0; + mtx_destroy(&sc->sc_mtx); + + return (0); } static int @@ -391,7 +419,7 @@ et_shutdown(device_t dev) ET_LOCK(sc); et_stop(sc); ET_UNLOCK(sc); - return 0; + return (0); } static int @@ -404,8 +432,8 @@ et_miibus_readreg(device_t dev, int phy, int reg) /* Stop any pending operations */ CSR_WRITE_4(sc, ET_MII_CMD, 0); - val = __SHIFTIN(phy, ET_MII_ADDR_PHY) | - __SHIFTIN(reg, ET_MII_ADDR_REG); + val = (phy << ET_MII_ADDR_PHY_SHIFT) & ET_MII_ADDR_PHY_MASK; + val |= (reg << ET_MII_ADDR_REG_SHIFT) & ET_MII_ADDR_REG_MASK; CSR_WRITE_4(sc, ET_MII_ADDR, val); /* Start reading */ @@ -429,12 +457,12 @@ et_miibus_readreg(device_t dev, int phy, int reg) #undef NRETRY val = CSR_READ_4(sc, ET_MII_STAT); - ret = __SHIFTOUT(val, ET_MII_STAT_VALUE); + ret = val & ET_MII_STAT_VALUE_MASK; back: /* Make sure that the current operation is stopped */ CSR_WRITE_4(sc, ET_MII_CMD, 0); - return ret; + return (ret); } static int @@ -447,12 +475,13 @@ et_miibus_writereg(device_t dev, int phy, int reg, int val0) /* Stop any pending operations */ CSR_WRITE_4(sc, ET_MII_CMD, 0); - val = __SHIFTIN(phy, ET_MII_ADDR_PHY) | - __SHIFTIN(reg, ET_MII_ADDR_REG); + val = (phy << ET_MII_ADDR_PHY_SHIFT) & ET_MII_ADDR_PHY_MASK; + val |= (reg << ET_MII_ADDR_REG_SHIFT) & ET_MII_ADDR_REG_MASK; CSR_WRITE_4(sc, ET_MII_ADDR, val); /* Start writing */ - CSR_WRITE_4(sc, ET_MII_CTRL, __SHIFTIN(val0, ET_MII_CTRL_VALUE)); + CSR_WRITE_4(sc, ET_MII_CTRL, + (val0 << ET_MII_CTRL_VALUE_SHIFT) & ET_MII_CTRL_VALUE_MASK); #define NRETRY 100 @@ -472,7 +501,7 @@ et_miibus_writereg(device_t dev, int phy, int reg, int val0) /* Make sure that the current operation is stopped */ CSR_WRITE_4(sc, ET_MII_CMD, 0); - return 0; + return (0); } static void @@ -495,7 +524,7 @@ et_ifmedia_upd_locked(struct ifnet *ifp) } mii_mediachg(mii); - return 0; + return (0); } static int @@ -508,7 +537,7 @@ et_ifmedia_upd(struct ifnet *ifp) res = et_ifmedia_upd_locked(ifp); ET_UNLOCK(sc); - return res; + return (res); } static void @@ -550,7 +579,7 @@ et_stop(struct et_softc *sc) } static int -et_bus_config(device_t dev) +et_bus_config(struct et_softc *sc) { uint32_t val, max_plsz; uint16_t ack_latency, replay_timer; @@ -559,21 +588,25 @@ et_bus_config(device_t dev) * Test whether EEPROM is valid * NOTE: Read twice to get the correct value */ - pci_read_config(dev, ET_PCIR_EEPROM_STATUS, 1); - val = pci_read_config(dev, ET_PCIR_EEPROM_STATUS, 1); + pci_read_config(sc->dev, ET_PCIR_EEPROM_STATUS, 1); + val = pci_read_config(sc->dev, ET_PCIR_EEPROM_STATUS, 1); if (val & ET_PCIM_EEPROM_STATUS_ERROR) { - device_printf(dev, "EEPROM status error 0x%02x\n", val); - return ENXIO; + device_printf(sc->dev, "EEPROM status error 0x%02x\n", val); + return (ENXIO); } /* TODO: LED */ + if ((sc->sc_flags & ET_FLAG_PCIE) == 0) + return (0); + /* * Configure ACK latency and replay timer according to * max playload size */ - val = pci_read_config(dev, ET_PCIR_DEVICE_CAPS, 4); - max_plsz = val & ET_PCIM_DEVICE_CAPS_MAX_PLSZ; + val = pci_read_config(sc->dev, + sc->sc_expcap + PCIR_EXPRESS_DEVICE_CAP, 4); + max_plsz = val & PCIM_EXP_CAP_MAX_PAYLOAD; switch (max_plsz) { case ET_PCIV_DEVICE_CAPS_PLSZ_128: @@ -587,32 +620,41 @@ et_bus_config(device_t dev) break; default: - ack_latency = pci_read_config(dev, ET_PCIR_ACK_LATENCY, 2); - replay_timer = pci_read_config(dev, ET_PCIR_REPLAY_TIMER, 2); - device_printf(dev, "ack latency %u, replay timer %u\n", + ack_latency = pci_read_config(sc->dev, ET_PCIR_ACK_LATENCY, 2); + replay_timer = pci_read_config(sc->dev, + ET_PCIR_REPLAY_TIMER, 2); + device_printf(sc->dev, "ack latency %u, replay timer %u\n", ack_latency, replay_timer); break; } if (ack_latency != 0) { - pci_write_config(dev, ET_PCIR_ACK_LATENCY, ack_latency, 2); - pci_write_config(dev, ET_PCIR_REPLAY_TIMER, replay_timer, 2); + pci_write_config(sc->dev, ET_PCIR_ACK_LATENCY, ack_latency, 2); + pci_write_config(sc->dev, ET_PCIR_REPLAY_TIMER, replay_timer, + 2); } /* * Set L0s and L1 latency timer to 2us */ - val = ET_PCIV_L0S_LATENCY(2) | ET_PCIV_L1_LATENCY(2); - pci_write_config(dev, ET_PCIR_L0S_L1_LATENCY, val, 1); + val = pci_read_config(sc->dev, ET_PCIR_L0S_L1_LATENCY, 4); + val &= ~(PCIM_LINK_CAP_L0S_EXIT | PCIM_LINK_CAP_L1_EXIT); + /* L0s exit latency : 2us */ + val |= 0x00005000; + /* L1 exit latency : 2us */ + val |= 0x00028000; + pci_write_config(sc->dev, ET_PCIR_L0S_L1_LATENCY, val, 4); /* * Set max read request size to 2048 bytes */ - val = pci_read_config(dev, ET_PCIR_DEVICE_CTRL, 2); - val &= ~ET_PCIM_DEVICE_CTRL_MAX_RRSZ; + val = pci_read_config(sc->dev, + sc->sc_expcap + PCIR_EXPRESS_DEVICE_CTL, 2); + val &= ~PCIM_EXP_CTL_MAX_READ_REQUEST; val |= ET_PCIV_DEVICE_CTRL_RRSZ_2K; - pci_write_config(dev, ET_PCIR_DEVICE_CTRL, val, 2); + pci_write_config(sc->dev, + sc->sc_expcap + PCIR_EXPRESS_DEVICE_CTL, val, 2); - return 0; + return (0); } static void @@ -684,7 +726,7 @@ et_dma_alloc(device_t dev) 0, NULL, NULL, &sc->sc_dtag); if (error) { device_printf(dev, "can't create DMA tag\n"); - return error; + return (error); } /* @@ -695,7 +737,7 @@ et_dma_alloc(device_t dev) &tx_ring->tr_paddr, &tx_ring->tr_dmap); if (error) { device_printf(dev, "can't create TX ring DMA stuffs\n"); - return error; + return (error); } /* @@ -706,7 +748,7 @@ et_dma_alloc(device_t dev) &txsd->txsd_paddr, &txsd->txsd_dmap); if (error) { device_printf(dev, "can't create TX status DMA stuffs\n"); - return error; + return (error); } /* @@ -726,7 +768,7 @@ et_dma_alloc(device_t dev) if (error) { device_printf(dev, "can't create DMA stuffs for " "the %d RX ring\n", i); - return error; + return (error); } rx_ring->rr_posreg = rx_ring_posreg[i]; } @@ -740,7 +782,7 @@ et_dma_alloc(device_t dev) &rxst_ring->rsr_paddr, &rxst_ring->rsr_dmap); if (error) { device_printf(dev, "can't create RX stat ring DMA stuffs\n"); - return error; + return (error); } /* @@ -752,7 +794,7 @@ et_dma_alloc(device_t dev) &rxsd->rxsd_paddr, &rxsd->rxsd_dmap); if (error) { device_printf(dev, "can't create RX status DMA stuffs\n"); - return error; + return (error); } /* @@ -760,9 +802,9 @@ et_dma_alloc(device_t dev) */ error = et_dma_mbuf_create(dev); if (error) - return error; + return (error); - return 0; + return (0); } static void @@ -841,7 +883,7 @@ et_dma_mbuf_create(device_t dev) BUS_DMA_ALLOCNOW, NULL, NULL, &sc->sc_mbuf_dtag); if (error) { device_printf(dev, "can't create mbuf DMA tag\n"); - return error; + return (error); } /* @@ -852,7 +894,7 @@ et_dma_mbuf_create(device_t dev) device_printf(dev, "can't create spare mbuf DMA map\n"); bus_dma_tag_destroy(sc->sc_mbuf_dtag); sc->sc_mbuf_dtag = NULL; - return error; + return (error); } /* @@ -871,7 +913,7 @@ et_dma_mbuf_create(device_t dev) "for %d RX ring\n", j, i); rx_done[i] = j; et_dma_mbuf_destroy(dev, 0, rx_done); - return error; + return (error); } } rx_done[i] = ET_RX_NDESC; @@ -890,11 +932,11 @@ et_dma_mbuf_create(device_t dev) device_printf(dev, "can't create %d TX mbuf " "DMA map\n", i); et_dma_mbuf_destroy(dev, i, rx_done); - return error; + return (error); } } - return 0; + return (0); } static void @@ -959,7 +1001,7 @@ et_dma_mem_create(device_t dev, bus_size_t size, bus_dma_tag_t *dtag, 0, NULL, NULL, dtag); if (error) { device_printf(dev, "can't create DMA tag\n"); - return error; + return (error); } error = bus_dmamem_alloc(*dtag, addr, BUS_DMA_WAITOK | BUS_DMA_ZERO, @@ -968,7 +1010,7 @@ et_dma_mem_create(device_t dev, bus_size_t size, bus_dma_tag_t *dtag, device_printf(dev, "can't allocate DMA mem\n"); bus_dma_tag_destroy(*dtag); *dtag = NULL; - return error; + return (error); } error = bus_dmamap_load(*dtag, *dmap, *addr, size, @@ -978,9 +1020,9 @@ et_dma_mem_create(device_t dev, bus_size_t size, bus_dma_tag_t *dtag, bus_dmamem_free(*dtag, *addr, *dmap); bus_dma_tag_destroy(*dtag); *dtag = NULL; - return error; + return (error); } - return 0; + return (0); } static void @@ -1021,10 +1063,10 @@ et_chip_attach(struct et_softc *sc) /* * Setup half duplex mode */ - val = __SHIFTIN(10, ET_MAC_HDX_ALT_BEB_TRUNC) | - __SHIFTIN(15, ET_MAC_HDX_REXMIT_MAX) | - __SHIFTIN(55, ET_MAC_HDX_COLLWIN) | - ET_MAC_HDX_EXC_DEFER; + val = (10 << ET_MAC_HDX_ALT_BEB_TRUNC_SHIFT) | + (15 << ET_MAC_HDX_REXMIT_MAX_SHIFT) | + (55 << ET_MAC_HDX_COLLWIN_SHIFT) | + ET_MAC_HDX_EXC_DEFER; CSR_WRITE_4(sc, ET_MAC_HDX, val); /* Clear MAC control */ @@ -1137,7 +1179,7 @@ et_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) struct et_softc *sc = ifp->if_softc; struct mii_data *mii = device_get_softc(sc->sc_miibus); struct ifreq *ifr = (struct ifreq *)data; - int error = 0, max_framelen; + int error = 0, mask, max_framelen; /* XXX LOCKSUSED */ switch (cmd) { @@ -1194,11 +1236,25 @@ et_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } break; + case SIOCSIFCAP: + ET_LOCK(sc); + mask = ifr->ifr_reqcap ^ ifp->if_capenable; + if ((mask & IFCAP_TXCSUM) != 0 && + (IFCAP_TXCSUM & ifp->if_capabilities) != 0) { + ifp->if_capenable ^= IFCAP_TXCSUM; + if ((IFCAP_TXCSUM & ifp->if_capenable) != 0) + ifp->if_hwassist |= ET_CSUM_FEATURES; + else + ifp->if_hwassist &= ~ET_CSUM_FEATURES; + } + ET_UNLOCK(sc); + break; + default: error = ether_ioctl(ifp, cmd, data); break; } - return error; + return (error); } static void @@ -1277,9 +1333,9 @@ et_stop_rxdma(struct et_softc *sc) DELAY(5); if ((CSR_READ_4(sc, ET_RXDMA_CTRL) & ET_RXDMA_CTRL_HALTED) == 0) { if_printf(sc->ifp, "can't stop RX DMA engine\n"); - return ETIMEDOUT; + return (ETIMEDOUT); } - return 0; + return (0); } static int @@ -1287,7 +1343,7 @@ et_stop_txdma(struct et_softc *sc) { CSR_WRITE_4(sc, ET_TXDMA_CTRL, ET_TXDMA_CTRL_HALT | ET_TXDMA_CTRL_SINGLE_EPKT); - return 0; + return (0); } static void @@ -1326,7 +1382,7 @@ et_free_rx_ring(struct et_softc *sc) struct et_rxbuf *rb = &rbd->rbd_buf[i]; if (rb->rb_mbuf != NULL) { - bus_dmamap_unload(sc->sc_mbuf_dtag, + bus_dmamap_unload(sc->sc_mbuf_dtag, rb->rb_dmap); m_freem(rb->rb_mbuf); rb->rb_mbuf = NULL; @@ -1431,7 +1487,8 @@ et_chip_init(struct et_softc *sc) CSR_WRITE_4(sc, ET_LOOPBACK, 0); /* Clear MSI configure */ - CSR_WRITE_4(sc, ET_MSI_CFG, 0); + if ((sc->sc_flags & ET_FLAG_MSI) == 0) + CSR_WRITE_4(sc, ET_MSI_CFG, 0); /* Disable timer */ CSR_WRITE_4(sc, ET_TIMER, 0); @@ -1451,14 +1508,14 @@ et_chip_init(struct et_softc *sc) /* Initialize RX DMA engine */ error = et_init_rxdma(sc); if (error) - return error; + return (error); /* Initialize TX DMA engine */ error = et_init_txdma(sc); if (error) - return error; + return (error); - return 0; + return (0); } static int @@ -1479,7 +1536,7 @@ et_init_tx_ring(struct et_softc *sc) bzero(txsd->txsd_status, sizeof(uint32_t)); bus_dmamap_sync(txsd->txsd_dtag, txsd->txsd_dmap, BUS_DMASYNC_PREWRITE); - return 0; + return (0); } static int @@ -1498,7 +1555,7 @@ et_init_rx_ring(struct et_softc *sc) if (error) { if_printf(sc->ifp, "%d ring %d buf, " "newbuf failed: %d\n", n, i, error); - return error; + return (error); } } } @@ -1511,7 +1568,7 @@ et_init_rx_ring(struct et_softc *sc) bus_dmamap_sync(rxst_ring->rsr_dtag, rxst_ring->rsr_dmap, BUS_DMASYNC_PREWRITE); - return 0; + return (0); } static void @@ -1545,7 +1602,7 @@ et_init_rxdma(struct et_softc *sc) error = et_stop_rxdma(sc); if (error) { if_printf(sc->ifp, "can't init RX DMA engine\n"); - return error; + return (error); } /* @@ -1601,7 +1658,7 @@ et_init_rxdma(struct et_softc *sc) CSR_WRITE_4(sc, ET_RX_INTR_NPKTS, sc->sc_rx_intr_npkts); CSR_WRITE_4(sc, ET_RX_INTR_DELAY, sc->sc_rx_intr_delay); - return 0; + return (0); } static int @@ -1614,7 +1671,7 @@ et_init_txdma(struct et_softc *sc) error = et_stop_txdma(sc); if (error) { if_printf(sc->ifp, "can't init TX DMA engine\n"); - return error; + return (error); } /* @@ -1636,7 +1693,7 @@ et_init_txdma(struct et_softc *sc) tx_ring->tr_ready_index = 0; tx_ring->tr_ready_wrap = 0; - return 0; + return (0); } static void @@ -1655,19 +1712,19 @@ et_init_mac(struct et_softc *sc) /* * Setup inter packet gap */ - val = __SHIFTIN(56, ET_IPG_NONB2B_1) | - __SHIFTIN(88, ET_IPG_NONB2B_2) | - __SHIFTIN(80, ET_IPG_MINIFG) | - __SHIFTIN(96, ET_IPG_B2B); + val = (56 << ET_IPG_NONB2B_1_SHIFT) | + (88 << ET_IPG_NONB2B_2_SHIFT) | + (80 << ET_IPG_MINIFG_SHIFT) | + (96 << ET_IPG_B2B_SHIFT); CSR_WRITE_4(sc, ET_IPG, val); /* * Setup half duplex mode */ - val = __SHIFTIN(10, ET_MAC_HDX_ALT_BEB_TRUNC) | - __SHIFTIN(15, ET_MAC_HDX_REXMIT_MAX) | - __SHIFTIN(55, ET_MAC_HDX_COLLWIN) | - ET_MAC_HDX_EXC_DEFER; + val = (10 << ET_MAC_HDX_ALT_BEB_TRUNC_SHIFT) | + (15 << ET_MAC_HDX_REXMIT_MAX_SHIFT) | + (55 << ET_MAC_HDX_COLLWIN_SHIFT) | + ET_MAC_HDX_EXC_DEFER; CSR_WRITE_4(sc, ET_MAC_HDX, val); /* Clear MAC control */ @@ -1738,7 +1795,7 @@ et_init_rxmac(struct et_softc *sc) * since this is the size of the PCI-Express TLP's * that the ET1310 uses. */ - val = __SHIFTIN(ET_RXMAC_SEGSZ(256), ET_RXMAC_MC_SEGSZ_MAX) | + val = (ET_RXMAC_SEGSZ(256) & ET_RXMAC_MC_SEGSZ_MAX_MASK) | ET_RXMAC_MC_SEGSZ_ENABLE; } else { val = 0; @@ -1761,7 +1818,9 @@ et_init_rxmac(struct et_softc *sc) /* * Configure runt filtering (may not work on certain chip generation) */ - val = __SHIFTIN(ETHER_MIN_LEN, ET_PKTFILT_MINLEN) | ET_PKTFILT_FRAG; + val = (ETHER_MIN_LEN << ET_PKTFILT_MINLEN_SHIFT) & + ET_PKTFILT_MINLEN_MASK; + val |= ET_PKTFILT_FRAG; CSR_WRITE_4(sc, ET_PKTFILT, val); /* Enable RX MAC but leave WOL disabled */ @@ -1793,11 +1852,9 @@ et_start_rxdma(struct et_softc *sc) { uint32_t val = 0; - val |= __SHIFTIN(sc->sc_rx_data[0].rbd_bufsize, - ET_RXDMA_CTRL_RING0_SIZE) | + val |= (sc->sc_rx_data[0].rbd_bufsize & ET_RXDMA_CTRL_RING0_SIZE_MASK) | ET_RXDMA_CTRL_RING0_ENABLE; - val |= __SHIFTIN(sc->sc_rx_data[1].rbd_bufsize, - ET_RXDMA_CTRL_RING1_SIZE) | + val |= (sc->sc_rx_data[1].rbd_bufsize & ET_RXDMA_CTRL_RING1_SIZE_MASK) | ET_RXDMA_CTRL_RING1_ENABLE; CSR_WRITE_4(sc, ET_RXDMA_CTRL, val); @@ -1806,16 +1863,16 @@ et_start_rxdma(struct et_softc *sc) if (CSR_READ_4(sc, ET_RXDMA_CTRL) & ET_RXDMA_CTRL_HALTED) { if_printf(sc->ifp, "can't start RX DMA engine\n"); - return ETIMEDOUT; + return (ETIMEDOUT); } - return 0; + return (0); } static int et_start_txdma(struct et_softc *sc) { CSR_WRITE_4(sc, ET_TXDMA_CTRL, ET_TXDMA_CTRL_SINGLE_EPKT); - return 0; + return (0); } static int @@ -1848,7 +1905,7 @@ et_enable_txrx(struct et_softc *sc, int media_upd) } if (i == NRETRY) { if_printf(ifp, "can't enable RX/TX\n"); - return 0; + return (0); } sc->sc_flags |= ET_FLAG_TXRX_ENABLED; @@ -1859,13 +1916,13 @@ et_enable_txrx(struct et_softc *sc, int media_upd) */ error = et_start_rxdma(sc); if (error) - return error; + return (error); error = et_start_txdma(sc); if (error) - return error; + return (error); - return 0; + return (0); } static void @@ -1874,7 +1931,7 @@ et_rxeof(struct et_softc *sc) struct ifnet *ifp; struct et_rxstatus_data *rxsd; struct et_rxstat_ring *rxst_ring; - uint32_t rxs_stat_ring; + uint32_t rxs_stat_ring, rxst_info2; int rxst_wrap, rxst_index; ET_LOCK_ASSERT(sc); @@ -1890,9 +1947,10 @@ et_rxeof(struct et_softc *sc) bus_dmamap_sync(rxst_ring->rsr_dtag, rxst_ring->rsr_dmap, BUS_DMASYNC_POSTREAD); - rxs_stat_ring = rxsd->rxsd_status->rxs_stat_ring; + rxs_stat_ring = le32toh(rxsd->rxsd_status->rxs_stat_ring); rxst_wrap = (rxs_stat_ring & ET_RXS_STATRING_WRAP) ? 1 : 0; - rxst_index = __SHIFTOUT(rxs_stat_ring, ET_RXS_STATRING_INDEX); + rxst_index = (rxs_stat_ring & ET_RXS_STATRING_INDEX_MASK) >> + ET_RXS_STATRING_INDEX_SHIFT; while (rxst_index != rxst_ring->rsr_index || rxst_wrap != rxst_ring->rsr_wrap) { @@ -1905,17 +1963,19 @@ et_rxeof(struct et_softc *sc) MPASS(rxst_ring->rsr_index < ET_RX_NSTAT); st = &rxst_ring->rsr_stat[rxst_ring->rsr_index]; - - buflen = __SHIFTOUT(st->rxst_info2, ET_RXST_INFO2_LEN); - buf_idx = __SHIFTOUT(st->rxst_info2, ET_RXST_INFO2_BUFIDX); - ring_idx = __SHIFTOUT(st->rxst_info2, ET_RXST_INFO2_RINGIDX); + rxst_info2 = le32toh(st->rxst_info2); + buflen = (rxst_info2 & ET_RXST_INFO2_LEN_MASK) >> + ET_RXST_INFO2_LEN_SHIFT; + buf_idx = (rxst_info2 & ET_RXST_INFO2_BUFIDX_MASK) >> + ET_RXST_INFO2_BUFIDX_SHIFT; + ring_idx = (rxst_info2 & ET_RXST_INFO2_RINGIDX_MASK) >> + ET_RXST_INFO2_RINGIDX_SHIFT; if (++rxst_ring->rsr_index == ET_RX_NSTAT) { rxst_ring->rsr_index = 0; rxst_ring->rsr_wrap ^= 1; } - rxstat_pos = __SHIFTIN(rxst_ring->rsr_index, - ET_RXSTAT_POS_INDEX); + rxstat_pos = rxst_ring->rsr_index & ET_RXSTAT_POS_INDEX_MASK; if (rxst_ring->rsr_wrap) rxstat_pos |= ET_RXSTAT_POS_WRAP; CSR_WRITE_4(sc, ET_RXSTAT_POS, rxstat_pos); @@ -1940,11 +2000,9 @@ et_rxeof(struct et_softc *sc) m = NULL; ifp->if_ierrors++; } else { - m->m_pkthdr.len = m->m_len = buflen; + m->m_pkthdr.len = m->m_len = + buflen - ETHER_CRC_LEN; m->m_pkthdr.rcvif = ifp; - - m_adj(m, -ETHER_CRC_LEN); - ifp->if_ipackets++; ET_UNLOCK(sc); ifp->if_input(ifp, m); @@ -1968,7 +2026,7 @@ et_rxeof(struct et_softc *sc) rx_ring->rr_index = 0; rx_ring->rr_wrap ^= 1; } - rxring_pos = __SHIFTIN(rx_ring->rr_index, ET_RX_RING_POS_INDEX); + rxring_pos = rx_ring->rr_index & ET_RX_RING_POS_INDEX_MASK; if (rx_ring->rr_wrap) rxring_pos |= ET_RX_RING_POS_WRAP; CSR_WRITE_4(sc, rx_ring->rr_posreg, rxring_pos); @@ -1986,7 +2044,7 @@ et_encap(struct et_softc *sc, struct mbuf **m0) struct et_txdesc *td; bus_dmamap_t map; int error, maxsegs, first_idx, last_idx, i; - uint32_t tx_ready_pos, last_td_ctrl2; + uint32_t csum_flags, tx_ready_pos, last_td_ctrl2; maxsegs = ET_TX_NDESC - tbd->tbd_used; if (maxsegs > ET_NSEG_MAX) @@ -2048,20 +2106,29 @@ et_encap(struct et_softc *sc, struct mbuf **m0) last_td_ctrl2 |= ET_TDCTRL2_INTR; } + csum_flags = 0; + if ((m->m_pkthdr.csum_flags & ET_CSUM_FEATURES) != 0) { + if ((m->m_pkthdr.csum_flags & CSUM_IP) != 0) + csum_flags |= ET_TDCTRL2_CSUM_IP; + if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) + csum_flags |= ET_TDCTRL2_CSUM_UDP; + else if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0) + csum_flags |= ET_TDCTRL2_CSUM_TCP; + } last_idx = -1; for (i = 0; i < ctx.nsegs; ++i) { int idx; idx = (first_idx + i) % ET_TX_NDESC; td = &tx_ring->tr_desc[idx]; - td->td_addr_hi = ET_ADDR_HI(segs[i].ds_addr); - td->td_addr_lo = ET_ADDR_LO(segs[i].ds_addr); - td->td_ctrl1 = __SHIFTIN(segs[i].ds_len, ET_TDCTRL1_LEN); - + td->td_addr_hi = htole32(ET_ADDR_HI(segs[i].ds_addr)); + td->td_addr_lo = htole32(ET_ADDR_LO(segs[i].ds_addr)); + td->td_ctrl1 = htole32(segs[i].ds_len & ET_TDCTRL1_LEN_MASK); if (i == ctx.nsegs - 1) { /* Last frag */ - td->td_ctrl2 = last_td_ctrl2; + td->td_ctrl2 = htole32(last_td_ctrl2 | csum_flags); last_idx = idx; - } + } else + td->td_ctrl2 = htole32(csum_flags); MPASS(tx_ring->tr_ready_index < ET_TX_NDESC); if (++tx_ring->tr_ready_index == ET_TX_NDESC) { @@ -2070,7 +2137,7 @@ et_encap(struct et_softc *sc, struct mbuf **m0) } } td = &tx_ring->tr_desc[first_idx]; - td->td_ctrl2 |= ET_TDCTRL2_FIRST_FRAG; /* First frag */ + td->td_ctrl2 |= htole32(ET_TDCTRL2_FIRST_FRAG); /* First frag */ MPASS(last_idx >= 0); tbd->tbd_buf[first_idx].tb_dmap = tbd->tbd_buf[last_idx].tb_dmap; @@ -2083,8 +2150,7 @@ et_encap(struct et_softc *sc, struct mbuf **m0) bus_dmamap_sync(tx_ring->tr_dtag, tx_ring->tr_dmap, BUS_DMASYNC_PREWRITE); - tx_ready_pos = __SHIFTIN(tx_ring->tr_ready_index, - ET_TX_READY_POS_INDEX); + tx_ready_pos = tx_ring->tr_ready_index & ET_TX_READY_POS_INDEX_MASK; if (tx_ring->tr_ready_wrap) tx_ready_pos |= ET_TX_READY_POS_WRAP; CSR_WRITE_4(sc, ET_TX_READY_POS, tx_ready_pos); @@ -2095,7 +2161,7 @@ back: m_freem(m); *m0 = NULL; } - return error; + return (error); } static void @@ -2119,7 +2185,7 @@ et_txeof(struct et_softc *sc) return; tx_done = CSR_READ_4(sc, ET_TX_DONE_POS); - end = __SHIFTOUT(tx_done, ET_TX_DONE_POS_INDEX); + end = tx_done & ET_TX_DONE_POS_INDEX_MASK; wrap = (tx_done & ET_TX_DONE_POS_WRAP) ? 1 : 0; while (tbd->tbd_start_index != end || tbd->tbd_start_wrap != wrap) { @@ -2183,13 +2249,13 @@ et_tick(void *xsc) static int et_newbuf_cluster(struct et_rxbuf_data *rbd, int buf_idx, int init) { - return et_newbuf(rbd, buf_idx, init, MCLBYTES); + return (et_newbuf(rbd, buf_idx, init, MCLBYTES)); } static int et_newbuf_hdr(struct et_rxbuf_data *rbd, int buf_idx, int init) { - return et_newbuf(rbd, buf_idx, init, MHLEN); + return (et_newbuf(rbd, buf_idx, init, MHLEN)); } static int @@ -2213,7 +2279,7 @@ et_newbuf(struct et_rxbuf_data *rbd, int buf_idx, int init, int len0) if (init) { if_printf(sc->ifp, "m_getl failed, size %d\n", len0); - return error; + return (error); } else { goto back; } @@ -2240,7 +2306,7 @@ et_newbuf(struct et_rxbuf_data *rbd, int buf_idx, int init, int len0) if (init) { if_printf(sc->ifp, "can't load RX mbuf\n"); - return error; + return (error); } else { goto back; } @@ -2264,7 +2330,7 @@ et_newbuf(struct et_rxbuf_data *rbd, int buf_idx, int init, int len0) error = 0; back: et_setup_rxdesc(rbd, buf_idx, rb->rb_paddr); - return error; + return (error); } /* @@ -2314,7 +2380,7 @@ et_sysctl_rx_intr_npkts(SYSCTL_HANDLER_ARGS) sc->sc_rx_intr_npkts = v; } back: - return error; + return (error); } static int @@ -2339,7 +2405,7 @@ et_sysctl_rx_intr_delay(SYSCTL_HANDLER_ARGS) sc->sc_rx_intr_delay = v; } back: - return error; + return (error); } static void @@ -2352,7 +2418,8 @@ et_setmedia(struct et_softc *sc) cfg2 &= ~(ET_MAC_CFG2_MODE_MII | ET_MAC_CFG2_MODE_GMII | ET_MAC_CFG2_FDX | ET_MAC_CFG2_BIGFRM); cfg2 |= ET_MAC_CFG2_LENCHK | ET_MAC_CFG2_CRC | ET_MAC_CFG2_PADCRC | - __SHIFTIN(7, ET_MAC_CFG2_PREAMBLE_LEN); + ((7 << ET_MAC_CFG2_PREAMBLE_LEN_SHIFT) & + ET_MAC_CFG2_PREAMBLE_LEN_MASK); ctrl = CSR_READ_4(sc, ET_MAC_CTRL); ctrl &= ~(ET_MAC_CTRL_GHDX | ET_MAC_CTRL_MODE_MII); @@ -2382,9 +2449,9 @@ et_setup_rxdesc(struct et_rxbuf_data *rbd, int buf_idx, bus_addr_t paddr) MPASS(buf_idx < ET_RX_NDESC); desc = &rx_ring->rr_desc[buf_idx]; - desc->rd_addr_hi = ET_ADDR_HI(paddr); - desc->rd_addr_lo = ET_ADDR_LO(paddr); - desc->rd_ctrl = __SHIFTIN(buf_idx, ET_RDCTRL_BUFIDX); + desc->rd_addr_hi = htole32(ET_ADDR_HI(paddr)); + desc->rd_addr_lo = htole32(ET_ADDR_LO(paddr)); + desc->rd_ctrl = htole32(buf_idx & ET_RDCTRL_BUFIDX_MASK); bus_dmamap_sync(rx_ring->rr_dtag, rx_ring->rr_dmap, BUS_DMASYNC_PREWRITE); diff --git a/sys/dev/et/if_etreg.h b/sys/dev/et/if_etreg.h index 136f6fbf5845..1f6f48fec1ad 100644 --- a/sys/dev/et/if_etreg.h +++ b/sys/dev/et/if_etreg.h @@ -1,13 +1,13 @@ /*- * Copyright (c) 2007 The DragonFly Project. All rights reserved. - * + * * This code is derived from software contributed to The DragonFly Project * by Sepherosa Ziehau - * + * * 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 @@ -17,7 +17,7 @@ * 3. Neither the name of The DragonFly Project 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 COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS @@ -30,7 +30,7 @@ * 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. - * + * * $DragonFly: src/sys/dev/netif/et/if_etreg.h,v 1.3 2007/10/23 14:28:42 sephe Exp $ * $FreeBSD$ */ @@ -73,50 +73,6 @@ #ifndef _IF_ETREG_H #define _IF_ETREG_H -/* - * __BIT(n): Return a bitmask with bit n set, where the least - * significant bit is bit 0. - * - * __BITS(m, n): Return a bitmask with bits m through n, inclusive, - * set. It does not matter whether m>n or m<=n. The - * least significant bit is bit 0. - * - * A "bitfield" is a span of consecutive bits defined by a bitmask, - * where 1s select the bits in the bitfield. __SHIFTIN, __SHIFTOUT, - * and __SHIFTOUT_MASK help read and write bitfields from device - * registers. - * - * __SHIFTIN(v, mask): Left-shift bits `v' into the bitfield - * defined by `mask', and return them. No - * side-effects. - * - * __SHIFTOUT(v, mask): Extract and return the bitfield selected - * by `mask' from `v', right-shifting the - * bits so that the rightmost selected bit - * is at bit 0. No side-effects. - * - * __SHIFTOUT_MASK(mask): Right-shift the bits in `mask' so that - * the rightmost non-zero bit is at bit - * 0. This is useful for finding the - * greatest unsigned value that a bitfield - * can hold. No side-effects. Note that - * __SHIFTOUT_MASK(m) = __SHIFTOUT(m, m). - */ - -/* __BIT(n): nth bit, where __BIT(0) == 0x1. */ -#define __BIT(__n) (((__n) == 32) ? 0 : ((uint32_t)1 << (__n))) - -/* __BITS(m, n): bits m through n, m < n. */ -#define __BITS(__m, __n) \ - ((__BIT(MAX((__m), (__n)) + 1) - 1) ^ (__BIT(MIN((__m), (__n))) - 1)) - -/* Find least significant bit that is set */ -#define __LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask)) - -#define __SHIFTOUT(__x, __mask) (((__x) & (__mask)) / __LOWEST_SET_BIT(__mask)) -#define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask)) -#define __SHIFTOUT_MASK(__mask) __SHIFTOUT((__mask), (__mask)) - #define ET_MEM_TXSIZE_EX 182 #define ET_MEM_RXSIZE_MIN 608 #define ET_MEM_RXSIZE_DEFAULT 11216 @@ -159,10 +115,6 @@ #define ET_PCIV_REPLAY_TIMER_256 (1248 + ET_REPLAY_TIMER_RX_L0S_ADJ) #define ET_PCIR_L0S_L1_LATENCY 0xcf -#define ET_PCIM_L0S_LATENCY __BITS(2, 0) -#define ET_PCIM_L1_LATENCY __BITS(5, 3) -#define ET_PCIV_L0S_LATENCY(l) __SHIFTIN((l) - 1, ET_PCIM_L0S_LATENCY) -#define ET_PCIV_L1_LATENCY(l) __SHIFTIN((l) - 1, ET_PCIM_L1_LATENCY) /* * CSR @@ -176,22 +128,22 @@ #define ET_QUEUE_ADDR_END ET_QUEUE_ADDR(ET_MEM_SIZE) #define ET_PM 0x0010 -#define ET_PM_SYSCLK_GATE __BIT(3) -#define ET_PM_TXCLK_GATE __BIT(4) -#define ET_PM_RXCLK_GATE __BIT(5) +#define ET_PM_SYSCLK_GATE 0x00000008 +#define ET_PM_TXCLK_GATE 0x00000010 +#define ET_PM_RXCLK_GATE 0x00000020 #define ET_INTR_STATUS 0x0018 #define ET_INTR_MASK 0x001c #define ET_SWRST 0x0028 -#define ET_SWRST_TXDMA __BIT(0) -#define ET_SWRST_RXDMA __BIT(1) -#define ET_SWRST_TXMAC __BIT(2) -#define ET_SWRST_RXMAC __BIT(3) -#define ET_SWRST_MAC __BIT(4) -#define ET_SWRST_MAC_STAT __BIT(5) -#define ET_SWRST_MMC __BIT(6) -#define ET_SWRST_SELFCLR_DISABLE __BIT(31) +#define ET_SWRST_TXDMA 0x00000001 +#define ET_SWRST_RXDMA 0x00000002 +#define ET_SWRST_TXMAC 0x00000004 +#define ET_SWRST_RXMAC 0x00000008 +#define ET_SWRST_MAC 0x00000010 +#define ET_SWRST_MAC_STAT 0x00000020 +#define ET_SWRST_MMC 0x00000040 +#define ET_SWRST_SELFCLR_DISABLE 0x80000000 #define ET_MSI_CFG 0x0030 @@ -200,9 +152,9 @@ #define ET_TIMER 0x0038 #define ET_TXDMA_CTRL 0x1000 -#define ET_TXDMA_CTRL_HALT __BIT(0) -#define ET_TXDMA_CTRL_CACHE_THR __BITS(7, 4) -#define ET_TXDMA_CTRL_SINGLE_EPKT __BIT(8) /* ??? */ +#define ET_TXDMA_CTRL_HALT 0x00000001 +#define ET_TXDMA_CTRL_CACHE_THR_MASK 0x000000F0 +#define ET_TXDMA_CTRL_SINGLE_EPKT 0x00000100 /* ??? */ #define ET_TX_RING_HI 0x1004 #define ET_TX_RING_LO 0x1008 @@ -212,28 +164,28 @@ #define ET_TX_STATUS_LO 0x1020 #define ET_TX_READY_POS 0x1024 -#define ET_TX_READY_POS_INDEX __BITS(9, 0) -#define ET_TX_READY_POS_WRAP __BIT(10) +#define ET_TX_READY_POS_INDEX_MASK 0x000003FF +#define ET_TX_READY_POS_WRAP 0x00000400 #define ET_TX_DONE_POS 0x1060 -#define ET_TX_DONE_POS_INDEX __BITS(9, 0) -#define ET_TX_DONE_POS_WRAP __BIT(10) +#define ET_TX_DONE_POS_INDEX_MASK 0x0000003FF +#define ET_TX_DONE_POS_WRAP 0x000000400 #define ET_RXDMA_CTRL 0x2000 -#define ET_RXDMA_CTRL_HALT __BIT(0) -#define ET_RXDMA_CTRL_RING0_SIZE __BITS(9, 8) -#define ET_RXDMA_CTRL_RING0_128 0 /* 127 */ -#define ET_RXDMA_CTRL_RING0_256 1 /* 255 */ -#define ET_RXDMA_CTRL_RING0_512 2 /* 511 */ -#define ET_RXDMA_CTRL_RING0_1024 3 /* 1023 */ -#define ET_RXDMA_CTRL_RING0_ENABLE __BIT(10) -#define ET_RXDMA_CTRL_RING1_SIZE __BITS(12, 11) -#define ET_RXDMA_CTRL_RING1_2048 0 /* 2047 */ -#define ET_RXDMA_CTRL_RING1_4096 1 /* 4095 */ -#define ET_RXDMA_CTRL_RING1_8192 2 /* 8191 */ -#define ET_RXDMA_CTRL_RING1_16384 3 /* 16383 (9022?) */ -#define ET_RXDMA_CTRL_RING1_ENABLE __BIT(13) -#define ET_RXDMA_CTRL_HALTED __BIT(17) +#define ET_RXDMA_CTRL_HALT 0x00000001 +#define ET_RXDMA_CTRL_RING0_SIZE_MASK 0x00000300 +#define ET_RXDMA_CTRL_RING0_128 0x00000000 /* 127 */ +#define ET_RXDMA_CTRL_RING0_256 0x00000100 /* 255 */ +#define ET_RXDMA_CTRL_RING0_512 0x00000200 /* 511 */ +#define ET_RXDMA_CTRL_RING0_1024 0x00000300 /* 1023 */ +#define ET_RXDMA_CTRL_RING0_ENABLE 0x00000400 +#define ET_RXDMA_CTRL_RING1_SIZE_MASK 0x00001800 +#define ET_RXDMA_CTRL_RING1_2048 0x00000000 /* 2047 */ +#define ET_RXDMA_CTRL_RING1_4096 0x00000800 /* 4095 */ +#define ET_RXDMA_CTRL_RING1_8192 0x00001000 /* 8191 */ +#define ET_RXDMA_CTRL_RING1_16384 0x00001800 /* 16383 (9022?) */ +#define ET_RXDMA_CTRL_RING1_ENABLE 0x00002000 +#define ET_RXDMA_CTRL_HALTED 0x00020000 #define ET_RX_STATUS_LO 0x2004 #define ET_RX_STATUS_HI 0x2008 @@ -246,8 +198,8 @@ #define ET_RXSTAT_CNT 0x2028 #define ET_RXSTAT_POS 0x2030 -#define ET_RXSTAT_POS_INDEX __BITS(11, 0) -#define ET_RXSTAT_POS_WRAP __BIT(12) +#define ET_RXSTAT_POS_INDEX_MASK 0x00000FFF +#define ET_RXSTAT_POS_WRAP 0x00001000 #define ET_RXSTAT_MINCNT 0x2038 @@ -256,8 +208,8 @@ #define ET_RX_RING0_CNT 0x2044 #define ET_RX_RING0_POS 0x204c -#define ET_RX_RING0_POS_INDEX __BITS(9, 0) -#define ET_RX_RING0_POS_WRAP __BIT(10) +#define ET_RX_RING0_POS_INDEX_MASK 0x000003FF +#define ET_RX_RING0_POS_WRAP 0x00000400 #define ET_RX_RING0_MINCNT 0x2054 @@ -266,21 +218,21 @@ #define ET_RX_RING1_CNT 0x2060 #define ET_RX_RING1_POS 0x2068 -#define ET_RX_RING1_POS_INDEX __BITS(9, 0) -#define ET_RX_RING1_POS_WRAP __BIT(10) +#define ET_RX_RING1_POS_INDEX 0x000003FF +#define ET_RX_RING1_POS_WRAP 0x00000400 #define ET_RX_RING1_MINCNT 0x2070 #define ET_TXMAC_CTRL 0x3000 -#define ET_TXMAC_CTRL_ENABLE __BIT(0) -#define ET_TXMAC_CTRL_FC_DISABLE __BIT(3) +#define ET_TXMAC_CTRL_ENABLE 0x00000001 +#define ET_TXMAC_CTRL_FC_DISABLE 0x00000008 #define ET_TXMAC_FLOWCTRL 0x3010 #define ET_RXMAC_CTRL 0x4000 -#define ET_RXMAC_CTRL_ENABLE __BIT(0) -#define ET_RXMAC_CTRL_NO_PKTFILT __BIT(2) -#define ET_RXMAC_CTRL_WOL_DISABLE __BIT(3) +#define ET_RXMAC_CTRL_ENABLE 0x00000001 +#define ET_RXMAC_CTRL_NO_PKTFILT 0x00000004 +#define ET_RXMAC_CTRL_WOL_DISABLE 0x00000008 #define ET_WOL_CRC 0x4004 #define ET_WOL_SA_LO 0x4010 @@ -294,16 +246,17 @@ #define ET_MULTI_HASH 0x4074 #define ET_PKTFILT 0x4084 -#define ET_PKTFILT_BCAST __BIT(0) -#define ET_PKTFILT_MCAST __BIT(1) -#define ET_PKTFILT_UCAST __BIT(2) -#define ET_PKTFILT_FRAG __BIT(3) -#define ET_PKTFILT_MINLEN __BITS(22, 16) +#define ET_PKTFILT_BCAST 0x00000001 +#define ET_PKTFILT_MCAST 0x00000002 +#define ET_PKTFILT_UCAST 0x00000004 +#define ET_PKTFILT_FRAG 0x00000008 +#define ET_PKTFILT_MINLEN_MASK 0x007F0000 +#define ET_PKTFILT_MINLEN_SHIFT 16 #define ET_RXMAC_MC_SEGSZ 0x4088 -#define ET_RXMAC_MC_SEGSZ_ENABLE __BIT(0) -#define ET_RXMAC_MC_SEGSZ_FC __BIT(1) -#define ET_RXMAC_MC_SEGSZ_MAX __BITS(9, 2) +#define ET_RXMAC_MC_SEGSZ_ENABLE 0x00000001 +#define ET_RXMAC_MC_SEGSZ_FC 0x00000002 +#define ET_RXMAC_MC_SEGSZ_MAX_MASK 0x000003FC #define ET_RXMAC_SEGSZ(segsz) ((segsz) / ET_MEM_UNIT) #define ET_RXMAC_CUT_THRU_FRMLEN 8074 @@ -311,110 +264,121 @@ #define ET_RXMAC_SPACE_AVL 0x4094 #define ET_RXMAC_MGT 0x4098 -#define ET_RXMAC_MGT_PASS_ECRC __BIT(4) -#define ET_RXMAC_MGT_PASS_ELEN __BIT(5) -#define ET_RXMAC_MGT_PASS_ETRUNC __BIT(16) -#define ET_RXMAC_MGT_CHECK_PKT __BIT(17) +#define ET_RXMAC_MGT_PASS_ECRC 0x00000010 +#define ET_RXMAC_MGT_PASS_ELEN 0x00000020 +#define ET_RXMAC_MGT_PASS_ETRUNC 0x00010000 +#define ET_RXMAC_MGT_CHECK_PKT 0x00020000 #define ET_MAC_CFG1 0x5000 -#define ET_MAC_CFG1_TXEN __BIT(0) -#define ET_MAC_CFG1_SYNC_TXEN __BIT(1) -#define ET_MAC_CFG1_RXEN __BIT(2) -#define ET_MAC_CFG1_SYNC_RXEN __BIT(3) -#define ET_MAC_CFG1_TXFLOW __BIT(4) -#define ET_MAC_CFG1_RXFLOW __BIT(5) -#define ET_MAC_CFG1_LOOPBACK __BIT(8) -#define ET_MAC_CFG1_RST_TXFUNC __BIT(16) -#define ET_MAC_CFG1_RST_RXFUNC __BIT(17) -#define ET_MAC_CFG1_RST_TXMC __BIT(18) -#define ET_MAC_CFG1_RST_RXMC __BIT(19) -#define ET_MAC_CFG1_SIM_RST __BIT(30) -#define ET_MAC_CFG1_SOFT_RST __BIT(31) +#define ET_MAC_CFG1_TXEN 0x00000001 +#define ET_MAC_CFG1_SYNC_TXEN 0x00000002 +#define ET_MAC_CFG1_RXEN 0x00000004 +#define ET_MAC_CFG1_SYNC_RXEN 0x00000008 +#define ET_MAC_CFG1_TXFLOW 0x00000010 +#define ET_MAC_CFG1_RXFLOW 0x00000020 +#define ET_MAC_CFG1_LOOPBACK 0x00000100 +#define ET_MAC_CFG1_RST_TXFUNC 0x00010000 +#define ET_MAC_CFG1_RST_RXFUNC 0x00020000 +#define ET_MAC_CFG1_RST_TXMC 0x00040000 +#define ET_MAC_CFG1_RST_RXMC 0x00080000 +#define ET_MAC_CFG1_SIM_RST 0x40000000 +#define ET_MAC_CFG1_SOFT_RST 0x80000000 #define ET_MAC_CFG2 0x5004 -#define ET_MAC_CFG2_FDX __BIT(0) -#define ET_MAC_CFG2_CRC __BIT(1) -#define ET_MAC_CFG2_PADCRC __BIT(2) -#define ET_MAC_CFG2_LENCHK __BIT(4) -#define ET_MAC_CFG2_BIGFRM __BIT(5) -#define ET_MAC_CFG2_MODE_MII __BIT(8) -#define ET_MAC_CFG2_MODE_GMII __BIT(9) -#define ET_MAC_CFG2_PREAMBLE_LEN __BITS(15, 12) +#define ET_MAC_CFG2_FDX 0x00000001 +#define ET_MAC_CFG2_CRC 0x00000002 +#define ET_MAC_CFG2_PADCRC 0x00000004 +#define ET_MAC_CFG2_LENCHK 0x00000010 +#define ET_MAC_CFG2_BIGFRM 0x00000020 +#define ET_MAC_CFG2_MODE_MII 0x00000100 +#define ET_MAC_CFG2_MODE_GMII 0x00000200 +#define ET_MAC_CFG2_PREAMBLE_LEN_MASK 0x0000F000 +#define ET_MAC_CFG2_PREAMBLE_LEN_SHIFT 12 #define ET_IPG 0x5008 -#define ET_IPG_B2B __BITS(6, 0) -#define ET_IPG_MINIFG __BITS(15, 8) -#define ET_IPG_NONB2B_2 __BITS(22, 16) -#define ET_IPG_NONB2B_1 __BITS(30, 24) +#define ET_IPG_B2B_MASK 0x0000007F +#define ET_IPG_MINIFG_MASK 0x0000FF00 +#define ET_IPG_NONB2B_2_MASK 0x007F0000 +#define ET_IPG_NONB2B_1_MASK 0x7F000000 +#define ET_IPG_B2B_SHIFT 0 +#define ET_IPG_MINIFG_SHIFT 8 +#define ET_IPG_NONB2B_2_SHIFT 16 +#define ET_IPG_NONB2B_1_SHIFT 24 #define ET_MAC_HDX 0x500c -#define ET_MAC_HDX_COLLWIN __BITS(9, 0) -#define ET_MAC_HDX_REXMIT_MAX __BITS(15, 12) -#define ET_MAC_HDX_EXC_DEFER __BIT(16) -#define ET_MAC_HDX_NOBACKOFF __BIT(17) -#define ET_MAC_HDX_BP_NOBACKOFF __BIT(18) -#define ET_MAC_HDX_ALT_BEB __BIT(19) -#define ET_MAC_HDX_ALT_BEB_TRUNC __BITS(23, 20) +#define ET_MAC_HDX_COLLWIN_MASK 0x000003FF +#define ET_MAC_HDX_REXMIT_MAX_MASK 0x0000F000 +#define ET_MAC_HDX_EXC_DEFER 0x00010000 +#define ET_MAC_HDX_NOBACKOFF 0x00020000 +#define ET_MAC_HDX_BP_NOBACKOFF 0x00040000 +#define ET_MAC_HDX_ALT_BEB 0x00080000 +#define ET_MAC_HDX_ALT_BEB_TRUNC_MASK 0x00F00000 +#define ET_MAC_HDX_COLLWIN_SHIFT 0 +#define ET_MAC_HDX_REXMIT_MAX_SHIFT 12 +#define ET_MAC_HDX_ALT_BEB_TRUNC_SHIFT 20 #define ET_MAX_FRMLEN 0x5010 #define ET_MII_CFG 0x5020 -#define ET_MII_CFG_CLKRST __BITS(2, 0) -#define ET_MII_CFG_PREAMBLE_SUP __BIT(4) -#define ET_MII_CFG_SCAN_AUTOINC __BIT(5) -#define ET_MII_CFG_RST __BIT(31) +#define ET_MII_CFG_CLKRST 0x00000007 +#define ET_MII_CFG_PREAMBLE_SUP 0x00000010 +#define ET_MII_CFG_SCAN_AUTOINC 0x00000020 +#define ET_MII_CFG_RST 0x80000000 #define ET_MII_CMD 0x5024 -#define ET_MII_CMD_READ __BIT(0) +#define ET_MII_CMD_READ 0x00000001 #define ET_MII_ADDR 0x5028 -#define ET_MII_ADDR_REG __BITS(4, 0) -#define ET_MII_ADDR_PHY __BITS(12, 8) +#define ET_MII_ADDR_REG_MASK 0x0000001F +#define ET_MII_ADDR_PHY_MASK 0x00001F00 +#define ET_MII_ADDR_REG_SHIFT 0 +#define ET_MII_ADDR_PHY_SHIFT 8 #define ET_MII_CTRL 0x502c -#define ET_MII_CTRL_VALUE __BITS(15, 0) +#define ET_MII_CTRL_VALUE_MASK 0x0000FFFF +#define ET_MII_CTRL_VALUE_SHIFT 0 #define ET_MII_STAT 0x5030 -#define ET_MII_STAT_VALUE __BITS(15, 0) +#define ET_MII_STAT_VALUE_MASK 0x0000FFFF #define ET_MII_IND 0x5034 -#define ET_MII_IND_BUSY __BIT(0) -#define ET_MII_IND_INVALID __BIT(2) +#define ET_MII_IND_BUSY 0x00000001 +#define ET_MII_IND_INVALID 0x00000004 #define ET_MAC_CTRL 0x5038 -#define ET_MAC_CTRL_MODE_MII __BIT(24) -#define ET_MAC_CTRL_LHDX __BIT(25) -#define ET_MAC_CTRL_GHDX __BIT(26) +#define ET_MAC_CTRL_MODE_MII 0x01000000 +#define ET_MAC_CTRL_LHDX 0x02000000 +#define ET_MAC_CTRL_GHDX 0x04000000 #define ET_MAC_ADDR1 0x5040 #define ET_MAC_ADDR2 0x5044 #define ET_MMC_CTRL 0x7000 -#define ET_MMC_CTRL_ENABLE __BIT(0) -#define ET_MMC_CTRL_ARB_DISABLE __BIT(1) -#define ET_MMC_CTRL_RXMAC_DISABLE __BIT(2) -#define ET_MMC_CTRL_TXMAC_DISABLE __BIT(3) -#define ET_MMC_CTRL_TXDMA_DISABLE __BIT(4) -#define ET_MMC_CTRL_RXDMA_DISABLE __BIT(5) -#define ET_MMC_CTRL_FORCE_CE __BIT(6) +#define ET_MMC_CTRL_ENABLE 0x00000001 +#define ET_MMC_CTRL_ARB_DISABLE 0x00000002 +#define ET_MMC_CTRL_RXMAC_DISABLE 0x00000004 +#define ET_MMC_CTRL_TXMAC_DISABLE 0x00000008 +#define ET_MMC_CTRL_TXDMA_DISABLE 0x00000010 +#define ET_MMC_CTRL_RXDMA_DISABLE 0x00000020 +#define ET_MMC_CTRL_FORCE_CE 0x00000040 /* * Interrupts */ -#define ET_INTR_TXEOF __BIT(3) -#define ET_INTR_TXDMA_ERROR __BIT(4) -#define ET_INTR_RXEOF __BIT(5) -#define ET_INTR_RXRING0_LOW __BIT(6) -#define ET_INTR_RXRING1_LOW __BIT(7) -#define ET_INTR_RXSTAT_LOW __BIT(8) -#define ET_INTR_RXDMA_ERROR __BIT(9) -#define ET_INTR_TIMER __BIT(14) -#define ET_INTR_WOL __BIT(15) -#define ET_INTR_PHY __BIT(16) -#define ET_INTR_TXMAC __BIT(17) -#define ET_INTR_RXMAC __BIT(18) -#define ET_INTR_MAC_STATS __BIT(19) -#define ET_INTR_SLAVE_TO __BIT(20) +#define ET_INTR_TXEOF 0x00000008 +#define ET_INTR_TXDMA_ERROR 0x00000010 +#define ET_INTR_RXEOF 0x00000020 +#define ET_INTR_RXRING0_LOW 0x00000040 +#define ET_INTR_RXRING1_LOW 0x00000080 +#define ET_INTR_RXSTAT_LOW 0x00000100 +#define ET_INTR_RXDMA_ERROR 0x00000200 +#define ET_INTR_TIMER 0x00004000 +#define ET_INTR_WOL 0x00008000 +#define ET_INTR_PHY 0x00010000 +#define ET_INTR_TXMAC 0x00020000 +#define ET_INTR_RXMAC 0x00040000 +#define ET_INTR_MAC_STATS 0x00080000 +#define ET_INTR_SLAVE_TO 0x00100000 #define ET_INTRS (ET_INTR_TXEOF | \ ET_INTR_RXEOF | \ @@ -423,8 +387,8 @@ /* * RX ring position uses same layout */ -#define ET_RX_RING_POS_INDEX __BITS(9, 0) -#define ET_RX_RING_POS_WRAP __BIT(10) +#define ET_RX_RING_POS_INDEX_MASK 0x000003FF +#define ET_RX_RING_POS_WRAP 0x00000400 /* * PCI IDs diff --git a/sys/dev/et/if_etvar.h b/sys/dev/et/if_etvar.h index 9fdf775d8fde..54932ca1501f 100644 --- a/sys/dev/et/if_etvar.h +++ b/sys/dev/et/if_etvar.h @@ -1,13 +1,13 @@ /*- * Copyright (c) 2007 The DragonFly Project. All rights reserved. - * + * * This code is derived from software contributed to The DragonFly Project * by Sepherosa Ziehau - * + * * 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 @@ -17,7 +17,7 @@ * 3. Neither the name of The DragonFly Project 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 COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS @@ -30,7 +30,7 @@ * 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. - * + * * $DragonFly: src/sys/dev/netif/et/if_etvar.h,v 1.4 2007/10/23 14:28:42 sephe Exp $ * $FreeBSD$ */ @@ -40,7 +40,7 @@ /* DragonFly compatibility */ #define EVL_ENCAPLEN ETHER_VLAN_ENCAP_LEN - + /* * Allocate the right type of mbuf for the desired total length. */ @@ -92,9 +92,9 @@ m_getl(int len, int how, int type, int flags, int *psize) #define ET_JUMBO_MEM_SIZE (ET_JSLOTS * ET_JLEN) #define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg), (val)) + bus_write_4((sc)->sc_mem_res, (reg), (val)) #define CSR_READ_4(sc, reg) \ - bus_space_read_4((sc)->sc_mem_bt, (sc)->sc_mem_bh, (reg)) + bus_read_4((sc)->sc_mem_res, (reg)) #define ET_ADDR_HI(addr) ((uint64_t) (addr) >> 32) #define ET_ADDR_LO(addr) ((uint64_t) (addr) & 0xffffffff) @@ -104,38 +104,54 @@ struct et_txdesc { uint32_t td_addr_lo; uint32_t td_ctrl1; /* ET_TDCTRL1_ */ uint32_t td_ctrl2; /* ET_TDCTRL2_ */ -} __packed; +}; -#define ET_TDCTRL1_LEN __BITS(15, 0) +#define ET_TDCTRL1_LEN_MASK 0x0000FFFF -#define ET_TDCTRL2_LAST_FRAG __BIT(0) -#define ET_TDCTRL2_FIRST_FRAG __BIT(1) -#define ET_TDCTRL2_INTR __BIT(2) +#define ET_TDCTRL2_LAST_FRAG 0x00000001 +#define ET_TDCTRL2_FIRST_FRAG 0x00000002 +#define ET_TDCTRL2_INTR 0x00000004 +#define ET_TDCTRL2_CTRL_WORD 0x00000008 +#define ET_TDCTRL2_HDX_BACKP 0x00000010 +#define ET_TDCTRL2_XMIT_PAUSE 0x00000020 +#define ET_TDCTRL2_FRAME_ERR 0x00000040 +#define ET_TDCTRL2_NO_CRC 0x00000080 +#define ET_TDCTRL2_MAC_OVRRD 0x00000100 +#define ET_TDCTRL2_PAD_PACKET 0x00000200 +#define ET_TDCTRL2_JUMBO_PACKET 0x00000400 +#define ET_TDCTRL2_INS_VLAN 0x00000800 +#define ET_TDCTRL2_CSUM_IP 0x00001000 +#define ET_TDCTRL2_CSUM_TCP 0x00002000 +#define ET_TDCTRL2_CSUM_UDP 0x00004000 struct et_rxdesc { uint32_t rd_addr_lo; uint32_t rd_addr_hi; uint32_t rd_ctrl; /* ET_RDCTRL_ */ -} __packed; +}; -#define ET_RDCTRL_BUFIDX __BITS(9, 0) +#define ET_RDCTRL_BUFIDX_MASK 0x000003FF struct et_rxstat { uint32_t rxst_info1; uint32_t rxst_info2; /* ET_RXST_INFO2_ */ -} __packed; +}; -#define ET_RXST_INFO2_LEN __BITS(15, 0) -#define ET_RXST_INFO2_BUFIDX __BITS(25, 16) -#define ET_RXST_INFO2_RINGIDX __BITS(27, 26) +#define ET_RXST_INFO2_LEN_MASK 0x0000FFFF +#define ET_RXST_INFO2_LEN_SHIFT 0 +#define ET_RXST_INFO2_BUFIDX_MASK 0x03FF0000 +#define ET_RXST_INFO2_BUFIDX_SHIFT 16 +#define ET_RXST_INFO2_RINGIDX_MASK 0x0C000000 +#define ET_RXST_INFO2_RINGIDX_SHIFT 26 struct et_rxstatus { uint32_t rxs_ring; uint32_t rxs_stat_ring; /* ET_RXS_STATRING_ */ -} __packed; +}; -#define ET_RXS_STATRING_INDEX __BITS(27, 16) -#define ET_RXS_STATRING_WRAP __BIT(28) +#define ET_RXS_STATRING_INDEX_MASK 0x0FFF0000 +#define ET_RXS_STATRING_INDEX_SHIFT 16 +#define ET_RXS_STATRING_WRAP 0x10000000 struct et_dmamap_ctx { int nsegs; @@ -225,8 +241,6 @@ struct et_softc { device_t dev; struct mtx sc_mtx; device_t sc_miibus; - bus_space_handle_t sc_mem_bh; - bus_space_tag_t sc_mem_bt; void *sc_irq_handle; struct resource *sc_irq_res; struct resource *sc_mem_res; @@ -234,6 +248,7 @@ struct et_softc { struct arpcom arpcom; int sc_if_flags; uint32_t sc_flags; /* ET_FLAG_ */ + int sc_expcap; int sc_mem_rid; @@ -273,7 +288,9 @@ struct et_softc { #define ET_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) #define ET_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED) -#define ET_FLAG_TXRX_ENABLED 0x1 -#define ET_FLAG_JUMBO 0x2 +#define ET_FLAG_PCIE 0x0001 +#define ET_FLAG_MSI 0x0002 +#define ET_FLAG_TXRX_ENABLED 0x0100 +#define ET_FLAG_JUMBO 0x0200 #endif /* !_IF_ETVAR_H */ diff --git a/sys/dev/ex/if_ex.c b/sys/dev/ex/if_ex.c index 7a3d74fbc19a..d9e0c98f9fa1 100644 --- a/sys/dev/ex/if_ex.c +++ b/sys/dev/ex/if_ex.c @@ -677,7 +677,7 @@ ex_tx_intr(struct ex_softc *sc) while (sc->tx_head != sc->tx_tail) { CSR_WRITE_2(sc, HOST_ADDR_REG, sc->tx_head); - if (! CSR_READ_2(sc, IO_PORT_REG) & Done_bit) + if (!(CSR_READ_2(sc, IO_PORT_REG) & Done_bit)) break; tx_status = CSR_READ_2(sc, IO_PORT_REG); diff --git a/sys/dev/exca/excareg.h b/sys/dev/exca/excareg.h index 3bb3b4c9474f..c445efe60583 100644 --- a/sys/dev/exca/excareg.h +++ b/sys/dev/exca/excareg.h @@ -355,7 +355,7 @@ /* #define EXCA_RESERVED 0x3E */ /* #define EXCA_RESERVED 0x3F */ -/* cardbus extensions - memory window page registers */ +/* CardBus extensions - memory window page registers */ #define EXCA_MEMREG_WIN_SHIFT 24 #define EXCA_SYSMEM_ADDR0_WIN 0x40 diff --git a/sys/dev/fatm/if_fatm.c b/sys/dev/fatm/if_fatm.c index 47a6443801b0..5dd0c1ddf233 100644 --- a/sys/dev/fatm/if_fatm.c +++ b/sys/dev/fatm/if_fatm.c @@ -391,16 +391,14 @@ fatm_check_heartbeat(struct fatm_softc *sc) * Ensure that the heart is still beating. */ static void -fatm_watchdog(struct ifnet *ifp) +fatm_watchdog(void *arg) { - struct fatm_softc *sc = ifp->if_softc; + struct fatm_softc *sc; - FATM_LOCK(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { - fatm_check_heartbeat(sc); - ifp->if_timer = 5; - } - FATM_UNLOCK(sc); + sc = arg; + FATM_CHECKLOCK(sc); + fatm_check_heartbeat(sc); + callout_reset(&sc->watchdog_timer, hz * 5, fatm_watchdog, sc); } /* @@ -474,7 +472,7 @@ fatm_stop(struct fatm_softc *sc) (void)fatm_reset(sc); /* stop watchdog */ - sc->ifp->if_timer = 0; + callout_stop(&sc->watchdog_timer); if (sc->ifp->if_drv_flags & IFF_DRV_RUNNING) { sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); @@ -860,7 +858,7 @@ fatm_getprom(struct fatm_softc *sc) NEXT_QUEUE_ENTRY(sc->cmdqueue.head, FATM_CMD_QLEN); q->error = 0; - q->cb = NULL;; + q->cb = NULL; H_SETSTAT(q->q.statp, FATM_STAT_PENDING); H_SYNCSTAT_PREWRITE(sc, q->q.statp); @@ -1341,7 +1339,7 @@ fatm_init_locked(struct fatm_softc *sc) /* * Start the watchdog timer */ - sc->ifp->if_timer = 5; + callout_reset(&sc->watchdog_timer, hz * 5, fatm_watchdog, sc); /* start SUNI */ utopia_start(&sc->utopia); @@ -2543,6 +2541,7 @@ fatm_detach(device_t dev) FATM_UNLOCK(sc); atm_ifdetach(sc->ifp); /* XXX race */ } + callout_drain(&sc->watchdog_timer); if (sc->ih != NULL) bus_teardown_intr(dev, sc->irqres, sc->ih); @@ -2784,6 +2783,7 @@ fatm_attach(device_t dev) cv_init(&sc->cv_regs, "fatm_regs"); sysctl_ctx_init(&sc->sysctl_ctx); + callout_init_mtx(&sc->watchdog_timer, &sc->mtx, 0); /* * Make the sysctl tree @@ -2824,7 +2824,6 @@ fatm_attach(device_t dev) ifp->if_flags = IFF_SIMPLEX; ifp->if_ioctl = fatm_ioctl; ifp->if_start = fatm_start; - ifp->if_watchdog = fatm_watchdog; ifp->if_init = fatm_init; ifp->if_linkmib = &IFP2IFATM(sc->ifp)->mib; ifp->if_linkmiblen = sizeof(IFP2IFATM(sc->ifp)->mib); diff --git a/sys/dev/fatm/if_fatmvar.h b/sys/dev/fatm/if_fatmvar.h index 697e91543bd7..bcd87599eaba 100644 --- a/sys/dev/fatm/if_fatmvar.h +++ b/sys/dev/fatm/if_fatmvar.h @@ -188,6 +188,7 @@ struct fatm_softc { struct ifnet *ifp; /* common part */ struct mtx mtx; /* lock this structure */ struct ifmedia media; /* media */ + struct callout watchdog_timer; int init_state; /* initialisation step */ int memid; /* resource id for card memory */ diff --git a/sys/dev/fb/creator.c b/sys/dev/fb/creator.c index 3abaa1ddce87..135fd3dedbb8 100644 --- a/sys/dev/fb/creator.c +++ b/sys/dev/fb/creator.c @@ -692,8 +692,8 @@ creator_blank_display(video_adapter_t *adp, int mode) } static int -creator_mmap(video_adapter_t *adp, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +creator_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { return (EINVAL); @@ -1048,8 +1048,8 @@ creator_fb_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, } static int -creator_fb_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +creator_fb_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { struct creator_softc *sc; int i; diff --git a/sys/dev/fb/fb.c b/sys/dev/fb/fb.c index 21871f69e780..b201d29be61a 100644 --- a/sys/dev/fb/fb.c +++ b/sys/dev/fb/fb.c @@ -511,10 +511,10 @@ int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp, u_long cmd, return error; } -int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp, vm_offset_t offset, - vm_offset_t *paddr, int prot) +int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp, vm_ooffset_t offset, + vm_offset_t *paddr, int prot, vm_memattr_t *memattr) { - return vidd_mmap(adp, offset, paddr, prot); + return vidd_mmap(adp, offset, paddr, prot, memattr); } #endif /* FB_INSTALL_CDEV */ @@ -653,7 +653,7 @@ fb_commonioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) ((video_adapter_info_t *)arg)->va_mem_base = adp->va_mem_base; ((video_adapter_info_t *)arg)->va_mem_size = adp->va_mem_size; ((video_adapter_info_t *)arg)->va_window -#ifdef __i386__ +#if defined(__amd64__) || defined(__i386__) = vtophys(adp->va_window); #else = adp->va_window; @@ -665,8 +665,8 @@ fb_commonioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) ((video_adapter_info_t *)arg)->va_window_orig = adp->va_window_orig; ((video_adapter_info_t *)arg)->va_unused0 -#ifdef __i386__ - = (adp->va_buffer) ? vtophys(adp->va_buffer) : 0; +#if defined(__amd64__) || defined(__i386__) + = adp->va_buffer != 0 ? vtophys(adp->va_buffer) : 0; #else = adp->va_buffer; #endif diff --git a/sys/dev/fb/fbreg.h b/sys/dev/fb/fbreg.h index 0be91d3abd4b..aabe3e36f5da 100644 --- a/sys/dev/fb/fbreg.h +++ b/sys/dev/fb/fbreg.h @@ -131,8 +131,8 @@ typedef int vi_blank_display_t(video_adapter_t *adp, int mode); #define V_DISPLAY_STAND_BY 2 #define V_DISPLAY_SUSPEND 3 */ -typedef int vi_mmap_t(video_adapter_t *adp, vm_offset_t offset, - vm_paddr_t *paddr, int prot); +typedef int vi_mmap_t(video_adapter_t *adp, vm_ooffset_t offset, + vm_paddr_t *paddr, int prot, vm_memattr_t *memattr); typedef int vi_ioctl_t(video_adapter_t *adp, u_long cmd, caddr_t data); typedef int vi_clear_t(video_adapter_t *adp); typedef int vi_fill_rect_t(video_adapter_t *adp, int val, int x, int y, @@ -228,8 +228,9 @@ typedef struct video_switch { (height), (celsize), (blink)) #define vidd_blank_display(adp, mode) \ (*vidsw[(adp)->va_index]->blank_display)((adp), (mode)) -#define vidd_mmap(adp, offset, paddr, prot) \ - (*vidsw[(adp)->va_index]->mmap)((adp), (offset), (paddr), (prot)) +#define vidd_mmap(adp, offset, paddr, prot, memattr) \ + (*vidsw[(adp)->va_index]->mmap)((adp), (offset), (paddr), \ + (prot), (memattr)) #define vidd_ioctl(adp, cmd, data) \ (*vidsw[(adp)->va_index]->ioctl)((adp), (cmd), (data)) #define vidd_clear(adp) \ @@ -317,7 +318,8 @@ int genfbwrite(genfb_softc_t *sc, video_adapter_t *adp, int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp, u_long cmd, caddr_t arg, int flag, struct thread *td); int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp, - vm_offset_t offset, vm_offset_t *paddr, int prot); + vm_ooffset_t offset, vm_offset_t *paddr, + int prot, vm_memattr_t *memattr); #endif /* FB_INSTALL_CDEV */ diff --git a/sys/dev/fb/machfb.c b/sys/dev/fb/machfb.c index a9574f358206..dad41d86ba75 100644 --- a/sys/dev/fb/machfb.c +++ b/sys/dev/fb/machfb.c @@ -837,8 +837,8 @@ machfb_blank_display(video_adapter_t *adp, int mode) } static int -machfb_mmap(video_adapter_t *adp, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +machfb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { struct machfb_softc *sc; video_info_t *vi; diff --git a/sys/dev/fb/s3_pci.c b/sys/dev/fb/s3_pci.c index cfddf3041f09..cd70774f9500 100644 --- a/sys/dev/fb/s3_pci.c +++ b/sys/dev/fb/s3_pci.c @@ -388,10 +388,10 @@ s3lfb_blank_display(video_adapter_t *adp, int mode) } static int -s3lfb_mmap(video_adapter_t *adp, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +s3lfb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { - return (*prevvidsw->mmap)(adp, offset, paddr, prot); + return (*prevvidsw->mmap)(adp, offset, paddr, prot, memattr); } static int diff --git a/sys/dev/fb/vesa.c b/sys/dev/fb/vesa.c index 8a6136828661..26024402d7be 100644 --- a/sys/dev/fb/vesa.c +++ b/sys/dev/fb/vesa.c @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #ifndef VGA_NO_MODE_CHANGE #include +#include #include #include #include @@ -51,6 +52,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include @@ -71,8 +74,7 @@ typedef struct adp_state adp_state_t; /* VESA video adapter */ static video_adapter_t *vesa_adp = NULL; -static int vesa_state_buf_size = 0; -#define VESA_BIOS_BUFSIZE (3 * PAGE_SIZE) +static ssize_t vesa_state_buf_size = -1; /* VESA functions */ #if 0 @@ -160,9 +162,12 @@ static char *vesa_revstr = NULL; #define BIOS_SADDRTOLADDR(p) ((((p) & 0xffff0000) >> 12) + ((p) & 0x0000ffff)) static int int10_set_mode(int mode); +static int vesa_bios_post(void); static int vesa_bios_get_mode(int mode, struct vesa_mode *vmode); static int vesa_bios_set_mode(int mode); +#if 0 static int vesa_bios_get_dac(void); +#endif static int vesa_bios_set_dac(int bits); static int vesa_bios_save_palette(int start, int colors, u_char *palette, int bits); @@ -170,10 +175,8 @@ static int vesa_bios_save_palette2(int start, int colors, u_char *r, u_char *g, u_char *b, int bits); static int vesa_bios_load_palette(int start, int colors, u_char *palette, int bits); -#ifdef notyet static int vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g, u_char *b, int bits); -#endif #define STATE_SIZE 0 #define STATE_SAVE 1 #define STATE_LOAD 2 @@ -183,9 +186,11 @@ static int vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g, #define STATE_REG (1<<3) #define STATE_MOST (STATE_HW | STATE_DATA | STATE_REG) #define STATE_ALL (STATE_HW | STATE_DATA | STATE_DAC | STATE_REG) -static int vesa_bios_state_buf_size(void); +static ssize_t vesa_bios_state_buf_size(void); static int vesa_bios_save_restore(int code, void *p, size_t size); +#if 0 static int vesa_bios_get_line_length(void); +#endif static int vesa_bios_set_line_length(int pixel, int *bytes, int *lines); #if 0 static int vesa_bios_get_start(int *x, int *y); @@ -194,40 +199,79 @@ static int vesa_bios_set_start(int x, int y); static int vesa_map_gen_mode_num(int type, int color, int mode); static int vesa_translate_flags(u_int16_t vflags); static int vesa_translate_mmodel(u_int8_t vmodel); -static int vesa_get_line_width(video_info_t *info); static int vesa_bios_init(void); static void vesa_clear_modes(video_info_t *info, int color); -static vm_offset_t vesa_map_buffer(u_int paddr, size_t size); -static void vesa_unmap_buffer(vm_offset_t vaddr, size_t size); #if 0 static int vesa_get_origin(video_adapter_t *adp, off_t *offset); #endif -static void -dump_buffer(u_char *buf, size_t len) -{ - int i; - - for(i = 0; i < len;) { - printf("%02x ", buf[i]); - if ((++i % 16) == 0) - printf("\n"); - } -} - /* INT 10 BIOS calls */ static int int10_set_mode(int mode) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x0000 | mode; + x86bios_init_regs(®s); + regs.R_AL = mode; x86bios_intr(®s, 0x10); - return 0; + return (0); +} + +static int +vesa_bios_post(void) +{ + x86regs_t regs; + devclass_t dc; + device_t *devs; + device_t dev; + int count, i, is_pci; + + if (x86bios_get_orm(0xc0000) == NULL) + return (1); + + dev = NULL; + is_pci = 0; + + /* Find the matching PCI video controller. */ + dc = devclass_find("vgapci"); + if (dc != NULL && devclass_get_devices(dc, &devs, &count) == 0) { + for (dev = NULL, i = 0; dev == NULL && i < count; devs++, i++) + if (device_get_flags(*devs) != 0 && + x86bios_match_device(0xc0000, *devs)) { + dev = *devs; + is_pci = 1; + break; + } + free(devs, M_TEMP); + } + + /* Try VGA if a PCI device is not found. */ + if (dev == NULL) { + dc = devclass_find(VGA_DRIVER_NAME); + if (dc != NULL) + dev = devclass_get_device(dc, 0); + } + + if (bootverbose) + printf("%s: calling BIOS POST\n", + dev == NULL ? "VESA" : device_get_nameunit(dev)); + + x86bios_init_regs(®s); + if (is_pci) { + regs.R_AH = pci_get_bus(dev); + regs.R_AL = (pci_get_slot(dev) << 3) | + (pci_get_function(dev) & 0x07); + } + regs.R_DL = 0x80; + x86bios_call(®s, 0xc000, 0x0003); + + if (x86bios_get_intr(0x10) == 0) + return (1); + + return (0); } /* VESA BIOS calls */ @@ -235,30 +279,31 @@ static int vesa_bios_get_mode(int mode, struct vesa_mode *vmode) { x86regs_t regs; - int offs; - u_char *buf; + uint32_t offs; + void *buf; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f01; - regs.R_ECX = mode; + buf = x86bios_alloc(&offs, sizeof(*vmode)); + if (buf == NULL) + return (1); - buf = (u_char *)x86bios_alloc(1, &offs); + x86bios_init_regs(®s); + regs.R_AX = 0x4f01; + regs.R_CX = mode; - regs.R_ES = SEG_ADDR(offs); - regs.R_DI = SEG_OFF(offs); + regs.R_ES = X86BIOS_PHYSTOSEG(offs); + regs.R_DI = X86BIOS_PHYSTOOFF(offs); x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - { - x86bios_free(buf, 1); - return 1; + if (regs.R_AX != 0x004f) { + x86bios_free(buf, sizeof(*vmode)); + return (1); } bcopy(buf, vmode, sizeof(*vmode)); - x86bios_free(buf, 1); + x86bios_free(buf, sizeof(*vmode)); - return 0; + return (0); } static int @@ -266,85 +311,89 @@ vesa_bios_set_mode(int mode) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f02; - regs.R_EBX = mode; + x86bios_init_regs(®s); + regs.R_AX = 0x4f02; + regs.R_BX = mode; x86bios_intr(®s, 0x10); - return ((regs.R_AX & 0xff) != 0x4f); + return (regs.R_AX != 0x004f); } +#if 0 static int vesa_bios_get_dac(void) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f08; - regs.R_EBX = 1; + x86bios_init_regs(®s); + regs.R_AX = 0x4f08; + regs.R_BL = 1; x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - return 6; + if (regs.R_AX != 0x004f) + return (6); - return ((regs.R_EBX >> 8) & 0x00ff); + return (regs.R_BH); } +#endif static int vesa_bios_set_dac(int bits) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f08; - regs.R_EBX = (bits << 8); + x86bios_init_regs(®s); + regs.R_AX = 0x4f08; + /* regs.R_BL = 0; */ + regs.R_BH = bits; x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - return 6; + if (regs.R_AX != 0x004f) + return (6); - return ((regs.R_EBX >> 8) & 0x00ff); + return (regs.R_BH); } static int vesa_bios_save_palette(int start, int colors, u_char *palette, int bits) { x86regs_t regs; - int offs; + uint32_t offs; u_char *p; int i; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f09; - regs.R_EBX = 1; - regs.R_ECX = colors; - regs.R_EDX = start; + p = (u_char *)x86bios_alloc(&offs, colors * 4); + if (p == NULL) + return (1); - p = (u_char *)x86bios_alloc(1, &offs); + x86bios_init_regs(®s); + regs.R_AX = 0x4f09; + regs.R_BL = 1; + regs.R_CX = colors; + regs.R_DX = start; - regs.R_ES = SEG_ADDR(offs); - regs.R_DI = SEG_OFF(offs); + regs.R_ES = X86BIOS_PHYSTOSEG(offs); + regs.R_DI = X86BIOS_PHYSTOOFF(offs); x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - { - x86bios_free(p, 1); - return 1; + if (regs.R_AX != 0x004f) { + x86bios_free(p, colors * 4); + return (1); } bits = 8 - bits; for (i = 0; i < colors; ++i) { - palette[i*3] = p[i*4 + 2] << bits; - palette[i*3 + 1] = p[i*4 + 1] << bits; - palette[i*3 + 2] = p[i*4] << bits; + palette[i * 3] = p[i * 4 + 2] << bits; + palette[i * 3 + 1] = p[i * 4 + 1] << bits; + palette[i * 3 + 2] = p[i * 4] << bits; } + x86bios_free(p, colors * 4); - x86bios_free(p, 1); - return 0; + return (0); } static int @@ -352,201 +401,206 @@ vesa_bios_save_palette2(int start, int colors, u_char *r, u_char *g, u_char *b, int bits) { x86regs_t regs; - int offs; + uint32_t offs; u_char *p; int i; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f09; - regs.R_EBX = 1; - regs.R_ECX = colors; - regs.R_EDX = start; + p = (u_char *)x86bios_alloc(&offs, colors * 4); + if (p == NULL) + return (1); - p = (u_char *)x86bios_alloc(1, &offs); + x86bios_init_regs(®s); + regs.R_AX = 0x4f09; + regs.R_BL = 1; + regs.R_CX = colors; + regs.R_DX = start; - regs.R_ES = SEG_ADDR(offs); - regs.R_DI = SEG_OFF(offs); + regs.R_ES = X86BIOS_PHYSTOSEG(offs); + regs.R_DI = X86BIOS_PHYSTOOFF(offs); x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - { - x86bios_free(p, 1); - return 1; + if (regs.R_AX != 0x004f) { + x86bios_free(p, colors * 4); + return (1); } bits = 8 - bits; for (i = 0; i < colors; ++i) { - r[i] = p[i*4 + 2] << bits; - g[i] = p[i*4 + 1] << bits; - b[i] = p[i*4] << bits; + r[i] = p[i * 4 + 2] << bits; + g[i] = p[i * 4 + 1] << bits; + b[i] = p[i * 4] << bits; } + x86bios_free(p, colors * 4); - x86bios_free(p, 1); - return 0; + return (0); } static int vesa_bios_load_palette(int start, int colors, u_char *palette, int bits) { x86regs_t regs; - int offs; + uint32_t offs; u_char *p; int i; - p = (u_char *)x86bios_alloc(1, &offs); + p = (u_char *)x86bios_alloc(&offs, colors * 4); + if (p == NULL) + return (1); + + x86bios_init_regs(®s); + regs.R_AX = 0x4f09; + /* regs.R_BL = 0; */ + regs.R_CX = colors; + regs.R_DX = start; + + regs.R_ES = X86BIOS_PHYSTOSEG(offs); + regs.R_DI = X86BIOS_PHYSTOOFF(offs); bits = 8 - bits; for (i = 0; i < colors; ++i) { - p[i*4] = palette[i*3 + 2] >> bits; - p[i*4 + 1] = palette[i*3 + 1] >> bits; - p[i*4 + 2] = palette[i*3] >> bits; - p[i*4 + 3] = 0; + p[i * 4] = palette[i * 3 + 2] >> bits; + p[i * 4 + 1] = palette[i * 3 + 1] >> bits; + p[i * 4 + 2] = palette[i * 3] >> bits; + p[i * 4 + 3] = 0; } - - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f09; - regs.R_EBX = 0; - regs.R_ECX = colors; - regs.R_EDX = start; - - regs.R_ES = SEG_ADDR(offs); - regs.R_DI = SEG_OFF(offs); - x86bios_intr(®s, 0x10); + x86bios_free(p, colors * 4); - x86bios_free(p, 1); - - return ((regs.R_AX & 0xff) != 0x4f); + return (regs.R_AX != 0x004f); } -#ifdef notyet static int vesa_bios_load_palette2(int start, int colors, u_char *r, u_char *g, u_char *b, int bits) { x86regs_t regs; - int offs; + uint32_t offs; u_char *p; int i; - p = (u_char *)x86bios_alloc(1, &offs); + p = (u_char *)x86bios_alloc(&offs, colors * 4); + if (p == NULL) + return (1); + + x86bios_init_regs(®s); + regs.R_AX = 0x4f09; + /* regs.R_BL = 0; */ + regs.R_CX = colors; + regs.R_DX = start; + + regs.R_ES = X86BIOS_PHYSTOSEG(offs); + regs.R_DI = X86BIOS_PHYSTOOFF(offs); bits = 8 - bits; for (i = 0; i < colors; ++i) { - p[i*4] = b[i] >> bits; - p[i*4 + 1] = g[i] >> bits; - p[i*4 + 2] = r[i] >> bits; - p[i*4 + 3] = 0; + p[i * 4] = b[i] >> bits; + p[i * 4 + 1] = g[i] >> bits; + p[i * 4 + 2] = r[i] >> bits; + p[i * 4 + 3] = 0; } - - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f09; - regs.R_EBX = 0; - regs.R_ECX = colors; - regs.R_EDX = start; - - regs.R_ES = SEG_ADDR(offs); - regs.R_DI = SEG_OFF(offs); - x86bios_intr(®s, 0x10); + x86bios_free(p, colors * 4); - x86bios_free(p, 1); - - return ((regs.R_AX & 0xff) != 0x4f); + return (regs.R_AX != 0x004f); } -#endif -static int +static ssize_t vesa_bios_state_buf_size(void) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f04; - regs.R_ECX = STATE_ALL; - regs.R_EDX = STATE_SIZE; + x86bios_init_regs(®s); + regs.R_AX = 0x4f04; + /* regs.R_DL = STATE_SIZE; */ + regs.R_CX = STATE_ALL; x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - return 0; + if (regs.R_AX != 0x004f) + return (0); - return regs.R_BX * 64; + return (regs.R_BX * 64); } static int vesa_bios_save_restore(int code, void *p, size_t size) { x86regs_t regs; - int offs; - u_char *buf; + uint32_t offs; + void *buf; - if (size > VESA_BIOS_BUFSIZE) + if (code != STATE_SAVE && code != STATE_LOAD) return (1); - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f04; - regs.R_ECX = STATE_ALL; - regs.R_EDX = code; + buf = x86bios_alloc(&offs, size); - buf = (u_char *)x86bios_alloc(1, &offs); + x86bios_init_regs(®s); + regs.R_AX = 0x4f04; + regs.R_DL = code; + regs.R_CX = STATE_ALL; - regs.R_ES = SEG_ADDR(offs); - regs.R_DI = SEG_OFF(offs); + regs.R_ES = X86BIOS_PHYSTOSEG(offs); + regs.R_BX = X86BIOS_PHYSTOOFF(offs); - bcopy(p, buf, size); + switch (code) { + case STATE_SAVE: + x86bios_intr(®s, 0x10); + bcopy(buf, p, size); + break; + case STATE_LOAD: + bcopy(p, buf, size); + x86bios_intr(®s, 0x10); + break; + } + x86bios_free(buf, size); - x86bios_intr(®s, 0x10); - - bcopy(buf, p, size); - - x86bios_free(p, 1); - - return ((regs.R_AX & 0xff) != 0x4f); + return (regs.R_AX != 0x004f); } +#if 0 static int vesa_bios_get_line_length(void) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f06; - regs.R_EBX = 1; + x86bios_init_regs(®s); + regs.R_AX = 0x4f06; + regs.R_BL = 1; x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - return -1; + if (regs.R_AX != 0x004f) + return (-1); - return regs.R_BX; + return (regs.R_BX); } +#endif static int vesa_bios_set_line_length(int pixel, int *bytes, int *lines) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f06; - regs.R_EBX = 0; - regs.R_ECX = pixel; + x86bios_init_regs(®s); + regs.R_AX = 0x4f06; + /* regs.R_BL = 0; */ + regs.R_CX = pixel; x86bios_intr(®s, 0x10); #if VESA_DEBUG > 1 printf("bx:%d, cx:%d, dx:%d\n", regs.R_BX, regs.R_CX, regs.R_DX); #endif - if ((regs.R_AX & 0xff) != 0x4f) - return -1; + if (regs.R_AX != 0x004f) + return (-1); - if (bytes) + if (bytes != NULL) *bytes = regs.R_BX; - if (lines) + if (lines != NULL) *lines = regs.R_DX; - return 0; + return (0); } #if 0 @@ -555,19 +609,19 @@ vesa_bios_get_start(int *x, int *y) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f07; - regs.R_EBX = 1; + x86bios_init_regs(®s); + regs.R_AX = 0x4f07; + regs.R_BL = 1; x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - return -1; + if (regs.R_AX != 0x004f) + return (-1); *x = regs.R_CX; *y = regs.R_DX; - return 0; + return (0); } #endif @@ -576,15 +630,15 @@ vesa_bios_set_start(int x, int y) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f07; - regs.R_EBX = 0x80; - regs.R_EDX = y; - regs.R_ECX = x; + x86bios_init_regs(®s); + regs.R_AX = 0x4f07; + regs.R_BL = 0x80; + regs.R_CX = x; + regs.R_DX = y; x86bios_intr(®s, 0x10); - return ((regs.R_AX & 0xff) != 0x4f); + return (regs.R_AX != 0x004f); } /* map a generic video mode to a known mode */ @@ -604,9 +658,9 @@ vesa_map_gen_mode_num(int type, int color, int mode) for (i = 0; i < sizeof(mode_map)/sizeof(mode_map[0]); ++i) { if (mode_map[i].from == mode) - return mode_map[i].to; + return (mode_map[i].to); } - return mode; + return (mode); } static int @@ -620,6 +674,7 @@ vesa_translate_flags(u_int16_t vflags) { V_MODECOLOR, V_INFO_COLOR, 0 }, { V_MODEGRAPHICS, V_INFO_GRAPHICS, 0 }, { V_MODELFB, V_INFO_LINEAR, 0 }, + { V_MODENONVGA, V_INFO_NONVGA, 0 }, }; int flags; int i; @@ -628,7 +683,7 @@ vesa_translate_flags(u_int16_t vflags) flags |= (vflags & ftable[i].mask) ? ftable[i].set : ftable[i].reset; } - return flags; + return (flags); } static int @@ -649,41 +704,22 @@ vesa_translate_mmodel(u_int8_t vmodel) for (i = 0; mtable[i].mmodel >= 0; ++i) { if (mtable[i].vmodel == vmodel) - return mtable[i].mmodel; + return (mtable[i].mmodel); } - return V_INFO_MM_OTHER; + return (V_INFO_MM_OTHER); } -static int -vesa_get_line_width(video_info_t *info) -{ - int len; - int width; +#define VESA_MAXSTR 256 - width = info->vi_width; - - if (info->vi_flags & V_INFO_GRAPHICS) - switch (info->vi_depth / info->vi_planes) { - case 1: - return (width / 8); - case 2: - return (width / 4); - case 4: - return (width / 2); - case 8: - return (width); - case 15: - case 16: - return (width * 2); - case 24: - case 32: - return (width * 4); - } - - len = vesa_bios_get_line_length(); - - return (len > 0 ? len : width); -} +#define VESA_STRCPY(dst, src) do { \ + char *str; \ + int i; \ + dst = malloc(VESA_MAXSTR, M_DEVBUF, M_WAITOK); \ + str = x86bios_offset(BIOS_SADDRTOLADDR(src)); \ + for (i = 0; i < VESA_MAXSTR - 1 && str[i] != '\0'; i++) \ + dst[i] = str[i]; \ + dst[i] = '\0'; \ +} while (0) static int vesa_bios_init(void) @@ -693,83 +729,128 @@ vesa_bios_init(void) video_info_t *p; x86regs_t regs; size_t bsize; - int offs; - u_char *vmbuf; + size_t msize; + void *vmbuf; + uint32_t offs; + uint16_t vers; + int bpsl; int is_via_cle266; int modes; int i; if (vesa_init_done) - return 0; + return (0); has_vesa_bios = FALSE; vesa_adp_info = NULL; vesa_vmode_max = 0; vesa_vmode[0].vi_mode = EOT; - vmbuf = (u_char *)x86bios_alloc(1, &offs); + /* + * If the VBE real mode interrupt vector is not found, try BIOS POST. + */ + if (x86bios_get_intr(0x10) == 0) { + if (vesa_bios_post() != 0) + return (1); + if (bootverbose) { + offs = x86bios_get_intr(0x10); + printf("VESA: interrupt vector installed (0x%x)\n", + BIOS_SADDRTOLADDR(offs)); + } + } + + x86bios_init_regs(®s); + regs.R_AX = 0x4f00; + + vmbuf = x86bios_alloc(&offs, sizeof(buf)); + if (vmbuf == NULL) + return (1); + + regs.R_ES = X86BIOS_PHYSTOSEG(offs); + regs.R_DI = X86BIOS_PHYSTOOFF(offs); + bcopy("VBE2", vmbuf, 4); /* try for VBE2 data */ - - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f00; - regs.R_ES = SEG_ADDR(offs); - regs.R_DI = SEG_OFF(offs); - x86bios_intr(®s, 0x10); - if (((regs.R_AX & 0xff) != 0x4f) || bcmp("VESA", vmbuf, 4)) - return 1; + if (regs.R_AX != 0x004f || bcmp("VESA", vmbuf, 4) != 0) + goto fail; bcopy(vmbuf, &buf, sizeof(buf)); vesa_adp_info = &buf; if (bootverbose) { printf("VESA: information block\n"); - dump_buffer((u_char *)&buf, sizeof(buf)); + hexdump(&buf, sizeof(buf), NULL, HD_OMIT_CHARS); } - if (vesa_adp_info->v_version < 0x0102) { + + vers = buf.v_version = le16toh(buf.v_version); + buf.v_oemstr = le32toh(buf.v_oemstr); + buf.v_flags = le32toh(buf.v_flags); + buf.v_modetable = le32toh(buf.v_modetable); + buf.v_memsize = le16toh(buf.v_memsize); + buf.v_revision = le16toh(buf.v_revision); + buf.v_venderstr = le32toh(buf.v_venderstr); + buf.v_prodstr = le32toh(buf.v_prodstr); + buf.v_revstr = le32toh(buf.v_revstr); + + if (vers < 0x0102) { printf("VESA: VBE version %d.%d is not supported; " - "version 1.2 or later is required.\n", - ((vesa_adp_info->v_version & 0xf000) >> 12) * 10 - + ((vesa_adp_info->v_version & 0x0f00) >> 8), - ((vesa_adp_info->v_version & 0x00f0) >> 4) * 10 - + (vesa_adp_info->v_version & 0x000f)); - return 1; + "version 1.2 or later is required.\n", + ((vers & 0xf000) >> 12) * 10 + ((vers & 0x0f00) >> 8), + ((vers & 0x00f0) >> 4) * 10 + (vers & 0x000f)); + return (1); } - vesa_oemstr = (char *)x86bios_offset(FARP(vesa_adp_info->v_oemstr)); - - is_via_cle266 = strcmp(vesa_oemstr, VESA_VIA_CLE266) == 0; - - if (vesa_adp_info->v_version >= 0x0200) { - vesa_venderstr = (char *)x86bios_offset(FARP(vesa_adp_info->v_venderstr)); - vesa_prodstr = (char *)x86bios_offset(FARP(vesa_adp_info->v_prodstr)); - vesa_revstr = (char *)x86bios_offset(FARP(vesa_adp_info->v_revstr)); + VESA_STRCPY(vesa_oemstr, buf.v_oemstr); + if (vers >= 0x0200) { + VESA_STRCPY(vesa_venderstr, buf.v_venderstr); + VESA_STRCPY(vesa_prodstr, buf.v_prodstr); + VESA_STRCPY(vesa_revstr, buf.v_revstr); } + is_via_cle266 = strncmp(vesa_oemstr, VESA_VIA_CLE266, + sizeof(VESA_VIA_CLE266)) == 0; - vesa_vmodetab = (uint16_t *)x86bios_offset(FARP(vesa_adp_info->v_modetable)); + if (buf.v_modetable == 0) + goto fail; - if (vesa_vmodetab == NULL) - return 1; + msize = (size_t)buf.v_memsize * 64 * 1024; - for (i = 0, modes = 0; - (i < (M_VESA_MODE_MAX - M_VESA_BASE + 1)) - && (vesa_vmodetab[i] != 0xffff); ++i) { + vesa_vmodetab = x86bios_offset(BIOS_SADDRTOLADDR(buf.v_modetable)); + + for (i = 0, modes = 0; (i < (M_VESA_MODE_MAX - M_VESA_BASE + 1)) && + (vesa_vmodetab[i] != 0xffff); ++i) { + vesa_vmodetab[i] = le16toh(vesa_vmodetab[i]); if (vesa_bios_get_mode(vesa_vmodetab[i], &vmode)) continue; + vmode.v_modeattr = le16toh(vmode.v_modeattr); + vmode.v_wgran = le16toh(vmode.v_wgran); + vmode.v_wsize = le16toh(vmode.v_wsize); + vmode.v_waseg = le16toh(vmode.v_waseg); + vmode.v_wbseg = le16toh(vmode.v_wbseg); + vmode.v_posfunc = le32toh(vmode.v_posfunc); + vmode.v_bpscanline = le16toh(vmode.v_bpscanline); + vmode.v_width = le16toh(vmode.v_width); + vmode.v_height = le16toh(vmode.v_height); + vmode.v_lfb = le32toh(vmode.v_lfb); + vmode.v_offscreen = le32toh(vmode.v_offscreen); + vmode.v_offscreensize = le16toh(vmode.v_offscreensize); + vmode.v_linbpscanline = le16toh(vmode.v_linbpscanline); + vmode.v_maxpixelclock = le32toh(vmode.v_maxpixelclock); + /* reject unsupported modes */ #if 0 - if ((vmode.v_modeattr & (V_MODESUPP | V_MODEOPTINFO - | V_MODENONVGA)) - != (V_MODESUPP | V_MODEOPTINFO)) + if ((vmode.v_modeattr & + (V_MODESUPP | V_MODEOPTINFO | V_MODENONVGA)) != + (V_MODESUPP | V_MODEOPTINFO)) continue; #else if ((vmode.v_modeattr & V_MODEOPTINFO) == 0) { #if VESA_DEBUG > 1 - printf( - "Rejecting VESA %s mode: %d x %d x %d bpp attr = %x\n", - vmode.v_modeattr & V_MODEGRAPHICS ? "graphics" : "text", + printf("Rejecting VESA %s mode: %d x %d x %d bpp " + " attr = %x\n", + vmode.v_modeattr & V_MODEGRAPHICS ? + "graphics" : "text", vmode.v_width, vmode.v_height, vmode.v_bpp, vmode.v_modeattr); #endif @@ -777,14 +858,33 @@ vesa_bios_init(void) } #endif + bpsl = (vmode.v_modeattr & V_MODELFB) != 0 && vers >= 0x0300 ? + vmode.v_linbpscanline : vmode.v_bpscanline; + bsize = bpsl * vmode.v_height; + if ((vmode.v_modeattr & V_MODEGRAPHICS) != 0) + bsize *= vmode.v_planes; + + /* Does it have enough memory to support this mode? */ + if (msize < bsize) { +#if VESA_DEBUG > 1 + printf("Rejecting VESA %s mode: %d x %d x %d bpp " + " attr = %x, not enough memory\n", + vmode.v_modeattr & V_MODEGRAPHICS ? + "graphics" : "text", + vmode.v_width, vmode.v_height, vmode.v_bpp, + vmode.v_modeattr); +#endif + continue; + } + /* expand the array if necessary */ if (modes >= vesa_vmode_max) { vesa_vmode_max += MODE_TABLE_DELTA; - p = malloc(sizeof(*vesa_vmode)*(vesa_vmode_max + 1), - M_DEVBUF, M_WAITOK); + p = malloc(sizeof(*vesa_vmode) * (vesa_vmode_max + 1), + M_DEVBUF, M_WAITOK); #if VESA_DEBUG > 1 printf("vesa_bios_init(): modes:%d, vesa_mode_max:%d\n", - modes, vesa_vmode_max); + modes, vesa_vmode_max); #endif if (modes > 0) { bcopy(vesa_vmode, p, sizeof(*vesa_vmode)*modes); @@ -814,90 +914,95 @@ vesa_bios_init(void) vesa_vmode[modes].vi_planes = vmode.v_planes; vesa_vmode[modes].vi_cwidth = vmode.v_cwidth; vesa_vmode[modes].vi_cheight = vmode.v_cheight; - vesa_vmode[modes].vi_window = (u_int)vmode.v_waseg << 4; + vesa_vmode[modes].vi_window = (vm_offset_t)vmode.v_waseg << 4; /* XXX window B */ - vesa_vmode[modes].vi_window_size = vmode.v_wsize*1024; - vesa_vmode[modes].vi_window_gran = vmode.v_wgran*1024; + vesa_vmode[modes].vi_window_size = vmode.v_wsize * 1024; + vesa_vmode[modes].vi_window_gran = vmode.v_wgran * 1024; if (vmode.v_modeattr & V_MODELFB) vesa_vmode[modes].vi_buffer = vmode.v_lfb; - else - vesa_vmode[modes].vi_buffer = 0; - /* XXX */ - vesa_vmode[modes].vi_buffer_size - = vesa_adp_info->v_memsize*64*1024; -#if 0 - if (vmode.v_offscreen > vmode.v_lfb) - vesa_vmode[modes].vi_buffer_size - = vmode.v_offscreen + vmode.v_offscreensize*1024 - - vmode.v_lfb; - else - vesa_vmode[modes].vi_buffer_size - = vmode.v_offscreen + vmode.v_offscreensize * 1024; -#endif - vesa_vmode[modes].vi_mem_model - = vesa_translate_mmodel(vmode.v_memmodel); - vesa_vmode[modes].vi_pixel_fields[0] = 0; - vesa_vmode[modes].vi_pixel_fields[1] = 0; - vesa_vmode[modes].vi_pixel_fields[2] = 0; - vesa_vmode[modes].vi_pixel_fields[3] = 0; - vesa_vmode[modes].vi_pixel_fsizes[0] = 0; - vesa_vmode[modes].vi_pixel_fsizes[1] = 0; - vesa_vmode[modes].vi_pixel_fsizes[2] = 0; - vesa_vmode[modes].vi_pixel_fsizes[3] = 0; - if (vesa_vmode[modes].vi_mem_model == V_INFO_MM_PACKED) { - vesa_vmode[modes].vi_pixel_size = (vmode.v_bpp + 7)/8; - } else if (vesa_vmode[modes].vi_mem_model == V_INFO_MM_DIRECT) { - vesa_vmode[modes].vi_pixel_size = (vmode.v_bpp + 7)/8; - vesa_vmode[modes].vi_pixel_fields[0] - = vmode.v_redfieldpos; - vesa_vmode[modes].vi_pixel_fields[1] - = vmode.v_greenfieldpos; - vesa_vmode[modes].vi_pixel_fields[2] - = vmode.v_bluefieldpos; - vesa_vmode[modes].vi_pixel_fields[3] - = vmode.v_resfieldpos; - vesa_vmode[modes].vi_pixel_fsizes[0] - = vmode.v_redmasksize; - vesa_vmode[modes].vi_pixel_fsizes[1] - = vmode.v_greenmasksize; - vesa_vmode[modes].vi_pixel_fsizes[2] - = vmode.v_bluemasksize; - vesa_vmode[modes].vi_pixel_fsizes[3] - = vmode.v_resmasksize; - } else { - vesa_vmode[modes].vi_pixel_size = 0; - } - - vesa_vmode[modes].vi_flags - = vesa_translate_flags(vmode.v_modeattr) | V_INFO_VESA; - - /* Does it have enough memory to support this mode? */ - bsize = vesa_get_line_width(&vesa_vmode[modes]); - bsize *= vesa_vmode[modes].vi_height; - if (bsize > vesa_vmode[modes].vi_buffer_size) { -#if VESA_DEBUG > 1 - printf( - "Rejecting VESA %s mode: %d x %d x %d bpp attr = %x, not enough memory\n", - (vmode.v_modeattr & V_MODEGRAPHICS) != 0 ? "graphics" : "text", - vmode.v_width, vmode.v_height, vmode.v_bpp, vmode.v_modeattr); -#endif - continue; + vesa_vmode[modes].vi_buffer_size = bsize; + vesa_vmode[modes].vi_mem_model = + vesa_translate_mmodel(vmode.v_memmodel); + switch (vesa_vmode[modes].vi_mem_model) { + case V_INFO_MM_DIRECT: + if ((vmode.v_modeattr & V_MODELFB) != 0 && + vers >= 0x0300) { + vesa_vmode[modes].vi_pixel_fields[0] = + vmode.v_linredfieldpos; + vesa_vmode[modes].vi_pixel_fields[1] = + vmode.v_lingreenfieldpos; + vesa_vmode[modes].vi_pixel_fields[2] = + vmode.v_linbluefieldpos; + vesa_vmode[modes].vi_pixel_fields[3] = + vmode.v_linresfieldpos; + vesa_vmode[modes].vi_pixel_fsizes[0] = + vmode.v_linredmasksize; + vesa_vmode[modes].vi_pixel_fsizes[1] = + vmode.v_lingreenmasksize; + vesa_vmode[modes].vi_pixel_fsizes[2] = + vmode.v_linbluemasksize; + vesa_vmode[modes].vi_pixel_fsizes[3] = + vmode.v_linresmasksize; + } else { + vesa_vmode[modes].vi_pixel_fields[0] = + vmode.v_redfieldpos; + vesa_vmode[modes].vi_pixel_fields[1] = + vmode.v_greenfieldpos; + vesa_vmode[modes].vi_pixel_fields[2] = + vmode.v_bluefieldpos; + vesa_vmode[modes].vi_pixel_fields[3] = + vmode.v_resfieldpos; + vesa_vmode[modes].vi_pixel_fsizes[0] = + vmode.v_redmasksize; + vesa_vmode[modes].vi_pixel_fsizes[1] = + vmode.v_greenmasksize; + vesa_vmode[modes].vi_pixel_fsizes[2] = + vmode.v_bluemasksize; + vesa_vmode[modes].vi_pixel_fsizes[3] = + vmode.v_resmasksize; + } + /* FALLTHROUGH */ + case V_INFO_MM_PACKED: + vesa_vmode[modes].vi_pixel_size = (vmode.v_bpp + 7) / 8; + break; } + vesa_vmode[modes].vi_flags = + vesa_translate_flags(vmode.v_modeattr) | V_INFO_VESA; ++modes; } vesa_vmode[modes].vi_mode = EOT; - x86bios_free(vmbuf, 1); - if (bootverbose) printf("VESA: %d mode(s) found\n", modes); has_vesa_bios = (modes > 0); if (!has_vesa_bios) - return (1); + goto fail; + x86bios_free(vmbuf, sizeof(buf)); return (0); + +fail: + if (vmbuf != NULL) + x86bios_free(vmbuf, sizeof(buf)); + if (vesa_oemstr != NULL) { + free(vesa_oemstr, M_DEVBUF); + vesa_oemstr = NULL; + } + if (vesa_venderstr != NULL) { + free(vesa_venderstr, M_DEVBUF); + vesa_venderstr = NULL; + } + if (vesa_prodstr != NULL) { + free(vesa_prodstr, M_DEVBUF); + vesa_prodstr = NULL; + } + if (vesa_revstr != NULL) { + free(vesa_revstr, M_DEVBUF); + vesa_revstr = NULL; + } + return (1); } static void @@ -910,31 +1015,6 @@ vesa_clear_modes(video_info_t *info, int color) } } -static vm_offset_t -vesa_map_buffer(u_int paddr, size_t size) -{ - vm_offset_t vaddr; - u_int off; - - off = paddr - trunc_page(paddr); - vaddr = (vm_offset_t)pmap_mapdev_attr(paddr - off, size + off, - PAT_WRITE_COMBINING); -#if VESA_DEBUG > 1 - printf("vesa_map_buffer: paddr:%x vaddr:%tx size:%zx off:%x\n", - paddr, vaddr, size, off); -#endif - return (vaddr + off); -} - -static void -vesa_unmap_buffer(vm_offset_t vaddr, size_t size) -{ -#if VESA_DEBUG > 1 - printf("vesa_unmap_buffer: vaddr:%tx size:%zx\n", vaddr, size); -#endif - kmem_free(kernel_map, vaddr, size); -} - /* entry points */ static int @@ -946,9 +1026,9 @@ vesa_configure(int flags) int i; if (vesa_init_done) - return 0; + return (0); if (flags & VIO_PROBE_ONLY) - return 0; /* XXX */ + return (0); /* * If the VESA module has already been loaded, abort loading @@ -956,10 +1036,11 @@ vesa_configure(int flags) */ for (i = 0; (adp = vid_get_adapter(i)) != NULL; ++i) { if (adp->va_flags & V_ADP_VESA) - return ENXIO; + return (ENXIO); if (adp->va_type == KD_VGA) break; } + /* * The VGA adapter is not found. This is because either * 1) the VGA driver has not been initialized, or 2) the VGA card @@ -968,7 +1049,7 @@ vesa_configure(int flags) */ if (adp == NULL) { vga_sub_configure = vesa_configure; - return ENODEV; + return (ENODEV); } /* count number of registered adapters */ @@ -980,7 +1061,7 @@ vesa_configure(int flags) vesa_adp = adp; if (vesa_bios_init()) { vesa_adp = NULL; - return ENXIO; + return (ENXIO); } vesa_adp->va_flags |= V_ADP_VESA; @@ -997,36 +1078,40 @@ vesa_configure(int flags) vesa_init_done = TRUE; } else { vesa_adp = NULL; - return error; + return (error); } - return 0; + return (0); } #if 0 static int vesa_nop(void) { - return 0; + + return (0); } #endif static int vesa_error(void) { - return 1; + + return (1); } static int vesa_probe(int unit, video_adapter_t **adpp, void *arg, int flags) { - return (*prevvidsw->probe)(unit, adpp, arg, flags); + + return ((*prevvidsw->probe)(unit, adpp, arg, flags)); } static int vesa_init(int unit, video_adapter_t *adp, int flags) { - return (*prevvidsw->init)(unit, adp, flags); + + return ((*prevvidsw->init)(unit, adp, flags)); } static int @@ -1035,10 +1120,10 @@ vesa_get_info(video_adapter_t *adp, int mode, video_info_t *info) int i; if ((*prevvidsw->get_info)(adp, mode, info) == 0) - return 0; + return (0); if (adp != vesa_adp) - return 1; + return (1); mode = vesa_map_gen_mode_num(vesa_adp->va_type, vesa_adp->va_flags & V_ADP_COLOR, mode); @@ -1047,10 +1132,10 @@ vesa_get_info(video_adapter_t *adp, int mode, video_info_t *info) continue; if (vesa_vmode[i].vi_mode == mode) { *info = vesa_vmode[i]; - return 0; + return (0); } } - return 1; + return (1); } static int @@ -1059,9 +1144,9 @@ vesa_query_mode(video_adapter_t *adp, video_info_t *info) int i; if ((*prevvidsw->query_mode)(adp, info) == 0) - return 0; + return (0); if (adp != vesa_adp) - return ENODEV; + return (ENODEV); for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) { if ((info->vi_width != 0) @@ -1087,9 +1172,9 @@ vesa_query_mode(video_adapter_t *adp, video_info_t *info) && (info->vi_flags != vesa_vmode[i].vi_flags)) continue; *info = vesa_vmode[i]; - return 0; + return (0); } - return ENODEV; + return (ENODEV); } static int @@ -1098,7 +1183,7 @@ vesa_set_mode(video_adapter_t *adp, int mode) video_info_t info; if (adp != vesa_adp) - return (*prevvidsw->set_mode)(adp, mode); + return ((*prevvidsw->set_mode)(adp, mode)); mode = vesa_map_gen_mode_num(adp->va_type, adp->va_flags & V_ADP_COLOR, mode); @@ -1115,11 +1200,16 @@ vesa_set_mode(video_adapter_t *adp, int mode) * the new mode correctly. */ if (VESA_MODE(adp->va_mode)) { - if ((*prevvidsw->get_info)(adp, mode, &info) == 0) { + if (!VESA_MODE(mode) && + (*prevvidsw->get_info)(adp, mode, &info) == 0) { + if ((adp->va_flags & V_ADP_DAC8) != 0) { + vesa_bios_set_dac(6); + adp->va_flags &= ~V_ADP_DAC8; + } int10_set_mode(adp->va_initial_bios_mode); if (adp->va_info.vi_flags & V_INFO_LINEAR) - vesa_unmap_buffer(adp->va_buffer, - vesa_adp_info->v_memsize*64*1024); + pmap_unmapdev(adp->va_buffer, + adp->va_buffer_size); /* * Once (*prevvidsw->get_info)() succeeded, * (*prevvidsw->set_mode)() below won't fail... @@ -1128,12 +1218,12 @@ vesa_set_mode(video_adapter_t *adp, int mode) } /* we may not need to handle this mode after all... */ - if ((*prevvidsw->set_mode)(adp, mode) == 0) - return 0; + if (!VESA_MODE(mode) && (*prevvidsw->set_mode)(adp, mode) == 0) + return (0); /* is the new mode supported? */ if (vesa_get_info(adp, mode, &info)) - return 1; + return (1); /* assert(VESA_MODE(mode)); */ #if VESA_DEBUG > 0 @@ -1144,11 +1234,19 @@ vesa_set_mode(video_adapter_t *adp, int mode) info.vi_flags &= ~V_INFO_LINEAR; if (vesa_bios_set_mode(mode | ((info.vi_flags & V_INFO_LINEAR) ? 0x4000 : 0))) - return 1; + return (1); + + /* Palette format is reset by the above VBE function call. */ + adp->va_flags &= ~V_ADP_DAC8; + + if ((vesa_adp_info->v_flags & V_DAC8) != 0 && + (info.vi_flags & V_INFO_GRAPHICS) != 0 && + (info.vi_flags & V_INFO_NONVGA) != 0 && + vesa_bios_set_dac(8) > 6) + adp->va_flags |= V_ADP_DAC8; if (adp->va_info.vi_flags & V_INFO_LINEAR) - vesa_unmap_buffer(adp->va_buffer, - vesa_adp_info->v_memsize*64*1024); + pmap_unmapdev(adp->va_buffer, adp->va_buffer_size); #if VESA_DEBUG > 0 printf("VESA: mode set!\n"); @@ -1164,21 +1262,22 @@ vesa_set_mode(video_adapter_t *adp, int mode) printf("VESA: setting up LFB\n"); #endif vesa_adp->va_buffer = - vesa_map_buffer(info.vi_buffer, - vesa_adp_info->v_memsize*64*1024); - vesa_adp->va_buffer_size = info.vi_buffer_size; + (vm_offset_t)pmap_mapdev_attr(info.vi_buffer, + info.vi_buffer_size, PAT_WRITE_COMBINING); vesa_adp->va_window = vesa_adp->va_buffer; - vesa_adp->va_window_size = info.vi_buffer_size/info.vi_planes; - vesa_adp->va_window_gran = info.vi_buffer_size/info.vi_planes; + vesa_adp->va_window_size = info.vi_buffer_size / info.vi_planes; + vesa_adp->va_window_gran = info.vi_buffer_size / info.vi_planes; } else { vesa_adp->va_buffer = 0; - vesa_adp->va_buffer_size = info.vi_buffer_size; - vesa_adp->va_window = BIOS_PADDRTOVADDR(info.vi_window); + vesa_adp->va_window = (vm_offset_t)x86bios_offset(info.vi_window); vesa_adp->va_window_size = info.vi_window_size; vesa_adp->va_window_gran = info.vi_window_gran; } + vesa_adp->va_buffer_size = info.vi_buffer_size; vesa_adp->va_window_orig = 0; - vesa_adp->va_line_width = vesa_get_line_width(&info); + vesa_adp->va_line_width = info.vi_buffer_size / info.vi_height; + if ((info.vi_flags & V_INFO_GRAPHICS) != 0) + vesa_adp->va_line_width /= info.vi_planes; vesa_adp->va_disp_start.x = 0; vesa_adp->va_disp_start.y = 0; #if VESA_DEBUG > 0 @@ -1190,103 +1289,108 @@ vesa_set_mode(video_adapter_t *adp, int mode) /* move hardware cursor out of the way */ (*vidsw[vesa_adp->va_index]->set_hw_cursor)(vesa_adp, -1, -1); - return 0; + return (0); } static int vesa_save_font(video_adapter_t *adp, int page, int fontsize, int fontwidth, u_char *data, int ch, int count) { - return (*prevvidsw->save_font)(adp, page, fontsize, fontwidth, data, - ch, count); + + return ((*prevvidsw->save_font)(adp, page, fontsize, fontwidth, data, + ch, count)); } static int vesa_load_font(video_adapter_t *adp, int page, int fontsize, int fontwidth, u_char *data, int ch, int count) { - return (*prevvidsw->load_font)(adp, page, fontsize, fontwidth, data, - ch, count); + + return ((*prevvidsw->load_font)(adp, page, fontsize, fontwidth, data, + ch, count)); } static int vesa_show_font(video_adapter_t *adp, int page) { - return (*prevvidsw->show_font)(adp, page); + + return ((*prevvidsw->show_font)(adp, page)); } static int vesa_save_palette(video_adapter_t *adp, u_char *palette) { int bits; - int error; - if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8) - && VESA_MODE(adp->va_mode)) { - bits = vesa_bios_get_dac(); - error = vesa_bios_save_palette(0, 256, palette, bits); - if (error == 0) - return 0; - if (bits != 6) - return error; + if (adp == vesa_adp && VESA_MODE(adp->va_mode) && + (adp->va_info.vi_flags & V_INFO_NONVGA) != 0) { + bits = (adp->va_flags & V_ADP_DAC8) != 0 ? 8 : 6; + return (vesa_bios_save_palette(0, 256, palette, bits)); } - return (*prevvidsw->save_palette)(adp, palette); + return ((*prevvidsw->save_palette)(adp, palette)); } static int vesa_load_palette(video_adapter_t *adp, u_char *palette) { -#ifdef notyet int bits; - int error; - if ((adp == vesa_adp) && (vesa_adp_info->v_flags & V_DAC8) - && VESA_MODE(adp->va_mode) && ((bits = vesa_bios_set_dac(8)) > 6)) { - error = vesa_bios_load_palette(0, 256, palette, bits); - if (error == 0) - return 0; - if (vesa_bios_set_dac(6) != 6) - return 1; + if (adp == vesa_adp && VESA_MODE(adp->va_mode) && + (adp->va_info.vi_flags & V_INFO_NONVGA) != 0) { + bits = (adp->va_flags & V_ADP_DAC8) != 0 ? 8 : 6; + return (vesa_bios_load_palette(0, 256, palette, bits)); } -#endif /* notyet */ - return (*prevvidsw->load_palette)(adp, palette); + return ((*prevvidsw->load_palette)(adp, palette)); } static int vesa_set_border(video_adapter_t *adp, int color) { - return (*prevvidsw->set_border)(adp, color); + + return ((*prevvidsw->set_border)(adp, color)); } static int vesa_save_state(video_adapter_t *adp, void *p, size_t size) { - if (adp != vesa_adp) - return (*prevvidsw->save_state)(adp, p, size); - if (vesa_state_buf_size == 0) + if (adp != vesa_adp) + return ((*prevvidsw->save_state)(adp, p, size)); + + if (vesa_state_buf_size == -1) { vesa_state_buf_size = vesa_bios_state_buf_size(); + if (vesa_state_buf_size == 0) + return (1); + } if (size == 0) - return (sizeof(int) + vesa_state_buf_size); - else if (size < (sizeof(int) + vesa_state_buf_size)) - return 1; + return (offsetof(adp_state_t, regs) + vesa_state_buf_size); + else if (size < (offsetof(adp_state_t, regs) + vesa_state_buf_size)) + return (1); ((adp_state_t *)p)->sig = V_STATE_SIG; bzero(((adp_state_t *)p)->regs, vesa_state_buf_size); - return vesa_bios_save_restore(STATE_SAVE, ((adp_state_t *)p)->regs, - vesa_state_buf_size); + return (vesa_bios_save_restore(STATE_SAVE, ((adp_state_t *)p)->regs, + vesa_state_buf_size)); } static int vesa_load_state(video_adapter_t *adp, void *p) { - if ((adp != vesa_adp) || (((adp_state_t *)p)->sig != V_STATE_SIG)) - return (*prevvidsw->load_state)(adp, p); - return vesa_bios_save_restore(STATE_LOAD, ((adp_state_t *)p)->regs, - vesa_state_buf_size); + if ((adp != vesa_adp) || (((adp_state_t *)p)->sig != V_STATE_SIG)) + return ((*prevvidsw->load_state)(adp, p)); + + if (vesa_state_buf_size <= 0) + return (1); + + /* Try BIOS POST to restore a sane state. */ + (void)vesa_bios_post(); + (void)int10_set_mode(adp->va_initial_bios_mode); + + return (vesa_bios_save_restore(STATE_LOAD, ((adp_state_t *)p)->regs, + vesa_state_buf_size)); } #if 0 @@ -1295,17 +1399,17 @@ vesa_get_origin(video_adapter_t *adp, off_t *offset) { x86regs_t regs; - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f05; - regs.R_EBX = 0x10; + x86bios_init_regs(®s); + regs.R_AX = 0x4f05; + regs.R_BL = 0x10; x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - return 1; + if (regs.R_AX != 0x004f) + return (1); *offset = regs.DX * adp->va_window_gran; - return 0; + return (0); } #endif @@ -1321,99 +1425,107 @@ vesa_set_origin(video_adapter_t *adp, off_t offset) * detect error. */ if (adp != vesa_adp) - return (*prevvidsw->set_win_org)(adp, offset); + return ((*prevvidsw->set_win_org)(adp, offset)); /* if this is a linear frame buffer, do nothing */ if (adp->va_info.vi_flags & V_INFO_LINEAR) - return 0; + return (0); /* XXX */ if (adp->va_window_gran == 0) - return 1; + return (1); - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f05; - regs.R_EBX = 0; - regs.R_EDX = offset / adp->va_window_gran; + x86bios_init_regs(®s); + regs.R_AX = 0x4f05; + regs.R_DX = offset / adp->va_window_gran; + x86bios_intr(®s, 0x10); - if ((regs.R_AX & 0xff) != 0x4f) - return 1; + if (regs.R_AX != 0x004f) + return (1); - bzero(®s, sizeof(regs)); - regs.R_EAX = 0x4f05; - regs.R_EBX = 1; - regs.R_EDX = offset / adp->va_window_gran; + x86bios_init_regs(®s); + regs.R_AX = 0x4f05; + regs.R_BL = 1; + regs.R_DX = offset / adp->va_window_gran; x86bios_intr(®s, 0x10); adp->va_window_orig = (offset/adp->va_window_gran)*adp->va_window_gran; - return 0; /* XXX */ + return (0); /* XXX */ } static int vesa_read_hw_cursor(video_adapter_t *adp, int *col, int *row) { - return (*prevvidsw->read_hw_cursor)(adp, col, row); + + return ((*prevvidsw->read_hw_cursor)(adp, col, row)); } static int vesa_set_hw_cursor(video_adapter_t *adp, int col, int row) { - return (*prevvidsw->set_hw_cursor)(adp, col, row); + + return ((*prevvidsw->set_hw_cursor)(adp, col, row)); } static int vesa_set_hw_cursor_shape(video_adapter_t *adp, int base, int height, int celsize, int blink) { - return (*prevvidsw->set_hw_cursor_shape)(adp, base, height, celsize, - blink); + + return ((*prevvidsw->set_hw_cursor_shape)(adp, base, height, celsize, + blink)); } static int vesa_blank_display(video_adapter_t *adp, int mode) { + /* XXX: use VESA DPMS */ - return (*prevvidsw->blank_display)(adp, mode); + return ((*prevvidsw->blank_display)(adp, mode)); } static int -vesa_mmap(video_adapter_t *adp, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +vesa_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { + #if VESA_DEBUG > 0 - printf("vesa_mmap(): window:0x%tx, buffer:0x%tx, offset:0x%tx\n", + printf("vesa_mmap(): window:0x%tx, buffer:0x%tx, offset:0x%jx\n", adp->va_info.vi_window, adp->va_info.vi_buffer, offset); #endif - if ((adp == vesa_adp) && (adp->va_info.vi_flags & V_INFO_LINEAR)) { + if ((adp == vesa_adp) && + (adp->va_info.vi_flags & V_INFO_LINEAR) != 0) { /* va_window_size == va_buffer_size/vi_planes */ /* XXX: is this correct? */ if (offset > adp->va_window_size - PAGE_SIZE) - return -1; + return (-1); *paddr = adp->va_info.vi_buffer + offset; - return 0; - } else { - return (*prevvidsw->mmap)(adp, offset, paddr, prot); + return (0); } + return ((*prevvidsw->mmap)(adp, offset, paddr, prot, memattr)); } static int vesa_clear(video_adapter_t *adp) { - return (*prevvidsw->clear)(adp); + + return ((*prevvidsw->clear)(adp)); } static int vesa_fill_rect(video_adapter_t *adp, int val, int x, int y, int cx, int cy) { - return (*prevvidsw->fill_rect)(adp, val, x, y, cx, cy); + + return ((*prevvidsw->fill_rect)(adp, val, x, y, cx, cy)); } static int vesa_bitblt(video_adapter_t *adp,...) { + /* FIXME */ - return 1; + return (1); } static int @@ -1426,18 +1538,17 @@ get_palette(video_adapter_t *adp, int base, int count, int bits; int error; - if ((base < 0) || (base >= 256) || (count < 0) || (count > 256)) - return 1; + if (base < 0 || base >= 256 || count < 0 || count > 256) + return (1); if ((base + count) > 256) - return 1; - if (!(vesa_adp_info->v_flags & V_DAC8) || !VESA_MODE(adp->va_mode)) - return 1; + return (1); + if (!VESA_MODE(adp->va_mode)) + return (1); + if ((adp->va_info.vi_flags & V_INFO_NONVGA) == 0) + return (1); - bits = vesa_bios_get_dac(); - if (bits <= 6) - return 1; - - r = malloc(count*3, M_DEVBUF, M_WAITOK); + bits = (adp->va_flags & V_ADP_DAC8) != 0 ? 8 : 6; + r = malloc(count * 3, M_DEVBUF, M_WAITOK); g = r + count; b = g + count; error = vesa_bios_save_palette2(base, count, r, g, b, bits); @@ -1452,29 +1563,30 @@ get_palette(video_adapter_t *adp, int base, int count, } free(r, M_DEVBUF); - /* if error && bits != 6 at this point, we are in trouble... XXX */ - return error; + return (error); } static int set_palette(video_adapter_t *adp, int base, int count, u_char *red, u_char *green, u_char *blue, u_char *trans) { - return 1; -#ifdef notyet u_char *r; u_char *g; u_char *b; int bits; int error; - if ((base < 0) || (base >= 256) || (base + count > 256)) - return 1; - if (!(vesa_adp_info->v_flags & V_DAC8) || !VESA_MODE(adp->va_mode) - || ((bits = vesa_bios_set_dac(8)) <= 6)) - return 1; + if (base < 0 || base >= 256 || count < 0 || count > 256) + return (1); + if ((base + count) > 256) + return (1); + if (!VESA_MODE(adp->va_mode)) + return (1); + if ((adp->va_info.vi_flags & V_INFO_NONVGA) == 0) + return (1); - r = malloc(count*3, M_DEVBUF, M_WAITOK); + bits = (adp->va_flags & V_ADP_DAC8) != 0 ? 8 : 6; + r = malloc(count * 3, M_DEVBUF, M_WAITOK); g = r + count; b = g + count; copyin(red, r, count); @@ -1483,13 +1595,8 @@ set_palette(video_adapter_t *adp, int base, int count, error = vesa_bios_load_palette2(base, count, r, g, b, bits); free(r, M_DEVBUF); - if (error == 0) - return 0; - /* if the following call fails, we are in trouble... XXX */ - vesa_bios_set_dac(6); - return 1; -#endif /* notyet */ + return (error); } static int @@ -1498,7 +1605,7 @@ vesa_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) int bytes; if (adp != vesa_adp) - return (*prevvidsw->ioctl)(adp, cmd, arg); + return ((*prevvidsw->ioctl)(adp, cmd, arg)); switch (cmd) { case FBIO_SETWINORG: /* set frame buffer window origin */ @@ -1508,24 +1615,24 @@ vesa_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) case FBIO_SETDISPSTART: /* set display start address */ if (!VESA_MODE(adp->va_mode)) - return (*prevvidsw->ioctl)(adp, cmd, arg); + return ((*prevvidsw->ioctl)(adp, cmd, arg)); if (vesa_bios_set_start(((video_display_start_t *)arg)->x, ((video_display_start_t *)arg)->y)) - return ENODEV; + return (ENODEV); adp->va_disp_start.x = ((video_display_start_t *)arg)->x; adp->va_disp_start.y = ((video_display_start_t *)arg)->y; - return 0; + return (0); case FBIO_SETLINEWIDTH: /* set line length in pixel */ if (!VESA_MODE(adp->va_mode)) - return (*prevvidsw->ioctl)(adp, cmd, arg); + return ((*prevvidsw->ioctl)(adp, cmd, arg)); if (vesa_bios_set_line_length(*(u_int *)arg, &bytes, NULL)) - return ENODEV; + return (ENODEV); adp->va_line_width = bytes; #if VESA_DEBUG > 1 printf("new line width:%d\n", adp->va_line_width); #endif - return 0; + return (0); case FBIO_GETPALETTE: /* get color palette */ if (get_palette(adp, ((video_color_palette_t *)arg)->index, @@ -1534,8 +1641,8 @@ vesa_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) ((video_color_palette_t *)arg)->green, ((video_color_palette_t *)arg)->blue, ((video_color_palette_t *)arg)->transparent)) - return (*prevvidsw->ioctl)(adp, cmd, arg); - return 0; + return ((*prevvidsw->ioctl)(adp, cmd, arg)); + return (0); case FBIO_SETPALETTE: /* set color palette */ @@ -1545,8 +1652,8 @@ vesa_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) ((video_color_palette_t *)arg)->green, ((video_color_palette_t *)arg)->blue, ((video_color_palette_t *)arg)->transparent)) - return (*prevvidsw->ioctl)(adp, cmd, arg); - return 0; + return ((*prevvidsw->ioctl)(adp, cmd, arg)); + return (0); case FBIOGETCMAP: /* get color palette */ if (get_palette(adp, ((struct fbcmap *)arg)->index, @@ -1554,8 +1661,8 @@ vesa_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) ((struct fbcmap *)arg)->red, ((struct fbcmap *)arg)->green, ((struct fbcmap *)arg)->blue, NULL)) - return (*prevvidsw->ioctl)(adp, cmd, arg); - return 0; + return ((*prevvidsw->ioctl)(adp, cmd, arg)); + return (0); case FBIOPUTCMAP: /* set color palette */ if (set_palette(adp, ((struct fbcmap *)arg)->index, @@ -1563,11 +1670,11 @@ vesa_ioctl(video_adapter_t *adp, u_long cmd, caddr_t arg) ((struct fbcmap *)arg)->red, ((struct fbcmap *)arg)->green, ((struct fbcmap *)arg)->blue, NULL)) - return (*prevvidsw->ioctl)(adp, cmd, arg); - return 0; + return ((*prevvidsw->ioctl)(adp, cmd, arg)); + return (0); default: - return (*prevvidsw->ioctl)(adp, cmd, arg); + return ((*prevvidsw->ioctl)(adp, cmd, arg)); } } @@ -1579,15 +1686,15 @@ vesa_diag(video_adapter_t *adp, int level) /* call the previous handler first */ error = (*prevvidsw->diag)(adp, level); if (error) - return error; + return (error); if (adp != vesa_adp) - return 1; + return (1); if (level <= 0) - return 0; + return (0); - return 0; + return (0); } static int @@ -1597,15 +1704,16 @@ vesa_bios_info(int level) struct vesa_mode vmode; int i; #endif + uint16_t vers; + + vers = vesa_adp_info->v_version; if (bootverbose) { /* general adapter information */ printf( "VESA: v%d.%d, %dk memory, flags:0x%x, mode table:%p (%x)\n", - ((vesa_adp_info->v_version & 0xf000) >> 12) * 10 + - ((vesa_adp_info->v_version & 0x0f00) >> 8), - ((vesa_adp_info->v_version & 0x00f0) >> 4) * 10 + - (vesa_adp_info->v_version & 0x000f), + (vers >> 12) * 10 + ((vers & 0x0f00) >> 8), + ((vers & 0x00f0) >> 4) * 10 + (vers & 0x000f), vesa_adp_info->v_memsize * 64, vesa_adp_info->v_flags, vesa_vmodetab, vesa_adp_info->v_modetable); @@ -1615,9 +1723,9 @@ vesa_bios_info(int level) } if (level <= 0) - return 0; + return (0); - if (vesa_adp_info->v_version >= 0x0200 && bootverbose) { + if (vers >= 0x0200 && bootverbose) { /* vender name, product name, product revision */ printf("VESA: %s %s %s\n", (vesa_venderstr != NULL) ? vesa_venderstr : "unknown", @@ -1664,7 +1772,7 @@ vesa_bios_info(int level) } #endif /* VESA_DEBUG > 1 */ - return 0; + return (0); } /* module loading */ @@ -1676,7 +1784,7 @@ vesa_load(void) int s; if (vesa_init_done) - return 0; + return (0); /* locate a VGA adapter */ s = spltty(); @@ -1687,7 +1795,7 @@ vesa_load(void) if (error == 0) vesa_bios_info(bootverbose); - return error; + return (error); } static int @@ -1695,12 +1803,11 @@ vesa_unload(void) { u_char palette[256*3]; int error; - int bits; int s; /* if the adapter is currently in a VESA mode, don't unload */ if ((vesa_adp != NULL) && VESA_MODE(vesa_adp->va_mode)) - return EBUSY; + return (EBUSY); /* * FIXME: if there is at least one vty which is in a VESA mode, * we shouldn't be unloading! XXX @@ -1709,15 +1816,11 @@ vesa_unload(void) s = spltty(); if ((error = vesa_unload_ioctl()) == 0) { if (vesa_adp != NULL) { - if (vesa_adp_info->v_flags & V_DAC8) { - bits = vesa_bios_get_dac(); - if (bits > 6) { - vesa_bios_save_palette(0, 256, - palette, bits); - vesa_bios_set_dac(6); - vesa_bios_load_palette(0, 256, - palette, 6); - } + if ((vesa_adp->va_flags & V_ADP_DAC8) != 0) { + vesa_bios_save_palette(0, 256, palette, 8); + vesa_bios_set_dac(6); + vesa_adp->va_flags &= ~V_ADP_DAC8; + vesa_bios_load_palette(0, 256, palette, 6); } vesa_adp->va_flags &= ~V_ADP_VESA; vidsw[vesa_adp->va_index] = prevvidsw; @@ -1725,21 +1828,30 @@ vesa_unload(void) } splx(s); - return error; + if (vesa_oemstr != NULL) + free(vesa_oemstr, M_DEVBUF); + if (vesa_venderstr != NULL) + free(vesa_venderstr, M_DEVBUF); + if (vesa_prodstr != NULL) + free(vesa_prodstr, M_DEVBUF); + if (vesa_revstr != NULL) + free(vesa_revstr, M_DEVBUF); + if (vesa_vmode != &vesa_vmode_empty) + free(vesa_vmode, M_DEVBUF); + return (error); } static int vesa_mod_event(module_t mod, int type, void *data) { + switch (type) { case MOD_LOAD: - return vesa_load(); + return (vesa_load()); case MOD_UNLOAD: - return vesa_unload(); - default: - return EOPNOTSUPP; + return (vesa_unload()); } - return 0; + return (EOPNOTSUPP); } static moduledata_t vesa_mod = { diff --git a/sys/dev/fb/vesa.h b/sys/dev/fb/vesa.h index bd9986b155c0..25b9bd50f2d1 100644 --- a/sys/dev/fb/vesa.h +++ b/sys/dev/fb/vesa.h @@ -108,7 +108,21 @@ struct vesa_mode u_int32_t v_lfb; u_int32_t v_offscreen; u_int16_t v_offscreensize; -}; + /* 3.0 implementations */ + u_int16_t v_linbpscanline; + u_int8_t v_bankipages; + u_int8_t v_linipages; + u_int8_t v_linredmasksize; + u_int8_t v_linredfieldpos; + u_int8_t v_lingreenmasksize; + u_int8_t v_lingreenfieldpos; + u_int8_t v_linbluemasksize; + u_int8_t v_linbluefieldpos; + u_int8_t v_linresmasksize; + u_int8_t v_linresfieldpos; + u_int32_t v_maxpixelclock; + u_int8_t v_reserved1[190]; +} __packed; #ifdef _KERNEL diff --git a/sys/dev/fb/vga.c b/sys/dev/fb/vga.c index 0cae0ae50598..7d702ad2b8e9 100644 --- a/sys/dev/fb/vga.c +++ b/sys/dev/fb/vga.c @@ -144,10 +144,10 @@ vga_ioctl(struct cdev *dev, vga_softc_t *sc, u_long cmd, caddr_t arg, int flag, } int -vga_mmap(struct cdev *dev, vga_softc_t *sc, vm_offset_t offset, vm_offset_t *paddr, - int prot) +vga_mmap(struct cdev *dev, vga_softc_t *sc, vm_ooffset_t offset, + vm_offset_t *paddr, int prot, vm_memattr_t *memattr) { - return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot); + return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot, memattr); } #endif /* FB_INSTALL_CDEV */ @@ -2465,8 +2465,8 @@ vga_blank_display(video_adapter_t *adp, int mode) * all adapters */ static int -vga_mmap_buf(video_adapter_t *adp, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +vga_mmap_buf(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { if (adp->va_info.vi_flags & V_INFO_LINEAR) return -1; diff --git a/sys/dev/fb/vgareg.h b/sys/dev/fb/vgareg.h index 0a73fbd5e1cb..249d32c5957a 100644 --- a/sys/dev/fb/vgareg.h +++ b/sys/dev/fb/vgareg.h @@ -70,6 +70,7 @@ struct video_adapter; typedef struct vga_softc { struct video_adapter *adp; void *state_buf; + void *pal_buf; #ifdef FB_INSTALL_CDEV genfb_softc_t gensc; #endif @@ -87,8 +88,8 @@ int vga_read(struct cdev *dev, vga_softc_t *sc, struct uio *uio, int flag); int vga_write(struct cdev *dev, vga_softc_t *sc, struct uio *uio, int flag); int vga_ioctl(struct cdev *dev, vga_softc_t *sc, u_long cmd, caddr_t arg, int flag, struct thread *td); -int vga_mmap(struct cdev *dev, vga_softc_t *sc, vm_offset_t offset, - vm_offset_t *paddr, int prot); +int vga_mmap(struct cdev *dev, vga_softc_t *sc, vm_ooffset_t offset, + vm_offset_t *paddr, int prot, vm_memattr_t *memattr); #endif extern int (*vga_sub_configure)(int flags); diff --git a/sys/dev/fdc/fdc.c b/sys/dev/fdc/fdc.c index a207bfcbc02c..ed621b22f5fd 100644 --- a/sys/dev/fdc/fdc.c +++ b/sys/dev/fdc/fdc.c @@ -781,11 +781,9 @@ fdc_worker(struct fdc_data *fdc) /* Disable ISADMA if we bailed while it was active */ if (fd != NULL && (fd->flags & FD_ISADMA)) { - mtx_lock(&Giant); isa_dmadone( bp->bio_cmd & BIO_READ ? ISADMA_READ : ISADMA_WRITE, fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); - mtx_unlock(&Giant); mtx_lock(&fdc->fdc_mtx); fd->flags &= ~FD_ISADMA; mtx_unlock(&fdc->fdc_mtx); @@ -864,7 +862,7 @@ fdc_worker(struct fdc_data *fdc) fd->flags |= FD_NEWDISK; mtx_unlock(&fdc->fdc_mtx); g_topology_lock(); - g_orphan_provider(fd->fd_provider, EXDEV); + g_orphan_provider(fd->fd_provider, ENXIO); fd->fd_provider->flags |= G_PF_WITHER; fd->fd_provider = g_new_providerf(fd->fd_geom, fd->fd_geom->name); @@ -958,11 +956,9 @@ fdc_worker(struct fdc_data *fdc) /* Setup ISADMA if we need it and have it */ if ((bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_FMT)) && !(fdc->flags & FDC_NODMA)) { - mtx_lock(&Giant); isa_dmastart( bp->bio_cmd & BIO_READ ? ISADMA_READ : ISADMA_WRITE, fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); - mtx_unlock(&Giant); mtx_lock(&fdc->fdc_mtx); fd->flags |= FD_ISADMA; mtx_unlock(&fdc->fdc_mtx); @@ -1040,11 +1036,9 @@ fdc_worker(struct fdc_data *fdc) /* Finish DMA */ if (fd->flags & FD_ISADMA) { - mtx_lock(&Giant); isa_dmadone( bp->bio_cmd & BIO_READ ? ISADMA_READ : ISADMA_WRITE, fd->fd_ioptr, fd->fd_iosize, fdc->dmachan); - mtx_unlock(&Giant); mtx_lock(&fdc->fdc_mtx); fd->flags &= ~FD_ISADMA; mtx_unlock(&fdc->fdc_mtx); @@ -1734,6 +1728,10 @@ fdc_detach(device_t dev) if ((error = bus_generic_detach(dev))) return (error); + if (fdc->fdc_intr) + bus_teardown_intr(dev, fdc->res_irq, fdc->fdc_intr); + fdc->fdc_intr = NULL; + /* kill worker thread */ mtx_lock(&fdc->fdc_mtx); fdc->flags |= FDC_KTHREAD_EXIT; @@ -2031,15 +2029,22 @@ fd_attach(device_t dev) return (0); } +static void +fd_detach_geom(void *arg, int flag) +{ + struct fd_data *fd = arg; + + g_topology_assert(); + g_wither_geom(fd->fd_geom, ENXIO); +} + static int fd_detach(device_t dev) { struct fd_data *fd; fd = device_get_softc(dev); - g_topology_lock(); - g_wither_geom(fd->fd_geom, ENXIO); - g_topology_unlock(); + g_waitfor_event(fd_detach_geom, fd, M_WAITOK, NULL); while (device_get_state(dev) == DS_BUSY) tsleep(fd, PZERO, "fdd", hz/10); callout_drain(&fd->toffhandle); @@ -2068,8 +2073,7 @@ static int fdc_modevent(module_t mod, int type, void *data) { - g_modevent(NULL, type, &g_fd_class); - return (0); + return (g_modevent(NULL, type, &g_fd_class)); } DRIVER_MODULE(fd, fdc, fd_driver, fd_devclass, fdc_modevent, 0); diff --git a/sys/dev/fdc/fdc_acpi.c b/sys/dev/fdc/fdc_acpi.c index 79fa66b93a1a..97ec9cb3e5e5 100644 --- a/sys/dev/fdc/fdc_acpi.c +++ b/sys/dev/fdc/fdc_acpi.c @@ -97,9 +97,7 @@ fdc_acpi_attach(device_t dev) struct fdc_data *sc; ACPI_BUFFER buf; device_t bus; - int error, fde_count, i; - ACPI_OBJECT *obj, *pkg; - uint32_t fde[ACPI_FDC_MAXDEVS]; + int error; /* Get our softc and use the same accessor as ISA. */ sc = device_get_softc(dev); @@ -128,63 +126,12 @@ fdc_acpi_attach(device_t dev) */ bus = device_get_parent(dev); if (ACPI_FAILURE(ACPI_EVALUATE_OBJECT(bus, dev, "_FDE", NULL, &buf))) { - error = ENXIO; - goto out_hintsprobe; - } - - /* Parse the output of _FDE in various ways. */ - obj = pkg = (ACPI_OBJECT *)buf.Pointer; - switch (obj->Type) { - case ACPI_TYPE_BUFFER: - /* - * The spec says _FDE should be a buffer of five 32-bit - * integers. In violation of the spec, some systems use - * five bytes instead. - */ - switch (obj->Buffer.Length) { - case ACPI_FDC_FDE_LEN: - bcopy(obj->Buffer.Pointer, fde, ACPI_FDC_FDE_LEN); - break; - case ACPI_FDC_MAXDEVS: - for (i = 0; i < ACPI_FDC_MAXDEVS; i++) - fde[i] = ((uint8_t *)obj->Buffer.Pointer)[i]; - break; - default: - device_printf(dev, "_FDE wrong length: %d\n", - obj->Buffer.Length); - error = ENXIO; - goto out_hintsprobe; - } - break; - case ACPI_TYPE_PACKAGE: - /* - * In violation of the spec, systems including the ASUS - * K8V return a package of five integers instead of a - * buffer of five 32-bit integers. - */ - fde_count = min(ACPI_FDC_MAXDEVS, pkg->Package.Count); - for (i = 0; i < fde_count; i++) { - obj = &pkg->Package.Elements[i]; - if (obj->Type == ACPI_TYPE_INTEGER) - fde[i] = (uint32_t)obj->Integer.Value; - } - break; - default: - device_printf(dev, "invalid _FDE type %d\n", obj->Type); - error = ENXIO; - goto out_hintsprobe; + error = fdc_hints_probe(dev); + goto out; } /* Add fd child devices as specified. */ - error = fdc_acpi_probe_children(bus, dev, fde); - -out_hintsprobe: - /* - * If there was a problem with the _FDE drive enumeration, fall - * back to the hints-based probe. - */ - if (error) - error = fdc_hints_probe(dev); + error = fdc_acpi_probe_children(bus, dev, buf.Pointer); out: if (buf.Pointer) diff --git a/sys/dev/fe/if_fe_pccard.c b/sys/dev/fe/if_fe_pccard.c index e1cb10d64762..ee101c641cab 100644 --- a/sys/dev/fe/if_fe_pccard.c +++ b/sys/dev/fe/if_fe_pccard.c @@ -306,7 +306,7 @@ fe_pccard_xircom_mac(const struct pccard_tuple *tuple, void *argp) * Probe and initialization for TDK/CONTEC PCMCIA Ethernet interface. * by MASUI Kenji * - * (Contec uses TDK Ethenet chip -- hosokawa) + * (Contec uses TDK Ethernet chip -- hosokawa) * * This version of fe_probe_tdk has been rewrote to handle * *generic* PC Card implementation of Fujitsu MB8696x family. The diff --git a/sys/dev/firewire/fwdev.c b/sys/dev/firewire/fwdev.c index 0facb6e3963f..1475d00e3c38 100644 --- a/sys/dev/firewire/fwdev.c +++ b/sys/dev/firewire/fwdev.c @@ -884,7 +884,8 @@ static int #if defined(__DragonFly__) || __FreeBSD_version < 500102 fw_mmap (struct cdev *dev, vm_offset_t offset, int nproto) #else -fw_mmap (struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nproto) +fw_mmap (struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nproto, vm_memattr_t *memattr) #endif { @@ -892,7 +893,7 @@ fw_mmap (struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nproto) #if defined(__DragonFly__) || __FreeBSD_version < 500102 return fwmem_mmap(dev, offset, nproto); #else - return fwmem_mmap(dev, offset, paddr, nproto); + return fwmem_mmap(dev, offset, paddr, nproto, memattr); #endif return EINVAL; diff --git a/sys/dev/firewire/fwmem.c b/sys/dev/firewire/fwmem.c index f0aa7ae33cd6..179968221d81 100644 --- a/sys/dev/firewire/fwmem.c +++ b/sys/dev/firewire/fwmem.c @@ -445,7 +445,8 @@ int #if defined(__DragonFly__) || __FreeBSD_version < 500102 fwmem_mmap (struct cdev *dev, vm_offset_t offset, int nproto) #else -fwmem_mmap (struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nproto) +fwmem_mmap (struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nproto, vm_memattr_t *memattr) #endif { return EINVAL; diff --git a/sys/dev/firewire/sbp.c b/sys/dev/firewire/sbp.c index 02ceb784e987..0b9d1fa96e02 100644 --- a/sys/dev/firewire/sbp.c +++ b/sys/dev/firewire/sbp.c @@ -1573,7 +1573,7 @@ END_DEBUG bcopy(&sbp_cmd_status->s_keydep[0], &sense->sense_key_spec[0], 3); - ocb->ccb->csio.scsi_status = sbp_cmd_status->status;; + ocb->ccb->csio.scsi_status = sbp_cmd_status->status; ocb->ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; /* @@ -2148,7 +2148,7 @@ sbp_free_target(struct sbp_target *target) } STAILQ_INIT(&target->xferlist); free(target->luns, M_SBP); - target->num_lun = 0;; + target->num_lun = 0; target->luns = NULL; target->fwdev = NULL; } @@ -2318,7 +2318,7 @@ sbp_timeout(void *arg) sbp_cam_detach_target(target); if (target->luns != NULL) free(target->luns, M_SBP); - target->num_lun = 0;; + target->num_lun = 0; target->luns = NULL; target->fwdev = NULL; #endif diff --git a/sys/dev/flash/mx25l.c b/sys/dev/flash/mx25l.c new file mode 100644 index 000000000000..41e4e1345705 --- /dev/null +++ b/sys/dev/flash/mx25l.c @@ -0,0 +1,479 @@ +/*- + * Copyright (c) 2006 M. Warner Losh. All rights reserved. + * Copyright (c) 2009 Oleksandr Tymoshenko. 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "spibus_if.h" + +#include + +struct mx25l_flash_ident +{ + const char *name; + uint8_t manufacturer_id; + uint16_t device_id; + unsigned int sectorsize; + unsigned int sectorcount; +}; + +struct mx25l_softc +{ + device_t sc_dev; + uint8_t sc_manufacturer_id; + uint16_t sc_device_id; + unsigned int sc_sectorsize; + struct mtx sc_mtx; + struct disk *sc_disk; + struct proc *sc_p; + struct bio_queue_head sc_bio_queue; +}; + +#define M25PXX_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) +#define M25PXX_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) +#define M25PXX_LOCK_INIT(_sc) \ + mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), \ + "mx25l", MTX_DEF) +#define M25PXX_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); +#define M25PXX_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); +#define M25PXX_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); + +/* disk routines */ +static int mx25l_open(struct disk *dp); +static int mx25l_close(struct disk *dp); +static int mx25l_ioctl(struct disk *, u_long, void *, int, struct thread *); +static void mx25l_strategy(struct bio *bp); +static void mx25l_task(void *arg); + +struct mx25l_flash_ident flash_devices[] = { + { "mx25ll32", 0xc2, 0x2016, 64 * 1024, 64 }, + { "mx25ll64", 0xc2, 0x2017, 64 * 1024, 128 }, + { "mx25ll128", 0xc2, 0x2018, 64 * 1024, 256 }, + { "s25fl128", 0x01, 0x2018, 64 * 1024, 256 }, +}; + +static uint8_t +mx25l_get_status(device_t dev) +{ + uint8_t txBuf[2], rxBuf[2]; + struct spi_command cmd; + int err; + + memset(&cmd, 0, sizeof(cmd)); + memset(txBuf, 0, sizeof(txBuf)); + memset(rxBuf, 0, sizeof(rxBuf)); + + txBuf[0] = CMD_READ_STATUS; + cmd.tx_cmd = txBuf; + cmd.rx_cmd = rxBuf; + cmd.rx_cmd_sz = 2; + cmd.tx_cmd_sz = 2; + err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); + return (rxBuf[1]); +} + +static void +mx25l_wait_for_device_ready(device_t dev) +{ + while ((mx25l_get_status(dev) & STATUS_WIP)) + continue; +} + +static struct mx25l_flash_ident* +mx25l_get_device_ident(struct mx25l_softc *sc) +{ + device_t dev = sc->sc_dev; + uint8_t txBuf[8], rxBuf[8]; + struct spi_command cmd; + uint8_t manufacturer_id; + uint16_t dev_id; + int err, i; + + memset(&cmd, 0, sizeof(cmd)); + memset(txBuf, 0, sizeof(txBuf)); + memset(rxBuf, 0, sizeof(rxBuf)); + + txBuf[0] = CMD_READ_IDENT; + cmd.tx_cmd = &txBuf; + cmd.rx_cmd = &rxBuf; + /* + * Some compatible devices has extended two-bytes ID + * We'll use only manufacturer/deviceid atm + */ + cmd.tx_cmd_sz = 4; + cmd.rx_cmd_sz = 4; + err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); + if (err) + return (NULL); + + manufacturer_id = rxBuf[1]; + dev_id = (rxBuf[2] << 8) | (rxBuf[3]); + + for (i = 0; + i < sizeof(flash_devices)/sizeof(struct mx25l_flash_ident); i++) { + if ((flash_devices[i].manufacturer_id == manufacturer_id) && + (flash_devices[i].device_id == dev_id)) + return &flash_devices[i]; + } + + printf("Unknown SPI flash device. Vendor: %02x, device id: %04x\n", + manufacturer_id, dev_id); + return (NULL); +} + +static void +mx25l_set_writable(device_t dev, int writable) +{ + uint8_t txBuf[1], rxBuf[1]; + struct spi_command cmd; + int err; + + memset(&cmd, 0, sizeof(cmd)); + memset(txBuf, 0, sizeof(txBuf)); + memset(rxBuf, 0, sizeof(rxBuf)); + + txBuf[0] = writable ? CMD_WRITE_ENABLE : CMD_WRITE_DISABLE; + cmd.tx_cmd = txBuf; + cmd.rx_cmd = rxBuf; + cmd.rx_cmd_sz = 1; + cmd.tx_cmd_sz = 1; + err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); +} + +static void +mx25l_erase_sector(device_t dev, off_t sector) +{ + uint8_t txBuf[4], rxBuf[4]; + struct spi_command cmd; + int err; + + mx25l_wait_for_device_ready(dev); + mx25l_set_writable(dev, 1); + + memset(&cmd, 0, sizeof(cmd)); + memset(txBuf, 0, sizeof(txBuf)); + memset(rxBuf, 0, sizeof(rxBuf)); + + txBuf[0] = CMD_SECTOR_ERASE; + cmd.tx_cmd = txBuf; + cmd.rx_cmd = rxBuf; + cmd.rx_cmd_sz = 4; + cmd.tx_cmd_sz = 4; + txBuf[1] = ((sector >> 16) & 0xff); + txBuf[2] = ((sector >> 8) & 0xff); + txBuf[3] = (sector & 0xff); + err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); +} + +static int +mx25l_write(device_t dev, off_t offset, caddr_t data, off_t count) +{ + struct mx25l_softc *sc; + uint8_t txBuf[8], rxBuf[8]; + struct spi_command cmd; + off_t write_offset; + long bytes_to_write, bytes_writen; + device_t pdev; + int err = 0; + + pdev = device_get_parent(dev); + sc = device_get_softc(dev); + + cmd.tx_cmd_sz = 4; + cmd.rx_cmd_sz = 4; + + bytes_writen = 0; + write_offset = offset; + + /* + * Sanity checks + */ + KASSERT(count % sc->sc_sectorsize == 0, + ("count for BIO_WRITE is not sector size (%d bytes) aligned", + sc->sc_sectorsize)); + + KASSERT(offset % sc->sc_sectorsize == 0, + ("offset for BIO_WRITE is not sector size (%d bytes) aligned", + sc->sc_sectorsize)); + + /* + * Assume here that we write per-sector only + * and sector size should be 256 bytes aligned + */ + KASSERT(write_offset % FLASH_PAGE_SIZE == 0, + ("offset for BIO_WRITE is not page size (%d bytes) aligned", + FLASH_PAGE_SIZE)); + + /* + * Maximum write size for CMD_PAGE_PROGRAM is + * FLASH_PAGE_SIZE, so split data to chunks + * FLASH_PAGE_SIZE bytes eash and write them + * one by one + */ + while (bytes_writen < count) { + /* + * If we crossed sector boundary - erase next sector + */ + if (((offset + bytes_writen) % sc->sc_sectorsize) == 0) + mx25l_erase_sector(dev, offset + bytes_writen); + + txBuf[0] = CMD_PAGE_PROGRAM; + txBuf[1] = ((write_offset >> 16) & 0xff); + txBuf[2] = ((write_offset >> 8) & 0xff); + txBuf[3] = (write_offset & 0xff); + + bytes_to_write = MIN(FLASH_PAGE_SIZE, + count - bytes_writen); + cmd.tx_cmd = txBuf; + cmd.rx_cmd = rxBuf; + cmd.tx_data = data + bytes_writen; + cmd.tx_data_sz = bytes_to_write; + cmd.rx_data = data + bytes_writen; + cmd.rx_data_sz = bytes_to_write; + + /* + * Eash completed write operation resets WEL + * (write enable latch) to disabled state, + * so we re-enable it here + */ + mx25l_wait_for_device_ready(dev); + mx25l_set_writable(dev, 1); + + err = SPIBUS_TRANSFER(pdev, dev, &cmd); + if (err) + break; + + bytes_writen += bytes_to_write; + write_offset += bytes_to_write; + } + + return (err); +} + +static int +mx25l_read(device_t dev, off_t offset, caddr_t data, off_t count) +{ + struct mx25l_softc *sc; + uint8_t txBuf[8], rxBuf[8]; + struct spi_command cmd; + device_t pdev; + int err = 0; + + pdev = device_get_parent(dev); + sc = device_get_softc(dev); + + /* + * Sanity checks + */ + KASSERT(count % sc->sc_sectorsize == 0, + ("count for BIO_WRITE is not sector size (%d bytes) aligned", + sc->sc_sectorsize)); + + KASSERT(offset % sc->sc_sectorsize == 0, + ("offset for BIO_WRITE is not sector size (%d bytes) aligned", + sc->sc_sectorsize)); + + txBuf[0] = CMD_FAST_READ; + cmd.tx_cmd_sz = 5; + cmd.rx_cmd_sz = 5; + + txBuf[1] = ((offset >> 16) & 0xff); + txBuf[2] = ((offset >> 8) & 0xff); + txBuf[3] = (offset & 0xff); + /* Dummy byte */ + txBuf[4] = 0; + + cmd.tx_cmd = txBuf; + cmd.rx_cmd = rxBuf; + cmd.tx_data = data; + cmd.tx_data_sz = count; + cmd.rx_data = data; + cmd.rx_data_sz = count; + + err = SPIBUS_TRANSFER(pdev, dev, &cmd); + + return (err); +} + +static int +mx25l_probe(device_t dev) +{ + device_set_desc(dev, "M25Pxx Flash Family"); + return (0); +} + +static int +mx25l_attach(device_t dev) +{ + struct mx25l_softc *sc; + struct mx25l_flash_ident *ident; + + sc = device_get_softc(dev); + sc->sc_dev = dev; + M25PXX_LOCK_INIT(sc); + + ident = mx25l_get_device_ident(sc); + if (ident == NULL) + return (ENXIO); + + mx25l_wait_for_device_ready(sc->sc_dev); + + sc->sc_disk = disk_alloc(); + sc->sc_disk->d_open = mx25l_open; + sc->sc_disk->d_close = mx25l_close; + sc->sc_disk->d_strategy = mx25l_strategy; + sc->sc_disk->d_ioctl = mx25l_ioctl; + sc->sc_disk->d_name = "flash/spi"; + sc->sc_disk->d_drv1 = sc; + sc->sc_disk->d_maxsize = DFLTPHYS; + sc->sc_disk->d_sectorsize = ident->sectorsize; + sc->sc_disk->d_mediasize = ident->sectorsize * ident->sectorcount; + sc->sc_disk->d_unit = device_get_unit(sc->sc_dev); + sc->sc_disk->d_dump = NULL; /* NB: no dumps */ + /* Sectorsize for erase operations */ + sc->sc_sectorsize = ident->sectorsize; + + /* NB: use stripesize to hold the erase/region size for RedBoot */ + sc->sc_disk->d_stripesize = ident->sectorsize; + + disk_create(sc->sc_disk, DISK_VERSION); + bioq_init(&sc->sc_bio_queue); + + kproc_create(&mx25l_task, sc, &sc->sc_p, 0, 0, "task: mx25l flash"); + device_printf(sc->sc_dev, "%s, sector %d bytes, %d sectors\n", + ident->name, ident->sectorsize, ident->sectorcount); + + return (0); +} + +static int +mx25l_detach(device_t dev) +{ + + return (EIO); +} + +static int +mx25l_open(struct disk *dp) +{ + return (0); +} + +static int +mx25l_close(struct disk *dp) +{ + + return (0); +} + +static int +mx25l_ioctl(struct disk *dp, u_long cmd, void *data, int fflag, + struct thread *td) +{ + + return (EINVAL); +} + +static void +mx25l_strategy(struct bio *bp) +{ + struct mx25l_softc *sc; + + sc = (struct mx25l_softc *)bp->bio_disk->d_drv1; + M25PXX_LOCK(sc); + bioq_disksort(&sc->sc_bio_queue, bp); + wakeup(sc); + M25PXX_UNLOCK(sc); +} + +static void +mx25l_task(void *arg) +{ + struct mx25l_softc *sc = (struct mx25l_softc*)arg; + struct bio *bp; + device_t dev; + + for (;;) { + dev = sc->sc_dev; + M25PXX_LOCK(sc); + do { + bp = bioq_first(&sc->sc_bio_queue); + if (bp == NULL) + msleep(sc, &sc->sc_mtx, PRIBIO, "jobqueue", 0); + } while (bp == NULL); + bioq_remove(&sc->sc_bio_queue, bp); + M25PXX_UNLOCK(sc); + + switch (bp->bio_cmd) { + case BIO_READ: + bp->bio_error = mx25l_read(dev, bp->bio_offset, + bp->bio_data, bp->bio_bcount); + break; + case BIO_WRITE: + bp->bio_error = mx25l_write(dev, bp->bio_offset, + bp->bio_data, bp->bio_bcount); + break; + default: + bp->bio_error = EINVAL; + } + + + biodone(bp); + } +} + +static devclass_t mx25l_devclass; + +static device_method_t mx25l_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, mx25l_probe), + DEVMETHOD(device_attach, mx25l_attach), + DEVMETHOD(device_detach, mx25l_detach), + + { 0, 0 } +}; + +static driver_t mx25l_driver = { + "mx25l", + mx25l_methods, + sizeof(struct mx25l_softc), +}; + +DRIVER_MODULE(mx25l, spibus, mx25l_driver, mx25l_devclass, 0, 0); diff --git a/sys/dev/flash/mx25lreg.h b/sys/dev/flash/mx25lreg.h new file mode 100644 index 000000000000..49808af603b6 --- /dev/null +++ b/sys/dev/flash/mx25lreg.h @@ -0,0 +1,58 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#ifndef __MX25LREG_H__ +#define __MX25LREG_H__ + +/* + * Commands + */ +#define CMD_WRITE_ENABLE 0x06 +#define CMD_WRITE_DISABLE 0x04 +#define CMD_READ_IDENT 0x9F +#define CMD_READ_STATUS 0x05 +#define CMD_WRITE_STATUS 0x01 +#define CMD_READ 0x03 +#define CMD_FAST_READ 0x0B +#define CMD_PAGE_PROGRAM 0x02 +#define CMD_SECTOR_ERASE 0xD8 +#define CMD_BULK_ERASE 0xC7 + +/* + * Status register flags + */ +#define STATUS_SRWD (1 << 7) +#define STATUS_BP2 (1 << 4) +#define STATUS_BP1 (1 << 3) +#define STATUS_BP0 (1 << 2) +#define STATUS_WEL (1 << 1) +#define STATUS_WIP (1 << 0) + +#define FLASH_PAGE_SIZE 256 + +#endif /* __MX25LREG_H__ */ + diff --git a/sys/dev/fxp/if_fxp.c b/sys/dev/fxp/if_fxp.c index 4fb890f02b0b..a8d961eb0fb8 100644 --- a/sys/dev/fxp/if_fxp.c +++ b/sys/dev/fxp/if_fxp.c @@ -631,8 +631,11 @@ fxp_attach(device_t dev) } /* For 82559 or later chips, Rx checksum offload is supported. */ - if (sc->revision >= FXP_REV_82559_A0) - sc->flags |= FXP_FLAG_82559_RXCSUM; + if (sc->revision >= FXP_REV_82559_A0) { + /* 82559ER does not support Rx checksum offloading. */ + if (sc->ident->devid != 0x1209) + sc->flags |= FXP_FLAG_82559_RXCSUM; + } /* * Enable use of extended RFDs and TCBs for 82550 * and later chips. Note: we need extended TXCB support diff --git a/sys/dev/gem/if_gem.c b/sys/dev/gem/if_gem.c index 945638395b2a..7cba6e7e133c 100644 --- a/sys/dev/gem/if_gem.c +++ b/sys/dev/gem/if_gem.c @@ -297,8 +297,11 @@ gem_attach(struct gem_softc *sc) /* * Fall back on an internal PHY if no external PHY was found. + * Note that with Apple (K2) GMACs GEM_MIF_CONFIG_MDI0 can't be + * trusted when the firmware has powered down the chip. */ - if (error != 0 && (v & GEM_MIF_CONFIG_MDI0) != 0) { + if (error != 0 && + ((v & GEM_MIF_CONFIG_MDI0) != 0 || GEM_IS_APPLE(sc))) { v &= ~GEM_MIF_CONFIG_PHY_SEL; GEM_BANK1_WRITE_4(sc, GEM_MIF_CONFIG, v); switch (sc->sc_variant) { diff --git a/sys/dev/gem/if_gem_pci.c b/sys/dev/gem/if_gem_pci.c index 05be3236ca7e..051dbcc5bfbd 100644 --- a/sys/dev/gem/if_gem_pci.c +++ b/sys/dev/gem/if_gem_pci.c @@ -295,6 +295,16 @@ gem_pci_attach(device_t dev) GEM_PCI_ROM_OFFSET + j + PCI_VPDRES_LARGE_SIZE + PCI_VPD_SIZE, sc->sc_enaddr, ETHER_ADDR_LEN); #endif + /* + * The Xserve G5 has a fake GMAC with an all-zero MAC address. + * Check for this, and don't attach in this case. + */ + + for (i = 0; i < ETHER_ADDR_LEN && sc->sc_enaddr[i] == 0; i++) {} + if (i == ETHER_ADDR_LEN) { + device_printf(dev, "invalid MAC address\n"); + goto fail; + } if (gem_attach(sc) != 0) { device_printf(dev, "could not be attached\n"); diff --git a/sys/dev/hatm/if_hatm.c b/sys/dev/hatm/if_hatm.c index 85327643ba31..bbeca8d40fc1 100644 --- a/sys/dev/hatm/if_hatm.c +++ b/sys/dev/hatm/if_hatm.c @@ -836,7 +836,7 @@ hatm_init_rx_buffer_pool(struct hatm_softc *sc, uint32_t lbuf_addr; /* address of current buffer */ u_int i; - row_size = sc->bytes_per_row;; + row_size = sc->bytes_per_row; row_addr = start * row_size; lbuf_size = sc->cells_per_lbuf * 48; lbufs_per_row = sc->cells_per_row / sc->cells_per_lbuf; @@ -889,7 +889,7 @@ hatm_init_tx_buffer_pool(struct hatm_softc *sc, uint32_t lbuf_addr; /* address of current buffer */ u_int i; - row_size = sc->bytes_per_row;; + row_size = sc->bytes_per_row; row_addr = start * row_size; lbuf_size = sc->cells_per_lbuf * 48; lbufs_per_row = sc->cells_per_row / sc->cells_per_lbuf; @@ -1325,6 +1325,7 @@ kenv_getuint(struct hatm_softc *sc, const char *var, freeenv(val); return (EINVAL); } + freeenv(val); if (bootverbose) if_printf(sc->ifp, "%s=%u\n", full, u); *ptr = u; @@ -1928,7 +1929,6 @@ hatm_attach(device_t dev) ifp->if_flags = IFF_SIMPLEX; ifp->if_ioctl = hatm_ioctl; ifp->if_start = hatm_start; - ifp->if_watchdog = NULL; ifp->if_init = hatm_init; utopia_attach(&sc->utopia, IFP2IFATM(sc->ifp), &sc->media, &sc->mtx, diff --git a/sys/dev/hifn/hifn7751.c b/sys/dev/hifn/hifn7751.c index c227f771a34f..bd1173ee3e78 100644 --- a/sys/dev/hifn/hifn7751.c +++ b/sys/dev/hifn/hifn7751.c @@ -2929,8 +2929,8 @@ hifn_write_reg_1(struct hifn_softc *sc, bus_size_t reg, u_int32_t val) * */ static int -vulcanpk_mmap(struct cdev *dev, vm_offset_t offset, - vm_paddr_t *paddr, int nprot) +vulcanpk_mmap(struct cdev *dev, vm_ooffset_t offset, + vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr) { struct hifn_softc *sc; vm_paddr_t pd; @@ -2942,7 +2942,8 @@ vulcanpk_mmap(struct cdev *dev, vm_offset_t offset, b = rman_get_virtual(sc->sc_bar1res); #if 0 - printf("vpk mmap: %p(%08x) offset=%d\n", b, pd, offset); + printf("vpk mmap: %p(%016llx) offset=%lld\n", b, + (unsigned long long)pd, offset); hexdump(b, HIFN_1_PUB_MEMEND, "vpk", 0); #endif diff --git a/sys/dev/hptiop/hptiop.c b/sys/dev/hptiop/hptiop.c index 7218bc504425..1ea257becc33 100644 --- a/sys/dev/hptiop/hptiop.c +++ b/sys/dev/hptiop/hptiop.c @@ -79,7 +79,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -105,7 +104,6 @@ static int hptiop_do_ioctl_itl(struct hpt_iop_hba *hba, struct hpt_iop_ioctl_param *pParams); static int hptiop_do_ioctl_mv(struct hpt_iop_hba *hba, struct hpt_iop_ioctl_param *pParams); -static void hptiop_bus_scan_cb(struct cam_periph *periph, union ccb *ccb); static int hptiop_rescan_bus(struct hpt_iop_hba *hba); static int hptiop_alloc_pci_res_itl(struct hpt_iop_hba *hba); static int hptiop_alloc_pci_res_mv(struct hpt_iop_hba *hba); @@ -1035,26 +1033,17 @@ invalid: static int hptiop_rescan_bus(struct hpt_iop_hba * hba) { - struct cam_path *path; union ccb *ccb; - if (xpt_create_path(&path, xpt_periph, cam_sim_path(hba->sim), - CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) - return(EIO); - if ((ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK)) == NULL) - return(ENOMEM); - bzero(ccb, sizeof(union ccb)); - xpt_setup_ccb(&ccb->ccb_h, path, 5); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = hptiop_bus_scan_cb; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); - return(0); -} -static void hptiop_bus_scan_cb(struct cam_periph *periph, union ccb *ccb) -{ - xpt_free_path(ccb->ccb_h.path); - free(ccb, M_TEMP); + if ((ccb = xpt_alloc_ccb()) == NULL) + return(ENOMEM); + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(hba->sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + xpt_free_ccb(ccb); + return(EIO); + } + xpt_rescan(ccb); + return(0); } static bus_dmamap_callback_t hptiop_map_srb; @@ -1539,8 +1528,6 @@ static int hptiop_attach(device_t dev) hba->ioctl_dev->si_drv1 = hba; #endif - hptiop_rescan_bus(hba); - return 0; diff --git a/sys/dev/hptmv/entry.c b/sys/dev/hptmv/entry.c index 843281a6bd51..bce7458130ab 100644 --- a/sys/dev/hptmv/entry.c +++ b/sys/dev/hptmv/entry.c @@ -1341,7 +1341,7 @@ init_adapter(IAL_ADAPTER_T *pAdapter) #endif &pAdapter->io_dma_parent /* tag */)) { - return ENXIO;; + return ENXIO; } diff --git a/sys/dev/hptrr/hptrr_osm_bsd.c b/sys/dev/hptrr/hptrr_osm_bsd.c index eae952e12288..6bc30c22b36f 100644 --- a/sys/dev/hptrr/hptrr_osm_bsd.c +++ b/sys/dev/hptrr/hptrr_osm_bsd.c @@ -34,6 +34,9 @@ #include #include +static int attach_generic = 1; +TUNABLE_INT("hw.hptrr.attach_generic", &attach_generic); + static int hpt_probe(device_t dev) { PCI_ID pci_id; @@ -41,6 +44,9 @@ static int hpt_probe(device_t dev) int i; PHBA hba; + /* Some of supported chips are used not only by HPT. */ + if (pci_get_vendor(dev) != 0x1103 && !attach_generic) + return (ENXIO); for (him = him_list; him; him = him->next) { for (i=0; him->get_supported_device_id(i, &pci_id); i++) { if ((pci_get_vendor(dev) == pci_id.vid) && @@ -983,7 +989,6 @@ static void hpt_stop_tasks(PVBUS_EXT vbus_ext) static d_open_t hpt_open; static d_close_t hpt_close; static d_ioctl_t hpt_ioctl; -static void hpt_bus_scan_cb(struct cam_periph *periph, union ccb *ccb); static int hpt_rescan_bus(void); static struct cdevsw hpt_cdevsw = { @@ -1375,7 +1380,6 @@ invalid: static int hpt_rescan_bus(void) { - struct cam_path *path; union ccb *ccb; PVBUS vbus; PVBUS_EXT vbus_ext; @@ -1385,17 +1389,15 @@ static int hpt_rescan_bus(void) #endif ldm_for_each_vbus(vbus, vbus_ext) { - if (xpt_create_path(&path, xpt_periph, cam_sim_path(vbus_ext->sim), - CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) - return(EIO); - if ((ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK)) == NULL) + if ((ccb = xpt_alloc_ccb()) == NULL) return(ENOMEM); - bzero(ccb, sizeof(union ccb)); - xpt_setup_ccb(&ccb->ccb_h, path, 5); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = hpt_bus_scan_cb; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, + cam_sim_path(vbus_ext->sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + xpt_free_ccb(ccb); + return(EIO); + } + xpt_rescan(ccb); } #if (__FreeBSD_version >= 500000) @@ -1404,15 +1406,3 @@ static int hpt_rescan_bus(void) return(0); } - -static void hpt_bus_scan_cb(struct cam_periph *periph, union ccb *ccb) -{ - if (ccb->ccb_h.status != CAM_REQ_CMP) - KdPrint(("cam_scan_callback: failure status = %x",ccb->ccb_h.status)); - else - KdPrint(("Scan bus successfully!")); - - xpt_free_path(ccb->ccb_h.path); - free(ccb, M_TEMP); - return; -} diff --git a/sys/dev/hptrr/os_bsd.h b/sys/dev/hptrr/os_bsd.h index fb487e820b67..ec221f39b90a 100644 --- a/sys/dev/hptrr/os_bsd.h +++ b/sys/dev/hptrr/os_bsd.h @@ -91,7 +91,6 @@ #include #include #include -#include #include #include #include diff --git a/sys/dev/hwpmc/hwpmc_arm.c b/sys/dev/hwpmc/hwpmc_arm.c index ce1caf69e108..86cfaf3cd93a 100644 --- a/sys/dev/hwpmc/hwpmc_arm.c +++ b/sys/dev/hwpmc/hwpmc_arm.c @@ -30,19 +30,28 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include +#include struct pmc_mdep * pmc_md_initialize() { - return NULL; + if (cpu_class == CPU_CLASS_XSCALE) + return pmc_xscale_initialize(); + else + return NULL; } void pmc_md_finalize(struct pmc_mdep *md) { - (void) md; + if (cpu_class == CPU_CLASS_XSCALE) + pmc_xscale_finalize(md); + else + KASSERT(0, ("[arm,%d] Unknown CPU Class 0x%x", __LINE__, + cpu_class)); } int diff --git a/sys/dev/hwpmc/hwpmc_core.c b/sys/dev/hwpmc/hwpmc_core.c index d4f065b60246..43a49143fc34 100644 --- a/sys/dev/hwpmc/hwpmc_core.c +++ b/sys/dev/hwpmc/hwpmc_core.c @@ -669,7 +669,7 @@ static struct iap_event_descr iap_events[] = { IAPDESCR(3CH_01H, 0x3C, 0x01, IAP_F_FM | IAP_F_ALLCPUS), IAPDESCR(3CH_02H, 0x3C, 0x02, IAP_F_FM | IAP_F_ALLCPUS), - IAPDESCR(40H, 0x40, IAP_M_MESI, IAP_F_CC), + IAPDESCR(40H, 0x40, IAP_M_MESI, IAP_F_CC | IAP_F_CC2), IAPDESCR(40H_21H, 0x40, 0x21, IAP_F_FM | IAP_F_CA), IAPDESCR(41H, 0x41, IAP_M_MESI, IAP_F_CC | IAP_F_CC2), @@ -1419,17 +1419,17 @@ iap_allocate_pmc(int cpu, int ri, struct pmc *pm, mask = 0; - if (ie->iap_flags & IAP_M_CORE) { + if (ie->iap_umask & IAP_M_CORE) { if ((c = (config & IAP_F_CORE)) != IAP_CORE_ALL && c != IAP_CORE_THIS) return (EINVAL); mask |= IAP_F_CORE; } - if (ie->iap_flags & IAP_M_AGENT) + if (ie->iap_umask & IAP_M_AGENT) mask |= IAP_F_AGENT; - if (ie->iap_flags & IAP_M_PREFETCH) { + if (ie->iap_umask & IAP_M_PREFETCH) { if ((c = (config & IAP_F_PREFETCH)) == IAP_PREFETCH_RESERVED) @@ -1438,16 +1438,16 @@ iap_allocate_pmc(int cpu, int ri, struct pmc *pm, mask |= IAP_F_PREFETCH; } - if (ie->iap_flags & IAP_M_MESI) + if (ie->iap_umask & IAP_M_MESI) mask |= IAP_F_MESI; - if (ie->iap_flags & IAP_M_SNOOPRESPONSE) + if (ie->iap_umask & IAP_M_SNOOPRESPONSE) mask |= IAP_F_SNOOPRESPONSE; - if (ie->iap_flags & IAP_M_SNOOPTYPE) + if (ie->iap_umask & IAP_M_SNOOPTYPE) mask |= IAP_F_SNOOPTYPE; - if (ie->iap_flags & IAP_M_TRANSITION) + if (ie->iap_umask & IAP_M_TRANSITION) mask |= IAP_F_TRANSITION; /* @@ -1977,11 +1977,21 @@ pmc_core_initialize(struct pmc_mdep *md, int maxcpu) core_iaf_npmc = cpuid[CORE_CPUID_EDX] & 0x1F; core_iaf_width = (cpuid[CORE_CPUID_EDX] >> 5) & 0xFF; - iaf_initialize(md, maxcpu, core_iaf_npmc, core_iaf_width); - - core_pmcmask |= ((1ULL << core_iaf_npmc) - 1) << - IAF_OFFSET; - + if (core_iaf_npmc > 0) { + iaf_initialize(md, maxcpu, core_iaf_npmc, + core_iaf_width); + core_pmcmask |= ((1ULL << core_iaf_npmc) - 1) << + IAF_OFFSET; + } else { + /* + * Adjust the number of classes exported to + * user space. + */ + md->pmd_nclass--; + KASSERT(md->pmd_nclass == 2, + ("[core,%d] unexpected nclass %d", __LINE__, + md->pmd_nclass)); + } } PMCDBG(MDP,INI,1,"core-init pmcmask=0x%jx iafri=%d", core_pmcmask, diff --git a/sys/dev/hwpmc/hwpmc_intel.c b/sys/dev/hwpmc/hwpmc_intel.c index cb2834faa358..e953f689f8b9 100644 --- a/sys/dev/hwpmc/hwpmc_intel.c +++ b/sys/dev/hwpmc/hwpmc_intel.c @@ -131,6 +131,8 @@ pmc_intel_initialize(void) nclasses = 3; break; case 0x1A: + case 0x1E: /* Per Intel document 253669-032 9/2009, pages A-2 and A-57 */ + case 0x1F: /* Per Intel document 253669-032 9/2009, pages A-2 and A-57 */ cputype = PMC_CPU_INTEL_COREI7; nclasses = 3; break; diff --git a/sys/dev/hwpmc/hwpmc_logging.c b/sys/dev/hwpmc/hwpmc_logging.c index cfb055b37ab4..a36a8dc7e726 100644 --- a/sys/dev/hwpmc/hwpmc_logging.c +++ b/sys/dev/hwpmc/hwpmc_logging.c @@ -240,6 +240,7 @@ pmclog_loop(void *arg) int error; struct pmc_owner *po; struct pmclog_buffer *lb; + struct proc *p; struct ucred *ownercred; struct ucred *mycred; struct thread *td; @@ -248,12 +249,13 @@ pmclog_loop(void *arg) size_t nbytes; po = (struct pmc_owner *) arg; + p = po->po_owner; td = curthread; mycred = td->td_ucred; - PROC_LOCK(po->po_owner); - ownercred = crhold(po->po_owner->p_ucred); - PROC_UNLOCK(po->po_owner); + PROC_LOCK(p); + ownercred = crhold(p->p_ucred); + PROC_UNLOCK(p); PMCDBG(LOG,INI,1, "po=%p kt=%p", po, po->po_kthread); KASSERT(po->po_kthread == curthread->td_proc, @@ -324,16 +326,16 @@ pmclog_loop(void *arg) error = fo_write(po->po_file, &auio, ownercred, 0, td); td->td_ucred = mycred; - mtx_lock(&pmc_kthread_mtx); - if (error) { /* XXX some errors are recoverable */ /* XXX also check for SIGPIPE if a socket */ /* send a SIGIO to the owner and exit */ - PROC_LOCK(po->po_owner); - psignal(po->po_owner, SIGIO); - PROC_UNLOCK(po->po_owner); + PROC_LOCK(p); + psignal(p, SIGIO); + PROC_UNLOCK(p); + + mtx_lock(&pmc_kthread_mtx); po->po_error = error; /* save for flush log */ @@ -342,6 +344,8 @@ pmclog_loop(void *arg) break; } + mtx_lock(&pmc_kthread_mtx); + /* put the used buffer back into the global pool */ PMCLOG_INIT_BUFFER_DESCRIPTOR(lb); @@ -525,15 +529,20 @@ static void pmclog_stop_kthread(struct pmc_owner *po) { /* - * Unset flag, wakeup the helper thread, + * Close the file to force the thread out of fo_write, + * unset flag, wakeup the helper thread, * wait for it to exit */ - mtx_assert(&pmc_kthread_mtx, MA_OWNED); + if (po->po_file != NULL) + fo_close(po->po_file, curthread); + + mtx_lock(&pmc_kthread_mtx); po->po_flags &= ~PMC_PO_OWNS_LOGFILE; wakeup_one(po); if (po->po_kthread) msleep(po->po_kthread, &pmc_kthread_mtx, PPAUSE, "pmckstp", 0); + mtx_unlock(&pmc_kthread_mtx); } /* @@ -602,10 +611,8 @@ pmclog_configure_log(struct pmc_mdep *md, struct pmc_owner *po, int logfd) error: /* shutdown the thread */ - mtx_lock(&pmc_kthread_mtx); if (po->po_kthread) pmclog_stop_kthread(po); - mtx_unlock(&pmc_kthread_mtx); KASSERT(po->po_kthread == NULL, ("[pmclog,%d] po=%p kthread not " "stopped", __LINE__, po)); @@ -641,10 +648,8 @@ pmclog_deconfigure_log(struct pmc_owner *po) ("[pmclog,%d] po=%p no log file", __LINE__, po)); /* stop the kthread, this will reset the 'OWNS_LOGFILE' flag */ - mtx_lock(&pmc_kthread_mtx); if (po->po_kthread) pmclog_stop_kthread(po); - mtx_unlock(&pmc_kthread_mtx); KASSERT(po->po_kthread == NULL, ("[pmclog,%d] po=%p kthread not stopped", __LINE__, po)); diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c index 482db0edfcf4..d331a85eafdd 100644 --- a/sys/dev/hwpmc/hwpmc_mod.c +++ b/sys/dev/hwpmc/hwpmc_mod.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -63,6 +64,12 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include +#include +#include +#include + /* * Types */ @@ -504,7 +511,7 @@ pmc_ri_to_classdep(struct pmc_mdep *md, int ri, int *adjri) pcd = pmc_rowindex_to_classdep[ri]; KASSERT(pcd != NULL, - ("[amd,%d] ri %d null pcd", __LINE__, ri)); + ("[pmc,%d] ri %d null pcd", __LINE__, ri)); *adjri = ri - pcd->pcd_ri; @@ -790,7 +797,7 @@ pmc_link_target_process(struct pmc *pm, struct pmc_process *pp) KASSERT(PMC_IS_VIRTUAL_MODE(PMC_TO_MODE(pm)), ("[pmc,%d] Attaching a non-process-virtual pmc=%p to pid=%d", __LINE__, pm, pp->pp_proc->p_pid)); - KASSERT(pp->pp_refcnt >= 0 && pp->pp_refcnt < ((int) md->pmd_npmc - 1), + KASSERT(pp->pp_refcnt >= 0 && pp->pp_refcnt <= ((int) md->pmd_npmc - 1), ("[pmc,%d] Illegal reference count %d for process record %p", __LINE__, pp->pp_refcnt, (void *) pp)); @@ -843,7 +850,7 @@ pmc_unlink_target_process(struct pmc *pm, struct pmc_process *pp) KASSERT(pm != NULL && pp != NULL, ("[pmc,%d] Null pm %p or pp %p", __LINE__, pm, pp)); - KASSERT(pp->pp_refcnt >= 1 && pp->pp_refcnt < (int) md->pmd_npmc, + KASSERT(pp->pp_refcnt >= 1 && pp->pp_refcnt <= (int) md->pmd_npmc, ("[pmc,%d] Illegal ref count %d on process record %p", __LINE__, pp->pp_refcnt, (void *) pp)); @@ -1110,7 +1117,7 @@ pmc_detach_one_process(struct proc *p, struct pmc *pm, int flags) * descriptor from the target hash table and unset the P_HWPMC * flag in the struct proc. */ - KASSERT(pp->pp_refcnt >= 0 && pp->pp_refcnt < (int) md->pmd_npmc, + KASSERT(pp->pp_refcnt >= 0 && pp->pp_refcnt <= (int) md->pmd_npmc, ("[pmc,%d] Illegal refcnt %d for process struct %p", __LINE__, pp->pp_refcnt, pp)); @@ -1401,7 +1408,7 @@ pmc_process_csw_out(struct thread *td) tmp = newvalue - PMC_PCPU_SAVED(cpu,ri); - PMCDBG(CSW,SWI,1,"cpu=%d ri=%d tmp=%jd", cpu, ri, + PMCDBG(CSW,SWO,1,"cpu=%d ri=%d tmp=%jd", cpu, ri, tmp); if (mode == PMC_MODE_TS) { @@ -1619,6 +1626,156 @@ pmc_log_kernel_mappings(struct pmc *pm) static void pmc_log_process_mappings(struct pmc_owner *po, struct proc *p) { + int locked; + vm_map_t map; + struct vnode *vp; + struct vmspace *vm; + vm_map_entry_t entry; + vm_offset_t last_end; + u_int last_timestamp; + struct vnode *last_vp; + vm_offset_t start_addr; + vm_object_t obj, lobj, tobj; + char *fullpath, *freepath; + + last_vp = NULL; + last_end = (vm_offset_t) 0; + fullpath = freepath = NULL; + + if ((vm = vmspace_acquire_ref(p)) == NULL) + return; + + map = &vm->vm_map; + vm_map_lock_read(map); + + for (entry = map->header.next; entry != &map->header; entry = entry->next) { + + if (entry == NULL) { + PMCDBG(LOG,OPS,2, "hwpmc: vm_map entry unexpectedly " + "NULL! pid=%d vm_map=%p\n", p->p_pid, map); + break; + } + + /* + * We only care about executable map entries. + */ + if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) || + !(entry->protection & VM_PROT_EXECUTE) || + (entry->object.vm_object == NULL)) { + continue; + } + + obj = entry->object.vm_object; + VM_OBJECT_LOCK(obj); + + /* + * Walk the backing_object list to find the base + * (non-shadowed) vm_object. + */ + for (lobj = tobj = obj; tobj != NULL; tobj = tobj->backing_object) { + if (tobj != obj) + VM_OBJECT_LOCK(tobj); + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); + lobj = tobj; + } + + /* + * At this point lobj is the base vm_object and it is locked. + */ + if (lobj == NULL) { + PMCDBG(LOG,OPS,2, "hwpmc: lobj unexpectedly NULL! pid=%d " + "vm_map=%p vm_obj=%p\n", p->p_pid, map, obj); + VM_OBJECT_UNLOCK(obj); + continue; + } + + if (lobj->type != OBJT_VNODE || lobj->handle == NULL) { + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); + VM_OBJECT_UNLOCK(obj); + continue; + } + + /* + * Skip contiguous regions that point to the same + * vnode, so we don't emit redundant MAP-IN + * directives. + */ + if (entry->start == last_end && lobj->handle == last_vp) { + last_end = entry->end; + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); + VM_OBJECT_UNLOCK(obj); + continue; + } + + /* + * We don't want to keep the proc's vm_map or this + * vm_object locked while we walk the pathname, since + * vn_fullpath() can sleep. However, if we drop the + * lock, it's possible for concurrent activity to + * modify the vm_map list. To protect against this, + * we save the vm_map timestamp before we release the + * lock, and check it after we reacquire the lock + * below. + */ + start_addr = entry->start; + last_end = entry->end; + last_timestamp = map->timestamp; + vm_map_unlock_read(map); + + vp = lobj->handle; + vref(vp); + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); + + VM_OBJECT_UNLOCK(obj); + + freepath = NULL; + pmc_getfilename(vp, &fullpath, &freepath); + last_vp = vp; + + locked = VFS_LOCK_GIANT(vp->v_mount); + vrele(vp); + VFS_UNLOCK_GIANT(locked); + + vp = NULL; + pmclog_process_map_in(po, p->p_pid, start_addr, fullpath); + if (freepath) + free(freepath, M_TEMP); + + vm_map_lock_read(map); + + /* + * If our saved timestamp doesn't match, this means + * that the vm_map was modified out from under us and + * we can't trust our current "entry" pointer. Do a + * new lookup for this entry. If there is no entry + * for this address range, vm_map_lookup_entry() will + * return the previous one, so we always want to go to + * entry->next on the next loop iteration. + * + * There is an edge condition here that can occur if + * there is no entry at or before this address. In + * this situation, vm_map_lookup_entry returns + * &map->header, which would cause our loop to abort + * without processing the rest of the map. However, + * in practice this will never happen for process + * vm_map. This is because the executable's text + * segment is the first mapping in the proc's address + * space, and this mapping is never removed until the + * process exits, so there will always be a non-header + * entry at or before the requested address for + * vm_map_lookup_entry to return. + */ + if (map->timestamp != last_timestamp) + vm_map_lookup_entry(map, last_end - 1, &entry); + } + + vm_map_unlock_read(map); + vmspace_free(vm); + return; } /* @@ -1785,7 +1942,7 @@ pmc_hook_handler(struct thread *td, int function, void *arg) pmc_detach_one_process(td->td_proc, pm, PMC_FLAG_NONE); - KASSERT(pp->pp_refcnt >= 0 && pp->pp_refcnt < (int) md->pmd_npmc, + KASSERT(pp->pp_refcnt >= 0 && pp->pp_refcnt <= (int) md->pmd_npmc, ("[pmc,%d] Illegal ref count %d on pp %p", __LINE__, pp->pp_refcnt, pp)); @@ -1897,7 +2054,7 @@ pmc_allocate_owner_descriptor(struct proc *p) /* allocate space for N pointers and one descriptor struct */ po = malloc(sizeof(struct pmc_owner), M_PMC, M_WAITOK|M_ZERO); - po->po_sscount = po->po_error = po->po_flags = 0; + po->po_sscount = po->po_error = po->po_flags = po->po_logprocmaps = 0; po->po_file = NULL; po->po_owner = p; po->po_kthread = NULL; @@ -2520,8 +2677,15 @@ pmc_start(struct pmc *pm) po->po_sscount++; } - /* Log mapping information for all processes in the system. */ - pmc_log_all_process_mappings(po); + /* + * Log mapping information for all existing processes in the + * system. Subsequent mappings are logged as they happen; + * see pmc_process_mmap(). + */ + if (po->po_logprocmaps == 0) { + pmc_log_all_process_mappings(po); + po->po_logprocmaps = 1; + } /* * Move to the CPU associated with this diff --git a/sys/dev/hwpmc/hwpmc_x86.c b/sys/dev/hwpmc/hwpmc_x86.c index 09d04bb713ee..8c98983b571d 100644 --- a/sys/dev/hwpmc/hwpmc_x86.c +++ b/sys/dev/hwpmc/hwpmc_x86.c @@ -101,7 +101,7 @@ pmc_save_user_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) if (copyin((void *) sp, &pc, sizeof(pc)) != 0) return (n); } else if (copyin((void *) r, &pc, sizeof(pc)) != 0 || - copyin((void *) fp, &fp, sizeof(fp) != 0)) + copyin((void *) fp, &fp, sizeof(fp)) != 0) return (n); for (; n < nframes;) { @@ -176,7 +176,8 @@ pmc_save_kernel_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) stackend = (uintptr_t) td->td_kstack + td->td_kstack_pages * PAGE_SIZE; if (PMC_IN_TRAP_HANDLER(pc) || - !PMC_IN_KERNEL(pc) || !PMC_IN_KERNEL(r) || + !PMC_IN_KERNEL(pc) || + !PMC_IN_KERNEL_STACK(r, stackstart, stackend) || !PMC_IN_KERNEL_STACK(sp, stackstart, stackend) || !PMC_IN_KERNEL_STACK(fp, stackstart, stackend)) return (1); @@ -221,7 +222,7 @@ pmc_save_kernel_callchain(uintptr_t *cc, int nframes, struct trapframe *tf) r = fp + sizeof(uintptr_t); if (!PMC_IN_KERNEL_STACK(fp, stackstart, stackend) || - !PMC_IN_KERNEL(r)) + !PMC_IN_KERNEL_STACK(r, stackstart, stackend)) break; pc = *(uintptr_t *) r; fp = *(uintptr_t *) fp; diff --git a/sys/dev/hwpmc/hwpmc_xscale.c b/sys/dev/hwpmc/hwpmc_xscale.c new file mode 100644 index 000000000000..466f3b638fa3 --- /dev/null +++ b/sys/dev/hwpmc/hwpmc_xscale.c @@ -0,0 +1,678 @@ +/*- + * Copyright (c) 2009 Rui Paulo + * 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. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +/* + * Support for the Intel XScale network processors + * + * XScale processors have up to now three generations. + * + * The first generation has two PMC; the event selection, interrupt config + * and overflow flag setup are done by writing to the PMNC register. + * It also has less monitoring events than the latter generations. + * + * The second and third generatiosn have four PMCs, one register for the event + * selection, one register for the interrupt config and one register for + * the overflow flags. + */ +static int xscale_npmcs; +static int xscale_gen; /* XScale Core generation */ + +struct xscale_event_code_map { + enum pmc_event pe_ev; + uint8_t pe_code; +}; + +const struct xscale_event_code_map xscale_event_codes[] = { + /* 1st and 2nd Generation XScale cores */ + { PMC_EV_XSCALE_IC_FETCH, 0x00 }, + { PMC_EV_XSCALE_IC_MISS, 0x01 }, + { PMC_EV_XSCALE_DATA_DEPENDENCY_STALLED,0x02 }, + { PMC_EV_XSCALE_ITLB_MISS, 0x03 }, + { PMC_EV_XSCALE_DTLB_MISS, 0x04 }, + { PMC_EV_XSCALE_BRANCH_RETIRED, 0x05 }, + { PMC_EV_XSCALE_BRANCH_MISPRED, 0x06 }, + { PMC_EV_XSCALE_INSTR_RETIRED, 0x07 }, + { PMC_EV_XSCALE_DC_FULL_CYCLE, 0x08 }, + { PMC_EV_XSCALE_DC_FULL_CONTIG, 0x09 }, + { PMC_EV_XSCALE_DC_ACCESS, 0x0a }, + { PMC_EV_XSCALE_DC_MISS, 0x0b }, + { PMC_EV_XSCALE_DC_WRITEBACK, 0x0c }, + { PMC_EV_XSCALE_PC_CHANGE, 0x0d }, + /* 3rd Generation XScale cores */ + { PMC_EV_XSCALE_BRANCH_RETIRED_ALL, 0x0e }, + { PMC_EV_XSCALE_INSTR_CYCLE, 0x0f }, + { PMC_EV_XSCALE_CP_STALL, 0x17 }, + { PMC_EV_XSCALE_PC_CHANGE_ALL, 0x18 }, + { PMC_EV_XSCALE_PIPELINE_FLUSH, 0x19 }, + { PMC_EV_XSCALE_BACKEND_STALL, 0x1a }, + { PMC_EV_XSCALE_MULTIPLIER_USE, 0x1b }, + { PMC_EV_XSCALE_MULTIPLIER_STALLED, 0x1c }, + { PMC_EV_XSCALE_DATA_CACHE_STALLED, 0x1e }, + { PMC_EV_XSCALE_L2_CACHE_REQ, 0x20 }, + { PMC_EV_XSCALE_L2_CACHE_MISS, 0x23 }, + { PMC_EV_XSCALE_ADDRESS_BUS_TRANS, 0x40 }, + { PMC_EV_XSCALE_SELF_ADDRESS_BUS_TRANS, 0x41 }, + { PMC_EV_XSCALE_DATA_BUS_TRANS, 0x48 }, +}; + +const int xscale_event_codes_size = + sizeof(xscale_event_codes) / sizeof(xscale_event_codes[0]); + +/* + * Per-processor information. + */ +struct xscale_cpu { + struct pmc_hw *pc_xscalepmcs; +}; + +static struct xscale_cpu **xscale_pcpu; + +/* + * Performance Monitor Control Register + */ +static __inline uint32_t +xscale_pmnc_read(void) +{ + uint32_t reg; + + __asm __volatile("mrc p14, 0, %0, c0, c1, 0" : "=r" (reg)); + + return (reg); +} + +static __inline void +xscale_pmnc_write(uint32_t reg) +{ + __asm __volatile("mcr p14, 0, %0, c0, c1, 0" : : "r" (reg)); +} + +/* + * Clock Counter Register + */ +static __inline uint32_t +xscale_ccnt_read(void) +{ + uint32_t reg; + + __asm __volatile("mrc p14, 0, %0, c1, c1, 0" : "=r" (reg)); + + return (reg); +} + +static __inline void +xscale_ccnt_write(uint32_t reg) +{ + __asm __volatile("mcr p14, 0, %0, c1, c1, 0" : : "r" (reg)); +} + +/* + * Interrupt Enable Register + */ +static __inline uint32_t +xscale_inten_read(void) +{ + uint32_t reg; + + __asm __volatile("mrc p14, 0, %0, c4, c1, 0" : "=r" (reg)); + + return (reg); +} + +static __inline void +xscale_inten_write(uint32_t reg) +{ + __asm __volatile("mcr p14, 0, %0, c4, c1, 0" : : "r" (reg)); +} + +/* + * Overflow Flag Register + */ +static __inline uint32_t +xscale_flag_read(void) +{ + uint32_t reg; + + __asm __volatile("mrc p14, 0, %0, c5, c1, 0" : "=r" (reg)); + + return (reg); +} + +static __inline void +xscale_flag_write(uint32_t reg) +{ + __asm __volatile("mcr p14, 0, %0, c5, c1, 0" : : "r" (reg)); +} + +/* + * Event Selection Register + */ +static __inline uint32_t +xscale_evtsel_read(void) +{ + uint32_t reg; + + __asm __volatile("mrc p14, 0, %0, c8, c1, 0" : "=r" (reg)); + + return (reg); +} + +static __inline void +xscale_evtsel_write(uint32_t reg) +{ + __asm __volatile("mcr p14, 0, %0, c8, c1, 0" : : "r" (reg)); +} + +/* + * Performance Count Register N + */ +static uint32_t +xscale_pmcn_read(unsigned int pmc) +{ + uint32_t reg = 0; + + KASSERT(pmc < 4, ("[xscale,%d] illegal PMC number %d", __LINE__, pmc)); + + switch (pmc) { + case 0: + __asm __volatile("mrc p14, 0, %0, c0, c2, 0" : "=r" (reg)); + break; + case 1: + __asm __volatile("mrc p14, 0, %0, c1, c2, 0" : "=r" (reg)); + break; + case 2: + __asm __volatile("mrc p14, 0, %0, c2, c2, 0" : "=r" (reg)); + break; + case 3: + __asm __volatile("mrc p14, 0, %0, c3, c2, 0" : "=r" (reg)); + break; + } + + return (reg); +} + +static uint32_t +xscale_pmcn_write(unsigned int pmc, uint32_t reg) +{ + + KASSERT(pmc < 4, ("[xscale,%d] illegal PMC number %d", __LINE__, pmc)); + + switch (pmc) { + case 0: + __asm __volatile("mcr p14, 0, %0, c0, c2, 0" : : "r" (reg)); + break; + case 1: + __asm __volatile("mcr p14, 0, %0, c1, c2, 0" : : "r" (reg)); + break; + case 2: + __asm __volatile("mcr p14, 0, %0, c2, c2, 0" : : "r" (reg)); + break; + case 3: + __asm __volatile("mcr p14, 0, %0, c3, c2, 0" : : "r" (reg)); + break; + } + + return (reg); +} + +static int +xscale_allocate_pmc(int cpu, int ri, struct pmc *pm, + const struct pmc_op_pmcallocate *a) +{ + enum pmc_event pe; + uint32_t caps, config; + int i; + + KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), + ("[xscale,%d] illegal CPU value %d", __LINE__, cpu)); + KASSERT(ri >= 0 && ri < xscale_npmcs, + ("[xscale,%d] illegal row index %d", __LINE__, ri)); + + caps = a->pm_caps; + if (a->pm_class != PMC_CLASS_XSCALE) + return (EINVAL); + pe = a->pm_ev; + for (i = 0; i < xscale_event_codes_size; i++) { + if (xscale_event_codes[i].pe_ev == pe) { + config = xscale_event_codes[i].pe_code; + break; + } + } + if (i == xscale_event_codes_size) + return EINVAL; + /* Generation 1 has fewer events */ + if (xscale_gen == 1 && i > PMC_EV_XSCALE_PC_CHANGE) + return EINVAL; + pm->pm_md.pm_xscale.pm_xscale_evsel = config; + + PMCDBG(MDP,ALL,2,"xscale-allocate ri=%d -> config=0x%x", ri, config); + + return 0; +} + + +static int +xscale_read_pmc(int cpu, int ri, pmc_value_t *v) +{ + struct pmc *pm; + pmc_value_t tmp; + + KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), + ("[xscale,%d] illegal CPU value %d", __LINE__, cpu)); + KASSERT(ri >= 0 && ri < xscale_npmcs, + ("[xscale,%d] illegal row index %d", __LINE__, ri)); + + pm = xscale_pcpu[cpu]->pc_xscalepmcs[ri].phw_pmc; + tmp = xscale_pmcn_read(ri); + PMCDBG(MDP,REA,2,"xscale-read id=%d -> %jd", ri, tmp); + if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) + *v = XSCALE_PERFCTR_VALUE_TO_RELOAD_COUNT(tmp); + else + *v = tmp; + + return 0; +} + +static int +xscale_write_pmc(int cpu, int ri, pmc_value_t v) +{ + struct pmc *pm; + + KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), + ("[xscale,%d] illegal CPU value %d", __LINE__, cpu)); + KASSERT(ri >= 0 && ri < xscale_npmcs, + ("[xscale,%d] illegal row-index %d", __LINE__, ri)); + + pm = xscale_pcpu[cpu]->pc_xscalepmcs[ri].phw_pmc; + + if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) + v = XSCALE_RELOAD_COUNT_TO_PERFCTR_VALUE(v); + + PMCDBG(MDP,WRI,1,"xscale-write cpu=%d ri=%d v=%jx", cpu, ri, v); + + xscale_pmcn_write(ri, v); + + return 0; +} + +static int +xscale_config_pmc(int cpu, int ri, struct pmc *pm) +{ + struct pmc_hw *phw; + + PMCDBG(MDP,CFG,1, "cpu=%d ri=%d pm=%p", cpu, ri, pm); + + KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), + ("[xscale,%d] illegal CPU value %d", __LINE__, cpu)); + KASSERT(ri >= 0 && ri < xscale_npmcs, + ("[xscale,%d] illegal row-index %d", __LINE__, ri)); + + phw = &xscale_pcpu[cpu]->pc_xscalepmcs[ri]; + + KASSERT(pm == NULL || phw->phw_pmc == NULL, + ("[xscale,%d] pm=%p phw->pm=%p hwpmc not unconfigured", + __LINE__, pm, phw->phw_pmc)); + + phw->phw_pmc = pm; + + return 0; +} + +static int +xscale_start_pmc(int cpu, int ri) +{ + uint32_t pmnc, config, evtsel; + struct pmc *pm; + struct pmc_hw *phw; + + phw = &xscale_pcpu[cpu]->pc_xscalepmcs[ri]; + pm = phw->phw_pmc; + config = pm->pm_md.pm_xscale.pm_xscale_evsel; + + /* + * Configure the event selection. + * + * On the XScale 2nd Generation there's no EVTSEL register. + */ + if (xscale_npmcs == 2) { + pmnc = xscale_pmnc_read(); + switch (ri) { + case 0: + pmnc &= ~XSCALE_PMNC_EVT0_MASK; + pmnc |= (config << 12) & XSCALE_PMNC_EVT0_MASK; + break; + case 1: + pmnc &= ~XSCALE_PMNC_EVT1_MASK; + pmnc |= (config << 20) & XSCALE_PMNC_EVT1_MASK; + break; + default: + /* XXX */ + break; + } + xscale_pmnc_write(pmnc); + } else { + evtsel = xscale_evtsel_read(); + switch (ri) { + case 0: + evtsel &= ~XSCALE_EVTSEL_EVT0_MASK; + evtsel |= config & XSCALE_EVTSEL_EVT0_MASK; + break; + case 1: + evtsel &= ~XSCALE_EVTSEL_EVT1_MASK; + evtsel |= (config << 8) & XSCALE_EVTSEL_EVT1_MASK; + break; + case 2: + evtsel &= ~XSCALE_EVTSEL_EVT2_MASK; + evtsel |= (config << 16) & XSCALE_EVTSEL_EVT2_MASK; + break; + case 3: + evtsel &= ~XSCALE_EVTSEL_EVT3_MASK; + evtsel |= (config << 24) & XSCALE_EVTSEL_EVT3_MASK; + break; + default: + /* XXX */ + break; + } + xscale_evtsel_write(evtsel); + } + /* + * Enable the PMC. + * + * Note that XScale provides only one bit to enable/disable _all_ + * performance monitoring units. + */ + pmnc = xscale_pmnc_read(); + pmnc |= XSCALE_PMNC_ENABLE; + xscale_pmnc_write(pmnc); + + return 0; +} + +static int +xscale_stop_pmc(int cpu, int ri) +{ + uint32_t pmnc, evtsel; + struct pmc *pm; + struct pmc_hw *phw; + + phw = &xscale_pcpu[cpu]->pc_xscalepmcs[ri]; + pm = phw->phw_pmc; + + /* + * Disable the PMCs. + * + * Note that XScale provides only one bit to enable/disable _all_ + * performance monitoring units. + */ + pmnc = xscale_pmnc_read(); + pmnc &= ~XSCALE_PMNC_ENABLE; + xscale_pmnc_write(pmnc); + /* + * A value of 0xff makes the corresponding PMU go into + * power saving mode. + */ + if (xscale_npmcs == 2) { + pmnc = xscale_pmnc_read(); + switch (ri) { + case 0: + pmnc |= XSCALE_PMNC_EVT0_MASK; + break; + case 1: + pmnc |= XSCALE_PMNC_EVT1_MASK; + break; + default: + /* XXX */ + break; + } + xscale_pmnc_write(pmnc); + } else { + evtsel = xscale_evtsel_read(); + switch (ri) { + case 0: + evtsel |= XSCALE_EVTSEL_EVT0_MASK; + break; + case 1: + evtsel |= XSCALE_EVTSEL_EVT1_MASK; + break; + case 2: + evtsel |= XSCALE_EVTSEL_EVT2_MASK; + break; + case 3: + evtsel |= XSCALE_EVTSEL_EVT3_MASK; + break; + default: + /* XXX */ + break; + } + xscale_evtsel_write(evtsel); + } + + return 0; +} + +static int +xscale_release_pmc(int cpu, int ri, struct pmc *pmc) +{ + struct pmc_hw *phw; + + KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), + ("[xscale,%d] illegal CPU value %d", __LINE__, cpu)); + KASSERT(ri >= 0 && ri < xscale_npmcs, + ("[xscale,%d] illegal row-index %d", __LINE__, ri)); + + phw = &xscale_pcpu[cpu]->pc_xscalepmcs[ri]; + KASSERT(phw->phw_pmc == NULL, + ("[xscale,%d] PHW pmc %p non-NULL", __LINE__, phw->phw_pmc)); + + return 0; +} + +static int +xscale_intr(int cpu, struct trapframe *tf) +{ + printf("intr\n"); + return 0; +} + +static int +xscale_describe(int cpu, int ri, struct pmc_info *pi, struct pmc **ppmc) +{ + int error; + struct pmc_hw *phw; + char xscale_name[PMC_NAME_MAX]; + + KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), + ("[xscale,%d], illegal CPU %d", __LINE__, cpu)); + KASSERT(ri >= 0 && ri < xscale_npmcs, + ("[xscale,%d] row-index %d out of range", __LINE__, ri)); + + phw = &xscale_pcpu[cpu]->pc_xscalepmcs[ri]; + snprintf(xscale_name, sizeof(xscale_name), "XSCALE-%d", ri); + if ((error = copystr(xscale_name, pi->pm_name, PMC_NAME_MAX, + NULL)) != 0) + return error; + pi->pm_class = PMC_CLASS_XSCALE; + if (phw->phw_state & PMC_PHW_FLAG_IS_ENABLED) { + pi->pm_enabled = TRUE; + *ppmc = phw->phw_pmc; + } else { + pi->pm_enabled = FALSE; + *ppmc = NULL; + } + + return (0); +} + +static int +xscale_get_config(int cpu, int ri, struct pmc **ppm) +{ + *ppm = xscale_pcpu[cpu]->pc_xscalepmcs[ri].phw_pmc; + + return 0; +} + +/* + * XXX don't know what we should do here. + */ +static int +xscale_switch_in(struct pmc_cpu *pc, struct pmc_process *pp) +{ + return 0; +} + +static int +xscale_switch_out(struct pmc_cpu *pc, struct pmc_process *pp) +{ + return 0; +} + +static int +xscale_pcpu_init(struct pmc_mdep *md, int cpu) +{ + int first_ri, i; + struct pmc_cpu *pc; + struct xscale_cpu *pac; + struct pmc_hw *phw; + + KASSERT(cpu >= 0 && cpu < pmc_cpu_max(), + ("[xscale,%d] wrong cpu number %d", __LINE__, cpu)); + PMCDBG(MDP,INI,1,"xscale-init cpu=%d", cpu); + + xscale_pcpu[cpu] = pac = malloc(sizeof(struct xscale_cpu), M_PMC, + M_WAITOK|M_ZERO); + pac->pc_xscalepmcs = malloc(sizeof(struct pmc_hw) * xscale_npmcs, + M_PMC, M_WAITOK|M_ZERO); + pc = pmc_pcpu[cpu]; + first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_XSCALE].pcd_ri; + KASSERT(pc != NULL, ("[xscale,%d] NULL per-cpu pointer", __LINE__)); + + for (i = 0, phw = pac->pc_xscalepmcs; i < xscale_npmcs; i++, phw++) { + phw->phw_state = PMC_PHW_FLAG_IS_ENABLED | + PMC_PHW_CPU_TO_STATE(cpu) | PMC_PHW_INDEX_TO_STATE(i); + phw->phw_pmc = NULL; + pc->pc_hwpmcs[i + first_ri] = phw; + } + + /* + * Disable and put the PMUs into power save mode. + */ + if (xscale_npmcs == 2) { + xscale_pmnc_write(XSCALE_PMNC_EVT1_MASK | + XSCALE_PMNC_EVT0_MASK); + } else { + xscale_evtsel_write(XSCALE_EVTSEL_EVT3_MASK | + XSCALE_EVTSEL_EVT2_MASK | XSCALE_EVTSEL_EVT1_MASK | + XSCALE_EVTSEL_EVT0_MASK); + } + + return 0; +} + +static int +xscale_pcpu_fini(struct pmc_mdep *md, int cpu) +{ + return 0; +} + +struct pmc_mdep * +pmc_xscale_initialize() +{ + struct pmc_mdep *pmc_mdep; + struct pmc_classdep *pcd; + uint32_t idreg; + + /* Get the Core Generation from CP15 */ + __asm __volatile("mrc p15, 0, %0, c0, c0, 0" : "=r" (idreg)); + xscale_gen = (idreg >> 13) & 0x3; + switch (xscale_gen) { + case 1: + xscale_npmcs = 2; + break; + case 2: + case 3: + xscale_npmcs = 4; + break; + default: + printf("%s: unknown XScale core generation\n", __func__); + return (NULL); + } + PMCDBG(MDP,INI,1,"xscale-init npmcs=%d", xscale_npmcs); + + /* + * Allocate space for pointers to PMC HW descriptors and for + * the MDEP structure used by MI code. + */ + xscale_pcpu = malloc(sizeof(struct xscale_cpu *) * pmc_cpu_max(), M_PMC, + M_WAITOK|M_ZERO); + + /* Just one class */ + pmc_mdep = malloc(sizeof(struct pmc_mdep) + sizeof(struct pmc_classdep), + M_PMC, M_WAITOK|M_ZERO); + + pmc_mdep->pmd_cputype = PMC_CPU_INTEL_XSCALE; + pmc_mdep->pmd_nclass = 1; + + pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_XSCALE]; + pcd->pcd_caps = XSCALE_PMC_CAPS; + pcd->pcd_class = PMC_CLASS_XSCALE; + pcd->pcd_num = xscale_npmcs; + pcd->pcd_ri = pmc_mdep->pmd_npmc; + pcd->pcd_width = 32; + + pcd->pcd_allocate_pmc = xscale_allocate_pmc; + pcd->pcd_config_pmc = xscale_config_pmc; + pcd->pcd_pcpu_fini = xscale_pcpu_fini; + pcd->pcd_pcpu_init = xscale_pcpu_init; + pcd->pcd_describe = xscale_describe; + pcd->pcd_get_config = xscale_get_config; + pcd->pcd_read_pmc = xscale_read_pmc; + pcd->pcd_release_pmc = xscale_release_pmc; + pcd->pcd_start_pmc = xscale_start_pmc; + pcd->pcd_stop_pmc = xscale_stop_pmc; + pcd->pcd_write_pmc = xscale_write_pmc; + + pmc_mdep->pmd_intr = xscale_intr; + pmc_mdep->pmd_switch_in = xscale_switch_in; + pmc_mdep->pmd_switch_out = xscale_switch_out; + + pmc_mdep->pmd_npmc += xscale_npmcs; + + return (pmc_mdep); +} + +void +pmc_xscale_finalize(struct pmc_mdep *md) +{ +} diff --git a/sys/dev/hwpmc/hwpmc_xscale.h b/sys/dev/hwpmc/hwpmc_xscale.h new file mode 100644 index 000000000000..80e2d23a820f --- /dev/null +++ b/sys/dev/hwpmc/hwpmc_xscale.h @@ -0,0 +1,73 @@ +/*- + * Copyright (c) 2009 Rui Paulo + * 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$ + */ + +#ifndef _DEV_HWPMC_XSCALE_H_ +#define _DEV_HWPMC_XSCALE_H_ + +#define XSCALE_PMC_CAPS (PMC_CAP_INTERRUPT | PMC_CAP_USER | \ + PMC_CAP_SYSTEM | PMC_CAP_EDGE | \ + PMC_CAP_THRESHOLD | PMC_CAP_READ | \ + PMC_CAP_WRITE | PMC_CAP_INVERT | \ + PMC_CAP_QUALIFIER) + + +#define XSCALE_PMNC_ENABLE 0x01 /* Enable all Counters */ +#define XSCALE_PMNC_PMNRESET 0x02 /* Performance Counter Reset */ +#define XSCALE_PMNC_CCNTRESET 0x04 /* Clock Counter Reset */ +#define XSCALE_PMNC_CCNTDIV 0x08 /* Clock Counter Divider */ +/* IXP425 only -- first generation */ +#define XSCALE_PMNC_EVT0_MASK 0x00ff000 +#define XSCALE_PMNC_EVT1_MASK 0xff00000 + +#define XSCALE_INTEN_CCNT 0x01 /* Enable Clock Counter Int. */ +#define XSCALE_INTEN_PMN0 0x02 /* Enable PMN0 Interrupts */ +#define XSCALE_INTEN_PMN1 0x04 /* Enable PMN1 Interrupts */ +#define XSCALE_INTEN_PMN2 0x08 /* Enable PMN2 Interrupts */ +#define XSCALE_INTEN_PMN3 0x10 /* Enable PMN3 Interrupts */ + +#define XSCALE_EVTSEL_EVT0_MASK 0x000000ff +#define XSCALE_EVTSEL_EVT1_MASK 0x0000ff00 +#define XSCALE_EVTSEL_EVT2_MASK 0x00ff0000 +#define XSCALE_EVTSEL_EVT3_MASK 0xff000000 + +#define XSCALE_FLAG_CCNT_OVERFLOW 0x01 +#define XSCALE_FLAG_PMN0_OVERFLOW 0x02 +#define XSCALE_FLAG_PMN1_OVERFLOW 0x04 +#define XSCALE_FLAG_PMN2_OVERFLOW 0x08 +#define XSCALE_FLAG_PMN3_OVERFLOW 0x10 + +#define XSCALE_RELOAD_COUNT_TO_PERFCTR_VALUE(R) (-(R)) +#define XSCALE_PERFCTR_VALUE_TO_RELOAD_COUNT(P) (-(P)) + +#ifdef _KERNEL +/* MD extension for 'struct pmc' */ +struct pmc_md_xscale_pmc { + uint32_t pm_xscale_evsel; +}; +#endif /* _KERNEL */ +#endif /* _DEV_HWPMC_XSCALE_H_ */ diff --git a/sys/dev/hwpmc/pmc_events.h b/sys/dev/hwpmc/pmc_events.h index 45ebc21dd5dc..f43e128bb209 100644 --- a/sys/dev/hwpmc/pmc_events.h +++ b/sys/dev/hwpmc/pmc_events.h @@ -1981,27 +1981,50 @@ __PMC_EV_ALIAS("SIMD_INT_64.SHUFFLE_MOVE", IAP_EVENT_FDH_40H) /* - * Intel XScale events from "Intel XScale Core Developer's Manual", - * January 2004, #27347302 + * Intel XScale events from: + * + * Intel XScale Core Developer's Manual + * January, 2004, #27347302 + * + * 3rd Generation Intel XScale Microarchitecture + * Developer's Manual + * May 2007, #31628302 + * + * First 14 events are for 1st and 2nd Generation Intel XScale cores. The + * remaining are available only on 3rd Generation Intel XScale cores. */ -#define __PMC_EV_XSCALE() \ - __PMC_EV(XSCALE, IC_FETCH) \ - __PMC_EV(XSCALE, IC_MISS) \ - __PMC_EV(XSCALE, DATA_DEPENDENCY_STALL) \ - __PMC_EV(XSCALE, ITLB_MISS) \ - __PMC_EV(XSCALE, DTLB_MISS) \ - __PMC_EV(XSCALE, BRANCH_EXECUTED) \ - __PMC_EV(XSCALE, BRANCH_MISPRED) \ - __PMC_EV(XSCALE, INSTR_EXECUTED) \ - __PMC_EV(XSCALE, DC_FULL_CYCLE) \ - __PMC_EV(XSCALE, DC_FULL_CONTIG) \ - __PMC_EV(XSCALE, DC_ACCESS) \ - __PMC_EV(XSCALE, DC_MISS) \ - __PMC_EV(XSCALE, DC_WRITEBACK) \ - __PMC_EV(XSCALE, PC_CHANGE) +#define __PMC_EV_XSCALE() \ + __PMC_EV(XSCALE, IC_FETCH) \ + __PMC_EV(XSCALE, IC_MISS) \ + __PMC_EV(XSCALE, DATA_DEPENDENCY_STALLED) \ + __PMC_EV(XSCALE, ITLB_MISS) \ + __PMC_EV(XSCALE, DTLB_MISS) \ + __PMC_EV(XSCALE, BRANCH_RETIRED) \ + __PMC_EV(XSCALE, BRANCH_MISPRED) \ + __PMC_EV(XSCALE, INSTR_RETIRED) \ + __PMC_EV(XSCALE, DC_FULL_CYCLE) \ + __PMC_EV(XSCALE, DC_FULL_CONTIG) \ + __PMC_EV(XSCALE, DC_ACCESS) \ + __PMC_EV(XSCALE, DC_MISS) \ + __PMC_EV(XSCALE, DC_WRITEBACK) \ + __PMC_EV(XSCALE, PC_CHANGE) \ + __PMC_EV(XSCALE, BRANCH_RETIRED_ALL) \ + __PMC_EV(XSCALE, INSTR_CYCLE) \ + __PMC_EV(XSCALE, CP_STALL) \ + __PMC_EV(XSCALE, PC_CHANGE_ALL) \ + __PMC_EV(XSCALE, PIPELINE_FLUSH) \ + __PMC_EV(XSCALE, BACKEND_STALL) \ + __PMC_EV(XSCALE, MULTIPLIER_USE) \ + __PMC_EV(XSCALE, MULTIPLIER_STALLED) \ + __PMC_EV(XSCALE, DATA_CACHE_STALLED) \ + __PMC_EV(XSCALE, L2_CACHE_REQ) \ + __PMC_EV(XSCALE, L2_CACHE_MISS) \ + __PMC_EV(XSCALE, ADDRESS_BUS_TRANS) \ + __PMC_EV(XSCALE, SELF_ADDRESS_BUS_TRANS) \ + __PMC_EV(XSCALE, DATA_BUS_TRANS) #define PMC_EV_XSCALE_FIRST PMC_EV_XSCALE_IC_FETCH -#define PMC_EV_XSCALE_LAST PMC_EV_XSCALE_PC_CHANGE +#define PMC_EV_XSCALE_LAST PMC_EV_XSCALE_DATA_BUS_TRANS /* * All known PMC events. diff --git a/sys/dev/ic/ns16550.h b/sys/dev/ic/ns16550.h index 400088c1a0c1..635270c4a3dd 100644 --- a/sys/dev/ic/ns16550.h +++ b/sys/dev/ic/ns16550.h @@ -52,6 +52,7 @@ #define REG_IIR com_iir #define IIR_IMASK 0xf #define IIR_RXTOUT 0xc +#define IIR_BUSY 0x7 #define IIR_RLS 0x6 #define IIR_RXRDY 0x4 #define IIR_TXRDY 0x2 @@ -181,6 +182,10 @@ #define com_xoff1 6 /* XOFF 1 character (R/W) */ #define com_xoff2 7 /* XOFF 2 character (R/W) */ +#define com_usr 39 /* Octeon 16750/16550 Uart Status Reg */ +#define REG_USR com_usr +#define USR_TXFIFO_NOTFULL 2 /* Uart TX FIFO Not full */ + /* 16950 register #1. Access enabled by ACR[7]. Also requires !LCR[7]. */ #define com_asr 1 /* additional status register (R[0-7]/W[0-1]) */ diff --git a/sys/dev/ichsmb/ichsmb_pci.c b/sys/dev/ichsmb/ichsmb_pci.c index b6d11df94ffc..0843afe40cf9 100644 --- a/sys/dev/ichsmb/ichsmb_pci.c +++ b/sys/dev/ichsmb/ichsmb_pci.c @@ -75,6 +75,10 @@ __FBSDID("$FreeBSD$"); #define ID_82801EB 0x24D38086 #define ID_82801FB 0x266A8086 #define ID_82801GB 0x27da8086 +#define ID_82801H 0x283e8086 +#define ID_82801I 0x29308086 +#define ID_82801JI 0x3a308086 +#define ID_PCH 0x3b308086 #define ID_6300ESB 0x25a48086 #define ID_631xESB 0x269b8086 @@ -152,6 +156,18 @@ ichsmb_pci_probe(device_t dev) case ID_82801GB: device_set_desc(dev, "Intel 82801GB (ICH7) SMBus controller"); break; + case ID_82801H: + device_set_desc(dev, "Intel 82801H (ICH8) SMBus controller"); + break; + case ID_82801I: + device_set_desc(dev, "Intel 82801I (ICH9) SMBus controller"); + break; + case ID_82801JI: + device_set_desc(dev, "Intel 82801JI (ICH10) SMBus controller"); + break; + case ID_PCH: + device_set_desc(dev, "Intel PCH SMBus controller"); + break; case ID_6300ESB: device_set_desc(dev, "Intel 6300ESB (ICH) SMBus controller"); break; @@ -159,12 +175,6 @@ ichsmb_pci_probe(device_t dev) device_set_desc(dev, "Intel 631xESB/6321ESB (ESB2) SMBus controller"); break; default: - if (pci_get_class(dev) == PCIC_SERIALBUS - && pci_get_subclass(dev) == PCIS_SERIALBUS_SMBUS - && pci_get_progif(dev) == PCIS_SERIALBUS_SMBUS_PROGIF) { - device_set_desc(dev, "SMBus controller"); - return (BUS_PROBE_DEFAULT); /* XXX */ - } return (ENXIO); } diff --git a/sys/dev/ichwd/ichwd.c b/sys/dev/ichwd/ichwd.c index 78d9816f156d..f268ef887eb3 100644 --- a/sys/dev/ichwd/ichwd.c +++ b/sys/dev/ichwd/ichwd.c @@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -92,6 +93,7 @@ static struct ichwd_device ichwd_devices[] = { { DEVICEID_ICH7DH, "Intel ICH7DH watchdog timer", 7 }, { DEVICEID_ICH7M, "Intel ICH7M watchdog timer", 7 }, { DEVICEID_ICH7MDH, "Intel ICH7MDH watchdog timer", 7 }, + { DEVICEID_NM10, "Intel NM10 watchdog timer", 7 }, { DEVICEID_ICH8, "Intel ICH8 watchdog timer", 8 }, { DEVICEID_ICH8DH, "Intel ICH8DH watchdog timer", 8 }, { DEVICEID_ICH8DO, "Intel ICH8DO watchdog timer", 8 }, @@ -108,6 +110,7 @@ static struct ichwd_device ichwd_devices[] = { { DEVICEID_ICH10D, "Intel ICH10D watchdog timer", 10 }, { DEVICEID_ICH10DO, "Intel ICH10DO watchdog timer", 10 }, { DEVICEID_ICH10R, "Intel ICH10R watchdog timer", 10 }, + { DEVICEID_H55, "Intel H55 watchdog timer", 10 }, { 0, NULL, 0 }, }; @@ -393,7 +396,9 @@ static int ichwd_probe(device_t dev) { - (void)dev; + /* Do not claim some ISA PnP device by accident. */ + if (isa_get_logicalid(dev) != 0) + return (ENXIO); return (0); } diff --git a/sys/dev/ichwd/ichwd.h b/sys/dev/ichwd/ichwd.h index 51ed26ddfd9f..9cc8f1b65d47 100644 --- a/sys/dev/ichwd/ichwd.h +++ b/sys/dev/ichwd/ichwd.h @@ -83,6 +83,7 @@ struct ichwd_softc { #define DEVICEID_ICH7 0x27b8 #define DEVICEID_ICH7DH 0x27b0 #define DEVICEID_ICH7M 0x27b9 +#define DEVICEID_NM10 0x27bc #define DEVICEID_ICH7MDH 0x27bd #define DEVICEID_ICH8 0x2810 #define DEVICEID_ICH8DH 0x2812 @@ -99,6 +100,7 @@ struct ichwd_softc { #define DEVICEID_ICH10D 0x3a1a #define DEVICEID_ICH10DO 0x3a14 #define DEVICEID_ICH10R 0x3a16 +#define DEVICEID_H55 0x3b06 /* ICH LPC Interface Bridge Registers (ICH5 and older) */ #define ICH_GEN_STA 0xd4 diff --git a/sys/dev/ieee488/ibfoo.c b/sys/dev/ieee488/ibfoo.c index f199920f5f3b..7ae9160a9359 100644 --- a/sys/dev/ieee488/ibfoo.c +++ b/sys/dev/ieee488/ibfoo.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2005 Poul-Henning Kamp + * Copyright (c) 2010 Joerg Wunsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -40,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -53,6 +55,7 @@ __FBSDID("$FreeBSD$"); #define UPD7210_SW_DRIVER #include +#include static MALLOC_DEFINE(M_IBFOO, "IBFOO", "IBFOO"); @@ -94,7 +97,10 @@ struct ibfoo { PIO_IDATA, PIO_ODATA, PIO_CMD, - DMA_IDATA + DMA_IDATA, + FIFO_IDATA, + FIFO_ODATA, + FIFO_CMD } mode; struct timeval deadline; @@ -170,7 +176,7 @@ ib_set_errno(struct ibarg *ap, int errno) } static int -gpib_ib_irq(struct upd7210 *u, int intr __unused) +gpib_ib_irq(struct upd7210 *u, int isr_3) { struct ibfoo *ib; @@ -211,11 +217,53 @@ gpib_ib_irq(struct upd7210 *u, int intr __unused) if (!(u->rreg[ISR1] & IXR1_ENDRX)) return (0); break; + case FIFO_IDATA: + if (!(isr_3 & 0x15)) + return (0); + while (ib->buflen != 0 && (isr_3 & 0x04 /* NEF */) != 0) { + *ib->buf = bus_read_1(u->reg_res[0], fifob); + ib->buf++; + ib->buflen--; + isr_3 = bus_read_1(u->reg_res[0], isr3); + } + if ((isr_3 & 0x01) != 0 /* xfr done */ || + (u->rreg[ISR1] & IXR1_ENDRX) != 0 || + ib->buflen == 0) + break; + if (isr_3 & 0x10) + /* xfr stopped */ + bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ + upd7210_wr(u, AUXMR, AUXMR_RFD); + return (1); + case FIFO_CMD: + case FIFO_ODATA: + if (!(isr_3 & 0x19)) + return (0); + if (ib->buflen == 0) + /* xfr DONE */ + break; + while (ib->buflen != 0 && (isr_3 & 0x08 /* NFF */) != 0) { + bus_write_1(u->reg_res[0], fifob, *ib->buf); + ib->buf++; + ib->buflen--; + isr_3 = bus_read_1(u->reg_res[0], isr3); + } + if (isr_3 & 0x10) + /* xfr stopped */ + bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ + if (ib->buflen == 0) + /* no more NFF interrupts wanted */ + bus_write_1(u->reg_res[0], imr3, 0x11); /* STOP IE, DONE IE */ + return (1); default: return (0); } upd7210_wr(u, IMR1, 0); upd7210_wr(u, IMR2, 0); + if (u->use_fifo) { + bus_write_1(u->reg_res[0], imr3, 0x00); + bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft RESET */ + } ib->mode = BUSY; wakeup(&ib->buflen); return (1); @@ -227,6 +275,7 @@ gpib_ib_timeout(void *arg) struct upd7210 *u; struct ibfoo *ib; struct timeval tv; + u_int isr_3; u = arg; ib = u->ibfoo; @@ -241,7 +290,11 @@ gpib_ib_timeout(void *arg) if (ib->mode > BUSY) { upd7210_rd(u, ISR1); upd7210_rd(u, ISR2); - gpib_ib_irq(u, 2); + if (u->use_fifo) + isr_3 = bus_read_1(u->reg_res[0], isr3); + else + isr_3 = 0; + gpib_ib_irq(u, isr_3); } if (ib->mode != IDLE && timevalisset(&ib->deadline)) { getmicrouptime(&tv); @@ -249,6 +302,10 @@ gpib_ib_timeout(void *arg) ib_had_timeout(ib->ap); upd7210_wr(u, IMR1, 0); upd7210_wr(u, IMR2, 0); + if (u->use_fifo) { + bus_write_1(u->reg_res[0], imr3, 0x00); + bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft RESET */ + } ib->mode = BUSY; wakeup(&ib->buflen); } @@ -280,6 +337,8 @@ gpib_ib_wait_xfer(struct upd7210 *u, struct ibfoo *ib) ib->buf = NULL; upd7210_wr(u, IMR1, 0); upd7210_wr(u, IMR2, 0); + if (u->use_fifo) + bus_write_1(u->reg_res[0], imr3, 0x00); } static void @@ -335,15 +394,31 @@ pio_cmd(struct upd7210 *u, u_char *cmd, int len) ib->wrh = NULL; } mtx_lock(&u->mutex); - ib->mode = PIO_CMD; ib->buf = cmd; ib->buflen = len; - upd7210_wr(u, IMR2, IXR2_CO); - - gpib_ib_irq(u, 1); + if (u->use_fifo) { + /* TNT5004 or TNT4882 in FIFO mode */ + ib->mode = FIFO_CMD; + upd7210_wr(u, AUXMR, 0x51); /* holdoff immediately */ + bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ + bus_write_1(u->reg_res[0], cfg, 0x80); /* CMD, xfer OUT, 8-bit FIFO */ + bus_write_1(u->reg_res[0], imr3, 0x19); /* STOP IE, NFF IE, DONE IE */ + bus_write_1(u->reg_res[0], cnt0, -len); + bus_write_1(u->reg_res[0], cnt1, (-len) >> 8); + bus_write_1(u->reg_res[0], cnt2, (-len) >> 16); + bus_write_1(u->reg_res[0], cnt3, (-len) >> 24); + bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ + } else { + ib->mode = PIO_CMD; + upd7210_wr(u, IMR2, IXR2_CO); + gpib_ib_irq(u, 0); + } gpib_ib_wait_xfer(u, ib); + if (u->use_fifo) + bus_write_1(u->reg_res[0], cmdr, 0x08); /* STOP */ + mtx_unlock(&u->mutex); return (len - ib->buflen); } @@ -358,13 +433,32 @@ pio_odata(struct upd7210 *u, u_char *data, int len) if (len == 0) return (0); mtx_lock(&u->mutex); - ib->mode = PIO_ODATA; ib->buf = data; ib->buflen = len; - upd7210_wr(u, IMR1, IXR1_DO); + if (u->use_fifo) { + /* TNT5004 or TNT4882 in FIFO mode */ + ib->mode = FIFO_ODATA; + bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ + if (ib->doeoi) + bus_write_1(u->reg_res[0], cfg, 0x08); /* CCEN */ + else + bus_write_1(u->reg_res[0], cfg, 0x00); /* xfer OUT, 8-bit FIFO */ + bus_write_1(u->reg_res[0], imr3, 0x19); /* STOP IE, NFF IE, DONE IE */ + bus_write_1(u->reg_res[0], cnt0, -len); + bus_write_1(u->reg_res[0], cnt1, (-len) >> 8); + bus_write_1(u->reg_res[0], cnt2, (-len) >> 16); + bus_write_1(u->reg_res[0], cnt3, (-len) >> 24); + bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ + } else { + ib->mode = PIO_ODATA; + upd7210_wr(u, IMR1, IXR1_DO); + } gpib_ib_wait_xfer(u, ib); + if (u->use_fifo) + bus_write_1(u->reg_res[0], cmdr, 0x08); /* STOP */ + mtx_unlock(&u->mutex); return (len - ib->buflen); } @@ -377,13 +471,30 @@ pio_idata(struct upd7210 *u, u_char *data, int len) ib = u->ibfoo; mtx_lock(&u->mutex); - ib->mode = PIO_IDATA; ib->buf = data; ib->buflen = len; - upd7210_wr(u, IMR1, IXR1_DI); + if (u->use_fifo) { + /* TNT5004 or TNT4882 in FIFO mode */ + ib->mode = FIFO_IDATA; + bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ + bus_write_1(u->reg_res[0], cfg, 0x20); /* xfer IN, 8-bit FIFO */ + bus_write_1(u->reg_res[0], cnt0, -len); + bus_write_1(u->reg_res[0], cnt1, (-len) >> 8); + bus_write_1(u->reg_res[0], cnt2, (-len) >> 16); + bus_write_1(u->reg_res[0], cnt3, (-len) >> 24); + bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ + upd7210_wr(u, AUXMR, AUXMR_RFD); + bus_write_1(u->reg_res[0], imr3, 0x15); /* STOP IE, NEF IE, DONE IE */ + } else { + ib->mode = PIO_IDATA; + upd7210_wr(u, IMR1, IXR1_DI); + } gpib_ib_wait_xfer(u, ib); + if (u->use_fifo) + bus_write_1(u->reg_res[0], cmdr, 0x08); /* STOP */ + mtx_unlock(&u->mutex); return (len - ib->buflen); } @@ -397,18 +508,14 @@ dma_idata(struct upd7210 *u, u_char *data, int len) KASSERT(u->dmachan >= 0, ("Bogus dmachan %d", u->dmachan)); ib = u->ibfoo; ib->mode = DMA_IDATA; - mtx_lock(&Giant); isa_dmastart(ISADMA_READ, data, len, u->dmachan); - mtx_unlock(&Giant); mtx_lock(&u->mutex); upd7210_wr(u, IMR1, IXR1_ENDRX); upd7210_wr(u, IMR2, IMR2_DMAI); gpib_ib_wait_xfer(u, ib); mtx_unlock(&u->mutex); - mtx_lock(&Giant); j = isa_dmastatus(u->dmachan); isa_dmadone(ISADMA_READ, data, len, u->dmachan); - mtx_unlock(&Giant); return (len - j); } @@ -790,14 +897,12 @@ gpib_ib_open(struct cdev *dev, int oflags, int devtype, struct thread *td) mtx_unlock(&u->mutex); if (u->dmachan >= 0) { - mtx_lock(&Giant); error = isa_dma_acquire(u->dmachan); if (!error) { error = isa_dma_init(u->dmachan, PAGE_SIZE, M_WAITOK); if (error) isa_dma_release(u->dmachan); } - mtx_unlock(&Giant); } if (error) { @@ -832,6 +937,12 @@ gpib_ib_open(struct cdev *dev, int oflags, int devtype, struct thread *td) upd7210_wr(u, AUXMR, C_AUXB + 3); upd7210_wr(u, AUXMR, C_AUXE + 0); upd7210_wr(u, AUXMR, AUXMR_PON); + if (u->use_fifo) { + bus_write_1(u->reg_res[0], imr3, 0x00); + bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft reset */ + bus_write_1(u->reg_res[0], cmdr, 0x03); /* set system + * controller bit */ + } upd7210_wr(u, AUXMR, AUXMR_CIFC); DELAY(100); upd7210_wr(u, AUXMR, AUXMR_SIFC); @@ -855,15 +966,18 @@ gpib_ib_close(struct cdev *dev, int oflags, int devtype, struct thread *td) free(ib, M_IBFOO); if (u->dmachan >= 0) { - mtx_lock(&Giant); isa_dma_release(u->dmachan); - mtx_unlock(&Giant); } mtx_lock(&u->mutex); u->busy = 0; ibdebug = 0; upd7210_wr(u, IMR1, 0x00); upd7210_wr(u, IMR2, 0x00); + if (u->use_fifo) { + bus_write_1(u->reg_res[0], imr3, 0x00); + bus_write_1(u->reg_res[0], cmdr, 0x02); /* clear system + * controller bit */ + } upd7210_wr(u, AUXMR, AUXMR_CRST); DELAY(10000); mtx_unlock(&u->mutex); diff --git a/sys/dev/ieee488/pcii.c b/sys/dev/ieee488/pcii.c index 7e5e23ec0a05..3c5699e0cfde 100644 --- a/sys/dev/ieee488/pcii.c +++ b/sys/dev/ieee488/pcii.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2005 Poul-Henning Kamp + * Copyright (c) 2010 Joerg Wunsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,6 +34,8 @@ * * Tested and known working: * "B&C Microsystems PC488A-0" + * "National Instruments GPIB-PCII/PCIIA" (in PCIIa mode) + * "Axiom AX5488" * */ @@ -56,7 +59,7 @@ __FBSDID("$FreeBSD$"); struct pcii_softc { int foo; - struct resource *res[3]; + struct resource *res[11]; void *intr_handler; struct upd7210 upd7210; }; @@ -79,6 +82,14 @@ static struct resource_spec pcii_res_spec[] = { { SYS_RES_IRQ, 0, RF_ACTIVE | RF_SHAREABLE}, { SYS_RES_DRQ, 0, RF_ACTIVE | RF_SHAREABLE | RF_OPTIONAL}, { SYS_RES_IOPORT, 0, RF_ACTIVE}, + { SYS_RES_IOPORT, 1, RF_ACTIVE}, + { SYS_RES_IOPORT, 2, RF_ACTIVE}, + { SYS_RES_IOPORT, 3, RF_ACTIVE}, + { SYS_RES_IOPORT, 4, RF_ACTIVE}, + { SYS_RES_IOPORT, 5, RF_ACTIVE}, + { SYS_RES_IOPORT, 6, RF_ACTIVE}, + { SYS_RES_IOPORT, 7, RF_ACTIVE}, + { SYS_RES_IOPORT, 8, RF_ACTIVE | RF_SHAREABLE}, { -1, 0, 0 } }; @@ -92,7 +103,7 @@ static int pcii_probe(device_t dev) { int rid, i, j; - u_long start, count; + u_long start, count, addr; int error = 0; struct pcii_softc *sc; @@ -102,30 +113,90 @@ pcii_probe(device_t dev) rid = 0; if (bus_get_resource(dev, SYS_RES_IOPORT, rid, &start, &count) != 0) return ENXIO; - if ((start & 0x3ff) != 0x2e1) + /* + * The PCIIA decodes a fixed pattern of 0x2e1 for the lower 10 + * address bits A0 ... A9. Bits A10 through A12 are used by + * the µPD7210 register select lines. This makes the + * individual 7210 register being 0x400 bytes apart in the ISA + * bus address space. Address bits A13 and A14 are compared + * to a DIP switch setting on the card, allowing for up to 4 + * different cards being installed (at base addresses 0x2e1, + * 0x22e1, 0x42e1, and 0x62e1, respectively). A15 has been + * used to select an optional on-board time-of-day clock chip + * (MM58167A) on the original PCIIA rather than the µPD7210 + * (which is not implemented on later boards). The + * documentation states the respective addresses for that chip + * should be handled as reserved addresses, which we don't do + * (right now). Finally, the IO addresses 0x2f0 ... 0x2f7 for + * a "special interrupt handling feature" (re-enable + * interrupts so the IRQ can be shared). + * + * Usually, the user will only set the base address in the + * device hints, so we handle the rest here. + * + * (Source: GPIB-PCIIA Technical Reference Manual, September + * 1989 Edition, National Instruments.) + */ + if ((start & 0x3ff) != 0x2e1) { + if (bootverbose) + printf("pcii_probe: PCIIA base address 0x%lx not " + "0x2e1/0x22e1/0x42e1/0x62e1\n", + start); return (ENXIO); - count = 1; - if (bus_set_resource(dev, SYS_RES_IOPORT, rid, start, count) != 0) + } + + for (rid = 0, addr = start; rid < 8; rid++, addr += 0x400) { + if (bus_set_resource(dev, SYS_RES_IOPORT, rid, addr, 1) != 0) { + printf("pcii_probe: could not set IO port 0x%lx\n", + addr); + return (ENXIO); + } + } + if (bus_get_resource(dev, SYS_RES_IRQ, 0, &start, &count) != 0) { + printf("pcii_probe: cannot obtain IRQ level\n"); return ENXIO; + } + if (start > 7) { + printf("pcii_probe: IRQ level %lu too high\n", start); + return ENXIO; + } + + if (bus_set_resource(dev, SYS_RES_IOPORT, 8, 0x2f0 + start, 1) != 0) { + printf("pcii_probe: could not set IO port 0x%3lx\n", + 0x2f0 + start); + return (ENXIO); + } + error = bus_alloc_resources(dev, pcii_res_spec, sc->res); - if (error) + if (error) { + printf("pcii_probe: Could not allocate resources\n"); return (error); + } error = ENXIO; + /* + * Perform some basic tests on the µPD7210 registers. At + * least *some* register must read different from 0x00 or + * 0xff. + */ for (i = 0; i < 8; i++) { - j = bus_read_1(sc->res[2], i * 0x400); + j = bus_read_1(sc->res[2 + i], 0); if (j != 0x00 && j != 0xff) error = 0; } + /* SPSR/SPMR read/write test */ if (!error) { - bus_write_1(sc->res[2], 3 * 0x400, 0x55); - if (bus_read_1(sc->res[2], 3 * 0x400) != 0x55) + bus_write_1(sc->res[2 + 3], 0, 0x55); + if (bus_read_1(sc->res[2 + 3], 0) != 0x55) error = ENXIO; } if (!error) { - bus_write_1(sc->res[2], 3 * 0x400, 0xaa); - if (bus_read_1(sc->res[2], 3 * 0x400) != 0xaa) + bus_write_1(sc->res[2 + 3], 0, 0xaa); + if (bus_read_1(sc->res[2 + 3], 0) != 0xaa) error = ENXIO; } + if (error) + printf("pcii_probe: probe failure\n"); + bus_release_resources(dev, pcii_res_spec, sc->res); return (error); } @@ -134,6 +205,7 @@ static int pcii_attach(device_t dev) { struct pcii_softc *sc; + u_long start, count; int unit; int rid; int error = 0; @@ -144,6 +216,11 @@ pcii_attach(device_t dev) device_set_desc(dev, "PCII IEEE-4888 controller"); + if (bus_get_resource(dev, SYS_RES_IRQ, 0, &start, &count) != 0) { + printf("pcii_attach: cannot obtain IRQ number\n"); + return ENXIO; + } + error = bus_alloc_resources(dev, pcii_res_spec, sc->res); if (error) return (error); @@ -157,9 +234,11 @@ pcii_attach(device_t dev) } for (rid = 0; rid < 8; rid++) { - sc->upd7210.reg_res[rid] = sc->res[2]; - sc->upd7210.reg_offset[rid] = 0x400 * rid; + sc->upd7210.reg_res[rid] = sc->res[2 + rid]; + sc->upd7210.reg_offset[rid] = 0; } + sc->upd7210.irq_clear_res = sc->res[10]; + sc->upd7210.use_fifo = 0; if (sc->res[1] == NULL) sc->upd7210.dmachan = -1; @@ -167,7 +246,9 @@ pcii_attach(device_t dev) sc->upd7210.dmachan = rman_get_start(sc->res[1]); upd7210attach(&sc->upd7210); - return (error); + device_printf(dev, "attached gpib%d\n", sc->upd7210.unit); + + return (0); } DRIVER_MODULE(pcii, isa, pcii_driver, pcii_devclass, 0, 0); diff --git a/sys/dev/ieee488/tnt4882.c b/sys/dev/ieee488/tnt4882.c index 1f21731809c7..4b69d0dbd005 100644 --- a/sys/dev/ieee488/tnt4882.c +++ b/sys/dev/ieee488/tnt4882.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2005 Poul-Henning Kamp + * Copyright (c) 2010 Joerg Wunsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,6 +47,7 @@ #define UPD7210_HW_DRIVER 1 #include +#include struct tnt_softc { int foo; @@ -62,55 +64,6 @@ static struct resource_spec tnt_res_spec[] = { { -1, 0 } }; -enum tnt4882reg { - dir = 0x00, - cdor = 0x00, - isr1 = 0x02, - imr1 = 0x02, - isr2 = 0x04, - imr2 = 0x04, - accwr = 0x05, - spsr = 0x06, - spmr = 0x06, - intr = 0x07, - adsr = 0x08, - admr = 0x08, - cnt2 = 0x09, - cptr = 0x0a, - auxmr = 0x0a, - tauxcr = 0x0a, /* 9914 mode register */ - cnt3 = 0x0b, - adr0 = 0x0c, - adr = 0x0c, - hssel = 0x0d, - adr1 = 0x0e, - eosr = 0x0e, - sts1 = 0x10, - cfg = 0x10, - dsr = 0x11, - sh_cnt = 0x11, - imr3 = 0x12, - hier = 0x13, - cnt0 = 0x14, - misc = 0x15, - cnt1 = 0x16, - csr = 0x17, - keyreg = 0x17, - fifob = 0x18, - fifoa = 0x19, - isr3 = 0x1a, - ccr = 0x1a, - sasr = 0x1b, - dcr = 0x1b, - sts2 = 0x1c, - cmdr = 0x1c, - isr0 = 0x1d, - imr0 = 0x1d, - timer = 0x1e, - bsr = 0x1f, - bcr = 0x1f -}; - struct tst { enum {RD, WT, xDELAY, END} action; @@ -276,6 +229,7 @@ tnt_attach(device_t dev) { struct tnt_softc *sc; int error, i; + uint8_t version; sc = device_get_softc(dev); @@ -286,7 +240,7 @@ tnt_attach(device_t dev) error = bus_setup_intr(dev, sc->res[2], INTR_TYPE_MISC | INTR_MPSAFE, NULL, upd7210intr, &sc->upd7210, &sc->intr_handler); - /* Necessary magic for MITE */ + /* IO Device Window Base Size Register (IODWBSR) */ bus_write_4(sc->res[0], 0xc0, rman_get_start(sc->res[1]) | 0x80); tst_exec(sc, tst_reset, "Reset"); @@ -298,6 +252,18 @@ tnt_attach(device_t dev) tst_exec(sc, tst_count0_1, "COUNT0:1"); tst_exec(sc, tst_reset, "Reset"); + version = bus_read_1(sc->res[1], csr); + version = (version >> 4) & 0x0f; + device_printf(dev, "Chip version 0x%02x (TNT%s)\n", + version, + version >= 4? "5004 or above": "4882"); + if (version >= 4) { + device_printf(dev, "Forcing FIFO mode\n"); + sc->upd7210.use_fifo = 1; + } else { + sc->upd7210.use_fifo = 0; + } + /* pass 7210 interrupts through */ bus_write_1(sc->res[1], imr3, 0x02); @@ -309,7 +275,15 @@ tnt_attach(device_t dev) /* No DMA help */ sc->upd7210.dmachan = -1; + /* No "special interrupt handling" needed here. */ + sc->upd7210.irq_clear_res = NULL; + upd7210attach(&sc->upd7210); + device_printf(dev, "attached gpib%d\n", sc->upd7210.unit); + + if (sc->upd7210.use_fifo) + bus_write_1(sc->res[0], hssel, 0x01); /* one-chip mode */ + return (0); } diff --git a/sys/dev/ieee488/tnt4882.h b/sys/dev/ieee488/tnt4882.h new file mode 100644 index 000000000000..221cfd943ccd --- /dev/null +++ b/sys/dev/ieee488/tnt4882.h @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2010 Joerg Wunsch + * 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$ + */ + +enum tnt4882reg { + dir = 0x00, + cdor = 0x00, + isr1 = 0x02, + imr1 = 0x02, + isr2 = 0x04, + imr2 = 0x04, + accwr = 0x05, + spsr = 0x06, + spmr = 0x06, + intr = 0x07, + adsr = 0x08, + admr = 0x08, + cnt2 = 0x09, + cptr = 0x0a, + auxmr = 0x0a, + tauxcr = 0x0a, /* 9914 mode register */ + cnt3 = 0x0b, + adr0 = 0x0c, + adr = 0x0c, + hssel = 0x0d, + adr1 = 0x0e, + eosr = 0x0e, + sts1 = 0x10, + cfg = 0x10, + dsr = 0x11, + sh_cnt = 0x11, + imr3 = 0x12, + hier = 0x13, + cnt0 = 0x14, + misc = 0x15, + cnt1 = 0x16, + csr = 0x17, + keyreg = 0x17, + fifob = 0x18, + fifoa = 0x19, + isr3 = 0x1a, + ccr = 0x1a, + sasr = 0x1b, + dcr = 0x1b, + sts2 = 0x1c, + cmdr = 0x1c, + isr0 = 0x1d, + imr0 = 0x1d, + timer = 0x1e, + bsr = 0x1f, + bcr = 0x1f +}; + diff --git a/sys/dev/ieee488/upd7210.c b/sys/dev/ieee488/upd7210.c index 27359e2a175c..ed6c64eed20c 100644 --- a/sys/dev/ieee488/upd7210.c +++ b/sys/dev/ieee488/upd7210.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2005 Poul-Henning Kamp + * Copyright (c) 2010 Joerg Wunsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,6 +54,7 @@ __FBSDID("$FreeBSD$"); #define UPD7210_HW_DRIVER #define UPD7210_SW_DRIVER #include +#include static MALLOC_DEFINE(M_GPIB, "GPIB", "GPIB"); @@ -89,26 +91,48 @@ upd7210_wr(struct upd7210 *u, enum upd7210_wreg reg, u_int val) void upd7210intr(void *arg) { - u_int isr1, isr2; + u_int isr_1, isr_2, isr_3; struct upd7210 *u; u = arg; mtx_lock(&u->mutex); - isr1 = upd7210_rd(u, ISR1); - isr2 = upd7210_rd(u, ISR2); - if (u->busy == 0 || u->irq == NULL || !u->irq(u, 1)) { + isr_1 = upd7210_rd(u, ISR1); + isr_2 = upd7210_rd(u, ISR2); + if (u->use_fifo) { + isr_3 = bus_read_1(u->reg_res[0], isr3); + } else { + isr_3 = 0; + } + if (isr_1 != 0 || isr_2 != 0 || isr_3 != 0) { + if (u->busy == 0 || u->irq == NULL || !u->irq(u, isr_3)) { #if 0 - printf("upd7210intr [%02x %02x %02x", - upd7210_rd(u, DIR), isr1, isr2); - printf(" %02x %02x %02x %02x %02x] ", - upd7210_rd(u, SPSR), - upd7210_rd(u, ADSR), - upd7210_rd(u, CPTR), - upd7210_rd(u, ADR0), + printf("upd7210intr [%02x %02x %02x", + upd7210_rd(u, DIR), isr1, isr2); + printf(" %02x %02x %02x %02x %02x] ", + upd7210_rd(u, SPSR), + upd7210_rd(u, ADSR), + upd7210_rd(u, CPTR), + upd7210_rd(u, ADR0), upd7210_rd(u, ADR1)); - upd7210_print_isr(isr1, isr2); - printf("\n"); + upd7210_print_isr(isr1, isr2); + printf("\n"); #endif + } + /* + * "special interrupt handling" + * + * In order to implement shared IRQs, the original + * PCIIa uses IO locations 0x2f0 + (IRQ#) as an output + * location. If an ISR for a particular card has + * detected this card triggered the IRQ, it must reset + * the card's IRQ by writing (anything) to that IO + * location. + * + * Some clones apparently don't implement this + * feature, but National Instrument cards do. + */ + if (u->irq_clear_res != NULL) + bus_write_1(u->irq_clear_res, 0, 42); } mtx_unlock(&u->mutex); } @@ -150,17 +174,38 @@ upd7210_goto_standby(struct upd7210 *u) /* Unaddressed Listen Only mode */ static int -gpib_l_irq(struct upd7210 *u, int intr __unused) +gpib_l_irq(struct upd7210 *u, int isr_3) { int i; + int have_data = 0; - if (u->rreg[ISR1] & 1) { + if (u->use_fifo) { + /* TNT5004 or TNT4882 in FIFO mode */ + if (isr_3 & 0x04) { + /* FIFO not empty */ + i = bus_read_1(u->reg_res[0], fifob); + have_data = 1; + bus_write_1(u->reg_res[0], cnt0, -1); + bus_write_1(u->reg_res[0], cnt1, (-1) >> 8); + bus_write_1(u->reg_res[0], cnt2, (-1) >> 16); + bus_write_1(u->reg_res[0], cnt3, (-1) >> 24); + bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ + } + } else if (u->rreg[ISR1] & 1) { i = upd7210_rd(u, DIR); + have_data = 1; + } + + if (have_data) { u->buf[u->buf_wp++] = i; u->buf_wp &= (u->bufsize - 1); i = (u->buf_rp + u->bufsize - u->buf_wp) & (u->bufsize - 1); - if (i < 8) - upd7210_wr(u, IMR1, 0); + if (i < 8) { + if (u->use_fifo) + bus_write_1(u->reg_res[0], imr3, 0x00); + else + upd7210_wr(u, IMR1, 0); + } wakeup(u->buf); return (1); } @@ -188,15 +233,28 @@ gpib_l_open(struct cdev *dev, int oflags, int devtype, struct thread *td) u->buf_wp = 0; u->buf_rp = 0; - upd7210_wr(u, AUXMR, AUXMR_CRST); + upd7210_wr(u, AUXMR, AUXMR_CRST); /* chip reset */ DELAY(10000); - upd7210_wr(u, AUXMR, C_ICR | 8); + upd7210_wr(u, AUXMR, C_ICR | 8); /* 8 MHz clock */ DELAY(1000); - upd7210_wr(u, ADR, 0x60); - upd7210_wr(u, ADR, 0xe0); - upd7210_wr(u, ADMR, 0x70); - upd7210_wr(u, AUXMR, AUXMR_PON); - upd7210_wr(u, IMR1, 0x01); + upd7210_wr(u, ADR, 0x60); /* ADR0: disable listener and talker 0 */ + upd7210_wr(u, ADR, 0xe0); /* ADR1: disable listener and talker 1 */ + upd7210_wr(u, ADMR, 0x70); /* listen-only (lon) */ + upd7210_wr(u, AUXMR, AUXMR_PON); /* immediate execute power-on (pon) */ + if (u->use_fifo) { + /* TNT5004 or TNT4882 in FIFO mode */ + bus_write_1(u->reg_res[0], cmdr, 0x10); /* reset FIFO */ + bus_write_1(u->reg_res[0], cfg, 0x20); /* xfer IN, 8-bit FIFO */ + bus_write_1(u->reg_res[0], cnt0, -1); + bus_write_1(u->reg_res[0], cnt1, (-1) >> 8); + bus_write_1(u->reg_res[0], cnt2, (-1) >> 16); + bus_write_1(u->reg_res[0], cnt3, (-1) >> 24); + bus_write_1(u->reg_res[0], cmdr, 0x04); /* GO */ + bus_write_1(u->reg_res[0], imr3, 0x04); /* NEF IE */ + } else { + /* µPD7210/NAT7210, or TNT4882 in non-FIFO mode */ + upd7210_wr(u, IMR1, 0x01); /* data in interrupt enable */ + } return (0); } @@ -209,6 +267,11 @@ gpib_l_close(struct cdev *dev, int oflags, int devtype, struct thread *td) mtx_lock(&u->mutex); u->busy = 0; + if (u->use_fifo) { + /* TNT5004 or TNT4882 in FIFO mode */ + bus_write_1(u->reg_res[0], cmdr, 0x22); /* soft RESET */ + bus_write_1(u->reg_res[0], imr3, 0x00); + } upd7210_wr(u, AUXMR, AUXMR_CRST); DELAY(10000); upd7210_wr(u, IMR1, 0x00); @@ -253,8 +316,12 @@ gpib_l_read(struct cdev *dev, struct uio *uio, int ioflag) u->buf_rp += z; u->buf_rp &= (u->bufsize - 1); } - if (u->wreg[IMR1] == 0) - upd7210_wr(u, IMR1, 0x01); + if (u->use_fifo) { + bus_write_1(u->reg_res[0], imr3, 0x04); /* NFF IE */ + } else { + if (u->wreg[IMR1] == 0) + upd7210_wr(u, IMR1, 0x01); + } mtx_unlock(&u->mutex); return (error); } diff --git a/sys/dev/ieee488/upd7210.h b/sys/dev/ieee488/upd7210.h index da1032c311ba..88235ddbebc5 100644 --- a/sys/dev/ieee488/upd7210.h +++ b/sys/dev/ieee488/upd7210.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2005 Poul-Henning Kamp + * Copyright (c) 2010 Joerg Wunsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,9 +49,11 @@ typedef int upd7210_irq_t(struct upd7210 *, int); struct upd7210 { struct resource *reg_res[8]; + struct resource *irq_clear_res; u_int reg_offset[8]; int dmachan; int unit; + int use_fifo; /* private stuff */ struct mtx mutex; diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index b153e651472b..2ec9d0ed1f2d 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$"); #include #include - #include #include #include @@ -137,7 +136,6 @@ static void ndis_linksts (ndis_handle, ndis_status, void *, uint32_t); static void ndis_linksts_done (ndis_handle); /* We need to wrap these functions for amd64. */ - static funcptr ndis_txeof_wrap; static funcptr ndis_rxeof_wrap; static funcptr ndis_rxeof_eth_wrap; @@ -191,6 +189,7 @@ static int ndis_set_offload (struct ndis_softc *); static void ndis_getstate_80211 (struct ndis_softc *); static void ndis_setstate_80211 (struct ndis_softc *); static void ndis_auth_and_assoc (struct ndis_softc *, struct ieee80211vap *); +static void ndis_media_status (struct ifnet *, struct ifmediareq *); static int ndis_set_cipher (struct ndis_softc *, int); static int ndis_set_wpa (struct ndis_softc *, void *, int); static int ndis_add_key (struct ieee80211vap *, @@ -210,7 +209,6 @@ static int ndisdrv_loaded = 0; * image, and create a Windows driver object which will be * saved in our driver database. */ - int ndisdrv_modevent(mod, cmd, arg) module_t mod; @@ -299,7 +297,7 @@ ndis_setmulti(sc) error = ndis_set_info(sc, OID_GEN_CURRENT_PACKET_FILTER, &sc->ndis_filter, &len); if (error) - device_printf (sc->ndis_dev, + device_printf(sc->ndis_dev, "set allmulti failed: %d\n", error); return; } @@ -339,7 +337,7 @@ ndis_setmulti(sc) len = len * ETHER_ADDR_LEN; error = ndis_set_info(sc, OID_802_3_MULTICAST_LIST, mclist, &len); if (error) { - device_printf (sc->ndis_dev, "set mclist failed: %d\n", error); + device_printf(sc->ndis_dev, "set mclist failed: %d\n", error); sc->ndis_filter |= NDIS_PACKET_TYPE_ALL_MULTICAST; sc->ndis_filter &= ~NDIS_PACKET_TYPE_MULTICAST; } @@ -351,9 +349,7 @@ out: error = ndis_set_info(sc, OID_GEN_CURRENT_PACKET_FILTER, &sc->ndis_filter, &len); if (error) - device_printf (sc->ndis_dev, "set multi failed: %d\n", error); - - return; + device_printf(sc->ndis_dev, "set multi failed: %d\n", error); } static int @@ -369,16 +365,16 @@ ndis_set_offload(sc) ifp = sc->ifp; if (!NDIS_INITIALIZED(sc)) - return(EINVAL); + return (EINVAL); /* See if there's anything to set. */ error = ndis_probe_offload(sc); if (error) - return(error); + return (error); if (sc->ndis_hwassist == 0 && ifp->if_capabilities == 0) - return(0); + return (0); len = sizeof(ndis_task_offload_hdr) + sizeof(ndis_task_offload) + sizeof(ndis_task_tcpip_csum); @@ -386,7 +382,7 @@ ndis_set_offload(sc) ntoh = malloc(len, M_TEMP, M_NOWAIT|M_ZERO); if (ntoh == NULL) - return(ENOMEM); + return (ENOMEM); ntoh->ntoh_vers = NDIS_TASK_OFFLOAD_VERSION; ntoh->ntoh_len = sizeof(ndis_task_offload_hdr); @@ -415,7 +411,7 @@ ndis_set_offload(sc) error = ndis_set_info(sc, OID_TCP_TASK_OFFLOAD, ntoh, &len); free(ntoh, M_TEMP); - return(error); + return (error); } static int @@ -434,12 +430,12 @@ ndis_probe_offload(sc) error = ndis_get_info(sc, OID_TCP_TASK_OFFLOAD, &dummy, &len); if (error != ENOSPC) - return(error); + return (error); ntoh = malloc(len, M_TEMP, M_NOWAIT|M_ZERO); if (ntoh == NULL) - return(ENOMEM); + return (ENOMEM); ntoh->ntoh_vers = NDIS_TASK_OFFLOAD_VERSION; ntoh->ntoh_len = sizeof(ndis_task_offload_hdr); @@ -451,12 +447,12 @@ ndis_probe_offload(sc) if (error) { free(ntoh, M_TEMP); - return(error); + return (error); } if (ntoh->ntoh_vers != NDIS_TASK_OFFLOAD_VERSION) { free(ntoh, M_TEMP); - return(EINVAL); + return (EINVAL); } nto = (ndis_task_offload *)((char *)ntoh + @@ -481,7 +477,7 @@ ndis_probe_offload(sc) if (nttc == NULL) { free(ntoh, M_TEMP); - return(ENOENT); + return (ENOENT); } sc->ndis_v4tx = nttc->nttc_v4tx; @@ -505,7 +501,7 @@ ndis_probe_offload(sc) ifp->if_capabilities |= IFCAP_RXCSUM; free(ntoh, M_TEMP); - return(0); + return (0); } static int @@ -632,7 +628,7 @@ ndis_attach(dev) /* Call driver's init routine. */ if (ndis_init_nic(sc)) { - device_printf (dev, "init handler failed\n"); + device_printf(dev, "init handler failed\n"); error = ENXIO; goto fail; } @@ -650,7 +646,7 @@ ndis_attach(dev) len = sizeof(sc->ndis_maxpkts); if (ndis_get_info(sc, OID_GEN_MAXIMUM_SEND_PACKETS, &sc->ndis_maxpkts, &len)) { - device_printf (dev, "failed to get max TX packets\n"); + device_printf(dev, "failed to get max TX packets\n"); error = ENXIO; goto fail; } @@ -659,7 +655,6 @@ ndis_attach(dev) * If this is a deserialized miniport, we don't have * to honor the OID_GEN_MAXIMUM_SEND_PACKETS result. */ - if (!NDIS_SERIALIZED(sc->ndis_block)) sc->ndis_maxpkts = NDIS_TXPKTS; @@ -698,12 +693,11 @@ ndis_attach(dev) * supported by this driver. If it is, then this an 802.11 * wireless driver, and we should set up media for wireless. */ - for (i = 0; i < sc->ndis_oidcnt; i++) { + for (i = 0; i < sc->ndis_oidcnt; i++) if (sc->ndis_oids[i] == OID_802_11_CONFIGURATION) { sc->ndis_80211++; break; } - } if (sc->ndis_80211) ifp = if_alloc(IFT_IEEE80211); @@ -783,7 +777,7 @@ nonettypes: r = ndis_get_info(sc, OID_802_11_SUPPORTED_RATES, (void *)rates, &len); if (r) - device_printf (dev, "get rates failed: 0x%x\n", r); + device_printf(dev, "get rates failed: 0x%x\n", r); /* * Since the supported rates only up to 8 can be supported, * if this is not 802.11b we're just going to be faking it @@ -975,7 +969,7 @@ fail: ndis_halt_nic(sc); DPRINTF(("halting done.\n")); - return(error); + return (error); } static struct ieee80211vap * @@ -1000,7 +994,7 @@ ndis_vap_create(struct ieee80211com *ic, vap->iv_newstate = ndis_newstate; /* complete setup */ - ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status); + ieee80211_vap_attach(vap, ieee80211_media_change, ndis_media_status); ic->ic_opmode = opmode; /* install key handing routines */ vap->iv_key_set = ndis_add_key; @@ -1116,7 +1110,7 @@ ndis_detach(dev) if (sc->ndis_iftype == PCIBus) bus_dma_tag_destroy(sc->ndis_parent_tag); - return(0); + return (0); } int @@ -1134,7 +1128,7 @@ ndis_suspend(dev) ndis_stop(sc); #endif - return(0); + return (0); } int @@ -1150,7 +1144,7 @@ ndis_resume(dev) if (NDIS_INITIALIZED(sc)) ndis_init(sc); - return(0); + return (0); } /* @@ -1160,7 +1154,6 @@ ndis_resume(dev) * serialized miniports, or IRQL <= DISPATCH_LEVEL for deserialized * miniports. */ - static void ndis_rxeof_eth(adapter, ctx, addr, hdr, hdrlen, lookahead, lookaheadlen, pktlen) ndis_handle adapter; @@ -1230,8 +1223,6 @@ ndis_rxeof_eth(adapter, ctx, addr, hdr, hdrlen, lookahead, lookaheadlen, pktlen) if (!NDIS_SERIALIZED(block)) KeReleaseSpinLock(&block->nmb_lock, irql); - - return; } /* @@ -1239,7 +1230,6 @@ ndis_rxeof_eth(adapter, ctx, addr, hdr, hdrlen, lookahead, lookaheadlen, pktlen) * for serialized miniports, or IRQL <= DISPATCH_LEVEL for deserialized * miniports. */ - static void ndis_rxeof_done(adapter) ndis_handle adapter; @@ -1254,8 +1244,6 @@ ndis_rxeof_done(adapter) sc = device_get_softc(block->nmb_physdeviceobj->do_devext); KeInsertQueueDpc(&sc->ndis_rxdpc, NULL, NULL); - - return; } /* @@ -1330,8 +1318,6 @@ ndis_rxeof_xfr(dpc, adapter, sysarg1, sysarg2) } KeReleaseSpinLockFromDpcLevel(&block->nmb_lock); - - return; } /* @@ -1370,8 +1356,6 @@ ndis_rxeof_xfr_done(adapter, packet, status, len) IoQueueWorkItem(sc->ndis_inputitem, (io_workitem_func)ndis_inputtask_wrap, WORKQUEUE_CRITICAL, ifp); - - return; } /* * A frame has been uploaded: pass the resulting mbuf chain up to @@ -1416,7 +1400,6 @@ ndis_rxeof(adapter, packets, pktcnt) * before we're completely ready to handle them. If we detect this, * we need to return them to the miniport and ignore them. */ - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { for (i = 0; i < pktcnt; i++) { p = packets[i]; @@ -1433,7 +1416,7 @@ ndis_rxeof(adapter, packets, pktcnt) /* Stash the softc here so ptom can use it. */ p->np_softc = sc; if (ndis_ptom(&m0, p)) { - device_printf (sc->ndis_dev, "ptom failed\n"); + device_printf(sc->ndis_dev, "ptom failed\n"); if (p->np_oob.npo_status == NDIS_STATUS_SUCCESS) ndis_return_packet(p, block); } else { @@ -1498,8 +1481,6 @@ ndis_rxeof(adapter, packets, pktcnt) WORKQUEUE_CRITICAL, ifp); } } - - return; } /* @@ -1508,7 +1489,6 @@ ndis_rxeof(adapter, packets, pktcnt) * with any locks held (at DISPATCH_LEVEL, we'll be holding the * 'dispatch level' per-cpu sleep lock). */ - static void ndis_inputtask(dobj, arg) device_object *dobj; @@ -1534,15 +1514,13 @@ ndis_inputtask(dobj, arg) if (m == NULL) break; KeReleaseSpinLock(&sc->ndis_rxlock, irql); - if (sc->ndis_80211) + if ((sc->ndis_80211 != 0) && (vap != NULL)) vap->iv_deliver_data(vap, vap->iv_bss, m); else (*ifp->if_input)(ifp, m); KeAcquireSpinLock(&sc->ndis_rxlock, &irql); } KeReleaseSpinLock(&sc->ndis_rxlock, irql); - - return; } /* @@ -1591,8 +1569,6 @@ ndis_txeof(adapter, packet, status) IoQueueWorkItem(sc->ndis_startitem, (io_workitem_func)ndis_starttask_wrap, WORKQUEUE_CRITICAL, ifp); - - return; } static void @@ -1633,8 +1609,6 @@ ndis_linksts(adapter, status, sbuf, slen) sc->ndis_evt[sc->ndis_evtpidx].ne_len = slen; NDIS_EVTINC(sc->ndis_evtpidx); NDIS_UNLOCK(sc); - - return; } static void @@ -1674,8 +1648,6 @@ ndis_linksts_done(adapter) /* Notify possible listners of interface change. */ rt_ifmsg(ifp); - - return; } static void @@ -1746,7 +1718,7 @@ ndis_ticktask(d, xsc) sc->ndis_sts == NDIS_STATUS_MEDIA_CONNECT) { sc->ndis_link = 1; NDIS_UNLOCK(sc); - if (sc->ndis_80211) { + if ((sc->ndis_80211 != 0) && (vap != NULL)) { ndis_getstate_80211(sc); ieee80211_new_state(vap, IEEE80211_S_RUN, -1); } @@ -1758,15 +1730,13 @@ ndis_ticktask(d, xsc) sc->ndis_sts == NDIS_STATUS_MEDIA_DISCONNECT) { sc->ndis_link = 0; NDIS_UNLOCK(sc); - if (sc->ndis_80211) + if ((sc->ndis_80211 != 0) && (vap != NULL)) ieee80211_new_state(vap, IEEE80211_S_SCAN, 0); NDIS_LOCK(sc); if_link_state_change(sc->ifp, LINK_STATE_DOWN); } NDIS_UNLOCK(sc); - - return; } static void @@ -1792,8 +1762,6 @@ ndis_map_sclist(arg, segs, nseg, mapsize, error) sclist->nsl_elements[i].nse_addr.np_quad = segs[i].ds_addr; sclist->nsl_elements[i].nse_len = segs[i].ds_len; } - - return; } static int @@ -1803,7 +1771,7 @@ ndis_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, /* no support; just discard */ m_freem(m); ieee80211_free_node(ni); - return 0; + return (0); } static void @@ -1831,7 +1799,6 @@ ndis_starttask(d, arg) if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) ndis_start(ifp); - return; } /* @@ -1846,7 +1813,6 @@ ndis_starttask(d, arg) * we need to perform busdma work here. Those that use map registers * will do the mapping themselves on a buffer by buffer basis. */ - static void ndis_start(ifp) struct ifnet *ifp; @@ -1860,7 +1826,6 @@ ndis_start(ifp) sc = ifp->if_softc; NDIS_LOCK(sc); - if (!sc->ndis_link || ifp->if_drv_flags & IFF_DRV_OACTIVE) { NDIS_UNLOCK(sc); return; @@ -1933,7 +1898,6 @@ ndis_start(ifp) * If there's a BPF listener, bounce a copy of this frame * to him. */ - if (!sc->ndis_80211) /* XXX handle 80211 */ BPF_MTAP(ifp, m); @@ -1944,7 +1908,6 @@ ndis_start(ifp) * so the this batch of packets can be transmitted, then * wait for txeof to ask us to send the rest. */ - if (sc->ndis_txidx == 0) break; } @@ -1970,7 +1933,6 @@ ndis_start(ifp) * a MiniportSend() routine (which sends just a single * packet). */ - if (sc->ndis_chars->nmc_sendmulti_func != NULL) ndis_send_packets(sc, p0, pcnt); else @@ -2029,12 +1991,11 @@ ndis_init(xsc) &sc->ndis_filter, &len); if (error) - device_printf (sc->ndis_dev, "set filter failed: %d\n", error); + device_printf(sc->ndis_dev, "set filter failed: %d\n", error); /* * Set lookahead. */ - i = ifp->if_mtu; len = sizeof(i); ndis_set_info(sc, OID_GEN_CURRENT_LOOKAHEAD, &i, &len); @@ -2047,9 +2008,6 @@ ndis_init(xsc) /* Setup task offload. */ ndis_set_offload(sc); - if (sc->ndis_80211) - ndis_setstate_80211(sc); - NDIS_LOCK(sc); sc->ndis_txidx = 0; @@ -2094,7 +2052,7 @@ ndis_ifmedia_upd(ifp) if (NDIS_INITIALIZED(sc)) ndis_init(sc); - return(0); + return (0); } /* @@ -2108,7 +2066,7 @@ ndis_ifmedia_sts(ifp, ifmr) struct ndis_softc *sc; uint32_t media_info; ndis_media_state linkstate; - int error, len; + int len; ifmr->ifm_status = IFM_AVALID; ifmr->ifm_active = IFM_ETHER; @@ -2118,17 +2076,17 @@ ndis_ifmedia_sts(ifp, ifmr) return; len = sizeof(linkstate); - error = ndis_get_info(sc, OID_GEN_MEDIA_CONNECT_STATUS, + ndis_get_info(sc, OID_GEN_MEDIA_CONNECT_STATUS, (void *)&linkstate, &len); len = sizeof(media_info); - error = ndis_get_info(sc, OID_GEN_LINK_SPEED, + ndis_get_info(sc, OID_GEN_LINK_SPEED, (void *)&media_info, &len); if (linkstate == nmc_connected) ifmr->ifm_status |= IFM_ACTIVE; - switch(media_info) { + switch (media_info) { case 100000: ifmr->ifm_active |= IFM_10_T; break; @@ -2142,8 +2100,6 @@ ndis_ifmedia_sts(ifp, ifmr) device_printf(sc->ndis_dev, "unknown speed: %d\n", media_info); break; } - - return; } static int @@ -2161,19 +2117,19 @@ ndis_set_cipher(sc, cipher) if (cipher == WPA_CSE_WEP40 || WPA_CSE_WEP104) { if (!(ic->ic_cryptocaps & IEEE80211_CRYPTO_WEP)) - return(ENOTSUP); + return (ENOTSUP); arg = NDIS_80211_WEPSTAT_ENC1ENABLED; } if (cipher == WPA_CSE_TKIP) { if (!(ic->ic_cryptocaps & IEEE80211_CRYPTO_TKIP)) - return(ENOTSUP); + return (ENOTSUP); arg = NDIS_80211_WEPSTAT_ENC2ENABLED; } if (cipher == WPA_CSE_CCMP) { if (!(ic->ic_cryptocaps & IEEE80211_CRYPTO_AES_CCM)) - return(ENOTSUP); + return (ENOTSUP); arg = NDIS_80211_WEPSTAT_ENC3ENABLED; } @@ -2182,7 +2138,7 @@ ndis_set_cipher(sc, cipher) rval = ndis_set_info(sc, OID_802_11_ENCRYPTION_STATUS, &arg, &len); if (rval) - return(rval); + return (rval); /* Check that the cipher was set correctly. */ @@ -2190,9 +2146,9 @@ ndis_set_cipher(sc, cipher) rval = ndis_get_info(sc, OID_802_11_ENCRYPTION_STATUS, &arg, &len); if (rval != 0 || arg != save) - return(ENODEV); + return (ENODEV); - return(0); + return (0); } /* @@ -2203,7 +2159,6 @@ ndis_set_cipher(sc, cipher) * of the WPA authentication modes isn't enabled, the driver * might not permit the TKIP or AES ciphers to be selected. */ - static int ndis_set_wpa(sc, ie, ielen) struct ndis_softc *sc; @@ -2229,7 +2184,7 @@ ndis_set_wpa(sc, ie, ielen) /* Check for the right kind of IE. */ if (w->wpa_id != IEEE80211_ELEMID_VENDOR) { DPRINTF(("Incorrect IE type %d\n", w->wpa_id)); - return(EINVAL); + return (EINVAL); } /* Skip over the ucast cipher OIDs. */ @@ -2257,7 +2212,7 @@ ndis_set_wpa(sc, ie, ielen) DPRINTF(("Setting WPA auth mode to %d\n", arg)); i = sizeof(arg); if (ndis_set_info(sc, OID_802_11_AUTHENTICATION_MODE, &arg, &i)) - return(ENOTSUP); + return (ENOTSUP); i = sizeof(arg); ndis_get_info(sc, OID_802_11_AUTHENTICATION_MODE, &arg, &i); @@ -2267,7 +2222,7 @@ ndis_set_wpa(sc, ie, ielen) n = (struct ndis_ie *)&w->wpa_mcipher[0]; if (ndis_set_cipher(sc, n->ni_val)) - return(ENOTSUP); + return (ENOTSUP); /* Now start looking around for the unicast ciphers. */ pos = (char *)&w->wpa_uciphers[0]; @@ -2275,11 +2230,28 @@ ndis_set_wpa(sc, ie, ielen) for (i = 0; i < w->wpa_uciphercnt; i++) { if (ndis_set_cipher(sc, n->ni_val)) - return(ENOTSUP); + return (ENOTSUP); n++; } - return(0); + return (0); +} + +static void +ndis_media_status(struct ifnet *ifp, struct ifmediareq *imr) +{ + struct ieee80211vap *vap = ifp->if_softc; + struct ndis_softc *sc = vap->iv_ic->ic_ifp->if_softc; + uint32_t txrate; + int len; + + if (!NDIS_INITIALIZED(sc)) + return; + + len = sizeof(txrate); + if (ndis_get_info(sc, OID_GEN_LINK_SPEED, &txrate, &len) == 0) + vap->iv_bss->ni_txrate = txrate / 5000; + ieee80211_media_status(ifp, imr); } static void @@ -2297,8 +2269,6 @@ ndis_setstate_80211(sc) ifp = sc->ifp; ic = ifp->if_l2com; vap = TAILQ_FIRST(&ic->ic_vaps); - if (vap == NULL) - return; if (!NDIS_INITIALIZED(sc)) { DPRINTF(("%s: NDIS not initialized\n", __func__)); @@ -2306,7 +2276,6 @@ ndis_setstate_80211(sc) } /* Disassociate and turn off radio. */ - len = sizeof(arg); arg = 1; ndis_set_info(sc, OID_802_11_DISASSOCIATE, &arg, &len); @@ -2325,7 +2294,6 @@ ndis_setstate_80211(sc) device_printf (sc->ndis_dev, "set infra failed: %d\n", rval); /* Set power management */ - len = sizeof(arg); if (vap->iv_flags & IEEE80211_F_PMGTON) arg = NDIS_80211_POWERMODE_FAST_PSP; @@ -2345,7 +2313,6 @@ ndis_setstate_80211(sc) * Default encryption mode to off, authentication * to open and privacy to 'accept everything.' */ - len = sizeof(arg); arg = NDIS_80211_WEPSTAT_DISABLED; ndis_set_info(sc, OID_802_11_ENCRYPTION_STATUS, &arg, &len); @@ -2355,7 +2322,7 @@ ndis_setstate_80211(sc) ndis_set_info(sc, OID_802_11_AUTHENTICATION_MODE, &arg, &len); /* - * Note that OID_80211_PRIVACY_FILTER is optional: + * Note that OID_802_11_PRIVACY_FILTER is optional: * not all drivers implement it. */ len = sizeof(arg); @@ -2412,7 +2379,6 @@ ndis_setstate_80211(sc) if (rval) device_printf(sc->ndis_dev, "setting BSSID failed: %d\n", rval); - } static void @@ -2470,7 +2436,7 @@ ndis_auth_and_assoc(sc, vap) if (vap->iv_flags & IEEE80211_F_PRIVACY && !(vap->iv_flags & IEEE80211_F_WPA)) { - int keys_set = 0; + int keys_set = 0; if (ni->ni_authmode == IEEE80211_AUTH_SHARED) { len = sizeof(arg); @@ -2489,9 +2455,9 @@ ndis_auth_and_assoc(sc, vap) /* * 5, 13 and 16 are the only valid - * only valid key lengths. Anything - * in between will be zero padded out to - * the next highest boundary. + * key lengths. Anything in between + * will be zero padded out to the + * next highest boundary. */ if (vap->iv_nw_keys[i].wk_keylen < 5) wep.nw_keylen = 5; @@ -2574,7 +2540,7 @@ ndis_auth_and_assoc(sc, vap) rval = ndis_set_info(sc, OID_802_11_NETWORK_TYPE_IN_USE, &arg, &len); if (rval) - device_printf (sc->ndis_dev, + device_printf(sc->ndis_dev, "set nettype failed: %d\n", rval); } #endif @@ -2677,13 +2643,13 @@ ndis_get_assoc(sc, assoc) int i, len, error; if (!sc->ndis_link) - return(ENOENT); + return (ENOENT); len = sizeof(bssid); error = ndis_get_info(sc, OID_802_11_BSSID, &bssid, &len); if (error) { device_printf(sc->ndis_dev, "failed to get bssid\n"); - return(ENOENT); + return (ENOENT); } vap = TAILQ_FIRST(&ic->ic_vaps); @@ -2699,19 +2665,19 @@ ndis_get_assoc(sc, assoc) *assoc = malloc(bs->nwbx_len, M_TEMP, M_NOWAIT); if (*assoc == NULL) { free(bl, M_TEMP); - return(ENOMEM); + return (ENOMEM); } bcopy((char *)bs, (char *)*assoc, bs->nwbx_len); free(bl, M_TEMP); if (ic->ic_opmode == IEEE80211_M_STA) ni->ni_associd = 1 | 0xc000; /* fake associd */ - return(0); + return (0); } bs = (ndis_wlan_bssid_ex *)((char *)bs + bs->nwbx_len); } free(bl, M_TEMP); - return(ENOENT); + return (ENOENT); } static void @@ -2730,8 +2696,6 @@ ndis_getstate_80211(sc) ifp = sc->ifp; ic = ifp->if_l2com; vap = TAILQ_FIRST(&ic->ic_vaps); - if (vap == NULL) - return; ni = vap->iv_bss; if (!NDIS_INITIALIZED(sc)) @@ -2750,13 +2714,6 @@ ndis_getstate_80211(sc) bs->nwbx_ssid.ns_ssidlen); ni->ni_esslen = bs->nwbx_ssid.ns_ssidlen; - len = sizeof(arg); - rval = ndis_get_info(sc, OID_GEN_LINK_SPEED, &arg, &len); - if (rval) - device_printf (sc->ndis_dev, "get link speed failed: %d\n", - rval); - ni->ni_txrate = arg / 5000; - if (ic->ic_caps & IEEE80211_C_PMGT) { len = sizeof(arg); rval = ndis_get_info(sc, OID_802_11_POWER_MODE, &arg, &len); @@ -2794,18 +2751,16 @@ ndis_getstate_80211(sc) free(bs, M_TEMP); /* - * Determine current authentication mode. Note: authmode - * reporting isn't supported prior to FreeBSD 6.x. + * Determine current authentication mode. */ - len = sizeof(arg); rval = ndis_get_info(sc, OID_802_11_AUTHENTICATION_MODE, &arg, &len); if (rval) - device_printf (sc->ndis_dev, + device_printf(sc->ndis_dev, "get authmode status failed: %d\n", rval); else { vap->iv_flags &= ~IEEE80211_F_WPA; - switch(arg) { + switch (arg) { case NDIS_80211_AUTHMODE_OPEN: ni->ni_authmode = IEEE80211_AUTH_OPEN; break; @@ -2836,14 +2791,13 @@ ndis_getstate_80211(sc) rval = ndis_get_info(sc, OID_802_11_WEP_STATUS, &arg, &len); if (rval) - device_printf (sc->ndis_dev, + device_printf(sc->ndis_dev, "get wep status failed: %d\n", rval); if (arg == NDIS_80211_WEPSTAT_ENABLED) vap->iv_flags |= IEEE80211_F_PRIVACY|IEEE80211_F_DROPUNENC; else vap->iv_flags &= ~(IEEE80211_F_PRIVACY|IEEE80211_F_DROPUNENC); - return; } static int @@ -2858,7 +2812,7 @@ ndis_ioctl(ifp, command, data) /*NDIS_LOCK(sc);*/ - switch(command) { + switch (command) { case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { if (ifp->if_drv_flags & IFF_DRV_RUNNING && @@ -2929,7 +2883,7 @@ ndis_ioctl_80211(ifp, command, data) void *oidbuf; int error = 0; - switch(command) { + switch (command) { case SIOCSIFFLAGS: /*NDIS_LOCK(sc);*/ if (ifp->if_flags & IFF_UP) { @@ -3052,7 +3006,7 @@ ndis_ioctl_80211(ifp, command, data) error = EINVAL; break; } - return(error); + return (error); } int @@ -3078,9 +3032,9 @@ ndis_del_key(vap, key) error = ndis_set_info(sc, OID_802_11_REMOVE_KEY, &rkey, &len); if (error) - return(0); + return (0); - return(1); + return (1); } /* @@ -3088,7 +3042,6 @@ ndis_del_key(vap, key) * only use it for WPA TKIP or AES keys. These need to be * set after initial authentication with the AP. */ - static int ndis_add_key(vap, key, mac) struct ieee80211vap *vap; @@ -3166,7 +3119,7 @@ ndis_add_key(vap, key, mac) /* We need to return 1 for success, 0 for failure. */ if (error) - return(0); + return (0); return (1); } @@ -3180,7 +3133,6 @@ ndis_resettask(d, arg) sc = arg; ndis_reset_nic(sc); - return; } /* @@ -3221,8 +3173,6 @@ ndis_stop(sc) sc->ndis_evtcidx = 0; sc->ndis_evtpidx = 0; NDIS_UNLOCK(sc); - - return; } /* @@ -3237,8 +3187,6 @@ ndis_shutdown(dev) sc = device_get_softc(dev); ndis_stop(sc); - - return; } static int @@ -3285,14 +3233,8 @@ ndis_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) static void ndis_scan(void *arg) { - struct ndis_softc *sc = arg; - struct ieee80211com *ic; - struct ieee80211vap *vap; + struct ieee80211vap *vap = arg; - ic = sc->ifp->if_l2com; - vap = TAILQ_FIRST(&ic->ic_vaps); - - ndis_scan_results(sc); ieee80211_scan_done(vap); } @@ -3368,24 +3310,11 @@ ndis_scan_results(struct ndis_softc *sc) efrm = frm + wb->nwbx_ielen; if (efrm - frm < 12) goto done; - sp.tstamp = frm; - frm += 8; - sp.bintval = le16toh(*(uint16_t *)frm); - frm += 2; - sp.capinfo = le16toh(*(uint16_t *)frm); - frm += 2; - - /* Grab variable length ies */ - while (efrm - frm > 1) { - if (efrm - frm < frm[1] + 2) - break; - switch (*frm) { - case IEEE80211_ELEMID_RSN: - sp.rsn = frm; - break; - } - frm += frm[1] + 2; - } + sp.tstamp = frm; frm += 8; + sp.bintval = le16toh(*(uint16_t *)frm); frm += 2; + sp.capinfo = le16toh(*(uint16_t *)frm); frm += 2; + sp.ies = frm; + sp.ies_len = efrm - frm; } done: DPRINTF(("scan: bssid %s chan %dMHz (%d/%d) rssi %d\n", @@ -3433,15 +3362,14 @@ ndis_scan_start(struct ieee80211com *ic) DPRINTF(("%s: set ESSID failed\n", __func__)); len = 0; - error = ndis_set_info(sc, OID_802_11_BSSID_LIST_SCAN, - NULL, &len); + error = ndis_set_info(sc, OID_802_11_BSSID_LIST_SCAN, NULL, &len); if (error) { DPRINTF(("%s: scan command failed\n", __func__)); ieee80211_cancel_scan(vap); return; } /* Set a timer to collect the results */ - callout_reset(&sc->ndis_scan_callout, hz * 3, ndis_scan, sc); + callout_reset(&sc->ndis_scan_callout, hz * 3, ndis_scan, vap); } static void @@ -3465,6 +3393,7 @@ ndis_scan_mindwell(struct ieee80211_scan_state *ss) static void ndis_scan_end(struct ieee80211com *ic) { - /* ignore */ -} + struct ndis_softc *sc = ic->ic_ifp->if_softc; + ndis_scan_results(sc); +} diff --git a/sys/dev/if_ndis/if_ndis_usb.c b/sys/dev/if_ndis/if_ndis_usb.c index be03919cc8ab..b872f9ac52ac 100644 --- a/sys/dev/if_ndis/if_ndis_usb.c +++ b/sys/dev/if_ndis/if_ndis_usb.c @@ -165,6 +165,7 @@ ndisusb_attach(device_t self) driver_object *drv; int devidx = 0; + device_set_usb_desc(self); db = uaa->driver_ivar; sc = (struct ndis_softc *)dummy; sc->ndis_dev = self; @@ -194,9 +195,9 @@ ndisusb_attach(device_t self) } if (ndis_attach(self) != 0) - return ENXIO; + return (ENXIO); - return 0; + return (0); } static int @@ -204,7 +205,7 @@ ndisusb_detach(device_t self) { int i; struct ndis_softc *sc = device_get_softc(self); - struct ndisusb_ep *ne;; + struct ndisusb_ep *ne; sc->ndisusb_status |= NDISUSB_STATUS_DETACH; diff --git a/sys/dev/iir/iir.c b/sys/dev/iir/iir.c index f5f6d7e667f0..b0915c2000bf 100644 --- a/sys/dev/iir/iir.c +++ b/sys/dev/iir/iir.c @@ -153,7 +153,6 @@ static void iir_action(struct cam_sim *sim, union ccb *ccb); static void iir_poll(struct cam_sim *sim); static void iir_shutdown(void *arg, int howto); static void iir_timeout(void *arg); -static void iir_watchdog(void *arg); static void gdt_eval_mapping(u_int32_t size, int *cyls, int *heads, int *secs); @@ -1484,40 +1483,6 @@ iir_timeout(void *arg) GDT_DPRINTF(GDT_D_TIMEOUT, ("iir_timeout(%p)\n", gccb)); } -static void -iir_watchdog(void *arg) -{ - struct gdt_softc *gdt; - - gdt = (struct gdt_softc *)arg; - GDT_DPRINTF(GDT_D_DEBUG, ("iir_watchdog(%p)\n", gdt)); - - { - int ccbs = 0, ucmds = 0, frees = 0, pends = 0; - struct gdt_ccb *p; - struct ccb_hdr *h; - struct gdt_ucmd *u; - - for (h = TAILQ_FIRST(&gdt->sc_ccb_queue); h != NULL; - h = TAILQ_NEXT(h, sim_links.tqe)) - ccbs++; - for (u = TAILQ_FIRST(&gdt->sc_ucmd_queue); u != NULL; - u = TAILQ_NEXT(u, links)) - ucmds++; - for (p = SLIST_FIRST(&gdt->sc_free_gccb); p != NULL; - p = SLIST_NEXT(p, sle)) - frees++; - for (p = SLIST_FIRST(&gdt->sc_pending_gccb); p != NULL; - p = SLIST_NEXT(p, sle)) - pends++; - - GDT_DPRINTF(GDT_D_TIMEOUT, ("ccbs %d ucmds %d frees %d pends %d\n", - ccbs, ucmds, frees, pends)); - } - - timeout(iir_watchdog, (caddr_t)gdt, hz * 15); -} - static void iir_shutdown( void *arg, int howto ) { diff --git a/sys/dev/iir/iir_ctrl.c b/sys/dev/iir/iir_ctrl.c index 51ef0434a486..5f9f3d597ce6 100644 --- a/sys/dev/iir/iir_ctrl.c +++ b/sys/dev/iir/iir_ctrl.c @@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -83,8 +84,6 @@ static int iir_devsw_installed = 0; static int sdev_made = 0; #endif extern int gdt_cnt; -extern char ostype[]; -extern char osrelease[]; extern gdt_statist_t gdt_stat; /* diff --git a/sys/dev/iir/iir_pci.c b/sys/dev/iir/iir_pci.c index c75f084b796e..19d09c619fd8 100644 --- a/sys/dev/iir/iir_pci.c +++ b/sys/dev/iir/iir_pci.c @@ -29,7 +29,6 @@ * SUCH DAMAGE. */ -#ident "$Id: iir_pci.c 1.2 2003/08/26 12:29:55 achim Exp $" #include __FBSDID("$FreeBSD$"); diff --git a/sys/dev/io/iodev.c b/sys/dev/io/iodev.c index 8c2cebdf364a..b142a39c6107 100644 --- a/sys/dev/io/iodev.c +++ b/sys/dev/io/iodev.c @@ -41,8 +41,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include - #include #include @@ -54,6 +52,7 @@ static struct cdevsw io_cdevsw = { .d_version = D_VERSION, .d_open = ioopen, .d_close = ioclose, + .d_ioctl = ioioctl, .d_name = "io", }; diff --git a/sys/dev/ipmi/ipmi.c b/sys/dev/ipmi/ipmi.c index 8e53d01f388a..da024fc767cd 100644 --- a/sys/dev/ipmi/ipmi.c +++ b/sys/dev/ipmi/ipmi.c @@ -588,12 +588,15 @@ ipmi_polled_enqueue_request(struct ipmi_softc *sc, struct ipmi_request *req) * Watchdog event handler. */ -static void -ipmi_set_watchdog(struct ipmi_softc *sc, int sec) +static int +ipmi_set_watchdog(struct ipmi_softc *sc, unsigned int sec) { struct ipmi_request *req; int error; + if (sec > 0xffff / 10) + return (EINVAL); + req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0), IPMI_SET_WDOG, 6, 0); @@ -604,7 +607,7 @@ ipmi_set_watchdog(struct ipmi_softc *sc, int sec) req->ir_request[2] = 0; req->ir_request[3] = 0; /* Timer use */ req->ir_request[4] = (sec * 10) & 0xff; - req->ir_request[5] = (sec * 10) / 2550; + req->ir_request[5] = (sec * 10) >> 8; } else { req->ir_request[0] = IPMI_SET_WD_TIMER_SMS_OS; req->ir_request[1] = 0; @@ -617,8 +620,7 @@ ipmi_set_watchdog(struct ipmi_softc *sc, int sec) error = ipmi_submit_driver_request(sc, req, 0); if (error) device_printf(sc->ipmi_dev, "Failed to set watchdog\n"); - - if (error == 0 && sec) { + else if (sec) { ipmi_free_request(req); req = ipmi_alloc_driver_request(IPMI_ADDR(IPMI_APP_REQUEST, 0), @@ -631,6 +633,7 @@ ipmi_set_watchdog(struct ipmi_softc *sc, int sec) } ipmi_free_request(req); + return (error); /* dump_watchdog(sc); */ @@ -641,14 +644,22 @@ ipmi_wd_event(void *arg, unsigned int cmd, int *error) { struct ipmi_softc *sc = arg; unsigned int timeout; + int e; cmd &= WD_INTERVAL; if (cmd > 0 && cmd <= 63) { - timeout = ((uint64_t)1 << cmd) / 1800000000; - ipmi_set_watchdog(sc, timeout); - *error = 0; + timeout = ((uint64_t)1 << cmd) / 1000000000; + if (timeout == 0) + timeout = 1; + e = ipmi_set_watchdog(sc, timeout); + if (e == 0) + *error = 0; + else + (void)ipmi_set_watchdog(sc, 0); } else { - ipmi_set_watchdog(sc, 0); + e = ipmi_set_watchdog(sc, 0); + if (e != 0 && cmd == 0) + *error = EOPNOTSUPP; } } diff --git a/sys/dev/ips/ips_disk.c b/sys/dev/ips/ips_disk.c index 9e2fd5c25352..12bdacd63115 100644 --- a/sys/dev/ips/ips_disk.c +++ b/sys/dev/ips/ips_disk.c @@ -192,10 +192,10 @@ ipsd_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset, dp = arg; dsc = dp->d_drv1; - sc = dsc->sc; if (dsc == NULL) return (EINVAL); + sc = dsc->sc; if (ips_get_free_cmd(sc, &command, 0) != 0) { printf("ipsd: failed to get cmd for dump\n"); diff --git a/sys/dev/ips/ips_pci.c b/sys/dev/ips/ips_pci.c index 9ccaf373b3e2..9781087891d1 100644 --- a/sys/dev/ips/ips_pci.c +++ b/sys/dev/ips/ips_pci.c @@ -154,7 +154,7 @@ static int ips_pci_attach(device_t dev) } sc->ips_ich.ich_func = ips_intrhook; sc->ips_ich.ich_arg = sc; - mtx_init(&sc->queue_mtx, "IPS bioqueue lock", MTX_DEF, 0); + mtx_init(&sc->queue_mtx, "IPS bioqueue lock", NULL, MTX_DEF); sema_init(&sc->cmd_sema, 0, "IPS Command Semaphore"); bioq_init(&sc->queue); if (config_intrhook_establish(&sc->ips_ich) != 0) { diff --git a/sys/dev/iscsi/initiator/isc_sm.c b/sys/dev/iscsi/initiator/isc_sm.c index 3f4f377b95a5..ec9d34695af1 100644 --- a/sys/dev/iscsi/initiator/isc_sm.c +++ b/sys/dev/iscsi/initiator/isc_sm.c @@ -399,7 +399,7 @@ ism_recv(isc_session_t *sp, pduq_t *pq) if(sp->flags & ISC_STALLED) { sdebug(4, "window opened: max=0x%x exp=0x%x opcode=0x%x cmd=0x%x cws=%d.", sn->maxCmd, sn->expCmd, bhs->opcode, sn->cmd, sp->cws); - sp->flags &= ~ISC_STALLED;; + sp->flags &= ~ISC_STALLED; } } } diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index d13e208b1825..65e5d8649867 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -108,10 +108,11 @@ static const uint8_t alpa_map[] = { * Local function prototypes. */ static int isp_parse_async(ispsoftc_t *, uint16_t); +static int isp_parse_async_fc(ispsoftc_t *, uint16_t); static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *); static void isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *, long *); static void isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *, long *); -static void isp_fastpost_complete(ispsoftc_t *, uint16_t); +static void isp_fastpost_complete(ispsoftc_t *, uint32_t); static int isp_mbox_continue(ispsoftc_t *); static void isp_scsi_init(ispsoftc_t *); static void isp_scsi_channel_init(ispsoftc_t *, int); @@ -694,7 +695,7 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults) mbs.logval = MBLOGALL; isp_mboxcmd(isp, &mbs); if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { - isp_prt(isp, ISP_LOGERR, "NOP ommand failed (%x)", mbs.param[0]); + isp_prt(isp, ISP_LOGERR, "NOP command failed (%x)", mbs.param[0]); ISP_RESET0(isp); return; } @@ -1334,23 +1335,24 @@ isp_scsi_init(ispsoftc_t *isp) } /* - * Turn on Fast Posting, LVD transitions + * Turn on LVD transitions for ULTRA2 or better and other features * - * Ultra2 F/W always has had fast posting (and LVD transitions) - * - * Ultra and older (i.e., SBus) cards may not. It's just safer - * to assume not for them. + * Now that we have 32 bit handles, don't do any fast posting + * any more. For Ultra2/Ultra3 cards, we can turn on 32 bit RIO + * operation or use fast posting. To be conservative, we'll only + * do this for Ultra3 cards now because the other cards are so + * rare for this author to find and test with. */ MBSINIT(&mbs, MBOX_SET_FW_FEATURES, MBLOGALL, 0); if (IS_ULTRA2(isp)) mbs.param[1] |= FW_FEATURE_LVD_NOTIFY; -#ifndef ISP_NO_RIO - if (IS_ULTRA2(isp) || IS_1240(isp)) - mbs.param[1] |= FW_FEATURE_RIO_16BIT; -#else - if (IS_ULTRA2(isp) || IS_1240(isp)) +#ifdef ISP_NO_RIO + if (IS_ULTRA3(isp)) mbs.param[1] |= FW_FEATURE_FAST_POST; +#else + if (IS_ULTRA3(isp)) + mbs.param[1] |= FW_FEATURE_RIO_32BIT; #endif if (mbs.param[1] != 0) { uint16_t sfeat = mbs.param[1]; @@ -1604,25 +1606,15 @@ isp_fibre_init(ispsoftc_t *isp) } if (IS_2200(isp)) { /* - * There seems to just be too much breakage here - * with RIO and Fast Posting- it probably actually - * works okay but this driver is messing it up. - * This card is really ancient by now, so let's - * just opt for safety and not use the feature. + * We can't have Fast Posting any more- we now + * have 32 bit handles. + * + * RIO seemed to have to much breakage. + * + * Just opt for safety. */ -#if 0 - if (ISP_FW_NEWER_THAN(isp, 1, 17, 0)) { - icbp->icb_xfwoptions |= ICBXOPT_RIO_16BIT; - icbp->icb_fwoptions &= ~ICBOPT_FAST_POST; - icbp->icb_racctimer = 4; - icbp->icb_idelaytimer = 8; - } else { - icbp->icb_fwoptions |= ICBOPT_FAST_POST; - } -#else icbp->icb_xfwoptions &= ~ICBXOPT_RIO_16BIT; icbp->icb_fwoptions &= ~ICBOPT_FAST_POST; -#endif } else { /* * QLogic recommends that FAST Posting be turned @@ -2182,9 +2174,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags msg = "no Exchange Control Block"; break; case PLOGX_IOCBERR_FAILED: - ISP_SNPRINTF(buf, sizeof (buf), - "reason 0x%x (last LOGIN state 0x%x)", - parm1 & 0xff, (parm1 >> 8) & 0xff); + ISP_SNPRINTF(buf, sizeof (buf), "reason 0x%x (last LOGIN state 0x%x)", parm1 & 0xff, (parm1 >> 8) & 0xff); msg = buf; break; case PLOGX_IOCBERR_NOFABRIC: @@ -2194,8 +2184,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags msg = "firmware not ready"; break; case PLOGX_IOCBERR_NOLOGIN: - ISP_SNPRINTF(buf, sizeof (buf), "not logged in (last state 0x%x)", - parm1); + ISP_SNPRINTF(buf, sizeof (buf), "not logged in (last state 0x%x)", parm1); msg = buf; rval = MBOX_NOT_LOGGED_IN; break; @@ -2207,21 +2196,18 @@ isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags msg = "no PCB allocated"; break; case PLOGX_IOCBERR_EINVAL: - ISP_SNPRINTF(buf, sizeof (buf), "invalid parameter at offset 0x%x", - parm1); + ISP_SNPRINTF(buf, sizeof (buf), "invalid parameter at offset 0x%x", parm1); msg = buf; break; case PLOGX_IOCBERR_PORTUSED: lev = ISP_LOGSANCFG|ISP_LOGDEBUG0; - ISP_SNPRINTF(buf, sizeof (buf), - "already logged in with N-Port handle 0x%x", parm1); + ISP_SNPRINTF(buf, sizeof (buf), "already logged in with N-Port handle 0x%x", parm1); msg = buf; rval = MBOX_PORT_ID_USED | (parm1 << 16); break; case PLOGX_IOCBERR_HNDLUSED: lev = ISP_LOGSANCFG|ISP_LOGDEBUG0; - ISP_SNPRINTF(buf, sizeof (buf), - "handle already used for PortID 0x%06x", parm1); + ISP_SNPRINTF(buf, sizeof (buf), "handle already used for PortID 0x%06x", parm1); msg = buf; rval = MBOX_LOOP_ID_USED; break; @@ -2232,15 +2218,12 @@ isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags msg = "no FLOGI_ACC"; break; default: - ISP_SNPRINTF(buf, sizeof (buf), "status %x from %x", - plp->plogx_status, flags); + ISP_SNPRINTF(buf, sizeof (buf), "status %x from %x", plp->plogx_status, flags); msg = buf; break; } if (msg) { - isp_prt(isp, ISP_LOGERR, - "Chan %d PLOGX PortID 0x%06x to N-Port handle 0x%x: %s", - chan, portid, handle, msg); + isp_prt(isp, ISP_LOGERR, "Chan %d PLOGX PortID 0x%06x to N-Port handle 0x%x: %s", chan, portid, handle, msg); } out: if (gs == 0) { @@ -3901,8 +3884,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan) * Find an unused handle and try and use to login to a port. */ static int -isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, - uint16_t *ohp) +isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, uint16_t *ohp) { int lim, i, r; uint16_t handle; @@ -3922,8 +3904,7 @@ isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, */ r = isp_getpdb(isp, chan, handle, p, 0); if (r == 0 && p->portid != portid) { - (void) isp_plogx(isp, chan, handle, portid, - PLOGX_FLG_CMD_LOGO | PLOGX_FLG_IMPLICIT, 1); + (void) isp_plogx(isp, chan, handle, portid, PLOGX_FLG_CMD_LOGO | PLOGX_FLG_IMPLICIT | PLOGX_FLG_FREE_NPHDL, 1); } else if (r == 0) { break; } @@ -3933,8 +3914,7 @@ isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, /* * Now try and log into the device */ - r = isp_plogx(isp, chan, handle, portid, - PLOGX_FLG_CMD_PLOGI, 1); + r = isp_plogx(isp, chan, handle, portid, PLOGX_FLG_CMD_PLOGI, 1); if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC) { return (-1); } @@ -3942,7 +3922,26 @@ isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, *ohp = handle; break; } else if ((r & 0xffff) == MBOX_PORT_ID_USED) { - handle = r >> 16; + /* + * If we get here, then the firmwware still thinks we're logged into this device, but with a different + * handle. We need to break that association. We used to try and just substitute the handle, but then + * failed to get any data via isp_getpdb (below). + */ + if (isp_plogx(isp, chan, r >> 16, portid, PLOGX_FLG_CMD_LOGO | PLOGX_FLG_IMPLICIT | PLOGX_FLG_FREE_NPHDL, 1)) { + isp_prt(isp, ISP_LOGERR, "baw... logout of %x failed", r >> 16); + } + if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC) { + return (-1); + } + r = isp_plogx(isp, chan, handle, portid, PLOGX_FLG_CMD_PLOGI, 1); + if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC) { + return (-1); + } + if (r == 0) { + *ohp = handle; + } else { + i = lim; + } break; } else if (r != MBOX_LOOP_ID_USED) { i = lim; @@ -3956,8 +3955,7 @@ isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, } if (i == lim) { - isp_prt(isp, ISP_LOGWARN, "Chan %d PLOGI 0x%06x failed", - chan, portid); + isp_prt(isp, ISP_LOGWARN, "Chan %d PLOGI 0x%06x failed", chan, portid); return (-1); } @@ -3971,15 +3969,12 @@ isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, return (-1); } if (r != 0) { - isp_prt(isp, ISP_LOGERR, - "Chan %d new device 0x%06x@0x%x disappeared", - chan, portid, handle); + isp_prt(isp, ISP_LOGERR, "Chan %d new device 0x%06x@0x%x disappeared", chan, portid, handle); return (-1); } if (p->handle != handle || p->portid != portid) { - isp_prt(isp, ISP_LOGERR, - "Chan %d new device 0x%06x@0x%x changed (0x%06x@0x%0x)", + isp_prt(isp, ISP_LOGERR, "Chan %d new device 0x%06x@0x%x changed (0x%06x@0x%0x)", chan, portid, handle, p->portid, p->handle); return (-1); } @@ -4417,7 +4412,7 @@ isp_start(XS_T *xs) *tptr = 0x1999; } - if (isp_save_xs(isp, xs, &handle)) { + if (isp_allocate_xs(isp, xs, &handle)) { isp_prt(isp, ISP_LOGDEBUG0, "out of xflist pointers"); XS_SETERR(xs, HBA_BOTCH); return (CMD_EAGAIN); @@ -4860,7 +4855,7 @@ again: */ if (sema) { fmbox: - if (mbox & 0x4000) { + if (mbox & MBOX_COMMAND_COMPLETE) { isp->isp_intmboxc++; if (isp->isp_mboxbsy) { int obits = isp->isp_obits; @@ -4880,10 +4875,13 @@ again: } else { isp_prt(isp, ISP_LOGWARN, "mailbox cmd (0x%x) with no waiters", mbox); } - } else if (isp_parse_async(isp, mbox) < 0) { - return; + } else { + i = IS_FC(isp)? isp_parse_async_fc(isp, mbox) : isp_parse_async(isp, mbox); + if (i < 0) { + return; + } } - if ((IS_FC(isp) && mbox != ASYNC_RIO_RESP) || isp->isp_state != ISP_RUNSTATE) { + if ((IS_FC(isp) && mbox != ASYNC_RIOZIO_STALL) || isp->isp_state != ISP_RUNSTATE) { goto out; } } @@ -5065,9 +5063,9 @@ again: req_status_flags = sp->req_status_flags; req_state_flags = sp->req_state_flags; resid = sp->req_resid; - } else if (etype == RQSTYPE_RIO2) { - isp_rio2_t *rio = (isp_rio2_t *)qe; - isp_get_rio2(isp, (isp_rio2_t *) hp, rio); + } else if (etype == RQSTYPE_RIO1) { + isp_rio1_t *rio = (isp_rio1_t *) qe; + isp_get_rio1(isp, (isp_rio1_t *) hp, rio); if (isp->isp_dblev & ISP_LOGDEBUG1) { isp_print_bytes(isp, "Response Queue Entry", QENTRY_LEN, rio); } @@ -5079,6 +5077,10 @@ again: } ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */ continue; + } else if (etype == RQSTYPE_RIO2) { + isp_prt(isp, ISP_LOGERR, "dropping RIO2 response\n"); + ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */ + continue; } else { /* * Somebody reachable via isp_handle_other_response @@ -5163,8 +5165,8 @@ again: } } - if ((sp->req_handle != ISP_SPCL_HANDLE) && (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1)) { - isp_prt(isp, ISP_LOGERR, "bad request handle %d (type 0x%x)", sp->req_handle, etype); + if (!ISP_VALID_HANDLE(isp, sp->req_handle)) { + isp_prt(isp, ISP_LOGERR, "bad request handle 0x%x (iocb type 0x%x)", sp->req_handle, etype); ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */ ISP_WRITE(isp, isp->isp_respoutrp, optr); continue; @@ -5178,14 +5180,13 @@ again: */ if (etype != RQSTYPE_RESPONSE) { isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (type 0x%x)", sp->req_handle, etype); - } else if (ts != RQCS_ABORTED && ts != RQCS_RESET_OCCURRED && sp->req_handle != ISP_SPCL_HANDLE) { + } else if (ts != RQCS_ABORTED && ts != RQCS_RESET_OCCURRED) { isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (status 0x%x)", sp->req_handle, ts); } ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */ ISP_WRITE(isp, isp->isp_respoutrp, optr); continue; } - isp_destroy_handle(isp, sp->req_handle); if (req_status_flags & RQSTF_BUS_RESET) { XS_SETERR(xs, HBA_BUSRESET); ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 1); @@ -5321,6 +5322,7 @@ again: if (XS_XFRLEN(xs)) { ISP_DMAFREE(isp, xs, sp->req_handle); } + isp_destroy_handle(isp, sp->req_handle); if (((isp->isp_dblev & (ISP_LOGDEBUG1|ISP_LOGDEBUG2|ISP_LOGDEBUG3))) || ((isp->isp_dblev & ISP_LOGDEBUG0) && ((!XS_NOERR(xs)) || @@ -5391,40 +5393,35 @@ out: * Support routines. */ -#define GET_24XX_BUS(isp, chan, msg) \ - if (IS_24XX(isp)) { \ - chan = ISP_READ(isp, OUTMAILBOX3) & 0xff; \ - if (chan >= isp->isp_nchan) { \ - isp_prt(isp, ISP_LOGERR, "bogus channel %u for %s at line %d", chan, msg, __LINE__); \ - break; \ - } \ - } - +/* + * Parse an ASYNC mailbox complete + * + * Return non-zero if the event has been acknowledged. + */ static int isp_parse_async(ispsoftc_t *isp, uint16_t mbox) { - int rval = 0; - int pattern = 0; - uint16_t chan; + int acked = 0; + uint32_t h1 = 0, h2 = 0; + uint16_t chan = 0; - if (IS_DUALBUS(isp)) { - chan = ISP_READ(isp, OUTMAILBOX6); - } else { - chan = 0; + /* + * Pick up the channel, but not if this is a ASYNC_RIO32_2, + * where Mailboxes 6/7 have the second handle. + */ + if (mbox != ASYNC_RIO32_2) { + if (IS_DUALBUS(isp)) { + chan = ISP_READ(isp, OUTMAILBOX6); + } } isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox); switch (mbox) { case ASYNC_BUS_RESET: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_BUS_RESET for FC card"); - break; - } ISP_SET_SENDMARKER(isp, chan, 1); #ifdef ISP_TARGET_MODE if (isp_target_async(isp, chan, mbox)) { - rval = -1; + acked = 1; } #endif isp_async(isp, ISPASYNC_BUS_RESET, chan); @@ -5432,10 +5429,6 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) case ASYNC_SYSTEM_ERROR: isp->isp_dead = 1; isp->isp_state = ISP_CRASHED; - if (IS_FC(isp)) { - FCPARAM(isp, chan)->isp_loopstate = LOOP_NIL; - FCPARAM(isp, chan)->isp_fwstate = FW_CONFIG_WAIT; - } /* * Were we waiting for a mailbox command to complete? * If so, it's dead, so wake up the waiter. @@ -5450,7 +5443,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) * restart the firmware */ isp_async(isp, ISPASYNC_FW_CRASH); - rval = -1; + acked = 1; break; case ASYNC_RQS_XFER_ERR: @@ -5462,17 +5455,6 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) break; case ASYNC_QWAKEUP: -#ifdef ISP_TARGET_MODE - if (IS_24XX(isp)) { - isp_prt(isp, ISP_LOGERR, "ATIO Queue Transfer Error"); - break; - } -#endif - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_QWAKEUP for FC card"); - break; - } /* * We've just been notified that the Queue has woken up. * We don't need to be chatty about this- just unlatch things @@ -5482,82 +5464,45 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) break; case ASYNC_TIMEOUT_RESET: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_TIMEOUT_RESET for FC card"); - break; - } - isp_prt(isp, ISP_LOGWARN, - "timeout initiated SCSI bus reset of chan %d", chan); + isp_prt(isp, ISP_LOGWARN, "timeout initiated SCSI bus reset of chan %d", chan); ISP_SET_SENDMARKER(isp, chan, 1); #ifdef ISP_TARGET_MODE if (isp_target_async(isp, chan, mbox)) { - rval = -1; + acked = 1; } #endif break; case ASYNC_DEVICE_RESET: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL DEVICE_RESET for FC card"); - break; - } isp_prt(isp, ISP_LOGINFO, "device reset on chan %d", chan); ISP_SET_SENDMARKER(isp, chan, 1); #ifdef ISP_TARGET_MODE if (isp_target_async(isp, chan, mbox)) { - rval = -1; + acked = 1; } #endif break; case ASYNC_EXTMSG_UNDERRUN: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_EXTMSG_UNDERRUN for FC card"); - break; - } isp_prt(isp, ISP_LOGWARN, "extended message underrun"); break; case ASYNC_SCAM_INT: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_SCAM_INT for FC card"); - break; - } isp_prt(isp, ISP_LOGINFO, "SCAM interrupt"); break; case ASYNC_HUNG_SCSI: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_HUNG_SCSI for FC card"); - break; - } - isp_prt(isp, ISP_LOGERR, - "stalled SCSI Bus after DATA Overrun"); + isp_prt(isp, ISP_LOGERR, "stalled SCSI Bus after DATA Overrun"); /* XXX: Need to issue SCSI reset at this point */ break; case ASYNC_KILLED_BUS: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_KILLED_BUS for FC card"); - break; - } isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun"); break; case ASYNC_BUS_TRANSIT: - if (IS_FC(isp)) { - isp_prt(isp, ISP_LOGWARN, - "ILLEGAL ASYNC_BUS_TRANSIT for FC card"); - break; - } mbox = ISP_READ(isp, OUTMAILBOX2); - switch (mbox & 0x1c00) { + switch (mbox & SXP_PINS_MODE_MASK) { case SXP_PINS_LVD_MODE: isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode"); SDPARAM(isp, chan)->isp_diffmode = 0; @@ -5590,70 +5535,142 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) ISP_SET_SENDMARKER(isp, chan, 1); break; - case ASYNC_RIO5: - pattern = 0xce; /* outgoing mailbox regs 1-3, 6-7 */ - break; - - case ASYNC_RIO4: - pattern = 0x4e; /* outgoing mailbox regs 1-3, 6 */ - break; - - case ASYNC_RIO3: - pattern = 0x0e; /* outgoing mailbox regs 1-3 */ - break; - - case ASYNC_RIO2: - pattern = 0x06; /* outgoing mailbox regs 1-2 */ - break; - - case ASYNC_RIO1: case ASYNC_CMD_CMPLT: - pattern = 0x02; /* outgoing mailbox regs 1 */ - break; - - case ASYNC_RIO_RESP: - return (rval); - - case ASYNC_CTIO_DONE: - { -#ifdef ISP_TARGET_MODE - int handle; - if (IS_SCSI(isp) || IS_24XX(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad ASYNC_CTIO_DONE for %s cards", - IS_SCSI(isp)? "SCSI" : "24XX"); + case ASYNC_RIO32_1: + if (!IS_ULTRA3(isp)) { + isp_prt(isp, ISP_LOGERR, "unexpected fast posting completion"); break; } - handle = - (ISP_READ(isp, OUTMAILBOX2) << 16) | - (ISP_READ(isp, OUTMAILBOX1)); - if (isp_target_async(isp, handle, mbox)) { - rval = -1; + /* FALLTHROUGH */ + h1 = (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1); + break; + + case ASYNC_RIO32_2: + h1 = (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1); + h2 = (ISP_READ(isp, OUTMAILBOX7) << 16) | ISP_READ(isp, OUTMAILBOX6); + break; + + case ASYNC_RIO16_5: + case ASYNC_RIO16_4: + case ASYNC_RIO16_3: + case ASYNC_RIO16_2: + case ASYNC_RIO16_1: + isp_prt(isp, ISP_LOGERR, "unexpected 16 bit RIO handle"); + break; + default: + isp_prt(isp, ISP_LOGWARN, "%s: unhandled async code 0x%x", __func__, mbox); + break; + } + + if (h1 || h2) { + isp_prt(isp, ISP_LOGDEBUG3, "fast post/rio completion of 0x%08x", h1); + isp_fastpost_complete(isp, h1); + if (h2) { + isp_prt(isp, ISP_LOGDEBUG3, "fast post/rio completion of 0x%08x", h2); + isp_fastpost_complete(isp, h2); + if (isp->isp_fpcchiwater < 2) { + isp->isp_fpcchiwater = 2; + } + } else { + if (isp->isp_fpcchiwater < 1) { + isp->isp_fpcchiwater = 1; + } + } + } else { + isp->isp_intoasync++; + } + return (acked); +} + +#define GET_24XX_BUS(isp, chan, msg) \ + if (IS_24XX(isp)) { \ + chan = ISP_READ(isp, OUTMAILBOX3) & 0xff; \ + if (chan >= isp->isp_nchan) { \ + isp_prt(isp, ISP_LOGERR, "bogus channel %u for %s at line %d", chan, msg, __LINE__); \ + break; \ + } \ + } + + +static int +isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox) +{ + int acked = 0; + uint16_t chan; + + if (IS_DUALBUS(isp)) { + chan = ISP_READ(isp, OUTMAILBOX6); + } else { + chan = 0; + } + isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox); + + switch (mbox) { + case ASYNC_SYSTEM_ERROR: + isp->isp_dead = 1; + isp->isp_state = ISP_CRASHED; + FCPARAM(isp, chan)->isp_loopstate = LOOP_NIL; + FCPARAM(isp, chan)->isp_fwstate = FW_CONFIG_WAIT; + /* + * Were we waiting for a mailbox command to complete? + * If so, it's dead, so wake up the waiter. + */ + if (isp->isp_mboxbsy) { + isp->isp_obits = 1; + isp->isp_mboxtmp[0] = MBOX_HOST_INTERFACE_ERROR; + MBOX_NOTIFY_COMPLETE(isp); + } + /* + * It's up to the handler for isp_async to reinit stuff and + * restart the firmware + */ + isp_async(isp, ISPASYNC_FW_CRASH); + acked = 1; + break; + + case ASYNC_RQS_XFER_ERR: + isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error"); + break; + + case ASYNC_RSP_XFER_ERR: + isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error"); + break; + + case ASYNC_QWAKEUP: +#ifdef ISP_TARGET_MODE + if (IS_24XX(isp)) { + isp_prt(isp, ISP_LOGERR, "ATIO Queue Transfer Error"); + break; + } +#endif + isp_prt(isp, ISP_LOGERR, "%s: unexpected ASYNC_QWAKEUP code", __func__); + break; + + case ASYNC_CMD_CMPLT: + isp_fastpost_complete(isp, (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1)); + if (isp->isp_fpcchiwater < 1) { + isp->isp_fpcchiwater = 1; + } + break; + + case ASYNC_RIOZIO_STALL: + break; + + case ASYNC_CTIO_DONE: +#ifdef ISP_TARGET_MODE + if (isp_target_async(isp, (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1), mbox)) { + acked = 1; } else { - /* count it as a fast posting intr */ isp->isp_fphccmplt++; } #else - if (IS_SCSI(isp) || IS_24XX(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad ASYNC_CTIO_DONE for %s cards", - IS_SCSI(isp)? "SCSI" : "24XX"); - break; - } - isp_prt(isp, ISP_LOGINFO, "Fast Posting CTIO done"); - isp->isp_fphccmplt++; /* count it as a fast posting intr */ + isp_prt(isp, ISP_LOGWARN, "unexpected ASYNC CTIO done"); #endif break; - } case ASYNC_LIP_ERROR: case ASYNC_LIP_F8: case ASYNC_LIP_OCCURRED: case ASYNC_PTPMODE: - if (IS_SCSI(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad LIP event for SCSI cards"); - break; - } /* * These are broadcast events that have to be sent across * all active channels. @@ -5673,7 +5690,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) isp_async(isp, ISPASYNC_LIP, chan); #ifdef ISP_TARGET_MODE if (isp_target_async(isp, chan, mbox)) { - rval = -1; + acked = 1; } #endif /* @@ -5681,16 +5698,19 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) * commands that complete (with no apparent error) after * we receive a LIP. This has been observed mostly on * Local Loop topologies. To be safe, let's just mark - * all active commands as dead. + * all active initiator commands as dead. */ if (topo == TOPO_NL_PORT || topo == TOPO_FL_PORT) { int i, j; for (i = j = 0; i < isp->isp_maxcmds; i++) { XS_T *xs; - xs = isp->isp_xflist[i]; - if (xs == NULL) { + isp_hdl_t *hdp; + + hdp = &isp->isp_xflist[i]; + if (ISP_H2HT(hdp->handle) != ISP_HANDLE_INITIATOR) { continue; } + xs = hdp->cmd; if (XS_CHANNEL(xs) != chan) { continue; } @@ -5705,11 +5725,6 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) break; case ASYNC_LOOP_UP: - if (IS_SCSI(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad LOOP UP event for SCSI cards"); - break; - } /* * This is a broadcast event that has to be sent across * all active channels. @@ -5729,18 +5744,13 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) isp_async(isp, ISPASYNC_LOOP_UP, chan); #ifdef ISP_TARGET_MODE if (isp_target_async(isp, chan, mbox)) { - rval = -1; + acked = 1; } #endif } break; case ASYNC_LOOP_DOWN: - if (IS_SCSI(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad LOOP DOWN event for SCSI cards"); - break; - } /* * This is a broadcast event that has to be sent across * all active channels. @@ -5759,18 +5769,13 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) isp_async(isp, ISPASYNC_LOOP_DOWN, chan); #ifdef ISP_TARGET_MODE if (isp_target_async(isp, chan, mbox)) { - rval = -1; + acked = 1; } #endif } break; case ASYNC_LOOP_RESET: - if (IS_SCSI(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad LIP RESET event for SCSI cards"); - break; - } /* * This is a broadcast event that has to be sent across * all active channels. @@ -5789,7 +5794,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) isp_async(isp, ISPASYNC_LOOP_RESET, chan); #ifdef ISP_TARGET_MODE if (isp_target_async(isp, chan, mbox)) { - rval = -1; + acked = 1; } #endif } @@ -5798,11 +5803,6 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) case ASYNC_PDB_CHANGED: { int nphdl, nlstate, reason; - if (IS_SCSI(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad PDB CHANGED event for SCSI cards"); - break; - } /* * We *should* get a channel out of the 24XX, but we don't seem * to get more than a PDB CHANGED on channel 0, so turn it into @@ -5825,8 +5825,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) ISP_SET_SENDMARKER(isp, chan, 1); fcp->isp_loopstate = LOOP_PDB_RCVD; ISP_MARK_PORTDB(isp, chan, 1); - isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, - ISPASYNC_CHANGE_PDB, nphdl, nlstate, reason); + isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, ISPASYNC_CHANGE_PDB, nphdl, nlstate, reason); } break; } @@ -5834,11 +5833,6 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) { int lochan, hichan; - if (IS_SCSI(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad CHANGE NOTIFY event for SCSI cards"); - break; - } if (ISP_FW_NEWER_THAN(isp, 4, 0, 25) && ISP_CAP_MULTI_ID(isp)) { GET_24XX_BUS(isp, chan, "ASYNC_CHANGE_NOTIFY"); lochan = chan; @@ -5860,8 +5854,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) fcp->isp_loopstate = LOOP_PDB_RCVD; } ISP_MARK_PORTDB(isp, chan, 1); - isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, - ISPASYNC_CHANGE_SNS); + isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, ISPASYNC_CHANGE_SNS); } break; } @@ -5871,8 +5864,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) * This only applies to 2100 amd 2200 cards */ if (!IS_2200(isp) && !IS_2100(isp)) { - isp_prt(isp, ISP_LOGWARN, - "bad card for ASYNC_CONNMODE event"); + isp_prt(isp, ISP_LOGWARN, "bad card for ASYNC_CONNMODE event"); break; } chan = 0; @@ -5906,8 +5898,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) "Unknown connection mode (0x%x)", mbox); break; } - isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, - ISPASYNC_CHANGE_OTHER); + isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, ISPASYNC_CHANGE_OTHER); FCPARAM(isp, chan)->sendmarker = 1; FCPARAM(isp, chan)->isp_fwstate = FW_CONFIG_WAIT; FCPARAM(isp, chan)->isp_loopstate = LOOP_LIP_RCVD; @@ -5917,8 +5908,7 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) if (IS_24XX(isp)) { isp_prt(isp, ISP_LOGWARN, "Receive Error"); } else { - isp_prt(isp, ISP_LOGWARN, - "Unknown Async Code 0x%x", mbox); + isp_prt(isp, ISP_LOGWARN, "unexpected ASYNC_RCV_ERR"); } break; case ASYNC_RJT_SENT: /* same as ASYNC_QFULL_SENT */ @@ -5934,29 +5924,10 @@ isp_parse_async(ispsoftc_t *isp, uint16_t mbox) isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox); break; } - - if (pattern) { - int i, nh; - uint16_t handles[16]; - - for (nh = 0, i = 1; i < MAX_MAILBOX(isp); i++) { - if ((pattern & (1 << i)) == 0) { - continue; - } - handles[nh++] = ISP_READ(isp, MBOX_OFF(i)); - } - for (i = 0; i < nh; i++) { - isp_fastpost_complete(isp, handles[i]); - isp_prt(isp, ISP_LOGDEBUG3, - "fast post completion of %u", handles[i]); - } - if (isp->isp_fpcchiwater < nh) { - isp->isp_fpcchiwater = nh; - } - } else { + if (mbox != ASYNC_CTIO_DONE && mbox != ASYNC_CMD_CMPLT) { isp->isp_intoasync++; } - return (rval); + return (acked); } /* @@ -6588,7 +6559,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, } static void -isp_fastpost_complete(ispsoftc_t *isp, uint16_t fph) +isp_fastpost_complete(ispsoftc_t *isp, uint32_t fph) { XS_T *xs; @@ -6658,8 +6629,8 @@ isp_mbox_continue(ispsoftc_t *isp) ptr = isp->isp_mbxworkp; switch (isp->isp_lastmbxcmd) { case MBOX_WRITE_RAM_WORD: - mbs.param[1] = isp->isp_mbxwrk1++;; - mbs.param[2] = *ptr++;; + mbs.param[1] = isp->isp_mbxwrk1++; + mbs.param[2] = *ptr++; break; case MBOX_READ_RAM_WORD: *ptr++ = isp->isp_mboxtmp[2]; @@ -6669,7 +6640,7 @@ isp_mbox_continue(ispsoftc_t *isp) offset = isp->isp_mbxwrk1; offset |= isp->isp_mbxwrk8 << 16; - mbs.param[2] = *ptr++;; + mbs.param[2] = *ptr++; mbs.param[1] = offset; mbs.param[8] = offset >> 16; isp->isp_mbxwrk1 = ++offset; @@ -7676,7 +7647,6 @@ isp_setdfltfcparm(ispsoftc_t *isp, int chan) fcp->isp_fwoptions |= ICBOPT_FAIRNESS; fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE; fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS; - fcp->isp_fwoptions |= ICBOPT_FAST_POST; if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) { fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX; } @@ -8285,6 +8255,8 @@ isp_parse_nvram_2100(ispsoftc_t *isp, uint8_t *nvram_data) if ((wwn >> 60) == 0) { wwn |= (((uint64_t) 2)<< 60); } + } else { + wwn = fcp->isp_wwpn_nvram & ~((uint64_t) 0xfff << 48); } } else { wwn &= ~((uint64_t) 0xfff << 48); @@ -8350,11 +8322,6 @@ isp_parse_nvram_2400(ispsoftc_t *isp, uint8_t *nvram_data) ISP2400_NVRAM_FIRMWARE_OPTIONS3(nvram_data)); wwn = ISP2400_NVRAM_PORT_NAME(nvram_data); - if (wwn) { - if ((wwn >> 60) != 2 && (wwn >> 60) != 5) { - wwn = 0; - } - } fcp->isp_wwpn_nvram = wwn; wwn = ISP2400_NVRAM_NODE_NAME(nvram_data); @@ -8363,6 +8330,10 @@ isp_parse_nvram_2400(ispsoftc_t *isp, uint8_t *nvram_data) wwn = 0; } } + if (wwn == 0 && (fcp->isp_wwpn_nvram >> 60) == 2) { + wwn = fcp->isp_wwpn_nvram; + wwn &= ~((uint64_t) 0xfff << 48); + } fcp->isp_wwnn_nvram = wwn; if (ISP2400_NVRAM_EXCHANGE_COUNT(nvram_data)) { diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index ca85d64f50b7..902c8271b050 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -133,33 +133,37 @@ isp_attach_chan(ispsoftc_t *isp, struct cam_devq *devq, int chan) } #endif } else { + fcparam *fcp = FCPARAM(isp, chan); struct isp_fc *fc = ISP_FC_PC(isp, chan); + ISP_LOCK(isp); fc->sim = sim; fc->path = path; fc->isp = isp; + fc->ready = 1; callout_init_mtx(&fc->ldt, &isp->isp_osinfo.lock, 0); callout_init_mtx(&fc->gdt, &isp->isp_osinfo.lock, 0); - - if (THREAD_CREATE(isp_kthread, fc, &fc->kproc, 0, 0, "%s: fc_thrd%d", device_get_nameunit(isp->isp_osinfo.dev), chan)) { - xpt_free_path(fc->path); - ISP_LOCK(isp); - xpt_bus_deregister(cam_sim_path(fc->sim)); - ISP_UNLOCK(isp); - cam_sim_free(fc->sim, FALSE); - } /* * We start by being "loop down" if we have an initiator role */ - ISP_LOCK(isp); - if ((FCPARAM(isp, chan)->role & ISP_ROLE_INITIATOR) && fc->ldt_running == 0) { + if (fcp->role & ISP_ROLE_INITIATOR) { isp_freeze_loopdown(isp, chan, "isp_attach"); - fc->ldt_running = 1; callout_reset(&fc->ldt, isp_quickboot_time * hz, isp_ldt, fc); isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Starting Initial Loop Down Timer @ %lu", (unsigned long) time_uptime); } ISP_UNLOCK(isp); + if (THREAD_CREATE(isp_kthread, fc, &fc->kproc, 0, 0, "%s: fc_thrd%d", device_get_nameunit(isp->isp_osinfo.dev), chan)) { + xpt_free_path(fc->path); + ISP_LOCK(isp); + if (callout_active(&fc->ldt)) { + callout_stop(&fc->ldt); + } + xpt_bus_deregister(cam_sim_path(fc->sim)); + ISP_UNLOCK(isp); + cam_sim_free(fc->sim, FALSE); + return (ENOMEM); + } #ifdef ISP_INTERNAL_TARGET ISP_SET_PC(isp, chan, proc_active, 1); if (THREAD_CREATE(isp_target_thread_fc, fc, &fc->target_proc, 0, 0, "%s: isp_test_tgt%d", device_get_nameunit(isp->isp_osinfo.dev), chan)) { @@ -1649,7 +1653,7 @@ isp_target_start_ctio(ispsoftc_t *isp, union ccb *ccb) cto->ct_timeout = 10; } - if (isp_save_xs_tgt(isp, ccb, &handle)) { + if (isp_allocate_xs_tgt(isp, ccb, &handle)) { xpt_print(ccb->ccb_h.path, "No XFLIST pointers for %s\n", __func__); ccb->ccb_h.status = CAM_REQUEUE_REQ; goto out; @@ -2300,7 +2304,8 @@ isp_handle_platform_ctio(ispsoftc_t *isp, void *arg) uint32_t tval, handle; /* - * CTIO, CTIO2 and CTIO7 are close enough.... + * CTIO handles are 16 bits. + * CTIO2 and CTIO7 are 32 bits. */ if (IS_SCSI(isp)) { @@ -3830,21 +3835,41 @@ isp_watchdog(void *arg) isp = XS_ISP(xs); handle = isp_find_handle(isp, xs); - if (handle) { + if (handle != ISP_HANDLE_FREE) { /* - * Make sure the command is *really* dead before we - * release the handle (and DMA resources) for reuse. + * Try and make sure the command is really dead before + * we release the handle (and DMA resources) for reuse. + * + * If we are successful in aborting the command then + * we're done here because we'll get the command returned + * back separately. */ - (void) isp_control(isp, ISPCTL_ABORT_CMD, xs); + if (isp_control(isp, ISPCTL_ABORT_CMD, xs) == 0) { + return; + } /* - * After this point, the comamnd is really dead. + * Note that after calling the above, the command may in + * fact have been completed. + */ + xs = isp_find_xs(isp, handle); + + /* + * If the command no longer exists, then we won't + * be able to find the xs again with this handle. + */ + if (xs == NULL) { + return; + } + + /* + * After this point, the command is really dead. */ if (XS_XFRLEN(xs)) { ISP_DMAFREE(isp, xs, handle); } isp_destroy_handle(isp, handle); - xpt_print(xs->ccb_h.path, "watchdog timeout for handle 0x%x\n", handle); + isp_prt(isp, ISP_LOGERR, "%s: timeout for handle 0x%x", __func__, handle); XS_SETERR(xs, CAM_CMD_TIMEOUT); isp_done(xs); } @@ -3868,7 +3893,12 @@ isp_make_here(ispsoftc_t *isp, int chan, int tgt) isp_prt(isp, ISP_LOGWARN, "Chan %d unable to alloc CCB for rescan", chan); return; } - if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(fc->sim), tgt, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + /* + * xpt_rescan only honors wildcard in the target field. + * Scan the whole bus instead of target, which will then + * force a scan of all luns. + */ + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(fc->sim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { isp_prt(isp, ISP_LOGWARN, "unable to create path for rescan"); xpt_free_ccb(ccb); return; @@ -3935,12 +3965,12 @@ isp_gdt(void *arg) isp_prt(isp, ISP_LOGCONFIG, prom3, chan, lp->portid, tgt, "Gone Device Timeout"); isp_make_gone(isp, chan, tgt); } - if (more_to_do) { - fc->gdt_running = 1; - callout_reset(&fc->gdt, hz, isp_gdt, fc); - } else { - isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d stopping Gone Device Timer", chan); - fc->gdt_running = 0; + if (fc->ready) { + if (more_to_do) { + callout_reset(&fc->gdt, hz, isp_gdt, fc); + } else { + isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d stopping Gone Device Timer", chan); + } } } @@ -4017,6 +4047,7 @@ isp_kthread(void *arg) ispsoftc_t *isp = fc->isp; int chan = fc - isp->isp_osinfo.pc.fc; int slp = 0; + mtx_lock(&isp->isp_osinfo.lock); for (;;) { @@ -4802,6 +4833,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) char *msg = NULL; target_id_t tgt; fcportdb_t *lp; + struct isp_fc *fc; struct cam_path *tmppath; va_list ap; @@ -4886,7 +4918,6 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) /* FALLTHROUGH */ case ISPASYNC_LOOP_DOWN: { - struct isp_fc *fc; if (msg == NULL) { msg = "LOOP Down"; } @@ -4894,20 +4925,21 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) bus = va_arg(ap, int); va_end(ap); - FCPARAM(isp, bus)->link_active = 1; + FCPARAM(isp, bus)->link_active = 0; fc = ISP_FC_PC(isp, bus); - /* - * We don't do any simq freezing if we are only in target mode - */ - if (fc->role & ISP_ROLE_INITIATOR) { - if (fc->path) { - isp_freeze_loopdown(isp, bus, msg); - } - if (fc->ldt_running == 0) { - fc->ldt_running = 1; - callout_reset(&fc->ldt, fc->loop_down_limit * hz, isp_ldt, fc); - isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "starting Loop Down Timer @ %lu", (unsigned long) time_uptime); + if (cmd == ISPASYNC_LOOP_DOWN && fc->ready) { + /* + * We don't do any simq freezing if we are only in target mode + */ + if (fc->role & ISP_ROLE_INITIATOR) { + if (fc->path) { + isp_freeze_loopdown(isp, bus, msg); + } + if (!callout_active(&fc->ldt)) { + callout_reset(&fc->ldt, fc->loop_down_limit * hz, isp_ldt, fc); + isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "starting Loop Down Timer @ %lu", (unsigned long) time_uptime); + } } } isp_prt(isp, ISP_LOGINFO, "Chan %d: %s", bus, msg); @@ -4917,6 +4949,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) va_start(ap, cmd); bus = va_arg(ap, int); va_end(ap); + fc = ISP_FC_PC(isp, bus); /* * Now we just note that Loop has come up. We don't * actually do anything because we're waiting for a @@ -4924,8 +4957,8 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) * thread to look at the state of the loop again. */ FCPARAM(isp, bus)->link_active = 1; - ISP_FC_PC(isp, bus)->loop_dead = 0; - ISP_FC_PC(isp, bus)->loop_down_time = 0; + fc->loop_dead = 0; + fc->loop_down_time = 0; isp_prt(isp, ISP_LOGINFO, "Chan %d Loop UP", bus); break; case ISPASYNC_DEV_ARRIVED: @@ -4933,8 +4966,9 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) bus = va_arg(ap, int); lp = va_arg(ap, fcportdb_t *); va_end(ap); + fc = ISP_FC_PC(isp, bus); lp->reserved = 0; - if ((ISP_FC_PC(isp, bus)->role & ISP_ROLE_INITIATOR) && (lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT))) { + if ((fc->role & ISP_ROLE_INITIATOR) && (lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT))) { int dbidx = lp - FCPARAM(isp, bus)->portdb; int i; @@ -4967,6 +5001,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) bus = va_arg(ap, int); lp = va_arg(ap, fcportdb_t *); va_end(ap); + fc = ISP_FC_PC(isp, bus); lp->reserved = 0; if (isp_change_is_bad) { lp->state = FC_PORTDB_STATE_NIL; @@ -5013,6 +5048,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) bus = va_arg(ap, int); lp = va_arg(ap, fcportdb_t *); va_end(ap); + fc = ISP_FC_PC(isp, bus); /* * If this has a virtual target and we haven't marked it * that we're going to have isp_gdt tell the OS it's gone, @@ -5025,10 +5061,9 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) lp->reserved = 1; lp->new_reserved = ISP_FC_PC(isp, bus)->gone_device_time; lp->state = FC_PORTDB_STATE_ZOMBIE; - if (ISP_FC_PC(isp, bus)->gdt_running == 0) { + if (fc->ready && !callout_active(&fc->gdt)) { isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d starting Gone Device Timer", bus); - ISP_FC_PC(isp, bus)->gdt_running = 1; - callout_reset(&ISP_FC_PC(isp, bus)->gdt, hz, isp_gdt, ISP_FC_PC(isp, bus)); + callout_reset(&fc->gdt, hz, isp_gdt, fc); } tgt = lp->dev_map_idx - 1; isp_prt(isp, ISP_LOGCONFIG, prom2, bus, lp->portid, lp->handle, roles[lp->roles], "gone zombie at", tgt, (uint32_t) (lp->port_wwn >> 32), (uint32_t) lp->port_wwn); @@ -5053,6 +5088,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) nlstate = reason = 0; } va_end(ap); + fc = ISP_FC_PC(isp, bus); if (evt == ISPASYNC_CHANGE_PDB) { msg = "Chan %d Port Database Changed"; @@ -5065,16 +5101,15 @@ isp_async(ispsoftc_t *isp, ispasync_t cmd, ...) /* * If the loop down timer is running, cancel it. */ - if (ISP_FC_PC(isp, bus)->ldt_running) { + if (fc->ready && callout_active(&fc->ldt)) { isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Stopping Loop Down Timer @ %lu", (unsigned long) time_uptime); - ISP_FC_PC(isp, bus)->ldt_running = 0; - callout_stop(&ISP_FC_PC(isp, bus)->ldt); + callout_stop(&fc->ldt); } isp_prt(isp, ISP_LOGINFO, msg, bus); - if (ISP_FC_PC(isp, bus)->role & ISP_ROLE_INITIATOR) { + if (fc->role & ISP_ROLE_INITIATOR) { isp_freeze_loopdown(isp, bus, msg); } - wakeup(ISP_FC_PC(isp, bus)); + wakeup(fc); break; } #ifdef ISP_TARGET_MODE diff --git a/sys/dev/isp/isp_freebsd.h b/sys/dev/isp/isp_freebsd.h index 2988e3095eec..29425940c056 100644 --- a/sys/dev/isp/isp_freebsd.h +++ b/sys/dev/isp/isp_freebsd.h @@ -177,9 +177,9 @@ struct isp_fc { hysteresis : 8, role : 2, gdt_running : 1, - ldt_running : 1, loop_dead : 1, - fcbsy : 1; + fcbsy : 1, + ready : 1; struct callout ldt; /* loop down timer */ struct callout gdt; /* gone device timer */ #ifdef ISP_TARGET_MODE diff --git a/sys/dev/isp/isp_library.c b/sys/dev/isp/isp_library.c index 5e6430905bfe..43c161d2782c 100644 --- a/sys/dev/isp/isp_library.c +++ b/sys/dev/isp/isp_library.c @@ -246,65 +246,70 @@ copy_and_sync: } int -isp_save_xs(ispsoftc_t *isp, XS_T *xs, uint32_t *handlep) +isp_allocate_xs(ispsoftc_t *isp, XS_T *xs, uint32_t *handlep) { - uint16_t i, j; + isp_hdl_t *hdp; - for (j = isp->isp_lasthdls, i = 0; i < isp->isp_maxcmds; i++) { - if (isp->isp_xflist[j] == NULL) { - break; - } - if (++j == isp->isp_maxcmds) { - j = 0; - } - } - if (i == isp->isp_maxcmds) { + hdp = isp->isp_xffree; + if (hdp == NULL) { return (-1); } - isp->isp_xflist[j] = xs; - *handlep = j+1; - if (++j == isp->isp_maxcmds) { - j = 0; - } - isp->isp_lasthdls = (uint32_t)j; + isp->isp_xffree = hdp->cmd; + hdp->cmd = xs; + hdp->handle = (hdp - isp->isp_xflist); + hdp->handle |= (ISP_HANDLE_INITIATOR << ISP_HANDLE_USAGE_SHIFT); + hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT); + *handlep = hdp->handle; return (0); } XS_T * isp_find_xs(ispsoftc_t *isp, uint32_t handle) { - if (handle < 1 || handle > (uint32_t) isp->isp_maxcmds) { + if (!ISP_VALID_INI_HANDLE(isp, handle)) { + isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); return (NULL); - } else { - return (isp->isp_xflist[handle - 1]); } + return (isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd); } uint32_t isp_find_handle(ispsoftc_t *isp, XS_T *xs) { - uint16_t i; + uint32_t i, foundhdl = ISP_HANDLE_FREE; + if (xs != NULL) { for (i = 0; i < isp->isp_maxcmds; i++) { - if (isp->isp_xflist[i] == xs) { - return ((uint32_t) (i+1)); + if (isp->isp_xflist[i].cmd != xs) { + continue; } + foundhdl = isp->isp_xflist[i].handle; + break; } } - return (0); + return (foundhdl); } uint32_t -isp_handle_index(uint32_t handle) +isp_handle_index(ispsoftc_t *isp, uint32_t handle) { - return (handle - 1); + if (!ISP_VALID_HANDLE(isp, handle)) { + return (handle & ISP_HANDLE_CMD_MASK); + } else { + isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); + return (ISP_BAD_HANDLE_INDEX); + } } void isp_destroy_handle(ispsoftc_t *isp, uint32_t handle) { - if (handle > 0 && handle <= (uint32_t) isp->isp_maxcmds) { - isp->isp_xflist[handle - 1] = NULL; + if (!ISP_VALID_INI_HANDLE(isp, handle)) { + isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); + } else { + isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE; + isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_xffree; + isp->isp_xffree = &isp->isp_xflist[(handle & ISP_HANDLE_CMD_MASK)]; } } @@ -617,60 +622,54 @@ isp_fc_change_role(ispsoftc_t *isp, int chan, int new_role) void isp_clear_commands(ispsoftc_t *isp) { - XS_T *xs; - uint32_t tmp, handle; + uint32_t tmp; + isp_hdl_t *hdp; #ifdef ISP_TARGET_MODE isp_notify_t notify; #endif for (tmp = 0; isp->isp_xflist && tmp < isp->isp_maxcmds; tmp++) { - xs = isp->isp_xflist[tmp]; - if (xs == NULL) { - continue; - } - handle = isp_find_handle(isp, xs); - if (handle == 0) { + XS_T *xs; + + hdp = &isp->isp_xflist[tmp]; + if (hdp->handle == ISP_HANDLE_FREE) { continue; } + xs = hdp->cmd; if (XS_XFRLEN(xs)) { - ISP_DMAFREE(isp, xs, handle); + ISP_DMAFREE(isp, xs, hdp->handle); XS_SET_RESID(xs, XS_XFRLEN(xs)); } else { XS_SET_RESID(xs, 0); } - isp_destroy_handle(isp, handle); + hdp->handle = 0; + hdp->cmd = NULL; XS_SETERR(xs, HBA_BUSRESET); isp_done(xs); } #ifdef ISP_TARGET_MODE for (tmp = 0; isp->isp_tgtlist && tmp < isp->isp_maxcmds; tmp++) { uint8_t local[QENTRY_LEN]; - - xs = isp->isp_tgtlist[tmp]; - if (xs == NULL) { + hdp = &isp->isp_tgtlist[tmp]; + if (hdp->handle == ISP_HANDLE_FREE) { continue; } - handle = isp_find_tgt_handle(isp, xs); - if (handle == 0) { - continue; - } - ISP_DMAFREE(isp, xs, handle); - + ISP_DMAFREE(isp, hdp->cmd, hdp->handle); ISP_MEMZERO(local, QENTRY_LEN); if (IS_24XX(isp)) { ct7_entry_t *ctio = (ct7_entry_t *) local; - ctio->ct_syshandle = handle; + ctio->ct_syshandle = hdp->handle; ctio->ct_nphdl = CT_HBA_RESET; ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO7; } else if (IS_FC(isp)) { ct2_entry_t *ctio = (ct2_entry_t *) local; - ctio->ct_syshandle = handle; + ctio->ct_syshandle = hdp->handle; ctio->ct_status = CT_HBA_RESET; ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO2; } else { ct_entry_t *ctio = (ct_entry_t *) local; - ctio->ct_syshandle = handle & 0xffff; - ctio->ct_status = CT_HBA_RESET & 0xff;; + ctio->ct_syshandle = hdp->handle; + ctio->ct_status = CT_HBA_RESET & 0xff; ctio->ct_header.rqs_entry_type = RQSTYPE_CTIO; } isp_async(isp, ISPASYNC_TARGET_ACTION, local); @@ -1132,18 +1131,37 @@ isp_get_24xx_abrt(ispsoftc_t *isp, isp24xx_abrt_t *src, isp24xx_abrt_t *dst) } +void +isp_get_rio1(ispsoftc_t *isp, isp_rio1_t *r1src, isp_rio1_t *r1dst) +{ + const int lim = sizeof (r1dst->req_handles) / sizeof (r1dst->req_handles[0]); + int i; + isp_get_hdr(isp, &r1src->req_header, &r1dst->req_header); + if (r1dst->req_header.rqs_seqno > lim) { + r1dst->req_header.rqs_seqno = lim; + } + for (i = 0; i < r1dst->req_header.rqs_seqno; i++) { + ISP_IOXGET_32(isp, &r1src->req_handles[i], r1dst->req_handles[i]); + } + while (i < lim) { + r1dst->req_handles[i++] = 0; + } +} + void isp_get_rio2(ispsoftc_t *isp, isp_rio2_t *r2src, isp_rio2_t *r2dst) { + const int lim = sizeof (r2dst->req_handles) / sizeof (r2dst->req_handles[0]); int i; + isp_get_hdr(isp, &r2src->req_header, &r2dst->req_header); - if (r2dst->req_header.rqs_seqno > 30) { - r2dst->req_header.rqs_seqno = 30; + if (r2dst->req_header.rqs_seqno > lim) { + r2dst->req_header.rqs_seqno = lim; } for (i = 0; i < r2dst->req_header.rqs_seqno; i++) { ISP_IOXGET_16(isp, &r2src->req_handles[i], r2dst->req_handles[i]); } - while (i < 30) { + while (i < lim) { r2dst->req_handles[i++] = 0; } } @@ -2229,59 +2247,65 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_ } int -isp_save_xs_tgt(ispsoftc_t *isp, void *xs, uint32_t *handlep) +isp_allocate_xs_tgt(ispsoftc_t *isp, void *xs, uint32_t *handlep) { - int i; + isp_hdl_t *hdp; - for (i = 0; i < (int) isp->isp_maxcmds; i++) { - if (isp->isp_tgtlist[i] == NULL) { - break; - } - } - if (i == isp->isp_maxcmds) { + hdp = isp->isp_tgtfree; + if (hdp == NULL) { return (-1); } - isp->isp_tgtlist[i] = xs; - *handlep = (i+1) | 0x8000; + isp->isp_tgtfree = hdp->cmd; + hdp->cmd = xs; + hdp->handle = (hdp - isp->isp_tgtlist); + hdp->handle |= (ISP_HANDLE_TARGET << ISP_HANDLE_USAGE_SHIFT); + /* + * Target handles for SCSI cards are only 16 bits, so + * sequence number protection will be ommitted. + */ + if (IS_FC(isp)) { + hdp->handle |= (isp->isp_seqno++ << ISP_HANDLE_SEQ_SHIFT); + } + *handlep = hdp->handle; return (0); } void * isp_find_xs_tgt(ispsoftc_t *isp, uint32_t handle) { - if (handle == 0 || IS_TARGET_HANDLE(handle) == 0 || (handle & ISP_HANDLE_MASK) > isp->isp_maxcmds) { - isp_prt(isp, ISP_LOGERR, "bad handle %u in isp_find_xs_tgt", handle); + if (!ISP_VALID_TGT_HANDLE(isp, handle)) { + isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); return (NULL); - } else { - return (isp->isp_tgtlist[(handle & ISP_HANDLE_MASK) - 1]); } + return (isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd); } uint32_t isp_find_tgt_handle(ispsoftc_t *isp, void *xs) { - int i; + uint32_t i, foundhdl = ISP_HANDLE_FREE; + if (xs != NULL) { for (i = 0; i < isp->isp_maxcmds; i++) { - if (isp->isp_tgtlist[i] == xs) { - uint32_t handle = i; - handle += 1; - handle &= ISP_HANDLE_MASK; - handle |= 0x8000; - return (handle); + if (isp->isp_tgtlist[i].cmd != xs) { + continue; } + foundhdl = isp->isp_tgtlist[i].handle; + break; } } - return (0); + return (foundhdl); } void isp_destroy_tgt_handle(ispsoftc_t *isp, uint32_t handle) { - if (handle == 0 || IS_TARGET_HANDLE(handle) == 0 || (handle & ISP_HANDLE_MASK) > isp->isp_maxcmds) { - isp_prt(isp, ISP_LOGERR, "bad handle in isp_destroy_tgt_handle"); + if (!ISP_VALID_TGT_HANDLE(isp, handle)) { + isp_prt(isp, ISP_LOGERR, "%s: bad handle 0x%x", __func__, handle); } else { - isp->isp_tgtlist[(handle & ISP_HANDLE_MASK) - 1] = NULL; + isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].handle = ISP_HANDLE_FREE; + isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)].cmd = isp->isp_tgtfree; + isp->isp_tgtfree = &isp->isp_tgtlist[(handle & ISP_HANDLE_CMD_MASK)]; } } diff --git a/sys/dev/isp/isp_library.h b/sys/dev/isp/isp_library.h index 9a9e39721cd0..4e0c7f8e67b1 100644 --- a/sys/dev/isp/isp_library.h +++ b/sys/dev/isp/isp_library.h @@ -43,10 +43,10 @@ int isp_send_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t); * * These handles are associate with a command. */ -int isp_save_xs(ispsoftc_t *, XS_T *, uint32_t *); +int isp_allocate_xs(ispsoftc_t *, XS_T *, uint32_t *); XS_T * isp_find_xs(ispsoftc_t *, uint32_t); uint32_t isp_find_handle(ispsoftc_t *, XS_T *); -uint32_t isp_handle_index(uint32_t); +uint32_t isp_handle_index(ispsoftc_t *, uint32_t); void isp_destroy_handle(ispsoftc_t *, uint32_t); /* @@ -108,6 +108,7 @@ void isp_put_cont64_req(ispsoftc_t *, ispcontreq64_t *, ispcontreq64_t *); void isp_get_response(ispsoftc_t *, ispstatusreq_t *, ispstatusreq_t *); void isp_get_24xx_response(ispsoftc_t *, isp24xx_statusreq_t *, isp24xx_statusreq_t *); void isp_get_24xx_abrt(ispsoftc_t *, isp24xx_abrt_t *, isp24xx_abrt_t *); +void isp_get_rio1(ispsoftc_t *, isp_rio1_t *, isp_rio1_t *); void isp_get_rio2(ispsoftc_t *, isp_rio2_t *, isp_rio2_t *); void isp_put_icb(ispsoftc_t *, isp_icb_t *, isp_icb_t *); void isp_put_icb_2400(ispsoftc_t *, isp_icb_2400_t *, isp_icb_2400_t *); @@ -156,9 +157,7 @@ void isp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *, ct_hdr_t *); int isp_send_tgt_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t, void *, uint32_t); -#define IS_TARGET_HANDLE(x) ((x) & 0x8000) - -int isp_save_xs_tgt(ispsoftc_t *, void *, uint32_t *); +int isp_allocate_xs_tgt(ispsoftc_t *, void *, uint32_t *); void *isp_find_xs_tgt(ispsoftc_t *, uint32_t); uint32_t isp_find_tgt_handle(ispsoftc_t *, void *); void isp_destroy_tgt_handle(ispsoftc_t *, uint32_t); diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c index 47dd350887e6..547f48ef2ff6 100644 --- a/sys/dev/isp/isp_pci.c +++ b/sys/dev/isp/isp_pci.c @@ -1068,8 +1068,7 @@ isp_pci_rd_isr(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbp) } static int -isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, - uint16_t *semap, uint16_t *mbox0p) +isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbox0p) { uint32_t hccr; uint32_t r2hisr; @@ -1096,7 +1095,7 @@ isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, return (1); case ISPR2HST_RIO_16: *isrp = r2hisr & 0xffff; - *mbox0p = ASYNC_RIO1; + *mbox0p = ASYNC_RIO16_1; *semap = 1; return (1); case ISPR2HST_FPOST: @@ -1118,21 +1117,17 @@ isp_pci_rd_isr_2300(ispsoftc_t *isp, uint32_t *isrp, hccr = ISP_READ(isp, HCCR); if (hccr & HCCR_PAUSE) { ISP_WRITE(isp, HCCR, HCCR_RESET); - isp_prt(isp, ISP_LOGERR, - "RISC paused at interrupt (%x->%x)", hccr, - ISP_READ(isp, HCCR)); + isp_prt(isp, ISP_LOGERR, "RISC paused at interrupt (%x->%x)", hccr, ISP_READ(isp, HCCR)); ISP_WRITE(isp, BIU_ICR, 0); } else { - isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", - r2hisr); + isp_prt(isp, ISP_LOGERR, "unknown interrupt 0x%x\n", r2hisr); } return (0); } } static int -isp_pci_rd_isr_2400(ispsoftc_t *isp, uint32_t *isrp, - uint16_t *semap, uint16_t *mbox0p) +isp_pci_rd_isr_2400(ispsoftc_t *isp, uint32_t *isrp, uint16_t *semap, uint16_t *mbox0p) { uint32_t r2hisr; @@ -1177,8 +1172,7 @@ isp_pci_rd_reg(ispsoftc_t *isp, int regoff) * We will assume that someone has paused the RISC processor. */ oldconf = BXR2(isp, IspVirt2Off(isp, BIU_CONF1)); - BXW2(isp, IspVirt2Off(isp, BIU_CONF1), - oldconf | BIU_PCI_CONF1_SXP); + BXW2(isp, IspVirt2Off(isp, BIU_CONF1), oldconf | BIU_PCI_CONF1_SXP); MEMORYBARRIER(isp, SYNC_REG, IspVirt2Off(isp, BIU_CONF1), 2); } rv = BXR2(isp, IspVirt2Off(isp, regoff)); @@ -1516,17 +1510,21 @@ isp_pci_mbxdma(ispsoftc_t *isp) return (1); } - len = sizeof (XS_T **) * isp->isp_maxcmds; - isp->isp_xflist = (XS_T **) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); + len = sizeof (isp_hdl_t) * isp->isp_maxcmds; + isp->isp_xflist = (isp_hdl_t *) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); if (isp->isp_xflist == NULL) { free(isp->isp_osinfo.pcmd_pool, M_DEVBUF); ISP_LOCK(isp); isp_prt(isp, ISP_LOGERR, "cannot alloc xflist array"); return (1); } + for (len = 0; len < isp->isp_maxcmds - 1; len++) { + isp->isp_xflist[len].cmd = &isp->isp_xflist[len+1]; + } + isp->isp_xffree = isp->isp_xflist; #ifdef ISP_TARGET_MODE - len = sizeof (void **) * isp->isp_maxcmds; - isp->isp_tgtlist = (void **) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); + len = sizeof (isp_hdl_t) * isp->isp_maxcmds; + isp->isp_tgtlist = (isp_hdl_t *) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); if (isp->isp_tgtlist == NULL) { free(isp->isp_osinfo.pcmd_pool, M_DEVBUF); free(isp->isp_xflist, M_DEVBUF); @@ -1534,6 +1532,10 @@ isp_pci_mbxdma(ispsoftc_t *isp) isp_prt(isp, ISP_LOGERR, "cannot alloc tgtlist array"); return (1); } + for (len = 0; len < isp->isp_maxcmds - 1; len++) { + isp->isp_tgtlist[len].cmd = &isp->isp_tgtlist[len+1]; + } + isp->isp_tgtfree = isp->isp_tgtlist; #endif /* diff --git a/sys/dev/isp/isp_sbus.c b/sys/dev/isp/isp_sbus.c index af7cb88d602e..e2dd78fed96f 100644 --- a/sys/dev/isp/isp_sbus.c +++ b/sys/dev/isp/isp_sbus.c @@ -193,6 +193,8 @@ isp_sbus_attach(device_t dev) isp->isp_param = &sbs->sbus_param; isp->isp_osinfo.pc.ptr = &sbs->sbus_spi; isp->isp_revision = 0; /* XXX */ + isp->isp_dev = dev; + isp->isp_nchan = 1; ISP_SET_PC(isp, 0, role, role); /* @@ -316,18 +318,16 @@ isp_sbus_attach(device_t dev) goto bad; } isp_init(isp); - if (role != ISP_ROLE_NONE && isp->isp_state != ISP_INITSTATE) { - isp_uninit(isp); - ISP_UNLOCK(isp); - goto bad; - } - isp_attach(isp); - if (role != ISP_ROLE_NONE && isp->isp_state != ISP_RUNSTATE) { - isp_uninit(isp); - ISP_UNLOCK(isp); - goto bad; + if (isp->isp_state == ISP_INITSTATE) { + isp->isp_state = ISP_RUNSTATE; } ISP_UNLOCK(isp); + if (isp_attach(isp)) { + ISP_LOCK(isp); + isp_uninit(isp); + ISP_UNLOCK(isp); + goto bad; + } return (0); bad: @@ -345,13 +345,10 @@ bad: } if (regs) { - (void) bus_release_resource(dev, 0, 0, regs); + (void) bus_release_resource(dev, SYS_RES_MEMORY, 0, regs); } if (sbs) { - if (sbs->sbus_isp.isp_param) { - free(sbs->sbus_isp.isp_param, M_DEVBUF); - } free(sbs, M_DEVBUF); } return (ENXIO); @@ -458,13 +455,17 @@ isp_sbus_mbxdma(ispsoftc_t *isp) return (1); } - len = sizeof (XS_T **) * isp->isp_maxcmds; - isp->isp_xflist = (XS_T **) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); + len = sizeof (isp_hdl_t *) * isp->isp_maxcmds; + isp->isp_xflist = (isp_hdl_t *) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); if (isp->isp_xflist == NULL) { isp_prt(isp, ISP_LOGERR, "cannot alloc xflist array"); ISP_LOCK(isp); return (1); } + for (len = 0; len < isp->isp_maxcmds - 1; len++) { + isp->isp_xflist[len].cmd = &isp->isp_xflist[len+1]; + } + isp->isp_xffree = isp->isp_xflist; len = sizeof (bus_dmamap_t) * isp->isp_maxcmds; if (isp_dma_tag_create(BUS_DMA_ROOTARG(ISP_SBD(isp)), 1, @@ -584,13 +585,6 @@ dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) isp = mp->isp; rq = mp->rq; if (nseg) { - if (sizeof (bus_addr_t) > 4) { - if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) { - rq->req_header.rqs_entry_type = RQSTYPE_T3RQS; - } else if (rq->req_header.rqs_entry_type == RQSTYPE_REQUEST) { - rq->req_header.rqs_entry_type = RQSTYPE_A64; - } - } if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD); ddir = ISP_FROM_DEVICE; diff --git a/sys/dev/isp/isp_target.c b/sys/dev/isp/isp_target.c index 68c42b4558ae..8707961c24f9 100644 --- a/sys/dev/isp/isp_target.c +++ b/sys/dev/isp/isp_target.c @@ -826,7 +826,9 @@ isp_target_async(ispsoftc_t *isp, int bus, int event) ct_entry_t *ct = (ct_entry_t *) storage; ct->ct_header.rqs_entry_type = RQSTYPE_CTIO; ct->ct_status = CT_OK; - ct->ct_fwhandle = bus; + ct->ct_syshandle = bus; + /* we skip fwhandle here */ + ct->ct_fwhandle = 0; ct->ct_flags = CT_SENDSTATUS; } isp_async(isp, ISPASYNC_TARGET_ACTION, storage); diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h index 2f9d152039f7..36a73913ac8f 100644 --- a/sys/dev/isp/ispmbox.h +++ b/sys/dev/isp/ispmbox.h @@ -223,6 +223,8 @@ #define ASYNC_SECURITY_UPDATE 0x801B #define ASYNC_CMD_CMPLT 0x8020 #define ASYNC_CTIO_DONE 0x8021 +#define ASYNC_RIO32_1 0x8021 +#define ASYNC_RIO32_2 0x8022 #define ASYNC_IP_XMIT_DONE 0x8022 #define ASYNC_IP_RECV_DONE 0x8023 #define ASYNC_IP_BROADCAST 0x8024 @@ -230,19 +232,19 @@ #define ASYNC_IP_RCVQ_EMPTY 0x8026 #define ASYNC_IP_RECV_DONE_ALIGNED 0x8027 #define ASYNC_PTPMODE 0x8030 -#define ASYNC_RIO1 0x8031 -#define ASYNC_RIO2 0x8032 -#define ASYNC_RIO3 0x8033 -#define ASYNC_RIO4 0x8034 -#define ASYNC_RIO5 0x8035 +#define ASYNC_RIO16_1 0x8031 +#define ASYNC_RIO16_2 0x8032 +#define ASYNC_RIO16_3 0x8033 +#define ASYNC_RIO16_4 0x8034 +#define ASYNC_RIO16_5 0x8035 #define ASYNC_CONNMODE 0x8036 #define ISP_CONN_LOOP 1 #define ISP_CONN_PTP 2 #define ISP_CONN_BADLIP 3 #define ISP_CONN_FATAL 4 #define ISP_CONN_LOOPBACK 5 -#define ASYNC_RIO_RESP 0x8040 -#define ASYNC_RIO_COMP 0x8042 +#define ASYNC_RIOZIO_STALL 0x8040 /* there's a RIO/ZIO entry that hasn't been serviced */ +#define ASYNC_RIO32_2_2200 0x8042 /* same as ASYNC_RIO32_2, but for 2100/2200 */ #define ASYNC_RCV_ERR 0x8048 /* @@ -287,11 +289,6 @@ */ #define QENTRY_LEN 64 -/* - * Special Internal Handle for IOCBs - */ -#define ISP_SPCL_HANDLE 0xa5dead5a - /* * Command Structure Definitions */ @@ -865,7 +862,7 @@ typedef struct { (ISP_CAP_MULTI_ID(isp) ? tag : 0) /* - * Reduced Interrupt Operation Response Queue Entreis + * Reduced Interrupt Operation Response Queue Entries */ typedef struct { diff --git a/sys/dev/isp/ispreg.h b/sys/dev/isp/ispreg.h index 08df337b88b9..2d616aeb1807 100644 --- a/sys/dev/isp/ispreg.h +++ b/sys/dev/isp/ispreg.h @@ -677,13 +677,13 @@ typedef struct { #define SXP_PINS_LVD_MODE 0x1000 #define SXP_PINS_HVD_MODE 0x0800 #define SXP_PINS_SE_MODE 0x0400 +#define SXP_PINS_MODE_MASK (SXP_PINS_LVD_MODE|SXP_PINS_HVD_MODE|SXP_PINS_SE_MODE) /* The above have to be put together with the DIFFM pin to make sense */ #define ISP1080_LVD_MODE (SXP_PINS_LVD_MODE) #define ISP1080_HVD_MODE (SXP_PINS_HVD_MODE|SXP_PINS_DIFF_MODE) #define ISP1080_SE_MODE (SXP_PINS_SE_MODE) -#define ISP1080_MODE_MASK \ - (SXP_PINS_LVD_MODE|SXP_PINS_HVD_MODE|SXP_PINS_SE_MODE|SXP_PINS_DIFF_MODE) +#define ISP1080_MODE_MASK (SXP_PINS_MODE_MASK|SXP_PINS_DIFF_MODE) /* * RISC and Host Command and Control Block Register Offsets diff --git a/sys/dev/isp/ispvar.h b/sys/dev/isp/ispvar.h index e568a1c9b765..5c8508c87c41 100644 --- a/sys/dev/isp/ispvar.h +++ b/sys/dev/isp/ispvar.h @@ -50,7 +50,7 @@ #include "ispmbox.h" #endif -#define ISP_CORE_VERSION_MAJOR 6 +#define ISP_CORE_VERSION_MAJOR 7 #define ISP_CORE_VERSION_MINOR 0 /* @@ -288,6 +288,53 @@ typedef struct { #define DOMAIN_CONTROLLER_BASE 0xFFFC00 #define DOMAIN_CONTROLLER_END 0xFFFCFF +/* + * Command Handles + * + * Most QLogic initiator or target have 32 bit handles associated with them. + * We want to have a quick way to index back and forth between a local SCSI + * command context and what the firmware is passing back to us. We also + * want to avoid working on stale information. This structure handles both + * at the expense of some local memory. + * + * The handle is architected thusly: + * + * 0 means "free handle" + * bits 0..12 index commands + * bits 13..15 bits index usage + * bits 16..31 contain a rolling sequence + * + * + */ +typedef struct { + void * cmd; /* associated command context */ + uint32_t handle; /* handle associated with this command */ +} isp_hdl_t; +#define ISP_HANDLE_FREE 0x00000000 +#define ISP_HANDLE_CMD_MASK 0x00001fff +#define ISP_HANDLE_USAGE_MASK 0x0000e000 +#define ISP_HANDLE_USAGE_SHIFT 13 +#define ISP_H2HT(hdl) ((hdl & ISP_HANDLE_USAGE_MASK) >> ISP_HANDLE_USAGE_SHIFT) +# define ISP_HANDLE_NONE 0 +# define ISP_HANDLE_INITIATOR 1 +# define ISP_HANDLE_TARGET 2 +#define ISP_HANDLE_SEQ_MASK 0xffff0000 +#define ISP_HANDLE_SEQ_SHIFT 16 +#define ISP_H2SEQ(hdl) ((hdl & ISP_HANDLE_SEQ_MASK) >> ISP_HANDLE_SEQ_SHIFT) +#define ISP_VALID_INI_HANDLE(c, hdl) \ + (ISP_H2HT(hdl) == ISP_HANDLE_INITIATOR && (hdl & ISP_HANDLE_CMD_MASK) < (c)->isp_maxcmds && \ + ISP_H2SEQ(hdl) == ISP_H2SEQ((c)->isp_xflist[hdl & ISP_HANDLE_CMD_MASK].handle)) +#ifdef ISP_TARGET_MODE +#define ISP_VALID_TGT_HANDLE(c, hdl) \ + (ISP_H2HT(hdl) == ISP_HANDLE_TARGET && (hdl & ISP_HANDLE_CMD_MASK) < (c)->isp_maxcmds && \ + ISP_H2SEQ(hdl) == ISP_H2SEQ((c)->isp_tgtlist[hdl & ISP_HANDLE_CMD_MASK].handle)) +#define ISP_VALID_HANDLE(c, hdl) \ + (ISP_VALID_INI_HANDLE((c), hdl) || ISP_VALID_TGT_HANDLE((c), hdl)) +#else +#define ISP_VALID_HANDLE ISP_VALID_INI_HANDLE +#endif +#define ISP_BAD_HANDLE_INDEX 0xffffffff + /* * FC Port Database entry. @@ -562,11 +609,11 @@ struct ispsoftc { isp_mboxbsy : 1, /* mailbox command active */ isp_state : 3, isp_nactive : 16; /* how many commands active */ + volatile mbreg_t isp_curmbx; /* currently active mailbox command */ volatile uint32_t isp_reqodx; /* index of last ISP pickup */ volatile uint32_t isp_reqidx; /* index of next request */ volatile uint32_t isp_residx; /* index of next result */ volatile uint32_t isp_resodx; /* index of next result */ - volatile uint32_t isp_lasthdls; /* last handle seed */ volatile uint32_t isp_obits; /* mailbox command output */ volatile uint32_t isp_serno; /* rolling serial number */ volatile uint16_t isp_mboxtmp[MAILBOX_STORAGE]; @@ -575,18 +622,21 @@ struct ispsoftc { volatile uint16_t isp_mbxwrk1; volatile uint16_t isp_mbxwrk2; volatile uint16_t isp_mbxwrk8; + volatile uint16_t isp_seqno; /* running sequence number */ void * isp_mbxworkp; /* * Active commands are stored here, indexed by handle functions. */ - XS_T **isp_xflist; + isp_hdl_t *isp_xflist; + isp_hdl_t *isp_xffree; #ifdef ISP_TARGET_MODE /* * Active target commands are stored here, indexed by handle functions. */ - void **isp_tgtlist; + isp_hdl_t *isp_tgtlist; + isp_hdl_t *isp_tgtfree; #endif /* diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index 51dea2236b7d..b6af7b8896bf 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2007 + * Copyright (c) 2007-2009 * Damien Bergamini * Copyright (c) 2008 * Benjamin Close @@ -19,7 +19,8 @@ */ /* - * Driver for Intel Wireless WiFi Link 4965AGN 802.11 network adapters. + * Driver for Intel WiFi Link 4965 and 1000/5000/6000 Series 802.11 network + * adapters. */ #include @@ -73,29 +74,30 @@ __FBSDID("$FreeBSD$"); static int iwn_probe(device_t); static int iwn_attach(device_t); -static int iwn_detach(device_t); -static int iwn_cleanup(device_t); +const struct iwn_hal *iwn_hal_attach(struct iwn_softc *); +void iwn_radiotap_attach(struct iwn_softc *); static struct ieee80211vap *iwn_vap_create(struct ieee80211com *, const char name[IFNAMSIZ], int unit, int opmode, int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t mac[IEEE80211_ADDR_LEN]); static void iwn_vap_delete(struct ieee80211vap *); -static int iwn_shutdown(device_t); -static int iwn_suspend(device_t); -static int iwn_resume(device_t); +static int iwn_cleanup(device_t); +static int iwn_detach(device_t); +int iwn_nic_lock(struct iwn_softc *); +int iwn_eeprom_lock(struct iwn_softc *); +int iwn_init_otprom(struct iwn_softc *); +int iwn_read_prom_data(struct iwn_softc *, uint32_t, void *, int); static int iwn_dma_contig_alloc(struct iwn_softc *, struct iwn_dma_info *, void **, bus_size_t, bus_size_t, int); static void iwn_dma_contig_free(struct iwn_dma_info *); -int iwn_alloc_shared(struct iwn_softc *); -void iwn_free_shared(struct iwn_softc *); +int iwn_alloc_sched(struct iwn_softc *); +void iwn_free_sched(struct iwn_softc *); int iwn_alloc_kw(struct iwn_softc *); void iwn_free_kw(struct iwn_softc *); +int iwn_alloc_ict(struct iwn_softc *); +void iwn_free_ict(struct iwn_softc *); int iwn_alloc_fwmem(struct iwn_softc *); void iwn_free_fwmem(struct iwn_softc *); -struct iwn_rbuf *iwn_alloc_rbuf(struct iwn_softc *); -void iwn_free_rbuf(void *, void *); -int iwn_alloc_rpool(struct iwn_softc *); -void iwn_free_rpool(struct iwn_softc *); int iwn_alloc_rx_ring(struct iwn_softc *, struct iwn_rx_ring *); void iwn_reset_rx_ring(struct iwn_softc *, struct iwn_rx_ring *); void iwn_free_rx_ring(struct iwn_softc *, struct iwn_rx_ring *); @@ -103,76 +105,117 @@ int iwn_alloc_tx_ring(struct iwn_softc *, struct iwn_tx_ring *, int); void iwn_reset_tx_ring(struct iwn_softc *, struct iwn_tx_ring *); void iwn_free_tx_ring(struct iwn_softc *, struct iwn_tx_ring *); -static struct ieee80211_node *iwn_node_alloc(struct ieee80211vap *, - const uint8_t [IEEE80211_ADDR_LEN]); +void iwn5000_ict_reset(struct iwn_softc *); +int iwn_read_eeprom(struct iwn_softc *, + uint8_t macaddr[IEEE80211_ADDR_LEN]); +void iwn4965_read_eeprom(struct iwn_softc *); +void iwn4965_print_power_group(struct iwn_softc *, int); +void iwn5000_read_eeprom(struct iwn_softc *); +static void iwn_read_eeprom_channels(struct iwn_softc *, int, + uint32_t); +void iwn_read_eeprom_enhinfo(struct iwn_softc *); +struct ieee80211_node *iwn_node_alloc(struct ieee80211vap *, + const uint8_t mac[IEEE80211_ADDR_LEN]); void iwn_newassoc(struct ieee80211_node *, int); int iwn_media_change(struct ifnet *); int iwn_newstate(struct ieee80211vap *, enum ieee80211_state, int); -void iwn_mem_lock(struct iwn_softc *); -void iwn_mem_unlock(struct iwn_softc *); -uint32_t iwn_mem_read(struct iwn_softc *, uint32_t); -void iwn_mem_write(struct iwn_softc *, uint32_t, uint32_t); -void iwn_mem_write_region_4(struct iwn_softc *, uint32_t, - const uint32_t *, int); -int iwn_eeprom_lock(struct iwn_softc *); -void iwn_eeprom_unlock(struct iwn_softc *); -int iwn_read_prom_data(struct iwn_softc *, uint32_t, void *, int); -int iwn_transfer_microcode(struct iwn_softc *, const uint8_t *, int); -int iwn_transfer_firmware(struct iwn_softc *); -int iwn_load_firmware(struct iwn_softc *); -void iwn_unload_firmware(struct iwn_softc *); +void iwn_rx_phy(struct iwn_softc *, struct iwn_rx_desc *, + struct iwn_rx_data *); static void iwn_timer_timeout(void *); static void iwn_calib_reset(struct iwn_softc *); -void iwn_ampdu_rx_start(struct iwn_softc *, struct iwn_rx_desc *); -void iwn_rx_intr(struct iwn_softc *, struct iwn_rx_desc *, +void iwn_rx_done(struct iwn_softc *, struct iwn_rx_desc *, struct iwn_rx_data *); -void iwn_rx_statistics(struct iwn_softc *, struct iwn_rx_desc *); -void iwn_tx_intr(struct iwn_softc *, struct iwn_rx_desc *); -void iwn_cmd_intr(struct iwn_softc *, struct iwn_rx_desc *); +#if 0 /* HT */ +void iwn_rx_compressed_ba(struct iwn_softc *, struct iwn_rx_desc *, + struct iwn_rx_data *); +#endif +void iwn5000_rx_calib_results(struct iwn_softc *, + struct iwn_rx_desc *, struct iwn_rx_data *); +void iwn_rx_statistics(struct iwn_softc *, struct iwn_rx_desc *, + struct iwn_rx_data *); +void iwn4965_tx_done(struct iwn_softc *, struct iwn_rx_desc *, + struct iwn_rx_data *); +void iwn5000_tx_done(struct iwn_softc *, struct iwn_rx_desc *, + struct iwn_rx_data *); +void iwn_tx_done(struct iwn_softc *, struct iwn_rx_desc *, int, + uint8_t); +void iwn_cmd_done(struct iwn_softc *, struct iwn_rx_desc *); void iwn_notif_intr(struct iwn_softc *); +void iwn_wakeup_intr(struct iwn_softc *); +void iwn_rftoggle_intr(struct iwn_softc *); +void iwn_fatal_intr(struct iwn_softc *); void iwn_intr(void *); -void iwn_read_eeprom(struct iwn_softc *, - uint8_t macaddr[IEEE80211_ADDR_LEN]); -static void iwn_read_eeprom_channels(struct iwn_softc *); -void iwn_print_power_group(struct iwn_softc *, int); -uint8_t iwn_plcp_signal(int); +void iwn4965_update_sched(struct iwn_softc *, int, int, uint8_t, + uint16_t); +void iwn5000_update_sched(struct iwn_softc *, int, int, uint8_t, + uint16_t); +void iwn5000_reset_sched(struct iwn_softc *, int, int); int iwn_tx_data(struct iwn_softc *, struct mbuf *, struct ieee80211_node *, struct iwn_tx_ring *); -void iwn_start(struct ifnet *); -void iwn_start_locked(struct ifnet *); static int iwn_raw_xmit(struct ieee80211_node *, struct mbuf *, const struct ieee80211_bpf_params *); -static void iwn_watchdog(struct iwn_softc *); +void iwn_start(struct ifnet *); +void iwn_start_locked(struct ifnet *); +static void iwn_watchdog(struct iwn_softc *sc); int iwn_ioctl(struct ifnet *, u_long, caddr_t); int iwn_cmd(struct iwn_softc *, int, const void *, int, int); -int iwn_set_link_quality(struct iwn_softc *, uint8_t, - const struct ieee80211_channel *, int); -int iwn_set_key(struct ieee80211com *, struct ieee80211_node *, - const struct ieee80211_key *); +int iwn4965_add_node(struct iwn_softc *, struct iwn_node_info *, + int); +int iwn5000_add_node(struct iwn_softc *, struct iwn_node_info *, + int); +int iwn_set_link_quality(struct iwn_softc *, uint8_t, int); +int iwn_add_broadcast_node(struct iwn_softc *, int); int iwn_wme_update(struct ieee80211com *); +static void iwn_update_mcast(struct ifnet *); void iwn_set_led(struct iwn_softc *, uint8_t, uint8_t, uint8_t); int iwn_set_critical_temp(struct iwn_softc *); -void iwn_enable_tsf(struct iwn_softc *, struct ieee80211_node *); -void iwn_power_calibration(struct iwn_softc *, int); -int iwn_set_txpower(struct iwn_softc *, +int iwn_set_timing(struct iwn_softc *, struct ieee80211_node *); +void iwn4965_power_calibration(struct iwn_softc *, int); +int iwn4965_set_txpower(struct iwn_softc *, struct ieee80211_channel *, int); -int8_t iwn_get_rssi(struct iwn_softc *, const struct iwn_rx_stat *); +int iwn5000_set_txpower(struct iwn_softc *, + struct ieee80211_channel *, int); +int iwn4965_get_rssi(struct iwn_softc *, struct iwn_rx_stat *); +int iwn5000_get_rssi(struct iwn_softc *, struct iwn_rx_stat *); int iwn_get_noise(const struct iwn_rx_general_stats *); -int iwn_get_temperature(struct iwn_softc *); +int iwn4965_get_temperature(struct iwn_softc *); +int iwn5000_get_temperature(struct iwn_softc *); int iwn_init_sensitivity(struct iwn_softc *); -void iwn_compute_differential_gain(struct iwn_softc *, +void iwn_collect_noise(struct iwn_softc *, const struct iwn_rx_general_stats *); +int iwn4965_init_gains(struct iwn_softc *); +int iwn5000_init_gains(struct iwn_softc *); +int iwn4965_set_gains(struct iwn_softc *); +int iwn5000_set_gains(struct iwn_softc *); void iwn_tune_sensitivity(struct iwn_softc *, const struct iwn_rx_stats *); int iwn_send_sensitivity(struct iwn_softc *); -int iwn_auth(struct iwn_softc *, struct ieee80211vap *); -int iwn_run(struct iwn_softc *, struct ieee80211vap *); -int iwn_scan(struct iwn_softc *); +int iwn_set_pslevel(struct iwn_softc *, int, int, int); int iwn_config(struct iwn_softc *); -void iwn_post_alive(struct iwn_softc *); -void iwn_stop_master(struct iwn_softc *); -int iwn_reset(struct iwn_softc *); -void iwn_hw_config(struct iwn_softc *); +int iwn_scan(struct iwn_softc *); +int iwn_auth(struct iwn_softc *, struct ieee80211vap *vap); +int iwn_run(struct iwn_softc *, struct ieee80211vap *vap); +int iwn5000_query_calibration(struct iwn_softc *); +int iwn5000_send_calibration(struct iwn_softc *); +int iwn5000_send_wimax_coex(struct iwn_softc *); +int iwn4965_post_alive(struct iwn_softc *); +int iwn5000_post_alive(struct iwn_softc *); +int iwn4965_load_bootcode(struct iwn_softc *, const uint8_t *, + int); +int iwn4965_load_firmware(struct iwn_softc *); +int iwn5000_load_firmware_section(struct iwn_softc *, uint32_t, + const uint8_t *, int); +int iwn5000_load_firmware(struct iwn_softc *); +int iwn_read_firmware(struct iwn_softc *); +int iwn_clock_wait(struct iwn_softc *); +int iwn_apm_init(struct iwn_softc *); +void iwn_apm_stop_master(struct iwn_softc *); +void iwn_apm_stop(struct iwn_softc *); +int iwn4965_nic_config(struct iwn_softc *); +int iwn5000_nic_config(struct iwn_softc *); +int iwn_hw_prepare(struct iwn_softc *); +int iwn_hw_init(struct iwn_softc *); +void iwn_hw_stop(struct iwn_softc *); void iwn_init_locked(struct iwn_softc *); void iwn_init(void *); void iwn_stop_locked(struct iwn_softc *); @@ -182,10 +225,16 @@ static void iwn_scan_end(struct ieee80211com *); static void iwn_set_channel(struct ieee80211com *); static void iwn_scan_curchan(struct ieee80211_scan_state *, unsigned long); static void iwn_scan_mindwell(struct ieee80211_scan_state *); -static void iwn_hwreset(void *, int); -static void iwn_radioon(void *, int); -static void iwn_radiooff(void *, int); +static int iwn_setregdomain(struct ieee80211com *, + struct ieee80211_regdomain *, int, + struct ieee80211_channel []); +static void iwn_hw_reset(void *, int); +static void iwn_radio_on(void *, int); +static void iwn_radio_off(void *, int); static void iwn_sysctlattach(struct iwn_softc *); +static int iwn_shutdown(device_t); +static int iwn_suspend(device_t); +static int iwn_resume(device_t); #define IWN_DEBUG #ifdef IWN_DEBUG @@ -224,26 +273,101 @@ struct iwn_ident { }; static const struct iwn_ident iwn_ident_table [] = { - { 0x8086, 0x4229, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x422D, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4230, "Intel(R) PRO/Wireless 4965BGN" }, - { 0x8086, 0x4233, "Intel(R) PRO/Wireless 4965BGN" }, - { 0, 0, NULL } + { 0x8086, 0x4229, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x422D, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x4230, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x4233, "Intel(R) PRO/Wireless 4965BGN" }, + { 0x8086, 0x4232, "Intel(R) PRO/Wireless 5100" }, + { 0x8086, 0x4237, "Intel(R) PRO/Wireless 5100" }, + { 0x8086, 0x423C, "Intel(R) PRO/Wireless 5150" }, + { 0x8086, 0x423D, "Intel(R) PRO/Wireless 5150" }, + { 0x8086, 0x4235, "Intel(R) PRO/Wireless 5300" }, + { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5300" }, + { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5350" }, + { 0x8086, 0x423A, "Intel(R) PRO/Wireless 5350" }, + { 0x8086, 0x423B, "Intel(R) PRO/Wireless 5350" }, + { 0x8086, 0x0083, "Intel(R) PRO/Wireless 1000" }, + { 0x8086, 0x0084, "Intel(R) PRO/Wireless 1000" }, + { 0x8086, 0x008D, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x008E, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x4238, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x4239, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x422B, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x422C, "Intel(R) PRO/Wireless 6000" }, + { 0x8086, 0x0086, "Intel(R) PRO/Wireless 6050" }, + { 0x8086, 0x0087, "Intel(R) PRO/Wireless 6050" }, + { 0, 0, NULL } +}; + +static const struct iwn_hal iwn4965_hal = { + iwn4965_load_firmware, + iwn4965_read_eeprom, + iwn4965_post_alive, + iwn4965_nic_config, + iwn4965_update_sched, + iwn4965_get_temperature, + iwn4965_get_rssi, + iwn4965_set_txpower, + iwn4965_init_gains, + iwn4965_set_gains, + iwn4965_add_node, + iwn4965_tx_done, +#if 0 /* HT */ + iwn4965_ampdu_tx_start, + iwn4965_ampdu_tx_stop, +#endif + IWN4965_NTXQUEUES, + IWN4965_NDMACHNLS, + IWN4965_ID_BROADCAST, + IWN4965_RXONSZ, + IWN4965_SCHEDSZ, + IWN4965_FW_TEXT_MAXSZ, + IWN4965_FW_DATA_MAXSZ, + IWN4965_FWSZ, + IWN4965_SCHED_TXFACT +}; + +static const struct iwn_hal iwn5000_hal = { + iwn5000_load_firmware, + iwn5000_read_eeprom, + iwn5000_post_alive, + iwn5000_nic_config, + iwn5000_update_sched, + iwn5000_get_temperature, + iwn5000_get_rssi, + iwn5000_set_txpower, + iwn5000_init_gains, + iwn5000_set_gains, + iwn5000_add_node, + iwn5000_tx_done, +#if 0 /* HT */ + iwn5000_ampdu_tx_start, + iwn5000_ampdu_tx_stop, +#endif + IWN5000_NTXQUEUES, + IWN5000_NDMACHNLS, + IWN5000_ID_BROADCAST, + IWN5000_RXONSZ, + IWN5000_SCHEDSZ, + IWN5000_FW_TEXT_MAXSZ, + IWN5000_FW_DATA_MAXSZ, + IWN5000_FWSZ, + IWN5000_SCHED_TXFACT }; static int iwn_probe(device_t dev) { - const struct iwn_ident *ident; + const struct iwn_ident *ident; - for (ident = iwn_ident_table; ident->name != NULL; ident++) { - if (pci_get_vendor(dev) == ident->vendor && - pci_get_device(dev) == ident->device) { - device_set_desc(dev, ident->name); - return 0; - } - } - return ENXIO; + for (ident = iwn_ident_table; ident->name != NULL; ident++) { + if (pci_get_vendor(dev) == ident->vendor && + pci_get_device(dev) == ident->device) { + device_set_desc(dev, ident->name); + return 0; + } + } + return ENXIO; } static int @@ -252,30 +376,44 @@ iwn_attach(device_t dev) struct iwn_softc *sc = (struct iwn_softc *)device_get_softc(dev); struct ieee80211com *ic; struct ifnet *ifp; + const struct iwn_hal *hal; + uint32_t tmp; int i, error, result; uint8_t macaddr[IEEE80211_ADDR_LEN]; sc->sc_dev = dev; - /* XXX */ - if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) { - device_printf(dev, "chip is in D%d power mode " - "-- setting to D0\n", pci_get_powerstate(dev)); - pci_set_powerstate(dev, PCI_POWERSTATE_D0); + /* + * Get the offset of the PCI Express Capability Structure in PCI + * Configuration Space. + */ + error = pci_find_extcap(dev, PCIY_EXPRESS, &sc->sc_cap_off); + if (error != 0) { + device_printf(dev, "PCIe capability structure not found!\n"); + return error; } - /* clear device specific PCI configuration register 0x41 */ + /* Clear device-specific "PCI retry timeout" register (41h). */ pci_write_config(dev, 0x41, 0, 1); - /* enable bus-mastering */ + /* Hardware bug workaround. */ + tmp = pci_read_config(dev, PCIR_COMMAND, 1); + if (tmp & PCIM_CMD_INTxDIS) { + DPRINTF(sc, IWN_DEBUG_RESET, "%s: PCIe INTx Disable set\n", + __func__); + tmp &= ~PCIM_CMD_INTxDIS; + pci_write_config(dev, PCIR_COMMAND, tmp, 1); + } + + /* Enable bus-mastering. */ pci_enable_busmaster(dev); - sc->mem_rid= PCIR_BAR(0); + sc->mem_rid = PCIR_BAR(0); sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, - RF_ACTIVE); + RF_ACTIVE); if (sc->mem == NULL ) { device_printf(dev, "could not allocate memory resources\n"); - error = ENOMEM; + error = ENOMEM; return error; } @@ -286,63 +424,69 @@ iwn_attach(device_t dev) pci_alloc_msi(dev, &result) == 0) sc->irq_rid = 1; sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, - RF_ACTIVE | RF_SHAREABLE); + RF_ACTIVE | RF_SHAREABLE); if (sc->irq == NULL) { device_printf(dev, "could not allocate interrupt resource\n"); error = ENOMEM; - return error; + goto fail; } IWN_LOCK_INIT(sc); callout_init_mtx(&sc->sc_timer_to, &sc->sc_mtx, 0); - TASK_INIT(&sc->sc_reinit_task, 0, iwn_hwreset, sc ); - TASK_INIT(&sc->sc_radioon_task, 0, iwn_radioon, sc ); - TASK_INIT(&sc->sc_radiooff_task, 0, iwn_radiooff, sc ); + TASK_INIT(&sc->sc_reinit_task, 0, iwn_hw_reset, sc ); + TASK_INIT(&sc->sc_radioon_task, 0, iwn_radio_on, sc ); + TASK_INIT(&sc->sc_radiooff_task, 0, iwn_radio_off, sc ); - /* - * Put adapter into a known state. - */ - error = iwn_reset(sc); - if (error != 0) { - device_printf(dev, - "could not reset adapter, error %d\n", error); + /* Attach Hardware Abstraction Layer. */ + hal = iwn_hal_attach(sc); + if (hal == NULL) { + error = ENXIO; /* XXX: Wrong error code? */ goto fail; } - /* - * Allocate DMA memory for firmware transfers. - */ + error = iwn_hw_prepare(sc); + if (error != 0) { + device_printf(dev, "hardware not ready, error %d\n", error); + goto fail; + } + + /* Allocate DMA memory for firmware transfers. */ error = iwn_alloc_fwmem(sc); if (error != 0) { device_printf(dev, - "could not allocate firmware memory, error %d\n", error); + "could not allocate memory for firmware, error %d\n", + error); goto fail; } - /* - * Allocate a "keep warm" page. - */ + /* Allocate "Keep Warm" page. */ error = iwn_alloc_kw(sc); if (error != 0) { device_printf(dev, - "could not allocate keep-warm page, error %d\n", error); + "could not allocate \"Keep Warm\" page, error %d\n", error); goto fail; } - /* - * Allocate shared area (communication area). - */ - error = iwn_alloc_shared(sc); + /* Allocate ICT table for 5000 Series. */ + if (sc->hw_type != IWN_HW_REV_TYPE_4965 && + (error = iwn_alloc_ict(sc)) != 0) { + device_printf(dev, + "%s: could not allocate ICT table, error %d\n", + __func__, error); + goto fail; + } + + /* Allocate TX scheduler "rings". */ + error = iwn_alloc_sched(sc); if (error != 0) { device_printf(dev, - "could not allocate shared area, error %d\n", error); + "could not allocate TX scheduler rings, error %d\n", + error); goto fail; } - /* - * Allocate Tx rings. - */ - for (i = 0; i < IWN_NTXQUEUES; i++) { + /* Allocate TX rings (16 on 4965AGN, 20 on 5000). */ + for (i = 0; i < hal->ntxqs; i++) { error = iwn_alloc_tx_ring(sc, &sc->txq[i], i); if (error != 0) { device_printf(dev, @@ -352,6 +496,7 @@ iwn_attach(device_t dev) } } + /* Allocate RX ring. */ error = iwn_alloc_rx_ring(sc, &sc->rxq); if (error != 0 ){ device_printf(dev, @@ -359,6 +504,19 @@ iwn_attach(device_t dev) goto fail; } + /* Clear pending interrupts. */ + IWN_WRITE(sc, IWN_INT, 0xffffffff); + + /* Count the number of available chains. */ + sc->ntxchains = + ((sc->txchainmask >> 2) & 1) + + ((sc->txchainmask >> 1) & 1) + + ((sc->txchainmask >> 0) & 1); + sc->nrxchains = + ((sc->rxchainmask >> 2) & 1) + + ((sc->rxchainmask >> 1) & 1) + + ((sc->rxchainmask >> 0) & 1); + ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); if (ifp == NULL) { device_printf(dev, "can not allocate ifnet structure\n"); @@ -366,11 +524,11 @@ iwn_attach(device_t dev) } ic = ifp->if_l2com; - ic->ic_ifp = ifp; + ic->ic_ifp = ifp; ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ - /* set device capabilities */ + /* Set device capabilities. */ ic->ic_caps = IEEE80211_C_STA /* station mode supported */ | IEEE80211_C_MONITOR /* monitor mode supported */ @@ -378,13 +536,13 @@ iwn_attach(device_t dev) | IEEE80211_C_SHSLOT /* short slot time supported */ | IEEE80211_C_WPA | IEEE80211_C_SHPREAMBLE /* short preamble supported */ -#if 0 | IEEE80211_C_BGSCAN /* background scanning */ +#if 0 | IEEE80211_C_IBSS /* ibss/adhoc mode */ #endif | IEEE80211_C_WME /* WME */ ; -#if 0 +#if 0 /* HT */ /* XXX disable until HT channel setup works */ ic->ic_htcaps = IEEE80211_HTCAP_SMPS_ENA /* SM PS mode enabled */ @@ -398,9 +556,40 @@ iwn_attach(device_t dev) | IEEE80211_HTC_AMPDU /* tx A-MPDU */ | IEEE80211_HTC_AMSDU /* tx A-MSDU */ ; + + /* Set HT capabilities. */ + ic->ic_htcaps = +#if IWN_RBUF_SIZE == 8192 + IEEE80211_HTCAP_AMSDU7935 | +#endif + IEEE80211_HTCAP_SMPS_DIS | + IEEE80211_HTCAP_CBW20_40 | + IEEE80211_HTCAP_SGI20 | + IEEE80211_HTCAP_SGI40; + if (sc->hw_type != IWN_HW_REV_TYPE_4965) + ic->ic_htcaps |= IEEE80211_HTCAP_GF; +#endif + + /* Read MAC address, channels, etc from EEPROM. */ + error = iwn_read_eeprom(sc, macaddr); + if (error != 0) { + device_printf(dev, "could not read EEPROM, error %d\n", + error); + goto fail; + } + + device_printf(sc->sc_dev, "MIMO %dT%dR, %.4s, address %6D\n", + sc->ntxchains, sc->nrxchains, sc->eeprom_domain, + macaddr, ":"); + +#if 0 /* HT */ + /* Set supported HT rates. */ + ic->ic_sup_mcs[0] = 0xff; + if (sc->nrxchains > 1) + ic->ic_sup_mcs[1] = 0xff; + if (sc->nrxchains > 2) + ic->ic_sup_mcs[2] = 0xff; #endif - /* read supported channels and MAC address from EEPROM */ - iwn_read_eeprom(sc, macaddr); if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_softc = sc; @@ -408,7 +597,7 @@ iwn_attach(device_t dev) ifp->if_init = iwn_init; ifp->if_ioctl = iwn_ioctl; ifp->if_start = iwn_start; - IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); @@ -418,85 +607,130 @@ iwn_attach(device_t dev) ic->ic_raw_xmit = iwn_raw_xmit; ic->ic_node_alloc = iwn_node_alloc; ic->ic_newassoc = iwn_newassoc; - ic->ic_wme.wme_update = iwn_wme_update; - ic->ic_scan_start = iwn_scan_start; - ic->ic_scan_end = iwn_scan_end; - ic->ic_set_channel = iwn_set_channel; - ic->ic_scan_curchan = iwn_scan_curchan; - ic->ic_scan_mindwell = iwn_scan_mindwell; - - ieee80211_radiotap_attach(ic, - &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), - IWN_TX_RADIOTAP_PRESENT, - &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), - IWN_RX_RADIOTAP_PRESENT); + ic->ic_wme.wme_update = iwn_wme_update; + ic->ic_update_mcast = iwn_update_mcast; + ic->ic_scan_start = iwn_scan_start; + ic->ic_scan_end = iwn_scan_end; + ic->ic_set_channel = iwn_set_channel; + ic->ic_scan_curchan = iwn_scan_curchan; + ic->ic_scan_mindwell = iwn_scan_mindwell; + ic->ic_setregdomain = iwn_setregdomain; +#if 0 /* HT */ + ic->ic_ampdu_rx_start = iwn_ampdu_rx_start; + ic->ic_ampdu_rx_stop = iwn_ampdu_rx_stop; + ic->ic_ampdu_tx_start = iwn_ampdu_tx_start; + ic->ic_ampdu_tx_stop = iwn_ampdu_tx_stop; +#endif + iwn_radiotap_attach(sc); iwn_sysctlattach(sc); - /* - * Hook our interrupt after all initialization is complete. - */ - error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, + /* + * Hook our interrupt after all initialization is complete. + */ + error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, NULL, iwn_intr, sc, &sc->sc_ih); - if (error != 0) { - device_printf(dev, "could not set up interrupt, error %d\n", error); - goto fail; - } + if (error != 0) { + device_printf(dev, "could not set up interrupt, error %d\n", + error); + goto fail; + } - ieee80211_announce(ic); + ieee80211_announce(ic); return 0; fail: iwn_cleanup(dev); return error; } -static int -iwn_detach(device_t dev) +const struct iwn_hal * +iwn_hal_attach(struct iwn_softc *sc) { - iwn_cleanup(dev); - return 0; + sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> 4) & 0xf; + + switch (sc->hw_type) { + case IWN_HW_REV_TYPE_4965: + sc->sc_hal = &iwn4965_hal; + sc->limits = &iwn4965_sensitivity_limits; + sc->fwname = "iwn4965fw"; + sc->txchainmask = IWN_ANT_AB; + sc->rxchainmask = IWN_ANT_ABC; + break; + case IWN_HW_REV_TYPE_5100: + sc->sc_hal = &iwn5000_hal; + sc->limits = &iwn5000_sensitivity_limits; + sc->fwname = "iwn5000fw"; + sc->txchainmask = IWN_ANT_B; + sc->rxchainmask = IWN_ANT_AB; + break; + case IWN_HW_REV_TYPE_5150: + sc->sc_hal = &iwn5000_hal; + sc->limits = &iwn5150_sensitivity_limits; + sc->fwname = "iwn5150fw"; + sc->txchainmask = IWN_ANT_A; + sc->rxchainmask = IWN_ANT_AB; + break; + case IWN_HW_REV_TYPE_5300: + case IWN_HW_REV_TYPE_5350: + sc->sc_hal = &iwn5000_hal; + sc->limits = &iwn5000_sensitivity_limits; + sc->fwname = "iwn5000fw"; + sc->txchainmask = IWN_ANT_ABC; + sc->rxchainmask = IWN_ANT_ABC; + break; + case IWN_HW_REV_TYPE_1000: + sc->sc_hal = &iwn5000_hal; + sc->limits = &iwn5000_sensitivity_limits; + sc->fwname = "iwn1000fw"; + sc->txchainmask = IWN_ANT_A; + sc->rxchainmask = IWN_ANT_AB; + break; + case IWN_HW_REV_TYPE_6000: + sc->sc_hal = &iwn5000_hal; + sc->limits = &iwn6000_sensitivity_limits; + sc->fwname = "iwn6000fw"; + switch (pci_get_device(sc->sc_dev)) { + case 0x422C: + case 0x4239: + sc->sc_flags |= IWN_FLAG_INTERNAL_PA; + sc->txchainmask = IWN_ANT_BC; + sc->rxchainmask = IWN_ANT_BC; + break; + default: + sc->txchainmask = IWN_ANT_ABC; + sc->rxchainmask = IWN_ANT_ABC; + break; + } + break; + case IWN_HW_REV_TYPE_6050: + sc->sc_hal = &iwn5000_hal; + sc->limits = &iwn6000_sensitivity_limits; + sc->fwname = "iwn6000fw"; + sc->txchainmask = IWN_ANT_AB; + sc->rxchainmask = IWN_ANT_AB; + break; + default: + device_printf(sc->sc_dev, "adapter type %d not supported\n", + sc->hw_type); + return NULL; + } + return sc->sc_hal; } /* - * Cleanup any device resources that were allocated + * Attach the interface to 802.11 radiotap. */ -int -iwn_cleanup(device_t dev) +void +iwn_radiotap_attach(struct iwn_softc *sc) { - struct iwn_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - int i; - ieee80211_draintask(ic, &sc->sc_reinit_task); - ieee80211_draintask(ic, &sc->sc_radioon_task); - ieee80211_draintask(ic, &sc->sc_radiooff_task); - - if (ifp != NULL) { - iwn_stop(sc); - callout_drain(&sc->sc_timer_to); - ieee80211_ifdetach(ic); - } - - iwn_unload_firmware(sc); - - iwn_free_rx_ring(sc, &sc->rxq); - for (i = 0; i < IWN_NTXQUEUES; i++) - iwn_free_tx_ring(sc, &sc->txq[i]); - iwn_free_kw(sc); - iwn_free_fwmem(sc); - if (sc->irq != NULL) { - bus_teardown_intr(dev, sc->irq, sc->sc_ih); - bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); - if (sc->irq_rid == 1) - pci_release_msi(dev); - } - if (sc->mem != NULL) - bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem); - if (ifp != NULL) - if_free(ifp); - IWN_LOCK_DESTROY(sc); - return 0; + ieee80211_radiotap_attach(ic, + &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), + IWN_TX_RADIOTAP_PRESENT, + &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), + IWN_RX_RADIOTAP_PRESENT); } static struct ieee80211vap * @@ -517,17 +751,18 @@ iwn_vap_create(struct ieee80211com *ic, vap = &ivp->iv_vap; ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac); vap->iv_bmissthreshold = 10; /* override default */ - /* override with driver methods */ + /* Override with driver methods. */ ivp->iv_newstate = vap->iv_newstate; vap->iv_newstate = iwn_newstate; ieee80211_amrr_init(&ivp->iv_amrr, vap, IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD, IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD, - 500 /*ms*/); + 500 /* ms */); - /* complete setup */ - ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status); + /* Complete setup. */ + ieee80211_vap_attach(vap, ieee80211_media_change, + ieee80211_media_status); ic->ic_opmode = opmode; return vap; } @@ -542,71 +777,313 @@ iwn_vap_delete(struct ieee80211vap *vap) free(ivp, M_80211_VAP); } -static int -iwn_shutdown(device_t dev) -{ - struct iwn_softc *sc = device_get_softc(dev); - - iwn_stop(sc); - return 0; -} - -static int -iwn_suspend(device_t dev) -{ - struct iwn_softc *sc = device_get_softc(dev); - - iwn_stop(sc); - return 0; -} - -static int -iwn_resume(device_t dev) +int +iwn_cleanup(device_t dev) { struct iwn_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic; + int i; - pci_write_config(dev, 0x41, 0, 1); + if (ifp != NULL) { + ic = ifp->if_l2com; - if (ifp->if_flags & IFF_UP) - iwn_init(sc); + ieee80211_draintask(ic, &sc->sc_reinit_task); + ieee80211_draintask(ic, &sc->sc_radioon_task); + ieee80211_draintask(ic, &sc->sc_radiooff_task); + + iwn_stop(sc); + callout_drain(&sc->sc_timer_to); + ieee80211_ifdetach(ic); + } + + /* Free DMA resources. */ + iwn_free_rx_ring(sc, &sc->rxq); + if (sc->sc_hal != NULL) + for (i = 0; i < sc->sc_hal->ntxqs; i++) + iwn_free_tx_ring(sc, &sc->txq[i]); + iwn_free_sched(sc); + iwn_free_kw(sc); + if (sc->ict != NULL) + iwn_free_ict(sc); + iwn_free_fwmem(sc); + + if (sc->irq != NULL) { + bus_teardown_intr(dev, sc->irq, sc->sc_ih); + bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); + if (sc->irq_rid == 1) + pci_release_msi(dev); + } + + if (sc->mem != NULL) + bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem); + + if (ifp != NULL) + if_free(ifp); + + IWN_LOCK_DESTROY(sc); + return 0; +} + +static int +iwn_detach(device_t dev) +{ + iwn_cleanup(dev); + return 0; +} + +int +iwn_nic_lock(struct iwn_softc *sc) +{ + int ntries; + + /* Request exclusive access to NIC. */ + IWN_SETBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ); + + /* Spin until we actually get the lock. */ + for (ntries = 0; ntries < 1000; ntries++) { + if ((IWN_READ(sc, IWN_GP_CNTRL) & + (IWN_GP_CNTRL_MAC_ACCESS_ENA | IWN_GP_CNTRL_SLEEP)) == + IWN_GP_CNTRL_MAC_ACCESS_ENA) + return 0; + DELAY(10); + } + return ETIMEDOUT; +} + +static __inline void +iwn_nic_unlock(struct iwn_softc *sc) +{ + IWN_CLRBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ); +} + +static __inline uint32_t +iwn_prph_read(struct iwn_softc *sc, uint32_t addr) +{ + IWN_WRITE(sc, IWN_PRPH_RADDR, IWN_PRPH_DWORD | addr); + IWN_BARRIER_READ_WRITE(sc); + return IWN_READ(sc, IWN_PRPH_RDATA); +} + +static __inline void +iwn_prph_write(struct iwn_softc *sc, uint32_t addr, uint32_t data) +{ + IWN_WRITE(sc, IWN_PRPH_WADDR, IWN_PRPH_DWORD | addr); + IWN_BARRIER_WRITE(sc); + IWN_WRITE(sc, IWN_PRPH_WDATA, data); +} + +static __inline void +iwn_prph_setbits(struct iwn_softc *sc, uint32_t addr, uint32_t mask) +{ + iwn_prph_write(sc, addr, iwn_prph_read(sc, addr) | mask); +} + +static __inline void +iwn_prph_clrbits(struct iwn_softc *sc, uint32_t addr, uint32_t mask) +{ + iwn_prph_write(sc, addr, iwn_prph_read(sc, addr) & ~mask); +} + +static __inline void +iwn_prph_write_region_4(struct iwn_softc *sc, uint32_t addr, + const uint32_t *data, int count) +{ + for (; count > 0; count--, data++, addr += 4) + iwn_prph_write(sc, addr, *data); +} + +static __inline uint32_t +iwn_mem_read(struct iwn_softc *sc, uint32_t addr) +{ + IWN_WRITE(sc, IWN_MEM_RADDR, addr); + IWN_BARRIER_READ_WRITE(sc); + return IWN_READ(sc, IWN_MEM_RDATA); +} + +static __inline void +iwn_mem_write(struct iwn_softc *sc, uint32_t addr, uint32_t data) +{ + IWN_WRITE(sc, IWN_MEM_WADDR, addr); + IWN_BARRIER_WRITE(sc); + IWN_WRITE(sc, IWN_MEM_WDATA, data); +} + +static __inline void +iwn_mem_write_2(struct iwn_softc *sc, uint32_t addr, uint16_t data) +{ + uint32_t tmp; + + tmp = iwn_mem_read(sc, addr & ~3); + if (addr & 3) + tmp = (tmp & 0x0000ffff) | data << 16; + else + tmp = (tmp & 0xffff0000) | data; + iwn_mem_write(sc, addr & ~3, tmp); +} + +static __inline void +iwn_mem_read_region_4(struct iwn_softc *sc, uint32_t addr, uint32_t *data, + int count) +{ + for (; count > 0; count--, addr += 4) + *data++ = iwn_mem_read(sc, addr); +} + +static __inline void +iwn_mem_set_region_4(struct iwn_softc *sc, uint32_t addr, uint32_t val, + int count) +{ + for (; count > 0; count--, addr += 4) + iwn_mem_write(sc, addr, val); +} + +int +iwn_eeprom_lock(struct iwn_softc *sc) +{ + int i, ntries; + + for (i = 0; i < 100; i++) { + /* Request exclusive access to EEPROM. */ + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, + IWN_HW_IF_CONFIG_EEPROM_LOCKED); + + /* Spin until we actually get the lock. */ + for (ntries = 0; ntries < 100; ntries++) { + if (IWN_READ(sc, IWN_HW_IF_CONFIG) & + IWN_HW_IF_CONFIG_EEPROM_LOCKED) + return 0; + DELAY(10); + } + } + return ETIMEDOUT; +} + +static __inline void +iwn_eeprom_unlock(struct iwn_softc *sc) +{ + IWN_CLRBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_EEPROM_LOCKED); +} + +/* + * Initialize access by host to One Time Programmable ROM. + * NB: This kind of ROM can be found on 1000 or 6000 Series only. + */ +int +iwn_init_otprom(struct iwn_softc *sc) +{ + uint16_t prev, base, next; + int count, error; + + /* Wait for clock stabilization before accessing prph. */ + error = iwn_clock_wait(sc); + if (error != 0) + return error; + + error = iwn_nic_lock(sc); + if (error != 0) + return error; + iwn_prph_setbits(sc, IWN_APMG_PS, IWN_APMG_PS_RESET_REQ); + DELAY(5); + iwn_prph_clrbits(sc, IWN_APMG_PS, IWN_APMG_PS_RESET_REQ); + iwn_nic_unlock(sc); + + /* Set auto clock gate disable bit for HW with OTP shadow RAM. */ + if (sc->hw_type != IWN_HW_REV_TYPE_1000) { + IWN_SETBITS(sc, IWN_DBG_LINK_PWR_MGMT, + IWN_RESET_LINK_PWR_MGMT_DIS); + } + IWN_CLRBITS(sc, IWN_EEPROM_GP, IWN_EEPROM_GP_IF_OWNER); + /* Clear ECC status. */ + IWN_SETBITS(sc, IWN_OTP_GP, + IWN_OTP_GP_ECC_CORR_STTS | IWN_OTP_GP_ECC_UNCORR_STTS); + + /* + * Find the block before last block (contains the EEPROM image) + * for HW without OTP shadow RAM. + */ + if (sc->hw_type == IWN_HW_REV_TYPE_1000) { + /* Switch to absolute addressing mode. */ + IWN_CLRBITS(sc, IWN_OTP_GP, IWN_OTP_GP_RELATIVE_ACCESS); + base = prev = 0; + for (count = 0; count < IWN1000_OTP_NBLOCKS; count++) { + error = iwn_read_prom_data(sc, base, &next, 2); + if (error != 0) + return error; + if (next == 0) /* End of linked-list. */ + break; + prev = base; + base = le16toh(next); + } + if (count == 0 || count == IWN1000_OTP_NBLOCKS) + return EIO; + /* Skip "next" word. */ + sc->prom_base = prev + 1; + } + return 0; +} + +int +iwn_read_prom_data(struct iwn_softc *sc, uint32_t addr, void *data, int count) +{ + uint32_t val, tmp; + int ntries; + uint8_t *out = data; + + addr += sc->prom_base; + for (; count > 0; count -= 2, addr++) { + IWN_WRITE(sc, IWN_EEPROM, addr << 2); + for (ntries = 0; ntries < 10; ntries++) { + val = IWN_READ(sc, IWN_EEPROM); + if (val & IWN_EEPROM_READ_VALID) + break; + DELAY(5); + } + if (ntries == 10) { + device_printf(sc->sc_dev, + "timeout reading ROM at 0x%x\n", addr); + return ETIMEDOUT; + } + if (sc->sc_flags & IWN_FLAG_HAS_OTPROM) { + /* OTPROM, check for ECC errors. */ + tmp = IWN_READ(sc, IWN_OTP_GP); + if (tmp & IWN_OTP_GP_ECC_UNCORR_STTS) { + device_printf(sc->sc_dev, + "OTPROM ECC error at 0x%x\n", addr); + return EIO; + } + if (tmp & IWN_OTP_GP_ECC_CORR_STTS) { + /* Correctable ECC error, clear bit. */ + IWN_SETBITS(sc, IWN_OTP_GP, + IWN_OTP_GP_ECC_CORR_STTS); + } + } + *out++ = val >> 16; + if (count > 1) + *out++ = val >> 24; + } return 0; } static void iwn_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) { - if (error != 0) - return; - KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs)); - *(bus_addr_t *)arg = segs[0].ds_addr; + if (error != 0) + return; + KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs)); + *(bus_addr_t *)arg = segs[0].ds_addr; } -static int +static int iwn_dma_contig_alloc(struct iwn_softc *sc, struct iwn_dma_info *dma, void **kvap, bus_size_t size, bus_size_t alignment, int flags) { - int error, lalignment, i; + int error; - /* - * FreeBSD can't guarrenty 16k alignment at the moment (11/2007) so - * we allocate an extra 12k with 4k alignement and walk through - * it trying to find where the alignment is. It's a nasty fix for - * a bigger problem. - */ - DPRINTF(sc, IWN_DEBUG_RESET, - "Size: %zd - alignment %zd\n", size, alignment); - if (alignment == 0x4000) { - size += 12*1024; - lalignment = 4096; - DPRINTF(sc, IWN_DEBUG_RESET, "%s\n", - "Attempting to find a 16k boundary"); - } else - lalignment = alignment; dma->size = size; dma->tag = NULL; - error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), lalignment, + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), alignment, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size, 1, size, flags, NULL, NULL, &dma->tag); if (error != 0) { @@ -623,22 +1100,6 @@ iwn_dma_contig_alloc(struct iwn_softc *sc, struct iwn_dma_info *dma, __func__, error); goto fail; } - if (alignment == 0x4000) { - for (i = 0; i < 3 && (((uintptr_t)dma->vaddr) & 0x3fff); i++) { - DPRINTF(sc, IWN_DEBUG_RESET, "%s\n", - "Memory Unaligned, shifting pointer by 4k"); - dma->vaddr += 4096; - size -= 4096; - } - if ((((uintptr_t)dma->vaddr ) & (alignment-1))) { - DPRINTF(sc, IWN_DEBUG_ANY, - "%s: failed to align memory, vaddr %p, align %zd\n", - __func__, dma->vaddr, alignment); - error = ENOMEM; - goto fail; - } - } - error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size, iwn_dma_map_addr, &dma->paddr, flags); if (error != 0) { @@ -655,7 +1116,7 @@ fail: return error; } -static void +void iwn_dma_contig_free(struct iwn_dma_info *dma) { if (dma->tag != NULL) { @@ -672,26 +1133,25 @@ iwn_dma_contig_free(struct iwn_dma_info *dma) } int -iwn_alloc_shared(struct iwn_softc *sc) +iwn_alloc_sched(struct iwn_softc *sc) { - /* must be aligned on a 1KB boundary */ - return iwn_dma_contig_alloc(sc, &sc->shared_dma, - (void **)&sc->shared, sizeof (struct iwn_shared), 1024, - BUS_DMA_NOWAIT); + /* TX scheduler rings must be aligned on a 1KB boundary. */ + return iwn_dma_contig_alloc(sc, &sc->sched_dma, + (void **)&sc->sched, sc->sc_hal->schedsz, 1024, BUS_DMA_NOWAIT); } void -iwn_free_shared(struct iwn_softc *sc) +iwn_free_sched(struct iwn_softc *sc) { - iwn_dma_contig_free(&sc->shared_dma); + iwn_dma_contig_free(&sc->sched_dma); } int iwn_alloc_kw(struct iwn_softc *sc) { - /* must be aligned on a 4k boundary */ - return iwn_dma_contig_alloc(sc, &sc->kw_dma, NULL, - PAGE_SIZE, PAGE_SIZE, BUS_DMA_NOWAIT); + /* "Keep Warm" page must be aligned on a 4KB boundary. */ + return iwn_dma_contig_alloc(sc, &sc->kw_dma, NULL, 4096, 4096, + BUS_DMA_NOWAIT); } void @@ -700,13 +1160,26 @@ iwn_free_kw(struct iwn_softc *sc) iwn_dma_contig_free(&sc->kw_dma); } +int +iwn_alloc_ict(struct iwn_softc *sc) +{ + /* ICT table must be aligned on a 4KB boundary. */ + return iwn_dma_contig_alloc(sc, &sc->ict_dma, + (void **)&sc->ict, IWN_ICT_SIZE, 4096, BUS_DMA_NOWAIT); +} + +void +iwn_free_ict(struct iwn_softc *sc) +{ + iwn_dma_contig_free(&sc->ict_dma); +} + int iwn_alloc_fwmem(struct iwn_softc *sc) { - /* allocate enough contiguous space to store text and data */ + /* Must be aligned on a 16-byte boundary. */ return iwn_dma_contig_alloc(sc, &sc->fw_dma, NULL, - IWN_FW_MAIN_TEXT_MAXSZ + IWN_FW_MAIN_DATA_MAXSZ, 16, - BUS_DMA_NOWAIT); + sc->sc_hal->fwsz, 16, BUS_DMA_NOWAIT); } void @@ -718,37 +1191,49 @@ iwn_free_fwmem(struct iwn_softc *sc) int iwn_alloc_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring) { + bus_size_t size; int i, error; ring->cur = 0; + /* Allocate RX descriptors (256-byte aligned). */ + size = IWN_RX_RING_COUNT * sizeof (uint32_t); error = iwn_dma_contig_alloc(sc, &ring->desc_dma, - (void **)&ring->desc, IWN_RX_RING_COUNT * sizeof (uint32_t), - IWN_RING_DMA_ALIGN, BUS_DMA_NOWAIT); + (void **)&ring->desc, size, 256, BUS_DMA_NOWAIT); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not allocate rx ring DMA memory, error %d\n", + "%s: could not allocate Rx ring DMA memory, error %d\n", __func__, error); goto fail; } - error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, BUS_SPACE_MAXADDR_32BIT, - BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1, - MJUMPAGESIZE, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); - if (error != 0) { - device_printf(sc->sc_dev, + BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1, + MJUMPAGESIZE, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); + if (error != 0) { + device_printf(sc->sc_dev, "%s: bus_dma_tag_create_failed, error %d\n", __func__, error); - goto fail; - } + goto fail; + } + + /* Allocate RX status area (16-byte aligned). */ + error = iwn_dma_contig_alloc(sc, &ring->stat_dma, + (void **)&ring->stat, sizeof (struct iwn_rx_status), + 16, BUS_DMA_NOWAIT); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not allocate Rx status DMA memory, error %d\n", + __func__, error); + goto fail; + } /* - * Setup Rx buffers. + * Allocate and map RX buffers. */ for (i = 0; i < IWN_RX_RING_COUNT; i++) { struct iwn_rx_data *data = &ring->data[i]; - struct mbuf *m; bus_addr_t paddr; error = bus_dmamap_create(ring->data_dmat, 0, &data->map); @@ -758,30 +1243,31 @@ iwn_alloc_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring) __func__, error); goto fail; } - m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE); - if (m == NULL) { + + data->m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE); + if (data->m == NULL) { device_printf(sc->sc_dev, "%s: could not allocate rx mbuf\n", __func__); error = ENOMEM; goto fail; } - /* map page */ + + /* Map page. */ error = bus_dmamap_load(ring->data_dmat, data->map, - mtod(m, caddr_t), MJUMPAGESIZE, + mtod(data->m, caddr_t), MJUMPAGESIZE, iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT); if (error != 0 && error != EFBIG) { device_printf(sc->sc_dev, "%s: bus_dmamap_load failed, error %d\n", __func__, error); - m_freem(m); + m_freem(data->m); error = ENOMEM; /* XXX unique code */ goto fail; } - bus_dmamap_sync(ring->data_dmat, data->map, + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); - data->m = m; - /* Rx buffers are aligned on a 256-byte boundary */ + /* Set physical address of RX buffer (256-byte aligned). */ ring->desc[i] = htole32(paddr >> 8); } bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, @@ -797,21 +1283,23 @@ iwn_reset_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring) { int ntries; - iwn_mem_lock(sc); - - IWN_WRITE(sc, IWN_RX_CONFIG, 0); - for (ntries = 0; ntries < 100; ntries++) { - if (IWN_READ(sc, IWN_RX_STATUS) & IWN_RX_IDLE) - break; - DELAY(10); - } + if (iwn_nic_lock(sc) == 0) { + IWN_WRITE(sc, IWN_FH_RX_CONFIG, 0); + for (ntries = 0; ntries < 1000; ntries++) { + if (IWN_READ(sc, IWN_FH_RX_STATUS) & + IWN_FH_RX_STATUS_IDLE) + break; + DELAY(10); + } + iwn_nic_unlock(sc); #ifdef IWN_DEBUG - if (ntries == 100) - DPRINTF(sc, IWN_DEBUG_ANY, "%s\n", "timeout resetting Rx ring"); + if (ntries == 1000) + DPRINTF(sc, IWN_DEBUG_ANY, "%s\n", + "timeout resetting Rx ring"); #endif - iwn_mem_unlock(sc); - + } ring->cur = 0; + sc->last_rx_valid = 0; } void @@ -820,56 +1308,80 @@ iwn_free_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring) int i; iwn_dma_contig_free(&ring->desc_dma); + iwn_dma_contig_free(&ring->stat_dma); - for (i = 0; i < IWN_RX_RING_COUNT; i++) - if (ring->data[i].m != NULL) - m_freem(ring->data[i].m); + for (i = 0; i < IWN_RX_RING_COUNT; i++) { + struct iwn_rx_data *data = &ring->data[i]; + + if (data->m != NULL) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); + } + if (data->map != NULL) + bus_dmamap_destroy(ring->data_dmat, data->map); + } } int iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid) { bus_size_t size; + bus_addr_t paddr; int i, error; ring->qid = qid; ring->queued = 0; ring->cur = 0; + /* Allocate TX descriptors (256-byte aligned.) */ size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_desc); error = iwn_dma_contig_alloc(sc, &ring->desc_dma, - (void **)&ring->desc, size, IWN_RING_DMA_ALIGN, BUS_DMA_NOWAIT); + (void **)&ring->desc, size, 256, BUS_DMA_NOWAIT); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not allocate tx ring DMA memory, error %d\n", + "%s: could not allocate TX ring DMA memory, error %d\n", __func__, error); goto fail; } + /* + * We only use rings 0 through 4 (4 EDCA + cmd) so there is no need + * to allocate commands space for other rings. + */ + if (qid > 4) + return 0; + size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_cmd); error = iwn_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd, size, 4, BUS_DMA_NOWAIT); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not allocate tx cmd DMA memory, error %d\n", + "%s: could not allocate TX cmd DMA memory, error %d\n", __func__, error); goto fail; } - error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, BUS_SPACE_MAXADDR_32BIT, - BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, IWN_MAX_SCATTER - 1, - MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); - if (error != 0) { - device_printf(sc->sc_dev, + BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, IWN_MAX_SCATTER - 1, + MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); + if (error != 0) { + device_printf(sc->sc_dev, "%s: bus_dma_tag_create_failed, error %d\n", __func__, error); - goto fail; - } + goto fail; + } + paddr = ring->cmd_dma.paddr; for (i = 0; i < IWN_TX_RING_COUNT; i++) { struct iwn_tx_data *data = &ring->data[i]; + data->cmd_paddr = paddr; + data->scratch_paddr = paddr + 12; + paddr += sizeof (struct iwn_tx_cmd); + error = bus_dmamap_create(ring->data_dmat, 0, &data->map); if (error != 0) { device_printf(sc->sc_dev, @@ -877,7 +1389,7 @@ iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid) __func__, error); goto fail; } - bus_dmamap_sync(ring->data_dmat, data->map, + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); } return 0; @@ -889,24 +1401,7 @@ fail: void iwn_reset_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring) { - uint32_t tmp; - int i, ntries; - - iwn_mem_lock(sc); - - IWN_WRITE(sc, IWN_TX_CONFIG(ring->qid), 0); - for (ntries = 0; ntries < 20; ntries++) { - tmp = IWN_READ(sc, IWN_TX_STATUS); - if ((tmp & IWN_TX_IDLE(ring->qid)) == IWN_TX_IDLE(ring->qid)) - break; - DELAY(10); - } -#ifdef IWN_DEBUG - if (ntries == 20) - DPRINTF(sc, IWN_DEBUG_RESET, - "%s: timeout resetting Tx ring %d\n", __func__, ring->qid); -#endif - iwn_mem_unlock(sc); + int i; for (i = 0; i < IWN_TX_RING_COUNT; i++) { struct iwn_tx_data *data = &ring->data[i]; @@ -917,7 +1412,11 @@ iwn_reset_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring) data->m = NULL; } } - + /* Clear TX descriptors. */ + memset(ring->desc, 0, ring->desc_dma.size); + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); + sc->qfullmsk &= ~(1 << ring->qid); ring->queued = 0; ring->cur = 0; } @@ -930,1514 +1429,127 @@ iwn_free_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring) iwn_dma_contig_free(&ring->desc_dma); iwn_dma_contig_free(&ring->cmd_dma); - if (ring->data != NULL) { - for (i = 0; i < IWN_TX_RING_COUNT; i++) { - struct iwn_tx_data *data = &ring->data[i]; + for (i = 0; i < IWN_TX_RING_COUNT; i++) { + struct iwn_tx_data *data = &ring->data[i]; - if (data->m != NULL) { - bus_dmamap_unload(ring->data_dmat, data->map); - m_freem(data->m); - } + if (data->m != NULL) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); } + if (data->map != NULL) + bus_dmamap_destroy(ring->data_dmat, data->map); } } -struct ieee80211_node * -iwn_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) -{ - return malloc(sizeof (struct iwn_node), M_80211_NODE,M_NOWAIT | M_ZERO); -} - void -iwn_newassoc(struct ieee80211_node *ni, int isnew) +iwn5000_ict_reset(struct iwn_softc *sc) { - struct ieee80211vap *vap = ni->ni_vap; + /* Disable interrupts. */ + IWN_WRITE(sc, IWN_INT_MASK, 0); - ieee80211_amrr_node_init(&IWN_VAP(vap)->iv_amrr, - &IWN_NODE(ni)->amn, ni); + /* Reset ICT table. */ + memset(sc->ict, 0, IWN_ICT_SIZE); + sc->ict_cur = 0; + + /* Set physical address of ICT table (4KB aligned.) */ + DPRINTF(sc, IWN_DEBUG_RESET, "%s: enabling ICT\n", __func__); + IWN_WRITE(sc, IWN_DRAM_INT_TBL, IWN_DRAM_INT_TBL_ENABLE | + IWN_DRAM_INT_TBL_WRAP_CHECK | sc->ict_dma.paddr >> 12); + + /* Enable periodic RX interrupt. */ + sc->int_mask |= IWN_INT_RX_PERIODIC; + /* Switch to ICT interrupt mode in driver. */ + sc->sc_flags |= IWN_FLAG_USE_ICT; + + /* Re-enable interrupts. */ + IWN_WRITE(sc, IWN_INT, 0xffffffff); + IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask); } int -iwn_media_change(struct ifnet *ifp) -{ - int error = ieee80211_media_change(ifp); - /* NB: only the fixed rate can change and that doesn't need a reset */ - return (error == ENETRESET ? 0 : error); -} - -int -iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) -{ - struct iwn_vap *ivp = IWN_VAP(vap); - struct ieee80211com *ic = vap->iv_ic; - struct iwn_softc *sc = ic->ic_ifp->if_softc; - int error; - - DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__, - ieee80211_state_name[vap->iv_state], - ieee80211_state_name[nstate]); - - IEEE80211_UNLOCK(ic); - IWN_LOCK(sc); - callout_stop(&sc->sc_timer_to); - - if (nstate == IEEE80211_S_AUTH && vap->iv_state != IEEE80211_S_AUTH) { - /* !AUTH -> AUTH requires adapter config */ - error = iwn_auth(sc, vap); - } - if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) { - /* - * !RUN -> RUN requires setting the association id - * which is done with a firmware cmd. We also defer - * starting the timers until that work is done. - */ - error = iwn_run(sc, vap); - } - if (nstate == IEEE80211_S_RUN) { - /* - * RUN -> RUN transition; just restart the timers. - */ - iwn_calib_reset(sc); - } - IWN_UNLOCK(sc); - IEEE80211_LOCK(ic); - return ivp->iv_newstate(vap, nstate, arg); -} - -/* - * Grab exclusive access to NIC memory. - */ -void -iwn_mem_lock(struct iwn_softc *sc) -{ - uint32_t tmp; - int ntries; - - tmp = IWN_READ(sc, IWN_GPIO_CTL); - IWN_WRITE(sc, IWN_GPIO_CTL, tmp | IWN_GPIO_MAC); - - /* spin until we actually get the lock */ - for (ntries = 0; ntries < 1000; ntries++) { - if ((IWN_READ(sc, IWN_GPIO_CTL) & - (IWN_GPIO_CLOCK | IWN_GPIO_SLEEP)) == IWN_GPIO_CLOCK) - break; - DELAY(10); - } - if (ntries == 1000) - device_printf(sc->sc_dev, - "%s: could not lock memory\n", __func__); -} - -/* - * Release lock on NIC memory. - */ -void -iwn_mem_unlock(struct iwn_softc *sc) -{ - uint32_t tmp = IWN_READ(sc, IWN_GPIO_CTL); - IWN_WRITE(sc, IWN_GPIO_CTL, tmp & ~IWN_GPIO_MAC); -} - -uint32_t -iwn_mem_read(struct iwn_softc *sc, uint32_t addr) -{ - IWN_WRITE(sc, IWN_READ_MEM_ADDR, IWN_MEM_4 | addr); - return IWN_READ(sc, IWN_READ_MEM_DATA); -} - -void -iwn_mem_write(struct iwn_softc *sc, uint32_t addr, uint32_t data) -{ - IWN_WRITE(sc, IWN_WRITE_MEM_ADDR, IWN_MEM_4 | addr); - IWN_WRITE(sc, IWN_WRITE_MEM_DATA, data); -} - -void -iwn_mem_write_region_4(struct iwn_softc *sc, uint32_t addr, - const uint32_t *data, int wlen) -{ - for (; wlen > 0; wlen--, data++, addr += 4) - iwn_mem_write(sc, addr, *data); -} - -int -iwn_eeprom_lock(struct iwn_softc *sc) -{ - uint32_t tmp; - int ntries; - - tmp = IWN_READ(sc, IWN_HWCONFIG); - IWN_WRITE(sc, IWN_HWCONFIG, tmp | IWN_HW_EEPROM_LOCKED); - - /* spin until we actually get the lock */ - for (ntries = 0; ntries < 100; ntries++) { - if (IWN_READ(sc, IWN_HWCONFIG) & IWN_HW_EEPROM_LOCKED) - return 0; - DELAY(10); - } - return ETIMEDOUT; -} - -void -iwn_eeprom_unlock(struct iwn_softc *sc) -{ - uint32_t tmp = IWN_READ(sc, IWN_HWCONFIG); - IWN_WRITE(sc, IWN_HWCONFIG, tmp & ~IWN_HW_EEPROM_LOCKED); -} - -/* - * Read `len' bytes from the EEPROM. We access the EEPROM through the MAC - * instead of using the traditional bit-bang method. - */ -int -iwn_read_prom_data(struct iwn_softc *sc, uint32_t addr, void *data, int len) -{ - uint8_t *out = data; - uint32_t val; - int ntries, tmp; - - iwn_mem_lock(sc); - for (; len > 0; len -= 2, addr++) { - IWN_WRITE(sc, IWN_EEPROM_CTL, addr << 2); - tmp = IWN_READ(sc, IWN_EEPROM_CTL); - IWN_WRITE(sc, IWN_EEPROM_CTL, tmp & ~IWN_EEPROM_MSK ); - - for (ntries = 0; ntries < 10; ntries++) { - if ((val = IWN_READ(sc, IWN_EEPROM_CTL)) & - IWN_EEPROM_READY) - break; - DELAY(5); - } - if (ntries == 10) { - device_printf(sc->sc_dev,"could not read EEPROM\n"); - return ETIMEDOUT; - } - *out++ = val >> 16; - if (len > 1) - *out++ = val >> 24; - } - iwn_mem_unlock(sc); - - return 0; -} - -/* - * The firmware boot code is small and is intended to be copied directly into - * the NIC internal memory. - */ -int -iwn_transfer_microcode(struct iwn_softc *sc, const uint8_t *ucode, int size) -{ - int ntries; - - size /= sizeof (uint32_t); - - iwn_mem_lock(sc); - - /* copy microcode image into NIC memory */ - iwn_mem_write_region_4(sc, IWN_MEM_UCODE_BASE, - (const uint32_t *)ucode, size); - - iwn_mem_write(sc, IWN_MEM_UCODE_SRC, 0); - iwn_mem_write(sc, IWN_MEM_UCODE_DST, IWN_FW_TEXT); - iwn_mem_write(sc, IWN_MEM_UCODE_SIZE, size); - - /* run microcode */ - iwn_mem_write(sc, IWN_MEM_UCODE_CTL, IWN_UC_RUN); - - /* wait for transfer to complete */ - for (ntries = 0; ntries < 1000; ntries++) { - if (!(iwn_mem_read(sc, IWN_MEM_UCODE_CTL) & IWN_UC_RUN)) - break; - DELAY(10); - } - if (ntries == 1000) { - iwn_mem_unlock(sc); - device_printf(sc->sc_dev, - "%s: could not load boot firmware\n", __func__); - return ETIMEDOUT; - } - iwn_mem_write(sc, IWN_MEM_UCODE_CTL, IWN_UC_ENABLE); - - iwn_mem_unlock(sc); - - return 0; -} - -int -iwn_load_firmware(struct iwn_softc *sc) -{ - int error; - - KASSERT(sc->fw_fp == NULL, ("firmware already loaded")); - - IWN_UNLOCK(sc); - /* load firmware image from disk */ - sc->fw_fp = firmware_get("iwnfw"); - if (sc->fw_fp == NULL) { - device_printf(sc->sc_dev, - "%s: could not load firmare image \"iwnfw\"\n", __func__); - error = EINVAL; - } else - error = 0; - IWN_LOCK(sc); - return error; -} - -int -iwn_transfer_firmware(struct iwn_softc *sc) -{ - struct iwn_dma_info *dma = &sc->fw_dma; - const struct iwn_firmware_hdr *hdr; - const uint8_t *init_text, *init_data, *main_text, *main_data; - const uint8_t *boot_text; - uint32_t init_textsz, init_datasz, main_textsz, main_datasz; - uint32_t boot_textsz; - int error = 0; - const struct firmware *fp = sc->fw_fp; - - /* extract firmware header information */ - if (fp->datasize < sizeof (struct iwn_firmware_hdr)) { - device_printf(sc->sc_dev, - "%s: truncated firmware header: %zu bytes, expecting %zu\n", - __func__, fp->datasize, sizeof (struct iwn_firmware_hdr)); - error = EINVAL; - goto fail; - } - hdr = (const struct iwn_firmware_hdr *)fp->data; - main_textsz = le32toh(hdr->main_textsz); - main_datasz = le32toh(hdr->main_datasz); - init_textsz = le32toh(hdr->init_textsz); - init_datasz = le32toh(hdr->init_datasz); - boot_textsz = le32toh(hdr->boot_textsz); - - /* sanity-check firmware segments sizes */ - if (main_textsz > IWN_FW_MAIN_TEXT_MAXSZ || - main_datasz > IWN_FW_MAIN_DATA_MAXSZ || - init_textsz > IWN_FW_INIT_TEXT_MAXSZ || - init_datasz > IWN_FW_INIT_DATA_MAXSZ || - boot_textsz > IWN_FW_BOOT_TEXT_MAXSZ || - (boot_textsz & 3) != 0) { - device_printf(sc->sc_dev, - "%s: invalid firmware header, main [%d,%d], init [%d,%d] " - "boot %d\n", __func__, main_textsz, main_datasz, - init_textsz, init_datasz, boot_textsz); - error = EINVAL; - goto fail; - } - - /* check that all firmware segments are present */ - if (fp->datasize < sizeof (struct iwn_firmware_hdr) + main_textsz + - main_datasz + init_textsz + init_datasz + boot_textsz) { - device_printf(sc->sc_dev, "%s: firmware file too short: " - "%zu bytes, main [%d, %d], init [%d,%d] boot %d\n", - __func__, fp->datasize, main_textsz, main_datasz, - init_textsz, init_datasz, boot_textsz); - error = EINVAL; - goto fail; - } - - /* get pointers to firmware segments */ - main_text = (const uint8_t *)(hdr + 1); - main_data = main_text + main_textsz; - init_text = main_data + main_datasz; - init_data = init_text + init_textsz; - boot_text = init_data + init_datasz; - - /* copy initialization images into pre-allocated DMA-safe memory */ - memcpy(dma->vaddr, init_data, init_datasz); - memcpy(dma->vaddr + IWN_FW_INIT_DATA_MAXSZ, init_text, init_textsz); - - /* tell adapter where to find initialization images */ - iwn_mem_lock(sc); - iwn_mem_write(sc, IWN_MEM_DATA_BASE, dma->paddr >> 4); - iwn_mem_write(sc, IWN_MEM_DATA_SIZE, init_datasz); - iwn_mem_write(sc, IWN_MEM_TEXT_BASE, - (dma->paddr + IWN_FW_INIT_DATA_MAXSZ) >> 4); - iwn_mem_write(sc, IWN_MEM_TEXT_SIZE, init_textsz); - iwn_mem_unlock(sc); - - /* load firmware boot code */ - error = iwn_transfer_microcode(sc, boot_text, boot_textsz); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not load boot firmware, error %d\n", - __func__, error); - goto fail; - } - - /* now press "execute" ;-) */ - IWN_WRITE(sc, IWN_RESET, 0); - - /* wait at most one second for first alive notification */ - error = msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", hz); - if (error != 0) { - /* this isn't what was supposed to happen.. */ - device_printf(sc->sc_dev, - "%s: timeout waiting for first alive notice, error %d\n", - __func__, error); - goto fail; - } - - /* copy runtime images into pre-allocated DMA-safe memory */ - memcpy(dma->vaddr, main_data, main_datasz); - memcpy(dma->vaddr + IWN_FW_MAIN_DATA_MAXSZ, main_text, main_textsz); - - /* tell adapter where to find runtime images */ - iwn_mem_lock(sc); - iwn_mem_write(sc, IWN_MEM_DATA_BASE, dma->paddr >> 4); - iwn_mem_write(sc, IWN_MEM_DATA_SIZE, main_datasz); - iwn_mem_write(sc, IWN_MEM_TEXT_BASE, - (dma->paddr + IWN_FW_MAIN_DATA_MAXSZ) >> 4); - iwn_mem_write(sc, IWN_MEM_TEXT_SIZE, IWN_FW_UPDATED | main_textsz); - iwn_mem_unlock(sc); - - /* wait at most one second for second alive notification */ - error = msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", hz); - if (error != 0) { - /* this isn't what was supposed to happen.. */ - device_printf(sc->sc_dev, - "%s: timeout waiting for second alive notice, error %d\n", - __func__, error); - goto fail; - } - return 0; -fail: - return error; -} - -void -iwn_unload_firmware(struct iwn_softc *sc) -{ - if (sc->fw_fp != NULL) { - firmware_put(sc->fw_fp, FIRMWARE_UNLOAD); - sc->fw_fp = NULL; - } -} - -static void -iwn_timer_timeout(void *arg) -{ - struct iwn_softc *sc = arg; - - IWN_LOCK_ASSERT(sc); - - if (sc->calib_cnt && --sc->calib_cnt == 0) { - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s\n", - "send statistics request"); - (void) iwn_cmd(sc, IWN_CMD_GET_STATISTICS, NULL, 0, 1); - sc->calib_cnt = 60; /* do calibration every 60s */ - } - iwn_watchdog(sc); /* NB: piggyback tx watchdog */ - callout_reset(&sc->sc_timer_to, hz, iwn_timer_timeout, sc); -} - -static void -iwn_calib_reset(struct iwn_softc *sc) -{ - callout_reset(&sc->sc_timer_to, hz, iwn_timer_timeout, sc); - sc->calib_cnt = 60; /* do calibration every 60s */ -} - -void -iwn_ampdu_rx_start(struct iwn_softc *sc, struct iwn_rx_desc *desc) -{ - struct iwn_rx_stat *stat; - - DPRINTF(sc, IWN_DEBUG_RECV, "%s\n", "received AMPDU stats"); - /* save Rx statistics, they will be used on IWN_AMPDU_RX_DONE */ - stat = (struct iwn_rx_stat *)(desc + 1); - memcpy(&sc->last_rx_stat, stat, sizeof (*stat)); - sc->last_rx_valid = 1; -} - -static __inline int -maprate(int iwnrate) -{ - switch (iwnrate) { - /* CCK rates */ - case 10: return 2; - case 20: return 4; - case 55: return 11; - case 110: return 22; - /* OFDM rates */ - case 0xd: return 12; - case 0xf: return 18; - case 0x5: return 24; - case 0x7: return 36; - case 0x9: return 48; - case 0xb: return 72; - case 0x1: return 96; - case 0x3: return 108; - /* XXX MCS */ - } - /* unknown rate: should not happen */ - return 0; -} - -void -iwn_rx_intr(struct iwn_softc *sc, struct iwn_rx_desc *desc, - struct iwn_rx_data *data) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - struct iwn_rx_ring *ring = &sc->rxq; - struct ieee80211_frame *wh; - struct ieee80211_node *ni; - struct mbuf *m, *mnew; - struct iwn_rx_stat *stat; - caddr_t head; - uint32_t *tail; - int8_t rssi, nf; - int len, error; - bus_addr_t paddr; - - if (desc->type == IWN_AMPDU_RX_DONE) { - /* check for prior AMPDU_RX_START */ - if (!sc->last_rx_valid) { - DPRINTF(sc, IWN_DEBUG_ANY, - "%s: missing AMPDU_RX_START\n", __func__); - ifp->if_ierrors++; - return; - } - sc->last_rx_valid = 0; - stat = &sc->last_rx_stat; - } else - stat = (struct iwn_rx_stat *)(desc + 1); - - if (stat->cfg_phy_len > IWN_STAT_MAXLEN) { - device_printf(sc->sc_dev, - "%s: invalid rx statistic header, len %d\n", - __func__, stat->cfg_phy_len); - ifp->if_ierrors++; - return; - } - if (desc->type == IWN_AMPDU_RX_DONE) { - struct iwn_rx_ampdu *ampdu = (struct iwn_rx_ampdu *)(desc + 1); - head = (caddr_t)(ampdu + 1); - len = le16toh(ampdu->len); - } else { - head = (caddr_t)(stat + 1) + stat->cfg_phy_len; - len = le16toh(stat->len); - } - - /* discard Rx frames with bad CRC early */ - tail = (uint32_t *)(head + len); - if ((le32toh(*tail) & IWN_RX_NOERROR) != IWN_RX_NOERROR) { - DPRINTF(sc, IWN_DEBUG_RECV, "%s: rx flags error %x\n", - __func__, le32toh(*tail)); - ifp->if_ierrors++; - return; - } - if (len < sizeof (struct ieee80211_frame)) { - DPRINTF(sc, IWN_DEBUG_RECV, "%s: frame too short: %d\n", - __func__, len); - ifp->if_ierrors++; - return; - } - - /* XXX don't need mbuf, just dma buffer */ - mnew = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE); - if (mnew == NULL) { - DPRINTF(sc, IWN_DEBUG_ANY, "%s: no mbuf to restock ring\n", - __func__); - ifp->if_ierrors++; - return; - } - error = bus_dmamap_load(ring->data_dmat, data->map, - mtod(mnew, caddr_t), MJUMPAGESIZE, - iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT); - if (error != 0 && error != EFBIG) { - device_printf(sc->sc_dev, - "%s: bus_dmamap_load failed, error %d\n", __func__, error); - m_freem(mnew); - ifp->if_ierrors++; - return; - } - bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); - - /* finalize mbuf and swap in new one */ - m = data->m; - m->m_pkthdr.rcvif = ifp; - m->m_data = head; - m->m_pkthdr.len = m->m_len = len; - - data->m = mnew; - /* update Rx descriptor */ - ring->desc[ring->cur] = htole32(paddr >> 8); - - rssi = iwn_get_rssi(sc, stat); - - /* grab a reference to the source node */ - wh = mtod(m, struct ieee80211_frame *); - ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); - - nf = (ni != NULL && ni->ni_vap->iv_state == IEEE80211_S_RUN && - (ic->ic_flags & IEEE80211_F_SCAN) == 0) ? sc->noise : -95; - - if (ieee80211_radiotap_active(ic)) { - struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap; - - tap->wr_tsft = htole64(stat->tstamp); - tap->wr_flags = 0; - if (stat->flags & htole16(IWN_CONFIG_SHPREAMBLE)) - tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; - tap->wr_rate = maprate(stat->rate); - tap->wr_dbm_antsignal = rssi; - tap->wr_dbm_antnoise = nf; - } - - IWN_UNLOCK(sc); - - /* send the frame to the 802.11 layer */ - if (ni != NULL) { - (void) ieee80211_input(ni, m, rssi - nf, nf); - ieee80211_free_node(ni); - } else - (void) ieee80211_input_all(ic, m, rssi - nf, nf); - - IWN_LOCK(sc); -} - -void -iwn_rx_statistics(struct iwn_softc *sc, struct iwn_rx_desc *desc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); - struct iwn_calib_state *calib = &sc->calib; - struct iwn_stats *stats = (struct iwn_stats *)(desc + 1); - - /* beacon stats are meaningful only when associated and not scanning */ - if (vap->iv_state != IEEE80211_S_RUN || - (ic->ic_flags & IEEE80211_F_SCAN)) - return; - - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: cmd %d\n", __func__, desc->type); - iwn_calib_reset(sc); - - /* test if temperature has changed */ - if (stats->general.temp != sc->rawtemp) { - int temp; - - sc->rawtemp = stats->general.temp; - temp = iwn_get_temperature(sc); - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: temperature %d\n", - __func__, temp); - - /* update Tx power if need be */ - iwn_power_calibration(sc, temp); - } - - if (desc->type != IWN_BEACON_STATISTICS) - return; /* reply to a statistics request */ - - sc->noise = iwn_get_noise(&stats->rx.general); - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: noise %d\n", __func__, sc->noise); - - /* test that RSSI and noise are present in stats report */ - if (stats->rx.general.flags != htole32(1)) { - DPRINTF(sc, IWN_DEBUG_ANY, "%s\n", - "received statistics without RSSI"); - return; - } - - if (calib->state == IWN_CALIB_STATE_ASSOC) - iwn_compute_differential_gain(sc, &stats->rx.general); - else if (calib->state == IWN_CALIB_STATE_RUN) - iwn_tune_sensitivity(sc, &stats->rx); -} - -void -iwn_tx_intr(struct iwn_softc *sc, struct iwn_rx_desc *desc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf]; - struct iwn_tx_data *data = &ring->data[desc->idx]; - struct iwn_tx_stat *stat = (struct iwn_tx_stat *)(desc + 1); - struct iwn_node *wn = IWN_NODE(data->ni); - struct mbuf *m; - struct ieee80211_node *ni; - uint32_t status; - - KASSERT(data->ni != NULL, ("no node")); - - DPRINTF(sc, IWN_DEBUG_XMIT, "%s: " - "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n", - __func__, desc->qid, desc->idx, stat->ntries, - stat->nkill, stat->rate, le16toh(stat->duration), - le32toh(stat->status)); - - /* - * Update rate control statistics for the node. - */ - status = le32toh(stat->status) & 0xff; - if (status & 0x80) { - DPRINTF(sc, IWN_DEBUG_ANY, "%s: status 0x%x\n", - __func__, le32toh(stat->status)); - ifp->if_oerrors++; - ieee80211_amrr_tx_complete(&wn->amn, - IEEE80211_AMRR_FAILURE, stat->ntries); - } else { - ieee80211_amrr_tx_complete(&wn->amn, - IEEE80211_AMRR_SUCCESS, stat->ntries); - } - - bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(ring->data_dmat, data->map); - - m = data->m, data->m = NULL; - ni = data->ni, data->ni = NULL; - - if (m->m_flags & M_TXCB) { - /* - * Channels marked for "radar" require traffic to be received - * to unlock before we can transmit. Until traffic is seen - * any attempt to transmit is returned immediately with status - * set to IWN_TX_FAIL_TX_LOCKED. Unfortunately this can easily - * happen on first authenticate after scanning. To workaround - * this we ignore a failure of this sort in AUTH state so the - * 802.11 layer will fall back to using a timeout to wait for - * the AUTH reply. This allows the firmware time to see - * traffic so a subsequent retry of AUTH succeeds. It's - * unclear why the firmware does not maintain state for - * channels recently visited as this would allow immediate - * use of the channel after a scan (where we see traffic). - */ - if (status == IWN_TX_FAIL_TX_LOCKED && - ni->ni_vap->iv_state == IEEE80211_S_AUTH) - ieee80211_process_callback(ni, m, 0); - else - ieee80211_process_callback(ni, m, - (status & IWN_TX_FAIL) != 0); - } - m_freem(m); - ieee80211_free_node(ni); - - ring->queued--; - - sc->sc_tx_timer = 0; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - iwn_start_locked(ifp); -} - -void -iwn_cmd_intr(struct iwn_softc *sc, struct iwn_rx_desc *desc) -{ - struct iwn_tx_ring *ring = &sc->txq[4]; - struct iwn_tx_data *data; - - if ((desc->qid & 0xf) != 4) - return; /* not a command ack */ - - data = &ring->data[desc->idx]; - - /* if the command was mapped in a mbuf, free it */ - if (data->m != NULL) { - bus_dmamap_unload(ring->data_dmat, data->map); - m_freem(data->m); - data->m = NULL; - } - - wakeup(&ring->cmd[desc->idx]); -} - -void -iwn_notif_intr(struct iwn_softc *sc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); - uint16_t hw; - - hw = le16toh(sc->shared->closed_count) & 0xfff; - while (sc->rxq.cur != hw) { - struct iwn_rx_data *data = &sc->rxq.data[sc->rxq.cur]; - struct iwn_rx_desc *desc = (void *)data->m->m_ext.ext_buf; - - DPRINTF(sc, IWN_DEBUG_RECV, - "%s: qid %x idx %d flags %x type %d(%s) len %d\n", - __func__, desc->qid, desc->idx, desc->flags, - desc->type, iwn_intr_str(desc->type), - le16toh(desc->len)); - - if (!(desc->qid & 0x80)) /* reply to a command */ - iwn_cmd_intr(sc, desc); - - switch (desc->type) { - case IWN_RX_DONE: - case IWN_AMPDU_RX_DONE: - iwn_rx_intr(sc, desc, data); - break; - - case IWN_AMPDU_RX_START: - iwn_ampdu_rx_start(sc, desc); - break; - - case IWN_TX_DONE: - /* a 802.11 frame has been transmitted */ - iwn_tx_intr(sc, desc); - break; - - case IWN_RX_STATISTICS: - case IWN_BEACON_STATISTICS: - iwn_rx_statistics(sc, desc); - break; - - case IWN_BEACON_MISSED: { - struct iwn_beacon_missed *miss = - (struct iwn_beacon_missed *)(desc + 1); - int misses = le32toh(miss->consecutive); - - /* XXX not sure why we're notified w/ zero */ - if (misses == 0) - break; - DPRINTF(sc, IWN_DEBUG_STATE, - "%s: beacons missed %d/%d\n", __func__, - misses, le32toh(miss->total)); - /* - * If more than 5 consecutive beacons are missed, - * reinitialize the sensitivity state machine. - */ - if (vap->iv_state == IEEE80211_S_RUN && misses > 5) - (void) iwn_init_sensitivity(sc); - if (misses >= vap->iv_bmissthreshold) - ieee80211_beacon_miss(ic); - break; - } - case IWN_UC_READY: { - struct iwn_ucode_info *uc = - (struct iwn_ucode_info *)(desc + 1); - - /* the microcontroller is ready */ - DPRINTF(sc, IWN_DEBUG_RESET, - "microcode alive notification version=%d.%d " - "subtype=%x alive=%x\n", uc->major, uc->minor, - uc->subtype, le32toh(uc->valid)); - - if (le32toh(uc->valid) != 1) { - device_printf(sc->sc_dev, - "microcontroller initialization failed"); - break; - } - if (uc->subtype == IWN_UCODE_INIT) { - /* save microcontroller's report */ - memcpy(&sc->ucode_info, uc, sizeof (*uc)); - } - break; - } - case IWN_STATE_CHANGED: { - uint32_t *status = (uint32_t *)(desc + 1); - - /* - * State change allows hardware switch change to be - * noted. However, we handle this in iwn_intr as we - * get both the enable/disble intr. - */ - DPRINTF(sc, IWN_DEBUG_INTR, "state changed to %x\n", - le32toh(*status)); - break; - } - case IWN_START_SCAN: { - struct iwn_start_scan *scan = - (struct iwn_start_scan *)(desc + 1); - - DPRINTF(sc, IWN_DEBUG_ANY, - "%s: scanning channel %d status %x\n", - __func__, scan->chan, le32toh(scan->status)); - break; - } - case IWN_STOP_SCAN: { - struct iwn_stop_scan *scan = - (struct iwn_stop_scan *)(desc + 1); - - DPRINTF(sc, IWN_DEBUG_STATE, - "scan finished nchan=%d status=%d chan=%d\n", - scan->nchan, scan->status, scan->chan); - - ieee80211_scan_next(vap); - break; - } - } - sc->rxq.cur = (sc->rxq.cur + 1) % IWN_RX_RING_COUNT; - } - - /* tell the firmware what we have processed */ - hw = (hw == 0) ? IWN_RX_RING_COUNT - 1 : hw - 1; - IWN_WRITE(sc, IWN_RX_WIDX, hw & ~7); -} - -static void -iwn_rftoggle_intr(struct iwn_softc *sc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - uint32_t tmp = IWN_READ(sc, IWN_GPIO_CTL); - - IWN_LOCK_ASSERT(sc); - - device_printf(sc->sc_dev, "RF switch: radio %s\n", - (tmp & IWN_GPIO_RF_ENABLED) ? "enabled" : "disabled"); - if (tmp & IWN_GPIO_RF_ENABLED) - ieee80211_runtask(ic, &sc->sc_radioon_task); - else - ieee80211_runtask(ic, &sc->sc_radiooff_task); -} - -static void -iwn_error_intr(struct iwn_softc *sc, uint32_t r1, uint32_t r2) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); - - IWN_LOCK_ASSERT(sc); - - device_printf(sc->sc_dev, "error, INTR=%b STATUS=0x%x\n", - r1, IWN_INTR_BITS, r2); - if (vap != NULL) - ieee80211_cancel_scan(vap); - ieee80211_runtask(ic, &sc->sc_reinit_task); -} - -void -iwn_intr(void *arg) -{ - struct iwn_softc *sc = arg; - uint32_t r1, r2; - - IWN_LOCK(sc); - - /* disable interrupts */ - IWN_WRITE(sc, IWN_MASK, 0); - - r1 = IWN_READ(sc, IWN_INTR); - r2 = IWN_READ(sc, IWN_INTR_STATUS); - - if (r1 == 0 && r2 == 0) { - IWN_WRITE(sc, IWN_MASK, IWN_INTR_MASK); - goto done; /* not for us */ - } - - if (r1 == 0xffffffff) - goto done; /* hardware gone */ - - /* ack interrupts */ - IWN_WRITE(sc, IWN_INTR, r1); - IWN_WRITE(sc, IWN_INTR_STATUS, r2); - - DPRINTF(sc, IWN_DEBUG_INTR, "interrupt reg1=%x reg2=%x\n", r1, r2); - - if (r1 & IWN_RF_TOGGLED) - iwn_rftoggle_intr(sc); - if (r1 & IWN_CT_REACHED) - device_printf(sc->sc_dev, "critical temperature reached!\n"); - if (r1 & (IWN_SW_ERROR | IWN_HW_ERROR)) { - iwn_error_intr(sc, r1, r2); - goto done; - } - if ((r1 & (IWN_RX_INTR | IWN_SW_RX_INTR)) || (r2 & IWN_RX_STATUS_INTR)) - iwn_notif_intr(sc); - if (r1 & IWN_ALIVE_INTR) - wakeup(sc); - - /* re-enable interrupts */ - IWN_WRITE(sc, IWN_MASK, IWN_INTR_MASK); -done: - IWN_UNLOCK(sc); -} - -uint8_t -iwn_plcp_signal(int rate) -{ - switch (rate) { - /* CCK rates (returned values are device-dependent) */ - case 2: return 10; - case 4: return 20; - case 11: return 55; - case 22: return 110; - - /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ - /* R1-R4, (u)ral is R4-R1 */ - case 12: return 0xd; - case 18: return 0xf; - case 24: return 0x5; - case 36: return 0x7; - case 48: return 0x9; - case 72: return 0xb; - case 96: return 0x1; - case 108: return 0x3; - case 120: return 0x3; - } - /* unknown rate (should not get there) */ - return 0; -} - -/* determine if a given rate is CCK or OFDM */ -#define IWN_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22) - -int -iwn_tx_data(struct iwn_softc *sc, struct mbuf *m0, struct ieee80211_node *ni, - struct iwn_tx_ring *ring) -{ - struct ieee80211vap *vap = ni->ni_vap; - struct ieee80211com *ic = ni->ni_ic; - struct ifnet *ifp = sc->sc_ifp; - const struct ieee80211_txparam *tp; - struct iwn_tx_desc *desc; - struct iwn_tx_data *data; - struct iwn_tx_cmd *cmd; - struct iwn_cmd_data *tx; - struct ieee80211_frame *wh; - struct ieee80211_key *k; - bus_addr_t paddr; - uint32_t flags; - uint16_t timeout; - uint8_t type; - u_int hdrlen; - struct mbuf *mnew; - int rate, error, pad, nsegs, i, ismcast, id; - bus_dma_segment_t segs[IWN_MAX_SCATTER]; - - IWN_LOCK_ASSERT(sc); - - wh = mtod(m0, struct ieee80211_frame *); - type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; - ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); - hdrlen = ieee80211_anyhdrsize(wh); - - /* pick a tx rate */ - /* XXX ni_chan */ - tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; - if (type == IEEE80211_FC0_TYPE_MGT) - rate = tp->mgmtrate; - else if (ismcast) - rate = tp->mcastrate; - else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) - rate = tp->ucastrate; - else { - (void) ieee80211_amrr_choose(ni, &IWN_NODE(ni)->amn); - rate = ni->ni_txrate; - } - - if (wh->i_fc[1] & IEEE80211_FC1_WEP) { - k = ieee80211_crypto_encap(ni, m0); - if (k == NULL) { - m_freem(m0); - return ENOBUFS; - } - /* packet header may have moved, reset our local pointer */ - wh = mtod(m0, struct ieee80211_frame *); - } else - k = NULL; - - if (ieee80211_radiotap_active_vap(vap)) { - struct iwn_tx_radiotap_header *tap = &sc->sc_txtap; - - tap->wt_flags = 0; - tap->wt_rate = rate; - if (k != NULL) - tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; - - ieee80211_radiotap_tx(vap, m0); - } - - flags = IWN_TX_AUTO_SEQ; - /* XXX honor ACM */ - if (!ismcast) - flags |= IWN_TX_NEED_ACK; - - if (ismcast || type != IEEE80211_FC0_TYPE_DATA) - id = IWN_ID_BROADCAST; - else - id = IWN_ID_BSS; - - /* check if RTS/CTS or CTS-to-self protection must be used */ - if (!ismcast) { - /* multicast frames are not sent at OFDM rates in 802.11b/g */ - if (m0->m_pkthdr.len+IEEE80211_CRC_LEN > vap->iv_rtsthreshold) { - flags |= IWN_TX_NEED_RTS | IWN_TX_FULL_TXOP; - } else if ((ic->ic_flags & IEEE80211_F_USEPROT) && - IWN_RATE_IS_OFDM(rate)) { - if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) - flags |= IWN_TX_NEED_CTS | IWN_TX_FULL_TXOP; - else if (ic->ic_protmode == IEEE80211_PROT_RTSCTS) - flags |= IWN_TX_NEED_RTS | IWN_TX_FULL_TXOP; - } - } - - if (type == IEEE80211_FC0_TYPE_MGT) { - uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; - - /* tell h/w to set timestamp in probe responses */ - if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) - flags |= IWN_TX_INSERT_TSTAMP; - - if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ || - subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) - timeout = htole16(3); - else - timeout = htole16(2); - } else - timeout = htole16(0); - - if (hdrlen & 3) { - /* first segment's length must be a multiple of 4 */ - flags |= IWN_TX_NEED_PADDING; - pad = 4 - (hdrlen & 3); - } else - pad = 0; - - desc = &ring->desc[ring->cur]; - data = &ring->data[ring->cur]; - - cmd = &ring->cmd[ring->cur]; - cmd->code = IWN_CMD_TX_DATA; - cmd->flags = 0; - cmd->qid = ring->qid; - cmd->idx = ring->cur; - - tx = (struct iwn_cmd_data *)cmd->data; - /* NB: no need to bzero tx, all fields are reinitialized here */ - tx->id = id; - tx->flags = htole32(flags); - tx->len = htole16(m0->m_pkthdr.len); - tx->rate = iwn_plcp_signal(rate); - tx->rts_ntries = 60; /* XXX? */ - tx->data_ntries = 15; /* XXX? */ - tx->lifetime = htole32(IWN_LIFETIME_INFINITE); - tx->timeout = timeout; - - if (k != NULL) { - /* XXX fill in */; - } else - tx->security = 0; - - /* XXX alternate between Ant A and Ant B ? */ - tx->rflags = IWN_RFLAG_ANT_B; - if (tx->id == IWN_ID_BROADCAST) { - tx->ridx = IWN_MAX_TX_RETRIES - 1; - if (!IWN_RATE_IS_OFDM(rate)) - tx->rflags |= IWN_RFLAG_CCK; - } else { - tx->ridx = 0; - /* tell adapter to ignore rflags */ - tx->flags |= htole32(IWN_TX_USE_NODE_RATE); - } - - /* copy and trim IEEE802.11 header */ - memcpy((uint8_t *)(tx + 1), wh, hdrlen); - m_adj(m0, hdrlen); - - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m0, segs, - &nsegs, BUS_DMA_NOWAIT); - if (error != 0) { - if (error == EFBIG) { - /* too many fragments, linearize */ - mnew = m_collapse(m0, M_DONTWAIT, IWN_MAX_SCATTER); - if (mnew == NULL) { - IWN_UNLOCK(sc); - device_printf(sc->sc_dev, - "%s: could not defrag mbuf\n", __func__); - m_freem(m0); - return ENOBUFS; - } - m0 = mnew; - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, - data->map, m0, segs, &nsegs, BUS_DMA_NOWAIT); - } - if (error != 0) { - IWN_UNLOCK(sc); - device_printf(sc->sc_dev, - "%s: bus_dmamap_load_mbuf_sg failed, error %d\n", - __func__, error); - m_freem(m0); - return error; - } - } - - data->m = m0; - data->ni = ni; - - DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d\n", - __func__, ring->qid, ring->cur, m0->m_pkthdr.len, nsegs); - - paddr = ring->cmd_dma.paddr + ring->cur * sizeof (struct iwn_tx_cmd); - tx->loaddr = htole32(paddr + 4 + - offsetof(struct iwn_cmd_data, ntries)); - tx->hiaddr = 0; /* limit to 32-bit physical addresses */ - - /* first scatter/gather segment is used by the tx data command */ - IWN_SET_DESC_NSEGS(desc, 1 + nsegs); - IWN_SET_DESC_SEG(desc, 0, paddr, 4 + sizeof (*tx) + hdrlen + pad); - for (i = 1; i <= nsegs; i++) { - IWN_SET_DESC_SEG(desc, i, segs[i - 1].ds_addr, - segs[i - 1].ds_len); - } - sc->shared->len[ring->qid][ring->cur] = - htole16(hdrlen + m0->m_pkthdr.len + 8); - - if (ring->cur < IWN_TX_WINDOW) - sc->shared->len[ring->qid][ring->cur + IWN_TX_RING_COUNT] = - htole16(hdrlen + m0->m_pkthdr.len + 8); - - ring->queued++; - - /* kick Tx ring */ - ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; - IWN_WRITE(sc, IWN_TX_WIDX, ring->qid << 8 | ring->cur); - - ifp->if_opackets++; - sc->sc_tx_timer = 5; - - return 0; -} - -void -iwn_start(struct ifnet *ifp) -{ - struct iwn_softc *sc = ifp->if_softc; - - IWN_LOCK(sc); - iwn_start_locked(ifp); - IWN_UNLOCK(sc); -} - -void -iwn_start_locked(struct ifnet *ifp) -{ - struct iwn_softc *sc = ifp->if_softc; - struct ieee80211_node *ni; - struct iwn_tx_ring *txq; - struct mbuf *m; - int pri; - - IWN_LOCK_ASSERT(sc); - - for (;;) { - IFQ_DRV_DEQUEUE(&ifp->if_snd, m); - if (m == NULL) - break; - ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; - pri = M_WME_GETAC(m); - txq = &sc->txq[pri]; - if (txq->queued >= IWN_TX_RING_COUNT - 8) { - /* XXX not right */ - /* ring is nearly full, stop flow */ - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - } - if (iwn_tx_data(sc, m, ni, txq) != 0) { - ifp->if_oerrors++; - ieee80211_free_node(ni); - break; - } - } -} - -static int -iwn_tx_handoff(struct iwn_softc *sc, - struct iwn_tx_ring *ring, - struct iwn_tx_cmd *cmd, - struct iwn_cmd_data *tx, - struct ieee80211_node *ni, - struct mbuf *m0, u_int hdrlen, int pad) -{ - struct ifnet *ifp = sc->sc_ifp; - struct iwn_tx_desc *desc; - struct iwn_tx_data *data; - bus_addr_t paddr; - struct mbuf *mnew; - int error, nsegs, i; - bus_dma_segment_t segs[IWN_MAX_SCATTER]; - - /* copy and trim IEEE802.11 header */ - memcpy((uint8_t *)(tx + 1), mtod(m0, uint8_t *), hdrlen); - m_adj(m0, hdrlen); - - desc = &ring->desc[ring->cur]; - data = &ring->data[ring->cur]; - - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m0, segs, - &nsegs, BUS_DMA_NOWAIT); - if (error != 0) { - if (error == EFBIG) { - /* too many fragments, linearize */ - mnew = m_collapse(m0, M_DONTWAIT, IWN_MAX_SCATTER); - if (mnew == NULL) { - IWN_UNLOCK(sc); - device_printf(sc->sc_dev, - "%s: could not defrag mbuf\n", __func__); - m_freem(m0); - return ENOBUFS; - } - m0 = mnew; - error = bus_dmamap_load_mbuf_sg(ring->data_dmat, - data->map, m0, segs, &nsegs, BUS_DMA_NOWAIT); - } - if (error != 0) { - IWN_UNLOCK(sc); - device_printf(sc->sc_dev, - "%s: bus_dmamap_load_mbuf_sg failed, error %d\n", - __func__, error); - m_freem(m0); - return error; - } - } - - data->m = m0; - data->ni = ni; - - DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d\n", - __func__, ring->qid, ring->cur, m0->m_pkthdr.len, nsegs); - - paddr = ring->cmd_dma.paddr + ring->cur * sizeof (struct iwn_tx_cmd); - tx->loaddr = htole32(paddr + 4 + - offsetof(struct iwn_cmd_data, ntries)); - tx->hiaddr = 0; /* limit to 32-bit physical addresses */ - - /* first scatter/gather segment is used by the tx data command */ - IWN_SET_DESC_NSEGS(desc, 1 + nsegs); - IWN_SET_DESC_SEG(desc, 0, paddr, 4 + sizeof (*tx) + hdrlen + pad); - for (i = 1; i <= nsegs; i++) { - IWN_SET_DESC_SEG(desc, i, segs[i - 1].ds_addr, - segs[i - 1].ds_len); - } - sc->shared->len[ring->qid][ring->cur] = - htole16(hdrlen + m0->m_pkthdr.len + 8); - - if (ring->cur < IWN_TX_WINDOW) - sc->shared->len[ring->qid][ring->cur + IWN_TX_RING_COUNT] = - htole16(hdrlen + m0->m_pkthdr.len + 8); - - ring->queued++; - - /* kick Tx ring */ - ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; - IWN_WRITE(sc, IWN_TX_WIDX, ring->qid << 8 | ring->cur); - - ifp->if_opackets++; - sc->sc_tx_timer = 5; - - return 0; -} - -static int -iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m0, - struct ieee80211_node *ni, struct iwn_tx_ring *ring, - const struct ieee80211_bpf_params *params) -{ - struct ieee80211vap *vap = ni->ni_vap; - struct ieee80211com *ic = ni->ni_ic; - struct iwn_tx_cmd *cmd; - struct iwn_cmd_data *tx; - struct ieee80211_frame *wh; - uint32_t flags; - uint8_t type, subtype; - u_int hdrlen; - int rate, pad; - - IWN_LOCK_ASSERT(sc); - - wh = mtod(m0, struct ieee80211_frame *); - type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; - subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; - hdrlen = ieee80211_anyhdrsize(wh); - - flags = IWN_TX_AUTO_SEQ; - if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0) - flags |= IWN_TX_NEED_ACK; - if (params->ibp_flags & IEEE80211_BPF_RTS) - flags |= IWN_TX_NEED_RTS | IWN_TX_FULL_TXOP; - if (params->ibp_flags & IEEE80211_BPF_CTS) - flags |= IWN_TX_NEED_CTS | IWN_TX_FULL_TXOP; - if (type == IEEE80211_FC0_TYPE_MGT && - subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) { - /* tell h/w to set timestamp in probe responses */ - flags |= IWN_TX_INSERT_TSTAMP; - } - if (hdrlen & 3) { - /* first segment's length must be a multiple of 4 */ - flags |= IWN_TX_NEED_PADDING; - pad = 4 - (hdrlen & 3); - } else - pad = 0; - - /* pick a tx rate */ - rate = params->ibp_rate0; - if (!ieee80211_isratevalid(ic->ic_rt, rate)) { - /* XXX fall back to mcast/mgmt rate? */ - m_freem(m0); - return EINVAL; - } - - if (ieee80211_radiotap_active_vap(vap)) { - struct iwn_tx_radiotap_header *tap = &sc->sc_txtap; - - tap->wt_flags = 0; - tap->wt_rate = rate; - - ieee80211_radiotap_tx(vap, m0); - } - - cmd = &ring->cmd[ring->cur]; - cmd->code = IWN_CMD_TX_DATA; - cmd->flags = 0; - cmd->qid = ring->qid; - cmd->idx = ring->cur; - - tx = (struct iwn_cmd_data *)cmd->data; - /* NB: no need to bzero tx, all fields are reinitialized here */ - tx->id = IWN_ID_BROADCAST; - tx->flags = htole32(flags); - tx->len = htole16(m0->m_pkthdr.len); - tx->rate = iwn_plcp_signal(rate); - tx->rts_ntries = params->ibp_try1; /* XXX? */ - tx->data_ntries = params->ibp_try0; - tx->lifetime = htole32(IWN_LIFETIME_INFINITE); - /* XXX use try count? */ - if (type == IEEE80211_FC0_TYPE_MGT) { - if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ || - subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) - tx->timeout = htole16(3); - else - tx->timeout = htole16(2); - } else - tx->timeout = htole16(0); - tx->security = 0; - /* XXX alternate between Ant A and Ant B ? */ - tx->rflags = IWN_RFLAG_ANT_B; /* XXX params->ibp_pri >> 2 */ - tx->ridx = IWN_MAX_TX_RETRIES - 1; - if (!IWN_RATE_IS_OFDM(rate)) - tx->rflags |= IWN_RFLAG_CCK; - - return iwn_tx_handoff(sc, ring, cmd, tx, ni, m0, hdrlen, pad); -} - -static int -iwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, - const struct ieee80211_bpf_params *params) -{ - struct ieee80211com *ic = ni->ni_ic; - struct ifnet *ifp = ic->ic_ifp; - struct iwn_softc *sc = ifp->if_softc; - struct iwn_tx_ring *txq; - int error; - - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { - ieee80211_free_node(ni); - m_freem(m); - return ENETDOWN; - } - - IWN_LOCK(sc); - if (params == NULL) - txq = &sc->txq[M_WME_GETAC(m)]; - else - txq = &sc->txq[params->ibp_pri & 3]; - if (txq->queued >= IWN_TX_RING_COUNT - 8) { - /* XXX not right */ - /* ring is nearly full, stop flow */ - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - } - if (params == NULL) { - /* - * Legacy path; interpret frame contents to decide - * precisely how to send the frame. - */ - error = iwn_tx_data(sc, m, ni, txq); - } else { - /* - * Caller supplied explicit parameters to use in - * sending the frame. - */ - error = iwn_tx_data_raw(sc, m, ni, txq, params); - } - if (error != 0) { - /* NB: m is reclaimed on tx failure */ - ieee80211_free_node(ni); - ifp->if_oerrors++; - } - IWN_UNLOCK(sc); - return error; -} - -static void -iwn_watchdog(struct iwn_softc *sc) -{ - if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) { - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - - if_printf(ifp, "device timeout\n"); - ieee80211_runtask(ic, &sc->sc_reinit_task); - } -} - -int -iwn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) -{ - struct iwn_softc *sc = ifp->if_softc; - struct ieee80211com *ic = ifp->if_l2com; - struct ifreq *ifr = (struct ifreq *) data; - int error = 0, startall = 0; - - switch (cmd) { - case SIOCSIFFLAGS: - IWN_LOCK(sc); - if (ifp->if_flags & IFF_UP) { - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { - iwn_init_locked(sc); - startall = 1; - } - } else { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - iwn_stop_locked(sc); - } - IWN_UNLOCK(sc); - if (startall) - ieee80211_start_all(ic); - break; - case SIOCGIFMEDIA: - error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); - break; - case SIOCGIFADDR: - error = ether_ioctl(ifp, cmd, data); - break; - default: - error = EINVAL; - break; - } - return error; -} - -void iwn_read_eeprom(struct iwn_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN]) { - char domain[4]; + const struct iwn_hal *hal = sc->sc_hal; + int error; uint16_t val; - int i, error; - if ((error = iwn_eeprom_lock(sc)) != 0) { + /* Check whether adapter has an EEPROM or an OTPROM. */ + if (sc->hw_type >= IWN_HW_REV_TYPE_1000 && + (IWN_READ(sc, IWN_OTP_GP) & IWN_OTP_GP_DEV_SEL_OTP)) + sc->sc_flags |= IWN_FLAG_HAS_OTPROM; + DPRINTF(sc, IWN_DEBUG_RESET, "%s found\n", + (sc->sc_flags & IWN_FLAG_HAS_OTPROM) ? "OTPROM" : "EEPROM"); + + /* Adapter has to be powered on for EEPROM access to work. */ + error = iwn_apm_init(sc); + if (error != 0) { device_printf(sc->sc_dev, - "%s: could not lock EEPROM, error %d\n", __func__, error); - return; + "%s: could not power ON adapter, error %d\n", + __func__, error); + return error; } - /* read and print regulatory domain */ - iwn_read_prom_data(sc, IWN_EEPROM_DOMAIN, domain, 4); - device_printf(sc->sc_dev,"Reg Domain: %.4s", domain); - /* read and print MAC address */ + if ((IWN_READ(sc, IWN_EEPROM_GP) & 0x7) == 0) { + device_printf(sc->sc_dev, "%s: bad ROM signature\n", __func__); + return EIO; + } + error = iwn_eeprom_lock(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not lock ROM, error %d\n", + __func__, error); + return error; + } + + if (sc->sc_flags & IWN_FLAG_HAS_OTPROM) { + error = iwn_init_otprom(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not initialize OTPROM, error %d\n", + __func__, error); + return error; + } + } + + iwn_read_prom_data(sc, IWN_EEPROM_RFCFG, &val, 2); + sc->rfcfg = le16toh(val); + DPRINTF(sc, IWN_DEBUG_RESET, "radio config=0x%04x\n", sc->rfcfg); + + /* Read MAC address. */ iwn_read_prom_data(sc, IWN_EEPROM_MAC, macaddr, 6); - printf(", address %6D\n", macaddr, ":"); - /* read the list of authorized channels */ - iwn_read_eeprom_channels(sc); + /* Read adapter-specific information from EEPROM. */ + hal->read_eeprom(sc); - /* read maximum allowed Tx power for 2GHz and 5GHz bands */ - iwn_read_prom_data(sc, IWN_EEPROM_MAXPOW, &val, 2); + iwn_apm_stop(sc); /* Power OFF adapter. */ + + iwn_eeprom_unlock(sc); + return 0; +} + +void +iwn4965_read_eeprom(struct iwn_softc *sc) +{ + uint32_t addr; + int i; + uint16_t val; + + /* Read regulatory domain (4 ASCII characters.) */ + iwn_read_prom_data(sc, IWN4965_EEPROM_DOMAIN, sc->eeprom_domain, 4); + + /* Read the list of authorized channels (20MHz ones only.) */ + for (i = 0; i < 5; i++) { + addr = iwn4965_regulatory_bands[i]; + iwn_read_eeprom_channels(sc, i, addr); + } + + /* Read maximum allowed TX power for 2GHz and 5GHz bands. */ + iwn_read_prom_data(sc, IWN4965_EEPROM_MAXPOW, &val, 2); sc->maxpwr2GHz = val & 0xff; sc->maxpwr5GHz = val >> 8; - /* check that EEPROM values are correct */ + /* Check that EEPROM values are within valid range. */ if (sc->maxpwr5GHz < 20 || sc->maxpwr5GHz > 50) sc->maxpwr5GHz = 38; if (sc->maxpwr2GHz < 20 || sc->maxpwr2GHz > 50) @@ -2445,42 +1557,135 @@ iwn_read_eeprom(struct iwn_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN]) DPRINTF(sc, IWN_DEBUG_RESET, "maxpwr 2GHz=%d 5GHz=%d\n", sc->maxpwr2GHz, sc->maxpwr5GHz); - /* read voltage at which samples were taken */ - iwn_read_prom_data(sc, IWN_EEPROM_VOLTAGE, &val, 2); + /* Read samples for each TX power group. */ + iwn_read_prom_data(sc, IWN4965_EEPROM_BANDS, sc->bands, + sizeof sc->bands); + + /* Read voltage at which samples were taken. */ + iwn_read_prom_data(sc, IWN4965_EEPROM_VOLTAGE, &val, 2); sc->eeprom_voltage = (int16_t)le16toh(val); DPRINTF(sc, IWN_DEBUG_RESET, "voltage=%d (in 0.3V)\n", sc->eeprom_voltage); - /* read power groups */ - iwn_read_prom_data(sc, IWN_EEPROM_BANDS, sc->bands, sizeof sc->bands); #ifdef IWN_DEBUG + /* Print samples. */ if (sc->sc_debug & IWN_DEBUG_ANY) { for (i = 0; i < IWN_NBANDS; i++) - iwn_print_power_group(sc, i); + iwn4965_print_power_group(sc, i); } #endif - iwn_eeprom_unlock(sc); } -struct iwn_chan_band { - uint32_t addr; /* offset in EEPROM */ - uint32_t flags; /* net80211 flags */ - uint8_t nchan; -#define IWN_MAX_CHAN_PER_BAND 14 - uint8_t chan[IWN_MAX_CHAN_PER_BAND]; -}; +#ifdef IWN_DEBUG +void +iwn4965_print_power_group(struct iwn_softc *sc, int i) +{ + struct iwn4965_eeprom_band *band = &sc->bands[i]; + struct iwn4965_eeprom_chan_samples *chans = band->chans; + int j, c; + + printf("===band %d===\n", i); + printf("chan lo=%d, chan hi=%d\n", band->lo, band->hi); + printf("chan1 num=%d\n", chans[0].num); + for (c = 0; c < 2; c++) { + for (j = 0; j < IWN_NSAMPLES; j++) { + printf("chain %d, sample %d: temp=%d gain=%d " + "power=%d pa_det=%d\n", c, j, + chans[0].samples[c][j].temp, + chans[0].samples[c][j].gain, + chans[0].samples[c][j].power, + chans[0].samples[c][j].pa_det); + } + } + printf("chan2 num=%d\n", chans[1].num); + for (c = 0; c < 2; c++) { + for (j = 0; j < IWN_NSAMPLES; j++) { + printf("chain %d, sample %d: temp=%d gain=%d " + "power=%d pa_det=%d\n", c, j, + chans[1].samples[c][j].temp, + chans[1].samples[c][j].gain, + chans[1].samples[c][j].power, + chans[1].samples[c][j].pa_det); + } + } +} +#endif + +void +iwn5000_read_eeprom(struct iwn_softc *sc) +{ + int32_t temp, volt; + uint32_t addr, base; + int i; + uint16_t val; + + /* Read regulatory domain (4 ASCII characters.) */ + iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2); + base = le16toh(val); + iwn_read_prom_data(sc, base + IWN5000_EEPROM_DOMAIN, + sc->eeprom_domain, 4); + + /* Read the list of authorized channels (20MHz ones only.) */ + for (i = 0; i < 5; i++) { + addr = base + iwn5000_regulatory_bands[i]; + iwn_read_eeprom_channels(sc, i, addr); + } + + /* Read enhanced TX power information for 6000 Series. */ + if (sc->hw_type >= IWN_HW_REV_TYPE_6000) + iwn_read_eeprom_enhinfo(sc); + + iwn_read_prom_data(sc, IWN5000_EEPROM_CAL, &val, 2); + base = le16toh(val); + if (sc->hw_type == IWN_HW_REV_TYPE_5150) { + /* Compute temperature offset. */ + iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2); + temp = le16toh(val); + iwn_read_prom_data(sc, base + IWN5000_EEPROM_VOLT, &val, 2); + volt = le16toh(val); + sc->temp_off = temp - (volt / -5); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "temp=%d volt=%d offset=%dK\n", + temp, volt, sc->temp_off); + } else { + /* Read crystal calibration. */ + iwn_read_prom_data(sc, base + IWN5000_EEPROM_CRYSTAL, + &sc->eeprom_crystal, sizeof (uint32_t)); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "crystal calibration 0x%08x\n", + le32toh(sc->eeprom_crystal)); + } +} + +/* + * Translate EEPROM flags to net80211. + */ +static uint32_t +iwn_eeprom_channel_flags(struct iwn_eeprom_chan *channel) +{ + uint32_t nflags; + + nflags = 0; + if ((channel->flags & IWN_EEPROM_CHAN_ACTIVE) == 0) + nflags |= IEEE80211_CHAN_PASSIVE; + if ((channel->flags & IWN_EEPROM_CHAN_IBSS) == 0) + nflags |= IEEE80211_CHAN_NOADHOC; + if (channel->flags & IWN_EEPROM_CHAN_RADAR) { + nflags |= IEEE80211_CHAN_DFS; + /* XXX apparently IBSS may still be marked */ + nflags |= IEEE80211_CHAN_NOADHOC; + } + + return nflags; +} static void -iwn_read_eeprom_band(struct iwn_softc *sc, const struct iwn_chan_band *band) +iwn_read_eeprom_band(struct iwn_softc *sc, int n) { struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - struct iwn_eeprom_chan channels[IWN_MAX_CHAN_PER_BAND]; + struct iwn_eeprom_chan *channels = sc->eeprom_channels[n]; + const struct iwn_chan_band *band = &iwn_bands[n]; struct ieee80211_channel *c; - int i, chan, flags; - - iwn_read_prom_data(sc, band->addr, channels, - band->nchan * sizeof (struct iwn_eeprom_chan)); + int i, chan, nflags; for (i = 0; i < band->nchan; i++) { if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) { @@ -2491,18 +1696,7 @@ iwn_read_eeprom_band(struct iwn_softc *sc, const struct iwn_chan_band *band) continue; } chan = band->chan[i]; - - /* translate EEPROM flags to net80211 */ - flags = 0; - if ((channels[i].flags & IWN_EEPROM_CHAN_ACTIVE) == 0) - flags |= IEEE80211_CHAN_PASSIVE; - if ((channels[i].flags & IWN_EEPROM_CHAN_IBSS) == 0) - flags |= IEEE80211_CHAN_NOADHOC; - if (channels[i].flags & IWN_EEPROM_CHAN_RADAR) { - flags |= IEEE80211_CHAN_DFS; - /* XXX apparently IBSS may still be marked */ - flags |= IEEE80211_CHAN_NOADHOC; - } + nflags = iwn_eeprom_channel_flags(&channels[i]); DPRINTF(sc, IWN_DEBUG_RESET, "add chan %d flags 0x%x maxpwr %d\n", @@ -2510,40 +1704,46 @@ iwn_read_eeprom_band(struct iwn_softc *sc, const struct iwn_chan_band *band) c = &ic->ic_channels[ic->ic_nchans++]; c->ic_ieee = chan; - c->ic_freq = ieee80211_ieee2mhz(chan, band->flags); c->ic_maxregpower = channels[i].maxpwr; c->ic_maxpower = 2*c->ic_maxregpower; - if (band->flags & IEEE80211_CHAN_2GHZ) { + if (n == 0) { /* 2GHz band */ + c->ic_freq = ieee80211_ieee2mhz(chan, + IEEE80211_CHAN_G); + /* G =>'s B is supported */ - c->ic_flags = IEEE80211_CHAN_B | flags; + c->ic_flags = IEEE80211_CHAN_B | nflags; c = &ic->ic_channels[ic->ic_nchans++]; c[0] = c[-1]; - c->ic_flags = IEEE80211_CHAN_G | flags; + c->ic_flags = IEEE80211_CHAN_G | nflags; } else { /* 5GHz band */ - c->ic_flags = IEEE80211_CHAN_A | flags; + c->ic_freq = ieee80211_ieee2mhz(chan, + IEEE80211_CHAN_A); + c->ic_flags = IEEE80211_CHAN_A | nflags; + sc->sc_flags |= IWN_FLAG_HAS_5GHZ; } +#if 0 /* HT */ /* XXX no constraints on using HT20 */ /* add HT20, HT40 added separately */ c = &ic->ic_channels[ic->ic_nchans++]; c[0] = c[-1]; c->ic_flags |= IEEE80211_CHAN_HT20; /* XXX NARROW =>'s 1/2 and 1/4 width? */ +#endif } } +#if 0 /* HT */ static void -iwn_read_eeprom_ht40(struct iwn_softc *sc, const struct iwn_chan_band *band) +iwn_read_eeprom_ht40(struct iwn_softc *sc, int n) { struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - struct iwn_eeprom_chan channels[IWN_MAX_CHAN_PER_BAND]; + struct iwn_eeprom_chan *channels = sc->eeprom_channels[n]; + const struct iwn_chan_band *band = &iwn_bands[n]; struct ieee80211_channel *c, *cent, *extc; int i; - iwn_read_prom_data(sc, band->addr, channels, - band->nchan * sizeof (struct iwn_eeprom_chan)); - for (i = 0; i < band->nchan; i++) { if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID) || !(channels[i].flags & IWN_EEPROM_CHAN_WIDE)) { @@ -2590,75 +1790,1599 @@ iwn_read_eeprom_ht40(struct iwn_softc *sc, const struct iwn_chan_band *band) c->ic_flags |= IEEE80211_CHAN_HT40D; } } +#endif static void -iwn_read_eeprom_channels(struct iwn_softc *sc) +iwn_read_eeprom_channels(struct iwn_softc *sc, int n, uint32_t addr) { -#define N(a) (sizeof(a)/sizeof(a[0])) - static const struct iwn_chan_band iwn_bands[] = { - { IWN_EEPROM_BAND1, IEEE80211_CHAN_G, 14, - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } }, - { IWN_EEPROM_BAND2, IEEE80211_CHAN_A, 13, - { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } }, - { IWN_EEPROM_BAND3, IEEE80211_CHAN_A, 12, - { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } }, - { IWN_EEPROM_BAND4, IEEE80211_CHAN_A, 11, - { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } }, - { IWN_EEPROM_BAND5, IEEE80211_CHAN_A, 6, - { 145, 149, 153, 157, 161, 165 } }, - { IWN_EEPROM_BAND6, IEEE80211_CHAN_G | IEEE80211_CHAN_HT40, 7, - { 1, 2, 3, 4, 5, 6, 7 } }, - { IWN_EEPROM_BAND7, IEEE80211_CHAN_A | IEEE80211_CHAN_HT40, 11, - { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } } - }; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; + + iwn_read_prom_data(sc, addr, &sc->eeprom_channels[n], + iwn_bands[n].nchan * sizeof (struct iwn_eeprom_chan)); + + if (n < 5) + iwn_read_eeprom_band(sc, n); +#if 0 /* HT */ + else + iwn_read_eeprom_ht40(sc, n); +#endif + ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans); +} + +#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) + +void +iwn_read_eeprom_enhinfo(struct iwn_softc *sc) +{ + struct iwn_eeprom_enhinfo enhinfo[35]; + uint16_t val, base; + int8_t maxpwr; int i; - /* read the list of authorized channels */ - for (i = 0; i < N(iwn_bands)-2; i++) - iwn_read_eeprom_band(sc, &iwn_bands[i]); - for (; i < N(iwn_bands); i++) - iwn_read_eeprom_ht40(sc, &iwn_bands[i]); - ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans); -#undef N + iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2); + base = le16toh(val); + iwn_read_prom_data(sc, base + IWN6000_EEPROM_ENHINFO, + enhinfo, sizeof enhinfo); + + memset(sc->enh_maxpwr, 0, sizeof sc->enh_maxpwr); + for (i = 0; i < nitems(enhinfo); i++) { + if (enhinfo[i].chan == 0 || enhinfo[i].reserved != 0) + continue; /* Skip invalid entries. */ + + maxpwr = 0; + if (sc->txchainmask & IWN_ANT_A) + maxpwr = MAX(maxpwr, enhinfo[i].chain[0]); + if (sc->txchainmask & IWN_ANT_B) + maxpwr = MAX(maxpwr, enhinfo[i].chain[1]); + if (sc->txchainmask & IWN_ANT_C) + maxpwr = MAX(maxpwr, enhinfo[i].chain[2]); + if (sc->ntxchains == 2) + maxpwr = MAX(maxpwr, enhinfo[i].mimo2); + else if (sc->ntxchains == 3) + maxpwr = MAX(maxpwr, enhinfo[i].mimo3); + maxpwr /= 2; /* Convert half-dBm to dBm. */ + + DPRINTF(sc, IWN_DEBUG_RESET, "enhinfo %d, maxpwr=%d\n", i, + maxpwr); + sc->enh_maxpwr[i] = maxpwr; + } } -#ifdef IWN_DEBUG -void -iwn_print_power_group(struct iwn_softc *sc, int i) +struct ieee80211_node * +iwn_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) { - struct iwn_eeprom_band *band = &sc->bands[i]; - struct iwn_eeprom_chan_samples *chans = band->chans; - int j, c; + return malloc(sizeof (struct iwn_node), M_80211_NODE,M_NOWAIT | M_ZERO); +} - printf("===band %d===\n", i); - printf("chan lo=%d, chan hi=%d\n", band->lo, band->hi); - printf("chan1 num=%d\n", chans[0].num); - for (c = 0; c < IWN_NTXCHAINS; c++) { - for (j = 0; j < IWN_NSAMPLES; j++) { - printf("chain %d, sample %d: temp=%d gain=%d " - "power=%d pa_det=%d\n", c, j, - chans[0].samples[c][j].temp, - chans[0].samples[c][j].gain, - chans[0].samples[c][j].power, - chans[0].samples[c][j].pa_det); - } +void +iwn_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct ieee80211vap *vap = ni->ni_vap; + struct iwn_node *wn = (void *)ni; + + ieee80211_amrr_node_init(&IWN_VAP(vap)->iv_amrr, + &wn->amn, ni); +} + +int +iwn_media_change(struct ifnet *ifp) +{ + int error = ieee80211_media_change(ifp); + /* NB: only the fixed rate can change and that doesn't need a reset */ + return (error == ENETRESET ? 0 : error); +} + +int +iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) +{ + struct iwn_vap *ivp = IWN_VAP(vap); + struct ieee80211com *ic = vap->iv_ic; + struct iwn_softc *sc = ic->ic_ifp->if_softc; + int error; + + DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__, + ieee80211_state_name[vap->iv_state], + ieee80211_state_name[nstate]); + + IEEE80211_UNLOCK(ic); + IWN_LOCK(sc); + callout_stop(&sc->sc_timer_to); + + if (nstate == IEEE80211_S_AUTH && vap->iv_state != IEEE80211_S_AUTH) { + /* !AUTH -> AUTH requires adapter config */ + /* Reset state to handle reassociations correctly. */ + sc->rxon.associd = 0; + sc->rxon.filter &= ~htole32(IWN_FILTER_BSS); + iwn_calib_reset(sc); + error = iwn_auth(sc, vap); } - printf("chan2 num=%d\n", chans[1].num); - for (c = 0; c < IWN_NTXCHAINS; c++) { - for (j = 0; j < IWN_NSAMPLES; j++) { - printf("chain %d, sample %d: temp=%d gain=%d " - "power=%d pa_det=%d\n", c, j, - chans[1].samples[c][j].temp, - chans[1].samples[c][j].gain, - chans[1].samples[c][j].power, - chans[1].samples[c][j].pa_det); - } + if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) { + /* + * !RUN -> RUN requires setting the association id + * which is done with a firmware cmd. We also defer + * starting the timers until that work is done. + */ + error = iwn_run(sc, vap); } + if (nstate == IEEE80211_S_RUN) { + /* + * RUN -> RUN transition; just restart the timers. + */ + iwn_calib_reset(sc); + } + IWN_UNLOCK(sc); + IEEE80211_LOCK(ic); + return ivp->iv_newstate(vap, nstate, arg); +} + +/* + * Process an RX_PHY firmware notification. This is usually immediately + * followed by an MPDU_RX_DONE notification. + */ +void +iwn_rx_phy(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + struct iwn_rx_stat *stat = (struct iwn_rx_stat *)(desc + 1); + + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: received PHY stats\n", __func__); + bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); + + /* Save RX statistics, they will be used on MPDU_RX_DONE. */ + memcpy(&sc->last_rx_stat, stat, sizeof (*stat)); + sc->last_rx_valid = 1; +} + +static void +iwn_timer_timeout(void *arg) +{ + struct iwn_softc *sc = arg; + uint32_t flags = 0; + + IWN_LOCK_ASSERT(sc); + + if (sc->calib_cnt && --sc->calib_cnt == 0) { + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s\n", + "send statistics request"); + (void) iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags, + sizeof flags, 1); + sc->calib_cnt = 60; /* do calibration every 60s */ + } + iwn_watchdog(sc); /* NB: piggyback tx watchdog */ + callout_reset(&sc->sc_timer_to, hz, iwn_timer_timeout, sc); +} + +static void +iwn_calib_reset(struct iwn_softc *sc) +{ + callout_reset(&sc->sc_timer_to, hz, iwn_timer_timeout, sc); + sc->calib_cnt = 60; /* do calibration every 60s */ +} + +/* + * Process an RX_DONE (4965AGN only) or MPDU_RX_DONE firmware notification. + * Each MPDU_RX_DONE notification must be preceded by an RX_PHY one. + */ +void +iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + const struct iwn_hal *hal = sc->sc_hal; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct iwn_rx_ring *ring = &sc->rxq; + struct ieee80211_frame *wh; + struct ieee80211_node *ni; + struct mbuf *m, *m1; + struct iwn_rx_stat *stat; + caddr_t head; + bus_addr_t paddr; + uint32_t flags; + int error, len, rssi, nf; + + if (desc->type == IWN_MPDU_RX_DONE) { + /* Check for prior RX_PHY notification. */ + if (!sc->last_rx_valid) { + DPRINTF(sc, IWN_DEBUG_ANY, + "%s: missing RX_PHY\n", __func__); + ifp->if_ierrors++; + return; + } + sc->last_rx_valid = 0; + stat = &sc->last_rx_stat; + } else + stat = (struct iwn_rx_stat *)(desc + 1); + + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD); + + if (stat->cfg_phy_len > IWN_STAT_MAXLEN) { + device_printf(sc->sc_dev, + "%s: invalid rx statistic header, len %d\n", + __func__, stat->cfg_phy_len); + ifp->if_ierrors++; + return; + } + if (desc->type == IWN_MPDU_RX_DONE) { + struct iwn_rx_mpdu *mpdu = (struct iwn_rx_mpdu *)(desc + 1); + head = (caddr_t)(mpdu + 1); + len = le16toh(mpdu->len); + } else { + head = (caddr_t)(stat + 1) + stat->cfg_phy_len; + len = le16toh(stat->len); + } + + flags = le32toh(*(uint32_t *)(head + len)); + + /* Discard frames with a bad FCS early. */ + if ((flags & IWN_RX_NOERROR) != IWN_RX_NOERROR) { + DPRINTF(sc, IWN_DEBUG_RECV, "%s: rx flags error %x\n", + __func__, flags); + ifp->if_ierrors++; + return; + } + /* Discard frames that are too short. */ + if (len < sizeof (*wh)) { + DPRINTF(sc, IWN_DEBUG_RECV, "%s: frame too short: %d\n", + __func__, len); + ifp->if_ierrors++; + return; + } + + /* XXX don't need mbuf, just dma buffer */ + m1 = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE); + if (m1 == NULL) { + DPRINTF(sc, IWN_DEBUG_ANY, "%s: no mbuf to restock ring\n", + __func__); + ifp->if_ierrors++; + return; + } + bus_dmamap_unload(ring->data_dmat, data->map); + + error = bus_dmamap_load(ring->data_dmat, data->map, + mtod(m1, caddr_t), MJUMPAGESIZE, + iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT); + if (error != 0 && error != EFBIG) { + device_printf(sc->sc_dev, + "%s: bus_dmamap_load failed, error %d\n", __func__, error); + m_freem(m1); + ifp->if_ierrors++; + return; + } + + m = data->m; + data->m = m1; + /* Update RX descriptor. */ + ring->desc[ring->cur] = htole32(paddr >> 8); + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); + + /* Finalize mbuf. */ + m->m_pkthdr.rcvif = ifp; + m->m_data = head; + m->m_pkthdr.len = m->m_len = len; + + rssi = hal->get_rssi(sc, stat); + + /* Grab a reference to the source node. */ + wh = mtod(m, struct ieee80211_frame *); + ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); + nf = (ni != NULL && ni->ni_vap->iv_state == IEEE80211_S_RUN && + (ic->ic_flags & IEEE80211_F_SCAN) == 0) ? sc->noise : -95; + + if (ieee80211_radiotap_active(ic)) { + struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap; + + tap->wr_tsft = htole64(stat->tstamp); + tap->wr_flags = 0; + if (stat->flags & htole16(IWN_STAT_FLAG_SHPREAMBLE)) + tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + switch (stat->rate) { + /* CCK rates. */ + case 10: tap->wr_rate = 2; break; + case 20: tap->wr_rate = 4; break; + case 55: tap->wr_rate = 11; break; + case 110: tap->wr_rate = 22; break; + /* OFDM rates. */ + case 0xd: tap->wr_rate = 12; break; + case 0xf: tap->wr_rate = 18; break; + case 0x5: tap->wr_rate = 24; break; + case 0x7: tap->wr_rate = 36; break; + case 0x9: tap->wr_rate = 48; break; + case 0xb: tap->wr_rate = 72; break; + case 0x1: tap->wr_rate = 96; break; + case 0x3: tap->wr_rate = 108; break; + /* Unknown rate: should not happen. */ + default: tap->wr_rate = 0; + } + tap->wr_dbm_antsignal = rssi; + tap->wr_dbm_antnoise = nf; + } + + IWN_UNLOCK(sc); + + /* Send the frame to the 802.11 layer. */ + if (ni != NULL) { + (void) ieee80211_input(ni, m, rssi - nf, nf); + /* Node is no longer needed. */ + ieee80211_free_node(ni); + } else + (void) ieee80211_input_all(ic, m, rssi - nf, nf); + + IWN_LOCK(sc); +} + +#if 0 /* HT */ +/* Process an incoming Compressed BlockAck. */ +void +iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + struct iwn_compressed_ba *ba = (struct iwn_compressed_ba *)(desc + 1); + struct iwn_tx_ring *txq; + + txq = &sc->txq[letoh16(ba->qid)]; + /* XXX TBD */ } #endif +/* + * Process a CALIBRATION_RESULT notification sent by the initialization + * firmware on response to a CMD_CALIB_CONFIG command (5000 only.) + */ +void +iwn5000_rx_calib_results(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + struct iwn_phy_calib *calib = (struct iwn_phy_calib *)(desc + 1); + int len, idx = -1; + + /* Runtime firmware should not send such a notification. */ + if (sc->sc_flags & IWN_FLAG_CALIB_DONE) + return; + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); + len = (le32toh(desc->len) & 0x3fff) - 4; + + switch (calib->code) { + case IWN5000_PHY_CALIB_DC: + if (sc->hw_type == IWN_HW_REV_TYPE_5150) + idx = 0; + break; + case IWN5000_PHY_CALIB_LO: + idx = 1; + break; + case IWN5000_PHY_CALIB_TX_IQ: + idx = 2; + break; + case IWN5000_PHY_CALIB_TX_IQ_PERIODIC: + if (sc->hw_type < IWN_HW_REV_TYPE_6000 && + sc->hw_type != IWN_HW_REV_TYPE_5150) + idx = 3; + break; + case IWN5000_PHY_CALIB_BASE_BAND: + idx = 4; + break; + } + if (idx == -1) /* Ignore other results. */ + return; + + /* Save calibration result. */ + if (sc->calibcmd[idx].buf != NULL) + free(sc->calibcmd[idx].buf, M_DEVBUF); + sc->calibcmd[idx].buf = malloc(len, M_DEVBUF, M_NOWAIT); + if (sc->calibcmd[idx].buf == NULL) { + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "not enough memory for calibration result %d\n", + calib->code); + return; + } + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "saving calibration result code=%d len=%d\n", calib->code, len); + sc->calibcmd[idx].len = len; + memcpy(sc->calibcmd[idx].buf, calib, len); +} + +/* + * Process an RX_STATISTICS or BEACON_STATISTICS firmware notification. + * The latter is sent by the firmware after each received beacon. + */ +void +iwn_rx_statistics(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + const struct iwn_hal *hal = sc->sc_hal; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + struct iwn_calib_state *calib = &sc->calib; + struct iwn_stats *stats = (struct iwn_stats *)(desc + 1); + int temp; + + /* Beacon stats are meaningful only when associated and not scanning. */ + if (vap->iv_state != IEEE80211_S_RUN || + (ic->ic_flags & IEEE80211_F_SCAN)) + return; + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: cmd %d\n", __func__, desc->type); + iwn_calib_reset(sc); /* Reset TX power calibration timeout. */ + + /* Test if temperature has changed. */ + if (stats->general.temp != sc->rawtemp) { + /* Convert "raw" temperature to degC. */ + sc->rawtemp = stats->general.temp; + temp = hal->get_temperature(sc); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: temperature %d\n", + __func__, temp); + + /* Update TX power if need be (4965AGN only.) */ + if (sc->hw_type == IWN_HW_REV_TYPE_4965) + iwn4965_power_calibration(sc, temp); + } + + if (desc->type != IWN_BEACON_STATISTICS) + return; /* Reply to a statistics request. */ + + sc->noise = iwn_get_noise(&stats->rx.general); + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: noise %d\n", __func__, sc->noise); + + /* Test that RSSI and noise are present in stats report. */ + if (le32toh(stats->rx.general.flags) != 1) { + DPRINTF(sc, IWN_DEBUG_ANY, "%s\n", + "received statistics without RSSI"); + return; + } + + if (calib->state == IWN_CALIB_STATE_ASSOC) + iwn_collect_noise(sc, &stats->rx.general); + else if (calib->state == IWN_CALIB_STATE_RUN) + iwn_tune_sensitivity(sc, &stats->rx); +} + +/* + * Process a TX_DONE firmware notification. Unfortunately, the 4965AGN + * and 5000 adapters have different incompatible TX status formats. + */ +void +iwn4965_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + struct iwn4965_tx_stat *stat = (struct iwn4965_tx_stat *)(desc + 1); + + DPRINTF(sc, IWN_DEBUG_XMIT, "%s: " + "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n", + __func__, desc->qid, desc->idx, stat->ackfailcnt, + stat->btkillcnt, stat->rate, le16toh(stat->duration), + le32toh(stat->status)); + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); + iwn_tx_done(sc, desc, stat->ackfailcnt, le32toh(stat->status) & 0xff); +} + +void +iwn5000_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, + struct iwn_rx_data *data) +{ + struct iwn5000_tx_stat *stat = (struct iwn5000_tx_stat *)(desc + 1); + + DPRINTF(sc, IWN_DEBUG_XMIT, "%s: " + "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n", + __func__, desc->qid, desc->idx, stat->ackfailcnt, + stat->btkillcnt, stat->rate, le16toh(stat->duration), + le32toh(stat->status)); + +#ifdef notyet + /* Reset TX scheduler slot. */ + iwn5000_reset_sched(sc, desc->qid & 0xf, desc->idx); +#endif + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD); + iwn_tx_done(sc, desc, stat->ackfailcnt, le16toh(stat->status) & 0xff); +} + +/* + * Adapter-independent backend for TX_DONE firmware notifications. + */ +void +iwn_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, int ackfailcnt, + uint8_t status) +{ + struct ifnet *ifp = sc->sc_ifp; + struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf]; + struct iwn_tx_data *data = &ring->data[desc->idx]; + struct iwn_node *wn = (void *)data->ni; + struct mbuf *m; + struct ieee80211_node *ni; + + KASSERT(data->ni != NULL, ("no node")); + + /* Unmap and free mbuf. */ + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(ring->data_dmat, data->map); + m = data->m, data->m = NULL; + ni = data->ni, data->ni = NULL; + + if (m->m_flags & M_TXCB) { + /* + * Channels marked for "radar" require traffic to be received + * to unlock before we can transmit. Until traffic is seen + * any attempt to transmit is returned immediately with status + * set to IWN_TX_FAIL_TX_LOCKED. Unfortunately this can easily + * happen on first authenticate after scanning. To workaround + * this we ignore a failure of this sort in AUTH state so the + * 802.11 layer will fall back to using a timeout to wait for + * the AUTH reply. This allows the firmware time to see + * traffic so a subsequent retry of AUTH succeeds. It's + * unclear why the firmware does not maintain state for + * channels recently visited as this would allow immediate + * use of the channel after a scan (where we see traffic). + */ + if (status == IWN_TX_FAIL_TX_LOCKED && + ni->ni_vap->iv_state == IEEE80211_S_AUTH) + ieee80211_process_callback(ni, m, 0); + else + ieee80211_process_callback(ni, m, + (status & IWN_TX_FAIL) != 0); + } + + /* + * Update rate control statistics for the node. + */ + if (status & 0x80) { + ifp->if_oerrors++; + ieee80211_amrr_tx_complete(&wn->amn, + IEEE80211_AMRR_FAILURE, ackfailcnt); + } else { + ieee80211_amrr_tx_complete(&wn->amn, + IEEE80211_AMRR_SUCCESS, ackfailcnt); + } + m_freem(m); + ieee80211_free_node(ni); + + sc->sc_tx_timer = 0; + if (--ring->queued < IWN_TX_RING_LOMARK) { + sc->qfullmsk &= ~(1 << ring->qid); + if (sc->qfullmsk == 0 && + (ifp->if_drv_flags & IFF_DRV_OACTIVE)) { + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + iwn_start_locked(ifp); + } + } +} + +/* + * Process a "command done" firmware notification. This is where we wakeup + * processes waiting for a synchronous command completion. + */ +void +iwn_cmd_done(struct iwn_softc *sc, struct iwn_rx_desc *desc) +{ + struct iwn_tx_ring *ring = &sc->txq[4]; + struct iwn_tx_data *data; + + if ((desc->qid & 0xf) != 4) + return; /* Not a command ack. */ + + data = &ring->data[desc->idx]; + + /* If the command was mapped in an mbuf, free it. */ + if (data->m != NULL) { + bus_dmamap_unload(ring->data_dmat, data->map); + m_freem(data->m); + data->m = NULL; + } + wakeup(&ring->desc[desc->idx]); +} + +/* + * Process an INT_FH_RX or INT_SW_RX interrupt. + */ +void +iwn_notif_intr(struct iwn_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + uint16_t hw; + + bus_dmamap_sync(sc->rxq.stat_dma.tag, sc->rxq.stat_dma.map, + BUS_DMASYNC_POSTREAD); + + hw = le16toh(sc->rxq.stat->closed_count) & 0xfff; + while (sc->rxq.cur != hw) { + struct iwn_rx_data *data = &sc->rxq.data[sc->rxq.cur]; + struct iwn_rx_desc *desc; + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + desc = mtod(data->m, struct iwn_rx_desc *); + + DPRINTF(sc, IWN_DEBUG_RECV, + "%s: qid %x idx %d flags %x type %d(%s) len %d\n", + __func__, desc->qid & 0xf, desc->idx, desc->flags, + desc->type, iwn_intr_str(desc->type), + le16toh(desc->len)); + + if (!(desc->qid & 0x80)) /* Reply to a command. */ + iwn_cmd_done(sc, desc); + + switch (desc->type) { + case IWN_RX_PHY: + iwn_rx_phy(sc, desc, data); + break; + + case IWN_RX_DONE: /* 4965AGN only. */ + case IWN_MPDU_RX_DONE: + /* An 802.11 frame has been received. */ + iwn_rx_done(sc, desc, data); + break; + +#if 0 /* HT */ + case IWN_RX_COMPRESSED_BA: + /* A Compressed BlockAck has been received. */ + iwn_rx_compressed_ba(sc, desc, data); + break; +#endif + + case IWN_TX_DONE: + /* An 802.11 frame has been transmitted. */ + sc->sc_hal->tx_done(sc, desc, data); + break; + + case IWN_RX_STATISTICS: + case IWN_BEACON_STATISTICS: + iwn_rx_statistics(sc, desc, data); + break; + + case IWN_BEACON_MISSED: + { + struct iwn_beacon_missed *miss = + (struct iwn_beacon_missed *)(desc + 1); + int misses; + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + misses = le32toh(miss->consecutive); + + /* XXX not sure why we're notified w/ zero */ + if (misses == 0) + break; + DPRINTF(sc, IWN_DEBUG_STATE, + "%s: beacons missed %d/%d\n", __func__, + misses, le32toh(miss->total)); + + /* + * If more than 5 consecutive beacons are missed, + * reinitialize the sensitivity state machine. + */ + if (vap->iv_state == IEEE80211_S_RUN && misses > 5) + (void) iwn_init_sensitivity(sc); + if (misses >= vap->iv_bmissthreshold) { + IWN_UNLOCK(sc); + ieee80211_beacon_miss(ic); + IWN_LOCK(sc); + } + break; + } + case IWN_UC_READY: + { + struct iwn_ucode_info *uc = + (struct iwn_ucode_info *)(desc + 1); + + /* The microcontroller is ready. */ + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + DPRINTF(sc, IWN_DEBUG_RESET, + "microcode alive notification version=%d.%d " + "subtype=%x alive=%x\n", uc->major, uc->minor, + uc->subtype, le32toh(uc->valid)); + + if (le32toh(uc->valid) != 1) { + device_printf(sc->sc_dev, + "microcontroller initialization failed"); + break; + } + if (uc->subtype == IWN_UCODE_INIT) { + /* Save microcontroller report. */ + memcpy(&sc->ucode_info, uc, sizeof (*uc)); + } + /* Save the address of the error log in SRAM. */ + sc->errptr = le32toh(uc->errptr); + break; + } + case IWN_STATE_CHANGED: + { + uint32_t *status = (uint32_t *)(desc + 1); + + /* + * State change allows hardware switch change to be + * noted. However, we handle this in iwn_intr as we + * get both the enable/disble intr. + */ + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + DPRINTF(sc, IWN_DEBUG_INTR, "state changed to %x\n", + le32toh(*status)); + break; + } + case IWN_START_SCAN: + { + struct iwn_start_scan *scan = + (struct iwn_start_scan *)(desc + 1); + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + DPRINTF(sc, IWN_DEBUG_ANY, + "%s: scanning channel %d status %x\n", + __func__, scan->chan, le32toh(scan->status)); + break; + } + case IWN_STOP_SCAN: + { + struct iwn_stop_scan *scan = + (struct iwn_stop_scan *)(desc + 1); + + bus_dmamap_sync(sc->rxq.data_dmat, data->map, + BUS_DMASYNC_POSTREAD); + DPRINTF(sc, IWN_DEBUG_STATE, + "scan finished nchan=%d status=%d chan=%d\n", + scan->nchan, scan->status, scan->chan); + + IWN_UNLOCK(sc); + ieee80211_scan_next(vap); + IWN_LOCK(sc); + break; + } + case IWN5000_CALIBRATION_RESULT: + iwn5000_rx_calib_results(sc, desc, data); + break; + + case IWN5000_CALIBRATION_DONE: + sc->sc_flags |= IWN_FLAG_CALIB_DONE; + wakeup(sc); + break; + } + + sc->rxq.cur = (sc->rxq.cur + 1) % IWN_RX_RING_COUNT; + } + + /* Tell the firmware what we have processed. */ + hw = (hw == 0) ? IWN_RX_RING_COUNT - 1 : hw - 1; + IWN_WRITE(sc, IWN_FH_RX_WPTR, hw & ~7); +} + +/* + * Process an INT_WAKEUP interrupt raised when the microcontroller wakes up + * from power-down sleep mode. + */ +void +iwn_wakeup_intr(struct iwn_softc *sc) +{ + int qid; + + DPRINTF(sc, IWN_DEBUG_RESET, "%s: ucode wakeup from power-down sleep\n", + __func__); + + /* Wakeup RX and TX rings. */ + IWN_WRITE(sc, IWN_FH_RX_WPTR, sc->rxq.cur & ~7); + for (qid = 0; qid < sc->sc_hal->ntxqs; qid++) { + struct iwn_tx_ring *ring = &sc->txq[qid]; + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | ring->cur); + } +} + +void +iwn_rftoggle_intr(struct iwn_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp = IWN_READ(sc, IWN_GP_CNTRL); + + IWN_LOCK_ASSERT(sc); + + device_printf(sc->sc_dev, "RF switch: radio %s\n", + (tmp & IWN_GP_CNTRL_RFKILL) ? "enabled" : "disabled"); + if (tmp & IWN_GP_CNTRL_RFKILL) + ieee80211_runtask(ic, &sc->sc_radioon_task); + else + ieee80211_runtask(ic, &sc->sc_radiooff_task); +} + +/* + * Dump the error log of the firmware when a firmware panic occurs. Although + * we can't debug the firmware because it is neither open source nor free, it + * can help us to identify certain classes of problems. + */ +void +iwn_fatal_intr(struct iwn_softc *sc) +{ + const struct iwn_hal *hal = sc->sc_hal; + struct iwn_fw_dump dump; + int i; + + IWN_LOCK_ASSERT(sc); + + /* Force a complete recalibration on next init. */ + sc->sc_flags &= ~IWN_FLAG_CALIB_DONE; + + /* Check that the error log address is valid. */ + if (sc->errptr < IWN_FW_DATA_BASE || + sc->errptr + sizeof (dump) > + IWN_FW_DATA_BASE + hal->fw_data_maxsz) { + printf("%s: bad firmware error log address 0x%08x\n", + __func__, sc->errptr); + return; + } + if (iwn_nic_lock(sc) != 0) { + printf("%s: could not read firmware error log\n", + __func__); + return; + } + /* Read firmware error log from SRAM. */ + iwn_mem_read_region_4(sc, sc->errptr, (uint32_t *)&dump, + sizeof (dump) / sizeof (uint32_t)); + iwn_nic_unlock(sc); + + if (dump.valid == 0) { + printf("%s: firmware error log is empty\n", + __func__); + return; + } + printf("firmware error log:\n"); + printf(" error type = \"%s\" (0x%08X)\n", + (dump.id < nitems(iwn_fw_errmsg)) ? + iwn_fw_errmsg[dump.id] : "UNKNOWN", + dump.id); + printf(" program counter = 0x%08X\n", dump.pc); + printf(" source line = 0x%08X\n", dump.src_line); + printf(" error data = 0x%08X%08X\n", + dump.error_data[0], dump.error_data[1]); + printf(" branch link = 0x%08X%08X\n", + dump.branch_link[0], dump.branch_link[1]); + printf(" interrupt link = 0x%08X%08X\n", + dump.interrupt_link[0], dump.interrupt_link[1]); + printf(" time = %u\n", dump.time[0]); + + /* Dump driver status (TX and RX rings) while we're here. */ + printf("driver status:\n"); + for (i = 0; i < hal->ntxqs; i++) { + struct iwn_tx_ring *ring = &sc->txq[i]; + printf(" tx ring %2d: qid=%-2d cur=%-3d queued=%-3d\n", + i, ring->qid, ring->cur, ring->queued); + } + printf(" rx ring: cur=%d\n", sc->rxq.cur); +} + +void +iwn_intr(void *arg) +{ + struct iwn_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + uint32_t r1, r2, tmp; + + IWN_LOCK(sc); + + /* Disable interrupts. */ + IWN_WRITE(sc, IWN_INT_MASK, 0); + + /* Read interrupts from ICT (fast) or from registers (slow). */ + if (sc->sc_flags & IWN_FLAG_USE_ICT) { + tmp = 0; + while (sc->ict[sc->ict_cur] != 0) { + tmp |= sc->ict[sc->ict_cur]; + sc->ict[sc->ict_cur] = 0; /* Acknowledge. */ + sc->ict_cur = (sc->ict_cur + 1) % IWN_ICT_COUNT; + } + tmp = le32toh(tmp); + if (tmp == 0xffffffff) + tmp = 0; /* Shouldn't happen. */ + r1 = (tmp & 0xff00) << 16 | (tmp & 0xff); + r2 = 0; /* Unused. */ + } else { + r1 = IWN_READ(sc, IWN_INT); + if (r1 == 0xffffffff || (r1 & 0xfffffff0) == 0xa5a5a5a0) + return; /* Hardware gone! */ + r2 = IWN_READ(sc, IWN_FH_INT); + } + + DPRINTF(sc, IWN_DEBUG_INTR, "interrupt reg1=%x reg2=%x\n", r1, r2); + + if (r1 == 0 && r2 == 0) + goto done; /* Interrupt not for us. */ + + /* Acknowledge interrupts. */ + IWN_WRITE(sc, IWN_INT, r1); + if (!(sc->sc_flags & IWN_FLAG_USE_ICT)) + IWN_WRITE(sc, IWN_FH_INT, r2); + + if (r1 & IWN_INT_RF_TOGGLED) { + iwn_rftoggle_intr(sc); + goto done; + } + if (r1 & IWN_INT_CT_REACHED) { + device_printf(sc->sc_dev, "%s: critical temperature reached!\n", + __func__); + } + if (r1 & (IWN_INT_SW_ERR | IWN_INT_HW_ERR)) { + iwn_fatal_intr(sc); + ifp->if_flags &= ~IFF_UP; + iwn_stop_locked(sc); + goto done; + } + if ((r1 & (IWN_INT_FH_RX | IWN_INT_SW_RX | IWN_INT_RX_PERIODIC)) || + (r2 & IWN_FH_INT_RX)) { + if (sc->sc_flags & IWN_FLAG_USE_ICT) { + if (r1 & (IWN_INT_FH_RX | IWN_INT_SW_RX)) + IWN_WRITE(sc, IWN_FH_INT, IWN_FH_INT_RX); + IWN_WRITE_1(sc, IWN_INT_PERIODIC, + IWN_INT_PERIODIC_DIS); + iwn_notif_intr(sc); + if (r1 & (IWN_INT_FH_RX | IWN_INT_SW_RX)) { + IWN_WRITE_1(sc, IWN_INT_PERIODIC, + IWN_INT_PERIODIC_ENA); + } + } else + iwn_notif_intr(sc); + } + + if ((r1 & IWN_INT_FH_TX) || (r2 & IWN_FH_INT_TX)) { + if (sc->sc_flags & IWN_FLAG_USE_ICT) + IWN_WRITE(sc, IWN_FH_INT, IWN_FH_INT_TX); + wakeup(sc); /* FH DMA transfer completed. */ + } + + if (r1 & IWN_INT_ALIVE) + wakeup(sc); /* Firmware is alive. */ + + if (r1 & IWN_INT_WAKEUP) + iwn_wakeup_intr(sc); + +done: + /* Re-enable interrupts. */ + if (ifp->if_flags & IFF_UP) + IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask); + + IWN_UNLOCK(sc); +} + +/* + * Update TX scheduler ring when transmitting an 802.11 frame (4965AGN and + * 5000 adapters use a slightly different format.) + */ +void +iwn4965_update_sched(struct iwn_softc *sc, int qid, int idx, uint8_t id, + uint16_t len) +{ + uint16_t *w = &sc->sched[qid * IWN4965_SCHED_COUNT + idx]; + + *w = htole16(len + 8); + bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map, + BUS_DMASYNC_PREWRITE); + if (idx < IWN_SCHED_WINSZ) { + *(w + IWN_TX_RING_COUNT) = *w; + bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map, + BUS_DMASYNC_PREWRITE); + } +} + +void +iwn5000_update_sched(struct iwn_softc *sc, int qid, int idx, uint8_t id, + uint16_t len) +{ + uint16_t *w = &sc->sched[qid * IWN5000_SCHED_COUNT + idx]; + + *w = htole16(id << 12 | (len + 8)); + + bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map, + BUS_DMASYNC_PREWRITE); + if (idx < IWN_SCHED_WINSZ) { + *(w + IWN_TX_RING_COUNT) = *w; + bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map, + BUS_DMASYNC_PREWRITE); + } +} + +void +iwn5000_reset_sched(struct iwn_softc *sc, int qid, int idx) +{ + uint16_t *w = &sc->sched[qid * IWN5000_SCHED_COUNT + idx]; + + *w = (*w & htole16(0xf000)) | htole16(1); + bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map, + BUS_DMASYNC_PREWRITE); + if (idx < IWN_SCHED_WINSZ) { + *(w + IWN_TX_RING_COUNT) = *w; + bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map, + BUS_DMASYNC_PREWRITE); + } +} + +static uint8_t +iwn_plcp_signal(int rate) { + int i; + + for (i = 0; i < IWN_RIDX_MAX + 1; i++) { + if (rate == iwn_rates[i].rate) + return i; + } + + return 0; +} + +int +iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni, + struct iwn_tx_ring *ring) +{ + const struct iwn_hal *hal = sc->sc_hal; + const struct ieee80211_txparam *tp; + const struct iwn_rate *rinfo; + struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = ni->ni_ic; + struct iwn_node *wn = (void *)ni; + struct iwn_tx_desc *desc; + struct iwn_tx_data *data; + struct iwn_tx_cmd *cmd; + struct iwn_cmd_data *tx; + struct ieee80211_frame *wh; + struct ieee80211_key *k = NULL; + struct mbuf *mnew; + bus_dma_segment_t segs[IWN_MAX_SCATTER]; + uint32_t flags; + u_int hdrlen; + int totlen, error, pad, nsegs = 0, i, rate; + uint8_t ridx, type, txant; + + IWN_LOCK_ASSERT(sc); + + wh = mtod(m, struct ieee80211_frame *); + hdrlen = ieee80211_anyhdrsize(wh); + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + desc = &ring->desc[ring->cur]; + data = &ring->data[ring->cur]; + + /* Choose a TX rate index. */ + tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; + if (type == IEEE80211_FC0_TYPE_MGT) + rate = tp->mgmtrate; + else if (IEEE80211_IS_MULTICAST(wh->i_addr1)) + rate = tp->mcastrate; + else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) + rate = tp->ucastrate; + else { + (void) ieee80211_amrr_choose(ni, &wn->amn); + rate = ni->ni_txrate; + } + ridx = iwn_plcp_signal(rate); + rinfo = &iwn_rates[ridx]; + + /* Encrypt the frame if need be. */ + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + k = ieee80211_crypto_encap(ni, m); + if (k == NULL) { + m_freem(m); + return ENOBUFS; + } + /* Packet header may have moved, reset our local pointer. */ + wh = mtod(m, struct ieee80211_frame *); + } + totlen = m->m_pkthdr.len; + + if (ieee80211_radiotap_active_vap(vap)) { + struct iwn_tx_radiotap_header *tap = &sc->sc_txtap; + + tap->wt_flags = 0; + tap->wt_rate = rinfo->rate; + if (k != NULL) + tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; + + ieee80211_radiotap_tx(vap, m); + } + + /* Prepare TX firmware command. */ + cmd = &ring->cmd[ring->cur]; + cmd->code = IWN_CMD_TX_DATA; + cmd->flags = 0; + cmd->qid = ring->qid; + cmd->idx = ring->cur; + + tx = (struct iwn_cmd_data *)cmd->data; + /* NB: No need to clear tx, all fields are reinitialized here. */ + tx->scratch = 0; /* clear "scratch" area */ + + flags = 0; + if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) + flags |= IWN_TX_NEED_ACK; + if ((wh->i_fc[0] & + (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == + (IEEE80211_FC0_TYPE_CTL | IEEE80211_FC0_SUBTYPE_BAR)) + flags |= IWN_TX_IMM_BA; /* Cannot happen yet. */ + + if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) + flags |= IWN_TX_MORE_FRAG; /* Cannot happen yet. */ + + /* Check if frame must be protected using RTS/CTS or CTS-to-self. */ + if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { + /* NB: Group frames are sent using CCK in 802.11b/g. */ + if (totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold) { + flags |= IWN_TX_NEED_RTS; + } else if ((ic->ic_flags & IEEE80211_F_USEPROT) && + ridx >= IWN_RIDX_OFDM6) { + if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) + flags |= IWN_TX_NEED_CTS; + else if (ic->ic_protmode == IEEE80211_PROT_RTSCTS) + flags |= IWN_TX_NEED_RTS; + } + if (flags & (IWN_TX_NEED_RTS | IWN_TX_NEED_CTS)) { + if (sc->hw_type != IWN_HW_REV_TYPE_4965) { + /* 5000 autoselects RTS/CTS or CTS-to-self. */ + flags &= ~(IWN_TX_NEED_RTS | IWN_TX_NEED_CTS); + flags |= IWN_TX_NEED_PROTECTION; + } else + flags |= IWN_TX_FULL_TXOP; + } + } + + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || + type != IEEE80211_FC0_TYPE_DATA) + tx->id = hal->broadcast_id; + else + tx->id = wn->id; + + if (type == IEEE80211_FC0_TYPE_MGT) { + uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; + + /* Tell HW to set timestamp in probe responses. */ + if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) + flags |= IWN_TX_INSERT_TSTAMP; + + if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ || + subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) + tx->timeout = htole16(3); + else + tx->timeout = htole16(2); + } else + tx->timeout = htole16(0); + + if (hdrlen & 3) { + /* First segment length must be a multiple of 4. */ + flags |= IWN_TX_NEED_PADDING; + pad = 4 - (hdrlen & 3); + } else + pad = 0; + + tx->len = htole16(totlen); + tx->tid = 0; + tx->rts_ntries = 60; + tx->data_ntries = 15; + tx->lifetime = htole32(IWN_LIFETIME_INFINITE); + tx->plcp = rinfo->plcp; + tx->rflags = rinfo->flags; + if (tx->id == hal->broadcast_id) { + /* Group or management frame. */ + tx->linkq = 0; + /* XXX Alternate between antenna A and B? */ + txant = IWN_LSB(sc->txchainmask); + tx->rflags |= IWN_RFLAG_ANT(txant); + } else { + tx->linkq = 0; + flags |= IWN_TX_LINKQ; /* enable MRR */ + } + + /* Set physical address of "scratch area". */ + tx->loaddr = htole32(IWN_LOADDR(data->scratch_paddr)); + tx->hiaddr = IWN_HIADDR(data->scratch_paddr); + + /* Copy 802.11 header in TX command. */ + memcpy((uint8_t *)(tx + 1), wh, hdrlen); + + /* Trim 802.11 header. */ + m_adj(m, hdrlen); + tx->security = 0; + tx->flags = htole32(flags); + + if (m->m_len > 0) { + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, + m, segs, &nsegs, BUS_DMA_NOWAIT); + if (error == EFBIG) { + /* too many fragments, linearize */ + mnew = m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER); + if (mnew == NULL) { + device_printf(sc->sc_dev, + "%s: could not defrag mbuf\n", __func__); + m_freem(m); + return ENOBUFS; + } + m = mnew; + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, + data->map, m, segs, &nsegs, BUS_DMA_NOWAIT); + } + if (error != 0) { + device_printf(sc->sc_dev, + "%s: bus_dmamap_load_mbuf_sg failed, error %d\n", + __func__, error); + m_freem(m); + return error; + } + } + + data->m = m; + data->ni = ni; + + DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d\n", + __func__, ring->qid, ring->cur, m->m_pkthdr.len, nsegs); + + /* Fill TX descriptor. */ + desc->nsegs = 1 + nsegs; + /* First DMA segment is used by the TX command. */ + desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr)); + desc->segs[0].len = htole16(IWN_HIADDR(data->cmd_paddr) | + (4 + sizeof (*tx) + hdrlen + pad) << 4); + /* Other DMA segments are for data payload. */ + for (i = 1; i <= nsegs; i++) { + desc->segs[i].addr = htole32(IWN_LOADDR(segs[i - 1].ds_addr)); + desc->segs[i].len = htole16(IWN_HIADDR(segs[i - 1].ds_addr) | + segs[i - 1].ds_len << 4); + } + + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map, + BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); + +#ifdef notyet + /* Update TX scheduler. */ + hal->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); +#endif + + /* Kick TX ring. */ + ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur); + + /* Mark TX ring as full if we reach a certain threshold. */ + if (++ring->queued > IWN_TX_RING_HIMARK) + sc->qfullmsk |= 1 << ring->qid; + + return 0; +} + +static int +iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m, + struct ieee80211_node *ni, struct iwn_tx_ring *ring, + const struct ieee80211_bpf_params *params) +{ + const struct iwn_hal *hal = sc->sc_hal; + const struct iwn_rate *rinfo; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = ifp->if_l2com; + struct iwn_tx_cmd *cmd; + struct iwn_cmd_data *tx; + struct ieee80211_frame *wh; + struct iwn_tx_desc *desc; + struct iwn_tx_data *data; + struct mbuf *mnew; + bus_addr_t paddr; + bus_dma_segment_t segs[IWN_MAX_SCATTER]; + uint32_t flags; + u_int hdrlen; + int totlen, error, pad, nsegs = 0, i, rate; + uint8_t ridx, type, txant; + + IWN_LOCK_ASSERT(sc); + + wh = mtod(m, struct ieee80211_frame *); + hdrlen = ieee80211_anyhdrsize(wh); + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + desc = &ring->desc[ring->cur]; + data = &ring->data[ring->cur]; + + /* Choose a TX rate index. */ + rate = params->ibp_rate0; + if (!ieee80211_isratevalid(ic->ic_rt, rate)) { + /* XXX fall back to mcast/mgmt rate? */ + m_freem(m); + return EINVAL; + } + ridx = iwn_plcp_signal(rate); + rinfo = &iwn_rates[ridx]; + + totlen = m->m_pkthdr.len; + + /* Prepare TX firmware command. */ + cmd = &ring->cmd[ring->cur]; + cmd->code = IWN_CMD_TX_DATA; + cmd->flags = 0; + cmd->qid = ring->qid; + cmd->idx = ring->cur; + + tx = (struct iwn_cmd_data *)cmd->data; + /* NB: No need to clear tx, all fields are reinitialized here. */ + tx->scratch = 0; /* clear "scratch" area */ + + flags = 0; + if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0) + flags |= IWN_TX_NEED_ACK; + if (params->ibp_flags & IEEE80211_BPF_RTS) { + if (sc->hw_type != IWN_HW_REV_TYPE_4965) { + /* 5000 autoselects RTS/CTS or CTS-to-self. */ + flags &= ~IWN_TX_NEED_RTS; + flags |= IWN_TX_NEED_PROTECTION; + } else + flags |= IWN_TX_NEED_RTS | IWN_TX_FULL_TXOP; + } + if (params->ibp_flags & IEEE80211_BPF_CTS) { + if (sc->hw_type != IWN_HW_REV_TYPE_4965) { + /* 5000 autoselects RTS/CTS or CTS-to-self. */ + flags &= ~IWN_TX_NEED_CTS; + flags |= IWN_TX_NEED_PROTECTION; + } else + flags |= IWN_TX_NEED_CTS | IWN_TX_FULL_TXOP; + } + if (type == IEEE80211_FC0_TYPE_MGT) { + uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; + + if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) + flags |= IWN_TX_INSERT_TSTAMP; + + if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ || + subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) + tx->timeout = htole16(3); + else + tx->timeout = htole16(2); + } else + tx->timeout = htole16(0); + + if (hdrlen & 3) { + /* First segment length must be a multiple of 4. */ + flags |= IWN_TX_NEED_PADDING; + pad = 4 - (hdrlen & 3); + } else + pad = 0; + + if (ieee80211_radiotap_active_vap(vap)) { + struct iwn_tx_radiotap_header *tap = &sc->sc_txtap; + + tap->wt_flags = 0; + tap->wt_rate = rate; + + ieee80211_radiotap_tx(vap, m); + } + + tx->len = htole16(totlen); + tx->tid = 0; + tx->id = hal->broadcast_id; + tx->rts_ntries = params->ibp_try1; + tx->data_ntries = params->ibp_try0; + tx->lifetime = htole32(IWN_LIFETIME_INFINITE); + tx->plcp = rinfo->plcp; + tx->rflags = rinfo->flags; + /* Group or management frame. */ + tx->linkq = 0; + txant = IWN_LSB(sc->txchainmask); + tx->rflags |= IWN_RFLAG_ANT(txant); + /* Set physical address of "scratch area". */ + paddr = ring->cmd_dma.paddr + ring->cur * sizeof (struct iwn_tx_cmd); + tx->loaddr = htole32(IWN_LOADDR(paddr)); + tx->hiaddr = IWN_HIADDR(paddr); + + /* Copy 802.11 header in TX command. */ + memcpy((uint8_t *)(tx + 1), wh, hdrlen); + + /* Trim 802.11 header. */ + m_adj(m, hdrlen); + tx->security = 0; + tx->flags = htole32(flags); + + if (m->m_len > 0) { + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, + m, segs, &nsegs, BUS_DMA_NOWAIT); + if (error == EFBIG) { + /* Too many fragments, linearize. */ + mnew = m_collapse(m, M_DONTWAIT, IWN_MAX_SCATTER); + if (mnew == NULL) { + device_printf(sc->sc_dev, + "%s: could not defrag mbuf\n", __func__); + m_freem(m); + return ENOBUFS; + } + m = mnew; + error = bus_dmamap_load_mbuf_sg(ring->data_dmat, + data->map, m, segs, &nsegs, BUS_DMA_NOWAIT); + } + if (error != 0) { + device_printf(sc->sc_dev, + "%s: bus_dmamap_load_mbuf_sg failed, error %d\n", + __func__, error); + m_freem(m); + return error; + } + } + + data->m = m; + data->ni = ni; + + DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d\n", + __func__, ring->qid, ring->cur, m->m_pkthdr.len, nsegs); + + /* Fill TX descriptor. */ + desc->nsegs = 1 + nsegs; + /* First DMA segment is used by the TX command. */ + desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr)); + desc->segs[0].len = htole16(IWN_HIADDR(data->cmd_paddr) | + (4 + sizeof (*tx) + hdrlen + pad) << 4); + /* Other DMA segments are for data payload. */ + for (i = 1; i <= nsegs; i++) { + desc->segs[i].addr = htole32(IWN_LOADDR(segs[i - 1].ds_addr)); + desc->segs[i].len = htole16(IWN_HIADDR(segs[i - 1].ds_addr) | + segs[i - 1].ds_len << 4); + } + + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map, + BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); + +#ifdef notyet + /* Update TX scheduler. */ + hal->update_sched(sc, ring->qid, ring->cur, tx->id, totlen); +#endif + + /* Kick TX ring. */ + ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur); + + /* Mark TX ring as full if we reach a certain threshold. */ + if (++ring->queued > IWN_TX_RING_HIMARK) + sc->qfullmsk |= 1 << ring->qid; + + return 0; +} + +static int +iwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, + const struct ieee80211_bpf_params *params) +{ + struct ieee80211com *ic = ni->ni_ic; + struct ifnet *ifp = ic->ic_ifp; + struct iwn_softc *sc = ifp->if_softc; + struct iwn_tx_ring *txq; + int error = 0; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + ieee80211_free_node(ni); + m_freem(m); + return ENETDOWN; + } + + IWN_LOCK(sc); + if (params == NULL) + txq = &sc->txq[M_WME_GETAC(m)]; + else + txq = &sc->txq[params->ibp_pri & 3]; + + if (params == NULL) { + /* + * Legacy path; interpret frame contents to decide + * precisely how to send the frame. + */ + error = iwn_tx_data(sc, m, ni, txq); + } else { + /* + * Caller supplied explicit parameters to use in + * sending the frame. + */ + error = iwn_tx_data_raw(sc, m, ni, txq, params); + } + if (error != 0) { + /* NB: m is reclaimed on tx failure */ + ieee80211_free_node(ni); + ifp->if_oerrors++; + } + IWN_UNLOCK(sc); + return error; +} + +void +iwn_start(struct ifnet *ifp) +{ + struct iwn_softc *sc = ifp->if_softc; + + IWN_LOCK(sc); + iwn_start_locked(ifp); + IWN_UNLOCK(sc); +} + +void +iwn_start_locked(struct ifnet *ifp) +{ + struct iwn_softc *sc = ifp->if_softc; + struct ieee80211_node *ni; + struct iwn_tx_ring *txq; + struct mbuf *m; + int pri; + + IWN_LOCK_ASSERT(sc); + + for (;;) { + if (sc->qfullmsk != 0) { + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } + IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) + break; + ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; + pri = M_WME_GETAC(m); + txq = &sc->txq[pri]; + if (iwn_tx_data(sc, m, ni, txq) != 0) { + ifp->if_oerrors++; + ieee80211_free_node(ni); + break; + } + sc->sc_tx_timer = 5; + } +} + +static void +iwn_watchdog(struct iwn_softc *sc) +{ + if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) { + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + if_printf(ifp, "device timeout\n"); + ieee80211_runtask(ic, &sc->sc_reinit_task); + } +} + +int +iwn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct iwn_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + struct ifreq *ifr = (struct ifreq *) data; + int error = 0, startall = 0, stop = 0; + + switch (cmd) { + case SIOCSIFFLAGS: + IWN_LOCK(sc); + if (ifp->if_flags & IFF_UP) { + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + iwn_init_locked(sc); + if (IWN_READ(sc, IWN_GP_CNTRL) & IWN_GP_CNTRL_RFKILL) + startall = 1; + else + stop = 1; + } + } else { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + iwn_stop_locked(sc); + } + IWN_UNLOCK(sc); + if (startall) + ieee80211_start_all(ic); + else if (vap != NULL && stop) + ieee80211_stop(vap); + break; + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); + break; + case SIOCGIFADDR: + error = ether_ioctl(ifp, cmd, data); + break; + default: + error = EINVAL; + break; + } + return error; +} + /* * Send a command to the firmware. */ @@ -2667,15 +3391,37 @@ iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async) { struct iwn_tx_ring *ring = &sc->txq[4]; struct iwn_tx_desc *desc; + struct iwn_tx_data *data; struct iwn_tx_cmd *cmd; + struct mbuf *m; bus_addr_t paddr; + int totlen, error; IWN_LOCK_ASSERT(sc); - KASSERT(size <= sizeof cmd->data, ("Command too big")); - desc = &ring->desc[ring->cur]; - cmd = &ring->cmd[ring->cur]; + data = &ring->data[ring->cur]; + totlen = 4 + size; + + if (size > sizeof cmd->data) { + /* Command is too large to fit in a descriptor. */ + if (totlen > MCLBYTES) + return EINVAL; + m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE); + if (m == NULL) + return ENOMEM; + cmd = mtod(m, struct iwn_tx_cmd *); + error = bus_dmamap_load(ring->data_dmat, data->map, cmd, + totlen, iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT); + if (error != 0) { + m_freem(m); + return error; + } + data->m = m; + } else { + cmd = &ring->cmd[ring->cur]; + paddr = data->cmd_paddr; + } cmd->code = code; cmd->flags = 0; @@ -2683,27 +3429,63 @@ iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async) cmd->idx = ring->cur; memcpy(cmd->data, buf, size); - paddr = ring->cmd_dma.paddr + ring->cur * sizeof (struct iwn_tx_cmd); - - IWN_SET_DESC_NSEGS(desc, 1); - IWN_SET_DESC_SEG(desc, 0, paddr, 4 + size); - sc->shared->len[ring->qid][ring->cur] = htole16(8); - if (ring->cur < IWN_TX_WINDOW) { - sc->shared->len[ring->qid][ring->cur + IWN_TX_RING_COUNT] = - htole16(8); - } + desc->nsegs = 1; + desc->segs[0].addr = htole32(IWN_LOADDR(paddr)); + desc->segs[0].len = htole16(IWN_HIADDR(paddr) | totlen << 4); DPRINTF(sc, IWN_DEBUG_CMD, "%s: %s (0x%x) flags %d qid %d idx %d\n", __func__, iwn_intr_str(cmd->code), cmd->code, cmd->flags, cmd->qid, cmd->idx); - /* kick cmd ring */ - ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; - IWN_WRITE(sc, IWN_TX_WIDX, ring->qid << 8 | ring->cur); + if (size > sizeof cmd->data) { + bus_dmamap_sync(ring->data_dmat, data->map, + BUS_DMASYNC_PREWRITE); + } else { + bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map, + BUS_DMASYNC_PREWRITE); + } + bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, + BUS_DMASYNC_PREWRITE); - return async ? 0 : msleep(cmd, &sc->sc_mtx, PCATCH, "iwncmd", hz); +#ifdef notyet + /* Update TX scheduler. */ + sc->sc_hal->update_sched(sc, ring->qid, ring->cur, 0, 0); +#endif + + /* Kick command ring. */ + ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur); + + return async ? 0 : msleep(desc, &sc->sc_mtx, PCATCH, "iwncmd", hz); } +int +iwn4965_add_node(struct iwn_softc *sc, struct iwn_node_info *node, int async) +{ + struct iwn4965_node_info hnode; + caddr_t src, dst; + + /* + * We use the node structure for 5000 Series internally (it is + * a superset of the one for 4965AGN). We thus copy the common + * fields before sending the command. + */ + src = (caddr_t)node; + dst = (caddr_t)&hnode; + memcpy(dst, src, 48); + /* Skip TSC, RX MIC and TX MIC fields from ``src''. */ + memcpy(dst + 48, src + 72, 20); + return iwn_cmd(sc, IWN_CMD_ADD_NODE, &hnode, sizeof hnode, async); +} + +int +iwn5000_add_node(struct iwn_softc *sc, struct iwn_node_info *node, int async) +{ + /* Direct mapping. */ + return iwn_cmd(sc, IWN_CMD_ADD_NODE, node, sizeof (*node), async); +} + +#if 0 /* HT */ static const uint8_t iwn_ridx_to_plcp[] = { 10, 20, 55, 110, /* CCK */ 0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, 0x3 /* OFDM R1-R4 */ @@ -2716,6 +3498,7 @@ static const uint8_t iwn_mimo_mcs_to_plcp[] = { 0, 0, 0, 0, /* CCK */ 8, 8, 9, 10, 11, 12, 13, 14, 15 /* HT */ }; +#endif static const uint8_t iwn_prev_ridx[] = { /* NB: allow fallback from CCK11 to OFDM9 and from OFDM6 to CCK5 */ 0, 0, 1, 5, /* CCK */ @@ -2727,100 +3510,97 @@ static const uint8_t iwn_prev_ridx[] = { * node operating on the specified channel. */ int -iwn_set_link_quality(struct iwn_softc *sc, uint8_t id, - const struct ieee80211_channel *c, int async) +iwn_set_link_quality(struct iwn_softc *sc, uint8_t id, int async) { - struct iwn_cmd_link_quality lq; - int i, ridx; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct iwn_cmd_link_quality linkq; + const struct iwn_rate *rinfo; + int i; + uint8_t txant, ridx; - memset(&lq, 0, sizeof(lq)); - lq.id = id; - if (IEEE80211_IS_CHAN_HT(c)) { - lq.mimo = 1; - lq.ssmask = 0x1; - } else - lq.ssmask = 0x2; + /* Use the first valid TX antenna. */ + txant = IWN_LSB(sc->txchainmask); + + memset(&linkq, 0, sizeof linkq); + linkq.id = id; + linkq.antmsk_1stream = txant; + linkq.antmsk_2stream = IWN_ANT_AB; + linkq.ampdu_max = 31; + linkq.ampdu_threshold = 3; + linkq.ampdu_limit = htole16(4000); /* 4ms */ + +#if 0 /* HT */ + if (IEEE80211_IS_CHAN_HT(c)) + linkq.mimo = 1; +#endif if (id == IWN_ID_BSS) - ridx = IWN_RATE_OFDM54; - else if (IEEE80211_IS_CHAN_A(c)) - ridx = IWN_RATE_OFDM6; + ridx = IWN_RIDX_OFDM54; + else if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) + ridx = IWN_RIDX_OFDM6; else - ridx = IWN_RATE_CCK1; + ridx = IWN_RIDX_CCK1; + for (i = 0; i < IWN_MAX_TX_RETRIES; i++) { - /* XXX toggle antenna for retry patterns */ + rinfo = &iwn_rates[ridx]; +#if 0 /* HT */ if (IEEE80211_IS_CHAN_HT40(c)) { - lq.table[i].rate = iwn_mimo_mcs_to_plcp[ridx] - | IWN_RATE_MCS; - lq.table[i].rflags = IWN_RFLAG_HT - | IWN_RFLAG_HT40 - | IWN_RFLAG_ANT_A; + linkq.retry[i].plcp = iwn_mimo_mcs_to_plcp[ridx] + | IWN_RIDX_MCS; + linkq.retry[i].rflags = IWN_RFLAG_HT + | IWN_RFLAG_HT40; /* XXX shortGI */ } else if (IEEE80211_IS_CHAN_HT(c)) { - lq.table[i].rate = iwn_siso_mcs_to_plcp[ridx] - | IWN_RATE_MCS; - lq.table[i].rflags = IWN_RFLAG_HT - | IWN_RFLAG_ANT_A; + linkq.retry[i].plcp = iwn_siso_mcs_to_plcp[ridx] + | IWN_RIDX_MCS; + linkq.retry[i].rflags = IWN_RFLAG_HT; /* XXX shortGI */ - } else { - lq.table[i].rate = iwn_ridx_to_plcp[ridx]; - if (ridx <= IWN_RATE_CCK11) - lq.table[i].rflags = IWN_RFLAG_CCK; - lq.table[i].rflags |= IWN_RFLAG_ANT_B; + } else +#endif + { + linkq.retry[i].plcp = rinfo->plcp; + linkq.retry[i].rflags = rinfo->flags; } + linkq.retry[i].rflags |= IWN_RFLAG_ANT(txant); ridx = iwn_prev_ridx[ridx]; } - - lq.dsmask = 0x3; - lq.ampdu_disable = 3; - lq.ampdu_limit = htole16(4000); #ifdef IWN_DEBUG if (sc->sc_debug & IWN_DEBUG_STATE) { printf("%s: set link quality for node %d, mimo %d ssmask %d\n", - __func__, id, lq.mimo, lq.ssmask); + __func__, id, linkq.mimo, linkq.antmsk_1stream); printf("%s:", __func__); for (i = 0; i < IWN_MAX_TX_RETRIES; i++) - printf(" %d:%x", lq.table[i].rate, lq.table[i].rflags); + printf(" %d:%x", linkq.retry[i].plcp, + linkq.retry[i].rflags); printf("\n"); } #endif - return iwn_cmd(sc, IWN_CMD_TX_LINK_QUALITY, &lq, sizeof(lq), async); + return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async); } -#if 0 - /* - * Install a pairwise key into the hardware. + * Broadcast node is used to send group-addressed and management frames. */ int -iwn_set_key(struct ieee80211com *ic, struct ieee80211_node *ni, - const struct ieee80211_key *k) +iwn_add_broadcast_node(struct iwn_softc *sc, int async) { - struct iwn_softc *sc = ic->ic_softc; + const struct iwn_hal *hal = sc->sc_hal; + struct ifnet *ifp = sc->sc_ifp; struct iwn_node_info node; - - if (k->k_flags & IEEE80211_KEY_GROUP) - return 0; + int error; memset(&node, 0, sizeof node); + IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr); + node.id = hal->broadcast_id; + DPRINTF(sc, IWN_DEBUG_RESET, "%s: adding broadcast node\n", __func__); + error = hal->add_node(sc, &node, async); + if (error != 0) + return error; - switch (k->k_cipher) { - case IEEE80211_CIPHER_CCMP: - node.security = htole16(IWN_CIPHER_CCMP); - memcpy(node.key, k->k_key, k->k_len); - break; - default: - return 0; - } - - node.id = IWN_ID_BSS; - IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr); - node.control = IWN_NODE_UPDATE; - node.flags = IWN_FLAG_SET_KEY; - - return iwn_cmd(sc, IWN_CMD_ADD_NODE, &node, sizeof node, 1); + error = iwn_set_link_quality(sc, hal->broadcast_id, async); + return error; } -#endif int iwn_wme_update(struct ieee80211com *ic) @@ -2842,119 +3622,113 @@ iwn_wme_update(struct ieee80211com *ic) cmd.ac[i].txoplimit = htole16(IWN_TXOP_TO_US(wmep->wmep_txopLimit)); } + IEEE80211_UNLOCK(ic); IWN_LOCK(sc); (void) iwn_cmd(sc, IWN_CMD_EDCA_PARAMS, &cmd, sizeof cmd, 1 /*async*/); IWN_UNLOCK(sc); + IEEE80211_LOCK(ic); return 0; #undef IWN_TXOP_TO_US #undef IWN_EXP2 } +static void +iwn_update_mcast(struct ifnet *ifp) +{ + /* Ignore */ +} + void iwn_set_led(struct iwn_softc *sc, uint8_t which, uint8_t off, uint8_t on) { struct iwn_cmd_led led; + /* Clear microcode LED ownership. */ + IWN_CLRBITS(sc, IWN_LED, IWN_LED_BSM_CTRL); + led.which = which; - led.unit = htole32(100000); /* on/off in unit of 100ms */ + led.unit = htole32(10000); /* on/off in unit of 100ms */ led.off = off; led.on = on; - - (void) iwn_cmd(sc, IWN_CMD_SET_LED, &led, sizeof led, 1); + (void)iwn_cmd(sc, IWN_CMD_SET_LED, &led, sizeof led, 1); } /* - * Set the critical temperature at which the firmware will automatically stop - * the radio transmitter. + * Set the critical temperature at which the firmware will stop the radio + * and notify us. */ int iwn_set_critical_temp(struct iwn_softc *sc) { - struct iwn_ucode_info *uc = &sc->ucode_info; struct iwn_critical_temp crit; - uint32_t r1, r2, r3, temp; + int32_t temp; - r1 = le32toh(uc->temp[0].chan20MHz); - r2 = le32toh(uc->temp[1].chan20MHz); - r3 = le32toh(uc->temp[2].chan20MHz); - /* inverse function of iwn_get_temperature() */ - temp = r2 + (IWN_CTOK(110) * (r3 - r1)) / 259; - - IWN_WRITE(sc, IWN_UCODE_CLR, IWN_CTEMP_STOP_RF); + IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_CTEMP_STOP_RF); + if (sc->hw_type == IWN_HW_REV_TYPE_5150) + temp = (IWN_CTOK(110) - sc->temp_off) * -5; + else if (sc->hw_type == IWN_HW_REV_TYPE_4965) + temp = IWN_CTOK(110); + else + temp = 110; memset(&crit, 0, sizeof crit); crit.tempR = htole32(temp); - DPRINTF(sc, IWN_DEBUG_RESET, "setting critical temp to %u\n", temp); + DPRINTF(sc, IWN_DEBUG_RESET, "setting critical temp to %d\n", + temp); return iwn_cmd(sc, IWN_CMD_SET_CRITICAL_TEMP, &crit, sizeof crit, 0); } -void -iwn_enable_tsf(struct iwn_softc *sc, struct ieee80211_node *ni) +int +iwn_set_timing(struct iwn_softc *sc, struct ieee80211_node *ni) { - struct iwn_cmd_tsf tsf; + struct iwn_cmd_timing cmd; uint64_t val, mod; - memset(&tsf, 0, sizeof tsf); - memcpy(&tsf.tstamp, ni->ni_tstamp.data, sizeof (uint64_t)); - tsf.bintval = htole16(ni->ni_intval); - tsf.lintval = htole16(10); + memset(&cmd, 0, sizeof cmd); + memcpy(&cmd.tstamp, ni->ni_tstamp.data, sizeof (uint64_t)); + cmd.bintval = htole16(ni->ni_intval); + cmd.lintval = htole16(10); - /* XXX all wrong */ - /* compute remaining time until next beacon */ + /* Compute remaining time until next beacon. */ val = (uint64_t)ni->ni_intval * 1024; /* msecs -> usecs */ - DPRINTF(sc, IWN_DEBUG_ANY, "%s: val = %ju %s\n", __func__, - val, val == 0 ? "correcting" : ""); - if (val == 0) - val = 1; - mod = le64toh(tsf.tstamp) % val; - tsf.binitval = htole32((uint32_t)(val - mod)); + mod = le64toh(cmd.tstamp) % val; + cmd.binitval = htole32((uint32_t)(val - mod)); - DPRINTF(sc, IWN_DEBUG_RESET, "TSF bintval=%u tstamp=%ju, init=%u\n", - ni->ni_intval, le64toh(tsf.tstamp), (uint32_t)(val - mod)); + DPRINTF(sc, IWN_DEBUG_RESET, "timing bintval=%u tstamp=%ju, init=%u\n", + ni->ni_intval, le64toh(cmd.tstamp), (uint32_t)(val - mod)); - if (iwn_cmd(sc, IWN_CMD_TSF, &tsf, sizeof tsf, 1) != 0) - device_printf(sc->sc_dev, - "%s: could not enable TSF\n", __func__); + return iwn_cmd(sc, IWN_CMD_TIMING, &cmd, sizeof cmd, 1); } void -iwn_power_calibration(struct iwn_softc *sc, int temp) +iwn4965_power_calibration(struct iwn_softc *sc, int temp) { struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; -#if 0 - KASSERT(ic->ic_state == IEEE80211_S_RUN, ("not running")); -#endif + + /* Adjust TX power if need be (delta >= 3 degC.) */ DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: temperature %d->%d\n", __func__, sc->temp, temp); - - /* adjust Tx power if need be (delta >= 3°C) */ - if (abs(temp - sc->temp) < 3) - return; - - sc->temp = temp; - - DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: set Tx power for channel %d\n", - __func__, ieee80211_chan2ieee(ic, ic->ic_bsschan)); - if (iwn_set_txpower(sc, ic->ic_bsschan, 1) != 0) { - /* just warn, too bad for the automatic calibration... */ - device_printf(sc->sc_dev, - "%s: could not adjust Tx power\n", __func__); + if (abs(temp - sc->temp) >= 3) { + /* Record temperature of last calibration. */ + sc->temp = temp; + (void)iwn4965_set_txpower(sc, ic->ic_bsschan, 1); } } /* - * Set Tx power for a given channel (each rate has its own power settings). + * Set TX power for current channel (each rate has its own power settings). * This function takes into account the regulatory information from EEPROM, * the current temperature and the current voltage. */ int -iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) +iwn4965_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, + int async) { -/* fixed-point arithmetic division using a n-bit fractional part */ +/* Fixed-point arithmetic division using a n-bit fractional part. */ #define fdivround(a, b, n) \ ((((1 << n) * (a)) / (b) + (1 << n) / 2) / (1 << n)) -/* linear interpolation */ +/* Linear interpolation. */ #define interpolate(x, x1, y1, x2, y2, n) \ ((y1) + fdivround(((int)(x) - (x1)) * ((y2) - (y1)), (x2) - (x1), n)) @@ -2962,15 +3736,17 @@ iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct iwn_ucode_info *uc = &sc->ucode_info; - struct iwn_cmd_txpower cmd; - struct iwn_eeprom_chan_samples *chans; - const uint8_t *rf_gain, *dsp_gain; + struct iwn4965_cmd_txpower cmd; + struct iwn4965_eeprom_chan_samples *chans; int32_t vdiff, tdiff; int i, c, grp, maxpwr; - u_int chan; + const uint8_t *rf_gain, *dsp_gain; + uint8_t chan; - /* get channel number */ + /* Retrieve channel number. */ chan = ieee80211_chan2ieee(ic, ch); + DPRINTF(sc, IWN_DEBUG_RESET, "setting TX power for channel %d\n", + chan); memset(&cmd, 0, sizeof cmd); cmd.band = IEEE80211_IS_CHAN_5GHZ(ch) ? 0 : 1; @@ -2978,15 +3754,15 @@ iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) if (IEEE80211_IS_CHAN_5GHZ(ch)) { maxpwr = sc->maxpwr5GHz; - rf_gain = iwn_rf_gain_5ghz; - dsp_gain = iwn_dsp_gain_5ghz; + rf_gain = iwn4965_rf_gain_5ghz; + dsp_gain = iwn4965_dsp_gain_5ghz; } else { maxpwr = sc->maxpwr2GHz; - rf_gain = iwn_rf_gain_2ghz; - dsp_gain = iwn_dsp_gain_2ghz; + rf_gain = iwn4965_rf_gain_2ghz; + dsp_gain = iwn4965_dsp_gain_2ghz; } - /* compute voltage compensation */ + /* Compute voltage compensation. */ vdiff = ((int32_t)le32toh(uc->volt) - sc->eeprom_voltage) / 7; if (vdiff > 0) vdiff *= 2; @@ -2996,7 +3772,7 @@ iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) "%s: voltage compensation=%d (UCODE=%d, EEPROM=%d)\n", __func__, vdiff, le32toh(uc->volt), sc->eeprom_voltage); - /* get channel's attenuation group */ + /* Get channel attenuation group. */ if (chan <= 20) /* 1-20 */ grp = 4; else if (chan <= 43) /* 34-43 */ @@ -3010,16 +3786,18 @@ iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW, "%s: chan %d, attenuation group=%d\n", __func__, chan, grp); - /* get channel's sub-band */ + /* Get channel sub-band. */ for (i = 0; i < IWN_NBANDS; i++) if (sc->bands[i].lo != 0 && sc->bands[i].lo <= chan && chan <= sc->bands[i].hi) break; + if (i == IWN_NBANDS) /* Can't happen in real-life. */ + return EINVAL; chans = sc->bands[i].chans; DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW, "%s: chan %d sub-band=%d\n", __func__, chan, i); - for (c = 0; c < IWN_NTXCHAINS; c++) { + for (c = 0; c < 2; c++) { uint8_t power, gain, temp; int maxchpwr, pwr, ridx, idx; @@ -3036,29 +3814,31 @@ iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) "%s: Tx chain %d: power=%d gain=%d temp=%d\n", __func__, c, power, gain, temp); - /* compute temperature compensation */ + /* Compute temperature compensation. */ tdiff = ((sc->temp - temp) * 2) / tdiv[grp]; DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW, "%s: temperature compensation=%d (current=%d, EEPROM=%d)\n", __func__, tdiff, sc->temp, temp); for (ridx = 0; ridx <= IWN_RIDX_MAX; ridx++) { - maxchpwr = ch->ic_maxpower; - if ((ridx / 8) & 1) { - /* MIMO: decrease Tx power (-3dB) */ - maxchpwr -= 6; - } + /* Convert dBm to half-dBm. */ + maxchpwr = sc->maxpwr[chan] * 2; + if ((ridx / 8) & 1) + maxchpwr -= 6; /* MIMO 2T: -3dB */ - pwr = maxpwr - 10; + pwr = maxpwr; - /* decrease power for highest OFDM rates */ - if ((ridx % 8) == 5) /* 48Mbit/s */ - pwr -= 5; - else if ((ridx % 8) == 6) /* 54Mbit/s */ - pwr -= 7; - else if ((ridx % 8) == 7) /* 60Mbit/s */ - pwr -= 10; + /* Adjust TX power based on rate. */ + if ((ridx % 8) == 5) + pwr -= 15; /* OFDM48: -7.5dB */ + else if ((ridx % 8) == 6) + pwr -= 17; /* OFDM54: -8.5dB */ + else if ((ridx % 8) == 7) + pwr -= 20; /* OFDM60: -10dB */ + else + pwr -= 10; /* Others: -5dB */ + /* Do not exceed channel max TX power. */ if (pwr > maxchpwr) pwr = maxchpwr; @@ -3071,11 +3851,11 @@ iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) if (ridx == IWN_RIDX_MAX) idx += 5; /* CCK */ - /* make sure idx stays in a valid range */ + /* Make sure idx stays in a valid range. */ if (idx < 0) idx = 0; - else if (idx > IWN_MAX_PWR_INDEX) - idx = IWN_MAX_PWR_INDEX; + else if (idx > IWN4965_MAX_PWR_INDEX) + idx = IWN4965_MAX_PWR_INDEX; DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW, "%s: Tx chain %d, rate idx %d: power=%d\n", @@ -3093,40 +3873,80 @@ iwn_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, int async) #undef fdivround } -/* - * Get the best (maximum) RSSI among the - * connected antennas and convert to dBm. - */ -int8_t -iwn_get_rssi(struct iwn_softc *sc, const struct iwn_rx_stat *stat) +int +iwn5000_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch, + int async) { - int mask, agc, rssi; + struct iwn5000_cmd_txpower cmd; - mask = (le16toh(stat->antenna) >> 4) & 0x7; - agc = (le16toh(stat->agc) >> 7) & 0x7f; + /* + * TX power calibration is handled automatically by the firmware + * for 5000 Series. + */ + memset(&cmd, 0, sizeof cmd); + cmd.global_limit = 2 * IWN5000_TXPOWER_MAX_DBM; /* 16 dBm */ + cmd.flags = IWN5000_TXPOWER_NO_CLOSED; + cmd.srv_limit = IWN5000_TXPOWER_AUTO; + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: setting TX power\n", __func__); + return iwn_cmd(sc, IWN_CMD_TXPOWER_DBM, &cmd, sizeof cmd, async); +} + +/* + * Retrieve the maximum RSSI (in dBm) among receivers. + */ +int +iwn4965_get_rssi(struct iwn_softc *sc, struct iwn_rx_stat *stat) +{ + struct iwn4965_rx_phystat *phy = (void *)stat->phybuf; + uint8_t mask, agc; + int rssi; + + mask = (le16toh(phy->antenna) >> 4) & IWN_ANT_ABC; + agc = (le16toh(phy->agc) >> 7) & 0x7f; rssi = 0; #if 0 - if (mask & (1 << 0)) /* Ant A */ - rssi = max(rssi, stat->rssi[0]); - if (mask & (1 << 1)) /* Ant B */ - rssi = max(rssi, stat->rssi[2]); - if (mask & (1 << 2)) /* Ant C */ - rssi = max(rssi, stat->rssi[4]); + if (mask & IWN_ANT_A) /* Ant A */ + rssi = max(rssi, phy->rssi[0]); + if (mask & IWN_ATH_B) /* Ant B */ + rssi = max(rssi, phy->rssi[2]); + if (mask & IWN_ANT_C) /* Ant C */ + rssi = max(rssi, phy->rssi[4]); #else - rssi = max(rssi, stat->rssi[0]); - rssi = max(rssi, stat->rssi[2]); - rssi = max(rssi, stat->rssi[4]); + rssi = max(rssi, phy->rssi[0]); + rssi = max(rssi, phy->rssi[2]); + rssi = max(rssi, phy->rssi[4]); #endif + DPRINTF(sc, IWN_DEBUG_RECV, "%s: agc %d mask 0x%x rssi %d %d %d " "result %d\n", __func__, agc, mask, - stat->rssi[0], stat->rssi[2], stat->rssi[4], + phy->rssi[0], phy->rssi[2], phy->rssi[4], + rssi - agc - IWN_RSSI_TO_DBM); + return rssi - agc - IWN_RSSI_TO_DBM; +} + +int +iwn5000_get_rssi(struct iwn_softc *sc, struct iwn_rx_stat *stat) +{ + struct iwn5000_rx_phystat *phy = (void *)stat->phybuf; + int rssi; + uint8_t agc; + + agc = (le32toh(phy->agc) >> 9) & 0x7f; + + rssi = MAX(le16toh(phy->rssi[0]) & 0xff, + le16toh(phy->rssi[1]) & 0xff); + rssi = MAX(le16toh(phy->rssi[2]) & 0xff, rssi); + + DPRINTF(sc, IWN_DEBUG_RECV, "%s: agc %d rssi %d %d %d " + "result %d\n", __func__, agc, + phy->rssi[0], phy->rssi[1], phy->rssi[2], rssi - agc - IWN_RSSI_TO_DBM); return rssi - agc - IWN_RSSI_TO_DBM; } /* - * Get the average noise among Rx antennas (in dBm). + * Retrieve the average noise (in dBm) among receivers. */ int iwn_get_noise(const struct iwn_rx_general_stats *stats) @@ -3135,21 +3955,20 @@ iwn_get_noise(const struct iwn_rx_general_stats *stats) total = nbant = 0; for (i = 0; i < 3; i++) { - noise = le32toh(stats->noise[i]) & 0xff; - if (noise != 0) { - total += noise; - nbant++; - } + if ((noise = le32toh(stats->noise[i]) & 0xff) == 0) + continue; + total += noise; + nbant++; } - /* there should be at least one antenna but check anyway */ + /* There should be at least one antenna but check anyway. */ return (nbant == 0) ? -127 : (total / nbant) - 107; } /* - * Read temperature (in degC) from the on-board thermal sensor. + * Compute temperature (in degC) from last received statistics. */ int -iwn_get_temperature(struct iwn_softc *sc) +iwn4965_get_temperature(struct iwn_softc *sc) { struct iwn_ucode_info *uc = &sc->ucode_info; int32_t r1, r2, r3, r4, temp; @@ -3159,121 +3978,236 @@ iwn_get_temperature(struct iwn_softc *sc) r3 = le32toh(uc->temp[2].chan20MHz); r4 = le32toh(sc->rawtemp); - if (r1 == r3) /* prevents division by 0 (should not happen) */ + if (r1 == r3) /* Prevents division by 0 (should not happen.) */ return 0; - /* sign-extend 23-bit R4 value to 32-bit */ + /* Sign-extend 23-bit R4 value to 32-bit. */ r4 = (r4 << 8) >> 8; - /* compute temperature */ + /* Compute temperature in Kelvin. */ temp = (259 * (r4 - r2)) / (r3 - r1); temp = (temp * 97) / 100 + 8; + DPRINTF(sc, IWN_DEBUG_ANY, "temperature %dK/%dC\n", temp, + IWN_KTOC(temp)); return IWN_KTOC(temp); } +int +iwn5000_get_temperature(struct iwn_softc *sc) +{ + int32_t temp; + + /* + * Temperature is not used by the driver for 5000 Series because + * TX power calibration is handled by firmware. We export it to + * users through the sensor framework though. + */ + temp = le32toh(sc->rawtemp); + if (sc->hw_type == IWN_HW_REV_TYPE_5150) { + temp = (temp / -5) + sc->temp_off; + temp = IWN_KTOC(temp); + } + return temp; +} + /* * Initialize sensitivity calibration state machine. */ int iwn_init_sensitivity(struct iwn_softc *sc) { + const struct iwn_hal *hal = sc->sc_hal; struct iwn_calib_state *calib = &sc->calib; - struct iwn_phy_calib_cmd cmd; + uint32_t flags; int error; - /* reset calibration state */ + /* Reset calibration state machine. */ memset(calib, 0, sizeof (*calib)); calib->state = IWN_CALIB_STATE_INIT; calib->cck_state = IWN_CCK_STATE_HIFA; - /* initial values taken from the reference driver */ - calib->corr_ofdm_x1 = 105; - calib->corr_ofdm_mrc_x1 = 220; - calib->corr_ofdm_x4 = 90; - calib->corr_ofdm_mrc_x4 = 170; - calib->corr_cck_x4 = 125; - calib->corr_cck_mrc_x4 = 200; - calib->energy_cck = 100; + /* Set initial correlation values. */ + calib->ofdm_x1 = sc->limits->min_ofdm_x1; + calib->ofdm_mrc_x1 = sc->limits->min_ofdm_mrc_x1; + calib->ofdm_x4 = 90; + calib->ofdm_mrc_x4 = sc->limits->min_ofdm_mrc_x4; + calib->cck_x4 = 125; + calib->cck_mrc_x4 = sc->limits->min_cck_mrc_x4; + calib->energy_cck = sc->limits->energy_cck; - /* write initial sensitivity values */ + /* Write initial sensitivity. */ error = iwn_send_sensitivity(sc); if (error != 0) return error; - memset(&cmd, 0, sizeof cmd); - cmd.code = IWN_SET_DIFF_GAIN; - /* differential gains initially set to 0 for all 3 antennas */ + /* Write initial gains. */ + error = hal->init_gains(sc); + if (error != 0) + return error; + + /* Request statistics at each beacon interval. */ + flags = 0; DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: calibrate phy\n", __func__); - return iwn_cmd(sc, IWN_PHY_CALIB, &cmd, sizeof cmd, 1); + return iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags, sizeof flags, 1); } /* * Collect noise and RSSI statistics for the first 20 beacons received * after association and use them to determine connected antennas and - * set differential gains. + * to set differential gains. */ void -iwn_compute_differential_gain(struct iwn_softc *sc, +iwn_collect_noise(struct iwn_softc *sc, const struct iwn_rx_general_stats *stats) { + const struct iwn_hal *hal = sc->sc_hal; struct iwn_calib_state *calib = &sc->calib; - struct iwn_phy_calib_cmd cmd; - int i, val; + uint32_t val; + int i; - /* accumulate RSSI and noise for all 3 antennas */ + /* Accumulate RSSI and noise for all 3 antennas. */ for (i = 0; i < 3; i++) { calib->rssi[i] += le32toh(stats->rssi[i]) & 0xff; calib->noise[i] += le32toh(stats->noise[i]) & 0xff; } - - /* we update differential gain only once after 20 beacons */ + /* NB: We update differential gains only once after 20 beacons. */ if (++calib->nbeacons < 20) return; - /* determine antenna with highest average RSSI */ - val = max(calib->rssi[0], calib->rssi[1]); - val = max(calib->rssi[2], val); + /* Determine highest average RSSI. */ + val = MAX(calib->rssi[0], calib->rssi[1]); + val = MAX(calib->rssi[2], val); - /* determine which antennas are connected */ - sc->antmsk = 0; + /* Determine which antennas are connected. */ + sc->chainmask = 0; for (i = 0; i < 3; i++) if (val - calib->rssi[i] <= 15 * 20) - sc->antmsk |= 1 << i; - /* if neither Ant A and Ant B are connected.. */ - if ((sc->antmsk & (1 << 0 | 1 << 1)) == 0) - sc->antmsk |= 1 << 1; /* ..mark Ant B as connected! */ + sc->chainmask |= 1 << i; + /* If none of the TX antennas are connected, keep at least one. */ + if ((sc->chainmask & sc->txchainmask) == 0) + sc->chainmask |= IWN_LSB(sc->txchainmask); - /* get minimal noise among connected antennas */ - val = INT_MAX; /* ok, there's at least one */ - for (i = 0; i < 3; i++) - if (sc->antmsk & (1 << i)) - val = min(calib->noise[i], val); + (void)hal->set_gains(sc); + calib->state = IWN_CALIB_STATE_RUN; + +#ifdef notyet + /* XXX Disable RX chains with no antennas connected. */ + sc->rxon.rxchain = htole16(IWN_RXCHAIN_SEL(sc->chainmask)); + (void)iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1); +#endif + +#if 0 + /* XXX: not yet */ + /* Enable power-saving mode if requested by user. */ + if (sc->sc_ic.ic_flags & IEEE80211_F_PMGTON) + (void)iwn_set_pslevel(sc, 0, 3, 1); +#endif +} + +int +iwn4965_init_gains(struct iwn_softc *sc) +{ + struct iwn_phy_calib_gain cmd; memset(&cmd, 0, sizeof cmd); - cmd.code = IWN_SET_DIFF_GAIN; - /* set differential gains for connected antennas */ + cmd.code = IWN4965_PHY_CALIB_DIFF_GAIN; + /* Differential gains initially set to 0 for all 3 antennas. */ + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "%s: setting initial differential gains\n", __func__); + return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1); +} + +int +iwn5000_init_gains(struct iwn_softc *sc) +{ + struct iwn_phy_calib cmd; + + if (sc->hw_type == IWN_HW_REV_TYPE_6050) + return 0; + + memset(&cmd, 0, sizeof cmd); + cmd.code = IWN5000_PHY_CALIB_RESET_NOISE_GAIN; + cmd.ngroups = 1; + cmd.isvalid = 1; + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "%s: setting initial differential gains\n", __func__); + return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1); +} + +int +iwn4965_set_gains(struct iwn_softc *sc) +{ + struct iwn_calib_state *calib = &sc->calib; + struct iwn_phy_calib_gain cmd; + int i, delta, noise; + + /* Get minimal noise among connected antennas. */ + noise = INT_MAX; /* NB: There's at least one antenna. */ + for (i = 0; i < 3; i++) + if (sc->chainmask & (1 << i)) + noise = MIN(calib->noise[i], noise); + + memset(&cmd, 0, sizeof cmd); + cmd.code = IWN4965_PHY_CALIB_DIFF_GAIN; + /* Set differential gains for connected antennas. */ for (i = 0; i < 3; i++) { - if (sc->antmsk & (1 << i)) { - cmd.gain[i] = (calib->noise[i] - val) / 30; - /* limit differential gain to 3 */ - cmd.gain[i] = min(cmd.gain[i], 3); - cmd.gain[i] |= IWN_GAIN_SET; + if (sc->chainmask & (1 << i)) { + /* Compute attenuation (in unit of 1.5dB). */ + delta = (noise - (int32_t)calib->noise[i]) / 30; + /* NB: delta <= 0 */ + /* Limit to [-4.5dB,0]. */ + cmd.gain[i] = MIN(abs(delta), 3); + if (delta < 0) + cmd.gain[i] |= 1 << 2; /* sign bit */ } } DPRINTF(sc, IWN_DEBUG_CALIBRATE, - "%s: set differential gains Ant A/B/C: %x/%x/%x (%x)\n", - __func__,cmd.gain[0], cmd.gain[1], cmd.gain[2], sc->antmsk); - if (iwn_cmd(sc, IWN_PHY_CALIB, &cmd, sizeof cmd, 1) == 0) - calib->state = IWN_CALIB_STATE_RUN; + "setting differential gains Ant A/B/C: %x/%x/%x (%x)\n", + cmd.gain[0], cmd.gain[1], cmd.gain[2], sc->chainmask); + return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1); +} + +int +iwn5000_set_gains(struct iwn_softc *sc) +{ + struct iwn_calib_state *calib = &sc->calib; + struct iwn_phy_calib_gain cmd; + int i, ant, delta; + + if (sc->hw_type == IWN_HW_REV_TYPE_6050) + return 0; + + memset(&cmd, 0, sizeof cmd); + cmd.code = IWN5000_PHY_CALIB_NOISE_GAIN; + cmd.ngroups = 1; + cmd.isvalid = 1; + /* Get first available RX antenna as referential. */ + ant = IWN_LSB(sc->rxchainmask); + /* Set differential gains for other antennas. */ + for (i = ant + 1; i < 3; i++) { + if (sc->chainmask & (1 << i)) { + /* The delta is relative to antenna "ant". */ + delta = ((int32_t)calib->noise[ant] - + (int32_t)calib->noise[i]) / 30; + /* Limit to [-4.5dB,+4.5dB]. */ + cmd.gain[i - 1] = MIN(abs(delta), 3); + if (delta < 0) + cmd.gain[i - 1] |= 1 << 2; /* sign bit */ + } + } + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "setting differential gains Ant B/C: %x/%x (%x)\n", + cmd.gain[0], cmd.gain[1], sc->chainmask); + return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1); } /* - * Tune RF Rx sensitivity based on the number of false alarms detected + * Tune RF RX sensitivity based on the number of false alarms detected * during the last beacon period. */ void iwn_tune_sensitivity(struct iwn_softc *sc, const struct iwn_rx_stats *stats) { -#define inc_clip(val, inc, max) \ +#define inc(val, inc, max) \ if ((val) < (max)) { \ if ((val) < (max) - (inc)) \ (val) += (inc); \ @@ -3281,7 +4215,7 @@ iwn_tune_sensitivity(struct iwn_softc *sc, const struct iwn_rx_stats *stats) (val) = (max); \ needs_update = 1; \ } -#define dec_clip(val, dec, min) \ +#define dec(val, dec, min) \ if ((val) > (min)) { \ if ((val) > (min) + (dec)) \ (val) -= (dec); \ @@ -3290,134 +4224,136 @@ iwn_tune_sensitivity(struct iwn_softc *sc, const struct iwn_rx_stats *stats) needs_update = 1; \ } + const struct iwn_sensitivity_limits *limits = sc->limits; struct iwn_calib_state *calib = &sc->calib; uint32_t val, rxena, fa; uint32_t energy[3], energy_min; uint8_t noise[3], noise_ref; int i, needs_update = 0; - /* check that we've been enabled long enough */ - if ((rxena = le32toh(stats->general.load)) == 0) + /* Check that we've been enabled long enough. */ + rxena = le32toh(stats->general.load); + if (rxena == 0) return; - /* compute number of false alarms since last call for OFDM */ + /* Compute number of false alarms since last call for OFDM. */ fa = le32toh(stats->ofdm.bad_plcp) - calib->bad_plcp_ofdm; fa += le32toh(stats->ofdm.fa) - calib->fa_ofdm; fa *= 200 * 1024; /* 200TU */ - /* save counters values for next call */ + /* Save counters values for next call. */ calib->bad_plcp_ofdm = le32toh(stats->ofdm.bad_plcp); calib->fa_ofdm = le32toh(stats->ofdm.fa); if (fa > 50 * rxena) { - /* high false alarm count, decrease sensitivity */ + /* High false alarm count, decrease sensitivity. */ DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: OFDM high false alarm count: %u\n", __func__, fa); - inc_clip(calib->corr_ofdm_x1, 1, 140); - inc_clip(calib->corr_ofdm_mrc_x1, 1, 270); - inc_clip(calib->corr_ofdm_x4, 1, 120); - inc_clip(calib->corr_ofdm_mrc_x4, 1, 210); + inc(calib->ofdm_x1, 1, limits->max_ofdm_x1); + inc(calib->ofdm_mrc_x1, 1, limits->max_ofdm_mrc_x1); + inc(calib->ofdm_x4, 1, limits->max_ofdm_x4); + inc(calib->ofdm_mrc_x4, 1, limits->max_ofdm_mrc_x4); } else if (fa < 5 * rxena) { - /* low false alarm count, increase sensitivity */ + /* Low false alarm count, increase sensitivity. */ DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: OFDM low false alarm count: %u\n", __func__, fa); - dec_clip(calib->corr_ofdm_x1, 1, 105); - dec_clip(calib->corr_ofdm_mrc_x1, 1, 220); - dec_clip(calib->corr_ofdm_x4, 1, 85); - dec_clip(calib->corr_ofdm_mrc_x4, 1, 170); + dec(calib->ofdm_x1, 1, limits->min_ofdm_x1); + dec(calib->ofdm_mrc_x1, 1, limits->min_ofdm_mrc_x1); + dec(calib->ofdm_x4, 1, limits->min_ofdm_x4); + dec(calib->ofdm_mrc_x4, 1, limits->min_ofdm_mrc_x4); } - /* compute maximum noise among 3 antennas */ + /* Compute maximum noise among 3 receivers. */ for (i = 0; i < 3; i++) noise[i] = (le32toh(stats->general.noise[i]) >> 8) & 0xff; - val = max(noise[0], noise[1]); - val = max(noise[2], val); - /* insert it into our samples table */ + val = MAX(noise[0], noise[1]); + val = MAX(noise[2], val); + /* Insert it into our samples table. */ calib->noise_samples[calib->cur_noise_sample] = val; calib->cur_noise_sample = (calib->cur_noise_sample + 1) % 20; - /* compute maximum noise among last 20 samples */ + /* Compute maximum noise among last 20 samples. */ noise_ref = calib->noise_samples[0]; for (i = 1; i < 20; i++) - noise_ref = max(noise_ref, calib->noise_samples[i]); + noise_ref = MAX(noise_ref, calib->noise_samples[i]); - /* compute maximum energy among 3 antennas */ + /* Compute maximum energy among 3 receivers. */ for (i = 0; i < 3; i++) energy[i] = le32toh(stats->general.energy[i]); - val = min(energy[0], energy[1]); - val = min(energy[2], val); - /* insert it into our samples table */ + val = MIN(energy[0], energy[1]); + val = MIN(energy[2], val); + /* Insert it into our samples table. */ calib->energy_samples[calib->cur_energy_sample] = val; calib->cur_energy_sample = (calib->cur_energy_sample + 1) % 10; - /* compute minimum energy among last 10 samples */ + /* Compute minimum energy among last 10 samples. */ energy_min = calib->energy_samples[0]; for (i = 1; i < 10; i++) - energy_min = max(energy_min, calib->energy_samples[i]); + energy_min = MAX(energy_min, calib->energy_samples[i]); energy_min += 6; - /* compute number of false alarms since last call for CCK */ + /* Compute number of false alarms since last call for CCK. */ fa = le32toh(stats->cck.bad_plcp) - calib->bad_plcp_cck; fa += le32toh(stats->cck.fa) - calib->fa_cck; fa *= 200 * 1024; /* 200TU */ - /* save counters values for next call */ + /* Save counters values for next call. */ calib->bad_plcp_cck = le32toh(stats->cck.bad_plcp); calib->fa_cck = le32toh(stats->cck.fa); if (fa > 50 * rxena) { - /* high false alarm count, decrease sensitivity */ + /* High false alarm count, decrease sensitivity. */ DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: CCK high false alarm count: %u\n", __func__, fa); calib->cck_state = IWN_CCK_STATE_HIFA; calib->low_fa = 0; - if (calib->corr_cck_x4 > 160) { + if (calib->cck_x4 > 160) { calib->noise_ref = noise_ref; if (calib->energy_cck > 2) - dec_clip(calib->energy_cck, 2, energy_min); + dec(calib->energy_cck, 2, energy_min); } - if (calib->corr_cck_x4 < 160) { - calib->corr_cck_x4 = 161; + if (calib->cck_x4 < 160) { + calib->cck_x4 = 161; needs_update = 1; } else - inc_clip(calib->corr_cck_x4, 3, 200); + inc(calib->cck_x4, 3, limits->max_cck_x4); - inc_clip(calib->corr_cck_mrc_x4, 3, 400); + inc(calib->cck_mrc_x4, 3, limits->max_cck_mrc_x4); } else if (fa < 5 * rxena) { - /* low false alarm count, increase sensitivity */ + /* Low false alarm count, increase sensitivity. */ DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: CCK low false alarm count: %u\n", __func__, fa); calib->cck_state = IWN_CCK_STATE_LOFA; calib->low_fa++; - if (calib->cck_state != 0 && - ((calib->noise_ref - noise_ref) > 2 || + if (calib->cck_state != IWN_CCK_STATE_INIT && + (((int32_t)calib->noise_ref - (int32_t)noise_ref) > 2 || calib->low_fa > 100)) { - inc_clip(calib->energy_cck, 2, 97); - dec_clip(calib->corr_cck_x4, 3, 125); - dec_clip(calib->corr_cck_mrc_x4, 3, 200); + inc(calib->energy_cck, 2, limits->min_energy_cck); + dec(calib->cck_x4, 3, limits->min_cck_x4); + dec(calib->cck_mrc_x4, 3, limits->min_cck_mrc_x4); } } else { - /* not worth to increase or decrease sensitivity */ + /* Not worth to increase or decrease sensitivity. */ DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: CCK normal false alarm count: %u\n", __func__, fa); calib->low_fa = 0; calib->noise_ref = noise_ref; if (calib->cck_state == IWN_CCK_STATE_HIFA) { - /* previous interval had many false alarms */ - dec_clip(calib->energy_cck, 8, energy_min); + /* Previous interval had many false alarms. */ + dec(calib->energy_cck, 8, energy_min); } calib->cck_state = IWN_CCK_STATE_INIT; } if (needs_update) (void)iwn_send_sensitivity(sc); -#undef dec_clip -#undef inc_clip +#undef dec +#undef inc } int @@ -3428,115 +4364,436 @@ iwn_send_sensitivity(struct iwn_softc *sc) memset(&cmd, 0, sizeof cmd); cmd.which = IWN_SENSITIVITY_WORKTBL; - /* OFDM modulation */ - cmd.corr_ofdm_x1 = htole16(calib->corr_ofdm_x1); - cmd.corr_ofdm_mrc_x1 = htole16(calib->corr_ofdm_mrc_x1); - cmd.corr_ofdm_x4 = htole16(calib->corr_ofdm_x4); - cmd.corr_ofdm_mrc_x4 = htole16(calib->corr_ofdm_mrc_x4); - cmd.energy_ofdm = htole16(100); + /* OFDM modulation. */ + cmd.corr_ofdm_x1 = htole16(calib->ofdm_x1); + cmd.corr_ofdm_mrc_x1 = htole16(calib->ofdm_mrc_x1); + cmd.corr_ofdm_x4 = htole16(calib->ofdm_x4); + cmd.corr_ofdm_mrc_x4 = htole16(calib->ofdm_mrc_x4); + cmd.energy_ofdm = htole16(sc->limits->energy_ofdm); cmd.energy_ofdm_th = htole16(62); - /* CCK modulation */ - cmd.corr_cck_x4 = htole16(calib->corr_cck_x4); - cmd.corr_cck_mrc_x4 = htole16(calib->corr_cck_mrc_x4); + /* CCK modulation. */ + cmd.corr_cck_x4 = htole16(calib->cck_x4); + cmd.corr_cck_mrc_x4 = htole16(calib->cck_mrc_x4); cmd.energy_cck = htole16(calib->energy_cck); - /* Barker modulation: use default values */ + /* Barker modulation: use default values. */ cmd.corr_barker = htole16(190); cmd.corr_barker_mrc = htole16(390); - DPRINTF(sc, IWN_DEBUG_RESET, + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: set sensitivity %d/%d/%d/%d/%d/%d/%d\n", __func__, - calib->corr_ofdm_x1, calib->corr_ofdm_mrc_x1, calib->corr_ofdm_x4, - calib->corr_ofdm_mrc_x4, calib->corr_cck_x4, - calib->corr_cck_mrc_x4, calib->energy_cck); - return iwn_cmd(sc, IWN_SENSITIVITY, &cmd, sizeof cmd, 1); + calib->ofdm_x1, calib->ofdm_mrc_x1, calib->ofdm_x4, + calib->ofdm_mrc_x4, calib->cck_x4, + calib->cck_mrc_x4, calib->energy_cck); + return iwn_cmd(sc, IWN_CMD_SET_SENSITIVITY, &cmd, sizeof cmd, 1); +} + +/* + * Set STA mode power saving level (between 0 and 5). + * Level 0 is CAM (Continuously Aware Mode), 5 is for maximum power saving. + */ +int +iwn_set_pslevel(struct iwn_softc *sc, int dtim, int level, int async) +{ + const struct iwn_pmgt *pmgt; + struct iwn_pmgt_cmd cmd; + uint32_t max, skip_dtim; + uint32_t tmp; + int i; + + /* Select which PS parameters to use. */ + if (dtim <= 2) + pmgt = &iwn_pmgt[0][level]; + else if (dtim <= 10) + pmgt = &iwn_pmgt[1][level]; + else + pmgt = &iwn_pmgt[2][level]; + + memset(&cmd, 0, sizeof cmd); + if (level != 0) /* not CAM */ + cmd.flags |= htole16(IWN_PS_ALLOW_SLEEP); + if (level == 5) + cmd.flags |= htole16(IWN_PS_FAST_PD); + /* Retrieve PCIe Active State Power Management (ASPM). */ + tmp = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1); + if (!(tmp & 0x1)) /* L0s Entry disabled. */ + cmd.flags |= htole16(IWN_PS_PCI_PMGT); + cmd.rxtimeout = htole32(pmgt->rxtimeout * 1024); + cmd.txtimeout = htole32(pmgt->txtimeout * 1024); + + if (dtim == 0) { + dtim = 1; + skip_dtim = 0; + } else + skip_dtim = pmgt->skip_dtim; + if (skip_dtim != 0) { + cmd.flags |= htole16(IWN_PS_SLEEP_OVER_DTIM); + max = pmgt->intval[4]; + if (max == (uint32_t)-1) + max = dtim * (skip_dtim + 1); + else if (max > dtim) + max = (max / dtim) * dtim; + } else + max = dtim; + for (i = 0; i < 5; i++) + cmd.intval[i] = htole32(MIN(max, pmgt->intval[i])); + + DPRINTF(sc, IWN_DEBUG_RESET, "setting power saving level to %d\n", + level); + return iwn_cmd(sc, IWN_CMD_SET_POWER_MODE, &cmd, sizeof cmd, async); +} + +int +iwn_config(struct iwn_softc *sc) +{ + const struct iwn_hal *hal = sc->sc_hal; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct iwn_bluetooth bluetooth; + uint32_t txmask; + int error; + uint16_t rxchain; + + /* Configure valid TX chains for 5000 Series. */ + if (sc->hw_type != IWN_HW_REV_TYPE_4965) { + txmask = htole32(sc->txchainmask); + DPRINTF(sc, IWN_DEBUG_RESET, + "%s: configuring valid TX chains 0x%x\n", __func__, txmask); + error = iwn_cmd(sc, IWN5000_CMD_TX_ANT_CONFIG, &txmask, + sizeof txmask, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not configure valid TX chains, " + "error %d\n", __func__, error); + return error; + } + } + + /* Configure bluetooth coexistence. */ + memset(&bluetooth, 0, sizeof bluetooth); + bluetooth.flags = IWN_BT_COEX_MODE_4WIRE; + bluetooth.lead_time = IWN_BT_LEAD_TIME_DEF; + bluetooth.max_kill = IWN_BT_MAX_KILL_DEF; + DPRINTF(sc, IWN_DEBUG_RESET, "%s: config bluetooth coexistence\n", + __func__); + error = iwn_cmd(sc, IWN_CMD_BT_COEX, &bluetooth, sizeof bluetooth, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not configure bluetooth coexistence, error %d\n", + __func__, error); + return error; + } + + /* Set mode, channel, RX filter and enable RX. */ + memset(&sc->rxon, 0, sizeof (struct iwn_rxon)); + IEEE80211_ADDR_COPY(sc->rxon.myaddr, IF_LLADDR(ifp)); + IEEE80211_ADDR_COPY(sc->rxon.wlap, IF_LLADDR(ifp)); + sc->rxon.chan = ieee80211_chan2ieee(ic, ic->ic_curchan); + sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); + if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) + sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); + switch (ic->ic_opmode) { + case IEEE80211_M_STA: + sc->rxon.mode = IWN_MODE_STA; + sc->rxon.filter = htole32(IWN_FILTER_MULTICAST); + break; + case IEEE80211_M_MONITOR: + sc->rxon.mode = IWN_MODE_MONITOR; + sc->rxon.filter = htole32(IWN_FILTER_MULTICAST | + IWN_FILTER_CTL | IWN_FILTER_PROMISC); + break; + default: + /* Should not get there. */ + break; + } + sc->rxon.cck_mask = 0x0f; /* not yet negotiated */ + sc->rxon.ofdm_mask = 0xff; /* not yet negotiated */ + sc->rxon.ht_single_mask = 0xff; + sc->rxon.ht_dual_mask = 0xff; + sc->rxon.ht_triple_mask = 0xff; + rxchain = + IWN_RXCHAIN_VALID(sc->rxchainmask) | + IWN_RXCHAIN_MIMO_COUNT(2) | + IWN_RXCHAIN_IDLE_COUNT(2); + sc->rxon.rxchain = htole16(rxchain); + DPRINTF(sc, IWN_DEBUG_RESET, "%s: setting configuration\n", __func__); + error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: RXON command failed\n", __func__); + return error; + } + + error = iwn_add_broadcast_node(sc, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not add broadcast node\n", __func__); + return error; + } + + /* Configuration has changed, set TX power accordingly. */ + error = hal->set_txpower(sc, ic->ic_curchan, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not set TX power\n", __func__); + return error; + } + + error = iwn_set_critical_temp(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: ccould not set critical temperature\n", __func__); + return error; + } + + /* Set power saving level to CAM during initialization. */ + error = iwn_set_pslevel(sc, 0, 0, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not set power saving level\n", __func__); + return error; + } + return 0; +} + +int +iwn_scan(struct iwn_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211_scan_state *ss = ic->ic_scan; /*XXX*/ + struct iwn_scan_hdr *hdr; + struct iwn_cmd_data *tx; + struct iwn_scan_essid *essid; + struct iwn_scan_chan *chan; + struct ieee80211_frame *wh; + struct ieee80211_rateset *rs; + struct ieee80211_channel *c; + int buflen, error, nrates; + uint16_t rxchain; + uint8_t *buf, *frm, txant; + + buf = malloc(IWN_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO); + if (buf == NULL) { + device_printf(sc->sc_dev, + "%s: could not allocate buffer for scan command\n", + __func__); + return ENOMEM; + } + hdr = (struct iwn_scan_hdr *)buf; + + /* + * Move to the next channel if no frames are received within 10ms + * after sending the probe request. + */ + hdr->quiet_time = htole16(10); /* timeout in milliseconds */ + hdr->quiet_threshold = htole16(1); /* min # of packets */ + + /* Select antennas for scanning. */ + rxchain = + IWN_RXCHAIN_VALID(sc->rxchainmask) | + IWN_RXCHAIN_FORCE_MIMO_SEL(sc->rxchainmask) | + IWN_RXCHAIN_DRIVER_FORCE; + if (IEEE80211_IS_CHAN_A(ic->ic_curchan) && + sc->hw_type == IWN_HW_REV_TYPE_4965) { + /* Ant A must be avoided in 5GHz because of an HW bug. */ + rxchain |= IWN_RXCHAIN_FORCE_SEL(IWN_ANT_BC); + } else /* Use all available RX antennas. */ + rxchain |= IWN_RXCHAIN_FORCE_SEL(sc->rxchainmask); + hdr->rxchain = htole16(rxchain); + hdr->filter = htole32(IWN_FILTER_MULTICAST | IWN_FILTER_BEACON); + + tx = (struct iwn_cmd_data *)(hdr + 1); + tx->flags = htole32(IWN_TX_AUTO_SEQ); + tx->id = sc->sc_hal->broadcast_id; + tx->lifetime = htole32(IWN_LIFETIME_INFINITE); + + if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) { + /* Send probe requests at 6Mbps. */ + tx->plcp = iwn_rates[IWN_RIDX_OFDM6].plcp; + rs = &ic->ic_sup_rates[IEEE80211_MODE_11A]; + } else { + hdr->flags = htole32(IWN_RXON_24GHZ | IWN_RXON_AUTO); + /* Send probe requests at 1Mbps. */ + tx->plcp = iwn_rates[IWN_RIDX_CCK1].plcp; + tx->rflags = IWN_RFLAG_CCK; + rs = &ic->ic_sup_rates[IEEE80211_MODE_11G]; + } + /* Use the first valid TX antenna. */ + txant = IWN_LSB(sc->txchainmask); + tx->rflags |= IWN_RFLAG_ANT(txant); + + essid = (struct iwn_scan_essid *)(tx + 1); + if (ss->ss_ssid[0].len != 0) { + essid[0].id = IEEE80211_ELEMID_SSID; + essid[0].len = ss->ss_ssid[0].len; + memcpy(essid[0].data, ss->ss_ssid[0].ssid, ss->ss_ssid[0].len); + } + + /* + * Build a probe request frame. Most of the following code is a + * copy & paste of what is done in net80211. + */ + wh = (struct ieee80211_frame *)(essid + 20); + wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | + IEEE80211_FC0_SUBTYPE_PROBE_REQ; + wh->i_fc[1] = IEEE80211_FC1_DIR_NODS; + IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr); + IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp)); + IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr); + *(uint16_t *)&wh->i_dur[0] = 0; /* filled by HW */ + *(uint16_t *)&wh->i_seq[0] = 0; /* filled by HW */ + + frm = (uint8_t *)(wh + 1); + + /* Add SSID IE. */ + *frm++ = IEEE80211_ELEMID_SSID; + *frm++ = ss->ss_ssid[0].len; + memcpy(frm, ss->ss_ssid[0].ssid, ss->ss_ssid[0].len); + frm += ss->ss_ssid[0].len; + + /* Add supported rates IE. */ + *frm++ = IEEE80211_ELEMID_RATES; + nrates = rs->rs_nrates; + if (nrates > IEEE80211_RATE_SIZE) + nrates = IEEE80211_RATE_SIZE; + *frm++ = nrates; + memcpy(frm, rs->rs_rates, nrates); + frm += nrates; + + /* Add supported xrates IE. */ + if (rs->rs_nrates > IEEE80211_RATE_SIZE) { + nrates = rs->rs_nrates - IEEE80211_RATE_SIZE; + *frm++ = IEEE80211_ELEMID_XRATES; + *frm++ = (uint8_t)nrates; + memcpy(frm, rs->rs_rates + IEEE80211_RATE_SIZE, nrates); + frm += nrates; + } + + /* Set length of probe request. */ + tx->len = htole16(frm - (uint8_t *)wh); + + c = ic->ic_curchan; + chan = (struct iwn_scan_chan *)frm; + chan->chan = htole16(ieee80211_chan2ieee(ic, c)); + chan->flags = 0; + if (ss->ss_nssid > 0) + chan->flags |= htole32(IWN_CHAN_NPBREQS(1)); + chan->dsp_gain = 0x6e; + if (IEEE80211_IS_CHAN_5GHZ(c) && + !(c->ic_flags & IEEE80211_CHAN_PASSIVE)) { + chan->rf_gain = 0x3b; + chan->active = htole16(24); + chan->passive = htole16(110); + chan->flags |= htole32(IWN_CHAN_ACTIVE); + } else if (IEEE80211_IS_CHAN_5GHZ(c)) { + chan->rf_gain = 0x3b; + chan->active = htole16(24); + if (sc->rxon.associd) + chan->passive = htole16(78); + else + chan->passive = htole16(110); + hdr->crc_threshold = htole16(1); + } else if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE)) { + chan->rf_gain = 0x28; + chan->active = htole16(36); + chan->passive = htole16(120); + chan->flags |= htole32(IWN_CHAN_ACTIVE); + } else { + chan->rf_gain = 0x28; + chan->active = htole16(36); + if (sc->rxon.associd) + chan->passive = htole16(88); + else + chan->passive = htole16(120); + hdr->crc_threshold = htole16(1); + } + + DPRINTF(sc, IWN_DEBUG_STATE, + "%s: chan %u flags 0x%x rf_gain 0x%x " + "dsp_gain 0x%x active 0x%x passive 0x%x\n", __func__, + chan->chan, chan->flags, chan->rf_gain, chan->dsp_gain, + chan->active, chan->passive); + + hdr->nchan++; + chan++; + buflen = (uint8_t *)chan - buf; + hdr->len = htole16(buflen); + + DPRINTF(sc, IWN_DEBUG_STATE, "sending scan command nchan=%d\n", + hdr->nchan); + error = iwn_cmd(sc, IWN_CMD_SCAN, buf, buflen, 1); + free(buf, M_DEVBUF); + return error; } int iwn_auth(struct iwn_softc *sc, struct ieee80211vap *vap) { + const struct iwn_hal *hal = sc->sc_hal; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_node *ni = vap->iv_bss; - struct iwn_node_info node; int error; sc->calib.state = IWN_CALIB_STATE_INIT; - /* update adapter's configuration */ - sc->config.associd = 0; - IEEE80211_ADDR_COPY(sc->config.bssid, ni->ni_bssid); - sc->config.chan = htole16(ieee80211_chan2ieee(ic, ni->ni_chan)); - sc->config.flags = htole32(IWN_CONFIG_TSF); + /* Update adapter configuration. */ + IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid); + sc->rxon.chan = htole16(ieee80211_chan2ieee(ic, ni->ni_chan)); + sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) - sc->config.flags |= htole32(IWN_CONFIG_AUTO | IWN_CONFIG_24GHZ); + sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); + if (ic->ic_flags & IEEE80211_F_SHSLOT) + sc->rxon.flags |= htole32(IWN_RXON_SHSLOT); + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) + sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE); if (IEEE80211_IS_CHAN_A(ni->ni_chan)) { - sc->config.cck_mask = 0; - sc->config.ofdm_mask = 0x15; + sc->rxon.cck_mask = 0; + sc->rxon.ofdm_mask = 0x15; } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { - sc->config.cck_mask = 0x03; - sc->config.ofdm_mask = 0; + sc->rxon.cck_mask = 0x03; + sc->rxon.ofdm_mask = 0; } else { /* XXX assume 802.11b/g */ - sc->config.cck_mask = 0x0f; - sc->config.ofdm_mask = 0x15; + sc->rxon.cck_mask = 0x0f; + sc->rxon.ofdm_mask = 0x15; } - if (ic->ic_flags & IEEE80211_F_SHSLOT) - sc->config.flags |= htole32(IWN_CONFIG_SHSLOT); - if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) - sc->config.flags |= htole32(IWN_CONFIG_SHPREAMBLE); - sc->config.filter &= ~htole32(IWN_FILTER_BSS); - DPRINTF(sc, IWN_DEBUG_STATE, - "%s: config chan %d mode %d flags 0x%x cck 0x%x ofdm 0x%x " - "ht_single 0x%x ht_dual 0x%x rxchain 0x%x " - "myaddr %6D wlap %6D bssid %6D associd %d filter 0x%x\n", - __func__, - le16toh(sc->config.chan), sc->config.mode, le32toh(sc->config.flags), - sc->config.cck_mask, sc->config.ofdm_mask, - sc->config.ht_single_mask, sc->config.ht_dual_mask, - le16toh(sc->config.rxchain), - sc->config.myaddr, ":", sc->config.wlap, ":", sc->config.bssid, ":", - le16toh(sc->config.associd), le32toh(sc->config.filter)); - error = iwn_cmd(sc, IWN_CMD_CONFIGURE, &sc->config, - sizeof (struct iwn_config), 1); + "%s: config chan %d mode %d flags 0x%x cck 0x%x ofdm 0x%x " + "ht_single 0x%x ht_dual 0x%x rxchain 0x%x " + "myaddr %6D wlap %6D bssid %6D associd %d filter 0x%x\n", + __func__, + le16toh(sc->rxon.chan), sc->rxon.mode, le32toh(sc->rxon.flags), + sc->rxon.cck_mask, sc->rxon.ofdm_mask, + sc->rxon.ht_single_mask, sc->rxon.ht_dual_mask, + le16toh(sc->rxon.rxchain), + sc->rxon.myaddr, ":", sc->rxon.wlap, ":", sc->rxon.bssid, ":", + le16toh(sc->rxon.associd), le32toh(sc->rxon.filter)); + error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not configure, error %d\n", __func__, error); + "%s: RXON command failed, error %d\n", __func__, error); return error; } - sc->sc_curchan = ic->ic_curchan; - /* configuration has changed, set Tx power accordingly */ - error = iwn_set_txpower(sc, ni->ni_chan, 1); + /* Configuration has changed, set TX power accordingly. */ + error = hal->set_txpower(sc, ni->ni_chan, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not set Tx power, error %d\n", __func__, error); return error; } - /* - * Reconfiguring clears the adapter's nodes table so we must + * Reconfiguring RXON clears the firmware nodes table so we must * add the broadcast node again. */ - memset(&node, 0, sizeof node); - IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr); - node.id = IWN_ID_BROADCAST; - DPRINTF(sc, IWN_DEBUG_STATE, "%s: add broadcast node\n", __func__); - error = iwn_cmd(sc, IWN_CMD_ADD_NODE, &node, sizeof node, 1); + error = iwn_add_broadcast_node(sc, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not add broadcast node, error %d\n", __func__, error); return error; } - error = iwn_set_link_quality(sc, node.id, ic->ic_curchan, 1); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not setup MRR for broadcast node, error %d\n", - __func__, error); - return error; - } - return 0; } @@ -3547,94 +4804,121 @@ int iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) { #define MS(v,x) (((v) & x) >> x##_S) + const struct iwn_hal *hal = sc->sc_hal; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211_node *ni = vap->iv_bss; struct iwn_node_info node; - int error, maxrxampdu, ampdudensity; + int error; sc->calib.state = IWN_CALIB_STATE_INIT; if (ic->ic_opmode == IEEE80211_M_MONITOR) { - /* link LED blinks while monitoring */ + /* Link LED blinks while monitoring. */ iwn_set_led(sc, IWN_LED_LINK, 5, 5); return 0; } + error = iwn_set_timing(sc, ni); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not set timing, error %d\n", __func__, error); + return error; + } - iwn_enable_tsf(sc, ni); - - /* update adapter's configuration */ - sc->config.associd = htole16(IEEE80211_AID(ni->ni_associd)); - /* short preamble/slot time are negotiated when associating */ - sc->config.flags &= ~htole32(IWN_CONFIG_SHPREAMBLE | IWN_CONFIG_SHSLOT); + /* Update adapter configuration. */ + IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid); + sc->rxon.chan = htole16(ieee80211_chan2ieee(ic, ni->ni_chan)); + sc->rxon.associd = htole16(IEEE80211_AID(ni->ni_associd)); + /* Short preamble and slot time are negotiated when associating. */ + sc->rxon.flags &= ~htole32(IWN_RXON_SHPREAMBLE | IWN_RXON_SHSLOT); + sc->rxon.flags |= htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF); + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) + sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); + else + sc->rxon.flags &= ~htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ); if (ic->ic_flags & IEEE80211_F_SHSLOT) - sc->config.flags |= htole32(IWN_CONFIG_SHSLOT); + sc->rxon.flags |= htole32(IWN_RXON_SHSLOT); if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) - sc->config.flags |= htole32(IWN_CONFIG_SHPREAMBLE); + sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE); + if (IEEE80211_IS_CHAN_A(ni->ni_chan)) { + sc->rxon.cck_mask = 0; + sc->rxon.ofdm_mask = 0x15; + } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) { + sc->rxon.cck_mask = 0x03; + sc->rxon.ofdm_mask = 0; + } else { + /* XXX assume 802.11b/g */ + sc->rxon.cck_mask = 0x0f; + sc->rxon.ofdm_mask = 0x15; + } +#if 0 /* HT */ if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { - sc->config.flags &= ~htole32(IWN_CONFIG_HT); + sc->rxon.flags &= ~htole32(IWN_RXON_HT); if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan)) - sc->config.flags |= htole32(IWN_CONFIG_HT40U); + sc->rxon.flags |= htole32(IWN_RXON_HT40U); else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan)) - sc->config.flags |= htole32(IWN_CONFIG_HT40D); + sc->rxon.flags |= htole32(IWN_RXON_HT40D); else - sc->config.flags |= htole32(IWN_CONFIG_HT20); - sc->config.rxchain = htole16( - (3 << IWN_RXCHAIN_VALID_S) - | (3 << IWN_RXCHAIN_MIMO_CNT_S) - | (1 << IWN_RXCHAIN_CNT_S) + sc->rxon.flags |= htole32(IWN_RXON_HT20); + sc->rxon.rxchain = htole16( + IWN_RXCHAIN_VALID(3) + | IWN_RXCHAIN_MIMO_COUNT(3) + | IWN_RXCHAIN_IDLE_COUNT(1) | IWN_RXCHAIN_MIMO_FORCE); maxrxampdu = MS(ni->ni_htparam, IEEE80211_HTCAP_MAXRXAMPDU); ampdudensity = MS(ni->ni_htparam, IEEE80211_HTCAP_MPDUDENSITY); } else maxrxampdu = ampdudensity = 0; - sc->config.filter |= htole32(IWN_FILTER_BSS); +#endif + sc->rxon.filter |= htole32(IWN_FILTER_BSS); DPRINTF(sc, IWN_DEBUG_STATE, - "%s: config chan %d mode %d flags 0x%x cck 0x%x ofdm 0x%x " - "ht_single 0x%x ht_dual 0x%x rxchain 0x%x " - "myaddr %6D wlap %6D bssid %6D associd %d filter 0x%x\n", - __func__, - le16toh(sc->config.chan), sc->config.mode, le32toh(sc->config.flags), - sc->config.cck_mask, sc->config.ofdm_mask, - sc->config.ht_single_mask, sc->config.ht_dual_mask, - le16toh(sc->config.rxchain), - sc->config.myaddr, ":", sc->config.wlap, ":", sc->config.bssid, ":", - le16toh(sc->config.associd), le32toh(sc->config.filter)); - error = iwn_cmd(sc, IWN_CMD_CONFIGURE, &sc->config, - sizeof (struct iwn_config), 1); + "%s: config chan %d mode %d flags 0x%x cck 0x%x ofdm 0x%x " + "ht_single 0x%x ht_dual 0x%x rxchain 0x%x " + "myaddr %6D wlap %6D bssid %6D associd %d filter 0x%x\n", + __func__, + le16toh(sc->rxon.chan), sc->rxon.mode, le32toh(sc->rxon.flags), + sc->rxon.cck_mask, sc->rxon.ofdm_mask, + sc->rxon.ht_single_mask, sc->rxon.ht_dual_mask, + le16toh(sc->rxon.rxchain), + sc->rxon.myaddr, ":", sc->rxon.wlap, ":", sc->rxon.bssid, ":", + le16toh(sc->rxon.associd), le32toh(sc->rxon.filter)); + error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not update configuration, error %d\n", __func__, error); return error; } - sc->sc_curchan = ni->ni_chan; + - /* configuration has changed, set Tx power accordingly */ - error = iwn_set_txpower(sc, ni->ni_chan, 1); + /* Configuration has changed, set TX power accordingly. */ + error = hal->set_txpower(sc, ni->ni_chan, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not set Tx power, error %d\n", __func__, error); return error; } - /* add BSS node */ + /* Add BSS node. */ memset(&node, 0, sizeof node); IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr); node.id = IWN_ID_BSS; - node.htflags = htole32( - (maxrxampdu << IWN_MAXRXAMPDU_S) | - (ampdudensity << IWN_MPDUDENSITY_S)); +#ifdef notyet + node.htflags = htole32(IWN_AMDPU_SIZE_FACTOR(3) | + IWN_AMDPU_DENSITY(5)); /* 2us */ +#endif DPRINTF(sc, IWN_DEBUG_STATE, "%s: add BSS node, id %d htflags 0x%x\n", __func__, node.id, le32toh(node.htflags)); - error = iwn_cmd(sc, IWN_CMD_ADD_NODE, &node, sizeof node, 1); + error = hal->add_node(sc, &node, 1); if (error != 0) { - device_printf(sc->sc_dev,"could not add BSS node\n"); + device_printf(sc->sc_dev, "could not add BSS node\n"); return error; } - error = iwn_set_link_quality(sc, node.id, ni->ni_chan, 1); + DPRINTF(sc, IWN_DEBUG_STATE, "setting link quality for node %d\n", + node.id); + error = iwn_set_link_quality(sc, node.id, 1); if (error != 0) { device_printf(sc->sc_dev, "%s: could not setup MRR for node %d, error %d\n", @@ -3650,594 +4934,1176 @@ iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap) return error; } - /* start/restart periodic calibration timer */ + /* Start periodic calibration timer. */ sc->calib.state = IWN_CALIB_STATE_ASSOC; iwn_calib_reset(sc); - /* link LED always on while associated */ + /* Link LED always on while associated. */ iwn_set_led(sc, IWN_LED_LINK, 0, 1); return 0; #undef MS } +#if 0 /* HT */ /* - * Send a scan request to the firmware. Since this command is huge, we map it - * into a mbuf instead of using the pre-allocated set of commands. + * This function is called by upper layer when an ADDBA request is received + * from another STA and before the ADDBA response is sent. */ int -iwn_scan(struct iwn_softc *sc) +iwn_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni, + uint8_t tid) { - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - struct ieee80211_scan_state *ss = ic->ic_scan; /*XXX*/ - struct iwn_tx_ring *ring = &sc->txq[4]; - struct iwn_tx_desc *desc; - struct iwn_tx_data *data; - struct iwn_tx_cmd *cmd; - struct iwn_cmd_data *tx; - struct iwn_scan_hdr *hdr; - struct iwn_scan_essid *essid; - struct iwn_scan_chan *chan; - struct ieee80211_frame *wh; - struct ieee80211_rateset *rs; - struct ieee80211_channel *c; - enum ieee80211_phymode mode; - uint8_t *frm; - int pktlen, error, nrates; - bus_addr_t physaddr; + struct ieee80211_rx_ba *ba = &ni->ni_rx_ba[tid]; + struct iwn_softc *sc = ic->ic_softc; + struct iwn_node *wn = (void *)ni; + struct iwn_node_info node; - desc = &ring->desc[ring->cur]; - data = &ring->data[ring->cur]; - - /* XXX malloc */ - data->m = m_getcl(M_DONTWAIT, MT_DATA, 0); - if (data->m == NULL) { - device_printf(sc->sc_dev, - "%s: could not allocate mbuf for scan command\n", __func__); - return ENOMEM; - } - - cmd = mtod(data->m, struct iwn_tx_cmd *); - cmd->code = IWN_CMD_SCAN; - cmd->flags = 0; - cmd->qid = ring->qid; - cmd->idx = ring->cur; - - hdr = (struct iwn_scan_hdr *)cmd->data; - memset(hdr, 0, sizeof (struct iwn_scan_hdr)); - - /* XXX use scan state */ - /* - * Move to the next channel if no packets are received within 5 msecs - * after sending the probe request (this helps to reduce the duration - * of active scans). - */ - hdr->quiet = htole16(5); /* timeout in milliseconds */ - hdr->plcp_threshold = htole16(1); /* min # of packets */ - - /* select Ant B and Ant C for scanning */ - hdr->rxchain = htole16(0x3e1 | (7 << IWN_RXCHAIN_VALID_S)); - - tx = (struct iwn_cmd_data *)(hdr + 1); - memset(tx, 0, sizeof (struct iwn_cmd_data)); - tx->flags = htole32(IWN_TX_AUTO_SEQ | 0x200); /* XXX */ - tx->id = IWN_ID_BROADCAST; - tx->lifetime = htole32(IWN_LIFETIME_INFINITE); - tx->rflags = IWN_RFLAG_ANT_B; - - if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) { - hdr->crc_threshold = htole16(1); - /* send probe requests at 6Mbps */ - tx->rate = iwn_ridx_to_plcp[IWN_RATE_OFDM6]; - } else { - hdr->flags = htole32(IWN_CONFIG_24GHZ | IWN_CONFIG_AUTO); - /* send probe requests at 1Mbps */ - tx->rate = iwn_ridx_to_plcp[IWN_RATE_CCK1]; - tx->rflags |= IWN_RFLAG_CCK; - } - - essid = (struct iwn_scan_essid *)(tx + 1); - memset(essid, 0, 4 * sizeof (struct iwn_scan_essid)); - essid[0].id = IEEE80211_ELEMID_SSID; - essid[0].len = ss->ss_ssid[0].len; - memcpy(essid[0].data, ss->ss_ssid[0].ssid, ss->ss_ssid[0].len); - - /* - * Build a probe request frame. Most of the following code is a - * copy & paste of what is done in net80211. - */ - wh = (struct ieee80211_frame *)&essid[4]; - wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | - IEEE80211_FC0_SUBTYPE_PROBE_REQ; - wh->i_fc[1] = IEEE80211_FC1_DIR_NODS; - IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr); - IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp)); - IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr); - *(u_int16_t *)&wh->i_dur[0] = 0; /* filled by h/w */ - *(u_int16_t *)&wh->i_seq[0] = 0; /* filled by h/w */ - - frm = (uint8_t *)(wh + 1); - - /* add SSID IE */ - *frm++ = IEEE80211_ELEMID_SSID; - *frm++ = ss->ss_ssid[0].len; - memcpy(frm, ss->ss_ssid[0].ssid, ss->ss_ssid[0].len); - frm += ss->ss_ssid[0].len; - - mode = ieee80211_chan2mode(ic->ic_curchan); - rs = &ic->ic_sup_rates[mode]; - - /* add supported rates IE */ - *frm++ = IEEE80211_ELEMID_RATES; - nrates = rs->rs_nrates; - if (nrates > IEEE80211_RATE_SIZE) - nrates = IEEE80211_RATE_SIZE; - *frm++ = nrates; - memcpy(frm, rs->rs_rates, nrates); - frm += nrates; - - /* add supported xrates IE */ - if (rs->rs_nrates > IEEE80211_RATE_SIZE) { - nrates = rs->rs_nrates - IEEE80211_RATE_SIZE; - *frm++ = IEEE80211_ELEMID_XRATES; - *frm++ = (uint8_t)nrates; - memcpy(frm, rs->rs_rates + IEEE80211_RATE_SIZE, nrates); - frm += nrates; - } - - /* setup length of probe request */ - tx->len = htole16(frm - (uint8_t *)wh); - - c = ic->ic_curchan; - chan = (struct iwn_scan_chan *)frm; - chan->chan = ieee80211_chan2ieee(ic, c); - chan->flags = 0; - if ((c->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) { - chan->flags |= IWN_CHAN_ACTIVE; - if (ss->ss_nssid > 0) - chan->flags |= IWN_CHAN_DIRECT; - } - chan->dsp_gain = 0x6e; - if (IEEE80211_IS_CHAN_5GHZ(c)) { - chan->rf_gain = 0x3b; - chan->active = htole16(10); - chan->passive = htole16(110); - } else { - chan->rf_gain = 0x28; - chan->active = htole16(20); - chan->passive = htole16(120); - } - - DPRINTF(sc, IWN_DEBUG_STATE, "%s: chan %u flags 0x%x rf_gain 0x%x " - "dsp_gain 0x%x active 0x%x passive 0x%x\n", __func__, - chan->chan, chan->flags, chan->rf_gain, chan->dsp_gain, - chan->active, chan->passive); - hdr->nchan++; - chan++; - - frm += sizeof (struct iwn_scan_chan); - - hdr->len = htole16(frm - (uint8_t *)hdr); - pktlen = frm - (uint8_t *)cmd; - - error = bus_dmamap_load(ring->data_dmat, data->map, cmd, pktlen, - iwn_dma_map_addr, &physaddr, BUS_DMA_NOWAIT); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not map scan command, error %d\n", - __func__, error); - m_freem(data->m); - data->m = NULL; - return error; - } - - IWN_SET_DESC_NSEGS(desc, 1); - IWN_SET_DESC_SEG(desc, 0, physaddr, pktlen); - sc->shared->len[ring->qid][ring->cur] = htole16(8); - if (ring->cur < IWN_TX_WINDOW) - sc->shared->len[ring->qid][ring->cur + IWN_TX_RING_COUNT] = - htole16(8); - - bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map, - BUS_DMASYNC_PREWRITE); - bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); - - /* kick cmd ring */ - ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT; - IWN_WRITE(sc, IWN_TX_WIDX, ring->qid << 8 | ring->cur); - - return 0; /* will be notified async. of failure/success */ + memset(&node, 0, sizeof node); + node.id = wn->id; + node.control = IWN_NODE_UPDATE; + node.flags = IWN_FLAG_SET_ADDBA; + node.addba_tid = tid; + node.addba_ssn = htole16(ba->ba_winstart); + DPRINTF(sc, IWN_DEBUG_RECV, "ADDBA RA=%d TID=%d SSN=%d\n", + wn->id, tid, ba->ba_winstart)); + return sc->sc_hal->add_node(sc, &node, 1); } -int -iwn_config(struct iwn_softc *sc) +/* + * This function is called by upper layer on teardown of an HT-immediate + * Block Ack agreement (eg. uppon receipt of a DELBA frame.) + */ +void +iwn_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, + uint8_t tid) { - struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; - struct iwn_power power; - struct iwn_bluetooth bluetooth; + struct iwn_softc *sc = ic->ic_softc; + struct iwn_node *wn = (void *)ni; + struct iwn_node_info node; + + memset(&node, 0, sizeof node); + node.id = wn->id; + node.control = IWN_NODE_UPDATE; + node.flags = IWN_FLAG_SET_DELBA; + node.delba_tid = tid; + DPRINTF(sc, IWN_DEBUG_RECV, "DELBA RA=%d TID=%d\n", wn->id, tid); + (void)sc->sc_hal->add_node(sc, &node, 1); +} + +/* + * This function is called by upper layer when an ADDBA response is received + * from another STA. + */ +int +iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni, + uint8_t tid) +{ + struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; + struct iwn_softc *sc = ic->ic_softc; + const struct iwn_hal *hal = sc->sc_hal; + struct iwn_node *wn = (void *)ni; struct iwn_node_info node; int error; - /* set power mode */ - memset(&power, 0, sizeof power); - power.flags = htole16(IWN_POWER_CAM | 0x8); - DPRINTF(sc, IWN_DEBUG_RESET, "%s: set power mode\n", __func__); - error = iwn_cmd(sc, IWN_CMD_SET_POWER_MODE, &power, sizeof power, 0); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not set power mode, error %d\n", - __func__, error); - return error; - } - - /* configure bluetooth coexistence */ - memset(&bluetooth, 0, sizeof bluetooth); - bluetooth.flags = 3; - bluetooth.lead = 0xaa; - bluetooth.kill = 1; - DPRINTF(sc, IWN_DEBUG_RESET, "%s: config bluetooth coexistence\n", - __func__); - error = iwn_cmd(sc, IWN_CMD_BLUETOOTH, &bluetooth, sizeof bluetooth, - 0); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not configure bluetooth coexistence, error %d\n", - __func__, error); - return error; - } - - /* configure adapter */ - memset(&sc->config, 0, sizeof (struct iwn_config)); - IEEE80211_ADDR_COPY(sc->config.myaddr, IF_LLADDR(ifp)); - IEEE80211_ADDR_COPY(sc->config.wlap, IF_LLADDR(ifp)); - /* set default channel */ - sc->config.chan = htole16(ieee80211_chan2ieee(ic, ic->ic_curchan)); - sc->config.flags = htole32(IWN_CONFIG_TSF); - if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) - sc->config.flags |= htole32(IWN_CONFIG_AUTO | IWN_CONFIG_24GHZ); - sc->config.filter = 0; - switch (ic->ic_opmode) { - case IEEE80211_M_STA: - sc->config.mode = IWN_MODE_STA; - sc->config.filter |= htole32(IWN_FILTER_MULTICAST); - break; - case IEEE80211_M_IBSS: - case IEEE80211_M_AHDEMO: - sc->config.mode = IWN_MODE_IBSS; - break; - case IEEE80211_M_HOSTAP: - sc->config.mode = IWN_MODE_HOSTAP; - break; - case IEEE80211_M_MONITOR: - sc->config.mode = IWN_MODE_MONITOR; - sc->config.filter |= htole32(IWN_FILTER_MULTICAST | - IWN_FILTER_CTL | IWN_FILTER_PROMISC); - break; - default: - device_printf(sc->sc_dev, "unknown opmode %d\n", ic->ic_opmode); - return EINVAL; - } - sc->config.cck_mask = 0x0f; /* not yet negotiated */ - sc->config.ofdm_mask = 0xff; /* not yet negotiated */ - sc->config.ht_single_mask = 0xff; - sc->config.ht_dual_mask = 0xff; - sc->config.rxchain = htole16(0x2800 | (7 << IWN_RXCHAIN_VALID_S)); - - DPRINTF(sc, IWN_DEBUG_STATE, - "%s: config chan %d mode %d flags 0x%x cck 0x%x ofdm 0x%x " - "ht_single 0x%x ht_dual 0x%x rxchain 0x%x " - "myaddr %6D wlap %6D bssid %6D associd %d filter 0x%x\n", - __func__, - le16toh(sc->config.chan), sc->config.mode, le32toh(sc->config.flags), - sc->config.cck_mask, sc->config.ofdm_mask, - sc->config.ht_single_mask, sc->config.ht_dual_mask, - le16toh(sc->config.rxchain), - sc->config.myaddr, ":", sc->config.wlap, ":", sc->config.bssid, ":", - le16toh(sc->config.associd), le32toh(sc->config.filter)); - error = iwn_cmd(sc, IWN_CMD_CONFIGURE, &sc->config, - sizeof (struct iwn_config), 0); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: configure command failed, error %d\n", - __func__, error); - return error; - } - sc->sc_curchan = ic->ic_curchan; - - /* configuration has changed, set Tx power accordingly */ - error = iwn_set_txpower(sc, ic->ic_curchan, 0); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not set Tx power, error %d\n", __func__, error); - return error; - } - - /* add broadcast node */ + /* Enable TX for the specified RA/TID. */ + wn->disable_tid &= ~(1 << tid); memset(&node, 0, sizeof node); - IEEE80211_ADDR_COPY(node.macaddr, ic->ic_ifp->if_broadcastaddr); - node.id = IWN_ID_BROADCAST; - node.rate = iwn_plcp_signal(2); - DPRINTF(sc, IWN_DEBUG_RESET, "%s: add broadcast node\n", __func__); - error = iwn_cmd(sc, IWN_CMD_ADD_NODE, &node, sizeof node, 0); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not add broadcast node, error %d\n", - __func__, error); + node.id = wn->id; + node.control = IWN_NODE_UPDATE; + node.flags = IWN_FLAG_SET_DISABLE_TID; + node.disable_tid = htole16(wn->disable_tid); + error = hal->add_node(sc, &node, 1); + if (error != 0) return error; - } - error = iwn_set_link_quality(sc, node.id, ic->ic_curchan, 0); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not setup MRR for node %d, error %d\n", - __func__, node.id, error); - return error; - } - error = iwn_set_critical_temp(sc); - if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not set critical temperature, error %d\n", - __func__, error); + if ((error = iwn_nic_lock(sc)) != 0) return error; + hal->ampdu_tx_start(sc, ni, tid, ba->ba_winstart); + iwn_nic_unlock(sc); + return 0; +} + +void +iwn_ampdu_tx_stop(struct ieee80211com *ic, struct ieee80211_node *ni, + uint8_t tid) +{ + struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid]; + struct iwn_softc *sc = ic->ic_softc; + int error; + + error = iwn_nic_lock(sc); + if (error != 0) + return; + sc->sc_hal->ampdu_tx_stop(sc, tid, ba->ba_winstart); + iwn_nic_unlock(sc); +} + +void +iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, + uint8_t tid, uint16_t ssn) +{ + struct iwn_node *wn = (void *)ni; + int qid = 7 + tid; + + /* Stop TX scheduler while we're changing its configuration. */ + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), + IWN4965_TXQ_STATUS_CHGACT); + + /* Assign RA/TID translation to the queue. */ + iwn_mem_write_2(sc, sc->sched_base + IWN4965_SCHED_TRANS_TBL(qid), + wn->id << 4 | tid); + + /* Enable chain-building mode for the queue. */ + iwn_prph_setbits(sc, IWN4965_SCHED_QCHAIN_SEL, 1 << qid); + + /* Set starting sequence number from the ADDBA request. */ + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), ssn); + + /* Set scheduler window size. */ + iwn_mem_write(sc, sc->sched_base + IWN4965_SCHED_QUEUE_OFFSET(qid), + IWN_SCHED_WINSZ); + /* Set scheduler frame limit. */ + iwn_mem_write(sc, sc->sched_base + IWN4965_SCHED_QUEUE_OFFSET(qid) + 4, + IWN_SCHED_LIMIT << 16); + + /* Enable interrupts for the queue. */ + iwn_prph_setbits(sc, IWN4965_SCHED_INTR_MASK, 1 << qid); + + /* Mark the queue as active. */ + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), + IWN4965_TXQ_STATUS_ACTIVE | IWN4965_TXQ_STATUS_AGGR_ENA | + iwn_tid2fifo[tid] << 1); +} + +void +iwn4965_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) +{ + int qid = 7 + tid; + + /* Stop TX scheduler while we're changing its configuration. */ + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), + IWN4965_TXQ_STATUS_CHGACT); + + /* Set starting sequence number from the ADDBA request. */ + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), ssn); + + /* Disable interrupts for the queue. */ + iwn_prph_clrbits(sc, IWN4965_SCHED_INTR_MASK, 1 << qid); + + /* Mark the queue as inactive. */ + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), + IWN4965_TXQ_STATUS_INACTIVE | iwn_tid2fifo[tid] << 1); +} + +void +iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni, + uint8_t tid, uint16_t ssn) +{ + struct iwn_node *wn = (void *)ni; + int qid = 10 + tid; + + /* Stop TX scheduler while we're changing its configuration. */ + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), + IWN5000_TXQ_STATUS_CHGACT); + + /* Assign RA/TID translation to the queue. */ + iwn_mem_write_2(sc, sc->sched_base + IWN5000_SCHED_TRANS_TBL(qid), + wn->id << 4 | tid); + + /* Enable chain-building mode for the queue. */ + iwn_prph_setbits(sc, IWN5000_SCHED_QCHAIN_SEL, 1 << qid); + + /* Enable aggregation for the queue. */ + iwn_prph_setbits(sc, IWN5000_SCHED_AGGR_SEL, 1 << qid); + + /* Set starting sequence number from the ADDBA request. */ + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), ssn); + + /* Set scheduler window size and frame limit. */ + iwn_mem_write(sc, sc->sched_base + IWN5000_SCHED_QUEUE_OFFSET(qid) + 4, + IWN_SCHED_LIMIT << 16 | IWN_SCHED_WINSZ); + + /* Enable interrupts for the queue. */ + iwn_prph_setbits(sc, IWN5000_SCHED_INTR_MASK, 1 << qid); + + /* Mark the queue as active. */ + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), + IWN5000_TXQ_STATUS_ACTIVE | iwn_tid2fifo[tid]); +} + +void +iwn5000_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn) +{ + int qid = 10 + tid; + + /* Stop TX scheduler while we're changing its configuration. */ + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), + IWN5000_TXQ_STATUS_CHGACT); + + /* Disable aggregation for the queue. */ + iwn_prph_clrbits(sc, IWN5000_SCHED_AGGR_SEL, 1 << qid); + + /* Set starting sequence number from the ADDBA request. */ + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff)); + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), ssn); + + /* Disable interrupts for the queue. */ + iwn_prph_clrbits(sc, IWN5000_SCHED_INTR_MASK, 1 << qid); + + /* Mark the queue as inactive. */ + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), + IWN5000_TXQ_STATUS_INACTIVE | iwn_tid2fifo[tid]); +} +#endif + +/* + * Query calibration tables from the initialization firmware. We do this + * only once at first boot. Called from a process context. + */ +int +iwn5000_query_calibration(struct iwn_softc *sc) +{ + struct iwn5000_calib_config cmd; + int error; + + memset(&cmd, 0, sizeof cmd); + cmd.ucode.once.enable = 0xffffffff; + cmd.ucode.once.start = 0xffffffff; + cmd.ucode.once.send = 0xffffffff; + cmd.ucode.flags = 0xffffffff; + DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: sending calibration query\n", + __func__); + error = iwn_cmd(sc, IWN5000_CMD_CALIB_CONFIG, &cmd, sizeof cmd, 0); + if (error != 0) + return error; + + /* Wait at most two seconds for calibration to complete. */ + if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) + error = msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", 2 * hz); + return error; +} + +/* + * Send calibration results to the runtime firmware. These results were + * obtained on first boot from the initialization firmware. + */ +int +iwn5000_send_calibration(struct iwn_softc *sc) +{ + int idx, error; + + for (idx = 0; idx < 5; idx++) { + if (sc->calibcmd[idx].buf == NULL) + continue; /* No results available. */ + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "send calibration result idx=%d len=%d\n", + idx, sc->calibcmd[idx].len); + error = iwn_cmd(sc, IWN_CMD_PHY_CALIB, sc->calibcmd[idx].buf, + sc->calibcmd[idx].len, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not send calibration result, error %d\n", + __func__, error); + return error; + } } return 0; } -/* - * Do post-alive initialization of the NIC (after firmware upload). - */ -void -iwn_post_alive(struct iwn_softc *sc) -{ - uint32_t base; - uint16_t offset; - int qid; - - iwn_mem_lock(sc); - - /* clear SRAM */ - base = iwn_mem_read(sc, IWN_SRAM_BASE); - for (offset = 0x380; offset < 0x520; offset += 4) { - IWN_WRITE(sc, IWN_MEM_WADDR, base + offset); - IWN_WRITE(sc, IWN_MEM_WDATA, 0); - } - - /* shared area is aligned on a 1K boundary */ - iwn_mem_write(sc, IWN_SRAM_BASE, sc->shared_dma.paddr >> 10); - iwn_mem_write(sc, IWN_SELECT_QCHAIN, 0); - - for (qid = 0; qid < IWN_NTXQUEUES; qid++) { - iwn_mem_write(sc, IWN_QUEUE_RIDX(qid), 0); - IWN_WRITE(sc, IWN_TX_WIDX, qid << 8 | 0); - - /* set sched. window size */ - IWN_WRITE(sc, IWN_MEM_WADDR, base + IWN_QUEUE_OFFSET(qid)); - IWN_WRITE(sc, IWN_MEM_WDATA, 64); - /* set sched. frame limit */ - IWN_WRITE(sc, IWN_MEM_WADDR, base + IWN_QUEUE_OFFSET(qid) + 4); - IWN_WRITE(sc, IWN_MEM_WDATA, 10 << 16); - } - - /* enable interrupts for all 16 queues */ - iwn_mem_write(sc, IWN_QUEUE_INTR_MASK, 0xffff); - - /* identify active Tx rings (0-7) */ - iwn_mem_write(sc, IWN_TX_ACTIVE, 0xff); - - /* mark Tx rings (4 EDCA + cmd + 2 HCCA) as active */ - for (qid = 0; qid < 7; qid++) { - iwn_mem_write(sc, IWN_TXQ_STATUS(qid), - IWN_TXQ_STATUS_ACTIVE | qid << 1); - } - - iwn_mem_unlock(sc); -} - -void -iwn_stop_master(struct iwn_softc *sc) -{ - uint32_t tmp; - int ntries; - - tmp = IWN_READ(sc, IWN_RESET); - IWN_WRITE(sc, IWN_RESET, tmp | IWN_STOP_MASTER); - - tmp = IWN_READ(sc, IWN_GPIO_CTL); - if ((tmp & IWN_GPIO_PWR_STATUS) == IWN_GPIO_PWR_SLEEP) - return; /* already asleep */ - - for (ntries = 0; ntries < 100; ntries++) { - if (IWN_READ(sc, IWN_RESET) & IWN_MASTER_DISABLED) - break; - DELAY(10); - } - if (ntries == 100) - device_printf(sc->sc_dev, - "%s: timeout waiting for master\n", __func__); -} - int -iwn_reset(struct iwn_softc *sc) +iwn5000_send_wimax_coex(struct iwn_softc *sc) { - uint32_t tmp; - int ntries; + struct iwn5000_wimax_coex wimax; - /* clear any pending interrupts */ - IWN_WRITE(sc, IWN_INTR, 0xffffffff); +#ifdef notyet + if (sc->hw_type == IWN_HW_REV_TYPE_6050) { + /* Enable WiMAX coexistence for combo adapters. */ + wimax.flags = + IWN_WIMAX_COEX_ASSOC_WA_UNMASK | + IWN_WIMAX_COEX_UNASSOC_WA_UNMASK | + IWN_WIMAX_COEX_STA_TABLE_VALID | + IWN_WIMAX_COEX_ENABLE; + memcpy(wimax.events, iwn6050_wimax_events, + sizeof iwn6050_wimax_events); + } else +#endif + { + /* Disable WiMAX coexistence. */ + wimax.flags = 0; + memset(wimax.events, 0, sizeof wimax.events); + } + DPRINTF(sc, IWN_DEBUG_RESET, "%s: Configuring WiMAX coexistence\n", + __func__); + return iwn_cmd(sc, IWN5000_CMD_WIMAX_COEX, &wimax, sizeof wimax, 0); +} - tmp = IWN_READ(sc, IWN_CHICKEN); - IWN_WRITE(sc, IWN_CHICKEN, tmp | IWN_CHICKEN_DISLOS); +/* + * This function is called after the runtime firmware notifies us of its + * readiness (called in a process context.) + */ +int +iwn4965_post_alive(struct iwn_softc *sc) +{ + int error, qid; - tmp = IWN_READ(sc, IWN_GPIO_CTL); - IWN_WRITE(sc, IWN_GPIO_CTL, tmp | IWN_GPIO_INIT); + if ((error = iwn_nic_lock(sc)) != 0) + return error; - /* wait for clock stabilization */ + /* Clear TX scheduler state in SRAM. */ + sc->sched_base = iwn_prph_read(sc, IWN_SCHED_SRAM_ADDR); + iwn_mem_set_region_4(sc, sc->sched_base + IWN4965_SCHED_CTX_OFF, 0, + IWN4965_SCHED_CTX_LEN / sizeof (uint32_t)); + + /* Set physical address of TX scheduler rings (1KB aligned.) */ + iwn_prph_write(sc, IWN4965_SCHED_DRAM_ADDR, sc->sched_dma.paddr >> 10); + + IWN_SETBITS(sc, IWN_FH_TX_CHICKEN, IWN_FH_TX_CHICKEN_SCHED_RETRY); + + /* Disable chain mode for all our 16 queues. */ + iwn_prph_write(sc, IWN4965_SCHED_QCHAIN_SEL, 0); + + for (qid = 0; qid < IWN4965_NTXQUEUES; qid++) { + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), 0); + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | 0); + + /* Set scheduler window size. */ + iwn_mem_write(sc, sc->sched_base + + IWN4965_SCHED_QUEUE_OFFSET(qid), IWN_SCHED_WINSZ); + /* Set scheduler frame limit. */ + iwn_mem_write(sc, sc->sched_base + + IWN4965_SCHED_QUEUE_OFFSET(qid) + 4, + IWN_SCHED_LIMIT << 16); + } + + /* Enable interrupts for all our 16 queues. */ + iwn_prph_write(sc, IWN4965_SCHED_INTR_MASK, 0xffff); + /* Identify TX FIFO rings (0-7). */ + iwn_prph_write(sc, IWN4965_SCHED_TXFACT, 0xff); + + /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */ + for (qid = 0; qid < 7; qid++) { + static uint8_t qid2fifo[] = { 3, 2, 1, 0, 4, 5, 6 }; + iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid), + IWN4965_TXQ_STATUS_ACTIVE | qid2fifo[qid] << 1); + } + iwn_nic_unlock(sc); + return 0; +} + +/* + * This function is called after the initialization or runtime firmware + * notifies us of its readiness (called in a process context.) + */ +int +iwn5000_post_alive(struct iwn_softc *sc) +{ + int error, qid; + + /* Switch to using ICT interrupt mode. */ + iwn5000_ict_reset(sc); + + error = iwn_nic_lock(sc); + if (error != 0) + return error; + + /* Clear TX scheduler state in SRAM. */ + sc->sched_base = iwn_prph_read(sc, IWN_SCHED_SRAM_ADDR); + iwn_mem_set_region_4(sc, sc->sched_base + IWN5000_SCHED_CTX_OFF, 0, + IWN5000_SCHED_CTX_LEN / sizeof (uint32_t)); + + /* Set physical address of TX scheduler rings (1KB aligned.) */ + iwn_prph_write(sc, IWN5000_SCHED_DRAM_ADDR, sc->sched_dma.paddr >> 10); + + IWN_SETBITS(sc, IWN_FH_TX_CHICKEN, IWN_FH_TX_CHICKEN_SCHED_RETRY); + + /* Enable chain mode for all queues, except command queue. */ + iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef); + iwn_prph_write(sc, IWN5000_SCHED_AGGR_SEL, 0); + + for (qid = 0; qid < IWN5000_NTXQUEUES; qid++) { + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), 0); + IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | 0); + + iwn_mem_write(sc, sc->sched_base + + IWN5000_SCHED_QUEUE_OFFSET(qid), 0); + /* Set scheduler window size and frame limit. */ + iwn_mem_write(sc, sc->sched_base + + IWN5000_SCHED_QUEUE_OFFSET(qid) + 4, + IWN_SCHED_LIMIT << 16 | IWN_SCHED_WINSZ); + } + + /* Enable interrupts for all our 20 queues. */ + iwn_prph_write(sc, IWN5000_SCHED_INTR_MASK, 0xfffff); + /* Identify TX FIFO rings (0-7). */ + iwn_prph_write(sc, IWN5000_SCHED_TXFACT, 0xff); + + /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */ + for (qid = 0; qid < 7; qid++) { + static uint8_t qid2fifo[] = { 3, 2, 1, 0, 7, 5, 6 }; + iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid), + IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]); + } + iwn_nic_unlock(sc); + + /* Configure WiMAX coexistence for combo adapters. */ + error = iwn5000_send_wimax_coex(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not configure WiMAX coexistence, error %d\n", + __func__, error); + return error; + } + if (sc->hw_type != IWN_HW_REV_TYPE_5150) { + struct iwn5000_phy_calib_crystal cmd; + + /* Perform crystal calibration. */ + memset(&cmd, 0, sizeof cmd); + cmd.code = IWN5000_PHY_CALIB_CRYSTAL; + cmd.ngroups = 1; + cmd.isvalid = 1; + cmd.cap_pin[0] = le32toh(sc->eeprom_crystal) & 0xff; + cmd.cap_pin[1] = (le32toh(sc->eeprom_crystal) >> 16) & 0xff; + DPRINTF(sc, IWN_DEBUG_CALIBRATE, + "sending crystal calibration %d, %d\n", + cmd.cap_pin[0], cmd.cap_pin[1]); + error = iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: crystal calibration failed, error %d\n", + __func__, error); + return error; + } + } + if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) { + /* Query calibration from the initialization firmware. */ + error = iwn5000_query_calibration(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not query calibration, error %d\n", + __func__, error); + return error; + } + /* + * We have the calibration results now, reboot with the + * runtime firmware (call ourselves recursively!) + */ + iwn_hw_stop(sc); + error = iwn_hw_init(sc); + } else { + /* Send calibration results to runtime firmware. */ + error = iwn5000_send_calibration(sc); + } + return error; +} + +/* + * The firmware boot code is small and is intended to be copied directly into + * the NIC internal memory (no DMA transfer.) + */ +int +iwn4965_load_bootcode(struct iwn_softc *sc, const uint8_t *ucode, int size) +{ + int error, ntries; + + size /= sizeof (uint32_t); + + error = iwn_nic_lock(sc); + if (error != 0) + return error; + + /* Copy microcode image into NIC memory. */ + iwn_prph_write_region_4(sc, IWN_BSM_SRAM_BASE, + (const uint32_t *)ucode, size); + + iwn_prph_write(sc, IWN_BSM_WR_MEM_SRC, 0); + iwn_prph_write(sc, IWN_BSM_WR_MEM_DST, IWN_FW_TEXT_BASE); + iwn_prph_write(sc, IWN_BSM_WR_DWCOUNT, size); + + /* Start boot load now. */ + iwn_prph_write(sc, IWN_BSM_WR_CTRL, IWN_BSM_WR_CTRL_START); + + /* Wait for transfer to complete. */ for (ntries = 0; ntries < 1000; ntries++) { - if (IWN_READ(sc, IWN_GPIO_CTL) & IWN_GPIO_CLOCK) + if (!(iwn_prph_read(sc, IWN_BSM_WR_CTRL) & + IWN_BSM_WR_CTRL_START)) break; DELAY(10); } if (ntries == 1000) { - device_printf(sc->sc_dev, - "%s: timeout waiting for clock stabilization\n", __func__); + device_printf(sc->sc_dev, "%s: could not load boot firmware\n", + __func__); + iwn_nic_unlock(sc); return ETIMEDOUT; } + + /* Enable boot after power up. */ + iwn_prph_write(sc, IWN_BSM_WR_CTRL, IWN_BSM_WR_CTRL_START_EN); + + iwn_nic_unlock(sc); + return 0; +} + +int +iwn4965_load_firmware(struct iwn_softc *sc) +{ + struct iwn_fw_info *fw = &sc->fw; + struct iwn_dma_info *dma = &sc->fw_dma; + int error; + + /* Copy initialization sections into pre-allocated DMA-safe memory. */ + memcpy(dma->vaddr, fw->init.data, fw->init.datasz); + bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + memcpy(dma->vaddr + IWN4965_FW_DATA_MAXSZ, + fw->init.text, fw->init.textsz); + bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + + /* Tell adapter where to find initialization sections. */ + error = iwn_nic_lock(sc); + if (error != 0) + return error; + iwn_prph_write(sc, IWN_BSM_DRAM_DATA_ADDR, dma->paddr >> 4); + iwn_prph_write(sc, IWN_BSM_DRAM_DATA_SIZE, fw->init.datasz); + iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_ADDR, + (dma->paddr + IWN4965_FW_DATA_MAXSZ) >> 4); + iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_SIZE, fw->init.textsz); + iwn_nic_unlock(sc); + + /* Load firmware boot code. */ + error = iwn4965_load_bootcode(sc, fw->boot.text, fw->boot.textsz); + if (error != 0) { + device_printf(sc->sc_dev, "%s: could not load boot firmware\n", + __func__); + return error; + } + /* Now press "execute". */ + IWN_WRITE(sc, IWN_RESET, 0); + + /* Wait at most one second for first alive notification. */ + error = msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", hz); + if (error) { + device_printf(sc->sc_dev, + "%s: timeout waiting for adapter to initialize, error %d\n", + __func__, error); + return error; + } + + /* Retrieve current temperature for initial TX power calibration. */ + sc->rawtemp = sc->ucode_info.temp[3].chan20MHz; + sc->temp = iwn4965_get_temperature(sc); + + /* Copy runtime sections into pre-allocated DMA-safe memory. */ + memcpy(dma->vaddr, fw->main.data, fw->main.datasz); + bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + memcpy(dma->vaddr + IWN4965_FW_DATA_MAXSZ, + fw->main.text, fw->main.textsz); + bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + + /* Tell adapter where to find runtime sections. */ + error = iwn_nic_lock(sc); + if (error != 0) + return error; + + iwn_prph_write(sc, IWN_BSM_DRAM_DATA_ADDR, dma->paddr >> 4); + iwn_prph_write(sc, IWN_BSM_DRAM_DATA_SIZE, fw->main.datasz); + iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_ADDR, + (dma->paddr + IWN4965_FW_DATA_MAXSZ) >> 4); + iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_SIZE, + IWN_FW_UPDATED | fw->main.textsz); + iwn_nic_unlock(sc); + + return 0; +} + +int +iwn5000_load_firmware_section(struct iwn_softc *sc, uint32_t dst, + const uint8_t *section, int size) +{ + struct iwn_dma_info *dma = &sc->fw_dma; + int error; + + /* Copy firmware section into pre-allocated DMA-safe memory. */ + memcpy(dma->vaddr, section, size); + bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE); + + error = iwn_nic_lock(sc); + if (error != 0) + return error; + + IWN_WRITE(sc, IWN_FH_TX_CONFIG(IWN_SRVC_DMACHNL), + IWN_FH_TX_CONFIG_DMA_PAUSE); + + IWN_WRITE(sc, IWN_FH_SRAM_ADDR(IWN_SRVC_DMACHNL), dst); + IWN_WRITE(sc, IWN_FH_TFBD_CTRL0(IWN_SRVC_DMACHNL), + IWN_LOADDR(dma->paddr)); + IWN_WRITE(sc, IWN_FH_TFBD_CTRL1(IWN_SRVC_DMACHNL), + IWN_HIADDR(dma->paddr) << 28 | size); + IWN_WRITE(sc, IWN_FH_TXBUF_STATUS(IWN_SRVC_DMACHNL), + IWN_FH_TXBUF_STATUS_TBNUM(1) | + IWN_FH_TXBUF_STATUS_TBIDX(1) | + IWN_FH_TXBUF_STATUS_TFBD_VALID); + + /* Kick Flow Handler to start DMA transfer. */ + IWN_WRITE(sc, IWN_FH_TX_CONFIG(IWN_SRVC_DMACHNL), + IWN_FH_TX_CONFIG_DMA_ENA | IWN_FH_TX_CONFIG_CIRQ_HOST_ENDTFD); + + iwn_nic_unlock(sc); + + /* Wait at most five seconds for FH DMA transfer to complete. */ + return msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", hz); +} + +int +iwn5000_load_firmware(struct iwn_softc *sc) +{ + struct iwn_fw_part *fw; + int error; + + /* Load the initialization firmware on first boot only. */ + fw = (sc->sc_flags & IWN_FLAG_CALIB_DONE) ? + &sc->fw.main : &sc->fw.init; + + error = iwn5000_load_firmware_section(sc, IWN_FW_TEXT_BASE, + fw->text, fw->textsz); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not load firmware %s section, error %d\n", + __func__, ".text", error); + return error; + } + error = iwn5000_load_firmware_section(sc, IWN_FW_DATA_BASE, + fw->data, fw->datasz); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not load firmware %s section, error %d\n", + __func__, ".data", error); + return error; + } + + /* Now press "execute". */ + IWN_WRITE(sc, IWN_RESET, 0); + return 0; +} + +int +iwn_read_firmware(struct iwn_softc *sc) +{ + const struct iwn_hal *hal = sc->sc_hal; + struct iwn_fw_info *fw = &sc->fw; + const uint32_t *ptr; + uint32_t rev; + size_t size; + + IWN_UNLOCK(sc); + + /* Read firmware image from filesystem. */ + sc->fw_fp = firmware_get(sc->fwname); + if (sc->fw_fp == NULL) { + device_printf(sc->sc_dev, + "%s: could not load firmare image \"%s\"\n", __func__, + sc->fwname); + IWN_LOCK(sc); + return EINVAL; + } + IWN_LOCK(sc); + + size = sc->fw_fp->datasize; + if (size < 28) { + device_printf(sc->sc_dev, + "%s: truncated firmware header: %zu bytes\n", + __func__, size); + return EINVAL; + } + + /* Process firmware header. */ + ptr = (const uint32_t *)sc->fw_fp->data; + rev = le32toh(*ptr++); + /* Check firmware API version. */ + if (IWN_FW_API(rev) <= 1) { + device_printf(sc->sc_dev, + "%s: bad firmware, need API version >=2\n", __func__); + return EINVAL; + } + if (IWN_FW_API(rev) >= 3) { + /* Skip build number (version 2 header). */ + size -= 4; + ptr++; + } + fw->main.textsz = le32toh(*ptr++); + fw->main.datasz = le32toh(*ptr++); + fw->init.textsz = le32toh(*ptr++); + fw->init.datasz = le32toh(*ptr++); + fw->boot.textsz = le32toh(*ptr++); + size -= 24; + + /* Sanity-check firmware header. */ + if (fw->main.textsz > hal->fw_text_maxsz || + fw->main.datasz > hal->fw_data_maxsz || + fw->init.textsz > hal->fw_text_maxsz || + fw->init.datasz > hal->fw_data_maxsz || + fw->boot.textsz > IWN_FW_BOOT_TEXT_MAXSZ || + (fw->boot.textsz & 3) != 0) { + device_printf(sc->sc_dev, "%s: invalid firmware header\n", + __func__); + return EINVAL; + } + + /* Check that all firmware sections fit. */ + if (fw->main.textsz + fw->main.datasz + fw->init.textsz + + fw->init.datasz + fw->boot.textsz > size) { + device_printf(sc->sc_dev, + "%s: firmware file too short: %zu bytes\n", + __func__, size); + return EINVAL; + } + + /* Get pointers to firmware sections. */ + fw->main.text = (const uint8_t *)ptr; + fw->main.data = fw->main.text + fw->main.textsz; + fw->init.text = fw->main.data + fw->main.datasz; + fw->init.data = fw->init.text + fw->init.textsz; + fw->boot.text = fw->init.data + fw->init.datasz; + + return 0; +} + +int +iwn_clock_wait(struct iwn_softc *sc) +{ + int ntries; + + /* Set "initialization complete" bit. */ + IWN_SETBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_INIT_DONE); + + /* Wait for clock stabilization. */ + for (ntries = 0; ntries < 2500; ntries++) { + if (IWN_READ(sc, IWN_GP_CNTRL) & IWN_GP_CNTRL_MAC_CLOCK_READY) + return 0; + DELAY(10); + } + device_printf(sc->sc_dev, + "%s: timeout waiting for clock stabilization\n", __func__); + return ETIMEDOUT; +} + +int +iwn_apm_init(struct iwn_softc *sc) +{ + uint32_t tmp; + int error; + + /* Disable L0s exit timer (NMI bug workaround.) */ + IWN_SETBITS(sc, IWN_GIO_CHICKEN, IWN_GIO_CHICKEN_DIS_L0S_TIMER); + /* Don't wait for ICH L0s (ICH bug workaround.) */ + IWN_SETBITS(sc, IWN_GIO_CHICKEN, IWN_GIO_CHICKEN_L1A_NO_L0S_RX); + + /* Set FH wait threshold to max (HW bug under stress workaround.) */ + IWN_SETBITS(sc, IWN_DBG_HPET_MEM, 0xffff0000); + + /* Enable HAP INTA to move adapter from L1a to L0s. */ + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_HAP_WAKE_L1A); + + /* Retrieve PCIe Active State Power Management (ASPM). */ + tmp = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1); + /* Workaround for HW instability in PCIe L0->L0s->L1 transition. */ + if (tmp & 0x02) /* L1 Entry enabled. */ + IWN_SETBITS(sc, IWN_GIO, IWN_GIO_L0S_ENA); + else + IWN_CLRBITS(sc, IWN_GIO, IWN_GIO_L0S_ENA); + + if (sc->hw_type != IWN_HW_REV_TYPE_4965 && + sc->hw_type != IWN_HW_REV_TYPE_6000 && + sc->hw_type != IWN_HW_REV_TYPE_6050) + IWN_SETBITS(sc, IWN_ANA_PLL, IWN_ANA_PLL_INIT); + + /* Wait for clock stabilization before accessing prph. */ + error = iwn_clock_wait(sc); + if (error != 0) + return error; + + error = iwn_nic_lock(sc); + if (error != 0) + return error; + + if (sc->hw_type == IWN_HW_REV_TYPE_4965) { + /* Enable DMA and BSM (Bootstrap State Machine.) */ + iwn_prph_write(sc, IWN_APMG_CLK_EN, + IWN_APMG_CLK_CTRL_DMA_CLK_RQT | + IWN_APMG_CLK_CTRL_BSM_CLK_RQT); + } else { + /* Enable DMA. */ + iwn_prph_write(sc, IWN_APMG_CLK_EN, + IWN_APMG_CLK_CTRL_DMA_CLK_RQT); + } + DELAY(20); + + /* Disable L1-Active. */ + iwn_prph_setbits(sc, IWN_APMG_PCI_STT, IWN_APMG_PCI_STT_L1A_DIS); + iwn_nic_unlock(sc); + return 0; } void -iwn_hw_config(struct iwn_softc *sc) +iwn_apm_stop_master(struct iwn_softc *sc) { - uint32_t tmp, hw; + int ntries; - /* enable interrupts mitigation */ - IWN_WRITE(sc, IWN_INTR_MIT, 512 / 32); + /* Stop busmaster DMA activity. */ + IWN_SETBITS(sc, IWN_RESET, IWN_RESET_STOP_MASTER); + for (ntries = 0; ntries < 100; ntries++) { + if (IWN_READ(sc, IWN_RESET) & IWN_RESET_MASTER_DISABLED) + return; + DELAY(10); + } + device_printf(sc->sc_dev, "%s: timeout waiting for master\n", + __func__); +} - /* voodoo from the reference driver */ - tmp = pci_read_config(sc->sc_dev, PCIR_REVID,1); - if ((tmp & 0x80) && (tmp & 0x7f) < 8) { - /* enable "no snoop" field */ - tmp = pci_read_config(sc->sc_dev, 0xe8, 1); - tmp &= ~IWN_DIS_NOSNOOP; - /* clear device specific PCI configuration register 0x41 */ - pci_write_config(sc->sc_dev, 0xe8, tmp, 1); +void +iwn_apm_stop(struct iwn_softc *sc) +{ + iwn_apm_stop_master(sc); + + /* Reset the entire device. */ + IWN_SETBITS(sc, IWN_RESET, IWN_RESET_SW); + DELAY(10); + /* Clear "initialization complete" bit. */ + IWN_CLRBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_INIT_DONE); +} + +int +iwn4965_nic_config(struct iwn_softc *sc) +{ + if (IWN_RFCFG_TYPE(sc->rfcfg) == 1) { + /* + * I don't believe this to be correct but this is what the + * vendor driver is doing. Probably the bits should not be + * shifted in IWN_RFCFG_*. + */ + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, + IWN_RFCFG_TYPE(sc->rfcfg) | + IWN_RFCFG_STEP(sc->rfcfg) | + IWN_RFCFG_DASH(sc->rfcfg)); + } + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, + IWN_HW_IF_CONFIG_RADIO_SI | IWN_HW_IF_CONFIG_MAC_SI); + return 0; +} + +int +iwn5000_nic_config(struct iwn_softc *sc) +{ + uint32_t tmp; + int error; + + if (IWN_RFCFG_TYPE(sc->rfcfg) < 3) { + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, + IWN_RFCFG_TYPE(sc->rfcfg) | + IWN_RFCFG_STEP(sc->rfcfg) | + IWN_RFCFG_DASH(sc->rfcfg)); + } + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, + IWN_HW_IF_CONFIG_RADIO_SI | IWN_HW_IF_CONFIG_MAC_SI); + + error = iwn_nic_lock(sc); + if (error != 0) + return error; + iwn_prph_setbits(sc, IWN_APMG_PS, IWN_APMG_PS_EARLY_PWROFF_DIS); + + if (sc->hw_type == IWN_HW_REV_TYPE_1000) { + /* + * Select first Switching Voltage Regulator (1.32V) to + * solve a stability issue related to noisy DC2DC line + * in the silicon of 1000 Series. + */ + tmp = iwn_prph_read(sc, IWN_APMG_DIGITAL_SVR); + tmp &= ~IWN_APMG_DIGITAL_SVR_VOLTAGE_MASK; + tmp |= IWN_APMG_DIGITAL_SVR_VOLTAGE_1_32; + iwn_prph_write(sc, IWN_APMG_DIGITAL_SVR, tmp); + } + iwn_nic_unlock(sc); + + if (sc->sc_flags & IWN_FLAG_INTERNAL_PA) { + /* Use internal power amplifier only. */ + IWN_WRITE(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_RADIO_2X2_IPA); + } + return 0; +} + +/* + * Take NIC ownership over Intel Active Management Technology (AMT). + */ +int +iwn_hw_prepare(struct iwn_softc *sc) +{ + int ntries; + + /* Check if hardware is ready. */ + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_NIC_READY); + for (ntries = 0; ntries < 5; ntries++) { + if (IWN_READ(sc, IWN_HW_IF_CONFIG) & + IWN_HW_IF_CONFIG_NIC_READY) + return 0; + DELAY(10); } - /* disable L1 entry to work around a hardware bug */ - tmp = pci_read_config(sc->sc_dev, 0xf0, 1); - tmp &= ~IWN_ENA_L1; - pci_write_config(sc->sc_dev, 0xf0, tmp, 1 ); + /* Hardware not ready, force into ready state. */ + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_PREPARE); + for (ntries = 0; ntries < 15000; ntries++) { + if (!(IWN_READ(sc, IWN_HW_IF_CONFIG) & + IWN_HW_IF_CONFIG_PREPARE_DONE)) + break; + DELAY(10); + } + if (ntries == 15000) + return ETIMEDOUT; - hw = IWN_READ(sc, IWN_HWCONFIG); - IWN_WRITE(sc, IWN_HWCONFIG, hw | 0x310); + /* Hardware should be ready now. */ + IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_NIC_READY); + for (ntries = 0; ntries < 5; ntries++) { + if (IWN_READ(sc, IWN_HW_IF_CONFIG) & + IWN_HW_IF_CONFIG_NIC_READY) + return 0; + DELAY(10); + } + return ETIMEDOUT; +} - iwn_mem_lock(sc); - tmp = iwn_mem_read(sc, IWN_MEM_POWER); - iwn_mem_write(sc, IWN_MEM_POWER, tmp | IWN_POWER_RESET); +int +iwn_hw_init(struct iwn_softc *sc) +{ + const struct iwn_hal *hal = sc->sc_hal; + int error, chnl, qid; + + /* Clear pending interrupts. */ + IWN_WRITE(sc, IWN_INT, 0xffffffff); + + error = iwn_apm_init(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not power ON adapter, error %d\n", + __func__, error); + return error; + } + + /* Select VMAIN power source. */ + error = iwn_nic_lock(sc); + if (error != 0) + return error; + iwn_prph_clrbits(sc, IWN_APMG_PS, IWN_APMG_PS_PWR_SRC_MASK); + iwn_nic_unlock(sc); + + /* Perform adapter-specific initialization. */ + error = hal->nic_config(sc); + if (error != 0) + return error; + + /* Initialize RX ring. */ + error = iwn_nic_lock(sc); + if (error != 0) + return error; + IWN_WRITE(sc, IWN_FH_RX_CONFIG, 0); + IWN_WRITE(sc, IWN_FH_RX_WPTR, 0); + /* Set physical address of RX ring (256-byte aligned.) */ + IWN_WRITE(sc, IWN_FH_RX_BASE, sc->rxq.desc_dma.paddr >> 8); + /* Set physical address of RX status (16-byte aligned.) */ + IWN_WRITE(sc, IWN_FH_STATUS_WPTR, sc->rxq.stat_dma.paddr >> 4); + /* Enable RX. */ + IWN_WRITE(sc, IWN_FH_RX_CONFIG, + IWN_FH_RX_CONFIG_ENA | + IWN_FH_RX_CONFIG_IGN_RXF_EMPTY | /* HW bug workaround */ + IWN_FH_RX_CONFIG_IRQ_DST_HOST | + IWN_FH_RX_CONFIG_SINGLE_FRAME | + IWN_FH_RX_CONFIG_RB_TIMEOUT(0) | + IWN_FH_RX_CONFIG_NRBD(IWN_RX_RING_COUNT_LOG)); + iwn_nic_unlock(sc); + IWN_WRITE(sc, IWN_FH_RX_WPTR, (IWN_RX_RING_COUNT - 1) & ~7); + + error = iwn_nic_lock(sc); + if (error != 0) + return error; + + /* Initialize TX scheduler. */ + iwn_prph_write(sc, hal->sched_txfact_addr, 0); + + /* Set physical address of "keep warm" page (16-byte aligned.) */ + IWN_WRITE(sc, IWN_FH_KW_ADDR, sc->kw_dma.paddr >> 4); + + /* Initialize TX rings. */ + for (qid = 0; qid < hal->ntxqs; qid++) { + struct iwn_tx_ring *txq = &sc->txq[qid]; + + /* Set physical address of TX ring (256-byte aligned.) */ + IWN_WRITE(sc, IWN_FH_CBBC_QUEUE(qid), + txq->desc_dma.paddr >> 8); + } + iwn_nic_unlock(sc); + + /* Enable DMA channels. */ + for (chnl = 0; chnl < hal->ndmachnls; chnl++) { + IWN_WRITE(sc, IWN_FH_TX_CONFIG(chnl), + IWN_FH_TX_CONFIG_DMA_ENA | + IWN_FH_TX_CONFIG_DMA_CREDIT_ENA); + } + + /* Clear "radio off" and "commands blocked" bits. */ + IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL); + IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_CMD_BLOCKED); + + /* Clear pending interrupts. */ + IWN_WRITE(sc, IWN_INT, 0xffffffff); + /* Enable interrupt coalescing. */ + IWN_WRITE(sc, IWN_INT_COALESCING, 512 / 8); + /* Enable interrupts. */ + IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask); + + /* _Really_ make sure "radio off" bit is cleared! */ + IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL); + IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL); + + error = hal->load_firmware(sc); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not load firmware, error %d\n", + __func__, error); + return error; + } + /* Wait at most one second for firmware alive notification. */ + error = msleep(sc, &sc->sc_mtx, PCATCH, "iwninit", hz); + if (error != 0) { + device_printf(sc->sc_dev, + "%s: timeout waiting for adapter to initialize, error %d\n", + __func__, error); + return error; + } + /* Do post-firmware initialization. */ + return hal->post_alive(sc); +} + +void +iwn_hw_stop(struct iwn_softc *sc) +{ + const struct iwn_hal *hal = sc->sc_hal; + uint32_t tmp; + int chnl, qid, ntries; + + IWN_WRITE(sc, IWN_RESET, IWN_RESET_NEVO); + + /* Disable interrupts. */ + IWN_WRITE(sc, IWN_INT_MASK, 0); + IWN_WRITE(sc, IWN_INT, 0xffffffff); + IWN_WRITE(sc, IWN_FH_INT, 0xffffffff); + sc->sc_flags &= ~IWN_FLAG_USE_ICT; + + /* Make sure we no longer hold the NIC lock. */ + iwn_nic_unlock(sc); + + /* Stop TX scheduler. */ + iwn_prph_write(sc, hal->sched_txfact_addr, 0); + + /* Stop all DMA channels. */ + if (iwn_nic_lock(sc) == 0) { + for (chnl = 0; chnl < hal->ndmachnls; chnl++) { + IWN_WRITE(sc, IWN_FH_TX_CONFIG(chnl), 0); + for (ntries = 0; ntries < 200; ntries++) { + tmp = IWN_READ(sc, IWN_FH_TX_STATUS); + if ((tmp & IWN_FH_TX_STATUS_IDLE(chnl)) == + IWN_FH_TX_STATUS_IDLE(chnl)) + break; + DELAY(10); + } + } + iwn_nic_unlock(sc); + } + + /* Stop RX ring. */ + iwn_reset_rx_ring(sc, &sc->rxq); + + /* Reset all TX rings. */ + for (qid = 0; qid < hal->ntxqs; qid++) + iwn_reset_tx_ring(sc, &sc->txq[qid]); + + if (iwn_nic_lock(sc) == 0) { + iwn_prph_write(sc, IWN_APMG_CLK_DIS, + IWN_APMG_CLK_CTRL_DMA_CLK_RQT); + iwn_nic_unlock(sc); + } DELAY(5); - tmp = iwn_mem_read(sc, IWN_MEM_POWER); - iwn_mem_write(sc, IWN_MEM_POWER, tmp & ~IWN_POWER_RESET); - iwn_mem_unlock(sc); + + /* Power OFF adapter. */ + iwn_apm_stop(sc); } void iwn_init_locked(struct iwn_softc *sc) { struct ifnet *ifp = sc->sc_ifp; - uint32_t tmp; - int error, qid; + int error; IWN_LOCK_ASSERT(sc); - /* load the firmware */ - if (sc->fw_fp == NULL && (error = iwn_load_firmware(sc)) != 0) { - device_printf(sc->sc_dev, - "%s: could not load firmware, error %d\n", __func__, error); - return; - } - - error = iwn_reset(sc); + error = iwn_hw_prepare(sc); if (error != 0) { - device_printf(sc->sc_dev, - "%s: could not reset adapter, error %d\n", __func__, error); - return; + device_printf(sc->sc_dev, "%s: hardware not ready, eror %d\n", + __func__, error); + goto fail; } - iwn_mem_lock(sc); - iwn_mem_read(sc, IWN_CLOCK_CTL); - iwn_mem_write(sc, IWN_CLOCK_CTL, 0xa00); - iwn_mem_read(sc, IWN_CLOCK_CTL); - iwn_mem_unlock(sc); + /* Initialize interrupt mask to default value. */ + sc->int_mask = IWN_INT_MASK_DEF; + sc->sc_flags &= ~IWN_FLAG_USE_ICT; - DELAY(20); - - iwn_mem_lock(sc); - tmp = iwn_mem_read(sc, IWN_MEM_PCIDEV); - iwn_mem_write(sc, IWN_MEM_PCIDEV, tmp | 0x800); - iwn_mem_unlock(sc); - - iwn_mem_lock(sc); - tmp = iwn_mem_read(sc, IWN_MEM_POWER); - iwn_mem_write(sc, IWN_MEM_POWER, tmp & ~0x03000000); - iwn_mem_unlock(sc); - - iwn_hw_config(sc); - - /* init Rx ring */ - iwn_mem_lock(sc); - IWN_WRITE(sc, IWN_RX_CONFIG, 0); - IWN_WRITE(sc, IWN_RX_WIDX, 0); - /* Rx ring is aligned on a 256-byte boundary */ - IWN_WRITE(sc, IWN_RX_BASE, sc->rxq.desc_dma.paddr >> 8); - /* shared area is aligned on a 16-byte boundary */ - IWN_WRITE(sc, IWN_RW_WIDX_PTR, (sc->shared_dma.paddr + - offsetof(struct iwn_shared, closed_count)) >> 4); - IWN_WRITE(sc, IWN_RX_CONFIG, 0x80601000); - iwn_mem_unlock(sc); - - IWN_WRITE(sc, IWN_RX_WIDX, (IWN_RX_RING_COUNT - 1) & ~7); - - iwn_mem_lock(sc); - iwn_mem_write(sc, IWN_TX_ACTIVE, 0); - - /* set physical address of "keep warm" page */ - IWN_WRITE(sc, IWN_KW_BASE, sc->kw_dma.paddr >> 4); - - /* init Tx rings */ - for (qid = 0; qid < IWN_NTXQUEUES; qid++) { - struct iwn_tx_ring *txq = &sc->txq[qid]; - IWN_WRITE(sc, IWN_TX_BASE(qid), txq->desc_dma.paddr >> 8); - IWN_WRITE(sc, IWN_TX_CONFIG(qid), 0x80000008); - } - iwn_mem_unlock(sc); - - /* clear "radio off" and "disable command" bits (reversed logic) */ - IWN_WRITE(sc, IWN_UCODE_CLR, IWN_RADIO_OFF); - IWN_WRITE(sc, IWN_UCODE_CLR, IWN_DISABLE_CMD); - - /* clear any pending interrupts */ - IWN_WRITE(sc, IWN_INTR, 0xffffffff); - /* enable interrupts */ - IWN_WRITE(sc, IWN_MASK, IWN_INTR_MASK); - - /* not sure why/if this is necessary... */ - IWN_WRITE(sc, IWN_UCODE_CLR, IWN_RADIO_OFF); - IWN_WRITE(sc, IWN_UCODE_CLR, IWN_RADIO_OFF); - - /* check that the radio is not disabled by RF switch */ - if (!(IWN_READ(sc, IWN_GPIO_CTL) & IWN_GPIO_RF_ENABLED)) { + /* Check that the radio is not disabled by hardware switch. */ + if (!(IWN_READ(sc, IWN_GP_CNTRL) & IWN_GP_CNTRL_RFKILL)) { device_printf(sc->sc_dev, "radio is disabled by hardware switch\n"); + + /* Enable interrupts to get RF toggle notifications. */ + IWN_WRITE(sc, IWN_INT, 0xffffffff); + IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask); return; } - error = iwn_transfer_firmware(sc); + /* Read firmware images from the filesystem. */ + error = iwn_read_firmware(sc); if (error != 0) { device_printf(sc->sc_dev, - "%s: could not load firmware, error %d\n", __func__, error); - return; + "%s: could not read firmware, error %d\n", + __func__, error); + goto fail; } - /* firmware has notified us that it is alive.. */ - iwn_post_alive(sc); /* ..do post alive initialization */ - - sc->rawtemp = sc->ucode_info.temp[3].chan20MHz; - sc->temp = iwn_get_temperature(sc); - DPRINTF(sc, IWN_DEBUG_RESET, "%s: temperature=%d\n", - __func__, sc->temp); + /* Initialize hardware and upload firmware. */ + error = iwn_hw_init(sc); + firmware_put(sc->fw_fp, FIRMWARE_UNLOAD); + sc->fw_fp = NULL; + if (error != 0) { + device_printf(sc->sc_dev, + "%s: could not initialize hardware, error %d\n", + __func__, error); + goto fail; + } + /* Configure adapter now that it is ready. */ error = iwn_config(sc); if (error != 0) { device_printf(sc->sc_dev, "%s: could not configure device, error %d\n", __func__, error); - return; + goto fail; } ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; + + return; + +fail: + iwn_stop_locked(sc); } void @@ -4259,38 +6125,15 @@ void iwn_stop_locked(struct iwn_softc *sc) { struct ifnet *ifp = sc->sc_ifp; - uint32_t tmp; - int i; IWN_LOCK_ASSERT(sc); - IWN_WRITE(sc, IWN_RESET, IWN_NEVO_RESET); - sc->sc_tx_timer = 0; callout_stop(&sc->sc_timer_to); ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - /* disable interrupts */ - IWN_WRITE(sc, IWN_MASK, 0); - IWN_WRITE(sc, IWN_INTR, 0xffffffff); - IWN_WRITE(sc, IWN_INTR_STATUS, 0xffffffff); - - /* reset all Tx rings */ - for (i = 0; i < IWN_NTXQUEUES; i++) - iwn_reset_tx_ring(sc, &sc->txq[i]); - - /* reset Rx ring */ - iwn_reset_rx_ring(sc, &sc->rxq); - - iwn_mem_lock(sc); - iwn_mem_write(sc, IWN_MEM_CLOCK2, 0x200); - iwn_mem_unlock(sc); - - DELAY(5); - iwn_stop_master(sc); - - tmp = IWN_READ(sc, IWN_RESET); - IWN_WRITE(sc, IWN_RESET, tmp | IWN_SW_RESET); + /* Power OFF hardware. */ + iwn_hw_stop(sc); } void @@ -4322,7 +6165,16 @@ iwn_scan_start(struct ieee80211com *ic) static void iwn_scan_end(struct ieee80211com *ic) { - /* ignore */ + struct ifnet *ifp = ic->ic_ifp; + struct iwn_softc *sc = ifp->if_softc; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + IWN_LOCK(sc); + if (vap->iv_state == IEEE80211_S_RUN) { + /* Set link LED to ON status if we are associated */ + iwn_set_led(sc, IWN_LED_LINK, 0, 1); + } + IWN_UNLOCK(sc); } /* @@ -4331,30 +6183,15 @@ iwn_scan_end(struct ieee80211com *ic) static void iwn_set_channel(struct ieee80211com *ic) { + const struct ieee80211_channel *c = ic->ic_curchan; struct ifnet *ifp = ic->ic_ifp; struct iwn_softc *sc = ifp->if_softc; - struct ieee80211vap *vap; - const struct ieee80211_channel *c = ic->ic_curchan; - int error; - - vap = TAILQ_FIRST(&ic->ic_vaps); /* XXX */ IWN_LOCK(sc); - if (c != sc->sc_curchan) { - sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq); - sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags); - sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq); - sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags); - - error = iwn_config(sc); - if (error != 0) { - DPRINTF(sc, IWN_DEBUG_STATE, - "%s: set chan failed, cancel scan\n", - __func__); - //XXX Handle failed scan correctly - ieee80211_cancel_scan(vap); - } - } + sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq); + sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags); + sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq); + sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags); IWN_UNLOCK(sc); } @@ -4386,35 +6223,90 @@ iwn_scan_mindwell(struct ieee80211_scan_state *ss) /* NB: don't try to abort scan; wait for firmware to finish */ } +static struct iwn_eeprom_chan * +iwn_find_eeprom_channel(struct iwn_softc *sc, struct ieee80211_channel *c) +{ + int i, j; + + for (j = 0; j < 7; j++) { + for (i = 0; i < iwn_bands[j].nchan; i++) { + if (iwn_bands[j].chan[i] == c->ic_ieee) + return &sc->eeprom_channels[j][i]; + } + } + + return NULL; +} + +/* + * Enforce flags read from EEPROM. + */ +static int +iwn_setregdomain(struct ieee80211com *ic, struct ieee80211_regdomain *rd, + int nchan, struct ieee80211_channel chans[]) +{ + struct iwn_softc *sc = ic->ic_ifp->if_softc; + int i; + + for (i = 0; i < nchan; i++) { + struct ieee80211_channel *c = &chans[i]; + struct iwn_eeprom_chan *channel; + + channel = iwn_find_eeprom_channel(sc, c); + if (channel == NULL) { + if_printf(ic->ic_ifp, + "%s: invalid channel %u freq %u/0x%x\n", + __func__, c->ic_ieee, c->ic_freq, c->ic_flags); + return EINVAL; + } + c->ic_flags |= iwn_eeprom_channel_flags(channel); + } + + return 0; +} + static void -iwn_hwreset(void *arg0, int pending) +iwn_hw_reset(void *arg0, int pending) { struct iwn_softc *sc = arg0; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; + iwn_stop(sc); iwn_init(sc); ieee80211_notify_radio(ic, 1); } static void -iwn_radioon(void *arg0, int pending) -{ - struct iwn_softc *sc = arg0; - - iwn_init(sc); -} - -static void -iwn_radiooff(void *arg0, int pending) +iwn_radio_on(void *arg0, int pending) { struct iwn_softc *sc = arg0; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + if (vap != NULL) { + iwn_init(sc); + ieee80211_init(vap); + } +} + +static void +iwn_radio_off(void *arg0, int pending) +{ + struct iwn_softc *sc = arg0; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + iwn_stop(sc); + if (vap != NULL) + ieee80211_stop(vap); + + /* Enable interrupts to get RF toggle notification. */ IWN_LOCK(sc); - ieee80211_notify_radio(ic, 0); - iwn_stop_locked(sc); + IWN_WRITE(sc, IWN_INT, 0xffffffff); + IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask); IWN_UNLOCK(sc); } @@ -4431,6 +6323,50 @@ iwn_sysctlattach(struct iwn_softc *sc) #endif } +static int +iwn_shutdown(device_t dev) +{ + struct iwn_softc *sc = device_get_softc(dev); + + iwn_stop(sc); + return 0; +} + +static int +iwn_suspend(device_t dev) +{ + struct iwn_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + iwn_stop(sc); + if (vap != NULL) + ieee80211_stop(vap); + return 0; +} + +static int +iwn_resume(device_t dev) +{ + struct iwn_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + + /* Clear device-specific "PCI retry timeout" register (41h). */ + pci_write_config(dev, 0x41, 0, 1); + + if (ifp->if_flags & IFF_UP) { + iwn_init(sc); + if (vap != NULL) + ieee80211_init(vap); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + iwn_start(ifp); + } + return 0; +} + #ifdef IWN_DEBUG static const char * iwn_intr_str(uint8_t cmd) @@ -4446,47 +6382,54 @@ iwn_intr_str(uint8_t cmd) case IWN_BEACON_STATISTICS: return "BEACON_STATS"; case IWN_STATE_CHANGED: return "STATE_CHANGED"; case IWN_BEACON_MISSED: return "BEACON_MISSED"; - case IWN_AMPDU_RX_START: return "AMPDU_RX_START"; - case IWN_AMPDU_RX_DONE: return "AMPDU_RX_DONE"; + case IWN_RX_PHY: return "RX_PHY"; + case IWN_MPDU_RX_DONE: return "MPDU_RX_DONE"; case IWN_RX_DONE: return "RX_DONE"; /* Command Notifications */ - case IWN_CMD_CONFIGURE: return "IWN_CMD_CONFIGURE"; - case IWN_CMD_ASSOCIATE: return "IWN_CMD_ASSOCIATE"; + case IWN_CMD_RXON: return "IWN_CMD_RXON"; + case IWN_CMD_RXON_ASSOC: return "IWN_CMD_RXON_ASSOC"; case IWN_CMD_EDCA_PARAMS: return "IWN_CMD_EDCA_PARAMS"; - case IWN_CMD_TSF: return "IWN_CMD_TSF"; - case IWN_CMD_TX_LINK_QUALITY: return "IWN_CMD_TX_LINK_QUALITY"; + case IWN_CMD_TIMING: return "IWN_CMD_TIMING"; + case IWN_CMD_LINK_QUALITY: return "IWN_CMD_LINK_QUALITY"; case IWN_CMD_SET_LED: return "IWN_CMD_SET_LED"; + case IWN5000_CMD_WIMAX_COEX: return "IWN5000_CMD_WIMAX_COEX"; + case IWN5000_CMD_CALIB_CONFIG: return "IWN5000_CMD_CALIB_CONFIG"; + case IWN5000_CMD_CALIB_RESULT: return "IWN5000_CMD_CALIB_RESULT"; + case IWN5000_CMD_CALIB_COMPLETE: return "IWN5000_CMD_CALIB_COMPLETE"; case IWN_CMD_SET_POWER_MODE: return "IWN_CMD_SET_POWER_MODE"; case IWN_CMD_SCAN: return "IWN_CMD_SCAN"; + case IWN_CMD_SCAN_RESULTS: return "IWN_CMD_SCAN_RESULTS"; case IWN_CMD_TXPOWER: return "IWN_CMD_TXPOWER"; - case IWN_CMD_BLUETOOTH: return "IWN_CMD_BLUETOOTH"; + case IWN_CMD_TXPOWER_DBM: return "IWN_CMD_TXPOWER_DBM"; + case IWN5000_CMD_TX_ANT_CONFIG: return "IWN5000_CMD_TX_ANT_CONFIG"; + case IWN_CMD_BT_COEX: return "IWN_CMD_BT_COEX"; case IWN_CMD_SET_CRITICAL_TEMP: return "IWN_CMD_SET_CRITICAL_TEMP"; - case IWN_SENSITIVITY: return "IWN_SENSITIVITY"; - case IWN_PHY_CALIB: return "IWN_PHY_CALIB"; + case IWN_CMD_SET_SENSITIVITY: return "IWN_CMD_SET_SENSITIVITY"; + case IWN_CMD_PHY_CALIB: return "IWN_CMD_PHY_CALIB"; } return "UNKNOWN INTR NOTIF/CMD"; } #endif /* IWN_DEBUG */ static device_method_t iwn_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, iwn_probe), - DEVMETHOD(device_attach, iwn_attach), - DEVMETHOD(device_detach, iwn_detach), - DEVMETHOD(device_shutdown, iwn_shutdown), - DEVMETHOD(device_suspend, iwn_suspend), - DEVMETHOD(device_resume, iwn_resume), - - { 0, 0 } + /* Device interface */ + DEVMETHOD(device_probe, iwn_probe), + DEVMETHOD(device_attach, iwn_attach), + DEVMETHOD(device_detach, iwn_detach), + DEVMETHOD(device_shutdown, iwn_shutdown), + DEVMETHOD(device_suspend, iwn_suspend), + DEVMETHOD(device_resume, iwn_resume), + { 0, 0 } }; static driver_t iwn_driver = { - "iwn", - iwn_methods, - sizeof (struct iwn_softc) + "iwn", + iwn_methods, + sizeof (struct iwn_softc) }; static devclass_t iwn_devclass; + DRIVER_MODULE(iwn, pci, iwn_driver, iwn_devclass, 0, 0); MODULE_DEPEND(iwn, pci, 1, 1, 1); MODULE_DEPEND(iwn, firmware, 1, 1, 1); diff --git a/sys/dev/iwn/if_iwnreg.h b/sys/dev/iwn/if_iwnreg.h index 96e586724057..0aa766938236 100644 --- a/sys/dev/iwn/if_iwnreg.h +++ b/sys/dev/iwn/if_iwnreg.h @@ -1,8 +1,8 @@ /* $FreeBSD$ */ -/* $OpenBSD: if_iwnreg.h,v 1.9 2007/11/27 20:59:40 damien Exp $ */ +/* $OpenBSD: if_iwnreg.h,v 1.34 2009/11/08 11:54:48 damien Exp $ */ /*- - * Copyright (c) 2007 + * Copyright (c) 2007, 2008 * Damien Bergamini * * Permission to use, copy, modify, and distribute this software for any @@ -18,177 +18,354 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#define EDCA_NUM_AC 4 - #define IWN_TX_RING_COUNT 256 -#define IWN_RX_RING_COUNT 64 +#define IWN_TX_RING_LOMARK 192 +#define IWN_TX_RING_HIMARK 224 +#define IWN_RX_RING_COUNT_LOG 6 +#define IWN_RX_RING_COUNT (1 << IWN_RX_RING_COUNT_LOG) -#define IWN_NTXQUEUES 16 -#define IWN_NTXCHAINS 2 +#define IWN4965_NTXQUEUES 16 +#define IWN5000_NTXQUEUES 20 -/* - * Rings must be aligned on a 256-byte boundary. - */ -#define IWN_RING_DMA_ALIGN 256 +#define IWN4965_NDMACHNLS 7 +#define IWN5000_NDMACHNLS 8 -/* maximum scatter/gather */ +#define IWN_SRVC_DMACHNL 9 + +#define IWN_ICT_SIZE 4096 +#define IWN_ICT_COUNT (IWN_ICT_SIZE / sizeof (uint32_t)) + +/* Maximum number of DMA segments for TX. */ #define IWN_MAX_SCATTER 20 -/* Rx buffers must be large enough to hold a full 4K A-MPDU */ +/* RX buffers must be large enough to hold a full 4K A-MPDU. */ #define IWN_RBUF_SIZE (4 * 1024) +#if defined(__LP64__) +/* HW supports 36-bit DMA addresses. */ +#define IWN_LOADDR(paddr) ((uint32_t)(paddr)) +#define IWN_HIADDR(paddr) (((paddr) >> 32) & 0xf) +#else +#define IWN_LOADDR(paddr) (paddr) +#define IWN_HIADDR(paddr) (0) +#endif + +/* Base Address Register. */ +#define IWN_PCI_BAR0 PCI_MAPREG_START + /* * Control and status registers. */ -#define IWN_HWCONFIG 0x000 -#define IWN_INTR_MIT 0x004 -#define IWN_INTR 0x008 -#define IWN_MASK 0x00c -#define IWN_INTR_STATUS 0x010 +#define IWN_HW_IF_CONFIG 0x000 +#define IWN_INT_COALESCING 0x004 +#define IWN_INT_PERIODIC 0x005 /* use IWN_WRITE_1 */ +#define IWN_INT 0x008 +#define IWN_INT_MASK 0x00c +#define IWN_FH_INT 0x010 #define IWN_RESET 0x020 -#define IWN_GPIO_CTL 0x024 -#define IWN_EEPROM_CTL 0x02c -#define IWN_UCODE_CLR 0x05c -#define IWN_CHICKEN 0x100 -#define IWN_QUEUE_OFFSET(qid) (0x380 + (qid) * 8) +#define IWN_GP_CNTRL 0x024 +#define IWN_HW_REV 0x028 +#define IWN_EEPROM 0x02c +#define IWN_EEPROM_GP 0x030 +#define IWN_OTP_GP 0x034 +#define IWN_GIO 0x03c +#define IWN_GP_DRIVER 0x050 +#define IWN_UCODE_GP1_CLR 0x05c +#define IWN_LED 0x094 +#define IWN_DRAM_INT_TBL 0x0a0 +#define IWN_GIO_CHICKEN 0x100 +#define IWN_ANA_PLL 0x20c +#define IWN_HW_REV_WA 0x22c +#define IWN_DBG_HPET_MEM 0x240 +#define IWN_DBG_LINK_PWR_MGMT 0x250 +#define IWN_MEM_RADDR 0x40c #define IWN_MEM_WADDR 0x410 #define IWN_MEM_WDATA 0x418 -#define IWN_WRITE_MEM_ADDR 0x444 -#define IWN_READ_MEM_ADDR 0x448 -#define IWN_WRITE_MEM_DATA 0x44c -#define IWN_READ_MEM_DATA 0x450 -#define IWN_TX_WIDX 0x460 +#define IWN_MEM_RDATA 0x41c +#define IWN_PRPH_WADDR 0x444 +#define IWN_PRPH_RADDR 0x448 +#define IWN_PRPH_WDATA 0x44c +#define IWN_PRPH_RDATA 0x450 +#define IWN_HBUS_TARG_WRPTR 0x460 -#define IWN_KW_BASE 0x197c -#define IWN_TX_BASE(qid) (0x19d0 + (qid) * 4) -#define IWN_RW_WIDX_PTR 0x1bc0 -#define IWN_RX_BASE 0x1bc4 -#define IWN_RX_WIDX 0x1bc8 -#define IWN_RX_CONFIG 0x1c00 -#define IWN_RX_STATUS 0x1c44 -#define IWN_TX_CONFIG(qid) (0x1d00 + (qid) * 32) -#define IWN_TX_STATUS 0x1eb0 +/* + * Flow-Handler registers. + */ +#define IWN_FH_TFBD_CTRL0(qid) (0x1900 + (qid) * 8) +#define IWN_FH_TFBD_CTRL1(qid) (0x1904 + (qid) * 8) +#define IWN_FH_KW_ADDR 0x197c +#define IWN_FH_SRAM_ADDR(qid) (0x19a4 + (qid) * 4) +#define IWN_FH_CBBC_QUEUE(qid) (0x19d0 + (qid) * 4) +#define IWN_FH_STATUS_WPTR 0x1bc0 +#define IWN_FH_RX_BASE 0x1bc4 +#define IWN_FH_RX_WPTR 0x1bc8 +#define IWN_FH_RX_CONFIG 0x1c00 +#define IWN_FH_RX_STATUS 0x1c44 +#define IWN_FH_TX_CONFIG(qid) (0x1d00 + (qid) * 32) +#define IWN_FH_TXBUF_STATUS(qid) (0x1d08 + (qid) * 32) +#define IWN_FH_TX_CHICKEN 0x1e98 +#define IWN_FH_TX_STATUS 0x1eb0 -#define IWN_SRAM_BASE 0xa02c00 -#define IWN_TX_ACTIVE (IWN_SRAM_BASE + 0x01c) -#define IWN_QUEUE_RIDX(qid) (IWN_SRAM_BASE + 0x064 + (qid) * 4) -#define IWN_SELECT_QCHAIN (IWN_SRAM_BASE + 0x0d0) -#define IWN_QUEUE_INTR_MASK (IWN_SRAM_BASE + 0x0e4) -#define IWN_TXQ_STATUS(qid) (IWN_SRAM_BASE + 0x104 + (qid) * 4) +/* + * TX scheduler registers. + */ +#define IWN_SCHED_BASE 0xa02c00 +#define IWN_SCHED_SRAM_ADDR (IWN_SCHED_BASE + 0x000) +#define IWN5000_SCHED_DRAM_ADDR (IWN_SCHED_BASE + 0x008) +#define IWN4965_SCHED_DRAM_ADDR (IWN_SCHED_BASE + 0x010) +#define IWN5000_SCHED_TXFACT (IWN_SCHED_BASE + 0x010) +#define IWN4965_SCHED_TXFACT (IWN_SCHED_BASE + 0x01c) +#define IWN4965_SCHED_QUEUE_RDPTR(qid) (IWN_SCHED_BASE + 0x064 + (qid) * 4) +#define IWN5000_SCHED_QUEUE_RDPTR(qid) (IWN_SCHED_BASE + 0x068 + (qid) * 4) +#define IWN4965_SCHED_QCHAIN_SEL (IWN_SCHED_BASE + 0x0d0) +#define IWN4965_SCHED_INTR_MASK (IWN_SCHED_BASE + 0x0e4) +#define IWN5000_SCHED_QCHAIN_SEL (IWN_SCHED_BASE + 0x0e8) +#define IWN4965_SCHED_QUEUE_STATUS(qid) (IWN_SCHED_BASE + 0x104 + (qid) * 4) +#define IWN5000_SCHED_INTR_MASK (IWN_SCHED_BASE + 0x108) +#define IWN5000_SCHED_QUEUE_STATUS(qid) (IWN_SCHED_BASE + 0x10c + (qid) * 4) +#define IWN5000_SCHED_AGGR_SEL (IWN_SCHED_BASE + 0x248) + +/* + * Offsets in TX scheduler's SRAM. + */ +#define IWN4965_SCHED_CTX_OFF 0x380 +#define IWN4965_SCHED_CTX_LEN 416 +#define IWN4965_SCHED_QUEUE_OFFSET(qid) (0x380 + (qid) * 8) +#define IWN4965_SCHED_TRANS_TBL(qid) (0x500 + (qid) * 2) +#define IWN5000_SCHED_CTX_OFF 0x600 +#define IWN5000_SCHED_CTX_LEN 520 +#define IWN5000_SCHED_QUEUE_OFFSET(qid) (0x600 + (qid) * 8) +#define IWN5000_SCHED_TRANS_TBL(qid) (0x7e0 + (qid) * 2) /* * NIC internal memory offsets. */ -#define IWN_CLOCK_CTL 0x3000 -#define IWN_MEM_CLOCK2 0x3008 -#define IWN_MEM_POWER 0x300c -#define IWN_MEM_PCIDEV 0x3010 -#define IWN_MEM_UCODE_CTL 0x3400 -#define IWN_MEM_UCODE_SRC 0x3404 -#define IWN_MEM_UCODE_DST 0x3408 -#define IWN_MEM_UCODE_SIZE 0x340c -#define IWN_MEM_TEXT_BASE 0x3490 -#define IWN_MEM_TEXT_SIZE 0x3494 -#define IWN_MEM_DATA_BASE 0x3498 -#define IWN_MEM_DATA_SIZE 0x349c -#define IWN_MEM_UCODE_BASE 0x3800 +#define IWN_APMG_CLK_CTRL 0x3000 +#define IWN_APMG_CLK_EN 0x3004 +#define IWN_APMG_CLK_DIS 0x3008 +#define IWN_APMG_PS 0x300c +#define IWN_APMG_DIGITAL_SVR 0x3058 +#define IWN_APMG_ANALOG_SVR 0x306c +#define IWN_APMG_PCI_STT 0x3010 +#define IWN_BSM_WR_CTRL 0x3400 +#define IWN_BSM_WR_MEM_SRC 0x3404 +#define IWN_BSM_WR_MEM_DST 0x3408 +#define IWN_BSM_WR_DWCOUNT 0x340c +#define IWN_BSM_DRAM_TEXT_ADDR 0x3490 +#define IWN_BSM_DRAM_TEXT_SIZE 0x3494 +#define IWN_BSM_DRAM_DATA_ADDR 0x3498 +#define IWN_BSM_DRAM_DATA_SIZE 0x349c +#define IWN_BSM_SRAM_BASE 0x3800 +/* Possible flags for register IWN_HW_IF_CONFIG. */ +#define IWN_HW_IF_CONFIG_4965_R (1 << 4) +#define IWN_HW_IF_CONFIG_MAC_SI (1 << 8) +#define IWN_HW_IF_CONFIG_RADIO_SI (1 << 9) +#define IWN_HW_IF_CONFIG_EEPROM_LOCKED (1 << 21) +#define IWN_HW_IF_CONFIG_NIC_READY (1 << 22) +#define IWN_HW_IF_CONFIG_HAP_WAKE_L1A (1 << 23) +#define IWN_HW_IF_CONFIG_PREPARE_DONE (1 << 25) +#define IWN_HW_IF_CONFIG_PREPARE (1 << 27) -/* possible flags for register IWN_HWCONFIG */ -#define IWN_HW_EEPROM_LOCKED (1 << 21) +/* Possible values for register IWN_INT_PERIODIC. */ +#define IWN_INT_PERIODIC_DIS 0x00 +#define IWN_INT_PERIODIC_ENA 0xff -/* possible flags for registers IWN_READ_MEM_ADDR/IWN_WRITE_MEM_ADDR */ -#define IWN_MEM_4 ((sizeof (uint32_t) - 1) << 24) +/* Possible flags for registers IWN_PRPH_RADDR/IWN_PRPH_WADDR. */ +#define IWN_PRPH_DWORD ((sizeof (uint32_t) - 1) << 24) -/* possible values for IWN_MEM_UCODE_DST */ -#define IWN_FW_TEXT 0x00000000 +/* Possible values for IWN_BSM_WR_MEM_DST. */ +#define IWN_FW_TEXT_BASE 0x00000000 +#define IWN_FW_DATA_BASE 0x00800000 -/* possible flags for register IWN_RESET */ -#define IWN_NEVO_RESET (1 << 0) -#define IWN_SW_RESET (1 << 7) -#define IWN_MASTER_DISABLED (1 << 8) -#define IWN_STOP_MASTER (1 << 9) +/* Possible flags for register IWN_RESET. */ +#define IWN_RESET_NEVO (1 << 0) +#define IWN_RESET_SW (1 << 7) +#define IWN_RESET_MASTER_DISABLED (1 << 8) +#define IWN_RESET_STOP_MASTER (1 << 9) +#define IWN_RESET_LINK_PWR_MGMT_DIS (1 << 31) -/* possible flags for register IWN_GPIO_CTL */ -#define IWN_GPIO_CLOCK (1 << 0) -#define IWN_GPIO_INIT (1 << 2) -#define IWN_GPIO_MAC (1 << 3) -#define IWN_GPIO_SLEEP (1 << 4) -#define IWN_GPIO_PWR_STATUS 0x07000000 -#define IWN_GPIO_PWR_SLEEP (4 << 24) -#define IWN_GPIO_RF_ENABLED (1 << 27) +/* Possible flags for register IWN_GP_CNTRL. */ +#define IWN_GP_CNTRL_MAC_ACCESS_ENA (1 << 0) +#define IWN_GP_CNTRL_MAC_CLOCK_READY (1 << 0) +#define IWN_GP_CNTRL_INIT_DONE (1 << 2) +#define IWN_GP_CNTRL_MAC_ACCESS_REQ (1 << 3) +#define IWN_GP_CNTRL_SLEEP (1 << 4) +#define IWN_GP_CNTRL_RFKILL (1 << 27) -/* possible flags for register IWN_CHICKEN */ -#define IWN_CHICKEN_DISLOS (1 << 29) +/* Possible flags for register IWN_HW_REV. */ +#define IWN_HW_REV_TYPE_SHIFT 4 +#define IWN_HW_REV_TYPE_MASK 0x000000f0 +#define IWN_HW_REV_TYPE_4965 0 +#define IWN_HW_REV_TYPE_5300 2 +#define IWN_HW_REV_TYPE_5350 3 +#define IWN_HW_REV_TYPE_5150 4 +#define IWN_HW_REV_TYPE_5100 5 +#define IWN_HW_REV_TYPE_1000 6 +#define IWN_HW_REV_TYPE_6000 7 +#define IWN_HW_REV_TYPE_6050 8 -/* possible flags for register IWN_UCODE_CLR */ -#define IWN_RADIO_OFF (1 << 1) -#define IWN_DISABLE_CMD (1 << 2) -#define IWN_CTEMP_STOP_RF (1 << 3) +/* Possible flags for register IWN_GIO_CHICKEN. */ +#define IWN_GIO_CHICKEN_L1A_NO_L0S_RX (1 << 23) +#define IWN_GIO_CHICKEN_DIS_L0S_TIMER (1 << 29) -/* possible flags for IWN_RX_STATUS */ -#define IWN_RX_IDLE (1 << 24) +/* Possible flags for register IWN_GIO. */ +#define IWN_GIO_L0S_ENA (1 << 1) -/* possible flags for register IWN_UC_CTL */ -#define IWN_UC_ENABLE (1 << 30) -#define IWN_UC_RUN (1 << 31) +/* Possible flags for register IWN_GP_DRIVER. */ +#define IWN_GP_DRIVER_RADIO_3X3_HYB (0 << 0) +#define IWN_GP_DRIVER_RADIO_2X2_HYB (1 << 0) +#define IWN_GP_DRIVER_RADIO_2X2_IPA (2 << 0) -/* possible flags for register IWN_INTR */ -#define IWN_ALIVE_INTR (1 << 0) -#define IWN_WAKEUP_INTR (1 << 1) -#define IWN_SW_RX_INTR (1 << 3) -#define IWN_CT_REACHED (1 << 6) -#define IWN_RF_TOGGLED (1 << 7) -#define IWN_SW_ERROR (1 << 25) -#define IWN_TX_INTR (1 << 27) -#define IWN_HW_ERROR (1 << 29) -#define IWN_RX_INTR (1 << 31) +/* Possible flags for register IWN_UCODE_GP1_CLR. */ +#define IWN_UCODE_GP1_RFKILL (1 << 1) +#define IWN_UCODE_GP1_CMD_BLOCKED (1 << 2) +#define IWN_UCODE_GP1_CTEMP_STOP_RF (1 << 3) -#define IWN_INTR_BITS "\20\1ALIVE\2WAKEUP\3SW_RX\6CT_REACHED\7RF_TOGGLED" \ - "\32SW_ERROR\34TX_INTR\36HW_ERROR\40RX_INTR" +/* Possible flags/values for register IWN_LED. */ +#define IWN_LED_BSM_CTRL (1 << 5) +#define IWN_LED_OFF 0x00000038 +#define IWN_LED_ON 0x00000078 -#define IWN_INTR_MASK \ - (IWN_SW_ERROR | IWN_HW_ERROR | IWN_TX_INTR | IWN_RX_INTR | \ - IWN_ALIVE_INTR | IWN_WAKEUP_INTR | IWN_SW_RX_INTR | \ - IWN_CT_REACHED | IWN_RF_TOGGLED) +/* Possible flags for register IWN_DRAM_INT_TBL. */ +#define IWN_DRAM_INT_TBL_WRAP_CHECK (1 << 27) +#define IWN_DRAM_INT_TBL_ENABLE (1 << 31) -/* possible flags for register IWN_INTR_STATUS */ -#define IWN_STATUS_TXQ(x) (1 << (x)) -#define IWN_STATUS_RXQ(x) (1 << ((x) + 16)) -#define IWN_STATUS_PRI (1 << 30) -/* shortcuts for the above */ -#define IWN_TX_STATUS_INTR \ - (IWN_STATUS_TXQ(0) | IWN_STATUS_TXQ(1) | IWN_STATUS_TXQ(6)) -#define IWN_RX_STATUS_INTR \ - (IWN_STATUS_RXQ(0) | IWN_STATUS_RXQ(1) | IWN_STATUS_RXQ(2) | \ - IWN_STATUS_PRI) +/* Possible values for register IWN_ANA_PLL. */ +#define IWN_ANA_PLL_INIT 0x00880300 -/* possible flags for register IWN_TX_STATUS */ -#define IWN_TX_IDLE(qid) (1 << ((qid) + 24) | 1 << ((qid) + 16)) +/* Possible flags for register IWN_FH_RX_STATUS. */ +#define IWN_FH_RX_STATUS_IDLE (1 << 24) -/* possible flags/masks for register IWN_EEPROM_CTL */ -#define IWN_EEPROM_READY (1 << 0) -#define IWN_EEPROM_MSK (1 << 1) +/* Possible flags for register IWN_BSM_WR_CTRL. */ +#define IWN_BSM_WR_CTRL_START_EN (1 << 30) +#define IWN_BSM_WR_CTRL_START (1 << 31) -/* possible flags for register IWN_TXQ_STATUS */ -#define IWN_TXQ_STATUS_ACTIVE 0x0007fc01 +/* Possible flags for register IWN_INT. */ +#define IWN_INT_ALIVE (1 << 0) +#define IWN_INT_WAKEUP (1 << 1) +#define IWN_INT_SW_RX (1 << 3) +#define IWN_INT_CT_REACHED (1 << 6) +#define IWN_INT_RF_TOGGLED (1 << 7) +#define IWN_INT_SW_ERR (1 << 25) +#define IWN_INT_SCHED (1 << 26) +#define IWN_INT_FH_TX (1 << 27) +#define IWN_INT_RX_PERIODIC (1 << 28) +#define IWN_INT_HW_ERR (1 << 29) +#define IWN_INT_FH_RX (1 << 31) -/* possible flags for register IWN_MEM_POWER */ -#define IWN_POWER_RESET (1 << 26) +/* Shortcut. */ +#define IWN_INT_MASK_DEF \ + (IWN_INT_SW_ERR | IWN_INT_HW_ERR | IWN_INT_FH_TX | \ + IWN_INT_FH_RX | IWN_INT_ALIVE | IWN_INT_WAKEUP | \ + IWN_INT_SW_RX | IWN_INT_CT_REACHED | IWN_INT_RF_TOGGLED) -/* possible flags for register IWN_MEM_TEXT_SIZE */ +/* Possible flags for register IWN_FH_INT. */ +#define IWN_FH_INT_TX_CHNL(x) (1 << (x)) +#define IWN_FH_INT_RX_CHNL(x) (1 << ((x) + 16)) +#define IWN_FH_INT_HI_PRIOR (1 << 30) +/* Shortcuts for the above. */ +#define IWN_FH_INT_TX \ + (IWN_FH_INT_TX_CHNL(0) | IWN_FH_INT_TX_CHNL(1)) +#define IWN_FH_INT_RX \ + (IWN_FH_INT_RX_CHNL(0) | IWN_FH_INT_RX_CHNL(1) | IWN_FH_INT_HI_PRIOR) + +/* Possible flags/values for register IWN_FH_TX_CONFIG. */ +#define IWN_FH_TX_CONFIG_DMA_PAUSE 0 +#define IWN_FH_TX_CONFIG_DMA_ENA (1 << 31) +#define IWN_FH_TX_CONFIG_CIRQ_HOST_ENDTFD (1 << 20) + +/* Possible flags/values for register IWN_FH_TXBUF_STATUS. */ +#define IWN_FH_TXBUF_STATUS_TBNUM(x) ((x) << 20) +#define IWN_FH_TXBUF_STATUS_TBIDX(x) ((x) << 12) +#define IWN_FH_TXBUF_STATUS_TFBD_VALID 3 + +/* Possible flags for register IWN_FH_TX_CHICKEN. */ +#define IWN_FH_TX_CHICKEN_SCHED_RETRY (1 << 1) + +/* Possible flags for register IWN_FH_TX_STATUS. */ +#define IWN_FH_TX_STATUS_IDLE(chnl) \ + (1 << ((chnl) + 24) | 1 << ((chnl) + 16)) + +/* Possible flags for register IWN_FH_RX_CONFIG. */ +#define IWN_FH_RX_CONFIG_ENA (1 << 31) +#define IWN_FH_RX_CONFIG_NRBD(x) ((x) << 20) +#define IWN_FH_RX_CONFIG_RB_SIZE_8K (1 << 16) +#define IWN_FH_RX_CONFIG_SINGLE_FRAME (1 << 15) +#define IWN_FH_RX_CONFIG_IRQ_DST_HOST (1 << 12) +#define IWN_FH_RX_CONFIG_RB_TIMEOUT(x) ((x) << 4) +#define IWN_FH_RX_CONFIG_IGN_RXF_EMPTY (1 << 2) + +/* Possible flags for register IWN_FH_TX_CONFIG. */ +#define IWN_FH_TX_CONFIG_DMA_ENA (1 << 31) +#define IWN_FH_TX_CONFIG_DMA_CREDIT_ENA (1 << 3) + +/* Possible flags for register IWN_EEPROM. */ +#define IWN_EEPROM_READ_VALID (1 << 0) +#define IWN_EEPROM_CMD (1 << 1) + +/* Possible flags for register IWN_EEPROM_GP. */ +#define IWN_EEPROM_GP_IF_OWNER 0x00000180 + +/* Possible flags for register IWN_OTP_GP. */ +#define IWN_OTP_GP_DEV_SEL_OTP (1 << 16) +#define IWN_OTP_GP_RELATIVE_ACCESS (1 << 17) +#define IWN_OTP_GP_ECC_CORR_STTS (1 << 20) +#define IWN_OTP_GP_ECC_UNCORR_STTS (1 << 21) + +/* Possible flags for register IWN_SCHED_QUEUE_STATUS. */ +#define IWN4965_TXQ_STATUS_ACTIVE 0x0007fc01 +#define IWN4965_TXQ_STATUS_INACTIVE 0x0007fc00 +#define IWN4965_TXQ_STATUS_AGGR_ENA (1 << 5 | 1 << 8) +#define IWN4965_TXQ_STATUS_CHGACT (1 << 10) +#define IWN5000_TXQ_STATUS_ACTIVE 0x00ff0018 +#define IWN5000_TXQ_STATUS_INACTIVE 0x00ff0010 +#define IWN5000_TXQ_STATUS_CHGACT (1 << 19) + +/* Possible flags for registers IWN_APMG_CLK_*. */ +#define IWN_APMG_CLK_CTRL_DMA_CLK_RQT (1 << 9) +#define IWN_APMG_CLK_CTRL_BSM_CLK_RQT (1 << 11) + +/* Possible flags for register IWN_APMG_PS. */ +#define IWN_APMG_PS_EARLY_PWROFF_DIS (1 << 22) +#define IWN_APMG_PS_PWR_SRC(x) ((x) << 24) +#define IWN_APMG_PS_PWR_SRC_VMAIN 0 +#define IWN_APMG_PS_PWR_SRC_VAUX 2 +#define IWN_APMG_PS_PWR_SRC_MASK IWN_APMG_PS_PWR_SRC(3) +#define IWN_APMG_PS_RESET_REQ (1 << 26) + +/* Possible flags for register IWN_APMG_DIGITAL_SVR. */ +#define IWN_APMG_DIGITAL_SVR_VOLTAGE(x) (((x) & 0xf) << 5) +#define IWN_APMG_DIGITAL_SVR_VOLTAGE_MASK \ + IWN_APMG_DIGITAL_SVR_VOLTAGE(0xf) +#define IWN_APMG_DIGITAL_SVR_VOLTAGE_1_32 \ + IWN_APMG_DIGITAL_SVR_VOLTAGE(3) + +/* Possible flags for IWN_APMG_PCI_STT. */ +#define IWN_APMG_PCI_STT_L1A_DIS (1 << 11) + +/* Possible flags for register IWN_BSM_DRAM_TEXT_SIZE. */ #define IWN_FW_UPDATED (1 << 31) -/* possible flags for device-specific PCI register 0xe8 */ -#define IWN_DIS_NOSNOOP (1 << 11) +#define IWN_SCHED_WINSZ 64 +#define IWN_SCHED_LIMIT 64 +#define IWN4965_SCHED_COUNT 512 +#define IWN5000_SCHED_COUNT (IWN_TX_RING_COUNT + IWN_SCHED_WINSZ) +#define IWN4965_SCHEDSZ (IWN4965_NTXQUEUES * IWN4965_SCHED_COUNT * 2) +#define IWN5000_SCHEDSZ (IWN5000_NTXQUEUES * IWN5000_SCHED_COUNT * 2) -/* possible flags for device-specific PCI register 0xf0 */ -#define IWN_ENA_L1 (1 << 1) +struct iwn_tx_desc { + uint8_t reserved1[3]; + uint8_t nsegs; + struct { + uint32_t addr; + uint16_t len; + } __packed segs[IWN_MAX_SCATTER]; + /* Pad to 128 bytes. */ + uint32_t reserved2; +} __packed; - -#define IWN_TX_WINDOW 64 -struct iwn_shared { - uint16_t len[IWN_NTXQUEUES][512]; /* 16KB total */ +struct iwn_rx_status { uint16_t closed_count; uint16_t closed_rx_count; uint16_t finished_count; @@ -196,86 +373,85 @@ struct iwn_shared { uint32_t reserved[2]; } __packed; -struct iwn_tx_desc { - uint32_t flags; - struct { - uint32_t w1; - uint32_t w2; - uint32_t w3; - } __packed segs[IWN_MAX_SCATTER / 2]; - /* pad to 128 bytes */ - uint32_t reserved; -} __packed; - -#define IWN_SET_DESC_NSEGS(d, x) \ - (d)->flags = htole32(((x) & 0x1f) << 24) - -/* set a segment physical address and length in a Tx descriptor */ -#define IWN_SET_DESC_SEG(d, n, addr, size) do { \ - if ((n) & 1) { \ - (d)->segs[(n) / 2].w2 |= \ - htole32(((addr) & 0xffff) << 16); \ - (d)->segs[(n) / 2].w3 = \ - htole32((((addr) >> 16) & 0xffff) | (size) << 20); \ - } else { \ - (d)->segs[(n) / 2].w1 = htole32(addr); \ - (d)->segs[(n) / 2].w2 = htole32((size) << 4); \ - } \ -} while (0) - struct iwn_rx_desc { uint32_t len; uint8_t type; -#define IWN_UC_READY 1 -#define IWN_ADD_NODE_DONE 24 -#define IWN_TX_DONE 28 -#define IWN_START_SCAN 130 -#define IWN_STOP_SCAN 132 -#define IWN_RX_STATISTICS 156 -#define IWN_BEACON_STATISTICS 157 -#define IWN_STATE_CHANGED 161 -#define IWN_BEACON_MISSED 162 -#define IWN_AMPDU_RX_START 192 -#define IWN_AMPDU_RX_DONE 193 -#define IWN_RX_DONE 195 +#define IWN_UC_READY 1 +#define IWN_ADD_NODE_DONE 24 +#define IWN_TX_DONE 28 +#define IWN5000_CALIBRATION_RESULT 102 +#define IWN5000_CALIBRATION_DONE 103 +#define IWN_START_SCAN 130 +#define IWN_STOP_SCAN 132 +#define IWN_RX_STATISTICS 156 +#define IWN_BEACON_STATISTICS 157 +#define IWN_STATE_CHANGED 161 +#define IWN_BEACON_MISSED 162 +#define IWN_RX_PHY 192 +#define IWN_MPDU_RX_DONE 193 +#define IWN_RX_DONE 195 +#define IWN_RX_COMPRESSED_BA 197 uint8_t flags; uint8_t idx; uint8_t qid; } __packed; -/* possible Rx status flags */ -#define IWN_RX_NO_CRC_ERR (1 << 0) -#define IWN_RX_NO_OVFL_ERR (1 << 1) -/* shortcut for the above */ +/* Possible RX status flags. */ +#define IWN_RX_NO_CRC_ERR (1 << 0) +#define IWN_RX_NO_OVFL_ERR (1 << 1) +/* Shortcut for the above. */ #define IWN_RX_NOERROR (IWN_RX_NO_CRC_ERR | IWN_RX_NO_OVFL_ERR) +#define IWN_RX_MPDU_MIC_OK (1 << 6) +#define IWN_RX_CIPHER_MASK (7 << 8) +#define IWN_RX_CIPHER_CCMP (2 << 8) +#define IWN_RX_MPDU_DEC (1 << 11) +#define IWN_RX_DECRYPT_MASK (3 << 11) +#define IWN_RX_DECRYPT_OK (3 << 11) struct iwn_tx_cmd { uint8_t code; -#define IWN_CMD_CONFIGURE 0x10 /* REPLY_RXON */ -#define IWN_CMD_ASSOCIATE 0x11 /* REPLY_RXON_ASSOC */ -#define IWN_CMD_EDCA_PARAMS 0x13 /* REPLY_QOS_PARAM */ -#define IWN_CMD_TSF 0x14 /* REPLY_RXON_TIMING */ -#define IWN_CMD_ADD_NODE 0x18 /* REPLY_ADD_STA */ -#define IWN_CMD_TX_DATA 0x1c /* REPLY_TX */ -#define IWN_CMD_TX_LINK_QUALITY 0x4e /* REPLY_TX_LINK_QUALITY_CMD */ -#define IWN_CMD_SET_LED 0x48 /* REPLY_LEDS_CMD */ -#define IWN_CMD_SET_POWER_MODE 0x77 /* POWER_TABLE_CMD */ -#define IWN_CMD_SCAN 0x80 /* REPLY_SCAN_CMD */ -#define IWN_CMD_TXPOWER 0x97 /* REPLY_TX_PWR_TABLE_CMD */ -#define IWN_CMD_BLUETOOTH 0x9b /* REPLY_BT_CONFIG */ -#define IWN_CMD_GET_STATISTICS 0x9c /* REPLY_STATISTICS_CMD */ -#define IWN_CMD_SET_CRITICAL_TEMP 0xa4 /* REPLY_CT_KILL_CONFIG_CMD */ -#define IWN_SENSITIVITY 0xa8 /* SENSITIVITY_CMD */ -#define IWN_PHY_CALIB 0xb0 /* REPLY_PHY_CALIBRATION_CMD */ +#define IWN_CMD_RXON 16 +#define IWN_CMD_RXON_ASSOC 17 +#define IWN_CMD_EDCA_PARAMS 19 +#define IWN_CMD_TIMING 20 +#define IWN_CMD_ADD_NODE 24 +#define IWN_CMD_TX_DATA 28 +#define IWN_CMD_LINK_QUALITY 78 +#define IWN_CMD_SET_LED 72 +#define IWN5000_CMD_WIMAX_COEX 90 +#define IWN5000_CMD_CALIB_CONFIG 101 +#define IWN5000_CMD_CALIB_RESULT 102 +#define IWN5000_CMD_CALIB_COMPLETE 103 +#define IWN_CMD_SET_POWER_MODE 119 +#define IWN_CMD_SCAN 128 +#define IWN_CMD_SCAN_RESULTS 131 +#define IWN_CMD_TXPOWER_DBM 149 +#define IWN_CMD_TXPOWER 151 +#define IWN5000_CMD_TX_ANT_CONFIG 152 +#define IWN_CMD_BT_COEX 155 +#define IWN_CMD_GET_STATISTICS 156 +#define IWN_CMD_SET_CRITICAL_TEMP 164 +#define IWN_CMD_SET_SENSITIVITY 168 +#define IWN_CMD_PHY_CALIB 176 + uint8_t flags; uint8_t idx; uint8_t qid; uint8_t data[136]; } __packed; -/* structure for command IWN_CMD_CONFIGURE (aka RXON) */ -struct iwn_config { +/* Antenna flags, used in various commands. */ +#define IWN_ANT_A (1 << 0) +#define IWN_ANT_B (1 << 1) +#define IWN_ANT_C (1 << 2) +/* Shortcuts. */ +#define IWN_ANT_AB (IWN_ANT_A | IWN_ANT_B) +#define IWN_ANT_BC (IWN_ANT_B | IWN_ANT_C) +#define IWN_ANT_ABC (IWN_ANT_A | IWN_ANT_B | IWN_ANT_C) + +/* Structure for command IWN_CMD_RXON. */ +struct iwn_rxon { uint8_t myaddr[IEEE80211_ADDR_LEN]; uint16_t reserved1; uint8_t bssid[IEEE80211_ADDR_LEN]; @@ -287,54 +463,55 @@ struct iwn_config { #define IWN_MODE_STA 3 #define IWN_MODE_IBSS 4 #define IWN_MODE_MONITOR 6 - uint8_t unused4; /* air propagation */ + + uint8_t air; uint16_t rxchain; -#define IWN_RXCHAIN_VALID 0x000e /* which antennae are valid */ -#define IWN_RXCHAIN_VALID_S 1 -#define IWN_RXCHAIN_FORCE 0x0070 -#define IWN_RXCHAIN_FORCE_S 4 -#define IWN_RXCHAIN_FORCE_MIMO 0x0380 -#define IWN_RXCHAIN_FORCE_MIMO_S 7 -#define IWN_RXCHAIN_CNT 0x0c00 -#define IWN_RXCHAIN_CNT_S 10 -#define IWN_RXCHAIN_MIMO_CNT 0x3000 -#define IWN_RXCHAIN_MIMO_CNT_S 12 -#define IWN_RXCHAIN_MIMO_FORCE 0x4000 -#define IWN_RXCHAIN_MIMO_FORCE_S 14 - uint8_t ofdm_mask; /* basic rates */ - uint8_t cck_mask; /* basic rates */ +#define IWN_RXCHAIN_DRIVER_FORCE (1 << 0) +#define IWN_RXCHAIN_VALID(x) (((x) & IWN_ANT_ABC) << 1) +#define IWN_RXCHAIN_FORCE_SEL(x) (((x) & IWN_ANT_ABC) << 4) +#define IWN_RXCHAIN_FORCE_MIMO_SEL(x) (((x) & IWN_ANT_ABC) << 7) +#define IWN_RXCHAIN_IDLE_COUNT(x) ((x) << 10) +#define IWN_RXCHAIN_MIMO_COUNT(x) ((x) << 12) +#define IWN_RXCHAIN_MIMO_FORCE (1 << 14) + + uint8_t ofdm_mask; + uint8_t cck_mask; uint16_t associd; uint32_t flags; -#define IWN_CONFIG_24GHZ 0x00000001 /* band */ -#define IWN_CONFIG_CCK 0x00000002 /* modulation */ -#define IWN_CONFIG_AUTO 0x00000004 /* 2.4-only auto-detect */ -#define IWN_CONFIG_HTPROT 0x00000008 /* xmit with HT protection */ -#define IWN_CONFIG_SHSLOT 0x00000010 /* short slot time */ -#define IWN_CONFIG_SHPREAMBLE 0x00000020 /* short premable */ -#define IWN_CONFIG_NODIVERSITY 0x00000080 /* disable antenna diversity */ -#define IWN_CONFIG_ANTENNA_A 0x00000100 -#define IWN_CONFIG_ANTENNA_B 0x00000200 -#define IWN_CONFIG_RADAR 0x00001000 /* enable radar detect */ -#define IWN_CONFIG_NARROW 0x00002000 /* MKK narrow band select */ -#define IWN_CONFIG_TSF 0x00008000 -#define IWN_CONFIG_HT 0x06400000 -#define IWN_CONFIG_HT20 0x02000000 -#define IWN_CONFIG_HT40U 0x04000000 -#define IWN_CONFIG_HT40D 0x04400000 +#define IWN_RXON_24GHZ (1 << 0) +#define IWN_RXON_CCK (1 << 1) +#define IWN_RXON_AUTO (1 << 2) +#define IWN_RXON_SHSLOT (1 << 4) +#define IWN_RXON_SHPREAMBLE (1 << 5) +#define IWN_RXON_NODIVERSITY (1 << 7) +#define IWN_RXON_ANTENNA_A (1 << 8) +#define IWN_RXON_ANTENNA_B (1 << 9) +#define IWN_RXON_TSF (1 << 15) +#define IWN_RXON_CTS_TO_SELF (1 << 30) + uint32_t filter; -#define IWN_FILTER_PROMISC (1 << 0) /* pass all data frames */ -#define IWN_FILTER_CTL (1 << 1) /* pass ctl+mgt frames */ -#define IWN_FILTER_MULTICAST (1 << 2) /* pass multi-cast frames */ -#define IWN_FILTER_NODECRYPT (1 << 3) /* pass unicast undecrypted */ -#define IWN_FILTER_BSS (1 << 5) /* station is associated */ -#define IWN_FILTER_ALLBEACONS (1 << 6) /* pass overlapping bss beacons - (must be associated) */ - uint16_t chan; /* IEEE channel # of control/primary */ - uint8_t ht_single_mask; /* single-stream basic rates */ - uint8_t ht_dual_mask; /* dual-stream basic rates */ +#define IWN_FILTER_PROMISC (1 << 0) +#define IWN_FILTER_CTL (1 << 1) +#define IWN_FILTER_MULTICAST (1 << 2) +#define IWN_FILTER_NODECRYPT (1 << 3) +#define IWN_FILTER_BSS (1 << 5) +#define IWN_FILTER_BEACON (1 << 6) + + uint8_t chan; + uint8_t reserved4; + uint8_t ht_single_mask; + uint8_t ht_dual_mask; + /* The following fields are for >=5000 Series only. */ + uint8_t ht_triple_mask; + uint8_t reserved5; + uint16_t acquisition; + uint16_t reserved6; } __packed; -/* structure for command IWN_CMD_ASSOCIATE */ +#define IWN4965_RXONSZ (sizeof (struct iwn_rxon) - 6) +#define IWN5000_RXONSZ (sizeof (struct iwn_rxon)) + +/* Structure for command IWN_CMD_ASSOCIATE. */ struct iwn_assoc { uint32_t flags; uint32_t filter; @@ -343,7 +520,7 @@ struct iwn_assoc { uint16_t reserved; } __packed; -/* structure for command IWN_CMD_EDCA_PARAMS */ +/* Structure for command IWN_CMD_EDCA_PARAMS. */ struct iwn_edca_params { uint32_t flags; #define IWN_EDCA_UPDATE (1 << 0) @@ -355,11 +532,11 @@ struct iwn_edca_params { uint8_t aifsn; uint8_t reserved; uint16_t txoplimit; - } __packed ac[EDCA_NUM_AC]; + } __packed ac[WME_NUM_AC]; } __packed; -/* structure for command IWN_CMD_TSF */ -struct iwn_cmd_tsf { +/* Structure for command IWN_CMD_TIMING. */ +struct iwn_cmd_timing { uint64_t tstamp; uint16_t bintval; uint16_t atim; @@ -368,66 +545,110 @@ struct iwn_cmd_tsf { uint16_t reserved; } __packed; -/* structure for command IWN_CMD_ADD_NODE */ +/* Structure for command IWN_CMD_ADD_NODE. */ struct iwn_node_info { uint8_t control; #define IWN_NODE_UPDATE (1 << 0) + uint8_t reserved1[3]; + uint8_t macaddr[IEEE80211_ADDR_LEN]; uint16_t reserved2; uint8_t id; #define IWN_ID_BSS 0 -#define IWN_ID_BROADCAST 31 +#define IWN5000_ID_BROADCAST 15 +#define IWN4965_ID_BROADCAST 31 + uint8_t flags; -#define IWN_FLAG_SET_KEY (1 << 0) +#define IWN_FLAG_SET_KEY (1 << 0) +#define IWN_FLAG_SET_DISABLE_TID (1 << 1) +#define IWN_FLAG_SET_TXRATE (1 << 2) +#define IWN_FLAG_SET_ADDBA (1 << 3) +#define IWN_FLAG_SET_DELBA (1 << 4) + uint16_t reserved3; - uint16_t security; + uint16_t kflags; +#define IWN_KFLAG_CCMP (1 << 1) +#define IWN_KFLAG_MAP (1 << 3) +#define IWN_KFLAG_KID(kid) ((kid) << 8) +#define IWN_KFLAG_INVALID (1 << 11) +#define IWN_KFLAG_GROUP (1 << 14) + uint8_t tsc2; /* TKIP TSC2 */ uint8_t reserved4; uint16_t ttak[5]; - uint16_t reserved5; - uint8_t key[IEEE80211_KEYBUF_SIZE]; + uint8_t kid; + uint8_t reserved5; + uint8_t key[16]; + /* The following 3 fields are for 5000 Series only. */ + uint64_t tsc; + uint8_t rxmic[8]; + uint8_t txmic[8]; + uint32_t htflags; -#define IWN_MAXRXAMPDU_S 19 -#define IWN_MPDUDENSITY_S 23 +#define IWN_AMDPU_SIZE_FACTOR(x) ((x) << 19) +#define IWN_AMDPU_DENSITY(x) ((x) << 23) + uint32_t mask; - uint16_t tid; - uint8_t rate; /* legacy rate/MCS */ -#define IWN_RATE_MCS 0x08 /* or'd to indicate MCS */ - uint8_t rflags; -#define IWN_RFLAG_HT (1 << 0) /* use HT modulation */ -#define IWN_RFLAG_CCK (1 << 1) /* use CCK modulation */ -#define IWN_RFLAG_HT40 (1 << 3) /* use dual-stream */ -#define IWN_RFLAG_SGI (1 << 5) /* use short GI */ -#define IWN_RFLAG_ANT_A (1 << 6) /* start on antenna port A */ -#define IWN_RFLAG_ANT_B (1 << 7) /* start on antenna port B */ - uint8_t add_imm; - uint8_t del_imm; - uint16_t add_imm_start; - uint32_t reserved6; + uint16_t disable_tid; + uint16_t reserved6; + uint8_t addba_tid; + uint8_t delba_tid; + uint16_t addba_ssn; + uint32_t reserved7; } __packed; -/* structure for command IWN_CMD_TX_DATA */ +struct iwn4965_node_info { + uint8_t control; + uint8_t reserved1[3]; + uint8_t macaddr[IEEE80211_ADDR_LEN]; + uint16_t reserved2; + uint8_t id; + uint8_t flags; + uint16_t reserved3; + uint16_t kflags; + uint8_t tsc2; /* TKIP TSC2 */ + uint8_t reserved4; + uint16_t ttak[5]; + uint8_t kid; + uint8_t reserved5; + uint8_t key[16]; + uint32_t htflags; + uint32_t mask; + uint16_t disable_tid; + uint16_t reserved6; + uint8_t addba_tid; + uint8_t delba_tid; + uint16_t addba_ssn; + uint32_t reserved7; +} __packed; + +#define IWN_RFLAG_CCK (1 << 1) +#define IWN_RFLAG_ANT(x) ((x) << 6) + +/* Structure for command IWN_CMD_TX_DATA. */ struct iwn_cmd_data { uint16_t len; uint16_t lnext; uint32_t flags; +#define IWN_TX_NEED_PROTECTION (1 << 0) /* 5000 only */ #define IWN_TX_NEED_RTS (1 << 1) #define IWN_TX_NEED_CTS (1 << 2) #define IWN_TX_NEED_ACK (1 << 3) -#define IWN_TX_USE_NODE_RATE (1 << 4) +#define IWN_TX_LINKQ (1 << 4) +#define IWN_TX_IMM_BA (1 << 6) #define IWN_TX_FULL_TXOP (1 << 7) #define IWN_TX_BT_DISABLE (1 << 12) /* bluetooth coexistence */ #define IWN_TX_AUTO_SEQ (1 << 13) +#define IWN_TX_MORE_FRAG (1 << 14) #define IWN_TX_INSERT_TSTAMP (1 << 16) #define IWN_TX_NEED_PADDING (1 << 20) - uint8_t ntries; - uint8_t bluetooth; - uint16_t reserved1; - uint8_t rate; + uint32_t scratch; + uint8_t plcp; uint8_t rflags; uint16_t xrflags; + uint8_t id; uint8_t security; #define IWN_CIPHER_WEP40 1 @@ -435,9 +656,9 @@ struct iwn_cmd_data { #define IWN_CIPHER_TKIP 3 #define IWN_CIPHER_WEP104 9 - uint8_t ridx; + uint8_t linkq; uint8_t reserved2; - uint8_t key[IEEE80211_KEYBUF_SIZE]; + uint8_t key[16]; uint16_t fnext; uint16_t reserved3; uint32_t lifetime; @@ -452,34 +673,30 @@ struct iwn_cmd_data { uint16_t txop; } __packed; -/* structure for command IWN_CMD_TX_LINK_QUALITY */ +/* Structure for command IWN_CMD_LINK_QUALITY. */ #define IWN_MAX_TX_RETRIES 16 struct iwn_cmd_link_quality { uint8_t id; uint8_t reserved1; uint16_t ctl; uint8_t flags; - uint8_t mimo; /* MIMO delimiter */ - uint8_t ssmask; /* single stream antenna mask */ - uint8_t dsmask; /* dual stream antenna mask */ - uint8_t ridx[EDCA_NUM_AC];/* starting rate index */ - uint16_t ampdu_limit; /* tx aggregation time limit */ - uint8_t ampdu_disable; - uint8_t ampdu_max; /* frame count limit */ + uint8_t mimo; + uint8_t antmsk_1stream; + uint8_t antmsk_2stream; + uint8_t ridx[WME_NUM_AC]; + uint16_t ampdu_limit; + uint8_t ampdu_threshold; + uint8_t ampdu_max; uint32_t reserved2; struct { - uint8_t rate; -#define IWN_RATE_CCK1 0 -#define IWN_RATE_CCK11 3 -#define IWN_RATE_OFDM6 4 -#define IWN_RATE_OFDM54 11 + uint8_t plcp; uint8_t rflags; uint16_t xrflags; - } table[IWN_MAX_TX_RETRIES]; + } __packed retry[IWN_MAX_TX_RETRIES]; uint32_t reserved3; } __packed; -/* structure for command IWN_CMD_SET_LED */ +/* Structure for command IWN_CMD_SET_LED. */ struct iwn_cmd_led { uint32_t unit; /* multiplier (in usecs) */ uint8_t which; @@ -491,20 +708,61 @@ struct iwn_cmd_led { uint8_t reserved; } __packed; -/* structure for command IWN_CMD_SET_POWER_MODE */ -struct iwn_power { - uint16_t flags; -#define IWN_POWER_CAM 0 /* constantly awake mode */ +/* Structure for command IWN5000_CMD_WIMAX_COEX. */ +struct iwn5000_wimax_coex { + uint32_t flags; +#define IWN_WIMAX_COEX_STA_TABLE_VALID (1 << 0) +#define IWN_WIMAX_COEX_UNASSOC_WA_UNMASK (1 << 2) +#define IWN_WIMAX_COEX_ASSOC_WA_UNMASK (1 << 3) +#define IWN_WIMAX_COEX_ENABLE (1 << 7) - uint8_t alive; + struct iwn5000_wimax_event { + uint8_t request; + uint8_t window; + uint8_t reserved; + uint8_t flags; + } __packed events[16]; +} __packed; + +/* Structures for command IWN5000_CMD_CALIB_CONFIG. */ +struct iwn5000_calib_elem { + uint32_t enable; + uint32_t start; + uint32_t send; + uint32_t apply; + uint32_t reserved; +} __packed; + +struct iwn5000_calib_status { + struct iwn5000_calib_elem once; + struct iwn5000_calib_elem perd; + uint32_t flags; +} __packed; + +struct iwn5000_calib_config { + struct iwn5000_calib_status ucode; + struct iwn5000_calib_status driver; + uint32_t reserved; +} __packed; + +/* Structure for command IWN_CMD_SET_POWER_MODE. */ +struct iwn_pmgt_cmd { + uint16_t flags; +#define IWN_PS_ALLOW_SLEEP (1 << 0) +#define IWN_PS_NOTIFY (1 << 1) +#define IWN_PS_SLEEP_OVER_DTIM (1 << 2) +#define IWN_PS_PCI_PMGT (1 << 3) +#define IWN_PS_FAST_PD (1 << 4) + + uint8_t keepalive; uint8_t debug; - uint32_t rx_timeout; - uint32_t tx_timeout; - uint32_t sleep[5]; + uint32_t rxtimeout; + uint32_t txtimeout; + uint32_t intval[5]; uint32_t beacons; } __packed; -/* structures for command IWN_CMD_SCAN */ +/* Structures for command IWN_CMD_SCAN. */ struct iwn_scan_essid { uint8_t id; uint8_t len; @@ -515,8 +773,8 @@ struct iwn_scan_hdr { uint16_t len; uint8_t reserved1; uint8_t nchan; - uint16_t quiet; - uint16_t plcp_threshold; + uint16_t quiet_time; + uint16_t quiet_threshold; uint16_t crc_threshold; uint16_t rxchain; uint32_t max_svc; /* background scans */ @@ -524,59 +782,84 @@ struct iwn_scan_hdr { uint32_t flags; uint32_t filter; - /* followed by a struct iwn_cmd_data */ - /* followed by an array of 4x struct iwn_scan_essid */ - /* followed by probe request body */ - /* followed by nchan x struct iwn_scan_chan */ + /* Followed by a struct iwn_cmd_data. */ + /* Followed by an array of 20 structs iwn_scan_essid. */ + /* Followed by probe request body. */ + /* Followed by an array of ``nchan'' structs iwn_scan_chan. */ } __packed; struct iwn_scan_chan { - uint8_t flags; -#define IWN_CHAN_ACTIVE (1 << 0) -#define IWN_CHAN_DIRECT (1 << 1) + uint32_t flags; +#define IWN_CHAN_ACTIVE (1 << 0) +#define IWN_CHAN_NPBREQS(x) (((1 << (x)) - 1) << 1) - uint8_t chan; + uint16_t chan; uint8_t rf_gain; uint8_t dsp_gain; uint16_t active; /* msecs */ uint16_t passive; /* msecs */ } __packed; -/* structure for command IWN_CMD_TXPOWER */ +/* Maximum size of a scan command. */ +#define IWN_SCAN_MAXSZ (MCLBYTES - 4) + +/* Structure for command IWN_CMD_TXPOWER (4965AGN only.) */ #define IWN_RIDX_MAX 32 -struct iwn_cmd_txpower { - uint8_t band; - uint8_t reserved1; - uint8_t chan; - uint8_t reserved2; +struct iwn4965_cmd_txpower { + uint8_t band; + uint8_t reserved1; + uint8_t chan; + uint8_t reserved2; struct { - uint8_t rf_gain[IWN_NTXCHAINS]; - uint8_t dsp_gain[IWN_NTXCHAINS]; - } power[IWN_RIDX_MAX + 1]; + uint8_t rf_gain[2]; + uint8_t dsp_gain[2]; + } __packed power[IWN_RIDX_MAX + 1]; } __packed; -/* structure for command IWN_CMD_BLUETOOTH */ +/* Structure for command IWN_CMD_TXPOWER_DBM (5000 Series only.) */ +struct iwn5000_cmd_txpower { + int8_t global_limit; /* in half-dBm */ +#define IWN5000_TXPOWER_AUTO 0x7f +#define IWN5000_TXPOWER_MAX_DBM 16 + + uint8_t flags; +#define IWN5000_TXPOWER_NO_CLOSED (1 << 6) + + int8_t srv_limit; /* in half-dBm */ + uint8_t reserved; +} __packed; + +/* Structure for command IWN_CMD_BLUETOOTH. */ struct iwn_bluetooth { uint8_t flags; - uint8_t lead; - uint8_t kill; +#define IWN_BT_COEX_DISABLE 0 +#define IWN_BT_COEX_MODE_2WIRE 1 +#define IWN_BT_COEX_MODE_3WIRE 2 +#define IWN_BT_COEX_MODE_4WIRE 3 + + uint8_t lead_time; +#define IWN_BT_LEAD_TIME_DEF 30 + + uint8_t max_kill; +#define IWN_BT_MAX_KILL_DEF 5 + uint8_t reserved; - uint32_t ack; - uint32_t cts; + uint32_t kill_ack; + uint32_t kill_cts; } __packed; -/* structure for command IWN_CMD_SET_CRITICAL_TEMP */ +/* Structure for command IWN_CMD_SET_CRITICAL_TEMP. */ struct iwn_critical_temp { uint32_t reserved; uint32_t tempM; uint32_t tempR; -/* degK <-> degC conversion macros */ +/* degK <-> degC conversion macros. */ #define IWN_CTOK(c) ((c) + 273) #define IWN_KTOC(k) ((k) - 273) #define IWN_CTOMUK(c) (((c) * 1000000) + 273150000) } __packed; -/* structure for command IWN_SENSITIVITY */ +/* Structure for command IWN_CMD_SET_SENSITIVITY. */ struct iwn_sensitivity_cmd { uint16_t which; #define IWN_SENSITIVITY_DEFAULTTBL 0 @@ -595,21 +878,74 @@ struct iwn_sensitivity_cmd { uint16_t energy_ofdm_th; } __packed; -/* structure for command IWN_PHY_CALIB */ -struct iwn_phy_calib_cmd { - uint8_t code; -#define IWN_SET_DIFF_GAIN 7 +/* Structures for command IWN_CMD_PHY_CALIB. */ +struct iwn_phy_calib { + uint8_t code; +#define IWN4965_PHY_CALIB_DIFF_GAIN 7 +#define IWN5000_PHY_CALIB_DC 8 +#define IWN5000_PHY_CALIB_LO 9 +#define IWN5000_PHY_CALIB_TX_IQ 11 +#define IWN5000_PHY_CALIB_CRYSTAL 15 +#define IWN5000_PHY_CALIB_BASE_BAND 16 +#define IWN5000_PHY_CALIB_TX_IQ_PERIODIC 17 +#define IWN5000_PHY_CALIB_RESET_NOISE_GAIN 18 +#define IWN5000_PHY_CALIB_NOISE_GAIN 19 - uint8_t flags; - uint16_t reserved1; - int8_t gain[3]; -#define IWN_GAIN_SET (1 << 2) - - uint8_t reserved2; + uint8_t group; + uint8_t ngroups; + uint8_t isvalid; } __packed; +struct iwn5000_phy_calib_crystal { + uint8_t code; + uint8_t group; + uint8_t ngroups; + uint8_t isvalid; -/* structure for IWN_UC_READY notification */ + uint8_t cap_pin[2]; + uint8_t reserved[2]; +} __packed; + +struct iwn_phy_calib_gain { + uint8_t code; + uint8_t group; + uint8_t ngroups; + uint8_t isvalid; + + int8_t gain[3]; + uint8_t reserved; +} __packed; + +/* Structure for command IWN_CMD_SPECTRUM_MEASUREMENT. */ +struct iwn_spectrum_cmd { + uint16_t len; + uint8_t token; + uint8_t id; + uint8_t origin; + uint8_t periodic; + uint16_t timeout; + uint32_t start; + uint32_t reserved1; + uint32_t flags; + uint32_t filter; + uint16_t nchan; + uint16_t reserved2; + struct { + uint32_t duration; + uint8_t chan; + uint8_t type; +#define IWN_MEASUREMENT_BASIC (1 << 0) +#define IWN_MEASUREMENT_CCA (1 << 1) +#define IWN_MEASUREMENT_RPI_HISTOGRAM (1 << 2) +#define IWN_MEASUREMENT_NOISE_HISTOGRAM (1 << 3) +#define IWN_MEASUREMENT_FRAME (1 << 4) +#define IWN_MEASUREMENT_IDLE (1 << 7) + + uint16_t reserved; + } __packed chan[10]; +} __packed; + +/* Structure for IWN_UC_READY notification. */ #define IWN_NATTEN_GROUPS 5 struct iwn_ucode_info { uint8_t minor; @@ -623,25 +959,33 @@ struct iwn_ucode_info { uint16_t reserved2; uint32_t logptr; - uint32_t errorptr; + uint32_t errptr; uint32_t tstamp; uint32_t valid; - /* the following fields are for UCODE_INIT only */ + /* The following fields are for UCODE_INIT only. */ int32_t volt; struct { int32_t chan20MHz; int32_t chan40MHz; } __packed temp[4]; - int32_t atten[IWN_NATTEN_GROUPS][IWN_NTXCHAINS]; + int32_t atten[IWN_NATTEN_GROUPS][2]; } __packed; -/* structure for IWN_TX_DONE notification */ -struct iwn_tx_stat { +/* Structures for IWN_TX_DONE notification. */ +#define IWN_TX_SUCCESS 0x00 +#define IWN_TX_FAIL 0x80 /* all failures have 0x80 set */ +#define IWN_TX_FAIL_SHORT_LIMIT 0x82 /* too many RTS retries */ +#define IWN_TX_FAIL_LONG_LIMIT 0x83 /* too many retries */ +#define IWN_TX_FAIL_FIFO_UNDERRRUN 0x84 /* tx fifo not kept running */ +#define IWN_TX_FAIL_DEST_IN_PS 0x88 /* sta found in power save */ +#define IWN_TX_FAIL_TX_LOCKED 0x90 /* waiting to see traffic */ + +struct iwn4965_tx_stat { uint8_t nframes; - uint8_t nkill; - uint8_t nrts; - uint8_t ntries; + uint8_t btkillcnt; + uint8_t rtsfailcnt; + uint8_t ackfailcnt; uint8_t rate; uint8_t rflags; uint16_t xrflags; @@ -649,16 +993,30 @@ struct iwn_tx_stat { uint16_t reserved; uint32_t power[2]; uint32_t status; -#define IWN_TX_SUCCESS 0x00 -#define IWN_TX_FAIL 0x80 /* all failures have 0x80 set */ -#define IWN_TX_FAIL_SHORT_LIMIT 0x82 /* too many RTS retries */ -#define IWN_TX_FAIL_LONG_LIMIT 0x83 /* too many retries */ -#define IWN_TX_FAIL_FIFO_UNDERRRUN 0x84 /* tx fifo not kept running */ -#define IWN_TX_FAIL_DEST_IN_PS 0x88 /* sta found in power save */ -#define IWN_TX_FAIL_TX_LOCKED 0x90 /* waiting to see traffic */ } __packed; -/* structure for IWN_BEACON_MISSED notification */ +struct iwn5000_tx_stat { + uint8_t nframes; + uint8_t btkillcnt; + uint8_t rtsfailcnt; + uint8_t ackfailcnt; + uint8_t rate; + uint8_t rflags; + uint16_t xrflags; + uint16_t duration; + uint16_t reserved; + uint32_t power[2]; + uint32_t info; + uint16_t seq; + uint16_t len; + uint8_t tlc; + uint8_t ratid; + uint8_t fc[2]; + uint16_t status; + uint16_t sequence; +} __packed; + +/* Structure for IWN_BEACON_MISSED notification. */ struct iwn_beacon_missed { uint32_t consecutive; uint32_t total; @@ -666,13 +1024,25 @@ struct iwn_beacon_missed { uint32_t received; } __packed; -/* structure for IWN_AMPDU_RX_DONE notification */ -struct iwn_rx_ampdu { +/* Structure for IWN_MPDU_RX_DONE notification. */ +struct iwn_rx_mpdu { uint16_t len; uint16_t reserved; } __packed; -/* structure for IWN_RX_DONE and IWN_AMPDU_RX_START notifications */ +/* Structures for IWN_RX_DONE and IWN_MPDU_RX_DONE notifications. */ +struct iwn4965_rx_phystat { + uint16_t antenna; + uint16_t agc; + uint8_t rssi[6]; +} __packed; + +struct iwn5000_rx_phystat { + uint32_t reserved1; + uint32_t agc; + uint16_t rssi[3]; +} __packed; + struct iwn_rx_stat { uint8_t phy_len; uint8_t cfg_phy_len; @@ -683,13 +1053,10 @@ struct iwn_rx_stat { uint64_t tstamp; uint32_t beacon; uint16_t flags; - uint16_t chan; - uint16_t antenna; - uint16_t agc; - uint8_t rssi[6]; -#define IWN_RSSI_TO_DBM 44 +#define IWN_STAT_FLAG_SHPREAMBLE (1 << 2) - uint8_t reserved2[22]; + uint16_t chan; + uint8_t phybuf[32]; uint8_t rate; uint8_t rflags; uint16_t xrflags; @@ -697,7 +1064,21 @@ struct iwn_rx_stat { uint16_t reserve3; } __packed; -/* structure for IWN_START_SCAN notification */ +#define IWN_RSSI_TO_DBM 44 + +/* Structure for IWN_RX_COMPRESSED_BA notification. */ +struct iwn_compressed_ba { + uint8_t macaddr[IEEE80211_ADDR_LEN]; + uint16_t reserved; + uint8_t id; + uint8_t tid; + uint16_t seq; + uint64_t bitmap; + uint16_t qid; + uint16_t ssn; +} __packed; + +/* Structure for IWN_START_SCAN notification. */ struct iwn_start_scan { uint64_t tstamp; uint32_t tbeacon; @@ -707,7 +1088,7 @@ struct iwn_start_scan { uint32_t status; } __packed; -/* structure for IWN_STOP_SCAN notification */ +/* Structure for IWN_STOP_SCAN notification. */ struct iwn_stop_scan { uint8_t nchan; uint8_t status; @@ -716,7 +1097,39 @@ struct iwn_stop_scan { uint64_t tsf; } __packed; -/* structure for IWN_{RX,BEACON}_STATISTICS notification */ +/* Structure for IWN_SPECTRUM_MEASUREMENT notification. */ +struct iwn_spectrum_notif { + uint8_t id; + uint8_t token; + uint8_t idx; + uint8_t state; +#define IWN_MEASUREMENT_START 0 +#define IWN_MEASUREMENT_STOP 1 + + uint32_t start; + uint8_t band; + uint8_t chan; + uint8_t type; + uint8_t reserved1; + uint32_t cca_ofdm; + uint32_t cca_cck; + uint32_t cca_time; + uint8_t basic; + uint8_t reserved2[3]; + uint32_t ofdm[8]; + uint32_t cck[8]; + uint32_t stop; + uint32_t status; +#define IWN_MEASUREMENT_OK 0 +#define IWN_MEASUREMENT_CONCURRENT 1 +#define IWN_MEASUREMENT_CSA_CONFLICT 2 +#define IWN_MEASUREMENT_TGH_CONFLICT 3 +#define IWN_MEASUREMENT_STOPPED 6 +#define IWN_MEASUREMENT_TIMEOUT 7 +#define IWN_MEASUREMENT_FAILED 8 +} __packed; + +/* Structures for IWN_{RX,BEACON}_STATISTICS notification. */ struct iwn_rx_phy_stats { uint32_t ina; uint32_t fina; @@ -833,77 +1246,183 @@ struct iwn_stats { } __packed; -/* firmware image header */ -struct iwn_firmware_hdr { - uint32_t version; - uint32_t main_textsz; - uint32_t main_datasz; - uint32_t init_textsz; - uint32_t init_datasz; - uint32_t boot_textsz; +/* Firmware error dump. */ +struct iwn_fw_dump { + uint32_t valid; + uint32_t id; + uint32_t pc; + uint32_t branch_link[2]; + uint32_t interrupt_link[2]; + uint32_t error_data[2]; + uint32_t src_line; + uint32_t tsf; + uint32_t time[2]; } __packed; -#define IWN_FW_MAIN_TEXT_MAXSZ (96 * 1024) -#define IWN_FW_MAIN_DATA_MAXSZ (40 * 1024) -#define IWN_FW_INIT_TEXT_MAXSZ (96 * 1024) -#define IWN_FW_INIT_DATA_MAXSZ (40 * 1024) +#define IWN4965_FW_TEXT_MAXSZ ( 96 * 1024) +#define IWN4965_FW_DATA_MAXSZ ( 40 * 1024) +#define IWN5000_FW_TEXT_MAXSZ (256 * 1024) +#define IWN5000_FW_DATA_MAXSZ ( 80 * 1024) #define IWN_FW_BOOT_TEXT_MAXSZ 1024 +#define IWN4965_FWSZ (IWN4965_FW_TEXT_MAXSZ + IWN4965_FW_DATA_MAXSZ) +#define IWN5000_FWSZ IWN5000_FW_TEXT_MAXSZ +#define IWN_FW_API(x) (((x) >> 8) & 0xff) /* * Offsets into EEPROM. */ #define IWN_EEPROM_MAC 0x015 -#define IWN_EEPROM_DOMAIN 0x060 -#define IWN_EEPROM_BAND1 0x063 -#define IWN_EEPROM_BAND2 0x072 -#define IWN_EEPROM_BAND3 0x080 -#define IWN_EEPROM_BAND4 0x08d -#define IWN_EEPROM_BAND5 0x099 -#define IWN_EEPROM_BAND6 0x0a0 -#define IWN_EEPROM_BAND7 0x0a8 -#define IWN_EEPROM_MAXPOW 0x0e8 -#define IWN_EEPROM_VOLTAGE 0x0e9 -#define IWN_EEPROM_BANDS 0x0ea +#define IWN_EEPROM_RFCFG 0x048 +#define IWN4965_EEPROM_DOMAIN 0x060 +#define IWN4965_EEPROM_BAND1 0x063 +#define IWN5000_EEPROM_REG 0x066 +#define IWN5000_EEPROM_CAL 0x067 +#define IWN4965_EEPROM_BAND2 0x072 +#define IWN4965_EEPROM_BAND3 0x080 +#define IWN4965_EEPROM_BAND4 0x08d +#define IWN4965_EEPROM_BAND5 0x099 +#define IWN4965_EEPROM_BAND6 0x0a0 +#define IWN4965_EEPROM_BAND7 0x0a8 +#define IWN4965_EEPROM_MAXPOW 0x0e8 +#define IWN4965_EEPROM_VOLTAGE 0x0e9 +#define IWN4965_EEPROM_BANDS 0x0ea +/* Indirect offsets. */ +#define IWN5000_EEPROM_DOMAIN 0x001 +#define IWN5000_EEPROM_BAND1 0x004 +#define IWN5000_EEPROM_BAND2 0x013 +#define IWN5000_EEPROM_BAND3 0x021 +#define IWN5000_EEPROM_BAND4 0x02e +#define IWN5000_EEPROM_BAND5 0x03a +#define IWN5000_EEPROM_BAND6 0x041 +#define IWN5000_EEPROM_BAND7 0x049 +#define IWN6000_EEPROM_ENHINFO 0x054 +#define IWN5000_EEPROM_CRYSTAL 0x128 +#define IWN5000_EEPROM_TEMP 0x12a +#define IWN5000_EEPROM_VOLT 0x12b + +/* Possible flags for IWN_EEPROM_RFCFG. */ +#define IWN_RFCFG_TYPE(x) (((x) >> 0) & 0x3) +#define IWN_RFCFG_STEP(x) (((x) >> 2) & 0x3) +#define IWN_RFCFG_DASH(x) (((x) >> 4) & 0x3) +#define IWN_RFCFG_TXANTMSK(x) (((x) >> 8) & 0xf) +#define IWN_RFCFG_RXANTMSK(x) (((x) >> 12) & 0xf) struct iwn_eeprom_chan { uint8_t flags; #define IWN_EEPROM_CHAN_VALID (1 << 0) -#define IWN_EEPROM_CHAN_IBSS (1 << 1) /* adhoc permitted */ -/* NB: bit 2 is reserved */ -#define IWN_EEPROM_CHAN_ACTIVE (1 << 3) /* active/passive scan */ -#define IWN_EEPROM_CHAN_RADAR (1 << 4) /* DFS required */ -#define IWN_EEPROM_CHAN_WIDE (1 << 5) /* HT40 */ -#define IWN_EEPROM_CHAN_NARROW (1 << 6) /* HT20 */ +#define IWN_EEPROM_CHAN_IBSS (1 << 1) +#define IWN_EEPROM_CHAN_ACTIVE (1 << 3) +#define IWN_EEPROM_CHAN_RADAR (1 << 4) int8_t maxpwr; } __packed; +struct iwn_eeprom_enhinfo { + uint16_t chan; + int8_t chain[3]; /* max power in half-dBm */ + uint8_t reserved; + int8_t mimo2; /* max power in half-dBm */ + int8_t mimo3; /* max power in half-dBm */ +} __packed; + #define IWN_NSAMPLES 3 -struct iwn_eeprom_chan_samples { +struct iwn4965_eeprom_chan_samples { uint8_t num; struct { uint8_t temp; uint8_t gain; uint8_t power; int8_t pa_det; - } samples[IWN_NTXCHAINS][IWN_NSAMPLES]; + } samples[2][IWN_NSAMPLES]; } __packed; #define IWN_NBANDS 8 -struct iwn_eeprom_band { +struct iwn4965_eeprom_band { uint8_t lo; /* low channel number */ uint8_t hi; /* high channel number */ - struct iwn_eeprom_chan_samples chans[2]; + struct iwn4965_eeprom_chan_samples chans[2]; } __packed; -#define IWN_MAX_PWR_INDEX 107 +/* + * Offsets of channels descriptions in EEPROM. + */ +static const uint32_t iwn4965_regulatory_bands[IWN_NBANDS] = { + IWN4965_EEPROM_BAND1, + IWN4965_EEPROM_BAND2, + IWN4965_EEPROM_BAND3, + IWN4965_EEPROM_BAND4, + IWN4965_EEPROM_BAND5, + IWN4965_EEPROM_BAND6, + IWN4965_EEPROM_BAND7 +}; + +static const uint32_t iwn5000_regulatory_bands[IWN_NBANDS] = { + IWN5000_EEPROM_BAND1, + IWN5000_EEPROM_BAND2, + IWN5000_EEPROM_BAND3, + IWN5000_EEPROM_BAND4, + IWN5000_EEPROM_BAND5, + IWN5000_EEPROM_BAND6, + IWN5000_EEPROM_BAND7 +}; + +#define IWN_CHAN_BANDS_COUNT 7 +#define IWN_MAX_CHAN_PER_BAND 14 +static const struct iwn_chan_band { + uint8_t nchan; + uint8_t chan[IWN_MAX_CHAN_PER_BAND]; +} iwn_bands[] = { + /* 20MHz channels, 2GHz band. */ + { 14, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } }, + /* 20MHz channels, 5GHz band. */ + { 13, { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } }, + { 12, { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } }, + { 11, { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } }, + { 6, { 145, 149, 153, 157, 161, 165 } }, + /* 40MHz channels (primary channels), 2GHz band. */ + { 7, { 1, 2, 3, 4, 5, 6, 7 } }, + /* 40MHz channels (primary channels), 5GHz band. */ + { 11, { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } } +}; + +#define IWN1000_OTP_NBLOCKS 3 +#define IWN6000_OTP_NBLOCKS 4 +#define IWN6050_OTP_NBLOCKS 7 + +/* HW rate indices. */ +#define IWN_RIDX_CCK1 0 +#define IWN_RIDX_CCK11 3 +#define IWN_RIDX_OFDM6 4 +#define IWN_RIDX_OFDM54 11 + +static const struct iwn_rate { + uint8_t rate; + uint8_t plcp; + uint8_t flags; +} iwn_rates[IWN_RIDX_MAX + 1] = { + { 2, 10, IWN_RFLAG_CCK }, + { 4, 20, IWN_RFLAG_CCK }, + { 11, 55, IWN_RFLAG_CCK }, + { 22, 110, IWN_RFLAG_CCK }, + { 12, 0xd, 0 }, + { 18, 0xf, 0 }, + { 24, 0x5, 0 }, + { 36, 0x7, 0 }, + { 48, 0x9, 0 }, + { 72, 0xb, 0 }, + { 96, 0x1, 0 }, + { 108, 0x3, 0 }, + { 120, 0x3, 0 } +}; + +#define IWN4965_MAX_PWR_INDEX 107 /* * RF Tx gain values from highest to lowest power (values obtained from * the reference driver.) */ -static const uint8_t iwn_rf_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = { +static const uint8_t iwn4965_rf_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = { 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35, @@ -916,7 +1435,7 @@ static const uint8_t iwn_rf_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static const uint8_t iwn_rf_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = { +static const uint8_t iwn4965_rf_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = { 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, @@ -933,7 +1452,7 @@ static const uint8_t iwn_rf_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = { * DSP pre-DAC gain values from highest to lowest power (values obtained * from the reference driver.) */ -static const uint8_t iwn_dsp_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = { +static const uint8_t iwn4965_dsp_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = { 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, @@ -946,7 +1465,7 @@ static const uint8_t iwn_dsp_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = { 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b }; -static const uint8_t iwn_dsp_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = { +static const uint8_t iwn4965_dsp_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = { 0x7b, 0x75, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, @@ -959,12 +1478,195 @@ static const uint8_t iwn_dsp_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = { 0x68, 0x62, 0x6e, 0x68, 0x62, 0x5d, 0x58, 0x53, 0x4e }; +/* + * Power saving settings (values obtained from the reference driver.) + */ +#define IWN_NDTIMRANGES 3 +#define IWN_NPOWERLEVELS 6 +static const struct iwn_pmgt { + uint32_t rxtimeout; + uint32_t txtimeout; + uint32_t intval[5]; + int skip_dtim; +} iwn_pmgt[IWN_NDTIMRANGES][IWN_NPOWERLEVELS] = { + /* DTIM <= 2 */ + { + { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ + { 200, 500, { 1, 2, 2, 2, -1 }, 0 }, /* PS level 1 */ + { 200, 300, { 1, 2, 2, 2, -1 }, 0 }, /* PS level 2 */ + { 50, 100, { 2, 2, 2, 2, -1 }, 0 }, /* PS level 3 */ + { 50, 25, { 2, 2, 4, 4, -1 }, 1 }, /* PS level 4 */ + { 25, 25, { 2, 2, 4, 6, -1 }, 2 } /* PS level 5 */ + }, + /* 3 <= DTIM <= 10 */ + { + { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ + { 200, 500, { 1, 2, 3, 4, 4 }, 0 }, /* PS level 1 */ + { 200, 300, { 1, 2, 3, 4, 7 }, 0 }, /* PS level 2 */ + { 50, 100, { 2, 4, 6, 7, 9 }, 0 }, /* PS level 3 */ + { 50, 25, { 2, 4, 6, 9, 10 }, 1 }, /* PS level 4 */ + { 25, 25, { 2, 4, 7, 10, 10 }, 2 } /* PS level 5 */ + }, + /* DTIM >= 11 */ + { + { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ + { 200, 500, { 1, 2, 3, 4, -1 }, 0 }, /* PS level 1 */ + { 200, 300, { 2, 4, 6, 7, -1 }, 0 }, /* PS level 2 */ + { 50, 100, { 2, 7, 9, 9, -1 }, 0 }, /* PS level 3 */ + { 50, 25, { 2, 7, 9, 9, -1 }, 0 }, /* PS level 4 */ + { 25, 25, { 4, 7, 10, 10, -1 }, 0 } /* PS level 5 */ + } +}; + +struct iwn_sensitivity_limits { + uint32_t min_ofdm_x1; + uint32_t max_ofdm_x1; + uint32_t min_ofdm_mrc_x1; + uint32_t max_ofdm_mrc_x1; + uint32_t min_ofdm_x4; + uint32_t max_ofdm_x4; + uint32_t min_ofdm_mrc_x4; + uint32_t max_ofdm_mrc_x4; + uint32_t min_cck_x4; + uint32_t max_cck_x4; + uint32_t min_cck_mrc_x4; + uint32_t max_cck_mrc_x4; + uint32_t min_energy_cck; + uint32_t energy_cck; + uint32_t energy_ofdm; +}; + +/* + * RX sensitivity limits (values obtained from the reference driver.) + */ +static const struct iwn_sensitivity_limits iwn4965_sensitivity_limits = { + 105, 140, + 220, 270, + 85, 120, + 170, 210, + 125, 200, + 200, 400, + 97, + 100, + 100 +}; + +static const struct iwn_sensitivity_limits iwn5000_sensitivity_limits = { + 120, 155, + 240, 290, + 90, 120, + 170, 210, + 125, 200, + 170, 400, + 95, + 95, + 95 +}; + +static const struct iwn_sensitivity_limits iwn5150_sensitivity_limits = { + 105, 105, /* min = max for performance bug in DSP. */ + 220, 220, /* min = max for performance bug in DSP. */ + 90, 120, + 170, 210, + 125, 200, + 170, 400, + 95, + 95, + 95 +}; + +static const struct iwn_sensitivity_limits iwn6000_sensitivity_limits = { + 105, 145, + 192, 232, + 80, 145, + 128, 232, + 125, 175, + 160, 310, + 97, + 97, + 100 +}; + +/* Map TID to TX scheduler's FIFO. */ +static const uint8_t iwn_tid2fifo[] = { + 1, 0, 0, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3 +}; + +/* WiFi/WiMAX coexist event priority table for 6050. */ +static const struct iwn5000_wimax_event iwn6050_wimax_events[] = { + { 0x04, 0x03, 0x00, 0x00 }, + { 0x04, 0x03, 0x00, 0x03 }, + { 0x04, 0x03, 0x00, 0x03 }, + { 0x04, 0x03, 0x00, 0x03 }, + { 0x04, 0x03, 0x00, 0x00 }, + { 0x04, 0x03, 0x00, 0x07 }, + { 0x04, 0x03, 0x00, 0x00 }, + { 0x04, 0x03, 0x00, 0x03 }, + { 0x04, 0x03, 0x00, 0x03 }, + { 0x04, 0x03, 0x00, 0x00 }, + { 0x06, 0x03, 0x00, 0x07 }, + { 0x04, 0x03, 0x00, 0x00 }, + { 0x06, 0x06, 0x00, 0x03 }, + { 0x04, 0x03, 0x00, 0x07 }, + { 0x04, 0x03, 0x00, 0x00 }, + { 0x04, 0x03, 0x00, 0x00 } +}; + +/* Firmware errors. */ +static const char * const iwn_fw_errmsg[] = { + "OK", + "FAIL", + "BAD_PARAM", + "BAD_CHECKSUM", + "NMI_INTERRUPT_WDG", + "SYSASSERT", + "FATAL_ERROR", + "BAD_COMMAND", + "HW_ERROR_TUNE_LOCK", + "HW_ERROR_TEMPERATURE", + "ILLEGAL_CHAN_FREQ", + "VCC_NOT_STABLE", + "FH_ERROR", + "NMI_INTERRUPT_HOST", + "NMI_INTERRUPT_ACTION_PT", + "NMI_INTERRUPT_UNKNOWN", + "UCODE_VERSION_MISMATCH", + "HW_ERROR_ABS_LOCK", + "HW_ERROR_CAL_LOCK_FAIL", + "NMI_INTERRUPT_INST_ACTION_PT", + "NMI_INTERRUPT_DATA_ACTION_PT", + "NMI_TRM_HW_ER", + "NMI_INTERRUPT_TRM", + "NMI_INTERRUPT_BREAKPOINT" + "DEBUG_0", + "DEBUG_1", + "DEBUG_2", + "DEBUG_3", + "UNKNOWN" +}; + +/* Find least significant bit that is set. */ +#define IWN_LSB(x) ((((x) - 1) & (x)) ^ (x)) + #define IWN_READ(sc, reg) \ bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) #define IWN_WRITE(sc, reg, val) \ bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) -#define IWN_WRITE_REGION_4(sc, offset, datap, count) \ - bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \ - (datap), (count)) +#define IWN_WRITE_1(sc, reg, val) \ + bus_space_write_1((sc)->sc_st, (sc)->sc_sh, (reg), (val)) + +#define IWN_SETBITS(sc, reg, mask) \ + IWN_WRITE(sc, reg, IWN_READ(sc, reg) | (mask)) + +#define IWN_CLRBITS(sc, reg, mask) \ + IWN_WRITE(sc, reg, IWN_READ(sc, reg) & ~(mask)) + +#define IWN_BARRIER_WRITE(sc) \ + bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \ + BUS_SPACE_BARRIER_WRITE) + +#define IWN_BARRIER_READ_WRITE(sc) \ + bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \ + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE) diff --git a/sys/dev/iwn/if_iwnvar.h b/sys/dev/iwn/if_iwnvar.h index 19cc0250b94c..98c9c9485533 100644 --- a/sys/dev/iwn/if_iwnvar.h +++ b/sys/dev/iwn/if_iwnvar.h @@ -1,6 +1,8 @@ /* $FreeBSD$ */ +/* $OpenBSD: if_iwnvar.h,v 1.16 2009/11/04 17:46:52 damien Exp $ */ + /*- - * Copyright (c) 2007 + * Copyright (c) 2007, 2008 * Damien Bergamini * Copyright (c) 2008 Sam Leffler, Errno Consulting * @@ -60,6 +62,8 @@ struct iwn_dma_info { struct iwn_tx_data { bus_dmamap_t map; + bus_addr_t cmd_paddr; + bus_addr_t scratch_paddr; struct mbuf *m; struct ieee80211_node *ni; }; @@ -76,14 +80,18 @@ struct iwn_tx_ring { int cur; }; +struct iwn_softc; + struct iwn_rx_data { - bus_dmamap_t map; - struct mbuf *m; + struct mbuf *m; + bus_dmamap_t map; }; struct iwn_rx_ring { struct iwn_dma_info desc_dma; + struct iwn_dma_info stat_dma; uint32_t *desc; + struct iwn_rx_status *stat; struct iwn_rx_data data[IWN_RX_RING_COUNT]; bus_dma_tag_t data_dmat; int cur; @@ -92,23 +100,26 @@ struct iwn_rx_ring { struct iwn_node { struct ieee80211_node ni; /* must be the first */ struct ieee80211_amrr_node amn; + uint16_t disable_tid; + uint8_t id; + uint8_t ridx[IEEE80211_RATE_MAXSIZE]; }; -#define IWN_NODE(_ni) ((struct iwn_node *)(_ni)) struct iwn_calib_state { uint8_t state; #define IWN_CALIB_STATE_INIT 0 #define IWN_CALIB_STATE_ASSOC 1 #define IWN_CALIB_STATE_RUN 2 + u_int nbeacons; uint32_t noise[3]; uint32_t rssi[3]; - uint32_t corr_ofdm_x1; - uint32_t corr_ofdm_mrc_x1; - uint32_t corr_ofdm_x4; - uint32_t corr_ofdm_mrc_x4; - uint32_t corr_cck_x4; - uint32_t corr_cck_mrc_x4; + uint32_t ofdm_x1; + uint32_t ofdm_mrc_x1; + uint32_t ofdm_x4; + uint32_t ofdm_mrc_x4; + uint32_t cck_x4; + uint32_t cck_mrc_x4; uint32_t bad_plcp_ofdm; uint32_t fa_ofdm; uint32_t bad_plcp_cck; @@ -118,6 +129,7 @@ struct iwn_calib_state { #define IWN_CCK_STATE_INIT 0 #define IWN_CCK_STATE_LOFA 1 #define IWN_CCK_STATE_HIFA 2 + uint8_t noise_samples[20]; u_int cur_noise_sample; uint8_t noise_ref; @@ -126,10 +138,64 @@ struct iwn_calib_state { uint32_t energy_cck; }; +struct iwn_calib_info { + uint8_t *buf; + u_int len; +}; + +struct iwn_fw_part { + const uint8_t *text; + uint32_t textsz; + const uint8_t *data; + uint32_t datasz; +}; + +struct iwn_fw_info { + u_char *data; + struct iwn_fw_part init; + struct iwn_fw_part main; + struct iwn_fw_part boot; +}; + +struct iwn_hal { + int (*load_firmware)(struct iwn_softc *); + void (*read_eeprom)(struct iwn_softc *); + int (*post_alive)(struct iwn_softc *); + int (*nic_config)(struct iwn_softc *); + void (*update_sched)(struct iwn_softc *, int, int, uint8_t, + uint16_t); + int (*get_temperature)(struct iwn_softc *); + int (*get_rssi)(struct iwn_softc *, struct iwn_rx_stat *); + int (*set_txpower)(struct iwn_softc *, + struct ieee80211_channel *, int); + int (*init_gains)(struct iwn_softc *); + int (*set_gains)(struct iwn_softc *); + int (*add_node)(struct iwn_softc *, struct iwn_node_info *, + int); + void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *, + struct iwn_rx_data *); +#if 0 /* HT */ + void (*ampdu_tx_start)(struct iwn_softc *, + struct ieee80211_node *, uint8_t, uint16_t); + void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t, + uint16_t); +#endif + int ntxqs; + int ndmachnls; + uint8_t broadcast_id; + int rxonsz; + int schedsz; + uint32_t fw_text_maxsz; + uint32_t fw_data_maxsz; + uint32_t fwsz; + bus_size_t sched_txfact_addr; +}; + struct iwn_vap { struct ieee80211vap iv_vap; struct ieee80211_amrr iv_amrr; struct callout iv_amrr_to; + uint8_t iv_ridx; int (*iv_newstate)(struct ieee80211vap *, enum ieee80211_state, int); @@ -139,67 +205,106 @@ struct iwn_vap { struct iwn_softc { struct ifnet *sc_ifp; int sc_debug; - struct callout sc_timer_to; /* calib+watchdog timer */ - int sc_tx_timer; /* tx watchdog timer/counter */ - const struct ieee80211_channel *sc_curchan; - struct iwn_rx_radiotap_header sc_rxtap; - struct iwn_tx_radiotap_header sc_txtap; - - /* locks */ + /* Locks */ struct mtx sc_mtx; - /* bus */ + /* Bus */ device_t sc_dev; int mem_rid; int irq_rid; struct resource *mem; struct resource *irq; - /* shared area */ - struct iwn_dma_info shared_dma; - struct iwn_shared *shared; + u_int sc_flags; +#define IWN_FLAG_HAS_5GHZ (1 << 0) +#define IWN_FLAG_HAS_OTPROM (1 << 1) +#define IWN_FLAG_CALIB_DONE (1 << 2) +#define IWN_FLAG_USE_ICT (1 << 3) +#define IWN_FLAG_INTERNAL_PA (1 << 4) - /* "keep warm" page */ + uint8_t hw_type; + const struct iwn_hal *sc_hal; + const char *fwname; + const struct iwn_sensitivity_limits + *limits; + + /* TX scheduler rings. */ + struct iwn_dma_info sched_dma; + uint16_t *sched; + uint32_t sched_base; + + /* "Keep Warm" page. */ struct iwn_dma_info kw_dma; - /* firmware image */ + /* Firmware image. */ const struct firmware *fw_fp; - /* firmware DMA transfer */ + /* Firmware DMA transfer. */ struct iwn_dma_info fw_dma; - /* rings */ - struct iwn_tx_ring txq[IWN_NTXQUEUES]; + /* ICT table. */ + struct iwn_dma_info ict_dma; + uint32_t *ict; + int ict_cur; + + /* TX/RX rings. */ + struct iwn_tx_ring txq[IWN5000_NTXQUEUES]; struct iwn_rx_ring rxq; bus_space_tag_t sc_st; bus_space_handle_t sc_sh; void *sc_ih; bus_size_t sc_sz; + int sc_cap_off; /* PCIe Capabilities. */ /* Tasks used by the driver */ struct task sc_reinit_task; struct task sc_radioon_task; struct task sc_radiooff_task; - /* Thermal calibration */ int calib_cnt; struct iwn_calib_state calib; + struct iwn_fw_info fw; + struct iwn_calib_info calibcmd[5]; + uint32_t errptr; + struct iwn_rx_stat last_rx_stat; int last_rx_valid; struct iwn_ucode_info ucode_info; - struct iwn_config config; + struct iwn_rxon rxon; uint32_t rawtemp; int temp; int noise; - uint8_t antmsk; + uint32_t qfullmsk; - struct iwn_eeprom_band bands[IWN_NBANDS]; + uint32_t prom_base; + struct iwn4965_eeprom_band + bands[IWN_NBANDS]; + struct iwn_eeprom_chan eeprom_channels[IWN_NBANDS][IWN_MAX_CHAN_PER_BAND]; + uint16_t rfcfg; + char eeprom_domain[4]; + uint32_t eeprom_crystal; int16_t eeprom_voltage; int8_t maxpwr2GHz; int8_t maxpwr5GHz; + int8_t maxpwr[IEEE80211_CHAN_MAX]; + int8_t enh_maxpwr[35]; + + int32_t temp_off; + uint32_t int_mask; + uint8_t ntxchains; + uint8_t nrxchains; + uint8_t txchainmask; + uint8_t rxchainmask; + uint8_t chainmask; + + struct callout sc_timer_to; + int sc_tx_timer; + + struct iwn_rx_radiotap_header sc_rxtap; + struct iwn_tx_radiotap_header sc_txtap; }; #define IWN_LOCK_INIT(_sc) \ diff --git a/sys/dev/ixgb/if_ixgb.c b/sys/dev/ixgb/if_ixgb.c index 90b3c91cf7f7..990f791dfbd6 100644 --- a/sys/dev/ixgb/if_ixgb.c +++ b/sys/dev/ixgb/if_ixgb.c @@ -97,7 +97,7 @@ static void ixgb_intr(void *); static void ixgb_start(struct ifnet *); static void ixgb_start_locked(struct ifnet *); static int ixgb_ioctl(struct ifnet *, IOCTL_CMD_TYPE, caddr_t); -static void ixgb_watchdog(struct ifnet *); +static void ixgb_watchdog(struct adapter *); static void ixgb_init(void *); static void ixgb_init_locked(struct adapter *); static void ixgb_stop(void *); @@ -249,18 +249,17 @@ ixgb_attach(device_t dev) int tsize, rsize; int error = 0; - printf("ixgb%d: %s\n", device_get_unit(dev), ixgb_copyright); + device_printf(dev, "%s\n", ixgb_copyright); INIT_DEBUGOUT("ixgb_attach: begin"); /* Allocate, clear, and link in our adapter structure */ if (!(adapter = device_get_softc(dev))) { - printf("ixgb: adapter structure allocation failed\n"); + device_printf(dev, "adapter structure allocation failed\n"); return (ENOMEM); } bzero(adapter, sizeof(struct adapter)); adapter->dev = dev; adapter->osdep.dev = dev; - adapter->unit = device_get_unit(dev); IXGB_LOCK_INIT(adapter, device_get_nameunit(dev)); if (ixgb_adapter_list != NULL) @@ -275,7 +274,7 @@ ixgb_attach(device_t dev) (void *)adapter, 0, ixgb_sysctl_stats, "I", "Statistics"); - callout_init(&adapter->timer, CALLOUT_MPSAFE); + callout_init_mtx(&adapter->timer, &adapter->mtx, 0); /* Determine hardware revision */ ixgb_identify_hardware(adapter); @@ -299,8 +298,7 @@ ixgb_attach(device_t dev) ETHERMTU + ETHER_HDR_LEN + ETHER_CRC_LEN; if (ixgb_allocate_pci_resources(adapter)) { - printf("ixgb%d: Allocation of PCI resources failed\n", - adapter->unit); + device_printf(dev, "Allocation of PCI resources failed\n"); error = ENXIO; goto err_pci; } @@ -309,8 +307,7 @@ ixgb_attach(device_t dev) /* Allocate Transmit Descriptor ring */ if (ixgb_dma_malloc(adapter, tsize, &adapter->txdma, BUS_DMA_NOWAIT)) { - printf("ixgb%d: Unable to allocate TxDescriptor memory\n", - adapter->unit); + device_printf(dev, "Unable to allocate TxDescriptor memory\n"); error = ENOMEM; goto err_tx_desc; } @@ -321,8 +318,7 @@ ixgb_attach(device_t dev) /* Allocate Receive Descriptor ring */ if (ixgb_dma_malloc(adapter, rsize, &adapter->rxdma, BUS_DMA_NOWAIT)) { - printf("ixgb%d: Unable to allocate rx_desc memory\n", - adapter->unit); + device_printf(dev, "Unable to allocate rx_desc memory\n"); error = ENOMEM; goto err_rx_desc; } @@ -330,8 +326,7 @@ ixgb_attach(device_t dev) /* Initialize the hardware */ if (ixgb_hardware_init(adapter)) { - printf("ixgb%d: Unable to initialize the hardware\n", - adapter->unit); + device_printf(dev, "Unable to initialize the hardware\n"); error = EIO; goto err_hw_init; } @@ -387,13 +382,14 @@ ixgb_detach(device_t dev) IXGB_UNLOCK(adapter); #if __FreeBSD_version < 500000 - ether_ifdetach(adapter->ifp, ETHER_BPF_SUPPORTED); + ether_ifdetach(ifp, ETHER_BPF_SUPPORTED); #else - ether_ifdetach(adapter->ifp); + ether_ifdetach(ifp); #endif + callout_drain(&adapter->timer); ixgb_free_pci_resources(adapter); #if __FreeBSD_version >= 500000 - if_free(adapter->ifp); + if_free(ifp); #endif /* Free Transmit Descriptor ring */ @@ -414,9 +410,6 @@ ixgb_detach(device_t dev) if (adapter->prev != NULL) adapter->prev->next = adapter->next; - ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - ifp->if_timer = 0; - IXGB_LOCK_DESTROY(adapter); return (0); } @@ -478,7 +471,7 @@ ixgb_start_locked(struct ifnet * ifp) ETHER_BPF_MTAP(ifp, m_head); #endif /* Set timeout in case hardware has problems transmitting */ - ifp->if_timer = IXGB_TX_TIMEOUT; + adapter->tx_timer = IXGB_TX_TIMEOUT; } return; @@ -615,26 +608,24 @@ out: **********************************************************************/ static void -ixgb_watchdog(struct ifnet * ifp) +ixgb_watchdog(struct adapter *adapter) { - struct adapter *adapter; - adapter = ifp->if_softc; + struct ifnet *ifp; + + ifp = adapter->ifp; /* * If we are in this routine because of pause frames, then don't * reset the hardware. */ if (IXGB_READ_REG(&adapter->hw, STATUS) & IXGB_STATUS_TXOFF) { - ifp->if_timer = IXGB_TX_TIMEOUT; + adapter->tx_timer = IXGB_TX_TIMEOUT; return; } - printf("ixgb%d: watchdog timeout -- resetting\n", adapter->unit); - - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - + if_printf(ifp, "watchdog timeout -- resetting\n"); ixgb_stop(adapter); - ixgb_init(adapter); + ixgb_init_locked(adapter); ifp->if_oerrors++; @@ -663,23 +654,22 @@ ixgb_init_locked(struct adapter *adapter) IXGB_LOCK_ASSERT(adapter); ixgb_stop(adapter); + ifp = adapter->ifp; /* Get the latest mac address, User can use a LAA */ - bcopy(IF_LLADDR(adapter->ifp), adapter->hw.curr_mac_addr, - IXGB_ETH_LENGTH_OF_ADDRESS); + bcopy(IF_LLADDR(ifp), adapter->hw.curr_mac_addr, + IXGB_ETH_LENGTH_OF_ADDRESS); /* Initialize the hardware */ if (ixgb_hardware_init(adapter)) { - printf("ixgb%d: Unable to initialize the hardware\n", - adapter->unit); + if_printf(ifp, "Unable to initialize the hardware\n"); return; } ixgb_enable_vlans(adapter); /* Prepare transmit descriptors and buffers */ if (ixgb_setup_transmit_structures(adapter)) { - printf("ixgb%d: Could not setup transmit structures\n", - adapter->unit); + if_printf(ifp, "Could not setup transmit structures\n"); ixgb_stop(adapter); return; } @@ -690,8 +680,7 @@ ixgb_init_locked(struct adapter *adapter) /* Prepare receive descriptors and buffers */ if (ixgb_setup_receive_structures(adapter)) { - printf("ixgb%d: Could not setup receive structures\n", - adapter->unit); + if_printf(ifp, "Could not setup receive structures\n"); ixgb_stop(adapter); return; } @@ -720,7 +709,7 @@ ixgb_init_locked(struct adapter *adapter) temp_reg |= IXGB_CTRL0_JFE; IXGB_WRITE_REG(&adapter->hw, CTRL0, temp_reg); } - callout_reset(&adapter->timer, 2 * hz, ixgb_local_timer, adapter); + callout_reset(&adapter->timer, hz, ixgb_local_timer, adapter); ixgb_clear_hw_cntrs(&adapter->hw); #ifdef DEVICE_POLLING /* @@ -760,11 +749,8 @@ ixgb_poll_locked(struct ifnet * ifp, enum poll_cmd cmd, int count) if (cmd == POLL_AND_CHECK_STATUS) { reg_icr = IXGB_READ_REG(&adapter->hw, ICR); if (reg_icr & (IXGB_INT_RXSEQ | IXGB_INT_LSC)) { - callout_stop(&adapter->timer); ixgb_check_for_link(&adapter->hw); ixgb_print_link_status(adapter); - callout_reset(&adapter->timer, 2 * hz, ixgb_local_timer, - adapter); } } rx_npkts = ixgb_process_receive_interrupts(adapter, count); @@ -837,11 +823,8 @@ ixgb_intr(void *arg) /* Link status change */ if (reg_icr & (IXGB_INT_RXSEQ | IXGB_INT_LSC)) { - callout_stop(&adapter->timer); ixgb_check_for_link(&adapter->hw); ixgb_print_link_status(adapter); - callout_reset(&adapter->timer, 2 * hz, ixgb_local_timer, - adapter); } while (loop_cnt > 0) { if (ifp->if_drv_flags & IFF_DRV_RUNNING) { @@ -959,8 +942,8 @@ ixgb_encap(struct adapter * adapter, struct mbuf * m_head) &nsegs, BUS_DMA_NOWAIT); if (error != 0) { adapter->no_tx_dma_setup++; - printf("ixgb%d: ixgb_encap: bus_dmamap_load_mbuf failed; " - "error %u\n", adapter->unit, error); + if_printf(ifp, "ixgb_encap: bus_dmamap_load_mbuf failed; " + "error %u\n", error); bus_dmamap_destroy(adapter->txtag, map); return (error); } @@ -1130,7 +1113,7 @@ ixgb_local_timer(void *arg) struct adapter *adapter = arg; ifp = adapter->ifp; - IXGB_LOCK(adapter); + IXGB_LOCK_ASSERT(adapter); ixgb_check_for_link(&adapter->hw); ixgb_print_link_status(adapter); @@ -1138,10 +1121,9 @@ ixgb_local_timer(void *arg) if (ixgb_display_debug_stats && ifp->if_drv_flags & IFF_DRV_RUNNING) { ixgb_print_hw_stats(adapter); } - callout_reset(&adapter->timer, 2 * hz, ixgb_local_timer, adapter); - - IXGB_UNLOCK(adapter); - return; + if (adapter->tx_timer != 0 && --adapter->tx_timer == 0) + ixgb_watchdog(adapter); + callout_reset(&adapter->timer, hz, ixgb_local_timer, adapter); } static void @@ -1149,15 +1131,14 @@ ixgb_print_link_status(struct adapter * adapter) { if (adapter->hw.link_up) { if (!adapter->link_active) { - printf("ixgb%d: Link is up %d Mbps %s \n", - adapter->unit, + if_printf(adapter->ifp, "Link is up %d Mbps %s \n", 10000, "Full Duplex"); adapter->link_active = 1; } } else { if (adapter->link_active) { - printf("ixgb%d: Link is Down \n", adapter->unit); + if_printf(adapter->ifp, "Link is Down \n"); adapter->link_active = 0; } } @@ -1191,9 +1172,9 @@ ixgb_stop(void *arg) ixgb_free_transmit_structures(adapter); ixgb_free_receive_structures(adapter); - /* Tell the stack that the interface is no longer active */ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + adapter->tx_timer = 0; return; } @@ -1213,8 +1194,8 @@ ixgb_identify_hardware(struct adapter * adapter) adapter->hw.pci_cmd_word = pci_read_config(dev, PCIR_COMMAND, 2); if (!((adapter->hw.pci_cmd_word & PCIM_CMD_BUSMASTEREN) && (adapter->hw.pci_cmd_word & PCIM_CMD_MEMEN))) { - printf("ixgb%d: Memory Access and/or Bus Master bits were not set!\n", - adapter->unit); + device_printf(dev, + "Memory Access and/or Bus Master bits were not set!\n"); adapter->hw.pci_cmd_word |= (PCIM_CMD_BUSMASTEREN | PCIM_CMD_MEMEN); pci_write_config(dev, PCIR_COMMAND, adapter->hw.pci_cmd_word, 2); @@ -1234,7 +1215,8 @@ ixgb_identify_hardware(struct adapter * adapter) break; default: INIT_DEBUGOUT1("Unknown device if 0x%x", adapter->hw.device_id); - printf("ixgb%d: unsupported device id 0x%x\n", adapter->unit, adapter->hw.device_id); + device_printf(dev, "unsupported device id 0x%x\n", + adapter->hw.device_id); } return; @@ -1251,8 +1233,7 @@ ixgb_allocate_pci_resources(struct adapter * adapter) &rid, 0, ~0, 1, RF_ACTIVE); if (!(adapter->res_memory)) { - printf("ixgb%d: Unable to allocate bus resource: memory\n", - adapter->unit); + device_printf(dev, "Unable to allocate bus resource: memory\n"); return (ENXIO); } adapter->osdep.mem_bus_space_tag = @@ -1266,16 +1247,15 @@ ixgb_allocate_pci_resources(struct adapter * adapter) &rid, 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE); if (!(adapter->res_interrupt)) { - printf("ixgb%d: Unable to allocate bus resource: interrupt\n", - adapter->unit); + device_printf(dev, + "Unable to allocate bus resource: interrupt\n"); return (ENXIO); } if (bus_setup_intr(dev, adapter->res_interrupt, INTR_TYPE_NET | INTR_MPSAFE, NULL, (void (*) (void *))ixgb_intr, adapter, &adapter->int_handler_tag)) { - printf("ixgb%d: Error registering interrupt handler!\n", - adapter->unit); + device_printf(dev, "Error registering interrupt handler!\n"); return (ENXIO); } adapter->hw.back = &adapter->osdep; @@ -1322,13 +1302,12 @@ ixgb_hardware_init(struct adapter * adapter) /* Make sure we have a good EEPROM before we read from it */ if (!ixgb_validate_eeprom_checksum(&adapter->hw)) { - printf("ixgb%d: The EEPROM Checksum Is Not Valid\n", - adapter->unit); + device_printf(adapter->dev, + "The EEPROM Checksum Is Not Valid\n"); return (EIO); } if (!ixgb_init_hw(&adapter->hw)) { - printf("ixgb%d: Hardware Initialization Failed", - adapter->unit); + device_printf(adapter->dev, "Hardware Initialization Failed"); return (EIO); } @@ -1352,7 +1331,7 @@ ixgb_setup_interface(device_t dev, struct adapter * adapter) #if __FreeBSD_version >= 502000 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); #else - ifp->if_unit = adapter->unit; + ifp->if_unit = device_get_unit(dev); ifp->if_name = "ixgb"; #endif ifp->if_mtu = ETHERMTU; @@ -1362,7 +1341,6 @@ ixgb_setup_interface(device_t dev, struct adapter * adapter) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = ixgb_ioctl; ifp->if_start = ixgb_start; - ifp->if_watchdog = ixgb_watchdog; ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 1; #if __FreeBSD_version < 500000 @@ -1420,8 +1398,10 @@ static int ixgb_dma_malloc(struct adapter * adapter, bus_size_t size, struct ixgb_dma_alloc * dma, int mapflags) { + device_t dev; int r; + dev = adapter->dev; r = bus_dma_tag_create(NULL, /* parent */ PAGE_SIZE, 0, /* alignment, bounds */ BUS_SPACE_MAXADDR, /* lowaddr */ @@ -1437,15 +1417,15 @@ ixgb_dma_malloc(struct adapter * adapter, bus_size_t size, #endif &dma->dma_tag); if (r != 0) { - printf("ixgb%d: ixgb_dma_malloc: bus_dma_tag_create failed; " - "error %u\n", adapter->unit, r); + device_printf(dev, "ixgb_dma_malloc: bus_dma_tag_create failed; " + "error %u\n", r); goto fail_0; } r = bus_dmamem_alloc(dma->dma_tag, (void **)&dma->dma_vaddr, BUS_DMA_NOWAIT, &dma->dma_map); if (r != 0) { - printf("ixgb%d: ixgb_dma_malloc: bus_dmamem_alloc failed; " - "error %u\n", adapter->unit, r); + device_printf(dev, "ixgb_dma_malloc: bus_dmamem_alloc failed; " + "error %u\n", r); goto fail_1; } r = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr, @@ -1454,8 +1434,8 @@ ixgb_dma_malloc(struct adapter * adapter, bus_size_t size, &dma->dma_paddr, mapflags | BUS_DMA_NOWAIT); if (r != 0) { - printf("ixgb%d: ixgb_dma_malloc: bus_dmamap_load failed; " - "error %u\n", adapter->unit, r); + device_printf(dev, "ixgb_dma_malloc: bus_dmamap_load failed; " + "error %u\n", r); goto fail_2; } dma->dma_size = size; @@ -1493,8 +1473,8 @@ ixgb_allocate_transmit_structures(struct adapter * adapter) (struct ixgb_buffer *) malloc(sizeof(struct ixgb_buffer) * adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO))) { - printf("ixgb%d: Unable to allocate tx_buffer memory\n", - adapter->unit); + device_printf(adapter->dev, + "Unable to allocate tx_buffer memory\n"); return ENOMEM; } bzero(adapter->tx_buffer_area, @@ -1528,7 +1508,7 @@ ixgb_setup_transmit_structures(struct adapter * adapter) NULL, /* lockfuncarg */ #endif &adapter->txtag)) { - printf("ixgb%d: Unable to allocate TX DMA tag\n", adapter->unit); + device_printf(adapter->dev, "Unable to allocate TX DMA tag\n"); return (ENOMEM); } if (ixgb_allocate_transmit_structures(adapter)) @@ -1763,9 +1743,9 @@ ixgb_clean_transmit_interrupts(struct adapter * adapter) ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; if (num_avail == adapter->num_tx_desc) - ifp->if_timer = 0; + adapter->tx_timer = 0; else if (num_avail == adapter->num_tx_desc_avail) - ifp->if_timer = IXGB_TX_TIMEOUT; + adapter->tx_timer = IXGB_TX_TIMEOUT; } adapter->num_tx_desc_avail = num_avail; return; @@ -1845,8 +1825,8 @@ ixgb_allocate_receive_structures(struct adapter * adapter) (struct ixgb_buffer *) malloc(sizeof(struct ixgb_buffer) * adapter->num_rx_desc, M_DEVBUF, M_NOWAIT | M_ZERO))) { - printf("ixgb%d: Unable to allocate rx_buffer memory\n", - adapter->unit); + device_printf(adapter->dev, + "Unable to allocate rx_buffer memory\n"); return (ENOMEM); } bzero(adapter->rx_buffer_area, @@ -1867,9 +1847,9 @@ ixgb_allocate_receive_structures(struct adapter * adapter) #endif &adapter->rxtag); if (error != 0) { - printf("ixgb%d: ixgb_allocate_receive_structures: " + device_printf(adapter->dev, "ixgb_allocate_receive_structures: " "bus_dma_tag_create failed; error %u\n", - adapter->unit, error); + error); goto fail_0; } rx_buffer = adapter->rx_buffer_area; @@ -1877,9 +1857,10 @@ ixgb_allocate_receive_structures(struct adapter * adapter) error = bus_dmamap_create(adapter->rxtag, BUS_DMA_NOWAIT, &rx_buffer->map); if (error != 0) { - printf("ixgb%d: ixgb_allocate_receive_structures: " + device_printf(adapter->dev, + "ixgb_allocate_receive_structures: " "bus_dmamap_create failed; error %u\n", - adapter->unit, error); + error); goto fail_1; } } @@ -2431,20 +2412,21 @@ ixgb_print_hw_stats(struct adapter * adapter) char buf_speed[100], buf_type[100]; ixgb_bus_speed bus_speed; ixgb_bus_type bus_type; - int unit = adapter->unit; + device_t dev; + dev = adapter->dev; #ifdef _SV_ - printf("ixgb%d: Packets not Avail = %ld\n", unit, + device_printf(dev, "Packets not Avail = %ld\n", adapter->no_pkts_avail); - printf("ixgb%d: CleanTxInterrupts = %ld\n", unit, + device_printf(dev, "CleanTxInterrupts = %ld\n", adapter->clean_tx_interrupts); - printf("ixgb%d: ICR RXDMT0 = %lld\n", unit, + device_printf(dev, "ICR RXDMT0 = %lld\n", (long long)adapter->sv_stats.icr_rxdmt0); - printf("ixgb%d: ICR RXO = %lld\n", unit, + device_printf(dev, "ICR RXO = %lld\n", (long long)adapter->sv_stats.icr_rxo); - printf("ixgb%d: ICR RXT0 = %lld\n", unit, + device_printf(dev, "ICR RXT0 = %lld\n", (long long)adapter->sv_stats.icr_rxt0); - printf("ixgb%d: ICR TXDW = %lld\n", unit, + device_printf(dev, "ICR TXDW = %lld\n", (long long)adapter->sv_stats.icr_TXDW); #endif /* _SV_ */ @@ -2456,55 +2438,55 @@ ixgb_print_hw_stats(struct adapter * adapter) bus_speed == ixgb_bus_speed_100 ? "100MHz" : bus_speed == ixgb_bus_speed_133 ? "133MHz" : "UNKNOWN"); - printf("ixgb%d: PCI_Bus_Speed = %s\n", unit, + device_printf(dev, "PCI_Bus_Speed = %s\n", buf_speed); sprintf(buf_type, bus_type == ixgb_bus_type_pci ? "PCI" : bus_type == ixgb_bus_type_pcix ? "PCI-X" : "UNKNOWN"); - printf("ixgb%d: PCI_Bus_Type = %s\n", unit, + device_printf(dev, "PCI_Bus_Type = %s\n", buf_type); - printf("ixgb%d: Tx Descriptors not Avail1 = %ld\n", unit, + device_printf(dev, "Tx Descriptors not Avail1 = %ld\n", adapter->no_tx_desc_avail1); - printf("ixgb%d: Tx Descriptors not Avail2 = %ld\n", unit, + device_printf(dev, "Tx Descriptors not Avail2 = %ld\n", adapter->no_tx_desc_avail2); - printf("ixgb%d: Std Mbuf Failed = %ld\n", unit, + device_printf(dev, "Std Mbuf Failed = %ld\n", adapter->mbuf_alloc_failed); - printf("ixgb%d: Std Cluster Failed = %ld\n", unit, + device_printf(dev, "Std Cluster Failed = %ld\n", adapter->mbuf_cluster_failed); - printf("ixgb%d: Defer count = %lld\n", unit, + device_printf(dev, "Defer count = %lld\n", (long long)adapter->stats.dc); - printf("ixgb%d: Missed Packets = %lld\n", unit, + device_printf(dev, "Missed Packets = %lld\n", (long long)adapter->stats.mpc); - printf("ixgb%d: Receive No Buffers = %lld\n", unit, + device_printf(dev, "Receive No Buffers = %lld\n", (long long)adapter->stats.rnbc); - printf("ixgb%d: Receive length errors = %lld\n", unit, + device_printf(dev, "Receive length errors = %lld\n", (long long)adapter->stats.rlec); - printf("ixgb%d: Crc errors = %lld\n", unit, + device_printf(dev, "Crc errors = %lld\n", (long long)adapter->stats.crcerrs); - printf("ixgb%d: Driver dropped packets = %ld\n", unit, + device_printf(dev, "Driver dropped packets = %ld\n", adapter->dropped_pkts); - printf("ixgb%d: XON Rcvd = %lld\n", unit, + device_printf(dev, "XON Rcvd = %lld\n", (long long)adapter->stats.xonrxc); - printf("ixgb%d: XON Xmtd = %lld\n", unit, + device_printf(dev, "XON Xmtd = %lld\n", (long long)adapter->stats.xontxc); - printf("ixgb%d: XOFF Rcvd = %lld\n", unit, + device_printf(dev, "XOFF Rcvd = %lld\n", (long long)adapter->stats.xoffrxc); - printf("ixgb%d: XOFF Xmtd = %lld\n", unit, + device_printf(dev, "XOFF Xmtd = %lld\n", (long long)adapter->stats.xofftxc); - printf("ixgb%d: Good Packets Rcvd = %lld\n", unit, + device_printf(dev, "Good Packets Rcvd = %lld\n", (long long)adapter->stats.gprcl); - printf("ixgb%d: Good Packets Xmtd = %lld\n", unit, + device_printf(dev, "Good Packets Xmtd = %lld\n", (long long)adapter->stats.gptcl); - printf("ixgb%d: Jumbo frames recvd = %lld\n", unit, + device_printf(dev, "Jumbo frames recvd = %lld\n", (long long)adapter->stats.jprcl); - printf("ixgb%d: Jumbo frames Xmtd = %lld\n", unit, + device_printf(dev, "Jumbo frames Xmtd = %lld\n", (long long)adapter->stats.jptcl); return; diff --git a/sys/dev/ixgb/if_ixgb.h b/sys/dev/ixgb/if_ixgb.h index c2f0acffee83..9e5355a25dd7 100644 --- a/sys/dev/ixgb/if_ixgb.h +++ b/sys/dev/ixgb/if_ixgb.h @@ -284,7 +284,7 @@ struct adapter { struct ifmedia media; struct callout timer; int io_rid; - u_int8_t unit; + int tx_timer; struct mtx mtx; /* Info about the board itself */ diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c index fb5ea5197684..f66443ae77f8 100644 --- a/sys/dev/ixgbe/ixgbe.c +++ b/sys/dev/ixgbe/ixgbe.c @@ -46,7 +46,7 @@ int ixgbe_display_debug_stats = 0; /********************************************************************* * Driver version *********************************************************************/ -char ixgbe_driver_version[] = "1.8.9"; +char ixgbe_driver_version[] = "2.0.7"; /********************************************************************* * PCI Device ID Table @@ -64,16 +64,19 @@ static ixgbe_vendor_info_t ixgbe_vendor_info_array[] = {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0}, + {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0}, - {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0}, + {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0}, {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0}, + {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0}, + {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0}, /* required last entry */ {0, 0, 0, 0, 0} }; @@ -102,7 +105,6 @@ static int ixgbe_mq_start_locked(struct ifnet *, static void ixgbe_qflush(struct ifnet *); #endif static int ixgbe_ioctl(struct ifnet *, u_long, caddr_t); -static void ixgbe_watchdog(struct adapter *); static void ixgbe_init(void *); static void ixgbe_init_locked(struct adapter *); static void ixgbe_stop(void *); @@ -116,8 +118,8 @@ static int ixgbe_allocate_queues(struct adapter *); static int ixgbe_setup_msix(struct adapter *); static void ixgbe_free_pci_resources(struct adapter *); static void ixgbe_local_timer(void *); -static int ixgbe_hardware_init(struct adapter *); static void ixgbe_setup_interface(device_t, struct adapter *); +static void ixgbe_config_link(struct adapter *); static int ixgbe_allocate_transmit_buffers(struct tx_ring *); static int ixgbe_setup_transmit_structures(struct adapter *); @@ -132,6 +134,7 @@ static int ixgbe_setup_receive_ring(struct rx_ring *); static void ixgbe_initialize_receive_units(struct adapter *); static void ixgbe_free_receive_structures(struct adapter *); static void ixgbe_free_receive_buffers(struct rx_ring *); +static void ixgbe_setup_hw_rsc(struct rx_ring *); static void ixgbe_init_moderation(struct adapter *); static void ixgbe_enable_intr(struct adapter *); @@ -146,7 +149,7 @@ static void ixgbe_set_multi(struct adapter *); static void ixgbe_print_hw_stats(struct adapter *); static void ixgbe_print_debug_info(struct adapter *); static void ixgbe_update_link_status(struct adapter *); -static int ixgbe_get_buf(struct rx_ring *, int, u8); +static int ixgbe_get_buf(struct rx_ring *, int, int); static int ixgbe_xmit(struct tx_ring *, struct mbuf **); static int ixgbe_sysctl_stats(SYSCTL_HANDLER_ARGS); static int ixgbe_sysctl_debug(SYSCTL_HANDLER_ARGS); @@ -186,6 +189,10 @@ static void ixgbe_handle_link(void *, int); static void ixgbe_handle_msf(void *, int); static void ixgbe_handle_mod(void *, int); +#ifdef IXGBE_FDIR +static void ixgbe_atr(struct tx_ring *, struct mbuf *); +static void ixgbe_reinit_fdir(void *, int); +#endif /********************************************************************* * FreeBSD Device Interface Entry Points @@ -238,6 +245,15 @@ TUNABLE_INT("hw.ixgbe.rx_process_limit", &ixgbe_rx_process_limit); static int ixgbe_flow_control = ixgbe_fc_full; TUNABLE_INT("hw.ixgbe.flow_control", &ixgbe_flow_control); +/* +** Smart speed setting, default to on +** this only works as a compile option +** right now as its during attach, set +** this to 'ixgbe_smart_speed_off' to +** disable. +*/ +static int ixgbe_smart_speed = ixgbe_smart_speed_on; + /* * MSIX should be the default for best performance, * but this allows it to be forced off for testing. @@ -271,7 +287,7 @@ TUNABLE_INT("hw.ixgbe.txd", &ixgbe_txd); static int ixgbe_rxd = DEFAULT_RXD; TUNABLE_INT("hw.ixgbe.rxd", &ixgbe_rxd); -/* Total number of Interfaces - need for config sanity check */ +/* Keep running tab on them for sanity check */ static int ixgbe_total_ports; /* @@ -288,6 +304,27 @@ static u32 ixgbe_shadow_vfta[IXGBE_VFTA_SIZE]; */ static int ixgbe_num_segs = IXGBE_82598_SCATTER; +#ifdef IXGBE_FDIR +/* +** For Flow Director: this is the +** number of TX packets we sample +** for the filter pool, this means +** every 20th packet will be probed. +** +** This feature can be disabled by +** setting this to 0. +*/ +static int atr_sample_rate = 20; +/* +** Flow Director actually 'steals' +** part of the packet buffer as its +** filter pool, this variable controls +** how much it uses: +** 0 = 64K, 1 = 128K, 2 = 256K +*/ +static int fdir_pballoc = 1; +#endif + /********************************************************************* * Device identification routine * @@ -356,7 +393,7 @@ ixgbe_attach(device_t dev) struct adapter *adapter; struct ixgbe_hw *hw; int error = 0; - u16 pci_device_id; + u16 pci_device_id, csum; u32 ctrl_ext; INIT_DEBUGOUT("ixgbe_attach: begin"); @@ -376,10 +413,14 @@ ixgbe_attach(device_t dev) case IXGBE_DEV_ID_82598EB_CX4 : adapter->optics = IFM_10G_CX4; break; + case IXGBE_DEV_ID_82598 : case IXGBE_DEV_ID_82598AF_DUAL_PORT : case IXGBE_DEV_ID_82598_DA_DUAL_PORT : case IXGBE_DEV_ID_82598AF_SINGLE_PORT : + case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM : + case IXGBE_DEV_ID_82598EB_SFP_LOM : case IXGBE_DEV_ID_82598AT : + case IXGBE_DEV_ID_82598AT2 : adapter->optics = IFM_10G_SR; break; case IXGBE_DEV_ID_82598EB_XF_LR : @@ -390,10 +431,13 @@ ixgbe_attach(device_t dev) ixgbe_num_segs = IXGBE_82599_SCATTER; break; case IXGBE_DEV_ID_82599_KX4 : + case IXGBE_DEV_ID_82599_KX4_MEZZ: + case IXGBE_DEV_ID_82599_CX4 : adapter->optics = IFM_10G_CX4; ixgbe_num_segs = IXGBE_82599_SCATTER; break; case IXGBE_DEV_ID_82599_XAUI_LOM : + case IXGBE_DEV_ID_82599_COMBO_BACKPLANE : ixgbe_num_segs = IXGBE_82599_SCATTER; default: break; @@ -504,13 +548,40 @@ ixgbe_attach(device_t dev) goto err_late; } - /* Initialize the hardware */ - if (ixgbe_hardware_init(adapter)) { - device_printf(dev,"Unable to initialize the hardware\n"); + /* Make sure we have a good EEPROM before we read from it */ + if (ixgbe_validate_eeprom_checksum(&adapter->hw, &csum) < 0) { + device_printf(dev,"The EEPROM Checksum Is Not Valid\n"); error = EIO; goto err_late; } + /* Pick up the smart speed setting */ + if (hw->mac.type == ixgbe_mac_82599EB) + hw->phy.smart_speed = ixgbe_smart_speed; + + /* Get Hardware Flow Control setting */ + hw->fc.requested_mode = ixgbe_fc_full; + hw->fc.pause_time = IXGBE_FC_PAUSE; + hw->fc.low_water = IXGBE_FC_LO; + hw->fc.high_water = IXGBE_FC_HI; + hw->fc.send_xon = TRUE; + + error = ixgbe_init_hw(hw); + if (error == IXGBE_ERR_EEPROM_VERSION) { + device_printf(dev, "This device is a pre-production adapter/" + "LOM. Please be aware there may be issues associated " + "with your hardware.\n If you are experiencing problems " + "please contact your Intel or hardware representative " + "who provided you with this hardware.\n"); + } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) + device_printf(dev,"Unsupported SFP+ Module\n"); + + if (error) { + error = EIO; + device_printf(dev,"Hardware Initialization Failure\n"); + goto err_late; + } + if ((adapter->msix > 1) && (ixgbe_enable_msix)) error = ixgbe_allocate_msix(adapter); else @@ -529,10 +600,10 @@ ixgbe_attach(device_t dev) adapter->cycles.mask = (u64)-1; adapter->cycles.mult = 1; adapter->cycles.shift = IXGBE_TSYNC_SHIFT; - IXGBE_WRITE_REG(&adapter->hw, IXGBE_TIMINCA, (1<<24) | + IXGBE_WRITE_REG(hw, IXGBE_TIMINCA, (1<<24) | IXGBE_TSYNC_CYCLE_TIME * IXGBE_TSYNC_SHIFT); - IXGBE_WRITE_REG(&adapter->hw, IXGBE_SYSTIML, 0x00000000); - IXGBE_WRITE_REG(&adapter->hw, IXGBE_SYSTIMH, 0xFF800000); + IXGBE_WRITE_REG(hw, IXGBE_SYSTIML, 0x00000000); + IXGBE_WRITE_REG(hw, IXGBE_SYSTIMH, 0xFF800000); // JFV - this is not complete yet #endif @@ -551,6 +622,24 @@ ixgbe_attach(device_t dev) adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, ixgbe_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST); + /* Print PCIE bus type/speed/width info */ + ixgbe_get_bus_info(hw); + device_printf(dev,"PCI Express Bus: Speed %s %s\n", + ((hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0Gb/s": + (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5Gb/s":"Unknown"), + (hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" : + (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" : + (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" : + ("Unknown")); + + if (hw->bus.width <= ixgbe_bus_width_pcie_x4) { + device_printf(dev, "PCI-Express bandwidth available" + " for this card\n is not sufficient for" + " optimal performance.\n"); + device_printf(dev, "For optimal performance a x8 " + "PCI-Express slot is required.\n"); + } + /* let hardware know driver is loaded */ ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT); ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD; @@ -616,6 +705,9 @@ ixgbe_detach(device_t dev) taskqueue_drain(adapter->tq, &adapter->link_task); taskqueue_drain(adapter->tq, &adapter->mod_task); taskqueue_drain(adapter->tq, &adapter->msf_task); +#ifdef IXGBE_FDIR + taskqueue_drain(adapter->tq, &adapter->fdir_task); +#endif taskqueue_free(adapter->tq); } @@ -700,8 +792,8 @@ ixgbe_start_locked(struct tx_ring *txr, struct ifnet * ifp) /* Send a copy of the frame to the BPF listener */ ETHER_BPF_MTAP(ifp, m_head); - /* Set timeout in case hardware has problems transmitting */ - txr->watchdog_timer = IXGBE_TX_TIMEOUT; + /* Set watchdog on */ + txr->watchdog_check = TRUE; } return; @@ -769,17 +861,18 @@ ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr, struct mbuf *m) goto process; /* If nothing queued go right to xmit */ - if (drbr_empty(ifp, txr->br)) { - if (ixgbe_xmit(txr, &m)) { - if (m && (err = drbr_enqueue(ifp, txr->br, m)) != 0) - return (err); + if (!drbr_needs_enqueue(ifp, txr->br)) { + if ((err = ixgbe_xmit(txr, &m)) != 0) { + if (m != NULL) + err = drbr_enqueue(ifp, txr->br, m); + return (err); } else { /* Success, update stats */ drbr_stats_update(ifp, m->m_pkthdr.len, m->m_flags); /* Send a copy of the frame to the BPF listener */ ETHER_BPF_MTAP(ifp, m); /* Set the watchdog */ - txr->watchdog_timer = IXGBE_TX_TIMEOUT; + txr->watchdog_check = TRUE; } } else if ((err = drbr_enqueue(ifp, txr->br, m)) != 0) @@ -796,11 +889,15 @@ process: next = drbr_dequeue(ifp, txr->br); if (next == NULL) break; - if (ixgbe_xmit(txr, &next)) + if ((err = ixgbe_xmit(txr, &next)) != 0) { + if (next != NULL) + err = drbr_enqueue(ifp, txr->br, next); break; + } + drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); ETHER_BPF_MTAP(ifp, next); /* Set the watchdog */ - txr->watchdog_timer = IXGBE_TX_TIMEOUT; + txr->watchdog_check = TRUE; } if (txr->tx_avail <= IXGBE_TX_OP_THRESHOLD) @@ -843,27 +940,10 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data) { struct adapter *adapter = ifp->if_softc; struct ifreq *ifr = (struct ifreq *) data; -#ifdef INET - struct ifaddr *ifa = (struct ifaddr *) data; -#endif int error = 0; switch (command) { - case SIOCSIFADDR: -#ifdef INET - IOCTL_DEBUGOUT("ioctl: SIOCxIFADDR (Get/Set Interface Addr)"); - if (ifa->ifa_addr->sa_family == AF_INET) { - ifp->if_flags |= IFF_UP; - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { - IXGBE_CORE_LOCK(adapter); - ixgbe_init_locked(adapter); - IXGBE_CORE_UNLOCK(adapter); - } - arp_ifinit(ifp, ifa); - } else -#endif - ether_ioctl(ifp, command, data); - break; + case SIOCSIFMTU: IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)"); if (ifr->ifr_mtu > IXGBE_MAX_FRAME_SIZE - ETHER_HDR_LEN) { @@ -919,7 +999,8 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data) ifp->if_capenable ^= IFCAP_HWCSUM; if (mask & IFCAP_TSO4) ifp->if_capenable ^= IFCAP_TSO4; - if (mask & IFCAP_LRO) + /* Only allow changing when using header split */ + if ((mask & IFCAP_LRO) && (ixgbe_header_split)) ifp->if_capenable ^= IFCAP_LRO; if (mask & IFCAP_VLAN_HWTAGGING) ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; @@ -947,84 +1028,6 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data) return (error); } -/********************************************************************* - * Watchdog entry point - * - * This routine is called by the local timer - * to detect hardware hangs . - * - **********************************************************************/ - -static void -ixgbe_watchdog(struct adapter *adapter) -{ - device_t dev = adapter->dev; - struct tx_ring *txr = adapter->tx_rings; - struct ixgbe_hw *hw = &adapter->hw; - bool tx_hang = FALSE; - - IXGBE_CORE_LOCK_ASSERT(adapter); - - /* - * The timer is set to 5 every time ixgbe_start() queues a packet. - * Then ixgbe_txeof() keeps resetting to 5 as long as it cleans at - * least one descriptor. - * Finally, anytime all descriptors are clean the timer is - * set to 0. - */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { - u32 head, tail; - - IXGBE_TX_LOCK(txr); - if (txr->watchdog_timer == 0 || --txr->watchdog_timer) { - IXGBE_TX_UNLOCK(txr); - continue; - } else { - head = IXGBE_READ_REG(hw, IXGBE_TDH(i)); - tail = IXGBE_READ_REG(hw, IXGBE_TDT(i)); - if (head == tail) { /* last minute check */ - IXGBE_TX_UNLOCK(txr); - continue; - } - /* Well, seems something is really hung */ - tx_hang = TRUE; - IXGBE_TX_UNLOCK(txr); - break; - } - } - if (tx_hang == FALSE) - return; - - /* - * If we are in this routine because of pause frames, then don't - * reset the hardware. - */ - if (IXGBE_READ_REG(hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF) { - txr = adapter->tx_rings; /* reset pointer */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { - IXGBE_TX_LOCK(txr); - txr->watchdog_timer = IXGBE_TX_TIMEOUT; - IXGBE_TX_UNLOCK(txr); - } - return; - } - - - device_printf(adapter->dev, "Watchdog timeout -- resetting\n"); - for (int i = 0; i < adapter->num_queues; i++, txr++) { - device_printf(dev,"Queue(%d) tdh = %d, hw tdt = %d\n", i, - IXGBE_READ_REG(hw, IXGBE_TDH(i)), - IXGBE_READ_REG(hw, IXGBE_TDT(i))); - device_printf(dev,"TX(%d) desc avail = %d," - "Next TX to Clean = %d\n", - i, txr->tx_avail, txr->next_tx_to_clean); - } - adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - adapter->watchdog_events++; - - ixgbe_init_locked(adapter); -} - /********************************************************************* * Init entry point * @@ -1052,19 +1055,14 @@ ixgbe_init_locked(struct adapter *adapter) hw = &adapter->hw; mtx_assert(&adapter->core_mtx, MA_OWNED); - ixgbe_stop(adapter); - /* Get the latest mac address, User can use a LAA */ - bcopy(IF_LLADDR(adapter->ifp), adapter->hw.mac.addr, + bcopy(IF_LLADDR(adapter->ifp), hw->mac.addr, IXGBE_ETH_LENGTH_OF_ADDRESS); - ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, 1); - adapter->hw.addr_ctrl.rar_used_count = 1; + ixgbe_set_rar(hw, 0, hw->mac.addr, 0, 1); + hw->addr_ctrl.rar_used_count = 1; - /* Initialize the hardware */ - if (ixgbe_hardware_init(adapter)) { - device_printf(dev, "Unable to initialize the hardware\n"); - return; - } + /* Do a warm reset */ + ixgbe_reset_hw(hw); /* Prepare transmit descriptors and buffers */ if (ixgbe_setup_transmit_structures(adapter)) { @@ -1102,7 +1100,7 @@ ixgbe_init_locked(struct adapter *adapter) gpie = IXGBE_READ_REG(&adapter->hw, IXGBE_GPIE); - if (adapter->hw.mac.type == ixgbe_mac_82599EB) { + if (hw->mac.type == ixgbe_mac_82599EB) { gpie |= IXGBE_SDP1_GPIEN; gpie |= IXGBE_SDP2_GPIEN; } @@ -1117,7 +1115,7 @@ ixgbe_init_locked(struct adapter *adapter) gpie |= IXGBE_GPIE_EIAME | IXGBE_GPIE_PBA_SUPPORT | IXGBE_GPIE_OCD; } - IXGBE_WRITE_REG(&adapter->hw, IXGBE_GPIE, gpie); + IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie); /* Set the various hardware offload abilities */ ifp->if_hwassist = 0; @@ -1128,28 +1126,35 @@ ixgbe_init_locked(struct adapter *adapter) /* Set MTU size */ if (ifp->if_mtu > ETHERMTU) { - mhadd = IXGBE_READ_REG(&adapter->hw, IXGBE_MHADD); + mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD); mhadd &= ~IXGBE_MHADD_MFS_MASK; mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT; - IXGBE_WRITE_REG(&adapter->hw, IXGBE_MHADD, mhadd); + IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd); } /* Now enable all the queues */ for (int i = 0; i < adapter->num_queues; i++) { - txdctl = IXGBE_READ_REG(&adapter->hw, IXGBE_TXDCTL(i)); + txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i)); txdctl |= IXGBE_TXDCTL_ENABLE; /* Set WTHRESH to 8, burst writeback */ txdctl |= (8 << 16); - IXGBE_WRITE_REG(&adapter->hw, IXGBE_TXDCTL(i), txdctl); + IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(i), txdctl); } for (int i = 0; i < adapter->num_queues; i++) { - rxdctl = IXGBE_READ_REG(&adapter->hw, IXGBE_RXDCTL(i)); - /* PTHRESH set to 32 */ - rxdctl |= 0x0020; + rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)); + if (hw->mac.type == ixgbe_mac_82598EB) { + /* + ** PTHRESH = 21 + ** HTHRESH = 4 + ** WTHRESH = 8 + */ + rxdctl &= ~0x3FFFFF; + rxdctl |= 0x080420; + } rxdctl |= IXGBE_RXDCTL_ENABLE; - IXGBE_WRITE_REG(&adapter->hw, IXGBE_RXDCTL(i), rxdctl); + IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), rxdctl); for (k = 0; k < 10; k++) { if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)) & IXGBE_RXDCTL_ENABLE) @@ -1166,7 +1171,7 @@ ixgbe_init_locked(struct adapter *adapter) /* Enable Receive engine */ rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); - if (adapter->hw.mac.type == ixgbe_mac_82598EB) + if (hw->mac.type == ixgbe_mac_82598EB) rxctrl |= IXGBE_RXCTRL_DMBYPS; rxctrl |= IXGBE_RXCTRL_RXEN; IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl); @@ -1181,7 +1186,11 @@ ixgbe_init_locked(struct adapter *adapter) ixgbe_set_ivar(adapter, 0, 0, 1); } - ixgbe_enable_intr(adapter); +#ifdef IXGBE_FDIR + /* Init Flow director */ + if (adapter->hw.mac.type == ixgbe_mac_82599EB) + ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc); +#endif /* ** Check on any SFP devices that @@ -1194,14 +1203,12 @@ ixgbe_init_locked(struct adapter *adapter) ixgbe_detach(dev); return; } - if (ixgbe_is_sfp(hw)) { - if (hw->phy.multispeed_fiber) { - hw->mac.ops.setup_sfp(hw); - taskqueue_enqueue(adapter->tq, &adapter->msf_task); - } else - taskqueue_enqueue(adapter->tq, &adapter->mod_task); - } else - taskqueue_enqueue(adapter->tq, &adapter->link_task); + + /* Config/Enable Link */ + ixgbe_config_link(adapter); + + /* And now turn on interrupts */ + ixgbe_enable_intr(adapter); /* Now inform the stack we're ready */ ifp->if_drv_flags |= IFF_DRV_RUNNING; @@ -1269,7 +1276,7 @@ ixgbe_disable_queue(struct adapter *adapter, u32 vector) } static inline void -ixgbe_rearm_rx_queues(struct adapter *adapter, u64 queues) +ixgbe_rearm_queues(struct adapter *adapter, u64 queues) { u32 mask; @@ -1464,11 +1471,25 @@ ixgbe_msix_link(void *arg) taskqueue_enqueue(adapter->tq, &adapter->link_task); if (adapter->hw.mac.type == ixgbe_mac_82599EB) { +#ifdef IXGBE_FDIR + if (reg_eicr & IXGBE_EICR_FLOW_DIR) { + /* This is probably overkill :) */ + if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1)) + return; + /* Clear the interrupt */ + IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_FLOW_DIR); + /* Turn off the interface */ + adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + taskqueue_enqueue(adapter->tq, &adapter->fdir_task); + } else +#endif if (reg_eicr & IXGBE_EICR_ECC) { device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! " "Please Reboot!!\n"); IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC); - } else if (reg_eicr & IXGBE_EICR_GPI_SDP1) { + } else + + if (reg_eicr & IXGBE_EICR_GPI_SDP1) { /* Clear the interrupt */ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1); taskqueue_enqueue(adapter->tq, &adapter->msf_task); @@ -1553,11 +1574,9 @@ ixgbe_init_moderation(struct adapter *adapter) } /* TX irq moderation rate is fixed */ - for (int i = 0; i < adapter->num_queues; i++, txr++) { + for (int i = 0; i < adapter->num_queues; i++, txr++) IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(txr->msix), ixgbe_ave_latency); - txr->watchdog_timer = FALSE; - } /* RX moderation will be adapted over time, set default */ for (int i = 0; i < adapter->num_queues; i++, rxr++) { @@ -1633,7 +1652,6 @@ ixgbe_media_change(struct ifnet * ifp) switch (IFM_SUBTYPE(ifm->ifm_media)) { case IFM_AUTO: - adapter->hw.mac.autoneg = TRUE; adapter->hw.phy.autoneg_advertised = IXGBE_LINK_SPEED_1GB_FULL | IXGBE_LINK_SPEED_10GB_FULL; break; @@ -1690,7 +1708,7 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) * used because it will contain the index of * the one we tell the hardware to report back */ - first = txr->next_avail_tx_desc; + first = txr->next_avail_desc; txbuf = &txr->tx_buffers[first]; txbuf_mapped = txbuf; map = txbuf->map; @@ -1767,12 +1785,22 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) cmd_type_len |= IXGBE_ADVTXD_MAC_TSTAMP; #endif +#ifdef IXGBE_FDIR + /* Do the flow director magic */ + if ((txr->atr_sample) && (!adapter->fdir_reinit)) { + ++txr->atr_count; + if (txr->atr_count >= atr_sample_rate) { + ixgbe_atr(txr, m_head); + txr->atr_count = 0; + } + } +#endif /* Record payload length */ if (paylen == 0) olinfo_status |= m_head->m_pkthdr.len << IXGBE_ADVTXD_PAYLEN_SHIFT; - i = txr->next_avail_tx_desc; + i = txr->next_avail_desc; for (j = 0; j < nsegs; j++) { bus_size_t seglen; bus_addr_t segaddr; @@ -1798,7 +1826,7 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) txd->read.cmd_type_len |= htole32(IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS); txr->tx_avail -= nsegs; - txr->next_avail_tx_desc = i; + txr->next_avail_desc = i; txbuf->m_head = m_head; txbuf->map = map; @@ -1939,7 +1967,7 @@ ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq) * Timer routine * * This routine checks for link status,updates statistics, - * and runs the watchdog timer. + * and runs the watchdog check. * **********************************************************************/ @@ -1948,6 +1976,9 @@ ixgbe_local_timer(void *arg) { struct adapter *adapter = arg; struct ifnet *ifp = adapter->ifp; + device_t dev = adapter->dev; + struct tx_ring *txr = adapter->tx_rings; + bool tx_hung = FALSE; mtx_assert(&adapter->core_mtx, MA_OWNED); @@ -1962,16 +1993,31 @@ ixgbe_local_timer(void *arg) ixgbe_print_hw_stats(adapter); } /* - * Each tick we check the watchdog - * to protect against hardware hangs. - */ - ixgbe_watchdog(adapter); - + ** Check for time since any descriptor was cleaned + */ + for (int i = 0; i < adapter->num_queues; i++, txr++) { + if (txr->watchdog_check == FALSE) + continue; + if ((ticks - txr->watchdog_time) > IXGBE_WATCHDOG) { + tx_hung = TRUE; + goto hung; + } + } out: - /* Trigger an RX interrupt on all queues */ - ixgbe_rearm_rx_queues(adapter, adapter->rx_mask); - callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter); + return; + +hung: + device_printf(adapter->dev, "Watchdog timeout -- resetting\n"); + device_printf(dev,"Queue(%d) tdh = %d, hw tdt = %d\n", txr->me, + IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me)), + IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me))); + device_printf(dev,"TX(%d) desc avail = %d," + "Next TX to Clean = %d\n", + txr->me, txr->tx_avail, txr->next_to_clean); + adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + adapter->watchdog_events++; + ixgbe_init_locked(adapter); } /* @@ -2004,7 +2050,7 @@ ixgbe_update_link_status(struct adapter *adapter) adapter->link_active = FALSE; for (int i = 0; i < adapter->num_queues; i++, txr++) - txr->watchdog_timer = FALSE; + txr->watchdog_check = FALSE; } } @@ -2113,6 +2159,9 @@ ixgbe_allocate_legacy(struct adapter *adapter) TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter); TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter); TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter); +#ifdef IXGBE_FDIR + TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter); +#endif adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT, taskqueue_thread_enqueue, &adapter->tq); taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq", @@ -2242,6 +2291,9 @@ ixgbe_allocate_msix(struct adapter *adapter) TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter); TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter); TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter); +#ifdef IXGBE_FDIR + TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter); +#endif adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT, taskqueue_thread_enqueue, &adapter->tq); taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq", @@ -2430,57 +2482,6 @@ mem: return; } -/********************************************************************* - * - * Initialize the hardware to a configuration as specified by the - * adapter structure. The controller is reset, the EEPROM is - * verified, the MAC address is set, then the shared initialization - * routines are called. - * - **********************************************************************/ -static int -ixgbe_hardware_init(struct adapter *adapter) -{ - device_t dev = adapter->dev; - u32 ret; - u16 csum; - - csum = 0; - /* Issue a global reset */ - adapter->hw.adapter_stopped = FALSE; - ixgbe_stop_adapter(&adapter->hw); - - /* Make sure we have a good EEPROM before we read from it */ - if (ixgbe_validate_eeprom_checksum(&adapter->hw, &csum) < 0) { - device_printf(dev,"The EEPROM Checksum Is Not Valid\n"); - return (EIO); - } - - /* Get Hardware Flow Control setting */ - adapter->hw.fc.requested_mode = ixgbe_fc_full; - adapter->hw.fc.pause_time = IXGBE_FC_PAUSE; - adapter->hw.fc.low_water = IXGBE_FC_LO; - adapter->hw.fc.high_water = IXGBE_FC_HI; - adapter->hw.fc.send_xon = TRUE; - - ret = ixgbe_init_hw(&adapter->hw); - if (ret == IXGBE_ERR_EEPROM_VERSION) { - device_printf(dev, "This device is a pre-production adapter/" - "LOM. Please be aware there may be issues associated " - "with your hardware.\n If you are experiencing problems " - "please contact your Intel or hardware representative " - "who provided you with this hardware.\n"); - } else if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) { - device_printf(dev,"Unsupported SFP+ Module\n"); - return (EIO); - } else if (ret != 0 ) { - device_printf(dev,"Hardware Initialization Failure\n"); - return (EIO); - } - - return (0); -} - /********************************************************************* * * Setup networking device structure and register an interface. @@ -2489,8 +2490,9 @@ ixgbe_hardware_init(struct adapter *adapter) static void ixgbe_setup_interface(device_t dev, struct adapter *adapter) { - struct ifnet *ifp; struct ixgbe_hw *hw = &adapter->hw; + struct ifnet *ifp; + INIT_DEBUGOUT("ixgbe_setup_interface: begin"); ifp = adapter->ifp = if_alloc(IFT_ETHER); @@ -2508,8 +2510,6 @@ ixgbe_setup_interface(device_t dev, struct adapter *adapter) ifp->if_transmit = ixgbe_mq_start; ifp->if_qflush = ixgbe_qflush; #endif - ifp->if_timer = 0; - ifp->if_watchdog = NULL; ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 2; ether_ifattach(ifp, adapter->hw.mac.addr); @@ -2524,17 +2524,12 @@ ixgbe_setup_interface(device_t dev, struct adapter *adapter) ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO4 | IFCAP_VLAN_HWCSUM; ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; - ifp->if_capabilities |= IFCAP_JUMBO_MTU | IFCAP_LRO; + ifp->if_capabilities |= IFCAP_JUMBO_MTU; + if (ixgbe_header_split) + ifp->if_capabilities |= IFCAP_LRO; ifp->if_capenable = ifp->if_capabilities; - if (hw->device_id == IXGBE_DEV_ID_82598AT) - ixgbe_setup_link_speed(hw, (IXGBE_LINK_SPEED_10GB_FULL | - IXGBE_LINK_SPEED_1GB_FULL), TRUE, TRUE); - else - ixgbe_setup_link_speed(hw, IXGBE_LINK_SPEED_10GB_FULL, - TRUE, FALSE); - /* * Specify the media types supported by this adapter and register * callbacks to update media and link information @@ -2551,7 +2546,51 @@ ixgbe_setup_interface(device_t dev, struct adapter *adapter) } ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL); ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO); + return; +} +static void +ixgbe_config_link(struct adapter *adapter) +{ + struct ixgbe_hw *hw = &adapter->hw; + u32 autoneg, err = 0; + bool sfp, negotiate; + + switch (hw->phy.type) { + case ixgbe_phy_sfp_avago: + case ixgbe_phy_sfp_ftl: + case ixgbe_phy_sfp_intel: + case ixgbe_phy_sfp_unknown: + case ixgbe_phy_tw_tyco: + case ixgbe_phy_tw_unknown: + sfp = TRUE; + default: + sfp = FALSE; + } + + if (sfp) { + if (hw->phy.multispeed_fiber) { + hw->mac.ops.setup_sfp(hw); + taskqueue_enqueue(adapter->tq, &adapter->msf_task); + } else + taskqueue_enqueue(adapter->tq, &adapter->mod_task); + } else { + if (hw->mac.ops.check_link) + err = ixgbe_check_link(hw, &autoneg, + &adapter->link_up, FALSE); + if (err) + goto out; + autoneg = hw->phy.autoneg_advertised; + if ((!autoneg) && (hw->mac.ops.get_link_capabilities)) + err = hw->mac.ops.get_link_capabilities(hw, + &autoneg, &negotiate); + if (err) + goto out; + if (hw->mac.ops.setup_link) + err = hw->mac.ops.setup_link(hw, autoneg, + negotiate, adapter->link_up); + } +out: return; } @@ -2835,8 +2874,8 @@ ixgbe_setup_transmit_ring(struct tx_ring *txr) bzero((void *)txr->tx_base, (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc); /* Reset indices */ - txr->next_avail_tx_desc = 0; - txr->next_tx_to_clean = 0; + txr->next_avail_desc = 0; + txr->next_to_clean = 0; /* Free any existing tx buffers. */ txbuf = txr->tx_buffers; @@ -2852,6 +2891,12 @@ ixgbe_setup_transmit_ring(struct tx_ring *txr) txbuf->eop_index = -1; } +#ifdef IXGBE_FDIR + /* Set the rate at which we sample packets */ + if (adapter->hw.mac.type == ixgbe_mac_82599EB) + txr->atr_sample = atr_sample_rate; +#endif + /* Set number of descriptors available */ txr->tx_avail = adapter->num_tx_desc; @@ -2890,6 +2935,7 @@ ixgbe_initialize_transmit_units(struct adapter *adapter) for (int i = 0; i < adapter->num_queues; i++, txr++) { u64 tdba = txr->txdma.dma_paddr; + u32 txctrl; IXGBE_WRITE_REG(hw, IXGBE_TDBAL(i), (tdba & 0x00000000ffffffffULL)); @@ -2903,15 +2949,43 @@ ixgbe_initialize_transmit_units(struct adapter *adapter) /* Setup Transmit Descriptor Cmd Settings */ txr->txd_cmd = IXGBE_TXD_CMD_IFCS; + txr->watchdog_check = FALSE; + + /* Disable Head Writeback */ + switch (hw->mac.type) { + case ixgbe_mac_82598EB: + txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); + break; + case ixgbe_mac_82599EB: + default: + txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i)); + break; + } + txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + switch (hw->mac.type) { + case ixgbe_mac_82598EB: + IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), txctrl); + break; + case ixgbe_mac_82599EB: + default: + IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), txctrl); + break; + } - txr->watchdog_timer = 0; } if (hw->mac.type == ixgbe_mac_82599EB) { - u32 dmatxctl; + u32 dmatxctl, rttdcs; dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); dmatxctl |= IXGBE_DMATXCTL_TE; IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl); + /* Disable arbiter to set MTQC */ + rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS); + rttdcs |= IXGBE_RTTDCS_ARBDIS; + IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); + IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB); + rttdcs &= ~IXGBE_RTTDCS_ARBDIS; + IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); } return; @@ -3011,7 +3085,7 @@ ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) u16 etype; u8 ipproto = 0; bool offload = TRUE; - int ctxd = txr->next_avail_tx_desc; + int ctxd = txr->next_avail_desc; u16 vtag = 0; @@ -3101,7 +3175,7 @@ ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) /* We've consumed the first desc, adjust counters */ if (++ctxd == adapter->num_tx_desc) ctxd = 0; - txr->next_avail_tx_desc = ctxd; + txr->next_avail_desc = ctxd; --txr->tx_avail; return (offload); @@ -3142,7 +3216,7 @@ ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen) if (mp->m_len < ehdrlen + sizeof(struct ip) + sizeof(struct tcphdr)) return FALSE; - ctxd = txr->next_avail_tx_desc; + ctxd = txr->next_avail_desc; tx_buffer = &txr->tx_buffers[ctxd]; TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd]; @@ -3190,10 +3264,88 @@ ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen) ctxd = 0; txr->tx_avail--; - txr->next_avail_tx_desc = ctxd; + txr->next_avail_desc = ctxd; return TRUE; } +#ifdef IXGBE_FDIR +/* +** This routine parses packet headers so that Flow +** Director can make a hashed filter table entry +** allowing traffic flows to be identified and kept +** on the same cpu. This would be a performance +** hit, but we only do it at IXGBE_FDIR_RATE of +** packets. +*/ +static void +ixgbe_atr(struct tx_ring *txr, struct mbuf *mp) +{ + struct adapter *adapter = txr->adapter; + struct ixgbe_atr_input atr_input; + struct ip *ip; + struct tcphdr *th; + struct udphdr *uh; + struct ether_vlan_header *eh; + int ehdrlen, ip_hlen; + u16 etype, vlan_id, src_port, dst_port, flex_bytes; + u32 src_ipv4_addr, dst_ipv4_addr; + u8 l4type = 0, ipproto = 0; + + eh = mtod(mp, struct ether_vlan_header *); + if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) + ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; + else + ehdrlen = ETHER_HDR_LEN; + etype = ntohs(eh->evl_proto); + + /* Only handling IPv4 */ + if (etype != ETHERTYPE_IP) + return; + + ip = (struct ip *)(mp->m_data + ehdrlen); + ipproto = ip->ip_p; + ip_hlen = ip->ip_hl << 2; + src_port = dst_port = 0; + + /* check if we're UDP or TCP */ + switch (ipproto) { + case IPPROTO_TCP: + th = (struct tcphdr *)((caddr_t)ip + ip_hlen); + src_port = th->th_sport; + dst_port = th->th_dport; + l4type |= IXGBE_ATR_L4TYPE_TCP; + break; + case IPPROTO_UDP: + uh = (struct udphdr *)((caddr_t)ip + ip_hlen); + src_port = uh->uh_sport; + dst_port = uh->uh_dport; + l4type |= IXGBE_ATR_L4TYPE_UDP; + break; + default: + return; + } + + memset(&atr_input, 0, sizeof(struct ixgbe_atr_input)); + + vlan_id = htole16(mp->m_pkthdr.ether_vtag); + src_ipv4_addr = ip->ip_src.s_addr; + dst_ipv4_addr = ip->ip_dst.s_addr; + flex_bytes = etype; + + ixgbe_atr_set_vlan_id_82599(&atr_input, vlan_id); + ixgbe_atr_set_src_port_82599(&atr_input, dst_port); + ixgbe_atr_set_dst_port_82599(&atr_input, src_port); + ixgbe_atr_set_flex_byte_82599(&atr_input, flex_bytes); + ixgbe_atr_set_l4type_82599(&atr_input, l4type); + /* src and dst are inverted, think how the receiver sees them */ + ixgbe_atr_set_src_ipv4_82599(&atr_input, dst_ipv4_addr); + ixgbe_atr_set_dst_ipv4_82599(&atr_input, src_ipv4_addr); + + /* This assumes the Rx queue and Tx queue are bound to the same CPU */ + ixgbe_fdir_add_signature_filter_82599(&adapter->hw, + &atr_input, txr->msix); +} +#endif /********************************************************************** * @@ -3205,10 +3357,9 @@ ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen) static boolean_t ixgbe_txeof(struct tx_ring *txr) { - struct adapter * adapter = txr->adapter; + struct adapter *adapter = txr->adapter; struct ifnet *ifp = adapter->ifp; - u32 first, last, done, num_avail; - u32 cleaned = 0; + u32 first, last, done; struct ixgbe_tx_buf *tx_buffer; struct ixgbe_legacy_tx_desc *tx_desc, *eop_desc; @@ -3217,17 +3368,15 @@ ixgbe_txeof(struct tx_ring *txr) if (txr->tx_avail == adapter->num_tx_desc) return FALSE; - num_avail = txr->tx_avail; - first = txr->next_tx_to_clean; - + first = txr->next_to_clean; tx_buffer = &txr->tx_buffers[first]; /* For cleanup we just use legacy struct */ tx_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[first]; last = tx_buffer->eop_index; if (last == -1) return FALSE; - eop_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[last]; + /* ** Get the index of the first descriptor ** BEYOND the EOP and call that 'done'. @@ -3249,7 +3398,7 @@ ixgbe_txeof(struct tx_ring *txr) tx_desc->upper.data = 0; tx_desc->lower.data = 0; tx_desc->buffer_addr = 0; - num_avail++; cleaned++; + ++txr->tx_avail; if (tx_buffer->m_head) { ifp->if_opackets++; @@ -3263,6 +3412,7 @@ ixgbe_txeof(struct tx_ring *txr) tx_buffer->map = NULL; } tx_buffer->eop_index = -1; + txr->watchdog_time = ticks; if (++first == adapter->num_tx_desc) first = 0; @@ -3285,7 +3435,7 @@ ixgbe_txeof(struct tx_ring *txr) bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - txr->next_tx_to_clean = first; + txr->next_to_clean = first; /* * If we have enough room, clear IFF_DRV_OACTIVE to tell the stack that @@ -3293,98 +3443,101 @@ ixgbe_txeof(struct tx_ring *txr) * clear the timeout. Otherwise, if some descriptors have been freed, * restart the timeout. */ - if (num_avail > IXGBE_TX_CLEANUP_THRESHOLD) { + if (txr->tx_avail > IXGBE_TX_CLEANUP_THRESHOLD) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - /* If all are clean turn off the timer */ - if (num_avail == adapter->num_tx_desc) { - txr->watchdog_timer = 0; - txr->tx_avail = num_avail; + if (txr->tx_avail == adapter->num_tx_desc) { + txr->watchdog_check = FALSE; return FALSE; } } - /* Some were cleaned, so reset timer */ - if (cleaned) - txr->watchdog_timer = IXGBE_TX_TIMEOUT; - txr->tx_avail = num_avail; return TRUE; } /********************************************************************* * - * Get a buffer from system mbuf buffer pool. + * Refresh mbuf buffers for a range of descriptors * **********************************************************************/ static int -ixgbe_get_buf(struct rx_ring *rxr, int i, u8 clean) +ixgbe_get_buf(struct rx_ring *rxr, int first, int limit) { struct adapter *adapter = rxr->adapter; bus_dma_segment_t seg[2]; struct ixgbe_rx_buf *rxbuf; struct mbuf *mh, *mp; bus_dmamap_t map; - int nsegs, error; - int merr = 0; + int i, nsegs, error; + i = first; + while (i != limit) { + rxbuf = &rxr->rx_buffers[i]; - rxbuf = &rxr->rx_buffers[i]; + if (rxbuf->m_head == NULL) { + mh = m_gethdr(M_DONTWAIT, MT_DATA); + if (mh == NULL) + goto failure; + } else /* reuse */ + mh = rxbuf->m_head; - /* First get our header and payload mbuf */ - if (clean & IXGBE_CLEAN_HDR) { - mh = m_gethdr(M_DONTWAIT, MT_DATA); - if (mh == NULL) - goto remap; - } else /* reuse */ - mh = rxr->rx_buffers[i].m_head; + mh->m_len = MHLEN; + mh->m_flags |= M_PKTHDR; - mh->m_len = MHLEN; - mh->m_flags |= M_PKTHDR; + if (rxbuf->m_pack == NULL) { + mp = m_getjcl(M_DONTWAIT, MT_DATA, + M_PKTHDR, adapter->rx_mbuf_sz); + if (mp == NULL) + goto failure; + mp->m_len = adapter->rx_mbuf_sz; + mp->m_flags &= ~M_PKTHDR; + } else { /* reusing */ + mp = rxbuf->m_pack; + mp->m_len = adapter->rx_mbuf_sz; + mp->m_flags &= ~M_PKTHDR; + } - if (clean & IXGBE_CLEAN_PKT) { - mp = m_getjcl(M_DONTWAIT, MT_DATA, - M_PKTHDR, adapter->rx_mbuf_sz); - if (mp == NULL) - goto remap; - mp->m_len = adapter->rx_mbuf_sz; - mp->m_flags &= ~M_PKTHDR; - } else { /* reusing */ - mp = rxr->rx_buffers[i].m_pack; - mp->m_len = adapter->rx_mbuf_sz; - mp->m_flags &= ~M_PKTHDR; + /* + ** Need to create a chain for the following + ** dmamap call at this point. + */ + mh->m_next = mp; + mh->m_pkthdr.len = mh->m_len + mp->m_len; + + /* Get the memory mapping */ + error = bus_dmamap_load_mbuf_sg(rxr->rxtag, + rxr->spare_map, mh, seg, &nsegs, BUS_DMA_NOWAIT); + if (error != 0) { + printf("GET BUF: dmamap load failure - %d\n", error); + m_free(mh); + return (error); + } + + /* Unload old mapping and update buffer struct */ + if (rxbuf->m_head != NULL) + bus_dmamap_unload(rxr->rxtag, rxbuf->map); + map = rxbuf->map; + rxbuf->map = rxr->spare_map; + rxr->spare_map = map; + rxbuf->m_head = mh; + rxbuf->m_pack = mp; + bus_dmamap_sync(rxr->rxtag, + rxbuf->map, BUS_DMASYNC_PREREAD); + + /* Update descriptor */ + rxr->rx_base[i].read.hdr_addr = htole64(seg[0].ds_addr); + rxr->rx_base[i].read.pkt_addr = htole64(seg[1].ds_addr); + + /* Calculate next index */ + if (++i == adapter->num_rx_desc) + i = 0; } - /* - ** Need to create a chain for the following - ** dmamap call at this point. - */ - mh->m_next = mp; - mh->m_pkthdr.len = mh->m_len + mp->m_len; - - /* Get the memory mapping */ - error = bus_dmamap_load_mbuf_sg(rxr->rxtag, - rxr->spare_map, mh, seg, &nsegs, BUS_DMA_NOWAIT); - if (error != 0) { - printf("GET BUF: dmamap load failure - %d\n", error); - m_free(mh); - return (error); - } - - /* Unload old mapping and update buffer struct */ - if (rxbuf->m_head != NULL) - bus_dmamap_unload(rxr->rxtag, rxbuf->map); - map = rxbuf->map; - rxbuf->map = rxr->spare_map; - rxr->spare_map = map; - rxbuf->m_head = mh; - rxbuf->m_pack = mp; - bus_dmamap_sync(rxr->rxtag, - rxbuf->map, BUS_DMASYNC_PREREAD); - - /* Update descriptor */ - rxr->rx_base[i].read.hdr_addr = htole64(seg[0].ds_addr); - rxr->rx_base[i].read.pkt_addr = htole64(seg[1].ds_addr); return (0); +failure: + panic("GET BUF: ENOBUFS\n"); + +#if 0 /* ** If we get here, we have an mbuf resource ** issue, so we discard the incoming packet @@ -3417,9 +3570,9 @@ remap: rxr->rx_base[i].read.pkt_addr = htole64(seg[1].ds_addr); return (merr); +#endif } - /********************************************************************* * * Allocate memory for rx_buffer structures. Since we use one @@ -3493,6 +3646,62 @@ fail: return (error); } + +/* +** Used to detect a descriptor that has +** been merged by Hardware RSC. +*/ +static inline u32 +ixgbe_rsc_count(union ixgbe_adv_rx_desc *rx) +{ + return (le32toh(rx->wb.lower.lo_dword.data) & + IXGBE_RXDADV_RSCCNT_MASK) >> IXGBE_RXDADV_RSCCNT_SHIFT; +} + +/********************************************************************* + * + * Initialize Hardware RSC (LRO) feature on 82599 + * for an RX ring, this is toggled by the LRO capability + * even though it is transparent to the stack. + * + **********************************************************************/ +static void +ixgbe_setup_hw_rsc(struct rx_ring *rxr) +{ + struct adapter *adapter = rxr->adapter; + struct ixgbe_hw *hw = &adapter->hw; + u32 rscctrl, rdrxctl; + + rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); + rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE; + rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP; + IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); + + rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(rxr->me)); + rscctrl |= IXGBE_RSCCTL_RSCEN; + /* + ** Limit the total number of descriptors that + ** can be combined, so it does not exceed 64K + */ + if (adapter->rx_mbuf_sz == MCLBYTES) + rscctrl |= IXGBE_RSCCTL_MAXDESC_16; + else /* using 4K clusters */ + rscctrl |= IXGBE_RSCCTL_MAXDESC_8; + IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(rxr->me), rscctrl); + + /* Enable TCP header recognition */ + IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), + (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0)) | + IXGBE_PSRTYPE_TCPHDR)); + + /* Disable RSC for ACK packets */ + IXGBE_WRITE_REG(hw, IXGBE_RSCDBU, + (IXGBE_RSCDBU_RSCACKDIS | IXGBE_READ_REG(hw, IXGBE_RSCDBU))); + + rxr->hw_rsc = TRUE; +} + + /********************************************************************* * * Initialize a receive ring and its buffers. @@ -3505,8 +3714,9 @@ ixgbe_setup_receive_ring(struct rx_ring *rxr) struct ifnet *ifp; device_t dev; struct ixgbe_rx_buf *rxbuf; + bus_dma_segment_t seg[2]; struct lro_ctrl *lro = &rxr->lro; - int j, rsize; + int rsize, nsegs, error; adapter = rxr->adapter; ifp = adapter->ifp; @@ -3535,48 +3745,74 @@ ixgbe_setup_receive_ring(struct rx_ring *rxr) } } - /* Now refresh the mbufs */ - for (j = 0; j < adapter->num_rx_desc; j++) { - if (ixgbe_get_buf(rxr, j, IXGBE_CLEAN_ALL) == ENOBUFS) { - rxr->rx_buffers[j].m_head = NULL; - rxr->rx_buffers[j].m_pack = NULL; - rxr->rx_base[j].read.hdr_addr = 0; - rxr->rx_base[j].read.pkt_addr = 0; - goto fail; - } + /* Now replenish the mbufs */ + for (int j = 0; j != adapter->num_rx_desc; ++j) { + + rxbuf = &rxr->rx_buffers[j]; + rxbuf->m_head = m_gethdr(M_DONTWAIT, MT_DATA); + if (rxbuf->m_head == NULL) + panic("RX ring hdr initialization failed!\n"); + rxbuf->m_head->m_len = MHLEN; + rxbuf->m_head->m_flags |= M_PKTHDR; + rxbuf->m_head->m_pkthdr.len = rxbuf->m_head->m_len; + + rxbuf->m_pack = m_getjcl(M_DONTWAIT, MT_DATA, + M_PKTHDR, adapter->rx_mbuf_sz); + if (rxbuf->m_pack == NULL) + panic("RX ring pkt initialization failed!\n"); + rxbuf->m_pack->m_len = adapter->rx_mbuf_sz; + rxbuf->m_head->m_next = rxbuf->m_pack; + rxbuf->m_head->m_pkthdr.len += rxbuf->m_pack->m_len; + + /* Get the memory mapping */ + error = bus_dmamap_load_mbuf_sg(rxr->rxtag, + rxbuf->map, rxbuf->m_head, seg, + &nsegs, BUS_DMA_NOWAIT); + if (error != 0) + panic("RX ring dma initialization failed!\n"); + bus_dmamap_sync(rxr->rxtag, + rxbuf->map, BUS_DMASYNC_PREREAD); + + /* Update descriptor */ + rxr->rx_base[j].read.hdr_addr = htole64(seg[0].ds_addr); + rxr->rx_base[j].read.pkt_addr = htole64(seg[1].ds_addr); } + /* Setup our descriptor indices */ rxr->next_to_check = 0; - rxr->last_cleaned = 0; + rxr->last_refreshed = 0; rxr->lro_enabled = FALSE; /* Use header split if configured */ if (ixgbe_header_split) rxr->hdr_split = TRUE; + else + ifp->if_capabilities &= ~IFCAP_LRO; bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* - ** Now set up the LRO interface, we - ** also only do head split when LRO - ** is enabled, since so often they - ** are undesireable in similar setups. + ** Now set up the LRO interface: + ** 82598 uses software LRO, the + ** 82599 on the other hand uses a + ** hardware assist to do the same. + ** We only do LRO when header split + ** is enabled, its simpler that way. */ - if (ifp->if_capenable & IFCAP_LRO) { + if ((ifp->if_capenable & IFCAP_LRO) && (rxr->hdr_split)) { int err = tcp_lro_init(lro); - if (err) { - INIT_DEBUGOUT("LRO Initialization failed!\n"); - goto fail; - } - INIT_DEBUGOUT("RX LRO Initialized\n"); + if (err) + panic("LRO Initialization failed!\n"); + INIT_DEBUGOUT("RX Soft LRO Initialized\n"); rxr->lro_enabled = TRUE; lro->ifp = adapter->ifp; + ixgbe_setup_hw_rsc(rxr); } return (0); - +#if 0 fail: /* * We need to clean up any buffers allocated @@ -3593,6 +3829,7 @@ fail: } } return (ENOBUFS); +#endif } /********************************************************************* @@ -3846,7 +4083,7 @@ ixgbe_rxeof(struct rx_ring *rxr, int count) struct ifnet *ifp = adapter->ifp; struct lro_ctrl *lro = &rxr->lro; struct lro_entry *queued; - int i; + int i, processed = 0; u32 staterr; union ixgbe_adv_rx_desc *cur; @@ -3867,31 +4104,69 @@ ixgbe_rxeof(struct rx_ring *rxr, int count) while ((staterr & IXGBE_RXD_STAT_DD) && (count != 0) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) { - struct mbuf *sendmp, *mh, *mp; - u16 hlen, plen, hdr, vtag; - u8 dopayload, accept_frame, eop; + struct mbuf *sendmp, *mh, *mp, *nh, *np; + struct ixgbe_rx_buf *nxtbuf; + u32 rsc; + u16 hlen, plen, hdr, nextp, vtag; + bool accept_frame, eop; - accept_frame = 1; - hlen = plen = vtag = 0; - sendmp = mh = mp = NULL; + accept_frame = TRUE; + hlen = plen = rsc = nextp = 0; + sendmp = mh = mp = nh = np = NULL; /* Sync the buffers */ bus_dmamap_sync(rxr->rxtag, rxr->rx_buffers[i].map, BUS_DMASYNC_POSTREAD); + mh = rxr->rx_buffers[i].m_head; + mp = rxr->rx_buffers[i].m_pack; + vtag = le16toh(cur->wb.upper.vlan); + eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0); + + if (!eop) { + /* + ** On 82599 which supports a hardware + ** LRO (called HW RSC), packets need + ** not be fragmented across sequential + ** descriptors, rather the next descriptor + ** is indicated in bits of the current. + ** This also means that we might proceses + ** more than one packet at a time, something + ** that has never been true before, it + ** required eliminating global chain pointers + ** in favor of what we are doing here. -jfv + */ + if (rxr->hw_rsc == TRUE) { + rsc = ixgbe_rsc_count(cur); + rxr->rsc_num += (rsc - 1); + } + if (rsc) { + nextp = ((staterr & + IXGBE_RXDADV_NEXTP_MASK) >> + IXGBE_RXDADV_NEXTP_SHIFT); + } else { + nextp = i + 1; + if (nextp == adapter->num_rx_desc) + nextp = 0; + } + nxtbuf = &rxr->rx_buffers[nextp]; + prefetch(nxtbuf); + } /* ** The way the hardware is configured to ** split, it will ONLY use the header buffer ** when header split is enabled, otherwise we - ** get normal behavior, ie, both header and - ** payload are DMA'd into the payload buffer. + ** get legacy behavior, ie, both header and + ** payload are DMA'd into JUST the payload buffer. + ** + ** Rather than using the fmp/lmp global pointers + ** we now keep the head of a packet chain in the + ** m_nextpkt pointer and pass this along from one + ** descriptor to the next, until we get EOP. ** - ** The fmp test is to catch the case where a - ** packet spans multiple descriptors, in that - ** case only the first header is valid. */ - if ((rxr->hdr_split) && (rxr->fmp == NULL)){ + if ((rxr->hdr_split) && (mh->m_nextpkt == NULL)) { hdr = le16toh(cur-> wb.lower.lo_dword.hs_rss.hdr_info); hlen = (hdr & IXGBE_RXDADV_HDRBUFLEN_MASK) >> @@ -3899,182 +4174,168 @@ ixgbe_rxeof(struct rx_ring *rxr, int count) if (hlen > IXGBE_RX_HDR) hlen = IXGBE_RX_HDR; plen = le16toh(cur->wb.upper.length); - /* Handle the header mbuf */ - mh = rxr->rx_buffers[i].m_head; mh->m_len = hlen; - dopayload = IXGBE_CLEAN_HDR; + mh->m_flags |= M_PKTHDR; + mh->m_next = NULL; + mh->m_pkthdr.len = mh->m_len; + /* Null this so getbuf replenishes */ + rxr->rx_buffers[i].m_head = NULL; /* ** Get the payload length, this ** could be zero if its a small ** packet. */ if (plen) { - mp = rxr->rx_buffers[i].m_pack; mp->m_len = plen; mp->m_next = NULL; mp->m_flags &= ~M_PKTHDR; mh->m_next = mp; - mh->m_flags |= M_PKTHDR; - dopayload = IXGBE_CLEAN_ALL; + mh->m_pkthdr.len += mp->m_len; + /* Null this so getbuf replenishes */ + rxr->rx_buffers[i].m_pack = NULL; rxr->rx_split_packets++; - } else { /* small packets */ - mh->m_flags &= ~M_PKTHDR; - mh->m_next = NULL; + } + /* Setup the forward chain */ + if (eop == 0) { + nh = rxr->rx_buffers[nextp].m_head; + np = rxr->rx_buffers[nextp].m_pack; + nh->m_nextpkt = mh; + if (plen) + mp->m_next = np; + else + mh->m_next = np; + } else { + sendmp = mh; + if (staterr & IXGBE_RXD_STAT_VP) { + sendmp->m_pkthdr.ether_vtag = vtag; + sendmp->m_flags |= M_VLANTAG; + } } } else { /* ** Either no header split, or a ** secondary piece of a fragmented - ** split packet. + ** packet. */ - mh = rxr->rx_buffers[i].m_pack; - mh->m_flags |= M_PKTHDR; - mh->m_len = le16toh(cur->wb.upper.length); - dopayload = IXGBE_CLEAN_PKT; + mp->m_len = le16toh(cur->wb.upper.length); + rxr->rx_buffers[i].m_pack = NULL; + /* stored head pointer */ + sendmp = mh->m_nextpkt; + if (sendmp != NULL) { + sendmp->m_pkthdr.len += mp->m_len; + sendmp->m_nextpkt = NULL; + } else { + /* first desc of a non-ps chain */ + sendmp = mp; + sendmp->m_flags |= M_PKTHDR; + sendmp->m_pkthdr.len = mp->m_len; + if (staterr & IXGBE_RXD_STAT_VP) { + sendmp->m_pkthdr.ether_vtag = vtag; + sendmp->m_flags |= M_VLANTAG; + } + } + /* Carry head forward */ + if (eop == 0) { + nh = rxr->rx_buffers[nextp].m_head; + np = rxr->rx_buffers[nextp].m_pack; + nh->m_nextpkt = sendmp; + mp->m_next = np; + sendmp = NULL; + } + mh->m_nextpkt = NULL; } - if (staterr & IXGBE_RXD_STAT_EOP) { - count--; - eop = 1; - } else - eop = 0; - -#ifdef IXGBE_IEEE1588 - This code needs to be converted to work here - ----------------------------------------------------- - if (unlikely(staterr & IXGBE_RXD_STAT_TS)) { - u64 regval; - u64 ns; -// Create an mtag and set it up - struct skb_shared_hwtstamps *shhwtstamps = - skb_hwtstamps(skb); - - rd32(IXGBE_TSYNCRXCTL) & IXGBE_TSYNCRXCTL_VALID), - "igb: no RX time stamp available for time stamped packet"); - regval = rd32(IXGBE_RXSTMPL); - regval |= (u64)rd32(IXGBE_RXSTMPH) << 32; -// Do time conversion from the register - ns = timecounter_cyc2time(&adapter->clock, regval); - clocksync_update(&adapter->sync, ns); - memset(shhwtstamps, 0, sizeof(*shhwtstamps)); - shhwtstamps->hwtstamp = ns_to_ktime(ns); - shhwtstamps->syststamp = - clocksync_hw2sys(&adapter->sync, ns); - } -#endif - if (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) - accept_frame = 0; + accept_frame = FALSE; if (accept_frame) { - /* - ** Save the vlan id, because get_buf will - ** clobber the writeback descriptor... - */ - vtag = le16toh(cur->wb.upper.vlan); - if (ixgbe_get_buf(rxr, i, dopayload) != 0) { - ifp->if_iqdrops++; - goto discard; - } - /* Initial frame - setup */ - if (rxr->fmp == NULL) { - mh->m_flags |= M_PKTHDR; - mh->m_pkthdr.len = mh->m_len; - rxr->fmp = mh; /* Store the first mbuf */ - rxr->lmp = mh; - if (mp) { /* Add payload if split */ - mh->m_pkthdr.len += mp->m_len; - rxr->lmp = mh->m_next; - } - } else { - /* Chain mbuf's together */ - mh->m_flags &= ~M_PKTHDR; - rxr->lmp->m_next = mh; - rxr->lmp = rxr->lmp->m_next; - rxr->fmp->m_pkthdr.len += mh->m_len; - } - + ++processed; if (eop) { - rxr->fmp->m_pkthdr.rcvif = ifp; + --count; + sendmp->m_pkthdr.rcvif = ifp; ifp->if_ipackets++; rxr->rx_packets++; /* capture data for AIM */ - rxr->bytes += rxr->fmp->m_pkthdr.len; + rxr->bytes += sendmp->m_pkthdr.len; rxr->rx_bytes += rxr->bytes; if (ifp->if_capenable & IFCAP_RXCSUM) - ixgbe_rx_checksum(staterr, rxr->fmp); + ixgbe_rx_checksum(staterr, sendmp); else - rxr->fmp->m_pkthdr.csum_flags = 0; - if (staterr & IXGBE_RXD_STAT_VP) { - rxr->fmp->m_pkthdr.ether_vtag = vtag; - rxr->fmp->m_flags |= M_VLANTAG; - } + sendmp->m_pkthdr.csum_flags = 0; #if __FreeBSD_version >= 800000 - rxr->fmp->m_pkthdr.flowid = curcpu; - rxr->fmp->m_flags |= M_FLOWID; + /* Get the RSS Hash */ + sendmp->m_pkthdr.flowid = + le16toh(cur->wb.lower.hi_dword.rss); + sendmp->m_flags |= M_FLOWID; #endif - sendmp = rxr->fmp; - rxr->fmp = NULL; - rxr->lmp = NULL; } } else { ifp->if_ierrors++; -discard: /* Reuse loaded DMA map and just update mbuf chain */ - if (hlen) { - mh = rxr->rx_buffers[i].m_head; - mh->m_len = MHLEN; - mh->m_next = NULL; - } - mp = rxr->rx_buffers[i].m_pack; + mh->m_len = MHLEN; + mh->m_flags |= M_PKTHDR; + mh->m_next = NULL; mp->m_len = mp->m_pkthdr.len = adapter->rx_mbuf_sz; mp->m_data = mp->m_ext.ext_buf; + if (mp->m_next) { /* Free chain */ + sendmp = mp->m_next; + m_free(sendmp); + } mp->m_next = NULL; if (adapter->max_frame_size <= (MCLBYTES - ETHER_ALIGN)) m_adj(mp, ETHER_ALIGN); - if (rxr->fmp != NULL) { - /* handles the whole chain */ - m_freem(rxr->fmp); - rxr->fmp = NULL; - rxr->lmp = NULL; - } sendmp = NULL; } bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - rxr->last_cleaned = i; /* for updating tail */ - + rxr->last_refreshed = i; /* for updating tail */ if (++i == adapter->num_rx_desc) i = 0; + /* Prefetch next descriptor */ + cur = &rxr->rx_base[i]; + prefetch(cur); /* ** Now send up to the stack, - ** note the the value of next_to_check - ** is safe because we keep the RX lock - ** thru this call. + ** note that the RX lock is + ** held thru this call. */ if (sendmp != NULL) { /* ** Send to the stack if: - ** - LRO not enabled, or - ** - no LRO resources, or - ** - lro enqueue fails + ** - Soft LRO not enabled, or + ** - no Soft LRO resources, or + ** - soft lro enqueue fails */ if ((!rxr->lro_enabled) || ((!lro->lro_cnt) || (tcp_lro_rx(lro, sendmp, 0)))) (*ifp->if_input)(ifp, sendmp); } - /* Get next descriptor */ - cur = &rxr->rx_base[i]; + /* Replenish every 8 max */ + if (processed == 8) { + ixgbe_get_buf(rxr, rxr->next_to_check, i); + processed = 0; + IXGBE_WRITE_REG(&adapter->hw, + IXGBE_RDT(rxr->me), rxr->last_refreshed); + rxr->next_to_check = i; + } + + /* Next iteration */ staterr = cur->wb.upper.status_error; } - rxr->next_to_check = i; - /* Advance the IXGB's Receive Queue "Tail Pointer" */ - IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDT(rxr->me), rxr->last_cleaned); + /* Replenish remaining work */ + if (processed != 0) { + ixgbe_get_buf(rxr, rxr->next_to_check, i); + processed = 0; + IXGBE_WRITE_REG(&adapter->hw, + IXGBE_RDT(rxr->me), rxr->last_refreshed); + } + + rxr->next_to_check = i; /* * Flush any outstanding LRO work @@ -4092,7 +4353,7 @@ discard: ** then schedule another interrupt. */ if (staterr & IXGBE_RXD_STAT_DD) { - ixgbe_rearm_rx_queues(adapter, (u64)(1 << rxr->msix)); + ixgbe_rearm_queues(adapter, (u64)(1 << rxr->msix)); return TRUE; } @@ -4246,6 +4507,9 @@ ixgbe_enable_intr(struct adapter *adapter) mask |= IXGBE_EIMS_ECC; mask |= IXGBE_EIMS_GPI_SDP1; mask |= IXGBE_EIMS_GPI_SDP2; +#ifdef IXGBE_FDIR + mask |= IXGBE_EIMS_FLOW_DIR; +#endif } IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask); @@ -4437,7 +4701,12 @@ ixgbe_handle_mod(void *context, int pending) "Unsupported SFP+ module type was detected.\n"); return; } - hw->mac.ops.setup_sfp(hw); + err = hw->mac.ops.setup_sfp(hw); + if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { + device_printf(dev, + "Setup failure - unsupported SFP+ module type.\n"); + return; + } taskqueue_enqueue(adapter->tq, &adapter->msf_task); return; } @@ -4452,18 +4721,40 @@ ixgbe_handle_msf(void *context, int pending) struct adapter *adapter = context; struct ixgbe_hw *hw = &adapter->hw; u32 autoneg; + bool negotiate; - if (hw->mac.ops.get_link_capabilities) - hw->mac.ops.get_link_capabilities(hw, &autoneg, - &hw->mac.autoneg); - if (hw->mac.ops.setup_link_speed) - hw->mac.ops.setup_link_speed(hw, autoneg, TRUE, TRUE); - ixgbe_check_link(&adapter->hw, - &adapter->link_speed, &adapter->link_up, 0); + autoneg = hw->phy.autoneg_advertised; + if ((!autoneg) && (hw->mac.ops.get_link_capabilities)) + hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate); + if (hw->mac.ops.setup_link) + hw->mac.ops.setup_link(hw, autoneg, negotiate, TRUE); +#if 0 + ixgbe_check_link(&adapter->hw, &speed, &adapter->link_up, 0); ixgbe_update_link_status(adapter); +#endif return; } +#ifdef IXGBE_FDIR +/* +** Tasklet for reinitializing the Flow Director filter table +*/ +static void +ixgbe_reinit_fdir(void *context, int pending) +{ + struct adapter *adapter = context; + struct ifnet *ifp = adapter->ifp; + + if (adapter->fdir_reinit != 1) /* Shouldn't happen */ + return; + ixgbe_reinit_fdir_tables_82599(&adapter->hw); + adapter->fdir_reinit = 0; + /* Restart the interface */ + ifp->if_drv_flags |= IFF_DRV_RUNNING; + return; +} +#endif + /********************************************************************** * * Update the board statistics counters. @@ -4472,7 +4763,7 @@ ixgbe_handle_msf(void *context, int pending) static void ixgbe_update_stats_counters(struct adapter *adapter) { - struct ifnet *ifp = adapter->ifp;; + struct ifnet *ifp = adapter->ifp; struct ixgbe_hw *hw = &adapter->hw; u32 missed_rx = 0, bprc, lxon, lxoff, total; u64 total_missed_rx = 0; @@ -4484,12 +4775,12 @@ ixgbe_update_stats_counters(struct adapter *adapter) mp = IXGBE_READ_REG(hw, IXGBE_MPC(i)); /* missed_rx tallies misses for the gprc workaround */ missed_rx += mp; + /* global total per queue */ adapter->stats.mpc[i] += mp; /* Running comprehensive total for stats display */ total_missed_rx += adapter->stats.mpc[i]; if (hw->mac.type == ixgbe_mac_82598EB) - adapter->stats.rnbc[i] += - IXGBE_READ_REG(hw, IXGBE_RNBC(i)); + adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); } /* Hardware workaround, gprc counts missed packets */ @@ -4510,7 +4801,7 @@ ixgbe_update_stats_counters(struct adapter *adapter) adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); /* 82598 only has a counter in the high register */ adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH); - adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); + adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GOTCH); adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH); } @@ -4655,6 +4946,8 @@ ixgbe_print_debug_info(struct adapter *adapter) rxr->me, lro->lro_queued); device_printf(dev,"RX(%d) LRO Flushed= %d\n", rxr->me, lro->lro_flushed); + device_printf(dev,"RX(%d) HW LRO Merges= %lu\n", + rxr->me, (long)rxr->rsc_num); } for (int i = 0; i < adapter->num_queues; i++, txr++) { diff --git a/sys/dev/ixgbe/ixgbe.h b/sys/dev/ixgbe/ixgbe.h index 848820a8e956..d52eed3a07e3 100644 --- a/sys/dev/ixgbe/ixgbe.h +++ b/sys/dev/ixgbe/ixgbe.h @@ -134,9 +134,11 @@ #define MAX_LOOP 10 /* - * This parameter controls the duration of transmit watchdog timer. + * This is the max watchdog interval, ie. the time that can + * pass between any two TX clean operations, such only happening + * when the TX hardware is functioning. */ -#define IXGBE_TX_TIMEOUT 5 /* set to 5 seconds */ +#define IXGBE_WATCHDOG (10 * hz) /* * This parameters control when the driver calls the routine to reclaim @@ -148,7 +150,7 @@ #define IXGBE_MAX_FRAME_SIZE 0x3F00 /* Flow control constants */ -#define IXGBE_FC_PAUSE 0x680 +#define IXGBE_FC_PAUSE 0xFFFF #define IXGBE_FC_HI 0x20000 #define IXGBE_FC_LO 0x10000 @@ -174,7 +176,7 @@ #define MSIX_82599_BAR 4 #define IXGBE_TSO_SIZE 65535 #define IXGBE_TX_BUFFER_SIZE ((u32) 1514) -#define IXGBE_RX_HDR 128 +#define IXGBE_RX_HDR 256 #define IXGBE_VFTA_SIZE 128 #define IXGBE_BR_SIZE 4096 #define CSUM_OFFLOAD 7 /* Bits in csum flags */ @@ -253,14 +255,15 @@ struct tx_ring { struct mtx tx_mtx; u32 me; u32 msix; - u32 watchdog_timer; + bool watchdog_check; + int watchdog_time; union ixgbe_adv_tx_desc *tx_base; volatile u32 tx_hwb; struct ixgbe_dma_alloc txdma; struct task tx_task; struct taskqueue *tq; - u32 next_avail_tx_desc; - u32 next_tx_to_clean; + u32 next_avail_desc; + u32 next_to_clean; struct ixgbe_tx_buf *tx_buffers; volatile u16 tx_avail; u32 txd_cmd; @@ -272,7 +275,10 @@ struct tx_ring { /* Interrupt resources */ void *tag; struct resource *res; - +#ifdef IXGBE_FDIR + u16 atr_sample; + u16 atr_count; +#endif /* Soft Stats */ u32 no_tx_desc_avail; u32 no_tx_desc_late; @@ -297,13 +303,12 @@ struct rx_ring { struct lro_ctrl lro; bool lro_enabled; bool hdr_split; - unsigned int last_cleaned; + bool hw_rsc; + unsigned int last_refreshed; unsigned int next_to_check; struct ixgbe_rx_buf *rx_buffers; bus_dma_tag_t rxtag; bus_dmamap_t spare_map; - struct mbuf *fmp; - struct mbuf *lmp; char mtx_name[16]; u32 bytes; /* Used for AIM calc */ @@ -318,6 +323,10 @@ struct rx_ring { u64 rx_split_packets; u64 rx_packets; u64 rx_bytes; + u64 rsc_num; +#ifdef IXGBE_FDIR + u64 flm; +#endif }; /* Our adapter structure */ @@ -349,21 +358,16 @@ struct adapter { eventhandler_tag vlan_attach; eventhandler_tag vlan_detach; - u32 num_vlans; + u16 num_vlans; u16 num_queues; /* Info about the board itself */ - u32 part_num; u32 optics; bool link_active; u16 max_frame_size; u32 link_speed; bool link_up; u32 linkvec; - u32 tx_int_delay; - u32 tx_abs_int_delay; - u32 rx_int_delay; - u32 rx_abs_int_delay; /* Mbuf cluster size */ u32 rx_mbuf_sz; @@ -373,6 +377,10 @@ struct adapter { struct task link_task; /* Link tasklet */ struct task mod_task; /* SFP tasklet */ struct task msf_task; /* Multispeed Fiber tasklet */ +#ifdef IXGBE_FDIR + int fdir_reinit; + struct task fdir_task; +#endif struct taskqueue *tq; /* @@ -423,12 +431,12 @@ struct adapter { #define IXGBE_CORE_LOCK_INIT(_sc, _name) \ mtx_init(&(_sc)->core_mtx, _name, "IXGBE Core Lock", MTX_DEF) #define IXGBE_CORE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->core_mtx) -#define IXGBE_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->tx_mtx) -#define IXGBE_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_mtx) +#define IXGBE_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->tx_mtx) +#define IXGBE_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_mtx) #define IXGBE_CORE_LOCK(_sc) mtx_lock(&(_sc)->core_mtx) -#define IXGBE_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_mtx) -#define IXGBE_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->tx_mtx) -#define IXGBE_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_mtx) +#define IXGBE_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_mtx) +#define IXGBE_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->tx_mtx) +#define IXGBE_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_mtx) #define IXGBE_CORE_UNLOCK(_sc) mtx_unlock(&(_sc)->core_mtx) #define IXGBE_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->tx_mtx) #define IXGBE_RX_UNLOCK(_sc) mtx_unlock(&(_sc)->rx_mtx) diff --git a/sys/dev/ixgbe/ixgbe_82598.c b/sys/dev/ixgbe/ixgbe_82598.c index fb711c621ad5..12711b0a9b4d 100644 --- a/sys/dev/ixgbe/ixgbe_82598.c +++ b/sys/dev/ixgbe/ixgbe_82598.c @@ -44,20 +44,21 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw, bool *autoneg); static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw); s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num); -static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw); +static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw, + bool autoneg_wait_to_complete); static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, ixgbe_link_speed *speed, bool *link_up, bool link_up_wait_to_complete); -static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, +static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); -static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw); -static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw, +static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw); +s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw); s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq); static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq); s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, @@ -70,7 +71,50 @@ s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, u32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw); s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw); void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw); +void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw); +static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw); +/** + * ixgbe_set_pcie_completion_timeout - set pci-e completion timeout + * @hw: pointer to the HW structure + * + * The defaults for 82598 should be in the range of 50us to 50ms, + * however the hardware default for these parts is 500us to 1ms which is less + * than the 10ms recommended by the pci-e spec. To address this we need to + * increase the value to either 10ms to 250ms for capability version 1 config, + * or 16ms to 55ms for version 2. + **/ +void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw) +{ + u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR); + u16 pcie_devctl2; + + /* only take action if timeout value is defaulted to 0 */ + if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK) + goto out; + + /* + * if capababilities version is type 1 we can write the + * timeout of 10ms to 250ms through the GCR register + */ + if (!(gcr & IXGBE_GCR_CAP_VER2)) { + gcr |= IXGBE_GCR_CMPL_TMOUT_10ms; + goto out; + } + + /* + * for version 2 capabilities we need to write the config space + * directly in order to set the completion timeout value for + * 16ms to 55ms + */ + pcie_devctl2 = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2); + pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms; + IXGBE_WRITE_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2); +out: + /* disable completion timeout resend */ + gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND; + IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr); +} /** * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count @@ -83,6 +127,8 @@ u32 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw) { u32 msix_count = 18; + DEBUGFUNC("ixgbe_get_pcie_msix_count_82598"); + if (hw->mac.msix_vectors_from_pcie) { msix_count = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCIE_MSIX_82598_CAPS); @@ -108,6 +154,8 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw) struct ixgbe_phy_info *phy = &hw->phy; s32 ret_val; + DEBUGFUNC("ixgbe_init_ops_82598"); + ret_val = ixgbe_init_phy_ops_generic(hw); ret_val = ixgbe_init_ops_generic(hw); @@ -115,6 +163,7 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw) phy->ops.init = &ixgbe_init_phy_ops_82598; /* MAC */ + mac->ops.start_hw = &ixgbe_start_hw_82598; mac->ops.reset_hw = &ixgbe_reset_hw_82598; mac->ops.get_media_type = &ixgbe_get_media_type_82598; mac->ops.get_supported_physical_layer = @@ -145,7 +194,6 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw) /* Link */ mac->ops.check_link = &ixgbe_check_mac_link_82598; mac->ops.setup_link = &ixgbe_setup_mac_link_82598; - mac->ops.setup_link_speed = &ixgbe_setup_mac_link_speed_82598; mac->ops.get_link_capabilities = &ixgbe_get_link_capabilities_82598; @@ -168,6 +216,7 @@ s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw) s32 ret_val = IXGBE_SUCCESS; u16 list_offset, data_offset; + DEBUGFUNC("ixgbe_init_phy_ops_82598"); /* Identify the PHY */ phy->ops.identify(hw); @@ -175,21 +224,20 @@ s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw) /* Overwrite the link function pointers if copper PHY */ if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { mac->ops.setup_link = &ixgbe_setup_copper_link_82598; - mac->ops.setup_link_speed = - &ixgbe_setup_copper_link_speed_82598; mac->ops.get_link_capabilities = &ixgbe_get_copper_link_capabilities_generic; } switch (hw->phy.type) { case ixgbe_phy_tn: + phy->ops.setup_link = &ixgbe_setup_phy_link_tnx; phy->ops.check_link = &ixgbe_check_phy_link_tnx; phy->ops.get_firmware_version = &ixgbe_get_phy_firmware_version_tnx; break; case ixgbe_phy_aq: phy->ops.get_firmware_version = - &ixgbe_get_phy_firmware_version_aq; + &ixgbe_get_phy_firmware_version_generic; break; case ixgbe_phy_nl: phy->ops.reset = &ixgbe_reset_phy_nl; @@ -220,6 +268,46 @@ out: return ret_val; } +/** + * ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx + * @hw: pointer to hardware structure + * + * Starts the hardware using the generic start_hw function. + * Then set pcie completion timeout + **/ +s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw) +{ + u32 regval; + u32 i; + s32 ret_val = IXGBE_SUCCESS; + + DEBUGFUNC("ixgbe_start_hw_82598"); + + ret_val = ixgbe_start_hw_generic(hw); + + /* Disable relaxed ordering */ + for (i = 0; ((i < hw->mac.max_tx_queues) && + (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { + regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); + regval &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval); + } + + for (i = 0; ((i < hw->mac.max_rx_queues) && + (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) { + regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); + regval &= ~(IXGBE_DCA_RXCTRL_DESC_WRO_EN | + IXGBE_DCA_RXCTRL_DESC_HSRO_EN); + IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); + } + + /* set the completion timeout for interface */ + if (ret_val == IXGBE_SUCCESS) + ixgbe_set_pcie_completion_timeout(hw); + + return ret_val; +} + /** * ixgbe_get_link_capabilities_82598 - Determines link capabilities * @hw: pointer to hardware structure @@ -235,6 +323,8 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw, s32 status = IXGBE_SUCCESS; u32 autoc = 0; + DEBUGFUNC("ixgbe_get_link_capabilities_82598"); + /* * Determine link capabilities based on the stored value of AUTOC, * which represents EEPROM defaults. If AUTOC value has not been @@ -289,6 +379,8 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw) { enum ixgbe_media_type media_type; + DEBUGFUNC("ixgbe_get_media_type_82598"); + /* Detect if there is a copper PHY attached. */ if (hw->phy.type == ixgbe_phy_cu_unknown || hw->phy.type == ixgbe_phy_tn || @@ -306,15 +398,18 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw) break; case IXGBE_DEV_ID_82598AF_DUAL_PORT: case IXGBE_DEV_ID_82598AF_SINGLE_PORT: - case IXGBE_DEV_ID_82598EB_CX4: - case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: case IXGBE_DEV_ID_82598_DA_DUAL_PORT: case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: case IXGBE_DEV_ID_82598EB_XF_LR: case IXGBE_DEV_ID_82598EB_SFP_LOM: media_type = ixgbe_media_type_fiber; break; + case IXGBE_DEV_ID_82598EB_CX4: + case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: + media_type = ixgbe_media_type_cx4; + break; case IXGBE_DEV_ID_82598AT: + case IXGBE_DEV_ID_82598AT2: media_type = ixgbe_media_type_copper; break; default: @@ -338,9 +433,23 @@ s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num) u32 fctrl_reg; u32 rmcs_reg; u32 reg; + u32 link_speed = 0; + bool link_up; DEBUGFUNC("ixgbe_fc_enable_82598"); + /* + * On 82598 backplane having FC on causes resets while doing + * KX, so turn off here. + */ + hw->mac.ops.check_link(hw, &link_speed, &link_up, FALSE); + if (link_up && + link_speed == IXGBE_LINK_SPEED_1GB_FULL && + hw->mac.ops.get_media_type(hw) == ixgbe_media_type_backplane) { + hw->fc.disable_fc_autoneg = TRUE; + hw->fc.requested_mode = ixgbe_fc_none; + } + /* Negotiate the fc mode to use */ ret_val = ixgbe_fc_autoneg(hw); if (ret_val) @@ -394,7 +503,7 @@ s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num) break; default: DEBUGOUT("Flow control param set incorrectly\n"); - ret_val = -IXGBE_ERR_CONFIG; + ret_val = IXGBE_ERR_CONFIG; goto out; break; } @@ -433,26 +542,29 @@ out: } /** - * ixgbe_setup_mac_link_82598 - Configures MAC link settings + * ixgbe_start_mac_link_82598 - Configures MAC link settings * @hw: pointer to hardware structure * * Configures link settings based on values in the ixgbe_hw struct. * Restarts the link. Performs autonegotiation if needed. **/ -static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw) +static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw, + bool autoneg_wait_to_complete) { u32 autoc_reg; u32 links_reg; u32 i; s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_start_mac_link_82598"); + /* Restart link */ autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); autoc_reg |= IXGBE_AUTOC_AN_RESTART; IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); /* Only poll for autoneg to complete if specified to do so */ - if (hw->phy.autoneg_wait_to_complete) { + if (autoneg_wait_to_complete) { if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) == IXGBE_AUTOC_LMS_KX4_AN || (autoc_reg & IXGBE_AUTOC_LMS_MASK) == @@ -494,6 +606,8 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, u32 i; u16 link_reg, adapt_comp_reg; + DEBUGFUNC("ixgbe_check_mac_link_82598"); + /* * SERDES PHY requires us to read link status from undocumented * register 0xC79F. Bit 0 set indicates link is up/ready; clear @@ -558,17 +672,22 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, else *speed = IXGBE_LINK_SPEED_1GB_FULL; + if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && (*link_up == TRUE) && + (ixgbe_validate_link_ready(hw) != IXGBE_SUCCESS)) + *link_up = FALSE; + /* if link is down, zero out the current_mode */ if (*link_up == FALSE) { hw->fc.current_mode = ixgbe_fc_none; hw->fc.fc_was_autonegged = FALSE; } + out: return IXGBE_SUCCESS; } /** - * ixgbe_setup_mac_link_speed_82598 - Set MAC link speed + * ixgbe_setup_mac_link_82598 - Set MAC link speed * @hw: pointer to hardware structure * @speed: new link speed * @autoneg: TRUE if autonegotiation enabled @@ -576,7 +695,7 @@ out: * * Set the link speed in the AUTOC register and restarts link. **/ -static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, +static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) { @@ -586,6 +705,8 @@ static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, u32 autoc = curr_autoc; u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; + DEBUGFUNC("ixgbe_setup_mac_link_82598"); + /* Check to see if speed passed in is supported. */ ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg); speed &= link_capabilities; @@ -606,14 +727,13 @@ static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, } if (status == IXGBE_SUCCESS) { - hw->phy.autoneg_wait_to_complete = autoneg_wait_to_complete; - /* * Setup and restart the link based on the new values in * ixgbe_hw This will write the AUTOC register based on the new * stored values */ - status = ixgbe_setup_mac_link_82598(hw); + status = ixgbe_start_mac_link_82598(hw, + autoneg_wait_to_complete); } return status; @@ -621,29 +741,7 @@ static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw, /** - * ixgbe_setup_copper_link_82598 - Setup copper link settings - * @hw: pointer to hardware structure - * - * Configures link settings based on values in the ixgbe_hw struct. - * Restarts the link. Performs autonegotiation if needed. Restart - * phy and wait for autonegotiate to finish. Then synchronize the - * MAC and PHY. - **/ -static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw) -{ - s32 status; - - /* Restart autonegotiation on PHY */ - status = hw->phy.ops.setup_link(hw); - - /* Set up MAC */ - ixgbe_setup_mac_link_82598(hw); - - return status; -} - -/** - * ixgbe_setup_copper_link_speed_82598 - Set the PHY autoneg advertised field + * ixgbe_setup_copper_link_82598 - Set the PHY autoneg advertised field * @hw: pointer to hardware structure * @speed: new link speed * @autoneg: TRUE if autonegotiation enabled @@ -651,18 +749,20 @@ static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw) * * Sets the link speed in the AUTOC register in the MAC and restarts link. **/ -static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw, +static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) { s32 status; + DEBUGFUNC("ixgbe_setup_copper_link_82598"); + /* Setup the PHY according to input speed */ status = hw->phy.ops.setup_link_speed(hw, speed, autoneg, autoneg_wait_to_complete); /* Set up MAC */ - ixgbe_setup_mac_link_82598(hw); + ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete); return status; } @@ -685,6 +785,8 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw) u32 autoc; u8 analog_val; + DEBUGFUNC("ixgbe_reset_hw_82598"); + /* Call adapter stop to disable tx/rx and clear interrupts */ hw->mac.ops.stop_adapter(hw); @@ -811,6 +913,8 @@ s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq) { u32 rar_high; + DEBUGFUNC("ixgbe_set_vmdq_82598"); + rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); rar_high &= ~IXGBE_RAH_VIND_MASK; rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK); @@ -861,6 +965,8 @@ s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind, u32 bits; u32 vftabyte; + DEBUGFUNC("ixgbe_set_vfta_82598"); + if (vlan > 4095) return IXGBE_ERR_PARAM; @@ -903,6 +1009,8 @@ static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw) u32 offset; u32 vlanbyte; + DEBUGFUNC("ixgbe_clear_vfta_82598"); + for (offset = 0; offset < hw->mac.vft_size; offset++) IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0); @@ -926,6 +1034,8 @@ s32 ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 *val) { u32 atlas_ctl; + DEBUGFUNC("ixgbe_read_analog_reg8_82598"); + IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, IXGBE_ATLASCTL_WRITE_CMD | (reg << 8)); IXGBE_WRITE_FLUSH(hw); @@ -948,6 +1058,8 @@ s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val) { u32 atlas_ctl; + DEBUGFUNC("ixgbe_write_analog_reg8_82598"); + atlas_ctl = (reg << 8) | val; IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, atlas_ctl); IXGBE_WRITE_FLUSH(hw); @@ -973,6 +1085,8 @@ s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, u16 sfp_stat = 0; u32 i; + DEBUGFUNC("ixgbe_read_i2c_eeprom_82598"); + if (hw->phy.type == ixgbe_phy_nl) { /* * NetLogic phy SDA/SCL registers are at addresses 0xC30A to @@ -1032,6 +1146,8 @@ u32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw) u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; u16 ext_ability = 0; + DEBUGFUNC("ixgbe_get_supported_physical_layer_82598"); + hw->phy.ops.identify(hw); /* Copper PHY must be checked before AUTOC LMS to determine correct @@ -1128,6 +1244,8 @@ void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw) struct ixgbe_bus_info *bus = &hw->bus; u16 pci_gen, pci_ctrl2; + DEBUGFUNC("ixgbe_set_lan_id_multi_port_pcie_82598"); + ixgbe_set_lan_id_multi_port_pcie(hw); /* check if LAN0 is disabled */ @@ -1146,4 +1264,38 @@ void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw) } } +/** + * ixgbe_validate_link_ready - Function looks for phy link + * @hw: pointer to hardware structure + * + * Function indicates success when phy link is available. If phy is not ready + * within 5 seconds of MAC indicating link, the function returns error. + **/ +static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw) +{ + u32 timeout; + u16 an_reg; + + if (hw->device_id != IXGBE_DEV_ID_82598AT2) + return IXGBE_SUCCESS; + + for (timeout = 0; + timeout < IXGBE_VALIDATE_LINK_READY_TIMEOUT; timeout++) { + hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &an_reg); + + if ((an_reg & IXGBE_MII_AUTONEG_COMPLETE) && + (an_reg & IXGBE_MII_AUTONEG_LINK_UP)) + break; + + msec_delay(100); + } + + if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) { + DEBUGOUT("Link was indicated but link is down\n"); + return IXGBE_ERR_LINK_SETUP; + } + + return IXGBE_SUCCESS; +} diff --git a/sys/dev/ixgbe/ixgbe_82599.c b/sys/dev/ixgbe/ixgbe_82599.c index c3d23afde550..97b655a26ac7 100644 --- a/sys/dev/ixgbe/ixgbe_82599.c +++ b/sys/dev/ixgbe/ixgbe_82599.c @@ -37,39 +37,30 @@ #include "ixgbe_common.h" #include "ixgbe_phy.h" -u32 ixgbe_get_pcie_msix_count_82599(struct ixgbe_hw *hw); s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw); s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, ixgbe_link_speed *speed, bool *autoneg); enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw); -s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw); -s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, +s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); -s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw); -s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, - ixgbe_link_speed *speed, - bool *link_up, bool link_up_wait_to_complete); -s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, +s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw, + ixgbe_link_speed speed, bool autoneg, + bool autoneg_wait_to_complete); +s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, + bool autoneg_wait_to_complete); +s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); -static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw); -static s32 ixgbe_setup_copper_link_speed_82599(struct ixgbe_hw *hw, +static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw); void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw); s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw); -s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq); -s32 ixgbe_clear_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq); -s32 ixgbe_insert_mac_addr_82599(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); -s32 ixgbe_set_vfta_82599(struct ixgbe_hw *hw, u32 vlan, - u32 vind, bool vlan_on); -s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw); -s32 ixgbe_init_uta_tables_82599(struct ixgbe_hw *hw); s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val); s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val); s32 ixgbe_start_hw_rev_1_82599(struct ixgbe_hw *hw); @@ -77,14 +68,9 @@ s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw); s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw); u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw); s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval); -s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw, - u16 *san_mac_offset); -s32 ixgbe_get_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr); -s32 ixgbe_set_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr); s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps); static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw); - void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) { struct ixgbe_mac_info *mac = &hw->mac; @@ -93,15 +79,14 @@ void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) if (hw->phy.multispeed_fiber) { /* Set up dual speed SFP+ support */ - mac->ops.setup_link = - &ixgbe_setup_mac_link_multispeed_fiber; - mac->ops.setup_link_speed = - &ixgbe_setup_mac_link_speed_multispeed_fiber; + mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; } else { - mac->ops.setup_link = - &ixgbe_setup_mac_link_82599; - mac->ops.setup_link_speed = - &ixgbe_setup_mac_link_speed_82599; + if ((ixgbe_get_media_type(hw) == ixgbe_media_type_backplane) && + (hw->phy.smart_speed == ixgbe_smart_speed_auto || + hw->phy.smart_speed == ixgbe_smart_speed_on)) + mac->ops.setup_link = &ixgbe_setup_mac_link_smartspeed; + else + mac->ops.setup_link = &ixgbe_setup_mac_link_82599; } } @@ -135,8 +120,6 @@ s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) /* If copper media, overwrite with copper function pointers */ if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) { mac->ops.setup_link = &ixgbe_setup_copper_link_82599; - mac->ops.setup_link_speed = - &ixgbe_setup_copper_link_speed_82599; mac->ops.get_link_capabilities = &ixgbe_get_copper_link_capabilities_generic; } @@ -144,13 +127,14 @@ s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) /* Set necessary function pointers based on phy type */ switch (hw->phy.type) { case ixgbe_phy_tn: + phy->ops.setup_link = &ixgbe_setup_phy_link_tnx; phy->ops.check_link = &ixgbe_check_phy_link_tnx; phy->ops.get_firmware_version = &ixgbe_get_phy_firmware_version_tnx; break; case ixgbe_phy_aq: phy->ops.get_firmware_version = - &ixgbe_get_phy_firmware_version_aq; + &ixgbe_get_phy_firmware_version_generic; break; default: break; @@ -203,30 +187,6 @@ setup_sfp_out: return ret_val; } -/** - * ixgbe_get_pcie_msix_count_82599 - Gets MSI-X vector count - * @hw: pointer to hardware structure - * - * Read PCIe configuration space, and get the MSI-X vector count from - * the capabilities table. - **/ -u32 ixgbe_get_pcie_msix_count_82599(struct ixgbe_hw *hw) -{ - u32 msix_count = 64; - - if (hw->mac.msix_vectors_from_pcie) { - msix_count = IXGBE_READ_PCIE_WORD(hw, - IXGBE_PCIE_MSIX_82599_CAPS); - msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK; - - /* MSI-X count is zero-based in HW, so increment to give - * proper value */ - msix_count++; - } - - return msix_count; -} - /** * ixgbe_init_ops_82599 - Inits func ptrs and MAC type * @hw: pointer to hardware structure @@ -241,6 +201,8 @@ s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw) struct ixgbe_phy_info *phy = &hw->phy; s32 ret_val; + DEBUGFUNC("ixgbe_init_ops_82599"); + ret_val = ixgbe_init_phy_ops_generic(hw); ret_val = ixgbe_init_ops_generic(hw); @@ -257,23 +219,24 @@ s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw) mac->ops.read_analog_reg8 = &ixgbe_read_analog_reg8_82599; mac->ops.write_analog_reg8 = &ixgbe_write_analog_reg8_82599; mac->ops.start_hw = &ixgbe_start_hw_rev_1_82599; - mac->ops.get_san_mac_addr = &ixgbe_get_san_mac_addr_82599; - mac->ops.set_san_mac_addr = &ixgbe_set_san_mac_addr_82599; + mac->ops.get_san_mac_addr = &ixgbe_get_san_mac_addr_generic; + mac->ops.set_san_mac_addr = &ixgbe_set_san_mac_addr_generic; mac->ops.get_device_caps = &ixgbe_get_device_caps_82599; + mac->ops.get_wwn_prefix = &ixgbe_get_wwn_prefix_generic; /* RAR, Multicast, VLAN */ - mac->ops.set_vmdq = &ixgbe_set_vmdq_82599; - mac->ops.clear_vmdq = &ixgbe_clear_vmdq_82599; - mac->ops.insert_mac_addr = &ixgbe_insert_mac_addr_82599; + mac->ops.set_vmdq = &ixgbe_set_vmdq_generic; + mac->ops.clear_vmdq = &ixgbe_clear_vmdq_generic; + mac->ops.insert_mac_addr = &ixgbe_insert_mac_addr_generic; mac->rar_highwater = 1; - mac->ops.set_vfta = &ixgbe_set_vfta_82599; - mac->ops.clear_vfta = &ixgbe_clear_vfta_82599; - mac->ops.init_uta_tables = &ixgbe_init_uta_tables_82599; + mac->ops.set_vfta = &ixgbe_set_vfta_generic; + mac->ops.clear_vfta = &ixgbe_clear_vfta_generic; + mac->ops.init_uta_tables = &ixgbe_init_uta_tables_generic; mac->ops.setup_sfp = &ixgbe_setup_sfp_modules_82599; /* Link */ mac->ops.get_link_capabilities = &ixgbe_get_link_capabilities_82599; - mac->ops.check_link = &ixgbe_check_mac_link_82599; + mac->ops.check_link = &ixgbe_check_mac_link_generic; ixgbe_init_mac_link_ops_82599(hw); mac->mcft_size = 128; @@ -281,7 +244,7 @@ s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw) mac->num_rar_entries = 128; mac->max_tx_queues = 128; mac->max_rx_queues = 128; - mac->max_msix_vectors = ixgbe_get_pcie_msix_count_82599(hw); + mac->max_msix_vectors = ixgbe_get_pcie_msix_count_generic(hw); return ret_val; @@ -302,6 +265,8 @@ s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw, s32 status = IXGBE_SUCCESS; u32 autoc = 0; + DEBUGFUNC("ixgbe_get_link_capabilities_82599"); + /* * Determine link capabilities based on the stored value of AUTOC, * which represents EEPROM defaults. If AUTOC value has not @@ -387,6 +352,8 @@ enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) { enum ixgbe_media_type media_type; + DEBUGFUNC("ixgbe_get_media_type_82599"); + /* Detect if there is a copper PHY attached. */ if (hw->phy.type == ixgbe_phy_cu_unknown || hw->phy.type == ixgbe_phy_tn || @@ -397,6 +364,8 @@ enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) switch (hw->device_id) { case IXGBE_DEV_ID_82599_KX4: + case IXGBE_DEV_ID_82599_KX4_MEZZ: + case IXGBE_DEV_ID_82599_COMBO_BACKPLANE: case IXGBE_DEV_ID_82599_XAUI_LOM: /* Default device ID is mezzanine card KX/KX4 */ media_type = ixgbe_media_type_backplane; @@ -405,7 +374,7 @@ enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw) media_type = ixgbe_media_type_fiber; break; case IXGBE_DEV_ID_82599_CX4: - media_type = ixgbe_media_type_fiber; + media_type = ixgbe_media_type_cx4; break; default: media_type = ixgbe_media_type_unknown; @@ -416,19 +385,22 @@ out: } /** - * ixgbe_setup_mac_link_82599 - Setup MAC link settings + * ixgbe_start_mac_link_82599 - Setup MAC link settings * @hw: pointer to hardware structure * * Configures link settings based on values in the ixgbe_hw struct. * Restarts the link. Performs autonegotiation if needed. **/ -s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw) +s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, + bool autoneg_wait_to_complete) { u32 autoc_reg; u32 links_reg; u32 i; s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_start_mac_link_82599"); + /* Restart link */ autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); @@ -436,7 +408,7 @@ s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw) IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); /* Only poll for autoneg to complete if specified to do so */ - if (hw->phy.autoneg_wait_to_complete) { + if (autoneg_wait_to_complete) { if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) == IXGBE_AUTOC_LMS_KX4_KX_KR || (autoc_reg & IXGBE_AUTOC_LMS_MASK) == @@ -464,27 +436,7 @@ s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw) } /** - * ixgbe_setup_mac_link_multispeed_fiber - Setup MAC link settings - * @hw: pointer to hardware structure - * - * Configures link settings based on values in the ixgbe_hw struct. - * Restarts the link for multi-speed fiber at 1G speed, if link - * fails at 10G. - * Performs autonegotiation if needed. - **/ -s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw) -{ - s32 status = IXGBE_SUCCESS; - ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_82599_AUTONEG; - DEBUGFUNC("ixgbe_setup_mac_link_multispeed_fiber"); - - status = ixgbe_setup_mac_link_speed_multispeed_fiber(hw, - link_speed, TRUE, true); - return status; -} - -/** - * ixgbe_setup_mac_link_speed_multispeed_fiber - Set MAC link speed + * ixgbe_setup_mac_link_multispeed_fiber - Set MAC link speed * @hw: pointer to hardware structure * @speed: new link speed * @autoneg: TRUE if autonegotiation enabled @@ -492,7 +444,7 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw) * * Set the link speed in the AUTOC register and restarts link. **/ -s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, +s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) { @@ -505,22 +457,15 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, bool link_up = FALSE; bool negotiation; + DEBUGFUNC("ixgbe_setup_mac_link_multispeed_fiber"); + /* Mask off requested but non-supported speeds */ status = ixgbe_get_link_capabilities(hw, &link_speed, &negotiation); if (status != IXGBE_SUCCESS) - goto out; + return status; speed &= link_speed; - /* Set autoneg_advertised value based on input link speed */ - hw->phy.autoneg_advertised = 0; - - if (speed & IXGBE_LINK_SPEED_10GB_FULL) - hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL; - - if (speed & IXGBE_LINK_SPEED_1GB_FULL) - hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; - /* * When the driver changes the link speeds that it can support, * it sets autotry_restart to TRUE to indicate that we need to @@ -542,7 +487,7 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, /* If we already have link at this speed, just jump out */ status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE); if (status != IXGBE_SUCCESS) - goto out; + return status; if ((link_speed == IXGBE_LINK_SPEED_10GB_FULL) && link_up) goto out; @@ -554,11 +499,11 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, /* Allow module to change analog characteristics (1G->10G) */ msec_delay(40); - status = ixgbe_setup_mac_link_speed_82599( + status = ixgbe_setup_mac_link_82599( hw, IXGBE_LINK_SPEED_10GB_FULL, autoneg, autoneg_wait_to_complete); if (status != IXGBE_SUCCESS) - goto out; + return status; /* Flap the tx laser if it has not already been done */ if (hw->mac.autotry_restart) { @@ -575,7 +520,11 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, hw->mac.autotry_restart = FALSE; } - /* The controller may take up to 500ms at 10g to acquire link */ + /* + * Wait for the controller to acquire link. Per IEEE 802.3ap, + * Section 73.10.2, we may have to wait up to 500ms if KR is + * attempted. 82599 uses the same timing for 10g SFI. + */ for (i = 0; i < 5; i++) { /* Wait for the link partner to also set speed */ msec_delay(100); @@ -584,7 +533,7 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE); if (status != IXGBE_SUCCESS) - goto out; + return status; if (link_up) goto out; @@ -599,7 +548,7 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, /* If we already have link at this speed, just jump out */ status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE); if (status != IXGBE_SUCCESS) - goto out; + return status; if ((link_speed == IXGBE_LINK_SPEED_1GB_FULL) && link_up) goto out; @@ -612,11 +561,11 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, /* Allow module to change analog characteristics (10G->1G) */ msec_delay(40); - status = ixgbe_setup_mac_link_speed_82599( + status = ixgbe_setup_mac_link_82599( hw, IXGBE_LINK_SPEED_1GB_FULL, autoneg, autoneg_wait_to_complete); if (status != IXGBE_SUCCESS) - goto out; + return status; /* Flap the tx laser if it has not already been done */ if (hw->mac.autotry_restart) { @@ -639,7 +588,7 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, /* If we have link, just jump out */ status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE); if (status != IXGBE_SUCCESS) - goto out; + return status; if (link_up) goto out; @@ -651,67 +600,134 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, * single highest speed that the user requested. */ if (speedcnt > 1) - status = ixgbe_setup_mac_link_speed_multispeed_fiber(hw, + status = ixgbe_setup_mac_link_multispeed_fiber(hw, highest_link_speed, autoneg, autoneg_wait_to_complete); +out: + /* Set autoneg_advertised value based on input link speed */ + hw->phy.autoneg_advertised = 0; + + if (speed & IXGBE_LINK_SPEED_10GB_FULL) + hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL; + + if (speed & IXGBE_LINK_SPEED_1GB_FULL) + hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; + + return status; +} + +/** + * ixgbe_setup_mac_link_smartspeed - Set MAC link speed using SmartSpeed + * @hw: pointer to hardware structure + * @speed: new link speed + * @autoneg: TRUE if autonegotiation enabled + * @autoneg_wait_to_complete: TRUE when waiting for completion is needed + * + * Implements the Intel SmartSpeed algorithm. + **/ +s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw, + ixgbe_link_speed speed, bool autoneg, + bool autoneg_wait_to_complete) +{ + s32 status = IXGBE_SUCCESS; + ixgbe_link_speed link_speed; + s32 i, j; + bool link_up = FALSE; + u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); + + DEBUGFUNC("ixgbe_setup_mac_link_smartspeed"); + + /* Set autoneg_advertised value based on input link speed */ + hw->phy.autoneg_advertised = 0; + + if (speed & IXGBE_LINK_SPEED_10GB_FULL) + hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL; + + if (speed & IXGBE_LINK_SPEED_1GB_FULL) + hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; + + if (speed & IXGBE_LINK_SPEED_100_FULL) + hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL; + + /* + * Implement Intel SmartSpeed algorithm. SmartSpeed will reduce the + * autoneg advertisement if link is unable to be established at the + * highest negotiated rate. This can sometimes happen due to integrity + * issues with the physical media connection. + */ + + /* First, try to get link with full advertisement */ + hw->phy.smart_speed_active = FALSE; + for (j = 0; j < IXGBE_SMARTSPEED_MAX_RETRIES; j++) { + status = ixgbe_setup_mac_link_82599(hw, speed, autoneg, + autoneg_wait_to_complete); + if (status != IXGBE_SUCCESS) + goto out; + + /* + * Wait for the controller to acquire link. Per IEEE 802.3ap, + * Section 73.10.2, we may have to wait up to 500ms if KR is + * attempted, or 200ms if KX/KX4/BX/BX4 is attempted, per + * Table 9 in the AN MAS. + */ + for (i = 0; i < 5; i++) { + msec_delay(100); + + /* If we have link, just jump out */ + status = ixgbe_check_link(hw, &link_speed, &link_up, + FALSE); + if (status != IXGBE_SUCCESS) + goto out; + + if (link_up) + goto out; + } + } + + /* + * We didn't get link. If we advertised KR plus one of KX4/KX + * (or BX4/BX), then disable KR and try again. + */ + if (((autoc_reg & IXGBE_AUTOC_KR_SUPP) == 0) || + ((autoc_reg & IXGBE_AUTOC_KX4_KX_SUPP_MASK) == 0)) + goto out; + + /* Turn SmartSpeed on to disable KR support */ + hw->phy.smart_speed_active = TRUE; + status = ixgbe_setup_mac_link_82599(hw, speed, autoneg, + autoneg_wait_to_complete); + if (status != IXGBE_SUCCESS) + goto out; + + /* + * Wait for the controller to acquire link. 600ms will allow for + * the AN link_fail_inhibit_timer as well for multiple cycles of + * parallel detect, both 10g and 1g. This allows for the maximum + * connect attempts as defined in the AN MAS table 73-7. + */ + for (i = 0; i < 6; i++) { + msec_delay(100); + + /* If we have link, just jump out */ + status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE); + if (status != IXGBE_SUCCESS) + goto out; + + if (link_up) + goto out; + } + + /* We didn't get link. Turn SmartSpeed back off. */ + hw->phy.smart_speed_active = FALSE; + status = ixgbe_setup_mac_link_82599(hw, speed, autoneg, + autoneg_wait_to_complete); + out: return status; } /** - * ixgbe_check_mac_link_82599 - Determine link and speed status - * @hw: pointer to hardware structure - * @speed: pointer to link speed - * @link_up: TRUE when link is up - * @link_up_wait_to_complete: bool used to wait for link up or not - * - * Reads the links register to determine if link is up and the current speed - **/ -s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed *speed, - bool *link_up, bool link_up_wait_to_complete) -{ - u32 links_reg; - u32 i; - - links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); - if (link_up_wait_to_complete) { - for (i = 0; i < IXGBE_LINK_UP_TIME; i++) { - if (links_reg & IXGBE_LINKS_UP) { - *link_up = TRUE; - break; - } else { - *link_up = FALSE; - } - msec_delay(100); - links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); - } - } else { - if (links_reg & IXGBE_LINKS_UP) - *link_up = TRUE; - else - *link_up = FALSE; - } - - if ((links_reg & IXGBE_LINKS_SPEED_82599) == - IXGBE_LINKS_SPEED_10G_82599) - *speed = IXGBE_LINK_SPEED_10GB_FULL; - else if ((links_reg & IXGBE_LINKS_SPEED_82599) == - IXGBE_LINKS_SPEED_1G_82599) - *speed = IXGBE_LINK_SPEED_1GB_FULL; - else - *speed = IXGBE_LINK_SPEED_100_FULL; - - /* if link is down, zero out the current_mode */ - if (*link_up == FALSE) { - hw->fc.current_mode = ixgbe_fc_none; - hw->fc.fc_was_autonegged = FALSE; - } - - return IXGBE_SUCCESS; -} - -/** - * ixgbe_setup_mac_link_speed_82599 - Set MAC link speed + * ixgbe_setup_mac_link_82599 - Set MAC link speed * @hw: pointer to hardware structure * @speed: new link speed * @autoneg: TRUE if autonegotiation enabled @@ -719,7 +735,7 @@ s32 ixgbe_check_mac_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed *speed, * * Set the link speed in the AUTOC register and restarts link. **/ -s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, +s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) { @@ -735,6 +751,8 @@ s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, u32 i; ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN; + DEBUGFUNC("ixgbe_setup_mac_link_82599"); + /* Check to see if speed passed in is supported. */ status = ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg); if (status != IXGBE_SUCCESS) @@ -761,7 +779,8 @@ s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, if (speed & IXGBE_LINK_SPEED_10GB_FULL) if (orig_autoc & IXGBE_AUTOC_KX4_SUPP) autoc |= IXGBE_AUTOC_KX4_SUPP; - if (orig_autoc & IXGBE_AUTOC_KR_SUPP) + if ((orig_autoc & IXGBE_AUTOC_KR_SUPP) && + (hw->phy.smart_speed_active == FALSE)) autoc |= IXGBE_AUTOC_KR_SUPP; if (speed & IXGBE_LINK_SPEED_1GB_FULL) autoc |= IXGBE_AUTOC_KX_SUPP; @@ -823,26 +842,7 @@ out: } /** - * ixgbe_setup_copper_link_82599 - Setup copper link settings - * @hw: pointer to hardware structure - * - * Restarts the link on PHY and then MAC. Performs autonegotiation if needed. - **/ -static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw) -{ - s32 status; - - /* Restart autonegotiation on PHY */ - status = hw->phy.ops.setup_link(hw); - - /* Set up MAC */ - ixgbe_setup_mac_link_82599(hw); - - return status; -} - -/** - * ixgbe_setup_copper_link_speed_82599 - Set the PHY autoneg advertised field + * ixgbe_setup_copper_link_82599 - Set the PHY autoneg advertised field * @hw: pointer to hardware structure * @speed: new link speed * @autoneg: TRUE if autonegotiation enabled @@ -850,18 +850,20 @@ static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw) * * Restarts link on PHY and MAC based on settings passed in. **/ -static s32 ixgbe_setup_copper_link_speed_82599(struct ixgbe_hw *hw, +static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) { s32 status; + DEBUGFUNC("ixgbe_setup_copper_link_82599"); + /* Setup the PHY according to input speed */ status = hw->phy.ops.setup_link_speed(hw, speed, autoneg, autoneg_wait_to_complete); /* Set up MAC */ - ixgbe_setup_mac_link_82599(hw); + ixgbe_start_mac_link_82599(hw, autoneg_wait_to_complete); return status; } @@ -881,6 +883,8 @@ s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) u32 autoc; u32 autoc2; + DEBUGFUNC("ixgbe_reset_hw_82599"); + /* Call adapter stop to disable tx/rx and clear interrupts */ hw->mac.ops.stop_adapter(hw); @@ -892,7 +896,6 @@ s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) if (status == IXGBE_ERR_SFP_NOT_SUPPORTED) goto reset_hw_out; - /* Setup SFP module if there is one present. */ if (hw->phy.sfp_setup_needed) { status = hw->mac.ops.setup_sfp(hw); @@ -942,8 +945,6 @@ s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) msec_delay(50); - - /* * Store the original AUTOC/AUTOC2 values if they have not been * stored off yet. Otherwise restore the stored original @@ -994,310 +995,14 @@ s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) hw->mac.num_rar_entries--; } + /* Store the alternative WWNN/WWPN prefix */ + hw->mac.ops.get_wwn_prefix(hw, &hw->mac.wwnn_prefix, + &hw->mac.wwpn_prefix); + reset_hw_out: return status; } -/** - * ixgbe_insert_mac_addr_82599 - Find a RAR for this mac address - * @hw: pointer to hardware structure - * @addr: Address to put into receive address register - * @vmdq: VMDq pool to assign - * - * Puts an ethernet address into a receive address register, or - * finds the rar that it is aleady in; adds to the pool list - **/ -s32 ixgbe_insert_mac_addr_82599(struct ixgbe_hw *hw, u8 *addr, u32 vmdq) -{ - static const u32 NO_EMPTY_RAR_FOUND = 0xFFFFFFFF; - u32 first_empty_rar = NO_EMPTY_RAR_FOUND; - u32 rar; - u32 rar_low, rar_high; - u32 addr_low, addr_high; - - /* swap bytes for HW little endian */ - addr_low = addr[0] | (addr[1] << 8) - | (addr[2] << 16) - | (addr[3] << 24); - addr_high = addr[4] | (addr[5] << 8); - - /* - * Either find the mac_id in rar or find the first empty space. - * rar_highwater points to just after the highest currently used - * rar in order to shorten the search. It grows when we add a new - * rar to the top. - */ - for (rar = 0; rar < hw->mac.rar_highwater; rar++) { - rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); - - if (((IXGBE_RAH_AV & rar_high) == 0) - && first_empty_rar == NO_EMPTY_RAR_FOUND) { - first_empty_rar = rar; - } else if ((rar_high & 0xFFFF) == addr_high) { - rar_low = IXGBE_READ_REG(hw, IXGBE_RAL(rar)); - if (rar_low == addr_low) - break; /* found it already in the rars */ - } - } - - if (rar < hw->mac.rar_highwater) { - /* already there so just add to the pool bits */ - ixgbe_set_vmdq(hw, rar, vmdq); - } else if (first_empty_rar != NO_EMPTY_RAR_FOUND) { - /* stick it into first empty RAR slot we found */ - rar = first_empty_rar; - ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV); - } else if (rar == hw->mac.rar_highwater) { - /* add it to the top of the list and inc the highwater mark */ - ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV); - hw->mac.rar_highwater++; - } else if (rar >= hw->mac.num_rar_entries) { - return IXGBE_ERR_INVALID_MAC_ADDR; - } - - /* - * If we found rar[0], make sure the default pool bit (we use pool 0) - * remains cleared to be sure default pool packets will get delivered - */ - if (rar == 0) - ixgbe_clear_vmdq(hw, rar, 0); - - return rar; -} - -/** - * ixgbe_clear_vmdq_82599 - Disassociate a VMDq pool index from a rx address - * @hw: pointer to hardware struct - * @rar: receive address register index to disassociate - * @vmdq: VMDq pool index to remove from the rar - **/ -s32 ixgbe_clear_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) -{ - u32 mpsar_lo, mpsar_hi; - u32 rar_entries = hw->mac.num_rar_entries; - - if (rar < rar_entries) { - mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar)); - mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar)); - - if (!mpsar_lo && !mpsar_hi) - goto done; - - if (vmdq == IXGBE_CLEAR_VMDQ_ALL) { - if (mpsar_lo) { - IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0); - mpsar_lo = 0; - } - if (mpsar_hi) { - IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0); - mpsar_hi = 0; - } - } else if (vmdq < 32) { - mpsar_lo &= ~(1 << vmdq); - IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar_lo); - } else { - mpsar_hi &= ~(1 << (vmdq - 32)); - IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar_hi); - } - - /* was that the last pool using this rar? */ - if (mpsar_lo == 0 && mpsar_hi == 0 && rar != 0) - hw->mac.ops.clear_rar(hw, rar); - } else { - DEBUGOUT1("RAR index %d is out of range.\n", rar); - } - -done: - return IXGBE_SUCCESS; -} - -/** - * ixgbe_set_vmdq_82599 - Associate a VMDq pool index with a rx address - * @hw: pointer to hardware struct - * @rar: receive address register index to associate with a VMDq index - * @vmdq: VMDq pool index - **/ -s32 ixgbe_set_vmdq_82599(struct ixgbe_hw *hw, u32 rar, u32 vmdq) -{ - u32 mpsar; - u32 rar_entries = hw->mac.num_rar_entries; - - if (rar < rar_entries) { - if (vmdq < 32) { - mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar)); - mpsar |= 1 << vmdq; - IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar); - } else { - mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar)); - mpsar |= 1 << (vmdq - 32); - IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar); - } - } else { - DEBUGOUT1("RAR index %d is out of range.\n", rar); - } - return IXGBE_SUCCESS; -} - -/** - * ixgbe_set_vfta_82599 - Set VLAN filter table - * @hw: pointer to hardware structure - * @vlan: VLAN id to write to VLAN filter - * @vind: VMDq output index that maps queue to VLAN id in VFVFB - * @vlan_on: boolean flag to turn on/off VLAN in VFVF - * - * Turn on/off specified VLAN in the VLAN filter table. - **/ -s32 ixgbe_set_vfta_82599(struct ixgbe_hw *hw, u32 vlan, u32 vind, - bool vlan_on) -{ - u32 regindex; - u32 bitindex; - u32 bits; - u32 first_empty_slot; - u32 vt; - - if (vlan > 4095) - return IXGBE_ERR_PARAM; - - /* - * this is a 2 part operation - first the VFTA, then the - * VLVF and VLVFB if VT Mode is set - */ - - /* Part 1 - * The VFTA is a bitstring made up of 128 32-bit registers - * that enable the particular VLAN id, much like the MTA: - * bits[11-5]: which register - * bits[4-0]: which bit in the register - */ - regindex = (vlan >> 5) & 0x7F; - bitindex = vlan & 0x1F; - bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex)); - if (vlan_on) - bits |= (1 << bitindex); - else - bits &= ~(1 << bitindex); - IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits); - - - /* Part 2 - * If VT Mode is set - * Either vlan_on - * make sure the vlan is in VLVF - * set the vind bit in the matching VLVFB - * Or !vlan_on - * clear the pool bit and possibly the vind - */ - vt = IXGBE_READ_REG(hw, IXGBE_VT_CTL); - if (vt & IXGBE_VT_CTL_VT_ENABLE) { - /* find the vlanid or the first empty slot */ - first_empty_slot = 0; - - for (regindex = 1; regindex < IXGBE_VLVF_ENTRIES; regindex++) { - bits = IXGBE_READ_REG(hw, IXGBE_VLVF(regindex)); - if (!bits && !first_empty_slot) - first_empty_slot = regindex; - else if ((bits & 0x0FFF) == vlan) - break; - } - - if (regindex >= IXGBE_VLVF_ENTRIES) { - if (first_empty_slot) - regindex = first_empty_slot; - else { - DEBUGOUT("No space in VLVF.\n"); - goto out; - } - } - - - if (vlan_on) { - /* set the pool bit */ - if (vind < 32) { - bits = IXGBE_READ_REG(hw, - IXGBE_VLVFB(regindex*2)); - bits |= (1 << vind); - IXGBE_WRITE_REG(hw, - IXGBE_VLVFB(regindex*2), - bits); - } else { - bits = IXGBE_READ_REG(hw, - IXGBE_VLVFB((regindex*2)+1)); - bits |= (1 << vind); - IXGBE_WRITE_REG(hw, - IXGBE_VLVFB((regindex*2)+1), - bits); - } - } else { - /* clear the pool bit */ - if (vind < 32) { - bits = IXGBE_READ_REG(hw, - IXGBE_VLVFB(regindex*2)); - bits &= ~(1 << vind); - IXGBE_WRITE_REG(hw, - IXGBE_VLVFB(regindex*2), - bits); - bits |= IXGBE_READ_REG(hw, - IXGBE_VLVFB((regindex*2)+1)); - } else { - bits = IXGBE_READ_REG(hw, - IXGBE_VLVFB((regindex*2)+1)); - bits &= ~(1 << vind); - IXGBE_WRITE_REG(hw, - IXGBE_VLVFB((regindex*2)+1), - bits); - bits |= IXGBE_READ_REG(hw, - IXGBE_VLVFB(regindex*2)); - } - } - - if (bits) - IXGBE_WRITE_REG(hw, IXGBE_VLVF(regindex), - (IXGBE_VLVF_VIEN | vlan)); - else - IXGBE_WRITE_REG(hw, IXGBE_VLVF(regindex), 0); - } -out: - return IXGBE_SUCCESS; -} - -/** - * ixgbe_clear_vfta_82599 - Clear VLAN filter table - * @hw: pointer to hardware structure - * - * Clears the VLAN filer table, and the VMDq index associated with the filter - **/ -s32 ixgbe_clear_vfta_82599(struct ixgbe_hw *hw) -{ - u32 offset; - - for (offset = 0; offset < hw->mac.vft_size; offset++) - IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0); - - for (offset = 0; offset < IXGBE_VLVF_ENTRIES; offset++) { - IXGBE_WRITE_REG(hw, IXGBE_VLVF(offset), 0); - IXGBE_WRITE_REG(hw, IXGBE_VLVFB(offset*2), 0); - IXGBE_WRITE_REG(hw, IXGBE_VLVFB((offset*2)+1), 0); - } - - return IXGBE_SUCCESS; -} - -/** - * ixgbe_init_uta_tables_82599 - Initialize the Unicast Table Array - * @hw: pointer to hardware structure - **/ -s32 ixgbe_init_uta_tables_82599(struct ixgbe_hw *hw) -{ - int i; - DEBUGOUT(" Clearing UTA\n"); - - for (i = 0; i < 128; i++) - IXGBE_WRITE_REG(hw, IXGBE_UTA(i), 0); - - return IXGBE_SUCCESS; -} - /** * ixgbe_reinit_fdir_tables_82599 - Reinitialize Flow Director tables. * @hw: pointer to hardware structure @@ -1308,6 +1013,8 @@ s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw) u32 fdirctrl = IXGBE_READ_REG(hw, IXGBE_FDIRCTRL); fdirctrl &= ~IXGBE_FDIRCTRL_INIT_DONE; + DEBUGFUNC("ixgbe_reinit_fdir_tables_82599"); + /* * Before starting reinitialization process, * FDIRCMD.CMD must be zero. @@ -1384,6 +1091,8 @@ s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc) u32 pbsize; int i; + DEBUGFUNC("ixgbe_init_fdir_signature_82599"); + /* * Before enabling Flow Director, the Rx Packet Buffer size * must be reduced. The new value is the current size minus @@ -1474,6 +1183,8 @@ s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc) u32 pbsize; int i; + DEBUGFUNC("ixgbe_init_fdir_perfect_82599"); + /* * Before enabling Flow Director, the Rx Packet Buffer size * must be reduced. The new value is the current size minus @@ -1609,6 +1320,8 @@ u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *atr_input, u32 key) u16 hash_result = 0; int i, j, k, h; + DEBUGFUNC("ixgbe_atr_compute_hash_82599"); + /* * Initialize the fill member to prevent warnings * on some compilers @@ -1687,6 +1400,8 @@ u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *atr_input, u32 key) **/ s32 ixgbe_atr_set_vlan_id_82599(struct ixgbe_atr_input *input, u16 vlan) { + DEBUGFUNC("ixgbe_atr_set_vlan_id_82599"); + input->byte_stream[IXGBE_ATR_VLAN_OFFSET + 1] = vlan >> 8; input->byte_stream[IXGBE_ATR_VLAN_OFFSET] = vlan & 0xff; @@ -1700,6 +1415,8 @@ s32 ixgbe_atr_set_vlan_id_82599(struct ixgbe_atr_input *input, u16 vlan) **/ s32 ixgbe_atr_set_src_ipv4_82599(struct ixgbe_atr_input *input, u32 src_addr) { + DEBUGFUNC("ixgbe_atr_set_src_ipv4_82599"); + input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 3] = src_addr >> 24; input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 2] = (src_addr >> 16) & 0xff; @@ -1717,6 +1434,8 @@ s32 ixgbe_atr_set_src_ipv4_82599(struct ixgbe_atr_input *input, u32 src_addr) **/ s32 ixgbe_atr_set_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 dst_addr) { + DEBUGFUNC("ixgbe_atr_set_dst_ipv4_82599"); + input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 3] = dst_addr >> 24; input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 2] = (dst_addr >> 16) & 0xff; @@ -1739,6 +1458,8 @@ s32 ixgbe_atr_set_src_ipv6_82599(struct ixgbe_atr_input *input, u32 src_addr_1, u32 src_addr_2, u32 src_addr_3, u32 src_addr_4) { + DEBUGFUNC("ixgbe_atr_set_src_ipv6_82599"); + input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET] = src_addr_4 & 0xff; input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 1] = (src_addr_4 >> 8) & 0xff; @@ -1782,6 +1503,8 @@ s32 ixgbe_atr_set_dst_ipv6_82599(struct ixgbe_atr_input *input, u32 dst_addr_1, u32 dst_addr_2, u32 dst_addr_3, u32 dst_addr_4) { + DEBUGFUNC("ixgbe_atr_set_dst_ipv6_82599"); + input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET] = dst_addr_4 & 0xff; input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 1] = (dst_addr_4 >> 8) & 0xff; @@ -1820,6 +1543,8 @@ s32 ixgbe_atr_set_dst_ipv6_82599(struct ixgbe_atr_input *input, **/ s32 ixgbe_atr_set_src_port_82599(struct ixgbe_atr_input *input, u16 src_port) { + DEBUGFUNC("ixgbe_atr_set_src_port_82599"); + input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET + 1] = src_port >> 8; input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET] = src_port & 0xff; @@ -1833,6 +1558,8 @@ s32 ixgbe_atr_set_src_port_82599(struct ixgbe_atr_input *input, u16 src_port) **/ s32 ixgbe_atr_set_dst_port_82599(struct ixgbe_atr_input *input, u16 dst_port) { + DEBUGFUNC("ixgbe_atr_set_dst_port_82599"); + input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET + 1] = dst_port >> 8; input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET] = dst_port & 0xff; @@ -1846,6 +1573,8 @@ s32 ixgbe_atr_set_dst_port_82599(struct ixgbe_atr_input *input, u16 dst_port) **/ s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, u16 flex_byte) { + DEBUGFUNC("ixgbe_atr_set_flex_byte_82599"); + input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET + 1] = flex_byte >> 8; input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET] = flex_byte & 0xff; @@ -1859,6 +1588,8 @@ s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, u16 flex_byte) **/ s32 ixgbe_atr_set_vm_pool_82599(struct ixgbe_atr_input *input, u8 vm_pool) { + DEBUGFUNC("ixgbe_atr_set_vm_pool_82599"); + input->byte_stream[IXGBE_ATR_VM_POOL_OFFSET] = vm_pool; return IXGBE_SUCCESS; @@ -1871,6 +1602,8 @@ s32 ixgbe_atr_set_vm_pool_82599(struct ixgbe_atr_input *input, u8 vm_pool) **/ s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, u8 l4type) { + DEBUGFUNC("ixgbe_atr_set_l4type_82599"); + input->byte_stream[IXGBE_ATR_L4TYPE_OFFSET] = l4type; return IXGBE_SUCCESS; @@ -1883,6 +1616,8 @@ s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, u8 l4type) **/ s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, u16 *vlan) { + DEBUGFUNC("ixgbe_atr_get_vlan_id_82599"); + *vlan = input->byte_stream[IXGBE_ATR_VLAN_OFFSET]; *vlan |= input->byte_stream[IXGBE_ATR_VLAN_OFFSET + 1] << 8; @@ -1896,6 +1631,8 @@ s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, u16 *vlan) **/ s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, u32 *src_addr) { + DEBUGFUNC("ixgbe_atr_get_src_ipv4_82599"); + *src_addr = input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET]; *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 1] << 8; *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 2] << 16; @@ -1911,6 +1648,8 @@ s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, u32 *src_addr) **/ s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 *dst_addr) { + DEBUGFUNC("ixgbe_atr_get_dst_ipv4_82599"); + *dst_addr = input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET]; *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 1] << 8; *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 2] << 16; @@ -1931,6 +1670,8 @@ s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, u32 *src_addr_1, u32 *src_addr_2, u32 *src_addr_3, u32 *src_addr_4) { + DEBUGFUNC("ixgbe_atr_get_src_ipv6_82599"); + *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 12]; *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 13] << 8; *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 14] << 16; @@ -1966,6 +1707,8 @@ s32 ixgbe_atr_get_dst_ipv6_82599(struct ixgbe_atr_input *input, u32 *dst_addr_1, u32 *dst_addr_2, u32 *dst_addr_3, u32 *dst_addr_4) { + DEBUGFUNC("ixgbe_atr_get_dst_ipv6_82599"); + *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 12]; *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 13] << 8; *dst_addr_1 = input->byte_stream[IXGBE_ATR_DST_IPV6_OFFSET + 14] << 16; @@ -2001,6 +1744,8 @@ s32 ixgbe_atr_get_dst_ipv6_82599(struct ixgbe_atr_input *input, **/ s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, u16 *src_port) { + DEBUGFUNC("ixgbe_atr_get_src_port_82599"); + *src_port = input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET] << 8; *src_port |= input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET + 1]; @@ -2019,6 +1764,8 @@ s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, u16 *src_port) **/ s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, u16 *dst_port) { + DEBUGFUNC("ixgbe_atr_get_dst_port_82599"); + *dst_port = input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET] << 8; *dst_port |= input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET + 1]; @@ -2032,6 +1779,8 @@ s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, u16 *dst_port) **/ s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, u16 *flex_byte) { + DEBUGFUNC("ixgbe_atr_get_flex_byte_82599"); + *flex_byte = input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET]; *flex_byte |= input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET + 1] << 8; @@ -2045,6 +1794,8 @@ s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, u16 *flex_byte) **/ s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, u8 *vm_pool) { + DEBUGFUNC("ixgbe_atr_get_vm_pool_82599"); + *vm_pool = input->byte_stream[IXGBE_ATR_VM_POOL_OFFSET]; return IXGBE_SUCCESS; @@ -2057,6 +1808,8 @@ s32 ixgbe_atr_get_vm_pool_82599(struct ixgbe_atr_input *input, u8 *vm_pool) **/ s32 ixgbe_atr_get_l4type_82599(struct ixgbe_atr_input *input, u8 *l4type) { + DEBUGFUNC("ixgbe_atr_get_l4type__82599"); + *l4type = input->byte_stream[IXGBE_ATR_L4TYPE_OFFSET]; return IXGBE_SUCCESS; @@ -2078,6 +1831,8 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, u16 bucket_hash, sig_hash; u8 l4type; + DEBUGFUNC("ixgbe_fdir_add_signature_filter_82599"); + bucket_hash = ixgbe_atr_compute_hash_82599(input, IXGBE_ATR_BUCKET_HASH_KEY); @@ -2149,6 +1904,8 @@ s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, u16 bucket_hash; u8 l4type; + DEBUGFUNC("ixgbe_fdir_add_perfect_filter_82599"); + /* Get our input values */ ixgbe_atr_get_l4type_82599(input, &l4type); @@ -2237,6 +1994,8 @@ s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val) { u32 core_ctl; + DEBUGFUNC("ixgbe_read_analog_reg8_82599"); + IXGBE_WRITE_REG(hw, IXGBE_CORECTL, IXGBE_CORECTL_WRITE_CMD | (reg << 8)); IXGBE_WRITE_FLUSH(hw); @@ -2259,6 +2018,8 @@ s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val) { u32 core_ctl; + DEBUGFUNC("ixgbe_write_analog_reg8_82599"); + core_ctl = (reg << 8) | val; IXGBE_WRITE_REG(hw, IXGBE_CORECTL, core_ctl); IXGBE_WRITE_FLUSH(hw); @@ -2277,18 +2038,35 @@ s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val) **/ s32 ixgbe_start_hw_rev_1_82599(struct ixgbe_hw *hw) { - u32 q_num; + u32 i; + u32 regval; s32 ret_val = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_start_hw_rev_1__82599"); + ret_val = ixgbe_start_hw_generic(hw); /* Clear the rate limiters */ - for (q_num = 0; q_num < hw->mac.max_tx_queues; q_num++) { - IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, q_num); + for (i = 0; i < hw->mac.max_tx_queues; i++) { + IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i); IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRC, 0); } IXGBE_WRITE_FLUSH(hw); + /* Disable relaxed ordering */ + for (i = 0; i < hw->mac.max_tx_queues; i++) { + regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i)); + regval &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; + IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), regval); + } + + for (i = 0; i < hw->mac.max_rx_queues; i++) { + regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); + regval &= ~(IXGBE_DCA_RXCTRL_DESC_WRO_EN | + IXGBE_DCA_RXCTRL_DESC_HSRO_EN); + IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval); + } + /* We need to run link autotry after the driver loads */ hw->mac.autotry_restart = TRUE; @@ -2309,6 +2087,8 @@ s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw) { s32 status = IXGBE_ERR_PHY_ADDR_INVALID; + DEBUGFUNC("ixgbe_identify_phy_82599"); + /* Detect PHY if not unknown - returns success if already detected. */ status = ixgbe_identify_phy_generic(hw); if (status != IXGBE_SUCCESS) @@ -2343,6 +2123,8 @@ u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw) u16 ext_ability = 0; u8 comp_codes_10g = 0; + DEBUGFUNC("ixgbe_get_support_physical_layer_82599"); + hw->phy.ops.identify(hw); if (hw->phy.type == ixgbe_phy_tn || @@ -2446,6 +2228,8 @@ s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval) int i; int secrxreg; + DEBUGFUNC("ixgbe_enable_rx_dma_82599"); + /* * Workaround for 82599 silicon errata when enabling the Rx datapath. * If traffic is incoming before we enable the Rx unit, it could hang @@ -2488,118 +2272,13 @@ s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval) **/ s32 ixgbe_get_device_caps_82599(struct ixgbe_hw *hw, u16 *device_caps) { + DEBUGFUNC("ixgbe_get_device_caps_82599"); + hw->eeprom.ops.read(hw, IXGBE_DEVICE_CAPS, device_caps); return IXGBE_SUCCESS; } -/** - * ixgbe_get_san_mac_addr_offset_82599 - SAN MAC address offset for 82599 - * @hw: pointer to hardware structure - * @san_mac_offset: SAN MAC address offset - * - * This function will read the EEPROM location for the SAN MAC address - * pointer, and returns the value at that location. This is used in both - * get and set mac_addr routines. - **/ -s32 ixgbe_get_san_mac_addr_offset_82599(struct ixgbe_hw *hw, - u16 *san_mac_offset) -{ - /* - * First read the EEPROM pointer to see if the MAC addresses are - * available. - */ - hw->eeprom.ops.read(hw, IXGBE_SAN_MAC_ADDR_PTR, san_mac_offset); - - return IXGBE_SUCCESS; -} - -/** - * ixgbe_get_san_mac_addr_82599 - SAN MAC address retrieval for 82599 - * @hw: pointer to hardware structure - * @san_mac_addr: SAN MAC address - * - * Reads the SAN MAC address from the EEPROM, if it's available. This is - * per-port, so set_lan_id() must be called before reading the addresses. - * set_lan_id() is called by identify_sfp(), but this cannot be relied - * upon for non-SFP connections, so we must call it here. - **/ -s32 ixgbe_get_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr) -{ - u16 san_mac_data, san_mac_offset; - u8 i; - - /* - * First read the EEPROM pointer to see if the MAC addresses are - * available. If they're not, no point in calling set_lan_id() here. - */ - ixgbe_get_san_mac_addr_offset_82599(hw, &san_mac_offset); - - if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) { - /* - * No addresses available in this EEPROM. It's not an - * error though, so just wipe the local address and return. - */ - for (i = 0; i < 6; i++) - san_mac_addr[i] = 0xFF; - - goto san_mac_addr_out; - } - - /* make sure we know which port we need to program */ - hw->mac.ops.set_lan_id(hw); - /* apply the port offset to the address offset */ - (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) : - (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET); - for (i = 0; i < 3; i++) { - hw->eeprom.ops.read(hw, san_mac_offset, &san_mac_data); - san_mac_addr[i * 2] = (u8)(san_mac_data); - san_mac_addr[i * 2 + 1] = (u8)(san_mac_data >> 8); - san_mac_offset++; - } - -san_mac_addr_out: - return IXGBE_SUCCESS; -} - -/** - * ixgbe_set_san_mac_addr_82599 - Write the SAN MAC address to the EEPROM - * @hw: pointer to hardware structure - * @san_mac_addr: SAN MAC address - * - * Write a SAN MAC address to the EEPROM. - **/ -s32 ixgbe_set_san_mac_addr_82599(struct ixgbe_hw *hw, u8 *san_mac_addr) -{ - s32 status = IXGBE_SUCCESS; - u16 san_mac_data, san_mac_offset; - u8 i; - - /* Look for SAN mac address pointer. If not defined, return */ - ixgbe_get_san_mac_addr_offset_82599(hw, &san_mac_offset); - - if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) { - status = IXGBE_ERR_NO_SAN_ADDR_PTR; - goto san_mac_addr_out; - } - - /* Make sure we know which port we need to write */ - hw->mac.ops.set_lan_id(hw); - /* Apply the port offset to the address offset */ - (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) : - (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET); - - for (i = 0; i < 3; i++) { - san_mac_data = (u16)((u16)(san_mac_addr[i * 2 + 1]) << 8); - san_mac_data |= (u16)(san_mac_addr[i * 2]); - hw->eeprom.ops.write(hw, san_mac_offset, san_mac_data); - san_mac_offset++; - } - -san_mac_addr_out: - return status; -} - /** * ixgbe_verify_fw_version_82599 - verify fw version for 82599 * @hw: pointer to hardware structure @@ -2616,6 +2295,8 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw) u16 fw_offset, fw_ptp_cfg_offset; u16 fw_version = 0; + DEBUGFUNC("ixgbe_verify_fw_version_82599"); + /* firmware check is only necessary for SFI devices */ if (hw->phy.media_type != ixgbe_media_type_fiber) { status = IXGBE_SUCCESS; diff --git a/sys/dev/ixgbe/ixgbe_api.c b/sys/dev/ixgbe/ixgbe_api.c index 9c3356fff591..44644574860c 100644 --- a/sys/dev/ixgbe/ixgbe_api.c +++ b/sys/dev/ixgbe/ixgbe_api.c @@ -54,6 +54,8 @@ s32 ixgbe_init_shared_code(struct ixgbe_hw *hw) { s32 status; + DEBUGFUNC("ixgbe_init_shared_code"); + /* * Set the mac type */ @@ -94,6 +96,7 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw) case IXGBE_DEV_ID_82598AF_SINGLE_PORT: case IXGBE_DEV_ID_82598AF_DUAL_PORT: case IXGBE_DEV_ID_82598AT: + case IXGBE_DEV_ID_82598AT2: case IXGBE_DEV_ID_82598EB_CX4: case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: case IXGBE_DEV_ID_82598_DA_DUAL_PORT: @@ -103,7 +106,9 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw) hw->mac.type = ixgbe_mac_82598EB; break; case IXGBE_DEV_ID_82599_KX4: + case IXGBE_DEV_ID_82599_KX4_MEZZ: case IXGBE_DEV_ID_82599_XAUI_LOM: + case IXGBE_DEV_ID_82599_COMBO_BACKPLANE: case IXGBE_DEV_ID_82599_SFP: case IXGBE_DEV_ID_82599_CX4: hw->mac.type = ixgbe_mac_82599EB; @@ -243,6 +248,23 @@ s32 ixgbe_get_device_caps(struct ixgbe_hw *hw, u16 *device_caps) (hw, device_caps), IXGBE_NOT_IMPLEMENTED); } +/** + * ixgbe_get_wwn_prefix - Get alternative WWNN/WWPN prefix from the EEPROM + * @hw: pointer to hardware structure + * @wwnn_prefix: the alternative WWNN prefix + * @wwpn_prefix: the alternative WWPN prefix + * + * This function will read the EEPROM from the alternative SAN MAC address + * block to check the support for the alternative WWNN/WWPN prefix support. + **/ +s32 ixgbe_get_wwn_prefix(struct ixgbe_hw *hw, u16 *wwnn_prefix, + u16 *wwpn_prefix) +{ + return ixgbe_call_func(hw, hw->mac.ops.get_wwn_prefix, + (hw, wwnn_prefix, wwpn_prefix), + IXGBE_NOT_IMPLEMENTED); +} + /** * ixgbe_get_bus_info - Set PCI bus info * @hw: pointer to hardware structure @@ -438,19 +460,6 @@ s32 ixgbe_setup_phy_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed, IXGBE_NOT_IMPLEMENTED); } -/** - * ixgbe_setup_link - Configure link settings - * @hw: pointer to hardware structure - * - * Configures link settings based on values in the ixgbe_hw struct. - * Restarts the link. Performs autonegotiation if needed. - **/ -s32 ixgbe_setup_link(struct ixgbe_hw *hw) -{ - return ixgbe_call_func(hw, hw->mac.ops.setup_link, (hw), - IXGBE_NOT_IMPLEMENTED); -} - /** * ixgbe_check_link - Get link and speed status * @hw: pointer to hardware structure @@ -466,18 +475,19 @@ s32 ixgbe_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed, } /** - * ixgbe_setup_link_speed - Set link speed + * ixgbe_setup_link - Set link speed * @hw: pointer to hardware structure * @speed: new link speed * @autoneg: TRUE if autonegotiation enabled * - * Set the link speed and restarts the link. + * Configures link settings. Restarts the link. + * Performs autonegotiation if needed. **/ -s32 ixgbe_setup_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed, +s32 ixgbe_setup_link(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete) { - return ixgbe_call_func(hw, hw->mac.ops.setup_link_speed, (hw, speed, + return ixgbe_call_func(hw, hw->mac.ops.setup_link, (hw, speed, autoneg, autoneg_wait_to_complete), IXGBE_NOT_IMPLEMENTED); } diff --git a/sys/dev/ixgbe/ixgbe_api.h b/sys/dev/ixgbe/ixgbe_api.h index 654f22f6c322..8ab78ad8720c 100644 --- a/sys/dev/ixgbe/ixgbe_api.h +++ b/sys/dev/ixgbe/ixgbe_api.h @@ -67,8 +67,7 @@ s32 ixgbe_setup_phy_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); -s32 ixgbe_setup_link(struct ixgbe_hw *hw); -s32 ixgbe_setup_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed, +s32 ixgbe_setup_link(struct ixgbe_hw *hw, ixgbe_link_speed speed, bool autoneg, bool autoneg_wait_to_complete); s32 ixgbe_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed, bool *link_up, bool link_up_wait_to_complete); @@ -97,6 +96,7 @@ s32 ixgbe_update_uc_addr_list(struct ixgbe_hw *hw, u8 *addr_list, u32 addr_count, ixgbe_mc_addr_itr func); s32 ixgbe_update_mc_addr_list(struct ixgbe_hw *hw, u8 *mc_addr_list, u32 mc_addr_count, ixgbe_mc_addr_itr func); +void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr_list, u32 vmdq); s32 ixgbe_enable_mc(struct ixgbe_hw *hw); s32 ixgbe_disable_mc(struct ixgbe_hw *hw); s32 ixgbe_clear_vfta(struct ixgbe_hw *hw); @@ -164,6 +164,8 @@ s32 ixgbe_set_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr); s32 ixgbe_get_device_caps(struct ixgbe_hw *hw, u16 *device_caps); s32 ixgbe_acquire_swfw_semaphore(struct ixgbe_hw *hw, u16 mask); void ixgbe_release_swfw_semaphore(struct ixgbe_hw *hw, u16 mask); +s32 ixgbe_get_wwn_prefix(struct ixgbe_hw *hw, u16 *wwnn_prefix, + u16 *wwpn_prefix); #endif /* _IXGBE_API_H_ */ diff --git a/sys/dev/ixgbe/ixgbe_common.c b/sys/dev/ixgbe/ixgbe_common.c index 30c372d8a9b0..89e57d83dabb 100644 --- a/sys/dev/ixgbe/ixgbe_common.c +++ b/sys/dev/ixgbe/ixgbe_common.c @@ -35,7 +35,6 @@ #include "ixgbe_common.h" #include "ixgbe_api.h" -static s32 ixgbe_poll_eeprom_eerd_done(struct ixgbe_hw *hw); static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw); static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw); static void ixgbe_release_eeprom_semaphore(struct ixgbe_hw *hw); @@ -47,9 +46,11 @@ static u16 ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, u16 count); static void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, u32 *eec); static void ixgbe_lower_eeprom_clk(struct ixgbe_hw *hw, u32 *eec); static void ixgbe_release_eeprom(struct ixgbe_hw *hw); -static u16 ixgbe_calc_eeprom_checksum(struct ixgbe_hw *hw); static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr); +static s32 ixgbe_get_san_mac_addr_offset(struct ixgbe_hw *hw, + u16 *san_mac_offset); +s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan); /** * ixgbe_init_ops_generic - Inits function ptrs @@ -63,17 +64,20 @@ s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw) struct ixgbe_mac_info *mac = &hw->mac; u32 eec = IXGBE_READ_REG(hw, IXGBE_EEC); + DEBUGFUNC("ixgbe_init_ops_generic"); + /* EEPROM */ eeprom->ops.init_params = &ixgbe_init_eeprom_params_generic; /* If EEPROM is valid (bit 8 = 1), use EERD otherwise use bit bang */ if (eec & (1 << 8)) - eeprom->ops.read = &ixgbe_read_eeprom_generic; + eeprom->ops.read = &ixgbe_read_eerd_generic; else eeprom->ops.read = &ixgbe_read_eeprom_bit_bang_generic; eeprom->ops.write = &ixgbe_write_eeprom_generic; eeprom->ops.validate_checksum = &ixgbe_validate_eeprom_checksum_generic; eeprom->ops.update_checksum = &ixgbe_update_eeprom_checksum_generic; + eeprom->ops.calc_checksum = &ixgbe_calc_eeprom_checksum_generic; /* MAC */ mac->ops.init_hw = &ixgbe_init_hw_generic; @@ -117,7 +121,6 @@ s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw) /* Link */ mac->ops.get_link_capabilities = NULL; mac->ops.setup_link = NULL; - mac->ops.setup_link_speed = NULL; mac->ops.check_link = NULL; return IXGBE_SUCCESS; @@ -137,6 +140,8 @@ s32 ixgbe_start_hw_generic(struct ixgbe_hw *hw) u32 ctrl_ext; s32 ret_val = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_start_hw_generic"); + /* Set the media type */ hw->phy.media_type = hw->mac.ops.get_media_type(hw); @@ -177,6 +182,8 @@ s32 ixgbe_init_hw_generic(struct ixgbe_hw *hw) { s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_init_hw_generic"); + /* Reset the hardware */ status = hw->mac.ops.reset_hw(hw); @@ -199,6 +206,8 @@ s32 ixgbe_clear_hw_cntrs_generic(struct ixgbe_hw *hw) { u16 i = 0; + DEBUGFUNC("ixgbe_clear_hw_cntrs_generic"); + IXGBE_READ_REG(hw, IXGBE_CRCERRS); IXGBE_READ_REG(hw, IXGBE_ILLERRC); IXGBE_READ_REG(hw, IXGBE_ERRBC); @@ -324,6 +333,8 @@ s32 ixgbe_get_mac_addr_generic(struct ixgbe_hw *hw, u8 *mac_addr) u32 rar_low; u16 i; + DEBUGFUNC("ixgbe_get_mac_addr_generic"); + rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(0)); rar_low = IXGBE_READ_REG(hw, IXGBE_RAL(0)); @@ -347,6 +358,8 @@ s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw) struct ixgbe_mac_info *mac = &hw->mac; u16 link_status; + DEBUGFUNC("ixgbe_get_bus_info_generic"); + hw->bus.type = ixgbe_bus_type_pci_express; /* Get the negotiated link width and speed from PCI config space */ @@ -399,6 +412,8 @@ void ixgbe_set_lan_id_multi_port_pcie(struct ixgbe_hw *hw) struct ixgbe_bus_info *bus = &hw->bus; u32 reg; + DEBUGFUNC("ixgbe_set_lan_id_multi_port_pcie"); + reg = IXGBE_READ_REG(hw, IXGBE_STATUS); bus->func = (reg & IXGBE_STATUS_LAN_ID) >> IXGBE_STATUS_LAN_ID_SHIFT; bus->lan_id = bus->func; @@ -424,6 +439,8 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw) u32 reg_val; u16 i; + DEBUGFUNC("ixgbe_stop_adapter_generic"); + /* * Set the adapter_stopped flag so other driver functions stop touching * the hardware @@ -472,6 +489,8 @@ s32 ixgbe_led_on_generic(struct ixgbe_hw *hw, u32 index) { u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); + DEBUGFUNC("ixgbe_led_on_generic"); + /* To turn on the LED, set mode to ON. */ led_reg &= ~IXGBE_LED_MODE_MASK(index); led_reg |= IXGBE_LED_ON << IXGBE_LED_MODE_SHIFT(index); @@ -490,6 +509,8 @@ s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index) { u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); + DEBUGFUNC("ixgbe_led_off_generic"); + /* To turn off the LED, set mode to OFF. */ led_reg &= ~IXGBE_LED_MODE_MASK(index); led_reg |= IXGBE_LED_OFF << IXGBE_LED_MODE_SHIFT(index); @@ -512,6 +533,8 @@ s32 ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw) u32 eec; u16 eeprom_size; + DEBUGFUNC("ixgbe_init_eeprom_params_generic"); + if (eeprom->type == ixgbe_eeprom_uninitialized) { eeprom->type = ixgbe_eeprom_none; /* Set default semaphore delay to 10ms which is a well @@ -533,7 +556,7 @@ s32 ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw) eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >> IXGBE_EEC_SIZE_SHIFT); eeprom->word_size = 1 << (eeprom_size + - IXGBE_EEPROM_WORD_SIZE_SHIFT); + IXGBE_EEPROM_WORD_SIZE_BASE_SHIFT); } if (eec & IXGBE_EEC_ADDR_SIZE) @@ -562,6 +585,8 @@ s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data) s32 status; u8 write_opcode = IXGBE_EEPROM_WRITE_OPCODE_SPI; + DEBUGFUNC("ixgbe_write_eeprom_generic"); + hw->eeprom.ops.init_params(hw); if (offset >= hw->eeprom.word_size) { @@ -629,6 +654,8 @@ s32 ixgbe_read_eeprom_bit_bang_generic(struct ixgbe_hw *hw, u16 offset, u16 word_in; u8 read_opcode = IXGBE_EEPROM_READ_OPCODE_SPI; + DEBUGFUNC("ixgbe_read_eeprom_bit_bang_generic"); + hw->eeprom.ops.init_params(hw); if (offset >= hw->eeprom.word_size) { @@ -675,18 +702,20 @@ out: } /** - * ixgbe_read_eeprom_generic - Read EEPROM word using EERD + * ixgbe_read_eerd_generic - Read EEPROM word using EERD * @hw: pointer to hardware structure * @offset: offset of word in the EEPROM to read * @data: word read from the EEPROM * * Reads a 16 bit word from the EEPROM using the EERD register. **/ -s32 ixgbe_read_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 *data) +s32 ixgbe_read_eerd_generic(struct ixgbe_hw *hw, u16 offset, u16 *data) { u32 eerd; s32 status; + DEBUGFUNC("ixgbe_read_eerd_generic"); + hw->eeprom.ops.init_params(hw); if (offset >= hw->eeprom.word_size) { @@ -694,15 +723,15 @@ s32 ixgbe_read_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 *data) goto out; } - eerd = (offset << IXGBE_EEPROM_READ_ADDR_SHIFT) + - IXGBE_EEPROM_READ_REG_START; + eerd = (offset << IXGBE_EEPROM_RW_ADDR_SHIFT) + + IXGBE_EEPROM_RW_REG_START; IXGBE_WRITE_REG(hw, IXGBE_EERD, eerd); - status = ixgbe_poll_eeprom_eerd_done(hw); + status = ixgbe_poll_eerd_eewr_done(hw, IXGBE_NVM_POLL_READ); if (status == IXGBE_SUCCESS) *data = (IXGBE_READ_REG(hw, IXGBE_EERD) >> - IXGBE_EEPROM_READ_REG_DATA); + IXGBE_EEPROM_RW_REG_DATA); else DEBUGOUT("Eeprom read timed out\n"); @@ -711,20 +740,28 @@ out: } /** - * ixgbe_poll_eeprom_eerd_done - Poll EERD status + * ixgbe_poll_eerd_eewr_done - Poll EERD read or EEWR write status * @hw: pointer to hardware structure + * @ee_reg: EEPROM flag for polling * - * Polls the status bit (bit 1) of the EERD to determine when the read is done. + * Polls the status bit (bit 1) of the EERD or EEWR to determine when the + * read or write is done respectively. **/ -static s32 ixgbe_poll_eeprom_eerd_done(struct ixgbe_hw *hw) +s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg) { u32 i; u32 reg; s32 status = IXGBE_ERR_EEPROM; - for (i = 0; i < IXGBE_EERD_ATTEMPTS; i++) { - reg = IXGBE_READ_REG(hw, IXGBE_EERD); - if (reg & IXGBE_EEPROM_READ_REG_DONE) { + DEBUGFUNC("ixgbe_poll_eerd_eewr_done"); + + for (i = 0; i < IXGBE_EERD_EEWR_ATTEMPTS; i++) { + if (ee_reg == IXGBE_NVM_POLL_READ) + reg = IXGBE_READ_REG(hw, IXGBE_EERD); + else + reg = IXGBE_READ_REG(hw, IXGBE_EEWR); + + if (reg & IXGBE_EEPROM_RW_REG_DONE) { status = IXGBE_SUCCESS; break; } @@ -746,6 +783,8 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw) u32 eec; u32 i; + DEBUGFUNC("ixgbe_acquire_eeprom"); + if (ixgbe_acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) != IXGBE_SUCCESS) status = IXGBE_ERR_SWFW_SYNC; @@ -798,6 +837,8 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw) u32 i; u32 swsm; + DEBUGFUNC("ixgbe_get_eeprom_semaphore"); + /* Get SMBI software semaphore between device drivers first */ for (i = 0; i < timeout; i++) { /* @@ -860,6 +901,8 @@ static void ixgbe_release_eeprom_semaphore(struct ixgbe_hw *hw) { u32 swsm; + DEBUGFUNC("ixgbe_release_eeprom_semaphore"); + swsm = IXGBE_READ_REG(hw, IXGBE_SWSM); /* Release both semaphores by writing 0 to the bits SWESMBI and SMBI */ @@ -878,6 +921,8 @@ static s32 ixgbe_ready_eeprom(struct ixgbe_hw *hw) u16 i; u8 spi_stat_reg; + DEBUGFUNC("ixgbe_ready_eeprom"); + /* * Read "Status Register" repeatedly until the LSB is cleared. The * EEPROM will signal that the command has been completed by clearing @@ -915,6 +960,8 @@ static void ixgbe_standby_eeprom(struct ixgbe_hw *hw) { u32 eec; + DEBUGFUNC("ixgbe_standby_eeprom"); + eec = IXGBE_READ_REG(hw, IXGBE_EEC); /* Toggle CS to flush commands */ @@ -941,6 +988,8 @@ static void ixgbe_shift_out_eeprom_bits(struct ixgbe_hw *hw, u16 data, u32 mask; u32 i; + DEBUGFUNC("ixgbe_shift_out_eeprom_bits"); + eec = IXGBE_READ_REG(hw, IXGBE_EEC); /* @@ -993,6 +1042,8 @@ static u16 ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, u16 count) u32 i; u16 data = 0; + DEBUGFUNC("ixgbe_shift_in_eeprom_bits"); + /* * In order to read a register from the EEPROM, we need to shift * 'count' bits in from the EEPROM. Bits are "shifted in" by raising @@ -1027,6 +1078,8 @@ static u16 ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, u16 count) **/ static void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, u32 *eec) { + DEBUGFUNC("ixgbe_raise_eeprom_clk"); + /* * Raise the clock input to the EEPROM * (setting the SK bit), then delay @@ -1044,6 +1097,8 @@ static void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, u32 *eec) **/ static void ixgbe_lower_eeprom_clk(struct ixgbe_hw *hw, u32 *eec) { + DEBUGFUNC("ixgbe_lower_eeprom_clk"); + /* * Lower the clock input to the EEPROM (clearing the SK bit), then * delay @@ -1062,6 +1117,8 @@ static void ixgbe_release_eeprom(struct ixgbe_hw *hw) { u32 eec; + DEBUGFUNC("ixgbe_release_eeprom"); + eec = IXGBE_READ_REG(hw, IXGBE_EEC); eec |= IXGBE_EEC_CS; /* Pull CS high */ @@ -1083,10 +1140,10 @@ static void ixgbe_release_eeprom(struct ixgbe_hw *hw) } /** - * ixgbe_calc_eeprom_checksum - Calculates and returns the checksum + * ixgbe_calc_eeprom_checksum_generic - Calculates and returns the checksum * @hw: pointer to hardware structure **/ -static u16 ixgbe_calc_eeprom_checksum(struct ixgbe_hw *hw) +u16 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw) { u16 i; u16 j; @@ -1095,6 +1152,8 @@ static u16 ixgbe_calc_eeprom_checksum(struct ixgbe_hw *hw) u16 pointer = 0; u16 word = 0; + DEBUGFUNC("ixgbe_calc_eeprom_checksum_generic"); + /* Include 0x0-0x3F in the checksum */ for (i = 0; i < IXGBE_EEPROM_CHECKSUM; i++) { if (hw->eeprom.ops.read(hw, i, &word) != IXGBE_SUCCESS) { @@ -1141,6 +1200,8 @@ s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw, u16 checksum; u16 read_checksum = 0; + DEBUGFUNC("ixgbe_validate_eeprom_checksum_generic"); + /* * Read the first word from the EEPROM. If this times out or fails, do * not continue or we could be in for a very long wait while every @@ -1149,7 +1210,7 @@ s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw, status = hw->eeprom.ops.read(hw, 0, &checksum); if (status == IXGBE_SUCCESS) { - checksum = ixgbe_calc_eeprom_checksum(hw); + checksum = hw->eeprom.ops.calc_checksum(hw); hw->eeprom.ops.read(hw, IXGBE_EEPROM_CHECKSUM, &read_checksum); @@ -1179,6 +1240,8 @@ s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw) s32 status; u16 checksum; + DEBUGFUNC("ixgbe_update_eeprom_checksum_generic"); + /* * Read the first word from the EEPROM. If this times out or fails, do * not continue or we could be in for a very long wait while every @@ -1187,7 +1250,7 @@ s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw) status = hw->eeprom.ops.read(hw, 0, &checksum); if (status == IXGBE_SUCCESS) { - checksum = ixgbe_calc_eeprom_checksum(hw); + checksum = hw->eeprom.ops.calc_checksum(hw); status = hw->eeprom.ops.write(hw, IXGBE_EEPROM_CHECKSUM, checksum); } else { @@ -1207,6 +1270,8 @@ s32 ixgbe_validate_mac_addr(u8 *mac_addr) { s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_validate_mac_addr"); + /* Make sure it is not a multicast address */ if (IXGBE_IS_MULTICAST(mac_addr)) { DEBUGOUT("MAC address is multicast\n"); @@ -1240,6 +1305,8 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq, u32 rar_low, rar_high; u32 rar_entries = hw->mac.num_rar_entries; + DEBUGFUNC("ixgbe_set_rar_generic"); + /* setup VMDq pool selection before this RAR gets enabled */ hw->mac.ops.set_vmdq(hw, index, vmdq); @@ -1286,6 +1353,8 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index) u32 rar_high; u32 rar_entries = hw->mac.num_rar_entries; + DEBUGFUNC("ixgbe_clear_rar_generic"); + /* Make sure we are using a valid rar index range */ if (index < rar_entries) { /* @@ -1321,6 +1390,8 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw) u32 i; u32 rar_entries = hw->mac.num_rar_entries; + DEBUGFUNC("ixgbe_init_rx_addrs_generic"); + /* * If the current mac address is valid, assume it is a software override * to the permanent address. @@ -1383,6 +1454,8 @@ void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq) u32 rar_entries = hw->mac.num_rar_entries; u32 rar; + DEBUGFUNC("ixgbe_add_uc_addr"); + DEBUGOUT6(" UC Addr = %.2X %.2X %.2X %.2X %.2X %.2X\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); @@ -1426,6 +1499,8 @@ s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw, u8 *addr_list, u32 fctrl; u32 vmdq; + DEBUGFUNC("ixgbe_update_uc_addr_list_generic"); + /* * Clear accounting of old secondary address list, * don't count RAR[0] @@ -1435,10 +1510,10 @@ s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw, u8 *addr_list, hw->addr_ctrl.overflow_promisc = 0; /* Zero out the other receive addresses */ - DEBUGOUT1("Clearing RAR[1-%d]\n", hw->addr_ctrl.rar_used_count); - for (i = 1; i <= hw->addr_ctrl.rar_used_count; i++) { - IXGBE_WRITE_REG(hw, IXGBE_RAL(i), 0); - IXGBE_WRITE_REG(hw, IXGBE_RAH(i), 0); + DEBUGOUT1("Clearing RAR[1-%d]\n", uc_addr_in_use+1); + for (i = 0; i < uc_addr_in_use; i++) { + IXGBE_WRITE_REG(hw, IXGBE_RAL(1+i), 0); + IXGBE_WRITE_REG(hw, IXGBE_RAH(1+i), 0); } /* Add the new addresses */ @@ -1486,6 +1561,8 @@ static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr) { u32 vector = 0; + DEBUGFUNC("ixgbe_mta_vector"); + switch (hw->mac.mc_filter_type) { case 0: /* use bits [47:36] of the address */ vector = ((mc_addr[4] >> 4) | (((u16)mc_addr[5]) << 4)); @@ -1524,6 +1601,8 @@ void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr) u32 vector_reg; u32 mta_reg; + DEBUGFUNC("ixgbe_set_mta"); + hw->addr_ctrl.mta_in_use++; vector = ixgbe_mta_vector(hw, mc_addr); @@ -1563,6 +1642,8 @@ s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw, u8 *mc_addr_list, u32 i; u32 vmdq; + DEBUGFUNC("ixgbe_update_mc_addr_list_generic"); + /* * Set the new number of MC addresses that we are being requested to * use. @@ -1600,6 +1681,8 @@ s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw) { struct ixgbe_addr_filter_info *a = &hw->addr_ctrl; + DEBUGFUNC("ixgbe_enable_mc_generic"); + if (a->mta_in_use > 0) IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, IXGBE_MCSTCTRL_MFE | hw->mac.mc_filter_type); @@ -1617,6 +1700,8 @@ s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw) { struct ixgbe_addr_filter_info *a = &hw->addr_ctrl; + DEBUGFUNC("ixgbe_disable_mc_generic"); + if (a->mta_in_use > 0) IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type); @@ -1692,7 +1777,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num) break; default: DEBUGOUT("Flow control param set incorrectly\n"); - ret_val = -IXGBE_ERR_CONFIG; + ret_val = IXGBE_ERR_CONFIG; goto out; break; } @@ -1761,6 +1846,7 @@ s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw) s32 ret_val = IXGBE_SUCCESS; ixgbe_link_speed speed; u32 pcs_anadv_reg, pcs_lpab_reg, linkstat; + u32 links2, anlp1_reg, autoc_reg, links; bool link_up; DEBUGFUNC("ixgbe_fc_autoneg"); @@ -1769,27 +1855,68 @@ s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw) * AN should have completed when the cable was plugged in. * Look for reasons to bail out. Bail out if: * - FC autoneg is disabled, or if - * - we don't have multispeed fiber, or if - * - we're not running at 1G, or if - * - link is not up, or if - * - link is up but AN did not complete, or if - * - link is up and AN completed but timed out + * - link is not up. * - * Since we're being called from an LSC, link is already know to be up. + * Since we're being called from an LSC, link is already known to be up. * So use link_up_wait_to_complete=FALSE. */ hw->mac.ops.check_link(hw, &speed, &link_up, FALSE); - linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA); - if (hw->fc.disable_fc_autoneg || - !hw->phy.multispeed_fiber || - (speed != IXGBE_LINK_SPEED_1GB_FULL) || - !link_up || - ((linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) || - ((linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1)) { + if (hw->fc.disable_fc_autoneg || (!link_up)) { + hw->fc.fc_was_autonegged = FALSE; + hw->fc.current_mode = hw->fc.requested_mode; + goto out; + } + + /* + * On backplane, bail out if + * - backplane autoneg was not completed, or if + * - we are 82599 and link partner is not AN enabled + */ + if (hw->phy.media_type == ixgbe_media_type_backplane) { + links = IXGBE_READ_REG(hw, IXGBE_LINKS); + if ((links & IXGBE_LINKS_KX_AN_COMP) == 0) { + hw->fc.fc_was_autonegged = FALSE; + hw->fc.current_mode = hw->fc.requested_mode; + goto out; + } + + if (hw->mac.type == ixgbe_mac_82599EB) { + links2 = IXGBE_READ_REG(hw, IXGBE_LINKS2); + if ((links2 & IXGBE_LINKS2_AN_SUPPORTED) == 0) { + hw->fc.fc_was_autonegged = FALSE; + hw->fc.current_mode = hw->fc.requested_mode; + goto out; + } + } + } + + /* + * On multispeed fiber at 1g, bail out if + * - link is up but AN did not complete, or if + * - link is up and AN completed but timed out + */ + if (hw->phy.multispeed_fiber && (speed == IXGBE_LINK_SPEED_1GB_FULL)) { + linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA); + if (((linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) || + ((linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1)) { + hw->fc.fc_was_autonegged = FALSE; + hw->fc.current_mode = hw->fc.requested_mode; + goto out; + } + } + + /* + * Bail out on + * - copper or CX4 adapters + * - fiber adapters running at 10gig + */ + if ((hw->phy.media_type == ixgbe_media_type_copper) || + (hw->phy.media_type == ixgbe_media_type_cx4) || + ((hw->phy.media_type == ixgbe_media_type_fiber) && + (speed == IXGBE_LINK_SPEED_10GB_FULL))) { hw->fc.fc_was_autonegged = FALSE; hw->fc.current_mode = hw->fc.requested_mode; - DEBUGOUT("Autoneg FC was skipped.\n"); goto out; } @@ -1797,41 +1924,85 @@ s32 ixgbe_fc_autoneg(struct ixgbe_hw *hw) * Read the AN advertisement and LP ability registers and resolve * local flow control settings accordingly */ - pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); - pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP); - if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && - (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE)) { - /* - * Now we need to check if the user selected Rx ONLY - * of pause frames. In this case, we had to advertise - * FULL flow control because we could not advertise RX - * ONLY. Hence, we must now check to see if we need to - * turn OFF the TRANSMISSION of PAUSE frames. - */ - if (hw->fc.requested_mode == ixgbe_fc_full) { - hw->fc.current_mode = ixgbe_fc_full; - DEBUGOUT("Flow Control = FULL.\n"); - } else { + if ((speed == IXGBE_LINK_SPEED_1GB_FULL) && + (hw->phy.media_type != ixgbe_media_type_backplane)) { + pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA); + pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP); + if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && + (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE)) { + /* + * Now we need to check if the user selected Rx ONLY + * of pause frames. In this case, we had to advertise + * FULL flow control because we could not advertise RX + * ONLY. Hence, we must now check to see if we need to + * turn OFF the TRANSMISSION of PAUSE frames. + */ + if (hw->fc.requested_mode == ixgbe_fc_full) { + hw->fc.current_mode = ixgbe_fc_full; + DEBUGOUT("Flow Control = FULL.\n"); + } else { + hw->fc.current_mode = ixgbe_fc_rx_pause; + DEBUGOUT("Flow Control=RX PAUSE frames only\n"); + } + } else if (!(pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && + (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && + (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && + (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { + hw->fc.current_mode = ixgbe_fc_tx_pause; + DEBUGOUT("Flow Control = TX PAUSE frames only.\n"); + } else if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && + (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && + !(pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && + (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { hw->fc.current_mode = ixgbe_fc_rx_pause; DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); + } else { + hw->fc.current_mode = ixgbe_fc_none; + DEBUGOUT("Flow Control = NONE.\n"); } - } else if (!(pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && - (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && - (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && - (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { - hw->fc.current_mode = ixgbe_fc_tx_pause; - DEBUGOUT("Flow Control = TX PAUSE frames only.\n"); - } else if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) && - (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) && - !(pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) && - (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) { - hw->fc.current_mode = ixgbe_fc_rx_pause; - DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); - } else { - hw->fc.current_mode = ixgbe_fc_none; - DEBUGOUT("Flow Control = NONE.\n"); } + if (hw->phy.media_type == ixgbe_media_type_backplane) { + /* + * Read the 10g AN autoc and LP ability registers and resolve + * local flow control settings accordingly + */ + autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); + anlp1_reg = IXGBE_READ_REG(hw, IXGBE_ANLP1); + + if ((autoc_reg & IXGBE_AUTOC_SYM_PAUSE) && + (anlp1_reg & IXGBE_ANLP1_SYM_PAUSE)) { + /* + * Now we need to check if the user selected Rx ONLY + * of pause frames. In this case, we had to advertise + * FULL flow control because we could not advertise RX + * ONLY. Hence, we must now check to see if we need to + * turn OFF the TRANSMISSION of PAUSE frames. + */ + if (hw->fc.requested_mode == ixgbe_fc_full) { + hw->fc.current_mode = ixgbe_fc_full; + DEBUGOUT("Flow Control = FULL.\n"); + } else { + hw->fc.current_mode = ixgbe_fc_rx_pause; + DEBUGOUT("Flow Control=RX PAUSE frames only\n"); + } + } else if (!(autoc_reg & IXGBE_AUTOC_SYM_PAUSE) && + (autoc_reg & IXGBE_AUTOC_ASM_PAUSE) && + (anlp1_reg & IXGBE_ANLP1_SYM_PAUSE) && + (anlp1_reg & IXGBE_ANLP1_ASM_PAUSE)) { + hw->fc.current_mode = ixgbe_fc_tx_pause; + DEBUGOUT("Flow Control = TX PAUSE frames only.\n"); + } else if ((autoc_reg & IXGBE_AUTOC_SYM_PAUSE) && + (autoc_reg & IXGBE_AUTOC_ASM_PAUSE) && + !(anlp1_reg & IXGBE_ANLP1_SYM_PAUSE) && + (anlp1_reg & IXGBE_ANLP1_ASM_PAUSE)) { + hw->fc.current_mode = ixgbe_fc_rx_pause; + DEBUGOUT("Flow Control = RX PAUSE frames only.\n"); + } else { + hw->fc.current_mode = ixgbe_fc_none; + DEBUGOUT("Flow Control = NONE.\n"); + } + } /* Record that current_mode is the result of a successful autoneg */ hw->fc.fc_was_autonegged = TRUE; @@ -1850,6 +2021,8 @@ s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) s32 ret_val = IXGBE_SUCCESS; u32 reg; + DEBUGFUNC("ixgbe_setup_fc"); + /* Validate the packetbuf configuration */ if (packetbuf_num < 0 || packetbuf_num > 7) { @@ -1933,7 +2106,7 @@ s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) break; default: DEBUGOUT("Flow control param set incorrectly\n"); - ret_val = -IXGBE_ERR_CONFIG; + ret_val = IXGBE_ERR_CONFIG; goto out; break; } @@ -1941,9 +2114,6 @@ s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) IXGBE_WRITE_REG(hw, IXGBE_PCS1GANA, reg); reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL); - /* Enable and restart autoneg to inform the link partner */ - reg |= IXGBE_PCS1GLCTL_AN_ENABLE | IXGBE_PCS1GLCTL_AN_RESTART; - /* Disable AN timeout */ if (hw->fc.strict_ieee) reg &= ~IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN; @@ -1951,6 +2121,65 @@ s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num) IXGBE_WRITE_REG(hw, IXGBE_PCS1GLCTL, reg); DEBUGOUT1("Set up FC; PCS1GLCTL = 0x%08X\n", reg); + /* + * Set up the 10G flow control advertisement registers so the HW + * can do fc autoneg once the cable is plugged in. If we end up + * using 1g instead, this is harmless. + */ + reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); + + /* + * The possible values of fc.requested_mode are: + * 0: Flow control is completely disabled + * 1: Rx flow control is enabled (we can receive pause frames, + * but not send pause frames). + * 2: Tx flow control is enabled (we can send pause frames but + * we do not support receiving pause frames). + * 3: Both Rx and Tx flow control (symmetric) are enabled. + * other: Invalid. + */ + switch (hw->fc.requested_mode) { + case ixgbe_fc_none: + /* Flow control completely disabled by software override. */ + reg &= ~(IXGBE_AUTOC_SYM_PAUSE | IXGBE_AUTOC_ASM_PAUSE); + break; + case ixgbe_fc_rx_pause: + /* + * Rx Flow control is enabled and Tx Flow control is + * disabled by software override. Since there really + * isn't a way to advertise that we are capable of RX + * Pause ONLY, we will advertise that we support both + * symmetric and asymmetric Rx PAUSE. Later, we will + * disable the adapter's ability to send PAUSE frames. + */ + reg |= (IXGBE_AUTOC_SYM_PAUSE | IXGBE_AUTOC_ASM_PAUSE); + break; + case ixgbe_fc_tx_pause: + /* + * Tx Flow control is enabled, and Rx Flow control is + * disabled by software override. + */ + reg |= (IXGBE_AUTOC_ASM_PAUSE); + reg &= ~(IXGBE_AUTOC_SYM_PAUSE); + break; + case ixgbe_fc_full: + /* Flow control (both Rx and Tx) is enabled by SW override. */ + reg |= (IXGBE_AUTOC_SYM_PAUSE | IXGBE_AUTOC_ASM_PAUSE); + break; + default: + DEBUGOUT("Flow control param set incorrectly\n"); + ret_val = IXGBE_ERR_CONFIG; + goto out; + break; + } + /* + * AUTOC restart handles negotiation of 1G and 10G. There is + * no need to set the PCS1GCTL register. + */ + reg |= IXGBE_AUTOC_AN_RESTART; + IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg); + DEBUGOUT1("Set up FC; IXGBE_AUTOC = 0x%08X\n", reg); + out: return ret_val; } @@ -1971,6 +2200,8 @@ s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw) u32 number_of_queues; s32 status = IXGBE_ERR_MASTER_REQUESTS_PENDING; + DEBUGFUNC("ixgbe_disable_pcie_master"); + /* Disable the receive unit by stopping each queue */ number_of_queues = hw->mac.max_rx_queues; for (i = 0; i < number_of_queues; i++) { @@ -2012,13 +2243,15 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask) u32 fwmask = mask << 5; s32 timeout = 200; + DEBUGFUNC("ixgbe_acquire_swfw_sync"); + while (timeout) { /* * SW EEPROM semaphore bit is used for access to all * SW_FW_SYNC/GSSR bits (not just EEPROM) */ if (ixgbe_get_eeprom_semaphore(hw)) - return -IXGBE_ERR_SWFW_SYNC; + return IXGBE_ERR_SWFW_SYNC; gssr = IXGBE_READ_REG(hw, IXGBE_GSSR); if (!(gssr & (fwmask | swmask))) @@ -2035,7 +2268,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask) if (!timeout) { DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n"); - return -IXGBE_ERR_SWFW_SYNC; + return IXGBE_ERR_SWFW_SYNC; } gssr |= swmask; @@ -2058,6 +2291,8 @@ void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask) u32 gssr; u32 swmask = mask; + DEBUGFUNC("ixgbe_release_swfw_sync"); + ixgbe_get_eeprom_semaphore(hw); gssr = IXGBE_READ_REG(hw, IXGBE_GSSR); @@ -2076,6 +2311,8 @@ void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask) **/ s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval) { + DEBUGFUNC("ixgbe_enable_rx_dma_generic"); + IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, regval); return IXGBE_SUCCESS; @@ -2093,6 +2330,8 @@ s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index) u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); + DEBUGFUNC("ixgbe_blink_led_start_generic"); + /* * Link must be up to auto-blink the LEDs; * Force it if link is down. @@ -2125,6 +2364,8 @@ s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index) u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL); + DEBUGFUNC("ixgbe_blink_led_stop_generic"); + autoc_reg &= ~IXGBE_AUTOC_FLU; autoc_reg |= IXGBE_AUTOC_AN_RESTART; @@ -2139,3 +2380,582 @@ s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index) return IXGBE_SUCCESS; } +/** + * ixgbe_get_san_mac_addr_offset - Get SAN MAC address offset from the EEPROM + * @hw: pointer to hardware structure + * @san_mac_offset: SAN MAC address offset + * + * This function will read the EEPROM location for the SAN MAC address + * pointer, and returns the value at that location. This is used in both + * get and set mac_addr routines. + **/ +static s32 ixgbe_get_san_mac_addr_offset(struct ixgbe_hw *hw, + u16 *san_mac_offset) +{ + DEBUGFUNC("ixgbe_get_san_mac_addr_offset"); + + /* + * First read the EEPROM pointer to see if the MAC addresses are + * available. + */ + hw->eeprom.ops.read(hw, IXGBE_SAN_MAC_ADDR_PTR, san_mac_offset); + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_get_san_mac_addr_generic - SAN MAC address retrieval from the EEPROM + * @hw: pointer to hardware structure + * @san_mac_addr: SAN MAC address + * + * Reads the SAN MAC address from the EEPROM, if it's available. This is + * per-port, so set_lan_id() must be called before reading the addresses. + * set_lan_id() is called by identify_sfp(), but this cannot be relied + * upon for non-SFP connections, so we must call it here. + **/ +s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr) +{ + u16 san_mac_data, san_mac_offset; + u8 i; + + DEBUGFUNC("ixgbe_get_san_mac_addr_generic"); + + /* + * First read the EEPROM pointer to see if the MAC addresses are + * available. If they're not, no point in calling set_lan_id() here. + */ + ixgbe_get_san_mac_addr_offset(hw, &san_mac_offset); + + if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) { + /* + * No addresses available in this EEPROM. It's not an + * error though, so just wipe the local address and return. + */ + for (i = 0; i < 6; i++) + san_mac_addr[i] = 0xFF; + + goto san_mac_addr_out; + } + + /* make sure we know which port we need to program */ + hw->mac.ops.set_lan_id(hw); + /* apply the port offset to the address offset */ + (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) : + (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET); + for (i = 0; i < 3; i++) { + hw->eeprom.ops.read(hw, san_mac_offset, &san_mac_data); + san_mac_addr[i * 2] = (u8)(san_mac_data); + san_mac_addr[i * 2 + 1] = (u8)(san_mac_data >> 8); + san_mac_offset++; + } + +san_mac_addr_out: + return IXGBE_SUCCESS; +} + +/** + * ixgbe_set_san_mac_addr_generic - Write the SAN MAC address to the EEPROM + * @hw: pointer to hardware structure + * @san_mac_addr: SAN MAC address + * + * Write a SAN MAC address to the EEPROM. + **/ +s32 ixgbe_set_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr) +{ + s32 status = IXGBE_SUCCESS; + u16 san_mac_data, san_mac_offset; + u8 i; + + DEBUGFUNC("ixgbe_set_san_mac_addr_generic"); + + /* Look for SAN mac address pointer. If not defined, return */ + ixgbe_get_san_mac_addr_offset(hw, &san_mac_offset); + + if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) { + status = IXGBE_ERR_NO_SAN_ADDR_PTR; + goto san_mac_addr_out; + } + + /* Make sure we know which port we need to write */ + hw->mac.ops.set_lan_id(hw); + /* Apply the port offset to the address offset */ + (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) : + (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET); + + for (i = 0; i < 3; i++) { + san_mac_data = (u16)((u16)(san_mac_addr[i * 2 + 1]) << 8); + san_mac_data |= (u16)(san_mac_addr[i * 2]); + hw->eeprom.ops.write(hw, san_mac_offset, san_mac_data); + san_mac_offset++; + } + +san_mac_addr_out: + return status; +} + +/** + * ixgbe_get_pcie_msix_count_generic - Gets MSI-X vector count + * @hw: pointer to hardware structure + * + * Read PCIe configuration space, and get the MSI-X vector count from + * the capabilities table. + **/ +u32 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw) +{ + u32 msix_count = 64; + + DEBUGFUNC("ixgbe_get_pcie_msix_count_generic"); + if (hw->mac.msix_vectors_from_pcie) { + msix_count = IXGBE_READ_PCIE_WORD(hw, + IXGBE_PCIE_MSIX_82599_CAPS); + msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK; + + /* MSI-X count is zero-based in HW, so increment to give + * proper value */ + msix_count++; + } + + return msix_count; +} + +/** + * ixgbe_insert_mac_addr_generic - Find a RAR for this mac address + * @hw: pointer to hardware structure + * @addr: Address to put into receive address register + * @vmdq: VMDq pool to assign + * + * Puts an ethernet address into a receive address register, or + * finds the rar that it is aleady in; adds to the pool list + **/ +s32 ixgbe_insert_mac_addr_generic(struct ixgbe_hw *hw, u8 *addr, u32 vmdq) +{ + static const u32 NO_EMPTY_RAR_FOUND = 0xFFFFFFFF; + u32 first_empty_rar = NO_EMPTY_RAR_FOUND; + u32 rar; + u32 rar_low, rar_high; + u32 addr_low, addr_high; + + DEBUGFUNC("ixgbe_insert_mac_addr_generic"); + + /* swap bytes for HW little endian */ + addr_low = addr[0] | (addr[1] << 8) + | (addr[2] << 16) + | (addr[3] << 24); + addr_high = addr[4] | (addr[5] << 8); + + /* + * Either find the mac_id in rar or find the first empty space. + * rar_highwater points to just after the highest currently used + * rar in order to shorten the search. It grows when we add a new + * rar to the top. + */ + for (rar = 0; rar < hw->mac.rar_highwater; rar++) { + rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar)); + + if (((IXGBE_RAH_AV & rar_high) == 0) + && first_empty_rar == NO_EMPTY_RAR_FOUND) { + first_empty_rar = rar; + } else if ((rar_high & 0xFFFF) == addr_high) { + rar_low = IXGBE_READ_REG(hw, IXGBE_RAL(rar)); + if (rar_low == addr_low) + break; /* found it already in the rars */ + } + } + + if (rar < hw->mac.rar_highwater) { + /* already there so just add to the pool bits */ + ixgbe_set_vmdq(hw, rar, vmdq); + } else if (first_empty_rar != NO_EMPTY_RAR_FOUND) { + /* stick it into first empty RAR slot we found */ + rar = first_empty_rar; + ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV); + } else if (rar == hw->mac.rar_highwater) { + /* add it to the top of the list and inc the highwater mark */ + ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV); + hw->mac.rar_highwater++; + } else if (rar >= hw->mac.num_rar_entries) { + return IXGBE_ERR_INVALID_MAC_ADDR; + } + + /* + * If we found rar[0], make sure the default pool bit (we use pool 0) + * remains cleared to be sure default pool packets will get delivered + */ + if (rar == 0) + ixgbe_clear_vmdq(hw, rar, 0); + + return rar; +} + +/** + * ixgbe_clear_vmdq_generic - Disassociate a VMDq pool index from a rx address + * @hw: pointer to hardware struct + * @rar: receive address register index to disassociate + * @vmdq: VMDq pool index to remove from the rar + **/ +s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq) +{ + u32 mpsar_lo, mpsar_hi; + u32 rar_entries = hw->mac.num_rar_entries; + + DEBUGFUNC("ixgbe_clear_vmdq_generic"); + + if (rar < rar_entries) { + mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar)); + mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar)); + + if (!mpsar_lo && !mpsar_hi) + goto done; + + if (vmdq == IXGBE_CLEAR_VMDQ_ALL) { + if (mpsar_lo) { + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0); + mpsar_lo = 0; + } + if (mpsar_hi) { + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0); + mpsar_hi = 0; + } + } else if (vmdq < 32) { + mpsar_lo &= ~(1 << vmdq); + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar_lo); + } else { + mpsar_hi &= ~(1 << (vmdq - 32)); + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar_hi); + } + + /* was that the last pool using this rar? */ + if (mpsar_lo == 0 && mpsar_hi == 0 && rar != 0) + hw->mac.ops.clear_rar(hw, rar); + } else { + DEBUGOUT1("RAR index %d is out of range.\n", rar); + } + +done: + return IXGBE_SUCCESS; +} + +/** + * ixgbe_set_vmdq_generic - Associate a VMDq pool index with a rx address + * @hw: pointer to hardware struct + * @rar: receive address register index to associate with a VMDq index + * @vmdq: VMDq pool index + **/ +s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq) +{ + u32 mpsar; + u32 rar_entries = hw->mac.num_rar_entries; + + DEBUGFUNC("ixgbe_set_vmdq_generic"); + + if (rar < rar_entries) { + if (vmdq < 32) { + mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar)); + mpsar |= 1 << vmdq; + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar); + } else { + mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar)); + mpsar |= 1 << (vmdq - 32); + IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar); + } + } else { + DEBUGOUT1("RAR index %d is out of range.\n", rar); + } + return IXGBE_SUCCESS; +} + +/** + * ixgbe_init_uta_tables_generic - Initialize the Unicast Table Array + * @hw: pointer to hardware structure + **/ +s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw) +{ + int i; + + DEBUGFUNC("ixgbe_init_uta_tables_generic"); + DEBUGOUT(" Clearing UTA\n"); + + for (i = 0; i < 128; i++) + IXGBE_WRITE_REG(hw, IXGBE_UTA(i), 0); + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_find_vlvf_slot - find the vlanid or the first empty slot + * @hw: pointer to hardware structure + * @vlan: VLAN id to write to VLAN filter + * + * return the VLVF index where this VLAN id should be placed + * + **/ +s32 ixgbe_find_vlvf_slot(struct ixgbe_hw *hw, u32 vlan) +{ + u32 bits = 0; + u32 first_empty_slot = 0; + s32 regindex; + + /* + * Search for the vlan id in the VLVF entries. Save off the first empty + * slot found along the way + */ + for (regindex = 1; regindex < IXGBE_VLVF_ENTRIES; regindex++) { + bits = IXGBE_READ_REG(hw, IXGBE_VLVF(regindex)); + if (!bits && !(first_empty_slot)) + first_empty_slot = regindex; + else if ((bits & 0x0FFF) == vlan) + break; + } + + /* + * If regindex is less than IXGBE_VLVF_ENTRIES, then we found the vlan + * in the VLVF. Else use the first empty VLVF register for this + * vlan id. + */ + if (regindex >= IXGBE_VLVF_ENTRIES) { + if (first_empty_slot) + regindex = first_empty_slot; + else { + DEBUGOUT("No space in VLVF.\n"); + regindex = -1; + } + } + + return regindex; +} + +/** + * ixgbe_set_vfta_generic - Set VLAN filter table + * @hw: pointer to hardware structure + * @vlan: VLAN id to write to VLAN filter + * @vind: VMDq output index that maps queue to VLAN id in VFVFB + * @vlan_on: boolean flag to turn on/off VLAN in VFVF + * + * Turn on/off specified VLAN in the VLAN filter table. + **/ +s32 ixgbe_set_vfta_generic(struct ixgbe_hw *hw, u32 vlan, u32 vind, + bool vlan_on) +{ + s32 regindex; + u32 bitindex; + u32 bits; + u32 vt; + + DEBUGFUNC("ixgbe_set_vfta_generic"); + + if (vlan > 4095) + return IXGBE_ERR_PARAM; + + /* + * this is a 2 part operation - first the VFTA, then the + * VLVF and VLVFB if VT Mode is set + */ + + /* Part 1 + * The VFTA is a bitstring made up of 128 32-bit registers + * that enable the particular VLAN id, much like the MTA: + * bits[11-5]: which register + * bits[4-0]: which bit in the register + */ + regindex = (vlan >> 5) & 0x7F; + bitindex = vlan & 0x1F; + bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex)); + if (vlan_on) + bits |= (1 << bitindex); + else + bits &= ~(1 << bitindex); + IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits); + + + /* Part 2 + * If VT Mode is set + * Either vlan_on + * make sure the vlan is in VLVF + * set the vind bit in the matching VLVFB + * Or !vlan_on + * clear the pool bit and possibly the vind + */ + vt = IXGBE_READ_REG(hw, IXGBE_VT_CTL); + if (vt & IXGBE_VT_CTL_VT_ENABLE) { + if (vlan == 0) { + regindex = 0; + } else { + regindex = ixgbe_find_vlvf_slot(hw, vlan); + if (regindex < 0) + goto out; + } + + if (vlan_on) { + /* set the pool bit */ + if (vind < 32) { + bits = IXGBE_READ_REG(hw, + IXGBE_VLVFB(regindex*2)); + bits |= (1 << vind); + IXGBE_WRITE_REG(hw, + IXGBE_VLVFB(regindex*2), + bits); + } else { + bits = IXGBE_READ_REG(hw, + IXGBE_VLVFB((regindex*2)+1)); + bits |= (1 << vind); + IXGBE_WRITE_REG(hw, + IXGBE_VLVFB((regindex*2)+1), + bits); + } + } else { + /* clear the pool bit */ + if (vind < 32) { + bits = IXGBE_READ_REG(hw, + IXGBE_VLVFB(regindex*2)); + bits &= ~(1 << vind); + IXGBE_WRITE_REG(hw, + IXGBE_VLVFB(regindex*2), + bits); + bits |= IXGBE_READ_REG(hw, + IXGBE_VLVFB((regindex*2)+1)); + } else { + bits = IXGBE_READ_REG(hw, + IXGBE_VLVFB((regindex*2)+1)); + bits &= ~(1 << vind); + IXGBE_WRITE_REG(hw, + IXGBE_VLVFB((regindex*2)+1), + bits); + bits |= IXGBE_READ_REG(hw, + IXGBE_VLVFB(regindex*2)); + } + } + + if (bits) + IXGBE_WRITE_REG(hw, IXGBE_VLVF(regindex), + (IXGBE_VLVF_VIEN | vlan)); + else + IXGBE_WRITE_REG(hw, IXGBE_VLVF(regindex), 0); + } +out: + return IXGBE_SUCCESS; +} + +/** + * ixgbe_clear_vfta_generic - Clear VLAN filter table + * @hw: pointer to hardware structure + * + * Clears the VLAN filer table, and the VMDq index associated with the filter + **/ +s32 ixgbe_clear_vfta_generic(struct ixgbe_hw *hw) +{ + u32 offset; + + DEBUGFUNC("ixgbe_clear_vfta_generic"); + + for (offset = 0; offset < hw->mac.vft_size; offset++) + IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0); + + for (offset = 0; offset < IXGBE_VLVF_ENTRIES; offset++) { + IXGBE_WRITE_REG(hw, IXGBE_VLVF(offset), 0); + IXGBE_WRITE_REG(hw, IXGBE_VLVFB(offset*2), 0); + IXGBE_WRITE_REG(hw, IXGBE_VLVFB((offset*2)+1), 0); + } + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_check_mac_link_generic - Determine link and speed status + * @hw: pointer to hardware structure + * @speed: pointer to link speed + * @link_up: TRUE when link is up + * @link_up_wait_to_complete: bool used to wait for link up or not + * + * Reads the links register to determine if link is up and the current speed + **/ +s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed, + bool *link_up, bool link_up_wait_to_complete) +{ + u32 links_reg; + u32 i; + + DEBUGFUNC("ixgbe_check_mac_link_generic"); + + links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); + if (link_up_wait_to_complete) { + for (i = 0; i < IXGBE_LINK_UP_TIME; i++) { + if (links_reg & IXGBE_LINKS_UP) { + *link_up = TRUE; + break; + } else { + *link_up = FALSE; + } + msec_delay(100); + links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); + } + } else { + if (links_reg & IXGBE_LINKS_UP) + *link_up = TRUE; + else + *link_up = FALSE; + } + + if ((links_reg & IXGBE_LINKS_SPEED_82599) == + IXGBE_LINKS_SPEED_10G_82599) + *speed = IXGBE_LINK_SPEED_10GB_FULL; + else if ((links_reg & IXGBE_LINKS_SPEED_82599) == + IXGBE_LINKS_SPEED_1G_82599) + *speed = IXGBE_LINK_SPEED_1GB_FULL; + else + *speed = IXGBE_LINK_SPEED_100_FULL; + + /* if link is down, zero out the current_mode */ + if (*link_up == FALSE) { + hw->fc.current_mode = ixgbe_fc_none; + hw->fc.fc_was_autonegged = FALSE; + } + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_get_wwn_prefix_generic - Get alternative WWNN/WWPN prefix from + * the EEPROM + * @hw: pointer to hardware structure + * @wwnn_prefix: the alternative WWNN prefix + * @wwpn_prefix: the alternative WWPN prefix + * + * This function will read the EEPROM from the alternative SAN MAC address + * block to check the support for the alternative WWNN/WWPN prefix support. + **/ +s32 ixgbe_get_wwn_prefix_generic(struct ixgbe_hw *hw, u16 *wwnn_prefix, + u16 *wwpn_prefix) +{ + u16 offset, caps; + u16 alt_san_mac_blk_offset; + + DEBUGFUNC("ixgbe_get_wwn_prefix_generic"); + + /* clear output first */ + *wwnn_prefix = 0xFFFF; + *wwpn_prefix = 0xFFFF; + + /* check if alternative SAN MAC is supported */ + hw->eeprom.ops.read(hw, IXGBE_ALT_SAN_MAC_ADDR_BLK_PTR, + &alt_san_mac_blk_offset); + + if ((alt_san_mac_blk_offset == 0) || + (alt_san_mac_blk_offset == 0xFFFF)) + goto wwn_prefix_out; + + /* check capability in alternative san mac address block */ + offset = alt_san_mac_blk_offset + IXGBE_ALT_SAN_MAC_ADDR_CAPS_OFFSET; + hw->eeprom.ops.read(hw, offset, &caps); + if (!(caps & IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN)) + goto wwn_prefix_out; + + /* get the corresponding prefix for WWNN/WWPN */ + offset = alt_san_mac_blk_offset + IXGBE_ALT_SAN_MAC_ADDR_WWNN_OFFSET; + hw->eeprom.ops.read(hw, offset, wwnn_prefix); + + offset = alt_san_mac_blk_offset + IXGBE_ALT_SAN_MAC_ADDR_WWPN_OFFSET; + hw->eeprom.ops.read(hw, offset, wwpn_prefix); + +wwn_prefix_out: + return IXGBE_SUCCESS; +} diff --git a/sys/dev/ixgbe/ixgbe_common.h b/sys/dev/ixgbe/ixgbe_common.h index 0c535751880b..f0707e21a2e4 100644 --- a/sys/dev/ixgbe/ixgbe_common.h +++ b/sys/dev/ixgbe/ixgbe_common.h @@ -42,6 +42,8 @@ IXGBE_WRITE_REG(hw, reg + 4, (u32) (value >> 32)); \ } while (0) +u32 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw); + s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw); s32 ixgbe_init_hw_generic(struct ixgbe_hw *hw); s32 ixgbe_start_hw_generic(struct ixgbe_hw *hw); @@ -57,12 +59,14 @@ s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index); s32 ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw); s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data); -s32 ixgbe_read_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 *data); +s32 ixgbe_read_eerd_generic(struct ixgbe_hw *hw, u16 offset, u16 *data); s32 ixgbe_read_eeprom_bit_bang_generic(struct ixgbe_hw *hw, u16 offset, u16 *data); +u16 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw); s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw, u16 *checksum_val); s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw); +s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg); s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq, u32 enable_addr); @@ -73,7 +77,6 @@ s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw, u8 *mc_addr_list, ixgbe_mc_addr_itr func); s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw, u8 *addr_list, u32 addr_count, ixgbe_mc_addr_itr func); -void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw); s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw); s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval); @@ -87,9 +90,25 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask); void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask); s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw); -s32 ixgbe_read_analog_reg8_generic(struct ixgbe_hw *hw, u32 reg, u8 *val); -s32 ixgbe_write_analog_reg8_generic(struct ixgbe_hw *hw, u32 reg, u8 val); s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index); s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index); +s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr); +s32 ixgbe_set_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr); + +s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq); +s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq); +s32 ixgbe_insert_mac_addr_generic(struct ixgbe_hw *hw, u8 *addr, u32 vmdq); +s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw); +s32 ixgbe_set_vfta_generic(struct ixgbe_hw *hw, u32 vlan, + u32 vind, bool vlan_on); +s32 ixgbe_clear_vfta_generic(struct ixgbe_hw *hw); + +s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, + ixgbe_link_speed *speed, + bool *link_up, bool link_up_wait_to_complete); + +s32 ixgbe_get_wwn_prefix_generic(struct ixgbe_hw *hw, u16 *wwnn_prefix, + u16 *wwpn_prefix); + #endif /* IXGBE_COMMON */ diff --git a/sys/dev/ixgbe/ixgbe_osdep.h b/sys/dev/ixgbe/ixgbe_osdep.h index e1bbce08602d..151e63ff1f6a 100644 --- a/sys/dev/ixgbe/ixgbe_osdep.h +++ b/sys/dev/ixgbe/ixgbe_osdep.h @@ -110,6 +110,16 @@ typedef boolean_t bool; #endif #endif +#if defined(__i386__) || defined(__amd64__) +static __inline +void prefetch(void *x) +{ + __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x)); +} +#else +#define prefetch(x) +#endif + struct ixgbe_osdep { bus_space_tag_t mem_bus_space_tag; diff --git a/sys/dev/ixgbe/ixgbe_phy.c b/sys/dev/ixgbe/ixgbe_phy.c index daa37d910004..9bab98d29522 100644 --- a/sys/dev/ixgbe/ixgbe_phy.c +++ b/sys/dev/ixgbe/ixgbe_phy.c @@ -59,6 +59,8 @@ s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw) { struct ixgbe_phy_info *phy = &hw->phy; + DEBUGFUNC("ixgbe_init_phy_ops_generic"); + /* PHY */ phy->ops.identify = &ixgbe_identify_phy_generic; phy->ops.reset = &ixgbe_reset_phy_generic; @@ -67,7 +69,7 @@ s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw) phy->ops.setup_link = &ixgbe_setup_phy_link_generic; phy->ops.setup_link_speed = &ixgbe_setup_phy_link_speed_generic; phy->ops.check_link = NULL; - phy->ops.get_firmware_version = NULL; + phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic; phy->ops.read_i2c_byte = &ixgbe_read_i2c_byte_generic; phy->ops.write_i2c_byte = &ixgbe_write_i2c_byte_generic; phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic; @@ -91,6 +93,8 @@ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw) u32 phy_addr; u16 ext_ability = 0; + DEBUGFUNC("ixgbe_identify_phy_generic"); + if (hw->phy.type == ixgbe_phy_unknown) { for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) { if (ixgbe_validate_phy_addr(hw, phy_addr)) { @@ -138,6 +142,8 @@ bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr) u16 phy_id = 0; bool valid = FALSE; + DEBUGFUNC("ixgbe_validate_phy_addr"); + hw->phy.addr = phy_addr; hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH, IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id); @@ -159,6 +165,8 @@ s32 ixgbe_get_phy_id(struct ixgbe_hw *hw) u16 phy_id_high = 0; u16 phy_id_low = 0; + DEBUGFUNC("ixgbe_get_phy_id"); + status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH, IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id_high); @@ -183,6 +191,8 @@ enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id) { enum ixgbe_phy_type phy_type; + DEBUGFUNC("ixgbe_get_phy_type_from_id"); + switch (phy_id) { case TN1010_PHY_ID: phy_type = ixgbe_phy_tn; @@ -215,6 +225,8 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw) u16 ctrl = 0; s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_reset_phy_generic"); + if (hw->phy.type == ixgbe_phy_unknown) status = ixgbe_identify_phy_generic(hw); @@ -262,6 +274,8 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, s32 status = IXGBE_SUCCESS; u16 gssr; + DEBUGFUNC("ixgbe_read_phy_reg_generic"); + if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1) gssr = IXGBE_GSSR_PHY1_SM; else @@ -359,6 +373,8 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, s32 status = IXGBE_SUCCESS; u16 gssr; + DEBUGFUNC("ixgbe_write_phy_reg_generic"); + if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1) gssr = IXGBE_GSSR_PHY1_SM; else @@ -437,10 +453,10 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, } /** - * ixgbe_setup_phy_link_generic - Set and restart autoneg - * @hw: pointer to hardware structure + * ixgbe_setup_phy_link_generic - Set and restart autoneg + * @hw: pointer to hardware structure * - * Restart autonegotiation and PHY and waits for completion. + * Restart autonegotiation and PHY and waits for completion. **/ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw) { @@ -448,23 +464,59 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw) u32 time_out; u32 max_time_out = 10; u16 autoneg_reg = IXGBE_MII_AUTONEG_REG; + bool autoneg = FALSE; + ixgbe_link_speed speed; - /* - * Set advertisement settings in PHY based on autoneg_advertised - * settings. If autoneg_advertised = 0, then advertise default values - * tnx devices cannot be "forced" to a autoneg 10G and fail. But can - * for a 1G. - */ - hw->phy.ops.read_reg(hw, IXGBE_MII_SPEED_SELECTION_REG, - IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg); + DEBUGFUNC("ixgbe_setup_phy_link_generic"); - if (hw->phy.autoneg_advertised == IXGBE_LINK_SPEED_1GB_FULL) - autoneg_reg &= 0xEFFF; /* 0 in bit 12 is 1G operation */ - else - autoneg_reg |= 0x1000; /* 1 in bit 12 is 10G/1G operation */ + ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg); - hw->phy.ops.write_reg(hw, IXGBE_MII_SPEED_SELECTION_REG, - IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg); + if (speed & IXGBE_LINK_SPEED_10GB_FULL) { + /* Set or unset auto-negotiation 10G advertisement */ + hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &autoneg_reg); + + autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) + autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE; + + hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + autoneg_reg); + } + + if (speed & IXGBE_LINK_SPEED_1GB_FULL) { + /* Set or unset auto-negotiation 1G advertisement */ + hw->phy.ops.read_reg(hw, + IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &autoneg_reg); + + autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) + autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE; + + hw->phy.ops.write_reg(hw, + IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + autoneg_reg); + } + + if (speed & IXGBE_LINK_SPEED_100_FULL) { + /* Set or unset auto-negotiation 100M advertisement */ + hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &autoneg_reg); + + autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) + autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE; + + hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + autoneg_reg); + } /* Restart PHY autonegotiation and wait for completion */ hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, @@ -489,8 +541,10 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw) } } - if (time_out == max_time_out) + if (time_out == max_time_out) { status = IXGBE_ERR_LINK_SETUP; + DEBUGOUT("ixgbe_setup_phy_link_generic: time out"); + } return status; } @@ -509,6 +563,8 @@ s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw, UNREFERENCED_PARAMETER(autoneg); UNREFERENCED_PARAMETER(autoneg_wait_to_complete); + DEBUGFUNC("ixgbe_setup_phy_link_speed_generic"); + /* * Clear autoneg_advertised and set new values based on input link * speed. @@ -545,6 +601,8 @@ s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, s32 status = IXGBE_ERR_LINK_SETUP; u16 speed_ability; + DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic"); + *speed = 0; *autoneg = TRUE; @@ -581,6 +639,8 @@ s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed, u16 phy_speed = 0; u16 phy_data = 0; + DEBUGFUNC("ixgbe_check_phy_link_tnx"); + /* Initialize speed and link to default case */ *link_up = FALSE; *speed = IXGBE_LINK_SPEED_10GB_FULL; @@ -612,6 +672,102 @@ s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed, return status; } +/** + * ixgbe_setup_phy_link_tnx - Set and restart autoneg + * @hw: pointer to hardware structure + * + * Restart autonegotiation and PHY and waits for completion. + **/ +s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw) +{ + s32 status = IXGBE_SUCCESS; + u32 time_out; + u32 max_time_out = 10; + u16 autoneg_reg = IXGBE_MII_AUTONEG_REG; + bool autoneg = FALSE; + ixgbe_link_speed speed; + + DEBUGFUNC("ixgbe_setup_phy_link_tnx"); + + ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg); + + if (speed & IXGBE_LINK_SPEED_10GB_FULL) { + /* Set or unset auto-negotiation 10G advertisement */ + hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &autoneg_reg); + + autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) + autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE; + + hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + autoneg_reg); + } + + if (speed & IXGBE_LINK_SPEED_1GB_FULL) { + /* Set or unset auto-negotiation 1G advertisement */ + hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &autoneg_reg); + + autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) + autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX; + + hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + autoneg_reg); + } + + if (speed & IXGBE_LINK_SPEED_100_FULL) { + /* Set or unset auto-negotiation 100M advertisement */ + hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &autoneg_reg); + + autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE; + if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) + autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE; + + hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + autoneg_reg); + } + + /* Restart PHY autonegotiation and wait for completion */ + hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg); + + autoneg_reg |= IXGBE_MII_RESTART; + + hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg); + + /* Wait for autonegotiation to finish */ + for (time_out = 0; time_out < max_time_out; time_out++) { + usec_delay(10); + /* Restart PHY autonegotiation and wait for completion */ + status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS, + IXGBE_MDIO_AUTO_NEG_DEV_TYPE, + &autoneg_reg); + + autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE; + if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) { + break; + } + } + + if (time_out == max_time_out) { + status = IXGBE_ERR_LINK_SETUP; + DEBUGOUT("ixgbe_setup_phy_link_tnx: time out"); + } + + return status; +} + + /** * ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version * @hw: pointer to hardware structure @@ -622,6 +778,8 @@ s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw, { s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx"); + status = hw->phy.ops.read_reg(hw, TNX_FW_REV, IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, firmware_version); @@ -631,15 +789,17 @@ s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw, /** - * ixgbe_get_phy_firmware_version_aq - Gets the PHY Firmware Version + * ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version * @hw: pointer to hardware structure * @firmware_version: pointer to the PHY Firmware Version **/ -s32 ixgbe_get_phy_firmware_version_aq(struct ixgbe_hw *hw, +s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw, u16 *firmware_version) { s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_get_phy_firmware_version_generic"); + status = hw->phy.ops.read_reg(hw, AQ_FW_REV, IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, firmware_version); @@ -660,6 +820,8 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw) s32 ret_val = IXGBE_SUCCESS; u32 i; + DEBUGFUNC("ixgbe_reset_phy_nl"); + hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL, IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data); @@ -762,6 +924,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) u8 cable_tech = 0; u16 enforce_sfp = 0; + DEBUGFUNC("ixgbe_identify_sfp_module_generic"); + if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) { hw->phy.sfp_type = ixgbe_sfp_type_not_present; status = IXGBE_ERR_SFP_NOT_PRESENT; @@ -850,6 +1014,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) && (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE))) hw->phy.multispeed_fiber = TRUE; + /* Determine PHY vendor */ if (hw->phy.type != ixgbe_phy_nl) { hw->phy.id = identifier; @@ -944,6 +1109,8 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, { u16 sfp_id; + DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets"); + if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) return IXGBE_ERR_SFP_NOT_SUPPORTED; @@ -1370,6 +1537,8 @@ static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data) s32 status; u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); + DEBUGFUNC("ixgbe_clock_in_i2c_bit"); + status = ixgbe_raise_i2c_clk(hw, &i2cctl); /* Minimum high period of clock is 4us */ @@ -1398,6 +1567,8 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data) s32 status; u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL); + DEBUGFUNC("ixgbe_clock_out_i2c_bit"); + status = ixgbe_set_i2c_data(hw, &i2cctl, data); if (status == IXGBE_SUCCESS) { status = ixgbe_raise_i2c_clk(hw, &i2cctl); @@ -1429,6 +1600,8 @@ static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) { s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_raise_i2c_clk"); + *i2cctl |= IXGBE_I2C_CLK_OUT; IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); @@ -1449,6 +1622,8 @@ static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) { + DEBUGFUNC("ixgbe_lower_i2c_clk"); + *i2cctl &= ~IXGBE_I2C_CLK_OUT; IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); @@ -1469,6 +1644,8 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data) { s32 status = IXGBE_SUCCESS; + DEBUGFUNC("ixgbe_set_i2c_data"); + if (data) *i2cctl |= IXGBE_I2C_DATA_OUT; else @@ -1500,6 +1677,8 @@ static bool ixgbe_get_i2c_data(u32 *i2cctl) { bool data; + DEBUGFUNC("ixgbe_get_i2c_data"); + if (*i2cctl & IXGBE_I2C_DATA_IN) data = 1; else diff --git a/sys/dev/ixgbe/ixgbe_phy.h b/sys/dev/ixgbe/ixgbe_phy.h index bfe73de25b12..39f3bc83f0a4 100644 --- a/sys/dev/ixgbe/ixgbe_phy.h +++ b/sys/dev/ixgbe/ixgbe_phy.h @@ -108,9 +108,10 @@ s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed, bool *link_up); +s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw); s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw, u16 *firmware_version); -s32 ixgbe_get_phy_firmware_version_aq(struct ixgbe_hw *hw, +s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw, u16 *firmware_version); s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw); diff --git a/sys/dev/ixgbe/ixgbe_type.h b/sys/dev/ixgbe/ixgbe_type.h index 50345f4c2c1a..0b1011977094 100644 --- a/sys/dev/ixgbe/ixgbe_type.h +++ b/sys/dev/ixgbe/ixgbe_type.h @@ -47,6 +47,7 @@ #define IXGBE_DEV_ID_82598AF_DUAL_PORT 0x10C6 #define IXGBE_DEV_ID_82598AF_SINGLE_PORT 0x10C7 #define IXGBE_DEV_ID_82598AT 0x10C8 +#define IXGBE_DEV_ID_82598AT2 0x150B #define IXGBE_DEV_ID_82598EB_SFP_LOM 0x10DB #define IXGBE_DEV_ID_82598EB_CX4 0x10DD #define IXGBE_DEV_ID_82598_CX4_DUAL_PORT 0x10EC @@ -54,6 +55,8 @@ #define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1 #define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4 #define IXGBE_DEV_ID_82599_KX4 0x10F7 +#define IXGBE_DEV_ID_82599_KX4_MEZZ 0x1514 +#define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8 #define IXGBE_DEV_ID_82599_CX4 0x10F9 #define IXGBE_DEV_ID_82599_SFP 0x10FB #define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC @@ -74,6 +77,7 @@ /* NVM Registers */ #define IXGBE_EEC 0x10010 #define IXGBE_EERD 0x10014 +#define IXGBE_EEWR 0x10018 #define IXGBE_FLA 0x1001C #define IXGBE_EEMNGCTL 0x10110 #define IXGBE_EEMNGDATA 0x10114 @@ -352,7 +356,7 @@ #define IXGBE_WUFC_FLX5 0x00200000 /* Flexible Filter 5 Enable */ #define IXGBE_WUFC_FLX_FILTERS 0x000F0000 /* Mask for 4 flex filters */ #define IXGBE_WUFC_EXT_FLX_FILTERS 0x00300000 /* Mask for Ext. flex filters */ -#define IXGBE_WUFC_ALL_FILTERS 0x003F00FF /* Mask for all 6 wakeup filters*/ +#define IXGBE_WUFC_ALL_FILTERS 0x003F00FF /* Mask for all wakeup filters */ #define IXGBE_WUFC_FLX_OFFSET 16 /* Offset to the Flexible Filters bits */ /* Wake Up Status */ @@ -703,6 +707,7 @@ #define IXGBE_MREVID 0x11064 #define IXGBE_DCA_ID 0x11070 #define IXGBE_DCA_CTRL 0x11074 +#define IXGBE_SWFW_SYNC IXGBE_GSSR /* PCI-E registers 82599-Specific */ #define IXGBE_GCR_EXT 0x11050 @@ -725,6 +730,12 @@ #define IXGBE_ECC_STATUS_82599 0x110E0 #define IXGBE_BAR_CTRL_82599 0x110F4 +/* PCI Express Control */ +#define IXGBE_GCR_CMPL_TMOUT_MASK 0x0000F000 +#define IXGBE_GCR_CMPL_TMOUT_10ms 0x00001000 +#define IXGBE_GCR_CMPL_TMOUT_RESEND 0x00010000 +#define IXGBE_GCR_CAP_VER2 0x00040000 + /* Time Sync Registers */ #define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */ #define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */ @@ -848,12 +859,16 @@ #define IXGBE_MPVC 0x04318 #define IXGBE_SGMIIC 0x04314 +/* Copper Pond 2 link timeout */ +#define IXGBE_VALIDATE_LINK_READY_TIMEOUT 50 + /* Omer CORECTL */ #define IXGBE_CORECTL 0x014F00 /* BARCTRL */ -#define IXGBE_BARCTRL 0x110F4 -#define IXGBE_BARCTRL_FLSIZE 0x0700 -#define IXGBE_BARCTRL_CSRSIZE 0x2000 +#define IXGBE_BARCTRL 0x110F4 +#define IXGBE_BARCTRL_FLSIZE 0x0700 +#define IXGBE_BARCTRL_FLSIZE_SHIFT 8 +#define IXGBE_BARCTRL_CSRSIZE 0x2000 /* RSCCTL Bit Masks */ #define IXGBE_RSCCTL_RSCEN 0x01 @@ -1013,10 +1028,18 @@ /* MII clause 22/28 definitions */ #define IXGBE_MDIO_PHY_LOW_POWER_MODE 0x0800 -#define IXGBE_MII_SPEED_SELECTION_REG 0x10 -#define IXGBE_MII_RESTART 0x200 -#define IXGBE_MII_AUTONEG_COMPLETE 0x20 -#define IXGBE_MII_AUTONEG_REG 0x0 +#define IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG 0x20 /* 10G Control Reg */ +#define IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG 0xC400 /* 1G Provisioning 1 */ +#define IXGBE_MII_AUTONEG_XNP_TX_REG 0x17 /* 1G XNP Transmit */ +#define IXGBE_MII_AUTONEG_ADVERTISE_REG 0x10 /* 100M Advertisement */ +#define IXGBE_MII_10GBASE_T_ADVERTISE 0x1000 /* full duplex, bit:12*/ +#define IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX 0x4000 /* full duplex, bit:14*/ +#define IXGBE_MII_1GBASE_T_ADVERTISE 0x8000 /* full duplex, bit:15*/ +#define IXGBE_MII_100BASE_T_ADVERTISE 0x0100 /* full duplex, bit:8 */ +#define IXGBE_MII_RESTART 0x200 +#define IXGBE_MII_AUTONEG_COMPLETE 0x20 +#define IXGBE_MII_AUTONEG_LINK_UP 0x04 +#define IXGBE_MII_AUTONEG_REG 0x0 #define IXGBE_PHY_REVISION_MASK 0xFFFFFFF0 #define IXGBE_MAX_PHY_ADDR 32 @@ -1408,6 +1431,8 @@ #define IXGBE_AUTOC_KX4_SUPP 0x80000000 #define IXGBE_AUTOC_KX_SUPP 0x40000000 #define IXGBE_AUTOC_PAUSE 0x30000000 +#define IXGBE_AUTOC_ASM_PAUSE 0x20000000 +#define IXGBE_AUTOC_SYM_PAUSE 0x10000000 #define IXGBE_AUTOC_RF 0x08000000 #define IXGBE_AUTOC_PD_TMR 0x06000000 #define IXGBE_AUTOC_AN_RX_LOOSE 0x01000000 @@ -1476,6 +1501,8 @@ #define IXGBE_LINK_UP_TIME 90 /* 9.0 Seconds */ #define IXGBE_AUTO_NEG_TIME 45 /* 4.5 Seconds */ +#define IXGBE_LINKS2_AN_SUPPORTED 0x00000040 + /* PCS1GLSTA Bit Masks */ #define IXGBE_PCS1GLSTA_LINK_OK 1 #define IXGBE_PCS1GLSTA_SYNK_OK 0x10 @@ -1496,12 +1523,18 @@ #define IXGBE_PCS1GLCTL_AN_ENABLE 0x10000 #define IXGBE_PCS1GLCTL_AN_RESTART 0x20000 +/* ANLP1 Bit Masks */ +#define IXGBE_ANLP1_PAUSE 0x0C00 +#define IXGBE_ANLP1_SYM_PAUSE 0x0400 +#define IXGBE_ANLP1_ASM_PAUSE 0x0800 + /* SW Semaphore Register bitmasks */ #define IXGBE_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */ #define IXGBE_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */ #define IXGBE_SWSM_WMNG 0x00000004 /* Wake MNG Clock */ +#define IXGBE_SWFW_REGSMP 0x80000000 /* Register Semaphore bit 31 */ -/* GSSR definitions */ +/* SW_FW_SYNC/GSSR definitions */ #define IXGBE_GSSR_EEP_SM 0x0001 #define IXGBE_GSSR_PHY0_SM 0x0002 #define IXGBE_GSSR_PHY1_SM 0x0004 @@ -1521,20 +1554,24 @@ #define IXGBE_EEC_GNT 0x00000080 /* EEPROM Access Grant */ #define IXGBE_EEC_PRES 0x00000100 /* EEPROM Present */ #define IXGBE_EEC_ARD 0x00000200 /* EEPROM Auto Read Done */ +#define IXGBE_EEC_FLUP 0x00800000 /* Flash update command */ +#define IXGBE_EEC_FLUDONE 0x04000000 /* Flash update done */ /* EEPROM Addressing bits based on type (0-small, 1-large) */ #define IXGBE_EEC_ADDR_SIZE 0x00000400 #define IXGBE_EEC_SIZE 0x00007800 /* EEPROM Size */ -#define IXGBE_EEC_SIZE_SHIFT 11 -#define IXGBE_EEPROM_WORD_SIZE_SHIFT 6 -#define IXGBE_EEPROM_OPCODE_BITS 8 +#define IXGBE_EEC_SIZE_SHIFT 11 +#define IXGBE_EEPROM_WORD_SIZE_BASE_SHIFT 6 +#define IXGBE_EEPROM_OPCODE_BITS 8 /* Checksum and EEPROM pointers */ #define IXGBE_EEPROM_CHECKSUM 0x3F #define IXGBE_EEPROM_SUM 0xBABA #define IXGBE_PCIE_ANALOG_PTR 0x03 #define IXGBE_ATLAS0_CONFIG_PTR 0x04 +#define IXGBE_PHY_PTR 0x04 #define IXGBE_ATLAS1_CONFIG_PTR 0x05 +#define IXGBE_OPTION_ROM_PTR 0x05 #define IXGBE_PCIE_GENERAL_PTR 0x06 #define IXGBE_PCIE_CONFIG0_PTR 0x07 #define IXGBE_PCIE_CONFIG1_PTR 0x08 @@ -1577,10 +1614,12 @@ #define IXGBE_EEPROM_ERASE256_OPCODE_SPI 0xDB /* EEPROM ERASE 256B */ /* EEPROM Read Register */ -#define IXGBE_EEPROM_READ_REG_DATA 16 /* data offset in EEPROM read reg */ -#define IXGBE_EEPROM_READ_REG_DONE 2 /* Offset to READ done bit */ -#define IXGBE_EEPROM_READ_REG_START 1 /* First bit to start operation */ -#define IXGBE_EEPROM_READ_ADDR_SHIFT 2 /* Shift to the address bits */ +#define IXGBE_EEPROM_RW_REG_DATA 16 /* data offset in EEPROM read reg */ +#define IXGBE_EEPROM_RW_REG_DONE 2 /* Offset to READ done bit */ +#define IXGBE_EEPROM_RW_REG_START 1 /* First bit to start operation */ +#define IXGBE_EEPROM_RW_ADDR_SHIFT 2 /* Shift to the address bits */ +#define IXGBE_NVM_POLL_WRITE 1 /* Flag for polling for write complete */ +#define IXGBE_NVM_POLL_READ 0 /* Flag for polling for read complete */ #define IXGBE_ETH_LENGTH_OF_ADDRESS 6 @@ -1588,10 +1627,12 @@ #define IXGBE_EEPROM_GRANT_ATTEMPTS 1000 /* EEPROM # attempts to gain grant */ #endif -#ifndef IXGBE_EERD_ATTEMPTS -/* Number of 5 microseconds we wait for EERD read to complete */ -#define IXGBE_EERD_ATTEMPTS 100000 -#endif +/* Number of 5 microseconds we wait for EERD read and + * EERW write to complete */ +#define IXGBE_EERD_EEWR_ATTEMPTS 100000 + +/* # attempts we wait for flush update to complete */ +#define IXGBE_FLUDONE_ATTEMPTS 20000 #define IXGBE_PCIE_CTRL2 0x5 /* PCIe Control 2 Offset */ #define IXGBE_PCIE_CTRL2_DUMMY_ENABLE 0x8 /* Dummy Function Enable */ @@ -1604,9 +1645,18 @@ #define IXGBE_DEVICE_CAPS_FCOE_OFFLOADS 0x2 #define IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR 0x4 #define IXGBE_FW_PATCH_VERSION_4 0x7 +#define IXGBE_ALT_SAN_MAC_ADDR_BLK_PTR 0x27 /* Alt. SAN MAC block */ +#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_OFFSET 0x0 /* Alt. SAN MAC capability */ +#define IXGBE_ALT_SAN_MAC_ADDR_PORT0_OFFSET 0x1 /* Alt. SAN MAC 0 offset */ +#define IXGBE_ALT_SAN_MAC_ADDR_PORT1_OFFSET 0x4 /* Alt. SAN MAC 1 offset */ +#define IXGBE_ALT_SAN_MAC_ADDR_WWNN_OFFSET 0x7 /* Alt. WWNN prefix offset */ +#define IXGBE_ALT_SAN_MAC_ADDR_WWPN_OFFSET 0x8 /* Alt. WWPN prefix offset */ +#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_SANMAC 0x0 /* Alt. SAN MAC exists */ +#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN 0x1 /* Alt. WWN base exists */ /* PCI Bus Info */ #define IXGBE_PCI_LINK_STATUS 0xB2 +#define IXGBE_PCI_DEVICE_CONTROL2 0xC8 #define IXGBE_PCI_LINK_WIDTH 0x3F0 #define IXGBE_PCI_LINK_WIDTH_1 0x10 #define IXGBE_PCI_LINK_WIDTH_2 0x20 @@ -1617,6 +1667,7 @@ #define IXGBE_PCI_LINK_SPEED_5000 0x2 #define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E #define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80 +#define IXGBE_PCI_DEVICE_CONTROL2_16ms 0x0005 /* Number of 100 microseconds we wait for PCI Express master disable */ #define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800 @@ -2210,6 +2261,7 @@ struct ixgbe_atr_input { enum ixgbe_eeprom_type { ixgbe_eeprom_uninitialized = 0, ixgbe_eeprom_spi, + ixgbe_flash, ixgbe_eeprom_none /* No NVM support */ }; @@ -2269,6 +2321,7 @@ enum ixgbe_media_type { ixgbe_media_type_fiber, ixgbe_media_type_copper, ixgbe_media_type_backplane, + ixgbe_media_type_cx4, ixgbe_media_type_virtual }; @@ -2281,6 +2334,14 @@ enum ixgbe_fc_mode { ixgbe_fc_default }; +/* Smart Speed Settings */ +#define IXGBE_SMARTSPEED_MAX_RETRIES 3 +enum ixgbe_smart_speed { + ixgbe_smart_speed_auto = 0, + ixgbe_smart_speed_on, + ixgbe_smart_speed_off +}; + /* PCI bus types */ enum ixgbe_bus_type { ixgbe_bus_type_unknown = 0, @@ -2434,6 +2495,7 @@ struct ixgbe_eeprom_operations { s32 (*write)(struct ixgbe_hw *, u16, u16); s32 (*validate_checksum)(struct ixgbe_hw *, u16 *); s32 (*update_checksum)(struct ixgbe_hw *); + u16 (*calc_checksum)(struct ixgbe_hw *); }; struct ixgbe_mac_operations { @@ -2447,6 +2509,7 @@ struct ixgbe_mac_operations { s32 (*get_san_mac_addr)(struct ixgbe_hw *, u8 *); s32 (*set_san_mac_addr)(struct ixgbe_hw *, u8 *); s32 (*get_device_caps)(struct ixgbe_hw *, u16 *); + s32 (*get_wwn_prefix)(struct ixgbe_hw *, u16 *, u16 *); s32 (*stop_adapter)(struct ixgbe_hw *); s32 (*get_bus_info)(struct ixgbe_hw *); void (*set_lan_id)(struct ixgbe_hw *); @@ -2458,9 +2521,7 @@ struct ixgbe_mac_operations { void (*release_swfw_sync)(struct ixgbe_hw *, u16); /* Link */ - s32 (*setup_link)(struct ixgbe_hw *); - s32 (*setup_link_speed)(struct ixgbe_hw *, ixgbe_link_speed, bool, - bool); + s32 (*setup_link)(struct ixgbe_hw *, ixgbe_link_speed, bool, bool); s32 (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *, bool); s32 (*get_link_capabilities)(struct ixgbe_hw *, ixgbe_link_speed *, bool *); @@ -2525,6 +2586,10 @@ struct ixgbe_mac_info { u8 addr[IXGBE_ETH_LENGTH_OF_ADDRESS]; u8 perm_addr[IXGBE_ETH_LENGTH_OF_ADDRESS]; u8 san_addr[IXGBE_ETH_LENGTH_OF_ADDRESS]; + /* prefix for World Wide Node Name (WWNN) */ + u16 wwnn_prefix; + /* prefix for World Wide Port Name (WWPN) */ + u16 wwpn_prefix; s32 mc_filter_type; u32 mcft_size; u32 vft_size; @@ -2537,8 +2602,6 @@ struct ixgbe_mac_info { u32 orig_autoc; u32 orig_autoc2; bool orig_link_settings_stored; - bool autoneg; - bool autoneg_succeeded; bool autotry_restart; }; @@ -2553,7 +2616,8 @@ struct ixgbe_phy_info { enum ixgbe_media_type media_type; bool reset_disable; ixgbe_autoneg_advertised autoneg_advertised; - bool autoneg_wait_to_complete; + enum ixgbe_smart_speed smart_speed; + bool smart_speed_active; bool multispeed_fiber; }; diff --git a/sys/dev/jme/if_jme.c b/sys/dev/jme/if_jme.c index 86d9c57ee015..4bfffa334452 100644 --- a/sys/dev/jme/if_jme.c +++ b/sys/dev/jme/if_jme.c @@ -306,6 +306,10 @@ jme_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) sc = ifp->if_softc; JME_LOCK(sc); + if ((ifp->if_flags & IFF_UP) == 0) { + JME_UNLOCK(sc); + return; + } mii = device_get_softc(sc->jme_miibus); mii_pollstat(mii); @@ -458,15 +462,7 @@ jme_reg_macaddr(struct jme_softc *sc) if ((par0 == 0 && par1 == 0) || (par0 == 0xFFFFFFFF && par1 == 0xFFFF)) { device_printf(sc->jme_dev, - "generating fake ethernet address.\n"); - par0 = arc4random(); - /* Set OUI to JMicron. */ - sc->jme_eaddr[0] = 0x00; - sc->jme_eaddr[1] = 0x1B; - sc->jme_eaddr[2] = 0x8C; - sc->jme_eaddr[3] = (par0 >> 16) & 0xff; - sc->jme_eaddr[4] = (par0 >> 8) & 0xff; - sc->jme_eaddr[5] = par0 & 0xff; + "Failed to retrieve Ethernet address.\n"); } else { sc->jme_eaddr[0] = (par0 >> 0) & 0xFF; sc->jme_eaddr[1] = (par0 >> 8) & 0xFF; @@ -779,7 +775,7 @@ jme_attach(device_t dev) /* VLAN capability setup */ ifp->if_capabilities |= IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | - IFCAP_VLAN_HWCSUM; + IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO; ifp->if_capenable = ifp->if_capabilities; /* Tell the upper layer(s) we support long frames. */ @@ -1585,8 +1581,10 @@ jme_resume(device_t dev) pmc + PCIR_POWER_STATUS, pmstat, 2); } ifp = sc->jme_ifp; - if ((ifp->if_flags & IFF_UP) != 0) + if ((ifp->if_flags & IFF_UP) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; jme_init_locked(sc); + } JME_UNLOCK(sc); @@ -1861,6 +1859,7 @@ jme_watchdog(struct jme_softc *sc) if ((sc->jme_flags & JME_FLAG_LINK) == 0) { if_printf(sc->jme_ifp, "watchdog timeout (missed link)\n"); ifp->if_oerrors++; + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; jme_init_locked(sc); return; } @@ -1875,6 +1874,7 @@ jme_watchdog(struct jme_softc *sc) if_printf(sc->jme_ifp, "watchdog timeout\n"); ifp->if_oerrors++; + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; jme_init_locked(sc); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) taskqueue_enqueue(sc->jme_tq, &sc->jme_tx_task); @@ -1917,8 +1917,10 @@ jme_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) VLAN_CAPABILITIES(ifp); } ifp->if_mtu = ifr->ifr_mtu; - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; jme_init_locked(sc); + } JME_UNLOCK(sc); } break; @@ -1990,6 +1992,9 @@ jme_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if ((mask & IFCAP_VLAN_HWCSUM) != 0 && (ifp->if_capabilities & IFCAP_VLAN_HWCSUM) != 0) ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; + if ((mask & IFCAP_VLAN_HWTSO) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) + ifp->if_capenable ^= IFCAP_VLAN_HWTSO; if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && (IFCAP_VLAN_HWTAGGING & ifp->if_capabilities) != 0) { ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; @@ -2642,6 +2647,8 @@ jme_init_locked(struct jme_softc *sc) ifp = sc->jme_ifp; mii = device_get_softc(sc->jme_miibus); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + return; /* * Cancel any pending I/O. */ diff --git a/sys/dev/ksyms/ksyms.c b/sys/dev/ksyms/ksyms.c index fc368c7dca00..3a1adca78d37 100644 --- a/sys/dev/ksyms/ksyms.c +++ b/sys/dev/ksyms/ksyms.c @@ -94,7 +94,7 @@ struct ksyms_softc { static struct mtx ksyms_mtx; static struct cdev *ksyms_dev; static LIST_HEAD(, ksyms_softc) ksyms_list = - LIST_HEAD_INITIALIZER(&ksyms_list); + LIST_HEAD_INITIALIZER(ksyms_list); static const char ksyms_shstrtab[] = "\0" STR_SYMTAB "\0" STR_STRTAB "\0" STR_SHSTRTAB "\0"; @@ -589,8 +589,8 @@ ksyms_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int32_t flag __unused, /* ARGUSED */ static int -ksyms_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, - int prot __unused) +ksyms_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot __unused, vm_memattr_t *memattr __unused) { struct ksyms_softc *sc; int error; diff --git a/sys/dev/led/led.c b/sys/dev/led/led.c index 1d902d56aa75..fdd0fa2d0062 100644 --- a/sys/dev/led/led.c +++ b/sys/dev/led/led.c @@ -40,7 +40,7 @@ struct ledsc { static struct unrhdr *led_unit; static struct mtx led_mtx; static struct sx led_sx; -static LIST_HEAD(, ledsc) led_list = LIST_HEAD_INITIALIZER(&led_list); +static LIST_HEAD(, ledsc) led_list = LIST_HEAD_INITIALIZER(led_list); static struct callout led_ch; static MALLOC_DEFINE(M_LED, "LED", "LED driver"); diff --git a/sys/dev/lge/if_lge.c b/sys/dev/lge/if_lge.c index 79a915633df6..b870bf0c8bae 100644 --- a/sys/dev/lge/if_lge.c +++ b/sys/dev/lge/if_lge.c @@ -137,7 +137,7 @@ static int lge_ioctl(struct ifnet *, u_long, caddr_t); static void lge_init(void *); static void lge_init_locked(struct lge_softc *); static void lge_stop(struct lge_softc *); -static void lge_watchdog(struct ifnet *); +static void lge_watchdog(struct lge_softc *); static int lge_shutdown(device_t); static int lge_ifmedia_upd(struct ifnet *); static void lge_ifmedia_upd_locked(struct ifnet *); @@ -544,7 +544,6 @@ lge_attach(dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = lge_ioctl; ifp->if_start = lge_start; - ifp->if_watchdog = lge_watchdog; ifp->if_init = lge_init; ifp->if_snd.ifq_maxlen = LGE_TX_LIST_CNT - 1; ifp->if_capabilities = IFCAP_RXCSUM; @@ -1000,7 +999,7 @@ lge_txeof(sc) ifp = sc->lge_ifp; /* Clear the timeout timer. */ - ifp->if_timer = 0; + sc->lge_timer = 0; /* * Go through our tx list and free mbufs for those @@ -1021,7 +1020,7 @@ lge_txeof(sc) txdone--; LGE_INC(idx, LGE_TX_LIST_CNT); - ifp->if_timer = 0; + sc->lge_timer = 0; } sc->lge_cdata.lge_tx_cons = idx; @@ -1064,6 +1063,8 @@ lge_tick(xsc) } } + if (sc->lge_timer != 0 && --sc->lge_timer == 0) + lge_watchdog(sc); callout_reset(&sc->lge_stat_callout, hz, lge_tick, sc); return; @@ -1236,7 +1237,7 @@ lge_start_locked(ifp) /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->lge_timer = 5; return; } @@ -1506,14 +1507,14 @@ lge_ioctl(ifp, command, data) } static void -lge_watchdog(ifp) - struct ifnet *ifp; -{ +lge_watchdog(sc) struct lge_softc *sc; +{ + struct ifnet *ifp; - sc = ifp->if_softc; + LGE_LOCK_ASSERT(sc); + ifp = sc->lge_ifp; - LGE_LOCK(sc); ifp->if_oerrors++; if_printf(ifp, "watchdog timeout\n"); @@ -1524,9 +1525,6 @@ lge_watchdog(ifp) if (ifp->if_snd.ifq_head != NULL) lge_start_locked(ifp); - LGE_UNLOCK(sc); - - return; } /* @@ -1542,7 +1540,7 @@ lge_stop(sc) LGE_LOCK_ASSERT(sc); ifp = sc->lge_ifp; - ifp->if_timer = 0; + sc->lge_timer = 0; callout_stop(&sc->lge_stat_callout); CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_INTR_ENB); diff --git a/sys/dev/lge/if_lgereg.h b/sys/dev/lge/if_lgereg.h index d1894656cdc5..b963d57ab946 100644 --- a/sys/dev/lge/if_lgereg.h +++ b/sys/dev/lge/if_lgereg.h @@ -534,6 +534,7 @@ struct lge_softc { u_int8_t lge_link; u_int8_t lge_pcs; int lge_if_flags; + int lge_timer; struct lge_list_data *lge_ldata; struct lge_ring_data lge_cdata; struct callout lge_stat_callout; diff --git a/sys/dev/lmc/if_lmc.c b/sys/dev/lmc/if_lmc.c index e03f33c414ae..a2cb24e67d8f 100644 --- a/sys/dev/lmc/if_lmc.c +++ b/sys/dev/lmc/if_lmc.c @@ -4642,8 +4642,9 @@ lmc_raw_output(struct ifnet *ifp, struct mbuf *m, /* Called from a softirq once a second. */ static void -lmc_ifnet_watchdog(struct ifnet *ifp) +lmc_watchdog(void *arg) { + struct ifnet *ifp = arg; softc_t *sc = IFP2SC(ifp); u_int8_t old_oper_status = sc->status.oper_status; struct event_cntrs *cntrs = &sc->status.cntrs; @@ -4734,7 +4735,7 @@ lmc_ifnet_watchdog(struct ifnet *ifp) # endif /* Call this procedure again after one second. */ - ifp->if_timer = 1; + callout_reset(&sc->callout, hz, lmc_watchdog, ifp); } # ifdef __OpenBSD__ @@ -4822,8 +4823,6 @@ setup_ifnet(struct ifnet *ifp) ifp->if_start = lmc_ifnet_start; /* sppp changes this */ ifp->if_output = lmc_raw_output; /* sppp & p2p change this */ ifp->if_input = lmc_raw_input; - ifp->if_watchdog = lmc_ifnet_watchdog; - ifp->if_timer = 1; ifp->if_mtu = MAX_DESC_LEN; /* sppp & p2p change this */ ifp->if_type = IFT_PTPSERIAL; /* p2p changes this */ @@ -4843,7 +4842,7 @@ setup_ifnet(struct ifnet *ifp) if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev)); # elif defined(__NetBSD__) strcpy(ifp->if_xname, sc->dev.dv_xname); -# elif __OpenBSD__ +# elif defined(__OpenBSD__) bcopy(sc->dev.dv_xname, ifp->if_xname, IFNAMSIZ); # elif defined(__bsdi__) ifp->if_name = sc->dev.dv_cfdata->cf_driver->cd_name; @@ -4917,6 +4916,8 @@ lmc_ifnet_attach(softc_t *sc) } # endif /* __OpenBSD__ */ + callout_reset(&sc->callout, hz, lmc_watchdog, sc); + return 0; } @@ -5244,7 +5245,7 @@ ng_watchdog(void *arg) sc->status.line_prot = 0; /* Call this procedure again after one second. */ - callout_reset(&sc->ng_callout, hz, ng_watchdog, sc); + callout_reset(&sc->callout, hz, ng_watchdog, sc); } # endif @@ -5301,16 +5302,9 @@ ng_attach(softc_t *sc) IFQ_SET_MAXLEN(&sc->ng_sndq, SNDQ_MAXLEN); IFQ_SET_READY(&sc->ng_sndq); - /* If ifnet is present, it will call watchdog. */ - /* Otherwise, arrange to call watchdog here. */ # if (IFNET == 0) /* Arrange to call ng_watchdog() once a second. */ -# if (__FreeBSD_version >= 500000) - callout_init(&sc->ng_callout, 0); -# else /* FreeBSD-4 */ - callout_init(&sc->ng_callout); -# endif - callout_reset(&sc->ng_callout, hz, ng_watchdog, sc); + callout_reset(&sc->callout, hz, ng_watchdog, sc); # endif return 0; @@ -5319,9 +5313,7 @@ ng_attach(softc_t *sc) static void ng_detach(softc_t *sc) { -# if (IFNET == 0) - callout_stop(&sc->ng_callout); -# endif + callout_drain(&sc->callout); # if (__FreeBSD_version >= 500000) mtx_destroy(&sc->ng_sndq.ifq_mtx); mtx_destroy(&sc->ng_fastq.ifq_mtx); @@ -5493,6 +5485,12 @@ attach_card(softc_t *sc, const char *intrstr) /* Start the card. */ if ((error = startup_card(sc))) return error; +# if (__FreeBSD_version >= 500000) + callout_init(&sc->callout, 0); +# else /* FreeBSD-4 */ + callout_init(&sc->callout); +# endif + /* Attach a kernel interface. */ #if NETGRAPH if ((error = ng_attach(sc))) return error; diff --git a/sys/dev/lmc/if_lmc.h b/sys/dev/lmc/if_lmc.h index fb34e03117dc..0212f514bf23 100644 --- a/sys/dev/lmc/if_lmc.h +++ b/sys/dev/lmc/if_lmc.h @@ -1140,7 +1140,6 @@ struct softc #endif #if NETGRAPH - struct callout ng_callout; /* ng_watchdog needs this */ node_p ng_node; /* pointer to our node struct */ hook_p ng_hook; /* non-zero means NETGRAPH owns device */ # if (__FreeBSD_version >= 503000) @@ -1153,6 +1152,7 @@ struct softc #endif #ifdef __FreeBSD__ + struct callout callout; /* watchdog needs this */ struct device *dev; /* base device pointer */ bus_space_tag_t csr_tag; /* bus_space needs this */ bus_space_handle_t csr_handle;/* bus_space_needs this */ @@ -1596,7 +1596,6 @@ static int lmc_ifnet_ioctl(struct ifnet *, u_long, caddr_t); static void lmc_ifnet_start(struct ifnet *); static int lmc_raw_output(struct ifnet *, struct mbuf *, struct sockaddr *, struct route *); -static void lmc_ifnet_watchdog(struct ifnet *); # ifdef __OpenBSD__ static int ifmedia_change(struct ifnet *); static void ifmedia_status(struct ifnet *, struct ifmediareq *); diff --git a/sys/dev/malo/if_malo.c b/sys/dev/malo/if_malo.c index d77718b0d1e3..21354ef58f6c 100644 --- a/sys/dev/malo/if_malo.c +++ b/sys/dev/malo/if_malo.c @@ -135,7 +135,7 @@ static int malo_setup_hwdma(struct malo_softc *); static void malo_txq_init(struct malo_softc *, struct malo_txq *, int); static void malo_tx_cleanupq(struct malo_softc *, struct malo_txq *); static void malo_start(struct ifnet *); -static void malo_watchdog(struct ifnet *); +static void malo_watchdog(void *); static int malo_ioctl(struct ifnet *, u_long, caddr_t); static void malo_updateslot(struct ifnet *); static int malo_newstate(struct ieee80211vap *, enum ieee80211_state, int); @@ -191,6 +191,7 @@ malo_attach(uint16_t devid, struct malo_softc *sc) ic = ifp->if_l2com; MALO_LOCK_INIT(sc); + callout_init_mtx(&sc->malo_watchdog_timer, &sc->malo_mtx, 0); /* set these up early for if_printf use */ if_initname(ifp, device_get_name(sc->malo_dev), @@ -272,7 +273,6 @@ malo_attach(uint16_t devid, struct malo_softc *sc) ifp->if_softc = sc; ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST; ifp->if_start = malo_start; - ifp->if_watchdog = malo_watchdog; ifp->if_ioctl = malo_ioctl; ifp->if_init = malo_init; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); @@ -1076,7 +1076,7 @@ malo_tx_proc(void *arg, int npending) if (nreaped != 0) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - ifp->if_timer = 0; + sc->malo_timer = 0; malo_start(ifp); } } @@ -1260,7 +1260,7 @@ malo_tx_start(struct malo_softc *sc, struct ieee80211_node *ni, MALO_TXDESC_SYNC(txq, ds, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); ifp->if_opackets++; - ifp->if_timer = 5; + sc->malo_timer = 5; MALO_TXQ_UNLOCK(txq); return 0; #undef IEEE80211_DIR_DSTODS @@ -1339,10 +1339,17 @@ malo_start(struct ifnet *ifp) } static void -malo_watchdog(struct ifnet *ifp) +malo_watchdog(void *arg) { - struct malo_softc *sc = ifp->if_softc; + struct malo_softc *sc; + struct ifnet *ifp; + sc = arg; + callout_reset(&sc->malo_watchdog_timer, hz, malo_watchdog, sc); + if (sc->malo_timer == 0 || --sc->malo_timer > 0) + return; + + ifp = sc->malo_ifp; if ((ifp->if_drv_flags & IFF_DRV_RUNNING) && !sc->malo_invalid) { if_printf(ifp, "watchdog timeout\n"); @@ -1536,6 +1543,7 @@ malo_init_locked(struct malo_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; malo_hal_intrset(mh, sc->malo_imask); + callout_reset(&sc->malo_watchdog_timer, hz, malo_watchdog, sc); } static void @@ -1699,7 +1707,8 @@ malo_stop_locked(struct ifnet *ifp, int disable) * is gone (invalid). */ ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - ifp->if_timer = 0; + callout_stop(&sc->malo_watchdog_timer); + sc->malo_timer = 0; /* diable interrupt. */ malo_hal_intrset(mh, 0); /* turn off the radio. */ @@ -2099,7 +2108,7 @@ malo_rx_proc(void *arg, int npending) * payload prior to constructing the header. */ m = bf->bf_m; - data = mtod(m, uint8_t *);; + data = mtod(m, uint8_t *); hdrlen = ieee80211_anyhdrsize(data + sizeof(uint16_t)); off = sizeof(uint16_t) + sizeof(struct ieee80211_frame_addr4); @@ -2241,6 +2250,7 @@ malo_detach(struct malo_softc *sc) * Other than that, it's straightforward... */ ieee80211_ifdetach(ic); + callout_drain(&sc->malo_watchdog_timer); malo_dma_cleanup(sc); malo_tx_cleanup(sc); malo_hal_detach(sc->malo_mh); diff --git a/sys/dev/malo/if_malo.h b/sys/dev/malo/if_malo.h index 7e3a7e89e486..bac290c6330b 100644 --- a/sys/dev/malo/if_malo.h +++ b/sys/dev/malo/if_malo.h @@ -550,6 +550,8 @@ struct malo_softc { struct malo_txq malo_txq[MALO_NUM_TX_QUEUES]; struct task malo_txtask; /* tx int processing */ + struct callout malo_watchdog_timer; + int malo_timer; struct malo_tx_radiotap_header malo_tx_th; struct malo_rx_radiotap_header malo_rx_th; diff --git a/sys/dev/mc146818/mc146818.c b/sys/dev/mc146818/mc146818.c index ea59d2c3c540..108ee5ae41b1 100644 --- a/sys/dev/mc146818/mc146818.c +++ b/sys/dev/mc146818/mc146818.c @@ -9,8 +9,6 @@ * 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 ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -23,7 +21,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * from: NetBSD: mc146818.c,v 1.4 2003/11/24 06:20:40 tsutsui Exp + * $NetBSD: mc146818.c,v 1.16 2008/05/14 13:29:28 tsutsui Exp $ */ #include @@ -94,7 +92,7 @@ mc146818_attach(device_t dev) (*sc->sc_mcwrite)(dev, MC_REGB, sc->sc_regb); mtx_unlock_spin(&sc->sc_mtx); - clock_register(dev, 1000000); /* 1 second resolution. */ + clock_register(dev, 1000000); /* 1 second resolution */ return (0); } @@ -116,7 +114,7 @@ mc146818_gettime(device_t dev, struct timespec *ts) /* * If MC_REGA_UIP is 0 we have at least 244us before the next - * update. If it's 1 an update is imminent. + * update. If it's 1 an update is imminent. */ for (;;) { mtx_lock_spin(&sc->sc_mtx); @@ -260,6 +258,9 @@ mc146818_def_write(device_t dev, u_int reg, u_int val) bus_space_write_1(sc->sc_bst, sc->sc_bsh, MC_DATA, val); } +#undef MC_ADDR +#undef MC_DATA + /* * Looks like it's common even across platforms to store the century at * 0x32 in the NVRAM of the mc146818. @@ -283,3 +284,5 @@ mc146818_def_setcent(device_t dev, u_int cent) sc = device_get_softc(dev); (*sc->sc_mcwrite)(dev, MC_CENT, cent); } + +#undef MC_CENT diff --git a/sys/dev/mc146818/mc146818reg.h b/sys/dev/mc146818/mc146818reg.h index 7e17aa248d3a..811187e4b7d1 100644 --- a/sys/dev/mc146818/mc146818reg.h +++ b/sys/dev/mc146818/mc146818reg.h @@ -1,17 +1,17 @@ /*- * Copyright (c) 1995 Carnegie-Mellon University. * All rights reserved. - * + * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU @@ -22,7 +22,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * from: NetBSD: mc146818reg.h,v 1.5 2003/11/02 11:07:45 wiz Exp + * $NetBSD: mc146818reg.h,v 1.9 2006/03/08 23:46:25 lukem Exp $ * * $FreeBSD$ */ @@ -122,8 +122,8 @@ * Periodic Interrupt Rate Select constants (Control register A) */ #define MC_RATE_NONE 0x0 /* No periodic interrupt */ -#define MC_RATE_1 0x1 /* 256 Hz if MC_BASE_32_KHz, else 32768 Hz */ -#define MC_RATE_2 0x2 /* 128 Hz if MC_BASE_32_KHz, else 16384 Hz */ +#define MC_RATE_1 0x1 /* 256 Hz if MC_BASE_32_KHz, else 32768 Hz */ +#define MC_RATE_2 0x2 /* 128 Hz if MC_BASE_32_KHz, else 16384 Hz */ #define MC_RATE_8192_Hz 0x3 /* 122.070 us period */ #define MC_RATE_4096_Hz 0x4 /* 244.141 us period */ #define MC_RATE_2048_Hz 0x5 /* 488.281 us period */ @@ -141,8 +141,8 @@ /* * Time base (divisor select) constants (Control register A) */ -#define MC_BASE_4_MHz 0x00 /* 4MHz crystal */ -#define MC_BASE_1_MHz MC_REGA_DV0 /* 1MHz crystal */ -#define MC_BASE_32_KHz MC_REGA_DV1 /* 32KHz crystal */ +#define MC_BASE_4_MHz 0x00 /* 4 MHz crystal */ +#define MC_BASE_1_MHz MC_REGA_DV0 /* 1 MHz crystal */ +#define MC_BASE_32_KHz MC_REGA_DV1 /* 32 KHz crystal */ #define MC_BASE_NONE (MC_REGA_DV2 | MC_REGA_DV1) /* actually also resets */ #define MC_BASE_RESET (MC_REGA_DV2 | MC_REGA_DV1 | MC_REGA_DV0) diff --git a/sys/dev/mc146818/mc146818var.h b/sys/dev/mc146818/mc146818var.h index cce95086edf3..722b4fe1e77c 100644 --- a/sys/dev/mc146818/mc146818var.h +++ b/sys/dev/mc146818/mc146818var.h @@ -9,8 +9,6 @@ * 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 ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -23,7 +21,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * from: NetBSD: mc146818var.h,v 1.3 2003/11/24 06:20:40 tsutsui Exp + * $NetBSD: mc146818var.h,v 1.7 2008/05/14 13:29:29 tsutsui Exp $ * * $FreeBSD$ */ @@ -38,29 +36,30 @@ struct mc146818_softc { u_char sc_regb; /* register B */ u_int sc_year0; /* year counter offset */ + u_int sc_flag; /* MD flags */ -#define MC146818_NO_CENT_ADJUST 0x0001 /* don't adjust century */ -#define MC146818_BCD 0x0002 /* use BCD mode */ -#define MC146818_12HR 0x0004 /* use AM/PM mode */ +#define MC146818_NO_CENT_ADJUST 0x0001 /* don't adjust century */ +#define MC146818_BCD 0x0002 /* use BCD mode */ +#define MC146818_12HR 0x0004 /* use AM/PM mode */ /* MD chip register read/write functions */ - u_int (*sc_mcread)(device_t, u_int); - void (*sc_mcwrite)(device_t, u_int, u_int); + u_int (*sc_mcread)(device_t dev, u_int reg); + void (*sc_mcwrite)(device_t dev, u_int reg, u_int val); /* MD century get/set functions */ - u_int (*sc_getcent)(device_t); - void (*sc_setcent)(device_t, u_int); + u_int (*sc_getcent)(device_t dev); + void (*sc_setcent)(device_t dev, u_int cent); }; /* Default read/write functions */ -u_int mc146818_def_read(device_t, u_int); -void mc146818_def_write(device_t, u_int, u_int); +u_int mc146818_def_read(device_t dev, u_int reg); +void mc146818_def_write(device_t dev, u_int reg, u_int val); /* Chip attach function */ int mc146818_attach(device_t); /* Methods for the clock interface */ #ifdef notyet -int mc146818_getsecs(device_t, int *); +int mc146818_getsecs(device_t dev, int *secp); #endif -int mc146818_gettime(device_t, struct timespec *); -int mc146818_settime(device_t, struct timespec *); +int mc146818_gettime(device_t dev, struct timespec *ts); +int mc146818_settime(device_t dev, struct timespec *ts); diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 87e5ac9e6a6e..78f2af3673cc 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -152,7 +152,7 @@ struct g_class g_md_class = { DECLARE_GEOM_CLASS(g_md_class, g_md); -static LIST_HEAD(, md_s) md_softc_list = LIST_HEAD_INITIALIZER(&md_softc_list); +static LIST_HEAD(, md_s) md_softc_list = LIST_HEAD_INITIALIZER(md_softc_list); #define NINDIR (PAGE_SIZE / sizeof(uintptr_t)) #define NMASK (NINDIR-1) @@ -814,6 +814,8 @@ mdcreate_preload(struct md_s *sc, struct md_ioctl *mdio) if (mdio->md_options & ~(MD_AUTOUNIT | MD_FORCE)) return (EINVAL); + if (mdio->md_base == 0) + return (EINVAL); sc->flags = mdio->md_options & MD_FORCE; /* Cast to pointer size, then to pointer to avoid warning */ sc->pl_ptr = (u_char *)(uintptr_t)mdio->md_base; diff --git a/sys/dev/mge/if_mge.c b/sys/dev/mge/if_mge.c index 0188ae3b79f8..8ae6edea0ed0 100644 --- a/sys/dev/mge/if_mge.c +++ b/sys/dev/mge/if_mge.c @@ -457,10 +457,7 @@ mge_allocate_dma(struct mge_softc *sc) { int error; struct mge_desc_wrapper *dw; - int num, i; - - - num = MGE_TX_DESC_NUM + MGE_RX_DESC_NUM; + int i; /* Allocate a busdma tag and DMA safe memory for TX/RX descriptors. */ error = bus_dma_tag_create(NULL, /* parent */ @@ -543,7 +540,7 @@ mge_reinit_rx(struct mge_softc *sc) struct mge_desc_wrapper *dw; int i; - MGE_RECEIVE_LOCK(sc); + MGE_RECEIVE_LOCK_ASSERT(sc); mge_free_desc(sc, sc->mge_rx_desc, MGE_RX_DESC_NUM, sc->mge_rx_dtag, 1); @@ -564,8 +561,6 @@ mge_reinit_rx(struct mge_softc *sc) /* Enable RX queue */ MGE_WRITE(sc, MGE_RX_QUEUE_CMD, MGE_ENABLE_RXQ(MGE_RX_DEFAULT_QUEUE)); - - MGE_RECEIVE_UNLOCK(sc); } #ifdef DEVICE_POLLING @@ -611,6 +606,7 @@ static int mge_attach(device_t dev) { struct mge_softc *sc; + struct mii_softc *miisc; struct ifnet *ifp; uint8_t hwaddr[ETHER_ADDR_LEN]; int i, error ; @@ -689,13 +685,15 @@ mge_attach(device_t dev) error = mii_phy_probe(dev, &sc->miibus, mge_ifmedia_upd, mge_ifmedia_sts); if (error) { device_printf(dev, "MII failed to find PHY\n"); - if_free(ifp); - sc->ifp = NULL; mge_detach(dev); return (error); } sc->mii = device_get_softc(sc->miibus); + /* Tell the MAC where to find the PHY so autoneg works */ + miisc = LIST_FIRST(&sc->mii->mii_phys); + MGE_WRITE(sc, MGE_REG_PHYDEV, miisc->mii_phy); + /* Attach interrupt handlers */ for (i = 0; i < 2; ++i) { error = bus_setup_intr(dev, sc->res[1 + i], @@ -704,7 +702,7 @@ mge_attach(device_t dev) if (error) { device_printf(dev, "could not setup %s\n", mge_intrs[i].description); - ether_ifdetach(sc->ifp); + mge_detach(dev); return (error); } } @@ -729,6 +727,9 @@ mge_detach(device_t dev) /* Stop and release all interrupts */ for (i = 0; i < 2; ++i) { + if (!sc->ih_cookie[i]) + continue; + error = bus_teardown_intr(dev, sc->res[1 + i], sc->ih_cookie[i]); if (error) device_printf(dev, "could not release %s\n", @@ -1144,7 +1145,7 @@ mge_intr_tx_locked(struct mge_softc *sc) break; sc->tx_desc_used_idx = - (++sc->tx_desc_used_idx) % MGE_TX_DESC_NUM;; + (++sc->tx_desc_used_idx) % MGE_TX_DESC_NUM; sc->tx_desc_used_count--; /* Update collision statistics */ @@ -1369,9 +1370,6 @@ mge_encap(struct mge_softc *sc, struct mbuf *m0) dw = &sc->mge_tx_desc[desc_no]; mapp = dw->buffer_dmap; - bus_dmamap_sync(sc->mge_desc_dtag, mapp, - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - /* Create mapping in DMA memory */ error = bus_dmamap_load_mbuf_sg(sc->mge_tx_dtag, mapp, m0, segs, &nsegs, BUS_DMA_NOWAIT); @@ -1395,7 +1393,7 @@ mge_encap(struct mge_softc *sc, struct mbuf *m0) mge_offload_setup_descriptor(sc, dw); } - bus_dmamap_sync(sc->mge_desc_dtag, mapp, + bus_dmamap_sync(sc->mge_desc_dtag, dw->desc_dmap, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); sc->tx_desc_curr = (++sc->tx_desc_curr) % MGE_TX_DESC_NUM; diff --git a/sys/dev/mii/brgphy.c b/sys/dev/mii/brgphy.c index 8884354f90b0..ddbec6761baf 100644 --- a/sys/dev/mii/brgphy.c +++ b/sys/dev/mii/brgphy.c @@ -104,6 +104,7 @@ static void brgphy_reset(struct mii_softc *); static void brgphy_enable_loopback(struct mii_softc *); static void bcm5401_load_dspcode(struct mii_softc *); static void bcm5411_load_dspcode(struct mii_softc *); +static void bcm54k2_load_dspcode(struct mii_softc *); static void brgphy_fixup_5704_a0_bug(struct mii_softc *); static void brgphy_fixup_adc_bug(struct mii_softc *); static void brgphy_fixup_adjust_trim(struct mii_softc *); @@ -117,6 +118,7 @@ static const struct mii_phydesc brgphys[] = { MII_PHY_DESC(xxBROADCOM, BCM5400), MII_PHY_DESC(xxBROADCOM, BCM5401), MII_PHY_DESC(xxBROADCOM, BCM5411), + MII_PHY_DESC(xxBROADCOM, BCM54K2), MII_PHY_DESC(xxBROADCOM, BCM5701), MII_PHY_DESC(xxBROADCOM, BCM5703), MII_PHY_DESC(xxBROADCOM, BCM5704), @@ -133,7 +135,9 @@ static const struct mii_phydesc brgphys[] = { MII_PHY_DESC(xxBROADCOM_ALT1, BCM5708S), MII_PHY_DESC(xxBROADCOM_ALT1, BCM5709CAX), MII_PHY_DESC(xxBROADCOM_ALT1, BCM5722), + MII_PHY_DESC(xxBROADCOM_ALT1, BCM5784), MII_PHY_DESC(xxBROADCOM_ALT1, BCM5709C), + MII_PHY_DESC(xxBROADCOM_ALT1, BCM5761), MII_PHY_DESC(BROADCOM2, BCM5906), MII_PHY_END }; @@ -195,6 +199,7 @@ brgphy_attach(device_t dev) case MII_OUI_xxBROADCOM: switch (bsc->mii_model) { case MII_MODEL_xxBROADCOM_BCM5706: + case MII_MODEL_xxBROADCOM_BCM5714: /* * The 5464 PHY used in the 5706 supports both copper * and fiber interfaces over GMII. Need to check the @@ -412,6 +417,9 @@ brgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) case MII_MODEL_xxBROADCOM_BCM5411: bcm5411_load_dspcode(sc); break; + case MII_MODEL_xxBROADCOM_BCM54K2: + bcm54k2_load_dspcode(sc); + break; } break; case MII_OUI_xxBROADCOM_ALT1: @@ -727,6 +735,24 @@ bcm5411_load_dspcode(struct mii_softc *sc) PHY_WRITE(sc, dspcode[i].reg, dspcode[i].val); } +void +bcm54k2_load_dspcode(struct mii_softc *sc) +{ + static const struct { + int reg; + uint16_t val; + } dspcode[] = { + { 4, 0x01e1 }, + { 9, 0x0300 }, + { 0, 0 }, + }; + int i; + + for (i = 0; dspcode[i].reg != 0; i++) + PHY_WRITE(sc, dspcode[i].reg, dspcode[i].val); + +} + static void brgphy_fixup_5704_a0_bug(struct mii_softc *sc) { @@ -929,6 +955,9 @@ brgphy_reset(struct mii_softc *sc) case MII_MODEL_xxBROADCOM_BCM5411: bcm5411_load_dspcode(sc); break; + case MII_MODEL_xxBROADCOM_BCM54K2: + bcm54k2_load_dspcode(sc); + break; } break; case MII_OUI_xxBROADCOM_ALT1: diff --git a/sys/dev/mii/e1000phy.c b/sys/dev/mii/e1000phy.c index 4f2fa66f6e83..2ff31d3520e2 100644 --- a/sys/dev/mii/e1000phy.c +++ b/sys/dev/mii/e1000phy.c @@ -59,6 +59,9 @@ __FBSDID("$FreeBSD$"); #include "miidevs.h" #include +/* XXX */ +#include +#include #include "miibus_if.h" @@ -68,6 +71,7 @@ static int e1000phy_attach(device_t); struct e1000phy_softc { struct mii_softc mii_sc; int mii_model; + struct msk_mii_data *mmd; }; static device_method_t e1000phy_methods[] = { @@ -130,6 +134,7 @@ e1000phy_attach(device_t dev) struct mii_softc *sc; struct mii_attach_args *ma; struct mii_data *mii; + struct ifnet *ifp; esc = device_get_softc(dev); sc = &esc->mii_sc; @@ -145,6 +150,16 @@ e1000phy_attach(device_t dev) mii->mii_instance++; esc->mii_model = MII_MODEL(ma->mii_id2); + ifp = sc->mii_pdata->mii_ifp; + if (strcmp(ifp->if_dname, "msk") == 0) { + /* XXX */ + esc->mmd = device_get_ivars( + device_get_parent(device_get_parent(dev))); + if (esc->mmd != NULL && + (esc->mmd->mii_flags & MIIF_HAVEFIBER) != 0) + sc->mii_flags |= MIIF_HAVEFIBER; + } + switch (esc->mii_model) { case MII_MODEL_MARVELL_E1011: case MII_MODEL_MARVELL_E1112: @@ -199,6 +214,13 @@ e1000phy_reset(struct mii_softc *sc) reg &= ~E1000_SCR_MODE_MASK; reg |= E1000_SCR_MODE_1000BX; PHY_WRITE(sc, E1000_SCR, reg); + if (esc->mmd != NULL && esc->mmd->pmd == 'P') { + /* Set SIGDET polarity low for SFP module. */ + PHY_WRITE(sc, E1000_EADR, 1); + reg = PHY_READ(sc, E1000_SCR); + reg |= E1000_SCR_FIB_SIGDET_POLARITY; + PHY_WRITE(sc, E1000_SCR, reg); + } PHY_WRITE(sc, E1000_EADR, page); } } else { @@ -248,7 +270,7 @@ e1000phy_reset(struct mii_softc *sc) } } - switch (MII_MODEL(esc->mii_model)) { + switch (esc->mii_model) { case MII_MODEL_MARVELL_E3082: case MII_MODEL_MARVELL_E1112: case MII_MODEL_MARVELL_E1118: @@ -485,8 +507,11 @@ e1000phy_status(struct mii_softc *sc) return; } } else { - if (ssr & E1000_SSR_1000MBS) - mii->mii_media_active |= IFM_1000_SX; + /* + * Some fiber PHY(88E1112) does not seem to set resolved + * speed so always assume we've got IFM_1000_SX. + */ + mii->mii_media_active |= IFM_1000_SX; } if (ssr & E1000_SSR_DUPLEX) diff --git a/sys/dev/mii/e1000phyreg.h b/sys/dev/mii/e1000phyreg.h index 41b9c0937ecb..6894760e77b8 100644 --- a/sys/dev/mii/e1000phyreg.h +++ b/sys/dev/mii/e1000phyreg.h @@ -248,6 +248,11 @@ #define E1000_SCR_EN_DETECT_MASK 0x0300 +/* 88E1112 page 1 fiber specific control */ +#define E1000_SCR_FIB_TX_DIS 0x0008 +#define E1000_SCR_FIB_SIGDET_POLARITY 0x0200 +#define E1000_SCR_FIB_FORCE_LINK 0x0400 + /* 88E1112 page 2 */ #define E1000_SCR_MODE_MASK 0x0380 #define E1000_SCR_MODE_AUTO 0x0180 diff --git a/sys/dev/mii/ip1000phy.c b/sys/dev/mii/ip1000phy.c index 8e81d810b90c..9b406d778951 100644 --- a/sys/dev/mii/ip1000phy.c +++ b/sys/dev/mii/ip1000phy.c @@ -398,8 +398,10 @@ ip1000phy_mii_phy_auto(struct mii_softc *sc) isc = (struct ip1000phy_softc *)sc; reg = 0; - if (isc->model == MII_MODEL_ICPLUS_IP1001) + if (isc->model == MII_MODEL_ICPLUS_IP1001) { reg = PHY_READ(sc, IP1000PHY_MII_ANAR); + reg |= IP1000PHY_ANAR_NP; + } reg |= IP1000PHY_ANAR_10T | IP1000PHY_ANAR_10T_FDX | IP1000PHY_ANAR_100TX | IP1000PHY_ANAR_100TX_FDX | IP1000PHY_ANAR_PAUSE | IP1000PHY_ANAR_APAUSE; diff --git a/sys/dev/mii/miidevs b/sys/dev/mii/miidevs index 801c6a8971d8..06e07be53ea9 100644 --- a/sys/dev/mii/miidevs +++ b/sys/dev/mii/miidevs @@ -145,6 +145,7 @@ model xxBROADCOM BCM5703 0x0016 BCM5703 10/100/1000baseTX PHY model xxBROADCOM BCM5704 0x0019 BCM5704 10/100/1000baseTX PHY model xxBROADCOM BCM5705 0x001a BCM5705 10/100/1000baseTX PHY model xxBROADCOM BCM5750 0x0018 BCM5750 10/100/1000baseTX PHY +model xxBROADCOM BCM54K2 0x002e BCM54K2 10/100/1000baseTX PHY model xxBROADCOM BCM5714 0x0034 BCM5714 10/100/1000baseTX PHY model xxBROADCOM BCM5780 0x0035 BCM5780 10/100/1000baseTX PHY model xxBROADCOM BCM5708C 0x0036 BCM5708C 10/100/1000baseTX PHY @@ -153,7 +154,9 @@ model xxBROADCOM_ALT1 BCM5787 0x000e BCM5787 10/100/1000baseTX PHY model xxBROADCOM_ALT1 BCM5708S 0x0015 BCM5708S 1000/2500BaseSX PHY model xxBROADCOM_ALT1 BCM5709CAX 0x002c BCM5709C(AX) 10/100/1000baseTX PHY model xxBROADCOM_ALT1 BCM5722 0x002d BCM5722 10/100/1000baseTX PHY +model xxBROADCOM_ALT1 BCM5784 0x003a BCM5784 10/100/1000baseTX PHY model xxBROADCOM_ALT1 BCM5709C 0x003c BCM5709C 10/100/1000baseTX PHY +model xxBROADCOM_ALT1 BCM5761 0x003d BCM5761 10/100/1000baseTX PHY model BROADCOM2 BCM5906 0x0004 BCM5906 10/100baseTX PHY /* Cicada Semiconductor PHYs (now owned by Vitesse?) */ diff --git a/sys/dev/mii/tdkphy.c b/sys/dev/mii/tdkphy.c index 83a394a339ab..e05f2c055482 100644 --- a/sys/dev/mii/tdkphy.c +++ b/sys/dev/mii/tdkphy.c @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); */ /* - * The TDK 78Q2120 is found on some Xircom X3201 based cardbus cards, + * The TDK 78Q2120 is found on some Xircom X3201 based CardBus cards, * also spotted on some 3C575 cards. It's just like any other normal * phy, except it does auto negotiation in a different way. */ diff --git a/sys/dev/mk48txx/mk48txx.c b/sys/dev/mk48txx/mk48txx.c index 71ab8f518df1..9742e82748c8 100644 --- a/sys/dev/mk48txx/mk48txx.c +++ b/sys/dev/mk48txx/mk48txx.c @@ -13,13 +13,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,14 +26,14 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * from: NetBSD: mk48txx.c,v 1.15 2004/07/05 09:24:31 pk Exp + * $NetBSD: mk48txx.c,v 1.25 2008/04/28 20:23:50 martin Exp $ */ #include __FBSDID("$FreeBSD$"); /* - * Mostek MK48T02, MK48T08, MK48T18, MK48T59 time-of-day chip subroutines. + * Mostek MK48T02, MK48T08, MK48T18, MK48T59 time-of-day chip subroutines */ #include @@ -50,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -59,17 +53,17 @@ __FBSDID("$FreeBSD$"); #include "clock_if.h" -static uint8_t mk48txx_def_nvrd(device_t, int); -static void mk48txx_def_nvwr(device_t, int, uint8_t); -static void mk48txx_watchdog(void *, u_int, int *); +static uint8_t mk48txx_def_nvrd(device_t dev, int off); +static void mk48txx_def_nvwr(device_t dev, int off, uint8_t v); +static void mk48txx_watchdog(void *arg, u_int cmd, int *error); -struct { +static const struct { const char *name; bus_size_t nvramsz; bus_size_t clkoff; - int flags; -#define MK48TXX_EXT_REGISTERS 1 /* Has extended register set */ -} mk48txx_models[] = { + u_int flags; +#define MK48TXX_EXT_REGISTERS 1 /* Has extended register set. */ +} const mk48txx_models[] = { { "mk48t02", MK48T02_CLKSZ, MK48T02_CLKOFF, 0 }, { "mk48t08", MK48T08_CLKSZ, MK48T08_CLKOFF, 0 }, { "mk48t18", MK48T18_CLKSZ, MK48T18_CLKOFF, 0 }, @@ -112,7 +106,7 @@ mk48txx_attach(device_t dev) if (mk48txx_models[i].flags & MK48TXX_EXT_REGISTERS) { mtx_lock(&sc->sc_mtx); - if ((*sc->sc_nvrd)(dev, sc->sc_clkoffset + MK48TXX_FLAGS) & + if ((*sc->sc_nvrd)(dev, sc->sc_clkoffset + MK48TXX_FLAGS) & MK48TXX_FLAGS_BL) { mtx_unlock(&sc->sc_mtx); device_printf(dev, "%s: battery low\n", __func__); @@ -140,7 +134,7 @@ mk48txx_attach(device_t dev) } } - clock_register(dev, 1000000); /* 1 second resolution. */ + clock_register(dev, 1000000); /* 1 second resolution */ if ((sc->sc_flag & MK48TXX_WDOG_REGISTER) && (mk48txx_models[i].flags & MK48TXX_EXT_REGISTERS)) { @@ -182,8 +176,16 @@ mk48txx_gettime(device_t dev, struct timespec *ts) ct.min = FROMBCD(FROMREG(MK48TXX_IMIN, MK48TXX_MIN_MASK)); ct.hour = FROMBCD(FROMREG(MK48TXX_IHOUR, MK48TXX_HOUR_MASK)); ct.day = FROMBCD(FROMREG(MK48TXX_IDAY, MK48TXX_DAY_MASK)); +#if 0 /* Map dow from 1 - 7 to 0 - 6; FROMBCD() isn't necessary here. */ ct.dow = FROMREG(MK48TXX_IWDAY, MK48TXX_WDAY_MASK) - 1; +#else + /* + * Set dow = -1 because some drivers (for example the NetBSD and + * OpenBSD mk48txx(4)) don't set it correctly. + */ + ct.dow = -1; +#endif ct.mon = FROMBCD(FROMREG(MK48TXX_IMON, MK48TXX_MON_MASK)); year = FROMBCD(FROMREG(MK48TXX_IYEAR, MK48TXX_YEAR_MASK)); year += sc->sc_year0; @@ -273,7 +275,7 @@ mk48txx_def_nvrd(device_t dev, int off) struct mk48txx_softc *sc; sc = device_get_softc(dev); - return (bus_space_read_1(sc->sc_bst, sc->sc_bsh, off)); + return (bus_read_1(sc->sc_res, off)); } static void @@ -282,7 +284,7 @@ mk48txx_def_nvwr(device_t dev, int off, uint8_t v) struct mk48txx_softc *sc; sc = device_get_softc(dev); - bus_space_write_1(sc->sc_bst, sc->sc_bsh, off, v); + bus_write_1(sc->sc_res, off, v); } static void diff --git a/sys/dev/mk48txx/mk48txxreg.h b/sys/dev/mk48txx/mk48txxreg.h index 25b9cb392086..bae6ae5f51b8 100644 --- a/sys/dev/mk48txx/mk48txxreg.h +++ b/sys/dev/mk48txx/mk48txxreg.h @@ -13,13 +13,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,7 +26,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * from: NetBSD: mk48txxreg.h,v 1.7 2003/11/01 22:41:42 tsutsui Exp + * $NetBSD: mk48txxreg.h,v 1.10 2008/04/28 20:23:50 martin Exp $ * * $FreeBSD$ */ @@ -59,23 +52,23 @@ * The first bank of eight registers at offset (nvramsz - 16) is * available only on recenter (which?) MK48Txx models. */ -#define MK48TXX_FLAGS 0 /* flags register */ -#define MK48TXX_UNUSED 1 /* unused */ -#define MK48TXX_ASEC 2 /* alarm seconds (0..59; BCD) */ -#define MK48TXX_AMIN 3 /* alarm minutes (0..59; BCD) */ -#define MK48TXX_AHOUR 4 /* alarm hours (0..23; BCD) */ -#define MK48TXX_ADAY 5 /* alarm day in month (1..31; BCD) */ -#define MK48TXX_INTR 6 /* interrupts register */ -#define MK48TXX_WDOG 7 /* watchdog register */ +#define MK48TXX_FLAGS 0 /* flags register */ +#define MK48TXX_UNUSED 1 /* unused */ +#define MK48TXX_ASEC 2 /* alarm seconds (0..59; BCD) */ +#define MK48TXX_AMIN 3 /* alarm minutes (0..59; BCD) */ +#define MK48TXX_AHOUR 4 /* alarm hours (0..23; BCD) */ +#define MK48TXX_ADAY 5 /* alarm day in month (1..31; BCD) */ +#define MK48TXX_INTR 6 /* interrupts register */ +#define MK48TXX_WDOG 7 /* watchdog register */ -#define MK48TXX_ICSR 8 /* control register */ -#define MK48TXX_ISEC 9 /* seconds (0..59; BCD) */ -#define MK48TXX_IMIN 10 /* minutes (0..59; BCD) */ -#define MK48TXX_IHOUR 11 /* hours (0..23; BCD) */ -#define MK48TXX_IWDAY 12 /* weekday (1..7) */ -#define MK48TXX_IDAY 13 /* day in month (1..31; BCD) */ -#define MK48TXX_IMON 14 /* month (1..12; BCD) */ -#define MK48TXX_IYEAR 15 /* year (0..99; BCD) */ +#define MK48TXX_ICSR 8 /* control register */ +#define MK48TXX_ISEC 9 /* seconds (0..59; BCD) */ +#define MK48TXX_IMIN 10 /* minutes (0..59; BCD) */ +#define MK48TXX_IHOUR 11 /* hours (0..23; BCD) */ +#define MK48TXX_IWDAY 12 /* weekday (1..7) */ +#define MK48TXX_IDAY 13 /* day in month (1..31; BCD) */ +#define MK48TXX_IMON 14 /* month (1..12; BCD) */ +#define MK48TXX_IYEAR 15 /* year (0..99; BCD) */ /* * Note that some of the bits below that are not in the first eight @@ -84,80 +77,80 @@ */ /* Bits in the flags register (extended only) */ -#define MK48TXX_FLAGS_BL 0x10 /* battery low (read only) */ -#define MK48TXX_FLAGS_AF 0x40 /* alarm flag (read only) */ -#define MK48TXX_FLAGS_WDF 0x80 /* watchdog flag (read only) */ +#define MK48TXX_FLAGS_BL 0x10 /* battery low (read only) */ +#define MK48TXX_FLAGS_AF 0x40 /* alarm flag (read only) */ +#define MK48TXX_FLAGS_WDF 0x80 /* watchdog flag (read only) */ /* Bits in the alarm seconds register (extended only) */ -#define MK48TXX_ASEC_MASK 0x7f /* mask for alarm seconds */ -#define MK48TXX_ASEC_RPT1 0x80 /* alarm repeat mode bit 1 */ +#define MK48TXX_ASEC_MASK 0x7f /* mask for alarm seconds */ +#define MK48TXX_ASEC_RPT1 0x80 /* alarm repeat mode bit 1 */ /* Bits in the alarm minutes register (extended only) */ -#define MK48TXX_AMIN_MASK 0x7f /* mask for alarm minutes */ -#define MK48TXX_AMIN_RPT2 0x80 /* alarm repeat mode bit 2 */ +#define MK48TXX_AMIN_MASK 0x7f /* mask for alarm minutes */ +#define MK48TXX_AMIN_RPT2 0x80 /* alarm repeat mode bit 2 */ /* Bits in the alarm hours register (extended only) */ -#define MK48TXX_AHOUR_MASK 0x3f /* mask for alarm hours */ -#define MK48TXX_AHOUR_RPT3 0x80 /* alarm repeat mode bit 3 */ +#define MK48TXX_AHOUR_MASK 0x3f /* mask for alarm hours */ +#define MK48TXX_AHOUR_RPT3 0x80 /* alarm repeat mode bit 3 */ /* Bits in the alarm day in month register (extended only) */ -#define MK48TXX_ADAY_MASK 0x3f /* mask for alarm day in month */ -#define MK48TXX_ADAY_RPT4 0x80 /* alarm repeat mode bit 4 */ +#define MK48TXX_ADAY_MASK 0x3f /* mask for alarm day in month */ +#define MK48TXX_ADAY_RPT4 0x80 /* alarm repeat mode bit 4 */ /* Bits in the interrupts register (extended only) */ -#define MK48TXX_INTR_ABE 0x20 /* alarm in battery back-up mode */ -#define MK48TXX_INTR_AFE 0x80 /* alarm flag enable */ +#define MK48TXX_INTR_ABE 0x20 /* alarm in battery back-up mode */ +#define MK48TXX_INTR_AFE 0x80 /* alarm flag enable */ /* Bits in the watchdog register (extended only) */ -#define MK48TXX_WDOG_RB_1_16 0x00 /* watchdog resolution 1/16 second */ -#define MK48TXX_WDOG_RB_1_4 0x01 /* watchdog resolution 1/4 second */ -#define MK48TXX_WDOG_RB_1 0x02 /* watchdog resolution 1 second */ -#define MK48TXX_WDOG_RB_4 0x03 /* watchdog resolution 4 seconds */ -#define MK48TXX_WDOG_BMB_MASK 0x7c /* mask for watchdog multiplier */ -#define MK48TXX_WDOG_BMB_SHIFT 2 /* shift for watchdog multiplier */ -#define MK48TXX_WDOG_WDS 0x80 /* watchdog steering bit */ +#define MK48TXX_WDOG_RB_1_16 0x00 /* watchdog resolution 1/16 second */ +#define MK48TXX_WDOG_RB_1_4 0x01 /* watchdog resolution 1/4 second */ +#define MK48TXX_WDOG_RB_1 0x02 /* watchdog resolution 1 second */ +#define MK48TXX_WDOG_RB_4 0x03 /* watchdog resolution 4 seconds */ +#define MK48TXX_WDOG_BMB_MASK 0x7c /* mask for watchdog multiplier */ +#define MK48TXX_WDOG_BMB_SHIFT 2 /* shift for watchdog multiplier */ +#define MK48TXX_WDOG_WDS 0x80 /* watchdog steering bit */ /* Bits in the control register */ -#define MK48TXX_CSR_CALIB_MASK 0x1f /* mask for calibration step width */ -#define MK48TXX_CSR_SIGN 0x20 /* sign of above calibration witdh */ -#define MK48TXX_CSR_READ 0x40 /* want to read (freeze clock) */ -#define MK48TXX_CSR_WRITE 0x80 /* want to write */ +#define MK48TXX_CSR_CALIB_MASK 0x1f /* mask for calibration step width */ +#define MK48TXX_CSR_SIGN 0x20 /* sign of above calibration witdh */ +#define MK48TXX_CSR_READ 0x40 /* want to read (freeze clock) */ +#define MK48TXX_CSR_WRITE 0x80 /* want to write */ /* Bits in the seconds register */ -#define MK48TXX_SEC_MASK 0x7f /* mask for seconds */ -#define MK48TXX_SEC_ST 0x80 /* stop oscillator */ +#define MK48TXX_SEC_MASK 0x7f /* mask for seconds */ +#define MK48TXX_SEC_ST 0x80 /* stop oscillator */ /* Bits in the minutes register */ -#define MK48TXX_MIN_MASK 0x7f /* mask for minutes */ +#define MK48TXX_MIN_MASK 0x7f /* mask for minutes */ /* Bits in the hours register */ -#define MK48TXX_HOUR_MASK 0x3f /* mask for hours */ +#define MK48TXX_HOUR_MASK 0x3f /* mask for hours */ /* Bits in the century/weekday register */ -#define MK48TXX_WDAY_MASK 0x07 /* mask for weekday */ -#define MK48TXX_WDAY_CB 0x10 /* century bit (extended only) */ -#define MK48TXX_WDAY_CB_SHIFT 4 /* shift for century bit */ -#define MK48TXX_WDAY_CEB 0x20 /* century enable bit (extended only) */ -#define MK48TXX_WDAY_FT 0x40 /* frequency test */ +#define MK48TXX_WDAY_MASK 0x07 /* mask for weekday */ +#define MK48TXX_WDAY_CB 0x10 /* century bit (extended only) */ +#define MK48TXX_WDAY_CB_SHIFT 4 /* shift for century bit */ +#define MK48TXX_WDAY_CEB 0x20 /* century enable bit (extended only) */ +#define MK48TXX_WDAY_FT 0x40 /* frequency test */ /* Bits in the day in month register */ -#define MK48TXX_DAY_MASK 0x3f /* mask for day in month */ +#define MK48TXX_DAY_MASK 0x3f /* mask for day in month */ /* Bits in the month register */ -#define MK48TXX_MON_MASK 0x1f /* mask for month */ +#define MK48TXX_MON_MASK 0x1f /* mask for month */ /* Bits in the year register */ -#define MK48TXX_YEAR_MASK 0xff /* mask for year */ +#define MK48TXX_YEAR_MASK 0xff /* mask for year */ /* Model specific NVRAM sizes and clock offsets */ -#define MK48T02_CLKSZ 2048 -#define MK48T02_CLKOFF 0x7f0 +#define MK48T02_CLKSZ 2048 +#define MK48T02_CLKOFF 0x7f0 -#define MK48T08_CLKSZ 8192 -#define MK48T08_CLKOFF 0x1ff0 +#define MK48T08_CLKSZ 8192 +#define MK48T08_CLKOFF 0x1ff0 -#define MK48T18_CLKSZ 8192 -#define MK48T18_CLKOFF 0x1ff0 +#define MK48T18_CLKSZ 8192 +#define MK48T18_CLKOFF 0x1ff0 -#define MK48T59_CLKSZ 8192 -#define MK48T59_CLKOFF 0x1ff0 +#define MK48T59_CLKSZ 8192 +#define MK48T59_CLKOFF 0x1ff0 diff --git a/sys/dev/mk48txx/mk48txxvar.h b/sys/dev/mk48txx/mk48txxvar.h index f7c3d3195062..9706d8dbc942 100644 --- a/sys/dev/mk48txx/mk48txxvar.h +++ b/sys/dev/mk48txx/mk48txxvar.h @@ -13,13 +13,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,17 +26,16 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * from: NetBSD: mk48txxvar.h,v 1.1 2003/11/01 22:41:42 tsutsui Exp + * $NetBSD: mk48txxvar.h,v 1.6 2008/04/28 20:23:50 martin Exp $ * * $FreeBSD$ */ -typedef uint8_t (*mk48txx_nvrd_t)(device_t, int); -typedef void (*mk48txx_nvwr_t)(device_t, int, uint8_t); +typedef uint8_t (*mk48txx_nvrd_t)(device_t dev, int off); +typedef void (*mk48txx_nvwr_t)(device_t dev, int off, uint8_t v); struct mk48txx_softc { - bus_space_tag_t sc_bst; /* bus space tag */ - bus_space_handle_t sc_bsh; /* bus space handle */ + struct resource *sc_res;/* bus resource */ struct mtx sc_mtx; /* hardware mutex */ eventhandler_tag sc_wet; /* watchdog event handler tag */ @@ -53,17 +45,17 @@ struct mk48txx_softc { bus_size_t sc_clkoffset; /* Offset in NVRAM to clock bits */ u_int sc_year0; /* year counter offset */ u_int sc_flag; /* MD flags */ -#define MK48TXX_NO_CENT_ADJUST 0x0001 /* don't manually adjust century */ -#define MK48TXX_WDOG_REGISTER 0x0002 /* register watchdog */ -#define MK48TXX_WDOG_ENABLE_WDS 0x0004 /* enable watchdog steering bit */ +#define MK48TXX_NO_CENT_ADJUST 0x0001 /* don't manually adjust century */ +#define MK48TXX_WDOG_REGISTER 0x0002 /* register watchdog */ +#define MK48TXX_WDOG_ENABLE_WDS 0x0004 /* enable watchdog steering bit */ mk48txx_nvrd_t sc_nvrd; /* NVRAM/RTC read function */ mk48txx_nvwr_t sc_nvwr; /* NVRAM/RTC write function */ }; /* Chip attach function */ -int mk48txx_attach(device_t); +int mk48txx_attach(device_t dev); /* Methods for the clock interface */ -int mk48txx_gettime(device_t, struct timespec *); -int mk48txx_settime(device_t, struct timespec *); +int mk48txx_gettime(device_t dev, struct timespec *ts); +int mk48txx_settime(device_t dev, struct timespec *ts); diff --git a/sys/dev/mly/mly.c b/sys/dev/mly/mly.c index 1f61542ba03b..90f2819ccbfd 100644 --- a/sys/dev/mly/mly.c +++ b/sys/dev/mly/mly.c @@ -101,7 +101,6 @@ static void mly_unmap_command(struct mly_command *mc); static int mly_cam_attach(struct mly_softc *sc); static void mly_cam_detach(struct mly_softc *sc); static void mly_cam_rescan_btl(struct mly_softc *sc, int bus, int target); -static void mly_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb); static void mly_cam_action(struct cam_sim *sim, union ccb *ccb); static int mly_cam_action_io(struct cam_sim *sim, struct ccb_scsiio *csio); static void mly_cam_poll(struct cam_sim *sim); @@ -117,9 +116,9 @@ static void mly_printstate(struct mly_softc *sc); static void mly_print_command(struct mly_command *mc); static void mly_print_packet(struct mly_command *mc); static void mly_panic(struct mly_softc *sc, char *reason); +static int mly_timeout(struct mly_softc *sc); #endif void mly_print_controller(int controller); -static int mly_timeout(struct mly_softc *sc); static d_open_t mly_user_open; @@ -2017,29 +2016,18 @@ mly_cam_rescan_btl(struct mly_softc *sc, int bus, int target) debug_called(1); - if ((ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK | M_ZERO)) == NULL) { + if ((ccb = xpt_alloc_ccb()) == NULL) { mly_printf(sc, "rescan failed (can't allocate CCB)\n"); return; } - - if (xpt_create_path(&sc->mly_cam_path, xpt_periph, - cam_sim_path(sc->mly_cam_sim[bus]), target, 0) != CAM_REQ_CMP) { + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, + cam_sim_path(sc->mly_cam_sim[bus]), target, 0) != CAM_REQ_CMP) { mly_printf(sc, "rescan failed (can't create path)\n"); - free(ccb, M_TEMP); + xpt_free_ccb(ccb); return; } - xpt_setup_ccb(&ccb->ccb_h, sc->mly_cam_path, 5/*priority (low)*/); - ccb->ccb_h.func_code = XPT_SCAN_LUN; - ccb->ccb_h.cbfcnp = mly_cam_rescan_callback; - ccb->crcn.flags = CAM_FLAG_NONE; debug(1, "rescan target %d:%d", bus, target); - xpt_action(ccb); -} - -static void -mly_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb) -{ - free(ccb, M_TEMP); + xpt_rescan(ccb); } /******************************************************************************** @@ -2528,7 +2516,7 @@ mly_describe_controller(struct mly_softc *sc) mly_describe_code(mly_table_memorytype, mi->memory_type), mi->memory_parity ? "+parity": "",mi->memory_ecc ? "+ECC": "", mi->cache_size); - mly_printf(sc, "CPU: %s @ %dMHZ\n", + mly_printf(sc, "CPU: %s @ %dMHz\n", mly_describe_code(mly_table_cputype, mi->cpu[0].type), mi->cpu[0].speed); if (mi->l2cache_size != 0) mly_printf(sc, "%dKB L2 cache\n", mi->l2cache_size); @@ -2981,6 +2969,7 @@ mly_user_health(struct mly_softc *sc, struct mly_user_health *uh) return(error); } +#ifdef MLY_DEBUG static int mly_timeout(struct mly_softc *sc) { @@ -3000,3 +2989,4 @@ mly_timeout(struct mly_softc *sc) return (0); } +#endif diff --git a/sys/dev/mpt/mpt.c b/sys/dev/mpt/mpt.c index 1b44333bfb36..6a74dc3c54d4 100644 --- a/sys/dev/mpt/mpt.c +++ b/sys/dev/mpt/mpt.c @@ -1238,7 +1238,6 @@ retry: req->state = REQ_STATE_ALLOCATED; req->chain = NULL; mpt_assign_serno(mpt, req); - mpt_callout_init(&req->callout); } else if (sleep_ok != 0) { mpt->getreqwaiter = 1; mpt_sleep(mpt, &mpt->request_free_list, PUSER, "mptgreq", 0); @@ -2251,6 +2250,7 @@ mpt_core_attach(struct mpt_softc *mpt) for (val = 0; val < MPT_MAX_REQUESTS(mpt); val++) { request_t *req = &mpt->request_pool[val]; req->state = REQ_STATE_ALLOCATED; + mpt_callout_init(mpt, &req->callout); mpt_free_request(mpt, req); } MPT_UNLOCK(mpt); @@ -2334,10 +2334,18 @@ mpt_core_shutdown(struct mpt_softc *mpt) void mpt_core_detach(struct mpt_softc *mpt) { + int val; + /* * XXX: FREE MEMORY */ mpt_disable_ints(mpt); + + /* Make sure no request has pending timeouts. */ + for (val = 0; val < MPT_MAX_REQUESTS(mpt); val++) { + request_t *req = &mpt->request_pool[val]; + mpt_callout_drain(mpt, &req->callout); + } } int diff --git a/sys/dev/mpt/mpt.h b/sys/dev/mpt/mpt.h index 0a093efabd12..1fa2d1aaded8 100644 --- a/sys/dev/mpt/mpt.h +++ b/sys/dev/mpt/mpt.h @@ -296,13 +296,6 @@ void mpt_map_rquest(void *, bus_dma_segment_t *, int, int); kthread_exit(status) #endif -/****************************** Timer Facilities ******************************/ -#if __FreeBSD_version > 500000 -#define mpt_callout_init(c) callout_init(c, /*mpsafe*/1); -#else -#define mpt_callout_init(c) callout_init(c); -#endif - /********************************** Endianess *********************************/ #define MPT_2_HOST64(ptr, tag) ptr->tag = le64toh(ptr->tag) #define MPT_2_HOST32(ptr, tag) ptr->tag = le32toh(ptr->tag) @@ -889,6 +882,10 @@ mpt_sleep(struct mpt_softc *mpt, void *ident, int priority, callout_reset(&(req)->callout, (ticks), (func), (arg)); #define mpt_req_untimeout(req, func, arg) \ callout_stop(&(req)->callout) +#define mpt_callout_init(mpt, c) \ + callout_init(c) +#define mpt_callout_drain(mpt, c) \ + callout_stop(c) #else #if 1 @@ -911,9 +908,13 @@ mpt_sleep(struct mpt_softc *mpt, void *ident, int priority, #define mpt_sleep(mpt, ident, priority, wmesg, timo) \ msleep(ident, &(mpt)->mpt_lock, priority, wmesg, timo) #define mpt_req_timeout(req, ticks, func, arg) \ - callout_reset(&(req)->callout, (ticks), (func), (arg)); + callout_reset(&(req)->callout, (ticks), (func), (arg)) #define mpt_req_untimeout(req, func, arg) \ callout_stop(&(req)->callout) +#define mpt_callout_init(mpt, c) \ + callout_init_mtx(c, &(mpt)->mpt_lock, 0) +#define mpt_callout_drain(mpt, c) \ + callout_drain(c) #else @@ -926,18 +927,18 @@ mpt_sleep(struct mpt_softc *mpt, void *ident, int priority, #define MPTLOCK_2_CAMLOCK(mpt) #define CAMLOCK_2_MPTLOCK(mpt) +#define mpt_req_timeout(req, ticks, func, arg) \ + callout_reset(&(req)->callout, (ticks), (func), (arg)) +#define mpt_req_untimeout(req, func, arg) \ + callout_stop(&(req)->callout) +#define mpt_callout_init(mpt, c) \ + callout_init(c, 0) +#define mpt_callout_drain(mpt, c) \ + callout_drain(c) + static __inline int mpt_sleep(struct mpt_softc *, void *, int, const char *, int); -#define mpt_ccb_timeout(ccb, ticks, func, arg) \ - do { \ - (ccb)->ccb_h.timeout_ch = timeout((func), (arg), (ticks)); \ - } while (0) -#define mpt_ccb_untimeout(ccb, func, arg) \ - untimeout((func), (arg), (ccb)->ccb_h.timeout_ch) -#define mpt_ccb_timeout_init(ccb) \ - callout_handle_init(&(ccb)->ccb_h.timeout_ch) - static __inline int mpt_sleep(struct mpt_softc *mpt, void *i, int p, const char *w, int t) { diff --git a/sys/dev/mpt/mpt_cam.c b/sys/dev/mpt/mpt_cam.c index cd3048de6641..302030f9f341 100644 --- a/sys/dev/mpt/mpt_cam.c +++ b/sys/dev/mpt/mpt_cam.c @@ -1245,7 +1245,10 @@ mpt_timeout(void *arg) ccb = (union ccb *)arg; mpt = ccb->ccb_h.ccb_mpt_ptr; +#if __FreeBSD_version < 500000 MPT_LOCK(mpt); +#endif + MPT_LOCK_ASSERT(mpt); req = ccb->ccb_h.ccb_req_ptr; mpt_prt(mpt, "request %p:%u timed out for ccb %p (req->ccb %p)\n", req, req->serno, ccb, req->ccb); @@ -1256,7 +1259,9 @@ mpt_timeout(void *arg) req->state |= REQ_STATE_TIMEDOUT; mpt_wakeup_recovery_thread(mpt); } +#if __FreeBSD_version < 500000 MPT_UNLOCK(mpt); +#endif } /* @@ -2553,6 +2558,7 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req, } xpt_setup_ccb(&crs.ccb_h, tmppath, 5); crs.ccb_h.func_code = XPT_REL_SIMQ; + crs.ccb_h.flags = CAM_DEV_QFREEZE; crs.release_flags = RELSIM_ADJUST_OPENINGS; crs.openings = pqf->CurrentDepth - 1; xpt_action((union ccb *)&crs); diff --git a/sys/dev/mpt/mpt_cam.h b/sys/dev/mpt/mpt_cam.h index f2faa4abdff8..8a18934d6483 100644 --- a/sys/dev/mpt/mpt_cam.h +++ b/sys/dev/mpt/mpt_cam.h @@ -102,7 +102,6 @@ #include #include #include -#include #include #include #include diff --git a/sys/dev/mpt/mpt_pci.c b/sys/dev/mpt/mpt_pci.c index c6c59b7c9ccf..1e9dc921c097 100644 --- a/sys/dev/mpt/mpt_pci.c +++ b/sys/dev/mpt/mpt_pci.c @@ -485,7 +485,7 @@ mpt_pci_attach(device_t dev) * Make sure we've disabled the ROM. */ data = pci_read_config(dev, PCIR_BIOS, 4); - data &= ~1; + data &= ~PCIM_BIOS_ENABLE; pci_write_config(dev, PCIR_BIOS, data, 4); /* diff --git a/sys/dev/mpt/mpt_raid.c b/sys/dev/mpt/mpt_raid.c index 6b7eb7b46c46..9e90dd3fd36c 100644 --- a/sys/dev/mpt/mpt_raid.c +++ b/sys/dev/mpt/mpt_raid.c @@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #if __FreeBSD_version < 500000 @@ -271,7 +270,7 @@ mpt_raid_attach(struct mpt_softc *mpt) mpt_handler_t handler; int error; - mpt_callout_init(&mpt->raid_timer); + mpt_callout_init(mpt, &mpt->raid_timer); error = mpt_spawn_raid_thread(mpt); if (error != 0) { @@ -320,10 +319,10 @@ mpt_raid_detach(struct mpt_softc *mpt) struct ccb_setasync csa; mpt_handler_t handler; - callout_stop(&mpt->raid_timer); + mpt_callout_drain(mpt, &mpt->raid_timer); + MPT_LOCK(mpt); mpt_terminate_raid_thread(mpt); - handler.reply_handler = mpt_raid_reply_handler; mpt_deregister_handler(mpt, MPT_HANDLER_REPLY, handler, raid_handler_id); @@ -655,14 +654,6 @@ mpt_terminate_raid_thread(struct mpt_softc *mpt) mpt_sleep(mpt, &mpt->raid_thread, PUSER, "thtrm", 0); } -static void -mpt_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb) -{ - - xpt_free_path(ccb->ccb_h.path); - xpt_free_ccb(ccb); -} - static void mpt_raid_thread(void *arg) { @@ -699,7 +690,6 @@ mpt_raid_thread(void *arg) if (mpt->raid_rescan != 0) { union ccb *ccb; - struct cam_path *path; int error; mpt->raid_rescan = 0; @@ -708,20 +698,14 @@ mpt_raid_thread(void *arg) ccb = xpt_alloc_ccb(); MPT_LOCK(mpt); - error = xpt_create_path(&path, xpt_periph, + error = xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(mpt->phydisk_sim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD); if (error != CAM_REQ_CMP) { xpt_free_ccb(ccb); mpt_prt(mpt, "Unable to rescan RAID Bus!\n"); } else { - xpt_setup_ccb(&ccb->ccb_h, path, 5); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = mpt_cam_rescan_callback; - ccb->crcn.flags = CAM_FLAG_NONE; - MPTLOCK_2_CAMLOCK(mpt); - xpt_action(ccb); - CAMLOCK_2_MPTLOCK(mpt); + xpt_rescan(ccb); } } } @@ -1062,6 +1046,7 @@ mpt_adjust_queue_depth(struct mpt_softc *mpt, struct mpt_raid_volume *mpt_vol, xpt_setup_ccb(&crs.ccb_h, path, /*priority*/5); crs.ccb_h.func_code = XPT_REL_SIMQ; + crs.ccb_h.flags = CAM_DEV_QFREEZE; crs.release_flags = RELSIM_ADJUST_OPENINGS; crs.openings = mpt->raid_queue_depth; xpt_action((union ccb *)&crs); @@ -1570,9 +1555,14 @@ mpt_raid_timer(void *arg) struct mpt_softc *mpt; mpt = (struct mpt_softc *)arg; +#if __FreeBSD_version < 500000 MPT_LOCK(mpt); +#endif + MPT_LOCK_ASSERT(mpt); mpt_raid_wakeup(mpt); +#if __FreeBSD_version < 500000 MPT_UNLOCK(mpt); +#endif } void diff --git a/sys/dev/msk/if_msk.c b/sys/dev/msk/if_msk.c index f5f94baad32d..d087195dde33 100644 --- a/sys/dev/msk/if_msk.c +++ b/sys/dev/msk/if_msk.c @@ -113,7 +113,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -137,7 +136,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include @@ -201,6 +199,8 @@ static struct msk_product { "Marvell Yukon 88E8040 Fast Ethernet" }, { VENDORID_MARVELL, DEVICEID_MRVL_8040T, "Marvell Yukon 88E8040T Fast Ethernet" }, + { VENDORID_MARVELL, DEVICEID_MRVL_8042, + "Marvell Yukon 88E8042 Fast Ethernet" }, { VENDORID_MARVELL, DEVICEID_MRVL_8048, "Marvell Yukon 88E8048 Fast Ethernet" }, { VENDORID_MARVELL, DEVICEID_MRVL_4361, @@ -221,8 +221,12 @@ static struct msk_product { "Marvell Yukon 88E8071 Gigabit Ethernet" }, { VENDORID_MARVELL, DEVICEID_MRVL_436C, "Marvell Yukon 88E8072 Gigabit Ethernet" }, + { VENDORID_MARVELL, DEVICEID_MRVL_4380, + "Marvell Yukon 88E8057 Gigabit Ethernet" }, { VENDORID_DLINK, DEVICEID_DLINK_DGE550SX, "D-Link 550SX Gigabit Ethernet" }, + { VENDORID_DLINK, DEVICEID_DLINK_DGE560SX, + "D-Link 560SX Gigabit Ethernet" }, { VENDORID_DLINK, DEVICEID_DLINK_DGE560T, "D-Link 560T Gigabit Ethernet" } }; @@ -233,7 +237,9 @@ static const char *model_name[] = { "Yukon EX", "Yukon EC", "Yukon FE", - "Yukon FE+" + "Yukon FE+", + "Yukon Supreme", + "Yukon Ultra 2" }; static int mskc_probe(device_t); @@ -250,9 +256,7 @@ static int msk_attach(device_t); static int msk_detach(device_t); static void msk_tick(void *); -static void msk_legacy_intr(void *); -static int msk_intr(void *); -static void msk_int_task(void *, int); +static void msk_intr(void *); static void msk_intr_phy(struct msk_if_softc *); static void msk_intr_gmac(struct msk_if_softc *); static __inline void msk_rxput(struct msk_if_softc *); @@ -266,8 +270,8 @@ static void msk_rxeof(struct msk_if_softc *, uint32_t, uint32_t, int); static void msk_jumbo_rxeof(struct msk_if_softc *, uint32_t, uint32_t, int); static void msk_txeof(struct msk_if_softc *, int); static int msk_encap(struct msk_if_softc *, struct mbuf **); -static void msk_tx_task(void *, int); static void msk_start(struct ifnet *); +static void msk_start_locked(struct ifnet *); static int msk_ioctl(struct ifnet *, u_long, caddr_t); static void msk_set_prefetch(struct msk_softc *, int, bus_addr_t, uint32_t); static void msk_set_rambuffer(struct msk_if_softc *); @@ -386,12 +390,6 @@ static struct resource_spec msk_irq_spec_msi[] = { { -1, 0, 0 } }; -static struct resource_spec msk_irq_spec_msi2[] = { - { SYS_RES_IRQ, 1, RF_ACTIVE }, - { SYS_RES_IRQ, 2, RF_ACTIVE }, - { -1, 0, 0 } -}; - static int msk_miibus_readreg(device_t dev, int phy, int reg) { @@ -531,28 +529,25 @@ msk_miibus_statchg(device_t dev) break; } - if (((mii->mii_media_active & IFM_GMASK) & IFM_FDX) != 0) - gmac |= GM_GPCR_DUP_FULL; /* Disable Rx flow control. */ - if (((mii->mii_media_active & IFM_GMASK) & IFM_FLAG0) == 0) + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FLAG0) == 0) gmac |= GM_GPCR_FC_RX_DIS; /* Disable Tx flow control. */ - if (((mii->mii_media_active & IFM_GMASK) & IFM_FLAG1) == 0) + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FLAG1) == 0) gmac |= GM_GPCR_FC_TX_DIS; + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) + gmac |= GM_GPCR_DUP_FULL; + else + gmac |= GM_GPCR_FC_RX_DIS | GM_GPCR_FC_TX_DIS; gmac |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA; GMAC_WRITE_2(sc, sc_if->msk_port, GM_GP_CTRL, gmac); /* Read again to ensure writing. */ GMAC_READ_2(sc, sc_if->msk_port, GM_GP_CTRL); - - gmac = GMC_PAUSE_ON; - if (((mii->mii_media_active & IFM_GMASK) & - (IFM_FLAG0 | IFM_FLAG1)) == 0) - gmac = GMC_PAUSE_OFF; - /* Diable pause for 10/100 Mbps in half-duplex mode. */ - if ((((mii->mii_media_active & IFM_GMASK) & IFM_FDX) == 0) && - (IFM_SUBTYPE(mii->mii_media_active) == IFM_100_TX || - IFM_SUBTYPE(mii->mii_media_active) == IFM_10_T)) - gmac = GMC_PAUSE_OFF; + gmac = GMC_PAUSE_OFF; + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FLAG0) != 0) + gmac = GMC_PAUSE_ON; + } CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL), gmac); /* Enable PHY interrupt for FIFO underrun/overflow. */ @@ -731,6 +726,7 @@ msk_init_tx_ring(struct msk_if_softc *sc_if) int i; sc_if->msk_cdata.msk_tso_mtu = 0; + sc_if->msk_cdata.msk_last_csum = 0; sc_if->msk_cdata.msk_tx_prod = 0; sc_if->msk_cdata.msk_tx_cons = 0; sc_if->msk_cdata.msk_tx_cnt = 0; @@ -999,11 +995,6 @@ msk_ioctl(struct ifnet *ifp, u_long command, caddr_t data) if ((mask & IFCAP_RXCSUM) != 0 && (IFCAP_RXCSUM & ifp->if_capabilities) != 0) ifp->if_capenable ^= IFCAP_RXCSUM; - if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && - (IFCAP_VLAN_HWTAGGING & ifp->if_capabilities) != 0) { - ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; - msk_setvlan(sc_if, ifp); - } if ((mask & IFCAP_VLAN_HWCSUM) != 0 && (IFCAP_VLAN_HWCSUM & ifp->if_capabilities) != 0) ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; @@ -1015,6 +1006,16 @@ msk_ioctl(struct ifnet *ifp, u_long command, caddr_t data) else ifp->if_hwassist &= ~CSUM_TSO; } + if ((mask & IFCAP_VLAN_HWTSO) != 0 && + (IFCAP_VLAN_HWTSO & ifp->if_capabilities) != 0) + ifp->if_capenable ^= IFCAP_VLAN_HWTSO; + if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && + (IFCAP_VLAN_HWTAGGING & ifp->if_capabilities) != 0) { + ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + if ((IFCAP_VLAN_HWTAGGING & ifp->if_capenable) == 0) + ifp->if_capenable &= ~IFCAP_VLAN_HWTSO; + msk_setvlan(sc_if, ifp); + } if (ifp->if_mtu > ETHERMTU && (sc_if->msk_flags & MSK_FLAG_JUMBO_NOCSUM) != 0) { ifp->if_hwassist &= ~(MSK_CSUM_FEATURES | CSUM_TSO); @@ -1140,6 +1141,7 @@ msk_phy_power(struct msk_softc *sc, int mode) case CHIP_ID_YUKON_EC_U: case CHIP_ID_YUKON_EX: case CHIP_ID_YUKON_FE_P: + case CHIP_ID_YUKON_UL_2: CSR_WRITE_2(sc, B0_CTST, Y2_HW_WOL_OFF); /* Enable all clocks. */ @@ -1342,35 +1344,22 @@ mskc_reset(struct msk_softc *sc) * On dual port PCI-X card, there is an problem where status * can be received out of order due to split transactions. */ - if (sc->msk_bustype == MSK_PCIX_BUS && sc->msk_num_port > 1) { - int pcix; + if (sc->msk_pcixcap != 0 && sc->msk_num_port > 1) { uint16_t pcix_cmd; - if (pci_find_extcap(sc->msk_dev, PCIY_PCIX, &pcix) == 0) { - pcix_cmd = pci_read_config(sc->msk_dev, pcix + 2, 2); - /* Clear Max Outstanding Split Transactions. */ - pcix_cmd &= ~0x70; - CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_ON); - pci_write_config(sc->msk_dev, pcix + 2, pcix_cmd, 2); - CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF); - } + pcix_cmd = pci_read_config(sc->msk_dev, + sc->msk_pcixcap + PCIXR_COMMAND, 2); + /* Clear Max Outstanding Split Transactions. */ + pcix_cmd &= ~PCIXM_COMMAND_MAX_SPLITS; + CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_ON); + pci_write_config(sc->msk_dev, + sc->msk_pcixcap + PCIXR_COMMAND, pcix_cmd, 2); + CSR_WRITE_1(sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF); } - if (sc->msk_bustype == MSK_PEX_BUS) { - uint16_t v, width; - - v = pci_read_config(sc->msk_dev, PEX_DEV_CTRL, 2); - /* Change Max. Read Request Size to 4096 bytes. */ - v &= ~PEX_DC_MAX_RRS_MSK; - v |= PEX_DC_MAX_RD_RQ_SIZE(5); - pci_write_config(sc->msk_dev, PEX_DEV_CTRL, v, 2); - width = pci_read_config(sc->msk_dev, PEX_LNK_STAT, 2); - width = (width & PEX_LS_LINK_WI_MSK) >> 4; - v = pci_read_config(sc->msk_dev, PEX_LNK_CAP, 2); - v = (v & PEX_LS_LINK_WI_MSK) >> 4; - if (v != width) - device_printf(sc->msk_dev, - "negotiated width of link(x%d) != " - "max. width of link(x%d)\n", width, v); + if (sc->msk_expcap != 0) { + /* Change Max. Read Request Size to 2048 bytes. */ + if (pci_get_max_read_req(sc->msk_dev) == 512) + pci_set_max_read_req(sc->msk_dev, 2048); } /* Clear status list. */ @@ -1445,6 +1434,7 @@ msk_attach(device_t dev) struct msk_softc *sc; struct msk_if_softc *sc_if; struct ifnet *ifp; + struct msk_mii_data *mmd; int i, port, error; uint8_t eaddr[6]; @@ -1454,7 +1444,8 @@ msk_attach(device_t dev) error = 0; sc_if = device_get_softc(dev); sc = device_get_softc(device_get_parent(dev)); - port = *(int *)device_get_ivars(dev); + mmd = device_get_ivars(dev); + port = mmd->port; sc_if->msk_if_dev = dev; sc_if->msk_port = port; @@ -1506,22 +1497,17 @@ msk_attach(device_t dev) * Enable Rx checksum offloading if controller support new * descriptor format. */ - if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0 && + if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0 && (sc_if->msk_flags & MSK_FLAG_NORX_CSUM) == 0) ifp->if_capabilities |= IFCAP_RXCSUM; ifp->if_hwassist = MSK_CSUM_FEATURES | CSUM_TSO; ifp->if_capenable = ifp->if_capabilities; ifp->if_ioctl = msk_ioctl; ifp->if_start = msk_start; - ifp->if_timer = 0; - ifp->if_watchdog = NULL; ifp->if_init = msk_init; IFQ_SET_MAXLEN(&ifp->if_snd, MSK_TX_RING_CNT - 1); ifp->if_snd.ifq_drv_maxlen = MSK_TX_RING_CNT - 1; IFQ_SET_READY(&ifp->if_snd); - - TASK_INIT(&sc_if->msk_tx_task, 1, msk_tx_task, ifp); - /* * Get station address for this interface. Note that * dual port cards actually come with three station @@ -1551,12 +1537,12 @@ msk_attach(device_t dev) * this workaround does not work so disable checksum offload * for VLAN interface. */ - ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; + ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWTSO; /* * Enable Rx checksum offloading for VLAN taggedd frames * if controller support new descriptor format. */ - if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0 && + if ((sc_if->msk_flags & MSK_FLAG_DESCV2) != 0 && (sc_if->msk_flags & MSK_FLAG_NORX_CSUM) == 0) ifp->if_capabilities |= IFCAP_VLAN_HWCSUM; } @@ -1600,7 +1586,8 @@ static int mskc_attach(device_t dev) { struct msk_softc *sc; - int error, msic, msir, *port, reg; + struct msk_mii_data *mmd; + int error, msic, msir, reg; sc = device_get_softc(dev); sc->msk_dev = dev; @@ -1640,7 +1627,8 @@ mskc_attach(device_t dev) sc->msk_hw_rev = (CSR_READ_1(sc, B2_MAC_CFG) >> 4) & 0x0f; /* Bail out if chip is not recognized. */ if (sc->msk_hw_id < CHIP_ID_YUKON_XL || - sc->msk_hw_id > CHIP_ID_YUKON_FE_P) { + sc->msk_hw_id > CHIP_ID_YUKON_UL_2 || + sc->msk_hw_id == CHIP_ID_YUKON_SUPR) { device_printf(dev, "unknown device: id=0x%02x, rev=0x%02x\n", sc->msk_hw_id, sc->msk_hw_rev); mtx_destroy(&sc->msk_mtx); @@ -1665,14 +1653,18 @@ mskc_attach(device_t dev) } } + sc->msk_int_holdoff = MSK_INT_HOLDOFF_DEFAULT; + SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "int_holdoff", CTLFLAG_RW, &sc->msk_int_holdoff, 0, + "Maximum number of time to delay interrupts"); + resource_int_value(device_get_name(dev), device_get_unit(dev), + "int_holdoff", &sc->msk_int_holdoff); + /* Soft reset. */ CSR_WRITE_2(sc, B0_CTST, CS_RST_SET); CSR_WRITE_2(sc, B0_CTST, CS_RST_CLR); sc->msk_pmd = CSR_READ_1(sc, B2_PMD_TYP); - if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S') - sc->msk_coppertype = 0; - else - sc->msk_coppertype = 1; /* Check number of MACs. */ sc->msk_num_port = 1; if ((CSR_READ_1(sc, B2_Y2_HW_RES) & CFG_DUAL_MAC_MSK) == @@ -1682,24 +1674,26 @@ mskc_attach(device_t dev) } /* Check bus type. */ - if (pci_find_extcap(sc->msk_dev, PCIY_EXPRESS, ®) == 0) + if (pci_find_extcap(sc->msk_dev, PCIY_EXPRESS, ®) == 0) { sc->msk_bustype = MSK_PEX_BUS; - else if (pci_find_extcap(sc->msk_dev, PCIY_PCIX, ®) == 0) + sc->msk_expcap = reg; + } else if (pci_find_extcap(sc->msk_dev, PCIY_PCIX, ®) == 0) { sc->msk_bustype = MSK_PCIX_BUS; - else + sc->msk_pcixcap = reg; + } else sc->msk_bustype = MSK_PCI_BUS; switch (sc->msk_hw_id) { case CHIP_ID_YUKON_EC: - sc->msk_clock = 125; /* 125 Mhz */ + sc->msk_clock = 125; /* 125 MHz */ sc->msk_pflags |= MSK_FLAG_JUMBO; break; case CHIP_ID_YUKON_EC_U: - sc->msk_clock = 125; /* 125 Mhz */ + sc->msk_clock = 125; /* 125 MHz */ sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_JUMBO_NOCSUM; break; case CHIP_ID_YUKON_EX: - sc->msk_clock = 125; /* 125 Mhz */ + sc->msk_clock = 125; /* 125 MHz */ sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_DESCV2 | MSK_FLAG_AUTOTX_CSUM; /* @@ -1717,11 +1711,11 @@ mskc_attach(device_t dev) sc->msk_pflags |= MSK_FLAG_JUMBO_NOCSUM; break; case CHIP_ID_YUKON_FE: - sc->msk_clock = 100; /* 100 Mhz */ + sc->msk_clock = 100; /* 100 MHz */ sc->msk_pflags |= MSK_FLAG_FASTETHER; break; case CHIP_ID_YUKON_FE_P: - sc->msk_clock = 50; /* 50 Mhz */ + sc->msk_clock = 50; /* 50 MHz */ sc->msk_pflags |= MSK_FLAG_FASTETHER | MSK_FLAG_DESCV2 | MSK_FLAG_AUTOTX_CSUM; if (sc->msk_hw_rev == CHIP_REV_YU_FE_P_A0) { @@ -1740,11 +1734,15 @@ mskc_attach(device_t dev) } break; case CHIP_ID_YUKON_XL: - sc->msk_clock = 156; /* 156 Mhz */ + sc->msk_clock = 156; /* 156 MHz */ + sc->msk_pflags |= MSK_FLAG_JUMBO; + break; + case CHIP_ID_YUKON_UL_2: + sc->msk_clock = 125; /* 125 MHz */ sc->msk_pflags |= MSK_FLAG_JUMBO; break; default: - sc->msk_clock = 156; /* 156 Mhz */ + sc->msk_clock = 156; /* 156 MHz */ break; } @@ -1752,37 +1750,16 @@ mskc_attach(device_t dev) msic = pci_msi_count(dev); if (bootverbose) device_printf(dev, "MSI count : %d\n", msic); - /* - * The Yukon II reports it can handle two messages, one for each - * possible port. We go ahead and allocate two messages and only - * setup a handler for both if we have a dual port card. - * - * XXX: I haven't untangled the interrupt handler to handle dual - * port cards with separate MSI messages, so for now I disable MSI - * on dual port cards. - */ if (legacy_intr != 0) msi_disable = 1; - if (msi_disable == 0) { - switch (msic) { - case 2: - case 1: /* 88E8058 reports 1 MSI message */ - msir = msic; - if (sc->msk_num_port == 1 && - pci_alloc_msi(dev, &msir) == 0) { - if (msic == msir) { - sc->msk_pflags |= MSK_FLAG_MSI; - sc->msk_irq_spec = msic == 2 ? - msk_irq_spec_msi2 : - msk_irq_spec_msi; - } else - pci_release_msi(dev); - } - break; - default: - device_printf(dev, - "Unexpected number of MSI messages : %d\n", msic); - break; + if (msi_disable == 0 && msic > 0) { + msir = 1; + if (pci_alloc_msi(dev, &msir) == 0) { + if (msir == 1) { + sc->msk_pflags |= MSK_FLAG_MSI; + sc->msk_irq_spec = msk_irq_spec_msi; + } else + pci_release_msi(dev); } } @@ -1812,15 +1789,18 @@ mskc_attach(device_t dev) error = ENXIO; goto fail; } - port = malloc(sizeof(int), M_DEVBUF, M_WAITOK); - if (port == NULL) { + mmd = malloc(sizeof(struct msk_mii_data), M_DEVBUF, M_WAITOK | M_ZERO); + if (mmd == NULL) { device_printf(dev, "failed to allocate memory for " "ivars of PORT_A\n"); error = ENXIO; goto fail; } - *port = MSK_PORT_A; - device_set_ivars(sc->msk_devs[MSK_PORT_A], port); + mmd->port = MSK_PORT_A; + mmd->pmd = sc->msk_pmd; + if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P') + mmd->mii_flags |= MIIF_HAVEFIBER; + device_set_ivars(sc->msk_devs[MSK_PORT_A], mmd); if (sc->msk_num_port > 1) { sc->msk_devs[MSK_PORT_B] = device_add_child(dev, "msk", -1); @@ -1829,15 +1809,18 @@ mskc_attach(device_t dev) error = ENXIO; goto fail; } - port = malloc(sizeof(int), M_DEVBUF, M_WAITOK); - if (port == NULL) { + mmd = malloc(sizeof(struct msk_mii_data), M_DEVBUF, M_WAITOK | M_ZERO); + if (mmd == NULL) { device_printf(dev, "failed to allocate memory for " "ivars of PORT_B\n"); error = ENXIO; goto fail; } - *port = MSK_PORT_B; - device_set_ivars(sc->msk_devs[MSK_PORT_B], port); + mmd->port = MSK_PORT_B; + mmd->pmd = sc->msk_pmd; + if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P') + mmd->mii_flags |= MIIF_HAVEFIBER; + device_set_ivars(sc->msk_devs[MSK_PORT_B], mmd); } error = bus_generic_attach(dev); @@ -1847,25 +1830,10 @@ mskc_attach(device_t dev) } /* Hook interrupt last to avoid having to lock softc. */ - if (legacy_intr) - error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET | - INTR_MPSAFE, NULL, msk_legacy_intr, sc, - &sc->msk_intrhand[0]); - else { - TASK_INIT(&sc->msk_int_task, 0, msk_int_task, sc); - sc->msk_tq = taskqueue_create_fast("msk_taskq", M_WAITOK, - taskqueue_thread_enqueue, &sc->msk_tq); - taskqueue_start_threads(&sc->msk_tq, 1, PI_NET, "%s taskq", - device_get_nameunit(sc->msk_dev)); - error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET | - INTR_MPSAFE, msk_intr, NULL, sc, &sc->msk_intrhand[0]); - } - + error = bus_setup_intr(dev, sc->msk_irq[0], INTR_TYPE_NET | + INTR_MPSAFE, NULL, msk_intr, sc, &sc->msk_intrhand); if (error != 0) { device_printf(dev, "couldn't set up interrupt handler\n"); - if (legacy_intr == 0) - taskqueue_free(sc->msk_tq); - sc->msk_tq = NULL; goto fail; } fail: @@ -1902,7 +1870,6 @@ msk_detach(device_t dev) /* Can't hold locks while calling detach. */ MSK_IF_UNLOCK(sc_if); callout_drain(&sc_if->msk_tick_ch); - taskqueue_drain(taskqueue_fast, &sc_if->msk_tx_task); ether_ifdetach(ifp); MSK_IF_LOCK(sc_if); } @@ -1967,18 +1934,9 @@ mskc_detach(device_t dev) msk_status_dma_free(sc); - if (legacy_intr == 0 && sc->msk_tq != NULL) { - taskqueue_drain(sc->msk_tq, &sc->msk_int_task); - taskqueue_free(sc->msk_tq); - sc->msk_tq = NULL; - } - if (sc->msk_intrhand[0]) { - bus_teardown_intr(dev, sc->msk_irq[0], sc->msk_intrhand[0]); - sc->msk_intrhand[0] = NULL; - } - if (sc->msk_intrhand[1]) { - bus_teardown_intr(dev, sc->msk_irq[0], sc->msk_intrhand[0]); - sc->msk_intrhand[1] = NULL; + if (sc->msk_intrhand) { + bus_teardown_intr(dev, sc->msk_irq[0], sc->msk_intrhand); + sc->msk_intrhand = NULL; } bus_release_resources(dev, sc->msk_irq_spec, sc->msk_irq); if ((sc->msk_pflags & MSK_FLAG_MSI) != 0) @@ -2509,7 +2467,7 @@ msk_encap(struct msk_if_softc *sc_if, struct mbuf **m_head) struct mbuf *m; bus_dmamap_t map; bus_dma_segment_t txsegs[MSK_MAXTXSEGS]; - uint32_t control, prod, si; + uint32_t control, csum, prod, si; uint16_t offset, tcp_offset, tso_mtu; int error, i, nseg, tso; @@ -2670,7 +2628,7 @@ msk_encap(struct msk_if_softc *sc_if, struct mbuf **m_head) } /* Check if we have a VLAN tag to insert. */ if ((m->m_flags & M_VLANTAG) != 0) { - if (tso == 0) { + if (tx_le == NULL) { tx_le = &sc_if->msk_rdata.msk_tx_ring[prod]; tx_le->msk_addr = htole32(0); tx_le->msk_control = htole32(OP_VLAN | HW_OWNER | @@ -2688,17 +2646,22 @@ msk_encap(struct msk_if_softc *sc_if, struct mbuf **m_head) if ((sc_if->msk_flags & MSK_FLAG_AUTOTX_CSUM) != 0) control |= CALSUM; else { - tx_le = &sc_if->msk_rdata.msk_tx_ring[prod]; - tx_le->msk_addr = htole32(((tcp_offset + - m->m_pkthdr.csum_data) & 0xffff) | - ((uint32_t)tcp_offset << 16)); - tx_le->msk_control = htole32(1 << 16 | - (OP_TCPLISW | HW_OWNER)); - control = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; + control |= CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) control |= UDPTCP; - sc_if->msk_cdata.msk_tx_cnt++; - MSK_INC(prod, MSK_TX_RING_CNT); + /* Checksum write position. */ + csum = (tcp_offset + m->m_pkthdr.csum_data) & 0xffff; + /* Checksum start position. */ + csum |= (uint32_t)tcp_offset << 16; + if (csum != sc_if->msk_cdata.msk_last_csum) { + tx_le = &sc_if->msk_rdata.msk_tx_ring[prod]; + tx_le->msk_addr = htole32(csum); + tx_le->msk_control = htole32(1 << 16 | + (OP_TCPLISW | HW_OWNER)); + sc_if->msk_cdata.msk_tx_cnt++; + MSK_INC(prod, MSK_TX_RING_CNT); + sc_if->msk_cdata.msk_last_csum = csum; + } } } @@ -2750,30 +2713,29 @@ msk_encap(struct msk_if_softc *sc_if, struct mbuf **m_head) } static void -msk_tx_task(void *arg, int pending) +msk_start(struct ifnet *ifp) { - struct ifnet *ifp; + struct msk_if_softc *sc_if; - ifp = arg; - msk_start(ifp); + sc_if = ifp->if_softc; + MSK_IF_LOCK(sc_if); + msk_start_locked(ifp); + MSK_IF_UNLOCK(sc_if); } static void -msk_start(struct ifnet *ifp) +msk_start_locked(struct ifnet *ifp) { - struct msk_if_softc *sc_if; - struct mbuf *m_head; + struct msk_if_softc *sc_if; + struct mbuf *m_head; int enq; sc_if = ifp->if_softc; - - MSK_IF_LOCK(sc_if); + MSK_IF_LOCK_ASSERT(sc_if); if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != - IFF_DRV_RUNNING || (sc_if->msk_flags & MSK_FLAG_LINK) == 0) { - MSK_IF_UNLOCK(sc_if); + IFF_DRV_RUNNING || (sc_if->msk_flags & MSK_FLAG_LINK) == 0) return; - } for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd) && sc_if->msk_cdata.msk_tx_cnt < @@ -2811,16 +2773,12 @@ msk_start(struct ifnet *ifp) /* Set a timeout in case the chip goes out to lunch. */ sc_if->msk_watchdog_timer = MSK_TX_TIMEOUT; } - - MSK_IF_UNLOCK(sc_if); } static void msk_watchdog(struct msk_if_softc *sc_if) { struct ifnet *ifp; - uint32_t ridx; - int idx; MSK_IF_LOCK_ASSERT(sc_if); @@ -2837,30 +2795,12 @@ msk_watchdog(struct msk_if_softc *sc_if) return; } - /* - * Reclaim first as there is a possibility of losing Tx completion - * interrupts. - */ - ridx = sc_if->msk_port == MSK_PORT_A ? STAT_TXA1_RIDX : STAT_TXA2_RIDX; - idx = CSR_READ_2(sc_if->msk_softc, ridx); - if (sc_if->msk_cdata.msk_tx_cons != idx) { - msk_txeof(sc_if, idx); - if (sc_if->msk_cdata.msk_tx_cnt == 0) { - if_printf(ifp, "watchdog timeout (missed Tx interrupts) " - "-- recovering\n"); - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue(taskqueue_fast, - &sc_if->msk_tx_task); - return; - } - } - if_printf(ifp, "watchdog timeout\n"); ifp->if_oerrors++; ifp->if_drv_flags &= ~IFF_DRV_RUNNING; msk_init_locked(sc_if); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue(taskqueue_fast, &sc_if->msk_tx_task); + msk_start_locked(ifp); } static int @@ -3182,6 +3122,9 @@ msk_tick(void *xsc_if) mii = device_get_softc(sc_if->msk_miibus); mii_tick(mii); + if ((sc_if->msk_flags & MSK_FLAG_LINK) == 0) + msk_miibus_statchg(sc_if->msk_if_dev); + msk_handle_events(sc_if->msk_softc); msk_watchdog(sc_if); callout_reset(&sc_if->msk_tick_ch, hz, msk_tick, sc_if); } @@ -3209,11 +3152,9 @@ msk_intr_gmac(struct msk_if_softc *sc_if) status = CSR_READ_1(sc, MR_ADDR(sc_if->msk_port, GMAC_IRQ_SRC)); /* GMAC Rx FIFO overrun. */ - if ((status & GM_IS_RX_FF_OR) != 0) { + if ((status & GM_IS_RX_FF_OR) != 0) CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_CTRL_T), GMF_CLI_RX_FO); - device_printf(sc_if->msk_if_dev, "Rx FIFO overrun!\n"); - } /* GMAC Tx FIFO underrun. */ if ((status & GM_IS_TX_FF_UR) != 0) { CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, TX_GMF_CTRL_T), @@ -3382,32 +3323,20 @@ msk_handle_events(struct msk_softc *sc) int rxput[2]; struct msk_stat_desc *sd; uint32_t control, status; - int cons, idx, len, port, rxprog; - - idx = CSR_READ_2(sc, STAT_PUT_IDX); - if (idx == sc->msk_stat_cons) - return (0); + int cons, len, port, rxprog; /* Sync status LEs. */ bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - /* XXX Sync Rx LEs here. */ rxput[MSK_PORT_A] = rxput[MSK_PORT_B] = 0; - rxprog = 0; - for (cons = sc->msk_stat_cons; cons != idx;) { + cons = sc->msk_stat_cons; + for (;;) { sd = &sc->msk_stat_ring[cons]; control = le32toh(sd->msk_control); if ((control & HW_OWNER) == 0) break; - /* - * Marvell's FreeBSD driver updates status LE after clearing - * HW_OWNER. However we don't have a way to sync single LE - * with bus_dma(9) API. bus_dma(9) provides a way to sync - * an entire DMA map. So don't sync LE until we have a better - * way to sync LEs. - */ control &= ~HW_OWNER; sd->msk_control = htole32(control); status = le32toh(sd->msk_status); @@ -3468,24 +3397,25 @@ msk_handle_events(struct msk_softc *sc) } sc->msk_stat_cons = cons; - /* XXX We should sync status LEs here. See above notes. */ + bus_dmamap_sync(sc->msk_stat_tag, sc->msk_stat_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); if (rxput[MSK_PORT_A] > 0) msk_rxput(sc->msk_if[MSK_PORT_A]); if (rxput[MSK_PORT_B] > 0) msk_rxput(sc->msk_if[MSK_PORT_B]); - return (sc->msk_stat_cons != CSR_READ_2(sc, STAT_PUT_IDX)); + return (rxprog > sc->msk_process_limit ? EAGAIN : 0); } -/* Legacy interrupt handler for shared interrupt. */ static void -msk_legacy_intr(void *xsc) +msk_intr(void *xsc) { struct msk_softc *sc; struct msk_if_softc *sc_if0, *sc_if1; struct ifnet *ifp0, *ifp1; uint32_t status; + int domore; sc = xsc; MSK_LOCK(sc); @@ -3499,92 +3429,6 @@ msk_legacy_intr(void *xsc) return; } - sc_if0 = sc->msk_if[MSK_PORT_A]; - sc_if1 = sc->msk_if[MSK_PORT_B]; - ifp0 = ifp1 = NULL; - if (sc_if0 != NULL) - ifp0 = sc_if0->msk_ifp; - if (sc_if1 != NULL) - ifp1 = sc_if1->msk_ifp; - - if ((status & Y2_IS_IRQ_PHY1) != 0 && sc_if0 != NULL) - msk_intr_phy(sc_if0); - if ((status & Y2_IS_IRQ_PHY2) != 0 && sc_if1 != NULL) - msk_intr_phy(sc_if1); - if ((status & Y2_IS_IRQ_MAC1) != 0 && sc_if0 != NULL) - msk_intr_gmac(sc_if0); - if ((status & Y2_IS_IRQ_MAC2) != 0 && sc_if1 != NULL) - msk_intr_gmac(sc_if1); - if ((status & (Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2)) != 0) { - device_printf(sc->msk_dev, "Rx descriptor error\n"); - sc->msk_intrmask &= ~(Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2); - CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask); - CSR_READ_4(sc, B0_IMSK); - } - if ((status & (Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2)) != 0) { - device_printf(sc->msk_dev, "Tx descriptor error\n"); - sc->msk_intrmask &= ~(Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2); - CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask); - CSR_READ_4(sc, B0_IMSK); - } - if ((status & Y2_IS_HW_ERR) != 0) - msk_intr_hwerr(sc); - - while (msk_handle_events(sc) != 0) - ; - if ((status & Y2_IS_STAT_BMU) != 0) - CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_CLR_IRQ); - - /* Reenable interrupts. */ - CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2); - - if (ifp0 != NULL && (ifp0->if_drv_flags & IFF_DRV_RUNNING) != 0 && - !IFQ_DRV_IS_EMPTY(&ifp0->if_snd)) - taskqueue_enqueue(taskqueue_fast, &sc_if0->msk_tx_task); - if (ifp1 != NULL && (ifp1->if_drv_flags & IFF_DRV_RUNNING) != 0 && - !IFQ_DRV_IS_EMPTY(&ifp1->if_snd)) - taskqueue_enqueue(taskqueue_fast, &sc_if1->msk_tx_task); - - MSK_UNLOCK(sc); -} - -static int -msk_intr(void *xsc) -{ - struct msk_softc *sc; - uint32_t status; - - sc = xsc; - status = CSR_READ_4(sc, B0_Y2_SP_ISRC2); - /* Reading B0_Y2_SP_ISRC2 masks further interrupts. */ - if (status == 0 || status == 0xffffffff) { - CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2); - return (FILTER_STRAY); - } - - taskqueue_enqueue(sc->msk_tq, &sc->msk_int_task); - return (FILTER_HANDLED); -} - -static void -msk_int_task(void *arg, int pending) -{ - struct msk_softc *sc; - struct msk_if_softc *sc_if0, *sc_if1; - struct ifnet *ifp0, *ifp1; - uint32_t status; - int domore; - - sc = arg; - MSK_LOCK(sc); - - /* Get interrupt source. */ - status = CSR_READ_4(sc, B0_ISRC); - if (status == 0 || status == 0xffffffff || - (sc->msk_pflags & MSK_FLAG_SUSPEND) != 0 || - (status & sc->msk_intrmask) == 0) - goto done; - sc_if0 = sc->msk_if[MSK_PORT_A]; sc_if1 = sc->msk_if[MSK_PORT_B]; ifp0 = ifp1 = NULL; @@ -3617,26 +3461,20 @@ msk_int_task(void *arg, int pending) msk_intr_hwerr(sc); domore = msk_handle_events(sc); - if ((status & Y2_IS_STAT_BMU) != 0) + if ((status & Y2_IS_STAT_BMU) != 0 && domore == 0) CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_CLR_IRQ); - if (ifp0 != NULL && (ifp0->if_drv_flags & IFF_DRV_RUNNING) != 0 && - !IFQ_DRV_IS_EMPTY(&ifp0->if_snd)) - taskqueue_enqueue(taskqueue_fast, &sc_if0->msk_tx_task); - if (ifp1 != NULL && (ifp1->if_drv_flags & IFF_DRV_RUNNING) != 0 && - !IFQ_DRV_IS_EMPTY(&ifp1->if_snd)) - taskqueue_enqueue(taskqueue_fast, &sc_if1->msk_tx_task); - - if (domore > 0) { - taskqueue_enqueue(sc->msk_tq, &sc->msk_int_task); - MSK_UNLOCK(sc); - return; - } -done: - MSK_UNLOCK(sc); - /* Reenable interrupts. */ CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2); + + if (ifp0 != NULL && (ifp0->if_drv_flags & IFF_DRV_RUNNING) != 0 && + !IFQ_DRV_IS_EMPTY(&ifp0->if_snd)) + msk_start_locked(ifp0); + if (ifp1 != NULL && (ifp1->if_drv_flags & IFF_DRV_RUNNING) != 0 && + !IFQ_DRV_IS_EMPTY(&ifp1->if_snd)) + msk_start_locked(ifp1); + + MSK_UNLOCK(sc); } static void @@ -3697,10 +3535,10 @@ msk_init_locked(struct msk_if_softc *sc_if) struct msk_softc *sc; struct ifnet *ifp; struct mii_data *mii; - uint16_t eaddr[ETHER_ADDR_LEN / 2]; + uint8_t *eaddr; uint16_t gmac; uint32_t reg; - int error, i; + int error; MSK_IF_LOCK_ASSERT(sc_if); @@ -3734,7 +3572,7 @@ msk_init_locked(struct msk_if_softc *sc_if) CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, GMAC_CTRL), GMC_BYP_MACSECRX_ON | GMC_BYP_MACSECTX_ON | GMC_BYP_RETR_ON); - + /* * Initialize GMAC first such that speed/duplex/flow-control * parameters are renegotiated when interface is brought up. @@ -3769,13 +3607,19 @@ msk_init_locked(struct msk_if_softc *sc_if) GMAC_WRITE_2(sc, sc_if->msk_port, GM_SERIAL_MODE, gmac); /* Set station address. */ - bcopy(IF_LLADDR(ifp), eaddr, ETHER_ADDR_LEN); - for (i = 0; i < ETHER_ADDR_LEN /2; i++) - GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_1L + i * 4, - eaddr[i]); - for (i = 0; i < ETHER_ADDR_LEN /2; i++) - GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_2L + i * 4, - eaddr[i]); + eaddr = IF_LLADDR(ifp); + GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_1L, + eaddr[0] | (eaddr[1] << 8)); + GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_1M, + eaddr[2] | (eaddr[3] << 8)); + GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_1H, + eaddr[4] | (eaddr[5] << 8)); + GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_2L, + eaddr[0] | (eaddr[1] << 8)); + GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_2M, + eaddr[2] | (eaddr[3] << 8)); + GMAC_WRITE_2(sc, sc_if->msk_port, GM_SRC_ADDR_2H, + eaddr[4] | (eaddr[5] << 8)); /* Disable interrupts for counter overflows. */ GMAC_WRITE_2(sc, sc_if->msk_port, GM_TX_IRQ_MSK, 0); @@ -3794,9 +3638,14 @@ msk_init_locked(struct msk_if_softc *sc_if) /* Set receive filter. */ msk_rxfilter(sc_if); - /* Flush Rx MAC FIFO on any flow control or error. */ - CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_FL_MSK), - GMR_FS_ANY_ERR); + if (sc->msk_hw_id == CHIP_ID_YUKON_XL) { + /* Clear flush mask - HW bug. */ + CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_FL_MSK), 0); + } else { + /* Flush Rx MAC FIFO on any flow control or error. */ + CSR_WRITE_4(sc, MR_ADDR(sc_if->msk_port, RX_GMF_FL_MSK), + GMR_FS_ANY_ERR); + } /* * Set Rx FIFO flush threshold to 64 bytes + 1 FIFO word @@ -3918,6 +3767,17 @@ msk_init_locked(struct msk_if_softc *sc_if) sc->msk_intrmask |= Y2_IS_PORT_B; sc->msk_intrhwemask |= Y2_HWE_L2_MASK; } + /* Configure IRQ moderation mask. */ + CSR_WRITE_4(sc, B2_IRQM_MSK, sc->msk_intrmask); + if (sc->msk_int_holdoff > 0) { + /* Configure initial IRQ moderation timer value. */ + CSR_WRITE_4(sc, B2_IRQM_INI, + MSK_USECS(sc, sc->msk_int_holdoff)); + CSR_WRITE_4(sc, B2_IRQM_VAL, + MSK_USECS(sc, sc->msk_int_holdoff)); + /* Start IRQ moderation. */ + CSR_WRITE_1(sc, B2_IRQM_CTRL, TIM_START); + } CSR_WRITE_4(sc, B0_HWE_IMSK, sc->msk_intrhwemask); CSR_READ_4(sc, B0_HWE_IMSK); CSR_WRITE_4(sc, B0_IMSK, sc->msk_intrmask); @@ -4188,7 +4048,7 @@ msk_stats_clear(struct msk_if_softc *sc_if) gmac = GMAC_READ_2(sc, sc_if->msk_port, GM_PHY_ADDR); GMAC_WRITE_2(sc, sc_if->msk_port, GM_PHY_ADDR, gmac | GM_PAR_MIB_CLR); /* Read all MIB Counters with Clear Mode set. */ - for (i = GM_RXF_UC_OK; i <= GM_TXE_FIFO_UR; i++) + for (i = GM_RXF_UC_OK; i <= GM_TXE_FIFO_UR; i += sizeof(uint32_t)) reg = MSK_READ_MIB32(sc_if->msk_port, i); /* Clear MIB Clear Counter Mode. */ gmac &= ~GM_PAR_MIB_CLR; diff --git a/sys/dev/msk/if_mskreg.h b/sys/dev/msk/if_mskreg.h index d345b60b9447..9c18ba719867 100644 --- a/sys/dev/msk/if_mskreg.h +++ b/sys/dev/msk/if_mskreg.h @@ -133,6 +133,7 @@ #define DEVICEID_MRVL_8039 0x4353 #define DEVICEID_MRVL_8040 0x4354 #define DEVICEID_MRVL_8040T 0x4355 +#define DEVICEID_MRVL_8042 0x4357 #define DEVICEID_MRVL_8048 0x435A #define DEVICEID_MRVL_4360 0x4360 #define DEVICEID_MRVL_4361 0x4361 @@ -143,11 +144,13 @@ #define DEVICEID_MRVL_436A 0x436A #define DEVICEID_MRVL_436B 0x436B #define DEVICEID_MRVL_436C 0x436C +#define DEVICEID_MRVL_4380 0x4380 /* * D-Link gigabit ethernet device ID */ #define DEVICEID_DLINK_DGE550SX 0x4001 +#define DEVICEID_DLINK_DGE560SX 0x4002 #define DEVICEID_DLINK_DGE560T 0x4b00 #define BIT_31 (1 << 31) @@ -889,6 +892,8 @@ #define CHIP_ID_YUKON_EC 0xb6 /* Chip ID for YUKON-2 EC */ #define CHIP_ID_YUKON_FE 0xb7 /* Chip ID for YUKON-2 FE */ #define CHIP_ID_YUKON_FE_P 0xb8 /* Chip ID for YUKON-2 FE+ */ +#define CHIP_ID_YUKON_SUPR 0xb9 /* Chip ID for YUKON-2 Supreme */ +#define CHIP_ID_YUKON_UL_2 0xba /* Chip ID for YUKON-2 Ultra 2 */ #define CHIP_REV_YU_XL_A0 0 /* Chip Rev. for Yukon-2 A0 */ #define CHIP_REV_YU_XL_A1 1 /* Chip Rev. for Yukon-2 A1 */ @@ -2356,6 +2361,7 @@ struct msk_chain_data { bus_dmamap_t msk_jumbo_rx_ring_map; bus_dmamap_t msk_jumbo_rx_sparemap; uint16_t msk_tso_mtu; + uint32_t msk_last_csum; int msk_tx_prod; int msk_tx_cons; int msk_tx_cnt; @@ -2400,9 +2406,17 @@ struct msk_ring_data { #define MSK_PROC_MIN 30 #define MSK_PROC_MAX (MSK_RX_RING_CNT - 1) +#define MSK_INT_HOLDOFF_DEFAULT 100 + #define MSK_TX_TIMEOUT 5 #define MSK_PUT_WM 10 +struct msk_mii_data { + int port; + uint32_t pmd; + int mii_flags; +}; + /* Forward decl. */ struct msk_if_softc; @@ -2456,17 +2470,18 @@ struct msk_hw_stats { struct msk_softc { struct resource *msk_res[1]; /* I/O resource */ struct resource_spec *msk_res_spec; - struct resource *msk_irq[2]; /* IRQ resources */ + struct resource *msk_irq[1]; /* IRQ resources */ struct resource_spec *msk_irq_spec; - void *msk_intrhand[2]; /* irq handler handle */ + void *msk_intrhand; /* irq handler handle */ device_t msk_dev; uint8_t msk_hw_id; uint8_t msk_hw_rev; uint8_t msk_bustype; uint8_t msk_num_port; + int msk_expcap; + int msk_pcixcap; int msk_ramsize; /* amount of SRAM on NIC */ uint32_t msk_pmd; /* physical media type */ - uint32_t msk_coppertype; uint32_t msk_intrmask; uint32_t msk_intrhwemask; uint32_t msk_pflags; @@ -2483,10 +2498,9 @@ struct msk_softc { bus_dmamap_t msk_stat_map; struct msk_stat_desc *msk_stat_ring; bus_addr_t msk_stat_ring_paddr; + int msk_int_holdoff; int msk_process_limit; int msk_stat_cons; - struct taskqueue *msk_tq; - struct task msk_int_task; struct mtx msk_mtx; }; @@ -2531,7 +2545,6 @@ struct msk_if_softc { struct msk_ring_data msk_rdata; struct msk_softc *msk_softc; /* parent controller */ struct msk_hw_stats msk_stats; - struct task msk_tx_task; int msk_if_flags; uint16_t msk_vtag; /* VLAN tag id. */ }; diff --git a/sys/dev/mwl/if_mwl.c b/sys/dev/mwl/if_mwl.c index 4a1dc8ab5782..e4e469b5bcfd 100644 --- a/sys/dev/mwl/if_mwl.c +++ b/sys/dev/mwl/if_mwl.c @@ -98,7 +98,7 @@ static void mwl_start(struct ifnet *); static int mwl_raw_xmit(struct ieee80211_node *, struct mbuf *, const struct ieee80211_bpf_params *); static int mwl_media_change(struct ifnet *); -static void mwl_watchdog(struct ifnet *); +static void mwl_watchdog(void *); static int mwl_ioctl(struct ifnet *, u_long, caddr_t); static void mwl_radar_proc(void *, int); static void mwl_chanswitch_proc(void *, int); @@ -360,6 +360,7 @@ mwl_attach(uint16_t devid, struct mwl_softc *sc) goto bad1; callout_init(&sc->sc_timer, CALLOUT_MPSAFE); + callout_init_mtx(&sc->sc_watchdog, &sc->sc_mtx, 0); sc->sc_tq = taskqueue_create("mwl_taskq", M_NOWAIT, taskqueue_thread_enqueue, &sc->sc_tq); @@ -401,7 +402,6 @@ mwl_attach(uint16_t devid, struct mwl_softc *sc) ifp->if_softc = sc; ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST; ifp->if_start = mwl_start; - ifp->if_watchdog = mwl_watchdog; ifp->if_ioctl = mwl_ioctl; ifp->if_init = mwl_init; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); @@ -558,6 +558,7 @@ mwl_detach(struct mwl_softc *sc) * Other than that, it's straightforward... */ ieee80211_ifdetach(ic); + callout_drain(&sc->sc_watchdog); mwl_dma_cleanup(sc); mwl_tx_cleanup(sc); mwl_hal_detach(sc->sc_mh); @@ -1214,6 +1215,7 @@ mwl_init_locked(struct mwl_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; mwl_hal_intrset(mh, sc->sc_imask); + callout_reset(&sc->sc_watchdog, hz, mwl_watchdog, sc); return 0; } @@ -1251,7 +1253,8 @@ mwl_stop_locked(struct ifnet *ifp, int disable) * Shutdown the hardware and driver. */ ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - ifp->if_timer = 0; + callout_stop(&sc->sc_watchdog); + sc->sc_tx_timer = 0; mwl_draintxq(sc); } } @@ -3411,7 +3414,7 @@ mwl_tx_start(struct mwl_softc *sc, struct ieee80211_node *ni, struct mwl_txbuf * MWL_TXDESC_SYNC(txq, ds, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); ifp->if_opackets++; - ifp->if_timer = 5; + sc->sc_tx_timer = 5; MWL_TXQ_UNLOCK(txq); return 0; @@ -3558,7 +3561,7 @@ mwl_tx_proc(void *arg, int npending) if (nreaped != 0) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - ifp->if_timer = 0; + sc->sc_tx_timer = 0; if (!IFQ_IS_EMPTY(&ifp->if_snd)) { /* NB: kick fw; the tx thread may have been preempted */ mwl_hal_txstart(sc->sc_mh, 0); @@ -3624,7 +3627,7 @@ mwl_draintxq(struct mwl_softc *sc) for (i = 0; i < MWL_NUM_TX_QUEUES; i++) mwl_tx_draintxq(sc, &sc->sc_txq[i]); ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - ifp->if_timer = 0; + sc->sc_tx_timer = 0; } #ifdef MWL_DIAGAPI @@ -4770,10 +4773,17 @@ mwl_txq_dump(struct mwl_txq *txq) #endif static void -mwl_watchdog(struct ifnet *ifp) +mwl_watchdog(void *arg) { - struct mwl_softc *sc = ifp->if_softc; + struct mwl_softc *sc; + struct ifnet *ifp; + sc = arg; + callout_reset(&sc->sc_watchdog, hz, mwl_watchdog, sc); + if (sc->sc_tx_timer == 0 || --sc->sc_tx_timer > 0) + return; + + ifp = sc->sc_ifp; if ((ifp->if_drv_flags & IFF_DRV_RUNNING) && !sc->sc_invalid) { if (mwl_hal_setkeepalive(sc->sc_mh)) if_printf(ifp, "transmit timeout (firmware hung?)\n"); diff --git a/sys/dev/mwl/if_mwl_pci.c b/sys/dev/mwl/if_mwl_pci.c index 2fb09227d0bd..33666d40f12d 100644 --- a/sys/dev/mwl/if_mwl_pci.c +++ b/sys/dev/mwl/if_mwl_pci.c @@ -204,7 +204,7 @@ mwl_pci_attach(device_t dev) BUS_SPACE_MAXADDR, /* maxsize */ MWL_TXDESC, /* nsegments */ BUS_SPACE_MAXADDR, /* maxsegsize */ - BUS_DMA_ALLOCNOW, /* flags */ + 0, /* flags */ NULL, /* lockfunc */ NULL, /* lockarg */ &sc->sc_dmat)) { diff --git a/sys/dev/mwl/if_mwlvar.h b/sys/dev/mwl/if_mwlvar.h index d69285d17de1..a75cedaec9d1 100644 --- a/sys/dev/mwl/if_mwlvar.h +++ b/sys/dev/mwl/if_mwlvar.h @@ -255,6 +255,8 @@ struct mwl_softc { bus_space_tag_t sc_io1t; struct mtx sc_mtx; /* master lock (recursive) */ struct taskqueue *sc_tq; /* private task queue */ + struct callout sc_watchdog; + int sc_tx_timer; unsigned int sc_invalid : 1, /* disable hardware accesses */ sc_recvsetup:1, /* recv setup */ sc_csapending:1,/* 11h channel switch pending */ diff --git a/sys/dev/mxge/eth_z8e.h b/sys/dev/mxge/eth_z8e.h index 5f60c1e9c66f..929ce20d6224 100644 --- a/sys/dev/mxge/eth_z8e.h +++ b/sys/dev/mxge/eth_z8e.h @@ -28,7033 +28,7255 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int eth_z8e_uncompressed_length = 359956 ; -static unsigned int eth_z8e_length = 112403 ; -static unsigned char eth_z8e[112403 + 1] = - "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xb5\x37\xbc\x72\x32\xc0\x24\x8d" - "\x4c\xc4\x48\x47\x44\x1d\x14\xda\xa8\x41\xa2\x62\x8b\x16\x24\x4a" - "\xb4\xd0\xcb\x8f\xa8\x60\xd3\x8a\x26\x68\x82\x41\x23\x44\x88\x10" - "\x30\x64\xc2\x80\x36\xa1\x40\x52\x49\x21\x40\x48\x62\x8b\x82\x2d" - "\x48\x04\xda\xe6\xf6\xa2\x8e\x25\xbe\x1f\x7a\x9b\x64\x62\x5f\xfa" - "\x1a\x7d\xb0\x1d\xb8\x91\xa6\x3c\x01\x46\x32\x90\x31\x99\x99\xfd" - "\x7c\xd7\xde\xe7\x24\x33\xc3\x04\xe5\xf6\x7e\xde\xe7\x9f\xe6\xf3" - "\x99\x9c\x73\xf6\xd9\x7b\xed\xb5\xd7\x5e\x7b\xed\xb5\xf6\x5e\x7b" - "\x1d\xa2\x7f\xe2\x4f\xdb\xd7\xf8\xcf\x14\xff\xd7\xdf\xbf\xfe\xfe" - "\xf5\xf7\xaf\xbf\x7f\xfd\xfd\xeb\xef\x5f\x7f\xff\x77\xfe\xce\x6b" - "\x26\xfa\x43\x25\x51\x8f\xc3\x6c\x75\xd3\xb9\xe2\xad\x9b\x85\x1f" - "\xc9\x31\x6e\x32\x5b\xf9\xaa\xff\xe8\x35\xa4\x6b\x95\x64\xbe\x39" - "\x91\x12\xa6\xed\x24\xaa\x1a\x29\xba\x36\x6f\x11\x9e\xb5\x5b\x44" - "\x57\xfa\x1b\x44\x4d\x63\x89\x36\x8f\x14\x5e\xc0\x99\xef\xa6\x1f" - "\x75\x30\x9c\xb5\x78\xe6\xf7\xeb\x46\x0a\x0f\xd2\x0b\xdd\xf4\xe3" - "\xf9\x9c\xbe\x66\x24\x60\x25\x11\x39\xb6\x08\x5f\x08\x5c\x33\x97" - "\x67\x98\xe9\x63\x24\x3e\xbb\x22\xe0\x30\x8c\x46\xc0\x38\x76\x19" - "\x18\x09\x06\x5e\x5e\x8d\x62\x18\x5e\xb7\x83\xac\x5e\x87\xf3\x5a" - "\x94\xf5\xa2\x4d\xc9\x5c\xb6\x02\x79\x84\x83\x62\x9b\x8a\xfc\x64" - "\xbb\x99\x62\x4e\x51\xdc\x3f\x70\xd5\x70\xfd\x8c\xdb\xbb\x56\x95" - "\x1b\xcb\x30\x50\x36\xa6\xc7\x11\x97\xda\x5f\x16\xb0\x6d\x25\x64" - "\x42\xde\x77\xbc\x9a\x53\x53\x79\x13\xe3\xf4\xbc\x1a\xf2\xce\x37" - "\xf2\xaa\x77\xda\x0c\xfd\xdd\x37\xf0\xae\x28\xfc\x9d\xe9\x35\xfd" - "\x5d\x02\xde\x55\x45\xe0\x67\x72\xf5\xfa\x09\xf5\x30\x2e\x36\x37" - "\xae\x47\xd0\x33\x3a\x6e\x8c\x53\x13\xf2\x97\x72\xfe\x74\x9b\xf0" - "\xcf\xb5\x91\xc4\x85\x69\x87\xbc\xd3\x8f\xd4\xab\xbc\xb8\x1f\xcd" - "\xe5\xf5\x7b\x1b\xee\x65\xba\x5e\xef\xd5\x3d\x8e\xf8\x84\x70\x9c" - "\x88\xf4\x77\x23\xf0\x2e\x39\xfc\xdd\x7b\xa9\xfa\xbb\x6f\xe2\x5d" - "\x7a\xf8\xbb\x18\xa3\x9c\x15\xef\xb2\x8d\x77\xa1\xfd\xa4\x38\xce" - "\x84\xdf\x10\x33\xd1\x50\xfc\x86\x99\x8d\xbe\x5b\x66\x15\x41\xfb" - "\x75\x64\x12\xeb\xb7\x94\x05\x1d\x82\x5c\x45\x3e\xb2\x8d\x22\xfb" - "\x49\x8a\x6f\x03\x5c\xda\xb4\x8a\xcc\xf6\x02\xe1\x73\x15\x75\x51" - "\xab\xa7\x8b\xec\x1e\xd1\xe9\xf2\x5f\xa0\x92\x0b\x64\x76\xf9\xcf" - "\x50\xc9\x8b\x64\x6d\x2a\xfe\x9c\xa2\xf1\x45\x50\x13\x64\x1f\xcd" - "\x65\x3b\xa8\xb5\xa6\x83\xec\x35\xe1\x65\xed\x37\x90\xb5\x05\xcf" - "\xa0\xb9\x85\xf1\x68\xb2\xf9\xc9\x1f\xbf\xa5\xac\x78\x1b\x99\xec" - "\x63\x48\x6b\xc9\x71\xea\xb8\x7c\xa3\x9a\x71\x59\x77\x9a\xcc\xbf" - "\x5c\x88\xbe\x3f\xcd\xf8\xd6\x96\xed\x5f\xe5\xd3\x8e\x58\x67\xd2" - "\x11\xeb\x71\x6a\xb2\x4e\xa1\xa6\xa2\x74\xda\x74\x9a\x12\x8e\xf8" - "\x26\x53\x93\xe9\x61\x8c\x8d\x74\x72\x75\xe1\xde\x16\x40\x1e\x2f" - "\xd9\x96\x13\xfa\xf5\x1b\x65\x55\xcf\x91\xd9\xad\x60\xa2\x3f\xbf" - "\x51\xf5\x41\x21\x11\xd3\x8c\x9f\xa3\xb5\x63\xd9\x75\x64\x05\x7e" - "\x9d\xc0\xe5\x5e\xe0\xd2\x32\xd6\x4a\xa9\xc0\x79\x98\xab\xda\x4f" - "\xa6\x62\x8a\x1b\x64\x4c\x24\x05\x1d\x72\x6c\x76\xd5\x6e\x11\x9d" - "\xcc\x5b\xdd\x2f\x67\x62\x7c\x25\x98\x50\xf7\x2e\xae\x6f\x13\xc6" - "\xa8\xfd\x75\x32\x75\xaf\xc8\x8c\xa9\xdb\x22\x3a\xf0\xce\x66\xbc" - "\x03\xbf\x77\xe0\x7d\xe7\x84\x24\x4a\x74\xf9\xd3\xe8\xfd\xde\x4e" - "\x13\xc3\x18\xee\xa5\x18\x86\x67\x29\xa2\x58\xb4\x67\x08\xf0\xf9" - "\xa2\x0e\xe9\xb7\x20\x1f\xca\xa3\xff\xd7\xef\xe1\xf2\xe2\x9b\x4f" - "\x78\x83\xdf\x7c\xe2\x42\x70\xeb\x13\xdd\x62\xeb\x13\xe7\x03\x5b" - "\x9f\xf8\xc2\xbe\x92\xcc\x81\x6f\x3e\xe1\x69\x2d\x90\x7d\x90\xd8" - "\x5a\x80\x3e\x08\x90\x79\xf5\x19\x4a\x7c\xea\x45\xf4\xbd\xff\x33" - "\x5a\xbd\x88\xac\xc1\xb8\x9d\x69\x2e\xff\x5f\xe8\xa9\x62\x12\xb8" - "\xcf\x88\xd6\xbe\xee\xf8\xda\xa3\x8a\x67\xcd\xdc\xa6\x76\xb7\xf6" - "\x73\x39\x26\x3c\x71\x6f\x1e\xc5\xaf\x19\xbf\x36\xfc\x8e\x89\xf8" - "\xda\x63\xa0\x95\x7d\xf8\x9a\x18\xaa\xed\x25\x9a\x10\xa4\x18\x74" - "\x91\x17\xf8\x27\x0e\x42\xb7\xd1\xc1\xf5\xef\x54\x7e\xbb\x94\x4a" - "\x7a\x7a\xf2\x88\x65\x0a\xcb\x13\x96\x2f\x3d\x8e\xab\xd2\x50\x8f" - "\x53\xf2\xfe\x16\xe1\x15\xf1\xef\x54\x22\xbd\xd3\xfb\x72\x5e\x8c" - "\xe7\xe5\x3c\xad\x3b\xfe\x9d\xcd\xc8\x93\x83\x3c\x3e\x9d\x86\x9d" - "\x0c\x0b\xe3\xc4\x73\x95\x9f\x62\x01\xb3\xe0\x77\x17\xdb\x4d\x3b" - "\xb7\x88\xe3\xc8\xb7\xa1\x1f\x16\x60\x03\x0e\xe8\x7f\x55\xbd\x91" - "\x06\x5a\x77\x6c\x44\x3e\x2e\xef\xf2\xa5\xb1\xdc\x75\xbb\xf2\x3b" - "\xc9\xe2\xa7\x78\xd1\xa7\xea\x43\x9e\x4e\x96\x8f\x57\xf9\x68\x68" - "\x8f\x83\x32\x18\x36\x97\x73\x75\x75\x12\xca\x6d\x16\xf6\x3c\xc8" - "\x25\x9a\xdd\x23\xf2\x62\x20\x8b\x3b\x8e\xa0\xbc\xaa\x7b\xb8\xd9" - "\xc0\x91\xeb\xe0\xbe\x96\x78\x82\x1f\x8e\xe4\xfb\xe8\xaa\x6a\x8a" - "\x45\xb9\xc7\x18\x1e\xc3\x02\x1f\xb8\xd1\xd6\xcd\x47\xf2\x3d\x14" - "\x14\x61\x30\xdd\x3a\xbc\xcc\x30\x78\x48\x17\x80\xc7\xfc\xd7\x84" - "\x32\x57\xd5\x4b\x78\x8f\xfe\x2e\xc8\xf0\x7c\x64\xb2\x49\x7c\x1f" - "\x67\x18\x3d\x2c\xd3\x00\xd3\xb9\xfc\x41\xea\xa2\xe1\x4e\x8f\x3d" - "\x2f\xb6\xb5\x98\x88\xcb\xef\x2f\xe9\x1c\x22\xba\x33\x63\x99\xe7" - "\xf8\xbd\xcb\x7f\x9e\xf3\xbc\x2e\xba\xf3\x62\xaf\xea\x22\x13\xe3" - "\x8c\xf2\x45\x8c\x67\x68\x5f\x3e\xfa\xd0\xe3\x53\xe8\xf1\xf4\x19" - "\xe9\x53\x68\xd6\x03\xd3\xa6\x50\xea\xbd\xe3\x53\xef\xfe\xee\xa4" - "\xbb\x29\xe3\x87\x8f\x4e\xa1\x8c\xd9\x53\xe8\x31\xfc\x32\x1f\x9e" - "\x81\x87\x69\x53\xee\x4c\xfd\xfe\xf8\x8c\x69\x33\x1e\xa2\x47\xe6" - "\xde\x95\x7a\xd7\x5d\xf4\xc0\x43\x33\xef\x4c\x4d\xd5\xaf\x77\xa6" - "\x72\x96\x1f\x4f\x7a\xe8\xb1\xf1\x19\x4b\x97\x14\x2e\x19\x3f\x7b" - "\xc6\xb4\xd0\x39\x31\x39\x70\x31\xc8\x34\xf5\x8a\x73\xd3\x29\x08" - "\x19\x51\x8b\xbe\xc6\xaf\xcb\x59\x72\x12\x63\x3d\x71\x75\x2d\xf7" - "\x91\x94\x93\xc3\x8f\x63\x7c\x9b\x7a\x1c\x96\x75\x6e\x6d\xcb\x24" - "\xa6\x15\xe6\x1e\xe4\xb9\x76\x01\xde\x9d\xd0\x65\xf3\x10\xbc\xdf" - "\x15\xfe\xfe\xea\x22\xbc\xff\x7b\xab\x8d\xc8\x85\x1f\xe8\xeb\x85" - "\xcc\x03\x1d\x3d\xd4\x6d\xcf\x1c\x02\x3e\x8e\x41\x1d\x1d\x18\x83" - "\x6d\x28\xeb\x0e\x19\xdb\x1d\xe8\x87\x36\xdb\x2a\x8a\x3d\x4b\x96" - "\x7f\x6f\x2d\x4c\x23\xee\x0f\x57\xa1\x0e\xe3\x42\x3f\x8c\x78\x09" - "\x03\x7d\x0c\x38\xc7\x14\x9c\xc4\xe4\x10\x39\xe0\x66\x38\x9b\xf0" - "\x4e\x87\x15\x68\x85\x3c\x80\xbc\x7e\x2d\x68\x4f\x26\x11\xbf\xa5" - "\x32\xd8\x97\x2c\xe7\x16\x94\xcb\x36\xf8\x17\xf9\xbd\x4d\x05\xc8" - "\xf7\xcb\xe9\x31\xe8\xef\x18\xcc\x9d\x68\x8b\x25\x1f\x7c\xec\x0d" - "\xae\x7f\xb3\x5d\xf4\x64\x92\x4a\x4b\xdc\x2b\xe2\xf1\xbc\xfe\xcd" - "\x4f\x84\x1d\x69\xab\x64\xda\x3e\x4e\x43\xdf\xc6\xf2\x18\x14\x2f" - "\xcb\xf4\x58\xd0\x62\x0c\xf0\x6b\x0f\x70\xf9\x73\xb2\xfc\x30\xa4" - "\xc5\x20\xef\x27\xc1\xf8\x37\x3f\x05\xaf\x70\x1a\xe6\xf3\x6b\x4b" - "\x01\xef\x7f\x05\x45\x26\x09\xf3\xf9\x46\xdc\x1f\x77\xae\xea\xa2" - "\x53\x05\xa4\xb9\xf1\x2e\x68\x07\xcc\xbe\xfe\xfa\xdb\xb8\x2c\xea" - "\x32\xf5\xf4\xe5\x61\x0e\x4d\x3c\xc6\xba\x40\x80\xf1\x39\xd7\x9f" - "\xc7\xc9\x75\xf2\x38\x46\x5f\x74\xa1\x9f\xe2\x7a\x1c\x57\xcf\x8c" - "\xe8\xa7\x1c\xc0\xf9\x04\x74\x6f\x07\x8c\xc3\xc1\x6e\xd4\x81\x67" - "\xc0\xd5\x74\xb8\x06\x0c\xaf\xe2\x83\xab\x37\x44\xf0\xc1\x43\x80" - "\x7d\x21\xe4\xfd\xde\x88\xf7\xb7\xe2\x7d\xaf\xfe\x1e\xe3\xe9\xea" - "\xe6\x88\xfa\x3b\xf1\x3e\x88\xfa\xbd\x18\x2f\xb1\xa8\x2f\xa3\x96" - "\xf5\xb4\x81\xfc\xfe\xf0\xfc\x23\xac\xdd\x0e\x0b\xcb\x10\x96\x85" - "\x32\x7f\x9d\xce\xab\xaa\xfe\x11\x29\x11\xf9\xc1\xc3\x96\x61\xe0" - "\x07\xbe\x5e\x83\x3c\xc3\x20\x8b\x4c\x98\x37\x8e\x1f\x29\x66\xbd" - "\x6d\xc4\xfc\x88\xfc\xc5\xc8\x37\x8a\xe9\x28\x69\x70\x4e\xd2\x20" - "\x43\xd7\xb3\x78\x2c\x98\x51\xa6\x32\xa2\x4c\x03\xca\xdc\x1c\x54" - "\x74\x8b\xed\xe9\x8e\x5a\xa6\x29\xa2\x4c\x87\xec\x7f\x55\x8f\x89" - "\xf9\xc5\x28\x23\x65\x4b\x5f\x18\x0c\x6e\x1b\xf4\xb1\x6b\xcc\xe1" - "\x30\x92\x3a\x50\xef\x6d\x1b\xd5\x38\xfe\x06\xfa\xfc\x2e\xa4\xfd" - "\x05\x70\x3f\x63\x3e\x61\x5e\x76\x79\x7c\x90\x7d\xd3\x13\xd4\x1c" - "\x7e\xcd\x22\x4b\x31\xf1\xfd\x78\xbe\x67\xd8\xa2\x6f\xa6\xce\xe3" - "\xd7\x2c\xc2\x95\xd3\x65\x9d\x3c\xb6\x44\xdf\xbf\x05\x15\xcc\x6b" - "\x36\x62\x0c\x6a\x78\x0e\xe8\x75\xb4\xe0\x39\x06\xfc\xf9\x29\xe4" - "\x2a\x78\x72\x3a\xf3\xdb\x44\xa4\x7f\xa8\xbf\x7f\x97\xf3\xe3\xfe" - "\x4e\xfd\x9e\xf9\xf2\x53\x9d\x2f\xc1\xe7\x49\xbf\x91\x75\x4b\x5e" - "\x57\xe5\x83\x8a\xaf\xa7\xe1\xdd\xeb\xb8\xce\xc0\x75\x23\xae\x8f" - "\xe0\xba\xc8\x7e\x81\xac\xf6\x00\xf4\x08\xf5\x3c\x0f\xd7\x47\x71" - "\x7d\x00\xd7\xc7\x70\x1d\xcf\xe3\xd2\xb3\x22\x8f\x22\x78\xa2\x2b" - "\xa8\xc6\xe2\x30\xd5\x1f\x49\xa3\xf5\xf1\xa1\xc6\xe7\xb9\x81\x34" - "\xa1\xd2\x34\xc8\xf3\x81\xb4\xbe\xe9\x4c\x97\x0c\xb4\xdd\xc7\xf5" - "\xeb\xe3\x7a\x88\xea\x17\x95\x27\xa8\xca\xe9\x7d\xa7\xa7\xa9\x7c" - "\x31\xa1\x75\xba\xe9\x9a\xe6\x12\xaf\x10\xb8\x36\x32\x5d\x91\x7e" - "\x18\x34\x81\x3e\x73\xcd\x06\xa6\xd3\x40\x7f\x5f\x93\x1c\xd2\xdf" - "\xd0\x67\x93\x7c\xe1\xfd\x9d\x98\xc1\x34\xe3\xfe\x36\xf0\x65\xdc" - "\x31\xa7\xf0\x3c\x35\x54\xe1\x9f\x98\x01\xb9\xde\xc5\x7d\x1f\x5b" - "\xc0\xe3\xe1\xda\xc9\x6e\xda\x25\x65\x22\xbf\xf3\xc6\x1d\x48\xe4" - "\xf2\xb1\xf9\xf2\x5d\x26\xe4\x65\xbb\xf1\x8e\xeb\xe6\x71\x18\x5b" - "\x28\xdf\x15\x1a\xe5\x20\x33\x1b\x64\x59\xcc\x71\x3c\xe7\xf3\xdc" - "\x8d\x39\xb4\x13\x79\xaa\xdd\x74\x55\xe2\x60\xf6\x8d\x28\xdb\x52" - "\x3f\xbe\x94\xb4\x5b\x4a\x69\x88\xcb\x7f\x9c\xe6\xf8\x45\x60\x3c" - "\x51\x9c\xcb\x3f\x99\x6e\x25\xba\xda\xe5\x3f\x46\x68\xf0\x18\x97" - "\xbf\x0a\x73\xe4\x3a\x7e\xff\xfe\x6d\x14\x13\x83\xab\xfd\x76\xd2" - "\x62\x5c\xfe\x5d\x48\x3f\x44\xb7\x90\x29\xe6\xfb\x43\x44\x8f\xcb" - "\x3f\x11\xcf\x85\xf4\xf0\x10\xf1\xb7\xac\x00\x25\xce\x7c\x45\xd8" - "\x5d\xfe\x1c\x7a\xf8\x95\xa0\x70\xf9\x9b\xf1\x2e\x9f\xe6\x04\xbe" - "\x14\x73\x02\x3d\x42\x98\xb7\x34\xcc\x09\x9c\xc3\xfd\xdf\x04\x68" - "\x89\xeb\xfb\xf8\xd9\x85\x0b\xba\xae\x28\xdf\x52\x9f\xb5\x52\xa3" - "\x3e\xcc\x2b\x22\x6e\x4b\x03\xda\xe7\xec\x13\x79\xb1\x98\x13\xde" - "\xef\xeb\xc3\x75\xfd\x96\xf7\xe4\x73\xd9\x96\x36\xc0\x71\xde\x01" - "\xc5\x9f\xf1\x77\xf9\x3b\x28\x0b\xb2\x63\xce\x4a\x8f\x60\xdc\x87" - "\xaf\x11\x34\x67\xe5\xfb\x02\x72\xcb\x32\x67\xa5\x5d\xe0\x9d\x19" - "\xf0\x9c\x2e\x7f\x17\xd7\xd1\x06\x78\x2d\x12\x5e\xd9\x16\x0f\xf2" - "\x7a\x38\x5f\x28\x1c\x86\xc1\x79\xe7\x04\xc8\x82\xfc\x9e\xbe\xf2" - "\x2d\xee\xbe\xf2\xad\x84\x5f\xaa\x88\xdf\xfa\x60\xd0\x91\xf4\x01" - "\xcf\x51\xa2\x6c\x6b\x06\x9e\xb3\xbf\x04\x9f\x48\x3a\x06\x68\x98" - "\x28\xdf\x9a\x81\x3e\x4f\xef\x91\xf8\x6e\x2d\x95\xf8\xae\xdf\x6a" - "\xff\x52\xb6\x63\x6b\x89\x6a\xc7\xd6\xd5\x9c\xee\x05\xdf\xe2\xbe" - "\xde\xab\xde\xd5\xa1\xdc\x5c\x59\xae\x6c\x6b\xbd\x30\x6f\x6d\x00" - "\x0f\xc6\xce\x09\x88\x52\xa6\x21\xe8\x5a\xca\x74\x64\xbb\x05\x75" - "\xd4\x8b\xb8\xad\x0d\xc0\xc7\x89\xf2\x7f\xee\x13\x3c\x6f\x6e\x75" - "\x7f\xa9\x60\xff\x0d\x70\xe6\xf7\x30\x4c\xf3\x56\x37\x60\x79\xfc" - "\x9a\x0d\xf4\x10\xbe\x39\xfe\x35\xfe\xac\x95\x14\xeb\xf2\x7f\x48" - "\xc9\xa5\xa5\x31\xae\xa2\x42\xb4\x73\x03\x60\xe6\xe0\x3d\x5d\x83" - "\xba\xde\x07\x5c\x37\xd7\x87\x3a\x3c\x80\x79\x06\xb0\x72\x18\xa7" - "\x5e\x07\x25\x8a\xf8\x6a\xea\x95\xf8\x55\xdb\x82\x65\xd5\x69\x41" - "\x73\x75\xaa\xc1\x3f\xcc\x3b\x8a\x6e\xcc\x33\xfb\x38\x2d\xd1\xe0" - "\x93\x40\x59\x75\xe2\xed\x44\x89\xb3\xbd\xc2\xcf\xbc\x32\x81\x0a" - "\x62\x5a\xbd\xc7\x40\x6b\x33\xb5\x16\x1c\xa2\xdb\x88\xed\x27\x2f" - "\xb5\x7a\xab\xf0\xbc\x93\x18\xbf\x56\xef\x3a\x6a\xe9\xda\x45\xb3" - "\x0b\xbc\x6b\x02\xe6\xea\xca\x96\xae\x59\x84\xf2\xef\x03\xc7\xe0" - "\x53\x05\xa6\xd2\xd6\x02\x2f\x3f\xdb\x5b\xba\xc0\x9f\x01\x11\xf0" - "\x97\x55\x93\xdf\x5c\x5d\x3f\xfb\x82\xf0\xcc\xea\x2a\x1d\x82\xb4" - "\x3e\x4b\x8c\xf0\x5b\x8a\xec\xa2\xa5\x6b\x03\x3d\x75\x81\x62\x5a" - "\xf2\x0e\x49\x3e\x7d\xaa\xa0\x80\x64\xf9\x0b\x7e\xcb\x93\x5d\xa5" - "\xf4\x64\x1e\x0d\x47\xfe\x73\xcc\xb3\x62\x78\x29\x35\x77\xe4\xd3" - "\xac\x33\xfe\xd8\xd9\x17\xfa\x44\x73\x76\x15\xb5\xe4\x55\x81\x1e" - "\xd5\x36\xb6\x33\x66\x9d\xe9\x16\xb3\x2f\xf4\x88\x96\xbc\x7d\xd4" - "\x9c\x7d\x88\x66\x7e\xee\xb4\x04\xca\xab\x13\x83\x71\xd5\xa9\xc1" - "\xf2\xea\xb4\x40\x5c\x75\xa5\xbf\x1c\xb8\xc4\x55\xd7\x8b\xf5\xdb" - "\x60\xc3\x60\x6e\x97\xfd\xbb\x6d\x38\xee\x6d\xb2\x7f\xcd\xdb\x6c" - "\xa2\x6c\x5b\x5a\x5f\xf9\xb6\x54\xc9\xf7\x71\xdb\x6c\x2e\x3f\xf3" - "\xff\xb6\x34\xe4\x4b\x53\x3c\xb2\x2d\x43\xf1\xfe\xb6\x39\xdc\xaf" - "\xc8\x9b\x8d\x5f\x01\x7e\xd0\x45\xb6\x41\xa7\xa2\xab\x19\x6e\xb0" - "\x6c\x9b\x3b\x68\xde\x86\xf1\xb0\xcd\x03\xbb\x44\x6b\xf5\xee\xa2" - "\x00\x64\x6b\xab\x37\x40\xb3\x5f\xf4\xa1\x6f\xd1\x07\x45\x01\xd0" - "\xf3\x38\x3d\xf5\x22\xd9\x5d\x45\xc7\x49\xbc\x57\xc9\xf4\xb0\xcc" - "\x7e\xf1\x7d\x11\x2c\xdf\xe6\xe6\xf7\xb3\x5f\xb4\xc3\x36\x02\x9c" - "\xb8\x6d\x9e\xe0\xfa\xed\x89\xba\xae\x04\x3c\xb6\x5b\x18\x8f\xbe" - "\x1e\xf0\x18\xe6\x71\x11\xb7\xdd\x86\xb4\xd7\x78\xee\x08\x32\xdf" - "\x95\x6d\xaf\x14\xe6\xed\x9e\x59\x43\x84\x27\xf0\x2a\x49\x1e\x08" - "\xde\x2f\x04\xdb\x5e\x59\x45\x54\x2f\xc7\x54\x60\x54\x29\xca\x79" - "\x44\xf9\xf6\xca\xe0\xfa\x9d\x77\x01\x4e\xac\x58\xc1\x65\x77\xa6" - "\x2a\x9e\xf9\x4c\x8e\x3d\x51\xbe\x33\xf5\xeb\xda\xf9\x3d\x8e\x51" - "\xc5\x6e\x7a\x3b\x93\x65\x1c\xee\xcb\xdc\xb4\x3f\x45\xbf\xaf\x72" - "\x53\xd5\x71\x29\x1f\x21\xe7\x0a\x4a\xe8\xda\xd3\x74\xfd\x74\xd0" - "\x84\x70\x9f\x80\xfb\x99\x73\x6e\x45\xbb\xcb\x3e\xeb\x44\x9f\xf7" - "\xb0\xcc\x11\x8e\x89\xd0\x37\x28\x0d\xed\x35\x8b\x9e\xe4\x04\x11" - "\xbf\x7b\xa1\xe8\xb3\xb2\x2d\x69\xc1\xf3\x70\xd0\x75\x2c\xae\x23" - "\x76\x5e\xa4\x24\xfc\xac\x3b\x1d\xc1\x52\x96\xc9\xb8\x4f\x15\x2b" - "\xac\xf1\x9b\x96\x53\x8a\xc5\x4b\xe6\x3a\x47\x30\xd3\xb2\x26\x91" - "\x6d\xaa\x24\xbe\x17\x8e\x6d\x54\x77\x91\x4c\x3c\xb7\x04\xe3\x50" - "\x5f\x91\x45\x88\x65\xc9\x54\xb7\x14\xf2\xc8\x41\xd6\x3a\x87\x68" - "\x08\xf4\x24\x6b\x8c\xa7\x81\x0b\xe3\x06\x3c\x6f\x00\x9e\xf3\xe7" - "\xad\x4c\xa3\x0f\x8b\x28\xea\x5a\x44\x8f\xe3\xfa\xfe\xf6\x0f\xf2" - "\xbe\xc6\xa0\xc9\x20\xef\x0f\x1b\x74\x1a\xcc\xde\xe7\x71\x1e\xb8" - "\x28\x3c\x15\x8b\x89\x69\x61\xb5\xfb\xc5\x7f\xc1\x26\x29\x2d\x09" - "\xd0\x0d\x73\x56\xde\x24\x5c\x1e\xe1\x74\x15\x9d\x91\xeb\x75\x75" - "\xc8\x53\xe2\x17\x41\xb6\x6f\xd9\xb6\xad\x62\x5b\xb5\x7c\xf7\x74" - "\x51\xbe\x3b\xbd\x7b\xb9\xf0\xd7\x4a\x7b\x74\x74\xaa\x9b\xee\x29" - "\x50\x7d\x53\x6d\xc3\x5c\xd8\xd1\x6d\xde\x9d\x0e\xd8\x57\x33\xec" - "\xd6\x02\xe1\x0c\xc6\xed\x9e\x89\x7c\x98\xff\x7e\x5f\x19\xba\x66" - "\x87\x79\xad\x6b\xdd\x16\x9e\xdb\x46\x63\xfe\xbb\x69\xee\x25\x6b" - "\x42\x72\x75\x91\xd0\x2f\xb6\x81\x45\xc9\x18\x9d\x7d\x8c\xbf\x44" - "\xfc\xd2\xa2\xbf\x1e\x98\x1b\xab\xeb\xbb\x61\x77\xd9\x57\xd3\x68" - "\xf4\xc3\xf5\xa7\x69\xf4\x3f\xec\x45\xe2\x94\x70\x8c\x2e\xfd\xe5" - "\x2a\x1f\x74\x82\xd1\x5e\x37\xad\xc9\x1b\x7c\x6e\x85\x5c\xbc\x28" - "\x3a\x2b\x96\xf7\xd3\xec\xc4\x9c\x95\x41\xc1\xf7\x3c\xce\xea\x90" - "\xce\xf4\xe8\x71\xdc\x30\xd9\xa0\xc5\x20\xf4\x37\x89\xb2\xdd\x99" - "\x4a\x07\xbc\xa1\x46\x38\x04\x39\x6f\xe4\x75\xbc\x1b\x76\x4a\x3d" - "\xa8\x6c\x5b\x6a\x37\xe4\x08\xaf\x77\x40\x67\xf6\x2e\xb3\x0a\x1f" - "\x60\x56\xba\x69\x9c\x5b\xb7\xb3\xbc\x2e\xff\x43\x2c\x53\x52\x07" - "\x5b\x27\x1d\x80\x7f\xe3\xe1\x56\x68\x44\x2c\x93\x84\xf9\xc0\xdc" - "\x12\x85\xb7\x8f\xe1\x3a\x4b\xce\x53\x07\xde\x2f\xf3\x8a\x4e\x51" - "\x76\x60\x3a\xeb\x21\xce\xe5\xbd\x9c\xf6\x2e\x78\x58\x38\x97\x32" - "\x4e\x37\xbe\xeb\xbc\xb1\x97\x4e\x41\xc7\x83\x7e\xe7\x51\x36\xd7" - "\x8d\x7b\x8e\x14\x92\x6e\xc7\xdd\x08\xfb\xef\xdb\x7b\x0c\xbc\x20" - "\x3b\x04\xe8\x8b\xfa\x59\xee\x75\x11\xaf\xa1\x2d\x2b\x16\x3e\xe0" - "\x6a\x43\xde\xb9\x46\x1b\xb8\x7d\xaa\x5d\x37\xe6\x85\xb6\x0b\x38" - "\x78\xa0\x2f\x4b\x1a\x2c\x5b\x49\x66\x9b\xa2\xb5\x99\xdb\xcb\x6d" - "\xe1\x36\xcb\xb6\x40\xbf\xe0\x79\xc5\xe5\xbf\x07\xfa\x97\x4c\x4f" - "\x03\xac\x43\x6e\xfa\x56\xba\xd2\xad\x6e\x94\x7a\x5d\xd4\x7e\x34" - "\x6f\xf5\xd8\xbf\xa4\x1b\xed\x41\x71\xf2\x14\xdd\xc4\x3a\x6d\x2c" - "\x5f\xe5\x9c\xec\x03\xff\x9a\xf7\x8d\xe5\xb9\xd8\x55\x7c\x01\xf2" - "\x5b\xe6\xbd\x06\x79\x3b\x90\xe7\x4e\x3d\xef\x9d\x6a\x7d\x57\x5e" - "\x87\xf1\x15\x73\xf3\x19\xf0\xee\x74\x5e\x93\x00\x9d\x13\x8d\x67" - "\x81\x67\x5c\xd1\x57\xfb\xc6\x46\xc7\x65\xbb\x27\xa8\xc6\x62\x17" - "\xea\xf9\x26\xf3\x94\x7d\x25\x5d\x07\xbe\x3c\x51\xb2\x9a\xae\x61" - "\x7e\x12\x71\xbb\x73\x14\xdd\x6f\xaa\x12\x8e\x52\x72\x41\x7a\x16" - "\x2c\xa7\xeb\x31\xfe\xe6\x9f\xa6\x9b\xde\xca\x2a\xb6\x01\x57\xa2" - "\x8a\xb3\x44\x52\xd6\xc4\xed\xce\x76\xf9\x3f\xa7\xba\xb3\x6c\x6b" - "\xdd\x74\xd4\xe0\x45\xdc\x1f\xbb\x9c\x5c\x00\x5d\x0b\x94\xad\x60" - "\x7b\x80\xd7\xcb\x4e\x92\x2d\x85\xdb\x8b\x5f\x0c\xd2\x6e\x10\x17" - "\xc5\x7c\xc1\xfa\x1b\xe6\x2b\x37\xd9\x32\x71\x2d\x90\x3f\x07\x19" - "\xcf\xd9\xc8\x97\x20\x2e\x06\x39\x4f\x01\xd2\xc6\x0a\x47\x0c\x8f" - "\x89\xc3\x3d\x0e\x5b\x86\x9b\x26\x95\xa9\xbe\xb1\x8d\x66\x58\x83" - "\xe0\x90\x8d\xbe\x25\xe6\x4d\xc0\xfa\x77\x5b\x49\x0c\xe3\xb1\x51" - "\x8e\x0b\xc0\xaa\xd3\x94\x7c\xc6\xdc\x58\x50\xeb\x08\xe6\x41\x16" - "\xe7\x05\xd7\xef\x2f\x95\xf7\xfa\x3b\xc6\x03\x73\x5f\x41\x74\xf8" - "\x07\xe6\x3a\x47\x31\x8f\x8f\x49\x52\x70\x0e\x4c\x77\x8e\x3a\xcd" - "\xcf\xd7\xf2\xb3\xd7\xdc\x50\xea\xaa\x4e\x43\xfd\xa7\x51\xef\x98" - "\x24\x65\x03\x8c\xb9\xb6\x1b\x75\xf4\x38\xc6\x24\xb9\x29\xf9\x90" - "\x5a\x3b\x6c\x28\x1d\x64\xec\x25\xf2\xd8\x69\xa9\x21\x7d\x4c\xdf" - "\xfc\xef\xbc\x8e\x81\x76\x65\x04\xcc\xdb\x0a\x74\xb9\xc1\x76\xd5" - "\x37\x4e\xd2\xcd\x8d\xad\x79\x92\xbf\x35\xa1\x8d\x29\x7c\x3b\xe8" - "\xd1\x78\x7d\x57\x89\xaf\x9b\x1b\x2f\xfd\x8d\xd9\x85\xdf\x21\xfc" - "\x9c\xfa\x73\x33\x7e\x6e\xdc\xa7\x4a\xba\x75\xe7\xc0\xce\xb9\xb9" - "\x11\x73\x7d\x01\x3f\xbb\x69\xcc\x5e\xd1\x3d\x56\x0b\xea\xf7\xb5" - "\x5f\xb0\x8d\x31\xa6\x1d\xf4\xcf\x51\xfd\xc0\x30\x28\x06\x63\x91" - "\x69\x2e\xec\xd5\xc2\xd7\x54\xe2\x65\x9c\xcd\x4d\xd5\x5e\xb2\x7d" - "\x8b\xdb\x7e\x73\xc2\xb2\x6a\xe1\xf1\x82\xf6\x7c\xe5\xb6\x1d\xa9" - "\xf1\x13\xaf\x31\xf7\x38\x6e\x1e\xeb\xa6\xa7\xab\xa4\xcc\x8f\x3f" - "\x50\xc0\xf0\x44\x9c\xe4\x07\x61\xb4\x5d\xc9\xb3\x86\x52\xee\x47" - "\x3c\xff\x08\xed\xb6\x9c\xa5\x9b\x65\x7f\x1e\x41\xdb\x77\x42\xa6" - "\xb0\xed\x54\x27\xe5\xff\xcd\x90\xff\xb6\x26\x63\x3d\x74\x23\xde" - "\xc1\x6e\xea\x6a\xc9\xf3\x11\xc3\x08\x00\x76\x85\x5c\x13\xda\x5f" - "\xba\xba\x4b\xf8\xde\x2f\xe9\x34\x61\x3e\x46\x7f\x37\x94\x72\x9d" - "\x76\xe8\xc1\xce\xc5\xb2\xde\x34\xc8\x2a\x6f\xd4\xfe\xef\xc7\xed" - "\x96\x77\x8f\x8c\x95\x72\x31\x03\x3a\x56\x76\x78\xbf\xdc\x72\x58" - "\xf5\xc9\x2d\xe6\xf0\x3e\xb9\xe5\x30\x7e\x33\xf1\xcb\xc1\xaf\x50" - "\x7f\x0e\xfd\x4d\x0a\xb9\x5f\xd7\xe3\xb8\x25\x1d\x63\xdf\xad\x68" - "\xcd\x69\xc0\x95\x79\xe0\x0b\x32\xb3\xed\xcd\xfb\x0a\x9c\xce\xfc" - "\xca\xe9\x41\xe8\x25\x78\xce\xc4\xfb\x44\x1e\x8b\x15\x41\x0a\x7b" - "\xef\x5a\x07\x9e\x5a\xd5\xcb\xb8\xbf\x25\xd7\x0b\xd6\x94\x95\x31" - "\x1f\x22\xcf\x7c\x8b\xbf\xac\x0c\xf5\x1d\x32\xe8\x87\xb4\x1a\x7e" - "\x1f\x5d\x3f\xb8\xe5\x78\xbf\x1e\x05\xfd\x92\x65\x4b\x17\x8d\xed" - "\x84\xfc\x41\x5f\xed\x2f\x52\xf3\xc6\xd8\x7f\xf0\x33\xe4\xde\x09" - "\xdc\x77\xb4\x40\xbe\xf4\xae\x7f\xf3\x68\x9f\x46\xc3\x7a\x35\x4a" - "\xf3\xaf\xff\x6b\x82\x3f\xbe\xf6\x98\xab\xf3\x10\xb5\xfa\x0f\x90" - "\xed\x39\x09\xe3\x33\x17\xf3\xf3\x4a\x11\xd8\xdf\xbb\x07\xb6\xd6" - "\x39\x27\xe6\xd9\x9b\x4e\xd3\x58\xd9\xf6\x9f\x9e\xc4\x0c\xfe\x94" - "\x84\xad\xd3\xe2\xb3\xce\x4d\x0b\x85\x7f\xd3\x29\x8c\x8f\x3e\x6b" - "\xfc\xc6\x5e\x4a\xd9\xbe\x8a\x52\x6b\x7a\x69\x6c\x6d\x2f\x25\x8b" - "\xbf\x27\x6b\x35\xd0\xb5\x9e\xba\x90\x48\x18\xdf\x99\xc3\x0b\xc8" - "\x5c\xbb\x8a\x64\x9f\x07\xca\xa1\x73\xf9\xa1\x73\x9d\x4b\x66\x39" - "\xd7\xaf\x73\xf5\xf5\xb1\xce\xb5\xfb\xa8\xe2\x8b\xdd\x47\xaf\xca" - "\xa3\x98\x84\x6c\x4a\x04\x7e\xf6\xb3\x34\xf6\x86\x84\x0e\xe8\x7b" - "\x68\xb3\x5b\x6f\x2f\xae\xa9\x96\x3c\x1a\x26\xdb\x0a\xd9\x2b\xca" - "\xf7\x17\x0d\x3a\xa7\x6a\xcc\x3b\x5e\xde\x03\x42\x1b\xc6\xdd\xc3" - "\xfb\x18\x87\x46\xf9\x4c\xcb\x6a\xc0\x77\x48\x2f\x1c\x23\x7c\x48" - "\x1f\xcd\x75\x37\x20\xbd\xc7\x31\x2e\xdd\xad\xbd\xb6\x6b\x30\x79" - "\x6b\x59\x63\xcc\xfb\xe3\x3e\x14\x5a\x29\xeb\xdb\x89\xab\xfd\xc2" - "\xe3\x3a\xcb\x63\x70\x5c\xd3\x9c\x7c\xe1\xb7\x2d\xe6\x3d\xa5\x71" - "\x87\x78\xbf\x8b\xd7\xb9\xdf\x86\x9e\xf2\x55\x7b\x5c\x2c\xfb\xa1" - "\x8f\xdb\x2c\xf9\x80\x09\x7d\x5f\xd8\x93\x29\x5c\xf7\x8e\xae\x77" - "\xf3\xde\xe8\x66\xb9\x0f\x3b\x0e\xfc\xf3\xb0\xd4\xc3\x58\xdf\x63" - "\x19\x08\xbd\xe9\x9a\x53\xf4\xad\x49\x6c\xd7\xf7\x38\xbe\x35\xda" - "\x4d\xd3\x8c\x7d\x3d\xb9\xbf\x8b\x34\xe8\x7f\xe9\xf9\x9c\x56\x38" - "\x86\xac\x85\x36\xd1\x39\x98\xee\x23\xf7\x5c\x35\xfa\x26\xca\xe4" - "\x18\x70\x30\xdf\xfc\xaa\x5b\x9b\x37\x0f\x69\x45\x06\x1c\xe4\xb9" - "\x16\xcf\x65\xfd\x79\x54\x99\xea\x90\x32\xf3\xba\xb5\xdb\x7e\x85" - "\xb4\xbd\x11\x65\x0e\x47\x94\x69\x0e\x29\x53\xaa\xd7\xe3\x8e\x28" - "\xe3\x09\x2f\xf3\x6d\xba\x14\xb7\x6f\x27\x85\x97\xf9\xf6\xd8\x88" - "\x32\x13\x2f\xc5\xed\xdb\xd3\x23\xca\x64\x46\x94\xc9\x0b\xa1\x25" - "\xef\xad\xa6\x22\xad\x38\xa2\xcc\x86\x88\x32\x35\xc6\xf3\x60\x7b" - "\xdc\xcb\x76\x92\x15\x7c\xd9\xc9\xfd\x09\xbd\xbd\xab\x7b\xeb\xf3" - "\x3d\x7a\xd9\xf6\x28\xed\xea\x8a\xa8\xcf\x1f\x5e\x5f\x72\xc2\xa5" - "\xed\x4a\xb6\x85\x97\x49\x4e\x8d\x28\x93\x16\x52\xa6\x5e\xd5\x93" - "\x3c\x37\xa2\x4c\x4e\x44\x99\xc2\x4b\xf9\x2a\xb9\x2c\xa2\x4c\x75" - "\x44\x99\x3d\x5f\x41\x0b\x9e\x8f\x95\x2f\xc2\x48\xd6\x79\x1f\xc4" - "\x5c\x7f\xeb\xd5\x6c\xcb\x60\x2e\xf1\xfc\xb2\xd7\x37\x84\xe7\x14" - "\x9e\x7f\x8e\x14\xf9\xa0\x2f\x25\xfb\xdc\x74\x47\x81\x31\x07\xf1" - "\x3e\x26\x8f\x67\xa5\x2b\x27\xb7\x0f\xa6\x53\x72\x3d\x86\x6f\x02" - "\xd7\x75\x64\x34\xeb\x5e\xb7\xa6\xf7\xeb\xb6\x6a\xbf\x9e\x14\x9c" - "\x5b\xb7\x31\x1c\xae\xbf\x4e\xed\x8f\xc6\xb0\x6e\x7d\xa4\x48\x96" - "\x29\x0a\xd1\x87\xb9\x7e\xef\xa1\x55\x3e\x53\x38\x1e\xb7\x66\x5e" - "\x06\x8f\x04\xe8\x38\x93\x5a\xa1\x7f\xf0\x3e\x50\x4b\x0d\x74\x19" - "\xe8\xef\x8c\xdb\x49\xba\xd5\x2d\x75\xab\xc5\xbd\xc4\xf7\xae\xe2" - "\xfb\xe4\x3e\x91\xd2\x2d\x6f\xb3\x36\xa1\x7e\xd6\xc1\x9b\x0a\xce" - "\x53\xb7\xd4\xff\x59\x07\xbb\xed\xa1\x23\xc5\x1e\xe0\x75\x5b\xa2" - "\xb1\x6f\xea\xa6\xdb\xd2\xa5\xde\x50\x76\x20\x95\xf7\xb0\x78\xdd" - "\xf7\x88\x77\x12\xe7\x01\xff\xdf\x3a\xda\x68\x2f\x6c\x40\x8c\xa9" - "\x5b\xbb\x2e\x47\x33\xd5\x87\xb7\xe5\x87\xf3\xe4\x10\xf0\xca\x6d" - "\xa5\xe1\xfd\x7e\x5b\x65\x78\xbf\xdf\x56\x1f\xce\x93\x1a\x78\xf2" - "\xb6\x43\x11\x65\x9a\x22\xca\x1c\x0b\x29\x53\xa9\xd7\xd3\x19\x51" - "\xc6\x17\x5e\xe6\x76\x73\xc8\x33\xda\x78\xbb\xb5\xdf\x86\x91\x7b" - "\xf2\xb7\x27\x87\x3c\x6b\x55\x52\x7e\xde\x3e\xd9\x48\xe3\x7d\xb4" - "\xda\x2d\x6a\x4f\x58\x87\x97\x19\x31\xde\x39\x7f\x7e\x38\x0e\xb7" - "\x17\x47\xe0\xd0\x3f\xfe\x2b\x94\x0d\xf6\x87\x53\x94\x92\x23\x79" - "\x08\x63\x04\xf3\xf5\x1c\x7e\x06\xac\x6a\xe4\x07\x1d\x6e\x3f\x1c" - "\x01\xaf\x39\x02\xde\xf1\x90\xe7\x44\x3c\x77\x85\xb4\x21\x31\xd6" - "\x2a\xfd\x62\xa0\x8f\xa5\x98\x8c\x74\xb6\x0d\x81\x6f\xa7\x5d\xce" - "\x33\x69\xec\xeb\x30\xe2\x24\xdd\xfe\x05\xdb\x91\x0a\x66\x4a\xe8" - "\xf8\x27\xd5\xae\x94\xf4\x70\x3c\x52\xe6\x86\xe3\x91\x92\x13\xd2" - "\x2e\xaf\x65\x0d\x3d\x62\xf1\x3f\xfa\x23\xd6\x71\xd8\x87\x46\xfa" - "\x1c\xac\x86\x5e\x76\x81\x12\xd9\xd7\xe3\x54\x21\xc5\xba\x8a\x3a" - "\x61\x93\xed\x6e\x1a\x94\x9f\xe2\x0f\xa4\xe9\xfe\x29\xb0\x37\x53" - "\x9a\x0c\x7e\x0c\xae\x3f\x90\x16\x2c\x7f\x3b\x1f\x69\x90\x7f\xb7" - "\x65\xa8\x35\xf6\x7d\x8d\xc2\x9e\x59\x0d\x7a\xc2\xbe\x19\xff\xa1" - "\x6e\x0f\xcc\x65\x9f\x05\xc8\x9e\x4e\xcc\xef\x09\x6a\x7f\x6b\x7c" - "\x42\x08\x5f\x7b\x6d\xab\xa6\x8a\x93\x34\xfe\x23\x9e\xff\x79\x8c" - "\xb2\xef\xc3\x11\xbf\x87\xd8\x86\x76\xf9\x4f\x4b\x1d\x0d\xef\xdb" - "\xf4\xb2\xd3\x43\xca\x7a\x74\x1b\xb7\x93\xdf\x4d\xf0\x93\xe9\x88" - "\xd7\x43\x80\x93\xa4\xf4\xba\xf1\x1f\x1d\xc1\x78\x45\x99\x62\xa3" - "\x0c\xdb\xc3\x5c\xc6\x52\x48\xa6\x3b\x8a\xc9\xe4\x5c\x75\x52\xc2" - "\xd6\xfb\xbe\x93\xf5\x63\x57\x71\x27\xb9\xbc\xed\xbc\x36\x65\x52" - "\x7b\xc9\xe3\xdb\x62\x7d\x64\xee\x2e\x3f\x80\x3e\x19\xdf\x16\x28" - "\x3f\x30\x09\xb8\xc1\xfe\x4a\x91\x72\x2e\x94\x76\x0f\x3d\x94\xf1" - "\xe8\x9c\x59\xe3\x7f\xf8\xe8\x8c\xb9\x0f\xdd\x67\x9b\xbb\xe8\x85" - "\xdc\x9c\xf1\x4b\x5e\x2a\xb4\xad\x58\xba\xa8\x70\xd1\xe2\x67\x6d" - "\xa9\x45\xe3\x8a\x6c\x0b\x0a\xd5\x35\x39\x7f\xc1\xb2\xc2\x29\x7c" - "\x9b\x62\x2b\x58\x9a\xbb\x5c\xde\xde\x1a\x4f\xe1\x40\x16\x15\xe6" - "\x2e\xb5\x8d\xcb\x49\xb1\x3d\xbc\x60\x51\xfe\x4b\x4b\x73\xa3\xc2" - "\xba\xcf\xb6\x34\x77\x69\xee\x82\x1c\xdb\x14\x5b\x2a\x43\x0e\x05" - "\x17\xd2\x9f\xa9\xc6\x3c\xc6\xf3\x57\x85\x43\xb4\xe9\xf3\x99\x5b" - "\xf1\xcf\x1d\xbb\x2e\x9d\xcb\xee\x68\x0c\xe7\xb9\x3b\x8e\x86\xf3" - "\xdc\x1d\xed\x97\xce\x65\x77\x44\xcc\x7f\x77\x44\xcc\x7f\x13\x12" - "\x2e\x9d\xcb\x26\x44\xcc\x7f\x13\x22\xe6\xbf\x09\xfd\xf3\x1f\x78" - "\xc9\xbd\x56\xca\x85\x09\x11\xf3\xdf\x84\x88\xf9\x6f\x42\x61\xc4" - "\xf3\xba\x90\xe7\x6b\xf0\x5c\x15\x3a\x3f\xe2\x79\x97\x31\x3e\x07" - "\xe4\xcb\x84\x46\x23\x0f\xcb\x7a\xc8\xe6\x0e\x3d\x6f\x5b\x48\xde" - "\x4e\x3d\x6f\x47\xff\xf8\x03\x1f\xb1\x8f\x88\xb2\xbb\x53\x67\xb0" - "\x4c\x67\xff\x10\x9e\x9b\x30\x3e\x6e\x3a\x4b\x13\x3e\x60\x58\xcc" - "\xc3\x72\xfd\x70\xeb\x13\x3d\x75\x23\xc8\xcc\x65\xea\x5e\x23\x93" - "\x70\x8c\x3f\x8e\x2b\x21\x2d\x01\x3f\xc8\x94\xd4\x34\xb7\xb6\xb9" - "\x50\xcd\x17\xa9\x95\x52\xdf\x47\x19\x1d\xfe\xcf\xf8\x19\x70\xac" - "\x28\x63\xae\x50\x73\x71\x07\xee\x13\x98\xa7\x51\xde\x24\xb4\x3b" - "\xc6\xe0\x4a\x48\x4b\xc4\x2f\x09\xf0\x2a\x0d\x78\xbc\x0f\x16\x6d" - "\xfc\x47\xae\x2f\xf7\xdb\x7c\x1a\x59\x2a\x1c\xc1\x76\x57\x90\xf5" - "\xea\xd4\x26\xb5\x46\xf0\x66\xa7\x70\xbc\x9f\x59\x87\xf4\xe8\x36" - "\xd2\x9d\xd0\xff\x52\x1b\xd5\xba\xc9\x9d\xe8\xff\x87\x3b\xd4\xda" - "\xe6\x9b\x6c\x23\xf6\x9e\xa2\x3b\xdf\xc0\xb5\x0f\xd7\x72\x03\xbe" - "\x53\xda\xce\x77\xf2\x9a\xc7\x63\x0c\x37\x22\x7d\x32\xe4\x5b\xaf" - "\xc5\x5f\x9a\x19\xe5\x5d\xa6\x70\xc4\x3e\x1a\x25\x9d\x6d\xe9\x5e" - "\x37\xdd\xb9\x8b\xf1\x0d\x49\x2f\x13\x8e\xe1\x73\x39\xbf\x9b\xeb" - "\x43\x99\xc1\x74\x6d\xc3\x1f\x4c\xf9\x5d\xde\x79\x2c\xa2\x1d\x5f" - "\x9e\xa2\xbb\x1e\x51\xed\xb8\x6b\x5f\x44\xdd\x5d\xd1\xdb\x71\x97" - "\x09\xed\xf8\x32\x7a\x3b\xee\xb2\x49\xda\x6a\x68\x8b\x76\xc9\xbb" - "\xc9\x68\xcb\x97\x92\xee\xe1\xe9\x73\x75\x5d\xc8\x0b\x1b\x2c\x11" - "\xef\x64\xd9\xc7\x8a\x07\xfa\x4d\xcf\x57\x6c\xa9\xa6\x8c\x28\x75" - "\x56\x09\xc7\xb0\xc7\xdc\x74\x57\xb3\x84\x33\x90\xbe\x57\xe1\x02" - "\x3a\x69\x92\x4e\x5d\x5c\x6e\xb0\xfe\x36\xec\x12\xb5\xae\x71\x17" - "\x78\xf6\xce\x06\x63\x4d\x72\x59\xb1\xf0\x18\x74\xec\x71\xdc\x6d" - "\x8d\x78\xe7\x0b\x79\x37\x31\xec\xdd\xea\xfe\xf4\x99\x46\xfa\xd7" - "\xeb\xa7\xbb\x8b\x23\xfa\x09\xfd\x33\xf1\xaa\xf0\x76\xdf\xbd\x41" - "\xb5\x0f\x7d\x74\x09\xad\xef\xde\x83\x3e\xea\x8b\xde\x47\x77\x37" - "\x45\xe7\xb5\xbb\x8f\x4b\x78\x23\x28\x1a\x3c\x1f\xfa\xae\x4f\xf2" - "\xa0\xde\x4f\x97\xf6\xcf\xc4\xd1\x46\xff\x7c\xbd\x36\x4e\xcc\x8e" - "\x68\x63\x00\x30\x3e\x53\x6d\xbd\x67\x7c\x04\xec\xa2\xe8\xbc\x38" - "\xb1\x12\xed\x0c\x44\x6f\xe7\xc4\xbd\x83\xf3\xe2\xc4\xa3\x68\x4f" - "\xe0\x52\x5e\x44\xf7\xc9\x32\x14\xad\x8c\x5f\x38\xa2\xd5\x73\x4f" - "\x92\xdd\xcf\x7a\xee\x3d\x33\x79\x0d\x29\x24\x3d\x25\x9c\xff\xd0" - "\x06\x2e\xc7\xf4\xf3\x2b\x39\xcb\xfd\x70\xca\x46\xda\x57\xf1\x64" - "\x8f\xe3\x9e\x0d\x11\xb4\x3a\x77\x8a\xbe\x73\x55\xb7\x16\xb3\x4b" - "\xd1\xeb\x3b\x1f\x45\xe0\xb4\x27\x3a\xbd\xee\x71\x82\x5e\xe7\xa2" - "\xd3\xeb\x9e\xe3\x83\xd3\xeb\x1e\xee\xff\x73\x97\xd2\xeb\x3b\x89" - "\xa1\xf4\x82\xae\x2b\xdb\x77\x8b\x15\xbc\xd1\x97\x25\x78\x0d\x0e" - "\x34\x49\xb4\x80\x57\x54\x99\x2e\x2e\x93\x6e\xf1\x29\x3e\x81\x0e" - "\x69\x3e\x4b\xdf\x49\x31\xc6\xff\xf0\x6a\x1a\x26\xfa\x9e\x10\x80" - "\x17\xc3\xe5\x5c\x45\xe7\x9c\x2e\x7f\x2a\xb1\xfd\x11\x51\x6f\x59" - "\x74\x59\xf0\x9d\x7a\xd0\xf4\xb5\x28\xe9\x8d\xca\x27\xe4\x3b\x9e" - "\x70\x19\xf1\x9d\xb6\xf0\x3e\x02\xdd\x50\x8e\x06\x7c\xda\x2f\xfb" - "\xbb\x7c\x9f\x7d\x37\xed\xd2\x3e\xfb\xee\x09\xd5\x5f\xdf\xfd\x20" - "\x1c\xbf\xef\x66\x46\xef\xaf\xef\x16\x0c\xde\x5f\xdf\xdd\x30\x78" - "\x7f\x7d\x77\x0f\xf7\x97\x9b\xbe\xeb\x0e\x9f\x37\xbe\xeb\x0c\x6f" - "\x2f\xea\x45\x39\xa1\x0d\xbd\x86\x9f\xbf\x6e\xbb\x8d\x1f\xcb\x38" - "\xee\xab\xba\x12\x02\x2f\xc7\x8c\x61\x1c\xaf\x14\xc6\xa0\xb0\x41" - "\xc3\xca\x55\xd1\xf7\x47\xd9\xc6\x6d\xad\x26\xde\x0b\x27\xdb\x8d" - "\xac\xbb\x4f\xfa\x4d\x50\xa3\x76\xdc\x6b\xa7\xe8\xbe\x35\x41\x4d" - "\x2b\x66\x3f\x4b\xe9\x5f\x29\xd7\x10\x26\x35\x87\xf6\x05\xfb\xe2" - "\xb0\x6d\xba\x49\xd9\x4e\x7f\x3b\x45\xf7\xce\x53\xfd\x72\xdf\x82" - "\x70\x3a\x4e\xf2\x44\xef\x97\x7b\xcd\xe8\x97\xbf\x45\xef\x97\x7b" - "\xc7\x0e\xde\x2f\xf7\xa6\xa1\x5f\xfe\x76\xe9\x38\xba\x37\x53\x1f" - "\x47\x6b\xb9\x8c\x6d\x31\xdb\xe3\xf7\xfe\x91\xf3\xe0\x1e\x63\xe4" - "\xde\x77\xf8\xfd\xf8\x2e\x63\x1c\xc9\x32\x1b\x00\x4b\xd6\xaf\xe7" - "\x29\xd3\x61\x84\xc2\x6d\xb0\x74\x45\x1b\x27\xf7\x1e\xe5\xbc\x77" - "\x14\x90\x19\x34\xcc\xdc\xc9\x30\x96\x12\x9d\xa5\xfb\x6e\xe0\x7c" - "\x9c\x7e\x87\x37\x74\x9c\xdc\xeb\x33\xf2\xb1\xac\x53\x79\xef\xf5" - "\x88\x9e\x3c\xe2\x7c\xe1\xb0\xef\xd3\xdb\x3f\x4c\xce\x23\x9c\x9f" - "\xf3\x45\xe4\x99\xae\xc6\xe3\x7d\x1b\xc2\xc7\xe3\x7d\xd9\xe1\xfc" - "\x09\xfa\xa3\x5c\x10\x72\x0e\xf7\x87\x80\xc3\xd7\xe6\xaf\xcb\x8f" - "\xcd\xfb\x8e\x47\x8c\x4d\xf0\xc0\xf7\x56\x2b\x1e\xf8\xde\x93\x11" - "\xb8\x7a\xa3\xf3\xc0\xf7\x12\x06\xe7\x81\xef\x25\x0f\xce\x03\xdf" - "\x4b\x67\x1e\x70\xd3\xf7\x8a\xc3\xc7\xe6\xf7\xe6\x87\xb7\xfd\x3e" - "\xaf\x1a\x9b\x74\xf5\x95\x8c\x4d\xe8\x42\xd7\x0c\x36\x0e\x79\x4c" - "\xa1\xee\x98\xba\x5e\x63\x3f\xe3\x6b\xd1\xcc\x8c\x71\x05\xfc\x26" - "\x27\xf2\x9a\x12\x64\xfc\x24\xa6\x61\xad\x3c\x6b\x33\x79\x6c\x28" - "\x1d\x37\xa9\x73\x2f\x76\xe4\x7d\x8b\xf7\x87\x15\x3d\xa7\xbc\x18" - "\xde\xfe\xc9\xe9\xd1\xe9\x39\x79\x3e\xe8\x69\x8f\x4e\xcf\xc9\x45" - "\x83\xd3\x73\x72\x15\xfb\xec\x5f\x3a\xa6\x26\xef\xb5\x2d\x97\x3a" - "\x8a\x2c\x73\x96\xa6\x0c\xf9\x7a\xf3\xd3\xe4\x8e\xf0\xf9\x69\x72" - "\xf3\x95\xcf\x4f\x53\x92\xa3\xcf\x4f\x53\xd2\xa2\xcf\x4f\x53\x32" - "\xd5\x78\x98\x52\x19\x3e\x1e\xa6\x14\x84\xf3\x04\x68\xf7\x3f\x36" - "\x3f\x4d\x71\x47\x8c\x81\x8a\x53\x74\xff\x02\xe8\x14\xa5\xaa\xdf" - "\xa6\x8e\x8b\xc0\xd1\x1f\xbd\xdf\xee\x4f\x42\xbf\x55\x44\xef\xb7" - "\xfb\x53\x07\xef\xb7\xfb\x67\xa2\xdf\x2a\x2e\xed\xb7\xfb\x73\xae" - "\x5c\xa7\xb8\xbf\x3a\xbc\xcf\xee\x2f\xbd\xf2\x3e\xbb\xff\x78\xf4" - "\x3e\xbb\xdf\x1b\xbd\xcf\xa6\x26\xa8\x3e\x9b\x9a\x1e\xde\x67\x53" - "\xc7\x86\xf7\xd9\x14\xff\x3f\xdb\x67\xe8\x9f\x2e\xe5\x67\x30\xf5" - "\x0d\xd8\xed\xc3\x7a\x1c\x53\x6b\xdc\x94\xa6\xef\xe1\xa6\xa9\xb9" - "\x43\xf5\xe1\x7e\xe4\xa9\xbc\x74\x1e\x98\xda\xa8\xa7\xfd\xf0\xd2" - "\x7e\x98\x7a\x0c\x32\xba\xab\xa9\x58\xee\x6b\xa9\x3e\x64\x9a\x23" - "\x9f\x73\x15\xef\x4d\x4d\xf5\x72\x59\xf4\xb1\x70\xf9\xfc\xc4\x72" - "\x1d\xf9\xbd\x0c\x87\xcf\x2a\x85\xc3\x4a\xb3\x5d\xc9\x1c\x3f\xb8" - "\x6f\xcc\x9b\x5d\xce\x92\xbb\x00\xef\x81\x7b\x14\xaf\xa6\x45\xea" - "\xbf\x75\x78\x17\xa7\xf8\xf4\xc1\xbf\x44\xe0\xb0\x2b\x3a\x9f\xa6" - "\x1d\x46\x1b\xea\xa2\xf3\x69\x5a\xfb\xe0\x7c\x9a\xc6\x32\xb3\x2e" - "\xc4\xf6\x19\xf1\x94\xdf\x1d\x61\xfb\x3c\x60\xb5\x78\x15\xef\x48" - "\x9d\xa8\xfc\x4d\xe8\x1c\x0f\x44\xea\x7f\xe8\x9b\x07\xde\xd5\x71" - "\xfe\x4d\x44\xf9\x41\xf4\xbf\x07\x58\xff\xdb\x1f\x1d\xe7\x07\x2e" - "\xa3\xff\x3d\xc0\xfa\xdf\xfe\x4b\xc7\xd6\x03\xba\xfe\x17\xcd\xc6" - "\x7b\xe0\x78\xf4\xfe\x7f\x20\xa2\xff\x29\xb3\x10\xf6\xb0\x2c\x1f" - "\x96\xef\xc1\xd1\xa1\xf9\xd8\xc7\x88\xf3\x32\x8f\x44\xc9\x3b\x3d" - "\x12\xe6\x20\xf9\x0a\x2e\xe1\x3d\xf6\x89\x8a\xca\x7b\x0f\xd6\xa8" - "\xf1\xf8\xa0\x37\x7c\x3c\x3e\x78\x28\x7c\x3c\x3e\x90\x19\x51\xee" - "\x58\xf8\x7b\xf0\xcf\xff\x98\x8c\x9d\x96\x1e\xc1\x03\xef\x9f\xa2" - "\x69\x1f\x28\x1e\x48\xbf\x2e\x1c\x8f\x69\xf3\xa3\xf3\xc0\xb4\x42" - "\xb4\xff\xfd\xe8\x3c\x30\xad\x72\x70\x1e\x98\xb6\x17\xb4\x7c\x3f" - "\x94\x6f\x1f\x2b\x4e\x1b\x16\x91\xa7\x2d\xba\xcc\x9b\xd6\x19\x7d" - "\x8d\x20\x9d\x14\x8d\xd3\x27\x85\xd3\x38\xdd\x1a\x4e\x43\xb4\xe5" - "\x9f\xa7\x61\xff\x59\xdf\x1e\x47\x7a\xe4\xf8\x77\x9d\xa2\x87\xf4" - "\xf1\xff\x70\x84\xac\x4b\xdf\xa5\x70\x89\xb6\x2e\x92\xce\xf6\xaf" - "\x2b\x3a\x2d\xd3\x8f\x0f\xd2\x66\xf6\x69\x73\x05\x2f\x19\x4b\x0f" - "\x25\x20\xfd\x31\x5e\x0f\xe5\xf5\x90\x5a\xa4\x3f\xe6\x27\xb3\x9c" - "\xaf\xfa\xe7\xa5\x87\xf8\xec\xa5\x60\xfa\x33\xff\x5a\x46\x53\x06" - "\xcf\x41\x8c\x57\x56\xb1\xf4\x59\xb0\xac\x63\x5e\xbf\x99\x79\xfd" - "\x21\xa9\xff\xf1\x3e\x0b\xfb\x03\x5a\x8a\x28\xc3\xe5\xf5\x93\xc1" - "\xef\x9c\x3f\x02\xf6\x06\x1e\x17\x9c\xdf\xc8\xab\xd6\xcd\x4a\x23" - "\x64\xd3\x43\x87\xa2\xf7\xf1\x43\xcd\x83\xf3\xce\x43\x9d\xaa\x9f" - "\x1f\x1e\x1d\xde\xcf\x0f\x43\xff\x1b\x3e\x97\xdb\x0a\x1e\xb8\xa2" - "\x71\x52\x68\x13\x9e\x41\xe5\xfd\xda\x27\xda\x0b\x4a\xe8\xc6\xd3" - "\xf4\xf0\x3a\x59\x9f\x26\x7c\x96\x35\x31\xd4\x24\x65\xc0\xc3\x9f" - "\x48\x3c\x91\x27\xcb\x4f\x9a\x58\xfb\x7c\x3b\xbf\xab\x73\x08\x1f" - "\xf2\xb5\xf1\x9e\x00\x9f\xf5\x03\x2f\x5c\x73\x92\x1e\xde\x19\x56" - "\xde\x44\xe4\x52\x30\xda\xeb\xe4\x78\x7c\xf8\x98\xb1\xa6\xbb\x6e" - "\x10\xff\x20\xe4\xf1\x19\xbe\x0f\xca\xf7\xeb\xe1\x41\xf7\x2f\x19" - "\x27\xf6\x8f\x67\x9c\x2e\x2f\x07\xbe\x3f\xd3\xe0\x5f\xe5\x33\xf9" - "\xfd\xf9\x03\x3e\x79\xdf\xcf\x73\xd3\xf7\x07\x3d\xcf\x11\x3e\x0e" - "\xbe\x5f\x15\x0a\x47\x9d\x77\xff\xfe\x1e\xc3\xaf\x0e\xf7\x87\xbe" - "\x02\x96\x81\xcf\xf1\x08\x7c\xba\xa0\xa7\x34\xe9\x30\x7c\x97\x83" - "\xc1\x7d\xae\x78\x96\xf9\x61\x7a\xe2\xe5\xd6\xfc\x62\xad\x94\xb1" - "\xf9\x12\xde\x9a\x2e\xf5\x25\x86\x71\x79\x1c\xa7\x97\x86\xd9\x16" - "\x72\xef\x9e\xf7\xb6\x66\xcc\x52\xe3\x7e\x46\xc4\x1a\xe1\xf4\x1a" - "\xe9\x37\xa5\x8f\xfb\xa7\xfc\x91\xe3\x60\xfa\x61\x63\x8e\x8e\x48" - "\x3f\x66\x8c\x7b\xd8\xb5\x0c\x37\x62\x9d\x75\xba\x57\x8d\x85\x19" - "\x33\x83\x71\xa1\xf6\xda\x0c\xa9\xff\x19\xeb\xa5\x6e\xe4\x0b\x2f" - "\x37\x23\x62\xfd\x6f\x7a\x8d\x18\x7c\x9d\x3e\x01\xfd\xeb\xe5\xbd" - "\x2d\x75\x76\x78\x46\x71\xc4\x7a\x85\x67\x93\x3c\x27\xfa\x29\xe0" - "\xfe\x40\x97\x7b\x3f\xf8\x22\xa2\xbe\x1a\xfb\x99\xcb\xb5\x7f\xc6" - "\x20\xed\x9f\x31\xd0\xfe\xc5\x12\x6e\xc4\x5a\xe2\x0c\xd9\xfe\xc0" - "\x25\xf2\xef\x07\x09\x90\x5f\x06\xdd\xa0\x73\xff\x20\xd7\xd0\xd5" - "\x79\xfd\x60\x70\x5d\xfd\x07\x03\xeb\x7f\xaa\xdc\xc0\xfa\x9f\x27" - "\x9a\xae\xee\x26\xb9\xb7\x1a\x5e\x77\x99\xa5\x26\x5a\x5b\x7e\x30" - "\xc8\xfa\xdf\x0f\xf4\xf5\xbf\x7f\x4b\x0c\x97\x67\x3f\x68\x0b\xef" - "\xc3\x19\x11\x7d\xf8\x03\x4f\x78\x1f\xce\xa8\xf9\xef\xce\x6b\x3c" - "\x71\xc6\xc6\xc6\x6a\xb1\x31\x5a\x4c\x2c\x5e\xa3\x89\x34\x2c\xd6" - "\x14\x3b\x04\xbf\xa1\xfa\x75\x98\x16\xab\x99\xf0\x1b\xa2\x5f\x87" - "\x46\x3c\x0f\xe3\xb2\xf8\x99\xf4\xeb\x90\x88\xe7\xa1\x5f\xf1\x7e" - "\x98\x5e\xaf\x51\xbf\x29\xe2\x79\xc8\x57\xbc\x1f\xfa\x4f\x96\xa7" - "\x4b\x9e\xc3\xfd\xd0\x66\x2c\x5e\xbe\x20\x7f\x51\x8e\xdc\x2f\xce" - "\xb5\x2d\x78\xe6\x99\xdc\x65\xcb\x6c\x85\x4b\x6c\x0f\x3e\xf0\xe8" - "\x5d\xf7\xd9\xd4\xb6\x73\xfe\x94\x71\x39\xf1\x34\x6b\xc5\x52\x7e" - "\x31\xeb\xb1\x19\x99\xb6\x8c\x07\x1f\x08\x7f\x69\x80\x91\xdb\xcb" - "\x97\x83\x12\x32\xfe\xd2\xca\x47\x12\x6d\x18\x29\x65\x4f\x47\x4b" - "\x3d\x91\x5a\xf3\x78\x64\x41\x33\xb4\x09\xd1\x6b\x17\xce\x9b\x79" - "\x4f\x7f\x96\xf4\x11\x1e\x5f\x5f\x4a\x05\x0b\xf9\xbc\xc9\xac\x3b" - "\xc5\x7b\x1e\xb2\xfd\x80\xb4\x93\xf4\xf8\x8b\x4d\xd0\x6a\xf9\xd9" - "\xd5\xe1\x27\x9b\x9d\xcc\x28\x7f\x35\xde\xc5\x88\xfb\x83\x48\xf3" - "\xea\x3e\xcd\x19\x63\x64\xda\x7b\xa5\x46\x3e\xcb\x29\x9a\xf5\x17" - "\xf1\x9e\x90\xcf\xe2\xfe\x4a\x3d\xdf\xac\xb7\x82\x8e\x99\x79\x2c" - "\x1b\x6a\x5e\x23\x53\xed\x6b\x44\xdb\x46\x90\x79\xdb\x48\x3e\x43" - "\x3f\xab\xc6\xd8\x0b\x2d\xc7\xb3\x9b\x1e\x2f\xe0\xba\x39\x6f\x50" - "\x9b\xf9\x9a\xcc\x3f\x22\x2c\x7f\xf3\xc0\x5e\xec\xac\x1a\x0d\xf9" - "\xe6\x7c\x4e\x16\x5f\x7c\xed\x51\x57\x71\x29\x59\x02\xe2\x8b\x3b" - "\xa6\x53\x4c\x2b\x66\xdf\x95\x7e\xe1\x77\x2e\x3d\x8d\xfa\x67\x5f" - "\x67\x59\x29\xbe\x70\x61\xf4\xcf\xea\xb2\x8b\x4d\x67\xc8\x84\x71" - "\x1d\xe3\x5c\xca\x7e\x0a\xb3\xa9\xf6\x4b\x32\x81\x06\xa3\x4f\xd3" - "\x9c\xd4\xe2\x59\x22\x60\x9f\x45\xa6\xff\x2c\x62\x7f\xc3\xdd\x0b" - "\x37\xfd\x99\x4c\xbf\xee\x2d\xd5\x7a\x85\x95\x8a\x0b\x05\xe4\x86" - "\x20\xbb\x57\xf8\xd8\x5f\xbf\x39\x3b\xc0\x79\x1e\xef\xb1\x5b\xa9" - "\xb5\xd0\x4b\xab\x8f\x0b\x5f\xd9\x9f\x95\x9f\x7f\x4b\x97\x97\xfd" - "\x17\xcd\xab\x67\x51\xec\xa9\x4c\xd2\x5a\xf2\xaa\xc9\x35\xdf\x4b" - "\xc5\xc7\x45\x67\x73\xf6\xe7\xd4\x9a\xd7\x40\x59\xed\xa4\x35\x77" - "\x7c\x46\x32\x3e\xc4\xfa\xbf\xb2\xdf\xa3\x75\xf5\x22\x4e\xbb\x40" - "\xab\x56\xd3\x55\xab\xfe\x42\x16\x57\x67\x3b\xea\x39\x43\x3f\x3e" - "\x46\x31\x80\xa7\xbd\xfc\x19\x59\x5f\xfe\x11\xfb\xf3\xa6\x51\x4d" - "\x09\x59\x85\x3d\x39\xa1\xd7\x9e\x9c\xd8\x2b\x92\x47\xf4\xd8\x93" - "\x93\x5a\x0b\x90\xbf\xe3\x5d\x1a\xde\x4e\x49\xef\x9d\x6e\xd7\xaa" - "\xcf\xd3\x68\xdb\x6c\xee\xff\x39\x29\x35\xe7\x91\x7f\xfd\xc1\xd2" - "\x20\xca\x86\x96\xf1\xc7\x1d\xac\x76\x65\xfa\x28\x08\x58\xd5\xbd" - "\x34\xba\xa6\x97\xac\xc1\xf2\x83\xa5\x4c\x8b\xbe\xf5\x6f\x1e\x85" - "\x2c\x1c\xb6\xff\xe9\x46\x93\xab\xb9\x8b\x5a\xbc\xbd\xd4\x4a\x9f" - "\x92\xab\xe8\xef\xce\x5f\x3f\xdd\x38\x24\x08\xe6\x77\xae\xea\x00" - "\x7c\xc5\x33\xf6\x16\x3e\x97\x58\x4a\x15\x25\x94\x50\xb0\x8a\x86" - "\x9d\x46\xba\xb2\xe9\xb7\x41\xb7\xf9\xbb\x73\x95\xf4\xc1\x7d\xbc" - "\xa0\xa4\x85\x62\x5b\xbd\xd5\xdc\x66\x2d\x10\xff\x57\x72\x79\xdb" - "\xc8\x55\xf0\x37\x67\xd0\xfc\x59\xe7\x86\x20\x99\xf7\x5d\x6c\xd3" - "\x5c\xa6\x8b\xe4\xca\xf4\xd2\xfb\xa8\x5b\xac\xff\x6b\x02\xe4\x55" - "\x5a\xab\xd7\xc7\xe7\x92\x52\x45\xb7\x35\xbe\x62\x29\xa5\xd4\x9e" - "\xa7\xb1\x3b\xcf\x53\xb2\xe8\x49\xd6\xd8\xaf\xf6\xc9\x33\x89\xb4" - "\x13\xd7\x84\x0e\x32\xa3\xbd\xca\xa7\x3a\x4e\xf7\xaf\xed\x4b\xa6" - "\xba\xde\x01\xff\xda\xde\xee\x01\xff\x5a\xf0\x52\x3d\xfb\xd8\x62" - "\x5c\x64\x32\x3f\x57\x9c\x25\xd3\xda\xb3\x44\x77\x94\x6a\x64\x7b" - "\x9a\xcf\x47\x3c\x32\xc4\x95\x73\x46\xde\x9f\xa4\x8c\xc3\xb8\x26" - "\xe0\x17\x83\x31\x20\xd7\xb3\x3b\x74\xbe\x45\x9a\x86\xb4\x37\x70" - "\x8d\xc5\x75\xa7\xbd\x46\x78\x44\xd9\x9e\xd1\xdd\x1a\xc5\x33\xff" - "\x2a\x5f\xde\x3d\xa3\x7b\x1c\x19\xd0\x7f\x72\x93\x0c\x3e\x56\x32" - "\x7d\x56\xfd\xfb\xa7\xce\x70\xbc\x16\x8f\xc4\xa7\x2f\x2f\x86\x63" - "\xb7\xe8\xe9\xc0\x21\x23\xc0\xf5\xa2\x7e\x37\xae\x16\xfc\x30\x2e" - "\x33\x0a\x8d\xb2\xdd\x7d\x79\x5c\xe7\x05\xa4\x0b\x23\x1d\xed\x35" - "\xf1\xbb\x83\xa7\xce\x68\x2a\x4f\xb2\x06\x98\x3e\x1d\x3e\xc6\xfa" - "\xac\x74\x1e\xd3\xdd\x9a\x45\x1c\xc9\x99\x48\x35\x23\x45\xdb\xce" - "\x2d\xa2\x49\x8d\xb5\x47\x26\xb9\x69\xa1\x8d\x71\xc4\xbc\xdd\xb4" - "\x01\xef\x8e\xd8\x88\x98\x2e\x4d\xd9\xec\x3f\xf6\x48\xa6\x9b\xe2" - "\x8f\x87\xb6\x41\x38\xfe\x6d\x3a\xcf\x9d\x6f\x97\x38\x87\x08\x6d" - "\xe6\xf4\x56\x77\x17\xfd\xba\xb7\x73\x88\xfd\x8f\xa4\xb9\xfc\x27" - "\x69\x42\x12\x59\x59\xff\xab\xdb\x22\xdc\xb8\x76\xb2\x3f\x27\xf8" - "\xe4\x86\xd3\xf4\xc8\x1b\xb7\x27\x51\xd2\x9f\x8a\x48\x97\x47\x8f" - "\xbc\x1b\x22\x8f\x1e\x6a\xe9\x68\x0c\x91\x45\xf3\x2e\x5c\x2a\x8b" - "\xe6\x7e\xa1\x64\x91\xf0\x2b\xd9\x13\x70\xeb\xe9\x9f\x45\xa4\xeb" - "\x7e\x21\x73\x3f\x88\x48\xf7\xe9\xe9\xfb\x22\xd2\x3d\x2a\xfd\xb1" - "\x33\x86\xac\x6b\x65\x3c\x56\xb0\xac\x7b\xec\x23\x96\x75\xad\x39" - "\xba\xac\x93\x3e\x86\x8f\xfd\x46\xfc\xa2\x94\xf8\xec\x11\xee\x37" - "\x32\xfe\xe2\x3d\x32\x70\x8f\x43\xda\x2c\x4e\xab\xfc\x94\x4c\xf8" - "\x49\x39\x27\x1c\x33\xf7\xb3\x9c\x63\x19\xc7\x7e\x27\x3b\x46\x8a" - "\xf6\x1d\x5b\xc4\xb1\x9a\x2d\xa2\xb9\xc7\xf1\xe8\x61\x43\xde\xfd" - "\x14\x69\x1b\x90\xf6\x53\xbc\x67\xb9\xc7\x34\x69\xc9\x6c\xe4\x73" - "\xfa\x1d\xe0\xe3\x1c\x4b\x0c\x15\x6c\x02\xcf\xf3\x79\xc0\x75\xa0" - "\xaf\x0b\x32\x89\xcf\x72\xc9\x38\x27\x5a\x2a\x64\x54\x07\x8f\xb7" - "\x91\x6b\x31\xbe\x5c\x45\x9f\x53\x89\x57\x9c\xe6\x73\x71\x8c\x43" - "\xd6\xca\x1f\x70\x1c\x8f\x98\xa6\x3c\x22\xf6\x01\x67\x7f\x15\xc8" - "\x5d\x53\x25\x70\x3a\x92\xcf\x7d\xfd\x18\xec\xff\x6d\xfa\x79\xa4" - "\xc7\x0b\x38\x2e\xd0\x49\x7a\xb4\x0c\xf6\x9d\x8f\xdb\x66\x09\x94" - "\x12\x9f\x5f\xc1\x18\x65\x1b\x2f\x6f\x07\x7e\x95\xc6\x19\x16\x8e" - "\xed\x84\x3c\xae\x76\x1f\x31\xce\x6e\x7a\xf4\x58\x4b\x71\x23\x97" - "\x2f\x62\xda\x08\x87\xdd\x80\x11\x23\xcf\xc0\x38\xc8\xcc\x67\x60" - "\xdc\xf4\x58\x9e\x2c\x1f\xff\xe6\xd1\x96\xf9\x1e\x62\x39\xef\xea" - "\x04\x8c\xe2\x93\x0a\x06\x60\x09\xc8\xfd\xb0\x77\x3a\xfc\xab\x56" - "\x8b\x2f\x00\x3f\x9d\xfb\x8b\xcf\x2d\xf2\xfe\x1a\xe8\x92\xc0\x7e" - "\xf1\x4a\xf7\x7c\xb4\xa5\xee\x53\x22\xfd\xec\x25\xf8\xed\xd1\x66" - "\x3e\x6f\xc4\xe7\x2d\xe5\x59\x4b\x6d\x22\x89\x15\xc9\x09\xfd\xe7" - "\x2d\xff\x7f\x38\x6b\x09\xfa\x5b\x6b\x35\xd1\x00\xfc\x9b\xf9\xbc" - "\x25\xf0\x4f\x61\x3e\xd4\xdb\xd4\xf6\xf3\x1f\x4b\x9a\x27\x71\x1a" - "\x6c\xc5\xa3\x46\xff\x73\x7b\xb9\x2d\x27\xe9\x11\x9f\xd2\x09\x45" - "\x9b\x9b\xe6\xb6\xf1\x7b\xa4\x75\x70\xfe\x09\x90\x63\xae\x9c\x00" - "\xed\x3f\x15\xd0\x2a\x56\x91\x49\xc9\xb4\x79\xff\xe0\xf2\x4a\xa6" - "\xcd\xab\x1f\x90\x69\xf3\x7e\xae\x64\x9a\xa2\xb1\x92\x69\xf3\xca" - "\x95\x4c\x9b\xb7\x46\xee\x83\x41\xa6\xf1\x3b\x96\x6b\x86\x4c\xdb" - "\x39\x52\x1c\x65\xd9\xd1\xe3\x98\x57\x60\xc8\xb6\x8d\x48\x63\xd9" - "\xc1\x38\x2a\x39\xf5\xd8\x51\xf1\xbf\x92\x49\xf9\x19\xf0\x7d\x1e" - "\x9f\x55\xe8\xd4\xef\xd1\x2f\xf3\x4e\x28\x19\x37\xaf\x69\x40\xc6" - "\xcd\x9b\x3e\x50\x96\x65\xdc\xbc\x4f\x94\x8c\x53\xe9\x75\x3f\x66" - "\x19\xf7\xd8\x51\xa6\x81\x0e\x5f\xe3\x35\x3b\x3d\x3f\xe8\xf8\x48" - "\x5b\xa8\x8c\x0b\x1f\x5f\x8f\x8f\x36\x64\x1c\xcb\x36\x3c\xa7\x40" - "\xa6\x49\xdf\x60\x1e\x67\x55\xa0\xb9\x31\xee\xb8\x0f\xb8\xcd\x1c" - "\xff\x87\xe9\x36\xed\x0c\x0d\xd3\xcf\xfd\xe8\xed\x7e\x3c\xcf\xf0" - "\x75\x74\xd3\xbc\x82\x68\x7a\xb3\xa1\xa7\x81\x1f\x6f\x0a\x60\xbc" - "\xb9\x4a\x31\x97\x56\x8b\xd2\x56\xff\x31\x7a\xaa\x90\xb4\x60\xec" - "\xf3\x27\xb8\x6f\x61\x67\x0c\xe5\x2b\xcb\x1e\xcc\xa1\xfb\xb2\xbc" - "\x34\x14\xb6\xf9\x89\x0a\x0d\xef\x8a\xe8\x7b\x21\xef\xfe\xc8\xf5" - "\x84\x94\x1b\x1f\xf2\xee\x73\xa9\xe3\x9d\xe5\xd8\x4f\x8f\x57\x0e" - "\x66\xfb\x5f\x19\x2e\x3f\xbc\x77\x70\x5c\x7e\x38\x6f\x70\x5c\x7e" - "\x28\xf5\x80\xf1\x5d\x14\x03\xdb\xec\xea\xb3\xf4\x43\xb9\x1e\x23" - "\x63\x57\xac\x8d\x5a\xcf\xeb\xfa\xfb\x21\x21\xef\x43\xeb\xfa\x20" - "\x4a\xf9\xd0\xfa\x4e\x5c\x1e\x7e\x66\xcc\xe5\xe1\x67\x8e\xb9\x3c" - "\xfc\xcc\x07\x58\x06\x82\x76\x96\xa0\x16\x9e\xef\x0e\xbf\x1c\x83" - "\x47\xf9\xdc\x1d\xf2\x2d\xd2\xd7\x7c\x4e\xd8\xc7\x48\x5b\x50\x9e" - "\xcd\xda\x84\xf7\x7c\x96\x9c\xe5\x73\xfa\x4a\x22\xb5\x47\xdd\x5f" - "\x66\x67\x24\x6e\xc3\xfd\x06\x6e\xf2\xfd\xbb\x91\xb8\xe1\xfd\xf8" - "\x90\xf7\x9f\x0d\xf4\x7b\xe6\x65\xfd\xeb\x5d\xd5\x44\x1c\x43\xef" - "\x08\xcc\x17\xcc\xc9\x1c\x8f\x4b\x5f\x9f\xf9\xd1\x44\xc8\xf9\xd2" - "\x10\xbf\x5d\xf6\x39\xbb\xa9\xd5\xcb\xe7\x54\xbd\x32\x56\x0a\xda" - "\xf2\x4d\xcc\x27\x23\xf8\xac\x0e\x9f\xdb\xc9\x0a\x64\x68\x2a\x26" - "\xce\x8f\x0a\x8c\xb2\x83\xad\x03\x71\xbd\x7a\x9d\xec\x03\xeb\x45" - "\x99\x5d\x46\x19\x86\xcd\x7e\x94\x98\x07\x6e\x92\x67\x57\xfd\x5d" - "\x2c\x77\xbf\x09\x3d\x79\x84\xaa\x27\x9b\xf4\x7a\x60\xc7\xfe\x30" - "\xe1\x72\x67\x47\x06\x6f\xdf\x8f\x93\xae\xbc\x7d\xa4\xb7\xef\xc7" - "\x19\x5f\xd1\xbe\xcb\xd5\xbb\xe1\xca\xeb\x4d\x34\xea\x3d\x7a\xe5" - "\x74\xfd\xb1\xff\xeb\xd3\x35\x55\xa7\xeb\x13\xa9\x5f\x41\xd7\x28" - "\xf5\x3c\x91\xf3\xf5\xeb\xb1\x19\xf5\x54\x47\xab\x87\xe4\xdf\xa0" - "\xe7\xba\xcc\x46\x6c\x3a\x8e\x0b\xa9\x62\x52\x3d\xe1\x0e\x8d\x9d" - "\xa9\xe2\x45\x3e\xe1\x35\x62\x67\xea\x31\x2c\x31\xb7\xcc\xbf\x3a" - "\xab\x9e\xf5\x11\x11\x74\xd3\xfc\x24\x8e\x7b\x98\xbe\x3a\x34\xc6" - "\xe4\xfc\xe4\xcb\xc5\xec\xe4\x58\x39\x42\x64\xd2\x91\x6a\xe9\x0f" - "\x80\x79\x68\xfe\x02\x3e\x1f\xa0\xf6\x33\xe7\xe7\xab\x31\x39\x3f" - "\xdf\x4d\x4f\x34\x0e\x0e\xe3\x40\xc1\xae\x92\xd4\x21\x83\xf9\xfc" - "\xa3\xfc\x5e\x37\x3d\x2b\xd7\x2f\x03\xeb\x1b\x2a\xc5\x39\xab\x1e" - "\x8b\x2b\x2b\x2e\x24\x56\x18\xe6\xee\xa7\xee\xd5\xcf\x26\x80\x06" - "\xa5\xa0\xe5\xfc\x0e\x83\x06\x46\x3a\xd2\x7c\x06\x0d\xa0\xaf\x24" - "\xb8\xea\xfd\x7c\x76\xc8\xab\xce\x7b\x3f\x79\x83\x28\x3f\x90\xad" - "\x60\x3f\xa9\xf6\x19\xe2\x1b\x2a\xbd\x2f\x5b\x35\xa3\xfc\x58\x9b" - "\xfd\x4b\xe6\x61\x4f\xdc\x81\xec\x1e\xc7\x93\xe9\x06\x7c\xc1\x78" - "\x89\x81\x7c\x75\xd2\x2f\xe9\x49\xf4\xff\x13\x93\x25\x5f\xa3\x0e" - "\x89\xbb\x46\xb1\x41\xe0\x8f\x36\x68\xae\x02\x2f\xeb\xa9\x5d\x01" - "\xb4\x9f\x65\xdd\xa1\xc5\x6e\x13\xe7\x91\xba\xc3\xb9\x64\x4d\xc5" - "\x39\x7b\xf2\xdd\xe0\x39\x8e\xb7\x21\xf1\x4a\x40\x9b\xcd\x8c\x93" - "\x1b\x57\xcf\xcb\xc9\x34\xe7\x02\xe9\xb4\x78\xf2\x8d\x20\xd2\x83" - "\xcb\x06\x70\xa8\x95\x67\x3c\x9e\xec\x34\x70\x08\x72\xfd\x3d\x56" - "\x0d\xba\x18\xd7\xdb\x29\xcf\x59\xa2\xee\x09\x1c\x97\x8a\x63\x59" - "\xac\x48\x26\xc6\xa1\xc7\xf1\xd4\x68\x83\xde\x7a\x19\xa3\x8e\xe6" - "\xa0\xac\x5b\xd1\x46\xd1\xf9\x08\xf4\xc1\xa7\x66\x5e\x4a\xe7\xa7" - "\xb2\x43\xe8\x1c\xcb\x7c\xc5\x6b\x2c\xe8\xa3\x00\xd3\x9b\xf7\x35" - "\x6c\xcb\x59\xaf\x7a\xea\x67\x47\xbc\xd2\xef\x24\x81\xe1\x06\x41" - "\x7f\x86\x01\xb8\xdf\x50\x34\x7e\x6a\x4f\x3f\x8d\x51\xb7\x40\x5f" - "\xac\x55\x67\x52\xd8\xf7\x1d\xb2\xe3\xa9\xa3\xfd\xf5\x30\xae\x76" - "\xab\x16\x14\x56\x8e\x6b\xe7\x61\x5c\x0b\x6d\xc2\xc7\x7a\xa5\xf4" - "\x63\x42\x5b\x0f\x95\xb4\x9b\xa0\x5b\x6a\xb2\xae\xee\x64\xd6\xef" - "\xcd\xf2\x1e\x75\x0d\xc2\xdf\x9f\x70\xec\x38\xa3\x5d\x68\x8b\x99" - "\x79\x0b\xb8\x43\xff\xcb\xbe\x4a\xf2\xcb\x72\xee\xa7\xac\x2f\x38" - "\xcd\xc8\x87\xe7\x0f\x39\x9f\xf1\x8c\x77\xe0\xaf\xac\x57\xd0\xae" - "\x78\xc6\xd3\xc3\xf1\xf2\x64\x9b\xb3\x93\x19\x46\x8f\x23\xab\x32" - "\xac\x9d\x7d\x99\x26\x83\xef\x78\x8f\xa8\xc9\xe6\x93\xb2\x53\xd1" - "\x36\xeb\xb0\x31\x26\xb9\xbc\x1a\x63\x59\x6d\xa1\xbc\xe8\xb5\x0f" - "\xf0\x41\xe1\x18\x32\x9b\x6c\x1c\xef\x2e\xab\x41\xc5\xd5\xcd\xf2" - "\x47\xf6\x17\xbf\xe3\xd8\x70\x3a\x0d\x79\x3c\x25\x9e\xa4\x2c\x0f" - "\xb7\x0d\xef\xd2\x2f\x37\x5f\x72\x8c\x36\x8e\xb7\xb7\x59\x8d\x23" - "\xd0\x65\xc1\xa2\xcd\xea\x7c\x8f\x57\xc5\x48\xcb\x7e\x41\x68\xaf" - "\xcb\xfe\x62\xbf\x3c\x19\x0f\x43\xc6\x9e\xc8\x66\x1f\x37\x31\xbc" - "\xe0\x75\x19\x2b\x51\xf7\xd9\xf3\x34\x15\xf8\x65\x9c\x35\x7b\x21" - "\x9f\x83\xf5\xb3\x4d\x26\x7d\xd2\x8e\x14\xfa\xe9\x31\x1f\xd3\x36" - "\xfb\x30\x9f\x57\xf7\x4a\x5a\x64\x1f\x35\xce\xa8\x73\xdc\x37\x8e" - "\x25\x38\xc1\x4f\xb1\xac\x53\xd8\xec\x1c\x5b\x60\x41\x3d\xeb\x24" - "\x8a\xa6\xe0\x7b\x4d\xb4\x29\x5e\x5e\x70\x35\xc7\x66\x54\xfb\x4b" - "\x27\xc1\xdf\xb1\x7f\x47\xde\x5b\xd5\xba\x8c\x31\xd6\x16\xbc\xce" - "\x7b\x4c\x6e\x1d\x46\x8f\x63\x01\xe6\xff\xf9\x55\x97\x8e\x8b\x05" - "\x57\x1b\x36\x06\x9f\x8b\x53\xfb\x55\x03\xf0\x50\x5e\xae\x4b\x0f" - "\xc8\xa6\x3f\x30\xac\xd2\x4b\xc7\xcc\x82\x2a\x83\x97\x0b\x6e\xe6" - "\x73\xd5\xd9\x99\x5c\xff\x60\x32\x53\xd8\x7f\xc4\xfd\x64\x3e\x65" - "\xa3\xd8\xaf\x3a\x2f\x31\xb0\xff\xb5\xc0\x67\xb4\xc1\xa0\x89\x6a" - "\xc3\xd3\x8f\x74\xc7\xbf\xe9\x19\x68\xfb\xd3\x8f\x48\x5a\x0c\xbc" - "\x2f\x0f\xa1\x0d\x3f\x97\x29\xbe\x7b\x7a\x3a\xf8\x43\x5f\xb3\x51" - "\x69\x22\xfe\xc0\x33\x1c\xa7\x51\xe1\xb8\x88\x0c\x7e\x47\xde\x42" - "\x37\x9d\x4a\x56\xfb\x50\x4f\xa3\xfd\x0b\xda\xf4\x72\xa3\x19\x97" - "\xa8\xed\x0c\xc3\xf1\x19\xe2\x39\x56\xc5\x2d\x78\x26\x86\xf1\xb5" - "\x7d\x8b\xfb\xf8\xe9\x16\xae\x97\x79\x42\xf4\xe5\x0d\xf1\xf6\x25" - "\x53\x77\x5f\x1e\xc6\x4f\xb2\x86\x7a\x20\xff\x3e\x37\xe9\x75\x7a" - "\x0d\x5c\x19\x37\xe8\x8a\xe6\x1e\xb1\x28\x3a\x7d\xb9\x5e\x1e\xef" - "\x7d\x79\xc3\xf0\x33\xe3\x37\xf4\xeb\xce\xc7\xd0\x6b\x3b\x3d\xe5" - "\xfb\xe6\x07\x97\x8b\xa3\x73\xfc\x22\x08\xbb\xa0\xb3\x02\xfc\x3b" - "\x7c\x8d\x93\x86\x7b\x9f\xd4\xb2\x56\x52\x1a\x6c\x5b\x12\x17\xc5" - "\xa4\xda\x20\xae\xcb\xc5\x44\x8e\x47\x8b\xe7\x54\xfd\x39\x85\x9f" - "\xbb\x97\x8b\xf9\x3d\x8e\x67\xf6\x18\x7b\x77\x2a\xf6\xcc\x33\x8d" - "\xfd\x71\x78\x62\x9f\xe0\x73\x3e\x34\xa7\x08\x75\xc4\x3e\xdf\xc9" - "\xf5\x66\xf1\xdc\x81\xfa\x90\x0f\xf3\xff\xfc\x89\x9c\xcf\x13\x7b" - "\xdb\x08\xfc\x92\x07\xd9\xe3\xec\x64\xbc\xba\xe3\xf6\xcd\x37\x70" - "\x1d\xee\x4d\xd3\xbe\x1e\x6e\x39\xe9\x06\x6e\x48\x3f\x5a\xa1\xd2" - "\xfd\x1c\x8b\x8c\x7d\x10\xf1\x3e\xc7\xc0\xd5\xc0\x81\xeb\xe3\x73" - "\x95\x22\x7e\xb7\x8c\xed\xc2\xf5\x79\x5e\xce\xe3\xbc\x95\x06\xbe" - "\x5f\x7d\xf6\x27\x3a\xdd\xdd\x94\x73\x5c\xf1\x64\xce\x71\x63\xfe" - "\xc2\x7d\x67\xf8\x7e\x6f\x4e\x5b\xa4\x2c\x7b\x7a\xc9\x92\xc2\xac" - "\xa5\xb9\x7c\x49\x1e\xf7\xd2\xad\xf1\xa1\x36\x29\xcb\x37\x15\x1b" - "\x20\x97\xcf\x3e\xd1\xe6\x11\xc6\xfe\x65\x6e\xff\xf9\x27\xdd\x4f" - "\x7a\x2a\xeb\xaa\xac\xd3\xe1\xdd\xfc\x0f\x8a\x57\x33\x98\x98\x13" - "\x66\xd2\x06\x93\x9d\x2c\x2f\xba\xe3\x3e\x49\x95\xf4\x28\xf7\xd4" - "\xa3\x5c\xff\xfa\x67\x74\x3f\xb1\xdd\x69\x81\xf5\x07\x9d\xb6\x51" - "\x32\xc6\x91\x76\x70\x55\xbb\xc6\x73\x78\x09\xee\xd9\x76\x92\x7a" - "\x83\x1e\x37\xe7\xbd\xf3\xed\x90\xc3\xb9\x9d\xa2\x7c\x77\x1a\x60" - "\xba\x07\xc5\x21\x64\x8f\x9d\x7d\xb2\x3a\x68\x21\x0d\xba\x1f\x5e" - "\xd6\x50\xaf\xc6\xe1\xc2\x79\x4d\x56\xe2\x33\xa2\x3f\x39\x49\x0b" - "\x1f\x31\x59\x21\x6b\x47\xd1\x6e\xdc\x4b\x5b\x97\xdf\x85\xf5\xd7" - "\x0d\x67\xea\x4d\xb1\x42\x13\x42\xc4\x08\xf5\x47\x26\xfd\x26\x16" - "\x3f\x4d\xc4\xc8\xdd\xa2\x58\x50\x6a\xd8\x50\x13\x59\x86\x27\x98" - "\x6f\xba\x71\xb4\x75\xea\xfd\x93\x27\xd9\x4b\x8a\xc1\xdd\x7e\x9f" - "\x45\x84\xc6\x79\x6a\x6f\x9b\x77\x6b\x29\x49\x7f\x81\xf2\xf6\xb6" - "\x68\xb8\x6e\x74\x88\x02\x3e\x9b\x1b\x8c\xf7\x24\xda\x5f\x22\x6d" - "\x7f\xaf\x5b\xe3\xd8\xc1\x3c\x47\x73\xcc\x32\xe0\x7a\xe2\x7d\xa4" - "\xa1\xfd\x45\xa2\xcc\x93\xa8\xf6\x03\x9f\x1d\x13\x5c\xef\x49\x1c" - "\x80\x6f\x22\x86\x6f\xdf\x46\xda\xae\x92\x4e\xcd\x65\xba\x9f\x5c" - "\x36\x2f\xbd\x8f\xfb\x41\xfa\xb3\x00\xf4\x27\x86\x51\xe7\x08\x96" - "\xd9\xbf\x24\x4d\x3f\x5f\xa7\x9d\xa5\x67\x7f\xd4\x30\x48\x39\x3e" - "\xcf\xda\x1d\xbf\xef\xe6\x1e\xc7\xb3\xe8\xff\xef\x79\xf5\x39\x01" - "\xb2\xeb\x59\xd8\x7f\xb9\xea\x39\x7e\xdf\x98\x6e\x19\xd7\xf2\xd9" - "\x46\x23\x4f\xf4\x79\x81\xd7\x1c\x85\x93\xfb\x55\x5c\xfc\x47\x27" - "\xfb\xee\x0f\xb2\xcf\x3f\xcc\x55\x74\x17\xef\xb3\x0c\x19\xee\xa3" - "\x04\xfb\x05\xd1\x07\xbb\x3d\x09\x6c\xab\x05\x60\x7b\xf9\x2f\x8a" - "\xcc\x96\xae\xf3\xc4\xb1\xfe\x78\xbf\xf6\xed\x85\x7f\xd0\x5c\xbe" - "\x73\x4e\xd7\xba\x20\xb5\x62\x7e\x76\xd5\x9c\x73\xb6\x74\x1d\xc3" - "\x7d\x80\x5a\xe8\x53\x6a\x29\xfa\xb8\x54\xae\x95\xd4\x88\x52\xa6" - "\x73\xdf\x45\x31\xd7\x65\xfa\xff\x88\xe3\xd5\xb3\xac\x00\xdd\x6d" - "\x67\x29\x6f\xcd\x7b\x80\xb3\xff\xaf\x80\x25\x63\x3b\x4d\xa1\xf7" - "\x71\xdf\xe3\xc8\xdb\x60\xc8\x91\xa8\x71\x34\x62\x9c\x1b\x2d\x45" - "\x4f\x6a\x41\xc8\x24\x8e\xc1\x05\x59\x34\x91\xdb\x85\xe7\x54\x7e" - "\xc6\x35\x85\xaf\x96\x35\xce\x9d\x16\xff\x93\x2c\xa3\x32\x59\xfe" - "\x20\x7d\x6e\xdd\x45\x29\xb3\x32\xf4\xe7\x99\xfa\xf3\x74\xfd\x39" - "\x5d\x7f\x4e\xd3\x9f\x27\xf3\xb3\x92\x6d\x8b\x6c\xfd\x72\x57\x1b" - "\xd6\x86\xe7\x54\xa3\x2f\x80\xcf\x55\x96\xa2\xd5\x52\x46\xea\x78" - "\x4c\xd4\xf1\x4a\xd5\x9f\x0d\x7c\x6e\xb0\xf8\x57\xff\x4f\xe1\xd3" - "\x10\x81\x8f\x33\x04\x1f\xb2\x14\xa5\x7d\x1d\x7c\x12\x2d\x1c\xaf" - "\xf9\x9f\xc0\x87\x71\xe1\xb4\x1e\xc7\x73\x69\xe1\xf8\x3c\x97\x61" - "\xe0\x13\x95\xdf\x96\x8b\x4e\x9e\x1f\x96\x5d\x27\x63\x55\x0e\x63" - "\xd9\x5f\xd7\x6b\xc4\x53\x7b\x6e\xc3\xe5\xe2\xa9\x61\x2c\x58\x91" - "\x07\xed\x7f\x6e\xbe\x3e\x0f\x1e\x56\xfa\xd2\x73\x4d\x86\x6f\x0c" - "\xda\xba\xa7\x42\xb5\x75\xef\x3a\x8e\x29\xb6\x92\xae\xb7\x17\x89" - "\x4e\xe8\xff\xff\xd5\x64\xf3\x84\x8d\x81\xfc\xc2\x65\xcb\x5e\xb8" - "\xcf\x96\xbf\x60\x71\xae\x6d\x5c\x8e\x6d\x59\xde\xa2\x85\x85\xb9" - "\xe1\xfb\xc5\x89\x7a\xbc\x7c\xe9\x07\xcf\x3a\x29\x8f\x01\xe6\x7f" - "\xb6\xe3\x95\xef\xe2\xf3\xaf\x08\xc7\x73\x7c\x56\xd6\x5c\xfb\x1a" - "\x99\x78\x8f\xa2\xc7\xf1\xfc\x5c\x63\x4e\x50\xf1\xa1\x29\x46\x4b" - "\x64\x9d\xeb\x79\xd8\xbf\xcf\x76\x85\xa4\x73\xde\x52\x23\x8d\xe1" - "\xeb\xb2\x69\xd8\x49\x7a\x7e\x0c\xd7\x19\x95\x86\x17\x45\x3d\x6c" - "\xdd\x18\xd8\x23\x6c\x1b\x0a\x8e\x1f\xc4\xe7\xcb\x50\x4e\x00\x9f" - "\x8f\x58\xf6\xf2\x37\x20\x94\xee\x2b\x18\xc7\xcf\x51\x66\x17\xd2" - "\x4c\x9b\x90\x17\xfa\x74\x27\x97\x43\x7a\x80\xcf\xf9\x23\xdd\xac" - "\xc7\x44\x42\x5a\xfe\xd5\x7c\x0e\x1f\x69\x89\x21\x69\xe3\x38\x4e" - "\x2f\xd2\x6c\x0a\x5e\xfe\x3d\x4c\x67\x3c\xa7\xe9\x36\x37\xe7\x99" - "\xa1\xd7\x1b\x16\x2f\x8b\xa3\xa8\xdf\x75\x47\xaa\x6d\xee\x63\xdf" - "\x99\x72\xff\x33\x4b\x16\x2f\x8c\x27\x49\xf6\xe4\xd4\xa2\x71\xa9" - "\x77\x15\xdd\x7a\x9f\xad\x20\x37\x77\xa9\x6d\x45\xee\xe2\x42\xdb" - "\x82\x15\x0b\x56\xc6\xd3\xc2\x25\x4b\x9f\xe1\x53\xe4\xdc\x2d\xcb" - "\xb2\x9e\x59\xf8\x2c\x6f\xea\xab\xdc\xf1\x61\xf3\xf1\x5c\x96\x6d" - "\x7a\xdc\x85\xa3\x90\xb9\x3e\x11\xf7\x4e\x36\xee\x39\x16\x91\x15" - "\xd7\x26\xfc\x0e\xe3\xd7\x88\xdf\x31\xfc\xda\x4e\xd3\xd2\x24\x5c" - "\x0f\xf5\x38\xf2\xbd\x86\x5e\x30\xc0\x43\x2f\x98\x0d\x1e\xc2\x3c" - "\x7e\x48\xcd\x6f\x2f\x4c\x6a\xf5\xcb\xf1\xd3\xcf\x53\x15\x17\x07" - "\x78\x4a\xc6\x3b\x64\x9f\x95\xe5\x78\x0f\x1e\x66\x3b\x16\x34\x8f" - "\x63\xba\x9d\xa2\x82\xf1\xb0\xfd\x9b\x39\x16\x08\xae\x4d\xe0\x97" - "\x66\x15\x7f\xe3\x85\x43\xc8\x37\x06\x75\x1c\xd6\xeb\x50\xcf\x23" - "\xc5\x51\xb6\xf3\x4f\xea\xcf\xca\x26\x5e\xf2\x21\xdf\xf3\x55\xdf" - "\x2b\xb2\xb0\xff\x9f\xb2\xad\x8c\x77\x8b\x9f\xd4\xeb\x70\x82\x16" - "\xa5\xb5\x0e\xd1\xbf\xcf\xc1\x6b\x4c\x96\x98\xa9\x02\xf8\x9c\x0b" - "\xc6\x3e\xd1\x2e\xe3\xf4\x95\xf6\x42\x46\xdc\x7d\xb7\xab\x48\xe6" - "\x8f\xe1\x35\xa8\xd9\x05\x22\xc8\x71\x51\x83\xb1\xcf\xb7\x73\x39" - "\x61\x7e\x27\x3b\xb8\xe9\xaa\x34\xa5\x0b\x70\x7c\xb4\xc5\xba\x1f" - "\xa8\xf0\x31\x6d\x4f\x53\xfe\x3f\x94\x3d\xb3\x34\x49\xe9\x59\x8b" - "\xd3\x0d\x5f\x32\x8c\xd1\x64\x3c\xcf\x35\x64\x80\x9b\x16\xdb\x74" - "\xbf\x1f\xa7\x6a\xff\xe2\x0d\xfa\x73\xa3\x8e\x63\x0c\xc7\x7a\x00" - "\xfe\x6d\xdc\x77\xb0\x0d\x1b\x71\x7f\x0c\xf4\x69\x56\xf4\x59\x2c" - "\xd7\x18\xa0\xd7\xf0\xfb\x63\x1c\x77\x1e\xef\x8e\xa9\x38\x0a\x2f" - "\x34\x71\x9b\x07\x7c\x03\x6b\xd2\x40\xbf\x0f\x79\x4f\x0d\x63\xa9" - "\xd1\x75\x91\xc7\xe7\x0b\x4e\xc0\x6b\x30\xe4\x0e\xcb\x99\xac\x00" - "\xc6\xa9\xd4\x4b\x17\xfb\x0d\x79\x33\xc0\x07\x4b\x12\xa3\xc9\x92" - "\x68\xfd\xae\xf7\xcd\x4a\xe1\xc8\x9f\x0b\x9c\x1a\x64\x1f\x70\xdc" - "\xc8\x8b\xfd\xfa\x6f\x9f\x92\x91\x4b\xfa\xf5\x5f\x03\x0f\x8e\x77" - "\xeb\x66\xdc\x7a\xe5\x3e\xa7\x2e\x37\x96\x6c\x30\xe4\x86\x01\xc7" - "\x12\x23\x82\x96\x22\xfc\x2b\xdb\x7d\x9c\xd7\x58\x79\xbe\x94\xfa" - "\x08\xe0\x0c\xbf\xa0\xce\xf8\x04\xcb\x77\x43\xcf\x5d\x92\x0e\x19" - "\x63\x92\x3a\xaa\x23\xff\xd9\x01\x59\xb4\xc4\x1d\x0a\x53\x98\x77" - "\x1f\x67\xb8\x2c\x8f\x58\x27\xc9\x0a\x98\x38\xce\xc6\x71\x7d\x7e" - "\x81\x0c\x2e\x48\x34\x70\x05\x0d\x8f\x1a\xf8\xea\xdf\xf8\x80\x8d" - "\xbd\xa4\x60\x4e\xa0\x8f\x7d\x5d\x9b\x54\x7f\xbe\x28\xe5\x0d\xde" - "\xed\x45\xd9\x99\x6e\x7a\xbe\x5e\x1f\x43\xcd\x28\xbf\xf7\x48\x49" - "\x3a\xf2\x14\xe4\xe9\xfe\x9a\x6d\xe8\xdf\x63\x21\xbc\xff\x64\x88" - "\xbd\x7c\x4c\xf5\xe1\xfd\xa5\x27\xa9\x60\x4f\x48\xba\xde\xb7\x47" - "\x32\x4e\xd2\x8b\x4f\x2a\xdb\x73\x77\x8d\x2a\x5f\x20\x7d\x36\x0d" - "\x1c\x59\x16\xf0\x79\x24\x1e\xe3\x92\xf6\xb2\x8f\x0b\xdc\xc6\x7c" - "\x01\x58\x87\x24\xcd\x47\x8a\xc3\x4c\x27\x15\xcf\x20\xff\x55\x45" - "\xa7\x17\xcd\x61\xb4\xe7\x79\x13\xf5\x30\x9d\x86\xaf\x11\xc1\xe1" - "\xde\x18\x91\xb5\xd2\x24\x63\x37\xf3\x18\xe7\xbd\x09\xf0\x87\xd4" - "\xab\x14\xdd\x5e\x9c\x6e\xd0\xcd\xe8\x3b\xa6\x93\x9b\x0a\x1a\x99" - "\xb6\xe1\x6d\x1c\xd6\x76\xd2\x68\x3b\x68\xca\xeb\xa5\x78\x9e\xaf" - "\x8f\x8b\x66\xe7\x28\xde\x2b\x7f\x61\xc1\x11\xd3\x77\xe8\x48\xd1" - "\x44\x52\xb4\x7d\x11\xf6\xdf\xf3\x66\xd9\x0e\x05\xeb\x28\xd3\x97" - "\xc7\x0a\xf0\x6c\xd7\x63\x0b\xe9\xfe\x1a\x2f\xcc\x87\xbe\xaf\xc6" - "\xf2\x72\x19\x03\x82\xe3\x8b\xb6\x31\x8d\x58\x2e\xf2\x58\xe2\x31" - "\xc0\xe3\x49\xd1\x68\xa9\x29\x84\x46\x4d\x4c\x1f\x9d\x4e\x87\x22" - "\x64\x79\xae\x2d\x7f\x8a\x92\xc5\xb6\xe4\x71\x39\x13\x64\x20\x0f" - "\xdb\xc3\xd3\xee\xb3\x65\x4c\x19\x57\x94\x97\x32\x5b\x5d\xa6\x65" - "\xcc\xe4\x6b\x7c\xb8\xfd\x64\x43\x3d\xf9\xe1\x36\xd8\x8a\x2e\x25" - "\x3f\x96\xae\x73\x93\x5f\xf2\x0d\x6c\xe5\xae\x8a\xf3\x44\x01\xa6" - "\xe1\x62\xf4\x69\xd9\xee\xa2\x39\x90\xc1\x73\x56\x8a\x2f\xeb\x90" - "\xce\x31\x6a\x99\x17\xc1\xf3\x45\x6c\xf3\x7a\xe2\xda\xdb\xf0\xab" - "\xf4\xc4\xed\x9b\xf8\xd0\xad\x76\x01\x58\x6d\x46\x5b\xd8\x2e\x16" - "\x5c\xbe\x48\x04\x98\x2e\x59\x45\xe8\x6f\x94\x63\x1b\x19\xf9\x7c" - "\x98\x03\xd2\x94\x6d\xb8\x0c\xed\xcf\xdf\xa5\xcb\xaf\x0c\x3c\x27" - "\xb9\x29\x55\xe1\xe3\xb0\xf2\xfa\x9c\x29\xb8\xf6\xb6\x47\x61\x03" - "\x54\x1a\x30\x01\x6b\xa8\x1e\x7b\x4e\xc2\xfb\xba\xbe\x82\xc1\xf5" - "\x7b\x0a\x2c\x31\x2a\xce\x1d\xc6\x75\x69\x9d\x16\xcc\xec\xf7\x05" - "\xc0\xbb\xe1\x6b\x12\xd9\x57\x20\x13\xfc\xc6\xb1\x2e\xfb\xdf\x55" - "\x38\x82\xee\x0a\x2d\xe8\x43\xdf\x25\x2a\x9d\xb9\x8b\x65\x26\xec" - "\xcf\x65\x4e\x63\x2e\x93\x73\xa0\x46\xa5\xca\x86\x59\x26\xf7\xf8" - "\xce\x3b\x4c\x04\x39\x3d\xff\xe6\x24\x69\x97\xf8\x82\x8e\x18\x52" - "\xfe\x99\xcb\x7e\x63\xc8\x55\xde\x63\xb1\xac\x11\x1e\x5e\x5f\xb3" - "\xf8\x85\x87\xf7\x5b\xe4\x7c\x41\xa7\xc9\x55\xdc\x53\xca\x71\x48" - "\xa5\xde\x83\x7a\xd5\x5c\x11\x50\x73\x05\xea\x87\x2d\x9f\x8d\x39" - "\x21\xe6\x34\x2d\x5b\xc7\xf8\x33\x6d\x78\x0d\x37\x08\x5a\xb9\x78" - "\x6e\x64\xfa\xc4\xbf\xe5\xe1\x7d\x7e\x6e\xab\xc5\x8f\x36\x87\xb6" - "\x4b\x0b\xba\x37\x39\xd0\x2e\x0d\xed\x2a\x3a\xc3\xe3\xc4\xc7\xfe" - "\x17\x18\x63\x23\x65\xac\x5d\x69\x63\x17\xee\x0a\x6d\x23\xcb\x7c" - "\xd5\x86\xc2\x0f\xa3\xb5\x51\x68\xdc\x46\xa6\x41\xe1\x36\x7d\x8c" - "\x49\x3c\x59\x66\x74\x51\x61\xe6\xf0\x35\xec\xf7\xb0\xbb\x08\x7c" - "\x34\x8d\xfb\x10\x73\x66\x25\xe3\x19\xad\xbf\x18\x9e\x82\xf5\x52" - "\x8e\x65\x4d\x69\x76\x8f\xe3\xa5\xd4\xe8\xf4\x7e\xe9\x91\xcb\xd3" - "\xfb\xa5\x71\x5c\x9e\xf1\x60\x3f\x10\x8b\x1f\x06\x3a\xf8\x16\x36" - "\x5a\x59\xb4\x7a\x87\xaf\xa9\x67\xbc\xa2\xbe\x83\xdc\xe9\xaa\xd0" - "\xe5\x0e\xf8\x50\xcc\xc1\x8f\xe5\x10\x70\x6b\x36\x64\x90\x25\xc6" - "\x16\x2b\x65\x82\x26\x2a\xa3\xc1\xb0\xac\xa9\x64\xbf\x8b\x69\xa8" - "\x3f\xea\x7b\xd0\xd8\x06\x1a\xe5\x05\xd7\xde\x7e\xb3\x25\x86\xa6" - "\x7a\x62\x6f\x8f\xb7\x14\xf9\xc7\x32\x0d\x01\xb3\x08\x63\xf7\x13" - "\xb6\x4d\x55\x6c\xac\xe5\x98\xff\x5f\x95\xeb\x79\x9e\xb8\xdd\x79" - "\x2a\x7e\xd6\xf2\x4c\x37\x6d\x38\x6e\xac\x6b\xe2\x39\xcf\x4d\x9f" - "\xea\xeb\x55\xd7\x6f\x17\xeb\xf7\x41\x5e\x5b\x84\x6d\x95\x05\xba" - "\xe3\x0a\x8e\x43\xae\x89\xf8\x7d\x34\xc0\x27\xca\x27\xc4\xe0\x13" - "\x94\xdf\x13\x9d\x07\x96\xff\xf1\xf2\x3c\xb0\x5c\xee\x17\x33\xdd" - "\x95\x7d\xb2\xdc\x63\xe8\x26\x62\xed\xf5\xdb\x6d\x25\x5c\xff\xf2" - "\x75\xaa\x6e\xa6\x49\x1a\xaf\xd5\xcf\x04\x5d\x4a\x7b\x1c\x2b\x46" - "\x1b\x72\x80\xf9\xc5\x12\xa0\x18\x96\x45\xcc\x2b\x78\x37\x09\x72" - "\xa6\x5a\xad\x21\xee\x6b\x94\xdf\x88\x72\x2c\xb5\x79\xec\x79\x3b" - "\xd8\x87\xd3\x1b\xb7\xdb\x8d\x3c\xf3\xdd\xf4\xdb\xb1\x32\x8f\x79" - "\x77\x3b\x60\x1c\xaf\x1a\x81\x79\x59\xf9\x32\x25\xf0\x98\xe6\xb8" - "\x37\x3c\xae\x91\x96\x04\xbc\x39\x06\x0e\x6c\x9c\x15\x55\xfd\x73" - "\x91\x23\x0d\xb2\x42\xc8\xf9\x10\x73\xd1\xe8\x6e\xd0\xee\xe7\x5a" - "\x70\xcf\xc5\x09\x56\xe2\x36\x5f\x5c\x3b\x6a\xcf\x4f\xee\x20\xd3" - "\xff\x63\x7d\x9a\x0a\xee\xa2\xa4\x35\xdf\x31\xd1\xff\x9e\x44\x1a" - "\xd3\xc1\x4d\x2b\x76\x29\xda\xad\xe8\x30\xfa\xc7\x4d\xcb\x67\x72" - "\x7f\xf0\xfa\xdb\x1c\xbf\xf8\x52\xad\x11\x16\x41\xfe\xe5\x38\xd5" - "\xfb\xa5\x45\x91\xeb\x3e\xac\xc3\xdb\x16\x2d\xb3\xe5\x2c\x59\xb1" - "\x78\xcc\x98\x30\xfb\xc8\x24\xcf\x75\x38\x8a\xac\x6a\x0e\x2d\x9a" - "\x69\xe0\xcd\xba\x08\x9e\xd1\xfe\xa5\x97\xc4\xf9\x9e\x99\xa5\xbb" - "\xee\x66\xa5\xd2\xc0\xfd\x9d\x34\xf3\xce\x90\xc7\xbb\x69\xe6\x5d" - "\x77\x67\x3d\x9a\xbb\x20\x67\x65\x48\xea\x3d\xa1\x6b\x72\x15\xdb" - "\x51\x77\xec\xa8\x07\x21\x2b\x62\x66\xbf\xcc\xf3\xc9\xca\x07\x4a" - "\xfc\xe2\xef\x90\xd7\x93\x30\xc6\xb2\x5a\x0a\xfd\xd4\x02\x59\x26" - "\xae\x67\x19\x3e\x4c\x9d\x57\x83\x0e\x05\xde\xb2\xa0\xed\x1e\xe8" - "\x72\x17\x78\x4d\x06\xe5\x72\x5b\xab\x39\xf6\xec\xbe\xc9\x4a\xaf" - "\x58\x69\x43\xfa\xd5\xb8\xce\xc0\x75\x28\xae\xb3\x6c\x8b\x61\xeb" - "\xb0\x7f\xf0\x72\xf6\x0f\x5e\xc9\x78\xc4\xdc\xe1\x2d\xa5\x3b\x96" - "\xb2\x9e\x5e\xd4\xce\x7a\x87\x9b\x56\x96\xf1\xfe\x00\xe7\x45\x99" - "\x31\xb6\xe7\x28\x95\xaf\x42\xee\xab\xac\xb4\x89\xf2\x7d\x93\xc5" - "\x8e\x4c\xfe\x76\xcb\x58\xa4\xbf\x12\x1b\x73\x82\x62\xad\xc3\xbe" - "\xdf\xe3\x58\x89\xf9\x2f\x57\x8e\x8d\xc1\xbe\xf7\xc6\xba\x06\x8f" - "\xf9\x01\x5d\x04\xba\x20\x74\x91\xac\xa2\xf5\x84\x7b\xd3\x80\x1e" - "\xb2\xb2\xad\x5f\xa7\xd5\x28\x1e\xcf\x6e\x83\xdf\x71\xdf\x65\xf0" - "\x63\x58\x6c\xb0\xc5\x85\xb9\x4b\x73\x73\x6c\xe3\x96\xc5\x53\x48" - "\x64\xb0\xbc\xdc\xc5\xb6\xa5\xb9\x2f\xbe\x94\xbb\x4c\x46\xf5\xe2" - "\xb7\x61\xf3\x79\x92\x88\xff\x75\x81\x71\x66\xc5\x36\x8a\xe9\xb8" - "\xea\x11\x8e\x27\x25\xd6\xff\x9a\x7d\x18\xbb\x94\x2d\xe1\x49\x0e" - "\xb7\x25\x5e\xee\x50\x3a\xdc\xbe\x14\x65\xc7\xbc\xbc\x92\x9f\x4f" - "\xd2\x2a\xff\x40\x0c\xea\x55\xfb\xf8\x3b\x08\x3a\x7d\xda\x7b\x1c" - "\xab\x76\x19\xf4\x71\x53\xb1\x71\x8e\xa0\x4b\xca\x09\xcc\xa5\x90" - "\x73\x61\xf3\xa8\xfa\x9e\xdb\xaa\xbd\xbc\xc7\x2a\xd7\x64\xe3\xf6" - "\xa5\x72\x5d\x0c\xf3\x14\xca\xa3\x1f\x52\x20\x1f\x59\x8e\x95\x19" - "\xf0\x50\x67\x15\xd7\xa7\xdb\x38\xdf\x3c\x4d\x2f\xcb\x3d\xeb\x60" - "\xd9\xbe\x54\x96\x1d\x77\x48\x9d\x03\x70\xe4\x3e\x56\x71\x0a\xeb" - "\x8f\x32\x0e\x3a\x60\xf1\x1a\x2c\x64\x40\x1a\x7f\xfb\x8f\xd3\x54" - "\x5c\xab\x95\xd2\x4f\x10\x75\xc1\x1e\x7a\x39\x67\xc0\x2f\xbb\x38" - "\x85\x75\x4a\x86\xeb\xa6\x97\x93\x19\x9e\x8a\xdb\xf5\x32\x70\x29" - "\xda\x33\xa0\x1b\xbd\xdc\x1c\x62\x73\x01\x1f\x85\xa7\x17\xb8\xc8" - "\x18\x91\xca\x6f\x4e\xb6\x9b\xe5\x64\x95\xde\x76\xa3\x3d\x80\xd7" - "\x0e\x9e\xab\x32\xf6\x5d\xdd\x7a\xbb\x19\x3f\xc6\x3d\x14\x67\x85" - "\xef\x2a\x96\x4b\x18\xc3\xc5\x89\x21\x63\x98\xd7\x5c\x86\x20\x6d" - "\xec\x80\x3f\xee\xaa\xfc\x48\xf9\xf0\xe0\x82\x67\x9e\x67\x23\x7d" - "\x66\x6a\x8a\x8d\x65\x45\xd6\xa3\x0f\x4d\x7b\x3c\x6b\xda\x9c\x79" - "\xb3\xe7\x4a\xff\xfb\xfe\xf7\xe9\x8b\xa3\x67\x08\xe7\xab\x44\xf0" - "\x46\x32\xfa\x6b\xc8\x49\x2a\x71\xab\xf8\xcc\xc5\x7b\xc2\xe3\x33" - "\x17\x3b\xf1\x3b\x8e\x1f\x34\x93\xd5\x6e\xfc\xa0\x47\x96\x1c\xd3" - "\xf9\xa5\x0b\xf8\x1e\x1b\xe0\x97\x12\xb9\xe6\xcd\x7e\x09\x6a\x2d" - "\xb5\x18\xf2\x7f\xd5\xd8\xd0\x77\x03\xb6\xdf\xea\x84\x7e\xdb\xaf" - "\x5f\x16\xac\x9e\x64\xd8\x81\x48\x9b\x08\x1b\x30\x8e\x6d\x40\xb5" - "\xf6\x53\x22\x75\xac\x48\x5b\x6d\xc0\x4e\x33\x93\x61\x03\x72\x6c" - "\x48\xde\xf7\x54\x63\x74\x75\x61\x88\x8d\xe5\x95\xf1\x02\x2f\x2a" - "\x9b\x90\xcb\xc9\xb5\x36\xb3\x27\x89\xd7\x9f\xa1\xd7\x26\x63\x8e" - "\xc7\xbc\xd3\x23\x44\x9c\x27\x49\xc7\xe9\x10\xaf\x47\xb3\xbe\xab" - "\xec\xbd\xe2\x49\x2c\x7f\xc5\xda\x51\x0f\xce\x09\xc8\x58\x6a\x90" - "\xbd\xab\xdb\x07\x78\xae\xc4\xcd\x7d\xc9\x34\x00\x1f\x74\x80\x0e" - "\xa6\x81\x36\x97\x50\x7f\x9b\xf5\x75\x0c\x63\x0d\x43\xd5\x55\x72" - "\x62\xb0\xf6\x45\x6f\x5b\x49\xc6\x57\xb6\x8d\xbf\x99\x83\x71\x61" - "\xb4\xf1\xd2\xf6\x95\x54\x45\xb4\x2f\xf3\xd2\xf6\x95\x34\xf6\xef" - "\xbb\xf4\xaf\x4b\x94\x9c\xe0\x76\x32\x1f\xa0\x9d\x47\x63\xad\xe6" - "\x6f\x85\xdc\xa7\x44\x93\xab\xc3\xd7\x68\xfa\x19\x10\xfb\x3d\x4d" - "\xa3\xa5\x9d\xe6\xdb\xac\x05\xf3\x36\x3b\xf0\xc3\x95\xf5\xec\x01" - "\x5d\x55\xf8\x14\x7e\xf6\x89\x4d\x90\xbd\xbc\xd6\x32\xd8\xd9\x36" - "\xd0\xec\xb8\xb1\x0e\x80\xfb\x76\xb6\x27\xe7\x04\xa6\x0a\x4e\x67" - "\x1a\xc0\x26\xf1\x80\xaf\xda\x95\xde\x66\x5f\xd7\x2f\xb3\xbf\x35" - "\x35\x3b\x76\x0d\xd9\x8e\xd4\xdc\xc5\xe9\x35\xe8\x3b\xb9\x36\x28" - "\xbf\x91\x37\x08\xcc\xac\x40\x1a\x0d\x02\xf7\xb8\x01\x77\xb0\x73" - "\x90\xa1\x69\x4b\x16\xdb\xf2\x16\x2c\xce\x59\xb2\x70\x61\x8a\xed" - "\xa5\xc5\x4f\xe7\x2f\x79\xe6\x79\x16\xfc\xcb\x0a\x5f\xc2\xf8\x95" - "\xe3\x36\x7d\xe6\xcc\xac\x07\xe7\x3d\xf6\xa3\x30\x1d\xc0\x5c\xe9" - "\x08\x96\xc9\x6f\x64\xad\x7d\x6e\x55\x8f\xa3\x14\xfd\xff\x6c\x91" - "\x9a\x6f\x4a\x31\xff\x3f\x93\xa0\x74\xad\x27\x3a\xd5\xd9\xcf\xd2" - "\xc6\x10\xb9\x36\x1c\xcf\x4d\xfc\xad\x83\x81\x35\x90\xd2\xca\x50" - "\x1d\xa2\x5b\x7e\xa7\xae\x74\x97\x11\x07\xa1\x70\x0c\x69\xa6\x31" - "\x95\x54\xa5\x89\x52\x37\x95\x1e\x85\xbd\x78\x1c\xef\x9b\xdc\x94" - "\x57\xad\xdb\x8f\xc7\x79\x8f\x95\xed\xc7\x00\x6c\xc9\x39\x2b\x9d" - "\x53\xb3\x56\xc6\xb0\x0f\xb1\xfc\x6e\x82\xff\xa2\xe8\xe0\x7d\x4e" - "\xde\x33\xe2\xef\x26\x54\x3c\x27\xed\xc9\x58\x99\x07\xf7\x15\xa7" - "\x48\xda\x56\x78\x6f\xab\x3b\x25\xbf\xdd\x08\xfb\x63\xcd\x58\x43" - "\xf7\xb4\xac\xb1\xc9\x33\xa9\x9b\x54\x7f\xb4\x73\x5f\x70\x7d\x59" - "\x2b\x9d\xaa\x0e\xf4\x01\xca\x5a\xd4\xba\xcf\x9a\xf9\x97\x5d\xcf" - "\x8e\x6b\x6f\x1c\x34\x06\xb9\xa3\x74\xd8\x66\x15\xaf\x98\xfd\xe0" - "\x3c\x86\x1f\x16\xfb\x64\x01\xee\xa1\x48\x9f\x2e\xe5\x97\xb0\xa6" - "\xd9\xf0\x07\xc1\x7d\x7b\xbf\xbe\xcc\xdf\xda\x80\x9d\x63\x2b\x59" - "\x33\xf4\x2c\xad\xd9\x56\x37\xc8\xba\xb2\x71\x06\x55\xf7\x9b\x1a" - "\xd6\xe3\x70\x8c\xee\xf7\x25\xc1\x33\x8f\xf1\x01\x7f\x30\xc7\x24" - "\xc3\x9f\x48\xfa\x90\x61\xce\xe2\xef\x79\x9c\x22\xc7\x8f\xe4\xf7" - "\x43\x6e\xe6\x35\x61\x47\x51\x93\xf4\x65\x73\xe4\x84\xe2\xa2\xf0" - "\x70\x8c\xe3\x75\x4b\x7e\x1f\x8a\x4b\xd1\x82\x97\x16\x4d\x28\x5a" - "\xb8\xc8\xf6\x4c\xde\xa2\x82\xac\x45\x32\x6e\xa8\x0c\x49\x5a\xb8" - "\xb2\x80\x57\xe9\x6f\x8d\x8f\x98\x2b\x74\xbf\xb3\x7e\xff\x1a\xe9" - "\x7b\xe6\xf8\x0c\xf4\xd0\x94\xef\xd9\xda\x36\x35\x1f\x3a\x3a\x2f" - "\xf5\xb3\x70\xf8\x0d\x3f\x0b\xf0\x55\x62\x95\x8a\x57\xae\xfb\x66" - "\x30\xdf\xad\x1d\x7d\x69\x99\xb5\xa9\xfd\x7e\x46\xec\xef\xd2\x97" - "\x29\xcf\x08\xc8\xd8\xd2\xaf\x71\xbf\x39\xd6\xb9\x8a\x1e\xe2\x3d" - "\x62\x9d\x9f\xd7\x66\x1b\xfc\x6c\xf8\xa8\x31\x2c\x3e\xa3\x30\xc1" - "\x17\xea\x9f\xb2\xf6\x43\xcc\x2d\xd6\xfe\x76\xbc\xac\x11\xe3\xee" - "\xd5\x9c\x8c\xc7\xae\x48\x3c\x80\xdf\x18\xa4\x87\xf8\xff\x18\xed" - "\x5c\x0b\xfd\x6f\xdd\x25\x3a\xde\x03\x0f\xcd\x84\x32\xb7\x2c\xb7" - "\x30\x9e\xa6\x2d\xc8\xcf\xe7\x71\xbd\x20\x37\xff\xa5\xa5\x4b\x96" - "\x65\x2d\x5a\xbc\x08\xa9\x0f\x2c\xe4\x70\xae\x32\xcb\x7d\xfa\x1b" - "\xdb\xe2\xdc\xdc\x1c\x95\xa4\x77\x43\xf8\xde\x88\xda\xff\x5e\x97" - "\xe6\xa6\x35\xbe\x01\xbd\x65\x5d\xb5\xd0\xd6\x1e\xc7\xef\xef\x72" - "\x4c\x4b\x9d\x62\x5d\x4e\xb8\x5d\xb0\xae\xd0\xe0\x07\xd9\x7f\x76" - "\xf6\x11\x79\xf3\x93\x6e\x21\xf7\x12\xd0\x67\xaf\xfc\x91\xbf\x7b" - "\xea\xa6\x57\x8e\xb2\x3e\x1c\x02\x67\x6f\x3f\x2d\xd7\x3e\x21\xbf" - "\x9b\xc9\xf0\xf8\x7b\x6f\x7c\x36\x1b\xef\xc1\xff\x6b\x4a\x15\xff" - "\xaf\xeb\xe7\xff\x6e\x2d\x16\x36\xce\xba\x4e\x43\x0f\x0e\x1f\x33" - "\xaf\xd0\xa5\x63\x89\x7d\x06\x5f\xb1\x1a\xb4\x35\xfa\x59\xf1\xd6" - "\x2b\xbf\x31\xd6\x26\xeb\xf4\xd8\xe2\x7c\xcf\x65\x59\xc7\x15\xc3" - "\xaf\x9a\xca\x3e\xd0\x27\xe9\x95\x75\x8a\x5f\x5e\xc9\x0e\xf1\xe5" - "\x49\x3c\x4d\xaf\xe8\xf6\xec\x2b\x45\x06\x7e\x68\xe7\x44\x4e\x63" - "\x18\x6a\xec\xaf\x0d\x28\xde\x79\xa5\xc6\xa0\x2d\xdb\x8d\x78\xde" - "\x3b\x30\xa7\xaf\x9b\xc9\x73\x9d\x7e\x36\xbd\x8f\xdb\x0f\x38\x29" - "\x06\x1c\xe4\xc5\xb3\xb9\xc9\xa0\x95\x91\x27\x94\x27\xa6\x2d\x28" - "\x80\x51\xb7\x68\xe1\xc2\xdc\xa5\xcb\x8c\x78\xbd\xc9\x4b\xf2\x73" - "\x54\x7c\xde\xfb\xd0\xfd\x2b\x30\x02\xa7\x70\x88\x5f\xa4\xaa\xdb" - "\x08\x1b\x20\x85\xed\x70\xe9\xef\x25\xf5\xff\xf5\xf7\xd4\xea\xb6" - "\xc0\x49\xfa\xc9\x44\x5c\x21\x0f\x5e\xbd\xa0\xf4\xb2\xb8\x73\x3d" - "\x8e\x57\xf3\x0d\xbd\xac\x7b\xe8\x24\xd8\xd7\xaf\x16\x1b\xdf\x61" - "\x32\x74\x05\x3e\x8b\xe2\x5c\xcc\xb1\xcf\xd7\x6f\x0b\x96\xef\xce" - "\x14\xf1\x5b\xca\xa0\x93\x24\x30\xdf\x5f\xd5\xc5\x71\xd1\x39\x5e" - "\xcc\xab\x47\x59\x97\x61\x59\xc2\x31\xce\x3b\xe8\xd5\x6a\xfe\x76" - "\xb3\x9b\xd6\xd7\x78\xe2\x76\x67\xae\x5b\x45\xe6\x9d\x5b\xe4\xf7" - "\x6f\xdd\x4d\xf5\x4c\xc7\x57\x3b\x3e\x28\x56\xdf\xd3\xe6\xef\x10" - "\x6f\xc4\x3b\xd8\xc3\x0d\xfa\x5a\x72\xbe\xbe\x8e\x97\xdf\xe3\xf8" - "\x09\xf4\xbf\x84\x46\xc5\x97\x5b\xc5\xb7\x4b\xa9\x88\xbf\xcf\xa6" - "\x62\xbd\x34\xd4\x8b\xb2\x6a\xd6\x63\x3c\xd0\x7f\xa0\x67\xbf\x9a" - "\x2f\xca\xab\x49\xc5\x89\x66\xbe\x78\x75\x3e\xb7\x13\xf0\x0a\x79" - "\x7d\x87\xd7\x76\x74\xb8\x85\x6c\xff\x41\x8f\x1b\xcb\xba\x1c\x9e" - "\x33\x82\x17\xcf\xd4\x63\xee\x36\x63\xae\xf2\xe8\xdf\xfd\x99\xcb" - "\x6b\x9e\xc3\xd7\xb8\x31\x17\xdd\x24\xb2\xfc\x89\xbc\xd7\x70\x95" - "\xf1\x5d\x25\x5e\xf7\x04\x6e\x7b\x06\xf6\x10\x50\x1e\x34\x01\x3f" - "\x96\x76\xd0\x4f\xa4\xaf\x3f\xf3\x22\xd3\xae\x17\xf4\xe2\xef\xef" - "\x8a\x8b\x67\x1a\x60\x87\x5e\x75\x8a\x7e\xf2\x39\xd3\x8d\xf7\xfd" - "\xd8\x5f\x07\x69\x16\x8e\x1f\x8d\xfe\xf9\x88\x69\xc6\xb8\x88\xb2" - "\xad\xd9\xfe\x9e\xcc\xef\xf3\x19\x42\x96\x47\xab\x8b\xa1\xfb\x2d" - "\xe4\xb1\x5c\x3e\x8f\xed\x39\xfe\xe6\x07\xdf\xdb\x73\x44\x50\xd2" - "\x7c\x15\xd3\xbc\x7c\xde\xea\x4e\x11\xfc\xd2\x41\xe2\xa8\x97\xe8" - "\x4b\x8d\xfc\x3e\x2d\x86\xf1\xd6\xec\x67\xf8\x9c\x63\x3d\xb9\x8a" - "\xca\x08\xf5\x9a\x37\xad\xa2\x44\x3e\x17\xca\xdf\xb3\x68\xf5\xd6" - "\x50\x6b\x41\x0d\xfd\xa7\xbf\x8a\x9c\xcb\xf9\x9c\x7f\xb9\xff\x4f" - "\x45\x55\xbc\x97\x12\x87\xfb\x77\x6d\x8f\x73\x5d\x65\x55\x7f\x3a" - "\xf6\x67\xfa\x93\xf3\xcf\x64\xfb\xb1\x7c\xde\xd5\x9c\xf9\x9f\xd4" - "\x9c\xf6\x9f\x64\xef\x10\x41\xb6\x09\x4a\x5e\xe0\x3a\xca\x00\xab" - "\x9e\xcf\x53\x26\x06\xbb\xad\xf1\x68\xbf\x69\x4e\x11\x51\xab\xd7" - "\x03\x1e\xfa\x3d\xe3\x38\xae\xf6\x3c\x99\x9d\x8b\xff\x20\xef\x95" - "\xae\x7e\xa6\xde\x95\xd3\xce\x7a\x92\x9f\xcf\x8f\xf2\xde\x13\x74" - "\xdd\x60\x05\xe3\x18\x50\x78\xf3\x77\xa4\x8d\xf2\xd0\xa3\xf4\xf2" - "\x65\x72\x8d\x77\x27\xd3\x03\x38\xb5\xcc\x55\x34\x69\x6e\x07\x4d" - "\x1f\xd7\xe9\x93\x19\x4a\x9f\xb2\x74\xa6\x0f\xc7\x1e\x0c\xa2\xbf" - "\x80\x5b\x1a\x68\x10\x34\xea\x00\xce\x66\x7d\xdd\xce\xbc\xe9\x3c" - "\x25\x38\x17\xf3\xb7\x89\xca\xdf\xb2\x64\x98\xcc\xc1\x8b\x67\x1b" - "\x2a\x2e\x90\x89\xfb\x8d\xd7\xe7\x2b\xe4\x7b\x49\xf3\x0d\xdc\x67" - "\xa1\xdf\x33\x67\x3e\xe4\x6f\x9a\xa3\xbf\xca\x80\xc3\x58\xf4\x55" - "\x3d\x5f\x15\x6f\x57\xb3\x2e\x6f\xec\xe3\x0e\xa4\x83\xb7\xfd\xfc" - "\xdd\x41\xb9\x2e\x51\x3e\x36\x08\xde\x66\x7b\xbe\xf6\x35\x4a\x08" - "\x3a\x5e\xf1\xec\x84\xac\xa9\xc1\x5c\x56\x3b\x82\x12\x79\x2d\x6b" - "\xbb\xf4\x1f\x5e\x9f\x6c\xc8\x9e\xf5\x23\xf9\x4c\x52\xf9\x5c\x4d" - "\x7e\x5f\x6e\x77\x81\xce\xe7\x05\xc8\x33\xd3\x4d\xd7\xee\x52\xf2" - "\x77\x7d\xa6\x31\x96\xa0\x27\x79\x0c\xfe\xc7\xf8\xcc\xf0\x30\xbf" - "\x4b\x3f\x04\x37\x6c\x58\x8b\x60\xdf\xce\x81\x6f\xaa\xad\xaf\x34" - "\xf8\x1c\x6d\x2b\x60\x39\xc1\x63\x7a\x30\x3d\x1b\x3a\x5e\xb3\xd8" - "\x91\x49\x9b\x4e\x13\x25\xac\x11\x9e\x84\x0e\x8b\x68\xf5\x36\xcb" - "\xf3\x6c\xfc\xfd\xc4\x5a\xa4\xe3\x7d\xcc\x6c\xaf\xc7\x02\x9d\xb0" - "\x8d\xe9\x6f\xa4\xf3\xfe\x02\xaf\xc7\xcc\xf6\x0a\xcf\x9c\x95\x16" - "\xfe\xbe\xdb\x68\xb9\xe6\xac\xa7\xb7\x5a\x79\xdf\xc1\x63\x01\xfd" - "\xfc\xfd\xb0\xba\x33\x63\x19\x4f\xe4\x4d\xea\xcf\xdb\x9d\x69\x72" - "\x15\xa9\x3a\x43\xd2\x86\xcc\x29\x42\x59\xee\x6f\x3d\x4d\xe9\x92" - "\x3f\x2d\xe8\xb7\x8f\x38\x4e\x5f\x37\xe6\xbe\x65\x99\x31\xc1\xee" - "\x4c\x2d\x00\xd8\x18\x3f\x89\xf2\x3b\x73\x7e\x8f\xfe\xad\x97\x4e" - "\xc8\x80\x76\x12\xe5\x9e\x54\xe4\x33\x31\x5c\x3e\x13\xcd\x71\xf2" - "\x45\xdc\xf9\xa8\xfa\xa3\x28\xfb\xac\xd3\x59\xf2\x63\xf0\xe4\x86" - "\x22\x96\x09\x01\xf3\x9e\x6c\xdb\x73\xac\x63\xfc\xf4\x0b\xee\xff" - "\x00\xc6\x69\x20\x6e\x4f\xf6\x84\x4e\x8a\xe1\xef\xfd\xa9\x35\x8d" - "\x0d\x57\xf3\x19\x70\x7b\x50\x40\x6f\xdb\x20\x79\xcf\xd2\xc5\x7e" - "\x55\x7b\x72\xa4\x2f\x53\xfc\x27\x6e\x97\xaf\x93\x9a\x4b\x3f\xa5" - "\x66\xbf\xab\xf4\xf0\x79\x8f\x49\xf9\x34\x99\x00\x77\xc3\x38\x7e" - "\x67\x07\xbf\x67\x05\xea\x69\xb0\x35\x65\xb6\xf5\x30\x0f\xfd\x4d" - "\xd9\x50\x1b\x8a\x0c\x1b\xef\x2b\xda\xd0\xc6\xe7\xc8\x85\xb0\x52" - "\x70\xfd\xef\xf8\xbb\x16\x76\xd1\x93\x4c\x13\x56\xf1\x1a\xcf\x86" - "\x3d\xd0\xdd\xd3\x74\xb8\xe7\x74\xb8\x6d\x97\x83\xcb\x3c\xd3\x5c" - "\x2d\xf7\x33\xd0\xa6\xdf\xb5\x05\x00\x3b\x10\xdf\x98\x08\x19\x6e" - "\xb7\x7f\xc9\x6b\x7d\x9b\x6e\x40\x3d\x6d\xad\xfe\x36\xe2\x98\x14" - "\xb5\x41\xcc\x71\xe7\xac\xa4\xfb\x6f\xd9\xcf\xd2\x46\x5e\xab\x4e" - "\x84\x2d\xca\xeb\xf8\x76\x96\x93\x6c\xd7\x96\x04\x68\xa8\x0b\x5a" - "\x0d\x9f\xa7\x06\x8c\xab\x3f\xe4\x3d\x13\xc8\x9a\x80\xb0\x6a\xef" - "\x5e\x74\x13\xfb\x68\xc8\xf3\xd5\x6b\xaf\xdf\x3e\x7c\x0d\x4d\x15" - "\x9a\x45\xfa\xe7\x05\xcb\x3f\xee\x44\xdf\x4e\x52\xfe\x62\xbb\x8b" - "\x43\x7c\xc5\x62\x51\xd7\x2b\xec\x2b\x26\xcc\xbb\xd3\x6b\x78\x0f" - "\x23\xee\x13\xa7\x27\xae\xbd\x41\xa0\xef\x7a\x1c\x1b\x1b\xdd\xf4" - "\x53\xb9\x66\xbb\x81\xfd\xab\xa5\xbc\xde\x34\xce\x13\x77\xb0\x51" - "\xa8\xb3\x57\x31\xc1\xe5\x81\x86\x8a\x2f\xc8\xa4\xe8\xb2\x69\x48" - "\x6b\x57\x8f\x53\x94\x1d\x6c\xe4\xb3\x33\x7a\x1d\x16\xd4\xf1\x17" - "\x51\x7e\x10\xb0\x36\xe9\x32\x83\xef\x37\x7a\xf8\xbd\xbf\x2f\x19" - "\xba\xd1\xc6\x9c\x9a\x5e\x5e\x4b\xde\x98\x28\x1c\x37\x39\xbb\xcd" - "\x07\x1b\x1f\xb3\xb2\x7e\xb4\x69\x92\x3b\x66\x5f\xa3\xbe\xbe\x24" - "\xcf\x8c\x47\xae\x0b\xf5\xf7\xe5\x0e\x6b\xbc\x0b\x40\x60\xef\x25" - "\x9d\xa6\xca\xb7\x7a\x1d\xa4\xf5\x41\xaf\xeb\xd5\xa0\xbf\xef\xc8" - "\x4c\xd8\x34\x8a\x52\xf1\x6e\xd4\x69\xda\xb4\xd1\xaf\x51\x12\x7e" - "\x89\x9e\xeb\xf3\xe2\x00\x37\x8d\xd7\xde\x5a\xce\xf3\x5a\xcb\xa6" - "\x33\x52\xef\xda\x4e\x63\x83\x80\xc7\xfb\x05\x15\xa3\x68\x2c\xaf" - "\x7f\x21\x2d\x39\x2b\xa0\xf6\xcd\x0c\x5b\x7d\xed\x28\x4a\x09\xaf" - "\x77\x93\x7e\x16\xbc\x52\xae\xa5\xaf\xf0\xd0\x8d\x05\xf7\xf3\x77" - "\x01\x2b\xf2\x84\x23\x56\x88\xeb\xad\x9a\xda\xcf\xae\x78\xc4\x52" - "\xad\xf8\x4f\xee\x13\x81\xef\x78\x1f\x4e\xdf\x93\x88\x91\x67\xe5" - "\xe3\xf7\x7a\x44\x5f\xb2\x16\xb2\xfe\x98\x28\xf1\xd0\xcf\xb9\x06" - "\xd6\xde\x96\xcd\x30\x18\x9f\xac\x05\x6a\x3f\x83\xcf\xc0\x82\xc6" - "\x32\x1e\xeb\x86\xed\x94\xf0\xd3\xed\x94\xd8\xb2\x90\xdb\x55\xa1" - "\xca\x68\x26\x62\x7c\x83\x65\x3c\xde\xc0\x1b\xc0\x9b\xeb\x93\xdf" - "\xd4\xf5\x9f\x73\xda\x0b\x45\xd0\xf9\x1c\xeb\x95\x15\x1f\x38\x97" - "\xee\xa5\x39\x7c\x66\x98\xcf\x0b\xcd\x27\x4f\x1d\xe0\xd5\x8d\xa2" - "\x44\xc0\x6a\x71\xe5\x13\xaf\x77\xdf\xec\x5c\x7a\x88\x61\x9f\xe0" - "\x79\x65\x23\xe8\xa3\xe6\x97\xca\x2a\x97\xaf\x9d\x5a\x30\xce\x67" - "\x17\x88\x00\xc3\x39\x45\x95\xd7\xc9\xf6\xee\xb0\xda\xb2\xd4\x39" - "\x65\xd9\xd6\xfe\x7d\x22\xbd\x1d\xae\xf3\x0c\xaf\x32\xc5\x95\x0d" - "\xfb\x56\x6f\x93\x41\x6b\xc5\x5f\x95\x8b\x9c\x4b\x77\x11\xf7\x0f" - "\xe7\xc7\x73\xa6\xab\x0b\x79\xcf\x84\xf7\x0b\xe7\xc1\xbb\x72\xc0" - "\xfd\xee\xc0\x5e\x27\xef\xc1\x0d\xe4\xa9\xd9\xce\xe7\x21\x36\x35" - "\xef\x00\x8d\xd4\x9a\x71\xc5\x05\xc6\x15\xa3\xc8\xeb\x2a\xfc\x34" - "\xba\x1f\x23\x64\x00\xf8\x7e\x4d\xab\xdc\xf3\xa9\xfc\x7c\xb6\x3f" - "\x28\x94\x5c\xfb\x59\x75\x10\xf2\xc0\x8d\x2b\xcb\x04\x29\x57\xee" - "\x60\xdf\x91\x9f\x6d\xb3\xc4\xa8\xfe\xe5\xb6\xb0\xee\x13\xad\x8f" - "\x43\xf6\xa3\xd8\x97\xb3\xbf\x8f\xf9\x9b\x66\x41\xde\x53\x1c\x05" - "\x7a\xf7\x59\x49\xf1\x9f\xa8\x04\x5c\xdd\x3f\x7e\xf7\x61\x7d\x5e" - "\x3c\xdc\x1d\xb7\x27\x5f\xbc\x6c\x25\xc3\x9f\x14\xe3\x37\x2f\x4b" - "\xf9\xe8\x5a\x59\x56\xd5\x69\x6a\xec\x30\x8e\x7a\xd9\x46\xb5\x8f" - "\xff\xb3\x4c\x94\x8f\x2e\xe3\x63\x21\x7f\x1c\x10\xd7\x68\x0f\xcf" - "\x9f\x02\x32\x0b\xf3\xc2\x50\x97\xb7\x57\xff\x76\xdc\x6b\xd7\x42" - "\x67\x1e\xca\x67\x13\x0c\xdc\xae\x6c\xef\xe8\x67\x6e\x65\xa7\xbc" - "\x66\x33\xd6\x5e\x84\x19\x34\x76\x58\x04\x9f\xe1\x61\x5f\x73\x6f" - "\xdc\x67\x98\xd7\x3d\x36\x35\x6e\x5e\x9b\x0e\x9d\x57\xca\xdd\x2c" - "\x1f\x95\x72\xbb\x78\x6f\x10\x36\xd0\x50\x6e\x33\xe0\xe4\xb9\x69" - "\x61\xb3\x9a\xd7\x15\xec\x41\xd7\x3e\x8c\xb6\xa1\x4d\xb2\x6d\x68" - "\xa3\x6c\x9b\xfe\xcd\x15\xd4\x25\xcf\xee\x5e\x59\x7b\x5e\xd3\xf5" - "\xfd\xcf\x3c\xfc\x5d\xc8\x53\x54\xb5\x5a\xfa\x5b\xa3\x4f\xd4\xfa" - "\xfa\xe6\x49\x22\xfe\xa7\xf1\x57\x06\x73\xb3\x49\xc1\xf4\xd8\x7e" - "\xce\xf1\xd9\xf4\xef\x36\x01\x76\x2e\x64\xba\x8d\x6d\x83\x6e\xd4" - "\xc7\xdf\xbc\x1b\x90\x43\x9b\x3b\xb9\xaf\xee\xd8\x4b\x69\x8a\x0f" - "\x37\x7f\x56\xab\xbe\xb9\x03\xdd\x60\xf3\x06\xf0\xbd\xfa\x66\x4d" - "\xbf\xef\x71\x8c\xf4\x3d\x0e\x95\xb1\x57\x88\xa3\x94\x77\x22\xfe" - "\x63\xe8\x55\x9b\x8b\x79\x3f\x9d\xf1\x5d\xe1\x37\xe4\xdf\xe6\x62" - "\x63\x6f\x49\xee\x27\xaf\x04\xaf\x94\xa8\xb3\x8b\x3d\x8e\xaa\xd1" - "\x86\xae\x22\xbf\xd3\xe3\x10\x47\x39\xdf\x9c\x95\xe7\xe4\x7e\x73" - "\x85\x3c\xa7\x7b\x5a\x3f\xe3\x52\x75\xa7\xbe\x36\x91\xcc\x7e\xdf" - "\x28\x0b\xfd\xef\x90\xf4\xe3\x67\x1a\x70\xdd\x12\x77\xf9\xad\x9c" - "\xaa\xc2\x81\xfd\x84\xcd\x19\x32\x5d\xfa\x42\x56\x6d\x30\x78\x04" - "\xed\x1d\xaa\xe2\xe5\xbd\x76\xe1\x48\x0a\x49\x1e\xe8\x16\xd6\xf8" - "\x5b\x6a\x98\x27\xab\x0e\x85\xd2\x69\x8e\x3f\x68\x57\x32\x68\x73" - "\x8d\x90\x63\x7d\x73\xcd\x57\xeb\x15\x3f\x8f\x33\x74\x12\x45\xe7" - "\x44\xc8\x97\xad\xc7\x24\xad\xcb\xb6\xd6\x73\x2c\x83\x97\x4b\x38" - "\x1e\xcb\xcf\xff\xc8\xb1\x6e\xfc\x65\x5b\x9d\x01\x3e\x0f\xb5\x90" - "\x7d\x52\xb6\xb6\x9d\x2a\x20\x2d\xab\x80\xf7\x50\x0e\x96\xb2\xad" - "\x26\xec\xd0\x09\xe2\xa1\xa7\x60\x9c\xaf\x5e\x44\x96\x27\xf3\x00" - "\xdb\x9e\x9c\xc4\xb1\x68\x38\x0e\x0d\xc7\x93\x0a\xd8\x93\x47\xe0" - "\x7e\x24\xf4\xba\x44\xfe\x36\x3c\xfb\x5b\x04\x1c\x02\xf2\xf8\x38" - "\xc7\xc3\xd1\x5c\x1e\x1f\xad\x3e\x43\x66\x8e\x75\xe3\x2f\x3f\x58" - "\xdd\xea\xfd\x4c\xda\x29\xc3\x0b\xa0\x9b\x07\x69\x34\x68\x6e\x0d" - "\xc6\x1d\x84\x3e\x7c\x70\x9d\x6a\xf7\x39\xa1\xda\xad\xf0\x66\xfc" - "\x95\x8c\xdb\xd6\x56\x22\x71\xdf\xfa\x82\x1f\xf0\x83\x65\xb5\xcd" - "\x81\xb2\xda\xa3\xea\x1c\x55\x33\x95\x14\x8a\x4e\x17\x74\x64\xf6" - "\xf9\xe3\x33\x65\xec\xcf\xc1\x6d\xe4\xf6\x71\xdd\x7f\x3a\x7f\x46" - "\xc6\xee\xf1\xe3\xd9\x9e\xaf\x97\xe9\x42\x99\xae\x66\xea\x2d\xab" - "\x95\x6d\x6f\xf5\xaa\xb2\x59\xf2\x9e\xcb\x87\xd0\x41\x6f\x73\x3f" - "\x1d\xd0\x76\x6e\x1f\xb7\xdf\xcf\x34\x01\x0d\xf4\xb6\x5a\xfb\xf4" - "\x76\x72\x1b\xff\x13\xb3\xce\x76\xb4\x13\x6d\x95\xed\xec\x43\x3b" - "\x8f\xe6\x11\xf9\xd6\xff\x95\xbe\x8c\xaf\x3d\xca\xb6\xa6\xfd\x23" - "\xe8\xd3\xc5\x95\x04\x9b\xd2\xb4\xaf\xa4\x52\x5b\x0f\xdd\xa4\xc4" - "\x03\xdb\xd2\x23\x3a\x59\xef\x77\x15\xe0\xe7\xaf\x91\xdf\xdc\x94" - "\x7a\x32\x7f\x33\xf1\x45\xb4\x29\xf8\x39\x95\x74\x8a\x4e\xe8\xa8" - "\x3e\x97\x1f\x79\xf2\xd0\x7e\xd8\xa2\xa7\x74\xfc\x39\xef\xea\x2f" - "\x54\xbb\x2c\xf9\x94\xf4\xfe\x8f\xcb\x34\x57\x7b\x19\x19\x6d\x79" - "\x0a\xf9\xd0\x1e\x2b\x60\xc9\xb8\x71\x41\xb4\x73\x07\xf0\xf4\x85" - "\xb4\xa9\xa5\xcb\x07\x98\x7f\xa1\xf8\x0c\x8a\xd9\x7e\x16\xed\x38" - "\x4b\xd6\xca\x12\xe8\x5f\x8f\xb2\xde\xb8\xe5\x8d\x6f\x64\xd2\x58" - "\x37\xfd\x5c\x7d\xaf\xa2\xff\xbb\xe6\x5b\x5b\x8c\xf8\x19\x41\x8e" - "\x3f\x14\x77\xb0\x86\xf9\x48\xc6\xd2\xe0\x39\xa3\x07\x3c\xc3\xbe" - "\x18\x2b\x50\x47\x4f\xf2\x48\x89\x8f\x43\xc5\xdf\xc0\x33\x7f\x47" - "\x25\x89\xd7\x17\x50\xae\x5a\x80\x66\x0c\x1f\xfa\xdc\x3a\xbe\x32" - "\x0d\xa3\x9e\x4f\x78\x9b\x20\xeb\xa0\x6b\xc2\x8e\x6e\x28\xf1\x68" - "\xaf\xbc\x4d\x29\x57\x26\x53\xb6\xfa\x07\x93\xdf\xbc\xae\xcf\xf0" - "\xd0\xb6\x11\xa7\xa9\xfa\x44\xf8\x18\xb3\x49\x59\xa6\xe4\x60\xf5" - "\x1e\x5e\x4b\xbf\xb2\x7a\xab\x55\xdc\x1e\x87\x28\xbb\xc2\x72\x7b" - "\x0d\x3c\x70\x9f\x37\x18\xee\x57\x4e\x87\x6d\xa6\xc1\x60\x6d\xdc" - "\x22\x63\x29\xd9\x37\x6d\x81\xbc\x80\xae\x70\xc4\xca\x71\x6d\x31" - "\x77\xee\xf2\xd2\xb2\x9d\x64\xb6\x9f\xe1\xf5\x9d\x59\x74\xa4\x26" - "\x95\x6a\x61\xdf\x8b\xee\xe4\x11\x9b\xcf\xf3\x9e\xba\x92\x21\xac" - "\x93\xb6\x7a\x51\x66\x59\x72\x62\xc5\x16\x43\x87\xdf\xd6\x52\x7c" - "\x81\x34\xf5\xdd\x80\x6d\xcd\xe9\x36\xe1\xaf\xd2\x82\x79\x35\x1c" - "\x5b\x26\xbe\x9d\x75\xd0\x3c\x23\xd6\x8a\xd4\x7d\x8a\x30\xe6\xba" - "\xad\xf1\x1b\x97\x52\x0a\xc7\x85\xb2\x78\x94\x2e\xa7\xe6\xeb\x6d" - "\x2c\x63\x13\xf5\x7d\xe4\x44\x15\x7f\xa5\x3a\xbd\xee\x3c\xea\x92" - "\xef\xb7\x8f\x0f\xc0\x96\x91\x70\x97\xd2\xd8\x9a\xf3\x94\xcc\x7a" - "\x50\xd6\xe7\x4a\x67\x63\xfb\x70\x56\x97\x45\x04\xfe\x77\x32\xed" - "\x3c\x3d\x10\x37\xca\xb3\x8c\x63\x4d\x09\xeb\x60\x67\x44\x2b\x46" - "\x4a\x9f\x11\x19\x03\x40\x7d\x57\x8a\xa8\xea\x35\x32\xf1\x77\x14" - "\x79\xad\x8e\xd7\x79\xf9\xac\x88\x9a\x43\xb6\xd7\x18\x71\x75\xa2" - "\xcb\xf2\x4f\x9c\x13\xa4\x8e\xf5\x89\xf3\xca\xfa\x6d\xfb\xe1\x41" - "\x6d\x15\xc0\x64\x3e\xf8\xef\xc1\xdd\x91\x74\x19\xbd\xc6\x14\x2c" - "\x53\xb6\x59\x70\x28\x6c\x46\x4f\x8f\xd3\xb9\x9c\xe7\xb7\x1d\x95" - "\x7c\x96\x66\xc0\x1e\xdb\xf1\x22\xbf\xe3\x34\xf6\xf5\x4e\x93\xfd" - "\xbe\xa3\x91\x6d\x34\xdd\xce\x7d\xdf\xd6\x9f\xa6\xf4\x2d\x9e\x77" - "\x99\x5e\x75\x6a\xfd\x7a\x78\x8f\x63\xc7\x31\x63\xee\x65\x1d\x44" - "\x7d\x6f\x72\x47\xa7\x3b\x66\xbf\x67\x30\x5a\x1a\xeb\xf9\xd2\xa7" - "\x8b\xe3\xfa\x38\x6a\xac\xc6\x5c\x2c\xbf\x27\xb0\x76\xd4\x83\xcb" - "\x56\xd2\xe8\xc7\xae\xe3\x3d\x6d\x79\x26\xa2\x53\xe9\x08\x35\x69" - "\x03\x7b\x63\x69\x92\x37\xe4\xb7\xc2\xd8\x1e\xd2\xa0\x2f\xa8\x78" - "\x56\x5d\x4a\x57\x30\xce\xc3\xd6\x3c\x19\x52\x4f\x69\xff\x9c\x8f" - "\x3a\xd8\xb7\x81\xe1\x2b\x3d\xaa\x66\x22\xd7\xc1\x76\xa0\xd2\x05" - "\x6a\x26\x5e\x86\xbe\xc9\x4c\xdf\xa0\x6e\xfb\xba\xba\xfe\xae\xe8" - "\x5b\x44\xb1\x13\xaa\xc8\xfa\x7e\x89\xdb\x84\x39\x26\xc6\xb6\x94" - "\x2c\xa8\xff\x23\x7e\xcf\xe3\xd2\x79\x07\xaf\x41\xee\x1c\xef\x62" - "\x1d\xa3\x2f\x33\x61\x36\xaf\x4f\x48\xbb\x61\xe7\xe8\xf1\x28\x87" - "\xb4\x11\xef\x9d\xf5\x99\x2a\x56\x51\x0a\x7f\x93\x0f\xe9\xd2\x07" - "\xc1\xf3\xcd\xe7\x7b\x6e\x49\x22\xeb\x2d\x55\xec\xef\xbe\x33\xdd" - "\x1d\xf3\x76\x8a\x5c\xeb\xe2\xfa\xd7\x7b\x32\x38\x96\xd7\xfe\x5e" - "\xf7\x10\xd5\x57\x3b\x4f\xe0\x39\x39\xe4\x79\xb5\xb1\x87\xe0\xa6" - "\x9d\x6e\xb9\x0f\xc9\x3e\xbd\xd2\xdf\xb5\xbd\x71\xc0\x57\x66\xe7" - "\x09\x1d\x97\x13\x47\x0a\x88\x76\xf2\x39\x86\x91\xa2\x0d\xf5\x41" - "\xff\xd9\xe1\xd5\xd7\x90\xda\x24\x5f\xb1\x6e\xfe\x2a\xdb\x8b\x7f" - "\x77\x6e\x44\x3e\x9e\xd3\xb2\x8a\x28\x4d\xd9\x1b\xed\x6d\x41\xf0" - "\xcf\x40\xfb\x77\xce\xe2\x35\xce\xa8\xf2\x7b\x3b\x91\x2c\x53\xfe" - "\xb1\x4f\xfa\x57\x95\x9f\x6f\xc0\xd5\x8c\xb1\x70\x14\xd7\x04\xf0" - "\x1c\x5f\x13\x71\x75\xe2\x9a\x04\x3d\xb7\x92\xf9\x12\xf6\xb6\x15" - "\x36\x8d\xb9\x3b\xee\x63\xcf\x60\x67\xf1\x98\x36\xae\x75\x8f\x93" - "\xf2\x17\xad\x6d\x6a\xf1\x40\x97\x04\x39\x97\xf9\x45\xaf\xed\x46" - "\x3e\xf3\x52\xdb\x64\xdf\xc9\xfe\x1e\xb5\xd5\xe1\xfe\x1e\xb5\x8d" - "\xf8\xf9\xc0\xe1\x33\xf1\x83\x1e\x59\xdb\x34\xf0\xab\x6b\xec\x71" - "\xd4\x36\x81\x8e\x7e\xa9\x6b\x5e\xd1\x78\xad\x95\xdf\x88\xab\x60" - "\x1b\x2e\xee\x77\x4e\xd5\x5e\x0f\xe1\xd9\x2c\xe2\x3c\x69\x7a\x7b" - "\xdb\xf1\x9c\x68\xb3\x63\x0e\x8e\x03\x4d\x46\xa1\xcd\x71\xe7\x1b" - "\xb8\xbd\x8c\x6f\x77\xdc\x27\x47\x43\xcf\x21\x32\x4c\x6e\xbf\x27" - "\x0e\xe5\x40\x4b\xf1\xad\xa9\xd9\x06\x3d\x75\x3a\xf1\x7e\x95\xd6" - "\x0d\x18\x4a\x67\x43\x7e\xc0\x30\xf2\xf7\xd3\x7e\x14\xc7\xc7\x47" - "\x9f\x22\x1f\xec\x77\xb3\x71\xc6\xb1\xc7\x51\xd7\xf0\x41\xbe\xda" - "\xcb\xe0\xb2\xde\x90\xb2\x7c\x36\x3e\xac\x7c\x5c\x48\xdf\x8d\x42" - "\x5b\xe2\x0e\x36\xe8\x7d\x47\x3a\x2e\x49\x0a\x97\xf6\x86\x53\x54" - "\xfb\xa1\xc2\xa7\x6e\xd7\x60\x63\xac\x64\x0c\x74\x54\x48\xe4\x09" - "\xca\x76\x9d\xec\x1a\xed\x25\x57\x4d\x10\x7a\x4b\xbb\x27\xad\x44" - "\x38\x4f\x51\xfd\xea\x56\x5f\xe7\x15\xce\xe9\xf5\x32\x4e\x95\xe8" - "\x2d\x25\x57\xf1\x5d\xf2\x1b\xb5\x67\xe9\xf5\x7d\x2e\x8f\x8c\xf5" - "\xcc\xf7\xd2\x87\x97\x7d\x31\x78\x7e\xe3\xd8\x67\xc6\x3a\x41\x10" - "\x79\x6b\x39\x1d\x69\x2e\xaf\x47\xc6\x58\x1b\xf0\xa5\xfe\xb8\x5d" - "\x8d\xb5\xd7\x73\xe5\xf9\x6d\xc6\xd7\xff\x7d\x27\xe3\x1c\x2c\xfb" - "\xb8\x9d\xdb\x60\x87\x0d\xeb\xf2\xf7\x38\x79\xac\xd8\x96\xf3\xba" - "\xe7\xeb\x0f\x80\x1f\x45\xb0\xfc\xe3\xf6\x2b\x6b\xc3\xeb\x32\x46" - "\xb0\xdd\x2f\xce\x7a\xe2\x3e\x6e\x67\xbd\xaa\xa2\x64\x88\x79\x5a" - "\x8d\x70\x76\xc7\xb7\x43\x46\xbe\x9e\xf3\x41\x91\xea\xb3\x2b\x84" - "\x9b\x63\xb4\xbd\x56\x6f\x3b\xe8\x25\x79\x76\x42\xb5\x8a\x29\x87" - "\x3c\x35\x83\xcf\x65\xed\x6d\x3c\x97\xb1\x9f\xa7\x4e\x8b\xae\xfe" - "\x39\xe3\xca\xf0\x18\x3c\x36\xf6\x40\x1d\x7d\xaa\x8e\x5f\x64\xfc" - "\xf7\xea\xf8\x45\xc6\xe5\xea\x80\xcc\xb8\xe1\x34\xfd\xe2\xf8\x95" - "\xdb\xbf\xbf\x90\xf6\x2f\xe4\x6a\xbb\x92\xa5\xbb\x66\x05\x60\x83" - "\xfa\xcd\x1e\x92\xdf\x93\xd1\xa8\xd4\xe5\xf6\x93\xbf\xec\x77\xce" - "\x96\xa2\x5e\x72\x2e\xff\x33\x75\xd0\x2f\x65\xfc\xd7\x96\x42\xb6" - "\x3b\x3d\x69\x7d\xeb\x3f\x49\xeb\xd3\x7e\x91\xc2\xf4\xde\xc9\xf1" - "\xfb\x42\xf8\xac\xd5\xfb\x67\x72\x65\xf3\x5a\x71\x1b\xaf\xd1\xa7" - "\x41\x6e\x50\x10\x32\x03\x76\x46\x40\xd2\x03\x3a\x98\xb2\x19\x3f" - "\xeb\x94\x36\xa3\x47\x9e\xcb\xbb\x0a\xba\x7b\x82\x70\x2c\x5c\xc7" - "\xeb\xf8\x81\xbe\x4c\x5b\x8f\x83\x32\x38\x96\x1e\xaf\xa1\x0b\xf3" - "\xee\xf9\x73\xfc\xb1\x42\xda\x84\xb0\x5f\x38\xa6\x9e\xcb\xeb\xa6" - "\x00\x6c\x81\x9a\x8b\x94\x54\x03\xfd\x19\xb2\x3c\x91\xe5\x7d\x9d" - "\x1e\x53\x6f\xe3\xc5\x81\x98\x7a\xb5\xbc\x5e\xd5\x8e\xfb\x8b\x64" - "\x0a\x94\x7f\xd6\xb9\xe3\x22\x8d\xdd\xb9\x9c\x92\x77\xf0\x7a\xe4" - "\x3f\x94\xfe\xc6\xfa\x86\x8c\xaf\xb7\x24\x99\xf7\x26\x06\xf4\xb7" - "\x15\x1c\xf7\xb3\x5f\x9e\x99\xe4\x3a\xce\x15\xd1\x7b\x97\xfc\x46" - "\x80\xbf\xec\x63\x9f\xdf\x7c\xbe\x01\xb4\x3b\xea\xa6\x5f\xce\xec" - "\xd3\x5e\x3f\x1a\xad\x6f\x0d\x5f\xab\xaa\x90\x98\x88\x1f\x8c\x55" - "\x72\x1f\xb0\x06\x8f\xcb\xb6\x23\x93\x26\x74\x51\xaa\xf2\x9f\x88" - "\xc3\x5c\xb9\xcb\xcb\xfb\xf9\x25\x2f\x90\x35\xb0\x63\x7e\x8c\xfd" - "\x75\x8a\xe5\xef\x17\xf3\xaf\xe4\x0b\xd1\x39\x21\x9f\x52\x79\x2f" - "\x85\x7d\x2c\x6c\x2f\xcb\xfc\x1f\x8e\x2d\xa6\xd4\x50\xd8\xd3\x95" - "\xf3\xd3\x7d\xb6\x19\x8b\x9f\x59\xf2\x42\xc1\x82\xc2\x45\x4f\x2f" - "\xca\x5f\x54\xb8\xf2\x3e\x19\x4c\x58\xfe\x7b\x78\x5c\xce\x5c\xb9" - "\x09\x1e\xa2\x77\x8c\x1d\x58\x53\x7c\x63\x75\x80\xd7\x40\xae\x88" - "\x5e\x6f\x4c\xd7\xf7\x15\x3d\x3b\xe5\x3e\xdb\x1b\x95\xd0\xd3\x48" - "\xad\x6d\x7c\xe2\xdc\xa8\xe2\xa1\x74\x3a\x6f\x0e\x30\xfc\xe9\x8a" - "\x97\x3d\x95\xe0\xe5\xc9\x27\x69\xcf\x7c\xde\xdf\x41\x7f\x1d\x75" - "\x15\x9f\x26\xe8\x28\x93\x79\xdf\xa8\x85\xd7\x64\xa4\x0e\xff\xa6" - "\x3a\xc3\x70\x56\xc6\x06\xda\x75\x12\xcf\xec\xab\x1e\x14\x99\x3b" - "\x02\x4b\xac\xbb\x82\x4b\xac\x6f\x0a\x91\xb9\x3d\x78\x2e\x6f\x87" - "\x38\x97\xb7\x7d\xe0\x5c\xff\x9b\xd7\xfa\x1d\x14\x8b\x1f\x78\x61" - "\x5b\x62\xc8\x1e\x22\xbf\xbb\x97\x61\x16\x2c\x65\x5f\xae\x37\xd9" - "\x3f\x1a\xb6\xff\x36\x8b\xc7\x9e\x17\x3b\xb3\x03\x3c\xaf\xea\xcd" - "\x75\xad\x3b\x45\x6a\xdf\xf8\xcd\x1c\xa7\x5c\xe7\x7e\x33\xc0\xe5" - "\x78\x9f\x91\xf5\x7e\x19\x3f\x54\x7b\x43\xfa\xf2\xb1\xce\xbf\x73" - "\x04\x25\x56\x8e\xa0\x84\x1e\xc7\x9b\xfd\xfe\x5f\xc2\xac\xe6\x56" - "\x9e\xdf\x38\xde\x2d\x64\x4c\x0f\xcf\x95\x8c\x07\xf3\x25\x60\x1e" - "\xe6\x3d\x48\x75\xee\xe7\x4d\xf0\xd9\xc2\x3d\x57\x2e\x63\xdf\x94" - "\x6b\xf2\x42\xb3\x8b\x09\x1b\x28\x5b\xee\x0f\x2b\x3f\x45\x13\xc6" - "\x61\x86\x6a\xcf\x9e\x7b\xe4\xde\xfe\xf2\x33\xf5\x18\x27\xa5\x75" - "\xbd\x94\x10\x2c\xdb\x3d\x97\xf5\x99\x96\x62\xb9\xaf\x6e\x46\xb9" - "\x06\xde\x77\x97\x67\xe5\x64\xfc\xe4\x3f\x53\xdd\x05\x32\x75\xd0" - "\xee\x74\xde\x1f\x18\xa0\xed\xee\x6d\xbc\x2f\x24\xd6\x6f\x29\xb3" - "\x14\x6b\x65\x0c\x23\x78\xf1\xec\x24\xa3\x1c\xe6\xf0\x61\x5c\xee" - "\x24\xed\x5e\x2d\xcb\x71\x5e\xf9\xed\xbd\xc4\xf9\x98\xb7\x7c\x9c" - "\xdf\x8f\xe7\xda\x60\x62\x86\xc0\xf8\x0a\x2c\x0f\x34\xe0\xdd\xdc" - "\x60\xd9\x27\x47\x91\x96\x29\xd7\xa5\xfb\xac\x24\x63\x74\x98\x0f" - "\x36\xba\xdc\x7f\x77\x4a\x7c\xd8\x5f\xb5\x10\xb2\x48\xea\x7f\xbb" - "\x3f\xaa\xfd\x87\x8c\xeb\x8c\x3e\xdc\x93\xa3\xf3\xc8\x1e\x85\xdf" - "\x9e\xdc\xee\xf5\xb5\x47\xbb\xcd\xed\x47\xbd\x9a\x99\x8e\x58\xd9" - "\x2f\xde\x53\x79\xc4\xda\x0b\x1b\x62\x4f\x8a\x5b\xfb\xb9\x4f\xe9" - "\x1e\xaa\x1c\xef\x4b\x41\x2f\xed\x8a\xb5\x0e\xef\xc3\xfb\x99\x86" - "\x7f\x07\x7f\xaf\x9a\xf7\xa5\xdc\xb4\x7b\x2c\xd3\x0d\x7c\xde\x2c" - "\xf7\x26\xd6\x3e\xc1\xf1\xe5\x87\xb2\x0f\x1e\xd3\x99\xcf\x1f\x58" - "\x70\x2f\x96\x8b\x49\x16\x7f\x9a\x56\x27\xcf\x1a\xca\x33\xec\x13" - "\xf5\x38\x23\xa9\x7a\xdc\x91\x14\x7e\x56\x67\xe0\xf7\x1c\x32\xce" - "\x9c\x73\x6c\x15\xfd\xbc\x98\xf4\xeb\x93\x31\x47\xce\xab\xbd\x5d" - "\xf6\xeb\xe3\x35\x4d\xf6\x93\xe7\xfd\x57\x94\xeb\x0a\xf1\x8d\x8f" - "\xc1\xb3\xdf\x88\x35\xd2\xe3\x78\xcb\xdc\xef\x2f\x84\xb6\x77\x97" - "\xb5\x3b\xbd\x66\x4f\xa5\xb7\xec\x63\xcc\xdf\x6f\x8d\x85\x2c\xca" - "\xbf\x8c\xed\x64\xe2\xb3\x87\x1c\x5f\x22\x18\xbf\xbb\x98\x63\x4c" - "\x70\x2c\x2b\xe5\xdf\xfe\xd6\x2b\xfa\x99\xee\xd8\xb3\xf4\xd6\x03" - "\x03\xfb\xa0\x01\x7d\xed\xee\xad\xbd\x4a\xef\x7a\x6b\xaf\x5c\xbb" - "\x5b\xdf\x5e\xff\xcb\x55\x3e\xad\x61\x95\x5b\xab\x95\xe7\xbb\xde" - "\x02\xed\xf6\xe7\x1b\x3e\x32\xc8\x27\xe3\x4c\x45\x9f\x27\xf7\x4d" - "\x52\x30\x7f\x25\x63\x94\x0e\xd8\x37\xbf\x52\xdf\x3d\x5a\x3b\x2a" - "\x3b\xc8\x73\x5e\xfc\xef\xda\xa4\x6f\x49\xc1\x79\x5e\xc3\x1b\xaa" - "\x6c\x2d\x95\x47\xf7\xcb\xbc\xe6\x74\xf8\xf3\x08\x7e\x56\x34\xfb" - "\x55\xaa\xb1\x1f\xb0\x49\x0b\xba\x2d\x31\x24\xec\xf5\xc2\xcb\x31" - "\xcc\xa0\x4f\x79\x5c\x98\x43\x51\x87\x80\x7c\x18\x86\x32\xb9\x4c" - "\x7b\x35\x86\x7e\x25\xbf\xef\x11\x74\x4c\x15\x76\xd6\x23\x3d\xec" - "\xdb\x72\x9e\x90\xef\x6a\xe4\xfb\x59\x53\x71\x17\xfb\xce\x4c\xe7" - "\xd8\x60\x1d\x7a\xdd\x9e\xb8\x7d\x93\x6e\x49\xa0\x6c\xd4\xb9\xcb" - "\x4d\xc5\xc5\x57\x3e\xb6\x7f\x35\xa8\x2e\x3b\xd0\xae\x5f\x27\x0d" - "\xf4\xc9\xdf\xf4\x3e\xf9\x75\xd2\x57\xed\x21\xeb\x3a\xc9\xb5\xa7" - "\x69\xdf\x10\xb6\x9b\x71\x7f\xd3\x69\xda\x2b\xf7\x28\x95\x2f\xf2" - "\xde\x3f\xea\xf7\xa8\x63\xef\x3b\xfa\xfd\xf5\xb8\xdf\xa6\xdf\x8f" - "\xc2\xfd\x1a\xfd\x1e\xf4\xde\xbb\x48\xbf\x4f\xc2\xfd\x23\xfa\x3d" - "\xc6\xe7\xde\x7b\xf5\xfb\x91\xb8\x1f\xa3\xdf\x5f\x87\xfb\x38\x7d" - "\xef\xcd\x0c\x7c\x2f\x5c\xb9\x5e\xf4\x6b\xa7\xda\xdf\xe1\x7d\xb5" - "\x37\x52\xd4\x98\xee\x4f\x4b\x82\x7d\x39\xd7\x58\x5f\x47\x7a\x23" - "\xd7\x83\xf4\x14\xf0\x5f\x6a\x48\xfa\x1e\x3d\x7f\x3a\xf4\xac\xca" - "\x90\xf4\x1a\x3d\x7d\x3e\xf2\x37\x86\xa4\x57\xea\xe9\x85\x6e\xaa" - "\x3a\x1e\x92\xbe\x4e\x4f\xdf\x60\xec\x69\xeb\xe9\x45\x7a\x3a\xfa" - "\x7f\xc3\xba\x90\x74\x3d\x9e\xe0\xde\xc3\xe8\xe3\x8e\x90\xf4\x6c" - "\xc9\xb3\x32\x2e\x9c\x45\x1c\x29\x9e\x88\x31\xbf\xd7\xed\xa6\xd7" - "\x8a\x43\xf2\xcc\xd5\xcb\xfa\xdc\xf4\xb3\x5d\x21\xe9\xd3\x55\xfa" - "\xbe\x44\x37\x7d\xba\x27\x24\x7d\xf2\x60\x3c\x14\x53\x4d\x51\x63" - "\xc5\xf1\xfa\x16\x7f\xdf\x43\xfa\xc5\x49\x9f\xc8\xb7\x67\xf1\x19" - "\x19\xcb\x4e\x71\xd2\x56\x22\xc4\x49\x7a\x7b\xa2\xee\x2b\x96\xce" - "\xfe\x41\x7c\xa6\xa8\x83\xde\xbe\x41\x9e\x3f\xe1\xb8\x68\x7c\xce" - "\x68\x15\x9f\x33\xda\x27\xe3\xbc\x4e\x28\x2a\x55\x31\xd3\x94\xbf" - "\x61\x97\xb4\x95\xf4\xbd\x30\xe4\xe1\xef\x87\x12\xc3\xe1\x75\x16" - "\x57\x61\xaf\xf4\x8b\x63\x5d\x95\xd3\xd8\x66\x90\x67\x52\x42\x74" - "\x56\x35\x1e\xdf\x9e\x15\xe4\xf3\xc0\x0e\x65\x57\x55\xa8\x58\x7c" - "\x5d\xec\xc7\x11\x9a\xd7\x4d\x6f\xcf\xe4\x6b\xac\xd5\x72\xa2\xc7" - "\xf1\x76\xca\xc0\xb9\x8a\x7d\xeb\xf4\x74\x37\xd2\xd3\x43\xd2\x2f" - "\x89\xed\x3b\x20\x9f\xb6\xd4\x0b\xf3\x96\xb6\xbe\x8b\xc2\xeb\xbf" - "\x28\x7c\x9b\xfe\x0a\xbc\x17\xca\xf3\x06\x37\x06\xca\xb6\xb8\xf5" - "\xb3\xf5\x27\xfc\xcb\x85\x07\x7a\x1a\xc7\xea\xfe\xc6\x6c\xd8\x75" - "\xb3\x0b\x7a\xc4\xc6\xa7\xd9\xaf\xeb\x82\x8c\x33\x63\xef\xe2\xb8" - "\xa0\xec\xe7\xe3\xe5\x3d\x84\x84\x56\xc8\x9e\xda\x85\xfc\xfe\x33" - "\x9a\x95\x07\xfd\x27\x2f\x40\xb5\x80\xbd\xf3\x69\xc3\xa7\xe8\xed" - "\x8e\x7e\xdf\x39\xe0\xc0\xf5\xd9\x65\xac\xfd\xfd\x52\xcf\xe7\x6f" - "\x08\x89\xf2\xf3\x4e\xf1\x07\xd6\x2b\x3e\x76\x5b\xd6\x90\x0d\x32" - "\xd7\x86\xfb\x36\xf5\xc3\x3b\xa4\x0f\xd6\x26\x35\x4e\xf7\xab\xef" - "\x7a\x96\x6d\xcd\x50\xb2\x60\xff\x7c\xf1\x0b\x3e\x6f\xb1\x3f\x1b" - "\xb2\xa4\x1a\x3a\x4c\x75\xb4\xf2\xab\x77\x92\xd6\xb7\x1e\x73\xc6" - "\xd9\x46\x4d\xc9\x9e\x86\x99\x41\xcd\xbc\x86\xd7\x73\x64\xbc\xed" - "\xf5\xbb\x37\xec\x5d\xec\xd3\x5a\x56\x75\xd0\xcb\xd7\x91\x75\xbe" - "\x8f\xfd\x82\xf7\xb7\x0c\x2f\xe4\x18\x3f\xed\xf5\xd0\x07\xb4\x83" - "\x78\xff\xde\xe2\x46\xcd\x2f\xe7\x91\x86\x99\x72\x0d\xa0\x6c\x77" - "\x0e\xef\x21\xb8\xda\x03\xac\xcb\x24\x40\x97\x99\x2b\x96\x25\x9b" - "\x03\x2b\xf2\x46\xf8\x97\xe5\x7d\x63\xe7\x52\x4a\x08\x2c\x4b\x4e" - "\xda\x7c\x91\x26\x19\x71\xbc\x61\x23\xa4\x8a\x1e\x6b\x7c\xc5\x72" - "\x4a\x61\x1b\x62\x78\x4c\xa2\xdc\x97\xe1\xfb\xa0\xb6\xb5\xb3\x76" - "\xf9\xe5\xbf\x19\x10\x80\xed\xc0\xf1\x7e\x19\x97\x68\x6d\xdd\xb0" - "\x1d\xf6\x88\x7e\x16\xaf\xe4\x73\x1a\x09\xfd\x43\x1b\x7e\x41\x38" - "\x4f\xe7\x93\xc6\xf1\xd6\x4b\x72\xa5\x9d\x3e\xa4\x25\xcf\x4f\xae" - "\xa2\x4f\xa9\x64\x29\xf7\x51\xc3\xeb\x3c\x7f\xb2\x9f\x1e\xf2\x27" - "\x9e\xa6\x86\x77\x2c\x3e\xd2\xf0\x8b\x71\x3e\xc7\x3a\x77\xc3\x87" - "\xac\xf7\xbb\xe9\x1d\x33\xfb\x0a\x3b\x97\x3e\xc8\x69\x27\xec\x9f" - "\xcb\x7d\xf4\xe9\xea\xbc\x5e\xc3\x61\x7e\xb6\xf3\xd9\xc0\xf8\xbd" - "\x05\x6f\xf7\xfa\x86\x28\x5b\xb0\xe1\x5d\x5d\xf6\x57\xa2\xcf\x46" - "\x03\xf6\xa0\xeb\xc2\xc1\xb2\xed\xbc\x0e\x79\x93\xab\xc6\x4f\xb3" - "\xbd\xc2\x2d\xf7\xbc\xf8\x4c\x74\xd1\x54\xa7\xb8\x58\x49\xea\x3c" - "\xd0\x3b\x6b\x82\xe5\xdb\xd9\xff\x95\xef\xe5\xb9\x36\xb5\xa6\xb4" - "\x83\xd4\x3a\xcc\x8e\x44\xb5\xa6\xb4\xc3\xb6\x76\x14\xfb\xab\xbe" - "\x53\xda\x1d\xb7\x03\xf3\xe9\x3b\x73\xbb\xe3\x1b\xf6\x0c\x3e\xd7" - "\x54\xdb\x6c\x37\x52\x12\xaf\x65\xb2\xef\x69\x9d\xf2\x39\x45\x1d" - "\x07\xd6\x89\x72\xf9\xee\xa6\x93\x05\x14\xcb\xeb\x3f\xa8\xf7\xa3" - "\x09\x35\x64\x03\xae\x57\x09\xf3\xf6\x36\xe9\x07\x54\xb6\xdd\xed" - "\xea\x12\x4e\xf6\x43\x53\x6b\xce\x07\x2a\x45\xdc\xf6\x36\x95\xff" - "\xc0\x98\xd6\x2e\xb4\xc1\xbc\xbd\xde\xe5\x3b\xa3\xcf\xd5\x07\xc0" - "\xfb\xdb\xeb\x45\xd9\xf6\x06\x75\xc6\xf6\xc0\x8b\x86\x5c\x55\x3c" - "\x7a\x20\x57\xd1\xad\xda\xa6\xe8\x76\xa0\x52\x9f\x97\x6e\xe2\x7b" - "\xe8\x09\xa9\x6a\x3f\xf7\xc0\x7c\x43\x77\x71\xeb\x79\xb8\x0c\xee" - "\xd3\x94\xac\x3d\x50\x8c\xb6\xeb\xfb\xc0\x07\x6c\x9c\x86\xf6\x61" - "\x6e\x7a\xa7\x91\xdb\x35\x98\x6c\x95\xb4\x28\xa6\x58\xe0\x2c\x63" - "\x98\xf0\x39\x78\x97\x77\xaa\x53\x7d\x03\xec\xd0\x75\xf2\x0c\x22" - "\xea\x41\xff\x68\x2c\x37\x39\xd6\x01\xc3\x0b\xc1\x3f\x60\xe0\xc2" - "\xf5\xf1\x3b\xb4\x55\xea\xd9\xa0\x55\x03\xe7\xe1\x7e\x85\xbd\x1e" - "\xcb\xf6\xb7\x73\x39\xfb\x94\x1c\x4a\x66\x9a\x28\x9a\x1d\x92\xfb" - "\x3e\x15\xfd\xfd\x70\xf0\xcb\x70\x7a\xa8\xe7\xa0\x19\xb2\x61\x29" - "\xfb\x16\x1c\x4a\xd6\xe9\xd7\xa5\xea\x3f\xf8\x17\xdd\x86\xc2\xbb" - "\x83\x1b\x43\xca\xde\xd0\x9f\x57\x7d\x6f\x4e\xe3\x7d\x3a\x5e\x0b" - "\x55\xfc\x7a\xb0\x31\xa4\x5c\x63\xd6\x17\x69\xc4\xf1\xf8\xf9\xfb" - "\x60\x4c\xf3\x1e\xc7\xc1\xe6\x01\x7a\x2b\x38\x51\xea\xb8\xd1\xa8" - "\xc3\x4d\x07\x37\x18\x78\xe2\x3e\x5b\xf5\xc9\xa1\xc4\x81\x3e\x39" - "\x98\x6a\x94\x63\xbf\x6e\xf4\x91\x8c\x41\x12\x55\x0e\xf2\x9a\xfb" - "\x68\xc8\x60\xff\x54\xa7\xe4\x47\x3a\x54\xc6\xfe\x93\xa0\xab\x53" - "\xf1\xd0\xa1\x7c\x35\x17\x1e\x92\x67\xda\x79\x3d\xfb\x88\x8f\x79" - "\xe4\x50\x29\xe0\xd6\xe8\x38\x57\xe9\x38\x54\x01\x87\x0d\x83\x9e" - "\x9b\xe9\x3f\xbb\x76\xe8\x70\xc8\x79\xbd\xf9\x8a\xb6\xbf\xe1\xb3" - "\xb2\x87\x36\x29\xdb\xa1\x71\x13\xfa\xc7\x7e\x81\x46\x71\x4c\xfd" - "\x92\x02\x71\xba\xb5\x00\xf6\x8c\x79\xf7\x1e\xc8\x86\xbd\x25\x17" - "\x28\x9e\xf7\xe0\x59\xb6\xb0\xaf\x9f\x88\x43\x7a\xf9\xee\xbd\x03" - "\x67\x95\x7e\x6b\xe5\xb3\x7f\x1b\x39\x66\xd2\x19\x1a\xa5\xf6\xd4" - "\x7f\xf3\x10\xdb\xd0\xc2\x0e\xbb\xb9\x6c\x77\x03\x9f\x5d\x6b\x85" - "\x56\x2e\xec\x79\xdb\x83\xe5\xbb\x1b\x00\xd7\x69\x7f\x81\x46\xf0" - "\x5c\xc6\xb6\xb8\xe2\x8f\xdf\xf8\x00\xd7\xc9\x71\x9b\x60\x7b\xc7" - "\x08\xf3\x1e\x53\xd0\xbc\x6f\x22\xc3\xe5\xba\xc1\x53\xda\x49\xfa" - "\xcd\xcf\x45\xdc\x1e\x13\x7f\xdb\x8b\x6d\x6d\x97\x0f\x78\x96\xef" - "\x31\xe1\xdd\x70\xbc\xfb\x00\xd7\x20\xc7\x70\xe2\x18\xb4\x80\x6f" - "\x65\xf8\xa2\x6c\x8f\x49\xe1\xee\x91\x79\x4f\xd2\x6f\xaf\xe3\x3c" - "\x46\x6c\xa8\xa0\x3d\x33\x96\xdf\x73\x1b\x02\x28\xe7\x2a\x02\x9e" - "\xb2\x4c\xbb\x2c\xe3\xe6\xf6\xa1\x9c\xee\xb7\x61\x53\x7b\x6e\xbf" - "\x4d\x34\xf6\x8e\xdc\xf4\x9b\x1c\xc6\x39\x7a\xfc\xd0\xdf\x4e\x0a" - "\x8f\xe5\xf1\x3b\x3e\x2b\xca\xe9\x19\x46\xfc\x0d\xdc\x63\xfc\x1f" - "\x52\xe7\xe7\x43\x62\xe9\x6c\x0a\x89\xcb\x65\xf7\x88\xff\x62\x5c" - "\xc0\xa7\xb1\xa0\x37\xe8\xbf\x6f\xa2\x3a\x67\xf1\x5b\x39\x86\xd0" - "\x26\xb6\xf7\x2d\xea\x5c\xf0\x6f\xff\x5d\xe7\xc7\xb4\x39\x01\xbf" - "\xc5\x8d\x3a\x31\x76\xd3\x06\x9e\x7f\xdb\x00\xfe\x4c\x44\xbe\x7f" - "\xa8\xb8\x55\xbf\xdd\x13\x9e\x5f\xbe\x2f\x8d\x78\x8e\x2c\x6f\xf3" - "\xa2\x6f\x06\xdb\x23\xdb\x38\x4a\xae\x0b\xe4\x0c\x5f\x43\x05\xf6" - "\x7f\x50\x2c\xfa\xea\x73\xc6\xad\xb5\xb3\x8b\xdb\x64\x11\x8e\x54" - "\x72\x75\xfa\x95\xae\x82\x39\xe2\xe4\x58\xe4\xf9\x07\x8d\x64\x9f" - "\x53\x8e\x05\x8e\xfc\xa7\x55\xdc\xd2\xc6\x9f\xcd\x7f\x29\x9e\x82" - "\xcf\x66\x7e\x43\x68\xff\x36\x1d\xf3\x81\x79\x5f\xaf\x7b\x08\xaf" - "\x4b\x97\x6c\xa3\xd1\x1c\xff\x02\xbc\xd9\xc1\xdf\x89\xe1\xef\xf6" - "\xfe\xb2\xb7\x73\x88\xcb\xff\x29\x15\x3c\x47\xda\x69\x6a\x5c\x67" - "\x2a\x26\x53\xc5\x29\x4a\x9c\xe3\x17\xfe\x23\xfe\x49\x64\x9c\xeb" - "\xad\x19\xa1\xce\x47\xc2\x2e\xf7\x2c\xb3\x0a\x5f\x8f\xe3\x77\xd0" - "\x7f\xb7\x67\xea\x3e\x3c\xde\x0d\x2a\xde\xb7\x09\xf5\xcf\xd2\xf4" - "\x33\xcc\x8a\xb6\x8d\x37\xa8\x73\x1a\x23\xbe\xd5\xe3\x68\x4c\x1a" - "\xd0\xe7\x1a\xeb\x15\x0d\xf7\x65\xaa\xf1\xd5\x58\x7f\x04\x96\xff" - "\x3a\xb5\xd7\x98\x84\xbc\x69\xfd\x7b\x8d\xd2\x3e\x6d\xac\x47\x1f" - "\x66\x2a\x5d\x6f\x5f\x66\x56\xc0\xac\x8f\x01\x4e\xdf\x22\xcb\xa2" - "\x9c\xc5\x2b\x6d\xc9\xc6\xe2\x01\x5e\x6b\xe4\xef\xa5\xc7\xa0\x4d" - "\x09\xe8\xd7\x46\x6e\x17\xd3\x04\xf9\x4c\x78\x3e\x7c\x64\xd7\x20" - "\xf1\x0b\xcd\x5b\x33\xfc\x0e\xb9\x6f\x56\x0d\x7e\x3a\x83\x3e\xb8" - "\x86\xe3\x95\xb8\x50\x4f\x4b\x6d\x2f\xb5\x58\xbb\xa9\x35\x87\xcf" - "\x94\x40\x5f\x7e\xee\xbf\xa8\xc3\x16\x5d\x7e\x41\x06\xb6\x01\x67" - "\x37\xc3\x82\x9c\xe8\x64\x9f\x11\x57\x31\xe4\x99\x87\xbf\x4f\x43" - "\x12\x46\x4b\xb0\x93\x5a\x8a\x58\x6f\x3f\xef\x6c\xad\xfd\x94\x5a" - "\xad\xff\xaf\xac\x87\x75\x0c\xe7\xd2\xee\xcb\xc1\xf6\x40\x2f\x24" - "\x1d\x76\x17\x60\x27\x0d\x0e\xfb\x63\xf7\x15\xc2\xbe\x02\xbc\x3f" - "\x6e\xbb\x12\xd8\x90\x65\x73\x5d\x56\x75\x2e\xa5\xe4\x3a\xba\x2a" - "\x70\x91\xe3\xd3\xdd\x24\x94\x0f\xde\xef\x5f\x92\x67\x57\x1c\xd2" - "\xc7\x31\x43\x9e\x61\x39\x4b\xd2\x8f\x4a\x9d\x5b\xf9\x9c\x78\x5f" - "\xb3\xc7\xf1\xfb\xec\x01\xdd\xbb\x7f\x5d\x19\x32\xe6\xf7\xeb\x94" - "\xaf\xd5\xee\x0c\xc5\x57\xbf\xbf\x97\x61\x45\xc7\x63\x4f\xb6\xf2" - "\xd9\xfb\xbd\xa1\xaf\xb5\x75\xc7\xed\xc9\xd6\x61\xd9\x22\xf7\x1b" - "\x8d\x0f\xc3\xe5\x16\x15\x1a\xdf\x98\x2b\xd4\x8f\xaf\x3d\x9a\xfb" - "\x4c\xee\xa2\xe5\xb9\x39\xb6\xb9\x2f\x2d\x5d\x3c\x7e\xc9\xc2\x85" - "\xb6\x59\xb9\xcb\x96\x2d\x78\x36\x37\x9e\xe6\x2e\x5d\xb0\x78\xd9" - "\xa2\xc2\x45\x4b\x16\xdb\x6c\xe9\x77\x67\xe5\x2d\x29\x1c\x7f\x7f" - "\x7a\x6a\xc4\x79\x27\x3e\xeb\x74\x9c\x75\x3a\xfb\x6a\x8c\xcf\x00" - "\x5d\xcd\xb1\x27\x2c\x2b\x85\xf3\x65\xd8\x13\xe0\xbf\xd3\xbc\xae" - "\x8e\x71\x7b\x82\x75\x4d\x8e\x75\x85\x79\xb3\x79\xc7\x16\xd1\x76" - "\x8a\x9a\x2f\x40\x4f\xe1\xef\x93\x72\xdc\xa6\xe3\xb0\xf1\x3c\xea" - "\x3b\x48\xcd\x1f\x71\x4c\xa6\x9f\x22\xcd\x13\xb7\x2f\xb3\xe2\xaf" - "\x64\xc2\xdc\x03\x3d\xf7\x3f\xda\x84\x36\x4c\x6c\x18\x29\x9a\xc4" - "\x7f\x59\x49\x8f\x29\xab\xb9\xdc\x3e\xde\x7f\x33\xcf\xf1\xdb\x05" - "\xcb\x53\x35\xb6\xfe\xe3\x23\x45\x97\xed\x1e\xe5\xcb\xd8\xfc\x0e" - "\xeb\xc4\x6b\xe5\x77\xaa\xfe\x03\xe3\xbf\x21\x73\x40\x4e\x37\xf9" - "\x75\x5d\x84\xf7\xc7\x56\x9c\xc4\xb3\x3a\x63\x7f\x38\x21\x7c\xcf" - "\xf5\xdd\x2e\xa2\x3f\xda\xd4\x8f\xcb\xfc\x31\x4d\xfd\xf8\x3e\xf4" - "\xd7\x5c\xa5\x7e\x91\xe9\xff\xec\xcf\xa8\xff\xbf\x5b\xfe\xc3\x43" - "\x97\xff\x7d\x9d\xfa\x65\xbb\xff\x2f\xb6\xff\x9f\x29\xff\xe1\xe1" - "\xcb\xfd\x98\xdf\xc0\x5b\xc7\x7f\xfa\x57\x32\x83\x3f\xab\x60\x5f" - "\x9b\xec\x9f\x91\xb5\xd8\x2f\x3a\xec\x4f\xd2\xe8\x92\x7f\x10\x7f" - "\x27\xa8\xb3\xb0\x48\x74\x94\x5c\x64\xbd\xe7\xc3\x8d\xe0\xdf\xc6" - "\x4d\x27\x29\x61\xe3\x49\x4a\x6c\x2d\xe4\xef\x05\x72\x7c\x1a\xc8" - "\x19\x60\xea\xc2\x73\xf3\x72\x1f\xfd\xc9\xf3\x05\xfb\x29\x38\x5b" - "\xa1\x4d\xb6\x1c\xe7\x6f\x2d\x8a\xa6\x84\x6c\x4a\xaa\x19\x29\x0e" - "\x8b\xff\xc3\xde\xfb\xc7\x45\x55\xe5\xff\xe3\x67\x2e\xa3\x8e\x3a" - "\xc0\x68\x64\x68\x68\x53\x51\x3b\x16\x16\xed\xc7\x7a\xbb\xad\x11" - "\x89\xbd\xdf\xd6\x5a\xb8\xae\xbd\x97\xdd\x2c\xb1\xb4\x1d\x77\xfd" - "\x31\xe1\x00\xa3\xc1\x80\x68\xbc\xc1\x05\x64\xdf\xeb\x96\x16\xa0" - "\xf5\xb5\x95\xdd\xb7\x18\x6d\xf6\x5e\xda\xb5\x1a\x53\x5b\x32\x60" - "\xa8\xd5\xc4\xc2\x75\x22\x24\x72\xd1\x26\x40\x19\x61\xe6\x9e\xef" - "\xeb\x75\xce\xbd\xcc\x0c\x30\x30\x33\xe2\x8f\xf6\xed\x1f\xf7\x71" - "\xe7\x9e\x7b\xe6\xdc\x73\x5e\xaf\xe7\x79\xbd\x5e\xe7\xd7\xeb\x95" - "\xf3\x8c\x91\x0a\xcf\x2c\x81\xb4\xc3\xaf\x8b\xf1\x23\x5e\x5f\x5b" - "\x3d\x02\x63\x2a\x35\x91\x77\x7f\x23\x61\xd3\xc5\xcf\x31\x1c\x60" - "\xf6\x39\xf4\x93\xc3\xdc\x0f\xe2\xc1\x35\x5c\x9f\x1f\x7c\x48\x9a" - "\xbf\x80\xdf\x07\xd8\x5c\x1b\xb4\xa3\x0a\xe3\xaa\x61\x99\xbb\xc5" - "\x2a\x16\x57\xed\xf5\xb5\xf1\x23\x32\x16\x13\xa1\xce\x76\x8a\xec" - "\x07\x39\x88\x31\xba\xa0\xdf\xed\x82\x7e\x56\x59\x3a\x81\x16\x43" - "\xfd\x0a\xca\x26\xd0\x3c\xa8\x53\x79\x57\xce\x7b\x60\x07\x55\x75" - "\x4a\xf3\xab\x16\xe8\x17\xbb\x0a\x21\x4f\x62\x2a\xb9\xa1\x10\xf2" - "\x15\x41\x3e\xb4\xc5\x78\xfd\xde\x3f\x08\x34\xd8\x03\xdf\xac\xd7" - "\x3e\x89\xcf\x16\x36\x0f\x85\xdf\x86\x76\x68\x9b\x88\x65\x1e\xe8" - "\x36\x25\x7e\x43\xfe\x2e\x94\x0f\xf2\xef\xed\x5d\x6c\x4e\x1c\xd2" - "\x79\x39\xef\xf1\x98\xee\x79\x3b\xd1\x8f\x9b\x14\xf7\x6e\x67\x7d" - "\xe1\x5a\xd0\xe9\xdd\xcc\x57\xdb\x66\x1c\xbf\xa3\x8d\xc1\xec\x0a" - "\x18\xc7\xf3\xf1\x26\xd8\x16\x7a\x90\x03\x60\x4f\xb0\xfd\x97\x60" - "\x4b\x40\x5d\x36\x63\xec\x39\x7c\x0f\xe3\x80\x3d\xa0\x97\x2b\xd1" - "\x0e\x78\xf2\xec\xc3\x04\xcf\x6e\x81\x3d\xa0\x5c\xbd\x90\x3a\xb8" - "\x8f\xfc\xf7\xda\x64\x5b\x00\x65\x10\xea\xff\x42\x18\xd3\xf7\x00" - "\x0f\x01\x03\xd5\x60\x5b\x8c\x03\x2d\xa9\x93\x68\x5f\xcd\x74\x7e" - "\x1a\xf3\x2d\x1a\xc2\x65\xb4\xe5\x6e\x68\x9f\x1a\xbe\x51\x6d\x23" - "\xb5\x4c\x4e\x70\x19\x63\x99\x2d\xeb\x71\x1c\x43\xd9\xa0\x0c\x0a" - "\xb2\x4c\x7a\x07\xed\xff\x73\xa4\xfc\x4d\x1b\x79\xaf\x53\xa2\x59" - "\x0d\xd0\x0c\xcb\x64\xe7\x69\xc1\xe6\x4a\xe2\xb4\xb1\xa0\x7d\x10" - "\x21\xfd\xb7\x44\x2e\x17\xc7\x79\x22\xd8\x15\x48\x2f\xa4\x13\x7c" - "\x83\x48\x72\xec\x30\xb7\x5f\xde\xaf\x90\xd6\xd1\x8a\x81\xd7\x1b" - "\xdc\xf4\xb7\xd8\x3c\xe9\x0f\xff\xdf\x20\xf1\xf2\x67\x1e\xbc\x03" - "\xfb\xfb\xfd\x58\x9c\x77\x83\x3a\xee\xe5\x73\x06\xfb\x26\xa2\x7f" - "\x1f\xf4\x21\x0a\x34\xde\x5b\x80\xfe\x2a\x41\x36\xaf\xff\x07\x91" - "\x62\x1e\xbe\x3f\x91\xdb\xa7\xfb\xaa\x78\x5c\xb0\x7d\x6c\xae\xae" - "\x19\xea\xc5\x63\x82\xed\x93\x62\x82\xed\x5b\xe7\x19\xe7\xd0\x1d" - "\xe3\x70\x9f\xc9\xbd\x07\xda\xb2\x83\x8f\xc7\x2c\x3b\x70\x4e\x85" - "\xe5\xef\xd1\x63\xdd\x1a\xb1\x5f\xca\x6d\xc5\x78\x87\x90\x8e\x73" - "\x7d\x8d\xc8\x37\x39\x1d\x7d\x5d\x02\x9f\xd4\x50\xa7\x71\x52\x9d" - "\xda\xe0\x59\x05\xdf\x66\x73\x52\x18\xfb\x70\x13\xfe\xc7\xec\xfe" - "\x0f\xf6\x1b\xc0\x70\x38\xfc\x67\x34\xdc\xa9\x9c\x97\xc7\x44\xdc" - "\x57\xfc\xdb\x6e\x9c\x53\xd9\x57\x2e\xc7\x44\xc4\x78\x88\x28\x33" - "\x0a\x9f\xf4\xa2\x3d\xd2\x66\x17\xf0\x8a\xe1\x6e\xbf\xb3\x0a\xe8" - "\xfd\x3e\xd8\xff\x15\xf1\xbc\x5d\xfb\x8a\xa5\xfa\x59\xb8\xef\xf4" - "\xbf\x54\x97\xfd\xb7\x7c\x96\xfb\x7d\x53\xef\x3a\x5f\xaf\x6d\xb9" - "\xaf\x18\x31\x09\x65\xd5\x20\xff\xd1\x4e\x84\x7c\xdb\x7b\xb1\xc5" - "\xce\x2b\xbe\x8f\x7e\x94\x92\xa4\xfa\x23\x5e\x14\x12\xed\xaa\x3d" - "\xfb\x9d\x67\x3f\x87\x32\x9a\xa1\x8f\xf7\x62\x40\xee\xd7\x92\xcc" - "\x99\x28\xd9\x14\x5b\xd0\xd7\x24\x94\xcb\xf6\x14\x72\xbd\xba\xbf" - "\x6d\x7f\xa3\x13\xe7\x64\x0f\xc3\x33\xf4\xef\xfd\xd5\x1d\x63\x2a" - "\x2d\x1b\x98\xdc\xd8\x0f\xe3\x9f\xa9\x6c\xfe\x18\xe9\x22\xf7\xd7" - "\x4d\x40\x1f\x8c\x27\xc8\xfa\xac\xa9\x99\xd4\x39\xda\x88\xb4\xbf" - "\x18\xfa\xec\x49\x5c\x23\x39\x05\x18\x52\x61\xff\x05\xfe\xee\x42" - "\xbf\xa8\x40\xc7\xfa\x0d\x2f\xb0\x7e\xab\xc6\x7e\xdb\x83\x67\xd0" - "\xe1\x3b\x07\x92\xe3\xc9\x7e\x93\x85\xf5\x63\xf4\x2d\xf0\x32\xd0" - "\x0e\xe3\x0f\xc2\xb7\xf7\xc8\xfb\x22\x11\x23\xe8\x4b\x80\xe3\xe4" - "\x3d\x27\xf6\x65\x89\x76\x4a\xc8\xd7\x28\xf7\x3d\x37\xff\x79\x9e" - "\x3e\xfd\x2d\x9c\xf7\xb7\x03\x6a\x99\xd6\x4e\xd6\x8f\xf7\x95\x3b" - "\xa1\x1f\x7b\xd2\x14\xe9\x89\x74\x85\xbc\xd0\xfe\xb7\xe7\xc9\x34" - "\xf5\xa0\xe7\x1f\x24\x9e\xd7\xf3\x39\x8b\x03\xcb\xa5\xf9\x8c\x5e" - "\x1a\x4a\xf8\x3b\x8c\x7d\x6a\x3d\xb6\x1d\x74\x03\x7e\x1f\x31\xf2" - "\xb2\x24\xb3\x0e\xd8\x11\x23\x07\xa0\xff\xcf\x6d\x70\xcb\x8e\x7d" - "\xbb\xd8\x98\x05\xf8\xc4\xf9\x73\xe0\x08\x3b\xaf\x3f\x80\xec\x00" - "\x9c\x6c\x76\xcb\xa7\x03\xcd\x32\x1d\x64\x4c\xca\xfd\x1e\x74\xca" - "\x5d\xde\xf2\xe7\xe0\xb5\x50\xc6\x78\x94\x6f\x6e\x1b\xea\x60\xb4" - "\xb7\x7c\x3b\xa8\x46\xf9\x86\xb8\x36\xa4\xe1\x9c\x0d\xd7\x57\x36" - "\xf2\xee\x1e\x6f\x99\xf4\xee\x1f\xf8\x1a\x20\xb7\xb9\x10\x5b\x86" - "\x27\x79\x7e\xd4\x61\x90\x9f\xed\x4b\x96\x74\x1e\xfa\xbf\xc2\xb4" - "\xed\x12\xbd\x1a\x21\xff\x01\x3c\xab\x85\x67\xbd\xc7\x36\xf2\xb1" - "\x1e\xc8\xe9\xbd\xe8\x67\x16\xf2\x25\xd7\x81\x9d\xdf\x93\xcb\x65" - "\xb7\x2c\x2b\xe8\xd3\x49\x63\xd3\x5b\xc9\x68\x43\x1c\xfd\xb2\x85" - "\x7c\xf0\x00\xf4\x19\x07\xfa\x3d\x83\xb2\xb5\x2d\xe4\xc3\xd1\xf0" - "\xdd\x08\xe9\x1e\xd9\x42\xaa\xbf\x85\xfb\x44\xb8\x1f\x83\xfb\xf5" - "\x70\xdf\x07\xf9\x45\x29\x7f\x2c\x3c\xff\x01\xd2\xff\x9f\x74\x87" - "\x3a\x7e\x30\x03\xee\xf3\x24\xdb\x11\xd3\x33\xf1\x19\xee\x2b\x24" - "\x9e\xd7\x70\x9e\x7f\x80\x7b\xae\x4c\x50\xff\x06\x6b\x23\x2b\xcb" - "\x00\x79\xa6\x61\xd9\x78\x86\xb2\x85\xfc\xed\x0b\x0f\x1b\x14\xca" - "\xf9\x5b\x28\xdc\xa7\xc3\xff\x3e\x86\xbb\x11\xee\xaf\x49\x34\xa8" - "\x47\xd9\xb0\xc4\x84\xb4\x3d\x60\xd1\x72\x7b\x77\x9e\xdc\xe7\x51" - "\x0f\xbb\x65\x87\x85\x2c\x59\xc8\xf9\x0d\x79\x19\x0e\x20\xef\x03" - "\x98\x17\xee\x09\xd2\x3d\x5e\xba\x3f\x28\xdd\xff\x43\xba\xcf\x96" - "\xee\x73\x6c\xe4\x83\x72\xc9\xc6\x00\xba\x7c\x50\xce\xf6\x37\xe4" - "\xed\xcc\xe3\xdf\xf8\x5b\x35\x8e\x91\x41\x8e\xa3\x1e\x0c\xe9\xca" - "\xf9\xdb\x4c\x79\xbe\x0d\xe7\x69\x7b\x72\xfe\xf2\xe5\xcb\xcc\x6f" - "\xc3\xdf\x16\x78\xc8\x36\x9d\x5a\x11\x4f\xc0\x06\xba\xb6\x44\x00" - "\xfd\xcf\xcb\x41\x1c\xb3\x35\x44\xc9\x87\x75\x08\xfa\x8a\x62\xe3" - "\xa1\xd1\x76\x1d\xf6\x55\x36\x17\x89\x3e\x92\x46\x57\xc4\xc0\x35" - "\x03\xc6\x06\x33\x65\xf9\x8d\xe3\x1e\xc9\xd7\xd5\x04\xf8\x96\xc5" - "\x3d\x56\xff\x9b\x81\xaf\xc9\x5c\x0b\x7d\xff\x6f\x0d\x1e\xe9\x31" - "\x58\x67\xa0\x67\x03\xb4\x67\x7a\x13\xa9\x46\x3a\x7e\xbf\x99\xb7" - "\x39\x56\x6e\xb3\xc4\x0f\x83\x4c\xdf\x66\xf2\x41\x25\xc8\xc2\x14" - "\xc4\x70\x53\xaf\x9c\xfd\x80\x9d\x41\x92\x30\x02\xbc\xfc\x60\x19" - "\xf2\xd4\xdd\x7f\xbc\x64\x50\x44\x57\x4e\x75\xb2\xb7\x4c\xb1\x24" - "\xa3\x4c\x41\x6c\x80\xfc\x46\x5e\xc7\xf7\xe9\x7f\x6a\xec\x7f\xbc" - "\xdf\x55\x97\x78\xff\xf7\xa0\xda\xc9\xfb\x1d\xee\xe5\x02\x7c\x7e" - "\xc0\xce\x9e\xd9\x48\x75\x86\xd4\xa7\x1b\xa0\x4f\xdf\x0d\xe9\x2a" - "\x5e\x57\x9e\x2e\x7d\x0b\x70\xf6\x01\xb6\xfb\x7a\x39\x5d\x6a\x2f" - "\x94\x73\xd0\x81\xfc\x96\xd3\xa5\xf2\x01\x8f\x07\xed\xd8\x4f\xe4" - "\x74\xa9\x4d\x60\x47\x7d\x38\x5d\x96\x27\x05\x0c\x6f\xfb\xf7\xca" - "\xff\x43\xbe\xa1\x5f\x1b\x3e\x67\xfc\xa1\x16\xfa\xea\x76\xd4\x0f" - "\xeb\x9f\x24\xea\xf4\x2d\x24\x94\xf7\xcb\x0f\xb5\xde\x32\xf2\xa3" - "\xb7\x69\x4e\xb8\x93\xaa\x2a\xa2\x6b\x9d\xd3\x65\x7b\xb5\x04\xbe" - "\x53\x22\xc7\xdf\x74\xfb\xc3\xfe\xf0\x63\x8c\x5b\xee\x51\x17\x8b" - "\x5c\x17\xb7\x7e\xe6\x3c\xc0\xba\x61\x59\xeb\xc1\x5e\xef\x04\xb9" - "\xc0\xe5\xf6\x87\x76\x39\x2e\x71\x91\xa4\xb7\x58\x6c\xdc\x34\x1e" - "\x1b\x17\x75\x23\xae\xe5\x8b\x38\x8f\x65\x72\x91\x3a\x03\x8c\xe5" - "\x4d\x27\xc9\xa2\x35\x63\xd0\x77\x44\x12\xd4\xb5\x14\xea\xb6\x43" - "\xa2\x11\xf4\x9b\x8f\xd6\x49\xb4\x44\x79\xb5\x03\x65\xf8\x7a\x33" - "\x8f\x65\x81\x73\x37\xd8\x1f\x7e\x8b\x7a\x2b\x92\x3a\x0e\x94\x60" - "\xdf\x38\x64\x90\x6d\x50\xa8\xdf\x76\x6e\x03\xee\x3f\xce\x7c\x99" - "\xe4\x55\x44\xf3\xb9\xbf\x8f\xc6\xf1\xb6\x1e\x72\xf0\x75\x52\xe6" - "\x0f\x0e\x9f\x9b\x43\x22\x23\x52\xf8\x7e\x8b\xbf\x88\x65\xac\xaf" - "\x1d\xb2\xf4\xf1\x17\x25\x40\xda\x61\xd9\xdf\xa5\xdb\x5e\xe4\x34" - "\x81\x77\x76\x77\xbf\x38\xb4\x0b\xcb\x82\x32\x33\xbb\x72\x3e\x52" - "\xb9\xd3\xf7\x37\x4a\x73\x5e\xba\xb0\x75\xf1\xb8\x8f\xe4\x5a\xf4" - "\x11\xcb\xeb\xf0\x91\x9e\xd5\x89\xcd\x7b\x40\xff\x94\xfa\x30\xd2" - "\x1a\xf5\x36\xeb\xc7\xd0\x87\xb1\x2f\xf7\xe4\x57\xc4\xc0\xc5\xfb" - "\x2e\xd7\xcf\x0e\xd6\x77\x59\xbf\xfd\xc8\xe4\xfe\xde\x47\xb1\x6c" - "\xee\x0b\x79\xfa\x5c\xa4\x1a\xde\x6d\xb6\x91\xbf\xa8\xa4\x3a\xce" - "\x94\xea\x12\x0d\xef\x4b\xf8\x5e\x8d\x43\xd3\xb8\x2d\x74\x28\x06" - "\xf1\x65\x05\xcc\xc0\x7d\x0b\x8f\x1b\xf8\x51\xbd\x8c\x19\xe8\x4f" - "\x4b\x5a\x48\xcd\xe2\xcd\x13\xe8\x16\xe0\xcd\x16\xe8\x03\xcb\xe1" - "\xf9\x11\xb8\x2f\xe1\x77\x85\x06\xef\x12\xb6\xb7\x74\xe5\xd4\xa8" - "\xe5\xf8\xae\xd8\x9e\xce\xd1\x0d\x1a\xc4\x47\x11\xd4\x1d\x31\xc2" - "\xd6\x13\x0d\x3c\x6e\x32\xe2\x03\xb1\x11\xbe\xee\x61\x86\x0f\x76" - "\x56\x19\xd2\x59\x9d\x00\x1f\x50\x56\x92\xec\x6b\x12\xda\xe7\xe4" - "\xf3\xfa\x35\xcb\x3d\xf7\xb6\x41\x99\xda\x03\x5a\x18\xd7\xe4\x6d" - "\xd1\x1a\x6f\x24\xd7\x1e\xd0\x32\x9f\x72\x27\xac\xce\x07\x09\xfe" - "\x07\xd7\x65\xb8\x9c\xbb\xf6\xa7\xf0\xdf\x72\x37\xbd\x2c\x6c\xad" - "\x62\xff\x42\x36\x97\x78\x0d\xbc\x3b\xe0\x39\x4e\xb0\x91\xbf\xd6" - "\xe3\x58\x01\xf7\xe0\xdc\x1c\x41\xb4\x80\x43\x90\x43\x35\xad\xb2" - "\x5d\x7a\x67\x04\xae\xef\xfe\x15\xcf\x42\xe2\x18\x18\xe8\xf5\x57" - "\x3d\x8c\x05\x07\xdc\x9f\x08\xf8\x98\x8e\x73\x35\x52\x1c\x88\x46" - "\x9c\x87\x42\xbf\xd9\x2d\xa4\x7e\x4d\x2d\xfa\x11\x58\xd5\xdf\xb7" - "\xa8\xd9\x44\xcf\xa2\x7f\x51\x6d\x0a\xb9\xa6\x89\xd4\x2f\xc4\x79" - "\x9f\xac\x6f\x71\x8e\xa5\xd6\xe0\x3d\xc7\x52\x6b\x91\xae\xc3\x84" - "\xd4\xcd\xf0\xb8\xaa\xa5\xfb\xec\x21\x2e\x9b\x94\x17\x46\xe0\x75" - "\x0e\x89\x56\x2f\x76\xe5\xd4\xf6\xfa\x3f\x44\x4c\x61\x5f\xc5\x75" - "\x7d\x9c\x33\x52\x38\x09\xfa\x2d\x00\x7e\x41\xbd\xd7\xdf\x36\xdf" - "\xb2\x16\xf1\x54\x37\x82\xd9\xfe\x42\xa0\xe7\xaa\xea\xd8\x3a\x18" - "\xf7\xb1\x57\x5b\x0d\xdf\xde\x89\xb1\xe1\x0d\x29\x64\x32\xce\x5f" - "\x87\xbb\xa8\x05\xc7\xa8\x88\x8d\x6d\x2c\xfe\x42\xdd\x87\xc6\x4c" - "\x22\xc0\xfb\x1b\xe0\x77\x95\x6c\xe7\xc0\x7f\x34\x21\x0e\x12\x81" - "\xf6\x4d\x42\x26\xb9\xa1\x2b\xa7\x6e\xb3\xcc\x2b\xb4\x01\x70\x1e" - "\x4d\x9a\x0b\x80\xba\xd6\xb2\xb5\x33\xf4\x8d\x6c\x63\x74\x63\x72" - "\x14\xcb\x00\xec\xd6\x65\x87\x74\x12\x0d\xd7\x1d\x75\xa0\xff\xfe" - "\x2a\xd9\x7c\x75\x25\xd0\x07\x0e\x7b\xd4\xf3\x98\xfb\xf7\x84\x89" - "\xf8\xff\xf0\x4e\xb4\xaf\x7c\xd1\xc7\x7a\x8b\x4c\x1f\xdc\x57\x16" - "\x0e\x76\x3e\xe3\xb7\x93\xb6\x41\xdd\x6a\x0c\x6b\x89\xea\x14\xa9" - "\xbf\x65\xdb\x0b\xec\xbc\x4b\x35\x9f\x5f\xaf\x9f\x28\x8f\xa3\x79" - "\xbd\xad\x27\xc3\xd7\x85\xb0\x98\xda\x18\xe3\x93\xc5\xd1\xfe\x26" - "\x92\xd9\xde\x56\xe7\x4c\x62\x31\xdf\x8b\x79\x8e\xc8\xb2\xb4\x23" - "\x2b\x92\xec\x8f\x9c\x09\xfd\xd9\xba\x1d\xfa\x8c\x3e\xf0\xbd\x4f" - "\x56\x69\xde\x9e\x9f\x91\xc2\x67\x3c\xcf\xc4\xfc\xcb\xb3\x75\x52" - "\xeb\xb3\xa8\x1b\x36\x48\xf1\x99\x51\xe7\x76\xe5\xd4\xf7\xda\xff" - "\x3c\x2e\xb5\xd5\xc0\xcb\xc0\xf5\x41\xeb\x72\x3c\x47\xce\xc6\x01" - "\x3c\xbf\x9a\xcf\xe1\xd7\xf7\xce\xff\x63\x3e\xfc\x1f\xdf\x9f\x64" - "\x9d\xbd\xc8\xa5\x00\x1a\x5b\x67\x63\x5b\x39\x36\x27\x00\x6f\xeb" - "\x0d\xee\x7e\x5c\xc7\xf6\x09\xed\x6f\xf3\xec\xa7\xf5\xc5\xee\xf1" - "\x63\xed\xf4\x69\x9b\xc9\x80\xeb\xc0\x86\x30\xa2\xf9\xa7\x8a\xfc" - "\x64\xd3\x26\xba\xbd\x58\x10\x67\xad\x2f\x22\x6a\x45\x01\x90\x11" - "\xfb\x5d\x5a\xf2\xb5\x2d\xe4\xe3\x71\xe1\xea\xeb\xe6\x25\x18\x47" - "\x51\x73\x24\x11\x0a\xdb\x47\xa9\x6e\x74\x5c\xb7\x9d\x86\xdc\x36" - "\xff\x11\xa3\x83\x68\x7f\x59\x4c\xbe\x5a\x4e\x42\x12\xc0\x72\xbf" - "\x59\x4d\xa0\x4e\x7f\x8f\xc2\x73\x67\xfb\xd5\x68\x4f\xfc\x3d\x0a" - "\xcb\xcc\x28\x21\xaa\x8c\x66\xda\x5a\xf0\xcc\x08\x15\xc8\x76\xcd" - "\xcb\x80\xb9\xb1\xea\xeb\xb6\xf7\x40\x19\xfb\x92\xd9\xff\x2a\x03" - "\xaf\x9b\x61\x02\xd4\xad\x22\xb0\xba\x1d\xde\xeb\xae\xdb\xe1\xbd" - "\xc3\x5c\x37\x8d\xbb\x6e\x7a\xa8\xdb\x27\x0f\x05\x56\xb7\x4f\x17" - "\xba\xeb\xf6\xe9\x42\x3f\xeb\xb6\x2b\xf0\xba\x99\xae\x83\xba\x9d" - "\x0c\xac\x6e\x47\x9d\xee\xba\x1d\x75\x5e\x48\xdd\x70\x6c\x6e\x8e" - "\xa2\x27\x99\xaf\xe3\x14\xa2\xc6\xbd\x5d\x2d\xe4\xf0\x83\xe6\x12" - "\xf6\x3c\x1e\x7e\x2b\xa4\xfe\x6e\xcf\xea\xa4\x5f\x72\x3b\xe6\xef" - "\x2b\xee\x30\xe0\x9e\xe6\xbf\x2f\x01\x2c\xab\x39\xa6\x0f\x33\x5b" - "\x3b\xcb\x4e\xa5\xbd\x86\x7f\x2f\x2c\x63\xfb\x15\xde\xd0\x4b\xcf" - "\xf5\x1d\x63\x2a\x92\x71\xaf\x80\x08\xfd\x9b\x8e\xa9\x58\x8e\x71" - "\xdd\x5e\x4f\xb1\x0b\x34\x07\xfd\x10\xa1\xaf\x24\x25\xa1\x1b\x2b" - "\x32\x5e\x4f\x71\x08\xe8\x37\x60\x3d\x3b\x87\xf7\xf7\x6a\xf9\x8c" - "\x89\xfc\x0d\xfb\xe8\x37\xf4\x90\x6e\xb3\x49\xb1\x16\xa9\x80\xb6" - "\x49\xc5\x12\x2c\x1f\xd2\x1d\x72\x3c\x44\xc0\xbb\x1c\x93\xa5\x33" - "\xdc\x31\x98\x1c\x3c\x3c\x4d\x96\x83\x09\x46\x12\x8e\xf1\xd0\x36" - "\x99\x47\xe1\x1a\x22\xd8\x54\x7f\xdf\x8b\x74\x4f\xec\x1c\x45\xc3" - "\x33\x48\x08\x9e\xad\xc1\x3d\x5c\xd6\x48\x3b\x89\xce\x20\x23\x12" - "\x4d\x50\xa6\x83\x24\x87\x9b\xa0\x3c\xa0\x35\xb7\xf5\x0f\xb3\x73" - "\x70\x9b\xa1\x3c\xdc\xdb\x1a\x62\x24\xea\x84\xc8\x2c\xba\x7e\x2b" - "\x51\xe2\x39\x1c\x3c\x4f\xc3\xcf\xd2\x8c\x54\x75\xe5\x1c\x2e\x97" - "\xdb\xe7\x07\x7f\xc2\x38\x7f\x8e\x9c\x74\xf3\xe7\xc8\x2b\xfd\xf9" - "\x73\x24\x94\xf3\xe7\x88\xd2\xcd\x9f\x4f\xe7\x78\xf3\xe7\xc8\x34" - "\x6f\xfe\x1c\x31\x04\xc7\x9f\x23\x7a\x37\x7f\xf8\x37\x38\x7f\x8e" - "\x64\x0f\xcc\x9f\x23\x5b\xdc\xfc\x39\x12\xe3\x1f\x7f\x8e\xd4\xfa" - "\xe6\xcf\x91\x85\x83\xf0\x67\xe4\xc0\xfc\xf9\x74\xb2\xff\xfc\xf9" - "\x74\x4e\x00\xfc\x09\xe5\xfc\x39\xfa\xbc\x9b\x3f\x47\x1f\xe8\xcf" - "\x9f\x4f\x2b\x38\x7f\x3e\xdd\xe1\xe6\xcf\xd1\x56\x6f\xfe\x7c\x5a" - "\xeb\xcd\x9f\xa3\x9a\xe0\xf8\x73\x54\xe5\xe6\x0f\xff\x06\xe7\xcf" - "\x51\xed\xc0\xfc\x39\x3a\xc3\xcd\x9f\x4f\x6b\xfc\xe3\xcf\xd1\x15" - "\xbe\xf9\xf3\xa9\x33\x70\xfe\x1c\x7d\xa7\x0f\x7f\x34\xbe\xf9\x73" - "\xb4\x35\x00\xfe\x84\x73\xfe\x1c\xbb\xc5\xcd\x9f\x86\x2f\xfa\xf3" - "\xa7\xe1\x11\xce\x9f\x86\xd9\x6e\xfe\x1c\xcb\xf3\xe6\x4f\xc3\x0a" - "\x6f\xfe\x34\x54\x06\xc7\x9f\x86\x72\x37\x7f\xf8\x37\x38\x7f\x1a" - "\x2c\x03\xf3\xa7\xa1\xc1\xcd\x9f\x86\xe5\xfe\xf1\xe7\x58\xa8\x6f" - "\xfe\x34\x94\x0c\xc2\x9f\x51\x03\xf3\xe7\xd8\x13\xfe\xf3\xe7\x58" - "\xde\x60\xfc\x09\xcc\xf6\x3b\xc6\xec\xaa\x61\x28\xa7\xd9\x57\x39" - "\x48\x3b\xdc\x9f\x26\xe6\x1c\x6b\x2e\x13\x47\xb2\x58\x52\xf0\xbb" - "\x44\xbb\x96\xdc\xdf\x44\x3e\xbb\xab\x4c\x1c\xa1\xa2\x39\x65\xc9" - "\x62\xce\x76\x2d\x5d\x37\x52\x29\xae\x1b\xa5\xc4\xb3\x91\x03\x95" - "\xc5\xf7\x4b\x7e\xf6\x9b\x90\x89\x64\x0a\x9e\x77\x59\x0f\xf6\x33" - "\xfe\xee\xca\xf9\xac\x04\x6c\x41\xdd\x60\xe7\x2e\x70\xef\xd2\xfe" - "\x0d\x38\xee\xfd\xac\xba\xf7\xbc\x7a\x0e\x35\xa1\x8f\x22\xc3\x4d" - "\xb8\xc7\xfe\x33\xfb\x66\xe6\xf3\xa6\x5c\x15\x7f\x13\x3d\x81\x63" - "\x91\x16\xf2\xf9\x69\x9a\x5f\x8e\xf3\xc8\x9d\x60\xbb\x5f\x73\x8a" - "\x7c\x3e\xa3\x77\x4f\x17\x4d\x7a\x49\x9a\xf3\xdb\xc3\xf3\x1e\x7f" - "\x82\xe6\xef\xdc\x83\xf1\xef\x56\x9b\x31\xae\xdb\xf1\x07\xc1\xf6" - "\xbd\x15\xbf\x81\xfe\x57\xb6\xc1\x1d\xf7\xbd\xf0\xbd\x7b\x9f\x33" - "\xbf\x59\xe8\xe3\x8d\xef\xe9\x3f\x3e\x4d\xc6\x1d\x7c\x67\x0c\x3c" - "\x5f\x2b\xd9\xf7\x98\x7f\xec\x29\xd2\xe8\xf2\x78\xaf\x86\xe7\x2f" - "\xa0\xec\x71\xd2\xfb\x50\x78\x3e\x88\x76\x36\x3b\x7f\x5f\x94\x2d" - "\xed\x31\x6d\x2c\x87\x34\x8d\x94\x67\x1c\xe4\x29\x44\xdb\x5d\x2a" - "\x63\x3c\x3c\x3f\x8b\x63\x62\xe9\x7d\x04\x3c\x3f\x86\x6b\x01\xd2" - "\xfb\x6b\xe1\xf9\x07\xf0\xfc\x3d\x7e\xde\xa1\x47\xea\xa3\x8d\xca" - "\xe0\xce\x6c\x36\xb2\xf1\x1f\x8f\xd3\x8e\x63\x81\xc6\xb9\xee\xfd" - "\x3c\x9f\xb7\xf5\x79\xa7\xf7\x78\xd7\x28\xbf\xe3\x7b\xce\x1a\x37" - "\x78\xbc\xab\xe9\xf3\x6e\xbb\xc7\xbb\xbd\x7d\xca\xdc\xeb\xf1\x6e" - "\x57\x9f\xff\x35\x78\xbc\xdb\xd2\xe7\x5d\xa7\xc7\xbb\x3c\xe9\x5d" - "\x48\x57\xce\x71\xb5\x7b\x4d\xee\x73\x93\x94\x2e\x40\xba\x47\xfc" - "\x83\xcf\xf5\x52\x3a\x7c\xff\xf8\x4c\x1b\x29\xde\x23\xa5\x33\xde" - "\xf3\xf2\x8f\x2f\xf0\x28\x7f\x06\x9f\xfb\x38\xae\xef\xdd\x0b\x37" - "\xa6\xa2\x4a\xec\x49\x7a\x09\xde\x69\x11\x57\x9e\xd8\x5e\x99\xa6" - "\x7d\x2a\xf5\x17\xda\x94\xa5\x46\xdc\x8e\xb2\x62\x99\x51\xbb\x62" - "\xd5\x92\xa5\x5e\x7e\x97\x23\xd0\x6f\x19\xc6\xf5\x41\x9f\x0a\x92" - "\x8f\xf0\xd6\x5e\xdf\xf8\x20\x57\xe1\x5b\x30\xfe\xbf\x9f\xf9\x60" - "\xdf\xcc\xfd\x13\x57\xa3\x4f\x06\xee\x7f\x81\x3c\xdc\x44\x8e\x1f" - "\x93\xfc\x2f\x58\xba\x72\xfe\x41\x7c\xfb\x5f\x38\xd1\xc8\x7c\xa4" - "\x41\x3e\xee\x7f\xe1\x84\x0d\xfa\x79\x02\x1d\xc3\xfd\xe4\xf3\xf8" - "\x3a\xff\x90\x6d\x13\xfb\xa2\xf3\xcc\xcf\x58\x36\x9f\xdb\xe8\xeb" - "\xfb\x71\x67\x2b\xfe\x4f\x5a\xeb\x6e\xf5\xf8\xff\x72\xfe\x5e\xd6" - "\x0f\xd2\x37\xf3\x76\xe2\x5e\xd9\x31\x4d\xf0\xcc\xe6\xe3\xd9\xbb" - "\x7f\x70\x3f\x2e\xf9\x3b\x59\x9b\xb0\xdd\xde\x6d\x13\x7e\xda\x44" - "\xfe\xf1\x96\x47\xdb\x1a\x3d\xfc\x49\xc9\x6d\xe0\x3e\xbb\xfa\xb7" - "\x95\x9d\xd7\xa1\xaa\x9d\x76\xfc\x36\xca\x33\xbe\xd7\x1d\x9e\xf3" - "\x77\xb6\xc9\xf5\xf1\xa8\x1f\xdb\x47\x07\xf5\xfb\x82\xd3\x04\xe4" - "\x07\xf0\x54\x6a\xc3\x2b\x34\xe7\xf8\x06\xb6\x77\x1b\xcf\xee\x61" - "\xec\x02\xa6\xab\x4e\x2c\x97\xe7\x2a\x51\x47\x71\x5f\xd8\x27\xdc" - "\xf6\x1f\xfa\xf9\xc9\x97\xf5\xd7\x09\x0f\xfb\x8f\x7f\x13\xd2\x76" - "\x79\x62\xc8\xe3\x7b\xc7\xf0\x7b\x90\x6f\x01\xdf\x2f\xbe\xb3\x0d" - "\xfb\x3b\x3c\x33\x3f\xa2\xf8\x5f\xac\xa3\xaf\x58\x50\xbe\xfc\xb0" - "\xb9\xe9\x68\x8b\x96\xe9\xb8\x99\xc5\x2a\xb1\x4d\x97\xe7\xf1\xd8" - "\x79\x15\xc8\x83\x7d\x0b\xe5\x13\x55\x1d\xb3\x1c\xd0\x9e\x85\x3a" - "\xd9\xf4\x5c\xee\xda\xb7\xdc\xa9\x26\xc9\x9c\xc6\xb6\x67\x51\xd6" - "\x63\xdf\xe1\x32\xdf\x56\x2f\xf1\x3e\x9e\xb7\xc3\xb6\x15\xd3\xdd" - "\xfb\xb4\x6d\x76\x39\x9f\x2c\x9f\xf9\x3a\x94\xed\x43\x96\x8f\xc7" - "\xaa\x9c\xc3\x79\xff\x3d\x4d\x13\xb1\x35\x4a\xf9\xd9\xde\x51\xee" - "\x5f\xc3\xe6\xa0\xf9\x6f\xcc\x81\x3a\xb7\xda\xc8\x71\x69\x9f\x31" - "\xff\x2e\xdc\x1b\xb1\x2e\x48\x2b\x3c\xfb\x49\xf3\xed\x5b\x80\x4f" - "\xf1\xbe\xe2\xa3\xf3\xfd\xed\x4d\xcc\x07\x11\xc6\x82\xc0\x39\x58" - "\x2e\x93\x9b\x52\xe9\x39\x5a\x85\x3e\x3e\x21\x8f\x5a\xce\xc3\x65" - "\x38\x7b\xc7\xf6\x23\x1b\xd2\x70\x9e\x48\x7a\x97\x86\xe7\xe3\x7a" - "\x7f\x8f\xf4\xf8\x3d\x02\x7f\xd3\x34\x5a\xb9\x69\x2d\xd3\xb1\x4a" - "\xf7\xd9\xdb\x26\x23\x3c\xab\xfb\x3c\x47\x78\x3d\xaf\x21\x51\x6c" - "\x5f\x6d\x27\x6d\x66\xfb\x8f\xa5\x74\xa9\xec\xd1\xac\x3e\x69\x74" - "\x06\x60\x04\x63\x5e\x2e\x94\xfa\xa3\x13\xcf\x60\x86\x3b\x9f\x60" - "\xe7\x2f\x31\xd6\xbb\x74\x8f\x95\xee\x31\x3c\x4e\x60\x53\x8c\x3b" - "\xd6\x2f\xce\xd5\x34\xcd\xf4\x15\x7b\x58\x8e\xcd\x2c\xc7\x1e\xc6" - "\xf3\x9b\x52\x8c\xa2\x85\xf0\x3f\xe3\x60\x71\x9e\xe1\xfd\x66\xf9" - "\x2c\xa6\x2b\x6f\xe7\x76\x31\xaf\x01\xfd\xbe\xde\x80\x3e\x87\xb2" - "\xda\xd0\x67\x43\x27\xb1\x92\x6e\x62\x35\x76\x65\x63\x9c\xba\x3a" - "\x1e\x9f\x2e\x0c\xf9\x81\x67\x81\xd0\x86\xac\x33\x9c\x66\x31\xea" - "\xd2\xdb\x48\x94\x21\x8e\x36\x03\x0d\x1c\xae\xfc\x9d\xdb\x25\x1c" - "\x6d\x05\x5d\x38\xe5\x14\xf9\x92\xc9\x66\x16\x57\xb5\x8d\xad\x67" - "\xa9\x5a\xc8\x97\x79\x2c\x0f\x4d\xda\xca\x69\xf7\x25\xd3\x0f\xdb" - "\x72\xe4\x38\x64\x5f\xc6\xca\xb1\x4e\x6d\xe4\xcb\x82\xb3\xa3\xdf" - "\x2c\x87\xb4\xd9\xde\x7b\xa1\xbf\xc4\x98\xac\xe1\x58\x77\xc8\x43" - "\xb0\x6c\xc8\xe3\x96\xff\x90\x9e\xee\x24\x93\xa0\x5e\x2d\x72\xf9" - "\xf0\x3e\xcf\x46\xbe\x60\x3a\x06\xcb\x3c\x9b\x7f\xac\x1e\xd2\x4a" - "\x6c\xc2\x73\x5a\xbe\x97\xfa\xcb\x72\x1b\x29\xd9\x33\x98\x2d\x04" - "\x7d\xc1\x04\x7d\x29\x5b\xcc\x7b\xc3\xc0\xfd\x03\xbf\x61\xe2\x73" - "\x8f\x5f\x9e\xc5\xfd\x5a\x9b\xce\x11\x25\xce\x05\x72\xcc\x36\xb3" - "\x73\x85\x98\x06\x32\xbb\x1c\xfa\x08\x6b\x5f\x60\xfa\xbf\x99\x9f" - "\x83\x68\x27\xaa\xa2\x14\xd9\xbf\x71\xf3\x3c\x0f\x5f\xeb\xd2\xf9" - "\x88\xe6\x35\x75\x26\xb6\x8e\xcd\xea\xd8\xb7\x0e\x58\x5f\xa0\x53" - "\xa7\x4f\x5b\x53\xf5\x86\x81\xad\xb9\x6c\xac\x28\xe0\x7b\x4f\x9b" - "\xf7\x85\x44\x4e\x7c\x0e\xbe\xb5\x57\x9e\x4b\xc4\x3c\x45\x18\x03" - "\x14\xca\xef\x6d\x67\x0a\xfb\x46\x33\xef\xeb\xcd\x0e\x31\xff\x0d" - "\x03\xd6\x41\x4a\x77\xd4\x39\x1d\x78\x76\x7b\x40\x3f\x38\x2c\xbe" - "\x13\xee\xf5\xde\xf8\x86\x01\xcf\x97\xdc\xe9\x90\xeb\x7c\xd2\x81" - "\xe7\x1a\xb0\xce\x9c\xb6\x27\x4f\xcb\x74\x2c\x6c\x87\xb2\xcd\x9f" - "\x91\x66\x72\x32\x15\xf7\xc3\xe1\x39\x1d\xec\xc3\x9c\x06\x27\x53" - "\x59\xbe\xee\xde\x3c\xcc\xdf\x05\x8b\x19\x02\xe5\x97\xb1\xf8\x42" - "\xd0\x06\xe0\x85\xc5\x8c\x67\x76\x4f\xb2\xb1\xdd\xfa\x14\xc2\xdb" - "\xcd\xf6\xbf\xb6\x44\x71\xac\x9c\xdc\x23\xeb\x0c\x9b\x94\xb6\x09" - "\xbf\x9d\xd6\x4d\xce\x90\x93\xbf\xc3\x18\xbf\x40\x8f\x6c\xf4\x1f" - "\x55\xd7\x09\xfd\xc4\xd4\x8d\x58\xc0\xd8\xc0\x80\xa1\x93\x9b\xb9" - "\x9e\x43\x9a\x9f\x34\xe1\xf7\x91\xb6\xc0\x3b\x3b\xd0\x34\xbf\x2b" - "\xa7\x45\x23\xd3\xb4\x68\x02\x8e\x7b\x4e\xc6\x0c\xa6\x23\x5c\x50" - "\xe7\x3a\xb0\xae\x2c\x93\x3e\xc3\xfa\x1d\x13\xc7\xbc\x61\xc0\xbd" - "\xd6\xf0\x3b\x53\x92\xed\x8c\x77\xbc\x2f\xb5\xbc\x01\xdf\xd8\x83" - "\xfb\x16\x50\x56\xa2\x8f\x23\x48\x4b\x92\xe8\xc7\xfc\xdc\x17\xa7" - "\x71\x3a\xf0\xfc\x5f\xa9\xf9\xbc\xf1\xc4\xbf\x40\xbd\x3c\xd6\x7f" - "\xbe\x62\xfe\x56\xca\xa4\xb8\xdc\xf0\xee\x80\x47\x9d\x3b\xd9\x39" - "\xc9\x76\x9c\xf3\x6b\x59\x8e\xdf\x2a\x44\xff\x3e\x88\x8b\x53\x9e" - "\xf8\x6f\x79\x04\xeb\x89\x7b\x79\x5d\xa3\x2b\x0a\x40\xef\x16\x23" - "\x9d\xe1\x3f\x1b\xa0\x2f\x18\x06\xd1\x89\x2c\x96\x54\x57\xce\x57" - "\x33\x64\x9d\x08\xe3\x0c\xd0\x0b\xad\x77\xb1\xf1\x27\xd8\xd5\x56" - "\x11\xed\x9a\xd6\x58\xc4\x0d\xf4\xf5\x66\x49\xc6\x36\xc3\x7f\x96" - "\xcb\x6b\x62\x2e\x3c\x0f\x71\x86\xad\xe3\x76\xca\xf1\x96\xb8\x3f" - "\xad\xaf\x8a\xdd\xe7\x27\xbe\x2a\xe9\x77\x7e\x02\xcf\x8d\xbc\xc0" - "\x62\xfc\xec\x42\x9d\x52\xdb\xd6\x8c\x3a\x82\xfd\x1f\xcf\x54\x98" - "\x61\x6c\xce\xcf\x9e\x34\xe3\x3c\x3d\x8b\x8f\x80\x75\xe1\x3e\xf1" - "\x9b\xd8\x6f\xc0\xad\x12\xef\x1c\x4b\xad\xa4\x37\x66\x2f\xf0\x1b" - "\xd7\xe0\xf6\x2b\xff\x9d\x58\x6e\x42\x7d\xdd\x7a\x17\xc6\x9f\x85" - "\x3c\xd1\x72\xec\x59\x16\x6b\x96\xb7\x67\xc0\xb1\x1c\xf3\xf1\x76" - "\x07\x89\x45\x9f\x18\x78\x0e\x8b\xd1\x40\x65\x9f\x81\x7e\x63\xd1" - "\x07\x9e\x65\x2d\xc6\x6f\x68\xfd\xe2\xb7\x13\xd8\x59\xd6\x4e\xcb" - "\x1d\xed\xb8\xbf\xaa\xad\x25\x83\xf9\x45\x51\x25\x9a\x9c\x14\xff" - "\xc7\xec\x8a\xd1\xf6\x19\xf8\x8e\xf9\x4f\xc7\x32\x83\xf6\x81\xda" - "\xba\x4b\xb2\x51\xdb\x40\xee\x5f\x07\xbc\x62\xeb\x1a\xf0\x7b\xc2" - "\x29\x72\x6a\x34\x8f\x87\xc8\xfd\x79\x4b\xfb\xac\x47\xf2\x33\xf2" - "\x40\x33\xe6\x2b\xf4\xeb\x4c\xed\x6d\x18\x3b\xf4\xeb\x75\xcc\xa7" - "\x6e\xde\xce\x4e\x89\x06\x9d\x9b\x78\xbd\xc2\x17\x99\x04\x56\x47" - "\xac\x5f\x60\x75\xfb\x7a\x8e\x34\x9e\x18\xd9\x95\xf3\x75\x81\x7c" - "\xb6\x9e\xdb\x55\xdc\xd7\x2e\xe7\xc5\xd7\xd2\x19\xb3\x9d\x0e\xe9" - "\xdb\x8e\x61\xf8\xf6\x01\xa9\xcc\x1a\xee\x6f\xb8\xd5\x00\xe5\xd6" - "\x74\xe5\x9c\x8a\x90\xc7\x35\xd2\xd9\xa0\x18\x3e\xde\x3a\x15\xe3" - "\x1e\xd7\xb4\xf6\x3b\xe7\x3b\x6b\xd5\x2a\xa3\x76\xc9\xb2\xd5\x86" - "\xc5\xc6\xa7\xf5\xda\xa5\x29\x29\xab\x52\xb4\xe8\x2c\xc5\xb3\xff" - "\xf0\xf8\x26\xa7\xe2\xa5\x78\x5e\xe5\xee\x78\x5e\xa7\xf2\x3c\xe3" - "\xce\xd9\xc8\xa9\x82\xe1\x99\xc3\x38\x55\xee\xab\x9c\x62\x41\xac" - "\x84\xab\x0a\x2e\x0b\x5c\xd5\x38\xa7\xb1\xc8\x41\xe2\x41\xd7\x33" - "\xfb\x50\xf6\xc5\x2e\xe6\x9c\x4a\xc6\xbd\x43\x4d\xe4\x9f\x23\xca" - "\x44\x25\x61\x3e\x40\x72\xc4\x4a\xcc\xbf\x0d\xfe\x0f\x97\x05\xae" - "\x6a\xb8\xd8\xff\xc4\xf7\xd9\xb9\xea\x4a\xcf\x77\x7c\x5f\x88\x29" - "\x16\xf3\xd0\x75\x4a\xb6\xfe\x2b\xfe\x37\xcf\xd7\xa7\x0e\x02\xcd" - "\xf9\x72\xaf\x94\x8f\xe9\xd7\xb0\x75\x44\x3b\x40\xbe\x10\x9a\xf3" - "\x59\xa5\x94\x8f\xed\x77\x91\xdb\x83\x7e\xcb\x21\xbf\x9c\x4f\x49" - "\x73\x5a\x67\x4b\xf9\x98\xdc\x14\x73\x84\x81\xbe\x3b\x82\xe6\xfc" - "\x8f\x4e\xca\xa7\xf1\x2c\xcf\x23\xcf\x48\x31\xa7\x7e\x17\xe6\x11" - "\xd7\x29\xb9\xdf\x84\x9c\x53\xe5\x90\x7f\x40\x7f\x8f\x81\xf1\xa9" - "\xad\x9f\xff\x27\xc3\xd3\xcb\x96\xde\xbb\x6c\x65\x1a\x46\xa0\x31" - "\xae\x4a\x35\xe2\x7d\xe5\xe2\x5f\xb1\xdb\xaa\x45\xcf\x3c\xcd\x7f" - "\x18\x97\xc7\xe2\x8f\xe5\x80\x37\xbc\x2f\x49\x35\xe0\xed\xe9\x55" - "\xf8\x68\xd2\xc7\xa4\x3e\x2d\x87\xa2\xf6\xc4\xa1\xae\x2b\xa7\xcd" - "\x01\xd8\x68\xe5\x72\xf6\xb4\xd2\x46\x3e\x63\x72\x19\x63\x52\x1c" - "\xd4\x39\x89\x3c\xbf\xc5\xf9\xdf\x36\x8f\xfb\x66\x3c\x3d\xae\x4c" - "\x1c\xa5\x0a\x5f\x67\x78\x3a\xdc\xb9\x6c\x29\xe8\x8c\xbd\xf0\xdf" - "\x78\x1b\x79\x7a\x0e\x97\x8d\xe5\x4a\xe6\x87\x30\xa7\xad\x58\xda" - "\xb3\xa9\x14\xf3\x76\x56\xa1\x2f\x70\x78\x66\x31\x5f\xe1\xb9\x19" - "\xf2\xe1\x9e\x4e\x8c\xf5\x1a\x01\xcf\x16\x9c\x9b\x82\x67\x8c\xa1" - "\x1a\x25\xe6\xbd\x54\x8f\x67\x51\xe1\x59\x0b\xcf\xd1\x50\xfe\x76" - "\xb9\x5f\x0c\x6c\x2b\x9f\xb6\xc8\x71\x68\x79\xcc\xd9\xd3\xf5\xbd" - "\x31\x67\x31\xce\x8c\x59\xc3\xe2\xd2\x70\x1b\xe4\x74\x67\x48\xe4" - "\xf5\x63\x20\x4f\x67\x6f\x1c\x1e\x36\xef\x71\x46\x29\xef\x97\xe1" - "\xf3\x1a\x67\x22\x3c\x62\xf7\xe2\x73\xb4\x1c\xbb\x17\xe7\xbd\x58" - "\x6c\x34\xb8\xd3\x1c\xf4\xf7\x48\x07\x3c\xb7\xcc\x63\xea\x9d\xc9" - "\x47\x3f\x9f\xf6\xac\x25\x8a\x9b\xcb\x70\x2e\x0d\x9e\xb9\x8f\x37" - "\x7a\x86\x9c\x61\xfb\xaf\x65\xff\x4f\x9e\x3e\x07\x06\x3c\xe7\xf4" - "\x09\xd8\x0c\x2c\x66\xc8\xf2\x55\xe1\xce\xc5\x4b\xb9\x1d\x78\xe6" - "\x6b\x2e\xbf\x2a\x2a\xb9\xbd\x70\xe6\x30\x9d\xcf\xe3\x2c\xd8\xc8" - "\x37\x49\x38\x66\x09\x57\x2c\x5f\x45\xe1\xbf\xe1\xa6\xc5\x4b\x59" - "\x1a\xe4\x5b\x0f\xb6\x9a\x54\xbf\xb7\xad\x51\x78\x3e\x52\x94\x7c" - "\x29\x9c\xa9\x7a\x72\x72\x36\x7e\x47\xc5\xec\x90\x4f\x88\x1a\x63" - "\xdb\x61\xdd\xca\x3c\xfc\x53\x6d\x82\x34\xdc\x1b\xda\x31\x9f\xa8" - "\xd1\x4f\xa7\x54\x97\x2a\x1e\x6b\xe8\x9b\x79\xb2\xaf\x18\x1b\xa4" - "\xf5\x6d\xcf\xfc\x9f\x30\x54\xde\xf2\x74\xcc\xbc\x07\xe1\x57\x8c" - "\x14\x56\xd5\x13\x9b\x51\x1d\x63\x5e\x37\x75\xfc\xfe\xfe\x5f\xf0" - "\x18\x80\xdf\xc0\x18\xe2\x0c\xdb\xeb\x2b\xe2\xb8\xa4\x2b\x69\x0b" - "\xdf\x5b\xfa\xcd\x31\xf4\x8b\x29\xe6\xa0\x3d\x89\xe7\x6b\xbf\x61" - "\xf2\x8b\xaa\x2a\xf6\x6c\xcb\x44\x7f\xb1\x0a\xa0\xf1\x37\xef\xe0" - "\x3b\xc9\xe7\x8e\xc0\x7c\xd4\xb8\x48\x24\x3b\x5f\x0a\x36\x0a\xfa" - "\x97\x69\x21\xed\x6f\xa1\xdd\x81\xf3\x4a\x62\xce\x37\x4b\x10\xb7" - "\xc0\x63\xf4\x35\xd1\x49\xc7\xec\xdc\x41\x47\xef\x5e\x80\x38\x46" - "\x5b\xd7\xaa\x41\x9a\xd9\x51\xe7\x24\xc0\xf5\x53\x1e\xcf\xe2\xf1" - "\x56\xb9\x4c\xf4\x8b\x04\x36\xd4\x5e\xb8\x6b\xba\x72\xec\x49\x1e" - "\xb1\xba\xa4\xf3\xb4\xf6\x35\xe8\xaf\x09\xcb\xe6\xb6\x73\xfb\x2b" - "\xdc\x06\xb1\x6f\xb0\x91\xf0\x99\xbc\x2f\xda\xc1\xfe\xc9\x8e\x91" - "\x7e\x83\xfd\x13\xb3\xbd\x4f\x19\x27\xe5\x39\x53\x8e\x69\x3b\xce" - "\x3d\x24\xc0\xf5\x53\xc8\x5f\x23\xc7\x6b\x5e\x2f\xb0\xf3\x8f\x2d" - "\x21\x91\x78\x2e\xda\xde\x2c\xa7\x8f\x50\xc4\x03\x4d\xed\x9d\x72" - "\xdf\xef\x18\x53\xb1\xa5\x2b\xe7\x5b\xa5\x3c\xd7\xc2\xe7\x5e\xbe" - "\x8d\xf0\x78\xde\x01\xcf\xd1\xf2\x33\xfc\x8e\x95\x65\x05\xfc\x86" - "\xf1\x6f\x56\x9b\xf4\x7b\x8e\x8d\xe4\x94\x4b\xbf\x17\xd8\x84\x8c" - "\xd9\x72\xbd\xc5\x9c\x90\x70\x5e\xf7\xf6\x02\x31\xbf\xc1\x86\x31" - "\xb2\x21\x8f\xc9\x46\x4e\xb3\x3d\xe9\xe8\x1f\xa9\xa0\x5b\xb3\xc0" - "\xba\x01\x6c\xe2\x67\x10\x4b\xed\xac\x6f\x14\xae\xd5\xcc\x43\x7b" - "\x12\xfd\x40\x30\x5f\x5a\xe8\x3f\xce\x49\x46\x32\xbf\xe3\xf9\x0d" - "\xf5\xcc\xdf\x76\xba\x4e\x2d\xfb\x8e\x03\x39\xb3\x90\x0a\xcf\x6c" - "\x40\x7f\x72\x2c\xbe\x40\x97\x2e\x8c\xf9\x90\x93\x7c\xc7\x95\xa6" - "\x91\x88\x12\x91\xfb\x8e\x63\x3e\x22\x46\xc2\xf8\x23\x6d\x60\xff" - "\x71\x34\xe7\x95\x7a\xd9\x7f\x1c\x3d\xe7\x72\xc0\xef\x68\xe0\xb9" - "\x12\xee\x3a\xf6\x8c\x3e\xe4\xb8\xef\x60\xe5\x80\xfe\xe4\x04\x90" - "\x67\x02\xf7\x27\x17\x98\x1e\x68\x4f\xe2\x98\x68\xdf\x22\xc7\x8e" - "\xf6\x48\xdb\x05\x7d\x61\x33\x4f\xb3\x4b\xbe\x61\xda\x41\xfe\x65" - "\xc5\x4b\x7b\x24\xed\x38\x2f\xb6\x99\xcd\x7d\x7d\xe3\xa4\x3d\xfa" - "\xad\x03\xc9\x92\xf6\x31\xed\x95\xed\x6c\x2f\x60\x07\xd8\xbe\x1d" - "\xcc\xde\xe2\x63\xc4\x0e\xd2\xb7\xbf\x3e\xf5\xf4\xaa\x25\x4b\x17" - "\xfd\x72\x85\x41\x3b\x7f\x41\x02\x0b\x8c\x16\xa3\x5d\x66\x5c\xca" - "\x54\x8d\x76\xfe\x83\xb3\x12\x13\x17\x2c\xfa\xc9\x82\x07\x16\x3c" - "\xf6\x93\xfb\xf8\x09\xc3\x05\x29\x6b\x30\xb8\x9e\x71\x95\x16\xff" - "\xf4\x94\x14\xfa\x76\xed\xd2\x94\x55\x7d\xfb\x79\x04\x9b\xbf\x12" - "\xd8\x9c\x6d\x27\xfe\xe6\x73\x64\x1d\x25\xf2\xdc\x15\x97\x69\x1d" - "\x85\x48\x5b\x16\xeb\x30\xa7\x23\x02\xed\x26\x29\xc6\x30\xea\x13" - "\x25\xf6\x55\xd4\x2b\xd0\x96\xea\xde\x78\xa8\xbd\xf3\x67\x1d\x6d" - "\x02\xfe\x4f\xea\xa3\x3c\xad\x53\x41\x27\x4d\xca\xe2\x7e\xf8\x3b" - "\x9c\xf2\xbc\x36\xa6\xc9\x75\x68\xc2\x3c\x39\x1d\x0f\xba\x63\x72" - "\x76\x46\xbb\xe3\xce\x91\x7e\x34\x22\x04\xcd\x94\x11\x60\x83\x8c" - "\x84\x6b\x14\x5e\x73\x7a\xe5\x76\x1a\x6d\xc0\xb1\x58\xb8\x02\x74" - "\xab\x29\x84\xc7\xbc\xc9\x3d\xcc\xfc\xb3\x27\xba\x9c\x21\x8b\x5c" - "\x02\xdc\x43\xe8\x22\x97\x92\x8d\xff\x68\x1a\x3d\x8c\xbe\xd0\xe0" - "\x7f\xf5\x18\xdb\x09\x70\x9c\x97\xe8\x34\xe7\x25\xba\xa8\x73\x11" - "\xd8\xe5\x70\xff\x0a\xcf\x78\x27\xba\xbe\xa2\x2c\xae\x05\xe4\x2d" - "\xe2\xfe\xbf\xaa\xf1\x3c\xea\x93\x80\xe1\xb2\x76\x1e\xd7\x33\x71" - "\xcd\x37\x27\x16\xad\xb1\xf1\xb8\x9e\x67\x78\xfc\x5a\x1e\x97\x97" - "\x98\xa1\x9c\x0f\x17\xb9\x42\xb4\x89\xae\x1e\xca\xcf\xa9\x9e\x55" - "\x0d\x16\xab\x73\xc0\x79\x89\xdc\xea\x4a\x5a\xb8\x7a\x03\xcd\xfd" - "\x28\x9b\x16\x1a\x95\x34\x6f\xb7\x09\x65\x33\xcd\xad\x9b\x07\xcf" - "\x90\xfe\xb1\x96\x16\xa6\x2a\x69\xee\xdf\xed\x70\x87\xe7\x4f\x2d" - "\xb4\x30\x0d\x9e\xdf\xc8\x83\xff\x65\xd3\xdc\x3f\xe1\xff\x08\xcd" - "\x7d\xd3\x04\x77\x78\xde\x63\x80\x7c\xf0\xfc\x96\x1e\xee\xf0\xfc" - "\xbf\xc9\x2d\xe4\x6c\x0d\xfc\x07\xd2\x8e\x15\xf3\x6f\x35\x16\xb3" - "\x6f\xe5\x9e\x28\xe6\xdf\x68\x2a\xe6\xdf\x38\x59\xcc\xbf\xd1\x5a" - "\xcc\xbf\xf1\xe7\x24\xc8\x9f\x47\x73\xab\xaa\x21\x1f\xd4\xf5\x2f" - "\x33\xe0\x0e\xcf\x7f\x2d\x87\x7c\xf0\xfc\x4e\x24\xdc\xe1\xf9\x5d" - "\xa8\x4b\x1a\x3c\xbf\xe7\x80\xfc\x05\x34\x77\xdf\x72\xc8\xa7\xa6" - "\xb9\xef\xdb\xe0\x0e\xcf\x07\x16\x40\x3e\x78\x3e\x08\xe5\xa4\xc2" - "\xf3\xdf\x66\x42\x7e\x78\xfe\x27\xd6\xa7\x98\xe6\x9e\xc6\x72\x35" - "\x34\xf7\x0c\xe6\x87\x67\x3b\x94\x97\x0a\xcf\xed\xb1\x70\x87\xe7" - "\x8e\x06\xc8\x0f\xcf\x67\xa1\xad\xab\x37\xd3\xdc\xae\x18\xc8\x17" - "\x41\x73\x1d\x90\x6e\x84\xe7\xee\x0d\x90\x0f\x9e\x9d\x98\x1f\x9e" - "\x5d\x8d\x90\x1f\x9e\x29\xd2\x68\x0b\xdd\xa8\x68\x85\x7c\x91\x74" - "\xa3\x72\x0e\xdc\xe1\x79\x24\xd6\x1f\x9e\x47\xab\xe0\x0e\xcf\x63" - "\x81\x56\x69\xf0\x1c\x0a\xf5\x5b\x5d\x42\x37\x6a\xb0\xfc\x28\xba" - "\x71\x3c\xd2\x07\x9e\x23\x3a\x21\x1f\x3c\x5f\x07\xf4\x48\x85\xe7" - "\x89\x7b\x21\x7f\xd4\x80\xfc\xdc\x18\xb5\x99\xae\x1b\x49\xe8\xc6" - "\x5b\x54\x74\xdd\x28\xb8\xdf\x5a\x45\xd7\x8d\xd0\xd1\x8d\xb7\x45" - "\x42\x3a\xdc\xbf\x57\x0c\xcf\x31\xd2\x33\xdc\x75\x7a\x78\x8e\x95" - "\x9e\xe1\x3e\x35\x1e\x9e\xa7\x4b\xcf\x70\xbf\xbd\x1a\x9e\x67\xd0" - "\x8d\x31\xdb\xe1\x19\xef\xd3\xe1\x79\xa6\xf4\x0c\xf7\x3b\x96\xc0" - "\xdd\x69\x9f\x1c\x37\xc7\x1e\x9a\x40\xec\xa1\xe9\x06\xd4\xd1\xae" - "\xa2\xd5\xd9\x62\x98\x11\x63\xe2\x8d\xcc\x3a\x8b\xf1\x30\x1d\xeb" - "\x50\x4e\x58\x33\x6c\x2c\x16\x98\xe4\x4f\x6e\x64\x13\xe9\xfa\x1d" - "\xd8\x33\x33\x30\xae\x39\xb4\x7d\x2f\xcd\x19\xd1\x0e\x6d\x9e\x49" - "\x73\xc6\x36\xc1\x1d\x9e\xc7\x7d\x02\x6d\x86\xe7\x7b\x36\xc2\x1d" - "\x9e\x1f\x9f\x05\x6d\x9f\xd9\x95\xd3\x05\xf2\xf1\x2c\x5f\x73\xf8" - "\xfd\xfd\xc9\xe1\xce\x2c\x9a\xe8\x04\x7d\xb0\xd5\x1c\x1b\xee\x4c" - "\x26\xb4\xd0\xa4\x09\x47\x5f\xfd\xa5\x71\x79\x34\x2c\x81\xd5\x09" - "\xe3\x71\xd0\x9e\x68\x81\x7f\x7b\x2c\x6d\x22\x8e\x1b\xd1\x6f\x3c" - "\x0d\x7b\xdc\xd7\xfb\x07\xd8\xfb\x49\xe6\x78\xfe\x5e\x43\xdc\xef" - "\x7f\x8a\xef\x17\x87\xa3\x4f\xe3\x29\x77\x80\xfd\xec\xc8\xc3\x3c" - "\x36\xd2\xb5\x83\xe6\x84\x10\x6b\x67\xab\xd4\xc6\x51\x98\x2f\x1f" - "\xff\xe7\x6b\x3e\x46\x2c\xc8\xd0\x17\x82\xdc\xc2\xf1\x29\xe8\x2f" - "\x41\x6b\x8e\xae\x6a\x22\xdd\x49\xa5\x68\xbf\xa8\xcd\x2a\x2e\xcf" - "\xce\x4f\xee\xd9\xb8\xbb\x44\xbb\x36\x1c\xca\xeb\xfe\x59\x96\x83" - "\x76\x5a\xcc\xe8\x27\x88\xa5\x37\xf0\x33\x3a\xec\xf7\x01\xbe\x77" - "\x93\xfd\xae\xe4\xf3\xc1\xdd\x49\xf8\x5f\xcf\xf1\x80\x2b\xf7\xc6" - "\x66\x31\xcc\xac\xe1\x6b\xdd\xe7\x6f\x7c\x47\xb4\x09\xe1\x46\x32" - "\x42\xbb\xf6\x3d\x28\xff\xbc\xde\x6b\xec\xd8\x9b\x97\xbd\x7b\xe4" - "\x5d\xc8\xfb\x32\x9b\xe7\x39\xdf\x1b\xff\x93\x42\x1b\x7e\x8d\xba" - "\x4b\x20\xf1\xa8\x4f\xb9\x2d\x7a\xde\x81\xbe\x25\x9d\xea\x74\xbb" - "\xb3\x60\x96\xdd\x55\x60\x56\xd1\x22\xb3\x26\xcc\xa9\x20\x7c\xcf" - "\x7c\xf7\xb4\x3b\x1d\x68\xfb\x1d\xc2\xbc\x27\xc5\x91\xb7\x47\xde" - "\x61\x22\x82\x25\xe5\x33\x78\xee\xbe\x85\xe6\xc6\x16\x5b\xdb\x1a" - "\x88\x25\x05\xcb\xea\x8e\xa6\xb9\x33\x23\xc4\x91\xf7\x44\x95\xa1" - "\x0d\x6d\xc2\x39\xb0\x4f\xf0\x7f\x7f\x00\x3a\x83\x1e\xe8\x56\xf6" - "\xc6\xe7\x05\x5a\x16\x02\xed\xd0\xbe\x45\x7f\x13\x8b\x5c\x2e\xf4" - "\x07\x96\x67\x03\x3a\x70\x1d\x79\xbe\x15\x63\x1b\xf3\xef\x76\xdf" - "\x27\x8e\xd9\x9d\x57\xb7\x10\xd7\xf5\x34\xe8\x5f\xa9\x93\x9d\x51" - "\x77\x62\xbc\x33\xd4\x15\x3c\xaf\x27\xef\x56\x3c\x6d\x58\xb4\xd6" - "\xb0\x2a\xc5\xb8\x28\xd5\x70\xaf\x16\x06\x75\xda\x55\xcf\x68\x57" - "\x2c\x5d\xb1\x2a\x65\x4d\x5f\xfd\x08\x63\x9b\x6e\xb0\xff\x1c\xcc" - "\xa6\xfa\x10\x6c\x6b\x3e\xb7\xee\x5c\x8e\xbc\xde\xfa\x02\xf7\x55" - "\x0f\x79\x40\xff\x3f\xcd\xd6\x20\xc4\x2d\x66\x1d\x2d\x89\xcb\xcb" - "\x47\x3f\x1b\xa9\xe8\x0b\xdd\x4e\xac\xa4\x9d\xc7\x18\x64\x71\xb4" - "\xc0\xd6\x4f\xcb\xa4\x96\xb4\x76\xc4\x38\xc8\x8f\xf4\x48\xc0\x78" - "\xfd\xf9\xc2\x04\x7d\x13\x71\xce\x3b\x5f\x98\xae\x92\xe3\xa0\xb8" - "\x0a\xd2\xf5\xa2\x3a\x23\x1b\xe3\xa0\xf4\xd0\x48\x52\x0b\xb4\xec" - "\xce\xdb\x6d\x04\x19\x6f\x28\xcd\xa1\x55\x2e\x18\xfb\x30\x5f\x32" - "\xbf\xbf\x3f\xde\x45\x75\x4a\x57\x0e\x51\xc1\x3d\x8c\x86\x65\x56" - "\xf6\xa8\x4d\x04\xdf\x63\xfc\x13\x57\x8f\x8e\x98\x0f\x53\xf1\xe7" - "\x7a\xc0\x4d\x0e\xa1\x2c\x76\xa4\xfe\x34\x81\xf4\x31\x62\x51\x7a" - "\x71\xcb\x1c\x22\x60\x5e\xb0\xcf\xc8\x42\xf8\x9d\xb1\x98\x84\x42" - "\xbe\xf0\x8c\x0f\x21\xbd\x4b\x37\xc6\x99\xa5\x53\x75\x67\xe9\xc6" - "\xf4\x50\x9d\xda\xda\xec\x20\x3d\xb7\xdc\x3f\x6f\x9a\x9d\x28\xb7" - "\x82\x1d\x57\x2a\x42\xff\x2a\x89\x33\xb8\x9e\xd3\x8d\x74\x3e\xa7" - "\x53\xf6\xf4\xe8\x54\xce\x74\x9d\xb2\x3b\x5d\x37\xb2\xa7\x4b\xa7" - "\xb2\x2e\xb1\x93\x43\xf6\x3f\x92\xba\xe6\x56\x36\xff\xda\x13\x9a" - "\xb9\xb7\x27\x34\xbd\x44\xdd\x4c\x22\xee\x30\x80\x1d\x97\x43\x14" - "\x2f\x81\xcd\x0e\x98\x50\x3b\x5f\xbb\x3f\x9e\x16\x66\x82\xbe\x71" - "\xde\xfd\xe0\x54\xfa\x8d\x2b\x97\x38\xb5\x0f\x83\x2c\x82\xb1\x3d" - "\xa4\x01\x7e\x42\x97\xd3\xdc\xd1\x7b\x60\xac\x1f\x05\x97\xd6\xc6" - "\xf9\x00\xfd\x9a\x56\xe2\xf8\x1f\xf3\xf2\x7c\x23\xa1\x1f\xe3\x5d" - "\x98\xc7\xe2\x33\xe6\x74\x2f\x29\x65\x36\x84\x53\x2f\xdb\x10\x07" - "\x94\x03\xfb\xf2\x80\x3c\x05\xbd\x63\x69\x11\xe4\x49\xe1\x6a\x5f" - "\xf3\xb0\x4a\xf4\x83\x4a\x8b\x56\x6f\x2f\x16\x7b\xfd\xa6\x82\x3c" - "\x74\xbe\x05\xfd\x27\x9b\xbd\x2b\x30\x69\xcc\xdf\x92\x10\x7c\x57" - "\x79\xce\x21\xe0\xb3\x36\x45\x41\xad\x9d\x0e\x02\xff\x51\xd2\xa8" - "\xb8\xbc\xca\x73\x76\x01\xf1\x52\x07\x69\xf0\xdf\xda\xe2\x73\x52" - "\xb9\x5b\xcc\xb1\x59\xcf\x12\x16\x2f\x00\xe3\xa3\x20\x8e\x8a\xcd" - "\x30\x16\xc4\x58\x2e\x29\x21\xd0\x8f\x5d\xa3\xe1\xb7\x0a\xf3\x51" - "\xb5\x49\x23\x42\x19\x80\x25\x13\x0d\x4d\x77\x88\x85\xe9\xd9\x80" - "\xa9\x78\x3a\x39\xae\x55\xdc\x6a\x8e\xec\xca\x71\x25\x03\x3d\x4c" - "\xf2\xdc\x42\x5d\xb9\x93\xa0\xbf\x25\x3a\xcb\x49\x0e\x1a\xcf\xa2" - "\xaf\xcc\x10\xfb\xe8\xdd\x26\x7b\x68\x86\xde\x1e\x9a\x99\x2c\x16" - "\x66\x94\xc3\xb5\xcb\x90\x82\xeb\x88\x62\xb4\x2b\x87\xfb\x8e\x4e" - "\xfc\x96\x76\xb1\x3d\xe3\x39\x38\x1f\xcb\xfd\xb5\x31\x1f\xd2\x52" - "\xec\x18\x16\x2f\x06\xec\x7d\xe0\x69\x34\xc6\x8c\x29\x3d\x07\xf8" - "\x38\x47\x22\xe5\x78\x20\xa5\x92\x9f\xe8\xa2\x34\xb7\x9d\x2f\xd9" - "\xef\x11\x3c\xf6\xc7\x56\xe6\xf3\x96\xc9\x2c\xf4\xef\x86\xb6\xfc" - "\x6a\x1d\xc6\x34\x77\xfb\x77\xeb\xd2\x09\x60\x9f\xd5\x33\xfb\x0c" - "\xb0\xc3\xe2\xd0\x17\xa6\xb7\xa2\xdf\x7f\xb4\xc3\x4a\x99\xbf\x52" - "\x71\x9e\x6c\x47\xa1\x1c\x71\xe5\xef\xde\x00\x57\x76\x17\xfa\x2a" - "\x57\x8c\x2b\x90\x65\x0c\xe8\x15\xad\xb8\xf1\xdf\x20\x3f\xd8\xf0" - "\x3d\xfa\xfb\x31\x2f\xd0\x6d\x1e\x7c\x2b\xc4\xd5\xa3\x9f\x09\xd7" - "\x7d\x70\xc5\xb9\x0a\xd3\xed\x70\x69\x5c\x85\x99\xf1\xae\xc2\x84" - "\x68\xb8\x74\x70\xc5\xc0\x15\x0b\xd7\x74\xb8\xc0\xfe\x48\x98\x09" - "\x77\x7c\x3f\x1b\xae\x39\x70\xcd\x85\x6b\x1e\x5c\x0b\x5c\x5b\xcd" - "\x5a\x11\xf0\x09\x17\xde\xa3\x5c\x85\x19\xa6\x81\x7d\x8c\x1c\x6d" - "\x65\x7e\xcc\x47\x9c\xa0\xe1\x18\xb3\x33\xe3\x2c\xfa\x02\x6c\x3d" - "\xa8\xeb\x0c\xd0\x9f\x33\x8d\xf4\x35\x87\x81\xe5\x43\xdf\xea\x09" - "\xb0\x3c\x9f\xf1\x6a\xc4\x48\xb3\xce\x19\x15\x57\xef\xcc\x21\xd9" - "\xd0\x9f\x15\x75\xc9\xcd\x24\xd1\x4e\xb2\x6a\x9a\xbb\x49\xd6\x12" - "\xc9\x17\x73\x06\x9e\x3b\x79\x66\x03\x62\xd8\x45\x93\xb4\x3d\x05" - "\xe9\x91\x2e\x75\x46\x3c\x55\x67\x98\x98\x7f\x41\x90\x3d\x18\xfb" - "\xa8\x77\x0c\x89\x98\x82\x71\x64\x6d\xdb\x59\xf2\xdc\x12\x2a\xd6" - "\xea\xc1\xe6\x68\x00\x70\x29\xc8\x2b\x88\x2f\x79\x1c\xf9\xa3\x46" - "\x9a\x0d\x58\x19\xed\x02\xba\x89\x38\x7e\x04\x5c\xe1\x58\x52\xc6" - "\x16\xe8\x32\x8d\x1c\x2f\x86\x0a\xa2\x13\xde\x29\x31\x9e\x4c\x09" - "\x8c\x1f\x4b\xd2\x48\x74\x09\xbc\x63\xb1\xff\xa0\xde\x8f\x1a\xc2" - "\xa9\xf8\x2b\x1d\x29\xfb\x25\x51\x85\x9e\xe6\xf1\x24\x5d\x40\xfb" - "\x5e\x7f\xe4\x05\x09\xfa\x47\x4e\x6b\xc9\x41\xdd\x71\xd0\x49\x95" - "\x20\xbb\x13\xf4\x3d\x20\xb7\x81\x96\xae\x80\x68\xa9\x20\x7b\x2e" - "\x16\x2d\x7b\xa2\xe2\x0c\x9c\x9e\xc9\x04\x69\xd6\x97\x9e\x48\xe3" - "\xb5\xcd\x40\x4f\xa0\xab\xf5\xb0\x8b\x84\x29\xc8\x62\x99\x9e\x2f" - "\x03\x3d\x81\xa6\x91\x48\x53\xa0\x07\xa3\x29\x95\x68\x5a\xe6\x41" - "\x53\x90\x4d\xcc\x17\x23\xd2\x54\x04\x9a\x96\xf9\xa0\x69\xef\x58" - "\x1c\x68\xba\xcd\x2f\x9a\x96\x5f\x00\x4d\x05\x95\x2f\x9a\x3a\x51" - "\x5f\x16\x25\x24\x53\x90\x77\x56\xe7\x21\xe6\x57\x14\x6c\x9d\x5d" - "\x60\xb3\x95\x8b\xea\x74\x3d\xd0\x44\x8d\x6b\xf5\x18\xbf\x28\xcb" - "\x44\xbf\xc8\x2a\xa7\xe7\x5d\x45\x99\x16\x4c\x03\xb9\xa5\xbf\x13" - "\x7d\xab\x19\x6c\xa4\x4c\xa0\x55\x75\xe7\x3a\x49\x8b\x62\xc4\x03" - "\xdd\x68\x4b\x16\x65\x52\x11\xba\x05\xca\x90\x27\xa7\x12\x65\x37" - "\xc8\x09\x43\x1a\xb9\xa1\x18\x64\x5d\x37\xc8\xce\x53\x0a\xa1\xf1" - "\x41\x83\x48\xe1\xca\x42\xff\x98\x62\x68\x46\x39\xc8\x6a\xc6\x5f" - "\xe4\x19\xae\x01\xd6\x3e\xf9\x3e\x94\x17\x52\xfb\x51\xb2\x93\x64" - "\xe9\xfb\xf3\x57\xcc\x4a\xd2\xba\x0a\x86\xee\x27\x18\x43\x2d\xa3" - "\x15\xf9\x5a\x49\xac\xcd\xee\x7e\x22\xa6\x73\x19\x8c\xbc\xc0\x7e" - "\x81\x7d\x64\x93\x87\xec\x05\xb9\xae\x29\x95\xfc\xf1\xbb\x40\xf6" - "\x96\xa2\xbf\x71\xe0\x25\xfa\xe9\x1f\xb0\x7f\x3c\x07\xfd\x63\x2d" - "\x8b\xa1\x12\x09\xf4\xa8\xec\xee\xe2\x3c\x44\x9e\x59\x9d\xd5\x8c" - "\x7f\xc5\x92\xac\xe7\x74\xcf\x78\x8e\xd2\x24\xe2\x82\xba\x8b\x45" - "\x99\x95\xb4\x4b\x3f\x06\xe7\x0b\x61\xac\x1b\x1b\xbe\x04\xec\x86" - "\x6f\x40\x17\xac\x04\x7c\x9d\x21\xd1\xdb\x56\x82\x2d\xd0\x85\x71" - "\x9b\xa0\x3e\x6b\x78\xbc\x4b\x31\x87\x26\xc3\x3b\xe6\xef\x53\x94" - "\xfd\x7d\x76\xe8\x70\x8c\xee\x9e\xdb\x59\xa5\x13\xdc\xdf\x7c\x33" - "\xdb\xa5\x3a\xce\xe3\x86\x2b\x94\xbf\xe3\x6b\xcc\x5b\xd9\x39\xfd" - "\x36\x85\x92\xfb\x58\xcf\x2b\x3b\x6c\x30\x93\x51\xa7\x14\xca\x4c" - "\xba\xf1\xf7\xd5\x06\x8c\xe1\x2b\xbf\xcb\x82\xba\xe6\x6c\x71\xdc" - "\x91\x4d\xb2\x5d\xf9\xff\x50\x59\x4d\xa7\xd1\xa7\x5e\x60\xb2\x57" - "\xa1\x64\x6b\xdb\xae\xbc\x37\x37\x00\x9d\xe2\xc5\x8d\x6f\x16\x80" - "\x4c\x89\xa5\xbf\x82\xb6\xfe\x12\xda\x7a\x0a\xe8\x7a\x0a\xda\x9a" - "\x2e\xb5\x55\x8a\x65\x25\x02\xfd\xe1\xdd\xc0\xba\x4f\x6e\xeb\xaf" - "\x30\x2e\xc2\x0b\xdb\x33\x4f\x93\x6b\xe8\x4d\xb8\xee\xca\xce\x2a" - "\x76\x59\x9d\xc7\x09\x7e\x97\xe9\xe6\x82\x84\x19\x8f\x01\x1e\x91" - "\xe6\x60\x0f\x6c\xa7\x61\xe9\xc5\x32\x1f\xb0\x3e\xb4\x47\x3f\xa6" - "\x6c\x25\xd4\x07\x69\x7f\x86\xc4\x60\x7f\x06\xda\x47\x97\x21\xfd" - "\xbd\xe3\xc9\x46\x30\x1e\x08\xc0\x83\x95\x12\x0f\xf2\x25\x1e\x80" - "\x9d\x08\x7a\x5a\x05\xfa\x37\xb2\x2c\x87\xf3\x20\x30\x1a\x8d\xe8" - "\x37\x27\x7d\x81\xfd\xf5\x80\xef\xfe\xaa\x3a\xdb\xcd\xc7\x86\x0a" - "\xf4\x3b\x4a\xc3\xcc\x21\x62\x0f\xf4\xdb\x22\xa9\xdf\x52\x7d\x9c" - "\xdc\x67\x5b\x14\x23\x7f\xe3\x5f\x9f\x1d\xb5\xee\xff\x68\x9f\x8d" - "\xb8\xb8\x7d\x56\xf5\x90\x77\x9f\x55\x65\x78\xf7\x59\xd5\x5d\xee" - "\x3e\x2b\xbd\x1b\x96\x3e\xab\x9a\x73\x79\xfa\xac\x6a\xce\x00\x7d" - "\x76\x87\x1f\x7d\x36\xd2\x47\x9f\x8d\xbc\x78\x7d\x76\xf4\xf2\x4b" - "\xa7\x63\xd5\x15\xdd\xc2\x00\x3a\xf6\x39\x0f\x1d\x1b\x8a\x3a\x76" - "\x4c\xfc\x40\xfd\xb5\xa7\x04\xfa\xab\x5a\xea\xaf\x3f\xff\x0b\x94" - "\x37\xf6\x07\x87\x1a\x87\xee\xaf\xce\x12\xb7\xfd\xe4\xb3\xcf\xea" - "\xb1\xcf\x96\x13\xab\x8d\xf5\xd9\xc5\x72\x9f\x2d\x91\xc6\x3a\x83" - "\xf4\xdb\x08\x5f\xfd\x16\x63\xe3\x60\x5c\x9c\x41\xfb\xad\x64\x2f" - "\xf5\x4c\xc6\x7e\x6b\xb9\xc2\x74\xad\x5a\xe1\xdd\x6f\xd5\xd3\xbd" - "\xfb\xed\xd8\xaf\xdd\xfd\x56\x7a\x37\x2c\xfd\x56\x4d\x2e\x4f\xbf" - "\x55\x93\xef\x8e\xae\x0d\x8d\xbe\x74\xba\x56\xb3\x8c\xf5\x5b\x5f" - "\xba\x36\x4b\xd2\xb5\xa1\xa8\x6b\x43\x5d\xfe\xf5\xdd\xb0\xb3\xff" - "\xc7\xfb\xee\x45\xd6\xb9\xe1\xef\x78\xf7\xdd\x70\xbb\x77\xdf\x0d" - "\x7f\xcd\xdd\x77\xa5\x77\xc3\xd2\x77\xc3\xf7\x5e\x9e\xbe\x1b\xbe" - "\xf7\xbb\xa3\x73\x35\x36\x5f\x7d\x57\x3b\x85\x64\x37\x29\xc6\xfd" - "\xc0\x5a\xc2\xf6\xc6\x65\x5b\x9d\xf7\x12\xb6\x9f\x44\x31\x6e\xb1" - "\x35\x72\x06\x11\x37\xee\xb6\x63\x5c\x0d\xdc\xd7\xf2\x5b\x8f\x7d" - "\x23\x6c\xfd\x55\x31\x6e\x9d\xbc\xef\x65\x9b\x14\x7b\x63\xb0\x7d" - "\x2f\x34\x6f\x77\xb6\xf4\xbf\xbd\x1c\x1b\xbb\x37\xc8\xcf\xcc\x07" - "\x8c\x62\x9c\x85\xe6\xef\xce\xb0\x8f\xde\x9d\xe1\x6b\x8d\x24\x6c" - "\x1d\xa5\xb8\xd7\xa3\x63\x4a\x9c\xbd\x63\x23\x21\xc5\xb8\xfe\x90" - "\x3b\xce\x01\xff\xd5\xf2\x3d\x0e\xed\xb6\x8e\x9c\x79\xa4\x2b\x77" - "\xbc\x5a\x4e\x63\x71\x6a\x73\x42\xa8\x08\xef\x68\xd1\xac\x9a\x6d" - "\x66\xa2\x42\xbf\xc2\x77\x9c\x43\x2c\x8e\x8f\x02\x19\xc1\xf6\x71" - "\xb0\x35\xf7\xeb\xae\xef\x2c\x6b\x27\xca\xba\x0d\x6c\x3f\x1b\xee" - "\x97\xd9\x5e\x84\xf8\x0f\xb9\x6d\x0b\x15\x94\x44\x2c\x8d\x6b\xa0" - "\xa1\x19\x95\x6c\x7f\x2f\x60\x45\xde\x43\x83\x31\xb7\xc4\xc9\x71" - "\x26\xd9\xb7\x2d\x85\xfa\xbd\x6b\xc6\x73\xa0\x21\xb4\x2c\x85\x68" - "\xe0\x52\xd3\xc2\x8c\x4a\xa8\xd7\x0e\x79\xee\xd0\xe7\x5e\x6d\x8c" - "\xb5\x79\x7d\xa4\x52\xda\xaf\x83\x3e\x01\xd8\x99\xaf\x4d\x82\x98" - "\xe7\x82\x74\x9a\x93\x45\xad\x26\x27\x09\x07\x5a\xe0\x7a\x3b\xc8" - "\x29\x41\x2c\x8b\xb3\xaf\x9f\x44\xc8\xee\xb5\xad\x02\xee\xbd\x70" - "\xbd\x78\x7d\xa7\xc5\xfc\x7d\x5c\x8f\x67\x3e\xe1\x5b\x14\xd7\xbc" - "\x92\xf8\x35\x8f\xab\x09\xbf\x2b\x70\xdd\xe1\x11\x78\xc6\xf5\x6c" - "\xb1\x23\x52\x89\x79\x21\xfd\x67\x96\xb4\xcf\x48\xb8\x81\xed\x81" - "\x57\x49\x79\x75\x98\xd7\xa6\xb8\x86\xed\x3b\x85\xe7\x99\x38\x57" - "\x8e\xfb\xe4\xd9\x79\x8a\x92\xb8\x06\x26\x1f\x0a\x32\x2a\xa1\xfd" - "\x7c\x3f\x2d\xb4\x73\x13\xb4\x19\xf2\xa8\x71\x1f\x0d\xbb\x9b\x89" - "\x66\x33\xa4\x61\x39\x70\x57\xb3\xbd\xbc\x8a\x6b\x22\xb1\x6c\x9f" - "\x67\x00\xd4\x19\x95\x14\xb0\xcd\xcf\xc4\x28\x3e\x6e\x52\x44\xcc" - "\x0d\x57\x50\x0a\xdf\x34\xad\xc7\x39\x6c\xdc\x77\x8d\x7b\xc9\x15" - "\x11\xb7\x40\xf9\x4a\xa4\x45\x57\x6e\x84\xd2\xa6\x18\x5f\xd9\xbb" - "\x77\x00\xd7\x59\x14\x11\x0b\xf1\x3b\xf8\x1f\x9e\xff\x1a\xb6\x3f" - "\x1f\xeb\xac\x35\x87\x50\x78\xff\x20\xdf\x9b\xad\x5a\x0c\xff\x77" - "\xc7\x7f\xe1\xff\x03\x2c\x45\x24\x01\xcf\xd8\xfe\x68\x7c\xf6\xb9" - "\x57\x58\xe2\x5b\x6d\x24\x60\xa3\x2f\xef\x64\x8c\x00\x2e\x64\x8c" - "\x60\x7d\x5f\x37\xdb\x04\xa6\x8f\x14\x11\x6c\x2f\x50\x11\xf0\xd0" - "\xf5\x72\xa4\x92\xcd\x4b\xf7\x20\x5f\x9a\xe0\xdd\xb5\xa5\xc8\x97" - "\x4d\xa0\x0b\xa4\xbc\x16\x77\xfd\xf1\xf9\x5a\xc6\x4f\x11\x78\xc1" - "\xf6\x22\x29\xae\x7d\x96\xc5\xdf\x01\x99\x81\x7b\xc8\x0f\x98\x08" - "\xae\x7f\x36\x50\xc0\xc8\xee\x14\x87\x50\x96\xc6\xd3\xdf\x6d\x77" - "\x08\x9b\x4e\x11\x94\x2d\xa4\xf0\x97\x44\x09\x7a\x48\x89\x65\xd2" - "\xa8\x38\x76\xae\x81\xf1\x71\x2d\xf0\x2e\x0d\xb0\x0b\x34\xdf\x04" - "\xf4\x2b\xeb\x66\xeb\x34\xa6\x32\x91\xa8\x45\xc8\x67\x53\x5c\xbb" - "\x0b\xca\xd3\x60\xcc\x3f\xdc\xeb\x0c\x34\x4c\xed\xca\xbd\x36\x4f" - "\xa6\x21\xd6\x09\xf7\x2a\x63\xec\x3f\xc8\xab\xe4\x18\x8a\x38\x2c" - "\xb7\xd9\x17\x3d\x0b\x77\x93\xa8\xc2\x3b\xc8\x0c\x51\x75\xb4\x95" - "\x86\x5c\xbf\x1d\xe7\x9b\x1f\x45\xcf\x40\x86\x56\x92\xf8\xfc\x09" - "\x6a\xb5\xbb\x88\x38\xfa\x68\x2b\xae\x41\xb8\xd6\xdf\x36\x3e\x71" - "\x0d\xd0\x0b\xf4\x7d\x96\x83\x68\xac\x66\x3b\x8f\xdf\x45\xbe\x25" - "\xae\xd5\x20\xc3\x41\xae\x83\x4e\x55\x66\x7d\x4b\x26\x22\xbd\xc4" - "\xd0\xf4\xc8\x16\xc5\x84\x27\x1e\x33\x92\xec\xc0\xe4\xe8\x04\xe6" - "\x4f\x16\xed\x0b\x90\xf9\x02\x8b\x6b\x6d\x07\xfb\xa4\x30\x3d\x32" - "\xc0\x72\x7c\xc6\x15\xc2\x76\x8b\x38\x0f\x2d\xb5\x39\x11\xdb\xdc" - "\xe9\x20\x38\x97\xff\xe8\xb3\xe8\x9b\xf8\x2c\x11\xf3\x8f\xb6\x62" - "\x9b\xc1\xd6\xd9\x12\xf0\x9c\xbe\x62\x82\xcf\xf8\xa7\xf8\x6d\x0a" - "\xf4\x16\xd7\x5f\xbf\x5d\x54\x67\x6c\xc1\x6f\x63\x1d\xf0\xfc\xcd" - "\xa3\x67\x09\xa3\x3b\xd2\xdf\xea\x70\x11\x3a\xda\xb3\x0e\xce\x00" - "\xeb\x70\x9d\xef\xf6\xdf\x41\xa2\x0a\x76\x73\xbe\xbb\xd6\x4b\x34" - "\xd0\xe3\x1a\x58\xc6\x96\x3a\x83\x9d\x3c\x8a\x75\xb0\x9f\x26\x8f" - "\x9c\x26\x8c\xff\x56\x5d\x1b\x71\x85\xdc\x36\x1e\xf7\x12\x20\xff" - "\xcd\x4e\xe0\xff\x39\x07\xfa\x33\xb2\x5b\xb3\xcf\x13\xb4\x5f\x9c" - "\x1d\x3a\xa1\x3f\xff\x23\x9f\x78\xcc\x14\x28\xff\x23\x87\x89\xff" - "\x91\x57\x40\xfb\x27\x06\xd1\xfe\x89\xc3\xd4\xfe\x89\x57\x40\xfb" - "\x27\x05\xd1\xfe\x49\xc3\xd4\xfe\x49\x3e\xdb\x9f\x30\x51\xa4\x6c" - "\x8f\x49\xd8\xea\x6c\xd4\x01\x5c\x5f\x5d\xff\x18\xee\x21\x61\xe7" - "\xad\xa4\x67\xc2\xcf\x5f\xa9\xfa\x3c\xab\xfb\x3c\x6b\xfa\x3c\x47" - "\xf4\x79\x8e\xec\xf3\x1c\x25\x3f\x83\x1e\x19\x71\x46\x31\xe9\x20" - "\xd8\xa5\xd9\x36\xc5\xf5\xc9\xd2\xfb\x68\xf4\xf7\x05\x3a\x3d\x7a" - "\x90\x38\x84\xd7\x9f\x52\x5c\xcf\xce\xbd\xd3\xf5\x93\x74\x74\x6d" - "\x36\x11\x0b\x12\x66\x3f\x9a\x09\xb2\x0b\xf8\x47\x7b\x22\x47\x82" - "\x8d\x70\x1d\xfa\x94\xc3\x3d\x07\xda\x94\xf7\x68\x93\xe2\xfa\xb7" - "\xb1\x7d\x77\x18\x2c\x44\x0c\xb9\x8d\xad\xe5\x8b\x85\x09\xb3\xed" - "\x21\xb7\x4d\xa2\x5b\xcd\xda\x22\x41\x54\x15\xe5\x88\xda\x4c\x3b" - "\xb5\xcf\xfd\x16\xe4\xd0\x59\xf4\xd3\x0e\x3c\x36\x52\xbb\x25\xe5" - "\x34\xd4\x37\xea\xc6\xda\x0c\x28\x1b\xbe\x03\xdf\x82\x71\x5c\x42" - "\x34\x8b\x61\x0c\x65\xd4\x75\x56\x13\x8c\x11\x23\x95\x19\x4f\x43" - "\x13\xa2\xb1\xcc\x01\xed\xd3\x82\xd5\x7b\xe0\x9b\xf7\x3e\xa6\x53" - "\x12\xba\x4e\x19\x11\x18\x4f\xa3\x66\xfb\xb4\x7b\x0b\x8c\xd3\x79" - "\xb9\xaa\x60\xca\xf5\xe9\xff\x02\xca\x95\xea\xab\x09\xa6\x5c\xdf" - "\x67\x14\x0b\x52\xa5\xfa\x6a\x83\x28\x77\xf2\xdc\x41\xca\x95\xea" - "\x1b\x1f\x4c\xb9\x3e\xe3\x5f\xd2\x82\x34\xa9\xbe\xd9\xc1\x94\xeb" - "\xf4\x5d\xee\xea\x3d\xc1\x61\x61\x8a\xef\xf8\xdf\x80\x85\xe0\x70" - "\x30\x65\x90\xf6\x1b\xf7\x04\x87\x81\x29\x8e\xc1\x30\x10\x1c\xff" - "\x6f\x18\x94\xff\xc1\xf1\xfe\x86\xed\x83\xf1\x3e\x38\xbe\xdf\xe0" - "\x13\xff\x68\xcb\x03\xef\x0d\x34\xcc\xac\x11\x8b\x12\x0c\x62\xd8" - "\xea\x94\xf5\x62\x3c\x49\x00\x19\x16\xbe\x85\x8c\x8b\x67\xe3\x63" - "\x6d\x5e\x66\x09\x11\x60\xbc\x2b\x54\xac\x6d\x10\xac\xce\x19\xa8" - "\x73\x5c\x3b\xd2\x1c\x8a\x9b\x21\x7d\x1f\xe8\xac\x4e\xb0\x3b\x79" - "\x39\x09\x86\x22\x73\x3c\x91\x7c\x5a\x74\xa2\x6f\xd3\x44\x90\x63" - "\xd6\x2d\x0e\xdc\xb3\x32\x0e\xfe\xe7\x04\xfc\x42\x19\x0e\xf2\xba" - "\x68\x57\xc4\xa7\xb0\x7c\x76\x76\x6e\xae\x68\x75\x0a\xcd\xd2\xa1" - "\x6f\x43\x3b\x7c\xf3\xdb\x10\x3b\x11\xd0\x07\x51\x57\xae\xb6\xcd" - "\xa6\xb8\xb1\x51\x3a\x27\xda\xc6\x7c\x72\x42\x7d\xf1\x0c\x26\xe6" - "\x45\xdf\x9c\x77\x18\x88\x80\xfe\xce\xbb\x72\x6f\x8c\x44\x3f\x9d" - "\x83\x9d\xb7\x76\x15\x64\x2c\xc0\xff\xd3\x02\xd0\xa1\xa7\x89\x80" - "\x67\x2c\x61\x1c\x50\x5f\x04\x63\x88\x07\xa7\xe2\x9c\x47\x3b\x31" - "\xe3\x34\x7a\x41\x82\x9e\xaa\xd3\x55\xb8\x2f\x8e\xed\xf1\x56\xdc" - "\xb8\xa7\x8c\xef\xf9\x76\xb0\x38\xb0\xf0\xcc\xc6\x31\xb8\x2f\x46" - "\x3d\xcb\x41\x8b\x42\xe3\xeb\x3a\xdb\x59\x7c\x9e\x26\xc5\x8d\x6f" - "\xa1\x7f\xc4\x0e\x75\xc6\xbc\x4e\x75\x46\x12\xd4\xab\x52\x6e\x03" - "\x7e\x5f\x4e\xc7\x71\x1b\xe6\x83\xf7\xf5\xf2\xf9\xeb\x81\xfd\x18" - "\x4c\x1a\x9f\x18\x49\xed\xbd\x7e\x2f\x14\x37\xdf\x8d\xb4\x07\x5b" - "\x61\x4e\x67\x96\x6e\x0a\x9f\xc7\xb8\x69\x21\x8e\x87\xa1\xde\xd3" - "\xf9\xd8\x34\x61\x3a\xf3\x77\x0b\x3a\xe0\x31\x9d\x10\xa0\xdd\x7a" - "\x13\xd3\xff\x96\x29\xa8\x23\x6f\x9e\x0c\xe5\xff\xb0\x49\x71\x53" - "\x36\x1f\x8b\x25\xcc\x61\xe7\x0e\x15\x37\x45\xc1\x37\xe6\xd0\x82" - "\x59\x76\xcc\x07\xef\xb7\x4b\xef\xe7\x79\xbc\x9f\x87\xfb\x24\xa5" - "\xf7\xd2\x58\x2e\x61\x81\xc7\xfb\x05\x86\x29\x38\x37\x71\x53\x2b" - "\xb6\x01\xf4\x59\x2c\xea\xb6\x5e\x3f\x1e\xa1\x09\xb1\x52\xbe\xd9" - "\x6d\x8a\x9b\x15\x1d\x80\x2d\x78\x3f\xd7\xe3\xff\x73\xf7\x9b\x62" - "\x49\x42\x29\xd2\xf0\xe6\x08\x9b\x90\xc1\x7d\x45\x28\x6e\xd2\xb2" - "\xb6\xab\x13\x74\x9e\xe5\x41\xba\x0d\xca\xd4\x75\x82\x1d\x05\xbf" - "\xd9\x79\x27\x4f\x7a\xcb\xa7\x1f\xb5\x4b\x56\x2c\xd6\x3e\xbd\x2a" - "\x75\x25\x9e\x5e\xf3\x8e\x1b\xaf\xc1\xf3\x9d\x62\x81\x69\x86\x75" - "\x0b\x9e\x37\xd3\xb0\x73\xda\x9b\x81\x8f\xce\xa2\x4c\x83\x2b\x2c" - "\x93\xb8\x8a\xd2\xd1\x3f\x8c\x60\x8e\xa4\x5f\x58\xd6\xce\x22\x67" - "\x14\x37\x57\xb0\x58\x98\x5a\xe6\xdb\xb9\xd3\xb2\xf6\x7d\x4c\x3b" - "\x88\xb4\xb0\x26\xf3\xb4\x37\xcd\xd5\xc2\x7b\xe6\x06\xa1\x26\xb9" - "\x9d\xec\x8f\xb4\x93\x03\xda\x76\x52\x82\xe9\x62\xbd\x80\xfb\x46" - "\xcf\x28\xa2\xaf\xc5\x6f\xe1\x18\x1f\x7f\xf3\xf9\x8a\x9b\xb7\xe2" - "\x77\xd0\x77\x06\xd0\xa6\x14\xbf\x67\x83\x1e\x19\x52\xc2\xf6\x19" - "\xab\x21\xdf\xcf\xc4\x42\xd3\x0c\xd6\xc7\x73\x6f\x9e\xeb\x14\xd4" - "\xbf\x97\xce\xb3\x31\x5f\xfd\x5d\xb9\xd1\xb3\x3d\xce\x6e\xaa\x3b" - "\x04\x72\x3f\xa4\x25\xc9\x67\x0b\x30\x56\x98\x2f\x99\x71\x1e\xc6" - "\xb2\xe7\x4b\xe2\x92\x44\xb5\x09\xe8\x6b\x9a\x51\x5d\x4d\x70\x2e" - "\x45\x81\x7b\x60\xdb\x14\xb7\xce\xa0\xa1\x26\x9d\x19\xfb\x29\xd0" - "\xe2\x7f\x70\x1f\x5f\x58\xa6\x61\x17\xee\xdb\x2b\xca\x24\x7f\x4c" - "\x73\x08\x87\x6a\xaa\x88\xf6\x3f\xd1\x1e\x8a\xfe\xf0\x47\x4b\xa8" - "\xf3\xb6\xc3\x16\x52\xd3\xfc\x27\xf2\x51\x63\x35\x51\x2f\x24\x21" - "\x59\x36\xea\x62\xe3\x7d\x23\x11\x12\x6d\x24\xc4\x7c\x16\xfb\xa9" - "\x8b\xc5\xea\xae\x73\xd4\x82\x8d\xf3\xcc\x86\x0a\x73\xeb\x08\xed" - "\x7c\x42\xa0\x3f\xb1\x75\x63\x76\xce\xc6\xce\xce\x23\x87\xe2\x1c" - "\xb6\xc7\xf9\x9a\xe4\xcc\xd3\x44\x55\xab\x3f\x4e\x32\x92\xa9\xe8" - "\x4a\xd7\x8d\x4f\x4c\x0e\xa1\xec\x8c\x8d\x09\x32\x1b\x80\xa7\xe9" - "\xba\xb0\x97\xd2\x48\x44\x9d\xd1\x46\xac\xad\xd5\xe4\xe5\x14\x12" - "\x41\xbb\xf4\xa3\x6b\x6a\x0e\x11\xba\xf1\x98\xed\x75\xb3\x65\x84" - "\xbc\x67\x2a\x7c\x9d\x02\xe7\x2c\xc3\x0a\x70\xef\xd4\x39\x12\xbb" - "\xe8\x64\x36\x9b\x67\xc5\x39\x6d\x67\x97\x4e\xdb\xd3\xa5\xbb\xa9" - "\xbb\x4b\x37\x45\x9e\x0b\x7f\x62\x99\x86\x94\xe2\xd9\x9c\xdc\xeb" - "\xa6\xe3\x5e\x3d\xb4\xed\x9d\xa3\x8f\xb7\xe2\xbc\x37\xe2\x12\xbe" - "\x1d\x25\x3e\xad\x23\x77\xda\xd9\xd9\x1f\x9c\x8b\xd7\x94\x3d\x05" - "\xf5\x6d\x6b\x27\x9e\xfb\x7f\xce\xa7\xeb\x04\xdc\xfb\x43\x73\xa3" - "\x0d\xdd\xa5\x71\x49\xb8\x07\x08\x74\xc1\xf4\xc0\xfb\xf6\xad\x6c" - "\x6e\x02\xdb\x0f\xfc\x30\xec\x6a\x47\xfe\x00\x9f\xda\xed\x02\xf2" - "\xa2\x76\x09\xf2\xa1\xde\x8b\x0f\x8c\x6f\x29\x0e\x01\xf9\x81\xbc" - "\x40\x9e\xb8\xf9\x71\x84\xf1\x63\x97\xc8\xf9\xd1\x0d\x7a\x40\xe6" - "\xc9\xf9\xa8\x38\xfd\x60\x7c\x41\x7e\x20\x6f\x6a\x9a\x8f\x13\x2f" - "\x9e\xd8\x39\x4f\x80\x9e\xe3\x65\xbe\x20\x4f\xac\x6d\x60\xeb\x02" - "\x5f\x1e\x3e\x42\xc8\x8f\xa6\x52\xb1\x76\xee\x27\xbd\xfc\x71\xfa" - "\xe2\xcf\xd7\x6e\xfe\x00\xef\xfb\xf3\xe7\xb4\x06\xd7\x66\x90\x3f" - "\x55\x81\xf0\xa7\xa6\x99\xf3\xc7\x29\xf1\x67\xea\x1c\x22\x38\xba" - "\x74\xc2\xd6\x34\x32\x63\xee\x49\x2d\x39\x98\x54\x4b\x80\xd6\x44" - "\x2c\xcc\x98\x13\x5c\x3f\x9a\x9a\xed\x7f\x3f\xd2\x8d\xbb\xda\x8f" - "\x02\xed\x47\xdf\xab\xba\xb0\x7e\x34\x75\xee\xd5\x7e\x74\xa9\xfa" - "\xd1\xd4\x39\x7d\xfb\x51\xaf\xae\x4e\x59\xba\x62\xf1\xb2\x95\x78" - "\x7c\xef\xa9\x35\xc6\xa5\xab\xb9\xc6\xf6\xd2\xd9\x91\x2e\x73\xbc" - "\x80\x3e\xd7\x6a\xb6\xd4\x93\xd7\x27\xd5\x0b\xae\xaf\x22\x95\x34" - "\xcf\x1e\x2b\xe6\xb5\x57\xa1\xef\x4c\xec\x6f\x18\xfb\xbd\x45\x71" - "\xe7\xde\xba\x28\x1e\x77\x12\x7f\x33\x7b\x25\x2a\xae\x15\xd7\x48" - "\xd6\x77\xc3\xb5\x96\x28\xc3\x1d\x44\x65\x99\xc2\xde\x4f\x44\x5f" - "\x82\xb4\x34\xae\xb5\x0c\x63\xb2\x77\x13\x65\xa7\x7a\x96\x7d\x03" - "\x94\x67\x0f\x35\xcd\x50\x6a\x89\xd0\x95\x7b\x7b\x39\xe8\xe4\x25" - "\xbd\x3e\x86\x14\x77\x34\xd2\x91\xb7\x39\xb0\xaf\xe3\x99\xb3\x33" - "\x8a\xdb\x8f\x9f\xcf\x21\x2c\x7e\xfc\x63\x53\xe1\x5b\x93\xe3\xf4" - "\xcc\xe7\x00\xf4\x7b\xfe\x7e\x1a\x5b\x77\xea\x51\xa7\xb3\x38\xc8" - "\x1d\xea\x4c\x43\x47\x41\x26\x39\x94\x51\x49\xb4\xf3\xb1\xdf\xc7" - "\x8c\x7e\x78\x0b\xf4\xfb\x79\x16\x52\x1b\xf9\x47\xf2\x51\x12\xe0" - "\x2d\x69\xa8\x7e\xef\x81\xb3\x29\xfe\xf5\x7b\x19\x5f\x88\x2b\xc4" - "\x17\x62\x6b\x2c\x60\x0b\xf1\x26\xe3\xeb\xb7\xe7\x38\xbe\xc2\x1b" - "\x89\xe6\xa5\x76\xc0\x98\x93\x63\x0c\xcf\xfc\xd6\x9a\x3e\xf1\xdd" - "\xff\xcf\xf5\xc1\x97\x20\xe1\x2b\x1d\xf0\x95\xee\xc6\xd7\xe3\xc7" - "\x35\xe4\x65\x86\xaf\x09\x6e\x7c\xe5\x1f\x6f\x95\xb1\x85\x38\x43" - "\x4c\x89\xbf\xd0\x11\xec\xf3\x32\xce\xca\x9e\xe1\xeb\x9c\xac\xff" - "\x0b\xd0\xff\xbb\x3c\xf4\xe8\xe4\x0b\xe9\xff\xd3\x58\xff\x47\x9e" - "\x20\x7f\x90\x2f\xc8\x8b\x7f\x45\x3e\xa0\xdf\x57\xda\x35\x10\x2f" - "\xae\xb5\x0c\xc5\x0b\xe4\x03\xf2\x83\xf1\x01\xf8\x21\xaf\x39\xe3" - "\x1a\x24\xf2\x04\x79\x71\x47\x06\x11\x90\x2f\x65\xd0\xe7\xb1\x9f" - "\x03\x6d\xe7\x20\x5f\x98\xed\x9a\x13\xba\x72\x33\x9e\x9b\x95\x62" - "\xe4\x76\xe5\xde\xe1\xec\x6f\xb7\xde\xa9\xe9\xf5\xf5\xa8\xb8\x9d" - "\x8d\xcb\x2c\x93\xee\x85\xfe\x76\xbb\x34\x66\x49\xe7\xbe\xd6\x14" - "\xb1\x2b\xa4\x3e\x5d\x8f\xe3\x3f\x36\xd6\x73\xc1\x58\x4f\x0d\x63" - "\xbd\x02\x18\xeb\x99\x5a\xb9\x5f\x00\xc5\x9d\xcb\x88\x74\x9e\x97" - "\x86\xa6\xab\x68\xe1\x2c\x07\xd2\x8f\xad\x9b\x86\x66\xcc\xc3\x75" - "\x1e\x5a\x08\xe3\xc8\x57\x05\x02\xcf\x80\x21\x57\x80\xd8\xb9\x33" - "\x4f\x5a\x17\xce\x30\xac\xc5\x3d\x03\xb1\x3c\x1e\x92\xe2\xf6\xc5" - "\x98\xce\xd6\xd4\x04\x71\xbb\x6b\xbd\xf7\x9a\x9a\xe7\x9a\xeb\xeb" - "\x66\xbb\xb4\x9e\x16\xcb\x7d\x82\xe1\xb9\x0d\x90\x6b\x15\xe6\x7a" - "\xc1\xbd\xa6\xf6\x09\xbe\x7f\xc0\x7b\x4d\x2d\x96\xf9\x00\xb1\x29" - "\x62\x97\xe3\x3e\x12\x78\xd6\xf1\xf4\xdb\x93\x3d\xd3\xdd\x6b\xd6" - "\x3c\x5d\x14\x58\xbc\x11\x1c\x73\xb7\xf1\xb1\x76\xec\x06\x79\x4c" - "\xeb\xc3\xbe\x09\x40\xee\xde\x3d\xc7\x2d\x77\xef\x66\x7b\x0b\x69" - "\xa4\x39\xb2\xb6\x9f\xdc\xfd\x0c\xde\x4f\x7f\xed\x51\x94\xbb\x05" - "\xe9\x1a\x5e\xbf\xbb\x30\x9e\x6b\x08\xc6\x7b\xc4\x74\x3c\xbf\x83" - "\xf2\xb7\x14\xcf\xb6\x30\x99\x6c\x56\x6d\x60\x6b\xe7\x77\x4d\xf7" - "\x96\xc5\xd3\xf5\xde\xb2\xf8\xae\x65\x83\xcb\xe2\xff\x17\x3a\xb8" - "\x2c\xbe\xeb\x77\x57\x65\x71\xb0\xb2\x18\x6c\xb1\x0b\x92\xc5\xdf" - "\x6f\xb8\x2a\x8b\x2f\x96\x2c\xfe\xfe\x61\x0f\x59\xfc\x33\x6f\x59" - "\x3c\x3d\xaf\xbf\x2c\x9e\x5e\xe2\x96\xc5\x77\xc5\xbb\x65\x71\xac" - "\xc3\x5b\x16\xdf\x7d\xde\x3f\x59\x3c\xfd\xec\xc5\x95\xc5\x77\x47" - "\x78\xcb\xe2\xbb\x9b\x25\x5d\x71\x2c\x70\x59\x7c\xf7\xc1\xc1\x65" - "\xf1\xdd\xb5\xde\xb2\xf8\xee\xed\x5c\xe6\xde\xed\xe0\xb2\xf8\xee" - "\x3d\x92\x8c\x6e\xf0\x4c\x77\xcb\x62\x9e\xde\x5f\x16\xdf\xa3\x19" - "\x42\x16\xeb\x5c\xa2\x2c\x8b\x1b\x40\x16\x37\x08\xe2\x2f\x7c\xc9" - "\xe2\x1f\xc6\xd7\xa2\x2c\x4e\x41\x59\xfc\xc3\xf8\xc1\x65\xf1\x0f" - "\xa7\xa1\xcc\x05\xbc\x92\x12\xf4\xeb\x0b\xf8\xb3\x3c\xf3\x19\xce" - "\xe9\x36\x23\x3e\x5b\x14\xf7\x3e\xff\x68\x86\xa7\xac\xbe\xe7\x9d" - "\x5e\x59\x0d\xe9\xe2\x44\x6f\x59\x8d\x72\x1a\xe5\x75\xe9\x0b\xd4" - "\x56\xf6\x02\x6d\x84\x76\xb5\xca\x32\xbb\x10\xd2\x30\xe6\x0f\xfa" - "\xeb\x29\x3d\xc7\x2e\x25\xd0\xa0\x79\x3d\x7c\x17\xff\xd3\x95\xfb" - "\x6f\x11\xde\xf2\xfd\xde\x39\xce\x5c\x4f\xf9\xfe\x6f\x0f\xa1\x7c" - "\x2f\xe0\x67\xb6\x99\x5c\x77\x96\xc6\xe9\x51\xd6\xf3\xf7\x33\x4e" - "\x0f\x2e\xdf\xff\x2d\xf5\x72\xc9\x77\x94\x29\x63\x3d\xc6\x72\xbe" - "\xe4\x0a\xb4\xad\xb3\x76\xc9\xa5\x91\xef\x28\x4f\x50\x8e\xa0\x6c" - "\x91\xe5\x3b\xca\x16\xa7\x34\xd6\x2e\xc9\xf1\x90\xef\x23\x3d\xe4" - "\xbb\x22\x18\xf9\x3e\xa3\xea\x3b\x25\xdf\x91\x0f\x19\x17\x57\xbe" - "\xcb\xe3\x6a\xe4\x03\xf2\x04\x79\xe1\x39\xb6\x46\x3e\x20\x3f\x90" - "\x0f\x68\xd3\xc8\xf2\x7d\x9a\x89\xcb\xf7\xd2\x5e\xf9\x3e\x63\x4f" - "\xaf\x7c\x17\xb8\x7c\x2f\x41\x3f\x68\x6c\x8e\xf8\x5e\x7d\x7f\xf9" - "\x7e\x6f\x86\x5b\xbe\xff\x9b\x56\x92\x77\xcd\xe8\x5b\x00\xfa\xf7" - "\x0e\x6f\x19\xff\xc3\x6f\xfd\x93\xf1\xf7\x1e\xeb\x27\xe3\x81\x86" - "\x05\x7c\x6d\x08\xe5\xfb\x3c\x94\xef\x4e\x94\xf3\x41\xc9\xf8\x7b" - "\x1d\x6e\x3d\x74\xcf\x06\x2e\x5b\xef\xdd\xec\x2d\xf7\x7f\xd8\x28" - "\xc9\xa8\xa5\x9e\x72\x5f\x0c\xf1\x47\xee\xff\xf0\x1d\x59\xee\xa3" - "\x5c\xad\x10\x1b\x3c\xe4\x3e\x93\x93\x07\x2d\x69\x4d\x1e\x72\xff" - "\x87\x5b\x78\x1d\x7e\x68\x77\x31\xb9\xff\xc3\x5d\x3c\xfd\x9e\x25" - "\x9e\xe9\x6e\xb9\xcf\xd3\x5d\x9e\x72\xbf\x15\xe5\xfe\x4c\xd5\x10" - "\x72\x7f\xba\xff\x72\xff\x81\x4a\xb7\xdc\x7f\xa0\x72\x70\xb9\xff" - "\x40\x29\xca\x7d\xe6\xff\x15\x78\x0f\x78\x56\x16\x4d\xe0\x32\x1f" - "\xe7\x44\x40\x17\xd8\xd0\xa7\x05\xe4\xcb\x67\xfe\xde\xe1\x82\xf7" - "\xad\x05\xf8\x5b\x64\xff\x69\x0c\xb7\x13\x15\xea\x80\x82\x16\xa2" - "\xc4\xd8\x69\x9c\x4e\xf1\x27\x4b\x30\x1e\x67\xaf\xbe\x98\x79\xda" - "\x4f\x7d\x71\x18\xf4\x45\x7d\x57\xee\x7d\x91\x1e\xfa\x02\xe3\xcf" - "\xd5\xf7\xd1\x17\x36\xd0\x17\xcd\xf2\x7f\x20\xff\x1c\xcf\xfc\x58" - "\x3f\x96\xbf\x85\x5d\x98\xbf\x01\xf2\x37\x72\xfd\x72\x9f\xd1\x5b" - "\xbf\xc4\x97\x8b\x5e\xe3\x87\xfb\xfe\x20\xeb\x17\xd4\xcf\x62\x3f" - "\xfd\x72\xff\x23\xbd\xfa\x65\x82\x87\x7e\x31\xc9\xfa\xe5\xbe\x23" - "\x57\xfc\xf8\xe1\x02\xe4\x5a\xb0\xfa\x05\x65\x1a\xca\xb3\xc1\xf4" - "\x8b\xe8\xa1\x5f\xc4\xa0\xf4\xcb\xfd\x91\xdf\x29\xfd\x72\x09\xc6" - "\x0f\x9e\x3c\x40\xbe\x30\xdd\x02\xbc\x41\x3e\x20\x0f\x90\xfe\xe8" - "\x6b\x1a\x79\x83\x7c\x41\x9e\x4c\x33\xb8\x75\x0b\xe3\x0b\xd3\x2f" - "\xf7\x47\xf4\xd5\x2f\x65\xe3\x65\xfd\x12\x5f\xdd\x5f\xbf\xc4\x37" - "\xba\xf5\xcb\x7d\x6c\xfe\x86\xf9\xd7\x53\xcc\x3c\xec\xad\x5b\x66" - "\x2d\xf6\x4f\xb7\x3c\x70\xf7\x00\xba\x85\xf9\x31\x2e\x78\xc1\x6b" - "\xec\x30\x0f\xf4\x4b\x10\xba\xe5\x81\x05\xbc\x8e\xb8\x7f\x79\xe6" - "\x0e\x2e\xbf\xe3\xed\x6e\x7d\x33\x33\xc3\x33\xcd\xad\x6f\x66\xcd" - "\x95\x64\xdc\x13\x81\xeb\x9b\x59\x2c\x46\x0d\xee\x6d\xae\x68\xe7" - "\x32\xdd\x5b\xdf\xcc\xba\xdb\x5b\xdf\xcc\xe2\xb1\x95\x15\xb3\x92" - "\xb9\xbe\x99\x15\xc5\xd3\x67\x2e\xf4\x4c\x77\xeb\x1b\x9e\xde\x5f" - "\xdf\xcc\x32\x0d\xa1\x6f\xd4\x3d\x51\x71\xfa\x9e\x82\xcc\x79\xce" - "\x1d\x71\xf6\x98\xa4\xfb\x5d\x7d\xfb\x0d\xef\x2f\x2e\x82\xfd\xa7" - "\x77\xfd\xe9\x49\xbe\xde\x21\x4a\x67\x80\xbb\xa3\xe2\x92\x5a\x96" - "\x43\xdf\x69\xf3\xdd\x77\xa0\xdf\xa8\xe4\x7e\x53\xab\x3f\x49\xa0" - "\x2f\x09\xb8\x26\xf5\x32\xf4\x19\x6b\x67\x03\xeb\x43\xea\xe6\x78" - "\x82\xbe\x13\x43\xdb\x88\x26\x54\xa1\x18\x89\xeb\x1d\x2e\xe8\x3f" - "\x0f\x4e\xa5\xe2\xed\x0d\xf1\x24\x54\x4f\xc2\xb0\x0f\xed\x96\xd6" - "\x3d\xd0\x7f\x03\xae\x77\x00\x7e\x63\x17\x7d\xec\x5e\xef\xe8\xf6" - "\x63\xbd\xc3\x6a\xb2\xb1\xf5\x0e\x3c\xd3\x24\x42\x3f\x61\xe7\x6c" - "\x70\xbd\xc3\xc1\xd6\x88\x98\xfc\xda\xc6\xd6\x3b\x9a\x08\xae\x75" - "\xc8\xfe\x59\x70\x8d\xe3\xf6\x24\x22\xa0\x7f\x87\x97\xa1\xdf\x1c" - "\xd4\xd5\xb2\x7e\x13\xb8\x0c\x4b\x68\x1c\x6c\x9f\x8f\x13\x68\xea" - "\x52\x67\xce\xa3\x2f\x99\xe3\xff\xa7\xc9\xa1\x40\xdf\x94\x2e\xe0" - "\x91\x08\xb2\x8a\xaa\xfa\xc8\xaa\x1e\x89\xde\x3d\x9c\xde\xc0\x2b" - "\xd5\x93\x9d\x84\x42\x3a\xf7\x4d\xe9\xb0\x01\xd6\x74\xe3\x4b\xd7" - "\x22\x6d\x63\x49\xa9\xe4\x9f\x52\x7c\x4e\x3f\x5a\x04\x7a\xe2\x59" - "\x86\x8a\x73\x8e\x11\x2e\xd5\xd1\xd6\x82\x6e\x12\x03\x72\x29\x14" - "\xe5\x12\xe0\x73\xcc\xb6\x6e\xa0\xed\x17\x9c\xb6\xe8\x5f\x0c\xef" - "\xce\xe7\x74\x5a\x28\xfb\xa6\x9e\x1e\xa0\xaf\x83\xd3\xf7\xc9\x67" - "\x35\xa4\x4c\x5e\xef\x03\x5d\x5f\x07\x3c\x65\x72\xa9\x33\x9c\x62" - "\x4c\x09\x57\x8f\x2e\x4a\xfc\x0a\xe8\xdb\x09\x7d\xaa\x47\x87\xfc" - "\xd7\x94\xb5\xe0\xfa\xe4\x67\x7c\xbd\x6f\xb4\xe4\x37\xe3\x39\xd0" - "\x11\xcb\xb4\xc4\x5a\x0e\x32\x7a\xe4\xac\x82\x9e\xd2\xb8\x24\x36" - "\x06\xc9\x08\x94\xbe\x0f\xce\xbc\x3c\xf4\xd5\x7e\x87\xe8\x3b\x3b" - "\x3a\x78\xfa\xfe\xbb\xcf\xfd\x9f\x17\x97\xbe\x9a\xef\x10\x7d\x1f" - "\xdc\x10\x3c\x7d\xff\xc3\xe7\xfe\x4f\xa4\x2f\x8e\x13\xe4\x31\x82" - "\x3c\x3e\x40\xbd\xc2\x75\xe8\xc3\x46\xf7\xd8\xe0\x61\xa3\xbc\x2e" - "\x0a\xb4\x51\x16\xa2\xbf\x66\x68\xb3\xe1\x19\x72\xc3\x29\xc5\x43" - "\x5f\xcb\x6b\xa2\xc5\x18\x37\x04\x79\xf5\x12\xf0\x6a\x25\x9e\x59" - "\x91\xf8\x04\x7a\x60\x51\x27\xc8\xea\xc9\x71\x7a\x57\x21\xe8\x89" - "\xd7\xe2\xec\x3e\x78\x26\xa0\x8c\x0f\x35\x12\xcd\x93\x06\xce\x3b" - "\xf1\x39\xe0\x59\x37\xd8\x44\x8e\x56\x82\x67\x50\xc3\x5b\x41\xae" - "\xf6\xe8\x47\x2f\x04\x1b\x5b\xe6\xdb\xee\x34\x07\xb3\x87\x06\xe4" - "\xdb\x56\x6f\xbe\x75\x0c\xc0\x37\xf7\x3e\x03\xb0\x4d\x19\xdf\x6c" - "\x8c\x6f\x4c\xae\x3f\x07\xb6\x29\xf0\x4f\xe6\x1b\x93\xeb\xc0\x3b" - "\xc6\xb7\xb6\x26\x66\x03\xc9\x72\x1d\xed\x1f\xe4\x5d\x4d\x32\xd8" - "\x73\xb9\xff\xde\xcc\xf8\x86\x73\xdb\xc9\x81\xf2\xed\xa1\x3d\xde" - "\x76\xcf\x8f\x6e\xf4\xcf\xee\x79\xf8\x2e\xb4\x6b\x3c\xed\x1e\x7c" - "\xee\x00\x3b\xc7\x15\x9a\xb1\xa0\x33\xa8\x71\xf4\xc3\xf1\xde\x36" - "\xcc\x8f\xd4\xbc\x4e\x73\xd6\x04\x6e\xc3\x3c\xcc\xe6\xdb\x2a\x5e" - "\x1a\xc8\x7e\x79\xf8\xac\xb7\xfd\xf2\x70\x35\xb7\x53\x7e\xa4\xed" - "\xc8\x41\xfb\xe5\xe1\x46\x9e\x3e\xc7\xe4\x99\xee\xb6\x5f\x78\x7a" - "\x07\xfa\x29\xcb\xfd\x51\x4c\x60\x36\xcb\x9d\x97\xd9\x66\x89\x1d" - "\xc4\x66\x89\xfd\x17\xb3\x59\xe6\x16\x5f\xd5\xa9\x43\xc9\xfc\x1f" - "\xc5\x07\x2f\xf3\x1f\xb1\x5f\xd5\xa9\x43\xd1\x77\x6e\x43\xf0\xf4" - "\x4d\xf4\x79\xfe\x61\x68\x9d\xfa\xe3\x6a\xb7\x4e\xfd\x71\xb5\x6f" - "\x9d\xfa\xe3\xfb\xae\xea\xd4\x81\x74\xea\xa3\x33\x82\xd7\xa9\x3f" - "\x56\x79\xeb\xd4\xf9\xa9\xfe\xe9\xd4\x1f\x3f\x3f\xfc\x3a\xf5\xc7" - "\x7d\xe6\xa1\xe7\x27\xf3\x3a\x25\xd6\x06\xae\x53\xe7\x3f\xe0\x5b" - "\xa7\xce\x7f\xc8\x5b\xa7\xce\x8f\xe2\xba\x73\xbe\x91\xeb\xd4\xf9" - "\xb1\x3c\x3d\xb1\xc6\x33\xdd\xad\x53\x79\x3a\xd7\xa9\xf3\xb3\x03" - "\xd3\xa9\x37\x5c\x66\x9d\xaa\x1d\x44\xa7\x6a\xff\xc5\x74\xea\x4f" - "\x7c\xc6\x7f\xbe\x2a\xf3\x65\x99\x3f\x7f\x73\xf0\x32\xff\x31\x9f" - "\xe7\x1f\x87\x96\xf9\x3f\xdd\xeb\x96\xf9\x3f\xdd\xeb\x5b\xe6\xff" - "\xf4\xae\xab\x32\x7f\x20\x99\xbf\x20\x26\x78\x99\xff\x9f\x4e\x6f" - "\x99\x9f\xb4\xcc\x3f\x99\xff\xd3\x35\xc3\x2f\xf3\x7f\xda\x67\xff" - "\x5f\xd2\x02\x5e\xa7\xc7\xf6\x05\x2e\xf3\x93\xee\xf6\x2d\xf3\x93" - "\xee\xf3\x96\xf9\x49\x1a\x2e\xdb\x93\xf4\x5c\xe6\x27\x45\xf3\xf4" - "\xc7\x2c\x9e\xe9\x6e\x99\xcf\xd3\xb9\xcc\x4f\x32\x06\x26\xf3\xc3" - "\x2f\xb3\xcc\xd7\x0c\x22\xf3\x35\xff\x62\x32\xff\x67\x0d\xc1\xcb" - "\xa4\x85\xf3\xdc\x32\x69\xe1\x3c\xdf\x32\xe9\xf1\x83\x57\x65\xd2" - "\x40\x32\x29\x29\x2f\x78\x99\xf4\x78\xb1\xb7\x4c\x5a\xe8\xf2\x4f" - "\x26\x2d\x0c\x1d\x7e\x99\xb4\x30\xca\x5b\x26\x2d\x94\xea\xf4\xf3" - "\xc7\x02\x97\x49\x0b\x3f\xf4\x2d\x93\x16\x7e\xec\x2d\x93\x16\x4a" - "\x6b\x66\x0b\x9d\x5c\x26\x2d\xac\xe2\xe9\x3f\x5f\xe0\x99\xee\x96" - "\x49\x3c\x9d\xcb\xa4\x27\x86\xda\xff\xc0\xb0\x5f\x1b\xd9\x07\xfb" - "\xbf\x92\xb1\xbf\x28\xf9\xa3\x12\x19\xfb\x8b\xf8\x3e\xe7\x92\xb8" - "\xd6\x5f\xa7\x11\x65\x01\xc6\xdc\x80\xfe\x6e\xf8\x39\x62\xff\xc9" - "\x23\xb8\xff\x40\xdd\x08\x32\xac\x59\x92\x69\x26\x90\x69\xcd\xf0" - "\x8c\x3e\xa9\x26\xc7\xb5\xa2\x2c\xc2\x58\x04\xf8\xcc\x65\x9b\x7d" - "\x04\x9e\xdd\x0c\xe8\x5c\x55\xb3\x74\xae\x6a\x49\xff\x73\x55\x25" - "\x1e\xe7\x77\xb0\x6f\x84\xae\x53\x84\xe1\x5a\x30\xc8\x37\x49\x8e" - "\x55\x8f\x70\xaa\x24\x39\x76\x0e\xe4\xd8\x39\x77\x9f\x40\x39\xd6" - "\x01\x72\xac\x33\x5d\x37\x05\x65\x59\xff\x33\x55\x7c\xed\x97\xc9" - "\xb1\xfc\x3e\x72\xec\x17\x7d\xe4\xd8\x33\x20\xc7\x92\x41\x8e\x8d" - "\x76\xf7\x87\x9b\x1b\x89\x30\x77\x31\xf4\x09\x90\x63\xbf\x3d\x87" - "\x72\xec\x60\x90\x72\xec\xc9\xed\xde\xfd\x21\x39\xd4\xbf\xfe\xb0" - "\x68\xb2\xaf\xfe\xd0\x53\x18\x6c\x7f\x58\x14\xe3\xdd\x1f\x16\x39" - "\x78\x9d\x9e\xf8\x71\xe0\xfd\x61\xd1\xb1\xde\xfe\xf0\xab\xbe\xfd" - "\x61\xd1\x17\xde\xfd\x61\xd1\x1e\x8e\xfb\x64\x35\xef\x0f\x8b\xaa" - "\x79\xfa\x13\xf3\x3c\xd3\xdd\xfd\x81\xa7\xf3\xfe\x90\x1c\x79\x75" - "\x7d\xf6\x4a\xd5\xd1\x8b\x33\xae\xae\xcf\x0e\x35\x2e\x4b\x8e\x09" - "\x7e\x5c\xf6\xd4\x65\x5a\xff\xfe\x2e\xcd\x25\x2f\x3e\x10\x3c\x7d" - "\x97\x5c\xa6\xf5\xef\xef\xd2\xbc\xc2\xd3\x17\xb0\xfe\xbd\x74\xd0" - "\xf5\xef\xc1\xed\x18\x7d\x4c\x4d\xaf\x0d\xaf\x8f\x91\xf7\x6e\xf6" - "\xb7\xe1\x7f\xf1\x8a\xf7\xd9\xa9\x67\x1e\xe9\x7b\x76\x6a\x28\xdb" - "\xde\xf9\x7f\xca\xb6\x5f\xb2\x21\x78\xdb\xfe\x17\xcb\xbd\x6d\x19" - "\xfd\x31\xff\x6c\x99\x5f\x7c\xed\xcb\x96\x71\x06\x6d\xdb\xff\xc2" - "\xe1\x6d\xcb\xe8\x0f\x48\xfc\x9f\x18\xb8\x2d\xa3\x7f\xcd\xb7\x2d" - "\xa3\xaf\xf0\xb6\x65\xf4\xd9\xdc\x66\xd1\x37\x70\x5b\x46\xbf\x99" - "\xa7\x3f\x13\xe9\x99\xee\xb6\x65\x78\x3a\xb7\x65\xf4\xcd\x57\xd7" - "\x6d\xaf\x54\x5b\xe6\x97\x73\xae\xea\xda\xa1\x74\x81\xde\x11\xbc" - "\x2e\xf8\x55\xf9\x55\x5d\x3b\x14\x7d\x7f\x59\x1c\x3c\x7d\x57\xf8" - "\x8c\x7f\x35\xb4\xae\x5d\xb5\xc5\xad\x6b\x57\x6d\xf1\xad\x6b\x57" - "\x85\x7a\xeb\xda\x15\x6f\x5f\xd5\xb5\x83\xe9\xda\x5f\xd9\x83\xd7" - "\xb5\x2b\x1b\xbc\x75\xad\xe1\x41\xff\x74\xed\xaa\xc7\x86\x5f\xd7" - "\xae\x5a\xe2\xad\x6b\x0d\xb1\x12\xff\x9f\x0f\x5c\xd7\x1a\xc6\xf9" - "\xd6\xb5\x86\x89\xde\xba\x76\x55\x1b\xd7\xa9\x86\xd9\x5c\xd7\x1a" - "\x08\x4f\x5f\xb1\xc1\x33\xdd\xad\x6b\x79\x3a\xd7\xb5\x86\x79\x57" - "\xd7\x73\xaf\x54\x5d\xfb\xac\xcf\xf8\x87\x57\x75\x81\xac\x0b\x0c" - "\x4b\x82\xd7\x05\xab\x23\x82\xd7\x05\xa9\x3b\xdc\xba\x20\x75\x87" - "\x6f\x5d\x90\x3a\xd1\x5b\x17\xac\x3e\x78\x55\x17\x0c\xa6\x0b\x9e" - "\x75\x06\xaf\x0b\x8c\xcd\xde\xba\x20\xed\xc7\xfe\xe9\x82\xd4\xc5" - "\xc3\xaf\x0b\x52\x0d\xde\xba\x20\x6d\xa6\xc4\xff\xdf\x04\xae\x0b" - "\xd2\x26\xfb\xd6\x05\x69\xb7\x78\xeb\x82\x54\x07\x97\xf9\x69\xf3" - "\xb8\x2e\x48\x53\xf3\xf4\xd5\xc5\x9e\xe9\x6e\x5d\xc0\xd3\xb9\x2e" - "\x48\x5b\x78\x75\x9d\xf7\x4a\xd5\x05\xe9\x96\xe0\x65\xd5\xda\x79" - "\x6e\x59\xb5\x76\x9e\x6f\x59\xb5\xe6\xa0\xb7\xac\x32\x3d\x7b\x55" - "\x56\x0d\x26\xab\xd2\x0c\xc1\xcb\xaa\x35\x7d\xd6\x7f\xd7\xfa\xb9" - "\xfe\xbb\xd6\xe7\xfa\x6f\xf0\xb2\x6a\x6d\x9f\xf5\xdf\xb5\x52\x9d" - "\x4c\xf7\x05\x2e\xab\xd6\x7e\xe8\x5b\x56\xad\xed\xb3\xfe\xbb\x56" - "\x5a\xff\x5d\x2b\xad\xff\xae\x95\xd6\x7f\x4d\x33\x3d\xd3\xdd\xb2" - "\x8a\xa7\x73\x59\xf5\xdc\x05\xae\xff\x66\x9a\xdc\xeb\xbf\x99\xec" - "\xcc\x80\xb8\xc5\x1c\xd9\x7f\xfd\x37\xe3\xb4\xb7\x1f\x93\xe7\xf2" - "\xd9\x5a\x30\xf6\x8b\x4e\x7e\x36\x7d\xc0\x75\xe1\x89\xe6\xc8\xab" - "\xeb\xc2\xc3\xb1\x2e\x9c\x51\xe5\xdd\x4f\xcc\xb7\xf8\xd7\x4f\x32" - "\xef\x1e\xfe\x75\xe1\xcc\xd9\xde\xfd\xc4\x2c\x63\x22\x88\x75\xe1" - "\xcc\x6f\x7d\xf7\x93\xcc\xf3\xde\xfd\x24\x53\xda\x97\x6b\x8e\xe6" - "\xfd\x24\xd3\xc6\xd3\x9f\x9b\xe7\x99\xee\xee\x27\xcf\x79\xac\x0b" - "\x9b\x63\xfd\xd1\xe9\x4e\x75\xe6\x02\xd4\xd1\x31\x0d\xf7\xbb\x7a" - "\xf1\x6c\x94\xf0\x3c\x90\x4e\x7f\x8a\xcb\x7e\xc4\x71\xcf\x8e\xb8" - "\xce\x21\x75\x7a\xb3\xa4\xd3\x97\xf4\xd7\xe9\xb2\x3e\x47\x3c\xbf" - "\xec\xd7\x9a\x70\x1f\x5c\x07\xa4\xcf\x23\xab\x2e\x04\xd7\x88\x69" - "\x6f\x7d\x1e\x2c\xae\xb3\x2e\xd3\xf9\x97\xef\xd2\x9a\xb0\x79\x76" - "\xf0\x63\xbb\xec\xcb\x74\xfe\xe5\xbb\x34\x4f\x9d\x75\x01\xe7\x5f" - "\x72\x06\x3d\xff\x72\x75\x6e\x02\xe9\xbb\x6e\x46\xf0\xf4\x5d\x5f" - "\x19\xbc\xbd\x9f\x9b\xec\xb6\xf7\x73\x93\x65\xdb\x06\x65\x21\xf3" - "\xbb\x03\xf2\xaf\x30\x05\xae\x73\x84\xfc\x3a\x85\xf9\x1d\x57\x59" - "\x9b\x8f\x10\x83\x19\xed\x9d\xe7\x8f\x24\x9a\x3c\xed\x9d\x0d\xa9" - "\xb2\xad\x93\x88\x76\x10\xd8\x35\x68\xd3\xc8\x36\x7e\x71\xfb\x10" - "\xfb\x41\x6f\x89\xeb\xc4\x31\x41\x4f\x68\xe6\x82\x7f\xfd\xf1\x40" - "\xce\x96\xe0\xc7\x03\xcf\xf7\xd9\xff\xf6\x5f\x7e\xee\x7f\xcb\xf5" - "\xb9\xff\x2d\xf8\xf1\x40\x6e\x9f\xfd\x6f\xb9\xd2\xfe\xb7\x0d\xd3" - "\x02\xb7\x73\x72\x07\xd9\xff\x96\xdb\x67\xff\x5b\xae\xb4\xff\xed" - "\xbf\xa4\xfd\x6f\xb9\xd2\xfe\xb7\x0d\x31\x9e\xe9\x6e\x3b\x87\xa7" - "\x73\x3b\xe7\xbf\xfc\xda\xff\x06\x76\x4e\xd2\x05\xd8\x39\x8e\xef" - "\x8e\x9d\x33\xf1\x0a\xb1\x73\xf2\x4c\x7e\xe8\x89\x05\x7d\xf4\x44" - "\xe7\xff\x2d\x3d\xf1\x5f\x17\xb0\xf7\x2d\x7f\xd0\xfd\xff\x8c\xbe" - "\x05\x1e\xf4\x45\x19\x2d\xd1\xd6\x15\x1d\xd7\x19\x14\x7d\x41\x36" - "\x97\x9a\xbf\x2b\xb4\xcd\xb3\x04\x4f\xdb\x5f\x4f\xbf\x6a\xe3\x0c" - "\x45\xdf\x8d\xda\xe0\xe9\x5b\xb0\x39\x78\x1b\x67\xd3\x92\x8f\x7a" - "\x6d\x9c\x4d\x4b\xfa\xda\x38\x68\xd3\x3c\xe2\xe0\xb6\xce\xaf\xc1" - "\x46\xd9\xb8\x12\xec\x9d\x34\x42\xac\xcd\xef\x90\x02\xb0\x79\x36" - "\x9e\x01\xbb\x67\x39\xd8\x3d\xce\xd7\x24\xbb\xa7\xe8\x98\xb7\xdd" - "\x53\xb8\x62\x40\xbb\x27\xd4\x6d\xf7\x38\xc1\xa6\xe9\x79\x2d\xae" - "\xb3\xf8\x8c\x87\x0d\xf4\xcb\xfe\x36\x50\x77\x21\xe8\x9c\x5b\xe2" - "\x1c\x3d\x60\x07\x0d\x66\x03\x31\xde\xf7\xb1\x83\xbe\x7b\x36\xd0" - "\xaf\x33\x82\xb7\x81\x8a\xfa\xf8\x10\x2d\x1e\xe7\x9f\x0d\xb4\xe9" - "\x46\x9f\x73\x3d\x41\xdb\x40\x9b\x62\xbd\x6d\xa0\x4d\x4e\x09\x17" - "\xe3\x02\xb7\x81\x36\x1d\xf7\x6d\x03\x6d\x3a\xe9\x6d\x03\x6d\xaa" - "\xe2\xb6\x4e\xb1\x86\xdb\x40\x9b\x6a\x78\x7a\xa1\xc6\x33\xdd\x6d" - "\x03\xf1\x74\x6e\x03\x15\x47\xf9\xb9\x7e\xb3\xc0\x09\x3a\xf6\xf2" - "\xef\x9b\x1b\x6c\xfd\x66\xb8\xf6\xcd\x45\x5e\x21\xeb\x37\xbf\xc9" - "\xbe\xaa\xa7\x07\xd3\x23\xc5\xb1\xc1\xeb\x91\xff\xbe\x4c\xfb\xff" - "\xbf\x4b\x7a\xfa\x37\xd5\xc1\xd3\x77\xf3\xa0\xfb\xff\x07\xd7\xd3" - "\x2f\xb4\xb9\xe7\x22\x5e\x68\x0b\x6c\x2e\xe2\x85\xc5\xde\x3a\xf9" - "\x77\x8a\xab\x73\x11\xfe\xea\xe1\xdf\x46\x07\xaf\x87\x5f\x88\xf1" - "\xd6\xc3\x2f\x6e\xf5\x4f\x0f\xbf\xf0\x87\xe1\x9f\x8b\x78\xa1\xca" - "\x5b\x0f\xbf\x28\xe9\xbd\xcd\x6f\x07\xae\x87\x5f\x5c\xea\x5b\x0f" - "\xbf\xb8\xc2\x5b\x0f\xbf\x18\xcf\xf5\xed\x8b\x5b\xb8\x1e\x7e\x71" - "\x01\x4f\xdf\x5c\xe5\x99\xee\xd6\xc3\x3c\x9d\xeb\xe1\x17\x77\x04" - "\xb6\xe6\x72\xc3\x15\xba\xe6\xa2\xfd\x17\x5b\x73\xd9\xaa\xbc\xaa" - "\x27\x86\xd2\x13\x2f\x56\x05\xaf\x27\x5e\x5a\x12\xbc\x9e\x28\x8d" - "\x70\xeb\x89\xd2\x88\xc0\xf4\x44\x49\xbe\xb7\x9e\x78\x79\xea\x55" - "\x3d\xe1\xaf\x9e\xd8\x3a\x37\x78\x3d\x51\xb2\xc0\x5b\x4f\x94\xee" - "\xf3\x4f\x4f\x94\x7c\x3c\xfc\x7a\xa2\xc4\xe6\xad\x27\x4a\x77\xf1" - "\x3a\xbd\xf4\x45\xe0\x7a\xa2\xb4\xd0\xb7\x9e\x28\xfd\x9d\xb7\x9e" - "\x28\xd5\x73\x7d\x50\x6a\xe1\x7a\xa2\x34\x83\xa7\xbf\x64\xf3\x4c" - "\x77\xeb\x09\x9e\xce\xf5\x44\x69\xcd\xd5\xfd\x76\x57\xea\x7e\xbb" - "\x6d\xb1\xc1\xcb\xb2\x57\x2c\x6e\x59\xf6\x8a\xc5\xf7\x7e\xbb\x57" - "\xee\xf6\xde\x6f\xb7\xed\x8b\xab\xfb\xed\x06\x93\x55\xa5\xb6\xe0" - "\x65\xd5\x2b\xc4\x5b\x56\xbd\xea\x67\x3c\xc8\x57\x32\x87\x5f\x56" - "\xbd\x52\xe0\x2d\xab\x5e\x95\x62\x40\x6e\xab\x08\x5c\x56\xbd\xfa" - "\x03\xdf\xb2\xea\xd5\x07\xbc\x65\xd5\xab\x52\xfc\xc7\x57\x97\x73" - "\x59\xf5\xaa\x14\xff\x71\xdb\x2e\xcf\x74\xb7\xac\xe2\xe9\x5c\x56" - "\xbd\xea\x97\xff\x7f\xf7\xfa\x5a\x50\x36\xed\x25\x58\x5f\x1b\x2e" - "\x9b\xf6\x4a\x59\x5f\xfb\xff\xae\xae\xff\x0c\x6a\xcf\xbe\x7a\x01" - "\x7e\xff\x5f\x1b\x74\xfd\x67\x70\x1d\xb0\xd3\xe9\xd6\x01\x3b\x9d" - "\xbe\xd6\x27\x36\x02\x86\x0a\xc0\x1e\xcd\x3f\x43\x94\xbf\xc6\xf5" - "\x89\xc3\xb5\xa4\x10\xd7\x27\x56\xca\xeb\x13\xa5\x92\x8d\xbb\xf3" - "\x59\x6f\x1b\xf7\xf7\xa1\x03\xd9\xb8\x68\xdb\xba\xc0\x6e\x75\xf6" - "\x5d\x97\xf8\xf9\xc0\xba\xa3\x3b\x34\x33\xe9\xfc\x6b\x71\x8e\x40" - "\x74\xc7\xcb\x6b\xb9\xee\x78\xe9\x3b\xa5\x3b\x76\x68\x83\xd7\x1d" - "\x3b\x67\x7a\xeb\x8e\xf2\x3f\xf8\xa7\x3b\x76\xbe\x3d\xfc\xba\x63" - "\x67\xb5\xb7\xee\x28\xdf\xcc\xeb\xf4\xda\x1b\x81\xeb\x8e\xf2\x54" - "\xdf\xba\xa3\x3c\xd3\x5b\x77\x94\x4b\x7b\x4d\xcb\xcb\xb9\xee\x28" - "\x5f\xc2\xd3\x5f\xab\xf4\x4c\x77\xeb\x0e\x9e\xce\x75\x47\xf9\x9e" - "\xc0\xe6\x43\xc2\xaf\xd0\xf9\x10\xcd\xbf\xd8\x7c\xc8\x1f\x2f\xe0" - "\xfc\xdb\xae\xbd\x35\xbd\xfb\xe7\x77\xed\xed\x37\x5e\x4f\x03\x5b" - "\xb7\x9d\xaf\xb9\xf6\x8e\xd7\x6d\xc7\x25\x59\xb6\xeb\x2e\x6f\x59" - "\xf6\xc7\x63\xbe\x64\xd9\x60\xeb\xaa\x38\x3e\x77\x81\x9c\xc3\x58" - "\x6b\x41\xad\xab\xa6\x7d\x97\xe4\x57\x79\x75\xf0\xf2\xeb\x7f\xfa" - "\xf8\x3f\xad\xf0\xd3\xff\xe9\x2e\x9f\xfe\x4f\x9d\x41\xef\xa1\xdf" - "\xd5\xc7\xff\x69\x85\xe4\xff\xf4\x8f\x41\x9c\x8b\xab\xb8\xdb\xb7" - "\xfc\xaa\xe8\xe3\xff\xb4\x42\x5a\x3f\xad\x90\xfc\x9f\x56\x48\xfe" - "\x4f\xff\x58\xec\x99\xee\x96\x5f\x7f\xf4\x38\x17\x57\x31\xa8\xff" - "\x53\x5a\x90\x90\x54\x2c\x88\x95\x70\x55\x41\x1d\x27\x02\x06\x2c" - "\xf0\xbb\x1a\xf8\x38\x0e\x7e\xd7\xfb\xea\x63\xf6\xd0\x84\x24\x31" - "\x07\xea\x2c\x10\x85\xd5\xfe\x8d\xc5\x32\xc9\x89\xf5\xec\xe4\xbc" - "\x4a\x48\x0a\x77\x8e\x9a\x23\x52\x3d\x01\xbe\x24\xb1\xf8\x78\x90" - "\x3f\x0c\x30\xa3\x4d\x23\x61\x67\x14\xbb\x23\xe4\x7c\x50\xdf\xb0" - "\x26\x45\xc5\xc7\x58\x46\x57\xee\x6e\x2d\xb4\x25\xdb\x67\x5d\xa1" - "\xac\xc4\x3f\x4c\x21\x99\x4e\xfa\x95\x65\x65\x3b\x69\x56\xec\x5e" - "\x16\xde\x36\x6a\x0e\xcd\x4a\x22\x68\x63\x55\x4e\xb2\x2b\xb1\x4c" - "\xcb\xca\x6e\x7c\x37\x17\xdf\xb9\xa0\x8e\xe6\x15\x44\x28\x6a\x1f" - "\xa5\x02\x59\x30\x22\xab\x93\xb6\xae\x72\x42\x9d\x4d\x4e\xf2\xde" - "\x94\x06\xe5\xeb\x2f\x41\x9a\x8b\x44\x62\x4c\x3c\x2c\x03\x6c\x4c" - "\xa8\xcf\xee\x15\x65\x90\x7f\xa0\x3a\x3c\xbf\x9b\xc4\x8c\x98\x4a" - "\x6d\x81\xe1\x66\xb7\xc5\x17\x1d\xc3\xd7\x4d\x21\x96\xdb\x80\x76" - "\x5a\x22\x0c\xf4\x3e\xb0\xef\xbc\xae\x1b\x44\x26\xaa\x30\x9e\x66" - "\xd6\x56\x22\x6c\x12\x47\xa9\xf6\x67\xb0\x78\x96\xf6\xae\xdc\xd7" - "\x37\xdb\x14\x93\x2a\x91\xe6\x18\x33\x0d\x63\xae\x02\x6e\x08\xa4" - "\xef\xda\x67\x22\xa4\x2f\x2f\x52\x96\xac\x58\xac\x35\x2e\x5b\xb1" - "\x74\x55\xaa\x51\x7b\xcb\x92\x31\x64\xc1\xaa\x55\xda\x15\x8b\x57" - "\xae\xd1\x7a\xbe\xb9\x57\xbb\x64\xd9\xea\xc5\x4f\x2d\x5f\x3a\x6d" - "\xc5\xd3\x86\x31\x38\x78\xf5\xa8\x47\x04\xd6\x45\xcc\x7d\xbd\xaa" - "\xec\xbf\x09\xf9\xed\x78\xa2\xc4\x7a\x75\xe5\x56\x46\xc9\x31\xf5" - "\x8a\x5e\xa0\x9d\x02\xe4\xc9\x02\x19\xb8\xc9\x3c\x0a\xf3\xea\xb6" - "\x41\xbd\xca\xa0\xde\x50\x47\xa8\x73\xe5\x1c\xb9\xce\x32\x26\xb2" - "\x10\x13\xe6\x76\xc0\x60\xe5\xb2\x70\xc7\xa8\xff\xa0\x34\x09\xdb" - "\xd7\x09\xfd\x44\x01\x69\x6f\xa3\x5e\xa2\x85\x09\x49\xf0\xdf\x0d" - "\x32\xc6\xf0\xbf\xb4\x28\x41\xdb\x85\xfd\x84\xea\xe3\x78\x9f\x7a" - "\x63\xe1\x63\x3a\x05\xe1\x31\xfd\x2a\x2b\xdd\x31\xfd\xde\x60\xb1" - "\xe5\xa0\x1e\x6d\x90\x5e\x6d\x23\x6d\x36\x4c\xc7\xd8\x92\x18\xeb" - "\x15\xeb\x0c\xed\x02\xbd\x48\x2d\x34\x47\xc2\x7e\xde\x0b\xdb\xc5" - "\xbc\x37\xab\xac\xca\x73\x24\xd1\x49\x7b\x68\xfe\x0b\xdb\xeb\x3a" - "\x3b\x49\xf8\x3a\xc3\xd3\x74\xe4\xeb\x1f\x86\x3b\x97\x2d\xc5\x98" - "\xe4\x62\xfe\x9b\x55\x34\xbf\x62\xef\x63\x53\x89\xa6\x2b\xf7\x8d" - "\x68\x8f\xd8\x82\xca\xc0\xf8\xff\x06\xe3\x3f\xf2\x11\xea\x23\xf1" - "\xf1\x0d\xe3\x3e\x63\x7f\x3e\xf6\xe2\xef\x0f\x22\x39\x08\x58\xa0" - "\xea\xd5\xdb\x13\x5d\x9c\x8e\xd8\x77\x3b\xb2\xf4\xe4\x4e\x46\xbb" - "\x3f\xc5\x88\x45\xab\xb3\xc5\x82\xd5\x55\xb4\x60\xf5\x0e\xa0\xd9" - "\x8c\xa2\x34\xa2\x5d\xe4\xd2\x90\xc2\x73\x24\xd6\x5e\xb8\x7a\x7b" - "\xa8\x22\x5b\x01\xb6\x85\x00\x7a\x23\x16\x64\x46\xac\xd4\xdf\x67" - "\x20\x1d\xff\xd6\x46\xc8\xa3\xab\x09\xf9\x6a\x26\x09\x29\x83\xff" - "\x05\xd8\x1e\xee\xff\x29\xf7\x8d\xca\x6d\xf0\x5f\x8c\x0d\x19\xd8" - "\xff\xff\x34\xc3\x67\xbf\xeb\x6d\xb7\x51\x3b\x70\xbb\xdf\x8c\x16" - "\x8b\x8c\x30\xde\x34\xce\xa0\x05\xc6\xe8\xfe\xed\x36\x6a\x79\xbb" - "\x47\xb4\x0f\x7f\xbb\xff\xc4\x63\x2e\xe6\xfe\xa9\x3c\xb8\x76\xbf" - "\xe9\x73\xfe\xcf\xa3\xdd\x3e\xf8\xbd\x27\x0a\xda\x0d\xfc\x36\x02" - "\xbf\x8d\x03\xf0\xdb\x28\xf1\x7b\x6c\xd3\xf0\xb7\xfb\xcd\x56\xde" - "\xee\x37\xb7\x07\xd7\xee\x3d\x3e\xe5\x9f\xbb\xdd\xa9\x3e\xf8\xfd" - "\x56\x84\x58\x94\x0a\xfc\x4e\x05\x7e\xa7\x0e\xc0\xef\x54\x89\xdf" - "\xe3\x3e\x19\xfe\x76\xef\xe1\xf3\xff\xb9\x7b\xb6\x04\xd7\xee\xb7" - "\xb4\x7e\xb4\xdb\x07\xbf\xff\x57\x0d\xed\x06\x7e\xa7\x02\xbf\x53" - "\x07\xe0\x77\xaa\xc4\xef\x7b\x36\x0e\x7f\xbb\xdf\xe2\xfe\x6f\x72" - "\xdf\x2a\x0e\xae\xdd\xff\x1b\x39\x74\xbb\xd3\x7c\xf0\xfb\xcf\x4a" - "\x11\x1a\x2a\x16\xa4\x01\xbf\xd3\x06\xe0\x77\x9a\xc4\xef\xc7\x67" - "\x0d\x7f\xbb\xff\xb7\x9e\xb7\xfb\x7f\xf3\x82\x6b\xf7\x9f\x35\x43" - "\xb7\x7b\x75\x39\xc8\xec\x7e\x3c\xb7\x9a\x66\x90\x3b\xce\x61\xfb" - "\xab\x8c\x34\x74\x75\xf9\xd8\x75\xd9\x0a\xa7\x7a\xf5\xae\xb1\x8d" - "\x44\x80\xb1\x9f\x3e\xdc\x46\x46\x43\x5b\xf5\xb4\xc8\x14\x8f\x77" - "\x11\xca\x71\x82\xec\x77\xa9\x57\xef\xe8\x2e\x48\x98\xf1\xeb\x67" - "\x88\x36\xcb\x4e\x34\x75\x66\x1b\x31\x1b\xa8\xbd\x8e\x7c\x41\x42" - "\x6d\x44\xc0\x79\xac\x8f\xda\xaa\xc8\xca\x14\x4a\xa1\xec\x27\x70" - "\xbc\x58\xd4\x42\x62\xc1\x26\xce\xa6\xa0\x3f\x8a\x45\xa2\x85\xf2" - "\x63\x91\x96\x50\xf6\xac\xf0\x05\x44\xf1\xee\x53\x0e\x82\xf4\x44" - "\xda\xc2\xd8\x32\x96\xd1\x15\x2c\xc8\x1f\x3d\xce\xe9\xfa\xf2\x33" - "\x81\xd2\xb5\x4a\xc7\xed\xca\xd5\x16\xab\xad\x9b\x80\x6d\xa9\xc1" - "\x73\xcd\x40\xaf\xe6\x3a\x43\x3b\x8c\x43\xfe\x9c\x47\x0b\x57\x57" - "\x8a\xa0\xb3\x02\x2c\xd7\xe7\xfe\x37\x0f\x79\xaa\x03\x99\xd9\x0f" - "\x6b\x6e\x7a\xbf\xdd\x4c\x43\x8d\x3a\x4e\x6f\x63\xcc\xd8\xc6\x11" - "\xed\x03\xd3\xdb\xa8\x73\x82\xce\x71\xa9\x8d\xd1\xfe\xd3\xfb\xed" - "\x5a\x6f\x7a\x1b\xc9\xa5\xa1\xf7\xdb\xdc\x8f\x58\x81\x31\xde\x9b" - "\xde\x6f\x2f\xe0\xf4\xae\x72\xd0\x42\x63\xac\x08\xba\x32\xc0\x72" - "\x7d\x9e\x7f\xf4\xa0\x37\xe0\xbb\xbf\x0e\x73\xd3\xfb\xaf\x0b\x80" - "\xde\x12\xbe\x8d\x80\xef\xb1\x4d\x3e\xe8\x0d\xf8\x36\x02\xbe\x8d" - "\x01\xe0\xfb\xaf\xf7\xf5\xa1\xf7\x25\xc2\xf7\x5f\xa5\xf8\x4f\xc6" - "\x3e\xf8\xfe\xcb\x01\x4e\xef\xbf\xe8\x81\xde\x80\x6f\x63\x80\xf8" - "\xfe\x6b\xb2\x1f\xfa\x03\xf0\xdd\x5f\x77\xba\xe9\xbd\xf7\x00\x0d" - "\x4d\x95\xf0\x9d\x0a\xf8\x1e\xf7\xc9\xc0\xf4\x4e\x05\x7c\xa7\x02" - "\xbe\x53\x03\xc0\xf7\xde\x0a\x6f\x7a\xa7\x5e\x22\x7c\xef\x35\x71" - "\x7a\xa7\xf6\xc1\xf7\xde\xe9\x9c\xde\x7f\x6d\xa0\x85\xa9\x80\xef" - "\xd4\x40\xcb\xf5\x39\xae\xf6\xa0\x37\xe0\xbb\xbf\xce\x76\xd3\xfb" - "\xdd\xe9\x40\x6f\x09\xdf\xa9\x80\xef\x7b\x36\xfa\xa0\x37\xe0\x3b" - "\x15\xf0\x9d\x1a\x00\xbe\xdf\x9d\xdc\x87\xde\x97\x08\xdf\xef\xb4" - "\x4a\xf4\xee\x83\xef\x77\x76\x70\x7a\xbf\x33\x07\xe8\x0d\xf8\x4e" - "\x0d\x10\xdf\xef\xc6\xfb\x61\x27\x00\xbe\xfb\xdb\x0a\x6e\x7a\xbf" - "\xb7\x83\x86\xa6\x49\xf8\x4e\x03\x7c\x3f\x3e\x6b\x60\x7a\xa7\x01" - "\xbe\xd3\x00\xdf\x69\x01\xe0\xfb\xbd\x42\x6f\x7a\xa7\x5d\x22\x7c" - "\xbf\x97\xc4\xe9\x9d\xd6\x07\xdf\xef\x45\x70\x7a\xbf\x5b\x45\x0b" - "\xd3\x00\xdf\x69\x81\x96\xeb\xf3\xfc\xef\x60\xf6\xc9\xea\x52\xa2" - "\xf2\xa6\xf9\xbe\xc8\x8b\x67\xa3\xec\x53\x5c\x1e\x1b\xc5\x52\x33" - "\xb0\x8d\x62\xc9\xe3\x34\xb7\xc4\x04\x67\xa3\xec\x8b\x0e\xc6\x46" - "\xe9\x4f\xf3\xf7\x0b\x2e\x9e\x9d\xf2\x7e\xea\xe5\xb1\x53\xde\x8f" - "\x1f\xd8\x4e\xd9\xe7\xe4\x34\xdf\xb7\x3d\x38\x3b\xe5\xfd\x2d\xc1" - "\xd8\x29\xfd\x69\x7e\x80\x5c\x3c\x5b\x65\xff\xd7\x97\xc7\x56\xd9" - "\xbf\x67\x60\x5b\x65\xbf\x81\xd3\x7c\x7f\x44\x70\xb6\xca\x01\x75" - "\x30\xb6\x4a\x7f\x9a\x1f\x34\x5e\x3c\x7b\xe5\xe0\x13\x97\xc7\x5e" - "\x39\xa8\x1b\xd8\x5e\x39\x20\x8d\x7f\x0e\xe4\x05\x67\xaf\x1c\xf4" - "\x63\xfc\xd3\xdf\x5e\xe9\x4f\xf3\x0f\x5a\x2f\x9e\xcd\xf2\xc1\xc7" - "\x97\xc7\x66\xf9\xa0\x64\x60\x9b\xe5\x83\x24\x4e\xf3\x83\xce\xe0" - "\x6c\x96\x0f\x3a\x83\xb1\x59\xfa\xd3\xbc\x7a\xe1\xc5\xb3\x5b\xaa" - "\x1f\xbc\x3c\x76\x4b\xb5\x66\x60\xbb\xe5\x6f\x35\x9c\xe6\x7f\x33" - "\x04\x67\xb7\x54\xeb\x83\xb1\x5b\x90\xd6\x48\x73\xb4\x55\x38\xcd" - "\x3f\x8a\xa1\x61\xab\xb3\x7b\xc0\x1e\x09\x05\xba\x87\xb6\x11\xa1" - "\x14\x69\xde\xc0\x69\xee\x0a\x33\xc5\x03\x7d\xf4\x48\x33\xd6\x8e" - "\x7f\x46\x86\xb9\x0a\x56\xef\xa2\x02\x81\xb6\xa8\x48\x8b\xe2\xc3" - "\x1f\x38\x73\x48\x98\xd6\xbc\x0e\x7e\x7f\xc4\xfc\x67\x6a\xcd\xb9" - "\xc7\xa1\x8d\x21\xb8\x46\xe1\x2c\x9c\x65\x73\x85\xa6\x27\xb7\x28" - "\x0e\xad\xa1\x93\xe3\x6c\x3d\x60\x4b\xd0\x5f\x45\x46\x58\xdb\x2a" - "\x89\xd5\x79\x88\xd4\x35\xfc\x85\x88\x61\xa6\x59\x77\x3a\x89\x8e" - "\xfe\x53\x17\x51\x63\xb4\x11\xd7\xd3\x91\x6a\xab\xa9\x1a\x70\xf1" - "\x27\x92\xd8\x4a\xcf\xd1\x2f\x75\xea\x9e\xd0\x8c\xed\xae\x50\x93" - "\xd6\x55\x98\xa9\x77\x86\x66\x14\x57\xa4\xd9\x04\xb5\x83\xe8\x96" - "\x37\x53\x5a\xf4\x14\x51\x16\x35\x11\xd5\xa6\xa7\x88\x7a\x53\x13" - "\xd1\xd4\x34\x37\x90\xda\x53\xd5\xa4\xb6\xfd\x18\xa9\x3d\x07\x57" - "\x37\x5c\x22\x5c\xd9\xc7\x48\x4d\x1b\x21\x8f\x9c\x26\x24\xab\x99" - "\xda\x6f\x6f\x24\x11\x35\xce\x06\x82\xfb\x78\xcf\x28\x0e\x85\xaa" - "\x93\x49\x04\xfd\x32\x92\xd0\xa7\x23\x05\x78\xa7\xc4\x74\xab\xd3" - "\x4e\x6a\x9a\x1d\xf0\xfe\xc3\x36\x78\xaf\xcc\x6a\x86\xf2\xc5\x6a" - "\xf4\x17\x67\xaf\xc9\xfe\x90\x38\xf3\xdb\xeb\x81\xce\x55\xb2\x4d" - "\x56\xd4\x4d\x62\x37\x01\x9b\x11\x33\x89\x94\x63\x66\x5b\x77\xa0" - "\x98\x39\xc4\xfd\x9f\xfd\x2a\x72\x3c\xd0\x7b\x92\xf8\xab\x24\xcd" - "\xa3\xc7\x4e\x50\xdc\xa7\x85\xeb\x33\x75\x9d\x87\x88\x75\x83\x48" - "\x12\xd7\x10\x32\xd7\x45\x08\xd2\x04\xd7\x92\x1f\x35\x90\x70\xdc" - "\x3f\x26\xfe\x53\x37\xde\xda\x6c\x27\x99\x4e\xa8\xeb\x19\x47\x6f" - "\x5d\xeb\x36\xd4\x11\x78\x37\xa9\x4e\x6f\x23\x6a\x03\xd1\x20\x9d" - "\xc1\x16\x2d\x7f\xb4\x95\x8c\x5e\xd9\x49\x29\xd2\x18\x69\x8b\x74" - "\xc6\xf2\x64\xda\x5b\x97\xd8\x49\x96\x83\x68\xac\x66\xb8\x9b\xa8" - "\xdd\x4a\xbe\x25\x50\x47\x2d\x1d\xdd\x5e\x0f\xf8\x98\x8d\x98\xb0" - "\x29\x3e\x8c\x05\x1c\x8c\xa7\xb9\xd5\xcd\x65\xd0\x5e\x5c\xc3\x0f" - "\xac\xcd\x1f\xf9\xb3\xfe\xd1\xcf\x26\x74\xe3\xd9\xa8\xe3\x78\xae" - "\x75\xd2\x30\x23\xe9\x01\x5b\x8f\xe3\x79\x44\xfb\xd0\x78\x36\xc6" - "\xb8\xf1\x5c\x33\xda\x8d\xe7\xda\xd3\xbe\xf1\x5c\xfb\x10\xc7\xb3" - "\x31\xfe\xca\xc4\x73\xcd\xf1\xc1\xf1\x5c\xb3\xd7\x37\x9e\x8d\x33" - "\x64\x7b\x77\x78\xf0\x5c\x1b\x71\xe9\xf0\x6c\xd4\x05\x87\xe7\x1a" - "\xbb\x37\x9e\x6b\x08\xc7\xf3\x47\x7b\x82\xc3\x73\x9d\xcf\xf8\x07" - "\x83\xd9\xdb\x1e\x78\x96\xe4\x73\x7d\x0d\xe0\x19\xe4\xb3\x51\x92" - "\xcf\x63\x9b\xfc\xc0\xb3\x87\x7c\xae\x3b\xe6\xc6\x73\xfd\x3b\xbe" - "\xf1\x5c\x3f\x51\xc2\xf3\x15\x2a\x9f\xad\x15\x83\xe3\xd9\x5a\x30" - "\x08\x9e\xab\xe4\xb1\xc4\xf0\xe0\xd9\xda\x7c\x09\xf1\x1c\xa4\x7c" - "\xb6\x5a\xbc\xf1\x5c\x57\xcf\xf1\x5c\xb7\x21\x38\x3c\xd7\xfb\xdc" - "\xff\x3c\xd8\x58\xc6\x8d\xe7\x54\x49\x3e\xff\xbd\x84\x86\xa5\x82" - "\x7c\x4e\x95\xe4\xf3\xb8\x4f\x86\xc6\x73\xaa\x87\x7c\xfe\xf8\x0f" - "\x6e\x3c\xff\xbd\xd0\x37\x9e\x3f\xf9\x9a\xe3\x39\xf5\x0a\x95\xcf" - "\x9f\x64\x0e\x8e\xe7\x4f\x16\xfa\xc6\x73\xea\x0c\x79\x9c\x36\x3c" - "\x78\xfe\x64\xcf\xa5\xc3\x73\x6a\x90\xf2\xf9\x93\x62\x6f\x3c\x7f" - "\xbc\x9d\xe3\xf9\xe3\x05\xc1\xe1\xf9\xef\x3e\xe3\xff\x0c\x36\x4e" - "\xf4\xc0\xb3\x24\x9f\x3f\x5d\x0e\x78\x06\xf9\x9c\x2a\xc9\xe7\x7b" - "\x36\xfa\x81\x67\x0f\xf9\x7c\x78\x8d\x1b\xcf\x9f\x3e\xe1\x1b\xcf" - "\x47\xde\x96\xf0\x7c\x85\xca\xe7\x23\x8f\x0c\x8e\xe7\x23\x31\x83" - "\xe0\xb9\x4a\x1e\x03\x0f\x0f\x9e\x8f\x6c\xb8\x84\x78\x0e\x52\x3e" - "\x1f\x49\xf6\xc6\xf3\x61\x03\xc7\xf3\xe1\xe8\xe0\xf0\xfc\xa9\x4f" - "\xff\x6f\x83\x8d\xc1\xdd\x78\x4e\x93\xe4\xf3\xb1\x99\x34\x2c\x0d" - "\xe4\x73\x9a\x24\x9f\x1f\x9f\x35\x34\x9e\xd3\x3c\xe4\xf3\xd1\x87" - "\xdc\x78\x3e\x36\xcd\x37\x9e\x1b\xf2\x39\x9e\xd3\xae\x50\xf9\xdc" - "\x30\x79\x70\x3c\x1f\x75\xfa\xc6\x73\xda\x0c\x79\x7e\x61\x78\xf0" - "\xdc\xb0\xe0\xd2\xe1\x39\x2d\x48\xf9\xdc\x10\xeb\x8d\xe7\xa3\xf1" - "\x1c\xcf\x9f\x76\x06\x87\xe7\x63\x3e\xe3\xdf\x05\x36\xbf\xd1\x38" - "\x13\xe7\x37\xba\x71\x7e\xc3\xbd\xf7\x4f\x1f\x5e\xcf\xf1\xdc\x03" - "\x78\x7e\xd9\x13\xcf\x9f\xf7\x9d\xdf\xf8\x6c\xa2\xd8\x8b\xe7\xc6" - "\x7e\x78\x16\x01\xcf\x3d\x0c\xcf\x9f\x3f\x28\xcf\x6f\x58\xdb\xb6" - "\x03\x4e\x4e\x11\xeb\x3c\xc0\x72\x91\x84\xe5\xcf\x01\xcb\x40\x43" - "\x11\x68\x5c\xd3\xd8\x40\x12\xed\x9c\x96\xdd\x40\x63\xd1\x13\xc7" - "\xdd\xad\x02\xe2\x17\x71\x2b\x63\xb8\x76\x25\x60\x37\xe5\x63\x52" - "\x9b\x06\xd7\x5a\xb8\xcc\x70\x91\x8f\x49\x4d\x2b\x60\x77\x99\x27" - "\x76\xeb\x25\xec\x7e\x76\x6c\x70\xec\x7e\x56\x75\xe9\xe6\x32\x3e" - "\xe7\xf3\x5f\x9f\x27\x69\x12\x7f\x7c\x82\x5a\x4d\x0d\x12\x3e\x4f" - "\x91\x44\x27\x09\xa7\x8f\xeb\xc6\xab\x93\x88\xe6\x39\x17\x11\x0a" - "\x9f\x22\x9a\xc2\xcf\xa0\xdd\x72\xff\x6d\x22\xea\x43\x8e\xbf\x90" - "\x9a\xf6\x06\x52\x73\xee\x43\x52\x23\xc2\x75\x0a\x2e\xa8\x6b\xe2" - "\x52\xcf\x76\xdb\xa5\x76\x7f\xfe\x31\x94\x15\xed\xbb\xdd\x9f\x57" - "\xb2\x76\x2f\x81\x76\x77\xbb\xdb\x6d\x85\x7e\x00\xfc\x99\x24\x4a" - "\xf3\x21\x89\x76\x32\x7a\x95\x93\xd2\x6e\x09\xff\xc8\x9f\x43\x87" - "\x1d\x24\xd1\x00\x3c\x7b\x1a\xf0\xdf\x5c\x4e\xb2\x32\x00\xff\xdd" - "\x0e\xc4\x9d\xdd\x9a\x7d\x1e\xf0\xff\x59\x1b\x05\xfa\xf5\x20\xfe" - "\x3f\x47\xfc\x7f\xa6\x11\x19\xfe\x8f\x1d\x08\x0e\xff\x8d\x7e\xe0" - "\xdf\x9f\xf9\x90\x13\x33\x71\x3e\xa4\x1b\xe7\x43\xdc\x7b\x40\x87" - "\xc0\xbf\xe7\x7c\xc8\x71\x0f\xfc\x9f\x18\x04\xff\xff\x78\x50\x9e" - "\x0f\xb9\xfc\xf8\x3f\x3e\x04\xfe\x8f\x0f\x82\xff\xe1\x9e\xfb\xf8" - "\xc7\x25\xc4\xff\x3f\x86\xc0\xff\x3f\xfc\xc0\xbf\x51\x17\x1c\xfe" - "\x8f\xf7\xc1\xff\x71\x09\xff\x8d\x41\xe2\xff\x84\x3f\xf8\xf7\x63" - "\xfe\xa4\x09\xf1\x0f\xf2\xdf\xb8\xc3\x63\x2f\xf0\x50\xf8\xf7\x90" - "\xff\x36\x0f\xfc\x37\x0d\x82\xff\x2f\x64\xfc\x5f\x01\xf2\xdf\x36" - "\x04\xfe\x6d\x83\xe1\x7f\x98\xe7\x4a\xbe\xb8\x84\xf8\xff\x62\x08" - "\xfc\x7f\xe1\x0f\xfe\x83\x94\xff\xb6\x3e\xf8\xb7\x49\xf8\x3f\x11" - "\x24\xfe\x9b\xfc\xc0\xbf\x3f\xf3\x2d\x27\x67\xe2\x7c\x4b\x37\xce" - "\xb7\xb8\xf7\x84\x0f\x81\x7f\xcf\xf9\x96\x2f\x3d\xf0\x7f\x72\x10" - "\xfc\x37\x3f\x28\xcf\xb7\x5c\x7e\xfc\x7f\x39\x04\xfe\xbf\x1c\x04" - "\xff\xc3\x3d\xb7\xd2\x7c\x09\xf1\xdf\x3c\x04\xfe\x9b\xfd\xc0\x7f" - "\x6a\x90\xf2\xff\xcb\x3e\xf8\xff\x52\xc2\x7f\x53\x90\xf8\x3f\xe9" - "\x0f\xfe\xfd\x98\x9f\x69\x45\xfc\x83\xfc\x4f\xdd\xe1\x71\x36\x60" - "\x28\xfc\x7b\xc8\xff\x16\x0f\xfc\xb7\x0e\x82\xff\xaf\x64\xfc\x5f" - "\x01\xf2\xbf\x65\x08\xfc\xb7\x0c\x86\xff\x61\x9e\x8b\xf9\xea\x12" - "\xe2\xff\xab\x21\xf0\xff\x95\x3f\xf8\x0f\x52\xfe\xb7\xf4\xc1\x7f" - "\x8b\x84\xff\x93\x41\xe2\xbf\xd5\x0f\xfc\xfb\x33\x9f\xf3\x4f\x36" - "\x9f\xd3\x8d\xf3\x39\xee\x33\x22\x43\xe0\xdf\x73\x3e\xe7\x6b\x0f" - "\xfc\xff\x73\x10\xfc\x9f\x7a\x50\x9e\xcf\xb9\xfc\xf8\xff\x7a\x08" - "\xfc\x7f\x3d\x08\xfe\x87\x7b\xee\xe6\xd4\x25\xc4\xff\xa9\x21\xf0" - "\x7f\xca\x0f\xfc\xa7\x05\x29\xff\xbf\xee\x83\xff\xaf\x25\xfc\xb7" - "\x06\x89\xff\x7f\x0e\xd3\xfc\x4f\x5b\x33\xce\xff\x88\xea\xd5\x3b" - "\x7a\x4a\xe2\x6c\x62\x41\xc6\xf6\x70\x85\x96\x38\xd5\xe9\xc9\x56" - "\x63\x27\x79\xf4\x2c\xf0\xc4\x70\x96\x3c\x79\x56\x83\xf1\x02\x8b" - "\x29\x8c\xff\xbd\xce\x88\xc2\xe5\xcc\x6b\xaf\xdf\xb4\x92\x28\x5d" - "\x61\x26\x76\xbe\xca\xda\xe2\x20\xd8\xe6\x4c\xa4\xc1\x29\x37\x0d" - "\x70\x0e\x8e\x7e\xa3\xd3\x94\xe5\x40\x9e\x6e\x1b\x69\x06\xbc\xd4" - "\x34\xdb\x80\xf6\x6b\x19\xb6\x90\x17\x50\x9f\x0d\xdb\xce\x10\xa5" - "\xf3\xcb\xc8\x49\xc0\xe3\x88\xd0\x74\xa2\x88\x6a\xa6\x22\xf2\x12" - "\x79\x84\x7c\xd5\xae\xc5\xfd\x4a\x6d\xc7\xeb\x00\xdf\xce\x2f\x75" - "\x93\xca\x20\xdf\xf0\xcf\xcb\xb4\xb1\xf5\x0f\xb8\x67\xd4\x34\x02" - "\x2d\x73\xff\x19\x24\x9f\xda\xfc\x39\xff\xe2\xc7\x3c\xc5\x99\x02" - "\x9c\xa7\x10\xd5\xc6\x68\xff\xf8\x64\xd4\x79\x9d\x69\x1d\x76\x3e" - "\x9d\x89\xf1\x8f\x4f\x67\x9e\xf7\xe6\xd3\x70\xcf\x1f\x9c\x91\xfc" - "\xc1\x9c\x89\xe6\x7c\x3a\xbd\x3c\x38\x3e\x9d\x09\x6a\xff\x6f\xff" - "\xf1\xb4\x7d\x3a\x8e\xa7\x81\x4f\x7e\xf6\x27\x63\xb9\xd7\x19\xdc" - "\x61\xe7\xd3\x37\x87\xfd\xe3\x93\x7d\x5a\x1f\x3e\x0d\xf3\x38\xf7" - "\x1b\x29\x1e\xf4\x37\x35\x9c\x4f\xdf\x44\x04\xc7\x27\xbb\x1f\xe7" - "\x3f\xfc\x19\xf7\x7d\xdb\x88\xe3\x3e\x11\xc6\x7d\xfe\xf1\x29\x55" - "\xe7\x75\x66\x78\xd8\xf9\xf4\x6d\x86\x7f\x7c\xfa\xf6\x88\x37\x9f" - "\x86\x7b\x3c\xf6\xed\x76\xce\xa7\x6f\x8d\x9c\x4f\xf6\xbd\xc1\xf1" - "\xe9\xdb\xd6\xe1\x19\x9f\x74\x6c\xc0\xf1\x09\xf0\xc9\xcf\xfe\x94" - "\x5a\xee\x75\xc6\x79\xd8\xf9\xd4\x11\xed\x1f\x9f\x3a\x32\xfb\xf0" - "\x69\x98\xc7\x0d\x1d\x73\x38\x9f\x3a\xa2\x38\x9f\xda\x97\x04\xc7" - "\xa7\x0e\x9f\xf1\x3f\x03\xb3\xa3\xcf\xc6\xa0\x1d\x2d\x82\x1d\xed" - "\x1f\x9f\xd2\x74\x5e\x67\xb2\x87\x9d\x4f\x9d\x35\xfe\xf1\xe9\xec" - "\x2d\xde\x7c\x1a\x6e\xfb\xb6\xd3\xce\xf9\xd4\x79\x80\xf3\xa9\x53" - "\x1d\x1c\x9f\xce\xfa\xb1\xff\x73\xe0\x73\x58\xfd\x6d\xbe\x73\x0d" - "\x57\x96\xcd\x77\xce\xe4\x1f\xaf\xce\x7d\x7c\x71\x6d\xbe\x73\x25" - "\x9c\x57\xe7\x0c\x9c\x57\x67\xab\x82\xe3\xd5\xb9\xe6\x60\xcf\x6f" - "\xf5\xb7\xfb\x1c\x1b\xae\x2c\xbb\xcf\xe1\xa7\xfc\x73\x64\x5e\x5c" - "\xbb\xcf\x21\xc9\x3f\x87\x24\xff\xba\x82\x94\x7f\x0e\x3f\xe4\xdf" - "\xc0\xe7\xbe\xfa\xdb\x7e\xdd\xb1\x57\x96\xed\x77\xbe\xde\x3f\x5e" - "\x75\x4f\xbd\xb8\xb6\xdf\xf9\x4e\xce\xab\xf3\xd5\x9c\x57\xe7\x35" - "\xc1\xf1\xaa\xdb\x67\xfc\x97\xa1\xce\x8b\xf5\xb7\xff\x7a\xae\x30" - "\xfb\xaf\xc7\x4f\xfb\xaf\xe7\x22\xdb\x7f\x3d\x92\xfd\xd7\x23\xd9" - "\x7f\xdd\x41\xda\x7f\x3d\x41\xd9\x7f\x7d\x78\x25\xf5\x2b\x57\xde" - "\x95\x65\x03\xba\x74\xfe\xf1\xca\xb5\xee\xe2\xda\x80\xae\xb9\x9c" - "\x57\x2e\x2d\xe7\x95\x53\x1f\x1c\xaf\x5c\x3e\xe3\x1f\x0e\x75\x3e" - "\xad\xbf\x1d\x48\xa7\x5f\x59\x76\xa0\xe8\xe7\xf8\x97\x4e\xbb\xb8" - "\x76\xa0\x28\x8d\x7f\x45\x69\xfc\x2b\x06\x39\xfe\xa5\x7e\x8c\x7f" - "\xfd\x98\xf7\x13\x14\x9b\xd1\x06\x74\x15\xac\xde\x11\x0e\xf4\x0f" - "\x37\x11\xa1\x3b\x0a\xf8\xa5\x06\x7e\xad\xd3\x92\x9e\x02\xe0\x97" - "\xdd\x49\x1e\x7d\xf6\x04\xad\x6b\x73\x91\x6e\xe0\xd5\x79\xb0\x03" - "\xad\xf6\x56\x3c\xa3\xf7\xc3\x26\x41\x31\xed\xf1\x67\x35\x04\xf9" - "\x85\xf4\x77\xa9\xda\xeb\x29\xf0\x8b\xf1\x4f\x9d\xa9\x77\x16\x98" - "\xb4\x8f\x9c\x3e\x41\x57\xd9\x28\xad\xd5\x3b\xa0\x4e\xb3\x6c\xb5" - "\xfa\x06\x92\xd8\x4c\x46\x6b\xe7\x03\x5f\x04\x72\x1c\xd3\xad\xf6" - "\x06\x82\x7e\x3f\xd9\x1c\xf8\x09\x5d\x84\xf3\xa8\x4e\x8d\xfe\x9b" - "\xf0\x5c\xa1\xec\xa3\xc9\x7a\x6a\x0b\xe3\x7f\xdf\x39\x55\xc6\xff" - "\xa3\x3a\xcd\xcb\x78\x3e\x71\xb8\x6d\x41\x81\xb0\xf9\x3f\xf1\x44" - "\xe4\x24\xb9\x8e\xab\x96\x53\x0a\x75\x1c\x5f\x07\x26\x3d\xd6\xb3" - "\xae\xd3\x42\xb2\x8c\x44\x53\xd7\xdd\x4a\xcc\x9d\xd4\x5e\x97\xfd" - "\x35\x49\x3c\x8b\xeb\x02\x80\x27\x41\x71\x0b\xe3\xb7\x40\xe6\x89" - "\x27\x74\x93\x6c\x82\x22\xaa\xae\x9e\x90\xf0\x75\x40\x6b\x27\x11" - "\xd8\x79\x4d\x81\xa8\x80\x5e\x7a\x6b\x76\x13\x01\xda\x6d\xb7\x3a" - "\x3f\x43\x7a\xea\xe1\xfd\xcc\xde\xf5\x86\x30\xd3\xab\x98\x86\xb4" - "\xc5\x7d\xa6\x56\x83\x9d\xe5\x91\xdf\x73\xde\x65\x13\xab\xa9\x9b" - "\xd4\x39\x09\x01\x7c\x38\x3f\x4a\x6a\x00\x7c\xd1\xe0\xe4\xb6\xa0" - "\xd8\x3e\x2c\xf3\x95\x42\x48\x27\xda\xad\xae\x02\x63\x34\xaf\xe3" - "\x88\xf6\xa1\xf1\x65\xd4\xb9\xf1\x15\x52\x78\x61\xf8\x0a\xb9\x6f" - "\x78\xf1\x35\xcc\xf6\xab\x10\xa2\xba\x30\x7c\x85\x3c\xcf\xf1\x25" - "\x54\x72\x7c\x85\x64\xb8\xf1\x35\xa2\xfd\xa2\xe1\x4b\x10\x16\x32" - "\x7c\x6d\x14\xa2\x82\xc3\x17\x86\xbe\x1a\x86\x79\x56\x61\xe4\x02" - "\xb4\xb5\x01\x5f\x92\xfc\x1a\xdb\xe4\x07\xbe\x3c\xe4\xd7\x88\xd3" - "\x17\x86\xaf\x11\xa5\xc3\x8c\xaf\xe1\xb5\xb9\x85\x11\xfa\x0b\xc3" - "\xd7\x88\x93\x1c\x5f\x23\x34\x1c\x5f\x23\x1a\xdd\xf8\x1a\xdb\x74" - "\xf1\xf0\xa5\xdc\xcb\xf1\xa5\xcc\x08\x0e\x5f\x23\x93\x87\x65\x7e" - "\x58\x50\xed\xc1\xf1\x81\xab\x20\x55\x92\x5f\xe3\x3e\x19\x1a\x5f" - "\xa9\x1e\xf2\x4b\xf5\xc8\x85\xe1\x6b\x94\x6b\x78\xf1\x35\xcc\xe3" - "\x04\x61\x54\xf5\x85\xe1\x4b\xf5\x20\xc7\xd7\x28\x03\xc7\x97\x6a" - "\xa6\x1b\x5f\xe3\x3e\xb9\x78\xf8\x1a\x15\xc5\xf1\x35\xb2\x31\x38" - "\x7c\xa9\x2c\xc3\x32\xaf\x2d\x8c\x8d\xc0\x31\x0d\xe0\x4b\x92\x5f" - "\xf7\x6c\xf4\x03\x5f\x1e\xf2\x6b\x4c\xc5\x85\xe1\x6b\xcc\x13\xc3" - "\x8c\xaf\xe1\x1d\xdb\x08\x63\x74\x17\x86\xaf\x31\xaf\x71\x7c\x8d" - "\xae\xe7\xf8\x1a\x53\xe2\xc6\xd7\x3d\x1b\x2f\x1e\xbe\x46\x67\x70" - "\x7c\x8d\x9e\x19\x1c\xbe\xc6\x6a\x87\x65\x3e\x5e\x08\x35\xe2\x38" - "\xcc\x55\x90\x26\xc9\xaf\xc7\x67\x0d\x8d\xaf\x34\x0f\xf9\x15\x1a" - "\x7a\x61\xf8\x52\xbf\x33\xbc\xf8\x1a\xe6\xf1\x98\xa0\xce\xbb\x30" - "\x7c\x85\x8e\xe0\xf8\x52\xc7\x72\x7c\xa9\x9d\x6e\x7c\x3d\x3e\xeb" - "\xe2\xe1\x6b\x6c\x23\xc7\xd7\xd8\x92\xe0\xf0\x15\x9a\x3d\x6c\xeb" - "\x08\x42\x78\xc3\x85\x8d\x21\xc3\x9f\xbd\x30\x8c\x85\xdf\x78\x65" - "\x8f\x21\xc3\xda\x2e\x0c\x63\xe1\xcb\x38\xc6\xc2\x36\x73\x8c\x85" - "\x27\x5f\x92\x31\xa4\x10\x16\xcf\x31\x16\x46\x82\xc3\x58\xf8\xf0" - "\xad\x7f\x08\xe3\x67\x5e\xd8\x38\x72\xdc\x91\x0b\xc3\xd8\xb8\xe7" - "\xaf\xec\x71\xe4\xb8\x79\x17\x86\xb1\x71\xb5\x1c\x63\x1a\x07\xc7" - "\xd8\xb8\x03\x97\x66\x1c\xa9\xd9\xc1\x31\xa6\x09\x6e\xdd\x46\x18" - "\x1f\xd4\xf9\x97\x01\xd7\x6d\x84\x88\xed\x17\x36\x96\x8c\xf8\xc1" - "\x85\x61\xec\x9a\xaf\xaf\xec\xb1\xe4\x35\x7b\x2e\x0c\x63\x11\x77" - "\x71\x8c\x5d\xb3\x90\x63\x2c\x42\x77\x69\xc6\x92\xd7\xa8\x38\xc6" - "\xc6\x57\x07\x87\xb1\x88\x5d\xc3\xb6\xde\x24\x5c\xa7\xbc\xb0\xf1" - "\xe4\x84\xd2\x0b\xc3\xd8\x84\x47\xae\xec\xf1\xe4\x84\xc8\x0b\xc3" - "\xd8\x84\xdf\x71\x8c\x5d\x6b\xe1\x18\x9b\x50\x70\x69\xc6\x93\xd7" - "\x2e\xe7\x18\xbb\x36\x26\x38\x8c\x5d\xe7\x87\xff\x7f\x3f\xd7\xc9" - "\x84\x89\xfa\x0b\x1b\x53\x4e\x54\x5c\x18\xc6\x22\xdf\xb8\xb2\xc7" - "\x94\x91\x19\x17\x86\xb1\xc8\xf3\x1c\x63\x91\xd1\x1c\x63\x91\xf6" - "\x4b\x33\xa6\xbc\xae\x9e\x63\xec\xba\xe2\xe0\x30\x36\xd1\x38\x6c" - "\xeb\x7b\xc2\xf5\x35\x17\x36\xae\xbc\x7e\xe9\x85\x61\xec\xfa\x6b" - "\xaf\xec\x71\xe5\x24\xdb\x85\x61\xec\xfa\x27\x38\xc6\x26\xe5\x71" - "\x8c\x5d\xbf\xe0\xd2\x8c\x2b\x27\x4d\xe7\x18\x9b\x18\x9c\x3f\x0a" - "\xe1\xfa\x7e\xfe\xaf\x96\xad\x4c\x5b\xbc\x7c\xd9\x12\xed\xb2\x95" - "\xc6\x94\x67\xb5\xab\x97\xad\x5d\x7a\xdf\x2d\xa9\x31\xda\x14\x93" - "\x36\x65\xd9\xca\x5f\x48\x09\x4b\xc6\x90\xf9\x4b\x97\x2f\x36\x61" - "\x0a\xe4\xfe\xc5\xca\x15\x4b\x57\x1a\xb5\x29\x4b\x9f\x4d\x5d\x96" - "\xb2\x14\x7f\xaf\xd6\x3e\xb3\x2a\x05\x12\x9e\x5e\xba\x2c\x6d\xa9" - "\xf6\xa9\xd4\x67\x9e\x59\x9a\xb2\x7a\x0c\x79\x24\x75\xb9\x71\x99" - "\x61\xf9\x52\xed\xec\x47\x1e\x98\xb6\xe0\xc1\x9f\x2c\xb8\xff\x7e" - "\x0c\x4e\xe6\x11\x9b\x2c\x8a\x16\x64\x26\x03\xe6\x94\x2d\x42\xf4" - "\xdb\x75\xa0\x5d\x30\x9e\xed\xa6\x76\xa2\xd9\x98\x42\x94\xf9\xed" - "\x44\x55\xd8\x4e\xd4\xda\x5f\x92\x78\x9a\xff\x67\x4b\x51\x3b\x89" - "\xa0\x45\xb3\x5a\xc5\x7c\x3b\xa1\xf9\xf6\x78\xfb\xe8\x86\x06\x48" - "\xd3\x88\xf9\x47\x1d\xf0\x9f\x08\xa0\xad\x92\xe6\xb7\x57\x36\x09" - "\xd1\x26\xfb\xe8\x63\xd5\x59\x5f\x13\x81\x8e\x99\xac\xda\x2d\xda" - "\x85\x7d\xd8\xbb\xa0\xed\x44\x98\xa2\x85\x4b\x0d\xd7\x5e\xb8\x6a" - "\xe0\x6a\x20\xc2\x0d\x04\x2e\x15\x5c\x51\x70\xe9\xe0\x9a\x0e\xd7" - "\x4c\xb8\x66\xc3\x35\x17\xae\x05\x70\xd5\xc3\x65\x27\x82\x16\xf2" - "\x6a\x23\x79\x39\xda\x68\xb8\xe6\xc1\x05\xa3\x6a\x6d\x31\x11\x6e" - "\x84\xfc\x37\x2e\x81\xab\x19\xae\x0c\xb8\xf2\xe0\xc2\xf4\x3d\x70" - "\xc1\xff\xb5\x3a\xfe\xee\xa6\x02\xb8\xaa\x09\xd4\x73\xe8\xeb\xa6" - "\x56\xb8\xe0\xbb\x37\x47\xc0\x65\x84\x0b\xea\x1b\xad\x1b\xe4\x3f" - "\x86\x21\xca\x2c\x0e\x5f\x77\x83\x8d\xc5\xc0\x13\xa6\x64\xd2\x1c" - "\x12\x42\xf3\x8f\x55\x1b\x6e\x23\x8a\x53\xc2\x94\x87\xac\x1b\x40" - "\xce\xa8\xec\x3c\xa6\x23\x3c\x23\xcd\xba\x36\x4e\x99\x63\x23\xcf" - "\x94\x63\x4c\xb3\xc0\xf0\x36\x65\x8e\xf4\xff\x3c\x1b\x71\x6e\x67" - "\x31\xe0\x36\x56\x54\xd1\xac\xa4\x97\x59\xec\x37\xa0\x21\x9e\xcb" - "\xa2\x79\x15\xd3\xa9\x6a\xa7\x0d\xfb\xbc\x65\x2d\xab\xd7\x8d\xbc" - "\x7f\xc1\x7b\xa8\x9b\x3d\x74\x16\xc6\xb9\x54\xe2\x33\xcd\x6f\x68" - "\xe8\x0e\xcd\x88\xc7\xdf\xe7\x4b\xe3\x0c\xb4\x20\x03\xfb\x94\x60" - "\x31\xbf\x4a\x9a\xe0\x7f\xdd\xa1\x66\x95\x76\x7e\x38\x6d\xe2\x65" - "\x0b\x90\x6f\x8f\x5c\x56\x77\xe8\x2c\x3b\xdd\x62\x8e\xa5\x85\x80" - "\x21\xa9\x3c\x11\xca\xa3\x05\x26\x8d\x4d\xb8\x41\x83\xe9\xb4\x24" - "\x2e\x4f\xfe\x0d\x77\x35\x2d\xca\x28\xc7\x7b\xf8\x3a\xd2\xc9\x9e" - "\x73\xe2\x09\xbf\x6b\x08\xca\xba\x36\xe1\x86\xb7\xee\xac\x27\x0a" - "\xcb\x7c\xac\xf7\x0d\xd9\x59\xf5\x54\xd4\x9a\x43\xe0\xfb\x37\xac" - "\xeb\xfd\xee\x44\xb3\x0e\x63\xa4\x8a\x1b\xa3\x22\x31\x06\x1f\xfe" - "\x17\xeb\xf6\xd2\x78\xa2\xdc\xf6\xdf\x44\x85\x6d\xec\xda\x78\xc3" - "\x2e\x39\x0e\x1d\xfe\x47\x80\xfc\x0f\xff\x38\x8b\x7a\x94\xbd\x86" - "\xf2\xf6\x44\x71\x9a\xde\xd0\x68\x23\xdd\x1b\x30\xbf\xf6\x26\x46" - "\xcb\x1b\xa5\xf7\x5a\xe4\x27\x96\x2f\x16\x66\x26\xe3\x33\xc6\xb9" - "\x0b\x47\xf4\x99\xa3\xab\x38\x8d\x32\xf4\x58\x0e\xe6\x17\x8b\xd2" - "\xf1\xb7\x45\x84\xf6\xba\x72\x88\x4e\xbb\x92\xc4\x37\x09\xda\x87" - "\x5c\xf9\xbb\x0d\xf0\x1e\xfa\xdd\x6e\x23\xe4\xcf\x66\xf4\x2e\x34" - "\x41\xdb\xb5\x33\xe1\x9d\xb1\x37\xf6\x25\xa7\xb3\x42\xcc\xdf\xbd" - "\xa1\x6b\xa3\xd6\x60\x53\x8c\x2b\x90\xdb\xc0\x64\x9c\x3b\x9f\xc4" - "\x53\xed\x12\xfb\xe8\xdd\x1b\x7a\xd2\x68\xfd\xa6\xcf\x08\x81\x6f" - "\xd2\xee\x73\xb4\x26\x63\x1e\x75\x14\xfd\x27\x21\x35\xc9\x8d\x24" - "\x6b\x31\x89\x1a\xbb\x8e\xda\x13\x5d\x24\x7c\x6c\x63\x38\xad\x9d" - "\xd7\x08\x32\xfa\x2c\xc9\xa8\xa7\xad\x75\x86\xbd\x24\xe3\x24\x51" - "\x67\x2e\x23\x11\x59\xf3\xa8\xdd\x5c\x43\x1d\x56\x53\x23\xa9\xeb" - "\x84\xcb\x50\x0b\xf9\x8e\xc0\xb5\x97\x64\xad\x21\xca\x47\x41\x9e" - "\x9a\xcf\x12\x75\x9d\xe1\x2c\xa4\x9d\x26\x19\xc9\xd4\x59\x5b\x83" - "\xf9\x0e\x92\x44\xa7\x3d\x3c\xf3\x34\x51\x96\xfd\x27\x9e\x2d\x3b" - "\x4e\xb6\x41\x5d\xba\x47\xdb\x63\xcf\xe7\xb7\x57\x75\xa4\x51\x67" - "\xd7\xc6\x1b\x67\xda\xc8\xdd\x06\xaf\xb6\x60\x9d\x31\x6e\x28\xb4" - "\x17\xf3\x88\x85\xe9\xad\x8b\x9c\x88\xf3\x1b\x63\x41\x16\x13\xf9" - "\x3d\xbe\xb3\x87\xa6\x03\x7e\x6e\x5c\x98\xe8\xa4\x5d\x98\x1f\xdb" - "\x0d\x34\xca\x96\xda\x9f\x1d\x62\x20\x4a\xf8\xc6\x76\x9b\x22\x42" - "\xef\xc1\x43\xe4\xc9\x48\xf9\x7b\x52\x9e\x03\x36\xc5\x78\x16\x7b" - "\x51\xe4\xef\x76\x61\x5e\x48\x6f\xb4\x29\xae\xa9\xe2\xf5\xbb\x71" - "\x07\xa6\x49\xb2\x14\xcb\xd9\x23\x62\xbf\xce\xdb\xb9\xc7\x15\x9a" - "\x61\xa0\x02\x75\xd0\xc2\x04\x15\xed\x88\x54\x3f\xea\xa4\x0e\xa8" - "\x37\xca\x58\x35\xc6\x49\xe5\xf9\x6f\x4a\x85\xf7\x1a\x6d\x1a\xfb" - "\xfd\x04\x7e\x47\x2c\x8d\x4b\x46\xd9\x9a\x58\x8f\xf9\x13\x92\x8b" - "\x52\x40\xf6\x16\x02\x05\xa1\xdf\x88\xa1\xa6\xc8\xf3\x5b\xcd\x1a" - "\xec\xdf\x14\x30\x46\x0b\x12\x34\xbd\xe5\xe4\x90\x11\x36\xe1\xa6" - "\xe9\x14\xfe\x4f\x0b\xd2\xa5\xf2\xa7\x4c\xe6\xd8\xbc\x29\x16\xfb" - "\x1d\xd4\xab\x0a\xd2\x47\x34\x09\x37\xed\xc5\x33\x9a\xf0\x6c\x67" - "\xb1\x24\x85\x9b\xf6\x71\xcc\xec\xdc\xe3\xf5\x2c\x20\xfd\xa0\x4f" - "\x82\x1c\xe0\xf6\xc5\x4d\x5f\xb8\xfb\x05\xc7\x31\xef\xdf\xe9\x50" - "\x27\x6d\x94\x98\x13\x22\x42\x3e\x45\x13\xa7\x83\xd0\x3d\x7a\xb7" - "\xa9\x6b\xe3\xcd\x6a\x1b\x39\xab\xf3\xe2\xe7\xc6\xdf\x37\x60\xdc" - "\x4a\xa8\x4b\x48\x8b\x70\xf3\x0f\xe0\x3e\x0a\xee\xf7\xed\xaf\x47" - "\x5d\xcb\xca\x1d\x8b\xbf\x5f\x9a\x40\xed\xb3\x1f\x21\x18\xa3\x12" - "\xe8\x7e\xf3\x02\x1b\xf9\x59\x33\x96\xb3\x11\x63\x77\x42\x1a\xe6" - "\x81\xf4\xe5\x36\xf2\xf3\xc3\xbc\xfc\x1b\x34\x9d\x28\xb3\xbc\xcb" - "\xff\x0d\x2f\x9f\x97\x8b\xe5\xc9\x65\x97\xbe\x40\xdb\xa4\xb2\x2b" - "\xe5\xb2\x0b\x21\x4d\x2e\x7f\xf6\x8a\xde\x6f\xd4\xc3\x37\x16\x7a" - "\xb6\x61\xeb\x0b\xb4\x13\xcb\x80\x77\x6d\x36\xb2\x78\x17\xbe\xcb" - "\x87\x34\xfc\xaf\x07\xa6\x42\xf6\xcf\x83\x32\x6a\xb0\x8c\xe8\x08" - "\x1b\x49\x9e\xee\x29\x37\x80\x46\xa1\xb2\xac\xe5\x65\x45\xcf\x90" - "\xcb\xf2\x28\x47\xc2\xd4\x9f\x64\x8c\x61\xb9\x6a\x2c\x17\xf2\xeb" - "\x6d\x64\xa1\xc9\xb3\xed\x92\xec\x34\x41\x1e\x85\x94\xff\x21\x94" - "\x4b\x72\xbd\x31\x76\x27\xdd\x18\x15\x8f\x7d\x03\x64\x20\x01\x4c" - "\xe2\x77\x2b\xfb\xc8\x40\x25\xe6\x03\xb9\x99\xca\x62\x97\x4e\xa0" - "\xad\x90\xe7\xb0\x57\xbc\x4e\x81\xc4\x41\x5a\xab\x1c\x37\xb4\x08" - "\xf2\xd8\x84\x28\x9f\x7e\x11\xcd\x37\x12\xc1\x5a\x62\x43\x9b\x14" - "\x71\x35\xd3\x1a\xd5\x49\xac\x25\x22\x11\xcb\xe2\x8a\xe3\xcd\xd4" - "\xd2\x22\xdc\xb2\x14\xe3\x3d\x07\xa6\xe7\x6e\x61\xf1\x1f\x69\x37" - "\xd8\x6a\x19\xdf\x27\xa8\xdb\xce\x08\xb7\xfe\xce\x6a\x6f\x67\xf8" - "\x87\xdf\x4c\x17\xfc\x16\x6c\x3b\xb4\xef\xc0\xa6\xd6\x17\x0b\xdc" - "\xc6\x13\x21\x6f\x19\xa6\xa3\xfd\x07\xb6\xe7\x36\x8f\x77\xb4\x2c" - "\x6e\x0e\xa7\xdd\xad\x8f\x20\x1d\x59\x7d\x9d\xff\x61\xc1\x3a\x8b" - "\x25\x71\x73\xb0\x0d\x59\x26\x2a\x5a\x9d\x5d\x16\x8c\xa7\xab\x4d" - "\x43\xdb\xf4\xd6\xa9\x89\xa5\x84\x42\xff\x9d\x13\x60\x1b\xd8\xfe" - "\x5f\xb0\xbf\xcf\xd8\x27\xc7\xcd\xc1\xf8\xc9\x9b\xcc\x23\x54\x09" - "\x25\xd4\xd2\x31\x25\xae\xb8\x6b\xe3\xad\x73\xe5\xf8\xb4\x81\x95" - "\x7b\xeb\x5c\xb9\xed\x65\x52\xdb\xe1\x5b\x6c\xce\xe6\xce\x2d\x2c" - "\x3e\x36\x3c\xdf\xba\xc1\x17\xbf\x40\x86\x98\xf0\xbf\xd0\xf6\xf8" - "\x6d\x32\x9d\x9c\x76\x8c\x0d\x3e\xee\x94\xf0\xbd\x89\x89\x19\x16" - "\xc2\x7c\xe1\x17\xa6\x9b\x02\xac\x17\x9b\xff\xae\x03\xdb\x3f\xd1" - "\xf9\x1e\xe5\xb2\xef\x7b\x0f\x3c\x2a\x95\x87\xef\x64\x5e\x95\x49" - "\x36\x79\xe0\xdf\xf8\x9e\xcf\xf9\x4f\x8f\x76\x69\x06\x68\xd7\xb7" - "\xc1\xb7\xeb\x7b\x7b\xfb\xb7\x4b\x37\x71\x78\xdb\xa5\xf3\xb9\xfe" - "\xe9\xd1\x2e\x6d\xff\x76\xe9\x3e\x0c\xbe\x5d\xba\xcd\x03\xb4\xeb" - "\xdb\x61\x6e\x97\xc3\x8f\x76\xc5\xf6\x6f\xd7\xd4\x57\x82\x6f\xd7" - "\xd4\xe5\xfd\xdb\x35\xf5\xc3\xe1\x6d\xd7\x54\x9f\xf1\xcf\x7c\xca" - "\xc3\xa2\x0c\x0b\x97\x87\xb7\xa5\x06\x2e\x0f\x6f\x8b\xef\x2f\x0f" - "\x6f\x7f\xcd\x2d\x0f\x6f\xff\x4d\x50\xf2\xb0\x28\x41\xb2\x27\x6e" - "\x7f\xa2\x9f\x3c\x2c\x48\x20\x03\xcb\xc3\xdb\x7f\xc0\xe4\x61\x61" - "\x42\x80\x6d\xb8\x5d\xd9\x2b\x0f\x43\x13\x88\x97\x3c\x0c\xcb\xb0" - "\x74\x6d\xbc\x7d\x61\x70\xf2\xf0\xf6\x85\xfd\xe5\xe1\x6d\x7b\xbd" - "\xe5\xe1\xed\x3e\xf7\x7a\x03\x0e\x1d\x03\xc9\xc3\x44\xe7\x37\x54" - "\xc2\x86\x23\xc0\xfa\xb4\x0d\xf2\xad\xec\x21\xbe\x95\x1d\xd8\xb7" - "\x62\x92\x7c\x7e\x4b\xb5\xf3\x30\xd8\x19\x9a\xcc\x57\x88\xd0\x02" - "\x23\xe7\xba\xa8\x06\x62\x35\x39\xc8\x1d\x06\xc0\x44\x0e\x99\x59" - "\x57\xd2\x46\xea\xa2\x5a\x08\x1d\xbd\xf3\x30\xfd\xfd\xfd\x24\x3e" - "\x05\xb1\x39\x6d\x9c\xd5\xe8\x08\x90\xaf\x31\x8d\x32\x36\xeb\x9c" - "\x80\xcd\x34\xc4\xe3\x1d\x0f\x58\xdb\x4e\x49\xd8\xbc\x63\x5a\x2f" - "\x7f\x72\x38\x3e\x07\xc4\x26\xf4\x09\x6f\x6c\xa6\x1b\x38\x36\xa7" - "\x9d\xef\x8f\xcd\x74\xc3\xc0\xd8\x9c\x76\x84\x63\x33\xdd\x10\x58" - "\x1b\xa6\x6d\x77\x63\x33\xdd\xe0\x85\xcd\x5b\xef\x07\x7b\x6c\x9a" - "\x23\x38\x6c\x4e\x73\xc8\x6d\x2f\x95\xda\x0e\x69\x49\xde\xd8\xbc" - "\xc3\x67\xac\x6b\x8c\xbf\x0e\xf2\x50\x7d\x4a\xb8\x93\xb8\xc0\x6e" - "\x15\xf3\x8e\xb7\x26\xba\x68\x17\xc6\x61\xa7\xc2\x74\x42\xd3\x75" - "\xea\x2e\x18\x53\x76\x75\xe9\x55\x74\xcc\xce\x67\x68\x4f\x24\xf6" - "\xab\x70\xda\xa5\x0b\x03\x9a\x45\xc3\x7d\x7c\x69\x1a\x89\x80\x2b" - "\xb2\x54\xa2\x2b\xfc\x8e\xa5\xe9\x91\x63\x8a\xd2\x48\x4c\x78\x27" - "\x51\x41\x1d\x92\xc2\xd7\x69\x08\x8c\xf9\x23\xf0\x37\xcd\xd9\x4a" - "\xb6\x9d\x23\x4a\x9c\x4f\x14\x47\xc3\xf7\x4c\xe1\x94\xae\xd6\x91" - "\x6d\x29\x50\x1f\x81\x44\x6e\x13\x68\xa5\x2b\x5d\x27\xd0\xb0\x8c" - "\xe7\xe8\x73\x49\xac\x4e\x62\xf4\xfd\xf1\x80\xa1\x78\x9a\xa5\xc7" - "\xef\xc6\x63\x3c\x60\x7a\xeb\xfd\xb3\x69\x57\xe4\x98\xc2\x73\x24" - "\x66\x5b\x1a\x89\x2e\x4b\x23\x3a\xda\xa3\x13\x80\x06\x49\x4f\x3e" - "\xab\x41\xbe\x27\x51\x01\xbe\x95\x06\xdf\x02\x5e\xba\xf2\xe1\x5b" - "\x4e\xf8\xd6\x37\xf0\xad\x33\xf0\xad\x1c\xf8\x56\x0e\xff\x56\x60" - "\x34\xbf\x73\xf9\x60\xf3\xbe\x89\x99\x53\xd0\x3f\xed\x57\xe1\xa6" - "\x51\x73\x70\x0e\xb8\xe3\x39\x7d\x80\x78\xbf\xb3\xc6\x57\xf9\x9b" - "\x76\x93\x28\xaa\x3a\xda\xfa\xe8\xf3\x27\x68\xa2\x93\x90\xe7\x77" - "\x93\x18\xec\x73\x75\x8e\xd3\xd0\xcf\x8e\xb6\x1e\xd4\xb5\x05\xf8" - "\xad\x58\x9f\xe7\x5f\x37\xe6\xd0\x7a\x51\x0d\x63\x51\x75\x46\xde" - "\xa6\x1c\x6a\xea\x89\x8a\x4b\xee\x8e\x8a\xcb\x5e\xe4\xd4\x00\xae" - "\xa8\x49\x9b\x42\xb4\x2d\xc2\x3d\x99\x87\x0e\x83\x8e\xf8\x39\x51" - "\x35\x09\xf7\xec\xc9\x3a\x86\xf3\x77\xb1\xd5\xde\xf3\x77\xb1\x6d" - "\x44\xf8\xfe\x42\x22\xfc\xbf\xe5\x44\x98\x5e\x4c\x20\x9f\xf7\x75" - "\xf7\x2e\x5e\xd6\xf7\x7f\x90\xf8\x87\x29\xc4\xec\xa4\x5f\xc1\xf8" - "\x34\xa9\x08\xc6\xc0\x89\x53\x15\x36\x4b\x1a\xce\x6b\x7d\xff\x2e" - "\xa0\xe9\x3f\x41\x2f\x85\xb7\x08\x77\xb9\x80\x77\xc4\x90\x42\xae" - "\x39\x25\xdc\xe5\x74\xc2\xef\xf0\xce\x51\x73\x5c\x59\x49\xc4\x19" - "\x69\xd6\xf4\x14\x64\x24\xbb\x60\x1c\x2b\xaa\x8e\xb7\x66\x7d\x4d" - "\xa2\xac\x6d\x2e\x52\x02\xb8\x5b\xe4\x52\x61\x7f\x48\xb2\x3c\x75" - "\x88\xb4\x18\x89\x90\x75\x96\x84\xd2\x0e\x9d\x5a\xc6\xf5\x23\x6d" - "\xe1\x8e\xcc\x36\x2a\x22\xbe\x71\x7e\x01\xde\x85\x99\xcf\x82\xae" - "\xb5\xb7\x92\x12\x18\x4b\xbb\x56\xeb\xc7\xdb\x3b\xf4\xd7\xbc\x2c" - "\x92\x88\xb0\x4e\xa2\x29\x69\x07\x0c\xae\x06\xfc\xb5\x03\xce\xed" - "\x1c\xe7\x78\xfe\xa6\x0c\x31\x9e\xbb\xbb\x6a\x5b\x3b\xc7\x38\xc3" - "\x1d\x62\x7c\x15\xe0\x6e\xa5\x1b\x77\xce\x0e\xc0\xf8\xc6\x3b\x77" - "\x95\xe4\x50\x92\xb9\x8c\x08\xdb\x4e\x8d\xc2\x77\x8a\x11\x53\x05" - "\xed\xa1\x79\x0e\xe2\x1e\x87\xdd\xf3\x56\xf7\xe4\xb8\x6c\xed\x7c" - "\xfa\x4d\x93\xf0\x7d\x1d\xa4\xab\xb4\xff\xf9\x3d\x0d\xd0\xfb\x2d" - "\x3e\x3f\x73\xcf\x1e\x1c\xbb\xdb\x80\x16\x48\x17\x18\x47\x7f\xaf" - "\x49\x88\x75\x21\x1d\xd3\xcb\x49\x88\x21\x8e\x36\x03\xfd\x94\x94" - "\xcd\x69\xc4\x3a\xd9\x3c\xf5\x3a\x2d\xf9\x88\xcd\x27\xf2\xff\xb8" - "\x80\x6e\x4e\x75\x82\x06\xf8\x6d\xb2\xfc\xb2\x9b\xf5\x39\xa4\x63" - "\x0b\x70\x6c\x11\x70\x0f\x68\x12\x0a\x7d\x1d\x65\xc1\x3c\x26\x0b" - "\xf2\x76\x26\x67\xd8\xa8\x98\xb8\x24\x84\x9a\x9f\xc5\xf5\x0c\x17" - "\xf9\xff\xd9\x7b\x1f\xb8\xa8\xab\x74\x71\xf8\x99\x61\xd0\x81\x50" - "\xd0\xa8\xd8\x56\x6b\x34\x6a\xb1\xfc\x43\x86\x65\x2e\x16\x25\x16" - "\x96\x7f\x28\xad\x28\x4d\x31\xc1\x86\x22\x1c\x61\xc0\x51\x81\x19" - "\x47\x6c\x81\x10\xd8\x22\x97\x0a\x85\xbd\xeb\x7e\x5e\x77\xaf\x6d" - "\xb6\x51\xcb\xbd\xd7\xdd\xd8\x85\xf6\xc7\xee\x02\x83\xfb\xba\xef" - "\x65\xf7\xb5\xbb\x93\x97\x75\xc9\x45\x9d\x62\x8c\x11\x66\xe6\xbc" - "\xcf\x73\xce\xf7\xcb\x7c\x67\x98\x41\x74\xdb\xfb\xfb\x6d\x6f\xd4" - "\x38\xf3\x3d\xe7\x39\xcf\x79\xce\xf3\xef\x3c\xe7\x7c\xcf\x9f\x8d" - "\x06\x60\x25\xe7\x90\x5f\xce\x5e\xf2\x1b\x53\xbd\x3b\x84\x6f\x20" - "\x7e\x4d\x19\x80\x18\x56\xf9\x47\xfb\x4f\x4a\x3b\xc2\x3d\xa8\xbf" - "\xe4\x1f\xa2\xf7\xa8\x22\xd0\x2e\xa7\x56\x91\xfd\xa2\x3d\x47\xef" - "\xe1\xfe\x2a\xa3\x01\xed\xd6\xbd\x23\x61\xf6\xc8\x8e\x04\x1d\x7e" - "\x6e\x92\x7d\x08\xdd\xa3\x75\x90\x78\x5b\x99\x18\x4b\xfe\xc3\x66" - "\xb2\x83\x1b\x79\x3b\x95\xfa\x9b\x1d\x09\x33\x38\x8f\x9f\x4f\x80" - "\x05\x2e\x50\x21\x4d\x31\x48\x2f\x34\x6e\x05\x6d\x97\xfe\x34\x78" - "\xd0\x36\x64\xbe\xaf\xca\xd1\x01\xe2\x55\x7f\x94\xf0\x07\x90\x78" - "\xa6\x0a\xad\x77\x49\x15\x3e\xbd\x4b\xaa\x20\xde\x09\xbd\x4b\x2a" - "\xff\x2a\xea\xdd\xef\x32\xb8\xde\x85\x8d\xcc\x24\x7d\x5a\xa8\xb1" - "\xb9\x7f\x8a\x3c\x4a\x32\x92\x8e\x90\xce\xfc\xe6\xc7\xa4\x33\x8b" - "\x1a\xfe\x4f\xd5\x99\x4b\x43\x09\x3a\xfc\xfc\x43\x74\x06\xf1\x72" - "\x9d\x21\x5e\xfd\x2e\x63\x18\x64\x1e\x71\x5b\x2d\xff\xcf\x7e\x9d" - "\x19\xee\x47\x5b\x6d\x8e\xde\x73\x13\x74\x71\x3e\xdd\xdd\xac\x7b" - "\x92\x79\x4f\xab\x17\xfd\xc1\x7c\x02\x62\x86\xad\x8c\xd9\xdc\x6f" - "\x83\x37\xca\x14\xc7\xe7\xb3\xab\x96\x65\xd2\xbb\x11\x7a\x2f\x42" - "\x73\x74\xd1\x06\x7a\x17\xd2\xdb\xeb\xd9\x5f\x92\x49\xef\x47\x58" - "\xc4\xe7\xc7\x3c\x68\xd7\xde\x8a\x9f\xb5\x7a\x23\x1c\x18\x23\xdc" - "\x3d\xc3\x0e\xcd\x62\x4e\xbe\xaa\x98\x62\x17\xf2\xbf\x7c\xbd\x37" - "\xbd\x3b\xc1\xfc\x64\x79\xce\x9f\x7c\x82\x34\x2f\x27\xcd\xdb\xdd" - "\x4d\x32\x8c\xa4\x79\x3b\xc9\xa7\xcc\x93\xe7\xed\xe4\x67\xca\xc7" - "\x72\x89\x34\xe7\xa3\x28\x77\x54\x82\x93\xca\x25\xbe\x4b\xbe\xde" - "\x57\x4e\x3c\xa3\x5f\x39\x3a\xa2\x06\x6d\xd0\x18\x23\xaa\x24\x13" - "\xed\x47\x73\x46\x7d\xcf\xbb\xf8\xad\xc6\xef\x55\xf8\x1d\x86\xdf" - "\xfc\xde\xb6\x2b\xeb\xaf\xee\x96\xee\x3f\x2e\x3e\x2a\xd1\xfd\x29" - "\xb7\xc9\xdb\x61\xca\x59\xe9\xf7\x50\xe5\x3d\xa9\xf2\xbb\x8b\x51" - "\x78\x9f\x7c\xec\x54\x37\xca\x48\x23\xde\xa7\x88\x67\x05\xbe\x4f" - "\xf8\x33\x68\x66\xe0\xd8\x45\x47\xef\x3d\x51\x7f\x55\x43\x4c\x7f" - "\x9f\xf4\xbd\x94\xbf\x7f\x41\x19\x51\xbc\x26\xf9\xdf\x7e\xa9\xde" - "\xe3\xc8\x07\x93\xb2\xde\x60\xfc\xb0\xab\xef\x09\x79\xa7\xcd\x95" - "\xf1\xe2\x9e\x90\xf7\x1f\x2e\x4f\xf0\xb0\x2b\xc3\xb5\x38\x25\x64" - "\x8c\x38\xe3\xbe\x94\x35\x47\x3c\xad\xde\x91\x8c\xe8\x8f\x8a\xcf" - "\x5d\x61\x7c\xb1\x38\xe4\xf9\x4f\x9e\x28\x53\xa2\xbb\xe1\x3e\xd2" - "\xfd\xa8\xee\x23\x6e\xf8\xd1\xd9\x7e\xf5\x9a\x39\x37\xc1\x94\x3e" - "\x88\xa1\xf8\x69\xd5\xc0\x87\x8c\x62\xa8\xea\xb3\x10\x3f\x7c\x21" - "\x23\x7a\x04\x63\xc1\x57\xce\x42\xb2\xf7\xf9\xb8\xc8\xaa\xad\xa0" - "\x19\xc6\x78\x75\xf8\x79\x7d\xf4\xef\x4e\xf5\x03\xda\x49\x4a\xb7" - "\xd3\x0e\x87\x10\x96\xfd\x35\x63\xea\x8a\x4c\xe6\xea\xcc\x7c\x15" - "\xd6\x24\x78\x5a\x4b\x3f\x81\x29\xe8\x8b\x62\x6c\xa6\xb7\xf9\x3b" - "\x85\xf0\x9d\x6a\x9d\xcd\xfd\x17\xd8\xbf\x15\x7d\x18\xfa\x2c\xf3" - "\xd3\xe8\xab\xdd\x17\xe1\x2d\xa5\xaf\x7e\xe1\x5f\x7c\xbe\xfa\x02" - "\xfa\xea\x4a\xf4\xd5\xe6\x38\xe8\x36\xb4\x02\xfa\x8e\xc9\xab\x0d" - "\xd1\xae\x52\x03\xfa\xec\x9d\xe8\xb3\x4d\x7f\x01\xee\xaf\x07\xfa" - "\x01\x7d\xed\xd4\x83\x79\x10\x3b\xb2\x0d\x7d\xf6\x05\xfd\xb5\x6f" - "\x94\x0a\x9f\xfd\x66\x1e\xfa\xec\x6d\x18\x13\xe7\xa1\xcf\x1e\x08" - "\xe2\xb3\xcf\x87\x88\x87\x25\xff\x33\xbc\x2d\x41\xfd\xa6\x9a\xc1" - "\xee\xa7\x41\xfd\xc6\x9f\x26\x5f\xa1\x9e\x2c\x99\x11\x4a\x06\xc4" - "\x6f\xe2\xbf\x17\xe5\xd0\x85\x32\xe0\x71\xab\x6b\x72\xda\x08\xf6" - "\x69\x9e\xa9\x05\x96\x1f\x9f\xed\x55\x4f\x35\x42\xcc\x6a\xc3\x87" - "\x6c\xb8\x20\x03\xe3\xfe\x8c\x29\xee\x2a\x53\x62\x15\xc6\xd4\x1e" - "\x8c\xbd\x47\x86\xe2\xb4\xc8\x83\x18\xc7\x0e\x7d\x34\xf1\xd0\x3b" - "\x13\xe5\x39\x69\x46\x12\xfa\xd0\xa4\x83\x5b\x61\xf1\xc8\xfe\x82" - "\xa3\x6c\x7f\x41\x93\x67\x7f\xc1\x61\x2c\x3b\xf5\x51\x3b\xc9\xe5" - "\xdf\x01\xd3\x5a\x59\x75\x91\xc5\x33\xc5\x94\xe8\x98\x52\x70\x04" - "\x9f\x5b\x28\xbf\x74\x33\x4c\x59\x93\x70\xa9\x55\xc8\xeb\x87\x40" - "\x72\x12\xf2\xfa\x18\xf6\xe3\xb8\x8f\xfa\x5c\xde\xbf\x4a\x32\xc3" - "\xf1\x02\x8f\xf7\x7d\x72\x0b\xe8\x63\x25\xb9\x75\x0d\xb4\x02\xf6" - "\x27\x93\x47\xfb\x5a\x2e\xb7\x8f\x41\xee\x67\x91\xdf\x53\x0f\x62" - "\x5f\x3b\xf2\x65\xf5\xb5\xd2\x38\x86\xfa\x5a\xea\x67\x49\x6e\x6f" - "\x5e\xb1\xdc\xbe\x7d\xf2\xea\xe4\x66\x84\xab\x94\x5b\x95\x4f\x6e" - "\xc6\xb9\x6c\xbf\x51\xe7\xd9\x6f\x8c\xf7\x97\x9b\x31\xc5\x27\x37" - "\x63\x02\x3e\x2f\xf6\xc9\xed\xe2\x15\xc8\x2d\xfc\xf3\xaf\xae\xdc" - "\x96\x56\x5d\xa5\xdc\xae\xd6\xde\xfa\x14\x72\x43\x7b\x33\xa2\xbd" - "\x19\x03\xec\xcd\xa8\xb0\x37\x23\xda\x9b\x51\x61\x6f\xe7\xae\x40" - "\x6e\xd7\x9c\xfe\xea\xca\xed\xfe\xd4\xab\x93\x5b\xe1\x55\xda\xdb" - "\xcc\x64\x9f\xdc\x0a\xd1\xde\x0a\xd1\xde\x0a\x03\xec\xad\x50\x61" - "\x6f\x85\x68\x6f\x85\x0a\x7b\xfb\xf8\x0a\xe4\x36\xed\xf7\x5f\x5d" - "\xb9\xa5\xb8\xaf\x52\x6e\x57\x69\x6f\x33\xeb\x14\x72\x43\x7b\x2b" - "\x44\x7b\x2b\x0c\xb0\xb7\x42\x85\xbd\x15\xa2\xbd\x15\x2a\xec\xed" - "\xe7\x57\x20\xb7\xbb\x2b\xbf\xba\x72\x7b\xb0\xf9\xea\xe4\x56\x74" - "\xb5\xf6\x36\xe0\x93\x5b\x11\xda\x5b\x11\xda\x5b\x51\x80\xbd\x15" - "\x29\xec\xad\x08\xed\xad\x48\x61\x6f\x25\x57\x20\xb7\xf5\x0f\x7e" - "\x75\xe5\x96\x1a\x72\xfe\x53\x96\x9b\x2c\x33\x92\x1f\x97\x1b\xcb" - "\x00\x37\xc6\x93\xff\xfa\x9c\x90\x1b\xc9\x8b\xcb\x6e\x30\x23\x7a" - "\xbf\x24\x33\xb7\x24\x33\xe2\x1f\xc9\x8d\xe2\x48\x2e\x37\x95\x26" - "\x96\x62\x48\x37\xc6\x92\x72\x1c\xf9\x88\x9e\xb9\xba\xf4\xff\x32" - "\x1a\x47\xba\x03\xe3\xc8\x1c\x65\x1c\xf9\xb6\x9f\xbc\xaa\xbe\x40" - "\x79\xa9\x25\x79\x3d\x1b\x22\x8e\xdc\xfa\xab\x10\xf2\xea\xb9\xac" - "\xbc\x50\x36\xb1\x23\x83\x42\x5e\x6f\x4a\xf1\x7f\x43\xfe\xdf\x29" - "\xaf\x02\x94\x17\xc5\xff\x1f\x83\xfa\xad\x8d\x57\x2a\xaf\x87\x2e" - "\x1b\xff\x07\x97\x57\x21\x5c\x99\xbc\x66\x26\xfb\xe4\x55\xa8\x73" - "\x63\x9f\x26\xf7\x67\x3e\x79\x89\xfe\xcc\x1d\xd8\x9f\xe5\x28\xfb" - "\xb3\x89\xc8\x2b\xa0\x3f\xfb\x4a\xc9\xeb\xe1\x90\xf3\xff\x1e\x1c" - "\x8b\x7b\xd0\xcf\xd1\x7c\xe5\xd4\x7e\x1c\x27\xbb\xd9\x5f\x57\x3b" - "\x71\x9c\xec\x9e\x9c\x56\x93\x07\xf1\x23\x3b\x70\x9c\x8c\xb2\xab" - "\xca\x83\xe4\xca\x3c\xd0\x78\x5f\xc4\xb1\xf2\x59\x1c\x2b\xa3\x7f" - "\x1a\xfe\x9b\x3e\xba\x33\xd3\x01\x5e\x1c\x2b\xd3\x3c\x18\xd2\x1b" - "\xcf\xfe\x86\x63\xe5\x3e\xf4\x7d\x7d\x6f\x8a\xb1\xf2\x5f\xe4\xb1" - "\xf2\xfb\x7e\x63\xe5\x57\x5e\x90\xc6\xca\x12\xff\x1b\x94\xbc\x7f" - "\xe6\xc7\x21\xc6\xca\x1d\x97\x1d\x2b\xd3\x18\xf9\x2d\x1a\x2f\x5f" - "\xd0\x4f\x7f\x43\xf2\x6d\x6f\x9e\xff\x3b\xc7\xca\x17\x70\xac\x6c" - "\x15\xbc\x7f\xf3\x8a\x79\xbf\x22\xe4\xfa\x0f\xb2\x0d\xb2\x97\xd1" - "\xbe\x08\xf9\x2c\xf7\x41\x23\xd8\x07\xd1\x7c\xc6\x70\x55\x41\x19" - "\xea\x2b\xb7\x0f\xde\x27\xed\x88\xd3\x92\x6d\x90\x9d\x90\x6d\xf0" - "\xbe\x08\xfd\x20\x9b\x74\x53\xea\xa1\x17\x60\x71\xe3\x0b\x90\xe4" - "\x9e\xe2\x3f\x46\x7e\x24\x8b\xe4\xe1\xf3\x6d\xde\x40\xdf\x96\xad" - "\xf4\x6d\xef\x8f\xed\x8b\x2e\xe7\xdb\x5e\x08\x65\x2b\x1d\x97\xb5" - "\x15\xb2\x11\xde\x1f\xa1\xbd\xfc\x23\x6c\xe5\xcd\xff\xba\x52\x79" - "\x3d\x12\x72\xfd\xc7\xc4\xe4\x65\xd4\x5c\x5e\x5e\x46\x40\x79\xd5" - "\xfb\xe4\xe5\x3f\x36\xf6\xc9\x4b\x8c\x8d\xbd\x81\x63\xe3\x6c\xe5" - "\xd8\x78\x22\xf2\x0a\x1c\x1b\x7f\x95\xe4\xb5\x32\xe4\x3a\xbf\x09" - "\xca\x6b\x02\xf6\x65\x24\xfb\x1a\x50\xc8\xcb\x6f\x4c\xac\x90\x97" - "\xc2\xbe\x14\x63\xe2\x6c\xe5\x98\x78\x22\xf2\x0a\x1c\x13\x7f\x95" - "\xe4\xb5\x3a\xe4\xfa\x8f\x89\xc9\xab\x70\x02\xf6\x55\x88\xf6\x75" - "\x73\x8a\x4f\x5e\xfe\x63\x61\x9f\xbc\x0a\x15\xf6\xa5\x88\x1d\xb2" - "\x95\xb1\xc3\x44\xe4\x15\x38\x16\xfe\x2a\xc9\x2b\x5d\xfb\x77\xca" - "\x6b\x02\xf6\x55\x88\xf6\x75\x73\x9d\x42\x5e\x7e\x63\x60\x85\xbc" - "\x14\xf6\xa5\x18\x03\x67\x2b\xc7\xc0\x13\x91\x57\xe0\x18\xf8\xab" - "\x24\xaf\xc7\x5a\xfe\x3e\x79\x15\x4d\xc0\xbe\x8a\xc8\xbe\xfa\x7d" - "\xf2\xf2\x1f\xfb\xfa\xe4\x55\xa4\xb0\x2f\xc5\xd8\x37\x5b\x39\xf6" - "\x9d\x88\xbc\x02\xc7\xbe\x5f\x25\x79\xad\xd5\x8f\x37\x96\x52\x8e" - "\xa1\xdc\x66\x9f\xbc\x48\x36\x23\x38\x76\x1a\x89\x2a\x28\x0b\x3d" - "\x7e\xba\x29\x35\xd4\x78\x97\xce\x83\x79\xa4\x9f\xf6\x84\x88\x98" - "\x90\x05\xc4\x84\x5d\xfa\x1f\x83\xff\x98\xf7\xe7\x63\xc6\x50\x23" - "\xf2\x1c\xc5\xe6\x50\x63\xde\x7f\xbf\xea\x31\x14\xc9\x89\xc6\x51" - "\xee\x02\x94\x93\x14\xc7\xbf\xf5\x77\xce\x51\x8c\x0c\x26\xa8\xdf" - "\xc2\x38\xbe\x78\x33\x8e\xa1\x9e\xbb\x52\x39\x3d\x11\x72\xff\x37" - "\xcd\x13\xd1\x98\x97\xc6\x52\xf4\xde\xb1\xbb\xaf\x1f\x2a\x8b\x20" - "\x86\xbf\x7b\xec\xf7\x7f\xf7\x58\x73\x06\xc7\x54\xdb\x50\x6e\x23" - "\x19\x50\x7d\x06\x92\xab\x5e\x10\x63\x2a\x79\x3c\xd5\xed\x74\xf1" - "\x77\x8f\x36\xb7\x1d\x56\xd8\x99\xab\x11\xe1\x69\x1c\xd5\x99\xf9" - "\x26\x90\xad\x98\x3f\x81\x29\x24\x03\x1c\x83\x71\x79\x28\xc7\x50" - "\x87\x94\xef\x1b\xb7\x86\x1a\x43\x5d\xfe\x7d\x63\xc3\x79\x31\x7e" - "\xe2\xef\x1b\xff\x8f\x18\x43\x3d\x19\xf2\xfd\xc7\xaa\x1f\x89\xf9" - "\x06\xe2\xbd\x2d\xc1\x0d\xa8\x4f\x7f\x8d\x1e\x10\xf3\x7a\xee\xea" - "\x02\x0b\x8d\x69\x69\x3c\x6b\x33\x75\x40\xe5\x2e\x88\x19\x1e\xca" - "\x88\xc6\x31\xea\x14\x37\xfa\xba\x57\xce\x0a\xde\x97\x9c\x83\x18" - "\xc7\x8b\x7a\xbe\x56\x86\xc6\xb2\x64\x2b\xfc\x9d\xe3\x73\x90\xd4" - "\x70\x1a\x16\x73\xfb\x40\xbb\x70\xef\x37\x25\x7a\xa7\x14\x1c\x26" - "\x3b\x59\x71\x8a\xb9\x48\x06\x64\x1f\xbf\x3b\x45\xb2\x79\x1b\xcc" - "\x1f\x0b\xd9\x70\xb9\xa8\xfd\xdf\x05\x8f\xb5\x8d\xdf\x87\x90\x4f" - "\xcb\xc4\xe4\xb3\xcd\x5f\x3e\x07\xaf\xf6\x7d\xb0\xbc\x3e\x72\x5b" - "\x82\xfa\xa0\xf4\x3e\xf8\xcd\x67\xae\x54\x3e\x19\x73\xaf\x4e\x3e" - "\x46\xb8\x3a\xf9\x18\x75\xfc\xdd\xa2\x9f\x7c\x8c\x8b\x85\x7c\x8c" - "\xf1\x34\x56\xf2\xc9\xe7\xe2\x04\xe5\x13\x30\x46\xfa\x4a\xc9\xe7" - "\xe9\x90\xf3\x3f\x97\x91\xcf\x55\xda\x8f\xb1\x89\xbf\x43\xf4\x97" - "\x8f\x64\x3f\xc6\xc3\x34\x36\xf2\xc9\xe7\xdc\x04\xe5\x13\x30\x26" - "\xfa\x4a\xc9\x67\x7d\xc8\xf9\xef\xf1\xe5\x53\x78\x95\xf6\x53\xa8" - "\xe3\xef\x0a\xfd\xe4\x53\x28\xd9\x4f\x61\x3c\x8d\x85\x7c\xf2\xf9" - "\x78\x82\xf2\x09\x9c\x3f\xfd\x2a\xc9\xe7\xd9\xa8\xab\x94\xcf\x55" - "\xda\x4f\x61\x13\x7f\x27\xe8\x2f\x1f\xc9\x7e\x0a\x0f\xd3\xd8\xc7" - "\x27\x9f\x9f\x4f\x50\x3e\x01\x63\x9e\xaf\x94\x7c\x36\x86\x3c\xff" - "\x69\x7c\xf9\x14\x5d\xa5\xfd\x14\xe9\xf8\xbb\x3f\x3f\xf9\x14\x49" - "\xf6\x53\x14\x4f\x63\x1d\x9f\x7c\x4a\x26\x28\x9f\x80\x31\xce\x57" - "\x4a\x3e\x99\x2b\x2f\xf7\xbe\x48\x8e\x9d\x95\xef\x65\x47\x30\x7e" - "\xa3\xf8\x99\x62\xe7\x6e\x67\x0b\xb8\xb7\x09\xd9\x54\x7e\x01\x31" - "\x55\x92\x6c\xf8\x3b\xd9\x17\xc5\x3b\x59\x1e\xb7\xbd\x3c\x23\x89" - "\xed\xd1\xc4\x52\x5c\xc6\xdf\xbb\xf2\x77\x13\x1f\x51\x5e\xcb\x88" - "\x22\x7e\xa3\x31\x2a\xc6\xde\x40\xe3\x54\xf3\x5f\xae\x20\x6e\x7b" - "\x2e\x94\x5c\x2e\xff\x6e\xa2\x41\xb1\x8e\x4f\x1e\x7b\x7e\xa9\x72" - "\xb9\xe2\xf7\xae\x9b\x43\x9e\xff\x38\xbe\x5c\x0a\xe1\xca\xe4\x82" - "\xfd\xcd\xcb\x33\x93\x85\x5c\x3e\x0e\x90\x4b\xe1\xe2\x11\x45\xbf" - "\x33\x71\xb9\x04\xf4\x37\x5f\x29\xb9\x6c\x29\x0e\x39\xd6\x44\xbf" - "\x44\x32\xa1\xf5\xdd\x35\xcf\x41\x7c\xe5\x69\x48\x1e\xf9\x5b\x5c" - "\xe4\x6a\xf4\x73\x23\x2f\xc6\x69\xbb\xd1\xc7\x95\x3a\xd9\x5f\xa7" - "\x3a\x27\xa7\xfd\xf6\xa4\x03\xba\x33\xed\x30\xbc\x23\x03\xf6\x9f" - "\xa5\xb5\xea\x2d\x50\x91\x4f\x63\xf9\x9f\xc2\xef\x4e\x7d\x0e\xab" - "\x8f\xb0\x11\xdb\x40\x0b\xb4\xee\xfa\x29\xb0\x17\x13\x22\x1b\x11" - "\x66\x13\xf2\xf0\xbc\x3a\x2b\xe9\x12\x8e\x47\x17\x98\x20\x66\xe5" - "\x00\x73\x75\x0f\xfc\x16\xde\xc2\xba\x3e\x32\x01\x10\x7f\x49\x26" - "\xfb\x5f\xa0\xf1\xe7\xcf\x85\x4c\x1e\x13\x32\x79\x53\x31\xfe\xd4" - "\x61\xfe\x19\x03\xca\xe3\xb3\x00\x79\x9c\xea\x07\xe4\xef\xe4\xd5" - "\x4e\x94\x87\x53\x96\xc7\x39\x28\xdd\x4e\xf2\xb0\x8f\xae\x77\x1d" - "\x96\xe4\xd1\x40\xfe\xcb\x00\x31\x6f\xc8\xe3\xcf\xf3\x0a\x79\xc8" - "\x7b\xb2\x94\xf2\x90\xc7\xfe\x3b\x12\x68\x9f\xd6\xe8\xf8\xf3\x12" - "\x8e\x3f\xdf\xc0\xf1\xa7\xf9\x04\xa8\xdf\x28\xbd\x52\x79\x64\x87" - "\xec\xff\x65\x59\x50\xdf\x32\x32\xb5\xc0\x42\x72\xb0\x99\x8e\x01" - "\xc9\x84\xfa\x13\xcf\xdf\xe2\xb4\xc5\x46\xb4\x1d\xfb\xe4\xb4\x61" - "\x86\x63\x7e\x1c\xef\xdb\x36\xfc\x09\x68\xce\x40\xc8\x60\x64\xc4" - "\xe6\x68\x01\xe2\x7d\xeb\xae\x3f\x71\x39\x9c\x57\x67\x37\x6f\x74" - "\x82\x7a\x3e\xea\x21\x8e\xf7\x63\x36\xd1\xbe\x5c\xf4\x6d\x6f\x6d" - "\x85\xc5\x2b\x0d\xcc\x45\x63\x53\xb2\x21\x5a\x7b\x42\x7e\xad\xdb" - "\xf0\x2b\xa0\x79\x9d\x91\x29\xa6\xc4\x8f\x8c\x00\xe4\xdf\x88\xef" - "\xe1\x85\x3e\x39\xd1\x7a\x12\x2e\xab\x27\x26\xb0\xce\x55\x29\xaf" - "\x0d\xf6\x09\xad\x4f\x1e\x96\xe6\x0b\x1a\xe4\x39\xb5\xab\x9d\x2f" - "\x90\xe7\xd4\x2e\x88\xf5\x24\xe6\x3f\xa0\xfd\x5c\xb1\xbc\xb6\x1e" - "\x9f\x98\xbc\x8c\x70\xe5\xf2\x1a\x0a\x22\xaf\xe7\xb3\xc6\xca\xcb" - "\xa8\x53\xc8\xab\xca\x27\x2f\xe3\x62\x21\x2f\x63\xbc\x4f\x5e\xc6" - "\x84\xcb\xcb\x6b\x9c\xf5\xad\xff\xf4\xf2\xd2\x87\x1c\xff\x04\xc8" - "\xeb\x2a\xec\xeb\x42\x10\x79\xe5\xc4\x06\x91\x97\xd2\xbe\xfa\x14" - "\xf2\x92\xec\xcb\xa8\xb0\x2f\xe3\x04\xec\x6b\x9c\x75\xad\xff\xf4" - "\xf2\x7a\x21\xe4\xfa\x1f\x7f\x79\x15\x5e\x85\x7d\xfd\x39\x88\xbc" - "\x5e\x68\x1f\x2b\xaf\x42\x85\x7d\x61\x6c\x31\x2a\xaf\x42\xc9\xbe" - "\x0a\x15\xf6\x55\x38\x01\xfb\x1a\x67\x3d\xeb\x3f\xbd\xbc\x5e\x1c" - "\x77\xfd\x8f\x42\x5e\x57\x61\x5f\x1f\x06\x91\x57\xae\x31\x88\xbc" - "\x14\xf6\x35\xb3\x4e\x21\x2f\xc9\xbe\x0a\x15\xf6\x55\x38\x01\xfb" - "\x1a\x67\x1d\xeb\x3f\xbd\xbc\x5e\x0a\x19\xff\xf9\xcb\xab\xe8\x2a" - "\xec\xcb\x1c\x44\x5e\x79\xf1\x63\xe5\x55\xa4\xb4\xaf\x01\x9f\xbc" - "\x8a\x24\xfb\x2a\x52\xd8\x57\xd1\x04\xec\x6b\x9c\xf5\xab\xff\xf4" - "\xf2\xda\x16\x72\xfe\x5b\x29\xaf\xe1\x6a\x39\x3e\x3c\xe2\x2f\x2f" - "\x8c\xd7\xa3\xfb\xc4\xd8\x4a\x96\x57\xe8\xd8\x70\x5b\xcf\xa8\xac" - "\xfe\xe2\x8b\x0d\xb9\x9c\xa4\xf7\x14\x24\x1f\x8a\x11\x29\x26\x1c" - "\xde\x2f\x64\x44\xef\x00\xc7\x8d\x0b\x27\xb2\xff\xe9\x2a\xe4\x24" - "\x8f\xab\xbe\x74\x39\xfd\xf1\x6a\xe4\x64\x08\xb9\xff\xc9\x5f\x4e" - "\x72\xbf\x35\x51\x39\x05\xeb\xb3\xb6\x9b\xc6\xca\xa9\x50\xe7\x93" - "\x93\xe8\xa7\xa8\xef\xa2\xbe\xca\x5f\x4e\xe3\xf4\x57\x13\xd9\x7f" - "\xf1\x4f\x2f\xa7\xfc\xd0\xfe\x4f\xcd\xef\x36\x3f\x56\xab\xf6\xb6" - "\xe0\xa7\x15\x3f\x1d\x98\x16\x8e\x69\xfc\x7c\xa3\x5a\x29\xcf\x53" - "\x09\xb4\x4f\xbb\x35\x5a\x95\x49\xe7\xe9\x12\xcc\x24\x19\x26\x7a" - "\x0f\xa4\x60\x7b\x04\x9c\x1a\x2c\x98\xde\x3a\x65\x4f\xca\x24\x84" - "\xef\x60\x95\xf7\x38\x31\x6d\x32\xc1\xb2\x3d\x1a\x7e\xd6\x79\xb4" - "\x8a\x9f\x7d\x23\xc1\xab\x80\xe0\x09\x16\xe1\xb4\x12\x1c\x8f\x87" - "\x98\x5a\x0d\x8d\x63\x69\x8b\x90\x60\xe8\x8c\x4c\x9d\x92\xc6\x29" - "\xaa\x14\x8e\x4b\x82\x8b\xf4\x58\x7b\x8e\x12\xac\x67\x8f\x26\x5e" - "\x09\xc7\x1e\x04\xc2\x2b\xc3\x5d\x23\xe1\x4b\xf0\x6b\xef\x6c\x80" - "\x29\x7b\x74\x1c\xdf\x94\x01\x35\x48\xf4\x45\xb1\xc8\xbb\x3b\x38" - "\xbc\x4a\x33\xd7\x0f\x7e\x12\x28\xdb\x31\x85\x4d\x9a\x35\x57\x82" - "\x4b\xf4\xaa\x81\x9f\xef\x82\xe9\x1a\x25\xaf\x25\xd8\xa9\x32\x1f" - "\x51\xd6\x1a\x65\x7b\x3d\xd8\xfe\x83\x82\xc6\x68\xcf\xcb\xba\x64" - "\xa9\x2d\x8b\x95\xf5\x12\x1c\x96\xbb\x53\x92\x49\x0c\xb6\x23\x79" - "\x14\x5f\xd5\xb2\x0c\x19\xce\xec\x81\x6f\xa0\x8c\x5a\x6d\x7a\x00" - "\xa9\xdd\xd3\x58\xe5\xe2\x72\xa9\xed\x29\xfe\x7c\x54\xd9\x65\x3e" - "\x22\x4c\x32\xc2\x4e\x47\x98\x54\x19\xaf\xc7\xca\xf7\xec\x8b\x76" - "\x5b\xdd\xd7\x92\x5e\x74\xf5\x03\xe9\x32\xe1\xbd\x56\xc2\x99\x26" - "\xda\x1c\x03\x07\x47\x65\xad\xa1\xbc\x56\x09\x2e\x96\xb7\x27\x32" - "\xb5\xd9\xa3\xd2\xac\x1c\x0b\xab\x55\xc2\x5e\x27\x60\x97\x64\x21" - "\x6c\xfa\x58\xd8\x18\x25\xec\xf5\x02\x36\x79\x06\xc2\xae\x1b\x0b" - "\xeb\x9e\xae\x80\xbd\x41\xc0\x2e\x3d\x89\xb0\x19\x63\x61\x75\x4a" - "\xd8\x38\x01\xfb\x10\xd1\xb0\x61\x2c\x6c\x8a\x12\xf6\x1b\x02\xf6" - "\xfe\x2a\x84\xcd\x1c\x0b\x6b\x51\xc2\xde\x28\x60\x1f\x48\x45\xd8" - "\xac\x40\xd8\x46\xae\x07\x30\x5b\xd2\x83\x6f\x0a\xd8\x07\xdd\x08" - "\xab\x0f\xd2\xb6\x30\x8e\x57\xc0\xce\x10\xb0\x8b\xed\x08\x9b\x1b" - "\x44\x16\x4a\xd8\x99\x02\x76\xed\x31\x84\x35\x04\x91\x85\x12\xf6" - "\x26\x01\xbb\xa2\x16\x61\x8d\x41\x64\xa1\x84\xbd\x59\xc0\x3e\x9a" - "\x82\xb0\xa6\x20\xfc\xf5\xc1\x46\xae\x74\x20\x4c\x31\xf2\xa4\x27" - "\x08\x6f\x95\x38\x67\x09\x9c\xab\x9b\x10\xde\x12\x84\xb7\x4a\xd8" - "\xd9\x02\x36\x3d\x1d\x61\xcb\xc6\xc2\x82\xea\xa0\xe0\xef\x42\x89" - "\xbf\xb7\x08\xf8\xc7\x01\xe1\xcb\x83\xf0\x97\xf2\x5b\x25\x5b\x8b" - "\x17\xb0\x69\xb1\x08\x5b\x15\x84\xbf\x4a\xd8\x5b\x05\x6c\x66\x1d" - "\xc2\xd6\x06\xe1\xaf\x12\xf6\x36\x01\xfb\x24\xe9\x64\x5d\x10\xfe" - "\x2a\x61\xbf\x25\x60\x33\x8c\x08\x5b\x1f\x84\xde\xd9\x0a\xd8\x04" - "\x01\xfb\x0c\xd1\xdb\x10\x44\x16\x4a\xd8\x39\x02\xf6\xb9\xb9\x08" - "\xdb\x14\x44\x1e\x4a\xd8\xdb\x05\xec\x7a\xb2\xe3\xc3\x41\xe4\xa1" - "\x84\xbd\x83\x45\x3e\xbb\x4e\xf2\x8b\x47\x02\x61\x51\xf6\xc2\x27" - "\x5a\x61\x2e\x8b\xdc\xe8\xc4\xdf\x04\xc7\xdf\x45\x8d\xe2\xb3\xba" - "\xef\x22\x7f\x23\xf9\xb0\x79\x2c\xf2\x89\x0c\x09\xdf\xb1\x31\x75" - "\x5b\x35\x4a\xd8\xf9\x2c\x72\x9b\x51\x82\x6d\x1e\x0b\xab\x55\xc2" - "\x2e\x60\x91\xd9\x32\x9d\x2d\x63\x61\x63\x46\x61\x59\xe4\xf3\x1a" - "\x84\x39\x7e\x48\xf2\x8d\x0a\x3a\x17\x2a\xf0\xdd\xc9\x22\xf5\xcd" - "\x12\xbe\xd6\xb1\xf8\x74\x4a\xd8\x85\x2c\x72\xfb\x0c\x09\xb6\x7d" - "\x2c\x6c\x8a\x12\xf6\x2e\x16\xf9\x42\x96\x04\xdb\x31\x16\xd6\xa2" - "\x84\x4d\x62\x91\xb9\xb1\x12\x6c\xe7\x18\xde\x93\x1d\x58\x31\x16" - "\x10\x3e\x69\x11\x8b\x7c\xa9\x5d\x82\xf5\x8b\x03\x14\xfd\xf0\xdd" - "\x42\xee\x5b\xda\x51\xee\x3c\x0e\x44\x9f\xdf\x1b\x2c\xc6\x30\xdc" - "\x0e\xd7\x9c\x55\xef\x36\x88\x3e\x49\x3e\x9b\xbe\x98\xf7\x63\xde" - "\x86\xfb\x32\xd7\x38\x99\x5b\x99\x56\xa3\x66\x3d\x0b\x9c\xa0\xe1" - "\xe7\x1d\x4f\x29\x2e\xb7\x63\xba\x63\xe6\x7d\x96\xa1\xca\xdd\xc5" - "\x76\xd5\x37\x73\xe9\xfc\x0e\xfc\x5d\x6e\x87\xac\x06\xfa\x5d\x63" - "\x65\x2e\x3a\xf3\xd6\x53\xbd\x4c\x67\xf3\x0e\xd0\xd9\x57\x2e\xc4" - "\xe1\x3a\x63\x80\x30\x5d\x3e\xd0\xbb\x96\x61\x9b\x69\x00\xce\xa8" - "\x77\x77\xb1\x6d\xfa\x64\xa4\x21\x05\xeb\xcb\x3a\x8d\xcf\x9c\x06" - "\x8c\x81\xb0\xaf\x4c\x6e\xcd\xa7\xf3\x84\x76\x7b\x1c\x53\x4a\x52" - "\xd8\xde\xf5\xfd\x86\x52\xb8\x19\xe9\xe6\x7b\x57\xf9\xd9\x22\x17" - "\xf4\xf7\x79\xa7\x2c\x4b\xa6\x33\x47\x58\x7d\xa9\x4e\x9c\x47\x52" - "\x7c\x2f\xa7\xd9\xca\x7a\xd8\x8c\xfb\xd2\xbd\xc3\x65\x16\xba\xfb" - "\xa0\xb5\xf4\x2c\x9c\x56\xe4\x39\xbe\x51\xca\xcf\x2a\xc1\x36\xa5" - "\x07\x3d\xc3\xc3\x0a\xd1\x6c\xff\xb2\x8c\xa1\xca\xe2\x4c\x8c\xd7" - "\x8e\x8b\x36\x16\xe7\xda\xc1\xb9\x52\xfa\x6d\xb2\xc3\x17\x2e\xe9" - "\x77\x99\x5d\x35\xad\x53\xfa\x5d\x2b\x9f\xa5\x12\xfc\x6c\x97\x65" - "\x73\xb1\x6d\xa9\xde\xb7\x32\xb4\x14\x5f\xd2\x39\x6b\x6c\xca\xb2" - "\xb9\xba\x9b\xe8\x4e\x8b\x92\x04\xac\x33\x55\x9c\x8f\x59\x7c\x0e" - "\xbf\xa3\xa5\x6f\x87\xf4\xcd\x08\x86\xcb\x6d\xc6\x7d\x3d\xac\x6a" - "\x47\x1c\xb5\xad\xd4\xc3\xbc\x88\x57\xcf\xca\xdf\x2d\xb7\x99\xfa" - "\x41\x9c\x2b\x5d\xf2\x0d\x7e\xce\x0d\xf1\x0e\xf9\xcb\x22\xde\x2d" - "\xe7\x75\xed\x2f\x49\x51\xd2\x45\x07\xb2\x24\xde\xb9\xf0\xae\xa4" - "\x45\x77\xdf\xb3\xf8\xde\xcd\xcf\x6d\xc9\xca\xde\xfa\xbc\x3e\xe7" - "\x85\x17\x73\x5f\xca\xdb\x66\xd8\x9e\x5f\x60\x2c\x2c\xda\x61\xda" - "\xb9\x8b\xe0\x46\xdb\xf0\x56\xaa\xca\xa9\x06\xac\xe7\x41\xaa\x67" - "\x3f\xa7\x07\xd3\x04\xff\x4b\x8a\x35\xba\xe0\xb1\xad\x0d\xa3\x4d" - "\x3a\x67\x79\x40\x5d\xf2\x47\x3a\xf3\x19\xe5\xac\xb2\x35\x3c\xdc" - "\x4a\xe7\xf0\xf7\xa9\x4b\x3a\xbb\x1d\x0f\xb7\xd2\x3d\x10\x6d\x71" - "\xfd\x10\x3f\x9b\xce\xea\x2f\x69\xa1\xfc\xc6\xdb\x00\xda\xb1\x6c" - "\x30\x9c\xb3\x63\x20\xee\xb5\xeb\x99\xa3\xee\x7a\x36\x40\xf8\xeb" - "\x0e\xb0\x7e\xc7\x6e\x3d\x54\xe3\x33\xea\x5a\xcc\x19\x75\xe9\xfe" - "\xb6\x19\xfc\x3c\xf3\x19\x87\x0e\xb0\xbe\xb2\xeb\x59\xdf\xde\x03" - "\x6c\xa0\xf1\x7a\x66\x8f\xaf\x83\xa8\xa1\xca\xd2\x14\xbb\xba\xa4" - "\x9e\xeb\x2d\xe6\x7b\x23\x4b\x16\xd7\x60\xde\x02\x37\x84\x35\xe2" - "\x33\xa6\x39\xdb\x74\x82\xee\x77\x3e\x77\x85\x23\xbe\x78\x36\x92" - "\xab\xaa\xc6\x7a\x84\x9c\x4a\xdf\x6d\xc7\x9e\x14\xeb\x73\xd8\x5c" - "\xa7\xc1\xae\x2e\x3d\xd6\xf8\x05\xaf\x2f\xda\x56\x3f\x00\x84\xef" - "\x27\xf9\xae\xf0\x82\x1b\x99\x1b\x61\x6b\xbd\xbb\x73\x55\x08\x93" - "\x8b\xb8\x9d\xca\xf6\x24\x6c\x7d\xc9\xa8\xcb\x2b\xcc\xcd\x9d\x13" - "\x09\x09\xfc\xdb\xef\x0e\x09\x23\xe2\x83\xd7\x0e\xb0\x76\x6c\x67" - "\x2b\xb6\xb7\xa3\x0b\x23\x68\xd4\x19\xc0\x36\xd5\x9e\x51\x9b\xc3" - "\x31\xfd\x38\xfe\x3e\x8e\xb4\x77\x88\x7b\x07\x6a\xef\x64\x95\xa5" - "\xc7\x91\xce\x0e\x3a\xa7\x96\xce\x9f\x1a\xdc\xb1\x4e\x85\xed\xae" - "\x43\xb8\x0e\xdd\x8d\x70\x2b\x96\xdb\x8f\x74\x1c\xc6\xdf\x04\xcf" - "\x6d\x03\xe1\xdb\x45\xbb\x6a\xf9\x59\xf6\xc8\xab\xd6\x83\xd7\xb3" - "\xaa\xa1\x4a\xb3\x9e\xce\xa7\xe3\xe7\x76\xe3\x33\xf2\xa5\x03\x61" - "\x6b\x07\xcd\xeb\x54\x38\x9e\x52\x35\xfa\x70\x2e\x26\x9a\x88\x0e" - "\x1a\xd3\xfd\x0e\x23\x28\xef\x48\x06\xcc\x73\x81\xea\x77\x7d\x00" - "\x0d\x07\x58\x13\x7e\x1a\xf0\x53\xff\x5b\xcc\xfb\x0d\x7e\x3a\x30" - "\xbd\x13\xbf\x7f\x8b\xdf\xbf\xe9\xe3\xef\xe0\xe2\x88\xee\x82\x62" - "\xd6\xbf\xa0\x1e\x6e\x21\xfc\xa8\x5b\x4f\x9d\x56\xd7\x94\x13\xed" - "\x74\x16\x24\x8b\x34\xbb\xfd\xcf\xcc\xdb\x63\x00\xcc\xc7\xef\x32" - "\xf1\xad\xfc\xec\xe9\xc4\xcf\x80\xf8\x6d\x4d\xc2\xdf\x1b\xa4\xdf" - "\x69\xf8\x59\x77\xf9\x4f\x20\xbe\x50\x1f\x6b\xeb\xc4\x61\x27\xf4" - "\x71\x4f\x0c\xae\xcc\x04\xea\x97\x7b\x40\xfd\x1d\xad\x7f\xfa\xcb" - "\x76\x91\xf6\xca\x51\xf1\xfc\x4a\x8b\xf4\xdd\x07\xea\x2a\xe4\x53" - "\x15\xe2\xdf\xaf\x13\x69\xfb\xe7\xe2\x37\x8e\xb0\x6b\x2c\xfe\xf5" - "\xd7\x62\xf9\xda\x58\x92\xe7\x08\xdd\x81\x80\xb2\xb4\xab\xcd\x9d" - "\x24\xa3\x1a\xa1\x5b\x2a\x2f\xe3\x69\x1d\xa8\x5b\x0d\x3e\xfd\xd9" - "\xf3\x73\x7f\xfd\xd9\x73\x24\x40\x7f\x6a\xc9\x1f\x61\xb9\xd8\x46" - "\xa1\x2f\xc7\x07\x77\x67\xe1\xf3\x9e\xa3\x88\xe7\xb8\x6e\x23\xe1" - "\xb0\xf2\xf1\x64\xcd\x59\x1c\xfb\xe9\x41\x43\xfe\x65\x40\xbd\xc7" - "\x43\x3a\x4b\x75\x4b\xf5\x0a\x5a\x90\x3e\x4c\x6b\x22\xfa\xb6\x21" - "\x5e\x7c\x3e\x8c\x70\x4d\x36\xf8\x5c\xa6\x8d\x97\xa9\x7c\x01\xf5" - "\x51\xa2\x97\x70\x52\x39\xe6\x6b\x57\x07\x95\x91\xea\x7e\x17\xd3" - "\x69\xac\x08\xe6\xcf\x20\x8c\xd6\x2b\x93\x4e\xd2\xb7\xcd\x9d\x88" - "\xb6\x94\x06\xde\xa1\x0c\xc0\xe1\x7e\x22\xda\x5b\xc4\x69\xb5\xb5" - "\x6e\x7e\x31\x24\x12\x3e\xf2\xeb\x76\xb5\x35\xa3\x91\x6c\x51\xe0" - "\xfa\x91\x38\xf7\xca\xdc\xf1\x5b\x03\xf0\x7a\x0e\x11\x3d\x98\xaf" - "\xa8\xb7\x8e\xc6\x82\x35\xbb\x44\x5b\xb1\xae\xc3\x58\xfe\x18\xb5" - "\x9d\xf8\x89\xf9\x2d\x88\xc7\x41\x79\xfc\x3c\x6d\xd1\x9e\xc3\x74" - "\xe6\x2a\xf1\x83\xe0\xe9\x5e\x13\x71\x06\x9f\xf9\x3a\xce\x37\x2c" - "\x4f\xf2\x60\x58\x07\xe1\x30\xbb\x99\x9b\xa1\x3f\xfa\xc1\x2e\x17" - "\xf6\xed\x65\x39\xfe\xf2\xd9\x9b\xa6\x94\x0f\x96\x3b\x86\xe5\xdb" - "\x19\xb6\x91\xfc\x09\xd6\x19\x4d\x77\x29\x60\x5a\xad\xb7\x12\x71" - "\x14\xb9\xf8\xfc\x08\xe2\x79\x1a\x69\xa9\x25\x3c\x48\x4f\xbb\x84" - "\xab\xee\x97\xc5\xfe\xb2\x96\xf0\x1d\x26\x99\x73\x7b\xde\xc5\xdb" - "\x84\xbe\xab\x6c\xce\x21\x91\xd7\x82\x30\x2d\x6c\x24\x0d\xe8\x0c" - "\x53\xd1\x97\xf0\xbc\x66\xf3\x25\x2e\xdf\x76\xe1\xd7\xca\x56\x14" - "\x94\xb0\x7e\x1f\xdd\x65\x20\x9f\x03\x2b\xd1\xdd\x4c\xf5\xb1\x1d" - "\x1b\x78\xdf\x4a\x75\x50\x79\x81\x6f\xef\x29\xc2\x27\xf3\x6a\x3e" - "\xd2\x21\xf8\xb5\x37\x06\xd3\x0f\x93\x2e\x72\xbe\xa1\x1f\x1d\x34" - "\x93\x2e\x96\x69\xb0\x3c\xf9\xd0\xe3\x83\x3b\xe8\x79\x6f\x3d\xf7" - "\xb1\xa3\xf9\x7b\x57\x52\xbe\x0d\xc7\xda\x35\x2f\xa2\x2e\x79\x01" - "\x6e\x89\x85\x44\xa7\x95\xb7\xed\xa8\x73\x77\xaa\xaa\x0d\xa3\x15" - "\xa2\x13\x79\xd4\x82\xb4\x1e\xc5\xbe\x66\x80\x68\x45\x7f\xdd\xcc" - "\x7e\x90\x01\x44\x33\xfa\x33\x89\xbe\x7d\x33\x25\xd9\x37\x53\x1b" - "\x89\x9f\xf3\x85\xef\xc3\xbc\x97\x7f\x49\xb4\x2b\xda\xed\x52\xf2" - "\x98\xb7\x1b\xe5\x40\xf2\x22\xb9\xf8\x70\x96\x91\xee\xd7\x22\x2e" - "\xe9\xbc\x36\xa1\x1b\xc4\xeb\xda\xeb\x59\x27\xc1\xfb\x60\x5f\xe6" - "\xf7\x23\x96\x62\xdd\x0b\x0c\xd8\xa7\xa3\x5d\xd0\x59\xbe\x88\xf7" - "\x28\xdd\x59\x83\x38\x5a\x88\xa7\x08\xb7\x8f\xf4\x11\x9f\x3b\x25" - "\xba\xcb\xb0\x3f\x9f\x8b\x9f\x64\x9f\xfd\xbf\x5c\xe8\xaf\x5f\xfb" - "\x02\xed\x9f\xe4\x5d\xeb\x35\xa7\x01\xd7\x87\x7c\xd0\x9d\x57\xbf" - "\x3c\x4d\xea\x3b\x24\x59\xbf\x9c\xdd\x86\xf6\xa2\xc0\x31\x10\x20" - "\xeb\x16\xae\x8f\x3b\x56\xd2\x9d\xbf\x2a\x2c\xdb\x22\xf0\xec\xe3" - "\x6d\xe6\xfa\x64\xe5\x3a\xd0\xc9\x76\x60\x3b\x47\xf5\x60\x5f\x9a" - "\x24\xe7\xce\x00\x9e\xc8\xbe\xab\x8e\xee\x5c\x20\x9f\x84\x71\xe6" - "\x7d\x43\x23\x3e\xbf\x44\xb2\xf7\x72\xd9\xef\x73\x34\x8a\xfe\x56" - "\xf2\x5b\xfb\x44\xfe\xf5\x7e\x3a\x4c\x6d\xba\x95\xeb\x2f\xd1\x62" - "\xde\x40\xb4\xb4\x70\x3a\xcc\x3a\xc0\xbc\x06\xaa\xdf\xae\x7e\x39" - "\x41\xb2\x57\x09\x57\x99\x9b\x70\xed\x45\x5f\x45\x34\x61\xdd\xe5" - "\xdc\xff\x3d\xc4\x79\xe2\x91\x68\xef\x70\x59\xa9\xec\x1e\xc7\x25" - "\x35\x2f\xdb\x81\xbf\xb3\x5c\xe2\x5c\xe6\x48\x2c\x7f\x44\xf7\x1c" - "\xc1\xbf\xb2\x81\x7c\xb4\xee\x19\xfe\x7b\xb9\xee\x49\xd4\xd5\xb3" - "\xa0\x41\x7c\x5a\xd2\x51\x59\x2f\x06\xd4\xaf\x2c\xa2\x98\x1d\x79" - "\x7d\x14\x63\xa4\x23\xc4\x6f\xd2\x65\x8c\x91\x92\x86\x2a\xbf\x93" - "\x25\xeb\x2d\xd6\xd3\x40\xbc\x17\xf2\xf9\xce\x8f\x50\x8f\x5b\x7c" - "\xba\xf5\x9d\x1f\x49\x7c\x3c\x82\x7c\xd4\x62\x7d\x73\xa4\x76\x1d" - "\x41\x78\x8c\xc5\x5e\xf9\x86\x44\x7b\xbd\x04\xff\x91\x2c\x07\xc9" - "\x56\x3b\xab\xc9\xff\x72\x19\x94\x6f\x90\xca\x1e\x16\x75\x95\x3f" - "\x2b\xc3\x52\x8c\x28\xce\x5b\x2f\x7f\x96\xfc\xe0\x02\x94\x3d\xf7" - "\x7d\xfc\x3e\x27\x91\x46\xb6\x23\xea\x78\x85\xdf\x8f\xbd\x17\xe3" - "\x1e\x9f\x1e\x95\x27\x05\xf8\x27\xf2\xc5\xb5\xdd\x88\x83\xfc\x29" - "\xe9\x12\xf9\x54\x1a\x33\x20\xbe\x28\xc9\x7e\x24\x9a\xcb\xbf\xef" - "\xaf\x2b\x95\x9f\xa1\xae\xcc\x53\xe0\xae\x0d\xd6\xcf\x35\x0a\x1f" - "\xd8\x20\xb5\xed\x13\xa9\x6d\x47\xa5\xb6\x7d\x22\xb5\xed\x08\xd6" - "\x81\x7c\xab\xfc\xa1\x82\x8f\xc8\xb7\xca\x69\x12\x7c\x0b\xf9\x72" - "\x9f\xbd\x56\xac\x92\x6d\x79\xac\xbf\xa8\xe4\xf6\xe0\xa3\xab\x22" - "\x21\xc0\x5f\xb4\x04\xf7\x17\xe5\x2e\xa9\xbd\x4d\x01\xb6\x71\x58" - "\xd0\x2e\xf5\x2d\x28\x87\x6e\xe7\xb0\x74\xb6\xb8\xf9\x3a\xf2\x9f" - "\x54\xb7\xb2\x0f\x3a\x24\xf8\x2a\xd9\x72\xc5\xb9\xb1\x72\xa8\x38" - "\xae\xb4\x67\x92\x35\xf9\x04\xc2\x41\x32\xe5\x71\x25\xa6\x09\xb9" - "\x56\x50\xdc\x5a\xab\xf4\xd1\x08\x5b\xe7\x65\x64\x2f\x15\xad\xfe" - "\xb6\x58\x31\x57\xb2\x45\xa9\xee\xca\xef\xa2\x8c\x12\x7d\xf5\x56" - "\x26\x05\xd4\x4b\xb2\x69\x27\x3e\x48\x32\x2d\x91\xfb\x34\x82\xc7" - "\xb2\x26\x2c\xa3\x0f\xe8\x1f\x6b\x89\x3e\xbb\xba\xdc\xce\x7d\xd6" - "\x01\xee\x2b\x4c\x43\x9c\x9e\xca\xdc\x46\xa9\x9f\xc0\xb4\x44\x29" - "\x6d\xb1\xd4\x97\xc8\x7a\xf3\x71\x00\x4d\x1d\xc1\xe3\xa3\x72\xbb" - "\x1c\x1f\x71\x5c\xdc\x17\x55\x76\x4a\xed\xa3\xb4\x79\x22\xad\xbc" - "\x8e\xd2\xaa\x05\x1f\xea\x18\xef\xaf\xca\x17\x4b\xfd\x15\xd9\x97" - "\xda\xae\xfe\xce\x11\xb2\x31\x7a\xb6\xab\x5f\xd1\x11\x7e\x9b\x65" - "\x98\xc6\x10\xf5\x98\x97\x4a\xfe\x80\xfc\x85\x6e\xab\xf0\x1b\xba" - "\xd5\xfc\xfb\x25\xf2\x3b\x14\x87\x50\x3e\xc2\x25\x91\x2f\xc2\xf4" - "\x3d\xba\x47\x30\x2e\xf8\x9b\x16\xf1\xbe\x92\x25\x95\x7d\x9d\xc7" - "\x0a\x7f\x4b\x0b\x93\xd3\xe4\x72\x68\xeb\xcb\xa9\x1c\x95\x97\xfd" - "\x17\xf9\x2e\x37\xf9\x26\x51\xdf\x1f\x25\x1d\xe7\xe3\x06\x39\x2e" - "\x1a\x51\x2b\x60\xe9\x7c\x67\xee\xd3\xaa\xe2\x85\x3f\xab\xba\x8e" - "\xca\x72\xf9\xa1\xaf\x2c\xbd\xc4\x3e\x69\xcc\x07\xcd\xa1\xcf\x79" - "\x8c\x15\x2b\xe8\xac\x32\x88\x76\x54\xdd\xcb\xdb\x21\x7c\x6a\xad" - "\xa0\xc5\x1c\x7b\x68\x98\xe7\x3d\x41\x6d\xa1\xbc\x1a\x45\x1e\x1b" - "\x49\xa0\xbc\xed\x9c\xae\x80\x72\xde\x11\xfd\x18\xf8\x46\x71\x6f" - "\x96\xf6\xd0\x01\xd9\xf7\x56\x39\x24\x3a\xdf\x96\xfd\x2e\xf2\x25" - "\x99\x7c\x2f\xcf\xdb\x2a\xc1\xac\x96\xbe\xb9\x7f\xaf\xfa\x58\xf0" - "\x35\x4e\x2d\xf1\x3b\x55\x6a\xc7\x67\x7c\x9c\xfd\xb7\x0c\xe4\x6d" - "\xd5\x49\x99\xb7\xca\xdf\x64\x3f\x58\x7f\x0c\x3d\x73\xbd\x2f\xe6" - "\x63\xd8\x06\x82\x21\x9a\x44\x1f\xf1\x4a\x67\x60\x4c\x7d\x46\x5d" - "\x93\x43\xfd\x92\x88\x55\x6b\x56\x48\x73\x30\xd0\x9a\xff\x2f\xd8" - "\x2f\xec\xaf\x93\x7d\x0c\x1b\x4a\xc3\x31\xff\x69\x84\xd9\xcf\xef" - "\xb8\xa5\x33\x81\x95\x30\xe4\x9f\xde\x19\xb6\x4b\x38\xf7\x1b\x64" - "\xbf\x41\xbe\xa4\xdb\x79\x5a\x8a\xe9\xaa\x75\x87\x24\x5f\x72\x5e" - "\x5d\x3d\xcb\x3f\x0e\xab\x9e\xe5\xef\x33\x6a\x16\x05\xfa\x0c\x8c" - "\x9b\xcb\x86\x2a\xf7\x3b\xfd\xe2\x00\x4c\x1b\xdf\x77\xec\xef\x20" - "\x1b\xa5\x7b\x16\xb8\x7f\xe2\xf3\x4a\xd5\x15\x32\xcd\xe4\x37\x07" - "\x77\xcb\xf3\x17\x35\xb7\x52\xac\xe6\x5f\x5f\x75\x96\x9f\xef\xa4" - "\xfa\x64\x7c\x1a\xa0\x73\xfa\x91\x0f\x34\xe7\x52\x9d\x24\xf9\xf9" - "\x26\x3f\x5f\x29\xf5\x61\xe4\x27\xfd\xfb\x2a\xf3\x75\xfe\x7d\x55" - "\xcd\xb4\xb1\x3e\xb2\xda\x3e\xf1\xbe\xaa\xba\x85\xfc\x96\xec\x23" - "\xfd\x7d\x41\x75\xdf\x21\xbf\x58\xb6\x3a\x57\x8e\x65\x7d\x7e\x74" - "\xbf\x9b\x7c\x14\xd6\xdf\x22\xea\xae\xd9\x80\xfd\x7e\xa6\x5c\x37" - "\xe6\xd7\x75\xe3\x88\x8c\x55\x96\xa2\x1e\xed\x4f\x91\x62\x40\x6e" - "\x9b\xc3\xfc\xac\xf4\xaa\x72\xd4\xbf\x48\xd2\xb3\xd6\xbc\xcf\xa1" - "\xcf\xd7\x57\xb4\x0f\x6e\x1b\xe5\xef\x39\x65\x5c\x78\xf0\x00\x2b" - "\xc7\x7a\xda\x95\x6d\xdc\x8f\x69\x35\xd2\x1c\x02\xe7\x2d\xc7\x55" - "\x53\xdf\x78\xc0\xbf\x6d\xa2\x1d\x35\x9d\xd4\x0e\x1a\x13\x61\xfd" - "\x14\x67\x1f\xc1\x98\x0f\x7f\x7f\x87\xec\xe0\x88\x1c\x17\x5d\xb2" - "\x2a\xe3\x2b\x73\x2e\xf9\x4a\x69\xec\xd9\x81\xf1\x4e\xad\x72\x2e" - "\x66\xd5\xb2\x74\x9d\x21\x3f\x27\xcf\xb8\x75\xa1\x2e\x27\x2f\xc7" - "\x98\xb3\x39\x37\x67\xd7\x66\x63\xce\xb6\xbc\xb9\x2f\x6d\x7e\x3e" - "\x67\x8b\x6e\xc7\xe6\x02\x5d\xa2\xe9\x56\x53\x24\xf8\x40\x97\xe8" - "\x36\x17\x14\x14\xbe\x94\x9d\xa5\xcb\xcb\xd9\x32\x2f\x3f\xbb\x20" - "\xdb\xa8\xdb\x9c\xbf\xad\x30\x2f\x4b\x77\x6b\xd6\xfc\x5b\x13\xef" - "\xce\x8a\x54\xce\xa1\xcd\x8e\x81\x01\xef\x17\x9f\xf6\xd7\x7c\x01" - "\xda\x68\x95\x21\x3f\xda\x94\x93\x27\xe6\xed\xbe\xbb\x68\x41\x1d" - "\x18\xe8\x2e\x45\xba\x33\x8c\x55\xd6\xa6\xe1\xb7\x86\xe0\xb0\x9d" - "\x3a\xba\x4b\x11\x69\x9f\x31\x54\x59\xeb\xb2\xab\xeb\xec\xfc\x3e" - "\x30\x4c\xc7\xb6\xcd\x60\x5f\xfc\xa6\x1f\x63\x36\x03\xad\x0b\x6e" - "\xfc\x02\x62\x6b\x8b\x40\x83\x9f\x28\xfc\xc4\xd0\x5d\x8b\x43\x95" - "\xdf\x9d\x6b\x57\xbf\x9a\x26\xce\x5b\xfe\x6e\xa7\x23\xe2\x1d\x03" - "\x2b\x7f\x47\xba\xd3\xe3\xbb\xbf\x91\xe7\x7a\xd7\xec\x83\x35\xa4" - "\x9f\xa7\xd5\xdf\xe5\x73\xd8\x7b\x51\x97\x69\xce\x74\xf0\x17\x0f" - "\xa6\x60\x3c\x78\xaa\xf5\x46\x9e\xf7\x1b\xa7\x1a\xa2\x90\x2e\x4d" - "\x5b\x71\x22\xbc\x86\x75\x15\xc4\x31\x86\x75\xd4\xca\xf3\x69\xd8" - "\x86\x18\x6c\x4b\xaf\xd4\x8e\x02\xde\x8e\x03\x2c\xbe\x6e\x3a\xd2" - "\xf7\x2a\xa7\xe7\xb8\xdc\x06\xa4\xbb\x17\x69\xa2\xfb\xd0\x62\x88" - "\xae\x60\x73\x7d\x34\xdf\x75\x46\xfd\x6a\xb8\xb7\x08\xf9\x76\x93" - "\xb8\x27\xa2\xe6\x90\xb0\x3f\x6c\x57\x72\x23\xfe\xae\xfe\x1c\xa2" - "\xf6\xd3\x3d\x7e\xd6\x9b\x59\x97\xd3\x0d\x36\x7d\x2f\x44\xef\x64" - "\x0e\xf6\xc1\xa7\xfd\xa2\x4d\xaf\x26\x92\x6f\x78\xef\x85\x5e\x0d" - "\xb5\x09\xfb\x8a\xa8\xc6\xcf\x43\xce\x2d\x6a\x5e\xbb\x9e\x39\xd9" - "\x5b\xca\x98\xeb\xd5\x37\x88\x27\x14\x6f\x0d\x5a\xe9\x5e\xb8\x57" - "\x2d\x48\x77\xaf\x14\x1b\x3b\xd9\xc8\x06\x45\x2c\xf5\x2a\xe9\x99" - "\x33\x04\x6e\xad\x8c\x9b\xee\x07\xa4\x32\x42\xfe\xaf\x85\x63\x19" - "\x87\x02\xbf\x3d\x10\x3f\xe1\xc4\xdf\x0e\xb9\x1e\x31\x0e\x7f\x95" - "\x62\x02\x07\xea\xb2\x23\x44\x7d\xf1\xaf\x1e\x60\x27\x6d\x98\x5e" - "\x73\x09\x34\x08\x8b\xfd\x06\xe1\x7f\x2d\xc5\xae\xae\x3d\x4c\xf8" - "\xf7\x5e\x0f\x50\x86\x30\x83\x95\xdf\xed\x75\xf2\xbb\xfa\x5e\x43" - "\xfb\x2f\xed\x09\x9c\xcb\x96\xf4\x79\x49\x80\x3e\xa7\xbc\x4a\x31" - "\x21\xf6\x04\xa4\x43\x35\x17\xb1\x1f\xc6\xe7\xf9\x75\x90\x40\xf5" - "\xe0\xef\x1e\x9a\x0f\x41\x9c\xc7\xe4\xfa\x18\xea\x7f\xb5\x57\xcc" - "\xc1\x48\xba\x35\x97\xe6\xaf\xcd\x26\xc6\xda\xd0\xbf\x13\x8d\xa4" - "\x63\x58\xa6\x4f\xd6\x29\xd4\xf5\x93\x5c\xaf\x62\x21\x81\x55\xbe" - "\xa6\x6f\x9c\x8e\x70\xa8\x57\x87\x50\x9f\x48\xaf\x86\x2a\xeb\x62" - "\x64\x9d\x42\x5d\xeb\x21\x38\xa4\x21\xf2\xd8\xae\x14\x0d\xf9\xc8" - "\x3e\x75\xdd\x3e\xd2\x31\xf6\xbd\x47\x7b\xd9\x0d\xeb\x7b\x85\x9c" - "\xea\xf6\xd9\x5c\x42\x06\x3e\xbe\xd7\x65\x28\xf8\xde\x83\x7a\x1c" - "\x49\x7c\x16\x73\xd5\x75\xfb\x90\xb6\x1e\x1e\x8b\x97\xa0\x0c\x78" - "\x5f\x55\x97\x4a\xe5\x25\x1e\x76\xfa\x78\x58\xd7\x14\x8c\x87\x01" - "\xbc\xd3\x88\xbb\x02\xeb\x8e\x92\xad\x60\x99\xd1\xfb\xff\x82\xc9" - "\x12\xeb\xd0\x68\xea\x40\x4b\x75\xb4\xc7\x12\xfc\xeb\x9a\x60\x75" - "\x04\xea\x71\x7b\x13\x00\xcd\x85\x53\xb9\xf8\x58\xe2\xeb\xeb\xc9" - "\x41\xe5\xbb\xc5\x8f\x36\xfe\x61\x95\xaf\xa7\xbd\x26\xee\x72\xa5" - "\xfa\x8c\xe3\xd1\x17\xaf\x13\xfd\x62\xeb\x6c\xd2\xe7\xd7\xdf\xb6" - "\xd5\x03\x50\x9a\xf4\xdc\x30\x88\x7d\x4d\xe0\x7c\x7e\xe8\xf7\x0b" - "\xaf\x9f\xf3\x7f\xbf\xf0\xfa\xa9\x50\xef\x17\xfc\xeb\x3d\x30\x87" - "\xea\xf5\x36\xae\x53\xf9\xea\x3e\x10\xeb\x0d\x52\xb7\x5c\x7e\x7e" - "\x93\x72\xfc\x72\x60\x27\xd1\xd0\x4d\x77\x92\x7f\x73\x9d\x8a\x21" - "\x9e\x76\xde\x67\x1f\x30\x89\x78\x85\xe2\xa0\x03\x19\x04\x13\xd8" - "\x8e\xd1\x3f\x6d\x2c\xdd\xed\x09\x97\xf8\x43\xf8\x43\x40\x27\x2c" - "\xc0\x8d\x7a\x39\x5b\xed\x07\x0c\x2c\xc8\x43\x14\xc0\x37\x39\x3c" - "\xc3\x3f\x91\x24\x3d\x3b\xf8\x83\x66\x14\x7e\x34\xff\xef\xf8\x8b" - "\x10\xf4\x72\x7c\x2e\x50\x49\xf5\x95\x2b\x20\x52\xc7\x29\xcd\x40" - "\x2e\x12\xec\x8f\xa2\x68\xcb\x3a\x1c\x8b\x7f\xf3\x08\x07\x66\xcc" - "\x2d\xe1\x97\x9f\x99\xf2\x99\x52\xfc\x9f\xf1\x2f\x6c\x83\xa2\x82" - "\x9b\xc3\xb2\xf8\x72\xa3\x9b\x3a\x46\x93\xd4\x4d\x31\xfe\x95\x5a" - "\xc2\xf9\x57\x34\xfd\x63\x42\x7c\x09\x98\xff\x4d\x1f\x7c\x98\x73" - "\x8f\x02\xf8\x77\x82\xfc\x99\xa1\xdb\x70\xe5\x7f\x37\x29\x7e\xdf" - "\x2c\xbe\x66\xb4\x7e\x99\x15\x8c\xfb\xa7\xeb\x89\x90\x7f\xfa\xd4" - "\x63\x66\x5a\x30\x50\x1f\xff\x67\xca\xfc\xf6\x93\xa7\x2f\x7f\x56" - "\xbc\xff\xf3\xec\x76\xff\xe7\x78\xf7\x97\x41\x7a\x2b\xfd\x63\xb6" - "\x63\x3c\x7c\x8b\x4f\x5e\xd1\x01\x26\x13\x5d\x1b\x60\x42\xbe\x3f" - "\x89\x9a\x30\x80\x5b\xd3\x15\xc9\x9a\xe0\xd0\xff\x98\xbf\x1b\xf7" - "\x48\x0c\xbc\xd9\x11\x33\x26\x33\x30\x8d\x9e\x27\xe9\xa4\xb4\x3b" - "\x7f\x39\x06\x9e\xa7\xe9\x14\xcf\xaa\x14\xfc\xa7\x09\x0b\xae\xfb" - "\x32\x68\xfd\xfa\xef\xff\x87\x7f\x2a\xb2\x8f\xaf\xff\xfe\x41\x7f" - "\x4c\xf4\xe2\xe8\x89\xf8\x17\xfd\xc7\x46\x1d\x25\x93\x32\x98\x94" - "\xc0\xa4\x1f\x5f\x4a\x3f\xfe\xf5\xdf\xd7\x7f\x5f\xff\x7d\xfd\xf7" - "\xf5\xdf\xd7\x7f\x5f\xff\x7d\x05\xfe\x54\x7c\x1c\xc1\xa4\x3f\xf9" - "\xb7\xc8\xa3\x21\x10\x3f\xe7\x44\x8a\x25\xe4\x74\xcb\x22\x50\x69" - "\x61\x92\xe6\xcb\x8c\xf1\x74\xa3\x04\x4d\x00\x98\xf6\xd8\xd0\x7a" - "\x92\xbb\xf0\xf3\x4d\x45\xfa\x4d\xc1\xc1\xff\x07\xfe\x54\xc8\xac" - "\x30\x1c\x03\x86\xc3\x24\x98\x0c\x5a\x88\x80\x48\xb8\x06\xa2\x60" - "\x0a\x4c\xc5\xb1\x65\x0c\x4c\x83\xe9\x70\x2d\xc4\xc2\x75\x70\x3d" - "\xdc\x00\x71\xf0\x0d\xb8\x11\x29\x9f\x01\x33\x83\xd3\x6c\x81\x94" - "\x38\xfc\x07\xff\x4f\x87\x14\xfe\x9c\xf9\x75\xfa\xff\x68\x7a\xab" - "\x94\xde\x23\xa5\xdb\xbf\x4e\xff\x1f\x4d\xd7\xfd\x6f\xfe\x9e\xf5" - "\xbf\xf5\x5b\x85\x6e\x59\x78\x66\x55\x50\x7f\x18\x98\xaa\x92\xfe" - "\x46\x9f\xe1\x32\xe5\xc7\xe0\xf3\x2f\x1f\xf8\x97\x82\x9f\x24\xf1" - "\xd3\x0c\x20\xe6\x72\x99\xf2\xef\xb2\x33\x73\x26\x3d\x7e\x8c\xf8" - "\xb1\xe0\x67\x2f\x7e\x6a\xf0\xf3\x86\x8c\x47\xc0\xd0\x71\xe9\x76" - "\x0d\x40\xcf\x51\x80\x13\x7d\xf8\x49\x03\xf8\x3d\xc2\xff\xdf\xb1" - "\x00\xff\xcf\x3a\x80\x93\xcd\x00\xff\xe9\xf4\xe1\xec\xab\xf5\x51" - "\x77\xda\x22\x7e\xeb\xf0\xf3\x57\xda\x7b\x8a\x9a\xf4\x39\xdd\xfb" - "\xda\xb2\x7c\x5d\x9a\xee\xce\xf9\x49\xf3\x93\xee\xd2\xcd\x9b\xa7" - "\x5b\x98\x98\x78\xef\x82\xc4\x45\x0b\x16\xde\xad\x5b\x78\xd7\x92" - "\x45\x77\x2f\x59\xb8\x58\xf7\xd2\xce\xfc\x9c\x3b\x13\x9f\xcf\xd6" - "\x6d\xcd\xc9\x7f\x69\xc7\xe6\xfc\xec\xcb\x35\xe6\xea\xfe\x88\xb4" - "\x99\x5e\xe0\xdc\xf7\xe7\x74\x34\xa8\x0f\x75\x80\xfa\x1d\x13\xf8" - "\x72\x12\xa4\x8f\xff\x9f\xea\xd9\x19\xa0\x7a\x46\x07\xaa\x27\xaa" - "\x40\xb5\xa6\x1e\x54\x69\xa9\xa0\xda\x8d\x69\x26\x2d\xa8\x0a\x36" - "\x80\xea\xa5\x74\x50\x65\xf7\x8d\x4d\xdb\xeb\x12\x69\x8d\x26\x50" - "\xbd\x79\x14\x54\x75\x65\xa0\xaa\x3a\x25\xd2\x7e\x8c\x30\x3f\x2c" - "\xfe\xc7\x34\xfa\xaa\xff\x26\x12\x07\x8c\xff\xa7\xee\x3c\xfa\x25" - "\xd0\xf1\xf5\xdf\xd7\x7f\x5f\xff\x7d\xfd\xf7\xf5\xdf\xd7\x7f\x5f" - "\xff\xfd\x0f\xff\x7d\xae\xd6\xc0\xaf\x30\xca\x1b\xb2\x6a\xe3\xec" - "\xaa\xc8\xa3\xb4\x2e\x04\x68\xbf\x13\x68\xf9\xf9\x22\xd2\x47\xb9" - "\xa6\x24\x6a\xd9\x41\x00\xda\xb3\xf9\xda\x01\xe6\xa0\xfd\x98\xa9" - "\x3f\x04\x68\x8f\x07\xa0\x75\x2a\x88\x67\x83\x1d\x72\x35\x62\x4d" - "\x12\x73\x52\x3e\xad\x6b\xc2\x74\x23\xa6\x17\x8f\xb3\xce\x85\xaf" - "\xa9\x22\x9c\xa9\xb3\x38\x3d\x87\x03\xf0\x10\x8e\x16\x4c\x73\x8e" - "\x83\x23\x4a\xa6\xcb\xa9\x06\x15\xe1\x1b\xb4\x42\x9c\xd3\xda\x7a" - "\x1d\x96\x75\x62\x9b\x12\xa4\x35\x41\x03\xcc\x0a\x61\xed\x26\x37" - "\xed\x0d\x55\x9d\x81\x88\x4f\xf1\x5b\x8d\xdf\x1f\x83\x58\xc3\x49" - "\xe5\xe2\x09\x07\x96\x55\x0d\x59\x23\x12\x47\xcb\x22\x6e\xbe\xbf" - "\x1a\x22\xde\x75\xaa\x5b\xd5\x02\x36\x26\x42\x82\x55\x23\xec\x06" - "\x19\x56\xe4\xa9\x57\x48\x79\xd7\x60\x9e\xc9\x3f\x4f\xf3\xaa\x94" - "\x17\x85\x79\x75\x01\xf4\x69\x6c\xc3\x6e\xc0\x7a\x88\x16\x9d\x1d" - "\xbf\x69\x3f\x92\x44\x1b\xd1\xd4\x8e\xf0\x16\x82\x4f\xd5\x31\xf7" - "\x3a\x1d\x70\x5a\x88\x77\x08\x9b\xd6\xd6\x24\x60\xf1\xf7\x0c\x2a" - "\x2f\xfd\xd6\xd1\xfa\x28\xfa\x2d\xd5\x3b\x6d\xc8\x1a\x19\xe5\x4f" - "\x13\x80\x94\x37\x1d\xf3\x12\xfc\xf3\x7e\x91\x28\xe5\xdd\x80\x79" - "\xa9\xfe\x79\x2a\xb9\x5c\x1c\xe6\x65\xca\x79\x63\xd7\xd7\xe0\xf0" - "\x03\xc2\x71\x20\x32\x09\x3f\x93\xb5\xb2\xec\x0a\xe2\x98\xd7\xfc" - "\x0d\x5a\x47\xf5\xd3\x5e\xaf\x95\x81\xcd\xe4\x02\xdd\x8d\x60\x3e" - "\x0d\x91\x3d\xb4\x4e\xa7\x7a\x17\x68\xcd\x06\xe6\xa2\xbd\xe7\xdd" - "\x8e\x01\x30\x3b\x58\x3f\x9d\x35\x54\x7a\x11\xb4\x74\x77\x63\xe9" - "\x76\x88\x6b\x2f\xfe\x4b\xd0\xb5\x41\x5e\x35\x03\xf3\x0c\x2a\xdb" - "\x07\xdd\x0d\x7d\x60\x6e\xf0\x2f\x6b\x9e\x09\x71\x5d\x74\x6e\x91" - "\x15\xa2\x89\x8e\x76\x9d\x1b\xdc\x91\x3f\xed\x2d\x7e\x03\x34\xe6" - "\x59\xa0\xee\xca\x6a\x95\x68\xb9\xa6\x9e\x68\x29\x3b\x0b\xda\x1f" - "\x6c\x45\xd9\x9f\x25\x7a\xff\xbd\xf7\x9d\x5d\x2e\x75\x5b\xdc\x4a" - "\x68\x8b\x3b\x05\xed\x71\x4b\xa1\xdd\x94\x0a\xd5\x67\x21\xaa\xcd" - "\x95\x0c\xed\x9a\x87\xd0\x36\x52\xc1\x36\x80\xbf\x75\x1e\x84\x71" - "\xf2\x7d\x17\x67\xe0\x9a\xf2\xba\x17\x40\x6b\x17\x38\x51\x9e\xd7" - "\xd4\xc9\x7b\x08\xe8\x39\x58\x3b\x0a\xbe\x01\x71\x48\x5f\x3f\xd2" - "\x72\x2f\xd2\xd2\x15\x1f\x07\x74\xb7\xcb\x64\x5b\xbd\x1b\x34\xc5" - "\x10\x11\xc2\x26\x62\xf9\xfe\x63\xd4\xa9\x43\x07\x58\x3f\xe9\xd6" - "\xe0\xee\x0c\xb4\xaf\x28\x0d\xd6\x7d\x58\x5a\x97\x37\x60\xfe\x3e" - "\x68\x06\x77\x64\xd0\x7a\xe4\x3e\xcc\xd3\xc9\x79\xb4\xaf\x9a\xf6" - "\x4b\x2f\x88\xa5\xbb\x7b\x52\xe0\xc3\xe1\x7e\x5a\xf3\x37\x40\xeb" - "\x30\x09\x5f\xb4\x09\xc2\xb0\x3d\xe1\x48\xcf\x67\x8d\x98\x7e\x0b" - "\xc2\x61\x79\x94\xff\xff\xc5\xf7\xda\xb3\x1b\xd6\x3b\xbd\x37\xac" - "\xbf\xe8\xfd\xde\xfa\x41\xf6\xbd\xf5\x9f\x7b\xbe\xb7\xfe\x33\xf3" - "\x4e\xd0\x7a\x6e\x58\xef\xe8\x36\x70\x19\xc4\x74\x1b\xce\xd1\xfa" - "\x3d\x2d\x9d\x65\xbe\x71\x3b\xca\xde\xfd\x31\x94\xe4\x40\x9c\x37" - "\xe2\xdf\x6a\x6d\xee\x3f\xc0\xc6\x62\x60\xf8\xbb\x29\x58\xfb\x06" - "\x23\xff\x23\x4e\xe8\xac\x96\xda\xd4\x6b\x57\xbf\xcb\xd7\xc4\x39" - "\x22\xda\xe2\xf0\x33\x03\x3f\x3a\xfc\xc4\xb3\xc8\xff\x88\x47\x5e" - "\x99\xa7\xee\x51\x01\xed\x1b\x58\xe0\x05\x15\x8a\xc8\x89\xf4\xc7" - "\x84\xe0\xdb\x0c\x6f\x65\x8f\xfd\x5b\x16\x28\x1d\x1a\xd2\xd3\xfe" - "\x6d\x07\xf9\x13\xf2\x2f\x43\xd6\x29\x29\x76\xf5\x4f\x63\xb8\xee" - "\x1f\x60\x4e\x16\xd9\x63\xc7\xf4\x7e\xe7\x6e\xbd\xca\xb1\x5b\xaf" - "\x1e\x8c\xec\xf9\x6f\x84\xc9\x42\x98\x34\x89\x87\xfd\x84\x0b\xed" - "\xc4\x31\xc5\x0d\x61\x88\xd3\xf0\xb3\x2f\x7a\x35\x07\x0f\xb0\x53" - "\x08\x57\x35\x8a\x0b\x71\x23\x1e\xe4\xff\x94\x26\x39\x0d\x79\xdd" - "\xb7\x1f\xe1\xa8\xbc\xcd\x95\x42\x7e\xd7\x6e\xcb\xed\xa7\x75\xb3" - "\x91\x6c\x44\xd4\x87\x30\xb4\xa7\xd2\x31\xc5\x05\x93\x86\xac\x90" - "\x4e\xb8\xa9\x1c\x9d\xa1\x85\xe5\xfe\x9b\x99\xf5\xe8\x97\x60\xf5" - "\x10\xd3\xab\x68\x0f\x7d\x1b\x96\x17\x75\x4f\xd5\xca\x34\x52\x1d" - "\x7c\x0f\x3d\xd1\x89\xfa\xd0\x96\xeb\x82\x29\xf5\x10\x86\xe5\xd6" - "\x12\x3e\xc2\x85\x7a\x60\xc7\xb6\xfe\x77\x5b\xae\x03\xbc\xcc\x0f" - "\xa7\x5d\xc2\x97\xe1\x87\x0f\xd3\x19\xe2\x23\xfd\x6b\xc7\x32\x53" - "\x9a\x38\xbe\xc7\x7f\xe6\x25\x7c\x2e\xd0\xe8\x38\xbd\x4f\x12\x0e" - "\x7e\x26\x04\xe2\x6c\x2d\x7a\x10\x06\x60\x6a\xab\xc3\xac\x0f\xe3" - "\xeb\xf7\xb0\xfc\x3b\xa5\xfd\xe1\x6c\x30\x23\x6c\x2a\x5f\xbb\xf7" - "\x20\xd0\xb9\x09\x08\xf3\x7d\x36\xa8\x0f\x9b\x32\x00\x1a\xa2\x99" - "\xf6\xef\x10\x9d\x4a\x59\x3e\xbe\xfc\xc9\xa5\xf0\x64\xea\x8a\xd4" - "\xa5\xb0\xea\x81\x65\x4b\x21\xf1\xde\x79\x89\x77\xdd\xb3\xf8\x2e" - "\x48\x7f\xea\xf1\xa5\x90\xbe\x7a\x29\xac\xc5\x4f\xc6\x43\x2b\xf0" - "\x61\xd9\xd2\x3b\x13\x1f\x9e\x97\xbe\x6c\xc5\x72\x78\x6c\xdd\xc2" - "\xc4\x85\x0b\xe1\x81\xe5\x2b\xef\x4c\x4c\x94\xbe\xef\x4c\x24\x90" - "\x67\x16\x2f\x5f\x3b\x2f\x3d\x7f\x9b\x71\xdb\xbc\xd5\x2b\x96\xc1" - "\xf2\xe5\x4b\xd3\x03\xfa\xc6\x04\xcf\x17\x1e\xe2\xad\x93\x5d\x48" - "\xa3\x33\x12\xe0\x10\xca\x1c\x3f\x03\x7c\xef\x05\xc4\xec\x3b\x44" - "\xb2\xe2\xfe\x72\xea\x29\xb4\x73\xcd\x90\x35\x9a\xe4\x5f\x4e\x3c" - "\xa3\x73\x0a\xce\xc0\x75\x07\x31\xef\x13\xc9\x47\x87\x63\xfe\x51" - "\xff\xfc\x69\x16\xcc\xff\x2b\xad\xe5\xb7\xe1\x07\xf9\xec\x44\xdf" - "\x87\xfc\x74\xc0\xa0\x39\x23\x9c\xef\xa5\x44\x19\xd3\x1a\x57\x2c" - "\xdb\xaf\xb0\xf1\x3e\x5a\x0b\xab\xdb\x05\x61\xe7\x21\xfa\x97\xdd" - "\xc6\x14\xda\xef\x02\x36\xa3\x84\xe3\xe2\x28\x8e\x48\x69\x3f\xa6" - "\xfd\x10\xad\x33\xe6\x78\x62\x12\x15\xfe\xc0\x4e\x78\xaa\x31\x4f" - "\xe0\x8a\x09\xef\x46\xbf\x80\x7e\xfb\xb4\xd7\x9c\x00\x2c\xf2\xa7" - "\x76\xef\x48\x02\xef\x63\xb0\x9c\x5e\xd6\xe3\x6a\x5a\xc3\x6a\x40" - "\xb8\x1f\xa4\xa9\x68\x0d\x28\x5f\x0f\x0a\xd1\x46\xd4\x67\xa7\xb7" - "\xb2\x2d\x81\xef\x55\xe6\x69\x31\xcd\x2c\x12\x9f\x2b\xdb\xe6\x30" - "\xb3\xd8\xbf\x8c\x69\xef\x53\x1a\xca\x38\x8c\x6c\x91\xef\xcf\xc4" - "\xba\x91\x17\x73\x90\xbe\x5e\x0f\x95\xbf\xc0\xcb\x4f\xc6\xb4\x08" - "\x84\x9d\xe3\x8d\x6c\xbb\x1d\x75\x86\xd2\xb0\x5f\xbf\xee\x38\xe2" - "\xbb\x83\xf6\x8e\xb3\xa8\x98\x18\xfc\x3d\xb7\x75\xd7\x00\x3f\x03" - "\xdc\x8e\x79\x5e\x33\xe2\x1c\x19\xad\xbf\x97\xca\x62\x5d\x9a\xa1" - "\x11\x3d\xf6\xa5\x31\xa7\x28\x26\xf0\x10\x3d\x17\x46\x61\x3a\xa8" - "\x4e\xb2\x67\x94\xc5\x00\xca\x29\x62\xc8\x3a\x6d\x5d\x80\x9c\x72" - "\x11\xcf\x1c\xe4\x7b\x2f\xe2\x68\xf7\x0e\x62\x1d\xf8\x8c\x78\xd5" - "\x12\x5e\x19\x87\x53\xe8\xc1\xb4\xba\x00\x3d\xd8\x83\xb8\x2f\x2a" - "\xf2\x9b\x03\xf2\xb3\x31\x7f\x58\xca\x47\xbb\x9a\x76\x32\xa0\x7e" - "\xa2\xcd\x8b\xf5\x3b\xd1\x6e\xc2\xb0\xbe\x8c\x43\x14\xaf\x8d\xc2" - "\x4f\xd7\xf8\xc3\x4f\xc7\xd8\x20\x9a\x7c\x09\xf9\x44\x0e\xdf\x28" - "\xe9\xaa\xa8\x7f\x7a\x52\x00\xbc\x1b\xe1\x27\xd3\x19\x1b\xf8\x7d" - "\x2d\xc2\x4c\x46\x9f\x44\x7b\xae\x4f\xb5\x15\x53\xfc\x36\x3d\x2b" - "\x00\xbe\x0c\xe1\x6e\x24\x3e\x72\x1e\x5c\xe0\x3c\xc8\x90\xe2\x2d" - "\xb2\x05\x2d\x96\xa9\x0f\x28\xd3\x82\x65\x66\x7b\x05\xdf\xc2\x86" - "\x06\x83\x96\xe9\x0c\x28\x33\xc0\xe5\x2f\xea\xd1\x90\xbe\xc8\x65" - "\xb8\x8f\x19\xf1\xc3\x41\x6d\xc3\xb8\xec\xda\x18\x7f\x1c\xb1\x03" - "\x58\xef\xed\xfb\x85\x1d\x5f\x83\x32\x5f\x88\x69\x1f\x23\xde\x79" - "\xa4\x27\xa4\xcb\x36\x87\x0b\x7d\x60\x5a\x94\xe8\xcb\xaf\xdd\x1e" - "\x5d\x0c\xf4\x7b\x1e\xfd\x26\xdc\x6c\x64\xa5\xa4\xe3\xd7\x6e\xc7" - "\x6f\x4a\xe7\x75\x92\x6d\xb1\x91\x47\xbd\x02\xe7\xb5\xaf\xa3\x0d" - "\xaa\xf1\xd9\x23\xd5\xf1\x07\xda\xc7\x8b\xfa\x79\x3b\xfa\x57\xa0" - "\xbd\xc8\x98\x9e\x84\xe9\x5d\x52\xfe\x47\x04\x8f\xbf\xef\x94\x7e" - "\x93\x5e\xde\x2e\xe9\x25\xea\x79\x2c\x3f\xb7\x41\xe8\xba\x28\xef" - "\x15\x7a\xbd\x0c\xf3\x7e\x84\xdf\x2b\xf0\xfb\x75\xfc\x7e\x0c\xbf" - "\xb7\xd3\xd9\x0b\x66\x0f\xc6\x13\xe2\xf9\x59\xfc\x7e\x1c\xbf\x57" - "\xe0\xf7\x5a\xfc\x5e\x44\x76\xe9\xd8\xa1\x87\x00\x9d\x18\xf0\x0a" - "\x5b\x9c\x2c\xe4\x11\x1b\x2f\xd9\x87\xb0\xcf\x0b\xbe\x34\x26\xd2" - "\xd4\xe8\xd7\x7d\x69\x23\x69\xc4\x97\x74\xc4\xcf\xcf\x0a\x91\xec" - "\x3a\x5c\xc8\x45\xc0\x78\x45\x39\x49\x76\x52\x9a\x80\x53\x29\xeb" - "\xb4\xc3\xb5\x27\x4b\x9d\x8c\xe1\x77\x2b\x3f\xb7\x01\x62\xdb\x91" - "\x27\x18\xd7\x5c\x5b\x47\x7c\xf2\xc9\xfb\xda\x44\x85\xbc\x31\xae" - "\xbd\x0e\x02\x6c\x29\x09\xe5\x9d\xcc\xe5\x8d\xbc\x93\x69\x26\xfa" - "\xb1\x7f\xa1\x3e\x6b\x92\x68\x43\x4c\x06\xfa\xf6\x01\x9f\x6f\xbe" - "\x2e\xcd\x1f\x4f\x4c\x06\x96\x69\x90\xfa\xb2\x51\x3d\x23\x7d\x09" - "\x33\x90\x0d\x5d\x87\xf1\xff\x2f\xf9\x59\x43\x94\xe7\x8c\x38\x91" - "\x49\x75\x86\xe5\xf2\x3c\x8c\xff\xaf\xe9\x95\xf3\x40\xec\x93\x72" - "\x86\x19\x79\xde\x31\xb9\x1c\xab\x7c\x8f\xe3\x75\x62\xff\x48\xf1" - "\x02\xf5\xfb\xd8\xff\xf6\x23\xcc\x49\x3b\x4c\x89\x09\x79\x76\x51" - "\xf9\x4f\x1d\xf3\x2c\xa0\xbe\xc5\x02\xe1\x36\xf7\x29\x58\xe3\x66" - "\x9e\x79\x00\x11\x36\x77\x32\xcc\x01\x98\x66\x73\x9f\xa4\xc9\xf0" - "\x59\x36\x77\x1d\xf6\xaf\x65\x94\xff\xe1\xed\xa0\x52\xe1\xb7\xf9" - "\x0e\x50\xab\x6c\xee\xc3\x98\xde\x0c\xb7\x80\x46\xf5\x70\x38\x1b" - "\xb2\xb9\x93\xf0\xd9\x08\x0f\x85\xb3\x3f\x6f\xf2\x40\xcc\xca\x7d" - "\xcc\x6c\x73\x67\xc1\x43\xfb\xbc\xcc\xe6\xee\xc4\xbc\x5c\x58\xe3" - "\xb9\xc4\xd6\x78\x86\x18\xd3\xbe\x87\xbf\x2f\xe0\xef\x3f\x33\xe4" - "\x1b\x7e\x7f\x88\x1f\x33\xb3\x61\x9c\xcc\x2a\x7e\xea\xd8\xb4\x53" - "\xcd\xef\x6b\x64\x11\xef\x21\xcf\xdf\x8b\x19\x61\xfa\x30\x16\xf9" - "\x5e\xf4\xc8\x08\x7e\x57\xbe\x37\x95\x3f\x97\xbf\xa7\x43\x3c\x31" - "\xf3\x71\xd0\x40\xf4\xdb\xdc\x7d\xb0\x09\xfd\xcd\x9a\x9d\x0e\x46" - "\xb4\x4f\xdd\xc3\x60\xcd\xce\x0f\x19\xfa\xba\xe8\x35\x3b\xcd\x0c" - "\xf3\xb4\x88\x0f\x63\xd6\x01\xac\x03\xcb\x46\xbe\x37\x93\xe3\x2b" - "\x7f\x2f\x05\x61\x1d\x04\xa7\xc4\x43\x38\x08\x76\x8d\x07\xa2\x11" - "\x3e\x65\xa4\xe2\xbd\x44\xfc\xa4\xe3\xc7\x82\x65\x5f\xf5\x5a\x63" - "\x7f\x49\xfd\x1a\x96\x6f\xc2\xe7\x63\x97\xf8\xf9\x0a\xa7\x08\x7e" - "\x32\xc2\x37\xa1\xcc\x53\x87\x04\xbd\x3d\x9c\xde\xca\xf7\x6c\x97" - "\x44\x3b\xba\xa5\x76\x74\x51\xba\x13\x75\x1d\x7f\x3b\x9c\x22\xef" - "\x02\x96\x5b\x37\x24\xe8\x72\x30\x6d\x33\xf5\xc9\x61\x6b\x3c\xcc" - "\x42\x3c\x44\xbe\x5a\x88\x8f\x34\xe6\xc1\x3a\x1c\x2c\xa2\x19\x46" - "\x2a\x9a\xb1\xff\x6a\x9e\x3d\xc2\xa8\xaf\x6d\x4e\xbc\xc4\x71\x37" - "\x2f\x40\x3c\x1b\x86\x08\xa7\xb6\x39\x91\x95\x37\xa7\xb8\xd5\x3a" - "\xe4\x07\x73\xad\x71\xef\x71\x6f\xda\x49\x67\xa0\x7c\x04\x09\x16" - "\x8b\xca\x66\x32\x62\x3b\xab\x10\x67\x16\xe6\xc3\xb5\x58\xd7\x87" - "\x88\x37\x91\xea\x63\x15\xcd\x29\x88\x73\x29\xe2\xca\x22\x9a\x86" - "\xad\x10\x83\xcf\xe9\xc3\x9c\xbe\x66\x83\xb7\xbc\xb9\xd6\xab\x6d" - "\xb6\xc8\xfa\x43\xba\x23\xf8\x46\x3a\xf3\x36\xa5\xc5\xc8\x7a\xe2" - "\x29\x6f\xce\xbc\x03\xe8\xfe\x22\xe6\x26\x5d\x59\x00\x06\x55\xb7" - "\xf3\x24\xf2\x5a\x0b\xdd\x86\x66\xb8\x1d\x68\xec\xe5\x84\x6e\x67" - "\x1d\x3e\x1f\x04\xa2\xaf\xdb\x59\x06\x5d\x03\x87\x61\xb5\xc1\xb9" - "\xc7\xa3\x6d\xb6\x77\x0d\xac\x02\x2c\xff\x21\xd2\xe8\xdd\x68\xd0" - "\x58\xba\x0d\x4e\x7a\x36\x77\x0d\xa0\x7e\x7a\x98\xc7\x5d\xde\x9c" - "\xee\xd6\x36\x3b\x56\x5f\x64\x8e\x55\x03\x96\x70\x4c\x1b\x89\x56" - "\x31\x77\xb4\xc9\xcc\xba\x06\xaa\x60\xe3\x45\x50\x75\xe9\x9b\xb9" - "\x9e\x6e\x34\x18\x80\x97\xbf\xe8\x8e\x7e\x76\xc0\x02\xcf\xea\x61" - "\x2a\xc2\x5f\x20\x9d\x65\x53\x2d\xd0\xd9\x97\x0b\xab\xce\xb9\xc3" - "\x56\x5f\x1c\x61\x9d\x99\x75\xd0\xa5\xaf\x23\x7e\x18\x68\x8c\xb2" - "\xea\xdc\x20\x5b\x7d\x71\x88\x75\xe9\xdf\x86\xce\xcc\x66\x58\xf9" - "\x97\xd6\x68\x4f\x45\x73\xa6\x37\xa2\xd9\xe2\xad\x68\xae\xf5\x44" - "\x34\xdb\xdd\x15\x48\x4b\x44\xb3\x83\x55\xbe\x9f\x89\xfc\x8b\xe0" - "\xb2\x88\x7c\x7f\x23\xfe\xd6\x71\xf9\x6a\xdf\x37\xb0\xf2\xf7\x6b" - "\x47\x2a\xde\xb7\x70\xbd\x8f\x78\xdf\x60\x73\x93\xfe\xbf\x5f\x8b" - "\x70\xb5\x42\x47\xde\x6f\x12\xba\xff\x7e\x23\xc9\x15\x61\x8f\xe1" - "\xa7\x15\x3f\x3d\xac\xf2\x03\x1d\xe2\x9a\x46\x78\xbd\xe5\x1f\x24" - "\x7a\xb5\x1f\xa0\x3d\x7c\x40\xe7\x02\xab\xbb\x9d\x87\xc1\x83\xfe" - "\xb8\xdb\xe9\x81\xd5\xdb\x5d\x28\x5b\x94\x81\xc9\x83\xfc\x3c\x05" - "\x1b\xb7\x83\xd9\x66\x3a\x05\xec\x17\xb5\xc4\x8f\xe8\xd5\xdb\x3f" - "\x64\xde\x8a\x0f\x12\x29\x7f\xf5\x76\x33\x8e\xab\x10\x4f\xc4\x07" - "\x29\xde\xca\x0f\x32\xa5\xf8\x0a\xe9\xf8\x60\x13\xd1\x31\x32\x94" - "\x40\xfb\xdb\x34\x98\x6f\xc0\xb4\xd3\xd4\xdf\x78\x49\xef\xca\x3f" - "\xb0\x33\xed\xcf\x52\x56\x85\x33\x87\xe7\x65\xe0\x3a\xe0\xbd\x8f" - "\x31\x1a\xb7\x6d\x32\x41\x13\xb7\x29\xcf\x8d\x16\x16\xf1\xb3\x14" - "\x56\xf1\x81\xdd\x5b\xf9\x6f\x56\xc4\x13\x46\xf7\x9e\xb0\xf2\x7f" - "\xb3\x08\x9d\xf9\x98\xdb\x1e\xab\xf8\x37\x8b\xff\x1c\x41\xf0\xf9" - "\x81\x21\xeb\x8d\xcd\x76\xe8\xd6\xf3\x73\xda\xac\x37\xb6\xda\xc1" - "\x96\x2c\xfd\xee\xb4\xc3\x4f\xf9\x3c\x11\xf9\x38\x43\x29\x5c\x77" - "\x16\xbe\x69\x41\x7e\x00\xfe\x8e\xc2\xdf\x65\x6b\xe6\x60\x9b\xcb" - "\x3d\x69\x28\xef\x21\xf2\x37\xcc\x9a\x84\xf1\x09\xa4\x60\x5b\xb5" - "\x6c\x28\x21\x8a\x45\xfe\x7a\x21\x1b\x89\xa3\x31\x68\x34\x3e\x4f" - "\x45\x9e\xc6\xe3\xf7\xf4\x83\x5f\x40\x2c\x7e\xe2\x0e\x5a\xbd\x16" - "\xf2\xc7\xf8\x3b\x91\xed\x88\x8b\xac\x2e\x82\xb9\xd1\x4e\x71\xee" - "\x70\xf4\x9e\x18\x1a\x8b\xc5\xd2\x6f\x66\xfd\x20\xa1\xf1\x0b\xf9" - "\xec\x61\xac\x2f\xc8\x5d\xa3\x9e\xa1\x04\x35\xd1\x29\xd3\x42\xb4" - "\x21\x9d\x33\x91\xce\xba\x27\x76\xa6\x00\xdd\x63\x13\xcc\x7f\x0f" - "\x59\xbf\x39\xda\xfe\x10\xf9\x27\x65\x9e\x84\xc8\x77\xca\x7c\x0a" - "\x35\x4f\x40\x36\xee\xf9\x82\x0d\xd4\xe4\x89\xfd\x74\x66\x37\xfb" - "\x6f\x1c\xc3\x58\x4a\x71\x6c\xbe\xc6\xe4\x62\x36\x07\x6b\xa5\xfb" - "\x70\x68\x1c\xdc\x88\x30\xa5\x6e\xe6\xa5\x71\x31\x8d\x89\xe9\xec" - "\x36\x6f\xc5\xaf\x63\x59\xc5\xaf\x63\x06\x8b\x98\xfb\x10\x1f\xc7" - "\xce\xd0\xdb\xe1\xbe\x4c\x21\x9b\x66\x03\xf6\x83\x7d\x83\xda\x5f" - "\xc7\x20\xee\x69\x84\xbb\xdb\xc0\x5a\xbd\x11\xbf\x8e\x43\xb8\x5a" - "\x3b\xfc\xe9\xb0\x72\xae\x0f\xfb\xb4\x81\xb2\x03\xd4\xaf\xcd\x38" - "\x6a\x87\x9b\xcb\xc7\xcc\x25\x89\xb7\x97\x16\xbf\x7d\x15\x2a\xf0" - "\xdf\x25\x42\x3b\x32\x52\x82\x67\xfb\xfa\xc5\x66\x07\x9d\x67\x67" - "\x2e\x81\x19\x28\x87\x6f\x9e\x85\x99\xb3\xcc\x26\x76\x86\x59\x67" - "\xb4\xfc\x60\x97\x0b\x63\x88\x99\x73\xed\xf0\xfd\xde\x50\x7c\xf3" - "\x7e\xc1\xfa\x10\x47\x6d\x0d\xc6\x81\xd4\x6e\xe2\xdb\x1a\x13\xf3" - "\x62\xfb\x3e\x21\x1b\x6b\x2c\xa2\x58\x78\xa6\x41\xe6\x43\xa8\x3d" - "\x7e\xac\xfc\xd7\xf1\x22\x5e\x9c\xd9\xc3\xac\x0c\x5a\x6f\xa2\xb9" - "\xbf\x99\x27\x78\xcc\x54\xfe\xbe\x65\x10\xfd\x07\xcd\x91\xd0\xd9" - "\x73\x05\x71\xcc\x85\x38\xdb\xed\x70\x5b\xa2\x34\x26\x73\xda\xdc" - "\xcb\xc9\x97\x58\x42\xcd\xad\xfa\xf0\xdf\xe4\xe8\x9e\x81\x7d\x2d" - "\xfa\x22\xa6\x3d\x71\xb8\x54\xc8\xd9\x45\x78\x69\x0f\x6b\x1f\xe6" - "\x17\x38\x59\x3f\x2b\x3f\x51\x4f\xf1\x07\xed\xa7\xc3\xb4\xcf\x50" - "\x7f\x59\x6b\x3e\xd1\x74\xd3\x67\xad\x37\x0d\xc3\x19\x8c\x07\x69" - "\xcf\xaa\x18\x9f\xdd\x74\xaa\xcd\x08\xd2\x98\xef\xa6\x0d\x76\x48" - "\xe8\x94\xe9\x42\x9f\xc1\x90\xb7\x58\x3f\xf9\xbb\x01\xa0\x79\xb7" - "\x82\x62\xe6\x42\x5a\x0d\x08\x5b\x2e\xb7\x81\xda\x27\xda\x75\x53" - "\x83\xb2\x5d\x48\x83\x03\x63\x6b\xce\x83\x82\x9d\xa0\xe5\x67\x61" - "\x79\xa8\xef\x58\xce\xdb\x42\x6d\xe6\x6d\xc1\xb8\x82\xfa\x13\x9b" - "\x7b\x11\xc6\x47\x3c\xbd\x16\x71\xe1\xf8\xf7\x5b\x8b\x45\x4c\x75" - "\x13\x3f\x93\x26\x68\x6c\xa4\x6d\x4e\x31\x5f\x82\x9b\xcc\x5e\x76" - "\xfa\x0c\xdc\x5c\x88\x7c\x0a\xa3\x6f\xde\x17\xbb\x50\x77\xb5\xbf" - "\x73\x52\x1f\x6c\x2b\xbe\x88\x7e\x9b\xc3\x5e\x8b\xb0\x7d\x08\x93" - "\x2d\xc1\x66\x8b\x39\x61\xfe\x3d\x99\xbe\xb1\x4f\x5e\x8a\x7a\x5b" - "\x4c\xf3\x18\xc8\xe7\x4c\xf9\x99\xe1\x33\x7e\x27\xb1\x8a\xdf\x05" - "\xdd\x5b\x4c\x7e\xd5\x2b\xd9\x21\xd6\x73\x03\xe9\x91\x79\x27\x7c" - "\x03\x75\xf2\x93\xd2\x12\xb8\x8e\x74\x8c\x45\xfc\x3a\x51\xf0\xfd" - "\xe6\x0e\x66\xb5\x00\xed\x7f\x35\x14\xc1\x37\xd1\xf6\x12\xce\xc2" - "\xcd\x1f\x6f\x2a\xd6\x21\xad\x00\x35\xe7\x81\xfa\xc9\x3f\x23\xfc" - "\x5c\xba\xa7\xac\xf1\x3c\xe9\xe2\xcd\x6e\x59\x17\x87\xac\x3a\xed" - "\x78\x3e\x01\xf9\xda\x2a\xc6\x15\xba\x42\x9a\x63\x3b\x0d\x3a\x3a" - "\x6f\x34\x0c\x3f\x2a\x4c\x7b\x8c\x7d\xc1\x66\xd0\xd9\x84\xc8\x6b" - "\x8c\x4f\x75\x55\xf8\xdd\xca\x3f\x56\xb0\x48\xcf\xc7\x10\x2e\x85" - "\x7d\xe1\x21\x18\xf4\xd9\x3a\xf4\x91\x2a\xb2\x13\x8c\x91\x75\x65" - "\x76\x78\xc0\x24\x64\xa3\x4b\x27\x5c\x21\x68\x38\xc6\xf8\x7e\xd2" - "\xcf\xb1\xbd\xba\x73\xba\x52\x15\xd1\xf1\x4b\x6e\x17\x88\xab\x51" - "\x2d\x7c\xb3\x17\x69\x3d\x64\xf5\xea\xd1\x0f\xeb\xbd\x95\xdd\x4d" - "\xfc\xb7\x94\x47\x74\x78\xb1\xfe\xe0\xf8\x4f\x1c\xa6\x3d\xf1\x7d" - "\x30\x2b\x4d\xe0\x39\x51\xdf\x7a\xe3\x59\x7a\xe6\x67\x69\x38\xb5" - "\xb6\x26\x5b\x7d\x8a\x38\x83\x14\x61\x44\x9c\x3f\x6b\xc5\x20\xd6" - "\x31\x64\x9d\x95\x66\x87\xdb\xb5\x62\xbe\xd1\x16\x74\x7e\x92\xf6" - "\x3b\x93\xed\x74\x35\x80\x64\xd3\xb7\xd0\x79\x8f\x4e\x6c\x57\x93" - "\x47\xfb\x7e\xab\xe4\x67\x69\x0c\x76\xcd\x69\xb8\x45\xd3\xad\xe7" - "\xfa\xad\x66\xea\x59\x47\xfc\xce\x48\xc4\xbc\xb1\x9f\x59\xbd\xf8" - "\xe9\xc7\x8f\x53\x3c\x23\x71\x30\x1b\x29\x98\x9d\xc5\xf9\x36\x98" - "\x85\x63\xa2\x5b\x34\xde\x08\x94\x49\x39\xc9\x68\x96\x9d\x0d\xc6" - "\xab\x31\x16\xe1\xbf\x1b\xb7\xd3\xd8\x62\x76\x14\xf2\xbf\x5e\xc8" - "\x81\x70\x80\x0a\x6d\x91\x78\xce\xcc\xf5\xcc\xd5\x5e\xea\x44\x9a" - "\x67\x27\xb7\xd7\x3b\x41\x77\x1b\xb5\x7d\x36\xc5\x1c\xcc\x89\xbc" - "\xa7\xef\x82\x7a\xe6\x68\x6b\x70\x03\xcd\x4b\x23\xae\x0c\x3b\x58" - "\x53\xc5\x38\xe5\x44\x0f\xe1\x93\xf4\x81\xc9\x6d\x17\x3c\xb6\x35" - "\xe9\x8a\x54\x84\xeb\x87\x34\x27\x41\x63\x26\xdf\x5c\xcf\xec\x83" - "\x68\xe3\xf7\xd3\xf9\xa9\xe7\x61\xf6\x1f\x08\xbe\x4d\xcf\xcf\x61" - "\x1b\x38\xc8\xfb\x83\xd9\xc7\x91\x5e\x97\x74\xde\xc4\x00\xed\xa5" - "\x27\x7c\x38\x8e\xea\xef\xd2\x3b\xc0\x83\x6d\xe5\x7b\xed\x51\x3e" - "\x25\x03\xcc\xf5\x61\x91\x4b\xc3\xeb\xcf\xe3\x67\xa0\x39\xa3\x8d" - "\xa8\x0f\x28\x2b\x1c\xf7\xba\xb0\x2e\x63\xe0\x59\x9e\x8a\x33\x64" - "\x25\x9a\xe3\x23\xda\xe2\xb9\xbf\x6c\xf2\x22\x5f\xfc\xe5\x15\xaf" - "\x15\xb2\xba\x65\x9d\xbf\xac\xe2\x31\x76\xb9\xa5\x1e\x3f\xc7\xf0" - "\xd3\x2a\x9e\x95\x9f\x5b\xca\x14\xbf\x7b\x86\xac\xb7\x60\xff\xa7" - "\x8b\x15\x32\xa0\x34\xa4\x91\x74\xe3\x33\xec\x5f\x70\xfc\x4e\xef" - "\x28\x28\x9d\xf4\x98\xd2\xbd\x18\xab\x20\x6f\x0f\x63\x7e\x0c\xd9" - "\x28\x9d\x5d\xa7\xcc\x1f\x3d\xa3\x04\x6e\xb9\xc8\xe7\x1c\xf6\x94" - "\x97\x93\x7e\x62\x99\x23\xd1\xee\xf2\xf2\x21\x6b\x3c\xc8\x3c\xc4" - "\xb4\x7e\xca\x0f\x1e\x33\xc4\x27\x8c\xc6\x56\x18\x6f\x92\x7c\x06" - "\xe0\xd6\x24\xf4\x4b\xe8\x8f\xbb\xc5\x99\x5a\x70\xeb\x22\x7a\x46" - "\x7f\xf8\x09\xfe\x4e\xec\x42\xbf\x33\x5c\xd9\x16\x37\xa2\x86\xc9" - "\xc3\x6a\x48\x71\x57\x7a\x72\xdd\x91\xff\x11\x6f\xeb\x6f\x86\x6e" - "\xf7\x4f\x81\xee\xde\x43\x1c\x73\xe8\xbc\x44\xf3\x4e\xe6\x79\x67" - "\xf8\x08\x8e\xbd\x2e\xb4\xf2\xf3\x81\xe1\x56\xde\xf6\x57\x4e\x63" - "\xaf\xbe\x91\xe3\x96\x78\xe1\x49\xab\xde\xca\xdc\xd5\x67\xe8\x0c" - "\x85\xb8\xc8\xfd\xc3\x30\xf7\xcd\x5d\x90\xd8\x30\x0c\xf1\x87\x86" - "\x21\x81\xfd\x95\xee\x73\xf0\xdd\x01\x31\xd5\x00\xda\x43\xbb\x30" - "\x0e\x73\x83\xca\x53\x81\x71\x98\x1b\xe3\xb0\x0b\x09\xe4\xff\x46" - "\xe3\xb0\x91\x11\x8a\xc3\x7e\x5d\xcf\xcf\xd5\xad\xf8\x75\xfd\x14" - "\x3d\xa8\xa2\x32\x21\x06\xe9\x33\x9f\x87\xf8\x9c\xa8\x3e\x8c\x01" - "\xb1\xcd\x76\xa9\xbd\xc8\xdf\xe2\x68\x3d\x4c\xe6\x6d\x45\x9f\xcc" - "\x2a\xba\xeb\x43\xf6\xb5\x6a\xd2\x1d\x27\xd9\x07\xb5\x61\x0f\xbd" - "\x13\x69\xbe\xd1\xa5\x29\x68\x60\x2e\x4a\x37\xce\x22\xdd\xbb\x55" - "\x4f\x75\x1f\xc3\xf4\x21\xeb\xad\xb5\x76\xf5\x4f\x42\xbe\xd7\x8c" - "\xde\x23\xc7\x03\xb7\x4d\x63\x6a\x0b\xc5\xdf\x99\x25\x6e\xe6\xb0" - "\x9d\x27\xdb\xbc\x2d\x66\x4d\x2e\x73\xeb\xf2\xe8\xfd\xd4\x6d\x40" - "\xef\xce\x68\xce\xfc\x27\x18\xbb\x5c\xee\x7d\x19\xf5\x09\x18\x9f" - "\x1b\xa2\x73\x11\x27\xc6\xff\xcc\x9c\x10\x64\x3f\x7c\xf0\x78\x9c" - "\xde\xb5\xbe\xc6\xdf\xeb\xde\xb6\xd2\x0e\xe9\x2e\xe9\x5c\xc4\x01" - "\xe1\x1f\xbf\x35\x97\xc6\xf9\xfe\x76\xfd\x2d\xa0\xfd\xfd\x83\xe5" - "\x6d\x87\x5b\x6f\x22\x5f\x7e\xdb\x25\x11\xdb\xb4\x35\x09\xdf\x7e" - "\xdb\x1f\xc5\x1c\xdd\x6d\xd8\xff\xdf\x1d\x45\xf8\x0c\xb3\x49\x27" - "\x6e\x3b\xc9\x22\xdb\x7e\x40\x70\xf3\x2d\x60\xd9\xe6\x86\x4c\x56" - "\xd1\xd6\xc4\xb8\x5d\x9c\x07\xf6\xbd\x17\x87\xe8\x9d\xac\xf3\x86" - "\xf5\x43\xd8\xd7\xcf\xc5\xbc\xc3\x54\x87\x03\x61\x90\xef\x11\xe2" - "\xdd\xda\x6d\x0e\x3b\x24\x25\x0b\x7d\xbf\xad\x5d\xcc\x1d\xdd\xd6" - "\x3e\x88\x65\x31\xf6\xbb\x76\xc8\xfa\xad\x18\x3b\xac\xea\x94\xe2" - "\x4f\xfe\x4e\x1b\xd3\xe2\xed\xb0\x86\xcf\xa7\x18\x67\x41\x9c\x51" - "\xc7\xfa\x43\xc6\x6e\x7e\xed\x4c\xf8\x11\x7f\xef\xac\x86\x1b\x10" - "\x87\x5e\xc6\x8b\xfd\xe7\x8f\x07\xd5\x4f\x3c\x81\x69\xc5\x32\x5e" - "\x84\xb9\x0e\x9f\xab\x46\x61\x44\x99\x06\x45\x99\x27\x06\xd5\xb7" - "\xff\x18\xd3\x8e\x05\x94\x69\x0d\x28\xd3\xa3\x28\x63\x91\xea\xe9" - "\x0b\x28\xe3\xf4\x2f\x93\xa0\x19\x4b\x5b\x42\x9c\x7f\x99\x84\x84" - "\x80\x32\x8b\xc7\xd2\x96\xb0\x32\xa0\xcc\x86\x80\x32\xb9\x0a\xde" - "\xd2\xfb\xe5\x44\x4c\xb3\x04\x94\xa9\x0d\x28\xd3\x24\x3f\x63\x2c" - "\xd9\x2a\xfa\x7a\xd4\x27\x94\x29\xca\xf5\x30\xe6\x63\xfb\x17\xcf" - "\x1d\x6f\x1d\x00\xea\x4c\x83\xf9\xa0\x38\x5f\x9a\x7c\x28\x8d\x29" - "\xc8\x6f\xa3\xbf\xa7\xf9\x7a\x7e\x56\x1c\xd5\x75\x06\xe6\x9c\x23" - "\x1d\x1a\xb2\xce\x89\x1d\xcb\x8f\x39\x09\xfe\x74\xce\x59\xec\x4f" - "\xe7\x9c\xb4\xb1\xfc\x98\xb3\x21\xa0\x4c\x6e\x40\x99\x62\x45\x99" - "\x26\xa9\x9e\xda\x80\x32\x4d\x01\x65\x8e\x8d\xd5\xcf\x39\xed\x01" - "\x65\x4e\x06\x94\xe9\xf3\xf1\x70\x0e\x5f\xd3\x41\xf6\x80\xe9\xf8" - "\x7c\xf7\x78\xeb\x30\x62\x64\x7d\x96\xd7\x63\x08\xbd\xbe\x7d\x4f" - "\x9d\x58\x97\xc0\xcf\xf6\xe8\x83\xdb\xf9\x39\x62\xd4\xff\xfe\x60" - "\xd8\x15\x4e\x7d\x2e\xf2\xb6\xbf\xcd\xe4\xc2\x18\xf3\xf6\x4c\x3b" - "\x24\xe6\xca\xef\x3e\xe9\x7d\x31\x3f\x0b\x8a\x8f\x2f\x6e\x4f\x11" - "\xf6\x77\x7b\x9d\x34\x27\x4b\xed\xc1\x71\xc3\xed\x75\x57\x47\xd7" - "\x1d\x8b\x88\x2e\x3a\x1b\x05\x71\xf4\x8e\x8e\x1d\x46\x69\xa5\x3a" - "\xef\x78\x40\xa6\xb5\x51\xbc\xb3\xa6\x73\x78\x1c\x74\x4e\xcd\x90" - "\xf5\x8e\x28\xc5\x78\x83\x68\x75\x36\xef\x72\x69\x02\x68\x1e\x10" - "\x34\xdf\x91\x22\x7c\xd4\x1d\x29\xb2\x3f\x09\xa9\x7f\xe5\x27\xca" - "\xbb\x31\xe6\xa3\xf7\x74\x5d\x0d\x18\x3f\xe2\x98\x89\xe8\x3e\x0d" - "\x77\x94\xf3\x78\x36\x6f\x18\xe8\xb7\xad\x78\x09\x7f\x8f\x27\xb5" - "\xa5\x95\xce\x23\xa7\x38\xa5\xdd\xf0\x39\x0c\xf2\x31\x17\xf9\xc6" - "\x3b\xce\xb5\x15\x3b\x88\xd6\x16\xf9\xfd\x36\xd2\xc2\x69\x1a\x2c" - "\x3f\x61\xa1\x77\x8c\x34\x2f\xdf\xe6\x5c\x4c\x30\xa7\x90\xb7\x4d" - "\x32\x0f\xe8\x6c\x73\x84\xad\x0b\x35\xf6\x51\xf2\x55\xd0\x30\xff" - "\x69\xa1\x3f\x73\xe3\xfd\xed\x21\x1c\xf5\x74\xee\x62\x7f\x9d\x9b" - "\x9b\xe6\xaf\x73\x73\x33\xfc\xed\x41\x8d\xf6\x30\x37\x37\xa0\x4c" - "\x71\x40\x99\x2a\x45\x99\x5a\xa9\x9e\xa6\x80\x32\xc7\x02\xca\x28" - "\xfd\x1f\xb6\x79\x6e\xcf\xe8\x38\x92\xfb\xfb\xb9\x76\xc5\xb3\xba" - "\x8e\xf7\x53\x73\x9d\x72\x1a\xbd\xf7\xc4\xb8\x93\xbf\xcb\x17\xf8" - "\xe6\xc5\x04\xf8\x28\x84\x9f\x17\xef\x4f\xc3\xbc\x24\x7f\x1a\xe6" - "\xa5\xca\xcf\x35\x62\x1c\xfc\xab\x33\x30\x4f\x3e\x97\xce\x19\xbd" - "\x07\x1e\x8b\x76\x3f\xfe\x34\xc5\x61\xd4\x3f\xf1\x35\x16\x25\x18" - "\x3b\x5e\xa4\x3b\x8e\x5d\x74\x1f\x56\x18\x9d\x97\x64\x87\xf9\xb5" - "\x38\x3e\xab\x43\x98\x01\x8c\xa7\xd6\x20\x8e\x75\x58\x7f\x3d\xd6" - "\x81\xbc\x9b\x77\x24\x80\x86\x96\x00\x1a\x3a\x14\xcf\x31\xf8\xdc" - "\xab\x68\x77\x4c\x58\x1c\x5f\x03\x85\x31\xf3\x3c\x87\x9c\x4e\x63" - "\x7a\x6c\x63\xbf\x99\xc7\x01\x29\xb4\xae\x65\xfa\x69\x98\xf7\x31" - "\xc5\xc1\x02\xe7\xfc\x19\x4a\xde\x0a\x5e\xcc\x4f\xf4\xa7\x63\x7e" - "\x8a\x3f\x1d\xf3\xd3\x7d\xbe\x66\xde\x3a\x61\x23\xf3\xb3\xd0\x47" - "\xf7\x53\x1a\xf2\x42\x17\xed\xd6\x5d\xdb\x3a\x9b\x62\xd2\xf9\x15" - "\x4e\x6c\x2f\x7b\x59\x3d\x5d\x7a\xe6\x77\xb8\xb0\xd9\x34\xff\x7f" - "\x22\x54\x4c\x15\x33\x18\x79\xa2\x56\x5a\x9b\xa4\x43\xdc\xad\xb2" - "\x8e\x7b\x2b\x4f\xd4\x7a\x2b\xba\x32\x31\x0d\xfd\xdf\x1d\x2e\x31" - "\xf6\xe8\x3c\x8a\xfa\x5c\x8f\x32\xc1\x71\xea\x82\x5f\x4a\xe3\xba" - "\xc3\xb4\x5e\x05\x7d\x0d\x9d\xb3\x16\x25\xde\x69\x2e\xd0\x2a\x6c" - "\xc5\xa9\xdb\x75\x3f\x3b\x0d\x0b\xba\x28\x5e\x23\x5f\x40\xeb\x5e" - "\xda\xdc\x0e\xa0\xb9\x10\x9b\xfb\x2c\x8f\xa9\x31\xbf\x53\x2a\x9b" - "\xaa\x28\xeb\x90\xe6\x2a\xfa\x29\x6f\x81\x1b\x34\x6d\x4e\x07\x9d" - "\x27\x1d\x2b\xe2\xf0\x05\x5d\x6d\xe8\x03\xb0\x8c\x49\x2e\x43\xf3" - "\x1a\xd2\x78\x44\x33\xbf\x98\xee\x66\x3b\xcd\x71\x83\x38\x73\xaf" - "\x1f\xc7\x33\x03\xb6\xe2\x7e\xb0\x39\x7b\x69\x7e\x51\x23\xd6\x0f" - "\x2c\xe8\x0c\x73\x81\x76\xb0\xe2\x04\xf6\x9f\x0b\x3a\x3d\x15\x27" - "\xca\x91\x36\xb4\x95\xf9\xdc\xaf\x29\x79\xb7\x7c\x79\xfa\xe3\x6b" - "\x56\xcd\x7b\xea\xf1\x15\xeb\x96\x2f\xd1\xad\xcb\x79\x29\x3b\x6b" - "\xde\xb6\x42\xa3\x6e\x47\x7e\x8e\x31\x27\xef\x79\x7e\x04\x9e\x6e" - "\xb3\x51\x7c\x27\xe4\x6e\x2e\x30\x2e\xa5\x9f\x73\x75\x86\xfc\xec" - "\x22\xfe\x73\x4e\x24\xf8\x23\xc9\x31\x66\xe7\xeb\x6e\xcd\x9a\xab" - "\x7b\x68\x73\x4e\x6e\x61\x7e\x76\x50\x5c\x4b\x74\xf9\xd9\xf9\xd9" - "\x9b\xb3\x74\x4b\x75\x89\x84\x59\x89\x4e\x21\xcf\x44\xd9\xe7\x14" - "\x60\x1f\x8d\x71\x71\x3f\xf9\x1e\xea\xab\xcf\xc0\xc2\x77\x29\x2e" - "\xe3\x67\xd6\xa1\x6e\xa1\x9f\xb7\x0f\x59\x13\x8f\x8d\xed\x9b\x13" - "\x03\xfa\xbf\xc4\x80\xfe\x2f\xb1\x6f\x6c\xdf\x9c\xe8\xf2\x2f\x73" - "\xa7\xd6\xbf\xcc\x9d\x71\x63\xfb\xe6\x3b\xe7\x06\x94\x49\x0e\x28" - "\xb3\x72\xd4\x77\x20\xad\x7b\xb9\xaf\xb9\x33\x33\xa0\x8c\x21\xa0" - "\x8c\x25\xe0\x59\x19\xff\x60\x3c\x7a\x67\x93\xb2\xbf\xc7\xe7\x63" - "\xb2\xfd\xfa\x7c\xd6\x9d\xed\x32\x0c\xf5\x27\x8d\x74\x37\x86\x80" - "\x3d\xa5\x80\xed\x97\x60\x1d\xa3\xbe\xea\x00\x1f\x33\xf7\x8b\x98" - "\x7b\xe1\x66\xc9\x5f\xd1\x5d\x19\x72\xbf\xd8\x87\xb2\xb8\xf9\x3c" - "\xdc\xd9\xd5\x28\x60\x1d\x7c\x6e\xf8\x7b\xeb\x87\x1a\xa7\x83\x96" - "\xca\xd2\x99\x6d\xcc\xba\x80\x9f\x0d\x88\x69\x51\xf8\x41\xdf\xb3" - "\x70\x9d\x5d\xfd\x4e\x3b\xd5\x41\xef\x23\xed\xb0\x90\xeb\x32\x95" - "\x2b\xe3\xeb\x5f\x78\x7d\x5d\x74\xe7\x07\x9d\x83\x48\x3e\x91\xea" - "\xa5\xb3\x04\xa9\x6e\xc4\xa1\x61\xea\xc4\x99\xd2\x99\x70\x31\xf8" - "\x89\x45\x9c\x47\x64\x9c\x88\x8f\xfb\x95\xbd\xd2\xda\x4e\x11\xcb" - "\x2c\xec\x90\x63\x06\x8a\xff\x83\xf9\x8e\xe0\xeb\x01\x21\xba\xc6" - "\xea\xed\x6d\x2d\xed\x23\x9a\x5c\x14\x5b\xda\xe2\xdc\xd0\xdd\xe0" - "\xc6\x31\x29\xc4\xf0\x31\x92\xe9\x1c\xd8\x9a\xdc\xfc\x3d\xca\x26" - "\x13\x58\x1a\xd5\xde\x5e\x36\x5a\x8e\xc6\x5d\x77\xf1\x77\xca\x65" - "\x94\x8e\xe5\x71\x7c\xe0\xa0\x75\x83\xa1\xee\xa3\x21\xb8\xd6\xd9" - "\x34\x86\xbb\x4b\x2f\xc5\xb3\xe5\x8d\x88\x2b\xe8\x9a\x36\x35\xd8" - "\x86\xac\x77\x1d\xb6\xc3\x33\xb5\xb2\x1f\x6e\xab\xe7\xbe\x4f\x8d" - "\xe9\xc7\x91\x17\x03\xa1\x62\x0f\xc9\x67\x1b\x68\x3d\x06\xc2\xf6" - "\x8f\x07\x4b\x74\xb7\x61\xbb\xd1\x16\x8f\xfc\xa0\x34\x31\x5c\xf2" - "\xaf\x38\xee\x4f\xd2\xc9\xe5\x26\xd2\x3e\x69\xdd\xad\x03\x6d\xd5" - "\x29\xc6\x7f\x8b\x5e\x7f\x8d\xaf\x93\x4b\xc2\xf1\xcf\x5d\x55\x52" - "\x1b\xae\xc1\x67\xf4\x7f\x77\xf1\x71\x2e\xbd\x13\xa7\x71\x72\x81" - "\x01\xe3\xb0\x38\x27\xfa\xc6\xa4\x3a\x39\x8f\xcf\x1b\x53\x5e\x31" - "\x73\xb5\xc5\xf5\x51\xde\xb1\xd1\x3c\x2a\x47\x74\x9b\xdc\x94\xde" - "\x21\xa7\x8b\x38\x20\xa9\x37\xe0\xb9\x5f\x7e\xc6\xdf\xd8\xff\xdf" - "\xb5\x41\xc2\xef\x40\x9f\x4b\xeb\x10\x54\xa7\x61\xd1\x13\x87\xb8" - "\xdd\x2c\x8a\x95\xf3\xf9\xdc\xd7\xf7\x71\x7c\xed\x76\x82\x37\xb2" - "\xed\x08\x8f\xa3\xb0\x0c\xdd\x21\x83\xe3\x06\x15\x1b\xe1\x6b\x22" - "\x06\x08\x0f\xd9\x0c\xbf\xc7\x01\x9f\x11\x17\xcd\xcf\x3b\x48\x47" - "\x76\xb8\x61\x86\xe1\x3e\x9a\x23\x5e\xc4\xf5\x96\xd2\x08\x2f\xe1" - "\x33\xbb\x05\x6e\xc2\x47\x77\xdd\xb0\x41\x3d\xd2\xba\x88\xda\xdf" - "\x11\x4a\x56\x98\xdf\xac\xe0\x65\x38\x3e\xb7\xfb\xb7\x75\xd1\xc9" - "\x80\xe7\x3e\xf9\x99\xe6\x63\x85\xee\x2d\xea\x15\x79\x77\xc3\x78" - "\x75\xd1\x98\x16\x61\xe2\xfd\xeb\xbb\x3b\xc9\x1f\xff\xdd\xa9\x01" - "\xcf\xeb\xe4\xe7\x3a\xfe\x1e\xe0\xee\x2c\xb9\x0e\x31\x1f\xd7\x76" - "\xe4\x70\xa9\x23\x7c\x62\xfa\x73\xcf\xcf\x85\xfe\xdc\x7d\x44\x41" - "\xc3\x24\x7c\x6e\xf1\xc9\xf3\xee\x76\x19\x3f\xfe\xee\x51\xc0\xa1" - "\x8d\xdc\x6d\x0f\xd4\x97\x02\x13\xe9\x19\xe9\xcc\xdd\xee\x20\x79" - "\x2e\x91\x77\x4f\x5c\x70\x3d\xbb\x27\x51\x91\x2e\x8d\x3b\xee\x79" - "\x5d\xea\xab\xc9\x47\x3a\xe9\x2e\x1d\xe9\x3c\x5f\xae\x17\x74\xce" - "\xa7\x74\xbf\x07\xea\xd6\x3d\x86\x40\xbc\x74\x27\xc3\x28\x0e\x1f" - "\x4e\x69\x7c\x71\x4f\x93\xaf\x6d\xf7\x1c\xb5\xc3\xa2\x26\x59\x6f" - "\xc5\x9c\xdb\xdd\x0d\xa1\xe2\x79\x84\x3f\xe5\xcf\xb3\x7b\x06\x7c" - "\x3c\xbb\xc7\xe5\xc3\xbb\x58\xa3\x80\xfb\x5f\xf8\x1c\xeb\x83\x5b" - "\xac\xbb\x9c\x7e\x88\xb5\xfe\x8b\xd3\xfc\xeb\x5a\x9c\xa1\xc0\x91" - "\xa5\xa8\xcb\xa0\x80\xeb\xc5\x67\x4b\x68\xf9\x2c\x6e\x08\x2d\x9f" - "\xc5\x2d\xc1\xe5\xb3\xb8\x47\x51\xef\xa9\xcb\xeb\xf6\xbd\xa0\xa0" - "\xa7\x11\x9f\x63\xfc\x75\xf9\x5e\x5d\xc0\xf3\xa8\xfc\x19\xda\xef" - "\xe1\x5d\x29\xe1\x94\x6e\x9c\x05\x31\x42\xd7\xef\x4d\x57\xe6\xbf" - "\x33\x2c\xf2\x89\x46\xfe\xae\x8a\xde\x03\x0a\x38\x53\x20\x1c\xc1" - "\x28\xf2\xeb\x65\xda\xcb\x42\x9c\x3d\x2b\xf7\x41\x36\x2f\xf5\x41" - "\xf7\x36\x8b\xf7\x1b\xed\xa7\x98\xf5\xc3\x8c\x50\xfd\x09\xe2\xc5" - "\xfe\xff\xde\x23\x82\x3f\xf7\xa2\xfe\x3f\xc6\xdf\xa7\xb2\xf2\xf6" - "\x53\xa8\x4f\xc3\x67\x60\x09\xad\x09\x1b\xc1\xef\x9d\xfe\x7d\xdc" - "\x92\x58\x66\x55\xad\x6d\xb4\x06\xf6\x7d\x4b\xe6\x62\x4c\x3f\x1c" - "\xed\xb6\x64\x04\xc9\x4b\x63\xd6\xb0\xc7\x83\xa4\x67\xa2\xbc\x86" - "\xed\xb0\xa4\x8e\xe8\x55\xa4\x9b\x98\x75\xea\x3a\x82\xb7\x53\x7d" - "\x58\x26\x94\xdc\xe4\xf5\xef\x42\xf7\x96\xb4\x07\xb4\xe3\xd2\x19" - "\xf8\xf6\x03\xa2\x1d\xdf\x3e\x18\x50\xf7\xa9\x10\xed\xa0\x71\xda" - "\xa5\xe0\xed\xf8\x76\x0c\xe7\xad\x1a\xdb\x32\xa6\xef\xff\xf6\x5c" - "\x6c\xcb\x25\xce\x77\xff\xf4\x54\x79\xfc\x67\xbe\x84\xe3\x6a\x35" - "\xf0\xb2\x6b\x8b\x7d\x72\x93\xe0\x72\xa3\xeb\x21\x3d\x48\x9d\x65" - "\xcc\x3a\x79\xad\x1d\xbe\x7d\x5c\xee\x33\xa4\xf4\x06\x41\x0b\xf2" - "\x49\xcd\xf9\xc4\xeb\x0d\x25\x6f\xd9\x3e\xc5\x3b\x99\x6f\xa3\xfd" - "\x2f\x91\xfd\x87\x13\xfb\x54\x87\xcc\xc7\x21\x6b\xb2\x36\x20\xcf" - "\xa5\xc8\x8b\xf7\xcb\x2b\x19\x4d\x4f\x96\xd3\x27\x26\xa7\xe4\xdc" - "\x00\x39\xa1\x7c\x92\x3d\xfe\xed\x4e\x2e\x16\xed\x43\x19\x8d\xe1" - "\x75\x72\x3d\xca\x68\x24\xb8\x8c\x92\x9b\x83\xeb\x5a\xb2\x88\x3d" - "\xa7\x43\x30\x7c\xfd\x28\xbb\x11\xae\x83\x92\x9c\xc6\xca\x67\x69" - "\x94\x2c\x9f\x89\xb5\x71\x69\x7a\x40\x1b\x3d\x88\xa3\x4b\xb4\xf5" - "\xbe\x99\x01\xb8\xf5\xc1\x75\x71\xa9\x05\xdb\xe9\x09\xde\xce\xa5" - "\x0d\xa1\x75\x71\x29\xdd\x93\xe3\x19\xab\x8b\x4b\xe5\x7b\x90\x83" - "\x95\x19\x60\xd6\x60\xf5\xdc\xa7\xa1\xd8\xc4\x0e\xf7\x25\xd3\x7b" - "\x2e\x45\xfa\x0c\x7f\xfd\xc3\x36\x50\x39\xe2\x9f\x5b\x8c\x25\x48" - "\x0e\x67\x74\xa0\xbe\x9c\x4e\x0e\x59\xef\x2b\x0e\xe0\xd5\x05\xc4" - "\xef\x19\x54\xab\x1f\x12\xfc\xba\xff\x97\x01\x34\xd5\x07\xe7\xd7" - "\x7d\xc7\x90\x5f\x17\x82\xf3\xeb\xbe\xce\xd0\xfc\xba\x8f\xe4\x7f" - "\x61\x2c\xbf\xee\x07\x25\xbf\xe8\x0e\x40\x6a\xdf\x2d\x71\xa8\x1b" - "\x23\x9b\x58\xa3\xf0\xe5\x31\xd1\xa8\x2b\xa2\xcc\x00\x95\x49\x8a" - "\x76\x09\x3d\xd1\xdd\x08\xda\xf3\x70\xff\x0c\xd9\xfe\xa7\xd6\xc3" - "\x64\x36\xb2\x9e\xd1\xfd\x3d\x54\xce\x66\xba\xd0\x4a\x77\x8f\xd1" - "\x3c\x5e\x40\xbd\xa6\xe0\xbe\xe0\xfe\x5a\xe4\xe9\xab\x41\xd2\x8f" - "\x88\xb9\xc8\xfb\xed\xfe\x3e\xe2\xfe\x56\x7f\x19\x21\xdf\xd4\xfc" - "\xf4\x5c\xd5\x44\x3e\xe3\xcb\x2c\x25\x71\xac\xcc\x52\x4e\x08\x79" - "\xa5\xbc\xeb\x4f\x5f\x4a\x5a\x70\x79\xa5\x64\x86\x96\x57\x4a\x71" - "\x68\x79\xa5\xd4\x93\xbc\xec\x90\xd2\xe3\xdf\x6f\xa4\x1c\xf3\x6f" - "\x2f\xd6\x8b\xe5\x98\x7a\xd2\xb5\xf4\x3c\xd1\x76\xcb\x1f\xf2\x71" - "\x24\xab\x46\x8c\xaf\x90\xfe\x59\x44\xe3\x95\xe2\x08\x89\x1b\x79" - "\x58\xbb\x2b\xe4\x39\xf5\x51\xdd\x38\xb6\xa3\xf5\x6a\xfc\x1e\x51" - "\x78\xe0\x87\x5e\xb5\x6a\x09\xfe\x56\x9f\x81\x65\xdb\xbd\xea\x30" - "\x0b\xed\x27\xe1\xfb\x48\xf8\xbc\xff\x03\xc7\x95\xb2\xa0\xf5\xc3" - "\x34\xc7\x5b\x2d\xe6\x0f\xff\x7c\x06\x1e\x5c\x2e\xe4\xb2\xec\x31" - "\x7f\x3e\x3e\x60\x0f\x2e\x97\x07\x5c\x28\x97\x3f\x07\x97\xcb\x83" - "\xb1\xa1\xe5\xf2\x20\xed\x3d\xfb\xf3\x58\x3b\x7a\x30\x4d\xb2\xa3" - "\xbd\x54\x46\x97\x47\xf1\xea\x83\xff\x46\x30\xf8\x1b\x6d\xe4\x41" - "\x7e\x07\xd3\xbc\x01\xd9\x8e\x78\x99\x62\xc4\xc5\xeb\x97\x60\x4c" - "\x12\x0e\x25\xde\xa6\xe8\x81\x60\x76\xf2\x20\xbf\x53\x78\xbe\x01" - "\xb4\xc8\xc3\x8c\x83\x84\x23\x1f\xe0\x3c\x2c\x9b\x42\x70\x94\x4e" - "\x67\x7e\x2b\xe0\xfb\x65\x38\xf2\x75\x02\xf6\x41\x3b\x1b\xd2\xf3" - "\xbb\x4c\xfc\x71\x2f\x93\xda\x3f\x99\xf7\x23\x04\x4f\x70\x01\x30" - "\x8b\x85\x3d\x2e\x2b\xf6\xb7\xc7\x65\xe9\xfe\xfa\x89\xfc\xc7\x72" - "\x5e\xf4\x73\xf8\xfb\xb0\xc7\xaa\x5a\xf2\xe5\xd8\xe6\xb2\xce\x00" - "\xdb\x44\x1d\x48\x7d\x49\xe8\x40\xea\xaa\x00\x5a\xfb\x82\xeb\xc0" - "\x32\x77\x68\x1d\x48\x8d\x0b\xad\x03\xa9\x49\xa4\x03\x76\x48\xcd" - "\xf5\xb7\xcd\xd4\x95\xfe\x6d\xc7\x7a\xb9\x6d\xc2\xb4\x2b\xb1\x4d" - "\x8c\x85\xae\x0d\x65\x87\x52\xfc\xaf\xa2\x7b\x7b\xae\x80\x67\xe2" - "\x1e\x0a\x58\x0e\xf4\x6e\x06\x7d\xbc\x9e\x78\x78\x88\x8f\xd1\x96" - "\xc7\x2a\xf9\x58\x2d\xc6\x5a\x66\x84\x7d\x83\xd6\xb6\x09\x7e\x3e" - "\xb4\xd9\xbf\xfd\xcb\x93\x82\xf3\x73\xf9\x4a\xe4\xa7\x39\x38\x3f" - "\x97\xeb\x43\xf3\x73\x79\x19\xed\x51\x1c\x6b\x53\xcb\xe9\xee\x31" - "\xad\xdc\x37\x9d\x87\xe5\x17\x27\xd6\x3f\x2d\x3f\xe9\xdf\x3f\x2d" - "\x3f\x7e\xe5\xfd\xd3\x43\x71\xc1\xfb\xa7\x87\x12\x83\xf7\x4f\x0f" - "\xa5\x09\x7b\x78\xc8\xe2\x6f\x0f\x0f\x65\xfa\xeb\x04\xf2\xee\x4b" - "\xeb\x9f\x1e\xea\x09\xb0\x81\x9a\x33\xf0\xf0\x63\x18\x53\xec\x13" - "\x72\x4b\xbb\x2e\x80\xc6\x81\xe0\x72\x7b\x58\x83\x72\xab\x09\x2e" - "\xb7\x87\x75\xa1\xe5\xf6\x70\x32\xca\xad\x66\xac\xdc\x1e\x5e\x77" - "\xe5\x31\xc5\xc3\xe5\xfe\x32\x7b\xd8\x70\xe5\x32\x7b\xb8\x33\xb8" - "\xcc\x1e\xee\x0b\x2e\xb3\x87\xa5\x3d\xff\x69\x49\xfe\x32\x4b\x8b" - "\xf5\x97\x19\xf2\xed\x4b\x93\x59\x5a\x59\x80\xcc\xb6\x9d\x81\x15" - "\x38\x6e\x56\xf7\x08\x99\xad\xf8\x8d\x3f\x8d\x69\x4d\xc1\x65\x96" - "\xd6\x82\x32\xdb\x16\x5c\x66\x69\x27\x43\xcb\x2c\xcd\x81\x32\xdb" - "\x36\x56\x66\x2b\xb4\x57\x2e\xb3\x15\xc9\xfe\x32\x5b\x11\x7f\xe5" - "\x32\x5b\x61\x09\x2e\xb3\x15\xf5\xc1\x65\xb6\xe2\x98\x90\xd9\x8a" - "\x7e\x7f\x99\xad\xe8\xf0\x97\x19\xf2\xed\xef\x94\x19\xca\xc7\x2e" - "\xd6\xb5\x3e\xb2\x62\x90\xcf\x2b\x3f\x92\x62\x87\x47\xb5\x62\x5e" - "\xfe\x11\xae\x3b\x92\x0c\xdf\x41\x98\xa4\xb1\x7d\xf7\x23\x1b\xa4" - "\xb4\xa7\xc6\xca\xe1\x11\x13\xf6\xab\x03\xed\xc5\x7c\xbd\x94\x90" - "\x21\xf1\x1c\xe1\xc4\x1c\xd9\x23\xf5\x54\x16\x65\xcc\x6c\x2e\x37" - "\x50\x5f\x8c\xf0\x4e\xc2\x43\xfb\xe9\x03\x70\xb5\x5f\x49\x5c\x16" - "\x7a\x2d\x76\xbb\xbd\xb5\x74\x21\xe2\x7b\xf4\x8f\x42\x57\x1f\x0d" - "\x8c\x7f\x1b\x31\xef\x6d\xa1\xa7\xab\x02\xe6\x4c\x1e\x0d\x11\xff" - "\x3e\x4a\xf1\x6f\x63\x70\x3d\x7d\x74\x9c\xf8\xf7\x51\x8a\x7f\x1b" - "\x15\xe3\xd5\xe9\x1b\xdd\xf6\x80\xf1\xea\xa3\xc7\xa3\x9d\x42\x77" - "\x78\x1c\x5b\xd1\x6e\x47\x9a\xfb\x02\x68\x46\xd9\xac\xdc\x2c\xd1" - "\xfc\x74\x40\x79\x77\x70\x9a\x57\xc6\x22\xcd\xef\x04\xa7\x79\x65" - "\x62\x68\x9a\x57\xae\x44\x9a\xdf\x19\x6b\x5b\x2b\xb3\x24\x3d\x08" - "\x32\x2e\x5f\x69\x09\x2e\xff\x95\x01\xf2\x87\x0c\x63\x31\x73\xf0" - "\xf2\xfe\x70\xad\x4a\x38\x5a\xd3\x4e\xb0\xa4\x23\x41\x60\x07\x02" - "\x71\x06\x87\x5b\x15\x3b\x46\xf7\x68\x0d\x7e\x50\xdd\x5b\x95\x22" - "\xec\x71\x55\xbd\xbf\x3d\xae\xca\xf0\xb7\xc7\x47\xdd\x01\xe5\x4c" - "\x01\xf9\x69\x5f\x9e\x8f\x5d\xd5\x1f\xa0\x03\x1f\x9e\x81\xd5\xd9" - "\x42\x07\x56\xff\xdc\x9f\x8e\xd5\x10\x5c\x07\x56\xc7\x61\xfb\x3f" - "\x0c\xae\x03\xab\x93\x42\xeb\xc0\xea\x74\xe4\xe5\x87\x4a\xbd\x5d" - "\x5b\x9c\x32\x39\x00\xc6\x18\xdc\xe7\xad\xae\x0a\x3e\xaf\xb3\xfa" - "\xb0\xe0\xf1\xea\x53\xfe\x3c\x5e\x7d\xdc\x9f\x87\xab\xe1\x4b\xe0" - "\xe1\xe8\x79\x34\x43\xd6\x35\x81\xf6\x6f\x3b\x03\x6b\x24\xfb\x4f" - "\xff\xa1\x3f\x8d\x6b\xa4\xf1\x4f\xb0\xb9\xac\x35\x59\xc8\x4b\x5b" - "\x70\x5e\xae\xb1\x04\x6f\xf3\x9a\x7a\xec\x83\x6c\xde\x31\xb6\xb4" - "\xe6\x18\xa6\xaf\xe5\x77\x89\x5d\x82\x98\x43\x98\xbe\xd6\x0d\x5a" - "\xde\x5f\x8d\xf6\x4b\x6b\x4e\xd2\x1c\x39\x9f\x63\x46\xfd\x8d\x9e" - "\x01\xe9\xd4\x07\x11\x5d\x9b\x8a\x03\xdf\x4b\xf2\xa3\x0c\xf8\x9e" - "\x53\xda\x7f\x12\x6d\x82\x74\x9b\xd3\x0d\xb2\xbe\x13\xbc\x3f\xee" - "\xf4\x44\xb2\x0b\x82\x97\x61\xc5\x5c\xa7\x25\xc0\x37\xa5\x67\x04" - "\x97\x71\xba\x21\xb4\xee\xa4\x57\x09\x39\xa7\xb7\xfa\xcb\x39\xfd" - "\xb0\xd7\x3a\x75\x1d\xb5\xd5\x8e\x7c\xbe\x12\x19\xd3\xfb\xcb\x90" - "\xfe\x7e\xef\xfa\x5e\x43\x29\xdc\x74\x16\x1e\x13\x77\x39\xab\x19" - "\x8e\x89\x55\xd0\xce\x7d\xc0\x63\x25\x9c\x4e\x84\xd9\xe4\x06\x35" - "\xdb\xfb\x62\x2f\xe5\x35\x5a\x99\x8b\xdf\x95\x66\x65\x3d\x74\x1e" - "\x05\xea\xc2\xb5\xa7\xe1\xb1\x07\xfc\xca\x6b\x00\x6c\x02\x47\xb1" - "\x98\xdf\x7f\xcc\x24\xcf\xc3\x87\x9a\xdf\x47\x98\x06\x79\x3d\xad" - "\x78\x17\xf6\x58\x6d\xc8\x7e\x19\x69\xa2\x7d\x98\x44\xd3\xf8\x7e" - "\xe0\x31\x87\xac\xbf\x62\x8f\xce\xe3\xe0\xdb\x03\xf2\x78\x14\xe6" - "\x35\x8f\x33\x9f\xab\xb0\x83\xc7\x17\x2b\xf1\x88\x33\x99\x1e\x5f" - "\x29\xef\xe3\xc0\xdf\x19\x97\xc1\x25\xd1\xf3\xb8\x25\x80\x9e\x5a" - "\x8c\x2d\x9b\x25\x1c\x0d\x97\xc1\x11\x6b\x3b\xbc\x04\xe6\x7b\x21" - "\xec\x2c\xac\xfb\xb4\x8e\xd6\xc9\x34\xf4\x43\x94\x1b\x34\x62\x6c" - "\xf7\xf8\x67\x5d\x71\x34\x87\x43\xfb\x73\xef\x6f\xa5\x77\x70\xfc" - "\x3d\x7e\xdc\xfd\xad\x5d\x26\x8f\x74\xf6\xce\x5a\xae\x13\x5d\xfa" - "\x0b\xad\x0d\x07\x58\xff\x41\xbe\x57\x6d\xad\xdf\xf8\xaf\x8a\xd6" - "\xe0\xd0\x5a\x88\x52\xb8\x1f\xe1\xdf\x10\xb6\xbe\x2e\x20\x26\x5d" - "\x1b\x62\xfc\xb7\x96\xc6\x7f\xf7\x07\xb7\xf3\xb5\xe3\x8c\xff\xd6" - "\xd2\xf8\xef\x7e\x65\xbf\x29\xde\xf3\xac\x6d\x50\xc6\xa4\x74\x2e" - "\x8a\x6e\x2b\xc5\x99\xeb\xa6\xdd\x51\x07\x31\x6e\x7a\xaf\x8c\xb6" - "\x69\xeb\x6f\x27\x7b\x8d\xe9\x72\xb4\xd0\x9e\x66\x2d\xdd\xf1\x2a" - "\xfa\x32\xb2\xd7\xb5\x76\xde\x97\xb9\x85\x2d\x9a\x4d\xcc\x31\xb7" - "\x0f\x75\x68\x9b\x5e\xc2\xb5\xb6\xb3\x44\xcf\xf8\x5a\x88\xa9\x7d" - "\x30\xd9\xd6\xcf\xfb\x45\x15\xc5\xab\x3c\x6e\x75\x5f\x04\xc2\xdb" - "\x56\xdc\x05\x84\xd7\x3b\xda\x4f\x12\xee\x75\xc9\x64\xe3\x84\x93" - "\x70\x77\x23\x1c\xe1\x25\x38\xb9\x1d\x62\x1f\xc9\xba\x2c\x65\xdb" - "\xf9\xfc\x0b\xd6\x8d\xe9\xdf\xa7\x79\x15\x1b\x95\x33\xaf\x67\xf3" - "\xfb\xe8\x9d\xd9\x85\x56\x66\x7e\x91\xcd\xcf\xa7\x39\xb1\x75\xfc" - "\xfe\xdc\x77\xfe\xcb\x1e\x6e\x9c\x05\x5a\x29\xed\x68\xbb\xce\x85" - "\x7a\xbc\xce\xe1\xef\x23\xd6\x05\xc4\xbf\x6b\xf9\x38\xd3\x0e\x8f" - "\xd3\xd9\x00\x20\xad\x0b\x25\x7f\xc0\x6c\xee\x21\xae\x1f\xe3\xad" - "\x6b\xa0\x77\xd2\xb4\x2e\x49\x9c\xfb\xf3\xc4\xe2\x80\xb9\x37\x47" - "\x35\x5f\xdb\xf2\x27\xac\xf7\x89\x8f\x84\x8e\x3c\xf9\x91\xbf\x4c" - "\x9f\xc8\x30\x9f\xa3\x77\x41\xa2\x3f\xd8\xe8\x0e\xf4\x8f\x4f\x98" - "\xe4\xd8\x2d\x20\xbd\x56\xee\x0f\x74\x79\x1c\x6f\x40\x3f\xf3\x04" - "\x8f\xff\x3d\x63\xfa\x85\x27\x3a\xb0\x7d\x7e\x3a\xd9\xcd\x75\xe8" - "\x09\x7b\x97\x13\xf5\x26\x9f\xf4\xff\xc9\xa7\x11\x66\x0f\xed\xcd" - "\xc3\xe7\xc9\xe7\xe1\xc9\x18\x8f\x15\xb4\x5d\x0e\xbe\xf7\x28\x06" - "\x75\x84\xeb\x2d\xf5\x1b\x0b\xc4\x9a\x20\xa7\x7f\x1d\x4f\xce\x95" - "\x79\x4e\x30\xdd\xf9\x7f\x02\xb1\xa6\x81\x74\xe1\x49\xa0\xf5\x11" - "\x53\x07\x60\x32\xe1\x92\x75\xc8\xe6\xee\x85\x6e\x77\xe0\x98\xe7" - "\x49\x63\xf0\xb6\x3f\x49\xfd\xff\xab\x76\x78\xb2\xcf\x5f\xb6\x4f" - "\xf2\xfe\x5f\x7e\xaf\x63\x47\x1e\x04\x94\x6b\xf7\x97\xfd\x13\x19" - "\x94\x1f\x72\x9d\x4d\x79\x7b\x1f\x8e\x67\x36\x39\xf9\x9a\xab\xa7" - "\xd0\xfe\x9f\x88\x1d\xcf\x0f\x32\x6d\x7b\x9f\x17\x61\xa5\xf5\xb6" - "\xe8\xb7\x9e\x4a\xf3\x9b\x33\xba\x9e\xcf\x19\x6d\x3a\x03\x4f\x49" - "\xef\x7e\x32\xf6\xfb\xd3\xf7\x54\x56\xe8\xd8\xe0\x29\x7a\xff\xb3" - "\x29\xb8\xcf\x78\xaa\x21\x78\x6c\xf0\x54\xb3\xe4\x17\x36\xb1\x88" - "\x40\x3d\x78\xaa\x07\x65\xcc\xcb\xc8\x63\x58\x9a\x0b\x0d\x3d\x86" - "\xcd\x80\xd1\x31\x6c\x3e\xf9\x83\xa7\xfa\x47\xc7\xb0\x8e\x60\x63" - "\x58\x7b\x10\x79\x66\xa4\x06\x97\x67\xc6\x86\xe0\x63\xd8\x0c\xa3" - "\xe8\xe7\x33\x8e\xf8\xcb\x39\xa3\xca\xf7\x4e\xf8\xa9\xac\x2f\x2f" - "\x1e\xce\x70\x8d\x8d\x87\x9f\x2e\x14\xb2\x7a\xfa\x7d\x7f\xda\x9e" - "\x8e\x09\xee\xdb\x9f\x4e\x08\x1d\x0f\x3f\x9d\x1a\xda\xb7\x3f\x9d" - "\x39\x36\x1e\xd6\x4d\x0a\x80\x29\x1b\x8d\x95\xfc\x62\xb3\xa7\x1b" - "\x04\x9f\x9e\xa6\x78\x2e\x4c\x01\xdf\xec\xaf\xef\x4f\x93\xbd\x45" - "\xa3\x6f\x3b\x4b\x3e\x4d\xd6\x99\x50\x3c\xa1\x33\x4c\x6e\xa9\x83" - "\x08\xb4\x81\x0f\x87\xac\xcf\x8c\xea\x3f\xad\xa5\xa3\x7a\xc8\x47" - "\x86\x5c\xd3\xa6\x96\xe9\x23\x3a\x9e\x49\x1e\xef\x7d\x69\x58\x1c" - "\xa4\xbf\x36\x86\x1f\xcf\xf0\xf8\x8f\x70\x8c\x2f\xb3\x67\x8e\x06" - "\xd8\x98\x53\xac\x85\x5d\xbf\x53\xc8\x6d\x7d\xc0\x58\xf6\x99\x0e" - "\xbe\x2f\x2e\xa4\xbf\x7d\xa6\x3f\xb8\x8e\xae\x1f\xe5\x17\xea\x3f" - "\xe1\xbd\x37\x20\x5f\x27\x64\xb0\xde\xe4\x8d\x50\xce\x75\xaf\x5f" - "\xec\xef\x93\xd6\xeb\x02\xca\x05\x8c\xff\x9e\xe9\xa0\xfc\x89\xf5" - "\x37\xeb\x8f\x84\xee\x6f\x36\x2c\x12\xed\x7f\x36\xe0\xfd\xf2\xfa" - "\x8e\xf1\xfb\x9b\xf5\x21\xda\xbf\x01\xfc\xfb\x9b\x0d\x01\xef\xe8" - "\x37\xe8\x82\xf7\x37\x1b\x16\xcb\x7e\x46\xf8\x8d\x0d\xdf\x9d\x98" - "\xbf\xd9\x60\xf0\xf7\x37\x1b\x32\x2e\xe7\x6f\xda\xc6\xf8\x9b\x0d" - "\xcd\xd1\x0d\x41\xdb\xd2\x19\xdc\xdf\x6c\xe8\x13\x32\x7c\x36\xd9" - "\xdf\xdf\x6c\x70\xfb\xcb\x70\x43\x80\x0c\x9f\x0d\x78\xff\xbd\xbe" - "\xe3\x6a\x7d\x52\x58\x58\x98\x3a\x4c\xa5\x56\x85\x01\x5d\x68\xa2" - "\x82\xc9\x61\x9a\xb0\x70\xfc\x4c\x92\xbe\x27\xab\xc3\xd4\x1a\xfc" - "\x84\x4b\xdf\x93\x02\x9e\x27\x53\x59\xfc\x68\xa4\xef\xf0\x80\xe7" - "\x49\x97\xc9\x9f\x2c\xd5\x2b\xd7\xaf\x09\x78\x0e\xbf\x4c\xfe\xa4" - "\xbf\xb3\x3c\x8c\x79\xf6\xdf\x5f\xb8\x22\xaf\x68\x73\x6e\x4e\x16" - "\x5f\x5b\x9e\xad\xdb\xbc\x65\x4b\x76\x41\x81\xce\xb8\x4d\xf7\xe0" - "\x03\x8f\x2f\x5c\xa2\x13\x4b\xd4\x73\x97\xde\x9a\x15\x09\xab\x76" - "\xe4\x53\xc6\xaa\xb5\x2b\x32\x74\xe9\x0f\x3e\xe0\x9f\x29\xa3\xe1" - "\x4b\xd1\xc7\xc3\xa2\xbc\x03\xbb\xe2\x7a\x80\xaa\xeb\xb9\xdf\xe9" - "\xeb\x6a\x02\x10\xe3\x89\x2d\x15\x9d\x18\x75\xb0\x61\x33\xa3\xfd" - "\x0a\xa7\x61\xd3\x52\x6a\xc4\xbc\x26\x0b\x18\xb6\xd2\xf9\x22\x9b" - "\x9e\x66\xbf\x70\x80\xee\x11\x50\x9f\x06\xfd\x1b\xed\x38\xfa\xa7" - "\x67\x5b\x9f\x1b\x74\x66\x8a\x6d\xb7\xdc\x8b\x79\x2a\x76\x9f\x17" - "\xd3\x9c\xd2\x3e\xf6\xe7\x56\xf0\xb4\x5f\x58\x64\xb8\xe8\x33\xb0" - "\xc9\xc3\x7e\xc1\xf8\x33\xbb\xaf\x56\x82\xdb\x74\xc2\x6b\xdd\x58" - "\x4b\x7e\xa1\x41\xdc\x93\x0d\x6f\x4c\x07\xed\x1b\xd7\xd3\x59\x8b" - "\x9b\xda\xe5\xb5\xd1\x15\xf8\x6c\x07\x7d\x3d\xd5\x4d\xb0\x5e\xf5" - "\xc6\x7f\xe7\xf0\xd3\xfd\xe0\x9d\xbe\xb5\xd4\x9b\xda\xe9\x4e\xf9" - "\x35\x7f\xc1\x2e\x3f\xf2\x3f\xe2\x6c\xc5\x16\x88\xf6\xb0\xcf\xe6" - "\xa7\x81\xaa\xbb\x0c\x60\xa7\x9b\xb9\x5b\xf3\xcf\x62\xfd\x99\x0f" - "\x44\xef\x64\x9f\xd9\x30\x6e\x5c\x35\x60\x66\xd5\xe7\x40\x83\x36" - "\xad\x6a\xcd\xa7\x3d\x0d\x99\x09\x87\x2e\x81\x06\x79\x30\xe3\x2c" - "\x6c\xce\x28\x5e\xc5\x3c\xe6\x55\xa0\xf9\xad\x89\xf6\x92\xfe\x7a" - "\x61\xf5\xef\x41\xf3\xaf\xc3\x16\xf5\x30\x8b\x83\x62\x23\xeb\x67" - "\x74\x06\xab\x93\xb9\x68\xdd\x6b\x67\xa6\x87\x60\x66\x0f\x99\xe3" - "\xa0\xdb\xe8\x84\x92\x53\xcc\x55\xfe\x7b\x71\xb6\x43\xd7\x80\x93" - "\xf6\xa6\x6a\x4b\x56\x41\xd8\x99\x0c\x50\x77\xe9\xeb\xc1\xb6\xc1" - "\x09\xc5\xa7\x58\x7f\x67\xe6\x5f\xa0\x5b\x7f\x0c\x36\xf5\x82\xba" - "\xb3\xef\x63\xe0\xe7\x88\x56\x7a\x32\x4b\x2f\x42\x5c\x49\x0e\xa5" - "\x5d\x84\x5d\x25\x30\x65\xd7\x1f\x68\x2c\xd4\x8b\xf5\x9c\x83\x67" - "\x4e\x82\x0a\xf1\xa9\x77\x7f\x0c\x71\xbb\x9f\xa6\xbd\xda\x29\xd0" - "\x50\x0a\x71\xcc\x9c\x10\x35\x6c\x4e\x88\x19\x66\x09\xd3\x87\xcc" - "\x09\xb1\xdd\x06\x84\xef\xfb\x39\x4c\xed\x85\xd8\x5f\x9c\xed\x55" - "\xd7\x7f\x0e\x33\x74\xab\x49\xfe\x9b\xd7\x35\x7c\x8e\xf0\x95\xbf" - "\xb7\x7b\xb1\xac\xb2\x8c\x3b\xe2\xf7\x2e\x5b\x86\x0b\xbc\x88\xab" - "\x7e\x18\x66\x34\x0c\x43\x9c\xb7\xe2\xf7\x76\xe2\xc5\x48\x65\x5b" - "\x1c\xfa\xc1\xc9\xef\x3c\xd7\xa2\xb1\x75\x0e\x40\x97\x73\x18\xba" - "\xe1\x4f\x60\x33\xfd\xb5\xf5\x5f\x9f\x6b\x09\xc7\x38\x52\xd5\xba" - "\x8b\xd6\x9f\x0b\x9d\x31\x77\xd1\x19\x54\x16\xa8\x29\x85\x28\xc3" - "\x2e\x98\x7c\x16\xd3\xb9\xcf\x29\xff\x40\x67\x73\xff\xb5\x75\x17" - "\xdf\x5f\xad\xaf\x2f\xed\x82\xb0\x6e\x67\x3d\xed\xe3\x55\x7b\x22" - "\x3d\x99\x36\x67\x0f\xd8\x0c\x7f\x6e\xf5\x6a\x3d\x69\x55\x5e\xd0" - "\xbe\xfd\x45\x8f\xda\xa6\xf9\x02\x6c\x19\x4e\xf8\x10\xeb\x66\x95" - "\x9e\x5c\xf4\x55\x29\xdd\x4e\x17\x9d\x43\x93\xc8\x06\xe3\x22\x6b" - "\xf2\x61\xee\xa1\xcf\x21\xfe\xe0\xe7\x90\xc0\x86\x12\xd4\xb4\x67" - "\xfa\xd9\x73\x31\x70\x10\xbf\xa3\x70\xec\x85\xed\xe5\x7b\xa7\x59" - "\x84\xb4\x77\x7a\x24\x01\x1a\x87\x7d\x7b\xa7\x87\x07\x7d\x7b\xa7" - "\x51\x97\x3a\x68\xff\x34\xda\x85\x85\xf4\xb9\xe6\x3c\x68\xf6\x9e" - "\x07\x98\x6f\x51\x83\xee\x39\x3a\x13\x63\xcb\x3c\x5b\xd6\x39\xfe" - "\xfb\x34\x3c\xd7\x87\xdf\x51\xf8\xc1\xf1\xdb\x73\x7c\xbf\x6f\x9f" - "\xa4\xb7\x98\xa6\xc6\xb4\x2e\xfc\x0e\xc3\xef\x8f\xcc\x0d\xcc\x81" - "\x75\xd0\x5e\x87\x48\xd2\x5f\x69\x9f\x36\xf6\x89\xcf\x1d\xb7\xc3" - "\x2b\x55\xb2\x1e\x0b\x7f\xbe\xa9\xe3\xc3\x33\xe7\xe8\x5c\x5f\x07" - "\xa7\x67\x44\xaf\xa2\x33\x7e\xa5\x74\xa2\xe1\x56\xaa\xf7\x34\x6c" - "\xd1\xe2\x77\x34\x7e\xd0\x2e\x9f\x6b\x90\xcb\x0e\x8e\xe8\xb1\xce" - "\x2d\x33\x31\x9d\xc9\xe9\xd8\x5e\x0d\xe5\xbd\x77\xe6\x9c\x5a\xc0" - "\x24\xa8\x11\xa7\x4b\xc2\x8f\xb6\xbe\x29\x97\x6c\x7a\x50\x1d\xcd" - "\xda\xb2\x92\xa0\xe1\x7a\xd6\x73\xf0\x00\x6b\x17\xb6\xb6\x25\xd3" - "\x0e\x55\xfc\x4c\x05\xec\xb3\xdb\xab\x30\xaf\x0d\x7b\x4f\xe2\x4b" - "\x7b\x26\xad\x27\xdd\x62\xb1\x43\xe4\x29\x65\x1b\x98\xf5\x59\x03" - "\xf5\x9b\x3f\x29\x6d\x0d\x67\xea\x8d\x86\x6e\xfb\x00\xfc\xeb\x70" - "\x7f\xb8\xf9\x37\xa0\xb6\xb9\x4f\xc3\x82\x58\x88\xa3\x39\x98\xc6" - "\x03\xcc\x8e\xdf\xfd\xf8\x19\x40\x3d\x99\x79\x16\xb6\x74\xdd\x11" - "\x0b\xb1\xbf\x33\x81\xe4\x8f\xb6\xfc\x45\xe1\x8f\x5e\xea\xea\x6b" - "\x51\xf8\x22\xfd\xcc\xb1\xbe\xe8\xf9\x6f\x08\x5f\xc4\xdc\xc2\xf7" - "\x78\xec\x52\x7a\x78\x40\xba\xb4\x67\x64\xeb\xa7\x01\xe9\x2e\x29" - "\xfd\x0f\x01\xe9\x0e\x29\xfd\x3a\xd9\xd7\x75\x13\x1d\x3b\xc8\xd7" - "\x65\x5f\x22\x5f\xd7\x9d\x25\xf9\x3a\xbe\xc7\x31\xfb\x63\xf6\x2f" - "\x16\x71\x7f\x3b\x64\xbf\x4f\xf4\xb3\x5f\x80\x4c\x7b\x04\xa6\x15" - "\x52\x5a\xed\x9f\x40\x83\x1f\xee\xe7\x98\x75\xe3\x7f\x92\x9f\x23" - "\x1f\x47\x7b\x51\xde\xba\x9e\xf5\xbe\x75\x80\x9d\x6c\x38\xc0\x3a" - "\x87\xac\x59\x7d\xb2\xbf\x7b\x05\xd3\xaa\x30\xed\x15\xcc\x27\xbf" - "\x47\x3c\xe9\xca\x68\xa1\x73\x1c\xfb\x50\xc7\x12\xa3\x55\x60\xa8" - "\x46\x9d\xa7\xf3\x9f\xca\x90\xbf\x36\xf4\x49\xb4\x26\x97\x9f\x87" - "\xab\x4e\x44\x1f\xd5\x47\xf6\x76\xfd\x5e\x2f\xcd\x4b\xfc\x05\x4a" - "\x9d\xec\x2c\xed\x0f\x21\x1a\x36\xed\x7c\x84\xce\x79\x55\xb5\xeb" - "\x01\x68\x7f\x3f\xed\x5f\x41\xbf\xab\xa9\x45\x9a\xda\x72\x49\xd6" - "\xd9\xb9\x76\xf8\x20\x57\xc8\x5a\xcf\xcf\x8f\x3e\x0d\x59\xc7\x98" - "\x15\x7d\x21\xb6\x2d\xda\x63\x01\x3a\xb3\x04\x6d\x94\xe6\x59\xf5" - "\x6f\xe1\xa7\x56\x3e\xb7\x84\xce\x00\x47\x18\x5b\xaf\x0b\x88\x66" - "\x3b\x64\xb9\xbb\x8a\x5b\xa8\x7c\x13\xf1\x86\x59\xcd\x32\x0e\x15" - "\x3f\xf7\x04\xc7\xf0\x74\xee\x89\x1d\xb2\xc5\x9e\xba\xc8\xb6\xb8" - "\xae\x0d\x0e\x20\x3f\x6f\xeb\x47\x1c\xc5\xa7\x05\x0e\xc4\xc5\xd0" - "\xef\xfb\xe5\x49\xf8\xa7\x94\xb0\xcf\x10\x7f\x2e\xc9\x8b\xce\xa9" - "\xa2\x75\x49\xc8\x97\x28\x3a\xf3\x40\xc4\x9d\x59\x17\x1b\xff\x04" - "\x20\x9d\xb5\x85\xfa\x96\xe5\xa4\xb3\xac\xe8\x7c\x2d\x7e\xb6\x96" - "\x3a\x09\xd8\x8e\x84\xa8\xd1\xf3\xb5\xfe\x07\xce\xd6\x42\xfe\xc7" - "\x1d\x52\xb3\x63\x48\xbf\x93\xce\xd7\x42\xfa\xd7\x91\x1e\x4a\x6d" - "\x72\xbd\xfe\x0c\xe7\x79\x32\xa5\xd5\x58\x59\x87\x2c\x7f\x6a\x2f" - "\xb5\x05\xf3\x74\x22\x1e\x64\x3d\x76\xd8\xea\xa2\x7c\x4c\x8b\x22" - "\xf8\x05\xe8\xc7\x6c\x59\x1e\x78\xe7\x8c\x47\x5d\xb3\x0b\x34\xc2" - "\xa7\xe9\xa7\x51\x79\xe1\xd3\x9e\xef\xf0\xf9\xb4\xe7\x7f\x2e\x7c" - "\x9a\xe0\xb1\xf0\x69\xcf\xbf\x2b\x7c\xda\xf3\x3f\xe2\xeb\x87\xd0" - "\xa7\x51\x1e\xf9\x35\xd9\xa7\x1d\xbc\x9e\x75\x90\xef\x18\xb2\x3e" - "\x5f\x2f\xfb\xb6\xfd\x98\x46\xbe\x83\x68\x14\x7e\x2a\xdb\xc1\xfe" - "\xdf\x04\x10\xeb\x33\xe9\xb7\x9e\xce\xa1\xe8\x97\x7e\x53\x3f\x12" - "\x21\x7c\xdc\xf3\x03\x3e\x1f\xf7\xbc\xc1\x57\x96\x7c\x9c\x5e\x25" - "\x7c\x9c\x48\x6f\x7c\x86\x7c\x5c\xb6\x83\x78\x20\xe1\x57\xd3\x7b" - "\x33\x09\x1e\xf9\xb8\xc5\xa5\xf4\x71\xfe\xf6\xa5\x4f\x95\x7d\x1c" - "\xf9\x36\x7c\x5e\x87\x3e\x8d\x9f\x47\x4f\x76\x56\x87\x3c\x97\xed" - "\x8e\x64\x40\x6d\xa6\x73\xa2\x89\x6f\xcb\xce\xc1\x64\xe9\x4c\x17" - "\xa9\xdd\xfa\x5a\x79\x5f\xa4\x1d\x9e\xaf\x0f\x8c\x99\xe9\xc5\x84" - "\x62\xef\xd6\xcd\x1e\x9a\xdb\xb5\x9c\x06\x5b\x3d\xb3\x74\xbb\x4f" - "\x81\x77\xef\x8b\x9f\x90\x5c\x71\x7c\x31\x89\xbe\xc9\xef\x60\xff" - "\x79\x62\x93\x93\xcf\xd7\x7f\x52\xa3\xc6\x3c\x13\x7c\x5b\x91\x77" - "\x8e\xea\x50\x94\x9b\xe7\xcb\xcb\x89\xa0\x3c\x9a\x63\x44\xb8\x96" - "\x50\x73\x0a\x13\xa7\x23\xe7\xe9\xd0\x74\xe4\x14\x8e\x43\xc7\x77" - "\x39\x1d\x18\x6f\xe1\xf8\x68\xda\x79\xc8\x49\xa1\x67\x7e\xb6\x68" - "\xf0\x7a\x7e\x29\xe5\x87\x29\xf2\x95\x75\x7d\x12\xa4\xbc\xa2\xbe" - "\x17\x54\xe3\xe3\x7f\x61\xd6\xf8\xf8\x5f\x78\xe0\x32\xf8\x37\x93" - "\xef\xa3\xbd\x77\x1e\xab\x3f\xdc\x7c\x37\xb7\xbd\x0e\x3a\x63\x09" - "\xe1\x2a\xa4\xf7\x2d\x9f\x98\x67\xf1\xf1\x1f\x3f\x6f\xa7\x1a\xf3" - "\xf9\x79\x9d\xe8\x97\x53\x77\x02\x88\x35\x7d\xa3\x65\x7e\x1e\x48" - "\xdb\x54\xb7\x4c\x1b\xcf\xff\x38\x90\x36\xcc\x9f\xa7\xc8\xf7\xf8" - "\x64\xfe\x82\x69\x9c\x79\xa4\x28\x1b\x6a\x27\xdd\xb1\xd0\x86\xc3" - "\x16\xda\xeb\x53\x37\xfa\x6e\xe4\x45\xd4\x7f\x3d\x7f\xb7\x23\xed" - "\xed\xa5\xb5\x32\x37\x77\x3b\xe9\x4c\x32\xa7\xbc\x17\xe4\x06\xec" - "\x47\xa6\xd3\xf9\x2b\x34\x9f\xbe\xc9\x93\xae\x16\x67\x25\xbf\x58" - "\x2b\x97\x0d\x35\xf7\x48\xf5\x4a\x75\xf2\x7d\x52\x58\xa6\x5d\x2e" - "\x43\xb8\x69\x6f\x10\xfa\xff\x9b\xf9\x39\x65\xee\x01\xf2\xb7\x37" - "\x60\x7c\x3c\x5d\xd4\x93\x09\x52\x3d\x68\xdb\x39\x89\xe3\xd4\x33" - "\x4e\xfb\x72\x93\xae\xbc\x7d\x20\xb5\x2f\xd7\x70\x99\xf6\x8d\x57" - "\xef\xd1\x2b\xaf\x37\x46\xae\xb7\xff\xca\xf9\xfa\xd2\x8c\x89\xf3" - "\x35\x51\xe2\xeb\x4b\xe9\x97\xe1\x6b\xb0\x7a\xca\x26\x5e\x8f\x4e" - "\xae\xa7\x25\x58\x3d\xc0\xff\x42\x9e\xd3\xa3\x95\xef\x2e\xa0\x7b" - "\x43\xc4\x59\xe5\x79\xa0\xbc\x5b\x45\xdc\x27\x92\x17\x2b\xdf\xad" - "\xe2\xdb\x67\x96\x77\xe7\xa6\x26\x8a\x43\x98\xd7\x0e\x79\x49\x34" - "\x17\x98\x5a\xa2\xbc\x83\x24\x2f\xed\x32\x77\xba\xd0\xd9\x38\x09" - "\x54\x37\x63\xfc\x0c\x16\xa7\x38\x2f\x2f\xaf\x82\xce\x69\x10\x6b" - "\x8a\xf2\x5a\x84\x6d\xe6\xd5\xd9\xe1\x25\x7e\xce\x22\x9d\xc1\x3c" - "\x68\x96\xe0\x6f\xa4\x3e\x74\x14\xa6\x45\x86\x09\x3a\x27\x59\x79" - "\xa2\xe7\x70\x69\xa2\xdf\x1e\xc3\xe5\xf9\xf9\xdb\xf2\x97\xe8\x0a" - "\x5e\x7a\x6e\x5e\x81\x71\xb3\xb1\xb0\x80\x6f\x46\x8f\x04\x4c\xd0" - "\x19\x73\x5e\xca\xde\x56\x68\x4c\xd8\xb1\x39\x47\x6c\x5e\x9f\x83" - "\x80\x4a\x20\xf0\x3b\xdb\x3f\x0e\x7d\x50\x0f\x53\xf3\xb3\x23\x06" - "\xf8\x19\x98\x74\xfe\xbb\xb4\x37\xb7\x3d\x0e\xc0\x89\xe3\xa3\x21" - "\xeb\xb6\x0d\x76\x78\xfc\x88\xcc\x47\x3a\xa7\x10\xe3\xa4\xb8\xb3" - "\xb0\x6d\x27\xc9\x7e\x0d\x86\xbc\x8d\xe2\x3c\x08\xbe\xff\xdf\x66" - "\xc4\x84\x6e\xd0\xb6\x16\xd1\x3c\xef\x36\xd4\x81\x3c\x3b\x3f\x77" - "\x71\x17\x8d\xbf\x0d\xd7\xc9\x71\x09\xbd\xb7\x12\xef\x99\x6f\xbe" - "\xff\x34\x6c\x5b\x4e\xf5\x92\xdd\x1c\xc2\xf8\x97\x70\x31\x6b\x9e" - "\x8b\x62\x60\x7c\xd6\x22\x0d\x76\x39\xf6\x45\x7a\xa3\x58\xc4\x89" - "\x56\x3b\x18\x62\x7f\x15\xe3\x00\x69\x3f\xb7\xf6\x90\xd8\xbb\xad" - "\x19\xb2\x1a\xa2\x46\x61\xad\x08\x5b\x71\xa2\x95\xee\xeb\x09\xca" - "\xdf\x48\x5b\xab\x77\x24\x23\x5c\xd9\x66\x1c\xb3\xa3\x7c\x0c\x1f" - "\x61\xdb\x63\x49\xd6\xd2\x39\x22\x93\x30\xed\x6d\xba\xff\x80\x55" - "\xda\x5a\x31\x6d\x12\x7e\xf7\x92\x4c\xe9\x9c\x03\xcc\xa3\xb5\x3e" - "\xaa\xee\xe2\x0b\xad\x6d\x71\xa7\x51\xaf\x0d\xe8\xff\x32\x4e\x89" - "\x7d\x71\x08\x8f\x75\xd8\x2c\xc3\xd0\xae\x63\xad\x34\x07\x88\xb4" - "\x9f\x6a\xd7\x39\x81\x85\xad\xff\x84\xca\xa1\x5d\xc4\x99\x4d\x14" - "\xfb\x60\x3a\xdf\xff\x67\xe8\x91\x79\x6e\xd4\xb1\x73\x04\x13\x6a" - "\xde\x9a\xfa\xe0\x1a\xde\x97\x7c\x0e\xb4\xc6\xab\x0f\x0c\xce\x40" - "\x7f\x7f\x6b\xd6\x12\x5d\xd6\x66\xa3\x2e\x37\x27\x2f\x5b\x97\x95" - "\x93\xa5\xcb\xdb\x66\xd4\x3d\xbf\x8d\x26\x90\x68\xca\xc8\x4f\x27" - "\xbc\xd4\xbe\x1d\x19\xe1\xf2\x3b\xf2\xc1\x1d\xfa\x49\xd8\x7e\xe4" - "\x49\xfe\xaa\xc1\x21\xfd\x64\x7f\x9e\xe4\xdf\x29\xf4\x78\x3b\x8e" - "\xff\x0c\xf1\x62\x7f\x61\x58\x3f\x3e\x63\xfb\x0d\xfd\xfe\xb6\x97" - "\x5f\x22\xc1\x1e\x95\x61\xb9\x5e\xcc\x3e\x3b\x9a\x57\x23\xe9\x63" - "\xa3\xd8\x8b\xcc\xcf\xab\x69\xe4\x7b\x04\xb6\xdb\x43\x96\xa1\x33" - "\xba\x76\xc1\x96\xf3\xb0\xfd\x37\xcc\xba\x3d\x56\xd2\x21\xad\xb7" - "\xdc\xd6\x23\xe9\x0f\xea\x44\xbe\x6e\xac\xfe\xe4\x17\x93\xfe\xb0" - "\xa1\x0c\x2d\x5f\x4f\xe2\x76\xa1\x9f\xc2\x67\xec\x4f\xed\xb0\xbd" - "\x8c\xda\xe1\xdc\x91\xa1\x35\xbf\xc1\xfb\xeb\x4f\xe9\xdd\x6c\x9b" - "\x8b\x9f\xb1\x14\x81\xba\x81\x32\xca\x37\xca\x32\x92\xe1\x83\xdb" - "\x30\xd7\x17\x7f\x1d\x13\xfc\xec\xe2\x3a\x86\x71\x01\xd2\xa4\x96" - "\xe3\x02\xea\x03\x90\xb6\x3e\x63\x09\x63\x58\x47\xaf\x42\x0f\xce" - "\x07\xd3\x03\x94\xed\x96\xdc\x6d\x5b\x5e\x44\x43\xcf\xcf\x36\x6e" - "\xd1\xd3\xf9\x15\xe4\x07\xf8\xe1\x18\xb7\x66\xe9\x0a\x0b\xb2\xb7" - "\x44\x42\x30\xa8\xd1\x4c\xa5\xfc\x63\xbc\xa8\xaf\x83\x83\x19\xe1" - "\xb4\x87\x43\xec\xd9\x30\x1e\x1c\x2c\xc0\x71\x8f\x9f\xdc\x8d\xdf" - "\xb5\xc5\x25\x62\x9c\x98\x08\x3c\xe6\x47\x9e\x89\x75\x08\xc6\x3f" - "\x10\x1f\x06\xd5\x2a\xec\x0f\x0a\xea\x64\x1d\xc0\xdf\x4d\xd8\x26" - "\xc5\xb9\xf2\xc6\x93\x83\xea\xf0\x53\xe4\x7f\xc4\x7a\x93\xb3\xe8" - "\x07\xa2\x1b\x4f\x43\x01\xf9\x7e\xba\xab\x83\xca\x9f\x94\xcb\x54" - "\x8f\xee\xa3\x36\x26\xcb\x7a\xa2\x28\xf3\x11\xa5\x89\xf1\x73\xbe" - "\x83\x64\xce\x84\xec\x35\x32\x1c\xf2\x95\x35\x72\x3f\x62\x4c\x08" - "\xf4\x0d\xbf\x8a\xa1\x77\xee\x82\x1e\xae\x7f\x5a\xdb\x11\x7e\x36" - "\x0a\xc6\x78\xa7\xc1\xb8\x48\x5a\xff\xd2\xc3\xfb\x74\x13\xe2\x72" - "\x09\x5c\xcc\x5a\x70\xbd\x5c\x17\x8b\xb0\x1d\x69\xe4\x7a\x66\x2c" - "\xf7\xcd\x49\x1a\x93\x68\x6c\xce\x06\x33\x26\xd9\xa1\xc0\xc8\x75" - "\x0b\x7f\x1b\xbf\x21\xce\x5e\x23\x7d\xa3\x76\x92\x5e\xf9\x74\xca" - "\xd8\x21\xcb\x9b\xda\x8c\xe5\x8a\x75\xfc\xbc\x5d\xa3\x5d\xe6\x65" - "\xa8\xf3\x64\xb8\xdd\x6a\x91\x96\x21\x61\xbb\x7c\x5c\x29\xce\x05" - "\xa2\x7d\x34\x61\x48\x63\xcf\x19\x28\xfc\x8c\xf6\x06\x44\xbb\x68" - "\x9c\x66\xeb\xa1\xf3\x11\xc4\xf9\x42\x85\x29\xa8\xc3\x49\xd2\xfe" - "\x60\x7a\xc6\xfe\xbf\x20\x49\xc8\xae\x70\x83\xc2\xf6\x1c\xd2\x7a" - "\x83\xc9\xc4\x23\xf2\x67\x36\xd3\x72\x6e\xaf\x62\x5f\x71\x61\xb9" - "\x5c\x8e\x9f\x25\xe0\x16\x7d\xe2\x79\x28\x3c\x42\x7d\x04\xd1\x67" - "\x87\xc2\x04\xaa\x9f\xda\x47\x7d\x2e\xd7\x9b\x38\xba\x93\xa0\xb0" - "\x3d\x80\x86\x93\x32\x2e\x09\x77\x9f\xfc\x4c\xe7\x85\xd9\x61\x87" - "\xa1\x7d\x06\xda\x94\x93\xb7\xe1\x9a\x76\x23\xda\x96\x93\xe0\x8a" - "\xa2\x64\x1e\x62\xba\x05\x9f\x31\xfe\xd9\xa6\x13\xef\x9c\x4e\xb4" - "\x0a\x5f\xb4\x23\x97\xce\xa2\x32\xeb\xe8\x3c\xc1\x64\xe1\x6f\xf8" - "\x79\x39\x3c\x6f\x8e\x64\xb3\x11\xb4\x07\x89\xaf\xbb\x71\xba\xb9" - "\x6f\x10\xe7\x2b\x60\x3e\xda\xc8\x90\xb8\xf7\x24\x42\xd0\x56\x64" - "\x19\xad\x03\x75\xa2\x9d\xbf\xe3\x2c\x32\x88\xf3\x4a\x26\xf7\x60" - "\x7e\x93\x2c\x3f\x3a\x03\x9a\xda\x8d\xe5\xb4\xed\xfc\x8c\xaf\xa2" - "\xe3\x32\xbd\x52\x9e\x9a\xeb\x03\xe7\x41\xd1\xa8\xfd\x0f\x4e\xe7" - "\xb0\xfd\x72\x3d\x1c\x16\xe1\x08\x9e\xee\xaa\x1b\xb2\xee\xd0\x8c" - "\xe2\x11\xe7\xa4\x68\xa9\x9e\xf6\x26\x9e\xa7\xf3\xf9\xaa\x42\xfe" - "\xce\x88\xaf\x8b\xc3\x76\x38\x76\xe3\x38\x9b\x64\xa0\x83\x30\x2c" - "\xa3\x21\x7c\x42\x17\x77\xac\x93\xcb\x84\xa9\x88\x8f\x3b\xb2\xe4" - "\xba\x65\x1c\x44\xff\xb8\x3e\x4f\xb4\x45\x43\x36\x42\xb0\x84\x97" - "\xeb\x04\xbf\xeb\x66\xc7\x39\xae\x83\xbc\x9d\x3b\x5a\x95\xb2\x16" - "\xb1\xd8\x8e\x93\x0a\x7d\x20\x7a\x46\xe5\x6f\x07\x53\xac\xe8\x4b" - "\x76\xb8\x14\x34\xa6\x0c\x59\x4d\xda\x51\x39\x54\x72\x19\xd1\xbd" - "\x15\x41\xef\x11\xe3\xb6\x82\x30\x5e\xc6\xe9\x24\x79\xe0\x58\x6c" - "\x31\xb4\xd7\xd3\xb9\x4d\xb6\x1e\xe4\x09\xd2\x68\xda\x4f\x7a\x85" - "\x78\x33\xfd\x75\xd3\x64\x50\xd0\xab\x22\xbf\x8e\x69\x65\x32\x0c" - "\xd2\xc7\xd7\xb2\xc8\xfc\xc4\xbc\xa6\x51\x39\x2e\xe4\xb0\xc7\x64" - "\x3a\x2f\xd3\x67\x48\xbc\x32\x7d\x2a\xd5\xd1\x2f\xd7\x81\xbf\xd1" - "\x3f\xec\x18\x13\xab\x3e\xb7\xd3\x98\x2d\x0e\x30\xa2\x4e\x7e\xf3" - "\x96\x17\xb3\xb3\xe6\xea\x36\x6f\xa5\xa3\x8e\x0a\x72\xb3\xb3\x0d" - "\xfc\x25\x91\x7f\x1c\x18\xcb\xeb\x43\x3e\x88\x58\x76\xd7\xf6\xd7" - "\xc4\xfa\x18\xb2\x0b\xb2\x77\xda\x57\x30\xb9\xad\xf8\x73\x3e\x36" - "\xb1\x59\x16\x82\xcd\xc5\x2c\x14\xbf\x73\xdf\x47\xed\x8f\x73\x8a" - "\x7e\x00\xe5\x49\x7d\xe4\x90\x75\x67\xad\x3f\xbf\x76\x36\xf9\xdb" - "\xf2\xce\x63\xc1\xfd\xc4\xce\xc7\xb8\x9f\x28\x17\x7a\x41\xfe\x89" - "\xf6\x16\x10\x5e\x2c\xd3\x17\x80\xd3\xe9\xf3\x51\xbb\x40\xf6\x51" - "\xa2\x9f\xd8\x15\x8f\x7d\x50\xad\xa8\x6b\xd7\x0c\x9f\xde\xec\x6a" - "\x10\x7a\xb3\x2b\xd1\x0e\x55\xb9\xf2\x58\x45\xf4\x1d\x3b\x79\xfc" - "\x48\x3e\x1d\xf3\xd3\x65\x7c\x75\xd3\xa9\xdf\xd8\x95\x39\x36\x7e" - "\xd8\x15\x45\xf1\x03\xad\x7b\x24\x5e\x20\xad\x5a\x61\x37\xbb\xaa" - "\x14\xfe\x27\x06\x9f\x1b\x82\xc9\xfa\x39\xea\x8e\xe7\xd1\xeb\xbc" - "\x79\x5b\xf2\x8c\x4b\xe9\x18\xaa\x6c\x93\x21\x7b\x8b\x31\x3b\x2b" - "\xf0\x3d\x5e\x82\x1c\x8b\xc9\xe7\xd2\x3b\x22\x88\x1f\xbb\xb0\xfd" - "\x25\x33\xe4\x36\x70\x3f\x85\xb1\xa3\xe4\xe3\xa2\xce\x40\xf1\xa7" - "\x8d\x7c\x1d\xe0\xee\x19\xb2\x9e\x10\xdc\x32\x13\xf3\x62\x1a\xb6" - "\x7f\xa7\x7c\xd7\x21\x8e\x49\x77\xa7\xc8\xcf\xbe\xf2\xbb\xf7\xf1" - "\xbe\xef\x00\x5f\x33\x88\x3c\x2d\xd6\x28\xe2\x2d\x7c\xde\x7d\x4a" - "\x7a\xe6\x67\x2d\xd1\xb9\x60\x03\xb0\xfb\x0d\xc1\xdf\xdd\x28\x7f" - "\x93\xe4\x2b\x8a\xc5\xba\x9b\x03\x00\x3f\x28\x75\x84\x37\xf2\xf7" - "\x09\xbb\x8f\xc9\xf5\x61\xf9\x53\xca\x3a\xa9\xdf\x0a\xc4\x67\x87" - "\xdd\x65\xf4\xbd\x97\x9f\xfd\xb6\x7b\x20\x08\xad\x06\x25\xdc\x90" - "\xb5\x38\x06\xeb\x3f\x2e\xb7\x79\xad\x89\xa7\xc5\x8f\xd3\xc6\x01" - "\xa9\x8d\x4d\xa4\x5b\x54\x3f\xe9\xbf\x44\x43\x99\x74\xee\x89\x9d" - "\xee\x0a\x23\xfa\xf9\x19\x68\x71\x64\xd7\xc5\x26\xec\xe7\x07\xe4" - "\x76\x50\x1b\x9b\x4b\x1d\x1a\xf9\xec\x29\x51\xbe\xf8\xd9\x00\xda" - "\x8e\x2a\xca\xf4\xb7\xce\xa6\x77\x05\xc5\xcb\x99\x75\xd7\x11\xd2" - "\x43\x3a\x93\xaa\x6e\x54\x0f\x8b\x7b\xc7\xea\x5d\x71\x2a\xe9\x9d" - "\x52\x97\x72\x16\x6e\x41\x4d\x2a\xc8\x36\x2e\xe1\xd1\x3d\x06\x76" - "\x74\xb4\xd9\x66\x63\xce\xb6\xbc\x82\xb9\xba\x82\xac\xcd\x92\xd1" - "\xfb\xd9\xbc\x95\x8f\xdd\x9d\xb2\x9d\x0d\x59\x4b\x52\x7d\xbe\xa5" - "\xc4\xa7\xff\xb4\x06\x8c\xdf\x29\x5a\xf2\x86\xb0\xa7\x92\x5c\x85" - "\xed\xf2\xf2\x64\xa3\x8d\x3c\x66\x2b\x51\xf6\xff\x34\x36\x8e\x38" - "\x0f\x25\x8b\x24\x9e\x3a\x05\x8f\x4b\x3e\xe1\xed\xe4\x67\x6e\x15" - "\x3b\xa9\x9d\xfc\x7c\x19\x1e\x9f\x95\x74\xc8\xed\xf5\x8d\x1b\x4a" - "\xec\x3c\x8e\x92\xe2\xb5\xf1\xc6\xe5\xbe\xf8\xb4\xb4\x58\x9a\x73" - "\xeb\x95\xc7\x78\x72\x7c\x8d\xb4\x64\x89\x58\xb5\x74\xd1\x9a\x62" - "\x36\xb2\xc9\x44\x67\xd1\x91\x0c\x4a\x37\xcb\xb1\x25\x5f\x1f\x58" - "\x61\x3b\x36\x64\x2d\xcd\x50\xfa\x09\x16\xf6\x62\xaf\x14\x23\x1e" - "\x13\x63\xd7\x6b\x7e\x76\x1a\xeb\x42\xda\xb4\xe3\xd0\x86\xed\x2a" - "\x45\xff\x57\xcd\xcf\xd7\xa4\xf8\x9a\x0d\xc6\x49\xf7\xae\x99\xf9" - "\x99\xec\x87\x10\xb7\x03\x65\x8b\x70\x18\xff\x95\x70\xdd\xf0\xa2" - "\x8e\xd2\xda\x20\xa7\x1c\x23\x41\xe9\x45\xea\x8b\xf0\x37\xea\xad" - "\x59\xda\x93\x68\x4e\x73\x14\x24\xc0\xe0\x60\x9c\x7a\xb0\x20\x43" - "\x43\xf3\x05\xc4\x0b\x5b\x83\x0b\x84\xfe\x98\xe3\xd0\x4f\x75\x28" - "\xf1\x49\xb8\x88\xa7\x1a\xa2\x83\x15\xc4\xa9\x49\xbf\xf9\x3d\x5e" - "\x83\x09\xe8\x47\x4b\xed\xac\x20\x41\x1d\xe2\x7c\xad\xf1\xda\x19" - "\x45\xf7\x9a\xd1\x1d\x75\xe4\xaf\xc4\x39\xfb\x96\x1f\xbe\x26\xe6" - "\x06\xa4\x7a\xcd\x3f\x62\xea\xef\xf3\x7e\xa5\x9a\xf7\x2b\x0c\xc4" - "\x1d\x0c\xe6\x0e\xbe\x4e\xd7\xf0\x7d\x7e\xbf\xa0\xb4\xff\xdb\xd1" - "\x6e\x70\xf3\xbb\xc9\xcc\x46\x8a\xd3\xdc\xf4\x9e\x8a\xef\x6f\x6e" - "\x33\xba\x61\xad\x8b\x74\xd2\xec\xa2\x73\xdb\x9d\x3c\x5e\xb0\x68" - "\xe4\xb3\xda\xe9\xae\x34\xba\x7f\x0f\xdb\x15\x46\x72\xd7\x99\xe9" - "\x8c\x7d\x0b\xdd\xaf\x06\x62\x3c\x1e\x07\xd5\x18\xd3\x0b\x19\x58" - "\x56\xd1\x7d\x86\x62\xac\x70\x1a\xe5\x12\xf6\x57\x84\xcd\x16\xef" - "\xaa\x65\x3f\x61\xf9\x98\xd6\xbe\xdb\x25\x1c\x58\x17\xf6\xff\xa5" - "\xe5\xa2\x2e\xc4\x37\x24\xcb\xd3\xb2\x6a\xec\xfc\x86\x0f\x1f\x96" - "\x5f\x29\xc5\x05\x20\xe6\xae\x7e\x45\xb8\x8e\xcb\x73\x57\xbe\xd8" - "\xc7\xd2\x23\xcf\x5d\x89\x33\xa3\xcd\x75\x54\x7f\xa8\x39\x22\x66" - "\x7e\x9a\xf4\x5e\x4b\x31\x5c\xc8\x78\x02\xfb\x77\xa2\x5d\x8e\x0b" - "\x85\x7c\xf6\xe4\x50\x7c\xd8\x5e\x2c\xc6\xb5\x83\xe2\x2e\x36\x8c" - "\x01\xf6\x18\x45\x5f\xb6\x27\x43\xee\xcb\xb0\x6c\xb3\xe4\x2b\xa4" - "\x7e\x6e\xcf\xe8\xf8\x37\xf8\xba\xff\x3d\x75\x32\x8f\x64\x9e\x0b" - "\x1e\xed\x39\x37\x18\xf9\xd1\x3a\x1f\x6f\xf7\xf0\x77\x17\xbe\x7c" - "\xeb\xad\x0a\xde\xd3\x73\xbc\xf0\x9b\x7b\xb0\xff\x37\xaf\x13\x7d" - "\x8a\x48\x63\x91\x27\xda\xe8\xee\x44\xc1\x83\x1c\x3e\x37\xe3\x30" - "\x27\x20\x6d\xd6\x18\xbb\x4a\x75\x58\xf8\x32\x2b\xf6\x7f\x7b\xa2" - "\x44\xb9\x3d\x2d\x44\x8b\x92\xde\x27\xf2\x5e\xcc\xdb\xb6\x23\x8f" - "\x26\xd4\x0a\x0b\x74\x5b\xb6\x65\x65\x47\x06\x99\x0f\x89\xa3\xfb" - "\x52\x9d\x75\xa3\xe7\x5a\xed\x4b\xa0\x75\xfa\xe2\xfe\x80\x7d\x73" - "\x74\xb7\x91\x7e\x59\xf7\xd3\x5c\x01\xbf\xc3\x81\xce\x46\x15\xf3" - "\x06\xfd\x54\x5e\xf0\x7a\xdf\x75\x83\x3b\xf4\x52\x8c\x55\x76\x82" - "\xf8\x28\x8d\x39\xd8\x19\xd8\x1b\x21\xf7\x43\x44\x1f\x8f\xcd\x47" - "\x12\xb8\x5f\xf4\x8e\xe8\x35\x9c\x5f\x23\x09\xd8\xdf\x58\xfb\xed" - "\x18\x8b\x4b\xed\x72\xca\xfc\xa0\xf6\x63\xac\xab\x1d\x62\x39\xa8" - "\xa3\xfb\x12\x24\x5c\xe4\x3f\x11\xb7\xf5\xb8\xbc\x4e\x9c\xce\x0b" - "\x6d\x2d\xa2\xf3\x7f\xf7\x5e\xf4\x56\x90\xbf\xd9\xbb\x58\xf6\x4b" - "\xd4\x17\x79\x11\xcf\x3b\x5f\x38\xc2\xd1\x6e\xe8\xdc\xa1\xeb\x4f" - "\x43\x59\x99\xb8\x0f\x60\x6f\x96\xff\x7d\x00\x65\x29\xf8\x29\x93" - "\x3e\x87\x15\xbf\xc7\xfb\xc8\x65\x0c\xbe\xb4\xbd\xad\x01\x30\x87" - "\x91\xa6\xce\xd1\x78\x45\x9c\x59\x2a\x9d\x5b\x4c\x77\x58\x94\x45" - "\xd0\xb9\xa0\x3e\xdd\xd8\x3b\x4f\x8a\x41\xfa\x89\x77\xd4\xdf\x22" - "\x0c\x5f\xcb\x8d\x3c\x69\xa3\x39\x5a\x6a\x13\x1b\xca\x41\x9d\x28" - "\x8b\xf7\xe9\x81\xe0\x11\xa6\x2d\xf6\xc5\x29\x65\x51\x54\x46\xc9" - "\x07\xac\xe3\x01\x31\x36\x2d\xcb\x94\xfb\x6c\x3a\x13\x55\xdc\x05" - "\xb1\xb7\xb3\xb9\xb4\x1f\xc7\xfc\x65\xc5\x3e\x1c\x7b\x3b\xa5\xb9" - "\x08\x0d\x53\x5b\x13\x1b\xf9\x98\xad\xac\xc1\x37\x27\xb0\xb7\x93" - "\xfc\x2e\xc7\x11\x79\xa2\xc7\xe6\xe4\xf7\x93\xaa\xe4\xbb\x87\x11" - "\xb6\x43\x8e\x51\x64\x5c\xed\x62\xce\x89\x9f\x63\x89\x36\x58\x8b" - "\x30\x03\xa3\xf3\xb1\x74\xff\x90\x3c\x06\x34\xa1\x1d\xf3\xd8\x7b" - "\x5f\x94\x6f\xac\x67\x3d\xca\xfd\x8d\x75\x14\x0f\x8e\x8f\xf6\x41" - "\xe0\xb8\x0d\xe3\x07\x5d\x4e\x5e\x0e\x86\x0f\xcf\x1b\xb6\x2d\xc5" - "\xa1\xc3\xf3\x86\x9c\xa5\xb4\xa4\x6c\x55\xea\x0a\xfe\x8d\xc6\xb1" - "\x34\xc8\xfc\xf1\xe8\x1d\xa4\x34\x67\x84\xe3\x5c\x9a\x3b\x1d\x12" - "\x77\x14\x4e\x96\xbe\xb5\xd2\xf7\x24\xec\xf7\x7a\xd1\x06\xde\xa6" - "\x3b\x68\x90\x86\x56\xe9\x5e\x48\xb9\xcf\x46\x5f\xbe\xef\x87\xf2" - "\x7b\x32\xbe\xc6\x9e\xce\x2a\xa4\x3b\x46\xf7\xbe\xf8\x09\xb6\x69" - "\x74\xfe\x43\xcc\x2f\x8a\xf7\x5e\x98\xee\x92\xd3\xe5\xf9\xd8\x21" - "\xeb\xcb\x51\xf2\xdc\xab\x80\x7d\x79\x86\xaf\xac\xdf\xdc\x76\xac" - "\xfc\x7e\x0d\x61\x52\x64\x9e\xc9\x78\xcc\x3a\x76\x5e\x8a\x93\xc2" - "\x78\x5c\x6d\xdd\x97\xc4\xcf\x07\xa5\x58\x9c\xcf\x33\xbf\x6c\x94" - "\xeb\xa1\x31\x02\xd1\x2d\xbd\xbb\xe1\x76\x4f\xe7\x80\x8a\x73\x44" - "\x5f\x1e\x95\xff\x44\xee\x05\x1b\x29\x62\xed\xee\x2f\x58\x4b\xf5" - "\x9f\xd0\x66\xb7\x02\xb8\x8b\xd8\xb1\x91\x2f\x58\x33\xf1\xba\xfa" - "\x39\x80\xfd\xff\x05\xe0\x09\x5b\xff\xe9\x30\xf2\x7d\xf5\x45\xef" - "\x79\xba\x0b\xaf\x11\xe1\x56\x3b\x2f\xb0\x43\x58\x66\xb5\x81\x9d" - "\x3f\x84\x70\xab\xce\x9d\x67\x07\x11\x76\x95\x1e\xdb\x5d\xc4\xdc" - "\x9e\xb0\x17\x3f\xd5\x3d\x49\x7e\xe8\x3b\x89\x8e\x8a\xce\xb9\xcc" - "\xaa\xae\x61\x7b\xef\xb8\x7d\xc8\xfa\x9d\xe4\xd1\x3b\xad\x10\x2f" - "\xf1\x68\x8d\x89\x7e\xbf\xf8\x29\xb6\xe9\xd3\x4d\xd8\x87\xa2\x0c" - "\x3e\x45\x38\x1c\xff\xe7\x71\x7f\xe3\x08\xbb\x7d\x3a\x7e\x12\x82" - "\xf9\x7d\xa4\xb5\xdd\x53\xc4\x5a\x6a\x36\x22\xfd\x67\x91\xfe\x2f" - "\xd8\x31\x6c\x43\x73\xf5\x19\x00\xa2\xdf\x43\x38\x3d\x10\xb6\x69" - "\xa7\x6a\x5a\x23\xe6\x6f\x32\xc5\x40\x23\xc2\x6e\x74\xc2\xb4\x43" - "\x08\xb3\x71\xfb\x34\xe0\xf4\x0f\x20\xdd\x11\x9d\x73\x3d\x58\x37" - "\xd1\x8f\xf5\xf7\xc9\x74\xca\xf5\x13\xbd\xb2\x0e\x6e\xa2\xf9\xae" - "\xc8\x8f\xea\x88\x6e\x31\x87\x5f\x3e\xd3\x51\xa0\x07\x47\xd8\x1d" - "\xb7\xdb\xa1\x7c\x31\xd9\x10\xb5\xc7\x81\x3a\x25\xed\x7b\xfb\x54" - "\xe6\x81\x18\x4f\x96\xa7\xca\xed\x53\xb6\x2b\x7d\x5b\x3e\x9f\x47" - "\xdd\xbc\xc5\x98\x53\xb4\x19\x47\x67\x91\x60\xa0\x24\x3e\x7e\xcb" - "\xce\xd2\x6d\xcb\xd3\x6d\xdd\x9c\x93\xbb\xad\x28\x3b\x7f\x2e\x1f" - "\x72\x17\x64\xe7\x65\xd1\xf4\x6a\xfe\xe6\x7c\x43\x64\x40\xcc\x5d" - "\xde\x39\x97\xd6\x23\x92\x2f\x3b\x03\xaf\xcc\x94\xe6\x16\x5d\xcc" - "\x9a\xc2\xc7\x6e\xc2\x0e\xca\x3f\xd5\xed\x4a\xa1\xfc\x69\xa2\xaf" - "\x79\x65\x06\x6f\xd7\x60\x9a\x5c\x8e\xaf\xdd\xe5\x31\x2a\xa5\x8f" - "\xa4\x81\x6f\x0d\xf9\x2b\x33\x99\x1a\xdb\x84\x6d\x96\xe2\x54\xbb" - "\xb4\x97\xef\x7f\x9d\x86\x4a\x0f\xb6\x93\xde\x15\xf4\xf0\x38\x90" - "\xef\x39\xaa\xa4\x39\x18\x3b\xb3\x4e\x8a\x22\x3e\x54\x8b\x71\xa4" - "\x3a\x5a\x65\x51\x51\x2c\xd4\xa8\xf6\x26\xd2\x3b\xc1\x46\xab\x37" - "\xd1\xb7\x86\xa7\x3c\x9d\x62\x5a\x3e\xb7\xce\xed\xa0\xa2\x58\xd6" - "\x6f\x35\xed\x29\xd9\x7b\xe3\x12\xe1\x9b\x2b\xf6\x10\x3c\xca\x69" - "\x89\xa0\x9f\xdf\xdb\x8a\xfd\x51\x65\x85\x77\x6a\x74\xad\xa7\x20" - "\x4e\xba\xbb\xf8\xa3\xa3\xde\xca\x8f\x1a\x3c\xd8\x6f\x7b\x31\x16" - "\x65\xd5\x31\xd7\x7a\x2a\x3f\x3a\xe0\xdd\x91\xa0\x26\xff\x6d\x36" - "\x21\x7f\xb6\xe9\x23\xd9\x05\xfd\x35\x1e\xba\x6f\xaf\xf2\xa3\x43" - "\x8c\x61\xd9\xc8\x8f\x7e\x42\x7d\x24\x3e\x37\x49\xcf\xc7\xe8\xd9" - "\x8b\xb1\x18\xa6\x7d\x80\xcf\x2d\xfc\x6e\x3f\x19\xde\x1f\xf6\xdf" - "\xe9\x39\x5a\xc5\xd7\x08\x26\x62\xec\x9b\x4c\x6d\x95\xdb\xc8\xc7" - "\x00\x34\x0f\x31\xda\x96\xca\x32\x39\x9d\x62\x53\x11\x27\xc2\x16" - "\xe4\x69\xbd\xf0\x59\xa3\x70\xcf\xca\x6d\xe6\xbc\xac\xfc\x08\x63" - "\x20\x94\x1f\xdd\xc7\xbc\xf7\xff\x63\xef\x6d\xc0\xa3\xaa\xae\xbd" - "\xf1\x3d\x93\x01\x26\x71\x92\x19\x69\xc4\x11\x83\x8c\x35\xb6\xa3" - "\x8d\x10\x95\xf6\x52\x5f\x94\x54\xb0\xa5\x8a\x26\xb5\x78\x6f\x7a" - "\xa5\x26\x54\xf0\x06\x8b\x30\x42\x08\x01\x43\x3e\x06\x9a\x1b\x62" - "\xbe\xd4\x60\x03\x09\x21\x6d\xd1\x8b\x2d\x6a\x54\xac\xb1\x52\x1d" - "\x05\x63\x94\x24\x13\x31\xb6\xa9\xa5\xed\x40\x43\x0c\x18\x60\x24" - "\x43\x66\x48\x66\xce\xfe\xaf\xdf\xde\xe7\x64\x26\x98\x50\x63\x7b" - "\x3f\xde\xff\x7b\xf3\x3c\x93\x73\xce\x3e\xfb\xec\x8f\xb5\xd7\x5e" - "\x7b\xad\xb5\xd7\x5e\xeb\xf2\x6b\xb9\xbe\xe4\x7e\xac\x0d\xa9\x21" - "\xb1\x57\xc5\xe4\xde\x46\xe9\x3e\x0d\x7e\xb0\x85\xc7\xfa\x40\xe3" - "\x64\xcf\xf0\xb2\x18\x39\x3f\x4b\x0f\x47\xc8\x20\x7d\x5c\xe0\x73" - "\xa9\x38\x67\xc2\xf5\xc6\x4d\xf2\x79\xcb\x1c\xb9\x9e\x3d\x6a\xd4" - "\xf2\x52\x9a\xb0\x01\xc2\x9e\x15\xe1\x7f\x5f\xfd\x79\xe7\x33\xc7" - "\xa2\x3f\xd4\x5e\xd5\xdf\xf9\xa3\x8b\x34\xde\x80\xee\x33\x47\x9e" - "\xe1\x7c\x74\xc1\xf9\x7b\x4c\x3f\x5a\xb5\x2a\x3b\x63\xf5\x32\x5c" - "\xec\x57\xaf\xbd\xe6\xfc\xb5\xc2\x24\xe3\xc8\x3c\x9a\x8b\x7e\x83" - "\x7e\xca\xb3\x10\x8f\x36\x45\xc8\x7b\xd0\x39\xcd\x05\xdd\xc7\x5e" - "\x31\xbd\xeb\x7c\x33\x6f\xa3\xe0\x37\x8e\x18\x99\x7e\x2c\x1b\x06" - "\xe1\x57\x3b\x3a\x50\x25\xe6\x77\xb9\x85\xe8\x7f\x99\x49\xb3\x39" - "\x1a\xdd\xf7\x43\xb3\x29\x54\xfa\x81\xcd\x36\x55\xc4\xc8\xd3\xbf" - "\xb4\xa1\x4b\x0f\xfe\x22\x9f\xee\x61\x93\x21\xf4\x58\x6a\xec\xb5" - "\xd7\xcf\x74\x11\x1d\x29\xcb\xe4\x5b\x9a\xa9\xcc\xb2\xf4\x31\xdb" - "\x10\x71\x6e\x56\xee\xc1\x95\x8d\x69\x73\xc1\x4b\xdc\xbd\x12\x57" - "\xca\xda\xc4\x5e\xd0\x54\xf6\xef\x47\x59\xd9\xbb\x06\x2b\xc9\x29" - "\x53\xd9\x7f\xd0\x7d\x9b\x58\xf7\xad\x23\xd7\x68\x36\xad\xaf\xc1" - "\x10\xc5\x69\x4e\x70\x1d\x97\x7f\xc4\x64\xc8\xbf\x28\xfa\xe9\xb9" - "\x4e\x58\x9f\x47\x11\xa4\x26\x4d\x34\x30\x73\x9c\xc9\x38\xfd\x8a" - "\x04\xeb\xdc\x5b\xe6\xcc\x2e\xc8\xcf\xcb\xe5\x4a\x30\x60\xe6\x91" - "\x71\x02\x03\xc9\xf7\x5c\x53\x28\x69\xe1\x96\x40\xf2\x68\x6d\x2d" - "\x77\x72\xd8\x70\x32\x9a\xaf\x8e\x82\xb5\x4c\xff\xfc\xa0\x47\x0f" - "\x5e\x05\xf4\x15\xf1\x2e\x8f\xb2\xf2\x1f\xbc\x41\x69\xd4\xff\x5c" - "\x5e\x66\x76\xc8\xb3\x05\xe5\xdb\x94\x0a\xb3\x23\x5c\xbe\x81\xa1" - "\x7c\xe2\x87\xf5\xbb\xf2\x7b\xf5\x6e\xc3\x2d\xcc\x6d\xf3\xb1\x37" - "\xe8\x7e\x8c\xf1\x74\x40\xf7\x82\x32\x88\xee\x94\x14\x9c\x23\x7a" - "\x94\x2b\xf4\xa0\xfa\x53\xac\xfc\xfd\xc6\x31\xbe\x13\x7b\x19\x31" - "\x07\xcf\xf8\x9d\x15\x34\x56\xf3\xbb\xd5\xf5\x9e\xf8\x91\x8a\x04" - "\x6d\x4e\xd0\xfb\x4f\xa5\x3e\xb6\x22\x59\xcb\x33\xba\xbc\x04\x1b" - "\x46\xee\xc2\xb8\xf2\x81\xde\x5e\xf8\x50\x1b\x43\xe6\x4d\xa1\xf5" - "\xe7\x3a\xf0\x30\x6d\x44\x21\xe2\x8a\x2c\xd8\x2b\x25\xba\x92\xfc" - "\x90\xb9\x28\x79\x79\x9c\xef\x12\x66\xce\xfd\xa1\xce\x1c\xfc\xae" - "\x6e\xc7\x93\xbc\x03\x3c\x1e\xf6\x1a\x40\x5b\x62\x8b\x92\x97\x70" - "\xfd\x9c\x1b\x11\xdb\x2a\xb6\xef\x5b\x3a\xc5\x39\xeb\x46\xf8\x45" - "\xab\x9a\xc2\xbb\x28\xdf\x61\xca\x07\x5d\x53\x37\xe5\x6d\xed\x61" - "\x15\x9f\xd2\xb5\x25\xb6\x88\xef\x8c\xed\xe3\xca\x8c\x42\x16\xa5" - "\x96\xd7\x2a\x62\xcb\x0f\x09\x59\x77\x42\x58\xd6\xad\x8c\x0f\x39" - "\xd9\xc4\xd4\x09\xfc\x0d\x2a\xa3\x85\x0f\x28\x2d\x3b\x14\xe1\x1f" - "\x0a\xfb\x41\x9d\x44\x47\x3a\x67\x56\x93\x6c\x83\x38\x91\xeb\x69" - "\x2c\x03\x01\xf0\x35\x2e\xaa\xe3\x00\xd1\x89\x7d\x1b\x1f\x66\xfa" - "\x10\x7d\x43\x6b\x44\xd4\x29\x56\xf9\x50\x7b\x6f\x17\x7c\x6a\x7f" - "\x2d\xcc\xab\x55\x09\xbd\x5c\xf9\x93\xdc\x05\x3b\xde\xe7\x4f\x79" - "\x11\x67\xbd\x05\x73\x06\x36\x8d\x48\xa7\xe7\x7d\x33\xaa\x99\xdd" - "\xdd\xd7\xcb\xda\x89\x4b\xe3\x05\x56\x3d\xa5\xef\x4b\xf2\x12\x3f" - "\x41\x65\xc3\x7e\x9b\xe6\x7c\x6b\x6c\x1f\x9b\x40\x7d\xd9\x27\x78" - "\xac\x75\xf6\x44\xfa\xce\x75\x1d\xb5\x8d\xd6\xfc\x84\xe7\x07\xbb" - "\xf4\xe2\xcc\xef\x14\xde\x11\xeb\x63\x89\x82\x36\x08\x9f\x65\xf6" - "\xaf\xd0\xb7\x07\x88\x8f\xee\x44\xb9\xd0\x2d\xd0\x73\x07\xca\x38" - "\xc5\xaa\xbe\xc7\x57\xd9\x0d\xa8\x83\x78\x02\x97\xed\x01\xec\xd9" - "\x54\x25\xb5\xf7\x06\x18\xd2\x2b\xa9\x7d\x84\xf3\x2e\xb4\x93\xfa" - "\xda\xe4\x77\x56\xcd\xd1\xce\x6a\x63\x7d\xa4\xe7\x85\x1a\xbe\x10" - "\x3d\x6e\x92\xe7\x49\x2b\xbf\x0b\x98\x50\xfb\x3b\x95\x01\xa5\x57" - "\xa1\xb6\xa1\x1c\xbe\xc6\x6a\xa0\xf6\xeb\x52\x83\x7e\x4e\x7d\xe8" - "\x4c\xcd\xf5\x73\x94\x6b\x5b\x29\xe0\x76\x35\x5f\x83\x98\x44\x55" - "\x7b\xc1\x1b\x03\xe6\x72\x3d\xaf\x7c\x28\xb6\xc8\x52\x1c\xdb\x77" - "\x09\xd1\xe5\xca\xcd\x3b\x06\xb0\x86\x56\xb9\xb4\x3a\xc7\x98\x13" - "\x01\x37\xd1\x03\x65\x80\xf7\x82\x17\x92\xf6\x17\x55\xbe\x8c\xdc" - "\xa8\x14\xea\xa3\x9e\xda\x82\x71\x9c\x42\xeb\xca\x5c\xd8\xd7\x50" - "\x1b\x88\x0e\x3e\x16\x7f\xa1\x18\x9d\xd4\x57\x2b\xe5\x21\xf9\xa7" - "\x4a\xfa\xe9\xcf\xe1\x75\x52\xf7\xf0\xd8\xf0\xf9\x77\x3e\xc0\xf3" - "\x2a\xf3\x45\xbd\x85\x9b\x73\x44\x1d\x88\xdb\xd8\x9b\x6d\xe3\x47" - "\x0e\xd8\xbc\x63\xcd\x09\xea\xcf\x63\x55\xda\x99\x77\xb4\x9d\xe6" - "\x73\xa1\xa4\x0d\x8f\x47\xc7\x15\xcd\xe5\x71\xbe\x1b\x6f\xc4\xde" - "\xe7\x4e\xbd\xb0\xf5\x91\xeb\xaa\xa4\xff\xd3\x69\x7c\x4f\x63\x9c" - "\x89\xb7\xeb\x82\xcd\x84\xdb\xc7\x85\xac\x20\x62\x59\x13\x15\x83" - "\xbd\x1c\xf4\x70\x54\x87\x6f\x58\x76\x1d\x51\xc7\x63\x7b\xce\xa7" - "\xbd\x69\xf3\xbe\xbb\xcc\xb6\x02\x36\x30\xc9\x37\xe4\xda\xec\x57" - "\x2f\x9d\x29\x8c\x63\x6c\xdf\x9e\x77\x93\x2d\x8d\x04\x9b\xac\xa4" - "\xbb\xe4\x65\x5e\xda\x42\x5c\xcf\xd3\x95\xda\xfc\xce\xc7\xcf\x5b" - "\xff\x7e\x1a\x94\x6b\xe4\xe3\xb9\x1e\xdd\xa5\x52\x6e\x28\x69\x9e" - "\x4f\x70\xea\xf3\x46\x07\x92\x55\x3b\xd8\xf9\xde\x68\xbf\xd7\x1b" - "\xdd\x6a\x40\x2c\x55\x73\x11\x0f\x98\x83\x93\x38\x70\x14\x31\x54" - "\x09\x87\x7a\x2b\xcf\x08\x99\x8c\xdd\x76\x4d\x01\x4f\x0d\x71\xf7" - "\xce\x33\x18\xb7\xc7\x5b\xb5\x31\x11\xfc\x2d\x95\x4b\xfd\x1e\x42" - "\x99\x34\xd6\x46\x94\x0b\x1e\x97\xf2\x51\xff\xcb\x9b\xe4\xfa\xfc" - "\x04\xe1\xd2\x63\xb9\x2a\x0e\xa7\xd1\xb3\xc5\xc3\x6e\x10\x76\x45" - "\x8a\xd3\x0a\xdf\x01\x06\x65\xd3\xb5\x77\xf3\x2d\x7e\xaf\x56\x26" - "\x95\x65\xd2\xda\x89\xf2\xd8\xe7\x3c\xfb\xa5\x94\xbe\x93\x02\xbe" - "\x09\x67\x2c\xcc\xb9\x3a\xc4\x11\x48\x1f\xe6\x0d\xe9\x1d\xd1\x40" - "\xf0\x8b\xe9\x71\x3e\x5d\x21\xf2\x84\x79\x2a\xc5\x53\xa9\x57\x02" - "\xb4\xc6\x5a\x64\x5c\xd3\x3e\x55\x67\xfc\xc4\xbe\xd1\xc7\xf1\x09" - "\x61\xe3\x78\xc6\x69\xa0\xbe\x3d\x9e\xf6\xe5\x78\x39\x0f\x14\xa7" - "\x8e\xc9\xf3\x76\x4f\xbc\x20\xf6\x31\xa5\xcd\xc8\x74\x82\xaf\x17" - "\xfa\x41\x33\xd1\x07\xd8\xd2\x29\xc0\x1f\x76\x82\xb9\xf3\xfc\x85" - "\x88\x27\xaa\xc9\x94\x24\x1f\x29\xed\x8e\x10\xbd\xff\xb1\xf0\x2d" - "\x44\xbc\x5a\x26\xcd\x27\xdd\x09\xf6\x44\x21\xda\x2f\xc6\xd1\xc9" - "\x4c\x0a\xc1\x4a\xec\xd9\x03\x3e\x31\x2d\x2e\xd8\x6e\xa3\xaf\xe6" - "\x20\xf5\x39\xb2\x5f\x7a\xc5\x53\xe1\xa4\x7e\xe9\xa9\x5f\xb9\x27" - "\x99\x98\xab\xb9\xc7\xc0\xc3\x4c\x09\xfb\xc1\xae\x6e\x88\xec\xa3" - "\x02\xff\xf5\xa2\x0f\xd5\x6f\x8e\xd6\x47\xae\x47\x1f\x01\x83\x6a" - "\xcd\x27\xbb\x68\x27\xf8\x86\x3e\x56\xbd\x28\xae\x08\xb6\xec\xcd" - "\xf3\x69\x2d\x9e\x87\x31\xac\x77\xf2\x2a\xb4\x73\xb4\xf1\x42\x79" - "\xb2\xac\xad\x99\xe6\xa2\xc2\x4c\xbf\x73\x6b\xd2\xe8\xf0\xde\x7a" - "\xe7\x85\xe1\xbd\xf5\x4a\x7c\x8f\x76\xc0\xb6\xdf\x0c\x27\x0d\x84" - "\xdf\xb4\x4e\x96\x8c\x56\x6f\x5c\x51\x03\xda\x35\xea\x3b\xc2\xfd" - "\xbe\xca\xd5\x23\xe7\x84\x52\x8f\x38\xdf\x27\x61\xff\xce\xa4\xbc" - "\xb7\xb5\x33\x1c\x6b\xb9\x79\x85\x59\x67\x8b\x02\x1f\x20\xe8\x1b" - "\xf5\x77\xb4\x72\xcd\xba\x2a\xf8\x79\x99\x47\x74\x65\xd4\xf7\x34" - "\x0f\x6c\xc4\x53\x7f\x99\xca\x9b\x15\x57\xc4\x38\xc9\x86\x31\x71" - "\xbe\xa0\x88\x23\x4c\x6d\xcd\xa5\x79\x0d\xf9\x57\x2f\xe5\xc1\x27" - "\x89\xff\xfd\xb9\xe0\x4d\xbd\xd1\xcd\xb3\xe4\xde\xc7\x93\x59\x1e" - "\xf6\xcb\x61\x5d\x2d\x3d\xe7\x7a\xd8\xb9\x39\x72\xae\x5e\xbe\x9d" - "\x97\x1e\xec\x50\x9c\x66\x6e\xdb\x60\x26\x39\xe7\xa7\x17\x93\xfc" - "\xa1\xe7\x31\x07\x3b\xc2\xb8\x23\x6d\xff\x35\xdc\xa1\xef\x9b\x46" - "\xc7\x8b\x27\xff\x70\x61\xbc\x78\xf2\x59\x55\xce\xc8\x94\xf6\x05" - "\x3f\x65\xda\xfa\x41\x72\xc6\x76\x5b\x3e\xea\x7f\xb2\x5a\xd6\x4d" - "\x30\x09\xa6\x80\xce\x2c\x24\xb8\x15\x52\xde\x24\x8d\x36\x00\x87" - "\xcc\x21\xac\x5f\x4c\xe0\x39\xbd\x5b\x40\x74\x44\xdd\x3f\x6f\xdd" - "\x43\xb4\x2f\x41\x71\x3e\x1e\xef\x2d\xc8\xaa\x85\x7d\x9d\x2f\xba" - "\xb9\x91\xf2\xac\xf0\xb0\xdf\x89\x18\xc4\xdc\xd8\xbc\x9b\xca\xd8" - "\x23\xf6\xab\xe4\x99\x15\x13\xe6\x39\xe2\x9d\x60\xae\x53\x5a\x3c" - "\xb5\x1b\xb1\x4f\x68\xad\xf9\xe9\x2e\x8d\xd7\x57\x9c\x29\x80\xb7" - "\x38\x23\x4f\xf2\x4e\x42\x3f\xc1\x6e\xab\x5e\xd9\x3d\x30\xd3\xca" - "\xd0\xe7\x81\x4d\x53\x77\xff\xfb\x0c\x66\x68\xb6\xfe\x88\x39\x6e" - "\x60\xf1\x45\xdf\x30\xb0\x4f\x66\x33\x3d\xe0\xe0\x61\x3f\xdd\x2b" - "\x61\xf7\x53\x9f\x36\x3e\x1e\xf6\xe4\x62\x8c\x07\xe4\xfb\xd4\x20" - "\xef\x97\xfa\x8a\x1a\x5a\xff\x1e\x55\x63\x25\x3f\xbe\x62\x94\x35" - "\xe1\x36\xdb\xf2\x35\xb6\xa5\xab\xd6\xad\xbc\xf2\xca\x11\x3a\x5f" - "\x83\xd0\xdf\x39\x6b\xec\x72\x0f\xa5\x66\x71\x84\x7c\x4b\x6b\x5b" - "\x0d\xf5\xff\xf1\x05\xe7\xaf\xab\x0b\x33\xd4\x23\x9a\x19\xc9\x2c" - "\x7c\x7f\x3d\x5b\x78\x7d\xc4\xe3\x8d\x6c\xe1\x0d\x37\x66\xdc\xbd" - "\x6c\xc9\xd2\xf5\x11\xa9\x5f\x8f\x94\x95\x2a\xb7\x53\xdd\x51\x53" - "\x6f\x25\xfa\xa1\xbb\xeb\x11\xac\x35\xdb\xbe\x97\x1f\xe4\x1f\x13" - "\xee\xce\x86\x5f\x84\xb6\xec\x20\x6b\x23\xfa\xc6\x2f\x07\x5d\x9f" - "\x24\x7d\x83\x85\x18\x64\x18\x33\xf5\xdd\x4b\xeb\xf3\x59\x69\x5f" - "\xb6\x6d\x6d\x7b\x0d\xf1\x3c\x25\xad\x26\x29\x6f\x6c\x43\x8c\xe5" - "\x8b\xe9\xfa\x03\xb9\x47\xb6\xed\x87\xc4\xa7\xa4\x88\x73\xa0\x39" - "\x38\x07\xba\xed\x36\xc0\x68\x86\xaf\x90\x49\x7f\x24\x35\xbd\xf0" - "\x13\xea\x61\xdb\xc4\x19\x1f\xe4\xa5\x6f\xae\xb7\x3d\xc8\x92\x71" - "\xc5\x7e\x33\xbd\x4b\xe6\x5b\x5a\x4d\xbc\x36\x1d\xfb\x06\x89\x94" - "\xbe\x35\x4a\x77\x84\x45\x59\x27\x7d\xc7\xef\xdc\x06\xd9\xb7\x57" - "\xdd\x3b\x18\xfd\xcc\x81\xba\x06\xc6\x11\xed\x8e\xf3\x99\x79\x06" - "\xce\x54\xeb\xc0\xe7\xf5\xd1\x3c\x4e\x13\xb6\xcf\x58\x13\x25\x3d" - "\xd8\x36\xac\xff\xc1\x59\x13\x7a\xf6\x69\x38\xef\x77\x6e\x67\x1a" - "\x4e\x8e\xb0\x95\x5d\x99\xbd\x6c\xf5\xb2\xa5\xb6\xab\xd7\xc4\xb0" - "\x88\x88\x51\x59\xcb\x56\xda\x56\x2f\x7b\x78\xed\xb2\x35\x22\xda" - "\x13\xde\x9e\xa7\xa7\x89\x79\x2f\x65\x38\x26\x9f\xb0\xd7\xdd\xbe" - "\x0c\x7c\x3b\x2f\x7d\xcf\x25\xe2\x61\x60\xcd\x31\x99\x4b\x94\x8a" - "\xd8\x14\x29\xf3\x21\x96\x72\x6d\x40\xee\x5b\x1c\x0c\x4a\x7d\x7f" - "\x6d\x39\x9e\x29\xdd\x12\x8e\x31\xbd\xfd\x4d\xe8\x57\x54\x18\x11" - "\x0f\xb3\xbd\x49\x83\x91\x87\xd5\xa5\xa8\xba\xec\x3e\x41\x2b\x68" - "\x8d\x35\xcb\x38\x3d\xc3\xf4\x62\xa6\x82\x75\x6a\x3b\x6c\x48\xa3" - "\x84\xbc\x1c\xdd\x0a\x3d\x84\x1e\x65\xf6\xd0\xf7\x7c\xcb\xc1\x20" - "\xd1\x49\xa2\x35\xbc\x44\x2b\x8f\xea\xdc\x8d\xfa\x40\x3f\x68\x9d" - "\xbb\xf4\x04\xab\x15\x65\x29\x25\xad\x0c\xf4\x03\xe7\x0e\x94\x2d" - "\xad\xaa\x1f\xa1\xba\x14\xc8\xe9\x22\x5e\x0d\x95\x05\xf9\x98\xe8" - "\x80\xe5\xf9\x0d\x01\x3d\xd2\x64\x4c\xa3\xed\xd0\x6b\x12\xbd\x38" - "\x18\xf0\x3b\x6b\x73\xc3\xba\xed\xba\x14\xe8\x7f\x50\xae\x87\xd5" - "\xce\x41\x79\xd2\xb6\xa0\xb6\xce\xc3\x6a\x9a\xc2\xbc\x53\xad\x47" - "\x5b\x97\x64\x7b\x64\x3b\x7d\xd4\x16\x11\xa3\x50\x9e\x91\x12\xfd" - "\x06\xad\xac\x56\xfb\xae\xf5\x87\xca\xeb\x23\xbc\x13\x7b\x3b\x5c" - "\xe8\x92\x65\xbf\xd1\x3e\xb4\x3d\xb2\xcd\x6a\x7b\xad\x52\x0f\x5f" - "\x97\x18\xa9\xa7\x92\x31\x60\xea\x66\x87\xcf\x5e\x6e\x2f\x3c\x9f" - "\x46\xdc\xba\xe4\xfe\x1f\xc3\x48\x76\x61\x72\x92\x0d\xf4\x22\xe3" - "\xee\xdb\xe6\xfd\x73\xc6\xbc\xd4\x7b\xee\x5a\x24\x76\xd4\x87\xdf" - "\xcf\x5f\x39\x7a\x86\x91\x78\x65\x21\xdc\x08\xd0\x78\x4d\x38\xca" - "\xea\x7d\x72\x5f\xa5\x6e\xdf\xc8\x7d\x95\xba\x4e\xfa\x79\x19\xdb" - "\x61\xa2\x9f\x8f\x56\x25\x4a\xae\xef\x55\xf1\xa5\x8f\xda\xdb\x1b" - "\xc6\x97\x7a\x61\xe7\x0b\x7d\xb6\x94\x73\x77\x90\xac\xb1\x7d\x76" - "\xe4\xbb\x30\x4f\xbf\xc3\x36\xcc\xd3\x0f\xd3\x83\x1d\x0b\x35\xfe" - "\x9e\xd2\x0c\xc4\xdb\x4f\x02\x6f\x2f\xfd\x04\xd6\x8b\x38\xcb\x90" - "\x37\x20\x5b\x98\x75\x88\x0b\x24\xe7\x27\x78\xa8\x0c\x5a\x4f\x10" - "\x87\x1d\x72\x86\xe0\xe3\x61\x37\x2e\xe6\xe8\x8e\x12\x6d\x8e\x82" - "\x9f\x17\x71\xe4\x06\x44\xcc\xf6\xd3\xaa\x6c\xc8\x68\xde\x64\x43" - "\x37\xe0\x8d\x3e\x18\x80\xce\x16\xb2\x13\x8f\x35\x67\xab\x6d\x6a" - "\x81\xae\x00\xfc\xb0\xd0\x17\x39\xeb\x16\x0a\x1b\xcb\x4d\x53\x6f" - "\x15\x3a\x33\x61\x63\xb9\xa3\x2f\x8c\x73\xf5\x3e\x8c\x25\x60\x40" - "\x78\x10\x10\xf6\x56\xc3\x7d\xae\x8f\x1f\xee\x73\x0e\xf5\x73\x50" - "\x9c\xfb\x9b\xa4\xc6\xba\x16\x7d\x1c\xab\x7f\xa3\xf7\xad\x7e\xe9" - "\xdf\xec\x9b\x93\x4d\xc0\xbc\xd0\xfa\xf8\xd9\xfe\xd5\xef\x3e\xaf" - "\x7f\x2b\x3e\xdb\xbf\xfa\xd6\x61\x9d\x98\x9c\x23\x24\xeb\xd5\x9f" - "\x45\x3f\x81\x07\xd4\xcf\xc3\x51\x56\xe3\x57\x22\xee\x93\x46\xa3" - "\xad\x71\x45\x7a\xf5\xbc\xff\xce\xef\x62\xbf\x07\x65\x3d\xa1\x57" - "\xb2\x9e\x70\xd2\x8f\xae\xa0\xb1\x61\x1e\x96\x07\x64\xfb\x76\x2e" - "\x38\x90\xdb\x87\xb5\x39\x30\xa6\x9d\x45\x0e\x3f\x0c\x58\x02\x26" - "\xa9\x21\xef\x5c\xf8\xab\xf6\x3b\x77\x16\x0e\xd3\xe6\xaf\x2c\x6e" - "\x8c\x2a\x62\xb6\xfd\x75\x37\x20\xbd\xc6\xc3\x76\x32\xd5\x8e\xc4" - "\x77\xfe\xb7\x04\xef\x14\xf5\x7b\x97\xf6\xfd\xf9\x7e\xe4\xc4\x41" - "\x87\x15\x4b\x72\x96\xdd\x24\xce\x30\xd8\xd5\xd0\x7b\x23\xe7\x55" - "\xe9\xfe\x6b\xa1\x9b\xa0\x71\x9f\x84\xbd\x69\xb9\xfe\x35\x64\x21" - "\x1e\x2a\xbd\x4b\xe2\xc2\x4e\xff\x76\x11\xa3\x92\xc6\xe8\x76\x61" - "\xbb\x9a\xc7\x54\xf9\xa3\x61\x4e\xc4\xf9\x06\x61\x0b\xe6\xce\x13" - "\xf6\x13\x34\x3e\x3b\x3b\xc2\x36\x61\x0d\x4b\x23\xe8\x87\x29\xb2" - "\x8d\xab\x56\xda\xb2\x96\xac\x5c\xba\xea\x81\x07\x92\x6c\x6b\x57" - "\x8a\x9d\x01\x2c\x2c\x6b\xb2\xd7\x12\x7d\x10\x74\x61\xfe\xc2\x85" - "\x19\xb7\xde\xf3\xfd\x1f\x8c\xe0\x33\x8c\x55\x4e\xa5\x84\xca\x25" - "\xf9\xa7\xdc\x2b\xd7\xb1\x86\x16\x0f\xfb\x89\xe4\x79\x89\x97\xa1" - "\xb1\x9f\x76\x82\xfd\x2c\x31\x82\x5e\xc6\xd1\x73\x32\x77\x36\x64" - "\x63\x2c\xd4\x76\x05\x23\xf9\x13\x9a\x03\x51\x7e\xe7\xcf\x2c\x9a" - "\x3f\xdb\xec\x2b\x99\xde\x70\x65\x15\xab\xd6\x73\x1a\xa3\x9f\xcd" - "\xa2\x35\xf7\x30\xbd\x4f\x26\xbe\x73\xa9\xe0\xc5\x30\x26\x92\x17" - "\x77\x99\x83\x73\x05\x2f\x9e\xb1\x9e\xe9\xc0\x87\x6b\xf3\x23\x44" - "\x72\x6d\x28\x87\x77\x67\x04\x99\x05\x78\x5e\xb9\x12\xb8\x3e\x9d" - "\x07\x07\xb8\x27\x63\xbd\x91\xed\xa4\xe7\x8a\x13\x8c\xb5\xfb\x82" - "\xec\xbe\xb3\x24\x8f\xd0\x7d\x65\x0f\xcd\x8d\xa0\x02\xc7\xb2\xb0" - "\xe9\x20\x38\xff\x6c\x97\xc6\xeb\x9a\x8b\x6c\xc2\xdf\x20\x74\xe4" - "\xc0\x05\xf0\x00\x19\x21\xb3\x4b\xca\xbf\x3f\x6b\xbd\xa0\xde\x22" - "\x3a\x60\x1d\x2d\x9d\xda\x78\x00\xed\xa2\x76\x36\x52\xbb\xf6\xa2" - "\x3d\x15\x0f\xa0\x5f\x51\x37\x9a\x83\xc9\xe2\x9c\x1d\xda\x79\x9f" - "\x8f\xdd\x88\xf6\xdd\xf7\xf0\x8d\xac\xfe\x01\x81\x1f\x62\x0f\x52" - "\xb5\x6d\x30\x10\xee\x4c\xea\x61\x3f\x2f\xf4\x89\xf8\x4f\x3f\x4f" - "\xf7\x30\xa3\xb4\xbf\x52\xf5\x5f\xc8\x83\x77\x12\xc7\x7e\x5e\x28" - "\x63\xee\xfe\xbc\x50\xcb\x17\xd9\xb6\x79\x4b\x1c\xc4\x60\x2e\x7f" - "\xe0\x81\x65\xab\xd7\x68\xf1\x24\xed\xab\x56\x2c\xbd\x59\x3d\x9b" - "\xb3\x72\xd9\xba\x8c\xe5\x4b\x85\xed\x1f\xa5\xca\xdb\xf3\x78\x91" - "\x24\xc8\x04\xc2\x9e\x46\xf0\x21\x4f\xff\xa1\x5e\xe5\x49\x8e\xb2" - "\x5f\xc0\x37\x33\xad\xef\xbf\x78\x4c\xae\x0f\xd1\xa7\xfd\xce\x5f" - "\x18\xb5\xf5\xa1\x7f\xe2\x6c\xe2\xf5\x7f\x61\xa5\x31\xef\x8a\xa4" - "\x59\x38\xff\xec\x5a\x09\x1b\x80\xff\xb8\x59\xd9\xd2\x9c\xc8\x63" - "\x5e\xec\xa2\x39\x69\x02\xff\x0c\x5d\x96\xf4\x13\xfc\x8b\xa5\xa0" - "\xa9\xb0\x21\x40\x5c\xdf\x6e\xf6\x8b\x59\xc4\x8b\x10\x4e\xfd\x47" - "\x0a\xc9\x42\x89\x9b\x37\x30\xe3\x8e\x27\x79\x37\x74\x94\xd2\xbe" - "\xf8\x17\x85\x6f\xd2\x7c\x52\xf7\x28\x3c\xe5\xf4\xce\xc3\x7e\x21" - "\x7d\xe6\x97\x34\xcf\x56\xf5\x0c\xb3\x29\xdf\x6e\x0f\x33\x35\xc9" - "\x75\xe8\x25\x26\xf4\x95\x82\xee\xfc\xa2\x95\x97\xbe\x54\x25\x74" - "\x40\xa5\x2f\x31\x85\x67\x45\xe1\x99\xf8\x9c\x18\x2a\xc7\x88\x38" - "\xee\xaa\xad\x44\x14\xc1\x3c\x80\xfe\x52\xb9\x29\x38\x1f\x0e\xb9" - "\x5e\x2d\x3f\x05\x32\x3b\xad\x2b\x3e\xac\x2d\x3c\xba\x39\x81\x0f" - "\xf4\x35\xd0\xfa\x06\x3e\xd3\x1b\x57\x14\x24\x79\xb5\xd9\x26\xf8" - "\x4d\xdf\x74\x4e\x6b\x5d\x48\x9c\x4b\x5b\xcf\x62\x47\xf2\x99\xbb" - "\x16\x6a\xf8\xa7\xe0\xfb\x01\x86\xf5\xb2\xb0\x9b\xed\x12\x36\x3c" - "\xd0\xdd\x02\x86\x83\x04\x37\x82\x9d\x87\xea\x68\x24\xde\x38\xb6" - "\x87\xed\xda\x02\xf8\x55\x28\x84\xef\x83\x82\x5f\x36\x23\xce\xe9" - "\x51\xb6\x6b\x2d\x60\x87\xb2\xa8\xcf\x8d\x41\x7f\xfa\x77\xe0\xbf" - "\x02\x7d\xdf\x98\x47\x6b\xd1\x03\xe8\xff\x53\xe7\xc0\x5f\x12\x6f" - "\x2d\xee\x0b\x96\x72\x45\xc0\x5e\xd8\x33\x3c\x75\x6e\x63\x2f\x57" - "\xce\x39\x19\x6f\xa1\x55\xfd\x9c\x9e\x05\x03\x24\x07\x42\x6f\x5b" - "\x70\x12\x3e\x36\x1a\x08\xb7\x4b\x18\xd5\x6b\xac\xd8\xc0\x2c\xf0" - "\x49\x52\xe0\xe0\x81\x76\x5f\x1d\x6b\x77\xd4\xb1\xf7\x82\xd5\xcc" - "\x95\x83\xbd\xc1\xa7\x1b\x0e\xe6\x56\x83\xcf\x8b\xa6\xfb\x25\xb6" - "\x7f\x16\x75\xcd\x3e\xd8\x79\x88\x1d\x74\x1d\x62\xb6\x7f\x15\xcf" - "\x0b\x5a\xd3\xdf\x63\xad\x29\xef\xb1\x82\x6e\xae\x80\x47\xc9\x7f" - "\x08\x75\x94\x50\x59\x0d\xf0\xe5\x61\x51\xfa\xad\x31\xd4\x7f\x43" - "\x6a\x2e\xe6\xbb\x97\x70\xe9\x37\x68\xe3\xbb\xf5\x67\x98\xd1\xb5" - "\xf2\x2d\x71\x2f\x79\x87\xbe\x06\xf7\xd2\x2e\xb1\x97\x0c\xdf\x25" - "\x88\x0d\x4c\x6b\xaf\x52\x89\x36\x86\x64\xbb\x09\x5e\x06\xed\xfb" - "\x9d\xf9\xc3\xdf\x0b\x5f\xa9\x3b\x00\x0f\x6a\x53\xdb\x22\x09\x93" - "\xd6\x2e\x82\xe9\x3f\xab\xf0\x49\x8f\x84\xcf\xae\x5e\xc0\x07\x76" - "\x22\x4a\x4e\x5f\x03\xb5\x2d\x85\x60\xa0\x68\x75\x60\xfc\xa9\xad" - "\x1c\xe5\x57\x9c\x61\x26\xd7\x4a\xd8\x91\x3c\x7d\xa7\x39\xcd\x60" - "\x54\x06\x4e\x36\x56\x9e\x65\x42\x87\x8b\x75\xa8\x52\xbc\x47\x99" - "\x4f\x63\x4f\xd0\xe2\x8d\xde\x6f\xa5\x5f\x02\xfd\x6c\xc0\x43\xba" - "\x26\xd2\x78\x95\x50\x1b\x5a\x68\xac\x1a\x70\x95\x38\xbe\x57\xf8" - "\xa1\x55\x79\x8b\x70\x7a\xe9\x5e\x12\xc9\xb2\xa2\x14\x21\x2b\x3d" - "\xd5\xa2\x6c\x71\xf7\x4a\x9b\x82\x9f\x97\xed\xa0\x75\xa5\xee\x71" - "\x71\x6e\xcd\x54\x3f\x59\xc4\x07\x65\xdb\x85\x7d\xeb\xd3\xc3\xeb" - "\x7f\xa9\x88\x3b\xfa\x54\x40\x2f\xf6\x8e\x9b\xe7\xa8\x78\x3e\x87" - "\xf2\x78\x3d\xec\x12\x8f\x5c\x33\x9e\x0e\x6a\x73\x8a\xe8\xf5\x30" - "\xfe\xd3\x3c\xa5\x76\x13\xbe\x0b\xdd\x23\x09\x87\xc1\xe9\xc3\xba" - "\x47\x89\xe7\xff\x31\x4b\xc3\x73\xea\x9b\x09\xf4\x02\x73\x7b\xac" - "\x75\x9f\xe8\x6a\x2b\xf6\xf3\xf9\xe5\xe9\xcc\x44\xfc\x92\x29\xd3" - "\xcc\xdd\xc1\x03\xc0\x43\x93\x98\x3f\xf2\x1d\xf1\x3b\x5e\x33\xd1" - "\xe2\x0e\x4a\x37\x68\xe9\xa0\xcb\x0a\xc9\x88\x90\x4f\x53\xd7\x9b" - "\x79\xfe\x59\x96\x20\x74\x3d\x5a\xfa\x7a\xaf\xb9\xdd\xca\x60\xdf" - "\x17\xc4\x99\x57\x7c\x43\xe9\x51\x44\xc7\xf7\x51\xbd\x2e\xca\x1f" - "\xaf\xe5\xe7\xfd\xe9\x06\x77\xee\x01\xd1\x07\xf8\x71\xd0\xe8\x3a" - "\xa5\x4f\x48\xcd\xf5\x9a\xc5\xb8\x6b\x69\x6b\xd2\xc5\x3a\x84\xf3" - "\x75\xc4\x5f\x71\xd1\x9e\x1e\x91\xae\x23\xbe\x4d\xc4\x46\x8d\x48" - "\xd3\xe3\x2c\x23\x7c\xf0\x44\xa4\x45\x51\x9b\xd9\xf0\x33\xd5\x5d" - "\xf9\xa0\xe0\x23\xad\xa9\xeb\xa9\x3c\xd4\xf3\xa0\x5a\xf7\x7a\xce" - "\xa4\x6f\x2f\x99\x26\xd7\xbc\xdd\x35\xc3\x3c\x23\xf8\x9f\xfe\x74" - "\x51\xb7\xd2\x9f\xae\x0f\xf5\xa7\x47\xa1\x7e\x94\x05\x3d\xa3\x88" - "\xd1\x1a\xec\x65\xf0\x2b\xc9\xcb\xcd\x55\x1c\xf6\x9c\x54\xae\x68" - "\x4f\x2e\xc9\xf1\xb1\x16\xcb\xe8\xfb\x89\xa1\x05\xae\xfc\x7f\xa5" - "\x79\xf1\x0c\x70\x9f\x85\x8c\xef\x24\xdb\x1e\xc4\x1e\xd0\x33\x97" - "\x01\x07\x43\x44\x2b\x42\xd1\xef\x24\xcf\xec\x65\xba\x7c\x9a\x7f" - "\x52\xce\x7b\xe6\x9b\xf0\x81\x54\xa0\x70\x4e\xf7\x49\xc0\x7f\x73" - "\x1f\xf6\x01\xdf\x99\x25\xf6\xde\x62\xce\xa5\xb8\x03\xbd\xac\xb5" - "\xf0\x23\xd6\x1a\x74\x17\xee\x3b\xe3\x35\xc8\x3d\x38\x03\xca\xbd" - "\x13\xef\x0a\x68\xce\x65\x84\x1a\xc6\xd4\xc5\x81\xff\x25\xd8\xfd" - "\x45\xd2\xf7\x67\x1a\x34\xbe\xf7\x6f\xf4\x21\x00\x3f\x4a\xd8\xa3" - "\x57\x4a\x7f\x9f\x42\x6d\x29\xe0\x7e\x3b\x9b\xb9\x01\x72\xef\x33" - "\x1d\x71\x3e\x96\xa2\x96\x7b\x5a\x2d\x37\x70\xa1\x72\x81\xb7\xad" - "\x35\x42\xf7\x4b\x7d\xfa\x7d\x72\x88\xca\x0e\xc5\xfc\xde\x41\xeb" - "\x48\x41\xc1\x39\xe8\x40\x7e\x75\x1b\xd5\x93\xdc\x1e\xec\x60\xf0" - "\xc7\x56\xaf\xd0\x7a\x7b\xda\xca\xd4\xfd\xc6\x82\x53\xec\x97\xd7" - "\x28\xdc\x6e\x21\xfe\x1c\x3a\xcf\x02\xd0\x6a\xf0\xfa\xf9\x21\x36" - "\xd1\x9d\xed\x61\xf0\x27\x44\x65\x7c\xf3\x6d\xe8\x97\x89\xde\x85" - "\xb8\x55\xff\xdb\x01\x0f\xab\xa4\x35\x40\xf8\x17\xda\x74\xf9\xf6" - "\xb8\x22\x36\x97\xeb\xcd\x62\x3f\x99\xd6\xa7\x05\x34\xb6\x35\xa2" - "\x3d\xa5\xcd\x0b\x22\xf6\x36\xa3\xa8\xae\x67\xb1\xb7\xc9\x8d\xcd" - "\x96\x3a\xe8\x7b\xa3\xcf\xd9\xbc\xd1\x01\x0b\xa7\xb1\xf3\x3b\x7f" - "\xe9\xf1\xb0\xdd\x62\x5d\x2f\x83\x2d\xad\x58\x33\x7e\x75\xa7\x37" - "\xfa\x03\x2b\xca\x82\xff\x01\x25\x27\xd8\x58\xf9\x29\xf1\x2f\x02" - "\x2e\xbf\xba\xae\xbd\xcf\xef\xe2\x25\x1f\x58\x31\x9f\xd4\x3a\xcc" - "\x54\x47\x88\x6f\xf9\x80\x78\x82\x5f\xa9\x6b\xb3\xb8\xb7\xe2\x7d" - "\x70\x08\xb6\xbf\xbf\x2c\xab\x1b\x84\x8e\xed\x97\xb3\x89\xbf\x73" - "\xf5\x1b\x3f\xb0\x7e\xdf\x5a\x48\xeb\xfb\xaf\x32\x3d\xba\x77\x93" - "\x54\x99\x5b\xf8\x4c\x1a\x73\x7f\xbb\xd6\x1a\xe3\xa6\x42\x88\x57" - "\x8d\x3f\xc1\x9e\x7d\x7f\xd0\xc9\xf4\x43\xb4\x46\x0f\xea\x89\x4f" - "\xaf\x4d\x37\x55\x4c\x65\xc9\xf4\x6e\xea\x09\xf6\xab\x97\x83\x7a" - "\x16\x4f\x3f\x8b\xf7\xf2\xac\x68\x2a\x37\x05\xfa\x88\xb6\x33\x90" - "\x3f\xf7\xc8\x73\xc2\xdb\x59\xa2\x42\xe5\x41\x8f\x5a\x39\x95\x25" - "\x42\x27\x40\x69\xf6\x8c\x90\xdc\x63\xd0\xe4\x97\x4d\x53\x59\xd2" - "\xc8\x7a\x7f\xa5\xfa\x42\x7a\x56\xc4\x8c\x5b\xe7\x65\x57\x38\x6e" - "\xe1\x47\xa9\x5c\xf8\xa0\xe5\xfc\x72\xab\x5e\xee\xc5\xed\x59\x6f" - "\xae\x91\xf8\x27\x74\xea\x84\x77\xd8\xb3\x50\x75\xb5\x3a\xe1\x2b" - "\x2a\xe6\xa0\x0b\xb6\x97\x11\x3a\x19\x8b\x68\x87\xea\xe7\x25\xb4" - "\xe9\xda\x4c\x94\x81\xf6\x64\x2c\x91\x7a\x5e\xf8\x80\x21\xb8\x0a" - "\x3f\xbe\x65\xdb\x99\xe9\xd1\xed\xcc\xd2\xf6\x80\xe8\xd7\x6e\x39" - "\x27\x0d\x0c\xed\x55\x4a\x30\xdf\x08\x37\xa8\xdd\xa8\x0f\x38\xd2" - "\x1e\x3c\xed\x2a\xc8\xe6\x8a\xeb\x41\x9c\x3f\xdc\x73\xdc\xb5\x7a" - "\x0f\x4b\x85\xcf\x1c\x9c\x9b\x5f\xcc\xbc\x3b\xa9\xbc\x9d\x53\x99" - "\x85\xca\x3a\xeb\x5e\x01\x9a\x6b\xfd\xb2\x6b\xf5\x5e\x2a\xfb\xd9" - "\x68\xac\x6d\xe5\x04\x1f\xb9\xc6\x3d\xbb\xcf\x1d\xe8\x62\xf0\x91" - "\x7b\x97\x83\x87\x50\x0e\xe5\xf9\x96\xe8\x6f\xad\xd5\x96\x21\xfd" - "\xf4\x88\xbe\x0e\xeb\xcf\xd5\x7e\xb8\xcf\x88\xf2\x16\xb9\x33\x89" - "\x2f\x57\xfb\xa4\xc1\x5a\xe2\xd7\xb3\x8f\xb9\x56\xef\x62\x18\x1f" - "\xe4\xa7\xe7\x42\x77\x1f\xe5\x3d\x39\x72\x5c\x90\x87\xde\xbd\x40" - "\xe5\xfe\x53\x78\x5f\x08\xfb\x15\xe1\x3c\x75\xd4\x1f\x82\x95\xaf" - "\x96\x60\x24\xf5\x68\xcf\x4e\x43\x5b\x69\xec\x12\xdc\xd9\x1f\x8d" - "\x6e\xf3\x4c\x34\x80\xf0\xbe\xa8\x5d\xe8\xc2\x9f\x8b\xbd\x2b\xa8" - "\x70\x49\xd7\x9e\x73\x29\x44\x0f\x3c\x74\x05\x4d\x10\x74\x65\x06" - "\xfc\x2f\x3d\xf7\xa6\x59\x27\xc7\x17\x7d\x01\xff\x35\xda\x18\x47" - "\xe8\xe9\x2d\x68\xab\x36\xc6\xdc\x18\x5a\xa0\x60\xff\x65\x2a\xc1" - "\x7b\xc8\xca\x24\xfe\xf1\x2a\x2a\xf7\x05\x95\xc7\x2d\x53\xd7\xe6" - "\xb2\xfe\xe8\x77\xe6\xf0\x47\xac\x4c\xb3\x7f\xa0\xf9\x3b\x3b\x43" - "\xda\x94\x58\x41\xab\x76\xea\xb9\x1a\xe7\xe4\x39\x97\xfa\x6d\x89" - "\xf4\x3b\xf6\x5c\x21\x7d\x5f\x32\x6a\x7f\xa3\xa6\xc2\xd7\x6a\x01" - "\x7c\x12\x89\x7d\x72\xa2\x59\xb4\x2e\x4c\x74\xfb\x06\xc5\x19\x95" - "\x1e\xf6\xfc\xcd\x88\x57\x0b\x3b\x74\xad\x6d\xe3\xd3\xa9\x3f\x6f" - "\x94\xba\xb5\xe7\x17\x68\x72\x23\x37\x12\x8c\x9d\x66\xe1\x2f\x15" - "\xfb\xae\xbe\xe8\x50\x9a\x37\xd6\x5c\x28\xe7\xcd\xf3\x0e\x1e\x2d" - "\xe9\x6e\x46\x80\x15\xa2\x5f\xaa\xfc\x34\x11\x7d\xa6\x72\xaa\x48" - "\xa6\x9d\x2f\x79\x0b\x59\xf6\x98\x3e\x88\xb5\xbe\x51\x9f\xe4\xf9" - "\xa5\xd0\x02\xd1\x37\x9c\xc1\x15\x7d\x6b\x8c\x15\xba\xac\xf1\xf5" - "\xa7\x4b\xc2\x36\x94\xe6\x9a\x8a\x32\x5e\x78\x4a\xd8\x07\xd1\x98" - "\x48\x9d\x63\x63\x26\x8f\x79\x34\x66\x7c\x65\x36\x4a\xbb\xe2\x32" - "\x73\xe1\x56\xc4\x08\x10\x36\xc9\x38\x37\xf2\x42\x39\xd1\xf4\x42" - "\x11\x33\x99\xea\x23\xfc\x88\xa0\x43\x2f\x58\x30\x56\x33\xf6\xb0" - "\x14\x89\x87\x2f\x4c\x80\x4e\x49\xfa\x88\x6f\xdc\x4b\x78\xaf\xea" - "\xe4\x34\x5b\x19\x9d\xb0\x95\x89\xa4\xb1\xe3\x6c\xa3\x8c\x91\x19" - "\x33\x40\xfc\x61\xe3\x2e\x61\x23\x48\xed\x5d\x17\xd4\xe8\x5f\xe3" - "\x2e\x3e\xc0\xbb\xa1\xf3\x03\xff\x94\x01\x5a\x96\x2f\x7d\x78\xf8" - "\x9d\x2f\xcc\xd7\x78\x15\xf0\xd6\xb0\x85\x42\x3e\x1a\xfb\xd3\xc8" - "\x23\x7d\x0c\x9c\x50\xcf\x33\xbc\xf0\x03\xf5\xac\x82\x1d\x76\x4a" - "\xf4\x2d\xd1\xbb\x4e\x31\xde\x80\x01\xea\x16\x6d\xd7\x43\x9f\xf5" - "\x42\x5d\x58\xc7\xda\x28\xec\xa2\xe4\x79\xa3\x17\xf6\x6a\x38\x42" - "\xfd\x9d\x28\xfd\x02\x37\x4e\xdb\x9f\xc4\x04\x0e\xf4\x73\x6b\xcc" - "\x55\x75\xc0\xc9\x17\x0e\x47\xc2\x29\x35\xa8\x14\x48\x1a\xd4\x78" - "\x80\x8b\xb9\xde\x78\xe0\x6f\xf3\x15\x2f\x5e\xaf\xf1\x24\x12\xce" - "\x16\xa2\x2f\x7b\x83\x02\xd6\x25\x2f\x79\xe1\xcb\xeb\x91\x7c\xf8" - "\x23\x7c\xf1\x53\xf8\x7a\x0c\x96\xec\xb5\x84\x0a\xac\xf0\x23\xcf" - "\x94\x92\xbd\xb6\x1e\x07\xd3\x67\x38\xa0\x57\x3e\xe4\x81\xbc\x48" - "\xf2\xa8\x85\xc7\x10\x9f\x42\xf3\x7c\xe3\x72\x66\xfe\x61\x16\x95" - "\x5d\x60\x8f\x87\x2f\x46\xf8\x61\x84\x2f\xd5\x50\x81\x7d\x32\xdd" - "\x4f\x21\xbe\xce\xc2\x8d\x7b\xc5\xd9\x95\x90\x93\x13\x3d\x3e\x0c" - "\x7f\x90\x7a\xb7\x37\xc0\x36\x9e\x64\x46\xf8\x7a\x0c\x6e\x39\x44" - "\xf2\xda\x9f\x84\xac\x14\xe7\x60\xf1\xc4\x87\x24\x10\xcc\xad\x4a" - "\xf4\x21\x8f\x37\xfa\x50\xb7\xec\xf7\x69\x2e\xfb\x2d\xdb\x8d\xf6" - "\x4b\x1a\xf7\x6b\x5b\xbe\x68\xfb\xde\xad\x41\x2a\x5f\x29\x79\x2d" - "\x21\x54\xf2\x9a\x55\x9e\x99\x69\x65\xf9\xd9\xbc\xd7\xed\x6b\x25" - "\xf9\xed\xac\x88\x7d\x81\xbd\x6f\xf4\x11\xfd\x43\xdd\x07\xcf\x9c" - "\x14\xbe\x2b\x83\xf4\x5c\xb0\x42\xfd\xa6\x8f\xbe\xe9\x6b\x65\x83" - "\x25\xaf\x89\xbe\xb7\xfb\xe4\xb7\x19\xe2\x1e\xdf\x47\xc0\x41\xed" - "\xf3\x30\x1c\xa8\xef\xe8\x1f\xfa\x1f\x04\x4c\x08\x06\x6a\x5f\xad" - "\x43\x6a\x3f\xd1\xc7\xf7\x68\xd5\xd9\x4e\xfd\xa4\xbe\x8a\x7e\x0e" - "\x51\x3f\x5b\xb2\x18\x0b\x94\x86\x32\xcf\xc5\xbc\x66\x85\xbc\x5b" - "\xf0\x3e\xf1\xf2\x79\x55\x8c\xe4\x5a\xc3\xb3\xf9\x55\xfa\x52\xe2" - "\x4d\xf2\xbd\x24\xdf\x7a\x79\x6f\x3b\xf5\xc9\xed\xa0\x5f\xb0\x8e" - "\x81\xc7\xd1\xf8\x76\xaa\xdb\x7a\x50\x39\xc6\xf2\x7b\x79\x2f\xf1" - "\xa8\x01\x77\x90\xf2\x64\x51\xff\x49\x1e\xee\x51\xdb\x8f\xbc\x1b" - "\x3f\x95\xfd\x32\xaf\x60\xf1\x6f\xfc\x6b\x89\xde\xdd\x55\xc2\xb4" - "\xbe\xdc\x47\xf9\xa8\x3f\x56\x2a\x4b\xc4\x5c\x54\xa8\x9f\xb5\xd4" - "\xce\x40\x44\x9f\xda\xfa\x02\x54\xe6\x87\x2c\x26\x8d\xe9\xb6\x9f" - "\xa2\x7e\x9c\x62\xd6\xaa\x7c\xe2\xbf\xee\x06\xdf\xf8\x52\xdb\x45" - "\xe9\x2c\xd1\xc3\x5e\x94\xf1\xba\xa4\x6f\xb9\x4b\x4e\xb0\xbd\x67" - "\x35\xff\x71\x0a\xfc\x6f\x46\x1f\x0a\x02\x8f\x84\x2f\x39\xac\x19" - "\x7e\xc2\x19\xec\x51\xaf\xa3\x3a\xfc\xf6\x29\xa2\x3d\x4e\xe9\x7f" - "\x8e\x9e\xe1\x0b\x1b\xf6\xe8\x3a\xfa\x2e\xc0\x09\x66\x28\x9f\x6f" - "\x39\xd4\x8d\x2b\x60\x38\xaa\xed\xd0\x73\x6c\x36\xd5\xb1\x00\xb2" - "\x7c\x63\xbe\x57\xff\x93\xe7\x58\xd2\xf8\x68\xca\xcb\x89\x63\xd1" - "\x6f\xe8\x24\x51\x1e\xf5\x6d\xf2\x09\xf6\xeb\xe8\x91\x73\xcc\x26" - "\x68\x99\xa4\x83\x2f\x77\x40\xe7\x37\xce\x7a\xa5\xdf\x4a\x27\x2f" - "\x19\xe7\x77\x9d\x5a\x3b\xe8\x7e\xcc\x58\x23\xe3\x87\xc3\xaf\x93" - "\xc6\x2a\xab\xfc\x49\x71\x36\xae\xa0\xe2\x49\xa2\x17\xc4\x2b\x20" - "\xb6\x3b\xf8\xba\x03\xbb\x7c\x6c\xcd\x0e\x66\x2c\x38\x09\x1d\xd3" - "\x9d\x6c\x7f\x5d\x32\xab\x3f\x03\x9f\x10\xf6\xc9\x4f\x9c\xc1\x3e" - "\xa3\xa4\x21\xe0\x49\xa1\x3b\xe5\x6b\xec\x96\xca\x27\x35\x1e\xfe" - "\xd7\x67\xf3\xce\x32\xbd\x8c\x37\xfa\x6b\xdf\x7c\x1b\x0f\x56\xeb" - "\x95\xac\x3a\xf8\x56\x8c\xf1\x3b\xe0\x5b\x51\xf3\x35\x28\x78\x9f" - "\x5c\x9a\x73\xfd\xd6\x98\xf2\xd5\x2c\x09\x7e\x51\xcd\x5e\xc9\xcb" - "\xc9\xf5\xfa\x95\x44\x6a\x9f\x45\xdd\x5b\xb3\x48\xff\x83\x2f\xaf" - "\xd8\x79\x46\xe8\x3b\xf1\xfe\x9e\x10\xc9\x32\xa2\xdc\xd5\x2c\xb1" - "\xee\x0c\xb3\x83\x0f\xca\x38\x26\x79\x36\xc8\x87\x77\xf6\x99\x79" - "\xe8\x13\x3b\xdb\x71\x22\xec\x37\xd5\xbb\x06\xbe\x56\xf9\xa8\xfa" - "\x58\xe8\xd1\x2b\xa7\x88\xbd\x74\xe1\x0b\x0b\xf6\x01\xf4\xcc\xaa" - "\x1f\x67\x86\xfd\x09\x8c\x41\x6f\x88\x7d\xb9\xfd\x41\x79\x1e\xc3" - "\xef\x7c\xe5\x80\xe6\x57\x72\x74\x5a\x7e\xce\x36\x53\xf0\x58\xe7" - "\x6c\xe3\x1b\xb7\x57\xba\xc7\x94\x55\xa8\x4c\xe0\xc1\x17\x2b\xb7" - "\x69\xce\x05\xf8\x1a\x83\x52\x22\x65\x33\x65\x22\xc9\x8c\x5e\xbf" - "\x4b\xfa\x43\x6a\x6a\x72\x6f\x56\x22\xe4\xb1\xa6\x6d\x78\x87\x34" - "\xf8\x98\x48\x11\xe3\xde\xe4\x81\x8c\xa6\xca\xb9\x6f\xd8\x86\xd3" - "\x24\xbf\x85\x75\x17\xf0\xda\x29\x7d\x56\xc5\xf9\x9d\x4d\x41\x6d" - "\xed\x05\x0f\x22\xf5\xd1\xaf\x5a\x3c\xba\x83\x4b\xc7\x82\x25\xf6" - "\x4c\x84\xff\x2c\xd8\xba\xc0\xaf\xa5\xf3\xd5\x14\x6d\x2d\x16\xe7" - "\x5c\x37\x4d\xbd\x75\xcd\x7a\x96\xf0\xfd\xcb\x8c\x0c\xfb\x52\x94" - "\xb7\x57\xf2\x08\xaf\x66\x85\x75\xf8\x29\x02\x37\x70\x5e\x4a\xc8" - "\x43\xf0\x43\x24\xfd\xb9\xf6\x69\xfe\x88\x24\xaf\xf0\xea\x4f\x22" - "\xea\xd9\x3d\xbc\xe6\x53\x1d\xd8\xef\x45\xf9\x92\x8f\x7a\x75\xb1" - "\xb0\xb9\xa7\x7c\x92\x17\x78\x75\xf1\x05\xe0\x6b\x07\x7c\x15\x55" - "\xf6\x75\xf7\x7d\x2c\xe1\x9b\xcb\xa2\x60\xd7\xfa\x46\xbe\xc7\x10" - "\x27\xfd\x0c\x9a\xa9\xfe\x73\x78\x8f\x79\xe9\x9a\x01\x3d\xe8\x6f" - "\xee\x71\x83\xc7\x18\x4a\x37\xdd\x05\xfd\x84\x90\x1b\x7e\x33\x1f" - "\x36\xa7\x94\x36\xf9\xf5\x53\x01\x43\xe5\x06\x96\x24\xfd\x3a\xfd" - "\x46\x9c\x13\xf3\x5e\xfa\x63\xff\x55\xf1\xcc\x7a\x55\x35\xb3\xfb" - "\x9d\xbf\x59\x41\xb2\xb0\xf0\xed\x28\xea\xaf\x30\x37\x0a\x1b\xd8" - "\x41\xcf\x04\x39\x56\xaf\x45\xd3\xb3\x3d\xfc\xfc\x9b\xa7\xd4\xfd" - "\x9b\x0e\x0f\x7b\xcd\xb8\xf3\x94\xe0\xa5\x3a\x84\x4e\xac\x24\x60" - "\x0d\xdb\x0f\xbc\x26\xfd\x70\xd0\x75\xbf\x83\x31\xd8\x93\xd6\x4f" - "\xe1\x1d\x54\x1f\xf1\x3f\xaf\x26\xa8\x3a\xa4\x0e\x81\x57\xe0\xcd" - "\x8b\x21\x2f\x7e\xec\x82\x4d\x2a\xd6\x34\xe2\xe5\x52\xa4\xbc\x11" - "\x48\x56\x08\x7f\xc2\xfd\xff\xcd\x5a\xe8\x59\x47\xa5\xdf\xdb\x19" - "\x13\xdf\x6c\xf1\xa7\x0b\xbb\x93\x72\x0b\xd2\x8c\x34\x17\xec\x74" - "\x35\x11\xce\xe1\x6a\xa1\xab\x8d\xae\xf1\xc4\xe7\x7a\x81\x97\x24" - "\x6f\x5b\x11\x8f\xa7\x3f\xda\x9f\x36\x96\xed\x38\x60\xe3\xde\xfc" - "\xcf\x4c\xda\xd6\xbd\xd6\x87\x58\x2c\xa9\x3b\x18\x5b\x13\xe4\x83" - "\xb6\x2b\xd8\x24\xea\x6f\x5f\xc1\x0e\xec\x81\xbf\xe6\x1a\xb9\x07" - "\xfe\x9a\x87\xb1\x7d\x36\xfa\x51\xca\x3e\xe2\x23\x5f\xeb\x0b\xff" - "\xf6\x79\xfc\xce\xd7\xfa\x08\x8e\xd2\xd7\xd4\xb8\xe6\xeb\x6b\x22" - "\x46\x5e\x25\x64\xb8\xe8\xdf\xdb\x64\x7f\xcd\x99\xf4\x6c\xe4\xb1" - "\xe6\x06\xb5\xbf\xb3\xe9\xd9\x62\x2b\xa0\x35\x38\x9a\x60\x32\x95" - "\xfa\x1c\x6b\x31\xa2\xbf\x68\x6f\x7f\xf4\x39\x7b\xa4\xdd\x3c\xca" - "\x44\xff\xbd\xd1\xf4\x1d\xc1\x92\x7f\x65\x71\xa3\x06\x4f\x15\x4e" - "\xb0\x35\xd6\xf7\x53\x19\x92\x67\xa3\xfc\x54\x86\x96\x7f\x18\xf6" - "\x53\xe1\x23\x85\xc6\x94\xf2\x91\xfc\x6e\xd4\x6c\xf2\xfd\xce\x7d" - "\x5d\x6f\xae\x90\xfb\x2a\xf8\xd6\x17\xf1\x2d\xce\x41\x8f\xf8\x3e" - "\x36\x62\xec\xa6\xc2\x57\xc0\x07\x16\x39\x76\xfe\x4c\xb5\x2d\xf1" - "\xa2\x2d\xd1\x01\x0b\xe1\xd8\x49\xd9\x9e\x7d\xad\x63\xcd\xb1\xfc" - "\x2b\x89\x47\x25\xce\x7d\xa6\x94\x5d\xe7\xb8\x13\x7c\xcc\x5d\xa7" - "\x10\xdf\x12\x48\x4b\xc9\xe7\xae\x1e\xf6\xdb\xa7\xda\x03\xbd\xe3" - "\x5c\xd3\x7f\x2b\x63\xa4\x0d\x16\x32\x77\xde\x0d\xd8\xa7\x65\xa7" - "\xd8\xeb\x1f\xba\xbd\xe2\x8c\x12\xee\x85\x3d\x24\xf6\xa7\xb1\xbe" - "\xc1\xf7\xaf\xa6\x27\x50\x28\x6f\x3d\xd2\x29\x0d\xe7\x26\x77\x46" - "\xbc\xe3\xa5\xfe\xd9\x72\xae\xbd\x5e\x0e\xfe\x48\xb4\x37\xf8\x1d" - "\x17\xda\xac\x94\xf8\x67\xa3\x0f\x05\xb0\x1d\x0e\xfa\x5d\x98\x2b" - "\xb6\x1c\xe8\x3d\x5f\x5f\x4e\xf8\xc8\x95\x2d\xfe\xd9\xe3\xeb\xc3" - "\xeb\xb3\x50\x67\x41\x90\x9f\xf2\x46\xfb\x67\x83\xaf\xaa\xcc\x9f" - "\x60\x9c\x57\xc7\x5d\xfd\x31\x81\x34\xbf\xf3\xf5\xb2\x37\x73\xe5" - "\x98\x8d\xb3\xdc\x32\xad\xef\xf5\x6a\xdf\x09\x5e\x02\x67\x67\xd6" - "\x48\x9f\xca\x94\xe7\xc0\xd8\x6b\x59\x20\x19\x6b\x19\xad\x19\xe7" - "\x24\x2c\xde\x88\x1f\x5e\x33\xc6\xd5\x8e\x37\xe2\x3f\x47\x1d\x43" - "\x6a\x1d\xb9\x5f\xb0\x8e\x0b\x9c\x8f\x11\x3c\xe3\x34\x92\xfe\x0d" - "\xe3\x97\x7f\xdf\xe8\x90\xb6\x4d\x81\xd9\x92\x96\xbe\xb9\x36\x44" - "\x32\x68\xd0\x64\x16\x3a\x06\xd8\xba\xba\x3d\x41\x16\x2c\xf9\xbd" - "\xad\x2d\x77\x90\xb9\x72\x0e\xb1\x6e\xe6\x12\xf1\x0f\xda\x88\xda" - "\x90\xac\xdc\x30\x54\x1a\x68\x18\xd2\xbf\x81\x58\x3d\x59\x3b\xe0" - "\xbf\x3a\x02\xcf\xda\x7d\x87\x98\x3b\x13\xba\xe2\x0e\xe8\xe8\x1b" - "\x88\x6e\x64\x2a\x44\x33\x48\xce\x08\x09\x78\x10\x0f\x26\x65\xc6" - "\xd0\x02\x21\x33\x7a\x85\x5f\xb7\x58\xe2\xdd\x4d\xdc\x59\x16\x84" - "\x1e\x3f\x34\x94\x6e\xf3\x3b\x59\x1a\x7c\x49\x43\x87\xce\x8d\xcd" - "\xf6\xd4\x60\x14\x17\x32\x21\xc9\x2f\xf0\x29\xed\xf6\x79\x58\x88" - "\x64\x81\xba\x01\x16\x5f\x47\xfc\x33\xd1\x72\x0b\xe8\xfd\x4e\xd5" - "\xa7\x74\xf9\x40\xd8\xa7\x74\x3d\xf4\x55\x5d\x74\x3f\xc0\x0c\xa1" - "\x2d\xa1\x05\xb5\x03\x2c\x71\x47\x0e\xb3\xd7\x42\x1f\x79\x5c\xf2" - "\x6f\xe0\x37\x84\x7f\xe9\x55\x76\xec\x8b\x84\xf9\x37\x9c\xb1\x0b" - "\xd3\x33\x83\xd0\xe3\x8c\x0b\xde\x6f\x0a\x9b\xac\x60\x89\x3f\x3d" - "\x68\xb2\x18\x87\x4a\xcf\xd9\x3d\xcc\x95\x3d\xa4\x7f\x7d\x54\x7f" - "\x8b\x9a\xfd\x49\x75\x84\x4f\xf0\x37\x13\x25\xdd\xa7\xb2\xc6\xf4" - "\x4d\x1c\xaa\x4d\x67\x33\xfb\x58\xb2\x3c\xdf\x12\x4d\x6b\xe5\x5b" - "\x09\xb0\x49\xcc\x7f\x88\x59\x43\xb5\x8b\x75\x05\x3f\x63\x51\xee" - "\x60\x0a\xc3\x2f\xff\x53\xde\x3b\x73\x05\x4b\xc6\x5e\x0a\xf6\x7d" - "\x6c\x8f\x20\xff\x9b\x27\x13\xf3\xd8\x88\x75\xea\xa1\xf5\xab\x97" - "\x5f\x9f\xfc\x6f\xcb\x6c\x0f\x2c\x5f\xfd\xd0\xba\x25\xab\x97\xb1" - "\x05\xd2\x84\x43\xb8\xcc\x5c\x0f\xfb\x8d\x75\xcb\xb3\xb3\x6c\xf7" - "\xaf\x5d\xbd\x7a\xd9\xca\x6c\xdb\x9d\xf3\xd2\x3e\xeb\x37\xa9\xd6" - "\xba\x4b\xf8\xc9\x13\xb6\x7d\xfb\xdb\xf8\x4f\xbf\x36\x50\x91\xc3" - "\x0c\xe6\xa2\xdb\x16\x99\x83\x0b\x6c\x32\xae\xc4\x7e\x2f\x6c\x69" - "\x79\x41\x7a\x8d\xe4\xb5\xf7\x7f\x2a\xe5\x93\xd6\x46\x79\x66\x73" - "\xbf\xd0\x13\x73\xff\x82\x04\x39\xa7\xf6\xeb\xa2\xb2\x19\xee\x1f" - "\xc2\xbd\x39\x9b\x95\xb8\xa6\x62\xbf\x7e\xbf\xdc\x57\xa9\x5d\xa8" - "\xd3\xf2\x69\x79\xe4\xfb\xb7\x3c\x78\x5f\x2f\x7c\x88\xbd\x65\x27" - "\xf8\x4c\xf6\x3b\xf7\x5b\x3d\xfa\x17\x35\x1f\x7a\xbd\xd2\xfe\x6e" - "\xbf\xf0\x23\xc4\x7f\x7a\xf9\x80\x5a\x4e\x1a\xd5\x77\x11\xe5\x9d" - "\x4f\x63\xd0\xaa\xda\xe9\x4d\x3f\xaa\xb6\x4b\xda\xc2\xbe\x75\x93" - "\xb4\x35\xd9\x9f\x15\x71\x5e\x4f\x9c\x55\xc4\x9a\xa9\xf2\xaa\x7e" - "\xb5\xbc\x32\x8d\x26\x50\xfe\x1a\xe2\xf7\x6c\xe3\xa7\x85\xfb\xe5" - "\xb9\xca\x11\xe7\xc3\x55\x38\xd5\x5a\x9f\x26\xfa\x90\x70\x82\xbd" - "\x55\x78\x3e\xbe\x0c\x8f\xe0\x77\x57\xde\xbf\xea\x21\xc7\x92\xec" - "\xe5\x3f\x5a\xbe\x62\x79\xf6\xfa\x9b\x44\x80\x14\xf1\xef\xdb\x57" - "\x2f\x5d\x74\xbe\xcf\xcb\x24\xe8\x89\x70\x36\x0a\xb2\x3e\xf4\x73" - "\xb0\xb1\x90\xfa\xba\x03\x5b\x84\x6f\xbb\x71\xb5\xfd\x80\x7a\x7e" - "\xf2\x40\xb5\x47\xf7\x5e\xb6\xd4\x5b\x9d\xb3\xb9\xbe\x1c\x42\x79" - "\xe2\x5d\xbf\xc9\x0c\x1b\x8e\x39\x47\x59\xcb\x1c\xec\xd9\x11\xfc" - "\xec\x58\x0f\x2b\x36\x60\xdd\xf2\xb0\xb6\xe0\x0d\x6a\x5c\xbb\xb7" - "\xb7\x01\x06\xe0\x15\x09\x06\xbb\x8e\xb2\xb7\xa5\x8c\x7d\xda\xba" - "\x0b\xb6\x4b\xca\x69\xeb\xd3\xc0\x2d\xb4\x57\xe1\xe9\xb5\x9c\xa7" - "\x6f\x57\x4e\x67\xd5\xf2\xd3\x59\xdb\xc3\xfe\x76\xde\xce\xa6\x6f" - "\xf7\xd0\xb7\xeb\xe1\xbf\xbf\xe2\x14\xdb\x03\x7b\x00\x3c\x9b\xb3" - "\x2d\x2c\x64\x0c\xd8\xd0\x1e\x77\x6f\xb2\xe0\xc3\xbb\x29\xbf\xdb" - "\x77\x03\x23\x1e\xd3\x0e\x7b\x0c\xb1\xf7\x18\x4d\x7c\x20\x7d\xe7" - "\xa6\x76\xb9\x7b\x07\x21\xd7\xdb\x14\xe2\x05\xa9\xaf\xbb\x68\xfd" - "\x4c\x43\xb9\xb0\x07\x21\x7e\x95\xf8\xb3\xb7\xcb\x3c\xec\x2d\x6d" - "\xcf\x53\xd8\x82\x8c\x1c\xc7\xb7\x9f\x25\x38\x4f\xd2\x7c\x7c\x62" - "\x2d\x81\xcc\x10\x3e\x17\xf9\xf6\x87\xe8\x23\xf6\xf3\xef\xf2\x71" - "\xa5\x5e\xbc\x7b\x39\x33\x62\x7f\x1d\x79\x84\x7f\x6b\xd8\xb3\x38" - "\x36\x20\xce\x69\xf3\xc5\x12\x5f\x5e\xce\xf0\x16\x64\x45\xa9\xe5" - "\x86\x50\x2e\xfc\xc8\x48\x58\x36\x5f\xef\xde\x7c\x4a\xb3\x23\xa1" - "\x76\x34\x7f\xa8\x96\xd1\x87\xb9\xac\x38\xf7\x07\x61\x4b\x2d\xfc" - "\x46\xca\xb3\x48\x3a\x92\x4f\xe1\xa7\xc8\x52\x3f\x59\xfa\x97\xf5" - "\x3b\x9b\x87\xf1\x9f\x1b\x25\x2f\x08\x7e\x0c\xf1\x49\x80\xff\xe0" - "\xed\xd0\x3e\xe0\x3f\x95\x5f\x8d\x7d\x7b\x39\x0f\x9a\x1b\xbe\xd8" - "\x3c\x68\x6e\xd0\x60\x21\xe5\xc7\xe6\x64\xae\x2f\xe0\x33\xcb\x58" - "\xa6\xb0\xaf\x50\xcf\xdb\xd1\x1a\x92\x20\x69\x4b\xcb\x34\x61\x1b" - "\x93\xd3\xd7\x40\x34\xbe\x70\xe7\x20\x33\x29\x25\xcd\x36\xf0\xe2" - "\x6d\x79\xc2\x2e\xc5\x48\xdf\x35\xc2\x6e\x05\x76\x78\x71\x22\xf6" - "\xcd\x21\xb6\xf3\x2c\x33\x74\xb3\x77\xec\xd8\xdb\x0a\x8f\xc3\x3b" - "\x1b\xb1\xa7\xc9\x4b\x5f\xec\x32\xe7\xe9\x4b\x50\x86\x32\x70\x72" - "\xb6\xf6\x1d\xce\xc5\xe1\xbb\xa3\xec\x9d\x25\xe2\x3b\xe4\x05\xcc" - "\xf2\x2d\x8b\x89\xe7\x4a\x47\xfe\x20\xf1\x62\xf5\x8a\x25\x8d\xd3" - "\xda\x10\xca\x09\x36\xd2\xbb\x45\x4a\xc9\x39\x3b\xa5\xa5\x8b\x3d" - "\x95\x21\x2b\xf6\x5c\x09\xd7\x3e\xb0\xba\xbb\x3f\x76\x89\xf6\xc0" - "\xfe\x34\x9b\xd6\x51\x21\xbb\xbc\xf3\x72\xfd\x71\x1a\x8f\x29\x22" - "\x36\x08\x8d\x73\x8b\x38\xe3\x42\xb8\xb8\x5b\xb6\xb1\xe5\xb6\xfe" - "\xd2\xd7\xac\xfd\x84\xab\x3e\xbd\x91\xed\xb7\x06\xb0\x86\x7b\xf7" - "\x5b\x07\x69\xac\x5a\xe2\x89\xf6\x2d\x90\xbc\xb3\xfc\x0e\x38\x1a" - "\x65\x8d\x1b\xa2\x77\xc9\x9a\x9d\x94\xb4\x55\x7a\xc7\x08\x98\x11" - "\x3e\xb7\xb4\xaf\x80\xbd\x9b\xd2\x4a\x75\xb0\x50\x8e\x72\x18\xfb" - "\xfd\x38\x53\x00\x79\x27\x35\x97\xf7\x43\x7e\xc3\x39\x2c\xec\xf1" - "\xe3\x8c\xe2\x0e\x92\x7f\x51\x2e\x95\xb9\x59\x3b\x47\x58\x4e\x69" - "\x02\xef\xa3\xee\x3d\x5e\xf1\xa0\x98\x73\xb0\x0d\x35\x89\xfd\x8d" - "\xa8\x1f\x1f\x27\xbc\xee\xaf\x3f\x25\xf6\xe5\xfa\xeb\xd5\x72\xe0" - "\xa7\x80\xca\x68\xd1\xca\x50\x72\x78\x37\xec\xf2\x42\x03\xdc\x23" - "\xbf\x97\xf6\x1b\x77\xf9\x14\x71\x46\x06\xdf\x4b\x3b\x8e\x96\x60" - "\x84\x5d\x3c\xd1\x9d\x77\x4d\x9a\x1f\x03\xba\xb7\x6a\xf2\x3a\x60" - "\xd4\x5f\x12\xb0\xf9\x68\xae\xfb\x4a\xfc\xc4\xa7\xbe\x3b\x8b\xe8" - "\x7d\xf5\x05\x74\x04\x06\xd0\x44\x9c\xfb\x55\x62\x9a\x17\xe0\xec" - "\x2f\x7c\x6d\x4a\xdb\xf6\x77\xb7\xaa\xe7\x80\xa3\x4e\xb1\x77\xbf" - "\x17\xde\xef\x0f\xa9\x3a\xea\x77\xf7\x49\xf9\xe2\xdd\x7d\x42\x47" - "\x5d\x1a\x60\xbf\xd8\x10\xd0\x37\x6e\xf0\xe8\xa5\x6f\xd7\x77\x1b" - "\x3d\x24\x01\x68\x76\x69\x94\xcf\x81\xb2\x46\xe7\x07\x5b\x8d\xb2" - "\xcc\xf7\x84\x1c\x1d\x96\xe3\xdf\x13\x7e\xe5\xb0\x37\xaf\x80\xb7" - "\x8b\xf9\x7d\x32\xec\xb9\xdc\x8e\x33\xd0\x55\x4f\x94\x3a\x05\x99" - "\x47\xb5\x9d\xfc\xd2\x89\x91\xcf\x93\xf1\x2c\x61\xf6\x5e\x8a\xb6" - "\xef\x55\xa1\x57\x3c\x66\x1d\xe3\x05\x0d\x44\xfb\x1c\x3e\xf8\x1f" - "\xf0\xba\x89\x57\x44\x6c\x51\xc7\x6a\xc4\x31\x7a\x6f\x2d\x7c\x9a" - "\xcb\xf9\xf6\x9e\x38\x37\xa7\x38\xe7\xf2\x02\xc8\x4b\x5e\xf8\x3a" - "\x3f\xc3\x28\xdf\xc5\x94\xef\x67\x07\xf2\xfa\x60\xa7\x16\x8f\x38" - "\x5b\xdd\x6a\xdd\xde\xe8\x56\xe3\x55\x26\x96\x49\x75\xee\xf5\xb0" - "\xba\xaa\xf1\xd3\x84\xf7\xf6\x5e\x48\x1f\x2b\xfb\x75\x30\x31\x3c" - "\x26\x7f\x51\xc7\xe4\x60\xe2\xdf\xb2\x95\x50\x79\xef\x4b\x4e\xb0" - "\xb6\x4b\xa0\x1f\xa2\xfb\xe9\x27\x58\xab\xa0\xb5\xd2\x0e\xb9\xf5" - "\x0f\xea\x3d\xd5\xd1\xfa\xa6\x7a\x7f\x39\xdd\x3f\xa3\xde\x4f\xa5" - "\xfb\xc7\xd4\x7b\x82\x77\xeb\x7a\xf5\x3e\x9e\xee\x97\xa8\xf7\x34" - "\x8f\x5b\xbf\xab\xde\x4f\xa1\xfb\xeb\xd5\xfb\xcb\xe8\xfe\x32\x75" - "\x8f\xd9\xd8\xc3\x5a\x27\x8c\x9f\xff\x3f\xd8\x21\xd7\xde\x56\x0b" - "\xcd\x65\xd5\x8f\xce\x70\x5a\xa2\x87\x35\xe5\x69\xfb\x48\x94\xde" - "\x82\x7a\x28\x7d\x0e\xe1\x5f\x4a\x44\xba\xea\x9b\xbd\x75\x11\xc9" - "\x13\x4d\x11\xe9\x7b\xd4\xf4\x15\x94\xbf\x25\x22\xbd\x41\x4d\xa7" - "\xf9\xff\xa2\x21\x22\xbd\x5a\x4d\xaf\xd3\x6c\x37\xd4\xf4\x12\x35" - "\x9d\xc6\xff\x99\x3d\x11\xe9\x79\x6a\x7a\x2b\x8d\xb1\x2f\x22\x5d" - "\xc8\xcc\xd2\xd7\x9e\x99\xef\xcf\x9b\x45\xb4\xad\x95\xd6\xde\xe7" - "\x77\x45\xe4\x59\x2a\xbf\x6d\x23\x18\x3c\xd7\x1a\x91\x9e\xae\xa6" - "\xdb\x3c\xec\x5c\x59\x44\xfa\xc2\xb1\x70\x48\x57\xc3\x32\xc7\xd2" - "\xe7\x82\x6f\x14\xb6\xa8\x82\x8f\x6c\xff\x21\xce\xc7\x98\x77\xf0" - "\xa3\xb6\x7c\xce\x8f\xb2\xf6\xf9\xaa\x5d\xa6\x45\xae\x57\xc0\xf9" - "\xf6\xeb\xc4\xd9\x13\xf8\x7a\xc3\x39\xa3\x0d\x38\x67\xd4\x26\xf6" - "\xcc\x67\xe6\x16\x4a\x3f\x70\x9a\x4f\x61\xe8\x04\xd4\x3d\x5f\xca" - "\xf3\x07\xe8\x4e\x51\x0e\xd6\x70\x77\xf6\xa0\xf4\x11\x48\xb2\x03" - "\xd2\x20\x1b\x8b\xf3\x28\x11\xb2\x99\x9c\x8f\xed\x3f\x54\x06\x71" - "\x96\x4f\xea\x0f\xb0\xd6\x23\x3f\xec\x95\x22\xf3\x7a\x58\xbb\xd0" - "\x2d\x46\x59\xcd\x47\xfc\xce\xf6\x39\xe1\x33\x15\x6d\xd5\x6a\x3a" - "\xf1\x31\xed\x8b\x22\xd2\x3f\xc3\x6b\x86\xe9\xd3\x8b\x5e\x6e\x7c" - "\xc9\x36\x34\xc0\x7d\xc1\x01\x1e\xa8\xf8\xb3\xb4\x3b\x26\x1a\x74" - "\x45\xa8\xe4\xa5\x64\x9c\xa9\x40\xac\xa1\x60\x0e\xf7\xc2\x26\x8e" - "\xd2\x2f\xba\xcb\xe7\x25\xda\xef\xe7\xe5\x3f\x82\x0d\xe5\x59\x86" - "\x3d\xb9\x82\x3e\xc4\x81\x30\x73\x9c\x5d\xdd\x78\x92\x99\xda\x89" - "\xf6\xc0\x3e\x19\xfb\x65\x77\x66\x79\x59\x5b\x56\x88\xd5\x53\xd9" - "\x3b\x7e\xa4\xd1\xfd\x76\x5f\xf8\x7c\xe4\x8b\xd8\xc3\xbc\xa2\x40" - "\xc4\x54\x73\x0b\xff\x69\x88\xd7\xce\xcb\x2d\x56\xfe\x16\xf8\x11" - "\x7f\x8a\xb9\x88\x11\x0e\xb8\x93\xe9\x5e\xfe\xf0\x8e\xd2\xc7\xea" - "\x93\x9c\xa7\xee\x15\x92\x8e\xbc\xd4\x20\x69\x81\x7b\x05\xff\x39" - "\xce\x5a\xb8\x1d\xf4\x6d\xc0\x1b\xed\x1f\xf5\x9c\xc0\xc6\x1d\x4c" - "\x3f\x54\x4a\x6b\xc6\xa9\x26\xbd\xa4\x3d\x1d\x8b\x15\xbd\xb1\x08" - "\x7a\x4b\x11\x57\xa9\xb4\x39\x7d\xcf\xca\x80\xbe\x6d\x43\x37\x7b" - "\xe4\x32\x66\x5d\x1c\xd0\x53\x1e\xf7\x9f\xe2\xb2\xe1\x7b\x21\x80" - "\x98\x2a\xfa\x97\xe8\xfd\xeb\x2b\x9b\xf4\x41\xb1\x8e\x74\x2c\x16" - "\xba\xae\x92\x66\xc8\x80\x66\x77\x57\x08\x7c\x8f\x89\xf8\x1e\x1b" - "\x5f\x63\x37\x86\xd6\x65\x4d\x0e\xae\xc9\xba\x68\xc7\x6a\x66\x0a" - "\xad\xb1\xc7\x3f\x31\xc0\x66\x6b\xf1\x9a\x48\x16\x4e\xe6\x7e\x6b" - "\x4c\x65\x0e\x4b\x82\xac\x1c\xa7\xb3\x88\xfd\x47\xdc\x2b\xfa\x97" - "\x2d\xf5\x39\x17\x8e\x0d\x17\x22\x19\x19\xf1\xb0\xd0\x96\xd1\xfa" - "\x5a\xb6\x9d\xe4\x6e\xf5\x2c\x5e\xfe\x31\x36\xc5\xf1\x00\xd3\xc7" - "\x9d\xe5\xae\x13\x2b\x98\x1e\x71\xb5\xf2\x97\x09\x7d\xd4\x84\xb6" - "\xac\x20\x73\xe7\x7e\xc4\xf2\x57\x63\x8c\x3a\x5e\xc0\xfa\x09\x9b" - "\x58\xca\x6f\x39\xc1\x3a\xde\x34\x07\x98\x1e\x7e\xb1\x5d\x0f\x42" - "\xee\xe8\xf8\xd0\x27\xfc\xb6\xbc\x6f\xc5\xd9\x39\xd7\xea\x5b\x91" - "\xf6\x69\xc1\x31\x61\x2f\x12\x2f\xcf\xeb\x75\xb4\xe2\xb9\x00\x67" - "\x03\x63\x0e\xa6\x3c\x37\x18\x98\x20\x75\x1e\x1d\x6d\x72\xcc\xfc" - "\x5e\x29\x27\x75\x8c\xa9\xe3\x53\x4a\x5e\x49\xe1\x88\xd1\x51\x07" - "\xbe\x82\x7b\xc4\xde\xae\x88\x6f\x3d\xd7\xc5\x07\xaa\x98\x3c\x0b" - "\xf4\xfe\x63\xca\x96\x57\x52\x60\xfb\x42\xf7\x22\x96\x8d\xd0\x9d" - "\x6e\x79\x25\x4d\xea\x1b\x5f\xc9\x94\xba\xd3\x57\x1c\x9b\xa6\xc2" - "\x46\xfc\xfd\xaa\xfe\xe8\x57\x0a\xe9\xba\xb4\x3f\xc6\x3d\xaa\x1e" - "\x40\xae\x35\x7b\x1d\xb6\x2b\x58\x3c\x74\xf6\x19\x21\xe9\xcf\x48" - "\xce\xe1\x43\xd5\x7c\x8b\x78\x37\xfd\xa8\x83\x45\x49\xde\xfd\xfd" - "\x23\x33\xeb\x98\x8d\xda\x1a\xcb\x8d\xaf\xd8\x84\xbd\x5b\xc9\x2b" - "\xc9\xee\x3e\xf8\x1f\x0f\x31\xc9\x1b\x1f\x6a\xe0\xd1\xaf\xd8\x64" - "\xfe\x43\xd7\xb7\xf7\x51\x1f\x8c\xbf\xf6\xba\x03\x27\xd5\xb5\xfa" - "\x10\xe1\xfd\xaf\xbd\xbc\xe4\x15\xf5\x3c\xf3\xa1\x22\x8d\xae\x4a" - "\x1c\x3d\xb4\x56\xc2\x6d\xaf\x43\xc2\xed\x50\x83\xba\x2e\x4d\xc7" - "\x3d\xf1\x09\xc9\xd2\x6e\xe1\xd0\x0a\x8d\x77\xf1\xa8\x79\xf0\x0d" - "\xdd\xa7\x49\x5a\x7b\x88\xe4\x9f\xf7\x13\xd5\xf7\xc9\x48\xa3\xfe" - "\x11\x5d\x7e\xbf\x05\xfd\x1a\x8b\xb6\x0a\x58\xe4\xb1\x28\xea\x9f" - "\x05\xf6\xc2\x90\xef\xdc\xbe\xb9\x2e\xb7\x18\x83\xce\x6b\xc4\xf9" - "\x43\xaa\x07\xb1\x02\x40\x37\xa9\x4c\x03\xca\x0b\xb7\xff\x83\x58" - "\xad\x2d\xa8\x0f\xef\x78\x09\xf5\x57\x2f\x60\x25\xf4\xab\x18\xd7" - "\x1e\x07\x74\x25\x67\x09\x66\xb0\x9d\xea\x9c\x0d\x98\x48\x98\x75" - "\xc6\xab\xf2\x90\x3a\x0e\x9d\xd1\x23\xe1\x21\x9f\x15\x23\xd1\x86" - "\xd5\xb0\xa1\xe9\x9c\xad\xc2\x4f\xf5\x9d\xfb\xc1\x31\x01\x2f\xf1" - "\xee\x83\x1d\x11\xdf\x4e\x1b\xce\x4b\xed\x86\xcd\x23\xf6\xa3\xa1" - "\xf3\x97\xf8\xfa\x41\x4b\xc4\x77\x2d\x19\x9f\xa6\x30\xc4\x5d\xdb" - "\xf4\xa4\x88\x45\x92\xec\x77\x7e\x70\x38\x0c\x6f\x59\xce\x28\x75" - "\x5c\xa1\xd5\xe1\x61\x1f\xd4\x69\xed\xa4\x7b\x87\x1c\x93\x4e\x5b" - "\x78\x4c\x3e\x48\xd1\xbe\x83\xdc\x4c\x63\xd4\x87\xb8\x3e\x63\xf8" - "\x3b\xd5\xb9\x13\x88\x06\x07\xe7\xba\x04\x3e\xb2\xce\x1a\xd8\x29" - "\x13\x0e\x59\x24\x0e\x75\xe6\xc9\xb5\xb0\x53\xe8\x2b\xb0\x6f\x23" - "\xfd\x5f\x77\x56\x51\xb9\x7b\xd4\x36\xef\x52\xdb\xb0\x8b\xda\x50" - "\x37\xe6\xb9\x96\xe1\x73\x6b\x9d\xad\x11\x67\xf5\x92\x24\x6c\x3f" - "\xb4\xf2\x01\x5e\x8d\xb3\x05\x3c\x87\xd7\x54\xd0\xf8\x14\x9c\x65" - "\x97\xc2\x17\x4a\xbe\x83\x7f\xdc\xee\x20\xb9\xc7\xd8\x9c\x4b\xb4" - "\x21\x2f\xff\x2c\x9b\x04\x5b\x13\xd0\x16\xe8\x12\x78\x34\xa5\x6f" - "\x69\xce\x0b\x9f\x27\xfa\x5d\x12\xce\xfd\x91\x3c\x8e\x98\x97\x55" - "\x18\x6b\xd8\x1f\xf7\xb0\xdf\xd1\x1c\x6e\xae\xa2\x77\xd9\xe5\x42" - "\x26\x6b\xee\x0c\x19\x5b\x0d\x05\x27\xd9\x44\x11\x97\x22\x37\xc0" - "\x6c\x0f\xe2\xdc\xc9\x87\xeb\xa9\xcc\x4e\x4a\x8f\x13\xe9\x81\x00" - "\xce\x8e\x77\xd2\xbb\x38\x7a\xf7\x32\x5d\x15\x2a\x23\xb7\x82\xda" - "\x9d\x7f\x92\x5d\x41\x6d\xe9\xa5\x7a\x3a\xa9\x9d\x3d\x05\x0f\xb1" - "\x29\xed\x8e\x5e\xf0\xd4\x54\x9e\x87\xa9\xfe\x15\x3a\x8f\xb2\xdf" - "\x5d\x47\xfd\xca\x85\x6c\x89\xb3\x7a\xe5\x74\xcd\x0f\xb1\xb8\xfc" - "\x8d\xb4\xa6\x6d\xa4\xfa\x29\x3f\xca\x81\x4f\x05\xd9\x16\xea\x1b" - "\xf4\x12\x54\xee\xc6\x3e\xde\x43\x65\xf7\xb6\xf5\x51\x79\xb9\x5d" - "\xa2\x4c\x0f\xfa\x48\xe5\xaa\x36\x4a\x36\xb9\xbf\xfc\xbb\x44\x6d" - "\x9f\xd4\xc3\x3e\x9c\x8f\x7e\x8e\xee\xb7\xf4\x77\x0b\x47\xfa\xfa" - "\xf8\x7d\x02\xfc\x26\x52\xfa\x52\xcd\x2f\x07\xdd\xd3\x7c\xef\x6c" - "\x14\x63\x14\xe1\x23\xa5\x22\xc2\x47\x4a\x81\x97\x1f\x41\x5b\x1c" - "\x22\x06\xd7\xef\x48\x1e\x6a\x35\x48\xdf\x9f\xbf\x17\xf3\x94\xfa" - "\x8c\x78\xed\x66\xa9\x3b\xfc\x9d\x4a\xb3\xf7\x56\xa5\x86\x82\x66" - "\x0f\xd5\x49\xf3\xb7\x2a\xfc\xfc\xbb\x03\x38\x9b\x48\xf9\x42\xd2" - "\x87\xda\xef\xf6\x8d\xcc\x2f\xde\x17\x9e\xf7\x9c\x72\xde\xb3\xcd" - "\x47\xe3\x39\xd6\x7e\x70\xf9\x54\xa1\x47\x48\x8e\x2b\x62\x8e\x82" - "\xe3\x2c\x8a\xe0\x7c\x0c\x6d\x6b\xef\x15\x67\x64\xcc\xdc\x99\xcc" - "\xdc\xbd\x41\xc9\xaf\xd0\x3a\x71\x34\x91\xf2\x1c\x67\x53\x60\x5f" - "\x0d\xdf\xa8\x94\xff\x84\xf4\x87\xda\xf5\xd4\xe2\xb5\x31\x4c\xf9" - "\xb7\xf4\x8b\xb8\xfe\x87\x58\x13\x8c\xcf\x0e\x7a\xe0\x53\x54\x97" - "\xbf\x8d\x25\x60\x0c\x69\x2c\xbb\x11\x13\x94\xbe\xe9\xfb\xc5\x60" - "\xef\x04\x77\xf0\x23\xe6\x20\xdc\x3a\xc1\xba\x6a\x0c\x79\x24\xef" - "\xf7\x30\x0b\xc9\xdc\xc1\xfd\xc1\xd9\x4c\x3b\xd7\x5b\x37\x59\x9e" - "\x8f\xac\xa3\x39\xbb\xc6\xca\x03\x7e\xe7\xef\x89\xff\x79\xa5\x50" - "\x3b\xb7\x57\x26\xfd\x9d\x1a\xa8\xfe\x25\x7a\xf5\x0c\xb3\x84\x6d" - "\xd7\xf5\xf2\x7c\xd4\xe4\xaf\xf8\x9d\x5d\xf6\x30\x4f\xd7\xb5\x57" - "\xd5\xc3\xda\xe5\x1c\xeb\xda\xbb\x9f\xb8\xe8\xcd\x72\x5f\x3d\x9e" - "\xf2\x2e\x1a\xde\x57\x17\x32\x6a\xd7\x5e\x1a\x43\xbb\xe4\xf7\x5a" - "\xed\x19\x21\xa3\xba\xae\x20\xfd\x45\x2f\xbe\xa5\xef\xcc\x32\x6e" - "\x43\x57\x55\x18\xd7\xba\xd2\x41\x47\xa8\x4f\x24\x97\xff\xbe\x15" - "\xfd\x02\x4c\x28\x9f\x81\x9e\x3b\xf6\xef\x1a\xc3\xaf\xaf\xf1\xa5" - "\x86\x20\x7c\x6f\x95\xf8\x03\x84\x4f\x27\x69\x0c\xbe\x04\x3f\x26" - "\x6e\xaa\xa7\xad\x7e\x90\xb5\x59\xfb\x59\xfb\x52\x9c\xe5\x22\x9e" - "\xf9\xc1\xbf\xb2\x6e\xdb\xe8\x34\x4c\x21\xde\x94\xf8\xb7\x64\x94" - "\x85\x79\x02\xfb\x28\x37\x49\x1a\xed\x5e\xc4\x22\x65\xa2\x8c\x36" - "\xa5\x97\xb5\xe5\x12\xef\x5e\x66\xb1\xb6\xd7\x7f\xc4\xda\xad\x1f" - "\x88\x7a\xc0\x67\xb8\x56\xf7\x5f\xa8\x6c\xc2\xb1\x97\xd2\xd4\xb2" - "\xfb\xa8\xec\xf8\x31\xcb\x2e\xf1\xa7\x8c\xb3\xec\xcf\xdf\xee\x12" - "\x7f\xf2\x78\xca\x2e\xa8\xe1\x21\xa2\x2d\xb1\x44\x3f\x6c\xf0\xab" - "\x84\xb3\x61\xa1\x01\xf8\x20\x98\xce\xa5\xcd\xe9\x47\x5b\xc0\x63" - "\x8b\xbd\xc4\x2d\xcd\x09\xe2\xdc\xd8\x29\x26\x7c\xd6\xb8\x83\xc7" - "\x18\x74\x40\x7e\xe7\x47\xd9\x61\xfe\x7b\x78\x0f\x85\xf8\x9f\x8f" - "\x6a\xa4\x5d\x61\xb3\xaa\xcf\xff\xe8\x7b\x28\x67\x74\x3e\xfb\x9d" - "\x64\x69\x9f\xfa\xd1\xfb\x9a\xbc\xde\x1f\xfd\x8e\x56\x96\xed\xfc" - "\xbd\x75\x2d\x08\xf8\xb2\xdc\x6c\x2d\x9e\xb8\x3c\x54\x18\xc3\xee" - "\x5e\x76\xff\xb2\xe5\x39\xcb\x96\xda\x16\xad\x5d\xbd\xf2\xba\x55" - "\x0f\x3c\x60\xbb\x73\xd9\x9a\x35\x4b\xfe\x6d\x59\x0c\x5b\xb4\x7a" - "\xc9\xca\x35\xcb\xe1\x0c\xde\x66\x9b\x7f\x63\x46\xd6\xaa\xec\xeb" - "\x6e\x99\x9f\x7c\xde\x39\x43\x9c\x31\x3c\x0c\xbe\x8e\xe8\xed\x14" - "\xa2\xbd\x17\xc3\xff\x84\x79\x3d\x77\x3d\x42\x32\x05\xe1\xdf\x09" - "\xec\x21\xd1\xbc\x3d\x02\x7e\x93\xf8\x8f\x4e\xf8\x1e\xab\x7d\x92" - "\x77\xf4\xb0\x93\xdf\x22\x5e\xa5\x0b\x7e\xc6\x48\xd6\x3a\x4c\x72" - "\x9e\x57\xc6\xbc\x3d\x39\x8d\xf2\x1c\x78\x94\xd2\xbc\xd1\xad\xf6" - "\xca\x3f\x33\x03\xad\x3f\xc4\xeb\xfe\x91\xe6\xfe\x24\x5e\x36\x85" - "\x1f\xe0\x7f\xb5\x32\xd5\xdf\x9f\xde\xed\x09\x60\xaf\xd9\x98\x1a" - "\x2c\xe0\xa0\xa7\x72\x6e\xfd\xf1\x98\x84\xcb\x2b\x29\xd2\x6e\xb7" - "\x2f\x04\xbe\x78\x93\x88\x21\xf0\x47\x9a\x93\x1d\x59\x61\x3a\x7d" - "\x2c\x49\xe5\x47\xba\x08\xee\xeb\x8e\xd2\xb3\x3c\x63\x7f\xd8\x36" - "\xd2\xbe\x80\x84\x28\x76\x3c\x4b\xfe\xf0\xcd\xf1\x6c\xf9\xc3\x7d" - "\xe4\x8f\x16\x14\xf1\x3b\x3f\xfd\xef\xfd\x69\xf5\x7f\xe1\x32\xba" - "\xff\xc6\xef\x73\xd4\x2f\xfa\xfd\xdf\xd8\xff\xbf\xab\x8c\xbe\x0b" - "\xfd\x80\x6f\x84\x5b\x87\x1f\xfd\x33\x33\x12\x7e\x56\x93\x8c\x6d" - "\x28\xf8\x13\xb3\xe6\x05\x79\x77\xc1\x0f\x59\x42\xfe\x71\x86\x98" - "\xb0\xbd\xd9\xb9\xbc\x3b\x7f\x00\xb2\xd8\xb1\xdf\x12\xfe\x36\x55" - "\x1c\x65\xa6\xf2\xa3\xcc\xd2\x9e\x2d\x7d\xcf\x42\xf7\x89\x33\x0d" - "\x6e\x7a\x6e\xcd\x09\xb0\x83\xde\x4f\xb1\xc7\xe1\x6a\xcf\x24\xba" - "\x73\x98\x31\xe0\xaf\x29\x93\xc5\xd7\x4d\xe1\xfb\xb8\xb3\x8c\x64" - "\xf7\x32\xd4\xdb\xf9\xbc\x92\x32\xe1\xf9\x0d\x2d\x13\x10\x3f\xf7" - "\x28\xfb\xf3\x53\x2a\x6e\x5e\x27\xcf\xec\x1c\xbb\x4e\xd5\xe7\x77" - "\x12\xef\x4b\x6b\xd3\xb1\x67\xe4\x7a\x7e\x6c\xbd\xaa\xc3\xc0\xbd" - "\xf0\x0b\x4b\xfd\x68\x42\x0c\x6d\x94\xf9\x9c\xd2\x24\x62\x68\x3f" - "\xbf\x21\x65\x42\xde\x12\xa6\x6f\xf7\x9c\x10\xbb\x61\xd8\x77\xa1" - "\x79\x87\xfd\x9f\xc6\x1d\x53\x78\x15\xb5\xaf\xac\x7e\x0a\x2f\xa1" - "\x36\xed\xf6\x3b\xff\x12\xef\x61\x7f\x30\xaa\x3a\x56\x17\xcd\x8b" - "\x3d\xe5\x94\x27\x75\x2d\x9b\x5e\x4e\xf9\x2a\x28\x1f\x78\x37\xd9" - "\xbe\xbf\xc6\x12\x0c\xf6\x52\x9d\x1d\xb6\xfb\xf0\xec\x11\x3a\x30" - "\xd4\x4d\xfd\xb0\x1d\x65\x1e\xa1\x17\x41\x1d\x5a\xbd\x54\x3e\xd1" - "\xbf\x3f\xb8\x54\x7d\x77\x95\x2c\xe7\x2f\xaa\x3c\xd4\xdc\x50\x19" - "\x8e\x71\xde\x50\xbe\x81\xd6\x74\x92\xa9\xa9\x8e\x6a\xaa\xc3\x65" - "\x2e\x62\xdc\x8c\x73\x75\x87\x83\xc4\xef\x29\xaa\xfd\x97\xe7\x27" - "\xea\xb7\x82\x07\x11\x7c\x07\xc9\xfa\x52\x26\x25\xde\x23\x8b\xe8" - "\x04\xf1\x1b\xc2\x16\x99\x78\x0d\xa4\x53\x1d\xd5\xf0\xfb\x47\xb2" - "\xc2\x5e\x5a\xb7\x1b\xc1\x27\xdc\x77\xf6\x76\x26\x62\x01\x12\xaf" - "\xb0\x26\x97\x07\x64\x6c\x00\x8f\x4d\xe3\x15\x80\x1f\xe0\x0f\xca" - "\xef\x63\x86\x21\x1a\x63\xc2\x91\x16\xe2\x3d\x2e\x3e\xc1\x3c\x8b" - "\xd5\xb1\x69\x11\x3c\x81\x1a\x13\x49\xd2\x70\xcf\x72\x5a\xdb\x4d" - "\x54\x47\x8b\x87\x9d\x14\xba\x33\x49\x83\x3c\xb9\xda\x3a\x2f\xe3" - "\xfa\x79\x16\x73\xa2\x75\x04\xb7\xbd\x49\x99\x3a\xe2\x43\xff\xe2" - "\xa2\xb1\xd8\x8b\xbc\x38\x37\x4e\xf9\x77\xd3\x9a\x9f\xa4\x8e\xc9" - "\xe1\xf2\x1c\xf0\x00\x9e\x64\xb4\x83\xbe\x69\x25\x58\x53\x5d\x47" - "\x3d\x2a\x1d\xeb\x94\xfc\xcb\xd1\x77\x35\xd8\xd3\x58\x6f\x0e\xc3" - "\xdf\xe3\x8b\x84\x3f\xc1\x62\xb3\x1c\x83\xa3\x6b\x23\xc6\x8e\xf8" - "\xf5\xa3\x0b\xa1\x7b\xa3\xfa\xf6\x49\xbd\xc1\x91\xeb\xe0\xe3\x87" - "\x70\x66\x1f\xc1\x62\x1f\xe5\x6b\x02\x6d\xde\xf4\x67\xa6\xc6\xb7" - "\x3f\xfa\x75\xc9\x9f\x1e\xe9\x94\x31\xa0\x8f\xa8\x31\xa0\x3d\xb3" - "\x64\xfc\xe7\x23\x4f\xc9\xf8\xcf\x47\x76\x44\xc6\xb4\x0f\xc7\xb3" - "\x3f\x52\xa6\xd9\xfb\x03\x07\x30\xf6\xd4\xc7\x59\x52\x36\x3b\x52" - "\x06\xfd\x8a\xf8\x6e\x28\x0b\x6d\x3c\x8c\xf9\xa9\xbd\x47\x8c\x7b" - "\x4a\x67\x11\xb0\x99\xa5\x8e\x49\x93\x8c\x7b\x71\xf4\x3a\xd9\xb6" - "\xa3\x46\x7a\x36\x52\x1b\x84\x7c\x87\x78\xf7\x95\xf8\x26\x3f\xfc" - "\x0d\xe6\x0f\xe1\xb2\x99\xbe\xb9\x9a\xae\x5c\xcb\xbb\x73\x10\x79" - "\x8e\xec\x79\x62\x10\xfa\x95\x23\x07\xfa\x87\xec\x7a\xaa\x37\x40" - "\xf5\xea\x81\x1b\xc0\x0b\xad\x8c\x4a\x09\xa3\x3d\x34\x7e\x02\xbf" - "\xf6\x07\x9b\x08\xee\x47\x49\xfe\x6f\x4b\x93\xbc\xdd\x91\x3d\x6a" - "\xfb\x5c\xd2\xbf\xed\x47\x87\x11\x6f\x50\xfa\x9b\x39\x5a\x3d\xbc" - "\x57\x38\xcc\x63\x1e\xd9\x03\xdc\xa3\xb2\x5a\x55\x9c\x30\x53\xbe" - "\x7d\xc3\x38\x24\xce\x09\x1f\x9d\x03\x3e\x53\x6d\x3f\x70\xef\xeb" - "\x12\x76\x9e\xc3\xc0\x01\xe2\xe1\xed\x72\x9c\x3d\xb3\xc0\xa7\x4a" - "\x3c\xfc\x2b\xd3\xca\x90\x67\x8d\x8f\x94\x29\x54\x86\x86\x2b\x91" - "\xb4\x81\xf2\x26\x11\x4f\x3a\x8c\x37\x1a\x2d\x90\x65\x76\xab\x71" - "\x2f\xfc\x01\x1a\x1b\xf8\x64\x74\x81\x6f\x97\x78\xd9\x3d\x7b\xbf" - "\x2f\x28\x62\x60\x53\xbb\x88\x26\xfc\x75\x6b\x7f\x4c\x87\x31\x8c" - "\xdb\x7f\xdd\xac\xe1\x76\xc4\xb8\x0a\xdc\xde\x2c\xe8\xd1\x5f\x49" - "\xfe\xfd\xda\x42\x0d\xf7\x31\xcf\x11\x8b\xbe\x32\x47\xc6\xa9\x87" - "\x0e\x44\xcc\xfb\x40\x9f\x90\x2f\x30\x9e\xed\xb9\xdd\xc2\xaf\x25" - "\xe2\xd4\xb7\xfb\x8e\x41\x6e\x3c\x81\xf9\xaf\xcd\x71\x8c\x0d\xd5" - "\x85\x78\x09\x1d\x9b\x89\x06\x62\x0e\xfa\xa8\x4d\x88\xff\x08\xbf" - "\x1d\x07\x16\xa7\x88\x18\xf6\xfb\x33\x31\x6e\xdd\x89\x9a\x7d\x71" - "\xa5\xa4\x01\x26\x15\x5f\x44\x1b\xcf\x83\xab\x59\xc2\xb5\x3b\x7d" - "\xe4\xfc\x3e\x12\xc0\xfc\x8e\x84\x2b\x60\x0a\xd8\x52\x5e\xea\xff" - "\x1f\x96\x6a\x70\x8d\x80\xe9\x59\x15\x1f\x55\xda\xda\x3d\x2a\x6d" - "\x85\x7f\x50\x6a\x57\xd3\x26\xf4\x85\xd6\x14\xd4\x2f\xfc\x6c\xab" - "\x72\xcf\x01\x2f\x70\xaa\xbb\xd7\xc3\x32\x98\x46\xc7\x08\x57\x84" - "\xcf\x25\x8c\x95\x46\x3b\xa0\x43\x90\x6d\x3f\x16\xaf\x8d\x07\xda" - "\x1d\x49\x13\x68\x8d\x11\x7b\x31\xe1\x3e\x1f\xbb\x8d\xbe\x9b\x0c" - "\xda\x16\xe6\xaf\x8e\x2d\x1a\xd9\xf7\x63\x73\xd0\x77\xe0\x84\x23" - "\x07\x7a\x04\xb9\x96\x79\xd8\x9f\x5b\x46\xd2\xab\x3f\xff\x56\xee" - "\x11\x4a\x7e\x0c\xf4\xde\x71\x9f\xcc\x8f\xf5\x8d\xf2\xbb\xc4\x5a" - "\x27\xd7\x43\xe8\x37\x90\xb6\x57\x85\xc1\x61\xca\x7f\x00\x67\x16" - "\xe1\x93\xe2\xa2\xc3\x52\x0e\x24\x1a\xbd\x8f\xd6\x0e\x17\xe5\xcb" - "\x6e\x27\x19\x20\x38\x91\xb1\x3a\x95\xdf\x04\x9d\xe0\xeb\xd2\x2f" - "\x5a\xd7\xcb\xa2\x1d\xb7\xf0\xbf\xf6\xb0\x9e\x87\x69\x1e\x05\xb0" - "\x97\x4f\x65\xdb\x7a\xd8\xf1\xef\x51\xbd\xf1\xea\xd5\x4a\xd7\x6f" - "\xd2\xf5\x32\xba\x5e\x49\xd7\xcb\xe9\x8a\xb3\xa7\x8a\x9a\x3f\xb9" - "\x87\xf5\x7e\x4a\xe9\x37\xaa\x57\x6a\x63\x4f\x16\x5d\xd3\x1e\x05" - "\x5f\x79\x9f\x48\x7f\x1b\xcf\x74\x7d\x59\xed\x77\xab\x9c\xdb\x3d" - "\x5b\xa9\x9c\x5c\xe4\xc3\xba\x46\x69\x0e\xca\xb3\x1e\x65\xe3\x2c" - "\x31\xdd\x5f\x17\xc1\x9f\x52\x39\x1f\xff\x80\xae\xb3\xe8\x3a\x8d" - "\xae\xd9\xf4\xfd\x11\x94\x0b\x5f\xb7\x61\x7a\xe1\x99\xb5\x34\x57" - "\x8e\x27\x8d\x75\x23\xe6\xbb\x46\x0f\x80\x4f\x23\xf2\x2d\x96\xf9" - "\xa4\xec\xfa\xb1\x45\x1b\xbb\xa0\xc4\xdb\x03\x41\x1a\x3b\x2a\xff" - "\x5b\xf8\x9e\xae\xf3\xd4\x6b\x8a\x7a\xbd\x4d\xbd\x7e\x47\xbd\xce" - "\x57\xaf\x0b\x3c\xac\xc7\xa3\xf2\x26\x04\xb3\x1e\x0f\x60\x42\x73" - "\x77\x91\xac\xb7\x37\x1e\xb2\x35\xd1\xff\xaf\xf7\x23\x96\x82\xf3" - "\xe3\x12\x4d\x57\x07\x1d\xef\x90\xf3\x23\x7f\xad\xb0\x9b\xf8\xb8" - "\x21\x4c\x0b\x0f\x06\x4c\xba\x14\x46\xbc\xd3\xc4\x3a\x3d\xf1\x0d" - "\xa2\x9c\x8f\x03\x7a\x75\xff\x11\x3e\x97\x11\x23\x22\x23\x68\x94" - "\x67\xe1\x62\xcd\x25\x98\xaf\x42\x8f\x09\xdf\x4a\xd1\x07\x83\x84" - "\x87\x46\x92\x29\xb4\xf9\x3b\x0b\xf2\x92\xea\x23\x6b\x8a\xdf\xd9" - "\x6b\x0a\xcb\xf8\x1f\xef\x93\xfb\x39\x97\x10\x7d\xea\x4d\x8c\x48" - "\xcf\x45\x9b\x09\xd6\x5d\xd4\x9f\x59\x47\x59\xef\x42\xba\xde\xd0" - "\x2d\xfb\x9c\xac\xf5\x59\x1d\x2b\x87\x06\xf3\x6e\xd6\xd3\x4b\xf4" - "\x70\x35\xf0\xfb\xe8\x30\x5d\xee\x11\xfb\xba\x2a\xfe\xd0\x38\xf7" - "\x6c\xc3\x78\x47\xd0\x93\xa4\x30\x9d\xee\xdd\x3d\x72\x5c\x3c\xbb" - "\x83\x92\x5f\xe8\xa2\x79\x09\x1c\x70\x9c\x37\x2f\xe7\x60\x5e\xaa" - "\xdf\x76\x8f\xa4\xf1\xc7\xe6\x80\xc6\xab\x6d\x24\xbc\xed\x49\xc3" - "\xd8\x78\x58\xef\x01\x75\x4d\xea\xa2\x35\xf2\xeb\x94\xae\xea\x45" - "\x65\xba\x5a\x17\xe1\x5f\x0f\xfc\x01\x5e\xae\xa5\xab\xf8\x8d\x72" - "\x80\x27\x97\x69\xe9\x6a\xf9\x84\xa7\x3d\x36\xcc\x1f\x2d\x5d\xe2" - "\xe4\x5f\x73\x41\x6f\xf0\x2d\xfa\x03\x9e\xd9\x75\xdf\x01\x6a\xf7" - "\xf1\x5d\xc4\x5f\x08\x1e\x70\xd3\x06\x66\x5a\x57\xc3\x62\xe5\xdc" - "\x3c\xfe\xb6\xf6\xad\xd4\x75\x1e\x6f\xd2\x68\x54\xa5\xa0\x67\xdd" - "\x49\x23\x69\x65\xdf\x04\xee\x34\x07\x83\xc6\x83\xbe\xb6\xe0\x2c" - "\x41\x73\x69\xde\xd7\xd1\x77\x5e\x0f\x2b\xab\x51\xd7\x92\x56\xa9" - "\x47\x3e\x71\x75\x5b\x83\xa4\x5d\xb2\xec\x13\xc3\xf4\x2f\x82\x0f" - "\x11\xb4\x1e\x75\xa1\x2c\x5a\x57\x2c\xbe\x82\xf4\x8b\x24\xfd\x3e" - "\x31\xdf\xc3\x62\x0e\x6b\xb4\x15\xeb\x93\x59\xc7\x1c\x15\xf7\xc9" - "\xf5\x49\x81\xfe\xcb\xe1\x13\x7e\x84\xda\x1d\x7d\x0c\xeb\x26\xfc" - "\xbc\x66\xac\x8f\x81\xaf\x97\xf4\x1e\xf6\x09\xe2\xed\xed\x52\xe1" - "\x48\xf3\xe7\x93\x36\x75\x1c\x0e\x53\xfd\xbb\x40\xcb\x37\xe5\x48" - "\x3f\xe5\xd0\xfd\x08\x3f\xf8\xe0\x51\xad\x3c\x70\xa0\x0e\x73\xe4" - "\xc4\x81\x08\x7d\x56\x83\x9c\x17\xc7\x5f\x15\x31\x15\x4a\x0e\xaa" - "\x71\xc6\x3f\x59\x22\xd3\x3f\x51\xf7\x5a\x0f\xaa\x7e\xbb\x3e\x49" - "\x8e\xb2\xc6\xaf\x96\x71\x67\xfe\x38\x59\xf2\x1f\x9f\xc4\x9f\xe7" - "\x17\x4a\x4f\x69\xf6\xb0\xcf\xcc\xe3\xea\x3e\xf7\x27\x11\xfb\x9f" - "\x9f\x20\x06\xb7\x81\xca\xda\x48\xe9\xc3\xfb\x9f\x72\xad\xf1\xd8" - "\x25\x6f\x70\x30\x70\x51\x51\x0a\x23\xda\x3c\xb1\xd6\xa9\xcd\xdf" - "\x4f\xf6\xca\xf6\xc8\xf9\x8b\x3e\x03\x1f\x30\x87\x83\xf0\xc5\x43" - "\x73\x18\x73\x99\xee\x83\x41\x6d\xee\x4a\xfe\x2e\x49\xcc\x5d\x31" - "\x6f\x3f\x39\x10\xd1\x8e\x3c\x15\x57\x0f\xf7\xdf\x6f\x35\xd1\x3b" - "\x8f\x87\x7d\x94\x20\xdf\x9d\xa8\x52\xdb\xe1\xa3\xf7\x75\xae\xfc" - "\xb7\x30\xf6\x45\x72\x4e\x9c\x28\x04\xde\xb9\x09\x57\x68\xbd\xa8" - "\x91\x31\xe6\xfb\x12\x34\x5c\xa1\x39\xb5\x94\x70\xea\xd9\xea\x29" - "\xbc\x86\xc6\x04\xf6\x98\x2b\xe8\x19\xf3\x75\xa9\xbc\xea\x2c\xb8" - "\xaa\x38\x5a\x43\xdf\xd2\xfa\x1f\xa3\x8d\xc9\x61\x5f\xb4\xdf\x21" - "\x70\x22\x1f\xb6\x31\xc9\x62\x3f\x12\x38\x01\x7c\x10\xfb\x92\x84" - "\x1b\xe6\xa2\xdb\x19\xf0\x42\x9c\xe7\xa7\x67\xb4\x09\x78\x41\x65" - "\xed\xd2\x7c\x54\x7a\x58\xdf\x02\x09\xfb\xbe\xa6\x48\x1b\x41\x2a" - "\xdb\x76\xc0\x46\xf2\x4e\xc9\x5e\x47\xf6\x95\xec\x12\xc4\x08\x87" - "\x2f\x3a\xc4\x5c\xc7\x37\xd8\xd3\x91\x74\xee\x92\x7f\xa1\x6f\x7d" - "\x61\x78\x79\x84\x5f\x81\xfd\x8b\x85\x0e\xf2\x4b\x7e\xe7\x49\xcb" - "\x48\x5a\xf1\xc7\x6e\xc1\x0f\xd2\xba\x7a\x55\x3c\xb3\x11\xfe\xd1" - "\x1a\x71\x72\x96\xc6\xc7\xce\x8c\xc7\xde\xf0\x1f\x21\x5f\x40\x86" - "\xed\xa0\xfb\x3c\xac\xaf\x63\xe8\x8a\x67\x41\xc7\x83\xb9\x0e\x9d" - "\x11\xf4\x57\xf0\x29\xdf\xc3\xbc\x6f\xb7\xc1\xd7\xc6\xaa\xcf\xfa" - "\x25\xcd\xcf\xe5\x67\xe1\xfb\xc5\xb6\x9a\x7d\xe9\x28\xf3\x22\x16" - "\x70\x57\xc1\xa7\xd0\xcd\x9c\x3c\xcf\xff\xe1\x29\x93\xfa\xb3\xd1" - "\x6f\x73\xf8\x77\x3a\x5e\xbd\xaf\xba\xf0\xef\x74\x92\xcc\x7b\x9a" - "\x68\xde\xe9\xf9\x2a\xac\x7e\xea\x77\x9e\xb2\x69\xb0\x02\x2d\x00" - "\x6d\x84\x4d\x00\x74\x4d\xba\x20\x83\x6f\x0f\x1a\x2f\x6a\xf7\xa6" - "\x6b\xef\x76\x6d\x80\x2c\x7a\x4a\xd8\x34\xc1\x8f\xe6\xf8\xec\x4f" - "\x4e\x89\x3d\x40\xe9\x9b\xef\x54\x3c\xd5\xfd\x1f\x95\xa7\x98\xc1" - "\xb1\x9a\x4d\x83\xde\xdb\x1c\xe2\x2e\xc8\xae\x6a\x5c\xf3\x8e\x13" - "\xec\xf4\x25\xd9\x1b\x99\x9e\xde\x4f\xa7\x7b\x2d\xbe\xe6\x61\xfa" - "\xc6\x12\x15\x60\xf1\xe0\x7d\xe6\x6d\x64\xd3\xa9\xfd\x1e\x6d\xac" - "\xc0\x1f\x40\xff\xa6\xea\x10\xd0\xd6\x2b\xf1\x1d\x7c\x2d\x7b\x04" - "\xdc\x54\x9a\x73\x0a\xfa\xe6\x53\xad\x51\x3e\x66\x91\xeb\xc7\x69" - "\x5a\xff\xfe\xa8\xf2\x83\xa7\x7a\x69\x0e\x74\x46\xb4\xf3\x0f\xe1" - "\xfb\x29\x97\xe1\x7b\xb3\x0f\xbc\xd7\x58\xf0\x39\xfd\xb0\x06\x1f" - "\xd8\xa6\x92\x3c\xef\x10\xe3\x1d\xe4\x7d\xd4\xb6\x56\xc7\x06\x66" - "\x3c\xc1\xbc\x0f\x23\x66\x01\xcd\x9b\x16\xa9\x97\xf7\x2e\xd3\xe4" - "\x6b\xd9\x6e\xef\xf5\xe6\xa2\x28\x06\x7d\x7a\x46\xc8\x26\xf6\xfc" - "\xf8\x69\xab\xd0\xa1\xbb\x83\x73\x98\x2b\xff\x26\xe4\xb9\x52\x5d" - "\x83\x0e\xf7\x17\x58\xd9\x7e\xeb\x1c\x9a\xcf\xa7\xfb\x68\xce\x1c" - "\x1e\xbf\xdd\xd4\xe9\x3e\x49\x37\xe4\x39\x42\x3c\xe3\xcc\x1f\xc1" - "\xb3\x55\xee\x73\x9f\xfe\x2d\xd6\x04\xc8\xf8\xb4\x1e\x1c\xc0\xba" - "\xeb\x77\x7a\x87\xf9\x7f\xa2\xf7\x44\x9f\x4e\xab\xfb\x2e\xd8\x5b" - "\x3c\xdd\x04\x5f\x0b\xaa\xed\x2b\xf2\x9b\xa4\xee\xdf\x5b\x36\xcc" - "\x37\x53\x3e\x7c\x27\x6d\x9b\x4e\x57\x65\x84\xa0\x13\x38\x5d\x85" - "\xbe\x4a\xdc\x9c\x42\x63\xeb\xdd\x17\x9e\xc7\xa7\x04\x2f\xb1\xbf" - "\x2f\x72\x9e\x7a\x0f\x87\xe5\xcd\x93\x85\xd7\x55\x33\xdb\x68\xf3" - "\xd2\x11\xc7\x2c\x9f\x18\xd9\xf7\x2b\x2b\x79\x43\x95\x5e\xb9\x75" - "\x53\x05\x33\xe9\xca\x08\x8c\x98\x77\x39\x99\x97\xf4\xb0\x4f\x7f" - "\x68\x36\x5d\x9a\x36\x2f\x7b\x12\xcf\xb7\x32\x7d\xf9\x99\x49\xc6" - "\x2b\x03\x97\x36\xf0\xa8\x6b\xef\xbe\x33\x1b\x7b\x7b\x55\xec\xe3" - "\x15\x2c\x6a\x5e\x88\xea\x36\x31\x87\x87\xf5\x67\xe1\x6c\xe6\x7e" - "\x13\x78\x8a\x7e\xd8\xce\xdc\x9a\x57\xc7\x8c\x79\xdd\xbc\xb7\xec" - "\x81\x09\x46\x5a\x47\x2d\x44\xff\x4b\x2e\x32\x5d\xda\x30\x44\x65" - "\xbc\x99\x29\xbe\x6b\x1c\x7f\xdb\x1c\x53\xa8\x6d\xe7\xc6\xd7\x36" - "\xdf\xee\x70\xdb\x7c\xbb\xff\xc1\x6d\xb3\x84\xdb\x96\x45\x6d\x3b" - "\xb3\x75\x7c\x6d\x3b\xdb\x1b\x6e\xdb\xd9\xde\xcf\xd9\xb6\x3d\xe3" - "\x6f\x5b\xee\xa5\x3d\xac\xff\xfa\xf1\xb5\xcd\x6f\x0f\xb7\xcd\x6f" - "\xff\x7b\xda\x96\x5f\xc7\x8f\xb5\x27\xc8\x78\xa4\xa0\xfb\x3d\xcc" - "\xf7\xf5\x8d\x09\x68\x17\x9b\x4c\xed\x3a\x5e\x50\xc7\xff\x2a\x79" - "\x96\xfe\x67\xe5\x5a\xd7\x4f\xeb\xdf\xc9\x74\x89\xc7\x3e\x21\xf3" - "\x2a\x51\x53\x77\x73\x27\x0f\xce\xf0\xc1\xde\x29\x08\x7f\x04\xf0" - "\xdd\x9b\xfc\xfc\x40\x40\xcf\x63\x5a\x53\x76\x9e\x31\xb0\xe7\x07" - "\xbc\xc4\xb7\xf4\x7b\x34\xff\x82\xda\xb7\xe6\x9a\x0b\xd1\x27\xdf" - "\x25\xf3\xb2\x98\x19\xf4\x09\x57\xc4\x9e\xa9\xcc\x9f\x64\x9c\xf7" - "\x29\xf8\x01\x5f\x92\x76\x3e\x4b\x2b\x2b\xb5\x77\x12\x37\xe7\xb1" - "\x28\x9c\x11\x13\x7e\xcb\xac\x5e\x96\x98\xc7\x26\xa4\xe6\x52\xf9" - "\x01\x96\x69\xce\xa5\xb2\x09\x1e\x92\x27\xf7\x3d\x1c\xb5\x82\x99" - "\xaa\xa9\x6c\x5c\xe7\x59\x0b\xf8\xa6\x6d\xcc\x80\xb3\x64\x38\x13" - "\x26\xcf\x83\x4d\x34\x52\x3d\xd5\x5a\x3d\x7f\x03\x7e\x71\x12\x7e" - "\x67\xd7\x86\xe1\x77\xf6\x9a\x30\xfc\x7c\x27\x25\xfc\x7c\xdd\x61" - "\xf8\x9d\xed\x1c\x1f\xfc\xce\xda\xc2\xf0\x93\xdf\x5e\x18\x7e\x67" - "\xef\x19\x1b\x7e\x67\x57\x84\xe1\x27\xcb\x1a\x03\x7e\x13\x47\x87" - "\xdf\xd9\x17\x3e\x1f\xfc\xce\x76\x7e\x4e\xf8\xc5\x4a\xf8\x0d\xbc" - "\x1c\x86\xdf\xc0\xf2\x30\xfc\x06\xae\x93\xf0\x1b\x48\x0c\xc3\xcf" - "\x1f\x3f\x3e\xf8\x0d\x64\x86\xe1\x27\xbf\xbd\x30\xfc\x06\xb6\x8e" - "\x0d\xbf\x81\x3d\x61\xf8\xc9\xb2\xc6\x07\xbf\x81\x4f\x09\x6e\x16" - "\x15\x7e\x96\xb1\xe1\xe7\x8f\xff\x9c\xf0\x33\x4b\xf8\xf9\xcf\x86" - "\xe1\xe7\x7f\x26\x0c\x3f\xff\x43\x12\x7e\xfe\xa5\x61\xf8\x05\x16" - "\x8d\x0f\x7e\xfe\x86\x30\xfc\xe4\xb7\x17\x86\x9f\xff\xc3\xb1\xe1" - "\xe7\xef\x0b\xc3\x4f\x96\x35\x06\xfc\x26\x8d\x0e\xbf\xc0\xf5\x9f" - "\x0f\x7e\x81\x45\x17\x82\xdf\xf8\x78\x8f\x40\x16\x1b\xc3\x06\x6f" - "\x9c\xe5\x8c\xed\x77\x0d\xb1\x9c\xce\x31\xbd\xe2\x0c\x34\xd6\x2b" - "\x13\x8d\xd8\xaf\xa5\x7b\xe8\xae\xe6\x1e\x65\x81\x50\xbd\x32\xc1" - "\xc8\x9d\xaf\x95\x28\xce\xdf\x2e\xe0\x45\x13\x0d\x4a\xd1\x24\x03" - "\xce\xaf\x8e\x56\x96\xb4\xf5\x3b\xf7\xc3\xa8\xcb\xd8\x15\x38\xd7" - "\xb1\x89\xf8\x37\xdc\xfb\x9d\xe7\xb2\x88\x17\xf9\x8c\x9f\xfd\xa5" - "\xcb\xd7\x2c\xf9\xd1\x8a\x65\xb6\xd5\xcb\x96\xae\x5d\xb9\x74\xc9" - "\xca\x6c\xdb\x92\xfb\x7f\xbc\x66\xa4\xaf\x63\x11\x7b\x73\x33\xc6" - "\xef\xdc\x9e\x61\x5f\x03\x4e\x9e\x0b\xff\x52\x8e\x2f\xb3\xe8\x13" - "\xec\x5c\x9f\xf0\x11\x1d\xd3\xba\x87\x0f\xa5\x6f\x4f\xb9\x8a\xbf" - "\x21\xfc\x66\x0d\x65\x6d\x27\x39\xab\x10\xfe\x05\xd4\x3d\x86\xc2" - "\x1e\x36\x74\x96\x47\x77\xec\x86\x5d\x86\xb4\x39\x1f\x14\xbe\x18" - "\xe0\x77\x80\x1b\x9b\xbb\x94\x92\x8e\xdd\x7c\x4b\x47\x03\x60\xd0" - "\x0e\x9f\x45\x39\x51\xd3\x8f\xb2\xd0\x2e\x1e\xdd\xdc\x45\x65\x69" - "\xfb\x52\x90\xcb\x7d\x29\x1b\xf8\x5f\x50\x9e\xca\x7b\x23\xfe\xa1" - "\x4b\xf2\x83\x83\x45\xe6\x22\x5b\x14\xf2\xc2\x77\x18\x7c\x6a\x69" - "\xb1\x45\xd0\x6e\xe4\x25\xfe\x7c\x2e\x7d\x3f\x77\xa7\x88\x1d\xa2" - "\x96\x21\xdb\xf4\x25\x6a\x53\x93\xe8\x4b\x49\xf3\xe6\xfe\x47\xd2" - "\xb7\xa3\x1c\x09\xd7\xd0\x16\xaa\x7b\x33\xca\x80\x4f\x1f\x7c\xab" - "\x7e\x33\x8d\xbe\x91\xbe\x4b\x36\x5d\xbe\x5d\x96\x11\x7a\x58\x6b" - "\x17\xf1\xd4\x31\xf4\xfc\x83\x88\x3a\x2e\xa2\xe7\x6f\x45\xbc\x37" - "\xd1\xf3\xd5\xc4\x87\x5e\xac\xbe\x8f\xa5\x67\xc4\x86\x35\x89\x7e" - "\x55\x14\xaa\xf6\x9c\xc1\x3e\x4a\xb3\xa8\x79\x2e\x3e\xc1\x82\x88" - "\x45\x3c\x59\x2d\x63\x32\x3d\xbf\x0c\x19\x52\x7d\x1f\x4f\xcf\xdb" - "\xa0\xdf\x57\xdf\x5f\x42\xcf\x1b\xe9\xf9\xab\xea\x7b\xe2\xf3\x87" - "\xa4\xaf\x2d\x63\x33\x62\xe0\xe5\x12\xec\x4b\x44\x2c\xf1\xe8\xe6" - "\x0e\x4a\x2b\x24\xf9\xb5\x00\xe3\x88\x7e\xba\x36\xc0\xcf\xc1\x50" - "\x1b\xce\x7a\xc8\xb1\xea\xd8\x2d\xfd\x44\xe8\xd3\x29\x1d\x7a\x9c" - "\xa8\x38\x11\x8f\xa0\xa3\x04\xf7\xd4\xd6\x6f\x01\x86\x6a\x5d\x24" - "\x23\x0d\xf9\xd4\x71\x26\xd8\xc1\xff\x24\x2b\x44\xb9\xf2\x9c\xc3" - "\x90\x7a\xce\x21\x68\xfa\x62\x67\x92\x83\x26\xd1\x0f\xc2\x3d\xe8" - "\x40\xbc\xd1\xcd\x2b\xc4\x39\x7c\xc2\x3f\x0d\x0f\x80\x03\x5c\x7f" - "\x2e\x5b\xea\x57\x82\xd9\x61\x3f\xf4\x43\x9d\xaa\x8e\x85\x49\x19" - "\x20\x18\x61\xff\x33\x24\xe6\x7e\xc4\xbb\x3d\x11\xef\xd2\xb5\x77" - "\xd2\x46\x2d\xd8\x12\xf1\x6e\xc1\x79\xef\xba\x23\xde\xcd\x1e\x59" - "\x66\x88\x45\xbc\xb3\x8f\xfc\x2e\x94\x10\xf1\x2e\xfe\xbc\x77\xb3" - "\x23\xde\x19\xd4\x77\x51\x94\x9e\x16\xf6\xd9\x35\xe8\x53\xd3\x89" - "\x8e\x87\xb2\x22\xd2\xbb\xd5\x74\xd4\x5f\xe8\x61\xcf\x1e\x56\xd3" - "\x05\x0e\x13\x8e\x7c\x45\xad\xa3\x2e\x5c\xc7\xa0\x6a\x73\xd5\xbc" - "\x42\x8e\xd5\x60\x92\x59\x67\x9b\x04\x7c\x31\x17\x15\x22\x6e\x45" - "\x95\xf4\x4f\x23\xe7\x98\x88\xd3\x46\x57\xfa\x2e\x69\x2c\xba\x37" - "\xba\x0d\x9f\x62\xd1\xce\x3d\x85\x4a\x9a\x1d\x4a\x49\x00\xbe\x44" - "\xa7\xc3\x8f\x4d\x41\x1f\xfc\x00\xf8\x98\x9b\x0d\x32\x77\xb6\xbf" - "\x10\x71\xa2\xda\x65\x7c\xa8\x38\xec\xbf\xc1\xee\x1e\xbe\x78\xda" - "\x1d\x27\x45\x8c\xa8\x75\x7d\x2c\xc1\x71\x0b\xef\xee\x61\x4a\x76" - "\x68\x4b\xb3\x43\x3d\xcb\xbb\x4d\x9e\x47\x53\x64\x7f\x20\xb3\xf6" - "\x09\xfd\xaf\xb1\x87\x71\x83\xc8\xc3\xd3\xb7\xc9\x3e\x72\x01\xd7" - "\x9d\x4e\x2d\xe6\x8f\xb2\x47\x8b\x8d\xe6\x61\xdc\x78\x36\xfa\x03" - "\xb4\xd7\x35\xd2\xe6\x50\xf9\x03\xca\x44\xdb\x3d\x4c\xc9\x43\xd9" - "\x94\xa7\x7b\xd8\xe6\x90\xd2\xd7\x05\xd9\x54\x6a\x57\x8f\x56\xbe" - "\xdf\xc9\x0d\x1e\x16\x12\x72\x24\xca\x3c\xbb\xe5\x5c\x32\xa5\x59" - "\x3d\xfa\x9f\x2e\x94\x36\x8b\x9c\xf8\x9f\x57\x0f\x5f\xe8\xbc\x17" - "\xcd\x47\x17\x2f\xe9\x68\xa1\x39\xdc\x24\xcf\x7d\x76\xb8\xa4\xac" - "\xce\x1f\x86\x5d\x04\x62\xde\x41\x76\x96\x74\x84\xcb\xfd\x0f\x4a" - "\xa3\x31\x02\xbd\x15\xfb\x40\xe3\x9b\x73\x5c\xc0\xa4\xf2\x0c\x33" - "\x56\xac\xd6\x7c\xe6\xf2\xd6\x08\x5f\xe2\xaa\x2d\x32\x3f\xdb\x9e" - "\x2b\xf6\x84\x44\x1b\xcf\x6f\x03\xda\x4b\x65\x39\xc6\x5c\x1b\x8d" - "\x1d\x4d\x42\x3f\x59\xda\x9a\x26\xec\xbb\x74\xec\xe6\x28\xeb\x65" - "\x8f\xf8\x8b\xd9\x6c\x4d\xf6\x46\x9e\x8a\x41\xf8\x6f\xea\x70\x0d" - "\xf7\x73\x75\x10\x79\x33\x85\xfe\x5c\xc7\xb2\x89\x2e\x35\xa1\x0d" - "\x6a\x7a\x76\x7b\x30\x80\x33\x95\x63\xd9\x54\x1a\x85\x5f\x8e\xd2" - "\x8e\x26\xd8\x72\xcf\x0c\xa8\x6d\xd6\xe9\xb2\x61\x43\x8c\x36\x0b" - "\xd8\xea\x74\xcb\x35\x38\x96\x9f\xa1\xb2\xf3\x3f\x62\xdd\x3a\xf6" - "\x29\xec\x4e\x60\x13\x5f\xb9\x41\xb5\x85\xa2\x34\x91\x6f\x70\x38" - "\x8f\xb0\xeb\xc7\x59\x40\xd0\xc7\x7a\x11\xc7\x83\xfa\x40\x63\x21" - "\xce\x95\xeb\x74\xdf\x14\x7a\xcc\xd5\x4c\xf6\x1b\x76\x66\x3a\x9d" - "\xb0\x53\xf6\x17\xeb\x92\x3d\x3a\x9d\x38\x3f\xe4\x51\xd3\x2a\x51" - "\x77\xce\x20\x3b\xa5\xd3\x5d\x8c\xb8\x7b\x04\x8f\x16\xf8\x24\x6a" - "\xf7\xd1\x3c\xc9\x1d\x04\x2e\xb4\x20\x66\x13\xe5\xb7\x48\x7a\x4f" - "\x30\xd7\x31\x1f\xea\x07\x6c\x69\xec\xbc\x04\xd3\x2d\x54\x76\x99" - "\x06\x53\xc4\xca\xa5\x3c\xbb\xc7\x1a\x17\xc0\x28\x44\x6d\xc6\x19" - "\x7a\xd7\xd4\x8f\xa8\x7d\xfa\x7b\x94\x98\x8e\x26\xd8\x34\x52\x5b" - "\xcf\x49\x5a\x21\xc7\x4e\xcc\x25\x9d\xfe\x3a\xaa\x63\x2f\xf6\x00" - "\xe1\x63\x57\xc4\x43\xd6\xe9\x3a\x55\xf8\x09\x1f\xee\x55\x39\x12" - "\x0e\x6a\xfe\x12\xa9\x67\xb9\xec\x37\xfe\x62\x7d\x78\xff\x87\xd2" - "\x85\xce\x6c\x8a\x3c\xeb\x4d\xef\x52\x22\xda\xec\x13\x67\x92\xa8" - "\x2c\xea\x6b\x2f\xea\x2a\x87\xcf\x18\xe0\xc5\x89\x08\xfc\xd7\xe9" - "\xde\x45\x3b\x61\x33\x17\x8a\x6e\x4d\xe3\x5b\x5a\x17\x01\xce\x54" - "\x36\xa3\xb9\xd0\x34\x46\xcc\x45\x11\xaf\x85\xea\x6b\xd4\x78\x20" - "\xe2\x7d\xa6\x9f\xd0\xe9\x8f\xc8\xbe\x4a\x7f\x69\x38\xdf\x3b\x9c" - "\x56\x6e\x0e\xd0\x7c\xdf\xab\xf2\x2c\x7b\xc7\xf4\xb5\x35\x83\x25" - "\xe3\x1c\xbb\x1a\x5f\xd4\xc7\x4d\xe6\x1a\xf8\xef\x84\x2f\x32\xd7" - "\x86\x1b\xa8\xbd\x51\x8f\x3d\x31\x45\x9c\xb5\xf2\xb9\x66\x9c\x81" - "\xed\x4c\x5f\x4f\x9e\xf0\x4f\x61\x4c\xcd\x0d\x72\x71\x1e\x1b\xe7" - "\xb4\x62\xcd\xd0\x8d\xf7\x09\x3f\xd6\x28\xf3\x8b\xfa\xa2\xd4\x45" - "\x2d\x56\x79\x13\x9c\xdd\xbd\xf4\x84\x2e\x4a\xe8\x26\xe9\x7e\xca" - "\x09\x9d\xe1\x55\x19\xaf\x4b\xfa\x55\x56\x6d\x00\x27\xca\x33\x9c" - "\x5e\x26\x7c\x36\xea\x0c\xd7\xd9\xae\x65\xac\x4f\x67\xb8\x5e\xf8" - "\x36\x2d\x69\x3e\xa0\xc2\xe0\x40\xa5\x6c\x97\x39\x23\x57\x2f\xda" - "\x88\xf6\x8d\xb3\x6d\x01\x75\xed\x9a\xe8\x2f\x36\xcc\xd1\xce\x7e" - "\x8a\xfe\xab\x3e\x4f\x5d\x5f\x3e\x83\x36\x3c\xa3\xae\x57\x1a\xef" - "\xd9\xf2\xf7\xd7\x6d\xc8\x56\xcb\xac\x13\x7e\x5f\x09\x2e\x54\x6e" - "\x1d\xb5\xe3\x80\xb6\x86\xaa\x76\xeb\x49\x62\x6d\x2f\x36\x1c\x1e" - "\x5e\x3f\x55\x18\x8e\x88\x51\xb4\x6a\x55\xb6\x8d\x18\x70\xc7\x92" - "\xec\xfb\xb3\x6c\xcb\x56\xaf\x5e\xb5\xda\x06\x07\x07\x91\x73\x4c" - "\xd8\xa6\x14\x1b\xbc\x6a\xac\x99\xdd\xc3\xb1\x66\x8a\x27\xcc\x8e" - "\x8c\x89\xe4\xd1\x4d\x18\xd3\xa7\xd9\xf8\xfa\x38\x61\xcc\x58\xc9" - "\x55\x7a\xa5\x91\x7e\x4d\xf4\x73\xd1\xaf\x05\x72\x4b\x46\x80\xa5" - "\xd0\xfa\x28\xce\x69\x6a\x3e\xb1\x95\xe2\x09\x16\xec\x4f\x1f\xd5" - "\x4d\x78\xb9\x5e\x31\x30\x71\x9e\xdd\xa9\xc0\xc6\x03\x3e\x7a\x9b" - "\xe8\xe7\xa2\x5f\x0b\xfd\xa4\xcf\x97\xb7\xc4\xb9\xbf\xc6\xc8\x77" - "\xd8\x33\xe6\xce\x1a\xf8\xfa\xed\xe0\x45\x06\xb1\xc7\xa0\x3c\x2e" - "\xf3\x9d\xd7\x06\x3d\xc9\xb1\xb3\xd5\x7c\x62\x3d\x8d\x2b\x62\xb6" - "\x51\xf2\x45\x71\xe7\xb9\x6a\x35\x9f\xf0\x6b\xab\xf5\x07\xfe\xa3" - "\x29\xbf\x96\xcf\xc0\x8b\xf5\x3e\x35\x9f\xe0\x2b\x15\xa7\x7e\xb4" - "\x7a\x27\x70\xe7\x41\xad\x5e\x4b\x64\x79\x11\x79\x26\x2a\x4e\x6f" - "\x00\x79\x94\x22\x83\xe0\xdf\x78\xf1\x84\x74\xca\x3f\xaa\xdf\xbd" - "\xf1\x8d\xd3\x24\x76\xfe\x38\x39\xee\x5f\xbe\xec\xa6\xe5\x2b\x73" - "\x10\x95\x24\x7b\xd5\xda\x6c\x5c\x57\x2e\xf9\xb1\xb8\xac\xca\x78" - "\xe0\x7e\x79\x93\xbd\x22\x19\x37\x2b\x08\xdf\x70\x5d\xba\xd6\x81" - "\xcb\xfd\xab\xf0\x98\x9b\x95\xb4\xf6\x7e\x2d\x8c\x6a\x24\x1e\xda" - "\xfd\xc5\x93\x68\xfd\x98\x20\xf6\xe2\xe8\x7e\x2f\xc9\xb3\x22\xee" - "\x8d\xb9\xc8\xc3\xde\xb6\x07\x99\x26\xc3\xca\xf1\x9f\xc4\x84\x8f" - "\x3c\xdd\xa4\x37\xeb\x95\x49\x46\x73\x91\xe3\x7e\x73\x70\xf9\x32" - "\xa2\xb3\x8d\xf4\xad\xd7\xc3\x8a\xd5\xb3\xb9\xcd\x9d\xc2\x1f\x5c" - "\xf1\xa4\x14\xcd\xee\x4f\x29\x69\x2e\x81\x4f\x66\x61\x07\xf4\xb8" - "\xf0\x81\xb0\x97\x9e\x3b\xe8\x19\x71\x16\xe2\xe9\xb9\x8a\x9e\xbb" - "\xe8\xd9\x4a\xcf\x09\x4a\xc9\x2b\x36\x9c\x95\xa2\x67\x1b\x3d\x27" - "\xfa\x8b\x8d\x69\xda\xbc\x88\x84\x8d\x1a\xe4\xe7\xa6\x51\xe5\xdd" - "\x91\x3e\x45\x68\x6e\x19\xab\xb5\x58\x8a\x22\x6e\x62\xb1\x71\x78" - "\xff\x4f\xc6\x25\xb1\x2c\x16\xeb\x9a\x58\xdb\xa3\xaf\x8c\xb2\x5e" - "\x1e\x23\x78\xef\x62\x63\xab\xb6\x47\x2b\x78\xeb\x62\xe3\xe1\x88" - "\x98\x93\x78\xee\x1b\x8e\x39\x29\x79\xd1\xed\x82\x17\xd5\x45\xcf" - "\xe2\xc5\xc6\xc5\xc3\x71\x81\x8a\xa3\x47\xec\xff\x7a\xe8\x3d\x64" - "\x1a\x4a\x4f\x0a\xaf\x83\x46\x17\xea\x1c\x2d\xbe\x26\x62\x7a\x67" - "\xac\x27\xfe\x9b\xae\x2a\x2f\x6e\x13\xb2\x96\x13\x7e\xff\xf8\xee" - "\x51\xf5\x06\x57\x88\xbe\xbc\x0a\x7f\x8f\xde\x82\xa5\xba\xab\xea" - "\x99\x4e\x3c\x4b\x5f\x5f\xfc\x94\x2e\x5a\x9c\x1f\xd4\xfc\x00\x45" - "\x9e\xc9\x1d\xf5\x0c\xc0\x21\xc6\x64\xfc\x8a\x15\xab\xcc\xc1\x25" - "\xcb\x24\xef\x16\x73\x99\xa4\x9f\xad\x32\xa6\x96\x2e\xc6\xc0\xef" - "\x96\xfe\xf6\x3d\xba\x98\x12\xc4\xf1\x30\xeb\x56\xac\xe2\xf4\xad" - "\x39\x77\xc9\x32\x91\x46\xf9\x36\x21\x2e\xb3\x6c\xdf\x71\x77\x42" - "\x2f\xe3\x03\x21\x79\xd6\x58\x17\xdd\x7b\xdf\xb4\x42\xd4\x63\x14" - "\xbc\xc3\x21\x66\x42\x5c\x26\xb4\xad\x3e\xc2\x4f\x51\x25\xa5\xc1" - "\x36\xaa\xff\x6e\x66\x82\xbf\x46\xd9\x96\xe8\x5e\x11\xff\xa6\x38" - "\xa6\x50\xf3\xa5\x40\x70\xee\x3d\xbf\x3f\x77\x7f\x5f\xcc\x8a\xab" - "\xef\x4f\x4a\xbb\x8d\xee\x92\xd4\x90\x83\x91\xf8\x92\xd0\x1f\xd3" - "\x5e\xd3\xff\xf4\xe2\x57\x44\xdc\xac\xe2\x98\x0e\x2a\x47\xee\x0b" - "\x6f\xba\xf7\x38\xe8\x89\xf0\xc5\x10\x62\x56\x71\xfe\x49\xf1\x89" - "\xd8\x64\x3d\xba\xd8\x6d\xf0\x99\x28\x7c\x11\x15\xc7\x54\x63\xdc" - "\x69\xac\xc4\x1a\xaf\x94\x36\x67\x63\x2e\x00\xbf\x94\x2d\x6d\x0b" - "\xdc\x16\xf4\xfd\x22\x3b\xd1\xd1\x79\xf4\xfb\x17\x19\x9f\xe0\xde" - "\xe3\x5a\x99\xf0\x15\x42\xf8\xd4\x48\x57\x8b\xbf\xf8\xa2\x61\xfc" - "\x1f\x3e\x37\xa6\xbb\xe8\x61\xf8\x33\x81\xbf\x06\xc9\xb7\xc6\xfe" - "\x44\xf2\x92\x17\xe5\x79\x98\x79\xbe\x9c\xd3\x17\x95\x78\x58\x43" - "\x83\x7a\x4f\xf8\x3f\xa3\xee\xbc\x32\xfe\xa4\xe9\x2b\x24\xde\x5f" - "\xd4\x44\xf8\x37\x8f\x7e\xff\x42\xf9\x0f\x68\x71\x49\x37\xe9\xc5" - "\x19\x9f\x9e\x28\x2b\x4b\xa6\xf4\xc3\x5a\xfa\x04\x5d\x0a\xc1\xe6" - "\xa2\x3e\x8d\x86\xf4\xc7\xb4\x2e\xa6\x67\x82\x39\x2b\x54\x9f\xb3" - "\xfc\xc5\x26\x93\xf6\x4c\xf7\x56\x8d\xc6\xd0\x3d\xf1\x7f\x3b\x7b" - "\xd5\xfb\x64\x0f\xfb\x99\x96\x3e\xc7\xa3\xaf\xa9\xd6\xda\xa9\x38" - "\xa3\xcc\xb2\xad\xb1\x0e\x65\x4b\x00\xf1\x8e\x66\x51\x9e\x4c\x9a" - "\x2b\xd2\x77\x40\x4e\x5f\x43\xd9\xa0\x65\x11\xe2\xb6\xbb\x1e\x00" - "\x0e\xc4\x0a\xff\x61\xe5\x1b\x2c\x69\xe0\xdf\x70\xbe\x59\xc4\xf1" - "\x81\xff\xaf\x20\x9b\x28\xfc\x46\x6f\x09\x24\x0b\x7f\xc9\xeb\xec" - "\x26\xcd\xf7\x17\xcd\x39\x3b\xd7\x97\x05\xe1\x0f\x4c\xe8\xb9\xfc" - "\xf6\x38\xe1\x03\x4c\xf5\xfd\xb5\x23\x87\xc5\xd7\x29\xd2\xf7\x97" - "\x38\xfb\x3c\x91\x78\xfd\x9c\xd1\xfd\x7f\x71\xe7\xeb\x01\xcd\xff" - "\x17\x62\x3d\xd3\xbd\x9d\x0f\x04\x91\x26\xfc\xf3\xab\x7e\x5f\x0d" - "\xa3\xfa\x02\xd3\x13\x0d\xd4\x4b\x5f\x60\xe3\x5b\x3b\x62\xe7\xc8" - "\xf1\x8f\xcd\xd3\xe2\xa1\x46\xa4\x55\x11\xfe\x4a\xdd\x88\xee\x22" - "\x87\x9a\x46\xf4\x6f\xe7\xa2\x61\x3e\x8b\x68\x17\xf4\x7d\x34\x3f" - "\x7d\xbc\x20\x6b\x5b\xe4\x7c\x11\xd6\x00\x0c\xcb\xf0\x04\x5a\x63" - "\x27\xd2\x6f\x12\x7e\x0b\x86\xe9\xc2\x00\xef\x52\xe3\xf6\x05\xcd" - "\xb9\x51\x3c\x35\x18\x8c\xca\x08\xea\x3a\x45\x6c\xc2\x10\xd3\xa7" - "\x86\x82\x38\x53\x6c\x08\x0e\xf0\xce\xd4\x50\x3f\xaf\x7c\x00\xf1" - "\xc5\xe0\xcb\x74\x3a\xcf\x08\x55\x89\x58\x7d\x4a\x0e\xef\x00\x8f" - "\x1f\x1a\xe0\xad\xa1\x1c\xde\x42\x63\x60\x82\xfc\x00\x5f\x2b\x71" - "\xba\x00\x8b\x73\x44\xbd\x71\xd7\xd9\x37\x38\xfc\xac\x20\xee\x8d" - "\x52\x1c\x80\xdf\x17\x5d\x46\x30\xaa\xd0\x1d\xec\x16\x3e\xa7\x53" - "\x73\xe7\xf2\xd4\xd0\x24\x4e\x74\x32\x4a\xc4\xac\xc9\xe1\x07\x52" - "\xd7\xf3\x7e\x11\xcf\x6c\x3d\xf1\xd5\xeb\xfb\x39\xe2\xa3\x51\xd9" - "\x2d\x19\xb9\x5f\x46\x3c\xb4\xc1\xd4\x5c\xa5\x20\x23\x57\x47\x6d" - "\xf9\x2b\x4f\xcd\xfd\x2b\xb5\x27\x99\xca\xb5\xd0\xf3\x5c\xbe\x53" - "\xb4\xb3\x50\xc8\x31\xd4\x47\xc8\xa1\x28\xb3\x89\xda\x88\x40\x42" - "\x6f\x64\x04\x5d\x85\x22\xfe\x9a\x1a\x23\x39\x35\x77\x88\xa3\x3e" - "\xaa\x6b\x76\xea\x7a\x36\x37\x63\xfd\xf4\x42\x21\x0f\x9e\x82\xcf" - "\x1a\x1b\xd5\x5b\x08\x78\x98\x10\xa3\x50\x9c\x59\x2a\x36\xdb\x2f" - "\x14\x5b\x6d\x54\xd9\xb9\xb8\x3b\x91\x97\x57\x75\xf2\xe2\x1e\x1f" - "\x2f\x7f\x6c\x11\x2f\x69\x83\xee\x86\x78\x90\xe3\x07\xe8\x99\xd2" - "\xfb\xaa\x79\xf9\xe3\x8b\x78\xf1\xe9\xa5\x74\xa5\xe7\x33\xb3\x78" - "\xf9\x13\xf4\xdc\x1a\xa4\xef\x3a\x78\x71\x1b\xbe\x4b\xe3\xc5\xed" - "\x7d\x74\xa5\x67\x77\x37\xe5\xa3\xe7\x8e\xc3\x74\xa5\xe7\xf7\x3b" - "\x7b\x74\x66\x7a\xf7\x04\xa5\x9d\x35\xc8\xba\x02\x06\x51\x57\xf1" - "\x90\x41\xd6\xa1\x18\x44\x1d\xa5\x3a\x83\xa8\xa3\xd4\x60\x90\x75" - "\x1c\x6a\xa5\xfc\x5d\xbc\xb8\x73\x0e\xe5\x4b\xe7\xc5\x1f\xee\xa1" - "\x2b\x3d\xff\x3e\x81\xf2\xd1\x73\x57\x19\x5d\xe9\xf9\x0f\xd4\x96" - "\x27\xe8\xf9\x8f\x2b\x28\xff\x61\x5e\x7c\xd8\x43\xf9\x16\xf3\xe2" - "\x3f\x2f\xa2\x2b\x3d\xff\xa5\x85\xf2\xd1\xf3\x11\x2a\xe7\x71\x7a" - "\x3e\xda\x48\xf9\x17\xf3\xd2\x49\x68\x8f\x87\x97\x1a\x51\x6e\x26" - "\x2f\x8d\x41\x7e\x7a\xbe\x88\xca\x7b\x9c\x9e\x63\x77\xd1\x95\x9e" - "\xcd\x0b\x29\x3f\x3d\x5b\xa8\xaf\x55\xdd\xbc\x74\x72\x03\xe5\x5b" - "\xca\x4b\xe3\x29\xfd\x31\x7a\xbe\x24\x40\xf9\xe8\xf9\x52\xe4\xa7" - "\xe7\xcb\xd2\x28\x3f\x3d\x4f\x05\x8c\x7a\x79\xe9\xb4\xc5\x94\x2f" - "\x8b\x97\x4e\xdf\x47\x57\x7a\xfe\x32\xda\x4f\xcf\x89\x79\x74\xa5" - "\xe7\xaf\x10\xac\x9e\xa0\xe7\x6b\xa8\x7d\x55\x7d\xbc\xf4\x6b\x28" - "\x7f\x05\x2f\x9d\x01\xf8\xd0\x73\x72\x16\xe5\xa3\xe7\x1b\x08\x1e" - "\x8f\xd3\xf3\xd7\x93\x29\xff\x8a\x51\xc7\xb3\x74\xb6\x91\x17\x4d" - "\x64\xbc\xf4\x5b\x76\x5e\x34\x89\xae\xb7\x76\xf1\xa2\x09\x76\x5e" - "\xfa\xed\xd9\x94\x4e\xd7\x79\x8d\xf4\x9c\xa4\x3e\xd3\x75\x7e\x09" - "\x3d\x27\xab\xcf\x74\xbd\x2d\x93\x9e\x67\xa9\xcf\x74\xfd\x4e\x2f" - "\x3d\xcf\xe6\xa5\x0b\x5c\xf4\x8c\xeb\x22\x7a\x9e\xa3\x3e\xd3\xf5" - "\xf6\xcd\x74\x0d\x7a\xa7\xdd\x5b\xe3\x8d\xcd\x4c\xf3\xc6\x56\xbb" - "\xb0\x96\x85\x2a\xaa\x3a\x94\xb8\xc7\xd2\x68\x2d\x99\x58\x70\x96" - "\x4d\xea\xd1\x4d\xfe\x19\xf8\x3f\x77\x9e\x47\xc4\x40\x52\xfd\x0b" - "\x4d\x3c\xaa\xbb\xf8\x65\x5a\xbf\x67\x23\xc6\x2d\xf5\xd5\xc4\x9d" - "\x13\xce\xd0\xb5\x8c\x3b\x2f\x3a\x4a\x7d\xa5\xe7\x8b\x0f\xd1\x95" - "\x9e\xbf\x51\x4a\x7d\xa6\xe7\x7b\x6f\xa5\x6b\x99\xbf\x78\x72\xbc" - "\x47\x67\x16\x74\x89\x3f\xbd\xb8\xd1\x1c\x2c\x20\x3a\x41\x74\x74" - "\x5b\x6d\xa1\x39\x98\xc9\x78\xf9\xd6\x4c\x33\x7c\x94\xef\xb8\xb7" - "\x8b\xc7\x65\x8a\x36\x21\x0e\x01\x1f\x4a\xd4\xcb\xba\x2f\xe2\x47" - "\x75\x93\xbf\x05\x7d\x24\x8f\xcb\x1d\xeb\xfd\x12\xf1\x7e\x6a\x6d" - "\x95\x7c\x6f\x61\xe1\xf7\xff\x82\xf7\x45\x66\xe8\x90\xaf\xb8\x83" - "\xe8\xe1\xe4\xdd\xc8\xe3\xd1\x5d\x7c\x80\x3b\xa3\x98\xdb\xd7\xab" - "\xf6\x71\x12\xf2\x3d\x83\xef\xc6\xd2\x91\x28\x65\xdb\x9a\xca\x9d" - "\xbc\x03\xf2\x20\xd1\x7d\xbd\x2d\x3f\xb1\xe9\xa8\x2e\x3e\x77\x87" - "\x90\xf3\x6b\xd3\x71\x7e\xe6\xa8\xee\x4b\x37\x0f\x95\xb6\x55\x21" - "\xf6\x38\xbd\x5b\x5f\x10\x20\x39\x3f\xff\x56\x5a\x9f\x44\x7a\xab" - "\xb0\xc9\x96\xf7\x4d\xc2\x1e\x47\xde\xef\x12\x3a\x4b\x2a\x0b\xdf" - "\x46\xf2\xdf\xa1\xe2\x9b\xd3\x95\xb8\xda\x4c\xb1\x7f\xa4\xfb\xd2" - "\xb7\x7e\xab\x78\xf4\xe6\x6c\x36\xc1\xb6\xe1\x0d\x2a\xff\x4b\x25" - "\x23\x65\x35\x2d\xaf\x78\xf7\xd0\xeb\x94\xb7\x56\xe8\x55\xbe\x54" - "\xa3\xe9\x61\x39\xf5\xe1\x51\xf8\x77\xd6\xb3\x14\xac\x45\x92\xf7" - "\x8a\xb7\xc2\x2f\x59\xd0\xb4\x35\x25\x58\x96\x99\x12\x2a\xab\x4d" - "\xe7\x15\xb5\x99\x71\x41\x1d\x13\xf6\xec\xba\xf8\x3b\x67\x06\xa0" - "\xef\x7a\x0f\x79\x27\x28\x13\xbf\x5d\x36\x23\x97\xe9\x5d\xab\x3f" - "\xc2\xf3\x6d\xbc\x78\xa1\xc1\xdd\xd7\xc5\xe0\x67\x91\x9e\xe7\xf3" - "\xe2\x7f\x29\x51\x26\x7e\xaf\xaa\x1e\x3c\x63\x2e\xf4\x34\x87\x00" - "\x97\x77\x09\xce\xc4\x8f\xc7\x27\x46\xc4\x5a\xef\x28\x27\xd8\x81" - "\x9f\xc3\xd9\xe3\x8c\x50\x08\xfe\x61\x4a\x3c\x04\x07\xa9\xeb\x8b" - "\x87\x3f\x4d\xa6\xd6\xfb\x43\x25\xa6\x2d\x0f\x1e\x63\xcc\x41\x0b" - "\xfc\x6d\x88\xd8\xbd\x38\x5b\x5f\xa9\x60\x7d\x93\x79\x47\xf8\x96" - "\xbc\xdf\x91\xb1\xc1\xb1\x6a\x75\x76\xc6\x5a\xc7\x4d\x36\xc4\x9c" - "\x5e\xf5\x80\xed\xa1\x65\x0f\xad\x5a\xbd\xfe\x7c\xbe\xcf\x48\xed" - "\xda\x47\xb8\x21\xfc\x09\xbd\x4b\xbc\xa4\xd0\xff\xea\xa6\x94\x61" - "\xac\xb7\x3d\x29\x7d\x74\x53\x1e\x8f\x87\xfd\xbb\xf0\x09\xa0\xd4" - "\xd4\xe6\xf2\xba\x7b\xbb\xb6\xe0\xcc\xf5\x5a\xf0\xeb\x5e\xe6\x66" - "\x67\xa8\x6d\x32\xc6\x54\x7b\x90\x78\xdb\x9c\x3c\xee\xca\x39\x03" - "\x1c\x4f\xe7\xe5\xd5\x59\x7c\xc7\x62\xdb\xb9\xf2\x4c\xc2\x99\x29" - "\x8e\x73\xe5\xd5\xe9\x5a\xfc\x87\x50\x59\x75\x93\x62\xda\xd6\x81" - "\xf8\x0f\x43\xdc\xca\xda\x08\x96\x83\x25\x6d\x59\x44\xe3\x97\xee" - "\x70\xd2\xba\x43\xbc\xbe\xf0\x2d\xf0\xf4\xe2\xaa\x10\xb7\x1b\x42" - "\x4e\x66\xa4\x6b\x1c\x8f\xab\x65\x43\xa6\xad\x69\x78\x8f\xb8\x0f" - "\xa1\x21\x3b\xcb\xef\xe4\xca\xbf\x66\x11\xde\x38\x19\x17\x71\xfb" - "\xb2\x4e\x32\x4a\x8f\x51\x2a\xaa\x3d\x3d\x0b\x98\x1e\x79\x89\xaf" - "\x61\x8b\xe9\x3e\x6f\x09\x8b\xa5\x7c\xe6\xbc\x77\x29\xdd\x6f\x8f" - "\x09\x16\xd8\x8d\x83\x05\xf6\x98\x21\x6e\x37\xb9\xbb\x03\x6c\xe8" - "\xea\xc5\x0d\xd7\x79\x99\x61\x1b\xf1\x3f\x3b\x14\x9a\x5f\x75\xf7" - "\xba\x42\x8f\xd8\x27\x06\x1f\xb1\x1b\x86\x86\xec\xc6\xe0\x3a\xbb" - "\x61\x70\x9d\x7d\xe2\x90\xdf\x6e\x74\x2f\xf5\xb2\xf7\xbc\xbf\x64" - "\xed\xdd\xbd\x42\x47\x38\x14\x5b\x6b\x1a\x8a\xad\xee\x33\x75\xb3" - "\xf8\x19\x0e\x06\x7e\x57\xb7\x9d\x78\x5b\xc2\x09\x53\xf0\xa9\xc5" - "\x55\xbc\x7c\x7b\x23\xc1\xf7\x9e\xdb\xae\xe1\xa7\x43\xc5\x09\x89" - "\xb6\xdb\x89\x16\x15\x19\x12\x28\x8d\xf0\xc7\x5e\xcd\x8b\x13\x0f" - "\x93\x6c\x6d\xa3\x5f\xa2\x47\x8e\x03\xe3\xc5\x53\x89\x46\x1a\x12" - "\x90\x57\xe6\xbb\xd2\xee\x11\xd7\x69\xb9\x22\x36\x5e\x71\xfc\xe6" - "\x1d\x42\xe6\x9a\x52\xa2\xf1\xcd\x07\x0c\xa3\x9f\xeb\xa6\x3c\x7b" - "\x86\x65\x57\x85\xe8\x49\x79\x95\x6b\x74\x3a\xfd\x76\x35\xf6\x0b" - "\x15\x82\x5b\x8f\xee\xd2\x69\xf0\x41\xc3\x0b\x16\xa8\xf2\xe2\x14" - "\xe1\x0b\x13\x67\xa1\xa1\x53\x90\x69\x97\x0a\xbd\x85\xa2\x4f\x81" - "\x9f\xe4\x26\xf8\xfd\x81\x0e\x81\xf0\xba\xc5\xa3\xbb\x14\x3a\xab" - "\x09\x24\x77\x35\xd2\xaf\x89\x7e\xae\x27\xa0\x5b\x70\xb2\xdb\x34" - "\xbd\xcb\xe8\x6d\xbd\x34\xdd\xc3\x4a\xaa\xc2\xb2\xe7\xa5\x59\xd4" - "\x6f\xd7\xb8\x6d\xef\x74\x97\x8e\xb9\xff\x2d\xfc\xcc\x01\xc6\x15" - "\x55\xde\x2a\x65\xd8\xb7\x20\xd1\xfd\x4b\x7f\x8b\x38\xe0\xe2\x5d" - "\xd9\xd6\xcc\xfc\x4f\x59\x14\xde\x35\xc2\xb6\x80\x9e\x6d\xab\x75" - "\xdc\xed\x0b\x30\xfa\xc6\xc0\x13\xee\xed\x6a\x1c\xf0\xea\x31\x2f" - "\xda\x29\x8d\xbe\xfd\xb0\x6a\x40\x2d\xb7\xa6\xb6\xb0\xe0\x61\x26" - "\xfc\xc1\x23\xfe\x05\xe6\x4b\x55\x3e\xc9\x78\x88\xd5\xb1\x3a\x8a" - "\xe8\x95\xf5\x62\xba\x37\x22\x1f\x37\x6d\xcd\x54\xa8\x0c\x9a\x33" - "\x2d\x3c\x76\xeb\x02\xa5\xbc\xba\x83\xd6\x87\x2a\x3e\x6d\xf1\x6c" - "\x65\x5b\x2d\xc9\x16\x56\xf4\x5f\xc8\x1e\xf0\x2f\x02\xbd\x45\x88" - "\xe4\xe7\xf6\xdd\x41\xc6\x6f\x0d\xb2\xb7\xb3\xcf\x32\x6f\x74\xdb" - "\x0a\x6f\xec\xb6\x26\x6f\xec\xf6\xc6\x50\xec\xb6\x00\xfd\x82\x8e" - "\xd5\xcc\x74\x42\x77\x59\x52\xc8\x29\x7d\x03\xa7\x7e\xca\xfd\xc2" - "\xde\xd1\x09\x5f\x5e\xd2\x4f\x91\xf0\x11\xac\xc6\x06\xa1\x32\x13" - "\x45\x4c\x10\x92\x09\x42\xeb\x48\x16\x18\xa0\x79\x30\xc0\xac\x5a" - "\xbc\x87\x1d\xaa\x1f\xe0\x8a\x9c\xb0\x1c\xa0\xf2\xf8\xf1\xb8\x0f" - "\xe9\x7f\x6d\xdf\x01\xbf\x46\xa0\xcd\xf0\x6b\x04\x7e\x7f\x8d\x1d" - "\x7e\x03\xc3\x7e\x8d\xfc\x76\x3d\xf1\x98\x1d\xc4\x5f\x0a\x3e\x53" - "\xf8\x1a\x14\x36\xdb\xcc\x14\x8a\xdd\x3a\x1b\x34\x2d\x23\xd7\x25" - "\x7c\x0d\x82\xd7\xc4\x5a\xe3\x2f\xbe\x2c\x4b\xe3\x1f\x41\x3f\x43" - "\x5b\xda\x72\xe9\x97\x4d\xe9\x85\x1e\x5d\xd2\x5e\x8d\xb6\xd2\x7a" - "\xea\x08\xc5\x2c\x8a\xf7\xc3\x0e\x7f\x28\x6b\x2e\xf2\x12\x1c\xe1" - "\x93\x32\x2a\x34\x94\x35\x87\x7e\x37\xd3\xef\x96\x50\x79\x75\x66" - "\xa8\x7c\x7b\x55\xa8\x3c\x33\x9b\x7e\xb9\xf4\xcb\xa3\x5f\x21\xfd" - "\x36\xd3\xaf\x84\x97\x67\x96\xd1\x15\xef\xab\xe9\x57\x43\xbf\x3a" - "\xfa\x35\xd0\x6f\x57\x68\x5b\xad\x23\xa4\x33\x24\xd0\x2f\x91\x7e" - "\xb6\x50\xf9\xb6\x96\x50\xf9\xd6\x14\x71\x36\xb2\x78\xaa\x45\xc3" - "\xd3\xd1\xcf\xdd\xfb\x17\x08\x3f\xd6\x13\xfe\xc2\xcd\x88\x17\x99" - "\x77\x16\x3e\xb2\x16\xbc\x6d\xf7\x8d\xcf\x9f\xb9\x6e\x6a\xca\x58" - "\x78\x8d\xf2\x89\xc6\x0c\x8d\xb3\xbc\x31\xe3\x95\x28\xd6\xda\xdc" - "\x60\xc2\x62\x5b\xd0\xc9\x0a\x89\xae\xe9\xda\x33\xbb\x59\xaa\x97" - "\x15\xb4\x76\x0f\xb2\x82\xa5\x3c\x24\x68\x40\x1e\x6c\xaa\xcb\x82" - "\xc0\xf1\x10\x4f\xb7\x0d\x95\x55\x67\x85\x4c\xdb\xaa\xb8\x69\x5b" - "\x8b\xf0\xbb\x45\xb4\x04\xb1\x6f\x86\x65\x50\xe0\x1c\xc9\xa1\x6d" - "\x7d\x67\xd9\x23\x4b\xb9\xd2\x46\xa3\x0b\xdf\x5a\x66\x1d\xfb\x99" - "\xc0\x3d\x55\x0e\xbd\xe3\x30\x2f\x24\x5c\x8a\x0e\x11\xdc\x14\xc8" - "\x9f\x84\x77\x90\x45\x35\xdc\xa3\x35\xdd\xa2\xc5\x0b\xe1\x13\xa7" - "\x26\xd2\x3b\x03\xe2\x89\xd4\x91\x1c\x5a\x97\xc3\x12\xeb\xe8\x9d" - "\x88\xfd\x46\xed\xbe\xcb\x61\xe6\xca\x8f\xed\xac\xfe\x41\x66\x8c" - "\x3d\x29\xe3\x09\x86\x08\xf6\xc3\xfe\xa8\xcb\x32\x9b\xee\x3c\x69" - "\x63\x6f\xdb\xff\x44\x6b\x73\x23\xad\x61\x99\x4d\x43\xb4\x7e\x11" - "\x2c\x43\xe3\x83\xe5\xe5\x87\xff\xb3\x60\x39\x94\x70\xaf\x4b\xc2" - "\x33\x93\x01\x66\xe7\xc3\x13\x30\xde\xd0\x4d\xf0\x24\xb8\xba\x3b" - "\x43\x24\x4f\xb2\x25\x1a\x3c\x6b\x09\x9e\x04\x53\x2b\x60\x4a\xf0" - "\x10\x30\xe5\x2a\x4c\xeb\x23\x60\x4a\xb4\x4b\xf8\x28\x03\x4c\x15" - "\x82\x69\xfd\x18\x30\x1d\x96\xe7\x09\xa6\x3b\x3f\x17\x4c\x77\xff" - "\x1d\x30\x9d\x96\x3c\x16\x4c\x83\xe0\x1b\x2a\x32\x1b\x39\xd1\x45" - "\x77\xf0\x3d\xe1\x6f\x8f\x78\xbe\x20\xf1\xae\x01\xc5\x54\xdd\x84" - "\x38\xb1\xd8\x57\x47\xfc\x9a\x82\x5c\x7e\xa4\x60\x37\x3f\x17\xaa" - "\xa8\xb5\x20\x8d\xe8\x5a\xd6\x4c\xd8\xea\x38\x3c\xb4\x76\xf1\xa6" - "\xf6\x01\x1f\xad\x67\xb6\xe5\x83\xe0\xa9\x2b\x6a\x53\x15\x9e\xc5" - "\x40\x53\xee\xbb\x86\x19\x06\x89\x6e\x38\x72\xd8\xf4\x2a\xa2\x85" - "\x83\xe5\xdb\x82\x27\x74\x57\x18\x6e\x73\x28\x9c\x7e\x05\xf0\x1b" - "\xa7\x10\xcd\x25\x5a\x2e\xc6\x17\x63\x86\xfd\xba\xb6\xfb\xde\xa2" - "\xf2\xae\x38\x7b\x30\x33\xc8\x0a\xb2\x3e\x3b\xbe\x4a\x41\xba\x2d" - "\x54\xf6\xb7\xe7\x09\x62\x68\xe5\xf5\x62\x5c\x1b\x99\xbb\x3b\x3c" - "\x4f\x14\x95\x46\x63\x2c\x30\x2f\x30\x47\x2a\x23\x68\x33\xd1\x7d" - "\xcb\x0e\xd5\x1f\x7b\xc8\x49\xb4\x19\x3e\x7b\x69\x2c\xe1\xa7\x7d" - "\xd4\xf9\xf1\x08\xcd\x8f\x0d\x22\x86\x86\x95\xe0\xd1\x38\xe8\x97" - "\x63\x88\x31\x73\x07\x5b\xc4\xf8\x55\xa9\x6b\x81\x84\xfb\xb6\x83" - "\x9c\xa7\xb3\x10\xfc\x58\x57\xd4\x32\xee\xcf\x8a\x41\x1c\x15\x92" - "\xf9\x93\xcd\x4b\x89\x7f\x3a\x4d\x6b\xc5\x4a\xc2\xaf\x53\x2c\x71" - "\xe7\x4a\xe2\x89\xfc\x88\xdb\x43\xed\x59\x2f\xe3\x1d\x2a\xc5\x53" - "\x4b\xe8\x9d\xf0\x83\xa7\x68\x7e\xf0\xfa\xed\xd0\x43\x84\xf5\x43" - "\xab\xec\xfa\x70\x9d\x87\x3c\x21\x63\x68\x81\x38\xc3\xa9\x9b\xfe" - "\x5b\xb9\x1f\xfc\x6b\x9c\x0f\x63\x7d\xba\xe9\xd2\x4f\x77\xc9\x6b" - "\x89\x8e\x7c\x36\xe9\x84\x6e\xfa\x53\xbc\x74\xbf\xd5\x81\x18\xae" - "\xda\xbb\x82\x74\xc0\xc1\x36\xa3\x90\x15\x86\xb6\x84\xb2\x10\xdb" - "\x97\x17\x64\x8d\x93\xf6\x4e\x17\xb6\xf8\xa1\x92\x43\xdd\x04\xa7" - "\x14\xa5\xf4\x50\x1f\xd1\x94\x64\xfe\x63\xea\xeb\x83\xd4\xd7\x13" - "\x04\xd7\x13\xd4\xd7\x75\x6a\x5f\xd5\x58\x46\x0a\xc1\x9f\xde\x8d" - "\xbe\x36\x6a\x7d\xfd\x31\xfc\xe2\xbf\xe8\xdd\x78\x92\x7d\x89\x13" - "\x3f\xde\xd6\x27\xce\xe1\xf8\xdd\xc1\x3f\x31\xd4\x2b\xd6\xee\xb2" - "\xcc\x92\x7b\x08\x1f\x01\x73\xe2\x17\xbc\x3c\xae\xda\xa3\x8d\x03" - "\xda\xc3\x87\xb2\x62\xea\x57\x52\x7b\x00\xfb\x53\x2c\x09\xf3\x99" - "\x60\x9f\x58\x0f\xf8\x8f\x8c\x27\x1a\x2f\xc6\x60\x22\x8d\xc1\x4a" - "\x75\x0c\xb6\xa8\x63\x40\xfc\x32\xad\xc3\x46\x92\x1b\xad\xf5\x4e" - "\x39\x06\xe3\x83\x91\xcd\xf3\x0f\x9e\xaf\xf1\x63\xcf\xd7\xc4\x69" - "\x83\x52\x46\xd6\xc1\x1f\x1f\xc9\x08\xdf\x57\x86\x68\xde\x56\xa8" - "\xf3\x96\x67\xdd\xa2\xcd\xd9\x1e\xdd\x95\xaf\x7e\xbe\x39\xfb\xe5" - "\x67\xfe\x1f\x9d\xb3\xf1\xff\xb9\x73\xf6\xaa\x87\x47\xce\xd9\xab" - "\x76\x8d\x9c\xb3\x57\xfd\x20\x3c\x67\xd5\x77\xff\x90\x39\x7b\x95" - "\xe3\xbf\x67\xce\x5e\xe5\x18\x65\xce\xfa\x3e\xc7\x9c\xb5\x8e\x31" - "\x67\xad\xff\x79\x73\x36\xb1\xfa\xbf\x6e\x8d\xfd\xea\x87\x83\xfa" - "\x51\xd6\xd8\x47\x22\xd6\xd8\x58\xac\xb1\x57\x67\x8d\x36\x5f\x87" - "\xea\x68\xbe\x9a\xd4\xf9\xfa\xaf\xbf\xa1\xf2\xbe\xb2\xe4\xbd\xc3" - "\x7f\x7b\xbe\x06\xeb\xc2\xfc\xd3\x98\x73\x36\x0b\x73\x76\x37\x73" - "\x7b\xc4\x9c\x5d\xa2\xcd\xd9\x3a\x55\x16\xba\xc0\xbc\x8d\x1f\x6b" - "\xde\x22\x36\x0a\xe2\xa2\x5c\x70\xde\xaa\xfc\xd2\xd0\x34\xcc\x5b" - "\xd7\xff\xb0\xb5\xf6\xab\xd7\x8c\x9c\xb7\x5f\x5d\x3c\x72\xde\x7e" - "\xf5\xe2\xf0\xbc\x55\xdf\xfd\x43\xe6\xed\x57\xed\xff\x3d\xf3\xf6" - "\xab\xf6\xff\x7b\xd6\x5a\xfb\xc2\xff\xba\xb5\xf6\x6b\x8f\x89\x79" - "\x3b\xd6\x5a\x5b\xa0\xae\xb5\xb1\x58\x6b\xaf\xb9\xfa\xf3\xcd\xdd" - "\x6b\xa7\xfd\x3f\x3e\x77\xff\x93\xd7\xdc\x6b\x8f\x8d\x9c\xbb\x5f" - "\xb3\x8e\x9c\xbb\xd7\xb6\x85\xe7\xae\xfa\xee\x1f\x32\x77\xaf\xed" - "\xfe\xef\x99\xbb\xd7\x76\xff\xdf\xb3\xe6\x26\x8d\x19\xa3\xdc\x76" - "\x05\x2b\x3c\xaa\x4b\x5a\xe2\xae\x13\x36\x79\x85\xee\xe0\x4d\x4c" - "\xda\x91\x24\x6d\x71\x5b\x67\x33\xa5\xb4\xcd\x03\x7f\xf3\xb0\x67" - "\x79\x22\xc2\x5e\x44\xda\xa6\x24\x3d\xa3\xd9\xbb\xec\x54\x7d\xd2" - "\x5f\xc8\xde\x85\x97\xb4\xa9\x36\x2d\x49\xdd\x12\x37\xda\x72\xb5" - "\x67\xe1\x1b\x4a\x97\xd4\xcb\xb7\xb4\x39\xbc\xd1\x6d\x63\xf9\x91" - "\x36\xc6\x15\x71\x0e\xdb\x90\xfe\x2b\x16\xa7\xf4\x97\x32\x56\x25" - "\xf6\x61\xae\xb3\xd1\xb7\x62\x2f\xac\x3f\xce\x92\xdc\xef\x4c\x63" - "\x94\x36\x4b\x4b\x13\x71\x4a\x9d\x51\x5c\xa1\x77\x44\x43\x10\x7b" - "\xda\x08\x5f\x9b\x33\x06\x80\x8b\xd7\xcd\x27\x1a\x21\xec\x3e\xe0" - "\x83\x9f\x5f\x7a\xb9\xaf\xfe\x0c\x33\xb4\x6f\x16\xba\x67\xd8\xc9" - "\x34\x54\x00\xff\xa3\xae\xad\xe1\x7a\x03\x53\x76\x2c\xb6\xf3\xd8" - "\xed\xd2\x16\x97\x70\x45\xb3\x9d\x41\xdc\x1a\x65\xda\xbd\x2d\x9a" - "\xbf\x47\x4e\xed\x7b\x3d\xdf\xab\x47\xec\xdb\xfa\xd5\xcc\x42\x3f" - "\x13\x2f\xdf\x8e\x76\xb5\x6a\xba\xc4\x31\xed\xaa\x11\x6b\xf1\x72" - "\xab\x41\xb5\xd3\xc1\x79\x57\x69\xc3\xac\x27\xca\x44\xe9\xdc\x59" - "\x20\x62\xa5\x98\x09\x16\xb0\x85\x25\x3a\xa5\x57\xea\x17\xa7\x6c" - "\x9a\xca\xd8\x73\x1b\x7a\xf5\xb0\xdd\x08\xfd\xf4\x72\x9f\x2b\xff" - "\x06\x11\xfb\x1c\xfe\x84\x7b\x74\x33\xde\x4d\x3d\x2e\xe3\x2a\xd2" - "\x3d\xfc\xaf\xeb\xee\xa4\x67\xec\xe5\x2b\xfd\x56\x03\xf2\x52\x7a" - "\x91\x2b\xe7\x23\x66\x76\x08\x7b\x75\xa3\x9a\x37\x0d\x79\x3d\xba" - "\x19\xc2\x0e\x99\x9e\x97\x62\xcf\x00\x36\xed\xb0\x45\xe2\x75\x8b" - "\xed\x82\x3e\x94\x6d\x67\xca\xb4\xc5\x76\x61\x47\x4a\xfd\xac\xa4" - "\x3e\x53\x1e\x13\xec\x6e\xc4\x35\x9f\x59\xaa\x29\x0d\xe5\xd0\xd5" - "\xe4\x5a\x09\xdb\x92\x19\x29\x28\x7b\x4c\x7b\x7d\xd3\x76\x5a\x03" - "\x0c\x4c\x9e\xa1\xd1\xbd\x7f\x54\x37\x33\xdb\xac\xe3\x9c\xd7\xdd" - "\xdb\xb2\x09\x3a\x6e\xd8\x48\x0b\xbb\xef\x99\x77\x52\xf9\x86\x9d" - "\x42\x87\x3b\x33\xc9\xa3\xbb\xae\x4b\xf5\x69\x21\x63\x39\xe8\x66" - "\x6e\x46\x3d\xf8\x46\xcd\x9f\x20\xf0\x8f\xda\x6c\xcb\x8f\xe2\xf4" - "\xfc\x90\xb4\xa3\x36\x2e\xa1\xef\x57\x84\xed\xc7\xc4\x77\x34\x66" - "\x33\xa1\xff\x15\x31\x2b\xf0\x3c\xa6\x8d\xb2\x3a\x6e\x6d\x44\xdd" - "\x3e\x33\x76\x1a\x8e\x10\x5e\x68\x38\x82\xf6\x3e\x9f\xef\xd1\xcb" - "\xfd\x8d\x64\xe1\x37\xb9\x82\xc6\x30\x54\x6b\x85\x3f\x41\xa6\x0c" - "\x61\x5c\x60\xeb\x9e\xfc\x36\xc6\xa5\x92\xd6\x02\x99\x77\x66\x6f" - "\xb8\xfd\xe2\x5b\x31\x9e\x0a\x8d\x85\xb4\x5d\x4a\xde\x26\xe2\x52" - "\x10\xcd\x80\xbd\xf7\x81\x5c\x6a\x17\xf0\x96\x70\xe4\xb9\xd5\x01" - "\x7d\x7d\x8e\x4c\x7f\xfd\x4c\x40\x0f\xdb\x0f\xe8\xc2\xcb\x1f\x64" - "\x06\xe8\xd4\x51\x26\x4f\xb8\xb7\x65\xa6\x36\x8e\x1b\x68\xec\x72" - "\x08\x77\x09\xe6\x95\x04\xbf\xfa\x41\xb1\x5f\xd5\x52\xaf\x30\x93" - "\x42\xf9\x3c\xba\xe4\x4e\x2a\xcf\xb2\x63\x0a\xf7\xc2\xc6\x9a\x60" - "\xb8\xd6\x5f\x9c\xdc\xa8\xc1\x10\x6d\x82\x8d\x74\xb9\xb0\x95\x4f" - "\x4e\x92\x38\x34\x33\xa8\xf5\x79\x2c\x78\x96\x3f\xc7\x12\xca\x67" - "\xb0\xd9\x8a\xd1\xbf\x80\x47\x5d\xde\x00\x7d\xf3\x5d\x7d\x8c\xc1" - "\xbf\x76\xea\x4f\xfe\xc2\xdd\xde\x10\x53\xa2\xfd\x0b\xb0\x37\x11" - "\xda\x74\xed\xe4\xd4\xf5\x04\x2f\x5a\xef\x0b\x02\xcc\xe2\xce\xf7" - "\xca\xb8\x36\xec\x53\x16\x5a\x43\x34\x9c\xe8\x3a\xad\xa9\x86\x82" - "\x4f\xd9\x65\x80\x97\x12\x5b\x9d\xd5\xa3\xbb\xfe\x27\xf7\x64\xb3" - "\xc2\xf1\xd1\xd1\xeb\x85\xff\x0b\xf0\x17\x44\xf3\xf5\x22\xae\xb1" - "\x97\xf8\x93\xf2\xea\xac\x71\x96\x53\x33\x16\x8d\x44\xbf\x15\xe8" - "\xa1\xd5\x3e\xa7\xa2\xcf\xbe\x00\x83\x2e\xff\xae\x87\xe1\xaf\xf3" - "\x2c\x53\xb6\xf8\x17\xa0\xcf\xc4\xeb\xf4\x8e\x5f\xa7\x7f\x43\xfc" - "\x85\xea\xe6\x04\x6f\x65\xd3\xe5\x0d\x8a\x69\x5b\x2f\xea\x46\x1b" - "\x70\x56\xe6\xae\xb3\x4c\xc0\x1d\xf0\x77\x07\x42\x8c\x47\x47\xb6" - "\x21\x38\xde\x36\x8c\xdd\xff\x19\x2c\xa1\xec\x39\x39\xee\xa1\x4d" - "\x2a\x0c\xb2\xb0\x47\xb6\xad\xb7\xdd\xe1\x65\x77\xa1\x0d\xde\x93" - "\xec\xce\x93\x4c\x8c\xbf\xdb\xde\xc7\x42\x51\xd7\x4e\x86\x4d\x05" - "\xc6\x3f\x3f\x48\xe3\x3f\x10\x80\xaf\x0e\xaf\xbb\xf0\x1c\x03\xff" - "\x12\xec\xb7\xeb\x3f\x3b\xfe\x37\xfe\xe4\x9e\xdc\xf1\x8e\xff\x8d" - "\xff\xa0\xf1\xbf\xf1\x7f\x40\xff\x67\x7d\x81\xfe\xcf\xfa\x07\xf5" - "\x7f\xd6\xff\x80\xfe\x7f\xfd\x0b\xf4\xff\xeb\xff\xa0\xfe\x7f\x7d" - "\xcc\xfe\xcf\xbb\x4c\xe1\xc2\xd6\x26\xae\xaa\x03\x6b\x80\x5c\xaf" - "\xbe\xb1\x11\xb6\x34\xe2\x6c\x94\xfa\xcc\xe4\x59\x29\xe3\x79\xcf" - "\xa6\xf3\x9e\x2d\xe7\x3d\xc7\x9f\xf7\x6c\x3d\xef\x39\x41\x7b\xa6" - "\x75\x64\xc2\x29\xdd\xd7\x4f\x12\x5f\x4a\x6b\xdf\x37\x4a\xd4\xf7" - "\x89\xf0\x65\x43\x6b\x7a\xe2\x58\xf1\xb9\x62\x75\x8c\x0f\xe9\x39" - "\x13\x71\xb3\x74\xdf\x08\x0e\x3a\x19\xe7\x51\x53\xed\x88\x7f\xa4" - "\x94\x65\x56\xdf\xb5\x1e\xf1\xe2\x03\xc4\xe7\x5b\x27\x52\xd9\x97" - "\xa6\x12\x9d\xc6\xb8\xda\x56\xc3\xb6\xe6\x1b\xc7\xd1\xcf\x19\x0e" - "\x17\x53\xa2\xae\x15\xb6\x0d\x4a\x79\x66\xb5\x37\xea\xda\xa9\x7c" - "\x5b\xad\xa3\xdc\xa9\x18\xdd\x7d\x9d\xac\x42\xaf\xd8\xf2\xf2\x68" - "\x7c\xfb\xf6\xb2\x47\xfa\x78\x6f\x5e\x90\x07\xdc\x8b\x5d\xac\xc0" - "\x8b\xd8\x09\x2d\xac\xdd\xdb\x29\xe2\x27\x88\x38\x11\xde\xbd\x0c" - "\xfc\x4f\x01\xf2\x50\x5a\xbb\x77\x0f\x6b\xa3\x67\xd7\xca\x63\xd4" - "\xcf\x7f\xda\xe6\xee\xdb\xc3\x42\x65\x99\x55\x8a\x29\x33\x9b\x9b" - "\x32\x73\xdb\xfa\x10\x63\x2f\x33\x0f\x6d\x6d\xa7\x76\xb8\x83\x4d" - "\x90\xb3\xf2\x44\xb9\xbe\x0e\x21\x93\x62\xcf\x56\x89\xa5\xfc\xb1" - "\x99\xb9\x68\x1f\xda\x36\x2a\xbf\x5b\xf6\x98\x81\xda\x7e\xd3\x3d" - "\x76\x03\xc3\x79\x86\xf1\xe1\xc8\x3f\xed\x1b\x93\x8f\x2e\x7b\x6c" - "\xb3\x2c\xd7\xf8\x05\xca\x9d\x3d\x26\xfd\xe7\x65\x8f\xab\xed\xb5" - "\x7c\x91\x72\x57\x5c\xa0\x5c\xb5\xbd\xb6\x2f\x52\xee\xd8\x31\xa1" - "\xcb\x9e\x50\xdb\x9b\xf2\x05\xca\xfd\x66\xc2\x05\xca\x55\xdb\x5b" - "\xf8\x45\xca\xcd\xbe\xc0\xb8\x19\xbe\x18\x2e\x7c\xb3\xe5\x42\xb8" - "\xf0\xc5\xf0\xe0\xa6\x0b\xf4\xff\x71\xc3\x17\xc3\x81\x9b\xc6\x3e" - "\xa3\x4a\x38\xf0\xc5\xc6\xff\xa6\x0b\x8e\xff\x17\x1b\xfb\xff\x63" - "\xbd\xd0\xd8\x7f\xb1\x71\xff\x3f\x63\xe2\x3f\x64\x03\x5e\x56\xe5" - "\xe2\x71\xb5\x99\x4a\x45\xa6\x4b\x89\xab\x7a\x6b\x93\x92\xc2\xe6" - "\x11\xd5\x35\xd7\xb0\x8b\xe7\xed\x60\x6c\x63\x1d\xd3\x93\xec\xac" - "\x7f\x76\x43\x97\xde\x1d\x9c\x0d\x7a\x15\xda\x95\x13\xd0\x5d\x45" - "\xe9\x6f\xd2\xfa\xe7\x23\x1e\x56\x96\x91\xe9\xaa\xc8\x4f\x61\xe2" - "\x8c\x1b\xc9\x0f\xf0\x01\x98\xfa\x29\xd1\xd4\x9a\x00\xec\x63\x2e" - "\xa6\xef\x82\x84\xbb\x54\x46\x80\x3d\xaf\x78\x75\x29\xab\x45\x3e" - "\xaf\xb0\x49\xaf\xa8\x7a\x8b\x17\xd8\xe1\x03\xcc\xdb\xa3\x9b\xb3" - "\x2c\xca\xcb\xf4\xf5\xc4\x9b\xfb\x8b\xe7\x64\x7a\x74\x37\xa7\xa9" - "\xe7\x43\xfb\x84\xef\x3a\x6a\xeb\x26\x92\x11\x90\x17\x3e\xec\x66" - "\x38\x98\x1e\x7e\x81\x29\x6f\x19\xfc\xd9\x5d\xe8\x9c\x75\xa8\x6c" - "\xdb\x2e\x7c\xcf\xcb\x68\x3d\x3e\xc9\xf4\xed\x3e\x2f\xc9\x14\x8b" - "\x6d\x15\x24\x8f\xdc\x76\x0d\xf4\x27\x67\x58\xfe\x46\xae\x40\x97" - "\xc5\x4d\xd5\xe9\xb0\x35\x14\x3e\xd2\x75\x37\xdb\x21\xdb\xab\x71" - "\x1e\xa7\x9e\xa0\x67\x21\x13\xc1\xe6\xc6\x94\xb9\x80\x57\xc4\xa6" - "\xb4\xfb\xce\x88\xf8\x17\x47\x75\x37\x5f\x03\x3f\x62\xfd\xa6\x6d" - "\x0d\x3e\xd3\xb6\xdd\xfe\xe2\x9b\x13\xb5\x3e\xa0\x7e\x2d\x1d\x32" - "\x20\xf2\xd1\xfb\xf9\xda\xb9\xeb\x51\xc7\x7d\xd3\xd4\xc9\xa9\x56" - "\xee\x05\x5c\x65\x5b\x6e\x79\x06\xb0\x27\xbe\xa3\xc6\x57\x60\xbf" - "\x42\xea\x44\x6e\xee\x80\x6c\x4d\xed\xde\x2c\xe5\xdc\xcc\xcd\x22" - "\x86\x06\xd1\xff\x7b\xec\xfa\x71\xf2\xc0\x37\x8b\x38\x4e\xae\x2b" - "\xb0\xde\xde\xf2\x18\x95\xff\x7f\xa8\x4f\x3e\x29\xd7\x65\xd6\xc8" - "\xb3\x93\x37\x57\x51\x1d\x35\xf4\x9c\x82\x7c\x47\x75\xb7\xc4\xab" - "\xef\x1b\x22\xde\x37\xc0\xf6\x54\x7d\x3f\x4b\x7d\xbf\x2b\xe2\xfd" - "\x2e\xc7\x15\xd0\x73\xdc\xb2\x18\x7d\x20\x38\x16\xd2\xfb\x6a\xe1" - "\x93\x00\x7d\x88\xcd\x2c\x54\xf3\x55\xf7\xe9\x6e\x59\xdb\x4f\xb8" - "\x45\xef\xeb\x22\xbe\xaf\xdb\x9f\x9b\xcc\x80\xa3\xfe\xe2\x5b\x4a" - "\x3c\xfa\x9a\x3e\x29\x1b\xdf\x5c\x2d\xfa\x4e\x6b\x66\x64\x79\x1e" - "\xdd\x2d\x8b\xb0\x2e\xfa\x88\x27\xa3\x3c\x79\xa8\x33\x12\xde\xda" - "\x09\x4e\xdb\xd2\x87\x96\xd8\xee\x5f\xb5\x76\x25\x4e\xe0\x8d\x3c" - "\x5b\x66\xc1\x19\x55\xa5\x6c\x6b\x89\xbb\x06\x67\xe6\x2c\xe2\x7c" - "\x76\x35\x8d\x63\xb0\x62\xbb\x2b\x14\xb7\x3d\x2d\x54\x51\xed\x28" - "\x38\xcb\xf4\xf9\x56\x7e\xc4\xb5\xe1\x56\x76\x4a\x37\xf7\x4a\x11" - "\x6f\xce\x26\xfc\xcc\xfb\x5c\x1b\xde\x42\x9a\x38\x1f\xee\xce\x94" - "\x69\x2f\xe5\xb7\xe8\xdf\xc8\xef\xd2\xb7\x66\x9e\x61\xfb\xad\x5e" - "\x76\xc0\x76\x06\xbe\x56\x7d\x2f\x29\x1d\x7a\xd8\xe2\x52\xfe\x2d" - "\xa8\x0b\xfa\x02\xdc\x4b\xdd\xc7\xdc\x58\xd4\x03\x3b\xc5\x3e\xdd" - "\xdc\x8b\x51\x9f\x47\x37\xd7\x12\x55\x27\x6c\xb7\x4d\x94\xaf\x4d" - "\x29\xdf\x5a\x22\xe6\x77\xf1\x2d\xae\xa0\xde\xf4\xb4\x7a\x26\x8f" - "\xd5\x4d\x86\x4d\xee\xdc\xa6\x88\x33\x6a\xa6\x7e\x3d\x9b\x4b\x69" - "\xad\x9a\x8f\x09\xc4\xe2\x19\x8b\x5e\x9c\x23\xb9\xf8\x5c\xdd\xbd" - "\xbb\x15\xd3\x56\x82\xef\xd6\x92\x16\x5a\x01\xcc\x22\x7e\xf0\x20" - "\xb5\xe5\x5b\x7b\x78\xec\xd6\xdc\x7c\xcc\x53\x82\xc5\xaf\x60\x33" - "\x18\xb7\xdd\xb5\x07\x36\x82\x15\xdb\xd3\x7e\x99\x13\xd0\xbf\xd7" - "\xda\xc4\x6c\xff\x0c\x9e\x2a\xe5\xe6\x3b\x96\xf2\xe0\xb5\x9d\x2e" - "\xd6\xda\xfd\x22\x3b\x78\xb8\x85\x99\x16\xb3\xa8\x02\x0f\x0f\x09" - "\xdd\x41\x36\xd3\xa7\x7a\x58\x14\x7c\x1b\xc1\x2f\x39\xe2\xe1\xb6" - "\x07\xda\x88\xcf\x29\x0b\x3e\x9b\xdf\x3b\xc1\x76\x37\x23\xfe\x48" - "\xee\x41\x8b\x33\x3f\x5e\x71\xa6\x3a\x16\xfa\xf0\x88\xb3\x3e\x49" - "\x1b\x4f\x32\x63\x5b\xd6\x9f\x58\x5e\x26\x57\x60\xd3\x97\x9a\x19" - "\xc5\xc5\x79\x9f\x5c\xca\xec\xa0\x31\x5d\x67\x8f\xdb\x9e\xc3\xe2" - "\xdb\xb3\x3d\xcc\xdd\xdb\xc2\x6a\x57\xb3\x78\xee\xcf\x8a\x6e\x6d" - "\x7d\x8f\xf1\xd2\x73\x29\xcf\xe7\xbb\x26\x68\xf6\x57\xe6\x22\x1d" - "\xf4\x9f\x71\x65\xb0\xc3\x1a\x60\xc9\x19\xc7\x0a\x85\xce\x16\xfa" - "\xf1\xa0\xdf\x6e\x1b\xf2\xdb\xbf\x3c\xe8\xb7\x5f\xa1\xe9\xd5\x7f" - "\xb8\xdc\xc2\x76\xe0\x9c\x50\xf1\x0d\x8b\x71\x4e\x08\xfc\x64\x30" - "\x3a\xb4\x00\x3a\x74\xe1\xab\x65\x9d\x3d\x41\xb9\xdf\xce\x66\x7a" - "\xc5\x39\x24\xe8\xf5\x2d\xf5\x3f\xa2\xf6\xf6\x9d\x61\x91\xb6\x44" - "\xe7\xd6\xd9\xf5\xb0\x23\xe2\xc5\x73\xbb\x07\x77\xdc\xbb\x1b\xf6" - "\x44\xb4\x0e\xcc\x1e\xff\xdc\xfe\x96\xb0\xb3\x46\xff\x69\x3c\x5c" - "\x7b\xce\x60\x7c\x68\x9c\xce\x78\xf5\x18\x8b\xb6\xa5\x18\x87\x8e" - "\x11\xe3\x20\xc6\x6d\x75\x40\x8f\xf1\xc0\x58\x60\x4c\xc2\xe3\xf1" - "\xa1\x18\x8f\x3d\x8a\x1c\x8f\x41\x5a\x07\xb4\x31\x39\x97\x70\x6f" - "\xd3\x85\xc6\x05\xe3\x81\xb1\x69\xed\xfe\x13\x1b\x31\x26\x5e\x39" - "\x26\x04\xcf\xc9\xda\xb8\x60\x4c\xdc\x7d\x1d\xd8\x37\x88\xbe\xfd" - "\x43\xc6\xee\xb8\x86\x2b\x6d\x0b\x0f\x0d\x8f\x4f\x70\xac\xf1\x39" - "\x1e\x1e\x1f\x1a\xfb\xcf\x8e\xcf\x49\x0b\xf6\x79\x30\x3e\x9e\xf1" - "\x8c\x4f\x6b\xb7\x1c\x9f\xa0\x3a\x3e\xd7\x2c\x60\xfa\x80\xdf\xae" - "\xdf\x96\xc3\x66\x2f\x3c\x66\x63\x6f\xa7\xb7\x31\x82\x75\xb6\x52" - "\xbe\xad\xe6\x8b\xcd\xa3\xf9\xbe\xcf\x3f\x8f\xe6\xfd\xe4\x7f\xe7" - "\xd1\x78\xe7\xd1\xbc\xa4\xbf\x6f\x1e\xcd\x77\xfd\xef\x3c\xfa\xaf" - "\x9a\x47\xf3\xf7\x9d\x3f\x8f\x86\xd7\xea\xd5\xcb\x1e\x5a\xb2\x7c" - "\xe5\xf2\x95\xff\x66\xfb\xd1\xfa\xec\x65\x6b\xe4\x8a\x3d\x62\xcd" - "\xb6\x86\xf2\x53\xf4\x88\x9d\xdc\x5a\xd3\xc1\x9e\x9f\xda\xa1\x0f" - "\x7d\x6c\x35\xf0\x32\x73\x95\x52\x66\xb1\x20\x8e\x32\xe6\x1b\xe2" - "\x2b\xf7\xe8\xee\x48\x86\x5f\x3e\xe9\x03\xe5\x0e\x61\x6f\x49\xbc" - "\xe1\x6c\xec\xb7\x6c\x1a\xa4\xdf\x06\x66\x30\x07\x98\xd1\x75\x05" - "\xde\xdf\x5e\x0e\x1f\x62\x7c\xc7\xe2\xd9\xf5\x88\x7b\x3c\xc8\x0c" - "\x3e\x53\x66\xca\x66\x2a\xcf\x1b\xbb\xb5\xc4\x60\xc3\xd9\x91\xef" - "\x24\x10\xcf\xd1\x35\xec\x5b\x48\x77\x7b\x1a\x9f\xf8\xed\x15\x98" - "\xeb\x38\xc7\x77\x4a\xf7\x9d\xef\x9d\x83\x4f\x74\xe2\x63\xef\xb9" - "\x86\xea\x9a\x76\x6f\x93\xf0\x9b\x40\xf3\x5e\xbe\x5f\x20\xfc\x9a" - "\x0d\x99\xaa\x45\xac\xd1\x7e\xd3\x76\x57\x7f\xd9\xf6\xb4\xf7\xf2" - "\x1a\x99\xed\x6e\xcc\xfb\xef\x6c\xbc\xbd\x86\xe6\x7d\x9a\x8b\xb5" - "\x59\x7f\xc9\x0e\xa6\x13\xbe\xa5\xff\xad\x79\x1f\x81\x67\x57\x7c" - "\xbe\x79\xaf\xe1\x17\xf0\x0a\xf8\x05\xdc\xba\x88\x70\x0b\xf8\xa6" - "\xe1\xd7\x13\x03\x12\xbf\xcc\x87\x99\x65\xfb\x19\xc2\xb1\xa0\xc4" - "\x31\x9c\x37\x6e\xcb\x3d\x34\xf6\xfc\x1f\x38\x0f\xbf\xf4\x2a\x7e" - "\xad\x23\xfc\x5a\x17\xc6\xaf\x7b\xff\x64\x61\xb5\x02\xbf\xae\x0f" - "\xe3\xd7\x96\xd0\x02\x0d\xb7\x80\x67\xc0\x29\xe5\xdf\xec\x0c\x73" - "\x5e\xc3\xb3\xfa\x07\xe4\x9e\xa9\x98\xff\x7a\x9a\xff\xfe\x88\x75" - "\x74\xda\xdf\x33\xff\x17\x88\xf9\x8f\x31\xc1\xf8\x60\x5c\x30\x16" - "\xff\x7f\x1c\x07\xc4\x99\xe5\xfe\xd1\xc6\x22\xb9\xf7\x6f\x8d\x05" - "\xc6\x01\xe3\x21\xc6\x81\xc6\x43\xdb\xbf\xc6\x7e\x26\xc6\x04\x63" - "\x31\x23\x8f\xe9\x31\x2e\xf5\x34\xe7\x31\xcf\x09\xb6\xfb\x30\x2e" - "\x82\x77\x75\xc6\xae\xac\x9e\x1c\x8e\xc5\xe2\x2f\xbe\xdd\xf1\x59" - "\xbe\xf5\xf6\xcd\xc3\xbe\xd1\x74\xdf\x11\x72\x99\x6b\xea\x4d\x34" - "\xdf\xbe\xad\xca\x2c\x5b\x67\xcb\xbd\xa8\x3b\x8e\xa8\x73\xda\x06" - "\xf9\x4f\xc8\x7a\x21\x92\xf5\x4c\x24\xeb\x95\x91\xac\x07\xdd\x9b" - "\xf0\x2d\x70\xbb\x3c\x2b\x0f\xd9\x2e\xb6\x3a\x9d\xe4\x8c\x05\x80" - "\x9f\xd8\x83\x8d\xdd\xd6\x20\x62\xa6\x97\x93\x1c\xf9\x73\x3d\xa3" - "\x67\xc2\xa1\xd0\x38\x71\xe7\xf6\xa0\xba\xc7\xec\x70\x6c\x80\xfd" - "\xc1\x1d\x32\x8e\x89\xee\xdb\x1f\x22\x5d\xec\xcf\xe9\x95\x86\xd0" - "\xa6\x91\xfb\x73\x91\xfb\xb7\xcf\xe7\x7b\xd5\xbd\xb9\x3b\x84\x8f" - "\x5f\xd0\x07\xd0\xb5\x67\xf3\x3b\xf4\xe1\xfd\xb9\x43\x78\xff\xf2" - "\xc8\xfd\xb9\x3b\x84\xbe\xd4\xa3\xbb\xc3\x03\x9b\x14\x7a\xae\x93" - "\xe9\xdf\xee\x8c\x4c\x0f\xef\x7f\xcb\x74\x9c\x81\x52\x65\xee\x3e" - "\x29\x6b\xdf\x11\xd0\x64\xda\x31\xf8\x9b\x71\xd0\xdd\xb4\x7d\x61" - "\xba\x9b\x26\xfd\x7c\x5b\x6b\xb3\xda\x3e\x43\x77\xe1\xa7\x2a\xed" - "\xb2\xbb\x40\x77\xcb\xaa\x33\x65\xfb\x16\xfe\x84\x60\x12\x85\x78" - "\x6a\x48\xc7\x59\x21\xd0\xdf\x1d\xf4\xdd\x0e\x41\x93\x6b\xd3\x37" - "\x8b\x7d\xf8\x85\xbb\x47\xd2\xe2\xd4\xc3\x23\x69\xf1\xc2\x3f\x5d" - "\x98\x16\xdf\x55\x74\x61\x5a\x7c\x67\xf4\xff\xd2\xe2\x2f\x4a\x8b" - "\x89\x17\xfb\xbb\x68\xf1\x5d\x0b\xff\x97\x16\xff\x67\xd1\xe2\xbb" - "\x16\x44\xd0\xe2\x1f\x8c\xa4\xc5\xa9\xc1\xcf\xd2\xe2\xff\xaf\xbd" - "\xaf\x01\x88\xaa\x4a\xfb\x3f\x73\x1d\x15\x95\x8f\xd1\xcc\xc8\x45" - "\x9b\xca\xda\xa9\xd5\xa4\xa2\x56\xcb\x8a\x5a\xdb\xa8\x55\x41\xd7" - "\x8a\x12\x0b\x0d\x0c\xcb\x8f\x11\x51\x49\x89\x0f\x23\x5f\x44\xc0" - "\x61\x40\x5f\xbe\x41\xc3\xc2\xcf\xc8\x75\xf7\x4f\xbb\xfa\x2e\xad" - "\xd6\x52\x22\x60\xaf\xed\x52\xe1\x36\x11\x19\x19\xda\xa4\xa3\x8c" - "\x30\x33\xf7\xff\x3c\xf7\xdc\xcb\xdc\x3b\xcc\xc0\xcc\x05\x3f\x5f" - "\xa9\xeb\xcc\x9c\x7b\xee\xb9\xe7\x3c\xcf\xef\xf9\x3d\xcf\x39\xe7" - "\xde\x73\xc2\x54\x76\x2e\x9e\xb6\xcf\xce\xc5\xd3\x16\x49\xb9\x78" - "\xe6\x62\xf7\xb8\x38\x6c\xe1\xc5\xe5\xe2\xb0\x34\x29\x17\xcf\x0c" - "\xe7\x79\x65\xba\xe7\x5c\x3c\x73\x72\xcf\x5c\x3c\xf3\x71\x29\x17" - "\xcf\x1c\x49\x39\x77\xe6\x22\xca\xc5\x33\x35\x34\x7d\xda\x34\x71" - "\xba\x9d\x8b\x69\x7a\x77\x2e\x9e\x99\xda\x0b\x17\x6b\xac\x36\x81" - "\x8b\x1b\x81\x8b\x1b\x19\xdb\xab\xae\xb8\xf8\xb9\x7d\x47\x90\x8b" - "\x63\x91\x8b\x9f\xdb\xd7\x33\x17\x3f\xb7\x05\x39\x17\xf0\x4a\x8a" - "\x36\xb3\xad\xb8\x8e\x62\xf5\x82\xaf\x70\x4c\xb7\x05\xf1\x79\x42" - "\xf1\xec\x85\x19\x09\x62\xae\x9e\x75\x6f\x17\x57\x43\xba\xed\x66" - "\x29\x57\x23\x4f\x23\x5f\x17\x6f\x66\x0d\x25\x9b\xd9\xa6\xf6\x75" - "\xb3\x22\x04\xce\xce\x84\x34\xdc\x1b\x03\xd7\xfc\x29\x3e\xcf\x1d" - "\x4a\x90\x41\xcb\x5b\x70\x5f\xbc\x06\xf2\xa6\x49\xf9\xfd\xd9\xfd" - "\x96\x75\x62\x7e\x9f\x75\x00\xf9\x3d\x83\xbe\x07\xcf\xf1\xba\xa5" - "\x78\x4e\x15\x72\x3d\x3d\x3f\x7b\x5e\xcf\xfc\x3e\xeb\xc7\xcb\xc5" - "\xef\xc8\x29\xc3\x44\x7d\x39\x57\xbc\x02\x6d\x33\x1d\x89\xba\x34" - "\xfc\x8e\x7c\x82\x3c\x82\xdc\x22\xf0\x3b\x72\x8b\x85\xef\x6b\x17" - "\xad\x15\xf1\xfb\x20\x11\xbf\x2b\xe4\xf0\xfb\xec\xf1\x57\x15\xbf" - "\xa3\x1e\x12\x2e\x2e\xbf\x0b\xfd\x6a\xd4\x03\xea\x04\x75\x21\xee" - "\x5b\xa3\x1e\x50\x1f\xa8\x07\x8c\x69\x04\x7e\x9f\x10\x4f\xf9\xbd" - "\xb8\x8b\xdf\x67\x6b\xba\xf8\x9d\xa1\xfc\x5e\x84\x6b\xb9\x71\x63" - "\xc4\xcf\x36\x75\xe7\xf7\x67\x8d\x76\x7e\x9f\x95\xcb\xf3\x5d\x0b" - "\xae\xd7\x00\xf6\xed\x2f\xe5\xf8\xe7\xa3\xdd\xe3\xf8\xe7\xa6\x77" - "\xe3\x78\x7e\x5f\x79\x9e\xdf\xcb\x90\xdf\x2d\xc8\xf3\xb2\x38\xfe" - "\xb9\x45\x76\x3f\x34\xd3\x4c\xb9\xf5\x39\x2f\x29\xef\x3f\x1f\xc6" - "\xfb\xa5\x2f\xc5\xbc\x6f\x1b\xe0\x0e\xef\x3f\x7f\xaf\xc0\xfb\xc8" - "\xab\xbb\x6d\x8d\x22\xde\x47\x9e\x7c\x7e\x72\xf5\xca\x66\x11\xef" - "\x3f\xef\x4d\xeb\xf0\x7c\x94\x95\xe3\xfd\xe7\xd5\xbc\x3f\x68\x14" - "\xa7\xdb\x79\x9f\xa6\x5b\xc5\xbc\xdf\x8a\xbc\xff\x7c\x42\x2f\xbc" - "\x1f\xe4\x3e\xef\xcf\x1d\x67\xe7\xfd\xb9\xe3\x7a\xe6\xfd\xb9\xc3" - "\x91\xf7\xb9\x75\x5f\x41\xf7\x80\x67\x65\xd6\x28\xca\xf9\x38\x26" - "\x02\xbe\xc0\x80\xeb\x84\x9c\x50\x44\x58\x4b\xd1\x2f\xc0\x01\xe7" - "\x5b\x33\xf0\xbb\x8d\xbb\xa6\xc9\xcf\x48\xbc\xd0\x07\x64\x9c\x20" - "\x4a\xdc\x63\x88\xca\x29\xe2\x05\xb8\xb6\xd1\xee\x2f\xc2\xe7\xb9" - "\xe9\x2f\x70\x4f\xf4\x86\xf6\x75\xe1\x19\x22\x7f\x81\xfb\x34\x35" - "\x38\xf8\x0b\x03\xf8\x8b\x16\xe1\x1a\xc8\xbf\x5f\x9c\x1f\xeb\xc7" - "\xe5\x3f\xc1\x1d\x98\xbf\xf1\x2d\xdc\x7b\x8c\xf3\x2f\xe1\xad\x52" - "\xff\x12\x11\x60\x93\xf4\x1f\x5e\x18\x23\xf8\x17\xf4\xcf\xb6\x6e" - "\xfe\xe5\xc5\x8f\xba\xfc\xcb\x28\x91\x7f\x89\x17\xfc\xcb\x0b\x4f" - "\x5f\xf1\xfd\x87\x3e\xf0\x9a\x5c\xff\x82\x9c\x86\x7c\xd6\x93\x7f" - "\xb1\x89\xfc\x8b\x4d\x96\x7f\x79\x31\xe3\xaa\xf2\x2f\x97\xa0\xff" - "\x20\xd6\x01\xea\x85\xf3\x2d\xa0\x1b\xd4\x03\xea\x00\xe5\x8f\x6b" - "\x4c\xa3\x6e\x50\x2f\xa8\x93\x09\x5a\xbb\x6f\xe1\xf4\xc2\xf9\x97" - "\x17\xd3\x1c\xfd\x4b\xc9\x08\xc1\xbf\x44\x4c\xe9\xee\x5f\x22\xec" - "\xeb\xdf\x2b\xc2\xb9\xf1\x1b\xba\xd6\x5f\x78\x88\xd4\xb7\xcc\xfd" - "\xc2\x3d\xdf\x12\xb1\xdd\x89\x6f\xe1\xd6\x69\xcc\xd8\x2c\xe9\x3b" - "\x94\x81\x7f\x91\xe1\x5b\x22\x6a\x68\x1d\xf1\x59\xe8\x70\x7f\xca" - "\xdf\x11\x51\x76\x7f\xf3\xbc\x51\x9c\x66\xf7\x37\x73\xab\x79\x1f" - "\x79\xd4\x73\x7f\x33\x77\x0b\xf7\xec\x01\xb4\x61\xf7\x19\xca\xe9" - "\x52\x7f\x33\x77\xbb\xd4\xdf\xcc\x4d\xa0\x75\x98\x7b\x8c\xfa\x9b" - "\xb9\x3a\xde\x0f\x35\x88\xd3\xed\xfe\x86\xa6\x77\xf7\x37\x73\xdb" - "\x7a\xf1\x37\xde\x9d\x01\x73\xaa\x3a\x33\x0a\xca\x2c\xe5\x11\xc1" - "\xe3\xc3\x1f\xb3\x3a\xda\x0d\xb5\x17\x2b\xdd\xaf\x46\x98\x7f\x7a" - "\x89\xce\x77\xd8\xf8\xf7\x89\x3b\x02\xe6\x54\x9c\x58\x04\xb6\xd3" - "\xe6\xda\x76\xc0\x6e\xbc\x04\xbb\x39\x12\xf3\x3d\x01\x5b\x62\x70" - "\x4e\xaa\x10\x6c\xa6\xde\xd4\xc8\xd9\x90\x77\x4b\x30\xc1\x75\x1c" - "\x7d\xda\x88\xca\x47\xa1\x18\x84\xf3\x1d\x56\xb0\x9f\x27\xef\x62" - "\x6d\xbf\x69\x0c\x26\x3e\x31\xc4\x17\x6d\x68\x0f\x3f\xef\x81\x6b" - "\x41\xe0\x7c\x07\xe0\x37\xf0\xe5\xa3\xf6\xf9\x8e\x0e\x37\xe6\x3b" - "\xea\xe3\x0d\xdc\x7c\x07\xbe\x1f\x65\x03\x3b\xe1\xde\xd9\xc1\xf9" - "\x0e\x33\x37\x47\xc4\xf1\x57\x29\x37\xdf\xd1\x4c\x70\xae\x43\x58" - "\x0b\x06\xe7\x38\x7e\x13\x4e\x18\x5c\x2b\xa2\x10\xec\xe6\x63\xcd" - "\x11\xce\x6e\x3c\xe7\xb0\x97\xc3\x7a\x7a\xc6\xc7\x02\x32\xb5\x7a" - "\x17\x94\xb1\x05\x85\xba\x9d\xcd\x66\x05\xae\x93\x69\x05\x1d\xd9" - "\x80\xab\x58\x2f\x07\xae\xea\xe4\xe5\xdd\x49\xe5\x0d\xba\xf2\x7a" - "\xc9\x44\x58\x48\xa7\xeb\x64\x9a\x0d\x80\x35\xcd\x88\xe2\xd5\x28" - "\xdb\x40\x52\xcc\xaf\x95\x69\x5b\x13\x33\xc4\x06\xf2\xc4\xf7\x22" - "\x76\x9f\x37\x0f\xb4\x7a\xb5\x87\x64\x74\x90\xf1\xc0\x4b\x3e\xc8" - "\x4b\x80\xcf\xa1\xa5\x1d\x20\xdb\x6f\xa9\x6c\x71\xcd\x36\xfc\xb4" - "\xac\xd1\xa8\xa1\xec\xdb\x3a\x3b\x41\xbe\x66\x2a\xdf\x97\x96\xa9" - "\x48\x89\x30\xdf\x07\xbe\xbe\x0e\x74\xca\xf1\x92\xc9\x8f\xc5\xbd" - "\x24\xac\x9d\x9a\x00\xdb\x0f\x20\x5f\x13\xee\x1b\xa2\x41\xfd\xab" - "\x4a\x4e\xe0\xfc\xe4\x57\x74\xbe\x6f\x08\xbf\x06\xc7\x1a\xf0\x11" - "\x0b\xd5\xa4\xbe\x02\x38\x7a\xd0\x4b\xa4\xb3\x78\x4e\x05\xd7\x07" - "\x49\xf0\x54\xbe\x91\x2e\xf7\xff\xb9\xb8\xf2\x55\x5f\x45\xf2\x7d" - "\x39\x4f\xbe\x7c\xe7\xab\x2e\x8f\x7c\x55\x57\x91\x7c\x23\xcd\xf2" - "\xe5\xfb\x8a\xcb\xe7\x1f\x51\xbe\xd8\x4f\x10\xfa\x08\x42\xff\x00" - "\xfd\x0a\xf5\xa1\xd1\xad\xf6\xbe\x41\x74\xab\x30\x2f\x0a\xb2\x51" - "\x66\xe2\x9a\xcf\xd0\x66\xed\x02\xdc\x4b\x21\x7a\xae\x30\x27\xaa" - "\xc3\xfd\x42\x50\x57\x05\xa0\xab\x25\xf8\xfe\x0b\xaf\x27\xf0\x03" - "\x2f\x9b\x80\xab\xc7\xcc\xa9\xb2\x66\x82\x9f\xd8\x16\x11\xec\x42" - "\x67\x0c\x72\xbc\x4f\x1c\x51\xbd\xa4\xa5\xba\xb3\xad\x01\x9d\x75" - "\x40\x4c\x64\x6e\x25\xf8\x3e\xab\x5f\x2b\xf0\x6a\x67\xcc\x90\x08" - "\x88\xb1\x05\xbd\xed\x59\x69\xe6\xe2\x21\xa7\x7a\xcb\x97\xea\xed" - "\xac\x13\xbd\xd9\x9f\x33\x80\xd8\x94\xd3\x9b\x81\xd3\x1b\xc7\xeb" - "\x6b\x20\x36\x05\xfd\x09\x7a\xe3\x78\x1d\x74\xc7\xe9\xad\xad\x99" - "\x8b\x81\x04\x5e\xc7\xf8\x07\x75\x57\x1b\x09\xf1\xdc\xba\xf9\xe1" - "\x9c\xde\x70\x6c\x3b\xd2\x53\xbd\x45\x6b\xa4\x71\xcf\x82\x4d\xee" - "\xc5\x3d\xd1\xdb\x30\xae\x11\xc7\x3d\xf8\xfb\x2c\xc4\x39\x56\x9f" - "\xfc\x72\x93\xac\x7e\x74\xf4\x3e\x69\x0c\xb3\x20\x99\xd6\xe9\x95" - "\x53\x9e\xc7\x30\x0b\xb8\xf1\xb6\xdd\x05\xce\xe2\x97\x05\x0b\xa5" - "\xf1\xcb\x82\x29\x34\x4e\x59\x90\x7b\x76\x2d\xc6\x2f\x0b\xc2\x68" - "\xfa\x2b\x6d\xe2\x74\x7b\xfc\x42\xd3\xb9\xbd\xc8\xd7\x2d\x28\xf3" - "\x2c\x66\x99\x78\x99\x63\x96\xc0\x1e\x62\x96\xc0\x6b\x2c\x66\x89" - "\x51\x5e\xf7\xa9\xbd\x71\xfe\x82\x7d\xf2\x39\x7f\x61\xd4\x75\x9f" - "\xda\x9b\x7c\x63\xa6\xc9\x97\xef\x6b\x2e\x9f\xff\xef\xdd\xa7\x2e" - "\x9e\x62\xf7\xa9\x8b\xa7\xb8\xf6\xa9\x8b\x3e\xb8\xee\x53\x9d\xf9" - "\xd4\x85\xbb\xe4\xfb\xd4\x45\x09\x52\x9f\xba\xf8\x47\xf7\x7c\xea" - "\xa2\x0b\xfd\xef\x53\x17\x3b\x8c\x43\x2f\x3e\x46\xeb\xf4\xfa\xe3" - "\x9e\xfb\xd4\xc5\x7f\x76\xed\x53\x17\x1f\x90\xfa\xd4\xc5\x3a\xea" - "\x3b\x17\xb7\x52\x9f\xba\xb8\x9c\xa6\xbf\x1e\x2c\x4e\xb7\xfb\x54" - "\x9a\x4e\x7d\xea\x62\x93\x67\x3e\xf5\x96\xcb\xec\x53\xd5\x3d\xf8" - "\x54\xf5\x35\xe6\x53\x97\xba\xdc\xff\xe9\x3a\xe7\x0b\x9c\xbf\xc4" - "\x4b\x3e\xe7\x6b\xab\xe4\x73\xfe\xf2\x40\x3b\xe7\x2f\x0f\x74\xcd" - "\xf9\xb1\xdb\xae\x73\xbe\x33\xce\x5f\x5a\x26\x9f\xf3\x63\xb5\x52" - "\xce\x5f\x7e\xdc\x3d\xce\x8f\x3d\xd5\xff\x9c\x1f\xeb\xf0\xfc\xdf" - "\xf2\x1a\x5a\xa7\x65\x0f\x78\xce\xf9\xcb\xb7\xbb\xe6\xfc\xe5\x1f" - "\x48\x39\x7f\x79\x2a\xe5\xf6\xe5\x4d\x94\xf3\x97\xe7\xd1\xf4\x65" - "\x41\xe2\x74\x3b\xe7\xd3\x74\xca\xf9\xcb\x5b\x3d\xe3\x7c\xbf\xcb" - "\xcc\xf9\xaa\x1e\x38\x5f\x75\x8d\x71\xfe\x0a\x97\xeb\x9f\xf5\xce" - "\x49\xab\x0e\xd9\x39\x69\xd5\x21\xd7\x9c\xb4\x6a\xf2\x75\x4e\x72" - "\xc6\x49\xcb\x2d\xf2\x39\x69\x95\x52\xca\x49\xf1\xcb\xdc\xe3\xa4" - "\x55\x29\xfd\xcf\x49\xab\x74\x52\x4e\x8a\x8f\xa0\x75\x5a\xf1\xa9" - "\xe7\x9c\x14\xff\x88\x6b\x4e\x8a\x7f\x52\xca\x49\xf1\xfc\x9c\x59" - "\xbc\x96\x72\x52\xfc\x78\x9a\xbe\xa2\x46\x9c\x6e\xe7\x24\x9a\x4e" - "\x39\x29\xbe\xb7\xe7\x1f\x38\xec\x1f\xf1\x77\xc0\xfe\xeb\x02\xf6" - "\x57\x1f\x3b\x5c\x24\x60\x7f\x35\x7d\xce\xb9\x28\x62\xd2\x86\x95" - "\x44\x99\x81\xfb\x98\x80\xbd\x6b\x5f\x44\xec\xaf\x7e\x1a\x9f\x3f" - "\xf0\x6e\x02\x0e\x6b\xe1\x39\x2d\x1e\x38\xad\x05\x7e\xe3\xfa\x56" - "\x63\x22\x26\x21\x17\xe1\xbe\x07\xf8\x9b\x72\x9b\x71\x20\xbe\xbb" - "\xe9\xd1\x7b\x55\x2d\xfc\x7b\x55\x51\xdd\xdf\xab\x2a\x12\xbd\xbf" - "\x83\xb6\xe1\x93\xa2\xf0\xc5\xb9\x60\xe0\x37\x9e\xc7\x6a\x06\x5a" - "\xbc\x78\x1e\x3b\x0f\x3c\x76\xde\x6e\x13\xc8\x63\x67\x81\xc7\x4c" - "\xab\x34\x63\x91\xcb\xba\xbf\x53\x45\xe7\x7e\x39\x1e\x5b\xef\xc0" - "\x63\xaf\x3a\xf0\xd8\x02\xe0\xb1\x48\xe0\xb1\x21\x76\x7b\xb8\xbd" - "\x89\x30\xd3\xe6\x81\x4d\x00\x8f\xe5\x9c\x47\x1e\xfb\x58\x26\x8f" - "\xad\x1e\x29\xb5\x87\x35\x29\xee\xd9\xc3\xea\x6c\x57\xf6\xd0\x99" - "\x29\xd7\x1e\x56\x97\x49\xed\x61\xcd\x22\xde\x46\x3f\xf6\xdc\x1e" - "\xd6\x4c\xef\xb2\x87\xd7\x1d\xed\x61\xcd\xb3\x52\x7b\x58\xa3\xa1" - "\xb8\x5f\x93\x4c\xed\x61\xcd\x14\xde\x4e\x0e\x89\xd3\xed\xf6\x40" - "\xd3\xa9\x3d\xac\xc9\xb8\x3e\x3f\x7b\xa5\xfa\xe8\x04\xe3\xf5\xf9" - "\xd9\xde\xfa\x65\x6b\xca\xe4\xf7\xcb\x12\x2f\xd3\xfc\xf7\xd5\x34" - "\x96\xfc\xe6\x24\xf9\xf2\x4d\xba\x4c\xf3\xdf\x57\xd3\xb8\x42\x62" - "\x1f\xe6\xbf\x53\x7a\x9c\xff\xee\x39\x8e\x79\xab\xac\xb6\x2b\x86" - "\x7f\xab\x4c\x78\x76\xb3\x7b\x0c\xff\xd6\x8d\xd2\x77\xa7\x52\x3e" - "\x72\x7c\x77\xaa\xb7\xd8\xde\xf2\x7f\x2a\xb6\x4f\x32\xcb\x8f\xed" - "\xd7\x1a\xa4\xb1\x4c\xea\x74\xf7\x62\x99\xb7\xe6\xba\x8a\x65\x2c" - "\xb2\x63\xfb\xb7\x16\x49\x63\x99\x54\xbe\x4e\x29\x99\x9e\xc7\x32" - "\xa9\x37\xbb\x8e\x65\x52\x6f\x95\xc6\x32\x6f\x99\x68\xcc\x92\x3a" - "\x8d\xc6\x32\xa9\x7c\x7a\x4a\x86\x38\xdd\x1e\xcb\xd0\x74\x1a\xcb" - "\xa4\x86\x5f\x9f\xb7\xbd\x52\x63\x99\xb7\x5d\xae\xff\x76\xdd\xd7" - "\x0a\xbe\x20\x75\x91\x7c\x5f\xf0\x5f\x2e\xd7\x3f\xbb\xee\x6b\x05" - "\xf9\xae\x53\xca\x97\x6f\x5a\x82\x7c\x5f\xbb\xc1\xdb\xee\x6b\x37" - "\x78\xbb\xf6\xb5\xe9\x29\x52\x5f\xbb\x7e\xc2\x75\x5f\xdb\x93\xaf" - "\xfd\xaf\x28\xf9\xbe\x36\x7d\x9a\xd4\xd7\x6e\xf8\xd0\x3d\x5f\x9b" - "\xfe\x69\xff\xfb\xda\xf4\x46\xa9\xaf\xdd\x50\x4e\xeb\x94\x76\xc1" - "\x73\x5f\xbb\xe1\x6d\xd7\xbe\x76\x43\xa6\xd4\xd7\x6e\x88\xa4\x3e" - "\x75\x43\x15\xf5\xb5\x1b\xe2\x68\x7a\x9a\x59\x9c\x6e\xf7\xb5\x34" - "\x9d\xfa\xda\x0d\x87\xae\xcf\xe7\x5e\xa9\xbe\x36\x53\x73\xdd\x17" - "\xf4\xe6\x0b\x36\x34\xca\xf7\x05\x59\x69\xf2\x7d\x41\xb6\xbf\xdd" - "\x17\x64\xfb\xbb\xf6\x05\xba\x4c\xa9\x2f\xd8\x38\xf9\xba\x2f\xe8" - "\xc9\x17\x64\x6a\xe5\xfb\x02\x5d\xb8\xd4\x17\x64\x7f\xec\x9e\x2f" - "\xd0\x7d\xd1\xff\xbe\x40\xd7\x22\xf5\x05\xd9\x95\xbc\xfe\x07\x7a" - "\xee\x0b\xb2\xb3\x5d\xfb\x82\xec\x7c\xa9\x2f\xc8\x5e\x44\x39\x3f" - "\xfb\x10\xf5\x05\xd9\xc9\x34\x7d\xa3\x52\x9c\x6e\xf7\x05\x34\x9d" - "\xfa\x82\xec\x86\xeb\xf3\xbc\x57\xaa\x2f\xc8\x09\x92\xcf\x55\x9b" - "\x0e\xd9\xb9\x6a\xd3\x21\xd7\x5c\xb5\x69\xb2\x94\xab\x72\xbe\xbf" - "\xce\x55\x3d\x71\x55\x76\x8b\x7c\xae\xda\xe4\x30\xff\xbb\xd9\xcd" - "\xf9\xdf\x4d\x2e\xe7\x7f\xe5\x73\xd5\x26\x87\xf9\xdf\xcd\xfc\xfc" - "\x6f\xce\x07\x9e\x73\xd5\xe6\x47\x5c\x73\xd5\x66\x87\xf9\xdf\xcd" - "\xfc\xfc\xef\x66\x7e\xfe\x77\x33\x3f\xff\x9b\x53\x29\x4e\xb7\x73" - "\x15\x4d\xa7\x5c\xb5\xb9\x8f\xf3\xbf\x79\x6d\xf6\xf9\xdf\x3c\xee" - "\x9d\x01\x5b\x5e\x61\x4c\xf7\xf9\xdf\xbc\x79\xd2\x75\x4c\x36\x5b" - "\xb9\xb9\x60\xb4\x0b\x13\x7d\x37\xdd\xe9\xbc\xf0\xcd\x85\x31\xd7" - "\xe7\x85\xfb\x63\x5e\x38\x6f\xbc\xd4\x4e\xf2\xf3\xdd\xb3\x93\xbc" - "\xed\xfd\x3f\x2f\x9c\x57\x25\xb5\x93\xfc\x54\x1e\x13\x32\xe6\x85" - "\xf3\xa3\x5d\xdb\x49\xfe\x62\xa9\x9d\xe4\xf3\xcf\xe5\xe6\xe7\x51" - "\x3b\xc9\x9f\xcd\xdb\xcf\x21\x71\xba\xdd\x4e\x36\x8b\xe6\x85\xf3" - "\xcb\xdd\xf1\xe9\x16\xef\x82\x72\xf4\xd1\xe3\x1b\x1f\xb3\x76\xe1" - "\x39\x8e\xc7\xb3\x33\x9f\x3e\x9f\x72\x3f\xe2\xb8\xb3\x3c\x62\x6a" - "\xaf\x3e\xbd\x85\xf7\xe9\x51\xdd\x7d\xba\xe0\xcf\x11\xcf\x85\x6e" - "\xcd\x09\x3b\xe0\xda\x23\x7f\x7e\xbf\xa1\x2f\xb8\x46\x4c\x4b\xfd" - "\xb9\x5c\x5c\x17\x5e\xa6\xf7\x5f\xae\xa6\x39\xe1\xfc\x2a\xf9\x7d" - "\xbb\xa2\xcb\xf4\xfe\xcb\xd5\x34\x4e\x5d\xd8\x87\xf7\x5f\x8a\x7b" - "\x7c\xff\xe5\xfa\xd8\x04\xca\xb7\x68\x97\x7c\xf9\x96\x8e\x93\x1f" - "\xef\x6f\x39\x66\x8f\xf7\xb7\x1c\x13\x62\x1b\xe4\x42\x6e\xdd\x1d" - "\xe0\xbf\xcc\x58\x38\xce\x13\xb2\x21\x96\x5b\x77\xdc\xab\xbe\xe5" - "\x0b\xdc\x1b\x09\xe2\x9d\x2d\x4f\x87\xc6\x8b\xe3\x9d\xd2\x1f\x85" - "\x58\x27\x14\xe3\x20\x88\x6b\x30\xa6\x11\x62\x7c\xdd\x99\x5e\x9e" - "\x07\xbd\x23\x62\x2a\xf6\x09\x3a\x7d\x0a\xca\xaf\xfd\xfe\x40\x89" - "\xb7\xfc\xfe\xc0\x16\x87\xe7\xdf\xb6\xba\xf9\xfc\xdb\x16\x97\xcf" - "\xbf\xc9\xef\x0f\x6c\x71\x78\xfe\x6d\x2b\xff\xfc\x5b\xe9\x16\xcf" - "\xe3\x9c\xad\x3d\x3c\xff\xb6\xd5\xe1\xf9\xb7\xad\xfc\xf3\x6f\x5b" - "\xf9\xe7\xdf\xb6\xf2\xcf\xbf\x95\x96\x89\xd3\xed\x71\x0e\x4d\xa7" - "\x71\xce\x56\xb7\x9e\x7f\x83\x38\xa7\xa2\x0f\x71\x4e\xef\x63\x17" - "\x57\x4c\x9c\x13\x74\x85\xc4\x39\xef\xb4\xb9\xe1\x27\xca\x1d\xfc" - "\xc4\xd4\xff\x5b\x7e\x62\x6b\x1f\x9e\x7d\xdb\xd6\xe3\xf3\xff\x9c" - "\x7c\x33\x44\xf2\x45\x8e\xe6\x65\x6b\x1d\x17\x31\x55\x96\x7c\x81" - "\x9b\x8b\x13\xaf\x16\xd9\x96\x07\xc9\x97\xed\xbb\x15\xd7\x63\x9c" - "\xde\xe4\xbb\x2d\x57\xbe\x7c\x2b\x5c\xee\xff\xdd\x7b\x8c\xb3\xa3" - "\xf1\x70\x57\x8c\xb3\xa3\xd1\x31\xc6\xc1\x98\x66\xba\x99\xc6\x3a" - "\x1b\x20\x46\x49\x5f\x02\xf1\xce\x4a\x42\xea\x5b\x0e\x90\x0c\x88" - "\x79\xd2\x4f\x43\xdc\xb3\x08\xe2\x1e\xcb\x36\x3e\xee\xd9\x31\x5d" - "\x1a\xf7\x54\x7c\xeb\x34\xee\xf1\xb1\xc7\x3d\x16\x88\x69\x3a\xb7" - "\x45\x4c\xd5\x9d\x16\xc5\x40\xaf\x75\x8f\x81\x3a\x32\xc1\xe7\xdc" - "\x11\x11\xd2\x09\x71\x50\x4f\x31\x10\xa7\x7b\x87\x38\xe8\xea\x8b" - "\x81\xde\x35\xca\x8f\x81\x76\x38\xac\x21\xba\xf3\x6d\xf7\x62\xa0" - "\x1d\x9b\x5c\x8e\xf5\xc8\x8e\x81\x76\x94\x4b\x63\xa0\x9d\x5a\x1e" - "\x17\x6f\x7b\x1e\x03\xed\x9c\xe9\x3a\x06\xda\xf9\x82\x34\x06\xda" - "\x39\x9e\xc6\x3a\x3b\x53\x69\x0c\xb4\x33\x98\xa6\x57\xa4\x8a\xd3" - "\xed\x31\x10\x4d\xa7\x31\xd0\x4e\x9d\x9b\xf3\x37\xe5\x16\xf0\xb1" - "\x97\xff\xb9\xb9\x9e\xe6\x6f\xfa\xeb\xb9\xb9\xfb\xaf\x90\xf9\x9b" - "\x5d\xa6\xeb\x7e\xba\x27\x3f\xb2\xb3\x5c\xbe\x1f\xd9\x73\x99\x9e" - "\xff\xbf\x9a\xfc\xf4\xee\x29\xf2\xe5\xfb\x7e\x8f\xcf\xff\xf7\xec" - "\xa7\xf7\x46\xda\xc7\x22\xf6\x46\x7a\x36\x16\xf1\xc1\x17\x52\x9f" - "\x5c\xb9\xe2\xfa\x58\x84\xbb\x7e\x78\x4f\x9e\x7c\x3f\xfc\x41\x99" - "\xd4\x0f\xff\xc9\xc7\x3d\x3f\xbc\x77\x4c\xff\x8f\x45\xec\x1d\x2f" - "\xf5\xc3\x7b\xcd\x3c\x16\x26\x78\xee\x87\xf7\x7e\xe9\xda\x0f\xef" - "\xfd\x56\xea\x87\xf7\xee\xa3\xfe\xf6\x4f\xde\xd4\x0f\xef\xad\xa1" - "\xe9\x95\xe3\xc5\xe9\x76\x3f\x4c\xd3\xa9\x1f\xfe\x93\xbf\x67\x73" - "\x2e\xb7\x5c\xa1\x73\x2e\xea\x6b\x6c\xce\x65\x5f\xfc\x75\x3f\xd1" - "\x9b\x9f\xf8\xd3\x78\xf9\x7e\xe2\xcf\x8d\xf2\xfd\x44\x55\x9a\xdd" - "\x4f\x54\xa5\x79\xe6\x27\xfe\x9f\x55\xea\x27\xfe\x52\x7c\xdd\x4f" - "\xb8\xeb\x27\xf6\x55\xcb\xf7\x13\xff\xaf\x46\xea\x27\x3e\x7c\xc0" - "\x3d\x3f\x51\xf5\x64\xff\xfb\x89\xaa\xd9\x52\x3f\xf1\xa1\x9a\xc7" - "\xc2\xb3\x9e\xfb\x89\x0f\x15\xae\xfd\xc4\x87\x43\xa4\x7e\xa2\xaa" - "\x89\xfa\x83\x0f\x83\xa8\x9f\xa8\x32\xd2\xf4\xbf\xcc\x16\xa7\xdb" - "\xfd\x04\x4d\xa7\x7e\xe2\xc3\xe0\xeb\xcf\xdb\x5d\xa9\xcf\xdb\xfd" - "\xb5\x5c\x3e\x97\x1d\x08\xb2\x73\xd9\x81\x20\xd7\xcf\xdb\xed\xdf" - "\x2e\x7d\xde\xee\x6f\xcf\x5e\x7f\xde\xae\x27\xae\xfa\x70\xb6\x7c" - "\xae\xda\x1f\x27\xe5\xaa\x03\x6e\xee\x07\xb9\xff\x97\xfe\xe7\xaa" - "\x03\x44\xca\x55\x07\xf8\x3d\x20\xff\x76\xab\xe7\x5c\x75\x60\xb7" - "\x6b\xae\x3a\xf0\x67\x29\x57\x1d\xe0\xf7\x7f\x3c\x60\xa0\x5c\x75" - "\x80\xdf\xff\xf1\x6f\x6a\x71\xba\x9d\xab\x68\x3a\xe5\xaa\x03\x6e" - "\xad\xff\x6f\x9f\x5f\x93\x15\xd3\x5e\x82\xf9\xb5\xfe\x8a\x69\xaf" - "\x94\xf9\xb5\xbf\x5f\x9f\xff\xe9\x31\x9e\xfd\x9f\x3e\xac\xfb\x5f" - "\xdd\xe3\xfc\x4f\xcf\x3e\xe0\xa0\xd6\xee\x03\x0e\x6a\x5d\xcd\x4f" - "\xa4\x03\x86\x32\x20\x1e\x5d\x7f\x9a\x28\x37\xe0\xfc\xc4\xb1\x23" - "\x24\x13\xe7\x27\x96\x08\xf3\x13\xc5\x7c\x8c\xfb\x8f\xef\xa5\x31" - "\xee\x47\x29\xce\x62\x5c\x8c\x6d\xad\x10\xb7\x5a\x1c\xe7\x25\x5e" - "\x74\xee\x3b\x3a\x7c\x0a\x2a\x2e\x6c\x8b\x08\xf1\xc4\x77\x14\xae" - "\xa6\xbe\xa3\xe0\xaa\xf2\x1d\x7f\xcf\x95\xef\x3b\xfe\x51\x29\xf5" - "\x1d\x87\xc6\xb8\xe7\x3b\x0e\x4e\xe8\x7f\xdf\x71\x70\x8a\xd4\x77" - "\x1c\xf2\xe2\xf1\x70\x87\xe7\xbe\xe3\xe0\x8f\xae\x7d\xc7\xc1\x5f" - "\xa4\xbe\xe3\x20\xff\xac\xe9\xa1\x00\xea\x3b\x0e\x36\xd2\xf4\x8f" - "\xc6\x89\xd3\xed\xbe\x83\xa6\x53\xdf\x71\x48\xe3\xd9\x78\x88\xdf" - "\x15\x3a\x1e\xa2\xba\xc6\xc6\x43\x3e\xee\xc3\xfb\x6f\x35\x81\xb5" - "\x5d\xcf\xcf\xd7\x04\x76\xeb\xaf\xaf\x84\x58\xf7\x0c\x9d\x73\xed" - "\xea\xaf\x1b\x8e\xf3\x5c\xf6\xcf\x6d\x52\x2e\xfb\x64\xba\x2b\x2e" - "\xeb\x69\x5e\x15\xfb\xe7\x56\xe0\x39\xdc\x6b\x4d\xd6\xbc\xea\xca" - "\xab\x89\xbf\x0e\x4d\x91\xcf\x5f\xff\x74\x58\xff\xb4\xc6\xcd\xf5" - "\x4f\xff\xe9\x72\xfd\x53\x8b\xec\x67\xe8\xff\xe9\xb0\xfe\x69\x0d" - "\xbf\xfe\xe9\x27\x32\xde\x8b\xab\xd9\xee\x9a\xbf\x6a\x1c\xd6\x3f" - "\xad\xe1\xe7\x4f\x6b\xf8\xf5\x4f\x6b\xf8\xf5\x4f\x3f\x51\x8a\xd3" - "\xed\xfc\xf5\x89\xe8\xbd\xb8\x9a\x1e\xd7\x3f\x65\x33\x22\x2b\x74" - "\x8c\xad\x12\x0e\xc4\xe1\xcd\x80\x81\x6a\xf8\x5e\x03\x7a\x1c\x01" - "\xdf\x1b\x5c\xd9\x98\xd1\x27\xb2\xc2\xb6\x16\xea\xcc\x10\x45\xbd" - "\xf1\xe7\xea\xea\xd1\x16\xb8\xef\xa7\x31\x54\x57\x91\x15\x7e\x96" - "\xc1\x21\x36\x36\x86\x80\x5e\x2a\xb8\xfd\xf1\x20\xbf\x2f\x60\x46" - "\xbd\x92\xf8\x9e\x56\x7c\x9a\x26\xe4\x83\xfa\xfa\x36\x2b\x3e\x7d" - "\x12\xcb\x68\x5f\xf7\x69\x2e\xb4\xc5\xe4\xb2\xae\x50\x56\xe8\xf6" - "\xb1\xe4\x4d\x0b\xfb\x43\xf5\x92\x33\xa4\x45\xf1\xe9\x71\xbf\xb6" - "\xc1\x21\x6c\x52\x38\xc1\x18\xab\x72\xb4\x51\x89\x65\x56\x2f\xe9" - "\xc0\x73\xd5\x78\xce\x0a\x75\x4c\x5c\x4c\x98\xac\x33\x83\xbd\x80" - "\x0b\x06\x26\x99\xd8\xd6\xa5\x16\xa8\x73\xbc\x85\xfc\x7d\x6c\xa3" - "\xf2\xfd\x02\x48\xb3\x12\x7f\xdc\x13\x0f\xcb\x80\x18\x13\xeb\xf3" - "\x6d\x09\xe4\x77\x56\x87\xb7\xf7\x90\xf1\x03\xef\x62\x0d\x9e\xe1" - "\xe6\x33\x97\xef\xbf\xf9\xa5\x8c\x25\xd5\x77\x83\xec\xd4\x84\x71" - "\x76\xde\xc3\xfb\x14\xf5\xc0\x89\x5e\xb8\x9f\x66\x52\x3e\x61\x36" - "\xda\x06\x7b\x1d\x4c\xe0\xf6\xb3\x34\xb6\xaf\x3b\x0c\xd7\x3d\xc0" - "\xed\x0f\x89\x7b\xa6\xe1\x9e\xab\x80\x1b\x02\xe9\xea\x8f\xe2\x09" - "\x71\xd4\x45\x6c\xd4\xe2\x79\xea\xb8\x85\x8b\xa3\x97\xae\x88\x53" - "\xdf\x11\x35\x94\xcc\x5e\xba\x54\xbd\x78\xde\x92\x37\xd4\xe2\x33" - "\x0f\xa9\xa3\x16\x2e\x9f\x37\x7f\x51\xf4\x84\xc5\xaf\x68\x87\x62" - "\x87\x51\x54\x8f\x91\x58\x17\xdb\xba\xc3\xe3\x4b\xf4\x84\xe4\x8c" - "\x20\x4a\xac\x17\xdc\x4f\x27\xec\xa9\x97\xb5\x99\x35\x31\x90\x27" - "\x09\x38\x70\x63\xe2\x60\xc8\xfb\x59\x51\x29\xd4\xab\x04\xea\x0d" - "\x75\xc4\x3a\xef\x17\xea\x2c\x60\x22\x09\x31\x91\x78\x06\x30\x78" - "\xf8\xb8\x9f\x79\xf0\x53\x2c\x1b\x8e\xed\x33\x81\x9d\x28\x4e\x28" - "\x6a\x27\xa0\x5f\x02\x0e\xa8\x80\x6b\xcd\x02\xc6\xf0\x5a\x36\x2b" - "\x52\xdb\x8e\x76\xc2\xc6\x3c\x4a\x6d\xaa\xb6\xe1\x59\x8d\x82\xd0" - "\x3d\xfd\x6a\xc7\xd9\xf7\xf4\xab\xe5\x6c\x01\xea\xd1\x06\xe9\x53" - "\x0c\x8a\xc1\x3a\x4c\xc7\xbd\x25\x71\xaf\x57\xac\x33\xb4\x0b\xfc" - "\x22\x5b\xcd\xae\xe5\xb1\x9f\xb6\xd7\x68\x4b\xfb\x5f\xff\x7a\xe5" - "\x79\x12\x6a\x61\x3b\xd9\xf5\x7b\x8d\x75\x26\x13\xf1\x4b\xd1\xbe" - "\xc2\x0e\x3a\xfc\x88\x9f\x65\x61\x34\xee\x49\x6e\x5b\xff\xbf\xfe" - "\xec\xfa\xda\xca\x67\xef\x22\x2a\x28\x3b\x4f\xb4\xb7\xa0\xd2\x33" - "\xfd\xd7\x72\xfa\x47\x3d\x42\x7d\x78\x3d\xd6\xb6\x7e\x14\xd7\x5d" - "\x8f\x5d\xf8\xdb\x6e\x23\x1f\x03\x16\x58\x6f\x9d\x31\xd4\x4a\xe5" - "\x88\xb6\x7b\x36\x29\x86\x4c\xe4\x64\x77\xa4\xcc\x96\xa5\x6b\xb0" - "\x65\x64\x03\x57\xe8\x4c\x20\xb3\xb4\xac\x95\x44\xfd\xb2\x55\x45" - "\x32\xcf\x93\x40\x63\xa6\xce\xe8\xa3\x48\x56\x40\x6c\xc1\x80\xdf" - "\x08\x04\xce\x08\xe4\xed\x3d\x0d\xe5\xf8\xcf\x36\x42\x66\x2c\x27" - "\xe4\x87\x29\x64\x40\x09\x5c\xe7\x59\x7b\x8e\xd0\xf5\x9f\xd6\x1d" - "\x19\x57\x0a\xd7\xe2\xde\x90\x1e\x5e\xbf\xcb\xa5\xdd\x75\xb5\x3b" - "\x5b\xeb\xbc\xdd\x75\x79\xb6\xac\xec\x30\x68\x77\x1a\x9b\x91\x1d" - "\xd7\xbd\xdd\xd9\x5a\xda\xee\x81\x67\xfa\xbf\xdd\x75\x74\xcf\xc5" - "\x75\x75\x01\xf2\xda\x5d\xe7\x72\xfc\x4f\xd4\x6e\x17\xfa\xae\xd7" - "\x41\xbb\x41\xdf\x7a\xd0\x77\xb6\x13\x7d\x67\xf3\xfa\x1e\xd6\xdc" - "\xff\xed\xae\x8f\xa0\xed\xae\x1f\x29\xaf\xdd\xf5\x2e\xf9\xcf\xde" - "\x6e\xbd\x0b\x7d\x37\xa4\xd9\xb2\xf4\xa0\x6f\x3d\xe8\x5b\xef\x44" - "\xdf\x7a\x5e\xdf\xc3\x3f\xef\xff\x76\x37\xd0\xf1\xff\x75\x0d\xde" - "\xf2\xda\xdd\x90\xeb\x46\xbb\x5d\xe8\xfb\x68\x32\xb4\x1b\xf4\x9d" - "\x03\xfa\xd6\x3b\xd1\xb7\x9e\xd7\xf7\x83\xe9\xfd\xdf\xee\xa3\x74" - "\xfd\x9b\x75\x47\x95\xf2\xda\x7d\x34\xa3\xf7\x76\xe7\xb8\xd0\xf7" - "\xe7\xf1\xb6\xac\x1c\xd0\x77\x0e\xe8\x3b\xc7\x89\xbe\x73\x78\x7d" - "\xcf\x79\xa2\xff\xdb\xfd\xf9\x54\xbe\xdd\x16\x79\xed\xfe\x3c\xb5" - "\xf7\x76\xeb\xcc\xb6\x8c\xee\x9c\x5e\x1f\x3f\x89\xdc\x73\x1e\xdb" - "\xff\xbf\xad\xac\x8f\xce\x3c\x2c\x25\x59\x61\xf1\xd6\x59\x86\x35" - "\x11\x06\xfa\x7e\x31\x7e\x06\x32\x04\xda\x1a\xc3\x66\x6d\xd2\xe1" - "\xa7\x0d\xca\xb1\x00\xf7\x5b\xbd\x75\xa6\x8e\x8c\xc8\xb4\x0d\x0b" - "\x88\x3a\xc9\x48\x54\x75\x89\x06\x92\xa8\x65\x8d\x75\xe4\x5b\xe2" - "\x63\x20\x0c\x8e\x63\x1d\x6e\xab\x22\x4b\x62\x59\x16\xca\x3e\x8a" - "\xfd\xc5\xac\x13\x24\x10\x62\xe2\x64\x16\xfc\x87\xce\x46\xd4\x50" - "\x7e\x20\xca\x12\xca\xd6\xfb\xcd\x26\x8a\xff\x99\x6f\x26\x28\x4f" - "\x94\x2d\xf4\x2d\x03\x39\xb9\x9a\x08\xf9\xc3\x1c\x2a\xd7\xc2\x05" - "\x9e\xca\xf5\x7f\x8b\x68\x5c\x99\xad\xaa\x37\x74\x10\x88\x2d\x55" - "\xf8\x5e\x33\xa4\x87\xd7\x69\xcf\x40\x3f\xe4\x73\x0b\x9b\x99\x0d" - "\xfd\x4d\x9d\xd1\xc3\x72\x5d\x3e\xff\x26\xe2\xd3\x78\xf0\x15\xdd" - "\xb0\x66\x97\xf7\x17\xe1\xac\x4f\x76\x3c\x95\x77\x76\xc2\xb0\xa6" - "\x81\x67\x9c\xcb\x3b\x3b\x1e\xe4\x9d\x66\xf5\xce\x8e\x73\x5f\xde" - "\x5f\x3c\x2e\x95\x77\x76\xd8\xa5\x91\xf7\x17\xde\xbc\xbc\x75\x52" - "\x79\x1f\xab\xa1\xf2\x3e\xb6\x08\xe4\x9d\x6c\x03\x5f\xe9\x61\xb9" - "\x2e\xdf\x7f\x14\xc9\x1b\xf0\xdd\xdd\x87\xd9\xe5\xfd\xaf\x1a\x90" - "\x37\x8f\xef\x6c\xc0\xf7\xb0\x66\x17\xf2\x06\x7c\xeb\x01\xdf\xd9" - "\x1e\xe0\xfb\x5f\x1f\x38\xc8\xfb\x12\xe1\xfb\x5f\xfc\xfe\x4f\x7a" - "\x07\x7c\xff\x6b\x12\x95\xf7\x17\x4d\x6c\xa6\x1e\xf0\x9d\xed\x21" - "\xbe\xff\x75\xcc\x0d\xff\x01\xf8\xee\xee\x3b\xed\xf2\x6e\x9c\xc4" - "\xfa\xe8\x79\x7c\xeb\x01\xdf\xc3\x3f\x77\x2e\x6f\x3d\xe0\x5b\x0f" - "\xf8\xd6\x7b\x80\xef\xc6\x5b\xa5\xf2\xd6\x5f\x22\x7c\xff\xbb\x8d" - "\x97\xb7\x03\xbe\xff\x5d\x41\xe5\xfd\xef\x69\x20\x6f\xc0\xb7\xde" - "\x43\x7c\x37\x4e\x75\x43\xde\x80\xef\xee\x3e\xdb\x2e\xef\x2f\x2b" - "\x40\xde\x3c\xbe\xf5\x80\xef\x07\xd3\x5d\xc8\x1b\xf0\x9d\x03\xf8" - "\xd6\x7b\x80\xef\x2f\xb3\x1d\xe4\x7d\x89\xf0\xfd\x25\x8d\xff\x32" - "\x72\x1c\xf0\xfd\xa5\x3f\x95\x77\xe3\x7e\x36\x33\x07\xf0\xad\xf7" - "\x10\xdf\x5f\xee\x73\x23\x4e\x00\x7c\x77\x8f\x15\xec\xf2\xfe\xda" - "\x9f\xf5\xc9\xe1\xf1\x9d\x03\xf8\x9e\xf3\x84\x73\x79\xe7\x00\xbe" - "\x73\x00\xdf\x39\x1e\xe0\xfb\x6b\x85\x54\xde\x39\x97\x08\xdf\x5f" - "\xd5\xf2\xf2\x76\xc0\xf7\x57\x69\x54\xde\x5f\x8d\x07\x79\x03\xbe" - "\x73\x3c\xc4\xf7\xd7\x2e\xdf\xff\xed\x29\x3e\x59\x5e\x4c\xbc\xa4" - "\x32\x6f\xca\xb8\x78\x31\x4a\xd3\x8a\xcb\x13\xa3\x34\x05\x3b\x8f" - "\x51\xbe\xb6\x50\x99\x7f\x5d\x26\x2f\x46\x69\xca\x93\x13\xa3\x74" - "\x97\xf9\x7f\xc8\xc5\x8b\x53\x8e\xff\x78\x79\xe2\x94\xe3\xfb\x9c" - "\xc7\x29\xc7\xb5\x54\xe6\xc7\x47\xca\x8b\x53\xfe\xe3\x2d\x27\x4e" - "\xe9\x2e\xf3\x6f\xe2\x2e\x5e\xac\xf2\xcd\xdc\xcb\x13\xab\x7c\xa3" - "\x71\x1e\xab\xfc\xa7\x85\xca\xfc\x3f\x69\xf2\x62\x95\x6f\x92\xe5" - "\xc4\x2a\xdd\x65\x6e\x68\xbd\x78\xf1\x8a\xe1\xe8\xe5\x89\x57\x0c" - "\x45\xce\xe3\x15\x03\xdf\xff\xf9\xc6\x22\x2f\x5e\x31\xb8\xd1\xff" - "\xe9\x1e\xaf\x74\x97\x79\x73\xc4\xc5\x8b\x59\x9a\x9f\xbc\x3c\x31" - "\x4b\xb3\xca\x79\xcc\xf2\x6d\x2d\x95\xf9\xb7\x5a\x79\x31\x4b\x73" - "\x8c\x9c\x98\xa5\xbb\xcc\xbf\x6b\xb8\x78\x71\xcb\x77\x1f\x5e\x9e" - "\xb8\xe5\xbb\x54\xe7\x71\xcb\x77\xc1\x54\xe6\xcd\x2d\xf2\xe2\x96" - "\xef\x9a\xe4\xc4\x2d\x28\x6b\x94\x39\xc6\x2a\x54\xe6\x27\xca\x58" - "\x5f\x5d\x43\x27\xc4\x23\x3e\x20\x77\x9f\x36\xc2\x14\xa3\xcc\x1b" - "\xa9\xcc\xad\xbe\x9b\x74\x20\x9f\x18\x94\x19\xd7\x8e\x9f\xfc\x7d" - "\xad\x19\x3a\x0b\xcb\x10\x68\x8b\x17\x39\xa1\x68\xd9\x6d\x59\x4b" - "\x7c\xd5\x89\x29\xf0\xfd\x04\xb7\x7e\xa6\x3a\x71\xdd\x71\x68\xe3" - "\x00\x9c\xa3\xb0\x64\x46\x06\x5a\x7d\x72\x2b\x4f\x28\xbe\x3f\xc5" - "\x8e\x89\x08\xec\x84\x58\x82\x7d\xdd\x7f\x64\x7d\x5b\x25\xa9\xb7" - "\x7c\x46\xea\x1a\xff\x4a\x6c\xbe\x9b\xf4\x13\x2d\x44\xc3\xfe\xa4" - "\x19\x59\x1b\x67\x20\xd6\x57\xfc\xbd\xeb\xe3\x6b\x00\x17\x7b\x49" - "\x68\x2b\x7b\x9e\xfd\x4e\xe3\xdd\xe9\x93\x6f\xb4\xfa\x6c\xd2\x5a" - "\x33\x0b\xaa\x2c\x3e\xf9\x86\xdd\x2b\x0d\x8c\xb7\x99\x68\x16\xb5" - "\xb0\x6c\xd6\x7c\xa2\xcc\x6a\x26\x5e\x1b\xe7\x13\xef\x8d\xcd\x44" - "\x55\xdb\xd2\x48\x8e\x9c\xac\x21\x47\xce\x7c\x49\x8e\x9c\x87\xa3" - "\x03\x0e\x1b\x1c\xc9\x5f\x92\x5a\xe8\x25\x4d\x3f\x45\x48\x52\x0b" - "\x6b\xfc\x4d\x13\x19\x59\x6b\x69\x24\xf8\x1c\xef\x69\xc5\xf7\x29" - "\xde\x91\x64\x24\xfb\x9d\x3f\x61\x5f\xf1\x67\xe0\x9c\x12\xd3\xeb" - "\x2d\x46\x52\xdb\x62\xc6\xf3\x91\x70\x5e\x99\xd4\x02\xe5\xdb\x6a" - "\x70\xbd\x38\x63\x6d\xf2\xa7\xd0\x3e\x95\x1a\xfc\xa6\x97\x10\x93" - "\x65\x75\x90\xc0\x8d\xa0\x66\xc4\x4c\x28\x4b\x31\x53\xda\xe1\x29" - "\x66\xbe\xa7\xeb\x9f\xbd\xee\x3f\x02\xe4\x3d\xda\xf6\x7a\xb8\x6a" - "\xc6\x97\xdf\xb0\xf8\x9c\x16\xce\xcf\xd4\x99\x3e\x23\xf5\xa9\x36" - "\x12\xfa\x06\x21\xd3\xac\x84\xa0\x4c\x70\x2e\x79\x86\x96\xf8\xe1" - "\xf3\x63\xb6\x9f\x34\x23\xea\x5b\x8c\xe4\x4d\x0b\xd4\xf5\xb4\xb9" - "\xab\xae\x75\xa9\x75\x04\xce\x8d\xae\x8b\x31\x10\x6f\x2d\x51\xa1" - "\x9c\x2d\x19\x3a\xf3\x8c\x56\x32\x64\x89\x89\x65\x51\xc6\x28\x5b" - "\x94\x33\x96\x27\xc8\xbe\x3e\xca\x48\x92\xcc\x44\x55\x9f\x08\x9f" - "\xf1\xac\xb1\x9e\xfc\x42\xa0\x8e\xb9\xac\x8f\x4a\x0d\xf8\xc8\x45" - "\x4c\x18\x14\x2d\xe5\x80\x83\x11\xec\xba\x96\xf0\x12\x68\x2f\xce" - "\xe1\x7b\xd6\xe6\x13\xee\xcc\x7f\x74\x8b\x09\xed\x78\xce\x8e\xa7" - "\x78\xfe\x51\xcb\xfa\x66\x87\x75\x42\xac\x47\xf1\x3c\xf0\x4c\xef" - "\x78\xce\x4e\xb0\xe3\xf9\x87\x37\xed\x78\xfe\x71\x9e\x6b\x3c\xb7" - "\x1e\xe0\xf1\xac\xbb\x32\xf1\xdc\x3a\xb3\x67\x3c\xb7\x06\xf6\x80" - "\xe7\x34\x21\xde\xed\x1f\x3c\xb7\xa6\x5d\x3a\x3c\x67\xc7\xcb\xc3" - "\x73\x6b\x94\x14\xcf\x3f\xc4\x51\x3c\xff\xa0\x91\x87\xe7\x1f\x5d" - "\xee\x7f\xd0\x53\xbc\x2d\xc2\x33\xcf\xcf\x6d\xc1\x80\x67\xe0\xe7" - "\x6c\x9e\x9f\x87\x35\xbb\x81\x67\x11\x3f\x9f\x9c\x6e\xc7\x73\xdb" - "\xbd\xae\xf1\xfc\x53\x26\xc5\xb3\xfe\x0a\xe5\xe7\x9f\x6e\xed\x19" - "\xcf\x3f\x11\xd7\x78\xd6\x7b\x09\x7d\x89\xfe\xc1\xf3\x4f\xe1\x97" - "\x10\xcf\x32\xf9\xf9\xa7\x20\x29\x9e\x4f\x4e\xa5\x78\xfe\xd1\x2c" - "\x0f\xcf\x6d\x2e\x9f\x7f\xee\xa9\x2f\x63\xc7\xb3\x9e\xe7\xe7\x9f" - "\x55\xac\xaf\x1e\xf8\x59\xcf\xf3\xf3\xf0\xcf\x7b\xc7\xb3\x5e\xc4" - "\xcf\xa7\xc6\xd8\xf1\xfc\xb3\xc2\x35\x9e\x4f\xcf\xe5\xf1\x7c\x85" - "\xf2\xf3\xa9\x5f\x7a\xc6\xf3\xa9\x86\x1e\xf0\x9c\x26\xf4\xd3\xfa" - "\x07\xcf\xa7\x35\x97\x0e\xcf\x7a\x99\xfc\x7c\x5a\x29\xc5\xf3\xa9" - "\x91\x14\xcf\x6d\x35\xf2\xf0\xfc\xb3\xcb\xfd\x7f\x7a\xea\x27\x8a" - "\xf0\xcc\xf3\xf3\x2f\x06\xc0\x33\xf0\xb3\x9e\xe7\xe7\x07\xd3\xdd" - "\xc0\xb3\x88\x9f\x7f\x3e\x65\xc7\xf3\x2f\x47\x5d\xe3\xf9\x97\x09" - "\x14\xcf\x39\x57\x28\x3f\x1b\x3f\xea\x19\xcf\xc6\x32\xd7\x78\xce" - "\xf1\x12\xfa\xc0\xfd\x83\x67\xa3\xf9\x12\xe2\x59\x26\x3f\x1b\x8f" - "\x49\xf1\xfc\x73\x0b\xc5\xf3\xcf\x79\xf2\xf0\xfc\x8b\xcb\xf5\xdf" - "\x7a\xea\x83\xdb\xf1\x9c\xc3\xf3\xb3\xa9\x92\xf5\xcd\x01\x7e\xce" - "\xe1\xf9\x79\xce\x13\xbd\xe3\x39\x47\xc4\xcf\x67\x0e\xd8\xf1\x6c" - "\xda\xe2\x1a\xcf\x67\xad\x3c\x9e\xaf\x50\x7e\x3e\x9b\xdd\x33\x9e" - "\xcf\x6a\x7b\xc0\x73\x9a\x30\xbe\xd0\x3f\x78\x3e\x5b\x73\xe9\xf0" - "\x9c\x23\x93\x9f\xcf\x96\x4b\xf1\x7c\x66\x1f\xc5\xf3\x99\x18\x79" - "\x78\x36\xb9\xdc\xff\xce\xb3\xf1\x8d\xf6\x4a\x1c\xdf\xe8\xc0\xf1" - "\x0d\xfb\xb3\x7f\x31\x7e\x0d\x14\xcf\x9d\x80\xe7\x42\x31\x9e\xbf" - "\x76\x1c\xdf\x38\x97\x69\xeb\xc2\x73\x7b\x37\x3c\xdb\x00\xcf\x9d" - "\x1c\x9e\xcf\x7f\x28\x8c\x6f\xd4\xb7\x95\x01\x4e\x4e\x92\xfa\x30" - "\xc0\x72\x16\x8f\xe5\xaf\x01\xcb\x20\x43\x1b\xc8\xb8\xb6\xa9\x91" - "\x84\x1a\xa9\x2c\x3b\x40\xc6\x36\x31\x8e\x3b\x5a\x19\xc4\x2f\xe2" - "\x56\xc0\xf0\x91\x25\x80\xdd\xd8\xa3\xe4\xc8\x4a\x38\x56\xc3\x91" - "\x08\x07\x39\x4a\x6a\x5b\x01\xbb\x0b\xc5\xd8\x6d\xe0\xb1\x7b\x7e" - "\x7a\xcf\xd8\x3d\x3f\xfe\xd2\x8d\x65\x9c\xa7\xe3\x5f\x5f\x87\xab" - "\x42\x67\x7e\xc3\xd6\xc7\x37\xf2\xf8\x3c\x49\x42\x2d\xc4\x8f\x9d" - "\xa3\x19\xe1\x1d\x4e\x54\x6b\xac\x84\xc9\x9c\x4f\x54\x99\x5f\x41" - "\xbb\x05\xfb\x6d\x26\xde\x9f\x99\xff\x4a\x6a\xcf\x34\x92\xda\xf3" - "\x9f\x92\x5a\x1b\x1c\x27\xe1\x80\xba\x86\x46\x8b\xdb\x6d\xe4\xdb" - "\xdd\xfe\x24\x94\x35\xce\x75\xbb\xdb\xc7\x71\xed\x8e\x82\x76\x77" - "\xd8\xdb\x5d\x0f\x76\x00\xfa\x19\x6d\xe3\xc7\x43\x42\x8d\x64\xc8" - "\x52\x0b\xcb\x76\xf0\xf8\x47\xfd\x7c\x76\xcc\x4c\x42\xb5\xa0\xb3" - "\x57\x00\xff\x2d\x15\x24\x29\x01\xf0\xdf\x61\x46\xdc\x19\xeb\x93" - "\x2f\x00\xfe\xcf\x47\xb2\x20\xbf\x4e\xc4\xff\xd7\x88\xff\x73\xa9" - "\x36\x0e\xff\xe7\x26\xc9\xc3\x7f\xbb\x1b\xf8\x77\x67\x3c\xa4\xa3" - "\x12\xc7\x43\x3a\x70\x3c\xc4\xfe\x0c\x68\x2f\xf8\x17\x8f\x87\x98" - "\x45\xf8\xef\xe8\x01\xff\x17\x04\xfc\xeb\x2e\x3f\xfe\x2f\xf4\x82" - "\xff\x0b\x3d\xe1\xbf\x9f\xc7\x3e\x2e\x5c\x42\xfc\x77\xf4\x82\xff" - "\x0e\x37\xf0\x9f\x1d\x2f\x0f\xff\x17\x1c\xf0\x6f\xe6\xf1\x6f\x96" - "\x89\xff\x0e\x77\xf0\xef\xc6\xf8\x89\x15\xf1\x0f\xfc\x9f\x6d\x12" - "\x3d\x0b\xdc\x1b\xfe\x45\xfc\xdf\x29\xc2\xbf\xb5\x07\xfc\x5b\x3e" - "\x14\xc6\x4f\x2e\x3f\xfe\x2d\xbd\xe0\xdf\xd2\x03\xfe\xfb\x7b\xac" - "\xc4\x72\x09\xf1\x6f\xed\x05\xff\x56\x77\xf0\x2f\x93\xff\x2d\x0e" - "\xf8\xef\xe4\xf1\xdf\x29\x13\xff\x56\x37\xf0\xef\xc6\x78\x0b\x43" - "\x2a\x71\xbc\xa5\x03\xc7\x5b\xec\xcf\x84\xf7\x82\x7f\xf1\x78\x8b" - "\xcd\x8e\x7f\x86\xf4\x80\x7f\x56\xc0\xff\x15\xc0\xff\x6c\x2f\xf8" - "\x67\x7b\xc2\x7f\x3f\x8f\xad\xb0\x97\x0e\xff\x0c\xe9\x19\xff\x0c" - "\x71\x03\xff\x7a\x99\xfc\xcf\x3a\xe0\xdf\xc6\xe3\xdf\x26\x0f\xff" - "\x0c\x71\x07\xff\xbd\x8f\xcf\x30\x03\x10\xff\xc0\xff\x7a\x93\xe8" - "\xdd\x80\xde\xf0\x6f\xe7\x7f\x46\x21\xc2\xff\x00\xd7\xf8\x67\x98" - "\x0f\x85\xf1\x99\xcb\x8e\x7f\x86\xe9\x19\xff\x0c\xd3\x03\xfe\xfb" - "\x79\x2c\x86\x61\x2e\x21\xfe\x07\xf4\x82\xff\x01\xee\xe0\x5f\x1e" - "\xff\x33\x8c\x14\xff\x8c\x82\xe2\x3f\x5d\x21\x13\xff\x03\xdc\xc0" - "\xbf\x1b\xe3\x39\xcc\x20\x6e\x3c\xa7\x03\xc7\x73\xec\xef\x88\xf4" - "\x82\x7f\xd1\x78\x0e\xa3\x14\xe1\x7f\x50\x0f\xf8\x1f\x28\xe0\xff" - "\xf2\xf3\x3f\x33\xb0\x17\xfc\x0f\xec\x09\xff\xfd\x3b\x76\xc3\x0c" - "\xbc\x84\xf8\x1f\xd4\x0b\xfe\x07\xb9\x81\xff\x1c\x79\xfc\xcf\x0c" - "\x74\xc0\xbf\x92\xc7\xbf\x52\x26\xfe\x07\xf5\xcf\xf8\x0f\xe3\x15" - "\x8e\xe3\x3f\x36\x6f\x9d\xa9\xb3\x28\x22\xd0\x96\x91\x6f\xf4\x53" - "\xa8\x89\xc5\x3b\xb7\xb2\x3e\xce\x44\x66\x9c\x03\x9d\x68\xcf\x91" - "\x97\xce\xa9\x70\xbf\x40\x03\x0b\xfd\x7f\xc9\x3b\xa2\x70\x58\x32" - "\x54\xea\x8d\x4b\x88\xd2\xea\xbb\x49\x8f\x69\xf5\x27\xcc\x04\xdb" - "\xfc\x26\xca\xe0\xa4\x5d\x06\x38\x06\xc7\xfe\xac\x51\x95\xac\x85" - "\x3c\x1d\x06\xd2\x02\x78\xa9\x6d\x31\x80\xec\x57\x73\xd8\x42\x5d" - "\x9c\x60\x06\x9b\x4b\x4f\x13\xa5\xe5\x3b\xff\xd1\xa0\xe3\x91\x3e" - "\xab\x88\x22\xa0\x85\xb5\xa1\x2e\x51\x47\xa8\x57\xf5\x6a\x96\x85" - "\x7a\xcf\xac\x03\x7c\x5b\xbe\xd3\x8c\x2e\x81\x7c\xfd\x3e\x2e\xc3" - "\x78\x71\xf3\x1f\x06\x66\xb0\xb1\xb6\x09\x64\x99\x3e\x58\xa6\x9e" - "\xbc\xdc\x79\xff\xa5\xf7\x71\x0a\x66\x28\xc1\x71\x0a\x9b\x77\x76" - "\x9c\x7b\x7a\xca\x8e\x97\xbc\xd3\xda\xef\x7a\x1a\x52\xe6\x9e\x9e" - "\x86\x5c\x70\xd0\x53\xff\x8e\x1f\x30\x43\xe8\x7a\x30\xcc\x90\x3c" - "\xaa\x27\x2f\x83\x3c\x3d\x0d\x95\xf5\xfc\x6f\xb7\xfe\x34\x33\xac" - "\x02\xfb\xd3\xa0\x27\x37\xed\x29\xdb\x2c\x79\x07\xb7\xdf\xf5\x34" - "\x2c\xc4\x3d\x3d\x0d\xdb\x22\xd5\x53\x3f\xf7\x73\x99\x61\x74\x3f" - "\x68\x66\x58\x30\xd5\xd3\xd0\x34\x79\x7a\x1a\xe6\xc6\xfb\x1f\xee" - "\xf4\xfb\x7c\xc2\xb0\xdf\x67\x83\x7e\x9f\x7b\x7a\xd2\xc7\x4b\xde" - "\x19\xee\x77\x3d\x79\x1b\xdd\xd3\x93\xcf\xd3\x0e\x7a\xea\xdf\xfe" - "\x18\xe3\x33\x92\xea\xc9\xbb\x95\xea\xc9\x3b\x50\x9e\x9e\x7c\x22" - "\xfa\xa7\x7f\xe2\x6b\xc6\xfe\x09\xe8\xc9\x4d\x7b\xd2\x9b\x25\xef" - "\x38\xf7\xbb\x9e\x7c\xf3\xdc\xd3\x93\xef\x2f\x52\x3d\xf5\x77\xbf" - "\xc1\x77\x3f\xd5\x93\xaf\x8e\xea\xc9\xa7\x51\x9e\x9e\xfc\x5c\xee" - "\xff\xe9\x59\x1c\xad\x2a\xc3\x38\xda\x06\x71\xb4\x7b\x7a\xca\x89" - "\x97\xbc\x93\xdd\xef\x7a\x52\x05\xbb\xa7\x27\x55\xbe\x83\x9e\xfa" - "\x39\xbe\x55\x45\x51\x3d\xa9\x26\x51\x3d\xf9\x25\xcb\xd3\x93\xca" - "\x8d\xe7\x3f\x9d\xbf\x87\xd5\x3d\xe6\x1b\x31\xed\xca\x8a\xf9\x86" - "\xb7\xb9\xa7\xab\x11\x4f\x5e\xdc\x98\x6f\x84\x8a\xea\x6a\x78\x0b" - "\xd5\xd5\xf0\xf1\xf2\x74\x35\x22\x5c\xee\xfb\x5b\xdd\xe3\xbe\x1b" - "\xcc\x57\x56\xdc\x77\x83\x9b\xfc\x77\xc3\x2f\x17\x37\xee\xbb\x81" - "\xe7\xbf\x1b\x78\xfe\x1b\x21\x93\xff\x46\xba\xc1\x7f\xce\xdf\xfb" - "\xea\x1e\xfb\xdd\x58\x7e\x65\xc5\x7e\x37\x4e\x75\x4f\x57\x37\x16" - "\x5f\xdc\xd8\xef\xc6\x18\xaa\xab\x1b\xa7\x50\x5d\x8d\x4c\x95\xa7" - "\xab\x1b\x5d\xee\xff\xd2\xdb\xfb\x62\xdd\xe3\xbf\x9b\xae\xb0\xf8" - "\x6f\x94\x9b\xf1\xdf\x4d\x17\x39\xfe\xbb\x89\x8f\xff\x46\xf1\xf1" - "\xdf\x28\x99\xf1\xdf\x4d\xb2\xe2\x3f\x07\x5d\xf1\x76\xe5\x6f\xb9" - "\xb2\x62\x40\xff\x22\xf7\x74\xe5\x7f\xee\xe2\xc6\x80\xfe\xd5\x54" - "\x57\xfe\xb9\x54\x57\x37\x35\xc9\xd3\xd5\xcd\x2e\xf7\x3f\xec\xed" - "\xfd\xb4\xee\x71\xe0\xe8\x8a\x2b\x2b\x0e\x1c\xed\x66\xff\x77\xf4" - "\x96\x8b\x1b\x07\x8e\xe6\xfb\xbf\xa3\xf9\xfe\xef\xcd\x32\xfb\xbf" - "\xa3\xdd\xe8\xff\xba\x33\xee\x37\xc6\x0b\x63\x40\x6b\x86\xce\xe4" - "\x07\xf2\xf7\x8b\x27\x4c\x47\x00\xe8\xcb\x1b\xf4\x95\xa2\x26\x9d" - "\x19\xa0\x2f\xa3\x85\xcc\x58\xf6\x0d\x5b\xd7\x66\x25\x1d\xa0\xab" - "\x0b\x10\x07\xd6\x1b\x5b\xf1\x1d\xbd\x87\x9b\x99\x80\x2d\x73\x96" - "\xa9\x08\xea\x0b\xe5\x6f\xf5\x56\xa9\x59\xd0\x17\xa7\x3f\xef\x82" - "\x2a\x4b\xc6\x26\xed\xf4\x53\xdf\xb0\x4b\x0d\x2c\x7b\x24\xc6\x8c" - "\x6b\x47\x06\x1e\x89\x69\x24\xa1\x2d\x64\x88\x7a\x16\xea\x25\x60" - "\x26\xa6\xd7\x1b\x1b\x09\xae\xfb\xc9\x8d\x81\x7f\xa3\x19\x69\xf9" - "\xb7\xc6\x1b\xd7\x6f\xc2\xf7\x0a\x85\x35\x9a\xea\x4f\xe6\x71\xfa" - "\x77\x1c\x53\xe5\xf4\xff\x6f\x8d\xaa\x10\xdf\x4f\xec\xf7\x58\x30" - "\x80\x1b\xff\xb3\x7d\xe3\x3f\x5a\xa8\xe3\xd2\x45\x2c\x0b\x75\x1c" - "\x51\x67\x32\x12\xac\x67\x9d\xa9\x9a\x24\xc5\x11\x55\x5d\x47\x2b" - "\x49\x34\xb1\xc6\xba\xe4\x1f\x49\xe8\x39\x9c\x17\x40\x3c\x05\xe4" - "\x53\x7d\xff\xea\x90\xed\x1b\xcd\x68\x28\x4f\x57\xd7\x40\x88\x5f" - "\x0a\xc8\xda\x42\x18\xee\x7d\x4d\x86\x78\x81\xbc\x62\xea\x93\x9b" - "\x09\xc8\xce\x58\x6f\xf9\x0a\xe5\x19\x03\xe7\xa7\x74\xcd\x37\xf8" - "\x6e\x3a\x83\x69\x28\x5b\x7c\xce\xb4\x5e\x6b\xe4\xf2\x08\xe7\xa9" - "\xee\x92\x49\x7d\x7c\x07\xa9\xb3\x10\x02\xf7\xd3\x1e\x0e\x6f\x04" - "\x7c\xfd\x4a\x26\x6f\x8f\x19\xd9\x3f\xe3\x95\xb7\xc4\x60\xdc\x6a" - "\xcd\xc8\x8e\xa3\x75\x1c\x78\xa6\x77\x7c\x65\xc7\xdb\xf1\x75\x8b" - "\xa2\x6f\xf8\x1a\xfb\x41\x3f\xe3\xab\x9f\xe3\xd7\xb1\x09\x7d\xc3" - "\xd7\xd8\x0b\x14\x5f\x63\xc7\x51\x7c\x8d\x35\xda\xf1\x35\xf0\xcc" - "\xc5\xc3\xd7\x98\x06\x8a\xaf\x31\x3a\x79\xf8\xba\x25\xae\x7f\xc6" - "\x59\x6f\xad\xc1\x58\x1b\xf0\xc5\xf3\xd7\xb0\x66\x37\xf0\x25\xe2" - "\xaf\x5b\xe7\xf5\x0d\x5f\xb7\x0e\xef\x5f\x7c\xf5\x77\xcc\xad\x6e" - "\xea\x1b\xbe\x6e\x7d\x81\xe2\x4b\x9d\x4a\xf1\x75\x6b\x98\x1d\x5f" - "\xc3\x9a\x2f\x1e\xbe\xd4\x81\x14\x5f\xb7\x18\xe5\xe1\xeb\x56\x59" - "\xeb\x5f\x75\xef\x1f\x8c\xd3\x60\xff\xc0\x9a\xa1\xe7\xf9\x6b\xf8" - "\xe7\xbd\xe3\x4b\x2f\xe2\xaf\xdb\x3f\xea\x1b\xbe\x6e\x5f\xd6\xcf" - "\xf8\xea\xe7\x7e\xc2\xed\x53\xfa\x86\xaf\xdb\x3f\xa4\xf8\xba\xad" - "\x85\xe2\xeb\xf6\x4a\x3b\xbe\x86\x7f\x7e\xf1\xf0\x75\x9b\x8e\xe2" - "\xeb\xb6\x30\x79\xf8\x1a\xe7\x7a\xfd\x67\x8f\xc6\xb5\xef\x4c\xc3" - "\x3e\x0d\xe0\x8b\xe7\xaf\x07\xd3\xdd\xc0\x97\x88\xbf\xee\xbc\xb5" - "\x6f\xf8\xba\xe3\x68\xff\xe2\xab\xbf\xfb\x36\x77\x14\xf5\x0d\x5f" - "\x77\xde\x4c\xf1\x75\xc7\x54\x8a\xaf\x3b\x55\x76\x7c\x3d\x98\x7e" - "\xf1\xf0\x35\xce\x48\xf1\x35\xae\x52\x1e\xbe\xee\x74\x63\xfd\x57" - "\x77\xc6\xe3\x35\xad\xd8\x0f\xb3\x66\xe4\xf0\xfc\x35\xe7\x89\xde" - "\xf1\x95\x23\xe2\x2f\x4d\x4a\xdf\xf0\xa5\xb9\xb7\x9f\xf1\xd5\xcf" - "\xfd\xb1\x5f\x5b\xfa\x86\x2f\xcd\x1b\x14\x5f\xbf\x2e\xa7\xf8\xd2" - "\x68\xed\xf8\x9a\xf3\xc4\xc5\xc3\xd7\xaf\xc3\x28\xbe\x7e\xad\x92" - "\x87\x2f\x8d\x1b\xeb\xff\xb8\x3b\x8f\xf0\x9b\x69\x7d\xeb\x43\xde" - "\xfd\x7d\xdf\x30\x76\xf7\xa6\x2b\xbb\x0f\x79\x77\x64\xdf\x30\x76" - "\xf7\x71\x8a\xb1\xbb\xbd\x28\xc6\xee\x3e\x76\x69\xfa\x90\x77\xed" - "\xa3\x18\xbb\x2b\x4e\x1e\xc6\x7e\xd3\x8f\xf3\x1f\x13\x2a\xfb\xd6" - "\x8f\x9c\xf0\x74\xdf\x30\x36\xfe\xc2\x95\xdd\x8f\x1c\x7f\xa8\x6f" - "\x18\x9b\xf0\x38\xc5\xd8\xf8\x45\x14\x63\x13\x26\x5d\x9a\x7e\xe4" - "\x78\x7f\x8a\xb1\xdf\xc8\x9c\xb7\x99\x20\xeb\xfd\x17\xe7\xf3\x36" - "\x81\x23\xfb\xd6\x97\x9c\xb8\xbb\x6f\x18\x9b\x38\xf7\xca\xee\x4b" - "\x4e\xd4\xf4\x0d\x63\x13\xb7\x51\x8c\xdd\xd3\x40\x31\x36\xb1\xe8" - "\xd2\xf4\x25\xef\x49\xa0\x18\xbb\x67\x8a\x3c\x8c\x05\xaa\xfb\x6f" - "\xbe\xe9\xbe\xf8\xbe\xf5\x27\xef\x1b\xde\x37\x8c\xdd\xfb\xd1\x95" - "\xdd\x9f\xbc\x37\xa3\x6f\x18\xbb\x6f\x08\xc5\xd8\xbd\x41\x14\x63" - "\xf7\x91\x4b\xd3\x9f\x0c\x34\x50\x8c\x05\x96\xc9\xc3\xd8\x7d\x6e" - "\xac\xff\xef\xee\x3c\x59\x50\x53\xdf\xfa\x94\x41\x2b\xfa\x86\xb1" - "\xa0\x3b\xae\xec\x3e\xe5\xfd\xc6\xbe\x61\x2c\x68\x31\xc5\xd8\xfd" - "\x79\x14\x63\x41\x51\x97\xa6\x4f\x79\xff\x54\x8a\xb1\xfb\x95\xf2" - "\x30\x16\xd4\xda\x7f\xf3\x7b\xbf\x0d\xee\x5b\xbf\xf2\xc1\x2f\xfb" - "\x86\xb1\x07\xd7\x5f\xd9\xfd\xca\x07\x67\xf7\x0d\x63\x0f\x1e\xa5" - "\x18\x7b\xc0\x42\x31\xf6\x60\xcd\xa5\xe9\x57\x3e\x50\x41\x31\xf6" - "\x80\xbc\xf5\x28\x98\xdf\x76\x5b\xff\x6a\xe1\x92\x95\xf3\x16\x2d" - "\x8c\x52\x2f\x5c\x12\x17\xbb\x4c\xbd\x7c\xe1\xea\xe8\x47\xee\x58" - "\x31\x5e\x1d\x1b\xaf\x8e\x5d\xb8\xe4\x55\x3e\x21\x6a\x28\x99\x15" - "\xbd\x68\x5e\x3c\xa6\x40\xee\x57\x97\x2c\x8e\x5e\x12\xa7\x8e\x8d" - "\x5e\xb6\x62\x61\x6c\x34\x7e\x5f\xae\x5e\xb0\x34\x16\x12\x5e\x89" - "\x5e\xb8\x32\x5a\x3d\x7f\xc5\x82\x05\xd1\xb1\xcb\x87\x92\xe9\x2b" - "\x16\xc5\x2d\xd4\x2e\x8a\x56\x4f\x9d\xfe\xf8\x84\xd9\x4f\xfe\x71" - "\xf6\x63\x8f\xe1\xe6\x64\xa2\xbd\xc9\x02\xd8\x8c\x82\x4a\xc0\x9c" - "\xf2\x04\x13\xfc\x65\x9d\x3f\xe1\xf6\xb3\xdd\x78\x86\xa8\xd6\xc7" - "\x12\x65\xda\x19\xe2\x95\x79\x86\x78\xab\x5f\x23\xc1\xec\xfa\x7f" - "\xab\x21\x7d\x24\x9b\xe9\x17\xc9\x66\x45\x4e\x82\xcf\x32\xe3\x10" - "\xf3\x24\xcc\xcb\xae\x6f\x0f\xc7\x73\x20\x5b\x25\x9b\xa9\xf2\x6a" - "\x66\x82\xf3\x8c\x43\x2e\x68\x92\x7e\x24\x0c\x3b\x74\x52\xc2\x1e" - "\x9b\x91\xf9\x08\x67\x34\xa0\xed\x84\x99\x9c\x0b\x47\x32\x61\x1e" - "\x0a\x84\x23\x18\x8e\x69\x70\xc4\xc1\x91\x00\x87\x0e\x8e\x22\x38" - "\x2a\xe0\xa8\x84\xa3\x0a\x8e\x6a\x38\x6a\x08\xf3\xf0\x54\x38\xa2" - "\xe0\x80\xbc\x0f\x67\xd0\x72\x1e\xce\x83\xe3\x10\x61\xa6\x78\xc3" - "\x01\x65\x3d\x32\x05\x8e\x18\xc2\x3c\xea\x05\x9f\x69\x70\x94\xc3" - "\xb1\x0b\x8e\x06\x38\x4c\x90\xb7\x88\x9e\x7b\x14\xd2\x1e\x6d\x25" - "\x50\xcf\xde\x8f\xc7\x20\xff\x63\x2a\x38\x82\xe0\x80\x7b\x3e\x66" - "\x86\xf4\x90\x1e\xae\xd1\xf5\x52\x66\xa5\x5f\xca\x2d\x06\x6e\x0f" - "\x3c\x66\xf2\x2f\xd6\xb5\x64\x80\x75\xfd\x05\x8d\xf6\x6e\xa2\x38" - "\xc9\x4c\x3e\x50\x9f\x8a\x3c\xe3\x17\xc9\xed\xe9\x08\xbf\x51\x66" - "\xed\xe9\x93\xf7\x1b\x48\xa6\x1a\xf7\x34\xf3\x0c\x6f\x93\xf7\xf3" - "\xd7\x5b\x0c\x8a\x9b\x2a\xb8\x3d\xe0\xd2\x6b\x77\xb1\x49\xe1\x85" - "\xdc\xde\x6f\x28\x43\xb4\x83\xb4\x5a\x25\xeb\xf5\x49\x25\xda\x7c" - "\xf5\x6a\xae\x5e\x9b\xd8\xb5\xc4\x17\xae\xcf\x65\xa1\x6e\x46\x9f" - "\xc8\x49\x50\x4f\x25\xfe\xb6\xae\x37\x4f\xba\xe0\x93\xaf\xc3\xef" - "\xe6\xe2\x39\xd5\x6c\x46\x7e\x15\xf6\xb3\xab\x13\xf5\xa4\x19\xae" - "\xbb\xe0\x53\x18\xae\x7e\xc6\x8f\x6d\xc6\x6b\xd7\x12\xc6\xc0\x3c" - "\xa4\xa1\xb6\x3a\x39\xf7\x82\x4f\x64\xb0\x35\xaf\x30\x19\xd2\x95" - "\xd6\xcc\xc8\x49\xb4\x7c\xf3\x24\x6b\xc6\xa6\x48\xc8\x97\xca\xa5" - "\x17\xcd\x69\x14\xbe\xc3\x67\xb2\x35\x2b\xdf\x8c\x9f\x3e\x29\xc4" - "\xc4\xfd\x5e\x1b\x4c\xe8\xa7\x8a\xa8\x9f\x21\xa4\x8d\x79\xf8\xae" - "\x89\x35\x44\x51\xfd\x0c\xd6\xfb\x21\x53\x52\x0d\x6b\x53\x27\x0e" - "\x80\xfb\x3f\x74\xae\xeb\xbe\x37\x17\xc6\xe3\x1e\xa9\x6c\xfa\x6f" - "\x33\x4a\xf5\x84\xe0\xb5\x58\xb7\xfc\x11\x44\x59\xac\x27\x5e\xd8" - "\xc6\xf6\xf4\x87\xd5\xc2\x3e\x74\x78\x0d\x03\xf9\x9f\x7e\x3a\x89" - "\x15\x95\x7d\xca\xca\xb5\x67\xb2\x8e\xca\xf4\xe1\x30\x83\x62\x64" - "\x39\xe6\x57\xdf\xc6\xc9\x72\x13\x7f\x3e\x17\xf5\x89\xe5\xb3\x99" - "\x05\x95\xf8\x1b\xf7\xb9\xf3\x03\x04\xab\x13\xc7\x55\x51\x19\xe5" - "\x57\x61\x39\x98\x9f\xcd\xca\x85\xef\x0f\x05\xb1\x99\x9c\x8c\x35" - "\xea\x25\x24\xb8\x99\x79\xf8\x80\x75\xfd\x91\x28\x28\x03\xec\xee" - "\x48\x0c\xe4\x6f\xe0\xe4\x9d\xb9\x29\xcc\xc0\x3c\x5c\x09\xe7\x62" - "\xba\xf6\xbe\xa4\x72\x56\x40\xbe\x78\xa8\x53\x8b\x41\x31\x7e\x1f" - "\xa7\xe7\x95\xec\x31\xdc\x63\xf3\xec\x4a\xd6\x12\x6a\xf9\xc6\x06" - "\x5c\x45\xda\xd3\xa7\x28\x0d\xe4\xd1\x48\xa1\x8d\x54\xf7\x5d\xe5" - "\x6c\xc2\xdf\xc6\x21\x58\xce\x94\xf1\xce\xca\x81\x7b\x9b\x5e\xb6" - "\xa8\x15\x1d\xe7\xd9\x86\x8d\xcf\xa1\x1c\x09\xdb\xb1\x92\xad\x7d" - "\x33\x84\x35\x67\x7d\x4e\xc8\x91\x98\x26\x02\x36\x1f\xe0\xab\x60" - "\x8d\xa1\x6f\x10\x3f\x5f\xad\x1f\xfb\x69\x4d\x13\x59\x13\xc2\xb6" - "\xe2\x1e\xbe\x75\xa6\x16\x92\xf0\x25\xf1\x4e\x3a\x42\x46\x26\x84" - "\xb0\xc6\xda\xc8\x26\x42\xd3\x8f\x90\xa4\x6f\x89\x72\xcd\x21\xd6" - "\x3c\x03\xf8\xff\x70\x13\xa6\xb7\x10\xdc\xa3\x32\xa9\x95\xb5\x24" - "\xce\x25\xde\xf8\xfd\xc8\x21\x4c\xff\x9e\x24\x9d\x22\xca\xd0\x78" - "\xa3\x5f\x09\xdc\x13\xaf\x2f\x85\xba\xd8\xce\xb3\xfb\x37\x9e\x27" - "\x64\xcd\x0b\xc4\x3f\x61\x1e\x51\x85\x5a\x09\x5b\x6f\xf9\x33\x09" - "\xb5\xb2\xe0\x5f\x3e\x26\x6f\x2e\x24\x5e\xa1\x16\x7c\x8f\xed\x0b" - "\x82\xfb\x74\x97\x42\x5e\x68\x5b\x35\xb6\x6d\xcd\x71\xe2\x8f\xfb" - "\x93\xd3\x6b\x0e\xf0\xd7\x1c\x27\x28\xb3\x0b\x3e\x7e\x3a\x73\xa6" - "\x4a\x05\x6d\x37\xa3\x0c\xe0\x3e\x0d\x36\xbc\x0e\xae\xdf\x18\xcb" - "\xc9\x40\xf1\xb2\x85\x78\x5b\x33\x37\x4d\x7a\x39\xbe\x9a\x2b\xd7" - "\xc0\x3c\x12\x54\x1a\xcb\xd5\x49\x92\x37\xd4\xc2\x9e\x35\xfa\x6c" - "\x02\xdc\x3f\x12\x11\x1a\xff\x18\x8b\xd7\x82\x2e\xe3\xda\xd3\x1f" - "\x29\x12\xe4\x2d\xe8\x05\xf2\xe8\x40\x17\x71\x03\xb4\x44\x09\xe7" - "\xf7\x1b\x14\x13\x75\x76\xac\x3d\x84\xf8\x1a\x24\xe4\xe5\xf3\x18" - "\x0c\x8a\x09\x8d\x22\x3c\x22\xbe\xba\xf2\xb4\xa7\x3f\x4a\x0c\x8a" - "\x7b\x0c\xf4\x1e\x8f\x54\x63\x1e\x9e\xfb\x85\xbc\x03\xd8\xb4\x4f" - "\x52\xad\x3e\xf9\xd5\x2c\xc3\x9a\x01\x8f\xe1\xec\x59\x7f\xef\x19" - "\x16\xd6\x6c\xcb\xcc\x0d\x03\x7e\xf7\xc6\x7d\x5d\x69\xfe\x47\xb3" - "\xe1\x7c\xa4\x7a\x25\xf7\xbd\x1c\xef\xc3\x66\x44\x46\x76\x9d\x5b" - "\x4b\x06\xb2\xc5\x73\x2a\xc1\x77\xa8\x42\x6b\x58\x33\xd8\x7a\x65" - "\x56\x2c\xfa\x8e\xfc\x4a\xb4\x6b\x9b\xcf\xa6\x18\x73\x7e\x61\x24" - "\xf2\x13\xda\x08\x9b\x91\x1b\x46\xaf\x7d\xe8\x2e\xb4\x1b\xca\x35" - "\x8f\xc6\x58\xa1\x0c\xa8\x53\x1a\x9c\x1b\xd8\xcc\x3c\xda\x84\xef" - "\x93\xc2\xef\x6a\x6e\xdf\x4b\xe6\xd1\x6f\x29\x7e\x3f\x49\x95\xfc" - "\x66\x50\x76\x60\x4f\xc0\x59\xc8\x0f\x27\x98\xc7\x14\x22\x1b\xd6" - "\xb0\xbc\x8d\x5e\xf0\xc9\x8d\xa4\x3c\x32\xc0\x06\xf9\x14\xcd\xbc" - "\x3d\x5e\x18\x72\x64\x51\x7b\xfa\x63\x80\x7f\xbf\x10\x89\x9d\xa4" - "\x1f\xd4\xe0\x1e\x9b\x50\x97\x01\x50\xe6\x0b\xf0\x39\x18\x3e\xe7" - "\x1e\xac\x41\x7d\x73\xe5\x0e\xc3\xef\xf9\xa3\x58\xe3\xd4\x27\x09" - "\xee\xa7\x09\xf6\xf6\x58\x9c\x81\x2c\x52\x62\x39\xeb\x71\x9f\x51" - "\x48\xc3\x3c\x90\x9e\x01\xe9\x26\x5a\xfe\x43\x41\x26\xa8\xab\x43" - "\xf9\x1f\xd0\xf2\x69\xb9\x58\x9e\x50\x76\xf1\x66\xb6\x8d\x2f\xbb" - "\x41\x28\x3b\x13\xd2\x84\xf2\xa7\x2e\xee\xba\x87\x11\xce\x27\x88" - "\xdb\x90\xb7\x99\x35\x61\x19\xed\xe9\xc1\xde\x06\x92\xdc\x8a\xe7" - "\xd2\x20\x0d\xaf\x15\xe1\x6a\xc0\xc1\x10\x28\xe3\x10\x96\x11\x1c" - "\x64\x20\x49\x5a\x07\x8e\xf3\x11\x38\x8e\x2f\x2b\x5c\x28\xcb\x5e" - "\x8e\x80\xa7\xa3\xd5\xbc\x5e\xb1\x5c\x6f\x2c\x17\xf2\xa7\x19\xc8" - "\x92\x43\xe2\xb6\x83\x6d\xe9\xd8\xac\x7c\xdc\x83\x57\xc1\xe3\xf1" - "\x00\x72\xb2\x50\x6f\xdc\x67\x14\xb8\x7b\x1f\xda\x0b\xc7\xdf\x99" - "\x9b\x82\xa1\x9c\x06\x07\xbe\x56\x62\x3e\x6b\xfa\x6f\x7f\x2c\xc6" - "\x7d\x56\x47\xb1\xad\x90\xc7\x24\xd9\x5b\x94\x21\x8f\xb6\xa7\x3f" - "\xee\x25\xec\x71\x9a\x05\x79\x0c\xcc\x24\x97\x6b\x38\x26\xde\x4a" - "\x98\xfa\x22\x03\xc6\xcf\x88\xab\x29\xf5\x01\x26\x52\x5f\x64\x23" - "\xb6\x92\x39\x86\xe0\x44\xb6\xfa\x04\xf3\xf8\xdb\xb8\x37\xb5\x67" - "\x3e\xf9\xf1\x30\x0e\x4f\x1d\x10\x57\x26\xdc\x47\xd0\x0f\x9f\x66" - "\x9e\xf8\x73\xbd\xf1\x0c\x67\x5b\xf0\x9d\x7b\x3f\x3a\x07\xe2\x50" - "\x8c\x45\x21\xfe\x8f\xd1\x31\x34\x1e\xb5\x41\xde\x12\x4c\xc7\x58" - "\x15\x78\xb2\x54\x74\x8e\x2d\x99\x93\x47\x65\xf7\xc4\x62\xce\x1f" - "\x60\x7d\x2d\x4f\x55\x63\x9d\x6d\x45\x73\xf2\xb0\x0d\x49\xf1\xac" - "\xad\xde\xd2\x5e\x8d\x5c\xaa\x5e\x89\x71\xf4\x13\x4f\x87\x16\x13" - "\xd6\x56\x3c\x27\xcf\xb3\x36\x3c\xc1\x3d\xff\x04\x7d\x85\xd3\xc6" - "\x31\x73\xf2\x70\xaf\xe7\x8d\x89\x03\xbd\x7e\x57\xc4\x56\x9f\x1d" - "\x3b\xc7\xd0\x9e\xfe\xc4\x22\x61\x2f\x5d\x0f\xcb\x5d\x24\xb4\xbd" - "\x84\x6f\x3b\xc8\x8b\xdb\xb3\x67\x62\x1e\xb7\x97\x37\xfc\x7e\xc2" - "\xe5\x5e\x9f\xc0\x23\x35\x78\x2d\xb4\x3d\xb8\x54\x90\x93\xc5\x88" - "\xfb\x98\x0f\x3f\xc9\xfc\x6e\x72\x68\x42\x35\xe1\xd6\xed\xcf\xcc" - "\xad\xf1\xac\x5e\xbf\xe3\x9e\x7f\xaf\x83\x7e\x4a\xa8\xe5\xef\x2c" - "\xe5\xbd\xdf\xcd\x9b\xc1\x97\x87\xe7\x04\x5d\x95\xf0\xfd\x07\x19" - "\xf7\x70\xb9\xff\x81\xa8\x5d\xaa\xee\xed\x9a\x3a\xbc\x0f\xed\x6a" - "\xea\xde\xae\xa9\x93\xfb\xb7\x5d\x53\x83\xdd\x68\x97\xda\x49\xbb" - "\x7e\x94\xdf\xae\xa9\xfb\xba\xb7\xeb\xc9\xe1\xfd\xdb\xae\x27\xfd" - "\xdd\x68\x57\x60\xf7\x76\x3d\xf9\x91\xfc\x76\x3d\x99\xe1\xa4\x5d" - "\x3f\xf6\x73\xbb\x8c\x1e\xf3\x61\x56\x81\x8a\xf2\xe1\xef\x37\x79" - "\xce\x87\xbf\x8f\xec\xce\x87\x4f\x7d\x6c\xe7\xc3\xa7\x3e\x90\xc5" - "\x87\x59\x91\x7c\x4c\xf1\xd4\x9b\xdd\xf8\x30\x23\x32\xcc\x39\x1f" - "\x3e\xf5\x02\xc7\x87\x99\x91\x61\x9e\xb5\xe1\xa9\x71\x5d\x7c\xe8" - "\x13\x19\x26\xe1\x43\xdf\x02\x55\x7b\xfa\x53\x09\xf2\xf8\xf0\xa9" - "\x84\xee\x7c\xf8\xfb\x26\x29\x1f\x3e\xe5\xf2\x59\x67\x36\x63\x53" - "\x88\x33\x3e\x0c\xb5\xfc\xcc\x52\x6c\x6c\x0a\xf1\xac\x3e\x21\x2e" - "\xdf\xff\x06\xcc\x37\xf4\x7c\xaf\xdc\x06\x0f\xef\x15\xef\xf2\x5e" - "\x5e\x9f\x94\x43\x9c\xa1\x7a\x73\x0b\x61\x4e\x24\x10\xa6\x2e\xa0" - "\x11\xfa\x01\x66\x72\x8f\x16\x30\xb1\x96\x4c\xa9\x2b\x6a\x23\x75" - "\x01\x27\x08\x3b\xe4\x93\x72\xf6\xdd\x88\xb0\xe0\x58\xc4\xe6\xd3" - "\xf7\xd6\xc7\x99\x3d\xc4\x66\x88\x45\xc0\x66\x9d\x05\xb0\xb9\x12" - "\xf1\xf8\xcc\xbc\xfa\xb6\x93\x3c\x36\x9f\x99\xde\xa5\x9f\xb5\x14" - "\x9f\x4e\xb1\x09\x36\x21\xc5\x66\x2e\x1f\x17\x3d\x73\x73\x77\x6c" - "\xe6\x56\x3b\xc7\xe6\xd3\xe7\x28\x36\x73\xab\x3d\x6b\xc3\xd3\xd5" - "\x76\x6c\xe6\x56\x4b\xb0\x79\x67\x44\x58\x7b\xfa\x33\xfe\xf2\xb0" - "\xf9\x8c\xbf\xd0\xf6\x62\xbe\xed\x70\xaf\x78\x29\x36\x9f\x09\x73" - "\xa9\xc3\xb4\xbd\x46\xe0\x43\xef\x93\xcc\x1f\xd4\x56\x88\x5b\x6d" - "\x69\xd6\x10\xe8\x77\xb5\xe3\x9e\xf1\x2c\x13\x44\xd8\x55\x1a\xef" - "\x76\xe8\xff\xb6\xb7\xc7\x78\xb1\x43\x3f\xb9\x8f\xed\xf4\x27\x50" - "\x77\x3f\xb6\x5d\xe3\x0b\x32\x1b\x07\x9f\x23\x8a\x57\x92\x91\x70" - "\xf8\x17\xf3\x72\x85\xef\x81\xec\x2a\xff\xa1\x59\x2b\xc9\x78\x3f" - "\x13\xf1\x82\x3a\x84\xfb\xa5\xa8\x88\x9f\x85\x8c\xc4\xef\xec\xda" - "\xbf\x68\xa0\x7f\xa6\xc4\xb1\x4f\xdb\x10\xb8\x5f\xbc\x1f\xcb\x2e" - "\xd7\x10\xe8\xab\x79\x81\x0e\xfc\x4b\x19\xb6\xd2\xba\x4a\xc3\xb0" - "\xbe\xf9\x87\xd9\x35\xe1\x5c\x9d\x6c\xe3\x22\x74\x80\x21\x1d\x9b" - "\x14\x83\xf7\x0d\xc6\xbd\x8b\xd9\x3b\x23\x72\xd9\x76\xff\xa1\x99" - "\xe7\xc9\xf8\xd2\x95\x64\x5c\xc9\x4a\xa2\x61\x3b\x35\x0c\xc8\x20" - "\xfc\xa5\x65\x2a\xd4\x7b\x38\xcb\xc0\xbd\x56\xc2\xbd\x2c\xd8\xc7" - "\x83\x7b\x59\xe0\x5e\x3f\xc3\xbd\x4e\xc3\xbd\xd6\xc2\xbd\xd6\xd2" - "\x7b\x79\x26\xf3\x3f\xf4\xb8\xff\x73\xe8\x9b\x63\x71\x2d\xdd\x1f" - "\xfc\xe2\x07\x87\xe0\x78\xf5\xd9\x35\x31\x1e\xe2\xfd\x0f\x2e\xd7" - "\x7f\xde\xb8\x87\x04\xb0\x5e\xed\x21\x33\xde\xfe\x86\xc5\x7e\xf4" - "\xdb\x7b\xc8\x78\xb4\xb9\x3a\xf3\x29\xb0\xb3\xf6\x90\x8f\x35\x6d" - "\x1e\xde\x6b\x9a\xcb\xe7\x1f\xd2\xd7\x42\xbf\xd9\x1b\xfa\xa1\xde" - "\xf9\x8d\x1b\xd7\xb2\xf1\x9d\x01\x73\x2a\x3b\x02\xe6\x34\xbc\x6c" - "\x51\x01\xae\xd8\x78\x75\x2c\x51\x9f\x60\x66\x15\x7f\x76\x0c\x7c" - "\xc4\x8b\xc4\xab\x99\x99\x75\x2c\xe9\x4b\x1c\x6b\x9c\xd6\x2a\x1d" - "\x6b\x9c\xee\x4d\x98\x19\xc0\x10\xa1\x19\x84\x09\xab\x24\x90\x4f" - "\x7a\xcc\xac\xa5\x65\xcd\x78\x21\x74\xfb\x58\x92\x68\x61\x7f\x80" - "\x7e\x6c\x45\x16\xf4\x7f\x43\xef\x52\x18\xaa\x57\xe2\x18\xdc\x8c" - "\x99\x20\xd3\x9f\xc0\x2f\xf9\xc1\xf7\x31\xa0\x3b\xa2\x8d\x25\x37" - "\x9c\x64\x66\x04\x58\xe0\xbb\x9f\x69\x70\x88\x35\x29\x9c\x58\xfc" - "\x0b\x23\x3b\x33\xf2\x2b\xad\xd0\x97\xb5\x79\x59\x43\x70\x1c\xa4" - "\xbe\xcd\x4a\x8a\x00\x77\x2f\x5b\xbd\xd0\x1e\xc2\xab\xe7\x7f\x46" - "\x4e\xc4\x11\x26\xe9\x1c\xf1\x61\xcf\x6a\xbc\x05\x5c\x4f\x6f\xf3" - "\x33\xbf\xd9\xc6\xda\x10\xdf\x38\xee\x00\xe7\x7c\x13\xcf\x81\xaf" - "\x35\xb6\x92\x22\xe8\x37\x5b\x97\xc7\x8c\x30\x9e\x8d\xb9\xa1\xd0" - "\x46\x46\xfa\x9a\x88\xaa\xe8\x0c\x60\x70\x39\xe0\xef\x0c\xe0\xdc" - "\x48\x71\x8e\xef\x0a\x95\x20\xc6\xd7\x7d\x36\xbe\xf4\x0c\xc5\x38" - "\x87\x3b\xc4\xf8\x52\xc0\xdd\x12\x3b\xee\x2c\x67\x01\xe3\xe9\x7f" - "\xa8\x2d\x5a\xcb\xe2\xb8\x08\x53\x7a\x72\x30\x9e\x53\x0c\xbc\x8b" - "\x51\x7f\x16\x66\x26\xf6\x7e\xd8\xac\x2f\x3a\xc6\xcc\x69\x50\xcf" - "\x62\x7f\x6e\x66\x66\x84\x40\xba\x97\xfa\xb9\x5f\xab\x40\xde\x5f" - "\xd0\x31\x8a\x59\xc7\xb0\x9f\x6f\x00\x59\xa0\x5c\xd4\xb3\xc8\xaf" - "\x9b\x99\xe9\x63\x50\x8e\xab\x2a\xc8\x00\xed\xa3\x6c\x0b\xc8\x6c" - "\x1c\x96\x67\x60\xa6\x73\xfd\x2c\x9c\xff\x38\xcc\x8d\x7d\xd2\x6b" - "\xac\x20\x37\x8b\x77\x64\x24\xe8\xbb\xa6\xfa\xb5\x0e\xce\xe6\x50" - "\x8e\x27\x16\x11\xe6\xe5\x36\x90\x95\x15\x64\xd5\xce\x71\x41\x18" - "\xc7\x05\x69\x9f\x8c\x4f\x30\xb0\xb6\xd0\xa8\x01\x6c\xe2\x32\x9c" - "\x7b\xb1\x92\x97\xb4\x84\x7d\xf3\x14\xc8\xcb\xd4\x88\xbc\xe1\x6b" - "\x5b\x45\xb9\x01\xe5\xe5\xd3\x46\x54\x6c\xfa\x85\xe0\x3d\x89\x35" - "\x03\xad\x80\x5f\xe4\x07\xbf\x14\xc5\x10\xb0\x4b\xdf\x0c\xb4\x5f" - "\xb0\x67\xbf\x14\x8e\xaf\xc2\x8b\xc0\x6e\x2d\xab\x34\xb7\x75\xae" - "\xd2\xa8\xe1\x18\x2b\x70\x08\xee\xf9\x55\x8c\xb2\x4d\x9f\x16\x84" - "\xfc\x51\x1f\x6f\x20\x16\x90\xad\x2f\xfa\x9b\x55\x9a\x00\x4e\xc6" - "\xaf\x6a\xc8\x44\x33\x51\x40\x9d\x54\x50\x5f\x52\xba\x80\x78\x1d" - "\x89\x69\x26\x56\xb0\x0d\x41\xee\xd3\x17\xaa\x09\x94\xcb\x7c\xac" - "\xf9\x82\xf0\x32\x53\xb8\xc6\x5d\xd8\x76\x3b\xee\xc2\xb6\xa3\xec" - "\x28\xee\xc2\x2a\xae\x45\xdc\x1d\x0e\xe7\x70\x37\xa0\x73\x0c\x87" - "\xa7\x71\xf5\x96\xbd\x20\xa3\x30\x1c\xdb\x24\x88\x99\x4f\x77\x20" - "\x66\x66\xee\xbf\x52\x31\x73\xa1\x5d\xa3\x86\xe3\xa2\x60\x06\xca" - "\xe5\x30\x83\xb2\x3a\x1c\xde\x41\x04\x19\x71\xb6\x9a\xd6\x1e\xa2" - "\x4e\x22\x8f\x81\xad\x1e\xf3\x4b\x19\x4b\x8e\x70\x72\x9a\x75\x4c" - "\xfd\x1c\x6b\x6b\x66\x66\x9e\x4b\x3a\x4a\x54\x1d\x6b\x59\xb6\xde" - "\xb2\x9b\xd8\xbc\x37\xc5\xe0\x38\x33\xc4\xbf\x95\xc2\x1c\x0e\x8e" - "\xc7\xf9\x69\x89\x92\x1b\x87\xcf\x2c\xa8\xb4\xad\x6f\x0f\x67\x7d" - "\x54\x5e\x38\xf6\x66\x5b\xff\x6f\xb5\xcd\xc7\x2f\xb2\x3d\x7d\xd6" - "\x14\x03\x39\x56\xc9\x8d\x07\x67\xe4\x63\xec\x82\xfc\x1b\x4d\xc7" - "\x8b\x71\xec\x7c\x56\x84\x30\x3f\x81\x9c\xc0\x8f\xcb\xf1\xe3\x76" - "\xb3\x50\x87\x43\x71\xdc\x8e\xe7\x94\xe9\xc2\xb8\x9d\xf0\x1b\xcf" - "\xc3\x75\x61\x38\xe6\x23\xba\xae\x96\xcf\xc7\x5f\x37\xed\x28\x72" - "\xbd\xfd\x3a\xfa\x1b\xfc\x48\x6d\x27\x43\xbc\x9c\xc6\x18\xde\x05" - "\x95\x60\x3f\xca\x13\xcc\x1f\x8f\xc2\x27\x03\x9f\x8b\xe1\x73\x00" - "\x7c\x3e\x82\x65\x7b\xe6\xaf\xfe\xc8\xbd\xff\x09\xed\xb7\xd0\xfb" - "\xff\x91\x7b\x96\x42\x7b\x37\xf1\x39\xc9\x7f\x6f\x4f\xff\x63\x94" - "\x30\xcf\xd2\x95\xbf\x4b\x3f\x7f\xc4\xbe\xcd\x00\xd0\x91\x92\xce" - "\xfd\xd0\xdf\xa2\xf2\x14\xdc\x6f\xa2\x54\x83\x6e\xb4\x38\x47\x0b" - "\xf8\x55\xb4\xb3\x31\x8f\xf2\x9f\x8f\xa0\x7d\xe0\x78\x29\xc6\x6b" - "\x94\x7f\xe9\x3d\xe0\xbe\x4d\x20\x87\x3c\xf1\x7d\x9d\xc9\x03\xce" - "\x99\x5d\x9d\xf3\x4c\x16\xb3\x5d\xbe\xff\xf6\xa4\xc6\xca\x7a\x58" - "\x56\xa4\xcb\x18\x31\x60\x8e\x2e\xb4\xc2\x5a\x6d\xeb\x0c\xf7\xfb" - "\x38\xe1\x94\x87\xf1\xc5\xec\x2a\x57\xe5\x5a\xbd\x37\x25\x5b\x8a" - "\xe6\xe8\x70\x4c\xb2\xae\xc2\x42\xb6\x9f\x6c\x65\x42\xef\x1a\x4b" - "\x7c\x5a\x88\x0a\xe3\xa7\xe9\x6d\x7f\x67\x31\x86\xca\x3a\x49\xc6" - "\x75\xfc\x1c\xee\xd7\x09\xb1\xe0\x86\x93\x64\x8a\xed\x55\xff\xa1" - "\x19\x0b\x88\xb2\x03\xe2\xd5\x8e\x57\x63\xfc\x0e\x37\xb5\x12\xb0" - "\x13\x5d\x9d\xc9\x40\x4a\x20\x2f\xfb\x43\xb8\xef\xd3\x91\xac\xb9" - "\x36\x52\x4f\x42\x35\xd6\xea\xc4\x6f\x89\x0f\x70\x91\xaa\x3e\x7e" - "\x37\xa9\xb7\x9c\x22\x03\xdf\x60\xd4\xf5\x96\xef\x49\xe6\x02\xe0" - "\x30\xe0\xac\xa4\x17\x80\xab\x2d\xe7\x48\xa1\x98\xab\x5f\xdb\x6a" - "\xe7\xea\x9f\x81\xab\xd3\x81\xab\x93\xfc\x49\x9d\xb6\x9a\x00\x77" - "\x0c\x9e\xa1\xf5\x33\x27\x6a\x81\xb3\xdf\x00\xce\x8e\xff\x9e\x70" - "\x7c\xdd\xd6\x4a\x80\x6b\x7d\x8b\x97\x90\x91\x9d\x4b\x81\xb3\x7f" - "\x8e\xb9\x21\x3f\x91\x72\x76\xc1\x12\xe0\xec\xa5\x10\x13\x2f\x01" - "\xce\x6e\x73\xc2\xd9\xa7\x5d\xc4\xc3\x3c\xff\x74\x2c\xd5\x30\x05" - "\x0c\x8b\xf3\x2a\x4c\xfe\x57\x83\x3d\xc4\xc9\x73\x53\x5c\xe9\x00" - "\xe5\x8d\xf2\xb7\x81\x1e\x8e\x80\x0e\xb8\xb8\xd5\x3c\x38\xa4\x13" - "\x7c\x9a\xd5\x57\xd7\xb0\xe3\x64\x23\xe3\x1b\x47\x54\x33\xb4\x7f" - "\x67\x3b\x96\x87\x43\xdc\x1f\xee\x63\xc9\xd8\x94\x9c\x01\x31\xb5" - "\x15\x62\xef\xce\x76\x7f\x2f\x90\x81\xca\xb8\x2a\xc6\x0f\x65\x68" - "\x1b\x03\xfa\x1c\xf4\xdb\x5d\xc0\xa1\x41\xc5\x0b\xc8\xa4\xce\x4c" - "\x9d\x85\xcd\xd4\x19\xad\x99\x3a\x13\x5c\xeb\xfb\x07\x03\xea\xe5" - "\xaf\x84\xcd\xcc\x56\xb1\x59\x39\x0d\x56\x9f\x4d\xc9\x46\x1f\x9d" - "\x19\x7e\x7b\xe1\xf9\xc4\x79\xc4\x27\x54\x73\xa1\x9a\xea\x6b\x1b" - "\x41\x3d\x51\x7d\x1d\x27\x99\xd0\xef\x43\x9f\xcb\xf9\x57\x5e\x67" - "\xd0\x5f\xe0\xe2\x7d\xbb\xde\x1c\x7c\x2c\xaf\xb7\x23\x6d\xd5\x04" - "\xfc\xc9\xe0\x2e\x5f\xcb\xe9\xed\x38\x11\xfc\x2c\xc8\xdb\xb7\x18" - "\x7c\x6d\x67\x7f\xf9\x5a\xbe\x1f\x83\xbe\x16\xfd\x2c\xea\xad\xc0" - "\x63\xbd\x3d\xef\xf2\xf9\xf7\x9e\xf5\x96\x1d\x26\x4f\x6f\x93\x94" - "\x76\xbd\x65\x27\x80\x4e\xb4\xd6\xcc\xec\x38\x07\xbd\xe9\xec\x7a" - "\xcb\x8e\x87\xdf\x69\x76\xbd\x9d\xf3\x40\x6f\x03\xcf\x5c\xbb\x7a" - "\x7b\xc1\xe5\xfa\x47\xbd\xe8\x4d\xa6\xbd\x4d\x8a\x10\xe9\x0d\xec" - "\x2d\x1b\xec\x2d\xdb\xc1\xde\xf4\x22\x7b\xcb\x06\x7b\xd3\x8b\xec" - "\xed\x94\x07\x7a\x1b\xd6\x7c\xed\xea\x6d\x8e\xcb\xf5\x2f\x7b\xd6" - "\x9b\x5e\xae\xbd\xed\xb3\xeb\x4d\x0f\xf6\xa6\x07\x7b\xd3\x3b\xd8" - "\x9b\x5e\x64\x6f\x7a\xb0\x37\xbd\xc8\xde\x8e\x7b\xa0\xb7\xe1\x9f" - "\x5f\xbb\x7a\x9b\xeb\x72\xee\xb0\x17\xbd\xc9\xb4\xb7\xc9\xde\x22" - "\xbd\xe1\xde\xe6\x60\x6f\x7a\x07\x7b\xcb\x11\xd9\x9b\x1e\xec\x2d" - "\x47\x64\x6f\x07\x3c\xd0\xdb\x83\xe9\xd7\xae\xde\x5e\x72\xf9\xfe" - "\x73\xcf\x7a\xcb\x91\x69\x6f\x93\xa3\xec\x7a\xcb\x01\x7b\xcb\x01" - "\x7b\xcb\x71\xb0\xb7\x1c\x91\xbd\xe5\x80\xbd\xe5\x88\xec\xed\x4d" - "\x0f\xf4\x36\xe7\x89\x6b\x57\x6f\x91\x2e\xc7\x3f\x05\xbd\x09\x3a" - "\x43\xfd\x71\x7a\x63\xc3\x89\x05\xe2\xc9\x9d\xf3\xa9\xde\x50\x5f" - "\x9c\xee\xce\x86\xfb\x65\xf2\x3a\xb3\xf0\x3a\x43\xf9\xa1\xde\x30" - "\x8e\xe4\xf4\xa6\x50\xfa\x63\x0c\x69\x81\x58\x52\x88\x23\x9f\x89" - "\x61\xcd\x47\x62\xb6\x76\xc5\x91\x16\xc7\x38\x72\xa1\x38\x8e\xdc" - "\x2d\xd1\x57\xc6\x79\xd0\x17\xc3\xeb\x6b\xae\x8b\x38\x72\xc1\x3f" - "\x5c\xe8\xab\xa1\x57\x7d\x81\x6e\x46\x76\x9e\xa5\xfa\x2a\xe0\xe3" - "\xff\xa2\xd8\x3e\xea\x6b\x39\xe8\x0b\xe3\xff\xe3\x84\x29\x7c\xc9" - "\x53\x7d\xcd\xef\x35\xfe\x77\xae\x2f\x7d\x98\x67\xfa\x9a\xb4\xcf" - "\xae\x2f\xbd\xd6\x02\x3e\x4d\xf0\x67\x76\x7d\x51\x7f\x66\x71\xf4" - "\x67\x0b\xc5\xfe\xcc\x1d\x7d\x39\xf8\xb3\x6b\x4a\x5f\xaf\xb8\x1c" - "\xff\xb7\x42\x5f\xdc\x0a\x3c\x87\xe3\x95\xbe\xad\xd0\x4f\xb6\xb0" - "\x3f\xcc\x30\x41\x3f\xd9\x32\x38\x64\xe3\x12\x32\xae\x73\x15\xf4" - "\x93\x41\x77\x19\x4b\xc8\x94\xf4\x25\x44\x69\x7b\x1d\xfa\xca\x27" - "\xa1\xaf\x0c\xfc\xd4\xf1\x53\x8c\x5f\x6d\xa4\x91\xd8\xa0\xaf\x8c" - "\xe3\x60\x50\xdf\x71\xec\x4f\xd0\x57\x6e\x01\xee\x6b\x29\xa0\x7d" - "\xe5\xef\x85\xbe\xf2\x9f\x25\x7d\xe5\x0d\xaf\xf1\x7d\x65\x5e\xfe" - "\x45\x62\xd9\xbf\xb8\xc3\x45\x5f\xb9\xa6\xd7\xbe\x32\xf6\x91\x0b" - "\xb1\xbf\xfc\x73\xcc\x88\x7c\x9e\xdb\x0a\x4e\xf7\xb1\xaf\xfc\x33" - "\xf4\x95\xd7\x52\xd9\x17\x78\x2c\xfb\x68\x97\xcf\x7f\xa0\x6d\xa0" - "\xbd\x74\xf9\x22\x90\xb3\xe0\x83\x3a\xc1\x07\xe1\x78\x46\x47\x86" - "\xee\x18\xe0\x95\xb3\x0f\xce\x27\xad\xf2\xf7\x42\xdb\x40\x3b\x41" - "\xdb\xe0\x7c\x11\xf0\x20\xf8\xa2\xfd\x25\xaf\x91\x49\xa5\xaf\x91" - "\x20\x8b\x8f\xb4\x8f\xfc\x4c\x14\xea\xc3\xce\x6d\x36\x47\x6e\x8b" - "\x16\x73\xdb\x9f\xbb\xfb\xa2\xde\xb8\xed\x35\x57\xb6\x52\xd3\xab" - "\xad\xa0\x8d\x70\xfe\x08\xec\xe5\x62\xd8\x4a\xc1\x7f\x3c\xd5\xd7" - "\xab\x2e\x9f\xff\x70\x4f\x5f\xd9\xb3\x7b\xd7\x57\x76\x18\x3b\xe8" - "\x21\x95\x5d\x5f\xd2\xbe\xb1\x48\x5f\x3a\xbb\xbe\x44\x7d\xe3\x68" - "\x71\xdf\xd8\x1d\x7d\x39\xf6\x8d\xaf\x25\x7d\xc5\xd4\xf4\x51\x5f" - "\x6e\xd8\x57\x36\xd8\xd7\x43\x51\x22\x7d\x49\xfa\xc4\x76\x7d\xe9" - "\x45\xf6\x25\xea\x13\x47\x8b\xfb\xc4\xee\xe8\xcb\xb1\x4f\x7c\x2d" - "\xe9\xeb\x35\x97\xcf\x7f\xb8\xa7\x2f\xbd\x1b\xf6\xa5\x47\xfb\xaa" - "\xb2\xeb\x4b\xda\x17\x16\xe9\x4b\x64\x5f\xa2\xd8\x21\x5a\x1c\x3b" - "\xb8\xa3\x2f\xc7\xbe\xf0\xb5\xa4\xaf\x45\x9a\x3e\xea\xcb\x0d\xfb" - "\xd2\x83\x7d\x3d\xec\x2d\xd2\x97\xa4\x0f\x6c\xd7\x57\x8e\xc8\xbe" - "\x44\x7d\xe0\x68\x71\x1f\xd8\x1d\x7d\x39\xf6\x81\xaf\x25\x7d\x2d" - "\x6e\xec\x9b\xbe\x72\xdc\xb0\xaf\x1c\xb0\xaf\x87\x23\xed\xfa\x92" - "\xf6\x7d\x45\xfa\x12\xd9\x97\xa8\xef\x1b\x2d\xee\xfb\xba\xa3\x2f" - "\xc7\xbe\xef\xb5\xa4\xaf\xa5\x69\x3d\xf5\xa5\xc4\x7d\x28\x4b\x92" - "\x5d\x5f\xa8\x9b\x4e\xe8\x3b\x75\x7a\xeb\x8e\xb9\xee\x3f\x4d\xde" - "\xef\xaa\xbf\x8b\x6b\xd7\x3c\xd3\x8a\xef\x83\xd0\x98\x90\x75\x88" - "\x09\x8f\xc4\xec\x20\xd2\x3e\xef\x81\x6e\x7d\xa8\x4e\x61\x8c\x62" - "\x9e\xab\x3e\xef\x5f\x65\xf7\xa1\x50\x4f\xd8\x8f\xb2\x2c\x07\x3d" - "\xf1\x71\x7c\x61\x1f\xc7\x28\x3a\xcf\x6a\x98\x42\x88\xe3\x13\xe6" - "\x41\x1f\x6a\xbe\xa7\x7a\x5a\x16\xe8\x4a\x4f\x38\x4e\x84\x7d\x5e" - "\xec\x4b\xe1\xbc\x63\x5d\x4b\x2b\x49\x5f\x49\x54\xdc\xdc\x63\xab" - "\x74\xee\x71\xe3\x09\xe8\x53\x2d\x05\xbd\x75\x86\x93\xac\x13\x64" - "\x4a\xc6\x6b\xb4\x4f\x25\xf4\xa7\xea\x4c\x66\x6e\xee\xb1\xde\x62" - "\x20\x4f\x1b\x58\x73\x29\xe4\xc7\x7e\x54\x6d\x64\x01\x41\x5b\x49" - "\xfa\x96\xf8\xa0\x0e\xa0\x0f\xc6\xe9\x43\xdc\x87\x2a\x11\xcf\x37" - "\x2e\x70\xd5\x87\xea\x7d\xbe\xb1\xe8\x34\xed\x3f\x71\xf3\x8d\x57" - "\x44\x1f\x2a\xd6\xe5\xfc\xc7\xf4\xed\x74\xbc\x01\x65\x5f\xaf\xb1" - "\x10\xc0\xd3\x0f\x7e\x6d\x74\x5c\xcf\x92\xa5\x6b\xc0\x3e\x2d\xf6" - "\x67\xeb\xe3\x6b\x48\xfa\x6a\xa2\xea\x68\x0f\xf7\x83\x3e\xaa\x8f" - "\x05\xb8\x6e\xc3\x49\x2a\x7b\x7c\x47\xcc\xf8\x7a\x0c\xf7\xac\x0c" - "\xf6\x65\xd1\x56\xb8\x39\xc7\xf9\x24\xa8\xa8\x99\x4c\xe2\xec\x03" - "\xec\xc2\x92\xb9\x29\xd9\xe6\xa3\x33\xa1\x9d\x3c\xdd\xc4\x9a\x51" - "\x07\x68\x1f\x87\x9b\x50\x37\xbb\x49\xd2\x71\xaa\x1b\x4e\x2f\x8c" - "\x74\x2e\xb8\xbb\x6d\x7c\xee\x42\x3f\x55\xee\xe9\x67\xa9\x54\x3f" - "\xc5\x72\xe7\x83\x85\xe7\x23\x97\x6a\x98\x62\x7e\x3e\xb8\xe0\x45" - "\x4f\xf5\x13\xd7\xed\xfd\x67\xf7\xf4\x93\x1d\x26\x4f\x3f\xd9\x5a" - "\x6e\x6e\x51\xaa\x9f\x34\xaa\x9f\xec\x38\xec\x2b\xd9\xf5\x73\xce" - "\x4d\xfd\x38\xf4\x91\xae\x29\xfd\xac\x70\x39\xfe\xd3\x8b\x7e\x64" - "\xda\x4f\xb6\x91\x9b\x43\x94\xe8\x47\xcf\xdb\x4f\xb6\x09\xfb\x46" - "\x76\xfd\x9c\x72\x53\x3f\x0e\x7d\xa2\x6b\x4a\x3f\xab\x5c\x8e\x7f" - "\xf7\xac\x1f\xbd\x4c\xfb\xd1\x6b\xb9\xb9\x42\xa9\x7e\x78\xfb\xd1" - "\xc7\x61\x5f\xc8\xae\x9f\xe3\x6e\xea\xc7\x71\xfc\xf4\x5a\xd2\xcf" - "\x1b\xe3\x65\xea\x47\xa6\xfd\xe8\x8d\xdc\x9c\xa0\x44\x3f\x39\xbc" - "\xfd\xe8\x4d\xd8\xf7\xb1\xeb\xe7\x80\x9b\xfa\x71\xe8\xf3\x5c\x53" - "\xfa\x59\x5d\x2b\x4f\x3f\x39\x32\xed\x27\x47\xcb\xcd\xfd\x49\xf5" - "\xc3\xdb\x4f\x4e\x1c\xf6\x75\xec\xfa\x79\xd3\x4d\xfd\x38\xf4\x71" - "\xae\x29\xfd\x24\x2c\xea\x6d\xbe\x48\x88\x9d\xc5\xf3\xb2\x9d\x10" - "\xbf\x61\xfc\x8c\xb1\x73\x9d\xa9\x8a\x58\x96\x52\xdd\xa4\x9f\x27" - "\xaa\x0c\x5e\x37\xdc\x9c\xec\xeb\x74\x4e\x96\x8b\xdb\xd6\xfd\x76" - "\x17\x9b\xa2\xf4\xc7\xb8\x8c\x9b\x77\xe5\xe6\x26\x3e\xc6\xb1\x54" - "\xaf\x4e\x51\xfc\x86\x7d\x54\x88\xbd\x09\xf6\x53\x93\xbe\xf7\x20" - "\x6e\x9b\xef\x4a\x2f\xbd\xcf\x4d\x14\x89\x9e\xe3\x13\xfa\x9e\xfd" - "\xaa\x17\x8f\xe7\x5d\x13\x5d\xee\xff\xd4\xb3\x5e\xf4\x61\x9e\xe9" - "\x05\xfc\xcd\xba\x49\xfb\xa8\x5e\x8e\x3b\xe8\x45\x9f\xd6\x29\xf2" - "\x3b\xee\xeb\xc5\xc1\xdf\x5c\x53\x7a\x49\x2a\x72\xd9\xd7\x04\x5e" - "\x42\x9d\xe0\xf3\xdd\x1b\xe7\x93\x71\xe9\xcd\x64\x4a\xe7\x4f\xfe" - "\x43\x67\x00\xcf\x75\xbe\xee\xef\x55\x07\x1c\x97\x68\x62\x7f\xf0" - "\x35\x0d\x0e\xf9\xec\x98\x91\xd4\x45\x1a\x48\xc7\xaa\x70\x92\x79" - "\x12\x9f\x55\xaf\x22\xeb\x63\xb1\x2f\xbf\x97\x1c\x6e\x3a\x43\x66" - "\x54\xb0\x9d\xf5\x6d\x55\xa4\x7a\xf5\x5e\xc2\xbe\xae\x19\x5a\x0a" - "\x79\x5e\x06\x19\x9e\x66\x92\x67\x5f\x80\xfe\xe8\xc4\x78\xa2\x9a" - "\xd6\xc6\x9a\xeb\xda\x3e\x23\x85\x70\xaf\x8f\xe3\x09\x41\xf9\xa2" - "\x4e\x32\x5f\xc3\xfe\xe7\x01\xaa\x93\x99\x54\x27\x05\xa2\xfe\xa7" - "\x1a\xce\x9f\xd0\x82\x3e\x7e\x71\xd0\x47\x53\x2b\x01\xf9\x0e\x9e" - "\x61\x02\x7d\x98\x04\x7d\x9c\x22\x89\xcb\x50\x1f\x86\xae\xe7\x5d" - "\x3b\x78\x7d\x14\x21\x7f\x69\x89\x2a\x5f\xe8\x7f\x9e\x16\xe9\x43" - "\x78\x27\x4b\xac\x0f\xa1\xef\xbf\x0a\xf4\xb1\xd2\xde\xff\xbc\x00" - "\xfd\xcf\x7c\xe8\x7f\x26\x1d\x25\x4c\x7e\xa2\xa7\xfa\x48\x71\xe9" - "\xff\x05\x5d\xa0\x6f\xe9\xf4\xd5\x35\xa0\x1e\xea\xe3\x2b\x09\xea" - "\x04\xfd\x89\xf5\x27\x7f\xaf\x84\x38\xb0\x1d\xc3\xe0\x90\x0e\x16" - "\xfa\xfc\xd0\xdf\xaf\x8f\xf8\x8a\xe0\x98\x01\xd5\x41\x67\x67\xbd" - "\xb1\x8a\xa0\xec\xab\x57\x7f\xc5\xe9\xe1\x34\x93\x72\xec\x25\x13" - "\x61\xee\x01\x1c\x42\x7f\x5f\xf5\x32\xbe\x97\x0b\xdc\x56\xb8\x80" - "\x4c\x9a\xa6\x65\xcd\xd8\x37\x45\x1b\xc2\x67\x4f\x90\xd7\xea\xb4" - "\xff\x20\x38\xae\xd3\xe9\xb3\x29\xf9\xe3\x38\x42\x90\xdf\x50\xee" - "\x03\x57\xd8\xf5\x84\xcf\x93\x70\xba\x7a\xd6\x8d\xe7\x5c\xc5\xfa" - "\x8a\x30\xb8\xf5\x7c\x72\x07\x3f\x5e\x50\x24\x8c\xa9\xc9\x1d\x2f" - "\x10\xc6\xd4\x7e\xa6\xcf\x93\x24\x7d\x01\xf6\xe3\xb1\xbe\xd6\x36" - "\xb9\xa7\xaf\xec\x30\xcf\xf5\xd5\xee\x44\x5f\x6f\xa5\x76\xd7\x57" - "\xb6\xd6\xae\xaf\x49\x4a\x91\xbe\xd2\xa8\xbe\xb2\xe3\xec\xfa\xca" - "\x8e\xef\x5d\x5f\x3d\x3c\xdf\x7a\xd5\xeb\x2b\xd5\x65\xff\xc7\x41" - "\x5f\x32\xec\xeb\x67\x27\xfa\x7a\x3b\xc8\x89\xbe\x44\xf6\x35\x29" - "\xc2\xae\x2f\x3d\x6f\x5f\xd9\x22\xfb\xca\x76\xc3\xbe\x7a\x78\xae" - "\xf5\xaa\xd7\xd7\x3a\x97\xcf\xff\x48\xf5\xa5\x97\x61\x5f\xdf\x38" - "\xd1\xd7\xba\x96\xee\xfa\xd2\x8b\xed\x6b\x9f\x48\x5f\xbc\x7d\xe9" - "\x45\xf6\xa5\x77\xc3\xbe\x7a\x78\x9e\xf5\xaa\xd7\xd7\x7f\xf5\xf8" - "\xfc\x8f\x48\x5f\x32\xec\xeb\xef\x4e\xf4\x95\x96\xeb\x44\x5f\x22" - "\xfb\x9a\xec\x6d\xd7\x57\x0e\x6f\x5f\x7a\x91\x7d\xe9\xdd\xb0\xaf" - "\x1e\x9e\x63\xbd\xea\xf5\xb5\xde\x65\xfc\x27\xd5\x57\x8e\x0c\xfb" - "\x4a\x72\xa2\xaf\xf4\xa9\xdd\xf5\x95\x23\xb2\xaf\xc9\x51\x22\x7d" - "\xf1\xf6\x95\x23\xb2\xaf\x1c\x37\xec\xab\x87\xe7\x57\xaf\x7a\x7d" - "\x6d\x70\x39\xfe\x2d\xd6\x57\x47\x96\x10\x1f\x56\x48\xf5\x05\xf1" - "\xba\x5f\x0b\xed\x5b\x09\xfa\x72\x1d\x1b\x6e\x30\x76\xe9\xea\x7b" - "\x7b\x6c\xc8\xe9\x89\x9f\xa7\x40\xfd\x60\x8c\x88\x31\x61\x47\x26" - "\xd5\x11\xce\x01\xf6\x18\x17\xba\xf3\xfe\x93\x0c\x3d\x09\xfd\xaa" - "\x7e\xd7\xd3\x97\x72\xf4\x94\xe1\xf2\xfd\x27\xa9\x9e\x04\xbf\xe5" - "\xae\x9e\x9c\xf9\xac\xcc\xbc\xee\x7a\xd2\x6b\xed\x7a\xa2\x7e\x0a" - "\x7d\x17\xfa\x2a\xa9\x9e\x7a\xf0\x57\xee\xbc\x7f\x71\xd5\xeb\x29" - "\xcb\x25\xff\xe9\x18\x5b\x25\x1c\x55\x70\x54\xc3\x51\x63\x65\xc8" - "\x93\xc5\x8c\xad\x01\xf3\xe3\x3a\x7f\xc5\x6b\xbb\x9d\x1f\xc4\x0e" - "\xba\x69\x1a\xe6\x01\xd9\x72\xef\xb7\x0a\x65\xb0\xe9\x04\x65\x57" - "\xed\xa3\x88\x24\xc5\x34\xef\x60\xa1\x2c\x9f\x14\x12\x2c\x94\x05" - "\x6d\x4a\x06\x59\x57\xfb\xa5\x04\x0f\x82\xfc\x35\x6c\xfa\xec\x91" - "\x90\xd7\x8b\x2b\x33\x45\xc9\xbd\x2b\x22\xe4\xb5\xae\x55\xe0\xfb" - "\xe1\xd5\x7e\x0a\xc8\x4b\xcb\x1c\xc2\xe7\x53\xdb\xd6\x12\x35\x57" - "\x4f\x86\xc1\xfb\x39\xd6\x73\x28\x9f\x6f\x9c\xb8\x8e\x3e\x29\xc1" - "\x5c\x79\x7c\x9e\x61\x2c\x63\x34\xf3\x6d\xd1\x88\xf3\x59\x9f\x20" - "\x58\xa6\x90\xcf\x9b\x2f\x6b\xbc\x24\xcf\x56\x42\x70\x3f\x5a\xae" - "\x7e\xf1\x0c\xe1\xeb\xe7\x83\x79\xad\x43\x67\xb5\x5a\x15\xca\x40" - "\x1b\x43\x02\x25\xd7\xac\x23\x5c\x7e\x3e\xaf\x2f\x97\x77\xd0\x94" - "\x32\xc8\x1b\xc4\xcb\x5c\x29\x96\x39\x9f\xcf\x4f\x90\xa3\xf8\x9c" - "\x75\x2d\x83\x65\xe1\x79\x15\x3b\xe8\xe1\x7d\xd0\x86\x29\x42\x3e" - "\xe1\x7e\xf5\x31\x84\x70\x79\x19\x72\x2f\xaf\x93\xe1\xd0\x8e\x60" - "\x21\x1f\xae\xa7\x20\xe4\x4d\xb2\x92\x9b\x4b\xed\xb2\x19\x61\x4d" - "\x9f\x5d\x61\x4d\x51\x4e\x75\x2c\xd3\x2f\x45\x61\xc0\x7c\x47\x5a" - "\xb9\xb2\x51\x7f\x11\x90\xff\x06\x5e\x46\x21\x54\x27\xaa\x2e\x9d" - "\x58\x19\x0b\x9e\xab\x2e\xa1\x75\x1d\xc9\xe7\x9b\xd6\x3d\x9f\x52" - "\x9c\xef\x46\x2a\xc7\xc8\x63\x20\x9b\xb0\xee\x79\xbd\xc4\x79\x47" - "\xd1\xbc\xcf\xa5\x42\xde\xd9\xdd\xf3\xaa\xc4\x79\x6f\xa2\x79\xc3" - "\xa7\x40\xde\x70\x27\x75\x1d\x21\xca\xeb\x4f\xf3\xbe\x60\x82\xbc" - "\x11\xdd\xf3\xaa\xc5\x79\x6f\xa6\x79\xe7\x63\x1d\x22\xbb\xe7\x0d" - "\x16\xe7\x1d\x4d\xf3\xce\xd9\x05\x79\xa3\xba\xe7\x4d\x16\xe7\xfd" - "\x15\xcd\x3b\x37\x0a\xf2\xc6\x38\xe6\x2d\xa5\xba\xbd\x8d\xd7\x6d" - "\x00\xcd\xfb\x72\x00\xe4\x5d\xe4\xa4\x6d\x03\xb8\x72\x69\xde\x31" - "\x34\xef\xb3\x04\xf2\x6a\x9d\xe8\x42\x9c\x77\x2c\xcd\xbb\xb4\x01" - "\xf2\xc6\x39\xd1\x85\x38\xef\x2d\x34\x6f\x74\x25\xe4\x8d\x77\xa2" - "\x0b\x7b\xde\xa1\xaf\x46\x42\x9e\x04\x68\x67\x83\x13\xd9\x8a\xcb" - "\xbc\x95\x96\xb9\x50\x05\xf9\x93\x9d\xc8\x56\x9c\xf7\x36\x9a\xf7" - "\xb5\x6a\xc8\x9b\xea\x44\xb6\xe2\xbc\xb7\xd3\xbc\x8b\xb4\x90\x37" - "\xad\x7b\x5e\xb0\x37\x2a\xdf\xfb\x78\xf9\x8e\xa3\xf9\x97\xa8\x21" - "\x7f\x86\x13\xf9\x62\x79\x82\xcd\xde\x41\xf3\x46\x05\x41\x5e\x9d" - "\x13\xf9\x8a\xf3\xde\x49\xf3\x26\xec\x83\xbc\xb9\x4e\xe4\x2b\xce" - "\xfb\x6b\x9a\x37\x16\x31\x99\xe7\x44\xbe\xe2\xbc\x1a\x9a\x37\x2e" - "\x17\xf2\x16\x39\xa9\xef\x6d\xa2\xbc\x77\xd1\xbc\x2b\xb1\xbe\x65" - "\x4e\xf4\x21\xce\x7b\x37\xcd\x9b\x38\x0d\xf2\x96\x3b\xd1\x87\x38" - "\xef\x6f\x68\xde\x55\x68\xc7\x15\x4e\xf4\xd1\x95\x17\xfc\xc2\x78" - "\xeb\xd0\x37\xe2\x4a\x31\xbf\x42\xc9\x3d\xa3\xc2\x32\xdc\xfa\xfe" - "\x5c\x5e\xc0\x49\x35\xcf\x77\x13\x68\x99\x6b\x46\x42\xbe\x4a\x42" - "\xd7\xf3\xab\x3c\x62\xe6\xf8\x08\xfc\x8b\xe5\xfe\x52\x3b\x77\xdf" - "\x43\xf3\x2e\x8b\x87\xbc\xfb\xc4\x1c\xca\x32\x4a\x71\xbe\x89\x34" - "\xdf\x06\x94\x55\x95\x34\x9f\x97\x3d\xdf\xd0\x94\x38\x38\xbf\xbf" - "\xc4\x81\x8f\xa1\x9e\xe2\xb2\xee\xa5\x65\xbd\x35\x0e\xf2\x56\x4b" - "\xf3\x59\xee\x13\xe5\xbb\x8f\xe6\x4b\x45\xd9\x1c\x92\xe6\x53\x8b" - "\xf3\xdd\x4f\xf3\x65\x22\x67\xd5\x48\xf3\x05\x8b\xf3\x05\x59\xd3" - "\xd7\xa5\x72\x79\x53\x94\xb5\x8e\xf2\x03\x59\xdf\x27\xf2\x69\x0f" - "\x58\xd3\xd3\x82\xf8\xbc\x0d\x82\x0c\x39\x39\x53\xcc\x33\x3c\xe6" - "\x1f\xb4\xa6\xaf\x6f\xe1\xf3\x1d\x13\xfb\x01\x91\xaf\xfd\x2d\x3b" - "\x34\xa9\x85\xf7\xa3\xdc\xf3\x92\xc0\xef\x4d\xce\xe2\x0d\xed\xdd" - "\x64\xd8\x49\xe6\xbf\x8b\xa8\xef\x11\xd6\xd4\xcf\xe3\x6c\xcf\x56" - "\x34\xa7\x32\xd4\xc4\x5a\xc4\x69\x1b\x19\xb6\x61\xa2\x89\x28\x71" - "\xfd\x24\xd6\x27\xbf\xd1\x00\xe9\xc6\x31\x73\x1a\xda\xd3\xff\xbb" - "\xc2\xa0\x78\x30\x17\xd7\xf2\x80\xef\xfb\x0c\x24\x8d\x5b\xf7\x79" - "\xe3\x5a\x88\x07\x99\x60\x05\xae\xc1\x5c\x0a\xdf\xb3\xe0\xe0\xd6" - "\x3d\xd6\x12\x86\x5d\x47\x82\xab\x57\x5a\xc8\x89\x78\xc2\xd8\xb2" - "\x22\xb5\xea\x58\x5c\x4f\x24\x4f\xc1\xae\x8a\x99\x02\x75\xd1\xc1" - "\x7d\xa3\x9a\xe1\x37\x57\x17\x68\x3f\xf8\xc6\x8c\xea\x58\x5c\x63" - "\x28\xef\x01\xa3\x4f\x81\x8e\x7d\x6b\xce\x8f\xda\x44\x72\xcb\x49" - "\x26\x2f\xe8\x2c\x70\xc3\xd9\x55\x31\x8f\x62\x19\x36\x9f\xc8\x0c" - "\xc8\x13\x87\x6b\x91\xb0\x79\x85\x5a\xba\x4e\x49\xde\x7a\xae\xfe" - "\x6b\xd9\x06\x36\x60\x4e\x99\xad\x23\x35\x19\xf7\x6f\xa8\x4e\x3c" - "\x49\x9a\x45\xe7\x8c\x37\x17\x72\x6b\x98\x60\xbb\xa0\x8d\x65\xed" - "\xe9\x79\xc9\x06\xc5\xa8\x6a\xba\x46\x49\x9e\xcb\xfd\x41\x21\xb6" - "\xf6\x63\x33\x23\x2b\x20\x7f\x25\xc4\x77\x4d\x54\x0e\x79\xfb\x0d" - "\x0a\x1f\xe1\x7b\x8d\x41\x31\xdc\x9f\xff\x7e\xcc\xa0\x18\x6f\xe2" - "\xbf\x1b\x84\xb5\x57\x9c\xaf\x05\x13\x99\x00\xed\xce\xb5\x15\x86" - "\x7b\x61\x3c\x8a\xeb\xb2\xb1\x3e\x91\x09\xea\xb1\xb8\x5f\x47\x7e" - "\x3c\xdc\x33\x97\xae\xa7\x99\xff\x08\x7c\xfa\xf1\x9f\x46\xfe\x93" - "\xc5\x3c\x9c\x6e\x03\x22\xd4\x6c\x46\x6e\x0c\xb6\x39\xd1\xca\xda" - "\xa0\xdc\x2a\x36\xad\xa1\xa1\x3e\xbe\x95\xd0\x75\xa8\xf3\x17\x72" - "\xeb\xe2\xa0\x5c\x41\xf6\xec\x90\x86\x06\xee\x5e\x99\x05\x3a\x71" - "\xbd\x70\x01\x97\xc0\x7b\xef\xbb\x3f\xe8\x81\x07\x7f\x3b\x69\xf2" - "\xbc\xf9\xaf\x44\x45\x2f\x78\x35\x66\xe1\x6b\xaf\x2f\x5a\xbc\x64" - "\xa9\x76\x59\xec\xf2\xb8\x15\x2b\x57\xc5\xbf\xb1\x1a\xf3\x75\xb5" - "\xa1\x70\xaa\xc2\xc4\x10\xb8\xcf\x13\x78\x1f\x6e\xdf\x3b\x4c\xa3" - "\x7a\xc9\xaf\x55\xaa\x9d\xcb\xb4\xde\x9f\x10\x5c\x97\xb9\x8d\x29" - "\xb8\x0b\xd7\x88\x06\x0c\x28\xea\x8b\x9e\xaa\xc6\x3d\x06\x5a\x98" - "\x82\x80\x3a\xe3\x53\xd5\xb8\xc7\xc5\x41\xff\x56\x32\xee\x36\xdc" - "\x87\xa0\xc0\x0b\xcf\x97\xde\x49\xc8\x21\xb8\xd6\x59\x99\xb7\xa9" - "\x88\x7f\xce\x28\xd6\x98\x3b\x8a\x6d\xc3\xf2\x73\x37\xb3\xad\xc6" - "\x35\x31\x24\x0b\x7e\x03\x76\x54\x27\x98\x82\xe3\x07\x21\xe2\x85" - "\x58\x36\xa0\x64\x33\xdb\x92\x3a\x8a\x6d\x79\x6b\x33\xdb\x56\x3a" - "\x8a\x35\x8c\xcb\x25\xde\xed\xe9\x05\x3a\x03\x93\xcf\xad\x1b\xbd" - "\x11\xce\xdb\x86\xe6\xa7\x6d\x84\x73\x13\x2d\x64\x40\x29\xfc\x86" - "\x34\xd3\x41\x35\xad\xf7\xfb\x67\xcc\x03\xa1\xbc\x38\xb6\x73\x91" - "\x22\x0b\xee\x43\xf5\x54\xa8\x38\x04\x1a\x81\xfb\x19\xeb\xcd\xcd" - "\x80\xb3\x42\x6e\xed\x75\xb8\x9f\x5f\x7d\x5e\x1b\xc1\xf2\xf6\xc4" - "\x9a\x07\x2e\x1f\xcd\x5a\xe0\x5a\x83\x6d\xcd\x22\x85\x81\x29\xd8" - "\x0f\x65\x9b\xc4\xed\xd1\x2c\x58\x1c\xa7\x5e\xb2\x62\xd1\xa2\xbb" - "\x86\x12\x0d\xf7\x29\xd9\x1f\x23\x0e\xca\x23\x39\x9b\xd9\x43\xd0" - "\xce\x6a\x68\x6f\xcd\x11\x88\xba\x01\x33\x04\xda\xa4\x83\x3a\x3c" - "\x0b\xe9\xfb\xe1\xfb\x7e\xa8\x7b\x0d\xdd\x53\x61\x57\x0a\x9b\x5e" - "\xe8\x0d\xf5\x44\xde\x57\xe3\x7a\x55\x67\x57\xcd\x56\x40\xbb\x73" - "\x21\x5f\x8d\x7a\x34\xb9\x03\xae\x3b\x0e\xf5\x28\x87\xef\x98\x9f" - "\xb3\x19\xc8\x7f\x88\xb6\x6b\xd7\x32\xfc\x0d\xb2\xaa\x2e\x1e\xc5" - "\x66\xb4\xa7\x17\x56\xe1\x7a\x76\xdc\x3a\xdf\xf0\x1b\xe4\x52\x03" - "\x79\x75\x67\x93\x66\x2b\xa0\xff\xa5\x28\xb5\x97\x99\x86\x75\xc2" - "\x7a\x60\x1f\xf0\x30\x44\x5f\xb6\xce\x70\x32\xc1\x4c\x14\x87\x5b" - "\x08\x29\xda\xcc\x96\xc1\x51\x04\x47\xde\x67\x70\xee\x53\x38\x6a" - "\x20\xbd\x16\x3e\x3f\x83\xcf\x4f\x5b\xb8\x39\x3b\x7f\xac\xf7\xf2" - "\x04\xb6\x75\x62\x1e\xb9\x1d\xcb\x07\x6c\x3d\xdf\xcc\xec\x6c\xc4" - "\xba\xe3\xda\x91\xec\xd0\xa2\x69\xd2\x35\xf6\x8a\xab\x09\x9c\x87" - "\xcf\x63\xf4\x53\x7c\x94\x04\xc0\x31\x85\xff\x9e\x0a\x79\x76\xf1" - "\xdf\xf3\xe0\x28\xef\xfd\x70\x2c\xcf\xd5\x51\xaa\x72\x3f\xaf\x3b" - "\xc7\xae\x69\xee\xe5\x2b\xab\x21\xcc\x3b\x6a\x38\xc2\xa5\xe9\xef" - "\x04\xd2\xb4\xf7\x2c\xf4\x77\x85\x17\xff\x19\x04\x07\xc8\x69\x3b" - "\x94\xbf\x5d\x4b\xd3\xb6\x27\xc0\xe7\x21\x38\x1a\xa4\xf7\xdf\x05" - "\xd7\xef\x8a\x42\x7d\x76\xae\x05\xde\x06\x5d\x1a\x98\xa2\x00\xd4" - "\xd1\x46\x8a\x2d\x85\x8d\xe5\xd2\xfc\x01\x5b\x45\x76\xfc\x94\xf8" - "\x48\xf1\x53\x6c\x76\xc0\x8f\x0e\xf9\x08\xec\x25\xaa\x94\xe2\x65" - "\xff\xd9\x35\x51\xf0\xbb\xd8\x02\xe5\xec\x57\xbf\xc4\x95\xc1\xc5" - "\xcd\x1b\x4f\x12\xe2\x13\x43\x94\xc8\x2f\x6d\x4c\xc9\x74\xc4\x2c" - "\xde\x9b\xbf\x2f\xad\x0b\xd4\x0f\xd2\xca\xb0\x7e\x4b\xa1\x5c\xf8" - "\x5d\x0e\xf9\xca\xea\xc9\x19\xa1\x6e\xdc\x35\xe9\xaf\x01\x1e\xf9" - "\xfa\x62\x99\x78\x1d\x6b\x6f\x97\x3f\x5e\x43\xef\x5d\xaa\x80\x74" - "\xec\x5f\x92\xa4\x5f\xc8\x00\x7c\xbe\x19\x31\x89\x9f\xf5\x96\x40" - "\xb0\xa5\x10\x62\x6b\x0f\x27\x13\xfd\x49\x20\xd8\xdb\x90\x66\xa6" - "\xa4\xe5\x9e\x04\x12\x88\xe5\x21\xaf\x1b\x98\x92\x8a\x52\xb4\x45" - "\xda\x8e\x0b\x74\x9d\xac\x22\xff\xcf\xb4\x84\xbb\x4f\x09\xd6\x07" - "\xce\x8b\xee\x9b\x8b\x7d\xc9\x8d\xab\x69\x5b\xe1\x5e\xe5\x70\x7d" - "\x25\xb6\x1d\xe5\x09\xe7\xab\xa0\x4e\xc1\x78\x8e\x5b\x7f\x9b\xb6" - "\xa7\x1c\xd7\x68\x45\x79\x60\x7e\xdc\xb3\x85\xae\xd9\x57\xc8\xad" - "\x89\x06\xe5\x57\xa2\x3e\x58\xb8\x07\x96\x91\x64\x61\x2d\x2c\xf0" - "\xd1\x3b\xab\xcd\xe0\xff\xcb\x3e\x94\xea\xa7\x34\x4f\xac\x1f\xb8" - "\xae\x12\xae\x3f\xc4\x42\x1b\x91\x4f\xe0\x9e\x7e\xe8\xf3\x21\x4d" - "\x67\x4b\x87\x32\x56\x9a\xb9\xf1\x14\x28\x67\x3b\xd4\x45\x87\xe5" - "\x40\x7d\x0e\xf1\x65\xb5\x7c\x94\x20\xd5\x35\x5f\x5e\x39\xea\x9c" - "\xb3\xe7\xd5\x5c\x9b\x80\xbb\xca\xde\x28\xa1\xe7\xaa\x20\x4f\x15" - "\xdb\x19\x42\x70\xcd\x53\xea\x4b\xb8\x73\xfb\x92\x2e\x70\xfa\x3d" - "\x44\x79\xad\x2c\x7f\xf9\x9b\x6c\xab\xbd\xde\x65\x61\xc2\xba\xb1" - "\x7c\xbd\xf7\xe1\xfd\xd8\x55\x11\x9c\x6f\xc5\x7b\xe0\xf5\x7c\x79" - "\xe3\xb1\x3c\x41\x56\xf7\x40\x3d\xa8\xbc\x4a\x23\x21\xbd\x1c\xb1" - "\xc8\xc9\x0d\x78\xf4\x6c\x12\x62\xb1\x6c\x36\x5c\xbf\x3f\x0b\x7f" - "\xaf\xc2\xdf\xa5\xad\x1c\xc7\x76\x9d\x2f\x2d\xc2\xf3\xf5\xd0\x4f" - "\xdf\xf8\x3a\x60\xc9\x46\xc8\xed\x23\x49\xa0\x69\x2d\xd7\xb6\x5d" - "\xa6\x35\x53\x15\x07\x2d\x84\x60\x3d\x41\x46\x55\x50\x57\x88\x39" - "\x0a\xa6\x60\x5d\x81\xaf\xf7\xb1\x60\x9a\x58\x67\xe0\x33\xbe\x7e" - "\x5b\x16\xf3\xba\xdf\x87\x6d\x44\x79\xde\x43\xb9\x0f\xce\xbd\x33" - "\x1c\xeb\x6e\x6f\xf7\x96\x10\xb1\x8c\xb9\x76\x83\x1e\x50\x5f\xa8" - "\x17\x51\x99\x88\x7d\x1d\x94\xb5\x8b\xfe\xa6\xd8\x40\x59\xeb\x46" - "\xb1\xb5\x98\xdf\x9e\x77\x6b\x0a\x9e\x4b\x84\x7b\x4f\xd4\x12\xc4" - "\xbf\x02\xd7\xfe\x85\x72\x77\xe1\x7e\x3c\x50\x06\xee\xb1\x03\x3a" - "\xdf\xfa\x05\xe2\x11\x7e\xd7\xf2\xf7\x38\x06\xfe\x7c\x3c\x1c\x53" - "\xec\xf6\xbf\xf5\x63\x29\xbe\xb6\x38\xda\x3f\xea\x5b\x67\x4b\x0a" - "\x21\x1c\x1e\x62\x89\xfa\x34\xb3\x75\x1e\xef\x3b\x78\x5d\x6f\xfd" - "\xf3\x41\xb0\x17\x7b\x19\x5b\xa7\x38\xe8\xba\x8a\xc3\xe3\xaa\x69" - "\xb8\x9f\xb1\x02\xae\xad\xe2\xcb\xe1\xda\xcc\xe1\x69\x2d\x87\x81" - "\x5a\x76\x15\xb4\xb3\x0b\x07\x5b\xf2\x78\x3d\xd7\x3a\xc8\x84\xaf" - "\x7b\x71\x0b\xee\xd1\x80\x9c\xd4\xbe\x96\x3c\xda\xde\x69\xe7\x25" - "\xd4\xbd\x8d\xd3\xfd\xd6\xe0\x52\xea\x6f\x79\xde\xda\x42\xcf\x8f" - "\x92\x60\x18\xeb\xb2\x82\xc3\x2f\xd6\x25\x29\x02\xeb\x52\xc5\xd5" - "\x23\x49\x4d\xe0\x5c\x1b\xde\x1f\xca\x8a\xe7\xed\x55\x28\x6b\x1a" - "\x96\xf5\x16\x70\x15\xd6\x09\xee\xdd\xc8\xf1\xdf\xef\x39\x1c\x4c" - "\xe7\xeb\x5e\x63\x5e\x8b\xd7\x96\x04\x5f\x60\xb8\x6b\x6b\x20\xdf" - "\x3e\x33\x5d\xc7\x79\x28\x5c\x5f\xa1\x9e\x8f\xf9\xdf\xdb\x85\x1c" - "\xad\x7e\x91\xfb\xbe\x49\xfd\x1c\x60\xf5\x24\x51\x42\x79\x5e\x88" - "\x51\x01\x17\x6d\xcc\x7b\x6f\x43\x8c\x81\xfa\xda\x05\x31\x52\x05" - "\xca\x1b\xb1\x0c\x31\x52\x50\x7b\xfa\x3b\xfb\x04\xdc\xc2\x7d\x8a" - "\x50\xf6\x54\x3f\xef\x5c\x00\x1c\x57\xd9\xb1\xf5\xce\x05\x5e\x8e" - "\x15\x20\x47\x2f\xb8\xdf\x1b\x7c\xbb\x2a\x20\x3f\xc4\x62\xef\x2d" - "\xe4\xeb\xce\xef\x11\x51\x7e\xa3\xa0\x07\xde\x56\x6b\xb3\x90\x7f" - "\x39\x1d\x94\xef\xe2\xaf\x2d\xa7\xf7\x2a\xdf\x2d\xe4\xc5\x18\x91" - "\xae\xcf\x5e\xbe\x1b\x79\x70\x22\xe8\x9e\xe3\x3e\x6e\xaf\x2a\x9a" - "\x86\xb6\x43\xef\xf1\xde\xb3\x1c\x0e\x21\xee\xb1\xe3\xa8\x3c\xd5" - "\x81\x9f\x90\x8b\x75\x75\x50\x06\xf2\x29\x62\x09\x39\x15\xfb\x12" - "\x50\x5e\x04\x6f\x3f\x42\x9d\x7f\x91\x62\xe5\xbd\xc7\x01\x2b\x13" - "\x44\x65\x1b\x9c\xf9\xb9\x52\xca\x81\x45\xf4\x9a\x6d\xf7\xf2\x6d" - "\xdb\x45\xdb\xc6\xff\x46\xb9\x25\xa2\xdc\xde\x3d\x27\x92\x23\xc8" - "\xed\xdd\x79\x7c\xfe\x2a\xe4\x72\xbb\xbd\x6e\x2b\x16\x6c\xb9\x3b" - "\x5f\xbc\x3b\x13\xed\xc1\x5e\xaf\x6d\xf1\x0e\x7c\x51\xe5\x9c\x2f" - "\xb6\x85\xf0\xed\x2d\x73\xb0\x8d\x72\x3e\xde\x8d\x16\xf4\x50\x67" - "\xea\xe0\xd7\x22\x2f\x8c\x46\xfe\xc4\x7b\x8b\x7d\x50\x09\x95\x2b" - "\x6f\xcb\xef\x3e\xd2\x5d\x0f\xef\x7a\x8b\xed\x19\x75\x8d\x9c\x80" - "\x65\xa0\x4e\xb9\xb8\x12\xd2\xa8\x5e\xb7\xb5\x20\x37\x88\x39\x1a" - "\xf2\xe6\xda\x58\xb4\x97\x77\x55\x52\x5b\xdc\x96\xc0\xdb\xa2\x70" - "\xef\x6f\x41\x47\x81\xa2\xfb\xa6\x3a\xdc\x17\x75\x73\x08\xe5\x40" - "\xdb\xf8\xee\x11\xc1\xa7\x61\x7e\xb8\x36\x1e\xae\xa9\x72\xf0\x8f" - "\x3a\xac\x1f\xdc\x2b\x90\xe3\xac\xcd\x1c\x57\xc4\xb7\xd3\xfa\xec" - "\x2f\xe5\xfd\x04\xa4\x05\xf2\x69\x69\xbc\x2f\x11\x70\x33\x41\x5a" - "\xa7\xf7\xfc\x9d\xc7\x47\xdb\x02\x85\xf8\x88\x2b\x8b\xe3\xa2\xf7" - "\x02\xf8\xf6\x61\xda\x04\x9a\x56\xde\x82\x69\x59\x54\x0e\xb9\x2c" - "\xe7\xaf\xca\xd3\x78\x7f\x85\xf6\xc5\x18\x98\x77\xcc\x68\x63\xf8" - "\x1b\xca\xd0\x62\xf9\xf5\xc9\x1d\xd8\x87\xc8\x83\x73\xb9\xc8\x07" - "\xc8\x17\xea\x05\x94\x37\xd4\x33\xb8\xcf\x03\xc8\x3b\x18\x87\xe0" - "\x79\xc8\x97\x8a\x5c\x04\xe9\x47\x71\x5f\x23\xf6\x27\x2f\x28\xf7" - "\xbd\x7d\xfc\xb5\xdf\x73\xb1\xc2\x4f\x21\x03\x84\x34\xe1\x3a\xe0" - "\x86\x4d\x78\x1d\x5e\x2f\xf0\x17\x72\x97\x05\xb9\x89\xbb\x5f\xc5" - "\x5d\x3c\xc6\xb9\x7e\x83\x10\x17\x75\x32\xa2\xbc\xb8\x1e\x34\xc7" - "\x69\x15\x71\x94\xcf\x2a\xa2\xf1\x5a\x4e\x7f\xc0\x95\x89\x17\xd8" - "\x6f\x4b\x63\x89\xb2\xe4\x0c\xf2\x62\x61\x14\xad\x67\x45\x35\x6d" - "\x47\xc5\x7a\xae\x1d\x94\x53\x75\xb4\x2e\x85\x51\x25\x1d\xdc\xb9" - "\x6d\xd8\x16\x3c\xb7\x51\x74\x8e\xed\xd4\xe0\xb9\x8f\xb8\x7a\x39" - "\x5c\x67\xeb\x8c\xe9\x96\x1f\xf7\xe9\x02\x0e\xf5\x2a\xd9\x2c\x70" - "\xef\xf6\x60\xbe\x9e\x56\x81\x77\x41\x2e\x19\xc8\xbd\xdc\xb9\x05" - "\x7c\x9e\x19\xfc\x27\xc7\xef\xdb\x27\x50\xb9\xfa\x33\xbc\xbc\x73" - "\x69\x3b\xb6\x73\x7b\x7f\xb3\x3f\x85\x83\x6c\xb7\x8f\x13\x64\x2b" - "\xfe\x8e\xf6\x03\xf7\x47\x5b\xa0\xbc\x92\xc0\xf5\x61\x8b\x30\x0f" - "\xd6\x89\xfa\x88\x8a\x00\xc7\x98\xfa\x04\xb3\xf3\x43\xf4\x4b\x34" - "\x56\xdd\x99\xcf\x8f\xcf\x90\xea\xd8\xad\xe0\x17\xb6\xb7\x08\x1c" - "\xc3\xb6\x87\x40\x9f\xbf\x19\xeb\xf8\x3d\xa6\xe1\x1a\xc2\xe2\x3c" - "\xc8\x4f\xef\x77\x18\xf8\x32\xb7\x57\x0b\xbc\x81\x5c\x52\x67\x6a" - "\xe6\x63\xba\x1d\xda\x12\x9e\x4b\x4e\x33\x3b\x96\x49\xe3\xb0\x1d" - "\xcb\xa4\x9c\xb1\xf3\x6d\x47\xce\x80\xb8\x39\xb5\x3d\x7d\xc7\x54" - "\x49\x1c\x00\x69\x3d\x73\xc7\x0e\x7f\xb4\x51\xdc\x97\x81\xe3\x27" - "\x6e\xcc\x69\xc7\x97\x42\x9d\x91\x37\xcf\xae\x11\xc6\x2f\x76\xae" - "\xc0\x58\xcd\xe1\x7e\xfb\x24\xdc\x89\xf7\x13\xca\x53\x12\x5c\xd7" - "\x1f\xe4\x80\x63\x2e\x3b\x52\x79\x9e\x2f\x93\x70\x25\xef\xc3\x90" - "\x27\xa5\xbe\xaa\x30\x5a\xea\xab\x76\xce\xeb\xce\x91\x3b\x03\xdd" - "\xf7\x55\x3b\xbd\x90\xb7\x04\x8e\x94\x72\xc1\xce\xa0\x12\x49\x2c" - "\xbb\x63\xbf\x10\xcb\xda\x79\x74\xc7\x34\xe4\x28\xb8\x7f\x15\x7f" - "\x6f\xc0\x5f\x7e\xa5\x70\x6f\xc0\x51\x4b\x9d\x1a\xb0\x99\x5e\xe8" - "\x0f\xdf\x75\x7c\x0c\xc8\xd9\x66\x07\xb7\xb6\x7a\x45\x23\xe0\x6f" - "\x28\xe2\xac\x7a\xc9\x19\xd2\x62\xf7\x15\x87\xce\x2e\x15\xe4\xbb" - "\xeb\x11\x71\x5c\x58\xbc\x99\x4d\x6b\x4f\xdf\x35\x52\xdc\xc6\x4c" - "\x48\xdb\xc8\x8f\x21\x70\xb2\xe5\xca\xda\xd9\x5a\xba\x59\xda\x36" - "\xda\x8e\x5d\x38\xae\xb3\x1f\xfb\x44\x70\xff\x26\x8c\x7b\x20\xe6" - "\x83\xef\xef\x44\x96\x76\x61\xbe\x78\xdf\x85\xb5\xe2\xf8\xaa\x70" - "\x3f\x72\x25\xdf\xf7\xac\x81\x78\x47\x32\x26\x36\xfd\x77\x61\x6a" - "\x6d\xec\xc2\x25\x71\x0b\xee\x53\x2f\x5c\xb2\x30\x6e\xe1\xbc\x45" - "\x0b\x57\xcf\x8b\x5b\xb8\x74\xc9\xf8\xc5\xf3\x5e\x5d\xf8\x8a\x7a" - "\xd5\xbc\xe5\xea\xc0\xf8\x3b\xe2\x87\x12\x7b\xd6\x87\xd4\xf3\x96" - "\x2f\x5f\xb1\x38\x3a\x4a\xbd\x64\xe1\x2b\x13\x62\xa3\x97\x47\xc7" - "\xa9\xe7\xc5\x2e\x5d\xb1\x24\x4a\x7d\x47\xd4\x3d\x77\x04\x3e\x18" - "\x35\x54\x3c\x86\x76\x9b\x8a\xb4\xd9\xce\xb7\xb6\x6e\x3c\x4f\xbc" - "\xfc\x14\xda\x58\xbf\xf8\x85\x4b\xe8\xb8\xdd\xee\xb7\x27\xe6\x12" - "\x2d\xee\x13\x89\x7b\x8c\xb1\xe9\xbb\xf2\xe0\x53\x89\xf9\xa0\x9d" - "\x6a\xf8\x8e\x3a\x0e\x68\x4f\xdf\x1d\x62\x60\x3e\x08\xe4\xf6\x0f" - "\x83\x74\x68\x5b\x00\x7b\xbe\xa6\x15\x62\x36\x2d\x3e\x47\x5c\x7a" - "\x9e\x8c\xd4\xad\x24\x4a\x38\xbc\xe1\x50\xe1\x3e\x92\x70\x4d\x82" - "\x81\xd9\xc3\xaf\xcf\xbc\x27\xc0\x38\xa4\x2e\x97\x4d\xab\xcb\xa5" - "\x7a\xd9\x73\xb3\x30\x1e\x1c\xfa\x36\x09\x45\x7c\x36\x33\x7b\xb8" - "\xb5\x65\xde\x02\x2c\xe3\x58\xea\xd9\xff\x79\x22\x18\xe2\xc1\xa6" - "\xea\xd1\xdc\xb9\x9b\x4d\x0c\xf1\x86\x7a\x29\x0f\x26\x04\x92\x1c" - "\xb8\xd7\x72\x7f\x96\x85\x7b\x18\x84\xf1\x34\x68\x83\x0a\xda\xd2" - "\xc8\xb7\xe3\x20\xd7\x8e\xcd\xec\xb8\xdc\x11\x50\x3f\x3d\xd6\x67" - "\x8f\xb7\xd0\x06\xa8\x77\xa3\x81\xd9\xad\x85\x7a\xaa\xb0\x5e\xce" - "\xc6\xfa\x70\xbc\x0b\xea\xf9\xac\x6d\x25\xc8\x6d\x2c\xdd\x57\x62" - "\x63\x09\xb5\x3f\x68\x4f\x46\x29\x7c\xcf\x3a\x43\xbc\x33\x71\x8f" - "\xbf\xb5\xb7\xb0\x47\x4c\x16\x52\x1f\xd3\x48\xfc\xde\x60\x8d\xec" - "\x5f\x5a\x5b\xf9\x36\x25\x23\x37\xfc\xe9\xb5\x46\x25\xb6\x09\x7c" - "\x85\x77\xe9\x19\x97\x63\x8b\xca\x9c\x51\xac\x89\x2d\x14\xc7\x5c" - "\x7b\x7e\x44\x99\x60\xbc\x75\x76\x2d\xee\x23\xb7\xa7\x01\xee\xad" - "\xe1\x63\x63\x13\xdb\x19\x21\x8a\xa5\xf6\x20\xce\x4c\x2e\xca\xf6" - "\x12\xca\xc6\xfd\x04\xf1\x1a\xaa\xff\xf7\x9f\x85\x6b\x8c\xf6\xf2" - "\xdf\x0f\x74\x2c\x1f\xcb\x84\xef\x46\xe1\x3e\xb4\x1f\xfe\x3e\xc6" - "\x04\x46\xc0\xb2\xd1\xc5\xfd\xc6\xe9\x37\xb3\xc7\xea\x21\x7d\xe3" - "\x05\xa2\x84\xbc\xc7\x4a\x37\x73\xe5\x83\x4d\xed\xe2\xc6\xae\xdf" - "\x1a\x45\x48\x2a\xe4\x39\x9b\xbe\x47\x63\xe2\xf6\xf6\x7b\x1f\xec" - "\xbf\x50\xed\x38\x96\xcd\xe3\xf9\x21\x07\x3c\x07\xeb\x31\x26\xcc" - "\x85\xf2\x01\x43\x1b\xcf\x81\x1f\x86\xdf\xf7\xe4\x12\x0d\xde\x07" - "\xbe\x37\xe0\x78\x48\x7b\x7a\x25\x11\xee\xc7\x02\xfe\xb3\x6c\x74" - "\x0c\x86\xc7\xd6\x78\x1c\xbf\x4e\x8a\x67\xd9\x83\xc0\xef\x58\x47" - "\xc4\x18\x5c\x13\x24\x60\x0a\xb0\x7e\x8c\xc3\xd5\x48\xa2\x61\xd3" - "\xdf\xaf\x2a\x1d\x01\xf9\x00\x57\x25\x80\x27\xc4\x15\xe4\x8d\x14" - "\x30\x05\x58\x6b\xc0\x7c\x50\x87\xa1\x95\xab\x83\x95\xc8\x91\x2d" - "\x4c\xe5\x17\x88\x31\xf6\xbf\xff\xd0\xc8\xde\x34\xa7\x91\xea\xa9" - "\xf2\x8b\x7a\x33\xd5\x81\x5d\xee\x95\x15\x22\xb9\x37\x00\x8e\x87" - "\xa2\x9c\xe9\x58\x75\xe5\x17\x50\xb7\x06\x2e\x16\x7f\x13\x74\xc0" - "\xf9\xaa\xca\x5c\xbc\x9e\x97\x61\xad\x5d\x86\x95\x46\x67\x32\x74" - "\x90\x9d\x92\xee\x2d\x58\x69\x41\x5b\x69\x4f\xff\x60\x9c\xb0\x5f" - "\xa0\x33\x5d\xc2\x3d\x94\xca\x5c\xe2\x85\xf7\x38\x34\x92\xcb\x3f" - "\xdb\xd9\x3d\x1c\x71\x7c\xa8\x8c\x10\x1c\x0b\xc7\xeb\xc6\x8d\x44" - "\xb9\x7e\x90\xe1\x54\xbf\xaf\x48\xea\xc6\x1d\x6c\xfa\x07\x79\x39" - "\x23\x00\x37\xb4\x7e\x87\x7a\xaa\xdf\x38\x35\xf5\x8b\xd5\xb7\x21" - "\x9e\x3f\xb0\xd6\x43\x6f\x1b\xd3\xf8\xdf\x6d\x67\xc1\xd7\x38\x8e" - "\xe7\xbb\x9e\x5f\xd8\xfb\x88\x74\x7e\x61\xef\x78\x57\xf3\x0b\xd2" - "\xfb\xee\x7d\x03\xef\x6b\x2b\x9d\xad\xb0\xdf\x7b\x6f\x94\xcd\xc9" - "\xbd\x85\xeb\xef\x29\x13\xf7\x5f\xf6\x7e\x8a\x75\xa8\xc3\xfd\xd6" - "\x7f\x35\x5b\xc1\x42\x39\x87\x38\x9f\xbd\xb7\x86\xc6\x2b\x18\x07" - "\xed\xad\xc0\x3c\x8e\xed\xe8\xfa\xf3\x1a\x89\xb1\x23\xb9\xc0\xfd" - "\x18\xf8\x7b\xa2\xc2\xcf\xd1\x65\xc2\x69\x46\x92\x99\xb0\x4e\x7e" - "\x78\x13\xf2\x2b\x2e\x3f\x0b\x7f\x34\x89\xff\x6d\xe4\x7e\x28\xbb" - "\xf2\x77\x9d\xef\xc3\xdf\x10\x5a\x5f\xae\x3c\x33\x51\xf0\xf7\xab" - "\x16\xe5\x98\xda\xc3\xd5\x2c\x11\x2e\x71\xf6\x87\xb3\x09\xc9\xb3" - "\x07\x42\x79\x06\x2e\x33\xcb\x5a\xf8\xf2\x85\xdf\xac\xf8\x37\xa6" - "\x48\x7f\xc3\xdf\x80\x08\xd1\x0d\x6e\x19\x10\xc5\x3d\x9e\x34\xd6" - "\xd2\x95\xc4\x94\xa9\xa4\x37\x4d\x1e\xc8\x7d\xf8\xe1\x3f\xf1\x50" - "\x9e\x06\xce\x07\xd8\x4f\x0f\x30\xa5\x88\x32\x1f\xa6\xd5\x1f\x33" - "\xc9\x75\x23\x3c\xfe\x1b\x2b\xfa\x7e\x0b\xfd\x08\x30\x3b\xcd\x79" - "\x31\xfe\xd4\x0d\x43\x84\xaf\x76\x78\x8c\x49\x70\x96\xd5\x2e\xff" - "\x31\x4d\x42\x92\x58\x9f\xf6\xf3\xb7\x86\x4b\x7f\xdf\xae\x92\xfe" - "\xbe\x23\xa4\x3f\xaa\x5e\x8d\xff\x24\x19\x86\x03\x73\x8c\xec\x4a" - "\xf4\x73\x30\x19\x3f\x9d\x83\x09\xd9\xff\xf8\xda\x0c\x80\xfa\x14" - "\x89\x92\x95\xce\x73\x5f\x9c\xbf\xd1\x29\xbc\x00\x6f\x31\xaa\xba" - "\x9d\x74\x4c\xc3\xdf\x83\xd4\x7c\xda\xbd\x1f\x75\xcb\xcf\xa5\xa9" - "\x45\xbf\x15\xc1\xf0\x4f\x19\x5c\x98\xd6\x1f\x75\xbd\xfe\xf7\x7f" - "\xf0\x4f\x81\xf6\x71\xfd\xef\x22\xfd\xb1\xd4\x8b\x03\x13\x71\x1f" - "\xf8\x1f\xdb\x45\x94\x2c\x7f\x82\xe5\x13\x58\xfe\x4b\xbf\xf8\xf1" - "\xeb\x7f\xd7\xff\xae\xff\x5d\xff\xbb\xfe\x77\xfd\xef\xfa\xdf\x35" - "\xf0\xa7\x10\x77\xac\x71\x5f\xbd\xc1\xfc\xa7\xb8\xff\xa3\xe0\x0f" - "\x71\x1a\xd3\x97\xeb\x58\xfe\x8f\x24\x07\x57\xab\xcb\x22\x0d\x2a" - "\x5d\x58\x43\x60\xa5\xd6\xe8\x95\x16\x52\xa3\xa9\x88\x69\xf5\xcf" - "\x0b\x6f\x9c\x54\x15\x6f\x56\xa6\x4e\x3d\x34\xae\x3c\xaa\x65\x64" - "\xee\xec\x63\x41\xfb\xe2\x4c\xde\x19\xd3\x6a\xc7\xef\x5a\xd4\x16" - "\x50\x14\xd1\x34\x65\x7f\x82\x85\x59\xfb\xc4\x3f\x6e\xdb\x3a\xbf" - "\x79\x84\x7e\xd6\xe7\xf7\xed\x8d\x3d\x33\x34\xfd\x99\xcf\xee\xde" - "\xf1\xda\xc9\xd1\x05\x2f\x7e\xf5\xd0\x5f\x57\x77\x0c\x5a\xf7\xfb" - "\x4f\xee\x7c\x77\xc1\x89\x51\x9b\x9f\xfb\xd7\x83\x7f\x59\x79\xde" - "\x37\x6b\x46\xdd\x3d\x7b\x96\x9c\x1e\x5b\xf2\xd2\x7f\x1e\xfd\x9f" - "\x44\x9b\x22\xe5\xf1\x8f\x6e\xdd\x32\xef\xdb\xe1\xd9\x33\x8f\xde" - "\xfb\xc1\xb2\x5f\x86\xac\x7f\xfa\xd3\xbb\xb6\x2f\xfc\xf1\xe6\xfc" - "\x17\xbe\x9c\xfc\xe1\x1b\x17\x06\xbe\xfd\xe4\xc7\x77\x6c\x8b\xfe" - "\xfe\xc6\x4d\xcf\x7e\xf1\xc0\x9f\x57\x9c\xf3\xc9\x9c\x7e\x64\xc2" - "\xee\xc5\xa7\xc6\x14\xcf\x3d\xfe\xc8\x81\x37\xad\x03\xde\xfa\xdd" - "\xc1\xdb\xdf\x79\xe5\xbb\x1b\x72\xfe\xf8\xbf\xf7\xff\x69\xf9\xd9" - "\x61\x1b\xfe\x70\xf8\x37\x3b\x5f\xff\xe9\x57\x85\x73\xbe\x7e\xf8" - "\x6f\x6b\x3a\x07\xff\xd7\x53\xff\xfc\xf5\x7b\xaf\xfe\x70\xd3\x7f" - "\x3f\xff\xef\xdf\xfe\xbf\x55\xed\x7e\x1b\x43\xeb\x27\xbe\xbf\xf4" - "\xe7\x5b\x4a\x5f\xfe\xe6\xb1\xbf\x27\xb1\x7d\x91\x1f\x61\x8e\xfe" - "\xe9\x52\xeb\x8d\x7e\xa4\x24\xcb\xb9\x9e\xe5\xb5\x4e\x7f\x26\x3f" - "\x40\x14\x5e\x64\x90\x52\x56\x3f\x41\x6e\x7b\x5d\xfc\xa9\xc5\xd7" - "\xf7\xf6\x87\xef\x84\xe1\x33\x15\xf7\xc3\xf1\x2b\x2e\xc5\xde\xf3" - "\x1f\xeb\xf4\x8a\x4b\xf1\xa7\x80\x76\x0e\x80\x9a\x0c\x24\x83\x40" - "\x32\x5e\x64\x08\x19\x4a\x86\x11\x6f\xe2\x43\x7c\x89\x1f\x51\x91" - "\xe1\x64\x04\xb9\x81\x8c\x24\x37\x92\x51\xe4\x26\xe2\x4f\x6e\x26" - "\xa3\xa1\xf6\x01\x64\x8c\xf3\x3a\x27\x93\x60\x7f\xf8\x07\xfe\x0f" - "\x23\xc1\xdc\xef\xc8\xeb\xe9\x97\x34\xbd\x9a\x4f\x6f\xe0\xd3\x0d" - "\xd7\xd3\x2f\x69\xba\xfa\x32\x7f\xde\x7a\x59\x3f\x15\x10\x16\xd0" - "\xc8\x40\x12\x1f\x74\xfd\x39\xa6\x2a\xf8\xbf\xae\xdf\xa4\x97\xeb" - "\xbb\x95\x27\xbd\xde\xf1\x2f\x18\x8e\x20\xfa\x35\x89\x10\x3a\x97" - "\xc0\x8a\xff\x2c\xae\xae\x14\xfe\xf2\xe2\xe1\x48\x85\x43\x07\x47" - "\x0e\x1c\xa5\x70\x6c\x17\xca\x21\xc4\x68\x26\xe4\x0c\x70\xfb\x2f" - "\xb9\xf0\x59\x4b\xc8\xd9\x48\x42\xce\x19\x08\x31\x95\x11\xd2\xae" - "\x16\x55\xdc\xdb\x5e\x23\x2b\x7f\x57\x38\xad\x60\x72\x45\x37\xf3" - "\xd4\x3f\x55\x3d\x39\x3b\x44\x7d\xef\x3d\x41\xf7\x04\xdd\xaf\x9e" - "\x30\x41\x7d\x5f\x60\xe0\xe4\x89\x81\x0f\x4c\xbc\xef\x41\xf5\x7d" - "\xf7\x3f\xf4\xc0\x83\x0f\xdd\x37\x49\xbd\xf8\x8d\xd8\x85\xf7\x06" - "\xbe\x1a\xad\x5e\xb0\x30\x76\xf1\xaa\x79\xb1\xd1\xbd\x35\x58\xde" - "\x1f\x34\x85\x8c\xb1\xd2\x6a\x8a\xb5\xa1\xc0\x11\xf2\xbf\xf9\x13" - "\xa6\x2e\x8f\xd8\xcf\x68\xf8\x43\xfa\xa7\x88\xd7\x11\xc5\x8a\x5c" - "\xa2\x58\x06\xdf\x5f\xf7\x26\x8a\x57\xaa\x88\x62\x33\xa4\xe5\x24" - "\x10\x45\x56\x03\x51\xa4\x1d\x22\x8a\x94\xf0\xee\x69\xa5\x8b\x68" - "\xda\x5f\xdb\x88\xe2\x2f\x6a\xa2\x78\xdf\x4c\x14\x15\x61\x34\xed" - "\x63\xc8\x53\x6d\xbc\x38\x8d\x96\xfd\xe7\xa9\x9e\x15\xff\x1f\x7a" - "\x77\xed\x26" +static unsigned int eth_z8e_uncompressed_length = 366788 ; +static unsigned int eth_z8e_length = 115959 ; +static unsigned char eth_z8e[115959 + 1] = + "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xb5\x37\xbc\x32\x19\x60\x12\x23" + "\x13\x31\xd2\x29\xa5\x3a\x5a\xb4\xd1\x0b\x12\x15\x5b\xb4\xa0\x51" + "\xc0\x82\x0d\x10\x15\x6d\x54\x34\xa0\x81\x06\x8d\x18\x21\xc0\x00" + "\x21\x33\x0c\x70\x9d\x44\x7e\x44\x8d\x18\x21\x90\x44\x62\x9b\xdb" + "\x52\x4d\x2c\x2a\xd8\x50\x63\x49\xef\x43\xef\x85\x0c\xb7\x2f\xbe" + "\x6f\x6e\x5f\xbc\x1d\xd2\x88\x29\x4f\x80\x91\x0c\x64\x48\x66\xce" + "\x7e\xbf\x6b\xef\x73\x92\x99\x61\x82\x72\x7b\x3f\xcf\xfb\x4f\xf9" + "\x7c\xc2\x9c\xb3\x7f\xac\xbd\xf6\xda\x6b\xad\xbd\xf6\xde\x6b\xaf" + "\x43\xf4\x77\xfc\x33\x7d\xe4\xf8\x7b\xaa\xff\xe3\xdf\x3f\xfe\xfd" + "\xe3\xdf\x3f\xfe\xfd\xe3\xdf\x3f\xfe\xfd\xe3\xdf\xff\x3f\xff\xce" + "\x9a\xcc\xf4\xfb\x72\xa2\x1e\xb7\xc5\xe6\xa3\x0b\xf6\x37\x5f\x17" + "\x21\x24\x27\xf8\xc8\x62\xe3\x5f\xfd\x8f\x5e\x43\xba\xa9\x9c\x2c" + "\x37\xa4\x52\xca\x94\x1d\x44\x15\x23\x45\xd7\xeb\x5b\x85\x7f\xdd" + "\x56\xd1\x35\xf5\x1d\xa2\x96\x31\x44\xaf\x8f\x14\x01\xc0\x99\xeb" + "\xa3\xa7\x2b\x18\xce\x3a\xbc\x73\xfe\xfa\x91\xc2\x8f\xf4\x22\x1f" + "\xe5\xa6\x70\xfa\xda\x91\x80\x95\x46\xe4\xde\x2a\x82\x11\x70\x2d" + "\x5c\x9f\x61\x4e\xbd\x5e\xe2\x53\x17\x03\x87\x61\xec\x05\x8c\xf5" + "\x97\x80\x91\x62\xe0\x15\x30\x51\x02\xc3\xeb\x76\x93\x2d\xe0\x6e" + "\xbe\x06\x75\x03\xe8\x53\x3a\xd7\xdd\x82\x32\xc2\x4d\x89\x2d\x8e" + "\x10\xd9\x6f\xa0\x84\x13\x94\x5c\x8b\x5f\x13\x7e\xdf\xe0\xfe\xae" + "\x53\xf5\xc6\x30\x0c\xd4\x4d\xe8\x71\x27\x65\xf4\xd7\x05\x6c\x7b" + "\x09\x99\x51\x76\x51\xc0\xd4\x6c\x52\x65\x53\x93\xf4\xb2\x26\x94" + "\x9d\x6b\x94\x55\x79\xa6\x19\x7a\xde\x15\xc8\x73\x44\xe7\x99\x5f" + "\xd3\xf3\x52\x90\x57\x11\x83\x9f\xd9\xdb\x1b\xa2\x13\x94\xb4\x1b" + "\xb8\xd8\x0f\x60\x54\xb8\x8e\x5e\xfe\x2a\x94\x6f\x89\x86\x45\xa4" + "\xe7\x8d\x40\x9e\x2f\x3a\xef\x77\x19\x7a\xde\xb7\x90\x17\x8a\xce" + "\x4b\x30\xea\xd9\x7a\xdc\xc9\xb6\x38\xfd\xe4\xf6\x13\x54\xdb\xdc" + "\x87\xe4\x49\x28\xe3\xe2\x32\x73\xec\x2e\xe2\xb1\xe2\xbc\x03\x35" + "\xfd\xed\x73\x99\x79\x06\x1c\x1f\xea\x47\xd0\x14\xb4\x4c\x2e\x36" + "\xea\x4f\xb5\x33\x0c\x92\x34\x64\x38\x3e\x4a\x9a\xce\x70\xf8\x1d" + "\xcf\xa3\xb9\xdf\xfa\xb3\x9d\xfb\x17\x39\xe6\x44\x66\x80\x1d\x62" + "\x21\x1a\x8a\xbf\x61\x16\x83\x07\x96\xda\x84\xe6\xfc\x36\x99\x45" + "\x59\x4d\xa6\xe6\x16\xe4\x75\x04\xc9\x3e\x8a\x9c\xed\x74\x85\x0d" + "\xf8\xd1\xe6\x55\x64\x71\x16\x8a\xa0\xd7\xd1\x45\xad\xfe\x2e\x72" + "\xfa\x45\xa7\x37\x74\x8e\x4a\xce\x91\xc5\x1b\x3a\x45\x25\x2f\x91" + "\xad\xa5\xf8\x0b\x8a\xc7\x5f\x9a\x49\x90\x73\x34\xd7\xed\xa0\xd6" + "\xaa\x0e\x72\x56\x45\xd7\x75\x7e\x97\x6c\x87\xf1\x8e\xb1\xb3\x32" + "\x1e\x2d\xf6\x10\x85\x92\x6b\x32\x8b\xdf\x22\xb3\xf3\x7a\x32\x1d" + "\xce\x6b\x36\x70\xf1\x31\x2e\xeb\x4f\x92\x65\xd7\x42\xf0\xd0\x49" + "\xc6\xb7\x3e\xf3\xbd\x55\x41\xd3\x01\x5b\x16\x1d\xb0\x1d\xa3\x16" + "\xdb\x64\x6a\x71\x4c\xa5\xcd\x27\x29\xe5\x40\x70\x12\xb5\x98\x1f" + "\x80\x8c\x4d\x25\x6f\x17\x9e\xed\x61\x94\x09\x90\x7d\x39\x81\x3f" + "\xae\x38\x52\xf1\x1c\x59\x7c\x0a\x26\xe8\x7b\xc5\xb1\x4f\x8b\x88" + "\x98\xbe\xfc\x1e\xaf\x1f\x4b\xbf\x4d\x36\xe0\xd7\x09\x5c\xee\x6a" + "\xa7\x94\x6b\xc6\xd8\x28\x03\x38\x0f\xf3\x56\x86\xc8\x5c\x4c\x49" + "\x83\xc8\x56\x9a\xe6\x96\x32\xde\xb5\x73\xab\xe8\x64\x1e\xed\x5e" + "\x9d\x03\x39\x4d\xc9\x42\xdb\x5d\xdc\xde\x66\xc8\xba\xb3\x96\xcc" + "\xdd\x2b\x72\x12\xaa\xb7\x8a\x0e\xe4\xe5\x1b\x79\xe0\xa7\x0e\xe4" + "\x77\x8e\x4f\xa3\x54\x6f\x28\x93\x3e\xe9\xed\x34\x33\x8c\xe1\x01" + "\x4a\x60\x78\x56\x07\x25\xa2\x3f\x43\x80\xcf\x5d\xd5\x48\xff\x1e" + "\xca\xa1\x7e\xbd\x8f\x5e\x9d\xc7\xf5\xc5\xb7\x9e\x0c\x68\xdf\x7a" + "\xf2\x9c\xf6\xe6\x93\xdd\xe2\xcd\x27\xcf\x86\xdf\x7c\xf2\x2b\xe7" + "\x4a\xb2\x84\xbf\xf5\xa4\xbf\xb5\x50\x8e\x41\x6a\x6b\x21\xc6\x20" + "\x4c\x96\x35\xa7\x28\xf5\xe9\x97\x30\xf6\xa1\xcf\x69\xcd\x22\xb2" + "\x69\x49\x3f\x0f\x7a\x43\x9f\xd1\xd3\xc5\x24\xb4\xa4\x5f\x58\xe2" + "\xf5\xaf\x3b\xb9\xde\xa5\x64\xc8\x82\x3e\x5d\x69\xf7\x99\xaa\x27" + "\x72\xbb\xfe\xa4\x06\x17\xfe\xd6\xe3\xcf\x83\xbf\x8d\x22\xb9\x7e" + "\x23\x68\xe5\x1c\xbe\x36\x81\x76\xf6\x12\x8d\xd7\x28\xe1\x24\x5d" + "\x39\x09\xf8\xa7\x0e\x42\xb7\xd1\x5a\xd9\x6f\xe7\x7d\xdf\x45\x25" + "\x3d\x3d\xf9\xc4\xba\x89\xf5\x12\xeb\x29\xb4\xe3\x41\x3b\x0e\x29" + "\x8b\x5b\x45\x40\x24\xff\x76\x1e\xd2\x3b\x03\xab\xf3\x13\xfc\xab" + "\xf3\x4d\xdd\xc9\xbf\x7d\x16\x65\x76\xa3\x4c\x83\x4e\xc3\x4e\x86" + "\x05\x99\xf0\x5f\x19\xa2\x44\xc0\x2c\xfc\xe8\x7c\x9b\x79\xc7\x56" + "\x71\x0c\xe5\x8e\xf6\xc3\x02\x6c\xc0\x01\xfd\xaf\xec\x34\xd2\x40" + "\xeb\x8e\x4d\x28\xc7\xf5\xbd\xc1\x4c\xd6\xdf\x3e\x6f\x41\x27\x59" + "\x43\x94\x2c\xfa\x54\x7b\x28\xd3\xc9\x7a\xf6\xca\x20\x0d\xed\x71" + "\x53\x36\xc3\xe6\x7a\xde\xae\x4e\x42\xbd\x67\x85\x33\x1f\xfa\x8d" + "\x66\xf5\x88\xfc\x04\xe8\xf4\x8e\x03\xa8\xaf\xda\x1e\x9e\x6d\xe0" + "\xc8\x6d\xf0\x58\x4b\x3c\xc1\x0f\x07\x0a\x82\x74\x65\x25\x25\xa2" + "\xde\x23\x0c\x8f\x61\x81\x0f\x7c\xe8\xeb\xb3\x07\x0a\xfc\xa4\x89" + "\x28\x98\x3e\x1d\x5e\x4d\x14\x3c\xa4\x0b\xc0\x63\xfe\x6b\x41\x9d" + "\x2b\x6b\x24\xbc\x87\x3f\xd2\x18\x5e\x90\xcc\x76\x89\xef\x63\x0c" + "\xa3\x87\x75\x0c\x60\x36\x2f\xbf\x9f\xba\xc8\x6a\xf1\x3b\xf3\x13" + "\x5b\x8b\x89\xb8\xfe\x7b\x25\x9d\x43\x44\x77\x4e\x22\xf3\x1c\xe7" + "\x7b\x43\x67\x51\x66\xf8\xdf\x44\x77\x7e\xe2\x95\x5d\x64\x66\x9c" + "\x51\xdf\xc1\x78\x46\x8e\xe5\xc3\xd3\x1e\x9b\x4c\x8f\x4d\x9d\x31" + "\x75\x32\xcd\xbc\x6f\xca\x64\xca\xb8\x6b\x5c\xc6\x1d\x3f\x9c\x78" + "\x07\x65\xff\xf4\xe1\xc9\x94\x3d\x6b\x32\x3d\x82\xbf\xec\x47\xa6" + "\x3d\x3c\x75\xda\x23\x93\x29\xe7\x81\x19\x78\x9b\x32\xf9\xb6\x8c" + "\x1f\x8f\xcb\x9e\x32\x63\x1a\x3d\x34\xe7\xf6\x8c\xdb\x6f\xa7\xfb" + "\xa6\x65\xdd\x96\x91\xa1\xff\xde\x96\xc1\x45\x9e\x98\x38\xed\x91" + "\x71\xd9\x4b\x5e\x2c\x7a\x71\xdc\xac\x19\x53\x62\xe6\xd9\xf4\xf0" + "\x79\x8d\xe9\x1b\x10\x67\xa6\x93\x06\x7d\xb1\x13\xe3\x8e\xbf\xae" + "\xe6\x92\x76\xc8\x7d\xea\x7f\xec\xe4\xf1\x92\x7a\xd5\xca\x73\x95" + "\xb9\xc7\x6d\x6d\x03\xdd\xfc\x4c\x37\xcc\x67\x28\x73\xcd\x39\xe4" + "\xdd\xac\xcf\x1b\x43\x90\x1f\x8c\xce\xbf\xea\x10\xf2\xc7\xb7\xda" + "\x89\xbc\xf8\x03\xad\x03\xd0\x7f\xa0\xa9\x9f\xba\x9d\x39\x43\xc0" + "\xd3\x09\x68\xa3\x03\xf2\x78\xa4\xc7\x9d\x3a\x21\x42\xce\x3b\x30" + "\x26\x47\xec\xab\x28\xf1\x34\xa5\x5e\xd9\x5a\x94\x49\x3c\x36\xde" + "\x22\x1d\xc6\xb9\x7e\x18\xc9\x12\x06\xc6\x1b\x70\x8e\xea\x70\x8a" + "\x23\x74\x82\x8f\xe1\x6c\x46\x9e\x0e\xeb\xa1\x56\xe8\x06\xe8\xee" + "\x07\x35\x67\x3a\x89\xe4\x9a\xe9\x5a\x5f\xba\x9c\x0f\x50\x6f\x8f" + "\xc1\xcb\x28\x1f\x68\x29\x44\xb9\x5d\xd3\x13\x30\xf6\x09\x98\xa7" + "\xd0\x17\x6b\x33\x78\x3a\xa0\x95\x35\x94\x8b\x9e\x1c\x52\x69\x57" + "\x01\x06\xde\xcb\x1a\x5e\x15\x4e\xa4\xad\x92\x69\x09\x9c\x86\x71" + "\x4e\x64\x79\x14\xab\x65\x7a\x22\xd2\x97\x01\xbf\xb6\x30\xd7\x3f" + "\x23\xeb\x0f\x43\xda\xa3\x28\xfb\xaa\x96\xdc\xf0\x1a\xf8\x86\xd3" + "\x60\x23\x8c\x4c\x03\xbc\xd7\x35\x91\x43\xc2\x12\xca\xc1\x73\x45" + "\xf3\xaa\x2e\x3a\x51\x48\x26\x1f\xf2\x34\x27\x60\xf6\xf5\xb7\x3f" + "\x86\xeb\xa2\x2d\x73\x4f\x5f\x3e\xe6\xb7\xab\xd2\x79\x2e\x0c\x33" + "\x3e\x67\xfa\xcb\xa4\x71\x9b\x2c\xd3\x18\x8b\x09\x18\xa7\xa4\x1e" + "\xf7\x55\x35\x31\xe3\xb4\x17\x70\x5e\x05\xdd\xdb\x00\x23\x55\xeb" + "\xce\xe7\x7e\xbd\x0a\xb8\x26\x1d\xae\x01\x23\xa0\xf8\xe0\x2a\x5f" + "\x0c\x1f\xfc\x27\x60\x4f\x1e\xc8\x1f\x41\x31\xf9\xfb\x91\x7f\xbf" + "\x9e\x0f\xd9\x1a\x61\x8f\xce\x1f\x31\x09\xf9\x0f\xa0\xfd\x00\x64" + "\x27\xd1\x47\xa9\x75\x3b\xd9\xf6\x1b\x28\x9f\x1d\x53\xbe\x00\xe5" + "\x1f\xc4\xd8\x06\x58\xaf\x73\xf9\x6a\x9d\x57\x51\xde\x82\xf2\xae" + "\x98\xf6\x77\xa0\xfc\x23\x11\xf8\xc5\xf4\xff\xea\x7c\xe4\xe7\x30" + "\x6f\xe1\x37\x0f\x65\x86\xb1\xbc\xb2\xae\x38\x50\xc0\xb6\xe2\x88" + "\x23\x31\xed\x33\x2d\x9f\xd7\x0c\x1a\x75\x33\x8d\x52\xeb\x74\x3b" + "\xe4\x98\xc2\xe1\x6a\x73\x4c\x1b\x63\x50\x67\x29\xf8\xe7\x55\x83" + "\x37\xe2\xd4\x99\x18\x53\x27\x47\xf2\x96\x6a\x47\x1f\x63\x55\x47" + "\xd7\x43\x91\x30\xb8\x6f\xb0\x8d\xae\x2e\x8e\xe9\x7b\x0e\xda\x5d" + "\xbd\x49\xc9\xf9\x15\xe0\x89\xdb\x91\x36\x03\x30\xdf\x60\x3e\x62" + "\x5e\xf7\xfa\x83\xd0\x93\xd3\x53\xd4\x7c\x7f\xf5\xe7\xd6\x62\xe2" + "\xe7\x71\xfc\xcc\xb0\x45\x5f\x96\x2e\x03\x57\x7f\x8e\x5f\x4e\x6f" + "\xe1\x74\x96\x3d\xd1\xf7\x13\x4d\xc1\x4c\x4b\x80\x8c\x9a\xf0\x1e" + "\xd6\xdb\xb8\x0f\xef\x09\xc0\xff\x35\xe8\x60\xf0\xec\x74\xe6\xc7" + "\x09\x48\xbf\x4b\xcf\xbf\x8d\xcb\xe3\xf9\x36\xfd\x99\xf9\xf6\x35" + "\x9d\x6f\x21\x07\xd7\xdc\x2c\xdb\x96\xb2\xa0\xea\x6b\x8a\xef\xa7" + "\x20\xef\x1a\xfc\xce\xc0\x2f\xe3\xf5\x10\xda\xfe\xdc\x79\x8e\x6c" + "\xce\x30\x6c\x0e\xf5\xfe\x47\xfc\x3e\x8c\xdf\x0f\xf0\xfb\x08\x7e" + "\x6b\x59\x6e\xfd\x2b\xf2\x29\x86\x67\xba\x34\x25\xab\xc3\xd4\x18" + "\xa6\x95\xeb\xf2\xa3\xe4\xf7\xcc\x40\x9a\x50\x69\x26\x45\x73\x3d" + "\xad\x6f\x3a\xb7\x9f\x0d\xf8\x05\xdc\xbe\x2e\xf7\x43\xd4\x38\xa9" + "\x32\x9a\xaa\x67\x56\xe3\xad\xa7\xa9\x72\x09\x91\x6d\xe2\x37\xb3" + "\x24\x20\x04\x7e\xc7\x32\x5d\x7d\x74\x4d\x06\x68\x62\xc6\x3b\xeb" + "\x3e\x93\x2c\x2f\xe1\x5e\x5d\x15\x31\xde\xb0\xc5\xaf\x29\x88\x1e" + "\xef\xd4\x3a\xa6\x19\x8f\xb7\x81\x2f\xe3\x0e\x7e\xe6\x39\x6d\xa8" + "\xc1\x33\xe0\xed\x2e\xe8\xc7\x40\x62\x31\xf3\xdd\x35\x0d\x3e\xfa" + "\x65\xb9\xb4\x83\xca\x1a\xb6\x72\x7e\x00\x7a\x86\x79\x23\xb1\x90" + "\xe5\xe5\x9a\x23\x46\xbe\xcc\x4b\xfa\xad\x8f\xe1\x27\x16\xc8\xbc" + "\x2e\x1f\xd8\xc5\xc8\x63\xdc\x58\x8e\x13\x8b\x38\x6f\xa4\x65\x00" + "\x6e\x4d\xbe\x0e\x37\x91\xed\x07\xb6\x03\x30\x1f\x77\xa2\xcc\x58" + "\x1f\x5d\x99\x33\xd8\x9a\x4b\x78\x6a\x72\xc6\x11\x99\x6e\x71\xd1" + "\x10\x6f\xe8\x28\xcd\x0e\x89\xf0\x38\x17\x25\x79\x43\xbb\x09\x0c" + "\x72\x95\x37\x74\x8c\x6e\x21\xba\xde\x1b\xaa\xc0\x7c\x5b\xc7\xf9" + "\x9f\xa4\x53\x42\x02\x7e\x9d\x37\xb9\x4c\x09\xde\xd0\x7a\x1a\xe3" + "\x32\xe3\xb7\x80\x1e\x18\x22\x7a\xbc\xa1\x2c\x94\xcb\xa3\xd9\x61" + "\x71\x66\xea\x10\xf1\x97\xdc\x30\xa5\x66\x6d\x10\x4e\x6f\x08\xb6" + "\x6f\xe8\x10\xd2\x35\x31\x3b\x7c\x01\x7f\x3d\x42\xf3\xd4\xe4\xcf" + "\x0e\x9f\x11\x53\x36\x7c\x82\xf7\xbf\x08\x61\x22\xe1\x0d\x4d\xa2" + "\xd6\x40\x00\xe5\x9c\x42\x94\xd6\xe4\x3c\x7d\xce\x44\x7d\x98\x3b" + "\xb5\xd2\x9a\x7c\xf4\xd1\xd1\x87\xfe\x61\x5e\x59\xd1\xb7\x1a\xbf" + "\x65\x35\xcb\xe5\xbb\xa7\xc6\x23\x2c\x35\x8e\x5b\xb1\x90\xe0\x3e" + "\x78\x43\x1d\x94\x0b\x53\x78\xf6\x4a\xbf\x60\xfc\x87\xaf\xe5\x75" + "\xc4\x24\x82\xee\xb3\xce\x5e\xe9\x14\xc8\xb3\x88\xa4\x1a\x87\x37" + "\xd4\x45\x68\xc3\x03\x78\x1b\x24\x3c\x4f\x4d\x3d\xca\xfa\xb9\x5c" + "\x24\x1c\x86\xc1\x65\x67\x87\xc9\x8a\xf2\xf5\x7d\x49\x35\x95\xf8" + "\xdb\x8b\xbf\x4e\xd4\xed\x15\xee\xb4\x4f\x05\xe6\x39\xe1\xa9\xb5" + "\x88\xe4\x5a\x5b\x0f\xec\x76\x49\xcb\x30\x0d\x13\xa5\xb5\x18\x7f" + "\x9a\x0a\xde\x02\xbe\xb5\x13\x25\xbe\x65\xb5\x3f\xec\x91\xfd\xa8" + "\xfd\x81\xea\x47\xed\x9d\x9c\xde\x8d\x39\x1e\xcf\x39\xdd\x2a\xef" + "\xa7\xa8\x37\x47\xd6\xf3\xd4\xe6\x08\x4b\x6d\x7e\x10\x32\x03\xba" + "\xba\x98\x8e\xa0\xab\x8b\x69\x09\xf8\x39\x5e\xc7\x46\x12\x49\xb5" + "\xf9\x7d\x49\xb5\x0e\xd4\x2f\xeb\x93\x73\x6f\x6d\x65\x8f\x82\xfd" + "\x26\xe0\xcc\x05\x5f\x26\x02\x46\x25\x60\xd5\xf7\xb9\xed\x34\x7b" + "\xa5\x08\xce\x0e\xad\x0d\xe5\xae\xa4\xc4\xb1\xe4\x02\xbe\xfb\x41" + "\xa3\x3c\xf4\xb3\x05\xbf\x53\x91\x4f\x57\xa3\xad\x4f\x00\xb7\x92" + "\xdb\x43\x3b\xf5\x80\xf9\x0e\x60\xe5\x31\x4e\x17\xdc\x94\x8a\xf7" + "\xbd\x17\x14\x7e\x6d\x9a\xa7\x36\xa8\x59\x6a\x3b\x0d\x1e\x62\xfe" + "\x51\x74\xab\xa0\x59\x01\x11\xf2\x86\x76\x10\x78\x2c\xb5\x35\x70" + "\x8c\xf3\x61\xeb\xef\xc6\x38\x33\x4f\xad\xc7\x6f\x1d\x31\xff\xb4" + "\x16\x2e\xe3\xb2\x9f\x30\x0f\xcd\x2a\x0c\xac\x1d\x47\x85\x09\x78" + "\x77\xe6\x86\x2c\xf4\x74\xa1\xd9\x15\xf6\xd4\x1e\x6c\x2d\xe4\x71" + "\x39\x8a\x3a\x5c\xaf\x80\xac\x09\xb0\x77\x13\x44\xc8\xea\xf0\x9b" + "\xaf\xcc\x77\x8a\xd6\x40\x16\xca\x16\x12\xf7\x87\xf9\x88\xcb\xcf" + "\xec\x12\xbe\xb0\xe5\x6d\x07\xf7\x4d\x0c\x77\xd1\xe1\xae\x3b\x89" + "\xd7\x1c\x87\xbb\xea\x98\x4f\x35\x61\x79\x7b\x3a\x78\xb4\x6f\x66" + "\x97\x6b\xc8\xd3\xe7\x28\x01\x69\xe1\xc3\xf9\xbb\x91\xdf\x82\x72" + "\x87\x24\xdf\xce\x3a\x17\xb2\x86\x2c\xb5\x7b\x43\x9e\xb7\x73\x66" + "\x9d\xeb\x13\x87\xf3\x2b\xe8\xa9\x2e\x17\x68\xb5\x9b\x66\x9e\x0a" + "\x25\xb6\x16\xe6\xa1\x4c\x0f\xd2\xeb\x24\xff\xcf\x3c\xd5\x2d\x66" + "\xbd\x24\xce\xcc\x3a\xf7\x17\x31\x33\x5f\x7c\x92\xeb\xa0\xe1\x57" + "\xac\x15\x1a\xcb\xc5\xa1\x8e\xdd\x74\xc5\x31\x1f\xb1\x4c\x64\xcd" + "\xd7\xc4\xcc\x53\x67\xc4\xd3\x2f\x31\x6d\x26\xd1\xe1\x7c\xc8\x8f" + "\xa3\x82\xe9\xdd\x76\x38\xbf\x09\xed\x4f\x05\x5c\xa7\xf0\x3a\x76" + "\xa0\x6c\xb3\xf5\xa9\x53\xa9\x74\xa8\xa3\x82\x42\x49\xb5\x7b\xc3" + "\xa5\xb5\x07\xb5\xa4\xda\x4e\xad\xb4\x36\x28\x92\xde\x9e\x1e\x2a" + "\x7d\x3b\x27\x9c\xf4\x36\x78\xe0\xed\x83\x18\xa7\x24\x1e\xf3\x5e" + "\xac\xc1\xf1\xfe\xaf\xbd\x3c\xfe\x9e\xb7\xdb\xd0\xd7\x20\xf4\x9d" + "\x50\xbc\xff\x76\x1b\xaf\xa3\x51\x37\xd8\x97\xf4\x76\x27\xca\x05" + "\x95\x7c\xed\xb2\x30\x5f\xca\xf9\xa6\x6c\xd7\x30\xcc\x0f\x89\x7d" + "\x49\xbb\x6c\xf8\x4b\xc7\xdf\x44\xa4\x79\x00\xff\x2a\xc9\x53\x9e" + "\x5d\x1e\x71\x4f\x39\x6c\xc7\x73\xcc\x93\x4e\x91\xb4\xab\x7e\x76" + "\x78\xa2\x13\x74\x84\xac\xec\xf2\x68\xa5\xbb\x2a\x01\xef\x60\x50" + "\xf2\xff\xae\xff\xc5\xf0\xfb\x56\xa7\xf3\x1a\xdb\x8c\xfc\x36\x51" + "\x56\xf7\x60\x0f\xf3\xab\xa5\x6e\xba\x66\xa9\xab\x17\x9e\xba\x9c" + "\x9f\x6c\x10\xfe\xb0\xa7\xce\xa1\x79\xea\xf2\x43\x43\x61\x97\x3a" + "\x9a\x88\x75\x54\xe8\x77\x02\x74\xf8\x03\x68\x52\x27\x79\xc0\xeb" + "\x80\x1c\xac\x1c\xe5\x3a\xdc\x05\x7e\x28\xfc\xb5\xd4\x4f\xad\x81" + "\xa3\x92\xae\x22\xa9\x6e\x3a\xf3\x15\x8f\xf1\xd3\x85\xe4\x12\xa5" + "\x75\x39\x5a\x69\x5d\x7e\xb8\x14\x70\x93\xd0\x4e\xf2\xcf\x4f\x06" + "\xa5\xcc\xfe\x1c\x3c\xdb\x84\x3a\x7f\x20\xc5\xe7\x3f\xef\x1c\x4c" + "\x4f\xb2\xbe\x62\x1d\x35\x3b\x14\x64\xbe\xf9\x92\x75\x9b\xd2\x55" + "\x94\x6b\xe8\x2a\xd6\x53\x6c\xeb\xb3\xae\xd2\x74\x5d\xa5\xe9\xba" + "\x4a\xbe\x5b\xa0\x6f\x3c\x35\x0e\xd6\x49\xb3\x1d\x4a\xd7\xcc\x0e" + "\x67\x08\xf0\x47\x0a\x60\x38\xd4\x78\xa0\x4c\x59\xcd\x06\x59\x5e" + "\xd2\xa9\xa6\x5e\x83\xce\xc1\xdf\x5e\x4d\xe9\x9c\xa0\xae\x73\x4c" + "\x86\xce\x09\x63\xfe\x82\x5c\x69\xf1\x74\x8e\xa6\xeb\x9c\xb0\x50" + "\x3a\x47\xd3\x75\x0e\xa7\x87\x75\x9d\x13\x8e\xa3\x73\x20\xd3\xdc" + "\xdf\x44\x5d\xd7\xb8\x58\xd7\x70\x7f\xc1\x6f\xf9\x9a\xd2\x35\x1e" + "\xd8\xf9\x26\xd6\x35\x61\xd4\xd1\x0c\x5d\xd3\x23\xeb\xd7\xb3\xbe" + "\xe9\xfb\x67\x82\x0e\xb5\x13\xeb\x19\xa9\x53\x42\xd7\x87\x58\xa7" + "\x80\x7e\xf7\xc6\xea\x14\xc0\xdb\x8b\xe7\x54\x5d\x57\x75\x5a\xd7" + "\x8a\x10\x74\xca\xc1\xd9\x8e\x00\xc6\xfa\x73\xac\x75\xa1\xbb\x1d" + "\x45\x2e\xaf\x23\x44\xd0\x05\x41\xd1\xea\x22\xe0\x08\x1e\x0e\x43" + "\x5f\x10\x41\x36\xa7\x87\x20\xe7\xe0\xf3\x9c\xd6\xc2\xcf\x28\x0c" + "\x79\x9d\xd9\xd5\xed\x7d\x3a\x90\x9e\x3a\xf3\x94\xf0\x83\x3e\xbe" + "\xa7\x0b\x5d\xd0\x31\xe9\xfe\xc3\x5d\xfb\x29\xab\x43\x68\x59\xf3" + "\x7c\x76\xc8\x41\xce\xcc\x45\xcd\xd6\xa7\x5f\x4a\x85\xac\x89\x66" + "\xe8\xc6\xff\x6b\xe6\xa9\x54\xeb\xdc\x0e\xba\x36\x6b\xbe\xd0\xc2" + "\x90\x35\xf4\xf7\x20\xfa\xdd\x06\xdc\x3b\x21\x77\x41\xc8\xda\xf4" + "\x50\x8c\xac\x89\xe4\xb7\xff\x15\xcf\x76\x45\xbf\xb7\x83\x90\xb5" + "\x36\x4d\xce\x69\x1d\x72\x7d\x85\x76\xe4\xde\x13\xe4\xad\x4d\x2b" + "\x55\xf2\xa6\x09\x25\x6f\x1a\xd3\xcf\xa4\xcb\x1b\xc6\x02\x72\x63" + "\xc3\x5f\x3a\xfe\xe2\xcb\x5b\x61\x8c\xbc\xbd\xa4\xcb\x5b\x92\x92" + "\x37\x8c\x6b\x62\x78\xb5\x92\x39\x6e\x83\xd7\x61\xfd\x32\x97\x5c" + "\x37\x5d\xb0\xed\x28\xf9\x47\xca\x1d\xe6\x97\x3a\x07\x64\x2e\x1f" + "\x32\x07\x78\xc2\xcf\xfa\x13\xfc\xf9\x5f\x3c\xe7\xcd\x2a\x14\xff" + "\x95\x1b\x1e\xe5\x82\x4c\x39\xa0\xd3\xfe\x02\x7d\xfa\x5f\x4f\x07" + "\xa8\x06\x32\x35\x1d\xb2\x94\x03\x99\xca\x87\x6c\xb1\x4c\x75\x86" + "\x57\x33\xcc\x9f\x77\xf6\xc3\x90\x73\x66\xb4\x4c\xa9\x9d\xeb\xf8" + "\xfb\x7f\x3d\xee\x6b\xa1\x19\x3f\x6c\x62\x7b\x05\xcf\x9d\x3e\xfa" + "\xa8\x5c\x7f\x0e\xf8\x68\xfb\x46\x69\xeb\x40\x16\x0b\x4b\xe8\x9a" + "\x93\x74\x5d\x3d\xf8\x9e\xf0\x9c\x82\xe7\xdd\xb3\x6f\xfe\x04\x36" + "\xc5\x97\x1e\xb4\xdd\xc3\xf2\x28\xdc\x13\xb0\xb6\xa0\x4c\xf0\xa3" + "\x45\xf4\xa4\xa7\x88\xe4\xc6\x6b\x45\x9f\x8d\xf7\x98\xac\x78\x1f" + "\x0e\x1a\x8c\xc1\xef\x88\x1d\xe7\x29\x0d\x7f\xb6\x1d\x6e\xcd\xc5" + "\xf6\x15\x9e\x33\xc4\x0a\x5b\xf2\xe6\xe5\x34\xd6\x1a\x20\x4b\xb5" + "\x5b\xcb\xb1\xae\x4d\xe5\xbd\x96\x34\x7e\x16\xee\xea\x86\xea\xf3" + "\x64\x66\x3b\x52\x4b\x42\x7b\x0e\xab\x10\x4b\xd3\xa9\x7a\x09\xf4" + "\x84\x9b\x6c\xd5\x6e\xd1\x10\xee\x61\x3a\xd4\xe4\x18\xb8\x30\x6e" + "\xc0\xf3\xbb\xc0\xb3\xe9\xd1\x95\x99\xf4\x07\x07\xc5\xdd\xa3\xec" + "\x71\x5f\xd7\xdf\xff\x41\xf2\x43\x06\x4d\xe2\xe7\xdb\x47\x1b\x74" + "\x1a\x64\x3f\xcb\xcc\xf3\x75\x78\xb9\xf0\x6f\x79\x8e\x98\x16\x36" + "\x67\x48\xfc\x15\x74\x74\x95\x84\xe9\xbb\xb3\x57\x5e\x27\xbc\x5d" + "\xa2\xd9\xeb\x38\x45\xd5\xc8\x2f\x29\x16\x9a\x96\xd4\x08\xde\x6d" + "\x08\x75\x2f\x17\xa1\x1d\xd2\xee\xb5\xbb\x7c\x74\xb7\x5d\x8d\x45" + "\x6d\x9b\x5c\xd7\x59\x1a\x42\x80\x75\x15\xc3\x3a\x8c\xfa\xe1\xd2" + "\x46\xd8\xa7\xf6\x7a\x1f\xb5\xc8\x33\x03\xc8\x73\x5b\xe1\x2a\xfa" + "\xce\x49\xb2\xfb\xa4\x6d\xef\x69\x4c\x63\xbd\x80\xb4\x54\xa4\x75" + "\x89\xd2\x46\x1b\xca\x63\x7d\xdc\xe0\x53\xb6\xae\xbd\xcb\x28\x87" + "\xe7\x66\x7e\x8e\xe2\x21\x79\xaa\x41\x18\x2f\xfb\xc0\x61\x48\x82" + "\xce\x56\xc6\xbf\x54\xfc\x65\xc6\xcf\x1e\xd0\xeb\x6f\xe7\xc0\xee" + "\x22\xe7\x1a\x1a\x8d\xf1\x01\x7e\xd7\xcf\x77\x3a\xc4\x09\xe1\xb6" + "\x07\x77\xad\x0a\x62\x5d\x70\x7d\x81\x8f\x5e\xee\x18\xdc\x7e\x86" + "\xdd\x73\x5e\x74\x6e\x59\xde\x4f\xcb\xe3\xb3\x57\x6a\x82\x9f\x59" + "\x2f\x55\x23\x9d\xe9\x06\x38\x7b\x0c\x9a\x0d\x3e\x2e\x8d\xa9\x6a" + "\x1d\x78\x43\x9a\x70\x0b\x6a\xbe\x96\xcf\x0f\x6e\xb8\x46\xd1\xe1" + "\xed\xce\x6e\xe8\x13\xde\x1f\xad\x06\xbd\x97\xda\x44\xb0\xc7\x7d" + "\x03\xec\xff\x5b\xca\xf5\xbd\x98\x80\x37\x34\x8d\x75\x4c\xdc\xf9" + "\x8b\xcf\x67\x06\xe0\x7f\x6f\x42\xeb\x68\xe8\x23\xa9\xa3\x9a\xc6" + "\x94\x28\xbc\x83\x0c\xb7\xb9\xe4\x2c\x75\x20\x7f\x69\x40\x74\x0a" + "\x4f\x93\x8d\xd7\x1a\xcd\xcb\x7b\x39\xed\x4e\xf0\xb6\x68\x5e\xc2" + "\x38\x7d\xef\xce\xe6\x6b\x7b\xe9\x04\xd6\x79\x58\xe3\xf9\xd5\xbe" + "\xcc\xf7\xec\x07\x8a\x48\xdf\xeb\xb9\xa1\xc6\x47\x63\x73\x0c\xbc" + "\xd8\xde\x00\x7d\x99\xd6\x6d\x6c\x77\xf0\x9e\xfb\xd2\x62\x11\x64" + "\xfb\x03\x65\x0f\x19\x7d\xe0\xfe\xe9\xfd\xf2\x45\xf6\x0b\x38\xf8" + "\xb1\x66\x96\x34\x58\xba\x92\x2c\x76\x45\x6b\x0b\xf7\x97\xfb\xc2" + "\x7d\x96\x7d\x91\xba\x16\x73\x45\xe8\x4e\xac\xc1\x64\x3a\x60\x7d" + "\x0f\xeb\x9f\x5b\x02\x8a\xa7\x6e\xa8\x89\xe5\xa3\xfe\x71\xb4\xd4" + "\xd6\x3b\x2f\xd0\xb5\x4e\x4d\xb4\x03\xe6\x3e\xd0\x29\x91\x7f\x35" + "\xb6\xb9\x83\xcc\xbf\x1f\xfa\x78\x6e\xf6\x16\x9f\x63\x5b\x9b\xcb" + "\x5e\x8d\xb2\x1d\x28\xf3\x2f\x7a\xd9\x7f\x51\xe7\x2d\xf2\x77\x18" + "\xff\x62\x3e\x7b\x07\x78\x34\xfb\xe5\xbc\xff\x5b\x9f\xf1\x2e\xf0" + "\x8e\x5f\x87\x28\xfd\xd0\x17\x1f\x97\xba\x7a\x9e\xd7\xc2\xe7\x45" + "\x17\xda\xf9\x16\xf3\x94\x73\x25\x7d\x1b\x7c\x79\xbc\x64\x0d\x5d" + "\xcd\xfc\x24\x92\x1a\x47\x2b\xba\x8f\x49\x11\x6e\xd8\xa1\xd0\xaa" + "\x85\xcb\xe9\x3b\x90\xa3\xb4\x93\x34\xe6\xfa\xdc\x62\x3b\x70\x25" + "\xda\x72\x9a\x48\xea\xa0\xa4\x46\x9b\x37\xf4\x05\x55\x9f\xe6\xfd" + "\x96\x31\x99\x06\x2f\xe2\x39\xeb\x52\xfa\x02\xf3\x4d\xba\xda\x2f" + "\x18\xb3\x8f\xf7\xd7\xdb\x69\x4c\x1d\xf7\x17\x7f\x09\x48\x7b\x43" + "\x9c\x17\x73\x85\x9c\xdb\x76\xd9\x7c\x34\xe6\x08\x7e\xd3\xe5\x9f" + "\x9b\xe6\xe9\xef\x36\x94\x5b\x2f\xce\x6b\x5c\x26\x1d\x69\x55\xc2" + "\x9d\xc0\x32\xd1\x84\xb6\x0f\xfa\x68\xf2\x44\x35\x36\x63\x2a\x18" + "\xd6\x20\x38\xd8\x30\xb6\xc4\xbc\x79\x82\x6e\xbc\xcd\x5e\x92\x00" + "\x3c\x6e\x1c\x22\xe5\x02\xb0\xaa\x4d\x4a\x6f\x6b\xc0\x75\xa7\x5b" + "\xcb\x87\x8e\xce\xd7\xca\xf6\x65\xca\x67\x3d\x4f\xe8\xf3\x69\x7c" + "\xf8\x4d\x63\x9a\x47\x31\x8f\xdf\xb8\x51\xc1\x69\xb2\x35\x8f\x3a" + "\xc9\xef\x9b\xf8\x3d\x60\xf9\x38\xd3\x5b\x99\x89\xf6\x4f\x72\xbb" + "\x1b\xd5\x3e\xc0\x8d\x9b\xba\xd1\x46\x8f\xfb\xc6\x8d\x3e\x1a\x97" + "\xa7\xce\x1a\x3e\xce\x1c\x44\xf6\x52\x59\x76\x58\xe6\x94\x4c\x7f" + "\x7f\xe6\xe1\x1a\x96\xbf\x5d\x96\x6e\xcb\xae\x74\x5d\x6f\xf0\xde" + "\x4a\x4a\x3b\x7d\x3f\xeb\xb0\x4d\xf2\xb7\x49\x98\x6e\xec\x7a\x57" + "\xf3\x9b\xf8\x3c\x48\xa9\xaf\xef\x67\x5d\xfc\x77\x13\x14\xe0\x4d" + "\x19\xf8\x9b\xa4\xbf\x4f\xc7\xdf\x5c\xfc\xed\xc6\xfb\x24\x49\xbb" + "\xed\x79\x09\x3e\xe4\x75\xc3\x7e\xe7\x77\x1f\xdd\x94\x2e\xb6\x8f" + "\x31\x09\x8b\x7a\xae\xfe\x36\xef\x25\xdc\x34\x07\x63\x70\x4c\x8d" + "\x05\xc3\xa1\x04\xe0\xc6\x74\x17\xce\x4a\x11\x6c\x29\x09\x00\xef" + "\x9b\xd6\xb7\x54\x06\xc8\x7e\x13\xf7\xff\x26\x0f\xf7\x29\x00\xfa" + "\xf3\xef\xd2\x4a\xe1\x3f\x50\x15\x22\x3e\x97\x02\x2c\xc8\xff\xcf" + "\xa6\xaa\x7d\x89\xa6\x4c\x86\xa7\xf3\x84\x30\xfa\xaf\x74\xda\xc7" + "\x99\x3c\x96\x80\xf5\x19\xfa\x6e\x3d\x4d\xdf\xbf\x46\x24\xef\xcb" + "\x3c\x90\x4f\xb4\x03\x7a\x04\x73\x8d\xdc\x2f\x87\x5e\x62\x98\x98" + "\xff\x6f\x9c\x64\x9c\xa3\x6c\x42\xfe\x66\xe4\x61\xee\xf1\x1f\xce" + "\x0f\x12\xc3\x0a\x73\xff\x50\x7f\xbf\xe6\x37\x63\xae\xc6\x98\x7f" + "\x9c\x59\x52\x08\x3d\xd3\xaf\xb7\x6e\x6a\x5a\x73\x4a\x04\x8d\xfe" + "\xf1\x59\x65\x8f\xfb\xfb\xe0\xff\x45\xf3\x06\xe5\xff\x7e\x9c\xd3" + "\x17\x1d\x18\xa3\xc6\x4c\x03\x5d\xa2\xc7\x2c\x3d\x5f\x8d\xd7\xf7" + "\xab\xa2\xc7\x2b\x1d\x3d\xf9\x7e\x07\xfe\x42\x78\x4e\x51\xef\x91" + "\x7f\xdf\x3f\x12\xf1\x0e\xee\x48\x9f\x03\x7c\x30\xff\x8f\xc9\x51" + "\xe3\xc0\xe9\xe8\x07\xf3\xc8\x57\x64\xe1\xfd\x39\x3e\xa7\xe4\x74" + "\xe6\x67\x4e\xd7\x60\xcf\xa0\x3f\x7e\xe4\xa7\xb2\xac\x6e\xd1\x28" + "\x2a\xdf\xbb\x1e\x3c\xb7\xaa\x97\xf1\xbf\x4f\xee\x29\xae\xf5\x78" + "\x98\x4f\x51\x27\x60\x0d\x79\x60\x57\xa6\x67\x19\x74\x45\xbd\x09" + "\x9c\xcf\x3c\x89\xf4\x3c\xd0\xa5\x46\x9e\x43\x62\xed\x17\xdf\xd6" + "\x48\xf7\xf4\xdb\x64\x96\x5d\x1e\xd6\x47\x5d\x74\x73\x05\x74\x16" + "\xc6\x76\xdf\x44\x35\xd7\xdc\xfc\x06\xbf\x43\x57\x1e\xc7\x73\xf9" + "\x61\xe8\xa4\xde\xb2\x06\x57\x9f\x89\x86\xf5\x9a\x28\x33\x54\xf6" + "\xe5\xee\x50\x72\xfd\x46\x6f\xe7\x1e\x6a\x0d\xbd\x4f\xf6\xe7\x24" + "\x8c\x52\x2f\x7a\xee\x5c\x29\xc2\xef\xf5\xd6\x9b\xbd\xa1\x33\xcd" + "\x98\x9b\xaf\x3b\x49\x37\x4b\x7a\xbc\xd2\x8e\x59\xff\x69\x09\x5b" + "\xa7\xcf\x97\x9e\xcd\x0b\x45\x68\xf3\x09\x11\x80\x7d\x97\xbc\xa9" + "\x97\xc6\x6e\x5b\x45\x19\x55\xbd\x34\x66\x67\x2f\xa5\x8b\x2f\xd3" + "\x4d\x55\xb0\xdb\x9e\x3e\x97\x4a\xd0\x09\x39\xc3\x0b\xc9\xb2\x73" + "\x15\x49\x1e\x09\x97\xc2\x7e\x0b\xc1\x7e\x3b\x93\xce\xba\xb1\xdf" + "\x7e\xeb\x93\xb6\x71\xe3\x7a\xc5\x47\x8d\xeb\xaf\xcc\xa7\x84\x94" + "\x79\x94\x0a\xfc\x9c\xa7\x29\xfd\x8f\x29\x1d\xb0\x1d\xd1\x67\x9f" + "\xde\x5f\xd0\xee\x98\x35\x9f\x86\xc9\xbe\x42\x5f\x8b\xd2\x7d\x13" + "\x07\x9d\x87\x4d\xcc\x53\x01\x96\x1b\xee\xc3\x71\x3e\x2b\xdd\x33" + "\x2a\x68\x5e\x5a\x25\x82\x9c\x5e\x74\xbd\x08\x22\xfd\x20\xb7\xdd" + "\x80\xf4\x1e\xf7\xcd\x7e\x9f\xa9\x6a\xee\x60\x3c\x8a\x75\x92\xae" + "\x57\x6e\x79\x49\x98\x5c\xcc\xa3\x07\xd7\x84\x60\x7f\x9f\x66\x99" + "\xbd\xa5\x70\x76\x81\x08\xd9\x17\xf3\xb9\xf5\x2d\xf3\xf8\x4c\x9d" + "\xcf\xd2\xde\x85\x6d\xf3\x75\xe7\xe8\x3c\x5f\xf0\x7a\xc1\x5a\x00" + "\x98\x65\xbb\x0e\x0a\xac\xd3\xbf\xa9\x1d\xcf\xbe\x1c\xaf\x4b\xbf" + "\x91\x5b\x76\xfb\xe8\x27\x66\xc6\x9d\xcf\x4c\x59\x77\xc2\xde\xba" + "\x1a\x78\x75\x06\x40\x07\xe4\x63\xfe\xff\x71\x9b\x7e\xee\x29\xfd" + "\x51\x90\x86\xf9\x7f\xc6\x68\x4e\x2b\xba\x9e\x6c\x45\x76\x31\x98" + "\x4d\x63\x96\x3e\x22\x26\xfa\x56\x8f\xfb\x9f\xd2\x0c\x38\x98\xa7" + "\x7e\xd9\x6d\x7a\xf4\x51\xa4\xa5\x1b\x70\x50\xe6\x1a\xbc\x4f\xec" + "\x2f\xa3\xea\x4c\x8f\xa8\xf3\x68\xb7\xe9\x96\x5f\x22\x6d\x6e\x4c" + "\x9d\x82\x98\x3a\xc5\x11\x75\x5c\x7a\x3b\xe5\x31\x75\x6a\x62\xea" + "\x34\xc4\xc1\xad\x25\xa6\xce\xd1\x98\x3a\x1d\x71\x70\x0b\x46\xd7" + "\x19\x6b\x89\xae\x33\xd6\x16\x41\x4b\xf6\xd7\xc8\x40\xda\xd8\x98" + "\x3a\x93\x62\xea\x64\x19\xef\x83\xf9\xe4\x2c\xdd\x41\x36\xf0\x66" + "\x27\x8f\xe7\xeb\x18\x9f\xee\x37\x9f\xef\xd1\xeb\x7a\x2e\xee\xd7" + "\xd8\xaa\x98\xf6\x76\xc7\xb4\xd7\x74\x71\xbf\xc6\x1e\x89\xa9\xe3" + "\x8b\xa9\xe3\x8f\xa8\x53\xa3\xda\x19\x67\x8e\xae\x33\x2e\x2d\xba" + "\xce\xb8\x31\x17\xf3\xd5\xb8\x89\x31\x75\xa6\xc7\xd4\xc9\xf9\x1a" + "\x5a\xf0\x3c\xae\x7c\xa7\x46\xb2\xad\x7c\x3f\x6c\x84\x71\x9f\xb2" + "\x4f\xc0\x16\xb4\xb1\xab\x37\x38\x84\xcf\x3f\x78\xbe\x3a\xe0\x08" + "\x62\x6e\x19\x87\xf5\xcf\x1d\x76\x63\xce\x62\x7f\x09\x96\x69\x65" + "\x63\x8f\xf3\x0c\x66\x8b\x72\x3b\x86\x2f\x15\xb7\x75\x60\x34\xcf" + "\x53\xe3\x02\xfd\x36\xb1\xf2\x2f\x22\x05\xe7\xd6\x19\x0c\x87\xdb" + "\xaf\x56\x7e\x18\x09\x6c\x93\x1f\x70\x70\x9d\x5b\xd3\x23\xec\x68" + "\x6e\x3f\xb0\x67\x55\xd0\x1c\x8d\xc7\xad\x96\x4b\xe0\x91\x02\xdb" + "\xc8\xd2\x5a\x45\xc4\x67\xcc\x87\xab\x60\x03\xc1\xee\x67\xdc\xda" + "\xe9\xd6\x72\x69\x93\x2d\xee\x25\x7e\xf6\x16\xdf\x2d\xcf\xa0\x95" + "\x4d\x7a\xeb\xc1\x16\xb4\xcf\xb6\x7b\x4b\xe1\x59\xea\x96\xf3\x2f" + "\xdb\x6e\xb7\x9e\x3b\x50\xec\x67\xbc\x9a\x0d\xff\x0c\x1f\xdd\x1a" + "\x90\xb6\x86\xa7\x49\x9e\x8f\xf3\x99\xd1\x81\xc0\x44\x2e\x03\xfe" + "\x1f\x77\xc8\xe8\x2f\xe6\x7a\xf0\xc0\xad\x55\x97\xa2\x99\x1a\xc3" + "\xf1\xa3\xa3\x79\x72\x08\x78\x65\x7c\x46\xf4\xb8\x8f\xcf\x8c\x1e" + "\xf7\xf1\xd9\xd1\x3c\x69\x02\x4f\x8e\xcf\x8b\xa9\x53\x14\x53\x67" + "\x7d\x44\x9d\x72\xbd\x9d\xca\x98\x3a\xf5\x31\x75\xf6\x46\xbc\xa3" + "\x8f\xe3\x0f\xf6\xaf\x7d\xa4\xef\xcf\xf8\xb6\x88\x77\x53\x85\xd4" + "\x9f\xe3\xbb\x8c\x34\xde\x43\xda\xb9\x55\xf9\x9e\x28\x78\x19\x96" + "\x18\x79\x47\xf9\x8c\xd1\xd1\x38\x64\x8c\x8d\xc6\x21\xa3\x5f\xfe" + "\xb7\xa8\xb5\xdb\xef\x4f\xd0\x6d\x69\x92\x87\x20\x23\x98\xb3\x67" + "\xf3\x3b\x60\x55\xa2\x3c\xe8\x90\x51\x10\x03\xaf\x38\x06\xde\xc6" + "\x88\xf7\x54\xbc\x57\x45\xf4\x21\x35\xd1\x26\xfd\xf8\x60\xbf\x65" + "\xec\x31\xd2\x79\x4d\x09\x7c\x3b\x9d\x72\xae\xc9\x64\x9f\xaa\x11" + "\xed\x94\x51\xcb\xeb\x4f\x1d\x66\xa4\xfc\x93\xde\xaf\x40\x34\x1e" + "\xb7\x99\xa3\xf1\xb8\x2d\x2d\xa2\x5f\x01\xeb\x5a\x7a\xc8\x1a\x7a" + "\xf8\x71\xb6\x7d\xd8\x17\x4e\xfa\x36\xad\x81\xcd\x76\x8e\x52\xd9" + "\xa7\xec\x44\x11\x25\x7a\x1d\x9d\x58\xcb\x35\xba\x06\xe5\xa7\xe4" + "\xa6\x54\xdd\x2f\xcf\x0e\xf8\x45\x06\x3f\x6a\x65\x4d\xa9\x5a\xe9" + "\xde\xb1\x48\x83\xfe\x1b\x4f\xca\xce\xfd\xc8\x21\x9c\x39\x95\xa0" + "\x27\xd6\x45\xb7\x2f\xd3\xd7\x11\x63\xd8\x37\x0a\xba\xa7\x13\x73" + "\x7c\x8a\x3a\x1b\xbf\xad\x29\x82\xaf\x03\xf6\x55\xf7\x8a\x76\xba" + "\x7d\x2d\xdb\x00\x2c\xa3\xec\x63\x75\x20\xe4\x27\x5e\x7b\x7b\x43" + "\x27\xa5\xed\x86\x7c\x97\x5e\x37\x18\x51\xd7\xaf\xaf\x8d\x79\x1e" + "\x35\x8f\x0f\x91\xf9\x40\xc0\x4f\x80\x93\xa6\xec\xbd\xdb\xd7\x1e" + "\x80\xbc\xf6\xb8\x6f\x1f\x6b\xd4\xe1\x75\x34\xd7\xb1\x16\x91\xf9" + "\xd6\x62\x32\x37\xaf\x6a\x97\xb0\xf5\xb1\xef\x84\x2d\xdd\xe5\x2d" + "\xee\x24\x6f\xa0\x8d\xf7\xba\xcc\xca\x4f\xe5\x76\x57\x62\x90\x2c" + "\xdd\xa5\x4d\xb0\x2b\x6f\x77\x85\x4b\x9b\x78\xbd\x64\xf7\xd1\x6d" + "\x75\xac\x6f\x22\x69\x37\x6d\x5a\xf6\xc3\xb3\x67\x8e\xfb\xe9\xc3" + "\x33\xe6\x4c\xbb\xdb\x3e\x67\xd1\x0b\x0b\xf2\xc6\xbd\xb8\xac\xc8" + "\xbe\x62\xc9\xa2\xa2\x45\x8b\x7f\x66\xcf\x70\xdc\xe8\xb0\xcf\x2f" + "\x52\xbf\xe9\x05\xf3\x97\x16\x4d\xe6\xc7\xb1\xf6\xc2\x25\x0b\x96" + "\xcb\xc7\x9b\x93\x29\x1a\xc8\xa2\xa2\x05\x4b\xec\x37\xe6\x8d\xb5" + "\x3f\x30\x7f\x51\xc1\xb2\x25\x0b\xe2\xc2\xba\xdb\xbe\x64\xc1\x92" + "\x05\xf3\xf3\xec\x93\xed\x19\x0c\x39\x12\x5c\xc4\x78\x66\x18\xf3" + "\x18\xcf\x5f\x5b\xdc\xe2\x88\x3e\x9f\xf9\x14\xff\xdc\x31\xe7\xe2" + "\xb9\xec\x8e\xfc\x68\x9e\xbb\xc3\x11\xcd\x73\x77\x78\x2e\x9e\xcb" + "\xee\x88\x99\xff\xee\x88\x99\xff\xee\x68\xba\x78\x2e\xbb\x23\x66" + "\xfe\xbb\x23\x66\xfe\xbb\xa3\x7f\xfe\x03\x2f\xf9\xd6\x49\xbd\x30" + "\x21\x66\xfe\x9b\x10\x33\xff\x4d\x18\x13\xf3\x3e\x21\xe2\xfd\x6a" + "\xbc\x4f\x8d\x9c\x1f\xf1\x3e\xc7\x90\xcf\x01\xfd\x32\x21\xdf\x28" + "\xc3\xba\x1e\xba\xb9\x43\x2f\xeb\x8a\x28\xdb\xa9\x97\xad\xe8\x97" + "\x3f\x3e\xfb\x46\xba\x5a\xaf\x4f\xb8\xc0\x3a\x9d\xfd\xd0\x78\x6e" + "\x82\x7c\x5c\x77\x9a\x26\xbc\xc4\xb0\x98\x87\xd9\x2f\x51\xbc\xf9" + "\x64\x4f\xf5\x08\xb2\x70\x9d\xea\xd7\xc8\x2c\xdc\xb7\x6f\xc4\x2f" + "\x21\x2d\x05\x7f\xd0\x29\x13\x60\xff\xee\x18\xab\xe6\x8b\x3b\x33" + "\xa5\xcd\x8f\x3a\x0a\xfe\x9d\x72\x5d\x03\x38\x36\xd4\xb1\x6c\x51" + "\x73\x71\x07\x9e\x53\x98\xa7\x51\xdf\x2c\x4c\xb7\xff\x07\x7e\x09" + "\x69\xa9\xf8\x4b\xeb\x71\xdf\x99\x69\xc0\xe3\x33\xf2\x78\xf2\x1f" + "\x6b\xe7\xf6\xaf\x07\x4d\x64\xdd\xe2\xd6\xda\xbc\x1a\xdb\xd6\x77" + "\x16\xa9\xbd\x85\x86\x1a\xe1\xfe\x24\xa7\x1a\xe9\xf1\xd7\x49\x77" + "\xc2\xfe\xbb\x33\x5f\xed\xb7\xdc\x89\xf1\xff\x49\x85\xda\x3b\x6d" + "\xa8\x81\xbe\xed\x3d\x41\x3f\x78\x14\xbf\x7d\xf8\xbd\xcb\x80\xdf" + "\x2c\xd7\xdb\x77\x1e\x15\xee\x84\x47\x18\x6e\x4c\x7a\x17\xf4\x5b" + "\xaf\x35\xe4\xca\xb9\x38\xef\x07\x58\xc3\x24\x3e\x1c\x27\xdd\x0e" + "\x9b\xa1\xd7\x47\x3f\x98\xc3\xf8\x46\xa4\x4f\x14\xee\xe1\x73\xb8" + "\xbc\x8f\xdb\x43\x9d\xc1\x6c\x6d\xc3\xef\x54\xf9\x89\xff\x60\x7d" + "\x4c\x3f\x2e\x9c\xa0\x1f\x26\xa8\x7e\xfc\xf0\xa9\x98\xb6\xab\xe2" + "\xf7\xe3\x07\x7b\xd0\x8f\x0b\x83\xf4\xe3\x88\xa4\xad\x09\x7d\x31" + "\x5d\x94\xc7\xf6\xcf\x05\x49\xf7\xa8\xf4\x1f\x9a\x75\x5b\x28\x80" + "\x75\x58\x2a\xf2\x64\xdd\x47\x8a\x07\xc6\x4d\x2f\x37\xd6\x5a\x49" + "\xd9\x17\xb7\xf9\xc3\xa9\xc2\x3d\xec\x11\x1f\xfd\xb0\x58\xc2\x19" + "\x48\x9f\xab\x70\x01\x9d\x4c\x4c\x27\xf4\x07\xf5\x06\x1b\x6f\x63" + "\x5d\xa2\xf6\x42\x7e\x08\xf9\xff\xc1\x3c\x63\x2f\x73\x69\xb1\xf0" + "\x1b\x74\x44\xde\xc1\x98\xbc\x60\x44\x5e\x47\x54\xde\x9a\xfe\xf4" + "\x90\x91\xfe\xcd\xc6\x69\xe2\xd8\x98\x71\xc2\xf8\x4c\xdc\x1f\xdd" + "\xef\x89\x93\x54\xff\x30\x46\x17\xd1\x7a\x62\x0e\xc6\xa8\x2f\xfe" + "\x18\x4d\x2c\x8a\xcf\x6b\x13\xe5\x3e\x9a\x18\x41\xf1\xe0\xd5\x63" + "\xec\xfa\x24\x0f\xea\xe3\x74\xf1\xf8\x4c\x3c\x64\x8c\xcf\x37\xeb" + "\xe3\x5d\xa9\x31\x7d\x0c\x9f\xa0\xbb\x36\xa9\xbe\xde\xf5\x79\x34" + "\xec\xbb\xd2\xe3\xf3\xe2\x5d\x99\xe8\x67\x38\x7e\x3f\xef\x9a\x3b" + "\x38\x2f\xde\xe5\x40\x7f\xc2\x17\xf3\xe2\x5d\xca\x87\x49\xe7\xc1" + "\x98\xbc\xdd\xc2\x1d\xb7\x9d\x16\x67\x88\xed\xdc\xbb\xf8\x2c\xc5" + "\x16\x91\x7e\x2c\x9a\xff\xd0\x07\xae\xc7\xf4\x0b\x29\x3d\xcb\xe3" + "\x70\xc2\x4e\xa6\xaf\xe3\xc9\x1e\xf7\xdd\x93\x62\x68\x75\xe6\x04" + "\xdd\xbd\xbf\xdb\x94\x50\xa7\xe8\xf5\xa3\xb5\xd1\x38\xdd\x9d\x13" + "\x9f\x5e\x77\x17\x82\x5e\x67\xe2\xd3\xeb\xee\x8d\x83\xd3\xeb\x6e" + "\x1e\xff\x33\x17\xd3\xeb\xee\xe6\x48\x7a\xc1\xd6\x95\xfd\xfb\x9e" + "\x0d\xbc\xd1\x97\x2b\xaa\xb9\xaf\x61\x4a\xb5\x82\x57\x54\x9d\x2e" + "\xae\x13\xb0\x06\x15\x9f\xc0\x86\xb4\x9c\xa6\xbb\x8f\x19\xf2\x3f" + "\xbc\x92\x86\x89\xbe\x27\xd9\xa7\x28\x81\xeb\x79\x1d\x67\x9a\xbd" + "\xa1\x0c\xe2\xf5\x47\x74\xbb\x3f\x9a\x18\x5f\x17\xfc\x28\x1b\x34" + "\x7d\x2d\x4e\x7a\xbe\xf2\x27\xfb\x51\x4d\xb4\x8e\xf8\x91\x2b\x7a" + "\x8c\x40\x37\xd4\xa3\x81\x3b\x38\x97\xfc\xbb\xf4\x98\xfd\xc8\x7f" + "\xf1\x98\x4d\x7a\x55\x8d\xd7\xa4\x97\xa2\xf1\x9b\x64\x89\x3f\x5e" + "\x93\xec\x83\x8f\xd7\xa4\x49\x83\x8f\xd7\xa4\x1c\x1e\x2f\x1f\x4d" + "\x2a\x8f\x9e\x37\x26\x15\x46\xf7\x77\x92\x94\x61\x61\x1a\x7a\x35" + "\xbf\x7f\xd3\x7e\x1b\x7f\xac\xe3\x78\xac\xaa\x4b\x08\xbc\x9c\x70" + "\x3d\xe3\x78\xb9\x30\x06\x85\x0d\x1a\x96\xaf\x8a\x7f\xde\xca\x6b" + "\xdc\xd6\x4a\x22\x3e\x47\xb6\x5f\xcb\xb6\xfb\xe4\x05\x9a\x89\xda" + "\xf0\x6c\x3a\x41\xf7\xde\xa6\x99\x4c\xc5\x7c\xe6\x29\x7d\xb7\xe5" + "\x1e\xc2\xe4\xe2\xc8\xb1\xe0\xb3\x4f\x5e\x9b\x6e\x56\x6b\xa7\xbf" + "\x9c\xa0\x7b\x86\xa8\x71\xb9\xf7\xaa\x68\x3a\x4e\xae\x89\x3f\x2e" + "\x93\xf7\x62\x5c\xfe\x12\x7f\x5c\x26\x1f\x1d\x7c\x5c\x26\xfb\x31" + "\x2e\x7f\xb9\x58\x8e\xee\xb1\xe8\x72\xb4\x8e\xeb\xd8\x17\xf3\x7a" + "\xfc\x9e\x95\x5c\x06\xcf\x90\x91\x7b\xe6\x73\xfe\xb8\x2e\x43\x8e" + "\x64\x9d\x49\x80\x25\xdb\xd7\xcb\x4c\xd4\x61\x44\xc2\x9d\x67\xed" + "\x8a\x27\x27\xf7\xf0\x1d\xf2\x84\x5b\x0b\xc9\x02\x1a\xe6\xec\x60" + "\x18\x4b\x88\x00\xe3\x30\x97\xe3\x74\xac\xf0\x23\xe4\xe4\x9e\x7a" + "\xa3\x1c\xeb\x3a\xbd\x6c\x8d\xe8\xc9\xe7\x9d\x80\xd8\x36\xf5\xfe" + "\x0f\x93\xf3\x08\x97\xe7\x72\x31\x65\x82\x4a\x1e\xef\x9d\x14\x2d" + "\x8f\xf7\xa6\x46\xf3\xe7\x64\x49\x27\x0d\x7a\x0e\xcf\x79\xc0\xe1" + "\x1b\xf3\xd7\xa5\x65\xf3\xde\x8d\x31\xb2\x09\x1e\xc8\x1c\xa7\x78" + "\x20\xf3\xca\x68\x5c\xef\xad\x8b\xcf\x03\xf7\x36\x0d\xce\x03\xf7" + "\xb6\x0d\xce\x03\xf7\x06\x98\x07\x7c\x94\x39\x36\x5a\x36\x33\x53" + "\xa2\xfb\x8e\x76\xa5\x6c\xd2\x55\x97\x23\x9b\xb0\x85\xae\x1e\x4c" + "\x0e\x59\xa6\xd8\x87\xa4\xba\xd7\x38\xeb\xf8\x46\x34\xb3\x40\xae" + "\x18\xbf\x66\xde\x53\x82\x8e\x9f\xc8\x34\xdc\x29\xef\x06\x66\x1e" + "\x8d\xa4\xe3\x66\x75\x7f\xcd\x79\x82\xee\x7b\x9c\xcf\x95\x15\x3d" + "\xef\xbf\x3e\xba\xff\x99\x81\xf8\xf4\xbc\x2f\x05\xf4\x74\xc6\xa7" + "\xe7\x7d\xe9\x83\xd3\xf3\xbe\xa9\x7c\x37\xe8\x62\x99\xba\x6f\xae" + "\x7d\xb9\xb4\x51\x64\x9d\xd3\x74\xdf\x07\xdf\x6c\x7e\xba\xaf\x22" + "\x7a\x7e\xba\xaf\xf8\xf2\xe7\xa7\xfb\xda\xe2\xcf\x4f\xf7\xf9\xe3" + "\xcf\x4f\xf7\x5b\x94\x3c\xdc\x9f\x19\x2d\x0f\xf7\xdb\xa3\x79\x22" + "\x33\xf0\x3f\x37\x3f\xdd\x5f\x1e\x23\x03\x5b\x4e\xd0\x94\xab\x60" + "\x53\xb8\xd4\xb8\x4d\xf9\x2c\x06\xc7\xdd\xf1\xc7\xed\xfe\x16\x8c" + "\xdb\x96\xf8\xe3\x76\xbf\x6f\xf0\x71\xbb\x3f\x84\x71\xdb\x72\xf1" + "\xb8\x4d\x49\xbb\x7c\x9b\x62\xca\xf4\xe8\x31\x9b\x92\x71\xf9\x63" + "\x36\x65\x63\xfc\x31\x9b\x52\x17\x7f\xcc\xa6\x34\xa9\x31\x9b\x12" + "\x88\x1e\xb3\x29\x47\xa3\xc7\x0c\x74\xfb\x3b\xc7\x0c\xe3\x53\xa7" + "\xfc\x13\xa6\x3e\x8a\x75\xfb\xb0\x1e\xf7\xd4\x2c\x1f\x4d\x4b\x53" + "\x6b\xeb\x69\x6a\xee\x50\x63\xf8\x1e\xca\x64\x5e\x3c\x0f\x4c\xcd" + "\xd7\xd3\x7e\x7a\xf1\x38\x4c\x5d\x0f\x1d\xdd\xd5\x52\x2c\xcf\xb6" + "\xd4\x18\x32\xcd\x51\xae\x79\x15\x9f\x4f\x4d\x95\xfe\xeb\x18\x63" + "\xe1\x0d\x86\x88\xf5\x3a\xca\x07\x18\x0e\xdf\x89\x8c\x81\x75\xe4" + "\x72\xe6\xf8\xc1\x7d\x6a\x1a\xea\x9a\x4b\x6e\x07\xbc\x69\x5f\x28" + "\x5e\x9d\x16\x6b\xff\x56\x23\x6f\x9f\xe2\xd3\x1f\x6f\x88\xc6\x61" + "\xda\x9c\xf8\x7c\x3a\xad\x00\x7d\xa8\x8e\xcf\xa7\xd3\x3c\x83\xf3" + "\xe9\x34\x8c\x3f\x55\x47\xac\x7d\x46\x3c\x1d\xf2\xc5\xac\x7d\xa6" + "\x1d\xb4\x06\x14\xef\x48\x9b\xa8\xb4\xa1\x0e\x38\xc7\xda\x7f\x18" + "\x9b\x07\x5e\xd0\x71\x5e\x10\x5d\xff\x81\x41\xec\xbf\x07\xd8\xfe" + "\x7b\x2f\x3e\xce\x0f\x5c\xc2\xfe\x7b\x80\xed\xbf\xf7\x2e\x96\xad" + "\x07\x74\xfb\x2f\xde\x1a\xef\x81\x8d\xf1\xc7\xff\x81\x98\xf1\xa7" + "\x9c\x22\xac\x87\x65\xfd\xe8\x72\x87\x22\xcb\xb1\x6f\x12\x97\x65" + "\x1e\x89\x53\x36\x18\x0b\x33\x7e\xb9\x1f\xdb\x2f\xe2\x3d\xf6\xa5" + "\x8a\xcb\x7b\x3f\xce\x52\xf2\xf8\xe3\xba\x68\x79\xfc\x71\x5e\xb4" + "\x3c\x3e\x10\x33\x76\x3f\x5e\x1f\x9d\x0f\xfe\xf9\x1f\xd3\xb1\x3f" + "\x0e\xc4\xf0\xc0\x27\x27\x68\xfa\x4b\x8a\x07\xa6\xff\x31\x1a\x8f" + "\xe9\x29\xf1\x79\x60\xfa\x18\xf4\xff\x93\xf8\x3c\x30\x3d\x73\x70" + "\x1e\x98\xce\x3e\x3e\x9f\x44\xf2\xed\x23\xc5\x99\xc3\x62\xca\xb8" + "\xe2\xeb\xbc\xe9\x95\xf1\xf7\x08\xa6\x37\x28\x1a\x4f\xef\x8c\xa6" + "\xf1\xf4\x83\xd1\x34\x44\x5f\xfe\x7e\x1a\xf6\xc7\x26\xe8\x71\xcf" + "\x88\x95\x7f\xef\x09\x9a\xa1\xcb\xff\x83\x8d\xd1\x38\xce\x98\xa3" + "\x70\x89\xb7\x2f\x32\x83\xd7\xbf\xde\xf8\xb4\x9c\xb1\x31\x7e\x9f" + "\x67\xd4\x61\x0e\xf2\x6a\x17\xc9\xd2\x8c\x26\xa4\x3f\xc2\xfb\xa1" + "\xbc\x1f\xb2\x13\xe9\x8f\x84\xc8\x22\xe7\xab\xfe\x79\x69\x86\x8f" + "\x7d\x51\x98\xfe\xcc\xbf\xd6\xd1\x94\xcd\x73\x10\xe3\x95\x5b\x2c" + "\xfd\x16\xac\xeb\x99\xd7\x6f\x60\x5e\x7f\x50\xda\x7f\x7c\xce\xc2" + "\x7e\x84\x56\x07\x65\x7b\x03\x21\x32\xf8\x9d\xcb\x47\xc3\x7e\x70" + "\x12\xcb\x05\x97\x37\xca\xaa\x7d\x33\x57\x0c\x7f\x3f\x98\x17\x7f" + "\x8c\x1f\x2c\x1e\x9c\x77\x1e\xac\x54\xe3\xfc\xe0\xa1\xe8\x71\x7e" + "\xb0\x41\x73\x0f\x9f\xc3\x7d\xf5\x81\xce\x97\x33\xc6\x45\x76\xe1" + "\x1f\x54\xdf\xaf\x7b\xb2\xad\xb0\x84\xae\x3d\x49\x3f\x99\x20\xdb" + "\x33\x89\xa0\x75\x6d\x02\xb5\x48\x1d\xf0\x93\x52\x89\x27\xca\xe4" + "\x86\xc8\x24\xd6\x3d\xdf\xc6\x79\xd5\x6e\x11\x44\xb9\x23\x7c\x26" + "\xc0\x77\x8a\xc1\x0b\x57\xb7\xd3\x4f\x66\x46\xd5\x37\x13\x79\x15" + "\x0c\x4f\xb5\x94\xc7\x9f\xac\x37\xf6\x74\xd7\xe3\x3d\xfe\xbe\xef" + "\x4f\xea\x0d\xdf\x07\xe5\x33\xf6\x93\x41\xcf\x2f\x19\x27\xbe\x37" + "\xc3\x38\x5d\x5a\x0f\xfc\x24\x64\xf0\xaf\xf2\xb5\xcc\x4a\x19\xf0" + "\xe5\xcb\xb2\x21\xaf\xf9\x12\x7b\x83\x11\x72\x90\x35\x35\x12\x8e" + "\x8a\xcf\x91\x95\x63\xf8\xe3\xe1\x39\xef\x6b\x60\xe9\xf8\x64\x6d" + "\x8c\xc1\xa7\x0a\x76\x4a\x91\x0e\xa3\xfe\x52\x30\x78\xcc\x15\xcf" + "\x32\x3f\x64\x35\x5f\x6a\xcf\x2f\xd1\x46\xd9\xaf\x5f\xc4\x5b\x59" + "\xd2\x5e\x62\x18\x97\xc6\x71\x66\x46\xd4\xda\x42\x9e\xdd\xf3\xd9" + "\xd6\xcc\xb0\x92\xfb\x99\x31\x7b\x84\x33\xb3\xa4\x3f\x95\x2e\xf7" + "\x4f\x87\x62\xe5\x60\x66\x81\x31\x47\xc7\xa4\xaf\x37\xe4\x1e\xeb" + "\x5a\x86\x1b\xb3\xcf\x3a\xb3\x4e\xc9\xc2\xcc\x90\x96\x14\xb9\x5e" + "\x9b\x29\xed\x3f\x63\xbf\x14\xf9\x75\x31\xf5\x62\xf6\xff\x66\x66" + "\x89\xc1\xf7\xe9\x53\x30\xbe\x01\x3e\xdb\x52\x31\x0a\x66\x8d\x8d" + "\xd9\xaf\xf0\x6f\x96\x77\xd0\xff\x0c\xb8\xb3\x74\xbd\x37\xbb\x36" + "\xba\xbd\x59\x59\xce\x53\x97\xea\xff\xac\x41\xfa\x3f\x6b\xa0\xff" + "\x8b\x25\xdc\x98\xbd\xc4\x59\xb2\xff\xe1\x8b\xf4\xdf\xac\x26\xe8" + "\x2f\x83\x6e\xb0\xb9\x67\x5f\x63\xd8\xea\xbc\x7f\x30\xb8\xad\x3e" + "\x6b\x60\xff\x4f\xd6\x9b\x35\xb0\xff\xe7\x8f\x67\xab\xfb\x48\x9e" + "\xad\x46\xb5\x3d\x7b\xa2\xb5\x2a\x5e\x5f\x66\x0f\xb2\xff\x37\x5b" + "\xdf\xff\x9b\xdd\x1c\xad\xcf\x66\xbb\xa2\xc7\x70\x56\xcc\x18\xce" + "\xae\x89\x1e\xc3\x59\x59\xff\xdd\x79\x0d\xef\x94\x98\x98\x68\x4a" + "\x4c\x30\x25\x24\x22\x1b\x5d\xa4\x61\x89\xe6\xc4\x21\xf8\x1b\xaa" + "\xff\x0e\x33\x25\x9a\xcc\xf8\x1b\xa2\xff\x0e\x8d\x79\x1f\xc6\x75" + "\xf1\x67\xd6\x7f\x87\xc4\xbc\x0f\xfd\x9a\xfc\x61\x7a\xbb\x46\xfb" + "\xe6\x98\xf7\x21\x5f\x93\x3f\xf4\xef\xac\x4f\x17\xbd\x47\xfb\xa1" + "\xcd\x58\xbc\x7c\x7e\xc1\xa2\x3c\x79\x5e\xbc\xc0\x3e\xff\xd9\x67" + "\x17\x2c\x5d\x6a\x2f\x7a\xd1\x7e\xff\x7d\x0f\xdf\x7e\xb7\x5d\x1d" + "\x3b\x17\x4c\xbe\x31\x2f\x99\x66\xae\x58\xc2\x19\x33\x1f\x99\x91" + "\x63\xcf\xbe\xff\xbe\xe8\x4c\x03\x8c\x3c\x5e\xbe\x14\x94\x08\xf9" + "\xcb\x2c\x1d\x49\xb4\x71\xa4\xd4\x3d\x1d\xec\xe7\xab\xf6\x3c\x1e" + "\xbb\xea\x10\xb8\x5f\xf4\x3a\x45\xf3\x0d\x7c\xa6\xff\xd0\x1f\xb8" + "\x13\xe3\x6a\x5c\x54\xb8\x90\xef\xaf\x3c\x74\x5c\xfc\xce\x4f\xf6" + "\x07\xc9\xd4\x4e\x4f\x5e\xdf\x32\x1d\x65\xf1\xee\xed\x08\x91\xdd" + "\x49\x96\x13\xf4\xe8\xa7\xc8\x4b\x10\xf7\x68\x48\x0b\xe8\xbe\xd0" + "\x73\xfe\x43\xa6\xfd\xce\x65\x94\xb3\x9e\xa0\x87\x37\x88\xdf\x09" + "\xf9\xce\xf7\x84\x54\xb9\x87\x1f\xd7\xdc\x0f\xd9\x58\x37\x54\xbd" + "\x46\xe6\x9d\xaf\x11\xbd\x35\x82\x2c\x6f\x8d\xe4\x58\x1d\x0f\x67" + "\x19\x67\xa1\xa5\x78\xf7\xd1\x93\x76\x6e\x9b\xcb\x6a\xa6\x87\xee" + "\x97\xe5\x47\x44\x95\x2f\x1e\x38\x8b\x7d\x38\xcb\x84\x72\xb3\xbf" + "\x20\x6b\x30\xb9\xde\xe5\x2d\x76\x91\x35\x2c\xbe\xba\x75\x3a\x25" + "\xb4\xc2\x12\x5e\x19\x12\xa1\xe6\x25\x27\xb9\xfd\x3f\x5a\x57\x8a" + "\xaf\xbc\xd0\xd6\x33\xbb\x9c\x62\xf3\x29\x32\x43\xae\x13\x9a\x97" + "\xb0\x9f\xc2\xc3\x0d\x3b\x2f\x90\x19\x34\x18\x7d\x92\x1e\xf1\x15" + "\xcf\x14\x61\xe7\x4c\x32\xff\x9b\x83\x7d\x0e\x1b\xaf\xdd\xfc\x27" + "\x32\xff\xaa\xd7\x65\xea\x15\x36\x2a\x2e\x12\x9d\x82\x63\xf8\x04" + "\x44\x90\xfd\xfc\x0f\xcd\x0b\x73\x99\xe1\x3d\x4e\x1b\xb5\x16\x05" + "\x68\xcd\x31\x11\xf4\xfc\x49\xdd\x0f\x38\xdc\x15\x60\x1f\x46\xcb" + "\x9a\x99\x94\x78\x22\x87\x4c\x87\xf3\x2b\xc9\x3b\x37\x40\xc5\xc7" + "\x44\xe7\xa1\x79\x5f\x50\x6b\x7e\x03\xe5\xb6\x91\xe9\x50\xc7\xe7" + "\x24\xe3\xd0\x94\x7d\x59\x53\x72\x8e\x6c\x6b\x16\x71\xda\x39\x5a" + "\xb5\x86\xae\x5c\xf5\x19\x59\xbd\x9d\x6d\x68\xe7\x14\x3d\x71\x94" + "\x12\x00\xcf\xb4\xfa\x73\xb2\xad\x7e\x9c\x7d\x7d\x33\xa9\xaa\x84" + "\x6c\xc2\x99\x9e\xd2\xeb\x4c\x4f\xed\x15\xe9\x23\x7a\x9c\xe9\x69" + "\xad\x85\x28\xdf\xb1\x9f\x86\xb7\x51\xda\xef\x4e\xb6\x99\x2a\xcf" + "\xd2\x68\xfb\x2c\x1e\xff\x47\x8e\x55\x9d\x45\xf9\xb2\xfd\xd9\x1a" + "\xea\x46\xd6\x09\x25\xed\xcf\xf7\xe6\x04\x49\x03\xac\xca\x5e\x1a" + "\x5d\xd5\x4b\x36\xad\x74\x7f\x36\xd3\xa2\xaf\xac\xc1\x05\x5d\x38" + "\xec\xbd\x67\xf6\x9a\xbd\x87\xba\xe8\x70\xa0\x97\x5a\xe9\xcf\xe4" + "\x75\x7c\xd9\xfc\xab\x67\xf6\x0e\xd1\xc0\xfc\xcd\xab\x3a\x00\x5f" + "\xf1\x8c\xf3\x30\xdf\x57\x76\xd1\x96\x12\x4a\x29\x5c\x45\xc3\x4e" + "\x22\x5d\xad\xe9\x77\x79\xbc\xa1\x2f\x9b\x57\x49\x3f\xdc\x27\xed" + "\x25\x87\x29\xb1\x35\x50\xc9\xfe\x9e\xa6\x70\xf2\x97\x35\xde\xc0" + "\x11\xf2\x16\xfe\xa5\x59\xb3\x7c\xe9\xd9\xa8\x91\xe5\xd7\xe7\x8f" + "\x98\xbc\xe6\xf3\xe4\xcd\x09\xd0\x27\x68\x5b\x94\x7d\xc9\x7b\x0f" + "\x99\xad\x81\x20\xdf\x73\xca\x10\xdd\xb6\xe4\x2d\x4b\x68\xec\xce" + "\xb3\x34\x66\xc7\x59\x4a\x17\x3d\xe9\x26\xf6\xad\xe5\xfb\xa9\x3b" + "\xf0\x9b\xd2\x41\x16\xf4\x57\xf9\x61\x27\xe9\x3e\xb6\x7d\xe9\x54" + "\xdd\x3b\xe0\x63\xdb\xdb\x3d\xe0\x63\x0b\x5e\xca\x66\x3f\xdb\x76" + "\x7a\xd8\xc2\xfc\xbc\xe5\x34\x99\xd7\x9d\x26\xba\xd5\x65\x22\xfb" + "\x33\x7c\xaf\xe2\xd1\x0f\xbc\x79\xa7\xe4\x73\x3b\x3d\x5a\x80\xdf" + "\x14\xfc\x25\x20\x5d\xee\x67\x77\xe8\x7c\x8b\x34\x13\xd2\x1e\xc5" + "\x6f\x22\x7e\x67\x3a\xab\x84\x1f\x6d\xb4\x75\x9b\x28\x99\xf9\x57" + "\xf7\xe7\x6d\xeb\x71\x3f\x0a\xfb\xe7\xb9\x02\x83\x8f\x95\x4e\x7f" + "\x38\xfb\x93\x13\xa7\x38\x2e\x94\x5f\xe2\xd3\x97\x9f\xc0\x31\xa2" + "\xf4\x74\xc6\xe1\xd7\xdc\x2e\xda\x2f\xc7\xaf\x15\x7f\x2c\x97\x63" + "\x8c\xba\xdd\x7d\xf9\xdc\xe6\x3b\x48\x17\x46\x3a\xfa\x6b\xe6\xbc" + "\xdf\x9c\x38\x65\x52\x65\xd2\x4d\x80\x19\xd4\xe1\x43\xd6\x1f\x0a" + "\xb0\x4c\x77\x9b\xac\xe2\x40\xde\x04\xaa\x1a\x29\x8e\xec\xd8\x2a" + "\x5a\x94\xac\x3d\x8a\xb6\x9f\x37\xe2\xe8\xb4\x6c\x44\xde\x01\xac" + "\x62\x99\x2e\x2d\xf3\xd8\x7f\xec\x31\x8e\x1b\x35\x26\xb2\x0f\xc2" + "\x3d\x9b\xef\xf7\x5a\xdf\x2d\x69\x1e\x22\x4c\xd9\xc1\x56\x5f\x17" + "\xfd\xaa\xb7\x73\x88\xf3\x8f\x64\xf2\x86\xda\x69\x7c\x1a\xd9\xd8" + "\xfe\xab\xde\x2a\x7c\xf8\xed\x64\x7f\x4e\xf0\xc9\x77\x4f\xd2\x63" + "\x8f\xfe\x53\x1a\xa5\xfd\xbb\x83\x74\x7d\xf4\xd8\x0b\x03\xfa\xe8" + "\x89\x73\x87\x3b\xf6\x46\xe8\xa2\x27\xde\xb9\x58\x17\x3d\x5e\xab" + "\x74\x91\x08\x29\xdd\x13\xf6\xe9\xe9\x9b\x62\xd2\x75\xbf\x90\xc7" + "\x5f\x8a\x49\x0f\xea\xe9\x4f\xc5\xa4\xfb\x55\x7a\xce\x0e\x43\xd7" + "\xb5\x32\x1e\x2b\x58\xd7\xe5\xac\x65\x5d\xd7\x9a\xa7\xeb\x3a\xe9" + "\x63\x98\xb3\x40\xbc\xed\x22\xbe\xb3\x84\xe7\xc9\x8c\xbf\xf8\x1d" + "\x19\xb8\x27\x9d\xa0\x9f\x86\x39\xad\xfc\xcf\x64\xc6\x9f\xd4\x73" + "\xc2\xfd\x50\x2e\xeb\x39\xd6\x71\xec\x77\xb2\x7d\xa4\x68\xdb\xbe" + "\x55\x1c\xad\xda\x2a\x0e\xf5\xb8\x7f\x5a\x60\xe8\xbb\x57\x90\xb6" + "\x11\x69\xaf\x20\x9f\xf5\x1e\xd3\xe4\x70\xce\x5e\x8e\xe3\xd0\x01" + "\x1e\x1b\x6d\x4d\xa0\xc2\xcd\xe0\x79\xbe\x5f\xb8\x1e\xf4\xf5\x16" + "\xf1\xbd\xd5\x30\xc9\x78\x4a\xa6\x0c\xe8\xa8\x0e\x96\xb7\x91\xeb" + "\x20\x5f\x5e\xc7\x17\x54\x12\x10\x27\xf9\x9e\x1d\xe3\x90\xbb\xf2" + "\x41\x8e\x11\x94\xd0\x02\xeb\x82\xfd\xc0\xd9\x5f\x05\x7a\xd7\x5c" + "\x0e\x9c\x54\x8c\x94\x9f\x62\xfd\x5f\xad\xdf\x63\x7a\xd2\xce\xf1" + "\xc7\xda\xe9\xa7\x13\xb1\xbe\x0b\x72\xdf\xac\x61\x17\xf1\xbd\x17" + "\xc8\x28\xaf\xf1\xf2\xb7\xe3\xaf\xdc\xb8\xfb\xc2\xb1\xe8\x50\xc6" + "\xdb\x16\x24\xc6\xd9\x47\x3f\x5d\x7f\xb8\x78\x2f\xd7\x4f\x67\xda" + "\x08\xb7\xd3\x80\x91\x20\xef\xce\xb8\xc9\xc2\x77\x67\x7c\x94\x23" + "\x63\x08\x8a\xe4\x06\xd7\xe1\xb9\x7e\x62\x3d\xef\xed\x04\x8c\xe2" + "\x76\x05\x03\xb0\x04\xf4\x7e\x54\x9e\x0e\xff\xca\x35\xe2\xab\x76" + "\x7a\x2c\xc0\xe3\xc5\xf7\x20\xf9\x7c\x0d\x74\x49\x61\xdf\x78\x65" + "\x7b\xfe\x74\x4d\xf5\x9f\x89\xf4\xbb\x9c\xe0\xb7\x9f\x16\xf3\x3d" + "\x25\xbe\xbf\x29\xef\x6e\x9a\x26\x90\x58\x91\x9e\xd2\x7f\x7f\xf3" + "\xff\xc0\xdd\x4d\xd0\xdf\xb6\xd3\x24\x1a\x80\x7f\x31\xdf\xdf\x04" + "\xfe\xc7\x98\x0f\xf5\x3e\xb9\xde\x78\x82\x69\xfe\x58\x0b\xa7\x61" + "\xad\x78\xd0\x18\x7f\xee\x2f\xf7\x05\x79\xf5\xca\x26\x14\x47\x7c" + "\xf4\xb8\x8b\xf3\x91\x56\xc1\xe5\xc7\x43\x8f\x79\xf3\xc2\xf4\xde" + "\x89\xb0\x69\xcb\x2a\x32\x2b\x9d\xf6\xc4\x5b\x5c\x5f\xe9\xb4\x27" + "\xb2\x07\x74\xda\x13\xd3\x94\x4e\x53\x34\x56\x3a\xed\x89\xbb\x94" + "\x4e\x7b\xe2\x36\x79\x0e\x06\x9d\xc6\x79\xac\xd7\x0c\x9d\xb6\x63" + "\xa4\x38\xc8\xba\xa3\xc7\xfd\x84\xdd\xd0\x6d\x9b\x90\xc6\xba\x83" + "\x71\x54\x7a\x2a\xc7\x21\xfe\xdf\x74\x52\x7e\x06\xfc\x9c\xcf\xf7" + "\x15\x3a\xf5\x67\x8c\xcb\x13\xaf\x2a\x1d\xf7\x44\xd1\x80\x8e\x7b" + "\x3c\x38\x50\x97\x75\xdc\x13\xa5\x4a\xc7\xa9\xf4\xea\x27\x58\xc7" + "\xe5\x38\x98\x06\x3a\x7c\x13\xef\xd9\xe9\xe5\x99\x8e\xae\x48\x1d" + "\x17\x2d\x5f\x4f\x1c\x32\x74\x1c\xeb\x36\xbc\xc3\x06\x49\x3e\x28" + "\xe5\x0d\xe5\x2a\x40\x73\x43\xee\x78\x0c\xb8\xcf\x1c\x67\x8c\xe9" + "\x36\xe5\x14\x0d\xd3\xef\x0a\xe9\xfd\x7e\xd2\x66\xf8\x3a\xfa\xe8" + "\x09\x7b\x3c\xbb\xd9\xb0\xd3\xc0\x8f\xd7\x85\x39\x4e\x87\x0b\x73" + "\x69\xa5\x70\xb5\x86\x8e\xd2\xd3\x45\x64\xd2\x12\x9f\x3f\xce\x63" + "\x8b\x75\xc6\x50\xfe\x65\xdd\x83\x39\xf4\xa9\xdc\x00\x0d\xc5\xda" + "\xfc\xf8\x16\x13\xf2\x1c\xf4\xa3\x88\xbc\x95\xdc\x4e\x44\xbd\x71" + "\x11\x79\x32\x1e\xe5\xb8\xd3\x1c\x63\xee\xc9\xcc\xc1\xd6\xfe\x97" + "\x89\xcb\xdf\x06\xc7\x65\xee\x90\xc1\x71\x99\x2b\xed\x80\x71\x5d" + "\x94\x80\xb5\xd9\x55\xa7\xe9\x49\xb9\x1f\x23\xe3\xde\xac\x8b\xd7" + "\xce\xdc\x87\xf4\xfc\x21\x11\xf9\x91\x6d\xbd\x14\xa7\x7e\x64\x7b" + "\xaf\x7e\x0d\xfc\xc6\xaf\x81\xff\x1f\x5f\x03\xff\x2b\xd6\x81\xa0" + "\x9d\x55\x33\x45\x97\xbb\x35\x24\x65\xf0\x20\xdf\xd7\x3b\x49\x4f" + "\x7d\x5b\xdf\xf3\x39\xee\xbc\x5e\xae\x05\xe5\xbd\xad\xcd\xc8\xe7" + "\x7b\xf9\xac\x9f\xa7\x62\x04\xd5\x19\x75\x7f\x9d\x99\xb1\xb8\x0d" + "\x0f\x19\xb8\xc9\xfc\x17\x62\x71\x43\xfe\xb8\x88\xfc\x4d\x03\xe3" + "\xfe\xd4\x25\xfd\xeb\xbd\x95\x24\x63\x70\x1e\xc0\xf2\x05\x73\x32" + "\xc7\xfd\xd3\xf7\x67\x9e\xea\x80\x9e\xcf\x88\xf0\xdb\xed\x82\x6e" + "\xbf\x8e\xe3\x2f\xb0\xed\xbb\x45\xad\x87\xbf\x85\xf9\x64\x04\xdf" + "\xd7\xe1\xbb\x3b\xb9\xe1\x6c\xd3\x81\x62\x96\xa1\xa7\xed\x46\xdd" + "\xc1\xf6\x81\xb8\x5d\xbd\x4d\xf6\x81\x0d\xa0\xce\x1c\xa3\x0e\xc3" + "\x66\x3f\x4a\xcc\x03\xd7\xc9\x3b\xaf\xa1\x2e\xd6\xbb\xdf\x82\x9d" + "\x3c\x42\xb5\x33\x8f\xf4\x76\x3c\xa8\x33\xe8\x5d\xf5\x4b\xf7\xef" + "\xe9\x96\xcb\xef\x1f\xe9\xfd\xcb\xa5\xaf\xe9\xdf\x25\xda\xcd\x9d" + "\x74\xf9\xed\xa6\x1a\xed\x3a\x2e\x9f\xae\xb9\xbb\xbf\x39\x5d\x33" + "\x74\xba\xe6\xfa\xbe\x86\xae\x71\xda\x99\x97\xf6\xcd\xdb\xb1\xeb" + "\xed\xcc\x9b\x1e\xaf\x1d\x92\xff\x06\xbd\xd7\x65\x31\x62\x60\x72" + "\x3c\x58\x15\xef\x6e\x5e\x79\x64\xac\x5f\x15\x27\x76\x5e\x9d\x11" + "\xeb\x57\x8f\x45\x8b\xb9\x65\xde\xa7\xb9\x35\x6c\x8f\x08\xcd\x47" + "\xf3\x5a\x38\xbe\xea\xd4\x35\xea\xce\xb8\x5e\xa7\xed\x52\x31\x86" + "\x39\xce\x96\x10\x39\x74\xa0\x52\xfa\x03\x60\x1e\x9a\x7f\x15\xdf" + "\x0f\x50\xe7\x99\xf3\x47\x2b\x99\x9c\x3f\x1a\xb0\xf3\x07\x87\xd1" + "\x94\x59\x57\x92\x31\x64\x30\x9f\x7f\xd4\x9f\xeb\xa3\x17\xe6\x70" + "\xfd\x70\xd9\xc7\xd9\xe2\x8c\x4d\x8f\xf3\xf7\xec\xbe\x88\x38\x84" + "\x98\xbb\x9f\xf9\x9b\x7e\x37\x01\x34\x70\x81\x96\xf3\x2b\x0c\x1a" + "\x18\xe9\x48\xab\x37\x68\x00\x7b\x25\xc5\x5b\x13\xe2\xbb\x43\x01" + "\x75\x4f\x7c\xfe\x61\x51\xda\x94\xa1\x60\x3f\xa3\xce\x19\x92\x3f" + "\xce\x0e\xac\xb6\x99\x8c\xfa\x63\xec\xce\x0b\xcc\xc3\xfe\xa4\xa6" + "\x0c\xc0\x0a\x18\xf0\x05\xe3\x25\x06\xca\x55\x4b\xbf\xa4\x67\x30" + "\xfe\xb9\x2a\xbe\x23\xda\x90\xb8\x9b\x28\x51\x03\xfe\xe8\x83\xc9" + "\x5b\x18\x60\x3b\xb5\x2b\x8c\xfe\xb3\xae\xdb\xb3\xd8\x67\xe6\x32" + "\xd2\x76\x38\x93\x6e\x52\x31\x14\x9f\x79\x41\x3b\xc3\x31\x71\x24" + "\x5e\x29\xe8\xf3\x5e\xc6\xc9\x87\x5f\xff\xea\x74\x9a\x7d\x8e\x74" + "\x5a\x3c\xf3\xa8\x86\x74\x6d\xe9\x00\x0e\x3b\xe5\x1d\x8f\x67\x2a" + "\x0d\x1c\x34\x6e\xbf\xc7\x66\x82\x2d\xc6\xed\x76\xca\xbb\x96\x68" + "\x7b\x3c\xc7\xb4\xe3\xd8\x18\x2b\xd2\x89\x71\x40\x9d\x43\x06\xbd" + "\xf5\x3a\x46\x1b\xc5\x9a\x6c\x5b\xd1\x46\xd1\xf9\x00\xec\xc1\x67" + "\x42\x17\xd3\xf9\xd9\xd4\x08\x3a\x27\x32\x5f\xf1\x1e\x0b\xf0\xff" + "\x35\xd3\x9b\xcf\x35\xec\xcb\xd9\xae\x7a\xf6\xbe\x03\x01\xe9\x77" + "\x92\xc2\x70\x35\xd0\x9f\x61\x00\xee\x15\x8a\xc6\xcf\xe6\xf4\xd3" + "\x18\x6d\x0b\x8c\xc5\x3a\x75\x27\x85\x7d\xdf\xa1\x3b\x9e\x75\xf4" + "\xb7\xc3\xb8\x3a\x6d\x26\x4d\xd8\x38\x66\xa6\x9f\x71\x2d\xb2\x8b" + "\x20\xdb\x95\xd2\x8f\x09\x7d\xdd\x53\xd2\x66\x86\x6d\x69\x92\x6d" + "\x75\xa7\xb3\x7d\x6f\x91\xcf\x68\x6b\x10\xfe\x7e\x95\xe3\x52\x1a" + "\xfd\x42\x5f\x2c\xcc\x5b\xc0\x1d\xf6\x5f\xde\x7e\xc9\x2f\xcb\x79" + "\x9c\xf2\x6a\x39\xcd\x28\x87\xf7\x65\x5c\xce\x78\x47\x1e\xf8\x2b" + "\xef\x4e\xf4\x2b\x99\xf1\xf4\x3b\x65\xec\x17\xf4\x39\xaf\x8d\x61" + "\xf4\xb8\xf3\x32\xa3\xfa\xd9\x97\x63\x36\xf8\x8e\xcf\x88\x5a\xec" + "\x41\xa9\x3b\x15\x6d\xf3\x0a\x0c\x99\xe4\xfa\x4a\xc6\xf2\x5c\x91" + "\xbc\x18\x70\x0e\xf0\x41\xd1\xf5\x64\x31\xdb\x39\x96\x66\xde\x3c" + "\x15\x07\x3c\x6f\x77\xec\x78\x71\x1e\xc7\x9d\xd4\x69\xc8\xf2\x94" + "\xda\x4e\x79\x35\xdc\x37\xf0\x5a\xe0\x52\xf3\x25\xc7\x84\xe4\x58" + "\x9e\xaf\x2b\x39\x02\x5d\x16\x7e\xfb\x75\x75\xbf\x27\xa0\xe2\x2b" + "\x2e\xf8\xae\x30\xd5\xca\xf1\x62\xbf\x3c\x19\x47\x43\xde\xfd\x5e" + "\xc0\x3e\x6e\x62\x78\x61\xad\xbc\x67\xa6\xfb\xec\xf9\x5b\x0a\x43" + "\x32\x0e\x9f\xb3\x88\xef\xc2\x86\x78\x4d\x26\x7d\xd2\x0e\x14\x85" + "\xe8\x91\x20\xd3\x76\x41\x01\xdf\x71\x0f\x48\x5a\x2c\x70\x18\xf7" + "\xda\x39\xce\x24\xc7\x29\x1d\x1f\xa2\x44\xb6\x29\xec\x4e\x8e\x49" + "\xb0\x30\x9b\x6d\x12\x45\x53\xf0\xbd\x49\x1c\x51\xbc\xbc\xe0\x53" + "\xbe\xc7\xae\xce\x97\xda\xc1\xdf\x89\x5f\xb6\xd3\x82\xff\x54\xfb" + "\x32\x86\xac\x2d\x7c\x88\xcf\x98\x7c\x3a\x0c\xb4\x85\xf9\x7f\xfe" + "\xd4\x8b\xe5\x62\xc1\xa7\xc6\x1a\x83\xef\xc5\xa9\xf3\xaa\x01\x78" + "\x3e\x5a\x20\xf7\xa5\x07\x74\xd3\xef\x01\x6b\x61\xc6\xc5\x32\xb3" + "\x70\xaa\xc1\xcb\x85\x37\xf0\xdd\xea\x05\x16\x6e\x7f\x30\x9d\x29" + "\x9c\x8f\xf3\x38\x59\x4e\xd8\x29\xf1\xeb\xee\x4b\x0c\x9c\x7f\x2d" + "\xac\x37\xfa\x60\xd0\x44\xf5\xe1\x67\x09\xdd\xc9\x0d\xf5\x03\x7d" + "\xff\x99\xf2\x37\x1b\xc8\xbf\x2b\x82\x36\xfc\x3e\x51\xf1\xdd\x42" + "\xac\x29\x9e\x6d\x51\xbc\xa8\xd2\x44\x72\xd3\x1d\x1c\x03\x56\xe1" + "\xb8\x88\x0c\x7e\xef\x71\xff\x6c\x8c\x8f\xce\x1c\x52\xe7\x50\x3f" + "\x43\xff\x17\xba\x54\xbd\x85\x87\x18\x97\xb8\xfd\x8c\xc6\xb1\x81" + "\xe7\x58\x15\xeb\xe0\x67\x8d\x8c\xaf\xfd\x26\x1e\xe3\x9f\xad\xe1" + "\x76\x65\xdc\x83\xbe\xfc\x21\x81\xbe\x74\xea\xee\xcb\x87\xfc\xa4" + "\x9b\xd0\x0e\xf4\xdf\xe9\x7a\xbd\xcd\x3a\x03\x57\xc6\x0d\xb6\xa2" + "\xa5\x47\x2c\x8a\x4f\x5f\x6e\x57\xc6\x63\xca\x1f\x86\x3f\x0b\xfe" + "\x86\x7e\xd3\xf9\x18\x76\x6d\xa7\xbf\xf4\x23\x9b\xb6\x5c\x1c\xe4" + "\xf8\x5f\x58\x17\x74\x6e\x01\xff\x0e\x5f\xdb\x4c\xc3\x03\x4f\x99" + "\x72\x57\x52\x26\xd6\xb6\x24\xce\x8b\x89\x3b\x35\xfc\x2e\x17\x13" + "\x38\xee\x35\xde\x33\xf4\xf7\xb1\xfc\xde\xbd\x5c\xcc\xed\x71\xe7" + "\xe7\x18\x67\x77\x2a\x66\x4d\x7e\x7e\x7f\x9c\x9f\xc4\x27\xf9\x9e" + "\x0f\xc7\x84\xd2\x44\xe2\xf3\x9d\xdc\x6e\x2e\xcf\x1d\x68\x0f\xe5" + "\x30\xff\xcf\x93\x31\x72\xfc\x89\xb7\x8c\xc0\x5f\xfc\x38\x1b\xa8" + "\xc3\x78\x75\x27\x7d\x64\x33\x70\x1d\x1e\xc8\x34\x7d\x43\xdc\x02" + "\x06\x6e\x48\x3f\xb8\x45\xa5\x87\x38\x46\x21\xfb\x20\xf6\xb8\x17" + "\xa5\x19\xb8\x1a\x38\x70\x7b\x7c\xaf\x52\x24\x37\xec\xe5\x98\x30" + "\xdc\x9e\x7f\x75\x3e\x97\xcd\x34\xf0\xfd\xa6\xbc\x5c\x52\x25\x04" + "\xcf\x2d\x7c\x9e\x64\x1f\x45\xd4\x1a\x60\x9d\xb2\xa8\xe2\x40\x55" + "\x80\xe3\x7f\x7e\x8c\x36\xf6\x75\x8b\x7c\xd2\xfa\xf2\xe3\x8e\x31" + "\xd7\x41\xf9\x23\x52\x3f\x94\x35\xec\xd3\xc4\x74\x8e\x01\xfc\x31" + "\xc7\x5d\x85\xad\x09\xb9\x5d\x14\x6a\x29\xee\xe4\xbb\x90\xd0\x39" + "\x8b\x38\x4e\xe8\x5e\xb6\x35\xb0\x4e\xe1\xf8\x15\x89\xac\x9b\x9a" + "\x97\x4f\x60\x18\x61\xb3\x83\xcc\x2d\x8e\x6f\x16\x4f\xdf\x47\xcf" + "\x4d\x50\xb2\xf3\xdc\x04\x63\x9e\xc5\x73\x66\xf4\xb9\xf4\x73\xe9" + "\xb1\x3a\xf7\x99\x17\x5f\x2c\xca\x5d\xb2\x80\x7f\xd2\x6f\x5c\x76" + "\x73\x72\xe4\xda\x99\xf5\xb0\x8a\x63\xf0\x5c\x0e\xef\x53\xbd\x3e" + "\xc2\x38\x67\x7d\xae\xd2\xd8\x2b\xd3\xfd\xb9\xef\x65\x9b\x9a\x6d" + "\x4f\xe4\xed\xf9\xb4\x98\x45\x87\x12\x8e\x5b\xc8\x14\xdb\xde\xc2" + "\xf9\x45\xf3\x0b\xee\xe6\x13\x95\xe4\x78\xed\x1c\x8c\x6e\xe7\x79" + "\xea\x6f\x47\xe9\xc1\x80\x89\xcb\x95\xf6\x66\x8a\xa4\x76\x9f\xba" + "\x4b\xfb\xfc\x18\x63\x0f\x64\x10\x3f\xb8\x60\xb8\x6c\x7f\x39\x8f" + "\x8b\x73\x0d\x99\x7e\xb3\xaa\xcd\xc4\x36\x4a\x09\x9e\x79\x6d\x28" + "\xed\x22\x3d\x9e\xd0\xef\xce\xb6\x61\x9e\x79\xde\x21\x4a\x1b\xa0" + "\x7f\x9e\x2f\x1c\x6c\x7e\x8a\xf4\x21\x60\x9f\xb3\x0e\x7a\xbe\x7c" + "\xd0\xf3\x7e\xcf\xc7\xf3\x94\x9e\x79\xfe\x8b\x16\x1b\xf1\xb8\xbf" + "\xdc\x4e\xcf\x1f\x37\xdb\x30\x97\x8c\xa2\x5f\xe0\xf9\x0b\xae\xcb" + "\x79\x51\xe3\xfc\xdd\x53\x35\x66\x70\x21\xb8\x31\x41\xa8\x7f\x64" + "\xd6\x1f\x12\xf1\x67\x12\x09\xf2\x34\x2c\x11\x14\x1e\x36\xd4\x4c" + "\xd6\xe1\x29\x96\xeb\xae\x1d\x6d\xbb\xf7\x9e\x49\x13\x9d\x25\xc5" + "\x90\xde\x50\xd0\x2a\x22\xe3\x5f\xb5\x7b\x1e\xbd\xd9\x45\xd2\x1f" + "\xa2\xb4\xdd\x13\x0f\xd7\x4d\x6e\x51\xc8\x77\x8f\xb5\xe4\x0b\x0d" + "\xce\x65\x64\x7a\xaf\xd7\x67\xe2\x18\xec\x6c\x83\x70\x8c\xfe\x76" + "\x2a\x78\xe9\x13\xa4\xa1\xff\x0e\xe1\xb9\xd0\xa0\xce\x3b\x0b\x1a" + "\xb5\xb2\x0b\x0d\x03\xf0\xcd\xc4\xf0\x9d\x6f\x91\xa9\xae\xa4\xd3" + "\xe4\x35\xdf\x43\x5e\x7b\x80\x3e\xc1\x73\x5c\x5a\xa2\x4d\xc1\x71" + "\x5f\x01\xa3\xda\xad\x79\x9c\x17\xc8\xa4\xdf\x1f\x34\x9d\xa6\x82" + "\xbf\x35\x0c\x52\x8f\xef\xeb\x76\x27\x7f\xf8\x5f\x3d\xee\x17\x30" + "\xfe\x99\x75\xfa\x9c\x07\xdd\xfc\x02\xf8\xff\x79\x39\xdf\x21\xff" + "\xf3\x6e\x19\xf3\xf7\x85\xe9\x46\x99\xf8\xf3\x1e\xef\xa9\x8a\x66" + "\x1e\x57\x71\xfe\x6f\x9d\x7c\x37\x61\x10\x3f\x86\x61\x5e\xc7\xed" + "\x7c\x8e\x34\x64\x78\x90\x52\x9c\xe7\x44\x5f\xd8\x4d\x69\x60\x77" + "\x53\x18\x6b\xcb\xd0\x79\x91\x73\xb8\xeb\xac\x8c\x4d\xc9\xfa\xe3" + "\xdd\x85\xbf\x37\x79\x83\x67\x9a\xbd\xeb\x35\x6a\x85\xfd\xe1\xad" + "\x3a\xd3\xac\x62\x58\x86\xe9\x30\xfd\x99\x0e\x3b\xfe\x1f\x97\xdc" + "\x0b\xaa\x12\x2e\xa6\x73\xdf\x79\x31\xc7\x6b\xfe\xbf\x89\xbf\x21" + "\xc2\xba\x10\x74\xb7\x9f\xa6\xc5\x57\xfd\x0e\x70\xde\xfb\x2f\xc0" + "\x92\x31\xaf\x26\xd3\x27\x78\xee\x71\x2f\x1e\x6d\xe8\xc9\xb8\xb1" + "\x42\x12\x9a\x37\x59\x1d\x4f\x99\x34\xe8\x5c\x8e\x4d\x06\x5d\x3b" + "\x81\xfb\x85\xf7\x0c\x7e\xc7\xef\x58\xfe\xb5\xae\x6d\xde\x61\x0d" + "\x3d\xc5\x3a\x38\x87\xf5\x2b\xd2\xe7\x54\x9f\x97\x3a\x39\x5b\x7f" + "\xcf\xd2\xdf\xa7\xeb\xef\x53\xf5\xf7\x4c\xfd\x7d\x12\xbf\x2b\xdd" + "\xbd\xb8\xa1\x7f\x5e\x31\x0d\x3b\x82\xf7\x66\x63\x2c\x80\xcf\x95" + "\x56\xc7\x1a\x39\x07\xe8\x78\x4c\xd0\xf1\xca\xd0\xdf\x0d\x7c\xbe" + "\x6b\x0d\xad\xf9\x1f\xc2\xe7\xc5\xcc\x68\x7c\x5e\xcc\x8e\xc0\x87" + "\xac\x8e\xcc\x6f\x82\x4f\xaa\x95\x63\xdd\xff\x1d\xf8\x30\x2e\x9c" + "\x86\xf6\x8f\xc4\xe0\xe3\x33\xf0\x89\xcb\x6f\xcb\x45\x27\xcf\x7f" + "\x4b\xbf\x2d\x63\xf4\x0e\xe3\xb9\xad\xba\xd7\x88\x33\x57\x38\xfa" + "\x52\x71\xe6\x20\x0b\x36\x94\x41\xff\x5f\xec\xd2\xe7\xf9\x26\x65" + "\x0f\x16\xce\x31\x7c\x7f\xd0\xd7\xfa\x2d\xaa\xaf\xbb\xd7\x73\xac" + "\xb5\x95\xf4\x1d\xa7\x43\x74\x62\x7d\xf3\xd7\x16\xbb\x3f\x4a\x06" + "\x0a\x8a\x96\x2e\x7d\xe1\x6e\x7b\xc1\xfc\xc5\x0b\xec\x37\xe6\xd9" + "\x97\xe6\x2f\x5a\x58\xb4\x20\xfa\x3c\x3c\x55\xff\xee\x88\xf4\xf3" + "\x67\x9b\x9b\x65\x80\xf9\x9f\xf5\xb6\xf2\xcd\x7c\xe9\x1a\xe1\x2e" + "\x74\xb1\xae\xdf\xf9\x1a\x99\xf9\x0c\x06\xf8\x74\x18\x3a\x5e\xc5" + "\xd6\xa7\x04\xd6\xf1\x48\x87\x0d\xf7\x42\x71\x44\x3a\xca\xbe\x94" + "\x6a\xa4\x31\x7c\x5d\x37\x0d\x6b\xa7\xc2\x46\x6e\x33\x2e\x0d\xcf" + "\x8b\x1a\xcc\xaf\x09\x58\x6f\xf1\xda\x57\x70\xdc\x24\xbe\x3f\x87" + "\x7a\x02\xf8\xc8\x33\x45\xfe\xb6\x8d\xb2\xed\x05\xe3\xb8\x0c\x75" + "\xea\x90\x66\xde\x8c\xb2\x58\x2f\x74\x72\x3d\xa4\x6f\xe2\x38\x06" + "\x48\xb7\xe8\xf1\xa0\x38\xad\x96\xe3\x0c\x20\x2d\x35\x22\xed\x03" + "\x8e\x61\x8e\x34\xbb\x0e\xef\x0f\x4c\x67\xbc\x67\xea\x7b\x0a\x5c" + "\xe6\x3f\xf5\x76\xa3\x62\x12\xf0\x47\x28\x6e\xbf\x35\xc3\x3e\xe7" + "\x91\x1f\x4c\xbe\xe7\xd9\x17\x17\x2f\x4c\x26\x49\xf6\x74\x4c\x97" + "\x19\xb7\x3b\x6e\xbe\xdb\x5e\xb8\x60\xc1\x12\xfb\x8a\x05\x8b\x8b" + "\xec\xf3\x57\xcc\x5f\x99\x4c\x0b\x5f\x5c\xf2\x2c\xdf\x92\xe7\x61" + "\x59\x9a\xfb\xec\xc2\x9f\xb1\xd3\x82\x2a\x9d\x1c\x35\x8f\xcf\x61" + "\xdd\xa6\xc7\x95\x38\xb8\x85\x6d\x8d\xa4\xdf\xa6\xe3\x99\xe3\x2d" + "\xd9\xf0\xdb\x82\xbf\x26\xfc\xed\xc5\xdf\x51\xfc\x1d\x39\x49\x2b" + "\xf8\xdb\x01\x7b\x7a\xdc\x4b\xd6\x1b\xf6\xc4\x00\x0f\x2d\xa9\x34" + "\x78\x08\xf3\xff\x1e\x35\xbf\x2d\x39\xd8\x1a\x92\xf2\xd3\xcf\x53" + "\x5b\xce\x0f\xf0\x14\xc7\x8b\x6c\x65\x9f\x9c\xe5\xc8\x07\x0f\xf3" + "\x3a\x1d\x34\x4f\x62\xba\x9d\xa0\x65\xfb\xab\xb7\x8a\x43\x1c\xeb" + "\x04\xbf\x2d\xe0\x97\x43\x2a\xbe\xc8\xd2\xa9\x28\x77\x3d\xda\x68" + "\x52\x6d\xe8\xef\x23\xc5\x41\xde\xc7\x68\xd7\xdf\xd5\x9a\x7f\xd9" + "\xa3\xfc\xcc\xbf\xfa\x59\x98\x95\xfd\x1b\xd5\xda\xd1\xc8\x5b\x7a" + "\x4a\x6f\xa3\x19\xb4\x70\xed\x74\x4b\x9b\x5b\xae\xb1\x78\x0f\xcd" + "\x9a\x70\xaf\x00\x3e\x67\xb4\xc4\x27\x55\xfc\x42\x57\x2f\x74\xc4" + "\x1d\x77\x78\x1d\xb2\x7c\x02\xef\xb1\xcd\x2a\x14\x1a\xc7\x94\xd6" + "\x12\x9f\x6f\xe3\x7a\xc2\xf2\xdb\x74\x6d\xf3\x95\x99\xca\x16\xe0" + "\xb8\x71\x4b\x0f\xea\x30\x83\x4c\xdb\x93\xb4\x64\xa5\x5a\xaf\xad" + "\xd0\xbf\x37\xb0\xf4\xa8\xe1\x2b\x07\x19\x4d\xc7\x7b\x87\xa1\x03" + "\x7c\xb4\xb4\x41\xf7\x6b\x6a\x56\xfd\x2f\x1a\xad\xbf\xef\xd5\x71" + "\x4c\xe0\x58\x16\xc0\xff\x08\x8f\x1d\xd6\xbe\x7b\xf1\x7c\x14\xf4" + "\x39\xa4\xe8\x53\x24\x6d\x40\xd8\x35\x9c\x7f\x94\xbf\xd9\x81\xbc" + "\xa3\x2a\x4e\xc4\xd2\x39\xdc\xe7\x01\xdf\xc7\xaa\x4c\xe0\xfa\x28" + "\x9f\x19\x42\x96\xf6\x7a\xcf\xb3\x7c\x2e\xcd\x06\xbc\x06\x43\xef" + "\xb0\x9e\xc9\x0d\x43\x4e\xa5\xdd\x5d\xb4\xd1\xd0\x37\x03\x7c\x50" + "\x54\x13\x4f\x97\xc4\x1b\x77\x7d\x6c\x92\x84\xfb\xa5\x0e\xe0\xd4" + "\x20\xc7\x80\xe3\x69\x9e\xef\xb7\xef\xfb\x94\x8e\x2c\x0a\xf4\xaf" + "\x45\x74\x3c\x38\x4e\xb7\x8f\x71\xeb\x95\xe7\xb8\xba\xde\x58\x36" + "\xda\xd0\x1b\x06\x1c\x6b\x82\xd0\xac\x0e\xfc\xe7\x69\xac\xe4\x3d" + "\x64\x9e\x2f\xa5\x3d\x02\x38\xc3\xcf\xa9\x3b\x4c\x5a\x69\x23\x78" + "\xb7\xe8\x28\x74\x8c\x59\xda\x9c\xee\x97\x7a\x06\x74\xd1\xb2\xc2" + "\x48\x98\xc2\xd2\x58\xc9\x70\x59\x1f\xb1\x4d\x92\x1b\x36\x73\x1c" + "\x91\x4a\x7d\x7e\x81\x0e\x5e\x56\x63\xe0\x0a\x1a\x1e\x34\xf0\xd5" + "\xbf\x95\x74\xd0\x47\xcb\x80\x7b\x1f\xfb\xf2\xb6\xa8\xf1\x5c\x21" + "\xf5\x0d\xf2\x76\xa3\xee\x31\x1f\xbd\x94\xa1\xcb\xd0\x21\xd4\xdf" + "\x7d\xa0\x64\x2a\xca\x2c\x0b\xea\xfe\xa8\x47\x30\xbe\x47\x07\x78" + "\x7f\xc9\xa9\x88\xfd\x80\xa3\x6a\x0c\xef\x71\xb5\xd3\xf2\x89\x11" + "\xe9\xfa\xd8\x1e\xc8\x46\xfa\x29\xb5\xb6\x6e\xcc\x51\xf5\x97\x2b" + "\xdf\x5d\x1d\x47\xd6\x05\x7c\xdf\x8a\x65\x5c\xd2\x5e\x8e\xf1\xf2" + "\x42\x63\xbe\x00\xac\x3d\x92\xe6\x23\x45\x13\xd3\x49\xc5\x6b\x58" + "\x32\x52\xd1\x69\x79\x65\x14\xed\x79\xde\x44\x3b\x4c\xa7\xe1\x6b" + "\x85\x36\x3c\x90\x20\x72\x57\x9a\x89\xe5\x85\x65\x9c\xcf\x5e\xc0" + "\x1f\xd2\xae\x52\x74\x5b\xde\x66\xd0\xcd\x18\x3b\xa6\x93\x8f\x96" + "\x4f\x67\xda\x46\xf7\x71\xd8\x91\x76\xa3\xef\xa0\x29\xef\x07\xe3" + "\xbd\x4b\x97\x8b\x43\xcd\xa3\xd8\x17\x60\xc9\x57\x07\xcc\x3f\xa0" + "\x03\x8e\x09\xa4\x68\xbb\x62\xa2\x8f\x0a\x2b\x23\xd6\x0d\x07\x99" + "\xbe\x2c\x2b\xc0\xb3\x42\x8f\x9d\x74\x50\xf9\xa3\x2c\xe1\x98\xb4" + "\x15\x52\x96\x97\xcb\x18\x17\x1c\x77\xf5\x08\xd3\x88\xf5\x22\xcb" + "\x12\xcb\x00\xcb\x93\xa2\xd1\x8a\x8a\x08\x1a\xb5\x30\x7d\x74\x3a" + "\xed\x89\xd1\xe5\x0b\xec\x05\x93\x95\x2e\xb6\xa7\xdf\x98\x37\x5e" + "\x06\x2a\xb1\x3f\x30\xe5\x6e\x7b\xf6\xe4\x1b\x1d\xf9\x63\x67\xa9" + "\x9f\x29\xd9\x59\xfc\x9b\x1c\xbd\xee\xb2\xa3\x9d\x50\xf4\xda\x6d" + "\x8d\x47\xe9\x0f\x47\x9a\x2f\x61\xa8\x8c\x1b\xc8\x71\x43\xb7\x2c" + "\x26\x0a\x03\xef\xcd\x27\x31\xa6\x96\xc6\x09\x1c\xa7\x76\x36\xd6" + "\x8c\xb3\xce\x89\x0b\xd5\xc8\xdb\x89\xf4\xe1\x85\x1c\xeb\xfe\x2f" + "\x42\x4b\x6a\x9c\xc0\x6b\x7b\x51\x5a\x1b\xf4\x27\xb5\x7b\xf0\x97" + "\xed\x4f\xfa\xd0\x3f\xed\x66\xa7\x00\xdc\x02\xa3\x5f\xbc\x07\x00" + "\x3a\x4d\x98\xed\x10\x61\xa6\x51\xae\x83\xe3\x49\x03\x76\x22\xef" + "\x01\x38\xd0\xff\x82\x23\x6a\x7d\xe9\x00\xff\x2f\x99\xa0\xeb\xb2" + "\x6c\xbc\x73\xfc\x8b\x6c\x39\xae\x6e\x9b\x8c\x43\xad\xad\xbb\xe5" + "\x61\xac\x07\xb2\x0d\x98\x80\x35\x54\x3f\xc7\x96\xf0\xbe\xa9\x5f" + "\xa4\x56\xf6\xfe\x58\x6b\x82\x8a\xeb\x07\x19\x77\x55\x9b\xb4\x9c" + "\x7e\xbf\x07\xe4\x0d\x5f\x9b\xca\x7e\x11\x39\xe0\x3d\x17\x97\x31" + "\xf2\xb6\xb8\x35\xdf\x16\x93\x16\xc4\x38\xa6\x2a\xfb\xb9\x8b\xf5" + "\x27\xd6\x96\x2b\xfb\xf7\xff\xe5\x7c\x68\x22\x97\x5a\xcf\xac\x94" + "\xfb\x3e\x67\xdd\x66\x82\xce\xee\xba\x21\x4d\xae\x51\x82\x9a\x3b" + "\x81\x94\x2f\xea\xca\x87\x0c\x1d\xcb\xe7\x49\xd6\xb5\xc2\xcf\x7b" + "\x89\xd6\x90\xf0\xcb\x98\xe9\x3c\x77\xd0\x49\xf2\x16\xf7\xb8\x38" + "\x56\xab\xb4\x81\xd0\xae\x9a\x37\xc2\x6a\xde\x40\xfb\xfe\xc4\x5b" + "\xe6\x61\x7e\x48\x38\x49\x2b\xed\x8c\x3f\xd3\x86\xf7\xab\x35\xd0" + "\xca\xcb\xf3\x24\xd3\x27\xf9\x37\xbb\xd9\xa7\x81\xfb\x6a\x0d\xa1" + "\xcf\x91\xfd\x32\x69\xbe\xcd\x6e\xf4\xcb\x84\x7e\x39\x4e\xb1\xcc" + "\x04\xd9\xd7\x04\xf2\x36\x52\xc6\x23\x96\xeb\xe7\x55\x99\x91\x7d" + "\x64\xfd\xaf\xfa\xb0\x6a\x7e\xbc\x3e\x0a\x13\xf7\x91\x69\xb0\xea" + "\x4e\x5d\xde\x24\x9e\xac\x3f\xba\x68\x65\x60\xf8\x5a\xf6\xf1\x68" + "\x9c\x00\xfd\x36\x85\xc7\x10\xf3\x67\x39\xe3\x19\x6f\xbc\x18\x9e" + "\x82\xb5\x1a\x36\xb4\x6b\x1e\x70\x39\x14\x9f\xde\xab\x4e\x5d\x9a" + "\xde\xab\x3e\xe5\xfa\x8c\x07\xfb\xbc\x58\x43\x58\xac\x83\x6f\xb1" + "\x5e\xf3\xc4\x6b\x77\xf8\xda\x1a\xc6\x2b\x6e\x9e\x60\x79\xd1\x75" + "\x10\xf8\x50\x40\x4e\x04\xeb\xa4\x1e\xf7\xea\xfe\xfd\x2f\x6b\x82" + "\x3d\x51\xea\x07\x93\x28\x8f\x07\xc3\xba\xb6\x9c\x7d\x4c\xa6\xa0" + "\xfd\xb8\xf9\x1a\x7f\x87\xc1\xd3\x68\xd7\xd6\xfd\xd3\x0d\xd6\x04" + "\xba\xd7\x9f\xf8\x4f\xc9\x56\x47\x68\x0c\xd3\x10\x30\x1d\x90\xe3" + "\x65\xbc\x4e\x55\x7b\x17\xab\x61\xff\x6f\x94\xeb\x52\x7f\x52\xa3" + "\x5d\xc5\x0a\x5b\x8d\xf9\xef\xf5\xfe\x3d\xdc\x1e\x77\xb1\xd9\x47" + "\x1d\xa3\x95\x5c\x7e\x67\x9b\x28\xfb\xb0\x49\x73\x5b\x85\x7d\x95" + "\x15\x76\x64\xf1\x0e\x4d\x70\x5c\xfe\x0f\x9b\x06\xf8\x44\xf9\xbf" + "\x18\x7c\x82\xfa\x53\xe3\xf3\x40\xf1\x82\x4b\xf3\x40\xb1\xdc\x9b" + "\x65\xba\xab\xb5\x4a\xf1\x46\xc3\x4e\x11\xeb\xbe\xb3\xcd\x5e\x22" + "\xdb\xb7\xab\xb6\x99\x26\x99\x7c\x2e\x91\x05\xba\xb8\x50\x76\xaf" + "\xa1\x07\x98\x5f\xac\x61\xfe\x66\x01\x49\x9e\x46\x1e\xec\x9f\xc2" + "\x74\xb5\x5f\xfa\x91\x43\x7e\x77\xcf\xbd\xa2\xc1\xef\xcc\xdf\xce" + "\xfe\xaa\x81\xa4\xc6\x2a\x94\x09\xfa\xe8\x13\x19\x93\x14\x73\x70" + "\x05\x60\x54\x56\x8c\xc0\x1c\xad\xfc\xb6\x52\x58\xa6\x39\xc6\x0f" + "\xcb\x35\xd2\xd2\x80\x37\xc7\xfb\xc1\x7a\x67\x4d\x46\xff\xbc\xe4" + "\xce\x84\xae\x10\xd2\x4f\x07\xf3\xd2\xe8\x6e\xd0\xee\x0d\x93\x56" + "\x7f\x7e\xbc\x8d\xb8\xcf\xe7\xd7\x8d\xaa\x7f\xf9\x56\x32\xff\xab" + "\xed\x19\x2a\xbc\x9d\xd2\xd6\xfe\xc0\x4c\xff\x7b\x22\x99\x98\x0e" + "\x3e\x5a\x93\xa9\x68\xb7\xc6\x65\x8c\x8f\x8f\x56\xcb\x7d\x51\xde" + "\x6b\x9c\x1d\x12\x17\xd4\x7e\xe8\x1a\xe8\xbf\xe7\x6c\x2a\xdf\x71" + "\xd1\xf9\x3f\xdb\xf3\xf6\x45\x4b\xed\x79\x2f\xae\x58\x7c\xfd\xf5" + "\x51\x6b\x25\xb3\xbc\xc3\xe2\x5e\xb3\x47\xcd\xa7\x6b\x3a\x0d\xbc" + "\xd9\x2e\xc1\x3b\xfa\xbf\xe2\xa2\x7d\xcb\xac\x5c\xdd\x4d\x39\x37" + "\x83\x06\x9e\x6f\xa3\xac\xdb\x22\x5e\xef\xa0\xac\xdb\xef\xc8\x7d" + "\x78\xc1\xfc\xbc\x95\x11\xa9\x77\x46\xee\xeb\x6d\xd9\x86\xb6\x13" + "\x47\xdd\x0f\x5d\x91\x30\x6b\x35\xcf\x2d\x25\x9f\x97\x84\xc4\x97" + "\xd0\xd7\x13\x21\x63\xb9\x87\x8b\x42\x74\x18\xba\x4c\x7c\x87\x75" + "\xf8\x30\x75\x37\x0f\xf6\x14\x78\xcb\x8a\xbe\xfb\x61\xd7\x9d\xe3" + "\xfd\x99\x13\xe4\x4c\x68\xad\xe4\x98\xbc\x1f\x06\x95\x8d\x51\xd2" + "\x84\xf4\xab\xf0\xfb\x05\x7e\x87\xe2\xf7\x6f\xf6\xc5\x58\xf7\xb0" + "\x2f\xf4\x72\xf6\x85\x2e\x91\xbe\x1e\xb7\x06\x5c\x74\xeb\x12\xb6" + "\xd9\x4b\x8a\xd8\x06\xf1\x91\x93\xbf\x8b\x47\x5c\x16\x69\xfb\xed" + "\xcf\x51\x06\xff\x0a\x79\x86\x54\xd2\x24\x4a\x3f\x0c\x8a\xed\x39" + "\xfc\x8d\xab\x31\x68\xf3\xfa\xc4\x84\xe3\x94\x68\x1b\xd6\xd3\xe3" + "\x76\xb2\xff\xd3\x51\xa6\xd3\x60\xdf\xd0\x64\x3a\xc7\xda\x87\x03" + "\xb6\x61\x19\x49\xfb\x56\xb7\xe7\x76\xca\x79\xc1\x59\x14\x61\xd3" + "\xf1\x99\x60\xb2\xb2\x4f\x44\x58\xd9\xa7\xce\x0a\x43\x0e\xf0\x5c" + "\x63\xf0\x69\x54\x7c\xb4\xc5\x45\x0b\x96\x2c\xc8\xb3\xdf\xb8\x34" + "\x99\x22\xa2\xa3\xe5\x2f\x58\x6c\x5f\xb2\xe0\xa5\x65\x0b\x96\xca" + "\xc8\x66\x9c\x1b\x35\xe7\xa7\x89\xe4\x0f\xc6\x1a\xf7\x76\xec\xa3" + "\x98\xbe\xae\x21\x1c\x53\x4b\x94\x7d\xc0\xb6\x4b\x97\x5a\x6f\x5c" + "\x38\x18\xbd\xde\x58\x5b\xa9\xec\xbc\x0f\x3b\xd5\x5a\x67\xed\x38" + "\x7e\x6f\x27\x57\xc3\x40\xfc\x6e\xd7\x7c\xd0\xd2\xa4\xe8\x66\xf1" + "\xf5\xb8\x5d\x39\x06\xdd\x7c\xb4\xd6\xa7\xdb\x52\x5d\x52\x7f\x60" + "\x8e\x85\xfe\x8b\x9a\x5f\xd5\xb7\x33\x5d\xac\x7f\x13\xe5\x7e\x6f" + "\xd2\x87\x1c\x03\xc3\xc4\x30\xd1\x9e\x0f\xe3\xd3\x09\xbd\xc9\xfa" + "\xcd\x63\xc0\x43\x9b\xd3\xb9\x3d\x7d\x1d\xf4\xad\x93\xb4\xd6\x2e" + "\xf5\xa3\xe7\xc3\x2e\xd6\x29\x7c\x76\xaa\x95\x02\x8e\x3c\xcb\x5b" + "\xeb\x63\x1b\x53\xc6\x90\x07\x2c\xde\xa7\x85\x9e\x0b\xf1\x77\x56" + "\x39\x4d\xc5\xf6\x72\xee\xe6\xbd\x61\xb4\xd5\xd1\xe3\x5e\x6b\x1b" + "\xf0\x4d\x5f\xeb\x63\xbb\x93\xe1\xfa\xc8\x75\x8c\xe1\xa9\xd8\x65" + "\x6b\x27\x81\x77\xa6\x0e\xd8\x4f\x6b\x5d\x11\xeb\x32\xc6\x47\xe2" + "\x19\x00\x2e\x32\x4e\xa6\xf2\x1d\x94\xfd\x66\xfd\x59\xa1\xf7\xdd" + "\xe8\x0f\xe0\x41\xff\x39\x33\x8c\xb3\x67\x9f\xde\x6f\xc6\x8f\x71" + "\x8f\xc4\x59\xc7\x77\x2f\xe3\x8b\x7a\x2d\x11\xb2\xcd\xfb\x32\x43" + "\x90\xd6\x36\xe0\x93\xec\xb2\xc7\xea\x8d\x17\x17\xdb\x0b\x16\x2d" + "\x7e\x3e\x77\xc5\xfc\xe7\x17\xe4\x2e\x2b\x1c\x6b\x5f\xb6\xf8\x99" + "\x82\x17\x9f\x7d\x9e\xb9\x66\x69\xd1\xb2\x67\x9f\xb7\xb3\x66\xc9" + "\x9d\x9a\x95\x95\x7b\xff\xa3\x8f\x3c\x9e\x4c\xf7\xcf\x47\x1a\x56" + "\xfe\x59\x19\x63\x55\xd6\xc3\xd3\xa6\x3c\x96\x3b\x65\xf6\xa3\xb3" + "\xe6\xc8\x4b\x0b\xfd\xf9\x53\x17\xc7\x2f\x10\xc5\x87\xa9\xe0\xa5" + "\x0e\x8c\xef\x90\x76\xda\x30\x57\xc5\xbb\x76\x6f\x8c\x8e\x77\xed" + "\xc6\x5a\xd6\xdd\x8c\xbf\x63\x44\xeb\x53\xf1\x87\x75\xea\x86\x6c" + "\xc5\x5f\x49\x33\x7a\xdc\xee\xbd\x03\xfc\xb5\x41\xc6\x54\x62\x5f" + "\x0e\xb5\x3f\xeb\x86\xfe\x77\xb6\x45\xe6\x0d\xac\x27\xdd\xfe\xfe" + "\xf5\x64\xbf\x4e\x59\x37\xda\x58\x5b\x22\xcd\x8f\x75\x65\x12\xaf" + "\x2b\xd5\x7e\xd2\x86\xa7\x24\x4f\x0d\x2a\xdf\x16\x32\xd6\x95\x2c" + "\xdb\x7c\x56\xac\xd6\x1f\xeb\x72\x22\x65\x5c\xc6\x58\xd4\x65\x9c" + "\xeb\xc9\xfd\x3b\xcb\x85\x3d\xbc\xa7\x0d\xfb\xb8\x03\xb6\x02\xe6" + "\xaf\x1e\x21\x92\x2e\xe8\x7b\x1d\xeb\x2a\x79\x8f\x9b\xed\x66\x9d" + "\x9f\x86\x9f\xa4\x75\x9f\x09\xf7\xda\x2e\xb5\xa6\x74\x7f\x97\xf5" + "\xba\x58\x37\xea\xfe\xd9\x61\x19\x8f\x0e\x3a\x7d\xdd\xa1\x01\x9e" + "\xdd\x30\x97\x79\x61\x60\x2d\xbb\x2e\x4a\xff\x77\xcb\x6f\x35\xae" + "\x0b\x19\xf7\xf5\x8b\xae\x27\x93\xf9\xfa\x72\xaa\x30\x09\xcc\x47" + "\xeb\x76\x73\x1b\x4c\x4f\x1f\xb9\x0f\xa2\xac\x79\x80\x7e\xeb\x33" + "\xfa\xe9\xa7\xef\xb3\x18\x7b\x2c\x0a\xef\x0d\x4f\x0d\x46\xab\xf8" + "\x74\x5a\xef\xfa\x5a\x3a\xb9\x69\x08\xcb\xa4\x41\xaf\x8b\x69\xb5" + "\xbe\xe5\x62\x5a\x6d\xb8\x26\x82\x56\x93\x2f\xa6\xd5\xfa\x60\xc4" + "\xb9\x8f\xbe\x8f\xb2\xe1\x29\xa6\x19\xf3\x18\xfa\xbd\x1b\x7c\xb6" + "\x6e\x80\x7e\x1b\xd2\x2f\xa6\xdf\x86\x49\xf1\xe9\xb7\xbe\xed\x86" + "\x68\x38\xa5\xf1\xe6\x8d\xe1\x6b\x4d\xfa\x7d\x9e\x0d\x8d\x2d\xa3" + "\xe5\x9a\x34\xf8\xba\x49\xcb\x7f\xdd\x8d\x3f\xfc\xf2\x3a\x62\xc0" + "\x16\x17\x3a\xaf\x6e\x68\x68\xc1\x9a\x97\xf7\x95\x2e\x31\x17\x1d" + "\x33\xf6\x3c\xf0\xdc\xc6\x6b\xe7\xd9\xe1\x7b\x05\xa7\x33\x3d\xf9" + "\x5b\x51\xe0\xf7\x36\x65\x97\xfe\x33\xf5\xef\xb9\xdc\x34\x83\x12" + "\xd7\x92\xfd\x40\xd5\xed\x9c\x6e\x03\x0f\x49\xdf\x27\xf9\x2d\xd5" + "\x41\x60\xe6\x86\x33\x69\x10\xb8\xfd\xfc\x3f\xd8\x9d\xd6\x18\x7d" + "\x94\x3f\x7f\x71\xde\x8b\x0b\x17\x7e\xbd\x2a\x8a\xf4\x1f\x2b\x77" + "\x6b\xfc\x3d\xa3\xa1\x3d\xeb\x9e\x5b\x85\x36\xd9\xfe\xb7\xa8\x79" + "\xf3\x9f\xa1\xff\x7e\xd6\xa4\x6c\xc9\x27\x3b\xd5\x3d\xde\x97\x27" + "\x44\xe8\x67\xf0\xc8\xcb\x99\xc2\xfd\xcf\xc5\x03\x63\xfc\x72\xca" + "\xc5\x63\xfc\xb2\x3d\xfe\x18\xbf\x3c\x55\x5b\xce\xf7\x2a\x5e\xc6" + "\xfa\x67\xb1\xb4\x35\xf9\x9d\xcf\xcb\xb1\x66\xee\xc4\x7a\xb9\x6b" + "\xf6\xca\xe6\x7b\x73\x57\x26\xb0\x3f\xb8\xfc\x76\x46\xe8\xbc\xe8" + "\xe0\x33\x6b\x3e\x1f\xe3\x6f\x67\xf0\x37\x73\xf8\x1b\xaa\xb2\x0c" + "\x9e\xb7\x9c\x20\xb9\x76\x44\xbe\xbd\xfa\x84\xfc\xc6\x2f\x6c\x85" + "\x97\x6b\x0c\xdb\xda\x8a\xe9\x8d\xef\x17\x6f\x56\xe3\xd1\xc6\x63" + "\xc1\xed\xe5\xae\x6c\x56\x6d\x9c\xe7\xef\x63\x91\x55\xd9\x10\x2f" + "\xb7\x5d\x72\xef\x3e\xa9\xbd\x70\xd0\x98\xf2\x6e\xd7\xb0\xd7\x55" + "\xec\x69\xf6\x69\xf4\x1b\x3e\x75\xec\x5f\xd7\xe3\xf6\x64\xc4\xfa" + "\xe7\x29\x1f\x13\xcf\x74\xc3\xb7\x07\xcf\x73\xfa\xd7\x03\xfc\xbd" + "\x15\xac\xe3\xec\x25\x6b\x87\x9e\x26\xcf\x35\xd5\x83\xec\xa1\x1b" + "\xf7\x89\x75\x1f\xb8\x61\x80\x51\xd9\xef\x17\x84\x77\xd6\x17\x03" + "\xbe\x7d\x9e\x3d\x86\x6f\x98\xf4\x07\xc4\xdc\xcb\xdf\x74\x39\x41" + "\x9e\xcf\xe4\x37\x64\x6e\xe0\xfd\x6f\x4f\xa0\x45\xfa\x25\x7a\x7c" + "\x91\xb8\xe8\x78\xd4\xf2\x1e\x2d\xe7\x47\xe2\xe2\x98\xbf\x6c\xd1" + "\x78\xc7\xc2\x45\xf6\x67\xf3\x17\x15\xe6\x2e\x92\x31\x60\x65\x78" + "\xd9\xa2\x95\x85\x7c\x22\x71\x73\x72\xcc\x1c\xa6\xfb\x10\xf6\xfb" + "\x4a\x49\x3f\xc2\xd2\xc7\x41\x0f\x93\xf2\x23\x2c\xcb\x52\xf3\x7a" + "\x69\xde\xc5\x3e\x33\xa5\xfd\xfe\x5f\xe0\xab\xd4\x0a\x15\x7b\x5e" + "\xf7\xb3\x61\xbe\x2b\xad\x8c\x53\x67\x77\xbf\xcf\x18\xfb\x2e\xf5" + "\xe5\xc8\xfb\x1e\x32\x4e\xf8\x6b\x3c\x6e\xa5\xe4\x75\x4c\xe3\x58" + "\xa7\x3a\x3f\x97\x1e\x33\xf8\xd9\xf0\x37\x64\x58\x7c\xdf\x64\x7c" + "\x30\xd2\xd7\xa8\xec\x3e\xcc\x79\xb6\xfe\x7e\xac\x36\x11\xe3\x1e" + "\x30\x35\x03\x8f\x32\x7b\x2c\x1e\xc0\xef\x7a\xa4\x4f\x1c\xf0\xe5" + "\x32\xfa\x59\x96\x85\xe7\x8b\x6c\xd5\xfb\xa6\x65\xc1\x28\x5d\xba" + "\xa0\x28\x99\xa6\xcc\x2f\x28\x60\xb9\x9e\xbf\xa0\x60\xd9\x92\x17" + "\x97\xe6\x2e\x5a\xbc\x08\xa9\xf7\x2d\xe4\xd0\xbc\xb2\xc8\xdd\x7a" + "\x8e\x7d\xf1\x82\x05\x79\x2a\x49\x1f\x86\xe8\x73\x20\x75\x76\x5f" + "\xd6\xe4\x23\x4f\xd1\x80\xfd\xf5\x4a\x9a\x30\x95\xe5\xe0\xef\x59" + "\x29\xd3\xd2\x36\x2a\xf3\x45\xaf\x7b\xca\xfc\x06\x3f\xc8\xf1\x73" + "\xb2\xbf\x4f\xc3\xab\xdd\x42\x9e\x9b\x60\xcc\x36\x4e\xe3\xef\x63" + "\x63\x4d\x36\x95\xed\xfd\x01\x38\xaf\xf4\xeb\x7f\xbe\x5f\xbf\x4e" + "\xf9\x09\x98\xf9\x9b\x9e\x7c\xcf\x1e\xf9\xe0\xff\x97\x43\x8a\xff" + "\x5f\xe9\xe7\xff\x6e\x53\x22\xd6\x70\xaf\xe4\x19\xf6\x7c\xb4\xcc" + "\xbc\x52\x7c\xb1\x2c\xb1\xff\xe7\x2b\x15\x06\x6d\x8d\x71\x56\xbc" + "\xb5\xf1\x36\x63\x1f\xb6\x5a\x8f\x13\xcf\xcf\x5c\x97\x6d\x75\x31" + "\xfc\xca\x7b\xd9\x9f\xbd\x9d\x36\xea\xfc\xf2\xca\xb1\x08\xbf\xac" + "\xd4\x93\xf4\x4a\x48\x8d\xd3\x2b\x01\x03\x3f\x1f\xbd\x22\xcf\x03" + "\x18\x86\x92\xfd\xb2\x95\x8a\x77\x36\xda\x0c\xda\xf2\xba\x18\xef" + "\xe9\x03\xb6\x45\xd9\x41\xe9\x23\xa1\xe2\x0c\xf4\x71\xff\x01\xa7" + "\xde\x80\x83\xb2\xe8\xbf\xa5\xc5\xa0\x95\x51\x26\x92\x27\xa6\xcc" + "\x2f\xc4\xa2\x75\xd1\xc2\x85\x0b\x96\x2c\x35\x62\x2f\xa7\xbf\x58" + "\x90\xa7\x62\x2d\xdf\x8d\xe1\x5f\x01\x09\x9c\xcc\xe1\x9a\x91\xaa" + "\x1e\x63\x6c\xc8\xb1\xbc\xcf\x20\x7d\xf7\xe4\x3a\xe6\xd5\xdb\x76" + "\xea\x6b\x9a\x76\xda\xd4\xa2\x7c\x5f\x36\x6d\x50\xf6\xe2\x15\x2f" + "\x01\xa7\x4e\xc3\x5e\xe4\xfd\xcb\x6e\xb2\x07\xf9\x1e\x11\xfb\x2f" + "\xef\xd8\x2a\x3a\x78\xbf\xb2\xc7\xbd\x29\xc5\xf8\x3e\x17\xdb\x22" + "\x9b\xd4\xb7\xcd\xfd\xcd\x8b\x39\xb6\xfd\xab\x0f\x69\xa5\x8d\xa9" + "\x22\xb9\x26\x13\x36\x4f\x0a\xcb\xc2\x95\x5d\x1c\xf7\x9e\xe3\x01" + "\x6d\xca\x61\x5b\x89\xf5\x0b\xc7\xb0\xef\xa0\x4d\xe9\x58\xdf\xa4" + "\xfa\xe8\xd5\x39\xfe\xa4\xc6\xd4\xf5\xab\xc8\xc2\x6d\x40\x37\xf9" + "\x5a\x6a\x98\xb6\x9b\x8a\x3e\x85\xee\xd1\xf7\x77\xf9\xfb\xbc\x1d" + "\x3e\xda\x94\xa9\xef\xa5\x8f\xd1\xf7\x2e\xc7\xa0\x5c\x95\x8f\xae" + "\xd4\x63\x82\xd7\x7e\xf4\x7d\x17\x39\xf8\xbb\x7d\x2a\x96\xcf\xc7" + "\xf3\xd0\x8f\xbd\xfc\x6d\x3c\xd8\x57\x58\x43\x6c\xec\x44\x1f\xf6" + "\xaa\x38\xe0\xcc\x2b\x9b\xef\x53\xbe\xc5\x1b\xdb\x98\x06\x80\x9b" + "\xa1\xc3\xcd\x00\x5c\x8c\xff\x77\xe6\x29\x5e\xdd\x4c\x46\x1b\x98" + "\x53\xfc\xb0\x45\x7d\x6c\x8f\x02\x6f\x0b\xfe\x52\xb6\xc8\xf3\x69" + "\x1f\xd6\x2d\x56\xc1\x7e\x43\x03\xdf\x20\xdb\x3c\xd1\x98\x5f\xb8" + "\x6d\x1d\xf7\xb1\xbc\x7f\xc6\x7b\x67\x7a\x5b\x63\x79\x7d\x6d\xc0" + "\xc4\xbb\x45\x3b\x7f\xaa\x06\x30\x2d\x98\x2b\xfd\xfa\xb7\xa7\x52" + "\xb6\x9c\x65\x1f\x33\x1f\xe6\xc2\xeb\x44\x6e\x28\x95\xcf\x75\xae" + "\x34\xbe\xed\x55\x7d\x96\xe9\xb5\xb9\x6e\xe0\xbc\x06\xf5\x41\x7f" + "\xc8\x83\xab\x83\x36\xef\xe7\x76\x59\x16\x78\x2c\x7b\x31\x36\xfc" + "\x9d\x78\x71\xfe\x54\x03\xd6\xf9\x57\x82\x06\xc7\x79\x8c\xf8\x8c" + "\x95\x7d\xbf\x90\x66\xe5\x58\xe4\xed\xb4\xf9\x30\x8f\x0f\xe3\x02" + "\x1a\xda\x42\x3d\x39\x3f\xe6\xfb\xa8\xac\x0f\xd7\x14\xc3\x8e\x5d" + "\xc8\xba\xa4\xfc\x21\x5e\x17\xf3\x37\x64\xf8\xd9\x99\x27\x34\x39" + "\xbe\xab\x78\x7c\xcb\x1f\x5a\xd3\x29\xb4\x0b\x6e\x12\x07\x03\x44" + "\x17\x4c\x14\x0a\x9a\x12\x18\x6f\x93\xf3\x14\xdf\x99\xad\x81\x1e" + "\xf6\x10\xda\xb5\x6c\x5e\x45\xa9\x7c\xc7\x98\xbf\x8f\xd2\x1a\xa8" + "\xa2\xd6\xc2\x2a\xfa\xb7\x50\x05\x35\x2f\xe7\x98\x11\xe5\xc1\x7f" + "\x77\x54\xf0\xb9\x55\x12\x9e\xf7\xd9\x1f\xe3\xb6\xb6\x94\xff\xfb" + "\xd1\x3f\xd1\xbf\x37\xff\x89\xec\x4f\xc8\xf7\x9a\x43\x39\xff\x46" + "\x87\x32\xff\x8d\x9c\x1d\x42\xe3\xb5\x52\xc9\x0b\xdc\x86\x07\xb0" + "\x6a\xf8\x6e\x6e\xaa\xd6\x6d\x4b\x46\xff\xcd\xbc\x27\xdf\x1a\xf0" + "\x53\xf3\xe2\x8f\x19\xc7\xeb\x77\x9e\x25\x4b\xf3\xe2\xdf\xcb\x67" + "\xb5\x86\x39\x55\xe3\xcd\x6b\x63\x3b\x2d\xc4\x77\x91\xf9\x9c\x0f" + "\x76\xbb\xb6\x85\x71\x0c\x2b\xbc\xf9\x5b\xea\x46\x7d\xd8\x71\x7a" + "\xfd\x2d\x1d\x5c\x7f\x07\xd3\x03\x38\x1d\x9e\xa3\x68\x72\xa8\x0d" + "\x34\x7d\x4c\xa7\x4f\x4e\x24\x7d\xb6\x64\x32\x7d\x38\x8e\xa5\x86" + "\xf1\x02\x6e\x99\xa0\x81\x66\xb4\x01\x9c\x2d\xfa\xbe\xa8\x65\xf3" + "\x59\x4a\x69\x5e\xcc\xdf\xc7\x2a\x7f\xc7\x9a\x6d\x06\x7f\x9c\x6e" + "\xd8\x72\x8e\xcc\x3c\x6e\x7c\x16\xb2\x45\xe6\x4b\x9a\x7b\x78\xcc" + "\xfc\x49\x0d\x2e\xfc\xad\xc7\x9f\x87\xf9\x0e\xbf\x1b\x31\x5e\x1e" + "\xe0\x60\xc7\x58\xd5\xf0\xaf\xe2\xc5\xda\xbd\x1c\xab\x41\x5f\x97" + "\x0c\xa4\x43\x8e\x42\x42\x7e\x8f\x16\x32\x53\x6e\xd7\x20\x47\xbc" + "\x2f\xb2\xf3\x35\x4a\xd1\xdc\x1b\x0b\x76\x40\xd7\x55\x61\x2e\xdd" + "\x39\x82\x52\x79\xaf\x70\x9b\xf4\x45\x7f\x75\x8c\xa1\xfb\xca\x46" + "\xf2\xfd\xb6\xf2\x6c\x13\xef\xa5\x78\x1a\xd3\x75\x3e\x4f\x47\x19" + "\xe8\xff\x91\xfa\x77\x28\x36\x49\xbf\x63\x96\xfd\xc1\x6c\x74\xd8" + "\x87\x87\xc4\xf6\x1c\xe2\x33\x95\x94\xb5\xc2\x9f\xd2\x61\x15\xad" + "\x81\x43\xf2\x5e\x63\x6b\x20\x2c\xcf\x54\x90\x9f\x30\x2b\xe0\xb7" + "\xc2\x9e\x3c\xc2\xb4\x33\xd2\xf9\x3c\x86\xf7\xaa\x66\x05\x84\x7f" + "\xf6\x4a\x2b\x7f\x1f\x70\xb4\xdc\x8f\xd7\xd3\x5b\x6d\xb0\xc5\x57" + "\xfa\xad\xe8\x7b\xa8\x1f\x56\x77\x4e\x22\xcb\x1b\xca\xa6\xf5\x97" + "\xed\xce\x31\xf3\x77\x6f\xb9\xcd\x88\xb4\x21\xb3\x1d\xa8\xcb\x63" + "\xa5\xa7\x29\x3b\xf4\xb5\xf4\xfe\x75\x1a\xc7\x6b\xec\xc6\xbc\xb9" + "\x34\x27\x41\xeb\xce\x31\x85\x01\x1b\xbc\x9f\x2a\xbf\x53\x18\xf2" + "\xeb\xdf\xfd\xe9\x84\xfc\xb6\x91\x28\xbd\x70\x04\xe5\xcc\x0c\x97" + "\xef\xc6\xf3\xf7\x12\x44\x52\x28\x27\xbe\x1f\xdb\x97\x9e\xe6\x92" + "\x27\xc0\x4f\xaf\x67\xb0\x3c\x87\x2d\xef\x8f\xb6\x3f\xc7\xf6\xc9" + "\x6b\xff\xc2\xf4\x0c\x43\xc6\xc2\x49\xef\x8f\x1e\xdf\x49\x09\x25" + "\xe0\x5b\xb5\xaf\xf3\xda\x1f\x39\x16\x80\x53\x13\xb0\xf9\x5e\x6b" + "\x62\xbe\xb1\x76\xb1\xff\xd9\xfb\x76\xe9\xf3\x95\xfc\x57\x97\x37" + "\xd8\x49\x87\x5c\x7f\xa6\x43\x21\xaf\xab\xe9\xac\xdf\xac\x7c\xbf" + "\xcc\x0c\xf7\x73\xce\x73\x82\x57\x73\xc3\x35\x34\xd8\x7e\x3b\xaf" + "\x39\x31\x87\xfd\x45\xad\xbf\x5e\xcf\x30\xd6\x9a\x5f\xd3\x07\x0f" + "\xc7\x13\x10\xc2\x46\x5a\xd9\xa7\x0d\xc0\xc5\x29\x7a\xd2\x69\xfc" + "\x2a\xde\xe7\x7a\x7d\x1e\xec\xfe\x4c\x1d\xee\x19\x1d\xae\xe7\x52" + "\x70\x99\x67\x0e\x55\xca\xb3\x1e\xf4\xe9\xd3\x9a\x30\x60\x87\x93" + "\x3f\xf5\x41\xc7\x3b\x9d\x17\x78\x1f\xb4\xe2\x30\xda\xa9\x69\x0d" + "\x1d\x21\x8e\x4d\xb2\x53\xc3\xfc\x78\xc6\x46\xba\x9f\x9b\xf3\x34" + "\xbd\xbe\x4f\x13\xe9\xa9\x58\x03\xf3\x1e\x9b\x93\x75\x1c\xaf\xaf" + "\x4b\xc2\x34\xd4\x5b\xe4\x23\xbe\x57\x0f\x18\x9f\xfe\x81\xcf\x93" + "\xa0\x27\xc2\xc2\x66\xda\x7f\xde\x47\xec\xcb\x22\xef\xd9\xaf\xfb" + "\xce\xb6\xe1\x6b\xe9\x5e\x61\xb2\x4a\x3f\x46\xad\xf4\xf8\x5e\x8c" + "\x6d\x9b\xf2\xab\x6b\x9c\x18\xe1\x53\x97\x78\x9a\x2a\x26\xb3\x4f" + "\x9d\xb0\x34\x84\xaa\xe4\x5e\xde\xfb\xa3\x7b\xdc\x15\xf9\x3e\x7a" + "\xcd\xc1\xfc\xb3\x91\xfd\xeb\xa5\x8e\xad\xf8\xcc\x9f\xb4\xdf\x25" + "\xd4\xdd\xbb\x04\x6d\x79\xb8\x61\xcb\x57\x64\x56\xf4\xa8\xf8\xa0" + "\xb5\xab\xa7\x59\x78\xf6\xbb\xf8\xee\x94\x0e\xdb\x0a\xd8\x1b\x44" + "\xe9\x7e\xac\xbf\x2a\x54\x3c\x43\x8f\x7c\xae\xe1\xfc\x50\x5f\x3a" + "\xe6\xb2\x0a\x8e\x79\x60\xf1\xd1\xeb\x07\x85\xfb\xba\xe6\x6e\xcb" + "\x7e\xd7\x23\x36\xb6\xa9\x2a\x3a\x7d\x09\x1f\x15\xea\x7b\x6b\x32" + "\x66\x40\xec\x9e\x58\xff\x18\x6e\xb7\x25\x7b\x01\x04\x6b\xc4\xb4" + "\x93\xf4\xe6\xe3\xbd\x6e\x32\xf5\xc1\x16\xec\x35\xc1\xe6\xdf\x9e" + "\x93\xb2\x79\x14\x65\x20\x6f\xd4\x49\x7a\x63\x72\xc8\x44\x69\xf8" + "\x4b\xf5\x7f\x27\x3f\x09\x70\x33\x79\xdf\xf1\xf0\x59\xde\x37\x7a" + "\x63\x87\xb4\xd5\xb6\xd1\x18\x0d\xf0\xf8\x0c\x65\xcb\x28\x1a\xc3" + "\x7b\x7f\x48\x4b\xcf\x0d\xab\xb3\x44\x63\x7d\xbf\x6e\x14\x8d\x8d" + "\x6e\xf7\x0d\x3d\x16\xc0\x9b\x39\xfc\xbb\xc2\x4f\xd7\x16\xde\xc3" + "\xdf\x93\xdc\x6a\x13\xee\x44\x21\xbe\x63\x33\xa9\xf3\xfe\xad\x09" + "\xd6\x4a\xc5\x77\xf2\xec\x0c\xfc\xc6\x67\x93\xfa\x39\x4d\x82\x8c" + "\x95\x90\xfc\xe1\x6e\xfe\x3e\x6f\xc4\xde\x6b\xaa\xc4\x43\xbf\xe7" + "\x1c\x5e\x77\xcb\x3c\x86\xc1\xf8\xe4\xce\x57\x67\x3c\x7c\x07\xda" + "\x47\x6f\xc8\x78\xbc\x1b\xb7\x51\xca\x2b\xdb\x28\xf5\xf0\x42\xee" + "\xd7\xd6\x0c\x25\x8b\x66\x62\x7c\x35\x0f\xcb\x19\x78\x02\x78\x73" + "\x7b\xcc\x1b\xad\xa1\x33\xcd\xce\x22\xa1\x35\x3f\xc7\xb6\xe8\xd6" + "\x97\x9a\x97\xec\xa6\xd9\x7c\x67\x9c\xef\x8b\xcd\x25\x7f\x35\xe0" + "\x55\x8f\xa2\x54\xc0\x5a\xe3\x2d\x20\x3e\x03\xb8\xa1\x79\xc9\x1e" + "\x86\xfd\x2a\xcf\x05\x9b\x40\x1f\x35\x27\xbc\x39\xd5\x1b\x6c\xa3" + "\xc3\x90\xef\x59\x85\x22\xcc\x70\x50\xe6\x8f\xb2\xbf\xdb\x6d\xf6" + "\x5c\x75\x4f\x5d\xf6\xb5\xff\xec\x4c\xef\x87\xf7\xac\x84\x77\xcc" + "\x3b\x0f\x36\x9e\xde\x27\x83\xd6\x8a\xbf\xde\xfc\x76\xf3\x92\x3a" + "\xe2\xf1\xe1\xf2\x78\xb7\x78\xbb\x50\xf6\x54\xf4\xb8\x70\x19\xe4" + "\xdd\x05\xb8\x3f\x1c\x38\xff\xe5\x73\xc9\x81\x32\x55\xdb\xf8\x3e" + "\xcc\x1b\xc5\xdb\x41\x23\xb5\x5f\xbe\xf5\x1d\xc6\xd5\x47\x5b\xeb" + "\xbc\x45\x7f\x8e\xef\xe7\x09\xd9\x07\xdf\xaf\x6d\x95\xe7\x60\x6f" + "\xbe\x31\x2b\xa4\x09\xa5\xcf\x2a\xa7\x6b\xd0\x03\x3e\xfc\xb2\x2e" + "\x90\xfa\xe4\x56\xf6\xad\xa9\x9c\x61\x4d\x50\xe3\xcb\x7d\x61\x7b" + "\x25\xde\x18\x47\x9c\xd1\xa5\x32\xae\xc6\x18\xf3\x77\xed\x34\x3e" + "\x67\x1d\x05\x7a\xf7\xd9\x48\xf1\x9f\x28\x07\x5c\xfd\x7e\x44\xa3" + "\x43\x9f\xcb\x1c\xdd\x49\xef\xa7\x8b\xd5\x36\x32\xfc\x6d\x21\xbf" + "\x63\x72\x95\x0f\xb3\x8d\x75\x54\xb5\x49\xe8\xf1\xf6\x2a\xa7\xeb" + "\x75\x8b\x94\x9f\x43\xa5\x05\xf5\x8b\xe2\xf6\x37\x11\x7a\xc7\x0d" + "\x35\x8d\xfe\xb0\x1d\x29\xa0\xab\x30\x1f\x0c\xf5\x06\x7a\xf5\x6f" + "\x0a\x56\xfe\x01\x36\xf5\x50\xbe\x9b\x62\xe0\x76\x79\xe7\x69\x95" + "\xe5\x6a\x6d\x53\x79\xc4\xd8\xaf\x11\x16\xd0\xd8\x6d\x15\x7c\x87" + "\x8b\xef\x1a\x04\x92\xbe\x2c\xf7\x27\x5d\xd0\xfd\x9e\x2a\x83\xb0" + "\x53\xa5\xbe\xcd\x0d\xf2\x37\xdd\xdb\x3d\x7c\x5e\x8a\x75\xd3\x50" + "\xee\x73\x8f\xfb\x2d\xac\x7f\x0a\xe6\xaa\xf9\xbc\x72\x50\xdf\x6b" + "\xb9\x66\x32\xfa\x86\x3e\xc9\xbe\xa1\x8f\xb2\x6f\xfa\x37\x77\x4e" + "\xd0\x5b\xf2\xee\xf6\xe5\xf5\xe7\xad\x79\x8a\xb6\x5f\x96\xf3\xf7" + "\x44\x4f\xd0\xf6\x71\xf2\xfe\x01\xc6\x44\x9d\x2d\xbc\xd5\x29\x92" + "\x5f\x49\xbe\x4c\x98\x7b\x14\xcc\x0b\xcd\x6f\x70\x7c\x3e\xfd\xbb" + "\x5d\x80\x7d\x0d\x74\xb9\xf4\xa1\xec\x46\x7b\xfc\xdd\xc3\x01\x3d" + "\xb4\xad\x92\xc7\xea\xd6\xdd\x94\xa9\xf8\x70\xdb\x26\xde\xbf\x55" + "\xeb\xbc\x6d\x93\xc0\xf7\x6a\x7d\xd2\xef\x9b\x9d\x20\x7d\xb3\x23" + "\x75\xec\xe5\xe1\xb8\x4d\xca\xb2\x48\x3e\x3e\x0f\xcf\x63\xd9\xc7" + "\x80\xf1\x5d\x11\x32\xf4\xdf\xb6\xb1\xec\xe7\xd3\x7f\xc6\xbe\x12" + "\xbc\x52\xa2\xee\xae\x02\x9f\x43\x86\x8d\x22\xbf\xd3\xe4\x16\x07" + "\xb9\xdc\xec\x95\x67\xe4\x19\xfc\x16\x79\x4f\xfb\xa4\x7e\xc7\x69" + "\xdb\x71\x7d\x3f\x23\x9d\xfd\xe2\x7b\xdc\xdb\xd1\x76\x93\xf4\xe7" + "\x61\x1a\x70\xdb\x12\x77\xf9\xad\xa4\xed\x63\x06\xce\x52\xb6\xc9" + "\xf3\x09\xe5\x2b\xba\x7d\x92\xc1\x23\xe8\xef\x50\x15\x2f\xf1\xad" + "\x77\x0e\x8c\x25\xc9\x03\xdd\xc2\x96\xfc\xbd\x2a\xe6\xc9\xed\x79" + "\x91\x74\x9a\x1d\xd2\x9c\x4a\x07\x6d\xcb\x12\x52\xd6\xb7\x65\x7d" + "\xbd\x3d\xb1\x7d\x9f\x61\x8b\x28\x3a\xa7\x42\xbf\xec\x5c\x2f\x69" + "\xed\xa9\xcd\xe1\x58\x16\xab\x4b\x38\x1e\x4f\xd5\x4a\x8e\x75\x14" + "\xf2\xd4\x3a\xc2\x7c\x1f\x0e\xf3\xac\xe6\xa9\xf5\x9c\x28\x24\x53" + "\x6e\x21\x9f\x1f\xed\xcf\xe6\xf5\x95\x70\xc2\x16\x48\x86\x7d\x02" + "\x39\x5f\xb3\x88\xac\x4f\xe5\x03\xb6\x33\x3d\x8d\x63\x11\x71\x1c" + "\x22\x8e\x27\x16\x76\xa6\x8f\xc0\xf3\x48\xd8\x73\xa9\xc2\x52\x9b" + "\xcf\x3e\x28\x61\xb7\x80\x3e\x3e\xc6\xf1\x90\x4c\x5e\x7f\x90\xd6" + "\x9c\x22\x0b\xc7\x3a\x0a\x95\xee\xcf\x6f\x0d\x7c\x2e\xd7\x16\xc3" + "\x0b\x61\x4f\x6b\x34\x1a\x34\xb7\x69\x49\xfb\xb3\x31\xc7\xcf\x51" + "\xfd\x3e\x23\x54\xbf\x15\xde\x8c\xbf\xd2\x71\xbb\x3c\x25\x12\xf7" + "\x9d\xdf\x0d\x01\xbe\xe6\xa9\x5f\x1f\xf6\xd4\xbb\xd4\x3d\xba\x43" + "\x54\x52\x24\x3a\xbd\xb0\x8d\xd9\x27\x92\xef\x14\xb2\x8f\x0b\xf7" + "\x91\xfb\xc7\x6d\xff\xfb\xd9\x53\x32\x76\x53\x08\xef\xce\x02\xbd" + "\x4e\x17\xea\x74\x1d\xa2\x5e\x4f\xbd\xec\x7b\x6b\x40\xd5\xcd\x95" + "\xcf\x5c\x3f\x82\x0e\x7a\x9f\xfb\xe9\x80\xbe\x73\xff\xb8\xff\x21" + "\xa6\x09\x68\xa0\xf7\xd5\xd6\xa7\xf7\x93\xfb\xf8\x6f\xe0\xd4\x6d" + "\xe8\x27\xfa\x2a\xfb\xd9\x87\x7e\x1e\xcc\x27\x0a\x96\x7d\x59\x73" + "\x21\xb9\xde\xc5\xeb\x43\xe7\x7f\xc0\x8e\x2e\x2e\x27\xac\x03\xcd" + "\xbf\x2e\x29\x37\x95\xc1\x36\x29\xf1\x63\x3d\xe8\x17\x9d\x6c\xef" + "\x7b\x0b\xf1\x17\xaa\x92\xdf\x62\x95\xf6\x31\x7f\x37\xf3\x25\xf4" + "\x49\xfb\x82\x4a\x3a\x45\x27\x6c\xd3\xa0\x37\x84\x32\xf9\xe8\x3f" + "\xd6\x8f\x27\x74\xfc\xb9\xec\x9a\xaf\x54\xbf\xac\x05\x94\xf6\xc9" + "\x13\x1e\x93\xb7\xcd\x43\x46\x5f\x9e\x46\x39\xf4\xc7\x06\x58\x32" + "\x6e\xbc\x86\x7e\x6e\x07\x9e\xc1\x88\x3e\x1d\xee\x0a\x02\xe6\x67" + "\x94\x9c\x4d\x09\xdb\x4e\xa3\x1f\xa7\xc9\x56\x5e\x02\xfb\xeb\x61" + "\xb6\x17\x77\x3c\x7a\x45\x0e\x81\xef\xab\xd4\xf7\x4a\x54\x6c\x95" + "\x6b\x4e\xd2\xce\x35\x46\xfc\x14\x8d\xe3\x4f\x25\xed\x2f\x60\x3e" + "\x92\xb1\x54\x78\xce\xe8\x01\xcf\xb0\x7f\xca\x0a\xb4\xd1\x93\x3e" + "\x52\xe2\xe3\x56\xf1\x57\xf0\xce\xdf\xd1\x49\xe3\x3d\x01\xd4\xcb" + "\x17\xa0\x19\xc3\x87\x3d\x37\x87\x7f\x99\x86\x71\xef\x6f\xbc\x4b" + "\x13\xd1\xc6\x44\x5e\xfb\x36\x94\xf8\x4d\x1b\xde\xa5\xb1\x97\xa7" + "\x53\x76\xee\x1e\x4c\x7f\xf3\x59\x00\xc3\x43\xdf\x46\x9c\xa4\xea" + "\x57\xa3\x65\xcc\x2e\x75\x99\xd2\x83\xd5\x39\xbc\xff\x7e\x79\xed" + "\x56\xab\xb8\x4d\x6e\xe1\xb9\xcc\x7a\x73\x0d\x3c\xf0\x6c\x1b\x0c" + "\xf7\xcb\xa7\x43\xf5\x9e\xc1\x60\x6d\xda\x2a\x63\x69\x39\x37\x6f" + "\x65\x1f\xbf\x2f\x3d\x07\x6c\x1c\xd7\x18\x73\x67\x5d\x80\x96\xee" + "\x20\x8b\xf3\x14\xef\xc9\xcc\xa4\x03\x55\x19\xb4\x13\x6b\x72\xd1" + "\x9d\x3e\xe2\xf5\xb3\xec\x4f\xa0\x74\x08\xdb\xa4\x7c\x8f\x4d\x2c" + "\x4d\x4f\xdd\xb2\xd5\xb0\xe1\x6b\xd6\x14\x9f\x23\x93\xfa\x6e\x44" + "\x4d\xf1\x54\xbb\x08\x55\x98\xb4\xfc\x2a\x8e\x2d\x94\x7c\xfc\x08" + "\xc7\x16\x32\x62\xed\x48\xdb\xc7\x01\x99\xeb\xb6\x25\x6f\x5a\x42" + "\x63\x39\x2e\x98\xd5\xaf\x6c\x39\x35\x5f\xd7\xec\x06\x7e\xa9\xfa" + "\x19\x7a\xaa\x8a\xbf\xb3\x33\x50\x7d\x16\x6d\xa9\xfc\xcf\xc3\x58" + "\xc3\x48\xb8\x4b\x68\x4c\xd5\x59\x4a\x67\x3b\x28\xf7\x0b\x65\xb3" + "\xf1\xba\x70\x66\x97\x55\x84\xff\x77\x3a\xed\x38\x39\x10\x37\xcc" + "\xbf\x94\x63\x8d\x89\xb8\xdf\x24\x56\x7b\xeb\xd2\x8f\x46\xc6\x80" + "\x50\xdf\x15\x23\xaa\x78\x8d\xcc\xfc\x1d\x4d\xde\xcb\xe3\xbd\x61" + "\xbe\x4b\xa3\xe6\x90\xda\x2c\x23\xae\xd2\xa0\x67\x73\x1e\xb5\xde" + "\xd1\x86\x62\xfd\xe5\xef\x69\x6e\x5e\xce\x73\x46\x6d\x05\xdf\xdf" + "\x19\x58\xe3\xd4\x2e\xe3\x3c\x4e\x63\xff\xf2\x4c\x49\xcb\xda\x26" + "\x5e\xf7\xe8\x6b\xc6\x4f\xec\xfd\x69\xca\x86\xe1\xb9\x8c\x71\xa8" + "\x56\xfb\xc8\xc3\x81\x4b\x9b\x31\x9f\xf1\xbc\xae\xbe\xe1\x59\xdb" + "\xe5\x4b\xd8\x57\x7f\x09\xfc\x52\xf5\x6f\xe0\x9a\xba\x39\x56\x92" + "\xfb\xed\xd1\xc6\xfc\x26\xbf\xd1\xb0\x6e\xd4\xfd\x4b\x57\xd2\xe8" + "\x47\xbe\xcd\x67\xde\xf2\x1e\x46\xa7\x9a\x77\xdf\x9e\x3a\x70\x46" + "\x95\x29\xe9\x2d\xbf\xbf\xc6\x6b\x0c\x13\xe6\x60\x15\x23\xac\x4b" + "\xcd\xbf\xc6\x1d\xe3\xb7\xe7\x47\xb4\xb3\xbe\x7f\x1e\x45\x1b\xec" + "\x2b\xc1\xf0\x95\x6d\xf2\xf6\x44\x6e\x83\xd7\x56\x6a\x7e\x7d\x7b" + "\xe2\x25\x6c\xb1\x74\xa6\xaf\xa6\xaf\x27\xbd\x5d\x5f\x2a\xfa\x3a" + "\x28\x71\x7c\x05\xd9\x3e\x29\xf1\x99\xd9\x4f\xd5\xbe\x84\xac\x68" + "\xff\x33\xce\x67\x5e\x6f\xbe\x95\xf7\xe2\x76\xdd\xe6\xe5\x79\xbb" + "\x2f\x27\x65\x16\xaf\xf5\xa5\x2d\xbe\xcb\x3e\x0e\xf5\x90\x36\xe2" + "\x77\xa7\x83\xe6\x2d\xab\x68\x2c\x7f\xe7\x10\xe9\xf2\xdb\x60\xfe" + "\x6f\x3d\xdf\xf3\xbd\x34\xb2\x7d\xaf\x82\x7d\xec\x77\x4d\xc7\xfa" + "\x52\xee\x1d\xcb\xf6\xcb\x2e\xf8\x39\x3e\xda\x7b\xbd\xbe\x21\x6a" + "\xac\x76\x7d\x81\xf7\xf4\x88\xf7\xb5\xc6\x5e\xbe\x8f\x76\x75\xc8" + "\xf3\x40\xf6\x23\x5e\xcc\xf3\x75\x7b\xe1\x80\xef\xcd\xae\x2f\x74" + "\x5c\xbe\x38\x50\x48\xbc\x57\x7d\x74\xe7\x48\x71\x04\xed\xed\xf5" + "\x51\x6d\x50\xdf\x8f\x39\x22\xf9\x8a\xed\xdd\x7f\xe6\x35\xd8\x97" + "\xcd\x9b\x50\x8e\xe7\x89\x5c\x07\x65\x2a\x1b\xbe\xdd\xa3\x81\x7f" + "\x06\xfa\xbf\xeb\x21\xde\xeb\x8b\xab\x13\x61\xe2\xc8\x3a\xa5\xc7" + "\x0f\x4a\x3f\xae\xd2\x50\x36\x7e\x61\xdb\xff\xb5\x10\xbf\x29\xe0" + "\x39\x17\x7e\x53\xf1\xeb\xc0\x6f\x9a\x28\xed\xcd\x60\xbe\xc4\x1a" + "\xd6\x86\x75\x82\xa5\x3b\xe9\x78\xf3\x60\xf7\xff\x98\x36\xde\xf5" + "\x8f\x91\xf2\x4b\xad\x3b\x78\xd8\x0f\xfb\x0c\x2b\xe5\xa5\x21\xd1" + "\x6b\xbf\x96\xef\xd9\xd4\x1d\x74\xee\x60\x7f\x90\xba\x98\xef\x9f" + "\xd7\x35\xe1\x0f\x92\xf6\x4e\x36\xfe\xa0\x33\xea\x0e\x0e\xfc\xbd" + "\xd3\xd4\xe3\xae\x3b\xe8\xa3\x3a\x69\x63\x5d\x9e\x4e\xac\x53\x77" + "\x29\x78\x5d\x94\xf4\x69\xb9\xea\xef\x85\x1a\xbc\x5b\x44\xd2\x05" + "\x9f\xde\xdf\x72\xbc\xa7\xda\x9d\x98\xd7\x92\x40\x93\x51\xe8\x73" + "\x52\x28\x9b\xfb\xcb\xf8\x76\x27\xfd\xb5\x30\xf2\xee\x23\xc3\xe4" + "\xfe\xfb\x93\xda\x19\x1e\x89\x9b\x66\xf4\xd3\x53\xa7\x13\x9f\x1b" + "\x99\xba\x01\x43\xd9\x41\x28\x0f\x18\x46\xf9\x7e\xda\x8f\xe2\x6f" + "\x0e\x60\x4c\x51\x0e\x6b\x62\x8b\x71\xaf\xb2\xc7\xfd\xce\x9e\x4f" + "\x0b\xd4\xf9\x01\xd7\x0d\x44\xd4\xe5\x78\x03\xf1\xea\xa3\x4d\x8b" + "\x6a\xf3\xaf\x85\x27\xa8\xee\x8f\xaa\xdd\x77\xea\x07\x93\xa5\x92" + "\xeb\x61\xdf\x55\xf9\x38\x26\x01\xdb\x43\x93\xbc\xa3\x03\xe4\xad" + "\xd2\x30\xe7\xb7\xd7\x64\x96\x88\xe6\x13\xf4\xf3\x45\xad\xc1\xce" + "\xcb\x9c\x0f\x7f\x2e\xcf\xdf\x45\xaf\x8b\xbc\xc5\xb7\xcb\xef\xfb" + "\x9e\xa6\x5f\xbc\xe5\xf5\xcb\x38\xd9\xfc\xbc\x81\xf3\xd9\xf7\x81" + "\xe7\x06\x8e\x1b\x67\xac\xb1\x35\x94\xdd\xc9\xe9\x48\xf3\x06\xfc" + "\x32\x3e\xdd\x80\x6f\xf6\xf1\x7a\x25\x53\xbf\x78\x48\xde\x7d\x67" + "\x7c\x43\x3f\x6e\x66\x9c\x35\xcf\xf1\x7a\xee\x83\x13\xeb\x3f\x6f" + "\xa8\xa7\x99\x65\xc2\xbe\x9c\xf7\x0a\x7f\x31\x0e\x7c\x27\xb4\xd2" + "\xe3\xf5\x97\xd9\x07\x79\x77\xc2\x19\x12\xa7\xfd\x49\xc7\xeb\xd9" + "\x26\xd9\x52\x32\xc4\x32\xa5\x4a\x34\x77\x27\xb7\xd7\xf4\xb8\x7f" + "\x91\xfd\xa9\x83\xfe\x1b\x7c\xf8\x8b\x6c\xa3\xef\x3b\xf5\xbe\xa3" + "\x2d\xb9\x7e\x1a\x5f\xa9\xe2\xf1\xa1\xcc\xa0\xdf\x79\xe6\x71\x66" + "\x7b\x80\xfd\x46\x75\x5a\xb4\xf5\xcf\x0d\x97\x87\x47\xdb\x37\x68" + "\xa3\x4f\xb5\x51\x3f\xe9\xbf\xd7\x46\xfd\xa4\x4b\xb5\x01\xdd\xf0" + "\xdd\x93\x54\x7f\xf0\xf2\xd7\x8e\xf5\x15\x92\x57\x3c\xed\xe5\x4a" + "\x67\xfe\xf2\xae\x30\xd6\x6f\x21\xcb\x85\x1a\xf9\x2d\x1e\x13\xb9" + "\xbc\xbe\x10\x85\x3c\x9f\x96\x1f\x76\xf4\x52\xf3\xf2\x3f\x51\x07" + "\xfd\x8b\xdc\x37\x3a\x5c\xc4\x6b\xb6\x0b\xbe\xbe\xb2\x76\x7f\x9f" + "\xa9\xde\xc6\xf4\xde\xc1\xb1\x0f\x23\xf8\xac\x35\xf0\x27\xf2\xce" + "\xe3\xfd\xd5\x23\xbc\xaf\xed\x83\x7e\xa8\xd1\xa0\x1b\x60\xa3\x87" + "\x25\x3d\x60\xbf\xa8\xf5\xd6\x97\x6a\xbd\xe5\x97\x77\xfe\xae\x84" + "\xdd\x9b\x22\xdc\x05\x69\xbc\xf7\x1d\xee\xcb\xb1\xf7\xb8\x29\x9b" + "\xe3\x10\xf2\xbe\xb3\xb0\x34\xa6\xcd\x0e\x25\x0a\xb9\x9e\x82\xed" + "\xcf\xf1\x08\xbd\x01\x1f\x85\x61\x47\x57\x9d\xa7\xb4\x2a\xd8\x9e" + "\xd0\xd9\xa9\xac\xd7\xab\xf5\x78\x84\x9b\xce\x0f\xc4\x23\xdc\xc9" + "\x7b\x3d\x6d\x78\x3e\x4f\xe6\x70\xe9\x97\x9e\xed\xe7\x69\xcc\x8e" + "\xe5\x94\xbe\x9d\xf7\xf2\xfe\xa6\x6c\x1f\xb6\x2b\x64\x6c\xc2\x17" + "\xd3\x79\x3f\x7f\xc0\xf6\x59\xc1\x31\x53\xfb\xf5\x96\x59\xee\x81" + "\x5c\x16\xbd\x7f\x29\xe7\xc1\x90\xe7\xf8\xc1\x90\x25\x94\xdd\x57" + "\xf6\xd7\x42\x1f\xfd\xcb\xc4\x3e\xd3\x2f\xf6\xc4\x1b\x5b\xc3\xb7" + "\xa9\x22\x22\x9e\xe4\xa7\x63\x94\x7e\x07\xac\xe2\xc1\x78\x22\xbc" + "\x3d\x87\xc6\x77\x51\x86\xf2\x57\x48\xc2\x9c\xf8\x4b\x1f\x9f\x9f" + "\x97\xbc\x40\xb6\xf0\xf6\xb9\x09\xce\x5a\x4a\xe4\x6f\x3f\xf3\x5f" + "\xc9\x57\xa2\x73\x7c\x01\x65\xf0\xf9\x03\xfb\x34\xd8\x57\xcb\xf2" + "\x8d\x63\x8a\x29\x2a\x4e\xce\x74\xe5\x6c\x74\xb7\x7d\xc6\xe2\x67" + "\x5f\x7c\xa1\x70\x7e\xd1\xa2\x67\x16\x15\x2c\x2a\x5a\x29\xc3\x06" + "\x8c\x95\xff\x3d\x70\x63\xde\x1c\x79\xe8\x1c\x61\x5f\x8c\x19\xd8" + "\x8f\xfb\xd5\xa2\x30\xef\x1f\x5c\x16\xbd\x7e\x35\x41\x3f\x47\xf3" + "\xef\x90\xe7\x4a\xbf\x2a\xf6\x25\xec\xdd\xcb\xba\x62\x93\x8a\x23" + "\xd3\xa9\xfc\x18\x54\x39\xcd\xd3\xcb\x31\x7a\x26\xb5\xd3\xbb\x32" + "\xe6\x25\xc6\xca\xe5\x2d\x3e\x49\xb0\x43\x26\xf1\x39\xcb\x61\xde" + "\xcb\x90\xb6\xef\xaf\xfe\x26\xe7\xb0\xd3\x32\xa6\x52\x5d\x3b\xde" + "\xd9\xef\x5d\x13\x39\xdb\xc3\x2f\xda\xea\xb4\x17\x6d\x3f\x17\x22" + "\x67\x9b\x76\x26\x7f\xbb\x38\x93\xbf\x4d\x78\x6a\xeb\x21\x63\xa3" + "\x4f\xd2\xaf\xc2\x21\x37\x7d\x0b\x7f\xc3\x06\x62\x08\xec\xbe\x2a" + "\xab\x43\xf4\xe1\x4f\x13\x9e\xb7\x0f\x46\x9c\xa1\x71\x9e\xbc\xb3" + "\x51\xb8\x84\x7d\xa9\x76\x4f\xe3\xb6\x45\xd9\xdb\xff\xcb\xef\xcc" + "\x4f\x44\xf9\xb0\xc2\x65\xf7\x7c\xef\xfa\x13\xa4\xce\x4d\x77\xcf" + "\x6b\x96\x7b\xc6\xbb\x2f\x70\x3d\x3e\x67\x63\x1b\x5a\xc6\x62\x35" + "\xfd\xb2\x8b\xfd\xf0\xd8\x7e\xde\x31\x82\x52\xcb\x47\x50\x4a\x8f" + "\x7b\xf7\xc6\x7e\x1f\x0b\x8b\x9a\x53\x79\x5e\xe3\xd8\xc1\xd0\x39" + "\x3d\x3c\x47\x32\x1e\xcc\xa7\x80\xb9\x97\xcf\xe0\xd4\xbd\xa2\xdd" + "\x2d\xb0\x1f\x27\x5e\xbe\xce\xdd\xdd\x22\xe7\x0f\x93\x53\x8c\xdf" + "\x48\xf3\xe4\xf9\xa8\xf2\x39\x34\x43\x2e\x2d\xaa\x3f\xef\xde\x26" + "\xcf\xcf\x97\x9f\x62\x1d\xe2\xaa\xee\xa5\x14\xcd\xd3\x98\xc2\x76" + "\xcc\xe1\x62\x79\xae\xcc\x67\xda\x0d\x7c\xee\x2c\xef\xe5\xc9\x58" + "\xd4\x7f\xa2\xea\x73\x64\xee\xa0\x5f\x67\xf2\x5e\xfb\x00\x6d\x7f" + "\xfd\x06\x9f\xad\x88\xb2\x9a\x4c\x6b\xb1\xc9\xc3\x30\xb4\xf3\xa7" + "\x27\x1a\xf5\x30\x77\x0f\xe3\x7a\xed\xf4\xeb\x95\xb2\x1e\x97\x95" + "\xdf\x31\x4c\x9d\x8b\x79\xec\x20\x97\x0f\xe1\x7d\xa7\x96\x9a\x2d" + "\x20\x6f\xe1\xe5\xe1\x06\xe4\xcd\xd1\x3c\x7f\x2d\x44\x5a\x8e\xdc" + "\xe3\xc5\xba\x5c\xc6\x3b\xb1\xec\x87\xae\xfb\xb2\x59\xe2\xc3\x7e" + "\xac\x45\xd0\x4d\xd2\xee\xfb\xf5\xe1\x9d\x7f\x93\x31\xb2\x31\x86" + "\xef\xce\xd3\xf9\x46\x9f\x3f\xdf\x9d\xdf\x5d\x56\xef\xea\xb6\xb4" + "\xbb\x02\x26\x0b\x1d\xb0\xb1\xdf\x7d\x6f\xc6\x01\x5b\x2f\xd6\x0e" + "\xef\xa6\xfb\x4c\xd5\x0d\xca\xe6\x50\xf5\xf8\x6c\x07\xf6\x68\x57" + "\xa2\x2d\x75\x3a\xf2\xa7\x1b\xfe\x15\xfc\xed\x6f\x3e\xe3\xf1\xd1" + "\xaf\xed\x4c\x37\xf0\xfd\x1e\xb9\xcf\xbf\xee\xc9\x4e\xf4\x67\x28" + "\xfb\xc0\x31\x9d\xf9\x7e\x83\x15\xcf\x62\xb9\x98\x68\x0d\x65\x9a" + "\xaa\xe5\xbd\x46\x79\x5f\x7e\x82\x1e\xb3\x25\x43\x8f\xe1\x32\x96" + "\xdf\xd5\x7d\xfb\x77\xfb\xef\xff\x73\x9c\x1a\xf6\x1d\x08\xeb\x7e" + "\x75\x32\x7e\xcb\x59\x75\x3e\xca\x7e\x75\xbc\x3f\xc8\xf7\x03\xf9" + "\x0c\x13\xf5\x3a\xfb\xfd\x1c\xe5\xbd\x98\x77\x83\x46\xdc\x96\x1e" + "\xf7\x7b\xe6\x7e\x7f\x1d\xf4\xbd\xdb\xd3\xee\x08\x58\x7a\x33\x02" + "\x9e\xe3\xcd\xc8\xb3\x43\x37\xe5\x5c\x72\x4d\xc7\xf1\x68\x97\x91" + "\x49\x4b\x6e\x9c\xc8\xf1\x2c\x38\x2e\x98\xf2\x93\x7f\x6f\xad\x7e" + "\x7f\x3c\xf1\x34\xbd\x37\x79\xe0\x2c\x31\xac\xef\x83\xbd\x57\xaf" + "\xec\xb0\xf7\xea\xe5\x3e\x58\x59\xfb\xbc\x5d\xab\x82\xa6\x86\x55" + "\x3e\x93\xba\x27\xf0\x1e\x2c\xb0\x8f\x8e\x18\xfe\x28\x28\xc7\xf1" + "\x1a\xe2\xc6\x4c\x12\x9e\x0f\x03\x0a\x66\x83\xdc\xc3\x18\x58\xd7" + "\x34\xa8\x73\xb2\x75\xa3\xe6\x69\x3c\x07\x26\x7f\x5a\x23\x7d\x2b" + "\x0a\xcf\xf2\x7e\xd8\x50\xb5\xc6\x52\x65\x74\xbf\xc8\xab\x4f\x46" + "\xbf\x8f\xe0\x77\x45\xb3\x86\xb1\xc6\xde\xfa\x66\x93\xe6\xb3\x26" + "\x90\x70\xd6\x88\x00\xc7\x83\x83\x7d\xe5\xf7\x62\x4e\x45\x1b\x02" + "\xfa\x61\x18\xea\xcc\x67\xda\x2b\x19\x6a\xf8\x4c\xe2\xe4\xbe\x57" + "\x38\xd9\xae\xf4\xb3\x6f\xc7\x59\x42\xb9\xab\x50\x6e\x53\x4b\x71" + "\x17\xfb\xa7\xc8\x38\x6b\x1d\x7a\xdb\xfe\xa4\x0f\x03\xdf\x4b\xa1" + "\x79\x68\x13\xfc\xe3\x9e\x77\xf9\xb2\xdd\x50\x73\x29\x1b\x43\xcd" + "\x79\x99\x34\xd8\x3a\x85\xd7\xa1\xb7\xa2\xfd\x99\x82\xf1\x6f\xdc" + "\x14\x32\x05\xa9\xcf\x34\x4c\xfc\x93\xcb\x41\x21\xf7\x30\x11\x5e" + "\x85\xf1\xea\xb6\xc1\x8e\x3d\x44\xad\xa1\x16\xe9\xfb\x01\x99\xb5" + "\x96\x04\xc4\x59\x6f\x68\x8f\xf4\x85\x55\x77\xc6\x1b\x37\x78\x43" + "\xfb\xa9\xb5\xd0\x4f\xac\x17\xda\xa9\x51\xc6\x3a\xbd\xb5\xd0\x45" + "\x1c\xd3\x13\xf9\x19\x6a\xfe\x6b\xdc\xa8\xff\xce\x15\xdd\xe9\x51" + "\x67\x46\x0f\x2c\x5b\xfc\x6c\xd1\xa2\x17\x17\x8f\xcb\x5a\xb0\x7c" + "\x41\x81\xfd\x61\xe5\x4a\x17\x35\x2f\x59\x06\x62\x1f\xbf\x2f\xe7" + "\x0a\xb6\x41\x38\x06\xb2\x8c\x7f\xec\x9e\x40\xfd\xb1\x8f\xd9\x16" + "\xf9\x3f\x10\xff\xd8\xb0\x31\x38\xf6\xf1\xc0\x1e\xf6\x6f\x6c\xfd" + "\x32\xa0\x7d\xd2\xc3\xef\x7c\x4f\x52\x73\x37\x56\xb2\x1c\xed\x94" + "\x7e\x67\xef\x97\x47\xc6\xfd\x61\x1f\x3b\xde\xf7\x40\x7a\xbd\x71" + "\x27\x15\xbc\x88\xb9\xe2\xfd\xbd\x03\x77\x64\xde\x87\xfe\x6f\x34" + "\x2b\xf9\x95\x65\x8f\x1a\x67\xbd\xfa\x37\xa6\xe4\xd9\xb4\xe6\x3e" + "\x17\x50\xfb\x2b\xef\xff\xe7\x4e\x6d\x98\x45\xed\xed\xff\x86\x8c" + "\xfb\x57\x4a\x36\x3f\xd1\x65\xf3\x37\xb6\x4b\x9d\xc7\x0f\xc8\xc6" + "\x6f\xe6\x0c\xc8\xf5\x5f\x8c\xba\x73\xbe\xee\x2c\x5f\xb7\x73\xaf" + "\x39\x49\x1f\x2c\xe2\x3d\x17\x3c\x5f\x87\x67\x79\xef\x53\xf9\xa2" + "\x7f\x30\x4e\x7f\x46\x1b\x1f\x5c\xa3\x3f\x7f\xe7\x24\xed\x09\xeb" + "\xcf\xa3\xf0\xfc\x85\xfe\x0c\x99\xdd\x73\x58\x7f\x4e\xc3\xf3\x07" + "\xfa\x33\x74\xfc\x9e\x1d\xfa\xf3\x48\x3c\x6f\xd0\x9f\xbf\x8d\xe7" + "\x17\xf4\x67\xc8\xe0\x9e\x47\xf5\x73\x51\xcb\x09\xda\x73\xdf\xe5" + "\xdb\xdd\x7b\x52\xd4\xd9\xdb\x9e\x2c\xe8\x7a\xfd\xae\x5a\x7f\xda" + "\x3c\x8c\x4d\x83\x41\x5f\xa4\xf3\xde\xa0\x05\xe9\x0e\x1f\xd5\xe6" + "\x0c\xa4\xff\x26\xa0\x97\x2f\x87\x9e\x1b\x1b\x91\xde\xa9\xa7\xd7" + "\xc3\xbe\x2f\x8e\x48\x3f\xa6\xa7\x37\xa3\xfc\x9e\x88\xf4\x23\x7a" + "\x7a\x9b\x8f\xb6\x6f\x8c\x48\x6f\xd1\xd3\xfd\x86\x1f\x82\x9e\xbe" + "\x57\xa5\x7f\xc0\x3e\x03\x93\x22\xd2\x77\xeb\xe9\xd0\xff\xbf\x19" + "\x13\x91\x2e\xf5\xca\x16\x79\x6f\xcb\x2a\x0e\x14\xb3\x6c\x7d\x30" + "\xd5\x47\x6f\x45\xe2\x5c\xa1\xd7\x9d\xeb\xa3\xca\x39\x11\xe9\xfa" + "\xfd\xea\x0f\x8a\x7c\xd4\x11\x99\x3e\xa8\xed\x9b\x50\x49\xf3\x06" + "\xdb\x9b\xe4\x6f\xf2\x48\xff\x47\x69\x33\x7e\xd8\xc8\x77\xba\xac" + "\x3b\x44\xbb\xbd\x44\x88\x76\xfa\xb0\x52\xf9\xfd\x35\xf0\xdc\xd1" + "\xc5\x77\xe3\x3a\xe8\xc3\xb5\xf2\xbe\x14\xc7\x32\xe4\xfb\x72\xab" + "\xf8\xbe\xdc\x87\x32\xce\xf3\x78\x87\x4b\xc5\x39\x54\x7e\xa5\x5d" + "\x72\x8d\xae\x9f\x5f\xa2\xcc\x38\xde\xb3\x64\x38\xbc\x8f\xe7\x2d" + "\xea\x95\xbe\x8e\xbc\x46\xe2\x34\x5e\xab\xca\x3b\x54\x11\x6b\x25" + "\xa5\xf7\x3f\x6c\xd4\xf8\x8e\xbb\x5b\xad\xe7\xb7\xa8\xf8\x99\x5d" + "\xec\x73\x13\x59\xd6\x47\x1f\xca\x75\x6e\xa2\xed\xaa\xb7\x7a\xdc" + "\x1f\x96\x0f\xdc\xeb\xf9\xa0\x53\x4f\xaf\x44\x7a\x7d\x44\xfa\xd1" + "\xc1\x75\x3b\xf4\x9d\xa5\xc6\xd3\x77\x5e\x04\x42\xe7\x45\x70\xf3" + "\x7f\x01\xef\x85\xf2\x8e\xca\xb5\x61\x4f\x4d\xa5\x1e\x2f\xe2\x78" + "\x68\xb9\xe0\x7b\x3e\x1c\x5f\xff\x8a\x59\x01\x3f\xcd\x2a\xec\x11" + "\x9b\x9e\x61\xff\xb9\x73\x32\x76\x92\xb3\x8b\x63\xf9\xb2\x4f\x56" + "\x80\xcf\x7d\x52\x5a\x31\xc7\xed\x5c\xc8\xf9\x9f\xd3\xcc\x7c\xd8" + "\xde\xf9\x61\xda\x09\xd8\x3b\x9e\x31\xfc\x21\x3f\x9a\xde\xef\xa3" + "\x08\x1c\xb8\x3d\xa7\xfc\x3e\xc6\x47\x32\x36\x07\x7f\xf7\x4b\x94" + "\x86\xe6\x89\xdf\xb3\xfd\x7a\xbc\xc1\xba\x96\xc0\x57\x1f\xad\xc7" + "\x73\x8d\xfa\x43\x1e\xd2\x07\xeb\x93\x92\xe5\x8f\x9a\x95\xae\xa9" + "\xb5\x28\x7d\xf1\x51\xb3\x78\x9b\xef\xe8\x7c\xc4\xf7\x5f\x72\x60" + "\x2b\xc7\xf5\xab\x5a\xb3\x83\x4c\x7d\x65\xb0\x4d\x4e\xef\x35\x29" + "\xfd\xb4\xb7\x41\x33\x59\xd6\xf2\x7e\xa1\x8c\x91\x5f\xd6\x38\x7d" + "\xf7\xe2\xa0\xe9\xf0\xaa\x0e\x5a\xfd\x6d\xb2\xcd\x0d\xb2\xff\xf7" + "\xde\xdb\x86\x17\x71\xdc\xaa\xf6\x79\xb0\x3b\x4d\xbf\x41\xfe\xef" + "\x16\xef\x35\x85\xa4\xbd\xb2\xb7\x41\xee\x31\x79\x1a\x47\xf3\x1c" + "\xe2\x6d\x0b\xb3\xcd\x9c\x02\x9b\x39\x05\xfa\xdf\x12\x5e\x91\x3f" + "\x22\xb4\x34\xff\x8a\x1d\x4b\x28\x25\xbc\x34\x3d\xed\xf5\xf3\x34" + "\xd1\x98\x7f\xb0\x36\xcd\x10\x3d\xb6\xe4\x2d\x98\x53\x78\xed\x3a" + "\x3c\x21\x55\x9e\xa5\xf1\xb3\x66\xda\x59\xb9\x73\xf9\xa5\xbf\xf3" + "\x11\xc6\x9a\x95\x63\x74\x33\x2e\xf1\xfa\xba\x71\x1b\xd6\xc1\xfa" + "\x9d\xd2\x92\x2f\x68\x24\xec\x5c\xd3\xf0\x73\xa2\xf9\x64\x01\x99" + "\xf8\x1b\x09\x25\x0b\xe4\xfe\xd0\x90\xc3\xf9\x21\xf2\x3a\xfe\x4c" + "\x25\x4b\x78\x8c\xf6\x0d\x61\x3b\x8d\xfd\x21\x51\x3e\xf5\x24\xed" + "\xbb\xc6\x1a\xc4\x9c\x11\x84\xed\xfc\x1c\xaf\xf5\xf6\xdd\xcc\xeb" + "\x4d\x1f\xed\x2b\x60\x9f\xf0\xe6\x25\xf7\x73\xda\x34\xe7\x17\xd2" + "\xf7\x81\xd4\xbd\xd3\x7d\x76\x7e\x77\xf2\x1d\xd7\xe4\x0f\xc7\xbe" + "\xdb\x1b\x1c\xa2\xf6\x20\xf6\xe9\xdf\x4c\x69\xcf\x56\x6b\xae\x7d" + "\xf6\xc1\x78\x57\xf3\xd4\xf1\xf7\xec\xaf\xf3\x56\x85\x68\x56\x40" + "\xf8\xe4\x39\x25\xdf\xed\x77\xdc\xdb\x2c\xce\x97\x93\xba\x8f\xb6" + "\xef\x0b\xad\xb4\xae\x5e\xc5\x00\xdc\xf7\x39\x29\x1f\x23\xcc\x91" + "\x75\x7b\xd5\x1e\x6d\xdd\x41\xb5\x67\x59\xd7\xb6\x6e\x14\xfb\x20" + "\xef\xeb\xe8\x4e\xaa\x83\xed\xbb\x6f\x6f\x77\xf2\xc7\xf9\x83\xcf" + "\x47\xb5\xfc\x9d\xf2\x34\xde\x2b\x67\x7f\xe2\x6a\xe5\x47\x8c\x36" + "\x3e\x66\xbf\x62\xce\xbb\xae\xbd\x90\x12\x79\x7f\x11\x69\x77\x8e" + "\xaf\x22\x3b\x70\xbd\x52\x58\xea\x3c\xd2\x77\xcb\x53\x57\xe9\xed" + "\x12\xcd\xec\x33\xa8\xce\x34\x3e\x0e\x88\xa4\x3a\x8f\x5e\x7e\x43" + "\x6b\x17\xfa\x60\xa9\xcb\xf1\x06\x4f\xe9\x36\xe1\xc7\xe0\xfd\xba" + "\x1c\xe1\xa9\xcb\x57\x77\xc5\x3f\xfe\xcc\xd0\xab\x8a\x47\x3f\xfe" + "\xa3\xce\xeb\x6d\x8a\x6e\x1f\x07\xf4\xf9\xea\x3a\x7e\xc6\xdc\x9d" + "\xa1\xce\xe0\x3f\x6e\x36\x6c\x64\x9f\x5e\x86\xeb\xe0\x59\x8f\x85" + "\xf3\xb1\x0f\x7d\x77\xe8\xf9\xf2\xbb\x05\xe8\x1f\x74\xfd\xc7\xa3" + "\xb9\x5f\x83\xe9\x56\x49\x8b\x62\x4a\x04\xce\x0e\x4d\xc5\x45\x0e" + "\x78\x03\xf7\x36\xab\xef\xf6\x35\xad\x91\x77\x66\xd1\x0e\xc6\xc7" + "\xc4\x7a\x93\xef\xf8\x32\xbc\x01\xfc\x7f\x3b\xdf\xc0\x85\xdb\xe3" + "\x3c\xf4\x95\xfd\x76\x98\x56\xf9\x5c\x86\xc7\xf5\x44\x21\xef\x5d" + "\x9c\x03\xcd\xd8\x0f\xa8\x69\x23\xd3\x44\xd1\xac\x49\x7e\x1b\x6c" + "\x4b\xff\x38\x34\x3d\x15\x4d\x0f\xf5\xae\x59\xa0\x1b\x96\xb0\x3f" + "\x48\xd3\x46\x9d\x7e\x5d\xaa\xfd\xa6\xbb\xf4\xb5\x3a\xf2\x7e\xfb" + "\x55\x44\xdd\xef\xf6\x97\x55\xdf\x88\x34\xf1\xd9\x2a\xef\xb5\x2b" + "\x7e\x6d\x1a\x3d\x50\xaf\x69\x74\xee\x57\x6c\x23\xd7\xe4\xf0\x37" + "\xfd\x98\xe6\x3d\xee\xa6\x8c\x01\x7a\x2b\x38\x71\xda\xb8\xd6\x68" + "\xc3\x47\xbf\xf5\x1b\x78\xe2\x59\x9f\x83\x9b\x8a\x06\xc6\xe4\xb7" + "\x15\x46\x3d\xf6\xdf\xc7\x7b\x26\xdf\x17\x8c\xab\x07\xf9\x4c\x07" + "\xd8\xb5\x86\xee\x6d\x96\xfc\x48\x4d\x5d\xec\xeb\x0a\xba\x3a\x14" + "\x0f\x35\x1d\x51\x73\x61\x93\x8c\xdd\xc2\xe7\x25\x07\x82\xcc\x23" + "\x4d\x1d\x80\xab\xef\x97\x37\x05\x75\x1c\xb0\xfe\xdb\xe7\x8f\x5d" + "\xd7\xdd\x3f\x3f\x4f\x5e\x8c\x1d\xb7\xac\x30\x36\x4e\xa5\x65\xe0" + "\x0e\xe4\xfe\x09\x03\x77\x48\x3f\xb2\x29\x7a\xef\x77\x61\x9d\xba" + "\x67\xb3\x5a\xb7\xee\xdd\x8c\x31\x73\x9e\xa3\x51\xfc\x6d\x8c\x92" + "\x42\x71\xb2\xb5\x10\x6b\x69\x4b\x63\x1e\xf4\xc5\xff\xc7\xde\xf7" + "\xc0\x45\x59\xa5\xfb\x9f\x79\x19\x74\xd0\xe1\x8f\x2e\x1a\x2a\xda" + "\x54\xba\x3b\x16\x1a\x7b\xaf\xed\xcf\xba\x56\x54\xb8\xb1\x85\xe1" + "\xb6\x76\x97\xdd\xdc\xd4\x02\x17\x37\xd4\x89\x90\xd0\x60\x06\x50" + "\xf9\xb7\x80\xb4\xeb\x76\xb5\x90\xe8\x5e\x77\x97\xee\xda\x86\x5d" + "\xb7\x68\xb3\x9a\x12\xef\xa2\x02\x43\x85\x85\x2d\xe6\x88\xa8\xe8" + "\xa2\x8d\x38\xca\x00\x33\xef\xf9\x3d\xcf\x39\xef\xcb\xcc\x00\x83" + "\xc3\x88\x7f\xda\x2b\x9f\xcf\xfb\x79\x79\xcf\x7b\xe6\xbc\xe7\x3c" + "\xcf\xf7\x3c\xcf\x73\xfe\x3d\x4f\x92\xfe\x02\x19\x83\x7b\x29\x50" + "\xde\xe0\x5e\x4d\x1a\x00\xe9\x05\x3b\x93\x9c\xe7\xd4\x3e\xda\x0c" + "\x63\xdb\xca\x62\x18\xcb\x1a\xce\x90\xc9\x7c\x6f\xc4\x07\x1f\xe0" + "\x9c\x0e\x35\xc4\xbf\x22\xe6\xef\x4c\xc6\x33\x90\x0d\x30\x22\xa4" + "\x86\xa4\x57\xc4\x82\x9d\xc9\x50\x6e\x86\x61\x25\x19\x8f\xfa\x0d" + "\xe7\x86\x38\x66\x3e\x4a\x85\x72\x33\xd0\x3f\x99\x48\xe3\x15\xf0" + "\x7d\xa3\xa8\x7a\xc7\x52\x2c\x12\xb6\xf7\x1b\x70\x26\xb4\x92\x0f" + "\x03\xe1\xfb\x46\x8c\xd1\x87\xf3\x3c\x26\x9b\x0d\x7d\x28\x18\xe1" + "\x5d\x10\xbc\xbb\x1b\xee\x22\xfa\x2a\x43\x5f\xd2\x50\x7e\x18\x96" + "\x0f\xdf\x32\xf2\xba\x33\x1f\x22\x46\xc8\xb7\x12\xf3\xc8\x3e\xd0" + "\x44\x43\xbc\x1f\xbe\xc7\x33\xb5\x0e\xf8\x9d\x09\x2c\x3d\xfe\x9b" + "\xe6\xbe\xdf\x48\xf6\x33\xf4\xe5\x8f\x56\xd2\xc2\xbf\x22\xed\xaa" + "\x71\xaf\x29\xb7\x65\x3f\x4a\x92\xfa\x3a\xd8\xc7\x1f\xad\x90\xfe" + "\x57\xf7\xe5\x35\xc4\x13\x7d\x37\x09\x63\xeb\xa5\x2f\xf8\x81\xec" + "\xfd\xe8\x77\x40\x07\x9c\x5f\x68\x66\xe3\x71\xe1\x83\xbe\x73\x39" + "\xe5\xec\xec\xce\x87\x7d\xfe\xdf\x80\x37\x35\x9b\xb8\xcf\xbc\x5a" + "\x11\xff\x4f\x63\x67\xe6\xc6\xe0\x38\x03\xe7\x0e\x96\xac\xad\xe8" + "\x3b\xe3\xc0\xc7\xe0\x1f\x69\x5c\x7c\x45\xb1\xdf\xe2\x58\x1c\x7f" + "\x1b\x67\xa7\x17\x36\x49\x79\xf1\xb7\x71\x6b\x97\x50\xfc\x2d\xfc" + "\x66\x51\xdf\x6f\xdc\xce\xc8\x7c\xc4\xb1\x0e\x6d\xc0\xff\x2d\x50" + "\x67\x69\x0f\x92\x86\xaf\x1f\x7f\x54\x24\xaf\xd9\x9a\xc9\x07\x2d" + "\xc8\xb7\xc1\x7d\x21\x7f\xb4\xcb\xdd\x6f\x8f\x71\x03\xfa\x14\x82" + "\xf4\x3a\xd9\xbf\x0e\xfc\x0f\xdf\xfb\x80\xef\x83\x73\xf1\x9b\x55" + "\xe2\xe2\x83\xcf\x60\xa1\xc7\x90\x1f\xd0\x7f\xfd\xc0\xd2\x9b\x4e" + "\x0b\xde\xb1\xf0\x73\x46\xc6\x35\x58\xcf\x56\x62\x8c\x86\xe7\x60" + "\x7e\xbe\xdf\x78\x97\xd4\x4f\x6d\x71\x0e\x7b\xb0\x19\xbe\x89\x67" + "\x66\x5c\x9e\x23\xa0\xdf\x86\x40\xbe\x44\xee\xa3\xce\x38\xbd\x5f" + "\x7e\x7c\x9f\xd5\xef\x39\xaa\xdf\xb3\xc6\x0a\xf8\xf4\xb4\x36\x5d" + "\x3c\x99\xcd\xcb\x85\x07\x65\x13\x9d\xe1\x14\xf1\x03\xbc\x1e\xc7" + "\xba\x35\xb4\x77\x60\x9b\x82\x69\x4e\x24\x31\xb5\xdb\xb9\x0d\x07" + "\xba\xb3\x75\x3a\xe4\x39\x45\x26\xe2\xbe\x69\x8c\x6b\x00\xf9\x4f" + "\x73\x1f\xcc\x9f\x04\x2e\x5e\x33\x86\x88\xbf\x8c\x1f\x4b\x85\x38" + "\x1b\xae\x8d\xbd\xd9\x63\xf6\xc7\x75\x22\xfd\x56\x82\x36\xcd\x44" + "\xe8\x9f\x6d\x18\xf3\x0a\x63\x90\xff\x57\x4f\xbb\xbf\xc9\xfe\x15" + "\xd1\xfd\x8a\x08\xa7\xc9\x27\x44\x99\x41\x94\x9b\x4e\x90\x10\xe0" + "\xab\x7d\x8f\x7d\x2e\x91\xcf\xe7\x97\x8d\xe7\x67\x8b\xcb\x40\x8e" + "\x3d\x1f\x46\x6d\x5d\x39\x1f\x83\xfd\xff\xba\x4a\x1e\xcb\x16\xf1" + "\xd8\x05\xca\x13\xe4\xe3\x7d\x82\xe4\x8b\x80\xd3\xf6\xe3\xad\xfc" + "\x9c\x52\xe8\x4d\xf0\x1b\x17\xfb\xf7\x93\x70\x4e\xc3\x77\x43\xb9" + "\x8c\xf9\x24\x7c\x4f\x02\xc1\x98\x35\xb8\xc6\x1f\x0a\x79\x77\xf7" + "\xad\xf1\xb3\xf9\xa1\x4f\x40\xa7\xbd\x1b\xca\x6d\xe0\x77\x43\x97" + "\x38\x54\x92\x1c\xc0\xf4\x8a\x78\xfc\x2d\xfc\x2e\xd8\xca\xe6\x72" + "\x3e\xb6\x39\xb1\xf6\xb1\x11\x65\x2b\xb4\x49\x0d\xff\xcf\xc1\x76" + "\x21\x4d\x20\x9f\x12\x9e\xe7\xee\xd9\xee\xc1\x57\xa9\xea\x75\x95" + "\x9d\xcd\x35\xb4\xc6\x03\x9e\xce\x00\x0f\xbe\x83\xfe\x88\x4c\xf0" + "\x9d\xfa\xf2\x1e\x52\x1f\x76\x9e\x34\xc0\xff\xb8\x97\xd7\xf8\xab" + "\x63\xa4\x4d\x33\xb8\x5c\x07\xdd\x90\x0f\x75\xde\x82\x65\x81\xac" + "\x6c\xc7\xfd\x4f\x26\x18\x11\x35\x58\x30\xd6\x16\x61\x65\xd4\x8b" + "\xed\xa4\x3e\x1d\xc7\x33\xf6\xa5\x0d\xe5\x5f\x91\x86\xb0\xcf\xd9" + "\x77\xd0\xf6\x32\xa6\x9c\x1f\xaa\xec\x4a\x28\xbb\x5a\x2a\xbb\x03" + "\xca\x0e\xf5\x5c\xf6\xd1\xaa\x61\x96\x3d\x8c\x7a\x1f\xad\x18\x4e" + "\xd9\x20\x2f\xd5\xa6\x30\x7e\x2e\x4a\x3f\x89\x04\x3a\x2e\xa2\x2f" + "\xca\x9b\x29\xdf\x4f\xba\xe7\x1c\x3b\x3b\x95\xc3\xf6\xeb\xaa\xd8" + "\x19\xaa\xb3\x84\xed\x09\xe4\xe7\xa6\x8e\x13\xdc\x4f\xd0\x95\xb3" + "\xa7\xc5\x39\x26\xe9\x5b\xe7\x01\x9b\xb0\x86\xef\xd1\xcc\xdf\xa9" + "\xe2\xb8\xda\xf3\x17\x2c\x6b\xf0\x7a\xbc\x1d\xce\xf7\x9f\xd6\xdc" + "\x2d\xcf\x73\x9c\x0f\x78\x3b\x5c\x2a\x4b\xd3\x7f\xfe\x4c\x0e\x72" + "\x99\x98\x9e\x2a\xc7\xcb\x4c\x95\x8e\x6f\x3e\x9e\xf8\x4c\xe2\x8a" + "\xb4\xc4\x04\xcd\xa2\x35\x29\xab\x66\xad\x5e\xbe\x5c\xb3\x20\xf1" + "\xf9\xe7\x97\xfd\x32\x71\x0c\x59\x94\xb2\x6c\xd5\xf3\x2b\x70\x8e" + "\x4b\xa3\x89\xfe\xd7\x25\x49\xab\x53\x67\xdd\x17\x1d\xd9\x6f\x8e" + "\x0b\xcf\xfa\xb5\xa0\xad\x6b\xc8\x84\xfe\xe9\x20\xe3\xd0\xb7\x4c" + "\xf0\x5a\x6a\x7c\x11\xc6\x59\x80\xbf\xd3\xa8\x0f\xa0\xdf\x1e\x45" + "\x1b\x1c\xfd\xda\x81\xfc\xae\x7b\xf5\x65\xda\x78\x82\x7c\xb1\x13" + "\xec\xb7\xe6\xd7\xb8\x8f\xb6\x16\x18\xfb\x5a\x78\x4c\xb7\x2f\x70" + "\x2f\x6b\xcd\xaf\x21\xcd\x12\xf0\x6e\xe8\xa6\xaf\x89\x12\xf4\x0c" + "\xd8\xff\x7b\x63\xa9\x30\x9a\x16\x4d\xa4\x35\xf4\x58\x18\x91\xfc" + "\x4e\x0b\x26\xb3\x0d\xd7\xc3\x55\x71\x76\x03\x45\x79\xca\xfb\xd6" + "\xde\x05\x9c\x2e\xdb\x2b\xf9\xbe\xdc\x2f\x56\xe2\x58\x61\x3d\x8b" + "\xb9\xb7\x17\xfa\x7f\xf5\x6e\xa7\x9c\x6e\x48\x97\x6c\xb4\x66\xa0" + "\xfb\x0b\xad\xf0\xcc\x7d\x5f\xec\xcd\x77\xdf\xeb\xf0\x37\xd0\x7f" + "\x9f\x95\xf1\x0b\x7f\xf3\xd9\x6e\x7e\xe1\xff\xae\xd7\x17\x0b\xf9" + "\xd5\x3f\xfd\x72\x2f\xf9\xfb\xbe\xfe\xde\x14\x39\xf4\xe5\xcd\xf7" + "\x59\xbb\xaf\x61\xfb\x2f\xe7\xf7\xa6\xb9\x43\x5d\x88\x37\xc0\x56" + "\xcb\xaf\xbf\x26\x2a\xc0\xe7\xe6\xe2\xa7\x01\xd3\x87\x49\x58\x86" + "\x9d\xb6\x19\x7e\x41\xc2\xf5\xa7\x08\xc6\x3c\x6b\x4f\x4d\xa7\x6d" + "\xfa\x8b\x68\xfb\x99\x02\x00\xbf\xd5\x25\xad\x44\x5d\xdc\x4a\x42" + "\x1a\x52\x31\xf6\x29\xfa\x9f\x82\xd2\xc0\xd2\x35\xc1\x73\x5d\x9a" + "\x8d\x1c\xb0\x9c\xc3\xfd\x41\xc6\x86\xa5\x20\x77\x5a\x30\x6e\x2c" + "\xad\x51\x2f\x25\xa1\x65\x13\xe9\x6e\x9a\x93\xac\xa4\xc2\xb3\x56" + "\x48\x6b\x7a\x4b\x8c\xf2\x7f\x6b\x5d\xad\x3f\xc6\x87\x6b\x25\xb5" + "\x81\x12\x36\xd7\xf2\x33\x39\x0d\x6c\xbe\x02\xfa\x49\x13\x9f\xbf" + "\x6e\xb8\xc0\xf5\x79\xc3\x5e\x69\x5e\x07\xff\x67\x36\x19\xb4\xa3" + "\x1a\x63\x44\x62\x99\x7f\x16\xab\x59\x8c\xc8\xb7\xd6\x45\xf9\x67" + "\x2c\x23\x42\x83\xf9\x34\xd9\x03\x72\x10\xe3\x0d\x42\xbf\xdb\x01" + "\xfd\xac\x6a\xdb\x44\x5a\x0a\xf5\x2b\x2a\x9f\x48\xf3\xa1\x4e\x95" + "\x5d\x39\xb5\x19\xa0\xb3\x74\xd2\xfa\x86\x11\xfa\xc5\x8e\x62\xc8" + "\x13\xb7\x86\xdc\x5c\x0c\xf9\x4a\x20\x1f\xda\xa3\xbc\x7e\x75\x0f" + "\x00\x0d\x76\xc1\x37\x1b\x35\x4f\xe1\xf3\x3e\x36\x37\x84\xdf\x86" + "\x76\x68\x5a\xc9\xbe\x3a\xd0\x6d\x4a\xfc\x86\xfc\x5d\x28\x1f\xe4" + "\xdf\x1e\xad\xb4\xbe\x5a\xca\xcb\xd9\xa7\xe2\xfd\x75\x67\xd1\x26" + "\x67\x0c\xcf\xa2\xe2\x75\xa0\xd3\x7b\x98\x5f\x46\xf4\x05\xc6\x6c" + "\x0c\x66\x57\x38\x48\x30\x1f\x87\x83\x6d\x91\x04\x72\x00\xec\x09" + "\xb6\x97\x18\x6c\x09\xa8\xcb\x66\x8c\xa3\x89\xef\x61\x7c\xb4\x0b" + "\xf4\x72\x15\xda\x01\x4f\x5d\x78\x84\xe0\x5c\x36\xd8\x03\xca\xe7" + "\x17\x53\x1b\x8f\xf7\xb1\x2f\x49\xb6\x05\x50\x06\xa1\xfe\x2f\x4e" + "\x23\xca\x5e\xe0\x21\x60\xa0\x16\x6c\x8b\x71\xa7\xc9\xbe\xed\x12" + "\xed\x6b\x99\xce\x4f\x63\x7e\x84\xfd\xb8\x8c\xde\xb7\x13\xda\xa7" + "\x86\x6f\xd4\x9a\xc9\x17\x2c\xc6\x37\x97\x31\xfb\x8c\xb2\x1e\xc7" + "\xb1\xa5\x19\xca\xa0\x20\xcb\xa4\x77\xd0\x7e\xe3\x66\xf9\x9b\xf0" + "\x4e\x27\xd1\xac\x0e\x68\x06\x65\xee\x67\xe7\xc9\xad\x60\x2b\x48" + "\xb4\xc9\x40\xbb\x82\xff\x76\x7f\x98\x5c\x2e\x8e\x7f\x45\xb0\x2b" + "\x90\x5e\x48\x27\x28\x27\x43\x92\x63\x4d\xdc\x7e\xa9\x9b\x29\xad" + "\x6b\x97\x02\xaf\x37\x38\xe9\xbf\x7f\xb1\x2b\xfd\xe1\xf7\x1b\xf8" + "\x77\x0e\x1c\x74\xe1\x1d\x8c\x41\x0e\xec\xc0\xf9\x48\xa8\xe3\x6e" + "\x3e\x97\xb2\xff\x77\xe8\xbf\x0b\xfd\x05\x03\x8d\x77\x17\xa1\x6f" + "\x5a\x90\xcd\xeb\xbf\x26\x52\xfc\xd6\x03\xbf\xe3\xf6\xe9\x81\x39" + "\x3c\xc6\xe1\x81\xa9\xf8\xdc\x06\xf5\xe2\xf1\x0d\x0f\xf8\xf3\xf8" + "\x86\xfb\x1d\xae\x31\x5b\x9d\xf1\x5a\xf7\x5b\x9d\xfb\xf9\xf7\x6b" + "\xf8\x38\x75\xbf\x06\xe7\x9a\x58\xfe\xde\x24\xac\x5b\x0b\xf6\x4b" + "\xb9\xad\x18\xbb\x15\xd2\xd1\xf6\x6f\x41\xbe\xc9\xe9\xe8\xd7\x16" + "\xf8\xa4\x86\x6f\x16\x4b\x75\x4a\x82\x67\x15\x7c\x9b\xed\xa3\xc1" + "\x38\xae\x9b\xf0\x37\x7a\xe7\x6f\xb0\xdf\x00\x86\x83\xe1\x37\x1b" + "\xe1\x4e\xe5\xbc\x3c\xbe\xeb\x01\xf5\x6f\x7b\x70\xae\xe9\xc0\x74" + "\x39\xbe\x2b\xc6\x76\x45\x99\x51\xfc\x94\x1b\xed\x91\x36\x3b\x80" + "\x57\x0c\x77\x7b\xec\xd5\x40\xef\x03\x60\xff\xff\x45\xf2\x25\x77" + "\x40\x2d\xd5\xcf\xc8\xe3\x1e\xd4\x44\x97\xff\x46\xf6\x65\x70\xc0" + "\xda\x37\x1e\xea\xb3\x2d\x0f\xa8\x11\x93\x50\x56\x1d\xf2\x1f\xed" + "\xc4\xae\x9c\xba\xf0\x3e\x6c\xb1\xf3\xb2\x07\xca\xd0\xbe\x94\xea" + "\x8f\x78\xc9\x94\x68\x17\xed\xda\xef\x5c\xfb\x39\x94\xb1\x14\xfa" + "\x78\x1f\x06\xe4\x7e\xcd\x71\x50\xff\x3b\xc9\xa6\xc0\xfd\xa2\x8d" + "\x50\xae\x11\x6d\x70\xae\x57\xeb\x93\xf6\xb4\xd8\x71\xae\xba\x09" + "\x9e\xa1\x7f\xd7\x47\x9f\x1f\xf3\xd7\xfc\x0d\x4c\x6e\xd4\xc1\xf8" + "\x67\x36\x9b\x3f\x47\xba\xc8\xfd\x75\xd3\x53\x38\xf6\x8b\xe4\x7d" + "\x36\xbd\x8d\x34\xd8\x3a\x88\xb4\x57\x1e\xfa\xec\x71\x5c\xa3\x3c" + "\x0d\x18\x52\x61\xff\x05\xfe\xee\x40\x1f\xc8\x40\xc7\xc6\x0d\x2f" + "\xb3\x7e\xab\xc6\x7e\xdb\x8b\x3e\x18\xe0\x3b\x35\x4b\xa3\xc8\x9e" + "\x74\x23\xeb\xc7\xe8\x5b\xe3\x55\xa0\x1d\xc6\x52\xed\xca\xa9\x8f" + "\x94\xf7\xf8\x22\x46\xd0\x97\x86\x84\x93\x74\xec\xcb\x12\xed\x94" + "\x90\x2f\x5e\xee\x7b\x2e\xfc\x67\x79\xfa\xf5\xb7\x60\xde\xdf\xea" + "\xf3\x65\x5a\xdb\x59\x3f\x3e\x30\xdd\x0e\xfd\xd8\x95\xa6\x48\x4f" + "\xa4\x2b\xe4\x85\xf6\x7f\x52\x27\xd3\xd4\x49\xcf\x86\x19\x12\xcf" + "\x1b\xf9\x5c\x4e\x7d\xbb\x34\xcf\xd3\x47\x43\x09\x7f\x4d\xd8\xa7" + "\xd6\x63\xdb\x41\x37\xe0\xf7\x11\x23\xaf\x4a\x32\xab\xc6\x82\x18" + "\x69\x80\xfe\xff\xe3\x7c\xa7\xec\x38\xa0\x65\x63\x16\xe0\x13\xe7" + "\x4f\xc3\x8f\x99\xbf\x8a\x41\x64\x87\x99\xd4\x85\x38\xe5\x53\xc3" + "\x52\x99\x0e\x32\x26\xe5\x7e\x0f\x65\xbc\xe9\x2e\x7f\x1a\x5e\x82" + "\x32\xc6\xa3\x7c\x73\xda\x50\x0d\x15\xee\xf2\xad\x21\x1f\xe5\x1b" + "\xe2\x5a\x97\x86\x73\x59\x0d\x92\xef\xeb\xda\x48\x77\x99\x54\x3b" + "\x83\xaf\xc1\x73\x9b\x0b\xb1\xa5\x7b\x8a\xe7\x47\x1d\x06\xf9\x59" + "\x9c\x12\x49\xe7\xa5\xa3\x8e\x83\x34\xd9\x17\x76\x0b\xe4\xaf\xc1" + "\x73\x87\xe8\x6b\x60\x6c\x0b\x1f\xeb\x81\x9c\xde\x8d\x3e\xa5\xcd" + "\xe4\x6f\x2d\x0d\xd0\x0b\x7b\x73\xb9\xec\x96\x65\x05\x7d\x26\x7e" + "\xec\x0b\xed\x24\x40\x77\x1f\x3d\x06\x3a\x1b\x7d\x0b\xda\xd0\xaf" + "\x21\x94\xad\x39\x41\x3e\xdb\x08\xdf\x0d\x95\xee\x61\x70\x5f\x09" + "\xf7\x49\x70\x7f\x02\xee\x53\xe0\x7e\x2f\xe4\x17\xa5\xfc\x91\xf0" + "\x3c\x03\xd2\xff\x55\xba\x43\x1d\x4d\xbb\xe0\xbe\x50\xb2\x1d\x21" + "\xfd\xd3\x6e\x7c\x86\xfb\x29\x89\xe7\x75\x9c\xe7\xa6\xa3\x50\x4e" + "\x3a\xd4\xbf\xd9\xd4\xc2\xca\xd2\x41\x9e\x37\xb0\x6c\x3c\x07\x0c" + "\xff\xff\xc2\xc5\x06\x85\x72\x1a\x0b\xe0\x3e\x07\xee\x0b\xe0\x9e" + "\x0a\xf7\x5b\x24\x1a\x34\xa2\x6c\x48\x48\x67\x34\x9f\xa7\xe1\xf6" + "\xee\x42\xb9\xcf\xa3\x1e\x76\xca\x8e\x7d\x19\x09\x8b\x39\xbf\xcd" + "\xa4\x9e\xe1\x00\xf2\x3e\x80\x79\xe1\xfe\x90\x74\x8f\x92\xee\xf3" + "\xa5\xfb\xc3\xd2\x3d\x5a\xba\xc7\x98\x49\xe3\x74\xc9\xc6\x00\xba" + "\x34\x4e\x67\xfb\x8b\xf2\x77\x46\xf3\x6f\x7c\x1a\x8d\x63\x64\x90" + "\xe3\x77\x41\xf9\x7e\x5d\x39\x8d\xd5\xf2\x3c\x24\xce\xf9\xf4\xe6" + "\xd4\x2c\x79\x95\xad\x1f\x37\x36\x3a\x65\xdb\x3b\x6d\x6a\x45\x14" + "\x01\x1b\x68\x42\x99\x00\xfa\x9f\x97\xa3\x15\xa4\xf5\x57\xc9\x5f" + "\xbd\x1f\xfa\x70\x63\xe3\xa1\x80\x6e\xdc\xab\xde\xc2\xe6\x68\xd1" + "\xdf\x58\xc0\x3b\xed\x70\x59\x2d\x01\xef\xd8\x64\xf9\x8d\xe3\x1e" + "\xc9\x37\xe4\x87\x5d\x39\x9f\xce\x73\x8e\xd5\x1b\x3b\xf8\x5a\xd5" + "\x4d\xb7\x40\xfa\x22\x97\xf4\x4a\xac\x33\xd0\xb3\x19\xda\x33\xa7" + "\x95\x7c\x9a\x01\xf7\x7f\x69\xe3\x6d\x8e\x94\xdb\x2c\xf1\x43\x27" + "\xd3\xb7\x8d\x34\x46\x80\x2c\x4c\x41\x0c\xb7\xf6\xc9\xd9\x46\x76" + "\x26\x4d\xc2\x08\xf0\xd2\x84\x3e\x30\x0d\x2e\x7d\xd0\x55\x06\x85" + "\x42\x3d\x5a\xdc\x65\xca\xbe\x16\x94\x29\x88\x0d\x90\xdf\xc0\x6b" + "\xd3\xee\x7e\xfd\x2f\x1f\xfb\x1f\xef\x77\x9f\x85\xb9\xff\xb6\x21" + "\xdf\xce\xfb\x5d\x33\xe0\x0c\xf0\x69\x2a\x43\xfe\x98\xc9\xa7\x36" + "\xa9\x4f\x37\x43\x9f\xbe\x0b\xd2\xa5\xd8\xc0\x3c\x5d\xfa\x16\xe0" + "\xcc\x84\xed\x9e\x22\xa7\x4b\xed\xc5\x72\x52\x91\xdf\x72\xba\x54" + "\x3e\xe0\xd1\x94\x8c\xfd\x44\x4e\x97\xda\x04\x76\xd4\x67\x55\xb2" + "\x3c\x29\xe2\x78\x9b\x2b\xff\x0e\xf9\x86\x7e\x9d\xf8\x5c\xfa\x67" + "\x65\xd0\x57\x2b\x50\x3f\xac\x7f\x8a\xa8\x5f\xd8\x42\x02\x79\xbf" + "\xc4\x31\x85\xab\x8c\x3c\x98\x49\x73\x82\xed\x54\xf5\x8e\xb9\xde" + "\x3e\x47\xb6\x57\xcb\xba\x72\x3e\x0f\x93\x63\x09\x3b\x7d\xdf\x7f" + "\xbe\xa0\xbe\xa2\x8f\xbe\x50\x97\xcf\xe7\xc9\x75\x71\xd1\xcf\x8c" + "\x07\x58\x37\x2c\x6b\x3d\xd8\xeb\x56\x90\x0b\x5c\x6e\x7f\x9e\x2c" + "\xc7\x58\x2f\x91\xf4\x16\x8b\xf3\x9d\xc6\xe3\x7c\xa3\x6e\xc4\xbd" + "\x34\x22\xce\x63\xa5\x3b\x48\x83\x0e\xc6\xf2\xe9\xc7\xc9\x92\xb5" + "\x63\xd0\x77\x49\x3c\xd4\x75\x19\xd4\x6d\xbb\x03\xe7\xd8\x57\xe1" + "\x38\xf5\xe0\x04\x47\x1a\xb5\x49\x34\x83\x7e\xd4\xd4\x2d\xd1\x16" + "\xe5\xd7\x76\x94\xe9\xeb\xf5\x3c\x8e\x0d\xce\xe5\x60\xff\xf8\x2d" + "\xea\xb1\x30\x6a\xab\x29\xc3\xbe\xf2\xb9\x5d\xb6\x49\xa1\xbe\x15" + "\xdc\x26\xac\xff\x19\xf3\xed\x93\xff\x8e\x99\xcf\x05\x36\x15\xf0" + "\xb6\x37\xe9\xf8\x7a\x32\xf3\xdb\x88\xcf\x8b\xfd\xc2\x26\xe6\xf1" + "\xfd\x4f\x35\xeb\xf8\xde\x8d\xa6\xd8\xbe\xbd\x1b\x4e\x5b\x31\x95" + "\xfb\x5d\x6a\x4a\x72\xf6\x89\xa6\xb9\xf8\x3b\xf8\xfd\x2b\x90\x9e" + "\xe5\x4c\xaf\x8f\xe7\xf6\xc0\x3b\x6d\x41\xd9\x51\xb8\x87\x6b\x02" + "\xfa\x7f\x96\xbe\x67\x66\xdf\x67\x73\x1e\xd0\x37\xa5\xfe\x8b\x74" + "\x46\x9d\xcd\xfa\x30\xf4\x5f\xec\xc7\xbd\x05\xef\xb4\xc3\xc5\xfb" + "\x2d\xd7\xcd\xa9\xac\xdf\xb2\x3e\xdb\x64\x71\xa9\x47\x25\x9b\xf7" + "\x42\x7e\xbe\x18\xa6\xee\xca\x39\xa8\x06\x7b\x55\x8a\x93\xf0\x39" + "\xdb\x7f\x8c\xfe\x39\xec\x17\xa9\x05\xd7\x90\x71\x4d\x11\xcf\x38" + "\x05\x03\xba\xd1\xa7\x86\xbc\x26\xbc\xa0\xc3\x40\x1d\xb8\xbe\x73" + "\x91\x5a\x4b\xfb\xfc\xcf\x1f\x8c\x77\xfa\xc7\xf9\xbc\x5a\x6a\x97" + "\x19\xbe\x55\xc6\xf7\x5c\x7d\xfe\x06\xb7\xa9\x3e\xaf\x44\x9c\x9a" + "\x00\x7b\x70\xdf\xc2\x63\xa9\x1e\xdc\x2c\x63\x0f\xfa\x65\xc2\x09" + "\xf2\xc5\x8c\xcd\x13\xe9\x16\xe0\xe9\x16\xe8\x4b\xc9\xf0\x3c\x0e" + "\xee\x09\xfc\xae\x08\xc1\xbb\xd4\x47\xb6\xc0\x6f\x1b\xe5\x98\xd7" + "\x48\x1b\x6b\xc0\xd1\x46\xc4\x59\x09\xd0\x01\xb1\xc6\xd6\x6b\x75" + "\x3c\x96\x3c\xe2\x0c\x31\x16\x9c\xfd\x08\xc3\x19\x3b\xbf\x0f\xe9" + "\x58\x5f\xc4\x59\x57\xce\x17\xe1\xb2\xef\x59\x33\x39\x68\xe4\xeb" + "\x26\x5f\x44\xca\x7b\x56\x71\xcd\x26\xf5\x16\x32\x01\xca\xd5\xd4" + "\x68\x98\x7f\xc7\x23\x26\xfb\x7c\x82\x79\x71\xbd\x8b\xcb\xc9\x9b" + "\x52\xe1\x37\x09\x4e\x9a\xef\x63\xfb\x36\xf6\x2c\x66\x73\x91\xdf" + "\x81\x77\x59\xae\xe3\x0c\x33\xd9\x1b\x8b\x63\x0d\xdc\x43\x77\x5b" + "\x28\xc1\xd8\xf4\x20\xc7\xbe\xd8\x2e\xdb\xb5\x77\x86\xe2\xba\x79" + "\x8d\x0d\xea\x87\x63\x68\x68\x6b\x4d\x1b\x8c\x25\x6b\x3d\xcc\x19" + "\xcf\xc1\xb9\x1e\x29\x66\x4c\x0b\xce\x63\xa1\x8f\xfd\x13\xe4\xab" + "\x19\xf5\x5b\x80\x9f\xab\x07\xfa\x1e\xd6\xa7\xd3\x0b\xe8\x7f\x58" + "\x93\x42\xbe\xd3\x4a\xbe\xc2\xf1\x60\xb3\xe1\x1c\xce\xd1\x7c\x19" + "\xe1\x3e\x47\xf3\x65\x86\x74\x95\xc2\x65\x75\x5e\xcd\x1b\xa4\x3b" + "\xb9\xc4\x55\xc6\xf3\x36\x57\xc2\xb5\x4b\xa2\xd5\xae\xae\x9c\x2f" + "\xfb\xe6\x7f\x11\x97\xd8\xb7\x71\xbf\x04\xce\x39\x29\xec\x04\x7d" + "\x77\x00\x9f\xa0\xde\xeb\x6f\x7f\xdc\xb8\x0e\x71\xf4\x25\x8b\xe1" + "\x88\x7e\x71\x87\xb7\x67\xe7\x4b\xc6\x4f\xee\xa3\xf2\xcb\x0d\xf0" + "\xed\x9a\x4d\x67\x89\x52\x97\x42\xa6\xe2\xfc\x77\xb0\x83\x1a\x71" + "\x8c\x8b\x98\x78\x8d\xc5\x6a\x69\xde\x98\x9a\x49\x04\x78\x7f\x33" + "\xfc\x9f\x2a\xdb\x49\xf0\x9b\x10\x3f\x1b\x09\x45\xfb\xe8\xa1\x4c" + "\x72\x73\x57\x4e\xf3\x42\x99\x57\x68\x43\xe0\x3c\x9c\x34\x97\x80" + "\x75\x65\x7b\x13\xd1\x77\xba\x99\xd1\x8d\xc9\x61\x2c\x03\xfa\x5d" + "\xf3\x3c\x3f\x2b\x09\xe1\xba\xa7\x19\xf0\x5f\x23\xd9\x8c\xcd\xf1" + "\x80\xfd\x26\x97\x7a\x5e\x74\xfe\x1f\xf6\x03\xfc\x7d\xb0\x15\xed" + "\x33\x4f\xf4\x69\x3e\x2a\xd3\x07\xf7\x85\x06\xc3\x38\x81\xf1\xdb" + "\x4e\x3b\xa0\x6e\x75\xba\x75\x44\x75\x9a\x1c\xfa\xf4\xb5\x97\xd9" + "\x39\xb5\x5a\x3e\x3f\x7f\x68\xaf\x3c\x0e\xe7\xf5\x3e\xf4\x52\x70" + "\xb6\x1f\xc1\x79\x75\xf4\x17\xc6\xf6\xd4\x7d\x13\xc6\xe6\xd2\x4d" + "\xf6\x79\xc4\xa8\xbf\x07\xf3\xc8\x76\x55\xcb\x79\x43\x18\xd9\x13" + "\x36\x0f\xfa\xf1\xa1\xc5\x66\xc5\x7b\x9a\xe1\xef\x5d\x3c\xb4\x58" + "\xa2\x6f\x1d\x5f\xf3\x3f\x34\x0b\x75\xc9\x06\x29\x36\x3d\xea\x68" + "\x28\xbb\x5a\xee\x37\xa0\x37\x6a\xe0\x37\x11\x5c\xc6\xe0\x3a\xeb" + "\x21\xe6\x5f\x84\x8d\x1b\x78\x7e\x35\x9f\xf3\x3f\xd4\xd1\x67\x4b" + "\x43\x3e\xfc\x1d\xdf\x0b\x76\x88\x2c\x71\x28\x80\xa6\x87\x58\xdb" + "\x38\x16\xc3\xe6\x75\xe5\x7c\x15\xee\xec\xb7\xcd\x4c\x36\xef\xe9" + "\x70\xed\x97\x5f\xcd\x73\x8e\x37\xbf\xb0\xcc\xda\x4c\x34\x83\xf5" + "\x43\x5d\x10\x09\xf9\x87\x8a\xfc\x64\xd3\x26\x5a\x51\x2a\x88\x0f" + "\xae\x2f\x21\x6a\x45\x11\x90\x0d\xfb\x59\xda\xd2\x09\xd0\x1f\x3f" + "\x08\x56\xdf\xb4\xf0\xa1\xd4\xd1\x54\x1f\x46\x84\xe2\xce\xd1\xaa" + "\x5b\x6c\x37\x55\x50\xbf\xdb\x1f\x5f\x90\x6a\x23\x9a\x5f\x95\x92" + "\x93\xc9\xc4\xef\x21\x07\x7c\x5b\x4d\x74\x66\xd2\x52\x8b\x67\x2e" + "\xf7\xa8\xd1\xfe\x68\xa9\xc5\x32\x33\xca\x88\x2a\xa3\x8d\xb6\x17" + "\x2d\xf7\x57\x81\x3e\x08\x79\x15\x30\x36\x56\x7d\x53\x45\x2f\x94" + "\xf1\xf1\x52\xf6\xbb\x41\xf7\xd6\x0c\x5d\x37\xdd\xc4\x13\xe4\xef" + "\x3f\x1b\x5e\xdd\xbe\x4e\x72\xd6\xed\xeb\xa4\x11\xae\x5b\x88\xb3" + "\x6e\x49\x58\xb7\x0b\xc3\xab\x9b\x59\xe5\xac\x9b\x59\xe5\x65\xdd" + "\x76\x0c\xbf\x6e\xe9\x37\x9d\x20\x2d\x2f\x0d\xaf\x6e\x47\x2b\x9d" + "\x75\x3b\x5a\x79\x39\x75\xc3\xb1\xbc\x3e\x9c\x1e\x67\x3e\xce\x53" + "\x88\x1a\xf7\xc8\x9d\x20\x87\xcf\xe9\xcb\xd8\xf3\x78\xf8\xff\x4d" + "\xa9\x7f\x5b\x0c\x56\x7a\x8c\xdb\x39\x87\x27\xcd\xd6\xe1\xbe\xd2" + "\xc3\x21\x80\xe5\x5a\x8e\xe9\xaf\xd9\xde\x4e\x83\x85\x4a\xfb\x3a" + "\x0f\xdf\x5d\xce\xf6\x7d\xbc\x2f\xc5\x92\x3d\x9c\x71\x7e\xcc\xbb" + "\xe1\xb8\xe7\x42\x84\xfe\x4c\xc7\xbc\xab\xc5\x98\x8f\x6f\xa5\x58" + "\x04\x9a\x83\xbe\xb7\xd0\x5f\x9e\x92\xd0\xc2\x77\xe7\xbe\x95\x62" + "\x13\xd0\x67\xc6\x7a\x76\x5e\xf6\x70\xaa\x7c\x46\x4c\xfe\x86\x25" + "\xe0\xfd\x48\x48\x2f\x92\xe3\xcc\x52\x01\xed\x99\x77\x35\x58\x3e" + "\xa4\x6f\x97\x63\xc1\x9a\xc9\xe1\xb9\x92\x6c\xb0\x06\xdb\x86\x92" + "\x7b\x87\x0f\xc9\x72\xef\xa1\x54\x12\x8c\xb1\x12\x37\xe9\x47\xe3" + "\x9a\x23\xd8\x3f\x87\x93\x90\xee\x71\xd6\xd1\x34\x38\x83\xf8\xe1" + "\xd9\x38\xdc\x0b\x67\x0a\xb3\x90\xe9\x19\xc4\x3f\x2e\x1d\xca\xb4" + "\x91\xa5\xc1\xe9\x50\x1e\xd0\x9a\x8f\x0d\xbe\x66\x73\x7c\x9b\xa1" + "\x3c\x5c\xff\xf6\x4b\x25\xea\x87\xc2\x0c\x74\xfd\x56\xa2\xc4\x73" + "\x74\x78\x1e\x8e\x9f\x85\x1b\xa5\xea\xca\xf9\x7a\x91\xdc\x3e\x2f" + "\xf8\x13\xc4\xf9\x73\xe4\x25\x27\x7f\x8e\x2c\x18\xc8\x9f\xaf\xdf" + "\xe3\xfc\xf9\xba\xca\xc9\x9f\x23\x56\x77\xfe\x7c\x7d\xc8\x9d\x3f" + "\x47\xc2\x7d\xe3\xcf\x91\x50\x27\x7f\x8e\x58\x9d\xfc\x39\x12\x31" + "\x38\x7f\x8e\x44\x3b\xf9\xf3\x75\xb3\x77\xfc\x39\xb2\xd6\x33\x7f" + "\x8e\xa8\x86\xe0\xcf\xa8\xc1\xf9\x73\x64\x9f\xf7\xfc\x39\x62\x1d" + "\x06\x7f\x02\x39\x7f\x8e\x7e\xdf\xc9\x1f\xf3\x99\x81\xfc\x31\xff" + "\x8c\xf3\xc7\xbc\xd0\xc9\x9f\xa3\x9b\xdd\xf9\x63\x5e\xeb\xce\x1f" + "\xf3\x6e\xdf\xf8\x63\xde\xe5\xe4\x0f\xff\x06\xe7\x8f\xb9\x6e\x70" + "\xfe\x98\xdb\x9c\xfc\x31\xa7\x7b\xc7\x9f\xa3\x93\x3c\xf3\xc7\x5c" + "\x39\x7c\xfe\x1c\x5d\xd1\x8f\x3f\x21\x9e\xf9\x73\x74\xf3\x30\xf8" + "\x13\xcc\xf9\xd3\xfa\xa9\x93\x3f\xad\xc5\x03\xf9\x73\xb4\x9b\xf3" + "\xe7\xa8\xc5\xc9\x9f\x63\x73\xdc\xf9\xd3\x3a\xc9\x9d\x3f\xad\x8b" + "\x7d\xe3\x4f\xeb\x22\x27\x7f\xf8\x37\x38\x7f\x5a\x93\x07\xe7\x4f" + "\xeb\x06\x27\x7f\x5a\xc3\xbc\xe3\x4f\xeb\x7b\x9e\xf9\xd3\x1a\x33" + "\x04\x7f\x46\x0f\xce\x9f\x63\x01\xde\xf3\xe7\xd8\x9c\xa1\xf8\x33" + "\x3c\x5b\xef\x18\xf3\xa1\x35\x02\xe5\x78\x8e\x0f\x0c\xb4\xc3\x7d" + "\x7e\x62\xce\xb1\xd2\x72\x71\x94\x8a\x9f\x85\x38\x16\xa3\x59\x47" + "\xee\x6f\x25\xc7\x0e\x97\x8b\xfe\x2a\x9a\xb3\x3d\x41\xcc\xf9\x83" + "\x9a\x66\x8f\x52\x8a\xd9\xa3\x95\x78\xb6\xd9\x73\xec\xe9\xb6\x7b" + "\xfd\x26\x91\x69\x78\x3e\x6d\x3d\xd8\xcb\xf8\x7f\x57\x4e\x5b\x0c" + "\xd8\x82\x45\x43\x9d\x93\xc2\xbd\x4e\x7b\x36\xe0\xf8\xb6\x2d\xb5" + "\xcf\xaf\x44\x0e\x4d\x47\xff\x5c\xba\x5b\xf1\x3c\x43\x5b\xd9\x66" + "\xe6\xef\x69\x67\x4d\xd4\xad\xf4\x08\x8e\x3d\x4e\x90\xe3\x5b\x69" + "\xc1\x4e\x8c\xd7\x68\x05\x5b\xfd\x3b\x90\xa7\xad\x6f\x1f\x1c\x8d" + "\x7f\x45\x9a\x23\xd4\xf1\xbc\x27\x03\x20\xaf\x0e\x63\x63\x3e\xaf" + "\xc7\x98\x8f\x27\xce\x81\xed\xfb\x5d\xfc\x06\xfa\x1e\x7a\x0d\xee" + "\xb8\x4f\x86\xef\x81\x3c\xce\xce\xae\xa2\x5f\x43\xbe\xe7\xec\xc4" + "\x21\x19\x77\xf0\x9d\x31\xf0\xfc\xb1\x64\xcf\x63\xfe\xb1\xf0\xfc" + "\x86\xcb\x7b\x35\x3c\x17\x43\xd9\xe3\xa4\xf7\x81\xf0\xfc\x1c\xda" + "\xd9\xcc\x4f\x46\x49\x96\xb4\x57\xf7\xc4\x22\x48\x0b\x91\xf2\x8c" + "\x83\x3c\x77\xa3\xed\x2e\x95\x31\x1e\x9e\xa7\xe2\x18\x58\x7a\x1f" + "\x0a\xcf\xe8\x57\x4a\x29\xbd\x9f\x00\x75\x3c\x0e\xcf\xdf\xe3\x67" + "\x4b\x7a\xa5\x3e\x7a\xbc\xca\xb7\x33\xd7\xc7\xb9\x2f\x2e\x81\xcd" + "\x05\xc1\x58\xe0\xb8\xcb\xfe\x9f\xe3\x5b\xdc\xdf\x9d\x08\x75\x79" + "\x97\x2f\xbf\xe3\x7b\xd4\x4e\x44\xba\xbc\x4b\xef\xf7\x2e\xd6\xe5" + "\x5d\x52\xbf\x32\x93\x5c\xde\xc5\xf7\xfb\xdd\x06\x97\x77\xd1\xfd" + "\xde\x55\xb8\xbc\x9b\x23\xbd\xf3\x83\xf4\x6a\xe7\x1a\xde\xf1\xe9" + "\x52\xba\x00\xe9\x8d\x2e\xe9\xa1\x52\x3a\x7e\xbf\xdd\x4c\xfe\x23" + "\x41\x4a\x67\xbc\xe7\xe5\x9f\x24\xce\xf2\xdb\xda\xf8\x1c\xc7\xc9" + "\xd0\xbe\xbd\x73\x63\xde\x4d\x17\x7b\xe3\x5f\x81\x77\x75\x88\x2b" + "\x57\x6c\xaf\x4a\xd3\x3c\xbd\xe6\x97\x9a\x94\xc4\x54\xdc\xbe\xb2" + "\x72\x45\xaa\x66\xe5\xea\x84\x44\x37\x3f\xe5\xa1\xe8\xb3\x0f\xe3" + "\x7c\xa1\xef\x13\xc9\xa7\x7e\x7b\x5f\x1c\x0a\x90\xab\xf0\xad\x2c" + "\x33\x89\x66\xeb\x63\x9b\xb9\x3f\xef\x5a\xf4\x9d\xc2\xfd\xa4\x90" + "\x47\x5a\xc9\xc9\x8d\x92\x9f\x14\x23\xe4\xdd\xe1\xd9\x4f\xca\xa9" + "\x7c\xe6\x1f\x10\xf2\x71\x3f\x29\xa7\x8a\xa0\x9f\x3f\x44\xc7\xf0" + "\xb8\x12\x3c\xde\xd6\x49\xd9\x36\xb1\x2c\xe9\x66\x3e\xf6\xb2\xf8" + "\x5c\x46\x7f\x7f\xa7\x3b\xb7\xe3\xef\xa4\xf5\xd2\xed\xce\xdf\xb7" + "\x87\xf1\xf7\xb2\x7e\x90\xbe\x99\xbf\x13\xcf\x8f\x8e\x69\x85\x67" + "\x36\x7f\xcf\xde\xb5\xf3\xb9\xbc\x82\x9d\x3b\xb0\x4d\xd8\x6e\xf7" + "\xb6\x09\x3f\x6d\x25\xed\xcb\x9c\x6d\x6b\xcf\x77\xf1\xa5\x26\xb5" + "\xa1\xbd\x8a\xf7\xd1\x01\x6d\x65\xfb\x13\xa9\x6a\xe7\x0e\xfc\x36" + "\xca\x33\x7e\x66\x00\x9e\x0b\x76\x56\xca\xf5\x71\xa9\xdf\x0e\x1c" + "\xd7\x43\xfd\x8a\x39\x4d\x40\x7e\x00\x4f\xa5\x36\x2c\xa0\x39\x27" + "\x23\xd9\x1e\x78\x3c\x6b\x8b\x71\x42\x98\xae\x3a\xd5\x17\xff\x07" + "\x75\x14\x9f\xc3\x3c\xe5\xb4\xff\xd0\xc7\x55\x81\xac\xbf\x4e\xb9" + "\xd8\x7f\xfc\x9b\x90\x16\xef\x8a\x21\x97\xef\x6d\xc4\xef\x41\x3e" + "\xc2\xf7\xdd\xef\xac\xc4\xfe\x6e\x26\xed\x35\xb8\x17\x13\x7f\x8b" + "\x75\xf4\x14\x1b\xce\x93\x0f\x42\x27\x1d\x4f\x35\xca\x74\xdc\xcc" + "\x62\x14\x9d\x32\xcb\xf3\x75\xec\xdc\x0f\xe4\xd9\xdc\x17\x2b\xf9" + "\x34\xf3\x63\x4e\xf3\x7b\xe6\xde\xa9\x26\x4b\x39\x6d\x4f\x4f\x40" + "\x19\x8f\x7d\x86\xcb\xfa\xd3\xa9\x12\xcf\xa5\xbd\x62\xa7\xef\xc5" + "\x74\xe7\x3e\xf7\xd3\x9b\xe5\x7c\xb2\x5c\xe6\xeb\x55\xa7\x57\xb2" + "\x7c\x3c\x7e\x6d\x08\xe7\xf9\xf7\x42\x5a\xc9\xe9\x2c\x29\x3f\xf7" + "\x8f\xca\xfc\xdf\x9c\x2e\xa3\x05\xef\x87\x74\xe5\x9c\x86\xf1\xcf" + "\xc9\x18\x4e\x47\xfe\x5d\xb8\x67\x61\x5d\x90\x46\x78\x46\x9b\x16" + "\xf4\xcc\x05\xfe\xa8\x06\xd5\x73\x7c\xff\xf4\xcd\xa7\x49\x07\xb7" + "\x21\x04\x6a\xc3\x39\x56\xde\xd6\x8e\x49\x2e\x7b\x8c\xd5\x72\x1e" + "\x2e\xbb\xd9\x3b\xb6\x77\x5b\x97\x86\xf3\x41\xd2\xbb\x34\x3c\xc7" + "\xda\xf7\xff\x28\x97\xff\xfd\xf1\x7f\x9a\x46\xab\x36\xad\x63\xba" + "\x55\xe9\x3c\x23\xdf\x11\x06\xcf\xea\x7e\xcf\xa1\x6e\xcf\x6b\x49" + "\x38\xdb\x7f\x6b\xa5\x6d\x6c\xaf\xb6\x94\x2e\x95\x1d\xc0\xea\x93" + "\x46\xe7\x02\x36\xaa\xf1\xcc\xb3\xd4\x0f\xab\xf1\xac\x74\xb0\xfd" + "\x17\xec\x9c\x34\xbc\x9f\x23\xdd\x23\xa5\x7b\x04\x8f\x1d\xfa\x0f" + "\x97\xf8\xdf\x38\x47\xf3\x0f\xb3\xa7\x78\xe4\x72\xbc\x76\x39\x1e" + "\x39\x9e\xb3\x96\xe2\xa7\x2e\xee\xca\xe9\x08\x1b\x2a\xf6\x3b\xbc" + "\x9f\x2b\x9f\x99\x76\xe4\xef\x5c\x2c\xe6\xb7\x6e\xc1\x58\x95\xe8" + "\x67\xcb\xd0\x81\xbe\x56\xac\xc4\x44\x7a\x88\x29\xb5\x2b\x0b\xe3" + "\x55\x36\xd8\x98\xef\x62\x3c\x6b\xaa\xc0\x79\x73\xb4\x1d\x1b\x74" + "\x67\x58\xac\xca\x17\x3a\x48\xb8\xee\x3e\xda\x06\x34\x28\x73\x14" + "\xec\x5c\x2c\xe1\x68\x2b\xe8\xc0\x69\x40\x0b\x36\x5f\xcc\x62\x2d" + "\x77\xb0\x75\x2f\xd5\x09\x72\x26\x82\xe5\xa1\xf1\x5b\x39\xed\xce" + "\xb0\xb9\xaf\xd7\x72\xe4\x78\x84\x1d\x7d\xf1\x8f\xcd\xe4\x4c\xe4" + "\x85\x80\x0f\xd2\x21\xad\xdd\x7d\xcf\xf4\x19\x56\x26\xd6\xdd\x4c" + "\x3a\xb6\x63\xd9\x5d\x39\x67\xd4\x7d\x7d\x16\xd2\x5f\xb0\x93\xc9" + "\x50\xaf\x13\x72\xf9\xf0\x1e\xfa\xff\x69\xd6\x97\xb0\xcc\x0b\x05" + "\xc7\xa0\xdc\x33\x51\x66\x61\x43\x33\xdf\x73\x7d\x06\xf4\xdf\x7f" + "\x56\x0f\x65\x03\x41\x5f\x88\x82\xbe\x14\x23\xe6\xbf\x3f\x97\xfb" + "\xc2\x7e\x3f\x8a\xcf\x31\x9e\xd9\x8a\xfb\xba\x36\x5d\x24\x4a\xdc" + "\x03\xc1\x31\x7b\x86\x9f\xef\x81\x34\x90\xd5\x95\xd0\x47\x98\xad" + "\x38\x3c\xbd\x7f\x86\xf9\xf8\xd9\xd4\x49\x54\x25\x29\xb2\x2f\xef" + "\x33\x56\x97\xf8\x03\xd2\xf9\x92\xb3\x53\x71\xa5\x7c\x53\x0f\xaf" + "\x63\xff\x3a\x60\x7d\xa1\xac\x2d\x1e\x6d\x4c\xd5\xfb\x73\xd9\xfa" + "\x4c\xe1\xbb\x31\x7c\x8f\xea\xd9\x44\xbf\xb0\x29\x2f\x77\xe5\x9c" + "\x5d\xda\x17\x77\x01\xf2\x94\xe0\xde\x7b\x28\xbf\xaf\x9d\x29\xf8" + "\x8d\xb3\xf9\xbc\xaf\x9f\x2d\x13\x0b\xde\x47\x7f\x08\x4a\x29\xbd" + "\xac\xc1\x6e\x43\x1f\x0b\x83\xfa\xa9\x62\xf1\xdc\x70\x4f\x78\xe1" + "\xfb\xe8\x23\xcc\x7a\xa7\x4d\xae\xf3\x37\x65\x78\x2e\x04\xeb\xcc" + "\x69\xfb\xcd\x4b\x32\x1d\x8b\x3b\xa1\x6c\xfd\x57\xa4\x8d\x7c\x33" + "\x09\xf7\xcd\xe1\x39\x27\xec\xc3\x9c\x06\xdf\xb0\x31\x1f\xfb\x3e" + "\xcb\x73\x96\x8d\xfd\x59\x6c\x1d\x28\xbf\x9c\xc5\x07\x83\x36\x00" + "\x2f\x8c\x7a\x3c\x5b\xff\x0d\x3b\xe3\xb3\x3e\x85\xf0\x76\xb3\x7d" + "\xb2\xdf\x48\xeb\x24\xdf\xc4\xcb\xba\xc2\x2c\xa5\x6d\xc2\x6f\xa7" + "\xf5\x90\xb3\xe4\x9b\xbb\x31\xee\x37\xd0\x23\x06\xfd\xbb\x35\x58" + "\xa1\x9f\xa4\xf7\x20\x16\x62\x30\x9e\x24\xe4\x9f\xcb\xf5\x1b\xd2" + "\xfc\x9b\x70\xfc\x3e\xd2\x16\x78\x67\x01\x9a\x6e\x87\xb2\x77\xc9" + "\x34\x2d\x99\x88\xe3\x9d\xb3\x8d\x43\xe9\x06\x07\xd4\xb9\x01\x38" + "\x67\x9c\xfc\x15\xd4\xcf\x92\x29\x8e\x79\x7f\x2e\xee\xc9\x86\xff" + "\xa5\xb3\x69\x9c\x77\xbc\x2f\x59\x9e\x80\x6f\x98\x70\x7f\x03\xca" + "\x4a\xf4\x41\x06\x6d\xb2\x4b\xf4\x63\xf1\x18\x4a\xd3\x38\x1d\xa4" + "\xfc\x55\x7c\xbe\x78\xca\xc1\xae\x1c\x4b\xac\x73\xbe\xd8\xc2\x74" + "\x37\xe2\xad\x9c\x8d\x09\x2d\x49\x2e\x75\xb6\xb2\x73\xa6\x9d\x38" + "\xd7\x67\x09\xc1\x6f\x15\xa3\xff\x2d\xc4\xc5\x69\x57\xfc\x7f\x73" + "\x0e\xeb\x89\x7b\x7e\x1d\x01\xef\xc6\x80\xbe\x8d\x45\x3a\xc3\x6f" + "\xb4\xd0\x17\xe6\x0e\xa1\x0b\x59\x2c\x38\xf8\x66\x8b\xac\x0b\x61" + "\x7c\x01\x7a\xe1\xdc\x41\x36\xee\x04\x7b\xda\x24\xa2\x3d\x73\xae" + "\x09\x71\x03\x7d\xbd\x42\x92\xb1\x15\x5d\x39\xe7\x42\xe4\x35\x2f" + "\x07\x9e\x9b\x38\xcb\xd6\x7b\xad\x72\x8c\x33\xee\xef\xee\xdc\x1c" + "\xe7\x39\x8b\x73\x51\x03\xce\x59\xe0\x19\x9b\x97\x59\x2c\xac\x1d" + "\xa8\x53\xea\x3b\xda\x50\x47\xb0\xdf\xe3\xd9\x0b\x3d\x8c\xc9\xf9" + "\x39\x9d\x36\x9c\x9f\x67\x31\x43\xb0\x2e\x3c\x76\x43\x2b\xfb\x1f" + "\x70\xab\xc4\x3b\xc7\xd2\xb9\xed\x7d\x71\xbc\x81\xdf\xb8\xd6\xb6" + "\x47\xf9\x43\x62\xbc\x15\xf5\xf5\xb9\x83\x18\x93\x1a\xf2\xd4\xca" + "\xf1\xa8\x59\xfc\x69\xde\x9e\xcd\x1e\xfd\x1a\xce\x26\x91\x78\x2e" + "\x1f\xcf\xb1\x31\x1a\xa8\xba\x9b\xd1\x57\x32\xfa\x7d\x34\xae\xc3" + "\x98\x26\x9d\x1b\x7f\x3b\x91\x9d\x05\xb6\x1a\x67\x77\xe2\x3e\xac" + "\x8e\x13\x19\xcc\x9f\x91\x2a\x2e\xdd\x4e\xf1\x77\xcc\x9e\x08\xe8" + "\x6e\xc6\x77\x2c\x56\x00\x96\xe9\xb3\xdf\xdf\xce\x85\x92\x6d\xda" + "\x01\x72\xff\xa6\xd3\xa4\x93\xd9\xee\xf0\xff\xc4\xd3\xe4\xfc\x9b" + "\x3c\x2e\x2a\xf7\x5d\x2f\xed\xc7\x1e\xc5\x7d\x59\x00\xcd\x98\x6f" + "\x81\xf3\xb7\x68\x6e\xc7\x18\xc2\xe7\x67\x30\x3f\xd2\xf9\x3b\xab" + "\x24\x1a\x54\x6d\xe2\xf5\x0a\x5e\x92\x2e\xb0\x3a\x62\xfd\x86\x59" + "\xb7\x0e\x69\x1c\x31\xaa\x2b\xe7\x7c\xa4\xec\x03\x83\xdb\x53\xdc" + "\xbf\x34\xe7\xc5\xf9\x6d\x92\xfd\xbc\x4b\xfa\xf6\xae\xcb\xff\xf6" + "\xf9\x24\xa9\xcc\x7c\xee\x63\xbb\x33\x14\xca\xcd\x87\x7a\x54\xcb" + "\xe3\x19\xe9\x0c\x51\x04\x1f\x67\x9d\x6f\x74\x8e\x67\x38\x0d\xdd" + "\xce\xb7\xad\x5e\x9d\xaa\x49\x58\xf1\xbc\x6e\x59\xea\x33\x49\x9a" + "\xc4\x94\x94\xd5\x29\x1a\x74\x72\xe4\xda\x7f\x78\x1c\xa0\xf3\x6d" + "\x52\xcc\xbc\x4a\x67\xcc\x3c\x6b\x84\x6b\x9c\x49\x33\xb1\x46\x8e" + "\xcc\xdc\x85\x35\xd6\x53\x39\xa5\x82\x58\x05\x57\x35\x5c\x46\xb8" + "\x6a\x71\x2e\x63\x89\x8d\x44\x81\xae\x67\x32\xcf\xe9\xdb\xc1\x8a" + "\x7e\x40\xa3\x5a\x89\xf5\x8d\x72\x51\x49\x98\xaf\x9e\x1c\x11\xe3" + "\x2e\xa0\x3f\xf4\x6a\xb8\x8c\x70\xd5\xc2\xc5\x7e\x27\x7e\xc2\xce" + "\xa5\x57\xb9\xbe\xe3\xfb\x47\x32\xeb\x30\x0f\xcd\xc6\x21\x22\xe4" + "\xfb\x0d\xcf\xd7\xaf\x0e\x02\xcd\x39\xb3\x54\xca\xc7\xc6\x92\x41" + "\xd9\x44\x33\x48\x3e\x3f\x9a\xd3\xb6\x58\xca\xc7\xf6\x1d\xcb\xed" + "\x41\x5f\xfd\x90\x5f\xce\xa7\xa4\x39\xe7\xda\xa5\x7c\x6c\x8f\x9c" + "\x98\x23\x0c\xf6\x5d\x7f\x9a\xf3\x3f\x49\x52\xbe\x10\xd7\xf2\x5c" + "\xf2\x8c\x12\x73\xbe\x42\x9f\xf8\x8d\x62\xb6\x32\x94\xdb\x4e\xd6" + "\x58\xc8\x3f\xa8\x8f\xd3\xe1\xf1\xe9\x82\xb5\x3f\x9f\x74\xcf\xac" + "\x48\xbc\x67\xc5\xaa\x34\x8c\xd4\x94\xba\x7a\x4d\x2a\xde\x57\x2d" + "\x7b\x96\xdd\x56\x2f\x59\xfe\x0c\xff\x27\x35\x39\x12\xff\x49\x06" + "\xbc\xe1\x3d\x61\x8d\x0e\x6f\xcf\xac\xc6\xc7\xf4\xa4\x88\x35\xcf" + "\xc8\xe1\xe9\x5d\x71\xa8\xed\xca\xb9\x58\x06\xd8\x28\xe2\x72\xf6" + "\x22\xe8\xc5\x63\x6c\xbf\x17\xc6\x23\xda\xab\xb5\x13\x79\x5e\xcb" + "\xdd\xb7\xc7\xc5\xbf\xa0\x6f\x8f\xe0\x6c\xdd\x33\xc1\xf6\x15\x89" + "\xa0\x33\x32\xe0\xb7\x6d\x66\xf2\x4b\x9b\x24\x1b\x8d\xcc\x4f\x68" + "\xce\xc5\x39\xd2\xde\x4e\xa5\x98\xbf\x33\x15\xfd\xdf\xc3\x33\x8b" + "\xfd\x0c\xcf\x15\xf0\xbc\x1b\x9e\x31\xe6\x73\x28\x3c\x67\xe0\x9c" + "\x14\x3c\x87\xc1\x73\xb8\x98\xbf\x3d\x1f\xcf\xf2\xc2\xb3\x06\x9e" + "\xa7\x77\xe5\x74\x45\xcb\xfd\x62\x70\x5b\xb9\x2b\x41\x8e\x47\xcd" + "\x63\x4f\x77\xa5\xf6\xc5\x9e\xc6\x78\x48\xfa\x90\xc5\x4c\xff\x32" + "\x1b\xa4\x6b\x8b\x5f\xd8\x54\x2c\x73\x8b\xac\x2f\xf9\x7c\x47\x57" + "\xa5\xec\xa7\x84\xcf\x67\x74\x55\xbb\xc4\xf0\xc6\xe7\x5a\x39\x86" + "\x37\xce\x77\xb1\x18\x82\x70\xa7\x39\xe8\x8f\x95\x0e\x3e\x97\xc7" + "\x62\x4f\xda\x66\xa1\x6f\x5b\x8b\x21\x41\x71\x5b\x39\xce\xa1\xc1" + "\x33\xf7\xcd\x48\xcf\x92\x2e\xe6\x6b\x44\xf6\xdb\xe6\xea\xb3\x61" + "\xd0\xf3\x50\x9f\x81\xcd\xc0\xe2\x45\x25\xaf\x0e\xb6\x2f\x4b\xe4" + "\x76\xa0\xad\x98\xcb\xaf\x77\x93\xb9\xbd\x60\x4b\xa7\x8f\xf3\x98" + "\x22\x66\x62\xb3\xe3\x98\x25\x58\x91\xbc\x9a\xc2\x6f\x83\xd3\x97" + "\x25\xb2\x34\xc8\xb7\x1e\x6c\x35\xa9\x7e\xbf\x30\x85\xe3\x59\x52" + "\x51\xf2\x45\x61\x5b\xfc\xd4\xd4\x2c\xfc\x8e\x8a\xd9\x21\x9f\x11" + "\x35\xc6\x80\xc4\xba\x95\xbb\xf8\x95\xdb\x04\x69\xb8\x87\xf4\xfc" + "\xe3\x44\x8d\x7e\x74\xa5\xba\x2c\xe6\xf1\xb7\x6c\x56\xd9\xa7\x13" + "\x7c\x6f\x71\xff\xf6\x3c\xfe\x13\x86\xca\x19\xcf\x44\x2c\x9c\x0f" + "\xff\x45\x48\x61\x94\x5d\xb1\x19\x7e\x7e\xcc\x7b\x73\xcf\xff\xe1" + "\x47\xa3\x79\xac\xcc\x6e\x18\xff\x77\xb5\xb3\x3d\x2c\x38\x2e\xe9" + "\x8a\xdf\xc2\xf7\xa0\x76\x67\xa2\xdf\x5a\x31\x07\xed\x49\x3c\x9f" + "\xdc\x9d\x8c\x98\xa5\xaa\x77\x75\xaf\x65\xa2\x8f\x64\x05\xd0\xb8" + "\x7b\x19\xbe\x93\x7c\x63\x09\xcc\x97\x94\x83\x84\xb1\xb3\xb8\x60" + "\xa3\xe0\x19\xd4\x13\xc4\xbe\x12\xed\x0e\x9c\x4f\x12\x73\xba\x55" + "\x88\x5b\xe0\x31\xfa\xea\xb0\xd2\x31\x3b\x97\xd2\x80\xea\x50\xc4" + "\x31\xda\xba\xa6\x10\xa4\x59\x77\x13\x7c\xf7\x21\xb8\x7e\xca\x63" + "\xb7\x3c\xd9\x2e\x97\x89\xfe\xcb\xc0\x86\xca\x80\x3b\x8c\xb7\xbb" + "\xed\x2e\x31\xed\xa4\xb3\xc7\x3d\x53\xd1\xaf\x1a\x96\xcd\x6d\x67" + "\xfb\xcf\xb8\x0d\xd2\xa3\x35\x93\xe0\x52\xde\x17\x7b\xc0\xfe\xc9" + "\xad\x94\xfe\x07\xfb\xe7\xfb\x0b\xfb\x95\x51\x20\xcf\x95\x72\x4c" + "\xf7\x24\x00\x46\x1f\x82\xeb\xa7\x90\x5f\x27\xc7\x6d\x5f\x2f\xb0" + "\x73\x92\x27\xfc\xc2\xf0\x5c\x79\x4f\xbe\x9c\xee\xaf\x88\x02\x9a" + "\xf6\x6c\x91\xfb\xfe\xf9\x31\xef\x2e\x82\xe7\x4a\x79\x8e\x85\xcf" + "\xb9\xf4\x54\xbb\x3c\x2f\x85\xe7\x5a\xf9\x19\xfe\x6f\x92\x65\x05" + "\x8e\x13\xcf\xc3\x58\x12\xc7\x9d\xcf\x84\x81\x5d\x18\x86\xe3\xbc" + "\x1e\xe0\x7f\x6e\x12\xcf\xdb\x0b\x36\x68\xc1\x74\xe9\x7f\xb5\x59" + "\xd8\x68\x97\xdb\x22\xe6\xf8\x05\xf3\xf6\xd8\xa3\xc5\x82\xd6\x2d" + "\x96\x80\x9d\x1a\xc8\x03\xfa\xbf\x8b\xb7\x37\xed\x4c\x45\x51\x4f" + "\xc8\x22\xdc\xf1\x68\x5c\x8e\xf8\xb2\xb3\x7d\x58\xc5\xeb\x42\x16" + "\xa2\x8d\x89\xbe\x35\x98\x1f\x3c\xf4\x05\x69\x27\xa3\x98\xff\xfd" + "\x82\xd6\x7c\xe6\x77\xfe\x05\xad\x5a\xf6\x03\x09\xb2\x25\x94\x0a" + "\xc9\xa1\xe8\x1b\x92\xc5\xd9\xe8\xd2\x06\x31\x7f\x90\x92\x1f\xc8" + "\x6d\x69\x24\xb4\x4c\xe4\x7e\x20\x99\xdf\x8d\x51\x30\x26\x49\x1b" + "\xdc\x17\x24\xcd\xf9\xe3\x6e\xd9\x17\x24\xbd\xe8\xb0\xc1\xff\xd3" + "\xa1\xed\x18\x7f\x5c\xcb\x9e\x9d\x3e\x9c\x94\x83\xfa\x86\x14\x40" + "\xc6\x09\xdc\x37\xe4\xf0\x74\x83\x3d\x84\xe3\xc4\xbe\x50\x8e\x2b" + "\xef\x92\x06\xf2\xcf\x26\xc5\xc6\xea\x09\x97\xd2\xd2\xcd\x64\xe3" + "\x6e\x69\x7f\xa5\x05\xe7\xc8\x36\xb3\x79\xb0\xee\x0a\xda\x9b\xb4" + "\x75\x30\xf9\xd2\x39\xc6\xbe\xb0\x93\xf9\x7c\xb0\x03\xef\x1d\x4c" + "\xd6\xf1\x71\xa3\xbd\xba\x7f\x1f\x7e\xfa\x99\xd5\x09\x89\x4b\x7e" + "\xb5\x52\xa7\x79\x7c\xd1\x43\x2c\xa8\x60\x84\x66\x45\x6a\x22\x53" + "\x3f\x9a\xc7\xe7\x3f\x18\x17\xb7\x68\xc9\x4f\x16\x3d\xb0\xe8\x89" + "\x9f\xdc\xcb\x4f\x27\x2e\x4a\x59\x8b\x81\x29\x53\x57\x6b\xf0\x47" + "\x4f\x4b\xd1\xac\xd7\x25\xa6\xac\xee\xdf\xf7\x43\xd9\x9c\x96\xc0" + "\xe6\x6f\xad\xf8\x3f\x9f\x37\x73\x2c\x92\xe7\xb3\xb8\x9c\x73\xcc" + "\x47\xda\xb2\x38\xa1\x39\xf6\x3a\xb4\xa5\xa4\x38\xe3\xa8\x63\x94" + "\xd8\x7f\x51\xd7\x74\xe5\x38\xb2\x5c\xfd\x5d\x49\xbf\xdd\x2e\xe0" + "\xef\xa4\x7e\x2b\xa5\xbd\x47\x27\x4f\x36\x70\x9f\x55\x8e\x5d\xf2" + "\x1c\x37\xa6\xc9\x75\x68\xc5\x3c\x39\x76\x87\x33\x9e\xad\xa3\xc5" + "\x19\xb3\x91\xfd\xb9\xd1\x88\x10\x34\x5d\xfc\xc1\x2e\x19\x05\xd7" + "\x68\xbc\x62\xfa\x64\x79\x1a\x6d\xc6\xf1\x59\xb0\x02\xf4\x6d\xba" + "\x1f\x8f\xf9\x94\xdb\xc4\xe2\x14\xc4\x39\xec\x7e\x4b\x1c\x02\xdc" + "\xfd\xe8\x12\x87\x92\x8d\x09\x69\x1a\x6d\x62\xe7\xea\xd3\x68\x23" + "\xc6\x36\x03\x1c\xe7\xc7\xd9\xf5\xe8\x83\xcc\xbe\x04\x6c\x75\xb8" + "\x9f\xc4\xf3\xe1\x71\x8e\x93\x94\xc5\x77\xc1\x73\xf4\xdc\x77\x5f" + "\x2d\xee\x97\x7c\x0a\x30\x5c\xde\xc9\x63\xe2\xc6\xad\xfd\xe6\xc8" + "\x92\xb5\x66\x1e\x13\xf7\x2c\x8f\x23\xcd\x63\x6d\x13\x3d\x94\xb3" + "\x6f\x89\xc3\x4f\x13\xe7\xe8\xa5\xfc\x8c\xab\x68\x1c\x2a\xce\xed" + "\xa0\x73\x15\xb9\x9f\x25\xd1\xe2\xcc\xe9\x34\xf7\xe0\x5c\xb8\x6f" + "\xa7\xf9\xd5\x38\x96\x55\xd0\xdc\x66\x15\x2d\xd6\x43\xfa\x57\xcd" + "\x70\xdf\x4e\x73\x0f\x57\xd2\x62\x03\x3c\x9b\xd3\xe1\x0e\xcf\xef" + "\x47\x41\x7e\x0d\xcd\xdd\x8d\xbf\xab\xa0\xb9\x1f\x44\x42\x3e\x78" + "\xfe\x50\x0b\x77\x78\xfe\x48\x03\xf9\xe0\xd9\x18\x76\x82\xd0\x0d" + "\xf0\x3f\xa4\x1d\x8b\xe1\xdf\x3a\x11\xc3\xbe\x95\x7b\x2a\x86\x7f" + "\xa3\x23\x86\x7f\xe3\x9b\x18\xfe\x8d\xce\x18\xfe\x8d\x8f\x43\x20" + "\x9f\x96\xe6\x7e\x92\x05\xf7\x4a\x9a\xbb\xc7\x02\xf9\xe0\x79\xef" + "\x52\xb8\xc3\xf3\xff\x36\x42\x3e\x78\xae\x85\xba\x18\xe0\x79\x5f" + "\x15\xe4\x8b\xa0\xb9\x07\xa6\xc3\x7d\x07\xcd\xad\xdb\x02\xf9\xe0" + "\xb9\x41\x0d\x77\x78\x36\x41\x39\x06\x78\x6e\xb4\xc2\x1d\x9e\x2f" + "\x60\x3d\x22\x69\xee\x45\x28\x37\xb3\x8a\xe6\xda\x30\x3f\x3c\xf7" + "\x40\x79\x7a\x78\xee\x6d\x87\x7c\xf0\xec\x28\x85\x3b\x3c\x53\x6c" + "\xeb\x1c\x5a\x48\xda\xe0\xbe\x8b\x16\x0a\x90\xae\x87\x67\xe5\x3c" + "\xb8\xc3\xb3\x3f\xe6\x87\xe7\xd1\x9b\xe1\x0e\xcf\x01\x48\xa3\xb9" + "\xb4\x70\x6c\x05\xdc\xab\x69\x61\x10\x81\x7c\xf0\x1c\x82\xf5\x87" + "\xe7\xf1\x46\xc8\x07\xcf\x13\x90\x56\xf0\x7c\x13\xb6\x73\x1e\x2d" + "\x9c\x84\xe5\xef\xa6\x85\xe1\x48\x17\x78\x9e\xb6\x03\xee\xf0\x7c" + "\x0b\xd0\xc3\x00\xcf\xb7\xa5\xc2\x7d\xf7\xa0\xfc\x2c\xfc\x2e\xd8" + "\xb7\xa3\x08\x2d\x9c\x6d\xa4\xd9\xa3\xe1\x1e\xa9\xa3\xd9\xfe\x5a" + "\x5a\xf8\xaf\x60\x27\x8f\x82\xfb\xf7\x63\xe0\x39\x42\x7a\x86\xfb" + "\xbf\x68\xe0\x39\x52\x7a\x86\xfb\xbf\xd8\xe0\x79\x8e\xf4\x0c\xf7" + "\xbb\xb2\xe0\x19\xea\xf8\x83\x78\x78\x86\xfb\x5d\x1d\xf0\x3c\x4f" + "\x7a\x86\xfb\xdc\x70\xb8\xdb\x2d\x53\x1f\x6e\xb7\x04\xc6\x56\x58" + "\x02\xb3\x43\x50\x6f\x3b\x4a\x32\x35\x62\x50\x66\x05\xe8\xcd\x51" + "\x86\x0b\x64\xf4\x09\x85\x70\x37\xca\x09\x53\x86\x99\xc5\xc2\x93" + "\x7c\x41\x8e\x6a\x55\x28\x16\x80\x8d\x33\x17\xe4\xb2\x00\x6d\x5e" + "\x4c\x73\xfc\x3b\xe1\xde\x42\x73\xc6\xb6\x42\x9b\xe1\x79\xdc\x67" + "\x70\x87\xe7\x1f\x14\x42\x9b\xe1\xf9\xc9\x07\xe1\xde\xd2\x95\xab" + "\xd8\x61\x26\xa2\x99\xf5\xfb\x3f\xfc\x08\x64\xb8\x81\xc6\xd9\x41" + "\x1f\x6c\xcd\x6b\x0c\xb6\x2f\x05\x3a\x67\xc3\x98\x57\x43\xe8\xb6" + "\x18\x2d\x0d\x5a\xc0\xea\x84\x71\x69\x68\xef\x74\x81\x7f\x7b\x2c" + "\x85\x6f\x1f\xc2\xf8\x09\x34\x28\xd1\xd3\xfb\x6e\xf6\x7e\x72\x9e" + "\x99\xbf\x0f\x21\xce\xf7\x3f\x85\xf7\xc2\xa4\x60\xf4\x43\x3e\xed" + "\xff\x99\xcd\x0a\x01\x6d\x1b\x62\x56\x28\xa0\x8e\x7e\xc4\x64\x6d" + "\x97\xda\x38\x1a\xf3\x3d\x80\xbf\xf3\x34\x47\x23\x16\xe5\xaa\x8a" + "\x41\x6e\xe1\x98\x15\xf4\x97\xa0\xd1\x4f\xaf\x6e\x55\x28\x43\xb6" + "\xa1\x4d\xa3\xce\xab\x64\xf2\x4c\x21\x1c\xec\x2d\xac\x5e\xac\x59" + "\x17\x0c\xe5\x29\xc7\x19\x6c\xd4\x6a\xd4\x3f\x48\x4e\xf0\xf4\x2d" + "\xec\x7c\x0f\xff\x7f\x03\xdb\xb7\xc9\xff\xd7\xb1\x39\x62\x28\x0b" + "\x7f\xeb\x3a\x46\x70\xe4\xde\x51\x26\x06\xe5\x55\xb1\x75\x6f\x85" + "\x70\xe8\x03\xd1\x2c\x04\xa7\x12\x7f\xcd\xba\x8f\xa0\x7c\x3f\x8d" + "\xdb\x78\xb2\x2f\x2f\x7b\xe7\xff\x21\xe4\x7d\x15\xe7\x7e\x72\xfd" + "\x22\xfb\xe2\x07\x43\x1b\x7e\x8d\xba\x4b\x20\x51\xa8\x4f\x99\x7d" + "\xaa\xf0\xab\x42\xbf\xb0\x76\x75\x76\xa9\xbd\x28\xb6\xd4\x51\x94" + "\x57\x49\x4b\xf2\xaa\x82\xec\x0a\xc2\xf6\xd7\x2b\xfc\x8e\xdf\x69" + "\x43\x7b\x70\x3f\xe6\xdd\x26\x8e\x9a\xd3\x38\x3b\x9d\x08\xc6\x94" + "\xaf\xf0\xf9\x30\xcd\xbd\x27\xc6\xd4\xd1\x4c\x8c\x29\xac\xac\x16" + "\x9a\x3b\xbf\x4e\x1c\x75\x7f\x53\x39\xda\xd5\xe9\x38\x2f\xf6\x19" + "\xa6\x2f\x03\x3a\x2b\xa1\x2e\xbb\xfb\x62\x5b\x03\x2d\x8b\x81\x76" + "\x68\xf3\xa2\xaf\x8a\x25\x0e\x07\xfa\x58\xcb\x37\x2b\xf8\x38\xd1" + "\xac\xf0\xab\xc0\xb8\xe0\xd2\x77\x2f\x88\x63\xaa\x63\x1a\x16\xe3" + "\x1a\x5f\x08\xfa\xac\xb2\xb2\xf3\xed\x76\x8c\xf7\x07\xba\x42\xca" + "\xeb\xca\xbb\x95\xcf\xe8\x96\xac\xd3\xad\x4e\x49\x5d\xb2\x46\x77" + "\x8f\x06\x06\x7a\x9a\xd5\xcb\x35\x2b\x13\x57\xae\x4e\x59\x3b\xc0" + "\x4f\x4e\x57\xae\x72\x11\x60\x83\xf9\xec\xdc\x07\xf6\x36\x9b\x6f" + "\x57\x8c\x9a\x8e\xbc\xde\xfa\x32\x8f\x2f\x01\x79\x40\xff\x27\xb1" + "\xf1\x8c\xb8\x25\xaf\x96\x96\xc5\x68\x0b\xd0\x47\xc7\x1a\x8c\x5f" + "\x60\x21\x26\xd2\xc9\x63\xce\xb2\x78\x72\x60\xff\xa7\x65\x52\x63" + "\x5a\x27\x62\x1c\x64\x72\x56\x35\x60\x5c\xd7\x5d\xbc\x40\xd5\xaa" + "\x18\xa5\xea\x2e\xce\xaa\x94\xe3\x01\x39\x8a\xb2\x55\xa2\x3a\x57" + "\x83\xf1\x80\x7a\x69\x18\xa9\x07\x5a\xf6\xe4\x57\xcf\x01\x19\x1f" + "\xb9\x2d\x87\x56\x3b\x60\x3c\xc4\x7c\xf1\xfc\x21\xc6\xec\xa0\x5a" + "\xa5\x23\x87\xa8\xe0\x1e\x44\x83\xf2\x16\xf6\xaa\xb3\x2b\xf0\x3d" + "\xc6\x01\x72\xf4\x6a\x89\xbe\x89\x8a\x3f\x4f\x02\xdc\xe4\x10\xca" + "\xe2\x9e\x26\x9d\x21\x90\x3e\x46\x2c\xc9\x8e\x3c\x11\x43\x04\xcc" + "\x0b\xf6\x19\x59\x0c\xff\x67\x2c\x23\x81\x90\x2f\x38\x63\x1f\xa4" + "\x77\x69\xc7\xd8\x0d\x5a\x55\x8f\x41\x3b\xa6\x97\x6a\xd5\xa6\x36" + "\x1b\xe9\x9d\x11\x63\x99\x65\x21\xca\xad\x60\xc7\x6d\x13\xa1\x7f" + "\x95\xc5\x84\x38\x5e\xd4\x8e\xb2\xbf\xa8\x55\xf6\xf6\x6a\x55\xf6" + "\x17\xb4\xca\x9e\x17\xb4\xa3\x7a\xbb\xb4\x2a\x53\x82\x85\xec\xb7" + "\xfc\x37\x69\x68\x6b\x67\x73\xb2\xbd\x81\x79\x8b\x7b\x03\xb3\xe7" + "\xa9\xdb\x48\xe8\x6c\x1d\xd8\x71\x60\xcb\xbe\x02\x76\x3c\x60\x42" + "\x6d\xff\x7d\x8c\x99\x16\xe7\x01\x7d\xfd\xcf\xcc\x9f\x49\xbf\x71" + "\xe4\x8e\xd9\xa5\x79\x04\x64\x11\x8c\xf7\x21\x0d\xf0\x73\x13\xe8" + "\x96\xef\x24\xc3\xf8\x1f\x64\x96\x52\x63\xe6\x7c\x20\x34\x37\x20" + "\x09\xe7\x04\x30\x2f\xcf\x17\x5c\x6d\x66\x77\x35\x8f\x4f\x9a\xab" + "\x0c\xdf\x86\x36\x44\xee\x28\x8d\x6c\x43\xd4\x28\x07\xf7\x03\x02" + "\x79\xa2\xfb\xc6\xd7\x22\xc8\x93\xe2\x4c\x8f\x71\x4f\xd1\x87\x31" + "\x2d\xc9\x8c\x2a\x15\xfb\x7c\x1e\x83\x3c\x1c\xb5\x12\xfa\x0f\x8b" + "\xdb\x41\x8b\xb2\xab\xf4\xe7\x88\x1f\xbe\xab\xba\x68\x13\xf0\x59" + "\x93\xa2\xa0\x26\xab\x8d\xc0\x6f\x94\x34\x3c\x46\x5b\x75\xd1\x22" + "\x20\x5e\x1a\x20\x0d\x7e\xbb\xb1\xf4\xa2\x54\xee\x96\xbc\x46\xc3" + "\x73\x84\xc5\xf8\xc0\x38\x41\x88\xa3\x52\x3d\x8c\x0f\x31\xa6\x51" + "\x8a\x1f\xf4\xe3\x51\x1f\xc3\xff\x2a\xcc\x47\xd5\xd9\x55\x22\x94" + "\x01\x78\x0a\xa3\x81\xd9\x5b\xc4\xe2\x6c\x0d\xdd\xf6\xb0\x99\x4e" + "\x8d\xc9\x17\xb7\xe6\x55\x77\xe5\x8e\x0e\x03\x5a\x45\xca\xf3\x0d" + "\x0d\x95\x76\x82\x3e\xac\xe8\x83\x76\xb2\x37\xf5\x02\xfa\xb9\xf5" + "\xb3\x04\x54\xcf\xb5\x04\xe6\xaa\x2c\x81\x79\x44\x2c\xce\x8d\x81" + "\x2b\x56\x97\x42\xd4\xa7\x15\xa3\x5b\xfa\x7c\xb0\x9e\xbb\x4e\x7c" + "\xb0\x82\x5d\xc6\xec\x33\xc0\x0e\xda\x5b\xd0\xde\x7c\x8c\xd5\x81" + "\x76\x18\xca\xdc\xae\x5c\x95\x4a\xb6\xa3\x50\x8e\x38\x0a\xaa\xa3" + "\xe1\x8a\x82\x74\xc0\xcc\x94\x68\x59\xc6\xd0\xa0\x58\xa3\x58\xf8" + "\xc0\x8e\x2e\x3c\xff\xd4\x9b\x74\x3f\xe6\x05\xba\xe1\xba\xb2\x9f" + "\xa3\x37\x69\x1e\x5c\xf7\xc2\x75\x9f\xa3\x38\xbb\xd4\x51\x9c\x55" + "\xe5\x28\xce\x35\x3b\x8a\x63\x6b\xe0\xaa\x85\xab\x0e\xae\x46\xb8" + "\x9a\xe0\x02\x1b\x2b\xb6\x05\xee\xf8\xbe\x0d\xae\x76\xb8\x3a\xe0" + "\xb2\xc0\x65\x75\x6c\xcd\x33\x8a\x80\x4f\xb8\x34\x70\x85\x43\x39" + "\x83\xce\x5f\xd1\xfc\xa3\xd5\x2c\x26\x81\xff\x11\x1a\x8c\x31\x6b" + "\x33\x2e\xa0\x7f\xc5\xea\xbd\x5a\xeb\xf0\x7c\xb3\x2b\x54\x1e\xd7" + "\x50\xb0\x7c\xe8\x5b\xbd\xc3\x2b\x2f\x40\xe3\x71\x9e\x24\x2c\xaf" + "\xd6\x1e\x1e\xa3\xb3\xe7\x90\x2c\xe8\xcf\x8a\x86\xa5\x6d\x24\xce" + "\x42\x0c\x75\x6d\x3d\xc4\x90\x20\xf9\x51\xcf\xc0\x33\x27\xc9\xa1" + "\x88\x61\x07\x8d\xd7\xf4\x16\x65\x55\x3b\xd4\x1b\xcd\x54\x9d\x1b" + "\xc6\x7c\x36\x82\xec\xc1\x18\x60\x7d\x63\x48\xc4\x14\x8c\x23\xeb" + "\x3b\x2e\x90\x17\x13\xa8\x58\x9f\x04\x36\x47\x33\x80\x4b\x41\x5e" + "\x47\x7c\xc9\xe3\xc8\x47\x5b\x68\x16\x60\x25\xc0\x01\x74\x13\x71" + "\xfc\x08\xb8\xc2\xb1\xa4\x8c\x2d\xd0\x65\x21\x72\xdc\x24\x3a\x4a" + "\xb5\x0b\xde\x29\x31\xae\x52\x19\x8c\x1f\xcb\xd2\xc8\xf4\x32\x78" + "\xc7\x62\x60\x42\xbd\x1f\xd3\x05\x53\xf1\x59\x2d\x29\xff\x15\x51" + "\x05\x9e\xe1\x71\x55\x1d\x40\xfb\xbe\xd8\x02\x45\x0b\x54\x0b\xce" + "\x68\xc8\x5e\xed\x61\xd0\x49\x55\x20\xbb\x17\xa8\x7a\x41\x6e\x03" + "\x2d\x1d\xc3\xa3\xe5\x98\xe4\x2b\x45\xcb\xde\xf0\x98\x10\x4e\xcf" + "\xa5\x04\x69\xd6\x9f\x9e\x48\xe3\x75\x6d\x40\x4f\xa0\xab\xa9\xc9" + "\x41\x82\x14\x64\x99\x4c\xcf\x57\x81\x9e\x40\xd3\x30\xa4\x29\xd0" + "\x83\xd1\x94\x4a\x34\x2d\x77\xa1\x29\xc8\x26\xe6\xdf\x12\x69\x2a" + "\x02\x4d\xcb\x3d\xd0\xb4\x6f\x2c\x0e\x34\x7d\xcd\x2b\x9a\x56\x5e" + "\x06\x4d\xc7\x1a\x3d\xd1\xd4\x8e\xfa\xb2\x64\x01\xa1\x20\xef\x4c" + "\xf6\xfd\xcc\x57\x2b\xd8\x3a\xb1\x60\xb3\xc5\x88\xea\x6c\x15\xd0" + "\x44\x8d\xeb\xf7\x18\xc7\xcb\x90\x4e\x8f\xc2\x28\xa4\xdb\x51\x92" + "\xb7\x14\xd3\x40\x6e\x25\xdd\x89\xbe\xe9\x74\x66\x52\x2e\xd0\xea" + "\x86\x8b\x56\xd0\x2f\x41\xdd\x3d\x68\x4b\x96\xe4\xbd\x26\xd2\x24" + "\x82\x32\xe4\xa9\x99\x44\xd9\x03\x72\x42\x97\x46\x6e\x2e\x05\x59" + "\xd7\x03\xb2\xf3\xb4\x42\xbd\x79\xbe\x4e\xa4\x70\x19\xd0\xe7\xa8" + "\x18\x98\x1b\x03\xb2\x9a\xf1\x17\x79\x86\xeb\x82\xf5\x4f\x7d\x02" + "\xe5\x05\x6e\x3c\xb0\xd4\x4e\x0c\x49\x03\xf9\x2b\x1a\xe2\x35\x8e" + "\xa2\x4b\xf7\x13\x8c\x25\x98\xd1\x8e\x7c\xad\x22\xa6\x36\x67\x3f" + "\x11\x5f\xe0\x32\x18\x79\x81\xfd\x02\xfb\xc8\x26\x17\xd9\x0b\x72" + "\x3d\x64\x9b\x14\x5b\xc3\x01\xb2\x77\x1b\xc6\x0a\x00\x5e\x62\xcc" + "\x8d\x41\xfb\xc7\x8b\xd0\x3f\xd6\xb1\xb8\x47\x61\x40\x8f\xaa\x9e" + "\x2e\xce\x43\xe4\x99\xc9\x5e\xcb\xf8\x57\x2a\xc9\x7a\x4e\xf7\xdc" + "\x29\x94\xc6\x13\x07\xd4\x5d\x2c\xc9\x5b\x48\xbb\x92\xc6\xe0\x1c" + "\x22\x8c\x75\x23\x83\x13\xc0\x6e\xf8\x06\x74\xc1\x2a\xc0\xd7\x59" + "\x32\xfd\xb5\x55\x60\x0b\x74\x61\xfc\x32\xa8\xcf\x5a\x1e\xf7\x55" + "\xcc\x0d\x08\x83\x77\xcc\x87\xaa\x28\xfb\x50\x3d\xaf\xc5\x31\xba" + "\x73\x6e\x67\xb5\x56\x70\x7e\xf3\x83\x85\x0e\xd5\xc9\x7c\x76\x0e" + "\x5e\x11\xc4\x7d\x19\xa9\xfe\x2b\x1f\xe9\xda\xa1\x08\xca\xe2\x73" + "\xb7\x95\x45\x3a\x3d\x19\x7d\x5a\x11\x74\x17\x2d\xac\xca\xd2\x61" + "\x0c\x6b\xf9\x9d\x21\x1e\xe9\x50\x39\x3b\x8b\x64\x39\x0a\x4e\x56" + "\x9a\xd2\xcf\xa0\x4f\xc2\x61\xca\xde\x20\xb6\xfe\xe3\xc8\xff\x60" + "\x11\xd0\x29\x4a\x2c\xfc\x60\x31\xc8\x94\x48\xfa\x2c\xb4\xf5\x57" + "\xd0\xd6\xd3\x40\xd7\xd3\xd0\xd6\x17\xa4\xb6\x4a\x31\xdd\x44\xa0" + "\x3f\xbc\x1b\x5c\xf7\xc9\x6d\x7d\x16\xfd\x8f\x57\xc4\x67\x9e\x21" + "\xdf\xa1\xb7\xe2\x5a\x2c\x3b\xa7\xd8\x65\xb2\x1f\x26\xf8\x5d\xa6" + "\x9b\x8b\x62\x9b\x9f\x00\x3c\x22\xcd\xc1\x1e\x88\xa2\x41\xd9\x91" + "\x32\x1f\xb0\x3e\xb4\x37\x69\x4c\xf9\x2a\xa8\x0f\xd2\xfe\x2c\x89" + "\xc0\xfe\x0c\xb4\x9f\x5e\x8e\xf4\x77\x8f\xab\x1c\xca\x78\x30\x0a" + "\x78\xb0\x4a\xe2\x41\x81\xc4\x03\xb0\x13\x41\x4f\xab\x40\xff\x86" + "\x95\xe7\x70\x1e\x0c\x8f\x46\xc1\xba\x11\xee\xaf\x09\x9e\xfb\xeb" + "\xf8\x37\x7b\xf8\xd8\x50\x81\xbe\x5c\xc1\x36\xfe\x2f\xb1\x17\xfa" + "\x6d\x89\xd4\x6f\x69\xd2\x7d\x72\x9f\x3d\xa1\x08\xf9\x91\x77\x7d" + "\x76\xdc\xdd\xff\x47\xfb\x6c\xe8\x95\xed\xb3\xe3\x15\xee\x7d\x76" + "\xfc\x1c\xf7\x3e\x3b\xee\x94\xb3\xcf\x4a\xef\x46\xa4\xcf\x8e\x27" + "\xd7\xa6\xcf\x8e\x27\x83\xf4\xd9\x68\x2f\xfa\x6c\x98\x87\x3e\x1b" + "\x76\xe5\xfa\xec\x77\xa6\x5f\x3d\x1d\x3b\x31\xb1\x47\x18\x44\xc7" + "\xbe\xe8\xa2\x63\x03\x51\xc7\x7e\xc7\x36\x58\x7f\xed\x2d\x83\xfe" + "\xaa\x96\xfa\xeb\xcf\xff\x0a\xe5\x85\x9e\xdb\xdf\x72\xe9\xfe\x6a" + "\x2f\x73\xda\x4f\x1e\xfb\x6c\x12\xf6\xd9\x4a\x62\x32\xb3\x3e\xbb" + "\x4c\xee\xb3\x65\xd2\x58\x67\x88\x7e\x1b\xea\xa9\xdf\x62\x9c\x2b" + "\x8c\x71\x35\x64\xbf\x95\xec\xa5\xde\xa9\xd8\x6f\x8d\xd7\x99\xae" + "\x9d\xf0\x9e\x7b\xbf\x9d\xd0\xe1\xde\x6f\x27\xbc\xee\xec\xb7\xd2" + "\xbb\x11\xe9\xb7\x13\xaa\xaf\x4d\xbf\x9d\x50\xfd\xed\xd1\xb5\x13" + "\x5b\xae\x9e\xae\x9d\x7c\x0b\xeb\xb7\x9e\x74\xad\x41\xd2\xb5\x81" + "\xa8\x6b\x6f\xfa\x8b\x77\x7d\x37\xec\xcd\xff\xe3\x7d\xf7\x0a\xeb" + "\xdc\x49\x6b\xdc\xfb\xee\xa4\x4a\xf7\xbe\x3b\xe9\x17\xce\xbe\x2b" + "\xbd\x1b\x91\xbe\x3b\x29\xf5\xda\xf4\xdd\x49\xa9\xdf\x1e\x9d\x3b" + "\xd9\xe3\x1e\x65\xcd\x34\x92\xd5\xaa\x98\x7c\xce\x54\xc6\xf6\xcb" + "\x65\x99\xec\xf7\x10\xb6\xc7\x44\x31\x65\x92\x29\x6c\x2e\x11\x0b" + "\xab\xab\x30\x56\x09\xee\x75\xf9\xad\xcb\x5e\x12\xb6\xfe\xaa\x98" + "\x72\xb7\xbc\x17\xe6\x35\x29\x9e\xc9\x50\x7b\x61\x68\x7e\x75\x94" + "\xf4\x3b\xe9\xfc\x44\x75\xb4\xfc\xcc\xfc\xbe\x28\xa6\xa4\xd3\x82" + "\xea\x79\x96\x80\xea\x79\x9e\xd6\x48\x82\xb2\x29\xc5\xfd\x1f\xe7" + "\xa7\xc5\x94\x9e\x2f\x24\xa4\x94\xad\x3f\x4c\xa9\x82\x36\x36\xf3" + "\x7d\x0f\xf6\xac\xf3\x39\x0b\x09\xa4\xd5\xc8\x69\x2c\xb6\x74\x8e" + "\x1f\x15\xe1\x1d\xc8\x90\xe4\xd7\xf4\x44\x85\x3e\x89\x67\x5f\x44" + "\x2c\x4e\x69\x02\x19\xc1\xf6\x76\xb0\x35\xf7\x9b\xa6\x58\xcb\x3b" + "\x89\xb2\x61\x03\xdb\xe3\x86\x7b\x68\x2a\x4a\x10\xff\x7e\xb7\x6f" + "\xa1\x82\x92\x88\xdb\x62\xd2\x69\x60\xee\x42\xb6\xe7\x17\xb0\x22" + "\xef\xab\xc1\x78\x79\xe2\xd4\x98\x30\xd9\x2f\x2e\x85\xfa\x7d\xa8" + "\xc7\x33\xa1\x7e\xb4\x3c\x85\x84\xc0\xa5\xa6\xc5\xb9\x0b\xbb\x72" + "\xc3\x17\xcb\x73\x87\x1e\xf7\x6f\x63\x7c\xdc\x29\x61\x4a\x69\x0f" + "\x0f\xfa\x07\x60\xfc\xdb\x24\x88\xf9\x0e\x48\xa7\x39\x06\x6a\x4a" + "\xb7\x93\x60\xa0\x05\xae\xb7\x63\x9c\x2d\xb1\x3c\xa6\x74\xfd\x64" + "\x42\xfe\xbc\xae\x5d\xc0\xbd\x17\x8e\xff\x98\x62\x35\xea\xff\x05" + "\xd7\xe3\x99\x4f\xfd\x13\x8a\xa9\x3f\x8b\x3b\xc5\x63\xe1\xc2\xff" + "\x89\xb8\xee\xb0\x00\x9e\x71\x3d\x5b\x3c\x1f\xa6\xc4\xbc\x90\x3e" + "\xce\x98\xf6\x15\x81\x51\x15\xee\x8b\x57\xf1\xbc\xe1\x18\x57\x12" + "\x78\x33\x35\x01\xeb\x00\xcf\x6c\x3d\x05\xf7\xce\xb3\x33\x16\x65" + "\x31\xe9\x4c\x3e\x14\xe5\x2e\x84\xf6\xa7\xb3\x3d\x9e\xd0\xce\x4d" + "\xd0\x66\xc8\xa3\xc6\xbd\x35\xec\xae\x27\x21\x9b\x21\x0d\xcb\x81" + "\xbb\x9a\xed\xef\x55\x84\xb3\xb5\x2e\x8f\xe7\x02\xd4\xb9\x0b\x29" + "\x60\x9b\x9f\x93\x51\x7c\xda\xaa\x98\xa6\x0c\x56\x50\x0a\xdf\x0c" + "\x5b\x8f\x73\xd8\xb8\x17\x1b\xf7\x97\x2b\xa6\x1e\x86\xf2\x95\xaf" + "\xb1\x39\xdb\xa9\xbb\xcd\x8a\xf0\xa4\xbe\xbd\x03\x6c\x9d\x65\x5a" + "\x28\x7e\x07\x7f\x23\xe5\x67\x71\x8c\xb0\xce\x1a\xbd\x1f\x85\x67" + "\x07\xdf\xaf\xad\x5a\x0a\xbf\xb7\xf7\xed\xd7\xe6\xbf\x03\x2c\x4d" + "\x83\x7a\x4f\x61\xe7\x45\xf0\xd9\xe3\xfe\x61\x89\x6f\xf5\x61\x80" + "\x8d\xfe\xbc\x93\x31\x02\xb8\x90\x31\x82\xf5\x7d\x4b\x6f\x16\x98" + "\x3e\x52\x4c\x63\xfb\x64\x4b\x80\x87\x8e\x57\xc3\x94\x6c\x5e\xba" + "\x17\xf9\xd2\x0a\xef\x6e\x7e\x02\xf9\xb2\x09\x74\x81\x94\x37\xdd" + "\x59\x7f\x7c\xbe\x99\xf1\x53\x04\x5e\xb0\xfd\x49\x8a\x9b\x67\xb2" + "\x98\x46\x20\x33\x70\x5f\x79\x0d\xe4\xa6\x88\x5b\xc0\xc8\x9f\x53" + "\x6c\x42\x79\x1a\x4f\xff\xb0\xd3\x26\x6c\x3a\x4d\x50\xb6\x90\xe2" + "\x5f\x11\x25\xe8\x21\x25\x96\x49\xc3\x63\xc2\xee\x94\xf9\xb8\x0e" + "\x78\x97\x06\xd8\x05\x9a\x6f\x02\xfa\x95\xf7\xb0\x75\x9a\xb0\x72" + "\x91\xa8\x45\xc8\x67\x56\xdc\x9c\x00\xe5\x85\x60\xfc\x4e\xdc\xff" + "\x0c\x34\x4c\xed\xca\xbd\x39\x4a\xa6\x21\xd6\x09\xf7\x2f\x63\x2c" + "\x4f\xa0\xe7\x6e\x8e\xa1\x69\x45\x72\x9b\x3d\xd1\xb3\xf8\xcf\x24" + "\xbc\x78\x36\x99\x2b\xaa\x8e\x56\x53\xbf\x29\x15\x38\xdf\xfc\x58" + "\x07\xfa\x97\x6a\x27\x71\x1b\x8f\x50\x93\xc5\x41\xc4\x80\xa3\xd5" + "\xb8\x06\xe1\x58\x7f\xfb\xf8\xb8\xb5\x40\x2f\xd0\xf7\x06\x1b\x09" + "\x31\xe9\x2d\x3c\xf6\x1e\x39\x47\x1c\xcf\x83\x0c\x07\xb9\x0e\x3a" + "\x55\x69\x38\x47\x26\x21\xbd\xc4\xc0\xac\xea\x13\x0a\xcd\x84\x27" + "\x52\x49\xd6\xf0\xe4\xe8\xcd\x66\x46\x77\xb0\x2f\x40\xe6\x0b\x2c" + "\x16\xbd\x05\xec\x93\xe2\xac\xea\xe1\x95\xa3\xd1\x7a\x92\x91\xd8" + "\x6e\x11\xe7\xa1\xa5\x36\xc7\x61\x9b\xad\x36\x82\x73\xf9\x8f\x3d" + "\x87\x7e\x8d\x2f\x10\xb1\xe0\x68\x35\xb6\x19\x6c\x9d\xb9\xc3\x9f" + "\xd3\xd7\x6c\x1f\xea\xdb\x14\xe8\x2d\xae\x9f\x52\x21\xaa\x73\xe7" + "\xe2\xb7\xb1\x0e\x78\x26\xe7\xb1\x0b\x84\xd1\x1d\xe9\x6f\xb2\x39" + "\x08\x0d\x70\xad\x83\x7d\x98\x75\xb8\xc5\x73\xfb\x67\x93\xf0\xa2" + "\x3f\x73\xbe\x3b\xd6\x4b\x34\x48\xc2\x35\xb0\xdc\xb9\x18\x2f\xf0" + "\x31\xac\x83\xe5\x0c\x59\x70\x86\x30\xfe\x9b\xb4\x1d\xc4\xe1\x77" + "\xfb\x78\xdc\x4b\x80\xfc\xd7\xdb\x81\xff\x17\x6d\xe8\xcb\xc8\x62" + "\xca\xea\x26\x68\xbf\xd8\xcf\x6b\x85\x81\xfc\xbf\x75\xc2\x13\xe9" + "\xc3\xe5\xff\x2d\x23\xc4\xff\x5b\xaf\x83\xf6\xdf\xe6\x43\xfb\x6f" + "\x1d\xa1\xf6\xdf\x76\x1d\xb4\x7f\xba\x0f\xed\xbf\x6d\x84\xda\x3f" + "\xdd\x63\xfb\x1f\x9a\x24\x52\xb6\xc7\x24\x28\x53\x83\x3a\x80\xeb" + "\xab\x19\x81\xb8\x87\x84\x9d\xc1\x92\x9e\x09\x3f\x93\xa5\xea\xf7" + "\xac\xee\xf7\x1c\xd2\xef\x39\xb4\xdf\x73\x58\xbf\xe7\x70\xf9\x19" + "\xf4\x88\xff\x59\xc5\xf4\x4c\xb0\x4b\xb3\xcc\x8a\x19\x61\xd2\xfb" + "\xe9\xe8\xeb\x0b\x74\xfa\xf4\x21\xe2\x3f\x4e\x39\xad\x98\xc1\xfc" + "\x5d\xd2\xf5\x93\xb5\x74\x5d\x16\x11\x8b\x62\xdb\x1e\xcb\x04\xd9" + "\x05\xfc\xa3\xbd\x61\xa3\xc0\x46\xb8\x09\xfd\xc9\xe1\x9e\x03\x4d" + "\x0a\xee\x25\x99\xf1\x1c\xb6\x6f\xb6\xce\x48\x44\xbf\xdb\xd9\x5a" + "\xbe\x58\x1c\xdb\x66\xf1\xbb\x7d\x32\xdd\x9a\x67\x2c\x11\x44\x55" + "\x49\x8e\xa8\xc9\xb4\x50\x4b\xec\x39\x90\x43\x17\xd0\xc7\x3b\xf0" + "\x38\x95\x5a\x8c\x29\x67\xb0\xbe\x87\xea\x33\xa0\x6c\xf8\x0e\x7c" + "\x0b\xc6\x71\xb1\x35\x2c\x1e\x39\x94\xd1\x60\xad\x25\x18\x63\x47" + "\x2a\xd3\x4c\x03\x63\x6b\xb0\xcc\x41\xed\xd3\xa2\xcc\x45\xf0\xcd" + "\x7b\x9e\xd0\x2a\x09\xcd\x56\x86\x0e\x8f\xa7\x33\xec\x1e\xed\xde" + "\xa2\xcc\x26\x5e\xae\xca\x87\x72\xbf\xbb\xc8\x73\xb9\x7a\xa9\xbe" + "\x21\xbe\x94\xbb\x63\x88\x72\xa5\xfa\x6a\x7c\x28\xf7\x7b\x4a\xcf" + "\xe5\x1a\xa4\xfa\x46\xf9\x52\xee\x80\x3d\xe9\x2e\xe5\x4a\xf5\xcd" + "\xf2\xa5\xdc\x5d\x43\xf0\x6d\x91\x6f\x58\xd0\xaa\x86\xc2\x82\x6f" + "\x38\xd0\x0e\xd1\x7e\xfd\x22\xdf\x30\xa0\xad\x1a\x0a\x03\xbe\xf1" + "\x7f\xe6\x90\xfc\xf7\x8d\xf7\x33\xe3\x87\xe2\xbd\x6f\x7c\x9f\xe9" + "\x11\xff\x68\xcb\x03\x9f\x42\x68\x50\x5e\x95\x58\xb2\x20\x44\x0c" + "\xca\x1c\xbf\x5e\x8c\x22\x0f\x81\x0c\x0b\xde\x42\xc6\x45\xb1\xf1" + "\xf1\xed\x51\x99\x65\x44\x80\xf1\xae\xf0\xe6\xba\x66\xc1\x64\x9f" + "\x8b\x3a\xc7\xb1\x3d\xcd\xa6\xb8\x0d\xd2\x3f\x06\x9d\x65\x05\xbb" + "\x93\x97\xb3\x20\xa4\x44\x1f\x45\x24\xff\x16\x56\xf4\x67\x1a\x07" + "\x72\xcc\xb4\xc5\x86\x7b\x56\xc6\xc1\xef\xec\x80\x5f\x28\xc3\x46" + "\xde\x12\x2d\x8a\xa8\x14\x96\xcf\xc2\xce\xd2\x95\x64\x8e\xa7\x06" + "\x2d\xfa\x39\xb4\xc0\x37\xdf\xf0\xb3\x10\x01\xfd\x11\x75\xe5\xde" + "\xbe\xdd\xac\xb8\x63\xb3\x74\x76\xb4\x83\xf9\xe3\x84\xfa\xe2\xb9" + "\x4c\xcc\x8b\x7e\x39\x67\xeb\x88\x80\xbe\xd2\x21\x6f\x23\xfa\xe8" + "\x1c\xea\x0c\xb6\xa3\x68\xa3\x15\x7f\x4f\x8b\x40\x87\x9e\x21\x02" + "\x9e\xbb\x84\x71\x80\xae\x04\xc6\x10\xf3\x67\xe2\x9c\x47\x27\xd1" + "\x67\x52\x11\xe7\x9f\xa8\x3a\xab\x12\xf7\xc5\xb1\x3d\xde\x8a\x3b" + "\x92\xcb\xf9\x9e\x6f\x1b\x8b\xbf\x0b\xcf\x6c\x1c\x83\xfb\x62\xd4" + "\xb1\x5b\x68\x49\x60\x54\x83\xb5\x93\xc7\x83\x54\xdc\xb1\x12\x7d" + "\x25\x9e\x57\x6f\xb4\x58\xd5\x1b\x6d\x5d\xb9\x77\x24\xc9\x6d\xc0" + "\xef\xcb\xe9\x38\x6e\xc3\x7c\xf0\x3e\x5f\x3e\x93\xed\x21\x1e\xf5" + "\xf8\xb8\x30\x6a\xe9\xf3\x81\xa1\x88\x38\x83\xb4\xa7\x45\x1b\xdb" + "\xad\x06\xed\x34\x3e\x8f\x11\x11\x8a\xe3\x61\xd0\x0d\x4d\x7c\x6c" + "\x1a\xdb\xc4\xfc\xe5\x82\x0e\x78\x42\x2b\x0c\xd3\x6e\xbd\x83\xe9" + "\x7f\xe3\x34\xd4\x91\x11\x07\xa1\xfc\x7f\x6b\x55\x44\xf0\x73\xc9" + "\x45\xb1\xed\xec\x2c\xa2\xe2\x8e\x26\xf8\x46\x3b\x3c\x97\x62\x3e" + "\x78\x1f\x2f\xbd\xb7\xb8\xbc\xb7\xe0\x3e\x49\xe9\xbd\x34\x96\x8b" + "\xb5\xba\xbc\xb7\xea\xa6\xe1\xdc\x44\x44\x05\xb6\x01\xe8\xd8\x88" + "\xba\xad\xcf\xa7\x47\x60\x6c\xa3\x94\xaf\xad\x43\x11\xf1\xde\x79" + "\xc0\x16\xbc\xef\x70\xf9\x7d\xc7\x9e\xf4\x48\xf2\xd0\x36\xa4\x61" + "\x44\x9d\x59\xc8\x5d\xc4\xc7\xb3\x77\x34\xb3\xb6\xab\x63\x6b\x5d" + "\xcb\x33\x2b\x22\xb6\x40\x99\xb5\x56\xb0\xa3\x20\x0f\xc6\x11\x74" + "\x1b\x93\xc9\x27\x22\x35\x09\x2b\x97\x69\x9e\x59\xbd\x66\x15\x9e" + "\x68\x1b\xe3\xb6\xbf\x31\x04\xcf\x7c\x8a\x45\xd9\xcd\xa6\x2d\x78" + "\x06\x2d\x84\x9d\xdd\xde\x0c\x7c\xb4\x97\xe4\x85\x38\x82\x72\x2b" + "\x1c\x25\x59\x46\xc3\x05\x22\xe8\xc3\xe8\x51\xe3\xba\x07\xc9\x59" + "\xc5\xac\x44\x16\x5f\x54\xc3\xfc\x42\x5b\x8d\xeb\x3e\xc1\x34\xe6" + "\xd3\xdb\xb4\x94\xa7\xfd\x8f\xbe\x56\xf8\x48\xdf\x2c\xd4\x2d\xed" + "\x24\x7b\xc2\x2c\xa4\x46\xd3\x49\xca\x30\x5d\x6c\x14\x70\xdf\x28" + "\xe4\xaf\xc7\x6f\xe1\x18\x1f\xff\xe7\xf3\x15\xb3\x7e\x8c\xdf\x41" + "\x7f\x1a\x1d\x8a\x59\x4f\xe0\xf7\xcc\x8a\x59\x8b\xfc\xca\xd8\x3e" + "\x63\xf5\x59\xc5\xec\x71\x62\x71\x76\x33\xeb\xe3\xb9\xb3\x94\x76" + "\x41\xbd\x5d\x3a\xe3\xc6\xfc\xfc\x77\xe5\xce\xb2\xbb\x9c\xe7\x44" + "\x5f\x20\xf7\x77\xe5\xce\x0e\x91\xcf\x16\x60\x9c\x31\x4f\x32\xa3" + "\x1b\xc6\xb2\xdd\x65\x0f\xdb\x44\x75\x36\xd0\x37\xbb\xb9\xb6\x96" + "\xe0\x5c\x8a\x02\xf7\xc0\x76\x28\xee\xb4\xd0\xc0\xec\x5a\x3d\xf6" + "\x53\xa0\xc5\x9f\x70\x1f\x5f\x50\x5e\xc8\x0e\xdc\xb7\x57\x92\x5b" + "\xf1\xdf\x69\x36\x61\x7f\x5d\x35\xd1\xfc\x3b\xda\x43\xb3\xb3\x1f" + "\x4d\xa0\xf6\xdb\x9b\x8c\xa4\xae\xed\x6d\x72\xa0\xa5\x96\xa8\x17" + "\x13\x3f\x83\x99\x3a\xd8\x78\x3f\x95\x08\x71\x66\xe2\xa7\xbf\x80" + "\xfd\xd4\x41\x0c\x6b\xe0\x6e\xab\x07\x1b\x27\x39\xf4\x4d\x7d\xbb" + "\xbf\xe6\x71\x42\x1c\x45\x7c\xdd\x98\x9d\xb3\xb1\xb0\x33\xca\x81" + "\x38\x87\xed\x72\xbe\x26\x2c\xf3\x0c\x51\xd5\x27\x1d\x26\x19\x4b" + "\xa9\xe8\x78\x41\x3b\x3e\x6e\xa9\x1f\x65\x67\x6c\xd2\x21\xb3\x0e" + "\x78\xfa\x82\x36\xe8\x95\x34\x12\xda\x90\x6a\x26\xa6\xf6\x5a\xf2" + "\x6a\x0a\x09\xa5\x5d\x49\x01\x75\x75\xfb\x09\x2d\x3c\x96\xf5\x96" + "\xde\xe8\x2f\xef\x99\x0a\xce\x56\xe0\x9c\x65\x50\x11\xee\x9d\xba" + "\x48\x22\x97\x1c\xcf\x62\xf3\xac\x38\xa7\x6d\xef\xd2\x6a\x7a\xbb" + "\xb4\xb7\xf6\x74\x69\xa7\xc9\x73\xe1\xbf\x58\x11\x42\xb6\xe1\xd9" + "\x9c\x5c\x4d\x07\xee\xd5\x43\xdb\xde\x1e\x70\x32\x1f\xe7\xbd\x11" + "\x97\xf0\xed\x70\xf1\x19\x2d\xb9\xd3\xc2\xce\xfe\xe0\x5c\x7c\x48" + "\xf9\xd3\x50\xdf\x8e\x4e\xe2\xba\xff\xa7\xfb\x05\xad\x80\x7b\x7f" + "\x68\xee\x6c\x6d\xcf\xb6\x87\x6d\xb8\x07\x08\x74\xc1\x9c\xe1\xf7" + "\xed\x3b\xd9\xdc\x04\xb6\x9f\x02\x66\x77\x74\x22\x7f\x80\x4f\x9d" + "\x16\x01\x79\x51\x9f\x80\x7c\x68\x74\xe3\x03\xe3\x5b\x8a\x4d\x40" + "\x7e\x20\x2f\x90\x27\x4e\x7e\x1c\x64\xfc\xd8\x21\x72\x7e\xf4\x80" + "\x1e\x90\x79\xd2\x1d\x1e\xa3\x1a\x8a\x2f\xc8\x0f\xe4\x4d\x5d\xdb" + "\x61\xe2\xc6\x13\x0b\xe7\x09\xd0\x73\xbc\xcc\x17\xe4\x89\xa9\x03" + "\x6c\x5d\xe0\xcb\x23\x07\x09\x79\x74\x26\x15\xeb\x63\x3f\xeb\xe3" + "\x8f\xdd\x13\x7f\x4e\x39\xf9\x03\xbc\x1f\xc8\x9f\x33\x21\xb8\x36" + "\x03\xfc\xb9\x45\x37\x1c\xfe\xd4\xb5\x71\xfe\xd8\x25\xfe\xcc\x8c" + "\x21\x82\xad\x4b\x2b\x6c\x4d\x23\x73\x63\x8f\x6b\xc8\xde\xf8\x7a" + "\x02\xb4\xae\x16\x8b\x37\xb6\xfb\xd6\x8f\xfe\x75\xae\xf7\xfd\xe8" + "\xfb\xfb\x6e\xf4\xa3\xe1\xf6\xa3\xef\xeb\x2e\xaf\x1f\xfd\xab\xf2" + "\x46\x3f\xba\x5a\xfd\xe8\x5f\x49\xff\x7e\xd4\xa7\xab\x53\x12\x57" + "\x2e\x5b\xb1\x0a\x8f\xef\x3d\xbd\x36\x35\xf1\x79\xae\xb1\xdd\x74" + "\x76\x98\x43\x1f\x25\xa0\xff\xb5\xba\x2d\x8d\xe4\xad\xc9\x8d\x82" + "\xe3\x64\x98\x92\xe6\x77\x37\x8a\xf9\xf6\x78\xf4\xa3\x89\xfd\x6d" + "\x33\xfa\xb8\x50\xdc\x9d\xda\x10\xce\x63\x56\xe2\xff\xcc\x5e\x09" + "\x8f\xc9\xc7\x35\x92\xf5\x3d\x70\xad\x23\xca\x60\x1b\x01\x7b\x06" + "\xdf\xcf\xfd\x14\xfd\x0a\xd2\x6d\x31\xf9\xe5\x18\xe7\xbe\x87\x28" + "\xad\xea\xd8\xd2\x0d\x50\x9e\x25\x30\xbb\x59\xa9\xc1\x73\x0e\x77" + "\x2d\x05\x9d\x1c\xde\xe7\x77\x48\x31\x77\x33\x1d\x35\xa7\x0a\xfb" + "\x3a\x9e\x39\x3b\xab\xb8\xeb\x77\xdd\x39\x04\xfd\x6b\x58\x9e\x98" + "\x09\xdf\x9a\x1a\xa3\x62\x7e\x08\xa0\xdf\xf3\xf7\xff\x8f\xad\x3b" + "\xf5\xaa\xb3\x30\x56\x11\xd8\x8d\x79\x21\xe7\x8b\x72\x2b\xf6\x67" + "\x54\x11\xcd\xe3\xd8\xef\xef\xfa\xf8\x91\x2d\xd0\xef\x17\x1a\x49" + "\x7d\xd8\x7f\x93\x03\xf1\x80\xb7\xf8\x4b\xf5\x7b\x17\x9c\x4d\xf3" + "\xae\xdf\xcb\xf8\x42\x5c\x21\xbe\x10\x5b\x63\x01\x5b\x88\x37\x19" + "\x5f\xbf\xbd\xc8\xf1\x15\xdc\x42\x42\x5e\xe9\x04\x8c\xd9\x39\xc6" + "\xf0\x1c\x70\x7d\xfa\x67\x9e\xfb\xff\xc5\x7e\xf8\x12\x24\x7c\xbd" + "\x00\xf8\x7a\xc1\x89\xaf\x27\x0f\x87\x90\x57\x19\xbe\x34\x4e\x7c" + "\x15\x9c\xcc\x97\xb1\x85\x38\x43\x4c\x89\xbf\xd4\x12\xec\xf3\x32" + "\xce\xca\x97\xf3\x75\x4e\xd6\xff\x05\xe8\xff\x5d\x2e\x7a\x74\xea" + "\xe5\xf4\xff\xff\xc7\xfa\x3f\xf2\x04\xf9\x83\x7c\x41\x5e\xfc\x33" + "\xf2\x01\x7d\xc0\xd2\xae\xc1\x78\x71\x73\xfa\xa5\x78\x81\x7c\x40" + "\x7e\x30\x3e\x00\x3f\xe4\x35\x67\x5c\x83\x44\x9e\x20\x2f\x66\x67" + "\x10\x01\xf9\x52\x0e\x7d\x1e\xfb\x39\xd0\x96\xed\x71\x66\xb6\x6b" + "\x4e\x60\xf2\x66\x3c\x37\x2b\xc5\xd7\xed\xca\x9d\xbb\x6b\xa0\xdd" + "\x3a\xb7\xb6\xcf\xef\xa3\xe2\x2e\x36\x2e\x33\x4e\xbe\x07\xfa\xdb" + "\x5d\xd2\x98\x25\x3b\x9f\xaf\x1f\xdd\x33\x43\xea\xd3\x3a\x1c\xff" + "\xb1\xb1\x9e\x03\xc6\x7a\x6a\x18\xeb\x15\xc1\x58\x2f\xbd\x9d\xfb" + "\x0a\x50\xdc\xcd\xe3\x20\xe1\xd8\x2e\x30\xab\x12\xc6\x19\x5b\x90" + "\x7e\x6c\xdd\x34\x70\x23\x8e\x57\x3b\x68\x31\x8c\x23\xff\x53\x20" + "\xf0\x0c\x18\x72\x0c\x13\x3b\x77\x47\x49\xeb\xc2\xf3\x74\xeb\x70" + "\xcf\xc0\x3d\x21\xbc\x7e\x77\x31\x1f\x54\x6c\x4d\x4d\x10\x2b\x1c" + "\xeb\xdd\xd7\xd4\x5c\xd7\x5c\xdf\xd2\x5b\xa4\xf5\xb4\xbb\x59\xec" + "\x75\x94\x0f\x28\xd7\xde\xd4\x37\x0a\xce\x35\xb5\xcf\xf0\x7d\xb7" + "\xfb\x9a\xda\xdd\x75\x84\x9d\x09\xbb\x67\x3a\xee\x23\x81\x67\x33" + "\x4f\xbf\x2b\xcc\x35\xdd\xb9\x66\xcd\xd3\x45\x81\xc5\x18\xc1\x31" + "\x77\x07\x1f\x6b\xdf\x33\x4f\x1e\xd3\x7a\xb0\x6f\x86\x21\x77\xef" + "\x27\x4e\xb9\x7b\x3f\xdb\x5b\x48\xc3\xf2\xaa\xeb\x07\xc8\xdd\xaf" + "\xe0\xfd\x7d\xbf\x78\x0c\xe5\x6e\x51\x56\x95\xc4\xd3\x7d\x40\x13" + "\x3f\x8c\x15\x89\xe9\x78\x7e\x07\xe5\xef\x36\x3c\xdb\xc2\x64\x72" + "\x5e\xe5\x06\xb6\x76\x7e\x4f\x87\xbb\x2c\xbe\x4f\xe3\x2e\x8b\xff" + "\xed\x96\xa1\x65\xf1\xbc\xbd\x43\xcb\xe2\x7f\x5b\x70\x43\x16\xfb" + "\x2a\x8b\xc1\x16\xbb\x2c\x59\x3c\xaf\xf4\x86\x2c\xbe\x52\xb2\x78" + "\x5e\x91\x8b\x2c\xfe\xa9\xbb\x2c\xbe\x2f\x6a\xa0\x2c\xbe\x6f\x91" + "\x53\x16\xdf\x63\x73\xca\xe2\x7b\xaa\xdc\x65\xf1\xfd\x3b\xbd\x93" + "\xc5\xf7\xbd\x79\x65\x65\xf1\x7d\x75\xee\xb2\xf8\xfe\x32\x49\xae" + "\xbc\x34\x7c\x59\x7c\x7f\xe6\xd0\xb2\xf8\xfe\x8d\xee\xb2\xf8\xfe" + "\x78\x2e\x73\xef\xaf\xe2\xb2\xf8\xfe\x64\x9e\x7e\x4f\xa9\x6b\xba" + "\x53\x16\xf3\xf4\x81\xb2\xf8\xfe\xda\x4b\xc8\x62\xad\x43\x94\x65" + "\x71\x33\xc8\xe2\x66\x41\xfc\xa5\x27\x59\x1c\x6d\xab\x47\x59\x9c" + "\x82\xb2\x38\xda\x36\xb4\x2c\x8e\x3e\x8e\x32\x17\xf0\x4a\xca\xd0" + "\xc7\x2f\xe0\xcf\xb8\xfc\x2b\x9c\xd3\x6d\x43\x7c\xc2\xfb\x7b\x1f" + "\xcb\x70\x95\xd5\x51\x6b\xfa\x64\x35\xa4\x8b\x93\xdc\x65\x35\xca" + "\x69\x94\xd7\xdb\x5e\xa6\xe6\xf2\x97\x69\x4b\x57\x6e\x54\x85\x2c" + "\xb3\x8b\x21\x0d\xe3\xfd\xa0\x0f\x9f\x6d\x17\xd9\xa5\x04\x1a\xb4" + "\xad\x87\xef\xe2\x6f\x20\x6f\x9d\xbb\x7c\x8f\x26\xf6\x5c\x57\xf9" + "\xfe\x80\x02\xe5\x7b\x11\x3f\xb3\xcd\xe4\xba\x7d\x5b\x8c\x0a\x65" + "\x3d\x7f\xff\xe0\xef\x87\x96\xef\x0f\xcc\xba\x56\xf2\x1d\x65\xca" + "\x58\x97\xb1\x9c\x27\xb9\x02\x6d\xb3\xd6\x27\x5c\x1d\xf9\x8e\xf2" + "\x04\xe5\x08\xca\x16\x59\xbe\xa3\x6c\xb1\x4b\x63\xed\xb2\x1c\x17" + "\xf9\x3e\xca\x45\xbe\x2b\x7c\x91\xef\x0f\xea\xbe\x55\xf2\x1d\xf9" + "\x90\x71\x65\xe5\xbb\x3c\xae\x46\x3e\x20\x4f\x90\x17\xae\x63\x6b" + "\xe4\x03\xf2\x03\xf9\x80\x36\x8d\x2c\xdf\x67\xa5\x73\xf9\xbe\xad" + "\x4f\xbe\x3f\x98\xdc\x27\xdf\x05\x2e\xdf\xcb\xd0\x37\x1a\x9b\x23" + "\x8e\xd6\x0c\x94\xef\xd1\x73\x9c\xf2\x3d\xaa\x59\x92\x77\x6d\xe8" + "\x5b\x00\xfa\xf7\x62\x77\x19\x3f\xff\x0d\xef\x64\x7c\xf4\x4b\x03" + "\x64\x3c\xd0\xb0\x88\xaf\x0d\xa1\x7c\xb7\xa0\x7c\xb7\xa3\x9c\xf7" + "\x49\xc6\x47\x57\x39\xf5\x50\xd4\x3c\x2e\x5b\xa3\x63\xdd\xe5\xfe" + "\xfc\xcd\x92\x8c\x9a\xea\x2a\xf7\x45\x3f\x6f\xe4\xfe\xfc\x35\xb2" + "\xdc\x47\xb9\xfa\xa6\xd8\xec\x22\xf7\x51\x4e\xce\xcf\x34\xa6\xb5" + "\xba\xc8\xfd\xf9\x0b\x79\x1d\xe6\x57\x3a\x98\xdc\x9f\x9f\xc0\xd3" + "\xa3\xc2\x5d\xd3\x9d\x72\x9f\xa7\x3b\x5c\xe5\x7e\x3b\xca\xfd\xf9" + "\xc6\x4b\xc8\xfd\x39\xde\xcb\xfd\x47\x93\x9c\x72\xff\xd1\xa4\xa1" + "\xe5\xfe\xa3\x4f\xa0\xdc\x67\x3e\x61\x81\xf7\x80\x67\x65\xc9\x44" + "\x2e\xf3\x71\x4e\x04\x74\x81\x19\x7d\x5a\x40\xbe\x07\x98\xef\x77" + "\xb8\xe0\x7d\x7b\x11\xfe\x2f\xb2\xdf\xb4\x04\x5b\x88\x0a\x75\x40" + "\xd1\x09\xa2\xc4\xb8\x69\x9c\x4e\x8f\x6c\x2b\xc3\x58\x9e\x7d\xfa" + "\xe2\x87\xbf\xf7\x52\x5f\x34\x81\xbe\x68\xec\xca\xfd\x61\xa3\x8b" + "\xbe\xc0\xd8\x73\x8d\xfd\xf4\x85\x19\xf4\x45\x9b\xfc\x9b\xae\xdc" + "\x87\x89\x6b\x7e\xac\x1f\xcb\x7f\x82\x5d\x98\xbf\x19\xf2\xb7\x70" + "\xfd\xf2\x70\x84\xbb\x7e\x79\x64\xa9\xe8\x36\x7e\x78\x78\x99\xac" + "\x5f\x50\x3f\x8b\x03\xf4\xcb\x8f\xfc\xfb\xf4\xcb\x44\x17\xfd\x92" + "\x2e\xeb\x97\x87\x8b\xaf\xfb\xf1\xc3\x65\xc8\x35\x5f\xf5\x0b\xca" + "\x34\x94\x67\x43\xe9\x17\xd1\x45\xbf\x88\x3e\xe9\x97\x98\xc6\x6f" + "\x95\x7e\xb9\x0a\xe3\x07\x57\x1e\x20\x5f\x98\x6e\x01\xde\x20\x1f" + "\x90\x07\x48\x7f\xf4\x3f\x8d\xbc\x41\xbe\x20\x4f\x66\xe9\x9c\xba" + "\x85\xf1\x85\xe9\x97\x98\xba\xfe\xfa\xa5\x7c\xbc\xac\x5f\x1e\xc9" + "\x1a\xa8\x5f\x1e\xd9\xec\xd4\x2f\x0f\xb3\xf9\x1b\xe6\x5f\x4f\xf1" + "\xc3\x22\x77\xdd\x12\x3b\xc9\x3b\xdd\xf2\xc8\x99\x41\x74\x0b\xf3" + "\x6d\x5c\xf4\xb2\xdb\xd8\xc1\x02\xfa\xc5\x07\xdd\xf2\xa8\x9a\xd7" + "\x11\xf7\x2f\xff\x70\x31\x97\xdf\x8f\x54\x3a\xf5\xcd\x0f\xe7\xb8" + "\xa6\x39\xf5\x4d\xac\x52\x92\x71\x13\x86\xaf\x6f\x1e\x3d\xce\xf6" + "\x1e\x40\x1b\xde\xec\xe4\x32\xdd\x5d\xdf\x3c\x7a\xc6\x5d\xdf\x3c" + "\x6a\xe4\x75\x88\x0d\xe3\xfa\xe6\xd1\x26\x9e\xfe\xc3\x50\xd7\x74" + "\xa7\xbe\xe1\xe9\x03\xf5\x4d\x6c\xe4\x25\xf4\x8d\xba\x37\x3c\x46" + "\xd5\x5b\x94\x6b\xb1\x6f\x8f\x29\x8d\x88\xbf\xdf\xd1\xbf\xdf\xf0" + "\xfe\xe2\x20\xd8\x7f\xfa\xd6\x9f\x9e\xe2\xeb\x1d\xa2\x74\x06\xb8" + "\x27\xfc\x61\xdb\x89\x64\xe8\x3b\x1d\x9e\xfb\x0e\xf4\x1b\x95\xdc" + "\x6f\xea\x93\x8e\x13\xe8\x4b\x02\xae\x49\xbd\x0a\x7d\xc6\x64\x6d" + "\x66\x7d\x48\xdd\x16\x45\xd0\x77\x62\x60\x07\x09\x09\x54\x28\x46" + "\xe1\x7a\x87\x03\xfa\xcf\xfc\x99\x54\xbc\xa3\x39\x8a\x04\x26\x91" + "\x20\xec\x43\x7f\x96\xd6\x3d\xd0\x7f\x03\xae\x77\x00\x7e\x23\x97" + "\x7c\xea\x5c\xef\xe8\xf1\x62\xbd\xc3\x94\x6e\x66\xeb\x1d\x78\xa6" + "\x49\x84\x7e\xc2\xce\xd9\xe0\x7a\x87\x8d\xad\x11\x31\xf9\xf5\x1a" + "\x5b\xef\x68\x25\xb8\xd6\x21\xfb\x67\xc1\x35\x8e\x3b\xe2\x89\x80" + "\xfe\x1d\x5e\x85\x7e\xb3\x57\x5b\xcf\xfa\xcd\xf0\x65\xd8\x82\xcd" + "\x43\xed\xf3\xb1\x03\x4d\x1d\xea\x5c\x0b\x7d\x25\xcf\xfc\xa7\x56" + "\x9b\x02\x7d\x53\x3a\x80\x47\x22\xc8\x2a\xaa\xea\x27\xab\x7a\x25" + "\x7a\xf7\x72\x7a\x03\xaf\x54\x4f\x59\x09\x85\x74\xee\x9b\xd2\x66" + "\x06\xac\x69\xc7\x6f\x5b\x87\xb4\x8d\x24\xdb\x24\xff\x94\xe2\x8b" + "\x49\x01\x22\xd0\x13\xcf\x32\xbc\x79\xd1\xe6\xef\x50\x1d\xad\x2e" + "\xea\x21\x11\x20\x97\x02\x51\x2e\x01\x3e\xc7\xbc\xd6\x03\xb4\x3d" + "\xca\x69\x8b\xfe\xc5\xf0\x6e\x7f\x51\xab\x81\xb2\x6f\xed\xed\x05" + "\xfa\xda\x38\x7d\x9f\x7a\x2e\x84\x94\xcb\xeb\x7d\xa0\xeb\x1b\x80" + "\xa7\x4c\x2e\x59\x83\x29\xc6\x99\x70\xf4\x6a\xc3\xc5\x93\x40\x5f" + "\x2b\xf4\xa9\x5e\x2d\xf2\x3f\xa4\xfc\x04\xae\x4f\x7e\xc5\xd7\xfb" + "\x02\x24\xbf\x19\x2f\x82\x8e\x58\xa1\x21\xa6\x4a\x90\xd1\xa3\x62" + "\xa3\x7b\xb7\x3d\x6c\x63\x63\x90\x8c\xe1\xd2\xf7\xb1\x01\xfe\x8f" + "\xaf\x0e\x7d\x35\xdf\x22\xfa\x2e\x68\xf1\x9d\xbe\x0b\x3d\xee\xff" + "\xbc\xb2\xf4\x0d\xf9\x16\xd1\x37\x6e\x9e\xef\xf4\xfd\xb1\xc7\xfd" + "\x9f\x48\x5f\x1c\x27\xc8\x63\x04\x79\x7c\x80\x7a\x85\xeb\xd0\x45" + "\x11\xce\xb1\xc1\xa2\x08\x79\x5d\x14\x68\xa3\x2c\x46\x1f\xce\xd0" + "\x66\xdd\x72\x72\xf3\x69\xc5\x4f\x5e\x97\xd7\x44\x4b\x31\x96\x08" + "\xf2\xea\x15\xe0\xd5\x2a\x3c\xb3\x22\xf1\x09\xf4\xc0\x12\x2b\xc8" + "\xea\xa9\x31\x2a\x47\x31\xe8\x89\xdf\xc7\x94\x7a\xe0\x99\x80\x32" + "\x3e\x30\x95\x84\x3c\xa5\xe3\xbc\x13\x5f\x04\x9e\xf5\x80\x4d\x64" + "\x6b\x27\x78\x06\x35\xb8\x1d\xe4\x6a\x6f\x52\xc0\x62\xb0\xb1\x65" + "\xbe\xfd\x39\xcd\xc6\xec\xa1\x41\xf9\xb6\xd5\x9d\x6f\xe7\x07\xe1" + "\x9b\xcb\x3e\x03\x1d\xe7\x9b\x99\xf1\x8d\xc9\xf5\x17\xc1\x36\x05" + "\xfe\xc9\x7c\x63\x72\x1d\x78\xc7\xf8\xd6\xd1\xca\x6c\x20\x59\xae" + "\xa3\xfd\x83\xbc\xab\x5b\x0a\xf6\x5c\xee\xc2\x32\xc6\x37\x9c\xdb" + "\x5e\x3a\x5c\xbe\xfd\x24\xd9\xdd\xee\x59\x74\xc8\x3b\xbb\xe7\x27" + "\xa7\xd0\xae\x71\xb5\x7b\xf0\xf9\x3c\xd8\x39\x8e\xc0\x8d\x56\xab" + "\x4f\xe3\xe8\x9f\xd8\xdc\x6d\x98\x45\x35\xbc\x4e\x8f\x7f\x7f\xf8" + "\x36\xcc\x22\x36\xdf\xf6\xe6\x2b\x83\xd9\x2f\x8b\xde\x74\xb7\x5f" + "\x16\x65\x71\x3b\x65\x51\xf3\xf9\x1c\xb4\x5f\x16\x6d\xe6\xe9\x8f" + "\x47\xba\xa6\x3b\xed\x17\x9e\x7e\x1e\xfd\x94\xe5\x2e\x6a\x1b\x9e" + "\xcd\x72\xe7\x35\xb6\x59\x22\x87\xb0\x59\x22\xff\xc9\x6c\x96\x7f" + "\xf7\x18\xff\xf2\x86\x4e\x95\x65\xfe\x22\x9b\xef\x32\xff\xa7\x95" + "\x37\x74\xea\xa5\xe8\xfb\xef\xa5\xbe\xd3\xf7\x67\x1e\xcf\x3f\x5c" + "\x5a\xa7\x3e\x99\xe5\xd4\xa9\x4f\x66\x79\xd6\xa9\x3f\xbf\x70\x43" + "\xa7\x0e\xa6\x53\x7f\x6a\xf1\x5d\xa7\xfe\xdc\xe8\xae\x53\x17\xcf" + "\xf2\x4e\xa7\x3e\x79\xef\xc8\xeb\xd4\x27\xfb\xcd\x43\x2f\xe6\x3e" + "\xdf\x15\x3f\xdb\x38\x7c\x9d\xfa\x64\xb7\x67\x9d\xba\x58\xe1\xae" + "\x53\x9f\x6c\xe2\xba\x73\x71\x04\xd7\xa9\x4f\xb6\xf3\xf4\x9f\x6d" + "\x70\x4d\x77\xea\x54\x9e\xce\x75\xea\xe2\xb9\xc3\xd3\xa9\x37\x5f" + "\x63\x9d\xaa\x19\x42\xa7\x6a\xfe\xc9\x74\xea\x2f\xca\x6e\xc8\xfc" + "\x4b\xc9\xfc\xc5\xb1\xbe\xcb\xfc\xa7\x3c\x9e\x7f\xbc\xb4\xcc\x5f" + "\x96\xea\x94\xf9\xcb\x52\x3d\xcb\xfc\xa5\xa7\x6e\xc8\xfc\xc1\x64" + "\xfe\x2f\xda\x7c\x97\xf9\x4b\x77\xb9\xcb\xfc\xa7\x6f\xf1\x4e\xe6" + "\x2f\xfb\xfe\xc8\xcb\xfc\x65\xfd\xf6\xff\x3d\xad\xe6\x75\x5a\xb2" + "\x76\xf8\x32\x7f\xd9\x19\xcf\x32\x7f\xd9\x05\x77\x99\xbf\xac\x96" + "\xcb\xf6\xa7\x35\x5c\xe6\x2f\x6b\xe1\xe9\x4b\xd2\x5d\xd3\x9d\x32" + "\x9f\xa7\x73\x99\xff\x74\xc4\xf0\x64\x7e\xf0\x35\x96\xf9\x21\x43" + "\xc8\xfc\x90\x7f\x32\x99\xff\x4c\xa9\xef\x32\x69\xb9\xca\x29\x93" + "\x96\xab\x3c\xcb\xa4\xc4\xcc\x1b\x32\x69\x30\x99\xf4\x74\x94\xef" + "\x32\x29\x31\xc6\x5d\x26\x2d\xff\x8b\x77\x32\x29\x71\xef\xc8\xcb" + "\xa4\xc4\x26\x77\x99\xb4\xbc\x82\xd7\x29\x21\x70\xf8\x32\x69\x79" + "\xb6\x67\x99\xb4\xbc\xc0\x5d\x26\x2d\x97\xd6\xcc\x96\xef\xe2\x32" + "\x69\xb9\x8e\xa7\x27\xa8\x5d\xd3\x9d\x32\x89\xa7\x73\x99\xb4\xfc" + "\x52\xfb\x1f\x18\xf6\xeb\xc3\xfa\x61\xff\x59\x19\xfb\x2b\xc2\x0e" + "\x94\xc9\xd8\x5f\xc1\xf7\x39\x97\xc5\xe4\xff\x3a\x8d\x28\x8b\x30" + "\xe6\x06\xf4\x77\xdd\xcf\x11\xfb\x49\xc5\xb8\xff\x40\xdd\x02\x32" + "\xac\x4d\x92\x69\xe9\x20\xd3\xda\xe0\x19\x7d\x52\x4d\x8d\xc9\x47" + "\x59\x84\xb1\x08\xf0\x99\xcb\x36\x8b\x3f\x9e\xdd\x1c\xd6\xb9\xaa" + "\x36\xe9\x5c\x55\xc2\xc0\x73\x55\x65\x2e\xe7\x77\xb0\x6f\x04\x66" + "\x2b\x82\x70\x2d\x18\xe4\x9b\x24\xc7\x6a\xfd\xed\x2a\x49\x8e\x5d" + "\x04\x39\x76\xd1\xd9\x27\x50\x8e\x9d\x07\x39\x66\x7d\x41\x3b\x0d" + "\x65\xd9\xc0\x33\x55\x7c\xed\x97\xc9\xb1\x82\x7e\x72\xec\x97\xfd" + "\xe4\xd8\x72\x90\x63\x4b\x41\x8e\x05\x38\xfb\xc3\x6d\x2d\x44\x88" + "\x5d\x06\x7d\x02\xe4\xd8\x6f\x2f\xa2\x1c\xdb\xeb\xa3\x1c\x4b\x8a" + "\x77\xef\x0f\x2b\xf6\x7a\xd7\x1f\x92\x0e\x7a\xea\x0f\xbd\xc5\xbe" + "\xf6\x87\xa4\x36\xf7\xfe\xb0\x42\xda\x93\xf2\xcb\x80\xe1\xf7\x87" + "\x15\x2f\xf5\xf5\x87\x67\xfb\xf7\x87\x15\x5b\xdd\xfb\xc3\x8a\x64" + "\x8e\xfb\x15\x35\xbc\x3f\xac\xc8\xe2\xe9\xbf\x54\xb9\xa6\x3b\xfb" + "\x03\x4f\xe7\xfd\x61\x45\xe3\x8d\xf5\xd9\xeb\x55\x47\x3f\x3b\xe7" + "\xc6\xfa\xec\xa5\xc6\x65\x2b\xda\x7c\x1f\x97\x25\x5f\xa3\xf5\xef" + "\x6f\xd3\x5c\xf2\xb3\x19\xbe\xd3\x77\xe5\x35\x5a\xff\xfe\x36\xcd" + "\x2b\x24\x5f\xc6\xfa\xf7\xea\x21\xd7\xbf\x87\xb6\x63\x9e\x6b\xab" + "\xeb\xb3\xe1\x9f\x6b\x93\xf7\x6e\x0e\xb4\xe1\x9f\xfb\x99\xfb\xd9" + "\x29\x9d\x7f\xff\xb3\x53\x97\xb2\xed\xed\xff\xa7\x6c\xfb\x55\xf3" + "\x7c\xb7\xed\x9f\x9b\xee\x6e\xcb\xa4\xbc\xe4\x9d\x2d\xf3\xdc\xeb" + "\x9e\x6c\x19\xbb\xcf\xb6\xfd\x73\x55\xee\xb6\x4c\x4a\x06\xaf\xd3" + "\xea\x4f\x87\x6f\xcb\xa4\xfc\xc2\xb3\x2d\x93\x92\xe8\x6e\xcb\xa4" + "\xcc\xe5\x36\x4b\x4a\x29\xb7\x65\x52\x62\x79\xfa\xea\x46\xd7\x74" + "\xa7\x2d\xc3\xd3\xb9\x2d\x93\x52\x76\x63\xdd\xf6\x7a\xb5\x65\x70" + "\xea\xf2\x86\xae\x1d\x5a\x17\xa4\x54\xf9\xae\x0b\xd6\x2c\xbd\xa1" + "\x6b\x2f\x45\xdf\xd4\x18\xdf\xe9\x9b\x66\xf4\x5d\xd7\xae\x5d\xe8" + "\xd4\xb5\x6b\x17\x7a\xd6\xb5\xe9\x7b\xdd\x75\xed\x0b\xcf\xdd\xd0" + "\xb5\x43\xe9\xda\x35\x95\xbe\xeb\xda\xf4\x52\x77\x5d\xbb\xd6\xe1" + "\x9d\xae\x5d\x1b\x38\xf2\xba\x76\x6d\xb8\xbb\xae\x5d\xdb\x2e\xf1" + "\xff\xde\xe1\xeb\xda\xb5\xfb\x3c\xeb\xda\xb5\x9f\xba\xeb\xda\xb5" + "\xdb\xb9\x4e\x5d\x6b\xe7\xba\x76\x6d\x35\x4f\x7f\x61\x9e\x6b\xba" + "\x53\xd7\xf2\x74\xae\x6b\xd7\xa9\x6e\xac\xe7\x5e\xaf\xba\xf6\x45" + "\x8f\xf1\x0f\x6f\xe8\x02\x59\x17\xac\x0b\xf7\x5d\x17\x64\xd4\xf9" + "\xae\x0b\x0c\x8b\x9d\xba\xc0\xb0\xd8\xb3\x2e\xd0\x7f\xea\xae\x0b" + "\x32\x33\x6f\xe8\x82\xa1\x74\xc1\x8b\xbb\x7c\xd7\x05\xfa\x32\x77" + "\x5d\x90\x15\xe0\x9d\x2e\x30\x4c\x1a\x79\x5d\x60\xd0\xba\xeb\x02" + "\x83\x55\xe2\xff\x8f\x86\xaf\x0b\x0c\x07\x3d\xeb\x02\xc3\x61\x77" + "\x5d\x60\xa8\xe2\x32\x3f\x4b\xc5\x75\x81\xa1\x86\xa7\x67\xc6\xb8" + "\xa6\x3b\x75\x01\x4f\xe7\xba\x20\x2b\xf4\xc6\x3a\xef\xf5\xaa\x0b" + "\xb2\xd3\x7d\x97\x55\x1b\x54\x4e\x59\xb5\x41\xe5\x59\x56\xad\xcf" + "\x74\x97\x55\x39\x33\x6f\xc8\xaa\xa1\x64\x55\x96\xd6\x77\x59\xb5" + "\xbe\xdf\xfa\xef\x06\x2f\xd7\x7f\xd7\x7b\x5c\xff\xf5\x5d\x56\xad" + "\xef\xb7\xfe\xbb\x41\x5a\xff\xcd\xbe\x30\x7c\x59\xb5\x21\xdb\xb3" + "\xac\xda\xd0\x6f\xfd\x77\x83\xb4\xfe\xbb\x41\x5a\xff\xdd\x20\xad" + "\xff\x66\x5b\x5d\xd3\x9d\xb2\x8a\xa7\x73\x59\xb5\xe1\x32\xd7\x7f" + "\xf3\x22\x9d\xeb\xbf\x79\xec\xcc\x80\xb8\x25\xaf\x7a\xe0\xfa\x6f" + "\xee\xef\xdd\xfd\x98\x6c\x7c\x80\xad\x05\x63\xbf\xb0\xf2\xb3\xe9" + "\x83\xae\x0b\x4f\xca\xab\xbe\xb1\x2e\x3c\x12\xeb\xc2\xb9\x3a\xf7" + "\x7e\x92\x77\xd8\xbb\x7e\x92\x7b\x66\xe4\xd7\x85\x73\xed\xee\xfd" + "\x24\xaf\x56\xc2\x84\x0f\xeb\xc2\x79\x6f\x78\xee\x27\x79\x3b\xdd" + "\xfb\x49\x9e\xb4\x2f\x37\xaf\x85\xf7\x93\xbc\x2d\x3c\x7d\xa3\xca" + "\x35\xdd\xd9\x4f\x36\xba\xac\x0b\xe7\xb5\x7b\xa3\xd3\xed\xea\x5c" + "\x2b\xea\xe8\x88\xe6\xfb\x1d\x7d\x78\x4e\x95\xf0\x3c\x98\x4e\x7f" + "\x9a\xcb\x7e\xc4\x71\xef\xf6\x98\xcd\x97\xd4\xe9\x6d\x92\x4e\x4f" + "\x18\xa8\xd3\x65\x7d\x8e\x78\x7e\xd5\xab\x35\xe1\x7e\xb8\x1e\x96" + "\x3e\xbf\x55\x77\x39\xb8\x46\x4c\xbb\xeb\x73\x5f\x71\x5d\x70\x8d" + "\xce\xbf\x7c\x9b\xd6\x84\xf3\xec\xbe\x8f\xed\x0a\xaf\xd1\xf9\x97" + "\x6f\xd3\x3c\x75\xc1\x65\x9c\x7f\x29\x1a\xf2\xfc\xcb\x8d\xb9\x09" + "\xa4\x6f\xa1\xc5\x77\xfa\x16\x27\xf9\x6e\xef\x97\x86\x39\xed\xfd" + "\xd2\x30\xd9\xb6\x41\x59\xc8\xfc\xee\x80\xfc\x2b\x4e\x81\xeb\x22" + "\x21\xbf\x4e\x61\x7e\xc7\x55\xa6\xb6\x83\x44\xa7\x47\x7b\x67\x53" + "\x71\x5c\xba\xab\xbd\x53\x32\x4b\xb6\x75\xe2\xd0\x0e\x02\xbb\x06" + "\x6d\x1a\xd9\xc6\x2f\xed\xbc\xc4\x7e\xd0\x19\x31\x9b\x71\x4c\xd0" + "\x1b\x98\x6b\xfd\xe7\x1f\x0f\x14\x2d\xf4\x7d\x3c\xb0\xa9\xdf\xfe" + "\xb7\x52\x2f\xf7\xbf\x6d\xf2\xb8\xff\xcd\xf7\xf1\xc0\xa6\x7e\xfb" + "\xdf\x4a\x25\x2c\x14\x1f\x1f\xbe\x9d\x53\x3a\xc4\xfe\xb7\xd2\x7e" + "\xfb\xdf\x4a\xa5\xfd\x6f\xa5\xd2\xfe\xb7\x52\x69\xff\x5b\x71\x9b" + "\x6b\xba\xd3\xce\xe1\xe9\xdc\xce\x29\xf5\x6a\xff\x1b\xd8\x39\xb6" + "\xcb\xb0\x73\xb6\x7c\x7b\xec\x9c\xdb\xae\x13\x3b\xe7\x37\x91\x5e" + "\xe8\x09\x6b\x3f\x3d\xb1\xf9\xff\x96\x9e\x28\xbd\x8c\xbd\x6f\xbf" + "\x1d\x72\xff\x3f\xa3\x6f\x91\x0b\x7d\x51\x46\x4b\xb4\x75\x4c\x8f" + "\xd9\xec\x13\x7d\x41\x36\x6f\xd3\x7f\x5b\x68\xfb\x9b\x74\xdf\x69" + "\xbb\xb9\xe3\x86\x8d\x73\x29\xfa\xfe\xb6\xd9\x77\xfa\xbe\x1c\xeb" + "\xbb\x8d\xb3\x35\xfc\x40\x9f\x8d\xb3\x35\xbc\xbf\x8d\x83\x36\xcd" + "\x02\x1b\xb7\x75\x7e\x0d\x36\x4a\xe1\x2a\xb0\x77\xd2\x08\x31\xb5" + "\x7d\x40\x8a\xc0\xe6\x29\x3c\x0b\x76\x4f\x32\xd8\x3d\xf6\xdf\x4b" + "\x76\xcf\x96\x97\xdc\xed\x9e\xff\x98\x31\xa8\xdd\x13\xe8\xb4\x7b" + "\xec\x60\xd3\xf4\xfe\x3e\x66\x73\xe9\x59\x17\x1b\xe8\x57\x03\x6d" + "\xa0\x9e\x62\xd0\x39\x33\x62\xb6\xf4\x82\x1d\x34\x94\x0d\xc4\x78" + "\xdf\xcf\x0e\xfa\xf6\xd9\x40\xbf\x9b\xe3\xbb\x0d\xb4\xa5\x9f\x0f" + "\xd1\xad\xfb\xbc\xb3\x81\xb6\x1c\xf2\x38\xd7\xe3\xb3\x0d\xb4\xa5" + "\xdd\xdd\x06\xda\xba\x8b\xd7\xe9\xe5\x7d\xc3\xb7\x81\xb6\xfe\xce" + "\xb3\x0d\xb4\x75\x9b\xbb\x0d\xb4\x55\xc7\x6d\x9d\xad\xb5\xdc\x06" + "\xda\xba\x81\xa7\xbf\x5c\xeb\x9a\xee\xb4\x81\x78\x3a\xb7\x81\xb6" + "\x36\x79\xb9\x7e\x63\xb5\x83\x8e\xbd\xf6\xfb\xe6\x86\x5a\xbf\x19" + "\xa9\x7d\x73\xb7\x5e\x27\xeb\x37\xaf\xce\xbd\xa1\xa7\x87\xd2\x23" + "\x5b\xdb\x7d\xd7\x23\x65\xd7\x68\xff\xff\xb7\x49\x4f\xbf\x9a\xe5" + "\x3b\x7d\xb7\x0d\xb9\xff\x7f\x68\x3d\x5d\xb1\xdd\x39\x17\x51\xb1" + "\x7d\x78\x73\x11\x15\x93\xdc\x75\x72\xf9\x7b\x37\xe6\x22\xbc\xd5" + "\xc3\x65\x2d\xbe\xeb\xe1\xd7\xda\xdc\xf5\xf0\xeb\x3f\xf6\x4e\x0f" + "\x57\x2c\x1b\xf9\xb9\x88\x0a\x9d\xbb\x1e\x7e\x7d\x9e\x84\x85\xe7" + "\x86\xaf\x87\x5f\x9f\xea\x59\x0f\xbf\x3e\xc3\x5d\x0f\x57\xd8\xb8" + "\xbe\x7d\x7d\x21\xd7\xc3\xaf\xab\x79\x7a\xb9\xce\x35\xdd\xa9\x87" + "\x79\x3a\xd7\xc3\xaf\x2f\x1e\xde\x9a\xcb\xcd\xd7\xe9\x9a\x8b\xe6" + "\x9f\x6c\xcd\xe5\x3f\x77\xdf\xd0\x13\x97\xd2\x13\xaf\xeb\x7c\xd7" + "\x13\xdb\xc3\x7d\xd7\x13\x7f\xa8\x73\xea\x89\x3f\xd4\x0d\x4f\x4f" + "\xfc\xe1\x01\x77\x3d\xb1\xfd\xe8\x0d\x3d\xe1\xad\x9e\xf8\x2f\xa5" + "\xef\x7a\xe2\x0f\x6a\x77\x3d\xf1\xc7\xb5\xde\xe9\x89\x3f\x14\x8c" + "\xbc\x9e\xf8\xc3\x16\x77\x3d\xf1\xc7\x04\x09\x0b\x5b\x87\xaf\x27" + "\xfe\x38\xdf\xb3\x9e\xf8\xe3\x02\x77\x3d\xf1\x47\x0d\xd7\x07\x7f" + "\x4c\xe7\x7a\xe2\x8f\x73\x78\xfa\xf6\x2d\xae\xe9\x4e\x3d\xc1\xd3" + "\xb9\x9e\xf8\xe3\x86\x1b\xfb\xed\xae\xd7\xfd\x76\x95\xed\xbe\xcb" + "\xb2\x3f\xa5\x3b\x65\xd9\x9f\xd2\x3d\xef\xb7\xfb\xef\x33\xee\xfb" + "\xed\xde\xd8\x7a\x63\xbf\xdd\x50\xb2\xea\x8f\x5b\x7c\x97\x55\xff" + "\x5d\xed\x2e\xab\x76\x78\x19\x0f\xf2\x4f\x77\x8d\xbc\xac\xfa\x53" + "\xb4\xbb\xac\xda\x21\xc5\x80\x7c\x23\x71\xf8\xb2\xea\x4f\xe7\x3c" + "\xcb\xaa\x3f\x75\xbb\xcb\xaa\x3f\x49\xf1\x1f\x77\x4c\xe7\xb2\xea" + "\x4f\x52\xfc\xc7\x37\x12\x5c\xd3\x9d\xb2\x8a\xa7\x73\x59\xb5\xc3" + "\x2b\xff\xff\xce\xf5\x35\x9f\x6c\xda\xab\xb0\xbe\x36\x52\x36\xed" + "\xf5\xb2\xbe\xf6\xe6\x8d\xf5\x9f\x21\xed\xd9\x1d\x97\xe1\xf7\xff" + "\xcf\x43\xae\xff\x0c\xad\x03\x76\xee\x72\xea\x80\x9d\xbb\x3c\xad" + "\x4f\x14\x02\x86\x8a\xc0\x1e\x2d\x38\x4b\x94\xbf\xc6\xf5\x89\xa6" + "\x7a\x52\x8c\xeb\x13\xab\xe4\xf5\x89\x6d\x92\x8d\xbb\x73\xa6\xbb" + "\x8d\xfb\xd6\xde\xc1\x6c\x5c\xb4\x6d\x1d\x60\xb7\xda\xfb\xaf\x4b" + "\xfc\x7c\x70\xdd\xd1\x13\x98\x6b\xeb\xfe\x7d\xcc\x96\xe1\xe8\x8e" + "\x57\xd7\x71\xdd\xf1\xca\xb7\x4a\x77\xbc\xd9\xec\xbb\xee\xa8\xb2" + "\xba\xeb\x8e\xb7\x97\x79\xa7\x3b\x76\x3e\x37\xf2\xba\x63\x67\x96" + "\xbb\xee\x78\x3b\x56\xc2\xc3\x8a\xe1\xeb\x8e\xb7\x67\x79\xd6\x1d" + "\x6f\xdf\xe5\xae\x3b\xde\x96\xf6\x9a\xbe\xbd\x94\xeb\x8e\xb7\xc3" + "\x79\xfa\x5b\x49\xae\xe9\x4e\xdd\xc1\xd3\xb9\xee\x78\x3b\x79\x78" + "\xf3\x21\xc1\xd7\xe9\x7c\x48\xc8\x3f\xd9\x7c\xc8\xff\x5c\xc6\xf9" + "\xb7\x77\x52\xeb\xfa\xf6\xcf\xbf\x93\x3a\x60\xbc\x9e\x06\xb6\x6e" + "\x27\x5f\x73\xed\x1b\xaf\x9b\x0f\x4b\xb2\xec\x2f\xa7\xdc\x65\xd9" + "\xae\x97\x3c\xc9\xb2\xa1\xd6\x55\x71\x7c\xee\x00\x39\x87\xb1\xd6" + "\x7c\x5a\x57\x4d\xfb\x36\xc9\xaf\xb7\xb3\x7c\x97\x5f\x7f\xe9\xe7" + "\xff\xf4\x5d\x2f\xfd\x9f\xbe\xe3\xd1\xff\xa9\xdd\xe7\x3d\xf4\xef" + "\x44\xb9\xcb\xaf\x77\x25\xff\xa7\xbb\x7c\x38\x17\xf7\xce\x19\xcf" + "\xf2\xeb\x9d\x7e\xfe\x4f\xdf\x91\xd6\x4f\xdf\x95\xfc\x9f\xbe\x23" + "\xf9\x3f\xdd\x15\xe3\x9a\xee\x94\x5f\xbb\x5c\xce\xc5\xbd\x3b\xa4" + "\xff\x53\x5a\x14\x6b\x2b\x15\xc4\x2a\xb8\xaa\xa1\x8e\x93\x00\x03" + "\x46\xf8\xbf\x16\xf8\x38\x0e\xfe\x6f\xf4\xd4\xc7\x2c\x81\xb1\x36" + "\x31\x07\xea\x2c\x10\x85\xc9\xf2\x8d\xd1\x38\xd9\x8e\xbc\xd9\xc1" + "\x79\x15\x6b\x0b\xb6\x8f\x8e\x11\x69\x12\xa1\x6a\xf8\x1f\xe3\xe3" + "\x41\xfe\x20\xc0\x8c\x26\x8d\x04\x9d\x55\xbc\x5b\x27\xe7\x83\xfa" + "\x06\xb5\x2a\xde\x2d\xc0\x32\xa0\xae\xcd\xd0\x96\xb9\x1e\xeb\x0a" + "\x65\xc5\xbd\x31\x8d\x64\xda\xe9\x49\xe3\xaa\x4e\xd2\xa6\xa8\xbe" + "\x25\xb8\x63\x74\x0c\x35\xc4\x13\xb4\xb1\xaa\x26\x5b\x94\x58\xa6" + "\x71\x55\x0f\xbe\x53\xe2\x3b\x07\xd4\x51\xbf\x92\x08\x25\x9d\xa3" + "\x55\x20\x0b\xfc\x0d\x56\xda\xbe\xda\x0e\x75\x4e\xb7\x93\x8f\xa6" + "\x35\x2b\xdf\x7a\xa5\x19\x7d\x09\x85\x61\x4c\x3c\x2c\x03\x6c\x4c" + "\xa8\x4f\xf5\x8c\x72\xc8\x3f\x58\x1d\x36\xfe\x99\x44\xf8\xcf\xa4" + "\xe6\xe1\xe1\xa6\xda\xe3\xf9\xb7\xe0\xec\x69\xc4\x78\x3b\xd0\x4e" + "\x43\x84\xc1\xde\x0f\xf3\x3b\xe6\x21\x64\xa2\x0a\xe3\x69\x1a\xb6" + "\x12\x61\x93\x38\x5a\xb5\x27\x83\xc5\xb3\xb4\x74\xe5\xbe\x17\x6b" + "\x56\x4c\x4f\x42\x9a\x63\xcc\x34\x8c\xb9\x0a\xb8\x21\x90\x9e\xf0" + "\x31\xd4\xba\x3f\x2f\x52\x12\x56\x2e\xd3\xa4\xae\x58\x99\xb8\x7a" + "\x4d\xaa\x66\x46\xc2\x18\xb2\x68\xf5\x6a\xcd\xca\x65\xab\xd6\x6a" + "\x5c\xdf\xdc\xa3\x49\x58\xf1\xfc\xb2\xa7\x93\x13\x67\xad\x7c\x46" + "\x37\x06\xea\x44\x5c\xea\x11\x8a\x75\x11\x73\xdf\xd3\x95\xff\x86" + "\x90\xdf\x8e\x27\x4a\xac\x17\x7c\xaf\x49\x8e\xa9\x57\xf2\x32\xb5" + "\x0a\x90\xc7\x00\x32\x70\x93\x7e\x34\xe4\xad\x36\xbf\x06\xf5\x2a" + "\x87\x7a\x43\x1d\xa1\xce\x7f\x25\x72\x9d\x65\x4c\x18\x10\x13\xfa" + "\x4e\xc0\xe0\x5f\x6f\x09\xb6\x8d\x7e\x98\xd2\x78\x6c\x9f\x15\xfa" + "\x89\x02\xd2\x9e\x43\xbd\x04\x32\xc0\x06\xbf\x9d\x27\x63\x0c\x7f" + "\x4b\x4b\x62\x8d\x5d\xd8\x4f\x68\xd2\x7d\xbc\x4f\xbd\x1f\xfa\x84" + "\x56\x41\x78\x4c\xbf\xbf\x26\x39\x63\xfa\xbd\xcf\x62\xcb\x41\x3d" + "\x3a\x20\x3d\xcb\x4c\x2e\x6e\xc0\x74\x8c\x2d\x89\xb1\x5e\xb1\xce" + "\xd0\x2e\xd0\x8b\xd4\x48\x73\x24\xec\xe7\x57\xc4\x8b\xf9\x1f\x64" + "\x99\x94\x17\x49\x9c\x9d\xf6\xd2\x82\x8a\xf8\x06\xab\x95\x04\x67" + "\xeb\x9e\xa1\xa3\xde\xcb\x0e\xb6\xaf\x48\xc4\x98\xe4\x62\xc1\x07" + "\x59\xb4\xe0\xdd\x8c\x27\x66\x92\x10\x28\xbb\xc5\x25\xb6\xa0\x72" + "\x78\xfc\xff\x2b\xe3\x3f\xf2\x11\xea\x23\xf1\xf1\xfd\x88\x8f\x53" + "\x07\xf2\xb1\x0f\x7f\x6f\x88\x64\x2f\x60\x81\xaa\x33\xa3\xe2\x1c" + "\x9c\x8e\xd8\x77\xcf\x1b\x92\xc8\x9d\x8c\x76\xef\xb7\x89\x25\x99" + "\x1a\xb1\x28\x33\x9e\x16\x65\x46\x03\xcd\x9a\x4b\xd2\x88\x66\x89" + "\x23\x84\x14\x5f\x24\x91\x96\xe2\xcc\xa8\x40\x45\x96\x02\x6c\x0b" + "\x01\xf4\x46\x24\xc8\x8c\x48\xa9\xbf\x37\x23\x1d\xff\x06\xa3\x90" + "\xc7\x9e\x27\xe4\xe4\x3c\xe2\x57\x0e\xbf\x1b\x5e\x7b\xde\xe7\xfe" + "\x9f\x72\xdf\x4f\x7a\x0d\x7e\x8b\xb1\x21\x87\xf9\x7b\x8b\xc7\x7e" + "\xe7\x6c\xb7\x71\xf0\x76\xef\x6e\x81\x76\x57\x40\xbb\x9b\xa1\xdd" + "\x35\x83\xb4\xdb\xc8\xdb\xed\xdf\x39\xf2\xed\xde\xcd\x63\x2e\xe6" + "\xee\x5e\xea\x5b\xbb\x77\x7b\x9c\xff\x73\xb6\x5b\xef\x81\xdf\x1f" + "\x34\x89\x25\x7a\xe0\xb7\x1e\xf8\xad\x1f\x84\xdf\x7a\x89\xdf\x63" + "\x5b\x47\xbe\xdd\x1f\x54\xf0\x76\x7f\x10\xef\x5b\xbb\x3f\xf0\x28" + "\xff\x5c\xda\xed\x81\xdf\x1f\xd6\x41\xbb\x81\xdf\x7a\xe0\xb7\x7e" + "\x10\x7e\xeb\x25\x7e\x8f\xfb\x6c\xe4\xdb\xfd\x21\x9f\xff\xcf\xfd" + "\x70\xa1\x6f\xed\xfe\xb0\xf9\xd2\xed\x36\x78\xe0\xf7\x47\x35\x62" + "\x89\x01\xf8\x6d\x00\x7e\x1b\x06\xe1\xb7\x41\xe2\xf7\x0f\x0a\x47" + "\xbe\xdd\x1f\x71\xff\x37\xb9\x1f\xc5\xf8\xd6\xee\x8f\x3c\xda\x27" + "\x2e\xed\xf6\xc0\x6f\xe3\x6e\x68\x37\xf0\xdb\x00\xfc\x36\x0c\xc2" + "\x6f\x83\xc4\xef\x27\x1f\x1c\xf9\x76\x1b\xf3\x79\xbb\x8d\x51\xbe" + "\xb5\xdb\x58\xeb\x85\x5c\x8b\x01\xd9\x35\x80\xe7\xa6\xf4\xb9\x64" + "\xf6\x45\x6c\xff\x27\x11\x34\x30\x33\x66\x6c\x76\x96\xc2\xae\xce" + "\x8c\x1d\xdb\x42\x04\x18\xfb\x25\x05\x9b\x49\x00\xb4\x35\x89\x96" + "\x64\x9b\xf1\x2e\x42\x39\x76\x90\xfd\x0e\x75\x66\x74\x4f\x51\x6c" + "\xf3\xaf\x97\x13\x8d\xc1\x42\x42\x1a\xf4\x66\xa2\xd7\x51\x4b\x03" + "\x39\x4a\x02\xcd\x44\xc0\x79\xac\x03\x1d\xd5\x64\x55\x0a\xa5\x50" + "\xf6\x04\x1c\x2f\x96\x9c\x20\x91\x60\x13\x67\x51\xd0\x1f\xa5\x22" + "\xd1\x40\xf9\x91\x48\x4b\x28\xbb\x35\x78\x11\x51\x7c\xf8\xb4\x8d" + "\x20\x3d\x91\xb6\x30\xb6\x8c\x64\x74\xb5\x12\xf2\xe8\x93\x9c\xae" + "\xaf\x2e\x1f\x2e\x5d\x3f\x36\x73\xbb\x32\x73\xa9\xc9\xdc\x43\xc0" + "\xb6\x0c\xc1\x73\xcd\x90\x5e\xd6\xa0\xeb\x84\x71\xc8\xc7\x51\xb4" + "\x38\x73\xa1\x08\x3a\x6b\x78\xe5\x7e\xe2\x71\xff\x9b\x0b\xbd\x6b" + "\x81\xde\x03\xb0\xe6\xa4\xf7\x9e\x32\xa0\x77\xad\x44\xef\xba\xb1" + "\x2d\xfe\x9d\x1e\xe8\x5d\x0b\xf4\x6e\x06\x7a\xd7\x78\x4f\xef\x3d" + "\x1b\xfb\xd1\xbb\xe2\xea\xd0\x7b\xcf\x42\x89\xde\x66\x77\x7a\xef" + "\x51\x73\x7a\x7f\x52\x05\xf4\x6e\x04\x7a\x1b\x87\x59\xae\xc7\xf3" + "\x8f\x2e\x72\x1c\xf0\x3d\x50\x87\x39\xe9\xbd\x57\x4d\x03\xf5\x12" + "\xbe\xf5\x80\xef\xb1\xad\x83\xd3\x5b\x0f\xf8\xd6\x03\xbe\xf5\xc3" + "\xc0\x77\xcd\x05\x77\x7a\xeb\xaf\x12\xbe\x6b\x8c\x9c\xde\xfa\x7e" + "\xf8\xae\xc9\xe0\xf4\xae\xd1\xd0\x62\x3d\xe0\x5b\x3f\x4c\x7c\xef" + "\x0d\xf3\x82\xde\x80\xef\x81\xba\xd3\x49\xef\xff\xcd\x00\x7a\x4b" + "\xf8\xd6\x03\xbe\xc7\x7d\xe6\x81\xde\x80\x6f\x3d\xe0\x5b\x3f\x0c" + "\x7c\xff\x6f\x62\x3f\x7a\x5f\x25\x7c\xff\x6f\xa4\x44\xef\x7e\xf8" + "\xde\xdb\xc1\xe9\xbd\xb7\x14\xe8\x0d\xf8\xd6\x0f\x13\xdf\xff\x9b" + "\xef\x85\xde\x02\x7c\x0f\xd4\xd9\x4e\x7a\xff\xad\x83\x06\x1a\x24" + "\x7c\x1b\x00\xdf\x3f\x28\x1c\x9c\xde\x06\xc0\xb7\x01\xf0\x6d\x18" + "\x06\xbe\xff\x76\xd0\x9d\xde\x86\xab\x84\xef\xbf\x71\xfb\xaf\xc8" + "\xd0\x0f\xdf\x7f\x5b\xcc\xe9\xfd\x37\x42\x8b\x0d\x80\x6f\xc3\x30" + "\xf1\xfd\x37\x9b\x17\xf4\x06\x7c\x0f\xb4\x15\x9c\xf4\xde\xb7\x18" + "\xe8\x2d\xe1\xdb\x00\xf8\x7e\xf2\x41\x0f\xf4\x06\x7c\x1b\x00\xdf" + "\x86\x61\xe0\x7b\xdf\xfc\x7e\xf4\xbe\x4a\xf8\xde\x17\x22\xd1\xbb" + "\x1f\xbe\x6b\xeb\x38\xbd\x6b\x75\x40\x6f\xc0\xb7\x61\x98\xf8\xde" + "\xe7\xf1\xfc\xef\x50\xf6\xc9\xf3\xdb\x88\xca\x9d\xe6\xfb\x1b\xaf" + "\x9c\x8d\xb2\xff\xbd\x6b\x63\xa3\xec\xdf\x30\xb8\x8d\xb2\x3f\x8a" + "\xd3\x7c\x5f\x9b\x6f\x36\xca\xfe\x16\x5f\x6c\x94\x81\x34\xaf\x8b" + "\xbe\x72\x76\x4a\xdd\xac\x6b\x63\xa7\x1c\xb0\x0d\x6e\xa7\x1c\xd8" + "\xc5\x69\x7e\x20\xde\x37\x3b\xa5\x6e\xa1\x2f\x76\xca\x40\x9a\xd7" + "\x57\x5f\x39\x5b\xa5\xfe\xf5\x6b\x63\xab\xd4\x27\x0f\x6e\xab\xd4" + "\x6b\x39\xcd\xeb\xea\x7c\xb3\x55\xea\x6b\x7c\xb1\x55\x06\xd2\xdc" + "\x14\x71\xe5\xec\x15\xd3\x84\x6b\x63\xaf\x34\x98\x07\xb7\x57\x1a" + "\xa4\xf1\x4f\x43\x94\x6f\xf6\x8a\xc9\x8b\xf1\xcf\x40\x7b\x65\x20" + "\xcd\x1b\x2b\xae\x9c\xcd\xd2\x58\x70\x6d\x6c\x96\xc6\x45\x83\xdb" + "\x2c\x8d\x21\x9c\xe6\xa6\x5d\xbe\xd9\x2c\x8d\x3b\x7c\xb1\x59\x06" + "\xd2\xfc\xb3\xd0\x2b\x67\xb7\x7c\xea\xb8\x36\x76\xcb\xa7\xb5\x83" + "\xdb\x2d\x9f\x6e\xe0\x34\xff\x54\xeb\x9b\xdd\xf2\x99\xc6\x17\xbb" + "\x05\x69\x8d\x34\x47\x5b\x85\xd3\xbc\xa9\x8d\x06\x65\x6a\x7a\xc1" + "\x1e\x09\x04\xba\x07\x76\x10\x61\x1b\xd2\xbc\x99\xd3\xdc\x11\x94" + "\x6d\x06\xfa\x24\x21\xcd\x58\x3b\xfe\x11\x16\xe4\x28\xca\x8c\xa5" + "\x02\x81\xb6\xa8\x08\xf0\xec\x9c\x3d\x87\x04\x69\xf4\xd9\xf0\x7f" + "\x13\xf3\x9f\xa9\xd1\xe7\x1e\x86\x36\xfa\xe1\x1a\x85\xbd\x38\x36" + "\xcb\x11\xc8\xde\x7d\x9f\x4e\x8d\xc9\xea\x05\x5b\x82\x3e\x1b\x16" + "\x6a\xea\xa8\x22\x26\xfb\x7e\xd2\xd0\xfc\x57\x22\x06\x65\xb7\xde" + "\x69\x27\x5a\xfa\x0f\x6d\x68\x5d\xaa\x99\x38\x9e\x09\x53\x9b\xd2" + "\x6b\x01\x17\x6f\x93\xb8\x76\x7a\x91\x1e\xd3\xaa\x7b\x03\x73\xa3" + "\xa0\x1c\xa3\xa3\x38\x4f\x65\x0f\xcc\x8d\x7c\x33\xcd\x2c\xa8\x6d" + "\x44\x9b\xdc\x46\x69\xc9\xd3\x44\x59\xd2\x4a\x54\x9b\x9e\x26\xea" + "\x4d\xad\x24\xa4\xae\xad\x99\xd4\x9f\xae\x25\xf5\x9d\x87\x48\xfd" + "\x45\xb8\x7a\xe0\x12\xe1\xca\x3a\x44\xea\x3a\x08\x59\x70\x86\x10" + "\x43\x1b\xb5\xdc\xd1\x42\x42\xeb\xec\xcd\x04\xf7\xf1\x9e\x55\x7c" + "\xbe\x57\xbd\x94\x84\xd2\x63\x61\x84\x3e\x13\x26\xc0\x3b\x25\xa6" + "\x9b\xec\x16\x52\xd7\x66\xc3\xf7\xdb\xe1\xbd\xd2\xd0\x06\xe5\x8b" + "\xb5\xe8\x2f\xce\x52\x97\xb5\x8f\xd8\x0b\xec\x3a\xa0\x73\xbc\x6c" + "\x93\x95\xf4\x90\xc8\x4d\xc0\x66\xc4\x4c\x1c\xe5\x98\x79\xad\x67" + "\xb8\x98\xf9\x9c\xfb\x3f\x7b\x36\x6c\x3c\xd0\x7b\xb2\xf8\x6c\x7c" + "\xc8\x63\x87\x8e\x50\xdc\xa7\x85\xeb\x33\x0d\xd6\xfd\xc4\xb4\x41" + "\x24\x71\x6b\x09\x89\x75\x10\x82\x34\xc1\xb5\xe4\xc7\x74\x24\x18" + "\xf7\x8f\x89\xff\xd0\x8e\x37\xb5\x59\x48\xa6\x1d\xea\x7a\xd6\xd6" + "\x57\xd7\x86\x0d\x0d\x04\xde\x4d\x6e\x48\x32\x13\xb5\x8e\x84\x20" + "\x9d\xc1\x2e\x8a\x79\xac\x9d\x04\xac\xb2\x52\x8a\x34\x46\xda\x22" + "\x9d\xb1\x3c\x99\xf6\xa6\x04\x0b\x31\xd8\x48\x88\x49\x0f\xf7\x74" + "\x6a\x31\x91\x73\x04\xea\xd8\x4c\x03\xec\x3a\xc0\x47\x1b\x62\x02" + "\xf0\xd8\x0e\x38\x18\x4f\x73\x3f\x2b\x2b\x87\xf6\xe2\x1a\xfe\xf0" + "\xda\xdc\xe4\xcd\xfa\xc7\x00\x9b\xd0\x05\xcf\xb5\x1c\xcf\x5f\xee" + "\x02\x3c\x57\x00\x9e\x6b\x38\x9e\xfd\x3b\xbd\xc0\x73\x9d\x13\xcf" + "\x07\x3f\x76\xe2\xf9\xcb\xdf\x7b\xc6\xf3\x97\x0a\x09\xcf\xe6\xeb" + "\x13\xcf\x5f\xfc\x6e\x68\x3c\x7f\x91\x3a\x04\x9e\x9b\x65\x7b\x77" + "\x64\xf0\xfc\x45\xdd\x55\xc4\x73\xad\x6f\x78\xfe\xa2\xd2\x1d\xcf" + "\x07\xab\x39\x9e\x0f\x26\xfb\x86\xe7\x2f\x8d\xbe\xd8\xdb\x4e\x3c" + "\xeb\x25\xf9\xfc\xd5\x06\x1a\xa4\x07\xf9\xac\x97\xe4\xf3\xd8\xd6" + "\x4b\xe3\x59\xef\x22\x9f\x9b\x5f\x72\xe2\xf9\xab\x35\x9e\xf1\x7c" + "\xe8\x53\x8e\x67\xfd\x75\x2a\x9f\x0f\x25\x0e\x8d\xe7\x43\xd1\x9e" + "\xf1\xac\x8f\x97\xc7\x12\x23\x83\xe7\x43\x65\x57\x0f\xcf\x7a\x1f" + "\xe5\xf3\xa1\x74\x77\x3c\x37\xe7\x73\x3c\x37\xcf\xf3\x0d\xcf\x5f" + "\x79\xdc\xff\x3c\xd4\x58\xc6\x05\xcf\x92\x7c\x3e\xbc\x08\xf0\x0c" + "\xf2\x59\x2f\xc9\xe7\x71\x9f\x79\x81\x67\x17\xf9\xfc\xf7\x65\x4e" + "\x3c\x1f\x9e\xef\x19\xcf\x2d\xaf\x4b\x78\xbe\x4e\xe5\x73\xcb\x5d" + "\x43\xe3\xb9\x25\x74\x08\x3c\x37\xcb\xe3\xb4\x91\xc1\x73\x4b\xf2" + "\x55\xc4\xb3\x8f\xf2\xb9\x25\xc6\x1d\xcf\x7f\x8f\xe7\x78\xfe\xbb" + "\xda\x37\x3c\x1f\x5e\xea\xcb\x38\xd1\x89\x67\x83\x24\x9f\xcd\xd3" + "\x69\x90\x01\xe4\xb3\x41\x92\xcf\x3f\x28\xbc\x34\x9e\x0d\x2e\xf2" + "\xf9\xeb\xef\x3b\xf1\x6c\x9e\xe0\x19\xcf\x47\x9e\xe3\x78\x36\x5c" + "\xa7\xf2\xf9\x88\xff\xd0\x78\xfe\xba\xcd\x33\x9e\x0d\xf1\xf2\x18" + "\x78\x64\xf0\x7c\x64\xde\xd5\xc3\xb3\xc1\x47\xf9\x7c\x24\xcc\x1d" + "\xcf\x5f\x6b\x39\x9e\x0f\xb7\xf8\x86\x67\xb3\x47\xff\x6f\x43\x8d" + "\xc1\x5d\xf0\x2c\xc9\xe7\x56\x2b\xe0\x19\xe4\xb3\x41\x92\xcf\x4f" + "\x3e\xe8\x05\x9e\x5d\xe4\xf3\x51\x85\x13\xcf\xad\xc7\x3d\xe3\xb9" + "\xf5\x01\x09\xcf\xd7\xa9\x7c\x3e\x7a\x70\x68\x3c\x1f\xdd\x35\x04" + "\x9e\x9b\xe5\xf9\x85\x91\xc1\x73\xab\xfa\x2a\xe2\xd9\x47\xf9\x7c" + "\xb4\xdd\x1d\xcf\x66\x1b\xc7\xb3\x79\x87\x6f\x78\x3e\x46\x46\x66" + "\x7e\xe3\xb8\x15\xe7\x37\x7a\x70\x7e\xc3\xb9\xf7\x2f\x29\xb8\x91" + "\xe3\xb9\x17\xf0\xfc\xaa\x2b\x9e\xff\xde\x7f\x7e\xe3\xd8\xa7\x62" + "\x1f\x9e\x8f\x0f\xc0\xb3\x08\x78\xee\x65\x78\x6e\x73\xc8\xf3\x1b" + "\xa6\x8e\x0a\xc0\xc9\x69\x62\x5a\x08\x58\x2e\x91\xb0\xfc\x77\xc0" + "\x32\xd0\x50\x04\x1a\xd7\xb5\x34\x93\x38\x0b\xa7\x65\x0f\xd0\x58" + "\x74\xc5\x71\x4f\xbb\x80\xf8\x45\xdc\xca\x18\xae\x5f\x05\xd8\x4d" + "\xf9\x94\xd4\xa7\xc1\xb5\x0e\x2e\x3d\x5c\xe4\x53\x52\xd7\x0e\xd8" + "\x5d\xe1\x8a\xdd\x46\x09\xbb\x6d\x2f\x0d\x8d\xdd\x36\xdd\xd5\x9b" + "\xcb\x68\xe3\xf3\x5f\x7f\x8f\x0f\x89\xfb\xf1\x11\x6a\x4a\x6f\x96" + "\xf0\x79\x9a\xc4\xd9\x49\x30\x7d\x52\x3b\x5e\x1d\x4f\x42\x5e\x74" + "\x10\xa1\xf8\x69\x12\x52\xfc\x15\xb4\x5b\xee\xbf\xad\x44\xbd\xdf" + "\xf6\x57\x52\xd7\xd9\x4c\xea\x2e\xee\x23\x75\x22\x5c\xa7\xe1\x82" + "\xba\xc6\x25\xba\xb6\xdb\x22\xb5\xfb\x78\x01\x94\x35\xdd\x73\xbb" + "\x8f\x27\xb1\x76\x27\x40\xbb\x7b\x9c\xed\x36\x41\x3f\x00\xfe\x4c" + "\x16\xa5\xf9\x90\x38\x0b\x09\x58\x6d\xa7\xb4\x47\xc2\x3f\xf2\x67" + "\x7f\x93\x8d\xc4\xe9\x80\x67\xcf\x00\xfe\xdb\x2a\x89\x21\x03\xf0" + "\xdf\x63\x43\xdc\x59\x4c\x59\xdd\x80\xff\xb6\xed\x14\xe8\xd7\x8b" + "\xf8\xff\x3b\xe2\xff\x58\xad\xc8\xf0\x7f\x2c\xc3\x37\xfc\x9f\xf0" + "\x06\xff\x5e\xcc\x87\xb4\x23\xfe\x2b\x7a\x70\x3e\xc4\xb9\x07\xf4" + "\x52\xf8\x77\x91\xe7\x27\x5c\xf0\xdf\x3e\x04\xfe\x4f\xca\xf8\x37" + "\x5f\x7b\xfc\x9f\xbc\x04\xfe\x4f\x0e\x85\xff\x11\x9e\xfb\x38\x79" + "\x15\xf1\xdf\x7e\x09\xfc\xb7\x7b\x83\xff\x5a\xdf\xf0\x7f\xb2\x1f" + "\xfe\x4f\x48\xf8\x3f\xe1\x23\xfe\x4f\x79\x81\x7f\x6f\xe6\x4f\xfe" + "\x61\xc5\xf9\x93\x1e\x9c\x3f\x71\xee\x05\xbe\x04\xfe\x5d\xe7\x4f" + "\x4e\xb9\xe0\xff\x1f\x43\xe0\xff\xb4\x43\x9e\x3f\xb9\xf6\xf8\x3f" + "\x7d\x09\xfc\x9f\x1e\x02\xff\x23\x3d\x57\x72\xfa\x2a\xe2\xff\x1f" + "\x97\xc0\xff\x3f\xbc\xc0\xbf\xde\x47\xf9\x7f\xba\x1f\xfe\x4f\x49" + "\xf8\x3f\xe5\x23\xfe\x3b\xbc\xc1\xbf\x17\xf3\x2d\x67\x11\xff\x20" + "\xff\xf5\x35\x2e\x7b\xc2\x2f\x85\x7f\x17\xf9\xdf\xe1\x82\xff\xb3" + "\x43\xe0\xff\x8c\x8c\xff\xeb\x40\xfe\x9f\xb9\x04\xfe\xcf\x0c\x85" + "\xff\x11\x9e\x5b\x39\x73\x15\xf1\x7f\xf6\x12\xf8\x3f\xeb\x0d\xfe" + "\x7d\x94\xff\x67\xfa\xe1\xbf\x43\xc2\x7f\x87\x8f\xf8\xff\xc6\x0b" + "\xfc\x7b\x33\x3f\x73\x0e\xc7\xb3\x20\xff\x0d\xd1\x2e\x67\x03\x2e" + "\x81\x7f\xd7\xf9\x99\x6f\x5c\xf0\x7f\x6e\x08\xfc\x5b\x1c\xf2\xfc" + "\xcc\xb5\xc7\xbf\xe5\x12\xf8\xb7\x0c\x81\xff\x91\x9e\x8b\xb1\x5c" + "\x45\xfc\x9f\xbb\x04\xfe\xcf\x79\x81\x7f\x83\x8f\xf2\xdf\xd2\x0f" + "\xff\xdf\x48\xf8\xff\xc6\x47\xfc\x77\x7a\x83\x7f\x2f\xe6\x73\xac" + "\x6c\x3e\xa7\x07\xe7\x73\x9c\x67\x44\x2e\x85\x7f\x17\xf9\xdf\xe9" + "\x82\x7f\xeb\x10\xf8\x3f\x2f\xe3\xff\x3a\x90\xff\xe7\x2f\x81\xff" + "\xf3\x43\xe1\x7f\x84\xe7\x6e\xce\x5f\x45\xfc\x5b\x2f\x81\x7f\xab" + "\x37\xf8\xf7\x51\xfe\x9f\xef\x87\xff\x4e\x09\xff\x9d\x3e\xe2\xff" + "\xc2\x08\xcd\xff\x5c\x2c\xc3\xf9\x1f\x51\x9d\x19\xdd\x5b\x16\x93" + "\x25\x16\xe5\x46\x05\x2b\x34\xc4\xae\xce\x26\xa6\x54\x2b\x79\xec" + "\x02\xf0\x44\x77\x81\x3c\x75\x21\x04\xe3\x05\x46\x52\x18\xff\xbb" + "\x9d\x11\x85\xcb\x9e\x6f\xd7\x6d\x5a\x45\x94\x8e\xa0\x6c\x76\x8e" + "\xd0\x74\xc2\x46\xb0\xcd\x99\x48\x83\xd3\x4e\x1a\xe0\x1c\x1c\xfd" + "\x46\x1b\x52\x9e\x03\x79\x7a\xcc\xa4\x0d\xf0\x52\xd7\x66\x06\xda" + "\xaf\x63\xd8\x42\x5e\x40\x7d\xe6\xbd\x76\x96\x28\xed\xc7\xc2\x26" + "\x03\x8f\x43\x03\x5f\x20\x8a\xf0\x36\x2a\x22\x2f\x91\x47\xc8\x57" + "\xcd\x3a\xdc\xaf\x74\xf1\x77\x0d\x80\x6f\xfb\x31\xed\xe4\x72\xc8" + "\x37\xf2\xf3\x32\x17\xd9\xfa\x07\xdc\xe7\xd4\xb5\x00\x2d\x73\x2f" + "\xf8\xc8\xa7\x8b\x5e\x9c\x7f\xf1\x66\x9e\xc2\x16\x8d\xf3\x14\xc0" + "\xa7\x1a\x2f\xf9\x54\xeb\x76\xa6\x75\xc4\xf9\xd4\xd5\xe6\x1d\x9f" + "\x6c\xf7\xf6\xe3\xd3\x08\xcf\x1f\xd8\x24\x7f\x30\x5d\x2d\x9c\x4f" + "\x5d\xd3\x7d\xe3\x93\xcd\xa7\xfd\xbf\x03\xc7\xd3\xdd\x1d\x38\x9e" + "\x16\x61\x3c\xed\x1d\x9f\xf4\x31\x6e\x67\x70\x47\x9c\x4f\xdd\x45" + "\xde\xf1\xa9\xfb\xb8\x3b\x9f\x46\x7a\x9c\xdb\x2d\xc5\x83\xee\xde" + "\xc0\xf9\x64\xab\xf3\x8d\x4f\xdd\x5e\x9c\xff\xf0\x66\xdc\xd7\xbb" + "\x19\xc7\x7d\xc0\x27\x2f\xfb\x93\xbe\xd6\xed\xcc\xf0\x88\xf3\xa9" + "\x77\x8e\x77\x7c\xea\x2d\xee\xc7\xa7\x11\x1e\x8f\xf5\xc6\x73\x3e" + "\xf5\x46\x70\x3e\xf5\xa4\xfa\xc6\xa7\xde\x8a\x91\x19\x9f\x38\xe6" + "\xe1\xf8\x44\x84\xf1\x89\x77\x7c\x32\xc4\xb8\x9d\x71\x1e\x71\x3e" + "\xd9\x5b\xbc\xe3\x93\xe3\x2e\x77\x3e\x8d\xf4\xb8\xc1\x41\x38\x9f" + "\xec\x4d\x9c\x4f\xf6\x70\xdf\xf8\xe4\xf0\x18\xff\x73\x78\x76\xb4" + "\xd8\x86\x76\x34\xf0\xc9\xcb\xfe\x64\xa8\x75\x3b\x93\x3d\xe2\x7c" + "\x12\x37\x78\xc7\x27\xf1\x70\x3f\x3e\x8d\xb0\x7d\x2b\x56\x72\x3e" + "\x89\x19\x9c\x4f\x8e\x1a\xdf\xf8\x24\x7a\xb3\xff\x73\xd0\x73\x58" + "\x03\x6c\x3e\x81\x94\x5e\x57\x36\x9f\x40\x22\xbd\xe2\x95\x40\x0a" + "\xae\xa8\xcd\x27\x10\xb6\xff\x1f\xee\x5a\xce\x2b\xaa\xf3\x89\x57" + "\x02\x29\xf3\xf5\xfc\xd6\x00\xbb\x4f\x10\xe6\x5d\x57\x76\x9f\xa0" + "\xf0\x4e\xfe\x09\xc2\x5d\x57\xd4\xee\x13\x04\x2e\xff\x04\x05\x97" + "\x7f\x85\x0a\xdf\xe4\x9f\x20\x78\x21\xff\x06\x3f\xf7\x35\xc0\xf6" + "\x13\xfc\xda\xaf\x2b\xdb\x4f\xf0\xcb\xf7\x8e\x57\x7e\x47\xaf\xa8" + "\xed\x27\xf8\xed\xe0\xbc\xf2\xcb\xe2\xbc\x12\x6a\x7d\xe3\x95\x9f" + "\xc7\xf8\x2f\x97\x3a\x2f\x36\xc0\xfe\x13\xfc\xaf\x2f\xfb\x4f\xf0" + "\xf7\xce\xfe\x13\xfc\xaf\xac\xfd\x27\xf8\x73\xfb\x4f\xf0\xe7\xf6" + "\x5f\xa1\xd2\x37\xfb\x4f\xf0\xf7\xc9\xfe\x73\xe7\x95\x64\x03\x0a" + "\xa3\xa3\xae\x2b\x1b\x50\x18\x65\xf6\x8e\x57\xa3\xef\xbe\xa2\x36" + "\xa0\x30\x5a\xc9\x79\x35\xaa\x99\xf3\x6a\x94\xc6\x37\x5e\x8d\xf6" + "\x18\xff\xf0\x52\xe7\xd3\x06\xd8\x81\x82\xaa\xe3\xba\xb2\x03\x05" + "\x95\x77\xe3\x5f\x41\x75\xfc\x8a\xda\x81\x82\x8a\x8f\x7f\x05\x15" + "\x1f\xff\x16\x8e\xf6\x6d\xfc\x2b\xa8\xbc\x18\xff\x7a\x31\xef\x27" + "\x8c\x8d\x45\x1b\xd0\x51\x94\x19\x1d\x0c\xf4\x0f\x4e\x27\x42\x4f" + "\x38\xf0\x4b\x0d\xfc\xca\xd6\x90\xde\x22\xe0\x97\xc5\x4e\x1e\x7b" + "\xee\x08\x6d\xe8\x70\x90\x1e\xe0\x55\x37\xd8\x81\x26\x4b\x3b\x9e" + "\xd1\xfb\xb7\x56\x61\xcc\xf1\x27\x9f\x0b\x21\xc8\x2f\xa4\xbf\x43" + "\x65\xd7\x51\xe0\x17\xe3\x9f\x3a\x4f\x65\x2f\xca\x36\x2e\x38\x73" + "\x84\xae\x36\x53\x5a\x9f\x64\x43\xdf\x91\x59\xf5\x49\xcd\x24\xae" + "\x8d\x04\x68\x1e\x47\xbe\x8c\xf9\x1d\xa6\x9b\x2c\xcd\x04\xfd\x7e" + "\xb2\x39\xf0\x23\xda\x50\xfb\x97\x5a\x35\xfa\x6f\xc2\x73\x85\xb2" + "\x8f\x26\xd3\xe9\x2d\x8c\xff\xfd\xe7\x54\x19\xff\xbf\xd4\x86\xbc" + "\x8a\xe7\x13\x47\xdc\x16\x1c\xc3\xe6\xff\xc4\x23\x61\x93\xe5\x3a" + "\xae\x4e\xa6\x14\xea\x38\xbe\xc1\x6a\x21\x58\xcf\x06\xab\x91\x18" + "\x52\x49\x48\x43\x4f\x3b\xd1\x5b\xa9\xa5\x21\xeb\x14\x89\xbb\x80" + "\xeb\x02\x88\xa7\x31\x87\x39\xbf\xc7\xa8\xc4\x23\xda\xc9\x70\x6f" + "\x6a\x68\x24\x24\x38\x1b\x68\x6d\x27\x02\x3b\xaf\x29\x10\x15\xd0" + "\x2b\xc9\x94\xd5\x4a\x68\x50\x4e\x94\xc9\xfe\x15\xd2\x33\x09\xde" + "\xcf\xeb\x5b\x6f\x08\xca\x79\x10\xd3\x90\xb6\xb8\xcf\xd4\xa4\xb3" + "\xb0\x3c\xf2\x7b\xce\xbb\x2c\x62\x4a\xef\x21\x0d\x76\x42\xcc\x42" + "\xc0\xae\x03\xf1\xcd\x80\xaf\x00\x1f\xe5\xf6\xd8\xf8\x11\x99\xaf" + "\x14\x02\x77\xa0\xdd\x0a\xf8\xaa\xe1\x75\xf4\xef\xf4\x02\x5f\xb5" + "\x4e\x7c\x05\xce\xbf\x3c\x7c\xa9\x2f\x8c\x30\xbe\x46\xd8\x7e\x55" + "\x1b\x2f\x0f\x5f\x81\xf7\x72\x7c\xa9\x93\x38\xbe\x02\xe7\x38\xf1" + "\xe5\xdf\x79\xe5\xf0\xa5\x0e\xe5\xf8\x1a\xdb\xe4\x1b\xbe\x02\xab" + "\x47\x64\x9e\x55\x08\x51\xa3\xad\xed\x28\xd2\x4b\xf2\x6b\x6c\xeb" + "\xa5\xf1\xa5\x77\x91\x5f\xc1\xbf\xbf\x3c\x7c\x05\x3f\x31\xb2\xf8" + "\x1a\x69\x9b\x3b\x58\x73\x79\xf8\x0a\xde\xc6\xf1\x15\x54\xcb\xf1" + "\x15\xbc\xd9\x89\xaf\xb1\xad\x57\x0e\x5f\x41\xa9\x1c\x5f\x41\x73" + "\x7c\xc3\x57\x88\x4f\xfe\xaf\x06\x8e\x0f\xc6\x27\xe3\xf8\x00\xf0" + "\x25\xc9\xaf\x71\x9f\x79\x81\x2f\x17\xf9\x35\xde\xff\xf2\xf0\x35" + "\xee\x2f\x23\x8c\xaf\x11\x1e\x27\x8c\xcb\xba\x3c\x7c\x8d\x73\x70" + "\x7c\x8d\xd3\x72\x7c\x8d\xb3\x3a\xf1\x35\xee\xb3\x2b\x87\xaf\x90" + "\x26\x8e\xaf\x90\xcd\xbe\xe1\x6b\xbc\x67\xff\xcf\xc3\x99\xd7\x16" + "\x42\xeb\x70\x4c\xe3\x28\x32\x48\xf2\xeb\x07\x85\x97\xc6\x97\xc1" + "\x45\x7e\x85\x26\x5e\x1e\xbe\x42\x27\x8c\x2c\xbe\x46\x7a\x6c\xf3" + "\x1d\xf3\xe5\xe1\x2b\xf4\x17\x1c\x5f\xdf\xc9\xe7\xf8\x0a\x5d\xe4" + "\xc4\xd7\x0f\x0a\xaf\x1c\xbe\xbe\x33\x87\xe3\x6b\xbc\xd5\x37\x7c" + "\x85\x7a\xe3\xff\xf5\xd2\xf3\xf1\xc2\x4d\x11\x38\x0e\x03\x7c\x49" + "\xf2\xeb\xc9\x07\xbd\xc0\x97\x8b\xfc\x9a\xb8\xf7\xf2\xf0\x35\x71" + "\xcd\x08\xe3\x6b\x84\xc7\x63\x13\xa3\x2e\x0f\x5f\x13\x3f\xe0\xf8" + "\x9a\xd0\xce\xf1\x35\x71\x97\x13\x5f\x4f\x3e\x78\xe5\xf0\x35\x61" + "\x33\xc7\xd7\x84\x45\xbe\xe1\xeb\x26\x6f\xfc\x9f\x7a\xb9\x8e\x30" + "\xa9\xf4\xf2\xc6\x90\x93\x66\x5e\x1e\xc6\xc2\x0e\x5d\xdf\x63\xc8" + "\xb0\xed\x97\x87\xb1\x49\xb7\x70\x8c\x85\xc5\x72\x8c\x4d\x0a\xbb" + "\x3a\x63\xc8\x9b\x6c\x1c\x63\x37\x55\xfb\x86\xb1\x49\x23\xb8\xfe" + "\x31\xc5\x7a\x79\xe3\xc8\x29\xc5\x97\x87\xb1\x29\xf7\x5e\xdf\xe3" + "\xc8\x29\xaa\xcb\xc3\xd8\x94\x8d\x1c\x63\x93\xab\x38\xc6\xa6\x64" + "\x5c\x9d\x71\xe4\xe4\xc5\x1c\x63\x93\x7d\x5c\xb7\x09\xf7\x62\xff" + "\x9b\xb7\xeb\x36\xd3\xe2\x2f\x6f\x2c\x39\xf5\xdc\xe5\x61\x6c\xea" + "\xeb\xd7\xf7\x58\x72\x6a\xf2\xe5\x61\x6c\xea\x29\x8e\xb1\xa9\xa1" + "\x1c\x63\x53\xcd\x57\x67\x2c\x19\x6e\xe4\x18\x0b\xcf\xf2\x0d\x63" + "\xd3\x12\x46\x6e\xbd\x49\xb3\xfb\xf2\xc6\x93\x9a\x27\x2e\x0f\x63" + "\x1a\xff\xeb\x7b\x3c\x79\x73\xe3\xe5\x61\x4c\xb3\x80\x63\xec\xe6" + "\x74\x8e\x31\x4d\xf4\xd5\x19\x4f\xde\x3c\x9d\x63\x6c\x5a\x9b\x6f" + "\x18\xd3\x78\xe1\xff\xdf\xdb\x75\xb2\xdb\x34\x97\x37\xa6\xbc\xf5" + "\xbd\xcb\xc3\xd8\xad\x2b\xae\xef\x31\xe5\xad\x73\x2e\x0f\x63\xb7" + "\xee\xe4\x18\xbb\xa5\x85\x63\xec\xd6\xca\xab\x33\xa6\xbc\x25\x9f" + "\x63\xec\x96\x18\xdf\x30\x76\x5b\xc4\xc8\xad\xef\xcd\xd8\x70\x79" + "\xe3\xca\x19\x53\x2f\x0f\x63\xd3\xeb\xaf\xef\x71\xe5\xf4\x2d\x97" + "\x87\xb1\x19\x13\x38\xc6\xa6\x47\x71\x8c\xcd\x50\x5f\x9d\x71\xe5" + "\x6d\x1d\x1c\x63\xb7\xf9\xe6\x8f\x42\x98\x31\xc0\xff\xd5\x8a\x55" + "\x69\xcb\x92\x57\x24\x68\x56\xac\x4a\x4d\x79\x4e\xf3\xfc\x8a\x75" + "\x89\xf7\xce\x58\x13\xa1\x49\x49\xd7\xa4\xac\x58\xf5\x4b\x29\x21" + "\x61\x0c\x79\x3c\x31\x79\x59\x3a\xa6\x40\xee\x5f\xae\x5a\x99\xb8" + "\x2a\x55\x93\x92\xf8\xdc\x9a\x15\x29\x89\xf8\xff\xf3\x9a\xe5\xab" + "\x53\x20\xe1\x99\xc4\x15\x69\x89\x9a\xa7\xd7\x2c\x5f\x9e\x98\xf2" + "\xfc\x18\xb2\x60\x4d\x72\xea\x0a\x5d\x72\xa2\x26\x7a\xc1\x03\xb3" + "\x16\xcd\xff\xc9\xa2\xfb\xef\xc7\xe0\x64\x2e\xb1\xc9\xc2\x69\x51" + "\x1e\x62\x4e\x79\x42\x98\xfd\x5c\x43\x18\x61\xf1\x6c\x37\x75\x92" + "\x90\xc2\x14\xa2\x2c\xe8\x24\xaa\xe2\x4e\xa2\xd6\xfc\x8a\x44\xd1" + "\x82\x8f\x4b\x4b\x3a\x49\x28\x2d\x89\xcd\x17\x0b\xba\x2b\x68\x41" + "\xb7\xd9\x12\xd0\x8a\x69\x21\x62\xc1\xd1\x5a\xf8\x4d\x28\xd0\x56" + "\x49\x0b\xec\x0b\x5b\x85\xd9\x91\x96\x80\x63\x3a\xc3\x29\x22\xd0" + "\x31\xdf\x35\xfe\x59\xb4\x08\x1f\x63\xd4\x49\x68\x3b\x11\xbe\xd7" + "\x0c\x57\x0d\x11\xb4\xa9\x70\x6d\x80\xab\x14\xae\x6a\xb8\x8c\x70" + "\x35\xc1\x65\x86\xab\x03\x2e\x2b\x5c\x30\x82\x9b\xa9\x84\x4b\x0d" + "\x57\x3e\x5c\x95\x70\x41\xde\x99\x8d\xbc\x9c\x99\x2d\x44\xb8\x5d" + "\x05\x57\x24\x5c\x31\x70\x41\xfe\x3b\xc2\xe1\x2a\x83\x6b\x0e\x5c" + "\x51\x70\x41\xfa\x1d\xc9\x70\xe1\xef\xcd\xfc\x5d\x44\x34\x5c\x59" + "\x04\xea\x79\xe9\x2b\xa2\x02\x2e\xf8\x6e\x44\x1d\x11\x66\x45\xc0" + "\x05\xf5\x9d\x65\x1e\xe2\x37\xda\x4b\x94\x19\x13\x9c\x7d\xb3\x99" + "\xc5\xc0\x13\xb4\x77\xd1\x1c\xe2\x47\x0b\x8e\xe9\x74\xb7\x13\xc5" + "\x69\x41\xab\x30\x6d\x00\x39\xa3\xea\xae\x60\x31\x1d\xe1\x19\x69" + "\xd6\x55\xa8\x25\x66\x92\xcc\x62\xb8\x0d\x0f\x6f\x5a\x22\xfd\x3e" + "\xca\xac\x18\x15\xcf\x62\xc0\x15\xbe\x9b\x4e\x0d\xf1\xaf\xb2\xd8" + "\x6f\x40\x43\x3c\x97\x45\xf3\xdf\xb1\x50\xd5\xce\x32\xec\xf3\xc6" + "\x75\x58\xaf\xef\x1d\xe2\xfd\x0b\xde\x43\xdd\x2c\x81\xb1\xf9\x50" + "\x4f\x25\x3e\xd3\x82\xd6\xd2\x9e\xc0\x8d\x66\xfc\xbf\x7b\x5b\x4c" + "\x08\x2d\xca\x55\xe1\x38\xdb\xa8\xff\x4f\xd2\x0a\xbf\xeb\x09\xcc" + "\xab\xd4\x3c\x1e\x4c\x5b\x79\xd9\x02\xd4\x21\x59\x2e\xab\x27\x30" + "\xb6\x94\x6e\xc9\x6b\xa4\xc5\x80\x21\xa9\x3c\x11\xca\xa3\x45\xd9" + "\x55\x90\xaf\x16\xd3\x69\x59\x8c\x56\xfe\x1f\xee\x35\xb4\x24\x37" + "\x06\xef\xc1\xd9\xc4\xca\x9e\x73\xa2\x08\xbf\x87\x10\x94\x75\x1d" + "\xc2\xcc\x95\x77\x36\x12\x85\xf1\x71\xac\xf7\xcc\xb9\x86\x46\x2a" + "\x6a\xf4\x7e\xf0\xfd\x99\x77\xf7\x7d\x77\x52\x5e\x2d\xc6\x48\x15" + "\x0b\x67\x34\x62\x0c\x3e\xfc\x2d\xd6\xed\x95\xf1\x44\xf9\xda\x6f" + "\x88\x0a\xdb\xd8\x55\x38\x33\x41\x8e\x43\x87\xbf\x11\x20\xff\x23" + "\x3f\x36\x50\x97\xb2\xbf\x4f\x59\x7b\xbe\xd7\xc4\x69\x3a\x73\xb3" + "\x59\xa1\x9c\x87\xf9\x35\xb7\x32\x5a\x1e\x92\xde\x37\x23\x3f\xb1" + "\x7c\xb1\x38\x8f\xe0\x33\xc6\xb9\x0b\x06\xc4\x6a\xf4\xd3\xab\x39" + "\x8d\x72\x55\x58\x0e\xe6\x17\x4b\xb2\x91\x4f\xe9\x22\xb4\xd7\x91" + "\x43\xb4\x9a\x55\x24\xaa\x55\xb8\x5d\xe1\x28\xa8\x8e\x84\xf7\xd0" + "\xef\xaa\xe7\x40\x7e\x0d\xa3\x77\x71\x76\x85\x59\x98\x69\x85\x77" + "\x73\xfa\x62\x5f\x72\x3a\x2b\xc4\x82\xea\xe8\xae\xc2\xdb\xb5\x66" + "\xc5\x94\x68\xb9\x0d\x4c\xc6\x39\xf3\x49\x3c\xbd\x3d\xdc\x12\x50" + "\x1d\xdd\x9b\x46\x1b\x37\x7d\x45\x08\x7c\x93\xf6\x5c\xa4\x75\x19" + "\x0b\xa9\xad\xe4\xdf\x09\xa9\x5b\xda\x42\x0c\xcb\x48\xf8\xd8\x6c" + "\x6a\x89\x73\x90\xe0\xb1\x2d\xc1\xb4\x7e\x61\x0b\xc8\xe8\x0b\x24" + "\xa3\x91\xb6\x37\xe8\x76\x93\x8c\xe3\x44\x9d\xb9\x82\x84\x1a\x16" + "\x52\x8b\xbe\x8e\xda\x4c\xe9\x2d\xa4\xc1\x0a\x97\xae\x1e\xf2\x1d" + "\x84\x6b\x37\x31\xac\x25\xca\xc7\x40\x9e\xea\x2f\x10\x75\x83\xee" + "\x02\xa4\x9d\x21\x19\x4b\xa9\xbd\xbe\x0e\xf3\xed\x25\x71\x76\x4b" + "\x70\xe6\x19\xa2\x2c\xff\x77\x3c\x5b\x76\x98\xbc\x06\x75\xe9\x09" + "\xe8\x6e\xec\x2e\xb0\xc7\x9f\x4f\xa3\x76\x68\x8b\xd5\x4c\xee\xd1" + "\xb8\xb5\x05\xeb\x8c\x71\x43\xa1\xbd\x98\x47\x2c\xce\xce\x5f\x62" + "\x47\x9c\xdf\xde\x0e\xb2\x98\xc8\xef\xf1\x9d\x25\x30\x1b\xf0\x73" + "\x47\x68\x9c\x9d\x76\x61\x7e\x6c\x37\xd0\x28\x4a\x6a\x7f\x94\x9f" + "\x8e\x28\xbb\x0a\xef\x88\x37\x2b\xa6\x69\x5c\x78\x88\x3c\x19\x25" + "\x7f\x4f\xca\x93\x61\x56\x84\xb3\xd8\x8b\x22\x7b\xa7\x4d\xc0\xbc" + "\x90\x0e\xfc\x9f\xaa\xe3\xf5\xbb\x63\x31\xa6\x49\xb2\x14\xfb\x6d" + "\xb2\x88\xfd\x3a\x7f\xa7\xce\x11\x98\x1b\x42\x05\x6a\x03\x3c\x57" + "\xd2\xf3\x61\xea\xc7\xec\xd4\x26\x16\x67\x55\x80\xbc\x54\x63\x9c" + "\x54\x9e\x3f\x62\x16\xbc\xaf\xd2\xa4\xb1\xff\x27\xe0\x77\xc4\x6d" + "\x31\x04\x65\x6b\x5c\x23\xe6\x5f\x40\x4a\x52\x40\xf6\x16\xe7\x62" + "\xec\x74\xa5\x18\x98\x5d\xdd\xbd\x35\x0f\xfb\x0c\xa1\x80\x31\x5a" + "\x14\x5b\xd5\x57\x4e\x0e\xf1\x87\xfa\x74\x50\xf8\x3d\x2d\xca\xaa" + "\x90\x78\x7f\x90\x63\xf3\x8e\x76\xec\x77\x50\xaf\x54\x48\xf7\x6f" + "\x15\x22\x52\xf1\x8c\x26\x3c\xef\x60\xb1\x24\x85\x88\xb5\x1c\x33" + "\x3b\x75\x6e\xcf\x02\xd2\x0f\xfa\x24\xc8\x01\x6e\x5f\x44\x6c\x75" + "\xf6\x0b\x8e\x63\xde\xbf\xb3\xa0\x4e\x33\x9b\xc4\x1c\x3f\x11\xf2" + "\x29\x5a\x39\x1d\x84\x9e\x80\xea\xb9\x5d\x85\x11\x35\x66\x22\x9a" + "\xdd\xf8\x59\x58\x55\x8a\x71\x2b\xa1\x2e\x7e\x50\xe6\x39\xb8\x8f" + "\x86\xfb\x85\x3d\x8d\xa8\x6b\x59\xb9\x63\xf1\xff\x57\x26\x52\x4b" + "\x34\x8c\x5c\xce\x0b\x48\xf7\x59\x6a\x33\x79\x8a\xc5\x77\x2d\xc4" + "\xd8\x9d\x90\x86\x79\x20\x7d\xba\x99\x2c\xd9\xc0\xcb\xd7\xd6\x5a" + "\x51\x66\xb9\x95\x3f\xeb\x47\xbc\x7c\x5e\x2e\x96\x27\x97\xbd\xed" + "\x65\xda\x21\x95\x9d\x24\x97\x5d\x0c\x69\x72\xf9\xd1\x2b\xfb\xbe" + "\x91\x0f\xdf\x50\xbb\xb6\x61\xeb\xcb\xd4\x8a\x65\xc0\xbb\xed\x66" + "\xb2\x7c\x31\xbe\x2b\x80\x34\xfc\xad\x0b\xa6\xfc\x30\x72\xd4\x9e" + "\x3a\x56\x46\x9d\x99\x24\xb4\xb9\xca\x0d\xa0\x51\xa0\x2c\x6b\xa5" + "\xb2\x2c\x72\x59\xce\x72\x64\x4c\xed\x8e\x94\x78\x8a\xe5\xaa\xb1" + "\xdc\xae\xc2\xd9\x1a\x33\x59\xa6\x75\x6d\xbb\x24\x3b\xc3\x20\x8f" + "\x42\xc2\xa4\x02\xe5\x92\x5c\x6f\x8c\xdd\x49\x0b\x67\x60\x4c\x5b" + "\x05\xc8\x40\x02\x7d\xa9\x14\xca\x49\xea\x27\x03\x95\x98\x4f\x2c" + "\xfc\xee\x2c\x16\xbb\x74\x22\x6d\x87\x3c\x45\x6e\xf1\x3a\x05\x72" + "\x1f\xa4\x55\xc8\x71\x43\x4b\x20\x8f\x59\xf8\xee\x52\x4f\xb6\xb4" + "\xfe\x16\x22\x98\xca\xcc\x68\x93\x22\xae\xe6\x99\xc2\xad\xc4\x54" + "\x26\x12\xb1\x3c\x26\x32\x4a\x4f\x8d\x27\x84\x3b\xa7\x62\xbc\xe7" + "\xe1\xe9\xb9\xd9\x2c\xfe\x23\xed\x01\x5b\x2d\xe3\x5f\x08\xea\xb6" + "\xb3\x42\xe4\x02\x93\xa5\x93\xf5\x2f\xf8\x9f\xe9\x82\xdf\x82\x6d" + "\x87\xf6\x1d\xd8\xd4\x49\xa5\x02\xb7\xf1\x44\xc8\x5b\x8e\xe9\x68" + "\xff\x81\xed\xf9\x9a\xcb\x3b\x5a\xfe\x70\x3b\xa7\x5d\xa4\x3f\xd2" + "\x91\xd5\xd7\xfe\xb0\x11\xeb\x2c\x96\x3d\xdc\x8e\x6d\x30\xa4\x53" + "\xd1\x64\xef\x32\x62\x3c\x5d\x4d\x1a\xda\xa6\x77\x1e\x8d\xdb\x46" + "\xa8\xb8\xed\xe1\xf6\xe1\xb5\xe1\x4e\xb6\xff\x17\xec\xef\xb3\x96" + "\xa9\x0f\xb7\x63\xfc\xe4\x4d\x7a\x7f\xd5\x43\x65\xd4\x78\x7e\x5a" + "\xcc\xff\x67\xef\x7d\x00\xa2\xaa\xd2\x86\xf1\x67\x2e\x83\x0e\x04" + "\x32\x19\xd5\xd4\x52\x8d\x2d\xd6\x54\xfe\x41\xd3\x32\xd3\xa4\xc2" + "\xc2\x42\xa1\xb4\x96\xd2\xfc\x17\xba\x63\xa1\x12\x92\xa0\x02\x83" + "\x93\x15\x12\x2a\x15\x19\x16\x02\xfb\xae\xfb\x7d\xb6\xaf\xbb\xb9" + "\xef\xe7\x7e\x1f\xfb\x7e\xb6\xcd\x2e\x58\x6c\x01\xe3\xbe\xaf\xed" + "\xb2\xfb\xd9\x36\xf2\x92\xb1\x2e\xea\x14\x63\x8c\x30\x33\xe7\xf7" + "\x3c\xe7\xdc\xcb\xdc\x3b\xcc\x28\xb8\xbd\xef\xf7\x6d\xbf\xa8\xeb" + "\xdc\x7b\xce\x73\x9e\xf3\x9c\xe7\xdf\x79\xce\xb9\xe7\x9c\x9b\xd2" + "\x57\x91\xa2\x57\xbe\x4f\x3b\x32\xbc\x29\x7a\xa5\xed\x75\x72\xdb" + "\xb1\x2e\x3e\x67\x33\xb9\x86\x7f\x1f\x1b\x9f\x53\x66\x45\x92\x17" + "\xf6\xcd\x26\x2a\x8b\x6d\x4f\xad\x57\xf8\xe4\x73\xd3\xb7\xc1\x2f" + "\x3f\x25\xa5\xfc\x3e\xb3\xd8\x01\xfc\x2c\xfc\x1d\x5b\x4d\x23\xa4" + "\x8b\xcf\x7f\xb7\x63\xec\x9f\xe9\x7b\x9f\x09\xdf\x97\x72\x7e\x81" + "\x8c\x8f\xf2\x14\x59\xd5\xc9\x31\xf9\xc8\xeb\x98\x12\x71\xfe\x53" + "\xd5\x2e\xe3\xd0\x76\x4d\x79\xe7\xd2\xdb\x35\xa5\x60\x68\xbb\xa6" + "\xfc\xfe\x1b\x6e\x57\xc4\xf7\x9f\xaa\x76\x99\x87\xb6\x6b\xea\xd6" + "\x4b\x6f\xd7\xd4\x8c\xa1\xed\x9a\xfa\xce\x37\xdb\xae\xa9\x07\x87" + "\xd1\xae\x94\xa1\xed\xba\xfd\x89\x4b\x6f\xd7\xed\xc9\x43\xdb\x75" + "\xfb\xd6\x6f\xb6\x5d\xb7\x47\xfc\xfe\x59\x44\x7f\xb8\xf3\xa5\xe5" + "\xc2\x1f\x4e\x9b\x38\x72\x7f\x78\xbb\x77\xa8\x3f\x9c\xfe\x54\xd0" + "\x1f\x4e\x9f\x77\x49\xfe\x70\x67\x86\x1c\x4f\x4c\xbf\x72\x88\x3f" + "\xac\xcc\x68\x08\xef\x0f\xa7\x7d\xc9\xfd\xe1\x8e\x8c\x86\x91\xb5" + "\x61\xda\xe1\x41\x7f\x18\x9f\xd1\xa0\xf1\x87\x63\x5e\x5a\xde\x57" + "\x31\x3d\xf1\xd2\xfc\xe1\xf4\xc4\xa1\xfe\x70\x5a\x81\xd6\x1f\x4e" + "\x8f\xb8\xd6\x1b\xf5\xb0\x26\x9c\x3f\xcc\xf4\x9d\x65\xb2\x6e\xd4" + "\x8c\x90\x9e\x7d\x17\xa8\xcb\x7c\x91\xba\x46\x38\xef\x72\x87\x31" + "\x62\x5d\x86\x5f\x54\x61\x9c\x61\x2c\xf9\x11\x48\x27\x8b\x41\x6a" + "\x4f\xea\x00\x67\x91\x17\x26\xe5\xa1\x4e\xd8\x61\x56\x7b\x6d\x0f" + "\xb4\x27\x9d\x04\x16\xf3\x8b\x2a\xf6\xdf\xd2\x1b\x52\xf3\x49\x37" + "\xef\xf8\x9d\xb3\xc0\x3b\x42\xdd\xbc\xa3\x5a\xd1\xcd\x76\x1f\xea" + "\xe6\x46\xd2\xc7\x3b\xcf\x3b\x7b\x4e\xc9\xba\x79\xe7\xe7\x83\xf2" + "\xb1\x0b\xfd\x0c\xab\x9b\x68\x13\x5a\xdd\xdc\x6a\x14\xba\x79\xe7" + "\x2f\x86\xea\xe6\x56\x63\x78\xdd\xbc\x73\x87\xd0\xcd\xad\xc6\x91" + "\xb5\xe1\xce\xec\xa0\x6e\x6e\x35\x6a\x74\xf3\xa6\xf4\x86\xbe\x8a" + "\x3b\x0f\x5e\x9a\x6e\xde\x79\x50\x69\xfb\x5e\xb9\xed\x98\x66\xd4" + "\xea\xe6\x9d\x11\xbf\x75\x4d\xdf\x5f\x47\x7f\x18\x77\x4a\x9a\xd1" + "\xe8\xc7\xb8\x35\x50\xfe\x45\x79\xa6\x9f\xf5\xd1\x77\xd8\x99\x34" + "\x0d\x58\xa1\x25\xae\x0f\xc7\x94\x7d\x7d\x56\x03\x8b\xfd\xc5\xf5" + "\x6c\xc0\x04\x48\x7b\x02\xeb\xb3\x8c\x41\x9e\x25\xe3\xef\xd8\xbd" + "\x1b\x21\x11\x2f\xd3\x5e\x99\xaf\x78\x9f\xc2\x0a\x4d\xb1\x3b\x37" + "\xc2\x84\x04\x0f\x18\x90\x86\xec\x84\xad\x46\xc0\x31\x7f\x22\xdd" + "\x33\x7b\xfd\xc1\xfa\xaf\x41\x4f\xf3\x89\x81\x18\xac\xaf\x28\x81" + "\xb1\x0d\x16\xa8\xcf\x47\x7a\x24\x30\xd5\x4b\xec\xa0\xbf\xd0\x22" + "\xb1\x31\x2f\x7d\x8f\x6d\xc9\xe6\x34\x05\x92\xd3\x5d\xa8\x43\x2e" + "\x66\xb3\x52\xbd\xa9\xf4\x3d\x60\x76\x53\x7a\x17\xeb\x33\xc5\xee" + "\xf8\x1a\x26\xd4\x6f\x84\xe4\xba\x8d\x60\x61\x03\x16\x09\x79\x90" + "\xbd\xf4\x39\x23\xc9\x1d\xdb\x80\x75\x6d\xc4\xba\x50\x96\xfe\xed" + "\x58\x97\x0f\xeb\x3a\x8b\x75\x9d\xc1\xba\xec\x58\x97\x5d\xd4\x35" + "\x32\x9e\xdf\x95\x7c\xa1\x79\xdf\xcc\x92\xeb\xe9\x7c\xda\x2f\x12" + "\x8a\x46\xa7\xd3\x1c\x70\xef\x16\xeb\x08\xf5\xfd\xae\x6d\x91\xf0" + "\xef\xfa\x39\x24\x31\xc3\x89\xc6\x05\x2f\x7e\xc6\x32\x7d\x00\x2f" + "\xfe\x1c\x26\x90\xcd\xb5\x7b\x4f\xa3\x9d\x9d\x68\x3c\x62\xe9\x19" + "\x69\x5d\x11\xf7\xbf\x56\xd8\xd9\xd1\x40\x1c\x8e\x45\xe3\x5e\xb2" + "\xec\xb2\xb3\xa2\x81\xa4\x74\xe8\x4f\x4a\x37\x2f\xf3\x19\x51\xaf" + "\x58\x91\x39\x1f\xcc\x27\xa5\xd4\xe9\x1f\x1d\xc3\x3e\xe2\x49\x30" + "\x74\x4a\xa9\xb9\xb6\x3f\xd1\xfc\xdd\xcc\x32\xed\xfc\xdd\xcc\x7d" + "\x20\xcd\x4a\x04\x69\x76\x32\x48\xf7\xa4\x03\xc2\x69\xaf\x39\x39" + "\x02\xd7\xdd\x5f\x66\xbe\x73\x3d\x94\xfa\xd8\x17\x38\x3e\xf5\xee" + "\xc4\x31\x70\xe6\x2d\x3a\x97\x63\x23\xcd\x6b\xdd\xfd\x57\xe4\xe9" + "\xdf\xb0\x5f\x4a\xc0\xfb\x5f\xa2\xec\x20\x2f\x1f\xae\x38\x25\xdd" + "\x7d\xc8\x87\xf7\x09\x9e\xd1\xe9\x7e\x5b\x36\xf8\x4c\x2f\x1f\x1c" + "\xa8\x7c\x09\xfc\x38\x8e\x0d\x18\xbe\x28\xb7\xfd\x15\x92\x9c\x3d" + "\x7e\xa8\x45\xbd\x5b\xe6\x37\x90\x3d\x64\x3b\x56\x7e\x04\x27\x0b" + "\x40\xb2\x9d\x83\x78\xd6\x6b\x89\x53\xf4\x7a\x7e\x4f\x82\xb7\xa4" + "\x87\x05\x48\xbf\x69\x7e\x01\xf3\xc6\x94\x9e\xc3\xbe\xd6\xdd\x0d" + "\xb5\x38\x96\xf6\x6f\xb0\x8e\x75\xf7\x5a\xaf\x78\x3b\x00\x89\x63" + "\x3c\x60\xac\xfd\x0a\x75\x70\x03\xea\xdf\x57\xa8\xe7\x6e\xa1\xe7" + "\xb4\xff\xa6\x8e\x74\xfc\xa5\xc6\xbc\xfa\xaf\x84\x8e\x73\xbd\x23" + "\x1d\x5f\x8f\x7a\xb7\x2e\xa8\x77\xbe\x5e\xd4\xf1\x8a\xbb\x72\x6a" + "\xed\x0c\x4a\xd6\x80\x54\x7f\x6a\x34\xe5\xe9\xa2\x6f\x91\xcc\x1f" + "\x65\x79\x21\x38\x0e\x4b\x5d\xdb\x7f\x5d\xba\xd9\xfc\x28\x3b\xdb" + "\x29\xdd\xed\xc2\x74\x83\xf9\xf1\x9b\x8d\xc8\xef\xb5\x62\x7e\x26" + "\x35\x97\xc6\xee\x2e\xe4\x05\xf1\x05\xc7\xd1\x37\x77\x4a\x33\x7f" + "\x49\x7c\x2c\xdc\x0f\x51\x79\xf7\xb0\x2e\xe4\xd9\x61\xc6\xe7\x34" + "\x66\x1e\xe2\xf3\xd4\x5b\xcd\xf0\x31\x9f\x4f\x14\x65\xfc\xc8\x37" + "\x5f\x5c\xc6\x41\x94\xb7\xc9\xf1\x4c\x3f\xb7\x39\xe2\xe3\x49\x94" + "\xce\xb2\x1e\xe4\x95\x1f\x79\xd5\xc7\x7d\x41\x16\xf7\x05\xe5\xbf" + "\x30\x15\xbb\x58\x20\x33\x27\x8a\x95\x3e\x47\xef\x33\xfc\xb0\x34" + "\x0f\x58\xc9\x69\xe4\x97\xa7\x83\xfc\xc6\x98\x40\xa1\xf0\x0d\xc4" + "\xaf\xf8\x1e\x30\xb2\x8a\xff\x28\xfb\x79\x69\x4b\xb4\x1f\xf5\x97" + "\xfc\x43\xc2\x56\x5d\x0c\xda\xe5\x98\x4a\xb2\x5f\xb4\xe7\x84\xad" + "\xdc\x5f\x65\xd7\xa2\xdd\xfa\x0a\x2d\x37\x0e\x14\x5a\xcc\x78\x5d" + "\xaf\xf8\x10\xfa\x8e\xd6\x5e\xe2\x6d\xc5\x5d\xad\xe4\x3f\x9c\x45" + "\x2e\xf0\x21\x6f\xc7\x50\x7f\x53\x68\x49\xe2\x3c\xfe\xa1\x05\x26" + "\x7b\x41\x87\x34\x19\x91\x5e\xa8\x5f\x0d\x86\x36\x6b\x27\xf8\xd1" + "\x36\x14\xbe\xcf\x5f\x63\x06\xc4\x2b\x1d\xb1\x7c\xa2\xf0\x4c\x17" + "\x59\xef\xee\xb9\x37\xa8\x77\xf7\xdc\x4b\xbc\x13\x7a\x77\x4f\xea" + "\xb7\x51\xef\x3e\xce\xe6\x7a\x17\x35\x70\x1d\xd7\xa7\xc3\x4e\xdf" + "\xbf\xe0\xef\x3d\x13\x48\x47\x48\x67\x7e\xf7\x53\xd2\x99\x39\x8b" + "\xfe\x5f\xd5\x99\xf3\x7d\x16\x33\x5e\xff\x29\x3a\x83\x78\xb9\xce" + "\x10\xaf\x3e\xce\xee\x07\x85\x47\xdc\x56\xcb\x4f\x34\x9a\x6d\x30" + "\x07\x6d\x35\x37\x61\xeb\xf5\xd0\xc6\xf9\x94\x9a\x6b\x7e\x9c\x05" + "\x3a\xa5\x39\x3b\x6c\xbf\x07\x63\xbf\x9d\x31\xa7\xef\x67\x10\x88" + "\xdb\xda\xc8\xe7\xb3\x2b\xe7\x03\xbd\x1b\xa1\xf7\x22\x34\x47\x97" + "\x90\x47\xef\x42\x3a\xab\xfc\x3b\x5e\x06\x7a\x3f\xc2\x62\x7c\x59" + "\x7e\xb4\xeb\xc0\xf6\xdf\x54\x05\x62\xce\x63\x8c\x30\xe7\x98\x0b" + "\xde\x4b\xe4\x73\xf2\x95\x2f\x51\xec\x82\x3e\x73\x0e\x5f\xef\x4d" + "\xef\x4e\x30\xdf\xa3\xcc\xf9\x93\x4f\x90\xe7\xe5\xe4\x79\xbb\x54" + "\x92\x61\x2c\xcd\xdb\x09\x9f\x32\xe7\x73\x65\xde\x4e\x79\xa6\x7c" + "\x97\x34\xa7\x9b\xe6\x7c\x54\xe5\x72\x64\x38\xb9\xdc\xcc\x35\xe4" + "\xeb\x83\xe5\xc4\x33\xfa\x95\x9c\x01\x09\x0c\x61\x63\x8c\xb8\x97" + "\x69\x3c\xa1\x3f\x29\xdd\xbb\x06\x7f\x25\xfc\x8d\xc6\xdf\x28\xe4" + "\x0f\xff\x6e\xdb\xc8\xfa\xab\xd4\x06\x4e\x4f\xe5\x4b\x19\xb2\x6f" + "\xfc\x11\xb7\xc9\x5b\x21\xfe\x94\x7c\xdf\x57\x91\xea\x53\xde\x5d" + "\x0c\xc2\x07\xe5\x53\x43\x75\xa3\x8c\xf4\xe2\x7d\x8a\x78\x56\xe1" + "\xdb\xc3\x9f\x41\x9f\x84\xb2\x71\xd0\x7b\x4f\xd4\x5f\x5d\x1f\xb3" + "\xde\x23\xff\xce\xe6\xef\x5f\x50\x46\x14\xaf\xc9\xfe\xb7\x41\xd4" + "\x7b\x6f\x01\xf2\x21\x45\x5d\x6f\x38\x7e\xb8\xa4\x7b\x23\x7e\xd3" + "\x66\x64\xbc\xb8\x37\xe2\xf7\x0f\xe7\x5a\xfc\x6c\x84\xb8\x22\xee" + "\x7f\x64\x49\x0f\xba\x32\xf7\xfb\x1d\x81\x81\xec\x84\x23\xc5\xa7" + "\x47\x18\x5f\xdc\x17\xf1\xfc\x27\x7f\xdc\xd6\xa3\xbe\xda\x07\x49" + "\xf7\xe3\xda\xf7\xfb\xe0\x9d\x53\xdd\x52\xe6\x2d\xd7\x43\x7c\x17" + "\x18\x29\x7e\x9a\xdf\xf3\x3e\xa3\x18\x6a\xe7\x29\x48\xee\x3f\x9b" + "\x9d\x30\x80\xb1\xe0\x2b\xa7\x60\x56\xe0\x87\xa6\xd8\xca\xd5\xa0" + "\xef\xc7\x78\xb5\xff\x87\xd6\x84\x8f\x8f\x77\x83\x7f\xef\x83\xae" + "\x76\xd4\xfe\x3a\x84\x65\x5f\x64\x8f\x99\xb7\x9c\x79\x5b\x97\xbf" + "\x06\x99\x16\xbf\xa3\xf4\x04\xc4\xa3\x2f\x32\x3a\x8b\x7e\xc6\xdf" + "\x29\x44\x6f\x92\xcc\x4e\xdf\xe7\xb0\x63\x35\xfa\x30\xf4\x59\xb6" + "\x27\xd0\x57\xfb\xce\xc1\xdb\x6a\x5f\xfd\xcc\x3f\x05\x7d\xf5\x59" + "\xf4\xd5\x15\xe8\xab\x6d\x26\x68\xcf\x73\x00\xfa\x8e\xd1\x0b\xf2" + "\x12\xbc\xa5\x79\xe8\xb3\x37\xa1\xcf\x2e\xfa\x1c\xb8\xbf\xee\xe9" + "\x06\xf4\xb5\x63\xf6\xae\x83\xc4\x81\xf5\xe8\xb3\xcf\x5a\xaf\xd8" + "\x53\x2a\x7c\xf6\x5b\xeb\xd0\x67\xaf\xc7\x98\x78\x1d\xfa\xec\x9e" + "\x30\x3e\xfb\x4c\x84\x78\x58\xf6\x3f\xfd\xeb\x2d\xd2\x5b\x12\x83" + "\x2d\x4f\x80\xb4\xe7\xcf\xa3\x47\xa8\x27\xf7\x1f\x8b\x24\x03\xe2" + "\x37\xf1\x3f\x80\x72\x68\x43\x19\xf0\xb8\xd5\x3b\x3a\x7d\x00\xfb" + "\x34\xff\x98\x12\xf3\x4f\x4f\x75\x48\x63\x0a\xc0\xb8\x20\xef\x7d" + "\xd6\xbf\x21\x1b\xe3\xfe\xec\x78\x5f\xe5\xd6\xa3\x95\x18\x53\xfb" + "\x31\xf6\x1e\xe8\x33\x19\x90\x07\x46\x77\xa1\x35\x81\x78\x18\xb8" + "\x0e\xe5\x39\x6a\x7c\x0f\xfa\xd0\x69\x7b\x57\xc3\x8c\x81\x1d\x25" + "\x19\x6c\x47\x49\xaa\x7f\x47\x49\x1a\x96\x1d\xf3\xb0\x8b\xe4\xf2" + "\xaf\x80\x69\xcb\xd9\xce\x32\xb3\x3f\x7e\xeb\x51\x77\x7c\x49\x3a" + "\x3e\x67\x53\x7e\xe9\x0a\x88\xcf\xb4\x9c\x77\x08\x79\xfd\x04\x48" + "\x4e\x42\x5e\x9f\xc2\x0e\x1c\xf7\x51\x9f\xcb\xfb\x57\x59\x66\x38" + "\x5e\xe0\xf1\x7e\x50\x6e\x21\x7d\xac\x2c\xb7\xb6\x1e\x07\x60\x7f" + "\x32\x7a\xb0\xaf\xe5\x72\xfb\x14\x94\x7e\x16\xf9\x3d\x66\x2f\xf6" + "\xb5\x03\xdf\x54\x5f\x2b\x8f\x63\xa8\xaf\xa5\x7e\x96\xe4\xf6\xd6" + "\x88\xe5\x36\xb7\xf2\x12\xe5\xd6\x70\x69\x72\xbb\x29\x4d\x25\xb7" + "\x56\x94\x89\x03\xe5\xd6\x1c\x22\x37\x97\x4a\x6e\x2d\xf8\xdc\x11" + "\x94\xdb\xb9\x11\xc8\x2d\xfa\xab\x6f\xaf\xdc\x1e\x4c\xbb\x34\xb9" + "\x95\x5e\xa2\xbd\xdd\x54\x1b\x94\x5b\x29\xda\x5b\x29\xda\x5b\x69" + "\x88\xbd\x95\xaa\xec\xad\x14\xed\xad\x54\x65\x6f\xa7\x47\x20\xb7" + "\xcb\x3a\xbf\xbd\x72\x4b\xf7\x5d\xa2\xdc\x2e\xd5\xde\x3c\x2a\xb9" + "\xd1\xb7\xbe\xd1\xde\x4a\x43\xec\xad\x54\x65\x6f\xa5\x68\x6f\xa5" + "\x2a\x7b\xfb\x74\x04\x72\xbb\xfc\xdf\xbe\xbd\x72\x7b\xe8\xd0\xa5" + "\xc9\xcd\x76\x89\xf6\x76\x73\x46\x50\x6e\x36\xb4\x37\x1b\xda\x9b" + "\x2d\xc4\xde\x6c\x2a\x7b\xb3\xa1\xbd\xd9\x54\xf6\xf6\xde\x08\xe4" + "\x76\x47\xc5\xb7\x57\x6e\x19\xb9\x97\x28\xb7\x4b\xb4\xb7\x9b\xf7" + "\xa9\xe4\x86\xf6\x66\x43\x7b\xb3\x85\xd8\x9b\x4d\x65\x6f\x36\xb4" + "\x37\x9b\xca\xde\x4a\x46\x20\xb7\xc5\xf7\x7d\x7b\xe5\xb6\x20\xe2" + "\xfc\xa7\x22\x37\x45\x66\x24\x3f\x2e\x37\x96\x0d\x3e\x8c\x27\xff" + "\x79\xa5\x90\x1b\xc9\x8b\xcb\xae\x37\x3b\x61\x87\x2c\x33\x9f\x2c" + "\x33\xe2\x1f\xc9\x8d\xe2\x48\x2e\x37\x9d\x3e\x91\x62\x48\x1f\xc6" + "\x92\x4a\x1c\xf9\x90\x95\x79\xdb\xac\xff\x34\x18\x47\xfa\x42\xe3" + "\xc8\x35\xea\x38\xf2\x67\x1a\x79\x55\x7e\x8d\xf2\x92\x64\x79\x3d" + "\x15\x21\x8e\x5c\xfd\xdb\x08\xf2\x3a\x7a\x51\x79\xa1\x6c\x12\x07" + "\x7a\x85\xbc\xde\x92\xe3\xff\xda\xfc\xbf\x53\x5e\x1b\x50\x5e\x14" + "\xff\x7f\x0a\xd2\xdb\x4b\x47\x2a\xaf\xcc\x8b\xc6\xff\xe1\xe5\x55" + "\xda\x30\x32\x79\xdd\xe4\x09\xca\xab\xd4\xe1\xc3\x3e\x4d\xe9\xcf" + "\x82\xf2\x12\xfd\x99\x2f\xb4\x3f\x5b\xa3\xee\xcf\x86\x23\xaf\x90" + "\xfe\xec\x5b\x25\xaf\x47\x22\xce\xff\xfb\x71\x2c\xee\x47\x3f\x47" + "\xf3\x95\x63\xba\x71\x9c\xec\x63\x5f\x2c\xf0\xe0\x38\xd9\x37\x3a" + "\x7d\xd7\x3a\x48\x1e\x28\xc4\x71\x32\xca\xae\x72\x1d\xcc\xaa\x58" + "\x07\xfa\xc0\xb3\x38\x56\x3e\x85\x63\x65\xf4\x4f\xfd\x7f\xb3\x26" + "\xb4\x2e\x77\x43\x00\xc7\xca\x34\x0f\x86\xf4\x26\xb3\xbf\xe1\x58" + "\xb9\x0b\x7d\x5f\xd7\x5b\x62\xac\xfc\xb9\x32\x56\xfe\xa5\x66\xac" + "\xfc\xca\x33\xf2\x58\x59\xe6\x7f\xad\x9a\xf7\x4f\xfe\x34\xc2\x58" + "\xb9\xe5\xa2\x63\x65\x1a\x23\xbf\x4d\xe3\xe5\xb3\xd6\xb1\x7b\x64" + "\xdf\xf6\xd6\x99\xbf\x73\xac\x7c\x16\xc7\xca\x76\xc1\xfb\xb7\x46" + "\xcc\xfb\x85\x11\xd7\x7f\x90\x6d\x90\xbd\x0c\xf6\x45\xc8\x67\xa5" + "\x0f\x1a\xc0\x3e\x88\xe6\x33\xfa\x2b\x4b\x92\x51\x5f\xb9\x7d\xf0" + "\x3e\xa9\xd0\x64\x20\xdb\x20\x3b\x21\xdb\xe0\x7d\x11\xfa\x41\xec" + "\x8b\x7c\x75\xcf\xc0\x8c\xfa\x67\x60\x9a\x2f\x5e\x3b\x46\x7e\x28" + "\x87\xe4\x11\xf4\x6d\x81\x50\xdf\xb6\x4a\xed\xdb\x7e\x39\xb4\x2f" + "\xba\x98\x6f\x7b\x26\x92\xad\xb4\x5c\xd4\x56\xc8\x46\x78\x7f\x84" + "\xf6\xf2\x9f\x61\x2b\x6f\xfd\x65\xa4\xf2\x5a\x14\x71\xfd\xc7\x30" + "\xe5\xb5\x6f\x18\xf2\x6a\x60\xa3\x2c\x59\x2a\x79\x69\xc6\xc6\x2a" + "\x79\xb9\x54\xf2\x0a\x8e\x8d\x57\xa9\xc7\xc6\xc3\x91\x57\xe8\xd8" + "\xf8\xdb\x24\xaf\xc7\x23\xae\xf3\x1b\x9e\xbc\x4a\x87\x61\x5f\xa5" + "\x68\x5f\x96\x7d\x41\x79\x69\xc7\xc4\x41\x79\x95\xaa\xec\x4b\x35" + "\x26\x5e\xa5\x1e\x13\x0f\x47\x5e\xa1\x63\xe2\x6f\x93\xbc\xb2\x23" + "\xae\xff\x18\xa6\xbc\x86\x61\x5f\xa5\x64\x5f\x5e\x95\xbc\x34\x63" + "\x61\x95\xbc\x54\xf6\xa5\x8a\x1d\x56\xa9\x63\x87\xe1\xc8\x2b\x74" + "\x2c\xfc\x6d\x92\xd7\x13\x8e\xbf\x4f\x5e\xb6\x61\xd8\x97\x0d\xed" + "\xeb\x96\x8c\xa0\xbc\xb4\x63\xe0\xa0\xbc\x6c\x2a\xfb\x52\x8d\x81" + "\x57\xa9\xc7\xc0\xc3\x91\x57\xe8\x18\xf8\xdb\x24\xaf\xc5\x79\x7f" + "\xa7\xbc\x86\x61\x5f\x36\xb4\xaf\x5b\x1a\x54\xf2\xd2\x8c\x7d\x55" + "\xf2\x52\xd9\x97\x6a\xec\xbb\x4a\x3d\xf6\x1d\x8e\xbc\x42\xc7\xbe" + "\xdf\x26\x79\x3d\x65\xbe\xd0\x58\x4a\x3d\x86\xf2\xd9\x82\xf2\x22" + "\xd9\x0c\xe0\xd8\x69\x20\xae\x24\x39\xf2\xf8\xe9\x66\x5f\xa4\xf1" + "\x2e\x9d\x07\xf3\x50\x37\xed\x09\x11\x31\x21\x0b\x89\x09\xdb\xac" + "\x3f\x05\xed\x98\xf7\xbd\x21\x63\xa8\x01\x65\x8e\x62\x45\xa4\x31" + "\xef\xbf\x5e\xf2\x18\x8a\xe4\x44\xe3\x28\xdf\x06\x94\x93\x1c\xc7" + "\xbf\xfd\x77\xce\x51\x0c\xf4\x5a\xa4\xb7\x31\x8e\x2f\x5e\x81\x63" + "\xa8\x95\x23\x95\xd3\xd2\x88\xfb\xbf\x69\x9e\x88\xc6\xbc\x34\x96" + "\xa2\xf7\x8e\xed\x5d\xdd\x50\xb1\x11\x8c\xfc\xdd\x63\xb7\xf6\xdd" + "\xe3\xae\x93\x38\xa6\x5a\x8f\x72\x1b\xc8\x86\x9d\x27\x61\x56\xe5" + "\x33\x62\x4c\xa5\x8c\xa7\xda\x3d\x5e\xfe\xee\xd1\xe9\x73\xc1\x3c" + "\x17\xf3\xd6\x23\x3c\x8d\xa3\x5a\x97\xbf\x05\x64\x2b\xb6\x13\x10" + "\x4f\x32\xc0\x31\x18\x97\x87\x7a\x0c\x55\xa7\x7e\xdf\xb8\x3a\xd2" + "\x18\xea\xe2\xef\x1b\x6b\xcf\x88\xf1\x13\x7f\xdf\xf8\xff\xc4\x18" + "\x6a\x79\xc4\xf7\x1f\xf3\xdf\x11\xf3\x0d\xc4\x7b\xa7\xc5\x07\xa8" + "\x4f\x5f\x24\xf4\x88\x79\x3d\xdf\xce\x12\x33\x8d\x69\x69\x3c\xeb" + "\x2c\x6a\x81\x8a\xcd\x60\xec\xef\xcb\x4e\xc0\x31\x6a\xbc\x0f\x7d" + "\xdd\x2b\xa7\x04\xef\x4b\x4e\x83\xd1\xfd\xac\x95\xaf\x95\xa1\xb1" + "\x2c\xd9\x0a\x7f\xe7\xb8\x12\xa6\xd5\x76\xc2\x0c\x6e\x1f\x68\x17" + "\xbe\x1d\x5b\x8f\x06\xe2\x4b\xd2\xc8\x4e\xe6\x1d\x67\x5e\x92\x01" + "\xd9\xc7\xc7\xc7\x49\x36\x3f\x03\xdb\xa7\x42\x36\x5c\x2e\x92\xf6" + "\x5d\xf0\x50\xdb\xf8\xb7\x08\xf2\x69\x1c\x9e\x7c\xd6\x6b\xe5\xb3" + "\xf7\x52\xdf\x07\x2b\xeb\x23\xd7\x5b\xa4\xbd\xf2\xfb\xe0\xb7\x9e" + "\x1c\xa9\x7c\x56\x74\x5d\xa2\x7c\x1a\x2e\x51\x3e\x0e\xfe\x6e\x51" + "\x2b\x9f\x0e\x59\x3e\xcd\x34\x56\x0a\xca\xe7\xdc\x30\xe5\x13\x32" + "\x46\xfa\x56\xc9\xe7\xe9\x88\xf3\x3f\x17\x96\x4f\xe9\x25\xda\x4f" + "\x69\x2a\x7f\x87\xa8\x91\x4f\xa9\x6c\x3f\xa5\x69\x34\x36\x0a\xca" + "\xe7\xf4\x30\xe5\x13\x32\x26\xfa\x56\xc9\x67\x55\xc4\xf9\xef\x8b" + "\xc8\xe7\x12\xed\xa7\xd4\xc1\xdf\x15\x6a\xe5\x23\xdb\x4f\x69\x33" + "\x8d\x85\x82\xf2\xf9\x74\x98\xf2\x09\x9d\x3f\xfd\x36\xc9\x67\x75" + "\xf3\xa5\xc9\xc7\x76\x89\xf6\x63\x4b\xe5\xef\x04\x35\xf2\xb1\xc9" + "\xf6\x63\x4b\xa3\xb1\x4f\x50\x3e\xef\x0d\x53\x3e\x21\x63\x9e\x6f" + "\x95\x7c\xac\x11\xcf\x7f\xba\x88\x7c\x2e\xd1\x7e\x6c\x0e\xfe\xee" + "\x4f\x2b\x1f\xd9\x7e\x6c\xcd\x34\xd6\x09\xca\xa7\x64\x98\xf2\x09" + "\x19\xe3\x7c\xab\xe4\xf3\x8c\xfe\x62\xef\x8b\x94\xd8\x59\xfd\x5e" + "\x76\x00\xe3\x37\x8a\x9f\x29\x76\x6e\xf7\x34\x82\x6f\xbd\x90\x4d" + "\xc5\xd7\x60\xac\x94\x65\xc3\xdf\xc9\x3e\x2b\xde\xc9\xf2\xb8\xed" + "\xa5\xf1\x3d\x6c\xab\x3e\x91\xe2\x32\xfe\xde\x95\xbf\x9b\x38\x42" + "\x79\xd9\x03\xaa\xf8\x8d\xc6\xa8\x18\x7b\x03\x8d\x53\x6d\x9f\x8f" + "\x20\x6e\x5b\x19\x49\x2e\x17\x7f\x37\x51\xab\x5a\xc7\xa7\x8c\x3d" + "\xbf\x51\xb9\x8c\xf8\xbd\xeb\xb3\x11\xcf\x7f\xbc\xb0\x5c\x4a\x1b" + "\x46\x26\x17\xec\x6f\x5e\xba\xc9\x23\xe4\xf2\x69\x88\x5c\x4a\x3b" + "\x06\x54\xfd\xce\xf0\xe5\x12\xd2\xdf\x7c\xab\xe4\xb2\x76\x5a\xc4" + "\xb1\x26\xfa\x25\x92\x09\xad\xef\xde\xb5\x12\x92\x2b\x3a\x61\xd6" + "\xc0\xdf\x4c\xb1\x0b\xd0\xcf\x0d\x3c\x6b\x32\xb4\xa3\x8f\x2b\xf5" + "\xb0\x2f\xc6\x78\x46\xa7\x7f\x74\xcc\x0d\xed\xcb\x5d\xd0\x5f\x98" + "\x0d\x3b\x4e\xd1\x5a\xf5\x46\xd8\x9e\x4f\x63\xf9\x7f\x81\x8f\x8f" + "\x7f\x05\x0b\xf6\xb3\x01\x67\x4f\x23\x38\x36\xff\x0b\xb0\x67\x2d" + "\xb1\xf5\x08\xb3\x0c\x79\x78\x46\x5a\xdb\x73\x1e\xc7\xa3\x93\x8b" + "\xc0\x98\xd1\xc3\xbc\xed\x3d\x1f\xc1\xdb\x58\xd7\x91\x22\x00\xe2" + "\x2f\xc9\x64\xc7\x33\x34\xfe\x7c\x4f\xc8\xe4\x11\x21\x93\xb7\x54" + "\xe3\x4f\x33\xe6\x9f\xcc\x43\x79\x7c\x19\x22\x8f\xe3\xdd\x80\xfc" + "\x1d\xbd\xc0\x83\xf2\xf0\x28\xf2\x38\x0d\xa5\xcf\x91\x3c\x5c\x83" + "\xeb\x5d\xfb\x65\x79\xd4\x92\xff\xca\x03\xe3\x1e\x65\xfc\x79\x46" + "\x25\x0f\x65\x4f\x96\x5a\x1e\xca\xd8\xbf\x10\xe5\xb1\x31\x38\xfe" + "\x3c\x8f\xe3\xcf\x3d\x38\xfe\xb4\xfd\x1e\xa4\x3d\xa5\x23\x95\xc7" + "\xba\x88\xfd\xbf\x22\x0b\xea\x5b\x06\xc6\x94\x98\x49\x0e\xce\xa2" + "\x83\x40\x32\xa1\xfe\xc4\xff\x37\x93\xa1\xb8\x00\x6d\xc7\x35\x3a" + "\xbd\x9f\xe1\x98\x1f\xc7\xfb\xce\x25\x7f\x06\x9a\x33\x10\x32\x18" + "\x18\x70\xba\x1b\x81\x78\xef\xd8\xfc\x67\x2e\x87\x33\xd2\xfa\xdc" + "\xa5\x1e\x90\x26\xa1\x1e\xe2\x78\xdf\xb8\x8c\xf6\xe5\xa2\x6f\x7b" + "\x7b\x35\xcc\xc8\xc8\x63\x5e\x1a\x9b\x92\x0d\xd1\xda\x13\xf2\x6b" + "\xed\x79\xbf\x05\x9a\xd7\x19\x88\xdf\x7a\xf4\x48\x01\x00\xf9\x37" + "\xe2\x7b\xf4\xf3\x41\x39\xd1\x7a\x12\x2e\xab\xc7\x86\xb1\xce\x55" + "\x2d\xaf\x25\xae\x61\xad\x4f\xee\x97\xe7\x0b\x6a\x95\x39\xb5\x4b" + "\x9d\x2f\x50\xe6\xd4\xce\x8a\xf5\x24\xb6\x4f\xd0\x7e\x46\x2c\xaf" + "\xbc\x82\x61\xca\xab\x61\xe4\xf2\xea\x0b\x23\xaf\xe7\x92\xc2\xc8" + "\xcb\x11\x94\xd7\x4d\x69\x2a\x79\x75\xc8\xf2\x6a\x56\xc9\xab\xe5" + "\xe2\xf2\xba\xc0\xfa\xd6\x7f\x78\x79\xe5\x47\x1c\xff\x68\xe5\x55" + "\x7a\x09\xf6\x75\x36\x8c\xbc\xf2\x5b\x87\xca\xab\x54\x65\x5f\x37" + "\xd5\x06\xe5\x55\x2a\xdb\x57\xa9\xca\xbe\x4a\x87\x61\x5f\x17\x58" + "\xd7\xfa\x0f\x2f\xaf\x0d\x11\xd7\xff\x84\xc8\xeb\x12\xec\xeb\xb3" + "\x30\xf2\x2a\x28\x0e\x23\x2f\xb5\x7d\x79\x54\xf2\x92\xed\xab\x54" + "\x65\x5f\xa5\xc3\xb0\xaf\x0b\xac\x67\xfd\x87\x97\xd7\xf3\x17\x5c" + "\xff\x13\x94\x97\xed\x12\xec\xeb\xfd\x30\xf2\xda\x38\x61\xa8\xbc" + "\x6c\x2a\xfb\xba\x39\x23\x28\x2f\x9b\x6c\x5f\x36\x95\x7d\xd9\x86" + "\x61\x5f\x17\x58\xc7\xfa\x0f\x2f\xaf\xc2\x88\xf1\x5f\x88\xbc\x2e" + "\xc1\xbe\x6c\x61\xe4\x55\x78\x3c\x8c\xbc\x54\xf6\x75\xf3\x3e\x95" + "\xbc\x64\xfb\xb2\xa9\xec\xcb\x36\x0c\xfb\xba\xc0\xfa\xd5\x7f\x78" + "\x79\x15\x45\x9c\xff\x56\xcb\xab\x7f\xa7\x12\x1f\xee\xd7\xca\x0b" + "\xe3\xf5\x84\x2e\x31\xb6\x52\xe4\x15\x39\x36\xdc\x54\x3e\x28\xab" + "\xcf\x83\xb1\x21\x97\x93\xfc\x9e\x82\xe4\x43\x31\x22\xc5\x84\xfd" + "\x3b\x84\x8c\xe8\x1d\xe0\x05\xe3\xc2\xe1\xec\x7f\xba\x04\x39\x29" + "\xe3\xaa\x6f\x5c\x4e\x7f\xba\x14\x39\x6d\x8e\xb8\xff\x49\x2b\x27" + "\xa5\xdf\x1a\xae\x9c\xc2\xf5\x59\x5b\x52\x86\xca\xa9\xd4\x11\x94" + "\x93\xe8\xa7\xa8\xef\xa2\xbe\x4a\x2b\xa7\x0b\xf4\x57\xc3\xd9\x7f" + "\xf1\x0f\x2f\xa7\xe2\xc8\xfe\x4f\xe2\xdf\x36\x3f\x58\x25\x05\x1a" + "\xf1\x72\xe0\xd5\x82\x69\xd1\x98\xc6\xcf\x25\xaf\x92\xf3\xfc\x15" + "\x40\xfb\xb4\x1d\x09\xba\xe5\x74\x9e\x2e\xc1\x8c\x52\x60\x12\xb6" + "\x42\x2a\xb6\x47\xc0\x49\x50\x86\xe9\x8e\xf8\xad\xa9\xa3\x10\xbe" + "\x85\x55\xdc\x7b\x00\xd3\x46\x13\x2c\xdb\xaa\xe7\xdf\x28\x4b\xd0" + "\xf1\xb3\x6f\x64\x78\x1d\x10\x3c\xc1\x22\x9c\x41\x86\x4b\xe2\x7b" + "\x82\x25\x09\xea\x87\xd2\x16\x23\xc3\x98\x03\x76\x30\xab\x69\x8c" + "\xd7\xa5\x72\x5c\x32\x5c\xac\xdf\xfe\xe7\x6c\x82\xf5\x6f\xd5\x27" + "\xab\xe1\xd8\x7d\x40\x78\x15\xb8\xcb\x64\x7c\x16\x4d\x7b\x6f\x04" + "\x88\xdf\x6a\xe6\xf8\xe2\x7b\x24\x90\xe9\x8b\x63\xb1\xa9\x65\x1c" + "\x5e\xa7\x9f\xa0\x81\x1f\x05\xea\x76\xc4\xb3\x51\xb7\x76\xc9\x70" + "\x29\x01\x09\x52\x08\x16\xd3\xf5\x6a\x5e\xcb\xb0\x63\x14\x3e\xa2" + "\xac\xf5\xea\xf6\xfa\xb1\xfd\x7b\x05\x8d\x09\xfe\x97\x6e\xf1\xc8" + "\x6d\x99\xa1\xae\x97\xe0\xb0\xdc\x14\x59\x26\x46\x6c\xc7\xac\x41" + "\x7c\x95\x19\x5e\x05\xce\xe6\x87\x6b\x50\x46\x0e\xa7\x15\x40\x6e" + "\xf7\xe5\xac\xe2\xbe\x54\xb9\xed\xa9\x5a\x3e\xea\x5c\x0a\x1f\x51" + "\x7e\x1e\x84\x1d\x8b\x30\x69\x0a\x5e\xbf\x9d\xef\xd9\x17\xed\xb6" + "\xfb\xae\x20\xbd\x68\xeb\x06\xd2\x65\xc2\x7b\x85\x8c\x33\x5d\xb4" + "\xd9\x08\x7b\x07\x65\xad\xa7\x3c\x87\x0c\x97\xc8\xdb\x13\xbb\x20" + "\xd7\xaf\xd3\x67\x0c\x85\x35\xa8\x61\xaf\x14\xb0\x69\x49\x08\x9b" + "\x35\x14\xd6\xa8\x86\xbd\x4a\xc0\xce\x3d\x86\xb0\x8b\x86\xc2\xfa" + "\xc6\xaa\x60\xaf\x16\xb0\x0f\x56\x22\x6c\xf6\x50\x58\xb3\x1a\xd6" + "\x24\x60\xb3\x88\x86\x25\x43\x61\x53\xd5\xb0\xd7\x08\xd8\x79\x69" + "\x08\xbb\x7c\x28\x6c\x99\x1a\xf6\x5a\x01\xfb\x90\x0f\x61\x73\x42" + "\x61\xeb\xb9\x1e\xc0\x8d\xb2\x1e\x7c\x4f\xc0\x66\x1c\x42\x58\x6b" + "\x98\xb6\x45\x71\xbc\x02\x36\x49\xc0\xde\x57\x83\xb0\xb9\x61\x64" + "\xa1\x86\xbd\x4e\xc0\x3e\x65\x45\xd8\xbc\x30\xb2\x50\xc3\x5e\x2f" + "\x60\x17\xa6\x23\x6c\x41\x18\x59\xa8\x61\x6f\x10\xb0\x8b\xbc\x08" + "\x5b\x14\x86\xbf\x41\xd8\xd8\xc7\xf7\x23\x4c\x31\xf2\xe4\x68\x18" + "\xde\xaa\x71\x8e\x13\x38\xb3\xb3\x11\xbe\x2c\x0c\x6f\xd5\xb0\x37" + "\x0a\xd8\x27\x0d\x08\xbb\x6d\x28\x2c\xe8\xf6\x0a\xfe\x4e\x95\xf9" + "\xfb\x7d\x01\xbf\xb8\x11\xe1\xcb\xc3\xf0\x97\xf2\x1d\xb2\xad\x25" + "\x0b\xd8\x47\x5a\x11\xb6\x32\x0c\x7f\xd5\xb0\xe3\x05\xec\x33\x19" + "\x08\x5b\x15\x86\xbf\x6a\xd8\x9b\x04\xec\x72\xd2\xc9\xea\x30\xfc" + "\x55\xc3\xde\x2c\x60\x57\x4e\x40\xd8\x9a\x30\xf4\xde\xa8\x82\xb5" + "\x08\xd8\xa7\x89\xde\xda\x30\xb2\x50\xc3\xde\x22\x60\x9f\xed\x42" + "\xd8\x86\x30\xf2\x50\xc3\xde\x2a\x60\x57\x91\x1d\xef\x0b\x23\x0f" + "\x35\xec\x6d\x2c\xf6\x87\x71\xb2\x5f\xdc\x1f\x0a\x8b\xb2\x17\x3e" + "\xd1\x0e\x13\x58\xac\xf5\x00\xde\x13\x1c\x3f\x43\x61\x10\x9f\xdd" + "\x77\x3b\xf9\x1b\xd9\x87\x4d\x64\xb1\xcb\x8c\x32\xbe\x83\x43\xea" + "\xb6\xeb\xd5\xb0\x93\x58\xec\xa6\x09\x32\xec\xa1\xa1\xb0\x06\x35" + "\xec\x64\x16\xbb\x5e\xa1\xb3\x71\x28\xac\x71\x10\x96\xc5\xe6\x1d" + "\x46\x98\xc3\x75\xb2\x6f\x54\xd1\x39\x55\x85\x6f\x0a\x8b\xcd\xcf" + "\x95\xf1\x39\x86\xe2\x33\xab\x61\xa7\xb2\xd8\xcd\xc7\x64\xd8\xe6" + "\xa1\xb0\xa9\x6a\xd8\xdb\x59\x6c\x41\x92\x0c\xdb\x32\x14\xb6\x4c" + "\x0d\x3b\x8d\xc5\x3e\xdf\x2a\xc3\xb6\x0e\xe1\x3d\xd9\x81\x1d\x63" + "\x01\xe1\x93\xa6\xb3\xd8\xc2\x62\x19\x56\x13\x07\xa8\xfa\xe1\x3b" + "\x84\xdc\xd7\x16\xa3\xdc\xf9\xfc\x05\xfa\xfc\x8e\x70\x31\x46\xde" + "\xad\x70\xd9\x29\xe9\x45\x8b\xe8\x93\x94\xb3\xe9\x5f\xe4\xe7\x5a" + "\x05\x6a\xd3\x21\xd3\xc3\x7c\xea\xb4\x5d\x12\x3b\x3a\xd9\x03\x7a" + "\x7e\xde\x71\xfc\x4b\x16\x17\xa6\xbb\xaf\x4b\x37\xf7\x55\xbc\x38" + "\xcd\xa5\x1b\x9f\x4c\xe7\x77\xe0\x7d\xaa\x0b\xd6\x64\xd0\xfd\x2e" + "\x3b\xe3\x67\xde\xfa\x77\x66\x38\x9c\x81\x1e\x3a\xfb\xca\x8b\x38" + "\xbc\x27\xf3\x20\xca\x9c\x0f\xf4\xae\xa5\xdf\x59\xd4\x03\x88\xff" + "\x45\xb6\xde\x3a\x8b\x55\xbe\xe4\xc2\xfa\x72\x3a\xf1\x99\xd3\x80" + "\x31\x10\xf6\x95\xc7\x1d\xf9\x74\x9e\xd0\x8b\xbf\x74\xc7\xbf\xe4" + "\x62\x2f\x2c\xee\xce\x2b\x85\x1b\x90\x6e\xae\x2b\xfc\x6c\x91\xb3" + "\xd6\x7b\x02\xf1\x19\xc7\xe9\xcc\x11\x56\xf3\xb2\x43\x9c\x47\xf2" + "\xe2\x97\x9c\x66\x3b\x3b\xca\x92\x1e\x74\x07\xfa\xb7\x95\xd1\xb7" + "\x0f\x1c\xa5\xa7\xa0\x53\x95\xe7\xbe\xe6\x65\x7e\x56\x09\xdb\xfb" + "\xa0\x3b\xec\x19\x1e\x76\x48\x60\x3b\x32\xbc\x7d\x15\x2f\x99\x30" + "\x5e\x2b\x10\x6d\x7c\x29\xd9\x05\x01\xbd\x7c\x9f\xe2\xd2\xc1\x41" + "\xf9\x7e\x96\x4b\xf7\xbd\x6d\xf2\x7d\xba\x72\x96\x4a\xf8\xb3\x5d" + "\x32\x5a\xb1\x6d\x5d\x81\xb7\xb3\x0d\x14\x5f\xd2\x39\x6b\x2c\x3e" + "\xa3\xd5\x7c\x3d\x7d\xd3\x02\xdb\xb9\x23\xa3\x4b\x9c\x8f\xf9\xd2" + "\x4f\xf0\x37\x41\xfe\x75\xcb\xbf\x8c\x60\xb8\xdc\x92\xd2\xf3\x58" + "\x65\x59\x23\xb5\xad\xd4\xcf\x02\x2c\x6e\xbe\x81\x95\xff\xef\x2c" + "\x67\x51\x37\x88\x73\xa5\x5f\xfa\x3d\xc1\x71\xde\x21\x7f\x59\xcc" + "\xff\xce\xe2\x75\xed\x78\xc9\xa5\xa6\x8b\x36\xef\xa4\x4c\x99\x7a" + "\xfb\xb4\xe9\x77\xdc\x39\xe3\xae\x15\x2b\x9f\xce\x59\xb5\xfa\x87" + "\xd6\x35\xcf\x3c\x9b\xbb\x76\xdd\xfa\xbc\xe7\xf2\x37\x14\x3c\xbf" + "\xb1\xb0\x68\xd3\x66\x82\x1b\x6c\xc3\xdb\x69\x3a\x8f\x04\x58\xcf" + "\x7d\x58\xcf\xcb\x73\x39\x3d\x98\x26\xf8\xff\xf2\x34\xbd\x39\x7c" + "\x6c\xeb\xc4\x68\x93\xce\x59\xee\x91\x5e\x7e\x95\xce\x7c\x46\x39" + "\xeb\x9c\xb5\x0f\x3a\xe8\x1c\xfe\x2e\xe9\xe5\x6d\xed\xee\x07\x1d" + "\xf4\x1d\x88\x26\x53\x37\x24\xdf\x48\x67\xf5\xbf\x9c\x47\xf9\xf5" + "\x37\x01\x34\x63\xd9\x70\x38\x6f\x34\x82\xe9\xf5\xab\x98\xbb\xfa" + "\x2a\xd6\x43\xf8\xab\x77\xb3\x6e\xf7\x16\x2b\xec\xc4\x67\xd4\x35" + "\xe3\x49\xa9\x7c\x6e\x53\x12\x3f\xcf\x3c\xa9\x6e\x37\xeb\xda\x76" + "\x15\xeb\x7a\x61\x37\xeb\xa9\xbf\x8a\xb9\x92\xab\x21\xae\xaf\xe2" + "\x65\xaf\x4b\x7a\x39\x8b\xeb\x2d\xe6\x07\x62\x5f\x72\xef\xc2\xbc" + "\xc9\x3e\x88\xaa\xc7\x67\x4c\xf3\x34\x99\x05\xdd\xef\x7e\xe5\x8d" + "\xc6\xf6\x1d\x67\x03\xb9\xba\x9d\x58\x8f\x90\x53\xf9\x9a\x66\xec" + "\x49\xb1\x3e\xb7\xd3\xdb\x09\x2e\xa9\xdc\x5a\xff\x35\xaf\x2f\xc1" + "\x59\xd3\x03\x84\xef\xe7\xf9\xde\xe8\x0d\xd7\x32\x1f\xc2\xa6\x07" + "\xb6\xe4\xea\x10\x26\x19\x71\x7b\xd4\xed\xb1\xac\x5e\x5b\x60\x5e" + "\xf7\x7c\x6e\xee\x2d\xb1\x60\xe1\xbf\x9a\x6f\x48\x14\x20\x3e\x78" + "\x7d\x37\x6b\xc6\x76\x3a\xb0\xbd\x2d\x6d\x18\x41\xa3\xce\x00\xb6" + "\xa9\x0a\xf1\xbe\x87\xe9\x87\xf1\xfe\x30\xd2\xde\x22\xbe\x3b\xb0" + "\xe7\xaf\xac\xa2\xbc\x00\xe9\x6c\xa1\x73\x6a\xe9\xfc\xa9\xde\xc2" + "\x45\x3a\x6c\x77\x35\xc2\xb5\x98\xaf\x85\xf1\x27\xa5\xed\x73\x91" + "\x8e\x7d\x78\x4f\xf0\xdc\x36\x10\xbe\x59\xb4\x6b\x0f\x3f\xcb\x1e" + "\x79\xe5\xd8\x7b\x15\xab\xec\xab\xd8\x6e\xa6\xf3\xe9\xf8\xb9\xdd" + "\xf8\x8c\x7c\x69\x41\xd8\xaa\x5e\xdb\x22\x1d\x8e\xa7\x74\xf5\x83" + "\x38\xcb\xdd\x44\x13\xd1\x41\x63\xba\x8f\x31\x82\x0a\x0c\x64\xc3" + "\x44\x2f\xe8\x3e\xee\x02\xa8\xdd\xcd\x1a\xf0\xaa\xc5\xab\xe6\x23" + "\xcc\xfb\x1d\x5e\x2d\x98\xde\x8a\xbf\x1f\xe1\xef\xef\xba\xf8\x3b" + "\x38\x13\xd1\xbd\xa1\x98\x75\x4f\xae\x81\xef\x13\x7e\xd4\xad\x1f" + "\x74\x4a\x7b\x52\x89\x76\x3a\x0b\x92\xc5\x6e\x3f\xa4\x3d\x33\xef" + "\x15\x0b\x60\x3e\xfe\xce\x12\xbf\xea\xeb\x95\x6d\x78\xed\x93\xef" + "\x7b\xf0\x4a\x14\xf7\x18\x26\x48\x95\x71\x17\xbf\x42\xf1\x45\xba" + "\x2a\x8b\x86\x0f\x3b\xac\xeb\xd0\xf0\xe0\x76\xa6\x80\x54\x55\x8e" + "\x97\x43\x9b\x5e\x55\x23\xd2\xde\xc8\x11\xcf\x6f\xe4\xc9\xbf\xb5" + "\x20\xed\x46\x3e\xed\x46\xfc\xbb\x3b\x44\xda\xee\x2e\xfc\x9d\x80" + "\xd7\x8c\x90\xfa\x09\x67\x2b\xc9\x73\x80\xbe\x81\x80\xb2\x74\x49" + "\xdb\xb7\x91\x8c\x76\x09\xdd\xd2\x05\x18\x4f\x2b\x43\xdd\xaa\x0d" + "\xea\xcf\x2b\xcf\x6b\xf5\xe7\x95\xe5\x21\xfa\x53\x45\xfe\x08\x6d" + "\xa1\xb5\x5e\xe8\xcb\xe1\xde\x2d\x39\xf8\xfc\x4a\x0e\xe2\x39\x6c" + "\x5e\xca\x71\xf0\x33\x98\x77\x9d\xc2\xb1\x9f\x15\xf4\xe4\x5f\x7a" + "\xa4\x57\x7e\x49\x3a\x4b\x75\xcb\xf5\x0a\x5a\x90\x3e\x4c\x6b\x20" + "\xfa\xd6\x23\x5e\x7c\xde\x87\x70\x0d\x4e\xf8\x4a\xa1\x8d\x97\xa9" + "\x78\x06\xf5\x51\xa6\x97\x70\x52\x39\x16\x6c\x57\x19\x95\x11\x75" + "\x57\xae\xc1\x74\x1a\x2b\x82\xed\x4b\x88\xa2\xf5\xca\xa4\x93\xf4" + "\xeb\xf4\xa5\xa0\x2d\xa5\x43\xa0\x2f\x1b\x70\xb8\x9f\x82\xf6\x16" + "\xd3\x29\x55\x66\x4c\x2a\x86\x14\xc2\x47\x7e\xdd\x25\x55\x1a\xeb" + "\xc9\x16\x05\xae\x15\xc0\xcf\xbd\xda\x5e\xf6\x51\x1e\xf0\x7a\xea" + "\x88\x1e\xcc\x57\xd5\x5b\x4d\x63\xc1\x5d\x9b\x45\x5b\xb1\xae\x7d" + "\x58\xfe\x20\xb5\x9d\xf8\x89\xf9\x8d\x88\x67\x3f\xe5\xf1\xf3\xb4" + "\x45\x7b\xf6\xd1\x99\xab\xc4\x0f\x82\xa7\xef\x9a\x88\x33\xf8\xca" + "\xdb\x38\xdf\xb0\x3c\xc9\x83\x61\x1d\x84\xc3\xe6\x63\x3e\x86\xfe" + "\xe8\xc7\x9b\xbd\xd8\xb7\xef\x1c\xa7\x95\xcf\x0e\x50\xcb\x07\xcb" + "\x1d\xc4\xf2\xb4\xdf\x81\x9f\x6d\x8c\x75\x26\xd0\xb7\x14\x30\xad" + "\x2a\x50\x81\x38\x36\x7a\xf9\xfc\x08\xe2\xb9\x1c\x69\xa9\x22\x3c" + "\x48\x4f\xb3\x8c\x2b\xe3\x37\xc5\x5a\x59\xcb\xf8\xf6\x91\xcc\xb9" + "\x3d\x6f\xe6\x6d\x42\xdf\xb5\xe3\x44\x9d\xc8\x6b\x44\x98\x46\x36" + "\x80\x31\xc6\x96\x6c\xf9\x9b\x0d\x3c\xef\x90\xed\x3c\x97\x6f\xb3" + "\xf0\x6b\x3b\x75\x1b\x4a\x58\xb7\x8a\xee\x46\xe5\x1c\x58\x99\xee" + "\x43\x54\x1f\x2b\x5c\xc2\xfb\x56\xaa\x83\xca\xcb\xf8\xc8\xf7\x1d" + "\x52\x78\x35\x09\xe9\x10\xfc\xaa\x6c\xc1\xf4\x7d\xa4\x8b\x9c\x6f" + "\xe8\x47\x7b\x6d\xa4\x8b\x3b\x0e\x63\xf9\xc3\x3b\xe9\xb9\x90\x3f" + "\x67\x71\x1f\x1b\xcc\xd7\x53\xbe\x13\xc7\xda\xbb\x9e\x45\x5d\x0a" + "\x00\x7c\x3f\x11\x52\x3c\x76\xde\xb6\x03\x9e\x2d\x69\xba\x26\x1f" + "\x00\xd1\x89\x3c\x6a\xec\xab\xd8\x99\x83\x7d\xcd\x3e\xa2\x15\xfd" + "\xf5\x21\xf6\xe3\x6c\x20\x9a\xd1\x9f\xc9\xf4\xed\xfc\x44\x96\xfd" + "\x21\x6a\x23\xf1\x73\x92\xf0\x7d\x98\x57\xb5\x89\x68\x0f\xb6\x7b" + "\xe7\x41\x35\x8f\x79\xbb\x51\x0e\x24\x2f\x92\x8b\x0a\x27\xe9\x7e" + "\x15\xe2\x92\xcf\xa3\x13\xba\x41\xbc\xae\xba\x8a\xb5\x12\x7c\x10" + "\x76\x17\xff\x3e\x62\x29\xd6\x3d\x39\x0f\xfb\x74\xb4\x0b\x3a\xcb" + "\x17\xf1\x1e\xa0\x6f\xd6\x20\x8e\x46\xe2\x29\xd2\x32\x9b\xf4\x11" + "\x9f\x5b\xe5\x72\xb3\xb0\x3f\x9f\x80\xd7\xac\xa0\xfd\x57\x4d\xd4" + "\xea\xd7\xae\x50\xfb\x27\x79\x57\x05\x6c\xe9\xc0\xf5\x21\x1f\xcc" + "\x67\xa4\x5d\xbf\x93\xfb\x0e\x59\xd6\x55\xd7\x35\xa1\xbd\xa8\x70" + "\xec\x0b\x91\x75\x23\xd7\xc7\xc2\x0c\xfa\xe6\xaf\x0e\xcb\x36\xca" + "\x78\x78\x9b\xb9\x3e\xd9\xb9\x0e\xb4\xb2\x42\x6c\xe7\xa0\x1e\xec" + "\x02\x59\xce\xad\x21\x3c\x51\x7c\x57\x06\x7d\x73\x81\x7c\x12\xc6" + "\x99\xf7\xf4\x0d\x04\xfd\x12\xc9\x3e\xc0\x65\xbf\x6b\x7f\xbd\xe8" + "\x6f\x65\xbf\xb5\x4b\xe4\x5f\xa5\xd1\x61\xa2\xe5\x53\xae\xbf\x44" + "\x8b\x6d\x09\xd1\xd2\xc8\xe9\xb0\x99\xe1\x8c\x54\xb5\x88\xea\xc7" + "\xb2\x2e\xd9\x5e\x65\x5c\x3b\x0f\x11\xae\x17\xd0\x57\x11\x4d\x58" + "\x77\x2a\xf7\x7f\x0f\x70\x9e\xfc\x52\xa6\xbd\xc5\x6b\xa7\xb2\xaf" + "\xec\x3f\x2f\xf1\xb2\x2d\x78\x9f\xe4\x15\xe7\x32\xc7\x62\xf9\xfd" + "\xe6\x95\x04\xff\x46\x22\xf9\x68\xf3\x93\x74\x5f\xed\x37\x3f\x8e" + "\xba\x7a\x0a\xf4\x88\xcf\x40\x3a\xaa\xe8\x45\x8f\x54\x7d\x9a\x62" + "\x76\xe4\xf5\x01\x8c\x91\xf6\x13\xbf\x49\x97\x31\x46\x9a\xd6\x57" + "\xf1\x6a\x92\xa2\xb7\x58\x4f\x2d\xf1\x5e\xc8\xe7\xd5\x15\xa8\xc7" + "\x8d\x41\xdd\x7a\x75\x85\xcc\xc7\xfd\xc8\x47\x03\xd6\x77\x42\x6e" + "\xd7\x7e\x84\xc7\x58\xac\xfa\xf7\x32\xed\x35\x32\x7c\x89\x22\x07" + "\xd9\x56\x5b\x77\x92\xff\xe5\x32\x78\x2d\x51\x2e\xbb\x4f\xd4\xf5" + "\xda\x95\x0a\x2c\xc5\x88\xe2\xbc\xf5\xd7\xae\x24\x3f\x38\x19\x65" + "\xcf\x7d\x1f\xff\x9e\x93\x48\x23\xdb\x11\x75\x54\xf3\xef\x63\xbf" + "\x80\x71\x4f\x50\x8f\x5e\xed\x09\xf1\x4f\xe4\x8b\xab\xda\x11\x07" + "\xf9\x53\xd2\x25\xf2\xa9\x34\x66\x40\x1a\x9b\x65\xfb\x91\x69\x7e" + "\xed\x09\xad\xae\x54\xbf\x83\xba\x32\x31\x88\xfb\xb5\xf4\x70\xfd" + "\x5c\xbd\xf0\x81\xb5\x72\xdb\xf6\xc8\x6d\x3b\x20\xb7\x6d\x8f\xdc" + "\xb6\xfd\x58\x07\xf1\xed\x29\x15\x1f\x91\x6f\xaf\xff\x4e\x86\x6f" + "\x24\x5f\x1e\xb4\xd7\xd7\xa3\x15\x5b\x1e\xea\x2f\x5e\xff\x15\xd9" + "\x83\x8a\x2e\x57\x88\xbf\x68\x0c\xef\x2f\x5e\x3b\x28\xb7\xb7\x21" + "\xc4\x36\xf6\xc9\xf1\x6e\x9b\x22\x87\x76\x4f\xbf\x7c\xb6\x78\x79" + "\x1b\xf9\x4f\xaa\x5b\xdd\x07\xd5\x09\xbe\xca\xb6\xfc\xfa\x4f\x86" + "\xca\xe1\xf5\x02\xb5\x3d\x93\xac\xc9\x27\x10\x0e\x92\x29\x8f\x2b" + "\x31\x4d\xc8\xf5\xf5\x0c\xf2\x0d\x6a\x1f\x8d\xb0\xd5\x01\x46\xf6" + "\xf2\x7a\x91\xd6\x16\x5f\xeb\x92\x6d\x51\xae\xbb\x7a\x1e\xca\x28" + "\x45\x55\x6f\x4f\x48\xbd\x24\x9b\x66\xe2\x83\x2c\xd3\xe9\x4a\x9f" + "\x46\xf0\x58\xb6\xa8\xaf\xa2\xda\x1c\xd2\x3f\x56\x11\x7d\x58\x57" + "\x0d\xf7\x59\xbb\xb9\xaf\x28\xea\xe3\xf4\x54\x27\xd7\xcb\xfd\x04" + "\xa6\xa5\x88\xb4\xd7\xdd\x72\x5f\xa2\xe8\xcd\x1b\x5a\x9a\xaa\xcb" + "\xc2\xc7\x47\xaf\xd5\x28\xf1\x11\xc7\xc5\x7d\x51\xf5\x36\xb9\x7d" + "\x94\x36\x51\xa4\xbd\x96\x41\x69\x3b\x05\x1f\xaa\x19\xef\xaf\x5e" + "\x75\xcb\xfd\x15\xd9\x97\x84\xcf\xcb\xc9\xc6\xe8\x19\x71\x74\x10" + "\x7e\x67\x59\x3f\x8d\x21\x6a\x5c\x52\x95\x8f\xfc\x01\xf9\x0b\xf3" + "\x6a\xe1\x37\xcc\x0b\xf8\xef\x78\xf2\x3b\x14\x87\x50\x3e\xc2\xf5" + "\x90\x2f\xc2\xf4\xbb\xcc\x0f\x61\x5c\xf0\x37\x03\xe2\x7d\x23\x49" + "\x2e\x3b\x9f\xc7\x0a\x7f\x4b\x8f\x52\xd2\x94\x72\xe8\xb7\xfc\x54" + "\x8e\xca\x2b\xfe\x8b\x7c\x97\x8f\x7c\x93\xa8\xef\x55\x59\xc7\xf9" + "\xb8\x41\x89\x8b\x06\x24\x15\x2c\x9d\xef\x2c\x7c\xda\x71\xe1\xcf" + "\xde\x68\xa3\xb2\x5c\x7e\xe8\x2b\x4b\xcf\xb3\x13\xf5\xf9\xa0\xaf" + "\xfb\x8a\xfc\x62\x79\xab\xa0\x73\xb7\x45\x6e\xc7\x97\xbc\x1d\xc2" + "\xa7\x56\x09\x5a\xca\x5b\xeb\xfa\x29\x6f\x77\x3c\xb5\x85\xf2\x76" + "\xa9\xf2\xd8\x80\x85\xf2\x6e\xe1\x74\x85\x94\x0b\x0c\x58\x87\xc0" + "\xd7\x8b\xef\x66\x19\xea\x76\x2b\xbe\x77\xf7\x7e\x41\xe7\xee\x55" + "\x8a\xdf\x45\xbe\x7b\xc8\xf7\xf2\xbc\xd5\x32\xcc\x02\xf9\x97\xfb" + "\xf7\xdd\x6f\x08\xbe\x9a\x24\x99\xdf\x3e\xb9\x1d\xef\xf0\x71\xf6" + "\xdf\xb2\x91\xb7\xbb\x2b\x15\xde\xaa\xef\xc9\x7e\xb0\x7e\x23\x3d" + "\x73\xbd\x2f\xe6\x63\xd8\x5a\x82\x21\x9a\x44\x1f\xf1\xc6\xb6\xd0" + "\x98\x1a\xc7\x7a\xe3\xa8\x5f\x12\xb1\xea\x1e\x9d\x3c\x07\x03\x8e" + "\xfc\x7f\xc2\x7e\xe1\xcd\x0c\xc5\xc7\xb0\xbe\x74\x1c\xf3\x77\x22" + "\xcc\x9b\xfc\x1b\xb7\x74\x26\xb0\x1a\x86\xfc\xd3\xbb\xfd\x2e\x19" + "\xe7\x9b\x16\xc5\x6f\x90\x2f\x69\xf7\x74\xca\x31\xdd\x9b\x1d\x75" + "\xb2\x2f\x39\x23\xbd\xf9\x27\x6d\x1c\xf6\xe6\x9f\xb4\x3e\xa3\xe6" + "\x74\xa8\xcf\xc0\xb8\x79\x5b\x5f\xc5\x9b\x07\x34\x71\x00\xa6\x5d" + "\xd8\x77\xbc\x59\x46\x36\x4a\xdf\x59\xe0\xfe\x89\xcf\x2b\xd5\xdc" + "\xab\xd0\x4c\x7e\xb3\x77\x8b\x32\x7f\x51\xf3\x29\xc5\x6a\xda\xfa" + "\x6a\x92\x34\xbe\x93\xea\x53\xf0\xe9\x81\xce\xe9\x47\x3e\xd0\x9c" + "\xcb\x9b\x3d\xb2\x9f\x6f\xd0\xf8\x4a\xb9\x0f\x23\x3f\xa9\xed\xab" + "\xca\xdb\xb4\x7d\x55\xcd\xef\x86\xfa\xc8\x9a\x9a\xe1\xf7\x55\x35" + "\x79\xe4\xb7\x14\x1f\xa9\xf5\x05\x35\xb5\x75\x9a\x58\xb6\x26\x59" + "\x89\x65\x83\x7e\xf4\xcd\x43\xe4\xa3\xb0\xfe\x46\x51\xf7\x9e\x44" + "\xec\xf7\x4d\x4a\xdd\x98\x9f\xd1\x6e\x46\xdd\xac\x28\x2f\x43\x9d" + "\xf2\xca\x31\x20\xb7\xcd\x7e\x7e\x56\xfa\xee\x54\xd4\xbf\x58\xd2" + "\x33\xc7\xba\xaf\xa0\x2b\xd8\x57\x34\xf7\xae\x57\xf8\xbb\xe7\x27" + "\xea\xb8\x70\xef\x6e\x56\x8e\xf5\x14\xab\xdb\xb8\x03\xd3\x76\xc9" + "\x73\x08\x9c\xb7\x1c\xd7\x9e\xac\xfa\xdd\xda\xb6\x89\x76\xec\xd9" + "\x46\xed\xa0\x31\x11\xd6\x9f\x46\x71\x0f\xc6\x7c\x78\x5f\xd5\x52" + "\x3f\xa8\xf3\xaf\x24\x9d\xb7\xab\xe3\xab\xed\xc9\xe4\x2b\xe5\xb1" + "\x67\x0b\xc6\x3b\x55\xea\xb9\x98\xf9\xf7\x67\x99\xf3\xf2\xd7\xac" + "\x2b\x58\x3d\xd5\xbc\x66\xdd\x9a\x82\x35\x2b\x72\xd7\x6c\x5e\x51" + "\xb0\x66\xfd\xba\x09\x6b\x57\xfc\x70\xcd\xd3\xe6\xc2\x15\x1b\xcc" + "\x29\x45\xe3\x8b\x62\x21\x08\x3a\xd3\xbc\x62\xc3\x86\xe7\xd7\xae" + "\xca\x31\xaf\x5b\xf3\xf4\xc4\xfc\x55\x1b\x56\x15\x98\x57\xe4\xaf" + "\x7f\x7e\x5d\x8e\x79\x7c\xce\xa4\xf1\x29\x77\xe4\xc4\xaa\xe7\xd0" + "\x6e\x34\x42\x4f\xe0\xeb\xbf\x76\xef\xfa\x1a\x0c\x09\xba\xbc\xfc" + "\x84\xa2\x35\xeb\xc4\xbc\xdd\x5b\xa7\x27\x57\x43\x1e\x7d\x4b\x91" + "\xbe\x19\xc6\x2a\xde\x02\xfc\xd5\x13\x1c\xb6\xd3\x4c\xdf\x52\x44" + "\xda\x93\xfa\x2a\xde\x3a\xe8\x92\xea\x6a\xf8\xf7\xc0\x30\x1d\xdb" + "\x96\xc4\xbe\xfe\x5d\x37\xc6\x6c\x79\xb4\x2e\xb8\xfe\x6b\x48\xac" + "\xda\x08\x7a\xbc\xe2\xf0\x32\xd2\xb7\x16\xb1\x4c\x97\x4b\xaa\x05" + "\x71\xde\xf2\xdb\xdb\xdc\x31\xbf\x4a\x61\xe5\xbf\x92\xbf\x75\xf6" + "\xf6\x56\x65\xae\x37\xf3\x45\xc8\x24\xfd\xec\x94\xde\xe6\xef\x73" + "\x5e\x40\x5d\xa6\x39\xd3\xde\x5f\xdf\x97\x8a\xf1\xe0\x71\xc7\xb5" + "\x3c\x6f\xab\x47\x82\x38\xa4\x4b\xdf\x54\x9c\x02\xaf\x63\x5d\x1b" + "\x4c\x8c\xf5\x55\xbc\x9d\xae\xcc\xa7\x61\x1b\x8c\xd8\x96\x0e\xb9" + "\x1d\xb7\xf1\x76\xec\x66\xc9\xd5\x63\x91\xbe\xd7\x88\x9e\xb7\x0b" + "\x94\x36\x20\xdd\x1d\x2e\xe9\x2d\xfa\x1e\x9a\x91\xe8\x0a\x37\xd7" + "\x47\xf3\x5d\x48\xe7\x7b\x81\x8d\xc8\xb7\xeb\xc5\x77\x22\x76\xd5" + "\x09\xfb\xc3\xf6\x78\xea\xf1\x7e\xe7\x57\x10\xb7\x83\xbe\xe3\x67" + "\xbf\x81\xb5\x79\x7c\xe0\xb4\x76\x40\xc2\x26\xe6\x66\xff\xf3\xaf" + "\xdd\x72\x9b\xba\xc9\x37\xfc\x8f\x67\x3a\xf4\xd4\x26\xec\x2b\xe2" + "\xea\xbf\x8a\x38\xb7\xa8\x7f\xfd\x2a\xe6\x61\x6f\xab\x63\xae\xda" + "\x47\x88\x27\x14\x6f\xf5\xda\xe9\xbb\x70\xb5\x33\xb0\xee\x2a\x39" + "\x36\xf6\xb0\x81\x25\xaa\x58\xaa\x96\xf4\xcc\x13\x01\xb7\x41\xc1" + "\x4d\xdf\x07\xa4\x32\x42\xfe\xb5\xef\x61\x19\xb7\x0a\x7f\x4d\x28" + "\x7e\xc2\x89\xf7\x6e\xa5\x1e\x31\x0e\xaf\xa5\x98\xc0\x8d\xba\x1c" + "\x76\x3e\x1b\xeb\x4b\x7e\x6d\x37\x3b\xe6\xc4\xf4\x5d\xe7\x41\x8f" + "\xb0\xc7\xea\x77\x73\xfc\x5e\xe4\x3b\xff\x0e\xde\x0b\x57\x01\x6c" + "\x43\x98\xde\x8a\xb7\xab\x3c\xfc\x5b\x7d\x7b\xd1\xfe\xcb\xcb\x43" + "\xe7\xb2\x65\x7d\x9e\x19\xa2\xcf\xa9\xaf\x51\x4c\x58\x8d\xf8\x51" + "\x87\x76\x9d\xc3\x7e\x18\x9f\x27\x55\x83\x85\xea\xc1\xfb\xa3\x34" + "\x1f\x82\x38\xad\x4a\x7d\x0c\xf5\x7f\x67\x40\xcc\xc1\xc8\xba\x35" + "\x81\xe6\xaf\x6d\x45\x8c\x35\xa1\x7f\x27\x1a\x49\xc7\xb0\x4c\xad" + "\xa2\x53\xa8\xeb\xc7\xb8\x5e\x25\x82\x85\x55\xec\x35\xd7\x8f\x05" + "\x6e\x1f\x75\xa8\x4f\xa4\x57\x08\xdb\xa2\xe8\x14\xea\xda\x51\x82" + "\x43\x1a\x62\x0f\x6e\x4e\xd5\x93\x8f\xec\x92\xea\x66\x93\x8e\xb1" + "\x37\x1f\xee\x60\x57\x2f\xee\x10\x72\xaa\x9b\xed\xf4\x0a\x19\x04" + "\xf9\x5e\x67\x54\xf1\xfd\x28\xea\x71\x2c\xf1\x59\xcc\x55\xd7\xcd" + "\x46\xda\x8e\xf2\x58\xbc\x04\x65\xc0\xfb\xaa\xbd\x3e\x2a\x2f\xf3" + "\xb0\x35\xc8\xc3\xba\xec\x70\x3c\x0c\xe1\x9d\x5e\x7c\x2b\xb0\x2e" + "\x87\x6c\x05\xcb\x0c\x7e\xff\x2f\x9c\x2c\xb1\x0e\xbd\xbe\x1a\x0c" + "\x54\x47\x73\x22\x87\x3f\x1c\xae\x8e\x50\x3d\x6e\x6e\x00\xa0\xb9" + "\x70\x2a\x97\x9c\x48\x7c\xad\xf3\x84\x95\xef\xd3\x1a\xda\xf8\xc5" + "\x2a\xea\xe1\x75\xf1\x2d\x57\xac\xaf\x7e\xc2\x85\xe8\x4b\x36\x8b" + "\x7e\xd1\x71\x23\xe9\x73\xfd\x2a\x67\x0d\x00\xa5\xc9\xcf\x8b\x7a" + "\xb1\xaf\x09\x9d\xcf\x8f\xfc\x7e\xa1\xfe\x27\xda\xf7\x0b\xf5\xd5" + "\x91\xde\x2f\x84\xd4\x7b\x82\xea\x0d\xd4\x2f\xd2\xa9\xea\x6e\x0d" + "\x84\xa9\x5b\x29\x3f\xa9\x41\x3d\x7e\x69\x98\x42\x34\xb4\xd3\x37" + "\xc9\xbf\xb7\x48\xc7\x10\x4f\x33\xef\xb3\x1b\x52\x44\xbc\x42\x71" + "\x50\x83\x91\x60\x42\xdb\x31\xf8\x67\x48\xfc\x0d\xfd\x9c\xe7\x0f" + "\xd1\x0f\x00\x9d\x0c\x04\xd7\xb7\x28\xd9\x92\x06\x18\x58\x98\x87" + "\x38\x80\x1b\x38\x3c\xc3\x3f\x91\x24\x3f\xbb\xf9\x83\x7e\x10\x7e" + "\x30\xff\xef\xf8\x8b\x11\xf4\x72\x7c\x5e\xd0\xc9\xf5\x75\xab\x20" + "\xd2\x2e\x50\x9a\x81\x52\x24\xdc\xdf\x73\x78\x95\x2d\xc2\xf1\xaa" + "\xd9\xc0\x81\x19\xf3\x89\x8c\xc1\x67\xa6\x7e\xa6\x14\xed\x33\xfe" + "\x45\x2d\x51\x55\x70\x43\x54\x0e\x5f\x6e\xf4\xfd\xd4\xc1\x24\x94" + "\x87\xba\x4a\x23\x94\x45\xf3\x9b\x04\xfa\xc7\x8b\xf8\x2c\x98\x6f" + "\xb6\x0c\x02\x5c\xe1\xd9\xaa\x02\xff\x58\x90\x3f\xae\xe8\x02\x6d" + "\x1c\xe9\xdf\xf5\xaa\xfb\x1b\xc4\xcf\xb8\x19\xdf\x20\xfe\x0b\xff" + "\x99\x8f\xc6\x28\xb7\x41\xf5\x18\xe7\x08\x07\x1a\xe4\xff\x8d\x66" + "\x25\x49\xad\xa1\xc1\xfc\xf1\xb5\xda\xe7\x9b\xb3\xb5\xcf\xb7\xec" + "\xff\x06\x28\x07\x4e\xa4\xcd\x75\x39\xca\xac\x60\x30\x31\x21\xc4" + "\x64\x12\xaa\x42\x4c\x28\xf8\x27\x53\x13\x85\xf4\xf8\x54\xc9\xfa" + "\xf0\xd0\xff\x39\x7f\xd7\x6e\x95\x0d\xe2\x06\xb7\x71\x48\xe6\x9c" + "\x90\x34\x7a\x1e\x65\x96\xd3\xa6\xfc\x66\x08\x3c\x4f\x33\xab\x9e" + "\x75\xa9\xf8\x4f\x03\xea\x7f\xeb\x37\x41\xeb\x77\x7f\xff\x3f\xfc" + "\xd3\x91\x7d\x7c\xf7\xf7\x9f\xf4\xc7\x44\x2f\x8e\x9e\x88\xff\xd0" + "\x7f\x6c\xd0\x51\x32\x39\x83\xc9\x09\x4c\xbe\xf9\x46\xfa\xf1\xef" + "\xfe\xbe\xfb\xfb\xee\xef\xbb\xbf\xef\xfe\xbe\xfb\xfb\xee\xef\x5b" + "\xf0\xa7\xe3\xe3\x08\x26\xff\x29\xf7\x22\x8f\x86\x40\xab\xab\x79" + "\x9a\xa4\x83\x20\x04\x0e\xb7\xa7\x83\xce\x00\xa3\xf4\xdf\x5c\x94" + "\x67\x1e\x24\x68\x98\x05\x68\x9f\xcd\x14\xbc\x6e\xc7\xeb\x7b\xaa" + "\xf4\xeb\xc3\x83\xff\x17\xfc\xe9\x90\x61\x51\x38\x0e\x8c\x86\x51" + "\x30\x1a\x0c\x10\x03\xb1\x70\x19\xc4\x41\x3c\x8c\xc1\xf1\xa5\x11" + "\x2e\x87\xb1\x70\x05\x24\xc2\x95\x70\x15\x5c\x0d\x26\xb8\x06\xae" + "\x45\xca\x93\xe0\xba\xf0\x34\x97\x41\xaa\x09\xff\xc1\xff\xb3\x20" + "\x95\x3f\x2f\xff\x2e\xfd\xbf\x34\xdd\x21\xa7\x1f\x95\xd3\x5d\xdf" + "\xa5\xff\x97\xa6\x9b\xff\x2f\xff\x8e\xfb\xbf\xfa\xab\x43\xd7\x2c" + "\xbc\xb3\x2e\xac\x4f\x0c\x4d\xd5\xc9\x7f\x83\xcf\x70\x91\xf2\x43" + "\xf0\x69\xcb\x87\xfe\xa5\xe2\x35\x4d\xdc\xda\x00\xc4\x7c\x2e\x53" + "\xff\xf9\x22\x95\x54\xfe\x4a\xf5\x78\x19\xf1\x4a\xc2\xeb\x06\xbc" + "\x6e\xc3\x6b\xba\x82\x47\xc0\xd0\x94\xec\x5f\x0f\x02\xfc\x39\x1b" + "\xe0\xff\x54\xe1\xaf\x07\xe0\xf8\x04\xbc\x1c\xc0\xf5\xe2\x2f\xcb" + "\x01\x4e\x34\x04\x71\x9e\x99\x16\xa4\xae\x27\x59\xdc\x9b\xf1\x72" + "\x1f\xa6\x3b\x17\xf8\x14\xd8\xc6\xb9\x8b\xd2\xcd\x53\x26\x4d\x9b" + "\x34\x6d\xc6\x4a\xf3\xc4\x89\xe6\xa9\x29\x29\x77\x4d\x9e\x32\x75" + "\xf2\x94\x19\xe6\x29\xd3\x67\x4e\xbd\x63\xe6\xf4\x19\xe6\xb5\x9b" + "\xf2\xd7\x4c\x49\xf9\xe1\x2a\xf3\xea\x35\xf9\x6b\x0b\x57\xe4\xaf" + "\xba\x58\x8b\x2e\xe9\x8f\xc8\xbb\x2e\x00\x5c\x02\x5a\x6e\xdf\x00" + "\xd2\xfe\x32\x90\x7e\x35\x03\x82\x39\x16\xf9\xd2\xfe\xe9\x56\x1f" + "\x03\xdd\xd3\x1d\xa0\x5b\x96\x06\xba\x27\xb2\x40\xf7\x88\x0f\x74" + "\xdb\x30\x6d\xab\x03\x74\x25\x89\xa0\x2b\x34\x80\x6e\x7d\xed\xd0" + "\xb4\x1d\x07\x45\xda\x3b\x29\xa0\xdb\x97\x03\xba\xba\x59\xa0\xdb" + "\x5d\x2d\xd2\x0e\x21\xcc\xbb\xd3\xfe\x53\xda\x7c\xe9\x7f\xc3\x8d" + "\x07\x22\xff\x49\x9f\xd6\x7e\x03\x74\x7c\xf7\xf7\xdd\xdf\x77\x7f" + "\xdf\xfd\x7d\xf7\xf7\xdd\xdf\x77\x7f\xff\xc5\x7f\x5f\x49\x7a\xf8" + "\x2d\x46\x83\x7d\x76\x83\xc9\xa5\xfb\x5e\x0e\xad\x0f\x01\xda\xf7" + "\x04\x06\x7e\xce\x88\x7c\xa9\xd7\x96\xc4\xdd\xbf\x17\x80\xf6\x6e" + "\xbe\xbe\x9b\xb9\x69\x5f\x66\xda\x4f\x00\x9a\x31\x42\xa4\xf5\x2a" + "\x88\x67\x89\x0b\x9e\xcb\x10\x6b\x93\x98\x87\xf2\x69\x7d\x13\xa6" + "\x17\x60\x7a\xf3\x05\xd6\xbb\xf0\xb5\x55\x84\x33\x6d\x1c\xa7\x67" + "\x5f\x08\x1e\xc2\xd1\xe8\x82\xfc\x59\x17\xc0\x11\xa7\xd0\xe5\x91" + "\x40\x47\xf8\x7a\xed\x60\xf2\xd8\x1d\x57\x62\x59\x0f\xb6\xc9\x22" + "\xaf\x0d\xea\x61\x76\x88\x6a\x2e\xf2\xd1\x1e\x51\xdd\x49\x88\xfd" + "\x11\xfe\x4a\xf8\xfb\x06\x88\xb5\x9c\x54\x2e\x99\x70\x60\x59\x5d" + "\x9f\x3d\x26\x65\xb0\x2c\xe2\xe6\xfb\xac\x21\x76\x8d\x47\x72\x48" + "\x02\xd6\x18\x23\xc3\x4a\x08\xbb\x44\x81\x15\x79\xd2\x3c\x39\xef" + "\x32\xcc\x2b\xd2\xe6\xe9\x5f\x93\xf3\xe2\x30\xaf\x3a\x84\x3e\xbd" + "\xb3\xdf\x07\x27\x21\xe6\x00\xd2\x62\xa6\x3d\x49\x54\x46\x86\xbf" + "\x1c\xe1\x9b\xb5\xb8\x00\xe4\xbc\xb1\x98\xe7\xd2\xe6\xfd\x3a\x45" + "\xce\xbb\x1a\xf3\x7c\xda\x3c\x9d\x52\xce\xd4\x67\x8f\x35\x85\x69" + "\x27\xd5\xaf\x13\x75\x53\x1b\x62\x67\x21\x4c\x19\xc1\x2c\x32\x97" + "\x01\xc9\x8a\xf2\x9a\x1a\x06\xeb\x27\x98\xe5\x0a\x1e\x17\x96\x57" + "\xf1\x14\x79\x19\x5b\xac\x94\x4f\x33\x13\x0e\xe0\x3c\x24\x3c\x2e" + "\x88\x49\x27\x3c\xf4\x8c\xf7\x49\xd4\x6e\xf9\xde\x4c\xed\xd3\xae" + "\xd9\xc1\x21\x0f\x44\xe3\xa0\x66\x14\x5e\xa3\x0d\x8a\x0e\x6c\x30" + "\xb1\x80\xed\x1a\x5a\x97\xd5\x74\x30\x60\x67\xe0\x2c\xf2\x82\xf9" + "\x5a\xb0\x75\xc2\x65\x26\x5a\xf7\xb3\x73\x33\x18\x6c\x79\xcc\x4b" + "\x7b\xd9\xdb\xdd\x3d\x60\x73\xb3\x6e\x3a\xbb\xa8\xf4\x1c\x18\xe8" + "\x5b\x90\xa5\xcf\x81\xa9\xb9\xf8\xf3\xb0\x6b\x8d\x02\x12\x03\x5b" + "\x12\x95\xed\x82\xf6\xda\x2e\xb0\xd5\x6a\xcb\xda\xae\x03\x53\x1b" + "\x9d\x83\x64\x87\x04\xa2\xa3\xd9\xec\x03\x5f\x6c\xd3\xc1\xe2\x3d" + "\xa0\xb7\x8d\x03\xa9\x2d\xc7\xa1\xd0\xe2\x22\x5a\xb6\x9d\x02\xc3" + "\x8f\x57\xa3\x0e\x9d\x22\x7a\x3f\x3e\xf8\xee\x66\xaf\xd4\x64\xca" + "\x80\x26\xd3\x71\x68\x36\xcd\x86\xe6\xa2\x34\xd8\x79\x0a\xe2\x9a" + "\xbc\xb3\xa0\x59\xff\x00\xda\x58\x1a\x38\x7b\xf0\xde\xec\x47\x18" + "\x0f\xdf\xc7\x71\x12\x2e\x3b\x5a\xfd\x0c\x18\x5c\x02\x27\xf2\xf7" + "\xb2\xe3\xca\x9e\x04\x7a\x0e\xd7\x8e\x0d\xd7\x80\x09\xe9\xeb\x46" + "\x5a\xee\xea\x84\xb8\x2b\x93\x4d\x90\x82\x34\x8f\x76\xd6\xf8\x40" + "\x5f\x0c\x31\x11\x6c\x2b\x91\xef\x67\x46\xdd\xac\xdb\xcd\xba\x49" + "\x47\x7b\xb7\x64\xa3\x9d\xc6\x65\x60\xdd\x3d\xf2\x3a\xbf\x1e\xdb" + "\x8f\x40\xdf\x5b\x98\x4d\xeb\x9b\xbb\x30\xcf\xaa\xe4\xd1\x3e\x6d" + "\xda\x7f\x3d\x39\x91\xbe\x05\x94\x0a\xef\xf7\x77\xd3\x1a\xc2\x1e" + "\x5a\xd7\x49\xf8\x12\x8a\x20\x0a\xdb\x13\x8d\xf4\xdc\x55\x8f\xe9" + "\xdf\x47\x38\x2c\xbf\xdf\x05\x87\xb8\x1e\xb1\xab\x17\x7b\x02\x57" + "\x2f\x3e\x17\x78\x73\x71\x2f\x7b\x73\xf1\x57\xfe\x37\x17\x7f\x69" + "\xdb\x04\x06\xff\xd5\x8b\xdd\xed\x79\x5c\x06\xc6\xf6\xbc\xd3\xb4" + "\x1e\xd0\x40\x67\xa3\x2f\x7d\x0e\x65\xef\xfb\x14\x4a\xd6\x80\x29" + "\x10\xf3\x91\xd5\xe9\xfb\x04\x96\x16\x03\xc3\xfb\xa2\x70\xed\xeb" + "\x8d\xfd\xd8\x2d\x6c\xc8\x80\x6d\x8a\x37\xbb\xa4\xdf\xee\xa7\x7a" + "\xdd\x31\xff\xee\xc6\xcb\x83\x97\x17\x2f\x1f\x8b\xfd\xd8\x87\xbc" + "\xb2\x8d\xd9\xaa\x03\xda\x87\x30\x39\x00\xba\x53\x10\x3f\x0b\xe9" + "\x37\x46\xe0\x5b\x52\xa0\xe2\x84\xfb\xe6\x32\x28\xed\xeb\xb3\xd2" + "\x7e\x70\x37\xf9\x25\xf2\x53\x58\x4f\x39\xd6\xd3\xcd\x6d\x71\x37" + "\xf3\xb0\xd8\x13\xb4\x27\xbe\xdb\xb3\xc5\xaa\x73\x6f\xb1\x4a\xbd" + "\xb1\x27\x7a\x11\xe6\x80\x4b\x6a\x32\xcb\x3c\xec\x26\x5c\x68\x13" + "\xee\x78\x1f\x44\x21\xce\xbc\xff\xf5\x75\x87\x7e\xef\x6e\x76\x1c" + "\xe1\x8e\x0d\xe2\x42\xdc\x88\x07\xf9\x1f\xdf\xad\xa4\x21\xaf\xbb" + "\x76\x20\x1c\x95\x77\x7a\x53\xc9\x7f\xbb\x9c\xb9\xdd\xb4\x0e\x37" + "\x96\x0d\x88\xfa\x10\x86\xf6\x68\xba\xe3\xbd\x30\xaa\xcf\x0e\x59" + "\x84\x9b\xca\xd1\x99\x5c\x58\xae\x97\xd9\xac\xe8\xdf\x60\x41\x1f" + "\xb3\xea\x68\x4f\x7e\x13\x96\x17\x75\x8f\xc9\x52\x68\xa4\x3a\xf8" + "\x9e\x7c\xa2\x13\xf5\xa1\x29\xd7\x0b\xf1\x35\x10\x85\xe5\x16\x12" + "\x3e\xc2\x85\x7a\xe0\xc2\xb6\xf6\x36\xe5\xba\x21\xc0\x34\x38\x5d" + "\x32\xbe\x06\x0d\x3e\x4c\x67\x88\x8f\xf4\xaf\x19\xcb\xc4\x37\x70" + "\x7c\x8f\xfe\xaf\x00\xe1\xf3\x82\xde\xcc\xe9\x7d\x9c\x70\xf0\x33" + "\x26\x10\xa7\x63\xe3\x7d\xd0\x03\x09\x06\xb7\xcd\x1a\xc5\xd7\x03" + "\x62\xf9\x77\x4b\xbb\xa3\x59\x6f\x76\xd4\x18\xbe\x16\xf0\x3e\xa0" + "\x73\x18\x7a\x60\xcc\x5f\x59\xaf\x35\x2a\xbe\x07\xf4\x44\x33\xed" + "\x07\x22\x3a\xd5\xb2\x7c\x74\xee\xe3\xb3\xe1\xf1\xb4\x79\x69\xb3" + "\x61\xfe\xbd\xf7\xcf\x86\x94\xbb\x26\xa6\xdc\x7e\xe7\x8c\xdb\x21" + "\xeb\x07\x8f\xce\x86\xac\x05\xb3\x61\x21\x5e\x59\x0b\xe7\x3e\x9a" + "\x36\x77\xe1\x6c\xc8\x7e\x60\x1e\x3e\xdd\x3f\x7b\x4a\xca\x83\x13" + "\xb3\xee\x9f\x37\x17\x1e\x59\x34\x35\x65\xea\x54\xb8\x77\x6e\xc6" + "\x94\x94\x14\xf9\x77\x4a\x0a\x81\x3c\x39\x63\xee\xc2\x89\x59\xf9" + "\xeb\x0b\xd6\x4f\x5c\x30\xef\x7e\x98\x3b\x77\x76\x96\xb6\xaf\xb5" + "\xf8\xbf\xf6\x13\x8f\x3d\xec\x6c\x3a\x9d\xbd\x00\x75\x28\x7b\xbc" + "\x7a\xf8\x9e\x0e\x30\x7e\x52\x47\x32\xe3\xbe\x35\x81\xfa\x2b\x7d" + "\x9f\x3d\xe1\x38\xf2\x6e\x39\xf1\x8e\xce\x3f\x38\x09\x57\x8d\xc7" + "\xbc\x5b\xe4\xbe\x23\x1a\xf3\x7d\xda\xfc\xcb\x8f\x62\xfe\x64\xda" + "\x23\xe0\xc4\x0b\xf9\xed\x41\x1f\x88\x7c\x75\x43\xaf\x2d\x3b\x9a" + "\xef\xd1\x44\x59\xd3\xda\xd9\x3e\xbb\x71\x86\xca\xd6\xbb\x68\x8d" + "\xad\x79\x33\x44\x9d\x01\xe3\xe5\xed\x05\xa9\xb4\x8f\x06\x9c\x05" + "\x32\x8e\x73\x83\x38\x62\xe5\x7d\x9e\xae\x3a\x5a\xbf\x2c\xf0\x94" + "\xa9\xfc\x82\x8b\xf0\xec\xc4\x3c\x19\xd7\x63\xed\xe8\x1f\xd0\x7f" + "\xff\x6b\xc0\x66\x01\x16\xdb\xd4\x18\x18\xb0\xf0\x3e\x01\xcb\x35" + "\x2a\xfa\xbc\x93\xd6\xc6\xe6\x21\xdc\x8f\xd3\x75\xb4\xb6\x94\xaf" + "\x33\x85\x04\x3a\x6b\xc1\x13\xa8\x38\x06\x7c\x0f\x34\x4f\xbb\x5c" + "\xcf\x62\xf1\xb9\xe2\x98\x8e\xd9\xc4\xbe\x68\x4c\x8b\xa6\x34\x94" + "\x75\x14\xd9\x24\xdf\xf7\x89\x75\x63\xfa\x26\xa4\xaf\xc3\x4f\xe5" + "\xcf\xf2\xf2\xa3\x31\xed\x09\x84\xd5\x05\x62\x8f\x49\xa8\x3b\x94" + "\x86\x71\xc2\x55\x69\x88\x2f\x8a\xf6\xa4\xb3\x38\xb3\x1b\xef\xf5" + "\x8e\xcd\x3d\xfc\x6c\x71\x17\xe6\x05\x6c\x88\x73\x60\xb0\x7e\x0b" + "\x95\xc5\xba\xf4\x7d\x03\x56\xec\xe3\x2e\xe7\x67\x9e\xf9\x89\x9e" + "\xb3\x83\x30\x26\xaa\x93\xec\x1a\x65\x31\x0d\xe5\x14\xd3\x67\xbf" + "\x7c\x5f\x88\x9c\x0e\x23\x1e\xda\x43\xd1\x81\x38\x12\x03\xbd\x58" + "\x07\x3e\x23\x5e\x49\xc6\xab\xe0\xf0\x08\x3d\xb8\xbc\x2b\x44\x0f" + "\x62\x10\xf7\xec\x60\xfe\x58\xbd\x36\xff\xca\xd3\x98\x7f\x9f\x9c" + "\x8f\xf6\x35\x36\x59\x9b\x3f\x36\x15\xf3\x1f\xc0\xfa\x3d\x68\x3f" + "\x51\x2e\x30\xee\xaf\xa3\xf8\x2f\x08\xbf\x28\x04\x3e\x0f\xe1\x1f" + "\xa2\xf5\xef\xe4\xdb\x09\xbe\x5e\xd6\x55\x84\x37\x20\xfc\xb6\x90" + "\xfa\xdb\x10\x7e\xa1\x8a\xbe\x90\xf6\x5f\x91\x8b\xf9\xd9\xa4\x5b" + "\xf8\x9b\x83\x30\xa3\xc9\x66\xc9\x5f\x34\xe5\x52\xbc\x38\xf6\x58" + "\x48\xfd\x04\xf7\x6c\x40\xe1\x51\x2f\xf1\xc8\xb8\x5f\x8e\x45\x8e" + "\x0b\x1a\xae\x30\x84\xd4\x61\xc1\x32\x1b\x50\x7f\x74\x8a\x6e\x84" + "\x29\x33\x2b\xa4\xcc\x12\xae\x5b\xa2\x1e\x59\xc6\xa2\x8c\xec\x8b" + "\xd4\x38\xa8\x6d\x18\x1f\x5d\x51\x16\xd2\xf6\x25\x58\xef\x96\x1d" + "\xc2\xce\x2f\x43\x9d\x98\x8a\x69\xf3\x11\x67\x34\xe9\x11\xe9\xba" + "\xd3\xed\x45\x5f\x99\x1e\x27\xfa\xfc\x2b\x4e\x24\x14\x03\xdd\x4f" + "\xa4\x7b\xc2\xcd\x06\x32\x64\x1b\xb8\xe2\x04\xfe\x52\x3a\x3f\xcb" + "\x88\x6c\x8f\x0d\x3c\x1c\x10\x38\x13\xa3\xd1\x46\x25\x7c\xf6\xcb" + "\x75\xcc\xa5\xfd\xc3\x48\xbf\x84\x7e\x18\x68\x0f\x34\xa6\x4f\xc3" + "\xf4\xd9\x72\xfe\x74\x82\xc7\xfb\x29\xf2\x3d\xe9\xad\x24\xeb\x2d" + "\xda\xc1\x95\x7c\xbf\xb8\xb0\x05\x51\x3e\x20\xf4\xfe\x7e\xcc\xbb" + "\x06\x7f\xe7\xe1\x6f\x34\xfe\x3e\x82\x75\x9f\xa0\x33\x1f\x6c\x7e" + "\x8c\x3b\xc4\x73\x1b\xfe\x3e\x8a\xbf\xbf\xc2\xdf\x85\xf8\xfb\x13" + "\xb2\x5b\x77\xa1\x15\x42\x74\xa6\x27\x20\x6c\x75\xb4\x90\x61\x62" + "\xb5\x6c\x3f\xc2\x7e\xcf\x06\xd3\x98\x48\x93\x04\xcf\xe5\xb4\x81" + "\x74\xe2\x4b\x16\xe2\xcf\xa3\xfa\x65\xbb\x8f\x16\x72\x12\x30\x01" + "\x51\x4e\x2f\xe4\x2d\xa7\x09\x38\x9d\xba\x4e\xfc\x4d\x2b\xf5\x30" + "\x86\xbf\x29\xfc\xbc\x08\xb8\x72\x1a\xf2\x44\x8f\xcf\x7a\xe2\x13" + "\x87\xe7\x78\xaf\x68\x50\xc9\x1b\xe3\xf1\x2b\xf3\x42\xe4\xbd\x0f" + "\xe5\xbd\x83\xcb\x1b\x79\xa7\xd0\x4c\xf4\xa3\x4e\xd3\xf3\x28\x45" + "\x6f\x50\xbf\x7b\x82\xbe\xfb\xca\x46\x2d\x1e\xe3\x7e\x2c\x83\xe3" + "\xaa\x2b\xf8\x59\x7a\x74\xee\x4d\x54\x31\xe9\xe8\x95\x18\xff\xb7" + "\x1d\xe7\x71\x53\xc5\xb1\x51\x84\xc7\x63\xe3\xe7\xeb\x78\xa2\xf2" + "\xc8\xb6\xae\x02\x25\x9f\xe7\xc5\x74\xe6\x11\x2d\x51\xb9\x3c\x2f" + "\xc9\x85\xaa\xa5\xe4\x81\xd8\xb7\xe5\x89\x2a\xe0\x79\x33\x82\x78" + "\x9b\x3a\x64\xbc\x51\x14\x6f\x50\xdc\x80\xfd\x77\x37\xc2\xe0\xf8" + "\x27\x3e\xf2\x59\x4a\xe5\x4d\x2d\xa8\x34\xd2\xad\x65\x10\xed\xf4" + "\x1d\x83\x4c\x1f\xf3\x4f\x2c\x83\x18\xa7\xef\x00\xdc\x02\x70\xb9" + "\xd3\x77\x1c\x6e\x05\x18\xe7\xf4\x55\x63\xff\xbc\x8f\xf2\xdf\xb7" + "\x80\x4e\x87\xbf\xb6\x9b\xca\x24\x9d\xd3\xb7\x0d\x92\xcb\xf4\xf8" + "\x9b\x0b\x0f\x44\xb3\x3e\xa7\x2f\x03\xe1\x72\x20\xd3\xcf\xce\xa6" + "\x45\xb3\xcf\x96\xf9\xc1\x98\xf1\x22\xb3\x39\x7d\x18\x2b\xfb\x5a" + "\x31\x3d\xc0\x32\xfd\xe7\xf1\xea\x63\x81\xf2\xa6\x8e\x4c\xff\x59" + "\x76\xff\x8b\xef\xe3\xf3\x67\x8c\x49\xc0\x9c\xbe\x59\xd0\xee\xf1" + "\x20\x9c\x8d\xb1\xed\x4d\x2d\x4b\xcf\x49\x30\x40\xe7\x1c\x6d\x6f" + "\xea\xc0\x36\x76\x0f\x60\xfb\xb0\x0f\xfa\x62\x60\x0b\xfe\x56\x34" + "\x9d\xe4\xcf\xe5\x4d\x5e\x66\x68\xea\x9e\x84\x03\x0f\x6a\x83\xd3" + "\xd7\x05\xcb\x30\x74\xce\xdc\xe4\x66\x44\xff\x98\xad\x34\xee\x98" + "\x45\x67\x24\x24\x64\x6e\xb2\x31\xcc\x33\xb0\x98\x26\x1c\x2b\xf4" + "\x00\xd6\xe1\x45\x7c\xe7\x38\xbe\xf2\x66\x13\xc2\xba\x09\x4e\x8d" + "\x87\x70\x10\x6c\xa6\x1f\x12\xd8\xf6\x66\xd3\x40\x4c\xb3\x01\x2f" + "\x0b\x5e\xd9\x2c\xb6\xf9\x19\x66\x4f\xfc\x0d\xed\x73\xc5\xf2\x45" + "\xf8\x5c\xde\x47\x67\x32\x11\x2f\xfd\x30\x1a\xe1\x8b\x50\x7f\xd2" + "\x50\x0f\x91\xde\xe6\xfd\x9c\xde\x8a\xe6\xff\xde\xc7\xdb\xd1\xfc" + "\xdf\x44\x3b\x9a\x7f\x42\xe9\xbd\xa8\x53\x78\xdf\xd2\x2b\xf2\x3e" + "\xc4\x72\x8b\x78\xb9\xf2\xe6\x16\x66\x68\xee\xf0\xa2\x7d\x21\x5f" + "\xcb\x88\x8f\xc8\xd7\x32\xe2\x25\xe2\x6f\x71\x16\x55\x02\x8b\x69" + "\xee\x40\x7a\xba\xb1\x7c\xff\x00\xef\xa7\x8f\x18\xfa\x38\xee\x23" + "\xa3\x11\xcf\x12\xd4\xdf\x28\x66\x38\x82\xf2\x3e\x62\x1a\xb0\x9b" + "\x21\x73\x13\xf3\x66\xfa\xb6\xfa\x96\x6d\x82\xa8\x09\x50\xa6\xa3" + "\xf3\x63\x9d\x45\x39\xd8\xce\x66\xfc\x4d\xc3\x7c\xb8\x02\xeb\x7a" + "\x9f\xc5\x1c\x31\x50\x7d\x6c\xfb\x11\xb4\xd5\x23\x38\x6e\x87\x1c" + "\xa2\xe9\xbc\x1d\x8c\xf8\x6c\x39\xcf\xe9\x3b\x92\x1e\x28\x3f\x62" + "\x0d\x18\x8e\x64\x2b\x3a\x44\xfa\x23\xf8\x56\x0d\x0b\x3c\xcc\xe7" + "\xf4\xed\x05\xd4\x31\x63\xbb\xe7\x38\xe5\xe3\xd8\xe0\x00\xca\x99" + "\x74\x6a\x1b\xfe\xee\x03\xd2\x9f\xf6\xbc\xe7\x09\xf6\x7d\xd2\xa1" + "\x05\x79\x9e\xad\x13\x21\x4f\x87\xcf\xb6\x65\x3e\x03\x2c\xcd\xd3" + "\x97\xf9\xcb\x8f\xcc\x68\xcf\x23\xb9\x1c\xc3\x32\x54\x2e\x17\x12" + "\x74\x18\x1f\xeb\x98\x2f\xa1\xc8\xad\x8f\xb7\xda\x58\xbb\x27\x03" + "\x61\xf3\xf8\x79\xb8\xa4\x47\x04\x3f\xbf\x87\xb9\xfc\x86\x23\xdd" + "\xd4\x36\x36\xa6\x0c\xda\x7a\xa6\x03\x8d\x51\xda\x7a\xf6\x91\x9e" + "\x06\x90\x2f\x8d\xa8\xa3\x03\xf3\x7b\xca\xa2\x97\x9e\x03\x1d\xa6" + "\xf9\xdb\xac\x07\x30\xbf\x19\xe1\x5a\xb9\xde\x2e\x38\xe7\x4b\xf0" + "\x19\x8e\x58\x7c\xe5\x47\x5a\x16\x9c\x1b\x60\x6d\xd6\x6a\x78\xaa" + "\xa7\x0c\x79\x75\x00\xe6\x9f\xf6\x45\xb5\xe7\xe5\x20\x4c\x1f\xa6" + "\xef\xe3\xfa\x3f\xff\x74\x2f\x5b\xf0\x1c\x3b\xbb\xe0\xdc\x67\x6c" + "\xbe\x95\xbd\xbf\xac\x08\xc6\x5c\xb6\x95\x05\xc8\x2e\x5a\xbb\x0e" + "\xc0\x65\xc7\xe9\x0c\x9c\x34\xc8\x58\x11\x60\xf3\x4f\x9f\x65\x4b" + "\x9f\x23\xde\xcc\x82\x36\x2b\xda\x4f\x51\x35\xf1\x3b\xbd\xcd\x7a" + "\x18\xeb\x4f\x43\xbc\x36\xe6\x2c\xda\x8b\xb0\x8e\x84\xa7\x4e\x1b" + "\xa1\xb5\xab\x1a\x7c\x31\x47\x2c\xfe\xed\x47\x66\x04\x62\x8e\x64" + "\x07\xb6\x1f\xb1\xa2\x9c\x1a\x7d\xdb\x8f\xb4\xf8\x63\x8e\xa0\x0e" + "\x7c\x30\x03\xe5\x14\x43\x32\xef\xc7\x31\x3b\x3e\xdf\xd1\x4f\xf2" + "\x2f\xff\x20\x9d\x19\x3e\xb0\xa2\x6f\x64\x42\xf7\x3f\x48\xa7\x71" + "\x37\x8b\xf9\xc0\x3a\x10\xf3\x41\x36\xc2\x59\x85\x7d\x7d\x50\x44" + "\x7a\xc9\xfb\xa6\x8a\x0f\x0a\xb1\x2f\x89\xc2\xfc\x72\xbc\x6a\xf0" + "\x42\x1f\xf7\x81\x17\xf1\x5f\xde\x27\x70\x7a\xd9\x3d\x55\x18\x67" + "\x9e\x23\x9d\xb4\xb1\x98\x0f\x4d\x99\xfe\x19\x36\xe4\x23\xda\xca" + "\x07\xde\xc0\xf6\x0f\x0d\x2c\xf6\xc3\x19\x5e\xae\xff\x1f\xde\x49" + "\xf8\x07\xb6\x58\x68\x4c\xae\x67\xdb\x3f\x4c\xc7\xb4\x7f\xed\x23" + "\x7d\x35\x7c\xd8\x18\x30\xb4\x98\x58\xf9\x87\x2d\x0f\xbf\xc8\xdc" + "\xfe\xf2\x0f\xbb\x03\xe5\x1f\x76\xf8\x46\x61\x0c\x5b\x74\x18\xc8" + "\x47\xf9\x7e\xcd\x18\x7d\x0f\xa8\x3d\x6f\x1f\xd7\x01\x67\x11\xda" + "\xc1\xa6\x6b\xcb\xda\x7a\x50\x1f\xf2\x7e\xc6\xfd\x53\xbb\xe7\x18" + "\xe7\x2b\xd2\xd1\x48\x7a\x45\x32\x5e\x9a\x07\x65\x58\x57\x0b\xd2" + "\xd2\xe1\xdf\x8e\x78\x63\xb0\x9e\xd8\x8f\x9e\xf4\x72\x9b\xfd\x08" + "\x75\xf6\x30\x96\x39\x02\x42\xcf\x3f\xca\x8e\xe4\x27\xc9\x5f\x91" + "\x8f\xca\xf4\x79\x49\x6f\xbe\x20\xdf\x26\x7c\x15\x2c\x53\x7c\x15" + "\xf9\x29\x1a\x17\x90\xaf\x0a\xc8\xbe\x2a\x20\xfb\x2a\xfe\x6c\x40" + "\x7f\x53\xde\xd4\x4d\x3e\x29\xb3\x48\xf8\x9a\x4c\x7f\x0a\x43\xfd" + "\x88\x43\x1c\xdd\x42\x1e\x08\x53\xd1\x74\x8e\xc3\x73\x3e\x35\xe3" + "\x98\xb9\xd9\x80\x97\x25\x20\x7c\x8e\x55\xf6\x39\x92\xe2\x73\xfc" + "\xd8\xd7\xa1\x5d\x05\xc2\xf9\x9c\x80\xec\x73\xfc\x4c\xf8\x9c\x80" + "\xec\x73\x28\xdd\x2f\xfb\x1c\x7f\x18\x9f\x13\x28\x6f\xa6\xf6\x46" + "\xc9\xbe\xa6\x8c\x7c\x0d\xb5\x37\xb0\xbd\xb9\x23\x20\x7c\x8d\x17" + "\xc7\x04\x12\xf9\x1a\x3f\x96\x09\x28\xbe\xa6\x8f\xfb\x04\x13\xf9" + "\x9b\x81\x97\x00\x7d\xa8\x19\xc8\xcf\x70\x9f\xe2\x1b\xe7\x23\x9f" + "\x82\xfc\x9b\x13\xea\x53\xd0\x57\x59\xf0\xde\x28\xfb\xaa\xec\x84" + "\xad\xcc\x87\x3e\x65\x46\x66\x91\x07\xe8\xdb\xbf\x09\x3e\xf4\xdd" + "\x45\x05\x65\xce\x22\x1f\xa0\x2f\xb0\xb2\xf6\x32\x40\xbf\x83\x3a" + "\xec\x47\x7f\x01\x80\xb6\xd9\x88\x36\xda\x8d\x75\xb7\xb4\xe7\x7d" + "\x02\x68\xf3\x96\xf9\x3d\xbd\xce\xa5\x1e\x8b\x71\xfe\x69\xe6\x46" + "\xfe\xb8\x96\xe6\x95\xa1\x8f\xb1\xb8\xdb\x7a\xde\x83\x8c\x2e\x16" + "\xc8\x58\xee\x32\x23\x1d\x2d\xf3\xd7\x38\x12\xe8\x5b\x41\x0b\xce" + "\x31\x07\xfa\xc6\x7f\x9f\x7f\xda\x98\xb0\xa4\x0b\xae\xcf\x58\xc1" + "\x02\x68\x53\xc8\x77\xb4\x35\xb4\x49\xa4\x3d\x1b\xed\xce\x8a\xb6" + "\xd6\xe8\x0b\xb1\x35\xb4\x9b\x3b\xf0\xde\x2c\xf8\xf7\x81\x15\x6d" + "\x2d\x3d\xc0\xfb\xb4\x2e\x3e\x16\x43\x7b\xb0\xd2\x5c\x15\xda\x5b" + "\x7a\x60\xbb\xb0\xb7\x80\x28\x57\x14\x20\xfe\x49\xb2\xbd\xa1\x2c" + "\x30\xbf\x1c\xaf\x1a\xbc\xc2\xdb\x5b\x5e\x88\xbd\x3d\x27\xdb\x5b" + "\x8c\xb0\x37\x94\x6b\x94\x7f\x8b\xb0\x39\xaa\x83\xc6\x6c\x83\x36" + "\x17\xfb\x21\x3f\xd3\x47\xe8\x0f\xd9\xdd\x87\xd8\xbf\x7c\xd8\x8d" + "\x36\xd7\x11\x28\x6f\x41\x7c\xcc\x4d\xfe\x13\xf5\xf3\x2f\xd4\xe7" + "\x2d\xc8\x63\x7f\x59\xe6\xbf\xb6\x0c\xeb\xea\x46\x9f\xf6\x19\xfa" + "\xd3\xbf\x2c\xf5\x40\x03\xe2\x6a\xc4\xfa\x5a\xd0\xa6\x3a\x02\xdb" + "\xb9\x4d\x65\xfb\xb7\x10\xce\x8f\xb2\x07\x71\xf0\x3e\x53\x6b\x53" + "\x62\xa6\x3b\xfc\x7c\x61\x9f\xfd\x86\x38\x17\x1c\xef\xe0\xe7\x40" + "\xda\x6f\x30\xb9\xe0\xd3\x03\xf2\x7d\xb2\x0b\x7e\xcd\xd3\xc9\x16" + "\xf3\x4a\xe1\xca\x53\x70\x43\x07\xea\x3d\xe0\x7d\x1c\xde\x1f\xcf" + "\xbc\xe5\x7d\x16\xa8\x1c\x63\xc1\xba\xfb\xc8\x1e\x99\x7d\x1a\xc5" + "\x8c\xa9\xa8\x8f\x06\xd6\x67\x89\x63\xb1\x7f\x8c\x65\x03\x26\x9a" + "\x93\x4a\xc0\xe7\x31\xc8\x83\x64\xfc\x1d\xbb\xf7\x6b\x48\xc4\xcb" + "\xb4\xd7\x1e\x28\xa3\xf8\x0a\xef\x53\x58\xa1\x29\x76\xe7\x46\x98" + "\x90\xe0\x11\xe7\x9a\x27\x6c\x35\xd2\xdc\x4c\x22\xdd\x33\xfb\x6f" + "\x7d\xf5\x5f\xcb\x67\x9b\xc7\x63\x7d\x61\xbe\x65\xec\xef\x23\x3e" + "\x34\xb5\x28\xb4\x10\x6d\x48\xe7\x75\x48\x67\xcf\x63\x9b\x52\x81" + "\xbe\x93\x15\xce\xcf\xf4\xd9\xcd\x83\xed\x8f\x90\x3f\x41\xe1\x49" + "\x84\xfc\x0c\x85\x4f\x91\xf6\xb1\x52\x7f\xed\xdf\xc8\x7a\xe8\xec" + "\x0d\xda\x6f\x6b\xf3\xb1\xff\x40\x3e\x96\x95\xfa\xc1\x90\x59\xe4" + "\x65\xce\x1e\xe6\xa0\xef\x6d\xd5\xd3\x79\x20\xc5\x2c\x10\x88\xf9" + "\x43\x0f\xdb\xfe\x87\xee\xde\x8d\xcc\x47\x73\x1f\x58\xc7\x41\x17" + "\xdc\xbf\x5f\xc8\xe2\x48\x3a\x1f\x03\x1a\xfe\xd0\x8d\xb8\x2e\x27" + "\x5c\x6d\x58\xde\xbf\xfd\x0f\x6e\x84\xc3\x98\xf4\x94\x87\xc3\x19" + "\x8e\xa4\xe7\x6d\x86\xef\x9d\x82\x71\x46\x3e\x0e\x28\xff\x23\xf7" + "\x0b\x98\x66\xc4\xb4\x24\xb6\xfd\x8f\x18\xcf\x8e\x33\xb8\xe0\x0f" + "\x3e\x11\xeb\x8e\x4b\x52\xe0\x5c\x60\xe6\x67\xa8\x6a\x74\x48\xac" + "\x96\x28\xd3\xec\xe7\xd2\x81\x76\x77\x1a\xd5\x94\x1a\x3e\x3b\xe8" + "\xd7\x8f\xb4\xd0\x39\x9a\xb6\x12\x48\x42\xf9\x10\x7d\xaf\xda\x8a" + "\xd8\x49\x66\x1f\x67\xf9\xf1\x66\x2f\x8e\x21\xc6\xd5\xba\xe0\xe7" + "\x05\x91\xf8\x19\xf8\x9a\x75\x21\x0e\xeb\x2e\x1c\x07\x12\x7f\x88" + "\x9f\x68\x37\x01\xe4\xc3\x09\xf2\x4b\xf5\x1b\x69\x2c\x3c\xce\xa5" + "\xf0\x2b\xb2\x4c\xfe\xe0\x13\xe3\xc5\x1b\x53\x99\x9d\x81\xe3\x7a" + "\x7a\xd7\x70\xe3\xbd\x82\x07\x1f\x64\xf7\xa2\x2f\xa1\xb9\x54\x3a" + "\xf3\x72\x83\x89\xa1\x3f\xb8\x71\x9a\x0b\x6e\x3d\x2a\xcf\xd9\x78" + "\x9c\xbe\xb9\xe4\x5f\xc2\xf6\x5d\x7c\xef\xf1\x20\xfe\xef\x2f\x6f" + "\x47\xce\x0a\xff\xd4\x79\xa8\x54\xc8\x9f\xce\xa1\xf0\xd0\xde\xf9" + "\x2e\xcc\xdf\xe0\x61\xe8\x43\x3b\xf7\xd3\x38\x83\xf6\xf1\x62\xda" + "\x0a\xd4\x6b\xe6\xc8\x27\x9a\xbe\xbf\xc2\x71\x7d\x3f\x9c\xc4\xf1" + "\x20\xed\x95\x17\xf3\x37\xdf\xcf\x68\x2a\x00\x79\x4e\xe8\xc6\x56" + "\x17\x4c\xcc\x55\xe8\xa2\x58\x03\x79\x6b\xa0\xd8\x83\x62\x0e\x9a" + "\x9f\xdf\x50\xcc\xbc\x14\x7b\x20\xac\x57\x69\x03\xb5\x4f\xb4\xeb" + "\xfb\x71\xea\x76\x21\x0d\x6e\x1c\x5b\x73\x1e\x6c\xd8\x04\x06\x7e" + "\x06\x9f\x9f\xe6\xf7\xe7\xf2\xb6\x50\x9b\x79\x5b\xb8\x9f\xc5\x7e" + "\xc2\x37\x1d\xf5\x85\xa7\x5b\x11\x57\xb6\x0b\x6e\xeb\x10\xfa\x74" + "\x63\x6b\xa8\x0e\x0d\xea\x80\xe1\x88\xc9\x76\x1e\xae\xb7\x05\x58" + "\x27\xe2\xfc\x1c\xf9\x14\x45\xbf\x01\x8a\xb7\xbd\xa4\xbb\xc7\xbb" + "\xa8\x5f\x76\x16\x9f\x43\xdf\xcd\x61\xaf\x40\xd8\x2e\x84\xf9\x44" + "\x86\xfd\x44\xbc\x9b\xe1\xbf\xa3\xe9\x17\xfb\xb2\x2b\x91\x8e\x1e" + "\x37\xef\xf3\x3b\xf3\x94\x67\x86\xcf\xf8\xbb\x8f\x6d\x3f\xde\x15" + "\x9e\x96\x16\x13\xf5\x69\xfe\xaf\x59\x0f\xd6\x73\x35\xe9\x91\x6d" + "\x13\x5c\x83\x3a\x79\xa2\xb4\x04\xae\x24\x1d\x63\x31\x7f\x34\x08" + "\xbe\x27\xcf\x60\x76\x8c\x41\xd1\xa3\xe6\x6d\x84\xef\xa1\x0d\xc1" + "\x29\x48\x9e\xbf\xac\xd8\x8c\xb4\x02\xec\x3a\x03\x14\xa7\x7c\x86" + "\xf0\x7a\xfa\x3e\x62\xfd\x19\xd2\xc5\xe4\x5c\x45\x17\xf1\xbe\xe8" + "\x42\xbe\x02\xf9\x5a\x23\xe6\x15\x92\x3f\xa7\xb9\xf8\x4e\x48\x3e" + "\x4a\xed\xc5\x4b\x87\x69\xbf\x61\x5f\xb3\x24\x26\xfa\xb5\x72\x17" + "\x24\xfb\xf0\xb7\x86\x5f\xe8\x4b\xe4\xe7\x72\x84\x3b\xc8\xbe\xf6" + "\x13\x4c\x0d\xa6\xa1\x4f\xd6\x91\x9d\xd4\x62\xdd\x1e\x17\x3c\xe0" + "\x10\xb2\x49\x76\x10\xae\x08\x34\x94\x33\xbe\x8f\xfd\x2b\x6c\xef" + "\xf8\xa7\xcc\xa5\x3a\xa4\x63\xfc\x14\x6e\x17\x88\xab\x5e\x12\x3e" + "\x3b\x80\xb4\xd6\xd9\x03\x56\xf4\xcf\xd6\x40\xc5\x67\x55\xfc\x5e" + "\xce\x63\x72\x5f\x1a\x1e\x7f\xe7\x21\x3a\x8b\xa3\x0b\xc6\x37\x0a" + "\x3c\x9d\xfb\x1d\xd7\x9e\xa2\xe7\x5f\xd1\xb3\xc7\xe0\xaa\x72\xd6" + "\xa4\x8a\xb3\x8f\x11\x46\x8c\xf3\xc7\xff\xaa\x17\xeb\xe8\xb3\x8f" + "\x6f\x74\xc1\x24\xf9\xbd\x84\xab\x2a\x82\xed\x19\xc9\x76\xc8\xe6" + "\x84\x4d\xdf\xbc\xa3\xad\x81\xdb\x5f\x11\xea\x7c\x8d\xec\x7f\x69" + "\x0e\x26\xae\x13\x6e\xae\x6c\x33\x71\xfd\x96\x98\x74\x93\x49\x73" + "\x36\x2b\xe6\x0d\xbd\x6e\xca\xc0\x6b\x09\x5e\x56\xf9\x19\xa1\x6f" + "\x2a\xc7\xab\x03\x9f\x8b\x39\xef\xde\xce\xd1\xb9\x30\xaf\x17\x63" + "\x77\x7a\x76\xc1\x4d\x8b\xd8\xdb\xc9\x92\x72\x5f\xbf\x87\xe6\x11" + "\x6e\x42\x79\x8d\x37\x08\x59\xdc\xcc\xcf\x7d\x47\xda\x88\xef\xcc" + "\x56\xc3\xbc\xcd\xa5\x1e\xa4\xfb\xa6\x83\xcd\x35\x1e\x30\xdf\x44" + "\xed\xbf\xe9\x10\xb5\xc9\x83\xfc\xa7\xdf\x0d\x35\xcc\xdd\x54\xeb" + "\x03\x7a\x87\x85\xb8\xd0\xfe\x5f\xae\x14\x73\x12\x9d\x2e\xc2\x27" + "\xeb\x04\x53\xda\x2f\xf8\xec\xaa\x32\x6f\xd4\xd1\xf3\x35\x75\x62" + "\xde\xa5\x20\x38\x1f\x7c\xf3\xe5\x68\xe7\x73\xe8\xec\xe6\x33\x70" + "\xf3\x63\x0c\x79\xdd\x64\xe5\x67\x40\xba\x69\xfe\xa5\x8e\xcf\x6b" + "\xdc\x8c\xfe\x6f\xbc\x55\x3e\xef\xc6\xcd\x7d\x0d\xe2\xdc\x89\x79" + "\xd8\x1f\xf5\xb4\x59\xbd\xe0\xa7\x36\x63\xd9\xf7\xbe\xf6\xea\x13" + "\x0a\x40\x57\x4a\xdf\x55\x41\x3a\x18\xca\x4a\xf8\xb2\x9b\xba\x4b" + "\x4e\x33\xaf\xd2\x66\x7a\xd7\x89\x78\x2b\x5d\x50\x55\x13\xd1\x26" + "\x06\xdb\x61\x79\xa7\x29\x59\xc8\x31\x80\xbc\xd2\xca\xd1\xb2\x5f" + "\xc8\xf0\xe6\xe3\x5a\x19\x5a\xf6\xe3\x85\xa5\x2c\xb3\xf0\xca\x90" + "\x9f\xd5\x97\x51\x75\x8f\x72\xb5\x54\xf7\xd9\x2d\x49\x68\x1f\xdb" + "\x84\x6c\x2c\x7c\xfe\x87\x91\xde\x7c\x89\x7d\xcf\x40\x36\xd0\x7b" + "\x4e\x4a\x27\x1d\xa7\xf4\x00\xc6\x37\xf8\x9c\x82\xf9\x46\xb2\x5f" + "\x3a\x4f\x53\x9d\x3f\x78\x6e\x12\x58\xf8\x59\x35\x09\x5b\xcb\xcb" + "\x49\x77\x11\x66\x5a\x82\xaf\xbc\x1c\xeb\xab\x54\xf8\x8a\x69\x05" + "\x94\x4f\x7a\x8a\xe9\xfb\x90\x2f\xdc\x57\x78\x70\x2c\x18\x3e\xf6" + "\xb0\xb4\x0c\xc6\x68\x86\x0f\xbc\x24\xcb\x1e\xb8\xe5\x18\xfa\x31" + "\xf4\xdf\x9f\x95\x8b\xfe\xe7\x96\x4f\xe8\x19\xfd\xe7\x09\xbc\x3f" + "\xda\x86\x7e\xaa\xbf\xe2\xdf\xdd\x03\x12\x8c\xee\x97\x20\xd5\xb7" + "\x73\x4c\x86\x2f\xf6\x63\x9f\xb3\xfb\x10\xb4\xfb\xfe\x05\xe8\x1b" + "\xa1\x88\xe3\x77\x74\xae\xab\x6d\x13\xf3\xbf\xdb\xbf\x1f\x7d\xd9" + "\x59\x07\x3f\xc7\x5c\xec\x93\xd7\xbd\xd2\x89\x51\xc0\x52\x8e\x5b" + "\xf0\x27\x6e\x8c\x65\xe7\x6a\xe6\xdb\x79\x92\xce\x7a\x31\xc5\xee" + "\xe8\x87\x09\x6f\x6d\x86\x94\xda\x7e\x48\xae\xeb\x07\x0b\xfb\x82" + "\xbe\x3b\x13\xfc\x56\xcd\x98\x3c\x30\xd4\x6d\xc6\x78\xce\x07\x3a" + "\xff\x0e\x8c\xe7\x7c\x18\xcf\x9d\xb5\x90\xbf\x1c\x8c\xe7\x06\x78" + "\xac\xfc\xc7\x02\x7e\xfe\xf7\xf6\x3f\x16\xc4\x5b\x41\x17\xb7\x1c" + "\x8c\x48\x9f\xed\x0c\xdc\x12\x13\xd7\x85\xb1\x24\xb6\xd9\x25\xb7" + "\x17\x7f\x93\x12\xac\x30\x9a\xb7\x15\x7d\x38\xdb\xfe\x59\x58\x9e" + "\xf1\xbe\x59\x22\x9d\xf2\x90\x2d\x61\x1b\x6e\x1d\x47\xef\x5a\x0f" + "\x5d\xeb\xd5\x6f\xa8\x65\x5e\x4a\x2f\x18\xc7\xbc\x98\x6e\xa0\xba" + "\x0f\x62\x7a\x9f\xfd\xd6\x14\x97\xf4\x7e\x6b\x24\x1d\xc5\x71\x93" + "\xec\x6b\x6e\xfd\x05\x93\xca\x50\x47\x3f\x9c\x51\xe2\xc3\x78\xfc" + "\x0c\xd9\xf1\xad\x07\x33\x73\x99\xcf\xbc\x8e\xde\x7b\xdf\xda\x40" + "\xef\xe4\xe9\x5d\xdc\xcf\x31\xd6\xb9\xd8\x7b\x78\xea\x43\x68\xfc" + "\x90\x90\x8b\x38\x2b\x3e\x9c\xc1\x70\xdc\x3e\xdc\xb8\x9e\xd6\x82" + "\xbc\xce\xd7\x9d\xdc\xda\xe3\x82\xc7\x53\xe5\xf3\x5b\x7b\x84\x3f" + "\xbd\xad\xd5\x83\x3c\xd0\xfa\x80\xdb\x1a\xe8\x1c\x92\xde\xf2\x63" + "\xc5\x8e\xeb\xc9\xf7\xdf\xb6\x47\xc4\x42\xc7\x8a\x44\x5f\x70\xdb" + "\x26\x31\xa7\x7f\xdb\x2c\x17\xcc\xe4\x3a\x97\x77\x23\xe9\xc4\x6d" + "\x05\x2c\xf6\xd8\x16\x82\x9b\x54\x06\x65\xeb\x7d\x80\xb1\xc0\xb1" + "\x22\xc6\x6d\xe5\x0c\xb0\x37\x9f\xed\xa3\xb5\x14\x9e\xab\x17\xf7" + "\x61\x6c\xd0\x8a\x79\xc5\x54\x87\x1b\x61\x90\xef\x31\xe2\x9d\xfd" + "\x6d\x68\x0f\x77\xc9\xfe\xf0\xb6\x1c\x31\xd7\x7c\x5b\x4e\x2f\x96" + "\xc5\x58\xf1\x0a\xcc\xc7\xf8\x77\x61\xa2\xfc\x6e\x97\xbf\x57\xc5" + "\xb4\x66\x17\x2c\xe2\xf3\xac\x05\xe3\xc0\x54\x60\x66\xdd\x11\x63" + "\x3d\x4d\x3b\x27\xce\xe3\xeb\x62\x24\xb8\xba\xcf\x3e\xc1\xa0\xe0" + "\xc5\xfe\xf6\xa7\xbd\xd2\x63\x8f\x61\x5a\x92\x82\x17\x61\x70\xac" + "\x3c\x61\xc2\x20\x8c\x28\x33\x4b\x55\xe6\xb1\x5e\xe9\xd6\x9f\x62" + "\x5a\x56\x48\x99\xe5\x21\x65\xf2\x54\x65\xca\xe4\x7a\xb6\x85\x94" + "\xa9\x0e\x29\xb3\x2f\x0c\x6d\x8d\x21\x65\x5a\x42\xca\x74\x84\xa1" + "\xad\x27\xa4\x8c\x4f\x5b\x66\x62\x9c\x8a\xb7\xb4\x46\x25\x05\xd3" + "\xcc\xda\x32\x13\x53\x42\xca\xa4\x2a\xcf\x18\x7b\x2e\x17\xb1\x01" + "\xea\x13\xca\x14\xe5\x5a\x8c\xf9\xd8\xfe\xd9\x11\x63\x78\xd2\x4d" + "\xd4\x99\x02\xdb\x5e\x71\x0e\x3e\xf9\x55\x9a\x3f\x27\x7f\x8e\x71" + "\x71\x0f\xe9\x04\xc5\x9d\x54\xd7\x49\x98\xb4\x83\x74\x08\x71\x1e" + "\x1a\xca\x8f\x89\x2d\x21\x74\x76\x84\xd0\xd9\x3d\x94\x1f\x13\x7d" + "\xda\x32\x93\xe2\xb4\x65\x26\x25\xa9\xca\x34\x88\x7a\x26\xa5\x84" + "\x94\x49\x0d\x29\x93\x35\x54\x3f\x27\xe5\x84\x94\x29\x08\x29\xb3" + "\x2d\xc8\xc3\x49\xfc\x5b\x2a\x64\x0f\x98\x8e\xe3\x9f\xbb\x2f\xb4" + "\x4e\xcc\xa8\xe8\xb3\xb2\x5e\x4c\xe8\xf5\xe4\x71\xd5\x62\xdd\x14" + "\x3f\x83\xa8\x0b\x26\x4f\x07\x71\x8e\x9f\xfb\xc7\xfd\xde\x68\x7a" + "\xa7\x84\xbc\xed\x6e\x2a\xf2\x62\x9f\x3b\x19\xfb\xa8\xe9\x33\x94" + "\x35\x15\xb4\x0e\x85\x9f\x59\xc7\xc7\x23\x93\x5c\xc2\xfe\x26\x4f" + "\x93\xdf\xe1\x50\x7b\x70\x9c\x31\x79\xda\x25\xd2\xf5\x09\xd1\x45" + "\x67\x38\x21\x8e\xa2\xc1\xb1\xc6\x20\xad\x54\xe7\x64\xe5\xcc\x5d" + "\x3a\x6f\xb4\x9b\x9f\x0f\x88\xf7\x74\x9e\x16\x96\x39\xa0\x1a\x9f" + "\x10\xad\x9e\x43\x9b\xbd\x7a\x2d\xcd\x93\x2b\x65\x9a\x5d\xc2\x47" + "\x4d\x76\x29\xfe\x24\xa2\xfe\x95\x77\xd6\xb4\x23\xd7\xe9\xbd\x7f" + "\x5b\x2d\xc6\x9b\x38\xc6\x22\xba\x3b\x21\xc5\xc2\xe3\xdf\x75\xfd" + "\x40\xf7\xce\xe2\x99\x7c\x5d\x80\x68\x4b\xca\x72\xfa\x6e\x02\xc5" + "\x3e\xcd\x79\x5f\x41\x2f\x1f\xa3\x91\x6f\x4c\xd9\xd1\x54\xec\x46" + "\x5a\x53\xb2\x95\x75\x33\x2e\x48\x11\x71\x5d\x79\x67\x15\xad\x59" + "\xa0\xf7\x78\x4d\x9e\x19\x04\x53\x8c\x74\xa6\x2a\x3c\xa0\x6f\x30" + "\x20\x6c\xc4\x6f\xab\xa9\xf9\x2a\x68\x98\x7a\x5e\xe8\x4f\x4a\xb3" + "\xd6\x1e\xa2\x51\x4f\x53\x3a\xb4\x3a\x97\xd2\xad\xd5\xb9\x14\xaf" + "\xd6\x1e\x24\xb4\x87\x29\x71\xda\x32\x53\x92\xb4\x65\xa6\x4c\x50" + "\x95\xa9\x12\xf5\x4c\x49\x0d\x29\x93\x15\x52\x46\xed\xff\xb0\xcd" + "\x53\xf2\x06\xc7\x9d\xdc\xdf\x4f\x29\x53\x3d\x4b\xd5\xbc\x9f\x9a" + "\x52\xad\xa4\xd1\xdc\x1d\xc5\xa8\xa4\x37\x32\xbe\x83\x21\x3e\x8a" + "\xe0\x9b\x43\x68\x38\x16\x42\x43\x97\xf2\xbc\x4b\x8c\x9b\x7f\x8b" + "\xbc\xbb\x45\xd6\x33\x4f\xc2\x56\x78\x24\xc1\xf7\xe8\x13\x14\x9b" + "\x51\xff\xc4\xd7\x6e\x95\x60\x4c\x79\x8e\xbe\xc5\xee\xa5\xef\xf6" + "\x45\xd1\xb9\x6e\x2e\xb8\x7d\x09\x8e\xe7\xf2\x10\xa6\x07\xe3\xa9" + "\xcc\x93\x30\x85\xea\xaf\xc1\x3a\x90\x77\x53\xd3\xb5\x34\x4c\xcd" + "\xd6\xd2\x30\xd5\xaa\x7a\x36\xe2\x73\x91\xaa\xdd\xc6\x28\x13\x5f" + "\xa3\x89\xb1\xf5\xd4\x2a\x25\x9d\xe6\x00\xb0\x8d\xdd\x36\x1e\x07" + "\xa4\xd2\x7a\xb9\xb1\x9d\x30\xb5\x84\xe6\x0b\x64\x9c\x87\xd5\xbc" + "\x15\xbc\x98\x7a\x34\x84\x0e\x57\x08\x1d\xee\xa0\xaf\x99\xe2\x11" + "\x36\x72\xbb\xde\x05\xf7\xa4\x50\x1a\xf2\xc2\x9c\xe0\x33\x5f\xe1" + "\xb8\x91\xe2\xd4\xdb\x1f\xf1\x60\x7b\xd9\x4b\xd2\x58\xf9\xf9\x31" + "\x76\x23\xc5\xdd\x7f\xcc\x43\xff\x4c\x6b\x22\x6f\xc0\xb4\x25\x42" + "\xae\xb7\x63\xfb\xef\x4e\x17\x78\x6f\xe7\xef\x60\x09\x16\xef\x2d" + "\x2c\xa6\x73\x7f\x24\x7d\xee\x8d\xed\x6c\x90\xd7\x6b\x9a\x11\x47" + "\xa5\x62\x0f\x81\x8a\xce\x86\xc0\xf6\xbf\x64\x61\x5a\x03\xda\x44" + "\x8d\x18\xd3\x7c\x5a\x8b\xba\x5f\x83\xf2\xc3\x31\xf0\x34\x79\x2c" + "\xd3\x79\x88\xd6\xcc\xa1\x5f\xa2\xb3\x23\xe3\xc4\x7a\x89\xdb\x8f" + "\xa9\xec\xca\x63\xde\x3c\x87\x75\xc2\xb4\x3d\x14\xdb\x91\xdf\xa0" + "\xb5\x77\x4d\x3e\x37\xd0\x3c\x8b\xd3\x77\x8a\xc7\xe4\x98\x5f\x23" + "\xca\x4e\x33\xaa\xca\xba\xe5\x79\x90\x6e\xca\x9b\xec\x03\x7d\x93" + "\xc7\x4d\x67\xe4\x27\x8a\x38\x7e\xda\x9e\x26\xf4\x17\x58\x26\x4d" + "\x29\x43\x73\x26\x54\x06\xc7\x3c\xfa\x49\xc5\xf4\xbd\xc9\x4e\x8e" + "\x5b\x7e\x27\xcd\xc7\x47\xce\xe2\x6e\x70\x7a\x3a\x68\x4e\x53\x2f" + "\xd6\x2e\x4d\xab\x89\xf2\x82\xa1\x77\x7b\x27\xca\x7e\x5a\x8d\x7f" + "\x7b\x27\x8e\x17\x3b\x51\xcf\x6f\xa7\xf3\xfb\x35\xb1\xcc\xdc\xb9" + "\x59\x8f\x66\xce\x9f\xf8\x83\x47\xe7\x2d\x9a\x3b\xd3\xbc\x68\xcd" + "\xda\x55\x39\x13\xd7\x3f\x5f\x60\x2e\xcc\x5f\x53\xb0\x66\xdd\x0f" + "\xf9\xb1\x9e\xe6\x15\x05\xe2\xd7\x92\xbb\x62\x43\xc1\x6c\xba\x9d" + "\x60\xce\xcb\x5f\xb5\x91\xdf\xde\x12\x0b\x5a\x24\x6b\x0a\x56\xe5" + "\x9b\xc7\xe7\x4c\x30\x3f\xb0\x62\x4d\xee\xf3\xf9\xab\xc2\xe2\x9a" + "\x69\xce\x5f\x95\xbf\x6a\x45\x8e\x79\xb6\x39\x85\x30\xab\xd1\xa9" + "\xe4\x99\xa2\xf8\xa7\x0d\xd8\x9f\x63\x0c\xdd\x4d\x7e\x8a\xfa\xf5" + "\x93\x70\x67\x09\xc5\x70\xfc\x1c\x4e\xd4\x43\xec\x13\x5c\x7d\xf6" + "\xe9\xc5\x43\xfb\xf1\xe9\x55\x5a\xfd\x9d\xde\xa0\xd5\xdf\xe9\x07" + "\x87\xf6\xe3\xd3\x43\xec\x7f\x7a\x88\xfd\x4f\xef\x1a\xda\x8f\x4f" + "\xf7\x6a\xcb\xdc\x61\xd0\x96\xb9\xc3\x34\xe8\x67\x90\xd6\x17\xb8" + "\x5f\xba\x63\x42\x48\x99\x59\x21\x65\x32\x42\x9e\x97\xa8\x9e\x31" + "\x76\xbd\x23\x57\x1d\x1b\xe0\x73\xb1\x62\xeb\x41\xff\x76\x47\x95" + "\x02\x43\x7d\x4f\x3d\x7d\xef\x47\xc0\xee\x57\xc1\x76\xcb\xb0\x83" + "\xf6\x4f\x3e\x89\xd6\x2c\x8a\xf8\xfc\xce\x89\xb2\x6f\xa3\xef\xff" + "\x28\x7d\x68\x17\xca\xe2\x86\x33\x70\xc7\x9e\x7a\x01\xeb\xa6\x75" + "\xac\xec\xcd\xc5\x7d\xf5\x63\xc1\x40\x65\xe9\x1c\x4a\x66\x9f\xb6" + "\x8f\xce\x48\xc4\xb4\x38\xbc\xd0\x4f\xdd\x69\x76\x49\x8e\x5a\xaa" + "\x83\xd6\x34\xb8\xe0\x4e\xae\xcb\x54\x6e\x1b\x5f\x7b\xc7\xeb\xdb" + "\x43\xdf\x31\xa2\xb3\x5d\xc9\x7f\x52\xbd\x74\x3e\x2a\xd5\x8d\x38" + "\xf4\x4c\x9a\xf6\x57\xf9\x9c\x4b\x23\x5e\x89\x88\xb3\x40\xc1\x89" + "\xf8\xcc\x20\xce\xd3\xe5\xeb\xd4\x45\xdc\x73\x67\xb5\x12\x5f\xd0" + "\x58\x21\x9c\xef\x08\xbf\x26\x19\x12\x76\xd9\x03\x1d\x8e\xd2\x2e" + "\xa2\xa9\x99\xe2\x50\xa7\xc9\x07\xed\xb5\x3e\x1c\xbf\x82\x91\x8f" + "\xa7\x8a\x4e\x83\xb3\xc1\x07\x34\x3f\xbc\xac\x08\xca\xea\xa5\x00" + "\xbd\x67\x93\xcb\xd1\x18\xed\x4e\xbe\xe6\x7f\x1b\xa5\x63\x79\x1c" + "\x4b\xb8\x69\xed\x72\xa4\x6f\x6c\x11\x9c\xe3\x46\x1a\xef\xcd\x98" + "\x26\xc7\xbe\xe5\xf5\x88\x2b\xec\xba\x5a\x09\x9c\x7d\xf6\x19\xd8" + "\xff\x2d\xeb\x50\x7c\x76\x53\x0d\xf7\x7d\x12\xa6\x97\x23\x2f\x1a" + "\x23\xc5\x29\xb2\x7f\xcf\xa3\xb5\x5e\x08\x7b\xe8\x42\xb0\x44\x77" + "\x13\xb6\x1b\x6d\xb1\xec\xc7\xa5\x29\xd1\xb2\x7f\x35\x60\xb9\x1e" + "\xa5\xdc\x70\xda\x27\xef\x21\x70\xa3\xad\x7a\xc4\x58\x71\xe6\x8a" + "\xd7\xf9\x5a\xdd\xbb\x30\xfe\x9b\xa1\xd8\xc1\x65\xf8\x8c\xfe\x6f" + "\x06\x9f\x4f\xa4\x75\x35\x34\xa6\xde\x90\x87\x31\x9b\xc9\x83\xbe" + "\xf1\xae\xe5\x4a\x1e\x9f\x27\xa2\xbc\x62\xe6\x6d\x32\x75\x51\x5e" + "\xf1\x60\x1e\x95\x23\xba\x8b\x7c\x94\x5e\xad\xa4\x8b\xbe\xe5\xae" + "\x7d\x21\xcf\x87\x94\x67\xbc\x77\xe0\xfd\xe0\x3a\x7d\xf4\xb9\xb4" + "\xc6\x49\xd7\x09\x33\xc7\xd5\x71\xbb\xb9\xcb\xa5\xe4\xf3\x39\xb5" + "\x1f\xd1\xbb\x31\x0f\x04\x62\x8f\x95\xf1\x98\x0b\xcb\xd0\x77\xb1" + "\x70\x8c\xa1\x63\x03\x7c\xbd\x55\x0f\xe1\x21\x9b\xe1\xdf\xa6\xc1" + "\xe7\x4e\xb8\xeb\x58\x3d\xe9\x35\xca\xb5\xd0\x07\x49\x79\xf7\xd0" + "\xfc\xf3\x4c\xae\xb7\x94\x46\x78\x09\x1f\xf5\x89\x84\x9b\xf0\xd1" + "\xf7\xbb\x58\xaf\x15\x69\x9d\x49\xed\xaf\x8e\x24\x2b\xcc\x2f\x53" + "\xf1\x32\x1a\x9f\xab\xb4\x6d\x9d\xd9\x10\xf2\x7c\x50\x79\xa6\xb9" + "\x5e\xa1\x7b\x33\xf7\xc9\x79\xad\x17\xaa\x8b\xc6\xbf\x08\xe3\xd6" + "\xd6\x77\x37\x68\xf1\xdf\x6d\x0c\x79\x36\x2b\xcf\xd5\xfc\x1d\xc3" + "\xdd\x29\x4a\x1d\x5c\x66\xa8\x63\xfb\x4a\xdd\xd1\x17\x3a\xb7\x15" + "\xcb\xe4\xa8\xea\x1c\x85\xcf\x05\x41\xf9\xdd\x5d\xa6\xe0\xc3\xfb" + "\x4a\x15\x1c\xc6\x25\x77\xd7\x2a\x70\xe2\xfd\xc6\xdd\x07\x54\xe5" + "\x1a\x2f\xd2\xd6\x10\xdd\x9d\x1d\x2d\x74\xf7\x6e\xb7\x96\x96\x59" + "\x10\xc4\x39\x2b\x2e\x48\xcb\x2c\x93\x0a\x0e\xed\x73\x96\x25\x54" + "\x57\x37\x14\x91\x8e\x93\xbe\xce\x4a\x0b\x93\xe7\x95\xf3\x96\x87" + "\xd7\xf1\x59\x45\xaa\x74\x79\x7c\x34\xeb\x53\x39\x4e\x20\xff\xec" + "\xa1\x6f\x93\xc9\xe7\xa3\x73\x9d\xa4\x73\x93\xe5\xef\x25\xa1\x5e" + "\xcf\x6a\x0c\xc5\x4b\xdf\xb8\x19\xc4\x11\xc4\x59\x2e\x62\xbc\x59" + "\xdd\xaa\xb6\x79\x5c\x30\x53\x79\x4f\xe4\x16\x73\x83\x77\x77\x45" + "\x1a\x77\xf4\xd9\x67\x27\x6b\x79\x36\x7b\x5a\x90\x67\xb3\x53\x83" + "\x78\x67\x67\xa8\xe0\x3e\xc4\xe7\x25\x2a\x38\xeb\xc5\x74\x53\xe8" + "\xca\xec\xaa\x90\xba\x1a\x54\x38\x0e\xa8\xea\x6a\x54\xc1\x75\xe0" + "\x73\x4b\x64\xf9\xcc\xee\x8a\x2c\x9f\x7b\x20\xbc\x7c\xee\x31\x05" + "\xeb\xbd\x27\xf9\xe2\x76\x75\x4f\xba\x8a\x9e\x7a\x7c\xce\xd6\xda" + "\xd1\x3d\xd6\x90\xe7\x41\xf9\x33\xf4\x1d\xfb\x36\xa7\x46\x53\x7a" + "\xc1\x38\x30\x0a\x3b\xbb\xa7\x46\x9d\xff\x6e\xbf\xc8\x27\x1a\xf9" + "\x3b\x38\x7a\xbf\x29\xe0\x1c\xa1\x70\x04\xa3\xca\x77\x29\xb4\x6f" + "\x8b\x70\x96\xb7\xd2\xff\x39\x03\xd4\xff\xdd\xe3\x13\xef\x6d\x3e" + "\x39\xc4\xec\xef\x67\x47\xea\xcb\xfa\xec\x73\x66\xe0\x98\xc1\x2d" + "\xf8\x33\x07\xf5\xff\x71\x1e\x9b\xb0\xf2\x4f\x0e\xa1\x3e\xf5\x9f" + "\x84\x39\x9f\xe2\xef\x00\xfe\xfe\x46\xdb\xbf\xce\x59\xc2\xec\xba" + "\x85\xf5\xf6\xd0\x7e\x77\x4e\x01\x8e\x3d\xfa\x13\x7c\x65\xd9\x61" + "\xf2\xaa\x98\x3d\xea\xd1\x30\xe9\x74\x56\x7e\xbf\x0b\xe6\x1c\x27" + "\x7a\x55\xe9\x0e\x66\x1f\xb3\x88\xe0\x5d\x54\x1f\x96\x89\x24\x37" + "\x65\xff\x8f\xd0\xbd\xd4\xb8\x90\x76\x9c\x3f\x09\xa9\xdb\x45\x3b" + "\x52\x3f\xd7\xd6\x9d\x9a\x1c\xbe\x1d\xa9\xb3\xb0\x1d\xe7\xc3\xb7" + "\x23\x95\x7f\x13\x9a\x49\xd8\x96\x21\x71\x47\x6a\x01\xb6\xe5\x3c" + "\xe7\xbb\x36\xbd\x52\x19\xa7\xda\xce\xe3\xf8\x5f\x02\x5e\x76\x61" + "\x71\x50\x6e\x32\xdc\xa1\x84\x1a\xc8\x0a\x53\x67\x2b\xb3\x8f\x5e" + "\xe8\x82\x7b\xf5\x4a\x7f\x25\xa7\x77\x09\x5a\x90\x4f\x12\xf1\x09" + "\xdb\x83\xe5\x22\xc9\x5b\xb1\x4f\xf1\x9e\xe9\x5e\xb4\xff\x39\xdd" + "\x4a\x9f\x8e\xfd\xb9\x5b\xe1\x23\xe6\x65\x85\xe4\x79\x55\x79\xb9" + "\x9a\xbc\x92\xc1\xf4\x6d\x4a\xfa\xf0\xe4\x74\xef\xa1\x10\x39\xa1" + "\x7c\xee\x9b\xab\x6d\xf7\xbd\xcd\xa2\x7d\x28\xa3\x21\xbc\xbe\xd7" + "\x85\x32\x1a\x08\x2f\xa3\x7b\x7d\xe1\x75\xed\x3e\xfe\x3d\x27\x36" + "\x16\xc2\xe0\xbb\x8f\xf6\x8c\x0d\x70\x1d\x94\xe5\x34\x54\x3e\xf7" + "\x2d\x52\xe4\x33\xbc\x36\xde\x57\x13\xd2\x46\xff\x49\xb8\xff\x4a" + "\xd1\xd6\xfb\x57\x85\xe0\x3e\x18\x5e\x17\xef\x6b\xc1\x76\xfa\xc3" + "\xb7\xf3\xbe\xae\xc8\xba\x78\x3f\xbd\x0f\xf1\x0f\xd5\xc5\xfb\x4d" + "\xa2\x0c\x84\x2b\x33\x8d\xd9\xc3\xd5\x73\x7f\x06\xc5\x45\x2e\xb8" + "\x7f\x1b\xbd\xa7\x53\xa5\xe7\x68\xf5\x0f\xdb\x40\xe5\x88\x7f\x3e" + "\x31\x8e\x21\x39\x9c\x34\x83\x74\x31\x9d\xec\xb3\xdf\xdf\x1c\xc2" + "\xab\xb3\x27\x21\x6d\x6e\xaf\x24\x3d\x20\xf8\x35\x37\x26\x84\x26" + "\x57\x78\x7e\xdd\xef\x45\x7e\x9d\x0d\xcf\xaf\xb4\xc4\xc8\xfc\x4a" + "\x23\xf9\x9f\x1d\xca\xaf\xb4\x74\x35\xbf\xe8\x9b\xaa\xd4\xbe\xef" + "\x9b\x50\x37\x06\x96\xb1\x7a\xe1\xcb\x8d\x09\xa8\x2b\xa2\x4c\x0f" + "\x95\x29\x4e\xf0\x0a\x3d\x31\x5f\x0b\x86\x33\x90\x96\xa3\xd8\xff" + "\x98\x1a\x18\xcd\x06\x16\xd3\x5a\x6d\xfa\x46\x83\xd1\x59\x74\xd6" + "\x41\xdf\x72\xa4\xf9\xc6\x90\x7a\x1d\xe1\x7d\x41\x1a\xc6\xfc\x51" + "\xaf\x85\x49\x77\x8b\x39\xd3\xb9\x16\xad\x8f\x98\x6b\xd0\xca\x08" + "\xf9\x26\xf1\xd3\xc8\x75\xc3\xb9\x2e\x2c\xb3\xb9\x45\x43\x65\xf6" + "\xc0\x35\xb2\xbc\xce\x6b\xe9\x9b\x5b\x15\x5e\x5e\x73\xf7\x47\x96" + "\xd7\xdc\xe6\xc8\xf2\x9a\xeb\x22\x79\xb9\xe0\x01\x93\xb6\xdf\x98" + "\xeb\xd5\xb6\x17\xeb\xc5\x72\x4c\x1a\x75\x05\x3d\x0f\xb7\xdd\xca" + "\x45\x3e\x8e\x64\x55\x8f\xf1\x15\xd2\x3f\x8e\x68\x1c\x29\x8e\x88" + "\xb8\x91\x87\x55\x9b\x23\x7e\xf7\x23\xae\x1d\xc7\x95\xb4\x3e\x8f" + "\x7f\x97\x19\x1e\x38\x1d\x90\x74\x33\xf1\x5e\x3a\x09\xe9\xbf\x0a" + "\x48\x51\x65\xb4\x96\x8c\xef\x9f\xe3\xef\x27\x1e\xd4\xab\x65\x41" + "\x6b\xca\x68\x2e\x7a\xa7\x98\xe7\xfc\xec\x24\x3c\xb8\x43\xc8\x25" + "\x7d\x8f\x96\x8f\x0f\x5a\xc2\xcb\xe5\xc1\x54\x94\xcb\x67\xe1\xe5" + "\xf2\xe0\x92\xc8\x72\x79\xb0\x08\xe5\xf2\xd9\x50\x3b\x7a\xb0\x4a" + "\xb6\xa3\x17\xa8\x8c\x79\x1d\xc5\xab\xe9\xf4\x9c\x80\xf7\x68\x23" + "\x0f\xf2\xef\x3e\x4e\xec\x51\xec\x88\x97\xa1\xf1\x3f\xaf\x5f\x86" + "\x71\xc8\x38\xd4\x78\xbb\x13\x7a\xc2\xd9\x49\x3a\x5f\x33\x30\x29" + "\x0f\x0c\xc8\xc3\xec\xbd\x84\x23\x1f\xe0\x0c\xa4\x3f\x46\x70\x94" + "\x4e\xdf\x50\x50\xc1\xa7\x28\x70\x7c\x5e\x54\xc0\x5a\x58\x9f\x95" + "\x7f\x1b\x2a\x04\xb7\xdc\xfe\xd1\xbc\x1f\x21\x78\x82\x0b\x81\x29" + "\x13\xf6\x98\xde\xac\xb5\xc7\xf4\x1a\xad\x7e\x3e\x48\xef\x27\x12" + "\x02\xe8\xe7\x50\x97\x7b\xfc\x76\xdd\xcc\x6f\xc6\x36\xe7\x25\x86" + "\xd8\x26\xea\xc0\xbc\x5f\x0a\x1d\x98\xf7\x86\x96\xd6\x79\x13\xc2" + "\xeb\xc0\xbc\xb4\xc8\x3a\x30\x6f\x79\x64\x1d\x98\x57\x4c\x3a\xe0" + "\x82\x79\x87\xb4\xb6\x39\xaf\x5a\xdb\x76\xac\x97\xdb\x26\x5c\x3e" + "\x12\xdb\xc4\x58\xe8\x8a\x48\x76\x28\xc7\xff\x3a\xfa\x0e\xda\x08" + "\x78\x26\xbe\xeb\x03\x0f\xa5\xd3\x3b\x24\xf4\xf1\x56\xe2\x61\x1d" + "\x1f\xa3\x3d\xb4\x44\xcd\xc7\x9d\x62\xac\x65\x43\xd8\x13\xb4\x66" + "\x4f\xf0\xf3\xe1\x77\xb4\xed\x7f\xa8\x38\x3c\x3f\x1f\xaa\x46\x7e" + "\xda\xc2\xf3\xf3\xa1\x83\x91\xf9\xf9\x50\x2b\xed\xd1\x1e\x6a\x53" + "\x0f\xd1\x77\xda\x0d\x4a\xdf\x74\x06\x1e\x9e\x3d\xbc\xfe\xe9\xe1" + "\x24\x6d\xff\xf4\xb0\x7e\xe4\xfd\xd3\xc3\xcb\xc3\xf7\x4f\x0f\x17" + "\x85\xef\x9f\x1e\xae\x12\xf6\xf0\x70\x8b\xd6\x1e\x1e\xde\xaf\xd5" + "\x09\xe4\xdd\x37\xd6\x3f\x65\x98\x42\x6c\x60\xd7\x49\xc8\xd8\x83" + "\x31\xc5\x8b\x42\x6e\xf3\x9f\xd2\xd2\x98\x31\x2d\xbc\xdc\x32\x32" + "\x50\x6e\xbb\xc2\xcb\x2d\xc3\x1a\x59\x6e\x19\xdb\x50\x6e\xbb\x86" + "\xca\x2d\xa3\x76\xe4\x31\x45\xc6\x51\xad\xcc\x32\x1a\x47\x2e\xb3" + "\xf9\x89\xe1\x65\x36\x7f\x42\x78\x99\xcd\x4f\x13\x32\x9b\x5f\xac" + "\x95\xd9\xfc\x25\x5a\x99\x21\xdf\xbe\x31\x99\xcd\x6f\x0d\x91\xd9" + "\xfa\x93\xb0\x60\x3e\xca\xec\xa8\x90\x59\xe6\xe5\x21\x34\x76\x87" + "\x97\xd9\x02\x1c\x30\xc2\xfa\xf0\x32\x5b\x90\x14\x59\x66\x0b\x66" + "\xa0\xcc\xd6\x0f\x95\xd9\x82\xac\x91\xcb\x6c\xc1\x36\xad\xcc\x16" + "\xe4\x8e\x5c\x66\x0b\x5a\xc2\xcb\x6c\x81\x2b\xbc\xcc\x16\x78\x85" + "\xcc\x32\x53\xb4\x32\xcb\x34\x6a\x65\x86\x7c\xfb\x3b\x65\x86\xf2" + "\x69\x14\xeb\x75\x33\x5f\xed\xe5\x73\xda\x99\xe5\x2e\xc8\xca\x12" + "\xef\x04\xb2\xb8\xee\xc8\x32\x7c\x17\x61\x8a\x87\xf6\xdd\x99\xfb" + "\xe4\xb4\x1f\x0c\x95\x43\xa6\x03\xfb\xd5\x9e\xe6\x62\xbe\xae\x4b" + "\xc8\x90\x78\x8e\x70\x62\x8e\x2c\xd3\x45\x65\x51\xc6\xcc\xe9\xf5" + "\x01\xf5\xc5\x08\xef\x21\x3c\x74\x9e\x88\x16\x57\x56\xdc\x48\xe2" + "\xb2\xc8\x6b\xcc\x3f\x69\x74\x94\x4e\x45\x7c\x8f\x8c\x13\xba\x9a" + "\x15\x1a\xff\xd6\x63\x5d\xe7\x84\x9e\x3e\x1a\x32\x67\x92\x15\x21" + "\xfe\xcd\xa2\xf8\xb7\x3e\xbc\x9e\x66\x5d\x20\xfe\xcd\xa2\xf8\xb7" + "\x5e\x35\x5e\x1d\xbb\xd4\xe7\x0a\x19\xaf\x3e\xa2\x4f\xf0\x08\xdd" + "\xe1\x71\xec\xf6\x4f\x1a\xfb\xec\x8f\x4c\x08\xa1\x19\x65\xf3\xc8" + "\x3b\x32\xcd\x3f\x0a\x29\x9f\x16\x9e\xe6\x47\x96\x20\xcd\xef\x86" + "\xa7\xf9\x91\xa2\xc8\x34\x3f\x52\x8d\x34\xbf\x3b\xd4\xb6\x1e\x39" + "\x20\xeb\x41\x98\x71\xf9\x23\x2d\xe1\xe5\xff\x48\x88\xfc\x21\xbb" + "\xa0\x98\xb9\x79\x79\x0d\xdc\xa3\x06\x35\x1c\xad\xd5\x27\x58\xd2" + "\x91\x30\xb0\xd3\x42\x71\x46\x80\x5b\x32\x44\xf7\x68\x6f\x41\x58" + "\xdd\x7b\xb4\x5c\xd8\xe3\xa3\x2e\xad\x3d\x3e\xda\xa0\xb5\x47\xe4" + "\xb5\xb6\x9c\x43\x9b\x9f\x55\xf5\xcd\xf9\xd8\x85\x29\x21\x3a\xf0" + "\xfe\x49\x58\xf8\x33\xa1\x03\x8b\xa2\xb5\x74\x2c\x4c\x0f\xaf\x03" + "\x0b\x97\x63\xfb\xdf\x0f\xaf\x03\x0b\x8b\x23\xeb\xc0\x42\x5a\xcb" + "\xfc\xbe\x5a\x6f\x17\x16\xa7\x8e\x0e\x81\x39\x1c\xde\xe7\x2d\x3c" + "\x16\x7e\x5e\x67\x61\x8f\xe0\xf1\xa2\x64\x2d\x8f\x17\xe9\xb5\x3c" + "\xc4\xb6\xfc\xfd\x3c\x1c\x3c\xd7\xab\xcf\xbe\x28\xd4\xfe\x9d\x58" + "\xa7\x6c\xff\x8f\x9d\xd6\xd2\xb8\x48\x1e\xff\x84\x9b\xcb\x5a\x74" + "\x00\x79\xe9\x0c\xcf\xcb\x45\x2d\xe1\xdb\xbc\xc8\x85\x7d\x90\x33" + "\x30\xc4\x96\x16\x79\x31\x7d\x21\xff\x36\xe3\x79\x30\xd6\x61\xfa" + "\x42\x1f\x18\x78\x7f\x35\xd8\x2f\x3d\x46\xfb\x0e\x18\x9f\x63\x46" + "\xfd\x4d\x48\x82\x2c\xea\x83\x88\xae\x65\xc5\xa1\xef\x44\x1f\xe3" + "\xf3\x1f\xb4\x8e\x85\xf6\xd5\x24\x14\x41\x96\xd3\xe3\x03\x45\xdf" + "\x09\x3e\x04\x77\x11\xd9\x05\xc1\x2b\xb0\x62\xae\xb3\x2c\xc4\x37" + "\x3d\xd6\x10\x5e\xc6\x8f\x35\x46\xd6\x9d\xc7\x8e\x09\x39\x3f\x6e" + "\xd0\xca\xf9\xb1\x9e\x80\x7d\xcc\x22\x6a\x2b\xea\xc0\x88\xec\x84" + "\xde\x9d\x46\xf4\xf7\x2f\x2c\xee\xc8\x2b\x85\xeb\x4f\xc1\xe3\x79" + "\xbc\x3e\x89\x79\x13\xb6\xea\xa0\x99\xfb\x80\xc7\x8f\x70\x3a\x11" + "\x66\x99\x0f\x24\xf6\xc2\xb3\x1d\x94\x57\x6f\x67\x5e\xfe\xed\x49" + "\x3b\x3b\x4a\xe7\xf1\xa0\x2e\x5c\xd1\x09\x8f\x6f\xd7\x94\x47\xad" + "\x74\x0a\x1c\xcd\x62\x7e\xff\x71\x87\x32\x0f\x1f\x69\x7e\x1f\x61" + "\xba\x94\x75\xbf\xe2\x5d\xd8\xe3\x1d\x11\xfb\x65\xa4\x89\xf6\x90" + "\x13\x4d\x17\xf6\x03\x3f\x98\xa1\xe8\xaf\x78\x37\xf7\x83\xf4\xe0" + "\xde\x96\x1f\x2c\xc2\x3c\xdf\x05\xe6\x73\x55\x76\xf0\x83\x32\x35" + "\x1e\x71\xb6\xdd\x0f\xaa\x95\xfd\x29\x78\xdf\x70\x11\x5c\x0a\x3d" + "\x2d\x21\xf4\xa0\x3c\x1f\xf6\xc9\x38\xba\x2e\x82\x23\xd1\xb9\x6f" + "\x26\x4c\x0a\x40\xd4\x29\x78\x72\x4a\x35\xad\xd1\xa9\xed\x86\x38" + "\x1f\xe8\xc5\xd8\x2e\xfb\x2e\xda\x1b\x42\x63\x43\xa7\x6f\x8e\x83" + "\xde\xc1\xf1\x35\x04\xa6\x39\x8e\xb6\x22\xbf\x7c\xf6\x58\xf6\x3c" + "\xe2\x69\x9b\xf5\xac\xa3\x76\x37\xeb\xde\xcb\xcf\x9c\xca\xd6\x8c" + "\xff\x2a\x69\xfd\x0f\xad\xc3\x28\x85\x39\x08\x7f\x42\xd8\xfa\x93" + "\x21\x31\x69\x76\x84\xf1\x5f\x36\x8d\xff\xe6\x84\xb7\xf3\xec\x0b" + "\x8c\xff\xb2\x69\xfc\x37\x47\xdd\x6f\x8a\xf7\x3c\xd9\x5d\xea\x98" + "\x94\xce\x85\x32\xaf\xa6\x38\xf3\x89\x27\x6e\xab\x06\xa3\x8f\xde" + "\x69\xa3\x6d\x3a\xbb\x9b\xc9\x5e\x8d\x6d\xee\x46\x3a\x8f\xc1\x40" + "\xdf\xcc\x16\x7d\x19\xd9\xeb\x13\x7c\xbe\x30\xc1\x27\x6c\xd1\x56" + "\xc4\xdc\x13\xba\x50\x87\xd6\x5b\x15\x5c\x89\x25\x56\xb1\xef\x63" + "\x4c\x17\x8c\x76\x76\xf3\x7e\x51\x47\xf1\x2a\x8f\x5b\x7d\xe7\x80" + "\xf0\x36\x15\xb7\x01\xe1\x0d\x0c\xf6\x93\x1c\xf7\x36\xb2\x71\xc2" + "\x49\xb8\xdb\x11\x8e\xf0\x12\x9c\xd2\x0e\xb1\x37\xe6\x89\x03\xea" + "\xb6\xf3\xf9\x17\xac\x1b\xd3\xff\x4a\xf3\x2a\x4e\x2a\x67\x5b\xcc" + "\x26\x75\xd1\x3b\xb3\xb3\x0e\x66\x7b\x96\x4d\xca\xa7\x39\xb1\x27" + "\xef\xa2\x72\xef\xfe\xc5\x15\x5d\x30\x0e\x0c\x22\xed\x09\x4f\xb3" + "\xd9\x0b\x2e\x78\x72\x86\xd6\x47\x3c\x19\x12\xff\x66\xf3\x71\x26" + "\xfe\xc6\xd1\xfa\x44\x79\xfd\x2a\xf9\x03\xe6\xf4\xf5\x71\xfd\xb8" + "\xd0\x9a\x0a\x7a\x27\x4d\x6b\xa2\xc4\xb9\x67\x4f\x96\x85\xcc\xbd" + "\xb9\x77\xf2\x75\x35\x7f\xc6\x7a\x17\xc7\x0b\x1d\x59\x12\xaf\x95" + "\xe9\x93\x0d\xb6\xd3\xf4\x2e\x48\xf4\x07\x4b\x7d\xa1\xfe\xf1\x49" + "\x87\x12\xbb\x85\xa4\x77\x28\xfd\x81\x79\x1d\xe1\x5d\x1c\xd2\xcf" + "\x3c\xc9\xe3\x7f\xff\x90\x7e\x61\x31\xed\xa3\xd2\xe8\x64\x3b\xd7" + "\xa1\xc5\x96\x36\x0f\xea\x4d\x3e\xe9\xff\xe2\x1f\x21\xcc\x56\xda" + "\x73\x88\xcf\xa3\xcf\xc0\xe2\x6c\xbf\x1d\x0c\x6d\x6e\xbe\xa7\xca" + "\x88\x3a\xc2\xf5\x96\xfa\x8d\xc9\x62\x3d\x92\x27\xa4\x8e\x02\x85" + "\xe7\x04\xd3\x9e\xff\x67\x10\xeb\x29\x48\x17\x16\xa7\xd3\xda\x8c" + "\x31\x3d\x30\x9a\x70\x29\x3a\xe4\xf4\x75\x40\xbb\x2f\x74\xcc\xb3" + "\xf8\x70\xf8\xb6\x2f\xa6\xfe\xff\x35\x17\x2c\x99\xa0\x95\xed\x62" + "\xde\xff\x2b\xef\x75\x50\xf6\x5e\x6d\xb9\x25\x71\x5a\xd9\x3f\xd9" + "\x40\xf9\x11\xd7\xf8\x94\x7f\x72\x18\xc7\x33\xcb\x3c\x7c\xbd\xd7" + "\x12\xb4\xff\x27\x97\x5c\xc8\x0f\x32\xc3\x27\x87\x03\x08\x2b\xaf" + "\x0b\x46\xbf\xb5\xa4\x4a\x33\x67\x74\x15\x9f\x33\x5a\x76\x12\x9e" + "\x92\xdf\xfd\x3c\xf5\x49\x08\x7d\x07\x22\xc7\x06\x4b\xe8\xfd\xcf" + "\xb2\xf0\x3e\x63\x49\x57\xf8\xd8\x60\x89\x4f\xf6\x0b\xcb\x58\x4c" + "\xa8\x1e\x3c\x65\x42\x19\xf3\x32\xca\x18\x96\xe6\x42\x23\x8f\x61" + "\x9f\x4a\x1f\x1c\xc3\xe6\x93\x3f\x78\x2a\x65\x70\x0c\xeb\x0e\x37" + "\x86\x75\x85\x91\xe7\x53\x95\xe1\xe5\xf9\xd4\xbe\xf0\x63\xd8\xa7" + "\x0e\x8b\x7e\xfe\x29\xb7\x56\xce\x4f\x1d\x0b\xbe\x13\x5e\x72\xe0" + "\x9b\x8b\x87\x97\xa6\x0e\x8d\x87\x97\xbe\x27\x64\xb5\xd4\xaf\xa5" + "\x6d\x69\x76\x78\xdf\xbe\x34\x2f\x72\x3c\xbc\xb4\x32\xb2\x6f\x5f" + "\xba\x7f\x68\x3c\x6c\x1e\x15\x02\xd3\x3a\x18\x2b\x69\x62\xb3\xa5" + "\x5d\x82\x4f\xcb\x28\x9e\x8b\x52\xc1\xfb\xb4\xfa\x8e\x34\x23\x3e" + "\xf4\x6d\xa7\xc8\xa7\x29\x3a\x13\x89\x27\x74\x36\xd3\xf7\xab\x21" + "\x06\x6d\xe0\xfd\x3e\xfb\xb2\x41\xfd\xa7\x75\x7c\x54\x0f\xf9\xc8" + "\x88\xeb\xe9\x24\x85\x3e\xa2\x63\xd9\xb6\x0b\xbd\x2f\x8d\x32\x41" + "\xd6\xeb\x43\xf8\xb1\x8c\xc7\x7f\x84\xe3\xc2\x32\x5b\xe6\x09\xb1" + "\x31\x8f\x58\x87\xbb\xfc\x37\x42\x6e\xcb\x43\xc6\xb2\xcb\x8d\x7c" + "\x4f\x5f\x44\x7f\xbb\x3c\x25\xbc\x8e\x2e\x4f\x1f\xf4\xb7\xf9\x1c" + "\xef\xd6\x90\x7c\xab\x90\xc1\x72\x47\x20\x46\x3d\xd7\xbd\xbc\x4c" + "\xeb\x93\x96\x5b\x43\xca\x85\x8c\xff\x96\x93\x4f\x8c\xb4\xc6\x21" + "\xa4\xbf\x59\xee\x8e\xdc\xdf\xac\x28\x11\xed\x5f\x19\xf2\x7e\x79" + "\x85\xf1\xc2\xfd\xcd\x8a\x08\xed\x5f\x91\xae\xed\x6f\x56\x86\xbc" + "\xa3\x5f\x61\x0d\xdf\xdf\xac\x28\x53\xfc\x8c\xf0\x1b\x2b\xfe\x34" + "\x3c\x7f\xb3\xa2\x51\xeb\x6f\x56\x34\x5c\xcc\xdf\x34\x0d\xf1\x37" + "\x2b\x7c\x09\xb5\xe1\xda\xb2\x32\x31\xbc\xbf\x59\x39\x41\xc8\x70" + "\xe5\x36\xad\xbf\x59\x99\xa6\x95\xe1\x8a\x10\x19\xae\x0c\x79\xff" + "\xbd\xc2\x78\xa9\x3e\x29\x2a\x2a\x4a\x8a\xd2\x49\xba\x28\xa0\x8f" + "\x43\xe9\x60\x74\x94\x3e\x2a\x1a\xaf\x51\xf2\xef\x68\x29\x4a\xd2" + "\xe3\x15\x2d\xff\x8e\x0a\x79\x1e\x4d\x65\xf1\xd2\xcb\xbf\xd1\x21" + "\xcf\xa3\x2e\x92\x3f\x5a\xae\x57\xa9\x5f\x1f\xf2\x1c\x7d\x91\xfc" + "\x51\x7f\x67\x79\x18\xf2\xac\xdd\x07\x39\x6f\xdd\xc6\x15\xb9\x6b" + "\x72\xf8\xba\xf6\x55\xe6\x15\x4f\x3f\xbd\x6a\xc3\x06\x73\xc1\x7a" + "\xf3\x7d\xf7\x3e\x3a\x75\xa6\x59\x2c\x8f\xcf\x9d\x3d\x3e\x27\x16" + "\xe6\x17\xe6\x53\xc6\xfc\x85\xf3\xb2\xcd\x59\xf7\xdd\xab\xcd\x54" + "\xd0\xf0\x65\xf0\x17\xc2\xa2\xb2\xbd\xd4\xed\x57\x01\x54\x5e\xc5" + "\xfd\x4e\x17\xed\x3d\x17\xe3\x09\xeb\xef\x5b\xf7\xe1\x78\xa2\xdf" + "\xc6\x68\x5f\x45\x27\xe4\xbc\x48\x8d\x98\xd8\x50\x06\x79\xab\xe9" + "\x3c\x95\x9c\x1f\xb1\x5f\xbb\xc1\xfc\x10\x48\x9d\xb0\xf6\x44\x33" + "\x8e\xa2\xe9\xd9\xd9\xe5\x03\xb3\x8d\x62\x5b\xeb\x56\xcc\xd3\xb1" + "\x7b\x02\x98\xe6\x91\xf7\xe7\xff\xf0\x55\x9e\xf6\xeb\x32\x05\x2e" + "\xe1\x24\xac\x9a\xcb\x7e\xcd\xf8\x33\x9d\x5b\x23\xe0\x56\x5d\x13" + "\xb0\x3f\xdd\x41\x7e\xa1\xf6\x35\xd0\xd7\xbd\x06\xb0\x67\x2c\x18" + "\xf6\x5c\x45\x67\xcd\xae\x8a\x53\xd6\x65\x6f\xc7\x67\x17\xac\x75" + "\x51\xdd\x04\x1b\x90\x72\x24\x0e\x3f\x56\x03\x3f\x2b\xb8\x8e\x7b" + "\x55\x9c\x84\x70\x99\x9f\x43\x82\x37\xf6\x63\xb7\xb3\xb8\x0c\x12" + "\xfc\xec\xcb\x49\xe9\xa0\x6b\x47\xcb\xd8\xe4\x63\x3e\x47\xfe\x29" + "\xaa\x7f\x7b\xc2\x26\xf6\xa5\x13\xe3\xc6\xf9\x3d\x36\xb6\xf3\x34" + "\xe8\xd1\xa6\x75\x8e\x7c\xda\x4f\xb1\x2a\xaf\xee\x3c\xe8\x91\x07" + "\x49\xa7\x60\x75\x43\xf1\x7c\xe6\xb7\xcd\x07\xfd\x47\x45\xb4\xe7" + "\xf5\x8f\xb1\x3b\xff\x0d\xf4\xff\xdc\x5f\x26\xf5\x33\x13\x14\x17" + "\xb0\x6e\x46\x67\x50\x7b\x98\x97\xd6\xdc\xb6\x2e\xf7\x23\xcc\x1f" + "\xfa\xfb\x6c\x26\x68\x2f\xf0\x40\xc9\x71\xe6\x2d\xff\x37\x71\x66" + "\x45\x5b\x8f\x87\xf6\xd0\x1a\x4a\xe6\x43\xd4\xc9\x6c\x90\xda\xac" + "\x35\xe0\x5c\xe2\x81\xe2\xe3\xac\xbb\x75\xf9\xe7\xd0\x6e\x3d\x08" + "\xcb\x3a\x40\x6a\xed\xfa\x14\xf8\x39\xca\x3b\xc7\xa4\x96\x9e\x03" + "\x53\xc9\x1a\x4a\x3b\x07\x9b\x4b\x20\x7e\xf3\x27\x34\x16\xea\xc0" + "\x7a\x4e\xc3\x93\xc7\x40\x87\xf8\xa4\x2d\x9f\x82\x69\xcb\x13\xb4" + "\xd7\x3c\x15\x6a\x4b\xc1\xc4\x6c\x96\xb8\x7e\x9b\xc5\xd8\xcf\x2c" + "\x63\xfb\x6c\x96\xc4\xf6\x3c\x84\xef\x7a\x0f\xc6\x74\x40\xe2\xaf" + "\x4f\x75\x48\x35\x5f\x41\x92\x79\x01\xc9\x7f\x75\x6d\xed\x57\x08" + "\x5f\xf1\x1f\xee\x00\x96\x55\x97\xf1\xc5\x74\x19\x9c\xd9\x5e\x08" + "\x20\xae\x9a\x7e\x48\xaa\xed\x07\x53\x60\xfb\x7f\xb8\x89\x17\x03" + "\x15\xff\x4e\xe7\xfe\x8e\x7e\x77\x65\xa3\xde\xd9\xda\x03\x6d\x9e" + "\x7e\x68\x87\x3f\x83\xb3\xe8\x0b\xc7\x3f\xaf\x6c\x8c\xc6\x38\x52" + "\xe7\xd8\x4c\x6b\xdf\x85\xce\xd8\xda\xe8\xfc\xbc\x32\xd8\x55\x0a" + "\x71\x79\x9b\x61\xf4\x29\x4c\xe7\x3e\xa7\xfc\x03\xe4\xd9\x17\x8e" + "\xcd\x7c\x1f\xf8\x5a\x57\x69\x1b\x44\xb5\x7b\x6a\x68\xbf\xb1\xe4" + "\x1f\x33\x26\xd5\xe9\x39\x0a\xce\xbc\xcf\x1c\x81\xb8\x31\x96\xca" + "\x00\x18\x7e\xf6\xf5\x51\xc9\xa9\xff\x1a\x9c\xd9\x1e\x78\x1f\xeb" + "\x66\x3b\xc7\x64\xa0\xaf\x4a\x6d\xf7\x78\xe9\xdc\x9d\x14\xd6\x6b" + "\x8a\xdd\x95\x0f\x13\xea\xbe\x82\xe4\xbd\x5f\x81\x85\xf5\x59\x24" + "\xda\xdb\x4d\xe7\xa5\xed\xc5\xdf\x38\x1c\x7b\x61\x7b\xf9\x1e\x6f" + "\x16\x2f\xef\xf1\x1e\xb0\x40\x7d\x7f\x70\x8f\x77\x7f\x6f\x70\x8f" + "\x37\xea\x92\x91\xf6\x79\xa3\x5d\xb4\x90\x3e\xef\x3a\x03\xfa\x17" + "\xce\x00\x4c\x2a\x93\xc0\xbc\x92\xce\xfa\xb0\x3e\xef\xcc\x39\xcd" + "\xef\x3b\xc1\x3a\x01\x7f\xe3\xf0\xc2\xf1\x9b\x75\x1c\xb5\xaf\x4b" + "\xd6\x5b\x4c\x93\x30\xed\x4a\xfc\x8d\xc2\xdf\x78\x5b\x2d\x73\x63" + "\x1d\x74\xe6\x4c\x2c\xe9\xaf\xbc\x9f\xbc\xa5\xcf\x6e\xd5\xbb\xe0" + "\xd5\xc3\x8a\x1e\x0b\x7f\xbe\xca\xf8\xfe\xc9\xd3\x74\xae\xb9\x9b" + "\xd3\x33\x60\xd5\xd1\x19\xe7\x72\x3a\xd1\xb0\x96\xea\xc5\xfa\xb3" + "\xf0\x37\x01\x2f\xb4\xcb\x1f\x76\x29\x65\x7b\x07\xac\x54\xe7\x2a" + "\x4c\x67\x4a\x3a\xb6\x57\x4f\x79\xff\xe3\xe4\x69\x49\xc0\x58\x24" + "\xc4\xe9\x95\xf1\xa3\xad\xe7\x1c\x22\x9b\xee\x95\x12\x58\x53\xce" + "\x34\xa8\xbd\x8a\x1d\xdd\xbb\x9b\x35\x0b\x5b\xb3\xee\x77\xc1\xeb" + "\xfc\x2c\x73\xec\xb3\x9b\x2b\x31\xaf\xc9\x0c\x40\x7c\x69\x5e\x4e" + "\xeb\x49\xad\x2d\x2e\xb8\x2c\x59\xdd\x06\x66\x5f\xd9\x48\xfd\xe6" + "\xcf\x4b\x1d\xd1\x4c\x7a\xba\xb1\xdd\xd5\x03\xff\xdc\xdf\x1d\x6d" + "\xfb\x1d\x48\x4e\x5f\x27\x4c\x4e\x04\x13\xcd\xc1\xd4\xef\x66\x2e" + "\xfc\xed\xc6\xab\x07\xf5\xe4\xba\x53\xb0\xe6\xca\xdb\x12\x21\xf1" + "\xe3\x22\x90\xfd\xd1\x9a\x89\x2a\x7f\xf4\xcb\xb6\xae\x46\x95\x2f" + "\x5a\xbb\x6a\xa8\x2f\xca\x5d\x21\x7c\x11\xf3\x09\xdf\xe3\x77\xc9" + "\xe9\xf3\x43\xd2\xe5\xfd\x2a\xb9\x53\x42\xd2\xbd\x72\xfa\x75\x21" + "\xe9\x6e\x91\xfe\xec\x53\x8a\xaf\x6b\x27\x3a\x0a\xc9\xd7\x3d\x7b" + "\x2f\xf9\xba\xf6\x1c\xd9\xd7\xf1\xbd\x98\xcf\x8e\x67\xff\x54\x06" + "\x74\x8e\xce\x49\x78\xc6\x4f\xf4\xb3\x5f\x83\x42\x7b\x0c\xa6\xbd" + "\x47\x69\x55\x7f\x06\x3d\x5e\xdc\xcf\x31\x7b\xce\x0d\xe4\xe7\xc8" + "\xc7\xd1\x3e\x98\xb7\xaf\x62\x1d\x6f\xef\x66\xc7\x6a\x77\xb3\xd6" + "\x3e\xfb\x33\x13\x14\x7f\xf7\x0a\xa6\x55\x62\xda\x2b\x98\x4f\x7e" + "\x8f\x78\xd2\x96\xdd\x48\xe7\x8a\x76\xa1\x8e\x19\x12\x74\x90\xb7" + "\x13\x75\x9e\xce\xbb\xda\x86\xfc\x75\x16\x78\xf8\x9e\x13\x7e\x1e" + "\xb8\x94\x82\x3e\xaa\x8b\xec\xed\xaa\x17\x02\x34\x2f\xf1\x39\x94" + "\x7a\xd8\x29\xda\x9b\x42\x34\x2c\xdb\xf4\x10\x9d\x6f\xad\x6b\xc6" + "\xe8\x88\xce\x21\xa0\xbd\x33\xe8\x77\xf5\x55\x48\x93\x38\xdf\xf7" + "\x99\x43\x18\xb9\xa4\x0a\x59\xaf\xe5\xe7\xe7\x77\xc2\x1a\x2f\xb3" + "\xa3\x2f\xc4\xb6\x25\xf8\xcb\x80\xce\x62\x41\x1b\xa5\x79\x56\xeb" + "\xdb\x78\x55\x29\xe7\xb1\xd0\xb7\x14\x10\xc6\xd9\xe1\x05\xa2\xd9" + "\x05\xcf\xa4\xb5\x15\x37\x52\xf9\x6e\xe2\x0d\xb3\xdb\x14\x1c\x3a" + "\x7e\x9e\x0b\x8e\xe1\xe9\x3c\x17\x84\xe3\x73\x86\x2c\xf6\xdf\xdd" + "\x6d\x4b\xdc\x40\x7e\xde\xd9\x8d\x38\x8a\x3b\x05\x0e\xc4\xc5\xd0" + "\xef\x6b\xf2\x64\xfc\xf1\x25\xec\x4b\xc4\x7f\x88\xe4\x45\xe7\x72" + "\xd1\xba\x24\xe4\x4b\x1c\x9d\xcd\x20\xe2\xce\x67\x66\xd7\xff\x19" + "\x40\x3e\x5b\x0c\xf5\xed\x99\x59\x74\x76\x17\x9d\x27\xc6\xcf\x12" + "\x93\xa6\x01\x2b\xb4\xc4\x0d\x9e\x27\xf6\x5f\x70\x96\x18\xf2\xdf" + "\x54\x27\xb1\x83\x48\xff\x2c\x3a\x4f\x0c\xe9\xaf\x25\x3d\x94\xdb" + "\x94\xfa\xc6\x93\x9c\xe7\xdb\x28\x6d\x97\x9d\xb5\x28\xf2\xa7\xf6" + "\x52\x5b\x30\xcf\x2a\xe2\x41\x76\xd4\x05\xb9\xa9\x94\x8f\x69\x8b" + "\x08\x7e\x32\xfa\x31\x67\x8e\x1f\xde\x3d\xe9\x97\x76\x6d\x06\xbd" + "\xf0\x69\x6b\x9f\xa0\xf2\xc2\xa7\xad\x35\x06\x7d\xda\xda\x68\xe1" + "\xd3\x04\x8f\x85\x4f\xcb\x3d\x2f\x7c\x5a\xee\x97\x7c\xfd\x10\xfa" + "\x34\xca\x23\xbf\xa6\xf8\xb4\xbd\x57\xb1\x16\xf2\x1d\x7d\xf6\x5c" + "\x97\xe2\xdb\x76\x60\x1a\xf9\x0e\xa2\x51\xf8\xa9\x67\x67\xb0\xff" + "\x63\x01\xb1\x3e\x93\xee\xad\x74\x5e\x46\xb7\x7c\x4f\xfd\xc8\x23" + "\xc2\xc7\xad\x9d\x16\xf4\x71\xb9\x8d\xc1\xb2\xe4\xe3\xd6\xce\x13" + "\x3e\x4e\xa4\xd7\x3f\x49\x3e\xee\xd9\x19\xc4\x03\x19\xbf\x44\xef" + "\xcd\x64\x78\xe2\x63\xaa\xda\xc7\x69\xed\x6b\x6d\xa5\xe2\xe3\xc8" + "\xb7\xe1\x73\xad\x0b\x62\x5b\xb8\xbd\x21\x5c\x35\xf2\x5c\xb1\x3b" + "\x92\x01\xb5\x99\xce\xc9\x27\xbe\xdd\x7f\x1a\x46\xcb\xe7\xd4\xc8" + "\xed\x5e\xdb\xa1\xec\xc9\x44\xfe\xbb\x42\x63\x66\x7c\x1e\x8c\xd3" + "\x50\xd6\x37\xd0\x19\x8e\xce\xb2\x4e\x70\xd6\xb0\xb2\x76\xdf\x71" + "\x08\xbc\xf0\xec\x09\x92\x2b\x8e\x2f\x46\xd1\x2f\xf9\x9d\x53\xb0" + "\xee\x9a\x65\x1e\x3e\x5f\x7f\x62\x97\x84\x79\x45\x70\xb7\x2a\x8f" + "\xef\xb1\x57\x95\x9b\xa8\xca\x7b\x84\xf2\x68\x8e\x11\xef\x21\xd2" + "\x9c\xc2\x08\xe8\xf8\xd1\x05\xe8\x78\xef\x02\x74\xfc\x89\xd3\x81" + "\xf1\x16\x8e\x8f\x2e\x3f\x03\xeb\xe4\xbd\x21\x78\x85\xad\x67\x7d" + "\x8c\x9c\x1f\xa5\xca\x57\xd5\xb5\xfe\x96\x30\xe5\x55\xf5\xad\x9f" + "\x77\x11\xfc\x6b\x2e\x82\x7f\xfb\x45\xf0\xbf\x43\xbe\x8f\xf6\xfd" + "\xf9\xed\x5a\xb8\x49\x3e\x6e\x7b\x2d\x74\x76\x14\xc2\xfd\x5e\x7e" + "\xdf\x72\xc2\x36\x8e\x8f\xff\xf8\x79\x41\x3b\x31\x9f\x9f\x93\x8b" + "\x7e\x39\x6d\x13\x80\x58\xd3\xa7\x94\xc9\x8b\x0e\xa5\x6d\x8c\x4f" + "\xa1\x8d\xe7\x8f\x0f\xa5\x0d\xf3\x27\xaa\xf2\xe7\x06\x65\xbe\xde" + "\x71\x81\x79\xa4\x38\x67\x0d\xf0\x6f\xc7\x34\xe1\xb0\x85\xf6\xfa" + "\x54\x0f\xbe\x1b\xc9\x43\xfd\x5f\xcb\xdf\xed\xc8\xfb\x8a\x7b\xd0" + "\xa7\xdf\x40\xe7\x80\x52\xcc\x2b\xef\x05\xb9\x1a\xfb\x91\xb1\x74" + "\x4e\x0c\xcd\xa7\x2f\xf3\x67\x49\x4d\xc5\x64\x3b\x79\x1d\x4a\xd9" + "\x48\x73\x8f\x54\xaf\x5c\x27\xdf\x27\xd5\x67\x7f\x2e\x4e\x29\x43" + "\xb8\x69\x6f\x10\xfa\xff\x1b\xf8\xf9\x6b\xbe\x1e\xf2\xb7\x57\x63" + "\x7c\x3c\x56\xd4\xb3\x1c\x44\x3d\xcf\xa5\xba\x60\x5d\xd1\x85\xf6" + "\x61\x45\x6e\xdf\x73\xc5\x23\x6f\x1f\xc8\xed\x7b\xae\xf1\x22\xed" + "\xbb\x50\xbd\x9e\x91\xd7\x6b\x94\xeb\xcd\x4f\x19\x39\x5f\xf3\x73" + "\x86\xcf\xd7\x14\x99\xaf\xf9\x35\x17\xe1\x6b\xb8\x7a\x5a\x87\x5f" + "\x8f\x59\xae\x67\x03\x84\xab\x07\xf8\x5f\xc4\xf3\x84\x0c\xca\xb7" + "\x5b\xe8\x3b\x46\xe2\x1b\x0d\x1b\xd2\xd5\xdf\xa8\x12\xdf\x37\xda" + "\xb0\x44\xf9\x46\x55\x70\x9f\xd9\x86\x4d\xcb\x1a\x28\x0e\x61\x01" + "\x17\x6c\x28\xa6\xb9\xc0\xb4\x12\x71\x7e\xa1\x5c\xa6\xea\x22\xdf" + "\xc6\xa2\x33\x7c\xf8\xf9\x1c\x8c\xf1\xb3\x62\x3c\xe2\x1c\xc0\x0d" + "\xbf\xa7\x3d\x83\x62\x4d\x11\x3f\xf4\x8b\x70\xe1\x18\x76\x03\x3f" + "\xbf\x9d\xce\x96\xef\xb5\xc9\xf0\xd7\x52\x1f\xaa\xc0\x14\x80\x02" + "\x13\x76\x4e\xb2\xa2\xd3\xb5\xaf\x34\x45\xb3\xbf\x71\x6e\x7e\xfe" + "\xfa\xfc\x99\xe6\x0d\x6b\x57\x4e\xdc\x50\xb0\xa2\xe0\xf9\x0d\x7c" + "\x23\x7c\x2c\x60\x82\xb9\x60\xcd\xda\x55\xeb\x9f\x2f\xb0\x14\xae" + "\x58\x23\x36\xce\xdf\x82\x80\x6a\x20\xd0\x7c\xd3\xc4\x84\x3e\xe8" + "\x28\x93\xf8\x19\x17\x3d\xd4\x26\x3a\xeb\x44\xd9\x17\xdc\x6c\x02" + "\xf0\xe0\xf8\x08\x69\xdc\xe7\x82\x1f\xb8\x15\x3e\xd2\xf9\x8b\x18" + "\x27\x99\x4e\x41\xc1\x6f\x48\xf6\x99\x18\xf2\xd6\x8b\x73\x2b\xf8" + "\xd9\x03\xce\x02\x4c\x68\x07\x83\x63\x23\xcd\xf3\x3e\x3f\x23\x60" + "\x2f\xb0\xf0\xf3\x24\x37\xd3\xf8\xfb\xf9\xa7\x94\xb8\x84\xde\x5b" + "\x89\xf7\xcc\x37\xcc\xe9\x84\x82\x1d\x54\x2f\xd9\x4d\x1d\xc6\xbf" + "\x84\x8b\xd9\x0b\x52\x29\x06\xc6\x67\x43\x9f\xfd\x79\x8b\x12\xfb" + "\x22\xbd\x71\x2c\xa6\x13\xe3\x9a\xe7\x97\xfc\xd6\xe8\x06\x79\x2f" + "\xb9\xa1\x4e\xec\x1b\xd7\x23\xec\xa2\x41\x58\x3b\x9d\xad\xdc\x79" + "\x94\xbe\x7b\x16\x96\xbf\xb1\xae\x83\x81\x81\xec\x68\x75\x9b\x71" + "\xcc\x8e\xf2\xd9\x18\x8f\x6d\x4f\x24\x59\xcb\xe7\x9d\x8c\x42\xda" + "\xcf\x89\xf3\x9d\x5d\x07\x31\x6d\x14\xfe\xb6\x90\x4c\xe9\x8c\x05" + "\xcc\xa3\xb5\x3e\xba\xf6\xe2\xb3\x8e\x26\x53\x27\xea\xf5\xf3\x34" + "\x77\x9d\x2c\xf6\xc5\x21\x3c\xd6\xe1\x2c\xeb\x87\x66\x33\x73\xd0" + "\x1c\xa0\x0b\x36\x26\x37\x9b\x3d\xc0\xa2\x16\x9f\xa0\x72\x68\x17" + "\x26\x5b\x11\xc5\x3e\x98\xce\xf7\xff\x6d\x34\x29\x3c\x2f\x30\xb3" + "\xd3\x04\x13\x69\xde\x9a\xfa\xe0\x5d\xbc\x2f\xf9\x0a\x68\x8d\x57" + "\x17\x6c\x9c\x15\xea\xef\xc7\xe7\xcc\x34\xe7\xac\x28\x30\xe7\xae" + "\x59\xb7\xca\x9c\xb3\x26\xc7\xbc\x6e\x7d\x81\xf9\x87\xeb\x69\x02" + "\x89\xa6\x8c\x34\x3a\x11\xa0\xf6\x15\x66\x47\x2b\xef\xc8\x7b\x0b" + "\xad\xa3\xb0\xfd\xc8\x93\xc2\x37\x7a\xfb\xac\xa3\xb5\x3c\x29\x94" + "\xcf\xe2\xda\x88\xe3\xbf\xe7\x73\xc5\xfe\xc2\xa8\x6e\x7c\xc6\xf6" + "\x6f\x4c\xd1\xda\x5e\xe1\x11\x19\xd6\xa3\xc0\x72\xbd\xb8\xf1\xd4" + "\x60\xde\x2e\x59\x1f\xeb\xc5\x3e\x68\x7e\xae\x4e\x3d\xdf\x23\x50" + "\x68\x89\x58\x86\xce\x12\xdb\x0c\x4f\x9f\x81\xc2\xcb\x99\x7d\xe3" + "\x12\x59\x87\x0c\x81\x72\x97\x43\xd6\x1f\xd4\x89\x42\xeb\x50\xfd" + "\x29\x6c\x26\xfd\x61\x7d\xd9\x06\xbe\x9e\xc4\xe7\x45\x3f\x85\xcf" + "\xd8\x9f\x22\xed\xad\xd4\x0e\x4f\x61\xb6\xc1\xb6\x87\xf7\xd7\x7f" + "\xa5\x77\xb3\x4d\x5e\x7e\x16\x54\x0c\xea\x06\xca\xa8\xf0\xb0\x22" + "\x23\x05\x3e\xbc\x0d\x73\x7d\xd1\xea\x18\xe7\x67\xd1\x95\x5c\xc7" + "\x30\x2e\x40\x9a\x24\x25\x2e\xa0\x3e\xc0\x05\x45\x13\x0a\x4a\x18" + "\xeb\xb3\x17\x99\x55\x7a\x70\x26\x9c\x1e\xa0\x6c\x9f\xce\x5d\xff" + "\xf4\xb3\x68\xe8\xf9\xab\x0a\x9e\xb6\xd2\xd9\x19\xe4\x07\xf8\xc1" + "\x1c\xe3\x73\xcc\xcf\x6f\x58\xf5\x74\x2c\x84\x83\x1a\xcc\x54\xcb" + "\xdf\x18\x40\x7d\xed\xed\xcd\x8e\xa6\x3d\x1c\x62\xcf\xc6\xa6\xcf" + "\x7b\x37\xe0\xb8\x47\x23\xf7\x4d\x7f\x72\x9a\x52\x30\x4e\x4c\x01" + "\x1e\xf3\x23\xcf\xc4\x3a\x84\xcd\xd7\x11\x1f\x7a\x25\x1d\xf6\x07" + "\x45\xc7\x15\x1d\xc0\x7b\xd4\xed\xc2\xa3\xc1\x35\x20\x9b\x93\x7a" + "\xa5\xe8\xe3\xe4\x7f\xc4\x7a\x93\x53\xe8\x07\x12\xea\x3b\x61\x53" + "\x2a\xc9\xb4\x8e\xf7\x27\x9b\x92\x94\x32\x3b\x07\xf7\x51\x6f\xda" + "\xa6\xe8\x89\xaa\x4c\x3c\xa5\x89\xf1\x73\xd1\x0c\x92\x39\x13\xb2" + "\xd7\x2b\x70\xc8\x57\x56\xcf\xfd\xc8\xa6\xbc\x50\xdf\xf0\x5b\x23" + "\xbd\x73\x17\xf4\x70\xfd\x33\xb8\x6a\xf8\xb9\x2c\x18\xe3\x21\xee" + "\x12\x79\xfd\xcb\x51\xde\xa7\x17\x21\x2e\xaf\xc0\x85\x75\x2d\x55" + "\xea\x62\x31\xae\x9a\x7a\xae\x67\x9b\x8e\x06\xe7\x24\x37\x15\xd3" + "\xd8\x9c\xf5\x66\x8f\x42\x79\x1e\xe6\xba\x85\xf7\x05\xd7\x88\x33" + "\xe2\x48\xdf\xa8\x9d\xa4\x57\x41\x9d\xda\x6c\x54\xe4\x4d\x6d\xc6" + "\x72\xcd\x66\x7e\x8e\xf0\x66\x8b\xc2\xcb\x48\x67\xd9\x70\xbb\x35" + "\x20\x2d\x7d\xc2\x76\xf9\xb8\x52\x9c\x5f\x44\xfb\x68\xa2\x90\x46" + "\xc7\x49\xd8\x72\x17\xed\x0d\x48\xf0\xd2\x38\xcd\xe5\xa0\xb3\x19" + "\xc4\x5e\xf7\xcd\xe5\x88\xbf\x38\xb8\xf7\x7d\x33\xf6\xff\x45\xc5" + "\x42\x76\x9b\xf7\xa9\x6c\xcf\x2d\xaf\x37\x18\x4d\x3c\x22\x7f\xe6" + "\x2c\x9a\xcb\xed\x55\xec\x2b\xde\x7c\x54\x29\xc7\xcf\x31\xf0\x89" + "\x3e\xf1\x0c\x6c\xa6\x79\x1e\x37\xd1\x87\xbc\xce\xa3\xfa\xa9\x7d" + "\xd4\xe7\x72\xbd\x31\xd1\xb7\x56\xb6\xc4\x69\x69\xd8\x92\xa4\xe0" + "\x12\xb8\xb7\x4c\x50\x9e\xe9\x5c\x33\x17\x14\x37\x36\x27\xa1\x4d" + "\x79\x78\x1b\x2e\x6b\xc6\x2e\xb5\xd9\xc3\xe1\x16\x29\x3c\xc4\xf4" + "\x32\x7c\xc6\xf8\xa7\xc0\x2a\xde\x39\x75\x1e\x15\xbe\xa8\xf8\x10" + "\x9d\x99\x65\x33\xd3\xb9\x87\xb3\x84\xbf\xe1\x67\xf5\xf0\xbc\xe7" + "\x64\x9b\x8d\xa1\x3d\x48\x7c\xdd\x8d\xc7\xc7\x7d\x83\x38\xdb\x01" + "\xf3\xd1\x46\xfa\xc4\xf7\x9e\x62\x64\xda\x5a\x06\xeb\x40\x9d\x68" + "\xe6\xef\x38\xb7\x34\x8a\xb3\x52\x46\x1f\xc5\xfc\x6e\x45\x7e\xdb" + "\x76\x63\x1a\xe2\xc4\x72\x86\x66\x7e\x16\x59\xb1\x5e\xa1\x57\xce" + "\x93\xb8\x3e\x70\x1e\x14\x0f\xda\x7f\xef\x58\x0e\x9b\xa2\xd4\xc3" + "\x61\x11\x8e\xe0\xe9\x9b\x9f\x98\x97\x31\x88\x47\x9c\xd1\x62\xa0" + "\x7a\x9a\x1b\x78\x9e\x35\xe8\xab\xb6\xf0\x77\x46\x7c\x5d\x1c\xb6" + "\xc3\xbd\xc5\x1a\xc3\x65\x60\x06\xfa\x0e\x89\x9e\xf0\x09\x5d\x2c" + "\xae\x55\xca\x44\xe9\x88\x8f\xc5\x07\x94\xba\x15\x1c\x44\xff\x05" + "\x7d\x9e\x68\x8b\x9e\x6c\x84\x60\x09\x2f\xd7\x09\xfe\x8d\xaf\x92" + "\xe9\x5c\x07\x79\x3b\x4b\x0c\x6a\x59\x8b\x58\xac\x24\x49\xa5\x0f" + "\x48\x4f\xc9\xa0\xfc\x5d\x50\xb2\x44\xf4\x25\x25\xa9\x2a\x1a\x53" + "\xf1\x39\x6b\x50\x0e\x15\x5c\x46\xf4\xdd\xa7\xb0\xdf\x51\xe4\xb6" + "\x82\x30\x01\xc6\xe9\x24\x79\xe0\x58\x6c\x06\x34\xa3\xdf\x23\x5b" + "\x41\x9e\x10\x8d\x9f\x90\x5e\x21\xde\xfd\x5a\xdd\x2c\x69\x54\xd1" + "\xab\x23\xbf\x8e\x69\xad\x0a\x0c\xd2\xc7\xd7\xb2\x28\xfc\xc4\xbc" + "\xee\x41\x39\x4e\xe5\xb0\x5e\x85\xce\x8b\xf4\x19\x32\xaf\x4a\xa7" + "\x88\x3a\x4a\x53\x94\x3a\xf0\x7e\x16\xda\xc0\x90\x58\x75\xe5\xa6" + "\x82\x55\xe2\xf0\x24\xea\xe4\x57\x3c\xfd\xec\xaa\x9c\x09\xe6\x15" + "\xab\xe9\x98\xa5\x0d\xb9\xab\x56\xe5\xf1\x97\x44\xda\x38\x30\x91" + "\xd7\x87\x7c\x10\xb1\xac\xed\x57\xaf\x8b\xf5\x31\x64\x17\x64\xef" + "\x6e\xb2\xf7\xa6\xe2\xaf\xf8\xd8\xc4\x59\x36\x15\x9c\x5e\x56\x46" + "\xf1\x3b\xf7\x7d\xd4\x7e\x93\x47\xf4\x03\x28\x4f\xea\x23\x91\xb6" + "\x0e\x2d\xbf\x4a\xbb\xb5\xb6\x5c\xea\x0d\xef\x27\x4a\xf7\x70\x3f" + "\x51\x2e\xf4\x82\xfc\x13\xed\x2d\x20\xbc\x7d\x76\xdb\x04\x2d\x4e" + "\xdb\xac\xa0\x8f\xb2\xa5\x2b\x3e\x4a\xf4\x13\xb6\x5c\xec\x83\xaa" + "\x44\x5d\xb6\x9c\xa0\xde\xd8\xba\x84\xde\xd8\x8a\x5c\xf0\xda\x31" + "\x65\xac\x22\xfa\x8e\xd2\x74\x8a\x1f\xc9\xa7\x63\x7e\x8d\x82\xaf" + "\x7a\x2c\xf5\x1b\xb6\xfd\x43\xe3\x07\xdb\x22\x8a\x1f\x68\xdd\x23" + "\xf1\x02\x69\x35\x08\xbb\xb1\x1d\x53\xf9\x1f\xe3\xff\x47\xdc\xdb" + "\x80\x47\x55\x5d\xfb\xc3\x7b\x26\x93\x30\x09\x93\x4c\xd0\x80\x03" + "\x46\x1d\xdb\xd8\x8e\x16\x35\x56\xbc\x97\xfa\x60\x4d\x2b\xde\x4b" + "\xef\x8b\x42\x2d\xf6\xa6\xb7\xd4\x04\x49\x6c\xd0\x00\x63\x08\x61" + "\xc0\x90\x8f\x01\xd3\x49\xcc\x57\x15\x6d\x84\x24\x84\x8a\x16\x35" + "\xd6\xf4\x96\xb6\xb1\x17\x35\x96\xa0\x51\x43\x26\x2a\x42\xb4\x41" + "\x87\x10\x62\xa0\x01\x07\x32\x64\x86\x64\xe6\xec\xff\x6f\xed\x7d" + "\x4e\x66\xc0\x84\x96\xde\xff\xfb\xbe\x79\x9e\xc9\x39\x67\x9f\x7d" + "\xf6\xc7\xda\x6b\xaf\xbd\xd6\xda\x6b\xaf\x85\xe7\xfe\x89\xc6\xfa" + "\x41\x5a\x8e\x6f\xa4\xed\xbc\x1b\x97\xaf\xca\xbf\x83\x5c\x60\x65" + "\x3b\xec\xd9\xcb\xf3\xb3\xb3\x2e\xdc\xc7\xb3\x69\xbc\x18\xed\xa1" + "\x6f\xc1\xbc\xf7\xc6\x12\x3c\x4a\xd0\x7f\x67\x96\xd6\x07\x41\xa7" + "\xc0\x3b\xaa\x34\xce\x34\xc0\x9c\xb7\x6c\x17\x76\x80\x25\x59\x1a" + "\x9e\x50\xbe\xbb\x1c\x5c\x41\x1a\xfa\x5f\x64\x57\xe5\x25\xc8\xa4" + "\x25\x2e\xed\x39\xfc\x7d\xc9\x7e\xb1\xf6\x3d\x23\x6c\x06\x01\xd3" + "\xd2\x85\x11\xfc\x16\x3d\xa7\xa8\xcf\xc2\xcf\x13\xf9\x24\x1b\x62" + "\x25\x47\x24\x7c\x4b\x30\xfe\x1b\x55\x5a\xe1\x94\x76\x37\xcf\x30" + "\xf6\x5c\x91\x37\x7a\xbb\xd8\x4f\x28\x09\x68\xf5\xe1\xfb\xde\xc8" + "\x3a\x69\xdd\xba\xb0\x3c\x0f\x2b\x11\x3e\xdc\x37\x09\x1f\x75\xa5" + "\x73\x26\x68\x6b\x6b\x64\x3e\xe4\x49\x47\x1e\x83\xd6\xe7\x1f\x39" + "\x44\x5a\xee\x45\xfa\x38\xa4\xf6\x91\xe8\xa6\xa8\x9f\xf0\x5f\x6d" + "\x43\xa7\xea\xf7\xc4\x43\x31\x12\xa9\xfd\xc2\xff\x9a\x85\xe6\x75" + "\x29\xad\x67\x73\xb4\x7e\x50\x1f\x77\x17\x79\x0d\x9a\xdf\x2b\xf9" + "\x7d\xe9\xf3\x17\xb4\xcd\x17\xf1\xcd\x60\xdb\xd7\x68\xaf\xa0\xb4" + "\x8a\x3b\x8b\x49\x8e\x21\xbf\x57\xc6\x2d\xe3\x78\xe8\xb4\x7e\x15" + "\xef\x4a\x2b\x09\xef\x22\x71\x69\xc5\xb7\x97\x03\x93\xd6\x64\xe7" + "\xdf\x2e\xb8\x7b\x30\x76\xe4\x56\x6d\x59\xfe\x8a\xd5\xab\xd6\xcc" + "\xb6\xae\xc9\x5a\xa6\x4e\xfa\xf3\xe6\xbc\x53\xc8\xee\x3e\x6d\x9e" + "\xa1\xae\xca\x30\x6d\x71\x86\xf1\x9f\x6c\xc0\x44\x6c\x66\xe7\x11" + "\x39\x9f\x9c\xbb\x23\xe6\xae\xf8\x9e\xe6\xe8\x76\xc1\xb3\x39\x23" + "\xd7\x7f\x92\x8d\x63\x4f\x31\xe7\x46\x15\xa6\x3e\x09\xe3\x4d\xd7" + "\x8b\x7e\x0a\x7f\x5f\xce\x79\xd4\x4f\xe1\x5f\x46\xf0\x67\x9b\x12" + "\xb5\xfe\x86\xe5\x86\x4d\x36\xc1\x47\xa9\xfc\xda\xc5\xe4\xf2\x30" + "\x7f\xba\xa9\x5d\xd5\xb9\xf5\x68\x32\x9e\xc6\x5f\xa3\x2d\x59\x92" + "\x57\xdd\xb4\x71\x51\x21\x1f\xcb\x70\x90\x1f\x3c\x1a\x83\x4d\x2f" + "\x6a\xbc\xa5\xb0\x0f\x2c\xf7\x34\xa1\x3d\x4d\x91\x74\x82\x47\x3d" + "\xd2\xa3\xf2\x88\x4d\x52\x76\x9d\xfa\xa7\x3e\xd4\x85\xb6\x19\x2f" + "\xd2\x36\xea\x17\xe8\xdf\x96\x9d\x54\x0e\xf1\xd7\x7c\xd8\xa2\xc6" + "\x9b\xdc\xfc\x4b\xc1\xef\xa2\x6c\x2f\xc6\xd6\xef\xdc\x0c\xfe\x6f" + "\x93\xc0\x0d\x05\x38\x4a\xb6\x41\x3e\x8d\x47\x62\x9b\xef\xa0\xb5" + "\x08\xf7\xc0\xdb\xcd\xea\x99\xc4\xcd\xb5\xde\x35\x36\x36\x3c\x6c" + "\xd1\x0f\xaf\x49\x37\x90\xbe\x80\x60\xe1\xae\x0f\x30\x89\x3f\x9b" + "\x33\x81\x77\x89\x91\xe5\xa9\x65\x11\x4c\x0d\xd4\x0e\xbe\xc6\xa2" + "\x27\xfc\x16\xf1\x09\x87\x6d\xe0\x85\x37\xdb\xf8\x1a\x9b\x7e\x12" + "\xdf\x5e\x17\xeb\xa7\x89\x62\x3c\x52\x6c\x4e\xa2\x57\x32\x7e\xc0" + "\xe3\x27\x9f\x92\xba\x01\xad\xde\xd3\x5c\xbf\x43\xac\x2b\xd5\x62" + "\x5d\xe1\x4c\xfa\x63\x7f\x5c\xf8\xca\x4f\xb0\xef\x10\x71\x55\xd5" + "\xf3\xdf\xde\x76\x7b\x50\xc4\xca\x2b\xce\x27\x3e\x2d\x48\xfb\x54" + "\xe2\x7c\xf3\xde\xfc\x20\xfb\x51\x80\x70\xf2\xf1\x34\xf2\x45\xef" + "\x13\xfc\xc2\xe3\x0b\x35\xff\xf3\x14\x37\x92\xe2\x8e\xa2\x5f\x51" + "\x34\xee\xd6\x62\x8a\x1d\x50\x46\x71\x59\x99\x94\xc7\x2d\xac\x1a" + "\x3c\xbd\x1c\x83\xc7\x9f\xa6\x38\xae\x52\x56\xe8\xc3\xb8\x44\x7d" + "\xd1\xc7\x1e\x7f\x45\xee\x55\x6b\x74\xa2\xec\x3a\xb2\x7d\xf7\xa8" + "\x65\xa0\x2e\xac\xff\x9b\xa4\x8f\x50\x5a\x3b\xfd\xda\x78\x3e\xfe" + "\xf4\x57\xf5\x1b\xe1\xf2\x3c\xec\xf1\x2d\x2a\x5f\xc0\xa4\xee\xea" + "\x2f\x28\xab\xcc\xa0\xe9\xae\xc2\xbc\x4f\x99\x45\xd3\x5d\x49\xdf" + "\xd6\x9b\x7b\xa9\xfe\xc9\x74\x44\xbc\xf8\x27\x84\xf7\x46\xe2\xe1" + "\x26\xe5\x27\xb0\xbe\x53\xdb\x35\xbe\x50\x8e\x4f\xd9\xef\x88\x3f" + "\x6c\x2f\x94\x72\xed\xb0\x8c\x31\x09\x1e\xa0\x6c\x8f\x5c\xcb\xca" + "\x9a\xb4\xb5\x0c\xdf\xee\x56\x69\x85\xba\xce\x95\x8d\xcb\xbf\x13" + "\xdb\xfd\x97\xf5\x6a\x30\xd2\x60\x2e\x61\xf4\x8b\xdb\x86\xe3\x0e" + "\xce\x0e\xc3\xf6\x17\x62\xef\x22\xe2\xfd\xca\x08\xd8\xd3\x73\xae" + "\xa4\x9b\xbf\xc0\xfa\xbf\x59\x95\xad\x64\x1a\x8f\xeb\xfb\x88\x62" + "\xc6\x4a\x18\xac\x10\xba\x19\x6f\xb1\x0d\x6d\xfb\x45\xba\x47\x77" + "\xd9\x62\x49\xcb\x7e\x81\xf5\xaf\x6c\x89\xfa\x9d\x18\xff\xc8\xf6" + "\xde\xbf\xea\x91\x55\xab\xd7\xad\x22\x85\xda\xda\x35\xd6\xe5\xab" + "\xb3\xb2\xe3\x26\xd0\x87\x58\x28\x5e\xb4\x6f\xcb\xb8\x5f\xab\x0a" + "\x3b\xd9\xe9\xcb\x98\x08\x15\x8f\x5a\xbf\x41\xf8\xf5\x8b\x8f\x49" + "\x57\x20\x62\x53\x90\x0f\x57\xa9\x37\x18\xa4\xef\x25\xac\x2b\x7e" + "\x36\xbc\x2e\x47\xe5\xb1\x2a\x66\x12\x1c\x55\x99\x83\x0f\x30\xd7" + "\x0f\xb5\x75\x88\xda\x27\x78\xf3\x31\x9b\xa0\x8b\xca\x58\x8e\x41" + "\xc0\x6b\xcc\x86\xf5\xc6\x95\xea\xd1\x4d\x9b\x2d\xfb\xe5\x9a\xa7" + "\xc1\x83\xfa\x0f\x5e\xd7\xe8\xe7\x2b\x80\xa3\x15\x76\xb5\x2c\xa2" + "\x9f\x54\xb6\x41\xb3\x13\x27\x5f\xa5\x6d\x05\xe4\xa7\xb8\xfc\x0e" + "\xa5\x9c\xe8\x8d\xab\x44\xa3\x4b\xb4\x16\x29\x28\xe7\xd5\x11\x6f" + "\x34\xe6\xcd\xf7\xf0\xed\x8c\x3e\x56\xde\x29\xe3\x19\xb8\x9a\xcf" + "\x8f\x67\x50\xee\xc2\xaf\x53\xfd\x0d\x45\xdc\x5f\xec\xa7\x7d\xd3" + "\x1a\x91\x66\xbc\x20\xcf\x90\xdf\x59\x9e\x34\xce\xaf\x48\x7f\xa9" + "\xaa\x7f\x65\x8a\xcd\x51\xfe\x43\xf2\x49\x1a\xc6\x0d\xd7\x5a\x95" + "\x07\x19\x24\xd8\xd1\x7a\x8b\x3c\xc2\x96\x1b\x30\xf9\x88\x74\xb4" + "\xd4\x27\xee\x5f\x01\x9c\x28\xcf\x0d\xe3\x81\x84\x11\xd2\x4a\xc2" + "\x7c\x4a\xf9\x12\xfa\x26\x12\x0e\xa8\xe3\x7b\x52\x36\x2d\xdf\xa5" + "\xad\xd9\xe4\x8f\x55\xc6\xb7\x28\x4f\xda\x5d\x34\x08\x99\xbf\xbc" + "\x3d\xa2\x8c\x24\x55\x17\x61\xe0\xfa\x5f\x38\xb6\x0b\x99\xad\xbc" + "\x3f\xac\x13\x28\x4f\x22\xba\x2b\xca\x88\xeb\xf3\xb8\x7d\x22\x2e" + "\xb3\x4e\x8b\xbd\xee\x77\x56\x24\x6a\x3c\x8a\x56\x56\xbb\xd4\x39" + "\x09\x1f\x9a\x98\x83\xb5\xc8\x33\x67\x5c\x1f\x8b\xb4\x71\x19\xd0" + "\x81\x79\x2c\x78\xef\x8a\x25\x61\x59\xef\x17\xc2\xc7\xae\x90\x03" + "\x65\x39\x90\xb3\x2a\x16\x5c\x28\xb7\x81\x7f\xb0\xae\x58\xb5\x02" + "\xec\xc3\xcf\xed\xab\xef\x80\xe8\xf0\x73\xfb\x8a\x3b\xc8\xa4\xec" + "\x9e\xf9\x3f\x10\x57\x4c\x8e\x3b\x26\xd0\x1f\x8f\xc7\x5e\x26\x9d" + "\x11\xe4\x5c\xd2\x9d\xfa\x65\xec\xd5\x29\xea\xd5\xa8\x5e\x63\xb0" + "\xee\x75\x00\xef\xcf\x52\x6c\x1d\x0f\x7b\xc2\xa8\xc6\xbb\xd5\xd6" + "\x6c\xd0\xf2\x8a\x93\xda\x3e\x99\xb0\xb1\x27\x3f\x89\x14\x5b\x79" + "\xd3\x23\x47\xfc\xce\x27\xc6\xf5\x1f\x52\xbf\x28\xf7\xbd\x90\x9e" + "\xa6\xa5\x6b\xfa\x58\xa4\x2d\xd1\x74\xaf\x32\xef\x13\x59\xe1\x6f" + "\xcf\xd3\x6d\x27\x69\xfb\x6b\xc8\xe3\xd2\x60\xa6\x95\x53\x6c\xe5" + "\xa7\x54\x3e\x29\x4a\xf0\xd5\xce\x8a\x42\xe1\x9b\x94\x78\x71\xa1" + "\x67\x7e\x62\x8f\x56\x0f\xc9\x08\xd4\x6e\x75\xef\x46\xcc\x7b\xf2" + "\x41\x2a\x7d\x98\x3e\x31\x3e\xfe\xe7\xef\x71\x4c\xbc\xbf\x31\x56" + "\xc0\xdb\x83\x23\xbc\xb5\xfa\x53\xcc\xd9\x87\x18\x0b\x16\xf0\x96" + "\xb1\x11\xbe\x9b\x60\x5d\xfd\x20\x63\x55\x9f\x31\x16\x8a\xfa\xe9" + "\xf1\x51\xc0\xfd\xde\xb3\xca\x29\x8a\xaf\xb7\x1d\xf9\xee\xf5\x7d" + "\xc9\x1b\xf1\xcd\xbd\x76\x7e\xaa\x11\xf9\xee\x39\x79\x8a\x37\x20" + "\xef\x3d\x39\xe8\x77\x01\x0f\x86\xa2\x1e\x39\x6e\xfd\x31\xd1\xa1" + "\x4a\x87\xb7\xfc\x70\x32\x77\xea\x6b\xf8\xa6\x6f\xdd\xe0\x77\x56" + "\x6e\x1e\x8f\xe9\x85\x72\x09\x46\x8b\x1c\x74\xff\xc8\x71\xf4\xe9" + "\x78\x06\xd6\x50\x8c\xc1\x71\xe4\x83\xfc\xbf\x46\xf4\xc3\x1b\x75" + "\xc3\x65\xf8\xd9\x26\xa2\xfb\x68\x6b\x7b\xa8\x80\xb7\xd6\x3c\x80" + "\xf6\x9f\x40\xfb\x47\x78\x0b\xfa\xb0\xbb\x7a\x80\x31\x6a\x7f\x88" + "\xca\x0c\xb1\xa8\x8c\xf5\xba\x69\xdb\xf1\x3e\xc3\x91\xc8\xb6\x23" + "\xef\x03\x3e\x36\xad\x11\x79\x1e\x78\x74\x1a\x13\xed\x1f\x42\xbb" + "\x63\x0f\x27\x87\x50\x37\xb5\xdf\xef\xac\x9a\xad\xb5\x53\xab\x9f" + "\xda\xab\xe1\x60\x06\xe9\xbb\xe2\x0e\xe6\x52\xbb\xa5\x0e\xbf\x2a" + "\xdb\xbb\x26\x87\x79\xa3\xbe\x75\x83\x87\x55\x95\xd0\x1c\xa2\xfe" + "\x78\x81\x53\xea\xb9\xb7\xe3\x1a\x0c\xa4\x3c\x59\x55\xa9\xf5\x2f" + "\xb2\x5f\x8b\x57\xe7\x09\x3d\xea\xb2\xe5\xf9\x2b\x0a\x96\x41\x3a" + "\x8b\x63\x76\x4a\x12\xf2\x5b\x76\x96\x75\xf5\x2a\xeb\x43\xcb\x56" + "\xe4\xae\x2e\xc8\xce\x9b\x2d\x44\xee\x35\xd9\xab\xb2\x48\xbd\x9a" + "\xb7\x2c\xcf\x1e\x77\x01\xcf\xed\x3a\x9c\x4c\xf6\x88\x44\xcb\x06" + "\x58\x6d\x95\xaa\x5b\x0c\x70\x67\x9a\x90\xdd\xe4\x3c\xa8\xfe\x9e" + "\x75\x43\x1a\xbd\x2f\x95\x6b\x4d\x6d\x25\xaf\x38\xb8\x92\x73\x11" + "\x13\x5a\x77\x8a\xd5\xae\x17\xfd\x1c\x5e\xa0\x95\x23\x6c\xf4\x05" + "\xcf\x4a\xe9\x63\x0b\x58\xd8\xa6\xbc\xb6\x8a\xeb\xd1\x47\xc0\x40" + "\xe5\x5b\xb5\xb3\x7d\xef\xf4\xb1\xda\x6c\xf4\x9b\xf6\x0e\x24\x5f" + "\x28\xce\x20\xd5\xde\x0f\xbe\xb7\x9b\x3b\x63\x4c\x04\x97\x6a\x29" + "\x57\xea\xcd\x3a\x8a\x13\xdb\x47\xe7\x21\x53\x69\x8f\x70\xbb\x53" + "\x49\x0d\xdb\xf4\x54\xd5\x11\x8f\x2b\x74\xed\x62\x5e\x54\x1f\xd0" + "\xf0\x5d\x4f\x67\x4c\x36\xcd\xba\x5d\xd2\xea\x6a\xb1\xff\x8f\x71" + "\xbb\x5d\xb6\x5f\xc4\xa7\xc6\xfa\x54\x73\x1a\xfd\x5b\xc5\x8b\x17" + "\xa8\x7e\xe5\x6b\x4e\x2b\x09\x56\x7b\x68\x8d\x45\x8d\xe9\x7e\xb0" + "\x4c\xa9\x38\x58\x10\xc2\xba\xae\x80\x57\xe5\xd5\xd6\xe1\x50\xc5" + "\x41\xbb\xb2\xce\xa6\x27\xfa\x5e\xec\x00\xfc\x56\xe7\xc4\xf1\x2f" + "\x73\xa6\x86\xd6\xd9\xc8\x0e\xd3\xc1\x39\xbe\x8d\x3b\xe8\x12\xb1" + "\x79\x2b\x0e\x6e\x50\x9f\x2b\xe8\x59\x01\xaf\x86\xb4\x5a\x3c\x3f" + "\xa9\xf0\x88\xfc\xe7\xe7\xdd\x42\xcf\x66\x9d\xb0\x21\xa4\x18\xd3" + "\xf3\xa8\xef\x5a\x9f\x85\x8c\x40\x7a\x8a\xf1\xbe\xd5\x0c\x69\xe9" + "\xc4\xbb\x4a\x3e\x92\x2d\x07\x8c\x99\xa4\x69\xe3\xf9\xf6\x69\x30" + "\x10\xb0\xad\x38\x88\x35\xa9\xb6\x52\xc4\xa9\xdf\x74\xe5\x0d\x5c" + "\x5f\xf5\x32\xad\x1d\x8b\x42\x62\x2f\x8b\xc9\xbd\x8f\xda\x14\x0d" + "\x9e\x64\x2b\x4f\xeb\x07\xc6\xcd\x96\xe1\x65\x71\x72\xfe\xd6\xce" + "\x8f\x90\x51\x86\xb8\xc0\xf7\x9a\x5e\x51\xaf\xde\xb8\x49\x3e\x57" + "\x6f\x91\xeb\x5d\xad\x5d\xcb\x8b\x34\x87\xe4\x49\xab\xe7\x93\xec" + "\x46\x7b\x5b\x74\xdf\x38\xc9\x39\xce\xa2\x7a\xce\x89\x16\x12\x6d" + "\xb6\xce\x62\xac\xcb\x47\x7c\x7b\x6d\xe7\xde\x7a\x1f\x13\xe3\x17" + "\x77\x70\xe5\x30\xcf\x61\xe0\x57\x26\xe4\x53\xe9\x9b\x01\xf6\x4b" + "\xa3\xe0\xc1\x81\xcf\x0a\xf0\x19\xdf\xac\x22\x7c\x2d\x3a\x4b\xed" + "\xf8\xe5\x82\xf6\xc2\x41\xf2\x33\x0f\x3c\xfc\xe5\x02\x82\x0d\xad" + "\x0d\xd5\x4e\x71\x86\x4f\xd0\xe0\xb6\x82\x39\x54\xc6\x6d\x09\x01" + "\x66\xe8\x02\x05\x05\xbc\x03\xf6\x22\x36\xed\x04\xf2\x1b\xf2\x99" + "\x91\xe4\xa3\x7f\x74\x1f\x19\xf5\x6d\x96\x30\xf9\xe5\x66\x8d\x07" + "\xc2\x7d\xed\xf9\x67\x55\x7f\xe9\xb8\x70\x2f\xed\xc1\xd5\xab\xf3" + "\x33\xf2\xb2\xe9\x62\xbb\x6e\xed\xf5\x17\xae\x89\x26\x19\xd7\xe7" + "\x97\xbb\x68\xfc\x68\x9d\x90\x67\x3e\x7e\x39\x18\x21\xd7\x92\x6e" + "\xed\x4e\x5a\xdf\x68\x4f\xdc\xef\x7c\xd2\xf0\x56\xe1\x46\x81\x27" + "\x47\x8c\x4c\x7f\x61\x7d\x0f\x2d\xcb\x5f\x96\x7b\xbb\xdc\xbe\xfd" + "\x6a\x3d\x4f\x5a\xce\xaf\xe7\xc9\xc5\xe3\xf5\x48\x19\xc4\x27\xe6" + "\x60\x95\xd5\xc3\xe3\x63\x4b\x24\x9d\x7b\x32\x5f\xb3\xc9\x9a\xd8" + "\x37\xc6\xc1\xfe\x50\x45\x7f\x2a\x8d\x57\xf1\x46\xa6\xff\xfd\x86" + "\x1e\x3d\xf1\x5f\x45\xb8\x27\x9b\x15\xa1\xe7\x53\x63\xee\xbd\x71" + "\xa6\x07\x74\xf6\xc9\x0e\x5e\x7e\xb0\x1f\x78\x35\xa9\x9d\x49\xe4" + "\xb9\x62\xb9\x47\xf9\xa4\x67\xb2\xbc\xdc\xe5\xe9\x91\x73\xe5\xa9" + "\xdb\xc4\x5e\xd9\x2c\xf6\x8b\x3e\xf6\xd4\x2d\x06\x0b\xe4\xb8\x59" + "\xec\x37\xb8\x17\xf2\x02\xbd\x3b\x6f\xac\xaf\x1a\x6a\x32\x00\x3b" + "\x81\xa5\x3a\x2e\xff\xc0\x84\xc9\xbf\x28\xfc\xf4\x5c\x27\xac\xf3" + "\xa3\x00\xe1\x29\x31\x06\x66\x4e\x30\x19\xaf\xb9\x3a\xd9\x72\xe7" + "\x77\xe7\xcd\x2d\x2e\x2a\x74\x70\x25\x18\x30\xf3\x88\xf8\x90\x95" + "\xb1\xb6\xfb\xaf\x2f\x91\x6b\x45\x55\xec\x84\x6b\x5d\x95\x93\xdb" + "\x89\xb7\x06\xbd\x5a\x5c\xbc\x96\xe9\x5f\x1d\xf5\xe8\x89\x97\xa3" + "\xf5\xc7\x1d\x3c\x0c\x99\xe0\xa9\xb7\xde\x44\x1a\xfa\xef\xe0\x95" + "\xd6\xc5\xf2\xec\xc5\x16\x9d\x52\x6d\x5d\x1c\x2e\xdf\xc0\xa8\x7c" + "\xc8\x0b\xfa\x9d\x45\x83\x7a\xb7\xe1\xbb\xcc\x6d\xf5\xb1\x37\x71" + "\x3f\x21\x2c\x51\x27\xe9\xa6\xa8\x0c\xd0\x61\x57\xf1\x39\xd0\x67" + "\x87\xd0\x13\xeb\x4f\xb1\x2d\xdf\x69\x99\xe4\x3b\xb1\xd7\x13\xd7" + "\xdb\xe5\x77\x6e\xc1\xf8\xff\xc7\x6c\x95\x1f\x02\xbf\xb6\x65\xb3" + "\x46\x13\xf0\x7e\xbf\xd4\x57\x6f\xa9\xd3\xf2\x4c\x2c\x4f\x92\x8d" + "\x27\x6f\xa3\x71\xe5\x23\x83\x83\xe4\x63\x6e\x12\x9d\xc0\x7c\xac" + "\xcf\xd1\x34\x8f\xe3\x4b\x13\x63\x12\x4a\x53\x57\x76\x62\xd6\xc5" + "\x0f\x4d\x67\x09\xbe\x9f\x51\x9b\x59\xfd\x33\xc2\xce\x78\x90\xf6" + "\xa9\xcc\xba\xd4\x15\xe6\xd2\xd4\x65\x21\xe7\xbc\x5b\x69\x9d\x34" + "\x3b\x7e\xa0\x33\x07\xbf\xa7\x0b\x3a\xe7\xdc\xba\x5d\xc6\x64\xf1" + "\xd5\xce\xe0\x3d\xf8\xa6\x17\xdf\x78\xf0\xeb\xc7\x77\x9d\x03\xec" + "\xe9\x9f\xe0\xda\x61\xd6\xf1\xed\x66\x8c\xe4\xcd\x25\x22\x46\x25" + "\xd1\xe8\x4e\x1e\x07\x1e\x73\x4c\xe8\x02\xa2\xc3\xba\x80\xa7\x0b" + "\x31\x6e\x31\x0b\x1f\xe7\x6f\xa2\xac\x8e\xd0\x88\xd2\xd1\x78\x8a" + "\x31\x55\xe7\x7d\x00\x73\xf4\xc0\xec\x2d\xcc\xa2\xda\x8a\xea\x3b" + "\x83\x1d\x44\x8b\xe9\x6c\x75\x3b\xea\xdc\x83\x5f\xab\x75\x15\x8b" + "\x3a\xc5\x9e\xde\x4f\xfc\x47\x98\x87\xfd\xd5\xdd\xaa\x3c\xd2\x76" + "\x13\xbe\xdf\xb8\x92\x70\x62\x50\x1f\x44\xf9\xe0\xf9\x3b\xdc\x39" + "\x1d\xc2\x16\x86\x6c\xb1\x29\x0f\xea\xb0\xb9\x03\x1d\x4c\xe1\x16" + "\x3d\x9e\x5b\xc9\xb6\x90\x23\x6f\x97\xa3\x87\x75\xd9\x03\xa0\xb1" + "\x9d\xe0\x81\x6d\x29\x68\x8f\x28\x0f\xef\x0f\xbc\x8a\xf1\xb5\x82" + "\xdf\x43\x79\xdd\x64\x5b\x43\x67\x94\xf9\x1a\xdb\x37\xf0\x7d\x3b" + "\x64\x68\x3d\x95\x7f\x8a\x3d\xf3\x31\x1f\xb6\xd9\x6e\x1e\x92\x31" + "\x1b\xfb\xd8\x33\xcd\x68\x67\x4c\x44\x3b\x6f\x43\xfb\x0d\xa0\xab" + "\x6d\x28\x73\x0f\x2f\x40\x9d\xfd\xa8\x13\xf2\x08\xf0\x37\x05\xf2" + "\xae\x81\xda\xdc\x45\xed\x75\x84\xc8\xfe\xd5\x50\x73\x86\x19\x30" + "\x17\xda\xb6\xe3\x8a\xfe\xef\x06\x4f\x96\xec\x77\x3e\xd3\xa6\x9d" + "\x73\x27\x5e\x02\xcf\xdd\x1a\x2e\x55\x21\x0f\xda\xd8\x8a\x76\xed" + "\x89\x1f\x62\x24\xe3\x44\x03\x4f\xa3\x51\xef\x14\x8c\x55\x2b\x60" + "\xf7\x3b\xc0\x7a\x0f\xf5\x49\x19\x51\x06\x15\x94\x57\x33\x82\x36" + "\xad\xb1\x18\x4c\xfd\x14\xd3\xda\xcf\x01\xef\x03\x8b\x1c\x7e\x4e" + "\x76\xb2\xe8\x33\xc1\xbb\x0a\x7d\x35\x78\xd8\xaf\x72\x49\xde\x18" + "\x60\xcf\xe4\xcb\x98\x93\xcf\x38\xd4\x3d\xad\x03\x52\xcf\xf4\xf4" + "\x7e\x82\x3d\xf5\xcb\x54\x9a\x58\xe6\x1e\xf4\x32\x53\xff\x74\xac" + "\x6f\x4f\x7b\xeb\x15\xe2\x51\x7e\x35\xae\xff\x9f\x64\x8e\x05\xdc" + "\xa0\x2f\xca\x08\x17\xb1\x6f\xa5\xbd\xcb\xaf\x9a\x33\x1c\x51\x69" + "\xe0\x33\xf5\x68\x27\x9d\xd5\x98\x81\x75\xfa\x4e\xb2\x67\x42\xfb" + "\x20\x77\xfc\xaa\xf3\x62\xb1\x5e\x01\x1f\x0b\xf2\x78\xd1\x76\x11" + "\xd3\x8f\x62\x61\x4a\x5d\x4f\x9d\x41\xf3\x37\xc0\x47\x78\x61\x4d" + "\x91\xa8\xb7\x64\x73\x81\xa8\x83\xe2\x7f\x0e\xe6\x5b\xf9\x91\x76" + "\xab\x77\xd2\x33\xdd\x11\x76\x3c\x5e\x35\xa6\x98\xd8\xd3\x3c\xdf" + "\x8e\xa7\x2e\x37\x42\x6e\xa4\x7d\xcd\x12\xda\xbb\x95\x7e\x61\xea" + "\x84\x2d\xe6\x22\x87\xf4\x7f\xe1\x0e\x0c\xa9\xbc\x65\xdd\x6b\x22" + "\xce\x10\xf1\x35\xc2\xf6\xe7\x84\x6a\xaf\x53\xf7\x43\xaa\xa3\xfd" + "\x82\x58\xc6\xd9\xab\x96\x3d\x98\x9b\x2d\x55\x29\x37\x3e\x9c\xbf" + "\xec\xe7\xe7\xf3\xbf\x06\x21\x17\x3b\xeb\xda\xa5\x6e\xb2\x2e\x18" + "\xc1\x27\x1a\xc6\x75\x4b\x7a\xb6\x5b\xea\x97\x9e\x4d\x9e\x48\xbf" + "\xf4\x83\x9f\xaf\x5a\x9d\x27\xea\x10\xa6\x4d\xd9\xf2\xf4\x53\x1c" + "\xbb\x7f\xfe\x0f\xe6\xdf\xb8\x26\x3b\x5f\x04\x0f\x91\xca\x9c\x65" + "\x59\x59\x79\xaa\xe1\xd3\x0a\xfa\x8a\xde\x3c\xb4\x4e\x7c\x6a\x7f" + "\x24\x5f\x9a\x4c\xad\xc9\x5d\x56\x90\xad\x16\x11\xd9\xd6\x64\xa2" + "\x97\xed\xf5\x42\x66\x8e\x93\xfb\xb4\xcf\x36\x47\xec\xeb\x44\xca" + "\x91\x33\xf1\xae\x43\x7b\x67\xff\x1a\xe1\xca\xd6\x1b\xbb\x9a\x84" + "\xcf\x06\xc3\xde\x5f\x13\x7c\xb7\xd2\x3e\x71\x34\xad\xd9\x8a\xfe" + "\x59\x5b\xa3\x7a\x96\xc9\xef\xdc\xca\xc2\xba\x81\x86\x3d\xaa\xed" + "\x43\x3f\xd5\x47\x75\xe3\xbd\x35\xc2\x1e\x00\x6b\xec\xb3\x83\x54" + "\x06\xed\x5b\x8b\xf8\x12\xe0\x89\xd4\xb3\xec\xfa\xae\x5f\xd3\xda" + "\x52\x3f\x9b\xe8\xa8\xe2\xf2\x78\xe5\x3c\xd8\xb6\x8c\x57\xf4\xba" + "\x6f\xf6\xb1\x24\x49\x07\xb6\xbe\x82\xf4\xcb\x4f\xb1\xad\x2e\xa4" + "\x77\x83\x96\x44\x13\x3f\x22\xf5\xdf\x5b\x5f\x51\x75\x05\xd4\xe7" + "\xe8\x88\x36\xec\x0c\xeb\x13\x1a\xf6\x78\x63\x3d\xde\xcd\x72\xbf" + "\x5f\xec\x6d\xca\xfd\xe5\xad\xe3\xfd\xc7\xfa\xad\xed\xe7\x25\x0d" + "\x20\x3f\xe4\x09\xaf\xba\xc7\x46\x7d\x4f\xa3\x7e\x4b\x3b\xad\xad" + "\xc1\x48\xbe\x56\xfa\xf3\xef\x75\x13\x2f\x2c\xe5\x80\x6d\xd7\x0b" + "\xde\x85\x74\x17\xa3\x04\xc3\x6d\x77\xe0\x3d\xd6\xaf\x6d\x73\x3c" + "\xac\xae\x27\x12\x66\xf9\xe0\xe0\x39\xbe\xa3\xf5\x0c\x6d\x9a\x82" + "\x3c\xe9\xe1\x36\x6f\x13\x7e\x22\x48\x56\x90\x7c\xc5\xb6\x93\x22" + "\xfe\x98\x0f\xfd\x53\x6d\x06\x08\xe6\x32\x1e\xc1\xb6\x5a\xed\x3b" + "\x25\xce\xe3\x21\x19\xa5\x5a\xee\x7f\x01\x76\xdb\x3e\x88\xd2\x1d" + "\x11\x7b\xa0\x37\x07\x58\x13\xd2\x62\x90\xb6\x8f\xf2\x51\x3b\x84" + "\xae\x02\xed\xa7\xfa\x14\xf0\xc1\x51\x96\x98\x3b\x50\x1e\xde\x3d" + "\x99\x12\x1e\xbf\x6d\xbb\xc2\xfa\xa1\x67\x1f\x90\xfa\xa1\x7a\x83" + "\x06\x07\x8a\x23\xa4\xce\x85\x68\x6d\xbf\x1c\xef\x53\x22\xe1\x2f" + "\xe8\x9c\x0a\x4f\xee\x7c\x76\x4d\x58\xee\xaa\x5f\x38\xbe\x57\x84" + "\x76\x84\x69\x7d\xfd\xa3\x04\x47\x6a\xb7\x7d\x03\xe9\x92\x1b\x76" + "\x8a\x7e\xc8\xfd\x98\xbf\x60\x8c\x9e\xe6\xe0\x0b\x68\x8d\x24\x19" + "\x80\xc6\x97\xf2\xca\x18\x43\x0d\xf7\x34\x4a\x9d\xe7\x33\xb8\xff" + "\xa1\xa2\x9f\x08\x3f\xea\xdb\x23\xed\x03\x25\x8c\x1b\x4c\x0a\x95" + "\x09\xf8\x51\x59\x58\x37\xc6\xed\x9e\x65\xb9\xf5\x21\x94\xf9\xab" + "\x81\x70\x7f\x20\xe7\xa9\x70\xa4\x71\x14\x70\x69\xc0\xfc\xaf\x13" + "\x7a\x9b\xe2\x26\x7e\x72\x35\xca\x90\xb1\x3f\x1b\xe6\x71\x1a\x1b" + "\x35\xbf\x97\x64\x27\xb4\x5d\x9e\xdd\x02\xbe\x41\xfe\xa0\x76\x2a" + "\x15\x9e\x41\x6a\x3b\xed\x03\x84\xe5\xe1\x06\xb2\xdd\xf0\x78\x1f" + "\x93\xdf\xd4\xc8\x7d\x0a\x8c\x6d\xfd\x8b\x7c\x5d\x0e\x53\xf5\xe3" + "\xa0\xc7\xf5\x49\x84\xdb\x54\x8e\x4f\xc8\x45\x0d\x2e\x05\x70\xc1" + "\x98\x52\xbb\x76\x6b\x63\x8a\x7c\xf6\x8b\xd8\x56\x63\x4c\x1a\x3c" + "\x9a\xef\x17\x5a\x53\x30\x4f\x4b\x24\x0f\xd8\xb8\xc3\x5c\x7a\x27" + "\x37\x07\x6f\xbd\x95\x78\x9a\xed\x7a\x21\xab\x68\xf6\x6f\xd7\x00" + "\x4e\x5f\x6a\xb6\xc0\xca\xa6\x9f\xf6\x90\xed\xa0\x3b\x20\x6d\x07" + "\x29\xfd\x5e\x1f\x57\xba\x7c\x21\xb2\xcf\xef\xf1\x3b\x1b\xe7\x6b" + "\xf2\x0b\xd1\xa5\xa8\x52\x1d\xda\xd8\x08\xfc\x7f\xaa\x59\xa5\x47" + "\x53\x4e\xb0\xc6\x52\xb5\xfc\x88\x36\x34\x04\xa5\xfc\xd7\xd8\x24" + "\xe5\xa0\xc6\x4a\xd0\x97\xcd\x52\x0e\x6a\xac\xd3\xda\x8d\xf7\x59" + "\x17\xf6\x71\xf1\x5d\x3f\xc8\xb6\xe6\x12\x69\x4d\xfd\xb6\xc3\x6a" + "\xbb\x2e\xeb\x66\x61\x6c\x6a\xfd\xb7\xbb\x6e\xb7\x2e\xbe\xe3\x3a" + "\x47\xce\xec\x7b\xe5\xe5\xae\xc5\x0b\xe9\x7a\xc1\xde\xa3\x15\xe5" + "\x07\xce\x97\xb3\x76\xaa\x6d\xd8\x9e\xe8\xd1\xd9\xe4\x1e\xad\xf1" + "\x90\x95\xe2\xab\x63\x2d\x1c\x22\xfe\x76\x51\xe8\x73\xce\xcb\xf7" + "\xe5\xf0\xd8\x43\x56\x6f\x7c\xac\xcd\x1b\x6f\xf4\x7a\x63\x7b\x7d" + "\x14\x7f\xdd\x5c\xca\x03\xe6\xe0\x14\x49\x0f\xf1\x0c\x5e\x62\x10" + "\xfc\x0a\x8d\x25\xbb\xfb\xfa\x62\xbe\x28\xc4\xdd\xe0\x5b\x00\x97" + "\xed\x76\x6d\xfd\x15\xba\x23\xd7\x21\xeb\x22\x07\x1f\x23\xdc\xc1" + "\xba\x6e\xe4\xe5\xa8\x33\x8a\x74\x5d\xdb\xd1\xff\x2d\x56\x09\x8b" + "\xed\xa0\x7f\x0d\x1d\x2a\x7c\x17\xe3\x99\xe2\xdf\xc8\xbd\x3c\xa7" + "\x45\xd0\x78\x65\xd3\x0d\xf7\xf1\x2a\xa3\x57\x2b\x13\x65\x99\xd4" + "\xb3\x30\xa2\x3c\x76\x91\xb3\xd4\x91\x3f\xa5\xa2\x27\x99\x74\x0e" + "\x74\x7e\xd1\xec\xd0\x51\x7c\xa0\xf4\x71\x3d\x0b\xde\x25\x94\x26" + "\x92\xee\x25\x3d\xc1\xa7\x2b\xa1\x3c\x61\x7d\x84\xe2\xa9\xd1\x2b" + "\x01\xf0\x01\x89\x32\x16\xfa\x90\xba\x1f\xdb\x94\x39\xae\xdf\x3f" + "\x6f\xec\x9b\x04\x3e\x9c\x71\x1a\x80\xdb\x8d\x83\x5f\x4b\x92\x3c" + "\x8f\xe2\xd4\x31\x79\x96\xbd\xe9\x7e\x31\x2f\x55\x7c\x04\x7c\xbd" + "\xb4\xf7\x66\x0e\x72\x2f\xd9\xa9\x2b\x51\xc0\x49\x76\x82\xb9\x0b" + "\xfd\x25\x14\x83\x7c\x1c\x2f\xed\xc0\x4b\x3b\xf0\x92\xf6\x49\x51" + "\xbf\x37\xea\x86\x4c\xcc\x59\xdd\x09\xd6\x94\x42\xed\x27\xd8\x80" + "\xef\x36\x29\x80\x95\xb0\x87\x23\xf8\xc4\x7d\x52\x4f\xe7\xa2\xa8" + "\xaf\xe6\x20\xfa\x1c\xd9\x2f\xbd\xe2\xa9\x76\xa2\x5f\x7a\xf4\xcb" + "\x71\x52\xc8\xfb\x74\x5e\x0d\xb4\x64\x46\x38\xc6\xc4\x8e\xf9\x91" + "\x7d\x54\x28\x2e\x8d\xe8\xc3\x8e\xec\x89\xfa\xc8\xf5\xd4\x47\x82" + "\xc1\x8e\xef\xa8\xfb\x24\xa2\x9d\x44\xb7\x86\x58\x53\x20\xa1\x94" + "\xce\x89\x1d\xb2\x82\x5f\xbd\x8b\xc6\xb0\xd1\xc9\x6b\xa9\x9d\x13" + "\x8d\x17\x95\x27\xcb\xfa\xb5\xc1\x5c\x5a\x92\x89\xb6\x74\x4f\x0c" + "\xef\x1d\xa7\x2f\x0e\xef\x1d\xfb\xe8\x7b\x6a\x07\x9d\x9b\x33\x93" + "\x03\x24\xe0\x37\x64\x2c\xd7\x44\xf5\x26\x94\x36\x51\xbb\x26\x7c" + "\x07\xdc\x1f\xaa\xc9\x3b\x7f\x4e\x28\x8d\x01\x46\xf0\xdb\x8e\x74" + "\xa9\x4b\xfd\xb5\x63\x5c\xe7\xeb\x3a\xb4\xc0\xac\xb3\x46\xd1\x1c" + "\x13\xbc\x2c\xfa\x3b\x51\xb9\x66\x5d\x2d\xf9\x50\xbb\x0b\xb4\x6a" + "\xc2\xf7\x98\x07\x56\xbe\xe9\x5b\x5f\x43\x79\xa6\x84\x52\x1d\xf7" + "\x46\x7d\x2b\x2e\xc1\x17\x4c\x21\xb8\xa2\xad\x0e\xcc\xf1\x2a\xb1" + "\x3e\x0b\x1d\xc4\xaf\x31\xff\x5f\xcd\x14\xba\xdc\xd8\x43\x26\x69" + "\x57\xf0\x9c\xc9\xc3\xfe\xe8\x09\xdb\x08\x3d\x97\xec\xd1\xc5\xb6" + "\xcb\xb9\x7a\xe5\x56\xac\x69\xcd\x8a\xd3\xcc\xad\x1b\xcc\x7c\x80" + "\x3d\xf7\x07\x85\xdb\xf4\x58\xb7\x9a\xc3\xb8\x23\xcf\xd5\x69\xb8" + "\x83\xef\x97\x4e\x8c\x17\xcf\x6d\xbc\x38\x5e\x3c\xf7\x43\x55\x47" + "\x97\x29\x6d\xf7\x9e\xdb\xa9\xc9\x0a\x7c\xd3\x95\x5b\xad\x45\xa2" + "\xfe\xb9\xb2\x6e\xc0\x24\x98\x46\x74\x66\x21\xe0\x56\x82\xbc\xdd" + "\x1a\x6d\x20\x1c\x32\x87\x48\x8e\x61\x02\xcf\xf1\x6e\x08\xb4\x47" + "\xc6\xc8\xae\x38\x5c\x4f\x3c\xa6\xe2\x6c\x6c\xc6\xfa\xb5\x8d\x6c" + "\xd7\x7d\xb1\x87\x2a\xfd\xce\x9d\x89\x1e\x36\xb0\x59\xa5\x7f\x9b" + "\x51\x86\x4b\xd8\x82\xc8\xf3\xa0\x26\x9a\xe7\x14\xc7\x8c\xe6\x3a" + "\xd2\x92\xd0\x6e\x8a\x69\x06\xde\x7e\xe7\x02\x6d\xed\x57\x9c\x69" + "\x04\x6f\xc1\x67\xe8\x89\x8f\x05\xec\x9e\xd6\x2b\xbb\x46\x6e\xb6" + "\x30\xea\xf3\xc8\xa6\x59\xbb\x7e\x71\x13\x33\xbc\x6d\x79\x90\xd9" + "\xbf\xcd\x92\x4a\xff\xc5\xc0\xfe\x36\x97\xe9\x09\x0e\x1e\xb6\x33" + "\x5d\xc2\x6e\x67\x9d\x36\x3e\x1e\xf6\x9c\xa0\xa3\xa4\x3b\x5f\x14" + "\xe4\xc3\x72\x2f\x60\x67\xab\x87\xfd\x52\xdd\xf3\xda\x6e\x98\x60" + "\x7d\xb8\xdb\xba\x62\x8d\x35\x6b\xf5\xba\x55\xd7\x5e\x1b\x37\x81" + "\x0c\xb0\xb3\x53\xca\x00\xcf\xb3\x48\x19\x00\xcf\xe8\x7f\xa3\xe7" + "\x42\x9e\x7f\x61\x86\xea\xfe\x20\x23\x95\x85\xef\x6f\x61\x0b\x6f" + "\x89\x78\xbc\x95\x2d\xfc\xf6\xad\x19\xf7\x65\x2f\xcb\x5a\x1f\x91" + "\x7a\x5b\xa4\x7e\xae\x66\x2b\xea\x8e\x9a\xf5\x7d\xd0\x0f\xdd\xbd" + "\x8f\xd1\xba\xf3\xfc\xd9\xa2\x20\xff\x02\xb8\x3b\x97\x7c\x0e\xed" + "\xcf\x0f\xb2\xfd\xa0\x6f\xfc\x4a\xa2\xeb\x53\xa4\xdf\x4d\xc8\xff" + "\xc0\x2d\x33\xfa\xee\x85\x2c\x76\x56\xda\x6e\xbf\x30\xb3\xab\x2e" + "\x00\x3a\xd1\x1b\x94\xfc\xce\xf3\x07\x90\x3e\x0d\xd7\x90\xb4\x3f" + "\x79\x41\x07\x39\x37\x4d\xf8\x58\x28\x20\x1f\x0b\xcf\x8b\x35\xe0" + "\x26\x5f\x09\x93\xbe\xbe\x9e\xaf\x24\x1f\xdc\x1e\xf6\xc2\x3c\xe2" + "\x2f\x28\x2f\xd2\x3e\xb6\x3e\xcc\x52\xe9\x4a\x3c\xaf\x07\x65\xf2" + "\xf2\xde\x20\xdf\x96\x4e\x7b\xf2\x29\x28\xf3\x3b\xc4\xb7\x45\x59" + "\xa6\xf8\xfd\xce\x17\xe6\x6a\x3c\x08\xd9\x89\x4e\xc6\x7f\x68\xeb" + "\x60\x02\xe8\x77\x82\xcf\xcc\x33\xc8\x67\x89\x8e\xa5\xd0\xfa\x60" + "\x76\x2c\x16\x67\x8b\x68\x5d\x24\x9a\xd0\x28\x68\xe9\x0b\xb5\x1a" + "\x5d\xa8\x96\x72\x64\x1c\x7d\x8f\xf5\xf3\x4b\xb9\x7e\xbe\xd0\xa2" + "\xcd\x05\xdc\xef\xd1\x70\xf5\xbc\xf3\x29\xab\xf2\xb3\xf3\xb2\xb3" + "\xac\xd7\xad\x89\x63\x11\x11\x22\x73\xb2\x57\x59\xf3\xb2\x1f\x5d" + "\x9b\xbd\x46\x08\x68\xf4\xf6\xfc\xbd\x11\xd0\xa0\x70\xbc\x5e\x71" + "\x46\xe6\x37\xd7\x92\x0c\x6b\x2e\xbd\x56\xe8\xc1\x05\x6f\x64\xb2" + "\xe6\x28\xd5\xf1\x69\x52\x8f\x78\x02\x70\xdd\x25\xfd\x51\xbb\x7a" + "\xc9\x7e\x0b\x70\xdd\x75\x9b\xdc\x6b\xff\xcd\x4a\x09\x2b\x63\xb1" + "\xdf\xf9\x9b\xac\x30\xbf\xb6\x4b\xd8\xff\x49\x9b\xb7\xdf\x14\x02" + "\xc6\x4b\xc3\x3c\xc8\xae\x63\x44\x07\x05\x3d\xfc\x3b\xb4\x50\xe5" + "\x9d\x51\xcf\xae\xeb\x79\x01\xef\xaf\x19\x65\x42\x8f\x47\xbe\xdb" + "\x25\x7d\xfd\x4d\x8f\x06\x47\xf0\x2f\xfd\xa4\x2f\xd0\x64\xa0\x45" + "\xc1\x73\xbc\x68\x3d\xd3\x93\xce\x80\xc7\x1d\x66\xbf\xcd\xf3\xea" + "\xb9\xf3\x85\x0e\xf0\x32\x42\x06\x6a\x54\x6d\xbf\x78\x6c\xef\xa0" + "\xdf\xb9\xcb\x1a\x96\x0f\x77\xf5\x0b\x3e\x7e\x94\xf0\xe6\x37\xed" + "\x19\xb4\x46\x48\xda\x3d\xf5\xef\xb5\x97\xc7\x49\x5d\xb9\xa4\x6f" + "\xbb\x32\xd5\x3e\x0c\x11\xcd\x52\x6d\x07\xf5\x12\xaf\x77\xf5\x03" + "\xe7\x86\x68\x2c\x40\xe7\x5d\x1a\xbc\xa8\xbf\x42\xee\xdc\xc8\xf4" + "\xa0\x5d\xec\xd5\x0d\x01\xbd\x8c\xad\xf8\xc2\x01\x29\xc3\xec\xea" + "\x88\xdc\xf3\x91\xb2\xd4\xae\xde\xb0\x5f\x83\xdf\x7c\xe5\x4c\xca" + "\xea\x55\x74\x1c\xe5\x91\x8c\x75\xcb\x1e\xc9\xce\x58\x6b\x9f\x6d" + "\x5d\xbb\x4a\x6c\xa9\x09\xf1\x3d\x7f\xed\xf2\x47\xac\x44\x45\x32" + "\xe6\x2f\x5c\x98\xf1\xfd\xfb\x7f\xf4\x93\x38\xf6\xfd\x65\x48\xcb" + "\x5f\x6d\x5d\x98\x3a\x5b\xbe\xba\xef\xee\xbb\x7e\x9c\x71\xd7\xa2" + "\xfb\xef\x5d\x32\x81\x4d\xab\x09\x38\x31\x88\x31\x8a\xee\x63\x2f" + "\xcf\x91\x36\x0c\x2f\xda\xcf\xb7\x61\x78\x11\xeb\xe7\x8b\x3b\xf1" + "\x6b\x63\xec\x65\x48\x33\x2f\xcf\xc1\xcf\xa6\xe2\xcd\x98\xdf\xf9" + "\x62\x7d\x18\x6f\x5e\x16\xfe\x75\x49\xe6\x97\x3a\xd3\x17\x41\xff" + "\x5e\xf0\x45\xbe\x0b\xd3\x82\x97\x9e\x17\xf4\x52\xc5\x0b\xc2\x87" + "\x8c\xa0\x51\xe0\x86\xe4\x57\x5e\xf4\x69\xb8\x21\xce\xc9\x21\x9d" + "\x74\x5d\xf4\x1e\xf8\xbd\x84\xf4\xc2\xc0\x85\x41\xda\xcf\xa4\x74" + "\x1e\x6f\x5d\xa2\x96\x3b\x9b\xf4\xc4\xc4\xcf\xaa\xfb\x1e\x09\x27" + "\xd8\x4b\x2b\xb8\x73\x97\x57\xca\x82\x2f\x5e\x2b\xf0\x66\xd3\xac" + "\xef\x8b\xfd\x23\x71\x1e\xe1\xa5\xcc\x30\xfe\xbc\x3c\x87\xc6\x86" + "\xe8\x82\xa4\xbd\x2f\x15\x5e\xa0\x7f\x89\x42\x5a\xad\xe6\x07\x3b" + "\xff\x5a\xa6\x37\x5c\x5b\xcb\xb6\xe8\x79\x89\x87\xbd\x94\x26\xed" + "\xd8\x5e\x6a\xd1\xf8\x67\xdc\x63\xfe\x1f\x4d\xbb\x50\x6f\x55\x1d" + "\xa1\xb7\x2a\xb2\xf3\x23\x5d\x76\x2f\xf1\xc8\x6d\x6e\xaf\xf0\xbf" + "\x78\x67\x97\xdd\x47\x3e\xfb\xe2\x06\xd8\xcb\xd1\xc5\x21\x3e\x8a" + "\xfb\x59\xe8\x9b\x58\x43\x6e\x96\x7a\x03\xc8\x63\x2f\xdf\x26\x65" + "\x13\x99\x4e\x70\xf7\xb0\x17\x9b\x49\x36\xa3\xf1\xc1\x7d\x6d\x94" + "\x25\xf6\xf6\x89\xe8\x5e\x42\xa9\x5e\xf5\x73\xf3\x72\x39\xc9\xa8" + "\x04\xab\xa7\xf4\x4a\xce\x53\x4e\xfc\x70\x25\xda\x17\xe6\x2f\x79" + "\x40\xc2\xf6\x65\x57\xbb\x63\x88\xd6\xcd\xc0\xa4\xf6\x85\x05\xbc" + "\x57\x1b\xcf\x45\x21\xef\x9d\x34\x5e\x7e\xe7\xcb\x6d\xda\x58\x0e" + "\x7f\x63\x65\x6d\x54\x29\xb3\xee\xad\xff\x36\xa5\x63\xfe\xbf\x9c" + "\xa6\xda\x4f\xfa\x2e\xfc\x16\x74\x38\x4d\x7e\xdf\xcc\xb4\xef\x2f" + "\xf4\x9f\x2a\x0e\xf8\x91\x72\xea\x76\xa1\xc2\xb2\xa9\xe1\x6e\xcf" + "\x3b\xab\x43\x67\x30\xdb\x25\x4e\x6a\xba\xb3\x44\xd9\x9f\xe6\x73" + "\x4a\x05\xe4\xef\x8a\x03\x7a\x55\x0f\x80\xb9\xdd\xdc\x70\x13\x63" + "\xb9\xbe\x75\xe9\xe3\x7a\x12\xd2\x2f\x90\x4f\x34\xb4\xc3\x15\xa1" + "\xdb\x1a\xb7\xf1\xf2\xb0\xe6\x00\xd9\x9c\xa0\x1c\x03\x95\x43\xf3" + "\x4a\xea\x66\x9a\x5b\xc9\x87\x0e\xca\x5b\x25\xf6\x2e\x9d\xcd\x89" + "\x02\xf7\x20\x6b\x0b\x39\xbf\x90\x7f\xa1\xda\x40\x08\xde\x45\x9e" + "\xe7\x69\x1e\x1a\xd7\xf7\x88\xb3\x2d\xcd\x39\x64\xd7\xe9\x77\xbe" + "\x62\x98\x48\xcf\x07\xfa\x90\xb3\x6c\x55\xd6\xea\x87\x1e\xfa\xfb" + "\xa4\x21\xd2\xd6\xb2\xd6\xa9\xb8\x50\x26\xe4\xdf\x2d\xe9\x12\x4f" + "\x5f\x01\xfd\xaf\x90\xbc\x2e\x78\x18\xcc\x9b\xab\x4e\xb0\x57\xda" + "\x34\xfe\x5d\xce\xa3\x57\x3a\xb9\xf3\x95\xc4\xf0\xdc\x78\xa5\xee" + "\xab\x73\xe3\x95\xe6\x89\xe7\xc6\x2b\xdd\x58\x67\x7b\xf1\xbe\x13" + "\x75\x76\x0a\x9a\x4f\xe3\x2d\x79\xf0\x36\x73\xf0\x4e\xc1\x83\x67" + "\xac\x67\x3a\xe2\xbf\x49\xa7\x4c\xeb\x41\x08\x72\x6d\x08\x34\x22" + "\x23\xc8\x12\x69\x2d\xa8\x59\x45\xfa\xc2\x6b\x78\x70\x84\x7b\x32" + "\xd6\x83\x5e\xe0\xb9\xfa\x84\xdc\x67\x7d\xe0\x2c\xe4\x10\xdc\xd7" + "\x0c\x10\xad\x50\xc8\x59\x3b\x93\xeb\xf5\x6f\xd3\x34\x1e\xd7\x5c" + "\x6a\x15\x3e\x7c\xc5\xba\x0d\x3c\xa3\x75\x3b\x23\x64\x6e\x93\xeb" + "\xf6\x6f\x73\x2e\xaa\x9b\x8e\x8f\x4d\x9c\x28\x1d\x6d\x6c\xa7\x76" + "\xa1\x9d\x2d\x68\xd7\x6e\x6a\x4f\xf5\x43\xd4\xaf\xa8\x5b\xcd\xc1" + "\x54\xb1\x37\x40\xed\x7c\xc0\xc7\x6e\xa5\xf6\x3d\xf0\xe8\xad\xac" + "\xf1\x21\xda\xdf\x95\x76\x3d\x2a\x2e\x19\x80\x33\x53\x06\xd8\xab" + "\xc9\x3e\x11\x53\xf1\xb7\x18\x7b\xa3\xe4\xeb\xd5\xbd\x13\xca\x43" + "\xef\x24\x9e\xbe\x9a\xbc\xd7\x41\x6d\x7e\x35\x59\xcb\x17\xd9\xb6" + "\xbb\x96\xd9\xc1\x58\xae\x78\xe8\xa1\xec\xbc\x35\x5a\x7c\x68\xdb" + "\xea\xdc\xac\x3b\xd4\xf3\xae\xab\xb2\xd7\x65\xac\xc8\x12\xf6\xf4" + "\x48\x95\xb7\x17\xf0\x1a\xb3\x49\x16\x10\x36\xaa\x82\xcf\xf8\xfd" + "\xb9\x46\x95\xe7\xe8\x63\x2d\x2e\xb9\xff\xdc\xf2\x3d\xb9\x0e\x4c" + "\x7d\x14\xed\xd8\xa9\xad\x03\xa4\x8f\x18\x66\xd7\xda\x68\x5f\x88" + "\xce\x30\xd3\xfe\x13\xe9\x24\x90\xa7\xc3\xc3\x7e\x9b\xaf\xe1\x76" + "\x15\xd2\xe9\xdc\x44\xdb\x2a\xb2\xb5\xdb\x3d\x53\x29\x3f\x18\xe4" + "\x71\x7b\x5b\x40\x03\x84\xac\x43\xfb\x21\xd2\x1f\x7f\x4b\x12\xd1" + "\x36\xd2\x9b\xb5\xad\x22\xdb\xb5\x57\xfb\xb1\x96\x83\x07\xde\x9d" + "\xec\x8d\x3d\x18\xdc\xbc\x81\x19\xa9\x0e\xac\x1b\x1e\xa9\x67\x6d" + "\x49\x7d\xab\x90\x31\x75\xed\xf0\x54\x09\x9d\xe2\xab\xd2\x67\xa2" + "\xeb\x50\xa2\xaa\x73\x48\x44\x3e\xe0\x7f\x3c\x93\x6d\xde\xdb\x23" + "\xf6\xbd\x04\x5d\x68\x29\xe4\x15\xed\x39\xc2\xbe\xb0\x62\x6f\x8f" + "\xc2\x73\xa2\xe8\x19\x74\x39\x0e\xe5\xec\xe4\xc5\x36\xa6\xda\x24" + "\x46\x0d\xb0\xdf\x45\xe3\x6a\xc0\x78\x6c\x21\x58\xa0\xfc\x64\xb5" + "\xfc\x64\x94\x8f\xf5\xef\xca\x5a\x39\xbf\x5a\xda\xb5\xba\x80\xdb" + "\xa4\x93\xe9\xa7\xf5\x0b\xed\xf7\xe1\x17\x90\xfa\x99\x00\xe4\xa4" + "\x6b\xc6\xf5\x33\x92\x47\x6a\x09\x6a\x38\x49\x75\xab\x7d\xb0\x90" + "\xcf\x17\xd2\x27\xa8\x75\x59\x48\x57\xa0\x95\xc9\x51\x26\x1f\x19" + "\x6a\xc2\x5a\x63\xc4\x1c\xf3\x26\x94\x62\x4d\xa1\x3a\x88\xc7\xf5" + "\x5d\xc3\xb1\xe6\x84\x32\x42\x06\x79\xde\x7c\x3d\x8b\x8f\xe4\x6f" + "\xfd\xce\xdf\xe5\x86\x79\x32\x94\x31\x02\x5a\x56\xc4\x4a\xfa\xd9" + "\xef\x84\xff\x33\xb2\xe7\xa0\x71\x1d\xc5\x38\x61\xac\x5a\x51\x4f" + "\x0b\xf8\xf2\x78\xc0\xe1\x45\x1a\xaf\x6a\x05\x73\x6e\x54\xf0\xea" + "\x66\x8a\x9d\xde\xc7\x7e\xf7\x34\x8d\x15\x95\xc5\x5d\xed\xae\xa0" + "\x3f\xfd\xdf\xc9\x2f\x15\xc1\x7a\x63\x21\x1f\xa4\x3d\x3a\xe0\xd6" + "\x4c\xe2\x61\xc1\xd7\x8b\xfb\xe2\x2c\xae\x88\xb1\x16\x76\x8a\xbf" + "\x9f\xb9\x71\x90\x2b\xe7\x9c\x8c\x77\x80\x96\x9e\xd3\xb3\x60\x00" + "\x32\x28\xda\xad\x2f\x3e\x49\xbe\xb3\x9a\x30\xbf\x5c\x0c\xf5\x1a" + "\xab\x37\xb0\x44\xf2\x35\x56\x6c\xe7\x81\x2e\x5f\x3d\xeb\xb2\xd7" + "\xb3\xf7\x82\x5b\x58\x5b\x01\xe9\x34\x7f\xdf\xf6\xbe\x63\x0b\xd9" + "\x85\xc7\xe2\xbe\xd4\xfa\x63\xaa\xeb\xbf\xd3\xdf\x3f\xf0\x21\x7b" + "\xbf\xed\x43\x66\xfd\x2f\xf1\x9c\xd3\x99\xfe\x1e\xeb\x4c\x7b\x8f" + "\x15\xf7\x73\x85\xf8\xa1\xa2\x95\x54\x87\x0b\x65\x35\x91\x8f\xae" + "\x44\x65\xd8\x12\x87\xfe\x1b\x16\x39\x98\xd8\x07\x6c\x5b\xf5\x67" + "\xb4\xf1\xbf\x8f\x37\x9e\x61\xc6\xb6\x55\x7f\x11\xf7\x42\xbf\x80" + "\xfe\xba\xb3\x7a\x84\x8d\x18\xf9\x24\x73\x3b\x06\xe9\x7c\xa5\x52" + "\x43\x6d\x0c\xc9\x76\x03\x5e\x06\xed\xfb\xed\x45\xe3\xdf\x0b\x5f" + "\xb1\x0d\x04\x0f\xb4\x69\xff\x12\x09\x93\xce\x1e\xc0\xf4\xc7\x2a" + "\x7c\xd2\x23\xe1\xf3\xdf\x46\x82\x0f\xd9\x7f\x2a\x05\x43\x4d\x68" + "\x5b\x1a\x60\xa0\x68\x75\x10\x0e\xd0\x7e\x15\x95\x5f\x7d\x86\x99" + "\xda\x56\x91\x7d\xe8\xef\x57\x9a\x17\x1b\x8c\xca\xc8\xc9\x96\x9a" + "\xb3\xcc\x40\xe3\x46\xeb\x6c\x8d\x78\x2f\x60\xbe\x98\xc6\xcc\x1b" + "\xfb\x11\x70\xea\x23\xe0\xe7\x47\xa4\x87\xd8\x89\x6b\x10\xe3\xe5" + "\x02\x9c\x06\x31\x56\x4d\x74\x95\xf8\xb8\xcf\x46\xfe\x1a\x69\x2d" + "\x03\xae\x84\xd3\x2b\xf6\x7d\x33\x88\xb9\xa3\x08\x39\xed\xbf\x07" + "\x95\x72\x4f\x8f\xb4\x15\x7c\xd5\xd6\x00\xbe\xb8\xfe\x49\x71\x1e" + "\xdd\x04\x5e\x5e\xac\x8b\x5b\xc5\xb9\x95\xdf\x8f\xaf\x7f\x15\x22" + "\x96\xf9\xef\x2d\x7a\x61\x13\x76\x28\x49\xc5\xf5\x24\xbf\x73\x37" + "\xe6\xfe\x0c\x55\xae\x6e\x11\x67\x5a\x88\x0e\x4c\xc6\x93\x80\x2e" + "\x77\x92\x8d\x1d\xbf\x32\x9d\x99\x74\xdc\x6b\xca\x34\x73\x77\xb0" + "\x9d\x70\xc8\x24\x70\x5f\xbe\x03\x1f\xe9\x35\x83\x96\x77\x23\xdd" + "\xa0\xa5\x13\x5d\x57\x20\x5b\x92\x5c\xbb\x68\xbd\x99\x17\x9d\x65" + "\xc9\x42\x47\xa4\xa5\xaf\xf7\x9a\xbb\x2c\x8c\x6c\xee\x83\xe4\x87" + "\x82\xbe\x41\x7a\x14\xd6\x81\x3d\xa8\xb7\x0d\xf9\x93\xb4\xfc\x7c" + "\x38\xdd\xe0\x76\xb4\x8b\x79\x46\xbe\x95\xb4\x75\x01\xe9\xd1\x8b" + "\x1c\x5e\xb3\x18\x33\x2d\x6d\x4d\xba\x58\xc7\xe8\xcc\x3b\xf8\x54" + "\x2e\xda\x33\x20\xd2\x75\x90\x33\x45\xac\xf4\x88\x34\x3d\xf9\x17" + "\x20\xbf\x78\x11\x69\x51\x68\x33\x1b\x7f\x46\xdd\x35\x0f\x8b\x7d" + "\x7a\xcb\xa2\xf5\xb4\x27\x86\x7a\x1e\x56\xeb\x5e\xcf\x99\xf4\xb7" + "\x29\xd3\xe4\x9a\xf9\x87\xfc\x48\x19\x97\xf6\x28\xa8\x6e\x65\x38" + "\x5d\x1f\x1a\x4e\x8f\xa2\xfa\xa9\x2c\xd2\x4f\x8a\x98\xed\xc1\x41" + "\x46\xbe\x9e\x79\x95\xd5\xce\xe9\x8c\x05\xca\x15\xed\x71\x40\xfe" + "\x8f\xb7\x4e\xec\x57\xa0\x32\xc1\xd6\x56\xf4\x5f\xc0\xe9\x3f\x16" + "\x12\x4d\x09\x19\x7b\x4c\xd6\x87\xc9\xee\xe0\x0f\x67\x69\x4c\x43" + "\x98\xe7\xa1\xd8\x1e\xd3\xcd\x83\x4c\x57\x84\xb9\x23\xf7\xea\xfe" + "\x38\x9d\x78\xaa\x62\x85\x73\xdc\x1b\x09\x77\xcd\x43\x90\x5b\xca" + "\x7b\x12\x85\xbd\x47\x42\x9c\xd5\x1d\x18\x64\x9d\x25\x9f\xb2\xce" + "\xa0\xbb\x64\xcf\x19\xaf\x41\xda\x7d\x18\x50\xee\x1f\xaf\xa7\x77" + "\xc5\x98\x2f\x19\xa1\xa6\xc9\xe5\x40\xc8\x16\x80\xdd\xe7\x72\x2d" + "\xf8\x63\xa1\x26\x4f\xfc\x9d\x3e\x1c\x20\xdf\x86\x64\x17\xa7\x54" + "\x0c\x2e\x46\x5b\x8a\xb9\xdf\xc6\x6e\xde\x40\x7a\xdd\x3f\x36\x27" + "\xf8\x58\x9a\x5a\xee\x97\x6a\xb9\x07\x2e\x56\x2e\xe1\x6d\x67\x9d" + "\xb4\xb5\x50\xe2\x06\xd3\x42\x28\x3b\x14\x37\x58\x82\xb5\xa6\xb8" + "\xf8\x1c\xe9\x4e\x5a\x67\xa2\x9e\xb4\xae\x60\x37\x23\x1f\xa9\x8d" + "\x0a\xd6\xeb\x2f\x2d\x4c\xb5\x71\x29\x3e\xc5\xfe\x14\xad\x70\x5b" + "\x22\xe4\x1c\xd2\x95\x16\x13\x9d\x25\xdd\x73\x51\x88\xc5\xb8\x31" + "\xb2\xe4\xe3\x0f\x65\xc4\xef\x23\xbd\x34\x68\x55\x88\x5b\xf4\xaf" + "\x8f\x78\x58\x0d\xe8\xb7\xf0\xf9\xb7\xe9\xca\xad\x09\xa5\xec\x4e" + "\xae\x37\x0b\x1b\x26\xac\x2f\xe9\x18\x5b\x87\x68\x4f\xc5\xa1\x94" + "\x08\x7b\x9a\x28\xd4\x55\x4e\xf6\x34\xdc\x78\x70\xb0\x9e\xd6\x4c" + "\x8c\x99\xdf\xf9\xa7\xdd\x1e\xf6\x07\xc1\x97\x54\x92\x1e\x40\xd0" + "\xf9\xd6\x6b\xbd\xb1\xfd\x56\x2a\x83\x7c\x01\x29\x05\xc1\x96\x9a" + "\xd3\xe0\x7b\x04\x3c\x5a\x75\x5d\x43\xfe\x36\xee\xea\xb7\xd2\x3c" + "\x52\xcb\x36\xa3\xec\x0f\x78\x79\xbf\xd5\xc3\x5a\xad\x92\xd6\xd0" + "\xfd\x9f\xc4\x5e\x47\x70\x8c\xce\xe1\xfc\x29\xa7\x7e\x94\x74\x72" + "\x7f\x02\x5d\xb9\xa6\x6d\xd8\xd8\x6f\xfd\x91\xa5\x04\x3c\x40\xeb" + "\x1c\x8f\xee\x53\x71\xb6\x4d\xf3\x5f\x38\xd9\x1e\x14\xdf\x66\x89" + "\x73\xa3\x10\xf0\xb8\x49\x27\xd8\x9f\x9f\x1f\x85\x9c\x3f\x86\xb5" + "\x75\x14\x72\x02\xdf\x96\x6e\xaa\x9e\xc5\x52\xf1\x6e\xd6\x09\xd6" + "\x5a\x1e\xd4\xb3\x24\xfc\x12\xbd\x57\xe6\xc4\xa2\xdc\x34\xd2\x7f" + "\xee\x3f\x43\xfb\xae\xad\x82\xee\xd7\x6c\x65\x29\x0a\xca\x23\xbd" + "\x6b\xcd\x2c\x96\x42\x3a\x57\xa4\xd9\x32\x42\x72\x4f\x42\x93\xa9" + "\x36\xcd\x62\xb3\xcf\xaf\xb7\xd5\x2e\x65\xb9\x3f\x8b\x35\x7e\x9d" + "\x97\x5d\x6d\xff\x2e\xef\x1b\x60\xaf\x65\x71\x67\x14\xe7\x57\x5a" + "\xf4\x52\xa6\x78\xed\x1e\x73\x9d\xc4\x3b\xa1\x83\x07\xbe\xd1\x1e" + "\x87\xaa\xdb\xd5\x09\xbf\x8d\x71\xbd\xf5\x74\x0e\x42\xa4\xe9\x12" + "\x09\x96\x89\xa2\x1d\xaa\xcf\xb5\xd0\xa6\x1b\x28\xb6\x9b\xf0\xb5" + "\x96\xb1\x4c\xea\x85\xc9\x1f\x1b\x60\x2c\xce\x83\x55\x6e\x65\xa6" + "\x27\xb6\xb2\xc4\xfd\x0f\x51\xbf\x5e\x2b\x94\x73\xd1\xc0\xa8\xbd" + "\x8a\x8b\xe6\x19\x70\x02\xed\xa6\xfa\x08\x37\xba\x82\x5f\xb6\x15" + "\xe7\x73\xa5\xed\x61\xf2\x05\xf0\xda\xeb\x6d\x79\xcd\x6c\x11\xf9" + "\xaf\x23\x1f\x36\x4b\x99\x77\x3b\xca\xdb\x3e\x8b\x25\xa2\xac\x77" + "\xdd\xb9\x44\x6b\x2d\x5f\x6b\xcb\xdb\x4d\x65\x1f\xa6\xf5\xa8\x0a" + "\xf0\x91\xeb\xd2\x9f\x6b\xdd\x81\x1e\x46\xfe\xea\xef\xb5\xf3\x10" + "\x95\x33\xc0\xfe\x3c\x5d\xf4\x77\x9b\xc5\x9a\x21\x7d\xe6\x89\xbe" + "\x8e\xeb\xdb\xd5\x7e\xb8\xcf\x50\x79\x7f\xb6\xb9\x33\xc1\x73\xaa" + "\x7d\xd2\x60\x2d\xf1\xeb\xcf\xd9\x6d\x79\x3b\x19\x8d\x0f\xe5\xc7" + "\xf3\x12\xf7\x10\xf2\x9e\x3c\x7f\x5c\x28\x0f\xde\x3d\x8e\x72\xff" + "\x35\xbc\x8f\x44\xfb\x1b\xe1\x3c\xf5\xe8\x0f\x60\xd5\xb1\x0d\x30" + "\x92\xfa\xb5\xd7\x4e\x53\x5b\x3d\xec\x35\xaf\x3b\xff\xd3\x89\xcf" + "\x1f\x61\xee\x03\xef\x4b\xbb\x84\x6e\xe9\xcf\x47\xee\x0d\x2a\x5c" + "\xd2\xb3\xff\xd9\xa2\x80\x0e\x78\x70\x25\x5a\x20\xe8\xc9\x4d\xb4" + "\xf7\xfb\x3f\x4f\x9b\x75\x72\x7c\xa9\x2f\xc4\x33\x4d\x34\xc6\x11" + "\x7a\xfd\x44\x6a\xab\x36\xc6\xdc\x94\x60\x53\x68\xbf\x66\x16\xe0" + "\x3d\x66\x61\x12\xff\x78\x2d\xca\x7d\x5c\xe5\x21\x73\xd4\xf5\x34" + "\x67\x38\xb6\xc7\xc2\x1f\xb3\x30\xcd\xd6\x0e\xf3\x37\x29\x43\xda" + "\x2f\x5a\x88\x46\x6d\xd7\xcb\xb9\x43\x6d\x54\xbf\xcd\x92\xfb\xc8" + "\xff\xb3\x04\xdf\x67\x4d\xd8\xdf\x28\xd0\x1d\x27\xc8\x34\xfa\x23" + "\xce\x05\x80\x56\x61\x3d\x88\x71\xfb\x46\x99\xdc\xdb\xde\x33\x8d" + "\x62\xc7\xd3\x99\x30\xad\x6d\x97\xa6\x83\xff\x9f\x5e\xa9\x83\xdf" + "\x93\xac\xc9\x9b\xdc\x04\x18\x3b\xcd\xc2\x77\x39\xf8\x2e\xc5\x17" + "\x9f\x90\xea\x8d\xb7\x66\xca\x79\xb3\x67\x3e\x8f\x97\xf4\x36\x23" + "\xc0\x4a\xa8\x5f\xaa\xdc\x15\x43\x7d\x46\x39\x59\xda\x5e\xb0\x56" + "\xf6\xa4\xf1\x00\xb4\xbe\xa1\x4f\xa2\x6f\xe8\xa3\xe8\x1b\xf9\xc3" + "\x90\x7d\x13\xe7\x71\x2f\xad\x3f\x7b\x64\x8c\x80\xca\x84\xd4\xb6" + "\x59\x54\xc6\x1b\xeb\x85\x2d\x3e\xc6\x04\xf4\xe1\x8a\x13\xec\xf5" + "\x39\x3c\xee\x89\xb8\x4b\x2b\xf3\x75\x26\xcb\xb4\x66\x3e\x0d\x1a" + "\x2c\xcf\x07\x91\x0d\xcb\x1b\xcb\x40\xcb\x33\x49\x86\x19\x46\x7d" + "\xc0\x8f\x08\x3a\xf4\x7a\x3f\x8d\xd5\x4d\xcd\x2c\x4d\xe2\xe1\xeb" + "\x9f\x90\x5e\x42\xc6\x6b\x79\xdd\x05\xbc\x17\x67\xf0\xc2\x76\x99" + "\x3a\x61\x97\x19\x49\x63\x2f\xb1\x8d\x52\xa6\x49\x30\x62\xfe\xbc" + "\xee\x10\x76\x3a\x68\xef\xba\xa0\x46\xff\x5e\x77\x70\xd2\x0d\x17" + "\xa9\x3a\x42\xa2\x65\x45\xd2\x9f\x96\xdf\xf9\x86\x65\x5c\x47\x48" + "\xe7\x27\x9d\xbc\x83\xf2\x61\xec\xbf\xa4\x3c\xd2\xdf\xcf\x09\xf5" + "\x6c\xe1\x1b\x37\xaa\xe7\x06\x6d\x64\x8f\x84\x6f\x97\x78\x58\xdf" + "\x6e\xa1\xcb\x01\x0c\xa8\x6e\xd1\x76\x3d\xe9\x03\xdf\xb0\x87\x75" + "\xb2\xaf\x8b\xf3\xdc\xf2\xec\xef\x1b\x2e\x0d\x47\xd0\xdf\x18\xe9" + "\xa3\x7f\xcf\xe9\xbd\xb3\x99\xc0\x81\x61\x6e\x89\xfb\x7a\x3d\xe1" + "\xe4\x1b\x2d\x91\x70\x5a\x14\x54\x8a\x25\x0d\x7a\xbd\x8e\x8b\xb9" + "\xfe\x7a\xdd\xdf\xe7\x27\xde\x8c\xd6\x78\x11\x09\xe7\x44\xc0\xe7" + "\xad\x6e\x01\x6b\x57\x7b\x07\xf9\xd5\x7c\xac\x88\x7c\x03\xbf\xb9" + "\x8f\xfc\x2e\x07\x5d\xed\x83\xa1\x62\x0b\xc5\x74\x61\x8a\xab\x3d" + "\x30\x60\x67\xfa\x0c\x3b\xe9\xa1\x8f\x7a\x49\xc6\x83\xcc\x9a\xc8" + "\xe3\xc0\x9f\x60\x9e\x6f\x5c\xc1\xcc\x3f\xcb\x41\xd9\xc5\xb6\x24" + "\xf2\x8b\x4c\x3e\x91\xc9\xaf\x79\xa8\xd8\x76\x19\xee\x67\x80\x9f" + "\x4b\xe4\xc6\xf6\x1e\xda\xcb\x0e\x39\x39\xe8\x71\x2f\xf9\x66\xd6" + "\xbb\xbd\x01\xb6\xf1\x24\x33\x92\xdf\xe5\x60\x79\xbf\xb1\xcb\x77" + "\x58\xc8\x37\x09\x76\x96\x04\xfe\x23\x19\x30\xb7\x28\xb1\x47\x21" + "\x33\x1c\xf5\xc9\x7e\x7f\xc9\x65\xbf\x65\xbb\xa9\xfd\x82\xc6\xb9" + "\xde\x0e\x14\x89\xb6\xbf\xb5\x22\x88\xf2\x15\xd7\xfb\xbe\x90\xeb" + "\x7d\xaf\x3c\xbf\xda\xc9\x8a\xf2\xf9\xa0\xdb\xd7\x09\x99\xeb\xac" + "\x88\x43\x45\x7b\xe5\xd4\x47\xea\x1f\xd5\xfd\xfe\x99\x93\xc2\x8f" + "\x74\x10\xcf\xc5\xb9\xea\x37\x43\xf8\x66\xa8\x93\x8d\xba\xde\x17" + "\x7d\xef\xf2\xc9\x6f\x33\xc4\x3d\x7d\x1f\x01\x07\xb5\xcf\xe3\x70" + "\x40\xdf\xa9\x7f\xd4\xff\x20\xc1\x04\x30\x50\xfb\x6a\x19\x53\xfb" + "\x49\x7d\x7c\x0f\xab\xce\x56\xf4\x13\x7d\x15\xfd\x1c\x43\x3f\x3b" + "\x72\x18\x0b\x54\x27\xa4\x9d\x8b\x7b\xdf\x4b\x32\x6a\xf1\x07\xe0" + "\xe1\x0b\x6b\x19\x64\x51\xc3\x2b\x45\xb5\xfa\x0a\xf0\x26\x45\x5e" + "\xc8\xa4\x5e\x3e\x48\x76\xaa\x6e\x3b\x7e\xc1\x7a\x46\x3c\x8e\xc6" + "\xaf\xa3\x6e\xcb\xfb\xca\x31\x56\x34\xc8\x07\xc1\x9b\x06\xdc\x41" + "\xe4\xc9\x41\xff\x21\xc3\x0e\xa8\xed\xa7\xbc\x1b\x4f\xcb\x7e\x99" + "\x73\x59\xd2\x9b\xff\xe5\xd2\xbb\x7b\x5c\x4c\xeb\xcb\x03\xc8\x87" + "\xfe\x58\x50\x96\x88\x43\xa3\xa0\x9f\xdb\xd0\xce\x40\x44\x9f\xf6" + "\x0f\x91\xad\xec\xc7\x2c\x6e\x31\xd3\x6d\x3d\x85\x7e\x9c\x62\x96" + "\xda\x22\xf0\x5f\xf7\x11\xbf\xd8\xb6\x63\x6a\x3a\x4b\xf1\xb0\x37" + "\x65\xbc\x56\xe9\xe7\x75\xfa\x09\xf6\xd6\xbb\x9a\x2f\x57\x85\x7c" + "\x61\xc7\xf6\x9b\x08\x8f\x84\x5f\x57\x5a\x33\xfc\xc0\x19\xda\xd3" + "\x5e\x87\x3a\xfc\xb6\x19\xa2\x3d\x4e\xe9\x0b\x16\xcf\xc4\x93\xd3" + "\xd9\x30\x1d\xbe\x33\x72\xc0\x8c\xca\xe7\xe5\x47\x7d\x74\x25\x18" + "\x4e\x68\x57\xfa\x5b\x36\x17\x75\xa6\x90\xfc\xdd\x52\xe4\xd5\x3f" + "\xfe\x5b\x36\xfb\xd2\x68\xca\x5b\x81\xc9\xe8\x37\xe9\x32\xa9\x3c" + "\xf4\xed\xb2\x13\xec\x2f\x87\xcf\x9f\x63\x56\x41\xcb\x24\x1d\xfc" + "\xcb\x4e\xd2\x15\x5e\x5a\xbd\x7f\x11\x3c\x1c\xd9\x23\x5c\xe2\x77" + "\xbb\xb4\x76\xe0\xfe\x2b\x76\x44\x5a\xdb\x2f\x1d\x0e\x7b\xd9\x64" + "\x65\x55\x3d\x23\x6c\x06\x8b\xab\x9f\x01\xbd\x00\xaf\xb0\xd7\x42" + "\xfb\x0e\x58\x3b\x77\xfa\xd8\x9a\x06\x66\x2c\x3e\x49\x7a\xa1\x7b" + "\xd8\xde\xfa\x54\xd6\x78\x86\xfc\x33\xd9\x2e\x7b\xea\x0c\xc6\x52" + "\xa5\x21\xc4\x93\x92\xce\x95\xaf\xb1\x25\xd6\x3c\xa3\xf1\xf0\x7b" + "\xdf\x2d\x3c\xcb\xf4\x32\xf6\xf7\xde\x8e\xf9\x56\x1e\xdc\xa2\x57" + "\x72\xea\xc9\xcf\x71\x82\xd1\x4e\x7e\x8e\x35\xbf\xbf\x82\xf7\x71" + "\x60\xce\x0d\x5b\xe2\xaa\xf2\xd8\x6c\xf2\x51\x6e\xf6\x4a\x5e\x4e" + "\xae\xd7\x7b\xc9\x76\x33\x51\xf5\x05\x9c\xa8\xfa\x02\x4e\x23\xbb" + "\x6a\xf9\xbe\xfd\xfa\x10\x64\x18\x51\x6e\x1e\x4b\xa9\x3f\xc3\x6c" + "\xc4\x07\x65\x1c\x93\x3c\x1b\xc9\x85\xf7\x0c\x99\x79\xe8\x6f\x36" + "\xd6\x70\x22\xec\xc3\xdc\xbb\x86\xfc\x9e\x73\xcb\x64\x36\xc2\x35" + "\x33\xc4\xde\xbb\xf0\x4b\x49\x3a\x79\x3c\xb3\x2d\x4f\x32\xc3\x5e" + "\xb2\xe3\x6b\x92\xe7\x8d\xf6\x06\xa5\x4d\xab\xdf\xd9\x5e\xa7\xf9" + "\x78\x9e\x74\x6f\xd9\x25\xe5\x1d\x25\x06\xf2\x97\xd7\xdf\x26\xfd" + "\xfd\xb5\x7b\xdc\x9b\x95\x08\x19\xa7\xfd\x2d\x7a\x47\x69\xe4\x43" + "\x29\x4d\xc0\x72\x9f\x91\xe4\x1e\x55\x66\x7c\xd3\xaa\xa5\xa9\x32" + "\xa3\xb0\x2b\xb6\xc8\xbd\x32\xac\x4d\x09\x7e\xe7\xbe\x14\x6d\x3d" + "\xa3\x75\x5d\xea\x86\xf7\xcd\xf5\xe8\x7a\xe7\x5d\xa4\x7d\x89\xaa" + "\x1d\x34\xed\x73\xa4\x21\x7f\x8e\xb6\xbe\x89\xfd\xce\x4d\xb3\xbe" + "\xbf\x66\x3d\x4b\xfe\xd1\x4c\x23\xa3\xbd\x32\xe4\x1d\x94\xeb\xee" + "\xbe\xda\xb0\x3e\x3d\x4d\xc0\x9b\xce\x03\x0b\x19\x83\xfc\xec\x49" + "\x7f\xe5\x43\x9a\xbf\x3d\xb9\xfe\xee\x7b\x25\xa2\x9e\xee\xf1\x75" + "\x14\x75\x90\x9d\x35\x95\x2f\x79\x93\x7d\x9b\xc5\x99\x31\xe4\x93" + "\xeb\xeb\xbe\xcd\x17\xe1\xc5\x6c\x04\x5f\x45\x95\x27\xdd\x43\x5f" + "\x48\xf8\x3a\x58\xd4\xcd\x5b\x98\xe5\xcd\x22\x8f\x21\x41\xfa\xd1" + "\x35\xf7\xb1\xb7\xaf\xa5\xf7\x84\xeb\x6d\x37\x91\x3e\xf0\xed\x8d" + "\x6e\x5a\xb7\xc7\xd2\x4d\xf7\x92\xac\x2f\x78\xf1\xb7\x73\x6f\xc4" + "\x77\x48\xbb\xec\x8d\x53\x01\x43\xcd\x06\x36\x5b\xfa\x2d\x7c\x5b" + "\xc4\x06\xf6\x5e\xf1\x88\xff\xeb\x49\xcc\xf2\xf5\x2d\xcc\xe6\x77" + "\xbe\xbd\x05\xf2\xa5\xf0\xc9\x29\xea\xaf\xb6\xd6\x92\xaf\xf6\x57" + "\x47\x3d\xd1\x72\xac\xde\xb9\x05\xcf\xb6\xf0\xf3\xdb\xfb\xd5\xbd" + "\x14\xf4\xfd\x9d\xd4\xed\xa7\xa4\xbd\xb8\xd0\x2f\x55\xc6\x26\x86" + "\xf7\xea\xdf\xb9\x45\xb6\xe5\x9d\x5b\xf6\x82\x9a\x34\x3c\xc3\x0f" + "\x34\xce\xe0\xdd\x7e\xe7\x3b\x06\x0f\xdb\x37\x5f\xd5\xc7\x74\x0b" + "\xbc\x22\x7e\xb7\x8c\x64\xb0\x2f\xda\xaa\x90\x8f\xd6\x09\xf0\x47" + "\x69\x82\x87\x07\xaf\xab\x00\x7f\x22\xfa\xdf\x40\xfa\xc6\x09\x69" + "\xe2\x56\xc6\xc4\x37\x55\xc6\x1c\x61\xfb\x51\x65\x1d\xc4\x15\xb8" + "\x16\x97\x88\xab\x09\x38\x67\xc5\x35\x11\x57\x0b\xae\x49\x78\xdf" + "\x4d\x78\x09\x19\xd6\x42\xf1\xe6\x86\xe3\x8d\x99\x93\x9d\xfd\x21" + "\xd8\xb8\x37\xff\x98\x49\xfb\xb6\x8e\x24\x8a\x35\xb6\xa8\x81\xb1" + "\x35\x41\x3e\x6a\xbd\x9a\x4d\xe9\x43\x5a\x71\x03\xed\x3b\xbf\x33" + "\x78\xfe\xbe\x73\x87\x11\xbf\x05\xf8\xd5\xe3\xd7\x89\x5f\x52\xf8" + "\xf7\xae\xd1\xef\xec\x48\x02\x1c\xa5\x3f\x88\x4b\xa2\x89\x1d\xe2" + "\xbc\x78\x0d\xc9\x45\xb1\x83\xa9\x6a\x7f\xd3\xf0\x6c\xe4\xf1\xd6" + "\x12\xb5\xbf\xa9\x78\x4e\xb4\x16\x63\x5d\x8b\x07\x4c\x66\xa1\xcf" + "\xf1\xd6\x41\xea\x2f\xb5\x77\x38\x3e\x2e\x31\xf2\xdc\x13\x95\x49" + "\xfd\xf7\xc6\xc7\x52\x79\x8c\x7f\x63\x65\xad\x06\x4f\x15\x4e\x74" + "\x26\x44\x3f\x8c\x32\x24\x1f\x84\xfc\x28\x43\xcb\x3f\x0e\x7b\xe4" + "\x13\x72\x22\xf2\x41\x26\x36\x6a\x67\xaa\xfc\xce\x77\xd9\x5b\xb9" + "\x72\x3f\x83\xbe\xf5\x45\x7c\x4b\x7e\x3e\x26\xfa\x1e\x75\x1a\x65" + "\x9d\x71\x90\xbb\x3b\xa6\xab\xf5\xfa\x26\x9b\x4b\x45\xd7\x82\xbf" + "\xab\xf7\xd0\xf9\x1f\xe2\x87\xe6\xb9\x93\x7d\xcc\x5d\xaf\x30\xa5" + "\x3a\x36\x2d\xad\x88\xb7\x0d\xb0\x77\xff\xd0\x15\x18\xbc\xc4\xf5" + "\xf0\x5d\x29\x8b\x8e\x96\x30\x77\xe1\xb7\x85\xbd\xfa\x29\xf6\xde" + "\x31\xb7\x57\x9c\xad\xa5\x7b\xe1\xf3\x99\xf6\x9b\x69\x6d\x20\x1f" + "\xf6\x9a\x8c\xad\x20\x6f\x23\xa5\x23\x8d\xce\xff\x6f\x8f\x78\xc7" + "\xab\x8d\x0b\xe4\x9c\x7a\xaf\x81\x78\x0b\xd1\xde\xe0\xbf\xb7\x51" + "\x9b\x95\x4a\xe3\x02\xea\x43\x31\xe4\x3f\x8a\xf3\x47\x73\xc2\x5a" + "\x40\xba\xc2\xf7\xd6\x03\xef\xb8\x52\x65\x5c\x70\x69\x7d\x78\x4f" + "\xf8\x61\x2f\x0e\xf2\x53\xde\x78\xe3\x02\xe2\x49\x6a\x8a\xa2\x8d" + "\x77\xd5\xf3\xb6\xe1\x84\x58\xd0\xb2\xf7\xea\xdf\x72\xc8\xb1\xb9" + "\xc4\x72\xeb\xb5\xbe\x37\xaa\x7d\x07\xbc\xc4\x1e\xd5\xcd\x75\x32" + "\x36\x00\xf2\x1c\x98\x54\x67\x85\x71\x26\x7e\x00\x6b\xc3\x39\x09" + "\x8b\xf7\x53\xc6\xd7\x86\x4b\x6a\xc7\xfb\x29\xff\x40\x1d\x63\x6a" + "\x1d\xae\x7f\xb2\x0e\xd7\xc5\xea\x90\x7b\xcd\x9d\x49\x97\x2e\x3b" + "\xbe\xef\x11\xb8\x52\x19\x9b\x2a\x69\xe6\xfe\xc7\x43\x90\xdf\x82" + "\x26\x6b\x1a\xf1\x36\x64\x57\xea\xf6\x04\x59\xd0\x35\x98\xba\xdf" + "\x31\xca\xda\x0a\x3e\x64\xfd\xac\xf3\x1e\xfa\x66\x7f\x3e\xc9\x6c" + "\xd6\x92\xb1\xea\xd8\xda\x31\xfd\xfb\x59\x04\xef\x06\x8a\xc3\x10" + "\x81\x67\x5d\xbe\x0f\x99\x3b\x93\xf4\xab\xdd\xa4\xd7\x2e\xc1\xbc" + "\x4a\x53\x40\x1b\xc0\xa3\x87\x04\x3c\xc0\xbf\x08\x79\x0b\x32\x9b" + "\x90\xb7\xbc\xc2\x3f\x69\x3c\xf8\x5e\x13\x77\x3e\x95\x45\xba\xef" + "\xd0\x58\xba\xd5\xef\x64\x8b\x29\x26\x02\xe9\x9d\xb9\xf1\x10\x5b" + "\x14\x8c\xe2\x42\x9e\x02\xef\x4f\xb1\x11\xdc\xe0\x86\x43\xe0\xa3" + "\xeb\x47\x58\x52\x3d\x78\x4f\xd0\xec\x44\xa2\xeb\xdb\xd5\xd8\x08" + "\x55\x23\xe1\xd8\x08\x8d\xa4\xeb\xe9\xc1\xfd\x08\x33\x84\xaa\x12" + "\x6c\xdb\x46\x58\x4a\x43\x01\xb3\x6d\x23\x5d\xde\x71\xc9\xfb\x08" + "\x3b\x70\x8a\x93\xb0\xda\x46\x7b\x09\x61\xde\x87\xce\x82\x87\xe9" + "\x96\x41\xe8\x40\x2e\x09\xde\xfb\xc5\x3a\x18\xac\x34\xe6\x00\xc6" + "\x83\x63\xd5\x71\x89\x1e\xd6\xb9\x19\xf0\x9b\x50\xe7\xa5\xd9\x93" + "\x6c\x89\x88\x6d\xf1\x56\x8a\xa4\xef\x28\xab\x63\x32\x9c\x08\x6d" + "\x4b\x67\x37\x0f\xb1\x54\x79\x0e\x31\x16\x6b\x62\xd7\x6c\xb2\xff" + "\x2b\x5a\xc9\x2c\xa1\x6d\x4b\x75\xc5\x3b\x58\x94\x3b\x98\xc6\xe8" + "\x57\x74\x9a\x0f\xde\x9c\xcb\x52\x69\xff\x81\xf6\x4a\xac\x8f\x51" + "\xfe\xfd\xa1\x94\x42\x96\x1a\x59\xf6\xca\xf5\x79\x2b\x6e\x49\xfd" + "\x79\xb6\xf5\xa1\x15\x79\x2b\xd7\x2d\xcb\xcb\x66\x0b\xa4\xd9\x84" + "\x70\xfd\xbc\x9e\x6c\x26\xd6\xad\xc8\xcf\xb1\x2e\x5f\x9b\x97\x97" + "\xbd\x2a\xdf\x7a\xcf\x5d\x8b\xbf\xea\xff\x6f\x9b\x65\xa7\xf0\xf7" + "\x2a\x6c\xe8\xdc\x87\xf9\xaf\xbe\x35\x52\x5d\xc0\x0c\xe6\xd2\xbb" + "\x97\x98\x83\x0b\xac\x32\x3e\x12\x70\xa5\xe2\x70\x3d\x2f\x4e\xaf" + "\x93\x7c\x6a\xb7\xdc\x53\x70\x1d\x6e\x92\x67\x2b\xba\xa5\x4e\xc6" + "\xbf\x20\x59\xce\x29\xf7\xb4\xa8\x7c\x46\xf7\x2b\xe9\xde\x9c\xcf" + "\x5c\x6d\xb3\x68\x3f\xdc\x3d\x4d\xe4\xdb\xb6\x50\xa7\xe5\xd3\xf2" + "\xc8\xf7\x5d\x22\x76\x62\xa3\xf0\x85\xd9\x35\x17\xf0\xb9\xcc\xef" + "\x74\xdb\x3c\xfa\xbd\x99\xea\xfe\xfa\xa0\xb4\xd7\xeb\x66\xe4\x0f" + "\x8f\xff\xea\xca\x11\xb5\x9c\x4c\xd4\x37\x15\x79\x97\x60\x0c\x7a" + "\x55\xbb\xbe\x6b\xfa\xd4\x76\x49\xbb\xd3\xae\xff\x90\xf6\x1d\x6e" + "\x47\xc4\x79\x6c\x71\xa6\x9e\xd6\x46\x95\x27\xf5\xab\xe5\xd5\x6b" + "\x34\x01\xf9\x29\xfe\x8d\xeb\xd2\x69\xa1\x5b\xca\x3f\xe7\xf9\x39" + "\x51\xe1\xb4\xcd\xf2\x02\xe8\x43\xf2\x09\xd6\x55\x7b\x21\xbe\x8c" + "\x8f\xe0\x0f\x56\x2d\x5f\xbd\xd2\xbe\x2c\x7f\xc5\x83\x2b\x72\x57" + "\xe4\xaf\x17\xc7\xc0\x67\x8b\x7f\xff\x76\x5d\xd6\x92\x0b\x7d\x37" + "\xcf\x26\x1d\x8b\xea\xf3\xd5\x47\x36\x0d\x52\xcf\xd5\xfd\x74\xd0" + "\xc9\xae\xb9\xb4\x76\x77\x67\x0a\x7d\xb0\xf0\x3f\xd0\xbd\xd3\xa3" + "\xfb\xeb\x42\x75\xbf\x63\x48\x85\xbd\x78\x3f\x6c\xb2\x76\x5b\x67" + "\xb1\x79\x7d\xec\xc0\x7c\xda\xe7\x02\xfc\xac\xb4\x1e\x56\x6f\xa0" + "\x75\x0b\xa3\x10\xfc\xb6\x1a\x9f\xf5\x83\xdf\x11\x0c\x88\x27\x04" + "\x0c\x76\xf6\xb1\x0f\x66\x0a\x18\x7c\x69\xd9\x29\x7c\x0f\x7c\x69" + "\x79\x81\x70\x8b\xda\xac\xf0\xf4\x6d\x9c\xa7\x6f\x55\xbe\xcc\xd9" + "\xc6\xbf\xcc\xd9\x1a\xf6\x1b\xf7\xc1\x66\x7c\xdb\x8c\x6f\xcb\x29" + "\x0e\x4d\xf5\x29\xd6\x4c\xfb\xdf\xf4\x6c\xce\x4f\x64\x21\x53\xac" + "\x85\xda\xe3\x1e\x4c\x15\xfc\x76\x3f\xf2\xbb\x7d\xdf\x66\xe0\x25" + "\xad\xe2\x4c\xa3\xd8\xaf\x03\xbf\x87\xef\xdc\x68\x97\x7b\x70\x94" + "\x64\x62\x8b\x02\x9e\x0f\xfd\xdd\x8d\xf5\x33\x93\xca\xa5\x3e\x8b" + "\x73\xc5\x33\xb8\xc7\xef\xfc\xa0\xc9\xc3\xba\xec\x2a\x6f\x2a\xec" + "\x2d\x08\x06\xe7\x8f\xe7\x07\xc2\xa7\x03\x60\x7c\x05\x77\xed\xb3" + "\xc8\x31\xfd\x40\xf8\xba\x58\xd8\xcf\xbf\x0c\x9f\x67\xff\xe0\x24" + "\x9e\xc7\xf0\x53\xb8\xeb\xed\xb9\x11\xfb\xca\x78\xf7\xe1\x74\xc1" + "\xbb\xcd\xe0\x5e\xfb\x06\x8a\xdb\xfd\xe1\xb5\x12\x6f\xde\xfe\x57" + "\x6f\x71\x4e\x14\xbe\x09\xd1\xf9\x4b\x09\xcb\x0f\xbf\xe7\xde\x7c" + "\x4a\xb3\xd3\x40\xfd\x1f\x1e\x69\x7b\x28\xc8\x44\x1c\xe9\xfe\xa0" + "\xb0\xfb\x53\x7d\x0c\xe8\x14\x67\x37\xf9\xd9\x4b\x84\x6c\x47\x7b" + "\xd1\xc2\x47\xba\xdf\xf9\x61\xfe\xf8\x39\x31\x93\xe4\xf7\x88\xe7" + "\xa2\x18\x5b\x84\xfb\xc4\xbf\x51\x9b\x08\xf7\x51\x76\x13\xed\x51" + "\xcb\x39\xf0\x61\xf3\x3f\x37\x07\x3e\x14\xfa\x5f\x94\x95\xc6\xf5" + "\xc5\xfc\xe6\x4a\x96\x29\x6c\x08\x82\x3e\x3a\x37\x6b\xe0\xc6\x83" + "\xaa\xdf\xdd\x03\x57\x09\x3b\x93\x82\xa1\x26\x3a\x9b\xba\x7d\x94" + "\x99\x14\xd7\xc1\x00\xf1\xd9\xfb\x0b\x85\xed\x85\x11\xdf\x09\xdb" + "\x0c\xb2\xa5\x4b\x10\x71\xdb\x3e\x64\xdb\xcf\x32\x43\x3f\xfb\x68" + "\x36\xed\x05\x85\x61\xfd\x51\x29\xed\xfd\xf1\x8a\xbd\x2d\xe6\x42" + "\xbd\x8b\xca\x50\x46\x4e\xce\xd5\xbe\xa3\x18\xc1\xf4\x5d\x1f\xfb" + "\x28\x5b\x7c\x47\x79\xc9\xc7\x52\x51\xe2\x52\xf0\x59\x39\x94\x3f" + "\x88\xe7\x46\x25\x71\x31\xc7\x7a\x10\x2a\x08\xb6\xe0\xdd\x12\xa5" + "\x32\x2e\x11\x69\xe9\x62\x0f\x62\xcc\x42\x7b\x93\x8c\x1b\xfb\xad" + "\x6e\xcf\x17\x6d\xa2\x3d\x74\x96\x36\x1f\x6b\xa7\x90\x4b\x3e\x7a" + "\xad\xf1\xb8\x88\x27\x87\xf1\x3c\x20\x7d\x67\x9e\x62\xbb\x64\xfb" + "\x0e\xdc\x33\x5c\xf1\xbe\x77\x18\xb8\xe9\xd3\x1b\xd9\x5e\x4b\x80" + "\xd6\xec\xee\xbd\x96\x51\x8c\xcf\x81\x24\xd0\x3a\xab\xe4\x89\xe5" + "\x77\x1a\x4e\x46\x59\x12\x17\xe0\xfd\x1c\xcd\x1e\x49\xc3\x47\x0f" + "\xfb\xc8\x44\x70\x03\x1e\xf7\x74\xe5\x92\x6d\x99\xd2\x89\xba\x58" + "\xa8\x40\xe9\xa5\xbd\x71\xb2\xdb\x27\x79\x66\x91\x83\x0f\x93\x7c" + "\x46\x67\x9d\x68\x3f\x9c\xce\x70\x37\x40\xbe\xa5\xb2\x51\x6e\xa5" + "\x76\x96\xbb\x0a\x69\x54\x36\x9d\x67\xaa\x7e\x58\xcc\x35\xb2\xe1" + "\x34\x89\x3d\x81\xa8\x47\x8e\xdf\xeb\xe3\xc3\x74\x5e\xfe\x5e\x3b" + "\xae\x6a\x39\xe4\x67\x07\x65\x74\x6b\x65\x28\x64\xff\x9a\x27\xec" + "\xdc\x3c\xf2\x7b\x69\xff\x73\xaf\x4f\x11\xe7\x50\xe8\x7b\x69\x97" + "\xf3\xb1\x61\xdc\x86\x52\x9c\x0d\xf9\x38\x49\xf3\xc3\x83\x7b\xeb" + "\xf8\xd9\x36\xc0\x6a\xb8\x32\xd6\xe2\xc3\x1c\xf7\x55\x1a\x33\xf1" + "\x6e\x1e\x28\xcc\xce\x8b\xea\x28\xe8\xfc\xfe\x5a\xa6\x57\xe2\x0e" + "\xa5\x90\x6f\x06\x3a\xf3\x29\xed\xb6\x3f\x6e\x50\xfd\x34\x44\x9d" + "\x62\x1f\xff\x24\xbc\x37\x1e\x52\xf5\xba\x1f\xb7\x4b\xb9\xe2\xe3" + "\x76\xa1\xd7\xad\x8e\x65\xcf\x6d\x08\xe8\x5b\x36\x78\xf4\xd2\x96" + "\xf1\xe3\x56\x0f\x3b\x3c\x14\xb6\x65\xfc\xd8\x41\x65\x4d\xec\xcf" + "\xa2\x57\xb5\x31\x3d\x28\xce\xd7\x86\xe5\xf4\x83\x62\x9d\xa3\x7d" + "\x6c\x85\x78\xba\xb8\xc1\x34\xb2\x5b\x72\xdb\xcf\x90\x7e\x37\x46" + "\xea\x0c\x0e\xaa\x71\x84\x85\x9d\xe2\xe5\x27\xce\x7f\xbe\x8c\x9e" + "\x25\xcc\x0e\x2e\xd0\xf6\x8a\xaa\xf5\x8a\xc7\xac\x03\x79\x6a\x02" + "\xcd\xb3\xfb\x84\x7f\x00\x37\x78\x44\x8a\x8d\x6d\xcf\xa3\xb3\x80" + "\x07\x37\x92\xdf\x00\x39\xe7\x0e\x8a\x73\x49\x8a\xf3\x4e\x5e\x4c" + "\x72\x92\x97\x62\x75\x9c\x61\xc8\x37\x0d\xf9\x5e\x6c\x2f\x1c\x62" + "\xdc\x75\x70\x88\xe2\x44\xf6\xab\x75\x7b\x63\x7b\x03\x5f\x37\x31" + "\xc0\xff\xe0\x1e\x0f\x7b\x71\xfe\xa5\xd3\x83\x83\x7b\x2e\xc6\x33" + "\x4b\x1e\x2e\x8d\x4d\x26\x77\x93\x5e\xe5\x26\xd4\x7f\x0f\xa7\xf6" + "\x1f\x7a\x31\xa8\x0f\xb0\x31\xfd\x14\xfe\xad\x12\x07\x0b\x3a\xa7" + "\xf0\xd0\x06\x8c\xd7\xb0\x05\x72\x59\x27\xeb\x92\xb6\x30\xb4\x9f" + "\x6f\x2e\xf2\xf1\x33\xee\xe0\x6e\xd2\xeb\xd3\xd9\x68\xd0\xa3\x43" + "\x3b\xdc\xc1\xd7\x19\xd9\x27\x13\x1d\xe9\x63\x87\x84\x3f\xa6\x9b" + "\xec\x25\xec\xc6\x53\xe2\xfd\x42\xc9\xcf\x1d\xda\xa5\x5e\x1d\xe4" + "\x1f\x33\xb2\x4d\xff\xb6\x76\xd5\x72\x72\xb2\x7a\xe3\xc2\xec\x82" + "\xec\x5c\xeb\x7d\xe4\x82\xf5\x02\x5b\x43\x63\x38\xae\x58\x4f\x3e" + "\xad\x91\xc4\x53\x53\x7c\x31\x11\x5b\xcc\x39\x87\x8d\xc7\x15\x23" + "\xde\xfa\xff\x83\xd8\x62\x1a\xcf\x4c\x71\xc5\xc2\x7b\x32\x9f\xcc" + "\x19\x9f\x03\xca\x9b\x7e\x7a\x16\xeb\xb2\xf3\xd0\x6e\x9a\x47\x72" + "\xdd\xe8\x69\x8e\xf4\x61\x23\x78\xa6\xf2\x7e\xc8\x00\x3d\xed\xda" + "\x99\x4d\xe0\xa2\x09\xcf\x07\xc2\x67\x44\x7a\x3c\x80\x9b\xa0\x65" + "\x64\xbf\x80\x67\xaf\x66\xbb\xa0\xc6\x8c\x16\xb6\x16\x4a\xd9\x15" + "\xcd\x52\x5f\xd8\x73\xb6\x51\x99\x62\x94\x7b\x55\x9f\x24\x6b\x67" + "\x90\xe4\xdc\x7c\x53\x9d\x9b\x9f\xcc\xb9\x98\x7d\x49\x78\x6e\x7c" + "\x62\x0f\xcf\xeb\xcf\xb5\x6f\xed\x7f\xcf\x36\x45\x95\xdb\xa6\x9f" + "\x60\x7f\x7d\x9c\x74\x88\xf2\xcc\xf1\x5f\x85\x4f\x4a\xe9\x07\xe2" + "\xaf\x3f\x50\xef\x51\xc7\x5f\x6f\x51\xef\xaf\xc4\xfd\x4c\xf5\x7e" + "\x16\xee\x75\xea\x3d\xe6\xec\xa7\xc7\xd5\xfb\x24\xdc\x7f\xa0\xde" + "\x63\x4d\xf8\xf4\x35\xf5\x7e\x06\xee\x77\xa8\xf7\x33\x71\x5f\xae" + "\xde\x63\x0e\x7e\xfa\x28\x93\xfb\xfc\xc6\x01\xf6\xe9\xcf\x2e\x5d" + "\x8e\xfc\xd4\x26\xf7\x92\x3f\x85\xcc\xdd\x3d\x57\xae\x29\xe3\x69" + "\x85\x18\x9b\x4e\x0d\xbe\x48\xb7\x52\x3d\x48\xdf\xe2\x61\xed\x3b" + "\x23\xd2\x13\xd5\xfc\x58\xff\x3f\x5e\x10\x91\x6e\x50\xd3\xdb\x21" + "\xaf\x76\x84\xd3\x3f\x09\xa8\xe9\xbd\xc8\xdf\x1d\x91\x3e\xa4\xa6" + "\x83\x5e\xbe\xd1\x13\x91\xee\x91\xe9\x7f\x35\x69\x76\x35\x6a\xfa" + "\x01\x35\x3d\xc5\xc3\xfe\xe8\x8a\x48\xef\x50\xd3\x41\xff\x3f\x49" + "\x8b\x48\x17\x74\x45\xfa\x24\x36\xf3\xbd\x85\x34\xb7\xfe\x9a\xe9" + "\x61\x7b\x1c\x11\x79\x5a\xd4\x6f\x1d\x1e\xf6\x3f\x4d\x11\xe9\x3b" + "\xd5\xf4\x5a\x8f\x2e\x2e\x29\x22\xbd\x6e\x32\x5a\xa5\xab\x63\x99" + "\x93\xe9\xda\x49\x2e\x11\xf6\xc5\x82\x57\xee\xdd\x4f\x67\x9a\xcc" + "\x0d\xbc\xcf\x5a\xc4\x79\x1f\xeb\xdd\x2d\xed\x69\x0f\x0a\xdf\x96" + "\x74\x3e\xac\x9f\xf5\x36\xa8\xbe\x05\xbc\xe2\xcc\xd8\x06\x3a\x33" + "\xd6\x2b\x78\xc0\x9b\x1d\x25\xd2\x5f\xae\x16\x7b\x81\x74\x4e\xea" + "\x7e\x3c\xf2\xfc\x80\x74\xf0\x54\x0e\xe9\xa5\xdd\xf9\xa3\xd2\x97" + "\x32\x64\x53\x4a\x23\xdd\x0b\xc1\x23\x52\xc7\x24\xe9\x7e\xef\x7e" + "\x65\x94\xce\x65\x4a\xfd\x14\xcd\x45\xca\x4f\x36\x64\x91\x79\x3d" + "\xac\x57\xf8\xac\x8e\xb2\x4c\x7b\xd6\xef\xec\x6d\x0e\x9f\x87\xe9" + "\x35\xa8\xe9\x75\x48\x6f\x0f\xa7\xff\xd5\x3b\x29\x6d\x07\x1d\xe4" + "\xc6\xbd\x81\xb1\x11\xee\x0b\x8e\xf0\x40\xf5\x67\xd2\x96\x1c\xb4" + "\xee\xea\x90\xab\xdd\x48\xe7\x45\x28\x26\x63\xb0\x80\xd3\x7e\x26" + "\xc5\xae\x9c\x7a\xaf\xcf\x0b\x1e\xc3\xcf\xab\x1e\x24\x9b\xd4\xb3" + "\x8c\xf6\x4b\x8b\x87\x28\x5e\x96\x99\xd3\x39\xe4\x8d\x27\x99\x89" + "\xce\x93\x90\xcd\x39\xed\x65\xde\x93\xe3\x65\xfb\x73\x42\xac\x11" + "\x65\x37\x3c\xa8\xf1\x17\x87\xb3\xc2\x67\x5d\xf7\xd2\xfe\xf2\xd5" + "\xc5\x22\xf6\xec\x61\xe1\xab\xd7\x5c\x4a\xfb\xfc\xd6\x00\xff\x0b" + "\xf1\xbc\xc6\xc5\xe6\x52\x06\x9e\xe3\x70\x13\xee\xd3\xe4\x0f\xef" + "\x90\x3e\x59\x9f\xe4\x5c\x3e\x2c\xfd\xad\xb9\xda\x1d\x92\x5e\x1c" + "\xee\xe5\xbf\xa6\xf3\x13\x87\x3d\xf8\x36\xe0\x8d\x37\x4e\x78\xae" + "\x64\x63\x03\xd3\x8f\x55\x80\x37\x39\xd5\xaa\x97\xf4\xe9\xb3\x4e" + "\x45\x6f\x2c\x25\xfd\xb7\x88\x3f\x59\x71\x68\x4e\xf3\xaa\x80\x7e" + "\xff\x86\x7e\xf6\xd8\x4c\x66\x59\x1a\xd0\x53\x9e\x7b\x12\xf2\x51" + "\x37\x78\x12\xf0\xa9\xfa\xdf\xe3\xfd\x1b\xab\x5a\xf5\x41\xc1\xaf" + "\x7c\xd6\x29\x74\xa6\xae\x43\x46\x5a\x43\xdc\x3d\x21\xe2\xb1\x4d" + "\xe0\xb1\x03\xa0\xff\xc6\xd0\xba\x9c\xcb\x82\x6b\x72\xa6\x36\xe4" + "\x31\x53\x68\x8d\x2d\xe9\xa9\x11\x36\x57\x5b\x7f\x1a\x0a\xb0\xa6" + "\xf8\x2d\x71\x35\x58\x53\x48\x17\x93\xa0\x4b\x14\x7b\xc3\x74\xaf" + "\xe8\xdf\xea\x6f\x2c\xb8\x78\x0c\xdd\xd0\x3a\x9b\xf0\x97\x40\x6d" + "\x99\xa8\xaf\x95\x5b\x99\x21\xa4\x9e\xab\x2c\x3a\xc6\x66\x80\x2f" + "\xd6\x27\x9c\xe5\x6d\x27\x72\x99\x9e\xe2\x8f\x16\x65\x0b\x7d\x67" + "\xf4\xfe\x9c\x20\x73\x3b\x3e\x65\x45\x79\x34\x46\x9f\x5f\x4b\x7c" + "\x1a\xd9\x18\x23\x7f\xe2\x09\xf6\xf9\x2d\xe6\x00\xd6\x8c\x00\x78" + "\xed\x87\x49\xb6\xfd\xfc\x6e\xe9\x9f\xe1\x73\x17\x9d\x83\x6c\xcb" + "\xfb\x3e\xa5\x2d\x2b\x3e\x46\x63\x71\x70\x48\x9e\xbd\xfc\x7c\x1e" + "\x3d\x17\xd3\x39\xcf\xb8\xde\xe4\xdf\x8e\x06\xa2\xa5\x4e\xed\xf3" + "\x3b\xe4\xfa\x60\xf4\x4a\x99\xed\xf3\xaf\x9c\x51\x1b\xd7\xf5\xbb" + "\x3a\x2c\x9c\x62\x99\xd5\x13\xff\xca\x3d\x62\xdf\x9d\xce\xbc\x3b" + "\xee\x6c\xe3\x23\xb5\xaa\x0f\x1d\x8f\x4e\x29\xef\xb0\x48\x3f\x77" + "\x9f\x9f\x63\xd2\x66\x0e\x6b\x64\x87\x4d\xec\x39\x94\x77\xcc\x15" + "\x3a\xf8\xf2\x8e\x05\x9b\x66\x91\x8d\xbf\x87\x0d\xc7\x76\xa4\xa3" + "\xed\x07\x86\xe3\x3c\x93\x9f\x3b\x72\xed\x5b\x60\xbd\x9a\x25\xd1" + "\xde\x4f\x46\x48\xfa\x79\x94\x73\xf8\x08\xca\x16\xef\xae\xe9\xb3" + "\xb3\x28\x29\x1b\x7a\x7e\x78\x73\x3d\xb3\xa2\xad\xf1\xdc\xf8\x4e" + "\x40\xd8\x22\xba\x3a\x8c\xee\x21\x8a\xd3\x12\x62\x72\x8f\xee\x48" + "\x22\x8f\x7d\x27\xa0\xe6\xdf\xd1\x35\x84\x3e\x18\xdf\xe9\x70\x07" + "\x4e\xaa\x3c\xa1\xa7\x89\x97\xbf\xd3\xc1\x5d\xef\xa8\x71\xed\x3d" + "\xa7\x35\xba\x2a\x71\xd4\x73\x4c\xe2\xfa\xbe\x05\x12\x6e\x47\x12" + "\xd5\xf5\xea\x1a\xba\xc7\xda\x9d\x2a\x6d\x4a\x3c\xbd\x1a\x8f\xec" + "\x51\xf3\xd0\x37\xe8\x77\x9b\xa4\xb5\x1e\xa4\x7f\xbe\x45\xbe\xf7" + "\x34\x51\x1a\xfa\x87\x35\xcb\x33\x97\xfa\x35\x19\x6d\x15\xb0\x28" + "\x64\x51\x68\xf3\x20\xd9\x5f\x13\x9f\xe2\xf6\xdd\xd9\xe6\x16\x63" + "\xd0\xf7\x2c\xd9\xdb\x53\x3d\xe4\x13\x87\xe8\x26\xca\x14\x70\x0a" + "\xb7\xff\xc8\x46\xad\x2d\x54\x1f\xbd\x43\x5f\x3b\x84\xbc\x8c\x3e" + "\x53\x1e\x1a\xd7\x01\x3b\xe9\xe2\xce\x02\x66\x64\xd7\xd6\xb7\x8b" + "\x60\x22\x61\xd6\xb7\x59\x95\xd5\xd5\x71\xe8\x5b\x7f\x3e\x3c\xe4" + "\xb3\x62\x04\x6d\xc8\x23\xfb\xa6\xbe\x5d\x2a\xfc\xd4\x18\x03\x7d" + "\xc2\xb7\x82\xfa\x2e\x3e\xe2\xdb\xab\xc6\xf3\xa2\xdd\xc4\x1b\x91" + "\xad\x00\xed\x1d\x49\x7c\xed\x9b\x1b\xf1\xdd\xdc\x8c\xd3\xe0\x91" + "\xc1\x43\x6e\x7a\x46\xc4\x6c\x4b\xf5\x3b\xfb\x16\x86\xe1\x2d\xcb" + "\x99\xa0\x8e\xab\xb5\x3a\x90\xc7\xa4\xb5\x13\xe3\xa3\xae\xc1\x7d" + "\xb5\xe1\x31\x39\xd2\xa2\x7d\x47\x7a\x19\x3c\x2f\xa5\xf8\x87\x93" + "\xf8\x85\xd7\xb9\x93\x41\x83\x83\x77\xb6\x09\x7c\x64\x47\x8d\x64" + "\x3b\x0e\xb8\x0e\x4a\x1c\xea\x53\xf5\x46\x47\x8d\x54\x26\xed\xff" + "\xc9\x38\x21\x47\x31\x0b\x8e\x24\xcb\xfa\x8e\x26\xc9\x36\x1c\x85" + "\xfc\xe7\x31\x5d\x28\xd7\x7d\x7f\x59\x96\x75\xf1\x2d\xe2\xcc\xe8" + "\x8d\x6b\xed\x74\x1c\x34\x2b\xfc\x70\x3e\xcf\x9d\x18\xf6\xad\x75" + "\x34\x73\xdc\xb7\x96\xeb\xb0\xaa\x97\x3c\xda\xcc\x47\xf8\x16\x3a" + "\xcf\xc1\x0b\x78\x5d\x35\xc6\xb0\xf8\x2c\xbb\x82\xe2\xd0\x16\xd9" + "\xf9\x17\xe4\x77\x8d\x1b\x0f\x2d\x01\x0d\x4d\x2f\x3a\xcb\xa6\x90" + "\xad\x10\xd1\x1f\xd2\x67\xf1\xd8\x43\x64\x17\x98\x1e\x3e\x47\x36" + "\x40\x36\x5c\x85\xbc\x38\x9d\xe2\x87\xe7\x12\x3e\x90\xdd\xf8\x00" + "\x1b\x48\x47\xbe\x5c\xbc\xcb\xaf\x12\x3a\x82\x43\x2d\x21\x63\xaf" + "\xaf\xf8\x24\x8b\x11\x31\xbe\x1c\x01\x66\x7d\x98\xce\x1b\xf5\xc7" + "\xa3\xcc\x16\xa4\x27\x88\xf4\x40\x80\x7c\x05\xb4\xe0\x5d\x02\xde" + "\xfd\x00\x57\x05\x65\x38\xaa\xd1\xee\xa2\x93\xec\x6a\xb4\x65\x10" + "\xf5\xb4\xa0\x9d\x03\xc5\x2b\xd9\x8c\x2e\xfb\x20\xc9\x77\x28\xcf" + "\xc3\x54\x7f\x1a\x2d\xf8\xae\x01\xfd\x72\x90\xae\x03\xd7\xc2\x2a" + "\x5c\x8b\x42\x2c\xa1\x68\x23\xd6\xbd\x8d\xa8\x9f\xce\x65\xa2\x1c" + "\xf2\xa1\x21\xdb\x82\xbe\x91\x6e\x0c\xe5\x6e\x1c\xe2\x03\x28\x7b" + "\x70\xff\x10\xca\x73\xf4\x8c\x97\xa9\xf2\xd4\x98\xdf\x03\x3f\xe4" + "\x15\xa0\x1f\x23\xbc\x8e\xec\xa9\x91\x06\x9a\x3c\xb0\x30\xcc\x0f" + "\x0f\xdc\xa3\xde\xc7\x8e\xe7\x2d\x4e\x67\x45\xe7\x98\x45\xd8\x04" + "\xac\x8b\x02\x3d\x3e\xd6\x4b\xbe\x9a\xc2\xbe\x3b\x8f\x7d\x8c\x7c" + "\x16\x94\x59\xa9\x96\x49\x69\xdd\x61\xfe\xf9\x98\xc6\x33\xc7\x8d" + "\xe7\xfd\x4a\x99\x03\xeb\xa9\x4c\xe9\x57\xe9\xa8\x55\x9e\x49\x3e" + "\xb6\x74\xdc\x27\xc2\x08\x6f\xa1\x33\x77\x4a\x01\xdf\x4d\x3a\x09" + "\xd2\x85\x90\xfc\x42\xe7\xee\x32\xd6\xbb\x4a\x84\x3e\x62\x86\xd4" + "\x99\x4a\x9e\xe1\x58\xdd\xf8\x19\x81\x67\x44\x3c\x02\x79\xa6\x8e" + "\xce\xe9\xe5\x09\x7d\x8a\x7f\xd1\xfa\x75\xc5\xf4\x3d\x7d\x8b\xfc" + "\x1d\xe1\xb3\x4c\x03\x0e\xa9\xbb\x3b\x62\xa1\x7b\xaf\xd6\x2e\xe7" + "\xd1\x54\xa9\x7b\x3e\xe6\x1b\xd7\xbf\x15\xf0\x76\x1a\x27\x71\xc6" + "\x90\x6c\x00\x43\xcc\x95\x11\x74\x69\x67\x85\x87\xfc\xce\x01\x6b" + "\xc4\x59\xe1\x21\xd1\x86\x51\x71\x1e\x7f\xdd\xa2\xe0\x3a\x2e\xcf" + "\x90\x0e\xcc\x0f\xd7\xdd\xef\x55\xeb\x4e\xa4\x7b\xaf\xf4\x89\x45" + "\xb6\x81\x56\x69\xd7\x31\x60\xd7\x6c\x29\x30\xdf\x7a\x08\x3f\x27" + "\xf6\xdd\x3f\x50\x77\xbe\x7f\x9e\x2f\x72\xc8\x77\x38\xd2\x23\xce" + "\xff\x0e\xfc\xdd\xf3\xbf\xc5\x5e\x7e\x84\x70\xc8\x2e\xe2\xd0\x7e" + "\x01\x5a\xdb\xab\xc6\xcb\xfc\x42\xe8\x5c\xfa\xd8\x17\x36\x3c\x9b" + "\xe5\xbe\xc3\x17\x33\x55\x7a\x93\xb3\x28\x14\x34\x7b\x50\xa7\xf0" + "\xf7\x13\x7e\x4e\x24\xff\x05\xc8\xf7\x03\xe9\x37\xf8\x0b\xe3\x05" + "\xf9\xe9\x7d\xc9\x05\xcf\x69\x17\x3c\x5b\x7d\x98\x87\x93\xd9\x8c" + "\x54\xd1\x3e\xb3\xf1\x90\x31\xa1\x94\xd9\x8b\x8f\xb3\x28\xcc\x8f" + "\x63\xd4\xb6\xae\x41\x71\x9e\xcc\xcc\x9d\xa9\xcc\x3d\x18\x94\xbc" + "\x28\x78\x80\xbe\x14\xe4\x39\xce\x66\xd0\x79\x06\x8a\x0f\x80\xfc" + "\x27\x64\x4c\x80\xc1\xd3\x4b\xd7\xc6\x31\xe5\xe7\xe9\x53\xb9\xfe" + "\xc1\x56\xda\xb3\x7e\x65\xd4\x43\x7e\xf5\x75\x45\xcf\xb2\x64\x9a" + "\x7b\x98\x83\xfd\x5c\xbf\xbc\x15\xdf\x0c\x3d\x37\x3a\x18\xed\x0e" + "\x7e\xca\xec\xa0\x09\x27\xd8\x60\xbf\xa1\x90\x19\x6a\x06\x58\x22" + "\xf0\x2c\xb8\x37\x38\x97\x69\xe7\xef\xeb\x2f\x93\xe7\xba\xeb\x81" + "\x93\x6b\x2c\x3c\xe0\x77\x0e\xa6\x41\x56\x5b\xa2\xc9\xe4\x95\xd2" + "\xff\x96\x01\xf5\xbf\x22\x7c\x05\xc8\x35\x0f\xb0\x1d\xdc\x28\xcf" + "\x33\x26\x5d\x81\x6f\xf2\xc3\xfc\xfa\x71\xa6\xee\xe1\xa8\xe7\x03" + "\x8f\xb3\xbd\x59\x4c\xc4\x34\x1a\x16\xfe\xd1\x07\x9b\xc6\x6d\x6f" + "\x84\x9e\xeb\x38\xe8\xc1\x61\x8b\xe4\xe5\x0f\x5b\x32\x42\x46\x95" + "\x67\x38\x2e\xd6\x22\xfa\x16\xdf\x99\x65\xec\xb2\xc1\xde\x30\xae" + "\x0d\xee\xa4\x35\x02\x7d\x82\x8c\x37\x68\xa1\x7e\x11\x4c\x7c\xc2" + "\xd7\xd6\x60\xf2\xde\x9d\x93\xc4\xb6\x30\xb6\x3b\x82\x42\x67\x62" + "\x0c\x00\x9f\x4e\x62\x0c\x2e\x27\x7f\x43\x6e\xd4\xb3\xbf\x71\x94" + "\xed\xb7\x0c\xb3\x2e\xdc\x93\x8d\x7d\xdb\xc3\x47\x59\xbf\x75\xe2" + "\xf5\x09\x6b\x5c\x00\xbc\xb9\x91\xca\x22\xfa\x46\x76\x89\xee\x42" + "\x26\x76\x9a\xdc\xfd\x4c\x94\xb1\x5f\x19\x64\xfb\x1d\x47\x48\x0f" + "\x1b\xe8\x6a\xfc\x94\x75\x59\x3e\x12\xf5\x10\x0f\xd9\x96\x37\x7c" + "\x91\xb2\xdb\x01\x8f\x76\x9b\x5a\xf6\x10\xca\x4e\x9a\xbc\x6c\xe3" + "\xe2\x4b\x2b\xfb\x52\xda\x6d\x4c\xbb\x94\xb2\x8b\xeb\x78\x08\x6b" + "\x42\x3c\xf8\x64\xe1\xeb\x92\xce\x52\x86\x46\xc8\x4f\xc8\x35\x5c" + "\xda\x7a\x9f\xf8\x84\xe8\x8d\xb0\x43\x28\x3f\xe8\x13\xe7\x2c\x49" + "\x77\xac\x9e\xaf\x74\x07\x8f\x31\xd2\x25\xfb\x9d\x27\xda\xc7\xe5" + "\xab\xf0\x1e\x2c\xe8\xcf\x89\x41\x69\xd3\x7b\x50\xe5\xbb\x4e\x08" + "\x9b\x86\x89\xe5\xa8\x1e\x93\xb4\x0d\xff\xdb\xb5\x9a\xce\x66\x38" + "\xb6\xc7\xa4\x96\x65\xbd\x50\x17\xa8\x3a\x77\xb1\x66\x3b\xf2\xad" + "\xeb\xf2\x56\xe4\x67\x6b\x07\x81\xe3\xd8\x7d\xd9\xcb\xb3\x57\x14" + "\x64\x67\x59\x97\xac\xcd\x5b\x75\xe3\xea\x87\x1e\xb2\xde\x93\xbd" + "\x66\xcd\xb2\x9f\x67\xc7\xb1\x25\x79\xcb\x56\xad\x59\x41\xfa\x3a" + "\xab\x75\xfe\xad\x19\x39\xab\xf3\x6f\xfc\xee\xfc\xd4\x0b\xf4\x75" + "\x74\x2e\xb8\x97\xf8\x76\xac\x95\x33\xb0\x6e\x4e\x23\x5f\x31\xe6" + "\xf5\xbc\xed\x31\xc8\x8c\xc0\xc1\x13\xb4\xe6\x60\xee\x1e\x21\x79" + "\x82\x7c\xc5\x92\xff\xd9\x6d\xcf\xf0\xee\x01\x16\xfa\x04\xbc\x68" + "\x0f\xd2\xc8\xd7\x6b\x2f\xe4\x78\x2f\x8d\x01\xd2\xff\x80\x3c\xed" + "\x4f\x20\xcd\x1b\x7b\xd8\x52\xf3\x19\x33\xc8\x75\x73\x68\x0e\xd7" + "\x4f\xe1\x95\xe4\xb7\xf5\xa8\x85\xa9\xfe\xa0\xf5\x6e\x4f\x80\x6c" + "\x55\x8c\x8b\x82\xc5\x9c\x68\xaa\x9c\x5f\x43\x32\x46\x0a\xe4\x10" + "\x69\x33\x1f\x7a\x9a\xe4\x9e\x4d\x22\x96\xd6\x10\xe8\xff\x67\x3d" + "\x61\x5a\x7d\xb6\x50\xe5\x37\x89\x97\x5d\xd7\x87\x67\xe9\xff\x62" + "\xe8\x02\xff\x17\xa7\x16\x33\x76\xae\x55\xfe\xe8\x9b\x73\xed\xf2" + "\x47\xf7\x91\xbf\x90\x43\xfe\x2e\x4c\xff\xdf\xfe\xb4\xfa\xff\xd9" + "\xef\x47\xe6\x5c\xfc\xf7\x8f\xd4\x2f\xfa\xfd\xff\x63\xff\xff\x37" + "\xdf\x8f\xcc\xbb\xd8\x8f\xf0\x0d\xb8\xd5\xfb\xc4\x67\xcc\x08\xfc" + "\xdc\x52\xf5\x20\x70\xfa\x30\xb3\x14\x06\x79\x7f\xf1\xcf\x58\x72" + "\xd1\x71\xa6\x27\xfe\x2f\xdf\xc1\xfb\x8b\x46\x48\xd6\x1e\x89\x07" + "\xfe\xb6\x56\xf7\x31\x53\x55\x1f\x4b\xec\xca\x97\x31\x18\x68\x0f" + "\x85\xce\x13\xb9\xf1\xdc\x59\x10\x60\xef\x7b\x4f\x93\xed\x5e\x5b" + "\x57\x26\x68\x4f\x2f\x63\x84\xbf\xa6\x4c\x96\x54\x3f\x83\xef\xe1" + "\xce\xa7\x96\x70\xfd\x53\xf3\x91\x76\xe0\x55\x25\x2d\xfa\xd5\x0d" + "\x1d\xd1\xd6\x07\x69\x9d\x3f\x75\x56\xc5\xcd\x8d\xf2\xbc\xdc\x59" + "\x21\x83\xa9\xfe\x7a\xb1\x3e\x9d\x3d\x27\xd7\xf4\xb3\xef\xaa\x3a" + "\x2a\xba\x17\x3a\x57\xf4\xa3\x95\x3b\x1f\x6c\xa5\x32\x7f\xab\xb4" + "\x46\xd3\x9a\xf9\xea\x86\xb4\xe8\xc2\x65\x4c\xdf\xe5\x39\xc1\xf6" + "\x82\x16\xd2\xbe\x2d\xe6\x5d\x33\xe6\x59\x4b\xc3\x0c\x5e\x8b\xf6" + "\x55\x82\x9f\x73\xa1\x4d\xbb\xfc\xce\x2f\xb3\xb0\x6e\x2d\x51\x79" + "\xb9\x36\xcc\x8b\xe6\x2a\xe4\x59\xb4\x96\x5d\x53\x85\x7c\xe0\xed" + "\x5c\xc4\x77\xcb\xf6\x0d\xff\x0c\x30\xd8\x8d\x3a\xbb\xad\x0f\xd0" + "\xf3\x69\xc1\x63\x50\xdd\xe8\x87\xb5\x8f\x79\x85\x3f\x1c\xaa\x43" + "\xab\x17\xe5\x83\xfe\x9d\x30\xa9\xfb\x66\xb5\xb2\x9c\x2f\x25\x1f" + "\xe6\x3a\x54\x48\x71\xe1\xd4\xf3\x48\x85\x55\x1b\xb0\xae\x8f\x32" + "\x23\xea\xd8\x82\x3a\xda\xcc\xa5\x8c\x9b\xe9\x2c\x6b\x6f\x10\xbc" + "\xba\xa2\xda\x89\x7a\x3f\x56\xbf\x15\x7c\x88\xe0\x3d\x42\xcc\x2c" + "\x75\x0e\xe0\x3f\x72\x40\x27\xc0\x73\x88\x73\x00\xe0\x37\x28\x1d" + "\x75\x6c\x41\xbf\xba\x21\x0b\xee\xc6\xda\xdd\x42\xbc\xc2\x03\x67" + "\xff\x83\x89\x98\xd8\xe0\x17\xd6\x38\x78\x40\xc6\xc8\xf2\xda\x35" + "\x7e\x81\xf0\x83\x78\x84\xaa\x07\x98\x61\x0c\x63\x0c\x1c\xe9\x00" + "\xff\x01\xde\xdb\xdb\xac\x8e\x4d\x87\xe0\x0b\xd4\xd8\xa0\x92\x86" + "\x7b\x5f\xc3\xfa\x6e\x42\x1d\xe0\x77\x43\x9a\x2f\x25\xd0\x20\x6f" + "\x87\xb6\xd6\xcb\xf8\xd6\xde\x66\x0e\x5a\x07\xb8\xed\x9e\x9d\xa9" + "\x83\x8c\xe7\x4d\xc4\x58\xec\xa6\xbc\xe4\xeb\x01\xf9\x03\xe0\xc7" + "\x1c\xea\x98\xf4\x56\x15\x10\x1f\xe0\x2d\xa1\x76\xe0\x9b\x4e\xc0" + "\x9a\xc6\x42\x8d\x1b\x08\xd8\x0b\x1e\x66\x78\xa6\x06\x7b\x8c\xf5" + "\xe6\x30\xfc\x4f\xcf\x8f\x84\x3f\x60\xb1\x59\x8e\xc1\x99\x7d\x11" + "\x63\x07\x59\xeb\x4c\x3d\xe9\x56\x51\xdf\x1e\xa9\x17\x3a\xbd\x91" + "\xfc\x71\x01\x67\xf6\x00\x16\x7b\x90\xaf\x95\x68\xf3\xa6\xcf\x40" + "\x73\x1f\x24\x1e\xea\xcc\xe3\x92\x47\x3d\x93\x42\x38\x8c\x67\x21" + "\x47\xf7\x33\xef\x66\x2a\x0f\xb8\x71\x16\x57\xf0\xb2\xa7\x4f\x16" + "\xd7\x53\xcc\xca\x43\x1d\xe4\x2f\x4b\x1d\xeb\x0e\xb4\x6b\xdc\xff" + "\x11\xe1\x00\x8d\x3d\xfa\xb8\x59\xca\xde\xa7\x7b\x49\x7f\x26\xbe" + "\x1b\xcb\xa1\x36\xf6\xd2\xfc\xd4\xde\x23\x7d\x90\xfc\x98\x46\xc0" + "\x66\xb3\x3a\x26\xad\x32\xfe\xdb\x99\x8d\x6a\xdb\xd2\xf1\x6c\x44" + "\x1b\x84\x4e\x65\x78\x2c\x27\xaa\x86\xbe\x29\x0a\x7f\x43\xf3\x07" + "\xb8\x6c\xc6\x37\x6b\x71\xe5\x5a\x5e\xf2\x41\x8e\x76\x04\x9f\x12" + "\xfe\xa4\xce\x24\x0d\x8f\xd9\xf4\xa8\x37\x80\x7a\xf5\x84\x1b\x84" + "\x17\x5a\x19\x35\x12\x46\xcd\x18\x3f\x81\x5f\x7b\x83\xad\x80\xfb" + "\x19\xf0\xff\x7f\x6d\x93\xfc\xdd\xe9\xa0\xda\xbe\x36\x19\x97\xe0" + "\x6f\xb3\x1b\xa5\xef\x17\xca\x37\x1e\xff\x26\xcc\x67\x9e\x16\x7e" + "\xa2\x50\x56\xa7\x8a\x13\x66\xbf\x73\xd8\x34\x8e\x43\xe2\x5c\xfd" + "\x99\x4a\xe2\x35\xd5\xf6\x13\xee\x3d\xae\xc2\x6e\x36\xe1\x80\x0f" + "\xfc\xa7\x1c\x67\xef\x66\xe2\x55\x25\x1e\x0e\x2f\xd6\xca\x90\x67" + "\xf3\x4f\xf7\x2a\x28\x43\xc3\x95\x48\xda\x80\xbc\x85\xa0\x0b\xe3" + "\x78\xa3\xd1\x02\x59\xa6\xef\x0f\xaa\x6e\x30\x80\xb1\x21\xdf\xd7" + "\x6d\xc2\x37\x91\xc0\x4b\x9f\x6b\xaf\x2f\xc8\x9e\x20\xbc\x7c\x80" + "\x68\xc2\xf0\xb1\xe1\xb8\x23\xd6\x30\x6e\x0f\x1f\xd0\x70\x3b\x62" + "\x5c\x05\x6e\x6f\x16\xf4\x68\x18\x7c\xf4\xcd\xda\xde\x71\x2f\xcd" + "\x73\x05\xf3\xba\xa6\x40\xe8\xbc\xcd\xa4\xe3\x12\xf3\x3e\x30\x24" + "\x64\x0c\x1a\xcf\x2e\x47\xbf\xf0\x37\xbe\x49\x61\xc6\x2e\xdf\x31" + "\x92\xf9\x4f\xd0\xfc\xd7\xe6\x38\x8d\x0d\xea\x6a\x23\x9f\xf0\x9b" + "\x41\x03\x69\x0e\xfa\xd0\x26\x8a\x83\x4e\x7e\xba\xda\x97\xa6\xb1" + "\x35\x18\xdb\xbd\x99\x34\x6e\xbe\x7c\xcd\xb6\xbf\x46\xd2\x00\x93" + "\x8a\x2f\xa2\x8d\x17\xc0\xd5\x2c\xe1\xea\xdb\x75\xfe\xfc\x3e\xb3" + "\x80\xe6\x77\x24\x5c\x09\xa6\x04\x5b\xe4\x45\xff\x8f\xb7\x68\x70" + "\x0d\xc3\xf4\xec\xdd\x2a\x3e\xaa\xb4\xf5\xec\x84\xb4\xb5\x46\xfa" + "\xdf\x6f\xdd\x44\x7d\xc1\x9a\x42\xf5\x8b\xf8\x32\xaa\xec\xd3\xee" + "\x25\x9c\x3a\x3b\xd7\xc3\xb2\x16\x68\x74\x0c\xed\xa9\x25\x7c\xa2" + "\xb1\xd2\x68\x07\xe9\x7f\x64\xdb\xcf\x66\x69\xe3\x41\xed\x8e\xa4" + "\x09\x68\xc3\xef\xe8\x39\xdc\xe7\xb3\x4f\xe3\xbb\xcb\x88\xb6\x85" + "\xf9\xab\xb3\x3b\xcf\xef\xfb\xd9\x4a\xea\x3b\xe1\x84\xbd\x80\x74" + "\x40\x72\x2d\xf3\xb0\x2f\x2d\xe7\xd3\xab\x2f\xe3\xa5\xad\x81\xe4" + "\xc7\x88\xde\xdb\x1f\x90\xf9\x69\x7d\x43\x7e\xa1\x13\x55\xd7\xc3" + "\x42\x5a\xff\x90\x66\x50\x61\xd0\x8b\xfc\xed\x74\x5e\x98\x7c\xc6" + "\x4c\xed\x95\xb2\x20\x68\xf4\x1e\x8a\x43\xe0\x61\xa7\xda\xbb\x50" + "\x6a\x30\x86\xb1\x7a\x95\xdf\x24\x3a\xc1\xd7\xa5\x4f\x5d\x37\xc8" + "\x62\xed\xdf\xe5\x47\xb1\x9e\xbf\x85\x79\x14\x20\x1f\x86\x28\xdb" + "\x3a\xc0\xce\xed\x40\xbd\x49\xea\xd5\x82\x6b\x39\xae\x33\x71\x7d" + "\x14\xd7\x2b\x71\xfd\x09\xf2\x2b\x6a\xfe\x54\x3c\x7f\x0f\xe9\xb7" + "\xaa\x57\xb4\x71\xa4\x15\xd7\xc5\x4f\x10\x5f\xf9\x80\x48\x9f\x4e" + "\xcf\xb8\x46\xab\xfd\xee\x94\x73\x7b\xe4\x18\xca\x71\x50\x3e\x5a" + "\xd7\x90\x66\x1f\x60\x81\x77\xa9\x6c\x3a\xbf\x8f\xfb\x8d\x11\xfc" + "\x29\xca\xf1\xbf\x88\xeb\x1c\x5c\x57\xe2\x9a\x8f\xeb\x2d\x54\x2e" + "\x60\xd0\x1d\xa6\x17\xde\xcd\x59\x0e\x39\x9e\x1e\x36\x4c\x32\x66" + "\x92\x46\x0f\x08\x9f\xce\xcb\xb7\x54\xe6\x93\xf2\xab\x3f\x53\x1b" + "\xbb\xa0\xc4\xdb\xa4\x20\xc6\x0e\xe5\x7f\x8f\xbe\xc7\xf5\x2e\xf5" + "\x9a\xa6\x5e\xef\x56\xaf\xff\xae\x5e\xe7\xab\xd7\x05\x1e\xe6\x4f" + "\x55\x79\x13\xc0\xcc\x9f\x4a\x30\xc1\xdc\x4d\x95\xf5\x06\xb2\x48" + "\xbe\x06\xfd\xbf\x6d\x98\x62\x8a\x39\xfd\x3d\x9a\x2e\x96\x74\x3f" + "\x63\xce\xbf\xfd\xfb\x36\xa1\xfb\xf1\x7b\xc3\xb4\xb0\x77\xd0\xa4" + "\x4b\x63\xe0\x9d\x62\xea\xf5\xe0\x1b\x64\x39\x0b\xf4\xea\x1e\x34" + "\xc5\xd6\xa0\x58\x69\xe4\x3b\x4e\xc8\x51\xf1\x56\xda\xcb\xeb\x15" + "\x7a\xea\x72\xf2\x85\xd3\x3b\x84\x5f\xc0\x1b\xdb\x1b\xd4\xe8\x3d" + "\xc9\x4b\xaa\x8f\xc8\x37\xfc\xce\xc0\xd2\xb0\x9c\x1f\x30\xc9\xfd" + "\xba\x2b\xae\x45\x7a\x84\xfc\xef\xa7\x35\xeb\x36\xc0\xba\x07\xfd" + "\x99\xd3\xc7\x02\xf5\xb8\x7e\xbb\x5f\xf6\x39\x55\xeb\xb3\x3a\x56" + "\x76\x0d\xe6\xfd\xcc\x3f\x17\xf4\x30\x8f\xf0\xbb\x6f\x9c\x2e\xfb" + "\x85\x7e\x5a\xc5\x1f\x8c\xf3\xc8\x71\x1a\xef\x08\x7a\x52\x18\xa6" + "\xd3\x81\xc0\xf9\xe3\xe2\x0d\x04\x25\xbf\xd0\x83\x79\x09\x1c\x18" + "\x69\xbb\x60\x5e\x56\xd2\xbc\x94\xdf\x9e\x9b\x73\x3e\x8d\x3f\x5b" + "\x49\x34\x5e\x6d\x23\xf0\x76\xa4\x89\xc6\xc6\xc3\xce\x25\xa9\x6b" + "\x52\x0f\xd6\xc8\xdb\x90\xee\x92\xed\x94\xe9\x6a\x5d\xc0\xbf\x11" + "\xf2\x3d\x71\xa5\x96\xae\xe2\x37\x95\xe3\xa0\xb1\xd6\xd2\xd5\xf2" + "\x81\xa7\x23\x76\x9a\x3f\x5a\xba\x8a\x93\x1d\x44\x6f\xe8\xdb\xa0" + "\xb0\xbb\x83\xfc\xfd\x40\x3b\xda\x7d\x8e\x74\x8a\x4d\x34\x9f\x37" + "\x6d\x60\xa6\x75\x75\x2c\x5e\xce\xcd\xd1\xe9\xda\xb7\x52\x4f\x3d" + "\x6a\xd4\x68\x54\x8d\xa0\x67\xbe\xc2\xf3\x69\x65\xf0\x79\xee\x34" + "\x07\x83\xc6\xde\xfe\xfd\xc1\x39\x82\xe6\x62\xde\xd7\xe3\xbb\x34" + "\x0f\x7b\x8a\xa9\x6b\x49\xa7\xdc\x27\x18\x5d\xbb\xbf\x49\xd2\x2e" + "\xb5\xec\x71\xfa\x17\xc1\x87\x08\x5a\x4f\x75\x51\x59\x58\x57\x12" + "\x7d\xc5\xe9\x53\x25\xfd\x1e\xdd\xe2\x61\x53\x53\x34\xda\x4a\xeb" + "\x93\x59\xc7\xec\xd5\x0f\xc8\xf5\x49\x21\x1d\x98\xdd\x27\x7c\x7f" + "\x75\xd9\x87\x18\xad\x9b\xe4\x93\x39\x63\x7d\x1c\xf9\x46\x4a\x47" + "\x5b\xcb\xc1\x9f\xed\x54\xf7\x1b\x20\xe7\x06\xbf\x43\xb2\xac\x0a" + "\x57\xcc\xa7\xe0\x55\xea\xb8\xf4\xa2\x3d\x3b\x89\xb6\x6f\x2a\x90" + "\xf1\x69\x48\x1f\x24\xe2\x19\x11\xcf\x6a\xe1\x01\xe9\x5f\x7e\x2c" + "\x25\x42\xc7\xd5\x24\xe7\xc9\x68\xac\x88\x0d\xe0\xea\xed\x97\xfa" + "\xc4\xb1\xdf\xc9\xf4\x31\xd5\x57\x55\xaf\x6a\x57\x39\x56\x12\x65" + "\x99\xf1\x0b\xa9\x17\xfe\xdb\x83\x92\x1f\x19\xcb\x8f\xb0\x63\x11" + "\xb0\x96\xbe\x67\xc7\x2a\xc3\xf3\x62\x2c\x93\xbe\xc1\xb7\x5b\x91" + "\x3e\xee\xff\x4b\xae\x35\x5e\xa9\xdf\x45\x1d\x53\x4b\xd3\x18\x68" + "\x73\xcc\x36\xa7\x36\x7f\x83\xc2\x3f\xa1\x36\x7f\xa9\x8f\x84\x0f" + "\x34\x87\x83\xe4\xbf\x0a\x73\x98\xe6\x32\xee\x87\x82\xda\xdc\x95" + "\xfc\x5d\xa1\x98\xbb\x62\xde\x06\x93\x22\xda\xd1\xa9\xe2\x6a\xef" + "\xf0\x72\x8b\x09\xef\x30\x27\x4f\xa8\xfe\x81\x46\xa5\x8c\x51\xbe" + "\x6f\x81\x32\xc2\x03\xa4\x9b\x26\x7d\x02\xe9\x6c\x54\xdb\x4a\xd2" + "\xff\xfb\xc8\x27\x57\x2d\xe6\x43\xd8\x0f\x57\x22\xd3\xfc\x70\xa1" + "\xbc\x92\xb0\xee\x78\xd4\xa3\xf6\xab\x1f\xf5\xd5\xb7\x15\xfd\x85" + "\xe0\xfc\x81\x9c\x63\xa3\xdd\x84\xc7\x6e\xe0\x1e\xd6\x9f\x3a\x8a" + "\x77\x8e\x6f\xf7\x68\xb8\x87\x39\x9a\x35\xc0\x42\xf7\x6c\x99\xc1" + "\xeb\x30\xa6\x64\x1f\x9e\x8b\xe7\xef\xe0\x9a\x25\xaf\xba\x44\xba" + "\xaa\x38\x5f\x87\x6f\x31\xff\xe3\x3a\xb4\x31\xf0\xc5\x1b\xed\x02" + "\xc7\x8a\xc8\x66\x2f\x55\xec\x5f\x13\x8e\x11\x7e\x89\x7d\x6c\xe0" + "\x9a\xb9\xf4\x3f\x18\xe1\x99\xf0\xcd\x81\x67\x6a\x2f\xe1\x99\xdf" + "\x19\x9a\xaf\xf9\xa1\xf5\xb0\xe0\xa0\xdc\x43\x0a\xa5\x6b\x36\xcb" + "\x84\x87\xf9\xd7\xb2\xe9\x28\xdf\xda\x6e\xf5\x91\xee\xfc\x73\x77" + "\xf0\x6e\x46\x79\x09\x76\x92\x5e\x5e\x91\x8f\x6f\x22\xc6\xdf\x2b" + "\x6c\x58\xf6\x2e\x15\xfa\xcc\xcb\xf1\x6e\xd7\xf9\x34\x67\x68\x8e" + "\xe0\x2b\xb1\x3e\x7f\x3d\x89\x59\x81\xb7\x58\x6b\x42\x9d\x1a\x3f" + "\x7c\x73\x12\xd9\x10\xfc\x4d\xc4\x0a\x27\x9e\x04\xf7\x9d\xb4\x4e" + "\x4f\xa2\x77\x9e\x43\xba\x22\xa2\x19\xa4\x7b\x22\x3d\x18\x60\x7d" + "\x60\x40\xa7\xbb\x67\x3f\xf9\xc9\x59\xfd\x55\x5f\xc4\x45\x0e\x7e" + "\x96\xfc\x36\x59\xf3\xd8\xe5\x7d\x3a\x5d\x2a\xe9\x9d\x8a\x4f\x93" + "\x8e\x47\x59\x72\xbe\x8e\x47\xd9\xa9\xfe\x5a\x51\x52\x72\xc4\xaf" + "\x59\xbd\xda\xfe\xce\xaf\x5d\xcd\xdb\x8d\x5f\xaf\x0a\xab\xdd\x7e" + "\xa7\xd2\xaa\xc1\x8a\x68\x0a\xd1\x58\xb2\x1d\xa1\x79\xae\x0b\x32" + "\xf2\xcb\x83\x71\x42\xbb\x37\xdd\x70\x5f\xdb\x06\x92\x69\x15\x61" + "\x03\x45\x3e\x65\x2f\xcd\x7e\x49\x11\xe3\x29\x7d\x7e\x2a\xcd\xa8" + "\xbb\xbd\xe6\x14\x33\xd8\xf3\xd8\x55\xa4\x43\x37\x87\x78\x1b\xc9" + "\xc0\x66\x19\x9f\xbd\xfb\x04\xe3\xaf\xe4\x6f\x64\x7a\xbc\xbf\x06" + "\xf7\xf5\x1a\x2f\x85\x6f\x12\xa3\x02\x2c\x89\x78\xa8\xbb\x36\xb2" + "\x6b\xfc\x4e\xee\xd0\xc6\x8a\xf8\x0c\xd2\xe3\x85\x63\x07\x29\xc2" + "\x2e\x8b\xfc\xab\x7b\x04\xdc\x54\x5a\x75\x8a\x74\xd7\x3c\x2b\xca" + "\xc7\x12\xe5\x3a\xc4\x81\xff\x7f\x2b\x94\xf8\xc2\x4b\x80\xfb\x07" + "\x22\xda\x39\x12\xbe\xb7\xfc\x0b\x7d\x6f\xf6\x11\x0f\x37\x09\x7c" + "\x74\x2c\x56\x83\x0f\xd9\xc8\x9b\xc1\xff\x8b\xf1\x0e\xf2\x21\xb4" + "\xad\xd3\xbe\x81\x19\x4f\xe8\xd8\x39\xf4\x91\xce\xa0\x76\x08\x1d" + "\xbf\x8e\x9d\xd4\xe4\x74\xd1\x6e\x1d\x7b\xcd\x5c\x1a\xc5\x48\x37" + "\x4f\xbe\x09\x85\x7d\x21\x58\x52\xe2\xe1\xdd\xc1\x79\xac\xad\xe8" + "\x76\xca\xf3\xb8\xba\x96\xf5\x0e\x17\x5b\xd8\x5e\xcb\x3c\xe6\x2f" + "\x63\x9b\x31\x57\x76\x5f\xb2\x1d\xa7\x8e\x69\xfb\xe0\x9d\xc2\xfe" + "\x41\xc7\xee\xa7\xb5\x84\x74\x03\x58\x47\xda\x69\xbd\x46\xd9\x1e" + "\x6d\xde\x60\x9d\x68\xc7\x37\x4b\x24\x8d\xd9\xdb\x81\xfb\xc5\xe4" + "\x1f\x45\xc8\x0f\x32\xbf\x49\xec\x1b\x94\xe9\x92\xc6\xf9\x6d\xe4" + "\xa3\xef\x84\x5d\x9c\x8e\x7c\x0d\xe9\x18\xbe\xb3\x51\xdf\x24\x2e" + "\x5a\xe6\x21\xff\xfc\xf0\xbc\xe5\x25\x62\xde\x0e\x45\xcc\xcb\x32" + "\x5d\x56\x58\x4e\x55\x2c\x37\x6e\x61\xd6\x89\xe6\xa1\x3d\x81\x25" + "\xfe\xcd\xc8\x7e\x54\x53\xc3\x9b\x6a\xf5\xca\xf7\x37\x55\x33\x93" + "\xae\x12\x60\xa3\x79\x56\x90\x39\x1d\xf3\xf1\x98\xd9\x74\xc5\xe2" + "\xbb\xf2\xa7\xf0\x22\x0b\xd3\x57\x9d\x99\x62\xbc\x36\x70\x45\x13" + "\x8f\xba\xe1\xbe\x7b\xf2\x69\x3f\xb7\x96\x7d\x91\xcb\xa2\xee\x0a" + "\xa1\x6e\x13\xb3\x7b\x74\x51\x5e\x3a\x4f\xbd\x17\x9c\x17\xdd\x53" + "\x99\x85\xf5\xcc\x58\xd8\xcf\x07\x2b\x1f\x8a\x36\x62\xfd\x4d\xc4" + "\xba\xe1\x9a\x6a\xba\xa2\x69\x0c\x65\xbc\x95\x29\xbe\x6b\xb9\xf4" + "\xb6\xd9\x67\x0c\xe8\xf4\xa5\x97\xd6\xb6\xe8\xd4\x70\xdb\xa2\x53" + "\xff\x2f\xb7\x2d\x31\xdc\xb6\x1c\xb4\x2d\xea\xaa\x4b\x6b\x5b\x8c" + "\x3d\xdc\xb6\x18\xfb\x3f\xd8\xb6\xe6\x4b\x6f\x9b\xe3\x0a\xb4\xed" + "\xb5\x4b\x6b\xdb\x94\x96\x70\xdb\xa6\xb4\xfc\x6f\xda\x56\x54\xcf" + "\x8f\x75\x81\x02\x93\x3e\x87\xe8\xfc\x80\xce\xf0\xfa\xc6\x64\x61" + "\x9b\x7c\x19\xee\x1f\x2d\xae\xe7\x47\x05\x6f\xa3\x33\x08\xdd\xbf" + "\xbf\xcc\x30\x1b\x72\xa9\x8c\x03\xa4\x8b\x4e\x16\xb6\x1b\x51\xb3" + "\x76\x71\x27\x0f\xde\xe4\x23\x3b\xb8\x20\xf9\x10\x21\xff\xdc\xd6" + "\x57\x47\x02\x7a\x1e\x77\x38\x75\xfb\x19\x03\x7b\x75\xc4\xab\xc7" + "\xb7\x39\x9a\xdf\x50\xed\x5b\x73\xdd\xc5\xe8\x91\xa1\xe1\xae\x1c" + "\x66\x26\x7a\x44\x57\x8a\x4d\x58\x53\x34\xc5\x78\xd7\x69\xac\xfb" + "\x65\x86\xdd\xda\xb9\x50\xad\xac\x45\x83\x53\xb8\xb9\x90\x45\xd1" + "\xd9\x54\xe1\x63\xd0\xe2\x65\x29\x85\x2c\x7a\x91\x03\xe5\x07\x58" + "\xa6\xd9\x81\xb2\x01\x0f\xc1\xcb\xeb\x0c\xe7\xa2\x72\x99\x69\x0b" + "\xca\xa6\xeb\x5d\x96\x62\xbe\xe9\x59\x66\xa0\x33\xac\x74\x16\x55" + "\x9e\x43\x8d\x31\xfa\xcb\xa2\x93\xb5\x7a\xfe\x0e\xfc\x12\x24\xfc" + "\xa2\x43\x61\xf8\x45\xff\x2e\x0c\xbf\xe8\xb5\x12\x7e\xd1\xb9\x61" + "\xf8\xc5\x2c\xbd\x34\xf8\x45\xef\x0a\xc3\x4f\x7e\x7b\x71\xf8\x45" + "\x1f\x9e\x1c\x7e\xd1\xbe\x30\xfc\x64\x59\x93\xc0\x2f\x66\x62\xf8" + "\xc5\x7c\xe7\x1f\x83\x5f\xcc\xd2\x7f\x10\x7e\xf1\x12\x7e\x53\xee" + "\x08\xc3\x2f\xe6\x74\x18\x7e\x31\x7f\x90\xf0\x8b\x69\x0e\xc3\x6f" + "\x4a\xfd\xa5\xc1\x2f\x66\x30\x0c\x3f\xf9\xed\xc5\xe1\x37\xe5\xaa" + "\xc9\xe1\x37\x65\x4e\x18\x7e\xb2\xac\x4b\x83\xdf\x94\xf5\x80\x5b" + "\xa2\x0a\xbf\xc4\xc9\xe1\x37\xa5\xfe\x1f\x84\x9f\x59\xc2\xcf\xb8" + "\x31\x0c\x3f\xe3\x2d\x61\xf8\x4d\x39\x2b\xe1\x37\x65\x28\x0c\x3f" + "\x63\xef\xa5\xc1\xcf\x68\x0b\xc3\x4f\x7e\x7b\x71\xf8\x19\x7f\x36" + "\x39\xfc\x8c\xf9\x61\xf8\xc9\xb2\x26\x81\xdf\x94\x89\xe1\x67\x7c" + "\xed\x1f\x83\x9f\xb1\xf7\x62\xf0\xbb\x34\x5e\xc3\x38\xa9\x5d\xf1" + "\xa5\x95\x13\x3b\x77\xb2\x72\x08\x86\x64\x73\xa7\x94\xc5\xce\x6d" + "\x54\x62\x8c\xf2\x5c\x82\x91\x62\x9f\xdd\xd9\xa7\x8b\x7d\xbc\x51" + "\x89\x36\x72\xe7\x3b\x2d\x8a\xf3\xdd\x74\x5e\x1a\x63\x50\x4a\xa7" + "\x18\xe8\xdc\xfc\xa4\xb1\x8e\x75\xb1\xc7\xa2\x66\xb2\xab\xe9\x6c" + "\xd9\x26\xf0\x6b\x74\xef\x2f\x8b\xf5\x82\x17\xf9\x8a\x1f\xee\xac" + "\x15\x6b\x44\xe0\xc4\xbc\xec\xac\xb5\xab\xb2\x96\xad\xca\xb7\x2e" + "\x5b\xfe\xc8\x9a\xf3\xfd\x9a\x8b\x98\x83\x9b\x69\xfc\xe2\xe6\x8c" + "\xfb\x32\x01\x1f\x4b\x3e\xe1\xec\x5f\x63\xb1\x27\x74\x71\xf9\xc2" + "\xd7\x7c\xdc\xe1\x7a\x3e\x96\xbe\x35\xed\xeb\xfc\x4d\xe1\xeb\x6e" + "\x2c\x67\x2b\xe4\xa9\xa5\xe4\xbf\x44\xdd\x9b\x58\x3a\xa0\x33\x55" + "\xf1\xd8\x23\xb4\x17\xe6\x13\xe7\x15\x74\x71\xc2\x3f\x22\xf9\x35" + "\xe1\xc6\x43\xbb\x15\xd7\x91\x36\x5e\x7e\xa4\x95\x60\xd0\x45\x7e" + "\xc6\x0a\xa2\xae\xe9\xd3\x25\x2c\xe6\xb1\x87\x76\xa3\xac\x56\xb5" + "\x1c\x8a\xed\xe9\x4b\xdb\xc0\x3f\xa7\xf2\x54\x5e\x90\x62\x49\xb4" + "\x49\x7e\x70\x6a\xac\xb9\xd4\x1a\x45\x79\xc9\xdf\x1f\xf9\xc1\xd3" + "\xe2\x07\x51\xbb\x29\x2f\xf8\xf1\x3b\xf1\xfd\x9d\xdb\x29\x3e\x90" + "\x56\x86\x6c\xd3\xe5\x27\x74\x53\xd3\x44\x5f\x5c\x87\x32\x87\x1f" + "\x4b\xdf\x2a\x62\x0a\x0a\xb8\x26\xdc\x86\xba\x33\xa9\x0c\xf2\xc3" + "\x45\xdf\xaa\xdf\x5c\x85\x6f\x04\x3d\x25\x1f\x9f\xb2\x8c\x84\xab" + "\xb4\x76\x81\x87\x8e\xc3\x73\x74\x44\x1d\x53\x4f\xe8\xe2\x4f\x46" + "\xbc\x37\xe1\xf9\x03\xf0\xa1\xd3\xd4\xf7\xf1\x78\xfe\x03\xf1\xa5" + "\xa2\x5f\xd5\x25\xd2\xce\x57\x17\x5f\x87\xb4\x44\x35\xcf\x34\xe4" + "\xd9\x48\xbc\xae\x5a\xc6\x65\x78\x5e\x46\x32\xa3\xfa\x3e\x09\xcf" + "\x77\xd3\xbe\x80\xfa\x7e\x3a\x9e\xaf\xc7\xf3\x37\xd5\xf7\xe0\xeb" + "\x4d\x99\xa2\xcd\xc6\x43\xcd\xd4\x27\xc0\xbe\x89\xe0\x0e\x58\x37" + "\x23\x6d\x29\xe4\xd5\x62\x1a\x47\xea\x67\xdb\x86\x13\xac\x4f\x67" + "\xba\x9f\xce\x9a\xc9\xb1\x3a\xd2\x26\xfd\xd0\xe8\xd3\x91\xbe\x84" + "\xd2\xc9\x5e\x5a\x29\x3f\xd2\x44\xf7\x80\xe9\x49\x82\xa1\x5a\xd7" + "\x35\xa8\xab\x50\x1d\x67\xc0\x8e\x7c\xc5\xb2\x92\xed\xea\x58\xa0" + "\x6d\x53\xf0\xfe\x13\xcd\xfe\x62\x51\x70\x4c\x9e\x99\xd1\x99\x76" + "\xfe\x53\xbe\x11\xf0\x9d\xa4\x7b\xa6\x7e\x2d\xae\x1c\xd2\x44\xac" + "\x7a\xc2\x4f\xd2\xaf\x78\x63\x0f\x2d\x10\xbe\x40\x80\xa3\x1a\xae" + "\x10\x9e\xf0\x98\xd8\xa0\xd0\xd5\x94\xc5\x87\xe3\x9f\xe8\x4c\x4b" + "\x55\x5f\xfc\x4c\xca\x09\xf1\xf3\xc6\xed\x8b\x74\x53\x05\x7d\x88" + "\x78\x97\x1e\xf1\xce\xa3\xbd\x13\x36\x70\x65\xf1\xf9\x11\xef\xba" + "\x2f\x78\x57\x1b\xf1\xae\xed\x82\x32\x9b\x23\xde\xb5\x5c\xf0\x5d" + "\x47\xc4\xbb\xfa\x0b\xde\xf5\x47\xbc\xab\x54\xdf\x45\x21\x3d\x38" + "\xee\x8b\x4f\x37\xb5\x50\x4d\x07\xad\x4f\x48\x8a\x48\xcf\x55\xd3" + "\x51\x7f\x02\xf8\xbf\x3f\xb7\xa8\xe9\x02\xcf\x81\x47\xdf\x90\x75" + "\x24\x2c\x88\xa8\x63\x9e\xba\x7f\x2c\x7d\x89\xe8\xe2\x76\x9b\x75" + "\xd6\x29\x84\x53\xe6\xd2\x12\x8a\xeb\x52\x2b\xfd\x4e\xc9\x79\x28" + "\x62\xfa\x92\x3c\x8c\x7c\x93\xd1\xc6\x09\x6d\x04\xcb\x12\xf6\x68" + "\x67\x33\x43\xae\x43\x0b\x95\xca\x58\x8a\xa1\x74\x0d\xf9\xa7\x2a" + "\x1e\x22\x1f\x25\x3e\xe6\x66\xa3\xcc\x9d\xef\x2f\xa1\x78\x71\x5d" + "\x32\x4e\x1c\x9d\x69\xd3\xd1\x99\x0d\xf2\xb1\xd5\x65\x3f\x29\x62" + "\xc5\xad\x1b\x62\xc9\xf6\xef\xf2\xfe\x01\x9d\xd9\x1a\x2a\x3f\xb4" + "\x50\xf5\x33\xf0\xac\x38\x0b\xad\x33\xcb\xf9\x41\x72\xec\x90\xd0" + "\x2d\x1b\x91\xaf\x45\xe4\xe1\xe9\xcf\xca\x3e\x9a\xc5\x78\x6c\x57" + "\xcf\xc7\xf9\xcb\xcc\xe9\xe3\xf1\x0b\x75\xe6\xdd\x67\x63\xfb\x2d" + "\x48\xcb\x3d\xcf\xa6\x51\x67\x7e\x9c\xca\xa4\xb6\x23\x8f\x8d\xca" + "\x46\x9e\xda\x71\x9b\x46\xa4\xaf\x0b\xb2\x59\x68\xd7\x80\x56\x3e" + "\xde\xb7\x78\x74\x09\xc2\x3e\x9a\xca\x3c\x5b\x15\x47\xe5\xb6\x7b" + "\xf4\xbb\x84\xfc\x89\xfb\x6e\x0f\x7b\xdb\x30\xd9\x9a\x27\xf4\x90" + "\xc6\x23\x3d\xdc\x75\xc4\x83\x79\xde\x2d\xec\x6e\x63\x8f\xf4\x48" + "\xf9\x3d\xf1\x2a\xb2\xb9\xa0\x18\xc8\xb4\xd7\x28\x69\x4d\xe2\x32" + "\x31\x5f\x91\x86\x31\xda\x05\x9a\x2c\x71\xf9\x92\xe6\x61\xe2\x6c" + "\x51\xc6\x19\x66\xac\x56\xed\x5c\xfd\x65\x89\x8e\x88\x38\x02\xd2" + "\x8e\x5d\x97\xb8\xa3\xcb\x21\xf6\x9b\x44\x1b\x2f\x6c\x03\xb5\x17" + "\x65\x25\x4f\xba\x7e\x1a\x8f\x74\x0b\xdd\x67\xc5\xe1\x34\x61\x3f" + "\xa6\x4b\x3c\x1e\x65\xb9\xf2\x19\xd4\xd5\x3f\x1e\x3f\x01\x79\xaa" + "\x47\x19\x53\x50\xfe\x78\x3f\xf3\xa8\x8e\x69\x62\x7f\xc2\xa3\x9b" + "\x66\x05\xed\xea\xa6\x36\xa8\xe9\xd6\xae\x60\x80\xce\x7e\x4f\xe8" + "\xdf\x89\xd6\x45\xe1\x1b\xa8\xe2\x08\xc5\xfa\xa6\xb8\xac\x6a\x9b" + "\x2f\xb3\x92\xfd\x39\xb5\x59\xc2\xf6\xb2\xe9\x1a\x1c\xab\xce\xa0" + "\xec\xa2\x4f\x59\xbf\x6e\x5a\x03\xd9\xb4\xd0\x79\x8a\x9a\x0d\xaa" + "\x9d\x15\xd2\x44\xbe\xd1\xf1\x3c\x42\xd7\x4b\x36\xbe\x44\x43\x1b" + "\xe9\x5c\x3c\xca\xac\xc6\x58\x08\x9f\x17\xba\x69\xe2\x2c\xc4\xa6" + "\x3c\x26\xfb\x4d\x36\x6c\xba\xcb\xe6\x4b\x5c\x99\xd6\xeb\xd1\x5d" + "\xb6\x58\xe2\xa0\x4c\xa3\x18\xda\x64\x7b\x70\x4a\x37\xed\x75\x8a" + "\xe9\x09\x78\x78\xc8\x2f\x5a\x97\x0f\xf3\xc4\x31\x4a\xb8\xe0\xa1" + "\xd8\x6d\x80\xc3\x1e\xb9\x26\x10\xcc\xa7\x35\x51\xfd\x04\x5b\x8a" + "\x67\x0a\x98\xee\xf4\x97\x5d\x36\x1e\xff\x8b\x62\xa7\x22\xcf\x92" + "\xc9\xc6\x85\x60\x14\x42\x9b\xc9\xbf\x47\xdb\xac\x4f\xd1\xbe\xcb" + "\x75\x4a\xdc\x91\x6e\xb2\x99\x44\x5b\x9f\x97\xb4\x42\x8e\x9d\x9c" + "\x4b\x97\x7d\x82\x3a\xdc\xb4\xbf\x48\xf6\xd8\x22\x0e\xb4\xee\xb2" + "\x12\x15\x7e\x22\x9e\x42\x6d\x81\x84\x83\xcc\x7f\xf9\x1c\xa9\x8b" + "\xb9\xf2\x63\xb4\xab\x7b\x5c\x17\x83\x74\xa1\x47\x53\xed\xaa\xf1" + "\x6e\x28\xa2\xcd\x3e\x71\x9e\xed\x0c\xc9\xd1\x97\x6d\xa1\xba\xaa" + "\xc8\x6f\x15\xe1\xc5\x89\x48\xfc\xbf\x6c\x2d\xb5\x93\xec\xf1\x42" + "\xb1\x87\xd3\x78\xf9\xe1\xf9\x04\x67\x7c\xd3\x8c\xb9\xd0\x3d\x49" + "\x9c\x6d\x11\x2f\xc8\x5f\x76\xf9\xd2\x88\x18\xa8\x58\xfb\x2e\xaf" + "\xd2\xd6\x36\x5a\x97\xc9\x0f\xc1\x78\x5a\x95\x15\x73\xf2\x50\xad" + "\xca\xd7\xd4\x4e\xea\x43\xef\x26\x96\x4a\x67\x66\xc9\x36\x9b\xf0" + "\x8d\x9b\xac\x0e\xf2\xcb\x4b\x3e\x06\xdb\x36\x7c\x1b\xed\x4d\xba" + "\xe3\xa9\x19\x5c\xc6\xcf\xbd\xe9\x0c\xd9\xe5\x0c\x0d\x14\x0a\xdf" + "\x39\xc6\x45\x8e\x20\xdf\x2e\xe3\x1c\x7b\x79\xbc\x95\xd6\xdc\x21" + "\xe1\x97\x9e\xca\xfc\x67\x7d\xcc\xea\x92\x8c\x2a\xff\x32\x04\x5a" + "\x79\x05\xfa\x23\xf6\x0b\x70\x3f\xe3\x84\x6e\x7a\xb6\x8c\xdb\x27" + "\xfd\xa4\xab\xf6\x85\x31\xf2\x9c\xb9\x97\x89\x73\xbf\xba\xa4\x4f" + "\xac\x37\x30\x36\xa4\x4b\x3a\x2c\x7c\x16\xbb\x0e\x35\xa9\x30\x68" + "\xaa\x91\xed\x32\x67\x38\xf4\xa2\x8d\xd4\xbe\x4b\x6c\xdb\x4e\x75" + "\xed\x8a\xf1\x97\x25\x0d\x6a\xe7\xd3\x45\xff\x55\x5f\xc6\x6d\x5f" + "\x23\x59\x65\xfa\xfd\xea\x7a\xb5\x53\xad\x7b\xe7\xff\xbe\xee\xe9" + "\x56\xb5\x4c\x87\xf0\xe7\x0c\xb8\xa0\x5c\x87\xbf\x6c\xba\x5d\x5b" + "\x43\x55\xbb\xf8\xd9\x72\x6d\x9f\xee\x0a\xaf\x9f\x12\x86\xe7\x9d" + "\x3d\x59\xbd\x3a\xdf\x0a\x26\xdd\xbe\x2c\x7f\x79\x8e\x35\x3b\x2f" + "\x6f\x75\x9e\x95\x9c\xaf\x44\xce\x31\x61\xf7\x52\x36\xbd\x5e\x8d" + "\xc1\xb5\x6b\x3c\x06\x57\xd9\xf4\xfe\xc8\xd8\x68\x68\xdb\xe0\xff" + "\x1d\x59\x66\xc6\x57\xe2\x2e\x6a\xe5\xd4\xea\x15\xd2\x4d\xb5\xe2" + "\xd7\x86\x1f\x9d\x6d\x62\x19\x01\x96\x86\xf5\x51\xf0\x3b\xe1\x73" + "\xd7\xd3\xf7\xd0\xde\x77\x9f\x6e\xc6\xb2\x46\xc5\xc0\x84\xdf\x0d" + "\xa7\x42\xf6\x23\xe4\x7b\xbb\x15\xbf\x36\xfc\x3a\xf0\x13\xdf\x29" + "\x7f\x11\x67\x46\x5b\x22\xdf\xd1\x7e\x34\x77\xee\xec\xa7\x3c\xbc" + "\xd4\x20\xf6\x1d\x94\x27\x65\xbe\x0b\xda\xa0\xe7\x65\x66\x2d\x9f" + "\x68\x7b\x42\x29\xb3\x4e\x90\x2f\x8a\x97\xc5\x25\xab\xf9\x04\x7e" + "\x6b\xfd\x21\xbf\xf0\xc8\xaf\xe5\x33\xf0\xb2\xcb\x9b\xd4\x7c\xf2" + "\x2c\x93\x53\x3f\x51\xbd\xd1\xdc\xf9\xc9\x66\x35\x5f\x62\x64\x79" + "\x11\x79\x62\x94\x32\x11\x6f\xb7\x5b\x29\x35\x88\x7d\x5d\x5e\x36" + "\xc3\x80\xfc\x13\xfa\xd3\xbc\xb4\x71\xba\xa2\xf9\xc2\x71\xb2\x2f" + "\x5f\x91\x7d\xfb\x8a\x55\x05\x14\xa5\x28\x7f\xf5\xda\x7c\xba\xae" + "\x5a\xf6\x88\xb8\xac\xce\x78\x68\xb9\xbc\xc9\xcf\x4d\xa5\x9b\x5c" + "\xe0\x1b\x5d\xb3\xd6\xda\xe9\xb2\x7c\x35\x3d\x3a\x72\x66\xaf\x5d" + "\xae\x85\x56\x8e\xc4\x43\x9b\xbf\xcc\xb2\x04\xb8\x31\x5f\xf2\x23" + "\x96\x4c\xc8\xbc\x62\xef\xd7\x5c\xea\x61\xfb\x6c\x22\x06\x1b\xfb" + "\xca\xb9\x7b\x9d\x65\x25\x9d\xbb\x37\x97\xda\x97\x9b\x83\x2b\xb2" + "\x41\x67\x9b\xf0\x6d\xbd\x87\x55\xaa\x31\x84\x0e\xb5\x08\x9f\x94" + "\x65\x57\x0c\x69\x36\x85\x8a\xeb\x50\x16\xf9\x5a\x17\x36\x46\x4f" + "\x92\xaf\x96\x43\xb5\x78\x6e\x6e\x7c\x52\xc4\x3c\x49\xc2\x73\x2e" + "\x9e\x77\xe3\xd9\x82\xe7\x64\xc5\xf5\x4e\x80\xce\xd9\xe1\xd9\x8a" + "\xe7\x14\x94\x3f\x1e\xff\x3d\x12\x36\x6a\xd0\xaf\xdb\x27\x94\x89" + "\xcf\xf7\x77\x84\xb9\x35\x33\x4d\x8b\xa9\x2a\xe2\xa7\x96\xcd\x5c" + "\xac\xed\x05\xca\x38\x41\x89\x4b\xc5\xba\x26\xd6\xf6\x99\xfb\xa3" + "\x2c\x57\xa5\x48\xde\x7b\xa6\x43\xf3\x2d\x20\x79\xeb\x99\xae\x88" + "\xd8\xb3\xf4\x5c\x37\x1e\x7b\x56\xf2\xa2\x5b\x25\x2f\x3a\xd3\xc3" + "\xcb\x66\x86\x63\xe8\x95\xcd\x6c\x8b\x8c\x13\xe6\xc1\x7b\x92\x69" + "\x90\xde\x13\x5e\x07\x67\xe6\x52\x9d\x13\xc5\xd9\x85\x4c\xee\xc8" + "\x58\x0f\xfe\x1b\x57\xc1\x8b\x87\x74\x4c\xc8\x63\x78\xe6\xce\x34" + "\xf2\xd3\x62\xa5\x77\xc4\xfb\x4d\xa8\x67\xa0\x38\x77\xba\x59\x8f" + "\x92\x4f\x57\x6f\x71\x96\xee\xeb\x8d\x4c\x27\x9e\xa5\x4f\x42\x7e" + "\x4a\x37\xeb\x7b\x84\x7b\x9a\xbf\xb2\xc8\xb3\xdd\x13\x9e\x37\xf8" + "\x50\xdb\x27\xce\x5d\x6d\x0e\x2e\xcb\x96\x7c\xdc\xac\x0f\x24\x2d" + "\x3d\x9c\x25\xd7\xfb\x59\x7b\xf8\x7d\x32\x96\x86\x47\x77\xa5\x88" + "\x63\x67\xd6\xe5\xae\xe6\xf8\xd6\xec\x58\x96\x2d\xd2\x90\x6f\x13" + "\x78\x2d\xb5\x7d\x3b\xdc\xc9\x83\x8c\x8f\x84\xe4\x99\x75\xdd\xac" + "\xa6\x07\xae\x2a\xa1\x7a\x8c\x82\x8f\xf8\x90\x99\x28\x66\x1b\xb5" + "\xad\x31\xc2\x9f\x5a\x0d\xd2\x44\x3c\xf6\xfb\x98\x89\xfc\xc7\xaa" + "\x6d\x69\x12\x71\xb0\xca\xae\x9c\xab\xf9\x7e\xf1\x20\xed\xc2\xfe" + "\xdc\xf7\x23\x31\x43\xae\x5b\x3e\x7b\xf1\xdd\xb8\x9b\xad\x86\x1b" + "\x8d\xc4\x9d\xe4\xe1\xb8\xcf\x5d\xc3\x2f\xac\xfc\x95\x88\xd7\x57" + "\x76\xa5\x0b\xe5\xcc\x16\xe3\xbd\xe9\xa7\xc7\x89\xb6\x68\xf1\xea" + "\xdd\x8a\x0f\xf5\x5e\x9d\x2d\x7c\xb7\xea\x25\xbf\x28\x7c\xa6\x95" + "\x5d\xb9\x90\xc7\x1d\x5a\x2c\x63\x75\x7e\x36\x17\xe3\x27\xd6\x7d" + "\x9a\x1b\xe2\x1c\x60\x22\xf5\xfd\x4a\x0f\x68\xea\x5d\xf8\xfd\xa7" + "\x8c\x3d\xf2\xd3\xe3\x5a\xb9\xe4\xdf\x08\xb8\xd5\x84\x6b\xa2\xbf" + "\x2c\xd9\x38\x6e\x17\xa4\x9d\x2d\xd4\x25\x5f\x4f\xbe\x97\xc2\xfc" + "\xf9\xd5\x3f\x94\x7c\x65\xf2\x1c\x0f\x33\x6f\x91\xf3\x3b\x19\xf8" + "\xff\xca\x3c\xf5\x7e\xa1\x87\xdd\x9a\x73\x41\x19\x4f\x6b\xfa\x0e" + "\x39\x76\xc9\x76\xe0\xe2\x5d\xf8\xfd\x27\xf2\x17\x6a\xb1\x8a\x37" + "\xe9\xc5\x79\xa2\x81\x28\x0b\x4b\x45\xfa\x16\x2d\x3d\x5a\x97\x06" + "\xd8\x24\xef\xd4\xe8\xc9\x70\xdc\xe1\x85\x78\xde\x0d\x7e\x73\xb6" + "\xfa\x9c\x8e\xe7\x76\xed\x19\xf7\xdd\x1a\xbd\x21\xbd\xc3\xf0\x63" + "\xe9\xcf\x92\xbc\xb7\xdc\x02\x9e\xcc\x42\xf2\x55\xb2\xd7\xc3\x9a" + "\x6d\x6a\x5e\xc8\xbf\xbf\xad\x94\xf7\x57\xa1\xff\x2f\xe6\x86\xe1" + "\x1f\x65\x96\xed\xbf\x7a\x1e\x8f\x8f\x9d\x4b\x31\xa2\x91\x67\x36" + "\xe6\x92\xf8\x96\x7c\x1d\x55\x8e\x26\x2e\x71\x6f\x06\x7f\xfa\x10" + "\xe1\xc5\xd5\x62\xff\xb4\x6a\x43\xe2\x62\xe2\xef\xe8\xec\xbc\x88" + "\xb9\x45\xbe\x0b\x83\x2c\x46\xf8\x8b\xaf\x8a\xb5\x09\x3f\xe9\xeb" + "\x6c\x26\xcd\x6f\x21\xe6\x24\xe8\xe1\x53\x59\xe4\xcb\x50\xe8\xca" + "\xfc\xb6\x04\xe1\xbf\x50\xf5\x5b\xd8\x50\xc0\x92\xea\x15\xe9\xb7" + "\x50\x9c\xab\xbf\x88\xef\x42\xee\x7c\x7f\xdc\x77\x21\xc5\x84\xc7" + "\xbd\x8d\x8f\x04\x03\xb8\xa6\x44\xf8\x67\x31\x4c\xe8\xc7\x50\x0f" + "\x1a\xa9\x97\x7e\x0c\x2f\x6d\x6d\xb9\xda\x28\x71\xe2\xea\x05\x5a" + "\xdc\xe4\x88\xb4\xa5\xc0\x69\xb9\x3f\xad\x4b\xb6\xa9\x69\xe0\x7f" + "\x5e\xde\x32\xce\x87\x81\xb6\x91\xce\x10\x73\xb6\x99\x17\xe7\x3c" + "\x1b\x39\x87\x18\xa3\x25\x3a\x1a\x65\xc5\xe0\x37\x85\x7e\x0b\xc6" + "\xe9\xc4\x08\x27\xf9\x0d\xf3\x1e\xeb\x8a\x23\x8a\x2f\x0a\x06\xa3" + "\x32\x82\xba\x03\xc4\x63\xd2\x19\xe1\x45\xa1\x20\x9d\x55\x37\x2c" + "\x0a\x0d\x53\x3c\xc3\x03\x74\x4e\xac\xe6\x21\x3a\xb7\x78\x0d\xa7" + "\x58\x27\x8b\x42\x5f\xf2\xed\xf2\x3c\x66\x37\xc9\x00\xa1\x11\xde" + "\x19\x2a\xe0\x1d\x18\x03\x13\xc9\x17\xe4\x2f\x2a\x41\x17\x60\x09" + "\xf6\xa8\x37\xef\x3d\xfb\x26\x27\x5f\x51\x14\xe7\x4a\x29\x0b\x80" + "\x26\x5a\x75\x19\xc1\xa8\x12\x77\xb0\x5f\xf8\x9a\x5f\x14\x9a\xc2" + "\x17\x39\xee\xe0\x22\x3e\x55\x01\x6f\x07\x3d\x8d\x12\x31\x8b\xd7" + "\xf3\x61\xdc\x1b\x17\xad\x1f\xe6\x14\x4f\x11\x65\x77\x2c\x0a\x2a" + "\xa3\x8b\x1c\x4a\x71\x86\x43\x87\xef\x8e\xe2\xbb\xa3\x68\x4f\x2a" + "\xca\x4c\xc4\xf3\x9d\x7c\xfb\x43\x74\xbe\xa9\x44\xc8\x38\xe8\x63" + "\x9b\x7a\x66\xb4\x15\xed\xdb\x4d\xbe\xaa\x33\x82\x6d\x25\xdb\xd5" + "\x33\xa0\x22\x96\xa7\x63\x8c\xab\xf5\xcc\x5d\xb4\x9e\xdd\x99\xb1" + "\xfe\x1a\x71\x96\x94\xce\x49\x2d\x0a\x5a\x51\x67\x09\xc1\xc3\x24" + "\xe2\x27\xd3\x59\xa9\xb2\x6b\xbc\x17\x8b\xc3\x38\xa1\x5c\x5d\xe6" + "\x0b\xf2\xaa\x1d\xbb\x79\x99\xbf\x93\x57\xfd\x7a\x0e\x77\x7d\xb6" + "\x94\xec\x4b\x79\xd9\x68\x3d\x9e\x91\x1e\xca\xe5\x55\xcf\xcd\xe1" + "\x15\x6c\x1e\xae\xbb\x79\x45\x94\x89\x57\xed\x9c\xc3\xcb\x0e\x1f" + "\xc0\x77\x2d\xbc\xec\x33\xfa\x2e\x95\x97\x7d\xde\x8e\x2b\x9e\x3d" + "\x7b\x90\x0f\xcf\x47\x76\xe3\x8a\xe7\xbe\xe6\x01\x9d\x15\xf7\x3b" + "\x53\x79\x45\x74\xaf\xa8\xab\xc2\xd8\x2b\xea\xaa\x98\xda\x2b\xea" + "\xa8\x48\xe8\x95\x75\x4c\xeb\x95\x75\x24\xf5\xca\x3a\x8e\xee\x44" + "\xfe\x56\x5e\x76\x2c\x09\xf9\xe6\xf2\xb2\x81\xcd\xb8\xe2\xf9\x0b" + "\x1f\xf2\xe1\xf9\x78\x16\xae\x78\x3e\x81\xb6\xec\xc4\xf3\xd0\x7c" + "\xe4\xdf\xc3\xcb\x4e\xb6\x22\xdf\x3c\x5e\xf6\xe5\x6c\x5c\xf1\xec" + "\x6d\x42\x3e\x3c\x9f\x41\x39\xcf\xe1\x79\xd8\x85\xfc\xf3\x78\xc5" + "\x15\xd4\x9e\x36\x5e\x31\x93\xca\x4d\xe3\x15\x57\x52\x7e\x3c\x27" + "\xa3\xbc\xe7\xf0\x7c\x75\x21\xae\x78\xb6\xa6\x20\x3f\x9e\xaf\x45" + "\x5f\x77\xb4\xf3\x8a\xaf\x3b\x90\x0f\xb2\xe2\x75\x48\xff\x35\x9e" + "\xbf\xd1\x8d\x7c\x78\xb6\x51\x7e\x3c\xdf\x60\x43\x7e\x3c\x7f\x8b" + "\x60\xd4\xc1\x2b\x6e\x9a\x83\x7c\x0b\x78\x45\xea\x16\x5c\xf1\xfc" + "\x6d\x6a\x3f\x9e\x6f\x5b\x82\x2b\x9e\xff\x95\xe0\x83\xe7\xdb\xd1" + "\xbe\x1d\x9d\xbc\x62\x1e\x95\xbf\x90\x57\x7c\x97\xe0\x83\xe7\xef" + "\xa5\x21\x1f\x9e\xef\x02\x3c\x9e\xc3\xf3\xbf\x19\x91\x7f\xe1\x84" + "\xe3\x59\xb1\xc0\xc3\x4b\x63\x18\xaf\xb8\x8f\xf1\xd2\x29\xb8\xfe" + "\xa8\x85\x97\x46\xdb\x78\xc5\x7f\x26\x22\x1d\xd7\x25\x2e\x3c\xcf" + "\x56\x9f\x71\xbd\x3f\x13\xcf\xa9\xea\x33\xae\x3f\x9e\x8b\xe7\x39" + "\xea\x33\xae\xe9\x6d\x78\x9e\xcb\x2b\x7e\x52\x87\x67\xba\xce\xc6" + "\xf3\x3c\xf5\x19\xd7\x9f\x2e\xc5\x35\xe8\xbd\x2a\xd7\xe1\x8d\x7f" + "\x34\xd5\x1b\xff\x7c\x13\xd9\x1a\x85\xaa\x77\xb4\x28\x09\xbf\x26" + "\xff\xb2\x31\xc5\x67\xd9\x94\x01\xdd\xd7\x57\xd0\xfa\xe6\x2e\xf4" + "\x88\x78\x67\xaa\x7f\xb4\x98\x3e\xdd\xd7\x36\x62\x3d\x9f\x4b\x31" + "\xa2\xd1\xf7\x21\xee\x8c\x3e\x83\x3e\xe7\x72\xe7\xd4\x3e\x5c\xf1" + "\x3c\xed\x43\xf4\x19\xcf\xff\x52\x81\x2b\x9e\x7f\xfa\x7d\xf4\x3d" + "\xd7\x5f\xf6\xb5\x5e\x8f\xce\x9a\x28\xe8\xf5\x0b\x2b\x21\x5b\x17" + "\x83\x4e\x80\x86\x3e\xdb\x9c\x69\x0e\x66\x32\x5e\xf5\x42\x9a\x99" + "\xe2\x12\x34\xe4\xb6\xf2\x84\x47\x45\x9b\x28\xf6\x08\x1f\x4b\xd1" + "\xcb\xba\xa7\xf2\x3e\xdd\xd7\x63\x49\x57\xc9\x13\xca\x27\x7b\x7f" + "\xbd\x78\x3f\xab\xd9\x2e\xdf\x27\xb2\xf0\xfb\xff\xa4\xf7\x3f\x30" + "\x93\x7e\xf9\xea\xa5\x76\x8f\xee\xeb\x22\x8f\x47\xf7\xb5\x4a\xee" + "\x8c\x62\x6e\xdf\xa0\xda\xc7\x29\x94\xef\x51\xfa\x6e\x32\xfd\x89" + "\x52\xf9\x52\x5d\x95\x93\x77\x93\xac\x08\x9a\xaf\xb7\x16\xa5\xb4" + "\xf6\xe9\xae\x4b\x6b\x10\x3a\x80\xe6\xb9\x74\x6e\xa7\x4f\x97\x12" + "\x3d\x56\xf1\x59\x89\x75\x83\x19\xe5\x5d\xf7\xbd\xe2\x00\xf7\xb5" + "\x15\x7d\x1f\x6b\x93\x48\xdf\x23\x6c\xc1\xe5\xfd\x2e\x69\xbf\x23" + "\xee\xb7\x48\x7d\xe6\x75\x69\xf4\x6d\x24\x6f\x1e\x2a\xbb\x37\x55" + "\x49\x68\x4e\x93\xfb\x4f\x29\xb1\xaf\x2b\x1e\xbd\x39\x9f\x45\x5b" + "\x37\xbc\x89\xf2\x53\x16\x9f\x2f\xc7\x69\x79\xc5\xbb\xdb\xde\x40" + "\xde\x6d\x42\xe7\x92\x92\xa9\xe9\x68\x39\xfa\xf0\x84\xe4\x61\xd2" + "\x68\x1d\x92\xbc\x58\x8a\x87\x7c\x2b\x06\x4d\x2f\x58\x83\x95\x8f" + "\x5a\x43\x95\xcd\x73\x79\x75\x73\x5a\x42\x50\xc7\x84\x1d\xbd\xee" + "\xba\xe9\x37\x07\x48\x17\xf6\x1e\xe5\xdd\xaf\xc4\xfc\x67\xd6\x4d" + "\x0e\xa6\x6f\xcb\xfb\x14\xcf\xd7\xc5\xf3\xb2\xa5\xbd\xee\xa1\x1e" + "\x46\xfe\x61\xf1\x6c\xe2\x65\x39\x99\x4a\xcc\x83\x39\x8d\xc4\x43" + "\x3a\x48\x87\xf3\x21\x7d\xf7\x4b\xc0\x19\xbc\x7a\xca\x90\xd6\x16" + "\xf2\x0f\x5f\x05\xd8\x11\x7f\x47\xe7\x9e\x33\x42\x21\xf2\x3b\x04" + "\x1e\xec\xba\x34\xa9\x07\x4c\xe9\x26\x3a\x2b\xeb\xbd\xee\x3a\x25" + "\xee\xb3\xdc\xae\xa5\xb4\xc7\x99\x48\x7e\x5c\x7c\xe2\x9c\x64\x90" + "\x62\xba\xd1\xda\x26\xf3\x9e\xe7\x13\x77\xb9\x3d\x63\x83\x7d\x75" + "\x5e\x7e\xc6\x5a\xfb\xed\x56\x8a\x3f\xbf\xfa\x21\xeb\xca\xec\x95" + "\xab\xf3\xd6\x5f\xc8\x07\x1a\xfd\x65\xd7\x6d\x06\x6e\x88\x58\xa6" + "\xef\x82\x93\x94\xba\xe1\x6f\x2e\xa1\xb1\x7e\xf6\x19\x19\x43\x00" + "\x79\x76\x41\x16\x12\x36\x44\x4a\x5d\x73\x3a\xaf\xcf\x6d\x2d\xa7" + "\xf3\xde\x6b\x89\x97\xf7\x32\x37\x3b\x83\xb6\xc9\x78\x72\x5d\x41" + "\xf0\xba\x05\x85\xbc\xad\xe0\x0c\xe1\xf8\x5c\x5e\xf5\xfc\x02\xde" + "\xb0\x92\x9d\xab\x7a\xb4\xae\x4f\xf7\xcd\xb9\xe7\xaa\x9e\x9f\xab" + "\xc5\x7c\x09\x55\x3e\x5f\xa7\x98\x5e\x6a\xa1\x98\x2f\x63\xdc\xc2" + "\xf6\x03\x96\xa3\xae\xcf\xd2\x41\xe3\x97\x34\x38\xb1\xee\x40\x06" + "\x10\xfe\x28\x5e\x58\x69\x0f\x71\x9b\x21\xe4\x64\x46\x5c\x13\x78" + "\xc2\xcb\x9e\x31\xd3\x0b\xa9\xf4\x9e\x62\xbd\x84\xc6\x6c\xac\xe8" + "\x00\x57\xfe\x2b\x07\x78\xe3\x64\x5c\xc4\xd7\xcc\x39\xc9\x90\x1e" + "\xa7\x54\x3f\xdf\x36\xb0\x80\xe9\x29\x2f\x78\x1a\xb6\x14\xf7\x85" + "\xcb\x58\x3c\xf2\x99\x0b\xdf\x45\xba\xdf\x16\x17\x2c\xb6\x19\x47" + "\x8b\x6d\x71\x63\xdc\x66\x72\xf7\x07\xd8\xd8\x75\x2b\x4b\x6e\xf4" + "\x32\xc3\xb3\xe0\x7d\x1a\x14\xcc\xaf\xfa\xdc\xa6\xd0\x63\xb6\x98" + "\xe0\x63\x36\xc3\xd8\x98\xcd\x18\x5c\x67\x33\x8c\xae\xb3\xc5\x8c" + "\xf9\x6d\x46\x77\x96\x97\xbd\xe7\x7d\x89\x75\xf5\x0f\x0a\xfd\xe1" + "\x58\xfc\xcb\x43\x63\xf1\xcf\x77\x9a\xfa\x59\xd2\x4d\x76\x46\xbc" + "\x90\x6e\x2b\x78\x5d\xe0\x84\x29\xf8\xfc\x4a\x3b\xaf\x7a\xb9\x16" + "\xf0\xbd\xea\xee\xeb\xf9\x97\xa1\xb2\xd9\x43\xd6\xff\x00\x2d\x2a" + "\x35\x24\x23\x0d\xf8\xf3\x9d\xa5\xbc\xec\xb6\x9d\x90\xbb\xad\xf8" + "\xa5\x78\xe4\x38\x80\xef\xfa\x56\x13\x9e\x93\x29\xaf\xcc\x77\x8b" + "\xd7\x23\xae\x37\xa5\x89\x38\x98\x65\xd7\x2d\x6c\x10\xf2\xd8\x37" + "\x17\x6b\x7c\x74\xbb\x61\xe2\x33\xe5\xc8\x93\x3f\x2e\xd7\x2a\xa0" + "\x27\x55\x3b\x9a\x26\xa6\xd3\x07\x73\x69\xbf\x51\x01\xdc\x50\xe7" + "\x31\xf2\x6d\xc4\x8b\x17\xa8\xb2\xe4\x37\x85\x5d\x20\x9d\xc3\x26" + "\x7d\x83\x9a\x26\xf4\x46\x8a\x3e\x8d\xfc\xbb\xb7\x92\x3f\x29\xd2" + "\x2f\x00\xaf\x3b\xd0\x56\x8a\xf9\x11\x0d\x39\xac\x05\xbf\x56\xfc" + "\xda\x9e\x22\xbd\x83\x93\xdd\xad\xe9\x64\x26\x6e\xab\xcd\xea\x61" + "\x55\x3d\x61\xb9\xd4\x96\x8a\xb2\x2e\xdd\x07\xab\xce\x96\x7a\x11" + "\xfd\xb0\x81\xfc\x9d\xf2\xea\x1d\xdd\xb5\xca\xb8\x7f\x54\xd0\x7d" + "\xdb\xe3\xa0\x13\x25\xe2\x5d\xe5\x0b\x69\x45\xa7\x59\x14\xbd\x6b" + "\x21\xdb\x04\x3c\x5b\xf3\x74\xdc\xed\x0b\x30\x7c\x63\xe0\xc9\xb9" + "\xad\x2d\x23\x5e\x3d\xcd\x8b\x2e\xa4\xe1\xdb\x86\xda\x11\xb5\xdc" + "\xba\xe6\xcc\xe2\x47\x99\x88\x57\x41\x31\x6f\x68\xbe\xd4\x16\x41" + "\xe6\xa3\xf8\x3c\x79\x51\xa0\x57\xb6\x4f\x70\x6f\xa4\x7c\xdc\xf4" + "\x42\x9a\x82\x32\x30\x67\x76\xf1\xf8\x17\x6c\x4a\xd5\xf3\x2d\x58" + "\x1f\xec\xfc\xaa\x95\x16\xe5\xd9\x66\xc8\xd5\xd7\x53\xff\x85\xdc" + "\x4e\x7e\x6b\x48\xa7\x11\x82\x6c\xdd\xb5\x2b\xc8\xf8\xf7\x83\x6c" + "\x5f\xfe\x59\xe6\x8d\xfd\x6c\xa9\x37\xfe\xa5\x3a\x6f\xfc\xcb\xb5" + "\xa1\xf8\x97\x7a\xf0\xeb\xb5\xe7\xd1\xde\xee\xf5\xbe\x71\xff\x8b" + "\xa7\x2f\xee\x7f\x11\x65\xa6\x68\x3e\x18\x43\xeb\x2e\xdd\xff\x62" + "\x48\xff\x97\x60\x43\xc1\xdf\xf7\xbf\x08\x1e\x93\x62\x87\xb7\x69" + "\x7e\x45\x42\xc2\x56\x9c\x99\x42\xf1\x2f\x58\x84\x6f\x12\x47\x9b" + "\xf0\x2f\x42\xbc\x26\xad\x35\xfe\xb2\x1b\x52\x35\xfe\x91\xe8\x67" + "\xa8\xfc\xb3\x1c\xfc\xb2\x90\xbe\xc0\xa3\xbb\xa3\x50\xa3\xad\x58" + "\x4f\x17\x87\xe2\xb2\x86\xfc\x64\xff\x3f\x96\x73\x27\xe5\x05\x1c" + "\x4b\x50\x77\x54\x68\x2c\x67\x1e\x7e\x77\xe0\xf7\xdd\x50\xd5\xf3" + "\x69\xa1\xaa\x97\xed\xa1\xaa\x47\x97\xe0\x97\x8e\xdf\x52\xfc\x32" + "\xf1\xcb\xc2\x2f\x87\x57\x3d\x9a\x8b\x2b\xbd\xcf\xc7\xcf\x81\x5f" + "\x21\x7e\x25\xf8\x6d\x0e\x3d\xdb\xbc\x38\xa4\x33\x24\xe3\x97\x82" + "\x9f\x35\x54\xf5\xd2\xae\x50\xd5\x0b\x56\x71\x26\xb3\xec\x86\x1e" + "\x0d\x4f\x27\xf6\xf3\x69\x4c\x17\xfe\xf7\xa3\x3f\xe7\x66\x8a\x0d" + "\x5b\x78\x96\x7c\xaf\xa5\xef\xb3\xf9\x2e\x2d\x0e\x83\xee\x5b\xc6" + "\xc9\xf0\x9a\xca\x07\x8d\x19\xbb\xc4\xf2\xd2\x27\xd5\x8d\x58\x9a" + "\xd3\x83\xc9\x2b\x59\xd0\xc9\x4a\x40\xd7\x74\x5d\x99\xfd\x6c\x91" + "\x97\x15\x77\xf6\x8f\xb2\xe2\x2c\x1e\x12\x34\xa0\x90\x6c\xb0\x9f" + "\xca\x22\x1c\x0f\xf1\x74\xeb\x58\xe5\xf3\x0b\x42\xa6\x97\xec\xdc" + "\xf4\xd2\x2e\xe1\xcf\x0d\xb4\x84\xe2\x5d\x8d\xcb\x9f\x84\x73\x90" + "\x41\xf7\x0f\x9d\x65\x8f\x65\x71\x65\x7f\x0e\x78\xaf\x1e\x20\x9e" + "\x8e\xed\x10\xb8\xa7\xca\xa0\xff\x4f\x2f\x2f\x01\x2e\xc5\x86\x00" + "\x37\x85\x64\x4f\xe0\xdd\xf6\x02\x96\xaa\xe1\x1e\xd6\xf4\x44\x2d" + "\x46\x10\x8f\xb9\x61\x08\xef\x0c\x14\x43\xa8\x1e\x32\x68\x7d\x01" + "\x4b\xa9\xc7\x3b\x11\xef\x11\xed\xbe\xd7\x6e\xe6\xca\x23\x36\xd6" + "\xf8\x30\x33\xc6\x9f\x94\x31\x44\x43\x80\x7d\xd8\x8f\xfe\xa3\x75" + "\xf7\x9c\xb4\xb2\x7d\xb6\xc3\x58\x9b\x5b\x30\x2e\x8f\xd6\x8d\x61" + "\xfd\x02\x2c\x43\x97\x06\xcb\xd9\x3b\xff\xdf\x82\xe5\x58\x72\x6e" + "\x93\x84\x67\x26\x23\x98\x5d\x08\x4f\x82\xf1\x86\x7e\xc0\x13\x70" + "\x75\x1f\x08\x41\x96\x64\xcb\x34\x78\x6e\x03\x3c\x01\x53\x0b\xc1" + "\x14\xf0\x10\x30\xe5\x2a\x4c\x1b\x23\x60\x0a\xda\x25\x7c\xdf\x11" + "\x4c\x15\xc0\xb4\x71\x12\x98\x8e\xcb\xf2\x80\xe9\xf6\x7f\x08\xa6" + "\xbb\xfe\x17\x30\xbd\x71\xd2\xf8\x5f\x41\xe2\x1b\xaa\x1f\xad\xe5" + "\xa0\x8b\xee\xe0\x7b\xc2\x8f\x23\x78\xbe\x5e\xf0\xae\x3d\x8a\xe9" + "\xf9\x3a\x8a\x09\x4d\x7b\xee\x14\xb3\xaa\xd8\xc1\x8f\x14\xef\xe2" + "\xe7\x42\xd5\x2f\x7b\x29\x0d\x74\x2d\xe7\x66\xb2\xf5\xb1\x7b\xb0" + "\x76\xf1\xd6\xae\x11\xd2\x79\xdd\x72\xcb\x28\xf1\xd4\xd5\xcd\x37" + "\x2b\x3c\x87\x11\x4d\x79\xe0\x7a\x66\x18\x05\xdd\xb0\x17\xb0\x6b" + "\x6a\x41\x0b\x47\xab\x5e\xea\x3d\xa1\xbb\xa9\xf3\x6e\xbb\xc2\xf1" + "\x2b\x26\x7f\x84\x0a\x68\x2e\x68\xb9\x18\x5f\x1a\x33\xda\xcb\xdb" + "\xff\xc0\x5f\x50\xde\xcd\xaf\xbf\x9f\x19\x64\xc5\x39\x5f\x1d\x5f" + "\xa5\x38\x1d\xbc\xe7\xdf\x9f\x27\x14\x37\xaf\x70\x90\xc6\xb5\x85" + "\xb9\xfb\xc3\xf3\x44\x51\x69\x34\x8d\x05\xcd\x0b\x9a\x23\x35\x11" + "\xb4\x19\x74\x3f\xb1\x41\x8d\x23\x11\x72\x82\x36\x93\xdf\x71\x8c" + "\x25\xc5\x97\x98\x70\x7e\x3c\x86\xf9\xb1\x41\xc4\xf8\xb1\x00\x1e" + "\x2d\xa3\x7e\x39\x86\x34\x66\xee\x60\x87\x18\xbf\x5a\x75\x2d\x90" + "\x70\x7f\xe9\x65\xce\xd3\xc1\xcf\x25\xd8\x94\xea\x97\x3d\xdc\x9f" + "\x13\x47\x71\x9e\x20\xf3\xa7\x9a\xb3\xc0\x3f\x7d\x89\xb5\x62\x15" + "\xf0\xeb\x14\x4b\xd9\xbe\x0a\x3c\x91\x9f\x62\x75\xa1\x3d\xeb\x65" + "\x8c\x53\xa5\xec\x5b\x8b\xf1\x4e\xf8\x57\x54\x34\xff\x8a\xc3\x36" + "\xd2\x43\x84\x75\x43\xab\x6d\xfa\x70\x9d\x47\xbd\x21\x53\x82\x4d" + "\x9c\x1d\xd5\xa5\xca\xb8\xa7\xc6\xb7\x03\x04\xd7\x21\x5d\x6a\xab" + "\xd4\xd7\xbe\x1f\xb4\x17\x91\x4d\x4f\xea\x4a\x5e\xf1\x11\xf9\x95" + "\xd7\x9d\xd0\xde\x15\xa7\x13\x1c\x7c\x37\x95\x30\xd0\xf2\x84\x05" + "\x14\xc7\x9b\xfc\x67\x5d\x1a\x2e\xa6\x0a\xfb\xff\x90\xeb\xa8\x0f" + "\x70\x4a\x53\x2a\x8e\x06\x41\x53\x52\xf9\x23\xe8\xeb\xc3\xe8\xeb" + "\x09\xc0\xf5\x04\xfa\xba\x4e\xed\xab\x1a\xbf\x4c\x01\xfc\xf1\x6e" + "\xe2\xb5\x51\xeb\xeb\x23\x80\xb7\x6b\x6f\xc7\xc6\x93\xec\x72\x0e" + "\x7e\x7c\xff\x90\x38\xb7\xe3\x77\x07\x0f\x33\xaa\x57\xac\xdd\x95" + "\x8f\xe6\xdc\x0f\x7c\x24\x98\x83\x5f\xc0\x9a\xf7\x7c\x9b\x36\x0e" + "\xd4\x1e\x3e\x96\x13\xd7\xb8\x0a\xed\x21\xd8\x9f\x62\xb3\x69\x3e" + "\x03\xf6\x29\x8d\x04\xff\xf3\x63\x08\x27\x89\x31\x88\xc1\x18\xfc" + "\x9f\xf6\xbe\x06\x20\xaa\x2a\xed\xff\xcc\x75\x4c\xb4\x19\x18\x8d" + "\x5c\x72\xd1\xc6\x16\x77\xc7\xd2\xa4\xd6\xca\xca\x8a\x4c\x8b\x4a" + "\x85\x5a\xda\x28\xb1\x50\xd1\x86\x02\x04\x24\x24\x45\x40\x24\x5f" + "\xa4\x01\xa9\xc8\xc5\xe4\x4b\x40\x43\xc4\xa2\xb2\xa2\xa2\x6d\x4c" + "\x7b\x5f\x2c\xbe\xea\x4f\xef\x62\xab\x35\xb1\x64\x64\x68\x93\x8e" + "\x82\x30\x33\xf7\xff\x3c\xf7\xdc\xcb\xdc\x19\x66\x60\x66\xc0\x8f" + "\x7c\xa5\xae\x33\x73\xee\xb9\xe7\x9e\xf3\xfc\x7e\xcf\xc7\x39\xe7" + "\xde\x73\x62\x78\x0c\xb2\x79\x0c\x20\x5e\x06\x3f\xec\x01\xfd\x46" + "\x9f\xa2\x74\x8a\x81\x6b\x32\xba\xa9\x62\x98\xf5\xd5\xe0\x58\x5f" + "\x67\xfe\xd8\x43\xfb\xc8\x12\x5c\xe7\x91\xf5\xac\xfa\xab\xb9\x17" + "\xf4\x36\x87\xd7\x5b\x56\x7d\xb7\xa0\xb3\x47\x25\x37\xaf\x77\x4e" + "\x67\xff\x1a\xf7\x7f\x54\x67\xbd\xcf\xad\xce\xce\xbc\xdd\x5a\x67" + "\x67\x46\x59\xeb\xec\xcc\xc9\x16\x9d\xe5\xcf\x0d\x8b\xce\xce\x9c" + "\x75\x61\x74\x76\xe6\x2c\x3b\x3a\xdb\xe2\x84\xce\xfa\x38\xd0\x59" + "\x9f\x73\xa7\xb3\xb7\x84\x9d\x3f\x1f\x3b\xab\xb0\x87\xb1\xe3\x63" + "\xd7\x8a\x7c\xac\x1c\x7d\xec\xad\xfe\xf6\xf4\xb5\xb7\x00\xf4\x55" + "\xc6\xeb\xeb\x93\x1f\x41\x79\xb7\x4d\xfd\xe2\xf0\xe0\xfa\x6a\x2c" + "\xb0\xc4\x4f\x0e\x75\x56\x8d\x3a\x5b\x41\x9a\x74\x9c\xce\x2e\x11" + "\x74\xb6\x80\xef\x0b\x0d\xa0\xb7\xde\x8e\xf4\x16\xf7\x74\xc2\xfd" + "\x9c\x06\xd4\x5b\x3e\x5e\xea\x9d\x88\x7a\xab\xbd\xc8\x7c\xed\x6d" + "\xbf\x59\xeb\xed\x2c\x3f\x6b\xbd\xbd\xed\x90\x45\x6f\xf9\x73\xc3" + "\xa2\xb7\xb7\xe9\x2f\x8c\xde\xde\xa6\xff\xfd\xf8\xda\xdb\xbd\xcf" + "\x9f\xaf\x9d\xfd\x04\xa7\xb7\x8e\x7c\x6d\x2a\xef\x6b\xe5\xe8\x6b" + "\x6f\x3f\xee\x9c\xee\xde\xf1\xe3\xff\x71\xdd\x3d\xc7\x3e\xf7\xce" + "\x3d\xd6\xba\x7b\xa7\xce\x5a\x77\xef\x7c\xcd\xa2\xbb\xfc\xb9\x61" + "\xd1\xdd\x3b\xab\x2e\x8c\xee\xde\x59\xf5\xfb\xf1\xb9\xb3\x1d\x8e" + "\x81\x2a\x27\x91\xb4\x36\xc9\x5d\x53\x9b\x0a\xb8\xe7\xf5\xd2\x9a" + "\x8c\x77\x10\xfa\x5c\xc9\x5d\x8f\x34\xf9\xcc\x22\xe6\xac\xef\x9a" + "\x71\x1f\x03\x7c\xbe\xe5\x55\xd1\xf3\x23\xf4\x79\x87\xbb\xe2\x84" + "\xe7\x5f\x8a\xf9\xbd\x0e\x06\x7a\xfe\x85\xcd\xfc\x8e\x7f\xc6\xe5" + "\xae\x2a\xca\x8d\xef\xd4\xc2\x6f\x6e\x4d\x2a\xc9\x5d\xd5\xec\xa6" + "\xef\xc2\xf5\xa3\xbf\x73\xb4\xf7\x83\x87\xe7\x7a\x96\xc5\x3d\x82" + "\x4e\x4d\x8a\x56\x9e\xca\x22\x24\x97\x9b\x87\xb9\xab\x03\xae\xe5" + "\xe6\xc2\x4e\x79\x4e\x56\x9c\x4a\x0f\x26\x90\x66\x14\xd2\xb8\x7d" + "\x94\xd3\x47\xb0\x66\x38\xc7\xe6\xc4\x1a\x8b\x53\x88\x07\xae\xf3" + "\x79\xe3\x19\xe4\xe2\xdd\x32\xb0\x11\xde\xb8\xcf\x10\xee\xed\xc0" + "\xfe\xe1\x8f\x86\xa2\x93\x44\xda\x98\xc1\x8d\x3d\xe3\x73\x33\x25" + "\x39\xc8\xff\x11\xd7\xe7\xb3\x8c\x94\x98\x0b\xa3\x3d\x58\x79\xa5" + "\x8e\x7b\x4e\x17\xb8\x22\x3c\x4b\x83\x7b\x6f\x99\x27\x46\x55\x08" + "\xeb\x4c\xb2\x50\xbf\x7f\xa6\xe8\x19\xdc\xef\xba\x28\x9e\x28\xe0" + "\x90\xb1\xd9\x95\xba\xae\x8d\x77\xe7\x09\x63\x89\x0e\x9f\xb9\xc6" + "\xbd\x60\xff\xe8\x23\xe5\x9f\xdb\xc1\xf7\x65\xb9\x7d\x32\x36\x33" + "\xe6\x4c\x13\xa4\xb3\xe9\xa9\xdc\x5e\x4f\x5e\x20\x0b\x7c\x4e\x16" + "\xf7\xe0\x31\x17\x45\x2b\x37\x4c\x20\xe4\xcd\x35\x1d\x0c\x3e\xb7" + "\x61\xfa\xc7\x1f\x0d\xda\x94\x9b\x71\x3d\x09\x6e\x7d\xed\xa3\x92" + "\x7b\x5e\x0e\xfa\x99\xee\xfb\x0a\xdf\x0b\x71\xfe\x65\x01\xfc\xc6" + "\xb9\x7c\xf3\x29\x1f\x29\xe6\x85\xf4\x07\xb5\x89\xdf\x12\xaf\x58" + "\xee\x59\x76\x0f\x3e\xaf\x0f\xe6\xd5\x49\xee\xe1\xde\xbb\x80\xdf" + "\xdc\x9e\x8a\xf8\xbc\x3b\x3e\x9b\xc4\x16\x44\x7b\x70\xf6\x41\x53" + "\xa9\x33\x4f\x8c\xf6\xe0\x9e\x31\x85\x76\x6e\x86\x36\x43\x1e\x19" + "\x3e\x87\xc3\x7d\xa6\x10\x45\x1e\xa4\x61\x39\xf0\x29\xd3\xc6\xe0" + "\x73\x25\xf7\xe0\x1a\xb5\x0e\xc7\xcd\xc1\x1e\xeb\xd8\x74\x29\xa1" + "\xef\xe0\x48\xbe\x6a\x93\x04\xcc\xf6\x92\xb0\x2c\x5b\x10\x55\xb1" + "\x01\xc7\xb8\xf1\xf9\x69\xee\x99\xf0\x80\xab\xa1\x7c\x69\x31\x37" + "\x86\x7b\x8f\x41\x27\xb9\xbb\x84\x5f\xfb\x82\xee\x11\x22\x09\x98" + "\x8f\xf7\xc1\x6b\x68\xfe\x7b\xda\xe9\xb3\xca\x95\x3a\x65\xca\x08" + "\x16\xce\xdf\x42\x9f\xb1\xf6\x08\xef\xda\x18\x30\xd3\xf2\x6c\x19" + "\x77\x1d\x70\x29\x00\xc7\x7f\xb9\x77\x46\xf0\xb7\xc3\xe7\x97\x79" + "\xdc\x1a\x7c\x80\x1b\xb6\xd8\x09\x1c\x01\x5e\x08\x1c\xc1\xfa\xbe" + "\x95\xa2\x63\xe8\xfc\x46\x00\xb7\x2e\x61\x0e\x60\x68\xda\xe6\x83" + "\xeb\x18\x12\x73\x2f\xe2\x82\xcf\xc1\xdf\x9b\x8d\xb8\x6c\x06\x5f" + "\xc0\xe7\xad\xb6\xd4\x1f\x7f\xdf\xcb\xe1\x69\x06\x2c\xe8\xf3\xf8" + "\xf7\x2e\xe1\xf6\x3b\x01\x9b\x81\xcf\x82\x1f\x48\x82\x7a\x21\x6f" + "\x81\x23\x6f\xc6\x77\x33\x45\x89\x34\xfd\x9f\x27\xbb\x19\x7c\xee" + "\x03\xc7\xc2\xb3\x9f\x25\x52\x1c\x53\xc7\x32\x59\xdf\xa8\x8a\x19" + "\x02\x8e\x6b\x00\xbb\x44\xe0\x2e\xc8\x7c\x33\xc8\xaf\xa8\x87\x9b" + "\xaf\xaa\x28\x32\x13\x99\x19\xf2\xe9\x24\xf7\x16\x40\x79\x8a\xc2" + "\xf1\xac\x1e\x9f\xbf\x06\x19\x26\x74\x6d\xbc\x37\x49\x90\x21\xd6" + "\x09\x9f\x9f\xce\xe6\x9e\xa3\x0f\x30\x50\x0e\x05\x1c\x10\xda\xec" + "\x48\x9e\xd9\x6f\x12\xdf\xec\x1b\xc9\x2c\xb3\xcc\x23\x94\x1d\xf1" + "\xc7\x12\x1c\x6f\x5e\xd8\x49\x08\xae\xc9\x1e\xf4\xe2\xf7\x6c\x93" + "\xde\x44\xcc\x72\x8f\x50\x9c\x9b\x30\x6d\xb8\x7e\x5c\xd0\x0b\xb8" + "\x1f\xfd\x8e\xc0\xd4\x6e\xa2\x68\x4a\xd1\xd3\x7d\xb9\xc8\x6f\xc4" + "\xb4\x0a\x6c\x38\xd8\x75\xf0\xa9\xd2\xd4\xdf\xc8\x35\x28\x2f\xb3" + "\x7c\x47\xe0\x51\xc9\x9c\x05\x8f\x25\x90\x34\xd7\xec\xe8\x1c\x6e" + "\x0d\x32\x8c\x2f\xc0\xe6\x33\xdc\xbe\xeb\x7a\x88\x4f\xb2\x77\xb8" + "\xb6\x37\xb0\x64\x4e\xb8\x23\x1b\x89\xed\x36\xe3\x38\x34\xdf\xe6" + "\x20\x6c\xb3\xa1\x9b\xe0\x58\xfe\xc2\x38\x5c\x27\xf4\x34\x31\x67" + "\x7b\x84\x62\x9b\x21\xd6\xa9\x73\x7d\x4c\x7f\xce\xe1\x81\xee\xcd" + "\x82\xbc\xcd\x1b\xfe\x58\x62\x96\x55\xd6\xe1\xbd\xb1\x0e\xf8\x1e" + "\xcd\xc2\xd3\x84\x93\x3b\xca\xbf\xa9\xdb\x44\x58\xb9\xb8\x0e\x46" + "\x17\xeb\x70\x9f\xe3\xf6\xdf\x48\x7c\x35\x6f\x52\xdc\x4d\x1b\x78" + "\x19\xa8\x71\x8e\xac\xb2\x0e\xf7\x12\x5b\x88\x75\xd0\x1f\x27\x0b" + "\x8e\x13\x0e\xff\x26\x55\x27\x31\x8d\xb8\x7e\x1c\x3e\x53\x81\xf8" + "\xa7\x18\x01\xff\x33\xdd\xb8\xb6\x87\xbe\x29\xed\x2c\xc1\xf8\xc5" + "\x78\x4a\xc5\xf4\xc7\x7f\xee\x82\xc7\x92\x5c\xc5\x7f\xee\x30\xe1" + "\x3f\xf7\x22\x68\xff\x3c\x37\xda\x3f\x6f\x98\xda\x3f\xef\x22\x68" + "\xff\xfd\x6e\xb4\xff\xfe\x61\x6a\xff\xfd\x0e\xdb\x7f\xdf\x35\x66" + "\x96\x7b\xd6\xc6\x73\x7b\x35\xfa\x00\xea\xaf\x1e\x98\x87\xcf\xd2" + "\x70\xef\x4d\xf1\xbf\x09\x7d\x8f\xca\xc3\xe6\xb7\xcc\xe6\xb7\xc2" + "\xe6\xb7\xb7\xcd\x6f\x1f\x9b\xdf\xbe\xc2\x6f\xf0\x23\x23\x4f\x48" + "\xee\x7f\x0f\xe2\xd2\x34\x9d\xe4\x81\x60\xfe\xbc\x1f\xae\x7d\x03" + "\x3e\xdd\xcf\xd1\xde\x70\x72\x09\x61\x7b\x19\x96\x70\x7b\xb6\x49" + "\x1e\x38\xd0\x93\x4e\x58\x76\xc4\x04\x15\xee\xab\x65\xd6\xc4\x25" + "\x2c\x04\x3b\xdd\xa4\xef\x86\x38\xdf\xe7\x0a\x28\xfb\x0f\xb8\x5f" + "\x20\xe2\xaa\x8c\xc7\x67\x6b\x1e\x78\x1b\xdb\x79\x63\xac\x96\x98" + "\x47\x5c\xcf\x3d\xdb\x60\xce\x8e\x4b\xd0\x8f\xb8\x7e\x02\xbb\xb5" + "\x2a\x38\x3b\xdd\xec\xd1\xd4\xd9\x42\x72\x18\xb3\x32\x39\x19\xf0" + "\xed\xdc\x4b\xd6\x76\xb2\x1d\xc9\x46\xb6\xbb\x29\x4c\x4b\x52\xf5" + "\xb8\xdf\x46\x1d\x69\xd4\xb7\x70\x7b\x6e\x70\x7b\x8b\xe8\xf7\x12" + "\x8c\x7f\x52\x31\x0f\xa4\x35\xea\xab\x48\x03\xfc\xd6\xc6\xfc\x08" + "\xed\x0c\x5c\xd2\xd4\x59\x05\xfd\xa5\xb8\x58\xb3\x2c\x2e\x84\x95" + "\xc5\x85\x36\x74\xe2\x5e\xa1\x71\x61\x58\xd7\x46\xa8\x47\x93\xb1" + "\x06\xfb\x59\x61\x5c\xb9\x86\x66\xae\x4f\x8a\x73\xb6\x66\x39\xe4" + "\x97\xc7\x85\x62\xfd\xb0\x6e\xf6\xe7\x61\xb7\xb7\x43\xdd\xef\x78" + "\x4c\x25\x25\xf8\xae\x83\x6b\x1c\x09\xcc\x70\x18\x47\x6b\x4a\x23" + "\x68\xb9\x1e\xee\x94\xeb\xd0\xfe\x43\xb9\x7c\x7d\x15\x6e\x94\xfb" + "\xe0\x4c\xc7\xe5\x96\xf1\xf5\x55\xba\x53\xae\x66\x80\x72\xf9\xfa" + "\x06\xb8\x53\x6e\xbb\xe3\x72\xcb\xf9\xfa\xa6\xb9\x51\xee\x43\xb3" + "\x1d\x97\xbb\xbd\xdd\x3d\x2e\x3c\xd4\x6f\x0f\x6b\x31\x17\xdc\xe3" + "\xc1\x43\x03\xb4\xbf\xb4\xdd\x3d\x0e\x3c\xec\x78\xfd\x07\xe0\x80" + "\x7b\xf8\x3f\x3c\x20\xfe\xee\x61\xff\xb0\x6e\x20\xec\xdd\xc3\x7d" + "\xbe\x43\xfe\x63\xdf\x00\xb0\x2f\x61\x3d\xab\x02\xcc\x39\x71\x25" + "\x66\xcf\xed\xa5\x1b\xcc\x01\xe4\xbe\x75\x84\x78\xe5\x93\xb1\xf7" + "\x15\x7e\xcf\x06\x70\x7d\xee\xf9\xf5\xeb\x0a\x08\x03\x7d\x68\x66" + "\xcf\x9a\x56\xa6\xc9\x38\x0b\xed\x96\xa9\x3c\xb1\x5b\xf2\x27\x48" + "\xdf\x07\x7e\xd0\x00\xb1\x2c\x2d\x2b\xae\x24\x27\x25\x80\x70\xef" + "\xc1\x41\x3f\x62\x61\xdc\xf7\x2c\xae\x1b\x18\xf4\x1b\xd8\xd7\x7c" + "\x5c\x87\x90\x8c\x85\x6b\x8d\xc0\x63\x28\xa7\x9b\xbc\x65\xd6\x4b" + "\x16\xea\xb9\xbc\x7a\xee\xd9\xf4\x9c\xed\xa5\xd8\x57\x60\x53\x55" + "\xb8\xa6\x98\xfe\xa8\x64\xc1\x5d\x23\xf4\x84\x29\xc2\x7d\x71\x36" + "\x2e\x98\xa5\x93\x2c\x54\xf1\xef\x92\x76\x72\x6b\xdf\x41\xdd\x71" + "\xed\xbb\x0d\xd0\x6f\xc0\xfc\x37\xc6\x12\x06\xd7\x27\x86\xbc\x11" + "\xb8\x1e\xde\x40\xef\x64\x9b\x34\x95\x19\x78\x3d\xab\x01\xff\x7c" + "\x9c\x30\x8d\x06\x3d\x61\x7d\xa3\x49\x0e\xf4\x4f\xe6\x4d\xc5\xf1" + "\x94\x93\x24\x65\x1d\x6b\xc6\xb1\x2d\x56\xb6\x63\x16\x3e\x7b\xc8" + "\xad\xd5\x2e\x59\xc8\xed\xb5\xce\xef\x65\x34\xe1\x18\xfc\xe6\xfa" + "\x48\xf8\x0c\x8e\x2c\x4e\xc5\xe6\xc8\x03\x1a\x0d\x27\xb9\xbd\x38" + "\xda\x24\x0b\xb9\x75\xc9\x4e\xc9\x2a\xd3\x0c\xb2\xca\x4c\xa8\x97" + "\x51\x68\x03\xde\x5f\x48\xc7\x3e\x21\xe6\xeb\xda\xb8\xd0\x57\x78" + "\x47\xdb\xc1\x3e\xb8\xe3\x82\x7c\x58\x3d\xca\x97\xd6\x25\x68\x3d" + "\x62\x00\x71\x48\x92\x21\x55\x35\x89\x8e\x91\x2c\xac\xc0\xbe\x36" + "\xd4\x3b\x82\xf6\x7b\xe3\x22\xb8\xfd\x3c\xc0\x1f\x3c\xa6\x62\x5c" + "\x8c\x89\x17\xe2\xaa\x82\x12\xed\x24\xf4\xbf\x41\x91\x50\xfe\x9d" + "\xd0\xa6\x7a\xda\xcf\x8b\xe3\xdf\xb3\x5c\x88\xcf\x0c\x25\xc1\x6f" + "\x25\xe6\x83\xf3\x9d\xfc\xf9\x34\xd1\xf9\x34\x7c\x16\x95\x9e\x0f" + "\x92\xf1\xe7\x33\x44\xe7\x33\x62\x27\xe1\xb8\x47\xd0\x4c\x6c\x03" + "\xc8\x31\x1c\xce\x27\x70\xeb\x17\x70\xfb\x0f\xc6\x85\xf3\xf9\x12" + "\x3a\x25\x41\x0b\x4e\x01\xc7\xe0\x7c\xb2\xe8\xfa\xe4\xfd\x49\xfe" + "\xe4\xbe\x42\x94\x61\x50\xb8\x8e\xd9\x75\x80\xf6\x95\x17\x46\x71" + "\x6d\x07\x1f\x2a\x2e\x4f\x27\x09\x9a\x86\x7e\xd2\x00\x31\x1a\xe4" + "\x09\xc1\x7b\x8a\xe5\x2d\xbc\xed\xa9\x8c\x88\x5e\xa2\x5c\xb6\xf2" + "\xf9\x18\x7c\x5b\xcf\xfa\x3d\x34\x05\xbe\xcf\x6a\xd6\xec\x54\x37" + "\xe5\xe3\xfb\x75\x0a\xee\x5d\xee\x3c\xc0\xd1\x98\xb3\xbb\xc4\xe4" + "\xb9\xdb\xdf\x94\xb3\x23\x38\xf5\x34\x61\x52\x7c\xd8\x1f\xb4\x6b" + "\xe6\x90\x13\x92\xa0\xb3\xdc\xbe\x86\x4a\x6e\xbd\x7b\x83\x76\xcd" + "\x67\x90\x16\x3c\x16\x65\xd1\x14\x4e\xd3\xde\x4d\xa9\x63\x3e\x4d" + "\x69\x65\xea\xc3\x4f\x92\xfd\x3e\x7a\x72\x40\x79\x12\xd7\x7c\x35" + "\xbc\x6b\x6e\x66\xf0\xd9\x5c\xc8\xbf\x04\xef\x85\xe3\x07\xf8\x9d" + "\x8e\x85\x04\xfd\x88\xf7\xc1\xe7\x16\x41\x36\x3f\xe3\xfd\xa0\x7d" + "\x1d\x23\x0a\xf0\x39\x67\x22\x83\x7c\x3b\xcc\xd9\x3b\xd5\x9c\xbe" + "\x6f\x0c\xca\x37\x32\xb2\x72\xfe\xfd\x3d\x52\x30\x0e\x9f\xd1\x0d" + "\xce\x15\xbd\xcf\x26\x3b\xc5\x90\x7b\x20\xad\x5c\x58\x8f\x02\xf7" + "\x05\x72\x64\x3f\xce\x42\x3f\xf9\x6c\x41\x54\xa6\x59\xb6\x13\xe4" + "\xbb\x53\x5d\x57\x47\x70\x9c\x46\x82\xcf\x19\x77\x4a\x1e\xcd\x60" + "\xe5\x3b\x43\x53\x50\x4f\x41\x16\xbb\xf1\x19\x42\xcf\xdd\x25\x55" + "\xf8\xcc\x60\xce\x6e\xff\xca\xc4\x6e\xe6\x8b\xfa\x1a\xa2\xfc\x3b" + "\xc6\x58\x8f\x5c\xfd\x70\x04\x6b\xbc\xbe\x45\x4b\xea\xdb\xdf\x21" + "\x5f\x1e\xae\x23\xb2\x30\x32\x22\x55\xc7\x9a\xb8\xb1\x84\x04\xc2" + "\x04\xe9\xc8\x08\x5c\x2b\x09\xd7\x47\xc7\xfd\xbd\x1b\xbb\x1b\x20" + "\xee\x79\x35\x62\x4f\x4a\xc7\x48\xe5\xa3\x04\xe2\x25\x3a\x27\xcd" + "\xbd\xff\xa3\xe7\xde\xbf\x96\xe3\xf8\xb8\xe8\xbd\x1f\xe9\xba\xe3" + "\xc4\xa3\x41\x7d\x84\x24\x87\xb3\x66\x7c\xc6\x2f\x28\x7c\x04\xcb" + "\xbd\xfb\x93\x04\x99\x63\x01\xd3\xd5\x2a\xcf\xd7\x13\x89\x77\x63" + "\x82\x8e\x34\x75\xd4\x91\x6d\xf1\xc4\x9b\xed\x52\x8f\xae\xaf\xff" + "\x82\xb0\x39\x63\x94\x6f\xa5\x68\x47\x0a\xcf\x63\x79\xad\x97\xe0" + "\x78\xa8\xa7\x06\x9f\xcb\x3a\x43\xfc\x9f\xfe\x31\x8d\x1b\xc3\xc5" + "\xf1\x72\x63\x97\x4a\xd9\xdb\xa5\xba\xae\xa7\x4b\x35\x49\x18\x67" + "\x5f\x1c\xa9\x20\x85\xf8\xce\xd0\xc6\xfb\xfc\xf0\x9d\x21\x8c\x2f" + "\x8d\x72\x4f\x15\x8e\xa9\x73\x6b\xbf\xac\x56\xf9\x9a\x97\xa9\xc8" + "\x0c\x3d\xf7\x4e\x12\x8e\xf3\x2b\x8a\x96\x42\x7d\x3b\x4f\x12\xf1" + "\xb3\x45\x67\x57\xab\x18\x7c\xae\x88\xdd\x18\x5c\xdb\x53\x18\x95" + "\x89\xcf\x17\x81\x5f\x98\xe5\xba\x6e\x3f\xca\xc5\xcf\xd8\x7e\xc0" + "\xa3\xa4\xea\x24\xe2\x03\x38\x9d\xd4\x33\x88\x45\x43\x04\xe2\xd0" + "\x6c\x85\x03\x87\x5b\x7c\x37\x83\x78\x20\x16\x88\x89\x05\x8f\x6f" + "\x38\x3c\xaa\xcc\x14\x8f\x1e\xf0\x07\x02\x26\x67\x7d\xa3\xf2\x07" + "\xc2\x05\xf1\x40\x6c\xea\xdb\x8f\x10\x2b\x4c\xf4\x14\x13\x90\xe7" + "\x38\x01\x17\xc4\xa4\xa9\x13\x62\x5e\xc0\xe5\xa1\x6f\x08\x79\x78" + "\x2a\x6b\x6e\x98\xff\x75\x1f\x3e\x46\x47\xf8\xfc\x6c\xc1\x07\xb0" + "\xef\x8f\xcf\x71\x05\xce\xfb\x20\x3e\x15\xae\xe0\x53\xdf\x4e\xf1" + "\x31\xf2\xf8\x4c\x0d\x24\x4c\x77\x97\x8a\xd9\x9a\x48\x66\xcd\xff" + "\x51\x49\x3e\x0f\x6d\x20\x20\xeb\xf9\xe6\xec\xca\x24\xf7\xf4\xe8" + "\xb1\x7a\xe7\xf5\x28\x64\xf1\x65\x3d\x72\x55\x8f\x42\xa4\x43\xd3" + "\xa3\xc7\xf2\x2f\xeb\xd1\xf9\xd2\xa3\xc7\xf2\x6c\xf5\xa8\xcf\x57" + "\xc7\x2f\x8f\x5e\x12\x19\x13\x19\xf3\x8c\x72\xe9\x0b\x09\xcb\x57" + "\x51\x8f\x6d\xe5\xb3\x7d\x4c\x29\x01\x0c\xee\xd1\x5d\x9f\xdf\x4c" + "\xde\x9a\xd0\xcc\x98\x7e\xf2\x91\xb2\x1a\x65\xac\x59\xa3\xd4\xe3" + "\x7e\xdd\xa8\x6f\xb8\x8f\xf7\x51\x49\x98\x07\xae\xf3\x47\xd7\x4b" + "\x09\xa3\x7b\x0e\xfa\x46\xfb\xe0\xfc\xcb\x86\x1e\x38\xd6\x10\xa9" + "\x57\x37\xf1\xd0\x4e\xc2\xf3\x8b\x96\xe3\x9a\x64\x6c\x61\xb4\x4f" + "\x11\xee\xaf\xdd\x43\xa4\x06\x59\x9c\x32\x03\xca\xd3\xcb\x77\xaa" + "\xa5\x4a\x7c\x97\xe4\x71\x03\xf8\xe4\x6a\xcb\x3a\x44\x8b\x54\xec" + "\x15\x8f\xcf\x45\x5d\xc7\xf7\xfa\x4e\x48\x42\xa7\x9e\xc5\xb5\xd9" + "\x21\x86\x7d\x6c\x2a\xdc\x6b\x62\x54\x3e\xb7\xc6\x02\xe8\x3d\x3d" + "\xff\x44\x03\xd6\xa1\x57\xb6\x23\x98\xdb\xeb\x5c\xb6\xbb\xe4\x94" + "\x66\xb7\xff\x17\xc9\xd5\x44\xf9\x28\xea\x7d\xe8\x63\x0f\xe5\x83" + "\xde\x07\x6b\x49\x83\x4f\x25\xf9\x32\x14\xf8\x16\x3a\x98\xde\x8b" + "\x78\x36\xc9\x39\xbd\x17\xf8\x85\xbc\x42\x7e\x21\xb7\xae\x04\x6e" + "\x21\xdf\x04\x7e\xbd\x7a\x86\xf2\xcb\xeb\x30\x51\xbc\x7e\x12\x38" + "\x66\xa4\x1c\xc3\x77\x9a\x1b\x92\xbe\x76\xac\xff\x67\x6c\xf8\xc5" + "\xf0\xfc\x5a\x0d\xfc\x5a\x6d\xe1\xd7\xa2\x23\x0a\xb2\x8d\xe3\xd7" + "\x1c\x0b\xbf\xb2\x3d\x55\x02\xb7\x90\x67\xc8\x29\xf3\x33\x2a\x82" + "\x3a\x2f\xf0\xac\x68\x05\x9d\x43\xe5\xf4\x9f\x01\xfd\xef\x12\xf9" + "\xd1\x89\x43\xd1\xff\x27\x38\xfd\x47\x4c\x10\x1f\xc4\x05\xb1\xb8" + "\x14\x71\xc0\xfd\x8c\xd9\x2e\x7b\x58\xdc\x5b\x3d\x18\x16\x88\x03" + "\xe2\xc1\xe1\x00\x78\x08\xf3\xd9\x38\xbf\x89\x98\x20\x16\x37\x26" + "\x13\x06\x71\x29\x02\x9d\x47\x3d\x07\xd9\xe6\x21\x2e\x5c\xec\x9a" + "\x2e\x8f\xca\x1b\x67\xd9\x13\xa6\x6b\xe3\xa2\xc0\xfe\x71\xeb\xa2" + "\x30\xcb\x3a\x6a\xa1\x5c\xbf\x4c\x3b\x01\xd7\xc0\x7e\x9c\xef\xb3" + "\xec\xa4\x7b\x86\x48\xc2\x3e\xe4\x75\x9a\x60\xff\x8f\xeb\xeb\x99" + "\xa0\xaf\x27\x83\xbe\x9e\x06\xfa\x7a\x38\x16\xc7\xad\x3d\xb0\xe8" + "\x3d\x3a\x4f\x06\x7d\x3b\xf9\x8e\x59\xd0\xcf\x50\xa1\xfc\xb8\x39" + "\x59\x79\x65\x1a\xce\x21\xb1\xd9\xd0\x8f\x2c\x65\x08\xfc\x06\x0e" + "\x99\x5c\xe4\xce\xa2\x16\x7e\xce\x39\x9c\xae\xc5\x17\x56\x4e\xeb" + "\xf7\x38\xf7\xdc\x02\x37\x5f\xc7\x98\x4b\x4c\x1b\xac\xe7\xeb\xc4" + "\xf3\xb9\x6f\xa5\xe8\xf9\xb9\xba\x30\x61\x9d\x6f\x03\xda\xb5\x3d" + "\x29\xcd\x8c\x65\xbe\xee\x6b\x3c\x6f\x33\x5f\x17\xc6\x8d\xf7\xea" + "\x24\x61\x35\xf8\x8c\x0a\xfc\x4e\xa0\xe9\x8f\x57\x89\xd3\x2d\xf3" + "\xe1\x34\x1d\xdf\x89\xe2\xfb\xdb\x9d\xb4\xaf\x1d\xd6\x2c\xf4\x69" + "\x1d\xc4\x37\x2e\xd8\xdd\x25\x79\x16\xbb\xbb\x24\x8f\x93\x8d\x4f" + "\x55\x60\x43\x3f\xbb\x8b\x6b\x5a\x85\xff\xb6\x10\xed\xae\x66\x47" + "\x00\xad\xdf\xe2\xc5\x20\x93\x11\xb8\xaf\x1b\xa6\xe3\xbb\x43\x68" + "\x7f\x0b\xe1\xba\x42\xce\x26\x57\xcd\xca\xe0\xe6\xe5\x17\xa7\x59" + "\xdb\xe2\xf0\xbd\xd6\xb6\x78\xf1\x7b\x03\xdb\xe2\xa7\x9f\x18\xd8" + "\x16\x2f\xfe\xe1\xb2\x2d\x76\xd7\x16\x43\x2c\x36\x24\x5b\xfc\xb4" + "\xdf\x65\x5b\x7c\xae\x6c\xf1\xd3\x4a\x91\x2d\x7e\xdc\xda\x16\x87" + "\xb7\xf4\xb7\xc5\xe1\x1d\x16\x5b\xbc\x58\x63\xb1\xc5\x8b\xe7\x5a" + "\xdb\xe2\xa5\xf3\x9c\xb3\xc5\x4b\xee\x3d\xb7\xb6\x78\x49\xb8\xb5" + "\x2d\x5e\xea\xcf\xdb\x95\x29\xae\xdb\xe2\xa5\x63\x07\xb6\xc5\x4b" + "\xaf\xb1\xb6\xc5\x4b\x3a\xa9\xcd\x5d\x3a\x97\xda\xe2\xa5\xfc\x3b" + "\xa7\x8b\xfd\xc4\xe9\x16\x5b\x4c\xd3\xfb\xdb\xe2\xa5\x61\x83\xd8" + "\x62\x95\xc9\x2c\xd8\xe2\x56\xb0\xc5\xad\x8c\xf9\x19\x47\xb6\xf8" + "\x19\x4d\x03\xda\xe2\x78\xb4\xc5\xcf\x68\x06\xb6\xc5\xcf\xbc\x80" + "\x36\x17\xf8\x4a\x0a\xb6\xb0\x1d\xb8\xe6\xa2\x76\xc5\xb7\x38\xae" + "\xdb\x8e\xfc\x3c\x2a\x59\xf1\xd5\xc2\x64\xb1\xad\x5e\x36\xba\xcf" + "\x56\x43\xba\xf9\x1a\x6b\x5b\x8d\x76\x1a\xed\x75\xe1\x16\x56\x57" + "\xb4\x85\x3d\xdc\xb5\x71\xd9\x4c\xc1\x66\x67\x43\x1a\xee\xad\x81" + "\x6b\x02\x15\x9e\xe1\x0e\x29\xc8\xa0\x7d\x03\xdc\x17\xaf\x81\xbc" + "\xe1\xd6\xf6\x7d\x45\x9e\x71\xa3\xd8\xbe\x2f\x7b\x0d\xed\xbb\x86" + "\xbe\x17\xcf\xd9\x75\x63\x61\x54\x3e\xda\x7a\x7a\x7e\xf9\xed\x03" + "\xdb\xf7\x65\xfb\x2e\x94\x7d\x47\x9b\x72\xa5\xa8\x2f\xe7\xc8\xae" + "\x40\xdb\x0c\x0d\x11\xe7\xc7\xbe\xa3\x3d\x41\x3b\x82\xb6\x45\xb0" + "\xef\x68\x5b\x8c\x7c\x5f\xbb\x20\x5d\x64\xdf\xaf\x10\xd9\x77\x89" + "\x3b\xf6\x7d\xb9\xf4\x77\x65\xdf\x11\x87\xe4\x73\x6b\xdf\x85\x7e" + "\x35\xe2\x80\x98\x20\x16\xe2\xbe\x35\xe2\x80\x78\x20\x0e\x18\xd3" + "\x08\xf6\x7d\x7a\x12\xb5\xef\x85\x7d\xf6\x7d\x39\xe9\xb3\xef\x0c" + "\xb5\xef\x05\xb8\xee\x1b\x37\x46\xbc\x62\x6f\x7f\xfb\xbe\xa2\xce" + "\x62\xdf\x97\x45\xf1\xf6\xae\x1d\xd7\x6f\x00\xfb\xa5\xb7\xb6\xf1" + "\xea\xbb\x9c\xb3\xf1\xcf\x4c\xe9\x67\xe3\xf9\x3d\xee\x79\xfb\x9e" + "\x86\xf6\xdd\x88\x76\xde\x2d\x1b\xff\xcc\x5c\x8b\x1f\x5a\xda\x4c" + "\x6d\xeb\x0a\x9d\xb5\xdd\x57\xab\x78\xbf\xf4\xb6\xd8\xee\x9b\x47" + "\x38\x63\xf7\xd5\xa3\x05\xbb\x8f\x76\x75\x8f\xb9\x55\x64\xf7\xd1" + "\x4e\xaa\xc7\x6a\x13\xdb\x44\x76\xff\x99\x76\x5a\x07\xf5\x6c\x13" + "\x67\xf7\x9f\xe9\xe6\xfd\x47\xb5\x38\xdd\x62\xf7\x69\xba\x49\x6c" + "\xf7\x3b\xd0\xee\xab\x43\x06\xb1\xfb\x33\x9d\xb7\xfb\xd1\x46\x8b" + "\xdd\x8f\x36\x0e\x6c\xf7\xa3\x7f\x46\xbb\xcf\xad\x11\x0b\xd8\x03" + "\x9f\xa5\x39\xe3\xa9\xcd\xc7\x31\x11\xf0\x05\x3a\x5c\x37\x04\xf2" + "\x7d\x53\x8c\x7e\x01\x0e\x38\xdf\xa1\xc1\xef\x66\xee\x9a\xc3\x5e" + "\x7a\xe2\x81\x3e\x40\x73\x94\x48\x71\x8f\x22\x2a\xa7\xe8\x9b\xe0" + "\xda\x56\x8b\xbf\x88\xbc\xdd\x49\x7f\x81\x7b\xb3\x37\x77\x6d\x8c" + "\x8c\x10\xf9\x0b\xdc\xe7\xa9\xd9\xc6\x5f\xe8\xc0\x5f\xb4\x0b\xd7" + "\x40\xfe\x3c\x71\x7e\xac\x1f\x97\xff\x28\x77\x60\xfe\xd6\x0d\xb8" + "\x67\x19\xe7\x5f\x22\xb5\xd6\xfe\x25\xca\x60\xb6\xea\x3f\x44\x9e" + "\x16\xfc\x0b\xfa\x67\x73\x3f\xff\xf2\xdc\xd6\x3e\xff\x32\x5e\xe4" + "\x5f\x92\x04\xff\xf2\xec\xe4\x8b\xbe\xff\x30\x04\xbb\xe6\xae\x7f" + "\x41\x9b\x86\xf6\x6c\x20\xff\x62\x16\xf9\x17\xb3\x5b\xfe\xe5\xb9" + "\x88\xdf\x95\x7f\x39\x0f\xfd\x07\x31\x06\x88\x0b\xe7\x5b\x00\x1b" + "\xc4\x01\x31\x40\xf9\xe3\x7a\xd4\x88\x0d\xe2\x82\x98\x4c\x8f\xb5" + "\xf8\x16\x0e\x17\xce\xbf\x3c\x17\x6e\xeb\x5f\x8a\xc6\x09\xfe\x25" + "\xda\xbb\xbf\x7f\x89\x56\x59\xfc\x4b\x24\x37\x7e\x43\xd7\xfd\x8b" + "\x54\x5a\xfb\x96\x98\x3d\xce\xf9\x96\xe8\xf5\x76\x7c\x0b\xb7\x7e" + "\xa3\x66\x8b\x55\xdf\x21\x0d\xfc\x8b\x1b\xbe\x25\xba\x84\xd6\x11" + "\x9f\x8d\x56\xeb\xa9\xfd\x8e\x9e\x6d\xf1\x37\xea\x3a\x71\x9a\xc5" + "\xdf\xc4\xe4\xf3\x3e\x72\x97\xeb\xfe\x26\xe6\x05\xee\xd9\x03\x68" + "\xc3\x9e\x93\xd4\xa6\x5b\xfb\x9b\x98\xf5\xd6\xfe\x26\x26\x84\xd6" + "\x21\xa6\x8a\xfa\x9b\x18\x35\xef\xb7\x2a\xc4\xe9\x16\x7f\x43\xd3" + "\xfb\xfb\x9b\x98\x03\x83\xf8\x1b\x59\xaf\x6f\x54\x7e\xaf\x66\x77" + "\x9a\xb1\x3c\x5a\x39\x2d\xf4\x1e\x93\xad\xde\x50\x7d\x31\xd1\xfd" + "\x6f\x84\xf9\xa7\xa7\xe8\x7c\x87\x99\x7f\xbf\xb8\xc7\x37\x2a\xf3" + "\x68\x14\xe8\x4e\xa7\x63\xdd\x01\xbd\xf1\x10\xf4\xa6\x41\xfd\x23" + "\x01\x5d\x62\x70\x4e\x6a\x1b\xe8\x4c\x93\xa1\x95\xd3\x21\x59\x7b" + "\x00\xc1\x35\x1d\xe5\x9d\x44\x21\x97\x48\xae\xc0\xf9\x0e\x13\xe8" + "\xcf\xbc\xa9\xac\xf9\x86\xd6\x00\x22\x57\x13\x4f\xd4\xa1\x37\xf9" + "\x79\x0f\x5c\x1b\x02\xe7\x3b\x80\xbf\xfe\x4f\x7f\x65\x99\xef\xe8" + "\x71\x62\xbe\xa3\x29\x49\xc7\xcd\x77\xe0\xfb\x52\x66\xd0\x13\xee" + "\x1d\x1e\x9c\xef\xe8\xe6\xe6\x88\x38\xfb\x55\xcc\xcd\x77\xb4\x11" + "\x9c\xeb\x10\xd6\x86\xc1\x39\x8e\x1b\x42\x09\x83\x6b\x47\x6c\x03" + "\xbd\xf9\x5c\xd5\xc0\xe9\x8d\xeb\x36\x2c\x56\x35\xd0\x33\x3f\x46" + "\x90\xa9\x49\xb6\x3b\x8d\x7d\xbd\x2a\x76\x77\x5b\xb7\x04\xd7\xcc" + "\x34\x01\x46\x66\xb0\x55\xac\xcc\xc6\x56\xf5\xf2\xf2\xee\xa5\xf2" + "\x06\xac\x3c\x9e\x32\x10\x16\xd2\xe9\x9a\x99\xdd\x3a\xe0\x9a\x6a" + "\x5c\xe1\x1a\x94\xad\x3f\x29\xe4\xd7\xcd\x34\xaf\x55\x8f\x36\x83" + "\x3c\xf1\x3d\x89\x3d\x67\xba\x47\x9a\x64\x1e\xa1\x9a\x1e\x32\x0d" + "\xec\x92\x1c\xed\x12\xf0\x73\x4c\x71\x0f\xc8\xf6\x07\x2a\x5b\x5c" + "\xc3\x0d\x3f\x8d\x6b\x55\x4a\x28\xfb\xba\xde\x5e\x90\x6f\x37\x95" + "\xef\x53\x71\x0a\x52\x24\xcc\xf7\x81\xaf\x6f\x04\x4c\x39\xbb\x64" + "\xf0\x62\x71\xdf\x09\x53\xaf\xca\xd7\xfc\x13\xc8\xd7\x80\x7b\x8c" + "\xa8\x10\x7f\x45\xd1\x51\x9c\x9f\xfc\x96\xce\xf7\xc9\xf9\x35\x39" + "\xd6\x82\x8f\x00\xd3\xd1\x54\x01\x36\xfa\x8a\x98\xd6\xde\xc2\xa8" + "\x4c\xae\x0f\x92\xec\xaa\x7c\xe3\x32\x2f\x8c\x7c\x95\xbf\x23\xf9" + "\xc6\xc6\xba\x2f\xdf\x78\x87\x6b\xa5\x9f\x5b\xf9\x2a\x7e\x47\xf2" + "\x8d\x6b\x76\x5f\xbe\x09\x81\x03\xc9\x17\xfb\x09\x42\x1f\x41\xe8" + "\x1f\xa0\x5f\xa1\x3e\x34\x51\x6b\xe9\x1b\x24\x6a\x85\x79\x51\x90" + "\x8d\x34\x1b\xd7\x84\x86\x36\xc7\xae\xc0\x7d\x17\x12\x6f\x11\xe6" + "\x44\x73\x71\x6f\x11\xc4\xea\x75\xc0\x2a\x06\xdf\x87\xe1\x71\x02" + "\x3f\xf0\xb4\x01\x6c\xf5\xc4\xa8\x7c\x53\x36\xf8\x89\x1d\xd1\x4a" + "\x07\x98\x31\x68\xe3\xe5\x09\x44\xf1\x54\x2c\xc5\xce\xbc\x16\x30" + "\xeb\x81\x98\xa8\xbb\x83\xe0\xfb\xad\x5e\x1d\x60\x57\x7b\xd5\xa3" + "\xc3\x20\xc6\x16\x70\x7b\x33\xb1\x9b\x8b\x87\xec\xe2\xb6\xd5\x1a" + "\xb7\x53\x76\x70\xb3\x3c\x67\x00\xb1\x29\x87\x9b\x8e\xc3\x8d\xb3" + "\xeb\x6b\x21\x36\x05\xfc\x04\xdc\x38\xbb\x0e\xd8\x71\xb8\x75\xb6" + "\x71\x31\x90\x60\xd7\x31\xfe\x41\xec\xea\xc3\x21\x9e\xdb\xb8\xca" + "\x9f\xc3\x0d\xc7\xb6\xc3\x5d\xc5\x2d\x91\x58\xc7\x3d\xab\xa3\x9d" + "\x8b\x7b\x12\xd7\x61\x5c\x23\x8e\x7b\xf0\xf7\x29\x88\x73\x4c\xf2" + "\xca\x0c\x83\x5b\xfd\xe8\x44\x8d\x75\x0c\xb3\x3a\x94\xd6\x29\xe1" + "\x73\xd7\x63\x98\xd5\xdc\x78\xdb\x9e\xd7\xed\xc5\x2f\xab\xef\xb5" + "\x8e\x5f\x56\x7b\xd3\x38\x65\x75\xd4\xa9\x74\x8c\x5f\xc0\x21\x73" + "\xe9\x09\x07\xc4\xe9\x96\xf8\x85\xa6\x73\x7b\xa2\x6f\x5c\x9d\xe4" + "\x5a\xcc\x32\xe3\x02\xc7\x2c\xfe\x03\xc4\x2c\xfe\x97\x58\xcc\x92" + "\xe4\xf0\xf9\xff\xcb\x3e\x55\xb0\xf9\xab\x35\xee\xdb\xfc\x35\x0e" + "\x9f\xff\xbf\xec\x53\x05\xf9\xbe\xe0\xe7\xbe\x7c\xd7\x16\xb8\xef" + "\x53\x53\xbc\x2d\x3e\x35\xc5\xdb\xb1\x4f\x5d\xb7\xe9\xb2\x4f\xb5" + "\xe7\x53\xd7\x64\xb8\xef\x53\xd7\x85\x58\xfb\xd4\x94\x7d\xce\xf9" + "\xd4\x75\x5f\x0d\xbf\x4f\x5d\x67\x33\x0e\x9d\x52\x45\xeb\x94\x7c" + "\x8d\xeb\x3e\x35\x25\xdb\xb1\x4f\x4d\x79\xcd\xda\xa7\xa6\xa8\xa9" + "\xef\x4c\xd1\x52\x9f\x9a\x92\x4c\xd3\x93\x7d\xc4\xe9\x16\x9f\x4a" + "\xd3\xa9\x4f\x4d\xa9\x77\xcd\xa7\x5e\x7b\x81\x7d\xaa\x72\x00\x9f" + "\xaa\xbc\xc4\x7c\x6a\xda\x40\xeb\xff\x5e\xb6\xf9\x9c\xcd\x4f\xd1" + "\xb9\x6f\xf3\xd7\x3b\x7c\xff\x6d\x70\x9b\x9f\xe1\x61\xb1\xf9\x19" + "\x1e\x8e\x6d\xfe\x86\x75\x97\x6d\xbe\x3d\x9b\x9f\x96\xe4\xbe\xcd" + "\xdf\x10\x68\x6d\xf3\x33\xde\x73\xce\xe6\x6f\xf8\x7c\xf8\x6d\xfe" + "\x06\x9b\xe7\xff\x32\x4a\x68\x9d\xd2\xe5\xae\xdb\xfc\x8c\xf5\x8e" + "\x6d\x7e\xc6\x26\x6b\x9b\x9f\x11\x46\x6d\x7b\xc6\x5e\x6a\xf3\x33" + "\x62\x69\x7a\xba\x4c\x9c\x6e\xb1\xf9\x34\x9d\xda\xfc\x0c\xad\x6b" + "\x36\xdf\xeb\x02\xdb\x7c\xc5\x00\x36\x5f\x71\x89\xd9\xfc\x8d\x7e" + "\xee\xdb\xa4\xcc\x02\x8b\x4d\xca\x2c\x70\x6c\x93\x32\xc7\x5e\xb6" + "\x49\xf6\x6c\x52\x46\x8b\xfb\x36\xe9\xbf\x0e\x5b\xdb\xa4\x4d\x0f" + "\x3a\x67\x93\x32\x9f\x18\x7e\x9b\x94\xa9\xb6\xb6\x49\x9b\x66\xd2" + "\x3a\x6d\xdc\xee\xba\x4d\xda\x74\xb5\x63\x9b\xb4\x69\xa2\xb5\x4d" + "\xca\xe4\xe7\xcc\x36\x05\x52\x9b\xb4\x49\x4a\xd3\x37\x96\x88\xd3" + "\x2d\x36\x89\xa6\x53\x9b\xb4\x69\xb0\xe7\x1f\x38\xee\x37\xf8\xd8" + "\x70\xff\x39\x81\xfb\x2f\x55\x7d\x59\x20\x70\xff\x25\xfa\x9c\x73" + "\x41\xb4\xcf\x4b\x89\x44\xaa\xc1\x7d\x4d\x40\xdf\x63\x9f\x44\xee" + "\xbf\x34\x19\x9f\x3f\x90\x1d\x06\x1b\xd6\xce\xdb\xb4\x24\xb0\x69" + "\xed\xf0\x1b\xd7\xbb\x9a\x18\xed\x83\xb6\x08\xf7\x41\xc0\xdf\xd4" + "\xb6\xe9\x47\xe2\xbb\x9b\x2e\xbd\x57\xd5\xce\xbf\x57\x15\xd1\xff" + "\xbd\xaa\x02\xd1\xfb\x3b\xa8\x1b\xf2\xf5\x12\x4f\x9c\x0b\x06\xfb" + "\xc6\xdb\xb1\xba\x91\x46\x19\x6f\xc7\xce\x80\x1d\x3b\x63\xd1\x09" + "\xb4\x63\xa7\xc0\x8e\x19\x56\xab\x26\xa1\x2d\xeb\xff\x4e\x15\x9d" + "\xfb\xe5\xec\x58\xb6\x8d\x1d\x7b\xc6\xc6\x8e\xad\x00\x3b\x16\x0e" + "\x76\x4c\x6e\xd1\x87\x3f\x1d\x26\xcc\xfc\x25\xa0\x13\x60\xc7\x5e" + "\x3d\x83\x76\xec\x73\x37\xed\x58\x56\xa7\xb5\x3e\x68\x9e\x70\x4e" + "\x1f\x5e\x8a\x74\xa4\x0f\xbd\xd9\xee\xea\xc3\x4b\x49\xd6\xfa\xa0" + "\x99\xcb\xeb\x68\xa1\xeb\xfa\xa0\x99\xd2\xa7\x0f\xcf\xd9\xea\x83" + "\x66\xba\xb5\x3e\x68\x08\xe5\xbd\x26\x94\xea\x83\xc6\x9b\xd7\xa9" + "\x02\x71\xba\x45\x1f\x68\x3a\xd5\x07\x4d\xc4\xe5\xf9\xd9\x8b\xd5" + "\x47\x67\xd7\x5d\x9e\x9f\x1d\xac\x5f\xa6\x49\x72\xbf\x5f\xb6\xf9" + "\x02\xcd\x7f\xff\x9e\xc6\x92\x73\x14\xee\xcb\x37\xf7\x02\xcd\x7f" + "\xff\x9e\xc6\x15\x36\x0f\x61\xfe\xfb\xe5\x01\xe7\xbf\x07\x8e\x63" + "\xf2\x92\xea\xfb\x62\xf8\xbc\x24\xe1\xd9\xcd\xfe\x31\xfc\xab\xc7" + "\xad\xdf\x9d\x7a\x65\xab\xed\xbb\x53\x83\xc5\xf6\xc6\xff\x53\xb1" + "\x7d\x6e\xb3\xfb\xb1\xfd\xab\x35\xd6\xb1\xcc\x6b\x53\x9c\x8b\x65" + "\xf2\x6e\x71\x14\xcb\x18\xdd\x8e\xed\xf3\xe6\x5a\xc7\x32\xaf\x29" + "\x78\xfc\x97\xbb\x1e\xcb\xe4\xfd\xe6\x38\x96\xc9\x3b\x6b\x1d\xcb" + "\xe4\xd5\xd3\x98\xe5\x35\x3f\x1a\xcb\xe4\xe9\x68\xfa\x2b\x11\xe2" + "\x74\x4b\x2c\x43\xd3\x69\x2c\xf3\x9a\xff\xe5\x79\xdb\x8b\x35\x96" + "\xd9\x92\x77\xd9\xd7\x0e\xe6\x0b\x5e\x9b\xeb\xbe\x2f\xf8\x87\xe1" + "\xb2\xaf\x1d\x4c\xbe\x5b\x0e\xbb\x2f\xdf\xad\x21\xee\xfb\xda\x6d" + "\xed\x16\x5f\xbb\xad\xdd\xb1\xaf\xdd\xf6\x84\xb5\xaf\x7d\x7d\xe4" + "\x65\x5f\x3b\x90\xaf\xcd\x9f\xed\xbe\xaf\xdd\xe6\x67\xed\x6b\x0b" + "\x5e\x76\xce\xd7\x6e\xdb\x3e\xfc\xbe\x76\x5b\xb5\xb5\xaf\x2d\x48" + "\xa6\x75\xda\xfa\x95\xeb\xbe\xb6\x60\xb1\x63\x5f\x5b\xb0\xdc\xda" + "\xd7\x16\xcc\xa2\x3e\xb5\x20\x97\xfa\xda\x82\xf9\x34\x7d\x6b\xb3" + "\x38\xdd\xe2\x6b\x69\x3a\xf5\xb5\x05\x05\x97\xe7\x73\x2f\x56\x5f" + "\x5b\x44\x2e\xfb\x82\xc1\x7c\x41\x41\xb5\xfb\xbe\xa0\x38\xdc\x7d" + "\x5f\xb0\x5d\x6f\xf1\x05\xdb\xf5\x8e\x7d\xc1\xf6\xe5\xd6\xbe\xa0" + "\x64\xec\x65\x5f\x30\x90\x2f\x28\x0a\x74\xdf\x17\x6c\xf7\xb7\xf6" + "\x05\xa5\x85\xce\xf9\x82\xed\x7b\x86\xdf\x17\x6c\xaf\xb5\xf6\x05" + "\xa5\x99\xb4\x4e\xc5\x47\x5c\xf7\x05\xa5\x91\x8e\x7d\x41\x69\x9c" + "\xb5\x2f\x28\x9d\x4b\x6d\x7e\x69\x01\xf5\x05\xa5\xa1\x34\xbd\xf8" + "\xb0\x38\xdd\xe2\x0b\x68\x3a\xf5\x05\xa5\x15\x97\xe7\x79\x2f\x56" + "\x5f\x50\x2e\x73\xdf\x56\xed\x2c\xb0\xd8\xaa\x9d\x05\x8e\x6d\xd5" + "\xce\xb1\xd6\xb6\xaa\xfc\x93\xcb\xb6\x6a\x20\x5b\x55\x5a\xeb\xbe" + "\xad\xda\x61\x33\xff\xfb\x86\x93\xf3\xbf\x3b\x1d\xce\xff\xba\x6f" + "\xab\x76\xda\xcc\xff\xbe\xc1\xcf\xff\x96\x6f\x72\xdd\x56\xbd\x71" + "\xb5\x63\x5b\xf5\x86\xcd\xfc\xef\x4e\x7e\xfe\xf7\x0d\x7e\xfe\xf7" + "\x0d\x7e\xfe\xb7\x3c\x53\x9c\x6e\xb1\x55\x34\x9d\xda\xaa\x37\x86" + "\x38\xff\xbb\xeb\x80\x65\xfe\x77\x17\xf7\xce\x80\x39\xbf\x2a\xb0" + "\xff\xfc\xef\xae\xdb\xad\xd7\x31\x79\xe3\x1b\x6e\x2e\x18\xf5\xc2" + "\x40\xdf\x4d\xb7\x3b\x2f\x7c\x4d\x55\xe0\xe5\x79\xe1\xe1\x98\x17" + "\xde\x25\xb5\xd6\x93\xca\x38\xe7\xf4\x64\xd7\xfa\xe1\x9f\x17\xde" + "\x95\x6b\xad\x27\x95\x61\x3c\x27\xdc\x98\x17\xae\xbc\xcb\xb1\x9e" + "\x54\xce\xb3\xd6\x93\x4a\xfe\xb9\xdc\xca\x58\xaa\x27\x95\xd3\x78" + "\x5d\x2b\x10\xa7\x5b\xf4\xe4\x0d\xd1\xbc\x70\x65\xb2\x33\x3e\xdd" + "\x28\xdb\x9d\x81\x3e\x7a\x5a\xeb\x3d\xa6\x3e\x3e\x27\xf0\x7c\xb6" + "\xe7\xd3\x97\x52\xdb\x8f\x3c\xee\x2d\x8f\xf6\x1b\xd4\xa7\xb7\xf3" + "\x3e\x3d\xa2\xbf\x4f\x17\xfc\x39\xf2\x79\x9b\x53\x73\xc2\x36\xbc" + "\x76\xc9\x9f\xcf\xad\x18\x0a\xaf\x91\xd3\xd6\xfe\xdc\x5d\x5e\xef" + "\xbe\x40\xef\xbf\xfc\x9e\xe6\x84\x2b\x73\xdd\xef\xdb\xed\xb9\x40" + "\xef\xbf\xfc\x9e\xc6\xa9\xab\x86\xf0\xfe\xcb\x9b\x03\xbe\xff\x72" + "\x79\x6c\x02\xe5\xbb\x27\xc3\x7d\xf9\xbe\x65\x74\x3f\xde\x7f\xa7" + "\xca\x12\xef\xbf\x53\x25\xc4\x36\x68\x0b\xb9\x75\x77\xc0\xfe\x65" + "\xc7\xc3\x71\x86\x90\x97\xe2\xb9\x75\xc7\x3d\x9a\xda\xbf\xc1\xbd" + "\x92\x20\xde\x79\x67\x72\x50\x92\x38\xde\xa9\xde\x27\xc4\x3a\x41" + "\x18\x07\x41\x5c\x83\x31\x8d\x10\xe3\xe7\x9e\x1c\xe4\x79\xd0\x29" + "\xd1\x7e\xd8\x27\xe8\x95\xef\xce\xb8\xf4\xfb\x03\x6f\xb6\xbb\xdf" + "\x1f\x78\xdb\xe6\xf9\xb7\x77\x9d\x7c\xfe\xed\x1d\x87\xcf\xbf\xb9" + "\xdf\x1f\x78\xc7\xe6\xf9\xb7\x77\xf9\xe7\xdf\xaa\x5f\x70\x3d\xce" + "\x79\x77\x80\xe7\xdf\xde\xb5\x79\xfe\xed\x5d\xfe\xf9\xb7\x77\xf9" + "\xe7\xdf\xde\xe5\x9f\x7f\xab\x4e\x12\xa7\x5b\xe2\x1c\x9a\x4e\xe3" + "\x9c\x77\x9d\x7a\xfe\x0d\xe2\x9c\xcc\x21\xc4\x39\x83\x8f\x5d\x5c" + "\x34\x71\xce\xbc\x8b\x24\xce\xd9\x7b\xc0\x09\x3f\x91\x61\xe3\x27" + "\xfc\xfe\x6f\xf9\x89\x77\x87\xf0\xec\xdb\xfb\x03\x3e\xff\xcf\xc9" + "\x57\x23\x92\x2f\xda\x68\x5e\xb6\x26\xbf\x68\x3f\xb7\xe4\x0b\xb6" + "\xb9\x30\xe5\xf7\x22\xdb\xf7\x64\xee\xcb\xf6\x83\xb4\xcb\x31\xce" + "\x60\xf2\x7d\x3f\xca\x7d\xf9\xd6\xe8\xdc\x8f\x71\x3e\xae\xfe\xb2" + "\x2f\xc6\xf9\xb8\xda\x36\xc6\xc1\x98\x66\x41\x37\x8d\x75\x5e\x82" + "\x18\x25\x2b\x06\xe2\x9d\x44\x42\x9a\xda\x3f\x21\x1a\x88\x79\xb2" + "\x4e\x40\xdc\x13\x05\x71\x8f\x71\x07\x1f\xf7\x7c\x3c\xc5\x3a\xee" + "\xf9\xf0\x43\xbb\x71\x8f\xdc\x12\xf7\x18\x21\xa6\xe9\xdd\x11\xed" + "\x97\x7b\x42\x14\x03\x3d\xdb\x3f\x06\xea\xc9\x06\x9f\x33\x25\x5a" + "\xd5\x0b\x71\xd0\x40\x31\x10\x87\xbd\x4d\x1c\xf4\xfb\x8b\x81\x3e" + "\xa8\x73\x3f\x06\xfa\xc8\x66\x0d\xd1\xda\xc5\xce\xc5\x40\x1f\x47" + "\x3b\x1c\xeb\x71\x3b\x06\xfa\x38\xd9\x3a\x06\xaa\x0d\xe4\x79\xb1" + "\xd8\xf5\x18\xa8\x76\xaa\xe3\x18\xa8\xf6\x26\xeb\x18\xa8\x56\x4a" + "\x63\x9d\xda\x30\x1a\x03\xd5\xfa\xd0\xf4\x0f\xc3\xc4\xe9\x96\x18" + "\x88\xa6\xd3\x18\xa8\x56\xed\xe4\xfc\x4d\x86\x11\x7c\xec\x85\x7f" + "\x6e\x6e\xa0\xf9\x9b\xe1\x7a\x6e\x6e\xee\x45\x32\x7f\xf3\x49\xfd" + "\x65\x3f\x3d\x90\x1f\xa9\x4d\x76\xdf\x8f\x7c\x7a\x81\x9e\xff\xff" + "\x3d\xf9\xe9\x7f\x7a\xbb\x2f\x5f\xed\x80\xcf\xff\x0f\xec\xa7\xf7" + "\xcf\xb2\x8c\x45\xec\x9f\xe5\xda\x58\xc4\x67\x7b\xac\x7d\xf2\xbe" + "\x05\x97\xc7\x22\x9c\xf5\xc3\x9f\xc6\xba\xef\x87\x3f\x4b\xb2\xf6" + "\xc3\xfb\x7f\x74\xce\x0f\x7f\x76\x7a\xf8\xc7\x22\xf6\x4b\xad\xfd" + "\xf0\xfe\x66\x9e\x0b\x23\x5d\xf7\xc3\xfb\xdf\x76\xec\x87\xf7\x7f" + "\x68\xed\x87\xf7\x6b\xa8\xbf\xdd\xdf\x4e\xfd\xf0\xfe\x12\x9a\xbe" + "\x4f\x2a\x4e\xb7\xf8\x61\x9a\x4e\xfd\xf0\x7e\xbd\x6b\x73\x2e\xd7" + "\x5e\xa4\x73\x2e\xca\x4b\x6c\xce\xe5\xf3\xe0\xcb\x7e\x62\x30\x3f" + "\x71\x40\xea\xbe\x9f\xf8\xef\x6a\xf7\xfd\xc4\xc1\x70\x8b\x9f\x38" + "\x18\xee\x9a\x9f\xa8\xfb\xc6\xda\x4f\xfc\xcf\xf3\x97\xfd\x84\xb3" + "\x7e\xe2\xf3\x7c\xf7\xfd\x44\x5d\x89\xb5\x9f\xf8\x42\xee\x9c\x9f" + "\x38\x38\x71\xf8\xfd\xc4\xc1\x69\xd6\x7e\xe2\x60\x37\xcf\x85\xe9" + "\xae\xfb\x89\x83\x87\x1c\xfb\x89\x83\x3f\x58\xfb\x89\x83\x7b\xa9" + "\x3f\xf8\x42\x46\xfd\xc4\xc1\x3a\x9a\xfe\x3f\xd3\xc4\xe9\x16\x3f" + "\x41\xd3\xa9\x9f\xf8\xc2\xe7\xf2\xf3\x76\x17\xeb\xf3\x76\x5f\x26" + "\xbb\x6f\xcb\x1a\x65\x16\x5b\xd6\x28\x73\xfc\xbc\x5d\xc3\x7a\xeb" + "\xe7\xed\xea\xa7\x5f\x7e\xde\x6e\x20\x5b\xf5\xc5\x34\xf7\x6d\x55" + "\xc3\x7c\x6b\x5b\xd5\xe8\xe4\x7e\x90\x0d\x07\x87\xdf\x56\x35\xb4" + "\x5a\xdb\xaa\x46\x7e\x0f\xc8\x2f\xcf\xba\x6e\xab\x1a\x5f\x74\x6c" + "\xab\x1a\xb3\xad\x6d\x55\x63\x38\xb5\x49\x8d\x35\xd4\x56\x35\xf2" + "\xfb\x3f\x7e\xd9\x2d\x4e\xb7\xd8\x2a\x9a\x4e\x6d\x55\xa3\x53\xeb" + "\xff\x5b\xe6\xd7\xdc\x8a\x69\xcf\xc3\xfc\xda\x70\xc5\xb4\x17\xcb" + "\xfc\x5a\xf3\xe5\xf9\x9f\x01\xe3\xd9\xc6\x21\xac\xfb\xff\xd5\x80" + "\xf3\x3f\x03\xfb\x80\x96\x40\x8b\x0f\x68\x09\x74\x34\x3f\x91\x05" + "\x1c\xd2\x40\x3c\xba\xe9\x04\x91\xbe\x84\xf3\x13\x2d\x0d\x24\x1b" + "\xe7\x27\x62\x84\xf9\x89\x42\x3e\xc6\xfd\x7f\x9f\x58\xc7\xb8\x5f" + "\x3f\x61\x2f\xc6\xc5\xd8\xd6\x04\x71\xab\xd1\x76\x5e\xe2\x49\xfb" + "\xbe\xa3\x47\xbe\x3b\xf3\xec\x8e\x68\x95\x2b\xbe\x63\xdb\x1a\xea" + "\x3b\x5e\xff\x5d\xf9\x8e\xe6\x28\xf7\x7d\xc7\xff\xcb\xb4\xf6\x1d" + "\x2d\xa7\x9d\xf3\x1d\x2d\x23\x87\xdf\x77\xb4\x78\x5b\xfb\x8e\x16" + "\x1d\xad\xd3\x57\x26\xd7\x7d\x47\xcb\x3e\xc7\xbe\xa3\xe5\xa0\xb5" + "\xef\x68\xe1\x9f\x35\x6d\x31\x50\xdf\xd1\x52\x4d\xd3\xbf\x32\x8a" + "\xd3\x2d\xbe\x83\xa6\x53\xdf\xf1\x0d\x71\x6d\x3c\xc4\xeb\x22\x1d" + "\x0f\x51\x5c\x62\xe3\x21\xff\x3b\x84\xf7\xdf\x0e\x79\xd4\xf7\x3d" + "\x3f\x7f\xc8\xa3\x5f\x7f\x3d\x11\x62\xdd\x93\x74\xce\xb5\xaf\xbf" + "\xae\x3b\xc2\xdb\xb2\xd6\x75\xd6\xb6\xec\x5f\x53\x1c\xd9\xb2\x81" + "\xe6\x55\xb1\x7f\x6e\x02\x3b\x87\x7b\xad\xb9\x35\xaf\x9a\xf8\x7b" + "\xb2\x5f\xdf\x78\xbb\x6f\xbf\x5a\x6d\xd6\x3f\x3d\xe4\xe4\xfa\xa7" + "\xad\x0e\xd7\x3f\x35\xba\xfd\x0c\x7d\xab\xcd\xfa\xa7\x87\xf8\xf5" + "\x4f\xff\xd7\x8d\xf7\xe2\x0e\xad\x77\x6c\xbf\x0e\xd9\xac\x7f\x7a" + "\x88\x9f\x3f\x3d\xc4\xaf\x7f\x7a\x88\x5f\xff\xf4\x7f\x0f\x8b\xd3" + "\x2d\xf6\xeb\x7f\x45\xef\xc5\x1d\x1a\x70\xfd\x53\x56\x13\x97\x99" + "\xcb\x98\xab\xe1\xa8\x81\x3a\x5e\x03\x1c\xd0\xc2\xf7\x3a\xc0\x71" + "\x1c\x7c\x6f\x76\xa4\x63\x7a\x79\x5c\xa6\x39\x1d\xea\xcc\x10\x49" + "\x93\xfe\x57\xad\x76\x82\x11\xee\xfb\x6d\x00\xc5\x2a\x2e\xd3\xcb" + "\x38\x2a\xd0\xcc\xaa\x09\xe0\x92\xc9\xed\x8f\x07\xf9\x3d\x81\x33" + "\xca\x44\xe2\x79\x42\xf2\x6d\xb8\x90\x0f\xea\xeb\xd9\x26\xf9\x76" + "\x22\x96\xd1\xb5\xf1\xdb\x28\x68\x4b\xbd\xc3\xba\x42\x59\x41\xbb" + "\x26\x91\x75\x46\xf6\x27\x6d\xcc\x49\xd2\x2e\xf9\xf6\x3d\xaf\xce" + "\x51\x81\x6c\x6a\x28\xc1\x18\xab\x7a\x82\x5e\x8a\x65\x6a\x63\x7a" + "\xf0\x5c\x3e\x9e\x33\x41\x1d\x53\xa2\x09\x93\x73\x72\x94\x07\xd8" + "\x82\x91\xa9\x06\xb6\x63\xa5\x11\xea\x9c\x64\x24\x9f\x4e\x6a\x95" + "\xbe\xf5\x7a\x2b\xae\x6f\xe0\x83\x7b\xe2\x61\x19\x10\x63\x62\x7d" + "\x3e\x2c\x82\xfc\xf6\xea\xf0\xe2\x9b\x64\xda\xc8\xa9\xac\xce\x35" + "\xde\xfc\xdb\xe1\xfb\x6f\x5e\xeb\x27\x11\xed\xf5\x20\x3b\x25\x61" + "\xec\x9d\x77\xf1\x3e\x09\x03\xd8\x44\x0f\xdc\x4f\x33\x75\x2b\x61" + "\x36\x9b\x47\x79\xec\x4f\xe6\xf6\xb3\xd4\x77\x6d\xfc\xb7\x4e\x27" + "\xb9\xbf\x04\x65\x8e\x7b\xa6\xe1\x9e\xab\xc0\x1b\x02\xe9\xdd\xfb" + "\x92\x08\xb1\xc5\x22\x3e\x22\x7a\x89\x32\x21\x32\x7a\xf9\xca\xe7" + "\x13\x94\x53\x22\xc6\x90\x90\x95\x2b\x95\xd1\x4b\x62\x5e\x50\x8a" + "\xcf\xdc\xa1\x8c\x88\x5c\xb5\x64\x69\xd4\xf2\xe9\xd1\xcb\x62\xc7" + "\xe0\x83\x91\xa2\x7a\x78\x63\x5d\xcc\x1b\x0f\x4b\x8b\x5e\x21\xe4" + "\xd5\x71\x44\x8a\xf5\xea\xda\x78\x58\x2d\xec\xa9\x97\xb3\x85\x35" + "\x30\x90\x27\x15\x6c\xe0\xe6\x94\x51\x90\xf7\xdf\x09\xc5\x50\xaf" + "\x22\xa8\x37\xd4\x11\xea\x7c\x38\x4f\xa8\xb3\xc0\x89\x54\xe4\x44" + "\xca\x49\xe0\xe0\xe1\xf7\xbc\xba\x47\x3d\xc0\xb2\xa1\xd8\x3e\x03" + "\xe8\x89\xe4\xa8\xe4\xc8\x48\xf4\x4b\x60\x03\x32\xe1\xda\x66\x81" + "\x63\x78\x2d\x9b\x13\x17\xdc\x85\x7a\xc2\xaa\xef\xa6\x3a\x75\xa4" + "\xe2\x31\x95\x84\xd0\x3d\xfd\x0e\x1b\x2d\x7b\xfa\x1d\xe1\xf6\x96" + "\x83\x7a\x74\x76\x6d\x3c\xe2\xad\x93\xf8\xcc\xc6\x74\xdc\x5b\x12" + "\xf7\x7a\xc5\x3a\x43\xbb\xc0\x2f\xb2\x5a\x36\x9d\xe7\x7e\xe6\xfe" + "\x3a\x73\x66\xbb\xb2\x49\x7a\x86\x04\x19\xd9\x5e\x76\xd3\xfe\xba" + "\x46\x83\x81\x78\xad\x8f\x5d\xc6\x5e\x71\xf8\x6a\x2f\x63\xe4\x72" + "\xdc\x93\xdc\xbc\xa9\x5d\xc9\x6e\x3a\x52\xf2\xd8\x54\xa2\x80\xb2" + "\x63\x45\x7b\x0b\x4a\x5d\xc3\xff\x08\x87\x3f\xe2\x08\xf5\xe1\x71" + "\x3c\xa2\xdd\x97\xd0\x1f\xc7\x3e\xfe\xed\x32\x93\xcf\x81\x0b\xac" + "\x6c\x7b\x73\x90\x89\xca\x11\x75\xf7\x54\xaa\x9a\xcc\xe0\x64\xf7" + "\x5d\x92\x39\x67\x7b\xb5\x59\xb3\xbd\x83\xd5\x6c\x6f\x01\x99\xa9" + "\x73\x12\x89\xf2\x69\x93\x82\x64\x9f\x21\xfe\xfa\xec\xed\xcd\x72" + "\x49\x9a\x04\x62\x0b\x06\xfc\x86\x3f\xd8\x0c\x7f\x5e\xdf\xd5\x28" + "\xc7\xff\xe9\x24\x64\xe1\x2a\x42\x7e\x9a\x4d\x46\x14\xc1\x75\xae" + "\xb5\xe7\x3b\xba\xfe\xd3\xc6\x23\xc6\x62\xb8\x16\xf7\x86\x74\xf1" + "\xfa\x0c\x87\x7a\xd7\xd7\xee\xd2\x60\xfb\xed\xfe\x3e\xd6\x9c\x53" + "\xea\x6f\xd6\x94\xaa\x59\x4d\x69\x48\xff\x76\x97\x06\xd3\x76\x8f" + "\x3c\x39\xfc\xed\xfe\x9e\xee\xb9\xb8\xf1\x3b\x83\x7b\xed\xfe\xde" + "\xe1\xf8\x9f\xa8\xdd\x0e\xf0\xd6\xa9\xa1\xdd\x80\x77\x29\xe0\x5d" + "\x6a\x07\xef\x52\x1e\xef\x2b\xdb\x86\xbf\xdd\xba\x99\xb4\xdd\xdf" + "\x77\xba\xd7\x6e\x9d\x43\xfb\x67\x69\x77\x99\x03\xbc\x7f\x08\x37" + "\xe7\x94\x01\xde\x65\x80\x77\x99\x1d\xbc\xcb\x78\xbc\xc7\x7e\x3d" + "\xfc\xed\xfe\x81\x8e\xff\x6f\xd4\xb5\xbb\xd7\xee\x1f\xa2\x9c\x68" + "\xb7\x03\xbc\xdb\x42\xa1\xdd\x80\x77\x19\xe0\x5d\x66\x07\xef\x32" + "\x1e\xef\x5b\xb3\x86\xbf\xdd\x6d\x74\xfd\x9b\x8d\x3f\x1c\x76\xaf" + "\xdd\x6d\x11\x83\xb7\xbb\xdc\x01\xde\xff\x09\x36\xe7\x94\x03\xde" + "\xe5\x80\x77\xb9\x1d\xbc\xcb\x79\xbc\x17\xcd\x19\xfe\x76\xff\xc7" + "\x97\xb6\xbb\xad\xc5\xbd\x76\xff\x27\x6c\xf0\x76\x6f\x6f\x05\x9b" + "\xdd\x0f\xf3\xa6\xa4\x59\xe4\xc6\x33\xd8\xfe\x76\x2d\x2b\xdf\xde" + "\x7a\xe5\xfa\x34\x89\x51\xb6\xfd\xf0\x95\x87\x09\x03\x7d\x3f\xb5" + "\x97\x8e\x8c\x86\xb6\xaa\xd9\x9c\x9d\xb1\xf8\x69\x86\x72\x8c\x60" + "\xfb\x4d\xb2\xed\x2d\x3d\x9a\x38\xf5\x4b\x2b\x88\x32\x55\x4f\x14" + "\x8d\x29\x3a\x92\x12\xcb\xea\x1b\xc9\x0f\x44\xae\x23\x0c\x8e\x63" + "\x7d\xd9\x59\x43\x62\xe2\x59\x16\xca\xde\x85\xfd\xc5\x9c\xa3\xc4" + "\x1f\x62\xe2\x34\x16\xfc\x47\xae\x99\x28\xa1\x7c\x7f\x94\x25\x94" + "\x1d\xef\x15\x42\x24\xff\x5c\xda\x4d\x50\x9e\x28\x5b\xe8\x5b\xfa" + "\x73\x72\x35\x10\xf2\xf0\x22\x2a\xd7\x6d\x2b\x5c\x95\x6b\x7b\x02" + "\x8d\x2b\xb7\xeb\x9b\x74\x3d\x04\x62\x4b\x05\xbe\xd7\x0c\xe9\xfe" + "\x8d\xb1\x27\xa1\x1f\xf2\x9f\x16\x36\x7b\xbb\xce\x0c\x3e\xcb\xc5" + "\x72\x1d\x3e\xff\x26\xb2\xa7\xa1\x60\x33\xfb\x71\xcd\x22\xef\xa3" + "\xfe\xac\xbc\x34\x94\xca\xbb\x34\xec\xca\xc3\x23\x4f\xda\x97\x77" + "\x69\xa8\x11\x7c\x8e\x49\x56\x1a\xe2\xbc\xbc\x8f\x5e\x63\x2d\xef" + "\x52\xff\xf3\x23\xef\x1f\xe9\x3a\x62\x9a\xd2\x58\x6b\x79\xff\x58" + "\x42\xe5\xfd\xe3\x5c\x36\xbb\x34\xdc\x0c\xbe\xd2\xb5\x72\x8f\x3a" + "\x7c\xff\x51\x24\x6f\xe0\x77\x7f\x1f\x66\x91\xf7\x4f\x25\x20\x6f" + "\x9e\xdf\xa5\xc0\xef\x2b\xdb\x1c\xc8\x1b\xf8\x5d\x0a\xfc\x2e\x75" + "\x81\xdf\x3f\x6d\xb2\x91\xf7\x79\xe2\xf7\x4f\xfc\xfe\x4f\xa5\x36" + "\xfc\xfe\x49\x41\xe5\x7d\x74\x2f\xc8\x1b\xf8\x5d\xea\x22\xbf\x7f" + "\xaa\x72\xc2\x7f\x00\xbf\xfb\xfb\x4e\x8b\xbc\x7f\x56\xb0\xf2\x32" + "\x9e\xdf\x65\xc0\xef\xb1\x5f\xdb\x97\x77\x19\xf0\xbb\x0c\xf8\x5d" + "\xe6\x02\xbf\x3b\xce\x5a\xcb\xbb\xec\x3c\xf1\xbb\xe3\x00\x95\x77" + "\x99\x0d\xbf\x3b\xd2\xa8\xbc\x3b\xfc\xd8\xec\x32\xe0\x77\x99\x8b" + "\xfc\xfe\xd9\xd7\x09\x79\x03\xbf\xfb\xfb\x6c\x8b\xbc\x8f\xa5\x81" + "\xbc\x79\x7e\x97\x01\xbf\x6f\xcd\x72\x20\x6f\xe0\x77\x19\xf0\xbb" + "\xcc\x05\x7e\x1f\x8b\xb4\x91\xf7\x79\xe2\xf7\xb1\x99\xbc\xbc\x6d" + "\xf8\xfd\xb3\x9e\xca\xfb\xe7\x3c\x90\x37\xf0\xbb\xcc\x45\x7e\x1f" + "\xd3\x38\x11\x27\x00\xbf\xfb\xc7\x0a\x16\x79\xff\xa2\x67\xe5\xe5" + "\x3c\xbf\xcb\x81\xdf\x8b\xe6\xd8\x97\x77\x39\xf0\xbb\x1c\xf8\x5d" + "\xee\x02\xbf\x7f\x39\x64\x2d\xef\xf2\xf3\xc4\xef\x5f\xca\xa9\xbc" + "\xcb\x6d\xf8\xfd\x4b\x38\x95\xf7\x2f\x52\x36\xbb\x1c\xf8\x5d\xee" + "\x22\xbf\x7f\x71\xf8\xfe\xef\x40\xf1\xc9\xaa\x42\xe2\x61\x2d\xf3" + "\xe3\x11\xe7\x2e\x46\x39\xbe\xe0\xc2\xc4\x28\xc7\x7d\xec\xc7\x28" + "\x9d\x2d\x54\xe6\x9d\x49\xee\xc5\x28\xc7\x63\xdd\x89\x51\xfa\xcb" + "\xfc\x44\xeb\xb9\x8b\x53\x4e\xec\xbb\x30\x71\xca\x09\x8d\xfd\x38" + "\xe5\x44\x20\x95\xf9\xf1\x4e\xf7\xe2\x94\x13\xed\xee\xc4\x29\xfd" + "\x65\xae\x9f\x7f\xee\x62\x15\xfd\x2d\x17\x26\x56\xc1\xd7\xa1\xec" + "\xc5\x2a\xbf\xd6\x52\x99\xff\x1a\xee\x5e\xac\xa2\x0f\x75\x27\x56" + "\xe9\x2f\xf3\xdf\xb4\xe7\x2e\x5e\xf9\x6d\xd7\x85\x89\x57\x7e\x4b" + "\xb0\x1f\xaf\xfc\xc6\xf7\x7f\xf4\x2d\xee\xc5\x2b\xbf\x39\xd1\xff" + "\xe9\x1f\xaf\xf4\x97\xf9\xa9\x99\xe7\x2e\x66\x39\x35\xf1\xc2\xc4" + "\x2c\x27\x3b\xec\xc7\x2c\x27\xcb\xa9\xcc\x4f\x06\xba\x17\xb3\x9c" + "\x0a\x70\x27\x66\xe9\x2f\x73\x43\xc5\xb9\x8b\x5b\x0c\x2f\x5f\x98" + "\xb8\xc5\x10\x66\x3f\x6e\x31\xf8\x50\x99\x9f\xaa\x75\x2f\x6e\x31" + "\xec\x75\x27\x6e\x41\x59\xa3\xcc\x31\x56\xa1\x32\xef\x4a\x62\x3d" + "\xb7\x57\xf7\x42\x3c\x22\x07\xb9\xcb\x3b\x09\x53\x88\x32\x6f\xa5" + "\x32\x37\x79\xee\x8c\x05\xf9\xa8\x51\x66\x5c\x3b\x7e\xf1\xf1\x34" + "\x69\xb6\x1f\x66\x19\x02\x6d\xf1\x20\x47\x25\xa7\x5f\x34\xa6\x13" + "\x4f\x65\xca\x7a\xf8\xde\xc5\xad\x9f\xa9\x4c\xd9\x78\x04\xda\x38" + "\x02\xe7\x28\x8c\xd9\x71\x0a\x93\x7c\x47\xee\x51\xc9\x99\xcf\xd9" + "\x89\xd1\x8a\x5e\x88\x25\xd8\xe7\x7c\xbc\x9b\x3a\xab\x49\x93\xf1" + "\x0b\xd2\xd8\xfa\x11\x31\x7b\xee\x8c\x9f\x61\x24\x2a\xf6\x17\x95" + "\x77\x7d\x82\x8e\x98\x96\xf9\xc8\x9a\x92\xea\x80\x17\xef\x90\xa0" + "\x0e\xf6\x0c\xfb\x1f\x95\xac\x57\x5e\xd9\x6c\x92\xef\x0c\x36\x65" + "\xef\xce\x37\xca\x2b\xb5\x7b\x12\x75\x8c\xac\x9b\xa8\xa2\xda\x59" + "\x36\x67\x29\x91\xe6\xb4\x11\x8f\xcd\x4b\x89\x6c\x73\x1b\x51\xd4" + "\xb7\xb7\x92\x86\x63\x75\xa4\xe1\xe4\x21\xd2\x70\x06\x8e\x1e\x38" + "\xcc\x70\xa4\x1d\x22\xf5\x9d\x84\x2c\x38\x4e\x48\x6a\x3b\xab\xbf" + "\xe1\x30\xf1\xae\x37\xb6\x12\x7c\x8e\xf7\x84\xe4\xcc\x13\xb2\x70" + "\xe2\xcd\xfe\xc7\x87\xb0\xcb\x7c\x18\x38\x27\xc5\xf4\x26\xa3\x9e" + "\xd4\xb7\x77\xe3\xf9\x59\x70\x5e\x9a\xda\x0e\xe5\x9b\xeb\x70\xbd" + "\x38\x7d\x7d\xda\x41\x68\xdf\x64\x94\x73\x87\x10\x93\xe5\xf4\x10" + "\xff\xcd\x00\x33\x72\x26\x88\xa5\x9c\x29\xee\x71\x95\x33\x67\xe8" + "\xfa\x67\xcf\xf9\x8c\x03\x79\x4f\x30\x3f\x17\xaa\x58\x78\xe8\x7b" + "\x16\x9f\xd3\xc2\xf9\x99\x46\xc3\x17\xa4\x29\xc3\x4c\x82\x5e\x20" + "\x64\xbe\x89\x10\x94\x09\xce\x25\x2f\x8c\x25\x5e\xf8\xfc\x98\xf9" + "\x17\xd5\xb8\xa6\x76\x3d\x59\x67\x84\xba\x9e\xe8\xee\xab\x6b\x63" + "\x46\x23\x81\x73\x13\x1a\xd5\x3a\x22\x8b\x25\x0a\x94\x33\xc4\xa2" + "\xad\x0b\x3b\xc8\xe8\x18\x03\xcb\xa2\x8c\x51\xb6\x28\x67\x2c\x4f" + "\x90\x7d\x53\x84\x9e\xa4\x76\x13\x45\x53\x0a\x7c\x26\xb1\xfa\x26" + "\xf2\x1b\x81\x3a\x46\xb1\xf2\xc9\x04\xf8\x91\x80\x9c\xd0\x49\x4e" + "\x27\x03\x0f\xc6\xb1\x1b\x4f\xfb\x17\x41\x7b\x71\x0e\xdf\xb5\x36" + "\x77\x39\x33\xff\xd1\x2f\x26\xb4\xf0\xb9\x34\x94\xf2\xb9\x27\x90" + "\xf5\x2c\xf5\xef\x85\x58\x8f\xf2\x79\xe4\xc9\xc1\xf9\x5c\x1a\x66" + "\xe1\x73\xf7\x63\x16\x3e\xf7\xdc\xee\x98\xcf\x67\x5f\xa3\x7c\x2e" + "\x8d\xbd\x38\xf9\x7c\x76\xea\xc0\x7c\x3e\xeb\xe1\x98\xcf\xa5\x6a" + "\x21\xde\x1d\x1e\x3e\x9f\x0d\x3f\x7f\x7c\x2e\x0d\x75\x8f\xcf\x67" + "\x67\x5b\xf3\xb9\x7b\x3e\xe5\x73\x37\x71\x8f\xcf\x3d\x0e\xf7\x3f" + "\x18\x28\xde\x16\xf1\x99\xb7\xcf\x26\x1f\xe0\x33\xd8\xe7\x52\xde" + "\x3e\x5f\xd9\xe6\x04\x9f\x45\xf6\xb9\x77\x8a\x85\xcf\xa6\xd1\x8e" + "\xf9\x6c\x5c\xce\xf3\xf9\x22\xb5\xcf\xbd\x67\x07\xe6\x73\x6f\xeb" + "\x00\x7c\xee\x10\xfa\x12\xc3\xc3\x67\xa3\xff\x79\xe4\xb3\x9b\xf6" + "\xd9\x28\xb3\xe6\x73\xaf\x2f\xe5\x73\x4f\xb3\x7b\x7c\x36\x39\x7c" + "\xfe\x79\xa0\xbe\x8c\x85\xcf\x65\xbc\x7d\x66\x3b\x58\xcf\x32\xb0" + "\xcf\x65\xbc\x7d\x1e\xfb\xf5\xe0\x7c\x2e\x13\xd9\x67\xd3\x69\x0b" + "\x9f\xd9\x43\x8e\xf9\xcc\xde\x42\xf9\x5c\x76\x91\xda\x67\xf3\xc1" + "\x81\xf9\x6c\xae\x70\xcc\xe7\x32\xb5\xd0\x4f\x1b\x1e\x3e\xb3\xe4" + "\xfc\xf1\xb9\xcc\x4d\xfb\x6c\x3e\x6c\xcd\x67\x53\x27\xe5\xb3\xa9" + "\xc4\x3d\x3e\xb3\x0e\xf7\xff\x19\xa8\x9f\x28\xe2\x33\xb5\xcf\x0c" + "\x53\x03\x7c\x06\xfb\x5c\xc6\xdb\xe7\x5b\xb3\x9c\xe0\xb3\xc5\x3e" + "\x33\xe4\xf3\x3e\x3e\x33\xcc\x2e\x87\x7c\x66\x98\x91\x3c\x9f\x2f" + "\x4e\xfb\xcc\x48\xb6\x0e\xc8\x67\x46\x92\x34\x00\x9f\x3b\x84\x3e" + "\xf0\xb0\xf0\x99\x91\x34\x9f\x47\x3e\xbb\x67\x9f\x19\x49\x95\x15" + "\x9f\x19\x52\xcb\xf1\x39\x8b\xc4\xba\xc5\x67\x86\x71\xb8\xfe\xdb" + "\x40\x7d\x70\x0b\x9f\xcb\xa9\x7d\x66\x46\x66\xb2\x9e\xe5\x60\x9f" + "\xcb\x79\xfb\xbc\x68\xce\xe0\x7c\x2e\xb7\xd8\x67\x66\xc4\x6b\x16" + "\x3e\x8f\x7c\xc1\x31\x9f\xa5\xdf\x50\x3e\x97\x5f\x9c\xf6\x99\x91" + "\x46\x0e\xcc\x67\x69\xa0\x63\x3e\x97\xab\x85\xf1\x85\xe1\xe1\xb3" + "\xb4\xe4\xfc\xf1\xb9\xdc\x3d\xfb\xcc\x48\x93\xad\xf9\x3c\x42\x43" + "\xf9\x3c\x22\xc0\x3d\x3e\x8f\x74\xb8\xff\x9d\x4b\xe3\x1b\x8c\x47" + "\x26\x8e\x6f\xf4\xe0\xf8\x86\xe5\xd9\x3f\xb5\x57\x33\xe5\x73\x2f" + "\xf0\x79\x9b\x98\xcf\xff\xb6\x19\xdf\x60\xae\x58\x6e\xee\xe3\xb3" + "\x47\x3f\x3e\x9b\x81\xcf\xbd\x1c\x9f\x47\xbd\x2c\x8c\x6f\x34\x75" + "\x96\x00\x4f\x8e\x91\xa6\x60\xe0\x72\x0e\xcf\xe5\x7f\x03\x97\x41" + "\x86\x66\x90\x71\xfd\xe1\x56\x12\xa4\xa7\xb2\xec\x01\x19\x9b\xc5" + "\x3c\xee\xe9\x60\x90\xbf\xc8\x5b\x81\xc3\x0d\x31\xc0\xdd\xf8\xaf" + "\x48\x43\x22\x1c\x6b\xe0\x48\x81\x83\x7c\x45\xea\x3b\x80\xbb\x91" + "\x62\xee\x36\xf3\xdc\x1d\x35\x65\x60\xee\x8e\x92\x9e\xb7\xb1\x0c" + "\x66\x14\x1d\xff\xfa\x77\xa8\x22\xe8\x91\xef\xd9\xa6\xa4\x56\x9e" + "\x9f\xc7\x48\x90\x91\x78\xb1\x8b\x54\xe3\x64\xa1\x44\xb1\xd6\x44" + "\x98\xec\xa5\x44\x91\xfd\x2d\xb4\x5b\xd0\xdf\x36\x22\xfb\xa2\xfb" + "\x23\x52\x7f\xb2\x95\xd4\x9f\x39\x48\xea\xcd\x70\x1c\x83\x03\xea" + "\x1a\xb4\x5c\xdc\x6e\x3d\xdf\x6e\x8f\x89\x50\x96\xdf\x00\xed\x36" + "\x72\xed\x8e\x80\x76\xf7\x58\xda\xdd\x04\x7a\x00\xf8\x4c\x30\xf3" + "\xe3\x21\x41\x7a\x32\x7a\xa5\x91\x65\x7b\x78\xfe\x23\x3e\x5f\xb4" + "\x74\x93\xa0\x58\xc0\x6c\x19\xf0\xbf\xbd\x82\xa4\x26\x03\xff\x7b" + "\xba\x91\x77\xfa\xa6\xb4\xb3\xc0\xff\x51\xb3\x58\x90\x5f\x2f\xf2" + "\xff\xdf\xc8\xff\x2b\xc2\xcc\x1c\xff\xaf\x50\xb8\xc7\x7f\x0f\x27" + "\xf8\xef\xc4\x78\x08\x73\x65\x26\x8e\x87\xf4\xe0\x78\x88\xe5\x19" + "\xd0\x41\xf8\x2f\x1a\x0f\x61\x46\x8b\xf8\x7f\xe5\x00\xfc\x1f\xf3" + "\xb2\x30\x1e\x72\xe1\xf9\x3f\x66\x10\xfe\x8f\x19\x80\xff\xc3\x3c" + "\xf6\xc1\x8c\x39\x8f\xfc\xbf\x72\x10\xfe\x8f\x71\x82\xff\xa5\xa1" + "\xee\xf1\x7f\x8c\x0d\xff\x47\xf3\xfc\x1f\xed\x26\xff\xaf\x74\x86" + "\xff\x83\x8f\x9f\x30\x9e\xc8\x7f\xb0\xff\xa5\x2d\xa2\x67\x81\x07" + "\xe3\xbf\xc8\xfe\xcb\x44\xfc\xf7\x1c\x80\xff\x72\x81\xff\x17\x81" + "\xfd\x97\x0f\xc2\x7f\xf9\x40\xfc\x1f\xde\xb1\x12\x46\x7e\x1e\xf9" + "\xef\x39\x08\xff\xe5\xce\xf0\xdf\x4d\xfb\x2f\xb7\xe1\xbf\x8c\xe7" + "\xbf\xcc\x4d\xfe\x7b\x3a\xc1\x7f\x27\xc6\x5b\x98\xb1\x99\x38\xde" + "\xd2\x83\xe3\x2d\x96\x67\xc2\x07\xe1\xbf\x68\xbc\x85\xf1\x12\xf1" + "\x7f\xec\x00\xfc\x57\xbc\x2c\x8c\xb7\x5c\x78\xfe\x2b\x06\xe1\xbf" + "\x62\x00\xfe\x0f\xf3\xd8\x0a\xa3\x38\x8f\xfc\x1f\x3b\x08\xff\x15" + "\x4e\xf0\xbf\xcc\x4d\xfb\xaf\xb0\xe1\xbf\x17\xcf\x7f\x2f\x37\xf9" + "\x3f\xd6\x19\xfe\x3b\x31\x3e\xe3\x8d\xfc\x07\xfb\x5f\xd6\x22\x7a" + "\x37\x60\x30\xfe\x8b\xec\xff\x38\x11\xff\xbd\x07\xe0\xff\x55\x02" + "\xff\x2f\x02\xfb\x7f\xd5\x20\xfc\xbf\x6a\x20\xfe\x0f\xf3\x58\xcc" + "\x55\xe7\x91\xff\xde\x83\xf0\xff\x2a\x67\xf8\xef\xa6\xfd\xbf\xca" + "\x86\xff\xe3\x78\xfe\x8f\x73\x93\xff\xde\x4e\xf0\xdf\x99\xf1\x9c" + "\x3f\x70\xe3\x39\x3d\x38\x9e\x63\x79\x47\x64\x10\xfe\x8b\xc7\x73" + "\xae\x16\xf1\xff\x0f\x03\xf0\x7f\xfc\xcb\xc2\x78\xce\x85\xe7\xff" + "\xf8\x41\xf8\x3f\x7e\x00\xfe\x0f\xf7\xd8\xcd\xf8\xf3\xc8\xff\x3f" + "\x0c\xc2\xff\xf1\x4e\xf0\xbf\xdc\x4d\xfb\x3f\xde\x86\xff\x57\xf3" + "\xfc\xbf\xda\x4d\xfe\xff\x61\x98\xc6\x7f\xae\xf1\xc7\xf1\x1f\xb3" + "\x6c\x7b\x4b\x6f\x41\xb4\xc2\xac\xa9\x6c\xf6\x92\x28\x89\x51\xb6" + "\x23\xb7\x29\xc1\x40\x16\x9e\x06\x4c\x62\x4f\x93\xa7\x4e\x2b\x70" + "\xbf\x40\x2d\x0b\xfd\x7f\xab\x77\x44\xe1\x30\x6a\x26\x93\xcd\x31" + "\x44\x6a\xf2\xdc\x19\x8f\x69\x4d\x47\xbb\x09\xb6\x79\x1d\xca\xe0" + "\x98\x45\x06\x38\x06\xc7\xfe\xaa\x52\x14\xa5\x43\x9e\x1e\x1d\x69" + "\x07\xbe\xd4\xb7\xeb\x40\xf6\x6b\x38\x6e\x21\x16\x47\x19\x9f\xe6" + "\xe2\x13\x44\x6a\xfc\x8f\xcf\x04\xc0\xd8\x5b\xbe\x9a\x48\x7c\xdb" + "\x59\x33\x62\x89\x18\x21\xae\xca\x35\x2c\x0b\xf5\x9e\xda\x08\xfc" + "\x36\xfe\x47\x35\xa1\x08\xf2\x0d\xff\xb8\x8c\x0f\x37\xff\x01\x9f" + "\x75\xf5\x87\x41\x96\x59\x3e\x6e\xe2\x74\x8d\x33\xef\xbf\x38\x31" + "\x4e\x31\xa1\x15\xc7\x29\xcc\xb2\xd2\x10\xe7\x70\x2a\x0d\xb5\x7a" + "\xa7\x75\xd8\x71\x9a\x90\xe4\x1c\x4e\x13\xbe\xb2\xc6\x69\xb8\xc7" + "\x0f\x26\xd0\xf5\x60\x98\x09\xb1\x14\xa7\x6b\x6a\xdc\xc3\x69\x82" + "\x5b\xcf\xff\xf6\xef\x4f\xfb\xa6\x61\x7f\x1a\x70\x72\x52\x9f\x4a" + "\x5b\xad\xde\xc1\x1d\x76\x9c\x7c\x95\xce\xe1\xe4\xfb\x82\x0d\x4e" + "\xc3\xdc\xcf\xf5\xa5\xfb\x41\x33\xbe\x3e\x14\xa7\x3f\x86\xbb\x87" + "\x93\xaf\x13\xef\x7f\x38\xd3\xef\x9b\xa4\xc2\x7e\x9f\x19\xfa\x7d" + "\xce\xe1\x54\x16\x6a\xf5\xce\xf0\xb0\xe3\x34\xb1\xce\x39\x9c\x26" + "\x4d\xb6\xc6\x69\xb8\xfb\x63\x13\x3b\x29\x4e\x13\xb5\x14\xa7\x89" + "\x1e\xee\xe1\x34\x69\xe6\xf0\xf4\x4f\xae\x6d\xc6\xfe\x09\xe0\xe4" + "\xa4\x3e\x95\xb5\x5a\xbd\xe3\x3c\xec\x38\x5d\x1b\xeb\x1c\x4e\xd7" + "\x1e\xb4\xc1\x69\x98\xfb\x0d\xd7\xe6\x51\x9c\xae\x55\x53\x9c\x26" + "\x55\xbb\x87\xd3\xb5\x0e\xf7\xff\x74\x2d\x8e\x9e\x9c\x84\x71\xb4" + "\x19\xe2\x68\xe7\x70\x2a\x0f\xb5\x7a\x27\x7b\xd8\x71\x9a\xec\xe3" + "\x1c\x4e\x93\xe3\xac\x71\x1a\xee\xf8\x76\xf2\x6c\x8a\xd3\x64\x05" + "\xc5\x49\x19\xea\x1e\x4e\x93\x9d\x78\xfe\xd3\xfe\x7b\x58\xfd\x63" + "\xbe\x3f\xf9\x5d\x5c\x31\xdf\x75\x07\x9c\xc3\xea\x4f\x13\xcf\x6d" + "\xcc\x77\x5d\x07\xc5\xea\xba\x5a\x8a\xd5\x75\x52\xf7\xb0\xfa\x93" + "\xbf\xbb\xef\x6f\xf5\x8f\xfb\xfc\x9a\x2f\xae\xb8\xcf\xcf\x49\xfb" + "\xe7\x77\xf0\xdc\xc6\x7d\x7e\xbc\xfd\xf3\xe3\xed\xdf\x9f\xdc\xb4" + "\x7f\x7e\x4e\xd8\x3f\xfb\xef\x7d\xf5\x8f\xfd\xfe\x9c\x7c\x71\xc5" + "\x7e\x7f\xf6\x75\x0e\xab\x3f\x3f\x7f\x6e\x63\xbf\x3f\x07\x50\xac" + "\xfe\xec\x4d\xb1\x9a\x12\xe6\x1e\x56\x7f\x76\xb8\xff\xcb\x60\xef" + "\x8b\xf5\x8f\xff\x54\x17\x59\xfc\xf7\x17\x27\xe3\x3f\xd5\x39\x8e" + "\xff\xfe\xc2\xc7\x7f\x7f\xe1\xe3\xbf\xbf\xb8\x19\xff\xa9\xdc\x8a" + "\xff\x6c\xb0\xe2\xf5\x6a\x6a\xcb\xc5\x15\x03\x4e\x4d\x70\x0e\xab" + "\xa9\x0d\xe7\x36\x06\x9c\x9a\x4f\xb1\x9a\x1a\x45\xb1\x52\xed\x75" + "\x0f\xab\xa9\x3a\x77\xdf\x4f\xeb\x1f\x07\xde\x90\x76\x71\xc5\x81" + "\x37\x38\xd9\xff\xbd\xe1\x85\x73\x1b\x07\xde\xc0\xf7\x7f\x6f\xe0" + "\xfb\xbf\xd7\xbb\xd9\xff\xbd\xc1\x89\xfe\xaf\x33\xe3\x7e\xd3\x75" + "\x18\x03\x9a\x34\xdb\x5b\xbc\x40\xfe\x5e\x49\x84\xe9\xf1\x05\xbc" + "\x64\x80\xd7\x7a\x25\xe9\xd5\x00\x5e\x7a\x23\x59\x18\xf7\x3d\xdb" + "\xd8\x69\x22\x3d\x80\xd5\x59\x88\x03\x9b\xf4\x1d\xf8\x8e\xde\x9d" + "\x6d\xcc\xf4\x17\x16\xc5\x29\x08\xe2\x85\xf2\x37\xc9\x26\x13\x16" + "\xf0\xe2\xf0\x93\xed\xce\x37\x6a\x76\x06\x2f\x38\xfe\x3d\xbb\x52" + "\xc7\xb2\x0d\xea\x6e\x5c\x3b\x52\xd1\xa0\x6e\x25\x41\xed\x64\xb4" + "\xf2\x51\xc4\x65\xfa\x54\x4c\x6f\xd2\xb7\x12\x5c\xf7\x93\x1b\x03" + "\xff\x5e\xe5\x6d\xfc\x97\x4a\x86\xeb\x37\xe1\x7b\x85\xc2\x1a\x4d" + "\x4d\xc7\xf2\x39\xfc\x6d\xc7\x54\x39\xfc\xff\xa5\x52\x6c\xc3\xf7" + "\x13\x87\x3d\x16\x9c\xc6\x8d\xff\x99\xbf\xf7\x99\x20\xd4\x71\x65" + "\x14\xcb\x42\x1d\xc7\x35\x1a\xf4\x04\xeb\xd9\x68\xd0\x92\xd4\x04" + "\xa2\x68\xec\xe9\x20\x29\x06\x56\xdf\x98\xf6\x33\x09\x3a\x8d\xf3" + "\x02\xc8\xa7\xe9\x71\x14\xef\x69\x05\xe6\xef\x55\x13\x74\xcc\x74" + "\x75\x63\x33\x21\x5e\xeb\x41\xd6\x46\xc2\x70\xef\x6b\x32\xc4\x03" + "\xe4\xa5\x6e\x4a\x6b\x43\xd9\x35\x37\x19\xbf\x45\x79\xaa\xe1\xfc" + "\xec\xbe\xf9\x06\xcf\x9d\x5f\x63\x1a\xca\x16\x9f\x33\x6d\x8a\xd5" + "\x73\x79\x84\xf3\x14\xbb\x34\xd2\x94\xd4\x43\x1a\x8d\x84\xc0\xfd" + "\x02\xbf\x0c\x6d\x05\x7e\x4d\x73\xd3\x6e\x4f\xef\x1c\x9e\xf1\x4a" + "\xff\x00\x8c\x5b\x4d\x9a\xd2\x10\x5a\xc7\x91\x27\x07\xe7\x57\x69" + "\xa8\x85\x5f\x33\x0e\x0d\x8d\x5f\x33\x36\x0d\x2f\xbf\x86\x3b\x7e" + "\x9d\x11\x32\x34\x7e\xcd\xf8\x8a\xf2\xeb\x46\x23\xe5\xd7\x8c\x3a" + "\x0b\xbf\x46\x9e\x3c\x77\xfc\xba\xb1\x82\xf2\xeb\x46\xb5\x7b\xfc" + "\xf2\x9f\x3f\x3c\xe3\xac\x37\x97\x60\xac\x0d\xfc\xe2\xed\xd7\x95" + "\x6d\x4e\xf0\x4b\x64\xbf\x6e\xbe\x7d\x68\xfc\xba\xe9\xe7\x61\xe6" + "\xd7\x30\xc7\xdc\x37\xed\x1d\x1a\xbf\x6e\xbe\x89\xf2\xeb\xa6\x30" + "\xca\xaf\x9b\x55\x16\x7e\x5d\xd9\x76\xee\xf8\x75\x93\x07\xe5\x97" + "\x7f\x9d\x7b\xfc\xba\xd9\xad\xf5\xaf\xfa\xf7\x0f\x6e\x21\xd8\x3f" + "\x30\x69\xca\x78\xfb\x35\xf6\xeb\xc1\xf9\x55\x26\xb2\x5f\x33\xb7" + "\x0e\x8d\x5f\x33\x1f\x1c\x5e\x7e\x0d\x77\x3f\x61\xa6\xf7\xd0\xf8" + "\x35\xf3\x65\xca\xaf\xbf\xd6\x52\x7e\xcd\xcc\xb4\xf0\x6b\xec\xd7" + "\xe7\x8e\x5f\x7f\x55\x53\x7e\xfd\x55\xe5\x1e\xbf\x6e\x71\xbc\xfe" + "\xb3\x4b\xe3\xda\xb7\x85\x63\x9f\x06\xf8\xc5\xdb\xaf\x5b\xb3\x9c" + "\xe0\x97\xc8\x7e\xdd\x7a\x76\x68\xfc\xba\x75\xd7\x30\xf3\x6b\x98" + "\xfb\x36\xb7\x26\x0c\x8d\x5f\xb7\xfe\x46\xf9\x75\xab\x2f\xe5\xd7" + "\xad\x1d\x16\x7e\xdd\x9a\x75\xee\xf8\x75\x4b\x1d\xe5\xd7\x2d\x99" + "\xee\xf1\xeb\x36\x27\xd6\x7f\x75\x66\x3c\xfe\x76\x2d\xf6\xc3\x4c" + "\x9a\x72\xde\x7e\x2d\x9a\x33\x38\xbf\xca\x45\xf6\xeb\xf6\x27\x86" + "\xc6\xaf\xdb\x47\x0f\x2f\xbf\x86\xbb\x3f\x36\xab\x65\x68\xfc\xba" + "\xfd\x11\xca\xaf\x59\xc9\x94\x5f\xb7\x07\x5a\xf8\xb5\x68\xce\xb9" + "\xe3\xd7\x2c\x15\xe5\xd7\x6d\x1d\xee\xf1\xeb\x76\x27\xd6\xff\x71" + "\x76\x1e\x61\xb6\xdf\xd0\xfa\x90\x77\x7e\x32\x34\x8e\xdd\x19\x7d" + "\x71\xf7\x21\xef\x9c\x35\x34\x8e\xdd\xf9\x1e\xe5\xd8\x1d\x3a\xca" + "\xb1\x3b\xab\xce\x4f\x1f\xf2\x0e\x0d\xe5\xd8\x1d\xf3\xdd\xe3\xd8" + "\xec\x61\x9c\xff\xb8\x3b\x73\x68\xfd\xc8\xbb\x27\x0f\x8d\x63\x77" + "\x7d\x75\x71\xf7\x23\xef\x2a\x18\x1a\xc7\xee\xbe\x86\x72\xec\xae" + "\xb9\x94\x63\x77\x2b\xce\x4f\x3f\x72\xb6\x9e\x72\x6c\xb6\x9b\xf3" + "\x36\x77\xbb\xf5\xfe\x8b\xfd\x79\x9b\x80\xce\xa1\xf5\x25\x03\x5e" + "\x1c\x1a\xc7\x02\x6e\xb9\xb8\xfb\x92\x38\x7d\x33\x14\x8e\x05\xac" + "\xa3\x1c\xbb\xa7\x82\x72\x2c\x20\xe1\xfc\xf4\x25\xef\x09\xa1\x1c" + "\xbb\xc7\xdb\x3d\x8e\x05\x74\x0f\xdf\x7c\xd3\x7d\xc1\x43\xeb\x4f" + "\xce\xf9\x79\x68\x1c\x9b\xb3\xf5\xe2\xee\x4f\xce\x89\x18\x1a\xc7" + "\xe6\xfc\x40\x39\x36\x47\x46\x39\x36\xa7\xf5\xfc\xf4\x27\xef\xad" + "\xa1\x1c\xbb\x37\xc9\x3d\x8e\xdd\xe7\xc4\xfa\xff\xce\xce\x93\xcd" + "\xdb\x3b\xb4\x3e\xe5\xbc\x05\x43\xe3\xd8\x5c\xd3\xc5\xdd\xa7\x9c" + "\x5b\x37\x34\x8e\xcd\x9b\x47\x39\x36\x37\x96\x72\x6c\xde\xec\xf3" + "\xd3\xa7\x9c\xeb\x4b\x39\x76\xdf\x61\xf7\x38\x36\x4f\x3b\x7c\xf3" + "\x7b\x81\x3e\x43\xeb\x57\x3e\xf0\xf6\xd0\x38\xf6\xc0\x92\x8b\xbb" + "\x5f\xf9\xc0\xb4\xa1\x71\xec\x81\x5d\x94\x63\xf7\xb7\x50\x8e\x3d" + "\x50\x72\x7e\xfa\x95\xf7\xa7\x51\x8e\xdd\xef\xe6\x7a\x14\x81\xfd" + "\xd6\xbf\x8a\x8c\x49\x5c\x12\x15\x19\xa1\x8c\x8c\x49\x88\x8f\x53" + "\xae\x8a\x5c\xb3\xfc\xae\x29\xcf\x4f\x53\xc6\x27\x29\xe3\x23\x63" + "\x9e\xe1\x13\x22\xc6\x90\x47\x97\x47\x2d\x49\xc2\x14\xc8\xfd\x4c" + "\x4c\xf4\xf2\x98\x04\x65\xfc\xf2\xb8\xe7\x23\xe3\x97\xe3\xf7\x55" + "\xca\x15\x2b\xe3\x21\x61\xd9\xf2\xc8\xc4\xe5\xca\xa5\xcf\xaf\x58" + "\xb1\x3c\x7e\xd5\x18\xb2\xe0\xf9\xa8\x84\xc8\xd8\xa8\xe5\xca\xb9" + "\x0b\xee\x9d\x1e\x32\xef\x6f\x21\xf7\xdc\x83\x9b\x93\x89\xf6\x26" + "\xf3\x65\x35\xbb\x73\x81\x73\xd2\xa3\xcc\x23\x6f\x37\xfa\x10\x6e" + "\x3f\xdb\xcd\x27\x89\x62\x53\x3c\x91\x66\x9e\x24\x1e\xd9\x27\x89" + "\x4c\xf9\x2c\x09\x60\x37\x75\xf8\x43\xba\x37\x9b\xad\x0c\x60\x73" + "\xe2\x7c\xe0\x33\x4d\x2f\x1f\x8d\x69\x0a\x36\xdb\x43\x8d\xe7\x40" + "\xb6\x52\x48\xef\x68\x63\x1e\x89\xd5\xcb\xc7\x28\x52\x7f\x26\x0c" + "\x3b\xe6\xc1\x90\x37\xcd\x7a\x66\x1f\x8e\x54\x41\xdb\x09\xf3\x50" + "\x14\x1c\xa1\x84\x79\xd8\x03\x0e\x1f\x38\xfc\xe0\x98\x0f\x47\x08" + "\x1c\x6a\x38\x12\xe0\x48\x83\x23\x13\x8e\x5c\x38\xf2\xe1\x28\x21" + "\xcc\x7c\x5f\x38\x66\xc3\x01\x79\xe7\x47\xd0\x72\xe6\xc7\xc2\x51" + "\x00\x47\x3b\x61\x16\x40\x59\x0b\xbd\xe1\x08\x80\x43\x07\x47\x38" + "\x1c\xc9\x70\x64\xc0\x51\x01\x47\x3d\xe4\x4b\xa0\xe7\x82\x20\x2d" + "\x48\x4b\xa0\x9e\x83\x1f\x41\x98\xbf\x83\x30\xc1\x32\x38\xe0\x9e" + "\xc1\xcd\x90\xae\x1c\xe0\x1a\xf5\x20\x65\x66\x7a\xad\xbf\x56\xc7" + "\xed\x81\xc7\x3c\x74\xd0\x94\x4e\x46\x98\xb2\xc7\x28\x62\xaf\x27" + "\x92\x63\xcc\x43\xaf\x35\x65\xa0\x9d\x51\x06\x70\x7b\x3a\xc2\x6f" + "\x94\x59\x57\xd6\x43\x79\x3a\xf2\x6a\x26\xee\x69\xe6\x1a\xdf\x1e" + "\xca\xe3\xaf\x6f\xd1\x49\x54\xb1\xdc\x1e\x70\x59\x47\x0a\xd8\xd4" + "\xd0\x6d\xdc\xde\x6f\x28\x43\xd4\x83\xcc\xc3\x06\xd6\xe3\x5f\x1a" + "\xd4\x79\xed\x1a\xae\x5e\xd1\x6c\x3a\xf1\x84\xeb\xa3\x58\xa8\x9b" + "\x5e\x1e\xe7\x03\xf5\x94\xe2\x6f\x53\xf6\x68\xff\xb3\xf2\xca\x58" + "\xfc\xde\x5d\x18\x55\xc2\x6a\x2a\xf3\xb1\x9f\xad\x4d\x79\x85\xb4" + "\xc1\x75\x67\xe5\x55\xb3\x94\x0f\x79\xb1\x6d\x78\x6d\x3a\x61\x74" + "\xcc\xc3\x84\xea\xea\x43\x51\x67\xe5\x71\x4a\x53\x7e\x55\x38\xa4" + "\x4b\x4d\xd9\x71\x3e\xb4\xfc\xd1\x60\x27\x77\x06\x40\xbe\x30\x2e" + "\xbd\x20\xaa\x46\xf8\x0e\x9f\xa1\xa6\x9c\xca\x56\xfc\x94\xaf\x27" + "\x06\xee\x77\x7a\x00\xa1\x9f\x0a\xa2\x7c\x88\x90\x4e\x66\xbe\x64" + "\x46\x1d\x91\x68\x1f\xc2\x7a\x3f\x5c\x9f\x5a\xc7\x9a\x95\x29\x23" + "\xe0\xfe\x0f\x37\xf4\xdd\xf7\x9a\xaa\x50\xdc\x23\x95\xcd\x0a\x8c" + "\x28\x7e\x85\x10\xbc\x16\xeb\xb6\x75\x1c\x91\x16\xbe\x42\x3c\xb0" + "\x8d\x5d\x59\x0f\x77\x0b\xfb\xd0\xe1\x35\x0c\xe4\x7f\xf0\xc1\x54" + "\x56\x54\xf6\xe7\x26\xae\x3d\x0f\xa9\xa9\x4c\xe7\xab\x74\x92\x29" + "\x51\x98\x5f\x79\x1d\x27\xcb\x68\xfe\x7c\x14\xe2\x89\xe5\xb3\xd9" + "\xbb\x73\xf1\x37\xee\x73\xe7\x55\x47\x18\x65\x8a\x5f\x0d\x95\x51" + "\x65\x3e\x96\x83\xf9\xd9\x9c\x1d\xf0\xfd\x61\x19\x9b\xcd\xc9\x58" + "\xa5\x8c\x21\x01\x6d\xcc\xfc\xd7\x4c\x9b\xbe\x0b\x81\x32\x40\xef" + "\xbe\x0b\x85\xfc\xd5\x9c\xbc\xb3\x77\xfa\xeb\x98\xf9\x99\x70\x2e" + "\xb4\x6f\xef\x4b\x2a\x67\x09\xe4\x53\x43\x9d\x6a\x75\x92\xbb\x92" + "\x39\x9c\x13\xd9\x16\xdc\x63\xf3\x54\x22\x6b\x0c\x32\x7e\x6f\x06" + "\x5b\x45\xe0\xfc\x61\x1d\xb9\xaf\x42\x68\x23\xc5\xbe\xaf\x9c\x68" + "\xfc\xad\x1f\x8d\xe5\x2c\x90\xda\x2b\x07\xee\x5d\xff\xb4\x51\x29" + "\xe9\x39\xc3\x36\x6f\xfe\x3b\xca\x91\xb0\x3d\x89\x6c\xfd\xba\x40" + "\xb6\x3b\xe7\x6b\x42\x1a\xd4\x87\x09\xe8\xbc\xaf\xa7\x84\xd5\x07" + "\xbd\x40\xbc\x3c\x63\xbd\xd8\x83\x75\x87\xc9\xda\x40\xb6\x03\xf7" + "\xf0\x6d\x34\xb4\x93\xe4\x43\x44\x96\xda\x40\xbc\x93\x03\x59\x7d" + "\x7d\xf8\x61\x42\xd3\x1b\x48\xea\x0f\x44\xba\xf6\x00\xdb\xbd\x10" + "\xec\xff\x97\x87\x31\xbd\x9d\xe0\x1e\x95\xa9\x1d\xac\x31\x65\x31" + "\x91\xe1\xf7\x86\x03\x98\xfe\x23\x49\x3d\x4e\xa4\x41\x49\x7a\xaf" + "\x22\xb8\x27\x5e\x5f\x0c\x75\x31\x9f\x61\x6b\x37\x9f\x21\x64\xed" + "\x13\xc4\x27\x79\x09\x51\x04\x99\x08\xdb\x64\x7c\x8f\x04\x99\x58" + "\xf0\x2f\x9f\x93\x75\x91\xc4\x23\xc8\x88\xef\xb1\x7d\x43\x70\x9f" + "\xee\x62\xc8\x0b\x6d\xd3\x62\xdb\xd6\x1e\x21\x3e\xb8\x3f\x39\xbd" + "\xe6\x13\xfe\x9a\x23\x04\x65\x76\x56\xae\x8c\xed\xce\x56\xea\xa1" + "\xed\xcd\x28\x03\xb8\x4f\xb3\x19\xaf\x83\xeb\x37\xc7\x73\x32\x90" + "\x3c\x6d\x24\x32\x53\xf6\x4e\x9f\xa7\x93\xb4\x5c\xb9\x3a\x66\xa1" + "\xac\x38\x9e\xab\x93\x55\xde\x20\x23\x7b\x4a\x2f\xdf\x09\xbc\x5f" + "\x38\x33\x28\xe9\x1e\x16\xaf\x05\x2c\x23\xba\xb2\x16\x26\x08\xf2" + "\x16\x70\x81\x3c\x6a\xc0\x22\x62\x44\x2c\x91\xc2\xf9\x3c\x9d\x24" + "\x20\xd4\xc2\xb5\x87\x91\xbf\x57\x08\x79\xf9\x3c\x35\x3a\xc9\xdd" + "\x25\x22\x3e\x22\xbf\xfa\xf2\xc0\xf9\x56\x9d\xe4\x1e\x1e\xfb\x85" + "\xf9\x98\x87\xb7\xfd\x42\xde\x11\x6c\xe6\xbf\xc2\x4d\xf2\xca\x12" + "\x96\x61\xbb\x81\x8f\xb3\xd8\x53\x3e\xb2\x85\x46\xb6\xdb\x9c\xbd" + "\x03\xed\xbc\x0c\xf7\x75\xa5\xf9\x83\x22\xe1\x7c\x80\x32\x91\xfb" + "\x9e\x8c\xf7\x61\x35\x71\x01\x7d\xe7\xd2\xc9\x48\xb6\x30\x2a\x17" + "\x7c\x87\x22\xa8\x8e\xed\x06\x5d\xcf\xcd\x89\x47\xdf\x51\x99\x8b" + "\x7a\x6d\x96\xef\x0c\xec\xde\x5a\x15\x80\xf6\x09\x75\x84\xd5\xec" + "\xf0\xa7\xd7\x3e\x2c\x41\xbd\xa1\xb6\x26\x28\xc0\x04\x65\x40\x9d" + "\x22\xe0\xdc\xc8\x36\x26\x68\x2f\xbe\x4f\x0a\xbf\x0b\xb8\x7d\x2f" + "\x99\xa0\x0f\x29\x7f\xff\x15\x6e\xf5\x9b\x41\xd9\x81\x3e\x81\xcd" + "\x42\xfb\x00\xe9\x87\x44\x3a\x4c\x58\x5e\x47\xcf\xca\x77\x04\x50" + "\x3b\x32\xc2\x0c\xf9\x24\x6d\xbc\x3e\x9e\x1d\xfd\x5d\x58\x57\x56" + "\x30\xf0\x5f\xa9\xb0\xd2\x93\xac\x16\x82\x7b\x6c\x42\x5d\x46\x1c" + "\x65\x82\x6f\x82\xcf\x51\xf0\x79\xcb\xfe\x3a\xc4\x9b\x2b\xf7\x4a" + "\xfc\xbe\x75\x3c\xab\x9f\x0b\x11\xf0\x29\x06\xf5\x2d\x78\xbe\x8e" + "\xc4\xcd\xc7\x72\x36\xe1\x3e\xa3\x90\x86\x79\x20\x3d\x42\x47\xe2" + "\x67\xd3\xf2\x1f\x96\x19\xa0\xae\x36\xe5\x6f\xa2\xe5\xd3\x72\xb1" + "\x3c\xa1\xec\xc2\x2d\x6c\x27\x5f\x76\x85\x50\x76\x36\xa4\x09\xe5" + "\xcf\x8d\xee\xbb\x47\x1d\x9c\x3f\x20\x6e\x43\xfe\x16\xd6\x80\x65" + "\xc0\xb9\x76\x1d\xd9\xe8\x8f\xe7\x32\x21\x0d\xaf\x15\xf1\x6a\xc4" + "\xfe\x40\x28\xe3\x00\x96\xf1\x88\x4c\x47\x32\x6a\x6c\x6c\x9c\x5c" + "\xb0\x71\xb4\xac\x47\xfc\x85\xb2\x2c\xe5\x08\x7c\x6a\x6b\xe6\x71" + "\xc5\x72\x65\x58\x2e\xe4\x0f\xd7\x91\x04\x99\xb8\xed\xa0\x5b\x10" + "\x5f\x56\x56\xa0\x1d\xe3\xf9\xf8\x1a\xda\x64\xa1\xde\xb8\xcf\x28" + "\xd8\x6e\x0d\xea\x0b\x67\xbf\xb3\x77\x2a\xa1\x9c\x0a\x1b\x7b\x2d" + "\xc5\x7c\xa6\xac\xc0\x7d\x85\xb8\xcf\xea\x78\xb6\x03\xf2\xd4\x5b" + "\xed\x2d\xca\x90\xbb\x21\x4d\x27\xec\x71\x9a\x03\x79\x20\x26\x73" + "\xb8\x86\x63\xca\x64\xc2\x34\x15\xe8\x30\x7e\x46\x5e\xcd\x6e\xf2" + "\x35\x90\xa6\x02\x33\x31\x17\x45\x69\x03\x52\x58\xed\x51\xe6\xd1" + "\xc5\xb8\x37\xb5\x6b\x3e\xf9\x51\x15\xc7\xa7\x1e\x88\x2b\x93\x6f" + "\x26\xe8\x87\x4f\x30\x7f\xcb\x6e\xd2\x9f\xe4\x74\x0b\xbe\x73\xef" + "\x47\xbf\x0a\x71\x28\xc6\xa2\x10\xff\xab\x73\x19\x1a\x8f\x9a\x21" + "\x6f\x11\xa6\x63\xac\x0a\x76\xb2\x58\x74\x8e\x2d\x8a\x4a\xa2\xb2" + "\xfb\xdb\x3c\xce\x1f\x60\x7d\x8d\x0f\x68\xb1\xce\xe6\x82\xa8\x24" + "\x6c\x43\x6a\x12\x6b\x6e\x32\x76\x69\xd1\x96\x2a\x13\x31\x8e\xfe" + "\xdb\xe4\xa0\x42\xc2\x9a\x0b\xa3\x92\x5c\x6c\x03\xf7\xfc\x13\xf4" + "\x15\x4e\xe8\x27\x46\x25\xe1\x5e\xcf\x9b\x53\x46\x7a\xdc\x57\xc0" + "\x6a\x4f\x4d\x8a\xd2\x76\x65\xfd\x6d\xae\xb0\x97\xae\x6b\xe5\xfe" + "\x6d\xae\xd0\xf6\x22\xbe\xed\x70\x2f\x6e\xcf\x9e\x19\xf9\xdc\x5e" + "\xde\xf0\xfb\x6f\x0e\xf7\xfa\x04\x3b\x52\x81\xd7\x42\xdb\x03\x8a" + "\x05\x39\x19\xf5\xb8\x8f\xf9\xd8\x63\x4c\xc8\xd8\xa0\x64\x2d\xe1" + "\xd6\xed\xcf\xde\x51\xe1\x62\xbd\xb8\xe7\xdf\x1b\xa1\x9f\x12\x64" + "\xfc\x94\xa5\x76\x2f\xe4\xf6\x85\x7c\x79\x78\x4e\xc0\xaa\x88\xef" + "\x3f\xb8\x7e\x8f\x90\x00\x27\xda\xa5\xb0\xd3\xae\x9f\xdd\x6f\x57" + "\xc8\xde\xfe\xed\x7a\x6c\xec\xf0\xb6\xeb\x31\x1f\x27\xda\xa5\xec" + "\xdf\xae\xc7\xf6\xb9\xdf\xae\xc7\x34\x76\xda\xf5\xf3\x30\xb7\x4b" + "\xef\x44\xbb\xfc\xfb\xb7\xeb\xef\x5b\xdd\x6f\xd7\xdf\x23\xfa\xb7" + "\xeb\xef\xfb\x86\xb7\x5d\x7f\xaf\x73\xd9\x1e\xe6\x54\xea\xa9\x3d" + "\x7c\x3c\xda\x75\x7b\xf8\xf8\xac\xfe\xf6\x30\xb4\xd0\x62\x0f\x43" + "\x37\xb9\x65\x0f\x73\xe2\xf8\x98\x22\xf4\xb1\x7e\xf6\x50\x13\xe7" + "\x6f\xdf\x1e\x86\xde\xc4\xd9\xc3\xec\x38\x17\xfb\xf5\x8f\x1b\xfb" + "\xec\xa1\x3c\xce\xdf\xca\x1e\x7a\x56\x82\x8f\x0c\x0d\x71\xcf\x1e" + "\x86\x86\xf4\xb7\x87\x8f\xef\xb5\xb6\x87\xa1\x0e\x9f\x75\x66\x35" + "\x3b\x55\xf6\xec\x61\x90\xf1\x57\x96\x72\x63\xa7\xca\xc5\xfa\x38" + "\x7c\xff\x1b\x38\x5f\x3d\xf0\xbd\x76\x54\xbb\x76\xaf\x27\x82\x1d" + "\xde\xcb\xe3\x5f\x69\x10\x67\x28\xd6\x6d\x27\xcc\x51\xe8\xe1\x37" + "\xfa\xb6\x42\x3f\xa0\x9b\xdc\x18\x0b\x9c\x48\x27\xb3\x1b\x0b\x3a" + "\x49\xa3\xef\x51\xc2\x8e\xfe\x57\x1a\xbb\x33\xda\x3f\x20\x1e\xb9" + "\xf9\xe4\xe8\xa6\x84\x6e\x17\xb9\xf9\x44\x8b\xc0\xcd\x46\x23\x70" + "\x33\x11\xf9\xb8\xe8\xf6\xa6\xce\x63\x3c\x37\x17\x4d\xe9\xc3\x27" + "\x9d\xf2\xd3\x2e\x37\x41\x27\xac\xb9\xb9\xa3\x84\x72\xf3\xc9\xdf" + "\xfa\x73\x73\x47\x89\x7d\x6e\x3e\xd9\x40\xb9\xb9\xa3\xc4\xb5\x36" + "\x3c\x99\x6f\xe1\xe6\x8e\x12\x2b\x6e\xfe\x39\xda\xbf\x2b\xeb\x49" + "\xbd\x7b\xdc\x7c\x52\x2f\xb4\xbd\x90\x6f\x3b\xa4\x05\x5b\x73\x73" + "\x91\xca\x21\x86\x99\xfb\xeb\xc0\x1e\xca\x8e\x31\x8b\xba\x4d\x10" + "\xb7\x9a\x35\x9e\x2a\xe8\x77\x75\xe1\x9e\xf1\x2c\x33\x93\xb0\xab" + "\x55\xb2\x2e\xe8\xff\x76\x75\xa9\x3d\xd8\x31\xff\x1a\xc3\xf6\xfa" + "\x10\xa8\xbb\x17\xdb\xa5\xf2\x04\x99\xf9\xc1\xe7\xb8\xc2\x44\xe2" + "\x0d\x87\x4f\x21\x2f\x57\xf8\xee\xcf\xae\xf6\x19\x93\x93\x48\xa6" + "\x79\x19\x88\x07\xd4\x21\xd4\x6b\xbd\x82\x78\x19\x89\x37\x7e\x67" + "\xd3\x3f\x33\x42\xff\x4c\x8a\x63\x9f\x66\x39\xdc\x2f\xc9\x8b\x65" + "\x57\xa9\x08\xf4\xd5\x3c\x00\x03\x9f\x62\x86\xad\x36\xad\x56\x31" + "\xac\x67\xe5\x6e\x76\x6d\x28\x57\x27\xb3\x5f\x74\x2c\x70\x28\x96" + "\x4d\x55\xe3\x7d\x03\x70\xef\x62\xf6\xcf\xd1\x09\x6c\x97\xcf\x98" + "\xec\x33\x64\x5a\x71\x22\xf1\x2b\x4a\x24\x2a\xb6\x57\xc5\x80\x0c" + "\x42\x9f\x8a\x53\x20\xee\xa1\x2c\xf3\x19\xee\xe1\x2e\x85\x7b\x4b" + "\x4c\xd9\x70\x2f\x23\xdc\xeb\x57\xb8\xd7\x09\xb8\x57\x3a\xdc\x2b" + "\x9d\xde\xcb\x35\x99\x87\x0d\xb8\xff\x73\xd0\xba\x49\xb8\x96\xee" + "\x4f\x5e\x49\xa3\x02\x71\xbc\xfa\xd4\x5a\xb5\x8b\x7c\x0f\x73\xb8" + "\xfe\xf3\xe6\x37\x89\x2f\x2b\xf3\x08\x5d\xf8\xe2\xf7\x2c\xf6\xa3" + "\x5f\x7c\x93\x4c\x43\x9d\x6b\xec\x3e\x4e\x58\xb9\x47\xe8\xe7\xaa" + "\x4e\x17\xef\xb5\xd8\xe1\xf3\x0f\x59\xe9\xd0\x6f\x96\x41\x3f\x54" + "\x56\x59\xb3\x39\x9d\x4d\xea\xf5\x8d\xca\xed\xf1\x8d\xaa\x7e\xda" + "\xa8\x00\x5e\xb1\x49\xca\x78\xa2\x3c\xca\x2c\x7b\xfe\x8b\x16\xf0" + "\x11\x4f\x12\x8f\x36\x66\x59\x55\xea\x21\x1c\x6b\x5c\xac\xb5\x1e" + "\x6b\x5c\xdc\x4e\x98\xa7\x43\x08\x13\x1e\x41\x98\x25\x99\x04\xf2" + "\x59\x1f\x4b\xcb\x69\x59\x4f\xdf\x14\xb4\x6b\x12\x49\x31\xb2\x3f" + "\x41\x3f\x36\x33\x07\xfa\xbf\x41\x53\x25\x3a\x6d\x22\x8e\xc1\x3d" + "\x3d\x15\x64\xfa\x0b\xf8\x25\xaf\xa3\xcc\x53\xa7\x01\x3b\x12\x1b" + "\x4f\xae\x3a\xc6\x3c\x65\x30\xc2\x77\x2f\xc3\xa8\x40\x53\x6a\x28" + "\x31\xfa\x54\x05\xf4\x6a\x2a\x73\x4d\xd0\x97\x35\xcb\x3c\x55\x38" + "\x0e\xd2\xd4\x69\x22\x05\xc0\xbb\xa7\x4d\x1e\xa8\x0f\xa1\xda\xa5" + "\x5f\x90\xa3\x09\x84\x49\x3d\x4d\xe4\xec\x29\x95\x4c\xe0\xf5\x82" + "\x4e\xaf\xee\x75\x9d\xac\x19\xf9\x8d\xe3\x0e\x70\xce\x33\xe5\x34" + "\xf8\x5a\x7d\x07\x29\x80\x7e\xb3\x69\x95\x7a\x9c\xfe\x94\xfa\xaa" + "\x6d\x66\xe2\xed\x69\x20\x8a\x82\x93\xc0\xc1\x55\xc0\xbf\x93\xc0" + "\x73\x3d\xe5\x39\xbe\x2b\x54\x84\x1c\xdf\xf8\x6f\x69\xf1\x49\xca" + "\x71\x8e\x77\xc8\xf1\x95\xc0\xbb\x18\x0b\xef\x8c\xa7\x80\xe3\x59" + "\x61\xe5\x05\xe9\x2c\x8e\x8b\x30\xc5\xc7\x46\xe1\x39\xc9\xc8\xa9" + "\x8c\xf2\x8b\xe0\x6e\x62\xe9\x87\x2d\xdb\xd3\x33\x31\xaa\x5a\xf9" + "\x28\xfb\x6b\x1b\xf3\xb4\x12\xd2\x3d\x94\x7f\xff\x8b\x02\xe4\xbd" + "\x87\x8e\x51\x2c\xab\xc2\x7e\xbe\x0e\x64\x81\x72\x51\x3e\x4a\xfe" + "\xd2\xc6\x2c\x3e\x8d\x72\x5c\x5d\x41\x46\xc4\xde\xcd\xb6\x83\xcc" + "\x8c\x58\x1e\xe0\xcd\xf5\xb3\x70\xfe\xe3\x4b\x6e\xec\x93\x5e\x63" + "\x02\xb9\x19\x65\x71\x01\x80\x77\x85\xf6\xd9\x1e\x4e\xe7\x50\x8e" + "\x47\xa3\x00\xb9\x4e\x90\x95\x09\x64\xd5\xc5\xd9\x82\x60\xce\x16" + "\x64\xfe\x4b\x9a\xac\x63\xcd\x41\x11\x23\xd8\x94\x38\x9c\x7b\x31" + "\x91\xa7\x62\x09\xbb\xee\x38\xc8\xcb\xd0\x8a\x76\xc3\xd3\xbc\x9a" + "\xda\x06\x94\x97\xbc\x93\x28\xd8\x9c\x31\xca\x37\x53\xea\x46\x9a" + "\x80\xbf\x68\x1f\xbc\xd6\x4b\x46\x83\x5e\x7a\x6a\x50\x7f\x41\x9f" + "\xbd\xd6\x73\xf6\x2a\xb4\x00\xf4\xd6\xb8\x5a\x75\x5d\xef\x6a\x95" + "\x12\x8e\x49\x82\x0d\xc1\x3d\xbf\x0a\x51\xb6\x59\x8b\x65\x68\x3f" + "\x9a\x92\x74\xc4\x08\xb2\xf5\x44\x7f\xb3\x5a\xe5\xcb\xc9\xf8\x19" + "\x15\x99\xd1\x4d\x24\x50\x27\x05\xd4\x97\x14\xaf\x20\x1e\x0d\xea" + "\x36\x62\x02\xdd\x10\xe4\xbe\x20\x52\x49\xa0\x5c\xe6\x73\xd5\x37" + "\x84\x97\x99\xc4\x31\xef\x96\xac\xb7\xf0\x6e\xc9\x7a\x94\x1d\xe5" + "\xdd\x92\xb4\x4b\x91\x77\x5f\x86\x72\xbc\x1b\xd1\x3b\x91\xe3\x93" + "\xb1\xc9\xf8\x0e\xc8\x68\x09\x8e\x6d\x12\xe4\xcc\xc1\x4a\xe4\xcc" + "\xd2\xbc\x8b\x95\x33\x67\xbb\x54\x4a\x38\xce\x09\x67\xa0\x5c\x8e" + "\x33\x28\xab\x2f\x43\x7b\x88\x20\x23\x4e\x57\x35\x1e\xa1\xca\x54" + "\x72\x0f\xe8\x6a\x95\xd7\xfa\x49\xa4\x81\x93\xd3\xb2\x2a\xe5\xdf" + "\x59\x73\x1b\xb3\xb4\x21\xf5\x2b\xa2\xe8\x49\x67\xd9\x26\xe3\x1e" + "\x62\x96\xed\x0c\xc4\x71\x66\x88\x7f\x73\x85\x39\x1c\x1c\x8f\xf3" + "\x8a\xc5\x79\x9b\xd1\xfe\xa6\xec\xdd\xb9\xe6\x6c\x0f\x35\x2b\x57" + "\x76\xe0\xd8\x9b\x79\x53\x87\xbf\x59\xae\x0c\xe8\xca\x5a\xe6\xad" + "\x23\xff\x09\xe0\xc6\x83\x35\x95\x18\xbb\xa0\xfd\xbd\x8b\x1b\x2f" + "\x96\xe3\xd8\xf9\xb2\x99\xc2\xfc\x04\xda\x04\x7e\x5c\x8e\x1f\xb7" + "\x5b\x86\x18\x8e\xc1\x71\x3b\xde\xa6\x4c\x11\xc6\xed\x84\xdf\x78" + "\x1e\xae\x53\xe1\x98\x8f\xe8\xba\x72\x3e\x1f\x7f\xdd\xe2\x5d\x68" + "\xeb\x2d\xd7\xd1\xdf\x60\x57\xca\x7b\x19\xe2\x61\x37\xc6\x90\xed" + "\xce\x05\xfd\x91\x1e\x65\x22\x76\xc1\x27\x03\x9f\xf3\xe0\x73\x04" + "\x7c\x5e\x8d\x65\xbb\xe6\xaf\x96\xe9\xb8\xfa\x68\x2a\x0f\xf3\xf5" + "\xe6\x9e\xa5\x88\xbd\x9e\xc8\x8f\xf1\xdf\xbb\xb2\x22\x66\x0b\xf3" + "\x2c\x96\xfc\x7d\xf8\xb4\xe2\xbd\x01\x23\x29\x9d\xfb\xa1\xbf\x45" + "\xe5\x1d\xe2\x7e\x13\xa9\x12\xb0\x09\xc6\x39\x5a\xe0\xaf\xa4\x8b" + "\x55\xdf\xcd\x7f\xde\x85\xfa\x81\xe3\xa5\x18\xaf\xf1\xf6\x57\xc7" + "\xdf\x77\x2f\xc8\xc1\xea\xbe\xf6\xe4\xa1\x63\x22\x9a\x1d\x9d\x73" + "\x4d\x16\x11\x0e\xdf\x7f\x9b\xa7\x32\xb1\xae\x95\xb5\x7c\x96\xc3" + "\x18\xd1\x37\x2a\x36\xa8\xc2\xa4\x35\xf7\x86\x7a\x7d\x9e\x7c\xdc" + "\xc5\xf8\x62\x79\xae\xa3\x72\x4d\xb2\x9d\xe1\xc6\x82\xa8\x58\x1c" + "\x93\x6c\xac\x30\x92\x5d\xc7\x3a\x98\xa0\xa9\x93\x88\xbc\x9d\x28" + "\x30\x7e\x5a\xd0\xf9\x29\x8b\x31\x54\xce\x31\xe2\xd7\xf3\x6b\xa8" + "\x57\x2f\xc4\x82\x2f\x1d\x23\xb3\xcd\xcf\xf8\x8c\xd1\xac\x20\xd2" + "\x1e\x88\x57\x7b\x9e\x51\x7b\x7d\x79\xb8\x83\x80\x9e\xc4\x36\x1a" + "\x74\xa4\x08\xf2\xb2\x3f\x85\x7a\x3e\x18\xce\x76\xd7\x87\xbf\x42" + "\x82\x54\x26\x6d\xca\x0f\x44\x0e\xb6\x48\xd1\x94\xb4\x87\x34\x19" + "\x8f\x93\x91\x2f\x30\xca\x26\xe3\x8f\x24\x7b\x05\xd8\x30\xb0\x59" + "\xa9\x4f\x80\xad\x36\x9e\x26\xdb\xc4\xb6\xfa\xd9\x52\x8b\xad\xfe" + "\x15\x6c\x75\x16\xd8\xea\x54\x1f\xd2\x18\xab\x25\x60\x3b\x46\x2d" + "\x8c\xf5\xea\x4e\x89\x05\x9b\xfd\x02\xd8\xec\xa4\x1f\x09\x67\xaf" + "\x3b\x3b\x08\xd8\x5a\xcf\xc2\x18\xe2\xdd\xbb\x12\x6c\xf6\xaf\xea" + "\xab\xb6\xa6\x50\x9b\xfd\x7a\x0c\xd8\xec\x95\x10\x13\xc7\x80\xcd" + "\xee\xb4\x63\xb3\x4f\x38\x88\x87\x79\xfb\xd3\xb3\x52\xc5\xbc\xce" + "\xb0\x38\xaf\xc2\x6c\xfd\x76\x94\x8b\x3c\x79\xc6\xdb\x11\x06\x28" + "\x6f\x94\xbf\x19\x70\x68\x00\x0c\xb8\xb8\xb5\x7b\x54\x60\x2f\xf8" + "\x34\x93\xe7\xf6\xea\xca\x63\xad\x8c\x67\x02\x51\x2c\x8c\xfd\x94" + "\xed\x59\x15\x0a\x71\x7f\xa8\xdc\xa8\xd9\x19\xae\x81\x98\xda\x04" + "\xb1\x77\x6f\x97\x8f\x07\xc8\x40\xa1\x5f\xad\xf6\x42\x19\x9a\x27" + "\x02\x9e\x57\x04\x26\x80\x0d\x9d\x59\xb8\x82\xcc\xea\xcd\xde\x7e" + "\x98\xcd\xde\xde\x6c\xca\xde\xde\x02\xd7\x7a\x3e\xac\x43\x5c\x3e" + "\x22\x90\xa6\x67\x73\xca\xab\x4d\xf2\x9d\xe1\x7a\xf9\xf6\x56\xf8" + "\xdd\x81\xe7\x53\x96\x10\x79\x90\xea\xac\x96\xe2\xb5\x83\x20\x4e" + "\x14\xaf\x23\x24\x1b\xfa\x7d\xe8\x73\x39\xff\xca\x63\x06\xfd\x05" + "\x2e\xde\xb7\xe0\x66\xe3\x63\x79\xdc\x1a\x3a\xb5\x04\xfc\xc9\xa8" + "\x3e\x5f\xcb\xe1\x76\x84\x08\x7e\x16\xe4\xed\x59\x08\xbe\xb6\x77" + "\xb8\x7c\x2d\xdf\x8f\x41\x5f\x8b\x7e\x16\x71\x7b\xdd\x65\xdc\xd4" + "\x0e\x9f\x7f\x1f\x18\xb7\x52\x7f\x37\x71\xab\xb7\xe0\x56\x1a\xc6" + "\x66\x97\x06\x9b\xb2\x4b\x43\xac\x71\x2b\x8d\xb5\xe0\x56\x1a\x0a" + "\xbf\xd5\x16\xdc\x4e\xbb\x80\xdb\xc8\x93\x97\x2e\x6e\xcf\x3a\x5c" + "\xff\x68\x10\xdc\xdc\xd4\xb7\x07\xfd\x44\xb8\x81\xbe\x95\x82\xbe" + "\x95\xda\xe8\x5b\xa9\x48\xdf\x4a\x41\xdf\x4a\x45\xfa\x76\xdc\x05" + "\xdc\xae\x6c\xbb\x74\x71\x8b\x72\xb8\xfe\xe5\xc0\xb8\x95\xb9\xa9" + "\x6f\x0f\x26\x5b\x70\x2b\x03\x7d\x2b\x03\x7d\x2b\xb3\xd1\xb7\x32" + "\x91\xbe\x95\x81\xbe\x95\x89\xf4\xed\x88\x0b\xb8\x8d\xfd\xfa\xd2" + "\xc5\x2d\xda\xe1\xdc\xe1\x20\xb8\xb9\xab\x6f\x2d\x22\xdc\x40\xdf" + "\xca\x40\xdf\xca\x6c\xf4\xad\x4c\xa4\x6f\x65\xa0\x6f\x65\x22\x7d" + "\xfb\xc4\x05\xdc\x6e\xcd\xba\x74\x71\x5b\xe9\xf0\xfd\xe7\x81\x71" + "\x2b\x77\x53\xdf\x1e\x9a\x66\xc1\xad\x1c\xf4\xad\x1c\xf4\xad\xdc" + "\x46\xdf\xca\x45\xfa\x56\x0e\xfa\x56\x2e\xd2\xb7\x75\x2e\xe0\xb6" + "\x68\xce\xa5\x8b\x5b\x9c\xc3\xf1\x4f\x01\x37\x01\x33\xc4\x8f\xc3" + "\x8d\x0d\x25\x46\x88\x27\x77\x2f\xa5\xb8\x21\x5e\x1c\x76\xa7\x42" + "\xbd\xb2\x79\xcc\x8c\x3c\x66\x28\x3f\xc4\x0d\xe3\x48\x0e\x37\x89" + "\xd4\x07\x63\x48\x23\xc4\x92\x42\x1c\xf9\x90\x9a\xed\x6e\x50\x97" + "\xf6\xc5\x91\x46\xdb\x38\x32\x52\x1c\x47\xee\xb1\xc2\x4b\x73\x06" + "\xf0\x62\x78\xbc\x16\x3b\x88\x23\x57\x7c\xe6\x00\xaf\xe6\x41\xf1" + "\x02\x6c\xbc\x7b\x4f\x51\xbc\x5e\xe7\xe3\xff\x82\xf8\x21\xe2\xb5" + "\x0a\xf0\xc2\xf8\xff\x08\x61\xb6\x3d\xe5\x2a\x5e\xab\x06\x8d\xff" + "\xed\xe3\x55\xe6\xef\x1a\x5e\x0f\x26\x5b\xf0\x2a\x0b\x36\x82\x4f" + "\x13\xfc\x99\x05\x2f\xea\xcf\x8c\xb6\xfe\x2c\x52\xec\xcf\x9c\xc1" + "\xcb\xc6\x9f\x5d\x52\x78\x25\x38\x1c\xff\x37\x41\x5f\xdc\x04\x76" + "\x0e\xc7\x2b\x3d\x3b\xa0\x9f\x6c\x64\x7f\x5a\x68\x80\x7e\xb2\x71" + "\x54\xe0\xe6\x18\xe2\xd7\xbb\x1a\xfa\xc9\x80\x9d\x26\x86\xcc\xce" + "\x8a\x21\x52\xf3\x73\xd0\x57\x3e\x06\x7d\x65\xb0\x4f\x3d\xbf\xa8" + "\xbd\xea\xc3\xf5\xc4\x0c\x7d\x65\x1c\x07\x83\xfa\xfa\xb1\xbf\x40" + "\x5f\xb9\x1d\x6c\x5f\xfb\xeb\xb4\xaf\xfc\xa3\xd0\x57\x7e\xcf\xaa" + "\xaf\xfc\xd2\xb3\x7c\x5f\x99\x97\x7f\x81\x58\xf6\x4f\x56\x3a\xe8" + "\x2b\xd7\x0d\xda\x57\xc6\x3e\xf2\x36\xec\x2f\xff\xaa\x1e\xb7\x95" + "\xb7\x6d\xaf\x9f\x18\x62\x5f\xf9\x57\xe8\x2b\xa7\x53\xd9\xbf\xee" + "\xb2\xec\x13\x1d\x3e\xff\x81\xba\x81\xfa\xd2\xe7\x8b\x40\xce\x82" + "\x0f\xea\x05\x1f\x84\xe3\x19\x3d\x9a\xed\x7b\x81\xaf\x9c\x7e\x70" + "\x3e\x69\xb5\x8f\x07\xea\x06\xea\x09\xea\x06\xe7\x8b\xc0\x0e\x82" + "\x2f\xca\x28\x7a\x96\xcc\x2a\x7e\x96\xcc\x34\xca\xad\xfb\xc8\x0f" + "\x45\x20\x1e\x16\xdb\x66\xb6\xb5\x6d\xcb\xc5\xb6\xed\xbd\xfe\xbe" + "\x68\x30\xdb\xf6\xac\x23\x5d\xa9\x1b\x54\x57\x50\x47\x38\x7f\x04" + "\xfa\x72\x2e\x74\xe5\xf5\xef\x5c\xc5\x6b\xb5\xc3\xe7\x3f\x9c\xc3" + "\xab\x74\xe6\xe0\x78\x95\xfa\x03\x5e\xad\x16\xbc\xac\xfb\xc6\x16" + "\xbc\x68\xdf\xd8\x6c\xdb\x37\x5e\x2e\xee\x1b\x3b\x83\x97\x6d\xdf" + "\xf8\x52\xc2\xeb\x85\x92\x21\xe2\xe5\x84\x7e\x95\x82\x7e\x3d\x3c" + "\x4d\x84\x97\x55\x9f\x58\x84\x97\x48\xbf\x44\x7d\xe2\xe5\xe2\x3e" + "\xb1\x33\x78\xd9\xf6\x89\x2f\x25\xbc\xd6\x3a\x7c\xfe\xc3\x39\xbc" + "\xca\x9c\xd0\xaf\x32\xd0\xaf\x87\xd3\x2c\x78\x59\xf7\x85\x2d\x78" + "\x95\x89\xf4\x4b\x14\x3b\x2c\x17\xc7\x0e\xce\xe0\x65\xdb\x17\xbe" + "\x94\xf0\x5a\x47\x86\x88\x97\x13\xfa\x55\x86\xfa\xd5\x22\xc2\xcb" + "\xaa\x0f\x2c\xc2\x4b\xa4\x5f\xa2\x3e\xf0\x72\x71\x1f\xd8\x19\xbc" + "\x6c\xfb\xc0\x97\x12\x5e\x29\xd5\x43\xc3\xab\xdc\x09\xfd\x2a\x07" + "\xfd\x9a\xaf\xb2\xe0\x65\xdd\xf7\xb5\xe0\x55\x2e\xd2\x2f\x51\xdf" + "\x77\xb9\xb8\xef\xeb\x0c\x5e\xb6\x7d\xdf\x4b\x09\xaf\xb4\xf0\x81" + "\xfa\x52\xe2\x3e\x94\x31\xd5\x82\x17\x62\xd3\x0b\x7d\xa7\x5e\xd9" + "\xf6\xbd\x8e\xfb\x4f\x0f\x65\x38\xea\xef\xe2\xda\x35\x0f\x75\xe0" + "\xfb\x20\x34\x26\x64\x6d\x62\xc2\x06\x75\x25\xb1\xee\xf3\x7e\xd2" + "\xaf\x0f\xd5\x2b\x8c\x51\x2c\x71\xd4\xe7\xfd\xc8\xed\x3e\x14\xe2" + "\x84\xfd\x28\xe3\x2a\xc0\x89\x8f\xe3\xb7\x0d\x71\x8c\xa2\xf7\x94" + "\x8a\xd9\x06\x71\x7c\xf2\x12\xe8\x43\x2d\x75\x15\xa7\x74\x0f\x47" + "\x38\xe1\x38\x11\xf6\x79\xb1\x2f\x85\xf3\x8e\x8d\xed\x1d\x24\x2b" + "\x91\x28\xb8\xb9\xc7\x0e\xeb\xb9\xc7\xcd\x47\xa1\x4f\xb5\x12\x70" + "\xeb\x0d\x25\x39\x47\xc9\x6c\xcd\xb3\xb4\x4f\x25\xf4\xa7\x1a\x0d" + "\xdd\xdc\xdc\x63\x93\x51\x47\x1e\xd4\xb1\xdd\xc5\x90\x1f\xfb\x51" + "\xf5\xe1\xaf\x13\xd4\x95\xd4\x1f\x88\x1c\x31\x80\x3e\x18\x87\x87" + "\xb8\x0f\x55\x24\x9e\x6f\x5c\xe1\xa8\x0f\x35\xf8\x7c\x63\xc1\x09" + "\xda\x7f\xe2\xe6\x1b\x2f\x8a\x3e\xd4\x06\x87\xf3\x1f\x0b\x76\xd1" + "\xf1\x06\x94\x7d\x93\xca\x48\x80\x4f\x3f\x79\x75\xd2\x71\x3d\x63" + "\xce\xf6\x6a\xec\xd3\x62\x7f\xb6\x29\xa9\x8e\x64\xad\x21\x8a\x9e" + "\xae\x50\x2f\xe8\xa3\xca\x8d\x60\xeb\x5e\x3a\x46\x65\x8f\xef\x88" + "\xe9\x9f\x53\x73\xcf\xca\x60\x5f\x16\x75\x85\x9b\x73\x5c\x4a\x66" + "\x16\xb4\x91\x59\x9c\x7e\x80\x5e\x18\xb3\x77\x86\x9b\xe5\xdb\x5b" + "\x50\x4f\x1e\x3c\xcc\x76\x23\x06\xa8\x1f\x5f\x1e\x46\x6c\xf6\x90" + "\xd4\x23\x14\x1b\x0e\x17\xc6\x7a\x2e\xb8\xbf\x6e\x7c\xed\x00\x9f" + "\x1a\xe7\xf0\x59\x69\x8d\x4f\xa1\xbb\xf3\xc1\xc2\xf3\x91\x2b\x55" + "\x4c\x21\x3f\x1f\xfc\xfa\x93\xae\xe2\xf3\x62\xbf\xf7\x9f\x9d\xc3" + "\xa7\xd4\xdf\x3d\x7c\x4a\x83\xb9\xb9\x45\x2b\x7c\x4a\xd5\x14\x9f" + "\xd2\x10\xec\x2b\x59\xf0\x39\xed\x24\x3e\x36\x7d\xa4\x4b\x0a\x9f" + "\x8d\x0e\xc7\x7f\x06\xc1\xc7\x4d\xfd\x29\x6d\xe6\xe6\x10\xad\xf1" + "\xe1\xf5\xa7\xb4\x05\xfb\x46\x16\x7c\x8e\x3b\x89\x8f\x4d\x9f\xe8" + "\x92\xc2\x27\xd3\xe1\xf8\xf7\xc0\xf8\x94\xb9\xa9\x3f\x65\xc1\xdc" + "\x5c\xa1\x15\x3e\x65\xbc\xfe\x94\x85\x60\x5f\xc8\x82\xcf\x11\x27" + "\xf1\xb1\x1d\x3f\xbd\x94\xf0\xc9\x92\xba\x89\x8f\x9b\xfa\x53\xd6" + "\xcc\xcd\x09\x5a\xe3\xc3\xeb\x4f\x59\x0b\xf6\x7d\x2c\xf8\x7c\xe2" + "\x24\x3e\x36\x7d\x9e\x4b\x0a\x9f\x97\xca\xdd\xc3\xa7\xdc\x4d\xfd" + "\x29\x0f\xe6\xe6\xfe\xac\xf0\x29\xe7\xf5\xa7\x3c\x04\xfb\x3a\x16" + "\x7c\xd6\x39\x89\x8f\x4d\x1f\xe7\x92\xc2\x27\x7b\xee\x60\xf3\x45" + "\x42\xec\x2c\x9e\x97\xed\x85\xf8\x0d\xe3\x67\x8c\x9d\x1b\x0d\x35" + "\xc4\xb8\x92\x62\x93\x75\x86\x28\x34\x3c\x36\xdc\x9c\xec\x73\x74" + "\x4e\x96\x8b\xdb\x36\x06\x26\xb0\xeb\xa5\x3e\x18\x97\x71\xf3\xae" + "\xdc\xdc\xc4\xe7\x78\xae\xa3\x57\x14\xbf\x61\x1f\x15\x62\x6f\x82" + "\xfd\xd4\xd4\x1f\x5d\x88\xdb\x96\x3a\xc2\x65\xf0\xb9\x89\x02\xd1" + "\x73\x7c\x42\xdf\x73\x58\x71\x71\x79\xde\x35\xc7\xe1\xfe\x4f\x03" + "\xe3\x52\xe6\xef\x1a\x2e\xe0\x6f\x36\x3e\x98\x4c\x71\x39\x62\x83" + "\x4b\x99\xba\x57\xe4\x77\x9c\xc7\xc5\xc6\xdf\x5c\x52\xb8\xe4\x26" + "\x38\xec\x6b\x82\x5d\x42\x4c\xf0\xf9\xee\xcd\x4b\x89\x5f\x56\x1b" + "\x99\xdd\xfb\x8b\xcf\x98\x85\x60\xe7\x7a\x9f\xf3\xf1\x68\x04\x1b" + "\x97\x62\x60\x7f\xf2\x34\x8c\x0a\xfc\xa2\x45\x4f\x1a\xc3\x75\xa4" + "\x67\x75\x28\xc9\x3e\x86\xcf\xaa\xd7\x90\x4d\xf1\xd8\x97\x7f\x87" + "\x7c\x79\xf8\x24\x59\x58\xc1\xf6\x36\x75\xd6\x10\xed\x9a\x77\x08" + "\xfb\x9c\x6a\x4c\x31\xe4\x79\x1a\x64\x78\x82\x79\x79\xda\x59\xe8" + "\x8f\xce\x48\x22\x8a\xf9\x9d\x6c\x77\x63\xe7\x17\x64\x1b\xdc\xeb" + "\xf3\x24\x42\x50\xbe\x88\x49\xf6\xb3\xd8\xff\xfc\x84\x62\xf2\x08" + "\xc5\xe4\x75\x51\xff\x53\x09\xe7\x8f\xc6\x02\x1e\xbf\xd9\xe0\x71" + "\xb8\x83\x80\x7c\x47\x2d\x34\x00\x1e\x06\x01\x8f\xe3\x24\x25\x0e" + "\xf1\xd0\xf5\x3d\xef\xda\xc3\xe3\x51\x80\xf6\x2b\x96\x28\xb6\x0a" + "\xfd\xcf\x13\x22\x3c\x84\x77\xb2\xc4\x78\x08\x7d\xff\xd5\x80\x47" + "\xa2\xa5\xff\x79\x16\xfa\x9f\x5b\xa1\xff\x99\xfa\x15\x61\xb6\xa6" + "\xb8\x8a\xc7\x2b\x0e\xfd\xbf\x80\x05\xfa\x96\x5e\xcf\xed\xd5\x88" + "\x43\x53\x52\x35\x41\x4c\xd0\x9f\x98\x7e\xf1\xf1\x48\x4e\x00\xdd" + "\xd1\x8d\x0a\xec\x61\xa1\xcf\x0f\xfd\xfd\xa6\xb0\x6f\x09\x8e\x19" + "\x50\x0c\x7a\x7b\x9b\xf4\x35\x04\x65\xaf\x5d\xf3\x2d\x87\xc3\x09" + "\xe6\x95\xaa\xa7\x0c\x84\xb9\x11\x78\x08\xfd\x7d\xc5\xd3\xf8\x5e" + "\x2e\xd8\xb6\x6d\x2b\xc8\xac\xf9\xb1\x6c\x37\xf6\x4d\x51\x87\xf0" + "\xd9\x13\xb4\x6b\x8d\xb1\x9f\x11\x1c\xd7\xe9\x95\xef\x0c\xff\x1c" + "\x98\x83\xf6\x0d\xe5\x3e\xf2\x79\x0b\x4e\xf8\x3c\x09\x87\xd5\x63" + "\x4e\x3c\xe7\x2a\xc6\x2b\x4c\xe7\xd4\xf3\xc9\x3d\xfc\x78\x41\x81" + "\x30\xa6\xe6\xee\x78\x81\x30\xa6\xf6\x2b\x7d\x9e\x24\xf5\x1b\xd0" + "\x1f\x97\xf1\x7a\x75\xaf\x73\x78\x95\xfa\xbb\x8e\x57\x97\x1d\xbc" + "\xf2\xc2\xfa\xe3\x55\x1a\x2c\xc2\xab\xde\x82\x57\xa9\x9a\xe2\x55" + "\x1a\x62\xc1\xab\x34\x74\x70\xbc\x06\x78\xbe\xf5\x77\x8f\xd7\x6b" + "\x0e\xfb\x3f\x36\x78\xb9\xa1\x5f\xbf\xda\xc1\x6b\x8b\xcc\x0e\x5e" + "\x22\xfd\x7a\xd0\x4f\x84\x17\xaf\x5f\xa5\x22\xfd\x2a\x75\x42\xbf" + "\x06\x78\xae\xf5\x77\x8f\xd7\x3f\x1c\x3e\xff\x63\x8d\x57\x99\x1b" + "\xfa\xf5\xbd\x1d\xbc\xfe\x51\xdb\x1f\xaf\x32\x91\x7e\x41\x6c\xd1" + "\x87\x57\x19\xaf\x5f\x65\x22\xfd\x2a\x73\x42\xbf\x06\x78\x9e\xf5" + "\x77\x8f\x57\xfe\x80\xcf\xff\x88\xf0\x72\x43\xbf\x3e\xb5\x83\xd7" + "\xd6\x28\x3b\x78\x89\xf5\xab\x45\x84\x17\xaf\x5f\x65\x22\xfd\x2a" + "\x73\x42\xbf\x06\x78\x8e\xf5\x77\x8f\xd7\xeb\x0e\xe3\x3f\x6b\xbc" + "\xca\xdd\xd0\xaf\x54\x3b\x78\x6d\xf3\xed\x8f\x57\xb9\x48\xbf\x1e" + "\x9a\x66\xc1\xab\x9c\xd7\xaf\x72\x91\x7e\x95\x3b\xa1\x5f\x03\x3c" + "\xbf\xfa\xbb\xc7\xab\xc0\xe1\xf8\xb7\x18\xaf\x9e\x1c\x21\x3e\xac" + "\xb0\xc6\x0b\xe2\x75\xaf\x76\xda\xb7\x12\xf0\x72\x1c\x1b\x16\xd4" + "\xf5\x61\xf5\xa3\x25\x36\xe4\x70\xe2\xe7\x29\x10\x1f\x8c\x11\x31" + "\x26\xec\xc9\xa6\x18\xe1\x1c\xe0\x80\x71\xa1\x33\xef\x3f\xb9\x81" + "\x93\xd0\xaf\x1a\x76\x9c\x0e\xb9\x83\x53\xa1\xc3\xf7\x9f\xac\x71" + "\x12\xfc\x96\xb3\x38\xd9\xf3\x59\x45\xb1\xfd\x71\x2a\x0b\xb6\xe0" + "\x44\xfd\x14\xfa\x2e\xf4\x55\xd6\x38\x0d\xe0\xaf\x9c\x79\xff\xe2" + "\x77\x8f\x53\xb1\x43\xfb\x97\xcb\x98\xab\xe1\xa8\x81\x43\x0b\x47" + "\x9d\x89\x21\xf3\x0a\x19\x33\xf7\xfe\x2b\xae\xf3\x57\x98\xde\xef" + "\xfc\x15\xec\x15\x2a\x6f\xcc\x03\xb2\xe5\xe2\x16\xa1\x0c\x36\x8b" + "\xa0\xec\xb4\x72\x49\x38\x29\xa4\x79\x47\x09\x65\xc9\xd7\x93\x00" + "\xa1\x2c\x68\x53\x1a\xc8\x5a\xeb\xb5\x3e\xe0\x0a\xc8\x5f\xc7\x66" + "\x45\x74\x42\x5e\x0f\xae\xcc\xf5\x52\x5f\x6e\x8d\x12\x3e\xaf\x29" + "\x5d\x82\xef\x87\x6b\xbd\x24\x90\x97\x96\x39\x9a\xcf\xa7\x34\xa7" + "\x13\x25\x57\x4f\x86\xc1\xfb\xd9\xd6\x73\x0c\x9f\xcf\x4f\x5c\x47" + "\xf9\xfa\x00\xae\x3c\x3e\xcf\x95\xec\x15\x92\x34\xbe\x2d\x2a\x71" + "\x3e\xd3\x1c\x82\x65\x0a\xf9\x64\x7c\x59\xd3\xac\xf2\x94\x12\x82" + "\xfb\xd1\x72\xf5\x4b\x62\x08\x5f\x3f\x39\xe6\x35\x8d\x59\xa6\x35" + "\x49\xa4\xfe\x66\x86\xf8\x5b\x5d\xb3\x91\x70\xf9\xf9\xbc\x9e\x5c" + "\xde\x2b\x16\x24\x41\xde\x99\xbc\xcc\xa5\x62\x99\xf3\xf9\xbc\x04" + "\x39\x8a\xcf\x99\xd2\x19\x2c\x0b\xcf\x2b\xd8\x2b\xe6\x27\x43\x1b" + "\x66\x0b\xf9\x84\xfb\x35\xa9\x09\xe1\xf2\x32\xe4\x26\x1e\x93\xb1" + "\xd0\x8e\x00\x21\x1f\xae\xa7\x20\xe4\x4d\x35\x91\x6b\x8a\x2d\xb2" + "\x19\x67\xca\x5a\x9e\x66\x5a\x2f\x9d\x6b\x5b\xa6\xd7\x7a\x89\x0e" + "\xf3\x35\x74\x70\x65\x03\x7e\xcb\x67\x42\xfe\xab\x78\x19\x05\x52" + "\x4c\x14\x7d\x98\x98\x18\x23\x9e\xd3\x16\xd1\xba\x7a\xf3\xf9\xe6" + "\xf7\xcf\x27\x15\xe7\xbb\x9a\xca\x31\xae\x0a\x64\x13\xdc\x3f\xaf" + "\x87\x38\xef\x78\x9a\xf7\x99\x30\xc8\x1b\xd2\x3f\xaf\x42\x9c\xf7" + "\x0f\x34\x6f\xa4\x37\xe4\x0d\xb5\x53\xd7\x71\xa2\xbc\x3e\x34\xef" + "\xb3\xf5\x90\x37\xac\x7f\x5e\xa5\x38\xef\x35\x34\xef\x2a\xac\x43" + "\x78\xff\xbc\x01\xe2\xbc\x13\x68\xde\xa8\x0c\xc8\x1b\xd1\x3f\x6f" + "\x9a\x38\xef\x1f\x69\xde\x98\xd9\x90\x57\x6d\x9b\xb7\x98\x62\x7b" + "\x1d\x8f\xad\x2f\xcd\xbb\xd2\x00\x79\xa3\xec\xb4\x6d\x04\x57\x2e" + "\xcd\x3b\x91\xe6\x5d\xde\x0a\x79\x63\xed\x60\x21\xce\x3b\x89\xe6" + "\x4d\xab\x80\xbc\x09\x76\xb0\x10\xe7\xbd\x96\xe6\x4d\xcc\x84\xbc" + "\x49\x76\xb0\xb0\xe4\x1d\x93\x34\x0b\xf2\x24\x43\x3b\x9b\xed\xc8" + "\x56\x5c\xe6\x64\x5a\xe6\x0b\x1d\x90\x3f\xcd\x8e\x6c\xc5\x79\xaf" + "\xa3\x79\xd7\xe6\x43\xde\x0c\x3b\xb2\x15\xe7\xfd\x13\xcd\xbb\x2e" + "\x10\xf2\x66\xf6\xcf\x0b\xfa\x46\xe5\x7b\x33\x2f\x5f\x3f\x9a\x3f" + "\xa5\x1b\xf2\x6b\xec\xc8\x17\xcb\x13\x74\x76\x0a\xcd\xfb\xbc\x0c" + "\xf2\xe6\xda\x91\xaf\x38\xef\x9f\x69\xde\x6c\x0d\xe4\xcd\xb3\x23" + "\x5f\x71\xde\xbf\xd0\xbc\x1b\x90\x93\xf9\x76\xe4\x2b\xce\xab\xa2" + "\x79\x5f\x8c\x82\xbc\x05\x76\xea\x7b\x9d\x28\xef\x54\x9a\xf7\xbf" + "\xb0\xbe\x25\x76\xf0\x10\xe7\xbd\x9e\xe6\xdd\xec\x07\x79\xcb\xed" + "\xe0\x21\xce\x7b\x03\xcd\x9b\x89\x7a\x5c\x61\x07\x8f\xbe\xbc\xe0" + "\x17\xa6\x99\xc6\x64\xcd\x2f\xc6\xfc\x12\x29\x5d\x1f\x83\xe1\xd6" + "\xf7\xe7\xf2\x02\x4f\xb4\xbc\xbd\x9b\x4e\xcb\x7c\xa9\x13\xf2\x71" + "\xcf\xe7\x61\x9e\x86\x6e\xce\x1e\x81\x7f\x31\xfe\xb5\xd8\x62\xbb" + "\x6f\xa4\x79\xd3\x83\x21\xef\x5e\xb1\x0d\x65\x19\xa9\x38\xdf\x0c" + "\x9a\xaf\x00\x65\x55\x63\x9d\xcf\xc3\x92\x6f\xcc\x2b\xf3\xe1\x7c" + "\x6d\x91\x8d\x3d\x86\x7a\x8a\xcb\xba\x89\x96\xf5\xaa\x11\xf2\x6a" + "\xad\xf3\x19\x6f\x16\xe5\xbb\x99\xe6\x7b\x0d\x65\x73\xc0\x3a\x9f" + "\x52\x9c\xef\xaf\x34\x5f\x11\xda\xac\x3a\xeb\x7c\x01\xe2\x7c\x33" + "\x4d\x59\xff\x08\xe3\xf2\xae\x97\xd6\xdb\xca\x0f\x64\x7d\xb3\xc8" + "\xa7\xdd\x62\xca\xda\x2a\xe3\xf3\x36\x0b\x32\xe4\xe4\x4c\x39\xcf" + "\xf0\x9c\xbf\xd5\x94\xf5\x7a\x2d\x9f\xaf\x45\xec\x07\x44\xbe\xf6" + "\x36\x76\x4c\x6e\x2d\xef\x47\x5b\xb9\xfb\xae\x97\x1e\xb6\x17\x6f" + "\xc4\x5e\x4f\xae\x3c\xc6\x54\x24\x50\xdf\x23\xac\xa9\xbf\x8b\xb3" + "\x97\xe6\x82\xa8\xdc\x20\x03\x6b\x14\xa7\x6d\x66\xd8\xe6\x19\x06" + "\x22\xc5\xf5\x93\x58\x79\x65\x8d\x0e\xd2\xf5\x13\xa3\xaa\xbb\xb2" + "\x2a\xd2\x74\x92\x07\xc2\x70\x2d\x0f\xf8\xae\xd1\x91\xec\x56\xfc" + "\xbe\x39\x1d\xe2\x41\x26\x40\x82\x6b\x30\x17\xc3\xf7\x1c\x38\xb8" + "\x75\x8f\x63\x09\xc3\x6e\x24\x01\xda\x44\x23\x39\x9a\x44\x18\x73" + "\x4e\x5c\xb0\x32\x1e\xd7\x13\xa9\x38\xc4\xae\x56\xcf\x86\xba\xc4" + "\xc2\x7d\x23\xda\xe0\x37\x57\x17\x68\x3f\xf8\xc6\x28\x6d\x3c\xae" + "\x31\xb4\x4b\xae\x97\xef\x8e\x65\x37\x2c\xfa\x39\x36\x85\x5c\x7b" + "\x8c\xd9\x25\x3b\x05\xb6\xe1\xd4\x6a\xf5\xdd\x58\x86\x59\x1e\x17" + "\x05\x79\xe6\xe3\x5a\x24\x6c\x7e\x55\x30\x5d\xa7\x64\xd7\x12\xae" + "\xfe\xe9\x6c\x33\xeb\x1b\x95\x66\xee\xc9\x48\xc3\xfd\x1b\xb4\x29" + "\xc7\x48\x9b\xe8\x9c\xfe\x9a\x2a\x6e\x0d\x13\x6c\x17\xb4\x31\xad" + "\x2b\x6b\x57\xa8\x4e\xf2\x17\x7e\x8d\x98\x5d\x0e\xf7\x07\x85\xd8" + "\xda\x8b\xcd\x8e\xcb\x84\xfc\x99\x10\xdf\xed\xa5\x72\xd8\x95\xa7" + "\x93\x4c\x2a\xe7\xbf\x97\xe8\x24\x93\x75\xfc\xf7\x2a\x9d\xe4\xae" + "\x5a\xfe\x7b\x8d\xb0\xf6\x8a\xfd\xb5\x60\xe2\xc2\xa0\xdd\x09\xe6" + "\x6d\xa1\x1e\x18\x8f\xe2\xba\x6c\xac\x3c\x2e\x4c\x39\x09\xf7\xeb" + "\xa8\x0c\x86\x7b\x26\xd0\xf5\x34\x2b\xaf\x86\x4f\x2f\xfe\x53\xcf" + "\x7f\xb2\x98\x87\xc3\xd6\x37\x9a\xb0\x9a\x1d\x81\xd8\xe6\x14\x13" + "\x6b\x86\x72\xf3\xd9\xcc\x1f\x3a\x9a\x92\x3a\x08\x5d\x87\xba\xf2" + "\x5e\xc2\xad\x8b\x03\x72\x05\xd9\xb3\xa3\x7f\xe8\xe0\xee\x95\xbd" + "\x3b\x56\x5c\x2f\x7c\x58\xda\xff\xa6\x9b\xff\x3a\xf3\x96\x5b\x6f" + "\x9b\x75\xfb\x92\xa5\xcb\x22\x96\xaf\x78\x46\x1d\xf9\xec\x73\x51" + "\xd1\x31\x2b\x63\xe3\xe2\x57\x25\x3c\x9f\xb8\x3a\xe9\x85\x35\x98" + "\xaf\xaf\x0d\xdb\xe6\x4a\x0c\x0c\x81\xfb\xcc\xc1\xfb\x70\xfb\xde" + "\x61\x1a\xc5\xa5\xb2\x5c\xaa\xb4\x2f\xd3\x26\x1f\x42\x70\x5d\xe6" + "\x4e\x66\xb7\x04\xd7\x88\x06\x0e\x48\x9a\x0a\x1e\xd0\xe2\x1e\x03" + "\xed\x4c\xa5\xa1\x51\xff\x80\x16\xf7\xb8\xd8\xef\xd3\x41\xfc\xae" + "\xc3\x7d\x08\x2a\x75\x78\xbe\xf8\xcf\x84\x1c\x80\x6b\xed\x95\x79" + "\x9d\x82\xf8\xbc\x3a\x9e\xd5\xe7\x8d\x67\x3b\xb1\xfc\xbc\x2d\x6c" + "\x87\x7e\xad\x9a\xe4\xc0\x6f\xe0\x8e\xe2\x28\xb3\xfb\xbd\xfd\x10" + "\xf1\x42\x2c\xeb\x5b\xb4\x85\x6d\xcf\x18\xcf\xb6\x6f\xd8\xc2\x76" + "\x16\x8f\x67\x75\x7e\x79\x44\xd6\x95\xb5\x5b\xad\x63\x2a\xb5\x1c" + "\xb7\xe1\xbc\x79\x4c\x65\xf8\x66\x38\x37\xc3\x48\x46\x14\xc3\x6f" + "\x48\x33\xec\x57\xd2\x7a\xbf\x75\xb2\x7b\x24\x94\x37\x9f\xed\x8d" + "\x92\xe4\xc0\x7d\x28\x4e\xbb\x0f\x1d\x00\x2f\x0c\xf7\xd3\x37\x75" + "\xb7\x01\xcf\x76\xb7\xe2\xda\xeb\x70\x3f\xaf\xa6\xfc\x4e\x82\xe5" + "\xbd\x19\xdf\x3d\x72\xd5\x04\xd6\x08\x79\x6b\xcc\x6b\xa3\x24\x90" + "\x27\x0f\xca\x36\x88\xdb\xa3\x5a\x11\x9d\xa0\x8c\x79\x3e\x2a\x6a" + "\xea\x18\xa2\xe2\x3e\xad\xf6\xc7\x48\x80\xf2\xc8\xab\x5b\xd8\x03" + "\xd0\x4e\x2d\xb4\xb7\xae\x01\xa2\x6e\xe0\x0c\x81\x36\xe5\x1e\x65" + "\xaa\xa6\x43\x7a\x2d\x7c\xaf\x85\xba\xd7\xd1\x3d\x15\x3e\x79\x82" + "\xcd\xda\xdd\x0e\xf5\x44\xbb\x8f\x6b\xa6\x91\x53\xab\x43\x24\xd0" + "\xee\x3c\xc8\x57\xa7\x9c\x40\xa6\xc0\x75\xef\x41\x3d\xca\xe1\x3b" + "\xe6\xe7\x74\x06\xf2\x1f\xa0\xed\xfa\xe4\x41\xfc\x0d\xb2\xd2\x16" + "\x8e\x67\x35\x5d\x59\x55\xb9\xb8\x9e\x1d\xb7\xce\x37\xfc\x06\xb9" + "\xd4\x41\xde\xdc\x53\xa9\x21\x12\xe8\x7f\x49\x8a\x2d\x65\x86\x63" + "\x9d\xb0\x1e\xd8\x07\xfc\x12\xa2\x2f\x73\x6f\x28\x99\xde\x4d\x24" + "\x5f\xb6\x13\x52\xb0\x85\x2d\x81\xa3\x00\x8e\xfc\x2f\xe0\xdc\x41" + "\x38\xea\x20\xbd\x1e\x3e\xbf\x80\xcf\x83\xed\xdc\x9c\x9d\x0f\xd6" + "\x7b\x55\x32\xdb\x31\x23\x9f\xfc\x09\xcb\x07\x6e\x3d\xde\xc6\xd4" + "\x56\x63\xdd\x71\xed\x48\x76\xcc\x1e\x3f\xeb\x35\xf6\xde\xcc\x27" + "\x70\x1e\x3e\xab\xe8\xa7\xf8\x78\x13\x7a\xb6\x6f\x79\xd3\xef\x6f" + "\x85\xc1\xef\x0c\xfe\x3b\x58\xad\xb7\x92\x07\x3f\x6c\xcb\x73\x74" + "\xbc\xd5\xe1\x7c\x5e\x67\x8e\x4f\xfc\x9c\xcb\xf7\x76\x09\x61\xde" + "\xed\x26\xcc\x5e\x7f\xeb\xf4\xbd\x1e\x34\xad\xa6\x85\xfe\xae\xd1" + "\xd1\xcf\x0f\x65\x70\x80\x9c\x3e\x82\xf2\x3f\x0a\xa4\x69\x1f\x85" + "\xc0\x67\x01\x1c\x15\xd6\xf7\xff\x04\xae\xff\x64\x36\xe2\xd9\x9b" + "\x0e\x76\x1b\xb0\xd4\x31\x55\x06\xc4\x68\x33\xe5\x96\xc4\xcc\x72" + "\x69\x7a\xe0\x56\x81\x85\x3f\x6f\xfe\x68\xcd\x9f\x37\x9b\x6d\xf8" + "\x93\x8b\xf6\x08\xae\x9b\x5d\x4c\xf9\x52\x7b\x6a\x6d\x04\xfc\x7e" + "\xb3\x05\xca\xa9\x55\x3e\x85\x65\xbc\xc5\xf5\x75\x36\x1f\x23\x44" + "\xae\x26\x52\xb4\x2f\x9d\xcc\x5b\x53\x90\xb3\x78\x6f\xfe\xbe\xb4" + "\x2e\x50\x3f\x48\x2b\xc1\xfa\xad\x84\x72\xe1\x77\x39\xe4\x2b\x69" + "\x22\x27\x85\xba\x71\xd7\x64\x3d\x0b\x7c\xe4\xeb\x8b\x65\xe2\x75" + "\xac\xa5\x5d\x7a\xbc\x86\xbf\xf7\x21\x48\xc7\xfe\x25\x49\xfd\x8d" + "\x8c\xc0\xe7\x9b\x91\x93\xf8\xd9\x64\xf4\x07\x5d\x0a\x24\xe6\xae" + "\x50\x32\xc3\x87\xf8\x83\xbe\x8d\x6e\x63\xde\xaa\xbd\x31\x99\xf8" + "\x63\x79\x68\xd7\x75\xcc\x5b\x69\xc5\xa8\x8b\xb4\xac\xaf\x08\xb7" + "\x4e\x56\x95\xfe\x8b\x58\xc2\xdd\xa7\x08\xeb\x03\xe7\x45\xf7\xcd" + "\xc3\xbe\xe4\xe6\x35\xb4\xad\x70\xaf\x72\xb8\xbe\x1a\xdb\x8e\xf2" + "\x84\xf3\x35\x47\x99\x6a\x1f\x3c\xc7\xad\xbf\x4d\xdb\x53\x8e\x6b" + "\xb4\xa2\x3c\x30\x3f\xee\xd9\x42\xd7\xec\xab\xe2\xd6\x44\x83\xf2" + "\xab\x11\x0f\x16\xee\x81\x65\xa4\x1a\x59\x23\x0b\xf6\xa8\x6c\x4d" + "\x37\xf8\xff\xb7\x5f\xb6\xc6\xa7\x3a\x56\x8c\x0f\x5c\x57\x0d\xd7" + "\x1f\x60\xa1\x8d\x68\x4f\xe0\x9e\x5e\xe8\xf3\x21\x2d\xd7\x9c\x05" + "\x65\x24\x76\x73\xe3\x29\x50\xce\x7a\xa8\x4b\x2e\x96\x03\xf5\x39" + "\xc0\x97\x55\xbb\x2f\xd9\x1a\x6b\xbe\xbc\x72\xc4\x9c\xd3\xe7\x35" + "\x5c\x9b\xc0\x76\xbd\xfd\x48\x11\x3d\x57\x03\x79\x6a\xd8\xde\x40" + "\x82\x6b\x9e\x52\x5f\xc2\x9d\xdb\x9b\x7a\x96\xc3\xf7\x00\xb5\x6b" + "\x6f\xc7\xad\x5a\xc7\x76\x58\xea\xfd\xb6\x4a\x58\x37\x96\xaf\xf7" + "\x5e\xbc\x1f\xbb\x3a\x8c\xf3\xad\x78\x0f\xbc\x9e\x2f\x4f\x8a\xe5" + "\x09\xb2\xba\x11\xea\x41\xe5\x55\x3d\x0b\xd2\xcb\x91\x8b\x9c\xdc" + "\xc0\x8e\x9e\x4a\x45\x2e\xbe\x3d\x0d\xae\xaf\xcd\xc1\xdf\xab\xf1" + "\x77\xb5\x96\xb3\xb1\x7d\xe7\xab\x13\xf0\x7c\x13\xf4\xd3\x37\x3f" + "\x07\x5c\x32\x13\xf2\x27\x6f\xe2\x6f\x48\xe7\xda\x56\x65\x58\x3b" + "\x57\xb2\xdf\x48\x08\xd6\x13\x64\x54\x03\x75\x6d\x01\xdb\xef\x8d" + "\x75\x05\x7b\xbd\x97\x2d\x0b\x25\x58\x67\xb0\x67\x7c\xfd\xde\x99" + "\xc7\x63\xbf\x17\xdb\x88\xf2\xbc\x91\xda\x3e\x38\xf7\xee\xcf\x58" + "\x77\x4b\xbb\xdf\x51\x8a\x65\xcc\xb5\x1b\x70\x40\xbc\x10\x17\x4b" + "\x99\x6f\x23\xf7\x73\xa1\xac\x2a\xfa\x9b\x72\x03\x65\x9d\x3b\x9e" + "\xad\xc7\xfc\x96\xbc\xef\x3e\x81\xe7\x52\xe0\xde\x33\x62\x09\xee" + "\x81\x21\xc1\xb5\x7f\xa1\xdc\x2a\xdc\x8f\x07\xca\xa8\x41\x99\x42" + "\xbe\x3d\xc8\x47\xf8\x5d\xcf\xd7\xbb\x0a\xfc\xf9\x34\x38\x66\x5b" + "\xf4\xff\xdd\x42\x6b\x7e\xbd\x63\xab\xff\x88\x77\xae\x39\x35\x90" + "\x70\x7c\x88\x27\xca\x13\xcc\xbb\xb7\xf3\xbe\x83\xc7\xfa\xdd\xec" + "\xfd\xa0\x2f\x96\x32\xde\xf5\xb6\xc1\xba\x86\xe3\xe3\xea\xf9\xb8" + "\x9f\xb1\x04\xae\xad\xa1\xe5\xbc\xc3\xb5\x99\xe3\x53\x3a\xc7\x81" + "\x7a\x76\x35\xb4\xb3\x8f\x07\xef\xc4\xf2\x38\xd7\xdb\xc8\x44\xb0" + "\x5d\xb5\xb8\x47\x03\xda\xa4\xae\x74\x72\x77\x57\xaf\xc5\x2e\x21" + "\xf6\x66\x0e\xfb\x77\x7d\x8a\xa9\xbf\xe5\xed\xd6\x3b\xf4\xfc\x78" + "\x2b\x0e\x63\x9b\x16\x70\xfc\xc5\xba\xa4\x86\x61\x5d\x6a\xb8\x7a" + "\xa4\x2a\x09\x9c\x3b\x80\xf7\x87\xb2\x82\x79\x7d\x15\xca\xf2\xc3" + "\xb2\x36\x80\xad\xc2\x3a\xc1\xbd\xab\x39\xfb\x77\x3f\xd6\x6d\xef" + "\x14\xbe\xee\x75\xdd\xe9\x78\xed\x5b\x3e\x67\x19\xee\xda\x3a\xc8" + "\xa7\xe9\xa6\xeb\x38\x8f\x81\xeb\x2b\x94\x4b\x31\x7f\x4d\x06\xda" + "\x68\xe5\x93\xdc\xf7\x68\xe5\xdf\x81\xab\xc7\x88\x14\xca\xf3\x40" + "\x8e\x0a\xbc\xe8\x64\x6a\x16\x43\x8c\x81\x78\x55\x41\x8c\x54\x81" + "\xf2\x46\x2e\x43\x8c\x34\xb3\x2b\x6b\xaf\x46\xe0\x2d\xdc\xa7\x00" + "\x65\x4f\xf1\xd9\xfb\x15\xf0\xb8\xc6\xc2\xad\xbd\x5f\xf1\x72\xac" + "\x00\x39\x7a\xc0\xfd\x1e\xe1\xdb\x55\x01\xf9\x21\x16\xab\xb9\x97" + "\xaf\x7b\x3e\x9f\xff\xb8\x80\x03\xaf\xab\xf5\x39\x68\x7f\x39\x0c" + "\xde\xcb\xe0\xaf\x2d\xa7\xf7\x7a\xef\x45\x21\x2f\xc6\x88\x74\x7d" + "\xf6\xf7\x5e\x44\x3b\x38\x03\xb0\xe7\x6c\x1f\xb7\x57\x15\x4d\x43" + "\xdd\xa1\xf7\xa8\x99\xce\xf1\x10\xe2\x1e\x0b\x8f\xde\x0b\xb3\xb1" + "\x4f\x68\x8b\x73\x1b\xa1\x0c\xb4\xa7\xc8\x25\xb4\xa9\xd8\x97\x80" + "\xf2\x66\xf2\xfa\xc3\xd7\xf9\xbd\x83\xd6\x5c\xa9\xb9\x06\xb8\x32" + "\x5d\x54\x76\x8d\x3d\x3f\x57\x4c\x6d\x60\x01\xbd\xe6\xfd\xd1\x7c" + "\xdb\xaa\x68\xdb\xf8\xdf\x28\xb7\x14\x94\xdb\x07\x0d\x22\x39\x82" + "\xdc\x3e\xb8\x9d\xcf\x5f\x83\xb6\xdc\xa2\xaf\xef\x3f\x2f\xe8\x72" + "\x7f\x7b\xf1\xc1\x54\xd4\x07\x4b\xbd\xde\x0f\xb6\xb1\x17\x35\xf6" + "\xed\xc5\xfb\x4a\xbe\xbd\x25\x36\xba\x51\x4e\xeb\xce\xfb\x16\xc0" + "\xa1\xd1\xd0\xc3\xaf\x45\x5e\x75\x17\xda\x4f\xbc\xb7\xd8\x07\x15" + "\x51\xb9\xf2\xba\xfc\xc1\xd5\xfd\x71\x78\xbf\x5d\xac\xcf\x88\x35" + "\xda\x04\x2c\x03\x31\xe5\xe2\x4a\x48\xa3\xb8\xbe\x8f\xf1\x6d\xae" + "\xd8\x46\x43\xde\x3c\x33\x8b\xfa\xf2\x7e\x87\xb5\x2e\xbe\x1f\xc2" + "\xeb\xa2\x70\xef\x0f\x01\x23\x7f\xcb\x7d\x3f\x08\xb3\xb9\x2f\x62" + "\x73\x00\xe5\x40\xdb\xf8\xc1\x0e\xc1\xa7\x61\x7e\xb8\x36\x09\xae" + "\xc9\xb5\xf1\x8f\xb9\x58\x3f\xb8\x97\x07\x67\xb3\xb6\x70\xb6\x22" + "\xa9\x8b\xab\xcf\x07\x79\xc5\xbc\x9f\x80\x34\x7f\x3e\x2d\x9c\xf7" + "\x25\x02\x6f\x46\xda\xd4\x49\x6f\x3f\x3e\x7a\xdf\x43\x88\x8f\xb8" + "\xb2\x38\x5b\xf4\x81\x81\x6f\x1f\xa6\x4d\xa7\x69\xef\xd5\x62\x5a" + "\x0e\x95\x43\x1e\xcb\xf9\xab\xf7\xc2\x79\x7f\x85\xfa\xc5\xe8\x98" + "\xbd\xcd\xa8\x63\xf8\x5b\xc7\xd4\x04\x62\xf9\x4d\x69\x3d\xd8\x87" + "\xc8\x87\x73\x51\x68\x0f\xd0\x5e\x28\x57\x50\xbb\xa1\x5c\xc8\x7d" + "\xbe\x86\x76\x07\xe3\x10\x3c\x0f\xf9\xc2\xd0\x16\x41\xfa\x2e\xdc" + "\xd7\x88\xfd\xc5\x03\xca\xad\xd1\xf0\xd7\x7e\xc2\xc5\x0a\xbf\x04" + "\x8e\x10\xd2\x84\xeb\x40\xd7\xa3\xf1\x3a\xbc\x5e\xb0\x5f\x68\xbb" + "\x8c\x68\x9b\xb8\xfb\x7d\x28\xe1\x39\xce\xf5\x1b\x84\xb8\xa8\x97" + "\x11\xe5\xc5\xf5\xa0\x39\x9b\xf6\xe1\x7c\x6a\xcf\x3e\xbc\x0b\xaf" + "\xe5\xf0\x03\x5b\x99\x72\x96\xfd\xa1\x38\x9e\x48\x8b\x4e\x72\x31" + "\xd6\x6c\x5a\xcf\x0f\xf3\x69\x3b\x3e\x5c\xc2\xb5\x83\xda\xd4\x5c" + "\x5a\x97\xaa\xd9\x45\x3d\xdc\xb9\x75\xd8\x16\x3c\xb7\x59\x74\x8e" + "\xed\x55\xe1\xb9\xad\x5c\xbd\x6c\xae\x33\xf7\xaa\xfb\xe5\xc7\x7d" + "\xba\xc0\x86\x22\x1f\x78\xdb\xfb\x91\x0f\x5f\xcf\x6f\x04\xbb\x0b" + "\x72\x89\x40\xdb\xcb\x9d\x5b\xc1\xe7\x59\xc8\x7f\x72\xf6\xfd\xa3" + "\x91\x54\xae\x3e\x0c\x2f\xef\x28\xda\x8e\x8f\xb8\xbd\xbf\xd9\x5f" + "\x42\x41\xb6\x1f\x1a\x05\xd9\x8a\xbf\xa3\xfe\xc0\xfd\x15\xf8\x9b" + "\xe3\x7d\x32\xd7\x87\x2d\xc0\x3c\x58\x27\xea\x23\x6a\x0c\xb6\x31" + "\xf5\x51\xa6\xf6\x65\xf4\x4b\x34\x56\xad\x8d\xe3\xc7\x67\x88\x36" + "\xbe\x14\xfc\xc2\x47\xb5\x82\x8d\x61\xbb\x02\xa1\xcf\xdf\x86\x75" + "\xfc\x04\xd3\x70\x0d\x61\x71\x1e\xb4\x4f\x6f\xf5\xe8\xf8\x32\x3f" + "\xca\x17\xec\x06\xda\x92\x46\x43\x1b\x1f\xd3\x7d\x1c\x58\xc4\xdb" + "\x92\x13\xcc\xc7\x0f\x5a\xc7\x61\x1f\x3f\x68\x6d\x33\x6a\x17\xdb" + "\xda\x0c\x88\x9b\x33\xba\xb2\x3e\xf6\xb5\x8a\x03\x20\x6d\x60\xdb" + "\xf1\x91\x1e\x75\x14\xf7\x65\xe0\xec\x13\x37\xe6\xf4\xf1\xdb\x42" + "\x9d\xd1\x6e\x9e\x5a\x2b\x8c\x5f\xd4\x2e\xc0\x58\xcd\xe6\x7e\x1a" + "\x2b\xdb\x89\xf7\x13\xca\x93\x12\x5c\xd7\x1f\xe4\x80\x63\x2e\x1f" + "\x87\xf1\x76\xbe\xc4\xca\x56\xf2\x3e\x0c\xed\xa4\xb5\xaf\xaa\xba" + "\xcb\xda\x57\xd5\xde\xde\xdf\x46\xd6\x7a\x38\xef\xab\x3e\xd6\xa1" + "\xdd\x12\x6c\xa4\xb5\x2d\xa8\x95\x15\x59\xc5\xb2\x1f\xe7\x09\xb1" + "\xac\xc5\x8e\x7e\xec\x87\x36\x0a\xee\x5f\xc3\xdf\x3b\x43\xc7\x54" + "\x66\x0a\xf7\xd6\x01\xce\x8d\x4a\xe0\x66\xd6\x6e\x3d\x7c\x57\xf3" + "\x31\x20\xa7\x9b\x3d\xdc\xda\xea\x1f\x56\x03\xff\xc6\x20\xcf\xb4" + "\x31\x27\x49\xbb\xc5\x57\x1c\x38\xb5\x52\x90\xef\x27\x57\x8b\xe3" + "\xc2\xc2\x2d\x6c\x26\xdc\xa7\x53\xdc\xc6\x6c\x48\xdb\xcc\x8f\x21" + "\x70\xb2\xe5\xca\xaa\xd5\x16\x6f\xb1\x6e\x1b\x6d\x47\xad\x01\xdb" + "\x81\x7d\x22\xb8\xff\x5e\x8c\x7b\x20\xe6\x83\xef\x7b\x67\x15\xf7" + "\x71\xfe\x4d\xcd\xd9\x74\x71\x7c\x55\x95\x87\xb6\x92\xef\x7b\xd6" + "\x41\xbc\x93\x2b\x1e\x8b\x59\x70\x5f\xb0\x32\x36\x3e\x32\x26\x61" + "\xc5\xcd\xca\xc8\x98\xc8\x84\xc8\x25\x51\x91\x6b\x96\x24\x44\xae" + "\x8c\x99\x16\xbd\xe4\x99\xc8\x65\xca\xd5\x4b\x56\x29\xfd\x93\xa6" + "\x24\x8d\x21\x96\xac\x77\x28\x97\xac\x5a\xf5\x7c\xf4\xf2\x08\x65" + "\x4c\xe4\xb2\xe9\xf1\xcb\x57\x2d\x4f\x50\x2e\x89\x5f\xf9\x7c\x4c" + "\x84\x72\x4a\xc4\x8d\x53\xfc\x6f\x8d\x18\x23\x1e\x43\xbb\x4e\x41" + "\x3a\xcd\x67\x3a\x3a\x36\x9f\x21\x1e\x5e\x92\xd8\x78\xaf\xa4\xc8" + "\x18\x3a\x6e\xf7\xcf\xc5\x33\xf2\x48\x2c\xee\x13\x89\x7b\x8c\xb1" + "\x59\x9f\xc4\xc2\xa7\x14\xf3\x41\x3b\x95\xf0\xdd\x03\xea\xee\xdb" + "\x95\xf5\x4f\xa5\x8e\xf9\xcc\x83\xdb\x3f\x0c\xd2\xa1\x6d\xbe\xec" + "\x99\xba\x0e\x88\xd9\x62\xf1\x39\xe2\xe2\x33\xc4\x3b\x37\x91\x48" + "\xe1\x90\xc1\xa1\xc0\x7d\x24\xe1\x9a\x10\x1d\xf3\x29\xbf\x3e\xf3" + "\x3f\x0d\xfa\xd1\xdf\x67\xb0\x99\xdf\x67\x50\x5c\xfe\xf9\x9b\x30" + "\x1e\x1c\xf4\x22\x09\x42\x7e\xb6\x31\xff\xe4\xd6\x96\xd9\x00\x5c" + "\xc6\xb1\xd4\x53\xff\x9c\x13\x00\xf1\xe0\x61\xed\x04\xee\xdc\x6f" + "\x06\x86\xc8\xa0\x5e\xd2\xfd\xc9\xfe\xe4\x55\xb8\xd7\x2a\x1f\x96" + "\x85\x7b\xd4\x08\xe3\x69\xd0\x06\x05\xb4\xa5\x95\x6f\xc7\x36\xae" + "\x1d\x5b\x58\xbf\xbc\x71\x50\xbf\x57\xb8\xfa\xb4\x0b\x6d\x80\x7a" + "\xb7\x42\x9d\x02\xa1\x9e\x0a\xac\x97\xbd\xb1\x3e\x1c\xef\x3a\xca" + "\x7c\x3a\xdd\x9c\x08\x72\x9b\x44\xf7\x95\xd8\x5c\x44\xf5\x0f\xda" + "\x15\x51\x0c\xdf\x73\x4e\x12\x59\x36\xee\xf1\x97\x7e\x2d\xdb\x60" + "\x30\x92\x26\x75\x2b\xf1\x7a\x81\xd5\xb3\xef\x77\x74\xd0\x36\x7d" + "\x1a\x8a\xb6\xe1\xdd\x67\x5b\xa5\xd8\x26\xf0\x15\xb2\xe2\x93\x0e" + "\xc7\x16\xa5\xaf\x8e\x67\x0d\xec\x36\x71\xcc\xf5\xe9\x3e\x94\x09" + "\xc6\x5b\xa7\xd2\x71\x1f\xb9\x4f\x2b\xe0\xde\x84\x8f\x8d\x0d\x6c" + "\x6f\x98\x28\x96\xfa\x14\x79\x66\x70\x50\xb6\x87\x50\x36\xee\x27" + "\x88\xd7\x50\xfc\xb5\xd3\xe1\x1a\xbd\xa5\x7c\xad\x87\x6d\xf9\x58" + "\x26\x7c\xd7\x0b\xf7\xa1\xfd\xf0\x4f\x31\x26\xd0\x03\x97\xf5\x0e" + "\xee\xe7\xf7\xca\x16\xb6\xa5\x09\xd2\x37\x9f\x25\x52\xc8\xdb\x52" + "\xbc\x85\x2b\x5f\xad\x63\x3e\xa9\xc7\xf2\x37\x8c\x27\x24\x03\xf2" + "\x9c\xca\xfa\x94\x18\xb8\xbd\xfd\xb4\xa0\xff\xbb\xbb\x6d\xc7\xb2" + "\x79\x3e\xdf\x61\xc3\xe7\x80\x57\x30\x26\xcc\x83\xf2\x81\x43\x9b" + "\x4f\x13\xec\x6b\xd7\xdf\x98\x47\x54\x78\x1f\xf8\xde\x8c\xe3\x21" + "\x50\x66\xab\x70\x3f\x16\xf8\x9f\x63\xa6\x63\x30\x3c\xb7\xa6\xe1" + "\xf8\x75\x6a\x12\xcb\xee\x07\xfb\x8e\x75\x44\x8e\x75\x65\xed\x93" + "\x09\x9c\x02\xae\xb7\x70\xbc\xf2\x26\x2a\x36\x4b\x9b\x5b\x3c\x0e" + "\xf2\x01\xaf\x8a\x80\x4f\xc8\x2b\xc8\x3b\x4b\xe0\x14\x70\xad\x19" + "\xf3\x41\x1d\xc6\x54\xaf\x09\x90\xa2\x8d\x6c\x67\xf6\xed\x41\x8e" + "\xb1\xff\x78\xb8\x95\xfd\xc3\xa2\x56\x8a\xd3\xbe\x3d\x4d\xdd\x14" + "\x03\x8b\xdc\xf7\xa5\x89\xe4\xde\x0c\x3c\x1e\x83\x72\xa6\x63\xd5" + "\xfb\xf6\x40\xdd\x9a\xb9\x58\x7c\x1d\x60\xc0\xf9\xaa\x7d\x51\x78" + "\x3d\x2f\xc3\x7a\x8b\x0c\xf7\xd5\xd9\x93\xa1\x8d\xec\xa4\x74\x6f" + "\xc1\x7d\x2d\xa8\x2b\x70\x8d\x51\xd8\x2f\xd0\x1e\x96\x70\x0f\xa9" + "\x34\x8f\x78\xe0\x3d\x0e\x78\x63\xfe\xcf\xa6\xd9\xbb\x87\x2d\x8f" + "\x0f\x94\x10\x82\x63\xe1\x78\x9d\x9f\x37\xca\xf5\xb3\x08\xbb\xf8" + "\x2e\xb3\xaa\x1b\x77\xb0\x59\x9f\xc5\xbe\x3a\x0e\x78\xc3\xd5\xef" + "\xb3\x82\x81\xea\xe7\xa7\xa4\x7e\x51\x7b\x1d\xf2\xf9\xb3\x6f\x9a" + "\x20\x12\xc0\x34\xfe\xf7\x81\x53\xe0\x6b\x6c\xc7\xf3\x1d\xcf\x2f" + "\xec\xbf\xda\x7a\x7e\x61\xbf\xd4\xd1\xfc\x82\xf5\x7d\xf7\x3f\x82" + "\xf7\x35\x17\x87\x48\x2c\xf7\xde\x3f\xdb\x6c\xe7\xde\xc2\xf5\x37" + "\x96\x88\xfb\x2f\xfb\xb7\x63\x1d\x1a\x71\xbf\xf5\x3f\x86\x48\x58" + "\x28\xe7\x00\xe7\xb3\xf7\x97\xd0\x78\x05\xe3\xa0\xfd\x69\x98\xc7" + "\xb6\x1d\x7d\x7f\x1e\xde\x68\x2b\xc8\x59\xee\xc7\xc8\xfb\x89\x02" + "\x3f\x27\xf5\xe5\x61\xac\x32\x13\xd6\xce\x0f\x19\x21\xd7\x72\xf9" + "\x59\xf8\xa3\x49\xfc\x6f\x3d\xf7\x43\xda\x97\xbf\xef\xfc\x10\xfe" + "\x46\xd3\xfa\x72\xe5\x75\x13\x09\xfd\xa6\xf4\x11\xe5\x98\x3b\xc0" + "\xd5\x2c\x11\x2e\xb1\xf7\x87\x51\x65\x5a\xc8\x48\x28\x6f\x16\x97" + "\x99\x65\x8d\x7c\xf9\xc2\x6f\x56\xfc\x1b\x53\xac\x7f\xc3\xdf\x88" + "\x30\xd1\x0d\xae\x1d\x11\xc1\x3d\x9e\xf4\xa7\xa8\xbe\x24\xa6\x44" + "\x21\xbe\xa5\x82\xa4\x8d\xe4\xbe\x78\xe1\x3f\xdd\x50\x9e\x0a\xce" + "\x2b\x43\xfb\x32\x5c\x65\x58\x2f\xca\xfe\x25\xad\xfe\xe4\x8a\x01" + "\xda\xe8\xea\xdf\x24\xd1\xf7\x6b\xe9\xc7\x64\xf5\x30\x96\x3f\xf0" + "\x9f\xb2\x79\xb4\xf0\xd5\x42\x8f\xc9\x9d\xf6\xb2\x5a\xe4\x7f\xdd" + "\x7c\x21\x49\xcc\x50\xcb\xf9\x29\x75\xd6\xbf\xff\x92\x6f\xfd\x7b" + "\x6a\xc7\x70\x54\x5d\x8b\xff\xa4\xea\xc6\x02\x66\x7b\xfb\x12\xbd" + "\x6c\x54\xc6\x2b\xd7\x46\x85\x2c\x7f\x7c\x6d\x46\x10\x72\xfd\x6c" + "\x51\xb2\xd4\x7e\xee\x73\xf3\x37\x61\x3d\xaf\x10\xd7\xea\x15\xfd" + "\x4e\xde\x63\x93\x86\xbf\xaf\x50\xf2\x69\x37\xed\xeb\x97\x9f\x4b" + "\x53\x8a\x7e\x4b\x02\xe0\x9f\x12\xe0\x7f\x77\xff\xbc\x97\xff\x2e" + "\xff\x39\xf1\x27\x41\xfd\xb8\xfc\x77\x8e\xfe\x58\xea\xc5\xc1\x12" + "\x71\x1f\xf8\x1f\xdb\x67\x28\x59\xfe\x04\xcb\x27\xb0\xfc\x97\x61" + "\xf1\xe3\x97\xff\x2e\xff\x5d\xfe\xbb\xfc\x77\xf9\xef\xf2\xdf\xe5" + "\xbf\x4b\xe0\x4f\x22\xee\x58\xe3\xba\x8e\xa3\xf8\x4f\x71\xff\x47" + "\xc2\x1f\xe2\x34\x66\x28\xd7\xb1\xfc\x1f\x49\x0b\xd0\x2a\x4b\xc2" + "\x75\x8a\xdc\xe0\x66\xff\xea\x58\xbd\x47\x66\x60\x9d\xaa\x42\xdd" + "\xe1\x93\x1f\xda\x3a\xab\x26\xa9\x5b\x9a\x31\xf7\x80\x5f\x79\x44" + "\xbb\x77\x5e\x48\xcb\xcc\xbd\x09\x06\x99\x66\x7e\xfd\xb4\xaa\xa8" + "\x4e\xdf\x82\xb0\xc3\xb3\x6b\x93\x8d\x4c\xfa\x9c\xcf\xae\x2b\x5d" + "\xda\x36\xee\x95\x47\xbf\xbe\xf9\x9d\xf8\x93\x63\xb2\x1e\xfa\xe2" + "\xfa\xca\x67\x8f\x4d\x78\xfd\xc9\x6f\xef\xf8\x68\x4d\xcf\x15\x1b" + "\xef\xff\xef\x3f\xef\x5c\x71\x74\xfc\x96\xbf\xff\xef\xad\xef\x27" + "\x9e\xf1\xcc\x59\xd8\x78\xe3\x9b\x31\x27\x26\x15\x3d\xf5\xdd\xdd" + "\xff\x4c\x31\x4b\xd6\xdf\xbb\x6f\xf2\xf6\x25\x3f\x8c\x7d\xf9\x91" + "\xaf\x6e\x7a\x3b\xee\xb7\xd1\x9b\x1e\x3c\x38\x75\x57\xe4\xcf\xd7" + "\x6c\x7d\xe2\xd0\xed\x1f\xbe\x70\x76\xe4\x8b\xf3\x3e\x9f\xb2\x63" + "\xf9\x8f\x57\xbf\xf6\xd8\x37\xb7\xbc\xf7\xfc\x69\x79\xf6\x82\x86" + "\xe9\x7b\xa2\x8f\x4f\x2c\x5c\x7c\xe4\xae\x4f\xd6\x99\x46\x6c\xb8" + "\x6f\xff\x9f\xca\x96\xfd\xe7\xaa\x57\xff\xf6\xff\xfe\xfa\xee\xaa" + "\x53\x57\xbe\xf4\xf0\x97\x37\xec\x7e\xee\x97\x3f\x6e\x5b\xf4\xef" + "\x3b\x3f\x5e\xdb\x3b\xea\xbf\x1e\xf8\x9f\xbf\xbc\xf1\xcc\x4f\x7f" + "\xf8\xc7\xe3\xff\xba\xed\x83\xd5\x5d\x5e\x9b\x83\x9a\x66\xbc\xb5" + "\xf2\xd7\x6b\x8b\x9f\xfe\xfe\x9e\x4f\x53\xd9\xa1\xc8\x8f\x30\x6d" + "\xfb\xcf\x37\x6e\xf4\x63\x63\x9d\x3b\xd7\xb3\x8c\x84\xc7\x9d\x26" + "\xa4\xdd\x42\x24\x1e\xe4\x0a\xa9\x1b\x3d\x05\x77\xdb\xeb\xe0\x4f" + "\x29\xbe\xde\x99\x3f\x7c\x2f\xec\x26\x38\xfe\x0a\xc7\x1f\xb9\x14" + "\x4b\xef\x7f\x92\xdd\x2b\xce\xc7\x9f\x04\xda\x3a\x02\x6a\x32\x92" + "\x5c\x01\xd2\xf1\x20\xa3\xc9\x18\x72\x25\x91\x11\x39\xf1\x24\x5e" + "\x44\x41\xc6\x92\x71\xe4\x2a\xe2\x4d\xae\x26\xe3\xc9\x1f\x88\x0f" + "\xb9\x86\x4c\x80\xda\xfb\x92\x89\xf6\xeb\x9c\x46\x02\x7c\xe0\x1f" + "\xf8\x3f\x98\x04\x70\xbf\xc3\x2f\xa7\x9f\xd7\x74\x2d\x9f\xde\xcc" + "\xa7\xeb\x2e\xa7\x9f\xd7\x74\xe5\x05\xfe\x9c\x7c\x41\x3f\x25\x10" + "\x1a\xd0\xe8\xc0\x2a\x46\xe8\xfb\xb3\x4d\x95\xf0\x7f\x7d\xbf\xc9" + "\x20\xd7\xf7\x2b\xcf\xfa\x7a\xdb\xbf\x00\x38\x66\xd2\xaf\xa9\x84" + "\xd0\xf9\x04\x56\xfc\x67\xdc\x22\xf9\x4c\x3a\x36\x0d\xa7\x46\x3c" + "\x88\x37\xf7\xef\xe0\x7f\x3b\x7c\xe1\x50\xc1\x01\x45\xef\xb8\x0d" + "\x8e\xfb\xe0\x58\x20\x94\x0d\x95\x4a\x23\x12\xa6\x06\x0e\x5f\x22" + "\x19\x11\x02\x47\x07\x91\x5c\xa1\x26\x92\x91\x2a\x22\x19\x65\x19" + "\xcf\x97\x28\x6a\xfa\x6a\x29\xf1\xe4\xd3\x95\xf0\xfd\xaa\x00\xd1" + "\xcd\x5c\xf5\x5b\x35\xf3\x42\x02\x95\x37\xdd\x38\xf3\xc6\x99\xb3" + "\x96\x2a\xa7\x4f\x57\xde\xec\xef\x7f\xfb\x8c\x9b\x6e\x9e\x71\xd3" + "\x2c\xe5\x4d\xb7\xdc\x71\xf3\xad\x77\xdc\x32\x4b\x19\xfd\x42\x7c" + "\xe4\x4d\xfe\xcf\x2c\x57\xae\x88\x8c\x8f\x5e\xbd\x24\x7e\xb9\x13" + "\x8d\x76\xfd\x0f\x9a\x42\x26\x9a\x68\x35\xc5\x08\x49\xc8\xb5\x84" + "\xf9\x52\x4f\x98\xef\x33\x89\xe5\x8c\x8a\x3f\xac\xff\x24\x9b\x40" + "\x6e\x1b\xa3\x88\x64\x7d\x2b\x91\xac\x6d\x27\x92\x84\x5c\x22\x79" + "\x03\xd2\xca\x41\xae\xc5\x15\x44\xb2\xb5\x80\x48\x5e\xf1\xef\x9f" + "\x56\x3d\x97\xa6\x7d\x79\x80\x48\xfe\xbb\x9b\x48\xb4\xcd\x44\xf2" + "\xa1\x8a\xa6\xfd\x2f\xe4\xf9\xaa\xae\xdf\xbd\x2e\xec\x9f\xab\x38" + "\x4b\xfe\x3f\xad\xf6\xc8\xeb" ; diff --git a/sys/dev/mxge/ethp_z8e.h b/sys/dev/mxge/ethp_z8e.h index b117015ee0e8..eb4ba35aaa0e 100644 --- a/sys/dev/mxge/ethp_z8e.h +++ b/sys/dev/mxge/ethp_z8e.h @@ -28,7074 +28,7291 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int ethp_z8e_uncompressed_length = 370268 ; -static unsigned int ethp_z8e_length = 113057 ; -static unsigned char ethp_z8e[113057 + 1] = - "\x78\x9c\xec\xbd\x7f\x7c\x94\xc5\xb5\x3f\x7e\xb2\x59\x60\x93\x06" - "\x76\xc5\x48\x57\x44\x5d\x14\xda\xa8\xfc\x88\x8a\x2d\x5a\xd0\x28" - "\xd1\x42\x2f\x3f\xa2\x82\x4d\x2b\x9a\xa0\x09\x06\x8d\x10\x21\xc2" - "\x82\x21\x1b\x16\xb4\x09\x0d\x24\xd5\xd4\xa2\x84\x04\x5b\x6c\x51" - "\xc2\x0f\x2d\xf6\xe6\x0a\xea\xd2\x44\xa5\xf7\x26\xd9\xd8\x4b\xbf" - "\xdf\x5c\xbf\x78\xbb\x70\x23\x8d\xdc\x05\x56\xb2\x90\x35\xd9\xdd" - "\xf9\xbc\xcf\xcc\xf3\x24\xbb\xcb\x06\xe5\xf6\xbe\xbe\x9f\x7f\x9a" - "\xd7\x6b\xf3\x3c\xcf\x3c\x33\x67\xce\x9c\x39\x73\xe6\x9c\x99\x33" - "\xe7\x21\xfa\x3b\xfe\x0c\x87\x3a\xfe\x9e\xe2\xff\xf8\xfb\xc7\xdf" - "\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc\xfd\xe3\xef\xff\xce\xdf\x59" - "\x83\x91\xfe\x58\x4d\xd4\xe3\x34\x59\x3d\x74\xa6\xe4\x57\x2f\x89" - "\x20\x92\x13\x3c\x64\xb2\xf2\x55\xfb\xd1\x8b\x48\x37\x54\x93\xe9" - "\x3a\x0b\xa5\xcc\xd8\x46\x54\x33\x4a\x78\x5f\x7a\x59\xf8\xd6\xbf" - "\x2c\xbc\x99\xaf\x13\x35\x8f\x23\x7a\x69\x94\xf0\x03\xce\x42\x0f" - "\xfd\xa4\x93\xe1\xac\xc7\x33\xbf\xdf\x30\x4a\xf8\x90\x5e\xec\xa1" - "\x9f\x2e\xe4\xf4\x75\xa3\x00\x2b\x95\xc8\xf9\xb2\x08\x44\xc0\x35" - "\x71\x79\x86\x99\x39\x56\xe2\xb3\x23\x06\x0e\xc3\x68\x04\x8c\x23" - "\x17\x81\x91\xa2\xe3\xe5\x37\x50\x02\xc3\xeb\x76\x92\xd5\xef\x74" - "\x5d\x81\xb2\x7e\xb4\x29\x8d\xcb\x56\x21\x8f\x70\x52\x62\xb3\x3d" - "\x48\xb6\xeb\x28\xe1\x04\x25\x7d\x81\xab\x01\xd7\xcf\xb8\xbd\xeb" - "\x55\xb9\x71\x0c\x03\x65\x13\x7a\x9c\x49\xe9\xfd\x65\x01\xdb\x56" - "\x4a\x46\xe4\x7d\xcb\x6f\x70\x19\x54\x5e\x4b\x92\x96\xd7\x80\xbc" - "\x0b\xf5\xbc\xea\x9d\x61\x96\xf6\xee\x5b\x78\x67\x8f\x7e\x67\x7c" - "\x51\x7b\x97\x82\x77\x35\x31\xf8\x19\xdd\xbd\x41\x42\x3d\x8c\x8b" - "\xcd\x83\x6b\x13\x7a\x46\xc3\x8d\x71\x6a\x46\xfe\x32\xce\x9f\x69" - "\x13\xc1\xf9\x36\x92\xb8\x30\xed\x90\x77\x66\xd3\x76\x95\x17\xf7" - "\x63\xb8\xbc\x76\x6f\xc3\xbd\x4c\xd7\xea\xbd\xac\xc7\x99\x9c\x12" - "\x8d\x13\x91\xf6\x6e\x24\xde\xa5\x45\xbf\x7b\x3f\x5d\x7b\xf7\x6d" - "\xbc\xcb\x8c\x7e\x97\xa0\x97\xb3\xe2\x5d\xae\xfe\x2e\xb2\x9f\x14" - "\xc7\x19\xf1\x1b\x62\x22\x1a\x8a\xdf\x30\x93\xde\x77\x2b\xac\x22" - "\xec\xb8\x92\x8c\x62\xe3\x9b\x3b\xc3\x4e\x41\x6e\x7b\x80\x6c\xa3" - "\xc9\x71\x9c\x92\xdb\x01\x97\x36\xaf\x21\x93\xa3\x48\x04\xdc\x76" - "\x2f\xb5\xf9\xbc\xe4\xf0\x89\x2e\x77\xf0\x1c\x95\x9e\x23\x93\x3b" - "\x78\x8a\x4a\x9f\x21\x6b\x73\xc9\xe7\x14\x8f\x2f\xc2\x06\x41\x8e" - "\x31\x5c\xb6\x93\xda\x6a\x3b\xc9\x51\x1b\x5d\xd6\x71\x35\x59\x5b" - "\xf1\x0c\x9a\x9b\x19\x8f\x66\x5b\x90\x82\xc9\x6f\xee\x2c\x79\x85" - "\x8c\x8e\xb1\x64\x68\xcd\x73\x69\xb8\x7c\x6b\x0b\xe3\xb2\xe1\x24" - "\x99\x7e\xb3\x18\x7d\x7f\x92\xf1\x7d\x7b\xe7\xde\x35\x01\x43\x93" - "\x75\x36\x35\x59\x8f\x52\xb3\x75\x3a\x35\xdb\x33\x69\xf3\x49\x4a" - "\x69\x0a\x4c\xa3\x66\xe3\x7d\x18\x1b\x99\xe4\xf6\xe2\xde\x16\x42" - "\x1e\x3f\xd9\x56\x12\xfa\xf5\x5b\xe5\x35\x4f\x92\xc9\xa3\x60\xa2" - "\x3f\xbf\x55\x73\xa8\x98\x88\x69\xc6\xcf\xf1\xda\xb1\xe2\x4a\xb2" - "\x02\xbf\x2e\xe0\x72\x3b\x70\x69\x1d\x67\xa5\x74\xe0\x3c\xcc\xbd" - "\x25\x48\xc6\x12\x4a\x1a\x64\x4c\xa4\x86\x9d\x72\x6c\x7a\xeb\x5e" - "\x16\x5d\xcc\x5b\xdd\xcf\x65\x63\x7c\xa5\x18\x51\xf7\x0e\xae\x6f" - "\x33\xc6\xa8\xe3\x35\x32\x76\xaf\xca\x4e\xa8\x7f\x59\x74\xe2\x9d" - "\x4d\x7f\x07\x7e\xef\xc4\xfb\xae\xc9\xa9\x64\x71\x07\x33\xe8\x83" - "\xde\x2e\x23\xc3\x18\xe1\xa7\x04\x86\x67\xb6\x53\x22\xda\x33\x04" - "\xf8\x7c\x59\x8f\xf4\xeb\x91\x0f\xe5\xd1\xff\x1b\x77\x72\x79\xf1" - "\xed\x87\xfd\xe1\x6f\x3f\x7c\x2e\xfc\xab\x87\xbb\xc5\xaf\x1e\x3e" - "\x1b\xfa\xd5\xc3\x5f\x3a\x56\x93\x29\xf4\xed\x87\x7d\x6d\x45\xb2" - "\x0f\x2c\x6d\x45\xe8\x83\x10\x99\xd6\x9e\x22\xcb\xa3\xcf\xa0\xef" - "\x83\x9f\xd1\xda\x25\x64\x0d\x27\xbd\x95\xeb\x0e\xfe\x85\x1e\x2d" - "\x21\x81\xfb\xa2\x78\xed\xeb\x4e\x7e\xbb\x4b\xf1\xac\x89\xdb\xd4" - "\xe1\x31\xbc\xb1\x9d\xeb\xf5\x25\xbd\xdb\x85\x9f\x17\x3f\x1f\x7e" - "\x7e\x91\xfc\xb6\x1f\xb4\x72\x8c\x58\x97\x40\x75\xbd\x44\x93\xc3" - "\x94\x80\x2e\xf2\x03\x7f\xcb\x20\x74\x1b\x13\xde\xf8\x61\xfb\x77" - "\xcb\xa8\xb4\xa7\xa7\x80\x58\xa6\xb0\x3c\x61\xf9\xd2\xe3\x1c\x9e" - "\x81\x7a\x3c\x92\xf7\x5f\x16\x80\xfd\x61\x3b\xd2\xbb\xfc\xcf\x15" - "\x24\xf8\x9e\x2b\x30\x74\x27\x7f\xf8\xef\xc8\x93\xe7\x31\xbc\x69" - "\xd5\x68\xd8\xc5\xb0\x30\x4e\x7c\xc3\x83\x94\x08\x98\x45\xff\x7c" - "\xbe\xc3\xb8\xed\x65\x71\x14\xf9\x2a\xfb\x61\x01\x36\xe0\x80\xfe" - "\xc3\xb7\xeb\x69\xa0\x75\xe7\x26\xe4\xe3\xf2\xee\x40\x06\xcb\x5d" - "\x8f\xbb\xb0\x8b\xcc\x41\x4a\x16\x7d\xaa\x3e\xe4\xe9\x62\xf9\x38" - "\x3c\x40\x43\x7b\x9c\x94\xc5\xb0\xb9\x9c\xdb\xdb\x45\x28\xf7\xef" - "\xc2\x51\x00\xb9\x44\x73\x7b\x44\x41\x02\x64\x71\x67\x13\xca\xab" - "\xba\x47\x98\x74\x1c\xb9\x0e\xee\x6b\x89\x27\xf8\xa1\xa9\x30\x40" - "\xc3\xb7\x50\x22\xca\x3d\xc8\xf0\x18\x16\xf8\xc0\x83\xb6\xfe\x7b" - "\x53\xa1\x8f\xc2\x22\x0a\xa6\x47\x83\x97\x1d\x05\x0f\xe9\x02\xf0" - "\x98\xff\x9a\x51\x66\xf8\x76\x09\xef\x81\x7f\x0e\x33\xbc\x00\x19" - "\x6d\x12\xdf\x87\x18\x46\x0f\xcb\x34\xc0\x74\xad\xbc\x87\xbc\x34" - "\xc2\xe5\x73\x14\x24\xb6\x95\x10\x71\xf9\xbd\xa5\x5d\x43\x44\x77" - "\x76\x22\xf3\x1c\xbf\x77\x07\xcf\x72\x9e\xd7\x44\x77\x41\xe2\x70" - "\x2f\x19\x19\x67\x94\xb7\x33\x9e\x91\x7d\xf9\xc0\xbd\x0f\x4d\xa7" - "\x87\x32\x67\x65\x4e\xa7\x39\x77\xcf\x98\x4e\xe9\xb7\x4f\x4c\xbf" - "\xf5\xfb\x53\x6f\xa5\xac\x1f\x3f\x30\x9d\xb2\xe6\x4e\xa7\x07\xf1" - "\xcb\xbe\x6f\x16\x1e\x66\x4c\xbf\x39\xfd\x87\x13\xb3\x66\xcc\xba" - "\x97\xee\x9f\x7f\x4b\xfa\x2d\xb7\xd0\xdd\xf7\xce\xbe\x39\x3d\x5d" - "\xbb\xde\x9c\xce\x59\x7e\x3a\xf5\xde\x07\x27\x66\x2d\x5f\x56\xbc" - "\x6c\xe2\xdc\x59\x33\x22\xe7\xc4\xb4\xd0\xf9\x30\xd3\xd4\x2f\xce" - "\xcc\xa4\x30\x64\x44\x1d\xfa\x1a\x3f\xaf\xab\xf4\x38\xc6\xba\x65" - "\x6d\x1d\xf7\x91\x94\x93\x23\x8e\x62\x7c\x1b\x7b\x9c\xe6\x0d\xa0" - "\x55\x36\xd3\x0a\x73\x0f\xf2\x5c\xb1\x08\xef\x8e\x69\xb2\x79\x08" - "\xde\xef\x88\x7e\x7f\x99\x1d\xef\xff\xd6\x66\x23\x72\xe3\x07\xfa" - "\xfa\x21\xf3\x40\x47\x1f\x75\x3b\xb2\x87\x80\x8f\x13\x50\x47\x27" - "\xc6\x20\x68\x61\xf6\x44\x8c\xed\x4e\xf4\x43\xbb\x6d\x0d\x25\x9e" - "\x26\xf3\xbf\xb4\x15\x67\x10\xf7\x87\xbb\x58\x83\x71\xae\x1f\x46" - "\xb2\x84\x81\x3e\x06\x9c\x23\x0a\x8e\x25\x2d\x42\x0e\x78\x18\xce" - "\x66\xbc\xd3\x60\x85\xda\x20\x0f\x20\xaf\xdf\x0e\x3b\xd2\x48\x24" - "\xbf\xb9\x2f\xdc\x97\x26\xe7\x16\x94\xcb\xd5\xf9\x17\xf9\xfd\xcd" - "\x45\xc8\xf7\x9b\x99\x09\xe8\xef\x04\xcc\x9d\x68\x8b\xb9\x10\x7c" - "\xec\x0f\x6f\x7c\x37\x20\x7a\xb2\x49\xa5\x59\x1a\x44\x32\x9e\x37" - "\xbe\xfb\x95\x70\x20\x6d\x8d\x4c\xdb\xcd\x69\xe8\xdb\x44\x1e\x83" - "\xe2\x39\x99\x9e\x08\x5a\x8c\x05\x7e\x1d\x21\x2e\x7f\x46\x96\x1f" - "\x86\xb4\x04\xe4\xfd\x2a\x9c\xfc\x6e\x2f\x78\x85\xd3\x30\x9f\x5f" - "\x51\x06\x78\x7d\x61\x91\x4d\x22\x65\x28\xc3\x0e\xba\xd6\x78\xe9" - "\x44\x11\x19\x3c\x78\x17\x76\x00\x66\x5f\x7f\xfd\xed\x5c\x16\x75" - "\x19\x7b\xfa\x0a\x30\x87\x5a\x8e\xb0\x2e\x10\x62\x7c\xce\xf4\xe7" - "\x71\x71\x9d\x3c\x8e\xd1\x17\x5e\xf4\x53\x52\x8f\xf3\xb2\xd9\x31" - "\xfd\x94\x07\x38\x5f\x81\xee\x1d\x80\x71\x30\xdc\x8d\x3a\xf0\x0c" - "\xb8\x06\x0d\xae\x0e\xc3\xaf\xf8\xe0\xb2\xca\x18\x3e\xb8\x17\xb0" - "\xcf\x45\xbc\x6f\x88\x79\x7f\x03\xde\xf7\x6a\xef\x31\x9e\x2e\x6b" - "\x89\xa9\x1f\xf2\x70\x44\x18\xf5\xfb\x31\x5e\x12\x51\x5f\x56\x1d" - "\xeb\x69\x03\xf9\x83\xd1\xf9\x47\x5a\xbb\x9d\x66\x96\x21\x2c\x0b" - "\x65\xfe\x7a\x8d\x57\x55\xfd\x23\x27\xc4\xe4\x07\x0f\x9b\x87\x81" - "\x1f\xf8\x7a\x39\xf2\x0c\x83\x2c\x32\x62\xde\x38\xda\x54\xc2\x7a" - "\xdb\xc8\x85\x31\xf9\x4b\x90\x6f\x34\xd3\x51\xd2\xe0\x8c\xa4\x41" - "\x96\xa6\x67\xf1\x58\x30\xa1\x4c\x75\x4c\x99\x7d\x28\x73\x5d\x58" - "\xd1\x2d\xb1\xa7\x3b\x6e\x99\xe6\x98\x32\x9d\xb2\xff\x55\x3d\x46" - "\xe6\x17\xbd\x8c\x94\x2d\x7d\x51\x30\xb8\x6d\xd0\xc7\x2e\x37\x45" - "\xc3\x48\xed\x44\xbd\x37\x6e\x52\xe3\xf8\x5b\xe8\xf3\x5b\x90\xf6" - "\x17\xc0\x0d\x31\x9f\x30\x2f\xbb\x7d\x01\xc8\xbe\x99\x29\x6a\x0e" - "\xbf\x7c\x89\xb9\x84\xf8\x7e\x22\xdf\x33\x6c\xd1\x37\x5b\xe3\xf1" - "\xcb\x97\xe0\xca\xe9\xb2\x4e\x1e\x5b\xa2\xef\x9f\xc2\x0a\xe6\xe5" - "\x9b\x30\x06\x0d\x78\x0e\x69\x75\xb4\xe2\x39\x01\xfc\xd9\x0b\xb9" - "\x0a\x9e\x9c\xc9\xfc\x36\x05\xe9\x1f\x6a\xef\xdf\xe3\xfc\xb8\xbf" - "\x59\xbb\x67\xbe\xec\xd5\xf8\x12\x7c\x9e\xfa\x8e\xac\x5b\xf2\xba" - "\x2a\x1f\x56\x7c\x3d\x03\xef\x5e\xc3\x75\x16\xae\x9b\x70\xbd\x1f" - "\xd7\x25\x8e\x73\x64\x75\x84\xa0\x47\xa8\xe7\x05\xb8\x3e\x80\xeb" - "\xdd\xb8\x3e\x88\xeb\x44\x1e\x97\xbe\x55\x05\x14\xc3\x13\xde\xb0" - "\x1a\x8b\xc3\x54\x7f\xa4\x8e\xd1\xc6\x87\x1a\x9f\x67\x06\xd2\x84" - "\x4a\x33\x40\x9e\x0f\xa4\xf5\xcd\x64\xba\x64\xa1\xed\x01\xae\x5f" - "\x1b\xd7\x43\x54\xbf\xa8\x3c\x61\x55\x4e\xeb\x3b\x2d\x4d\xe5\x4b" - "\x88\xac\xd3\x43\x97\xb7\x94\xfa\x85\xc0\xb5\x91\xe9\x8a\xf4\x83" - "\xa0\x09\xf4\x99\xcb\x2b\x99\x4e\x03\xfd\x7d\x79\x5a\x44\x7f\x43" - "\x9f\x4d\x0d\x44\xf7\xb7\x25\x8b\x69\xc6\xfd\xad\xe3\xcb\xb8\x63" - "\x4e\xe1\x79\x6a\xa8\xc2\xdf\x92\x05\xb9\xee\xe5\xbe\x4f\x2c\xe2" - "\xf1\x70\xc5\x34\x0f\xed\x90\x32\x91\xdf\xf9\x93\x3e\xca\xe2\xf2" - "\x89\x85\xf2\x5d\x36\xe4\x65\x87\xfe\x8e\xeb\xe6\x71\x98\x58\x2c" - "\xdf\x15\xeb\xe5\x20\x33\xdb\x65\x59\xcc\x71\x3c\xe7\xf3\xdc\x8d" - "\x39\xb4\x0b\x79\xb6\x78\x68\xb8\x65\x30\xfb\x46\x94\xbf\xe9\x9a" - "\x58\x46\x86\xeb\xcb\x68\x88\x3b\x78\x94\xe6\x05\x45\x68\x22\x51" - "\x92\x3b\x38\x8d\x6e\x20\xba\xcc\x1d\x3c\x42\x68\xf0\x58\x77\xb0" - "\x06\x73\xe4\x06\x7e\xff\xc1\x8d\x94\x90\x80\xab\xe3\x26\x32\x24" - "\xb8\x83\x3b\x90\xbe\x9f\xae\x27\x63\xc2\x0f\x87\x88\x1e\x77\x70" - "\x0a\x9e\x8b\xe9\xbe\x21\xe2\xaf\x39\x21\xb2\xcc\x7e\x5e\x38\xdc" - "\xc1\x3c\xba\xef\xf9\xb0\x70\x07\x5b\xf0\xae\x90\xe6\x85\xbe\x12" - "\xf3\x42\x3d\x42\x98\xde\x6c\x9f\x17\x3a\x83\xfb\xbf\x0a\xd0\x12" - "\xd7\x0f\xf0\x73\x08\x37\x74\x5d\x51\xf1\xa6\x2b\x67\xb5\x81\xfa" - "\x30\xaf\x88\xa4\x37\xdb\xd1\x3e\x4f\x9f\x28\x48\xc4\x9c\xf0\xd7" - "\xbe\x3e\x5c\x37\xbe\xf9\x9f\xf2\xb9\xfc\x4d\x1f\xe0\x78\x26\x41" - "\xf1\x67\xfc\xdd\xc1\x4e\xca\x81\xec\x98\xb7\xda\x27\x18\xf7\x11" - "\xeb\x04\xcd\x5b\xfd\x81\x80\xdc\x32\xcf\x5b\xed\x10\x78\x67\x02" - "\x3c\x8f\x3b\xe8\xe5\x3a\x7c\x80\x77\x4a\xc2\x2b\xdf\x65\x41\x5e" - "\x1f\xe7\x8b\x84\xc3\x30\x38\xef\xbc\x10\x99\x45\xc5\x2e\x4b\x5f" - "\xc5\x2e\xc2\xcf\x86\x5f\x96\x48\xde\xf5\x58\xd8\x99\x7a\x88\xe7" - "\x28\x94\x2f\xc2\x73\xd9\x57\xe0\x13\x49\xc7\x10\x0d\x43\xfe\x22" - "\xf4\x79\x66\x8f\xc4\x77\xd7\x76\x89\xef\xc6\x5d\xf5\x5f\xc9\x76" - "\xec\xaa\x53\xed\xd8\xb5\x8d\xd3\xfd\xe0\x5b\xdc\xbb\xfc\xea\xdd" - "\x07\x28\x37\xbf\x47\xe1\xe5\x12\xa6\x5d\xac\xef\x24\xce\x0b\x89" - "\x32\xa6\x21\xe8\x5a\xc6\x74\x64\xbb\x05\x75\xb8\x44\xd2\xae\x76" - "\xe0\x03\xbd\x68\xd7\xd9\x3e\xc1\xf3\x66\x03\x7d\xa5\x60\x0b\xc0" - "\x59\xd8\xc3\x30\x4d\x0d\xc0\xb1\xc1\x12\x34\xd8\x40\x0f\x11\x98" - "\x17\x5c\x17\xcc\x59\x4d\x89\xee\xe0\x87\x94\x56\x56\x96\xe0\xb6" - "\x17\xa3\x9d\x95\x80\x99\x87\xf7\x74\x39\xea\xfa\x40\x24\x35\x10" - "\xd7\x27\x2a\x1a\x2c\x80\x39\x1c\xb0\xf2\x18\xa7\x5e\x27\xf1\xb3" - "\xad\x57\xe2\xd7\x90\x11\x2e\x6f\xc8\x0d\x9b\x1a\xb2\x74\xfe\x61" - "\xde\x51\x74\x63\x9e\xd9\xcd\x69\x16\x9d\x4f\x42\xe5\x0d\xe9\x37" - "\x11\x59\xe6\xfa\x45\x90\x79\x65\x32\x15\x25\xb4\xf9\x8f\x80\xd6" - "\x26\x6a\x2b\xda\x4f\x37\x12\xdb\x4f\x7e\x6a\xf3\xd7\xe0\x79\x1b" - "\x31\x7e\x6d\xfe\x0d\xd4\xea\xdd\x41\x73\x8b\xfc\xeb\x42\xa6\x86" - "\x7d\xad\xde\x39\x84\xf2\x1f\x00\xc7\xf0\xa3\x45\xc6\xb2\xb6\x22" - "\x3f\x3f\x3b\x5a\xbd\xe0\xcf\x90\x08\x05\xcb\x1b\x6c\x41\x53\x83" - "\x6b\xee\x39\xe1\x9b\xe3\x2d\x1b\x82\xb4\x3e\x73\x82\x08\x9a\xed" - "\x0e\xd1\xea\xad\xa4\x47\xcf\x51\x42\x6b\xc1\x7e\xc9\xa7\x8f\x16" - "\x15\x91\x2c\x7f\x2e\x68\x7e\xc4\x5b\x46\x8f\x14\xd0\x08\xe4\x3f" - "\xc3\x3c\x2b\x46\x94\x51\x4b\x67\x21\xcd\x39\x15\x4c\x9c\x7b\xae" - "\x4f\xb4\xe4\xd6\x50\x6b\x41\x0d\xd3\x23\x83\xed\x8c\x39\xa7\xba" - "\xc5\xdc\x73\x3d\xa2\xb5\x60\x37\xb5\xe4\xee\xa7\xd9\x9f\xbb\xcc" - "\xa1\x8a\x86\xf4\x70\x52\x43\x56\xb8\xa2\x21\x37\x94\xd4\xb0\x2f" - "\x58\x01\x5c\x92\x1a\x5c\x62\xe3\xee\x74\xd0\x2f\x49\xf6\x45\xf2" - "\xee\x49\xb8\xb7\xc9\xfe\x35\xed\xce\x10\xe5\xbb\x73\xfb\x2a\x76" - "\x67\x49\xbe\x4f\xda\x9d\xe1\x0e\x32\xff\xef\xce\x45\xbe\x5c\xc5" - "\x23\xbb\x8b\x14\xef\xef\x5e\xc6\xfd\x8a\xbc\x65\xf8\x55\xe3\xb7" - "\x1d\xef\x7c\x80\x75\x19\xc3\x0d\x97\xef\xa1\xb0\x69\x37\xc6\xc3" - "\x1e\x0b\xec\x12\x43\x9b\x7f\x07\x85\x20\x5b\xdb\xfc\x21\x9a\xfb" - "\x4c\x00\x7d\x8b\x3e\xb0\x87\x40\xcf\xa3\xf4\xe8\x33\xe4\x70\xdb" - "\x8f\x92\x78\xbf\x9a\xe9\x61\x9e\xfb\xcc\x07\x22\x5c\xb1\x47\xbe" - "\x9f\xfb\x8c\x03\xb6\x11\xe0\x24\xed\xb1\x84\x37\xee\x49\xd7\x74" - "\x25\xe0\xb1\x67\x32\xe3\xd1\xd7\x03\x1e\xc3\x3c\x8e\xf7\x19\x48" - "\x7b\x9b\xe7\x8e\x30\xf3\x5d\xf9\x9e\x7d\xc2\xb4\xd7\x32\x67\x88" - "\xf0\x85\x5e\x20\xc9\x03\xe1\x3b\x85\x60\xdb\x2b\xc7\x4e\xdb\xe5" - "\x98\x0a\x8d\x2e\x13\x49\x7b\x2d\xa2\x62\xcf\xbe\xf0\xc6\xb7\x1e" - "\x00\x9c\x44\xb1\x8a\xcb\xbe\x95\xa5\x78\xe6\x33\x39\xf6\x44\xc5" - "\x5b\x59\xdf\xd4\xce\xef\x71\x8e\x2e\xf1\xd0\x1e\x29\x83\x71\x5f" - "\xee\xa1\xbd\x13\xb4\xfb\x1a\x0f\xd5\x1c\x95\xf2\x11\x72\xae\xa8" - "\x94\xae\x38\x49\x57\xcd\x04\x4d\x08\xf7\x29\xb8\x9f\x3d\xef\x06" - "\xb4\xbb\xfc\x6c\x1a\xfa\xbc\x87\x65\x8e\x70\x4e\x81\xbe\x41\x19" - "\x68\xaf\x49\xf4\xa4\xa5\x88\xe4\x03\x2f\x88\x3e\x2b\xdb\x92\x66" - "\x3c\x8f\x00\x5d\xc7\xe1\x3a\x72\xdb\x79\x4a\xc5\xcf\xba\xcd\x19" - "\x2e\x63\x99\x8c\xfb\x74\xb1\xca\x9a\xbc\x79\x25\x4d\x30\xfb\xc9" - "\x54\xef\x0c\x67\x9b\xd7\x59\xd8\xa6\x4a\xe5\x7b\xe1\x7c\x85\xea" - "\xcf\x93\x91\xe7\x96\x70\x12\xea\xb3\x9b\x85\x58\x91\x46\xf5\xcb" - "\x21\x8f\x9c\x64\xad\x77\x8a\x7d\xa1\x9e\x34\x03\xe3\xa9\xe3\xc2" - "\xb8\x01\xcf\xab\x81\xe7\xc2\x05\xab\x33\xe8\x43\x3b\xc5\x5d\x8b" - "\xe8\x71\x5e\xd5\xdf\xfe\x41\xde\xd7\xea\x34\x19\xe4\xfd\x41\x9d" - "\x4e\x83\xd9\xfb\x3c\xce\x43\xe7\x85\xaf\x6a\x29\x31\x2d\xac\x8e" - "\xa0\xf8\x2f\xd8\x24\x65\xa5\x21\xba\x7a\xde\xea\x6b\x85\xdb\x27" - "\x5c\x6e\xfb\x29\xb9\x5e\x57\x8f\x3c\xa5\x41\x11\x66\xfb\x96\x6d" - "\xdb\x1a\xb6\x55\x2b\x0e\x14\x88\x8a\x03\x79\xdd\x2b\x45\xb0\x4e" - "\xda\xa3\x63\xd2\x3d\x74\x5b\x91\xea\x9b\x86\x0c\xcc\x85\x9d\xdd" - "\xa6\x03\x79\x80\x7d\x19\xc3\x6e\x2b\x12\xae\x70\xd2\x81\x42\xe4" - "\xc3\xfc\xf7\x6e\x75\xe4\x9a\x1d\xe6\x35\xef\x86\x97\x79\x6e\x1b" - "\x83\xf9\xef\xda\xf9\x17\xac\x09\xc9\xd5\x45\x42\xbf\xd8\x06\x16" - "\x25\x13\x34\xf6\xd1\xff\x2c\xf8\x65\xc4\x7f\x3d\x30\x37\x36\xb8" - "\xba\x61\x77\x39\xd6\xd2\x18\xf4\xc3\x55\x27\x69\xcc\x17\x0e\xbb" - "\x38\x21\x9c\x63\xca\x7e\xb3\x26\x00\x9d\x60\x8c\xdf\x43\xeb\x0a" - "\x06\x9f\x5b\x21\x17\xcf\x8b\xae\xaa\x95\xfd\x34\x3b\x36\x6f\x75" - "\x58\xf0\x3d\x8f\xb3\x7a\xa4\x33\x3d\x7a\x9c\x57\x4f\xd3\x69\x31" - "\x08\xfd\x8d\xa2\xfc\x80\x5d\xe9\x80\x57\xd7\x0a\xa7\x20\xd7\x35" - "\xbc\x8e\x77\xf5\x36\xa9\x07\x95\xef\xce\xea\x86\x1c\xe1\xf5\x0e" - "\xe8\xcc\xfe\x15\x56\x01\xfd\xe6\xea\x6a\x0f\x8d\xf7\x68\x76\x96" - "\xdf\x1d\xbc\x97\x65\x4a\xd6\x60\xeb\xa4\x03\xf0\xaf\x39\xd8\x06" - "\x8d\x88\x65\x92\x30\x7d\x54\x53\xaa\xf0\x0e\x30\x5c\x57\xe9\x59" - "\xea\xc4\xfb\x15\x7e\xd1\x25\xca\x3f\x2a\x67\x3d\xc4\xb5\xb2\x97" - "\xd3\xde\x03\x0f\x0b\xd7\x72\xc6\xe9\x9a\xf7\x5c\xd7\xf4\xd2\x09" - "\xe8\x78\xd0\xef\x7c\xca\xe6\xba\x66\x67\x53\x31\x69\x76\xdc\x35" - "\xb0\xff\xbe\xbb\x53\xc7\x0b\xb2\x43\x80\xbe\xa8\x9f\xe5\x9e\x97" - "\x78\x0d\x6d\x45\x89\x08\x00\xd7\x0c\xe4\x9d\xaf\xb7\x81\xdb\xa7" - "\xda\x75\x4d\x41\x64\xbb\x80\x83\x0f\xfa\xb2\xa4\xc1\x8a\xd5\x64" - "\xb2\x29\x5a\x9b\xb8\xbd\xdc\x16\x6e\xb3\x6c\x0b\xf4\x0b\x9e\x57" - "\xdc\xc1\xdb\xa0\x7f\xc9\xf4\x5c\xc0\xda\xef\xa1\xef\x64\x2a\xdd" - "\xea\x1a\xa9\xd7\xc5\xed\x47\x53\x83\xc5\xf1\x15\x5d\xe3\x08\x8b" - "\xe3\x27\xe8\x5a\xd6\x69\x13\xf9\x2a\xe7\xe4\x00\xf8\xd7\x74\x28" - "\x93\xe7\x62\x77\xc9\x39\xc8\x6f\x99\xf7\x72\xe4\xed\x44\x9e\x9b" - "\xb5\xbc\x37\xab\xf5\x5d\x79\x1d\xc6\x57\xb1\xb1\x61\x38\x78\x77" - "\x26\xaf\x49\x80\xce\x59\xfa\xb3\xc0\x33\xae\xe8\xab\x43\x99\xf1" - "\x71\xd9\x6b\x09\xab\xb1\xe8\x45\x3d\xdf\x66\x9e\x72\xac\xa6\x2b" - "\xc1\x97\xc7\x4a\xd7\xd2\xe5\xcc\x4f\x22\xe9\xc0\x06\x45\xf7\x6b" - "\x6b\x84\xb3\x8c\xdc\x90\x9e\x45\x2b\xe9\x2a\x8c\xbf\x92\x93\x74" - "\xed\x1b\x39\x25\x36\xe0\x4a\x54\x75\x9a\x48\xca\x9a\xa4\x03\xd0" - "\x27\x3e\xa7\xfa\xd3\x6c\x6b\x5d\x7b\x58\xe7\x45\xdc\x1f\xb9\x98" - "\x5c\x00\x5d\xab\x95\xad\x60\xbb\x9b\xd7\xcb\x8e\x93\x6d\x02\xb7" - "\x17\xbf\x04\xa4\x5d\x2d\xce\x8b\x85\x82\xf5\x37\xcc\x57\x1e\xb2" - "\x65\xe3\x5a\x2d\x7f\x4e\xca\xd5\x9e\xcb\x90\x2f\x45\x9c\x0f\x73" - "\x1e\xf0\xab\x6d\x9c\x70\x26\xf0\x98\x38\xd8\xe3\xb4\x65\x79\x68" - "\x6a\xb9\xea\x1b\xdb\x18\x86\x35\x08\x0e\x65\xe8\x5b\x62\xde\x04" - "\xac\x7f\xb1\x95\x26\x30\x1e\x9b\xe4\xb8\x00\xac\x7a\x83\x92\xcf" - "\x61\xe0\x5a\xe7\x0c\x17\x40\x16\x17\x84\x37\x36\xed\x94\xf7\xda" - "\x3b\xc6\x23\x8c\xfa\xe3\xc3\xff\xa8\xc6\x35\x9a\x79\x7c\x6c\xaa" - "\x82\xf3\x51\xb9\x6b\xf4\x49\x7e\xbe\x82\x9f\xfd\xa6\xe6\x9d\xee" - "\x2d\x19\xa8\xff\x24\xea\x1d\x9b\xaa\x6c\x80\xb1\x57\x74\xa3\x8e" - "\x1e\xe7\xd8\x54\x0f\xa5\xed\x57\x6b\x87\xcd\x3b\x07\x19\x7b\x3c" - "\x57\x8b\xd6\x5a\xd2\xc6\xf4\x75\xff\xc2\xeb\x18\x68\x57\x51\xc8" - "\xb4\xbb\x5a\x93\x1b\x6c\x57\x7d\xeb\x38\x5d\xd7\xd8\x56\x20\xf9" - "\xdb\x20\x0c\x63\x8b\xf7\x84\x7d\x06\x5e\xdf\x55\xe2\xeb\xba\xc6" - "\x0b\x7f\x63\x77\xe0\xb7\x1f\x3f\x97\xf6\xdc\x82\x9f\x07\xf7\xe9" - "\x92\x6e\xdd\x79\xb0\x73\xae\x6b\xc4\x5c\x5f\xcd\xcf\x1e\x1a\xdb" - "\x20\xba\xc7\x19\xc2\xda\x7d\xdd\x97\x6c\x63\x8c\xed\x00\xfd\xf3" - "\x54\x3f\x30\x0c\x4a\xc0\x58\x64\x9a\x0b\xc7\x16\x11\x68\x2e\xf5" - "\x33\xce\xa6\xe6\x2d\x7e\xb2\x7d\x87\xdb\x7e\x5d\xca\x8a\x2d\xc2" - "\xe7\x07\xed\xf9\xca\x6d\x6b\xaa\x0d\x12\xaf\x31\xf7\x38\xaf\x1b" - "\xe7\xa1\xc7\x6a\xa4\xcc\x4f\xfe\x68\x1f\xc3\x13\x49\x92\x1f\x84" - "\xde\x76\x25\xcf\x9a\x77\x72\x3f\xe2\xf9\x27\x68\xb7\xf9\x34\x5d" - "\x27\xfb\xb3\x09\x6d\xdf\x06\x99\xc2\xb6\x53\xbd\x94\xff\xd7\x41" - "\xfe\xdb\x9a\xf5\xf5\xd0\x4d\x78\x07\xbb\xc9\xdb\x5a\x10\x20\x86" - "\x11\x02\xec\x2a\xb9\x26\xd4\xb4\x73\xad\x57\x04\x3e\x28\xed\x32" - "\x62\x3e\x46\x7f\x37\xef\xe4\x3a\x1d\xd0\x83\x5d\x4b\x65\xbd\x19" - "\x90\x55\xfe\xb8\xfd\xdf\x8f\xdb\xf5\xef\x35\x8d\x93\x72\xb1\x08" - "\x3a\x56\x59\x74\xbf\x5c\x7f\x50\xf5\xc9\xf5\xa6\xe8\x3e\xb9\xfe" - "\x20\x7e\xb3\xf1\xcb\xc3\xaf\x58\x7b\x8e\xfc\x4d\x8d\xb8\xdf\xd0" - "\xe3\xbc\x3e\x13\x63\xdf\xa3\x68\xcd\x69\xc0\x95\x79\xe0\x4b\x32" - "\xb1\xed\xcd\xfb\x0a\x9c\xce\xfc\xca\xe9\x61\xe8\x25\x78\xce\xc6" - "\x7b\x0b\x8f\xc5\xaa\x30\x45\xbd\x77\x6f\x00\x4f\xad\xe9\x65\xdc" - "\xdf\x90\xeb\x05\xeb\xca\xcb\x99\x0f\x91\x67\xa1\x39\x58\x5e\x8e" - "\xfa\xf6\xeb\xf4\x43\x5a\x2d\xbf\x8f\xaf\x1f\x5c\x7f\xb4\x5f\x8f" - "\x82\x7e\xc9\xb2\xc5\x4b\xe3\xba\x20\x7f\xd0\x57\x4d\xdb\xd5\xbc" - "\x31\xee\x0b\x7e\x86\xdc\x3b\x86\xfb\xce\x56\xc8\x97\xde\x8d\xef" - "\x76\xf5\x19\x68\x58\xaf\x81\x32\x82\x1b\xcf\xce\x0e\x26\xbf\xed" - "\x77\x77\xed\xa7\xb6\xe0\xdb\x64\x7b\x52\xc2\xf8\xcc\xcd\xfc\xbc" - "\x5a\x84\xf6\xf6\xee\x84\xad\x75\x86\x75\xb4\x6b\x4f\xd2\x38\xd9" - "\xf6\x9f\x1f\xc7\x0c\xfe\xa8\x84\xad\xd1\xe2\x6c\xda\xe6\xc5\x22" - "\xb8\xf9\x04\xc6\x47\x9f\x35\x79\x53\x2f\x4d\x78\x75\x0d\xa5\xd7" - "\xf6\xd2\xb8\xba\x5e\x4a\x13\x7f\x4b\x33\xd4\x42\xd7\x7a\xf4\x9c" - "\x85\x30\xbe\xb3\x47\x14\x91\xa9\x6e\x0d\xc9\x3e\x0f\x55\x40\xe7" - "\x0a\x42\xe7\x3a\x93\xc6\x72\xae\x5f\xe7\xea\xeb\x63\x9d\xeb\x40" - "\x97\xe2\x8b\x03\x5d\xc3\x0b\x28\x21\x25\x97\x2c\xc0\xcf\x71\x9a" - "\xc6\x5d\x9d\xd2\x09\x7d\x0f\x6d\xf6\x68\xed\xc5\x35\xdd\x5c\x40" - "\xc3\x64\x5b\x21\x7b\x45\x45\xd3\xf6\x41\xe7\x54\x03\xf3\x8e\x9f" - "\xf7\x80\xd0\x86\xf1\xb7\xf1\x3e\xc6\xfe\xd1\x01\xe3\x8a\x5a\xf0" - "\x1d\xd2\x8b\xc7\x8a\x00\xd2\xc7\x70\xdd\xfb\x90\xde\xe3\x1c\x9f" - "\xe9\x31\xfc\xb6\x79\x30\x79\x6b\x5e\xa7\xcf\xfb\xe3\x3f\x14\x86" - "\x32\xd6\xb7\xd3\xd7\x06\x85\xcf\x7d\x9a\xc7\xe0\xf8\xe6\x79\x85" - "\x22\x68\x5b\xca\x7b\x4a\xe3\xf7\xf3\x7e\x17\xaf\x73\xef\x81\x9e" - "\xf2\x75\x7b\x5c\x2c\xfb\xa1\x8f\x67\x98\x0b\x01\x13\xfa\xbe\x70" - "\xa4\x51\xb4\xee\x1d\x5f\xef\xe6\xbd\xd1\x97\xe4\x3e\xec\x78\xf0" - "\xcf\x7d\x52\x0f\x63\x7d\x8f\x65\x20\xf4\xa6\xcb\x4f\xd0\x77\xa6" - "\xb2\x5d\xdf\xe3\xfc\xce\x18\x0f\xcd\xd0\xf7\xf5\xe4\xfe\x2e\xd2" - "\xa0\xff\x65\x16\x72\x5a\xf1\x58\xb2\x16\xdb\x44\xd7\x60\xba\x8f" - "\xdc\x73\x35\xd0\xb7\x51\x26\x4f\x87\x83\xf9\xe6\xcd\x6e\xc3\x82" - "\x05\x48\xb3\xeb\x70\x90\xe7\x0a\x3c\x97\xf7\xe7\x51\x65\xb6\x44" - "\x94\x59\xd0\x6d\xb8\xf1\x4d\xa4\x35\xc4\x94\x39\x18\x53\xa6\x25" - "\xa2\x4c\x99\x56\x8f\x27\xa6\x8c\x2f\xba\xcc\x77\xe9\x42\xdc\xbe" - "\x9b\x1a\x5d\xe6\xbb\xe3\x62\xca\x4c\xb9\x10\xb7\xef\xce\x8c\x29" - "\x93\x1d\x53\xa6\x20\x82\x96\xbc\xb7\x0a\xfb\xec\xbb\x25\x31\x65" - "\x2a\x63\xca\xd4\xea\xcf\x83\xed\x71\xaf\xd8\x46\x56\xf0\x65\x17" - "\xf7\x27\xf4\x76\x6f\xf7\xaf\x9e\xea\xd1\xca\x76\xc4\x69\x97\x37" - "\xa6\xbe\x60\x74\x7d\x69\x29\x17\xb6\x2b\xcd\x16\x5d\x26\x2d\x3d" - "\xa6\x4c\x46\x44\x99\xed\xaa\x9e\xb4\xf9\x31\x65\xf2\x62\xca\x14" - "\x5f\xc8\x57\x69\xe5\x31\x65\xb6\xc4\x94\xd9\xf9\x35\xb4\xe0\xf9" - "\x58\xf9\x22\x8c\x62\x9d\xf7\x1e\xcc\xf5\x37\x5c\xc6\xb6\x0c\xe6" - "\x12\xdf\x6f\x7a\x03\x43\x78\x4e\xe1\xf9\xa7\xc9\x1e\x80\xbe\x94" - "\x16\xf0\xd0\xa4\x22\x7d\x0e\xe2\x7d\x4c\x1e\xcf\x4a\x57\x4e\xeb" - "\x18\x4c\xa7\xe4\x7a\x74\xdf\x04\xae\xab\x69\x0c\xeb\x5e\x37\x64" - "\xf6\xeb\xb6\x6a\xbf\x9e\x14\x9c\x1b\x5e\x61\x38\x5c\x7f\xbd\xda" - "\x1f\x4d\x60\xdd\xba\xc9\x2e\xcb\xd8\x23\xf4\x61\xae\xdf\xbf\x7f" - "\x4d\xc0\x18\x8d\xc7\x0d\xd9\x17\xc1\x23\x05\x3a\x8e\xbd\x0d\xfa" - "\x07\xef\x03\xb5\xd6\x42\x97\x81\xfe\xce\xb8\x1d\xa7\x1b\x3c\x52" - "\xb7\x5a\xda\x4b\x7c\xef\x2e\xb9\x43\xee\x13\x29\xdd\xf2\x46\x6b" - "\x33\xea\x67\x1d\xbc\xb9\xe8\x2c\x75\x4b\xfd\x9f\x75\xb0\x1b\xef" - "\x6d\x2a\xf1\x01\xaf\x1b\x2d\xfa\xbe\xa9\x87\x6e\xcc\x94\x7a\x43" - "\xf9\x47\x45\xbc\x87\xc5\xeb\xbe\x4d\xfe\xa9\x9c\x07\xfc\x7f\xc3" - "\x18\xbd\xbd\xb0\x01\x31\xa6\x6e\xf0\x5e\x8c\x66\xaa\x0f\x6f\x2c" - "\x8c\xe6\xc9\x21\xe0\x95\x1b\xcb\xa2\xfb\xfd\xc6\xea\xe8\x7e\xbf" - "\x71\x7b\x34\x4f\x1a\xc0\x93\x37\xee\x8f\x29\xd3\x1c\x53\xe6\x48" - "\x44\x99\x6a\xad\x9e\xae\x98\x32\x81\xe8\x32\x37\x99\x22\x9e\xd1" - "\xc6\x9b\xac\xfd\x36\x8c\xdc\x93\xbf\x29\x2d\xe2\xd9\x50\x23\xe5" - "\xe7\x4d\xd3\xf4\x34\xde\x47\xab\x7b\x59\xed\x09\x6b\xf0\xb2\x63" - "\xc6\x3b\xe7\x2f\x8c\xc6\xe1\xa6\x92\x18\x1c\xfa\xc7\x7f\x95\xb2" - "\xc1\xfe\x78\x82\x26\xe4\x49\x1e\xc2\x18\xc1\x7c\x3d\x8f\x9f\x01" - "\x6b\x0b\xf2\x83\x0e\x37\x1d\x8c\x81\xd7\x12\x03\xef\x68\xc4\xb3" - "\x05\xcf\xde\x88\x36\x58\x12\xad\xd2\x2f\x06\xfa\xd8\x04\xa3\x9e" - "\xce\xb6\x21\xf0\xed\x72\xc8\x79\x26\x83\x7d\x1d\x46\x1e\xa7\x9b" - "\xbe\x64\x3b\x52\xc1\x9c\x10\x39\xfe\x49\xb5\x6b\x42\x66\x34\x1e" - "\x13\xe6\x47\xe3\x31\x21\x2f\xa2\x5d\x7e\xf3\x3a\xba\xdf\x1c\x7c" - "\xe0\x27\xac\xe3\xb0\x0f\x8d\xf4\x39\x58\x0b\xbd\xec\x1c\x59\xd8" - "\xd7\xe3\x44\x31\x25\xba\xed\x5d\xb0\xc9\x0e\x74\x0e\xca\x4f\xc9" - "\x1f\x95\x69\xfe\x29\x36\xc0\x6f\xd6\xf9\x31\xbc\xf1\x23\xd8\x04" - "\x7f\xac\x44\x1a\xe4\xdf\x8d\x59\x6a\x8d\xfd\x50\x87\x70\x64\x6f" - "\x01\x3d\x61\xdf\x4c\xfc\x50\xb3\x07\x6a\xd8\x67\x01\xb2\xa7\x0b" - "\xf3\x7b\x8a\xda\xdf\x9a\x98\x12\xc1\xd7\x7e\xdb\x9a\xbb\xc4\x71" - "\x9a\xf8\x09\xcf\xff\x3c\x46\xd9\xf7\xa1\x29\xe8\x23\xb6\xa1\xdd" - "\xc1\x93\x52\x47\xc3\xfb\x76\xad\xec\xcc\x88\xb2\x3e\xcd\xc6\xed" - "\xe2\x77\x93\x83\x64\x6c\xf2\xfb\x08\x70\x52\x95\x5e\x37\xf1\x93" - "\x26\x8c\x57\x94\x29\xd1\xcb\xb0\x3d\xcc\x65\xcc\xc5\x64\x9c\x54" - "\x42\x46\xd7\x9a\xe3\x12\xb6\xd6\xf7\x5d\xac\x1f\xbb\x4b\xba\xc8" - "\xed\xef\xe0\xb5\x29\xa3\xda\x4b\x9e\xd8\x9e\x18\x20\x53\x77\xc5" - "\x47\x45\x1e\xdc\x87\x2a\x3e\xb2\x03\x37\x8c\x9f\x09\x52\xce\x45" - "\xd2\xee\xde\x7b\xb3\x1e\x98\x37\x67\xe2\x8f\x1f\x98\x35\xff\xde" - "\x3b\x6c\xf3\x97\x3c\x9d\x9f\x37\x71\xd9\xb3\xc5\xb6\x55\xcb\x97" - "\x14\x2f\x59\xfa\x84\x2d\xdd\x3e\xde\x6e\x5b\x54\xac\xae\x69\x85" - "\x8b\x56\x14\x4f\xe7\xdb\x09\xb6\xa2\xe5\xf9\x2b\xe5\xed\x0d\xc9" - "\x14\x0d\x64\x49\x71\xfe\x72\xdb\xf8\xbc\x09\xb6\xfb\x16\x2d\x29" - "\x7c\x76\x79\x7e\x5c\x58\x77\xd8\x96\xe7\x2f\xcf\x5f\x94\x67\x9b" - "\x6e\x4b\x67\xc8\x91\xe0\x22\xfa\x33\x5d\x9f\xc7\x78\xfe\xaa\x72" - "\x8a\x76\x6d\x3e\xf3\x28\xfe\x99\xb4\xe3\xc2\xb9\x6c\x52\x63\x34" - "\xcf\x4d\x3a\x1c\xcd\x73\x93\x3a\x2e\x9c\xcb\x26\xc5\xcc\x7f\x93" - "\x62\xe6\xbf\xc9\x29\x17\xce\x65\x93\x63\xe6\xbf\xc9\x31\xf3\xdf" - "\xe4\xfe\xf9\x0f\xbc\xe4\x59\x2f\xe5\xc2\xe4\x98\xf9\x6f\x72\xcc" - "\xfc\x37\xb9\x38\xe6\x79\x43\xc4\xf3\xe5\x78\xae\x89\x9c\x1f\xf1" - "\xbc\x43\x1f\x9f\x03\xf2\x65\x72\xa3\x9e\x87\x65\x3d\x64\x73\xa7" - "\x96\xb7\x3d\x22\x6f\x97\x96\xb7\xb3\x7f\xfc\x81\x8f\xd8\x47\x44" - "\xd9\xdd\xe9\xb3\x58\xa6\xb3\x7f\x08\xcf\x4d\x18\x1f\xd7\x9e\xa6" - "\xc9\x87\x18\x16\xf3\xb0\x5c\x3f\xfc\xd5\xc3\x3d\xf5\x23\xc9\xc4" - "\x65\xea\x5f\x24\xa3\x70\x4e\x3c\x8a\x2b\x21\x2d\x05\x3f\xc8\x94" - "\xf4\x0c\x8f\xe1\x77\x35\x6a\xbe\x48\xaf\x96\xfa\x3e\xca\x68\xf0" - "\x7f\xc1\xcf\x80\x63\x45\x19\x53\x95\x9a\x8b\x3b\x71\x9f\xc2\x3c" - "\x8d\xf2\x46\x61\x98\x34\x16\x57\x42\x9a\x05\xbf\x54\xc0\xab\xd6" - "\xe1\xf1\x3e\x58\xbc\xf1\x1f\xbb\xbe\xdc\x6f\xf3\x19\xc8\x5c\xe5" - "\x0c\x77\xb8\xc3\xac\x57\xa7\x37\xab\x35\x82\x03\xb0\x19\x3e\xc8" - "\xae\x47\x7a\x7c\x1b\xe9\x66\xe8\x7f\xe9\x8d\x6a\xdd\xe4\x66\xf4" - "\xff\x7d\x9d\x6a\x6d\xf3\x80\x09\xf2\xb6\xf7\x04\xdd\xfc\x3a\xae" - "\x7d\xb8\x56\xe8\xf0\x5d\xd2\x76\xbe\x99\xd7\x3c\x1e\x64\xb8\x31" - "\xe9\xd3\x20\xdf\x7a\xcd\xc1\xb2\xec\x38\xef\xb2\x85\x33\xf1\x81" - "\x38\xe9\x45\xd0\x19\x7a\x3d\x74\xf3\x0e\xc6\x37\x22\xbd\x5c\x38" - "\x47\xcc\xe7\xfc\x1e\xae\x0f\x65\x06\xd3\xb5\x75\x7f\x30\xe5\x77" - "\x79\xf3\x91\x98\x76\x7c\x75\x82\x6e\xb9\x5f\xb5\xe3\x96\xdd\x31" - "\x75\x7b\xe3\xb7\xe3\x16\x23\xda\xf1\x55\xfc\x76\xdc\x62\x93\xb4" - "\x35\xa0\x2d\x86\x0b\xde\x4d\x43\x5b\xbe\x92\x74\x8f\x4e\x9f\xaf" - "\xe9\x42\x7e\xd8\x60\x16\xbc\x93\x65\x1f\x2c\xa1\xd8\x7c\x25\xe6" - "\x2d\x94\x15\xa7\xce\x1a\xe1\x1c\xf6\xa0\x87\x6e\x69\x91\x70\x06" - "\xd2\x1b\x14\x2e\xa0\x93\x41\xd2\xc9\xcb\xe5\x06\xeb\x6f\xdd\x2e" - "\x51\xeb\x1a\xb7\x80\x67\x6f\xde\xa7\xaf\x49\xae\x28\x11\x3e\x9d" - "\x8e\x3d\xce\x5b\xad\x31\xef\x02\x11\xef\xa6\x44\xbd\x5b\xdb\x9f" - "\x3e\x5b\x4f\xff\x66\xfd\x74\x6b\x49\x4c\x3f\xa1\x7f\xa6\x0c\x8f" - "\x6e\xf7\xad\x95\xaa\x7d\xe8\xa3\x0b\x68\x7d\xeb\x4e\xf4\x51\x5f" - "\xfc\x3e\xba\xb5\x39\x3e\xaf\xdd\x7a\x54\xc2\x1b\x49\xf1\xe0\x05" - "\xd0\x77\x7d\x92\x07\xb5\x7e\xba\xb0\x7f\xa6\x8c\xd1\xfb\xe7\x9b" - "\xb5\x71\x4a\x6e\x4c\x1b\x43\x80\xf1\x99\x6a\xeb\x6d\x13\x63\x60" - "\xdb\xe3\xf3\xe2\x94\x6a\xb4\x33\x14\xbf\x9d\x53\x1a\x06\xe7\xc5" - "\x29\x87\xd1\x9e\xd0\x85\xbc\x88\xee\x93\x65\x28\x5e\x99\xa0\x70" - "\xc6\xab\xe7\xb6\x54\x47\x90\xf5\xdc\xdb\x66\xf3\x1a\x52\x44\xfa" - "\x84\x68\xfe\x43\x1b\xb8\x1c\xd3\x2f\xa8\xe4\x2c\xf7\xc3\x09\x1b" - "\x19\xbe\x8e\x27\x7b\x9c\xb7\x55\xc6\xd0\xea\xcc\x09\xfa\xde\xf0" - "\x6e\x43\xc2\x0e\x45\xaf\xef\x7d\x12\x83\xd3\xce\xf8\xf4\xba\xcd" - "\x05\x7a\x9d\x89\x4f\xaf\xdb\x8e\x0e\x4e\xaf\xdb\xb8\xff\xcf\x5c" - "\x48\xaf\xef\x59\x22\xe9\x05\x5d\x57\xb6\xef\x7a\x2b\x78\xa3\x2f" - "\x47\xf0\x1a\x1c\x68\x62\x31\x83\x57\x54\x19\x2f\x97\xc9\x34\x07" - "\x14\x9f\x40\x87\x34\x9d\xa6\xef\x4d\xd0\xc7\xff\x88\x2d\x34\x4c" - "\xf4\x3d\x2c\x00\x2f\x81\xcb\xb9\xed\x67\x5c\xee\x60\x3a\xb1\xfd" - "\x11\x53\x6f\x79\x7c\x59\xf0\xbd\xed\xa0\xe9\x8b\x71\xd2\x1b\x95" - "\x4f\xc8\xf7\x7c\xd1\x32\xe2\x7b\xed\xd1\x7d\x04\xba\xa1\x1c\x0d" - "\xf8\xb4\x5f\xf4\x77\xf1\x3e\xfb\x7e\xc6\x85\x7d\xf6\xfd\x63\xaa" - "\xbf\xbe\x7f\x28\x1a\xbf\xef\x67\xc7\xef\xaf\xef\x17\x0d\xde\x5f" - "\xdf\xaf\x1c\xbc\xbf\xbe\xcf\xeb\xa1\x67\x3c\xf4\x7d\x4f\xf4\xbc" - "\xf1\x7d\x57\x74\x7b\x51\x2f\xca\x09\xc3\xd0\xcb\xf9\xf9\x9b\xb6" - "\x5b\xff\xb1\x8c\xe3\xbe\xaa\x2f\x25\xf0\x72\xc2\x58\xc6\xf1\x52" - "\x61\x0c\x0a\x1b\x34\xac\x5e\x13\x7f\x7f\x94\x6d\xdc\xb6\x2d\xc4" - "\x7b\xe1\x64\xbb\x86\x75\xf7\xa9\xef\x84\x0d\xd4\x81\x7b\xc3\x09" - "\xba\x63\x5d\xd8\x60\x28\x61\x3f\x4b\xe9\x5f\x29\xd7\x10\xa6\xb6" - "\x44\xf6\x05\xfb\xe2\xb0\x6d\xba\x59\xd9\x4e\x7f\x3d\x41\xb7\x2f" - "\x50\xfd\x72\xc7\xa2\x68\x3a\x4e\xf5\xc5\xef\x97\xdb\x4d\xe8\x97" - "\xbf\xc6\xef\x97\xdb\xc7\x0d\xde\x2f\xb7\x67\xa0\x5f\xfe\x7a\xe1" - "\x38\xba\x3d\x5b\x1b\x47\xeb\xb9\x8c\x6d\x29\xdb\xe3\xb7\xff\x89" - "\xf3\xe0\x1e\x63\xe4\xf6\xb7\xf8\xfd\x44\x2f\x45\xf4\xe5\xed\x95" - "\x80\x25\xeb\xd7\xf2\x94\x6b\x30\x22\xe1\xee\x33\x7b\xe3\x8d\x93" - "\xdb\x0f\x73\xde\x49\x45\x64\x02\x0d\xb3\xb7\x31\x8c\xe5\x44\xa7" - "\xe9\x8e\xab\x39\x1f\xa7\x4f\xf2\x47\x8e\x93\xdb\x03\x7a\x3e\x96" - "\x75\x2a\xef\xed\x3e\xd1\x53\x40\x9c\x2f\x1a\xf6\x1d\x5a\xfb\x87" - "\xc9\x79\x84\xf3\x73\xbe\x98\x3c\x33\xd5\x78\xbc\xa3\x32\x7a\x3c" - "\xde\x91\x1b\xcd\x9f\xa0\x3f\xca\x85\x21\xe7\x70\xbf\x1f\x38\x7c" - "\x63\xfe\xba\xf8\xd8\xbc\xe3\x68\xcc\xd8\x04\x0f\xfc\x60\xad\xe2" - "\x81\x1f\x3c\x12\x83\xab\x3f\x3e\x0f\xfc\x20\x65\x70\x1e\xf8\x41" - "\xda\xe0\x3c\xf0\x83\x4c\xe6\x01\x0f\xfd\xa0\x24\x7a\x6c\xfe\x60" - "\x61\x74\xdb\xef\xf0\xab\xb1\x49\x97\x5d\xca\xd8\x84\x2e\x74\xf9" - "\x60\xe3\x90\xc7\x14\xea\x4e\xa8\xef\xd5\xf7\x33\xbe\x11\xcd\x4c" - "\x18\x57\xc0\x6f\x9a\x85\xd7\x94\x20\xe3\xa7\x32\x0d\xeb\xe4\x59" - "\x9b\x69\xe3\x22\xe9\xb8\x59\x9d\x7b\x71\x20\xef\x1b\xbc\x3f\xac" - "\xe8\x39\xfd\x99\xe8\xf6\x4f\xcb\x8c\x4f\xcf\x69\x0b\x41\x4f\x47" - "\x7c\x7a\x4e\xb3\x0f\x4e\xcf\x69\x35\xec\xb3\x7f\xe1\x98\x9a\xd6" - "\x60\x5b\x29\x75\x14\x59\xe6\x34\x4d\x1f\xf2\xcd\xe6\xa7\x69\x9d" - "\xd1\xf3\xd3\xb4\x96\x4b\x9f\x9f\xa6\xa7\xc5\x9f\x9f\xa6\x67\xc4" - "\x9f\x9f\xa6\x67\xab\xf1\x30\xbd\x3a\x7a\x3c\x4c\x2f\x8a\xe6\x09" - "\xd0\xee\x7f\x6d\x7e\x9a\xee\x89\x19\x03\x55\x27\xe8\xce\x45\xd0" - "\x29\xca\x54\xbf\xdd\x35\x3e\x06\xc7\x60\xfc\x7e\xbb\x33\x15\xfd" - "\x56\x15\xbf\xdf\xee\x4c\x1f\xbc\xdf\xee\x9c\x8d\x7e\xab\xba\xb0" - "\xdf\xee\xcc\xbb\x74\x9d\xe2\xce\x2d\xd1\x7d\x76\x67\xd9\xa5\xf7" - "\xd9\x9d\x47\xe3\xf7\xd9\x9d\xfe\xf8\x7d\x76\x57\x8a\xea\xb3\xbb" - "\x32\xa3\xfb\xec\xae\x71\xd1\x7d\x36\x3d\xf8\xf7\xf6\x19\xfa\x27" - "\x45\xf9\x19\xdc\xf5\x3a\xec\xf6\x61\x3d\xce\xbb\x6a\x3d\x94\xa1" - "\xed\xe1\x66\xa8\xb9\x43\xf5\xe1\x5e\xe4\xa9\xbe\x70\x1e\xb8\xab" - "\x51\x4b\xfb\xf1\x85\xfd\x70\xd7\x11\xc8\x68\x6f\x73\x89\xdc\xd7" - "\x52\x7d\xc8\x34\x47\x3e\xd7\x1a\xde\x9b\xba\xcb\xcf\x65\xd1\xc7" - "\xc2\x1d\x08\x12\xcb\x75\xe4\xf7\x33\x1c\x3e\xab\x14\x0d\x2b\xc3" - "\x76\x29\x73\xfc\x45\x7c\x63\x52\x5c\xa5\xb7\x00\xde\xdd\xb7\x29" - "\x5e\xcd\x88\xd5\x7f\xeb\xf1\x2e\x49\xf1\xe9\x3d\x7f\x89\xc1\x61" - "\x47\x7c\x3e\xcd\x38\x88\x36\xd4\xc7\xe7\xd3\x8c\x8e\xc1\xf9\x34" - "\x83\x65\x66\x7d\x84\xed\x33\xf2\xd1\xa0\x27\x86\x67\xef\xb6\x9a" - "\xfd\x8a\x77\xa4\x4e\x54\x71\x20\xa5\xc7\x79\x77\xac\xfe\x87\xbe" - "\xb9\xfb\x3d\x0d\xe7\x77\x62\xca\x0f\xa2\xff\xdd\xcd\xfa\xdf\xde" - "\xf8\x38\xdf\x7d\x11\xfd\xef\x6e\xd6\xff\xf6\x5e\x38\xb6\xee\xd6" - "\xf4\xbf\x78\x36\xde\xdd\x47\xe3\xf7\xff\xdd\x31\xfd\x4f\xd9\xc5" - "\xb0\x87\x65\xf9\xa8\x7c\xf7\x8c\x89\xcc\xc7\x3e\x46\x9c\x97\x79" - "\x24\x4e\xde\x99\xb1\x30\x07\xc9\x57\x74\x01\xef\xb1\x4f\x54\x5c" - "\xde\xbb\xa7\x56\x8d\xc7\x7b\xfc\xd1\xe3\xf1\x9e\xfd\xd1\xe3\xf1" - "\xee\xec\x98\x72\x47\xa2\xdf\x83\x7f\xfe\xd7\x64\xec\x8c\xcc\x18" - "\x1e\xf8\xe0\x04\xcd\x38\xa4\x78\x20\xf3\xca\x68\x3c\x66\x2c\x8c" - "\xcf\x03\x33\x8a\xd1\xfe\x0f\xe2\xf3\xc0\x8c\xea\xc1\x79\x60\x46" - "\x03\x68\xf9\x41\x24\xdf\x3e\x58\x92\x31\x2c\x26\x4f\x7b\x7c\x99" - "\x37\xa3\x2b\xfe\x1a\x41\x26\x29\x1a\x67\x4e\x8d\xa6\x71\xa6\x35" - "\x9a\x86\x68\xcb\xdf\x4f\xc3\xfe\xb3\xbe\x3d\xce\xcc\xd8\xf1\xef" - "\x3e\x41\xf7\x6a\xe3\xff\xbe\x18\x59\x97\xb9\x43\xe1\x12\x6f\x5d" - "\x24\x93\xed\x5f\x77\x7c\x5a\x66\x1e\x1d\xa4\xcd\xec\xd3\xe6\x0e" - "\x5f\x30\x96\xee\x4d\x41\xfa\x83\xbc\x1e\xca\xeb\x21\x75\x48\x7f" - "\x30\x48\x26\x39\x5f\xf5\xcf\x4b\xf7\xf2\xd9\x4b\xc1\xf4\x67\xfe" - "\x35\x8f\xa1\x2c\x9e\x83\x18\xaf\x9c\x12\xe9\xb3\x60\xde\xc0\xbc" - "\x7e\x1d\xf3\xfa\xbd\x52\xff\xe3\x7d\x16\xf6\x07\x34\xdb\x29\xcb" - "\xed\x0f\x92\xce\xef\x9c\x3f\x06\x76\x25\x8f\x0b\xce\xaf\xe7\x55" - "\xeb\x66\x65\xb1\x78\xee\x8f\xdf\xc7\xf7\xb6\x0c\xce\x3b\xf7\x76" - "\xa9\x7e\xbe\x6f\x4c\x74\x3f\xdf\x07\xfd\x6f\xc4\x7c\x6e\x2b\x78" - "\xe0\x92\xc6\x49\xb1\x4d\xf8\x06\x95\xf7\xeb\x1f\xee\x28\x2a\xa5" - "\x6b\x4e\xd2\x7d\x1b\x64\x7d\x06\x11\x30\xaf\x4b\xa0\x66\x29\x03" - "\xee\xfb\x0f\x89\x27\xf2\xe4\x04\xc9\x20\xd6\x3f\xd5\xc1\xef\xea" - "\x9d\x22\x80\x7c\xed\xbc\x27\xc0\x67\xfd\xc0\x0b\x97\x1f\xa7\xfb" - "\xb6\x45\x95\x37\x12\xb9\x15\x8c\x8e\x7a\x39\x1e\xef\x3b\xa2\xaf" - "\xe9\x6e\x18\xc4\x3f\x08\x79\x02\xba\xef\x83\xf2\xfd\xba\x6f\xd0" - "\xfd\x4b\xc6\x89\xfd\xe3\x19\xa7\x8b\xcb\x81\x1f\xce\xd6\xf9\x57" - "\xf9\x4c\xfe\x70\xe1\x80\x4f\xde\x0f\x0b\x3c\xf4\xc3\x41\xcf\x73" - "\x44\x8f\x83\x1f\xd6\x44\xc2\x51\xe7\xdd\x7f\xb8\x53\xf7\xab\xc3" - "\xfd\xfe\xaf\x81\xa5\xe3\x73\x34\x06\x1f\x2f\xf4\x94\x66\x0d\x46" - "\xe0\x62\x30\xb8\xcf\x15\xcf\x32\x3f\xcc\xb4\x5c\x6c\xcd\x2f\xd1" - "\x4a\x59\x2f\x5d\xc0\x5b\x33\xa5\xbe\xc4\x30\x2e\x8e\xe3\xcc\xb2" - "\x28\xdb\x42\xee\xdd\xf3\xde\xd6\xac\x39\x6a\xdc\xcf\x8a\x59\x23" - "\x9c\x59\x2b\xfd\xa6\xb4\x71\xff\x68\x30\x76\x1c\xcc\x3c\xa8\xcf" - "\xd1\x31\xe9\x47\xf4\x71\x0f\xbb\x96\xe1\xc6\xac\xb3\xce\xf4\xab" - "\xb1\x30\x6b\x76\x38\x29\xd2\x5e\x9b\x25\xf5\x3f\x7d\xbd\xd4\x83" - "\x7c\xd1\xe5\x66\xc5\xac\xff\xcd\xac\x15\x83\xaf\xd3\xa7\xa0\x7f" - "\xfd\xbc\xb7\xa5\xce\x0e\xcf\x2a\x89\x59\xaf\xf0\x6d\x96\xe7\x44" - "\x3f\x05\xdc\x1f\x69\x72\xef\x47\x5f\xc6\xd4\x57\xeb\x38\x75\xb1" - "\xf6\xcf\x1a\xa4\xfd\xb3\x06\xda\xbf\x54\xc2\x8d\x59\x4b\x9c\x25" - "\xdb\x1f\xba\x40\xfe\xfd\x28\x05\xf2\x4b\xa7\x1b\x74\xee\x1f\xe5" - "\xeb\xba\x3a\xaf\x1f\x0c\xae\xab\xff\x68\x60\xfd\x4f\x95\x1b\x58" - "\xff\xf3\xc5\xd3\xd5\x3d\x24\xf7\x56\xa3\xeb\x2e\x37\xd7\xc6\x6b" - "\xcb\x8f\x06\x59\xff\xfb\x91\xb6\xfe\xf7\x4f\x96\x68\x79\xf6\xa3" - "\xf6\xe8\x3e\x9c\x15\xd3\x87\x3f\xf2\x45\xf7\xe1\xac\xda\xff\xe9" - "\xbc\xc6\x13\x67\x62\x62\xa2\x21\x31\xc1\x90\x90\x88\xd7\x68\x22" - "\x0d\x4b\x34\x26\x0e\xc1\x6f\xa8\x76\x1d\x66\x48\x34\x18\xf1\x1b" - "\xa2\x5d\x87\xc6\x3c\x0f\xe3\xb2\xf8\x19\xb5\xeb\x90\x98\xe7\xa1" - "\x5f\xf3\x7e\x98\x56\xaf\x5e\xbf\x31\xe6\x79\xc8\xd7\xbc\x1f\xfa" - "\x77\x96\xa7\x0b\x9e\xa3\xfd\xd0\x66\x2d\x5d\xb9\xa8\x70\x49\x9e" - "\xdc\x2f\xce\xb7\x2d\x7a\xfc\xf1\xfc\x15\x2b\x6c\xc5\xcb\x6c\xf7" - "\xdc\xfd\xc0\x2d\x77\xd8\xd4\xb6\x73\xe1\xf4\xf1\x79\xc9\x34\x67" - "\xd5\x72\x7e\x31\xe7\xc1\x59\xd9\xb6\xac\x7b\xee\x8e\x7e\xa9\x83" - "\x91\xdb\xcb\x17\x83\x12\x31\xfe\x32\x2a\x46\x11\x55\x8e\x92\xb2" - "\xa7\xb3\x75\x3b\x91\x5a\xf3\xb8\x7f\x51\x0b\xb4\x09\xd1\xeb\x10" - "\xae\xeb\x78\x4f\x7f\x8e\xf4\x11\x9e\xb8\xbd\x8c\x8a\x16\xf3\x79" - "\x93\x39\x37\x8b\xf7\x7d\x64\xfb\x11\x19\x8e\xd3\x43\xcf\x34\x43" - "\xab\xe5\x67\x77\x67\x90\x6c\x0e\x32\xa1\xfc\x65\x78\x97\x20\xee" - "\x0c\x23\xcd\xaf\xf9\x34\x67\x8d\x95\x69\xef\x97\xe9\xf9\xcc\x27" - "\x68\xce\x5f\xc4\xfb\x42\x3e\x8b\x3b\xab\xb5\x7c\x73\xde\x08\x3b" - "\x67\x17\xb0\x6c\xa8\x7d\x91\x8c\x75\x2f\x12\xbd\x32\x92\x4c\xaf" - "\x8c\xe2\x33\xf4\x73\x6a\xf5\xbd\xd0\x0a\x3c\x7b\xe8\xa1\x22\xae" - "\x9b\xf3\x86\x0d\xb3\x5f\x94\xf9\x47\x46\xe5\x6f\x19\xd8\x8b\x9d" - "\x53\x6b\x40\xbe\x79\x9f\x93\x39\x90\xfc\x76\x97\xbb\xa4\x8c\xcc" - "\x21\xf1\xe5\xa4\x99\x94\xd0\x86\xd9\x77\x75\x50\x04\x5d\xcb\x4f" - "\xa2\xfe\xb9\x57\x9a\x57\x8b\x2f\xdd\x18\xfd\x73\xbc\x0e\xb1\xf9" - "\x14\x19\x31\xae\x13\x5c\xcb\xd9\x4f\x61\x2e\xd5\x7d\x45\x46\xd0" - "\x60\xcc\x49\x9a\x97\x5e\x32\x47\x84\x1c\x73\xc8\xf8\xaf\x76\xf6" - "\x37\x3c\xf0\xc2\xe6\x3f\x93\x71\x57\x6f\x99\xa1\x57\x58\xa9\xa4" - "\x58\x74\x09\x8e\xad\xe1\x17\x01\xf6\xd7\x6f\xc9\x0d\x71\x9e\x95" - "\x3d\x0e\x2b\xb5\x15\xfb\x69\xed\x51\x11\x28\xff\xb3\xf2\xf3\x6f" - "\xf5\xfa\xd9\x7f\xd1\xb4\x76\x0e\x25\x9e\xc8\x26\x43\x6b\xc1\x16" - "\x72\x2f\xf4\x53\xc9\x51\xd1\xd5\x92\xfb\x39\xb5\x15\xec\xa3\x9c" - "\x0e\x32\xb4\x74\x7e\x46\x32\x3e\xc4\xc6\xb3\x19\xa5\xe7\xc8\xba" - "\x76\x09\xa7\x9d\xa3\x35\x6b\x69\xf8\x9a\xbf\x90\xd9\xdd\xd5\x81" - "\x7a\x4e\xd1\x4f\x8f\x50\x02\xe0\x19\x9e\xfb\x8c\xac\xcf\xfd\x84" - "\xfd\x79\x33\xa8\xb6\x94\xac\xc2\x91\x96\xd2\xeb\x48\xb3\xf4\x8a" - "\xb4\x91\x3d\x8e\xb4\xd4\xb6\x22\xe4\xef\x7c\x8f\x46\x74\x50\xea" - "\xfb\x27\x3b\x0c\x5b\xce\xd2\x18\xdb\x5c\xee\xff\x79\x13\x6a\xcf" - "\x22\xff\xc6\x8f\x5d\x61\x94\x8d\x2c\x13\x4c\xfa\xb8\xc3\x9d\x1d" - "\xa0\x30\x60\x6d\xe9\xa5\x31\xb5\xbd\x64\x0d\x57\x7c\xec\x62\x5a" - "\xf4\x6d\x7c\xb7\x0b\xb2\x70\xd8\xde\xc7\x1a\x8d\xee\x16\x2f\xb5" - "\xfa\x7b\xa9\x8d\x3e\x25\xb7\xfd\x6f\xae\x5d\x8f\x35\x0e\x09\x83" - "\xf9\x5d\x6b\x3a\x01\x5f\xf1\x8c\xa3\x95\xcf\x25\x96\x51\x55\x29" - "\xa5\x14\xad\xa1\x61\x27\x91\xae\x6c\xfa\xdd\x3e\x77\xf0\x6f\xae" - "\x35\xd2\x07\xf7\xa1\xa2\xd2\x56\x4a\x6c\xf3\x6f\x61\x5f\x4f\x43" - "\x28\xf9\x6c\x86\xdb\xdf\x4e\xee\xa2\xbf\xba\xc2\xa6\xb3\x69\x95" - "\x61\x32\xed\x3e\xdf\x6e\x70\x1b\xcf\x93\x3b\xdb\x4f\x1f\xa0\x6e" - "\xb1\xf1\xec\x6c\xc8\xab\x8c\x36\x7f\x80\xcf\x25\xa5\x8b\x6e\x6b" - "\x72\xd5\x72\x9a\x50\x77\x96\xc6\x6d\x3b\x4b\x69\xa2\x27\xcd\xc0" - "\x7e\xb5\x8f\x9c\xb2\xd0\x36\x5c\x53\x3a\xc9\x84\xf6\x2a\x9f\xea" - "\x24\xcd\xbf\xb6\x2f\x8d\xea\x7b\x07\xfc\x6b\x7b\xbb\x07\xfc\x6b" - "\xc1\x4b\xdb\xd9\xc7\x16\xe3\x22\x9b\xf9\xb9\xea\x34\x19\xd7\x9f" - "\x26\x9a\x54\x66\x20\xdb\x63\x7c\x3e\xe2\xfe\x21\xee\xbc\x53\xf2" - "\xfe\x38\x65\x1d\xc4\x35\x05\xbf\x04\x8c\x01\xb9\x9e\xdd\xa9\xf1" - "\x2d\xd2\x0c\x48\x7b\x1d\xd7\x44\x5c\xb7\x39\x6a\x85\x4f\x94\x1f" - "\x9c\xd6\x6d\xa0\x64\xe6\x5f\xe5\xcb\x7b\x70\x5a\x8f\x33\x0b\xfa" - "\x4f\x7e\xaa\xce\xc7\x4a\xa6\xcf\xd9\xfe\xc1\x89\x53\x1c\xaf\xc5" - "\x27\xf1\xe9\x2b\x48\xe0\xd8\x2d\x5a\x3a\x70\xc8\x0a\x71\xbd\xa8" - "\xdf\x83\xab\x19\x3f\x8c\xcb\xac\x62\xbd\x6c\x77\x5f\x01\xd7\x79" - "\x0e\xe9\x42\x4f\x47\x7b\x8d\xfc\xee\xf7\x27\x4e\x19\x54\x9e\x34" - "\x03\x60\x06\x34\xf8\x18\xeb\x73\x32\x79\x4c\x77\x1b\xcc\xa2\x29" - "\x6f\x0a\xd5\x8e\x12\xed\xdb\x5e\x16\xcd\x6a\xac\xdd\x3f\xd5\x43" - "\x8b\x6d\x8c\x23\xe6\xed\xe6\x4a\xbc\x6b\xb2\x11\x31\x5d\x9a\x73" - "\xd9\x7f\xec\xfe\x6c\x0f\x25\x1f\x8d\x6c\x83\x70\xfe\xd3\x4c\x9e" - "\x3b\xf7\x94\xba\x86\x08\xc3\xec\x99\x6d\x1e\x2f\xed\xea\xed\x1a" - "\xe2\xf8\x13\x19\xdc\xc1\xe3\x34\x39\x95\xac\xac\xff\xd5\xbf\x2c" - "\x3c\xb8\x76\xb1\x3f\x27\xf8\xe4\xea\x93\x74\xff\xeb\x37\xa5\x52" - "\xea\xbf\xd9\x49\x93\x47\xf7\xbf\x17\x21\x8f\xee\x6d\xed\x6c\x8c" - "\x90\x45\x0b\xce\x5d\x28\x8b\xe6\x7f\xa9\x64\x91\x08\x2a\xd9\x13" - "\xf2\x68\xe9\x9f\xc5\xa4\x6b\x7e\x21\xf3\x0f\xc5\xa4\x07\xb4\xf4" - "\xdd\x31\xe9\x3e\x95\xfe\xe0\x29\x5d\xd6\xb5\x31\x1e\xab\x58\xd6" - "\x3d\xf8\x09\xcb\xba\xb6\x3c\x4d\xd6\x49\x1f\xc3\x07\xdf\x11\xbf" - "\x2e\x23\x3e\x7b\x84\xfb\x4d\x8c\xbf\x78\x9f\x74\xdc\x93\x90\x36" - "\x87\xd3\xaa\x3f\x25\x23\x7e\x52\xce\x09\xe7\xec\xbd\x2c\xe7\x58" - "\xc6\xb1\xdf\xc9\xd6\x51\xa2\x63\xeb\xcb\xe2\x48\xed\xcb\xa2\xa5" - "\xc7\xf9\xc0\x41\x5d\xde\xfd\x1c\x69\x95\x48\xfb\x39\xde\xb3\xdc" - "\x63\x9a\xb4\x66\x37\xf2\x39\xfd\x4e\xf0\xf1\x06\x73\x02\x15\x6d" - "\x06\xcf\xf3\x79\xc0\x0d\xa0\xaf\x1b\x32\x89\xcf\x72\xc9\x38\x27" - "\x86\x74\xc8\xa8\x4e\x1e\x6f\xa3\xd6\x63\x7c\xb9\xed\x9f\x53\xa9" - "\x5f\x9c\xe4\x73\x71\x8c\x43\xce\xea\x1f\x71\x1c\x8f\x84\xe6\x02" - "\x22\xf6\x01\x67\x7f\x15\xc8\x5d\x63\x35\x70\x6a\x2a\xe4\xbe\x7e" - "\x10\xf6\xff\x2b\xda\x79\xa4\x87\x8a\x38\x2e\xd0\x71\x7a\xa0\x1c" - "\xf6\x5d\x80\xdb\x66\x0e\x95\x11\x9f\x5f\xc1\x18\x65\x1b\xaf\x60" - "\x2b\x7e\xd5\xfa\x19\x16\x8e\xed\x84\x3c\xee\x8e\x00\x31\xce\x1e" - "\x7a\xe0\x48\x6b\x49\x23\x97\xb7\x33\x6d\x84\xd3\xa1\xc3\x48\x90" - "\x67\x60\x9c\x64\xe2\x33\x30\x1e\x7a\xb0\x40\x96\x4f\x7e\xb7\xab" - "\x75\xa1\x8f\x58\xce\xbb\xbb\x00\xa3\xe4\xb8\x82\x01\x58\x02\x72" - "\x3f\xea\x9d\x06\x7f\xf8\x5a\xf1\x25\xe0\x67\x72\x7f\xf1\xb9\x45" - "\xde\x5f\x03\x5d\x52\xd8\x2f\x5e\xe9\x9e\x0f\xb4\xd6\x7f\x4a\xa4" - "\x9d\xbd\x04\xbf\x3d\xd0\xc2\xe7\x8d\xf8\xbc\xa5\x3c\x6b\x69\x98" - "\x42\x62\x55\x5a\x4a\xff\x79\xcb\xff\x1f\xce\x5a\x82\xfe\xd6\x3a" - "\x83\xd8\x07\xfc\x5b\xf8\xbc\x25\xf0\x9f\xc0\x7c\xa8\xb5\xa9\xfd" - "\x97\x3f\x95\x34\x4f\xe5\x34\xd8\x8a\x87\xf5\xfe\xe7\xf6\x72\x5b" - "\x8e\xd3\xfd\x01\xa5\x13\x8a\x76\x0f\xcd\x6f\xe7\xf7\x48\xeb\xe4" - "\xfc\x93\x21\xc7\xdc\x79\x21\xda\x7b\x22\x64\xa8\x5a\x43\x46\x25" - "\xd3\x16\x7c\xc1\xe5\x95\x4c\x5b\xb0\x7d\x40\xa6\x2d\xf8\xa5\x92" - "\x69\x8a\xc6\x4a\xa6\x2d\xa8\x50\x32\x6d\xc1\x3a\xb9\x0f\x06\x99" - "\xc6\xef\x58\xae\xe9\x32\x6d\xdb\x28\x71\x98\x65\x47\x8f\x73\x41" - "\x91\x2e\xdb\x36\x21\x8d\x65\x07\xe3\xa8\xe4\xd4\x83\x87\xc5\xff" - "\x97\x46\xca\xcf\x80\xef\x0b\xf8\xac\x42\x97\x76\x8f\x7e\x59\x70" - "\x4c\xc9\xb8\x05\xcd\x03\x32\x6e\xc1\xcc\x81\xb2\x2c\xe3\x16\xfc" - "\x87\x92\x71\x2a\xbd\xfe\xa7\x2c\xe3\x1e\x3c\xcc\x34\xd0\xe0\x1b" - "\x78\xcd\x4e\xcb\x0f\x3a\xde\xdf\x1e\x29\xe3\xa2\xc7\xd7\x43\x63" - "\x74\x19\xc7\xb2\x0d\xcf\x13\x20\xd3\x64\x9c\x31\x1e\x67\x35\xa0" - "\xb9\x3e\xee\xb8\x0f\xb8\xcd\x1c\xff\x87\xe9\x36\xe3\x14\x0d\xd3" - "\xce\xfd\x68\xed\x7e\xa8\x40\xf7\x75\xf4\xd0\x82\xa2\x78\x7a\xb3" - "\xae\xa7\x81\x1f\xaf\x0d\x61\xbc\xb9\xcb\x30\x97\x6e\x11\x65\x6d" - "\xc1\x23\xf4\x68\x31\x19\xc2\x89\x4f\x1d\xe3\xbe\x85\x9d\x31\x94" - "\xaf\x2c\x7b\x30\x87\xee\xce\xf1\xd3\x50\xd8\xe6\xc7\xaa\x0c\x78" - "\x67\xa7\x1f\x44\xbc\xfb\x13\xd7\x13\x51\x6e\x62\xc4\xbb\xcf\xa5" - "\x8e\x77\x9a\x63\x3f\x3d\x54\x3d\x98\xed\x7f\x69\xb8\xfc\xf8\xf6" - "\xc1\x71\xf9\xf1\x82\xc1\x71\xf9\xb1\xd4\x03\x26\x7a\x29\x01\xb6" - "\xd9\x65\xa7\xe9\xc7\x72\x3d\x46\xc6\xae\x58\x1f\xb7\x9e\xd7\xb4" - "\xf7\x43\x22\xde\x47\xd6\x75\x28\x4e\xf9\xc8\xfa\x8e\x5d\x1c\x7e" - "\x76\xc2\xc5\xe1\x67\x8f\xbd\x38\xfc\xec\xbb\x59\x06\x82\x76\xe6" - "\xb0\x21\x3a\xdf\xa4\xa0\x1c\x83\x87\xf9\xdc\x1d\xf2\x2d\xd1\xd6" - "\x7c\x8e\x39\xc6\x4a\x5b\x50\x9e\xcd\xda\x8c\xf7\x7c\x96\x9c\xe5" - "\x73\xe6\x6a\x22\xb5\x47\xdd\x5f\x66\x5b\x2c\x6e\x23\x82\x3a\x6e" - "\xf2\xfd\x7b\xb1\xb8\xe1\xfd\xc4\x88\xf7\x9f\x0d\xf4\x7b\xf6\x45" - "\xfd\xeb\xdd\x5b\x88\x38\x86\x5e\x13\xcc\x17\xcc\xc9\x1c\x8f\x4b" - "\x5b\x9f\xf9\xc9\x14\xc8\xf9\xb2\x08\xbf\x5d\xf6\x39\xbb\xb6\xcd" - "\xcf\xe7\x54\xfd\x32\x56\x0a\xda\xf2\x6d\xcc\x27\x23\xf9\xac\x0e" - "\x9f\xdb\xc9\x09\x65\x19\x54\x4c\x9c\x9f\x14\xe9\x65\x07\x5b\x07" - "\xe2\x7a\xb5\x3a\xd9\x07\xd6\x8f\x32\x3b\xf4\x32\x0c\x9b\xfd\x28" - "\x31\x0f\x5c\x2b\xcf\xae\x06\xbd\x2c\x77\xbf\x0d\x3d\x79\xa4\xaa" - "\x27\x97\xb4\x7a\x60\xc7\xfe\x38\xe5\x62\x67\x47\x06\x6f\xdf\x4f" - "\x53\x2f\xbd\x7d\xa4\xb5\xef\xa7\x59\x5f\xd3\xbe\x8b\xd5\x5b\x79" - "\xe9\xf5\x5a\xf4\x7a\x0f\x5f\x3a\x5d\x7f\x1a\xfc\xe6\x74\x4d\xd7" - "\xe8\xfa\x70\xfa\xd7\xd0\x35\x4e\x3d\x0f\xe7\x7d\xf3\x7a\x6c\x7a" - "\x3d\x5b\xe2\xd5\x43\xf2\x6f\xd0\x73\x5d\x26\x3d\x36\x1d\xc7\x85" - "\x54\x31\xa9\x1e\xf6\x44\xc6\xce\x54\xf1\x22\x1f\xf6\xeb\xb1\x33" - "\xb5\x18\x96\x98\x5b\x16\x5e\x96\xb3\x9d\xf5\x11\x11\xf6\xd0\xc2" - "\x54\x8e\x7b\x98\xb9\x36\x32\xc6\xe4\xc2\xb4\x8b\xc5\xec\xe4\x58" - "\x39\x42\x64\x53\xd3\x16\xe9\x0f\x80\x79\x68\xe1\x22\x3e\x1f\xa0" - "\xf6\x33\x17\x16\xaa\x31\xb9\xb0\xd0\x43\x0f\x37\x0e\x0e\xe3\xa3" - "\x7d\x3b\x4a\xd3\x87\x0c\xe6\xf3\x8f\xf2\x0d\x1e\x7a\x42\xae\x5f" - "\x86\x36\x36\x37\x8a\x33\x56\x2d\x16\x57\x4e\x52\x44\xac\x30\xcc" - "\xdd\x8f\xde\xae\x9d\x4d\x00\x0d\xca\x40\xcb\x85\x9d\x3a\x0d\xf4" - "\x74\xa4\x05\x74\x1a\x40\x5f\x49\x71\x6f\x0f\xf2\xd9\x21\xbf\x3a" - "\xef\xfd\xc8\xd5\xa2\xe2\x23\xed\x7c\xe4\x23\x6a\x9f\x21\xb9\xb9" - "\xd1\xff\x9c\xd5\xa0\x97\x1f\x67\x73\x7c\xc5\x3c\xec\x4b\xfa\x68" - "\x7b\x8f\xf3\x91\x4c\x1d\xbe\x60\xbc\xc4\x40\xbe\x7a\xe9\x97\xf4" - "\x08\xfa\xff\xe1\x69\x92\xaf\x51\x87\xc4\xdd\x40\x89\x61\xe0\x8f" - "\x36\x18\xdc\x45\x7e\xd6\x53\xbd\x21\xb4\x9f\x65\xdd\xfe\xa5\x1e" - "\x23\xe7\x91\xba\xc3\x99\x34\x83\x8a\x73\xf6\xc8\x7b\xe1\x33\x1c" - "\x6f\x43\xe2\x95\x82\x36\x9b\x18\x27\x0f\xae\xbe\xe7\xd2\x68\xde" - "\x39\xd2\x68\xf1\xc8\xeb\x61\xa4\x87\x57\x0c\xe0\x50\x27\xcf\x78" - "\x3c\xd2\xa5\xe3\x10\xe6\xfa\x7b\xac\x06\xe8\x62\x5c\xaf\xb4\xf1" - "\xb8\xee\xc9\x1c\x97\x8a\x63\x59\xac\x4a\x23\xc6\xa1\xc7\xf9\xe8" - "\x18\x9d\xde\x5a\x19\xbd\x8e\x96\xb0\xac\x5b\xd1\x46\xd1\xb9\x09" - "\xfa\xe0\xa3\xb3\x2f\xa4\xf3\xa3\xb9\x11\x74\x4e\x64\xbe\xe2\x35" - "\x16\xf4\x51\x88\xe9\xcd\xfb\x1a\xb6\x95\xac\x57\x3d\xfa\x8b\x26" - "\xbf\xf4\x3b\x49\x61\xb8\x61\xd0\x9f\x61\x00\xee\xb7\x14\x8d\x1f" - "\xdd\xd9\x4f\x63\xd4\x2d\xd0\x17\xeb\xd5\x99\x14\xf6\x7d\x87\xec" - "\x78\xf4\x70\x7f\x3d\x8c\xab\xc3\x6a\x08\x0b\x2b\xc7\xb5\xf3\x31" - "\xae\xc5\x36\x11\x60\xbd\x52\xfa\x31\xa1\xad\xfb\x4b\x3b\x8c\xd0" - "\x2d\x0d\xb2\xae\xee\x34\xd6\xef\x4d\xf2\x1e\x75\x0d\xc2\xdf\x5f" - "\x71\xec\x38\xbd\x5d\x68\x8b\x89\x79\x0b\xb8\x43\xff\xcb\x1d\x2e" - "\xf9\x65\x25\xf7\x53\xce\x97\x9c\xa6\xe7\xc3\xf3\x87\x9c\x4f\x7f" - "\xc6\x3b\xf0\x57\xce\xf3\x68\x57\x32\xe3\xe9\xe3\x78\x79\xb2\xcd" - "\xb9\x69\x0c\xa3\xc7\x99\x53\x1d\xd5\xce\xbe\x6c\xa3\xce\x77\xbc" - "\x47\xd4\x6c\x0b\x48\xd9\xa9\x68\x9b\x73\x50\x1f\x93\x5c\x5e\x8d" - "\xb1\x9c\xf6\x48\x5e\xf4\x3b\x06\xf8\xa0\x78\x2c\x99\x8c\x36\x8e" - "\x77\x97\xb3\x4f\xc5\xd5\xcd\x09\xc6\xf6\x17\xbf\xe3\xd8\x70\x1a" - "\x0d\x79\x3c\x59\x8e\x53\x8e\x8f\xdb\x86\x77\x99\x17\x9b\x2f\x39" - "\x46\x1b\xc7\xdb\x7b\x49\x8d\x23\xd0\x65\xd1\x92\x97\xd4\xf9\x1e" - "\xbf\x8a\x91\x96\xfb\xb4\x30\xbc\x26\xfb\x8b\xfd\xf2\x64\x3c\x0c" - "\x19\x7b\x22\x97\x7d\xdc\xc4\x88\xa2\xd7\x64\xac\x44\xcd\x67\xcf" - "\xd7\x5c\x14\x94\x71\xd6\x1c\xc5\x7c\x0e\x36\xc8\x36\x99\xf4\x49" - "\x6b\x2a\x0e\xd2\x83\x01\xa6\x6d\xee\x41\x3e\xaf\xee\x97\xb4\xc8" - "\x3d\xac\x9f\x51\xe7\xb8\x6f\x1c\x4b\x70\x72\x90\x12\x59\xa7\xb0" - "\x39\x38\xb6\xc0\xa2\xed\xac\x93\x28\x9a\x82\xef\x0d\xa2\x5d\xf1" - "\xf2\xa2\xcb\x38\x36\xa3\xda\x5f\x3a\x0e\xfe\x4e\xfc\x1b\xf2\xde" - "\xa0\xd6\x65\xf4\xb1\xb6\xe8\x35\xde\x63\xf2\x68\x30\x7a\x9c\x8b" - "\x30\xff\x2f\xac\xb9\x70\x5c\x2c\xba\x4c\xb7\x31\xf8\x5c\x9c\xda" - "\xaf\x1a\x80\x87\xf2\x72\x5d\x7a\x40\x36\xfd\x91\x61\x95\x5d\x38" - "\x66\x16\xd5\xe8\xbc\x5c\x74\x1d\x9f\xab\xce\xcd\xe6\xfa\x07\x93" - "\x99\xc2\xf1\x13\xee\x27\xd3\x09\x1b\x25\x7e\xdd\x79\x89\x81\xfd" - "\xaf\x45\x01\xbd\x0d\x3a\x4d\x54\x1b\x1e\xbb\xbf\x3b\xf9\x80\x65" - "\xa0\xed\x8f\xdd\x2f\x69\x31\xf0\xbe\x22\x82\x36\xfc\x5c\xae\xf8" - "\xee\xb1\x99\xe0\x0f\x6d\xcd\x46\xa5\x89\xe4\x8f\x7e\xc3\x71\x1a" - "\x15\x8e\x4b\x48\xe7\x77\xe4\x2d\xf6\xd0\x89\x34\xb5\x0f\xf5\x18" - "\xda\xbf\xa8\x5d\x2b\x37\x86\x71\x89\xdb\xce\x28\x1c\x1f\x27\x9e" - "\x63\x55\xdc\x82\xc7\x13\x18\x5f\xdb\x77\xb8\x8f\x1f\x6b\xe5\x7a" - "\x99\x27\x44\x5f\xc1\x10\x7f\x5f\x1a\x75\xf7\x15\x60\xfc\xa4\x19" - "\x50\x0f\xe4\xdf\xe7\x46\xad\x4e\xbf\x8e\x2b\xe3\x06\x5d\xd1\xd4" - "\x23\x96\xc4\xa7\x2f\xd7\xcb\xe3\xbd\xaf\x60\x18\x7e\x26\xfc\x86" - "\x7e\xd3\xf9\x18\x7a\x6d\x97\xaf\xe2\x50\x49\x78\xa5\x38\x3c\x2f" - "\x28\xc2\xb0\x0b\xba\xaa\xc0\xbf\x23\xd6\xb9\x68\x84\xff\x11\x43" - "\xce\x6a\xca\x80\x6d\x4b\xe2\xbc\x98\x5a\x17\xc6\x75\xa5\x98\xc2" - "\xf1\x68\xf1\x9c\xae\x3d\x4f\xe0\xe7\xee\x95\x62\x61\x8f\xf3\xf1" - "\x9d\xfa\xde\x9d\x8a\x3d\xf3\x78\x63\x7f\x1c\x9e\xc4\x87\xf9\x9c" - "\x0f\xcd\xb3\xa3\x8e\xc4\xa7\xba\xb8\xde\x1c\x9e\x3b\x50\x1f\xf2" - "\x61\xfe\x5f\x38\x85\xf3\xf9\x12\x6f\x1c\x89\x5f\xda\x20\x7b\x9c" - "\x5d\x8c\x57\x77\xd2\xa1\x12\x1d\xd7\x11\xfe\x0c\xc3\x37\xc3\x2d" - "\x2f\x53\xc7\x0d\xe9\x87\xab\x54\x7a\x90\x63\x91\xb1\x0f\x22\xde" - "\xe7\xe9\xb8\xea\x38\x70\x7d\x7c\xae\x52\x24\x1f\xb0\x71\x6c\x17" - "\xae\xcf\xf7\x5c\x01\xe7\xad\xd6\xf1\xfd\xfa\xb3\x3f\xf1\xe9\xee" - "\xa1\xbc\xa3\x8a\x27\xf3\x8e\xea\xf3\x17\xee\xbb\xa2\xf7\x7b\xf3" - "\xda\x63\x65\xd9\x63\xcb\x96\x15\xe7\x2c\xcf\xe7\x4b\xda\xf8\x67" - "\x6f\x48\x8e\xb4\x49\x59\xbe\xa9\xd8\x00\xf9\x7c\xf6\x89\x5e\x1a" - "\xa9\xef\x5f\xe6\xf7\x9f\x7f\xd2\xfc\xa4\xef\x62\x5d\x95\x75\x3a" - "\xbc\x5b\x78\xa8\x64\x2d\x83\x49\x38\x66\x22\xc3\x60\xb2\x93\xe5" - "\x45\x77\xd2\xa9\x22\x49\x8f\x4d\x46\x0f\xca\xf5\xaf\x7f\x0e\xe2" - "\x27\x96\x1b\xda\x78\x98\xcf\x66\x72\x8c\x23\xc3\xef\xd7\x74\x18" - "\x78\x0e\x2f\xc5\x3d\xdb\x4e\x52\x6f\xd0\xe2\xe6\xbc\x7f\xb6\x03" - "\x72\x38\xbf\x4b\x54\x1c\xc0\x3c\x9c\xef\x19\x14\x87\x88\x3d\x76" - "\xf6\xc9\xea\xa4\xc5\x34\xe8\x7e\x78\x79\xf3\x61\x35\x0e\x17\x2f" - "\x68\xb6\x12\xe3\xf1\xb3\xe3\xb4\xf8\x7e\xa3\x15\xb2\x76\x34\xfd" - "\x0e\xf7\xd2\xd6\xe5\x77\x51\xfd\x75\xf5\xa9\xed\xc6\x44\x61\x10" - "\x42\x24\x08\xf5\x47\x46\xed\x26\x11\x3f\x83\x48\x90\xbb\x45\x89" - "\xa0\xd4\xb0\xa1\x46\x32\x8f\x48\x31\x5d\x7b\xcd\x18\xeb\x5d\x77" - "\x4e\x9b\xea\x28\x2d\x01\x77\x07\x03\x66\x11\x19\xe7\xe9\x94\x65" - "\xc1\x0d\x65\x24\xfd\x05\x2a\x4e\xc5\x8d\xdd\xbc\xc9\x29\x8a\xf8" - "\x6c\x6e\x78\x84\x31\xcb\xf1\x2c\x19\xf6\xf6\x7a\x0c\x1c\x3b\x98" - "\xe7\x68\x8e\x59\x06\x5c\x8f\x7d\x80\x34\xb4\xdf\x2e\x2a\x8d\x59" - "\x6a\x3f\xf0\x89\xb1\xe1\xcd\xc6\xac\x01\xf8\x46\x62\xf8\x8e\x57" - "\xc8\xb0\xa3\xb4\xcb\xe0\x36\xde\x49\x6e\x9b\x9f\x3e\xc0\xfd\x20" - "\xfd\x59\x04\xfa\x13\xc3\xa8\x77\x86\xcb\x1d\x5f\x91\x41\x3b\x5f" - "\x67\x38\x4d\x4f\xfc\x64\xdf\x20\xe5\xf8\x3c\x6b\x77\xf2\xa1\x7b" - "\x7a\x9c\x4f\xa0\xff\x7f\xe0\xd7\xe6\x04\xc8\xae\x27\x60\xff\xe5" - "\xab\xe7\xe4\x43\x1c\xb3\x87\xd3\x1a\xf5\x3c\xf1\xe7\x05\x5e\x73" - "\x14\x2e\xee\x57\x71\xfe\x8b\x2e\xf6\xdd\x1f\x64\x9f\x7f\x98\xdb" - "\x7e\x0b\xef\xb3\x0c\x19\x11\xa0\x14\xc7\x39\xd1\x07\xbb\x3d\x15" - "\x6c\x6b\x08\xc1\xf6\x0a\x9e\x17\xd9\xad\xde\xb3\xc4\xb1\xfe\x78" - "\xbf\x76\xcf\xe2\x3f\x1a\xdc\x81\x33\x2e\xf7\x86\x30\xb5\x61\x7e" - "\x76\xd7\x9e\x71\xb5\x7a\x8f\xe0\x3e\x44\xad\xf4\x29\xb5\xda\xff" - "\xdf\x32\xb9\x56\x52\x2b\xca\x98\xce\x7d\xe7\xc5\x7c\xb7\xf1\xff" - "\x21\x8e\x57\xcf\xb2\x02\x74\xb7\x9d\xa6\x82\x75\xef\x03\xce\xde" - "\xff\x04\x2c\x19\xdb\x69\x3a\x7d\x80\xfb\x1e\x67\x41\xa5\x2e\x47" - "\xe2\xc6\xd1\x48\x70\x6d\x32\xdb\x1f\x31\x84\x21\x93\x38\x06\x17" - "\x64\xd1\x14\x6e\x17\x9e\xd3\xf9\x19\xd7\x09\x7c\x35\xaf\x73\x6d" - "\x33\x07\x1f\x61\x19\x95\xcd\xf2\x07\xe9\xf3\xeb\xcf\x4b\x99\x95" - "\xa5\x3d\xcf\xd6\x9e\x67\x6a\xcf\x99\xda\x73\x86\xf6\x3c\x8d\x9f" - "\x95\x6c\x5b\x62\xeb\x97\xbb\x86\x61\xed\x78\x4e\xd7\xfb\x02\xf8" - "\x0c\x37\xdb\xd7\x4a\x19\xa9\xe1\x31\x45\xc3\x2b\x5d\x7b\xd6\xf1" - "\xb9\xda\x1c\x5c\xfb\xbf\x85\xcf\xbe\x18\x7c\x5c\x11\xf8\x90\xd9" - "\x9e\xf1\x4d\xf0\xb1\x98\x39\x5e\xf3\xdf\x81\x0f\xe3\xc2\x69\x3d" - "\xce\x27\x33\xa2\xf1\x79\x32\x4b\xc7\x27\x2e\xbf\xad\x14\x5d\x3c" - "\x3f\xac\xb8\x52\xc6\xaa\x1c\xc6\xb2\xbf\xbe\x57\x8f\xa7\xf6\x64" - "\xe5\xc5\xe2\xa9\x61\x2c\x58\x91\x07\xed\x7f\x72\xa1\x36\x0f\x1e" - "\x54\xfa\xd2\x93\xcd\xba\x6f\x0c\xda\xba\xb3\x4a\xb5\xb5\x61\x03" - "\xc7\x14\x5b\x4d\x57\x39\xec\xa2\x0b\xfa\xff\x7f\x35\xdb\x7c\x51" - "\x63\xa0\xb0\x78\xc5\x8a\xa7\xef\xb0\x15\x2e\x5a\x9a\x6f\x1b\x9f" - "\x67\x5b\x51\xb0\x64\x71\x71\x7e\xf4\x7e\xb1\x45\x8b\x97\x2f\xfd" - "\xe0\x59\x27\xe5\x31\xc0\xfc\xcf\x76\xbc\xf2\x5d\x7c\xea\x79\xe1" - "\x7c\x92\xcf\xca\x9a\xea\x5e\x24\x23\xef\x51\xf4\x38\x9f\x9a\xaf" - "\xcf\x09\x2a\x3e\x34\x25\x18\x2c\xac\x73\x3d\x05\xfb\xf7\x09\x6f" - "\x44\x3a\xe7\x2d\xd3\xd3\x18\xbe\x26\x9b\x86\x1d\xa7\xa7\xc6\x72" - "\x9d\x71\x69\x78\x5e\x6c\x87\xad\x9b\x00\x7b\x84\x6d\x43\xc1\xf1" - "\x83\xf8\x7c\x19\xca\x09\xe0\xf3\x09\xcb\x5e\xfe\x06\x84\xd2\x7d" - "\x05\xe3\xf8\x39\xca\xec\x40\x9a\x71\x33\xf2\x42\x9f\xee\xe2\x72" - "\x48\x0f\xf1\x39\x7f\xa4\x9b\xb4\x98\x48\x48\x2b\xbc\x8c\xcf\xe1" - "\x23\xcd\x12\x91\x36\x9e\xe3\xf4\x22\xcd\xa6\xe0\x15\xde\xc6\x74" - "\xc6\x73\x86\x66\x73\x73\x9e\x59\x5a\xbd\x65\x91\x38\x73\x14\xf5" - "\x5b\x26\xa5\xdb\xe6\x3f\xf8\xbd\xe9\x77\x3e\xbe\x6c\xe9\xe2\x64" - "\x92\x64\x4f\x4b\xb7\x8f\x4f\xbf\xc5\x7e\xc3\x1d\xb6\xa2\xfc\xfc" - "\xe5\xb6\x55\xf9\x4b\x8b\x6d\x8b\x56\x2d\x5a\x9d\x4c\x8b\x97\x2d" - "\x7f\x9c\x4f\x91\x73\xb7\xac\xc8\x79\x7c\xf1\x13\xbc\xa9\xaf\x72" - "\x27\x47\xcd\xc7\xf3\x59\xb6\x69\x71\x17\x0e\x43\xe6\x06\x44\xd2" - "\x87\xe5\xb8\xe7\x3d\x0b\x2b\xae\xcd\xf8\x1d\xc4\xaf\x11\xbf\x23" - "\xf8\xb5\x9f\xa4\xe5\xa9\xb8\xee\xef\x71\x16\xfa\x75\xbd\x60\x80" - "\x87\x9e\x36\xe9\x3c\x84\x79\x7c\xbf\x9a\xdf\x9e\x9e\xda\x16\x94" - "\xe3\xa7\x9f\xa7\xaa\xce\x0f\xf0\x94\x8c\x77\xc8\x3e\x2b\x2b\xf1" - "\x1e\x3c\xcc\x76\x2c\x68\x9e\xc4\x74\x3b\x41\x45\x13\x61\xfb\xb7" - "\x70\x2c\x10\x5c\x9b\xc1\x2f\x2d\x2a\xfe\xc6\xd3\xfb\x91\x6f\x2c" - "\xea\x38\xa8\xd5\xa1\x9e\x47\x89\xc3\x6c\xe7\x1f\xd7\x9e\x95\x4d" - "\xbc\xec\x43\xbe\xe7\xab\xb6\x57\x64\x66\xff\x3f\x65\x5b\xe9\xef" - "\x96\x3e\xa2\xd5\xe1\x02\x2d\xca\xea\x9c\xa2\x7f\x9f\x83\xd7\x98" - "\xcc\x09\x77\x09\xe0\x73\x26\x9c\xf8\x70\x87\x8c\xd3\x57\xd6\x0b" - "\x19\x71\xeb\xad\x6e\xbb\xcc\x9f\xc0\x6b\x50\x73\x8b\x44\x98\xe3" - "\xa2\x86\x13\x9f\xea\xe0\x72\xc2\xf4\x61\x79\x78\xf3\xf0\x0c\xa5" - "\x0b\x70\x7c\xb4\xa5\x9a\x1f\xa8\x08\x30\x6d\x4f\x52\xe1\x17\xca" - "\x9e\x59\x9e\xaa\xf4\xac\xa5\x99\xba\x2f\x19\xc6\x68\x1a\x9e\xe7" - "\xeb\x32\xc0\x43\x4b\x6d\x9a\xdf\x8f\x4b\xb5\x7f\x69\xa5\xf6\xdc" - "\xa8\xe1\x98\xc0\xb1\x1e\x80\x7f\x3b\xf7\x1d\x6c\xc3\x46\xdc\x1f" - "\x01\x7d\x5a\x14\x7d\x96\xca\x35\x06\xe8\x35\xfc\xfe\x08\xc7\x9d" - "\xc7\xbb\x23\x2a\x8e\xc2\xd3\xcd\xdc\xe6\x01\xdf\xc0\xda\x0c\xd0" - "\xef\x43\xde\x53\xc3\x58\x6a\x74\x9f\xe7\xf1\xf9\xb4\x0b\xf0\xf6" - "\xe9\x72\x87\xe5\x4c\x4e\x08\xe3\x54\xea\xa5\x4b\x83\xba\xbc\x19" - "\xe0\x83\x65\x96\x78\xb2\x24\x5e\xbf\x6b\x7d\xb3\x5a\x38\x0b\xe7" - "\x03\xa7\x7d\xb2\x0f\x38\x6e\xe4\xf9\x7e\xfd\xb7\x4f\xc9\xc8\x65" - "\xfd\xfa\xaf\x8e\x07\xc7\xbb\xf5\x30\x6e\xbd\x72\x9f\x53\x93\x1b" - "\xcb\x2a\x75\xb9\xa1\xc3\x31\x27\x88\xb0\xd9\x8e\x7f\xe5\x07\x18" - "\x6f\x39\x5f\x4a\x7d\x04\x70\x46\x9c\x53\x67\x7c\xc2\x15\x07\xd0" - "\x8e\x65\x99\x90\x31\x46\xa9\xa3\x3a\x0b\x9f\x18\x90\x45\xcb\x3c" - "\x91\x30\x85\xe9\x40\x90\xe1\xb2\x3c\x62\x9d\x24\x27\x64\xe4\x38" - "\x1b\x41\x6d\x7e\x81\x0c\x2e\xb2\xe8\xb8\x82\x86\x87\x75\x7c\xb5" - "\x6f\x7c\xc0\xc6\x5e\x56\x34\x2f\xd4\xc7\xbe\xae\xcd\xaa\x3f\x9f" - "\x91\xf2\x06\xef\x1a\x50\x76\xb6\x87\x9e\xda\xae\x8d\xa1\x16\x94" - "\x6f\x68\x2a\xcd\x44\x9e\xa2\x02\xcd\x5f\xb3\x1d\xfd\x7b\x24\x82" - "\xf7\x1f\x89\xb0\x97\x8f\xa8\x3e\xbc\xb3\xec\x38\x15\xed\x8c\x48" - "\xd7\xfa\xb6\x29\xeb\x38\x3d\xf3\x88\xb2\x3d\x0f\x68\xe5\x8b\xa4" - "\xcf\xa6\x8e\x23\xcb\x02\x3e\x8f\xc4\x63\x5c\xd2\x5e\xf6\x71\x91" - "\x47\x9f\x2f\x00\x6b\xbf\xa4\xf9\x28\x71\x90\xe9\xa4\xe2\x19\x14" - "\xbe\xa0\xe8\xf4\x8c\x29\x8a\xf6\x3c\x6f\xa2\x1e\xa6\xd3\x88\x75" - "\x22\x3c\xc2\x9f\x20\x72\x56\x1b\x65\xec\x66\x1e\xe3\xbc\x37\x01" - "\xfe\x90\x7a\x95\xa2\xdb\x33\x33\x75\xba\xe9\x7d\xc7\x74\xf2\x50" - "\x51\x23\xd3\x36\xba\x8d\xc3\xda\x8f\xeb\x6d\x07\x4d\x79\xbd\x14" - "\xcf\x0b\xb5\x71\xd1\xe2\x1a\xcd\x7b\xe5\x4f\x2f\x6a\x32\x7e\x8f" - "\x9a\xec\x53\x48\xd1\xf6\x19\xd8\x7f\x4f\x99\x64\x3b\x14\xac\xc3" - "\x4c\x5f\x1e\x2b\xc0\x33\xa0\xc5\x16\x3a\xac\xfc\x35\x9e\x5e\x08" - "\x7d\x3f\x20\xc7\xf2\x4a\x19\x03\x82\xe3\x8b\xb6\x33\x8d\x58\x2e" - "\xf2\x58\xe2\x31\xc0\xe3\x49\xd1\x68\xb9\x31\x82\x46\xcd\x4c\x1f" - "\x8d\x4e\xfb\x63\x64\x79\xbe\xad\x70\xba\x92\xc5\xb6\xb4\xf1\x79" - "\x93\x65\x20\x0f\xdb\x7d\x33\xee\xb0\x65\x4d\x1f\x6f\x2f\x98\x30" - "\x57\x5d\x66\x64\xcd\xe6\x6b\x72\xb4\xfd\x64\x43\x3d\x85\xd1\x36" - "\xd8\x2a\xaf\x92\x1f\xcb\x37\x78\x28\xe8\x93\xb4\x5b\x29\xbc\x55" - "\x67\x89\x42\x4c\xc3\xa5\xe8\xd3\xf2\x03\x5b\xe6\x41\x06\xcf\x5b" - "\x2d\xbe\xaa\x47\x3a\xc7\xa8\x65\x5e\x04\xcf\x73\x0c\x1c\xf2\x25" - "\x9d\xb2\xf8\x92\xbc\xed\xbe\xa4\x43\xf3\xef\xbd\xc1\x21\x00\xab" - "\x5d\x6f\x0b\xdb\xc5\x82\xcb\xdb\x45\x88\xe9\x92\x63\x47\x7f\xa3" - "\x1c\xdb\xc8\xc8\x17\xc0\x1c\x90\xa1\x6c\xc3\x15\x68\x7f\xe1\x0e" - "\x4d\x7e\x65\xe1\x39\xd5\x43\xe9\x92\x8f\xc3\x4e\x2b\xaf\xcf\x19" - "\xc3\xeb\x6f\x7c\x40\x54\x78\xdb\x75\x98\x80\x35\x54\x8b\x3d\x27" - "\xe1\x7d\x53\x5f\xc1\xf0\xc6\x83\xd5\xe6\x04\x15\xe7\x0e\xe3\xba" - "\xac\xde\x10\xce\xee\xf7\x05\xc0\xbb\x11\xeb\x2c\xec\x2b\x90\x0d" - "\x7e\x2b\xe3\x3c\xfa\xbb\x2a\x67\xd8\x53\x65\x08\x07\xd0\x77\x16" - "\xa5\x33\x7b\x59\x66\xc2\xfe\x5c\xe1\xd2\xe7\x32\x39\x07\x1a\xa8" - "\x4c\xd9\x30\x2b\xe4\x1e\xdf\x59\xa7\x91\x20\xa7\x17\x5e\x97\x2a" - "\xed\x92\x40\xd8\x99\x40\xca\x3f\x73\xc5\x3b\xba\x5c\xe5\x3d\x16" - "\xf3\x3a\xe1\xe3\xf5\x35\x73\x50\xf8\x78\xbf\x45\xce\x17\x74\x92" - "\xdc\x25\x3d\x65\x1c\x87\x54\xea\x3d\xa8\x57\xcd\x15\x21\x35\x57" - "\xa0\x7e\xd8\xf2\xb9\x98\x13\x12\x4e\xd2\x8a\x0d\x8c\x3f\xd3\x86" - "\xd7\x70\xc3\xa0\x95\x9b\xe7\x46\xa6\x4f\xf2\xfb\x16\xde\xe7\xe7" - "\xb6\x9a\x83\x68\x73\x64\xbb\x0c\x61\xcf\x66\x27\xda\x65\x40\xbb" - "\xec\xa7\x78\x9c\x04\xd8\xff\x02\x63\x6c\x94\x8c\xb5\x2b\x6d\xec" - "\xe2\x1d\x91\x6d\x64\x99\xaf\xda\x50\xfc\x61\xbc\x36\x0a\x03\xb7" - "\x91\x69\x50\xfc\x8a\x36\xc6\x24\x9e\x2c\x33\xbc\x54\x9c\x3d\x62" - "\x1d\xfb\x3d\x1c\xd8\x02\x3e\x9a\xc1\x7d\x88\x39\xb3\x9a\xf1\x8c" - "\xd7\x5f\x0c\x4f\xc1\x7a\x36\xcf\xbc\xae\x2c\xb7\xc7\xf9\x6c\x7a" - "\x7c\x7a\x3f\x7b\xff\xc5\xe9\xfd\xec\x78\x2e\xcf\x78\xb0\x1f\x88" - "\x39\x08\x03\x1d\x7c\x0b\x1b\xad\x3c\x5e\xbd\x23\xd6\x6d\x67\xbc" - "\xe2\xbe\x83\xdc\xf1\x56\x69\x72\x07\x7c\x28\xe6\xe1\xc7\x72\x08" - "\xb8\xb5\xe8\x32\xc8\x9c\x60\x4b\x94\x32\xc1\x20\xaa\xe3\xc1\x30" - "\xaf\xab\x66\xbf\x8b\x19\xa8\x3f\xee\x7b\xd0\xd8\x06\x1a\x95\x87" - "\xd7\xdf\x74\x9d\x39\x81\xee\xf2\x25\xde\x94\x6c\xb6\x07\xc7\x31" - "\x0d\x01\xd3\x8e\xb1\xfb\x1f\x6c\x9b\xaa\xd8\x58\x2b\x31\xff\xbf" - "\x20\xd7\xf3\x7c\x49\x07\xca\x55\xfc\xac\x95\xd9\x1e\xaa\x3c\xaa" - "\xaf\x6b\xe2\xb9\xc0\x43\x9f\x6a\xeb\x55\x57\xbd\x2a\x36\x1e\xb2" - "\x85\x9d\x66\x61\x5b\x63\x86\xee\xb8\x8a\xe3\x90\x1b\x44\xf2\x21" - "\xdb\x00\x9f\x28\x9f\x10\x9d\x4f\x50\x7e\x67\x7c\x1e\x58\xf9\xa7" - "\x8b\xf3\xc0\x4a\xb9\x5f\xcc\x74\x57\xf6\xc9\x4a\x9f\xae\x9b\x88" - "\xf5\x57\xbd\x6a\x2b\xe5\xfa\x57\x6e\x50\x75\x33\x4d\x32\x78\xad" - "\x7e\x36\xe8\x52\xd6\xe3\x5c\x35\x46\x97\x03\xcc\x2f\xe6\x10\x25" - "\xb0\x2c\x62\x5e\xc1\xbb\xa9\x90\x33\x5b\xd4\x1a\xe2\xa1\x0e\xf9" - "\x8d\x28\xe7\x72\x9b\xcf\x51\xb0\x95\x7d\x38\xfd\x49\x07\xd1\xe6" - "\x55\x0b\x3d\xf4\x87\x71\x32\x8f\xe9\x40\x00\x30\x82\x35\x23\x31" - "\x2f\x2b\x5f\xa6\x14\x1e\xd3\x1c\xf7\x86\xc7\x35\xd2\x52\x81\x37" - "\xc7\xc0\x81\x8d\xb3\xaa\xa6\x7f\x2e\x72\x66\x40\x56\x08\x39\x1f" - "\x62\x2e\x1a\xd3\x0d\xda\xfd\xd2\x10\xde\x79\x7e\xb2\x95\xb8\xcd" - "\xe7\xd7\x8f\xde\xf9\xb3\x49\x64\xfc\xc8\xfa\x18\x15\xdd\x42\xa9" - "\xeb\xbe\x67\xa4\xff\x9e\x4a\x06\xa6\x83\x87\x56\xed\x50\xb4\x5b" - "\xd5\xa9\xf7\x8f\x87\x56\xce\xe6\xfe\xe0\xf5\xb7\x79\x41\xf1\x95" - "\x5a\x23\xb4\x43\xfe\xe5\xb9\xd4\xfb\xe5\xf6\xd8\x75\x1f\xd6\xe1" - "\x6d\x4b\x56\xd8\xf2\x96\xad\x5a\x3a\x76\x6c\x94\x7d\x64\x94\xe7" - "\x3a\x9c\x76\xab\x9a\x43\xed\xb3\x75\xbc\x59\x17\xc1\x33\xda\xbf" - "\xfc\x82\x38\xdf\xb3\x73\x34\xd7\xdd\x9c\x74\x1a\xb8\xbf\x99\x66" - "\xdf\x1c\xf1\x78\x2b\xcd\xbe\xe5\xd6\x9c\x07\xf2\x17\xe5\xad\x8e" - "\x48\xbd\x2d\x72\x4d\xae\xea\x55\xd4\x9d\x38\xfa\x1e\xc8\x8a\x84" - "\xb9\xcf\xf1\x7c\xb2\xfa\xee\xd2\xa0\xf8\x1b\xe4\xf5\x54\x8c\xb1" - "\x9c\xd6\xe2\x20\xb5\x42\x96\x89\xab\x58\x86\x0f\x53\xe7\xd5\xa0" - "\x43\x81\xb7\xcc\x68\xbb\x0f\xba\xdc\x39\x5e\x93\x41\xb9\xfc\xb6" - "\x2d\x1c\x7b\xf6\xd0\x42\xa5\x57\xac\xb6\x21\xfd\x32\x5c\x67\xe1" - "\x3a\x14\xd7\x39\xb6\xa5\xb0\x75\xd8\x3f\x78\x25\xfb\x07\xaf\x66" - "\x3c\x12\x26\xf9\xcb\x68\xd2\x72\xd6\xd3\xed\x1d\xac\x77\x78\x68" - "\x75\x39\xef\x0f\x70\x5e\x94\x19\x6b\x7b\x92\xd2\xf9\x2a\xe4\xbe" - "\xca\x6a\x9b\xa8\x38\xb4\x50\x6c\xcd\xe6\x6f\xb7\x8c\x43\xfa\xf3" - "\x89\x09\xc7\x28\xd1\x3a\xec\x87\x3d\xce\xd5\x98\xff\xf2\xe5\xd8" - "\x18\xec\x7b\x6f\xac\x6b\xf0\x98\x1f\xd0\x45\xa0\x0b\x42\x17\xc9" - "\xb1\x6f\x24\xdc\x1b\x07\xf4\x90\xd5\xed\xfd\x3a\xad\x81\x92\xf1" - "\xec\xd1\xf9\x1d\xf7\x5e\x9d\x1f\xa3\x62\x83\x2d\x2d\xce\x5f\x9e" - "\x9f\x67\x1b\xbf\x22\x99\x22\x22\x83\x15\xe4\x2f\xb5\x2d\xcf\x7f" - "\xe6\xd9\xfc\x15\x32\xaa\x17\xbf\x8d\x9a\xcf\x53\x45\xf2\x07\xd5" - "\xfa\x99\x15\xdb\x68\xa6\xe3\x9a\xfb\x39\x9e\x94\xd8\xe8\xb2\xf0" - "\xbe\xa7\xd4\x3f\x52\x8c\x05\xd1\xb6\xc4\x73\x9d\x4a\x87\x3b\x34" - "\x5b\xd9\x31\xcf\xad\xe6\xe7\xe3\xb4\x26\x38\x10\x83\x7a\xcd\x6e" - "\xfe\x0e\x82\x46\x9f\x8e\x1e\xe7\x9a\x1d\x3a\x7d\x3c\x54\xa2\x9f" - "\x23\xf0\x4a\x39\x81\xb9\x14\x72\x2e\x6a\x1e\x55\xdf\x73\x5b\xd3" - "\xc0\x7b\xac\x72\x4d\x36\xe9\x50\x16\xd7\xc5\x30\x4f\xa0\x3c\xfa" - "\x61\x36\xe4\x23\xcb\xb1\x72\x1d\x1e\xea\xac\xe1\xfa\x34\x1b\xe7" - "\xdb\x27\xe9\x39\xb9\x67\x1d\x2e\x3f\x94\xc5\xb2\x63\x92\xd4\x39" - "\x00\x47\xee\x63\x95\x4c\x60\xfd\x51\xc6\x41\x07\x2c\x5e\x83\x85" - "\x0c\xc8\xe5\x6f\xff\x71\x9a\x8a\x6b\xb5\x5a\xfa\x09\xa2\xae\x99" - "\x3d\xce\xe7\xf2\x06\xfc\xb2\x4b\x26\xb0\x4e\xc9\x70\x3d\xf4\x5c" - "\x1a\xc3\x53\x71\xbb\x9e\x03\x2e\xf6\x9d\x03\xba\xd1\x73\x2d\x11" - "\x36\x17\xf0\x51\x78\xfa\x81\x8b\x8c\x11\xa9\xfc\xe6\x64\xbb\x59" - "\x4e\xd6\x68\x6d\xd7\xdb\x03\x78\x1d\xe0\xb9\x1a\x7d\xdf\xd5\xa3" - "\xb5\x9b\xf1\x63\xdc\x23\x71\x56\xf8\xae\x61\xb9\x84\x31\x5c\x62" - "\x89\x18\xc3\xbc\xe6\x32\x04\x69\xe3\x06\xfc\x71\xd7\x14\xc6\xca" - "\x87\x7b\x16\x3d\xfe\x14\x1b\xe9\xb3\xd3\x27\xd8\x58\x56\xe4\x3c" - "\x70\xef\x8c\x87\x72\x66\xcc\x5b\x30\x77\xbe\xf4\xbf\xef\x7f\x9f" - "\xb9\x34\x7e\x86\x68\xbe\xb2\x80\x37\x66\xa2\xbf\x86\x1c\xa7\x52" - "\x8f\x8a\xcf\x5c\xb2\x33\x3a\x3e\x73\x89\x0b\xbf\xa3\xf8\x41\x33" - "\x59\xeb\xc1\x0f\x7a\x64\xe9\x11\x8d\x5f\xbc\xc0\xf7\xc8\x00\xbf" - "\x94\xca\x35\x6f\xf6\x4b\x50\x6b\xa9\x25\x90\xff\x6b\xc6\x45\xbe" - "\x1b\xb0\xfd\xd6\xa6\xf4\xdb\x7e\xfd\xb2\x60\xed\x54\xdd\x0e\x44" - "\xda\x7c\xd8\x80\x49\x6c\x03\xaa\xb5\x9f\x52\xa9\x63\xc5\xda\x6a" - "\x03\x76\x9a\x89\x74\x1b\x90\x63\x43\xf2\xbe\xa7\x1a\xa3\x6b\x8b" - "\x23\x6c\x2c\xbf\x8c\x17\x78\x5e\xd9\x84\x5c\x4e\xae\xb5\xa5\x18" - "\xe7\xf3\xfa\x33\xf4\xda\x99\x98\xe3\x31\xef\xf4\x08\x31\xdc\x38" - "\x5f\xc3\x69\x3f\xaf\x47\xb3\xbe\xab\xec\xbd\x92\xa9\x2c\x7f\xc5" - "\xfa\xd1\xf7\xcc\x0b\xc9\x58\x6a\x90\xbd\x6b\x3b\x06\x78\xae\xd4" - "\xc3\x7d\xc9\x34\x00\x1f\x74\x82\x0e\xc6\x81\x36\x97\x52\x7f\x9b" - "\xb5\x75\x0c\x7d\x0d\x43\xd5\x55\x7a\x6c\xb0\xf6\xc5\x6f\x5b\x69" - "\xd6\xd7\xb6\x8d\xbf\x99\x83\x71\xa1\xb7\xf1\xc2\xf6\x95\xd6\xc4" - "\xb4\x2f\xfb\xc2\xf6\x95\x36\xf6\xef\xbb\xf4\xaf\x4b\x94\x1e\xe3" - "\x76\x32\x1f\xa0\x9d\x87\x13\xad\xa6\xef\x44\xdc\x4f\x88\x27\x57" - "\x47\xac\x33\x68\x67\x40\x1c\xb7\x35\x8f\x91\x76\x5a\xe0\x25\x43" - "\xb8\xe0\x25\x27\x7e\xb8\xb2\x9e\x3d\xa0\xab\x8a\x80\xc2\xcf\x31" - "\xa5\x19\xb2\x97\xd7\x5a\x06\x3b\xdb\x06\x9a\x1d\xd5\xd7\x01\x70" - "\xdf\xc1\xf6\xe4\xbc\xd0\x5d\x82\xd3\x99\x06\xb0\x49\x7c\xe0\xab" - "\x0e\xa5\xb7\x39\x36\xf4\xcb\xec\xef\x3c\xbe\x2f\x71\x1d\xd9\x9a" - "\x6a\x6f\xe1\xf4\x5a\xf4\x9d\x5c\x1b\x94\xdf\xc8\x1b\x04\x66\x4e" - "\x28\x83\x06\x81\x7b\x54\x87\x3b\xd8\x39\xc8\xc8\xb4\x65\x4b\x6d" - "\x05\x8b\x96\xe6\x2d\x5b\xbc\x78\x82\xed\xd9\xa5\x8f\x15\x2e\x7b" - "\xfc\x29\x16\xfc\x2b\x8a\x9f\xc5\xf8\x95\xe3\x36\x73\xf6\xec\x9c" - "\x7b\x16\x3c\xf8\x93\x28\x1d\xc0\x54\xed\x0c\x97\xcb\x6f\x64\xad" - "\x7f\x72\x4d\x8f\xb3\x0c\xfd\xff\x84\x5d\xcd\x37\x65\x98\xff\x1f" - "\x4f\x51\xba\xd6\xc3\x5d\xea\xec\x67\x59\x63\x84\x5c\x1b\x81\xe7" - "\x66\xfe\xd6\xc1\xc0\x1a\x48\x59\x75\xa4\x0e\xd1\x2d\xbf\x53\x57" - "\xb6\x43\x8f\x83\x50\x3c\x96\x0c\xc6\xb1\xd5\x54\x63\x10\x65\x1e" - "\x2a\x3b\x0c\x7b\xf1\x28\xde\x37\x7b\xa8\x60\x8b\x66\x3f\x1e\xe5" - "\x3d\x56\xb6\x1f\x43\xb0\x25\xe7\xad\x76\xdd\x95\xb3\x3a\x81\x7d" - "\x88\xe5\x77\x13\x82\xe7\x45\x27\xef\x73\xf2\x9e\x11\x7f\x37\xa1" - "\xea\x49\x69\x4f\x26\xca\x3c\xb8\xaf\x3a\x41\xd2\xb6\xc2\x7b\x5b" - "\xfd\x09\xf9\xed\x46\xd8\x1f\xeb\xc6\xe9\xba\xa7\x79\x9d\x4d\x9e" - "\x49\xdd\xac\xfa\xa3\x83\xfb\x82\xeb\xcb\x59\xed\x52\x75\xa0\x0f" - "\x50\xd6\xac\xd6\x7d\xd6\x2d\xbc\xe8\x7a\x76\x92\x77\x30\xfe\x01" - "\xcf\x97\x0d\x7b\x49\xc5\x2b\x66\x3f\x38\x9f\xee\x87\xc5\x3e\x59" - "\x80\xbb\x3f\xd6\xa7\x4b\xf9\x25\xac\x6b\xd1\xfd\x41\x70\xdf\xd1" - "\xaf\x2f\xf3\xb7\x36\x60\xe7\xd8\x4a\xd7\x0d\x3d\x4d\xeb\x5e\xa9" - "\x1f\x64\x5d\x59\x3f\x83\xaa\xf9\x4d\x0d\xeb\x71\x3a\xc7\xf4\xfb" - "\x92\xe0\x99\xc7\xf8\x80\x3f\x98\x73\xaa\xee\x4f\x24\x7d\xc8\x30" - "\x67\xf1\xf7\x3c\x4e\x90\xf3\x27\xf2\xfb\x21\xd7\xf1\x9a\xb0\xd3" - "\xde\x2c\x7d\xd9\x9c\x79\x91\xb8\x28\x3c\x9c\xe3\x79\xdd\x92\xdf" - "\x47\xe2\x62\x5f\xf4\xec\x92\xc9\xf6\xc5\x4b\x6c\x8f\x17\x2c\x29" - "\xca\x59\x22\xe3\x86\xca\x90\xa4\xc5\xab\x8b\x78\x95\xfe\x86\xe4" - "\x98\xb9\x42\xf3\x3b\xeb\xf7\xaf\x91\xbe\x67\xce\xcf\x40\x0f\x83" - "\xf2\x3d\x5b\xdf\xae\xe6\x43\x67\xd7\x85\x7e\x16\xce\xa0\xee\x67" - "\x01\xbe\xb2\xd4\xa8\x78\xe5\x9a\x6f\x06\xf3\xdd\xfa\x31\x17\x96" - "\x59\x9f\xde\xef\x67\xc4\xfe\x2e\x7d\xd9\xf2\x8c\x80\x8c\x2d\xfd" - "\x22\xf7\x9b\x73\x83\xdb\x7e\x2f\xef\x11\x6b\xfc\xbc\x3e\x57\xe7" - "\x67\xdd\x47\x8d\x61\xf1\x19\x85\xc9\x81\x48\xff\x94\xf5\x1f\x62" - "\x6e\xb1\xf6\xb7\xe3\x39\x03\x31\xee\x7e\x83\x8b\xf1\xd8\x11\x8b" - "\x07\xf0\x1b\x8b\xf4\x08\xff\x1f\xbd\x9d\xeb\xa1\xff\x6d\xb8\x40" - "\xc7\xbb\xfb\xde\xd9\x50\xe6\x56\xe4\x17\x27\xd3\x8c\x45\x85\x85" - "\x3c\xae\x17\xe5\x17\x3e\xbb\x7c\xd9\x8a\x9c\x25\x4b\x97\x20\xf5" - "\xee\xc5\x1c\xce\x55\x66\xb9\x43\x7b\x63\x5b\x9a\x9f\x9f\xa7\x92" - "\xb4\x6e\x88\xde\x1b\x51\xfb\xdf\x1b\x32\x3c\xb4\x2e\x30\xa0\xb7" - "\x6c\xd8\x22\x0c\xeb\x8f\xe2\xf7\x37\x39\xa6\xa5\x4e\xb1\x21\x2f" - "\xda\x2e\xd8\x50\xac\xf3\x83\xec\x3f\x07\xfb\x88\xbc\xfb\x55\xb7" - "\x90\x7b\x09\xe8\xb3\xe7\xff\xc4\xdf\x3d\xf5\xd0\xf3\x87\x59\x1f" - "\x8e\x80\xd3\xd0\x4f\xcb\xf5\x0f\x77\x30\x2f\x32\x3c\xfe\xde\x1b" - "\x9f\xcd\xc6\x7b\xf0\xff\xba\x32\xc5\xff\x1b\xfa\xf9\xbf\xdb\x90" - "\x08\x1b\x67\x43\x97\xae\x07\x47\x8f\x99\xe7\xe9\xc2\xb1\xc4\x3e" - "\x83\xcf\x5b\x75\xda\xea\xfd\xac\x78\xeb\xf9\x77\xf4\xb5\xc9\x7a" - "\x2d\xb6\x38\xdf\x73\x59\xd6\x71\xc5\x88\xe1\x77\xb1\x0f\xf4\x71" - "\x7a\x7e\x83\xe2\x97\xe7\x73\x23\x7c\x79\x2c\x27\xe9\x79\xcd\x9e" - "\x7d\xde\xae\xe3\x87\x76\x4e\xe1\x34\x86\xa1\xc6\xfe\xfa\x90\xe2" - "\x9d\xe7\x6b\x75\xda\xb2\xdd\x88\xe7\x86\x81\x39\x7d\xc3\x6c\x9e" - "\xeb\xb4\xb3\xe9\x7d\xdc\x7e\xc0\x99\xa0\xc3\x41\x5e\x3c\x9b\x9a" - "\x75\x5a\xe9\x79\x22\x79\x62\xc6\xa2\x22\x18\x75\x4b\x16\x2f\xce" - "\x5f\xbe\x42\x8f\xd7\x9b\xb6\xac\x30\x4f\xc5\xe7\xbd\x03\xdd\xbf" - "\x0a\x23\x70\x3a\x87\xf8\x45\xaa\xba\x8d\xb1\x01\x26\xb0\x1d\x2e" - "\xfd\xbd\xa4\xfe\xbf\xf1\xb6\x3a\xcd\x16\x38\x4e\x3f\x9b\x82\x2b" - "\xe4\xc1\x0b\xe7\x94\x5e\x96\x74\xa6\xc7\xf9\x42\xa1\xae\x97\x75" - "\x0f\x9d\x0a\xfb\xfa\x85\x12\xfd\x3b\x4c\xba\xae\xc0\x67\x51\x5c" - "\x4b\x39\xf6\xf9\xc6\x57\xc2\x15\x07\xec\x22\xf9\x4d\xd6\x49\x52" - "\x98\xef\x87\x7b\x39\x2e\x3a\xc7\x8b\x79\xe1\x30\xeb\x32\x2c\x4b" - "\x38\xc6\x79\x27\xbd\xb0\x85\xbf\xdd\xec\xa1\x8d\xb5\xbe\xa4\x03" - "\xf6\x0d\x6b\xc8\xb4\xed\x65\xf9\xfd\x5b\x4f\xf3\x76\xa6\xe3\x0b" - "\x9d\x87\x4a\xd4\xf7\xb4\xf9\x3b\xc4\x9b\xf0\x0e\xf6\xf0\x3e\x6d" - "\x2d\xb9\x52\x5b\xc7\xab\xec\x71\xfe\x0c\xfa\x5f\x4a\xa3\xe2\xcb" - "\x86\x6b\xbf\x5b\x46\x76\xfe\x3e\x9b\x8a\xf5\xd2\x7c\x58\x94\x37" - "\xd8\xa0\xc7\xf8\xa0\xff\x40\xcf\x7e\xa1\x50\x54\x34\xd8\x54\x9c" - "\x68\xe6\x8b\x17\x16\x72\x3b\x01\xaf\x86\xd7\x77\x78\x6d\x47\x83" - "\xcb\x71\xab\x12\xa0\xc7\x65\xb2\x2e\x87\xe7\xa2\xf0\xf9\x53\xdb" - "\x31\x77\x9b\x30\x57\xf9\xb4\xef\xfe\x14\xf3\x9a\xe7\x88\x75\x1e" - "\xcc\x45\xd7\x8a\x9c\xa0\x85\xf7\x1a\x86\xeb\xdf\x55\xe2\x75\x4f" - "\xe0\xb6\x73\x60\x0f\x01\xe5\x41\x13\xf0\x63\x59\x27\xfd\x4c\xfa" - "\xfa\x33\x2f\x32\xed\x7a\x41\x2f\xfe\xfe\xae\x38\x7f\x6a\x1f\xec" - "\xd0\xe1\x27\xe8\x67\x9f\x33\xdd\x78\xdf\x8f\xfd\x75\x90\x66\xe6" - "\xf8\xd1\xe8\x9f\x4f\x98\x66\x8c\x8b\x28\xdf\x55\x16\xec\xc9\xfe" - "\x21\x9f\x21\x64\x79\xb4\xb6\x04\xba\xdf\x62\x1e\xcb\x15\x0b\xd8" - "\x9e\xe3\x6f\x7e\xf0\xbd\x23\x4f\x84\x25\xcd\xd7\x30\xcd\x2b\x16" - "\xac\xed\x12\xe1\xaf\x9c\x24\x0e\xfb\x89\xbe\x32\x50\x30\x60\x48" - "\x60\xbc\x0d\x8e\x53\x7c\xce\x71\x3b\xb9\xed\xe5\x84\x7a\x4d\x9b" - "\xd7\x90\x85\xcf\x85\xf2\xf7\x2c\xda\xfc\xb5\xd4\x56\x54\x4b\xff" - "\x1a\xac\x21\xd7\x4a\x3e\xe7\x5f\x11\xfc\x37\x7b\x0d\xef\xa5\x24" - "\xe1\xfe\x3d\xdb\x43\x5c\x57\x79\xcd\xbf\x1d\xf9\x33\xfd\x9b\xeb" - "\xcf\x64\xfb\xa9\x7c\xde\xd1\x92\xfd\xaf\xd4\x92\xf1\xaf\xe4\xe8" - "\x14\x61\xb6\x09\x4a\x9f\xe6\x3a\xca\x01\x6b\x3b\x9f\xa7\xb4\x84" - "\xbb\xad\xc9\x68\xbf\x71\x9e\x9d\xa8\xcd\xef\x03\x0f\xbd\xcb\x38" - "\x8e\xaf\x3b\x4b\x26\xd7\xd2\x3f\xca\x7b\xa5\xab\x9f\xda\xee\xce" - "\xeb\x60\x3d\x29\xc8\xe7\x47\x79\xef\x09\xba\x6e\xb8\x8a\x71\x0c" - "\x29\xbc\xf9\x3b\xd2\x7a\x79\xe8\x51\x5a\xf9\x72\xb9\xc6\xbb\x8d" - "\xe9\x01\x9c\x5a\xe7\x2b\x9a\xb4\x74\x80\xa6\x0f\x69\xf4\xc9\x8e" - "\xa4\x4f\x79\x26\xd3\x87\x63\x0f\x86\xd1\x5f\xc0\x2d\x03\x34\x08" - "\xeb\x75\x00\x67\x93\xb6\x6e\x67\xda\x7c\x96\x52\x5c\x4b\xf9\xdb" - "\x44\x15\x6f\x98\xb3\x8c\xa6\xf0\xf9\xd3\xfb\xaa\xce\x91\x91\xfb" - "\x8d\xd7\xe7\xab\xe4\x7b\x49\xf3\x4a\xee\xb3\xc8\xef\x99\x33\x1f" - "\xf2\x37\xcd\xd1\x5f\xe5\xc0\x61\x1c\xfa\x6a\x3b\x5f\x15\x6f\x37" - "\xd8\xf8\x7c\xbd\xa6\xcb\x0f\xa4\x83\xb7\x83\xfc\xdd\x41\xb9\x2e" - "\x51\x31\x2e\x0c\xde\x66\x7b\xbe\xee\x45\x4a\x09\x3b\x9f\xf7\x6d" - "\x83\xac\xa9\xc5\x5c\x56\x37\x92\x2c\xbc\x96\xf5\xaa\xf4\x1f\xde" - "\x98\xa6\xcb\x9e\x8d\xa3\xf8\x4c\x52\xc5\x7c\x83\xfc\xbe\xdc\x81" - "\x6a\x8d\xcf\xab\x91\x67\xb6\x87\xae\xd8\xa1\xe4\xef\xc6\x6c\x7d" - "\x2c\x41\x4f\xf2\xe9\xfc\x8f\xf1\x59\xe4\x63\x7e\x97\x7e\x08\x1e" - "\xd8\xb0\x66\xc1\xbe\x9d\x03\xdf\x54\xdb\x58\xad\xf3\x39\xda\x56" - "\xc4\x72\x82\xc7\xf4\x60\x7a\x36\x74\xbc\x16\xb1\x35\x9b\x36\x9f" - "\x24\x4a\x59\x27\x7c\x29\x9d\x66\xd1\xe6\x6f\x91\xe7\xd9\xf8\xfb" - "\x89\x75\x48\xc7\xfb\x84\xb9\x7e\x9f\x19\x3a\x61\x3b\xd3\x5f\x4f" - "\xe7\xfd\x05\x5e\x8f\x99\xeb\x17\xbe\x79\xab\xcd\xfc\x7d\xb7\x31" - "\x72\xcd\x59\x4b\x6f\xb3\xf2\xbe\x83\xcf\x0c\xfa\x05\xfb\x61\x75" - "\x67\x27\x32\x9e\xc8\x9b\xda\x9f\xb7\x3b\xdb\xe8\xb6\xab\x3a\x23" - "\xd2\x86\xcc\xb3\xa3\x2c\xf7\xb7\x96\xa6\x74\xc9\x9f\x17\xf5\xdb" - "\x47\x1c\xa7\xaf\x1b\x73\xdf\x8a\xec\x84\x70\x77\xb6\x21\x04\xd8" - "\x18\x3f\x16\xf9\x9d\xb9\xa0\x4f\xfb\xd6\x4b\x17\x64\x40\x07\x89" - "\x4d\xc6\x22\xe4\x33\x32\x5c\x3e\x13\xcd\x71\xf2\xc5\xf0\xa1\x71" - "\xf5\x47\x51\x7e\x36\xcd\x55\xfa\x53\xf0\x64\xa5\x9d\x65\x42\xc8" - "\x74\xb0\xcc\xf6\x24\xeb\x18\x3f\xff\x92\xfb\x3f\x84\x71\x1a\x4a" - "\x3a\x58\x36\xb9\x8b\x12\xf8\x7b\x7f\x6a\x4d\xa3\xf2\x32\x3e\x03" - "\xee\x08\x0b\xe8\x6d\x95\x92\xf7\xcc\x5e\xf6\xab\x3a\xb8\x41\xfa" - "\x32\x25\x9f\xb6\xb9\x03\x5d\xd4\x52\xf6\x29\xb5\x04\xdd\x65\x07" - "\xcf\xfa\x8c\xca\xa7\xc9\x08\xb8\x95\xe3\xf9\x9d\x03\xfc\x9e\x13" - "\xda\x4e\x83\xad\x29\xb3\xad\x87\x79\xe8\xaf\xca\x86\xaa\xb4\xeb" - "\x36\xde\xd7\xb4\xa1\x9d\xcf\x91\x0b\x61\xa5\xf0\xc6\x16\x1b\x70" - "\x71\x88\x9e\x34\x9a\xbc\x86\xd7\x78\x2a\x77\x42\x77\xcf\xd0\xe0" - "\x9e\xd1\xe0\xb6\x5f\x0c\x2e\xf3\x4c\xcb\x16\xb9\x9f\x81\x36\xb5" - "\x58\x42\x80\x1d\x4a\x6e\xc9\x82\x0c\x77\x38\xbe\xe2\xb5\xbe\xcd" - "\x57\xa3\x1e\x4b\x5b\xb0\x9d\x38\x26\x45\x5d\x18\x73\xdc\x19\x2b" - "\x69\xfe\x5b\x8e\xd3\xb4\x89\xd7\xaa\x2d\xb0\x45\x79\x1d\xdf\xc1" - "\x72\x92\xed\xda\xd2\x10\x0d\x75\x43\xab\xe1\xf3\xd4\x80\x71\xd9" - "\x87\xbc\x67\x02\x59\x13\x12\x56\xc3\x7b\xe7\x3d\xc4\x3e\x1a\xf2" - "\x7c\xf5\xfa\xab\x5e\x1d\xb1\x8e\xee\x12\x06\xb3\xf4\xcf\x0b\x57" - "\x78\xd3\xd0\xb7\x76\x89\xcf\xc6\x03\xb5\x11\xbe\x62\x89\xa8\xeb" - "\x79\xf6\x15\x13\xa6\x03\x79\xb5\xbc\x87\x91\x74\x9a\x7c\x49\x5e" - "\x9f\x40\xdf\xf5\x38\x37\x35\x7a\xe8\xe7\x72\xcd\xb6\x92\xfd\xab" - "\xa5\xbc\xde\x3c\xde\x97\xf4\x31\xef\x49\xf0\xd9\xab\x84\xf0\xca" - "\xd0\xbe\xaa\x2f\xc9\xa8\xe8\xb2\x79\x48\x9b\xb7\xc7\x25\xca\x3f" - "\x0e\xf0\xd9\x19\xad\x0e\x33\xea\xf8\x8b\xa8\xf8\x38\xe0\xa1\xcd" - "\x9a\xcc\xe0\xfb\x4d\x3e\x7e\x1f\xec\x4b\x83\x6e\xb4\x29\xaf\xb6" - "\x97\xd7\x92\x37\x59\x84\xf3\x5a\x57\xb7\xe9\xe3\xc0\x83\x56\xd6" - "\x8f\x36\x4f\xf5\x24\xec\x0f\x6a\xeb\x4b\xf2\xcc\x78\xec\xba\x50" - "\x7f\x5f\x6e\xb5\x26\xbb\x01\x04\xf6\x5e\xea\x49\xaa\x7e\xa3\xd7" - "\x49\x86\x3e\xe8\x75\xbd\x06\xe8\xef\x5b\xb3\x53\x36\x8f\xa6\x74" - "\xbc\x1b\x7d\x92\x36\x6f\x0a\x1a\x28\x15\x3f\x8b\xef\xaa\x82\x24" - "\xc0\xcd\xe0\xb5\xb7\xd6\xb3\xbc\xd6\xb2\xf9\x94\xd4\xbb\x5e\xa5" - "\x71\x61\xc0\xe3\xfd\x82\xaa\xd1\x34\x8e\xd7\xbf\x90\x96\x96\x13" - "\x52\xfb\x66\xba\xad\xbe\x7e\x34\x4d\x88\xae\x77\xb3\x76\x16\xbc" - "\x5a\xae\xa5\xaf\xf2\xd1\x35\x45\x77\xf2\x77\x01\xab\x0a\x84\x33" - "\x51\x88\xab\xac\x06\xb5\x9f\x5d\x75\xbf\x79\x8b\xe2\x3f\xb9\x4f" - "\x04\xbe\xe3\x7d\x38\x6d\x4f\x22\x41\x9e\x95\x4f\x3e\x64\x11\x7d" - "\x69\x86\x88\xf5\x47\x8b\xc4\x43\x3b\xe7\x1a\x5a\x7f\x63\x2e\xc3" - "\x60\x7c\x72\x16\xa9\xfd\x0c\x3e\x03\x0b\x1a\xcb\x78\xac\x95\xaf" - "\x52\xca\xcf\x5f\x25\x4b\xeb\x62\x6e\x57\x95\x2a\x63\x30\x12\xe3" - "\x1b\x2e\xe7\xf1\x06\xde\x00\xde\x5c\x9f\xfc\xa6\x6e\xf0\x8c\xcb" - "\x51\x2c\xc2\xae\x27\x59\xaf\xac\x3a\xe4\x5a\xde\x40\xf3\xf8\xcc" - "\x30\x9f\x17\x5a\x48\xbe\x7a\xc0\xab\x1f\x4d\x16\xc0\x6a\x75\x17" - "\x12\xaf\x77\x5f\xe7\x5a\xbe\x9f\x61\x1f\xe3\x79\x65\x13\xe8\xa3" - "\xe6\x97\xea\x1a\x77\xa0\x83\x5a\x31\xce\xe7\x16\x89\x10\xc3\x39" - "\x41\xd5\x57\xca\xf6\x6e\xb5\xda\x72\xd4\x39\x65\xd9\xd6\xfe\x7d" - "\x22\xad\x1d\xee\xb3\x0c\xaf\x7a\x82\x3b\x17\xf6\xad\xd6\x26\x9d" - "\xd6\x8a\xbf\xaa\x97\xb8\x96\xef\x20\xee\x1f\xce\x8f\xe7\x6c\xb7" - "\x17\x79\x4f\x45\xf7\x0b\xe7\xc1\xbb\x0a\xc0\xfd\xfe\xc0\x5e\x27" - "\xef\xc1\x0d\xe4\xa9\x7d\x95\xcf\x43\x6c\x6e\xd9\x0a\x1a\xa9\x35" - "\xe3\xaa\x73\x8c\x2b\x46\x91\xdf\x5d\xfc\x69\x7c\x3f\x46\xc8\x00" - "\xf0\xfd\xba\x36\xb9\xe7\x53\xfd\xf9\xdc\x60\x58\x28\xb9\xf6\x8b" - "\x2d\x61\xc8\x03\x0f\xae\x2c\x13\xa4\x5c\x99\xc4\xbe\x23\xbf\x78" - "\xc5\x9c\xa0\xfa\x97\xdb\xc2\xba\x4f\xbc\x3e\x8e\xd8\x8f\xb2\x30" - "\xae\x7a\x1f\xf3\x37\xcd\xc2\xbc\xa7\x38\x1a\xf4\xee\xb3\x92\xe2" - "\x3f\x51\x0d\xb8\x9a\x7f\xfc\x01\x2d\x9e\xc1\x81\xa3\xdd\x49\x07" - "\x2b\xc5\x73\x56\xd2\xfd\x49\x31\x7e\xcb\x73\x94\x8f\xae\x95\x65" - "\x55\xbd\x41\x8d\x1d\xc6\x51\x2b\xdb\xa1\xf6\xf1\x7f\x91\x8d\xf2" - "\x71\xe3\x27\x89\x44\xc8\x1f\x27\xc4\x35\xda\xc3\xf3\xa7\x80\xcc" - "\xc2\xbc\x30\xd4\xed\xef\xd5\xbe\x1d\xf7\xe2\x15\xd0\x99\x87\xf2" - "\xd9\x04\x1d\xb7\x4b\xdb\x3b\xfa\x85\x47\xd9\x29\x2f\xda\xf4\xb5" - "\x17\x61\x02\x8d\x9d\x66\xc1\x67\x78\xd8\xd7\xdc\x9f\x74\x36\xdd" - "\x37\xdc\x98\xab\xc6\xcd\x8b\x33\x45\x92\x92\xbb\x39\x01\x2a\xe3" - "\x76\xf1\xde\x20\x6c\xa0\xa1\xdc\x66\xc0\x29\xf0\xd0\xe2\x16\x35" - "\xaf\x2b\xd8\x83\xae\x7d\xe8\x6d\x43\x9b\x64\xdb\xd0\x46\xd9\x36" - "\xed\x9b\x2b\xa8\x4b\x9e\xdd\xbd\xb4\xf6\xbc\xa8\xe9\xfb\x67\xd3" - "\xf9\xbb\x90\x27\xa8\x66\xad\xf4\xb7\x46\x9f\xa8\xf5\xf5\x97\xa6" - "\x8a\xe4\x9f\x27\x5f\x1a\xcc\x97\x8c\x12\x66\xa5\x31\xf7\x97\x1c" - "\x9f\x4d\xfb\x6e\x13\x60\xe7\x43\xa6\xf3\x3a\xbd\xbf\x1b\xf5\xf1" - "\x37\xef\x06\xe4\xd0\x4b\x5d\xdc\x57\x93\x1a\x28\x43\xf1\xe1\x4b" - "\x9f\xd5\xa9\x6f\xee\x40\x37\x78\xa9\x12\x7c\xaf\xbe\x59\xd3\xef" - "\x7b\x9c\x20\x7d\x8f\x23\x65\xec\x25\xe2\x28\xe5\x9d\x48\xfe\xef" - "\x76\xdc\x97\xf0\x7e\x3a\xe3\xbb\x2a\xa8\xcb\xbf\x97\x4a\xf4\xbd" - "\x25\xb9\x9f\xbc\x1a\xbc\x52\xaa\xce\x2e\xf6\x38\x6b\xc6\xe8\xba" - "\x8a\xfc\x4e\x8f\x53\x1c\xe6\x7c\xf3\x56\x9f\x91\xfb\xcd\x55\xf2" - "\x9c\xee\x49\xed\x8c\x4b\xcd\xcd\xda\xda\x44\x1a\xfb\x7d\xa3\x2c" - "\xf4\xbf\xfd\xd2\x8f\x9f\x69\xc0\x75\x4b\xdc\xe5\xb7\x72\x6a\x8a" - "\x07\xf6\x13\x5e\xca\x92\xe9\xd2\x17\xb2\xa6\x52\xe7\x11\xb4\x77" - "\xa8\x8a\x97\xf7\xe2\xb9\xa6\x09\x24\x79\xa0\x5b\x58\x93\xaf\xaf" - "\x65\x9e\xac\xd9\x1f\x49\xa7\x79\xc1\xb0\x43\xc9\xa0\x97\x6a\x85" - "\x1c\xeb\x2f\xd5\x7e\xbd\x5e\xf1\xcb\x24\x5d\x27\x51\x74\xb6\x40" - "\xbe\xfc\xea\x88\xa4\x75\xf9\x2e\x17\xc7\x32\x78\xae\x94\xe3\xb1" - "\xfc\xf2\x4f\x1c\xeb\x26\x58\xbe\xcb\x13\xe2\xf3\x50\x8b\xd9\x27" - "\x65\x97\xef\x44\x11\x19\x72\x8a\x78\x0f\xe5\x63\x17\xdb\x6a\xc2" - "\x01\x9d\x20\x19\x7a\x0a\xc6\xf9\xda\x25\x64\x7e\xa4\x00\xb0\x1d" - "\x69\xa9\x1c\x8b\x86\xe3\xd0\x70\x3c\xa9\x90\x23\x6d\x24\xee\x47" - "\x41\xaf\xb3\xf0\xb7\xe1\xd9\xdf\x22\xe4\x14\x90\xc7\x47\x39\x1e" - "\x8e\xc1\xed\x0b\xd0\xda\x53\x64\xe2\x58\x37\xc1\x8a\x8f\x3b\xda" - "\xfc\x9f\x49\x3b\x65\x44\x11\x74\xf3\x30\x8d\x01\xcd\xad\xe1\xa4" - "\x8f\x5d\x98\xe3\x9b\x55\xbb\xcf\x08\xd5\x6e\x85\x37\xe3\xaf\x64" - "\xdc\x6e\x5f\xa9\xc4\xfd\x57\x4f\x07\x01\x3f\x5c\xfe\xb6\x37\x54" - "\xfe\x76\x97\x3a\x47\xd5\x42\xa5\xc5\xa2\xcb\x0d\x1d\x99\x7d\xfe" - "\xf8\x4c\x19\xfb\x73\x70\x1b\xb9\x7d\x5c\xf7\xbf\x9d\x3d\x25\x63" - "\xf7\x04\xf1\xec\x28\xd4\xca\x78\x51\xc6\xdb\x42\xbd\xe5\x6f\xcb" - "\xb6\xb7\xf9\x55\xd9\x1c\x79\xcf\xe5\x23\xe8\xa0\xb5\xb9\x9f\x0e" - "\x68\x3b\xb7\x8f\xdb\x1f\x64\x9a\x80\x06\x5a\x5b\xad\x7d\x5a\x3b" - "\xb9\x8d\xff\x8a\x59\xe7\x55\xb4\x13\x6d\x95\xed\xec\x43\x3b\x0f" - "\x17\x10\x05\x36\x9e\xcd\xf8\x2a\xf9\xed\x2e\xb6\x35\x1d\x9f\x40" - "\x9f\x2e\xa9\x26\xd8\x94\xc6\xdd\xa5\xd5\x86\x8d\xd0\x4d\x4a\x7d" - "\xb0\x2d\x7d\xa2\x8b\xf5\x7e\x77\x11\x7e\xc1\x5a\xf9\xcd\x4d\xa9" - "\x27\xf3\x37\x13\x9f\x41\x9b\xc2\x9f\x53\x69\x97\xe8\x82\x8e\x0a" - "\xfd\x07\x79\x0a\xd0\x7e\xd8\xa2\x27\x34\xfc\x39\xef\xda\x2f\x55" - "\xbb\xcc\x85\x94\xfa\xc1\x4f\xcb\x0d\xee\x8e\x72\xd2\xdb\xf2\x28" - "\xf2\xa1\x3d\x56\xc0\x92\x71\xe3\xc2\x68\xe7\x56\xe0\x19\x88\x68" - "\x53\xab\x37\x00\x98\x7f\xa1\xe4\x2c\x4a\x78\xf5\x34\xda\x71\x9a" - "\xac\xd5\xa5\xd0\xbf\x1e\x60\xbd\xf1\xe5\xd7\xbf\x95\x4d\xe3\x3c" - "\xf4\x4b\xf5\xbd\x8a\xfe\xef\x9a\xff\xaa\x55\x8f\x9f\x11\xe6\xf8" - "\x43\x49\x1f\x1f\x65\x3e\x92\xb1\x34\x78\xce\xe8\x01\xcf\xb0\x2f" - "\xc6\x2a\xd4\xd1\x93\x36\x4a\xe2\xe3\x54\xf1\x37\xf0\xcc\x73\x5e" - "\x2a\xaf\x2f\xa0\x5c\x87\x00\xcd\x18\x3e\xf4\xb9\x66\xbe\x32\x0d" - "\xe3\x9e\x4f\xd8\x43\x90\x75\xd0\x35\x61\x47\xef\x2b\xf5\x19\x9e" - "\xdf\x43\x13\x2e\x4d\xa6\xfc\x2a\x38\x98\xfc\xe6\x75\x7d\x86\x87" - "\xb6\x8d\x3c\x49\x5b\x8e\x45\x8f\x31\x9b\x94\x65\x4a\x0e\x6e\xd9" - "\xc9\x6b\xe9\x97\x56\xef\x16\x15\xb7\xc7\x29\xca\x2f\xb1\x5c\x83" - "\x8e\x07\xee\x0b\x06\xc3\xfd\xd2\xe9\xf0\x8a\x71\x30\x58\x9b\x5e" - "\x96\xb1\x94\x1c\x9b\x5f\x86\xbc\x80\xae\xd0\x64\xe5\xb8\xb6\x98" - "\x3b\x77\xf8\x69\xc5\x36\x32\x39\x4e\xf1\xfa\xce\x1c\x6a\xaa\x4d" - "\xa7\x3a\xd8\xf7\xa2\x3b\x6d\xe4\x4b\x67\x79\x4f\x5d\xc9\x10\xd6" - "\x49\xdb\xfc\x28\xb3\x22\xcd\x52\xf5\xb2\xae\xc3\xbf\xd2\x5a\x72" - "\x8e\x0c\xea\xbb\x01\xaf\xb4\x64\xda\x44\xb0\xc6\x10\x2e\xa8\xe5" - "\xd8\x32\xc9\xde\x2c\x8e\x2d\xa3\xc7\x5a\x91\xba\x8f\x1d\x63\xae" - "\xdb\x9a\xbc\x69\x39\x4d\xe0\xb8\x50\x66\x9f\xd2\xe5\xd4\x7c\xfd" - "\x0a\xcb\x58\x8b\xb6\x8f\x6c\x51\xf1\x57\xb6\x64\xd6\x9f\x45\x5d" - "\xf2\xfd\xab\x13\x43\xb0\x65\x24\xdc\xe5\x34\xae\xf6\x2c\xa5\xb1" - "\x1e\x94\xf3\xb9\xd2\xd9\xd8\x3e\x9c\xe3\x35\x8b\xd0\x7f\xa7\xd1" - "\xb6\x93\x03\x71\xa3\x7c\x2b\x38\xd6\x94\xb0\x0e\x76\x46\xb4\x6a" - "\x94\xf4\x19\x91\x31\x00\xd4\x77\xa5\x88\x6a\x5e\x24\x23\x7f\x47" - "\x91\xd7\xea\x78\x9d\x97\xcf\x8a\xa8\x39\xe4\xd5\x5a\x3d\xae\x4e" - "\x7c\x59\x7e\x9a\xcf\x78\x42\xc7\x3a\x7d\x89\x7c\xf4\xea\xc1\x41" - "\x6d\x15\xc0\x64\x3e\xf8\x9f\xc1\xdd\x9a\x7a\x11\xbd\xc6\x18\x2e" - "\x57\xb6\x59\x78\x28\x6c\x46\x5f\x8f\xcb\xb5\x92\xe7\xb7\xad\xd5" - "\x7c\x96\x66\xc0\x1e\xdb\xfa\x0c\xbf\xe3\x34\xf6\xf5\xce\x90\xfd" - "\xbe\xb5\x91\x6d\x34\xcd\xce\xfd\xc0\xd6\x9f\xa6\xf4\x2d\x9e\x77" - "\x99\x5e\xf5\x6a\xfd\x7a\x44\x8f\x73\xeb\x11\x7d\xee\x65\x1d\x44" - "\x7d\x6f\x72\x6b\x97\x27\xe1\x9f\x07\x3d\x57\xa7\xaf\xe7\x4b\x9f" - "\x2e\x8e\xeb\xe3\xac\xb5\xea\x73\xb1\xfc\x9e\xc0\xfa\xd1\xf7\xac" - "\x58\x4d\x63\x1e\xbc\x92\xf7\xb4\xe5\x99\x88\x2e\xa5\x23\xd4\x66" - "\x0c\xec\x8d\x65\x48\xde\x90\xdf\x0a\x63\x7b\xc8\x00\x7d\x41\xc5" - "\xb3\xf2\x2a\x5d\x41\x3f\x0f\x5b\xfb\x48\x44\x3d\x65\xfd\x73\x3e" - "\xea\x60\xdf\x06\x86\xaf\xf4\xa8\xda\x29\x5c\x07\xdb\x81\x4a\x17" - "\xa8\x9d\x72\x11\xfa\xa6\x31\x7d\xc3\x9a\xed\xeb\xf6\xfe\x4d\xd1" - "\xd7\x4e\x89\x93\x6b\xc8\xfa\x41\xa9\xc7\x88\x39\x26\xc1\xb6\x9c" - "\xcc\xa8\xff\x13\x7e\xcf\xe3\xd2\x35\x89\xd7\x20\xb7\x4d\x74\xb3" - "\x8e\xd1\x97\x9d\x32\x97\xd7\x27\xa4\xdd\xb0\x6d\xcc\x44\x94\x43" - "\xda\xc8\xf7\x4f\x07\x8c\x55\x6b\x68\x02\x7f\x93\x0f\xe9\xd2\x07" - "\xc1\xf7\xed\xa7\x7a\xae\x4f\x25\xeb\xf5\x35\xec\xef\xbe\x2d\xd3" - "\x93\xf0\x8e\xf2\xfd\xe5\xfa\x37\x1b\xab\x39\x96\xd7\xde\x5e\xcf" - "\x10\xd5\x57\xdb\x8e\xe1\x39\x2d\xe2\x79\xad\xbe\x87\xe0\xa1\x6d" - "\x1e\xb9\x0f\xc9\x3e\xbd\xd2\xdf\xd5\x1b\x18\xf0\x95\xd9\x76\x4c" - "\xc3\xe5\x58\x53\x11\xd1\x36\x3e\xc7\x30\x4a\xb4\xa3\x3e\xe8\x3f" - "\x5b\xfd\xda\x1a\x52\xbb\xe4\x2b\xd6\xcd\x5f\x60\x7b\xf1\x6f\xae" - "\x4d\xc8\xc7\x73\x5a\x8e\x9d\x32\x94\xbd\x71\xca\x12\x06\xff\x0c" - "\xb4\x7f\xdb\x1c\x5e\xe3\x8c\x2b\xbf\x5f\x25\x92\x65\x2a\xbc\x53" - "\xa5\x7f\xd5\xa6\xa1\x3e\x5c\x4d\x18\x0b\xfc\x2e\x05\x3c\xc7\x57" - "\x0b\xae\x6c\xeb\xa5\x42\xcf\x6d\x67\xbe\x84\xbd\x6d\x85\x4d\xc3" - "\x7b\x9a\xe9\x83\x9d\xc5\x63\xda\xb8\x37\x3c\x44\xca\x5f\xb4\xae" - "\xb9\xd5\x07\x5d\x12\xe4\x5c\x11\x14\xbd\xb6\x6b\xf8\xcc\x4b\x5d" - "\xb3\x63\x1b\xfb\x7b\xd4\x6d\x89\xf6\xf7\xa8\x6b\xc4\x2f\x00\x0e" - "\x9f\x8d\x1f\xf4\xc8\xba\xe6\x81\x5f\x7d\x63\x8f\xb3\x0e\xf3\xdd" - "\x36\xb9\x16\x71\x69\xe3\xb5\x4e\x7e\x23\xae\x8a\x6d\xb8\xa4\x16" - "\x52\xed\x35\x66\xe0\xd9\x24\x86\x1b\xcb\xb4\xf6\x5a\xf1\x6c\xb1" - "\x39\x30\x07\x27\x81\x26\xa3\xd1\xe6\xe1\x43\x7d\xdc\x5e\xc6\xb7" - "\x3b\xe9\x74\xd4\x39\x44\x86\xc9\xed\xf7\x25\xa1\x1c\x68\x29\xbe" - "\xf3\xf8\x3e\x9d\x9e\x1a\x9d\x78\xbf\xca\xd0\x0d\x18\x4a\x67\x43" - "\x7e\xc0\xd0\xf3\xf7\xd3\x7e\x34\xc7\xc7\x47\x9f\x22\x1f\xec\x77" - "\x93\x7e\xc6\xb1\xc7\x59\xbf\xef\x50\xa1\xda\xcb\xe0\xb2\xfe\x88" - "\xb2\x7c\x36\x3e\xaa\xfc\xf0\x88\xbe\x1b\x8d\xb6\x24\x7d\xec\x53" - "\x7d\xe7\xcd\xd0\x70\x49\x95\xb8\x24\x79\x7d\x27\xa8\xee\x43\x85" - "\x4f\xfd\x8e\xc1\xc6\x58\xe9\x58\xe8\xa8\x90\xc8\x93\x95\xed\x3a" - "\xcd\x3d\xc6\x4f\xee\xda\x30\xf4\x96\x53\xe9\x19\xa5\xc2\x75\x82" - "\xb6\xaf\x6d\x0b\x74\x5d\xa2\xcc\xdc\x2e\xe3\x54\x89\xde\x32\x72" - "\x97\xdc\x22\xbf\x51\x7b\x9a\x5e\xdb\xed\xf6\xc9\x58\xcf\x7c\x2f" - "\x7d\x78\xd9\x17\x83\xe7\x37\x8e\x7d\xa6\xaf\x13\x84\x91\xb7\x8e" - "\xd3\x91\xe6\xf6\xfb\x64\x8c\xb5\x01\x5f\x6a\xaf\x55\x8d\xb5\xd7" - "\xf2\xe5\xf9\x6d\xc6\x37\xf8\x43\x17\xe3\x8c\x31\x66\xe5\x36\x38" - "\x60\xc3\xba\x83\x3d\x2e\x1e\x2b\xb6\x95\xbc\xee\xf9\xda\xdd\xe0" - "\x47\x11\xae\xf0\x5a\x2f\xad\x0d\xaf\xc9\x18\xc1\x8e\xa0\x38\xed" - "\x4b\xf2\x5a\x59\xaf\xaa\x2a\x1d\x62\x9a\x51\x2b\x5c\xdd\xc9\xa7" - "\xd2\x7b\x9c\xaf\xe5\x1d\xb2\xab\x3e\xbb\x44\xb8\x79\x7a\xdb\xeb" - "\xb4\xb6\x83\x5e\x92\x67\x27\x6f\x51\x31\xe5\x90\xa7\x76\xf0\xb9" - "\xec\x94\x85\xe7\x32\xf6\xf3\xd4\x68\xe1\xed\x9f\x33\x2e\x0d\x8f" - "\xc1\x63\x63\x0f\xd4\xd1\xa7\xea\xf8\x75\xd6\xff\xac\x8e\x5f\x67" - "\x5d\xac\x0e\xc8\x8c\xab\x4f\xd2\xaf\x8f\x5e\xba\xfd\xfb\x6b\x69" - "\xff\x86\xcb\x4f\x59\x95\x2c\xdd\x31\x27\x04\x1b\x34\x98\x62\xcc" - "\x90\xdf\x93\x31\x50\x99\xdb\x13\xa4\x60\x79\x0b\xb5\xda\x7b\xc9" - "\xb5\xf2\xcf\xd4\x49\xbf\x91\xf1\x5f\x5b\x21\x7f\x60\x2b\x97\xf5" - "\x6d\x3c\x55\xd6\x67\xf8\xf5\x04\xa6\xf7\x36\x8e\xdf\x17\xc1\x67" - "\x6d\xfe\x3f\x93\x3b\x97\xd7\x8a\xdb\x79\x8d\xbe\x0c\x72\x23\x23" - "\x0c\x99\x01\x3b\x23\x24\xe9\x01\x1d\x4c\xd9\x8c\x67\xd3\xa4\xcd" - "\xe8\x93\xe7\xf2\x86\x43\x77\x4f\x11\xce\xc5\x1b\x78\x1d\x3f\xd4" - "\x97\x6d\xeb\x71\x52\x16\xc7\xd2\xe3\x35\x74\x61\x3a\x50\x32\x2f" - "\x98\x28\xa4\x4d\x08\xfb\x85\x63\xea\xb9\xfd\x1e\x0a\xc1\x16\xa8" - "\x3d\x4f\xa9\xb5\xd0\x9f\x21\xcb\xa5\xbc\xaf\xd7\x62\xea\x6d\x3a" - "\x3f\x10\x53\xaf\x8e\xd7\xab\x3a\x70\x7f\x9e\x8c\xa1\x8a\xb3\x69" - "\x5b\xcf\xd3\xb8\x6d\x2b\x29\x6d\x2b\xaf\x47\x7e\xa1\xf4\x37\xd6" - "\x37\x64\x7c\xbd\x65\x69\xbc\x37\x31\xa0\xbf\xad\xe2\xb8\x9f\xfd" - "\xf2\xcc\x28\xd7\x71\x2e\x89\xde\x3b\xe4\x37\x02\x82\xe5\xde\xa9" - "\xc1\x94\xa1\xbe\xbe\x8d\xa7\x91\xf6\x9b\xd9\x7d\x86\xd7\x0e\xc7" - "\xeb\x5b\xdd\xd7\xaa\x26\x22\x26\xe2\xa1\x71\x4a\xee\x03\xd6\xe0" - "\x71\xd9\xb6\x66\xd3\x64\x2f\xa5\x2b\xff\x89\x24\xcc\x95\x3b\xfc" - "\xbc\x9f\x5f\xfa\x34\x59\x43\x5b\x17\x26\x38\x5e\xa3\x44\xfe\x7e" - "\x31\xff\x4a\xbf\x14\x5d\x93\x0b\x29\x9d\xf7\x52\xd8\xc7\xc2\xf6" - "\x9c\xcc\xff\xe1\xb8\x12\x4a\x8f\x84\x3d\x53\x39\x3f\xdd\x61\x9b" - "\xb5\xf4\xf1\x65\x4f\x17\x2d\x2a\x5e\xf2\xd8\x92\xc2\x25\xc5\xab" - "\xef\x90\xc1\x84\xe5\xbf\xfb\xc6\xe7\xcd\x97\x9b\xe0\x11\x7a\xc7" - "\xb8\x81\x35\xc5\xd7\xd7\x86\x78\x0d\xe4\x92\xe8\xf5\xfa\x4c\x6d" - "\x5f\xd1\xb7\x4d\xee\xb3\xbd\x5e\xed\x49\xf8\x43\xa6\x5a\xdb\x38" - "\x4d\x9b\x54\x3c\x94\x2e\xd7\x75\x21\x86\x2f\xf3\x86\x2b\x8d\xed" - "\xe0\xe5\x69\xc7\x69\xe7\x42\xde\xdf\x41\x7f\x99\xdc\x25\x27\x09" - "\x3a\xca\x34\xde\x37\x6a\xe5\x35\x19\xa9\xc3\xff\x56\x9d\x61\x38" - "\x2d\x63\x03\xed\x38\x8e\x67\xf6\x55\x0f\x8b\xec\xad\xa1\x65\xd6" - "\x1d\xe1\x65\xd6\xdf\x0a\x91\xfd\x6a\xf8\x4c\xc1\x56\x71\xa6\xe0" - "\xd5\x81\x73\xfd\xbf\xbd\x22\xe8\xa4\x44\xfc\xc0\x0b\xbb\xd3\x23" - "\xf6\x10\xf9\xdd\xed\x0c\xb3\x68\x39\xfb\x72\xfd\x96\xfd\xa3\x61" - "\xfb\xef\x9e\xec\x73\x14\x24\xce\xee\x04\xcf\xab\x7a\xf3\xdd\x1b" - "\x4e\x90\xda\x37\xfe\x6d\x9e\x4b\xae\x73\xff\x36\xc4\xe5\x78\x9f" - "\x91\xf5\x7e\x19\x3f\xd4\xf0\xba\xf4\xe5\x63\x9d\x7f\xdb\x48\xb2" - "\x54\x8f\xa4\x94\x1e\xe7\x6f\xfb\xfd\xbf\x84\x49\xcd\xad\x3c\xbf" - "\x71\xbc\x5b\xc8\x98\x1e\x9e\x2b\x19\x0f\xe6\x4b\xc0\xe4\xf3\x59" - "\xa9\xea\xdc\xcf\x6f\x0f\x43\x8f\xdc\x79\xe9\x32\xf6\xb7\x72\x4d" - "\x5e\x18\x1c\x62\x72\x25\xe5\xca\xfd\x61\xe5\xa7\x68\xc4\x38\x2c" - "\x52\xed\xd9\x79\x9b\xdc\xdb\x5f\x79\x6a\x3b\xc6\x49\x59\x7d\x2f" - "\xa5\x84\xcb\x0f\x14\xb3\x3e\xd3\x5a\x22\xf7\xd5\x4d\x28\xb7\x8f" - "\xf7\xdd\xe5\x59\x39\x19\x3f\xf9\xcf\x54\x7f\x8e\x8c\x9d\xf4\xbb" - "\x4c\xde\x1f\x18\xa0\xed\xef\x5e\xe1\x7d\x21\xb1\xf1\xcd\x9d\xe6" - "\x12\x43\x39\xc3\x08\x9f\x3f\x3d\x55\x2f\x87\x39\x7c\x18\x97\x3b" - "\x4e\xbf\x5b\x2b\xcb\x71\x5e\xf9\xed\x3d\xcb\x42\xcc\x5b\x53\x39" - "\x7f\x10\xcf\x75\x61\x4b\x96\xc0\xf8\x0a\xad\x0c\xed\xc3\xbb\xf9" - "\xe1\xf2\xd3\x26\xa4\x65\xcb\x75\xe9\x3e\x2b\xc9\x18\x1d\xa6\x8f" - "\x03\x6e\xcf\xdf\x5c\x12\x1f\xf6\x57\x2d\x86\x2c\x92\xfa\xdf\xef" - "\x3e\xa9\xfb\x42\xc6\x75\x46\x1f\xee\xcc\xd3\x78\x64\xa7\xc2\x6f" - "\x67\x7e\xf7\xc6\xb7\xbb\xba\x4d\xa7\x4c\x7e\x83\x89\x9a\xac\x01" - "\x96\x81\xed\x4d\xd6\x5e\xd8\x10\x3b\x27\x78\x0c\x6f\x5a\x95\xee" - "\xa1\xca\xf1\xbe\x14\xf4\x52\x6f\xa2\x75\x44\x1f\xde\xcf\xd6\xfd" - "\x3b\xf8\x7b\xd5\xbc\x2f\xe5\xa1\xdf\x8d\x63\xba\x81\xcf\x5b\xe4" - "\xde\xc4\xfa\x87\xbb\xd0\x9e\xa1\xec\x83\xc7\x74\xe6\xf3\x07\x66" - "\xdc\x8b\x95\x62\xaa\x39\x98\x61\xa8\x97\x67\x0d\xe5\x19\xf6\x29" - "\x5a\x9c\x91\x74\x2d\xee\xc8\x04\x7e\x56\x67\xe0\x77\xee\xd7\xcf" - "\x9c\x73\x6c\x15\xed\xbc\x98\xf4\xeb\x93\x31\x47\xce\xaa\xbd\x5d" - "\xf6\xeb\xe3\x35\x4d\xf6\x93\xe7\xfd\x57\x94\xf3\x46\xf8\xc6\x27" - "\xe0\x39\xa8\xc7\x1a\xe9\x71\xbe\x61\xea\xf7\x17\x42\xdb\xbb\xcb" - "\x4f\x91\x3f\xc5\xd8\xee\x2f\xf7\x62\xfe\x7e\x63\x1c\x64\x51\xe1" - "\x45\x6c\x27\x23\x9f\x3d\xe4\xf8\x12\xe1\xe4\x03\xb5\x1c\x63\x82" - "\x63\x59\x29\xff\xf6\x37\x9e\xd7\xce\x74\x27\x9e\xa6\x37\xee\x1e" - "\xd8\x07\x0d\x69\x6b\x77\x6f\x34\x28\xbd\xeb\x8d\x06\xb9\x76\xb7" - "\xd1\xeb\xf9\xcd\x9a\x80\x61\xdf\x1a\x8f\xa1\x4e\x9e\xef\x7a\x03" - "\xb4\xdb\x5b\xa8\xfb\xc8\x20\x5f\x2e\xc3\x8a\x3f\x4f\x1e\xca\x56" - "\x30\xdf\x94\x31\x4a\x07\xec\x9b\x37\xd5\x77\x8f\xd6\x8f\xce\x0d" - "\xf3\x9c\x97\xdc\x62\x91\xbe\x25\x45\x67\x79\x0d\x6f\xa8\xb2\xb5" - "\x54\x1e\xcd\x2f\xf3\xf2\x93\xd1\xcf\x23\xf9\x59\xd1\xec\xcd\x74" - "\x7d\x3f\x60\xb3\x21\xec\x31\x27\x90\x70\x6c\x17\x7e\x8e\x61\x06" - "\x7d\xca\xe7\xc6\x1c\x8a\x3a\x04\xe4\xc3\x30\x94\xc9\x67\xda\xab" - "\x31\xf4\xa6\xfc\xbe\x47\xd8\x79\x97\x70\xb0\x1e\xe9\x63\xdf\x96" - "\xb3\x84\x7c\x97\x21\xdf\x2f\x9a\x4b\xbc\xec\x3b\x53\xc0\xb1\xc1" - "\x3a\xb5\xba\x7d\x49\x87\xb2\xaf\x4f\xa1\x5c\xd4\xb9\xc3\x43\x25" - "\x25\x97\x3e\xb6\xdf\x1c\x54\x97\x1d\x68\xd7\xae\xd4\x81\x3e\xf9" - "\xab\xd6\x27\xbb\x52\xbf\x6e\x0f\x59\xd3\x49\xae\x38\x49\xbb\x87" - "\xb0\xdd\x8c\xfb\x6b\x4f\x52\x83\xdc\xa3\x54\xbe\xc8\x0d\x7f\xd2" - "\xee\x51\x47\xc3\x5b\xda\xfd\x55\xb8\x7f\x45\xbb\x1f\x8d\xfb\x75" - "\xda\x3d\xe8\xdd\xb0\x44\xbb\x4f\xc5\xfd\xfd\xda\x3d\xc6\x67\xc3" - "\xed\xda\xfd\x28\xdc\x8f\xd5\xee\xaf\xc4\x7d\x92\xb6\xf7\x66\x02" - "\xbe\xe7\x2e\x5d\x2f\xda\xe5\x52\xfb\x3b\xbc\xaf\xf6\xfa\x04\x35" - "\xa6\xfb\xd3\x52\x61\x5f\xce\xd7\xd7\xd7\x91\xde\xc8\xf5\x20\x7d" - "\x02\xf8\x2f\x3d\x22\x7d\xa7\x96\x3f\x13\x7a\x56\x75\x44\x7a\xad" - "\x96\xbe\x10\xf9\x1b\x23\xd2\xab\xb5\xf4\x62\x0f\xd5\x1c\x8d\x48" - "\xdf\xa0\xa5\x57\xea\x7b\xda\x5a\xba\x5d\x4b\x47\xff\x57\x6e\x88" - "\x48\xd7\xe2\x09\x36\x1c\x44\x1f\x77\x46\xa4\xe7\x4a\x9e\x95\x71" - "\xe1\xcc\xa2\xa9\x64\x0a\xc6\x7c\x83\xc7\x43\x2f\x96\x44\xe4\x99" - "\xaf\x95\x0d\x78\xe8\x17\x3b\x22\xd2\x67\xaa\xf4\xdd\xb8\xff\x74" - "\x67\x44\xfa\xb4\xc1\x78\x28\x61\x0b\xe5\x0e\xb6\xce\xc5\xdf\xf7" - "\x90\x7e\x71\xd2\x27\x72\xcf\x1c\x3e\x23\x63\xde\x26\x8e\xdb\x4a" - "\x85\x38\x4e\x7b\xa6\x68\xbe\x62\x79\xec\x1f\xc4\x67\x8a\x3a\x69" - "\xcf\xd5\xf2\xfc\x09\xc7\x45\xe3\x73\x46\x6b\xf8\x9c\xd1\x6e\x19" - "\xe7\x75\xb2\xbd\x4c\xc5\x4c\x53\xfe\x86\x5e\x69\x2b\x69\x7b\x61" - "\xc8\xc3\xdf\x0f\x25\x86\xc3\xeb\x2c\xee\xe2\x5e\xe9\x17\xc7\xba" - "\x2a\xa7\xb1\xcd\x20\xcf\xa4\x44\xe8\xac\x6a\x3c\xee\x99\x13\xe6" - "\xf3\xc0\x4e\x65\x57\x55\xa9\x58\x7c\x5e\xf6\xe3\x88\xcc\xeb\xa1" - "\x3d\xb3\xf9\x9a\x68\x35\x1f\xeb\x71\xee\x99\x30\x70\xae\x62\xf7" - "\x06\x2d\xdd\x83\xf4\xcc\x88\xf4\x0b\x62\xfb\x0e\xc8\xa7\x37\x5d" - "\xc2\xf4\xa6\xaf\xef\xbc\xf0\x07\xcf\x8b\xc0\xe6\xff\x04\xde\x8b" - "\xe5\x79\x83\x6b\x42\xe5\xbb\x48\x3b\x5b\x7f\x2c\xb8\x52\xf8\xa0" - "\xa7\x71\xac\xee\x6f\xcd\x85\x5d\x37\xb7\xa8\x47\x6c\x7a\x8c\xfd" - "\xba\xce\xc9\x38\x33\x0e\x2f\xc7\x05\x65\x3f\x1f\x3f\xef\x21\xa4" - "\xb4\x41\xf6\xd4\x2d\xe6\xf7\x9f\xd1\x9c\x02\xe8\x3f\x05\x21\xaa" - "\x03\xec\x6d\x8f\xe9\x3e\x45\x7b\x3a\xfb\x7d\xe7\x80\x03\xd7\xe7" - "\x90\xb1\xf6\xf7\x4a\x3d\x9f\xbf\x21\x24\x36\x0d\x23\xf1\x47\xd6" - "\x2b\xbc\x36\xf3\x3a\xb2\x41\xe6\xda\x70\x6f\x91\x3f\x7e\x87\xf4" - "\xc1\xda\xa4\xc6\xe9\x5e\xf5\x5d\xcf\xf2\x5d\x45\x4a\x16\xec\x5d" - "\x28\x7e\xcd\xe7\x2d\xf6\xe6\xa2\x6c\x07\xec\xc2\xb8\xfb\xb8\x6b" - "\xb7\x91\xa1\x6f\x23\xe6\x8c\xd3\x8d\x06\x25\x7b\xf6\xcd\x0e\x1b" - "\x4c\xeb\x78\x3d\x47\xc6\xdb\xde\x78\xa0\xa1\x61\x69\xc0\xd0\xba" - "\xa6\x93\x9e\xbb\x92\xac\x0b\x03\xec\x17\xbc\xb7\x75\x44\x31\xc7" - "\xf8\xf1\x7a\xa0\x0f\x18\x7e\x8f\xf7\xef\x2f\x6d\x34\x04\xe5\x3c" - "\xb2\x6f\xb6\x5c\x03\x28\x3f\xb0\x81\xf7\x10\xdc\x1d\x21\xd6\x65" - "\x52\xa0\xcb\x14\x8b\x15\x69\xa6\xd0\xaa\x82\x91\xc1\x15\x05\xdf" - "\xda\xb6\x9c\x52\x42\x2b\xd2\x52\x5f\x3a\x4f\x53\xf5\x38\xde\xb0" - "\x11\xd2\x45\x8f\x35\xb9\x6a\x25\x4d\x60\x1b\x62\x44\x82\x45\xee" - "\xcb\xf0\x7d\xd8\xf0\xab\xae\xba\x95\x17\xff\x66\x40\x08\xb6\x03" - "\xc7\xfb\x65\x5c\xe2\xb5\xb5\xf2\x55\xd8\x23\xda\x59\xbc\xd2\xcf" - "\x69\x14\xf4\x0f\xc3\x88\x73\xc2\x75\xb2\x90\x0c\x1c\x6f\xbd\x34" - "\x5f\xda\xe9\x43\x5a\x0b\x82\xe4\xb6\x7f\x4a\xa5\xcb\xb9\x8f\xf6" - "\xbd\xc6\xf3\x27\xfb\xe9\x21\xbf\xe5\x24\xed\x7b\xcb\x1c\x20\x03" - "\x7e\x09\xae\x27\x59\xe7\xde\xf7\x21\xeb\xfd\x1e\x7a\xcb\xc4\xbe" - "\xc2\xae\xe5\xf7\x70\xda\x31\xc7\xe7\x72\x1f\xbd\x40\x9d\xd7\xdb" - "\x77\x90\x9f\x1d\x7c\x36\x30\xd9\x55\xbd\xa7\x37\x30\x44\xd9\x82" - "\xfb\xde\x53\x7d\xe6\x6d\x47\x9f\x8d\x01\xec\x41\xd7\x85\xc3\xe5" - "\x7b\x79\x0f\xf6\x5a\x77\x6d\x90\xe6\xfa\x85\x47\xee\x79\xf1\x99" - "\x68\xfb\x5d\x2e\x71\xbe\x9a\xd4\x79\xa0\xb7\xd6\x85\x2b\xf6\x5a" - "\xd8\x27\x00\xf7\xf2\x5c\x9b\x5c\x53\xaa\xd8\x6b\x53\xeb\x30\x7b" - "\xd3\xd5\x9a\xd2\xde\x8c\xf5\xa3\xd9\x5f\xf5\xad\xb2\xee\xa4\xbd" - "\x59\xb8\xce\xef\x4e\x6e\x6e\x1f\x7c\xae\x69\xc8\xb0\x5d\x43\xa9" - "\xbc\x96\xc9\xbe\xa7\xf5\xca\xe7\x14\x75\xbc\xbd\x41\x54\xc8\x77" - "\xd7\x1e\x2f\xa2\x44\x5e\xff\x41\xbd\x9f\x4c\xae\x25\x1b\x70\x1d" - "\x2e\x4c\x7b\x7c\xd2\x0f\xa8\x7c\x2f\xb9\xbd\xc2\xc5\x7e\x68\x6a" - "\xcd\xf9\xed\x6a\x91\xb4\xc7\xa7\xf2\xbf\x3d\xb6\xcd\x8b\x36\x98" - "\xf6\xb8\xdc\x81\x53\xda\x5c\xfd\x36\x78\x7f\x8f\x4b\x94\xef\x69" - "\x57\x67\x6c\xdf\x7e\x46\x97\xab\x8a\x47\xdf\xce\x57\x74\x6b\xc8" - "\x50\x74\x7b\xbb\x5a\x9b\x97\xae\xe5\x7b\xe8\x09\xe9\x6a\x3f\xf7" - "\xed\x85\xba\xee\xe2\xd1\xf2\x70\x19\xdc\x67\x28\x59\xfb\x76\x09" - "\xda\xae\xed\x03\xbf\x6d\xe3\x34\xb4\x0f\x73\xd3\x5b\x8d\xdc\xae" - "\xc1\x64\xab\xa4\x45\x09\x25\x02\x67\x4f\x58\xc5\x58\xf5\xbb\xfd" - "\x77\xb9\xd4\x37\xc0\xf6\x5f\x29\xcf\x20\xa2\x1e\xf4\x8f\x81\xe5" - "\x26\xc7\x3a\x60\x78\x11\xf8\x87\x74\x5c\xb8\x3e\x7e\x87\xb6\xba" - "\xb8\x3f\xc3\x68\x33\xe7\xe1\x7e\x85\xbd\x9e\xc8\xf6\xb7\x6b\x25" - "\xfb\x94\xec\x4f\x63\x9a\x28\x9a\xed\x97\xfb\x3e\x55\xfd\xfd\xf0" - "\xfb\xaf\xa2\xe9\xa1\x9e\xc3\x26\xc8\x86\xe5\xec\x5b\xb0\x3f\x4d" - "\xa3\x9f\x57\xd5\xff\xfb\xbf\x68\x36\x14\xde\xfd\x7e\x53\x44\xd9" - "\xab\xfb\xf3\xaa\xef\xcd\x19\x78\x9f\x8e\xd7\x42\x15\xbf\xfe\xbe" - "\x31\xa2\x5c\x63\xce\x97\x19\xc4\xf1\xf8\xf9\xfb\x60\x4c\xf3\x1e" - "\xe7\xef\x5b\x06\xe8\xad\xe0\xc4\xa9\xe3\x1a\xbd\x0e\x0f\xfd\xbe" - "\x52\xc7\x13\xf7\xb9\xaa\x4f\xf6\x5b\x06\xfa\xe4\xf7\xe9\x7a\x39" - "\xf6\xeb\x46\x1f\x1d\xe5\xb3\x5f\x71\xe5\x20\xaf\xb9\x8f\x81\x0c" - "\x0e\xde\xe5\x92\xfc\x48\xfb\xcb\xd9\x7f\x12\x74\xf5\x28\x1e\xda" - "\x5f\xa8\xe6\xc2\xfd\xf2\x4c\x3b\xaf\x67\x37\x05\x98\x47\xf6\x97" - "\x01\x6e\xad\x86\x73\x8d\x86\x43\x0d\x70\xa8\x1c\xf4\xdc\x4c\xff" - "\xd9\xb5\xfd\x07\x23\xce\xeb\x95\x28\xda\xbe\xc3\x67\x65\xf7\x6f" - "\x56\xb6\x43\xe3\x66\xf4\x8f\xe3\x1c\x8d\xe6\x98\xfa\xa5\x45\xe2" - "\x64\x5b\x11\xec\x19\xd3\x81\xc3\x90\x0d\x2d\xa5\xe7\x28\x99\xf7" - "\xe0\x59\xb6\xb0\xaf\x9f\x48\x42\x7a\xc5\x81\x96\x81\xb3\x4a\x7f" - "\xb0\xf2\xd9\xbf\x4d\x1c\x33\xe9\x14\x8d\x56\x7b\xea\xef\xdc\xcb" - "\x36\xb4\x70\xc0\x6e\x2e\x3f\xd0\xce\x67\xd7\xda\xa0\x95\x0b\x47" - "\xc1\xab\xe1\x8a\x03\xed\x80\xeb\x71\x3c\x4d\x23\x79\x2e\x63\x5b" - "\x5c\xf1\xc7\x3b\x01\xc0\xf5\x70\xdc\x26\xd8\xde\x09\xc2\x74\x70" - "\x5c\xd8\x74\x68\x3e\xc3\xe5\xba\xc1\x53\x86\xe3\xf4\xce\x2f\x45" - "\xd2\xc1\x71\xfc\x6d\x2f\xb6\xb5\xdd\x01\xe0\x59\x71\x70\x1c\xde" - "\x8d\xc0\xbb\x43\xb8\x86\x39\x86\x13\xc7\xa0\x05\x7c\x2b\xc3\x17" - "\xe5\x07\xc7\x29\xdc\x7d\x32\xef\x71\xfa\xc3\x95\x9c\x47\x8f\x0d" - "\x15\x76\x64\x27\xf2\x7b\x6e\x43\x08\xe5\xdc\x76\xe0\x29\xcb\x74" - "\xc8\x32\x1e\x6e\x1f\xca\x69\x7e\x1b\x36\xb5\xe7\xf6\x07\x8b\xbe" - "\x77\xe4\xa1\x77\xf2\x18\xe7\xf8\xf1\x43\xff\x30\x35\x3a\x96\xc7" - "\x3f\xf3\x59\x51\x4e\xcf\xd2\xe3\x6f\xe0\x1e\xe3\x7f\xbf\x3a\x3f" - "\x1f\x11\x4b\x67\x73\x44\x5c\x2e\x87\x4f\xfc\x17\xe3\x02\x3e\x4d" - "\x04\xbd\x77\x8a\x8a\x43\xf3\xd5\x39\x8b\x3f\xc8\x31\x84\x36\xb1" - "\xdd\x6c\x56\xe7\x82\xff\xf0\x2f\x1a\x3f\xe6\xce\x0b\x05\xcd\x1e" - "\xd4\x89\xb1\x9b\x3b\xf0\xfc\x87\x7d\xe0\x4f\x0b\xf2\x7d\xa1\xe2" - "\x56\xfd\x61\x67\x74\x7e\xf9\xbe\x2c\xe6\x39\x23\xe6\xd9\xe6\x47" - "\xdf\x0c\xb6\x47\xb6\x69\xb4\x5c\x17\xd8\x30\x62\x1d\x15\x39\xbe" - "\xa0\x44\xf4\xd5\xe7\x8c\x5b\x5b\x97\x97\xdb\x64\x16\xce\x74\x72" - "\x77\x05\x95\xae\x82\x39\xe2\xf8\x38\xe4\xf9\x82\x46\xb1\xcf\x29" - "\xc7\x02\x47\xfe\x93\x2a\x6e\x69\xe3\x2f\x16\x3e\x9b\x4c\xe1\x27" - "\xb2\xbf\x25\x0c\xff\x34\x13\xf3\x81\x69\x77\xaf\x67\x08\xaf\x4b" - "\x97\xbe\x42\x63\x38\xfe\x05\x78\xb3\x93\xbf\x13\xc3\xdf\xed\xfd" - "\x4d\x6f\xd7\x10\x77\xf0\x53\x2a\x7a\x92\x0c\x27\xa9\x71\x83\xb1" - "\x84\x8c\x55\x27\x88\xf7\x03\x83\x4d\xc1\xa9\xa4\x9f\xeb\xad\x1d" - "\xa9\xce\x47\xc2\x2e\xf7\xad\xb0\x8a\x40\x8f\xf3\x9f\xa1\xff\xbe" - "\x9a\xad\xf9\xf0\xf8\x2b\x55\xbc\x6f\x23\xea\x9f\x63\xd0\xce\x30" - "\x2b\xda\x36\x5e\xad\xce\x69\x8c\xfc\x4e\x8f\xb3\x31\x75\x40\x9f" - "\x6b\xdc\xae\x68\x78\xc8\xae\xc6\x57\xe3\xf6\x26\x58\xfe\x1b\xd4" - "\x5e\x63\x2a\xf2\x66\xf4\xef\x35\x4a\xfb\xb4\x71\x3b\xfa\xd0\xae" - "\x74\xbd\x43\xf6\x9c\x90\x49\x1b\x03\x9c\xfe\xa6\x8b\xcb\xa2\x9c" - "\xd9\x2f\x6d\xc9\xc6\x92\x01\x5e\x6b\xe4\xef\xa5\x27\xa0\x4d\x29" - "\xe8\xd7\x46\x6e\x17\xd3\x04\xf9\x8c\x78\x3e\xd8\xb4\x63\x90\xf8" - "\x85\xa6\x5d\x45\x41\xa7\xdc\x37\xeb\x00\x3f\x9d\x42\x1f\x5c\xce" - "\xf1\x4a\xdc\xa8\xa7\xb5\xae\x97\x5a\xad\xdd\xd4\x96\xc7\x67\x4a" - "\xa0\x2f\x3f\xf9\x5f\xd4\x69\x8b\x2f\xbf\x20\x03\x7d\xd0\xdd\x88" - "\x61\x41\x4e\x74\xb1\xcf\x88\xbb\x04\xf2\xcc\xc7\xdf\xa7\x21\x09" - "\xa3\x35\xdc\x45\xad\x76\xe8\xed\x95\xc3\xa8\xad\xee\x53\x6a\xb3" - "\xfe\xbb\xac\x87\x75\x0c\xd7\xf2\xee\x8b\xc0\xde\xc5\x3e\x45\x36" - "\x0d\xb6\x17\xb0\x53\x07\x85\x5d\xee\xb5\x5d\x1a\xec\x4b\xc0\xbb" - "\xdc\x6b\xb9\x14\xd8\x90\x65\xc5\x6e\xab\x3a\x97\x52\x7a\x25\x0d" - "\x0f\x9d\xe7\xf8\x74\xd7\x0a\xe5\x83\xf7\xee\xb3\xf2\xec\x8a\x53" - "\xfa\x38\x16\xc9\x33\x2c\xa7\x49\xfa\x51\xa9\x73\x2b\x9f\x13\xef" - "\x6b\xf6\x38\xdf\xcd\x1d\xd0\xbd\xfb\xd7\x95\x21\x63\xde\xdd\xa0" - "\x7c\xad\x0e\x14\x29\xbe\x7a\xf7\x76\x86\x15\x1f\x8f\x83\x65\xca" - "\x67\xef\xdd\xf7\x74\x5b\xbd\x3b\xe9\x60\x99\x06\xcb\x16\xbb\xdf" - "\xa8\x7f\x18\x2e\xdf\x5e\xac\x7f\x63\xae\x58\x3b\xbe\xf6\x40\xfe" - "\xe3\xf9\x4b\x56\xe6\xe7\xd9\xe6\x3f\xbb\x7c\xe9\xc4\x65\x8b\x17" - "\xdb\xe6\xe4\xaf\x58\xb1\xe8\x89\xfc\x64\x9a\xbf\x7c\xd1\xd2\x15" - "\x4b\x8a\x97\x2c\x5b\x6a\xb3\x65\xde\x9a\x53\xb0\xac\x78\xe2\x9d" - "\x99\xe9\x31\xe7\x9d\xf8\xac\xd3\x51\xd6\xe9\x1c\x6b\x31\x3e\x43" - "\x74\x19\xc7\x9e\x30\xaf\x16\xae\xe7\x60\x4f\x80\xff\x4e\xf2\xba" - "\x3a\xc6\xed\x31\xd6\x35\x39\xd6\x15\xe6\xcd\x96\xad\x2f\x8b\xf6" - "\x13\xd4\x72\x0e\x7a\x0a\x7f\x9f\x94\xe3\x36\x1d\x85\x8d\xe7\x53" - "\xdf\x41\x6a\xf9\x84\x63\x32\xfd\x1c\x69\xbe\xa4\x43\xf6\xaa\xff" - "\x24\x23\xe6\x1e\xe8\xb9\x98\x4b\x0c\xc3\x44\xe5\x28\xd1\x2c\xfe" - "\xcb\x4a\x5a\x4c\x59\x83\xdb\x13\xe0\xfd\x37\xd3\xbc\xa0\x43\xb0" - "\x3c\x55\x63\xeb\xc0\x27\x8a\x2e\x7b\x35\x5f\xc6\x96\xb7\x58\x27" - "\x5e\x2f\xbf\x53\x75\x00\xe3\x7f\x5f\xf6\x80\x9c\x6e\x0e\x6a\xba" - "\x48\x07\xe8\xbe\xea\x38\x9e\xd5\x19\xfb\x83\x29\xd1\x7b\xae\xef" - "\x79\x89\xfe\x64\x53\x3f\x2e\xf3\xa7\x0c\xf5\xe3\xfb\xc8\x5f\x4b" - "\x8d\xfa\xc5\xa6\xff\xbd\x3f\xbd\xfe\xff\x69\xf9\x0f\xf7\x5f\xfc" - "\xf7\x4d\xea\x97\xed\xfe\xbf\xd8\xfe\xbf\xa7\xfc\x87\x07\x2f\xf6" - "\x63\x7e\x03\x6f\x1d\xfd\xf9\x7f\x92\x09\xfc\x59\x03\xfb\xda\xe8" - "\xf8\x8c\xac\x25\x41\xd1\xe9\x78\x84\xc6\x94\x7e\x41\xfc\x9d\xa0" - "\xae\x62\xbb\xe8\x2c\x3d\xcf\x7a\xcf\x87\x9b\xc0\xbf\x8d\x9b\x8f" - "\x53\xca\xa6\xe3\x64\x69\x2b\xe6\xef\x05\x72\x7c\x1a\xc8\x19\x60" - "\xea\xc6\x73\xcb\xca\x00\xfd\x9b\xef\x4b\xf6\x53\x70\xb5\x41\x9b" - "\x6c\x3d\xfa\x7f\xd8\x7b\xff\xb8\xa8\xab\x7c\x7f\xfc\xcc\x9b\x51" - "\x47\x1d\x60\x34\x34\x34\xb4\xc9\xac\x9d\x5c\x2b\x6a\xad\xf5\xee" - "\x5a\xcb\xa6\x7d\xaf\xdb\xd5\x60\xcd\xae\x6c\x59\x62\x62\x8b\x1b" - "\x2a\x21\x11\x9a\x02\x8e\x86\x03\x0e\x88\xae\xed\xc5\x02\xa4\xbb" - "\xee\x5e\xda\x6b\xc5\xee\xda\x5d\x4a\xaa\x41\xb1\xd0\x80\xa1\x16" - "\x0b\x0b\xb7\x89\xd0\xc8\x45\x9b\x60\x94\x11\x66\xde\xe7\xf3\x7a" - "\x9d\xf3\x7e\x33\x33\xc0\xc0\xcc\x80\x66\xdf\xf5\x8f\xf7\xe3\x3d" - "\xef\xf3\x3e\x73\xde\xe7\xbc\x5e\xcf\xf3\x7a\xbd\xce\xaf\xd7\x0b" - "\x63\x2d\xd2\x2a\x75\x1c\x09\x2b\x9c\x48\x2b\xa8\xfe\xc9\x14\x2a" - "\x3c\x19\x0f\x69\x0d\xaf\x8b\x51\x23\x5e\xdf\x50\x3d\x02\x63\x2a" - "\x35\x93\x77\x76\x4a\xd8\x74\xf2\x73\x0c\x55\xcc\x3e\x87\x7e\xd2" - "\xc0\xfd\x20\x1e\x59\xcf\xf5\xf9\x91\x5f\x48\xf3\x17\xf0\xbb\x8a" - "\xcd\xb5\x41\x3b\xca\x31\xae\x1a\x96\xf9\x9a\x58\xce\xe2\xaa\xbd" - "\xbe\x21\x6a\xc4\xc6\xe5\x44\xa8\xb3\x9c\x21\x87\x41\x0e\x62\x8c" - "\x2e\xe8\x77\xfb\xa1\x9f\x95\x15\x4d\xa4\xf9\x50\x3f\x63\xf1\x44" - "\x6a\x80\x3a\x95\x76\xea\xdf\x05\x3b\xa8\xdc\x26\xcd\xaf\x9a\xa0" - "\x5f\xec\xcf\x85\x3c\xd1\xcf\x90\xeb\x73\x21\x5f\x1e\xe4\x43\x5b" - "\x8c\xd7\xef\xd0\x11\xa0\xc1\x01\xf8\x66\xbd\xf6\x71\x7c\x36\xb1" - "\x79\x28\xfc\x36\xb4\x43\xdb\x4c\x4c\x31\xa0\xdb\x94\xf8\x0d\xf9" - "\xbb\x50\x3e\xc8\xbf\x37\xf7\xb3\x39\x71\x48\xe7\xe5\xbc\xcb\x63" - "\xba\x1b\x0e\xe2\x7c\x8e\xbc\x4f\xdc\x9a\xbb\x01\x74\x7a\x17\xf3" - "\xd5\xb6\x1b\xc7\xef\x68\x63\x30\xbb\x02\xc6\xf1\x7c\xbc\x09\xb6" - "\x45\x02\xc8\x01\xb0\x27\xd8\xfe\x4b\xb0\x25\xa0\x2e\xbb\x31\xf6" - "\x1c\xbe\x87\x71\xc0\x01\xd0\xcb\x65\x68\x07\x3c\x7e\xfe\x01\x82" - "\x67\xb7\xc0\x1e\x50\xae\x5b\x4a\xed\xdc\x47\xfe\xbb\x6d\xb2\x2d" - "\x80\x32\x08\xf5\x7f\x2e\x8c\xe9\xbb\x81\x87\x80\x81\x6a\xb0\x2d" - "\xc6\x81\x96\xd4\x49\xb4\xaf\x66\x3a\x3f\x95\xf9\x16\x0d\xe2\x32" - "\xda\x74\x17\xb4\x4f\x0d\xdf\xa8\xb6\x90\x5a\x26\x27\xb8\x8c\x31" - "\xcd\x93\xf5\x38\x8e\xa1\x2c\x50\x06\x05\x59\x26\xbd\x83\xf6\xff" - "\x2d\x5c\xfe\xa6\x85\xbc\x6b\x93\x68\x56\x03\x34\xc3\x32\xd9\x79" - "\x5a\xb0\xb9\xd2\x38\x6d\x4c\x68\x1f\x84\x49\xff\x2d\x94\xcb\xc5" - "\x71\x9e\x08\x76\x05\xd2\x0b\xe9\x04\xdf\x20\x92\x1c\x6b\xe0\xf6" - "\xcb\xa1\x57\xa5\x75\xb4\x7c\xe0\xf5\x56\x17\xfd\x4d\x16\x77\xfa" - "\xc3\xff\xb7\x4a\xbc\xfc\x95\x1b\xef\xc0\xfe\x3e\x14\x89\xf3\x6e" - "\x50\xc7\x0a\x3e\x67\x50\x39\x09\xfd\xfb\xa0\x0f\x51\xa0\x71\x85" - "\x11\xfd\x55\x82\x6c\xde\xf2\x0f\x22\xc5\x3c\x3c\x34\x89\xdb\xa7" - "\x95\xe5\x3c\x2e\x58\x25\x9b\xab\x6b\x81\x7a\xf1\x98\x60\x95\x52" - "\x4c\xb0\xca\xcd\xee\x71\x0e\x5d\x31\x0e\x2b\xd3\x5c\x7b\xa0\x4d" - "\xfb\xf8\x78\xcc\xb4\x0f\xe7\x54\x58\xfe\xee\x04\xac\x5b\x13\xf6" - "\x4b\xb9\xad\x18\xef\x10\xd2\x71\xae\xaf\x09\xf9\x26\xa7\xa3\xaf" - "\x4b\xe0\x93\x1a\xea\x34\x4e\xaa\x53\x1b\x3c\xab\xe0\xdb\x6c\x4e" - "\x0a\x63\x1f\xee\xc0\xff\xa4\xbb\xfe\x83\xfd\x06\x30\x1c\x0a\xff" - "\x19\x0d\x77\x2a\xe7\xe5\x31\x11\x2b\xf3\x7f\xdb\x85\x73\x2a\x95" - "\xa5\x72\x4c\x44\x8c\x87\x88\x32\x23\xf7\x71\x0f\xda\x23\x6d\xf6" - "\x03\xaf\x18\xee\x0e\x3b\xca\x81\xde\x87\xc0\xfe\x7f\x35\x8a\xb7" - "\xab\x32\x5f\xaa\x9f\x89\xfb\x4e\x7f\xab\xba\x78\x97\x7c\x96\xfb" - "\x50\x5a\xcf\x3a\x5f\x8f\x6d\x59\x99\x8f\x98\x84\xb2\x6a\x90\xff" - "\x68\x27\x42\xbe\x92\x1e\x6c\xb1\xf3\x8a\x87\xd0\x8f\x52\x9a\x54" - "\x7f\xc4\x8b\x42\xa2\x5d\xb5\x7b\xbf\x73\xef\xe7\x50\x46\x0b\xf4" - "\xf1\x1e\x0c\xc8\xfd\x5a\x92\x39\x93\xa4\x39\xa0\x46\xf4\x35\x09" - "\xe5\x9a\xd0\x06\xe7\x7a\xf5\x70\xdb\xe1\x26\x07\xce\xc9\x36\xc0" - "\x33\xf4\xef\xc3\xd5\x1d\x63\xaa\x5a\xb7\x32\xb9\x71\x18\xc6\x3f" - "\xb7\xb0\xf9\x63\xa4\x8b\xdc\x5f\x77\x00\x7d\x30\x9e\x20\xeb\xb3" - "\x69\x2d\xa4\xce\xde\x46\xa4\xfd\xc5\xd0\x67\x4f\xe1\x1c\xe7\x19" - "\xc0\x90\x0a\xfb\x2f\xf0\x77\x3f\xfa\x45\x05\x3a\xd6\x6f\xfd\x1d" - "\xeb\xb7\x6a\xec\xb7\xdd\x78\x06\x1d\xbe\x53\x15\x17\x45\x0e\xa7" - "\x99\x58\x3f\x46\xdf\x02\x2f\x01\xed\x30\xfe\x20\x7c\xfb\x80\xbc" - "\x2f\x12\x31\x82\xbe\x04\x38\x4e\xde\x75\x60\x5f\x96\x68\xa7\x84" - "\x7c\x4d\x72\xdf\x73\xf1\x9f\xe7\xe9\xd5\xdf\x42\x79\x7f\xab\x52" - "\xcb\xb4\x76\xb0\x7e\x5c\x59\xea\x80\x7e\xec\x4e\x53\xa4\x27\xd2" - "\x15\xf2\x42\xfb\xdf\x8c\x91\x69\xea\x46\xcf\x57\x24\x9e\xd7\xf3" - "\x39\x8b\xaa\x44\x69\x3e\xa3\x87\x86\x12\xfe\x1a\xb0\x4f\x6d\xc1" - "\xb6\x83\x6e\xc0\xef\x23\x46\x5e\x92\x64\x56\x95\x15\x31\x52\x05" - "\xfd\x7f\x41\xa3\x4b\x76\x54\xee\x67\x63\x16\xe0\x13\xe7\x4f\xd5" - "\x71\x76\x5e\xbf\x1f\xd9\x01\x38\xd9\xed\x92\x4f\x55\x2d\x32\x1d" - "\x64\x4c\xca\xfd\x1e\x74\xca\x1d\x9e\xf2\xe7\xc8\x04\x28\x63\x3c" - "\xca\x37\x97\x0d\x75\x64\xba\xa7\x7c\x3b\xa2\x46\xf9\x86\xb8\x4e" - "\x4a\xc5\x39\x1b\xae\xaf\x2c\xe4\x9d\x03\x9e\x32\xe9\x9d\x57\xf8" - "\x1a\x20\xb7\xb9\x10\x5b\x49\x8f\xf3\xfc\xa8\xc3\x20\x3f\xdb\x97" - "\x2c\xe9\x3c\xf4\x7f\x85\x69\x25\x12\xbd\x9a\x20\x7f\x15\x9e\xd5" - "\xc2\xb3\xde\x63\x9b\xf8\x58\x0f\xe4\x74\x05\xfa\x99\x85\x7c\x71" - "\x75\x60\xe7\x77\x67\x71\xd9\x2d\xcb\x0a\xba\x22\x76\xec\xb3\xad" - "\x64\x74\xd2\xbd\xf4\xcb\xd3\xe4\xbd\x9f\x43\x9f\xb1\xa3\xdf\x33" - "\x28\x5b\x7b\x9a\x1c\x1d\x0d\xdf\x0d\x93\xee\xe1\xa7\x49\xf5\xb7" - "\x70\x9f\x04\xf7\x13\x70\xbf\x0e\xee\x95\x90\x5f\x94\xf2\x47\xc2" - "\xf3\x2b\x90\xfe\x23\xe9\x0e\x75\x7c\x6f\x36\xdc\x63\x24\xdb\x11" - "\xd3\x37\xe1\x33\xdc\x57\x4b\x3c\xaf\xe1\x3c\x7f\x0f\xf7\x5c\x61" - "\x1f\x6d\x34\x37\xb1\xb2\x92\x20\xcf\xad\x58\x36\x9e\xa1\x3c\x4d" - "\xde\xff\xc2\xcd\x06\x85\x72\xde\x0f\x86\xfb\x2c\xf8\xdf\x87\x70" - "\x4f\x81\xfb\x1f\x24\x1a\xd4\xa3\x6c\x88\x4f\x43\xda\x56\x99\xb4" - "\xdc\xde\x8d\x91\xfb\x3c\xea\x61\x97\xec\x30\x91\xf8\xa5\x9c\xdf" - "\x90\x97\xe1\x00\xf2\xfe\x1c\xf3\xc2\x7d\xae\x74\x8f\x92\xee\xf7" - "\x4b\xf7\x7f\x97\xee\xf3\xa4\xfb\x7c\x0b\x79\xaf\x54\xb2\x31\x80" - "\x2e\xef\x95\xb2\xfd\x0d\x86\x83\xd2\xda\xf8\xfb\xd5\x38\x46\x06" - "\x39\x8e\x7a\x30\xa8\x53\xff\xfe\x1c\x79\xbe\x0d\xe7\x69\xbb\xf5" - "\x6f\x7d\xf9\x12\xf3\xdb\xf0\xfe\x62\x37\xd9\x36\x5f\xad\x88\x22" - "\x60\x03\x4d\x28\x14\x40\xff\xf3\x72\x10\xc7\x6c\x0d\x51\xf2\x61" - "\x1d\x84\xbe\xa2\xd8\x78\x28\x58\x89\xeb\x35\x4d\x6c\x2e\x12\x7d" - "\x24\x8d\xae\x5c\x00\x57\x2c\x8c\x0d\x96\xca\xf2\x1b\xc7\x3d\x92" - "\xaf\xab\x89\xf0\x2d\x93\x6b\xac\xfe\x7e\x12\x5f\x93\x99\x00\x7d" - "\xff\xfd\x46\xb7\xf4\x99\x58\x67\xa0\x67\x23\xb4\x67\x56\x33\xa9" - "\x46\x3a\xde\xd9\xc2\xdb\x1c\x29\xb7\x59\xe2\x47\x92\x4c\xdf\x16" - "\xf2\x5e\x19\xc8\xc2\x64\xc4\x70\x73\x8f\x9c\x7d\x8f\x9d\x41\x92" - "\x30\x02\xbc\x7c\x6f\x15\xf2\xd4\xd5\x7f\x3c\x64\x50\x58\xa7\xbe" - "\x3a\xce\x53\xa6\x98\xe2\x50\xa6\x20\x36\x40\x7e\x23\xaf\xa3\x7a" - "\xf5\x3f\x35\xf6\x3f\xde\xef\xaa\x0b\x3d\xff\x7b\x44\xed\xe0\xfd" - "\xae\x11\x70\x06\xf8\x7c\x0f\xfd\xf4\x81\x9e\xaa\xde\x28\xf5\xe9" - "\x46\xe8\xd3\x77\x41\xba\x8a\xd7\x95\xa7\x4b\xdf\x02\x9c\xbd\x87" - "\xed\xbe\x4e\x4e\x97\xda\x0b\xe5\x1c\xb1\x23\xbf\xe5\x74\xa9\x7c" - "\xc0\xe3\x11\x2b\xf6\x13\x39\x5d\x6a\x13\xd8\x51\x47\x67\xc9\xf2" - "\xc4\xc8\xf0\x76\xb8\x42\xfe\x1f\xf2\x0d\xfd\xda\xf0\x39\xe3\xa3" - "\x5a\xe8\xab\x25\xa8\x1f\xb6\x3c\x4e\xd4\xcf\x16\x90\x60\xde\x2f" - "\x8f\x6a\x3d\x65\xe4\x07\x6f\x52\x7d\xa8\x83\xaa\x2a\xe7\xd5\x3a" - "\x66\xc9\xf6\x6a\x21\x7c\xa7\x50\x8e\xbf\xe9\xf2\x87\x7d\xf4\x43" - "\x8c\x5b\xee\x56\x17\x93\x5c\x17\x97\x7e\xe6\x3c\xc0\xba\x61\x59" - "\x5b\xc0\x5e\xb7\x81\x5c\xe0\x72\xfb\xa8\x55\x8e\x4b\x9c\x27\xe9" - "\x2d\x16\x1b\x37\x95\xc7\xc6\x45\xdd\x88\x6b\xf9\x22\xce\x63\xa5" - "\x39\x49\x5d\x12\x8c\xe5\xd3\x4e\x91\x65\xeb\xc7\xa0\xef\x88\x58" - "\xa8\x6b\x11\xd4\x6d\x9f\x44\x23\xe8\x37\x1f\x6c\x96\x68\x89\xf2" - "\x6a\x1f\xca\xf0\x2d\xe9\x3c\x96\x05\xce\xdd\x60\x7f\xf8\x2d\xea" - "\xad\x70\x6a\xaf\x2a\xc4\xbe\x71\x2c\x49\xb6\x41\xa1\x7e\x25\xdc" - "\x06\x3c\x7c\x92\xf9\x32\x31\x54\xce\xe3\x73\x7f\x1f\x8c\xe3\x6d" - "\x3d\x66\xe7\xeb\xa4\xcc\x1f\x1c\x3e\xb7\x04\x85\x87\x25\xf3\xfd" - "\x16\x6f\x89\xc5\xac\xaf\x1d\x33\xf5\xf2\x17\x25\x40\x5a\x83\xec" - "\xef\xd2\x65\x2f\x72\x9a\xc0\x3b\xab\xab\x5f\x1c\xdb\x8f\x65\x41" - "\x99\x9b\x3a\xf5\x1f\xa8\x5c\xe9\x87\x9b\xa4\x39\xaf\xf9\x21\x9b" - "\xa3\x70\x1f\xc9\x04\xf4\x11\xcb\xeb\xf0\x41\x02\xab\x13\x9b\xf7" - "\x80\xfe\x29\xf5\x61\xa4\x35\xea\x6d\xd6\x8f\xa1\x0f\x63\x5f\xee" - "\xce\xae\x5c\x00\x17\xef\xbb\x5c\x3f\xdb\x59\xdf\x65\xfd\xf6\x83" - "\x34\xd7\xf7\x3e\x88\x64\x73\x5f\xc8\xd3\xe7\xc2\xd5\xf0\x6e\xb7" - "\x85\xbc\xa5\x92\xea\x38\x47\xaa\xcb\x3c\x78\x5f\xc8\xf7\x6a\x1c" - "\xbb\x95\xdb\x42\xc7\x66\x22\xbe\xcc\x80\x19\xb8\x17\xf0\xb8\x81" - "\x1f\xd4\xcb\x98\x81\xfe\x14\x7f\x9a\xd4\x2c\xdf\x3d\x91\x16\x00" - "\x6f\x0a\xa0\x0f\x24\xc2\xf3\x42\xb8\xc7\xf3\xbb\x42\x83\x77\x09" - "\xdb\x05\x9d\xfa\x1a\xb5\x1c\xdf\x15\xdb\x63\x1b\xdd\x16\x83\xf8" - "\xc8\x83\xba\x23\x46\xd8\x7a\x62\x12\x8f\x9b\x8c\xf8\x40\x6c\x84" - "\x6e\x7e\x80\xe1\x83\x9d\x55\x86\x74\x56\x27\xc0\x07\x94\x15\x2b" - "\xfb\x9a\x84\xf6\x39\xf8\xbc\x7e\x4d\xa2\xfb\xde\x36\x28\x53\x5b" - "\xa5\x85\x71\x8d\x61\x7f\x54\xca\x0d\x64\x42\x95\x96\xf9\x94\xfb" - "\xdc\xec\xb8\x9f\xe0\x7f\x70\x5d\x86\xcb\xb9\x09\x4b\xe0\xbf\xa5" - "\x2e\x7a\x99\xd8\x5a\xc5\xe1\xa5\x6c\x2e\xf1\x1a\x78\x57\xe5\x3e" - "\x4e\xb0\x90\x83\xf5\x38\x56\xc0\x3d\x38\x37\x86\x11\x2d\xe0\x10" - "\xe4\x50\x4d\xab\x6c\x97\xde\x1e\x86\xeb\xbb\x07\xf1\x2c\x24\x8e" - "\x81\x81\x5e\x07\x13\x60\x2c\xd8\xef\xfe\x44\xc0\xc7\x2c\x9c\xab" - "\x91\xe2\x40\x34\xe1\x3c\x14\xfa\xcd\x3e\x4d\xea\xd7\xd7\xa2\x1f" - "\x81\xb5\x7d\x7d\x8b\xa6\xa7\xd1\xf3\xe8\x5f\x54\x9b\x4c\xae\x69" - "\x26\xf5\x4b\x71\xde\x27\xe3\x5b\x9c\x63\xa9\x4d\xf2\x9c\x63\xa9" - "\x35\x49\x57\x03\x21\x75\xb3\xdd\xae\x6a\xe9\x3e\x6f\x90\xcb\x22" - "\xe5\x85\x11\x78\x9d\x5d\xa2\xd5\x7f\x75\xea\x6b\x7b\xfc\x1f\x22" - "\xa6\xb0\xaf\xe2\xba\x3e\xce\x19\x29\x1c\x04\xfd\x16\x00\xbf\xa0" - "\xde\x5b\x66\x2c\x32\x6d\x40\x3c\xd5\x8d\x60\xb6\xbf\xe0\xef\xb9" - "\xaa\x3a\xb6\x0e\xc6\x7d\xec\xd5\x56\xc3\xb7\xff\x07\x63\xc3\x27" - "\x25\x93\x29\x38\x7f\x1d\xea\xa4\x26\x1c\xa3\x22\x36\xf6\xb2\xf8" - "\x0b\x75\x47\x53\x36\x11\x01\xde\x5f\x0f\xbf\xcb\x65\x3b\x07\xfe" - "\xa3\x09\xb2\x93\x30\xb4\x6f\xe6\x6e\x22\xd7\x77\xea\xeb\x76\xcb" - "\xbc\x42\x1b\x00\xe7\xd1\xa4\xb9\x00\xa8\x6b\x2d\x5b\x3b\x43\xdf" - "\xc8\x16\x46\x37\x26\x47\xb1\x0c\xc0\x6e\x5d\x66\x90\x8d\x68\xb8" - "\xee\xa8\x03\xfd\x77\x50\xb2\xf9\xea\x0a\xa1\x0f\x34\xb8\xd5\xf3" - "\x84\xeb\xf7\xc4\x49\xf8\xff\x50\x1b\xda\x57\xde\xe8\x63\xbe\x49" - "\xa6\x0f\xee\x2b\x0b\x05\x3b\x9f\xf1\xdb\x41\xdb\xa0\x6e\x35\x49" - "\x1b\x88\xea\x0c\xa9\xbf\x69\xef\xef\xd8\x79\x97\x6a\x3e\xbf\x5e" - "\x3f\x49\x1e\x47\xf3\x7a\x9b\x4f\x85\x6e\x0e\x62\x31\xb5\x31\xc6" - "\x27\x8b\xa3\xfd\x4d\x38\xb3\xbd\xcd\x8e\x39\xc4\x94\xfe\x13\xcc" - "\x73\x5c\x96\xa5\x1d\x19\xe1\xe4\x70\xf8\x1c\xe8\xcf\xe6\x12\xe8" - "\x33\xfb\xfd\xdf\xfb\x64\x96\xe6\xed\xf9\x19\x29\x7c\xc6\xf3\x4c" - "\xcc\xbf\x3c\x5b\x27\x35\x3f\x8d\xba\x61\xab\x14\x9f\x19\x75\x6e" - "\xa7\xbe\xbe\xc7\xfe\xe7\x71\xa9\xcd\x49\xbc\x0c\x5c\x1f\x34\x27" - "\xe2\x39\x72\x36\x0e\xe0\xf9\xd5\x7c\x0e\xbf\xbe\x67\xfe\x1f\xf3" - "\xe1\xff\xf8\xfe\x24\xf3\xbc\x65\x4e\x05\xd0\xd8\x3c\x0f\xdb\xca" - "\xb1\x39\x11\x78\x5b\x9f\xe4\xea\xc7\x75\x6c\x9f\xd0\xe1\x36\xf7" - "\x7e\x5a\x9f\xef\x1a\x3f\xd6\xce\xba\x75\x37\xe9\x77\xdf\x45\x52" - "\x08\xd1\xfc\x53\x45\x1e\xda\xb1\x83\x96\xe4\x0b\xe2\x7d\x5b\xf2" - "\x88\x5a\x61\x04\x32\x62\xbf\x4b\x8d\x9b\x70\x9a\x7c\x38\x2e\x54" - "\x7d\x6d\xcc\xdc\x94\x51\x34\x3d\x9c\x08\xb9\xed\xa3\x54\x37\xd8" - "\xaf\x2d\xa1\x41\x33\x16\x2d\x4c\xb1\x13\xed\x6f\xf2\xc9\x57\x89" - "\x24\x68\x2e\x58\xee\x37\xaa\x09\xd4\xe9\xef\x11\x78\xee\xec\xb0" - "\x1a\xed\x89\xbf\x47\x60\x99\x1b\x0b\x89\x6a\x63\x0b\x6d\x35\x3e" - "\x39\x42\x05\xb2\x5d\xf3\x12\x60\x6e\xac\xfa\xda\x92\x6e\x28\xa3" - "\x32\x8e\xfd\xaf\xcc\xff\xba\x25\x4d\x84\xba\xbd\xea\x5f\xdd\x1a" - "\x2a\x5c\x75\x6b\xa8\x18\xe6\xba\x69\x5c\x75\x4b\x80\xba\x7d\xf4" - "\x0b\xff\xea\xf6\xf1\x52\x57\xdd\x3e\x5e\xea\x63\xdd\xf6\xfb\x5f" - "\xb7\xb4\x6b\xa1\x6e\xa7\xfc\xab\xdb\x27\x0e\x57\xdd\x3e\x71\x0c" - "\xa5\x6e\x38\x36\x4f\x8f\xa0\xa7\x98\xaf\xe3\x64\xa2\xc6\xbd\x5d" - "\xa7\x49\xc3\xfd\xe9\x85\xec\x79\x3c\xfc\x56\x48\xfd\xdd\x9a\x61" - "\xa3\x5f\x72\x3b\xe6\xef\xab\x6f\x4b\xc2\x3d\xcd\x7f\x8f\x07\x2c" - "\xab\x39\xa6\x1b\x98\xad\x9d\x61\xa5\xd2\x5e\xc3\xbf\xe7\x16\xb3" - "\xfd\x0a\x47\x24\xfb\xe2\xef\xf5\x1d\x63\x2a\x33\x71\xaf\x80\x08" - "\xfd\x9b\x8e\xa9\x34\x62\x5c\xb7\xd7\x93\xad\x02\xd5\xa3\x1f\x22" - "\xf4\x95\xa4\x24\x34\xa7\xb2\xf0\xf5\x64\xbb\x80\x7e\x03\xb6\xb0" - "\x73\x78\x7f\xaf\x96\xcf\x98\xc8\xdf\xb0\x8e\x3e\x92\x0f\xe9\x16" - "\x8b\x14\x6b\x91\x0a\x60\x9b\x8c\xae\xdc\x8a\xe5\x43\xba\x5d\x8e" - "\x87\x08\x78\x97\x63\xb2\xd8\x42\xed\x03\xc9\xc1\x86\x5b\x65\x39" - "\x38\x37\x85\x84\x62\x3c\xb4\x1d\xe9\xa3\x70\x0d\x11\x6c\xaa\xbf" - "\x57\x20\xdd\xa3\x6d\xa3\x68\xe8\x46\x12\x84\x67\x6b\x70\x0f\x97" - "\x39\xdc\x4a\xa6\x6f\x24\x23\xa2\xd3\xa0\x4c\x3b\x89\x0b\x4d\x83" - "\xf2\x80\xd6\xdc\xd6\x6f\x60\xe7\xe0\x76\x43\x79\xb8\xb7\x35\x28" - "\x85\xa8\xe7\x86\x67\xd0\x2d\x7b\x88\x12\xcf\xe1\xe0\x79\x1a\x7e" - "\x96\x66\xa4\xaa\x53\xdf\x50\x2a\xb7\xcf\x07\xfe\x84\x70\xfe\x1c" - "\x3f\xe5\xe2\xcf\xf1\x97\xfb\xf2\xe7\x78\x30\xe7\xcf\x71\xa5\x8b" - "\x3f\x1f\xcf\xf7\xe4\xcf\xf1\x5b\x3d\xf9\x73\x3c\x29\x30\xfe\x1c" - "\x4f\x70\xf1\x87\x7f\x83\xf3\xe7\x78\x66\xff\xfc\x39\x5e\xe0\xe2" - "\xcf\xf1\x99\xbe\xf1\xe7\x78\xad\x77\xfe\x1c\x5f\x3a\x00\x7f\x46" - "\xf6\xcf\x9f\x8f\xa7\xf8\xce\x9f\x8f\xe7\xfb\xc1\x9f\x60\xce\x9f" - "\x4f\x9e\x77\xf1\xe7\x93\x9f\xf7\xe5\xcf\xc7\xaf\x72\xfe\x7c\xbc" - "\xcf\xc5\x9f\x4f\x5a\x3d\xf9\xf3\x71\xad\x27\x7f\x3e\xd1\x04\xc6" - "\x9f\x4f\x54\x2e\xfe\xf0\x6f\x70\xfe\x7c\xa2\xed\x9f\x3f\x9f\xcc" - "\x76\xf1\xe7\xe3\x1a\xdf\xf8\xf3\xc9\x6a\xef\xfc\xf9\xd8\xe1\x3f" - "\x7f\x3e\x79\xbb\x17\x7f\x34\xde\xf9\xf3\x49\xab\x1f\xfc\x09\xe5" - "\xfc\x39\x71\x93\x8b\x3f\x8d\x5f\xf4\xe5\x4f\xe3\x42\xce\x9f\xc6" - "\x79\x2e\xfe\x9c\x30\x78\xf2\xa7\x71\xb5\x27\x7f\x1a\xcb\x02\xe3" - "\x4f\x63\xa9\x8b\x3f\xfc\x1b\x9c\x3f\x8d\xa6\xfe\xf9\xd3\xd8\xe8" - "\xe2\x4f\x63\xa2\x6f\xfc\x39\x11\xec\x9d\x3f\x8d\x85\x03\xf0\x67" - "\x54\xff\xfc\x39\xf1\x98\xef\xfc\x39\x61\x18\x88\x3f\xfe\xd9\x7e" - "\x27\x98\x5d\x35\x0c\xe5\xb4\x78\x2b\x07\x69\x87\xfb\xd3\x44\xfd" - "\x89\x96\x62\x71\x24\x8b\x25\x05\xbf\x0b\xb5\x1b\xc8\xcf\x9a\xc9" - "\xa7\x77\x14\x8b\x23\x54\x54\x5f\x1c\x27\xea\x4b\xb4\x74\xf3\x48" - "\xa5\xb8\x79\x94\x12\xcf\x46\xf6\x57\x16\xdf\x2f\xf9\xe9\xce\xa0" - "\x49\x64\x2a\x9e\x77\xd9\x02\xf6\x33\xfe\xee\xd4\x7f\x5a\x08\xb6" - "\xa0\x6e\xa0\x73\x17\xb8\x77\xe9\xf0\x56\x1c\xf7\x7e\x5a\xdd\x73" - "\x5e\x5d\x4f\xd3\xd0\x47\x51\xd2\x34\xdc\x63\xff\xa9\x15\xfd\xfa" - "\x52\x43\x85\x2e\x6a\x1a\xfd\x1c\xc7\x22\xa7\xc9\x67\x67\x69\x76" - "\x85\x0e\xf1\x00\xb6\xfb\x35\x67\xc8\x67\xb3\x7b\xf6\x74\xd1\xd8" - "\x17\xa5\x39\xbf\x06\x9e\xf7\xe4\x63\x34\xfb\x60\x03\xc6\xbf\x5b" - "\x97\x8e\x71\xdd\x4e\xde\x0f\xb6\xef\xcd\xf8\x0d\xf4\xbf\xb2\x17" - "\xee\xb8\xef\x85\xef\xdd\xfb\x8c\xf9\xcd\x42\x1f\x6f\x7c\x4f\xff" - "\xc9\x5b\x65\xdc\xc1\x77\xc6\xc0\xf3\x04\xc9\xbe\xc7\xfc\x63\xcf" - "\x90\x26\xa7\xdb\x7b\x35\x3c\x7f\x01\x65\x8f\x93\xde\x07\xc3\xf3" - "\x11\xb4\xb3\xd9\xf9\xfb\xbc\x4c\x69\x8f\x69\x53\x29\xa4\x69\xa4" - "\x3c\xe3\x20\x4f\x2e\xda\xee\x52\x19\xe3\xe1\xf9\x69\x1c\x13\x4b" - "\xef\xc3\xe0\xf9\x61\x5c\x0b\x90\xde\x4f\x80\xe7\x7f\x83\xe7\x1f" - "\xf0\xf3\x0e\xdd\x52\x1f\x6d\x52\x06\x76\x66\xb3\x89\x8d\xff\x78" - "\x9c\x76\x1c\x0b\x34\x2d\x70\xed\xe7\xf9\xac\xad\xd7\xbb\x04\xb7" - "\x77\x4d\xf2\x3b\xbe\xe7\xac\x69\xab\xdb\xbb\x9a\x5e\xef\x4a\xdc" - "\xde\x55\xf4\x2a\xb3\xc2\xed\xdd\xfe\x5e\xff\x6b\x74\x7b\x57\xd0" - "\xeb\x9d\xcd\xed\x9d\x41\x7a\x17\xd4\xa9\x3f\xa9\x76\xad\xc9\x7d" - "\x96\x26\xa5\x0b\x90\xee\x16\xff\xe0\xb3\x04\x29\x1d\xbe\x7f\x72" - "\x8e\x85\xe4\x1f\x90\xd2\x19\xef\x79\xf9\x27\x17\xbb\x95\x3f\x9b" - "\xcf\x7d\x9c\x4c\xe8\xd9\x0b\x37\xa6\xb2\x51\xec\x8e\x7d\x11\xde" - "\x69\x11\x57\xee\xd8\x5e\x93\xaa\x7d\xe2\x99\x5f\x6b\x93\x57\xa6" - "\xe0\x76\x94\xd5\xab\x52\xb4\xab\xd7\xc6\xaf\xf4\xf0\xbb\x1c\x86" - "\x7e\xcb\x30\xae\x0f\xfa\x54\x90\x7c\x84\xb7\xf6\xf8\xc6\x07\xb9" - "\x0a\xdf\x82\xf1\xff\xcf\x98\x0f\xf6\xdd\xdc\x3f\x71\x35\xfa\x64" - "\xe0\xfe\x17\xc8\x03\xcd\xe4\xe4\x09\xc9\xff\x82\xa9\x53\xff\x0f" - "\xe2\xdd\xff\xc2\xe7\x4d\xcc\x47\x1a\xe4\xe3\xfe\x17\x3e\xb7\x40" - "\x3f\x9f\x4b\xc7\x70\x3f\xf9\x3c\xbe\xce\x3f\x64\xdb\xc4\xba\xec" - "\x22\xf3\x33\x96\xc9\xe7\x36\x7a\xfb\x7e\xac\x50\xe1\xff\xa4\xf5" - "\x4f\x95\xdb\xff\x13\xf9\x7b\x59\x3f\x48\xdf\x34\x54\xa0\x7f\xdb" - "\x31\xcd\xf0\xcc\xe6\xe3\xd9\xbb\x7f\x70\x3f\x2e\xd9\x15\x1a\x6c" - "\x13\xb6\xdb\xb3\x6d\xc2\x92\x66\xf2\x8f\x37\xdc\xda\xd6\xe4\xe6" - "\x4f\x4a\x6e\x03\xf7\xd9\xd5\xb7\xad\xec\xbc\x0e\x55\x55\x68\xf0" - "\xdb\x28\xcf\xf8\x5e\x77\x78\xce\xae\x50\xcb\xf5\x71\xab\x9f\x06" - "\xc7\xf9\x50\xbf\x2f\x38\x4d\x40\x7e\x00\x4f\xa5\x36\xbc\x4c\xf5" - "\x27\xb7\xb2\xbd\xdb\x78\x76\x0f\x63\x17\x30\x5d\xf5\x79\xa2\x3c" - "\x57\x89\x3a\x8a\xfb\xc2\xfe\xdc\x65\xff\xa1\x9f\x9f\x6c\x59\x7f" - "\x7d\xee\x66\xff\xf1\x6f\x42\xda\x7e\x77\x0c\xb9\x7d\xef\x04\x7e" - "\x0f\xf2\x2d\xe6\xfb\xc5\x2b\x98\xcc\x80\x67\xe6\x47\x14\xff\x8b" - "\x75\xf4\x16\x0b\xca\x9b\x1f\x36\x17\x1d\x2d\xd3\x65\x3a\xee\x66" - "\xb1\x4a\x2c\xb3\xe4\x79\x3c\x76\x5e\x05\xf2\x60\xdf\x42\xf9\x44" - "\x55\xe7\x48\x95\xf6\x3c\xd4\xc9\x92\xb0\x9b\xfb\x1a\x6b\xbc\x5d" - "\x4d\xe2\x38\x8d\x2d\x4f\xa3\xac\xc7\xbe\xc3\x65\xbe\xa5\x5e\xe2" - "\x7d\x02\x6f\x87\x65\x0f\xa6\xbb\xf6\x69\x5b\xac\x72\x3e\x59\x3e" - "\xf3\x75\x28\xcb\x51\x96\x8f\xc7\xaa\x4c\xe2\xbc\xff\x81\xa6\x99" - "\x58\x9a\xa4\xfc\x6c\xef\x28\xf7\xaf\x61\xb1\xd3\xec\x23\x49\x50" - "\xe7\x56\x0b\x39\x29\xed\x33\xe6\xdf\x85\x7b\x13\xd6\x05\x69\x85" - "\x67\x3f\x69\xae\xb2\x11\xf8\x94\xe0\x2d\x3e\x3a\xdf\xdf\xde\xcc" - "\x7c\x10\x61\x2c\x08\x9c\x83\xe5\x32\xb9\xf9\x19\x7a\x81\x96\xa3" - "\x8f\x4f\xc8\xa3\x96\xf3\x70\x19\xce\xde\xb1\xfd\xc8\x49\xa9\x38" - "\x4f\x24\xbd\x4b\xc5\xf3\x71\x3d\xbf\x47\xba\xfd\x1e\x81\xbf\x69" - "\x2a\x2d\xdb\xb1\x81\xe9\x58\xa5\xeb\xec\x6d\x73\x0a\x3c\xab\x7b" - "\x3d\x87\x79\x3c\xaf\x27\x11\x6c\x5f\xad\x8d\xb6\xb0\xfd\xc7\x52" - "\xba\x54\xf6\x68\x56\x9f\x54\x3a\x1b\x30\x12\x81\x67\x29\xa5\xfe" - "\x18\x81\x67\x30\x43\x1d\x8f\xb1\xf3\x97\x18\xeb\x5d\xba\x47\x4a" - "\xf7\x99\x3c\x4e\x60\xf3\x4c\x57\xac\x5f\x9c\xab\x69\x9e\xe3\x2d" - "\xf6\xb0\x1c\x9b\x59\x8e\x3d\x8c\xe7\x37\xa5\x18\x45\x4b\xe1\x7f" - "\x29\x03\xc5\x79\x86\xf7\xbb\xe5\xb3\x98\x4e\xc3\x41\x93\x68\x38" - "\x8b\x7e\x5f\xaf\x47\x9f\x43\x19\x6d\xe8\xb3\xc1\x46\xcc\xa4\x8b" - "\x98\x53\x3a\x33\x31\x4e\x5d\x1d\x8f\x4f\x17\x82\xfc\xc0\xb3\x40" - "\x68\x43\xd6\x25\x9d\x65\x31\xea\x9e\x6d\x23\x11\x49\xf7\xd2\x16" - "\xa0\x81\xdd\x99\x7d\xd0\x24\xe1\x68\x0f\xe8\xc2\xa9\x67\xc8\x97" - "\x4c\x36\xb3\xb8\xaa\x6d\x6c\x3d\x4b\x75\x9a\x7c\x69\x60\x79\x68" - "\xec\x1e\x4e\xbb\x2f\x99\x7e\xd8\xab\x97\xe3\x90\x7d\x19\x29\xc7" - "\x3a\xb5\x90\x2f\x8d\xe7\x47\xbf\xdf\x0a\x69\xf3\x3c\xf7\x42\x7f" - "\x89\x31\x59\x43\xb1\xee\x90\x87\x60\xd9\x90\xc7\x25\xff\x21\xfd" - "\x59\x07\x99\x0c\xf5\x3a\x2d\x97\x0f\xef\x0d\x16\xf2\x05\xd3\x31" - "\x58\xe6\xf9\xec\x73\x1a\x48\x2b\xb4\x08\x79\x26\xbe\x97\xfa\xcb" - "\x52\x0b\x29\x3c\x30\x90\x2d\x04\x7d\xa1\x04\xfa\x52\xa9\x68\x38" - "\x52\xc0\xfc\x03\x8f\x3e\x52\xc2\xe7\x1e\xbf\x3c\x8f\xfb\xb5\x76" - "\x5c\x20\x4a\x9c\x0b\xe4\x98\x6d\x61\xe7\x0a\x31\x0d\x64\x76\x29" - "\xf4\x11\x36\x67\xe0\x9f\xfe\x6f\xe1\xe7\x20\xda\x89\x2a\x2f\x59" - "\xf6\x6f\xdc\x12\xe3\xe6\x6b\x5d\x3a\x1f\xd1\xb2\xbe\x2e\x8d\xad" - "\x63\xb3\x3a\xf6\xae\x03\xd6\x17\xe8\x64\xf3\x6a\x6b\xaa\x8e\x14" - "\xb0\x35\x97\x9c\xca\xfd\x7c\xef\x69\x4b\x65\x50\xf8\xa4\xe7\xe0" - "\x5b\x15\xf2\x5c\x22\xe6\xc9\xc3\x18\xa0\x50\x7e\x4f\x3b\x93\xd9" - "\x37\x5a\x78\x5f\x6f\xb1\x8b\xd9\x47\x0a\xb0\x0e\x52\xba\xbd\xce" - "\x61\xc7\xb3\xdb\xfd\xfa\xc1\x61\xf1\x9d\x70\xaf\x77\xce\x91\x02" - "\x3c\x5f\x72\xbb\x5d\xae\xf3\x29\x3b\x9e\x6b\xc0\x3a\x73\xda\x9e" - "\x3a\x2b\xd3\x31\xb7\x1d\xca\x4e\xff\x94\xb4\x90\x53\xcf\xe0\x7e" - "\x38\x3c\xa7\x83\x7d\x98\xd3\xe0\xd4\x33\x2c\x5f\x57\x4f\x1e\xe6" - "\xef\x82\xc5\x0c\x81\xf2\x8b\x59\x7c\x21\x68\x03\xf0\xc2\x94\x8e" - "\x67\x76\x4f\xb1\xb1\xdd\x96\x64\xc2\xdb\xcd\xf6\xbf\x9e\x8e\xe0" - "\x58\x39\x75\x40\xd6\x19\x16\x29\x6d\x07\x7e\x3b\xb5\x8b\x9c\x23" - "\xa7\x5e\xc0\x18\xbf\x40\x8f\x52\xf4\x1f\x55\x67\x83\x7e\x92\xd6" - "\x85\x58\x28\xc5\x38\x72\xa0\x53\x76\x73\x3d\x87\x34\x3f\x95\x86" - "\xdf\x47\xda\x02\xef\xac\x40\xd3\xec\x4e\xfd\x69\x8d\x4c\xd3\xbc" - "\x89\x38\xee\x39\x35\x73\x20\x1d\xe1\x84\x3a\xd7\x81\x75\x65\x9a" - "\xfc\x29\xd6\xef\x84\x38\xe6\x48\x01\xee\xb5\x86\xdf\x9b\x24\xd9" - "\xce\x78\xc7\xfb\xd2\xe9\x3f\xc3\x37\x0e\xe0\xbe\x05\x94\x95\xe8" - "\xe3\x08\xd2\x62\x25\xfa\x31\x3f\xf7\xf9\xa9\x9c\x0e\x3c\xff\x57" - "\x6a\x3e\x6f\x3c\xe9\x2d\xa8\x97\xdb\xfa\xcf\x57\xcc\xdf\x4a\xb1" - "\x14\x97\x1b\xde\x55\xb9\xd5\xd9\xc6\xce\x49\xb6\xe3\x9c\xdf\xe9" - "\x44\xfc\x56\x2e\xfa\xf7\x41\x5c\x9c\x71\xc7\xff\xe9\x85\x58\x4f" - "\xdc\xcb\xeb\x1c\x5d\xb9\x1f\xf4\x6e\x19\xd2\x19\xfe\xb3\x15\xfa" - "\x42\xc1\x00\x3a\x91\xc5\x92\xea\xd4\x7f\x35\x5b\xd6\x89\x30\xce" - "\x00\xbd\xd0\x7a\x07\x1b\x7f\x82\x5d\x6d\x16\xd1\xae\x69\x8d\x44" - "\xdc\x80\x9c\x55\x4a\x32\x16\x74\xfd\x57\x89\xf2\x9a\x98\x13\xcf" - "\x43\x9c\x63\xeb\xb8\x36\x39\xde\x12\xf7\xa7\xf5\x55\xbe\xeb\xfc" - "\xc4\x57\x85\x7d\xce\x4f\xe0\xb9\x91\xdf\xb1\x18\x3f\xfb\x51\xa7" - "\xd4\xb6\xb5\xa0\x8e\x60\xff\xc7\x33\x15\xe9\x30\x36\xe7\x67\x4f" - "\x5a\x70\x9e\x9e\xc5\x47\xc0\xba\x70\x9f\xf8\xcd\xec\x37\xe0\x56" - "\x89\x77\x8e\xa5\x56\xd2\x13\xb3\x17\xf8\x8d\x6b\x70\x87\x95\xff" - "\x1f\x31\x4d\x43\x7d\xdd\x7a\x07\xc6\x9f\x85\x3c\xd3\xe5\xd8\xb3" - "\x2c\xd6\x2c\xdf\xaf\xe8\x2d\x76\x8d\x7a\xc7\x6d\x24\x12\x7d\x62" - "\xe0\x39\x2c\x46\x03\xb5\x32\x0d\xfd\xc6\xa2\x0f\x3c\xd3\x06\x8c" - "\xdf\xd0\xfa\xc5\x6f\x27\xb2\xb3\xac\x36\xd3\x6d\xed\xb8\x26\xd1" - "\x76\x7a\x23\xf3\x8b\xa2\x8a\x4e\x73\x50\xfc\x1f\xb3\x2b\x82\x95" - "\xb8\xdf\xaf\x8d\xf9\x4f\xc7\x32\x03\xf6\x81\xda\xba\x5f\xb2\x51" - "\xdb\x40\xee\x5f\x0b\xbc\x62\xeb\x1a\xf0\x7b\xe2\x19\x72\x66\x34" - "\x8f\x87\xc8\xfd\x79\x4b\xfb\xac\x47\xf2\x33\xf2\x40\x33\xe6\x2b" - "\xf4\xeb\x4d\xda\x19\x18\x3b\xf4\xeb\xcd\xcc\xa7\xae\xa1\x22\x4c" - "\xe2\x69\xd8\x0e\x5e\xaf\xd0\x65\x69\x02\xab\x23\xd6\xcf\xbf\xba" - "\x7d\x3d\x5f\x1a\x4f\x8c\xec\xd4\x7f\x6d\x94\xcf\xd6\x73\xbb\x8a" - "\xfb\xda\xe5\xbc\xf8\x5a\x3a\x63\x56\x11\x2e\x7d\x3b\x7c\x18\xbe" - "\x5d\xc5\xcb\x3c\xd8\xc6\xfd\x0d\xb7\x26\x01\x5f\x61\xfc\x70\x26" - "\x4c\x1e\xd7\x48\x67\x83\x66\xf2\xf1\xd6\x99\x99\xae\x71\x4d\x6b" - "\x9f\x73\xbe\xf7\xad\x5d\x9b\xa2\x8d\x5f\xb5\x2e\x69\x79\xca\x8a" - "\x04\xed\xca\xe4\xe4\xb5\xc9\x5a\x74\x96\xe2\xde\x7f\x78\x7c\x93" - "\x33\x51\x52\x3c\xaf\x52\x57\x3c\xaf\x33\x06\xf7\xb8\x73\x16\x72" - "\xc6\x38\x3c\x73\x18\x67\x4a\xbd\x95\x93\x2f\x88\x65\x70\x95\xc3" - "\x65\x82\xab\x1a\xe7\x34\x96\xd9\x49\x14\xe8\x7a\x66\x1f\xca\xbe" - "\xd8\x45\xfd\x19\xf4\x71\x1c\xd5\x4c\xfe\x39\xa2\x58\x54\x12\xe6" - "\x03\x44\x2f\x96\x61\xfe\xbd\xf0\x7f\xb8\x4c\x70\x55\xc3\xc5\xfe" - "\x27\x1e\x62\xe7\xaa\xcb\xdc\xdf\xf1\x7d\x21\x69\x91\x98\x87\x6e" - "\x56\xb2\xf5\x5f\x71\x17\xcf\xd7\xab\x0e\x02\xd5\x7f\x59\x21\xe5" - "\x63\xfa\x35\x64\x33\xd1\xf6\x93\x2f\x88\xea\x3f\x2d\x93\xf2\xb1" - "\xfd\x2e\x72\x7b\xd0\x6f\x39\xe4\x97\xf3\x29\xa9\xbe\x75\x9e\x94" - "\x8f\xc9\x4d\x51\x2f\xf4\xf7\xdd\x11\x54\xff\xbf\x3a\x29\x9f\xc6" - "\xbd\x3c\xb7\x3c\x23\x45\x7d\xfd\x7e\xcc\x23\x6e\x56\x72\xbf\x09" - "\xfa\x33\xa5\x90\xbf\xdf\x79\x1d\xff\xf8\xd4\xd6\xc7\xff\x53\xd2" - "\x8a\x55\x2b\x7f\xb2\x6a\x4d\x2a\x46\xa0\x49\x59\xfb\x4c\x0a\xde" - "\xd7\x2c\x7f\x8a\xdd\xd6\x2e\x7b\x72\x05\xff\x91\x92\x18\x89\x3f" - "\x12\x01\x6f\x78\x8f\x7f\x26\x09\x6f\x2b\xd6\xe2\x63\x5a\xc2\xcc" - "\x67\x56\xc8\xa1\xa8\xdd\x71\xa8\xeb\xd4\xb7\xd9\x01\x1b\xad\x5c" - "\xce\x9e\x55\x5a\xc8\xa7\x4c\x2e\x63\x4c\x8a\x23\x3a\x07\x91\xe7" - "\xb7\x38\xff\xdb\x62\xb8\x6f\xc6\xb3\xe3\x8a\xc5\x51\xaa\xd0\xcd" - "\x49\x2b\x42\x1d\xab\x56\x82\xce\x68\x82\xff\x46\x59\xc8\x8a\xf9" - "\x5c\x36\x56\x4c\x67\x7e\x08\xf5\x6d\xf9\xd2\x9e\x4d\xa5\x68\x38" - "\xd8\x88\xbe\xc0\xe1\x99\xc5\x7c\x15\x41\x1f\x40\x3e\x2d\x3c\x63" - "\xac\xd7\x30\x78\x6f\xc1\xb9\x29\x78\xc6\x18\xaa\x11\xa2\xe1\x35" - "\x2b\x9e\x45\x85\x67\x2d\x3c\x4f\x87\xf2\x4b\xe4\x7e\xd1\xbf\xad" - "\x7c\xd6\x24\xc7\xa1\xe5\x31\x67\xcf\xd6\xf7\xc4\x9c\xc5\x38\x33" - "\xe9\x1a\x16\x97\x86\xdb\x20\x67\x6d\x41\xe1\xd7\x8d\x81\x3c\xb6" - "\x9e\x38\x3c\x6c\xde\xe3\x9c\x52\xde\x2f\xc3\xe7\x35\xce\x85\xb9" - "\xc5\xee\xc5\xe7\xe9\x72\xec\x5e\x9c\xf7\x62\xb1\xd1\xe0\x4e\xf5" - "\xe8\xef\x91\x96\xf6\x3b\xa7\xc7\x62\xea\x9d\xcb\x46\x3f\x9f\xd6" - "\x8c\x78\xc5\x8d\xc5\x38\x97\x06\xcf\xdc\xc7\x1b\x3d\x47\xce\xb1" - "\xfd\xd7\xb2\xff\x27\x77\x9f\x03\xfd\x9e\x73\xfa\x08\x6c\x06\x16" - "\x33\x24\x71\x6d\xa8\x63\xf9\x4a\x6e\x07\x9e\xfb\x9a\xcb\xaf\xca" - "\x7a\x6e\x2f\x9c\x6b\xa0\x8b\x78\x9c\x05\x0b\xf9\x26\x16\xc7\x2c" - "\xa1\x8a\xc4\xb5\x14\xfe\x1b\x9a\xb6\x7c\x25\x4b\x83\x7c\x5b\xc0" - "\x56\x93\xea\xf7\xa6\x39\x02\xcf\x47\x8a\x92\x2f\x85\x73\xe5\x8f" - "\x4f\xc9\xc4\xef\xa8\x98\x1d\xf2\x11\x51\x63\x6c\x3b\xac\x5b\xb1" - "\x9b\x7f\xaa\x1d\x90\x86\x7b\x43\x3b\x16\x11\x35\xfa\xe9\x94\xea" - "\x52\xce\x63\x0d\x7d\x13\x23\xfb\x8a\xb1\x40\x5a\xef\xf6\x2c\x7a" - "\x88\xa1\xf2\xa6\x15\x33\x63\xee\x87\x5f\x33\xa5\xb0\xaa\xee\xd8" - "\x8c\xe8\x18\x73\xb8\xa4\xe3\x8f\x2b\xfe\xc6\x63\x00\x7e\x53\x02" - "\xe5\xb0\xb1\xb6\x88\xe3\x92\xce\xd8\x02\xbe\xb7\xf4\x9b\x13\xe8" - "\x17\x53\xd4\xa3\x3d\x89\xe7\x6b\xbf\x61\xf2\x8b\xaa\x2a\x1b\xf6" - "\x6e\x42\x7f\xb1\x0a\xa0\xf1\x37\x6f\xe3\x3b\xc9\xe7\x8e\xc0\x7c" - "\xd4\x38\x49\x38\x3b\x5f\x0a\x36\x0a\xfa\x97\x39\x4d\xda\xdf\x40" - "\xbb\x03\xe7\x95\x44\xfd\x37\xf1\x88\x5b\xe0\x31\xfa\x9a\xb0\xd1" - "\x31\x07\xab\xe8\xe8\x43\x29\x88\x63\xb4\x75\xcd\x1a\xa4\x99\x15" - "\x75\xce\x5c\xb8\x96\xf0\x78\x16\x8f\xb6\xca\x65\xa2\x5f\x24\xb0" - "\xa1\x9a\xe0\x0e\x63\x17\x6b\xac\x5b\xac\x2e\xe9\x3c\xad\x75\x3d" - "\xfa\x6b\xc2\xb2\xb9\xed\xdc\xfe\x32\xb7\x41\xac\x5b\x2d\x24\x74" - "\x0e\xef\x8b\x56\xb0\x7f\x32\x67\x4a\xbf\xc1\xfe\x99\x59\xd2\xab" - "\x8c\x53\xf2\x9c\x29\xc7\xb4\x15\xe7\x1e\xe6\xc2\xb5\x04\xf2\xd7" - "\xc8\xf1\x9a\xb7\x08\xec\xfc\xe3\xe9\xa0\x70\x3c\x17\x6d\x6d\x91" - "\xd3\x47\x28\xa2\x80\xa6\x56\x9b\xdc\xf7\x3b\xc6\x54\x96\x77\xea" - "\xbf\x55\xca\x73\x2d\x7c\xee\xe5\xdb\x30\xb7\xe7\x2a\x78\x9e\x2e" - "\x3f\xc3\xef\x48\x59\x56\xc0\x6f\x18\xff\x66\xb4\x49\xbf\xe7\x5b" - "\x88\xbe\x54\xfa\xbd\xd8\x22\xe4\xc7\xcb\xf5\x16\xf5\x41\xa1\xbc" - "\xee\xed\x46\x31\xfb\xac\x16\x63\x64\x43\x9e\x34\x0b\x39\xcb\xf6" - "\x75\xa0\x7f\x24\x63\x97\x66\xb1\x79\x2b\xd8\xc4\x4f\x22\x96\xda" - "\x59\xdf\xc8\xdd\xa0\x89\x41\x7b\x12\xfd\x40\x30\x5f\x5a\xe8\x3f" - "\xce\x41\x46\x32\xbf\xe3\xd9\x67\x35\xcc\xdf\xf6\xb3\x3a\xb5\xec" - "\x3b\x0e\xe4\xcc\x46\x2a\x3c\xb9\x15\xfd\xc9\xb1\xf8\x02\x9d\xba" - "\x10\xe6\x43\x4e\xf2\x1d\x57\x94\x4a\xc2\x0a\x45\xee\x3b\x8e\xf9" - "\x88\x18\x09\xe3\x8f\xd4\xfe\xfd\xc7\x51\xfd\xcb\xf5\xb2\xff\x38" - "\x7a\xc1\x69\x87\xdf\xd3\x81\xe7\x4a\xb8\xf3\x67\xf4\x21\xc7\x7d" - "\x07\x2b\xfb\xf5\x27\x27\x80\x3c\x13\xb8\x3f\x39\xff\xf4\x40\x7b" - "\x2c\xc7\x44\x7b\x81\x1c\x3b\xda\x2d\x0d\xec\xf3\x73\x52\xfc\x33" - "\xab\xe4\x1b\xa6\x1d\xe4\x5f\x46\x94\xb4\x47\xd2\x8a\xf3\x62\xbb" - "\xd9\xdc\xd7\x37\x0e\xda\x9d\xb0\xa7\x3f\x59\xd2\x1e\x32\xd2\xda" - "\xce\xf6\x02\x76\x80\xed\xdb\xc1\xf8\xc4\xc7\x88\x1d\xa4\x77\x7f" - "\x7d\x62\xc5\xda\xf8\x95\xcb\x7e\xb3\x3a\x49\xbb\x68\xf1\x5c\x16" - "\x18\x6d\xa6\x76\x55\xca\x4a\xa6\x6a\xb4\x8b\xee\xbf\x2f\x3a\x7a" - "\xf1\xb2\x87\x16\xff\x7c\xf1\xc3\x0f\xdd\xc3\x4f\x18\x2e\x4e\x5e" - "\x8f\xc1\xf5\x52\xd6\x6a\xf1\x4f\x4f\x48\xa1\x6f\x37\xac\x4c\x5e" - "\xdb\xbb\x9f\x87\xb1\xf9\x2b\x81\xcd\xd9\xda\xf0\x37\x9f\x23\xeb" - "\x28\x94\xe7\xae\xb8\x4c\xeb\xc8\x45\xda\xb2\x58\x87\xfa\x8e\x30" - "\xb4\x9b\xa4\x18\xc3\xa8\x4f\x94\xd8\x57\x51\xaf\x40\x5b\xaa\x7b" - "\xe2\xa1\xf6\xcc\x9f\x75\xb4\x09\xf8\x3f\xa9\x8f\xf2\x34\x9b\x82" - "\x4e\x9e\x9c\xc1\xfd\xf0\x77\x38\xe4\x79\x6d\x4c\x93\xeb\xd0\x8c" - "\x79\xf4\x1d\xf7\xbb\x62\x72\xda\xa6\xbb\xe2\xce\x91\x3e\x34\x22" - "\x04\xcd\x94\x11\x60\x83\x8c\x84\x6b\x14\x5e\xf3\x7b\xe4\x76\x2a" - "\x6d\xc4\xb1\x58\xa8\x02\x74\x6b\x5a\x10\x8f\x79\x93\xd5\xc0\xfc" - "\xb3\x47\x3b\x1d\x41\xcb\x9c\x02\xdc\x83\xe8\x32\xa7\x92\x8d\xff" - "\x68\x2a\x6d\x40\x5f\x68\xf0\xbf\x7a\x8c\xed\x04\x38\x36\x44\x3b" - "\xd2\x0d\xd1\x4e\xea\x58\x06\x76\x39\xdc\xbf\xc2\x33\xde\xd1\xce" - "\xaf\x28\x8b\x6b\x01\x79\xf3\xb8\xff\xaf\x6a\x3c\x8f\xfa\x38\x60" - "\xb8\xb8\x9d\xc7\xf5\x8c\x5e\xff\xcd\xe7\xcb\xd6\x5b\x78\x5c\xcf" - "\x73\x3c\x7e\x2d\x8f\xcb\x4b\xd2\xa1\x9c\xa3\xcb\x9c\x41\xda\x68" - "\x67\x37\xe5\xe7\x54\xcf\xab\x06\x8a\xd5\x89\xb2\x73\xdd\x24\x22" - "\xe0\x3c\x8a\xb3\xf8\xa1\x48\xf4\xf5\x95\x61\xa5\x76\xf4\x4d\xf2" - "\x6e\x57\xa3\xa0\x4d\xc5\x38\x48\xe7\x6f\xad\x4b\x8a\xec\xff\x9c" - "\x72\x96\xd9\x46\x73\xb7\x55\xd1\xac\x8f\xaa\x68\xae\x61\x1e\x35" - "\x1c\x2a\x41\x39\x4e\xb3\x8e\xef\x86\x67\x48\x6f\x8c\xa7\xb9\xd9" - "\xf3\x68\xd6\x67\xb3\xe0\x0e\xcf\xff\x50\xd2\xdc\x1c\x78\x2e\xaf" - "\x81\xff\x99\x68\xd6\x9b\xf8\xbf\x28\x9a\xf5\x56\x05\xdc\xe1\xf9" - "\xe0\x01\xc8\x07\xcf\x15\xfb\xe1\x0e\xcf\x6f\xef\x3b\x4d\xce\xdb" - "\xe1\x3f\x90\x66\x69\xe0\xdf\xfa\xb2\x81\x7d\x2b\xeb\x74\x03\xff" - "\xc6\xd7\x0d\xfc\x1b\x6d\x0d\xfc\x1b\xdf\x34\xf0\x6f\xbc\x53\x08" - "\xf9\xab\x69\x96\x49\x0d\xf9\xe6\xd3\xac\xca\x8d\x70\x87\xe7\x43" - "\x6d\x90\x0f\x9e\xab\x96\xc2\x1d\x9e\x8f\x40\x5d\x72\xe0\xf9\xfd" - "\x39\x90\xbf\x86\x66\x55\x97\x41\xbe\x05\x34\xeb\xd8\x74\xb8\xc3" - "\xf3\x07\x05\x90\x0f\x9e\x6b\xa1\x9c\x6c\x78\xae\xcb\x84\xfc\xf0" - "\xdc\x8e\xf5\xa9\xa7\x59\x36\x2c\x37\x86\x66\x5d\xc0\xfc\xf0\xdc" - "\x09\xe5\x65\xc3\xf3\xc5\x14\xb8\xc3\x73\x77\x04\xe4\x87\x67\x07" - "\xb4\x75\x5b\x03\xcd\x12\x93\x20\xdf\x62\x9a\x43\x20\xdd\xd0\x40" - "\x73\x14\xd5\x90\x0f\x9e\x83\x30\x3f\x3c\x8f\xd0\x42\x7e\x78\x1e" - "\x89\x34\x6a\xa4\x39\xa3\x67\x42\xbe\x58\x9a\x33\xd6\x08\x77\x78" - "\x0e\xc6\xfa\xc3\xb3\x66\x01\xdc\xe1\x79\x3c\xd0\x2a\x07\x9e\x27" - "\x40\xfd\xb6\x35\xd1\x9c\x6b\xb1\xfc\xa5\x34\x67\x12\xd2\x07\x9e" - "\x23\x66\x43\x3e\x78\x9e\x0a\xf4\xc8\x86\xe7\x1b\x08\xe4\x5f\xda" - "\x2f\x3f\x73\x6e\x6c\xa4\x9b\x47\x12\x9a\x33\x33\x81\x6e\x1e\x05" - "\xf7\xdb\xc2\xe9\xe6\x11\x3a\x9a\x73\x47\x1a\xa4\xc3\xfd\x36\x2b" - "\x3c\xcf\x94\x9e\xe1\x7e\x7b\x35\x3c\x47\x4a\xcf\x70\x8f\x2c\x81" - "\xe7\x59\xd2\x33\xdc\x7f\xa4\x83\xe7\xd9\x34\x67\x16\x81\x67\xb8" - "\xff\x68\x37\x3c\xcf\x91\x9e\xe1\x7e\x57\x15\xdc\x1d\xd6\x29\x8b" - "\x0c\xd6\xe0\x25\x51\xd6\xe0\xed\x65\x88\x49\x67\xde\x36\x93\x18" - "\x62\x88\x02\x7d\x3a\x32\xe3\x3c\xc6\xce\xb4\x1f\x41\x99\x62\xde" - "\x68\x61\x71\xc3\x24\xdf\x73\x23\x9b\x49\x67\x25\xd8\x3e\xb3\x31" - "\x06\x3a\xb4\xdd\x41\xf5\x23\xda\xa1\xcd\x1b\xa9\x7e\x6c\x33\xdc" - "\xe1\x79\xdc\x47\xd0\x66\x78\xbe\x3b\x07\xee\xf0\xfc\xe8\x7d\xd0" - "\xf6\x8d\x9d\x7a\xbb\xd6\x42\xce\x73\x5f\x60\x7f\x5c\x51\x16\xea" - "\xc8\xa0\xd1\x0e\xd0\x1d\x7b\x76\x25\x85\x3a\xe2\x80\x3e\xc6\x98" - "\x50\xf4\xeb\x5f\xb4\xa8\x9a\x86\x2c\x61\x75\xc2\xd8\x1d\xb4\x7b" - "\xba\xc0\xbf\x3d\x96\x36\x13\xfb\x42\xf4\x31\x4f\x43\xd6\x7a\x7b" - "\xbf\x9a\xbd\x9f\xbc\x2b\x93\xbf\x57\x11\xd7\xfb\x47\xf1\x7d\x6e" - "\x28\xfa\x3f\x9e\xfa\x00\x7b\x6f\xb6\xb5\x4a\xed\x0a\xc2\x77\xaf" - "\x60\x5e\x0b\xb1\xd7\x70\x19\xde\x59\x4f\xf5\x41\xa4\x43\x75\x28" - "\x1f\xea\xde\x04\x75\x0f\x93\xe6\x2d\x1a\xa9\xea\x60\x13\xf7\x95" - "\x71\xa4\xdf\xb8\x08\x38\x36\x15\x8d\xf9\xa5\xb9\x20\x07\x71\xbc" - "\x0b\xfa\x50\xd0\xa6\x4f\x2f\x6f\x26\x5d\xa5\x45\x6c\x1e\x63\xd7" - "\x7c\x2e\x1f\x2f\xae\xee\xce\x39\x54\xa5\xdd\x10\x0a\xdf\xef\x7a" - "\x25\xc3\x4e\xcf\x9b\xd2\xd1\xef\x10\xa6\x1f\x96\xfc\xfe\xb1\x3c" - "\x6d\x7c\x2f\x28\xfb\xdd\xc8\xe7\x97\xbb\x4a\xf1\xbf\xee\xe3\x0b" - "\x67\xd6\xb4\xd9\x62\xc8\xae\x18\xbe\x76\x7e\xf1\xe9\xb7\x45\x8b" - "\x10\x9a\x42\x46\x68\x37\xbc\x0b\xe5\x5f\x2c\xf7\x18\x8b\xf6\xe4" - "\x65\xef\x8a\xde\x81\xbc\x2f\xb1\x79\xa3\x8b\xd5\x3d\x31\x55\xa1" - "\x0d\xdb\x51\x17\x0a\x24\x0a\xf5\x33\xb7\x6d\xbb\xe6\xa3\xaf\x4a" - "\x87\xda\x18\xe9\x30\x2e\x89\x74\x1a\x77\xcd\xa7\x79\xbb\x62\x42" - "\x1c\x0a\xc2\xf7\xe0\x77\x6d\xba\xdd\x8e\xb6\xe4\x31\xcc\x7b\x97" - "\x38\xf2\x87\xf6\xdb\xd2\x88\x60\x4a\xfe\x14\x9f\x9f\xa1\x59\x77" - "\x94\x98\xdb\x1a\x89\x29\x99\x95\x95\x42\xb3\xee\xd9\x2a\x8e\xfc" - "\xf1\xd2\x62\xb4\xc9\xd3\x70\x4e\xed\x23\xa4\xcb\x45\xe0\x0b\xe8" - "\x95\xae\xc5\x3d\xf1\x7e\x81\x96\xb9\x40\x3b\xb4\x97\xd1\x7f\xc5" - "\x32\xa7\x13\xfd\x8b\x19\x2c\x40\x07\xce\xaf\xae\xd9\x18\x2b\x59" - "\xfa\x6e\xae\x38\xe6\x50\x59\xdd\x52\x5c\x27\x54\xa1\xbf\xa6\xf3" - "\xec\xcc\xbb\x03\xe3\xa7\xa1\xee\xe1\x79\xdd\x79\xb7\x7a\x45\xd2" - "\xb2\x0d\x49\x6b\x93\x53\x96\x3d\x93\xf4\x13\x2d\x0c\x12\xb5\x6b" - "\x9f\xd4\xae\x5e\xb9\x7a\x6d\xf2\xfa\xde\xfa\x16\xc6\x4a\x5d\x6d" - "\x80\x13\x16\x4f\xf5\x28\xd8\xea\x7c\xae\xde\x51\x81\xbc\xde\xf3" - "\x3b\xee\xfb\xbe\x53\xdf\xad\x81\xf1\x1c\x5b\xd3\x10\x0b\x76\x25" - "\xd0\xc2\x45\xd5\xd9\xe8\xb7\xe3\x19\xf4\xad\x6e\x25\x66\xd2\xce" - "\x63\x16\xb2\xb8\x5c\x30\x76\x48\xdd\x44\x4d\xa9\xed\xd8\x0f\xe6" - "\xd3\xdc\xed\xb1\xb4\xe8\x21\xcd\xc5\xdc\x25\xa5\xcd\xc4\x51\x72" - "\x31\x77\xfb\x7c\x39\xae\x8a\xd3\xb8\xbd\x54\x54\xe7\x9b\x30\xae" - "\x4a\x37\x0d\x27\xb5\x40\xcb\x2e\xc3\xa1\x42\xd0\x03\x05\x45\x7a" - "\x5a\xee\x84\xb1\x14\xf3\x4d\xf3\xc7\x15\xf9\x4e\xaa\x53\x3a\xf5" - "\x44\x05\xf7\x10\x1a\xb2\xd3\xda\xad\x36\x46\xe1\x7b\x8c\xa7\xe2" - "\xec\xd6\x91\xf4\x06\x2a\x3e\x92\x00\xb8\xd1\x13\xca\x62\x51\x26" - "\x9c\x25\x90\x3e\x46\xcc\xdb\x5e\x7f\x7a\x3e\x11\x30\x2f\xd8\x7b" - "\x64\x29\xfc\xde\xb8\x9c\x04\x43\xbe\xd0\x8d\x47\x21\xbd\x53\x37" - "\xc6\x91\xa1\x53\x75\x65\xe8\xc6\x74\x53\x9d\xda\xdc\x62\x27\xdd" - "\x37\xad\x28\xb9\xd5\x4a\x94\x7b\xc0\x2e\x2c\x12\xa1\x0f\x16\x2e" - "\x2a\x73\x3e\xa7\x1b\xe9\x78\x4e\xa7\xec\xee\xd6\xa9\x1c\xcf\xea" - "\x94\x5d\xcf\xea\x46\x76\x77\xea\x54\xe6\x78\x2b\x39\x66\xfd\x13" - "\xa9\x6b\x69\x65\xf3\xb9\xdd\xc1\x3b\x1d\xdd\xc1\xdb\x9b\xd4\x2d" - "\x24\xec\xb6\x24\xb0\x0b\xf5\x44\xf1\x22\x8c\x01\x00\x13\x6a\xc7" - "\x1f\x56\xe4\xd3\xdc\x9d\x25\x40\xdf\xe7\xef\xbf\x85\x7e\xe3\xcc" - "\x52\xc4\x68\x1f\x00\x79\xb5\x59\x19\x0e\x69\x80\x9f\x60\xd0\x59" - "\x63\x54\x74\xb3\x32\x02\x2e\x90\x31\x8c\x0f\x84\x66\x11\x25\xce" - "\x27\x60\x5e\x9e\x6f\x24\x60\x09\xef\xc2\x3e\x16\xef\x51\xdf\x75" - "\xa0\x88\xd9\x24\x8e\x9e\xf8\xef\x55\xca\xfe\x7d\x83\x40\x9e\xa6" - "\x9e\xb1\xb9\x08\x32\x27\x77\x5b\xbf\x7b\x62\xd9\x79\x12\xfc\x76" - "\xde\x36\x4b\xbe\xd8\xe3\x87\x15\x64\xa6\x73\x04\xf4\x9f\x4c\xf6" - "\xce\x68\x8c\x49\xff\x96\x04\xe1\xbb\xb2\x0b\x76\x01\x9f\xb5\xc9" - "\x0a\x6a\xb6\xd9\x09\xfc\x47\x49\x23\x16\x55\x97\x5d\xb0\x0a\x88" - "\x97\x3a\x48\x83\xff\x4e\xc9\xbf\x20\x95\x5b\xb0\x2b\x29\xe3\x69" - "\xc2\xe2\x0f\x60\xbc\x15\xc4\x51\x7e\x3a\x8c\x2d\x31\x36\x4c\x32" - "\xca\x30\xe7\xaf\xe0\xb7\x0a\xf3\x51\xb5\x31\x46\x84\x32\x00\x4b" - "\xe5\x34\xd8\x38\x5b\xcc\xdd\x6e\x02\xd9\x9a\x49\xa7\x3c\xa4\x13" - "\xf7\xec\x8a\xed\xd4\x3b\xcb\x80\x1e\xd5\xf2\x5c\x45\x5d\xa9\x83" - "\xa0\xff\x26\x7a\x9f\x83\x1c\x49\x39\x8f\xbe\x37\x83\xac\xa3\x0f" - "\x95\x58\x83\xf3\x4b\xad\xc1\x3b\x4b\xc4\xdc\x7c\x2b\x5c\xb6\xa4" - "\x64\x5c\x97\x14\x53\x9c\x7a\xee\x8b\x3a\xfa\x5b\xda\xc9\xf6\xa0" - "\xeb\x71\x7e\x97\xfb\x7f\x63\x3e\xa9\xa5\x58\x34\x2c\xfe\x0c\x8c" - "\x1f\x80\xa7\xd3\x31\x06\x4d\xd1\x05\xc0\xc7\x05\x12\x2e\xc7\x17" - "\x29\x92\xfc\x4e\xe7\xa5\xba\xc6\x0d\xd2\x78\x20\x8c\xc7\x12\xd9" - "\xc3\x7c\xe8\x32\x99\x85\xfe\xe2\x70\x6c\xb0\x4e\x87\x31\xd2\x5d" - "\xfe\xe2\x3a\x75\x02\xd8\x7b\xf5\xcc\xde\x03\xec\xb0\xb8\xf6\xb9" - "\x46\x1d\xc6\x11\x40\xbb\xae\x88\xf9\x3f\x15\x4b\x64\xbb\x0c\xe5" - "\x88\x33\xfb\xd0\x7e\xb8\x4a\x21\xbd\xdc\xa2\x18\x67\x91\x65\x0c" - "\xe8\x9e\x38\x31\xe7\x67\xc6\x4e\x3c\x13\xd5\x9d\xf0\x33\xcc\x0b" - "\x74\xcb\x87\x6f\x05\x39\xbb\x13\xe6\xc0\x75\x0f\x5c\xf7\x3a\x73" - "\x8d\x91\xce\xdc\xed\x31\xce\xdc\x9d\x99\xce\xdc\x25\xf1\x70\x25" - "\xc0\x95\x08\x57\x12\x5c\x29\x70\xa5\xd1\xdc\x25\x1b\xe1\x8e\xef" - "\xb7\xc2\x65\x80\xcb\x08\x57\x3e\x5c\xbb\x9d\x7b\x76\xc5\x89\x80" - "\x4f\xb8\xb4\x70\x45\x38\x73\xf3\x5b\xe1\x2a\xef\xdf\x6f\x49\x9b" - "\x8e\xf9\x46\x1f\xf1\x39\x0d\xc5\x38\xa0\x1b\xcf\xa3\x1f\x41\xdd" - "\x11\x9d\xcd\x4f\x1f\xd1\x34\xd1\xdb\xbc\x08\x96\x0f\xfd\xab\xdb" - "\xcf\xf2\x2a\xbc\xce\xb3\x84\xef\x4a\x70\x44\x3c\xa4\x71\xe8\x49" - "\x26\xf4\x69\x45\x5d\x5c\x0b\x89\xb6\x92\x8c\x9a\x96\x2e\x92\x11" - "\x2f\xf9\x77\xde\x88\x67\x59\x9e\xdc\x8a\x38\x76\xd2\x58\x6d\xb7" - "\x71\x7b\xac\x53\x9d\x9f\x49\xd5\xf9\xe5\xcc\x67\x21\xc8\x1f\x8c" - "\xa7\xd4\x33\x2e\x45\x5c\xc1\xd8\xb4\xb6\xed\x3c\x79\x2e\x9e\x8a" - "\xb5\x09\x60\x9b\x34\x3a\xf1\xfc\xcf\xcb\x88\x31\x79\x6c\xfa\x1f" - "\x4d\x34\x13\xf0\x32\xda\x09\x74\x13\x71\x4c\x0a\xd8\xc2\xf1\xa9" - "\x8c\x2f\xd0\x67\x1a\x39\x06\x0d\x15\x68\x0c\xbc\x53\x62\x8c\x9a" - "\x42\x18\x93\x16\xa6\x92\xe9\x85\xf0\x8e\xc5\x13\x84\x7a\x3f\x98" - "\x14\x4a\xc5\xa7\x74\xa4\xf8\x37\x44\x15\x7c\x96\xc7\xa8\x74\x02" - "\xed\x7b\x7c\x9c\x1b\x97\x94\x2e\x3c\xab\x25\x47\x74\x27\x41\x2f" - "\x95\x81\xfc\x5e\x52\xda\x0d\xb2\x1b\x68\xe9\xf4\x8b\x96\x0a\x85" - "\xea\x52\xd1\xb2\x3b\x62\x51\x19\xa7\x67\x1c\x41\x9a\xf5\xa6\x27" - "\xd2\x78\x43\x0b\xd0\x13\xe8\x6a\x6e\x70\x92\x10\x05\x59\x2e\xd3" - "\xf3\x25\xa0\x27\xd0\x34\x1c\x69\x0a\xf4\x60\x34\xa5\x12\x4d\x8b" - "\xdd\x68\x0a\xf2\x89\xf9\x77\x44\x9a\x8a\x40\xd3\x62\x2f\x34\xed" - "\x19\xdf\x03\x4d\xf7\xfa\x44\xd3\xd2\x21\xd0\x54\x58\xea\x8d\xa6" - "\x0e\xd4\x99\x79\x4b\x4a\x28\xc8\x3c\xb3\xe3\x18\xf3\x55\x0a\xf6" - "\x8e\x0d\xec\x36\xab\xa8\xde\x5e\x0a\x34\x51\xe3\xfa\x3f\xc6\x44" - "\xca\x48\xa3\x5f\x64\x94\xd2\x8b\xce\xbc\x5d\x6c\x4f\x00\xc8\xae" - "\x84\xdb\xd1\x5f\x5b\x92\x85\x14\x0b\xb4\xbc\xee\x82\x8d\x9c\x56" - "\x8c\x78\xa1\x0b\x6d\xce\xbc\x5d\x3f\x13\x69\x02\x41\x39\xf2\xf8" - "\x2d\x44\xd9\x05\xb2\x22\x29\x95\x5c\x9f\x0f\xf2\xae\x0b\xe4\xe7" - "\x19\x45\x50\xe4\xfd\x49\x22\x85\x2b\x03\x7d\x6e\x8a\xc1\xf9\x56" - "\x90\xd7\x8c\xbf\xc8\x33\x5c\x57\xac\x7d\xfc\x10\x94\xa7\xbc\xe1" - "\x83\x38\x07\xc9\x48\xe8\xcb\x5f\x31\x23\x56\xeb\x34\x0e\xde\x4f" - "\x30\x2e\xdb\xc6\x56\xe4\x6b\x19\x31\xb7\xb8\xfa\x89\xf8\x2c\x97" - "\xc3\xc8\x0b\xec\x17\xd8\x47\x76\xb8\xc9\x5f\x90\xed\x9a\x22\xc9" - "\xc7\xbf\x13\xe4\x6f\x11\xfa\x30\x07\x5e\xa2\xef\xff\x7e\xfb\xc7" - "\x73\xd0\x3f\x36\xb0\xb8\x2c\xe1\x40\x8f\xb2\xae\x4e\xce\x43\xe4" - "\x99\xd9\x51\xcd\xf8\x97\x2f\xc9\x7b\x4e\xf7\xfc\x83\x94\xc6\x12" - "\x27\xd4\x5d\xcc\xdb\x69\xa5\x9d\x09\x63\x70\x0e\x12\xc6\xcf\x91" - "\xa1\xf1\x60\x3b\x7c\x03\xfa\x60\x0d\xe0\xeb\x1c\x99\xbe\x77\x0d" - "\xd8\x03\x9d\x18\x0b\x0a\xea\xb3\x9e\xc7\xd0\x14\xf5\xf4\x00\xbc" - "\x63\xeb\xa1\xa2\xec\x43\xb4\x43\x87\xe3\x7e\xd7\x7c\xd1\x5a\x9d" - "\xe0\xfa\xe6\xfb\x26\xa7\xaa\x5d\xc7\xce\xc7\x2b\x94\x7c\xae\x57" - "\xf5\x2a\x9e\xc9\x25\x6d\x8a\x11\x11\x7c\xee\xf7\x2f\xb8\xcf\x71" - "\xd4\x19\x85\xf2\x43\x9a\xf3\x56\x6b\x12\xc6\x05\x96\xdf\x65\x40" - "\x5d\xf5\x05\xf6\xdb\x32\x49\xa6\x33\xbb\x7d\xbe\x39\xed\x2c\xfa" - "\xe9\xf3\x4f\xf6\x2a\x94\x6c\x2f\xb8\xd3\xf0\x7e\x15\xd0\x29\x4a" - "\xcc\x79\xbf\x06\x64\x4a\x24\x7d\x0a\xda\xfa\x1b\x68\xeb\x19\xa0" - "\xeb\x19\x68\xeb\xb3\x52\x5b\xa5\xf8\x58\x22\xd0\x1f\xde\xf5\xaf" - "\xff\xe4\xb6\x3e\x85\xb1\x16\xfe\x64\xda\x74\x96\x5c\x43\xa7\xe1" - "\x5a\x2e\x3b\xff\xd8\x69\x76\x9c\x24\xf8\x5d\xa6\x9f\x8d\x4b\xd2" - "\x1e\x06\x3c\x22\xcd\xc1\x26\xb0\xd0\x90\xed\xf5\x32\x1f\xb0\x3e" - "\xb4\x3b\x61\x4c\xf1\x1a\xa8\x0f\xd2\xfe\x1c\x99\x89\xfd\x19\x68" - "\x3f\xbd\x18\xe9\xef\x19\xa3\x36\x8c\xf1\x40\x00\x1e\xac\x91\x78" - "\x90\x2d\xf1\x00\x6c\x45\xd0\xd5\x38\xc7\x11\x5e\xac\xe7\x3c\xf0" - "\x8f\x46\x23\xd5\xc3\xdc\x5f\x95\xde\xfb\xeb\xe8\x5f\x74\xf1\x31" - "\xa4\x02\x7d\x99\xd2\x90\x5d\x73\xc5\x6e\xe8\xb7\x79\x52\xbf\xa5" - "\x09\xf7\xca\x7d\xf6\xb4\x62\xe4\x29\xdf\xfa\xec\xa8\xe3\xff\xa2" - "\x7d\x36\xec\xd2\xf6\x59\x55\x91\x67\x9f\x55\xd5\x7b\xf6\x59\xd5" - "\xf3\xae\x3e\x2b\xbd\x1b\x96\x3e\xab\x2a\xfc\x6e\xfa\xac\xaa\xb0" - "\x9f\x3e\xdb\xe2\x43\x9f\x0d\xf7\xd2\x67\xc3\x2f\x5d\x9f\x1d\x6d" - "\xba\x7c\x3a\x36\x18\x63\x7d\xf7\xd5\xb1\xcf\xb9\xe9\xd8\x60\xd4" - "\xb1\x63\x76\xf7\xd7\x5f\xbb\x0b\xa1\xbf\xaa\xa5\xfe\xfa\xc8\x5b" - "\x50\xde\xd8\xdc\x63\x4d\x83\xf7\x57\x47\xa1\xcb\x7e\xf2\xda\x67" - "\x13\xb0\xcf\x96\x12\xb3\x85\xf5\xd9\xe5\x72\x9f\x2d\x94\xc6\x3b" - "\x03\xf4\xdb\x30\x6f\xfd\x16\xe3\xed\x60\xac\x9d\x01\xfb\xad\x64" - "\x2f\x75\x4f\xc1\x7e\x6b\xba\xc2\x74\xad\xfa\x61\xcf\x7e\xab\x36" - "\x78\xf6\x5b\xf5\x3d\xae\x7e\x2b\xbd\x1b\x96\x7e\xab\x5e\xfc\xdd" - "\xf4\x5b\xf5\xe2\xef\x8f\xae\x0d\x4e\xbb\x7c\xba\x56\xf3\x36\xeb" - "\xb7\xde\x74\x6d\x86\xa4\x6b\x83\x51\xd7\x86\xfc\xd2\xb7\xbe\x1b" - "\xfa\x8b\x7f\xf1\xbe\x7b\x89\x75\xae\x66\x9c\x67\xdf\xd5\xcc\xf3" - "\xec\xbb\xa1\x17\x5d\x7d\x57\x7a\x37\x2c\x7d\x57\xa3\xf9\x6e\xfa" - "\xae\x46\xf3\xfd\xd1\xb9\xe3\xbc\xc6\x2f\xd5\x4e\x25\x99\xcd\x8a" - "\x71\xb9\xe6\x42\xb6\xdf\x2e\xd3\xec\xf8\x09\x61\x7b\x54\x14\xe3" - "\xde\x30\x87\xcf\x26\x62\xce\xe1\x70\x8c\xd5\x81\x7b\x65\x7e\xeb" - "\xb6\x17\x85\xad\xe9\x2a\xc6\x1d\x97\xf7\xd2\xec\x95\xe2\x79\x0c" - "\xb4\x97\x86\x1a\x0e\x71\x7f\x56\x8a\xf1\x1a\x8e\x8d\x43\xfb\xe5" - "\x67\xe6\x57\x46\x31\x3e\x8c\x66\x1f\xda\x67\x1d\x7d\x68\x9f\xb7" - "\x75\x92\x90\xcd\x94\xe2\xfe\x91\x8e\xa9\x2b\xa2\x3a\x72\x08\xc9" - "\xc7\x35\x88\xac\xf1\x0b\xa0\x8d\x29\x6c\xdf\x44\xc8\x28\x6d\x87" - "\x3e\x86\x40\x5a\x9c\x9c\xc6\x62\xdf\xea\x83\xa8\x08\xef\x40\x86" - "\xa8\xf7\xa6\x13\x15\xfa\x2a\xbe\xed\x02\x62\x71\x7c\x12\xc8\x08" - "\xb6\x37\x84\xad\xe3\x5f\x7b\x9d\xad\xb8\x9d\x28\xeb\xb6\xb2\x3d" - "\x72\xb8\x07\xa7\x24\x0f\xf1\x1f\x34\xa3\x80\x0a\x4a\x22\x16\x3d" - "\x14\x4e\x83\xf3\xed\x6c\xcf\x30\x60\x45\xde\x97\x83\x71\xbc\xc4" - "\x29\x8b\xca\x65\x7f\xb9\x14\xea\xf7\x4e\x3a\x9e\x2d\x0d\xa2\xc5" - "\xc9\x44\x03\x97\x9a\xe6\xe6\xdb\xa1\x5e\x76\x79\xfe\xd0\xeb\xfe" - "\x6f\x8c\xdf\x79\x5d\xb8\x52\xda\x03\x84\x7e\x06\xd8\x39\xb2\x1d" - "\x82\x68\x70\x42\x3a\xd5\x67\x50\x73\x9a\x83\x84\x02\x2d\x70\x0d" - "\x1f\xe4\x94\x20\x16\xaf\xc0\xd8\x0e\xe4\xb5\x0d\xad\x02\xee\xe7" - "\x70\xfe\xd7\x75\x36\x53\xfa\x9d\xb8\xc6\xcf\xfc\xcc\x9f\x56\x5c" - "\x73\x3e\xfa\x6b\x1e\xab\xf3\xb4\x22\x4c\x81\x6b\x0f\x0b\xe1\x19" - "\xd7\xc8\xc5\x8e\x70\x25\xe6\x85\x3c\xaf\x9a\x52\x3f\x25\xa1\x49" - "\x6c\x5f\xbd\x8a\xe7\xbd\x66\x23\xe6\xb5\x28\xc2\xd8\xfa\x3b\x3c" - "\xe7\xe3\x7c\x39\xee\xbd\x67\x67\x34\x0a\x1f\x0a\x67\xf2\xc1\x98" - "\x6f\x17\xa7\x3c\xc4\xf7\x88\x42\x3b\x77\x40\x9b\x21\x8f\x1a\xf7" - "\xe6\xb0\x7b\x3a\xd1\xec\x86\x34\x2c\x07\xee\x6a\xb6\x3f\x58\x71" - "\x4d\x22\x96\xed\xf5\x5c\x81\x3a\xdf\x4e\x01\xdb\xfc\x9c\x8d\xe2" - "\xc3\x66\x45\x58\x49\xa8\x82\x52\x5a\xb8\xa8\x7c\x0b\xce\x63\xe3" - "\x5e\x6e\xdc\x9f\xae\x08\x5b\x0f\xe5\x2b\x91\x16\x9d\x59\x61\xb1" - "\x16\xc5\x35\xca\x9e\xfd\x08\xd3\x58\x7b\xcb\xf0\x3b\xf8\x1f\x29" - "\x3f\x8f\xfd\x09\x75\xd6\xa6\x07\x51\x78\xde\xc3\xf7\x7b\xab\x96" - "\xc3\xff\x0b\x7a\xf6\x7b\xf3\xff\x01\x96\xc2\xf6\x03\x36\x99\x6f" - "\x23\x7c\xf6\xba\xff\x58\xe2\x5b\x6d\x38\x60\xa3\x37\xef\x64\x8c" - "\x00\x2e\x64\x8c\x60\x7d\x5f\x4f\xb7\x08\x4c\x1f\x29\x26\xb0\x33" - "\x09\x79\xc0\x43\xe7\x4b\xe1\x4a\x36\x37\xdd\x8d\x7c\x69\xc6\x77" - "\xdf\x22\x5f\x76\x80\x2e\x90\xf2\x86\xb9\xea\x8f\xcf\x13\x19\x3f" - "\x45\xe0\x05\xdb\xdf\xa4\x98\x70\x84\xc5\xf4\x01\x99\x81\xfb\xd2" - "\xab\x40\x73\x53\xc4\x2d\x60\xe4\xb5\x64\xbb\x50\x9c\xca\xd3\xdf" - "\x69\xb7\x0b\x3b\xce\x10\x94\x2d\x24\xf7\x37\x44\x09\x7a\x48\x89" - "\x65\xd2\x88\x45\xe5\xb7\xcb\x7c\xdc\x00\xbc\x4b\x05\xec\x02\xcd" - "\x77\x00\xfd\x8a\xbb\xd8\x5a\x4d\x79\xb1\x48\xd4\x22\xe4\xb3\x28" - "\x26\x12\x28\x4f\x83\x71\x04\x71\xff\x34\xd0\xf0\x99\xce\xac\x09" - "\x4d\x32\x0d\xb1\x4e\xb8\xff\x19\xe3\x09\x5a\x14\x13\x62\x39\x86" - "\x26\xe8\xe4\x36\x7b\xa3\x67\xee\x6b\x24\x22\xf7\x36\x32\x5b\x54" - "\xb5\xe9\x68\xd0\x75\x25\x38\xdf\xfc\x20\x7a\x1b\x4a\x6a\x25\xd1" - "\xcf\x7f\x4e\xcd\x56\x27\x11\x47\xb7\xe9\x70\x1d\xc2\xb9\x65\xc6" - "\xf8\xe8\xf5\x40\x2f\xd0\xf7\x19\x76\xa2\x31\xa7\x5b\x79\x4c\x30" - "\xf2\x2d\x71\xae\x03\x19\x0e\x72\x1d\x74\xaa\x32\xe3\x5b\x32\x09" - "\xe9\x25\x06\x6f\x8f\x05\x9a\xfd\xf9\xe1\x14\x92\xe9\x9f\x1c\x9d" - "\xc8\xfc\xb1\xa1\x7d\x01\x32\x5f\x60\xb1\xb2\xad\x60\x9f\xe4\x6e" - "\x8f\xf5\xb3\x9c\x2a\x6f\x32\x12\xdb\x2d\xe2\x3c\xb4\xd4\xe6\x68" - "\x6c\xb3\xcd\x4e\x70\x2e\xff\xc1\xa7\xd1\xdf\xf1\x79\x22\x66\xb7" - "\xe9\xb0\xcd\x60\xeb\x34\xfa\x3d\xa7\xaf\xb8\x36\x6a\xa0\x6f\x53" - "\xa0\xb7\xb8\xe5\xba\x12\x51\x9d\xdf\x88\xdf\xc6\x3a\xe0\x99\x9e" - "\x07\xcf\x13\x46\x77\xa4\xbf\xd9\xee\x24\x74\xb4\x7b\x1d\x1c\xfe" - "\xd6\xc1\x7b\xfb\x6f\x23\x11\xc6\xd7\x38\xdf\x9d\x5b\x24\x1a\x24" - "\xe0\x3a\x58\x7e\x63\x5d\x92\x95\x3c\x88\x75\xb0\x9e\x25\x0b\xcf" - "\x12\xc6\x7f\xb3\xae\x8d\x38\x83\x66\x8c\xc7\x3d\x07\xc8\xff\x74" - "\x07\xf0\xff\x82\x1d\x7d\x24\x59\xcd\x99\x17\x09\xda\x2f\x8e\x0e" - "\x9d\xd0\x97\xff\xe1\x7f\x7e\x38\xcd\x5f\xfe\x87\x0f\x13\xff\xc3" - "\xaf\x80\xf6\x4f\x0a\xa0\xfd\x93\x86\xa9\xfd\x93\xae\x80\xf6\x4f" - "\x0e\xa0\xfd\x93\x87\xa9\xfd\x93\xbd\xb6\x7f\xee\x24\x91\xb2\xbd" - "\x28\x21\xdb\x4c\xa8\x03\xb8\xbe\xba\xee\x15\xdc\x77\xc2\xce\x70" - "\x49\xcf\x84\x9f\xe9\x52\xf5\x7a\x56\xf7\x7a\xd6\xf4\x7a\x0e\xeb" - "\xf5\x1c\xde\xeb\x39\x42\x7e\x06\x3d\x32\xe2\x9c\xe2\xba\x49\x60" - "\x97\x66\x5a\x14\xd7\x1d\x90\xde\x4f\x47\x1f\x62\xa0\xd3\xa7\x0f" - "\x10\xdb\xf0\xba\x33\x8a\x08\x2d\xa3\xd3\x96\xc9\x3a\xba\x21\x93" - "\x88\xc6\x25\x5b\x1f\xdc\x04\xb2\x0b\xf8\x47\xbb\xc3\x47\x82\x8d" - "\x70\x2d\xfa\xa9\xc3\x7d\x07\xda\xe4\x77\x69\xb3\x22\x22\x18\xdb" - "\x77\x5b\x92\x89\x88\x41\x33\xd8\x7a\xbe\x98\xbb\x64\xab\x35\x68" - "\xc6\x64\xba\x67\x57\x5c\x9e\x20\xaa\xf2\xf4\xa2\x76\x93\x95\x5a" - "\x17\x7c\x0b\x72\xe8\x3c\xfa\x7e\x07\x1e\xa7\x50\xab\x29\xf9\x2c" - "\xd4\x37\xe2\x99\xda\x8d\x50\x36\x7c\x07\xbe\x05\xe3\xb8\x25\xf1" - "\x3c\x2e\xf2\x92\xad\x75\xb6\x6a\x82\x71\x67\xa4\x32\x33\x69\xf0" - "\x92\x78\x2c\xb3\x5f\xfb\xd4\xb8\xcd\x06\xdf\xfc\xc9\xc3\x3a\x25" - "\xa1\x9b\x95\x61\xfe\xf1\x34\xa2\xc0\xab\xdd\x6b\x34\xa4\xf0\x72" - "\x55\x81\x94\x6b\x1d\xa0\x5c\xa9\xbe\x9a\x00\xca\x9d\x32\xdf\x7b" - "\xb9\xd9\x52\x7d\xb5\x81\x94\x5b\x32\x40\xb9\x52\x7d\xa3\x02\x29" - "\xd7\xee\xbd\xdc\x1c\xa9\xbe\x99\x01\x94\x3b\xd5\x7b\xfc\x6f\xc0" - "\x43\x60\x58\x98\xea\x35\xfe\x27\x62\x21\x30\x1c\x4c\x1d\xa0\xfd" - "\x06\x5b\x60\x18\xb8\x7e\xc1\x40\x18\x08\x8c\xff\xd7\x0f\xc8\xff" - "\xc0\x78\x7f\xbd\xf7\x33\xba\xc0\xfb\xc0\xf8\xae\xf5\x8a\x7f\xb4" - "\xe5\x81\xf7\x65\x34\x64\x57\x8c\x98\xb7\xa4\x4c\x0c\xd9\xf6\x97" - "\x2d\x62\x14\x99\x0b\x32\x2c\xb4\x80\x8c\x8b\x62\xe3\x63\x6d\xd3" - "\xa6\x42\x22\xc0\x78\x57\x78\x75\x43\xa3\x60\x76\xcc\x46\x9d\xe3" - "\xdc\x97\x6a\x57\xdc\x08\xe9\x95\xa0\xb3\x6c\x60\x77\xf2\x72\x96" - "\x94\xe5\xa5\x47\x11\xc9\x4f\x86\x0d\xfd\xa5\x46\x83\x1c\x33\x17" - "\xd8\x71\xdf\xca\x38\xf8\x9f\x03\xf0\x0b\x65\xd8\xc9\xeb\xa2\x55" - "\x11\x95\xcc\xf2\x59\xd9\x59\xbc\xbc\x6d\x7f\xa1\x19\x3a\xf4\x97" - "\x68\x3d\xad\xb8\xe1\xfe\x20\x2b\x11\xd0\xaf\x51\x67\xd6\x0d\x51" - "\x16\xc5\xb4\x48\xe9\xec\x69\x1b\xf3\xf3\x09\xf5\xc5\x73\x9d\x98" - "\x17\xfd\x7d\xde\x96\x44\x04\xf4\xa1\x0e\x79\x13\xd1\xf7\xe7\x40" - "\x67\xb8\x9d\xc6\xfc\xdd\xf8\x7f\x6a\x04\x1d\x7a\x96\x08\x78\x6e" - "\x93\x46\x3c\xa4\xc9\x83\x31\xc4\xfd\xb7\xe0\x9c\x47\x3b\x49\xdf" - "\x44\x45\x9c\x7f\xa2\xea\xed\xf3\x71\x6f\x1c\xdb\x37\xae\x98\xa6" - "\x2a\xe6\xfb\xc8\xed\x2c\xb6\x2c\x3c\xb3\x71\x0c\xee\x8d\x51\x2f" - "\x99\x4d\xf3\x82\xa3\xea\x6c\xed\x2c\xe6\x4f\xb3\x62\xda\x68\xf4" - "\xb9\xd8\xa1\xce\xcf\xb7\xa9\xf3\x0b\x3a\xb3\xa6\x29\xe5\x36\xe0" - "\xf7\xe5\x74\x1c\xb7\x61\x3e\x78\x3f\x5d\x3e\xd3\xdd\xbf\x6f\x84" - "\xc9\xe3\xa3\xc3\xa9\xb5\xc7\x97\x86\xe2\xc6\x6c\xa4\x3d\xd8\x0a" - "\x06\x5b\x86\x6e\x2a\x9f\xc7\x98\x56\x86\xe3\x61\xa8\x77\x0a\x1f" - "\x9b\x2e\x49\x61\x3e\x74\x41\x07\x3c\xac\x13\xfc\xb4\x5b\xa7\x31" - "\xfd\x6f\x9a\x8a\x3a\xf2\xc6\xa7\xa1\xfc\x9f\x42\x9b\x1a\xf8\x58" - "\x6c\x89\x81\x9d\x65\x54\x4c\x4b\x82\x6f\x18\xe0\x39\x12\xf3\xc1" - "\x7b\x9b\xf4\x3e\xdf\xed\x7d\x3e\xee\x95\xe4\xef\x6f\x94\xc6\x72" - "\x4b\x76\xbb\xbd\xdf\x9d\x34\x15\xe7\x26\x6e\x9c\x83\x6d\x00\x3a" - "\x26\xa1\x6e\xeb\xf1\x0d\x12\xbc\x24\x49\xca\xb7\xb5\x4d\x71\xe3" - "\xc3\x1d\x80\x2d\x78\x6f\x74\xfb\xbf\xf1\x70\x5a\x24\x99\x5b\x84" - "\x34\xbc\x31\xc1\x22\xe4\x57\xf0\xf1\xec\x34\xde\x76\xf5\x92\x04" - "\xf7\xf2\x2c\x8a\x1b\x67\x41\x99\x09\x36\xb0\xa3\x20\xcf\x52\xfc" - "\xa6\x3b\xbd\xe5\x13\x95\xda\xf8\xd5\xcb\xb5\x2b\xd6\x3e\xb3\x06" - "\x4f\xc4\x79\xc6\xa2\xd7\xe0\x99\x51\xd1\x68\x4c\x33\x17\xe0\x19" - "\x36\x0d\x3b\xfb\xbd\x1b\xf7\x4d\x85\xec\x2c\x73\xe6\xed\x8c\x12" - "\x43\xb6\xc7\x99\x36\xdc\x47\xce\x29\x6e\x64\xe7\x49\xcd\x60\x21" - "\x60\x9c\x6e\xd3\x86\x63\x90\x36\x9d\xf9\xbf\xc2\xd8\x50\x6c\xcc" - "\xbe\x41\x45\xaa\xb4\xed\x6c\xdc\x0f\xef\xee\x67\x73\x1c\xe7\x89" - "\xe0\xd0\xab\xc8\x5f\xd3\xeb\x85\x0a\xd1\x22\xfc\x55\x6c\x64\xfb" - "\x74\x0f\x87\x57\x93\xdb\xd3\x54\x18\x6b\x4f\x78\x17\xc6\xd2\xf8" - "\x1e\xdf\xc9\x67\x11\xe0\xff\x2f\xb0\x3d\xbb\xd3\xf8\xef\x8c\x02" - "\xfa\xc5\xe1\x70\xc9\x3f\x85\xe2\xc6\xaf\xb1\xae\xe8\xbb\x03\xe8" - "\x78\x16\xeb\x07\xb4\x68\x0b\x2a\x64\x7b\x97\xd5\x90\xff\x84\x98" - "\x6b\x4c\x43\x79\xe0\xc8\xba\xb1\x84\xea\xd5\x7f\xc4\xf3\x74\x85" - "\xd2\x19\xbb\xce\xac\xe9\x55\x6e\x67\x47\xd5\x1d\x02\xf9\x19\xa4" - "\x35\xca\x67\x1b\x30\x56\x99\x37\xf9\x62\x07\x1b\xef\x62\xc4\xa2" - "\x02\x51\x6d\x04\x5e\x18\xd3\xaa\xe7\x11\x9c\x77\x51\xe0\x9e\xd9" - "\x36\xc5\xcd\xf5\x34\xd8\x98\x90\x8e\x7d\x3a\x6f\x7b\xdc\x9f\x70" - "\xdf\x1f\xd0\x71\x3f\xee\xf3\x03\x5a\xbe\x02\xcf\xc7\xe6\x97\x12" - "\xed\x22\xb4\x9d\x6e\xfa\xc5\x7f\xc4\x53\xc7\x8c\x18\x13\xa9\x69" - "\xf9\x0b\xf9\xa0\xa1\x9a\xa8\x97\x92\xa0\x0c\x0b\x75\xb2\x36\xa6" - "\x10\x21\xda\x42\x82\xd2\xcf\x63\x9f\x76\xb2\x58\xe1\x75\xf6\x5a" - "\xb0\x87\x9e\xdc\xfa\x6a\x7a\xeb\x08\xed\x83\x84\x40\xdf\x63\x6b" - "\xcc\xec\x9c\x8f\x95\x9d\x87\x0e\xc6\xf9\x6e\xb7\xf3\x3d\x99\x1b" - "\xe3\xa8\xb8\xe9\x2c\x51\xd5\x26\x9c\x24\xd1\x71\x41\x94\x9d\xef" - "\x49\x83\x8c\x56\xe0\xfd\xb3\xba\x10\xe7\xb3\xba\xf1\x7b\x2e\x90" - "\xb0\xba\x14\x0b\xd8\x66\xd5\xe4\xa5\x64\x12\x46\x3b\x13\x46\xd7" - "\x54\x1f\x23\x34\xe7\x9c\xf6\xf5\x74\xd3\x08\xa7\x8a\xef\xaf\x0a" - "\xdd\xac\xc0\xf9\xcd\x10\x23\xee\xb3\xba\x40\x22\x97\x9d\xca\x64" - "\x73\xb2\x38\xff\xed\xe8\xd4\x69\xbb\x3b\x75\xd3\xba\x9e\xd5\x4d" - "\x95\xe7\xcd\x1f\x3b\xab\xc1\x75\x82\x58\x9a\x75\xad\x01\xf7\xf6" - "\xe1\x38\xc0\x31\xba\x5d\x87\x73\xe4\x88\x61\xf8\x7e\x84\xb8\x42" - "\x47\x6e\xb7\xb2\xb3\x47\x38\x6f\xaf\x29\x7e\x02\xeb\xda\x4e\xd8" - "\x5e\xa1\xd1\x7c\xaf\x90\x1d\xd7\xac\xd5\xf9\xad\x0b\x57\x69\x49" - "\xd7\x94\x45\x05\xe6\xb4\x3f\x91\x8c\x8b\xf4\x0b\x66\xc7\xa7\x01" - "\x6e\xb3\xa6\x5b\x69\x70\x7e\xeb\x11\xdd\x71\xd4\x27\xb3\xfc\x97" - "\x0f\x37\xb3\xf5\x5f\xa4\x0d\xf0\xa9\x6c\x7f\x3b\xf2\x6d\x7b\xdc" - "\xff\x26\x5b\x85\x07\x5a\xa8\xa3\x36\xfe\x4f\xe4\x83\xc6\x7a\x0f" - "\xfe\x30\x7e\x42\x3e\xe4\x13\xf2\x08\x79\xe5\xe2\xd3\x71\xc6\xa7" - "\xfd\x22\xe7\x53\x97\x7a\x5b\x99\xcc\x2b\x7b\xe1\xa2\x52\x5f\xf8" - "\x55\xd3\xd2\x3f\xbf\x80\xce\x3d\xfc\x7a\xb1\x9d\x84\x99\xdb\xc0" - "\x5e\x06\x7e\x3d\xf0\x4b\x42\x1e\x78\x85\x8a\xb5\xf3\x3f\xea\xe1" - "\x9b\xc3\xe0\x85\x6f\x5f\xbb\xf8\x06\xfc\x1f\x80\x6f\xe1\x6a\x7f" - "\xf8\x56\xd3\xc2\xf9\xe6\x90\xf6\x78\xe9\xaa\x88\x60\x7f\x56\x27" - "\x14\x5c\x20\xb3\x91\x7f\x0b\x4e\x69\xc9\x91\xc5\xb5\xc0\xb3\xbf" - "\x78\xf0\x4f\xcc\xcd\x37\x00\x0f\x0a\x90\x87\x81\xf5\xbb\x19\xf3" - "\x7d\xef\x77\xba\xca\xab\xfd\x6e\xb8\xfa\x9d\x2e\x61\x68\xfd\x6e" - "\x46\xd8\xd5\x7e\xf7\x5d\xf7\xbb\x19\x9a\xde\xfd\xae\xc7\x6e\x48" - "\x5e\xb9\x7a\xf9\xaa\x35\x78\x3c\xf1\x89\xf5\x29\x2b\xd7\x71\xeb" - "\xc1\xc3\x7e\x08\x77\xa6\x47\x09\xe8\x53\xae\xa6\xa0\x9e\xbc\x3e" - "\xb9\x5e\x70\x7e\x15\xae\xa4\x46\x65\x92\x68\x1c\x69\x47\xdf\xa0" - "\xd8\x3f\x31\xb6\xfd\x69\x45\x64\x4d\x5d\x04\x8f\xab\x89\xbf\x99" - "\xed\x14\xf1\x90\x0e\xd7\x6b\xb6\x74\xc1\xb5\x81\x28\x43\xed\x44" - "\x65\x9a\xca\xde\xdf\x82\xbe\x12\x69\xd1\x43\xba\x62\x8c\x39\xdf" - "\x45\x94\x36\xf5\x92\xc8\xad\x50\x9e\x35\xd8\x98\xa6\xd4\x12\xa1" - "\x33\x6b\x26\xd4\xfd\xc6\xf2\x1e\x1f\x4a\x8a\xdb\xdb\xe8\xc8\x1f" - "\x36\xa2\x6c\xc0\x73\x72\xe7\x14\x33\xdf\xbe\x88\xeb\x1d\x60\x53" - "\x3f\x7c\x0b\x7c\x6b\xca\xa2\x52\xe6\x53\x01\xe4\x04\x7f\x7f\x1b" - "\x8b\xb7\x7d\xd1\xb8\x3d\x0e\x6d\x8e\x0e\xf5\xce\xb2\x0e\xe3\xce" - "\xa8\x63\x1b\x0b\x24\x39\x31\xf3\xeb\x07\x0a\xb8\x9c\xa8\x0d\x07" - "\x1c\x2e\x00\x1c\xc6\x0e\x26\x27\xdc\xf0\x37\xd5\x3f\x39\x81\x78" - "\x43\xdc\x21\xe6\xc6\x02\xe6\x10\x87\x32\xee\x7e\x2b\xe1\x2e\xb4" - "\x89\x68\x18\xf6\x1c\x1c\x7b\x78\xa6\xb9\x36\xcd\x85\x3b\x67\x6f" - "\xdc\x5d\xe8\x85\x3b\x41\xc2\xdd\xb3\x9e\xb8\x7b\xf4\xa4\x86\xbc" - "\xc4\xe5\x85\x0b\x77\xd9\xed\x3a\x19\x73\x88\x3f\xc4\x9a\xf8\x6b" - "\x1d\xa9\x6d\x6b\xef\xc1\x5f\xf1\x93\x7c\xcd\x95\xed\xe9\x15\x68" - "\xd9\xc5\x67\x25\x79\x71\x56\x96\x17\x2f\x7a\xd1\xd3\x27\x03\x94" - "\x17\xb7\xb1\xf5\x67\xe4\x55\x17\xf0\x0d\xf9\xf5\x40\x38\xc8\x89" - "\xf0\xff\x26\x1f\x2c\xbe\x42\xf8\x93\x3c\x3c\xfc\x41\x7f\xb7\x50" - "\x97\x7e\x78\x34\x31\x6c\x30\x1e\x21\x7f\x90\x4f\x8c\x3f\xc0\x27" - "\x79\x5d\x1c\xd7\x49\x91\x57\xc8\x9f\xdb\x36\x12\x01\xf9\x55\x9c" - "\xca\x65\x04\xca\x02\xb6\x0f\xbb\x97\x8c\x07\x9a\x47\x21\xcf\xd8" - "\xd8\x5a\x1f\xbc\x66\x37\x9e\x23\x1e\x2f\xdb\xd1\x91\xea\xbe\x76" - "\x74\xa4\xb6\xc7\xf7\xa5\x62\x26\xf3\x1d\x65\x9a\xfc\x13\xe8\x9f" - "\x33\xe3\xf8\x78\xc9\xa8\xe3\x36\xfc\x1d\x9b\x24\x19\xa0\xc1\xb1" - "\x2b\x1b\xa7\x3a\x61\x9c\xaa\x86\x71\xaa\x11\xc6\xa9\x69\xad\xdc" - "\x4f\x82\x22\x72\x3d\x91\xce\x37\xd3\xe0\xed\xf3\x61\x8c\x34\x1b" - "\xe9\xca\xd6\x7c\x83\xf3\x31\x3e\x5f\x1b\xcd\x85\x31\xf0\x7f\x0b" - "\x04\x9e\x0b\x8e\xe8\x9c\x7e\x62\x2a\xb2\x40\x5a\xd3\xde\x97\xb4" - "\x01\xf7\x3b\xdc\xc1\x7d\x0b\x2a\x66\x32\xff\xd2\x6c\x3d\x50\x10" - "\x4b\x9c\x5b\x3c\xd7\x03\xdd\xd7\x8b\x5f\x4f\xb7\x4a\x6b\x81\x77" - "\xb0\x78\x93\x28\x4f\x50\x0e\xbe\x0a\x63\x1a\xd7\x7a\xe0\x47\xf8" - "\xfe\x97\x9e\xeb\x81\x77\x4c\xc7\xfc\x16\xc5\x1d\x1b\x71\x0f\x0c" - "\x3c\xcf\xe6\xe9\x33\xa3\xdc\xd3\x5d\xeb\xed\x3c\x5d\x14\x58\xfc" - "\x15\x9c\x2f\x68\xe3\xf3\x04\x77\xec\x96\xc7\xe3\x5e\xec\x27\x3f" - "\xe4\xf4\xdd\x06\x97\x9c\xbe\x9b\xef\xd5\x0a\xdf\x15\x5b\xdb\x47" - "\x4e\x7f\x0a\xef\xef\x3a\xf5\x20\xca\x69\xe3\xf6\x18\x5e\xbf\x3b" - "\x6f\x00\x9a\x04\x61\xfc\x4b\x4c\xc7\xf3\x47\x28\xaf\x8b\xf0\x6c" - "\x0e\x93\xe1\xbb\xe6\x6f\x65\xeb\xfe\x77\xce\xf3\x94\xdd\x77\x95" - "\x7a\xca\xee\x3b\xd7\x0f\x2c\xbb\x67\xdd\x35\xb0\xec\xbe\xf3\x0f" - "\x57\x65\xf7\x70\xcb\x6e\xd9\xd6\x0b\x54\x76\xcf\x22\x57\x65\xf7" - "\xe5\x96\xdd\x3f\x72\xb8\xc9\xee\x5f\x79\xca\xee\xbb\xaa\xfb\xca" - "\xee\xbb\x9a\x5c\xb2\xfb\xce\x18\x97\xec\xbe\x53\xe5\x29\xbb\x7f" - "\xfc\x6f\xbe\xc9\xee\xbb\xef\xba\xb4\xb2\xfb\xee\xc5\x9e\xb2\xfb" - "\xc7\xd3\x25\xdd\xf2\xb5\xff\xb2\xfb\xc7\x23\x06\x96\xdd\x3f\x0e" - "\xf6\x94\xdd\x77\x5b\xb8\x8c\xfe\xf1\x6c\x2e\xbb\xef\xb6\x49\x32" - "\xbd\xd5\x3d\xdd\x25\xbb\x79\x7a\x5f\xd9\xfd\xe3\x98\x41\x64\xb7" - "\xce\x29\xca\xb2\xbb\x11\x64\x77\xa3\x20\xfe\xda\x9b\xec\x9e\x53" - "\x56\x8b\xb2\x3b\x19\x65\xf7\x9c\xb2\x81\x65\xf7\x9c\x22\x94\xd1" - "\x80\x63\x52\x88\x7e\x91\x01\x97\xa6\x27\x3f\xc5\xf9\xeb\x16\xc4" - "\xed\x69\xc5\x4f\xcf\x3f\xb8\xd1\x5d\xb6\xff\xd8\xd9\x23\xdb\x21" - "\x5d\x9c\xe4\x29\xdb\x51\xae\xa3\x7c\x2f\xfa\x1d\xb5\x14\xff\x8e" - "\x36\x75\x66\xcd\xd6\xc9\x32\x3e\x17\xd2\x30\x66\x12\xfa\x3b\x2a" - "\xba\xc0\x2e\x25\xd0\xa0\x65\x0b\x7c\x17\xff\x03\x79\x17\x7b\xea" - "\x83\x9f\x96\x3b\xb2\xdc\xf5\xc1\xec\x6c\xd4\x07\x46\x7e\x46\x9d" - "\xe9\x01\x47\xd1\xa2\x52\xd4\x0d\xfc\xfd\x4f\xee\x1f\x58\x1f\xcc" - "\x7e\xe3\xbb\xd2\x07\x28\x6b\xc6\xba\x8d\x21\xbd\xe9\x03\x9c\x53" - "\xad\x8d\xbf\x3c\xfa\x00\xe5\x0c\xca\x17\x94\x35\x28\x77\x50\xce" - "\xa0\xcc\x71\x48\xe7\xf3\x0a\xf5\x3e\xe8\x03\x90\x2b\x74\xa4\x2e" - "\x81\xe9\x03\x45\x20\xfa\xe0\x27\x9a\xef\x95\x3e\x40\xfe\x6c\xbc" - "\xb4\xfa\x40\x1e\xe7\x23\x7f\x90\x57\x32\x8f\xe4\xb1\x3e\xf2\x07" - "\xf9\x84\xfc\x41\xdb\x48\xd6\x07\xb7\xa6\x71\x7d\x50\x34\xa8\x3e" - "\xf8\x89\xba\x47\x1f\x08\x5c\x1f\xb0\x39\xf1\xf1\xa8\x0f\x7e\xda" - "\xd8\x57\x1f\xfc\xb4\xcd\xa5\x0f\x66\xc7\x49\xf2\xb1\x05\x7d\x2f" - "\x80\x3c\x68\xf1\xd4\x09\xf7\x2c\xf7\x4d\x27\xcc\xf9\x45\x1f\x9d" - "\x00\xb4\x35\xf2\x75\x33\xd4\x07\xf9\xa8\x0f\x1c\xa8\x17\x02\xd2" - "\x09\x73\x12\x5c\x7a\xeb\xc7\x55\x5c\x16\xcf\x51\x7a\xea\x89\x7b" - "\x16\x48\x32\xed\x0f\xee\x7a\x42\x0c\xf2\x45\x4f\xdc\x73\xab\xac" - "\x27\x50\x0e\xbf\x8a\x6b\x16\x3d\x7a\x02\xe5\xea\x3d\x77\x99\x52" - "\x9b\xdd\xf4\xc4\x3d\x3c\xb6\xa8\xe2\x9e\x38\x27\xd3\x13\xf7\x44" - "\x48\xfa\x66\x9f\x7b\xba\x4b\x4f\xf0\x74\xa7\xbb\x9e\x68\x45\x3d" - "\x71\x4f\xda\x20\x7a\x62\x96\xef\x7a\x62\x6e\x8c\x4b\x4f\xcc\x8d" - "\x19\x58\x4f\xcc\xbd\x07\xf5\x04\xf3\xb7\x0b\xbc\x07\x9c\x2b\xf3" - "\x26\x72\x1d\x81\x73\x34\xa0\x3b\x2c\xe8\xf3\x03\xf2\xdd\xc2\xfc" - "\xeb\xc3\x05\xef\x5b\x8d\xf8\x5b\x64\xff\x69\x0a\xb5\x12\x15\xea" - "\x0c\xe3\x69\xa2\xc4\x58\x75\x9c\x4e\xf7\x3d\x5f\x88\xf1\x4f\x7b" - "\xf4\xcb\xbd\x8f\xf9\xa8\x5f\x1a\x40\xbf\xd4\x77\x66\xdd\x6b\x70" - "\xd3\x2f\x18\xef\xaf\xbe\x97\x7e\xb1\x80\x7e\x69\x91\xff\x03\xf9" - "\xcb\xdd\xf3\x63\xfd\x58\xfe\xd3\xec\xc2\xfc\x8d\x90\xbf\x89\xeb" - "\xa3\x7b\x5b\x3c\xf5\xd1\x7d\xf3\x45\x8f\xf1\xc9\xcf\x26\xc9\xfa" - "\x08\xf5\xb9\xd8\x47\x1f\x45\x1d\xef\xd1\x47\x13\xdd\xf4\x51\x9a" - "\xac\x8f\x7e\x76\xff\x15\x3f\x3e\x19\x82\xbc\xbb\xd4\xfa\x48\x04" - "\xbd\xd3\x5b\x1f\xa1\x8e\x92\xc7\x27\x62\x40\xfa\x28\xaa\xe4\x7b" - "\xa5\x8f\x2e\xc3\xf8\xa4\x37\x6f\x64\x9e\x21\x7f\x90\x37\xc8\x17" - "\xf4\xf9\x8d\x3c\x43\x7e\x21\xaf\x6e\x4d\xf2\xd4\x45\x8c\x5f\xa0" - "\x8f\xfa\xac\x1d\x00\xaf\x80\xe6\x85\xc8\x2f\x77\x7d\x54\x3c\x5e" - "\xd6\x47\xf7\x25\xf4\xd5\x47\xf7\x6d\x74\xe9\xa3\x7b\xd9\xfe\x2a" - "\xe6\xff\x50\x71\xef\x3c\x4f\x5d\x34\x4f\xe1\x9b\x2e\xba\xef\x78" - "\x3f\xba\x88\xf9\x99\x36\xfe\xce\x63\x6c\x92\x0f\xfa\x28\x00\x5d" - "\x74\x9f\x8d\xd7\x11\xf7\x82\xdf\x1b\xc6\xe5\xfd\x7d\xf9\x2e\xfd" - "\x74\x4f\x9b\x7b\x9a\x4b\x3f\xcd\x6d\x93\x74\x6a\xad\xff\xfa\x69" - "\x2e\xfb\x0f\xee\x13\x7f\xb5\x9d\xeb\x00\x4f\xfd\x34\xf7\xb8\xa7" - "\x7e\x9a\xcb\xfd\x2a\x29\xe6\x11\xae\x9f\xe6\x56\x48\x7a\xab\xc6" - "\x3d\xdd\xa5\x9f\x78\x7a\x5f\xfd\x34\x2f\x7c\x10\xfd\xa4\xee\x2e" - "\x5c\x54\xda\x65\xdc\x99\xef\xd8\xb7\x22\x6a\xe6\xd2\xeb\x9d\xbd" - "\xfb\x13\xef\x47\x4e\x82\xfd\xaa\x67\xbd\xed\x3f\x09\xe9\x56\x6f" - "\x2b\x13\xa5\xf3\xd4\x5d\x11\x8b\x0a\x4e\x27\x42\x9f\x6a\xf3\xde" - "\xa7\xa0\x3f\xa9\xe4\xfe\x54\x9b\x70\x8a\x40\x1f\x13\x70\xbd\xed" - "\x45\xe8\x4b\x66\x5b\x23\xeb\x5b\xea\x16\x2d\x41\xdf\x96\xc1\x6d" - "\x44\x13\xac\x50\x8c\xfc\x8f\x5f\x41\x9f\x85\x7e\x75\xff\x2d\x54" - "\x9c\xd1\xa4\x25\xc1\x09\x24\x04\xfb\xd6\x6b\xd2\x7a\x0e\xfa\xc2" - "\xc0\x75\x1c\xc0\x75\xe4\xb2\x0f\x79\x9f\x7a\x11\xae\x2e\xde\xa7" - "\xa6\x76\x75\xea\xa6\x79\x5b\xc7\x31\xa7\x59\xd8\x3a\x0e\x9e\x55" - "\xc2\x33\x62\x22\xf6\x21\x5c\xc7\xb1\x73\xdb\x0e\xea\xab\xd9\xcb" - "\xd6\x71\x9a\x3d\xd6\x71\x7e\xd8\x44\x04\xf4\x93\xf1\x92\xfb\x3a" - "\x8e\xae\xb6\x8f\x5d\x87\xfd\x0b\xfb\x93\xff\x32\xef\xfe\xdd\x03" - "\xed\xa5\x72\x00\xad\x9d\xea\x9d\xf9\xf4\xc5\x5d\x99\xff\xdb\x6c" - "\x57\xa0\x4f\x51\x27\xf0\x4e\x04\xd9\x46\x55\xbd\x64\x5b\xb7\xc4" - "\x87\x6e\xce\x07\xe0\xa1\xea\x71\x1b\xa1\xcb\x1c\xd0\x7f\xba\x25" - "\xbf\xa2\x76\x0b\xe0\x50\x37\xbe\x68\x03\xd2\x3d\x9c\x14\x49\xbe" - "\x45\xc5\xe7\x12\x46\x8b\x40\x6b\xaa\x17\xc8\xab\x17\xec\x6c\xdd" - "\xd3\xd8\x45\x66\x82\x2c\x0b\x46\x59\x06\xd8\x1d\xb3\xb7\x0b\xe8" - "\xfe\x05\xa7\x3b\xfa\x7b\xc3\xbb\xe3\x39\x9d\x16\xca\x9e\xd6\xdd" - "\x0d\xb2\xcc\xce\x69\xff\xf8\xd3\x1a\xc2\xfc\x91\xe2\xda\x27\xd8" - "\x0d\x75\xc0\x6f\x26\xcb\x6c\xa1\x14\xe3\x81\x88\x5f\xe9\xd0\xf7" - "\x55\xc4\xed\x36\xa0\x7d\xb7\x0e\xb1\xa1\x29\x3e\x8d\x6b\x9f\x9f" - "\x7a\xac\x7d\x5a\x9f\x73\xad\x7d\xd6\x95\x1e\xe7\x7b\x55\x3c\xe6" - "\xc3\xe6\xcd\xec\x2e\xe2\x3a\x87\xcd\x87\xa5\xf8\x4b\xfb\x7f\xd7" - "\x7c\x77\xb4\xd7\x7c\xcf\x69\x7f\x7f\xd3\xd0\x68\x3f\xdf\xab\xaf" - "\xf8\x4b\x4f\x7b\xd5\xf7\x9c\xf6\xff\x1e\x3b\x34\xda\x3f\xe0\xd5" - "\xff\x11\xd2\x1e\xc7\x30\xf2\xf8\x45\x1e\xbb\xa0\x0e\xe3\xfa\x7a" - "\x41\xa1\x6b\xdc\xb2\xa0\x50\x5e\x43\x06\x9a\x29\x73\xd1\x77\x37" - "\xd0\x22\xe9\x49\x72\xfd\x19\xc5\x82\x71\xf2\xfa\x71\x3e\xc6\x90" - "\x41\x3e\xbe\x08\x7c\x5c\x83\x67\x8d\x24\x1e\x82\xce\x59\x66\x03" - "\xbd\x30\x65\x51\xa9\x33\x17\x74\xd2\x1f\x56\x44\x79\xe1\xa7\x80" - "\xfa\x24\x38\x85\x68\x1e\x4f\x72\xf1\x55\x7c\x0e\xf8\xd9\x05\xb6" - "\x99\xbd\x95\xe0\xf9\xe1\xd0\x56\xb0\x5b\xbb\x13\x46\x2f\x85\x31" - "\x80\xcc\xd3\xd7\x52\xed\xcc\x2e\xeb\x97\xa7\x7b\x3c\x79\xda\xd1" - "\x0f\x4f\x1f\x5b\x05\xfd\x54\x90\x6c\x67\xc6\x53\x4b\x0f\x4f\x99" - "\x1e\x79\x4e\x17\x81\x7c\x95\x79\x8a\x7a\x84\xf1\xb4\x8d\xeb\x91" - "\x1e\x5f\x4b\xcf\xb9\x6c\xe7\x9a\xb8\x93\xfd\xf0\x74\x7e\x83\x07" - "\x4f\xe3\xfc\xe5\xe9\x7f\x34\x79\xda\x5f\x0b\x7f\xe1\x9b\xfd\xb5" - "\xe0\x57\x68\x5f\xb9\xdb\x5f\xf8\xdc\x01\xf6\x96\x33\x38\x7f\xb7" - "\x2d\xa0\xf1\xff\x82\x04\x4f\x5b\x6a\xe1\x2c\x5e\xa7\x07\x9e\xf7" - "\xdf\x96\x5a\xc8\xe2\x2f\xbe\xfa\x62\x7f\x76\xd4\xc2\x29\x9e\x76" - "\xd4\x02\x2b\xb7\x97\x16\xce\xef\xd0\xa3\x1d\xb5\x50\xc9\xd3\x1f" - "\xd8\xea\x9e\xee\xb2\xa3\x78\x7a\x07\xfa\x9f\xcb\x5a\xb8\xd8\x3f" - "\xdb\xe9\xda\xef\xd8\x76\x0a\x1f\xc0\x76\x0a\xff\x17\xb1\x9d\x1e" - "\xac\xbf\xaa\xbf\x03\xd5\x21\x0b\x13\x86\xa6\x43\x62\xbc\x9e\x7f" - "\xb8\xaa\xbf\x07\xa3\x7d\x74\xf8\xd0\x68\xff\xcb\xea\xc0\xf5\xf7" - "\xe2\xa5\x2e\xfd\xbd\x78\xa9\x77\xfd\xfd\xd0\x87\x57\xf5\xb7\x3f" - "\xfa\x3b\x66\xf7\xd0\xf4\xf7\x43\x85\x9e\xfa\xfb\xe1\xd1\xbe\xe9" - "\xef\xc5\x93\x86\x5f\x7f\x2f\xd6\x79\xea\xef\xc5\x3c\x36\x81\x62" - "\xd1\xfd\xfe\xeb\xef\xc5\xc7\xbd\xeb\xef\xc5\x27\x3d\xf5\xf7\xe2" - "\x32\xae\xa7\x1f\x56\x71\xfd\xbd\xb8\x8a\xa7\x2f\x9a\xe7\x9e\xee" - "\xd2\xdf\x3c\x9d\xeb\xef\x87\xc3\xfc\xd3\xdf\xa1\xdf\xb1\xfe\xd6" - "\x0c\xa0\xbf\x35\xff\x22\xfa\xfb\x3f\xf3\xaf\xea\x90\x40\x75\xc8" - "\xc3\xba\xa1\xe9\x90\x58\xaf\xfe\x1f\x07\xd7\x21\x8f\x94\xb8\x74" - "\xc8\x23\x25\xde\x75\xc8\x23\x13\xae\xea\x10\x7f\x74\xc8\x7f\x36" - "\x0e\x4d\x87\xfc\xca\xe2\xa9\x43\x1e\x5d\xe8\x9b\x0e\x79\xe4\xb1" - "\xe1\xd7\x21\x8f\x24\x7a\xea\x90\x47\x67\xf3\x3a\xc5\x66\xfb\xaf" - "\x43\x1e\x9d\xe4\x5d\x87\x3c\x7a\x83\xa7\x0e\x79\xc4\xc6\x75\xc5" - "\xa3\x0b\xb8\x0e\x79\x54\x4a\x8f\x35\xb8\xa7\xbb\x74\x08\x4f\xe7" - "\x3a\xe4\xd1\x58\xff\x74\xc8\xa8\xef\x58\x87\xa8\x06\xd0\x21\xaa" - "\x7f\x11\x1d\xb2\xb4\x21\x70\x39\xb6\x2c\xc1\x25\xc7\x96\x25\x78" - "\x97\x63\x8f\x9f\xbc\x2a\xc7\xfc\x91\x63\x8f\x26\x0e\x4d\x8e\x3d" - "\x5e\xea\x29\xc7\xe2\x26\xf8\x26\xc7\x96\xdd\x34\xfc\x72\x6c\xd9" - "\x2c\x4f\x39\x16\x27\x9d\x7f\x7d\xec\x97\xfe\xcb\xb1\x65\x5f\x78" - "\x97\x63\xcb\xbe\xf6\x94\x63\xcb\x2a\xb8\xbc\x8a\x0b\xe3\x72\x6c" - "\x59\x3d\x4f\x7f\x2c\xc6\x3d\xdd\x25\xc7\x78\x3a\x97\x63\x71\xda" - "\xc1\xe4\x18\xf6\x8b\xda\xf0\x5e\xfd\xe2\x29\xb9\x5f\x3c\x91\xff" - "\x41\xa1\xdc\x2f\x9e\x60\x36\x9a\x58\xf8\x90\x6e\x7b\x2a\x51\x1a" - "\x31\x76\x0c\xc8\x88\xa4\x47\xb0\x5f\x3c\x31\x02\xf7\x89\xa8\x9b" - "\x40\xee\xb5\x48\x72\x30\x0d\xe4\x60\x0b\x3c\xa3\x5f\xb5\x29\x0f" - "\xe9\x50\x7e\x61\x4c\x0d\x7c\xe6\xf2\xd0\x3a\x02\x63\xd7\xb0\xb5" - "\x79\xb7\x7e\xc3\xfa\x4a\x87\xd4\x57\x3a\x78\x5f\x91\xcf\xee\x6d" - "\x6c\xa1\xa2\x73\x9d\x6e\x7c\x74\x7c\x10\xc5\xfe\xc3\xce\x84\x41" - "\xff\xa1\xeb\x74\x21\x85\xc9\xd0\x67\xac\xad\x04\x7d\xe7\x63\x9f" - "\x09\xde\xac\x08\xa1\x1d\x09\xa3\x41\x26\x72\xd9\x27\x56\x8f\x70" - "\xa0\x1f\xac\x75\x20\xfb\xda\x41\xf6\xb5\xbb\xfa\x0a\xae\xb7\x77" - "\xac\xd3\x69\x6d\xeb\x74\x53\xbb\x3b\x40\xf6\x59\x7b\xf7\x93\x89" - "\x61\x7b\xdb\x51\xf6\xb5\xb2\x7e\xc2\x64\x1f\xf4\x0d\xb1\x03\x64" - "\xdf\xaf\x25\xd9\xd7\xa1\x43\x59\xaf\xd9\xfb\x24\xc8\xbe\xb8\x33" - "\x5c\xf6\x49\x36\xdc\x8d\x28\xfb\xd6\xe9\x84\xdf\xb6\x4b\xb2\x6f" - "\x39\xca\xbe\x23\xd0\x47\xde\xf2\x94\x7d\xc1\x81\xca\xbe\xe5\xf5" - "\x9e\xfd\x64\xc5\x3d\xbe\xf5\x93\x27\x16\x7a\xeb\x27\xdd\xb9\x81" - "\xf6\x93\x27\x96\x7a\xf6\x93\x15\x72\xdf\x5d\xe5\x7f\x3f\x59\x31" - "\xba\xa7\x9f\x3c\xd5\xbb\x9f\xac\x18\xe7\xd9\x4f\x9e\xe0\xb1\xe2" - "\x15\x2b\xe6\xf0\x7e\xf2\x84\x9d\xa7\xc7\x25\xb8\xa7\xbb\xfa\x09" - "\x4f\xe7\xfd\x64\xc5\xfc\xab\xeb\xe5\xdf\x37\x7d\x1f\xef\xd5\xff" - "\xd3\xd5\xf5\xf2\xc1\xc6\x8c\x2b\x96\x0e\x6d\xcc\xf8\x64\xd4\xd5" - "\xf9\xf6\x40\x69\xbf\x52\x3d\x34\xda\xff\xda\x6b\xfc\x9f\xab\x73" - "\x25\x83\xd1\xfe\x49\xc3\xd0\x68\xbf\x6a\xf6\x60\x63\x0c\xef\xb6" - "\xd4\x53\x2d\x35\x3d\x63\x8c\xa7\x5a\xe4\x7d\xbe\x7d\xc7\x18\x4f" - "\xfd\xca\xf3\x1c\xdf\xaa\xaf\x7b\x9f\xe3\x1b\x6c\xec\xe1\xb8\x3a" - "\xf6\x00\x5e\x27\x28\x87\x36\xf6\x78\x6a\xba\xa7\x4d\x95\xb8\xd3" - "\x37\x9b\xea\xa9\x97\xbd\xd9\x54\x8e\x80\xc7\x1e\x4f\x95\x79\xda" - "\x54\x89\x1b\x25\x6c\xbc\xe1\xbf\x4d\x95\xf8\x98\x77\x9b\x2a\x71" - "\xa5\xa7\x4d\x95\x38\x9b\xdb\x4e\x89\xf9\xdc\xa6\x4a\x5c\xc0\xd3" - "\x57\x1d\x70\x4f\x77\xd9\x54\x3c\x9d\xdb\x54\x89\x85\x57\xd7\xd1" - "\xbf\x6f\x36\xd5\x9a\xf0\xab\x7a\x3d\x50\xdd\x92\x58\x36\x34\xdd" - "\xb2\xf6\x3b\xdc\xff\xf9\x7d\xd7\xeb\x6b\xe2\x86\x46\xfb\xa7\x07" - "\xdc\xff\x39\xb0\x5e\x5f\x57\xe1\xd2\xeb\xeb\x2a\xbc\xeb\xf5\x75" - "\x77\x78\xea\xf5\xa7\x2b\xaf\xea\xf5\x40\xf4\xfa\xda\xa6\xa1\xe9" - "\xf5\x64\x87\xa7\x5e\x4f\x59\xe5\x9b\x5e\x5f\xb7\x7e\xf8\xf5\xfa" - "\x3a\x83\xa7\x5e\x4f\x59\x2c\x61\x23\xd7\x7f\xbd\x9e\x72\x97\x77" - "\xbd\x9e\x72\x8f\xa7\x5e\x4f\xd1\x70\xfd\x9d\x92\xc0\xf5\x7a\xca" - "\x74\x9e\xfe\xb4\xd1\x3d\xdd\xa5\xd7\x79\x3a\xd7\xeb\x29\x29\x57" - "\xd7\xd7\xbf\x6f\x7a\xfd\x19\xaf\xfe\x8f\xaf\xea\x96\xc1\x74\x4b" - "\xca\x10\xc7\x8c\xcf\x7a\x8d\xff\x3b\xb8\x6e\xd9\x10\xee\xd2\x2d" - "\x1b\xc2\xbd\xeb\x96\xf5\xb9\x9e\xba\x25\x6d\xca\x55\xdd\x12\x88" - "\x6e\x49\x9d\x3d\x34\xdd\xb2\x3e\xd6\x53\xb7\x6c\x38\xe2\x9b\x6e" - "\x59\x7f\x7c\xf8\x75\xcb\xfa\x16\x4f\xdd\xb2\xa1\x8c\xd7\xe9\xd9" - "\xaf\xfd\xd7\x2d\x1b\x76\x7a\xd7\x2d\x1b\xf6\x78\xea\x96\x0d\x89" - "\x5c\x87\x6c\xa8\xe2\xba\x65\x43\x26\x4f\x7f\xb6\xd5\x3d\xdd\xa5" - "\x5b\x78\x3a\xd7\x2d\x1b\xea\xaf\xae\xbb\x7f\xdf\x74\xcb\xc6\x01" - "\xf7\xff\x0e\x2c\xdf\xd2\xed\x2e\xf9\x96\x6e\xf7\x2e\xdf\xd2\x57" - "\x7b\xca\xb7\x8d\xce\xab\xf2\x2d\x10\xf9\xb6\xa1\x65\x68\xf2\x2d" - "\x7d\xb6\xa7\x7c\xcb\xf8\x83\x6f\xf2\x2d\xfd\x8d\xe1\x97\x6f\xe9" - "\x55\x9e\xf2\x2d\x23\x5f\xc2\xc6\x51\xff\xe5\x5b\xc6\xd3\xde\xe5" - "\x5b\xc6\x7a\x4f\xf9\x96\xb1\x80\xcb\xb1\x8c\x7d\x5c\xbe\x65\xc4" - "\xf1\xf4\x8d\xd5\xee\xe9\x2e\xf9\xc6\xd3\xb9\x7c\xcb\x28\x1b\xda" - "\x7a\xbc\x7e\xb6\x6b\x3d\x5e\xcf\x78\x21\x16\xec\x8a\xed\xbb\x1e" - "\xbf\xf9\x55\x4f\x7f\x41\x99\x77\xb0\xb5\x79\xec\x33\x36\xee\xd3" - "\xa1\xdf\x75\xfa\x49\xbb\x62\xaf\xae\xd3\x5f\xca\x75\xfa\xcd\x69" - "\x9e\xfd\x47\x7f\xca\xb7\xfe\xb3\xf9\xfc\xf0\xaf\xd3\xeb\x7b\xf9" - "\x61\xd1\xd7\x4b\x7d\xfa\xa2\xff\xfd\x47\xff\x67\xef\xfd\x47\xff" - "\xa6\x67\xff\xd1\x4b\x63\x4c\x7d\x0b\xef\x3f\xfa\x12\xa9\x5f\xd9" - "\xdd\xd3\x5d\xfd\x87\xa7\xf3\xfe\xa3\xb7\xfa\x62\x1f\x38\xd4\x3b" - "\x77\xa3\xbe\x9f\xd9\x74\xbd\xb3\x07\xe7\x29\x12\xce\xfb\xb3\x0f" - "\x9e\xe0\xfa\x82\xd9\x06\xfb\x56\xcc\x1b\xd4\x3e\x68\x91\xec\x83" - "\xf8\xbe\xf6\x81\x6c\x1b\x14\x02\xbe\x5f\xf4\x69\x8d\x5e\xc2\x3b" - "\xda\x06\x17\xfc\xb5\x0d\x26\xb9\x6c\x83\xec\x5e\xb6\xc1\xaf\x7b" - "\xd9\x06\x0c\xef\xcd\x1e\x78\xef\x63\x1b\xf4\xe0\x7d\xb8\x6c\x83" - "\xad\x09\x57\xd7\xe8\x03\x1d\x77\x6e\x51\x0e\x6d\xdc\xf9\x7c\xcb" - "\xd5\xb9\xfc\x40\x69\xbf\x75\x88\x73\xf9\xdb\xe2\xae\xce\xb7\x04" - "\x4a\xfb\xac\x21\xfa\x72\x30\x34\x05\x3e\x1e\xd9\x5e\xea\x1a\x8f" - "\x6c\x2f\x95\xed\x2b\x94\xbb\xcc\x67\x16\xc8\xda\xdc\x64\xb8\x2e" - "\x10\xb2\x3d\x99\xc5\x3c\x50\x99\x5b\x8e\x93\xa4\x74\xb4\xb9\xb6" - "\x4f\x89\x4e\x73\xb7\xb9\xb2\x5f\x96\xed\xad\x68\xb4\xc5\xc0\xb6" - "\x42\xbb\x4a\x1e\x83\xe4\xb7\x0f\xb2\x7f\xf8\xa6\x15\xf3\x70\xcc" - "\xd2\x1d\xbc\x73\xf7\xbf\xee\x78\x65\x5b\xe9\xd0\xc6\x2b\x39\xad" - "\x9e\xf6\x96\xf1\x61\xdf\xec\xad\xed\x2b\x87\x7f\xbc\xb2\x3d\xc5" - "\xd3\xde\x32\x46\x49\x38\xf9\x95\xff\xf6\x96\xf1\x06\xef\xf6\x96" - "\xf1\x16\x4f\x7b\x6b\xbb\x83\xdb\x55\xc6\xc5\xdc\xde\x32\x6a\x78" - "\x7a\x76\xac\x7b\xba\xcb\xde\xe2\xe9\xdc\xde\x32\xc6\xf9\x68\x6f" - "\x15\x0c\xc1\xde\x9a\xff\xfd\xb1\xb7\x26\x5f\xe1\xf6\x56\x6e\xa3" - "\x0f\x7a\x67\x77\x2f\xbd\x33\xef\xaa\xde\x41\x59\x63\x4c\x19\x9a" - "\xde\xd9\xb1\x78\x50\xda\x1b\xdd\x68\x8f\x32\x5f\xa2\xbb\x73\xfa" - "\x8a\x79\x01\xd3\x1e\x64\x7d\x51\xfa\xf7\x99\xee\x79\xda\xa1\xd1" - "\x3d\xbf\xe6\xaa\xad\x15\x28\xed\x77\x14\x0e\x8d\xf6\xbb\x06\x8c" - "\xff\x38\xb0\xad\xf5\xc2\xac\x0f\x7a\x6c\xad\x17\x66\xf5\xb6\xb5" - "\xd0\xb6\x5a\x68\xe7\x36\xd7\x76\xb0\x95\x72\xd6\x80\xdd\x95\x4a" - "\x88\xb9\xe5\x6d\x62\x04\xdb\x2b\xe7\x1c\xd8\x5f\x89\x60\x7f\x39" - "\xfe\x20\xd9\x5f\xbb\x5f\xf1\xb4\xbf\x7e\x7b\x43\xbf\xf6\x57\xb0" - "\xcb\xfe\x72\x80\x6d\xd5\xfd\x87\x15\xf3\xf2\xcf\xb9\xd9\x62\xbf" - "\xe9\x6b\x8b\x75\xe5\xee\x2c\xe8\xba\x69\xc5\xfc\x6e\xb0\xc7\x06" - "\xb2\xc5\x18\x26\xfa\xb1\xc7\xfe\xff\x61\x8b\xed\x0c\x1b\x9a\x2d" - "\xb6\x3b\xc5\xd3\x16\x7b\xe1\x0b\xdf\x6c\xb1\xdd\xdf\x7a\x9d\xfb" - "\x0a\xd8\x16\x7b\x81\x78\xda\x62\x2f\xd4\xf0\x3a\xed\x3a\xe2\xbf" - "\x2d\xf6\xc2\xab\xde\x6d\xb1\x17\xde\xf0\xb4\xc5\x5e\x90\xce\x9e" - "\xbe\x60\xe1\xb6\xd8\x0b\x85\x3c\x7d\x57\x95\x7b\xba\xcb\x16\xe3" - "\xe9\xdc\x16\x7b\xa1\xcd\xc7\xb5\xb1\xdd\x0e\xd0\xe9\xdf\xfd\x7e" - "\xca\x81\xd6\xc6\x86\x6b\x3f\xe5\xa4\x2b\x7c\x6d\xec\xbf\x06\x9f" - "\xff\xba\x6a\x13\xf4\x23\x6b\x7e\x47\x86\xa6\x97\x0a\x2c\x57\x6d" - "\x82\x40\x69\xff\x5f\x43\x9c\xfb\x7a\x71\x69\xe0\x36\x41\x91\xce" - "\x35\xff\x52\xa4\xf3\x6f\xfe\xa5\xb0\xc8\x53\xff\xbf\xd4\xbf\xfe" - "\xbf\x3a\xff\xe2\x87\xce\xdf\xa3\x1b\x9a\xce\x2f\x4c\xf0\xd4\xf9" - "\x45\xc7\x7d\xd3\xf9\x85\xa7\x86\x7f\xfe\xa5\xd0\xe6\xa9\xf3\x8b" - "\x4c\xbc\x4e\x2f\x9e\xf0\x5f\xe7\x17\xbd\xec\x5d\xe7\x17\xbd\xe2" - "\xa9\xf3\x8b\x36\x72\xdd\x5e\xd4\xc0\x75\x7e\x51\x3e\x4f\x7f\xb1" - "\xd1\x3d\xdd\xa5\xf3\x79\x3a\xd7\xf9\x45\x16\xff\xd6\xbb\x42\xaf" - "\xd0\xf5\x2e\xcd\xbf\xc8\x7a\xd7\xde\xd8\xab\x7a\x27\x50\xbd\x53" - "\x64\x1b\x9a\xde\x29\x19\xd4\xff\x87\x77\xbd\xf3\xfb\x12\x97\xde" - "\xf9\x7d\x89\x7f\x7a\xe7\xf7\x13\x3c\xf5\xce\xcb\x7b\xae\xea\x9d" - "\xa1\xea\x9d\xbd\x25\x43\xd3\x3b\xff\x6d\xf1\xd4\x3b\xfb\x7c\xf4" - "\x7f\xf4\x7b\xaf\xfe\x8f\x02\xd7\x3b\xbf\xef\xe5\xff\x68\x9f\xe4" - "\xff\xe8\xe5\x00\xfc\x86\xec\x9b\xe4\x5d\xef\xec\xeb\xe5\xff\xe8" - "\xf7\x92\xff\xa3\x7d\x92\xff\xa3\x7d\x52\xfa\xcb\x31\xee\xe9\x2e" - "\xbd\xf3\xb2\x9b\xdf\x90\x7d\x57\xfd\x1f\x7d\xef\xf6\x61\xfe\x61" - "\x08\xf2\xaf\x34\xd3\x25\xff\x4a\x33\xbd\xef\xc3\xfc\x9f\xf3\x9e" - "\xfb\x30\xff\xf8\xfc\xd5\x7d\x98\x81\xc8\xb7\x7d\x43\xf4\x8b\xf4" - "\x3f\x26\x4f\xf9\xf6\xca\xad\xbe\xc9\xb7\xd2\x7b\x86\x5f\xbe\x95" - "\x2e\xf0\x94\x6f\xaf\x84\x4b\xd8\x08\x40\xbe\x95\x5e\xf4\x2e\xdf" - "\x5e\x51\x78\xca\xb7\xd2\x06\x2e\xc7\x5e\x99\xc9\xe5\x5b\x69\x2b" - "\x4f\xff\x63\x8c\x7b\xba\x4b\xbe\xfd\xd1\x4d\xbe\xbd\x32\xdb\xbf" - "\x75\xcd\x80\xec\xea\xcb\xb0\xae\x39\x5c\x76\xf5\x95\xbe\xae\xf9" - "\xa7\xb2\xab\xf3\x68\x81\xd8\xd4\xaf\x2c\x18\x9a\x4d\xbd\x5f\x17" - "\xb8\x4e\x79\x5d\xed\xd2\x29\xaf\xab\xbd\xad\xef\xe4\x00\xee\x8c" - "\x60\x13\x67\x9f\x23\xca\xed\xb8\xbe\xd3\x50\x4b\x72\x71\x7d\x67" - "\x8d\xbc\xbe\x53\x24\xd9\xd9\xaf\x6d\xf6\xb4\xb3\x5f\x55\xf4\x67" - "\x67\xa3\x7d\xed\x04\xdb\xd9\xd1\x7b\x5d\xe7\x91\xfe\x75\x51\x57" - "\xf0\xce\x82\x8b\x7f\x58\x31\xdf\x5f\x5d\xf4\xd2\x06\xae\x8b\x5e" - "\xfc\xde\xeb\xa2\x3f\xd9\x87\xa6\x8b\x5e\x5b\xe0\xa9\x8b\x5e\x7f" - "\xd3\x37\x5d\xf4\xda\xd1\xe1\xd7\x45\xaf\x35\x7a\xea\xa2\xd7\xf7" - "\xf1\x3a\xed\x0f\x20\xb6\xe4\xeb\xcf\x7b\xd7\x45\xaf\xe7\x7a\xea" - "\xa2\xd7\xe3\xb8\xce\x79\xbd\x9c\xeb\xa2\xd7\x53\x78\xfa\xfe\x7d" - "\xee\xe9\x2e\x5d\xc4\xd3\xb9\x2e\x7a\xbd\xca\xbf\x39\x9e\x51\x57" - "\xe8\x1c\x8f\xea\x5f\x64\x8e\xe7\xcf\x73\x02\x97\x89\x07\x48\x4d" - "\xcf\xf9\x8d\x03\xa4\xcf\x3c\x43\x2a\xd8\xdb\xed\x7c\x9d\xbb\x67" - "\x9e\xc1\x72\x52\x92\x7f\x7f\x7d\xc6\x53\xfe\xfd\xc5\xab\xfc\x1b" - "\x68\x2d\x1b\xe7\x15\x9c\x20\x1b\x31\x46\x66\xc0\x6b\xd9\xa9\xdf" - "\x77\x99\xf7\xfa\x10\xfd\x2b\xff\x35\xca\x53\xe6\x1d\x78\xd5\x37" - "\x99\xf7\xd7\xb7\xbd\xca\xbc\x80\xcf\x71\xfc\xb5\xc6\x53\xe6\x1d" - "\x28\xe0\x75\xfa\xf3\x9b\xfe\xcb\xbc\x03\xeb\xbd\xcb\xbc\x03\x9b" - "\x3d\x65\xde\x81\xc5\x5c\xb6\x1d\xd8\xcf\x65\xde\x81\x04\x9e\xfe" - "\xe7\x72\xf7\x74\x97\xcc\xe3\xe9\x5c\xe6\x1d\x28\x1f\x48\xe6\x51" - "\xe3\x92\x82\x7c\x41\x2c\x83\xab\x1c\xea\x38\x09\xb0\x61\x82\xdf" - "\xd5\xc0\xe3\x71\xf0\xdb\x6b\xac\x17\x6b\xf0\x92\x02\x51\x0f\x75" - "\x16\x88\xc2\x6c\xfd\xc6\x64\x9a\xec\x80\xef\xbe\x21\x9d\x59\x5b" - "\x52\x10\xea\x18\x35\x5f\xa4\x09\x04\xf8\x52\xc0\xe2\x67\x42\x7e" - "\x3c\x1f\xa4\x4d\x25\x21\xe7\x14\x6f\xc4\xca\xf9\xa0\xbe\x21\xcd" - "\x8a\x37\x26\x60\x19\x9d\x59\x6f\xc4\x43\x5b\xaa\xbc\xd6\x15\xca" - "\x8a\x7e\x65\x2a\xd9\xe4\xa0\x5f\x99\xd6\xb4\x93\x16\xc5\x1b\xaf" - "\x86\xb6\x8d\x9a\x4f\x33\x62\x09\xda\x72\x65\x93\xad\x4a\x2c\xd3" - "\xb4\xa6\x0b\xdf\xe5\xe3\x3b\x27\xd4\x31\x7d\x35\x11\xf2\xda\x47" - "\xa9\x40\x4e\x8c\xc8\xb0\xd1\xd6\xb5\x0e\xa8\x33\x60\xf3\xdd\xa9" - "\x8d\xca\xd7\x5f\x84\x34\x27\x09\xc7\x78\xa6\x58\x06\xd8\xb3\x58" - "\x9f\x3f\x17\x43\xfe\xfe\xea\xf0\xfc\x6b\x64\xe6\x88\x5b\xa8\xc5" - "\x3f\xdc\xfc\x9f\xd2\x1b\x1d\x43\x37\x4f\x25\xa6\x19\x40\x3b\x2d" - "\x11\xfa\x7b\xef\xe7\x77\x06\x3a\xff\xae\xc2\x18\xc9\x19\x7b\x88" - "\xb0\x43\x1c\xa5\x3a\xbc\x91\xc5\x28\xb6\x76\x66\xfd\x5f\xa3\x45" - "\x71\x9d\x12\x69\x8e\x71\x2d\x31\xbe\x36\xe0\x86\x40\xba\xb5\x32" - "\x8d\x90\xde\xbc\x48\x8e\x5f\xbd\x5c\x9b\xb2\x6a\xf5\xca\xb5\xcf" - "\xa4\x68\x6f\x8a\x1f\x43\x16\xaf\x5d\xab\x5d\xbd\x7c\xcd\x7a\xad" - "\xfb\x9b\x9f\x68\xe3\x57\xad\x5b\xfe\x44\xe2\xca\x5b\x57\xaf\x48" - "\x1a\x83\xc2\xd7\xad\x1e\x61\x58\x17\x31\xeb\xff\x1c\xc5\xbb\x08" - "\xf9\xed\x78\xa2\xc4\x7a\x75\x66\xfd\x2d\x4e\x8e\x7b\x9a\xf7\x3b" - "\x6a\x13\x20\x4f\x06\xc8\xc7\x1d\xe9\xa3\x30\x6f\xe2\x5e\xa8\x57" - "\x31\xd4\x1b\xea\x08\x75\xfe\x9b\x51\xae\xb3\x8c\x89\x0c\xc4\x44" - "\x7a\x3b\x60\xf0\x6f\xaf\x86\xda\x47\xfd\x3b\xa5\xb1\xd8\x3e\x1b" - "\xf4\x13\x05\xa4\x39\x99\x2e\xcb\x5d\x52\x00\xff\xad\x96\x31\x86" - "\xff\xa5\x79\x4b\xe2\x3a\xb1\x9f\xd0\x84\x7b\x79\x9f\x2a\x2f\x79" - "\x58\xa7\x20\x3c\xee\xea\xdf\x6c\xae\xb8\xab\xe5\x6c\xae\x1a\xea" - "\xd1\xd6\x99\x55\xae\xb6\x90\x36\x0b\xa6\x63\xbc\x60\x8c\xdf\x8d" - "\x75\x86\x76\x81\x2e\xa5\x26\xaa\x97\xb0\x6f\xf8\x93\x49\x34\xbc" - "\x6f\x37\x2b\x2f\x90\x68\x07\xed\xa6\xd9\x7f\x32\xd5\xd9\x6c\x24" - "\x74\x73\xd2\x0a\x3a\xf2\x6f\x20\xb3\x57\xad\xdc\x3b\x1e\xfa\x50" - "\xf6\xfb\x76\x9a\x5d\xd9\xf4\xf0\x2d\x44\x03\x65\xbb\xc7\x7f\x55" - "\xfa\xc7\xff\x72\xc6\x7f\xe4\x23\xd4\x47\xe2\x63\x79\x79\x65\x4a" - "\x5f\x3e\xf6\xe0\xef\x15\x91\x1c\x01\x2c\x50\xf5\x36\x4b\xb4\x93" - "\xd3\x11\xfb\x6e\x47\x46\x02\xb9\x9d\xd1\xee\xcd\x24\x31\x6f\x9b" - "\x49\x34\x6e\xb3\x53\xe3\xb6\x16\xa0\x59\x5a\x5e\x2a\xd1\x2e\x73" - "\x6a\x48\xee\x05\x12\x69\xcd\xdd\x66\x09\x56\x64\x2a\xc0\x1e\x11" - "\x40\x9f\x44\x82\xcc\x88\x94\xfa\x7b\x1a\xd2\xf1\xfd\x36\x42\x1e" - "\x5c\x47\xc8\x57\x73\x48\x50\x31\xfc\xcf\xbf\xf6\xbc\xc9\xf4\x3f" - "\xcd\x2a\xb7\xed\x85\xff\x62\x5c\x5f\x3f\xff\xbf\xd1\x6b\xbf\xeb" - "\x69\xb7\x21\xae\xff\x76\xbf\x95\x20\xe6\x19\xa2\x44\xa3\x21\x8d" - "\x1a\x0d\xf1\x7d\xdb\x6d\x88\xe3\xed\x1e\xd1\x3e\xfc\xed\x7e\x8b" - "\xfb\xbf\xce\x7a\xb3\x2d\xb0\x76\xbf\x95\xe2\x43\xbb\xbd\xf0\xfb" - "\x60\x1c\xb4\x1b\xf8\x6d\x00\x7e\x1b\xfa\xe1\xb7\x41\xe2\xf7\xd8" - "\xe6\xe1\x6f\xf7\xc1\x99\xbc\xdd\x6f\xb5\x04\xd6\xee\x83\x5e\xe5" - "\x9f\xab\xdd\xd9\x5e\xf8\x5d\x11\x2b\xe6\x65\x03\xbf\xb3\x81\xdf" - "\xd9\xfd\xf0\x3b\x5b\xe2\xf7\xb8\x8f\x86\xbf\xdd\x15\xdc\xff\x61" - "\xd6\xc1\xa6\xc0\xda\x5d\x11\xef\x43\xbb\xbd\xf0\xfb\xed\x18\x68" - "\x37\xf0\x3b\x1b\xf8\x9d\xdd\x0f\xbf\xb3\x25\x7e\xdf\x9d\x33\xfc" - "\xed\x7e\x3b\x82\xb7\xbb\xa2\x21\xb0\x76\xbf\xed\x75\xff\x8b\xab" - "\xdd\x39\x5e\xf8\xfd\xce\x7c\x31\x2f\x07\xf8\x9d\x03\xfc\xce\xe9" - "\x87\xdf\x39\x12\xbf\x1f\xbd\x6f\xf8\xdb\xfd\x4e\x18\x6f\xf7\xdb" - "\x35\x81\xb5\xfb\x1d\xaf\xfb\xdf\xdd\xe4\x79\x2b\xc8\xec\x3e\x3c" - "\x37\xa7\xcd\x26\xb7\x5d\xc0\xf6\xbf\x5b\x4e\x83\xb7\xb5\x8e\xdd" - "\x9c\xa9\x70\xa8\xb7\xb5\x8d\x85\xb1\xdc\x4b\x7a\x31\x21\xd4\x42" - "\x46\x43\x5b\x13\x68\x9e\x31\x13\xef\x22\x94\xe3\x00\xd9\xef\x54" - "\x6f\x6b\xe9\x32\x2e\x49\xdb\xfe\x24\xd1\x66\x58\x89\xa6\x2e\xdd" - "\x42\xd2\x93\xa8\xb5\x8e\x7c\x41\x82\x2d\x44\xc0\xf9\xb2\x0f\xda" - "\xca\xc9\x9a\x64\x4a\xa1\xec\x97\x71\x8c\x99\x77\x9a\x44\x82\x4d" - "\x9c\x49\x41\x7f\xe4\x8b\x44\x0b\xe5\x47\x22\x2d\xa1\x6c\x7d\xe8" - "\x62\xa2\x78\xe7\x09\x3b\x41\x7a\x22\x6d\x61\x3c\x1a\xc9\xe8\x6a" - "\x23\xe4\x3f\x1e\xe5\x74\x7d\xe9\x49\x7f\xe9\xfa\x2e\x5f\xff\x33" - "\x1a\x88\xd9\xd2\x85\x31\x03\x34\x78\xe6\x1e\xd2\x75\x75\x49\xed" - "\x30\x16\x79\xa7\x86\xe6\x6e\xb3\x8a\xa0\xb3\xfc\x2c\xd7\xab\xff" - "\x6b\x37\x79\x9a\x00\x32\xb3\x0f\xd6\x5c\xf4\xae\xd4\xd1\x60\x43" - "\x02\xa7\xb7\x21\x71\x6c\xd3\x88\xf6\xfe\xe9\x6d\x48\x70\x80\xce" - "\x71\xaa\x0d\xf1\xbe\xd3\xbb\x72\x9c\x27\xbd\x0d\x51\x97\x87\xde" - "\x26\x29\xfe\xa9\x21\xd3\x93\xde\xa6\x02\x4e\x6f\xd3\x1c\x9a\x6b" - "\x48\x12\x41\x57\xfa\x57\x6e\xe5\x2c\x1f\xe8\x0d\xf8\xee\xab\xc3" - "\x5c\xf4\x3e\x04\x63\x4e\x83\x84\x6f\x03\xe0\x7b\x6c\xb3\x17\x7a" - "\x03\xbe\x0d\x80\x6f\x83\x1f\xf8\x3e\xb4\xb9\x17\xbd\x2f\x13\xbe" - "\x0f\x49\xf3\x7f\xd9\xbd\xf0\x7d\x48\xc5\xe9\x5d\xb9\x1f\xe8\x0d" - "\xf8\x36\xf8\x89\xef\x43\xfb\x7c\xd0\x1f\x80\xef\xbe\xba\xd3\x45" - "\xef\x2a\x15\x0d\xce\x96\xf0\x9d\x0d\xf8\x1e\xf7\x51\xff\xf4\xce" - "\x06\x7c\x67\x03\xbe\xb3\xfd\xc0\xf7\xe1\x6f\x3d\xe9\x9d\x7d\x99" - "\xf0\x7d\xb8\x42\xa2\x77\x2f\x7c\x1f\x4e\xe3\xf4\x3e\x1c\x41\x73" - "\xb3\x01\xdf\xd9\x7e\xe2\xbb\x2a\xcc\x07\x7a\x03\xbe\xfb\xea\x6c" - "\x17\xbd\x8f\xa4\x01\xbd\x25\x7c\x67\x03\xbe\xef\xce\xf1\x42\x6f" - "\xc0\x77\x36\xe0\x3b\xdb\x0f\x7c\x1f\x59\xde\x8b\xde\x97\x09\xdf" - "\x47\xb8\xfd\x67\xcc\xe9\x85\xef\xaa\x56\x4e\xef\x2a\x23\xd0\x1b" - "\xf0\x9d\xed\x27\xbe\x8f\x6c\xf5\xc1\x4e\x00\x7c\xf7\xb5\x15\x5c" - "\xf4\x7e\xaf\x95\x06\xe7\x48\xf8\xce\x01\x7c\x3f\x7a\x5f\xff\xf4" - "\xce\x01\x7c\xe7\x00\xbe\x73\xfc\xc0\xf7\x7b\x1f\x7a\xd2\x3b\xe7" - "\x32\xe1\xfb\x3d\x29\xfe\x65\x4e\x2f\x7c\xbf\x17\xcb\xe9\x7d\xc4" - "\x41\x73\x73\x00\xdf\x39\x7e\xe2\xfb\x3d\x5b\x20\xf6\xc9\xba\x22" - "\xa2\xf2\xa4\x79\xf5\xd2\x4b\x67\xa3\x54\xdf\xff\xdd\xd8\x28\xd5" - "\x9a\xfe\x6d\x94\xf7\x6b\x38\xcd\xdf\x4f\x0a\xcc\x46\xa9\xf6\x7a" - "\xfe\x61\x20\x1b\xa5\x2f\xcd\x8f\xd6\x5f\x3a\x3b\xe5\xe8\x9b\xdf" - "\x8d\x9d\x72\x74\x6b\xff\x76\xca\xd1\x28\x4e\xf3\xea\x96\xc0\xec" - "\x94\xa3\x5e\xfd\x1f\x0c\x64\xa7\xf4\xa5\xf9\x07\xf3\x2e\x9d\xad" - "\xf2\xc1\xad\xdf\x8d\xad\x72\xcc\xde\xbf\xad\x72\xec\x00\xa7\xf9" - "\xb1\xd8\xc0\x6c\x95\x0f\x62\x02\xb1\x55\xfa\xd2\xbc\xa6\xfc\xd2" - "\xd9\x2b\x35\x2f\x7f\x37\xf6\x4a\x4d\x62\xff\xf6\x4a\x8d\x34\xfe" - "\xf9\xa0\x26\x30\x7b\xa5\xc6\x87\xf1\x4f\x5f\x7b\xa5\x2f\xcd\xeb" - "\x66\x5e\x3a\x9b\xa5\x6e\xc2\x77\x63\xb3\xd4\x5a\xfa\xb7\x59\x6a" - "\x0b\x39\xcd\x6b\xa3\x02\xb3\x59\xea\xbc\xc6\x3f\x19\xc8\x66\xe9" - "\x4b\x73\x73\xc9\xa5\xb3\x5b\xcc\xd9\xdf\x8d\xdd\x62\x5e\xdc\xbf" - "\xdd\x62\xd6\x70\x9a\xd7\x1d\x08\xcc\x6e\x31\xef\x0f\xc4\x6e\x41" - "\x5a\x23\xcd\xd1\x56\xe1\x34\xff\x28\x89\x86\x6c\x33\x75\x83\x3d" - "\x12\x0c\x74\x0f\x6e\x23\x42\x11\xd2\xbc\x91\xd3\xdc\x19\x62\xcc" - "\x04\xfa\x24\x20\xcd\x58\x3b\xfe\x19\x1e\xe2\x34\x6e\x6b\xa3\x02" - "\x81\xb6\xa8\xc8\x69\x45\xfd\x26\x87\x9e\x84\x68\xd3\x37\xc3\xef" - "\x8f\x96\x63\x1e\x6d\x7a\xd6\x49\x68\x63\x10\xae\x51\x38\x72\x97" - "\x68\x9d\xc1\xdb\x4b\x4e\x2b\x3e\x7c\x9b\x4e\x79\x48\xdb\x0d\xb6" - "\x04\x7d\x2a\x3c\xcc\xdc\x56\x46\xcc\x8e\x63\xa4\xae\xf1\x2d\x22" - "\x86\x18\xf5\xb7\x3b\x88\x8e\xfe\x53\x17\x56\x93\x62\x21\xce\x15" - "\xe1\x6a\x73\x5a\x35\xe0\xe2\x2f\x24\xba\x95\x5e\xa0\x5f\xea\xd4" - "\xdd\xc1\xf9\x16\x67\xb0\x31\xce\x99\xbb\xb3\xd4\x11\x9c\x5f\xff" - "\x6a\xaa\x45\x50\xdb\x89\x2e\xb1\x85\xd2\xbc\x27\x88\x32\xaf\x99" - "\xa8\x76\x3c\x41\xd4\x3b\x9a\x89\xa6\xa6\xa5\x91\xd4\x9e\xa9\x26" - "\xb5\xed\x27\x48\xed\x05\xb8\xba\xe0\x12\xe1\xca\x3c\x41\x6a\xda" - "\x08\x59\x78\x96\x90\x8c\x16\x6a\xfd\x61\x13\x09\xab\x71\x34\x12" - "\xed\xe3\x84\x9c\x53\x7c\xf8\x4b\x75\x1c\x09\xa3\x5f\x86\x13\xba" - "\x22\x5c\x80\x77\x4a\x4c\x37\x3b\xac\xa4\xa6\xc5\x8e\xef\x23\xe1" - "\xbd\x32\xa3\x05\xca\x17\xab\xd1\x97\xa1\xb5\x26\xf3\x28\xb4\x6f" - "\x94\x06\xe8\x6c\x97\x6d\xb2\xbc\x2e\x12\xb9\x03\xd8\x8c\x98\x89" - "\xa6\x1c\x33\x7b\xbb\xfc\xc5\xcc\x87\xdc\xff\xfb\x53\xe1\xe3\x81" - "\xde\x93\xc5\xa7\x62\x35\x0f\x9e\xf8\x9c\xe2\x7e\x30\x5c\x9f\xa9" - "\xb3\x1d\x23\xb8\x66\x1d\xbd\x9e\x90\x05\x4e\x42\x90\x26\xb8\x96" - "\xfc\x60\x12\x09\xc5\x7d\x6a\xe2\x3f\x75\xe3\xcd\x2d\x56\xb2\xc9" - "\x01\x75\x3d\x67\xef\xa9\x6b\xdd\xd6\x3a\x02\xef\x26\xd7\x25\x58" - "\x88\x3a\x89\x68\x90\xce\x60\x8b\xb6\x3e\xd8\x4a\x46\xaf\xb1\x51" - "\x8a\x34\x46\xda\x22\x9d\xb1\x3c\x99\xf6\xe6\x78\x2b\xc9\xb0\x13" - "\x8d\x39\x1d\xee\x69\xd4\x6a\x26\xdf\x12\xa8\x63\x3c\x0d\x1e\xa5" - "\x01\x7c\x6c\x45\x4c\x58\x14\xf5\x29\x80\x83\xf1\x34\xab\x5e\x57" - "\x0c\xed\xc5\xb5\x7d\xff\xda\xfc\x91\x2f\xeb\x1f\x7d\x6c\x42\x17" - "\x9e\x0d\x09\x1c\xcf\xc7\xa3\x68\x88\x21\xaa\x1b\x6c\x3d\x8e\xe7" - "\x11\xed\x83\xe3\xd9\x90\xe8\xc2\xf3\xdf\x17\xba\xf0\x7c\xfc\x0e" - "\xef\x78\x6e\xc8\x95\xf0\x9c\x79\x65\xe2\xb9\xe1\x86\x81\xf1\xdc" - "\x40\xbc\xe3\xd9\x90\x26\xdb\xbb\xc3\x83\xe7\x86\xd8\xcb\x87\x67" - "\x43\x42\x60\x78\x6e\x98\xe5\x89\xe7\xbf\xcf\xe3\x78\xfe\xc8\x1e" - "\x18\x9e\x8f\x7b\xf5\x7f\x3c\x90\xbd\xed\x86\x67\x49\x3e\x37\x6a" - "\x00\xcf\x20\x9f\x0d\x92\x7c\x1e\xdb\xec\x03\x9e\xdd\xe4\xf3\xc7" - "\x53\x5c\x78\x6e\x54\x78\xc7\xf3\x27\x8f\x71\x3c\x67\x5f\xa1\xf2" - "\xf9\xe3\x6f\x07\xc6\xf3\xc7\xf5\x03\xe0\xd9\x2e\x8f\x25\x86\x07" - "\xcf\x9f\xe8\x2e\x23\x9e\x03\x94\xcf\x9f\x28\x3d\xf1\xfc\x71\x18" - "\xc7\xf3\xf1\xea\xc0\xf0\xdc\x18\x11\xc8\x58\xc6\x85\xe7\x6c\x49" - "\x3e\x7f\x6a\xa1\x21\xd9\x20\x9f\xb3\x25\xf9\x3c\xee\xa3\xc1\xf1" - "\x9c\xed\x26\x9f\x1b\xcf\xba\xf0\xfc\xe9\x87\xde\xf1\xfc\xe9\xad" - "\x12\x9e\xaf\x50\xf9\x7c\xa2\x72\x60\x3c\x9f\x28\xf1\x8e\xe7\xec" - "\x34\x79\x9c\x36\x3c\x78\x3e\x61\xbf\x7c\x78\xce\x0e\x50\x3e\x9f" - "\x68\xf0\xc4\x73\x63\x0b\xc7\x73\x63\x41\x60\x78\xfe\xb4\x2d\x90" - "\x71\xa2\x1b\x9e\x25\xf9\x7c\xb2\x0c\xf0\x0c\xf2\x39\x5b\x92\xcf" - "\x77\xe7\xf8\x80\x67\x37\xf9\xfc\xd9\xdb\x2e\x3c\x9f\x7c\xd9\x3b" - "\x9e\x9b\x9c\x1c\xcf\x39\x57\xa8\x7c\x6e\xda\x39\x30\x9e\x9b\x92" - "\x06\xc0\xb3\x5d\x1e\x03\x0f\x0f\x9e\x9b\xaa\x2f\x23\x9e\x03\x94" - "\xcf\x4d\xfb\x3c\xf1\xfc\xd9\x01\x8e\xe7\xcf\x12\x02\xc3\xf3\x49" - "\xaf\xf1\x5f\x07\x1a\x83\xbb\xf0\x9c\x23\xc9\x67\x4b\x26\x0d\xc9" - "\x01\xf9\x9c\x23\xc9\xe7\x47\xef\x1b\x1c\xcf\x39\x6e\xf2\xf9\x1f" - "\xb9\x2e\x3c\x5b\x9e\xf6\x8e\xe7\xcf\x6b\x25\x3c\x5f\xa1\xf2\xf9" - "\xf3\xe5\x03\xe3\xf9\xf3\x28\xef\x78\xce\x49\x93\xe7\x17\x86\x07" - "\xcf\x9f\x17\x5c\x3e\x3c\xe7\x04\x28\x9f\x3f\x4f\xf1\xc4\xf3\x3f" - "\xb6\x72\x3c\xff\x63\x76\x60\x78\xb6\x18\x87\x67\x7e\xe3\xcb\x4c" - "\x9c\xdf\xe8\xc2\xf9\x0d\xd7\xde\xbf\x84\xd0\x7a\x8e\xe7\x6e\xc0" - "\xf3\x4b\xee\x78\xfe\xac\xf7\xfc\xc6\x17\x8f\x89\x3d\x78\xfe\xb2" - "\x0f\x9e\x45\xc0\x73\x37\xc3\x73\x73\xb6\x3c\xbf\x61\x6e\x2b\x01" - "\x9c\x9c\x21\xe6\x18\xc0\x72\x9e\x84\xe5\xcf\x00\xcb\x40\x43\x11" - "\x68\x5c\xd3\xd4\x48\xa2\xad\x9c\x96\x5d\x40\x63\xd1\x1d\xc7\x5d" - "\xad\x02\xe2\x17\x71\x2b\x63\xb8\x76\x0d\x60\x37\xf9\x43\x52\x9b" - "\x0a\xd7\x06\xb8\xd2\xe1\x22\x1f\x92\x9a\x56\xc0\xee\x2a\x77\xec" - "\xd6\x4b\xd8\x6d\x9e\x32\x30\x76\xbf\x70\x5c\xbe\xb9\x8c\x66\x3e" - "\xff\xf5\x59\xac\x26\xfa\x97\x9f\x53\x73\x5a\xa3\x84\xcf\x33\x24" - "\xda\x41\x42\xe9\xa3\xba\xf1\xea\x58\xa2\x79\xce\x49\x84\xdc\x27" - "\x88\x26\xf7\x53\x68\xb7\xdc\x7f\x9b\x89\xfa\x98\xfd\x2d\x52\xd3" - "\xde\x48\x6a\x2e\x1c\x25\x35\x22\x5c\x67\xe0\x82\xba\x46\xaf\x74" - "\x6f\xb7\x55\x6a\xf7\x97\x13\xa0\xac\xe9\xde\xdb\xdd\x6c\x63\xed" - "\x8e\x87\x76\x77\xb9\xda\x6d\x86\x7e\x00\xfc\x99\x2c\x4a\xf3\x21" - "\xd1\x56\x32\x7a\xad\x83\xd2\x2e\x09\xff\xc8\x9f\x63\x0d\x76\x12" - "\x9d\x04\x3c\x5b\x01\xf8\x6f\x29\x25\x19\x1b\x01\xff\x5d\x76\xc4" - "\x9d\xd5\x9c\x79\x11\xf0\xdf\x1c\x49\x81\x7e\xdd\x88\xff\xcf\x10" - "\xff\x5f\x2c\x16\x19\xfe\xbf\x50\x05\x86\xff\x2f\x7d\xc0\xbf\x2f" - "\xf3\x21\xa7\x33\x71\x3e\xa4\x0b\xe7\x43\x5c\x7b\x40\x07\xc1\xbf" - "\xfb\x7c\x48\x8b\x1b\xfe\x4f\x0f\x80\xff\x53\x32\xfe\x33\xbf\x7b" - "\xfc\x9f\x1a\x04\xff\x2d\x03\xe0\x7f\xb8\xe7\x3e\x4e\x5d\x46\xfc" - "\x9f\x1e\x04\xff\xa7\x7c\xc0\xbf\x21\x21\x30\xfc\x9f\xea\x85\xff" - "\x16\x09\xff\x2d\x01\xe2\xff\xb4\x2f\xf8\xf7\x61\xfe\xe4\x6b\xc4" - "\x3f\xc8\x7f\x43\x8b\xdb\x5e\xe0\xc1\xf0\xef\x26\xff\xbf\x72\xc3" - "\xff\xd7\x03\xe0\xbf\x35\x5b\x9e\x3f\xf9\xee\xf1\xdf\x3a\x08\xfe" - "\xbf\x1a\x08\xff\xc3\x3c\x57\xd2\x7a\x19\xf1\xff\xf5\x20\xf8\x6f" - "\xf5\x05\xff\x01\xca\xff\xd6\x5e\xf8\xff\x4a\xc2\xff\x57\x01\xe2" - "\xff\x6b\x1f\xf0\xef\xcb\x7c\x4b\x5b\x26\xce\xb7\x74\xe1\x7c\x8b" - "\x6b\x4f\xf8\x20\xf8\x77\x9f\x6f\x39\xe3\x86\xff\xb6\x01\xf0\xff" - "\x4f\x19\xff\x57\x80\xfc\xff\xe7\x20\xf8\x3f\x33\x00\xfe\x87\x7b" - "\x6e\xe5\x9f\x97\x11\xff\x6d\x83\xe0\xff\x9f\x3e\xe0\x3f\x3b\x40" - "\xf9\xff\xcf\x5e\xf8\x3f\x23\xe1\xff\x4c\x80\xf8\x6f\xf3\x05\xff" - "\x3e\xcc\xcf\x7c\x83\xf8\x07\xf9\x9f\xdd\xe2\x76\x36\x60\x30\xfc" - "\xbb\xc9\xff\xb3\x6e\xf8\xff\x66\x00\xfc\x9f\xcb\x96\xe7\x67\xbe" - "\x7b\xfc\x9f\x1b\x04\xff\x67\x07\xc2\xff\x30\xcf\xc5\x9c\xbb\x8c" - "\xf8\xff\x66\x10\xfc\x9f\xf3\x05\xff\x01\xca\xff\x73\xbd\xf0\x7f" - "\x56\xc2\xff\xd9\x00\xf1\xff\x8d\x0f\xf8\xf7\x65\x3e\xa7\x9d\xcd" - "\xe7\x74\xe1\x7c\x8e\xeb\x8c\xc8\x20\xf8\x77\x9f\xcf\xb1\xba\xe1" - "\xbf\x7d\x00\xfc\x7f\x2b\xe3\xff\x0a\x90\xff\xdf\x0e\x82\x7f\xeb" - "\x00\xf8\x1f\xee\xb9\x9b\x6f\x2f\x23\xfe\xdb\x07\xc1\xff\xb7\x3e" - "\xe0\x3f\x27\x40\xf9\xff\x6d\x2f\xfc\x5b\x25\xfc\x5b\x03\xc4\x7f" - "\xfb\x30\xcd\xff\xd8\x74\x38\xff\x23\xaa\xb7\xb5\x74\x17\x3e\xa4" - "\x15\x8d\xf9\x96\x50\x85\x96\x38\xd4\xdb\x4b\xcc\x29\x36\xf2\xe0" - "\x79\xe0\x49\xd2\x79\xf2\xf8\x79\x0d\xc6\xb2\xac\xa7\x30\xfe\xf7" - "\x38\x23\x0a\x97\xc3\x38\x4a\xb3\x63\x0d\x51\x3a\x43\x8c\x7a\x4c" - "\x33\x9f\xb6\x13\x6c\xf3\x26\xa4\xc1\x19\x17\x0d\x70\x0e\x8e\x7e" - "\xa3\xd3\x14\xeb\x21\x4f\x97\x85\xb4\x00\x5e\x6a\x5a\x2c\x40\xfb" - "\x0d\x0c\x5b\xc8\x8b\xd3\x8a\x8e\xea\xbd\xe7\x88\xd2\xf1\x65\xf8" - "\x64\xe0\x71\x58\xf0\xb3\x44\x11\xd1\x42\x45\xe4\x25\xf2\x08\xf9" - "\xaa\xdd\x80\xfb\x95\x6c\x37\xd4\x01\xbe\x1d\x5f\xea\x26\x17\x43" - "\xbe\xe1\x9f\x97\xe9\x68\xe3\xe7\xf1\x3b\x4c\x35\x4d\x40\xcb\xac" - "\x8e\x00\xf9\x64\xf3\xe5\xfc\x8b\x0f\xf3\x14\xe7\xeb\x71\x9e\x42" - "\x54\x1b\xe2\x7d\xe3\x93\x21\xc1\xe3\x4c\xeb\xb0\xf3\xe9\x7c\x92" - "\x6f\x7c\x3a\x7f\xd4\x93\x4f\xc3\x3d\x7f\x70\x7e\x37\xe7\xd3\xf9" - "\x04\xce\x27\x5b\x59\x60\x7c\x3a\x1f\xd0\xfe\xdf\xbe\xe3\xe9\xce" - "\x34\x1c\x4f\x03\x9f\x7c\xec\x4f\x86\x56\x8f\x33\xb8\xc3\xce\xa7" - "\xce\x70\xdf\xf8\xd4\xf9\x74\x2f\x3e\x0d\xf3\x38\xb7\x73\x0e\xe7" - "\x53\xa7\x86\xf3\xe9\x42\x6c\x60\x7c\xea\xf4\xe1\xfc\x87\x2f\xe3" - "\xbe\x8b\x5a\x1c\xf7\x89\x30\xee\xf3\x8d\x4f\xd9\x09\x1e\x67\x86" - "\x87\x9d\x4f\x76\x93\x6f\x7c\xba\x38\xc9\x93\x4f\xc3\x3d\x1e\xb3" - "\xb7\x70\x3e\xd9\xcb\x39\x9f\xec\x24\x30\x3e\x5d\x9c\x39\x3c\xe3" - "\x93\xae\x6a\x1c\x9f\x00\x9f\x7c\xec\x4f\xd9\xad\x1e\x67\x9c\x87" - "\x9d\x4f\x5d\x09\xbe\xf1\xa9\xab\xb2\x17\x9f\x86\x79\xdc\xd0\x25" - "\xc5\x03\xee\x8a\xe3\x7c\xba\x58\x1a\x18\x9f\xba\xbc\xfa\x3f\xf5" - "\xcf\x8e\x76\x24\xa1\x1d\x2d\x82\x1d\xed\x1b\x9f\x72\x12\x3c\xce" - "\x64\x0f\x3b\x9f\x1c\x1a\xdf\xf8\xe4\x58\xe5\xc9\xa7\xe1\xb6\x6f" - "\x1d\xb3\x38\x9f\x1c\x2a\xce\xa7\xee\x98\xc0\xf8\xe4\xf0\x61\xff" - "\x67\xff\xe7\xb0\xfa\xda\x7c\x62\xc4\x95\x65\xf3\x39\x2b\x7c\xe3" - "\x95\x38\xe1\xd2\xda\x7c\x4e\x0b\xe7\x95\xf3\x00\xe7\x95\xc3\x11" - "\x18\xaf\x44\xaf\xfe\x1f\x07\x3b\xbf\xd5\xd7\xee\xa3\xd5\x57\x96" - "\xdd\x47\x7d\x94\x7f\xb4\xf2\xd2\xda\x7d\x54\x92\x7f\x54\x92\x7f" - "\x62\x80\xf2\x8f\xfa\x20\xff\xfa\x3f\xf7\xd5\xc7\xf6\x13\x14\x29" - "\x57\x94\xed\x27\x28\xc2\x7c\xe2\x95\xa0\x58\x7d\x49\x6d\x3f\x41" - "\xc1\xce\xbf\xc0\x5d\xcd\x78\x95\x43\x16\x07\xc4\x2b\x41\x91\x19" - "\xe8\x79\xb1\x3e\xf6\x9f\x10\x74\x65\xd9\x7f\x82\xe0\x9b\xfd\x27" - "\x04\x5d\x5a\xfb\x4f\x10\xb8\xfd\x27\x08\xdc\xfe\xcb\x11\x02\xb3" - "\xff\x84\xa0\x80\xec\xbf\x5e\xbc\x92\xfa\x95\xb2\xe6\x8a\xb2\x01" - "\x05\x65\xa2\x6f\xbc\x52\x1e\xb9\xa4\x36\xa0\xa0\xcc\xe7\xbc\x52" - "\xc6\x73\x5e\x05\xed\x0f\x8c\x57\x4a\xaf\xf1\x6f\x07\x3b\x9f\xd6" - "\xc7\x0e\x14\x46\xa6\x5d\x51\x76\xa0\x30\xd2\xb7\xf1\xaf\x30\xf2" - "\xe9\x4b\x6a\x07\x0a\x23\xf9\xf8\x57\x18\xc9\xc7\xbf\x39\x23\x02" - "\x1b\xff\x0a\x23\x7d\x18\xff\xfa\x30\xef\x27\xa8\x1a\xd1\x06\x74" - "\x1a\xb7\xb5\x84\x02\xfd\x43\xd3\x88\xd0\x15\x01\xfc\x52\x03\xbf" - "\x36\x6b\x49\xb7\x11\xf8\x65\x75\x90\x07\x9f\xfe\x9c\xd6\xb5\x39" - "\x49\x17\xf0\xea\x22\xd8\x81\x66\x6b\x2b\x9e\xd1\xfb\x69\xb3\xa0" - "\x7a\xfa\xd1\xa7\x35\x04\xf9\x85\xf4\x77\xaa\x47\x69\x28\xf0\x8b" - "\xf1\x4f\xbd\xb3\xd4\x61\x34\xc6\x2d\x3c\xfb\x39\x5d\x6b\xa1\xb4" - "\x36\xc1\x8e\xbe\x23\xb5\xb5\x09\x8d\x24\xba\x85\x8c\xd6\x2e\x42" - "\xbe\xa8\x6e\xc0\x74\xb3\xb5\x91\xa0\xdf\x4f\x36\x07\xfe\xb9\x2e" - "\xcc\xf1\x89\x4e\x8d\xfe\x9b\xf0\x5c\xa1\xec\xa3\xc9\x7c\xa6\x80" - "\xf1\xbf\xf7\x9c\x2a\xe3\xff\x27\x3a\xcd\x4b\x78\x3e\x71\xb8\x6d" - "\x41\x61\x14\x9b\xff\x13\x3f\x0f\x9f\x2c\xd7\x71\x6d\x22\xa5\x50" - "\xc7\xf1\x75\x36\x2b\xc1\x7a\xd6\xd9\x4c\x24\x23\x85\x68\xea\xba" - "\x5a\x49\xba\x8d\x5a\xeb\x32\xbf\x26\xd1\xe7\x71\x5d\x00\xf1\xa4" - "\x5a\xc5\xf9\x3d\x6a\xb7\xf8\xb9\x6e\xb2\x45\x50\xc5\xd5\xd5\x13" - "\x12\xba\x19\x68\xed\x20\x02\x3b\xaf\x29\x10\x15\xd0\x2b\xc1\x9c" - "\xd9\x4c\x80\x76\x16\xb3\xe3\x53\xa4\x67\x02\xbc\x9f\xd3\xb3\xde" - "\x10\x62\x6c\xc6\x34\xa4\x2d\xee\x33\x35\x27\x59\x59\x1e\xf9\x3d" - "\xe7\x5d\x26\x31\xa7\x75\x91\x3a\x07\x21\xf0\xbd\xa8\x0f\x62\x1b" - "\x01\x5f\xa3\x02\x94\xdb\xaa\x96\x61\x99\xaf\x14\xc6\xce\x46\xbb" - "\xd5\x69\x34\xc4\xf3\x3a\x8e\x68\x1f\x1c\x5f\x86\x04\x17\xbe\xc6" - "\x7c\x38\x34\x7c\x8d\xd9\x3c\xbc\xf8\x1a\x66\xfb\x55\x18\xb3\x60" - "\x68\xf8\x1a\x73\x94\xe3\x6b\xb4\x8d\xe3\x6b\x8c\xc9\x85\xaf\x11" - "\xed\x97\x0e\x5f\xa3\x4b\x38\xbe\x46\xc7\x05\x86\xaf\xb1\xf3\x86" - "\x65\x9e\x55\x08\x2e\x40\x5b\x1b\xf0\x25\xc9\xaf\xb1\xcd\x3e\xe0" - "\xcb\x4d\x7e\x05\xdf\x31\x34\x7c\xa9\xbf\x18\x66\x7c\x0d\xb3\xcd" - "\xad\xde\x3f\x34\x7c\x05\xdf\xc2\xf1\xa5\x5e\xcc\xf1\x15\xac\x75" - "\xe1\x6b\x6c\xf3\xa5\xc3\x97\x9a\x70\x7c\x8d\x35\x05\x86\xaf\xe0" - "\x80\xfc\x5f\xf5\x1d\x1f\x84\xda\x71\x7c\xe0\x34\x66\x4b\xf2\x6b" - "\xdc\x47\x83\xe3\x2b\xdb\x4d\x7e\x85\xee\x1c\x1a\xbe\x42\x7f\x3e" - "\xbc\xf8\x1a\xee\x71\x42\xa8\x7a\x68\xf8\x0a\xcd\xe6\xf8\x0a\x39" - "\xc0\xf1\x15\x9a\xe9\xc2\xd7\xb8\x8f\x2e\x1d\xbe\x42\xe2\x38\xbe" - "\x42\xb4\x81\xe1\x4b\xe3\xdd\xff\xb3\x3f\xf3\xda\xc2\xf8\x58\x1c" - "\xd3\x00\xbe\x24\xf9\x75\x77\x8e\x0f\xf8\x72\x93\x5f\xe3\xbe\x1d" - "\x1a\xbe\xc6\xbd\x3c\xcc\xf8\x1a\xe6\xb1\xcd\xb8\xc4\xa1\xe1\x6b" - "\xdc\xd7\x1c\x5f\xe3\xc2\x38\xbe\xc6\x59\x5c\xf8\xba\x3b\xe7\xd2" - "\xe1\x4b\x63\xe2\xf8\xd2\x64\x06\x86\xaf\xf1\x3e\xf8\x7f\xf5\x61" - "\x3e\x5e\x08\x2b\xc7\x71\x98\xd3\x98\x23\xc9\xaf\x47\xef\x1b\x1c" - "\x5f\x39\x6e\xf2\x2b\xec\x97\x43\xc3\x57\x98\x62\x78\xf1\x35\xdc" - "\xe3\xb1\x6b\x6a\x86\x86\xaf\xb0\x5f\x70\x7c\x5d\x93\xc2\xf1\x15" - "\x16\xe5\xc2\xd7\xa3\xf7\x5d\x3a\x7c\x5d\xa3\xe5\xf8\x1a\x6f\x09" - "\x0c\x5f\x61\x3e\xf8\xff\xf1\x71\x1d\x41\xb8\x36\x62\x68\x63\xc8" - "\x89\x6f\x0c\x0d\x63\x13\x57\x5e\xd9\x63\xc8\x89\x91\x43\xc3\xd8" - "\xc4\x57\x39\xc6\x26\x34\x72\x8c\x4d\xdc\x77\x79\xc6\x90\x13\xb6" - "\x72\x8c\x4d\x98\x17\x18\xc6\xae\x1d\xbe\xf5\x0f\x61\x52\xe6\xd0" - "\xc6\x91\x93\x26\x0d\x0d\x63\xe1\x47\xaf\xec\x71\x64\xf8\xee\xa1" - "\x61\x6c\xd2\x38\x8e\xb1\xf0\x39\x1c\x63\x93\x54\x97\x67\x1c\x79" - "\x6d\x2b\xc7\xd8\xb5\x81\xad\xdb\x08\x93\x02\x3a\xff\xd2\xff\xba" - "\xcd\x75\x2d\x43\x1b\x4b\x5e\xb7\x69\x68\x18\xbb\xee\xd6\x2b\x7b" - "\x2c\x39\xd9\x3e\x34\x8c\x5d\xf7\x0c\xc7\xd8\xe4\x12\x8e\xb1\xeb" - "\x12\x2f\xcf\x58\x72\xf2\x02\x8e\xb1\xc9\xea\xc0\x30\x76\x9d\x75" - "\xf8\xd6\x9b\xa6\xce\x1f\xda\x78\x72\xca\x17\x43\xc3\xd8\x94\x9d" - "\x57\xf6\x78\x72\xca\xd2\xa1\x61\x6c\xca\x09\x8e\xb1\x29\x4a\x8e" - "\xb1\x29\xf5\x97\x67\x3c\x19\x51\xc6\x31\x16\x91\x14\x18\xc6\xa6" - "\xfa\xe0\xff\xdf\xd7\x75\x32\xed\xfe\xa1\x8d\x29\xb5\xf7\x0f\x0d" - "\x63\xd7\x9f\xbf\xb2\xc7\x94\xd7\x9b\x86\x86\x31\xed\x3d\x1c\x63" - "\xd7\x27\x70\x8c\x69\x67\x5d\x9e\x31\xe5\xf5\x61\x1c\x63\x53\x1b" - "\x02\xc3\x98\xb6\x7c\xf8\xd6\xf7\x6e\xd4\x0c\x6d\x5c\x39\xed\x95" - "\xa1\x61\x6c\xda\xaf\xae\xec\x71\xe5\xb4\xe9\x43\xc3\xd8\xb4\x97" - "\x39\xc6\x6e\xa8\xe1\x18\x9b\x56\x70\x79\xc6\x95\x37\xa4\x71\x8c" - "\xdd\x10\x98\x3f\x0a\xe1\xc6\x3e\xfe\xaf\x56\xad\x49\x5d\x9e\xb8" - "\x2a\x5e\xbb\x6a\x4d\x4a\xf2\xd3\xda\x75\xab\x36\xac\xbc\xe7\xa6" - "\x67\x66\x6a\x93\xd3\xb4\xc9\xab\xd6\xfc\x5a\x4a\x88\x1f\x43\x16" - "\xad\x4c\x5c\x9e\x86\x29\x90\xfb\xd7\x6b\x56\xaf\x5c\x93\xa2\x4d" - "\x5e\xf9\xf4\x33\xab\x92\x57\xe2\xef\x75\xda\x27\xd7\x26\x43\xc2" - "\x8a\x95\xab\x52\x57\x6a\x9f\x78\xe6\xc9\x27\x57\x26\xaf\x1b\x43" - "\x16\x3e\x93\x98\xb2\x2a\x29\x71\xa5\x76\xde\xc2\x9f\xdf\xba\xf8" - "\xfe\x87\x16\xff\xec\x67\x18\x9c\xcc\x2d\x36\x59\x04\x35\xee\x2c" - "\x01\xcc\x29\x4f\x0b\x33\x27\xd5\x85\x13\x16\x1f\x77\x47\x3b\xd1" - "\xe4\x24\x13\x65\x76\x3b\x51\xe5\xb6\x13\xb5\xf6\x37\x24\x8a\x66" - "\xd7\x90\xbc\x76\x12\x46\xf3\x96\xe8\xc4\x5c\x65\x14\xcd\x55\x66" - "\x5a\x47\x9f\x0d\x87\x34\x8d\x98\xdd\x36\x1b\xfe\x13\x06\xb4\x55" - "\xd2\xdc\x91\xd6\x66\xe1\x87\x8d\xd6\xd1\xe7\x54\x19\x5f\x13\x81" - "\x8e\x99\xbe\xe0\x35\xd1\x2a\x54\x62\x84\x26\x68\x3b\x11\x6e\x8a" - "\x87\x2b\x86\x08\x37\x13\xb8\x34\x70\x45\xc0\x35\x0f\xae\x05\x70" - "\xc5\xc1\x95\x08\x17\x8c\x92\x6f\xce\x84\xcb\x00\x57\x3e\x5c\x05" - "\x44\xf8\x41\x18\x5c\xb3\xe0\x82\xbc\x3f\x58\xca\xcb\xf9\x41\x02" - "\x5c\xbb\xe1\xaa\x80\xab\x81\x08\x3a\xc8\xaf\x2b\x25\xc2\x2d\x3a" - "\xb8\x9b\xe0\xaa\x81\x0b\xd3\xed\x90\x86\xff\x4f\xe4\xef\x6e\xa9" - "\x27\xc2\x0c\x35\x81\x7a\x0e\x7e\xcd\x98\x09\x17\x7c\x77\x46\x2c" - "\x5c\xe5\x90\x06\xf5\xfd\x61\x62\xaf\x7c\x07\xdc\x7e\xd7\x0f\x52" - "\xa6\x35\x74\xf3\xf5\x16\x16\x03\x4f\xb8\xa9\x92\xea\x49\x10\xcd" - "\x3e\xa7\x4a\x9a\x41\x14\x67\x84\x9b\x72\xcd\x5b\x51\xce\x28\xa3" - "\x58\x4c\x47\x78\x46\x9a\x75\xe6\xdc\x64\xb4\x90\x27\x4b\x31\xa6" - "\x99\x7f\x78\xbb\xc9\x28\xfd\xbf\xc6\x42\x1c\x56\x16\x03\x2e\xa7" - "\xb2\x91\x66\xc4\xbe\xc4\x62\xbf\x01\x0d\xf1\x5c\x16\x35\x54\x2e" - "\xa6\xaa\x0a\xd6\xe7\x4d\x1b\x58\xbd\x56\xf2\xfe\x05\xef\xa1\x6e" - "\xd6\xe0\x25\x3a\xa8\xa7\x12\x9f\x69\xf6\xd9\xf0\xae\xe0\xfc\x4c" - "\xfc\x7d\xb1\x68\x51\x19\x35\xe6\x97\xe2\x38\xdb\x94\xfe\xdf\xa4" - "\x19\xfe\xd7\x15\xbc\x6b\xbe\x76\x51\x28\x6d\xe6\x65\x0b\x90\xcf" - "\x2e\x97\xd5\x15\xbc\x24\x92\x16\xec\x4a\xa2\xb9\x80\x21\xa9\x3c" - "\x11\xca\xa3\x46\x63\x8c\x45\xb8\x79\x31\xa6\xd3\xc2\x45\xd5\xf2" - "\x6f\xb8\xc7\xd0\xbc\x7c\x2b\xde\x43\x37\x13\x1b\x7b\xd6\x47\x11" - "\x7e\xd7\x10\x94\x75\x6d\xc2\xcd\x17\x6f\xaf\x27\x0a\xd3\x22\xac" - "\xf7\xcd\x55\x19\xf5\x54\xd4\xa6\x07\xc1\xf7\x6f\x3e\xd2\xf3\xdd" - "\x49\xbb\x12\x30\x7e\xaa\x98\x73\xe3\x52\x8c\xc1\x87\xff\xc5\xba" - "\xbd\x38\x9e\x28\xf7\xee\x22\x2a\x6c\x63\x67\xce\xcd\x56\x39\x0e" - "\x1d\xfe\x47\x80\xfc\x0f\xfc\x32\x83\xba\x95\xfd\x36\xe5\xed\x89" - "\xe3\x34\xfd\x81\xd6\x42\xba\x1a\x30\xbf\x76\x1a\xa3\xe5\x4a\xe9" - "\x7d\x3c\xf2\x13\xcb\x17\x73\x77\x96\xe0\x33\xc6\xb9\x0b\x05\x54" - "\x68\xd3\xa7\x97\x73\x1a\xe5\x97\x62\x39\x98\x5f\xcc\xdb\x0e\xbf" - "\x6f\x56\x8a\xd0\x5e\xa7\x9e\xe8\xb4\x6b\x48\x54\xb3\xf0\x83\x5c" - "\x67\xf6\xa1\x02\x78\x0f\xfd\xee\x50\x21\xe4\x37\x31\x7a\xe7\x1a" - "\xa3\x2c\xc2\x0f\x32\xe1\x5d\x61\x4f\xec\x4b\x4e\x67\x85\x98\x7d" - "\x68\x3f\xd4\xe9\x80\x45\x31\xce\x22\xb7\x81\xc9\x38\x57\x3e\x89" - "\xa7\x3f\x28\xb5\x8e\x3e\xb4\xbf\x3b\x95\xd6\xef\xf8\x94\x10\xf8" - "\x26\xed\xba\x40\x6b\x36\xc6\x50\x7b\xde\x7f\x12\x52\x13\xd7\x44" - "\x32\x96\x93\x88\xb1\x9b\xa9\x35\xda\x49\x42\xc7\x36\x85\xd2\xda" - "\x98\x26\x90\xd1\xe7\xc9\xc6\x7a\xda\x5a\x97\x54\x41\x36\x9e\x22" - "\xea\x4d\xab\x48\x58\x46\x0c\xb5\xa6\xd7\x50\xbb\x39\xad\x89\xd4" - "\xd9\xe0\x4a\xaa\x85\x7c\xc7\xe1\xaa\x20\x19\xeb\x89\xf2\x41\x90" - "\xa7\xe9\xe7\x89\xba\x2e\xe9\x3c\xa4\x9d\x25\x1b\xe3\xa8\xa3\xb6" - "\x06\xf3\x1d\x21\xd1\x0e\x6b\xe8\xa6\xb3\x44\x59\xfc\x9f\x78\xb6" - "\xec\x24\xd9\x0b\x75\xe9\x0a\x56\x26\x5d\xcc\x1d\x69\xef\x48\xa5" - "\x8e\xce\x1c\x5d\xa6\x85\xdc\x95\xe4\xd1\x16\xac\x33\xc6\x0d\x85" - "\xf6\x62\x1e\x31\xd7\xa8\x5b\xe6\x40\x9c\xeb\x52\x40\x16\x13\xf9" - "\x3d\xbe\xb3\x06\x1b\x01\x3f\xba\x92\x68\x07\xed\xc4\xfc\xd8\x6e" - "\xa0\x51\xa9\xd4\xfe\xd2\xa0\x24\xa2\x84\x6f\xb4\x58\x14\x61\x15" - "\x6e\x3c\x44\x9e\x8c\x94\xbf\xc7\xf3\xdc\xa2\xb2\x28\xae\x61\xb1" - "\x17\x45\xfe\xce\x8a\x79\x21\x5d\x0b\xff\x55\xf3\xfa\xe9\x5a\x31" - "\x4d\x92\xa5\x58\x8e\x5d\xc4\x7e\x6d\x38\xd8\xe0\x0c\xce\x2f\xa3" - "\x02\xb5\x03\x9e\xe7\xd3\x8e\x70\xf5\x83\x0e\x6a\x17\x73\xb7\x47" - "\x81\xbc\x54\x63\x9c\x54\x9e\xff\x96\x37\xe1\x7d\x8c\x36\x95\xfd" - "\x7e\x19\xbf\x23\x16\x2d\x2a\x41\xd9\x1a\x5d\x8f\xf9\x97\x94\xe4" - "\x25\x83\xec\xcd\xcd\x2f\xc1\x7e\x28\x06\x1b\x63\x2f\xee\xd9\x15" - "\x83\xfd\x9b\x02\xc6\xa8\x71\x49\x4c\x4f\x39\x7a\x32\xc2\x22\xdc" - "\x92\x46\xe1\xff\xd4\xb8\x3d\x4a\xaa\xcf\x72\x8e\xcd\x5b\x52\xb0" - "\xdf\x41\xbd\x1a\x21\x7d\x44\xb3\x30\x83\xe0\x19\x4d\x6a\xa8\xd0" - "\xb0\x58\x92\xc2\x8c\x11\x1c\x33\x07\x1b\x3c\x9e\x05\xa4\x1f\xf4" - "\x49\x90\x03\xdc\xbe\x98\x71\x93\xab\x5f\x70\x1c\xf3\xfe\xbd\x1d" - "\xea\xf4\x83\x38\x51\x1f\x24\x42\x3e\x45\x33\xa7\x83\xd0\x35\xfa" - "\x50\x49\x67\xce\x8c\x18\x0b\x39\xbf\xd8\x83\x9f\x39\x6f\xd9\x31" - "\x6e\x25\xd4\x25\x08\xca\xdc\x04\xf7\x51\x70\xdf\x7c\xb8\x1e\x75" - "\x2d\x2b\x77\x2c\xfe\x7e\x71\x22\xb5\xce\x5b\x48\x30\x46\x25\xd0" - "\x7d\x46\x81\x85\xfc\xaa\x05\xcb\xc9\xc1\xd8\x9d\x90\x86\x79\x20" - "\xbd\xcc\x42\x1e\x69\xe0\xe5\xdf\xbc\xd8\x86\x32\xcb\xb3\xfc\xe3" - "\xbc\x7c\x5e\x2e\x96\x27\x97\x5d\xf4\x3b\xda\x26\x95\x6d\x93\xcb" - "\xce\x85\x34\xb9\xfc\x79\xab\xe5\x6f\xfc\x30\x0c\xbe\xb1\xd4\xbd" - "\x0d\x7b\x7e\x47\x6d\x58\x06\xbc\x8b\xb4\x90\xe5\xfb\xf1\x5d\x36" - "\xa4\xe1\x7f\xdd\x30\x15\x74\x38\x06\xca\xa8\x61\x65\xc4\x5a\x48" - "\xdc\x2c\x77\xb9\x01\x34\x0a\x96\x65\xad\x54\xd6\x46\xb9\x2c\xb7" - "\x72\x24\x4c\xbd\x27\x63\x0c\xcb\x55\x63\xb9\x90\x7f\xbf\x85\x2c" - "\x4d\x73\x6f\x3b\xd0\x3c\x5f\x7a\x57\x0d\x74\x0f\x73\xaf\xb3\x24" - "\x57\xcb\xe1\xff\x0a\xa9\xac\x5c\x94\x59\xf2\x7b\x8c\xeb\x49\x73" - "\x6e\xdc\x8a\xfd\x06\xe4\x23\x81\x7e\x16\xd9\x99\x33\x53\xd3\x4b" - "\x3e\x2a\x31\x1f\xc8\xd4\x37\x59\x5c\xd3\x89\xb4\x15\xf2\xcc\xf2" - "\x88\xe5\x29\x90\x7b\x21\x6d\xbe\x1c\x53\x34\x0f\xf2\x80\x0d\xe4" - "\xd5\x67\x62\xfa\x0d\x44\x30\x17\x5a\xd0\x5e\x45\xcc\xcd\x31\x47" - "\xd8\x88\xb9\x50\x24\x62\xf1\xa2\xfa\xa8\x74\x6a\x02\x1b\xe5\x08" - "\xc6\x88\xf6\x4f\x07\xce\x64\xfb\xff\x68\x17\xd8\x71\x1b\xef\x24" - "\xa8\xf7\xce\x09\xb7\x9e\x37\x5b\xdb\x59\xdf\x83\xdf\x5f\xe0\xfb" - "\xdf\x82\xdd\x87\xb6\x1f\xd8\xdb\x09\xf9\x02\xb7\xff\x44\xc8\x5b" - "\x8c\xe9\x68\x1b\x82\x5d\xba\xd7\xed\x1d\x2d\x5e\x64\xe0\xb4\xbb" - "\xf5\x55\xa4\x23\xab\xaf\xe3\xdf\x4d\x58\x67\xb1\x70\x91\x01\xdb" - "\x90\x91\x46\x45\xb3\xa3\xd3\x84\xb1\x76\xb5\xa9\x68\xb7\xde\x9a" - "\x1d\x5d\x44\x28\xf4\x6d\x83\x7f\x6d\xb8\x95\x8d\x7f\xc1\x36\x3f" - "\x67\x9d\xb2\xc8\x80\xb1\x95\x77\xa4\x8f\x50\xcd\x2d\xa4\xa6\x8e" - "\xa9\x8b\xea\x3b\x73\x6e\xdd\x2f\xc7\xae\xf5\xb3\xdc\xfd\x72\xdb" - "\x8b\xa5\xb6\x43\x1a\x5b\xb3\xbe\xbd\x80\xc5\xd4\xc6\x67\xaf\x7b" - "\x9d\x40\xbe\x94\xe3\x7f\xa1\xed\x51\x7b\x65\x3a\x39\xac\x18\x53" - "\x7c\xdc\x19\xe1\xb6\xf5\xd1\x1b\x4d\x84\xf9\xc9\xcf\xdd\x5e\xee" - "\x5f\xbd\x6e\x63\xfb\x5f\xea\x60\x5c\x10\xed\x78\x97\x72\xb9\x78" - "\xdb\xcb\x0f\x4a\xe5\xe1\x3b\x99\x57\xc5\x92\xbd\x1e\xc0\x37\x4a" - "\x7d\x68\x97\xa6\x6f\xbb\x6e\xff\x65\xe0\xed\xba\x3d\xa2\x6f\xbb" - "\x6e\x5f\x3f\xbc\xed\xba\x3d\xd3\x87\x76\x69\xfb\xb6\x2b\xf2\x96" - "\x21\xb4\xcb\xd6\xb7\x5d\x91\xbf\x1c\xde\x76\x45\xc6\xfa\xd0\xae" - "\xc8\xbe\xed\xba\x43\x11\x78\xbb\x22\x6b\xfa\xb6\xeb\x8e\x5b\x86" - "\xb7\x5d\x77\x44\xfa\x2d\x0f\xf3\x76\x12\x2e\x0f\xef\x38\xee\xbf" - "\x3c\xbc\xa3\xa4\xaf\x3c\xfc\xd1\x08\x97\x3c\xbc\xf3\xdb\x80\xe4" - "\x61\xde\x12\xc9\xd6\xb8\xf3\xed\x3e\xf2\xd0\xb8\x24\xaa\x7f\x79" - "\x78\xe7\x1e\x26\x0f\x73\x97\x44\xf9\xd7\x86\x3b\xe3\x7b\xe4\x61" - "\xf0\x92\x28\x0f\x79\x18\xb2\x13\x74\xde\x9d\x15\x81\xc9\xc3\x3b" - "\x2b\xfa\xca\xc3\x3b\x23\x3c\xe5\xe1\x9d\x5e\x63\x7d\xc1\x38\x66" - "\x76\x7f\xf2\x30\xda\xf1\x0d\xe5\xd8\x30\xce\xf6\xaf\x3e\x3f\xf2" - "\xea\xff\x1d\x30\x6f\x1a\xf8\x5b\xdb\x4d\x7e\x7e\xcb\xeb\xfc\x17" - "\x55\x1d\xb4\x81\x0d\xa2\xd9\xf4\x32\x11\x4e\x6f\x24\x42\x5d\x44" - "\x23\x31\xa7\xd9\xc9\x6d\x49\x80\x09\x3d\x99\x53\x57\xd8\x46\xea" - "\x22\x4e\x13\x3a\xfa\xa0\x8d\xfe\x71\x45\x4c\x54\x32\x62\x73\xd6" - "\xd3\xe6\x14\xbb\x9f\xd8\x9c\x35\x47\xc6\x66\x9d\x03\xb0\x99\x8a" - "\x78\xbc\xeb\x65\x73\xdb\x19\x09\x9b\x77\xe5\xf6\xf0\x47\xcf\xf1" - "\xd9\x2f\x36\xa1\x4f\x78\x62\x73\x7b\x19\xc7\xe6\x5d\xbf\xea\x8b" - "\xcd\xed\x65\xfd\x63\xf3\xae\xbb\x38\x36\xb7\x97\xf9\xd7\x86\xbb" - "\x88\x0b\x9b\xdb\xcb\x3c\xb0\x79\xf3\x8a\x98\xce\x9c\xbb\x62\x03" - "\xc3\xe6\x5d\xb1\x72\xdb\x8b\xa4\xb6\x03\xbd\xca\x3d\xb1\x79\x57" - "\xbe\x57\x1e\x1a\xfe\x64\x02\x79\xa8\x3e\x23\xdc\x1d\xe7\x04\x9b" - "\x56\x34\xb4\xeb\xa2\x9d\xb4\x13\x63\xb4\x53\x61\x16\xa1\xcf\xea" - "\xd4\x9d\x30\xde\xec\xec\x4c\x50\xd1\x31\x07\xb3\x68\x77\x38\x81" - "\xba\x87\xd2\x4e\x5d\x08\xd0\x6c\x3a\xdc\xc7\x17\xa5\x92\x30\xb8" - "\xc2\x8b\x24\xba\xc2\xef\x48\xfa\x6c\xf8\x98\xbc\x54\x32\x33\xd4" - "\x46\x54\x50\x87\xd8\xd0\xcd\x1a\x12\xea\x20\x61\xf8\x9b\xea\xf7" - "\x90\xbd\x17\x88\x12\xe7\x1a\xc5\xd1\xf0\xbd\xb4\x50\x4a\xd7\xe9" - "\xc8\xde\x64\xa8\x8f\x40\xc2\xf7\x0a\xb4\xcc\xf9\xac\x4e\xa0\x21" - "\xf9\x07\xe9\x73\xb1\xac\x4e\xe2\xf4\x15\xf9\x80\xa1\x7c\x9a\x91" - "\x80\xdf\x8d\xc2\x58\xc1\xf4\xe6\x15\xbb\x69\x67\xf8\x98\xdc\x0b" - "\x64\xe6\xde\x54\x32\xbd\x38\x95\xe8\x68\xb7\x4e\x00\x1a\xc4\x3e" - "\xfe\xb4\x06\xf9\x1e\x4b\x05\xf8\x56\x2a\x7c\x0b\x78\xe9\xcc\x86" - "\x6f\x39\xe0\x5b\xdf\xc0\xb7\xce\xc1\xb7\xf4\xf0\x2d\x3d\xff\x96" - "\x7f\x34\xbf\xbb\x66\xa0\x39\xe1\xe8\x4d\x53\xd1\x77\xed\x57\xa1" - "\x69\xa3\xe6\xe3\xfc\x70\xc7\x73\x09\x7e\xe2\xfd\xc7\x5e\xcf\xff" - "\xec\x78\x8d\x44\x50\x55\x9b\xee\xc1\xe7\x3f\xa7\xd1\x0e\x42\x9e" - "\x7f\x8d\xcc\xc4\x3e\x57\x67\x3f\x0b\xfd\xac\x4d\x77\x44\xd7\xe6" - "\xef\xb7\x0a\xbc\x7d\x2b\x47\x4f\xeb\xbb\x23\x70\xbc\x98\x5f\xbd" - "\x43\xa0\x69\x5d\x11\x8b\x4c\xc7\x1a\xba\xc8\xb2\x34\x9c\x83\xa6" - "\x69\xda\x47\x88\xaa\x59\xb8\x77\x41\xc6\x09\x9c\xcf\x9b\x1d\xe1" - "\x39\x9f\x37\x3b\x8a\x08\xff\xd6\x42\x84\x9f\x86\x11\x61\x4e\x21" - "\x81\x7c\x9e\xd7\x3d\x0d\xd1\xaf\x4c\x25\xe9\x0e\xfa\x15\x8c\x53" - "\x0b\xf2\x60\x2c\x1c\x7d\x8b\xc2\x62\x4a\xc5\xf9\xad\x7f\x3b\x09" - "\xf4\xfb\x27\xe8\xa0\x50\xfc\x8d\xe5\x25\x25\x93\x6b\xce\x08\xff" - "\xd6\x14\x6a\x1b\x35\xdf\xa1\xce\x6f\x75\xc0\xf8\xad\x3b\xfc\xff" - "\xb1\xf7\x3e\x00\x51\x57\xd9\xe2\xf8\x99\x61\xd0\x81\x40\x50\xa9" - "\xd8\x56\x6d\x34\x6a\xa9\xfc\x83\x86\x65\xad\x16\x9a\x16\x96\x7f" - "\x48\x31\xc7\x34\xc5\xc4\x1a\x8a\x10\x01\x75\x44\x64\xc6\x91\x0a" - "\x58\x54\x2a\x32\x2c\x04\x2a\xdb\x47\xbd\xf6\xe5\xbe\xaf\xfb\x1e" - "\xdf\xdf\x73\xb7\xd9\x95\x5e\x58\xc2\xb8\xfb\x73\x7f\xb1\x3d\x7b" - "\x3b\x11\x12\xf9\x50\x27\x19\x63\x84\x99\xb9\xbf\x73\xee\xfd\x7c" - "\x98\xcf\x0c\x33\xfe\x29\xeb\xed\x6e\x51\xe3\xcc\xe7\xde\x73\xcf" - "\x3d\xf7\x9c\x73\xcf\x3d\xf7\x7e\xee\x3d\xf7\x85\xb4\xf3\x15\x95" - "\xf5\xfd\x34\x9f\x7d\x8c\xec\xc0\xb4\x3f\xc7\xa8\xcc\x38\x6f\x3d" - "\x9b\xc8\x58\x3c\xad\xd9\xea\x6b\xf0\x43\xb2\xe7\x72\x8f\xfc\x7d" - "\x2c\xe9\x07\xe9\x62\x9d\x48\x8f\x25\x7d\xdc\x25\x8d\xd9\x8e\xb0" - "\x5b\x78\x1f\xf0\x60\x79\xd3\x09\x18\x65\x3b\xee\x01\xd4\x69\xfd" - "\x2a\x8f\x96\xfa\x91\xde\xfa\xc8\x9f\xa0\x33\x17\xd4\xa6\xaf\x20" - "\x1a\x75\x28\x8a\xfa\x83\x17\xfb\xc3\xc2\xe3\x31\x2e\xec\xd7\xde" - "\xe2\x73\x10\x43\x76\x82\xe2\x22\xdb\xba\xed\xe0\x3d\x93\x38\xec" - "\xd5\x1c\x88\x73\x9f\x31\x8c\x70\x9c\x31\x8c\xdc\xe3\x85\xb8\x61" - "\xb9\x10\xbb\x37\x07\x75\x77\x1d\xf6\x8f\xd3\xd8\x3f\xba\x45\xff" - "\x18\xd0\xd7\x67\x7f\xe3\xa6\x33\x37\xbc\x6f\x94\x49\x7d\x63\x53" - "\x22\xe9\xf0\x40\xdf\x70\xaf\x4b\x54\xef\x55\x33\x40\x1a\x91\xef" - "\x77\x44\xd5\x15\x0f\x25\xbb\x9f\xc2\xc6\x2c\x4e\xa2\xb9\xd9\x42" - "\x37\x73\xbf\x8b\xb2\x08\xbf\x59\xad\x63\x3b\x2a\xbb\x3e\x4c\xeb" - "\x02\xdf\x9c\xee\xee\xf9\x7d\xa3\x17\x59\x75\x8b\xd8\x99\x76\xf5" - "\x9d\xc7\x30\x5d\xab\x7b\xf8\x67\xb1\x28\xc7\xf9\x62\x0e\x78\xf7" - "\x3c\x5a\x23\xb0\xab\xef\x6c\x40\x5c\x40\xef\x25\x3e\xe2\x6b\x92" - "\x3f\x8f\x42\x58\xf0\x20\xcf\xdd\x51\x4b\xd3\xbc\x51\x95\x8d\xd6" - "\x27\xfb\x78\xdf\xec\x47\x19\x74\x66\x83\x7a\x55\x37\xf2\xc6\x83" - "\xbc\xe9\xe5\x36\x23\x8d\xdb\x8c\xd2\xff\x30\x17\xd9\x99\x77\x61" - "\x66\x18\x43\xbe\x68\x6d\x46\x0f\xac\xcc\x05\xb6\xf5\x14\xf2\xc8" - "\xd9\x46\xf6\x65\x98\x77\x93\xb0\x21\xaf\x22\x7f\xa2\xbb\x21\x96" - "\x95\x9f\xd6\xfd\x4b\x71\x73\xb8\x07\xf5\x9c\xec\x48\xcc\x36\x55" - "\x04\xca\x6a\x58\x05\xf5\x73\xec\xf7\x31\xdb\xb8\x5d\xe3\xb2\x75" - "\x6f\x4a\x1c\xd7\xbf\x29\x51\x87\x9f\x31\xb2\xad\xa1\xbb\xb8\xf6" - "\x92\x9d\x29\xbf\xa3\x80\xec\x8c\xcd\x68\x07\x37\xf2\x72\x18\x8d" - "\x4b\x9b\x12\x47\x71\x9e\x3e\x81\x3c\x7d\x1c\xb4\x93\x5c\xa0\x42" - "\xba\x62\x91\x66\x68\x31\xb4\xd3\xba\x47\xbc\x07\xfb\x11\xf1\xb9" - "\x9f\x6c\x10\xea\x1a\xfa\x29\x69\xf3\xb3\x74\xf0\x7e\xe2\x9f\x81" - "\x62\x2b\x99\xce\xb3\xcf\x68\x4d\xd4\x66\x74\x03\x8b\xae\xec\x62" - "\x7c\x1d\xe9\xce\x77\x3e\x4c\x73\x41\x68\x9d\x9e\xfe\x92\x4f\xa7" - "\xa7\xbf\xe4\xd3\xe9\xe9\x7c\x0f\x8a\x52\xaf\xcf\x57\xa3\x5e\x47" - "\x29\xf5\xfa\xe7\xbf\xfa\x4e\xf5\x7a\xc1\xe5\xeb\xf5\x9e\xd3\x0a" - "\xbd\x2e\xfe\xdf\xd1\xeb\x8f\xf4\x5c\xaf\xc3\xfa\x47\x73\x7d\xdd" - "\x6f\x73\xff\x2b\xd8\xd5\xd3\xcd\xb2\xde\x1e\x7e\x9b\xf4\x76\x46" - "\xd3\xdf\xaa\xde\x9e\xef\x4d\xd4\xe1\xe7\x8a\xeb\x2d\xe2\xbc\x64" - "\xbd\xfd\x48\xdf\x07\x32\xff\x48\x7f\x59\x69\x77\xa2\xce\x04\xf7" - "\xa0\x9d\x98\x17\xb3\x6d\x0c\xb4\x70\x1e\xde\x3d\x4f\xf7\x30\xf3" - "\xb6\xab\x67\x78\x48\x9f\xfa\x2c\x8c\x79\xa3\x2a\xf4\xa6\x3f\x42" - "\x2c\xd6\x51\x6f\x73\xff\x0a\x62\x72\xe9\x1d\xcf\xd2\x44\x16\x3d" - "\xc4\x41\xef\x82\x90\x1e\x0d\xbd\xff\xf1\x94\x9d\xd6\x7a\xd0\x9e" - "\x78\x76\x3c\x5f\xef\x2d\x3b\x02\xde\x68\xf1\x8e\x88\x45\x9c\x8a" - "\xef\x2d\xbf\x7b\x9e\xfc\xfe\x22\xa8\x6f\x12\xf5\x7c\x3d\xf6\x17" - "\x4d\xa7\xfa\x9e\xb9\xf8\xad\x46\x3a\x4e\xe0\x77\x18\x7e\xff\x86" - "\xe8\xb8\xbc\x71\xee\x6e\xe1\xf3\x55\x54\x3a\x25\x3b\xb8\x8d\xf7" - "\xc1\x5b\x20\xfa\xa4\xf4\x1b\xe9\x39\x2e\xbf\x0f\x19\x80\xf7\xf1" - "\xc3\x48\x75\x23\x4f\x34\xe2\x1d\x8d\x78\x56\xe0\xdb\xcc\x9f\x41" - "\x33\x0a\xdb\x9f\x41\xef\x52\x51\x97\x54\xbd\xcc\x70\xb7\xf4\x3d" - "\x83\xbf\xd3\x41\x3e\x90\x9f\x27\xd9\x5a\xb3\xa8\xf7\x9e\x74\x1c" - "\x87\xdb\x94\xf5\x06\xe3\x87\x5d\x7d\x4f\x6e\xa8\xbc\xcb\xe3\xc5" - "\x3d\x21\xf7\x7f\xcd\x49\xf4\xb0\xcb\xc4\x15\xf2\xfc\x2b\x1b\xb5" - "\xc8\xbc\xb0\xc1\x63\xf5\xf6\xeb\x63\xde\x2f\x3a\x75\x99\x7e\x49" - "\x4a\xc8\xf9\xaf\x27\xaa\x22\x77\xe1\xcd\x63\xc0\x53\xb3\xc8\x4c" - "\x6b\x9d\xe4\x6b\xb5\x26\xba\x81\xfc\xad\xb7\x9e\xb4\xab\xfb\xd1" - "\x67\x1c\x86\xfd\x71\x81\xf3\x3d\xb6\xeb\x24\xfa\xa8\x9b\xf4\x31" - "\x3b\x9f\x84\xe9\xee\x33\xf1\x91\xbf\x40\x1b\xd4\x87\xf6\xa0\xef" - "\x8c\x21\xa6\x35\xd7\x05\xde\xbd\x8b\xcc\x36\x77\x33\xd4\x21\x1c" - "\xd9\x5f\xa2\xf7\xfc\x19\xfd\xb0\xf2\x1c\xe0\xef\x36\xac\x8f\xbd" - "\x8d\xf6\x77\xe6\xe4\xf0\xad\x68\x73\xd0\x66\x70\x3b\xfc\x0d\x6c" - "\x70\xdf\xf6\x5b\x32\xe6\xaf\x60\xae\xd6\xe3\x7f\x02\x53\x0b\xc4" - "\x9a\x36\x40\x34\xe1\xb7\xb9\x5b\x84\x5d\x5e\x86\x76\x19\x9f\x6b" - "\x15\x76\x99\xaf\xa9\x07\xd8\x65\xf2\xbf\x5b\x3b\xba\x60\x98\x13" - "\x86\x2e\x70\xc6\xb8\x8a\x9d\xcc\x4b\xfe\x38\xbd\x47\x41\x98\x61" - "\xb2\x8d\x7e\x05\xfd\x8e\xfe\x75\xc2\x3e\xef\x95\xec\xf3\x2b\xa7" - "\xbf\xbd\x7d\x7e\xc5\x82\xf6\x19\xfd\xbd\x3d\x64\x9b\xd1\x2e\xbf" - "\xd3\xe9\x50\xbb\xd1\x16\x5f\x9e\x6c\x67\x45\x85\x92\xed\x02\x1c" - "\x3f\x49\xa6\xa4\x3b\x2d\x0d\x6e\x7a\xc7\xff\x85\x67\xd8\x73\x56" - "\x1a\x1f\xfb\x70\x6c\x7c\xeb\xc9\x36\xf5\x30\x23\xca\x36\xf7\x3d" - "\xe6\xce\xd7\xc7\xb0\x7e\x7d\xb4\xa7\xa2\x22\xd7\xdd\x1f\xaf\xed" - "\xef\x47\xf9\xa2\xbd\xc0\xf1\x2a\xd6\xb1\xc5\xc0\x79\xe2\x1d\xbd" - "\xc8\xec\x7d\x76\x54\x29\x8e\x4d\xd3\x6a\x4f\x43\x32\xdb\xf1\x9c" - "\xdd\xbd\xe3\xb9\xee\xfe\x1d\xcf\x75\xa0\x5e\x0e\x43\xff\x11\x65" - "\x7e\xde\xea\xdd\x51\x0a\xde\x9d\xe5\x56\x4f\x74\x45\xae\x23\xfa" - "\xb9\x2e\xef\x8e\xe7\x5c\xde\x2d\xa8\x07\x85\xa4\x07\xef\x83\x6e" - "\x01\x8d\xc3\xf7\xde\x19\x4c\x0f\xf6\x58\x2e\x6f\x2c\x9e\xaf\x47" - "\x3d\x68\x43\x3d\xf8\x4a\xa9\x07\xbf\x05\xb7\x45\x1a\xa3\x97\x08" - "\x5d\x40\xbe\xf3\xb9\xcc\xc0\x38\xbd\xe8\xc3\xe0\xfa\x70\xfc\xd2" - "\xf4\xa1\xef\x8c\xbf\x3e\xd4\x7c\x43\x7d\xc0\xf1\x35\xbe\x16\xe7" - "\x4d\xe7\xcf\x24\xaa\x6b\x48\x1f\xfe\xec\xd3\x87\x7f\xfe\x6f\x87" - "\xba\xff\xb2\xf5\x61\x76\xc8\xfb\xbf\x82\xeb\x43\x69\xca\xb7\xd4" - "\x07\xbb\x4f\x1f\x4a\x33\xdc\x3b\x4a\xb3\xfb\x77\x94\x66\xfa\xf4" - "\xe1\x1c\xe9\x83\xd9\xa7\x0f\xa5\x06\x7c\x36\x0e\xd6\x87\x39\x73" - "\xbf\x5f\x7d\x08\x3f\xfb\xc3\xd0\x87\xfb\x42\xce\x7f\x43\xe8\xc3" - "\xb7\xb4\x0f\xa3\xa7\x29\xf4\x01\xed\x43\x29\xda\x87\x52\x85\x7d" - "\x38\x85\xfa\x50\xa6\xb0\x0f\xa5\x68\x1f\x4a\x83\xd8\x87\xfb\x97" - "\x7d\xbf\xfa\x70\x55\xfb\x0f\x43\x1f\x52\xa7\x5f\x9e\x3e\x94\x7d" - "\x4b\xfb\x30\xba\xd2\xa7\x0f\x65\x68\x1f\xca\xd0\x3e\x94\x29\xec" - "\xc3\xa7\xa4\x0f\x0a\xfb\x50\x86\xf6\xa1\x2c\x88\x7d\x98\x9b\xf5" - "\xfd\xea\xc3\xf0\x3f\xfd\x30\xf4\xe1\x81\x90\xeb\xdf\x21\xf4\xe1" - "\xdb\xda\x87\x2e\x85\x3e\xa0\x7d\x28\x43\xfb\x50\xa6\xb0\x0f\xbf" - "\x45\x7d\x28\x57\xd8\x87\x32\xb4\x0f\x65\x41\xec\xc3\x83\x9b\xbf" - "\x5f\x7d\xb8\xbd\xfc\x87\xa1\x0f\xf3\x56\x5c\x9e\x3e\x94\x7f\x4b" - "\xfb\x30\x26\xc5\xa7\x0f\xe5\x68\x1f\xca\xd1\x3e\x94\x2b\xec\xc3" - "\x56\xd2\x07\x85\x7d\x28\x47\xfb\x50\x1e\xc4\x3e\xcc\x2f\xfb\x7e" - "\xf5\x61\xf9\xac\x1f\x86\x3e\x2c\xc8\xbe\x98\x3e\xc8\xba\x40\x7a" - "\x41\xba\xd0\x6f\xd2\x03\xcd\x33\xde\x3a\x29\xf4\x81\xf4\x80\xeb" - "\x44\x8f\x3e\xc6\x83\xba\xe0\xde\x82\xba\xd0\x27\x74\x81\x78\x41" - "\xfa\x40\xf3\x0a\x9a\x4f\x90\x4e\x78\x70\x4e\xe1\x8e\xc6\x39\xc5" - "\x36\x4d\x1c\xe9\x41\x5f\xd4\x45\xe6\x15\x7d\xc0\xe7\x7e\x34\xc7" - "\x3b\xad\x5e\xf8\x7c\x30\x3d\x78\xe5\x32\xd7\xf8\x06\xe6\x97\x7e" - "\x7a\xf0\xbe\x4f\x0f\x96\x85\x98\x57\x3c\x1c\x42\x0f\xec\x97\xa0" - "\x07\xa7\x07\xcf\x33\xbf\xad\x1e\xf4\xad\x93\xf4\x80\xe6\x99\x5e" - "\x69\x9e\xf9\x18\xce\x33\xa3\x2f\x57\x0f\xd2\x0a\xbe\x99\x1e\x94" - "\xa5\x5c\x9e\x1e\x8c\xae\x24\x3f\x41\xe8\x41\x59\xb6\x3b\x1a\x7d" - "\x05\x3f\x3d\xb8\x80\xbf\xe0\xa7\x07\x0f\xed\xf9\x7e\xf5\x20\xc0" - "\x5f\xf8\x87\xd5\x83\x45\x21\xe3\xbf\x7a\x51\xee\x64\xef\x69\xdd" - "\x9e\xce\x6e\x0c\x73\x88\x75\x23\x3a\xc3\xb1\x2b\x07\x12\x68\x8c" - "\xf0\x6c\xd2\xc7\x54\x9c\x86\xe9\x65\x39\xa0\x71\xe7\xa3\xfc\xf3" - "\x40\xd3\xa7\x06\xe8\xcb\x37\xc4\x1c\xe9\x70\x88\x35\x24\xa3\x15" - "\xea\x10\xbe\xbf\x42\xac\x21\x79\x7a\xf4\xc3\xca\xce\x02\xdf\xf7" - "\x6a\x5d\xf9\x3a\xca\x76\xf1\x86\x60\xb2\x7d\xf5\x32\x6c\x7d\x9f" - "\xd2\xd6\x9f\xf2\x97\xad\xd2\xce\xd7\x58\x14\x6b\x48\x0b\x42\xac" - "\x21\x5d\x82\x4c\xf9\xda\xfe\x69\x61\xe7\x07\xd6\x90\xbe\xe5\x1a" - "\x7f\x3f\xda\xf8\x57\xd4\xfe\x36\xfe\x9b\xc9\x34\x3d\xed\x42\xeb" - "\x8e\xd4\xbf\xa9\x5f\xcb\x7d\x7a\x60\x8c\xa7\x7e\x8c\xf2\x3e\x5f" - "\xf1\x5c\x13\x1f\xeb\xb7\xf8\xfa\x34\xf5\x65\xea\xd7\xd4\x8f\xf9" - "\x58\x4f\x71\x7e\x9f\x1d\x53\x5d\xab\x58\x3b\xf2\x44\x4b\x76\x3e" - "\x88\x8d\xf7\x5e\xd0\xc6\x2f\x09\x2a\xff\xbf\x07\x1b\x4f\x7a\x20" - "\xf7\xef\xbf\xbd\xbe\xfd\x70\xe8\xfd\x5f\x97\xa4\x07\xa5\xb3\x2f" - "\xae\x07\xa5\x29\xa8\x07\xdd\xb5\x8a\x35\x23\x4f\x74\x29\xda\x79" - "\xb1\x66\x24\xf4\xc0\xb7\x66\xe4\x0d\x5c\x33\xf2\xd3\x83\xa5\x5b" - "\xbf\x5f\x3d\x08\x58\x33\xfa\x87\xd5\x03\x7d\xc6\xb7\xd4\x83\x4b" - "\xb0\x07\xa5\x68\x0f\xae\x4f\x51\xe8\x01\xda\x83\x52\xb4\x07\xa5" - "\x0a\x7b\xe0\x5b\x2b\xf2\x06\xae\x15\xf9\xe9\xc1\xb2\x67\xbe\x5f" - "\x3d\x08\x58\x2b\xfa\x87\xd5\x83\x47\x0c\xdf\x4e\x0f\xca\x2e\xc1" - "\x1e\x94\xa1\x3d\xb8\xbe\xaa\x56\xb1\x46\xe4\x89\x96\xfc\xbe\x20" - "\x3e\x9f\xf7\x82\x3e\xdf\xf2\x1d\x7f\xaf\x3e\xdf\xdf\xb6\x1e\xac" - "\x08\xf9\xae\xf4\x12\xf5\xe0\x12\xec\x41\x19\xd9\x83\x2e\x85\x1e" - "\xa0\x3d\x28\x43\x7b\x50\xa6\xb0\x07\xbe\xb5\x21\x6f\xe0\xda\x90" - "\x9f\x1e\x3c\xfa\xd2\xf7\xab\x07\x01\x6b\x43\xff\xb0\x7a\xb0\xd2" - "\xf8\xed\xf4\xa0\xfc\x12\xec\x41\x39\xda\x03\xdd\xf4\x5a\xc5\x9a" - "\x90\x27\xba\x1c\xed\x41\xb9\xc2\x1e\xf8\xd6\x84\xbc\x81\x6b\x42" - "\x7e\x7a\xb0\x6a\xef\xf7\xab\x07\x01\x6b\x42\xff\xb0\x7a\x90\x11" - "\x72\x5f\x85\xac\x03\x03\x6b\x00\xcc\xa7\x07\x5c\xf6\xf9\xfa\x98" - "\xbe\xa8\xe7\x9a\xe4\xf9\x7f\xc5\xa0\xf9\xff\x98\xea\x90\xeb\x40" - "\x01\xef\x97\xf9\xdc\x60\xe7\x73\x56\x31\x4f\xa8\xc8\x25\xf9\xff" - "\xa2\x50\xcc\x13\x75\x0f\x93\xfc\x57\x07\x97\xff\xe5\xae\x09\x66" - "\xa2\xfc\x3b\x2e\x20\xff\x47\x43\xcc\x13\x1e\xf9\x76\xf2\xa7\xfd" - "\x8e\xfd\x67\xae\xa0\xfc\xe5\x35\xc1\x4f\x41\xfd\xca\xb7\x9a\x2f" - "\x3e\x16\x52\xfe\x41\xf7\x93\x34\x88\xfd\x24\xb4\x97\xa4\xb5\xab" - "\x0b\xca\xbe\x86\xd8\x61\xd9\x42\x27\xf8\x9e\x12\xd4\x89\x8a\x93" - "\x30\xdd\x2d\xda\x36\xb0\xa7\x84\xe2\xa2\x0b\xbb\x60\xe5\x7b\x4a" - "\xe4\xf5\x80\x81\xfd\x24\x2b\x69\x3f\xc9\x9a\x6d\xdf\x7a\x2d\x80" - "\xf6\x93\x14\xa0\x8c\x9d\x28\xe3\x73\x24\xdf\xf7\xfd\xfa\xb5\xdf" - "\x1a\x40\xa8\x7d\x24\x97\xb2\xae\xf3\x1d\xec\x23\xe1\x6b\x00\x57" - "\xa4\x4f\x67\x86\x8c\xff\x42\x72\x24\x79\xda\x12\xdd\x7c\x5d\x57" - "\xee\xe3\x36\xe3\x51\x28\xeb\x83\x58\x79\xfd\x5f\x96\x29\xd9\x7b" - "\x86\x7a\xc0\xce\xe8\xa3\x49\xa6\xbf\xc8\x41\x3b\xbf\xce\x67\xe7" - "\xbd\x43\x46\x95\xee\x2d\x44\xfb\x5e\x08\xc9\x9c\x47\xc3\xca\xad" - "\x62\x3d\xa0\x22\x97\xfa\x3b\xf5\x67\x16\xfd\x9c\xab\x5f\xea\xef" - "\x42\xde\x2d\x40\x72\xe6\xf7\x67\xaa\xd7\x6e\xa0\xbe\x47\x32\x1f" - "\x26\xc9\xbc\x36\x84\xcc\xb9\xbc\x55\xb1\x14\x8b\x83\xce\x99\x0d" - "\xc8\xdc\xbd\x5d\xb1\xfe\xa3\x94\xb9\xb4\xee\xe3\xc5\xbe\x7c\x49" - "\xfb\x87\x2e\x51\xee\x57\x6c\x7d\x1f\xe5\x5e\x2b\xc9\x7d\x60\x7d" - "\xff\x5b\xc9\xfd\xf1\xd0\xe7\x5f\xfc\xe4\x5e\x9a\x72\x05\xe4\x6e" - "\x1f\x2c\x77\x9a\xff\x93\xdc\x4b\x33\x69\x9e\xcf\xa2\x4b\x8d\xfd" - "\xd2\xbe\x91\xc1\x72\x7f\xe2\xe9\xef\x5e\xee\xe1\x67\x7f\x18\x72" - "\x37\x84\x8c\x7f\x1e\x20\xf7\x2b\xd0\xdf\x47\x4f\x0b\x22\x77\xa9" - "\xbf\x97\x76\xd0\xbc\x1e\xe5\x2e\xf5\xf7\x53\x41\xe4\x9e\xb5\xf6" - "\xbb\x97\xfb\x55\xed\x3f\x0c\xb9\x3f\x19\x72\xff\x87\xbf\xdc\xcb" - "\xae\x40\x7f\x1f\x5d\x39\x58\xee\x65\x52\x7f\x2f\xcb\xa4\x79\x3c" - "\x8b\x2e\x93\xfa\xfb\xa7\x41\xe4\xfe\xd4\xa3\xdf\xbd\xdc\x87\xff" - "\xe9\x87\x21\xf7\xec\x90\xf7\xff\x06\xc8\xfd\x4a\xf4\xf7\xae\x20" - "\x72\x97\xfa\x7b\x59\x07\xcd\xdb\x51\xee\x52\x7f\xff\x6d\x10\xb9" - "\x3f\xbd\xe4\xbb\x97\xfb\xed\xe5\x3f\x0c\xb9\xe7\x84\xdc\xff\xe7" - "\x2f\xf7\xf2\x2b\xd0\xdf\xc7\xa4\x0c\x96\x7b\xb9\xd4\xdf\xcb\x33" - "\x69\x9e\xce\xa2\xcb\xa5\xfe\xbe\x35\x88\xdc\xd7\xcd\xff\xee\xe5" - "\xbe\x7c\xd6\x0f\x43\xee\xb9\x09\x17\x7b\x5f\x2f\xcb\x5e\x5e\xb3" - "\xe1\xef\x67\xd1\xbf\x97\xe5\x4d\x7a\x40\x32\x27\x5d\x50\xca\x9c" - "\xef\xe1\x59\x27\xf6\xf0\x90\xdf\xce\x70\x2e\xce\x86\xf0\xfd\x1b" - "\x2e\x3e\x6f\x97\xfc\x78\xa6\xd2\xc4\x91\x2f\x1f\xda\x8f\x5f\x3f" - "\x43\x96\xf7\x37\x9d\xbb\x5d\x4c\xde\x81\x73\xf2\xbf\x15\x79\x2b" - "\xe7\x6f\x57\x46\xde\x79\x71\xdf\x4c\xde\x65\x29\x97\x27\xef\xb2" - "\x0c\x21\x6f\xbe\x4f\xc3\xe8\x93\x77\x59\xa6\x90\x77\x99\x21\xf4" - "\x78\x9e\x3f\xe1\xbb\x97\xb7\xff\x9a\xfc\x3f\xae\xbc\x0b\x42\xde" - "\xff\x41\x6b\x30\x24\x6b\x92\xfb\xae\x27\x21\xe1\x17\x4f\x8a\xb5" - "\x15\xf7\x99\x78\xb2\xf9\x1a\x92\x3f\x9d\xf1\x19\x86\x3a\xf0\x91" - "\xde\x01\x7d\xbd\x7a\xa0\xb3\x3c\xb4\xef\xa2\xd5\x60\x07\x9b\xf1" - "\x43\x28\xcb\x83\xd8\x23\x19\x67\x61\x41\x03\xeb\xb7\x1d\xb7\xd2" - "\x19\x6f\x8d\xb5\xf0\x43\x60\xeb\x12\x23\x57\x3a\x41\x7d\x5a\x5d" - "\x70\x90\xf6\x6d\x4c\x74\x22\x4f\xe8\xbc\x0f\xca\xbc\xec\x34\xc0" - "\xfb\x05\x00\xba\xc7\x49\xd6\x1b\x7e\x12\xbe\x21\xc8\x39\x9f\xcb" - "\x59\x97\x51\xae\xbd\x06\x91\xf5\xab\xea\x2b\xb3\x37\x43\xde\x97" - "\xe1\xb7\x2e\xf3\x6d\xcf\x5f\x5e\xb1\xbd\x19\x1b\x42\xc6\x72\xa2" - "\xfd\x36\x24\x4f\xea\xd3\xee\x9d\x62\x5d\xc6\x66\x6c\x06\xda\x57" - "\x43\x7d\xd8\xd3\x13\xaf\xdd\x52\x80\x7d\xbd\x4d\xf4\xf5\x5f\x9c" - "\x45\xd8\x8c\x4f\x80\xf4\x43\xc8\xb6\x5f\xc8\xf6\x2c\xc9\xf6\x13" - "\x60\xf9\x89\x91\xa7\xd5\x1b\xab\x48\xbe\x24\x57\xd3\x5f\x20\x76" - "\x15\xc5\x45\x21\x1b\x8f\xf6\x1d\xe5\x3c\xad\xee\x49\x48\xa6\xfe" - "\xef\xd9\xf1\x5c\x87\x7b\x87\xd8\xa3\x41\x76\xbf\x3f\xaa\xb2\xab" - "\x3c\x4f\x92\xff\x23\x24\xff\x4d\x41\xe5\xff\xea\x37\x5d\x7b\x97" - "\xe4\xff\x8d\xcf\xf5\xfc\x6f\xf5\xf7\x75\x57\xaa\xbf\x6f\x0a\x19" - "\x13\xc5\x5f\x0f\xc4\x3a\xcd\xe5\xe9\x41\x6f\x10\x3d\x30\xd6\x0c" - "\xd6\x83\xd2\x0c\xd4\x03\xbb\xbf\x1e\x94\x66\x0a\x3d\x28\x35\x60" - "\xbe\x71\xb0\x1e\x6c\x1e\xfb\xfd\xe8\xc1\x25\x9e\xe7\xf9\xbb\xd7" - "\x83\xcd\xee\x4b\xd4\x83\x6f\x60\x0f\xce\x04\xd1\x83\xc2\x7d\x41" - "\xf4\x00\xed\xc1\xe8\x69\x01\x7a\x20\xd9\x83\x52\xb4\x07\xa5\x41" - "\xec\xc1\x96\x9b\xbf\x1f\x3d\xb8\xc4\x73\x3c\x7f\xf7\x7a\x50\x14" - "\x72\xfc\xf7\xd7\x83\xb2\x6f\x60\x0f\xfe\x1a\x44\x0f\x8a\xde\x19" - "\xac\x07\xe8\x0b\xa2\x1f\xe8\xaf\x07\x65\x92\x3d\x28\x33\x90\x7f" - "\x38\x58\x0f\xb6\x4e\xfe\x7e\xf4\xe0\x12\xcf\xef\xfc\xdd\xeb\x41" - "\x71\xc8\xf3\xbf\x01\x7a\xf0\x0d\xec\xc1\x7b\x41\xf4\xa0\xf8\x40" - "\x10\x3d\x20\x7b\xd0\x15\xa0\x07\x92\x3d\x28\x43\x7b\x50\x16\xc4" - "\x1e\x98\xee\xfc\x7e\xf4\xe0\x12\xcf\xed\xfc\xdd\xeb\x81\x39\xe4" - "\xfc\xcf\x5f\x0f\xca\xbf\x81\x3d\x30\x05\xd1\x03\xf3\xc1\xc1\x7a" - "\x50\x8e\xf6\x60\x4c\x8a\xbf\x1e\x94\x4b\xf6\xa0\x1c\xed\x41\x79" - "\x10\x7b\xb0\x6d\xe6\xf7\xa3\x07\x97\x78\x5e\xe7\xef\x5e\x0f\x2c" - "\x21\xcf\x7f\x2b\xf5\xa0\x7f\x60\xbe\xd0\xc8\xf5\xa0\xbc\x50\xe8" - "\xc1\x56\xd2\x83\x2e\xb1\x7f\xa7\x42\xd2\x83\x81\xb9\x42\x47\xa0" - "\x0e\x58\xac\x03\x3a\xf0\xa5\x6f\xae\xd0\x8f\xf2\xe6\xeb\x41\xd2" - "\x3c\x41\x5e\x07\xe2\xf3\x04\x9c\x27\x96\x9f\x95\xe4\xcf\xd7\x04" - "\xb6\x07\x97\xff\x65\xcc\x13\xfd\xf6\x68\x04\xca\xff\x6f\xfc\x9c" - "\xce\xa0\x75\x81\xbf\x7c\xdb\xbd\x19\x25\x97\x28\x7f\xd9\x2f\xb8" - "\x54\xf9\xff\x35\x88\xfc\x4b\x82\xc8\xbf\x2c\x43\xc8\x7f\x74\xa5" - "\xec\x0f\xc8\xeb\x42\xdc\x1f\x18\x24\xff\x67\xbe\x27\xf9\xff\x6d" - "\x9e\xcf\xb9\xf2\xf2\x7f\x36\xa4\xfc\x3d\xd8\x07\xf6\xaa\xbd\xfb" - "\x2b\xd5\xde\x46\xfc\x58\xf1\xd3\x8c\x69\xe1\x98\x76\x94\xca\x54" - "\x4a\x79\x9e\x72\xa0\xd8\x49\xd6\x18\x55\x06\xf1\x9b\x60\x86\xc8" - "\x30\x31\xdb\x20\x05\xdb\x26\xe0\xd4\x60\xc6\x74\x6b\xf4\xb6\x94" - "\x21\x08\xdf\xcc\xca\xef\xa9\xc0\xb4\xa1\x04\xcb\xb6\x69\xe2\x39" - "\xbc\x8a\xc7\xce\x94\xe0\x55\x14\x2b\xcb\x4a\xb0\x08\xa7\x95\xe0" - "\x38\xbd\x4c\xad\x86\xba\xc1\xb4\x45\x48\x30\x3a\xaf\x05\x74\x4a" - "\x1a\xa3\x55\x29\x1c\x97\x04\x17\xe9\xb1\x1c\x7d\x87\x60\x3d\xdb" - "\x34\x09\x4a\x38\x36\x0b\x08\xaf\x0c\x77\x95\x84\x2f\xd1\xaf\xbd" - "\xe3\x00\xa2\xb7\xe9\x38\xbe\xe8\x6e\x35\x48\xf4\xa1\x4e\xdc\x9d" - "\xc1\xe1\x55\x9a\xf1\x7e\xf0\x43\x40\xd9\x8e\x68\x36\x64\xac\x59" - "\x82\x4b\xf2\xaa\x81\xc7\xda\xc1\x74\x8d\x92\xd7\x12\xec\x30\x99" - "\x8f\x14\xd3\x49\xd9\x5e\x0f\xb6\x7f\xaf\xa0\x31\xc6\xf3\xac\xae" - "\x52\x6a\xcb\x34\x65\xbd\x04\x87\xe5\x26\x4b\x32\x89\xc5\x76\x4c" - "\x1f\xc0\x57\xb1\xb4\x5a\x86\x43\x9d\xfd\x09\xca\xc8\x6a\x33\x00" - "\x48\xed\x1e\xce\xca\x53\x74\x52\xdb\x53\xfc\xf9\xa8\xb2\xcb\x7c" - "\x44\xf9\x1d\x43\xd8\x11\x08\x33\x5b\xc6\xeb\xb1\xf0\x38\x5a\xa2" - "\xdd\x16\xf7\x48\xd2\x8b\x96\x2e\x80\x5a\xd1\x9e\x91\x12\xce\x54" - "\xd1\xe6\x58\xd8\x3b\x20\x6b\x0d\xe5\x59\x25\xb8\x38\xde\x9e\xc8" - "\x05\x07\x3c\x2a\xcd\xbc\xc1\xb0\x5a\x25\xec\xd5\x02\x76\x56\x3a" - "\xc2\xa6\x0d\x86\x8d\x55\xc2\x5e\x23\x60\x67\x67\x22\x6c\xfa\x60" - "\x58\xf7\x08\x05\xec\xb5\x02\xf6\xbe\x02\x84\xd5\x0f\x86\xd5\x29" - "\x61\xe3\x05\x6c\xda\x41\x84\x5d\x31\x18\x36\x45\x09\xfb\x13\x01" - "\x9b\x5a\x82\xb0\x19\x83\x61\xcd\x4a\xd8\xeb\x04\xec\x03\x55\x08" - "\x9b\x19\x08\x5b\xc7\xf5\x00\xc6\x49\x7a\xf0\x53\x01\x3b\x6f\x1f" - "\xc2\x1a\x82\xb4\x2d\x8c\xe3\x15\xb0\xa3\x04\x6c\x8a\x11\x61\xb3" - "\x83\xc8\x42\x09\x3b\x5a\xc0\x66\x34\x23\x6c\x6e\x10\x59\x28\x61" - "\xc7\x08\xd8\xf4\x6a\x84\x2d\x08\x22\x0b\x25\xec\xf5\x02\xf6\xe1" - "\x7a\x84\x35\x06\xe1\xaf\x0f\x36\x52\xdf\x80\x30\x45\xc8\x93\xa3" - "\x41\x78\xab\xc4\x39\x56\xe0\x7c\x64\x3f\xc2\x9b\x83\xf0\x56\x09" - "\x3b\x4e\xc0\xae\x68\x44\xd8\x92\xc1\xb0\xa0\xda\x2b\xf8\x3b\x45" - "\xe2\xef\x0d\x02\x7e\xa5\x15\xe1\x4b\x83\xf0\x97\xf2\xad\x52\x5f" - "\x4b\x10\xb0\x8b\x9a\x10\xb6\x22\x08\x7f\x95\xb0\x37\x0a\xd8\xdc" - "\x6c\x84\xad\x0c\xc2\x5f\x25\xec\x4d\x02\x36\xb3\x06\x61\xab\x82" - "\xf0\x57\x09\xfb\x33\x01\xfb\x38\xe9\x4e\x75\x10\x7a\xc7\x29\x60" - "\x13\x05\xac\xa1\x02\x61\x6b\x82\xc8\x42\x09\x7b\xb3\x80\xcd\x5b" - "\x81\xb0\xf5\x41\xe4\xa1\x84\xbd\x45\xc0\x3e\x49\xba\xbe\x2f\x88" - "\x3c\x94\xb0\xb7\xb2\xc8\xec\x22\xc9\x2e\x36\x04\xc2\xa2\xec\x85" - "\x4d\xb4\xc0\x78\x16\x99\x53\x80\xbf\x09\x8e\xc7\xca\x1f\xc0\x67" - "\x71\xdf\x46\xf6\x46\xb2\x61\x13\x58\xe4\x63\xcd\x12\xbe\xfd\x83" - "\xea\xb6\x68\x94\xb0\x13\x59\xa4\x25\x53\x82\x3d\x30\x18\x56\xab" - "\x84\x9d\xc4\x22\x37\x26\x4b\xb0\x8d\x83\x61\x63\x07\x60\x59\xa4" - "\x71\x3a\xc2\x1c\xac\x95\x6c\xa3\x82\xce\x29\x0a\x7c\x93\x59\x64" - "\xe1\x6c\x09\x9f\x75\x30\x3e\x9d\x12\x76\x0a\x8b\x2c\x91\xe9\x6c" - "\x1a\x0c\x9b\xa2\x84\xbd\x8d\x45\x16\xcd\x93\x60\x9b\x07\xc3\x9a" - "\x95\xb0\xc9\x2c\xb2\x38\x5d\x82\x3d\x32\x88\xf7\xd4\x0f\x2c\xe8" - "\x0b\x08\x9b\x34\x95\x45\x9a\x57\x48\xb0\x7e\x7e\x80\x62\x1c\xbe" - "\x5d\xc8\xbd\x60\x1e\xca\xfd\x18\x1f\x6f\xb6\x69\xda\x82\xf9\x18" - "\xb9\xb7\xc0\x55\x27\xd5\xbb\x62\xc5\x98\x24\xdf\x7b\x55\xc9\xed" - "\xad\xb7\x66\x51\xfd\x42\x27\x73\x2b\xd3\x76\xa9\xd9\xd1\x49\x4e" - "\xd0\xf0\xbb\x54\xa2\x2b\x9b\xed\x98\xee\x18\xbd\xc8\xda\x5b\xbe" - "\x6b\x94\x5d\xf5\x53\x2b\xc5\xf1\xc3\xdf\x89\x76\xc8\xac\xa1\xdf" - "\xbb\x2c\x8c\xee\xe8\x50\x79\x76\x2e\xcd\xb0\x79\xbb\xd1\x97\x63" - "\x2e\xc4\xe1\x42\x5f\x2e\x4c\x87\xf3\x4a\x93\x91\xf5\xd9\x8c\xdd" - "\xd0\xa9\xde\xf5\x34\x5b\x67\x98\x8e\x34\x98\xb1\xbe\xcc\x76\x7c" - "\xe6\x34\xa0\x0f\x84\x63\x65\x91\x35\x8f\xe2\x88\xee\xda\xeb\x88" - "\x7e\xde\xcc\xb6\x2f\xef\xca\x2d\x86\xeb\x91\x6e\xde\x57\x78\x8c" - "\xc1\x33\x86\xbb\xbd\xd1\x4b\x8b\x28\xf6\x20\xab\x7e\x21\x43\xc4" - "\x25\xdc\xc5\xef\x76\x44\x1a\x8e\xb2\x51\x8b\x2a\xbd\x7d\x25\x66" - "\xba\x57\xcd\x5a\x7c\x12\xda\x15\x79\x8e\x9f\xbc\xc0\x63\x16\x62" - "\x9b\x2a\x3d\xa5\xff\x71\xdc\xab\xfd\x8f\x36\x56\xfa\xbe\xd5\x96" - "\x6d\x07\x71\xe7\x4b\xe5\x32\x36\x6c\x99\xcd\x5b\xfa\x1f\x56\x4c" - "\xdf\x6f\x73\xf6\xf1\xf4\x76\x75\x65\x02\xf9\x97\x3d\xda\x3f\x54" - "\xb2\xd2\x3f\x54\x59\xaf\xeb\x83\x0e\x75\x25\xf7\x27\x28\x9d\x95" - "\xbd\x6f\x25\xfe\x78\xcb\xde\xdf\x1f\x16\x0f\x9a\x9e\x88\x3f\x54" - "\xf6\x96\x57\xce\x96\xef\x1e\x91\xeb\x22\xbc\x76\x09\x57\x88\x7d" - "\x1f\x31\x6c\xc7\xd2\x6a\x2c\x6b\x46\x7f\x71\x85\xe0\x71\x65\x85" - "\x1d\x9c\xf3\xa4\xdf\xd5\x76\xe8\x4d\x90\x7e\xef\xb3\xab\x46\xe8" - "\xa4\xdf\xfb\xe5\x98\x8e\xc1\x63\x4c\x2e\xcd\x46\xde\x96\x78\x5f" - "\xd5\x6b\xc9\xd7\x25\xff\x9d\x45\x2f\xcd\xd6\x8d\xa1\xfb\xfa\x9e" - "\x4f\xc5\x3a\x4b\x44\x7c\xff\xe7\xa3\xf1\x3b\x46\xfa\x76\x48\xdf" - "\x8c\x60\xb8\xde\x8c\x5a\x1c\xcb\x2a\x7e\xa1\x27\xde\x16\x7b\x98" - "\x17\xf1\x36\x20\x9f\x1a\x6d\xc6\x2e\x89\x7f\xcf\xdf\xc9\xfd\x7e" - "\x92\x1d\xca\x97\x45\xbc\xdf\xc8\xeb\xda\xf1\xbc\x59\x49\x17\xc2" - "\x40\xd2\xe4\x29\xb7\x25\x4f\xbd\xfd\x8e\x69\x77\xae\x7e\x6c\x4d" - "\xe6\xda\xc7\x9f\x30\x64\x3d\xf9\x54\xf6\xd3\x39\xeb\x72\xd7\xe7" - "\xe5\x17\x6c\xd8\xb8\xc9\xb8\xb9\x90\xe0\x06\xda\xf0\xea\x6c\x95" - "\x53\x0d\x58\xcf\x2c\xaa\x87\xdf\x7b\x4d\x69\x42\xfe\xcf\xd7\x68" - "\x74\xc1\x7d\x6b\x1b\x7a\xbb\x74\x87\x4c\xb7\xfa\xf9\xf3\x74\x9f" - "\x0d\xea\x99\xca\x56\x73\xbf\x95\xee\x18\xeb\x50\x3f\xdf\xdd\xea" - "\xb8\xdf\x4a\x77\xdc\x1d\x8a\xef\x82\x84\x71\x74\x0f\xd9\xf3\x6d" - "\x94\x5f\x77\x13\x40\x13\x96\x0d\x86\x73\x5c\x2c\xc4\xbf\x78\x0d" - "\x73\x54\x5d\xc3\xba\x09\x7f\xd5\x6e\xd6\xe5\xd8\x62\x80\x9d\xf8" - "\x8c\xba\x1e\xdb\xa9\x7e\xe1\x57\x87\x46\xf1\xbb\x9a\x46\xd5\xee" - "\x66\x1d\x25\xd7\xb0\x8e\xed\xbb\x59\x77\xdd\x35\xcc\x9e\x50\x05" - "\x51\xbd\xe5\x2f\x64\xd8\xd5\xcf\x37\xf2\x7e\x83\xf9\xde\xc8\xe7" - "\xf5\xbb\x30\x6f\x92\x1b\xc2\xea\xf0\x19\xd3\x9c\x87\x74\x82\xee" - "\x77\xcf\xba\xc2\x11\xdf\x6c\xd6\x9f\xad\xda\x89\xf5\x08\x39\xbd" - "\xf0\xc7\x26\x1c\xc9\xb1\x3e\x87\xcd\xd5\x0e\x76\xf5\x0b\x47\xeb" - "\xbe\xe6\xf5\xc5\xd8\xaa\xbb\x81\xf0\xfd\x4b\x9e\x2b\x3c\xff\x3a" - "\xe6\x46\xd8\xfd\xde\x2d\xd9\x2a\x84\xa9\x40\xdc\x4e\x65\x7b\x12" - "\x1f\x7f\xba\x40\x97\xb3\x21\x3b\xfb\xe6\x48\x48\xe4\xdf\x7e\xf7" - "\xe3\xd1\x7d\x49\xf0\xe2\x6e\xd6\x84\xed\xb4\x62\x7b\x9b\x5b\xd0" - "\x83\x47\x9d\x01\x6c\x53\x65\xa7\xfa\xc5\x1b\x31\xfd\x20\xfe\x3e" - "\x88\xb4\x37\x8b\x3b\xd5\xf6\x3d\xc4\xca\x5f\x38\x8e\x74\x36\xd3" - "\x3d\x1b\x14\x93\xb6\x67\x53\xba\x0a\xdb\x5d\x85\x70\xcd\xba\xeb" - "\xe0\x46\x2c\xf7\x2b\xa4\x63\x1f\xfe\x26\xf8\x65\x24\x47\x84\x6f" - "\x12\xed\xda\x37\x93\x9e\x91\x57\xd6\xbd\xd7\xb0\x8a\xde\xf2\x17" - "\x4b\x29\xd6\x36\xbf\x93\x08\x9f\x91\x2f\xcd\x08\x5b\xd9\x63\x4a" - "\x57\xe1\x5c\x50\x55\xe7\xc3\xa9\x27\x9a\x88\x0e\x9a\x5f\x7e\x84" - "\x1e\x9c\xb7\x5f\x0f\x13\x5c\xa0\xfa\xa8\x03\xa0\x66\x37\xab\xc7" - "\x4f\x0d\x7e\xaa\x3f\xc4\xbc\xc3\xf8\x69\xc6\xf4\x23\xf8\xfd\x21" - "\x7e\x1f\xc6\x0f\xce\x4f\xe3\x89\xee\xfc\x22\xd6\x35\xa9\x1a\x6e" - "\x20\xfc\xa8\x5b\x4b\xdb\xd5\x6f\x34\x10\xed\x14\xcb\x9e\x45\x56" - "\x05\xc4\xff\x7e\xa9\x12\x30\x1f\xbf\xf7\x89\x6f\xe5\xe7\xa5\x6e" - "\x50\xef\x8e\x12\xbf\x77\xa7\xe3\x73\x91\xf4\xdb\x80\x9f\x82\x8b" - "\x7f\x02\xf1\x85\xfa\xec\xb6\x5f\x3a\xec\xa5\x7c\xf6\x8d\xba\x34" - "\xb8\xea\x6a\x9c\x11\x3b\x40\xfd\x6a\xa2\x7f\xfa\xab\x20\xd2\xea" - "\x8e\x88\xe7\xba\x36\xf1\x5d\xaf\xc1\x0f\xf2\xe9\x35\xc4\xff\x5a" - "\x8a\x48\x7b\x6d\x1e\x7e\x57\xe1\xa7\xde\xbf\xfe\x7d\x58\x7e\x5f" - "\x32\xc9\xb3\x9f\xee\x77\x43\x59\xda\xd5\x2f\x76\x93\x8c\x76\x09" - "\xdd\x52\x79\x19\x4f\xeb\x42\xdd\xaa\xf1\xe9\xcf\x4b\x9f\xfa\xeb" - "\xcf\x4b\xcd\x01\xfa\x53\x49\xf6\x08\xcb\x25\xd7\x09\x7d\x39\xd8" - "\xb3\x25\x13\x9f\x5f\x3a\x82\x78\x0e\xd2\xba\x47\xa7\x7a\x37\x9f" - "\x87\xed\x3a\x89\x73\x4f\x03\x68\xc8\xbe\x74\xab\x77\x8f\x26\x9d" - "\xa5\xba\xa5\x7a\x05\x2d\x48\x1f\xa6\xd5\x13\x7d\xeb\x10\x2f\x3e" - "\xef\x43\xb8\x7a\x1b\x9c\x95\x69\xe3\x65\xca\x9f\x44\x7d\x94\xe8" - "\x25\x9c\x54\x8e\xf9\xda\xd5\x45\x65\xa4\xba\xff\x88\xe9\x34\x57" - "\xa5\x33\x4d\x61\x36\xb7\x1d\x48\x27\xe9\xdb\xe6\x4e\xc2\xbe\x94" - "\x0a\xde\x5e\x3d\x4c\x8a\x87\x24\xec\x6f\x11\xed\xea\xdd\x07\x26" - "\x16\x41\x12\xe1\x23\xbb\x6e\x57\xef\x36\xd6\x51\x5f\x14\xb8\x0e" - "\x53\x3b\x08\xff\x87\xb9\xc0\xeb\xa9\x25\x7a\x30\x5f\x51\x6f\x15" - "\xcd\x45\x77\x15\x8a\xb6\x62\x5d\xfb\xb0\xfc\x7e\x6a\x3b\xf1\x13" - "\xf3\x1b\x3b\xd5\x2f\xc7\x52\x1e\xbf\x0f\x48\xb4\x67\x1f\xdd\x19" - "\x41\xfc\x20\x78\xba\xb3\x51\xc4\xfe\x7e\x71\x2a\xe7\x1b\x96\x27" - "\x79\x30\xac\x83\x70\x98\xdc\xcc\xcd\xd0\x1e\xbd\x51\xe8\x42\xdf" - "\xa2\xba\xcc\x5f\x3e\x2f\x1b\x94\xf2\xc1\x72\xfb\xb1\x7c\x13\xc3" - "\x36\x92\x3d\xc1\x3a\x63\xe8\x9e\x38\x4c\xab\xf4\x96\x23\x8e\x8d" - "\x2e\xbe\x56\x83\x78\x36\x23\x2d\x95\x84\x07\xe9\x69\x92\x70\x1d" - "\xf8\x7d\x91\xbf\xac\x25\x7c\xfb\x48\xe6\xbc\x3f\x17\xf2\x36\xa1" - "\xed\xaa\x9e\x5b\x2b\xf2\x1a\x11\xa6\x91\xf5\xa7\x02\xdd\xc1\x20" - "\xc6\x12\x9e\x77\xc0\x74\x9e\xcb\xb7\x49\xd8\xb5\xea\xac\xfc\xad" - "\xac\xcb\x47\x77\xb5\x4e\xbe\xc7\x42\xa2\xfb\x00\xd5\xc7\x36\xad" - "\xe0\x63\x2b\xd5\x41\xe5\x05\xbe\x97\xdd\x84\x4f\xe6\xd5\x44\xa4" - "\x43\xf0\xeb\xe5\x24\x4c\xdf\x47\xba\xc8\xf9\x86\x76\xb4\xc7\x44" - "\xba\x58\x9d\x80\xe5\x0f\xee\xa4\xe7\x4d\xf4\xfc\x72\x23\xb7\xb1" - "\x03\xf9\x2f\x67\x53\xbe\x0d\xe7\xfa\xbb\x9e\x42\x5d\xf2\x02\xdc" - "\x10\x07\x49\x4e\x0b\x6f\xdb\x3b\xce\x2d\xb3\x55\x87\xdc\x00\x44" - "\x27\xf2\xa8\x11\x69\x3d\x82\xb6\x9f\xdf\xd5\x87\xf6\xfa\x00\x7b" - "\x43\x0f\x44\x33\xda\x33\x89\xbe\x3d\x33\x24\xd9\x1f\xa0\x36\x12" - "\x3f\x27\x0a\xdb\x87\x79\xaf\x7c\x46\xb4\xfb\xda\xbd\x27\x5e\xc9" - "\x63\xde\x6e\x94\x03\xc9\x8b\xe4\xe2\xc3\x59\x4d\xba\x5f\x89\xb8" - "\xa4\xfb\x17\x85\x6e\x10\xaf\x2b\xaf\x61\x47\x08\xde\x07\xfb\xca" - "\x43\x94\x57\x8c\x75\x4f\xca\xc5\x31\x1d\xfb\x05\xdd\x45\x82\x78" - "\xdf\xa1\xfb\x38\x11\x07\xf7\x21\x10\xee\x4d\xd2\x47\x7c\x3e\x22" - "\xd1\xbd\x0f\xc7\xf3\xf1\xf8\x99\xee\xeb\xff\xaf\xbc\xe4\xaf\x5f" - "\x7b\x02\xfb\x3f\xc9\xbb\xd2\x6b\x4a\x05\xae\x0f\x79\xa0\x3b\xad" - "\x7e\x65\xb2\x34\x76\x48\xb2\x7e\xe5\x99\x43\xd8\x5f\x7c\x38\x5e" - "\x89\x0a\x90\x75\x23\xd7\xc7\x4d\xf3\x54\xd4\x66\x2c\xdb\x28\xf0" - "\xec\xe1\x6d\xe6\xfa\x64\xe1\x3a\x70\x84\x6d\xc2\x76\x0e\xe8\xc1" - "\x1e\x83\x24\xe7\x23\x01\x3c\x91\x6d\xd7\x01\xba\x33\x8e\x6c\x12" - "\xfa\xb9\x77\xf7\xf6\xfb\xec\x12\xc9\xde\xcb\x65\xff\x4a\x6c\x9d" - "\x18\x6f\x25\xbb\xb5\x47\xe4\x5f\xe3\xa7\xc3\xd4\xa6\x39\x5c\x7f" - "\x89\x16\xd3\x0a\xa2\xa5\x91\xd3\x61\xd2\x01\xe6\x1d\xa4\xfa\x11" - "\x57\xaa\xd4\x5f\x65\x5c\xa3\x08\xd7\x76\xb4\x55\x44\x13\xd6\xdd" - "\xc0\xed\xdf\x7d\x44\xdb\xab\xa3\x25\xda\x9b\x5d\x16\x2a\xbb\x3b" - "\xf6\xbc\x9a\x97\xc5\x79\xc1\x4b\x25\x2e\x71\xaf\x4c\x24\x96\x6f" - "\xa0\x58\xfe\x9d\xea\xba\x22\xb2\xd1\xf4\x1e\x09\x7f\xaf\xa5\x33" - "\x9f\x68\x53\x34\x88\x4f\x4b\x3a\x2a\xeb\x45\xb7\xba\x6e\x09\xcd" - "\x19\x90\xd7\xef\xa0\x8f\xd4\x40\xfc\x26\x5d\x46\x1f\x29\xb9\xb7" - "\xfc\xd5\x12\x59\x6f\xb1\x9e\x1a\xe2\xbd\x90\xcf\xab\x87\x51\x8f" - "\x1b\x7d\xba\xf5\xea\x61\x89\x8f\x0d\xc8\x47\x2d\xd6\x37\x57\x6a" - "\x57\x03\xc2\xa3\x2f\x56\x77\xa7\x44\x7b\xb5\x04\x7f\x42\x96\x83" - "\xd4\x57\x8f\xec\x24\xfb\xcb\x65\x50\x53\x24\x95\xdd\x27\xea\xaa" - "\xd9\x2a\xc3\x92\x8f\x28\xee\x8b\xaa\xd9\x4a\x76\x70\x12\xca\x9e" - "\xdb\x3e\x7e\x57\xad\x48\xa3\xbe\x23\xea\xa8\xbb\x91\xeb\x21\xfa" - "\x3d\x3e\x3d\xaa\x49\x0f\xb0\x4f\x64\x8b\x2b\x5b\x11\x07\xd9\x53" - "\xd2\x25\xb2\xa9\x34\x67\x41\x7c\xe3\xa5\xfe\x23\xd1\x5c\xf3\x7b" - "\x7f\x5d\xa9\x1b\x8e\xba\x32\x41\x81\x7b\x7f\xb0\x71\xae\x4e\xd8" - "\xc0\x1a\x51\x66\xaf\x4a\x6a\xdb\x3b\xa2\x6d\xd2\x33\xf1\xad\x98" - "\xf8\x56\xfb\xbe\x82\x8f\xc8\xb7\xda\xc9\x12\x7c\x23\xd9\x72\x5f" - "\x7f\xdd\xfb\xb4\xdc\x97\x07\xdb\x8b\xda\xb1\xd4\x1f\x7c\x74\xed" - "\x4d\x0d\xb0\x17\x8d\xc1\xed\xc5\xde\x78\xa9\xbd\xf5\x01\x7d\x63" - "\x9f\xa0\x5d\x1a\x5b\x50\x0e\xad\x38\x27\x13\x77\x23\xbd\x38\x95" - "\xec\x27\xd5\xad\x1c\x83\x6a\x05\x5f\xa5\xbe\x5c\x1b\x3d\x58\x0e" - "\x7b\x8f\x2b\xfb\x33\xc9\x9a\x6c\x02\xe1\x20\x99\x72\xbf\x12\xd3" - "\x84\x5c\xf7\x1e\x20\xdb\xa0\xb4\xd1\x08\x5b\xe5\x65\xd4\x5f\xf6" - "\xda\xfd\xfb\xe2\xde\x79\x52\x5f\x94\xeb\xfe\x35\xca\x28\xc9\x57" - "\x6f\x6d\x7a\x40\xbd\x24\x9b\x26\xe2\x83\x68\x63\xed\x5e\x79\x4c" - "\x23\x78\x2c\x6b\xc4\x32\xa5\x01\xe3\x63\x25\xd1\x87\x75\x71\x1f" - "\x9c\xe8\x41\x5b\x61\xec\xe5\xf4\xd4\x56\xd4\x49\xe3\x04\xa6\x25" - "\x49\x69\x7a\x69\x2c\x91\xf4\xa6\xd6\x13\x40\x53\x57\x70\xff\x68" - "\x2f\xc8\xfe\x11\xc7\xc5\x6d\x51\x6d\xb7\xd4\x3e\x4a\x9b\x20\xd2" - "\x6a\x0e\x50\xda\x4e\xc1\x87\x2a\xc6\xc7\xab\x1a\xbd\x34\x5e\x51" - "\xff\x52\xdb\xd5\xaf\x36\x53\x1f\xa3\x67\xbb\xba\x2e\x85\xf0\xdb" - "\xcc\x7d\x44\x7f\x35\xe6\x65\x92\x3d\x20\x7b\x41\x7b\x53\xf9\xf7" - "\x02\xfe\xbd\x83\xec\x0e\xf9\x21\x94\x8f\x70\xe9\x64\x8b\x30\xfd" - "\x35\xdd\x03\xe8\x17\xfc\x8f\x16\xf1\xd6\x95\x48\x65\x7f\xc3\x7d" - "\x85\xff\x49\x0d\x93\xd3\xe4\x72\xd8\xd7\xd7\x52\x39\x2a\x2f\xdb" - "\x2f\xb2\x5d\x6e\xb2\x4d\xa2\xbe\xf3\x92\x8e\xf3\x79\x83\xec\x17" - "\xf5\xab\x15\xb0\x74\xa7\x0c\xb7\x69\xf5\xb3\x85\x3d\xab\x9f\x4a" - "\x65\xb9\xfc\xd0\x56\x16\x9f\x67\x9f\xd5\xe5\x81\xa6\xf6\x2c\xf7" - "\xb1\x92\x05\x9d\xf5\x95\xa2\x1d\xf5\xcb\x78\x3b\x84\x4d\xad\x14" - "\xb4\xbc\x98\x5c\xdb\xc7\xf3\x36\x50\x5b\x28\x6f\x97\x22\x8f\xf5" - "\x27\x52\xde\xf3\x9c\xae\x80\x72\xde\x7e\xc3\x20\xf8\x3a\x71\x27" - "\xb0\xb6\x76\xb7\x6c\x7b\x5f\x8b\x95\xe8\x6c\x91\xed\x2e\xf2\x65" - "\x05\xd9\x5e\x9e\xf7\xb8\x04\xb3\x40\xfa\xe6\xf6\xbd\xde\x23\xf8" - "\x1a\xaf\x96\xf8\x9d\x29\xda\xf1\xda\x70\x3e\xcf\xfe\x1f\x3d\xf2" - "\xb6\xde\x29\xf3\x56\xf9\x9b\xfa\x0f\xd6\x4f\xe3\x92\xb0\x2b\x45" - "\x7c\x0e\x5b\x43\x30\x44\x93\x18\x23\xea\xba\x03\x7d\xea\x4e\xf5" - "\x1b\x65\x34\x2e\x09\x5f\xf5\x8d\x2c\x69\x0d\x08\xac\x79\xaf\xe3" - "\xb8\xf0\xda\x01\xd9\xc6\xb0\xde\x54\x9c\xf3\xb7\x13\xad\xfc\x3e" - "\x0c\xba\x27\x44\x09\x43\xf6\xe9\xdd\x3e\xbb\x84\xf3\xb5\x4a\xd9" - "\x6e\x90\x2d\x69\x75\xb6\x4b\x3e\xdd\xeb\x29\xb5\x92\x2d\x39\xad" - "\x7e\x7d\xa6\xbf\x1f\xf6\xfa\x4c\x7f\x9b\xf1\xc6\x92\x40\x9b\x81" - "\x7e\x73\x49\x6f\xf9\xeb\x71\x7e\x7e\x00\xa6\x5d\xd8\x76\xbc\xd6" - "\x45\x7d\x94\xee\x89\xe3\xf6\x89\xaf\x6b\xbd\xfe\x96\x4c\x33\xd9" - "\xcd\x9e\x2d\xf2\xfa\xc5\x1b\x73\xc8\x57\x0b\xa8\xaf\xc4\xcf\x76" - "\x52\x7d\x32\x3e\x0d\xd0\x3d\x63\xc8\x07\x5a\x73\x79\x3d\x5d\xb2" - "\xf3\xf5\x7e\xb6\x52\x1a\xc3\xc8\x4e\xfa\x8f\x55\x2f\x4e\xf5\x1f" - "\xab\xde\x98\x3c\xd8\x46\xbe\x01\x97\x3e\x56\xbd\xde\x46\x76\x4b" - "\xb6\x91\xfe\xb6\xe0\x0d\x4d\xad\x9f\x2f\xfb\x7a\x85\xec\xcb\xfa" - "\xec\xe8\xeb\xa3\xc8\x46\x61\xfd\x8d\x52\xdd\x45\x76\xf5\xf3\x66" - "\xb9\x6e\x3b\xca\xb9\x55\x87\xba\x59\xfe\x42\x17\xfe\xce\x90\x7c" - "\x40\xde\x37\xfb\xf8\x9d\x44\xf5\x74\x87\x53\x24\xe9\x99\x35\xe7" - "\x2c\x74\xf8\xc6\x8a\xa6\x9e\x75\x32\x7f\xf7\x45\x2b\xfd\xc2\xbd" - "\xbb\x59\x29\xd6\xd3\xa1\x6c\xe3\x0e\x4c\xdb\x25\xad\x21\x70\xde" - "\x72\x5c\x6f\x34\xd6\xed\xf6\x6f\x9b\x68\xc7\x1b\xdd\xd4\x0e\x9a" - "\x13\x61\xfd\xef\x90\xdf\x83\x3e\x1f\xfe\x7e\x35\xa9\x6e\x40\xe7" - "\x5f\x2a\x39\x6f\x51\xfa\x57\x2f\x92\x3f\x7e\x50\x9a\x7b\x36\xa3" - "\xbf\x53\xa9\x5c\x8b\x99\x7f\x6f\x9a\x2e\x37\x2f\x2b\xa7\xe0\xf1" - "\x29\xba\xac\x9c\xac\x82\xac\xd5\xd9\x59\x85\xab\x0b\xb2\xd6\xe5" - "\x8c\x7f\x7a\xf5\x13\x59\x6b\x74\x9b\x56\xe7\xeb\x92\x8c\x37\x1a" - "\x23\xc1\x07\x7a\x97\x6e\x75\x7e\xfe\x86\xa7\xd7\x66\xea\x72\xb2" - "\xd6\x4c\xc8\x5b\x9b\xbf\xb6\x40\xb7\x3a\x6f\xdd\x86\x9c\x4c\xdd" - "\x8d\x99\x13\x6f\x4c\xba\x3d\x33\x52\xb9\x86\x36\x2e\x16\xba\xbd" - "\x5f\x7f\xd9\xb5\xeb\x6b\xd0\xc6\xa8\x72\xf3\x62\x8c\x59\x39\x62" - "\xdd\xee\xcd\x25\x93\xaa\x20\x97\xee\x89\xa7\x3b\x8f\x59\xf9\x3e" - "\x03\x7e\x6b\x08\x0e\xdb\xa9\xa3\x7b\xe2\x91\xf6\x51\xbd\xe5\x6f" - "\xc6\xdb\xd5\x6f\x71\x9e\x21\x2f\x74\xd8\xb6\x51\xec\xeb\xc3\x5d" - "\xe8\xb3\xe5\xd2\x3b\xf3\xba\xaf\x21\xae\x72\x23\x68\xf0\x13\x85" - "\x9f\x58\xba\x47\x1e\xcb\xcc\xb3\xab\x7f\x69\x10\xf7\xbe\xbc\xd9" - "\xed\x88\x38\x54\xcd\x4a\x0f\x49\x7e\xcd\x9b\x5f\xca\x6b\xcd\x0b" - "\x9f\x81\x85\xa4\x9f\xed\xea\x37\xbb\xb8\xac\x50\x97\x69\xcd\xb6" - "\xe7\x77\xb3\x52\xd0\x1f\x3c\x4e\x6b\xae\x98\xf7\xa5\x53\x0d\x51" - "\x48\x97\xe6\x50\x51\x12\xbc\x88\x75\xe5\xc7\x33\x86\x75\xec\x97" - "\xd7\xd3\xb0\x0d\xb1\xd8\x96\x36\xa9\x1d\x2f\xf2\x76\xec\x66\x09" - "\x55\x23\x90\xbe\x17\x38\x3d\xc7\xe5\x36\x20\xdd\x6d\x48\x53\x0a" - "\xd2\x19\x4b\x74\x05\x5b\xeb\xa3\xf5\xae\x4e\xf5\x2f\x6f\xf4\x6e" - "\x44\xbe\x8d\x11\xf7\xdc\xed\xaa\x15\xfd\x0f\xdb\xb5\xa2\x0e\x7f" - "\xef\x3c\x0b\x51\x3b\xe8\x8e\x72\xcb\xf5\xac\xc5\xe9\x06\x9b\xa1" - "\x0d\x62\x36\x33\x07\xfb\xb7\x2f\xbb\x44\x9b\x7e\x99\x46\xb6\xe1" - "\xff\x3c\xd9\xa6\xa1\x36\xe1\x58\x11\x55\x77\x36\xe4\xda\xa2\xe6" - "\xc5\x6b\x98\x93\xbd\xaa\xf4\xb9\x7e\xf9\x7f\x89\x27\xe4\x6f\xf5" - "\x58\xe8\x5e\xeb\x5f\xd6\x23\xdd\x2e\xc9\x37\x76\xb2\xfe\x15\x0a" - "\x5f\xea\x97\xa4\x67\xce\x10\xb8\xb5\x32\x6e\xba\xfb\x9c\xca\x08" - "\xf9\xff\xd3\x8d\x58\xc6\xe1\xc3\xff\x4f\x10\x88\x9f\x70\xe2\x6f" - "\x87\x5c\x8f\x98\x87\xff\x92\x7c\x02\x07\xea\xb2\x23\x44\x7d\x09" - "\x2f\xec\x66\xc7\x6c\x98\xbe\xeb\x3c\x68\x10\xf6\x58\xdd\x6e\x8e" - "\x3f\xc3\xae\xde\xd7\x44\xf8\xb7\x5f\x03\x50\x82\x30\x3d\xe5\x6f" - "\xba\x9c\xfc\x1e\xf2\x7f\xc2\xfe\xff\xc2\xa0\xb5\x6c\x49\x9f\xef" - "\x0a\xd0\xe7\x94\x17\xc8\x27\xac\x42\xfc\xa8\x43\xbb\xce\x01\xd9" - "\x9b\x23\x13\xab\x20\x91\xea\xc1\xdf\x47\x69\x3d\x04\x71\x1e\x95" - "\xeb\x63\xa8\xff\x3b\xbd\x62\x0d\x46\xd2\xad\xf1\xb4\x7e\x6d\x32" - "\x32\x76\x08\xed\x3b\xd1\x48\x3a\xd6\x5b\xde\xa0\x91\x75\x0a\x75" - "\xfd\x18\xd7\xab\x38\x48\x64\xe5\xff\x54\x5a\x37\x02\xe1\x50\xaf" - "\x6a\x51\x9f\x48\xaf\x10\x36\x49\xd6\x29\xd4\xb5\xa3\x04\x87\x34" - "\x44\xee\x2f\x4c\xd1\x90\x8d\xec\x50\x37\xbc\x49\x3a\xc6\x5e\x7e" - "\xb0\x8d\x5d\xbb\xbc\x4d\xc8\xa9\xe1\x4d\x9b\x4b\xc8\xc0\xc7\xf7" - "\x06\xa3\x82\xef\x47\x51\x8f\x23\x89\xcf\x62\xad\xba\xe1\x4d\xa4" - "\xed\x28\xf7\xc5\xb7\xa2\x0c\xf8\x58\xd5\x90\x49\xe5\x25\x1e\x1e" - "\xf1\xf1\xb0\xc1\x1a\x8c\x87\x01\xbc\xd3\x88\xbb\xce\x1b\x8e\x50" - "\x5f\xc1\x32\x4e\xf9\xfe\xf2\x60\xb2\xc4\x3a\x34\x9a\x2a\xd0\x52" - "\x1d\x4d\x71\x04\xff\x56\x42\xb0\x3a\x02\xf5\xb8\xa9\x1e\x80\xd6" - "\xc2\xa9\x5c\x42\x1c\xf1\xf5\xad\x15\x41\xe5\xbb\xc6\x8f\x36\xfe" - "\x61\xe5\x6f\x19\x5e\x1c\x81\x7a\xc3\xe9\x7b\xab\xea\x42\xf4\x25" - "\xe8\xc4\xb8\x68\x1d\x47\xfa\xfc\x56\x8b\xad\x1a\x80\xd2\xa4\xe7" - "\x83\x3d\x38\xd6\x04\xae\xe7\x87\x7e\xbf\xf0\x76\xb4\xff\xfb\x85" - "\xb7\xdc\xa1\xde\x2f\xf8\xd7\xfb\xf6\x5c\xaa\xd7\x5b\x97\xae\xf2" - "\xd5\xfd\x76\xb2\x37\x48\xdd\x72\xf9\x89\xf5\xca\xf9\xcb\xdb\x7b" - "\x88\x86\x56\x1c\x97\xd8\x4f\xd3\x55\x0c\xf1\x34\xf1\x31\xfb\xed" - "\x6a\xe1\xaf\x90\x1f\xf4\xb6\x91\x60\x02\xdb\x31\xf0\xa7\x8d\xa3" - "\xb9\x22\x9c\xe7\x0f\xe1\xf7\x01\xbd\xf1\x83\xeb\x0c\x72\xb6\xda" - "\x0f\x18\x58\x90\x87\x28\x80\x9f\x72\x78\x86\x7f\x22\x49\x7a\x76" - "\xf0\x07\xcd\x00\xfc\x40\xfe\xb7\xf8\x8b\x10\xf4\x72\x7c\x2e\x50" - "\x49\xf5\x95\x2a\x20\x66\x5f\xa0\x34\x03\xb9\x48\xb0\xbf\xf5\xf8" - "\x31\xa7\x87\x23\xbe\x06\x0e\xcc\x98\x5b\xc2\x2f\x3f\x33\xe5\x33" - "\xa5\xf8\x3f\xe3\x5f\xd8\x0a\x45\x05\xd7\x87\x65\xf2\xed\x4e\x63" - "\x9a\x07\x92\xd4\xf5\xb1\xfe\x95\x9a\xc3\xf9\x57\x0c\xfd\x63\x44" - "\x7c\x89\x98\xff\x53\x1f\x7c\x98\x73\x9b\x02\xf8\x23\x41\xfe\xe8" - "\xd0\x6d\xb8\xfc\xbf\x31\x8a\xdf\xd7\x8b\xaf\x51\xd6\x2b\x59\xc1" - "\x05\xff\x74\x47\x23\xe4\x9f\x3e\xf5\x18\x9d\x1a\x0c\xd4\xc7\xff" - "\xd1\x32\xbf\xfd\xe4\xe9\xcb\x1f\x9b\xe0\xff\x3c\xae\xc9\xff\x39" - "\xc1\x7d\x25\x48\xb7\xd2\x3f\x26\x3b\xce\x79\x6e\xf0\xc9\x2b\x26" - "\xa0\xcb\xc4\x54\x06\x74\x21\xdf\x9f\x44\x4d\x18\xc0\x8d\x69\x8a" - "\x64\x4d\x70\xe8\xef\xe6\xef\xba\x6d\x12\x03\xaf\x77\xc4\x0e\xca" - "\x0c\x4c\xa3\xe7\x21\x3a\x29\x6d\xf2\xef\x07\xc1\xf3\x34\x9d\xe2" - "\x59\x95\x82\xff\xd4\x63\xc1\xf4\x2b\x41\xeb\x8f\x7f\x3f\xc0\x3f" - "\x15\xf5\x8f\x1f\xff\xbe\xa3\x3f\x26\x46\x71\xb4\x44\xfc\x8b\xfe" - "\x63\x03\x86\x92\x49\x19\x4c\x4a\x60\xd2\x8f\x2b\x32\x8e\xff\xf8" - "\xf7\xe3\xdf\x8f\x7f\x3f\xfe\xfd\xf8\xf7\xe3\xdf\x8f\x7f\xff\x00" - "\x7f\x2a\x3e\x8f\x60\xd2\x9f\xfc\x5b\xe4\xd1\x14\x68\x75\x07\x4f" - "\x03\x5f\x3e\xce\x7d\xa7\x82\x4a\x0b\x43\x34\x57\xd2\xc7\xd3\x0d" - "\x10\x74\x09\xc0\xb4\x27\x97\xde\x67\xdc\x86\x9f\x9f\x2a\xd2\xc7" - "\x04\x07\xff\x1e\xfe\x54\xc8\xac\x30\x9c\x03\x86\xc3\x10\x18\x0a" - "\x5a\x88\x80\x48\xb8\x0a\xa2\x20\x1a\x86\xe1\xdc\x32\x16\x86\xc3" - "\x08\x18\x09\x71\x70\x35\x5c\x03\xd7\x42\x3c\xfc\x04\xae\x43\xca" - "\x47\xc1\xe8\xe0\x34\x9b\x21\x25\x1e\xff\xc1\xff\xd3\x20\x85\x3f" - "\x67\xfc\x98\xfe\xbd\xa6\x5b\xa5\xf4\xa3\x52\xba\xfd\xc7\xf4\xef" - "\x35\x5d\xf7\xbf\xfc\x3d\xf6\x7f\xf5\x5b\x85\x66\x59\x58\x66\x55" - "\x50\x7b\x18\x98\xaa\x92\xfe\x06\x9e\xe1\x22\xe5\x07\xe1\xf3\x2f" - "\x1f\xf8\x97\x82\x9f\x64\xf1\xd3\x04\x20\xd6\x72\x99\xf2\xef\xa2" - "\x2b\x73\x46\x03\x7e\x0a\xf0\x63\xc6\xcf\x76\xfc\xec\xc2\xcf\x1e" - "\x19\x8f\x80\xd1\xe2\xc7\xae\x01\x38\xfa\x0e\xc0\x1f\x3b\xf0\x93" - "\x0a\xf0\x27\x84\xff\x7f\xe3\x00\xfe\xbf\x74\x80\x63\x07\x00\x3e" - "\x76\xfa\x70\x76\x54\xfa\xa8\x6b\x37\x8b\xdf\x3a\xfc\x7c\x41\x67" - "\x5f\x51\x93\xce\xd2\x3b\xc6\xc6\x39\xe9\xa9\xba\xc9\x13\x93\x27" - "\x26\xdf\xa6\x9b\x90\x36\x41\x37\x25\x29\xe9\xce\x49\x49\x53\x27" - "\x4d\xb9\x5d\x37\xe5\xb6\xbb\xa6\xde\x7e\xd7\x94\x69\xba\xa7\x37" - "\xe7\x65\x4d\x4e\x7a\x62\xad\xee\xf1\xac\xbc\xa7\x37\xad\xce\x5b" - "\x7b\xb1\xd6\x7c\xa3\x3f\x22\x6d\xb4\x17\x38\xf7\xfd\x39\x1d\x03" - "\xea\x7f\xed\x02\xf5\xa1\x7a\x18\xc8\x51\x55\x4a\xab\xf8\x89\xd2" - "\xc7\xff\x4f\x95\x91\x0c\xaa\x47\x47\x81\x4a\x9f\x0e\xaa\x45\xb1" - "\xa0\x7a\x20\x0d\x54\xa6\x26\x50\x15\x55\x81\x6a\xd3\x01\x50\xad" - "\xd7\x83\x2a\xcb\x3c\x38\xad\x2c\x41\xa4\xfd\x12\xcb\xbe\x86\x9f" - "\x57\xf6\x81\xea\x85\x4a\x91\xf6\xeb\x12\x50\xbd\x93\xfb\x9d\xb4" - "\xfd\x9b\xff\x5d\x8a\x3f\x70\xe1\x3f\xb5\xbd\xe9\x0a\xd0\xf1\xe3" - "\xdf\x8f\x7f\x3f\xfe\xfd\xf8\xf7\xe3\xdf\x8f\x7f\x3f\xfe\x7d\xcf" - "\x7f\x67\xd5\x1a\xf8\x03\x7a\x44\xbd\x16\x6d\xbc\x5d\x15\xf9\x0e" - "\xed\x0f\x01\x3a\xf7\x04\x5a\x1e\xe7\x44\xfa\x28\xf7\x96\x44\xdd" - "\xbb\x17\x80\xce\x6e\xbe\xb8\x9b\x39\xe8\x5c\xe6\xec\x37\x01\x9a" - "\x12\x00\x68\xbf\x0a\xe2\x59\x61\x87\x6c\x8d\xd8\x9b\xc4\x9c\x94" - "\x4f\xfb\x9b\x30\xbd\x00\xd3\x8b\x2e\xb0\xdf\x85\xef\xad\x22\x9c" - "\xb3\xc7\x72\x7a\xf6\x05\xe0\x21\x1c\x8d\x98\xe6\xbc\x00\x8e\x28" - "\x99\x2e\xa7\x1a\x54\x84\xaf\xc7\x02\xf1\x4e\x8b\xf5\x6a\x2c\xeb" - "\xc4\x36\x25\x4a\x7b\x83\xba\x99\x05\xc2\x9a\x8c\x6e\x3a\x23\xaa" - "\xea\x84\x88\x2f\xf1\x5b\x8d\xdf\xe2\xfc\x9b\x28\x97\x40\x38\xb0" - "\xac\xaa\xd7\x12\x91\x34\x50\x16\x71\xf3\x73\xde\x10\xf1\x6b\xa7" - "\xda\xaa\x16\xb0\xb1\x11\x12\xac\x1a\x61\x57\xc8\xb0\x22\x4f\x3d" - "\x57\xca\xbb\x0a\xf3\x8c\xfe\x79\x9a\x17\xa4\xbc\x28\xcc\xab\x0a" - "\xa0\x4f\x63\xeb\x73\x03\xd6\x43\xb4\xe8\xec\xf8\x4d\xe7\x92\x24" - "\xda\x88\xa6\x26\x84\xe7\xfb\x3c\x67\xeb\x98\x3b\x5d\x07\x9c\x16" - "\xe2\x1d\xc2\xa6\x92\xc7\x4b\xcf\xf8\x7b\x14\x95\x97\x7e\xeb\x68" - "\x9f\x14\xfd\x96\xea\x1d\xde\x6b\x89\x8c\xf2\xa7\x09\x40\xca\x1b" - "\x81\x79\x89\xfe\x79\xbf\x4b\x92\xf2\xae\xc5\xbc\xd9\xfe\x79\x2a" - "\xb9\x5c\x3c\xe6\x65\xc8\x79\x83\xf7\xd9\xe0\x34\x04\xc2\x71\x42" - "\x32\x04\x3f\x43\xb5\xb2\xec\xf2\xe3\x99\xd7\xf4\x13\xda\x4f\xf5" - "\x9f\x0e\xaf\x85\x81\xcd\xe8\x02\xdd\x75\x60\x6a\x87\xc8\xa3\xb4" - "\x5f\x67\x67\x21\x68\x4d\xb9\xcc\x45\x67\xe0\x5b\x1d\xdd\x60\x72" - "\xb0\x2e\x8a\x7f\x54\x7c\x0e\xb4\x14\xc7\xa8\x78\x3d\xc4\x37\x15" - "\x9d\x08\xba\x47\xc8\x4b\xf1\x8a\x47\x51\xd9\x0e\x68\xad\xe9\x00" - "\x53\x8d\x7f\x59\xd3\x68\x88\x6f\xa1\x58\x4a\x16\x88\x21\x3a\x9a" - "\x74\x6e\x70\x47\xfe\xa7\xa3\x68\x0f\x68\x4c\x63\x41\xdd\x92\x69" - "\x95\x68\xb9\xaa\x9a\x68\x29\x39\x09\xda\x37\x1e\x47\xd9\x9f\x24" - "\x7a\x5b\x1d\xef\x16\xba\xd4\x87\xe2\xe7\xc1\xa1\xf8\xe3\xd0\x14" - "\x3f\x03\x9a\x8c\xb3\x61\xe7\x49\x88\x3a\xe4\x9a\x0e\x4d\x9a\xfb" - "\xb0\x6f\xcc\x06\x5b\x37\xfe\xd6\x79\x10\xc6\xc9\xcf\x5f\x74\xc2" - "\x55\xa5\x55\x4f\x82\xd6\x2e\x70\xa2\x3c\xaf\xaa\x92\xcf\x12\xd0" - "\x73\xb0\x76\xe4\xff\x04\xe2\x91\xbe\x2e\xa4\xe5\x4e\xa4\xa5\x25" - "\x21\x1e\x92\x90\xe6\xa1\xb6\x6a\x37\x68\x8a\x20\x22\x44\x9f\x88" - "\xe3\xe7\x90\x51\xa7\x6a\x77\xb3\x2e\xd2\xad\x9e\x2d\x7a\xec\x5f" - "\x51\x1a\xac\x7b\x9f\xb4\x3f\xaf\xdb\xf4\x1a\x68\x7a\x36\xe9\x69" - "\x5f\x72\x07\xe6\xe9\xe4\x3c\x3a\x5f\x4d\xe7\xa6\x27\xc5\xd1\x5d" - "\x76\x29\xf0\x5e\x5f\x17\xed\xfd\xeb\xa6\xfd\x98\x84\x2f\xc6\x08" - "\x61\xd8\x9e\x70\xa4\xe7\xab\x3a\x4c\xbf\x01\xe1\xb0\x3c\xca\xff" - "\x9f\xf8\x99\x7b\x76\xed\x72\xa7\xf7\xda\xe5\xe7\xbc\x2f\x2f\xef" - "\x61\x2f\x2f\x3f\xeb\x79\x79\xf9\x57\xa6\xcd\xa0\xf5\x5c\xbb\xdc" - "\xd1\x9a\xcb\x65\x10\xdb\x9a\x7b\x8a\xf6\xf1\x69\xb7\x9e\x82\xd8" - "\x95\xeb\x51\xf6\xee\x4f\x61\x6b\x16\xc4\x7b\x23\x5a\x1a\xe8\xce" - "\xbb\x95\x45\xc0\xf0\x77\x63\xb0\xf6\xf5\x44\xda\x92\x84\xce\x6a" - "\xa9\x4d\x6d\x76\xf5\xfb\x5d\x54\xaf\x23\xe2\xe3\x24\xfc\x24\xe3" - "\x67\x1a\x7e\xa6\xb3\x48\xdb\x74\xe4\x95\x69\xd8\x36\x15\xd0\xf9" - "\x81\x49\x5e\x50\xa1\x88\x9c\x74\xcf\x42\x08\xbe\x8d\xf2\x96\x9f" - "\x88\xfd\x99\x19\x8a\x7b\x7b\x0d\x74\x8e\xdb\x41\xf6\x84\xec\x4b" - "\xaf\x25\x3a\xc5\xae\xfe\x4f\xa1\xfb\xbb\x99\x93\x45\x9e\x88\xc5" - "\xf4\x2e\xe7\x16\x83\xca\xb1\xc5\xa0\xee\x89\x3c\x31\x12\x61\x32" - "\x11\x26\x43\xe2\x61\x17\xe1\xc2\x7e\xe2\x88\x76\x43\x18\xe2\xcc" - "\xfd\xf7\xaf\xdb\x34\x7b\x77\xb3\xe3\x08\x57\x31\x80\x0b\x71\x23" - "\x1e\xe4\x7f\x74\xbd\x9c\x86\xbc\xee\xd8\x81\x70\x54\xde\xe6\x4a" - "\x21\xbb\x6b\xb7\x65\x77\xd1\xfe\xd9\x48\xd6\x2f\xea\x43\x18\x3a" - "\x5b\xe9\x88\x76\xc1\x90\x5e\x0b\xa4\x11\x6e\x2a\x67\xeb\xee\x02" - "\x2c\x37\x92\x99\x0c\x68\x97\x60\x41\x2f\x33\xa8\xe8\x2c\xfd\x21" - "\x2c\x2f\xea\x1e\xa6\x95\x69\xa4\x3a\xf8\x59\x7a\xa2\x13\xf5\xe1" - "\x50\xb6\x0b\xa2\xab\x21\x0c\xcb\x2d\x26\x7c\x84\x0b\xf5\xc0\x8e" - "\x6d\x1d\x79\x28\xdb\x01\x5e\xe6\x87\xd3\x2e\xe1\xd3\xfb\xe1\xc3" - "\x74\x86\xf8\x48\xff\x9a\xb0\x4c\x74\x3d\xc7\xb7\xe8\xdf\xbd\x84" - "\xcf\x05\x1a\x1d\xa7\xf7\x61\xc2\xc1\x63\x53\x20\x4e\xeb\xc6\x59" - "\xd0\x0d\xc3\xac\x0e\x93\x21\x8c\xef\xe3\xc3\xf2\xef\x16\x77\x85" - "\xb3\x1e\x7d\xd8\x30\xbe\x87\x6f\x16\x50\xfc\x04\x84\x79\x8d\xf5" - "\x18\xc2\xa2\xbb\x41\x43\x34\xd3\x39\x1e\xa2\x53\x29\xcb\x45\x73" - "\x1e\x9e\x01\x0f\xcf\x9e\x3b\x7b\x06\xcc\x9f\x79\xef\x0c\x48\xba" - "\x73\x42\xd2\x6d\x77\x4c\xbb\x0d\xd2\x96\x2e\x9a\x01\x69\x0b\x66" - "\xc0\x62\xfc\xe8\xef\x9b\x8b\x0f\xf7\xce\x98\x9c\x74\xff\x84\xb4" - "\x7b\xe7\xce\x81\x87\xd2\xa7\x24\x4d\x99\x02\x33\xe7\xcc\x9b\x9c" - "\x94\x24\x7d\x4f\x4e\x22\x90\x47\xa6\xcd\x59\x3c\x21\x2d\x6f\x5d" - "\xc1\xba\x09\x0b\xe6\xde\x0b\x73\xe6\xcc\x48\x0b\x18\x1b\x13\x3d" - "\x5f\x7b\x88\xb7\x4e\x76\x26\x95\x62\x25\x40\x2d\xca\x1c\x3f\xdd" - "\xfc\x0c\x06\xc4\x3e\x53\x4b\xb2\xe2\xf6\x72\xd8\x71\xec\xe7\x9a" - "\x5e\x4b\x0c\xc9\xbf\x9e\x78\x46\xf1\x0a\x3a\xe1\xea\xbd\x98\xf7" - "\x99\x64\xa3\xc3\x31\xff\x1d\xff\xfc\xe1\x66\xcc\xff\x82\xf6\xf4" - "\xdb\xf0\x83\x7c\x76\xa2\xed\x43\x7e\x3a\xa0\xc7\xa4\x0f\xe7\x67" - "\x2a\x51\xc6\xb4\xd7\x15\xcb\x76\x29\xfa\x78\x07\xed\x89\xd5\x15" - "\x42\xd8\x69\x88\xf9\x7d\x6b\x41\x0a\x9d\x7b\x01\x5b\x81\x84\xe3" - "\xdc\x00\x8e\x48\xe9\x5c\xa6\xbd\x96\xf6\x1b\x73\x3c\xb1\x49\x0a" - "\x7b\x60\x27\x3c\x3b\x31\x4f\xe0\x8a\x0d\x6f\x45\xbb\x80\x76\xbb" - "\xcf\x6b\x4a\x04\x16\xf9\x9f\x2e\x6f\x7f\x22\x1f\x63\xb0\x9c\x41" - "\xd6\xe3\x9d\xb4\x97\x35\x17\xe1\xde\x48\x55\xd1\x5e\x50\xbe\x2f" - "\x14\x62\x0a\x50\x9f\x9d\xde\xf2\x8f\x53\xf8\x99\x65\x9e\x16\x7b" - "\x80\x45\xe2\x73\xf9\xc7\x33\x99\x49\x9c\x63\xc6\xb4\xdf\x50\x1a" - "\xca\x38\x8c\xfa\x22\x3f\xa7\x89\x75\x23\x2f\x6e\x46\xfa\xda\x3c" - "\x54\xfe\x0c\x2f\x3f\x14\xd3\x22\x10\x76\xa6\x37\xf2\xe3\x59\xa8" - "\x33\x94\x86\xe3\xfa\xd5\x07\x11\xdf\xbd\x74\x86\x9c\x45\x25\x10" - "\xee\xd9\xd6\xc2\x6e\x1e\x27\xcf\x8e\x79\x5e\x13\xe2\xec\x1f\xa8" - "\xbf\x8d\xca\x62\x5d\x9a\xde\x7e\x03\x8e\xa5\xb1\xc7\xc9\x27\xf0" - "\x10\x3d\x67\x06\x60\x9a\xa9\x4e\xea\xcf\x28\x8b\x6e\x94\x53\x44" - "\xaf\x65\x78\x7a\x80\x9c\xb2\x11\xcf\x4c\xe4\x7b\x1b\xe2\x68\xf2" - "\xf6\x60\x1d\xf8\x8c\x78\xd5\x12\x5e\x19\x87\x53\xe8\xc1\xf0\xaa" - "\x00\x3d\xd8\x86\xb8\xcf\x29\xf2\x0f\x04\xe4\xaf\xc5\xfc\x3e\x29" - "\x1f\xfb\xd5\xf0\x63\x01\xf5\x13\x6d\x5e\xac\xdf\x89\xfd\x26\x0c" - "\xeb\xa3\x73\x65\x0e\x1f\xfc\x08\x8d\x3f\xfc\x08\xf4\x0d\x62\xc8" - "\x96\x90\x4d\xe4\xf0\x75\x92\xae\x8a\xfa\x47\x24\x07\xc0\xbb\x11" - "\x7e\x28\xc5\xda\xc0\xef\x91\x08\x33\x14\x6d\x92\x06\xc7\x8f\xe3" - "\x87\x8a\xc8\x7f\x1b\x91\x19\x00\x5f\x82\x70\xd7\x11\x1f\x39\x0f" - "\xce\x70\x1e\xe8\x25\x7f\x8b\xfa\x82\x16\xcb\x54\x07\x94\x69\xc4" - "\x32\xe3\xbc\x82\x6f\x61\xbd\x3d\x41\xcb\x1c\x09\x28\xd3\xcd\xe5" - "\x2f\xea\xd1\x90\xbe\xc8\x65\xb8\x8d\xe9\xf7\xc3\x41\x6d\x43\xbf" - "\x6c\x64\xac\x3f\x8e\xb8\x6e\xac\xf7\x96\x1d\xa2\x1f\x5f\x85\x32" - "\x9f\x82\x69\x9f\x22\xde\x39\xa4\x27\xa4\xcb\x36\x87\x0b\x6d\x60" - "\x6a\x94\x18\xcb\x47\xae\x8f\x29\x02\xfa\x3d\x81\x7e\x13\x6e\xd6" - "\x3f\x4f\xd2\xf1\x91\xeb\xf1\x9b\xd2\x79\x9d\xd4\xb7\x58\xff\x83" - "\x5e\x81\x73\xe4\x4b\xd8\x07\xd5\xf8\xec\x91\xea\xf8\x33\x9d\xe7" - "\x45\xfd\x9c\x85\xf6\x15\xe8\x4c\x32\xa6\x27\x63\x7a\x8b\x94\xff" - "\x3e\xc1\xe3\xef\xc9\xd2\x6f\xd2\xcb\x59\x92\x5e\xa2\x9e\xc7\xfd" - "\x96\xd7\xcd\x75\x5d\x94\xf7\x0a\xbd\xbe\x17\xf3\xde\xc2\xef\xb9" - "\xf8\xfd\x12\x7e\x3f\x84\xdf\xeb\x29\x06\x83\xc9\x83\xfe\x84\x78" - "\x7e\x14\xbf\x17\xe1\xf7\x5c\xfc\x5e\x8c\xdf\x53\xa9\x5f\x3a\x36" - "\x19\x20\x40\x27\xba\xbd\xa2\x2f\x0e\x15\xf2\x88\x4b\x90\xfa\x87" - "\xe8\x9f\x67\x7c\x69\x4c\xa4\xa9\xd1\xae\xfb\xd2\xfa\x53\x89\x2f" - "\x69\x88\x9f\xc7\x0c\x91\xfa\x75\xb8\x90\x8b\x80\xf1\x8a\x72\x92" - "\xec\xa4\x34\x01\xa7\x52\xd6\x69\x87\x91\xc7\x8a\x9d\x8c\xe1\xb7" - "\x95\xc7\x6f\x80\xb8\x26\xe4\x09\xfa\x35\x23\xab\x88\x4f\x3e\x79" - "\x8f\x4c\x52\xc8\x1b\xfd\xda\xab\x21\xa0\x2f\x25\xa3\xbc\xa7\x73" - "\x79\x23\xef\x64\x9a\x89\x7e\x1c\x5f\x68\xcc\x1a\x22\xda\x10\xab" - "\x47\xdb\xde\xed\xb3\xcd\x57\xa7\xfa\xe3\x89\xd5\x63\x99\x03\xd2" - "\x58\x36\xa0\x67\xa4\x2f\x61\xb9\xd4\x87\xae\x46\xff\xff\xf7\x47" - "\xf8\x59\x1e\xcc\x73\x46\x9c\xa8\xa4\x3a\xc3\xb2\x79\x1e\xfa\xff" - "\x57\xb5\xc9\x79\x20\xce\x4b\x39\xc3\x0a\x78\xde\x7e\xb9\x1c\x2b" - "\xff\x20\x9e\x97\xc5\xf1\x91\xfc\x05\x1a\xf7\x71\xfc\xed\x42\x98" - "\x63\x76\x88\x8e\x0d\x19\xc3\xa8\xf4\x03\xed\x04\x33\xa8\x6f\x30" - "\x43\xb8\xcd\x7d\x1c\x16\xba\x99\x67\x02\x40\x84\xcd\x3d\x1d\x6e" - "\x06\x18\x6e\x73\x1f\xa3\xc5\xf0\xb1\x36\x77\x15\x8e\xaf\x25\x94" - "\xff\xde\x2d\xa0\x52\xe1\xb7\xe9\x56\x50\xab\x6c\xee\x7d\x98\x7e" - "\x00\x6e\x00\x8d\xea\xfe\x70\xd6\x6b\x73\x27\xe3\x73\x01\xdc\x17" - "\xce\xfe\xba\xca\x03\xb1\xf3\x9e\x61\x26\x9b\x3b\x13\xee\x7b\xc6" - "\xcb\x6c\xee\x23\x98\x97\x0d\x0b\x3d\xe7\xd9\x42\x4f\x2f\x63\xda" - "\x0f\xe2\x17\x7a\xce\xe0\xef\xbf\x32\xe4\x1b\x7e\xbf\x87\x1f\x13" - "\xb3\xa1\x9f\xcc\xca\x3e\xd0\xae\xda\xac\x86\x7e\xba\x3f\x27\xe2" - "\x83\x78\x6c\x5f\x62\x3f\x33\x84\xb1\xc8\x0f\x7e\xd6\xdf\x8f\xdf" - "\xe5\x1f\xdc\xc4\x9f\x4b\x3f\x98\x86\x78\x12\x27\xe2\xa4\x81\xe8" - "\xb7\xb9\x3b\x60\x15\xda\x9b\x85\x9b\x1d\x8c\x68\x1f\xb6\x8d\xc1" - "\xc2\xcd\xef\x31\xb4\x75\x31\x0b\x37\x9b\x18\xe6\x69\x11\x5f\xa2" - "\xcd\xdd\x4d\x75\x4c\x43\x7c\x53\x39\xbe\xd2\x0f\xf4\x08\xeb\x20" - "\x38\x25\x1e\xc2\x41\xb0\x0b\x3d\x10\x83\xf0\xfa\xfe\xb2\x0f\x52" - "\xf1\x63\xc0\x4f\x35\x96\x7d\xdb\x6b\x89\xfb\x3d\x8d\x6b\x58\xbe" - "\x11\x9f\x9b\xcf\xf3\x38\x0b\xc7\x09\x7e\x28\xc2\x37\xa2\xcc\x67" - "\xf7\x0a\x7a\xbb\x38\xbd\xe5\x1f\x7c\x71\x5e\xb4\xa3\x53\x6a\xc7" - "\x09\x4a\x77\xa2\xae\xb3\xf2\x66\xad\x93\xe7\x35\x0f\xc5\x72\xe9" - "\xbc\x5c\x69\xb3\x96\x69\x9b\xe3\x51\x6f\xc3\x16\x7a\x98\x99\x78" - "\x88\x7c\x35\x13\x1f\x69\xce\xc3\xca\x30\x3f\xa2\x39\xbe\xbf\xac" - "\x39\x11\xcb\xdf\xd5\xcf\x68\xac\x6d\x4e\x3d\xcf\x71\x37\xdf\x8f" - "\x78\x56\xf4\x12\x4e\x6d\x73\x2a\xe2\xd2\xbb\xd5\x3a\xe4\x07\x73" - "\x2d\x74\x6f\x73\xaf\xda\x4c\xb1\x50\xde\x87\x44\xb3\x59\x65\x33" - "\x16\x60\x3b\x2b\x10\x67\x26\xe6\xc3\x48\xac\xeb\x3d\xc4\x9b\x4a" - "\xf5\x61\x1d\x7a\xc4\xb9\x04\x71\x65\x12\x4d\x7d\x16\x88\xc5\x67" - "\x43\x9f\xa0\xaf\xd4\x5b\xda\xdc\xe0\xd5\x36\x57\xcb\xfa\x43\xba" - "\x23\xf8\x46\x3a\xf3\x2b\x4a\x8b\x95\xf5\xc4\x53\xda\x6c\xbc\x15" - "\x20\x76\x81\x93\xb9\x49\x57\x26\x41\xae\xaa\xd5\x79\x0c\x79\xad" - "\x85\xd6\xdc\x03\x70\x0b\xd0\xdc\xcb\x09\xad\xce\x2a\x7c\xde\xcb" - "\xef\x9d\x6e\x75\x96\x40\x4b\xf7\x3e\x58\x90\xeb\xdc\xe6\xd1\x36" - "\xbb\x5a\xba\xe7\x03\x96\x7f\x0f\x69\xf4\xae\xcc\xd5\x98\x5b\x73" - "\x9d\xf4\x6c\x6a\xe9\x46\xfd\xf4\x30\x8f\xbb\xb4\xd9\xe0\xd6\x1e" - "\xd6\x2e\x38\xc7\x1c\xf3\xbb\xcd\xe1\x98\xd6\x1f\xa3\x62\xee\x18" - "\xa3\x89\xb5\x74\x57\xc0\xca\x73\xa0\x6a\x31\x1c\xe0\x7a\xba\x32" - "\x37\x17\x78\xf9\x73\xee\x98\x47\xbb\xcd\xf0\xa8\x01\x86\x21\xfc" - "\x19\xd2\x59\x36\xcc\x0c\x47\x3a\xb2\x61\xfe\x29\x77\xd8\x82\x73" - "\xfd\xec\x48\x46\x15\xb4\x18\xaa\x88\x1f\xa5\x34\x47\x99\x7f\xaa" - "\x87\x2d\x38\xd7\xcb\x5a\x0c\xbf\x82\x23\x19\x07\x60\xde\x09\x6b" - "\x8c\xa7\xac\xd9\xe8\x8d\x68\xae\xf6\x96\x35\x37\x78\x22\x9a\x5d" - "\xee\x32\xa4\x25\xe2\xb0\x96\x95\x1f\x36\x22\xff\x22\xb8\x2c\x22" - "\x0f\x6f\xc4\xdf\x3a\x2e\x5f\xed\xe1\x52\x56\x7a\xb8\xa1\xbf\xec" - "\x70\x35\xd7\xfb\x88\xc3\xa5\x36\x37\xe9\xff\xe1\x06\x84\x6b\x10" - "\x3a\x72\xb8\x51\xe8\xfe\xe1\x7f\x27\xb9\x22\x6c\x33\x7e\xda\xf0" - "\xd3\xc5\xca\x3f\x9c\x86\xb8\x86\x13\x5e\x6f\xe9\x87\xa9\x5e\xed" - "\x87\xd8\x1f\x3e\xd4\xe3\x9c\x46\xdd\xea\xdc\x07\x1e\xb4\xc7\xad" - "\x4e\x0f\x2c\x58\xef\x42\xd9\xa2\x0c\x8c\x1e\xe4\xe7\x71\x58\xb9" - "\x1e\x4c\x36\xe3\x71\x60\xbf\xab\x24\x7e\xc4\x2c\x58\xff\x1e\xf3" - "\x96\x7d\x98\x4a\xf9\x0b\xd6\x9b\x70\x5e\x85\x78\x22\x3e\xd4\x7b" - "\xcb\x3f\x34\x4a\xfe\x15\xd2\xf1\xe1\x26\xa2\xa3\xbf\x37\x91\xce" - "\xb9\x69\x30\xbf\x14\xd3\xfa\x68\xbc\xf1\x92\xde\x95\x7e\xe8\x62" - "\xda\x8f\xf4\xf3\xc3\x99\xc3\xf3\x2c\x70\x1d\xf0\xde\xcd\x18\xcd" - "\xdb\x56\x19\xa1\x9e\xf7\x29\xcf\x75\x66\x16\xf1\x91\x9e\x95\x7d" - "\xe8\xf2\x96\xb7\xbc\x82\x78\xc2\x28\x36\x30\x2b\x6d\xa9\x16\x3a" - "\xf3\x29\xef\x7b\xac\xac\xa5\xda\x7f\x8d\x20\xf8\xfa\x40\xaf\xe5" - "\xba\x03\x76\x68\xe5\xe7\x20\xf1\xb7\xd5\x0e\xb6\xe9\xd2\xef\x23" - "\x76\xf8\x57\xbe\x4e\x44\x36\x2e\xb7\x18\xae\x3e\x09\x3f\x35\x23" - "\x3f\x00\x7f\x47\xe1\xef\x92\x85\x37\x63\x9b\x2b\x86\x1b\x51\xde" - "\xbd\x64\x6f\x98\x25\x19\xfd\x13\x48\xc1\xb6\x6a\x59\x2f\xc5\x48" - "\xfe\xe4\x01\x8a\x91\x4c\x31\x91\xf1\x79\x18\xf2\x34\x01\xbf\x47" - "\xec\xfd\x1a\xe2\xf0\x13\xbf\x57\x8a\xc7\x8c\xbf\x93\xd8\xa6\xf8" - "\xc8\x9d\x1b\x61\x7c\x8c\x53\xc4\x42\xa6\xd8\xcd\xe8\xf7\xc4\xd1" - "\x6f\x66\xf9\xb7\xc4\xba\xaf\xa5\x78\xc8\xd1\x58\x1f\xc5\x43\xce" - "\x4f\x84\xba\x3c\x1e\x9b\x2e\xbe\xce\xc2\xf6\x7b\x7a\x13\xd5\x44" - "\xa7\x4c\x0b\xd1\x86\x74\x8e\x46\x3a\xab\x96\x6c\x4e\x81\xf7\x8d" - "\xc1\xcf\x39\xf5\x5a\x7e\x3a\xd0\xfe\x10\xf9\xc7\x64\x9e\x84\xc8" - "\x77\xca\x7c\x0a\xb5\x4e\x40\x7d\xdc\xf3\x35\xeb\xde\x95\x23\xce" - "\xd5\x99\xdc\xec\x73\x9c\xc3\x98\x8b\x71\x6e\xbe\xd0\xe8\x62\x36" - "\x07\xb3\xda\x8c\xa7\xf8\x3a\x5f\x1d\xc2\x14\xbb\x99\x97\xe6\xc5" - "\x34\x27\xa6\x18\x6e\xde\xb2\x4f\xc6\xb3\xb2\x4f\x12\x7b\x36\x32" - "\x77\x2d\x9f\xc7\x8e\x32\xd8\xe1\xee\x0c\x21\x9b\xe6\x52\x1c\x07" - "\x3b\x7a\xb4\x9f\x24\x22\xee\xe1\x84\xbb\x35\x97\x59\xbd\x11\x9f" - "\x24\x21\x5c\xa5\x1d\x3e\xd9\xa7\x5c\xeb\xc3\x31\xad\xbb\x64\x37" - "\x8d\x6b\xa3\xde\xb1\xc3\xf5\xa5\x83\xd6\x92\xc4\xdb\x4b\xb3\xdf" - "\xf9\x0a\x15\xf8\x9f\x16\xa1\x93\x19\x29\xc1\xb3\x7d\xe3\xe2\x61" - "\x2d\xc5\xb5\x33\x6d\x85\x51\x28\x87\x9f\x9e\x84\xd1\x63\x4d\x46" - "\xd6\xc9\x2c\xa3\x1a\xdf\x28\x74\xa1\x0f\x31\x7a\xbc\x1d\x5e\x6b" - "\x0b\xc5\x37\xef\xd7\xac\x03\xdb\xd6\xb0\x0b\xfd\x40\x6a\x37\xf1" - "\x6d\xa1\x91\x79\xb1\x7d\x9f\x51\x1f\xab\xdb\x48\xbe\xf0\xe8\x5c" - "\x99\x0f\xa1\xce\xfa\xb1\xd2\x4f\xa6\x0b\x7f\x71\xf4\x51\x66\x61" - "\x60\x1d\x43\x6b\x7f\xa3\xff\xc8\x7d\xa6\xd2\xc3\xd5\x3d\x68\x3f" - "\x68\x8d\x84\x62\xd0\xe5\xc7\x33\x17\xe2\x6c\xb2\xc3\x4d\x49\xd2" - "\x9c\xcc\x69\x73\xcf\x21\x5b\x12\xf4\x0c\x2e\x3f\x0b\x38\x80\x7f" - "\x8c\xa3\x75\x14\xdd\x55\x87\x76\x47\x7b\xe2\x58\xb1\x90\xb3\x8b" - "\xf0\xd2\x59\xd6\x0e\xcc\xcf\x77\xb2\x2e\x56\x7a\x82\x62\xc5\x39" - "\xe9\x5c\x1d\xa6\x7d\x85\xfa\xcb\xac\x79\x44\xd3\x98\xaf\xac\x63" - "\xfa\xa0\x13\xfd\x41\x3a\xbb\x2a\xe6\x67\x63\x8e\x1f\x2a\x00\x69" - "\xce\x37\x66\x85\x1d\x12\x8f\xc8\x74\xa1\xcd\x60\xc8\x5b\xe2\x73" - "\x29\x8d\xaf\xb4\xee\x96\x5f\xc4\x5c\x48\x6b\x29\xc2\x96\xca\x6d" - "\xa0\xf6\x89\x76\x8d\xa9\x51\xb6\x0b\x69\x70\xa0\x6f\xcd\x79\x90" - "\xbf\x19\xb4\x3c\x26\x96\x87\xc6\x8e\x39\xbc\x2d\xd4\x66\xde\x16" - "\xf4\x2b\x68\x3c\xb1\xb9\xa7\xa2\xdf\xc5\xd3\x1b\x10\x17\xce\x7f" - "\x7f\x36\x4d\xf8\x54\x63\x78\xbc\xe3\xa0\xbe\x91\xb6\x59\x6f\x3a" - "\x0f\x63\x4c\x5e\xd6\xde\x09\xd7\x6f\x40\x3e\x85\xd1\x37\x1f\x8b" - "\x5d\xa8\xbb\x5a\x7b\x14\x8d\xc1\xb6\xa2\x73\x68\xb7\x39\xec\x48" - "\x84\xed\x40\x98\xb5\x12\xec\x5a\xb1\x26\xcc\xbf\x87\xd2\x37\x8e" - "\xc9\x4b\x50\x6f\x8b\x68\x1d\x03\xf9\x5c\x29\x3f\x33\x7c\xc6\xef" - "\x64\x56\x66\x8f\x0a\x4e\xcb\x47\x7a\xaf\xd4\x0f\xb1\x9e\x6b\x49" - "\x8f\x4c\x9b\xe1\x27\xa8\x93\x9f\x15\x6f\x85\xab\x49\xc7\x58\xc4" - "\x27\xa9\x82\xef\xd7\x37\x33\x8b\x19\xe8\x1c\x6c\xee\x46\xf8\x29" - "\xf6\xbd\x94\x93\x70\xfd\xa7\xab\x8a\x74\x48\x2b\xc0\xae\xd3\x40" - "\xe3\xe4\x5f\x11\x7e\xb6\xcd\x7d\x82\xee\xba\x43\x5d\xbc\xde\x2d" - "\xeb\x62\xaf\x45\xa7\xbd\x90\x4d\x40\xbe\xb6\x89\x79\x85\x6e\x03" - "\xad\xb1\xb5\x83\x8e\xe2\x85\x86\xe1\x47\x85\x69\x0f\xb1\xaf\xd9" - "\x28\x8a\x51\x88\xbc\x6e\xb6\x83\xae\x02\xbf\xdb\xf8\xc7\x02\x66" - "\xe9\xb9\x19\xe1\x52\xd8\xd7\x1e\x82\xc1\x79\xb0\x0e\x6d\xa4\x8a" - "\xfa\x49\x0d\xd6\x5d\x62\x87\x99\x46\x21\x1b\x5d\x1a\xe1\x0a\x41" - "\x03\xc5\xab\x13\xf1\x31\x41\x77\x4a\x57\xac\x22\x3a\x78\x3c\x1f" - "\xc2\x55\xa7\x16\xb6\xd9\x8b\xb4\xd6\x5a\xbc\x06\xb4\xc3\x06\x6f" - "\x79\xbb\x95\xff\x96\xf2\x88\x0e\x2f\xd6\x1f\x1c\xff\x89\x63\x3c" - "\x1e\x29\x8c\x4d\x15\x78\x4e\x34\x5b\xaf\x3b\x49\xcf\x3c\x0e\x92" - "\x53\xfb\xb9\xd5\x56\x9d\x22\x62\xa1\x22\x8c\xf0\xf3\xc7\xce\xed" - "\xc1\x3a\x7a\x2d\x63\x53\xed\x70\x8b\x56\xac\x37\x7e\x6e\x0d\xd1" - "\xf7\x62\xa9\xef\xb4\xd4\x80\xd4\xa7\x6f\x08\xa7\x35\x0f\x6c\x57" - "\xa3\x47\x7b\xb8\x4d\xb2\xb3\x34\x07\xbb\xaa\x1d\x6e\xd0\xb4\x1a" - "\xb8\x7e\xab\x99\x7a\x6c\x83\x5f\xac\x44\xcc\x1b\xfc\x19\xdb\x86" - "\x9f\x2e\xfc\x38\xc5\x33\x12\x07\xe3\x90\x82\x71\x99\x9c\x6f\x3d" - "\x99\x38\x27\xba\x41\xe3\x8d\x40\x99\x94\x92\x8c\xc6\xda\x59\x4f" - "\x82\x1a\x7d\x11\xfe\xbb\x6e\x3d\xcd\x2d\xc6\x45\x21\xff\xab\x85" - "\x1c\x08\x07\xa8\xb0\x2f\x12\xcf\x99\xa9\x9a\xb9\x9a\x8a\x9d\x48" - "\xf3\xb8\xe9\x4d\xd5\x4e\xd0\xdd\x44\x6d\x1f\x97\x42\xed\x71\x22" - "\xef\xe9\x3b\xbf\x9a\x39\x0e\xd5\xb8\x81\xd6\xa5\x11\x97\xde\x0e" - "\x96\xd9\x62\x9e\xd2\x09\x84\x4f\xd2\x07\x26\xb7\x5d\xf0\xf8\x73" - "\xab\x6e\xa3\x8a\x70\xbd\x49\x6b\x12\x34\x67\xf2\xad\xf5\x8c\xdb" - "\x8b\x7d\xfc\x1e\x8a\xa3\x7a\x1a\xc6\xfd\x99\xe0\x0f\x19\x78\x3c" - "\xb6\xee\xbd\x7c\x3c\x18\x77\x10\xe9\x75\x49\x71\x27\xba\xe9\x4c" - "\x3d\xe1\xc3\x79\x54\x57\x8b\xc1\x01\x1e\x6c\x2b\x3f\x73\x8f\xf2" - "\xd9\xda\xcd\x5c\xef\x6d\x74\x69\x78\xfd\x39\x3c\x16\x9a\x33\xa6" - "\x00\xf5\x01\x65\x85\xf3\x5e\x17\xd6\x55\x10\x18\xd3\x53\x11\x4b" - "\x56\xa2\x39\x21\xe2\x50\x02\xb7\x97\x8d\x5e\xe4\x8b\xbf\xbc\x12" - "\xb4\x42\x56\x37\xa4\xfb\xcb\x2a\x01\x7d\x97\x1b\xaa\xf1\xb3\x1f" - "\x3f\x56\xf1\xac\xfc\xdc\x50\xa2\xf8\x7d\xb4\xd7\x72\x03\x8e\x7f" - "\xba\x38\x21\x03\x4a\x43\x1a\x49\x37\xbe\xc2\xf1\x05\xe7\xef\xf4" - "\x8e\x82\xd2\x49\x8f\x29\xdd\x8b\xbe\x0a\xf2\x76\x1f\xe6\xc7\x52" - "\x1f\xa5\x18\x76\xca\xfc\x81\x58\x25\x70\xc3\x39\xbe\xe6\xb0\xad" - "\xb4\x94\xf4\x13\xcb\x34\xc4\xb8\x4b\xd1\xee\x26\x80\xcc\x43\x4c" - "\xeb\xa2\xfc\xe0\x3e\x43\x42\xe2\x80\x6f\x85\xfe\x26\xc9\xa7\x1b" - "\x6e\x4c\x46\xbb\x84\xf6\xb8\xbd\x51\x8c\x27\x37\x4e\xa5\x67\xb4" - "\x87\x9f\xe1\xef\xa4\x16\xb4\x3b\x7d\xe5\x1f\x27\xf5\xab\x61\x68" - "\x9f\x1a\x52\xdc\x3b\x87\xd7\xb8\x23\x6d\xd3\x6d\x5d\x07\xa0\xd5" - "\xfd\xaf\xa0\x7b\x92\xe3\xb8\x99\xe2\x26\x9a\x36\x33\xcf\xbb\x7d" - "\x0d\x38\xf7\x3a\x63\xe5\x71\x8a\xe1\x46\xde\xf6\x5f\xb4\x8b\x3b" - "\x34\x3a\xa5\x67\x16\x35\xdc\xb8\xf3\x71\xe6\xde\xd9\x49\xb1\x14" - "\xe2\x23\x77\xf4\xc1\xf8\x57\x0a\x21\xa9\xa6\x0f\x12\x6a\xfb\x20" - "\x91\x7d\x41\x77\x4c\x78\xf5\x2b\xcf\xc5\x52\xfc\x7e\xfd\xb0\x5c" - "\xd0\xd6\x16\xa2\x1f\xe6\x06\x95\x67\x07\xfa\x61\x74\xd7\xc6\x99" - "\x44\xb2\x7f\x03\x7e\x58\x7f\x3f\xf9\x61\x9f\xec\xe7\xf1\x75\xcb" - "\x3e\xd9\x1f\x6d\x00\x55\x54\x06\xc4\x22\x7d\xa6\xd3\x90\x90\x15" - "\xd5\x81\x3e\x20\xb6\xd9\x2e\xb5\x17\xf9\x5b\x14\x63\x80\xa1\xbc" - "\xad\x68\x93\x59\x59\x7b\xd0\xf7\x11\x7c\xac\x55\x93\xee\x38\xa9" - "\x7f\x50\x1b\xb6\xd1\x3b\x91\x03\xd7\xb9\x34\xf9\x35\xcc\x45\xe9" - "\x05\x63\x49\xf7\x6e\x34\x50\xdd\xfb\x31\xbd\xd7\x72\x63\xa5\x5d" - "\x7d\x28\x2a\x94\x1d\x8e\xd9\x26\xfb\x03\x37\x0d\x67\x6a\x33\xf9" - "\xdf\xc6\xad\x6e\xe6\xb0\x9d\xa6\xbe\x79\x53\xec\xc2\x6c\xe6\xd6" - "\xe5\xd0\xfb\xa9\x9b\x80\xde\x9d\xd1\x9a\xf9\xbf\xa0\xef\x72\xb1" - "\xf7\x65\x34\x26\xa0\x7f\x5e\x1a\x93\x8d\x38\xd1\xff\x67\xa6\xc4" - "\x20\xe7\xe2\x83\xfb\xe3\xf4\xae\xf5\x45\xfe\x5e\xf7\xa6\x79\x76" - "\x48\x73\x49\xf1\x11\xbb\x85\x7d\xfc\xd9\x78\x9a\xe7\xfb\xf7\xeb" - "\x9f\x01\x9d\xf3\xef\x29\xfd\xf8\xa0\x75\x0c\xd9\xf2\x9b\xce\x0b" - "\xdf\xe6\xe3\x46\x61\xdb\x6f\xfa\x8b\x58\xa3\xbb\x09\xc7\xff\xdb" - "\x39\x2f\x72\xc7\x91\x4e\xdc\x74\x8c\x45\x7e\xfc\x1f\x04\x37\xd1" - "\x0c\xe6\x75\x6e\xc8\x60\x65\x1f\xf3\x98\x6a\x36\xf7\x69\x60\x2f" - "\x3f\xd5\x4b\xef\x64\x9d\xd7\x2e\xef\xc5\xb1\x1e\xfd\xcf\x8f\x0f" - "\x52\x1d\x0e\x84\x41\xbe\x47\x88\x77\x6b\x37\x39\xec\x90\x3c\x5d" - "\xe8\xfb\x4d\x4d\x62\xed\xe8\xa6\xa6\x1e\x2c\x8b\xbe\xdf\xc8\x5e" - "\xcb\xcf\x62\xed\x30\xff\x88\xe4\x7f\xf2\x77\xda\x98\x96\x60\x87" - "\x85\x7c\x3d\xa5\x60\x2c\xc4\x17\xe8\x58\x57\x48\xdf\xcd\xaf\x9d" - "\x89\x6f\xf1\xf7\xce\x6a\xb8\x16\x71\x18\x64\xbc\x38\x7e\xbe\xdd" - "\xa3\x5e\x82\x73\xeb\x9f\x15\xc9\x78\x11\xe6\x6a\x7c\xae\x18\x80" - "\x11\x65\x6a\x14\x65\x96\xf4\xa8\x6f\x79\x1b\xd3\xf6\x07\x94\xb1" - "\x06\x94\x39\xaa\x28\x63\x96\xea\xe9\x08\x28\xe3\xf4\x2f\x93\xa8" - "\x19\x4c\x5b\x62\xbc\x7f\x99\xc4\xc4\x80\x32\xd3\x06\xd3\x96\x38" - "\x2f\xa0\xcc\x8a\x80\x32\xd9\x0a\xde\xd2\xfb\x65\xf4\xf7\x13\xcd" - "\x01\x65\x2a\x03\xca\xd4\xcb\xcf\xe8\x4b\x5a\xc5\x58\x8f\xfa\x84" - "\x32\x45\xb9\x1e\xc4\x7c\x6c\xff\xb4\xf1\x17\xda\x07\x80\x3a\x73" - "\xc0\xb4\x57\xc4\x99\x26\x1b\x4a\x73\x0a\xb2\xdb\x68\xef\x69\xbd" - "\x9e\xc7\x8c\xa3\xba\x3a\xe1\xe6\x53\xa4\x43\xbd\x96\x9b\xe3\x06" - "\xf3\xe3\xe6\x44\x7f\x3a\x6f\x9e\xe6\x4f\xe7\xcd\xa9\x83\xf9\x71" - "\xf3\x8a\x80\x32\xd9\x01\x65\x8a\x14\x65\xea\xa5\x7a\x2a\x03\xca" - "\xd4\x07\x94\xd9\x3f\x58\x3f\x6f\x6e\x0a\x28\x73\x2c\xa0\x4c\x87" - "\x8f\x87\x37\xf3\x3d\x1d\xd4\x1f\x30\x1d\x9f\x6f\xbf\xd0\x3e\x8c" - "\x58\x59\x9f\xe5\xfd\x18\x42\xaf\x6f\xd9\x56\x25\xf6\x25\xf0\x18" - "\x1f\x1d\x70\x0b\x8f\x15\x4a\xe3\xef\x1b\x7d\xae\x70\x1a\x73\x91" - "\xb7\x5d\x87\x8c\x2e\xf4\x31\x6f\xc9\xb0\x43\x52\xb6\xfc\xee\x93" - "\xde\x17\xf3\x98\x50\x7c\x7e\x71\x4b\x8a\xe8\x7f\xb7\x54\x49\x6b" - "\xb2\xd4\x1e\x9c\x37\xdc\x52\xf5\xcd\xe8\xba\x75\x2a\xd1\x45\x31" - "\x52\x10\x47\xdb\xc0\xdc\x61\x80\x56\xaa\xf3\xd6\x99\x32\xad\x75" - "\xe2\x9d\x35\xc5\xe3\x71\x50\xbc\x9a\x5e\xcb\xad\x51\x8a\xf9\x06" - "\xd1\xea\x3c\x50\xe8\xd2\x04\xd0\xdc\x2d\x68\xbe\x35\x45\xd8\xa8" - "\x5b\x53\x64\x7b\x12\x52\xff\x4a\x4f\x34\xb6\xa2\xcf\x47\xef\xe9" - "\x5a\x6a\xd0\x7f\xc4\x39\x13\xd1\xdd\x0e\xb7\x96\x72\x7f\x36\xa7" - "\x0f\xe8\xb7\xad\xe8\x2e\xfe\x1e\x4f\x6a\x8b\x95\xe2\x92\x93\x9f" - "\xd2\x94\x7b\x16\x7a\xf8\x9c\x8b\x6c\xe3\xad\xa7\x0e\x15\x39\x88" - "\xd6\x46\xf9\xfd\x36\xd2\xc2\x69\xea\x29\x3d\xb1\x9f\xde\x31\xd2" - "\xba\xfc\x21\xe7\x34\x82\x39\x8e\xbc\xad\x97\x79\x40\x31\xce\x11" - "\xb6\x2a\xd4\xdc\x47\xc9\x57\x41\xc3\xc4\x65\x42\x7f\xc6\x27\xf8" - "\xf7\x87\x70\xd4\xd3\xf1\xd3\xfc\x75\x6e\x7c\xaa\xbf\xce\x8d\xd7" - "\xfb\xf7\x07\x35\xf6\x87\xf1\xd9\x01\x65\x8a\x02\xca\x54\x28\xca" - "\x54\x4a\xf5\xd4\x07\x94\xd9\x1f\x50\x46\x69\xff\xb0\xcd\xe3\x8f" - "\x0e\xcc\x23\xb9\xbd\x1f\x6f\x57\x3c\xab\xab\xf8\x38\x35\xde\x29" - "\xa7\xd1\x7b\x4f\xf4\x3b\xf9\xbb\x7c\x81\x6f\x42\x6c\x80\x8d\x42" - "\xf8\x09\x09\xfe\x34\x4c\x48\xf6\xa7\x61\xc2\x6c\xf9\x79\x97\x98" - "\x07\xff\xa1\x13\x26\x94\x49\x7a\xe6\x8c\xd9\x06\x0f\xc5\xb8\x17" - "\x2d\x23\x3f\x8c\xc6\x27\xbe\xc7\x62\x2b\xfa\x8e\xe7\x20\x96\xf6" - "\xb6\x74\x16\x40\x18\xc5\x4d\xb2\xc3\xc4\x4a\x9c\x9f\x51\x4c\xd7" - "\x6e\xf4\xa7\x16\x22\x8e\x74\xac\xbf\x1a\xeb\x40\xde\x4d\x68\x08" - "\xa0\xa1\x31\x80\x86\x66\xc5\x73\x2c\x3e\xb7\x29\xda\x1d\x1b\x16" - "\xcf\xf7\x40\xa1\xcf\x3c\xc1\x21\xa7\xd3\x9c\x1e\xdb\xd8\x65\xe2" - "\x7e\x40\x0a\xed\x6b\x19\xd1\x0e\x13\x3e\x25\x3f\x58\xe0\x9c\x38" - "\x4a\xc9\x5b\xc1\x8b\x89\x49\xfe\x74\x4c\x4c\xf1\xa7\x63\x62\x9a" - "\xcf\xd6\x4c\x48\x17\x7d\x64\x62\x26\xda\x68\xae\xab\xc8\x0b\x5d" - "\x8c\x5b\x37\xd2\x3a\x8e\x7c\xd2\x89\x65\x4e\x6c\x2f\x7b\x56\x3d" - "\x42\x7a\xe6\x31\x07\xd9\x38\x5a\xff\x3f\xd1\x1c\x4a\x47\x7b\x22" - "\x4f\x58\xa5\xbd\x49\x3a\xc4\x6d\x95\x75\xdc\x5b\x7e\xc2\xea\x2d" - "\xfb\xcc\x88\x69\x68\xff\x6e\x75\x89\xb9\x87\xbd\x09\xf5\xb9\x1a" - "\x65\x82\xf3\xd4\x49\xbf\x97\xe6\x75\xc7\x68\xbf\x0a\xda\x1a\x8a" - "\xb7\x16\x25\xde\x69\x4e\xd2\x2a\xfa\x8a\x53\x57\x78\x0f\x6b\x87" - "\x49\x2d\xe4\xaf\x91\x2d\xa0\x7d\x2f\x87\xdc\x0e\xa0\xb5\x10\x9b" - "\xfb\x24\xf7\xa9\x31\xff\x88\x54\x76\xb6\xa2\xac\x43\x5a\xab\xe8" - "\xa2\xbc\x49\x6e\xd0\x1c\x72\x3a\x28\xae\x74\x9c\xf0\xc3\x27\xb5" - "\x1c\x42\x1b\x80\x65\x8c\x72\x19\x5a\xd7\x90\xe6\x23\x9a\x89\x45" - "\x74\xf7\x5c\x3b\xc7\x0d\x22\xf6\x5e\x17\xce\x67\xba\x6d\x45\x5d" - "\x60\x73\xb6\xd1\xfa\xa2\x46\xec\x1f\x98\x74\x24\xcc\x05\xda\x9e" - "\xb2\x13\xd8\x1f\x26\x1d\xf1\x94\x9d\x68\x44\xda\x50\xf7\x27\x72" - "\xbb\xa6\xe4\xdd\x9c\x39\x69\x8b\x16\xce\x9f\xb0\x74\xd1\xdc\xf4" - "\x39\x77\xe9\xd2\xb3\x9e\x5e\x9b\x39\x61\xdd\x86\x02\xdd\xa6\xbc" - "\xac\x82\xac\x9c\x27\x78\x28\x3c\xdd\xea\x02\xf1\x9d\x98\xbd\x3a" - "\xbf\x60\x06\xfd\x1c\xaf\xcb\xcd\x5b\xbb\x91\xff\xbc\x39\x12\xfc" - "\x91\x64\x15\xac\xcd\xd3\xdd\x98\x39\x5e\x77\xdf\xea\xac\xec\x0d" - "\x79\x6b\x83\xe2\xba\x4b\x97\xb7\x36\x6f\xed\xea\x4c\xdd\x0c\x5d" - "\x12\x61\x56\xa2\x53\xc8\x33\x49\xb6\x39\xf9\x38\x46\xa3\x5f\xdc" - "\x45\xb6\x87\xc6\xea\x4e\x98\xf2\x6b\xf2\xcb\x78\xec\x3a\xd4\x2d" - "\xb4\xf3\xf6\x5e\x4b\xd2\xfe\xc1\x63\x73\x52\xc0\xf8\x97\x14\x30" - "\xfe\x25\x75\x0c\x1e\x9b\x93\x5c\xfe\x65\x26\x6b\xfd\xcb\x4c\x8e" - "\x1f\x3c\x36\x4f\x1e\x1f\x50\x66\x7a\x40\x99\x79\x03\xb6\x03\x69" - "\xdd\xce\x6d\xcd\xe4\x8c\x80\x32\xb9\x01\x65\xcc\x01\xcf\x4a\xff" - "\x07\xfd\xd1\xc9\xf5\xca\xf1\x1e\x9f\xf7\xcb\xfd\xd7\x67\xb3\x26" - "\x37\xc9\x30\x34\x9e\xd4\xd1\x1d\x19\x02\xf6\xb8\x02\xb6\x4b\x82" - "\x75\x0c\xd8\xaa\xdd\x7c\xce\xdc\x25\x7c\xee\x29\xab\x25\x7b\x45" - "\x77\x66\xc8\xe3\x62\x07\xca\xe2\xfa\xd3\x30\xb9\xa5\x4e\xc0\x3a" - "\xf8\xda\xf0\xcb\xcb\x7b\xeb\x46\x80\x96\xca\x52\xec\x36\x66\x99" - "\xc4\x63\x04\x62\x5a\x14\x7e\xd0\xf6\x4c\x49\xc7\x39\xcc\x71\xaa" - "\x83\xde\x47\xda\x61\x0a\xd7\x65\x2a\x57\xc2\xf7\xbf\xf0\xfa\x5a" - "\xe8\xee\x0f\x8a\x87\x48\x36\x91\xea\xa5\x98\x82\x54\x37\xe2\xd0" - "\x30\x75\xd2\x68\x29\x36\x5c\x2c\x7e\xe2\x10\x67\x83\x8c\x13\xf1" - "\x71\xbb\xb2\x5d\xda\xdb\x29\x7c\x99\x29\xcd\xb2\xcf\x40\xfe\x7f" - "\x30\xdb\x11\x7c\x3f\x20\xc4\xec\xb2\x78\xdb\xac\xc5\x1d\x44\x93" - "\x8b\x7c\x4b\x5b\xbc\x1b\x5a\x6b\xdc\x38\x27\x85\x58\x3e\x47\x32" - "\x9e\x02\x5b\xbd\x9b\xbf\x47\x59\x65\x04\x73\x9d\xda\xdb\xc6\x06" - "\xca\xd1\xbc\xeb\x36\xfe\x4e\xb9\x84\xd2\xb1\x3c\xce\x0f\x1c\xb4" - "\x6f\x30\xd4\xbd\x34\x04\x67\x1d\x47\x73\xb8\xdb\x0c\x92\x3f\x5b" - "\x5a\x87\xb8\x82\xee\x69\x53\x83\xad\xd7\x72\xdb\x3e\x3b\x3c\x52" - "\x29\xdb\xe1\x43\xd5\xdc\xf6\xa9\x31\xfd\x20\xf2\xa2\x3b\x94\xef" - "\x21\xd9\xec\x5c\xda\x8f\x81\xb0\x5d\x17\x82\x25\xba\x0f\x61\xbb" - "\xb1\x2f\x5a\xdf\x28\x4e\x0a\x97\xec\x2b\xce\xfb\x93\x75\x72\xb9" - "\x4b\x69\x9f\xb4\xef\xd6\x81\x7d\xd5\x29\xe6\x7f\x53\x5f\x7a\x91" - "\xef\x93\x4b\xc6\xf9\xcf\x6d\x15\x52\x1b\xae\xc2\x67\xb4\x7f\xb7" - "\xf1\xfd\xbb\xf4\x4e\x9c\xe6\xc9\xf9\xb9\xe8\x87\xc5\x3b\xd1\x36" - "\x26\x57\xc9\x79\x7c\xdd\x98\xf2\x8a\x98\xeb\x50\x7c\x07\xe5\xed" - "\x1f\xc8\xa3\x72\x44\xb7\xd1\x4d\xe9\xcd\x72\xba\xf0\x03\x92\xdb" - "\x02\x9e\xbb\xe4\x67\xfc\x8d\xe3\xff\x6d\x2b\x24\xfc\x0e\xb4\xb9" - "\xb4\x0f\x41\xd5\x0e\x53\x97\xd4\xf2\x7e\x33\x35\x4e\xce\xe7\x6b" - "\x5f\xaf\xe1\xfc\xda\xed\x04\x6f\xe4\xc7\x56\xee\x47\x61\x19\xba" - "\x4b\x06\xe7\x0d\x2a\xd6\xcf\xf7\x44\x74\x13\x1e\xea\x33\xfc\x3e" - "\x07\x7c\x46\x5c\xb4\x3e\xef\x20\x1d\xd9\xe4\x86\x51\xb9\x77\xd3" - "\x1a\xf1\x54\x11\x3b\xd9\xc2\xf5\x87\x11\x3e\x93\x5b\xe0\x26\x7c" - "\x74\xe7\x0d\xeb\x31\x20\xad\x53\xa9\xfd\xcd\xa1\x64\x85\xf9\x07" - "\x14\xbc\x0c\xc7\xe7\x26\xff\xb6\x4e\x3d\x16\xf0\xdc\x21\x3f\xd3" - "\x7a\xac\xd0\xbd\xa9\x6d\x22\xef\x76\xb8\x50\x5d\x34\xa7\x45\x98" - "\x04\xff\xfa\x6e\x4f\xf6\xc7\x7f\xfb\xec\x80\xe7\x74\xf9\xb9\x8a" - "\xbf\x07\xb8\x3d\x53\xae\x43\xac\xc7\x7d\x6c\xdd\x57\xec\x08\xbf" - "\x34\xfd\xb9\xe3\xb7\x42\x7f\x6e\x6f\x50\xd0\x30\x04\x9f\x1b\x7d" - "\xf2\xbc\xbd\x49\xc6\x8f\xbf\x8f\x2a\xe0\xb0\x8f\xdc\x6e\x0f\xd4" - "\x97\x7c\x23\xe9\x19\xe9\xcc\xed\xee\x20\x79\x2e\x91\x77\x47\x7c" - "\x70\x3d\xbb\x23\x49\x91\x2e\xcd\x3b\xee\x78\x49\x1a\xab\xc9\x46" - "\x3a\xe9\x4e\x1d\x29\xae\x2f\xd7\x0b\x8a\xf7\x29\xdd\xf3\x81\xba" - "\x75\x47\x6e\x20\x5e\xba\x9b\x61\x00\x87\x0f\xa7\x34\xbf\xb8\xa3" - "\xde\xd7\xb6\x3b\xde\xb1\xc3\xd4\x7a\x59\x6f\xc5\x9a\xdb\xed\x35" - "\xa1\xfc\x79\x84\x3f\xee\xcf\xb3\x3b\xba\x7d\x3c\xbb\xc3\xe5\xc3" - "\x3b\x4d\xa3\x80\xfb\x00\x9f\xe3\x7c\x70\xd3\x74\x17\xd3\x0f\xb1" - "\xd7\x7f\x5a\xaa\x7f\x5d\xd3\xf4\x0a\x1c\x99\x8a\xba\x72\x15\x70" - "\x6d\xf8\x6c\x0e\x2d\x9f\x69\x35\xa1\xe5\x33\xad\x31\xb8\x7c\xa6" - "\x1d\x55\xd4\x7b\xfc\xe2\xba\x7d\x27\x28\xe8\xa9\xc3\xe7\x58\x7f" - "\x5d\xbe\x53\x17\xf0\x3c\x20\x7f\x86\xfd\x77\x5f\x61\x4a\x38\xa5" - "\x17\x8c\x85\x58\xa1\xeb\x77\xa6\x29\xf3\xdf\xed\x13\xf9\x44\x23" - "\x7f\x57\x45\xef\x01\x05\x9c\x31\x10\x8e\x60\x14\xf9\xd5\x32\xed" - "\x25\x21\x62\xd0\xca\x63\x90\xcd\x4b\x63\xd0\x9d\x07\xc4\xfb\x8d" - "\x36\xe4\xc5\x7b\xfa\x50\xe3\x09\xe2\xc5\xf1\xff\xce\x06\xc1\x9f" - "\x3b\x51\xff\x1f\xe2\xef\x53\x59\x69\x9b\x13\xf5\xa9\xaf\x13\xee" - "\xa2\x3d\x61\xfd\xf8\xbd\xd9\x7f\x8c\xbb\x2b\x8e\x59\x54\x8b\xeb" - "\x2c\x81\x63\xdf\x5d\xe3\xd1\xa7\xef\x8b\x71\x9b\xf5\x41\xf2\x52" - "\x99\x25\x6c\x51\x90\xf4\x0c\x94\x57\x9f\x1d\xee\xaa\x22\x7a\x15" - "\xe9\x46\x66\x19\x96\x4e\xf0\x76\xaa\x0f\xcb\x84\x92\x9b\xbc\xff" - "\x5d\xe8\xde\x5d\x4d\x01\xed\x38\xdf\x09\x3f\x9f\x29\xda\xf1\xf3" - "\xbd\x01\x75\x1f\x0f\xd1\x0e\x9a\xa7\x9d\x0f\xde\x8e\x9f\x8b\xbb" - "\xfe\xd4\xd8\x96\x41\x63\xff\xcf\xc7\x63\x5b\xce\x73\xbe\xfb\xa7" - "\xcf\x96\xe7\x7f\xa6\xf3\x38\xaf\x56\x03\x2f\xbb\xb8\xc8\x27\x37" - "\x09\x2e\x3b\xa6\x1a\xd2\x82\xd4\x59\xc2\x2c\x43\x17\xdb\xe1\xe7" - "\x07\xe5\x31\x43\x4a\xaf\x11\xb4\x20\x9f\xd4\x9c\x4f\xc7\xa9\x5c" - "\x28\x79\xcb\xfd\x53\xbc\x93\xf9\x39\xf6\xff\xbb\x64\xfb\xe1\xc4" - "\x31\xd5\x21\xf3\xb1\xd7\x32\x5d\x1b\x90\xe7\x52\xe4\x25\xf8\xe5" - "\x6d\x1d\x48\x9f\x2e\xa7\x5f\x9a\x9c\xa6\x67\x07\xc8\x09\xe5\x33" - "\xdd\xe3\xdf\xee\xe9\x45\xa2\x7d\x28\xa3\x41\xbc\x9e\x5e\x8d\x32" - "\xea\x0f\x2e\xa3\xe9\x07\x82\xeb\xda\x74\xe1\x7b\x8e\x80\x60\xf8" - "\xba\x50\x76\xfd\x5c\x07\x25\x39\x0d\x96\xcf\x8c\x28\x59\x3e\x97" - "\xd6\xc6\x19\x69\x01\x6d\xf4\x20\x8e\x16\xd1\xd6\xbb\x47\x07\xe0" - "\x36\x04\xd7\xc5\x19\x66\x6c\xa7\x27\x78\x3b\x67\xd4\x84\xd6\xc5" - "\x19\x74\x5f\x8e\x67\xb0\x2e\xce\x90\xef\x63\x0e\x56\xa6\x9b\x59" - "\x82\xd5\x73\xb7\x86\x7c\x13\x3b\xdc\x3d\x9d\xde\x73\x29\xd2\x47" - "\xf9\xeb\x1f\xb6\x81\xca\x11\xff\xdc\x62\x2e\x41\x72\xe8\xd4\x81" - "\xfa\x62\x3a\xd9\x6b\xb9\xbb\x28\x80\x57\x67\x10\xbf\xa7\x47\xad" - "\xbe\x4f\xf0\xeb\x9e\xdf\x07\xd0\x54\x1d\x9c\x5f\x77\xef\x47\x7e" - "\x9d\x09\xce\xaf\xbb\x8f\x84\xe6\xd7\xdd\x24\xff\x33\x83\xf9\x75" - "\x0f\x28\xf9\x45\x77\x01\x52\xfb\x6e\x88\x47\xdd\xe8\x5f\xc5\xea" - "\x84\x2d\x8f\x8d\x41\x5d\x11\x65\xba\xa9\x4c\x72\x8c\x4b\xe8\x89" - "\xee\x3a\xd0\x9e\x86\x7b\x46\xc9\xfd\x7f\x58\x35\x0c\x65\xfd\xcb" - "\x19\xdd\xe3\x43\xe5\x6c\xc6\x33\x56\xba\x83\x8c\xd6\xf1\x02\xea" - "\x35\x06\xb7\x05\xf7\x54\x22\x4f\x5f\x08\x92\xde\x20\xd6\x22\xef" - "\xb1\xfb\xdb\x88\x7b\xac\xfe\x32\x42\xbe\xa9\x79\x14\x5d\xd5\xa5" - "\x7c\x2e\x2c\xb3\x94\xa4\xc1\x32\x4b\xf9\xa3\x90\x57\xca\xaf\xfd" - "\xe9\x4b\x49\x0d\x2e\xaf\x94\x8c\xd0\xf2\x4a\x29\x0a\x2d\xaf\x94" - "\x6a\x92\x97\x1d\x52\x8e\xfa\x8f\x1b\x29\xfb\xfd\xdb\x8b\xf5\x62" - "\x39\xa6\x1e\x32\x92\x9e\x2f\xb5\xdd\xf2\x87\x6c\x1c\xc9\xaa\x0e" - "\xfd\x2b\xa4\x7f\x2c\xd1\x78\xb9\x38\x42\xe2\x46\x1e\x56\x16\x86" - "\x8c\x57\x1f\xd5\x8a\x73\x3b\xda\xaf\xc6\xef\x13\x85\x99\x6f\x7a" - "\xd5\xaa\xbb\xf0\xb7\xba\x13\xee\x5d\xef\x55\x87\x99\xe9\x3c\x09" - "\x3f\x47\xc2\xd7\xfd\x67\x1e\x54\xca\x82\xf6\x0f\xd3\x1a\xef\x4e" - "\xb1\x7e\xf8\xd7\x4e\x98\x35\x47\xc8\xe5\xde\x87\xfc\xf9\x38\xd3" - "\x1e\x5c\x2e\x33\x5d\x28\x97\xbf\x06\x97\xcb\xac\xb8\xd0\x72\x99" - "\x45\x67\xcf\xfe\x3a\xb8\x1f\xcd\x4a\x95\xfa\xd1\x76\x2a\xa3\xcb" - "\x21\x7f\x75\xd6\xff\x25\x18\xfc\x8d\x7d\x64\xd6\x6b\x94\x3f\xa1" - "\x5b\xee\x47\xbc\x4c\x11\xe2\xe2\xf5\x4b\x30\x46\x09\x87\x12\x6f" - "\x7d\x4c\x77\xb0\x7e\x32\x8b\xdf\x6d\x3c\x31\x17\xb4\xc8\x43\xfd" - "\x5e\xc2\x91\x07\x70\x1a\xee\x8d\x26\x38\x4a\xa7\xd8\xdf\x0a\xf8" - "\x2e\x19\x8e\x6c\x9d\x80\x9d\x65\x67\xbd\x06\x7e\xa7\x89\x3f\xee" - "\x7b\xa5\xf6\x0f\xe5\xe3\x08\xc1\x13\x5c\x00\xcc\x34\xd1\x1f\xef" - "\x2d\xf2\xef\x8f\xf7\xa6\xf9\xeb\x27\xf2\x1f\xcb\x79\xd1\xce\xe1" - "\xef\x7d\x1e\x8b\xea\xae\x2b\xd3\x37\xef\x3d\x12\xd0\x37\x51\x07" - "\x66\x3f\x2d\x74\x60\xf6\xfc\x00\x5a\x3b\x82\xeb\xc0\xbd\xee\xd0" - "\x3a\x30\x3b\x3e\xb4\x0e\xcc\x4e\x26\x1d\xb0\xc3\xec\x6c\xff\xbe" - "\x39\x7b\x9e\x7f\xdb\xb1\x5e\xde\x37\x61\xf8\xe5\xf4\x4d\xf4\x85" - "\x46\x86\xea\x87\x92\xff\xaf\xa2\xfb\x7b\x2e\x83\x67\xe2\x3e\x0a" - "\x98\x03\xf4\x6e\x06\x6d\xbc\x81\x78\x58\xcb\xe7\x68\x73\xe2\x94" - "\x7c\xdc\x29\xe6\x5a\x26\x84\xdd\x43\x7b\xdb\x04\x3f\xef\x5b\xed" - "\xdf\xfe\x39\xc9\xc1\xf9\x39\x67\x1e\xf2\xd3\x14\x9c\x9f\x73\x0c" - "\xa1\xf9\x39\xa7\x84\xce\x28\x0e\xee\x53\x73\xe8\x0e\x32\xad\x3c" - "\x36\x9d\x86\x39\xe7\x2e\x6d\x7c\x9a\x73\xcc\x7f\x7c\x9a\x73\xf0" - "\xf2\xc7\xa7\xfb\xe2\x83\x8f\x4f\xf7\x25\x05\x1f\x9f\xee\x4b\x15" - "\xfd\xe1\x3e\xb3\x7f\x7f\xb8\x2f\xc3\x5f\x27\x90\x77\x57\x6c\x7c" - "\xba\xef\x68\x40\x1f\xd8\xd5\x09\xf7\x3f\x84\x3e\xc5\x33\x42\x6e" - "\xa9\x57\x07\xd0\xd8\x1d\x5c\x6e\xf7\x6b\x50\x6e\xbb\x82\xcb\xed" - "\x7e\x5d\x68\xb9\xdd\x4f\x67\x4b\x77\x0d\x96\xdb\xfd\xe9\x97\xef" - "\x53\xdc\x5f\xea\x2f\xb3\xfb\x73\x2f\x5f\x66\xf7\x1f\x09\x2e\xb3" - "\xfb\x3b\x82\xcb\xec\x7e\xe9\xcc\x7f\x6a\xb2\xbf\xcc\x52\xe3\xfc" - "\x65\x86\x7c\xbb\x62\x32\x4b\x2d\x09\x90\xd9\xba\x4e\x98\x8b\xf3" - "\x66\xf5\x51\x21\xb3\xb9\x87\xfd\x69\x4c\xad\x0f\x2e\xb3\xd4\x46" - "\x94\xd9\xba\xe0\x32\x4b\x3d\x16\x5a\x66\xa9\x0e\x94\xd9\xba\xc1" - "\x32\x9b\xab\xbd\x7c\x99\xcd\x9d\xee\x2f\xb3\xb9\x09\x97\x2f\xb3" - "\xb9\xe6\xe0\x32\x9b\x5b\x1d\x5c\x66\x73\xf7\x0b\x99\xcd\xed\xf2" - "\x97\xd9\xdc\x66\x7f\x99\x21\xdf\xbe\xa5\xcc\x50\x3e\x2e\xb1\xaf" - "\xf5\x81\xb9\x3d\x7c\x5d\xf9\x81\x14\x3b\x3c\xa8\x15\xeb\xf2\x0f" - "\x70\xdd\x91\x64\xf8\x2e\xc2\x24\x0f\x1e\xbb\x1f\x58\x21\xa5\x2d" - "\x1d\x2c\x87\x07\x8c\x38\xae\x76\x37\x15\xf1\xfd\x52\x42\x86\xc4" - "\x73\x84\x13\x6b\x64\x0f\x54\x53\x59\x94\x31\xb3\xb9\xdc\x40\x63" - "\x31\xc2\x3b\x09\x0f\x9d\xa7\x0f\xc0\xd5\x74\x39\x7e\x59\xe8\xbd" - "\xd8\x6d\x2e\x6b\xf1\x14\xc4\xf7\xe0\x5f\x84\xae\x3e\x18\xe8\xff" - "\xd6\x61\xde\xaf\x84\x9e\xce\x0f\x58\x33\x79\x30\x84\xff\xfb\x20" - "\xf9\xbf\x75\xc1\xf5\xf4\xc1\x0b\xf8\xbf\x0f\x92\xff\x5b\xa7\x98" - "\xaf\x8e\x58\xe9\xb6\x07\xcc\x57\x1f\x3c\x18\xe3\x14\xba\xc3\xfd" - "\xd8\xb2\x36\x17\xd2\xdc\x11\x40\x33\xca\x66\xde\x6a\x89\xe6\x65" - "\x01\xe5\xdd\xc1\x69\x9e\x17\x87\x34\xbf\x1b\x9c\xe6\x79\x49\xa1" - "\x69\x9e\x37\x0f\x69\x7e\x77\x70\xdf\x9a\x97\x29\xe9\x41\x90\x79" - "\xf9\x3c\x73\x70\xf9\xcf\x0b\x90\x3f\xe8\x0b\x8a\x98\x83\x97\xf7" - "\x87\xb3\x2a\xe1\x68\x4f\x3b\xc1\x92\x8e\x04\x81\xed\x0e\xc4\x19" - "\x1c\x6e\x7e\xdc\x20\xdd\xa3\x3d\xf8\x41\x75\x6f\x7e\x8a\xe8\x8f" - "\xf3\xab\xfd\xfb\xe3\x7c\xbd\x7f\x7f\x7c\xd0\x1d\x50\xce\x18\x90" - "\x9f\x7a\xe5\x6c\xec\xfc\xae\x00\x1d\x78\xaf\x13\x16\xac\x15\x3a" - "\xb0\xe0\xb7\xfe\x74\x2c\x80\xe0\x3a\xb0\x20\x1e\xdb\xff\x5e\x70" - "\x1d\x58\x90\x1c\x5a\x07\x16\xa4\x21\x2f\xdf\x53\xea\xed\xe2\xa2" - "\x94\xa1\x01\x30\x05\xc1\x6d\xde\x82\x8a\xe0\xeb\x3a\x0b\xf6\x09" - "\x1e\x2f\x38\xee\xcf\xe3\x05\x07\xfd\x79\xb8\x00\xae\x00\x0f\x07" - "\xe2\xd1\xf4\x5a\x16\x06\xf6\x7f\x5b\x27\x2c\x94\xfa\x7f\xda\x9b" - "\xfe\x34\x2e\x94\xe6\x3f\xc1\xd6\xb2\x16\x66\x22\x2f\x6d\xc1\x79" - "\xb9\xd0\x1c\xbc\xcd\x0b\xab\x71\x0c\xb2\x79\x07\xf5\xa5\x85\xfb" - "\x31\x7d\x31\xbf\x53\xec\x3c\xc4\xd6\x62\xfa\x62\x37\x68\xf9\x78" - "\x35\x30\x2e\x2d\x3c\x46\x6b\xe4\x7c\x8d\x19\xf5\x37\x66\x14\xa4" - "\xd1\x18\x44\x74\xad\x2a\x0a\x7c\x2f\xc9\x43\x19\xf0\x33\xa7\x74" - "\xfe\x24\xc6\x08\x69\x36\xa7\x1b\x64\x7d\x27\x78\x7f\xdc\x69\x49" - "\xd4\x2f\x08\x5e\x86\x15\x6b\x9d\xe6\x00\xdb\x94\xa6\x0f\x2e\xe3" - "\xb4\xdc\xd0\xba\x93\x56\x21\xe4\x9c\x66\xf5\x97\x73\xda\x3e\xaf" - "\x65\x58\x3a\xb5\xd5\x8e\x7c\xbe\x1c\x19\xd3\xfb\xcb\x90\xf6\x7e" - "\xfb\xf2\xb6\xdc\x62\x18\x73\x12\x1e\x4a\xe4\xf5\xa9\x19\xce\x89" - "\x55\xd0\xc4\x6d\xc0\x43\xfc\x0e\x63\x82\x59\xe5\x06\x35\xdb\xfe" - "\x54\x1b\xe5\xd5\x59\x98\x8b\xdf\x99\x66\x61\x47\x29\x1e\x05\xea" - "\xc2\xc8\x76\x78\x68\xa6\x5f\x79\x0d\x80\x4d\xe0\x28\x12\xeb\xfb" - "\x0f\x19\xe5\x75\xf8\x50\xeb\xfb\x08\x53\x23\xef\xa7\x15\xef\xc2" - "\x1e\xaa\x0c\x39\x2e\x23\x4d\x74\x0e\x93\x68\xba\xb0\x1d\x78\xc8" - "\x21\xeb\xaf\x38\xa3\xb3\x08\x7c\x67\x40\x16\x45\x61\xde\x81\x0b" - "\xac\xe7\x2a\xfa\xc1\xa2\x69\x4a\x3c\x22\x26\xd3\xa2\x79\xf2\x39" - "\x0e\xfc\xad\xbf\x08\x2e\x89\x9e\x45\xe6\x00\x7a\x2a\xd1\xb7\x3c" - "\x20\xe1\xa8\xb9\x08\x8e\x38\xdb\xbe\xbb\x60\xa2\x17\xc2\x4e\x42" - "\xfa\x97\x55\xb4\x4f\xa6\xa6\x0b\xa2\xdc\xa0\x11\x73\xbb\x45\x5f" - "\xb5\xc4\xd3\x1a\x0e\x9d\xcf\xbd\xc7\x4a\xef\xe0\xf8\x7b\xfc\xf8" - "\x7b\xac\x2d\x46\x8f\x14\x7b\x67\x31\xd7\x89\x16\xc3\x19\x6b\xcd" - "\x6e\xd6\xb5\x97\x9f\x55\x5b\xec\x37\xff\xab\xa0\x3d\x38\xb4\x17" - "\xa2\x18\xee\x41\xf8\x3d\xa2\xaf\xa7\x07\xf8\xa4\x8b\x43\xcc\xff" - "\x16\xd3\xfc\xef\x9e\xe0\xfd\x7c\xf1\x05\xe6\x7f\x8b\x69\xfe\x77" - "\x8f\x72\xdc\x14\xef\x79\x16\xd7\x28\x7d\x52\x8a\x8b\xa2\x7b\x9c" - "\xfc\xcc\xf4\xe1\xb7\x56\x01\xdd\xc7\xcb\xa8\x6f\xda\xba\x9a\xa8" - "\xbf\xc6\xb6\x38\x1a\xe9\x4c\xb3\x96\xee\x7a\x15\x63\x19\xf5\xd7" - "\xc5\x76\x3e\x96\xb9\x45\x5f\x34\x19\x99\x63\x7c\x07\xea\xd0\x3a" - "\x83\x84\x6b\xf1\x91\xad\x06\xc6\xf7\x42\x0c\xeb\x80\xa1\xb6\x2e" - "\x3e\x2e\xaa\xc8\x5f\xe5\x7e\xab\xfb\x1c\x10\xde\x43\x45\x2d\x40" - "\x78\xbd\x03\xe3\x24\xe1\x4e\x9f\x4e\x7d\x9c\x70\x12\xee\x56\x84" - "\x23\xbc\x04\x27\xb7\x43\x9c\x23\x49\xcf\x54\xb6\x9d\xaf\xbf\x60" - "\xdd\x98\xfe\x1a\xad\xab\xd8\xa8\x9c\x69\x39\x9b\xd8\x41\xef\xcc" - "\xce\x58\x99\xe9\x29\x36\x31\x8f\xd6\xc4\xd2\xbf\xa2\x72\xef\xfe" - "\xb7\x3d\xbc\x60\x2c\x68\xa5\xb4\x77\x9a\x74\x2e\xd4\xe3\x74\x87" - "\xbf\x8d\x48\x0f\xf0\x7f\x17\xf3\x79\xa6\x1d\x16\x51\x6c\x00\x90" - "\xf6\x85\x92\x3d\x60\x36\x77\x2f\xd7\x8f\x0b\xed\x6b\xa0\x77\xd2" - "\xb4\x2f\x49\xc4\xfd\x59\x32\x2d\x60\xed\xcd\xb1\x93\xef\x6d\xf9" - "\x04\xeb\x5d\xf2\xbe\xd0\x91\x87\xdf\xf7\x97\xe9\x12\xbd\xe9\x14" - "\xbd\x0b\x12\xe3\xc1\x4a\x77\xa0\x7d\x5c\x62\x94\x7d\xb7\x80\xf4" - "\x4a\x79\x3c\xd0\xe5\x70\xbc\x01\xe3\xcc\x12\xee\xff\x7b\x06\x8d" - "\x0b\x4b\x9a\xb1\x7d\x7e\x3a\xd9\xca\x75\x68\x89\xbd\xc5\x89\x7a" - "\x93\x47\xfa\xff\xf0\x32\x84\xd9\x46\x67\xf3\xf0\x79\xe8\x69\x78" - "\x38\xd6\x63\x01\x6d\x8b\x83\x9f\x3d\x8a\x45\x1d\xe1\x7a\x4b\xe3" - "\xc6\x24\xb1\x27\x28\xa0\x8e\x87\xc7\xcb\x3c\x27\x98\xd6\xbc\x4f" - "\x40\xec\x69\x20\x5d\x78\x18\x68\x7f\xc4\xb0\x6e\x18\x4a\xb8\x64" - "\x1d\xb2\xb9\xdb\xa0\xd5\x1d\x38\xe7\x79\xb8\x20\x78\xdb\x1f\xa6" - "\xf1\xff\x05\x3b\x3c\xdc\xe1\x2f\xdb\x87\xf9\xf8\x2f\xbf\xd7\xb1" - "\x23\x0f\x02\xca\x35\xf9\xcb\x7e\x89\x9e\xf2\x43\xee\xb3\x29\x6d" - "\xa3\xf7\xbb\xab\x9c\x7c\xcf\xd5\x52\xec\xff\x4b\xe2\x2e\x64\x07" - "\x99\xb6\xcd\xed\x45\x58\x69\xbf\x2d\xda\xad\xa5\xa9\x7e\x6b\x46" - "\xd7\xf0\x35\xa3\x55\x9d\xb0\x54\x7a\xf7\xa3\xdf\xe1\x4f\xdf\xd2" - "\xcc\xd0\xbe\xc1\x52\x7a\xff\xb3\x2a\xb8\xcd\x58\x5a\x13\xdc\x37" - "\x58\x7a\x40\xb2\x0b\xab\x58\x44\xa0\x1e\x2c\x3d\x8a\x32\xe6\x65" - "\xe4\x39\x2c\xad\x85\x86\x9e\xc3\xea\x61\x60\x0e\x9b\x47\xf6\x60" - "\x69\xd7\xc0\x1c\xd6\x11\x6c\x0e\x6b\x0f\x22\x4f\xfd\xec\xe0\xf2" - "\xd4\xaf\x08\x3e\x87\xd5\x17\x88\x71\x5e\xdf\xe0\x2f\x67\x7d\x85" - "\xef\x9d\xf0\xd2\xcc\x2b\xe7\x0f\xeb\x5d\x83\xfd\xe1\x65\x1b\x84" - "\xac\x96\xfd\xc6\x9f\xb6\x65\xb1\xc1\x6d\xfb\xb2\xc4\xd0\xfe\xf0" - "\xb2\xd9\xa1\x6d\xfb\xb2\x8c\xc1\xfe\xb0\x6e\x48\x00\x4c\xc9\x80" - "\xaf\xe4\xe7\x9b\x2d\xab\x11\x7c\x5a\x46\xfe\x5c\x98\x02\xfe\x80" - "\xbf\xbe\x2f\xa3\xfe\x16\x83\xb6\xed\x24\xd9\x34\x59\x67\x42\xf1" - "\x84\x62\x98\xdc\x50\x05\x11\xd8\x07\xde\xeb\xb5\x3c\x32\xa0\xff" - "\xb4\x97\x8e\xea\x21\x1b\x19\x72\x4f\x9b\x5a\xa6\x8f\xe8\x78\x64" - "\xfa\x85\xde\x97\x86\xc5\x43\xda\x8b\x83\xf8\xf1\x08\xf7\xff\x08" - "\xc7\x85\x65\xf6\xc8\x3b\x01\x7d\xcc\x29\xf6\xc2\x2e\xdf\x2c\xe4" - "\xb6\x3c\x60\x2e\xfb\x48\x33\x3f\x17\x17\xd2\xde\x3e\xd2\x15\x5c" - "\x47\x97\x0f\xf0\x0b\xf5\x9f\xf0\xde\x19\x90\xaf\x13\x32\x58\x6e" - "\xf4\x46\x28\xd7\xba\x97\x4f\xf3\xb7\x49\xcb\x75\x01\xe5\x02\xe6" - "\x7f\x8f\xd0\xd9\xca\x50\x7b\x1c\x02\xc6\x9b\xe5\x0d\xa1\xc7\x9b" - "\x15\x53\x45\xfb\x1f\x0d\x78\xbf\xbc\xbc\xf9\xc2\xe3\xcd\xf2\x10" - "\xed\x5f\x01\xfe\xe3\xcd\x8a\x80\x77\xf4\x2b\x74\xc1\xc7\x9b\x15" - "\xd3\x64\x3b\x23\xec\xc6\x8a\xe7\x2f\xcd\xde\xac\xc8\xf5\xb7\x37" - "\x2b\xf4\x17\xb3\x37\x87\x06\xd9\x9b\x15\x07\x62\x6a\x82\xb6\xe5" - "\x48\x70\x7b\xb3\xa2\x43\xc8\xf0\xd1\xe9\xfe\xf6\x66\x85\xdb\x5f" - "\x86\x2b\x02\x64\xf8\x68\xc0\xfb\xef\xe5\xcd\xdf\xd4\x26\x85\x85" - "\x85\xa9\xc3\x54\x6a\x55\x18\xd0\xc5\x26\x2a\x18\x1a\xa6\x09\x0b" - "\xc7\xcf\x10\xe9\x7b\xa8\x3a\x4c\xad\xc1\x4f\xb8\xf4\x3d\x24\xe0" - "\x79\x28\x95\xc5\x8f\x46\xfa\x0e\x0f\x78\x1e\x72\x91\xfc\xa1\x52" - "\xbd\x72\xfd\x9a\x80\xe7\xf0\x8b\xe4\x0f\xf9\x96\xe5\x61\xd0\xb3" - "\xff\xf9\xc2\xb9\x39\x1b\x57\x67\x67\x65\xf2\xbd\xe5\x6b\x75\xab" - "\xd7\xac\x59\x9b\x9f\xaf\x2b\x58\xa7\x9b\x35\x73\xd1\x94\xbb\x74" - "\x62\x8b\x7a\xf6\x8c\x1b\x33\x23\x61\xfe\xa6\x3c\xca\x98\xbf\x78" - "\xae\x5e\x97\x36\x6b\xa6\x7f\xa6\x8c\x86\x6f\x45\xbf\x10\x16\xe5" - "\x5d\xd8\x65\xd7\x00\x54\x5c\xc3\xed\x4e\x47\x4b\x3d\x80\x98\x4f" - "\xac\x29\x3b\x82\x5e\x07\xeb\x33\x31\x3a\xaf\xd0\x0e\xab\x66\x50" - "\x23\x26\xd4\x9b\x21\xf7\x71\x8a\x2f\xb2\x6a\x19\xfb\x9d\x03\x74" - "\x0f\x80\xba\x1d\x0c\x7b\x9a\x70\xf6\x4f\xcf\xb6\x0e\x37\xe8\x4c" - "\xe4\xdb\xae\xb9\x13\xf3\x54\xec\x6e\x2f\xa6\x39\xa5\x73\xec\x8f" - "\xcd\xe5\x69\xbf\x33\xcb\x70\x31\x9d\xb0\xca\xc3\x7e\xc7\xf8\x33" - "\xbb\xbb\x52\x82\x5b\xf5\x47\xaf\x65\x65\x25\xd9\x85\x1a\x71\x5f" - "\x36\xec\x19\x01\xda\x3d\xd7\x50\xac\xc5\x55\x4d\xf2\xde\xe8\x32" - "\x7c\xb6\x83\xa1\x9a\xea\x26\x58\xaf\x7a\xe5\xff\xc3\xe1\x47\xf8" - "\xc1\x3b\x7d\x7b\xa9\x57\x35\xd1\xdd\xf2\x0b\x4f\xe0\x90\x1f\x69" - "\x4b\xb2\x15\x99\x21\xc6\xc3\xbe\x9a\x98\x0a\xaa\xd6\x12\x80\xcd" - "\x6e\xe6\xb6\xe6\x9d\xc4\xfa\x33\x66\xc6\x6c\x66\x5f\xd9\xd0\x6f" - "\x9c\xdf\x6d\x62\x3b\x4f\x81\x06\xfb\xb4\xca\x9a\x47\x67\x1a\x32" - "\x12\x6b\xcf\x83\x06\x79\x30\xea\x24\xac\xd6\x17\xcd\x67\x1e\xd3" - "\x7c\xd0\x7c\x68\xa4\xb3\xa4\x9f\x3c\xb0\xf3\x4f\xa0\xf9\xe7\x3e" - "\xb3\xba\x8f\xc5\x43\x51\x01\xeb\x62\x14\x83\xd5\xc9\x5c\xb4\xef" - "\xf5\x48\x86\x87\x60\xee\xea\x35\xc5\x43\x6b\x81\x13\xb6\x1e\x67" - "\xae\xd2\x3f\x89\xd8\x0e\x2d\xdd\x4e\x3a\x9b\xaa\xdd\x3a\x1f\xc2" - "\x3a\xf5\xa0\x6e\x31\x54\x83\x6d\x85\x13\x8a\x8e\xb3\xae\x23\x19" - "\x27\xa0\xd5\xb0\x1f\x56\xb5\x81\xfa\x48\xc7\xa7\xc0\xe3\x88\xee" - "\x1c\x5e\x59\x7c\x0e\xe2\xb7\x66\x51\xda\x39\x28\xdc\x0a\xd1\x85" - "\x7f\xa6\xb9\x50\x1b\xd6\x73\x0a\x1e\x39\x06\x2a\xc4\xa7\xde\xf2" - "\x29\xc4\x6f\x59\x46\x67\xb5\x53\xa0\xa6\x18\xe2\x99\x29\x31\xaa" - "\xcf\x94\x18\xdb\xc7\x12\x47\xf4\x9a\x12\xe3\x5a\x73\x11\xbe\xe3" - "\xb7\x30\xac\x0d\xe2\x7e\x77\xb2\x4d\x5d\x7d\x16\x46\xe9\x16\x90" - "\xfc\x57\xa7\xd7\x9c\x45\xf8\xf2\x2f\x62\xbd\x58\x56\x59\xc6\x1d" - "\xf1\x45\xa2\x4d\xef\x02\x2f\xe2\xaa\xee\x83\x51\x35\x7d\x10\xef" - "\x2d\xfb\x22\x96\x78\xd1\x5f\xfe\x71\x12\xda\xc1\xa1\xef\x3e\xd6" - "\xa8\xb1\x1d\xe9\x86\x16\x67\x1f\xb4\xc2\x27\x60\x33\x7e\x61\xfd" - "\xe7\xc7\x1a\xc3\xd1\x8f\x54\x59\x0b\x69\xff\xb9\xd0\x19\x53\x0b" - "\xc5\xa0\x32\xc3\xae\x62\x88\xca\x2d\x84\xa1\x27\x31\x9d\xdb\x9c" - "\xd2\x0f\xa7\xd9\xdc\x5f\x58\x0b\xf9\xf9\x6a\x43\x75\x71\x0b\x84" - "\xb5\x3a\xab\xe9\x1c\xaf\xda\x33\x6c\x78\xa5\xcd\x79\x14\x6c\xb9" - "\x7f\xb5\x7a\xa3\x86\x1b\x2b\xbc\xa0\xfd\xd5\xd7\x47\xd5\x36\xcd" - "\xd7\x60\xd3\x3b\xe1\x3d\xac\x9b\xed\x1c\x5e\x83\xb6\x2a\xa5\xd5" - "\xe9\xa2\x38\x34\x49\xac\x27\x3e\x72\x57\x1e\x8c\xaf\x3d\x0b\x09" - "\x7b\xcf\x42\x22\xeb\x4d\x54\xd3\x99\xe9\x47\x4f\xc5\xc2\x5e\xfc" - "\x8e\xc2\xb9\x17\xb6\x97\x9f\x9d\x66\xd1\xd2\xd9\xe9\xfe\x44\xa8" - "\xeb\xf3\x9d\x9d\xee\xeb\xf1\x9d\x9d\x46\x5d\x6a\xa6\xf3\xd3\xd8" - "\x2f\xcc\xa4\xcf\xbb\x4e\x83\x66\xfb\x69\x80\x89\x66\x35\xe8\x1e" - "\xa3\x98\x18\x6b\x26\xd8\x32\x4f\xf1\xdf\xed\xf0\x58\x07\x7e\x47" - "\xe1\x07\xe7\x6f\x8f\xf1\xf3\xbe\x1d\x92\xde\x62\x9a\x1a\xd3\x5a" - "\xf0\x3b\x0c\xbf\xdf\x37\xd5\x30\x07\x2b\xfd\x2f\x0d\xfa\x26\x91" - "\xa4\xbf\xe2\x9c\xf6\x7f\x69\x7a\x2d\x8f\x1d\xb4\xc3\x2f\x2a\x64" - "\x3d\x16\xf6\x7c\x55\xf3\x7b\x9d\xa7\x28\xae\xaf\x83\xd3\xd3\x6f" - "\x50\x51\x8c\x5f\x29\x9d\x68\xb8\x91\xea\x6d\x87\x35\x5a\xfc\x8e" - "\xc1\x0f\xf6\xcb\xc7\x6a\xe4\xb2\x3d\xfd\x06\xac\x73\xcd\x68\x4c" - "\x67\x72\x3a\xb6\x57\x43\x79\xff\xa7\xf3\x94\x5a\xc0\x24\xaa\x11" - "\xa7\x4b\xc2\x8f\x7d\x7d\x55\x36\xf5\xe9\x1e\x75\x0c\x3b\x94\x99" - "\x0c\x35\xd7\xb0\xa3\x7b\x77\xb3\x26\xd1\xd7\xd6\x64\xd8\xa1\x82" - "\xc7\x54\xc0\x31\xbb\xa9\x02\xf3\x0e\xe1\xe8\x49\x7c\x69\xca\xa0" - "\xfd\xa4\x6b\xcc\x76\x88\x3c\xae\x6c\x03\xb3\x3c\x9a\x4b\xe3\xe6" - "\xbf\x14\x5b\xc3\x99\x7a\x65\x6e\xab\xbd\x1b\xfe\xb9\xaf\x2b\xdc" - "\x74\x18\xd4\x36\x77\x3b\x4c\x8a\x83\x78\x5a\x83\xa9\xdb\xcd\xec" - "\xf8\xdd\x85\x9f\x6e\xd4\x93\xd1\x27\x61\x4d\xcb\xad\x71\x10\xf7" - "\x91\x11\x24\x7b\xb4\xe6\x84\xc2\x1e\x3d\xdd\xd2\xd1\xa8\xb0\x45" - "\x86\xd1\x83\x6d\xd1\x13\x3f\x11\xb6\x88\xb9\x85\xed\xf1\xd8\xa5" - "\xf4\xf0\x80\x74\xe9\xcc\xc8\xe3\x5f\x06\xa4\xbb\xa4\xf4\x3f\x07" - "\xa4\x3b\xa4\xf4\xab\x65\x5b\xd7\x4a\x74\x6c\x22\x5b\xb7\xf6\x3c" - "\xd9\xba\xd6\x4c\xc9\xd6\xf1\x33\x8e\x6b\x3f\x65\xaf\x9b\xc5\x3d" - "\xee\xb0\xf6\x37\x44\x3f\xfb\x1d\xc8\xb4\x47\x60\xda\x06\x4a\xab" - "\xfc\x04\x34\xf8\xe1\x76\x8e\x59\x56\x7e\x4c\x76\x8e\x6c\x1c\x9d" - "\x45\x79\xf5\x1a\xd6\xf6\xea\x6e\x76\xac\x66\x37\x3b\xd2\x6b\xc9" - "\xec\x90\xed\xdd\x2f\x30\xad\x02\xd3\x7e\x81\xf9\x64\xf7\x88\x27" - "\x2d\xfa\x46\x8a\xe3\xd8\x81\x7a\x9c\x1a\xa3\x82\xdc\x9d\xa8\xf3" - "\x14\xff\xa9\x04\xf9\x6b\x43\x9b\x44\x7b\x72\x79\x3c\x5c\x75\x12" - "\xda\xa8\x0e\xea\x6f\xd7\x6c\xf7\xd2\xba\xc4\x09\x28\x76\xb2\x93" - "\x74\x3e\x84\x68\x58\xb5\xf9\x01\x8a\xf3\xaa\x6a\x32\x00\xd0\xf9" - "\x7e\x3a\xbf\x82\x76\x57\x53\x89\x34\x1d\xca\x26\x59\xaf\xcd\xb6" - "\xc3\xbf\x65\x0b\x59\x1b\x78\xfc\xe8\x76\xc8\xdc\xcf\x2c\x68\x0b" - "\xb1\x6d\x31\x1e\x33\x50\xcc\x12\xec\xa3\xb4\xce\x6a\x78\x15\x3f" - "\x95\x72\xdc\x12\x8a\x01\x8e\x30\xb6\x36\x17\x10\xcd\x76\xc8\x74" - "\xb7\x14\x35\x52\xf9\x7a\xe2\x0d\xb3\x98\x64\x1c\x2a\x1e\xf7\x04" - "\xe7\xf0\x14\xf7\xc4\x0e\x6b\xc5\x99\xba\xc8\x8f\x93\x5a\x56\x38" - "\x80\xec\xbc\xad\x0b\x71\x14\xb5\x0b\x1c\x88\x8b\xa1\xdd\xf7\xcb" - "\x93\xf0\x47\x6f\x65\x5f\x21\xfe\x6c\x92\x17\xc5\xa9\xa2\x7d\x49" - "\xc8\x97\x28\x8a\x79\x20\xfc\xce\xcc\x73\x75\x9f\x00\x48\xb1\xb6" - "\x50\xdf\x32\x9d\x14\xcb\x8a\xe2\x6b\xf1\xd8\x5a\xea\x64\x60\x9b" - "\x12\xa3\x06\xe2\x6b\x7d\x0f\xb1\xb5\x90\xff\xf1\xb5\x6a\xb6\x1f" - "\xe9\x77\x52\x7c\x2d\xa4\x3f\x9d\xf4\x50\x6a\x93\xeb\xa5\x47\x38" - "\xcf\xa7\x53\xda\x2e\x0b\x6b\x96\xe5\x4f\xed\xa5\xb6\x60\x9e\x4e" - "\xf8\x83\xec\xa8\x1d\x1e\x77\x51\x3e\xa6\x45\x11\xfc\x24\xb4\x63" - "\xb6\x4c\x0f\xbc\xdb\xe9\x51\xef\x2a\x04\x8d\xb0\x69\x86\xe1\x54" - "\x5e\xd8\xb4\x27\x9a\x7d\x36\xed\x89\xdf\x0a\x9b\x26\x78\x2c\x6c" - "\xda\x13\xbf\x16\x36\xed\x89\xb7\xf8\xfe\x21\xb4\x69\x94\x47\x76" - "\x4d\xb6\x69\x7b\xaf\x61\xcd\x64\x3b\x7a\x2d\x4f\x54\xcb\xb6\x6d" - "\x07\xa6\x91\xed\x20\x1a\x85\x9d\x5a\xeb\x60\xff\x95\x08\x62\x7f" - "\x26\xfd\x36\x50\x1c\x8a\x2e\xe9\x37\x8d\x23\x11\xc2\xc6\x3d\xd1" - "\xed\xb3\x71\x4f\xe4\xfa\xca\x92\x8d\x33\xa8\x84\x8d\x13\xe9\x75" - "\x8f\x90\x8d\x5b\xeb\x20\x1e\x48\xf8\xd5\xf4\xde\x4c\x82\x47\x3e" - "\xae\x71\x29\x6d\x9c\x7f\xff\x32\xcc\x96\x6d\x1c\xd9\x36\x7c\x4e" - "\x47\x9b\xc6\xe3\xd1\x53\x3f\xab\x42\x9e\xcb\xfd\x8e\x64\x40\x6d" - "\xa6\x38\xd1\xc4\xb7\x7b\x4f\xc1\x50\x29\xa6\x8b\xd4\x6e\x43\xa5" - "\x7c\x2e\xd2\x0e\x4f\x54\x07\xfa\xcc\xf4\x62\x42\x71\x76\xeb\x7a" - "\x0f\xad\xed\x9a\xdb\xc1\x56\xcd\xcc\xad\xee\xe3\xe0\xdd\xfe\xd4" - "\x67\x24\x57\x9c\x5f\x0c\xa1\x6f\xb2\x3b\x38\x7e\xfe\x71\x95\x93" - "\xaf\xd7\x7f\xb6\x4b\x8d\x79\x46\xf8\xb9\x22\xef\x14\xd5\xa1\x28" - "\x37\xc1\x97\x97\x15\x41\x79\xb4\xc6\x88\x70\x8d\xa1\xd6\x14\x2e" - "\x9d\x8e\xac\x65\xa1\xe9\xc8\xda\x70\x01\x3a\x9e\xe7\x74\xa0\xbf" - "\x85\xf3\xa3\xe1\xa7\x21\x2b\x85\x9e\x79\x6c\xd1\xe0\xf5\xfc\x5e" - "\xca\x0f\x53\xe4\x2b\xeb\xfa\x2c\x48\x79\x45\x7d\x4f\xaa\x2e\x8c" - "\xff\xc9\xb1\x17\xc6\xff\xe4\xcc\x8b\xe0\x5f\x4d\xb6\x8f\xce\xde" - "\x79\x2c\xfe\x70\x13\xdd\xbc\xef\x35\x53\x8c\x25\x84\x2b\x93\xde" - "\xb7\x7c\x66\x1a\xcb\xe7\x7f\x3c\xde\xce\x4e\xcc\xe7\xf1\x3a\xd1" - "\x2e\xcf\xde\x0c\x20\xf6\xf4\x0d\x94\xf9\x6d\x20\x6d\xc3\xdc\x32" - "\x6d\x3c\xff\xd3\x40\xda\x30\x7f\x82\x22\xdf\xe3\x93\xf9\x93\xc6" - "\x0b\xac\x23\x45\xd9\x50\x3b\xe9\x8e\x85\x43\x38\x6d\xa1\xb3\x3e" - "\x55\x03\xef\x46\x9e\x42\xfd\x37\xf0\x77\x3b\xd2\xd9\x5e\xda\x2b" - "\x73\x7d\xab\x93\x62\x92\x39\xe5\xb3\x20\xd7\xe2\x38\x32\x82\xe2" - "\xaf\xd0\x7a\xfa\x2a\x4f\x9a\x5a\xc4\x4a\x7e\xaa\x52\x2e\x1b\x6a" - "\xed\x91\xea\x95\xea\xe4\xe7\xa4\xb0\x4c\x93\x5c\x86\x70\xd3\xd9" - "\x20\xb4\xff\xd7\xf3\x38\x65\xee\x6e\xb2\xb7\xd7\xa2\x7f\x3c\x42" - "\xd4\x93\x01\x52\x3d\xd8\xb7\xb3\x92\x2e\x50\xcf\x05\xda\x97\x9d" - "\x7c\xf9\xed\x03\xa9\x7d\xd9\xb9\x17\x69\xdf\x85\xea\x7d\xe7\xf2" - "\xeb\x8d\x95\xeb\xed\xba\x7c\xbe\x3e\x3d\xea\xd2\xf9\x9a\x24\xf1" - "\xf5\xe9\xb4\x8b\xf0\x35\x58\x3d\x25\x97\x5e\x8f\x4e\xae\xa7\x31" - "\x58\x3d\xc0\xff\x42\xc6\xe9\xd1\xca\x77\x17\xd0\xbd\x21\x22\x56" - "\x79\x0e\x28\xef\x56\x11\xf7\x89\xe4\xc4\xc9\x77\xab\xf8\xce\x99" - "\xe5\x4c\x5e\x55\x4f\x7e\x08\xf3\xda\x21\x27\x99\xd6\x02\x67\x6f" - "\x55\xde\x41\x92\x93\x7a\x91\x3b\x5d\x28\x36\x4e\x0a\xd5\xcd\x18" - "\x8f\xc1\xe2\x14\xf1\xf2\x72\xca\x28\x4e\x83\xd8\x53\x94\xd3\x28" - "\xfa\x66\x4e\x95\x1d\x9e\xe6\x71\x16\x29\x06\x73\x8f\x49\x82\xbf" - "\x8e\xc6\xd0\x01\x98\x46\x19\x26\xe8\x9a\x64\x79\x27\xec\x2b\x4e" - "\xf2\x3b\x63\x38\x27\x2f\x6f\x5d\xde\x5d\xba\xfc\xa7\x1f\x9b\x90" - "\x5f\xb0\xba\x60\x43\x3e\x3f\x8c\x1e\x09\x98\xa0\x2b\xc8\x7a\x7a" - "\xed\xba\x0d\x05\x89\x9b\x56\x67\x89\xc3\xeb\x37\x23\xa0\x12\x08" - "\xfc\x62\xfb\xc7\xa3\x0d\x3a\xca\xd4\x3c\x76\x44\x37\x8f\x81\x49" - "\xf1\xdf\xa5\xb3\xb9\x4d\xf1\x00\x4e\x9c\x1f\xf5\x5a\xd6\xad\xb0" - "\xc3\xa2\x06\x99\x8f\x14\xa7\x10\xfd\xa4\xf8\x93\xb0\x6e\x33\xc9" - "\x7e\x21\xba\xbc\x75\x22\x1e\x04\x3f\xff\x6f\x2b\xc0\x84\x56\xd0" - "\x5a\x37\xd2\x3a\xef\x3a\xd4\x81\x1c\x3b\x8f\xbb\x58\x48\xf3\xef" - "\xdc\xab\x65\xbf\x84\xde\x5b\x89\xf7\xcc\xd7\xdf\xd3\x0e\xeb\xe6" - "\x50\xbd\xd4\x6f\x6a\xd1\xff\x25\x5c\xcc\x92\xe3\x22\x1f\x18\x9f" - "\xb5\x48\x83\x5d\xf6\x7d\x91\xde\x28\x16\x71\x02\x7d\x86\xdc\xb8" - "\x3f\xc4\x3a\x40\x3a\xcf\xad\xad\x15\x67\xb7\x71\x3e\x95\x1b\x35" - "\x00\x6b\x41\xd8\xb2\x13\x14\x7b\x33\xe8\xbb\x72\x16\xf9\xb9\xdd" - "\xdb\xaf\x0f\x57\xb6\x19\xe7\xec\x28\x9f\xdc\xf7\xb1\xed\x71\x24" - "\x6b\x29\x8e\xc8\x10\x4c\xfb\x15\xdd\x7f\xc0\xca\x3f\xb7\x63\xda" - "\x10\xfc\x76\x91\x4c\x29\xce\x01\xe6\xd1\x5e\x1f\x55\x6b\xd1\x19" - "\xeb\xa1\xf8\x76\xd4\xeb\x5c\xb4\x7f\x7a\x41\x03\xd6\xc1\xb0\x0e" - "\x9b\xb9\x0f\x9a\x74\xcc\x4a\x6b\x80\x48\xfb\xf1\x26\x9d\x13\x58" - "\xd8\xf2\xcf\xa8\x1c\xf6\x8b\x78\x93\x91\x7c\x1f\x4c\xe7\xe7\xff" - "\x72\x8f\xca\x3c\x2f\xd0\xb1\x53\x04\x13\x6a\xdd\x9a\xc6\xe0\x5d" - "\x7c\x2c\x39\x0b\xb4\xc7\xab\x03\x72\x9d\x81\xf6\xfe\xc6\xcc\xbb" - "\x74\x99\xab\x0b\x74\xd9\x59\x39\x6b\x75\x99\x59\x99\xba\x9c\x75" - "\x05\xba\x27\xd6\xd1\x02\x12\x2d\x19\xf9\xe9\x84\x97\xda\xb7\x49" - "\x1f\x2e\xbf\x23\xef\xd9\x64\x18\x82\xed\x47\x9e\xe4\xcd\xef\xe9" - "\x35\x0c\xf5\xe7\x49\xde\x64\xa1\xc7\xeb\x71\xfe\x97\x9b\x20\xce" - "\x17\x86\x75\xe1\x33\xb6\x3f\xb7\xcb\xbf\xef\xe5\x6d\x95\x60\xdf" - "\x91\x61\xb9\x5e\x8c\x3b\x39\x90\xb7\x4b\xd2\xc7\x3a\x71\x16\x99" - "\xc7\xab\xa9\xe3\x67\x04\xd6\xdb\x43\x96\xa1\x18\x5d\x85\xb0\xe6" - "\x34\xac\x3f\xcc\x2c\xeb\xe3\x24\x1d\xd2\x7a\x4b\x3f\x77\x48\xfa" - "\x83\x3a\x91\xa7\x1b\xac\x3f\x79\x45\xa4\x3f\xac\x57\xaf\xe5\xfb" - "\x49\xdc\x2e\xb4\x53\xf8\x8c\xe3\xa9\x1d\xd6\x97\x50\x3b\x9c\x9b" - "\xf4\x5a\xd3\x1e\x3e\x5e\x7f\x49\xef\x66\x0f\xb9\x78\x8c\xa5\x08" - "\xd4\x0d\x94\x51\x5e\x81\x2c\x23\x19\x3e\x78\x1f\xe6\xfa\xe2\xaf" - "\x63\x82\x9f\x2d\x5c\xc7\xd0\x2f\x40\x9a\xd4\xb2\x5f\x40\x63\x00" - "\xd2\xd6\x51\xb0\x95\x31\xac\xa3\x4d\xa1\x07\xa7\x83\xe9\x01\xca" - "\x76\x4d\xf6\xba\x35\x4f\x61\x47\xcf\x5b\x5b\xb0\xc6\x40\xf1\x2b" - "\xc8\x0e\xf0\xe0\x18\x37\x66\xea\x36\xe4\xaf\x5d\x13\x09\xc1\xa0" - "\x06\x32\x95\xf2\x8f\xf5\xa2\xbe\xf6\xf4\xe8\xc3\xe9\x0c\x87\x38" - "\xb3\x51\xb0\xb7\x27\x1f\xe7\x3d\x7e\x72\x2f\x78\xde\x16\x9f\x84" - "\x7e\x62\x12\x70\x9f\x1f\x79\x26\xf6\x21\x14\xfc\x99\xf8\xd0\xa3" - "\x56\xe1\x78\x90\x5f\x25\xeb\x00\xfe\xae\xc7\x36\x95\xfa\xf6\x80" - "\x14\x1c\xeb\x51\x87\x1f\x27\xfb\x23\xf6\x9b\x9c\x44\x3b\x10\x53" - "\xd7\x0e\xf9\x64\xfb\xe9\xae\x0e\x2a\x7f\x4c\x2e\xb3\x73\xe0\x1c" - "\x75\xc1\x74\x59\x4f\x14\x65\xde\xa7\x34\x31\x7f\xce\xe3\x32\x67" - "\x42\xf6\x1a\x19\x0e\xf9\xca\xea\xb8\x1d\x29\x48\x0c\xb4\x0d\x7f" - "\x88\xa5\x77\xee\x82\x1e\xae\x7f\xda\xcf\x45\x6c\x14\xf4\xf1\xda" - "\xa1\x60\xaa\xb4\xff\xe5\x28\x1f\xd3\x8d\x88\xcb\x25\x70\x31\x4b" - "\xfe\x35\x72\x5d\x2c\xe2\xf3\xe6\x3a\xae\x67\x05\xa5\xbe\x35\xc9" - "\x82\x64\x9a\x9b\xb3\x1e\xfd\x10\x3b\xe4\x17\x70\xdd\xc2\xdf\x05" - "\x3f\x11\xb1\xd7\x48\xdf\xa8\x9d\xa4\x57\x3e\x9d\x2a\x68\x96\xe5" - "\x4d\x6d\xc6\x72\x45\x3a\x1e\x6f\xb7\xc0\x2e\xf3\x32\x54\x3c\x19" - "\xde\x6f\xb5\x48\x4b\xaf\xe8\xbb\x7c\x5e\x29\xe2\x02\xd1\x39\x9a" - "\x30\xa4\xd1\xd1\x09\x1b\xbe\xa2\xb3\x01\x31\x2e\x9a\xa7\x7d\xee" - "\xa0\xf8\x08\x22\xbe\xd0\x86\x14\xd4\xe1\x64\xe9\x7c\x30\x3d\xe3" - "\xf8\x9f\x9f\x2c\x64\xb7\x61\x85\xa2\xef\x39\xa4\xfd\x06\x43\x89" - "\x47\x64\xcf\x6c\xc6\x39\xbc\xbf\x8a\x73\xc5\x1b\x4a\xe5\x72\x3c" - "\x96\x80\x5b\x8c\x89\xa7\x61\x43\x03\x8d\x11\x44\x9f\x1d\x36\x24" - "\x52\xfd\xd4\x3e\x1a\x73\xb9\xde\xc4\xd3\x9d\x04\x1b\x9a\x02\x68" - "\x38\x26\xe3\x92\x70\x77\xc8\xcf\x14\x2f\xcc\x0e\x9b\x72\x9b\x46" - "\x61\x9f\x72\xf2\x36\x5c\xd5\x54\x80\x7d\xcb\x49\x70\x1b\xa3\x64" - "\x1e\x62\xba\x19\x9f\xd1\xff\x59\xa7\x13\xef\x9c\x4e\x48\xb6\x68" - "\x53\x36\xc5\xa2\x32\xe9\x28\x9e\xe0\x74\x61\x6f\x78\xbc\x1c\x9e" - "\x77\xb3\xd4\x67\x23\xe8\x0c\x12\xdf\x77\xe3\x74\x73\xdb\x20\xe2" - "\x2b\x60\x3e\xf6\x91\x5e\x71\xef\x49\x84\xa0\x6d\xa3\x79\xa0\x0e" - "\xd4\x89\x26\xfe\x8e\x73\x63\xae\x88\x57\x32\xf4\x28\xe6\xd7\xcb" - "\xf2\xa3\x18\xd0\xd4\x6e\x2c\xa7\x6d\xe2\x31\xbe\x36\x1e\x94\xe9" - "\x95\xf2\xd4\x5c\x1f\x38\x0f\x36\x0e\xf4\xff\x9e\x11\x1c\xb6\x4b" - "\xae\x87\xc3\x22\x1c\xc1\xd3\x5d\x75\xbd\x96\x4d\x9a\x01\x3c\x22" - "\x4e\x8a\x96\xea\x69\xaa\xe7\x79\x3a\x9f\xad\xda\xc0\xdf\x19\xf1" - "\x7d\x71\xd8\x0e\xc7\x16\x9c\x67\x93\x0c\x74\x10\x86\x65\x34\x84" - "\x4f\xe8\xe2\xa6\x74\xb9\x4c\x98\x8a\xf8\xb8\x29\x53\xae\x5b\xc6" - "\x41\xf4\x5f\xd0\xe6\x89\xb6\x68\xa8\x8f\x10\x2c\xe1\xe5\x3a\xc1" - "\xef\xba\xd9\x74\x8a\xeb\x20\x6f\xe7\x26\xab\x52\xd6\xc2\x17\xdb" - "\x74\x4c\xa1\x0f\x44\xcf\x80\xfc\xed\x60\x8c\x13\x63\xc9\x26\x97" - "\x82\xc6\x94\x5e\x8b\x51\x3b\x20\x87\x72\x2e\x23\xba\xb7\x22\xe8" - "\x3d\x62\xbc\xaf\x20\x8c\x97\x71\x3a\x49\x1e\x38\x17\x9b\x06\x4d" - "\xd5\x14\xb7\xe9\x73\x07\xf2\x04\x69\x34\xee\x20\xbd\x42\xbc\x19" - "\xfe\xba\x69\xcc\x55\xd0\xab\x22\xbb\x8e\x69\x25\x32\x0c\xd2\xc7" - "\xf7\xb2\xc8\xfc\xc4\xbc\xfa\x01\x39\x4e\xe1\xb0\xfb\x65\x3a\x2f" - "\x32\x66\x48\xbc\x32\x7e\x29\xd5\xd1\x25\xd7\x81\xbf\xd1\x3e\x6c" - "\x1a\xe4\xab\x3e\xb6\xb9\x60\xad\x08\x60\x44\x83\xfc\xea\x35\x4f" - "\xad\xcd\x1c\xaf\x5b\xfd\x38\x85\x3a\xca\xcf\x5e\xbb\x36\x97\xbf" - "\x24\xf2\xf7\x03\xe3\x78\x7d\xc8\x07\xe1\xcb\x16\xae\x7f\x51\xec" - "\x8f\xa1\x7e\x41\xfd\x9d\xce\x15\x0c\x3d\x54\x74\x96\xcf\x4d\x6c" - "\xe6\x29\x60\x73\x31\x33\xf9\xef\xdc\xf6\x51\xfb\xe3\x9d\x62\x1c" - "\x40\x79\xd2\x18\xd9\x6b\xd9\x5c\xe9\xcf\xaf\xcd\xf5\xfe\x7d\x79" - "\xf3\xfe\xe0\x76\x62\xf3\x43\xdc\x4e\x94\x0a\xbd\x20\xfb\x44\x67" - "\x0b\x08\x2f\x96\xe9\x08\xc0\xe9\xf4\xd9\xa8\x42\x90\x6d\x94\x18" - "\x27\x0a\x13\x70\x0c\xaa\x14\x75\x15\x8e\xf2\xe9\x4d\x61\x8d\xd0" - "\x9b\xc2\x24\x3b\x54\x64\xcb\x73\x15\x31\x76\x6c\xe6\xfe\x23\xd9" - "\x74\xcc\x4f\x93\xf1\x55\x8d\xa0\x71\xa3\x30\x63\xb0\xff\x50\x18" - "\x45\xfe\x03\xed\x7b\x24\x5e\x20\xad\x5a\xd1\x6f\x0a\x2b\x14\xf6" - "\x27\x16\x9f\x6b\x82\xc9\xfa\x31\x1a\x8e\x27\xd0\xeb\xbc\x09\x6b" - "\x72\x0a\x66\x50\x18\xaa\xb5\xc6\xdc\xb5\x6b\x0a\xd6\x66\x06\xbe" - "\xc7\x4b\x94\x7d\x31\x39\x2e\xbd\x23\x82\xf8\x51\x88\xed\xdf\x3a" - "\x4a\x6e\x03\xb7\x53\xe8\x3b\x4a\x36\x2e\xaa\x13\x8a\xbe\xac\xe3" - "\xfb\x00\xb7\x8c\x92\xf5\x84\xe0\xee\x35\x32\x2f\xa6\x61\xfb\x37" - "\xcb\x77\xb4\x21\xae\x2d\x29\xf2\xb3\xaf\xfc\x96\x67\xf8\xd8\xb7" - "\x9b\xef\x19\x44\x9e\x16\x69\x14\xfe\x16\x3e\x6f\x39\x2e\x3d\xf3" - "\x58\x4b\x14\x17\xac\x1b\xb6\xec\x11\xfc\xdd\x82\xf2\x37\x4a\xb6" - "\xa2\x48\xec\xbb\xd9\x0d\xf0\x46\xb1\x23\xbc\x8e\xbf\x4f\xd8\xb2" - "\x5f\xae\x0f\xcb\x1f\x57\xd6\x49\xe3\x56\x20\x3e\x3b\x6c\x29\xa1" - "\xef\xed\x3c\xf6\xdb\x96\xee\x20\xb4\xe6\x2a\xe1\x7a\x2d\x45\xb1" - "\x58\xff\x41\xb9\xcd\x8b\x8d\x3c\x2d\xe1\x02\x6d\xec\x96\xda\x58" - "\x4f\xba\x45\xf5\x93\xfe\x4b\x34\x94\x48\x71\x4f\xec\x74\x57\x18" - "\xd1\xcf\x63\xa0\xc5\x53\xbf\x2e\x32\xe2\x38\xdf\x2d\xb7\x83\xda" - "\x78\xa0\xd8\xa1\x91\x63\x4f\x89\xf2\x45\x8f\x06\xd0\xf6\x8e\xa2" - "\x4c\x97\x75\x1c\xbd\x2b\x28\x9a\xc3\x2c\x85\x0d\xa4\x87\x14\x93" - "\xaa\x6a\x40\x0f\x8b\xda\x06\xeb\x5d\xd1\x6c\xd2\x3b\xa5\x2e\x65" - "\x4d\x59\x83\x9a\x94\xbf\xb6\xe0\x2e\xee\xdd\xa3\x63\x47\xa1\xcd" - "\x56\x17\x64\xad\xcb\xc9\x1f\xaf\xcb\xcf\x5c\x2d\x75\x7a\xbf\x3e" - "\x6f\xe1\x73\x77\xa7\xdc\xcf\x7a\x2d\x5b\x67\xfb\x6c\xcb\x56\x9f" - "\xfe\xd3\x1e\x30\x7e\xa7\xe8\xd6\x3d\xa2\x3f\x6d\xcd\x56\xf4\x5d" - "\x5e\x9e\xfa\x68\x1d\xf7\xd9\xb6\x2a\xc7\x7f\x9a\x1b\x47\x9c\x86" - "\xad\x53\x25\x9e\x3a\x05\x8f\xb7\x7e\xc6\xdb\xc9\x63\x6e\x15\x39" - "\xa9\x9d\x3c\xbe\x0c\xf7\xcf\xb6\x36\xcb\xed\xf5\xcd\x1b\xb6\xda" - "\xb9\x1f\x25\xf9\x6b\x17\x9a\x97\xfb\xfc\xd3\xe2\x22\x69\xcd\xad" - "\x4d\x9e\xe3\xc9\xfe\x35\xd2\x92\x29\x7c\xd5\xe2\xa9\x0b\x8b\x58" - "\xff\x2a\x23\xc5\xa2\x23\x19\x14\xaf\x96\x7d\x4b\xbe\x3f\xb0\xec" - "\x73\x1c\xb7\x8b\xf5\x4a\x3b\xc1\xc2\x9e\x6a\x93\x7c\x44\x69\x8f" - "\xf4\x55\xff\xde\x8e\x75\x21\x6d\xda\x0b\xd0\x86\xed\x2a\x46\xfb" - "\xb7\x93\xc7\xd7\x24\xff\x9a\xf5\xc4\x4b\xf7\xae\x99\x78\x4c\xf6" - "\x5a\xc4\xed\x40\xd9\x22\x1c\xfa\x7f\x5b\xb9\x6e\x78\x51\x47\x69" - "\x6f\x90\x53\xf6\x91\xa0\xf8\x1c\x8d\x45\xf8\x1b\xf5\xd6\x24\x9d" - "\x49\x34\xa5\x3a\xf2\x13\xa1\xa7\x27\x5e\xdd\x93\xaf\xd7\xd0\x7a" - "\x01\xf1\xc2\x56\xe3\x02\xa1\x3f\xa6\x78\xb4\x53\xcd\x4a\x7c\x12" - "\x2e\xe2\xa9\x86\xe8\x60\xf9\xf1\x6a\xd2\x6f\x7e\x8f\x57\x4f\x22" - "\xda\xd1\x62\x3b\xcb\x4f\x54\x87\x88\xaf\x75\xa1\x76\x46\xd1\xbd" - "\x66\x74\x47\x1d\xd9\x2b\x11\x67\xdf\xfc\xe6\x8b\x62\x6d\x40\xaa" - "\xd7\xf4\x16\x53\xbf\xc6\xc7\x95\x9d\x7c\x5c\x61\x20\xee\x60\x30" - "\x35\xf3\x7d\xba\xb9\xaf\xf1\xfb\x05\xa5\xf3\xdf\x8e\xa6\x5c\x37" - "\xbf\x9b\xcc\x54\x40\x7e\x9a\x9b\xde\x53\xf1\xf3\xcd\x87\x0a\xdc" - "\xb0\xd8\x45\x3a\x69\x72\x51\xdc\x76\x27\xf7\x17\xcc\x1a\x39\x56" - "\x3b\xdd\x95\x46\xf7\xef\x61\xbb\xc2\x48\xee\x3a\x13\xc5\xd8\x37" - "\xd3\xfd\x6a\x20\xe6\xe3\xf1\xb0\x13\x7d\x7a\x21\x03\xf3\x7c\xba" - "\xcf\x50\xcc\x15\xda\x51\x2e\x61\x5f\x20\xec\x5a\xf1\xae\x5a\xb6" - "\x13\xe6\x4f\x69\xef\xbb\x5d\xc2\x81\x75\xe1\xf8\x5f\x5c\x2a\xea" - "\x42\x7c\xbd\xb2\x3c\xcd\xf3\x07\xaf\x6f\xf8\xf0\x61\xf9\x79\x92" - "\x5f\x00\x62\xed\xea\x0f\x84\xeb\xa0\xbc\x76\xe5\xf3\x7d\xcc\x47" - "\xe5\xb5\x2b\x11\x33\xda\x54\x45\xf5\x87\x5a\x23\x62\xa6\x65\xa4" - "\xf7\x5a\xf2\xe1\x42\xfa\x13\x38\xbe\x13\xed\xb2\x5f\x28\xe4\xb3" - "\x2d\x8b\xfc\xc3\xa6\x22\x31\xaf\xed\x11\x77\xb1\xa1\x0f\xb0\xad" - "\x40\x8c\x65\xdb\xf4\xf2\x58\x86\x65\x0f\x48\xb6\x42\x1a\xe7\xb6" - "\x0d\xcc\x7f\x83\xef\xfb\xdf\x56\x25\xf3\x48\xe6\xb9\xe0\xd1\xb6" - "\x53\x3d\x91\x7f\xc9\xf6\xf1\x76\x1b\x7f\x77\xe1\xcb\xb7\xdc\xa8" - "\xe0\x3d\x3d\x27\x08\xbb\xb9\x0d\xc7\x7f\x53\xba\x18\x53\x44\x1a" - "\x8b\x3c\xd1\x43\x77\x27\x0a\x1e\x64\xf1\xb5\x19\x87\x29\x11\x69" - "\xb3\xc4\xda\x55\xaa\x7d\xc2\x96\x59\x70\xfc\xdb\x16\x25\xca\x6d" - "\x6b\x24\x5a\x94\xf4\x2e\xc9\x79\x2a\x67\xdd\xa6\x1c\x5a\x50\xdb" - "\x90\xaf\x5b\xb3\x2e\x73\x6d\x64\x90\xf5\x90\x78\xba\x2f\xd5\x59" - "\x35\x10\xd7\xea\x99\x44\xda\xa7\x2f\xee\x0f\x78\xe6\x66\xdd\x4d" - "\xa4\x5f\x96\x1d\xb4\x56\xc0\xef\x70\xa0\xd8\xa8\x62\xdd\xa0\x8b" - "\xca\x0b\x5e\x3f\x73\x75\xcf\x26\x83\xe4\x63\x95\xfc\x91\xf8\x28" - "\xcd\x39\x58\x27\x6c\x8f\x90\xc7\x21\xa2\x8f\xfb\xe6\xfd\x89\xdc" - "\x2e\x7a\xfb\x0d\x1a\xce\xaf\xfe\x44\x1c\x6f\x2c\x5d\x76\xf4\xc5" - "\xa5\x76\x39\x65\x7e\x50\xfb\xd1\xd7\xd5\xf6\xb2\x2c\xd4\xd1\x67" - "\x12\x25\x5c\xc4\x3f\xc4\x6d\x39\x28\xef\x13\xa7\x78\xa1\xd6\x8d" - "\x14\xff\x77\xfb\x39\x6f\x19\xd9\x9b\xed\xd3\x64\xbb\x44\x63\x91" - "\x17\xf1\xbc\xfb\xb5\x23\x1c\xfb\x0d\xc5\x1d\xba\xa6\x1d\x4a\x4a" - "\xc4\x7d\x00\xdb\x33\xfd\xef\x03\x28\x49\xc1\x4f\x89\xf4\xd9\xa7" - "\xf8\x7d\xa1\x8f\x5c\x26\xd7\x97\xb6\xdd\x1a\x00\xb3\x0f\x69\x3a" - "\x32\xe0\xaf\x88\x98\xa5\x52\xdc\x62\xba\xc3\xa2\x24\x82\xe2\x82" - "\xfa\x74\x63\xfb\x04\xc9\x07\xe9\x22\xde\xd1\x78\x8b\x30\x7c\x2f" - "\x37\x2b\x47\xdd\x60\x7a\xa0\x36\xb1\xde\x2c\xe4\x4f\x49\x82\x4f" - "\x0f\x04\x8f\x30\x6d\x9a\xcf\x4f\x29\x89\xa2\x32\x4a\x3e\x60\x1d" - "\x33\xc5\xdc\xb4\x24\x43\x1e\xb3\x29\x26\xaa\xb8\x0b\x62\xfb\x91" - "\x03\xc5\x5d\x38\xe7\x2f\x29\xf2\xe1\xd8\x7e\x44\x5a\x8b\xd0\x30" - "\xb5\x25\xa9\x8e\xcf\xd9\x4a\x6a\x7c\x6b\x02\xdb\x8f\x90\xdd\xe5" - "\x38\x22\x3b\xc1\xe6\xe4\xf7\x93\xaa\xe4\xbb\x87\x11\xb6\x59\xf6" - "\x51\x64\x5c\x4d\x62\xcd\x89\xc7\xb1\xc4\x3e\x58\x89\x30\xdd\x03" - "\xeb\xb1\x74\xff\x90\x3c\x07\x34\x62\x3f\xe6\xbe\xf7\x33\x51\xbe" - "\xb9\x9e\xe5\x1d\x6e\x6f\x2c\x03\x78\x70\x7e\xf4\x0c\x04\xce\xdb" - "\xd0\x7f\xd0\x65\xe5\x64\xa1\xfb\xf0\x44\xee\xba\x19\x38\x75\x78" - "\x22\x37\x6b\x06\x6d\x29\x9b\x3f\x7b\x2e\xff\xc6\xce\x31\x23\xc8" - "\xfa\xf1\xc0\x1d\xa4\xb4\x66\x84\xf3\x5c\x5a\x3b\xed\x15\x77\x14" - "\x0e\x95\xbe\xb5\xd2\xf7\x10\x1c\xf7\x5c\xd8\x07\x7e\x45\x77\xd0" - "\x20\x0d\x56\xe9\x5e\x48\x79\xcc\x46\x5b\xfe\xcc\x9b\xf2\x7b\x32" - "\xbe\xc7\x9e\x62\x15\xd2\x1d\xa3\xdb\x9f\xfa\x0c\xdb\x34\xb0\xfe" - "\x21\xd6\x17\xc5\x7b\x2f\x4c\x77\xc9\xe9\xf2\x7a\x6c\xaf\xe5\xd9" - "\x28\x79\xed\x55\xc0\x3e\x3b\xca\x57\xd6\x6f\x6d\x3b\x4e\x7e\xbf" - "\x86\x30\x29\x32\xcf\x64\x3c\x26\x1d\x3b\x2d\xf9\x49\x61\xdc\xaf" - "\xb6\x3c\x93\xcc\xe3\x83\x92\x2f\xce\xd7\x99\x9f\x2d\x90\xeb\xa1" - "\x39\x02\xd1\x2d\xbd\xbb\xe1\xfd\x9e\xe2\x80\x8a\x38\xa2\xcf\x0e" - "\xc8\xff\x52\xee\x05\xeb\xdf\xc8\x9a\xdc\x5f\xb3\xc6\x9d\x9f\x60" - "\x9f\x7d\x1c\xc0\xbd\x91\xed\xef\xff\x9a\x1d\x20\x5e\xef\x7c\x0c" - "\x60\xc7\x7f\x03\x78\xc2\x96\x7f\xd9\x87\x7c\x5f\x70\xce\x7b\x9a" - "\xee\xc2\xab\x43\xb8\x05\xce\x33\xac\x16\xcb\x2c\xc8\x65\xa7\x6b" - "\x11\x6e\xfe\xa9\xd3\x6c\x2f\xc2\xce\x37\x60\xbb\x37\x32\xb7\x27" - "\xec\xa9\x2f\x75\x0f\x93\x1d\x7a\x2e\xc9\x51\x66\x9f\xcd\x2c\xea" - "\x5d\x6c\xfb\xad\xb7\xf4\x5a\x9e\x9b\x3e\x70\xa7\x15\xe2\x25\x1e" - "\x2d\x34\xd2\xef\xa7\xbe\xc4\x36\x7d\xb9\x0a\xc7\x50\x94\xc1\x97" - "\x08\x87\xf3\xff\x1c\x6e\x6f\x1c\x61\xb7\x8c\xc0\x4f\x62\x30\xbb" - "\x8f\xb4\x36\x79\x36\xb2\xc6\x5d\x2b\x91\xfe\x93\x48\xff\xd7\x6c" - "\x3f\xb6\xe1\xc0\xce\x4e\x00\xa2\xdf\x43\x38\x3d\x10\xb6\x6a\xb3" - "\x6a\x78\x1d\xe6\xaf\x32\xc6\x42\x1d\xc2\xae\x74\xc2\xf0\x5a\x84" - "\x59\xb9\x7e\x38\x70\xfa\xbb\x91\xee\x08\xfb\x6c\x0f\xd6\x4d\xf4" - "\x63\xfd\x1d\x32\x9d\x72\xfd\x44\xaf\xac\x83\xab\x68\xbd\x2b\xf2" - "\x2f\xff\x3f\x7b\xef\x03\x1f\x55\x71\xee\x8d\xcf\x6e\x02\x6c\xc2" - "\x26\x1b\x30\xe2\x8a\x41\x57\x89\xed\x6a\x11\xa2\xd2\x7b\x73\xbd" - "\x28\xa9\xe0\x7b\xd3\x5e\x34\xd4\xab\xf7\x4d\x6f\xd1\x84\x0a\x36" - "\x58\x84\x35\x84\xb0\x60\x48\xc2\x42\x73\x43\xcc\xbf\x2a\xda\x00" - "\x21\xa4\x2d\xda\xd0\xf2\x27\xf6\x62\x6f\x6c\xa9\xae\x25\x6a\x94" - "\x24\x1b\x2d\xb6\x31\xd2\xba\xc4\x10\x02\x2e\xb0\x92\x25\xbb\x24" - "\xbb\x67\x7e\xcf\x77\xe6\x9c\xec\x86\x26\xd4\xd8\xde\xdf\xbd\xef" - "\xe7\x7d\xf3\xf9\x6c\xce\x99\x39\x73\xe6\xcc\x3c\x33\xf3\xcc\xf3" - "\x3c\xf3\xfc\xd9\x87\x76\x4b\x19\x7e\xe9\x0c\xef\x9a\x1c\xe6\x8d" - "\xfa\xca\xad\x6e\x56\x9a\x8a\x35\x84\xfe\x78\x69\x4e\xa9\x76\x6f" - "\xa7\x35\x18\x48\x7e\xb2\x74\xa1\xd6\xbf\xc8\x7e\x2d\x5e\x9d\x2b" - "\xe4\xa8\x4b\x1f\xcb\x5b\x91\xbf\x94\xb8\xb3\x58\x66\x43\x96\xe0" - "\xdf\x96\x2f\xb3\xac\x5e\x65\x79\x7c\xe9\x8a\x95\xab\xf3\x97\xe7" - "\xce\x12\x2c\xf7\x9a\xe5\xab\x96\x41\xbc\x9a\xbb\x34\xd7\x16\x7b" - "\x19\xcd\x5d\xea\x5e\x08\x7d\x44\xe0\xb2\x5e\xf6\xcc\x0c\x55\xb6" - "\x18\xe0\x8e\x34\xc1\xbb\xc9\x75\x50\x7a\xda\xb2\x21\x0d\xcf\xa7" - "\xc8\xbd\xe6\x99\x24\xd1\xaf\xfe\x74\xed\x3d\xa1\xbb\x2b\x68\x54" - "\xe4\x0f\xa5\xb3\xb0\x0e\xf9\x33\x33\xb8\x9e\xfa\x44\x7d\x96\x74" - "\x6a\x0f\x53\x6d\xf9\xde\xee\x66\x65\x21\xea\x27\xce\x0a\x3a\x04" - "\x1d\x28\x6c\x8e\xca\xce\xf2\xad\x3d\x34\xb7\x27\x1a\x01\x87\x4a" - "\xc9\x47\xea\x4d\xba\x62\x1d\x68\xa1\xdd\x7a\x25\x05\x67\x82\xbb" - "\x1d\x4a\x4a\x58\x87\xa7\x74\x31\x68\x5a\x21\x5b\x17\xeb\x60\x6b" - "\x81\x36\xbf\xf5\xb0\x29\xd9\x3c\xfd\x2e\x89\x9b\xb7\x6e\x42\x79" - "\x1a\xa7\xbb\x64\xfb\x45\xdc\x56\xda\x8f\xca\xb6\x2a\xf1\x33\x9d" - "\xa1\x35\x66\x35\x76\xf1\x87\xcd\x4a\xd9\x87\x87\x42\xb4\x6f\x2b" - "\x44\x8b\xf2\xca\xe4\x05\xa1\xb2\x0f\x0f\x28\xeb\xac\x7a\xe0\xef" - "\x22\x3b\xc1\x67\x75\x4e\x2c\x3f\x9f\x33\x39\x84\x78\x7b\x65\x1f" - "\xfe\x92\x73\x7a\x37\xf6\xc3\xb7\xb0\x47\x52\xba\x49\x4d\xb7\x20" - "\xad\x10\x2d\x46\x79\xed\x94\xee\x10\xb1\xfd\xb4\xf2\x23\xcb\xbe" - "\x8f\xb4\x49\x27\x74\x04\x53\x88\xf6\x9d\x87\xbe\x6a\x7d\x14\x3c" - "\x00\xe4\x10\xc3\x7d\x29\xdb\xa2\xe5\x83\x36\x95\x74\x22\x7b\x8c" - "\x60\x5a\x23\x71\xd6\x70\xb9\x47\xb4\x3e\x0b\x58\x96\x7d\x48\xbc" - "\x1e\x8d\x1f\xe2\x31\x6f\xbe\xee\x56\xae\x2f\x7d\x0c\x7b\x43\x46" - "\x48\x9c\x55\x31\x79\xb6\x51\x76\x58\x83\x1f\x74\xe1\xb1\x3f\xd0" - "\x38\x59\xb3\xbc\x2c\x56\xae\xcf\xb2\xe3\x11\x3c\x88\x87\x8b\xf9" - "\x5c\x26\xec\x4c\xb8\xde\xb0\x59\xa6\xb7\xce\x93\xfb\xd9\x33\x06" - "\xad\x2c\xe5\x09\x1d\x20\x9c\x59\xd1\xfc\xf7\xd4\x5d\x66\x9f\x39" - "\x16\xfe\xa1\xf6\xaa\xfe\xce\x9f\x79\x48\xa3\x0d\xe8\x3e\x7b\xa4" - "\x0d\xe7\x33\xe9\x97\x9f\x31\x7d\x67\xf5\xea\xbc\xac\xdc\xe5\xb8" - "\x58\x6f\x5e\x7b\xcb\xe5\x7b\x85\x51\xc6\x91\x79\xc6\x8e\x7e\x03" - "\x7f\x4a\x5b\x88\x67\x9a\x22\xf8\x3d\xc8\x9c\xe6\x03\xef\xe3\xac" - "\x98\x9e\x1d\x7b\xa3\x60\xa3\xa0\x37\x4e\x18\x98\x7e\x2c\x1d\x06" - "\xe1\x57\x3b\xce\xe8\x14\xeb\xbb\x22\x39\xc5\xef\x28\x37\x6a\x3a" - "\x47\xa3\xfb\x7e\xe8\x4a\x0e\x95\x9d\x5a\x6c\x99\x2e\x62\xe4\xe9" - "\xff\x63\x43\xa7\x1e\xf4\x45\x21\xdd\x43\x27\x43\xc8\xb1\xd4\xd8" - "\x6b\xaf\x5d\xe8\x24\x3c\x52\x9e\xcd\xb7\x76\x11\xed\x50\x9e\x39" - "\x66\x1b\x22\xec\x66\xe5\x19\x5c\xf9\x98\x3a\x17\xbc\xb4\xc7\x20" - "\xe7\x4a\x79\x9b\x38\x0b\x9a\xce\xfe\xbd\x9b\x95\xbf\x13\x6d\x26" - "\x3e\x65\x3a\xfb\x29\xdd\xb7\x89\x7d\xdf\x3c\x72\x8f\x66\x33\x3c" - "\xf5\xd1\x51\x9c\xd6\x04\xd7\x71\xf9\x47\x44\x86\xfc\x8b\xa2\x9f" - "\x9e\xeb\x84\xf6\x79\x14\x41\x6a\xd2\xc4\x68\x66\x8a\x37\x1a\x6e" - "\xb8\x3e\xc9\x3c\xff\x9e\x79\xa9\x45\x85\x05\x76\xae\x04\x03\x26" - "\x1e\x11\x27\xb0\xdc\x98\xfd\xf0\x2d\xc5\x12\x17\x56\x18\xb3\x47" - "\x6b\x6b\x85\x83\x43\x87\x93\xd1\x7a\xad\x2f\x5a\xcb\xf4\x07\x07" - "\xdd\x7a\xd0\x2a\xc0\xaf\x88\x77\xd9\xcd\x2a\xbe\xf5\x3a\xe5\x51" - "\xff\xed\xbc\x7c\x66\xbd\xb4\x2d\xa8\xd8\xae\x54\xce\xac\x0f\xd7" - "\x1f\xcd\x50\x3f\xd1\xc3\xfa\x3d\x85\x7d\x7a\x57\xf4\x3d\xcc\x65" - "\xf1\xb1\xd7\xe9\x7e\x8c\xf1\xb4\x41\xf6\x82\x3a\x08\xef\x94\x16" - "\x5d\x22\x7c\x64\x17\x72\x50\xfd\x39\x56\xf1\x5e\xe3\x18\xef\x89" - "\xb3\x8c\x58\x77\xac\xdf\x51\x49\xe3\xbf\xb0\x47\xdd\xef\x89\x1e" - "\xa9\x4c\xd2\xd6\x04\x3d\x8f\x91\xf2\xd8\xca\x14\xad\xcc\xe8\xfc" - "\x12\x74\x18\xb9\x13\xe3\xca\x07\xfa\xfa\xe0\x43\x6d\x0c\x9e\x17" - "\xb1\xd7\xef\x03\x0d\xd3\x46\x18\x22\x7e\x53\x02\xce\x4a\x09\xaf" - "\xa4\x3c\x69\xda\x94\xb2\x22\xde\x77\x35\x33\xd9\x1f\xd1\x99\x82" - "\x5f\xd7\xed\x7a\x81\x77\x80\xc6\xc3\x59\x03\x70\x4b\xdc\xa6\x94" - "\xa5\x5c\x3f\xef\x4e\xc4\xb6\x8a\xf3\x7c\x4d\xa7\x38\xe6\xde\x09" - "\xbf\x68\xd5\xd3\x78\x27\x95\x3b\x4e\xe5\x20\x6b\xea\xa1\xb2\xad" - "\xbd\xac\xf2\x33\xba\xb6\xc4\x6d\xe2\xbb\xe3\x3c\x5c\x99\x5d\xcc" - "\xa2\xd4\xfa\x5a\x45\x6c\xf9\x21\xc1\xeb\x4e\x08\xf3\xba\x55\x89" - "\x21\x07\x9b\x98\x31\x81\xbf\x4e\x75\xb4\xf0\x01\xa5\x65\x97\x22" - "\xfc\x43\xe1\x3c\xe8\x18\xe1\x91\x63\x73\xb6\x11\x6f\x83\x38\x91" - "\xeb\x69\x2c\x03\x01\xd0\x35\x4e\xfa\x46\x33\xe1\x89\xc3\x1b\x9f" - "\x62\xfa\x10\xbd\x43\x7b\x44\xd4\x39\x56\xf5\x64\x7b\x5f\x27\x7c" - "\x6a\x2f\x08\xd3\x6a\xd5\x42\x2e\x57\xf1\x02\x77\x42\x8f\xf7\xe0" - "\x39\x2f\xe2\xac\xb7\x60\xcd\x40\xa7\x11\xf9\x94\x3e\x3c\x7b\x1b" - "\xb3\xba\x3c\x7d\xac\x9d\xa8\x34\x5e\x64\xd6\x53\xfe\xe1\x59\x5e" - "\xa2\x27\xa8\x6e\xe8\x6f\xd3\x9a\x6f\x8d\xf3\xb0\x09\xd4\x97\xc3" - "\x82\xc6\x5a\x67\x4d\xa6\xf7\x9c\xb7\x51\xdb\x68\xcf\x4f\x3a\x38" - "\xd8\xa9\x17\x36\xbf\xd3\x78\x47\x9c\x8f\x25\x0b\xdc\x20\x7c\x96" - "\x59\xbf\x44\xef\x36\x13\x1d\x7d\x0c\xf5\x42\xb6\x40\xe9\x0e\xd4" - "\x71\x8e\x55\x7f\x93\xaf\xb6\x46\xe3\x1b\x44\x13\x38\x2d\x8f\xe3" - "\xcc\xa6\x7a\x56\x7b\x5f\x80\x21\xbf\x8a\xda\x47\x73\xde\x89\x76" - "\x52\x5f\x9b\xfc\x8e\xea\x79\x9a\xad\x36\xf6\x47\x4a\x2f\xd2\xe6" - "\x0b\xe1\xe3\x26\x69\x4f\x5a\xf5\x75\xc0\x84\xda\x7f\x4c\x19\x50" - "\xfa\x14\x6a\x1b\xea\xe1\x6b\xcc\xd1\xd4\x7e\x5d\x46\xd0\xcf\xa9" - "\x0f\xc7\x32\xec\x7e\x8e\x7a\x2d\xab\x04\xdc\x6e\xe6\x6b\x10\x93" - "\xa8\xfa\x10\x68\x63\xc0\x5c\xee\xe7\x55\x4f\xc6\x6d\x4a\x28\x89" - "\xf3\x5c\x4d\x78\xb9\x6a\xcb\xae\x01\xec\xa1\xd5\x4e\xed\x9b\x63" - "\xac\x89\x80\x8b\xf0\x81\x32\xc0\xfb\x40\x0b\x49\xfd\x8b\x6a\x5f" - "\x96\x3d\x2a\x8d\xfa\xa8\xa7\xb6\x60\x1c\xa7\xd1\xbe\x32\x1f\xfa" - "\x35\xd4\x06\xa2\x83\x7f\x90\x78\xa5\x18\x9d\xd4\x57\x33\x95\x21" - "\xfe\xa7\x5a\xfa\xe9\xcf\xe7\xb5\x52\xf6\xf0\x83\x61\xfb\x77\x3e" - "\xc0\x0b\xaa\x0a\xc5\x77\x8b\xb7\xe4\x8b\x6f\x20\x6e\x63\x5f\x9e" - "\x85\x9f\x68\xb6\x78\xc7\x5a\x13\xd4\x9f\x1f\x54\x6b\x36\xef\x68" - "\x3b\xad\xe7\x62\x89\x1b\x9e\x8d\x89\xdf\x34\x9f\xc7\xfb\xee\xbc" - "\x13\x67\x9f\xbb\xf5\x42\xd7\x47\xee\xab\x12\xff\xdf\x40\xe3\x7b" - "\x1e\xe3\x4c\xb4\x5d\x27\x74\x26\x5c\x3e\x2e\x78\x05\x11\xcb\x9a" - "\xb0\x18\xf4\xe5\x20\x87\xa3\x6f\xf8\x86\x79\xd7\x11\xdf\xf8\xc1" - "\xbe\xcb\x71\xef\xe2\x05\x5f\x5f\x6e\x59\x09\x1d\x98\x94\x3b\xec" - "\x16\xeb\xcd\xcb\xe6\x08\xe5\x18\xcb\xff\x5a\x70\x97\x65\x31\x31" - "\x36\x39\xb3\x1e\x90\x97\x05\x8b\x17\xe1\x7a\x99\xac\xd4\xe2\x77" - "\x3c\x7b\xd9\xfe\xf7\xc3\xa0\xdc\x23\x9f\xb5\xbb\x75\xd7\xc8\x18" - "\x1d\xa5\x5d\x4b\x08\x4e\x1e\x6f\x9c\x31\x5b\x8d\xc1\xb6\x84\xee" - "\x2d\xde\x18\x77\x12\x62\xa9\x9a\x36\xf1\x80\x29\x38\x89\x63\x8e" - "\x22\x86\x2a\xcd\xa1\xbe\xaa\x0b\x82\x27\x63\xf7\xdd\x52\xc4\x33" - "\x42\xdc\xb5\xfb\x02\xc6\xed\xd9\x56\x6d\x4c\x04\x7d\x4b\xf5\x52" - "\xbf\x87\x50\x27\x8d\xb5\x01\xf5\x82\xc6\xa5\x72\xd4\xff\x8a\x26" - "\xb9\x3f\x3f\x47\x73\xe9\x07\x76\x75\x0e\x2f\xa6\x74\x82\x9b\xdd" - "\x21\xf4\x8a\x14\x87\x19\xbe\x03\xa2\x95\xcd\xb7\x3e\x48\x78\xd8" - "\xa2\xd5\x49\x75\x19\xb5\x76\xa2\x3e\xf6\x39\x6d\xbf\x94\xb2\x8f" - "\x32\x41\x37\xc1\xc6\xc2\x64\xd7\x21\x8e\x40\xe6\x30\x6d\x48\xcf" - "\x08\x07\x82\x5e\xcc\x8c\xf7\xe9\x8a\x51\x26\x4c\x53\x29\xee\x2a" - "\xbd\x12\xa0\x3d\x36\x41\xc6\x35\xf5\xa8\x32\xe3\xe7\x0e\x8f\x3e" - "\x8e\xcf\x09\x1d\xc7\x0b\x8e\x68\xea\xdb\xb3\x8b\x6f\x4a\x94\xeb" - "\x40\x71\xe8\x98\xb4\xb7\x7b\xee\x65\x71\x8e\x29\x75\x46\x6e\x20" - "\xf8\x7a\x21\x1f\x34\x11\x7e\x80\x2e\x9d\x82\xf9\xc3\xce\x30\x57" - "\x81\xbf\x18\xf1\x44\x35\x9e\x92\xf8\x23\xa5\xdd\x16\xa2\xe7\xdf" - "\x13\xbe\x85\x88\x56\xcb\xa6\xf5\xa4\x3b\xc3\x9e\x2b\x46\xfb\xc5" - "\x38\x3a\x98\x51\x21\x58\x89\x33\x7b\xc0\x27\xf6\x78\x27\x74\xb7" - "\xd1\x57\x53\x90\xfa\x1c\xd9\x2f\xbd\xe2\xae\x74\x50\xbf\xf4\xd4" - "\x2f\xfb\x59\x26\xd6\xaa\xfd\x24\x68\x98\x69\x61\x3f\xd8\xdb\xea" - "\x23\xfb\xa8\xc0\x7f\xbd\xe8\xc3\xb6\x37\x46\xeb\x23\xd7\xa3\x8f" - "\x80\xc1\x36\xcd\x27\xbb\x68\x27\xe8\x06\x0f\xdb\xf6\x50\xfc\x26" - "\xe8\xb2\x77\x2d\xa1\xbd\x78\x01\xc6\xb0\xce\xc1\xab\xd1\xce\xd1" - "\xc6\x0b\xf5\xc9\xba\x9e\xcf\x36\x6d\x2a\xce\xf6\x3b\x9e\x9f\x35" - "\x3a\xbc\x9f\xbf\xff\xca\xf0\x7e\xfe\x46\xbc\x8f\x76\x40\xb7\xdf" - "\x04\x27\x0d\x34\xbf\x69\x9f\x2c\x1d\xed\xbb\xf1\x9b\xea\xd1\xae" - "\x51\x9f\xd1\xdc\xf7\x54\xe5\x8e\x5c\x13\x4a\x1d\xe2\x7c\x9f\x85" - "\xfe\x3b\x93\xfc\xde\xf3\xc7\xc2\xb1\x96\xbb\xb6\x98\x74\x96\x28" - "\xd0\x01\x02\xbf\x51\x7f\x47\xab\xd7\xa4\xab\x86\x9f\x97\x05\x84" - "\x57\x46\x7d\x4e\xeb\xc0\x42\x34\xf5\x4d\x54\xdf\xa2\xf8\x4d\x8c" - "\x13\x6f\x18\x1b\xef\x0b\x26\x03\xae\xd4\x56\x3b\xad\x6b\xf0\xbf" - "\x7a\xc9\x0f\xbe\x40\xf4\xef\x8f\x9b\x05\xbf\x19\xd3\xb5\x48\x9e" - "\x7d\xbc\x90\xe3\x66\x3f\x1b\x96\xd5\x52\xda\xee\x66\x97\xe6\xc9" - "\xb5\x7a\xdd\x0e\x5e\xf6\x71\x9f\xe2\x30\x71\xcb\x06\x13\xf1\x39" - "\x3f\x9c\x42\xfc\x87\x9e\xc7\x7e\xdc\x17\x9e\x3b\x52\xf7\x5f\x9b" - "\x3b\xf4\x7e\xd3\xe8\xf3\xe2\x85\x0f\xaf\x3c\x2f\x5e\xd8\xaf\xf2" - "\x19\xd9\x52\xbf\xe0\x87\x4c\xdb\x3f\x88\xcf\xd8\x61\x29\xc4\xf7" - "\x5f\xd8\x26\xbf\x4d\x30\x09\xa6\x01\xcf\x2c\x22\xb8\x15\x53\xd9" - "\x59\x1a\x6e\xc0\x1c\x32\x85\xb0\x7f\x31\x31\xcf\xe9\x59\x3a\xe1" - "\x11\xf5\xfc\xdc\xdd\x4c\xb8\x2f\x49\x71\x3c\x9b\xe8\x2d\xca\xd9" - "\x09\xfd\x3a\x5f\x4c\x17\xed\x8f\x3f\x5c\xe9\x66\xbf\x17\x31\x88" - "\xb9\xa1\xcb\x49\x75\x34\x8b\xf3\x2a\x69\xb3\x62\xc4\x3a\x47\xbc" - "\x13\xac\x75\xca\x4b\xa4\x76\x23\xf6\x09\xed\x35\x3f\xdc\xa3\xd1" - "\xfa\x8a\x23\x0d\xf0\x16\x36\xf2\xc4\xef\x24\xf5\x13\xec\x9e\xd7" - "\x2b\x0d\x03\x73\xcc\x0c\x7d\x1e\xd8\x3c\xbd\xe1\xdf\x67\xb3\xe8" - "\xb7\xcc\xdf\x61\xb6\x3b\x58\xe2\xa6\xbf\x8b\x66\x9f\xa6\x32\x3d" - "\xe0\xe0\x66\x3f\x3c\x24\x61\xf7\x43\x9f\x36\x3e\x6e\xf6\xc2\x12" - "\x8c\x07\xf8\xfb\x8c\x20\xef\x97\xf2\x8a\x1a\xda\xff\x9e\x51\x63" - "\x25\x3f\xbb\x72\x94\x3d\xe1\x3e\xcb\x8a\x35\x96\x65\xab\xd7\xad" - "\xba\xf1\xc6\x11\x32\xdf\x68\x21\xbf\x73\xd4\x58\xe5\x19\x4a\xcd" - "\x92\x08\xfe\x96\xf6\xb6\x1a\xea\xff\xb3\xe9\x97\xef\xab\x8b\xb2" - "\x54\x13\xcd\xac\x14\x16\xbe\xbf\x9d\x2d\xba\x3d\x22\x79\x27\x5b" - "\x74\xc7\x9d\x59\x0f\x2e\x5f\xba\x6c\x7d\x44\xee\x57\x23\x79\xa5" - "\xaa\x1d\xf4\xed\xa8\xe9\xf7\x12\xfe\xd0\x3d\xf0\x34\xf6\x9a\xed" - "\xdf\x2c\x0c\xf2\x53\x34\x77\x53\xe1\x17\xa1\x2d\x2f\xc8\xda\x08" - "\xbf\xf1\xeb\x80\xd7\x27\x49\xdf\x60\x21\x06\x1e\xc6\x44\x7d\xf7" - "\xd2\xfe\x7c\x51\xea\x97\x6d\x5f\xdb\x5e\x43\x34\x4f\xa9\x3b\x59" - "\xf2\x1b\xdb\x53\x28\x7f\x0a\x5d\xbf\x25\xcf\xc8\xb6\x3f\x42\x74" - "\x4a\x9a\xb0\x03\xcd\x87\x1d\xe8\xf6\xfb\x00\xa3\xd9\xbe\x62\x26" - "\xfd\x91\xd4\xf4\xc1\x4f\xa8\x9b\x6d\x17\x36\x3e\x28\x4b\xef\xdc" - "\x6e\x79\x82\xa5\xe0\x8a\xf3\x66\x7a\x96\xc2\xb7\xba\x93\xf9\xce" - "\x4c\x9c\x1b\x24\x53\xfe\xf3\x51\xba\x13\x2c\xca\x3c\xe9\x9f\xfc" - "\x8e\xed\xdb\x08\xfe\x7d\xea\xd9\xc1\xe8\x36\x07\xea\x1e\x18\x4f" - "\xb8\x3b\xde\x67\xe2\x59\xb0\xa9\xd6\x81\xce\xf3\xd0\x3a\x5e\x2c" - "\x74\x9f\xb1\x27\x4a\x7c\xb0\x7d\x58\xfe\x03\x5b\x13\x4a\xfb\xb4" - "\x39\xef\x77\xec\x60\xda\x9c\x1c\xa1\x2b\xbb\x2a\x6f\x79\xee\xf2" - "\x65\x96\x9b\xd7\xc4\xb2\x88\x88\x51\x39\xcb\x57\x59\x72\x97\x3f" - "\xb5\x76\xf9\x1a\x11\xed\x09\x4f\x2f\x93\xd3\xc4\xfe\x29\x73\x38" - "\x26\x9f\xd0\xd7\xdd\xb1\x1c\x74\x3b\x2f\xfb\x53\xa7\x88\x87\x81" - "\x3d\xc7\x38\xb3\x49\xa9\x8c\x4b\x93\x3c\x1f\x62\x29\xef\x0c\xc8" - "\x73\x0b\x77\xa2\x94\xf7\xef\xac\x40\x9a\xf2\x13\xc2\x31\xa6\x77" - "\xbc\x01\xf9\x8a\x0a\x23\xa2\x61\x76\x34\x69\x30\x72\xb3\xda\x34" - "\x55\x96\xed\x11\xb8\x82\xf6\x58\x93\x8c\xd3\x33\x8c\x2f\xe6\x28" - "\xd8\xa7\x76\x40\x87\x34\x4a\xf0\xcb\x31\x6e\x33\xbe\x85\x3a\x7b" - "\xe9\x7d\x1a\x8b\x44\xc2\x93\x84\x6b\xa8\x15\x6a\x7d\xf4\xcd\x06" - "\x7c\x0f\xf8\x83\xf6\xb9\x6b\xce\xb0\x9d\xa2\x2e\xa5\xd4\x6d\x06" - "\xfe\x80\xdd\x81\xb2\x95\xea\x11\xe7\x73\xb5\x69\xe0\xd3\x45\xbc" - "\x1a\xaa\x0b\xfc\x31\xe1\x01\xeb\xc1\x0d\x01\x3d\xf2\x64\x4c\xa3" - "\x1d\x90\x6b\x12\xbe\x70\x27\xf8\x1d\x3b\xed\x61\xd9\x76\x6d\x1a" - "\xe4\x3f\xa8\xd7\xcd\x76\xce\x43\x7d\x52\xb7\x60\x67\xad\x9b\xd5" - "\x34\x85\x69\xa7\x9d\x6e\x6d\x5f\x92\xed\x91\xed\xf4\x51\x5b\x44" - "\x8c\x42\x69\x23\x25\xfa\x0d\x5c\xb9\x4d\xed\xbb\xd6\x1f\xaa\xcf" - "\x43\xf3\x4e\x9c\xed\x70\x21\x4b\x96\xfd\x46\xfb\xd0\xf6\xc8\x36" - "\xab\xed\x35\x4b\x39\x7c\x6d\x72\xa4\x9c\x4a\xc6\x80\xa9\x4d\x0d" - "\xdb\x5e\xee\x28\xbe\x1c\x47\xdc\xbb\xf4\xb1\xef\x41\x49\x76\x51" - "\xca\x2c\x0b\xf0\x45\xd6\x83\xf7\x2d\xf8\xd7\xac\x05\x19\x0f\x3f" - "\xf0\x90\x38\x51\x1f\x7e\xbe\x70\xd5\xe8\x05\x46\xce\xab\x04\x1a" - "\x15\xcc\x85\x09\xdd\xac\xce\x27\xcf\x55\x6a\x0f\x8f\x3c\x57\xa9" - "\x3d\x46\x3f\x2f\x63\xbb\x8c\xf4\xf3\xd1\xae\x44\xd9\x75\x7d\xea" - "\x7c\xf1\x50\x7b\xfb\xc2\xf3\xa5\x4e\xe8\xf9\x42\x9e\x2d\xf9\xdc" - "\x5d\xc4\x6b\xec\x48\x8d\x7c\x16\xa6\xe9\x77\x59\x86\x69\xfa\x61" - "\x7c\xb0\x6b\x91\x46\xdf\x53\x5e\x12\xd1\xf6\x93\x40\xdb\x4b\x3f" - "\x81\x75\x22\xce\x32\xf8\x0d\xf0\x16\x26\x1d\xe2\x02\xc9\xf5\x09" - "\x1a\x2a\x8b\xf6\x13\xc4\x61\x07\x9f\x21\xe8\x78\xe8\x8d\x8b\x35" - "\xba\xab\x54\x5b\xa3\xa0\xe7\x45\x1c\xb9\x01\x11\xb3\xfd\xbc\xca" - "\x1b\x32\x5a\x37\x7b\x20\x1b\x20\xba\x38\x01\x32\x5b\xf0\x4e\x3c" - "\x6e\xe6\x1e\xb5\x4d\x2d\x90\x15\x80\x1e\x16\xf2\x22\x47\xed\x22" - "\xa1\x63\xb9\x79\xfa\xbd\x42\x66\x26\x74\x2c\x77\x79\xc2\x73\xae" - "\xce\x87\xb1\x04\x0c\x68\x1e\x04\x84\xbe\xd5\x70\x9f\xeb\x12\x87" - "\xfb\x9c\x4f\xfd\x1c\x14\x76\x7f\x93\xd4\x58\xd7\xa2\x8f\x63\xf5" - "\x6f\xf4\xbe\xd5\x2d\xfb\x8b\x7d\x73\xb0\x09\x58\x17\x5a\x1f\xff" - "\xbc\x7f\x75\x0d\x97\xf5\x6f\xe5\x9f\xf7\xaf\xae\x75\x58\x26\x26" - "\xd7\x08\xf1\x7a\x75\x17\xd1\x4f\xcc\x03\xea\xe7\xf1\x28\xb3\xe1" - "\x4b\x11\xf7\xb3\x46\xc3\xad\xf1\x9b\xf4\xaa\xbd\xff\xee\xaf\xe3" - "\xbc\x07\x75\x3d\xa7\x57\x72\x9e\x73\xd0\x8f\xae\xc0\xb1\x61\x1a" - "\x96\x07\x64\xfb\x76\xa7\x37\xdb\x3d\xd8\x9b\x03\x63\xea\x59\xe4" - "\xf3\xe3\x80\x25\x60\x92\x11\xf2\xce\x87\xbf\x6a\xbf\x63\x77\xf1" - "\x30\x6e\xfe\x52\xb1\x37\x6a\x13\xb3\x1c\xa9\xbd\x03\xf9\x35\x6e" - "\xb6\x9b\xa9\x7a\x24\xbe\xcb\xdf\x25\x78\xa7\xa9\xef\x3b\xb5\xf7" - "\x2f\xf7\x23\x27\x0c\x1d\x56\x2e\xcd\x5f\x7e\x97\xb0\x61\xb0\xaa" - "\xa1\xf7\x46\xae\xab\xb2\x3f\xdc\x0b\xd9\x04\x8d\xfb\x24\x9c\x4d" - "\xcb\xfd\xaf\x3e\x07\xf1\x50\xe9\xd9\x42\x2e\xf4\xf4\xbf\x21\x62" - "\x54\xd2\x18\x7d\x43\xe8\xae\x16\x30\x95\xff\xa8\x9f\x17\x61\xdf" - "\x20\x74\xc1\x5c\x05\x42\x7f\x82\xc6\x67\x77\x47\x58\x27\xac\x7e" - "\x59\x04\xfe\x30\x46\xb6\x71\xf5\x2a\x4b\xce\xd2\x55\xcb\x56\x3f" - "\xfe\xf8\x2c\xcb\xda\x55\xe2\x64\x00\x1b\xcb\x9a\xbc\xb5\x84\x1f" - "\x04\x5e\x58\xb8\x68\x51\xd6\xbd\x0f\xff\xcb\xb7\x46\xd0\x19\x86" - "\x6a\x87\x52\x4a\xf5\x12\xff\x53\xe1\x95\xfb\x58\x7d\x8b\x9b\x7d" - "\x5f\xd2\xbc\x44\xcb\xd0\xd8\xcf\x38\xc3\x7e\x94\x1c\x81\x2f\xe3" - "\x29\x9d\xc2\x1d\xf5\x79\x18\x0b\xb5\x5d\xc1\x48\xfa\x84\xd6\x40" - "\x94\xdf\xf1\xa3\x04\xcd\x9f\x6d\xde\x8d\x4c\x1f\x7d\x63\x35\xdb" - "\xa6\xe7\x34\x46\x3f\x9a\x4b\x7b\xee\x71\x7a\x9e\x42\x74\xe7\x32" - "\x41\x8b\x61\x4c\x24\x2d\xee\x34\x05\xe7\x0b\x5a\x3c\x6b\x3d\xd3" - "\x81\x0e\xd7\xd6\x47\x88\xf8\xda\x50\x3e\xef\xc9\x0a\xb2\x04\xcc" - "\xf3\xaa\x55\x98\xeb\x37\xf0\xe0\x00\x77\x67\xad\x37\xb0\xdd\x94" - "\xae\x3c\xc3\x58\xbb\x2f\xc8\x1e\xbd\x48\xfc\x08\xdd\x57\xf5\xd2" - "\xda\x08\x2a\x70\x2c\x0b\x9d\x0e\x82\xf3\x8f\xf6\x68\xb4\xae\x69" - "\x93\x45\xf8\x1b\x84\x8c\x1c\x73\x01\x34\x40\x56\xc8\xe4\x94\xfc" - "\xef\x8f\x5a\xaf\x28\xb7\x88\x33\xa6\x8f\x96\x4f\x6d\x6c\x46\xbb" - "\xa8\x9d\x8d\xd4\xae\x43\x68\x4f\xe5\xe3\xe8\x57\xd4\x9d\xa6\x60" - "\x8a\xb0\xb3\x43\x3b\x1f\xf5\xb1\x3b\xd1\xbe\x47\x9f\xba\x93\xd5" - "\x3d\x2e\xe6\x87\x38\x83\x54\x75\x1b\xa2\x69\xee\x4c\xea\x65\x3f" - "\x2e\xf6\x89\xf8\x4f\x3f\xce\x74\x33\x43\xb3\xa4\x87\xa5\xfc\x0b" - "\x65\xf0\x4c\xce\xb1\x1f\x17\xcb\x98\xbb\x3f\x2e\xd6\xca\x45\xb6" - "\x6d\xc1\x52\x1b\x11\x98\x2b\x1e\x7f\x7c\x79\xee\x1a\x2d\x9e\xa4" - "\x75\xf5\xca\x65\x77\xab\xb6\x39\xab\x96\xaf\xcb\x5a\xb1\x4c\xe8" - "\xfe\x51\xae\xbc\xbd\x8c\x16\x99\x05\x9e\x40\xe8\xd3\x08\x3a\xe4" - "\xa5\x0f\xeb\x54\x9a\xa4\x9b\xfd\x04\xbe\x99\x69\x7f\xff\xc9\x0f" - "\xe4\xfe\x10\x73\xde\xef\xf8\x89\x41\xdb\x1f\xfa\x27\xa6\x12\xad" - "\xff\x13\xda\x8b\x7f\xd4\x19\x89\xb3\x60\xff\xec\x5c\x05\x1d\x80" - "\x9f\xde\xad\x6c\xed\x9a\xc7\x63\xdf\xf2\xd2\x9a\x34\x82\x7e\x86" - "\x2c\x4b\xfa\x09\xfe\xc9\x32\xe0\x54\xe8\x10\x20\xae\x6f\x0f\xfb" - "\xc9\x5c\xa2\x45\x68\x4e\xfd\x34\x8d\x78\xa1\x79\x5b\x36\x30\xc3" - "\xae\x17\x78\x0f\x64\x94\x52\xbf\xf8\x27\xc5\x6f\xd0\x7a\x52\xcf" - "\x28\xdc\x15\xf4\xcc\xcd\x7e\x22\x7d\xe6\x97\x76\x2d\x56\xe5\x0c" - "\x8b\xa9\x5c\x83\x9b\x19\x9b\xe4\x3e\xf4\xb6\x59\xc8\x2b\x05\xde" - "\xf9\x49\x2b\x2f\x7b\xbb\x41\xc8\x80\xca\xde\x36\x2b\x3c\x27\x0a" - "\x69\xa2\x73\x62\xa9\x1e\x03\xe2\xb8\xab\xba\x12\x51\x04\xf3\x00" - "\xfa\x4b\xf5\x66\xc2\x3e\x1c\x7c\xbd\x5a\x7f\x26\x78\x76\xda\x57" - "\x8c\xd8\x5b\x78\x4c\xd7\x5c\x3e\xe0\xa9\xa7\xfd\x0d\x74\xa6\x37" - "\x7e\x53\x90\x51\x5e\xaa\xa0\x37\x7d\x37\x70\xda\xeb\x42\xc2\x2e" - "\x6d\x3d\x8b\x1b\x49\x67\xee\x59\xa4\xcd\x3f\x05\xef\x0f\x30\x23" - "\xb5\xb1\xb8\x87\xed\x11\x3a\x3c\x90\xdd\x02\x86\x83\x04\x37\x82" - "\x5d\x80\xbe\xd1\x48\xb4\x71\x5c\x2f\xdb\xb3\x15\xf0\xab\x54\x68" - "\xbe\x0f\x0a\x7a\xd9\x84\x38\xa7\xdd\x6c\xcf\x5a\xc0\x0e\x75\x51" - "\x9f\x5b\x82\xfe\xcc\x7f\x82\xff\x0a\xf4\x7d\x63\x01\xed\x45\x8f" - "\xa3\xff\x2f\x5e\x02\x7d\x49\xb4\xb5\xb8\x2f\x5a\xc6\x15\x01\x7b" - "\xa1\xcf\xf0\xe2\xa5\x8d\x7d\x5c\xb9\xe4\x60\xbc\x85\x76\xf5\x4b" - "\x7a\x16\x0c\x10\x1f\x08\xb9\x6d\xd1\x59\xf8\xd8\xa8\xa7\xb9\x5d" - "\xca\xe8\xbb\x86\xca\x0d\x2c\x01\x3e\x49\x8a\x6c\x3c\xd0\xee\xab" - "\x65\xed\xb6\x5a\xf6\x6e\x70\x1b\x73\xe6\xe3\x6c\xf0\xa5\xfa\xa3" - "\xf6\x6d\xd0\x1f\x8b\xa1\xfb\xa5\x96\x7f\x15\xdf\x4a\x3d\x7a\xec" - "\x7d\x76\xd4\xf9\x3e\xb3\xfc\x9b\x48\xa7\xb7\x66\xbe\xcb\x5a\xd3" - "\xde\x65\x45\x3d\x5c\x01\x8d\x52\xf8\x24\xbe\x51\x4a\x75\xd5\xc3" - "\x97\x47\x82\xd2\x6f\x8e\xa5\xfe\x47\x67\xd8\xb1\xde\xbd\x34\x97" - "\x7e\x85\x36\xbe\x53\x77\x81\x19\x9c\xab\x7e\x2b\xee\x25\xed\xe0" - "\xa9\x77\x2d\xeb\x14\x67\xc9\xf0\x5d\x82\xd8\xc0\xb4\xf7\x2a\x55" - "\x68\x63\x48\xb6\x9b\xe0\x15\xad\xbd\xbf\xbb\x70\xf8\x7d\xe1\x2b" - "\x75\x17\xe0\x41\x6d\x6a\x7b\x48\xc2\xa4\xb5\x93\x60\xfa\xaf\x2a" - "\x7c\x32\x23\xe1\xb3\xa7\x0f\xf0\x81\x9e\x88\x92\xef\xa9\xa7\xb6" - "\xa5\x11\x0c\x14\xed\x1b\x18\x7f\x6a\x2b\x47\xfd\x95\x17\x98\xd1" - "\xb9\x0a\x7a\x24\x2f\xdd\x6f\x5a\x1c\x6d\x50\x06\xce\x36\x56\x5d" - "\x64\x42\x86\x8b\x7d\xa8\x4a\x3c\x47\x9d\x2f\xe1\x4c\x30\xc1\x1b" - "\xf3\x87\x14\xfa\xcd\xa5\x5f\x2a\xe6\x21\x5d\xe7\xd1\x78\x95\x52" - "\x1b\x5a\x68\xac\xea\x71\x95\x73\xbc\x25\x07\x7e\x9d\x54\xda\x22" - "\x9c\x5f\xd6\xf2\xdd\x20\xcd\x65\x45\xf0\x4a\x2f\xb6\x28\x5b\x7b" - "\x54\xdd\xcb\x1f\x97\xef\xa2\x7d\xa5\xf6\x59\x61\xb7\x66\xac\x9b" - "\x2a\xe2\x83\xb2\x1d\x42\xbf\xf5\xa5\xe1\xfd\xbf\x4c\xc4\x1d\x7d" - "\x31\xa0\x17\x67\xc7\x5d\x0f\xa9\xf3\xfc\x21\x2a\xe3\x75\xb3\xab" - "\xdd\x72\xcf\x78\x29\xa8\xad\x29\xc2\xd7\x5e\x6d\xfe\xd3\x3a\xa5" - "\x76\xd3\x7c\x17\xb2\x47\x62\x0e\x83\x37\x0c\xcb\x1e\xe5\x3c\xff" - "\xe9\x5c\x6d\x9e\x53\xdf\x8c\xc0\x17\x58\xdb\x63\xed\xfb\x84\x57" - "\x5b\x71\x9e\xcf\xaf\xcb\x64\x46\xa2\x97\x8c\xd9\x26\xee\x0a\x36" - "\x63\x1e\x1a\xc5\xfa\x91\xcf\x88\xde\xf1\x9a\x08\x17\x77\x50\x7e" - "\xb4\x96\x0f\xbc\xac\x10\x8f\x08\xfe\x34\x63\xbd\x89\x17\x5e\x64" - "\x49\x42\xd6\xa3\xe5\xaf\xf7\x9a\xda\xcd\x0c\xfa\x7d\x41\xd8\xbc" - "\xe2\x1d\xca\x8f\x22\x3c\x7e\x98\xbe\xeb\xa4\xf2\x89\x5a\x79\xde" - "\x9f\x19\xed\xb2\x37\x8b\x3e\xc0\x8f\x83\x86\xd7\x29\x7f\x42\x86" - "\xdd\x6b\x12\xe3\xae\xe5\xad\xc9\x14\xfb\x10\xec\xeb\x88\xbe\xe2" - "\xa2\x3d\xbd\x22\x5f\x47\x74\x9b\x88\x8d\x1a\x91\xa7\x87\x2d\x23" - "\x7c\xf0\x44\xe4\x45\x51\x9b\xd9\x70\x9a\xbe\x5d\xf5\x84\xa0\x23" - "\xcd\x19\xeb\xa9\x3e\x7c\xe7\x09\xf5\xdb\xeb\x39\x93\xbe\xbd\x64" - "\x9e\xdc\xf3\x1a\x6a\x86\x69\x46\xd0\x3f\xfd\x99\xe2\xdb\x4a\x7f" - "\xa6\x3e\xd4\x9f\x19\x85\xef\xa3\x2e\xc8\x19\x45\x8c\xd6\x60\x1f" - "\x83\x5f\x49\x5e\x31\xd3\xc9\xa1\xcf\x49\xf5\x8a\xf6\xd8\x89\x8f" - "\x8f\x4b\x4e\x1b\xf5\xac\xaa\x7c\x8a\xdd\x59\xf8\x6f\xb4\x2e\xf6" - "\x62\xee\xb3\x90\xe1\xa3\x74\xcb\x13\x38\x03\xda\x7b\x2d\xe6\x60" - "\x88\x70\x45\x28\xe6\xa3\xf4\x39\x7d\x4c\x57\x48\xeb\x4f\xf2\x79" - "\x7b\xff\x01\x3e\x90\x8a\x14\xce\xe9\x7e\x16\xe6\xbf\xc9\x43\xfc" - "\xc8\xd6\x8f\x16\x89\xb3\xb7\xf8\x38\x9b\x2b\xd0\xc7\x5a\x8b\xbb" - "\x58\x6b\xd0\x55\x7c\xf8\x82\x37\x5a\x9e\xc1\x45\xa3\xde\xfb\xf1" - "\xac\x88\xd6\x5c\x56\xa8\x7e\x4c\x59\x1c\xe8\x5f\x82\xdd\xc7\x12" - "\xbf\xef\xad\xd7\xe8\xde\xbf\xd0\x87\x00\xfc\x28\xe1\x8c\x5e\x29" - "\xfb\x14\xe7\x80\x45\xdc\x6f\x65\x73\x36\x80\xef\xdd\xdb\x11\xef" - "\x63\x69\x6a\xbd\xe7\xd5\x7a\x03\x57\xaa\x17\xf3\xb6\xb5\x46\xc8" - "\x7e\x99\x12\xfb\x69\x76\x88\xea\x0e\xc5\x7e\x5a\x4f\xfb\x48\x51" - "\xd1\x25\xc8\x40\x7e\x7e\x1f\x7d\x27\xbb\x3d\xd8\xc1\xe0\x8f\xad" - "\x4e\xa1\xfd\xf6\xbc\x99\xa9\xe7\x8d\x45\xe7\xd8\xcf\x6e\x51\xb8" - "\x35\x81\xe8\x73\xc8\x3c\x8b\x80\xab\x41\xeb\x17\x86\xd8\x44\x57" - "\x9e\x9b\xc1\x9f\x10\xd5\xf1\x0f\x6f\x42\xbe\x4c\xf8\x2e\xc4\xcd" - "\xfa\xdf\x0c\xb8\x59\x15\xed\x01\xc2\xbf\xd0\xe6\xeb\x76\xc4\x6f" - "\x62\xf3\xb9\xde\x24\xce\x93\x95\x8a\xc9\x76\x1a\xdb\x16\xd1\x9e" - "\xb2\xae\xec\x88\xb3\xcd\x28\xfa\xd6\x7e\x9c\x6d\x72\x43\x97\xb5" - "\x16\xf2\xde\xb8\xb8\xc5\xde\x38\x63\x1a\xa7\xb1\xf3\x3b\x7e\xe6" - "\x76\xb3\x06\xb1\xaf\x97\x43\x97\x56\xec\x19\x3f\xbf\xdf\x1b\x73" - "\x0a\x3e\xa3\x11\x6b\x49\xa7\xe4\x07\x1b\xab\x3e\x23\xfa\x45\xc0" - "\xe5\xe7\xb7\xb5\x7b\xfc\x4e\x5e\x7a\x2a\x1d\xeb\x49\xfd\x86\x89" - "\xbe\x11\xe2\x5b\x4f\xa5\xbb\xd9\xcf\xd5\xbd\x59\xdc\x9b\xf1\x3c" - "\x38\x04\xdd\xdf\x9f\x95\xd7\x0e\x42\xc6\xf6\xb3\x54\xa2\xef\x9c" - "\xfd\x86\x53\xe9\xff\x62\x2e\xa6\xfd\xfd\xe7\xd9\x6e\x5d\x87\x4d" - "\xe5\xb9\x85\xcf\xa4\x31\xcf\xb7\x77\x9a\x63\x5d\x54\x09\xd1\xaa" - "\x89\x67\xd8\xfe\xf7\x06\x1d\x4c\x3f\x44\x7b\xf4\xa0\x9e\xe8\xf4" - "\x9d\x99\xc6\xca\xe9\x2c\x85\x9e\x4d\x3f\xc3\x7e\xfe\x4a\x50\xcf" - "\x12\xe9\x97\xe0\xbd\x2e\x27\x86\xea\x4d\x83\x3c\xa2\xed\x02\xf8" - "\xcf\x7d\xd2\x4e\x78\x07\x4b\x56\xa8\x3e\xc8\x51\xab\xa6\xb3\x64" - "\xc8\x04\x28\xcf\x9a\x15\x92\x67\x0c\x1a\xff\xb2\x79\x3a\x9b\x35" - "\xf2\xbb\x3f\x57\x7d\x21\xed\x17\x31\xe3\xd6\x79\xd9\xf5\xb6\x7b" - "\x78\x37\xd5\x0b\x1f\xb4\x9c\x5f\x67\xd6\xcb\xb3\xb8\x7d\xeb\x4d" - "\x35\x72\xfe\x09\x99\x3a\xcd\x3b\x9c\x59\xa8\xb2\x5a\x9d\xf0\x15" - "\x15\xfb\x71\x27\x74\x2f\x23\x64\x32\x09\xa2\x1d\xaa\x9f\x97\xd0" - "\xe6\x5b\xb3\x51\x07\xda\x93\xb5\x54\xca\x79\xe1\x03\x86\xe0\x2a" - "\xfc\xf8\x96\xef\x60\xc6\x67\x76\xb0\x84\xb6\xc7\x45\xbf\x1a\xe4" - "\x9a\x8c\x66\x68\xaf\x52\x8a\xf5\x46\x73\x83\xda\x8d\xef\x61\x8e" - "\xb4\x07\xcf\x3b\x8b\xf2\xb8\xe2\x7c\x02\xf6\x87\xfb\x4e\x3b\x73" - "\xf7\xb1\x0c\xf8\xcc\x81\xdd\xfc\x12\xe6\xdd\x4d\xf5\xed\x9e\xce" - "\x12\xa8\xae\x8b\xae\x95\xc0\xb9\xe6\x9b\x9c\xb9\x87\xa8\xee\xfd" - "\x31\xd8\xdb\x2a\x08\x3e\x72\x8f\xdb\x7f\xd8\x15\xe8\x64\xf0\x91" - "\xfb\x80\x8d\x87\x50\x0f\x95\xf9\x9a\xe8\xef\x4e\xb3\x25\x4b\xfa" - "\xe9\x11\x7d\x1d\x96\x9f\xab\xfd\x70\x5d\x10\xf5\x3d\xe4\xca\x26" - "\xba\x5c\xed\x93\x06\x6b\x39\xbf\xf6\xff\xc0\x99\xbb\x87\x61\x7c" - "\x50\x9e\xd2\xc5\x2e\x0f\x95\x3d\x3b\x72\x5c\x50\x86\x9e\xbd\x4c" - "\xf5\xfe\x7d\xf8\x5c\x08\xe7\x15\xe1\x32\xb5\xd4\x1f\x82\x95\x6f" - "\x27\xc1\x48\xca\xd1\xf6\xcf\x40\x5b\x69\xec\x92\x5c\x79\x5d\xa3" - "\xeb\x3c\x13\x0e\xa0\x79\xbf\xa9\x5d\xc8\xc2\x0f\xc4\x3d\x10\x54" - "\xb8\xc4\x6b\x07\x9c\x44\x03\x66\xbb\xe9\x0a\x9c\x20\xf0\xca\x6c" - "\xf8\x5f\x3a\xf0\x86\x49\x27\xc7\x17\x7d\x01\xfd\x35\xda\x18\x47" - "\xc8\xe9\x13\xd0\x56\x6d\x8c\xb9\x71\x8a\x5d\xc1\xf9\xcb\x74\x82" - "\xf7\x90\x99\xc9\xf9\xc7\xab\xa9\xde\x97\x55\x1a\x77\x8f\xba\x37" - "\xef\xe9\x8f\xf9\xe8\x21\xfe\xb4\x99\x69\xfa\x0f\xb4\x7e\x17\x67" - "\x49\x9d\x12\x33\x70\xd5\x6e\x3d\x57\xe3\x9c\x1c\x70\xaa\xef\xd6" - "\x4b\xbf\x63\x07\x8a\xe9\xfd\xfa\x51\xfb\x1b\x35\x1d\xbe\x56\x8b" - "\xe0\x93\x48\x9c\x93\x13\xce\xa2\x7d\x61\xa2\xcb\x37\x28\x6c\x54" - "\x7a\xd9\xc1\xbb\x11\xaf\x16\x7a\xe8\x5a\xdb\xc6\x27\x53\x3f\x68" - "\x90\xb2\xb5\x83\xe9\x1a\xdf\xc8\x8d\x04\x63\x87\x49\xf8\x4b\xc5" - "\xb9\xab\x2f\x6e\x4a\xb1\x37\x6e\x66\xa3\x5c\x37\x07\x6d\x3c\x4e" - "\xe2\xdd\xac\x00\x2b\x46\xbf\x54\xfe\x69\x22\xfa\x4c\xf5\x54\x13" - "\x4f\xbb\x50\xd2\x16\xb2\xee\x31\x7d\x10\x6b\x7d\xa3\x3e\x89\xbe" - "\x51\x1f\x45\xdf\x60\x83\x2b\xfa\xd6\x18\x27\x64\x59\xe3\xeb\x4f" - "\xa7\xdc\x83\xa6\x14\x3b\xa7\xa3\x8e\x97\x5f\x14\xfa\x41\x34\x26" - "\x52\xe6\xd8\x98\xcd\x63\x9f\x89\x1d\x5f\x9d\x8d\x52\xaf\xb8\x7c" - "\x66\xe3\xf3\x88\x11\x20\x74\x92\x61\x37\xf2\x72\x05\xe1\xf4\x46" - "\x11\x33\x99\xbe\x47\xf3\x23\x02\x0f\xbd\x9c\x80\xb1\x9a\xbd\x8f" - "\xa5\xc9\x79\xf8\xf2\x04\xc8\x94\xa4\x8f\xf8\xc6\x43\x34\xef\xa5" - "\x7c\x6a\x58\x57\x46\x27\x74\x65\x22\x71\xec\x38\xdb\x28\x63\x64" - "\xc6\x4f\xb6\xd0\xfd\x1e\xa1\x23\x48\xed\x5d\x17\xd4\xf0\x5f\xe3" - "\x1e\x3e\xc0\x7b\x20\xf3\x03\xfd\x94\x05\x5c\x56\x28\x7d\x78\xf8" - "\x1d\x2f\x2f\xd4\x68\x15\xd0\xd6\xd0\x85\x42\x39\x1a\xfb\xf3\x28" - "\x23\x7d\x0c\x9c\x51\xed\x19\x5e\xfe\x96\x6a\xab\x60\x85\x9e\x12" - "\xbd\x4b\xf8\xee\x98\x18\x6f\xc0\x00\xdf\x16\x6d\xd7\x43\x9e\xf5" - "\x72\x6d\x58\xc6\xda\x28\xf4\xa2\xa4\xbd\xd1\xcb\x87\xb4\x39\x42" - "\xfd\x9d\x28\xfd\x02\x37\xce\x38\x42\x50\xc6\x1c\xe8\xe7\xe6\xd8" - "\x99\xb5\x98\x93\x2f\x1f\x8f\x84\x53\x46\x50\x29\x92\x38\xa8\xb1" - "\x99\x8b\xb5\xde\xd8\xfc\x97\xe9\x8a\x5f\xdc\xae\xd1\x24\x12\xce" - "\x09\x84\x5f\x0e\x05\x05\xac\x4b\x5b\x0c\xf0\xe5\xf5\x74\x21\xfc" - "\x11\xfe\xe2\x33\xf8\x7a\x0c\x96\xb6\x58\x43\x45\x66\xf8\x91\x67" - "\x4a\x69\x4b\x6a\xaf\x8d\xe9\xb3\x6c\x90\x2b\x9f\x4a\x00\xbf\x48" - "\xfc\x68\x02\x8f\x25\x3a\x85\xd6\xf9\xc6\x15\xcc\xf4\x48\x0e\xd5" - "\x5d\x64\x4d\x84\x2f\x46\xf8\x61\x84\x2f\xd5\x50\x91\x75\x2a\xdd" - "\x4f\x23\xba\x2e\x81\x1b\x5a\xcc\x38\x9b\x0e\x39\x38\xe1\xe3\xe3" - "\xf0\x07\xa9\x77\x79\x03\x6c\xe3\x59\x66\x80\xaf\xc7\xe0\xd6\x53" - "\xd6\x76\xdf\x1f\x05\xaf\x14\x6f\x63\x89\x44\x87\x24\x11\xcc\xcd" - "\x4a\xcc\x29\xa2\xe3\x4f\x25\xca\x7e\x9f\xe7\xb2\xdf\xb2\xdd\x68" - "\xbf\xc0\x71\xa5\xef\xa6\x16\x8a\xb6\x1f\x7a\x3e\x48\xf5\x2b\xa5" - "\xae\xb9\xa1\x52\x57\x8a\xb4\x99\x69\x65\x85\x79\xbc\xcf\xe5\x6b" - "\x25\xfe\xed\xa2\x88\x7d\x81\xb3\x6f\xf4\x11\xfd\xc3\xb7\x8f\x5e" - "\x38\x2b\x7c\x57\x06\x29\x5d\xb4\x52\x7d\xc7\x43\xef\x78\x5a\xd9" - "\x60\xa9\x4b\xf4\xbd\xdd\x27\xdf\xcd\x12\xf7\x78\x3f\x02\x0e\x6a" - "\x9f\x87\xe1\x40\x7d\x47\xff\xd0\xff\x20\x60\x42\x30\x50\xfb\x6a" - "\x1e\x52\xfb\x89\x3e\xbe\x4b\xbb\xce\x0e\xea\x27\xf5\x55\xf4\x73" - "\x88\xfa\xd9\x92\xc3\x58\xa0\x72\x4a\xf5\xa5\x58\x57\x0a\xf8\xdd" - "\xa2\xf7\x88\x96\x2f\xa8\x66\xc4\xd7\x46\xef\x2f\xac\xd6\x97\x11" - "\x6d\x52\xe8\x25\xfe\xd6\xcb\xfb\xda\xa9\x4f\x2e\x1b\xfd\x82\xb5" - "\x0c\x34\x8e\x46\xb7\xd3\xb7\xcd\x47\x95\x93\xac\xb0\x8f\xf7\x11" - "\x8d\x1a\x70\x05\xa9\x4c\x0e\xf5\x9f\xf8\xe1\x5e\xb5\xfd\x28\xbb" - "\xf1\x33\xd9\x2f\xd3\x4a\x96\xf8\xfa\xbf\x95\xea\x5d\x9d\xa5\x4c" - "\xeb\xcb\xa3\x54\x8e\xfa\x63\xa6\xba\x44\xcc\x45\x85\xfa\xb9\x93" - "\xda\x19\x88\xe8\x53\x9b\x27\x40\x75\x7e\xc0\x62\x17\x33\xdd\x8e" - "\x73\xd4\x8f\x73\xcc\x5c\x5d\x48\xf4\xd7\x83\xa0\x1b\xff\xa3\x6d" - "\x72\x26\x4b\x76\xb3\x5f\xc8\x78\x5d\xd2\xb7\xdc\xd5\x67\xd8\xa1" - "\x8b\x9a\xff\x38\x05\xfe\x37\x63\x4e\xcd\xc2\x3c\x12\xbe\xe4\xb0" - "\x67\xf8\x69\xce\xe0\x8c\x7a\x1d\x7d\xc3\x6f\x9d\x26\xda\xe3\x90" - "\xfe\xe7\x28\x0d\x5f\xd8\xd0\x47\xd7\xd1\x7b\x56\x4e\x30\x43\xfd" - "\x44\xcf\x25\xe2\x0a\x18\x8e\xaa\x3b\x74\x80\xa5\xd2\x37\xb2\xc1" - "\xcb\x37\x16\x7a\xf5\xdf\x3f\xc0\x66\x8d\x0f\xa7\xbc\x92\x3c\x16" - "\xfe\x86\x4c\x12\xf5\x51\xdf\xa6\x9e\x61\xbf\x8c\x19\xb9\xc6\x2c" - "\x02\x97\x49\x3c\xf8\x4a\x07\x64\x7e\xe3\xfc\xae\xf4\x5b\xe9\xe0" - "\xa5\xe3\x7c\xef\x98\xd6\x0e\xba\x1f\x33\xd6\xc8\xf8\xe1\xf0\xcb" - "\x59\x63\xd5\x55\xf1\x82\xb0\x8d\x2b\xaa\x7c\x81\xf0\x05\xd1\x0a" - "\x88\xed\x0e\xba\xae\x79\x8f\x8f\xad\xd9\xc5\x0c\x45\x67\x21\x63" - "\xba\x9f\x1d\xa9\x4d\x61\x75\x17\xe0\x13\xc2\x3a\xf5\xb9\x0b\x38" - "\x67\x94\x38\x04\x34\x29\x64\xa7\x7c\x8d\x35\xa1\xea\x05\x8d\x86" - "\xff\xe5\xc5\x82\x8b\x4c\x2f\xe3\x8d\xfe\xd2\xb7\xd0\xc2\x83\xdb" - "\xf4\x4a\x4e\x2d\x7c\x2b\xc6\x4f\xae\x87\x6f\x45\xcd\xd7\xa0\xa0" - "\x7d\xec\xb4\xe6\xfa\xcd\xb1\x15\xb9\x6c\x16\xfc\xa2\x9a\xbc\x92" - "\x96\x93\xfb\xf5\x7f\x26\x53\xfb\x12\xd4\xb3\xb5\x04\xe9\x7f\xf0" - "\x95\x95\xbb\x2f\x08\x79\x27\x9e\x3f\x1c\x22\x5e\x46\xd4\x9b\xcb" - "\x92\x6b\x2f\x30\x2b\xe8\xa0\xac\x93\x92\x66\x03\x7f\x78\xbf\xc7" - "\xc4\x43\x9f\x5a\xd9\xae\x33\x61\xbf\xa9\xde\x35\xf0\xb5\xca\xcd" - "\x63\xd9\x03\x56\x4d\x13\x67\xe9\xc2\x17\x16\xf4\x03\x28\xcd\xb6" - "\x3d\xcb\xa2\x8f\x24\x31\x06\xb9\x21\xce\xe5\x8e\x04\xa5\x3d\x86" - "\xdf\xf1\x9f\xcd\x9a\x5f\xc9\xd1\x71\x79\xdc\x62\xd8\x29\xf2\x8a" - "\xb8\xc5\xe3\x1b\xb7\xff\xec\x19\x93\x57\xa1\x3a\x31\x0f\xbe\x58" - "\xbd\x4d\xf3\xae\x40\xd7\x44\x2b\xa5\x92\x37\x53\x26\x12\xcf\xe8" - "\xf5\x3b\xa5\x3f\xa4\xa6\x26\xd7\x16\x25\x82\x1f\x6b\xda\x8e\x67" - "\xc8\x83\x8f\x89\x34\x31\xee\x4d\x6e\xf0\x68\x2a\x9f\xfb\xba\x45" - "\xcb\x53\xf9\x5c\xec\xbb\x80\xd7\x6e\xe9\xb3\x2a\xde\xef\x68\x0a" - "\x6a\x7b\x2f\x68\x10\x29\x8f\x7e\x35\xc1\xad\x7b\xff\x4a\x7e\xc2" - "\x12\x84\xff\x2c\xe8\xba\xc0\xaf\xa5\xe3\xd5\x34\x6d\x2f\x16\x76" - "\xae\x9b\xa7\xdf\xbb\x66\x3d\x4b\xfa\x97\x6b\x0d\x0c\xe7\x52\x54" - "\xb6\x4f\xd2\x08\xaf\xe6\x84\x65\xf8\x69\x62\x6e\xc0\x5e\x4a\xf0" - "\x43\xf0\x43\x24\xfd\xb9\x7a\x34\x7f\x44\x92\x56\x78\xf5\xfb\x11" - "\xdf\x69\x18\xde\xf3\xe9\x1b\x38\xef\x45\xfd\x92\x8e\x7a\x75\x89" - "\xd0\xb9\xa7\x72\x92\x16\x78\x75\xc9\x15\xe0\x6b\x05\x7c\x15\x95" - "\xf7\x75\x79\x4e\x49\xf8\xda\x59\x14\xf4\x5a\x5f\x2f\x74\x47\xc7" - "\x4b\x3f\x83\x26\xfa\xfe\x25\x3c\xc7\xba\x74\xce\x86\x1c\xf4\x57" - "\x0f\xbb\x40\x63\x0c\x65\x1a\x1f\x80\x7c\x42\xf0\x0d\xbf\x5a\x08" - "\x9d\x53\xca\x9b\xfa\xda\xb9\x40\x74\xd5\x06\x36\x4b\xfa\x75\xfa" - "\x95\xb0\x13\xf3\x5e\xf3\x3d\xff\xcc\x44\x66\x9e\xb9\x8d\x59\xfd" - "\x8e\x5f\xad\x24\x5e\x58\xe8\x0e\x8b\xef\x57\xce\x74\x0b\x1d\xd8" - "\x41\xf7\x04\x39\x56\xbf\x8e\xa1\xb4\x35\x9c\xfe\xd5\x8b\xea\xf9" - "\x4d\x87\x9b\xfd\xda\xb0\xfb\x9c\xa0\xa5\x3a\x84\x4c\xac\xdc\x98" - "\x1e\xd6\x1f\xf8\xb5\xf4\xc3\x41\xd7\x23\x36\xc6\xa0\x4f\x5a\x37" - "\x8d\x77\xd0\xf7\x88\xfe\x79\x35\x49\x95\x21\x75\x88\x79\x05\xda" - "\xbc\x04\xfc\xe2\x29\x27\x74\x52\xb1\xa7\x11\x2d\x97\x26\xf8\x0d" - "\xa2\xcb\x15\x9a\x3f\xe1\xfe\xff\x6a\x2d\xe4\xac\xa3\xe2\xef\x1d" - "\x8c\x89\x77\x2a\x26\x97\x0a\xbd\x93\x8a\xe4\x54\xba\x1a\x68\x2d" - "\x80\xcf\x36\xd2\x9c\xc3\x35\x81\xae\x8b\xe9\x9a\x48\xcf\x2d\x98" - "\x97\xc4\x6f\x9b\x11\x8f\xa7\x3f\x6e\x72\xf1\x58\xba\xe3\x80\x8d" - "\x6b\xcb\xbf\x32\xa9\x5b\xf7\x6b\x0f\x62\xb1\x64\xec\x62\x6c\x4d" - "\x90\x0f\x5a\xae\x67\x93\xa8\xbf\x9e\xa2\x5d\x38\x03\xff\xb5\x73" - "\xe4\x19\xf8\xaf\xdd\x8c\x1d\xb6\xd0\x8f\x72\x0e\x13\x1d\xf9\x6b" - "\x4f\xf8\x77\xd8\xed\x77\xfc\xda\x43\x70\x94\xbe\xa6\xc6\xb5\x5e" - "\x7f\x2d\x62\xe4\x55\x81\x87\x8b\xf9\x74\xb1\xec\xef\xcc\x6a\x4a" - "\x1b\x78\xdc\xcc\x0e\xb5\xbf\x39\x94\x4e\xb0\x14\xd1\x1e\x1c\x47" - "\x30\x99\x4e\x7d\x8e\x4b\x4e\x45\x7f\xd1\xde\xfe\xb8\xb8\xcc\x48" - "\xbd\x79\xd4\x89\xfe\x7b\xe3\xe8\x3d\x82\x25\xff\x52\xb1\x57\x83" - "\xa7\x0a\x27\xe8\x1a\xeb\xfb\xa9\x0e\x49\xb3\x51\x79\xaa\x43\x2b" - "\x3f\x0c\x7b\x2a\x27\x78\x5a\x2a\x47\xfc\xbb\x41\xd3\xc9\xf7\x3b" - "\x0e\x77\xbe\xb1\x52\x9e\xab\xe0\x5d\x5f\xc4\xbb\xb0\x83\x1e\xf1" - "\x7e\x5c\xc4\xd8\x4d\x87\xaf\x80\x53\x69\x72\xec\x26\x57\xab\x6d" - "\x49\x94\x6d\x31\xa6\xd1\x1c\x3b\x2b\xdb\x73\xb8\x75\xac\x35\x56" - "\x78\x23\xd1\xa8\x44\xb9\xcf\x91\xbc\xeb\x3c\x57\x92\x8f\xb9\x6a" - "\x15\xa6\x54\x1a\x8b\xd3\x0a\xb9\xb3\x97\xfd\xe6\xc5\xf6\x40\xdf" - "\x38\xf7\xf4\xdf\xc8\x18\x69\x83\xc5\xcc\x55\x70\x07\xce\x69\xd9" - "\x39\xf6\xda\x07\x2e\xaf\xb0\x51\xc2\xbd\xd0\x87\xc4\xf9\x34\xf6" - "\x37\xf8\xfe\xd5\xe4\x04\x0a\x95\xad\x43\x3e\xe5\xc1\x6e\x72\x77" - "\xc4\x33\x5e\x39\x39\x47\xae\xb5\xd7\x2a\x40\x1f\x89\xf6\x06\xff" - "\xc9\x89\x36\x2b\xe5\x93\x73\xd0\x87\x22\xe8\x0e\x07\xfd\x4e\xac" - "\x15\x4b\x3e\xe4\x9e\xaf\xad\xa0\xf9\xc8\x95\x8a\xc9\x39\xe3\xeb" - "\xc3\x6b\x73\xf1\xcd\xa2\x20\x3f\xe7\x8d\x9b\x0c\xb9\xbf\xbe\xaa" - "\x70\x82\x61\x41\x2d\x77\xf6\xc7\x1b\x8b\xfd\x8e\xd7\xca\xdf\xb0" - "\xcb\x31\x1b\x67\xbd\xe5\x5a\xdf\xeb\xd4\xbe\x13\xbc\xc4\x9c\x9d" - "\x53\x23\x7d\x2a\x53\x99\xe6\xb1\xf7\x32\x63\x36\xf6\x32\xda\x33" - "\x2e\x49\x58\xbc\x9e\x38\xbc\x67\x8c\xab\x1d\xaf\x27\x7e\x8e\x6f" - "\x0c\xa9\xdf\xb0\x7f\xc1\x6f\x8c\x6d\x1f\x23\x79\xf4\x19\xc4\xfd" - "\x47\x8f\x9f\xff\x7d\x5d\xf0\xbf\x84\x57\x73\x24\x2e\x7d\x63\x6d" - "\x88\x78\xd0\xa0\x71\x66\xb5\x88\x43\xad\x67\xc5\x2e\x77\x90\x05" - "\x4b\x3f\x5d\xdc\x66\x1f\x64\xce\xfc\xf7\x59\x0f\x73\x8a\xf8\x07" - "\x6d\x79\xe0\x3b\x67\x76\x0c\x55\x1a\x3b\x86\xf4\xaf\x23\x56\x4f" - "\xce\x2e\xf8\xaf\x8e\x98\x67\xed\xbe\xf7\x99\x2b\x1b\xb2\xe2\x0e" - "\xc8\xe8\x3b\x08\x6f\x54\x2b\x84\x33\x88\xcf\x08\x09\x78\x10\x0d" - "\x26\x78\x46\xe2\x3b\x05\xcf\xe8\x15\x7e\xdd\xe2\x88\x76\x37\x72" - "\x47\x79\x10\x72\xfc\xd0\x50\xa6\xc5\xef\x60\x8b\xe1\x4b\x1a\x32" - "\x74\x6e\xe8\x4a\xcb\x08\x46\x71\xc1\x13\x12\xff\x02\x9f\xd2\x2e" - "\x9f\x9b\x85\x88\x17\xa8\x1d\x60\x89\xb5\x44\x3f\x13\x2e\x4f\x00" - "\xbe\xdf\xad\xfa\x94\xae\x18\x08\xfb\x94\xae\x83\xbc\xaa\x93\xee" - "\x07\x58\x74\xa8\x62\x8a\x7d\xe7\x00\x4b\xde\x95\xcf\xac\x3b\x21" - "\x8f\x3c\x2d\xe9\x37\xd0\x1b\xc2\xbf\xf4\x6a\x2b\xce\x45\xc2\xf4" - "\x1b\x6c\xec\xc2\xf8\x2c\x5a\xc8\x71\xc6\x05\xef\x37\x84\x4e\x56" - "\xb0\x7c\x72\x69\xd0\x98\x9c\x3a\x54\x19\x97\xe9\x66\xce\xbc\x21" - "\xfd\x6b\xa3\xfa\x88\xd0\xf4\x4f\xb6\x45\xf8\x04\x7f\x23\x59\xe2" - "\x7d\xaa\x6b\x4c\xdf\xc4\xa1\x9d\x99\x6c\x8e\x87\xa5\x48\xfb\x96" - "\x18\xda\x2b\x7f\x9b\x04\x9d\xc4\xc2\x27\x99\x39\xb4\x73\x89\xae" - "\xe8\x47\x2c\xca\x15\x4c\x63\xf8\x15\x7e\xc6\xfb\xe6\xac\x64\x29" - "\x38\x4b\xc1\xb9\x8f\xe5\x69\x94\x7f\xe3\x6c\x72\x01\x4b\x89\xac" - "\xfb\xc9\xf5\xb9\x2b\x6e\x4f\xf9\xee\x72\xcb\xe3\x2b\x72\x9f\x5c" - "\xb7\x34\x77\x39\x4b\x97\x2a\x1c\xc2\x65\xe6\x7a\xe8\x6f\xac\x5b" - "\x91\x97\x63\x79\x6c\x6d\x6e\xee\xf2\x55\x79\x96\xfb\x17\x2c\xfe" - "\x73\xbf\x49\x3b\xcd\x7b\x84\x9f\x3c\xa1\xdb\x77\xa4\x8d\xff\xf0" - "\x2b\x03\x95\xf9\x2c\xda\xb4\xe9\xbe\x87\x4c\xc1\x74\x8b\x8c\x2b" - "\x71\xc4\x0b\x5d\x5a\x5e\x94\x59\x23\x69\xed\x23\x9f\x49\x9e\xd0" - "\xdd\x22\x6d\x36\x8f\x08\x39\x31\xf7\xa7\x27\xc9\x35\x75\x44\x17" - "\x95\xc7\x70\xff\x24\xee\x4d\x79\xac\xd4\x39\x1d\xe7\xf5\x47\xe4" - "\xb9\xca\xce\x45\x3a\xad\x9c\x56\x46\x3e\xff\xad\x1b\xcf\xeb\x84" - "\x0f\xb1\xdf\x5a\x09\x3e\x53\xfd\x8e\x23\x66\xb7\xfe\xad\x7a\xcd" - "\x6e\x5d\xea\xdf\x1d\x11\x7e\x84\xf8\x0f\xaf\x1b\x50\xeb\x59\x4c" - "\xdf\x9b\x4c\x65\x17\xd2\x18\xb4\xaa\x7a\x7a\x37\x74\xab\xed\x92" - "\xba\xb0\xbf\xbd\x4b\xea\x9a\x1c\xc9\x89\xb0\xd7\x13\xb6\x8a\xd8" - "\x33\x55\x5a\xd5\xaf\xd6\x57\xae\xe1\x04\x2a\x5f\x43\xf4\x9e\x65" - "\xfc\xb8\xf0\x88\xb4\xab\x1c\x61\x1f\xae\xc2\x69\xa7\xf9\x25\xc2" - "\x0f\x49\x67\xd8\x6f\x8b\x2f\x9f\x2f\xc3\x23\xf8\xf5\x55\x8f\xad" - "\x7e\xd2\xb6\x34\x6f\xc5\x77\x56\xac\x5c\x91\xb7\xfe\x2e\x11\x20" - "\x45\xfc\xfb\x5f\x37\x2f\x7b\xe8\x72\x9f\x97\xb3\x20\x27\x82\x6d" - "\x14\x78\x7d\xc8\xe7\xa0\x63\x21\xe5\x75\xcd\x5b\x85\x6f\xbb\x71" - "\xb5\xbd\x59\xb5\x9f\x6c\xde\xe6\xd6\xbd\x27\x75\x1d\x88\xcf\x70" - "\xde\x14\x42\x7d\xe2\x59\xbf\x31\xd9\x62\x99\xce\xe6\x75\xb3\x96" - "\x79\x38\xb3\x23\xf8\x65\x62\x3f\xac\xdc\x80\x7d\xcb\xcd\xda\x82" - "\x77\xa8\x71\xed\xde\xdc\x0e\x18\x80\x56\x24\x18\xec\xe9\x66\x6f" - "\x4a\x1e\xfb\xbc\x79\x0f\x74\x97\x94\xf3\xe6\x97\x30\xb7\xd0\x5e" - "\x85\x67\xee\xe4\x3c\x73\x87\x72\x3e\x67\x27\x3f\x9f\xb3\x23\xec" - "\x6f\xe7\xcd\x3c\x7a\x77\x1f\xbd\xbb\x1e\xfe\xfb\x2b\xcf\xb1\x7d" - "\xd0\x07\x40\xda\x94\x97\xc0\x42\x46\xe3\x62\xb4\xc7\xd5\x97\x22" - "\xe8\xf0\x1e\x2a\xef\xf2\xdd\xc1\x88\xc6\xcc\x84\x3e\x86\x3c\x7b" - "\x24\x3a\x90\xde\x73\x51\xbb\x5c\x7d\x83\xe0\xeb\x17\x2b\x44\x0b" - "\x52\x5f\xf7\xd0\xfe\x59\x8c\x7a\xa1\x0f\x42\xf4\x2a\xd1\x67\x6f" - "\x96\xbb\xd9\x6f\xb5\x33\x4f\xa1\x0b\x32\x72\x1c\xdf\xdc\x4f\x70" - "\x9e\xa4\xf9\xf8\xc4\x5e\x02\x9e\x21\x6c\x17\xf9\xe6\x07\xe8\x23" - "\xce\xf3\x1f\xf0\x71\xa5\x4e\x3c\x7b\xc7\x1e\x71\xbe\x8e\x32\xc2" - "\xbf\x35\xf4\x59\x6c\x1b\x10\xe7\xf4\xad\x29\x72\xbe\xbc\xb3\xce" - "\x5b\x94\x13\xa5\xd6\x1b\x42\xbd\xf0\x23\x23\x61\xf9\xd6\xed\xae" - "\x2d\xe7\x34\x3d\x12\x6a\xc7\x5b\x1f\xa8\x75\x78\xb0\x96\x15\xc7" - "\x91\x20\x74\xa9\x85\xdf\x48\x69\x8b\xa4\x23\xfe\x14\x7e\x8a\x12" - "\xea\xa6\x4a\xff\xb2\x7e\xc7\x5b\xc3\xf3\x9f\x1b\x25\x2d\x08\x7a" - "\x0c\xf1\x49\x30\xff\x41\xdb\xa1\x7d\x98\xff\x54\xff\x36\x9c\xdb" - "\xcb\x75\xf0\x56\xfd\x17\x5b\x07\x6f\xd5\x6b\xb0\x90\xfc\xe3\x5b" - "\x29\x5c\x5f\xc4\xe7\x94\xb3\x6c\xa1\x5f\xa1\xda\xdb\xd1\x1e\x32" - "\x57\xe2\x96\x96\x19\x42\x37\x26\xdf\x53\x4f\x38\xbe\x78\xf7\x20" - "\x33\x2a\xa5\x5d\xa9\xa0\xc5\xdb\x0a\x84\x5e\x8a\x81\xde\x6b\x84" - "\xde\x0a\xf4\xf0\xe2\x45\xec\x9b\xf7\xd9\xee\x8b\x2c\xba\x87\xbd" - "\x6d\xc5\xd9\x56\x78\x1c\xde\xde\x88\x33\x4d\x5e\xf6\x96\xd7\x54" - "\xa0\x2f\x45\x1d\xca\xc0\xd9\x54\xed\x3d\xd8\xc5\xe1\xbd\x6e\xf6" - "\xf6\x52\xf1\x1e\xca\x02\x66\x85\x09\x4b\x88\xe6\x12\xe5\x83\x44" - "\x8b\xd5\x29\x09\x8b\x39\xed\x0d\xa1\xfc\x60\x23\x3d\x7b\x48\x29" - "\x8f\xcb\xa4\xbc\x4c\x71\xa6\x32\x64\xc6\x99\x2b\xe3\x86\x53\xe9" - "\xae\x9e\x53\x4e\xd1\x1e\xe8\x9f\xe6\xd1\x3e\x2a\x78\x97\xb7\x5f" - "\xa9\x3b\x4d\xe3\x31\x4d\xc4\x06\xa1\x71\x6e\x11\xf1\xe8\x68\x2e" - "\x36\xc8\x36\xb6\xdc\xd7\x5f\xe6\x4a\xe9\xa7\xb9\xea\xd3\x1b\xd8" - "\x11\x33\xcd\xd5\xf2\x64\xcb\x11\xf3\x20\x8d\x55\x4b\x22\xe1\x3e" - "\x55\xbf\x41\xbe\x87\x39\x1a\x65\x8e\x1f\xa2\x67\x29\x9a\x9e\x94" - "\xd4\x55\x7a\xdb\x00\x98\xd1\x7c\x6e\x69\x5f\x09\x7d\x37\xa5\x95" - "\xbe\xc1\x42\xf9\xca\x71\x9c\xf7\xc3\xa6\x00\xfc\x4e\x86\x9d\xf7" - "\x83\x7f\x83\x1d\x16\xce\xf8\x61\xa3\xb8\x8b\xf8\x5f\xd4\x4b\x75" - "\x6e\xd1\xec\x08\x2b\x28\x4f\xcc\xfb\xa8\x6f\x9f\xae\x7c\x42\xac" - "\x39\xe8\x86\x1a\xc5\xf9\x46\xd4\xf7\x4e\xd3\xbc\xee\xaf\x3b\x27" - "\xce\xe5\xfa\xeb\xd4\x7a\xe0\xa7\x80\xea\x68\xd1\xea\x50\xf2\x79" - "\x0f\xf4\xf2\x42\x03\xdc\x2d\xdf\x97\xfa\x1b\x0f\xf8\x14\x61\x23" - "\x83\xf7\xa5\x1e\x47\x4b\x30\x42\x2f\x9e\xf0\xce\x3b\x46\xcd\x8f" - "\x01\xdd\x9b\x35\x7e\x1d\x30\xea\x2f\x37\x2e\xf6\xd1\x5a\xf7\x95" - "\x4f\x26\x3a\xf5\x9d\xb9\x84\xef\xb7\x5d\x41\x46\x10\x0d\x9c\x08" - "\xbb\x5f\x25\xb6\x2b\x1b\xb6\xbf\xf0\xb5\x29\x75\xdb\xdf\x79\x5e" - "\xb5\x03\x8e\x3a\xc7\xde\xf9\x66\xf8\xbc\x3f\xa4\xca\xa8\xdf\x39" - "\x2c\xf9\x8b\x77\x0e\x0b\x19\x75\xa5\x31\xe5\x27\x1b\x02\xfa\xc6" - "\x0d\x6e\xbd\xf4\xed\xfa\x4e\xa3\x9b\x38\x00\x4d\x2f\x8d\xca\xd9" - "\x50\xd7\xe8\xf6\xd2\x6e\x8b\xac\xf3\x5d\xc1\x47\x87\xf9\xf8\x77" - "\x85\x5f\x39\x9c\xcd\x2b\xa0\xed\x62\x3f\xcd\x86\x3e\x97\xcb\x76" - "\x01\xb2\xea\x89\x52\xa6\x20\xcb\xa8\xba\x93\x57\x9d\x19\x99\x9e" - "\x8a\xb4\x84\xd9\xbb\x69\xda\xb9\x57\xa5\x5e\x71\x9b\x74\x8c\x17" - "\xd5\x13\xee\xb3\xf9\xe0\x7f\xc0\xeb\x22\x5a\x11\xb1\x45\x6d\xb9" - "\x88\x63\xf4\xee\x5a\xf8\x34\x97\xeb\xed\x5d\x61\x37\xa7\x38\xe6" - "\xf3\x22\xf0\x4b\x5e\x8f\xf0\xb7\x40\xe5\xa6\x50\xb9\x1f\x35\x17" - "\x78\xa0\xa7\x36\x0b\x71\xb6\x7a\xd4\x6f\x7b\x63\xdc\x96\x99\x46" - "\x46\xbc\xdd\xbb\x87\xdc\xac\xb6\x7a\xfc\x38\xe1\xdd\x43\x57\x92" - "\xc7\xca\x7e\x1d\x4d\x0e\x8f\xc9\xc7\xea\x98\x1c\x4d\xfe\x4b\xba" - "\x12\x2a\xed\x7d\xf5\x19\xd6\x76\x35\xe4\x43\x74\x7f\xc3\x19\xd6" - "\x2a\x70\xad\xd4\x43\x6e\xfd\x50\xbd\xa7\x6f\xb4\xbe\xa1\xde\x5f" - "\x47\xf7\x7b\xd5\xfb\xe9\x74\xff\x03\xf5\x9e\xe0\xdd\xba\x5e\xbd" - "\x4f\xa4\xfb\xa5\xea\x3d\xad\xe3\xd6\xaf\xab\xf7\xd3\xe8\xfe\x76" - "\xf5\xfe\x5a\xba\xbf\x56\x3d\x63\x36\xf4\xb2\xd6\x09\xe3\xa7\xff" - "\x8f\x76\xc8\xbd\xb7\x35\x81\xd6\xb2\xea\x47\x67\x38\x2f\xd9\xcd" - "\x9a\x0a\xb4\x73\x24\xca\x6f\xc1\x77\x28\x7f\x1e\xcd\xbf\xb4\x88" - "\x7c\xd5\x37\x7b\xeb\x43\xc4\x4f\x34\x45\xe4\xef\x53\xf3\x57\x52" - "\xf9\x96\x88\xfc\x7a\x35\x9f\xd6\xff\x2f\xa2\x23\xf2\xb7\xa9\xf9" - "\xb5\x9a\xee\x86\x9a\x5f\xaa\xe6\xd3\xf8\xef\xdd\x17\x91\x5f\xa0" - "\xe6\xb7\xd2\x18\xfb\x22\xf2\x05\xcf\x2c\x7d\xed\x99\xf8\x91\x82" - "\xb9\x84\xdb\x5a\xbd\x6e\x76\x70\x4f\x44\x99\x65\xf2\xdd\x36\x82" - "\xc1\x81\xd6\x88\xfc\x4c\x35\x9f\xf6\xea\x4b\xe5\x11\xf9\x8b\xc6" - "\x9a\x43\xba\x1a\x36\xaa\x3c\x07\x72\x5c\xd0\x8d\x42\x17\x55\xd0" - "\x91\xed\x8f\xc0\x3e\xc6\xb4\x8b\x77\x5b\x0a\x39\xef\x66\xed\x0b" - "\x55\xbd\x4c\xab\xdc\xaf\x30\xe7\xdb\x6f\x13\xb6\x27\xf0\xf5\x06" - "\x3b\xa3\x0d\xb0\x33\x6a\x13\x67\xe6\x73\xec\xc5\xd2\x0f\x9c\xe6" - "\x53\x18\x32\x01\xf5\xcc\x97\xca\x7c\x08\xd9\x29\xea\xc1\x1e\xee" - "\xca\x1b\x94\x3e\x02\x89\x77\x40\x1e\x78\x63\x61\x8f\x12\xc1\x9b" - "\xc9\xf5\xd8\xfe\x88\x32\x08\x5b\x3e\x29\x3f\xc0\x5e\x8f\xf2\xd0" - "\x57\x8a\x2c\xeb\x66\xed\x42\xb6\x18\x65\x36\x9d\xf0\x3b\xda\xe7" - "\x85\x6d\x2a\xda\xb6\xa9\xf9\x44\xc7\xb4\x3f\x14\x91\xff\x67\xb4" - "\x66\x18\x3f\xd1\xde\x61\x78\x3b\x75\x68\x80\xfb\x82\x03\x3c\x50" - "\xf9\x27\xa9\x77\x4c\x38\xe8\xfa\x50\xe9\xdb\xe9\xb0\xa9\x40\xac" - "\xa1\x60\x3e\xf7\x42\x27\x8e\xf2\x27\x3f\xe0\xf3\x12\xee\xf7\xf3" - "\x8a\xef\x40\x87\xf2\x22\xc3\x99\x5c\x91\x07\x71\x20\x4c\x1c\xb6" - "\xab\x1b\xcf\x32\x63\x3b\xe1\x1e\xe8\x27\xe3\xbc\xec\xfe\x1c\x2f" - "\x6b\xcb\x09\xb1\x3a\xaa\x7b\xd7\x77\x34\xbc\xdf\xee\x0b\xdb\x47" - "\xbe\x8d\x33\xcc\xeb\x8b\x44\x4c\x35\x97\xf0\x9f\x86\x78\xed\xbc" - "\x22\x39\x9d\xff\x16\xf4\xc8\x64\x9b\x69\x13\xa3\x39\xe0\x4a\xa1" - "\xfb\x6c\xf9\xa3\x67\x94\x3f\x56\x9f\xe4\x3a\x75\xad\x54\xcf\xaf" - "\x9a\x24\x2e\x70\xad\xe4\x3f\x86\xad\x85\xcb\x46\xb8\xc4\x4a\xb4" - "\xcf\xa8\x3e\x80\x36\xee\x62\xfa\xa1\x32\xda\x33\xce\x35\xe9\x25" - "\xee\xe9\x58\xa2\xe8\x0d\x9b\x20\xb7\x14\x71\x95\xca\xba\x6c\xfb" - "\x56\x05\xf4\x6d\x1b\x7a\xd8\xd3\xd7\x32\xf3\x92\x80\x9e\xca\xb8" - "\xfe\x18\x9f\x47\xdf\xa6\xbd\x82\x68\x07\xfd\x7f\xd0\xf3\xd7\x56" - "\x35\xe9\x83\x62\x1f\xe9\x58\x22\x64\x5d\xa5\x5d\xe9\x38\x2b\x73" - "\x75\x86\x40\xf7\x18\x89\xee\x49\xe5\x6b\xac\x86\xd0\xba\x9c\xa9" - "\xc1\x35\x39\x93\x77\xe5\x32\x63\x68\x8d\x35\xf1\xb9\x01\x96\xaa" - "\xc5\x6b\x22\x5e\x38\x85\xfb\xcd\xb1\x55\xf9\x6c\x16\x78\xe5\x78" - "\x5d\x82\x38\x7f\xc4\xbd\xa2\x7f\x25\xa1\x2e\xff\xca\xb1\xe1\x42" - "\xc4\x23\x23\x1e\x16\xda\x32\x5a\x5f\xcb\x77\x10\xdf\xad\xda\xe2" - "\x15\x9e\x64\xd3\x6c\x8f\x33\x7d\xfc\x45\xee\x3c\xb3\x92\xe9\x11" - "\x57\xab\x70\xb9\x90\x47\x4d\x68\xcb\x09\x32\x97\xbd\x8b\x15\xe6" - "\x62\x8c\x3a\x5e\xc6\xfe\x09\x9d\x58\x2a\x9f\x70\x86\x75\xbc\x61" - "\x0a\x30\x3d\xfc\x62\x3b\x9f\x00\xdf\xd1\xf1\x81\x4f\xf8\x6d\x79" - "\xcf\x0c\xdb\x39\x67\xee\xbd\xc8\xfb\xac\xe8\xa4\xd0\x17\x99\x25" - "\xed\xf5\x3a\x5a\x91\x2e\x82\x6d\x60\xec\xc7\x99\x07\x06\x03\x13" - "\xa4\xcc\xa3\xa3\x4d\xc5\xfd\x16\xc9\x27\x75\x8c\x29\xe3\x53\x4a" - "\x8f\x66\x72\xc4\xe8\xa8\x05\x5d\xc1\xdd\xe2\x6c\x57\xc4\xb7\x9e" - "\xef\xe4\x03\xd5\x4c\xda\x02\xbd\xf7\x03\x65\xeb\xd1\x4c\xe8\xbe" - "\xd0\xbd\x88\x65\x23\x64\xa7\x5b\x8f\xe6\x08\x79\xe3\xd6\xa3\x76" - "\x21\x3b\xdd\x7a\xb4\x74\xf3\x74\xe8\x88\xbf\x57\xdd\x1f\x73\x94" - "\xf8\xbe\xf7\x96\xf5\xc7\xf6\x8c\x7a\x26\x29\xf6\x9a\xd2\x96\x52" - "\xcb\xf5\x2c\x11\x32\xfb\xac\x90\xf4\x67\x24\xd7\xf0\xfb\xdb\xf8" - "\x56\xf1\xec\x86\x6e\x1b\x8b\x92\xb4\xfb\x7b\x27\xe6\xd4\x32\x0b" - "\xb5\x35\x8e\x1b\x8e\xa6\x0a\x7d\xb7\xd2\xa3\xe9\x2e\x0f\xfc\x8f" - "\x87\x98\xa4\x8d\xdf\xaf\xe7\x31\x47\x53\x65\xf9\xf7\x6f\x6f\xf7" - "\x50\x1f\x0c\x47\x0d\xae\xc0\x59\x75\xaf\x7e\x3f\x85\xda\x48\x73" - "\xfb\xa8\x59\xda\xd8\xbe\xbf\x49\xc3\xab\x72\x8e\xbe\xbf\x56\xce" - "\xf5\x96\x52\x09\xb7\xf7\xeb\xd5\x7d\xe9\x06\xdc\x13\x9d\x90\x22" - "\xf5\x16\xde\x5f\xa9\xd1\x2e\x6e\xb5\x0c\xde\xa1\xfb\xc5\x12\xd7" - "\xbe\x4f\xfc\xcf\x7b\xc9\xea\xf3\x14\xe4\x51\xff\x08\x2f\xbf\xd7" - "\x82\x7e\x8d\x85\x5b\x05\x2c\x0a\x58\x14\xb5\xd9\x0a\x7d\x61\xf0" - "\x77\x2e\xdf\x7c\xa7\x4b\x8c\xc1\xb1\x5b\x84\xfd\x21\x7d\x07\xb1" - "\x02\x80\x37\xa9\xce\x68\xd4\x17\x6e\xff\xef\xe2\xb4\xb6\xe0\x7b" - "\x78\x46\x7d\x15\xfa\xf1\x04\x2b\xa1\x67\x8f\x71\xed\xb5\x41\x56" - "\x72\x91\x60\x06\xdd\xa9\x63\xa9\x80\x89\x84\xd9\xb1\x44\x95\x1f" - "\x52\xc7\xe1\x58\xcc\x48\x78\xc8\xb4\x62\x20\xdc\x90\x0b\x1d\x9a" - "\x63\xa9\x2a\xfc\x54\xdf\xb9\xbf\x3b\x29\xe0\x25\x9e\xfd\x6e\x57" - "\xc4\xbb\x33\x86\xcb\x52\xbb\xa1\xf3\x88\xf3\x68\xc8\xfc\xe5\x7c" - "\xfd\x5d\x4b\xc4\x7b\x2d\x59\x9f\xa5\x31\xc4\x5d\xdb\xfc\x82\x88" - "\x45\x92\xe2\x77\xfc\xee\x78\x18\xde\xb2\x9e\x51\xbe\x71\xbd\xf6" - "\x0d\x37\xfb\x5d\xad\xd6\x4e\xba\xb7\xc9\x31\x39\x66\x09\x8f\xc9" - "\xef\xd2\xb4\xf7\xc0\x37\xd3\x18\x79\x10\xd7\x67\x0c\x7f\xa7\x3a" - "\x57\x12\xe1\xe0\xe0\x7c\xa7\x98\x8f\xec\x58\x0d\xf4\x94\x09\xae" - "\x56\x39\x87\x8e\x15\xc8\xbd\xf0\x98\x90\x57\xe0\xdc\x46\xfa\xbf" - "\x3e\x56\x4d\xf5\xee\x53\xdb\xbc\x47\x6d\xc3\x1e\x6a\x43\xed\x98" - "\x76\x2d\xc3\x76\x6b\xc7\x5a\x23\x6c\xf5\x16\x4a\xd8\x7e\x60\xe6" - "\x03\x7c\x1b\x6c\x0b\x78\x3e\xaf\xa9\xa4\xf1\x29\xba\xc8\xae\x81" - "\x2f\x94\x42\x1b\x3f\xd5\x6e\x23\xbe\xc7\xd0\x55\x4d\xb8\x61\x5b" - "\xe1\x45\x36\x09\xba\x26\xc0\x2d\x90\x25\xf0\x98\x2e\xf8\x06\xd8" - "\x16\xb6\x27\xfa\xfd\x2c\xd8\xfd\x11\x3f\x8e\x98\x97\x0d\x18\x6b" - "\xe8\x1f\xf7\xb2\xdf\xd3\x1a\xee\x6a\xa0\x67\x79\x15\x82\x27\xeb" - "\xf2\x84\x0c\xee\xa4\xa2\xb3\x6c\xa2\x88\x4b\x61\x0f\x30\xcb\x13" - "\xb0\x3b\xf9\x60\x3d\xd5\xe9\xa1\xfc\x78\x91\x1f\x08\xc0\x76\x1c" - "\xb6\x0b\xf1\xf4\xec\x15\xba\x2a\x54\x87\xbd\x92\xda\x5d\x78\x96" - "\x5d\x4f\x6d\xe9\xa3\xef\x78\xa8\x9d\xbd\x45\x4f\xb2\x69\xed\xb6" - "\x3e\xd0\xd4\x54\x9f\x9b\xa9\xfe\x15\x3c\xdd\xec\xf7\xb7\x51\xbf" - "\xec\xe0\x2d\x61\xab\x57\x41\xd7\xc2\x10\x8b\x2f\xdc\x48\x7b\xda" - "\x46\xfa\x3e\x95\x47\x3d\xf0\xa9\x20\xdb\x42\x7d\x83\x5c\x82\xea" - "\xdd\xe8\xe1\xbd\x54\x77\x5f\x9b\x87\xea\xb3\x77\x8a\x3a\xdd\xe8" - "\x23\xd5\xab\xea\x28\x59\xe4\xf9\xf2\xef\x93\xb5\x73\x52\x37\xfb" - "\x60\x21\xfa\x39\xba\xdf\xd2\xdf\x2f\x1a\xe9\xeb\xe3\x0f\x49\xf0" - "\x9b\x48\xf9\xcb\x34\xbf\x1c\x74\x6f\xa3\xba\x1a\xc5\x18\x45\xf8" - "\x48\xa9\x8c\xf0\x91\x52\xe4\xe5\x27\xd0\x16\x9b\x88\xc1\xf5\xfb" - "\xc3\x7c\xab\x3b\x49\xfa\xfe\xfc\x83\x58\xa7\xd4\xe7\xe3\x94\x36" - "\x49\xd9\xe1\xef\xdb\xd4\x39\xd9\x90\x11\x0a\x9a\xdc\xf4\x4d\x5a" - "\xbf\x0d\xe1\xf4\xef\x9b\x61\x9b\x48\xe5\x42\xd2\x87\xda\xef\x0f" - "\x8f\x2c\x2f\x9e\x17\x5f\x96\x4e\xbb\x2c\x6d\xf1\xd1\x78\x8e\x75" - "\x1e\x5c\x31\x5d\xc8\x11\xd2\xe3\x37\x31\x5b\xd1\x69\x16\x45\x70" - "\x3e\x89\xb6\xb5\xf7\x09\x1b\x19\x13\x77\xa4\x30\x57\x5f\x50\xd2" - "\x2b\xb4\x4f\x74\x27\x53\x99\xd3\x6c\x1a\xf4\xab\xe1\x1b\x95\xca" - "\x9f\x91\xfe\x50\x3b\x5f\x5c\xb2\x36\x96\x29\xdf\xcd\x9c\xcc\xf5" - "\x8f\xd8\x68\x4f\x30\xec\x1f\x74\xc3\xa7\xa8\xae\x70\x3b\x4b\xc2" - "\x18\xd2\x58\xf6\x20\x26\x28\xbd\xe3\xf9\xc9\x60\xdf\x04\x57\xb0" - "\x8b\xd9\x68\x6e\x9d\x61\x9d\x35\xd1\x05\xc4\xef\xf7\xb2\x04\xe2" - "\xb9\x83\x47\x82\xa9\x4c\xb3\xeb\xad\x9d\x2a\xed\x23\x6b\x69\xcd" - "\xae\x31\xf3\x80\xdf\xf1\x07\xa2\x7f\xfe\xb3\x58\xb3\xdb\x2b\x97" - "\xfe\x4e\xa3\xe9\xfb\x4b\xf5\xaa\x0d\xb3\x84\x6d\xe7\xed\xd2\x3e" - "\x6a\xea\x97\xfc\x8e\x4e\x6b\x98\xa6\xeb\x3c\xa4\xca\x61\xd3\xe4" - "\x1a\xeb\x3c\x74\x84\xa8\xe8\x2d\xf2\x5c\x3d\x91\xca\x3e\x34\x7c" - "\xae\x2e\x78\xd4\xce\x43\x34\x86\x69\x92\xde\x73\xa7\x65\x85\x0c" - "\xea\xbe\x82\xfc\xb7\x0d\x78\x97\xde\x33\xc9\xb8\x0d\x9d\xd5\xe1" - "\xb9\xd6\x89\x3d\x56\x47\x7d\x22\xbe\xfc\x0f\xad\xe8\x17\x60\x42" - "\xe5\xa2\x29\xdd\x71\x64\xcf\x18\x7e\x7d\x0d\x6f\x37\x05\x1d\xe2" - "\x8c\xd8\x4a\xf3\xe9\x2c\x8d\xc1\x55\xf0\x63\xe2\xa2\xef\xb4\xd5" - "\x0d\xb2\x36\x73\x3f\x6b\x5f\x06\x5b\x2e\xa2\x99\x9f\xf8\x84\xf5" - "\x58\x46\xc7\x61\x84\x07\x53\xa9\xcd\xe9\xa8\x0b\xeb\x04\xfa\x51" - "\x2e\xe2\x34\xda\xbd\x88\x45\xca\x44\x1d\x6d\x4a\x1f\x6b\xb3\x9f" - "\x80\xec\x24\xbd\xbd\xae\x8b\xb5\x9b\x7f\x27\xbe\x03\x3a\xc3\x99" - "\xdb\x7f\xa5\xba\x33\xa9\xee\x1c\xb5\x6e\x0f\xd5\x9d\x38\x76\xdd" - "\x93\x6d\xe3\xac\x7b\x1c\xed\x9e\x9c\x3d\x9e\xba\x8b\x6a\x78\x88" - "\x70\x4b\x1c\xe1\x8f\x54\xf8\x55\x82\x6d\x58\x68\x00\x3e\x08\x6e" - "\xe0\x52\xe7\xb4\x6b\x2b\x68\x6c\x71\x96\xb8\xb5\x6b\xae\xb0\x1b" - "\x3b\xc7\x84\xcf\x1a\x57\xf0\x24\x83\x0c\xc8\xef\xe8\xca\x1b\xa6" - "\xbf\xc3\x67\x28\x44\xff\x74\xd5\x48\xbd\xc2\xae\xb9\x72\x5e\x75" - "\x7d\x13\xf5\x8c\x4e\x67\x7f\x94\x2e\xf5\x53\xbb\xde\xd3\xf8\xf5" - "\xfe\x98\x8f\xd2\xd5\xba\x2c\x97\x9f\xad\x6b\x41\xc0\x97\xdb\xf3" - "\xb4\x78\xe2\xd2\xa8\x30\x96\x3d\xb8\xfc\xb1\xe5\x2b\xf2\x97\x2f" - "\xb3\x3c\xb4\x36\x77\xd5\x6d\xab\x1f\x7f\xdc\x72\xff\xf2\x35\x6b" - "\x96\x7e\x77\x79\x2c\x7b\x28\x77\xe9\xaa\x35\x2b\xe0\x0c\xde\x62" - "\x59\x78\x67\x56\xce\xea\xbc\xdb\xee\x59\x98\x72\x99\x9d\x21\x6c" - "\x0c\x8f\x83\xae\x23\x7c\x3b\x8d\x70\xef\x14\xf8\x9f\x30\xad\xe7" - "\xce\xa7\x89\xa7\xa0\xf9\x77\x06\x67\x48\xb4\x6e\x4f\x80\xde\x24" - "\xfa\xe3\x18\x7c\x8f\xed\x7c\x81\x77\xf4\xb2\xb3\x5f\x23\x5a\xa5" - "\x13\x7e\xc6\x88\xd7\x3a\x4e\x7c\x9e\x57\xc6\xbc\x3d\x3b\x83\xca" - "\x34\x3f\x43\x79\xde\x18\x77\x5a\xd5\x9f\x58\x34\xed\x3f\x44\xeb" - "\x7e\x44\x6b\x7f\x12\x2f\x9f\xc6\x9b\xf9\x27\x66\xa6\xfa\xfb\xd3" - "\xbb\xdc\x01\x9c\x35\x1b\x32\x82\x45\x1c\xf8\x54\xae\xad\x8f\x4e" - "\xca\x35\x7a\x34\x53\xea\xed\x7a\x42\xa0\x8b\x37\x8b\x18\x02\x1f" - "\xd1\x9a\xec\xc8\x09\xe3\xe9\x93\xb3\x54\x7a\xa4\x93\xe0\xbe\xae" - "\x9b\xd2\xd2\xc6\xfe\xb8\x65\xa4\x7e\x01\x31\x51\xec\x74\x8e\xfc" - "\xe1\x9d\xd3\x79\xf2\x87\xfb\xc8\x1f\x6d\x28\xe2\x77\x79\xfe\x5f" - "\xfb\xd3\xbe\xff\x85\xeb\xe8\xf9\x0b\xbf\xcf\xf1\x7d\xd1\xef\xff" - "\xc6\xfe\xff\x55\x75\x78\xae\xf4\xc3\x7c\xa3\xb9\x75\xfc\x99\x3f" - "\x31\x03\xcd\xcf\x6d\xc4\x63\x47\x17\xfd\x91\x99\x0b\x82\xbc\xa7" - "\xe8\x11\x96\x54\x78\x9a\x21\x26\x6c\x5f\x9e\x9d\xf7\x14\x0e\x80" - "\x17\x3b\xf9\x1b\x9a\xbf\x4d\x95\xdd\xcc\x58\xd1\xcd\x12\xda\xf3" - "\xa4\xef\x59\xc8\x3e\x61\xd3\xe0\xa2\x74\x6b\x7e\x80\x1d\xf5\x7e" - "\x86\x33\x0e\x67\x7b\x36\xe1\x9d\xe3\x8c\x61\xfe\x1a\xb3\x59\x62" - "\xed\x34\x7e\x98\x3b\xca\x89\x77\x2f\xc7\x77\x8f\x1d\x54\xd2\x26" - "\x1c\xdc\xd0\x32\x01\xf1\x73\xbb\xd9\x9f\x5e\x54\xe7\xe6\x6d\xd2" - "\x66\xe7\xe4\x6d\xaa\x3c\xff\x18\xd1\xbe\xb4\x37\x9d\xdc\x2b\xf7" - "\xf3\x93\xeb\x55\x19\x06\xee\x85\x5f\x58\xea\x47\x13\x62\x68\xa3" - "\xce\x03\x4a\x93\x88\xa1\x7d\x70\x43\xda\x84\x82\xa5\x4c\xdf\xee" - "\x3e\x23\x4e\xc3\x70\xee\x42\xeb\x6e\x1f\xad\xb3\xc6\x5d\xd3\x78" - "\x35\xb5\xaf\xbc\x6e\x1a\x2f\xa5\x36\x35\xf8\x1d\x1f\x27\xba\xd9" - "\x87\x06\x55\xc6\xea\xa4\x75\xb1\xaf\x82\xca\x64\xac\x65\x37\x54" - "\x50\xb9\x4a\x2a\x07\xda\x4d\xb6\xef\x93\x38\x82\xc1\x21\xfa\x66" - "\x87\xe5\x51\xa4\xdd\x42\x06\x86\x6f\x53\x3f\x2c\xdd\xcc\x2d\xe4" - "\x22\xf8\x86\xf6\x5d\xaa\x9f\xf0\xdf\x87\x4e\x55\xde\x5d\x2d\xeb" - "\xf9\x58\xe5\x87\xba\x9a\xaa\x86\x63\x9c\x77\x35\x55\x6c\xa0\x3d" - "\x9d\x78\x6a\xfa\xc6\x36\xfa\x86\xd3\xb4\x89\x71\x13\xec\xea\x8e" - "\x07\x89\xde\x53\x54\xfd\x2f\xf7\xf7\xd5\x77\x05\x0d\x22\xe8\x0e" - "\xe2\xf5\x25\x4f\x4a\xb4\x47\x0e\xe1\x09\xa2\x37\x84\x2e\x32\xd1" - "\x1a\xc8\xa7\x6f\x6c\x83\xdf\x3f\xe2\x15\x0e\xd1\xbe\xdd\x08\x3a" - "\xe1\xd1\x8b\xdf\x60\x22\x16\x20\xd1\x0a\x6b\xec\x3c\x20\x63\x03" - "\xb8\x2d\x1a\xad\x80\xf9\x01\xfa\xa0\xe2\x51\x16\x3d\x44\x63\x4c" - "\x73\xa4\x85\x68\x8f\x29\x67\x98\x7b\x89\x3a\x36\x2d\x82\x26\x50" - "\x63\x22\x49\x1c\xee\x5e\x41\x7b\xbb\x91\xbe\xd1\xe2\x66\x67\x85" - "\xec\x4c\xe2\x20\xb7\x5d\xdb\xe7\x65\x5c\x3f\xf7\x12\x4e\xb8\x8e" - "\xe0\x76\x68\x56\xb6\x8e\xe8\xd0\x8f\x9d\x34\x16\x87\x50\x16\x76" - "\xe3\x54\xbe\x81\xf6\xfc\x59\xea\x98\x1c\xaf\xc8\x07\x0d\xe0\x4e" - "\x41\x3b\xe8\x9d\x56\x82\x35\x7d\xab\xdb\xad\xe2\xb1\x63\x92\x7e" - "\xe9\x7e\x47\x83\x3d\x8d\xf5\x96\x30\xfc\xdd\xbe\x48\xf8\x13\x2c" - "\xb6\xc8\x31\xe8\x5e\x1b\x31\x76\x44\xaf\x77\x2f\x82\xec\x8d\xbe" - "\x77\x58\xca\x0d\x4e\xdc\x06\x1f\x3f\x34\x67\x0e\x13\x2c\x0e\x53" - "\xb9\x26\xe0\xe6\xcd\x7f\x62\x6a\x7c\xfb\xee\xaf\x4a\xfa\xf4\xc4" - "\x31\x19\x03\xfa\x84\x1a\x03\xda\x3d\x57\xc6\x7f\x3e\xf1\xa2\x8c" - "\xff\x7c\x62\x57\x64\x4c\xfb\x70\x3c\xfb\x13\xe5\x9a\xbe\x3f\xe6" - "\x00\xc6\x9e\xfa\x38\x57\xf2\x66\x27\xca\x21\x5f\x11\xef\x0d\xe5" - "\xa0\x8d\xc7\xb1\x3e\xb5\xe7\x88\x71\x4f\xf9\x2c\x02\x36\x73\xd5" - "\x31\x69\x92\x71\x2f\xba\x6f\x93\x6d\xeb\x36\x50\xda\x40\x6d\x10" - "\xfc\x1d\xe2\xdd\x57\xe1\x9d\xc2\xf0\x3b\x58\x3f\x34\x97\x4d\xf4" - "\xce\xcd\x74\xe5\x5a\xd9\xdd\x83\x28\x73\x62\xdf\x73\x83\x90\xaf" - "\x9c\x68\xee\x1f\xb2\xea\xe9\xbb\x01\xfa\xae\x1e\x73\x03\xf3\x42" - "\xab\xa3\x4a\xc2\x68\x1f\x8d\x9f\x98\x5f\x47\x82\x4d\x04\xf7\x6e" - "\xe2\xff\xdb\x16\x4b\xda\xee\xc4\x3e\xb5\x7d\x4e\xe9\xdf\xb6\xeb" - "\x38\xe2\x0d\x4a\x7f\x33\xdd\xdb\x86\xcf\x0a\x87\x69\xcc\x13\xfb" - "\x30\xf7\xa8\xae\x56\x75\x4e\x98\xa8\xdc\xe1\xe1\x39\x24\xec\x84" - "\xbb\xe7\x81\xce\x54\xdb\x8f\xb9\xf7\x55\x09\x3b\xf7\x71\xcc\x01" - "\xa2\xe1\xd3\xe4\x38\xbb\xe7\x82\x4e\x95\xf3\xf0\x13\xa6\xd5\x21" - "\x6d\x8d\x4f\x94\x2b\x54\x87\x36\x57\x22\x71\x03\x95\x9d\x45\x34" - "\xe9\xf0\xbc\xd1\x70\x81\xac\xb3\x67\xb9\x4a\x87\x58\x69\x6c\xe0" - "\x93\xd1\x09\xba\x5d\xce\xcb\x9e\xd4\x23\xbe\xa0\x88\x81\x4d\xed" - "\x22\x9c\xf0\xc9\xf3\xfd\xb1\x3d\xd6\xf0\xdc\xfe\x64\x8b\x36\xb7" - "\x23\xc6\x55\xcc\xed\x2d\x02\x1f\x7d\x42\xfc\xef\x57\x16\x69\x73" - "\x1f\xeb\x1c\xb1\xe8\xab\xf2\x65\x9c\x7a\xc8\x40\xc4\xba\x0f\x78" - "\x04\x7f\x81\xf1\x6c\xb7\xf7\x08\xbf\x96\x88\x53\xdf\xee\x3b\x09" - "\xbe\xf1\x0c\xd6\xbf\xb6\xc6\x31\x36\xf4\x2d\x27\xd5\xd7\xb1\x85" - "\x70\x20\xd6\xa0\x8f\xda\x84\xf8\x8f\xf0\xdb\xd1\xbc\x24\x4d\xc4" - "\xb0\x3f\x92\x8d\x71\xeb\x49\xd6\xf4\x8b\xab\x24\x0e\x30\xaa\xf3" - "\x45\xb4\xf1\x32\xb8\x9a\x24\x5c\x7b\x32\x47\xae\xef\x13\x01\xac" - "\xef\x48\xb8\x02\xa6\x80\x2d\x95\xa5\xfe\x7f\xb8\x4c\x83\x6b\x04" - "\x4c\x2f\xaa\xf3\x51\xc5\xad\x3d\xa3\xe2\x56\xf8\x07\xa5\x76\x35" - "\x6d\x46\x5f\x68\x4f\xc1\xf7\x85\x9f\x6d\x95\xef\x69\xf6\x62\x4e" - "\xf5\xf4\xb9\x59\x16\xd3\xf0\x18\xcd\x15\xe1\x73\x09\x63\xa5\xe1" - "\x0e\xc8\x10\x64\xdb\x4f\x26\x6a\xe3\x81\x76\x47\xe2\x04\xda\x63" - "\xc4\x59\x4c\xb8\xcf\x27\xef\xa3\xf7\xa6\x02\xb7\x85\xe9\xab\x93" - "\x0f\x8d\xec\xfb\xc9\x79\xe8\x3b\xe6\x84\x2d\x1f\x72\x04\xb9\x97" - "\xb9\xd9\x9f\x5a\x46\xe2\xab\x3f\xfd\x46\x9e\x11\x4a\x7a\x0c\xf8" - "\xde\xf6\xa8\x2c\x8f\xfd\x8d\xca\x3b\xc5\x5e\x27\xf7\xc3\x59\xd8" - "\xff\x28\xef\x90\x0a\x83\xe3\x54\xbe\x19\x36\x8b\xf0\x49\x31\xf9" - "\xb8\xe4\x03\x09\x47\x1f\xa6\xbd\xc3\x49\xe5\xf2\xda\x89\x07\x08" - "\x4e\x64\xac\x56\xa5\x37\x81\x27\xf8\xba\xcc\xc9\xeb\xfa\x58\x8c" - "\xed\x1e\xfe\x49\x2f\xeb\x7d\x8a\xd6\x51\x00\x67\xf9\x54\xb7\xa5" - "\x97\x9d\xfe\x26\x7d\x37\x51\xbd\x9a\xe9\xfa\x0f\x74\xbd\x96\xae" - "\x37\xd2\xf5\x3a\xba\xc2\xf6\x54\x51\xcb\xa7\xf4\xb2\xbe\xcf\x28" - "\xff\x4e\xf5\x4a\x6d\xec\xcd\xa1\xeb\xe2\x67\x40\x57\x3e\x2a\xf2" - "\xdf\x44\x9a\xae\xaf\xa8\xfd\x6e\x95\x6b\xbb\xf7\x79\xaa\xc7\x8e" - "\x72\xd8\xd7\x28\xcf\x46\x65\xd6\xa3\x6e\xd8\x12\xd3\xfd\x6d\x11" - "\xf4\x29\xd5\x73\xea\x5b\x74\x9d\x4b\xd7\x19\x74\xcd\xa3\xf7\x4f" - "\xa0\x5e\xf8\xba\x0d\xe3\x0b\xf7\xdc\x65\x76\x39\x9e\x34\xd6\x8d" - "\x58\xef\x1a\x3e\xc0\x7c\x1a\x51\x6e\x89\x2c\x27\x79\x57\xd8\x86" - "\xc8\xb1\x0b\xca\x79\xdb\x1c\xa4\xb1\xa3\xfa\xbf\x86\xf7\xe9\xba" - "\x40\xbd\xa6\xa9\xd7\xfb\xd4\xeb\x3f\xa9\xd7\x85\xea\x35\xdd\xcd" - "\x7a\xdd\x2a\x6d\x42\x30\xeb\x75\x03\x26\xb4\x76\x57\xca\xef\xf6" - "\x25\x82\xb7\x26\xfc\xff\xd5\x7e\xc4\x52\x70\x9c\x2a\xd5\x64\x75" - "\x90\xf1\x0e\x39\xba\xfc\x3b\x85\xde\xc4\xa9\xfa\x08\x5c\x98\x60" - "\xd4\xa5\x31\xa2\x9d\x26\xd6\xea\x89\x6e\x10\xf5\x9c\x0a\xe8\xd5" - "\xf3\x47\xf8\x5c\x46\x8c\x88\xac\xa0\x41\xda\xc2\xc5\xcd\x6c\xc2" - "\x7a\x15\x72\x4c\xf8\x56\x8a\x71\x27\xd2\x0f\x7e\x3e\x92\x35\x7c" - "\x0f\x7e\x49\xf5\x91\x35\xcd\xef\xe8\x33\x86\x79\xfc\x53\x87\xe5" - "\x79\xce\xd5\x84\x9f\xfa\x92\x23\xf2\xed\x68\x33\xc1\xba\x93\xfa" - "\x33\xb7\x9b\xf5\x2d\xa2\xeb\x1d\x3d\xb2\xcf\x29\x5a\x9f\xd5\xb1" - "\xb2\x69\x30\xef\x61\xbd\x7d\x84\x0f\x73\x31\xbf\xbb\x87\xf1\x72" - "\xaf\x38\xd7\x55\xe7\x0f\x8d\x73\xef\x76\x8c\x77\x04\x3e\x99\x15" - "\xc6\xd3\x7d\x0d\x23\xc7\xc5\xdd\x10\x94\xf4\x42\x27\xad\x4b\xcc" - "\x01\xdb\x65\xeb\x72\x1e\xd6\xa5\xfa\x6e\xcf\x48\x1c\x7f\x72\x1e" - "\x70\xbc\xda\x46\x9a\xb7\xbd\x8b\x31\x36\x6e\xd6\xd7\xac\xee\x49" - "\x9d\xb4\x47\x7e\x95\xf2\x55\xb9\xa8\xcc\x57\xbf\x45\xf3\xaf\x17" - "\xfe\x00\xaf\xd3\xf2\xd5\xf9\x8d\x7a\xac\x18\x6b\x2d\x5f\xad\x9f" - "\xe6\x69\xaf\x05\xeb\x47\xcb\x97\x73\xf2\x13\x3b\xf0\x0d\xde\x45" - "\x7f\x40\x33\x3b\x1f\x6d\xa6\x76\x9f\xde\x43\xf4\x45\x3d\xd6\xf3" - "\xe6\x0d\xcc\xb8\xae\x86\xc5\xc9\xb5\x79\xfa\x4d\xed\x5d\x29\xeb" - "\x3c\xdd\xa4\xe1\xa8\x2a\x81\xcf\x7a\x66\x8d\xc4\x95\x9e\x09\xdc" - "\x61\x0a\x06\x0d\x6e\x63\x5b\x70\xae\xc0\xb9\xb4\xee\x6b\xe9\x3d" - "\xaf\x9b\x95\xd7\xa8\x7b\x49\xab\x94\x23\x9f\xb9\xb9\xad\x5e\xe2" - "\x2e\x59\xf7\x99\x61\xfc\x17\x41\x87\x08\x5c\x8f\x6f\xa1\x2e\xda" - "\x57\x12\x7c\x45\x99\x93\x25\xfe\x3e\xb3\xd0\xcd\x62\x8f\x6b\xb8" - "\x15\xfb\x93\x49\xc7\x6c\x95\x8f\xca\xfd\x49\x81\xfc\xcb\xe6\x13" - "\x7e\x84\xda\x6d\x1e\x86\x7d\x13\x7e\x5e\xb3\xd6\xc7\xc2\xd7\x4b" - "\x66\x2f\xfb\x14\xf1\xf6\xf6\xa8\x70\xa4\xf5\xf3\x69\x9b\x3a\x0e" - "\xc7\xe9\xfb\x7b\x80\xcb\x37\xe7\x4b\x3f\xe5\x90\xfd\x08\x3f\xf8" - "\xa0\x51\xcd\x3c\xd0\x5c\x8b\x35\x72\xa6\x39\x42\x9e\x55\x2f\xd7" - "\xc5\xe9\x57\x45\x4c\x85\x52\xb7\x51\xca\x0e\x3f\x5d\x2a\xf3\x3f" - "\x55\xcf\x5a\x85\x3f\x39\xa4\x53\xa2\xcc\x89\xb9\x32\xee\xcc\x47" - "\x53\x25\xfd\xf1\x69\xe2\x65\x7e\xa1\xf4\x94\x67\x0d\xfb\xcc\x3c" - "\xad\x9e\x73\x7f\x1a\x71\xfe\xf9\xa9\x88\x1f\x46\x75\x6d\xa4\xfc" - "\xe1\xf3\x4f\xb9\xd7\xb8\xad\xaa\xbc\x2c\x61\xf2\xa6\x34\x46\xb8" - "\x79\xe2\x4e\x87\xb6\x7e\x3f\x3d\x24\xda\xa3\xae\x5f\xf4\x19\xf3" - "\x01\x6b\x38\x08\x5f\x3c\xb4\x86\xb1\x96\xe9\x3e\x31\xa8\xad\x5d" - "\x49\xdf\xcd\x12\x6b\x57\xac\xdb\x4f\x9b\x23\xda\x51\xa0\xce\xd5" - "\xe3\xfd\x8f\x99\x8d\xf4\xcc\xed\x66\x5d\x49\xf2\xd9\x99\x6a\xb5" - "\x1d\x46\x7a\x5e\xeb\x2c\xfc\x2d\xc6\x7e\x93\x5c\x13\x67\x8a\x31" - "\xef\x5c\x34\x57\x68\xbf\xa8\x91\x31\xe6\x3d\x49\xda\x5c\xa1\x35" - "\xb5\x8c\xe6\xd4\xfe\x6d\xd3\x78\x0d\x8d\x09\xf4\x31\x57\x52\x1a" - "\xeb\x75\x99\xbc\xea\x12\x70\x55\xe7\x68\x0d\xbd\x4b\xfb\x7f\xac" - "\x36\x26\xc7\x7d\x71\x93\xeb\xc5\x9c\x28\x84\x6e\x4c\x8a\x38\x8f" - "\xc4\x9c\xc0\x7c\x10\xe7\x92\x34\x37\x4c\x9b\xbe\xc1\x30\x2f\x84" - "\x3d\x3f\xa5\xd1\x26\xcc\x0b\xaa\x6b\x8f\xe6\xa3\xd2\xcd\x3c\xe9" - "\x12\xf6\x9e\xa6\x48\x1d\x41\xaa\xdb\xd2\x6c\x21\x7e\xa7\xb4\xa5" - "\x34\xef\x46\x76\x35\x62\x84\xc3\x17\x1d\x62\xae\xe3\x1d\x9c\xe9" - "\x48\x3c\x77\xf5\xff\xa6\x77\x7d\x61\x78\xb9\x85\x5f\x81\x23\x4b" - "\x84\x0c\xf2\x2a\xbf\xe3\x6c\xc2\x48\x5c\xf1\x51\x8f\xa0\x07\x69" - "\x5f\x9d\x99\xc8\x2c\x34\xff\x68\x8f\x38\x3b\x57\xa3\x63\xe7\x24" - "\xe2\x6c\xf8\x23\xf0\x17\xe0\x61\x3b\xe8\xbe\x00\xfb\xeb\x18\xb2" - "\xe2\xb9\x90\xf1\x60\xad\x43\x66\x04\xf9\x15\x7c\xca\xf7\x32\xef" - "\x9b\x6d\xf0\xb5\xb1\xfa\xcf\xfd\x92\x16\xda\xf9\x45\xf8\x7e\xb1" - "\xe4\xb2\xab\xba\x99\x17\xb1\x80\x3b\x8b\x3e\x83\x6c\xe6\xec\x65" - "\xfe\x0f\xcf\x19\xd5\x9f\x85\x7e\x5b\xc2\xbf\xf3\x89\xea\x7d\xf5" - "\x95\x7f\xe7\x67\xc9\xb2\xe7\x09\xe7\x9d\x5f\xa8\xc2\xea\x87\x7e" - "\xc7\x39\x8b\x06\x2b\xe0\x02\xe0\x46\xe8\x04\x40\xd6\xa4\x0b\x32" - "\xf8\x12\xa0\xf1\xa2\x76\x6f\xbe\xf5\x41\xe7\x06\xf0\xa2\xe7\x84" - "\x4e\x13\xfc\x68\x8e\x4f\xff\xe4\x9c\x38\x03\x94\xbe\xf9\xce\x25" - "\xd2\xb7\x7f\x5a\x75\x8e\x45\xdb\x72\xd9\x0c\xc8\xbd\x4d\x21\xee" - "\x04\xef\xaa\xc6\x35\xef\x38\xc3\xce\x5f\x9d\xb7\x91\xe9\xe9\xf9" - "\x0d\x74\xaf\xc5\xd7\x3c\x4e\xef\x24\x44\x05\x58\x22\x68\x9f\x05" - "\x1b\xd9\x0d\xd4\x7e\xb7\x36\x56\xa0\x0f\x20\x7f\x53\x65\x08\x68" - "\xeb\x8d\x78\x0f\xbe\x96\xdd\x02\x6e\x2a\xce\x39\x07\x79\xf3\xb9" - "\xd6\x28\x1f\x4b\x90\xfb\xc7\x79\xda\xff\x3e\x52\xe9\xc1\x73\x7d" - "\xb4\x06\x8e\x45\xb4\xf3\xc3\xf0\xfd\xb4\x6b\xf1\xbe\xc9\x07\xda" - "\x6b\x2c\xf8\x9c\x7f\x4a\x83\x0f\x74\x53\x89\x9f\xb7\x89\xf1\x0e" - "\x72\x0f\xb5\xad\xd5\xb6\x81\x19\xce\x30\xef\x53\x88\x59\x40\xeb" - "\xa6\x45\xca\xe5\xbd\xcb\x35\xfe\x5a\xb6\xdb\x7b\xbb\x69\x53\x14" - "\x83\x3c\x3d\x2b\x64\x11\x67\x7e\xfc\xbc\x59\xc8\xd0\x5d\xc1\x79" - "\xcc\x59\x78\x17\xca\xdc\xa8\xee\x41\xc7\xfb\x8b\xcc\xec\x88\x79" - "\x1e\xad\xe7\xf3\x1e\xb7\xee\xfd\x2f\xa0\x4b\x79\xde\x23\x79\x1b" - "\x69\x47\x88\x34\x6c\xfe\x08\x9e\xad\xf2\x9c\xfb\xfc\x6f\xb0\x27" - "\x80\xc7\xa7\xfd\xa0\x19\xfb\xae\xdf\xe1\x1d\xa6\xff\x09\xdf\x13" - "\x7e\x3a\xaf\x9e\xbb\xe0\x6c\xf1\x7c\x13\x7c\x2d\xa8\xba\xaf\x28" - "\x6f\x94\xb2\x7f\x6f\xf9\x30\xdd\x4c\xe5\xf0\x9e\xd4\x6d\x3a\x5f" - "\x9d\x15\x82\x4c\xe0\x7c\x35\xfa\x2a\xe7\xe6\x34\x1a\x5b\xef\xe1" - "\xf0\x3a\x3e\x27\x68\x89\x23\x9e\xc8\x75\xea\x3d\x1e\xe6\x37\xcf" - "\x16\xdf\xb6\x8d\x59\x46\x5b\x97\xb6\x78\x96\xf0\xa9\x81\xfd\x4b" - "\x55\x15\xaf\xaf\xd6\x2b\xf7\x6e\xae\x64\x46\x5d\x39\x81\x11\xeb" - "\x2e\x3f\xfb\xea\x5e\xf6\xd9\x23\x26\xe3\x35\x8b\x17\xe4\x4d\xe2" - "\x85\x66\xa6\xaf\xb8\x30\xc9\x70\x63\xe0\x9a\x7a\x1e\x75\xeb\x83" - "\xf7\xe7\xe1\x6c\xaf\x9a\x9d\x5a\xc9\xa2\x16\x84\xe8\xdb\x46\x66" - "\x73\xb3\xfe\x1c\xd8\x66\x1e\x31\x82\xa6\xe8\x87\xee\xcc\xbd\x05" - "\xb5\xcc\x50\xd0\xc3\xfb\xca\x1f\x9f\x60\xa0\x7d\x34\x81\xf0\x7f" - "\xe9\x64\xe3\x35\xf5\x43\x54\xc7\x1b\xd9\xe2\xbd\xc6\xf1\xb7\xcd" - "\x36\x8d\xda\x76\x69\x7c\x6d\xf3\x35\x84\xdb\xe6\x6b\xf8\x1b\xb7" - "\x2d\x21\xdc\xb6\x1c\x6a\xdb\x85\xe7\xc7\xd7\xb6\x8b\x7d\xe1\xb6" - "\x5d\xec\xfb\x9c\x6d\xdb\x37\xfe\xb6\xd9\xaf\xe9\x65\xfd\xb7\x8f" - "\xaf\x6d\x7e\x6b\xb8\x6d\x7e\xeb\x5f\xd3\xb6\xc2\x5a\x7e\xb2\x3d" - "\x49\xc6\x23\x05\xde\xef\x65\xbe\xaf\x6e\x4c\x42\xbb\xd8\x54\x6a" - "\xd7\xe9\xa2\x5a\xfe\x89\xa4\x59\xfa\xf7\xcb\xbd\xae\x9f\xf6\xbf" - "\xb3\x99\x72\x1e\xfb\x04\xcf\xab\x44\x4d\x6f\xe0\x0e\x1e\x9c\xed" - "\x83\xbe\x53\x10\xfe\x08\xe0\xbb\x37\xfd\xe0\x40\x40\xcf\x63\xdd" - "\x99\xbb\x2f\x44\x23\x0e\x1f\xd1\x2d\xfd\x6e\xcd\xbf\xa0\xf6\xae" - "\xa9\xe6\x4a\xf8\xc9\x77\xf5\x82\x1c\x66\x02\x7e\xc2\x15\xb1\x67" - "\xaa\x0a\x27\x19\x16\x7c\x06\x7a\xc0\x37\x4b\xb3\xcf\xd2\xea\xca" - "\xe8\x9b\xc4\x4d\x05\x2c\x0a\x36\x62\xc2\x6f\x99\xd9\xcb\x92\x0b" - "\xd8\x84\x0c\x3b\xd5\x1f\x60\xd9\x26\x3b\xd5\x4d\xf0\x90\x34\xb9" - "\xef\xa9\xa8\x95\xcc\xb8\x8d\xea\xc6\x75\x81\xb9\x88\x6f\xde\xce" - "\xa2\x61\x4b\x06\x9b\x30\x69\x0f\x36\xd1\x40\xdf\xd9\xa6\x7d\xe7" - "\x2f\xc0\x2f\x5e\xc2\xef\xe2\xda\x30\xfc\x2e\xde\x12\x86\x9f\xef" - "\xac\x84\x9f\xaf\x27\x0c\xbf\x8b\xc7\xc6\x07\xbf\x8b\x96\x30\xfc" - "\xe4\xbb\x57\x86\xdf\xc5\x87\xc7\x86\xdf\xc5\x95\x61\xf8\xc9\xba" - "\xc6\x80\xdf\xc4\xd1\xe1\x77\xf1\xe5\xcf\x07\xbf\x8b\xc7\x3e\x27" - "\xfc\xe2\x24\xfc\x06\x5e\x09\xc3\x6f\x60\x45\x18\x7e\x03\xb7\x49" - "\xf8\x0d\x24\x87\xe1\xe7\x4f\x1c\x1f\xfc\x06\xb2\xc3\xf0\x93\xef" - "\x5e\x19\x7e\x03\xcf\x8f\x0d\xbf\x81\x7d\x61\xf8\xc9\xba\xc6\x07" - "\xbf\x81\xcf\x08\x6e\x09\x2a\xfc\x12\xc6\x86\x9f\x3f\xf1\x73\xc2" - "\xcf\x24\xe1\xe7\xbf\x18\x86\x9f\x7f\x6f\x18\x7e\xfe\x27\x25\xfc" - "\xfc\xcb\xc2\xf0\x0b\x3c\x34\x3e\xf8\xf9\xeb\xc3\xf0\x93\xef\x5e" - "\x19\x7e\xfe\x0f\xc6\x86\x9f\xdf\x13\x86\x9f\xac\x6b\x0c\xf8\x4d" - "\x1a\x1d\x7e\x81\xdb\x3f\x1f\xfc\x02\x0f\x5d\x09\x7e\xe3\xa3\x3d" - "\x02\x39\x6c\x0c\x1d\xbc\x71\xd6\x33\xb6\xdf\x35\xc4\x72\xba\xc4" - "\xf4\x8a\x23\xd0\x58\xa7\x4c\x34\xe0\xbc\x96\xee\x21\xbb\x9a\xdf" - "\xcd\x02\xa1\x3a\x65\x82\x81\x3b\x7e\x5d\xaa\x38\x7e\x93\xce\x37" - "\x4d\x8c\x56\x36\x4d\x8a\x86\xfd\xea\x68\x75\x49\x5d\xbf\x4b\x8f" - "\x44\x5d\xcb\xae\x87\x5d\xc7\x66\xa2\xdf\x70\xef\x77\x5c\xca\x21" - "\x5a\xe4\xcf\xfc\xec\x2f\x5b\xb1\x66\xe9\x77\x56\x2e\xb7\xe4\x2e" - "\x5f\xb6\x76\xd5\xb2\xa5\xab\xf2\x2c\x4b\x1f\xfb\xde\x9a\x91\xbe" - "\x8e\x45\xec\xcd\x2d\x18\xbf\x4b\xfb\x86\x7d\x0d\x38\xb8\x1d\xfe" - "\xa5\x6c\x37\xb1\x98\x33\xec\x92\x47\xf8\x88\x8e\x75\x37\xf3\xa1" - "\xcc\x1d\x69\x33\xf9\xeb\xc2\x6f\xd6\x50\xce\x0e\xe2\xb3\x6a\xe0" - "\x5f\x40\x3d\x4f\xaa\xe9\x65\x43\x17\x79\x4c\x0f\x68\x4b\x9f\xd4" - "\x39\x1f\x14\xbe\x18\xe0\x77\x80\x1b\xba\xbc\x4a\x69\x4f\x0b\xdf" - "\xda\xe3\x04\x0c\xda\xe1\xb3\x28\x3f\xea\x86\x6e\x16\xda\xc3\x63" - "\xba\xbc\x54\x97\x4f\xad\x07\xfe\x70\x7d\x69\x1b\xf8\xc7\xa8\x4f" - "\xa5\xbd\x11\xff\xd0\x29\xe9\xc1\xc1\x4d\xa6\x4d\x96\x28\x94\x85" - "\xef\x30\xf8\xd4\xd2\x62\x8b\xa0\xdd\x28\x4b\xf4\xf9\x7c\x7a\x7f" - "\xfe\x6e\x11\x3b\x44\xad\x43\xb6\xe9\x2a\x6a\x53\x93\xe8\x4b\x69" - "\x57\x6d\xff\xd3\x99\x3b\x50\x8f\x84\x6b\x68\x2b\x7d\xbb\x16\x75" - "\xc0\xa7\x0f\xde\x55\xdf\x99\x41\xef\x48\xdf\x25\x9b\xaf\xdb\x21" - "\xeb\x08\x3d\xa5\xb5\x8b\x68\xea\x58\x4a\x7f\x2b\xe2\x1b\x93\x29" - "\xfd\xb5\x88\xe7\x46\x4a\xdf\x4c\x74\xe8\x14\xf5\x79\x1c\xa5\x11" - "\xef\xcc\x28\xfa\x55\x59\xac\xea\x73\x06\x3d\x94\x97\xa0\x96\x99" - "\x72\x86\x05\x11\x8b\x78\xaa\x5a\xc7\x54\x4a\xbf\x02\x1e\x52\x7d" - "\x9e\x48\xe9\xed\x90\xef\xab\xcf\xaf\xa6\xf4\x46\x4a\x7f\x59\x7d" - "\x4e\x74\xfe\x90\xf4\xb5\x65\xe8\xea\x43\x9f\x08\xf6\x0d\x22\x96" - "\x78\x4c\x57\x1f\xe5\xd5\x10\xff\x5a\x84\x71\x44\x3f\x9d\x1b\xe0" - "\xe7\x60\xa8\x0d\xb6\x1e\x72\xac\x7a\x54\x3f\x11\xfa\x4c\xca\x87" - "\x1c\x27\x2a\x5e\xc4\x23\xe8\x69\xc0\x3d\xb5\xf5\x6b\x80\xa1\xfa" - "\x2d\xe2\x91\x86\x7c\xea\x38\x13\xec\xe0\x7f\x92\x15\xa3\x5e\x69" - "\xe7\x30\xa4\xda\x39\x04\x8d\x5f\xcc\x26\x39\x68\x14\xfd\xa0\xb9" - "\x07\x19\x88\x37\xa6\x6b\x8b\xb0\xc3\xa7\xf9\xa7\xcd\x03\xcc\x01" - "\xae\xbf\x94\x27\xe5\x2b\xc1\xbc\xb0\x1f\xfa\xa1\x63\xaa\x8c\x85" - "\x49\x1e\x20\x18\xa1\xff\x33\x24\xd6\x7e\xc4\xb3\x7d\x11\xcf\x32" - "\xb5\x67\x52\x47\x2d\xd8\x12\xf1\x2c\xfd\xb2\x67\x3d\x11\xcf\x52" - "\x47\xd6\x19\x62\x11\xcf\xac\x23\xdf\x0b\x25\x45\x3c\x4b\xbc\xec" - "\x59\x6a\xc4\xb3\x68\xf5\x59\x14\xe5\x2f\x0e\xfb\xec\x1a\xf4\xa9" - "\xf9\x84\xc7\x43\x39\x11\xf9\x3d\x6a\x3e\xbe\x5f\xec\x66\xfb\x55" - "\x58\xc8\x39\x4c\x73\xe4\x4b\xea\x37\x6a\xc3\xdf\x18\x54\x75\xae" - "\xba\xb6\xc8\xb1\x1a\x9c\x65\xd2\x59\x26\x61\xbe\x98\x36\x15\x23" - "\x6e\x45\xb5\xf4\x4f\x23\xd7\x98\x88\xd3\x46\x57\x7a\x6f\xd6\x58" - "\x78\x6f\x74\x1d\x3e\x25\x41\xb3\x7b\x0a\x95\x76\x95\x2a\xe5\x46" - "\xf8\x12\xbd\x01\x7e\x6c\x8a\x3c\xf0\x03\xe0\x63\x2e\x36\xc8\x5c" - "\x79\xfe\x62\xc4\x89\x6a\x97\xf1\xa1\xe2\x71\xfe\x06\xbd\x7b\xf8" - "\xe2\x69\xb7\x9d\x15\x31\xa2\xd6\x79\x58\x92\xed\x1e\xde\xd3\xcb" - "\x94\xbc\xd0\xd6\xae\x52\xd5\x96\x77\xbb\xb4\x47\x53\x64\x7f\xc0" - "\xb3\x7a\x84\xfc\xd7\xd0\xcb\x78\xb4\x28\xc3\x33\xb7\xcb\x3e\x72" - "\x01\xd7\xdd\x0e\x2d\xe6\x8f\xb2\x4f\x8b\x8d\xe6\x66\xdc\x70\x31" - "\xe6\x54\x2a\xe5\x39\x47\xea\x1c\x2a\x1f\xa2\x4e\xb4\xdd\xcd\x94" - "\x02\xd4\x4d\x65\x7a\x86\x75\x0e\x29\x7f\x5d\x90\x4d\xa7\x76\xf5" - "\x6a\xf5\xfb\x1d\x3c\xda\xcd\x42\x82\x8f\x44\x9d\x17\x2b\xe2\xb2" - "\x29\xcf\xec\xd6\xff\xcc\x23\x75\x16\x39\xd1\x3f\xaf\xfe\x59\x1c" - "\xe2\x11\x3a\xd9\x86\x1e\x37\x2f\xed\xe9\xa3\x35\xdc\x29\xf4\x2b" - "\x63\x7a\xdc\x92\x57\xe7\x4f\x41\x2f\x02\x31\xef\xc0\x3b\x4b\x3c" - "\xc2\xe5\xf9\x07\xe5\xd1\x18\x35\x10\xbe\x15\xbc\xeb\xf8\xd6\x1c" - "\x17\x30\xa9\xba\xc0\x0c\x95\xb9\x9a\xcf\x5c\xde\x1a\xe1\x4b\x5c" - "\xd5\x45\xe6\x17\xdb\xed\xe2\x4c\x48\xb4\xf1\xf2\x36\xa0\xbd\x54" - "\x97\x6d\xcc\xbd\xd1\xd0\xd3\x29\xe4\x93\x65\xee\x1c\xa1\xdf\xa5" - "\x63\x77\x47\x99\xaf\x7d\xda\x5f\xc2\x52\x35\xde\x1b\x65\x2a\x07" - "\x19\x53\xa8\xfe\xe1\x7e\xe6\x06\x51\x36\x5b\xc8\xcf\x75\x2c\x8f" - "\xf0\x52\x27\xda\xa0\xe6\xe7\xb5\x07\x03\xb0\xa9\x1c\xd5\xb7\x8a" - "\x88\xa3\x02\x9d\xca\xb2\x1e\xc4\x8c\xf1\xcd\x09\xa8\x6d\xd6\xe9" - "\xf2\xa0\x43\x8c\x36\x0b\xd8\xea\x74\x2b\x34\x38\x56\x5c\xa0\xba" - "\x0b\xbb\x58\x8f\x8e\x7d\x06\xbd\x13\xe8\xc4\x57\x6d\x50\x75\xa1" - "\x28\x4f\x94\x1b\x1c\x2e\x23\xf4\xfa\x61\x0b\x08\xfc\x58\x27\xe2" - "\x78\x50\x1f\x68\x2c\x84\x5d\xb9\x4e\xf7\x0f\x42\x8e\x99\xcb\x64" - "\xbf\xa1\x67\xa6\xd3\x09\x3d\x65\x7f\x89\x2e\xc5\xad\xd3\x09\xfb" - "\x21\xb7\x9a\x57\x85\x6f\xe7\x0f\xb2\x73\x3a\xdd\x14\xc4\xdd\x23" - "\x78\xf4\xc1\x27\x51\xbb\x8f\xd6\x89\x7d\x10\x73\xa1\x0f\x31\x9b" - "\xa8\x7c\x82\xc4\xf7\x04\x73\x1d\xf3\xe1\xfb\x80\x2d\x8d\x9d\x97" - "\x60\xba\x95\xea\x2e\xd7\x60\x8a\x58\xb9\x54\xa6\x61\xac\x71\x01" - "\x8c\x42\xd4\x66\xd8\xd0\x3b\xa7\x77\x51\xfb\xf4\x0f\x2b\xb1\x3d" - "\x9d\xd0\x69\xa4\xb6\x5e\x92\xb8\x42\x8e\x9d\x58\x4b\x3a\xfd\x6d" - "\xf4\x8d\x43\x38\x03\x84\x8f\x5d\x11\x0f\x59\xa7\x3b\xa6\xc2\x4f" - "\xf8\x70\xaf\xce\x97\x70\x50\xcb\xab\xf2\xd2\x6b\x7f\xe5\x2f\xd1" - "\x87\xcf\x7f\x28\x5f\xc8\xcc\xa6\x49\x5b\x6f\x7a\x96\x16\xd1\x66" - "\x9f\xb0\x49\xa2\xba\xa8\xaf\x7d\xf8\x56\x05\x7c\xc6\x60\x5e\x9c" - "\x89\x98\xff\x3a\xdd\x3b\x68\x27\x74\xe6\x42\x31\xee\x1c\xbe\xd5" - "\xbd\x12\x70\xa6\xba\x19\xad\x85\xce\x31\x62\x2e\x8a\x78\x2d\xf4" - "\xbd\x46\x8d\x06\x22\xda\xe7\x86\x33\x3a\xfd\x09\x29\x9b\x92\xfe" - "\xd2\x60\xdf\x3b\x9c\x57\x91\x6c\xa5\xf5\xde\xaa\xd2\x2c\xad\x63" - "\xfa\xda\x9a\xcd\x52\x60\xc7\xae\xc6\x17\xf5\x71\xe3\xcc\x16\xf8" - "\xef\x84\x2f\x32\xe7\x86\x3b\xa8\xbd\x51\x3f\x78\x6e\x9a\xb0\xb5" - "\xf2\x39\x67\x5f\x80\xee\x8c\xa7\xb7\x40\xf8\xa7\x30\x64\xd8\x83" - "\x5c\xd8\x63\xc3\x4e\x2b\x6e\x66\x0b\x9e\x09\x3f\xd6\xa8\xf3\x8b" - "\xfa\xa2\xd4\x45\x2d\x51\x69\x13\xd8\xee\x5e\x73\x46\x17\x25\x64" - "\x93\x74\x3f\xed\x8c\x2e\xfa\x55\x19\xaf\x4b\xfa\x55\x56\x75\x00" - "\x27\x4a\x1b\x4e\x2f\x13\x3e\x1b\x75\xd1\xb7\x59\x6e\x65\xcc\xa3" - "\x8b\xbe\x5d\xf8\x36\x2d\xed\xd2\xf4\x89\x8e\x57\xc9\x76\x99\xb2" - "\xec\x7a\xd1\x46\xb4\x6f\x9c\x6d\x0b\xa8\x7b\xd7\x44\x7f\x49\xf4" - "\x3c\xcd\xf6\x53\xf4\x5f\xf5\x79\xea\xbc\xe9\x02\xda\xb0\x57\xdd" - "\xaf\xdc\xea\xb7\xdd\x7f\xfd\xb7\xa3\xf3\xd4\x3a\x0f\x09\xbf\xaf" - "\x04\x17\xaa\xf7\x10\xb5\xa3\x59\xdb\x43\x55\xbd\xf5\x59\x62\x6f" - "\x2f\x89\x3e\x3e\xbc\x7f\xaa\x30\x1c\x11\xa3\x68\xf5\xea\x3c\x0b" - "\x11\xe0\xb6\xa5\x79\x8f\xe5\x58\x96\xe7\xe6\xae\xce\xb5\xc0\xc1" - "\x41\xe4\x1a\x13\xba\x29\x25\xd1\x5e\x35\xd6\x4c\xc3\x70\xac\x99" - "\x92\x09\xa9\x91\x31\x91\xdc\xba\x09\x63\xfa\x34\x1b\x5f\x1f\x27" - "\x8c\x19\x2b\xb9\x5a\xaf\x34\xd2\xaf\x89\x7e\x4e\xfa\x09\x5f\xd8" - "\x59\x01\x96\x46\xfb\xa3\xb0\xd3\xd4\x7c\x62\x2b\x25\x13\x12\x70" - "\x3e\xdd\xad\x9b\xf0\x4a\x9d\x12\xcd\x84\x3d\xbb\x43\x81\x8e\x07" - "\x7c\xf4\x36\xd1\xcf\x49\xbf\x16\xfa\x49\x9f\x2f\xbf\x15\x76\x7f" - "\x8d\x91\xcf\x70\x66\xcc\x1d\x35\xf0\xf5\xdb\xc1\x37\x45\x8b\x33" - "\x06\xe5\x59\x59\xee\xb2\x36\xe8\x89\x8f\x4d\x55\xcb\x89\xfd\x34" - "\x7e\x13\xb3\x8c\x52\x2e\x8a\x3b\x2e\x6d\x53\xcb\x09\xbf\xb6\x5a" - "\x7f\xe0\x3f\x9a\xca\x6b\xe5\xa2\x79\x89\xde\xa7\x96\x13\x74\xa5" - "\xe2\xd0\x8f\xf6\xdd\x09\xdc\x71\x54\xfb\x6e\x42\x64\x7d\x11\x65" - "\x26\x2a\x0e\x6f\x00\x65\x94\x4d\xd1\x82\x7e\xe3\x25\x13\x32\xa9" - "\xfc\xa8\x7e\xf7\xc6\x37\x4e\x93\xd8\xe5\xe3\x64\x7b\x6c\xc5\xf2" - "\xbb\x56\xac\xca\x47\x54\x92\xbc\xd5\x6b\xf3\x70\x5d\xb5\xf4\x7b" - "\xe2\xb2\x3a\xeb\xf1\xc7\xe4\x4d\xde\xca\x14\xdc\xac\xa4\xf9\x86" - "\xeb\xb2\xb5\x36\x5c\x1e\x5b\x8d\xa4\x3d\x67\xd6\xda\xc7\xb4\x30" - "\xaa\x91\xf3\xd0\xea\x2f\x99\x44\xfb\xc7\x04\x71\x16\x47\xf7\x87" - "\x88\x9f\x15\x71\x6f\x4c\x9b\xdc\xec\x4d\x6b\x90\x69\x3c\xac\x1c" - "\xff\x49\x4c\xf8\xc8\xd3\x4d\x7a\xa3\x4e\x99\x64\x30\x6d\xb2\x3d" - "\x66\x0a\xae\x58\x4e\x78\xb6\x85\xde\xf5\xba\x59\x89\x1a\x47\xa4" - "\xcb\x23\xfc\xc1\x95\x4c\x4a\xd3\xf4\xfe\x94\xd2\xae\x7a\xf8\x64" - "\x16\x7a\x40\xcf\x0a\x1f\x08\xad\x94\xee\xa3\x34\xe2\x2c\x24\x52" - "\xba\x81\xd2\x5e\x4a\x9b\x29\x9d\xa4\x94\x1e\x4d\x85\xad\x14\xa5" - "\x2d\x94\x4e\xf6\x97\x18\x16\x6b\xeb\x22\x12\x36\x6a\x90\x9f\xbb" - "\x46\xe5\x77\x47\xfa\x14\xa1\xb5\x65\xd8\xa6\xc5\x52\x14\x71\x13" - "\x4b\x0c\xc3\xe7\x7f\x32\x2e\x49\xc2\x12\xb1\xaf\x89\xbd\x3d\xe6" - "\xc6\x28\xf3\x75\xb1\x82\xf6\x2e\x31\xb4\x6a\x67\xb4\x82\xb6\x2e" - "\x31\x1c\x8f\x88\x39\x89\xb4\x67\x38\xe6\xa4\xa4\x45\x77\x08\x5a" - "\x54\x17\x33\x97\x97\x18\x96\x0c\xc7\x05\x2a\x89\x19\x71\xfe\xeb" - "\xa6\xe7\xe0\x69\x28\x7f\x56\x78\x1f\x34\x20\x6e\x7a\xd4\x68\xf1" - "\x35\x11\xd3\x3b\x6b\x3d\xd1\xdf\x74\x55\x69\x71\x8b\xe0\xb5\x1c" - "\xf0\xfb\xc7\x1b\x46\x95\x1b\x5c\x2f\xfa\xf2\x2a\xfc\x3d\x7a\x8b" - "\x96\xe9\x66\xd6\x31\x9d\x48\x4b\x5f\x5f\xfc\x9c\x2e\x46\xd8\x0f" - "\x6a\x7e\x80\x22\x6d\x72\x47\xb5\x01\x78\x9f\x31\x19\xbf\x62\xe5" - "\x6a\x53\x70\xe9\x72\x49\xbb\xc5\x5e\xab\x9e\xff\x96\xcb\x3d\x3e" - "\x36\x9a\x3f\x28\xfd\xed\xbb\x75\xb1\xa5\x88\xe3\x61\xd2\xad\x5c" - "\xcd\xe9\x5d\x93\x7d\xe9\x72\x91\x47\xe5\x36\x23\x2e\xb3\x6c\xdf" - "\x69\x57\x52\x1f\xe3\x03\x21\x69\x6b\xac\x8b\xe9\x7b\x74\x46\x31" - "\xbe\x63\x10\xb4\xc3\xfb\xcc\x88\xb8\x4c\x68\x5b\x5d\x84\x9f\xa2" - "\x2a\xca\x83\x6e\x54\xff\x83\xcc\x08\x7f\x8d\xb2\x2d\x31\x7d\x22" - "\xfe\x4d\x49\x6c\xb1\xe6\x4b\x81\xe0\xdc\x77\x79\x7f\x1e\xfc\x17" - "\xb1\x2a\x6e\x7e\x6c\xd6\xe2\xfb\xe8\x6e\x96\x1a\x72\x30\x72\xbe" - "\x24\xf5\xc7\x76\x37\xf5\xbf\x54\xec\x17\x71\xb3\x4a\x62\x3b\xa8" - "\x9e\x3c\x31\xc6\x9b\xbf\x7d\x1a\xf8\x44\xf8\x62\x08\x31\xb3\xb0" - "\x7f\x52\x7c\x22\x36\x59\xaf\x2e\x6e\x3b\x7c\x26\x0a\x5f\x44\x25" - "\xb1\xdb\x30\xee\x34\x56\x62\x8f\x57\xca\xba\xca\xb1\x16\x30\xbf" - "\x94\xad\x27\xb2\x5d\x09\xe8\xfb\x64\x2b\xe1\xd1\x05\xf4\xfb\xdf" - "\x32\x3e\xc1\xb7\x4f\x6b\x75\xc2\x57\x08\xcd\xa7\x16\xba\x26\xf8" - "\x4b\x26\x0f\xcf\xff\x61\xbb\x31\xdd\xe4\xa7\xe0\xcf\x04\xfe\x1a" - "\x24\xdd\x1a\xf7\x7d\x49\x4b\x4e\x2e\x70\x33\xd3\x42\xb9\xa6\x27" - "\x13\xbf\x52\x5f\xaf\xde\xd3\xfc\x9f\x5d\x7b\x59\x1d\x7f\xd4\xe4" - "\x15\x72\xde\x4f\x6e\xa2\xf9\xb7\x80\x7e\xff\x9b\xca\x37\x6b\x71" - "\x49\x37\xeb\x85\x8d\x4f\x6f\x94\x99\xa5\x50\xfe\x71\x2d\x7f\x82" - "\x2e\x8d\x60\x33\xd9\xa3\xe1\x90\xfe\x58\x77\x1e\xa5\x09\xe6\xac" - "\x58\x4d\x17\xfb\x4b\x8c\x46\x2d\x4d\xf7\x66\x0d\xc7\xd0\x3d\xd1" - "\x7f\xbb\xfb\xd4\xfb\x14\x37\xfb\x91\x96\x3f\xcf\xad\xdf\xd7\xa8" - "\xb5\x53\x71\x44\x99\x64\x5b\xe3\x6c\x4a\x85\xd1\x86\xd8\xaf\x54" - "\x26\x9b\xd6\x8a\xf4\x1d\x90\xef\xa9\x2f\x1f\x4c\x78\x08\x71\xdb" - "\x9d\x8f\x63\x0e\xc4\x09\xff\x61\x15\x1b\x12\x16\x83\x7e\x83\x7d" - "\xb3\x88\xe3\x03\xff\x5f\x41\x36\x51\xf8\x8d\xae\x30\x66\x0b\x7f" - "\xc9\xeb\xac\x46\xcd\xf7\x17\xad\xb9\x34\xae\x2f\x0f\xc2\x1f\x98" - "\x90\x73\xf9\xad\xf1\xc2\x07\x98\xea\xfb\x6b\x57\x3e\x4b\xac\x55" - "\xa4\xef\x2f\x61\xfb\x3c\x91\x68\xfd\xfc\xd1\xfd\x7f\x71\xc7\x6b" - "\x01\xcd\xff\x17\x62\x3d\xd3\xbd\x95\x0f\x04\x91\x27\xfc\xf3\xab" - "\x7e\x5f\xa3\x47\xf5\x05\xa6\x27\x1c\xa8\x97\xbe\xc0\xc6\xb7\x77" - "\xc4\xcd\x93\xe3\x1f\x57\xa0\xc5\x43\x8d\xc8\xab\xa6\xf9\x2b\xf5" - "\x4c\x74\x93\x6d\x6a\x1e\xe1\xbf\xdd\x0f\x0d\xd3\x59\x84\xbb\x20" - "\xef\xa3\xf5\xe9\xe3\x45\x39\xdb\x23\xd7\x8b\xd0\x06\x60\xd8\x86" - "\x27\xd0\x1e\x3b\x91\x7e\x93\xf0\x4b\x1f\xc6\x0b\x03\xbc\x53\x8d" - "\xdb\x17\x34\xd9\xa3\x78\x46\x30\x18\x95\x15\xd4\x1d\x13\xb1\x09" - "\x43\x4c\x9f\x11\x0a\xc2\xa6\x38\x3a\x38\xc0\x8f\x65\x84\xfa\x79" - "\xd5\xe3\x88\x2f\x06\x5f\xa6\x37\xf0\xac\x50\xb5\x88\xd5\xa7\xe4" - "\xf3\x0e\xd0\xf8\xa1\x01\xde\x1a\xca\xe7\x2d\x34\x06\x46\xf0\x0f" - "\xf0\xb5\x12\xaf\x0b\xb0\x78\x5b\xd4\xeb\x0f\x5c\x7c\x9d\xc3\xcf" - "\x0a\xe2\xde\x28\x25\x01\xf8\x7d\xd1\x65\x05\xa3\x8a\x5d\xc1\x1e" - "\xe1\x73\x3a\xc3\x3e\x9f\x67\x84\x26\x71\xc2\x93\x51\x22\x66\x4d" - "\x3e\x6f\xce\x58\xcf\xfb\x45\x3c\xb3\xf5\x44\x57\xaf\xef\xe7\x88" - "\x8f\x46\x75\xb7\x64\xd9\x6f\x42\x3c\xb4\xc1\x0c\xbb\x52\x94\x65" - "\xd7\x51\x5b\x3e\xe1\x19\xf6\x4f\xa8\x3d\x29\x54\x6f\x02\xa5\xe7" - "\xf3\xdd\xa2\x9d\xc5\x82\x8f\xa1\x3e\x3a\xab\x64\x3b\x9b\xa8\x8d" - "\x87\xe0\x0b\x36\x2b\xe8\x2c\x16\xf1\xd7\xd4\x18\xc9\x19\xf6\x21" - "\x8e\xef\xd1\xb7\x52\x33\xd6\xb3\xf9\x59\xeb\x6f\x28\x16\xfc\xe0" - "\x39\xf8\xac\xb1\xd0\x77\x8b\x01\x0f\x23\x62\x14\x0a\x9b\xa5\x12" - "\x93\xf5\x4a\xb1\xd5\x80\x63\xd6\x5c\xcb\xf4\xe0\xf5\x43\x75\x36" - "\x1b\x7c\xbf\x14\x79\x79\x00\x32\xb9\xd7\x07\x3b\xf5\x96\xfc\x68" - "\xc2\x97\xa6\xfb\xdb\x6d\x29\xa3\xdb\xac\x95\x7c\x9a\xc3\x2b\x5e" - "\x24\xda\xe7\x5c\x2a\x5d\xb7\xf0\xd2\x13\xc0\xd1\x44\xaf\x7c\x66" - "\xe0\x15\x2f\x51\x7e\x7f\x27\x5d\xb7\xf0\x92\x81\x06\x5e\xf1\x53" - "\x4a\x5f\xb2\xd3\x95\xd2\xc7\xd2\xa8\x3c\xe3\x25\x1f\xe0\xbd\x62" - "\x5e\xf2\xfb\x14\x2a\x47\xe9\x3f\x58\xe9\x4a\xe9\x4e\x0b\x95\xa3" - "\xf4\x87\xe6\x5e\x5d\x82\x99\xee\x29\x2f\x98\x2e\xbf\xc5\xd3\xc5" - "\xb7\xca\xf4\xe9\xe2\x1b\x65\x13\xd2\xc5\x37\xca\x0c\xe9\xe2\x1b" - "\x65\x93\xd3\xe5\x37\xba\x12\xa8\x1c\xb5\xf1\xa3\x62\xba\x96\xf2" - "\x92\xe3\x5e\x2a\x47\xe9\x3f\x65\xd3\x95\xd2\x1f\x77\x50\x39\x4a" - "\x9f\xa0\xb6\xfc\x94\xd2\xdd\x8d\x54\xce\xc8\x4b\x7a\x92\xe9\x5a" - "\xce\x4b\x4e\xd6\x50\x39\x4a\x9f\x32\xd2\x95\xd2\x7d\x54\xcf\x4f" - "\x29\x7d\xda\x47\xd7\x72\x5e\x16\x8f\x76\x24\xf0\x32\x13\xd5\xfb" - "\x62\x35\x2f\x9b\x82\xf2\x94\xbe\x8a\xea\x7b\x89\xd2\x89\x7d\x54" - "\x8e\xd2\xd3\xaa\xe9\x4a\x69\x33\xfa\x9a\xc8\xcb\xae\xed\xa1\xeb" - "\x36\x5e\x76\x1d\xe5\xbf\x44\xe9\x19\xf3\xe8\x4a\xe9\xeb\x51\x9e" - "\xd2\x96\x6d\x74\xa5\xf4\x4d\x80\x91\x99\x97\x25\xd7\xd3\xb5\x86" - "\x97\x7d\x99\x51\x39\x4a\xdf\x82\xf6\x53\xfa\x2b\x4e\x2a\x47\xe9" - "\xd9\x80\x15\xa5\x53\xd0\xcf\x24\x5e\x76\x07\xea\xaf\xe5\x65\x5f" - "\x05\x5c\x28\xfd\xf7\xfb\xe8\x4a\xe9\xbb\x08\x1e\x3f\xa5\xf4\xbc" - "\x3c\xba\xd6\x8e\x3a\x9e\x65\xf3\x17\xf1\x4d\x13\x19\x2f\x4b\x2f" - "\xe5\x9b\x26\xd1\xf5\x1b\xa9\x7c\xd3\x04\x2b\x2f\xbb\xbf\x86\xf2" - "\xe9\xfa\xcf\x09\x94\x9e\xa5\xa6\xe9\xfa\xcf\x7d\x94\x4e\x51\xd3" - "\x74\x5d\xe4\xa4\xf4\x5c\x35\x4d\xd7\x8c\x74\x4a\xa7\xf2\xb2\xc5" - "\x16\x4a\xd3\x35\xe3\x10\xa5\xe7\xa9\x69\xba\x7e\xb3\x87\xae\x41" - "\xef\x8c\xd5\x2d\xde\xb8\xbc\x62\x6f\x5c\x83\xd0\x33\x0a\x55\xbe" - "\xc8\x94\xf8\x17\x8b\x69\xdf\x99\x58\x74\x91\x4d\xea\xd5\x4d\x3d" - "\x09\x5a\xd1\x55\xe0\x16\xf1\x92\x54\x5f\x44\x13\xbb\x75\x53\x4e" - "\xd0\x5e\x9f\x8a\x78\xb8\xd4\xe7\x79\xdc\x31\xe1\x02\x5d\x0f\x73" - "\xc7\xe4\x6e\xea\x33\xa5\xa7\xbc\x4f\x57\x4a\xff\x5d\x19\xf5\x99" - "\xd2\xdf\xbe\x97\xae\x87\xfd\x25\x53\xd3\xdc\x3a\x93\xdc\x6f\x5f" - "\x2a\xf6\x9a\x82\x45\x84\x53\x08\xe7\x6e\x3f\xd8\x68\x0a\x66\x13" - "\x9c\xf7\x56\x9b\xe0\xcf\x7c\x97\xcd\xc0\xe3\xf3\x44\x9b\x10\xb3" - "\x80\x0f\x25\xeb\xe5\xb7\x27\xf3\x6e\xdd\xd4\x27\x21\xbb\xe4\xf1" - "\xe5\x63\x3d\xaf\x10\xcf\xa7\x1f\x74\xca\xe7\x06\x16\x7e\xfe\x6d" - "\x3c\xdf\x6f\x82\xbc\xf9\xfa\xef\x8a\xe7\x2e\x5f\x9f\xda\xaf\x28" - "\x3c\x7b\x07\x65\xdd\xba\xa9\x1e\x29\x8b\x9a\x42\x7c\x6a\x14\xeb" - "\x37\x9c\x28\xa0\xb6\x13\x8e\x35\xcd\x55\x69\xe1\x7a\x6e\xe8\xda" - "\x23\xed\xaa\x4f\x8e\xba\x46\xc1\x0b\x2a\xe5\xfb\xfb\x2a\x1c\xbc" - "\x03\xfc\x25\xed\x23\x7a\x4b\x61\x72\x53\xb7\x2e\x11\x7a\x2f\x3e" - "\x6e\x3c\x58\x0a\x7b\x9c\x6e\xdd\x55\x15\x43\x65\x27\x1a\x11\xcb" - "\x9c\x9e\xbd\x53\x14\xe0\x17\x9d\x85\xf7\xd2\x7e\x27\xf2\x3d\x42" - "\xc7\x5b\xde\x77\x0a\xfd\x1e\x79\xdf\x2c\x64\xa0\x54\x17\xde\x8d" - "\xa4\xe7\x43\x25\x77\xef\x53\xe2\x0f\x56\x8b\xf3\x28\xdd\x55\x3f" - "\xf8\x8d\xe2\xd6\x9b\xf2\xd8\x04\xcb\x86\xd7\xa9\xfe\xab\x3a\x47" - "\xf2\x7e\x5a\x59\xf1\xec\x37\xaf\x51\xd9\x9d\x42\x4e\x73\x55\x9f" - "\x26\xd7\xe5\xd4\x87\x67\xe0\x2f\x5a\xcf\xd2\xb0\xb7\x49\x5a\x2e" - "\x31\x07\x7e\xce\x82\xc6\xbd\xb6\x60\x79\x9e\x2d\x54\x7e\xb0\x94" - "\x57\x1e\xac\x8e\x0f\xea\x98\xd0\x8f\xd7\x25\xee\x9a\x13\x80\xfc" - "\xec\x5d\x94\x7d\x58\x99\xf8\x4f\x2b\x67\xdb\x99\xde\x99\xdb\x85" - "\xf4\xf3\xbc\xe4\xfe\x44\x97\xa7\x93\xc1\x6f\x23\xa5\xb7\xf1\x92" - "\xcc\x80\x32\xf1\xc1\x8e\x3a\xd0\xa0\x76\xc8\x7d\xde\x47\xfe\xb5" - "\x34\x2e\x44\xdf\x27\xe6\x45\xc4\x6e\xef\xa8\x20\xd8\x81\x3e\x84" - "\x2d\x73\x56\x28\x04\x7f\x33\xa5\x6e\x82\x83\x1c\xaf\xc4\x4c\xe0" - "\x6d\xf5\xbb\xfb\x95\xd8\x13\xb5\xf0\x40\x63\x0a\x1a\xe0\xbf\xe3" - "\xa2\xb0\x7f\x0c\x22\x6e\x14\xf6\x4b\x59\x76\x84\xaf\xca\xc7\x6c" - "\x59\x1b\x6c\xab\x73\xf3\xb2\xd6\xda\xee\xb2\x20\x86\xf5\xea\xc7" - "\x2d\x4f\x2e\x7f\x72\x75\xee\xfa\xcb\xe9\x48\x83\xbf\xe4\x6a\xa2" - "\x7f\xae\x32\xa3\x5d\xef\x10\x6d\x2a\xe4\xc9\xba\x69\xc7\x31\xd6" - "\xdb\x5f\x90\x3e\xbf\xa9\x0c\xd1\x3f\xff\x2e\x7c\x0c\x28\x35\x07" - "\x1b\x78\xad\xcd\xb0\x15\x36\xdc\x6b\x41\xff\x7b\x99\x8b\x5d\xa0" - "\xb6\xc9\x98\x55\xed\x41\xa2\x95\xf3\x0b\xb8\x33\xff\x02\xd6\x41" - "\x29\xaf\x68\xa8\xa1\x75\xb0\xf8\x52\x45\x5e\x5f\xb7\x6e\x9a\xf3" - "\x52\x45\x43\xa9\x16\x4f\x22\x54\xde\xd0\xa7\x18\x0f\x88\x78\x12" - "\x43\xdc\xcc\xda\x08\x96\x83\xa5\x27\x4a\x69\x1f\xd8\xb2\xcb\x41" - "\xfb\x18\xf1\x0e\xc2\x57\xc1\x4b\xc5\x1d\x21\x6e\x8d\x0e\x39\x98" - "\x81\xae\xf1\x3c\xfe\x60\xca\x90\x71\x6f\x31\x9e\x23\x8e\x44\x68" - "\xc8\xca\x0a\x8f\x71\xe5\xdf\x72\x68\xde\x38\x18\x17\x71\x00\x73" - "\xce\x32\xca\x8f\x55\x2a\xf7\x26\xf4\xa6\x33\x3d\xca\x12\x9d\xc4" - "\x96\xd0\x7d\xc1\x52\x16\x47\xe5\x4c\x05\xef\x50\xbe\xdf\x1a\x1b" - "\x2c\xb2\x1a\x06\x8b\xac\xb1\x43\xdc\x6a\x74\xf5\x04\xd8\xd0\xcd" - "\xc5\xee\xdb\xbc\x2c\x7a\x3b\xd1\x53\xbb\x14\x5a\x83\xb5\xab\xbd" - "\xa1\xa7\xad\x13\x83\x4f\x5b\xa3\x87\x86\xac\x86\xe0\x3a\x6b\xf4" - "\xe0\x3a\xeb\xc4\x21\xbf\xd5\xe0\x5a\xe6\x65\xef\x7a\x7f\xc6\xda" - "\x7b\xfa\x84\xcc\x71\x28\xee\xe0\xbc\xa1\xb8\xbd\x49\xc6\x1e\x96" - "\x38\xdb\xc6\x40\x3f\xeb\x76\x10\xad\x4c\x73\xc2\x18\x7c\xb1\x98" - "\xf6\x8c\x03\x6e\x82\xef\x8b\xf7\xdd\xc2\xcf\x87\x4a\x92\xec\x96" - "\x6f\x10\xbe\xda\x14\x9d\x44\x79\x34\x7f\xac\x7d\xbc\xe4\xe6\x14" - "\xe2\xd5\x09\xbf\x45\x27\xbb\xe5\x38\xd0\x3e\x76\xdd\x2c\x4a\x27" - "\xa1\xac\x2c\x77\x63\x81\x5b\x5c\x67\xb4\x8a\x58\x7b\x25\x89\xc7" - "\x76\x09\x1e\x6e\x5a\xa7\x46\x87\x37\x47\x8f\x6e\x27\x4e\x65\x82" - "\xc3\xbc\xb0\x42\x38\xa7\x62\xcf\xa8\xbe\x57\x79\xd9\x87\xfb\x70" - "\xfe\xa8\x10\xdc\x7a\x75\xd7\x3c\x09\x9f\x36\xbc\x28\x5d\xe5\x3f" - "\xaf\x49\xc3\x3c\x85\x6d\x35\x64\x14\x6a\x9e\x3c\xe3\xd7\xa7\xc1" - "\xef\x72\x13\xfc\x08\x41\x26\x41\xf3\xba\xc5\xad\xbb\xa6\x18\xb1" - "\x8e\x89\x8f\x6b\xa4\x5f\x13\xfd\x9c\xcf\x41\x56\xe1\x60\xf7\x69" - "\x72\x9c\xd1\xdb\x7a\x4d\x83\x9b\x95\x56\x87\x79\xd9\x6b\x9a\xa8" - "\xae\x84\x71\xeb\xf2\xe9\xae\x19\xd3\x57\xac\xf0\x5b\x07\x18\x57" - "\xbe\x68\xa9\x56\x86\x7d\x15\xd2\xde\x60\x8e\x43\x5c\x71\xf1\xac" - "\x7c\x6f\x75\xe1\x67\x2c\x0a\xcf\x1a\xa1\xab\x40\x69\x4b\xae\x8e" - "\xbb\x7c\x01\x46\xef\x44\xf3\x24\x9b\xa1\x71\xc0\xab\xc7\xba\x68" - "\xa7\x3c\x7a\xf7\xe6\xea\x01\xb5\xde\x9a\x83\x8d\x45\x4f\x31\xe1" - "\x5f\x1e\xf1\x34\xb0\x5e\xaa\x0b\x89\x67\x44\xec\x8f\x5c\xe0\x6a" - "\xf3\x52\xba\x37\xa0\x1c\x37\xee\xad\x56\xa8\x0e\x5a\x33\x01\x1e" - "\xb7\xd7\xae\x54\xec\xa5\x3d\x64\xb5\x93\xcf\xb0\xe5\x28\xdb\x0f" - "\xd6\xf8\x4b\xcc\xd4\xff\x69\x82\x27\x81\xbf\x12\xc8\x41\x42\xc4" - "\x8f\xb7\x37\x04\x19\xbf\x37\xc8\xde\xcc\xbb\xc8\xbc\x31\x27\xca" - "\xbd\x71\xfb\xfb\xbc\x71\x07\xdc\xa1\xb8\x03\x29\xf4\x9b\x6b\xcb" - "\x65\xc6\x33\xba\x6b\x0b\x42\x0e\xe9\x6b\x38\xe3\x33\xee\x17\xfa" - "\x93\x0e\xf8\x06\x93\x7e\x8f\x84\xcf\x61\x35\xd6\x08\xd5\x99\x2c" - "\x62\x8c\x10\x8f\x11\x5a\x47\xbc\xc5\x00\xad\x83\x01\x66\xd6\xe2" - "\x47\xec\x52\xfd\x0a\x57\xe6\x87\xf9\x0a\x95\x67\x48\xc4\x7d\x48" - "\xff\x4b\xeb\x2e\xf8\x49\x02\x6e\x86\x9f\x24\xf0\x0f\x6b\xac\xf0" - "\x43\x18\xf6\x93\xe4\xb7\xea\x89\x66\xed\x20\x7a\x55\xd0\xad\xc2" - "\x77\xa1\xd0\x01\x67\xc6\x50\xdc\xde\x1c\xe0\xb4\x2c\xbb\x53\xf8" - "\x2e\x04\xed\x8a\xbd\xc6\x5f\x72\x6d\x93\x46\x8f\x02\x7f\x86\xb6" - "\x9e\xa8\xa1\xdf\x36\xca\x27\xfe\xf7\x36\x83\x86\x5b\x69\xcf\xad" - "\x0f\xc5\x7e\x7b\x9f\x1f\x7a\xfd\x43\x39\xf3\x51\x96\xe0\xd8\x81" - "\xf8\xef\xa1\xa1\x9c\x79\xf4\xbb\x9b\x7e\xf7\x84\x2a\x1a\xaa\x43" - "\x15\x07\x9c\xa1\x8a\xbc\x3d\xf4\x6b\xa0\xdf\x3e\xfa\x35\xd2\xef" - "\x10\xfd\x9a\x78\x45\xde\x61\xba\xe2\x79\x33\xfd\x5a\xe8\xd7\x4a" - "\xbf\x0e\xfa\x1d\x0b\x6d\x3f\x58\x1f\xd2\x45\x27\xd1\x2f\x99\x7e" - "\x16\xaa\xc7\x1a\xaa\xd8\x1f\x08\x55\xec\xb5\x09\x7b\xcb\x92\xe9" - "\xcb\xb4\xb9\x3a\xba\xdf\xea\xc9\x76\xe1\x1b\x7b\xc2\xc7\xdc\x84" - "\x18\x94\x05\x17\xe1\x77\xcb\xfe\xa6\xd5\x37\x3e\x1f\xe9\xba\xe9" - "\xdb\xc6\x9a\xdb\xa8\x9f\xf0\xcc\xd0\x38\xeb\x1b\x33\xfe\x85\x62" - "\x3e\xd8\x10\x4c\xb2\x2d\x0e\x3a\x58\x31\xe1\x36\x5d\x7b\x76\x0f" - "\xcb\xf0\xb2\xa2\xd6\x9e\x41\x56\xb4\x8c\x87\x04\x1e\x28\x80\x9e" - "\x76\x79\x10\xf3\x3c\xc4\x33\x2d\x43\xe5\x0d\x35\x21\xe3\x7e\x27" - "\x37\xee\x0f\x08\x5f\x5e\x84\x4f\x10\x4f\x67\x98\xaf\xc5\xbc\x23" - "\xde\xb6\xcd\x73\x91\x3d\xbd\x8c\x2b\x6d\x39\x44\xa3\x75\xd2\xe4" - "\xd3\xb1\x1f\x89\xf9\xa7\xf2\xb6\xff\x7c\x9c\x17\xd3\x7c\x8a\x09" - "\x11\xdc\x14\xf0\xb4\x34\xf7\xc0\xdf\x6a\xf3\x8f\xf6\xf5\x04\x2d" - "\x06\x09\x9f\x38\xdd\x4e\xcf\xa2\x11\xa3\xa4\x96\x78\xdb\xda\x7c" - "\x96\x5c\x4b\xcf\x44\x3c\x39\x6a\xf7\x03\x36\x13\x57\xbe\x67\x65" - "\x75\x4f\x30\x43\xdc\x59\x19\xa3\x30\x44\xb0\x0f\xfb\xb8\xce\xeb" - "\xbb\xff\xac\x85\xbd\x69\xfd\x23\xed\xcf\x8d\x34\x2e\x79\x7d\x43" - "\xb4\x87\x11\x2c\x43\xe3\x83\x65\x52\xca\x7f\x15\x2c\x87\x92\x56" - "\x7b\x25\x3c\xb3\x19\x60\x76\x39\x3c\x01\xe3\x0d\x3d\x04\x4f\x82" - "\xab\xeb\x58\x88\x78\x54\xb6\x54\x83\xe7\x4e\x82\x27\xc1\xd4\x0c" - "\x98\x12\x3c\x04\x4c\xb9\x0a\xd3\xba\x08\x98\x12\xfe\x12\x7e\xcf" - "\x00\x53\x85\x60\x5a\x37\x06\x4c\x87\x65\x04\x04\xd3\xdd\x9f\x0b" - "\xa6\x0d\x7f\x05\x4c\x67\x6c\x19\x0b\xa6\x41\xd0\x0e\x95\x79\x6e" - "\x4e\xb8\xd1\x15\x7c\x57\xf8\xf0\xe3\xe5\x07\xe6\x2a\xe5\x07\x52" - "\x14\x63\x43\x1f\x62\xcf\xe2\xac\x1e\x31\x71\x8a\xec\xfc\x44\x51" - "\x03\xbf\x14\xaa\x3c\x98\x86\x3c\xc2\x6d\x39\x73\xa0\xff\x63\x73" - "\xd3\xfe\xc5\x9b\xda\x07\x7c\xb4\xa7\x59\x7e\x33\x08\xda\xbb\xf2" - "\x60\x91\xc2\x73\x18\xf0\xca\xa3\xb7\xb0\xe8\x41\xc2\x1d\xb6\x7c" - "\x76\x43\x35\xe1\xc3\xc1\x8a\x03\x73\xcf\xe8\xae\xcf\xbc\xcf\xa6" - "\x70\xfa\x15\xc1\x17\x9d\x42\x78\x97\xf0\xb9\x18\x5f\x8c\x19\xce" - "\x00\xdb\x1e\xfd\x2d\xd5\x77\xc3\xd7\x8f\x66\x07\x59\x51\xce\x9f" - "\x8f\xaf\x52\x94\x69\x09\x95\xff\xe5\x75\x82\xb8\x5c\x05\x7d\x18" - "\xd7\x46\xe6\xea\x09\xaf\x13\x45\xc5\xd3\x18\x0b\xac\x0b\xac\x91" - "\xaa\x08\xfc\x4c\xb8\x3f\x61\x97\xea\xe3\x3d\xe4\x20\xfc\x0c\x3f" - "\xc0\x34\x96\xf0\xfd\x3e\xea\xfa\x78\x9a\xd6\xc7\x06\x11\x97\xc3" - "\x4c\xf0\x68\x1c\xf4\xcb\x31\xc4\x98\xb9\x82\x2d\x62\xfc\xaa\xd5" - "\xfd\x40\xc2\x7d\xff\x10\xe7\x99\x44\xd3\x4d\xb1\x2b\x95\x07\x53" - "\xb8\x3f\x27\x16\xb1\x59\x76\x9f\xa3\xf9\xb4\x8c\x68\xa8\xf3\xb4" - "\x5f\xac\xa2\xf9\x75\x8e\x25\xef\x5e\x45\x74\x91\x1f\xb1\x80\xa8" - "\x3d\xeb\x65\x0c\x45\xa5\x64\xfa\x71\x7a\x26\x7c\xeb\x29\x9a\x6f" - "\xbd\x7e\x2b\x64\x1b\x61\x99\xd3\x6a\xab\x3e\xfc\xcd\x53\x09\x21" - "\xe3\x14\xbb\xb0\x0b\xd5\x59\xa4\x3f\x67\xc3\xbb\xa9\x80\xab\x47" - "\x67\x59\x28\x65\xbe\xae\x79\xb6\x42\x36\xe9\x8c\xee\x86\x4b\xbc" - "\xec\x0f\x29\x36\xc4\x85\xd5\x9e\x15\x65\x02\x0e\x96\xd9\xc5\xac" - "\x38\x54\x31\xa5\x06\xf1\x82\x79\x51\xce\x38\x71\xaf\x45\x9c\xc1" - "\x84\x4a\x4f\x25\x12\x9c\xd2\x94\xb2\x53\x49\x84\x53\x52\xf8\xf7" - "\xa8\xaf\x4f\x50\x5f\xcf\x10\x5c\xcf\x50\x5f\xd7\xa9\x7d\x55\xe3" - "\x23\x29\x04\x7f\x7a\x36\xfa\xfe\xa8\xf5\xf5\x7b\x04\xef\xd2\xb7" - "\x0d\x1b\xcf\xb2\xab\x38\xd1\xe4\x6d\x1e\x61\xdb\xe3\x77\x05\xff" - "\xc8\xf0\x5d\xb1\x7f\x97\xe7\x35\x3d\x4c\xf3\x11\x30\x27\x5a\xdb" - "\xc2\xe3\xf7\x26\x68\xe3\x80\xf6\xf0\xa1\x9c\xd8\xba\x55\xd4\x1e" - "\xc0\xfe\x1c\x9b\x85\xf5\x4c\xb0\x4f\xae\x03\xfc\x47\xc6\x28\x4d" - "\x14\x63\x30\x91\xc6\x60\x95\x3a\x06\x15\xea\x18\x10\xcd\x4c\x7b" - "\x31\x64\x3d\xe6\x3a\x87\x1c\x83\xf1\xc1\xe8\xc6\xb9\x7f\xe3\xf5" - "\xba\x70\xec\xf5\x9a\xfc\xd4\xa0\xe4\xa5\x75\xf0\xf1\x47\x7c\xc2" - "\x66\x65\x88\xd6\x6d\xa5\xba\x6e\x79\xce\x3d\xda\x9a\xed\xd5\xdd" - "\x14\xf7\xf9\xd6\xec\x4d\xa1\xff\x4b\xd7\x6c\xe2\x7f\xed\x9a\x9d" - "\xf9\xe6\xc8\x35\x3b\x33\x30\x72\xcd\xce\xdc\x1f\x5e\xb3\xea\xb3" - "\xbf\xc9\x9a\x9d\xd9\xfc\xdf\xb3\x66\x67\x36\x8f\xb2\x66\x93\x3f" - "\xc7\x9a\x35\x8f\xb1\x66\xcd\xff\x75\x6b\x36\xf9\xcf\xce\xa4\xfe" - "\xeb\xf6\x58\xeb\x2d\x83\xfa\x51\xf6\xd8\xa7\x23\xf6\xd8\x38\xec" - "\xb1\x37\x1f\x1e\x6d\xbd\x0e\xd5\xd2\x7a\x35\xaa\xeb\xf5\xdf\x7e" - "\x45\xf5\x7d\xe9\x95\x77\x8f\xff\xe5\xf5\x1a\xac\x0d\xd3\x4f\x63" - "\xae\xd9\x1c\xac\xd9\x06\xe6\x72\x8b\x35\xbb\x54\x5b\xb3\xb5\x2a" - "\x3f\x74\x85\x75\x9b\x38\xd6\xba\x45\xbc\x15\xc4\x5a\xb9\xe2\xba" - "\x55\xe9\xa5\xa1\x19\x58\xb7\xce\xff\x61\x7b\xed\x97\x37\x8e\x5c" - "\xb7\x5f\x6e\x1c\xb9\x6e\xbf\xbc\x3c\xbc\x6e\xd5\x67\x7f\x93\x75" - "\xfb\xe5\x82\xff\x9e\x75\xfb\xe5\x82\xff\x73\xf6\x5a\x6b\xfd\xff" - "\x7f\x7b\xed\x57\x4e\x8a\x75\x3b\xd6\x5e\x5b\xa4\xee\xb5\x71\xd8" - "\x6b\x6f\x59\xff\xf9\xd6\xee\xad\x4f\xfd\x5f\xbe\x76\xff\x8b\xf7" - "\xdc\xaf\xfc\xc3\xc8\xb5\xfb\x95\x95\x23\xd7\xee\x57\x6e\x0c\xaf" - "\x5d\xf5\xd9\xdf\x64\xed\x7e\x25\xf5\xbf\x67\xed\x7e\x25\xf5\xff" - "\x9c\x3d\x77\xd6\x98\xf1\x2b\x2d\xd7\xb3\xe2\x6e\xdd\xac\x57\x5c" - "\xb5\x42\xcf\xaf\xd8\x15\xbc\x8b\x49\xdd\x94\x59\x7f\x74\x99\x53" - "\x99\x52\xd6\x2d\x7c\xd8\x43\x47\xe6\xb9\x08\x1d\x14\xa9\xef\x32" - "\x2b\xa4\xe9\xd0\xec\x56\xfd\xdc\x5f\x49\x87\x86\x97\x9e\xd8\x26" - "\xdf\xbb\x2d\x55\xce\x8d\x13\x35\x5a\x5a\xf8\x9b\xd2\xdd\x36\x8f" - "\x6f\x3d\x51\xed\x8d\x39\x51\x3d\xd6\x79\x51\xfc\x26\xce\xa1\x6f" - "\xd2\x7f\x7d\x71\x71\x7f\x19\x63\xd5\xe2\x2c\xe6\xb6\x3c\xea\xa3" - "\xd0\xef\xe8\x8f\x4f\xce\xee\x77\x2c\x66\x94\x57\xaa\xe5\x89\xd8" - "\xa7\x8e\x28\xae\xd0\x33\xc2\x21\x8b\x76\x17\x32\x03\xfc\x77\xce" - "\x1e\xc0\x5c\xbc\x0d\x38\x42\xe8\x92\xc0\xaf\x3f\xbf\xe6\x3a\x5f" - "\xdd\x05\x16\xdd\xbe\x45\xc8\x9f\xa1\x7b\x53\x5f\x89\xf9\x1f\x75" - "\x6b\x0d\xd7\x47\x33\x65\x97\x2d\x93\xc7\x1d\x48\x15\xfa\xbd\x34" - "\x57\x34\x7d\x1c\xc4\xc2\x51\x66\xac\x0e\x68\x3e\x24\x39\xb5\xef" - "\xb5\x42\xaf\x1e\xf1\x74\xeb\x72\x59\x02\xfd\x8c\xbc\xe2\x40\xaa" - "\xbf\x64\xb6\x45\x93\x27\x8e\xa9\xab\x8d\xf8\x8d\xd7\x99\xa3\x55" - "\xdd\x1f\xd8\xd0\x4a\xbd\x68\xbd\x52\x1a\xa2\x7c\xee\x28\x12\xf1" - "\x57\x4c\x04\x0b\xe8\xd7\x12\x9e\xd2\x2b\x75\xc5\xc5\x9b\xa7\x33" - "\x76\x60\x43\x9f\x1e\xfa\x20\xa1\x1f\x5e\xe7\x73\x16\xde\x21\xe2" - "\xa9\xc3\x47\x71\xaf\x6e\xce\x8c\x8c\xd3\x32\x56\x23\xdd\xdf\x82" - "\x33\x98\xfb\x29\x0d\xfd\x00\xa5\xdf\x1c\x8d\xb2\xbd\xba\xd9\x1f" - "\x38\xf3\xbb\x98\xc9\x26\x74\xe0\xa5\x2f\x6e\xdd\xec\x3d\x28\xeb" - "\xd6\xcd\x11\xb6\x1c\x94\x6e\xc2\xb9\x01\xf4\xe4\xa1\xdf\xc4\x6b" - "\x6d\x99\x02\x3f\x94\x1f\x48\x55\x66\xd8\x32\x85\x6e\x2a\xf5\xb3" - "\x8a\xfa\x4c\x65\x8c\xd0\xe5\x11\xd7\x42\x96\xb0\x8d\xf2\x50\x0f" - "\x5d\x8d\xce\x55\xd0\x57\x99\xbd\x0d\x75\x8f\x69\x03\x60\x3c\x40" - "\xf3\x22\x9a\x49\xbb\x1c\xdd\x7b\xdd\xba\x39\x2d\x26\x1d\xe7\xbc" - "\x76\x75\x60\x33\xe4\xdc\xd0\xbb\x16\xba\xe4\x73\x7e\x44\xf5\x47" - "\xef\x16\x72\xdc\x39\xc5\x6e\xdd\x6c\xcd\x8f\x8b\x8c\x0f\xa1\x9b" - "\xd3\x89\xef\xe0\x1d\xb5\xbc\x8c\xfd\x48\x6d\xb6\x14\x46\x71\x4a" - "\xbf\x21\x75\xb3\x0d\x4b\xe9\x7d\x67\x58\x27\x4d\xbc\x47\x73\x69" - "\xce\x31\x1a\x33\xa1\x57\x82\xf4\x98\x7a\xcf\xea\xb8\xb5\x99\x69" - "\x6e\x5c\x3e\x76\xda\x1c\xa1\x79\xa1\xcd\x11\xb4\xf7\x60\xa1\x5b" - "\x2f\xcf\x38\x52\x84\x1f\xac\x4a\x1a\xc3\xd0\x4e\x33\x7c\x14\x32" - "\x65\x08\xe3\x02\xfd\xf9\xdb\xaf\xc5\xb8\x54\xd1\x5e\xa0\x96\x9d" - "\x17\x6e\x3f\xd2\xb7\x8b\xf1\x54\x68\x2c\xa4\x3e\x54\xca\x59\x11" - "\xeb\x82\x70\x06\x74\xc8\x9b\xed\x0c\xe7\xc5\x99\x9c\xe6\xc8\x81" - "\xdc\x80\xbe\x2e\x5f\xe6\xbf\x76\x21\xa0\x87\x3e\x09\xe4\xe1\x15" - "\x4f\xb0\x68\xc8\xd5\x51\x27\x4f\x5a\x1d\x98\xa3\x8d\xe3\x06\x1a" - "\xbb\x7c\x9a\xbb\x04\xf3\x2a\x82\x5f\xdd\xa0\x38\xb3\x0a\xd4\x29" - "\xcc\xa8\x50\x39\xb7\xee\x76\x2b\xd5\x97\xb0\x6b\x1a\xf7\x42\x6f" - "\x9b\x60\xb8\xd6\x5f\x72\x7b\xb4\x06\x43\xb4\x09\x7a\xd7\x15\x42" - "\xff\x3e\xa5\x58\xce\xa1\x94\xc5\x5a\x9f\xc7\x82\x67\xc5\x01\x96" - "\x54\x31\x9b\xa5\x2a\xc6\xc9\x76\x1e\x75\x5d\x3d\xe4\xcd\x0f\x78" - "\x18\x83\xcf\xee\x8c\xef\x7f\xcc\x5d\xde\x10\x53\xe2\x26\xdb\x71" - "\x3e\x11\xda\x7c\xeb\xd4\x8c\xf5\x88\x77\xdd\x50\x53\x14\x60\x09" - "\xae\x42\xaf\x8c\x95\xc3\x3e\x63\xa1\x35\x84\xc3\x09\xaf\xd3\x9e" - "\x1a\x5d\xf4\x19\xbb\x16\xf0\x52\xe2\x1a\x6a\x08\x66\x1f\x3e\x9c" - "\xc7\x8a\xc7\x87\x47\x6f\x17\xfe\xd3\x41\x5f\x10\xce\xd7\x8b\x58" - "\xc9\x5e\xa2\x4f\x2a\x1a\x6a\xc6\x59\x8f\x67\x2c\x1c\x89\x7e\x2b" - "\x90\x43\xab\x7d\xce\x40\x9f\x7d\x01\x06\x59\xfe\x03\x4f\xc1\x07" - "\xe8\x45\xa6\x54\x4c\xb6\xa3\xcf\x44\xeb\x98\xc7\x2f\xd3\xbf\x63" - "\x4c\xfb\x4f\x7c\x9b\x13\xbc\x95\xcd\xd7\xd5\x2b\xc6\x03\x66\x7c" - "\x1b\x6d\x80\xfd\xcd\x03\x17\x99\x80\x3b\xe0\xef\x0a\x84\x18\x8f" - "\x8b\x6c\x43\x70\xbc\x6d\x18\xbb\xff\xb3\x59\x52\xf9\x01\x39\xee" - "\xa1\xcd\x2a\x0c\x72\x70\x4e\x76\xc0\xdc\x6e\xf3\xb2\x07\xd0\x06" - "\xef\x59\x76\xff\x59\x26\xc6\xdf\x65\xf5\xb0\x50\xd4\xad\x53\xa1" - "\x7b\x81\xf1\x2f\x0c\xd2\xf8\x0f\x04\xe0\xff\xc3\xeb\x2a\xbe\xc4" - "\x40\xbf\x04\xfb\xad\xfa\x3f\x1f\xff\x3b\x3f\x7c\xd8\x3e\xde\xf1" - "\xbf\xf3\x6f\x34\xfe\x77\xfe\x0f\xe8\xff\xdc\x2f\xd0\xff\xb9\x7f" - "\xa3\xfe\xcf\xfd\x1f\xd0\xff\xaf\x7e\x81\xfe\x7f\xf5\x6f\xd4\xff" - "\xaf\x8e\xd9\xff\x05\xd7\x2a\x5c\xe8\xe4\xc4\xbf\x08\x1b\x33\x75" - "\x7f\xfb\xbb\xf7\xa0\x7f\x23\xec\xad\xd4\x34\x93\xf6\x57\x86\xcb" - "\xd2\xc6\xcb\xd2\x09\x97\xa5\x13\x2f\x4b\x9b\x2f\x4b\x27\x69\x69" - "\xda\x47\x26\x9c\xd3\xfd\xdd\xd7\x88\x2e\xa5\xfd\xf4\xef\x8e\xab" - "\xcf\x93\xe1\x1f\x87\xf6\xf4\xe4\xb1\x62\x7e\xc5\xe9\x18\x1f\xd2" - "\x73\x26\x62\x71\xe9\xfe\x7e\xf1\xa0\x83\x71\x1e\x35\xdd\x8a\x98" - "\x4a\x4a\x79\x5e\xf3\x03\xeb\x11\x83\x3e\x40\x74\xbe\x79\x22\xd5" - "\x7d\x4d\x06\xe1\x69\x8c\xab\x25\x17\xfa\x35\x7f\x7f\x37\xfa\x39" - "\xdb\xe6\x64\x4a\xd4\xad\x42\xbf\x41\xa9\xc8\x6b\xf6\x46\xdd\x3a" - "\x9d\x6f\x3f\x58\x5f\xe1\x50\x0c\x2e\xcf\x31\x56\xa9\x57\x2c\x05" - "\x05\x34\xbe\x9e\x43\xec\x69\x0f\xef\x2b\x08\xf2\x80\x6b\x89\x93" - "\x15\x79\x11\x8f\xa1\x85\xb5\x7b\x8f\x89\x98\x0c\x22\xf6\x84\xf7" - "\x10\x03\xfd\x53\x84\x32\x94\xd7\xee\xdd\xc7\xda\x28\xed\x5c\x75" - "\x92\xfa\xf9\xf7\x67\x5d\x9e\x7d\xc4\x2f\xe5\x39\x15\x63\xde\x1e" - "\x6e\xcc\x6b\x68\xf3\x20\x6e\x5f\xde\x3e\xb4\xb5\x9d\xda\xe1\x0a" - "\x36\x81\xcf\xda\x27\xea\xf5\x75\x08\x9e\x14\xe7\xb6\x4a\x1c\x95" - "\x8f\xcb\x6b\x40\xfb\xd0\xb6\xd1\xcf\x61\x5f\x9c\x4b\x6d\xbf\xeb" - "\x61\x6b\x34\x83\x8d\xc4\xf8\xe6\x48\x6a\xc2\x98\x74\x74\xf9\x8b" - "\x87\x64\xbd\x86\x2f\x52\xef\x98\xf8\x9f\x97\xbf\xa4\xb6\x37\xe1" - "\x8b\xd4\xeb\xbc\x42\xbd\x6a\x7b\x2d\x5f\xa0\xde\x7f\x30\x8f\x5d" - "\xef\x4f\xd5\xf6\xa6\x7d\x91\x7a\xc7\xb6\xd1\x2c\xff\xa9\xda\xde" - "\xe2\x2f\x52\x6f\xcb\x15\xc6\x6d\xee\x17\x9b\x0b\x77\x25\x5d\x69" - "\x2e\x7c\xb1\x79\x70\xd7\x15\xfa\xff\xd2\xdc\x2f\x36\x07\xee\xba" - "\x42\x4c\xf0\x97\x0e\x7d\xb1\xf1\xff\xc7\x2b\x8e\xff\x17\x1b\xfb" - "\x7f\x5c\x79\xa5\xb1\xff\x62\xe3\xfe\x8f\x63\xce\x7f\xf0\x06\xbc" - "\x7c\x8f\x97\xc7\x1f\xac\x56\x2a\xf3\xbc\x4a\xfc\x9e\x0b\x9b\x95" - "\x34\xb6\x60\x23\x63\xa6\x1a\x36\x65\xc1\x2e\xc6\x36\xd6\x32\x3d" - "\xf1\xce\xfa\xfd\x1b\x3a\xf5\xae\x60\x2a\xf0\x55\x68\x4f\x7e\x40" - "\x37\x93\xf2\xdf\xa0\x15\xeb\x23\x1a\x56\xd6\x91\xe7\xad\x2c\x4c" - "\x63\xc2\x6e\x8e\xf8\x07\xf8\x15\xcc\xf8\x8c\x70\x6a\x4d\x00\x3a" - "\x32\x53\xe8\xbd\x20\xcd\x5d\xaa\x23\xc0\x0e\x2a\x5e\x5d\x5a\xae" - "\x28\xe7\x15\x7a\xee\x95\x7b\x2e\xf0\x22\x2b\xfc\x8a\x79\x7b\x75" - "\xf3\x5e\x8d\xf2\x32\x7d\x1d\xd1\xe6\xfe\x92\x79\x87\xdc\xba\xbb" - "\xf7\xa8\x36\xa7\x1e\xe1\x0f\x8f\xda\xba\x99\x78\x04\x94\x85\x5f" - "\xbc\xd9\x36\xa6\x87\xaf\x61\x2a\xeb\x86\x8f\xbc\x2b\xd9\x6e\x87" - "\xca\xf7\x1f\xc3\xfb\xbc\x9c\xf6\xe3\xb3\x4c\xdf\xee\xf3\x32\x9e" - "\x64\x5b\x5c\x49\xfc\xc8\x7d\xb7\x40\x7e\x72\x81\x15\x6e\xe4\x0a" - "\x64\x59\xdc\xd8\x50\x0a\x7d\x43\xe1\x77\x5d\x77\x77\x01\x78\x7b" - "\x35\x76\xe4\xf4\x33\x94\x16\x3c\x11\xf4\x6e\x8c\x79\x76\x5e\x19" - "\x97\xd6\xee\xbb\x20\x62\x6a\x74\xeb\xee\xde\x08\xdf\x64\xfd\xc6" - "\xfd\x1d\x3e\xe3\xfe\x4e\x7f\xc9\xdd\x76\xad\x0f\xf8\xbe\x96\x0f" - "\x1e\x10\xe5\xe8\x79\x8d\x66\xcb\x3d\xea\xb8\x6f\x9e\x3e\x35\xc3" - "\xcc\xbd\x80\xab\x6c\xcb\x3d\x21\xc0\x9e\x97\xef\x6f\xf1\x15\x59" - "\xaf\x97\x32\x91\x7b\x92\xc1\x5b\x53\xbb\x0f\x49\x3e\x37\xef\x90" - "\x88\xcb\x41\xf8\xff\x61\xab\x7e\x9c\x34\xf0\xdd\x22\x86\xb4\xf3" - "\x7a\xec\xb7\xf7\x9c\xa4\xfa\xff\xb1\x5b\x77\x4f\xba\xe4\xeb\xf2" - "\x5a\xa4\x3d\xe6\xdd\x3d\xf4\x8d\x16\x4a\xdb\x50\x8e\x9e\xe7\xa8" - "\xcf\x3b\x22\x9e\x77\x40\xff\x54\x7d\x5e\xaa\x3e\x3f\x16\xf1\xfc" - "\x98\xed\x7a\xc8\x39\xee\x69\x44\x1f\x08\x8e\x8d\xf4\xbc\x59\xf8" - "\x39\x10\xb1\xe6\xf2\x1a\xd5\x72\xcd\x1e\xdd\x3d\xef\xf4\xd3\xdc" - "\xa2\xe7\xad\x11\xef\xb7\x1e\xb1\xa7\x30\xcc\x51\x7f\xc9\x3d\xc7" - "\xdd\xfa\xfd\x06\xc9\x1b\xdf\xdd\x27\xfa\x4e\x7b\x66\x64\x7d\x6e" - "\xdd\x3d\x0d\xd8\x17\x7d\x44\x93\x51\x99\x0e\x7c\x33\x12\xde\x9a" - "\x55\xa8\x65\xd9\x93\x4b\x2d\x8f\xad\x5e\xbb\x0a\x56\x7d\x23\xed" - "\xd5\x12\x60\xf7\xaa\x94\xef\x6d\x72\xd5\xc0\x0e\x2f\x41\xd8\x7c" - "\x6f\x83\x4e\x56\xfc\x01\x6f\xa8\xf2\x40\xb1\x12\xdf\x50\xef\xdc" - "\x70\x2f\x3b\xa7\x9b\x2f\xfc\x01\xb9\x2c\x8c\x95\xd3\x73\xe7\x86" - "\x77\x91\x27\x62\xa9\x21\xf6\x8a\xe0\xff\x37\x18\x58\xb3\xe5\x82" - "\x90\x21\xd0\xb3\x57\x85\xbc\xe4\x22\xd3\x07\x1d\x06\xf6\x1f\x85" - "\x1d\xfa\xc3\x8a\x5b\xff\x1f\x4a\xa7\xd0\x7d\x3e\x62\x6e\x61\x73" - "\xec\x06\xc4\xb3\xd2\xbf\x4e\x7c\x39\x9e\xe3\x99\x16\xd7\xec\x9c" - "\x2e\x2d\x46\xe8\x41\xdf\x24\xef\x8b\x6a\xf8\x89\x23\x66\xaf\x6a" - "\x0f\x3e\xff\x11\xb4\x15\x7a\x8d\x1e\xdd\xfc\xa5\x68\x9f\x5b\x37" - "\x3f\x3b\xaa\x56\xe8\x83\x1b\xa9\xfc\xfd\x4a\xc5\xde\x26\xe0\x82" - "\x60\xc9\xfc\x44\xee\x30\xbe\x04\x9b\xc0\xda\x67\x35\xfb\xd7\xb4" - "\x48\xfb\x57\x63\xbf\x9e\xcd\xa7\xbc\x45\x9a\x8f\x0b\xc4\x02\x1a" - "\x0b\xb7\x04\x88\x5e\xbc\x94\xb4\xba\x53\x31\xee\xa5\xb1\xd8\xdb" - "\x84\x08\xc3\x26\x11\xbf\x78\x90\xda\x72\xef\x42\x1e\xb7\xb7\xa1" - "\x10\x6b\xba\xb2\xa1\xfe\x67\xd0\x31\x24\x38\xee\x83\x4e\x21\xc1" - "\x72\x2f\xa5\xdf\x4d\x6f\x60\x96\x07\x41\x7f\xa5\xfd\xe6\x9f\x97" - "\xf1\xe0\xad\x8b\x9d\xac\xb5\xe7\x17\xec\xe8\xb1\x16\x66\x5c\xc2" - "\xa2\x8a\xdc\x3c\x24\xfa\x98\xc7\xf4\x19\x6e\x16\x05\xdf\x4a\xf0" - "\x8b\x0e\x9b\x8c\xf6\x40\x1b\xd1\x44\xe5\xc1\xfd\x85\x7d\x13\x2c" - "\x0f\x30\xa2\xa5\xe4\x79\xb5\xb0\x39\xf2\x0a\x9b\xee\x38\xc8\xce" - "\x23\x6c\x8d\x16\x16\x64\x73\x65\xe3\x59\x66\x68\xcb\xf9\x23\xcb" - "\xc8\x8e\xe2\xc2\xd6\xc8\x4e\x05\xbd\x34\xf6\xeb\xa4\x5e\xe0\xf6" - "\x01\x96\xd8\x9e\xe7\x66\x2e\x4f\x0b\xdb\x99\xcb\x12\xb9\x3f\x27" - "\xa6\xb5\xe5\x5d\x46\x38\xc0\x76\xb0\xd0\x39\x21\x64\x94\xba\x5a" - "\xa6\x4d\x3a\xc8\x4a\xe3\xcb\xa1\xb3\x35\xc0\x52\xb2\x4e\x16\x0b" - "\xf9\x2e\x64\xe9\x41\xbf\xd5\x32\xe4\xb7\xde\x34\xb8\xce\x7a\xbd" - "\x26\x83\x7f\xe4\x6c\x02\xce\x1c\x32\x79\xc9\x1d\x8d\xb0\x53\x02" - "\xed\x19\x8c\x9b\x62\x87\xbc\x5d\xf8\x8a\x59\x67\x4d\x52\x1e\xb3" - "\xb2\x39\x5e\x61\x07\x85\x33\x80\x84\xba\xef\xa0\xad\x17\x98\xd0" - "\x3b\x8a\x93\x7a\x47\x01\x9c\x7f\x1b\x0f\x58\xef\x5f\x61\x61\x83" - "\x33\x56\x77\xba\xec\x3f\x63\x45\x97\xf8\x09\xc1\x13\x20\xb6\x72" - "\x49\xda\x32\x1e\x77\xc0\xfa\xa6\xf5\x03\xec\x25\xa9\xe3\xc7\x0f" - "\xf7\x0a\xfa\x0f\xb0\xa1\x71\xf2\xee\xbb\x80\x71\x6b\xa8\xff\x79" - "\xae\x57\xff\x8d\x1e\x1e\x6c\x5b\xf6\x33\x76\xb4\xb3\x63\xc4\xf8" - "\x88\xf1\xa4\x72\x18\x27\x8c\x11\xc6\x2a\x3c\x4e\x1f\x88\x71\xda" - "\xa7\xc8\x71\x1a\x34\xee\xf1\x6a\x63\x15\xa8\x5d\xdd\xf7\x79\xc6" - "\xab\xb5\x67\xf4\xf1\x22\x38\x0f\x8f\xd7\x8e\x0b\x2c\xd1\xe5\x21" - "\x3a\x99\xc6\xeb\x1b\xdf\x64\xec\x1b\x7b\xb9\xd2\x96\xfe\xfe\xf0" - "\xb8\x05\xcb\xc7\x18\xb7\xd3\xe1\x71\xa3\xf1\xbf\xc2\xb8\xdd\x39" - "\x77\x3c\xe3\xd6\xda\x23\xc7\x2d\xa8\xea\x8b\x59\x9b\x99\x3e\xb0" - "\xce\xaa\xaf\x19\x60\xa9\x18\xbf\x45\x27\x2d\xec\xcd\x87\xda\x68" - "\xcc\x7e\x31\x62\xfc\x94\x8a\xfd\x2d\x34\x06\x46\x8c\xe1\x17\x5b" - "\x77\xf7\x1d\xfe\xfc\xeb\x6e\xe1\x57\xff\xdf\xba\xfb\x5b\xad\xbb" - "\x05\xc7\xff\xba\x75\x77\x5f\xe9\xff\x5b\x77\xff\xdd\xeb\xee\xbe" - "\x2d\x97\xaf\xbb\x61\xba\x21\x77\xf9\x93\x4b\x57\xac\x5a\xb1\xea" - "\xbb\x96\xef\xac\xcf\x5b\xbe\x46\x52\x0f\x23\xe8\x07\x73\xa8\x30" - "\x4d\x8f\xd8\xd0\xad\x35\x1d\xec\xe0\xf4\x0e\x7d\xe8\x94\x39\x9a" - "\x97\xcf\x74\x2a\xe5\xc9\x69\x88\x13\x8d\xf5\x89\xf8\xd1\xbd\xba" - "\x45\x69\xf0\x3b\x28\x7d\xbc\x2c\x12\x76\x07\x44\xa7\xe6\xe0\xec" - "\x67\xf3\x20\xfd\x36\xb0\x68\x53\x80\x19\x9c\xd7\xe3\xf9\x3f\xef" - "\x82\x8f\x34\xbe\xcb\x96\x53\x87\xb8\xce\x83\x2c\xda\x67\xcc\xfb" - "\xff\xda\xbb\x1e\x80\xa8\xaa\xac\x7f\xe7\x39\x2a\x2a\x03\xa3\x4b" - "\x86\x2e\xda\x54\xd8\x8e\xad\x26\x15\xb9\xda\x5a\x4b\xae\x16\x95" - "\x8a\x96\x6e\x58\x96\x5a\x5a\x58\x28\x84\x88\xa4\x08\x48\x66\x48" - "\xfc\xab\xcc\xcf\x3f\xfc\x6b\x3f\x05\xdc\x45\xc4\xd6\x0a\x4b\x73" - "\x4c\xdc\x25\x05\x86\x5a\xfa\x96\x5a\xdc\x26\x22\x23\x43\x9d\x00" - "\x05\x61\x66\xde\x77\xce\xbb\xef\x31\xef\x0d\x33\x30\xff\x44\xdd" - "\xa0\x9e\x33\x73\xdf\x79\xf7\xdd\x7b\xce\xef\xfe\xce\xb9\xf7\xbe" - "\x77\x6f\xe4\x26\xc8\x4f\xaf\xd8\x5b\x2a\x57\xe1\xbb\x2c\x0f\x41" - "\x5c\xf4\x87\x09\x5d\x6b\x27\xc9\x1e\x5d\xc2\x0e\x7a\x68\x16\x72" - "\x03\xbe\x7b\x78\x5e\x16\x7c\xe7\x65\x9c\x3b\x81\x98\x7a\xc1\x78" - "\xb8\xd7\x98\x88\x46\x6e\x5d\x08\xe0\x09\x7a\xfe\x61\x6e\x7d\xcd" - "\xcb\xa9\x85\x79\xdc\x1e\xdb\x9e\xc5\xfa\x96\xd4\xe2\xc4\x93\x71" - "\xdb\x79\x9e\x08\x7e\xfa\x91\xed\x94\x27\x2a\x7d\x01\x87\xb3\x00" - "\x87\xa1\xbd\xf1\x84\x08\x7f\x63\x1d\xe3\x09\xc4\x1b\xe2\x0e\x31" - "\x37\x0c\x30\x87\x38\x14\x70\xf7\x36\x8f\x3b\xef\x3a\xa2\xe4\xb0" - "\x67\xa0\xd8\xc3\xf7\xa9\x2b\x63\xcd\xb8\x33\x5a\xe2\xee\x92\x05" - "\xee\x18\x1e\x77\x6b\xa5\xb8\x7b\xea\xb4\x92\xec\xa2\x7c\x61\xc6" - "\x5d\xda\xf0\x58\x01\x73\x88\x3f\xc4\x9a\xe9\x05\x35\xa9\x6c\x6a" - "\xee\xc2\x5f\xce\xf3\x74\xfe\x96\x7b\x3e\x98\x61\x4b\x2e\xaf\xe5" - "\xf9\xe2\x9c\xc0\x17\x3b\x6d\xf8\xe9\xd3\x4e\xf2\xc5\xc3\xdc\xfb" - "\x1f\x68\xab\x0e\xb0\x1b\xda\xeb\x11\x5f\xe0\x09\xdf\x3f\x93\x53" - "\xf3\xaf\x11\xfb\x44\xb9\xc7\x3e\xb8\xbf\x2e\x94\xc5\x8a\x8d\xee" - "\x9c\xd6\x9b\x8d\xd0\x3e\x68\x27\xce\x3e\x60\x27\x61\x8e\x1d\xe7" - "\x5c\xd1\x56\x68\x9f\x3b\xe2\x08\x83\xf6\xca\x89\xa1\x1c\x81\x5c" - "\xc0\x3d\xd3\x6d\xc1\xf1\xa0\xf3\x83\x68\x33\xae\x5f\x9d\xa4\x58" - "\xb5\x75\x84\x79\x6f\x9a\xb6\xcd\x8f\x26\x76\x8f\xa3\x1f\xdd\xda" - "\xb5\x56\x9c\x2c\x98\x9b\xb3\xd5\x8c\xbe\x17\xda\xe7\x43\x74\x8d" - "\xc3\xd4\xbd\x61\x34\x86\x9f\xf5\x33\xcf\x01\x73\xb1\xef\xca\xf5" - "\x53\x8d\xd0\x4f\xf5\x84\x7e\x6a\x2a\xf4\x53\x71\xdc\x90\x5b\x6b" - "\xe1\xd1\x73\x74\x4e\x0f\xfa\xa5\x8a\xc2\x64\xe8\x23\x71\x6b\x30" - "\x72\xf3\xc7\x8a\x7d\xd5\xdc\x1e\xf2\x69\xd0\x07\xfe\x33\x43\xe0" - "\x77\xed\x09\xb5\xd1\x41\x4c\xcd\xf2\xe4\xe7\xc7\x33\x23\xd7\xe1" - "\xb3\x13\xb3\xea\x68\xf9\x1e\xe2\xd6\x18\xe3\xe6\x16\x19\x53\x9e" - "\xf1\x55\xe9\xdc\xa2\x78\xee\x79\x7f\xbc\x9e\x9f\x57\x9c\xc5\xed" - "\x99\x85\x7c\x82\x3c\xb8\x0f\xfa\x34\xe6\xb9\xc5\x2f\xf0\xfc\x09" - "\xe9\xdc\xe2\x2c\x2e\x4f\x28\x83\x1e\x9f\xa7\x81\xdf\x45\x34\xfd" - "\xa1\x83\xe2\x74\xf3\xdc\x3d\x4d\xc7\x77\xb8\xf8\xf1\x82\x26\x3a" - "\x4e\x30\xdb\x43\xe8\x8f\xdb\x88\x9f\x1c\xe0\xe9\x79\x06\x33\x4f" - "\xcf\x33\x70\xba\xf1\xdd\xbf\xbd\xb2\x1b\x4f\xe3\xba\x5d\xf3\x16" - "\xce\x41\x9e\x4e\x2d\xa4\xfb\x41\xc8\x66\xbf\x03\x3a\x19\x80\xfb" - "\xcb\x61\x3a\xbe\xeb\x84\x7c\x9d\x0d\xd7\x65\x73\x1c\xbe\x3f\x79" - "\x13\xf7\x0c\xc1\xec\x52\x29\x77\xcf\xf3\x93\x72\xf7\xec\x73\x3d" - "\x73\x77\xc8\xde\x9e\xb9\x7b\xce\xa8\x7e\xee\x76\x37\x77\x0b\xb1" - "\x9e\xb3\xdc\x1d\x12\xdd\xcf\xdd\x7d\xcd\xdd\x21\x91\x22\xee\x5e" - "\x28\xe5\xee\x79\xd3\xba\x73\xf7\x3c\xf3\xfa\x9f\xb2\xd9\x65\x66" - "\xee\x9e\x1d\x27\xe5\xee\xc7\xf6\xd9\xc7\xdd\xf3\xf6\x5e\x59\xee" - "\x9e\x57\x2e\xe5\xee\xc7\x78\x9e\x9c\xfd\xb4\xe3\xdc\xfd\xd8\x2b" - "\x3d\x73\xf7\x63\x1b\xa5\xdc\xfd\xd8\x7c\xca\xd1\x8f\x15\x51\xee" - "\x7e\x2c\x8c\xa6\xcf\x5e\x24\x4e\x37\x73\x37\x4d\xef\xce\xdd\x8f" - "\x95\xf5\xc2\xdd\x6a\xa3\x49\xe0\xee\x5a\xe0\xee\x5a\xc6\xf4\x82" - "\x2d\xee\x0e\xf5\xaf\x44\xee\x8e\x42\xee\x0e\xf5\xef\x99\xbb\x43" - "\x87\x23\x47\x03\x8e\x49\xd6\x36\xb6\x11\xd7\xa1\xd4\x3c\xff\x35" - "\x8e\x5f\x37\x20\x6e\xcf\xc8\x9e\x58\x31\x27\x4e\xcc\xed\x8f\xbf" - "\xdc\xc5\xed\x90\x6e\x1a\x25\xe5\x76\xe4\x75\xe4\xf7\xec\x6d\xac" - "\x2e\x67\x1b\x5b\xd7\xb6\xf9\xf1\x2c\x81\xe3\xd3\x20\x0d\xf7\x16" - "\xc1\x35\x93\xb2\x2f\x71\x87\x1c\x74\xd0\xf0\x2a\xdc\x17\xaf\x01" - "\xd9\x72\xa9\x3f\x78\x62\x82\x61\xb3\xd8\x1f\x3c\x6e\x44\x7f\x90" - "\x4a\xdf\xfb\xe7\xfc\x80\x21\x3b\xa2\x11\x7d\x03\x3d\xbf\xe0\x50" - "\xcf\xfe\x60\xfe\xf8\xab\xe5\x0f\x90\x6b\x86\x89\xfa\x90\xb6\xfc" - "\x01\x8e\xa9\x56\x2e\xeb\x1b\x7f\x80\x3c\x83\xfc\x82\x5c\x83\xbc" - "\x83\x3c\x83\x9c\x63\xe0\xdf\xf5\xcb\x4a\xb2\xc3\x1f\x00\xaf\xb0" - "\x83\xfe\x58\xc7\xf9\x03\x99\x33\xfe\x60\xc1\xa6\xeb\xca\x1f\xa0" - "\x7d\xe2\xae\xac\x3f\x10\xfa\xf9\x68\x1f\xb4\x95\x60\x23\xa1\xaf" - "\x8f\xf6\x41\x3b\xa1\x7d\x30\x36\x12\xfc\xc1\xc4\x58\xea\x0f\xb2" - "\x7b\xf5\x07\x0b\x12\xbb\xfc\x01\x43\xfd\x01\x37\x26\x3e\x02\xfd" - "\xc1\x13\xb3\xba\xfb\x83\x27\x96\x98\xfd\xc1\xe3\x35\x3c\x3f\x36" - "\xe0\x7a\x16\xc0\x07\xa1\x52\x9f\x10\xfa\xa5\x7d\x3e\xe1\x89\x23" - "\xdd\x7c\x02\xe8\x36\x95\xce\x9b\xa1\x3f\xa8\x46\x7f\x60\x40\xbf" - "\xe0\x94\x4f\x78\xa2\xce\xec\xb7\x1e\xa7\x7b\xe0\xc9\x9e\x88\x95" - "\xfa\x89\x50\x0d\xcf\x69\xa3\xc4\x7e\xc2\x34\xc0\x1e\x3f\x11\xfa" - "\xae\xe0\x27\x90\x87\xf7\xe1\x9c\x45\x97\x9f\xe0\x78\x75\xaf\x26" - "\xa6\x5e\xe4\x27\x42\xe3\x68\x19\x42\x6b\x8c\x9c\x9f\x08\xcd\xa4" - "\xe9\x8f\xfb\x8a\xd3\xcd\x7e\x82\xa6\x1b\xc5\x7e\xa2\x11\xfd\x44" - "\x68\x53\x2f\x7e\x22\xd0\x7e\x3f\xf1\x4c\x99\xd9\x4f\x3c\x53\xd6" - "\xb3\x9f\x78\xe6\x00\xfa\x09\x6e\x9d\x5d\xb0\x3d\xe0\x5c\x9e\x3e" - "\x92\xfa\x08\x1c\xa3\x01\xdf\xa1\xc3\x75\x54\x40\x2e\x3b\x17\xfd" - "\x08\x1c\x70\xbe\x31\x15\xbf\x9b\xb8\x6b\xea\xbc\xf5\xc4\x03\x7d" - "\x46\xea\x19\x22\xc7\x3d\x9d\xa8\x9e\x9e\xbe\x0c\xd7\xd6\x9a\xfd" - "\xcb\xc2\xcf\xed\xf4\x2f\xb8\x07\x7d\x75\xdb\xe6\x85\x06\x91\x7f" - "\xc1\x7d\xb1\xaa\x2d\xfc\x8b\x0e\xfc\x4b\x83\x70\x4d\xdb\xe6\x27" - "\x27\x88\xe5\xb1\x7c\x9c\xfc\x19\xee\x40\xf9\xda\x57\x71\xaf\x37" - "\xce\x1f\x3d\x19\x2a\xf5\x47\x4f\x1f\x36\x49\xfa\x27\x4f\xa6\x09" - "\xfe\x08\xfd\xb9\xa9\x9b\x3f\x5a\xf4\x70\x97\x3f\x1a\x29\xf2\x47" - "\xb1\x82\x3f\x7a\xf2\xd0\x35\xdf\x3f\x71\x81\xef\xae\xb4\x3f\x32" - "\x81\xdf\xb1\xf4\x47\xe8\xa3\x84\xfe\x89\xc9\x29\x7f\xb4\xc8\xe7" - "\xba\xf2\x47\x7d\xd0\x3f\xb1\xb4\x8d\x60\x33\xb4\x0f\xda\x06\xed" - "\x82\x6b\x7d\xa3\xcd\xd0\x5e\x68\xab\x89\x91\x52\x5f\xc4\xd9\x0b" - "\xfc\x51\xb7\xb9\x03\xb0\x15\xe8\x5c\x89\xf6\x12\xfb\xa3\x9c\x11" - "\x82\x3f\x7a\xba\xae\xbb\x3f\x7a\x5a\x6f\xf6\x47\x4f\x2e\xe3\x78" - "\x9e\x5b\x8b\x71\x61\xa9\xd4\x17\x2d\x5e\x63\x9f\x2f\x7a\xe6\x61" - "\x2b\xbe\x88\x5b\x47\x33\x75\x9b\xa4\x6f\x52\x0d\xfe\xc8\x09\x5f" - "\xf4\x4c\x18\x2d\x23\x3e\x57\xbe\x30\x99\xf2\xfd\x33\x72\xb3\x7f" - "\x5a\xb8\x44\x9c\x66\xf6\x4f\x8b\x97\xf0\x9c\xf8\x80\xe3\xfe\x69" - "\x31\x77\x0d\x3e\x73\xbe\xaf\x99\xfa\x00\xa9\x7f\x5a\xfc\xb0\xd4" - "\x3f\x2d\xf6\xa3\x65\x58\x1c\x4d\xfd\xd3\xe2\x00\x9a\xbe\x30\x48" - "\x9c\x6e\xf6\x4f\x34\xbd\xbb\x7f\x5a\x9c\xda\x8b\x7f\xf2\xec\xcc" - "\x8a\x68\xec\x48\x2d\xae\x36\xec\x4e\x4c\x9c\xb0\xe8\x26\xa3\x65" - "\x7b\xa2\xed\xc8\x48\xf7\x13\x12\xe6\xdb\xfe\x44\x48\xa7\xe7\x6e" - "\xbd\x89\x7f\x37\xbb\xc3\x2f\xa2\xf6\x4c\x38\xb4\xa9\x26\xdb\x6d" - "\x0a\xda\x93\x87\xd0\x9e\x2a\xc3\xbe\x27\xd0\xc6\x18\x9c\x6f\xdb" - "\x09\x6d\x49\xdb\x5a\xcb\xb5\x2d\xcf\x06\x15\xc1\x75\x36\x15\x4d" - "\x44\xa9\x90\xc9\x06\x3d\xba\x10\xda\x2c\xb4\xab\x99\xe3\x59\xd3" - "\xed\x75\x2a\xa2\x08\x23\x5e\xd8\xb6\x8a\xf9\xf9\x1c\x5c\x57\x03" - "\xe7\x71\x00\xd7\x01\x8b\x3f\xa7\x6d\x6a\x27\x1c\x1d\xb4\x4d\x8d" - "\xed\x68\x53\xdf\x62\x6b\x1e\x47\x1b\xab\xe3\xe6\x71\xf0\xbd\x27" - "\x7c\xdf\xcc\x84\x6d\x08\xe7\x71\xda\x69\x6c\x07\xe5\x55\xe6\x72" - "\xf3\x38\xf5\x92\x79\x9c\xdf\xd6\x11\x06\xd7\xdc\xd8\x25\x9e\xc7" - "\x51\x57\x76\x8b\xeb\xb0\x7d\x61\x7b\x72\x9c\xf3\x96\x7a\xf4\xf4" - "\x1c\x95\x01\x74\x6d\xf4\x2c\xae\x66\x77\xee\xd7\xfc\xb5\xbe\x5d" - "\x86\xeb\x9b\x1a\xc1\x76\x26\xe0\x36\xd6\xd3\x82\xdb\x3a\x79\x3b" - "\x74\x52\x3b\x80\x0d\x3d\x9e\x69\x25\xec\x62\x03\xb4\x9f\x4e\x7e" - "\x8d\xd3\x76\x1d\xe0\x50\x3d\x22\x7b\x1d\xea\xdd\x97\x64\xf3\xeb" - "\x9c\x9a\xd6\x87\x0d\x31\x81\xae\xd9\x24\x86\xec\xbb\xd4\xce\xcd" - "\x7b\xa6\x76\x90\x09\xc0\x65\xb8\x76\x93\x17\x60\x77\x68\x6e\x07" - "\xe8\xfd\x5b\xaa\x77\x5c\x43\x0f\x3f\x0d\xeb\xd5\x2a\xc8\xfb\x96" - "\xce\x4e\xe0\xb2\x76\xaa\xfb\x67\x5e\x56\x12\x6e\x6d\x54\x9c\xfb" - "\x84\xb8\xa1\x0a\xec\xcd\x71\x59\xab\x37\x8b\xfb\x80\x98\x7e\x50" - "\xe3\x7a\x62\x7e\x93\x5a\x71\xcf\x17\x35\x62\x43\x99\x73\x06\xe7" - "\x3e\xbf\x96\xcc\x7d\xea\xd7\x9b\xe7\x3e\xab\x0a\xbf\xa4\xcf\xaa" - "\x48\xc6\xc3\x16\xe7\x75\x66\x53\x9f\xc3\x8d\x87\x45\x3b\xaa\xfb" - "\x67\x6d\xae\x7f\x72\xe5\x75\xaf\xbc\xce\x75\xbf\x74\xae\x6b\xba" - "\x47\xd7\x71\xb5\x74\xef\x71\x9d\xeb\xfe\xd9\x0a\xd7\x74\xbf\x3c" - "\xae\x27\xdd\x63\x1f\x46\xe8\xbf\x08\x7d\x17\xf4\x61\xd4\x5f\x87" - "\x29\xcd\xfd\x96\x30\xa5\x30\x87\x0c\x3a\x93\xa7\xe1\xfa\xdf\xa0" - "\x8b\xc8\xe7\x71\x5f\x8d\x17\x5e\x13\xe6\x8f\x33\x71\xef\x18\xb4" - "\xe3\x4e\xb0\xe3\x2a\x7c\x6f\x89\xb7\x21\xf8\x9c\xc5\xad\xe0\x17" - "\xc6\x44\x34\x1a\xd3\xc0\x27\xed\x49\x4c\xb4\x61\x4f\x06\xfd\x89" - "\x22\x9a\x28\x9f\x89\x34\xdb\xd5\xb4\x1e\xec\xd9\x01\xb1\x59\x7b" - "\x23\xc1\x77\x91\xbd\x1b\x21\x6e\xed\x0c\x1b\xb2\x08\xfa\x00\x82" - "\x4d\x8b\x63\xda\xb9\xb8\xcc\xaa\x4d\x77\x48\x6d\xda\x62\xc5\xa6" - "\x4f\xaf\x80\x76\xca\xf0\xb1\x33\x67\x53\x5d\x97\x4d\x39\x3f\xb2" - "\x5e\xed\x87\x76\x15\x6c\x8a\x7e\x84\xb3\x69\x13\xf5\x23\x5d\xeb" - "\x36\xad\x37\xc7\xce\x15\x4b\x4e\x5b\xb1\xe9\xb2\x60\x89\x4d\x97" - "\x38\x6a\xd3\x17\xe6\x4a\xe3\xaf\xb0\x23\xf6\xc5\x5f\x2f\x54\x62" - "\x7c\x25\x8e\xbf\xf0\x77\x0b\xc4\x5b\x46\xc5\xbe\x9a\x56\xa7\xfa" - "\xff\x2f\xd4\x49\x63\xa9\xb0\x42\x5a\xa6\xe5\x97\x1d\x8f\xa5\xc2" - "\xb8\x75\xeb\xf7\xed\xb4\x16\x47\x85\xbd\x29\x8d\xa3\xc2\x96\xd1" - "\x78\x29\xec\x70\x4b\x12\xc6\x51\x61\xb1\x34\x7d\x79\xbb\x38\xdd" - "\x1c\x47\xd1\x74\x6e\xcf\xfa\xcd\x61\xe5\x8e\xc5\x4e\x37\x5e\xe5" - "\xd8\xc9\xb7\x87\xd8\xc9\xf7\x17\x12\x3b\xbd\x38\xa3\xdf\x7f\x3b" - "\xeb\x43\xc2\xea\x5c\xf3\x21\x2f\xf5\xf8\xfc\x7f\xbf\xff\xee\x49" - "\xf7\x2f\xa6\xba\xa6\xfb\x95\x36\xf7\x0a\xea\xdd\x7f\x47\x54\x9b" - "\xfd\x77\x44\xb5\x6d\xff\x1d\x31\xb3\xdf\x7f\x3b\xe2\xbf\xc3\x3d" - "\x5c\xf3\xdf\x11\x4a\xa9\xff\x8e\xdc\x60\x9f\xff\x8e\x48\x73\xbf" - "\xff\x8e\xc8\x92\xfa\xef\x48\xbe\x4c\x2b\x0f\x39\xee\xbf\x23\x1f" - "\xb6\xed\xbf\x23\xe7\x49\xfd\x77\xa4\x3f\xf5\xd3\x91\x71\xd4\x7f" - "\x47\x4e\xa1\xe9\x2b\x4b\xc5\xe9\x66\xff\x4d\xd3\xa9\xff\x8e\x4c" - "\x76\xcc\x7f\x7b\x5f\x65\xff\xad\xec\xc1\x7f\x2b\x7f\x21\xfe\x3b" - "\x4a\xde\xef\x43\x9c\xf5\x21\x91\x59\xae\xf9\x90\xd5\x89\xce\xfb" - "\x90\x18\x1f\xb3\x0f\x89\xf1\xb1\xed\x43\xd6\x6c\xe9\xf7\x21\x8e" - "\xf8\x90\xa8\x59\xae\xf9\x90\x35\xf3\xa5\x3e\x24\xe6\x98\x7d\x3e" - "\x64\xcd\xe7\xee\xf7\x21\x6b\x74\x52\x1f\x12\x53\x44\xcb\xb4\xda" - "\xe8\xb8\x0f\x89\x49\xb3\xed\x43\x62\xde\x91\xfa\x90\x98\x30\xea" - "\x2b\x62\x34\xd4\x87\xc4\xc4\xd1\xf4\xd5\x06\x71\xba\xd9\x87\xd0" - "\x74\xea\x43\x62\x2a\x1c\xf3\x21\x83\xaf\xb2\x0f\xf1\xe8\xc1\x87" - "\x78\xfc\x42\x7c\x48\x6c\xb0\xf3\x3c\xb6\xae\xce\xcc\x63\xeb\xea" - "\x6c\xf3\xd8\xba\x79\xfd\x3c\xe6\x08\x8f\xc5\xe8\x5c\xe3\xb1\x75" - "\x7e\x52\x1e\x5b\xbf\xc5\x3e\x1e\x5b\xb7\xc3\xfd\x3c\xb6\xae\x50" - "\xca\x63\xeb\xa3\x69\x99\x62\x4f\x38\xce\x63\xeb\x17\xd8\xe6\xb1" - "\xf5\x4f\x4b\x79\x6c\x7d\x00\xe5\xab\xf5\xc9\x94\xc7\xd6\xcf\xa0" - "\xe9\xb1\x65\xe2\x74\x33\x8f\xd1\x74\xca\x63\xeb\xb7\xf6\xc6\x63" - "\xd8\x2e\x2a\x7d\x2d\xda\xc5\x4b\x42\xbb\x88\x97\x9f\xca\x12\xda" - "\x45\x3c\x17\xa3\x99\xb2\x22\xc3\xde\x88\x21\xf2\x54\xdc\x8f\x07" - "\x38\x22\xf2\x49\x6c\x17\x1b\x5e\xc1\xe7\x44\x3c\xeb\x80\xf7\x1a" - "\x78\x1e\x8c\x05\x1e\x6c\x80\xdf\xb8\x46\xdb\x98\xc8\x30\xe4\x2f" - "\xdc\xbf\x03\x7f\x53\x3e\xd4\x0f\xc4\xfd\x80\xb8\xb9\x79\x51\xbb" - "\xe1\xda\x4a\x0b\xdf\x56\x5a\x68\x5b\x11\xde\xdd\x8b\x6b\x60\x4d" - "\xc6\xd5\xea\x11\x21\xcb\x06\xb0\xd8\x7e\xb8\x77\xc2\xa0\xfd\xb0" - "\xab\xd5\x5e\x59\x51\xd0\x66\xf4\x8d\x04\xd7\xe1\xc7\x36\xa3\xd8" - "\x28\xf3\x62\x5b\xc2\x86\x00\x27\x52\xee\x33\x95\x0f\x34\xe0\x9a" - "\x5a\xab\x81\xfb\x9a\x81\xfb\x9a\xcd\x6d\x05\xe7\xdb\x5b\x56\xab" - "\x55\xad\xab\xd5\x63\x3b\x5b\x80\xfb\xf4\x96\xed\xe4\xce\x69\xb9" - "\xcd\xc8\x7d\x8d\x5c\x3b\xe1\xb8\x0f\xda\x86\xa9\x05\xb8\xef\x05" - "\x9e\xfb\x5a\xd4\xc8\xf5\xca\xdc\xe7\x81\xfb\x96\x9c\xa5\xdc\xc7" - "\xc7\x70\xb7\x22\xf7\xad\x56\x33\x6f\x37\xf3\xdc\xb7\x14\xb9\xef" - "\x04\xb4\x91\x8f\xa4\xdc\xa7\x70\x96\xfb\x36\xcc\x90\xb6\x93\xf8" - "\x03\xf6\xb5\x93\x0d\xc7\x6c\xb5\x93\xce\x34\x67\xdb\xc9\x86\x6a" - "\x69\x3b\x89\xcf\xe2\xdb\xee\x69\xc7\xdb\x49\xfc\x86\xae\x76\xf2" - "\x92\x65\x3b\x89\x7f\x4d\xda\x4e\xe2\x43\x69\x7b\x88\x2f\xa1\xed" - "\x24\x3e\x9c\x6f\x3f\x75\xe2\x74\x73\x3b\xa1\xe9\xb4\x9d\xc4\x1f" - "\xee\x9f\x2f\xbf\xde\xfc\x7d\xe2\x94\xfe\xf9\x72\x67\xfb\x8c\xf1" - "\xd5\xae\xf5\x19\x37\x1e\xec\x1f\x6f\x77\x56\xf7\x89\x89\xae\xe9" - "\xfe\x55\x9b\xfb\xdf\xf4\x8f\x95\xf4\xa6\xfb\x8d\x06\xd7\x74\xbf" - "\xa9\xa8\xb7\x3e\x86\xed\x58\xea\xf5\xd0\x8a\xae\x3e\xc6\xeb\xa1" - "\xc2\x73\xbe\xdd\xfb\x18\x9b\x2b\xa5\xef\xf1\xbd\xf6\xb4\xe5\x7b" - "\x7c\xbd\xf5\x3d\x0c\xfd\x7d\x0f\xb0\xf5\xab\xb1\xae\xf5\x3d\x36" - "\x6f\x97\xc6\x54\xc9\x03\xed\x8b\xa9\x5e\xbf\xc1\x56\x4c\x65\x70" - "\xba\xef\xf1\xba\xbf\x34\xa6\x7a\x5d\xcf\x63\x63\xbc\xe3\x31\xd5" - "\xeb\x9f\xdb\x8e\xa9\x5e\xff\x4a\x1a\x53\xbd\x5e\x44\x63\xa7\x64" - "\x39\x8d\xa9\x5e\xd7\xd0\xf4\xd7\xd4\xe2\x74\x73\x4c\x45\xd3\x69" - "\x4c\x95\xac\xec\x9f\x47\xbf\xde\x62\xaa\x2d\xa9\xfd\x7e\xdd\x59" - "\xdf\x92\xec\xef\x9a\x6f\x79\xe3\x2a\x3e\xff\x79\xbd\xfb\xf5\x2d" - "\x35\xae\xe9\x3e\xb5\xc7\xe7\x3f\x7b\xf6\xeb\x19\x01\x66\xbf\x9e" - "\x11\x60\xdb\xaf\xa7\xef\x91\xfa\xf5\xb4\x7b\xfa\xfd\xba\x33\x7e" - "\xfd\x8d\xb9\xae\xf9\xf5\xf4\x48\xa9\x5f\xcf\x38\x6d\x9f\x5f\x4f" - "\x3f\xe7\x7e\xbf\x9e\x6e\x90\xfa\xf5\x8c\x72\x1e\x1b\x32\xc7\xfd" - "\x7a\xc6\x5e\xdb\x7e\x3d\xe3\x80\xd4\xaf\x67\x6c\xa2\xfe\x3b\xa3" - "\x8e\xfa\xf5\x8c\xed\x34\x3d\x8d\x88\xd3\xcd\x7e\x9d\xa6\x53\xbf" - "\x9e\xd1\xd8\x3f\xbf\x7e\xbd\xf9\xf5\x37\x97\xf5\xfb\x16\x67\x7d" - "\x4b\x86\x8b\x7d\xc6\xb7\x74\xce\xfb\x96\x77\x52\xcd\xbe\xe5\x9d" - "\x54\xdb\xbe\xe5\x1d\x99\xd4\xb7\xbc\xfd\x66\xbf\x6f\x71\xc6\xb7" - "\xbc\x59\xe4\x9a\x6f\xd9\x5a\x21\xf5\x2d\xdb\xa6\xda\xe7\x5b\xde" - "\x79\xd8\xfd\xbe\xe5\x9d\x50\xa9\x6f\xd9\xe6\xcf\x63\xe3\x69\xc7" - "\x7d\xcb\xb6\x81\xb6\x7d\xcb\x36\x85\xd4\xb7\xbc\xa3\xa3\x3e\x64" - "\xdb\x14\xea\x5b\xde\x69\xa5\xe9\x6f\x2f\x12\xa7\x9b\x7d\x0b\x4d" - "\xa7\xbe\x65\xdb\x8c\xfe\x79\xf7\xeb\xcd\xb7\xfc\x4f\x8f\xcf\xff" - "\xf6\xcc\x6f\x3b\xc3\xcd\xfc\xb6\x33\xdc\x36\xbf\xed\xf8\x56\xca" - "\x6f\xdb\x5f\xee\xe7\x37\x67\xf8\x6d\x5b\xa8\x6b\xfc\xb6\xa3\x48" - "\xca\x6f\xbb\x46\xd9\xc7\x6f\x3b\xc7\xbb\x9f\xdf\x76\x4e\x91\xf2" - "\xdb\x2e\x39\x8f\x8d\xfb\x1c\xe7\xb7\x9d\xdf\xdb\xe6\xb7\x9d\xe7" - "\xa4\xfc\xb6\x53\x43\x79\x6c\x97\x2f\xe5\xb7\x9d\x35\x34\x7d\xfb" - "\x34\x71\xba\x99\xdf\x68\x3a\xe5\xb7\x5d\xfe\xae\xcd\xc7\x67\x17" - "\x99\xe7\xe3\xb3\x39\x5b\x98\xb6\xef\xdf\xde\x7d\x3e\x3e\xfb\x66" - "\xe9\x7a\x41\xbb\xf6\x70\x73\xf3\xd8\x66\x5a\xe9\x9a\x0e\x56\xe7" - "\xe9\x47\xed\xdf\xde\x3f\x4f\x7f\x25\xe7\xe9\xb3\x9a\xa4\xed\x27" - "\x67\xa1\x7d\xed\x27\x7b\x85\xfb\xe7\xe9\xb3\x2d\xd6\x61\xc9\x99" - "\xc1\x63\x65\xa5\xe3\xed\x27\x67\x9c\xed\xf6\x93\x33\x51\xda\x7e" - "\x72\xf8\x3e\x66\x4e\x28\x6d\x3f\x39\x3e\x34\x7d\x57\xb8\x38\xdd" - "\xdc\x7e\x68\x3a\x6d\x3f\x39\xcb\xec\x89\x0f\x0c\x9e\xc5\x35\xe8" - "\xef\x27\xd4\xdd\x64\xec\xc2\x79\x34\x8f\x73\x6b\xf1\xc1\xb3\xd4" - "\x5f\x70\xb1\xc1\xee\xc4\x4d\xbd\xc6\x07\x0d\x7c\x7c\xb0\xac\x7b" - "\x7c\x20\xc4\x06\x59\x80\xef\x9d\x76\xcd\xd1\xf3\x78\xc7\xd8\xe0" - "\x92\xa3\xb1\x41\xa0\x39\x36\x48\xb3\x88\x0d\x5e\xb0\x88\x0d\x38" - "\xbc\xd7\x4b\xf0\xde\x2d\x36\xe8\xc2\xbb\xbb\x62\x83\xdc\xba\xfe" - "\x39\x7a\x67\xfb\x9d\x39\xb1\xae\xf5\x3b\xdf\x0d\xed\x1f\xcb\x77" - "\x56\xf7\x79\x2e\x8e\xe5\xff\xb9\xa6\x7f\xbc\xc5\x59\xdd\xbf\xeb" - "\xe2\x5a\x0e\xbb\xe7\x3a\xdf\x1f\x29\xf0\x33\xf7\x47\x0a\xfc\x84" - "\xf8\x0a\x79\x97\x5b\x33\x0b\xb8\x36\x2d\x0a\x8e\x4b\x84\xbc\x11" - "\xc5\xed\x79\xe0\xa1\x6d\xf8\x12\xf7\x7c\x83\x98\x2b\xff\xcd\x90" - "\x58\x71\xcc\xb5\xe7\x06\x21\xde\x0a\xc1\x58\x0c\x62\x2b\x8c\xab" - "\x84\x3e\x48\x66\x73\x2f\xcf\x0f\x8f\x4b\xdc\x84\x7d\x96\x4e\x45" - "\x71\xcd\x2f\xb7\xbf\xf2\xbf\x7e\xae\xf5\x57\xf2\x17\x49\xe3\xad" - "\x82\xcf\xec\x8b\xb7\xf2\xbf\x72\x7f\x7f\x25\xbf\x51\x1a\x6f\x15" - "\x1c\xa4\x65\xda\x5d\xe9\x78\xbc\x55\xf0\x8e\xed\x78\xab\x20\x5b" - "\x1a\x6f\x15\x44\xd2\xb8\xaa\xa0\x9c\xc6\x5b\x05\x9b\x68\xfa\xee" - "\x0a\x71\xba\x39\xde\xa2\xe9\x34\xde\x2a\xa8\xb1\x33\xde\xaa\x75" - "\x21\xde\x4a\xbe\x7e\xe2\xad\x7b\xae\xf1\x78\x6b\xef\x2c\x3b\xfc" - "\x4e\x8d\x85\xdf\xd9\xd4\xef\x77\x90\x6b\x0a\x1a\x5d\xf3\x3b\x7f" - "\xb1\xb9\xff\x61\x97\xee\x53\x45\xba\x47\xce\xe7\xf5\x6e\xf4\x4f" - "\xdc\xe4\xb4\xee\x81\xeb\xb3\xe3\xaf\x67\xbd\xef\xdd\xea\x9a\xde" - "\x8b\x82\xfa\x63\x2d\x67\x75\xff\x57\xa5\x6b\xba\xdf\x77\xd8\xf9" - "\x58\xab\xa4\xf0\x54\x57\xac\x55\x52\x68\x19\x6b\x61\x6c\x35\xbb" - "\x9d\xc6\x5c\x6f\x40\xac\x94\xb2\x0a\xe2\xae\x18\x42\xb4\x0d\x47" - "\x48\x2a\xc4\x5e\x29\xe7\x21\xfe\x0a\x87\xf8\xcb\xb0\x87\x8f\xbf" - "\x4a\xc6\x48\xe3\xaf\xe2\x77\xac\xc6\x5f\x0a\x73\xfc\x65\x80\xd8" - "\xaa\x73\x4f\xe2\xa6\xcc\xf3\xa2\x58\xec\xc5\xee\xb1\x58\x47\x5a" - "\x71\x6d\xc7\xb8\xc4\xe4\x4e\x88\xc7\x7a\x8a\xc5\x38\x4c\x58\x89" - "\xc7\xfe\x3b\x62\xb1\xa2\x64\xd7\x62\xb1\xfd\x8d\xd2\x58\xec\xc0" - "\x02\xfb\x62\xb1\x92\xe5\x36\xc7\xbe\x9c\x8e\xc5\x4a\xa2\xa5\xb1" - "\xd8\x81\x20\x1e\x33\x53\x1d\x8f\xc5\x0e\xdc\x6c\x3b\x16\x3b\x30" - "\x5e\x1a\x8b\x95\xf0\xef\x9e\x1e\x98\x4f\x63\xb1\x03\x4a\x9a\x5e" - "\x3c\x45\x9c\x6e\x8e\xc5\x68\x3a\x8d\xc5\x0e\x2c\xb1\x73\x6e\xac" - "\xc6\x00\x3e\xfd\xea\x3f\x4f\xd9\xd3\xdc\x98\xbb\x9e\xa7\x0c\xbc" - "\xc6\xe7\xc6\xde\xeb\x7d\xfc\xab\x3f\x26\xb0\xc2\x35\x07\xa2\x5d" - "\xf3\x4b\x07\xe7\xf7\xc7\x04\xce\xea\xfe\x6f\x2e\x8e\x7d\xbd\x5f" - "\xed\x7c\x4c\x50\x9a\x65\x1e\x7f\x29\xcd\x72\x6c\xfc\xa5\x74\xb8" - "\xd4\xff\x7f\x60\xdd\xff\xf7\x8f\xbf\x38\xe0\xf3\x0f\x66\xb9\xe6" - "\xf3\x3f\xac\x93\xfa\xfc\x43\x0f\xdb\xe7\xf3\x4b\x17\xba\x7f\xfc" - "\xa5\x34\x4c\xea\xf3\x0f\x05\xf2\x38\x99\xed\xb8\xcf\x3f\x74\x83" - "\x6d\x9f\x7f\x68\x8c\xd4\xe7\x97\xea\xa9\x6f\x3f\x14\x4c\x7d\xfe" - "\x21\x39\x4d\xff\x60\x96\x38\xdd\xec\xf3\x69\x3a\xf5\xf9\x87\xe6" - "\x3b\x36\xdf\xe5\x7d\x8d\xce\x77\x29\x7f\x21\xf3\x5d\x1f\x55\xf4" - "\xfb\x1d\x67\xfd\xce\xa1\x30\xd7\xfc\xce\xe1\x5e\xd7\xff\xb0\xed" - "\x77\x8e\xfa\x98\xfd\xce\x51\x1f\xc7\xfc\xce\x27\x5b\xa4\x7e\xe7" - "\x88\xa2\xdf\xef\xb8\xea\x77\x3e\xf6\x71\xcd\xef\x7c\x62\xb1\xfe" - "\xd1\x51\x3b\xd7\x3f\xfa\xc4\xe6\xfa\x47\xce\xfb\x9d\x4f\x74\x52" - "\xbf\x73\x94\x5f\xff\xe8\xb0\x13\xeb\x86\x1c\x4d\xb3\xed\x77\x8e" - "\x5a\xac\x7f\x74\x94\x5f\xff\xe8\x28\xbf\xfe\xd1\x51\x7e\xfd\xa3" - "\xc3\x65\xe2\x74\xb3\xdf\x39\x2c\x5a\x37\xe4\x68\xff\xfa\x47\xd7" - "\xdd\x73\x98\xc7\x5c\xe0\xbf\xe3\xad\x66\xfe\x3b\xde\x6a\xfb\x39" - "\xcc\xe3\x2b\xa4\xcf\x61\x1e\xbb\xdc\xff\x1c\xa6\x33\xfc\x76\xd4" - "\xc5\x75\x91\x8e\x07\x4a\xf9\xad\xec\x5d\xfb\xf8\xed\xf8\x01\xf7" - "\xf3\xdb\x71\x8d\x94\xdf\xca\x52\x79\x6c\x38\xc1\x6f\x65\x2b\x6d" - "\xf3\x5b\xd9\x1a\x29\xbf\x95\x05\x53\x1e\x2b\xcb\xa3\xfc\x56\xb6" - "\x88\xa6\x1f\x2b\x13\xa7\x9b\xf9\xed\x98\x88\xdf\xca\x8a\x1c\x9b" - "\xd7\x74\x2a\xae\xee\x83\x79\x4d\x77\xc5\xd5\xd7\xfa\xbc\xe6\xdf" - "\xfd\xfb\xc7\xd1\x9c\x89\xa9\xcb\x34\xae\xc5\xd4\xff\xc8\x72\xde" - "\xa7\x9c\x4c\x34\xfb\x94\x93\x89\xb6\xe6\x77\x52\x00\x77\xa9\x10" - "\x13\x6f\x39\x4f\xe4\x6f\xe0\xfc\x4e\x4d\x25\x49\xc3\xf9\x9d\x55" - "\xc2\xfc\x4e\x36\x1f\x67\x7f\x76\x51\x1a\x67\x97\xaf\xb1\x16\x67" - "\x63\x7c\x6d\x84\xd8\xd9\x60\x39\xaf\xf3\xa4\x75\x5f\xd4\xa1\x28" - "\xae\xbd\xbc\x27\x31\xd9\x51\x5f\xb4\x6b\x1d\xf5\x45\x3b\xaf\x7b" - "\x5f\xf4\xf7\x70\xd7\x7c\xd1\x67\x1a\xa9\x2f\x3a\x35\xd1\x3e\x5f" - "\x74\xf2\x3e\xf7\xfb\xa2\x93\xb3\xa4\xbe\xe8\x94\x2f\x8f\x15\x27" - "\xf6\x96\x3c\x79\xd9\xb6\x2f\x3a\x25\x93\xfa\xa2\x93\x35\xd4\xe7" - "\x9c\x9a\x40\x7d\xd1\xc9\x46\x9a\x5e\xee\x2b\x4e\x37\xfb\x22\x9a" - "\x4e\x7d\xd1\xa9\x29\x8e\x8d\xf1\x0c\xbe\x46\xc7\x78\x3c\x7e\x21" - "\x63\x3c\x15\x25\xce\x73\xa2\x36\xba\xa2\xeb\xfd\x0d\x6d\x74\xb7" - "\x71\x86\x18\x88\xb7\x9b\xe9\x3c\x77\xd7\x38\x83\xee\x34\xcf\x7f" - "\x55\x3f\x4a\xf9\xaf\xd2\x26\xff\xf5\x34\x97\x8d\xe3\x0a\x46\xe0" - "\x46\xdc\x23\xd3\xe9\xb9\xec\x98\xeb\x9d\xf3\x4e\xb9\xb8\xbe\x72" - "\xd5\x41\x29\xe7\x55\xdf\x6c\x1f\xe7\x69\xef\xb4\xc9\x79\x4e\xbf" - "\xc7\xa1\x0d\x92\x72\x5e\xb5\x27\x8f\x8f\x89\x8e\x73\x9e\xf6\x9c" - "\x6d\xce\xd3\x5e\x94\x72\x9e\xb6\x9c\x72\x5b\xb5\x8a\x72\x9e\xb6" - "\x8e\xa6\x57\x4e\x10\xa7\x9b\x39\x8f\xa6\x53\xce\xab\x9e\xd0\x13" - "\xe7\xb1\xa9\xd1\xb5\x99\x8c\xa9\x04\x8e\x52\x28\xe3\x28\xc0\x86" - "\x06\xbe\x97\x83\x8d\x47\xc0\x77\x9b\xf3\x4b\x7a\x45\x74\xad\x29" - "\x09\xca\xcc\x10\x99\x56\x7f\x41\xa3\x19\x6d\x40\xdb\xf0\xef\xac" - "\x45\xd7\x7a\x1b\x06\x07\x9b\xd8\x30\x02\x76\xa9\xe5\xf6\xcf\x04" - "\x79\x7c\x3f\x48\x15\x43\xbc\xce\xcb\xaa\x2b\x04\x39\x28\xaf\x57" - "\xbd\xac\x7a\x0b\xe6\x01\x65\xad\x85\xba\x4c\xb1\x59\x56\xc8\x2b" - "\x64\xef\x58\xb2\xc1\xc0\xfe\xa0\x59\xd5\x4c\x1a\x64\x9f\xdf\xec" - "\xdd\x34\x38\x98\x4d\x08\x25\x18\xcb\x95\x8c\xd6\xcb\x31\x4f\xcd" - "\xaa\x0e\x3c\x27\xc7\x73\x46\x28\x63\xfc\x4a\xc2\xa4\x37\x0f\xf6" - "\x00\x9e\x18\x98\xd0\xca\x36\x46\x18\xa0\xcc\x80\xcd\xa3\x63\x6b" - "\xe5\xfb\x77\x42\x9a\x91\xf8\xe2\x7e\xa6\x98\x07\xc4\xb3\x50\x9e" - "\xcf\xc7\xe5\x80\xbc\xb5\x32\xbc\x56\x4c\x26\x0c\x1c\xcf\xea\x1c" - "\xc3\xcd\xe7\xb1\xb6\xf4\xe8\xbd\x71\x2c\xd1\xdc\x0e\xba\x53\x11" - "\xc6\xda\x79\x07\xef\xa3\xeb\x81\x2f\x3d\x70\x8f\xe4\x84\x1d\x84" - "\xc9\x30\x0d\xf6\x38\x1e\xc7\xed\x51\xac\x6f\xdb\xfc\xc5\x2c\x9d" - "\x6c\x32\xb7\xe7\x2f\xee\x6b\x89\xfb\x6b\x03\x6e\x08\xa4\x2f\x3b" - "\x06\xa5\xb6\xb4\x45\xd4\xb2\x95\x4b\x55\xd1\x2b\x56\x2e\x8f\x58" - "\x13\xad\x1a\xb7\x6c\x28\x99\x1f\x11\xa1\x5a\xb9\x74\xd5\x2b\x2a" - "\xf1\x99\x7b\x55\xcb\x56\xac\x5e\xfa\x6c\xf8\xf2\x89\x2b\x9f\x8b" - "\x1c\x8a\x2f\x21\x89\xca\xe1\x83\x65\x31\x6d\xfe\x22\x32\xe7\x2d" - "\x42\xde\x1e\x41\xe4\x58\x2e\xb8\x5f\x8d\xb0\xef\x69\xfa\x36\xb6" - "\x95\x01\x99\x04\xe0\xc7\x8c\xf8\xc1\x20\xfb\xb9\x2e\x17\xca\x95" - "\x03\xe5\x86\x32\x42\x99\xff\x49\x84\x32\x0b\x98\x48\x40\x4c\xc4" - "\x37\x03\x06\xff\x79\xb3\x77\xfb\xe0\x87\x58\x36\x14\xeb\x87\xef" - "\x43\xcb\x20\xed\x65\xce\x97\xa5\x45\xd7\xc2\xb5\xd3\x04\x8c\xe1" - "\xb5\x6c\x7a\x74\x5e\x1b\xb6\x13\x36\xec\x7e\xda\xa6\x6a\x7c\x16" - "\xa8\x65\x84\xee\xbb\xfa\xcf\x30\xf3\xbe\xab\x35\xdc\x58\x35\x94" - "\xa3\x09\xd2\x13\x75\xb2\xc1\x99\x98\x8e\xfb\x05\xe3\xfe\xdd\x58" - "\x66\xa8\x17\xf8\x52\x56\xc3\x26\xf1\xd8\x4f\xfe\x87\x87\x29\xf9" - "\x87\x60\xad\xfc\x12\x09\x31\xb0\x9d\xec\x96\x7f\x78\x54\xb5\xb6" - "\x12\xef\x8d\x91\xcf\xb1\x83\xbe\xd8\xe8\x6d\x58\xb1\x3c\x77\x04" - "\xb4\xa1\x2d\x3f\x04\xb3\x5b\x74\xe5\x0b\xc6\x13\x25\xe4\x2d\xde" - "\xff\x55\xee\x98\xfd\xff\xc9\xd9\x1f\xed\x08\xe5\xe1\xed\x58\x33" - "\xe1\x58\x74\x77\x3b\x76\xe1\x6f\xaf\x89\x9c\x00\x2c\xb0\x9e\x7b" - "\x54\x21\x46\xaa\x47\x6c\xbb\x2d\x09\x61\x64\x12\xa7\xbb\x9a\x06" - "\x53\xfa\x1e\xe8\xe3\xed\x99\xc2\xa6\xee\xf1\x07\x9d\x95\xa6\xc7" - "\x10\xd5\x62\xa3\x92\xa4\x5d\x22\x01\xfa\xb4\x3d\x2a\x85\x2c\x51" - "\x06\xf1\x08\x03\xfe\x24\x00\x38\x23\x80\x6f\xef\xa5\xa8\xc7\x7f" - "\x34\x11\x32\x67\x35\x21\x3f\x4c\x23\x03\x72\xe0\x3a\xc7\xea\x53" - "\xc3\xf9\x7f\x76\x73\x4d\x58\x2e\x5c\x8b\xfb\xfa\x3a\x78\xbd\xde" - "\x66\xbb\x33\xd7\x3b\xcf\x7a\xbd\xbf\xac\x83\x7a\x27\x42\xbd\x4b" - "\xa1\xde\xbb\xad\xd4\x3b\x8f\xd6\x7b\x60\xb3\xfb\xeb\xfd\x25\x5d" - "\xff\x7a\xf3\x97\x4b\x9c\xab\xf7\x97\x8d\xbd\xd7\x3b\xdf\x86\xbd" - "\xff\xaf\xc6\x94\x9e\x0f\xf6\xce\x07\x7b\xe7\x5b\xb1\x77\x3e\x6f" - "\xef\x61\xf5\xee\xaf\xf7\xff\xe5\xd1\x7a\xff\x5f\xa8\x73\xf5\xfe" - "\x3f\x9b\xfc\x27\xaa\xb7\x0d\x7b\xff\xab\x02\xea\x0d\xf6\xce\x07" - "\x7b\xe7\x5b\xb1\x77\x3e\x6f\xef\xe1\x5f\xb8\xbf\xde\xff\xa2\xeb" - "\x1f\x6e\xfe\xd7\x5c\xe7\xea\xfd\xaf\xda\xde\xeb\x5d\x60\xc3\xde" - "\xb5\x65\xa6\xf4\x02\xb0\x77\x01\xd8\xbb\xc0\x8a\xbd\x0b\x78\x7b" - "\x4f\x4e\x71\x7f\xbd\x6b\x33\x69\xbd\x6b\x83\x9d\xab\x77\xad\xcd" - "\xf8\x44\x54\x6f\x1b\xf6\xfe\xea\x30\xd4\x1b\xec\x5d\x00\xf6\x2e" - "\xb0\x62\xef\x02\xde\xde\x4f\x4d\x77\x7f\xbd\xbf\x4a\xa6\xf5\xfe" - "\x2a\xc8\xb9\x7a\x7f\x65\xf3\xf9\x77\x11\xaf\xa9\x81\xbb\xba\xd9" - "\x5c\x1b\x3b\x85\xdc\x71\x09\xeb\xff\xef\x09\xac\x62\x8f\x7a\xd8" - "\xc6\x44\x99\xc1\x73\xcf\x84\x61\xd0\x97\xdb\x95\x64\x0a\xf3\xd6" - "\x91\x21\x50\xd7\x30\x36\x7d\xaf\x06\x3f\x4d\x90\x8f\x01\xb8\xdf" - "\xe8\xb9\xc7\xbf\x23\x35\xba\xf4\x8d\xe7\x89\x2a\x41\x4f\x94\x55" - "\xf1\x3a\x12\x1f\xc9\xea\xab\xc8\xb7\x44\xa1\x23\x0c\x8e\x97\x9d" - "\x6a\x2a\x25\xab\xa2\x58\x16\xf2\xbe\x01\xfb\x98\xe9\x67\x48\x00" - "\xc4\xc4\x89\x2c\xf8\x8f\x4c\x13\x51\x41\xfe\x01\xa8\x4b\xc8\xfb" - "\x53\xef\xf9\x44\xf6\xc9\xb3\xed\x04\xf5\x89\xba\x85\xfe\x68\x00" - "\xa7\xd7\x56\x42\x1e\x7d\x8a\xea\x75\xd7\xf3\x8e\xea\xf5\x6b\x3a" - "\xff\x97\xba\x27\x48\xab\xeb\x20\x10\x5b\x2a\xf1\x9d\x7b\x48\xcf" - "\xaa\x8a\x6c\x86\xbe\xc8\xd7\x41\x6c\xda\x9e\x00\x13\xf8\x2c\xc7" - "\xf2\xfd\xb7\xcd\xf5\xaf\x45\xfa\x2e\x04\x7d\x77\xc3\x9a\x59\xdf" - "\x75\x59\xa0\xef\x42\x5e\xdf\x45\xc3\xea\x06\x36\xdb\xd0\x77\x21" - "\xe8\xbb\x14\xf4\xbd\xdb\x7e\x7d\xd7\xbd\x66\xa1\xef\xc4\xbe\xd1" - "\x77\x1d\xbf\xff\xe9\x1e\x8d\x54\xdf\x75\x9e\x54\xdf\xff\x2e\x01" - "\x7d\x97\x80\xbe\xf3\x1c\xcc\xb7\xd0\x0e\x1e\x07\x7c\x77\xf7\x61" - "\x66\x7d\xff\xc7\x93\x55\xe4\xf3\xf8\xce\x07\x7c\x0f\xab\xb7\xae" - "\xef\x7c\xc0\x77\x3e\xe0\x3b\xdf\x01\x7c\x9f\xbe\x28\xd5\x77\x7e" - "\x1f\xe1\xfb\x34\x3f\xfe\x97\x6f\x81\xef\xd3\x71\x54\xdf\xa7\x55" - "\x6c\x5a\x3e\xe0\x3b\xdf\xc1\x7c\xff\xe3\x6b\x87\xbe\x01\xdf\xdd" - "\x7d\xa7\x59\xdf\xdf\xc4\x81\xbe\x79\x7c\xe7\x03\xbe\x87\x7f\x61" - "\x43\xdf\x80\xef\x7c\xc0\x77\xbe\x03\xf8\xfe\x66\xb9\x85\xbe\xfb" - "\x08\xdf\xdf\x04\xf0\xfa\xb6\xc0\xf7\x7f\x9a\xa8\xbe\xff\x93\x09" - "\xfa\x06\x7c\xe7\x3b\x88\xef\x6f\x92\xed\xf0\x5b\x80\xef\xee\x3e" - "\xdb\xac\x6f\x5d\x13\xab\x28\xe0\xf1\x5d\x00\xf8\x9e\x9c\x62\x5d" - "\xdf\x05\x80\xef\x02\xc0\x77\x81\x03\xf8\xd6\x7d\x29\xd5\x77\x41" - "\x1f\xe1\x5b\x47\xe3\xbf\xd4\x02\x0b\x7c\xeb\x16\x51\x7d\xeb\x08" - "\x9b\x56\x00\xf8\x2e\x70\x34\xdf\x76\x3b\xf4\x0d\xf8\xee\x1e\x2b" - "\x98\xf5\x5d\xbf\x08\xf4\xcd\xe3\xbb\x00\xf0\xfd\xd4\x74\x1b\xfa" - "\x06\x7c\x17\x00\xbe\x0b\x1c\xc0\x77\xfd\x4c\x0b\x7d\xf7\x11\xbe" - "\xeb\xf9\xfd\x2f\x0b\x2c\xf0\xfd\x6d\x05\xd5\xf7\xb7\x91\xa0\x6f" - "\xc0\x77\x81\x83\xf8\xae\x0f\x73\x26\x3e\x59\x9d\x4d\x3c\xa4\x3a" - "\xff\xae\xfa\xca\xc5\x28\xdf\x1d\xba\x3a\x31\xca\x77\x9b\xac\xc7" - "\x28\xdf\x05\x51\x9d\xd7\x37\x38\x17\xa3\x7c\x67\xf3\xfd\x87\x9e" - "\x62\x94\xee\x3a\xff\x7e\xc6\x95\x8b\x53\xbe\x9f\x78\x75\xe2\x94" - "\x86\x76\xeb\x71\x4a\xc3\x41\xaa\xf3\x86\x50\xe7\xe2\x94\xef\x6d" - "\xae\x7f\xd0\x53\x9c\xd2\x5d\xe7\x67\x4a\xaf\x5c\xac\x72\xe6\xdd" - "\xab\x13\xab\x9c\x09\xb7\x1e\xab\x9c\x51\x53\x9d\x7f\x5f\xe1\x5c" - "\xac\x72\xa6\xcc\x99\x58\xa5\xbb\xce\x1b\x27\x5c\xb9\x78\xa5\xf1" - "\x86\xab\x13\xaf\xfc\xa0\xb3\x1e\xaf\xfc\xc0\xf7\x7f\x7e\x08\x72" - "\x2e\x5e\x69\xb4\xa3\xff\xd3\x3d\x5e\xe9\xae\xf3\x1f\xf3\xae\x5c" - "\xcc\xf2\xe3\x96\xab\x13\xb3\xfc\x38\xdf\x7a\xcc\xf2\xa3\x92\xea" - "\xbc\xf1\xa0\x73\x31\xcb\x8f\x36\xf7\x3f\xe9\x29\x66\xe9\xae\xf3" - "\x9f\x7c\xae\x5c\xdc\x72\xd6\x78\x75\xe2\x96\xb3\xe5\xd6\xe3\x96" - "\xb3\x9b\xa8\xce\xcf\xaa\x9d\x8b\x5b\x7e\x52\x39\x13\xb7\xa0\xae" - "\x51\xe7\x18\xab\x50\x9d\x9f\x6b\x60\xbd\xf6\x90\x4e\x88\x47\x14" - "\xa0\x77\x45\x13\x61\xb2\x51\xe7\xb5\x54\xe7\x46\xaf\xbd\x1a\xd0" - "\x4f\x18\xea\x8c\xab\xc7\x4f\xbe\x5e\xc6\xd4\x3d\x13\x58\x86\x40" - "\x5d\x3c\x08\xd8\xec\x67\x43\x12\xf1\x52\xc5\x6f\x84\xef\xe7\xbe" - "\x44\x19\x55\xfc\xe6\xd3\x50\xc7\x01\x38\x47\x61\x48\x8b\x5e\x62" - "\x54\x14\xea\xe0\xdc\x9d\xec\x98\xc8\x25\x9d\x10\x4b\xb0\x2f\xf9" - "\xfa\x68\x9b\x4a\x88\xd6\x70\x92\x54\xd5\x7e\x44\x4c\x5e\x7b\x3f" - "\x9d\x64\x20\x6a\xf6\x27\xb5\x4f\x45\xb4\x8e\x18\x9f\xf3\xf5\xd4" - "\xc6\x96\x03\x2e\xde\x23\x21\x8d\xec\x25\xf6\x3b\xb5\x67\xa7\xa2" - "\x58\x65\x54\xec\xcd\x33\xa6\x15\x37\x1a\x14\xc5\xca\x7d\x31\x3a" - "\xc6\xb3\x9d\xa8\xc3\x1b\x58\x36\xfd\x59\x22\x4f\xaf\x27\x1e\x19" - "\xcf\x12\xcf\x8c\x7a\xa2\xac\x68\xa8\x25\x95\xa0\xf6\xca\xe6\xaf" - "\x48\xe5\x25\x38\x3a\xe0\x30\xc1\x91\xf8\x15\xa9\x68\x22\x64\xf6" - "\x39\x42\x12\x1a\x58\xfd\x6f\xeb\x88\x4f\x85\xa1\x96\xa8\x9e\x21" - "\xe4\xbc\xac\xe9\x84\xe7\x12\xe2\xc3\x7e\xe7\x4b\xd8\xe7\x7c\x19" - "\x38\x27\xc7\x74\xad\x41\x4f\x2a\xc0\x25\xc3\xf9\xdd\x70\x5e\x9e" - "\xd0\x00\xf9\x9b\xca\x71\x2d\x43\x7d\x45\xe2\x67\x50\x3f\xff\xb9" - "\xa0\xe7\x29\x42\x4c\x96\xde\x41\x02\x32\xc0\xcc\x88\x99\x10\x96" - "\x62\x26\xb7\xc3\x51\xcc\x34\xd1\xf5\xdf\x5f\xf2\x1d\x01\xfa\x1e" - "\x6d\x7a\x29\x54\x39\xe7\xab\x6f\x58\x7c\x1e\x0c\xe7\x67\xaa\x5a" - "\x4f\x12\x9c\xb3\x0e\x79\x85\x90\x59\x46\x42\x50\x27\x38\x97\x3c" - "\x27\x92\x78\xe3\x73\x6a\xa6\x9f\xd4\x23\xb4\x0d\x7a\xb2\xc1\x00" - "\x65\x3d\xdf\xde\x55\xd6\xaa\x4d\x55\x04\xce\x8d\xae\x0a\xd3\x11" - "\xcf\x48\xa2\x44\x3d\x43\x5c\xa4\x9e\xd3\x48\x86\xac\x6a\x65\x59" - "\xd4\x31\xea\x16\xf5\x8c\xf9\x09\xba\xd7\x2e\xd3\x93\x84\x76\xa2" - "\xd4\xc6\xc3\x67\x2c\xab\xd7\x92\x9f\x09\x94\xb1\x96\x55\xf8\xcf" - "\x05\x7c\x94\x21\x26\x00\x8f\x8d\x80\x83\x11\xec\xe6\x9f\xb2\x72" - "\xa0\xbe\x38\xb7\xef\x58\x9d\xcf\xd9\x33\xff\xd1\x2d\x26\x14\xe1" - "\xb9\x90\xe2\x59\x7f\x10\xf0\x9c\x08\x78\xde\x4d\xf1\x3c\xb0\xd9" - "\x0e\x3c\x17\x99\xf1\x7c\xfe\x98\x19\xcf\xfa\x3d\xb6\xf1\xac\x97" - "\xf1\x78\xd6\x5c\x9b\x78\xbe\xf0\x4e\xcf\x78\xbe\x10\xdd\x03\x9e" - "\x4b\x85\x78\xd7\x3d\x78\xbe\x50\xd1\x87\x78\x2e\x74\x0e\xcf\x17" - "\x0a\xa5\x78\x3e\x5f\x4a\xf1\x7c\x3e\xdc\x39\x3c\xeb\x35\xce\xc4" - "\xdb\x66\x3c\xe7\xf3\xfc\xdc\xb2\x89\xf5\xca\x07\x7e\xce\xe7\xf9" - "\x79\x58\x7d\xef\x78\xce\x17\xf1\xf3\xcf\x6f\x9a\xf1\xdc\xb2\xc6" - "\x36\x9e\x9b\x3f\xa7\x78\xce\xbf\x46\xf9\xb9\x79\x79\xcf\x78\x6e" - "\x9e\x61\x1b\xcf\xf9\x53\x84\xbe\x84\x7b\xf0\xdc\x9c\xd5\x77\x78" - "\xce\x77\x92\x9f\x9b\x63\xa5\x78\xfe\x39\x99\xe2\xf9\xe7\x69\xce" - "\xe1\xb9\x25\xd3\x99\xbe\x8c\x08\xcf\x3c\x3f\x5f\x9a\x0f\x78\x06" - "\x7e\xce\xe7\xf9\x79\xf8\x17\x76\xe0\x59\xc4\xcf\xad\x4b\xcd\x78" - "\xbe\x34\xd3\x36\x9e\x2f\xbe\xcb\xe3\xf9\x1a\xe5\xe7\x8b\xf7\xf4" - "\x8c\xe7\x8b\x3e\x3d\xe0\xb9\x54\xe8\xa7\xb9\x07\xcf\x17\xc3\xfb" - "\x10\xcf\x4e\xf2\xf3\xc5\x60\x29\x9e\x5b\x43\x29\x9e\x5b\x3d\x9d" - "\xc3\xf3\xa5\x25\xce\xf4\x13\xcd\x78\x2e\xe0\xf9\xf9\xb2\x3f\xeb" - "\x55\x00\xfc\x5c\xc0\xf3\xf3\xe4\x94\xde\xf1\x5c\x20\xe2\xe7\xb6" - "\x3b\xcd\x78\xbe\x7c\x83\x6d\x3c\xb7\xbf\x4c\xf1\x5c\x70\x8d\xf2" - "\x73\xfb\xc0\x9e\xf1\xdc\xd6\x60\x1b\xcf\x05\x53\x84\x3e\xb0\x7b" - "\xf0\xdc\x3e\xad\xef\xf0\x5c\xe0\x24\x3f\xb7\xfb\x4a\xf1\xdc\xa6" - "\xa6\x78\xbe\x54\xe7\x1c\x9e\x2f\xdb\xdc\xff\xb5\xa7\x3e\xb8\x08" - "\xcf\x3c\x3f\x77\xb6\x02\x9e\x81\x9f\x0b\x78\x7e\x7e\x6a\xba\x1d" - "\x78\x16\xf1\x73\x87\xcc\x8c\xe7\xce\xef\x6d\xe3\xb9\xf3\x01\x1e" - "\xcf\xd7\x28\x3f\x77\x7c\xd9\x33\x9e\x3b\x0e\xf6\x80\xe7\x52\x61" - "\x7c\xc1\x3d\x78\xee\xf4\xec\x43\x3c\x3b\xc9\xcf\x1d\x8d\x52\x3c" - "\x5f\x6e\xa7\x78\xbe\x5c\xe4\x1c\x9e\xb1\x0b\xec\x8e\xf1\x0d\x53" - "\x2b\x8e\x6f\x74\xe0\xf8\x86\xf9\xd9\xbf\x30\xef\x6a\x8a\xe7\x4e" - "\xc0\xf3\x2e\x31\x9e\xff\x6d\x39\xbe\x61\xf8\xdc\xd4\x85\x67\x53" - "\x37\x3c\x9b\x00\xcf\x9d\x1c\x9e\x8d\x46\x61\x7c\x43\xdb\x94\x07" - "\x38\x39\x4b\xb4\x73\x01\xcb\xe9\x3c\x96\xff\x0d\x58\x06\x1d\x9a" - "\x40\xc7\x15\x75\xb5\x24\x44\x4f\x75\xd9\x01\x3a\x36\x89\x71\xdc" - "\xd1\xc8\x20\x7e\x11\xb7\x02\x86\x2b\x57\x01\x76\xa3\x3e\x27\x95" - "\x31\x70\xac\x83\x23\x1e\x0e\xf2\x39\xa9\x68\x04\xec\xae\x10\x63" - "\xb7\x9a\xc7\xae\xf1\xcd\x9e\xb1\x6b\x8c\xec\xbb\xb1\x0c\x23\x1d" - "\xff\xfa\x77\xa8\x32\x64\xde\x37\xac\x36\xb6\x96\xc7\xe7\x59\x12" - "\x62\x20\xde\xec\x53\xea\x11\x9e\xa1\x44\xb9\xde\x48\x98\xb4\x67" - "\x89\x32\xed\x6b\xa8\xb7\xd0\x7e\xeb\x89\xe7\xc9\xf6\x8f\x48\x45" - "\x73\x2d\xa9\xb8\xf4\x19\xa9\x30\xc1\x71\x16\x0e\x28\x6b\xc8\x72" - "\x71\xbd\xf5\x7c\xbd\x4d\x5b\x20\x2f\x7f\xdb\xf5\x36\x85\x71\xf5" - "\x5e\x06\xf5\xee\x30\xd7\x5b\x0b\xed\x00\xec\x33\xda\xc4\x8f\x87" - "\x84\xe8\xc9\x90\x08\x03\xcb\x76\xf0\xf8\x47\xfb\x9c\xac\x69\x27" - "\x21\x91\x60\xb3\xe7\x00\xff\x0d\x85\x24\x21\x0e\xf0\xdf\xd1\x8e" - "\xb8\xd3\x6b\x13\x2f\x03\xfe\x8d\xbb\x59\xd0\x5f\x27\xe2\xff\xdf" - "\x88\x7f\x43\xb9\x89\xc3\xbf\x21\xce\x39\xfc\xb3\xf6\xe0\xbf\xf7" - "\xf1\x10\x46\x86\xf8\x4f\xec\xc0\xf1\x10\xf3\x33\xa0\xbd\xe1\x5f" - "\xc4\xe7\xac\x19\xff\x8c\xcc\x36\xfe\x19\x22\xe0\x5f\x73\xd5\xf1" - "\xcf\x90\x9e\xf1\xcf\x90\x9e\xf0\xef\xde\xb1\x0f\x86\xf4\x1d\xfe" - "\x19\x59\xcf\xf8\x67\x64\xf6\xe0\xbf\xd0\x29\xfc\x33\xc4\x02\xff" - "\x2c\x8f\x7f\xd6\x39\xfc\x33\x8c\x1d\xf8\xb7\x63\xfc\x84\x91\xb7" - "\xe2\xf8\x49\x07\x8e\x9f\x98\x9f\x05\xee\x05\xff\xa2\xf1\x13\x86" - "\x11\xe1\x5f\xde\x03\xfe\x07\x18\x85\xf1\x93\xab\x8f\xff\x01\xbd" - "\xe0\x7f\x40\x0f\xf8\x77\xf3\x58\x09\x33\xa0\x0f\xf1\x2f\xef\x05" - "\xff\x72\x3b\xf0\x9f\xef\x1c\xff\x33\x03\xa4\xf8\x67\x18\x8a\xff" - "\x14\xc6\x49\xfc\x0f\xb4\x07\xff\xbd\x8f\xb7\x30\x83\x11\xff\xc0" - "\xff\xf9\xbb\x45\xcf\x84\xf7\x86\x7f\x33\xff\x33\x03\x45\xf8\x1f" - "\xdc\x03\xfe\x07\x09\xf8\xbf\x06\xf8\x7f\x50\x2f\xf8\x1f\xd4\x13" - "\xfe\xdd\x3b\xb6\xc2\x0c\xea\x43\xfc\x0f\xee\x05\xff\x83\xed\xc1" - "\xbf\x93\xfc\x3f\xc8\x02\xff\x03\x79\xfc\x0f\x74\x12\xff\x1e\x76" - "\xe0\xdf\x8e\xf1\x19\x66\x28\xf6\x67\x81\xff\x0b\xfc\x45\xef\x06" - "\xf4\x82\x7f\xd1\xf8\x0c\xe3\x21\xc2\xff\xd0\x1e\xf0\x3f\xc4\x28" - "\x8c\xcf\x5c\x7d\xfc\x0f\xe9\x05\xff\x43\x7a\xc0\xbf\x9b\xc7\x62" - "\x98\x21\x7d\x88\xff\xa1\xbd\xe0\x7f\xa8\x1d\xf8\x2f\x70\x92\xff" - "\x87\x58\xe0\xdf\x83\xc7\xbf\x87\x93\xf8\x1f\x66\x0f\xfe\x7b\x1f" - "\xcf\x61\x14\xdc\x78\x4e\x07\x8e\xe7\x98\xdf\x11\xe9\x0d\xff\x22" - "\xfe\x1f\x26\xc2\xbf\xa2\x07\xfc\x7b\x0a\xf8\xbf\x06\xf8\xdf\xb3" - "\x17\xfc\x7b\xf6\x84\x7f\xf7\x8e\xdd\x30\x9e\x7d\x88\x7f\x45\x2f" - "\xf8\x57\xd8\x83\x7f\x27\xf9\xdf\xd3\x02\xff\xc3\x78\xfc\x0f\x73" - "\x12\xff\x5e\xee\x19\xff\x61\xbc\xb3\x70\xfc\xc7\xe4\xb9\xc7\xbf" - "\x33\x2b\x72\x89\x29\xb5\x58\xe5\x2d\x53\x11\x83\x67\xa1\x4e\x1b" - "\xdd\x4a\xe6\x5c\x04\x9b\x44\x5e\x24\xcf\x5c\x54\x12\x63\x6a\xb1" - "\x92\x85\xfe\xbf\xe4\x1d\x51\x38\x0c\xa9\xfe\x73\x33\x56\x11\xb9" - "\xd1\x6b\xef\xa7\x98\xa6\x3d\xd3\x4e\xb0\xce\x1b\x50\x07\x67\xcd" - "\x3a\xc0\x31\x38\xf6\x82\x5a\x99\x93\x04\x32\x1d\x3a\xd2\x00\x78" - "\xa9\x68\xd0\x81\xee\xd7\x71\xd8\x42\x5b\x40\x79\xa6\xe5\x9e\x27" - "\x72\xc3\x77\xbe\xa3\xc1\xc6\x3e\x8a\xb5\x44\xe6\xd7\xc0\x9a\xd0" - "\x96\x68\x23\xb4\xab\x6a\x1d\xcb\x82\xdc\x3b\x55\x80\x6f\xc3\x77" - "\xea\xd1\x39\x20\xe7\xf6\x71\x19\xc6\x9b\x9b\xff\x80\xcf\xc0\x8a" - "\x3a\xd0\x65\x8a\x97\x93\x76\xf2\xb6\xe3\xfd\x17\x7b\xc6\x29\x86" - "\xcf\xc0\x71\x0a\xb0\xd3\x6e\x3b\xed\x54\x28\x79\xa7\xd5\xed\x76" - "\x52\x36\xd8\x67\xa7\xe1\xf7\x59\xd8\xc9\xcd\xe3\x07\xc3\x3d\xa8" - "\x9d\x94\x75\xd4\x4e\x4a\x7f\xe7\xec\x34\xdc\xa9\xe7\x7f\xbb\xf7" - "\xa7\x47\x34\x61\x7f\xda\x04\xfd\x69\xfb\xec\x94\xaf\x96\xbc\x83" - "\xeb\x76\x3b\x8d\x48\xb5\xcf\x4e\x23\xbe\x97\xda\xc9\xdd\xfd\xdc" - "\x11\x25\xd4\x4e\x23\x36\x51\x3b\x0d\xaf\x70\xce\x4e\x23\xec\x78" - "\xff\xc3\x9e\x7e\x9f\xcf\x56\xec\xf7\x81\x9d\xec\x6c\x4f\xf9\x85" - "\x92\x77\x86\xdd\x6e\x27\x9f\x40\xfb\xec\xe4\x93\x66\x61\x27\x37" - "\xf7\xc7\x7c\x42\xa9\x9d\x7c\x26\x50\x3b\xfd\x2a\xda\x39\x3b\xf9" - "\xe4\xb9\xa7\x7f\x32\x72\x1a\xf6\x4f\x4c\xd0\x3f\xb1\xcf\x4e\x05" - "\x6a\xc9\x3b\xce\x6e\xb7\xd3\x0d\x75\xf6\xd9\x69\xe4\x3d\x52\x3b" - "\xb9\xbb\xdf\x30\x92\x50\x3b\xdd\x50\x43\xed\x74\x83\x9f\x73\x76" - "\x1a\x69\x73\xfd\x53\xc7\xe2\xe8\x1b\x1b\x30\x8e\x06\x3b\xd9\xd9" - "\x9e\x0a\x0a\x25\xef\x64\xbb\xdd\x4e\x37\x6e\xb2\xcf\x4e\x37\x9e" - "\xb6\xb0\x93\x9b\xe3\xdb\x1b\x0b\xa9\x9d\x6e\x8c\xa3\x76\x1a\x59" - "\xe6\x9c\x9d\x6e\xb4\xe7\xf9\x4f\xab\xef\x61\x75\x8f\xf9\x46\x65" - "\x5e\x5b\x31\xdf\xa8\x00\xfb\x6c\x35\x6a\xcb\x95\x8d\xf9\x46\xcd" - "\xa7\xb6\x1a\xa5\xa6\xb6\xf2\x8d\x74\xce\x56\xa3\x6c\xae\xff\xd8" - "\xdb\xfb\x5b\xdd\xe3\xbe\x5f\x4f\xbb\xb6\xe2\xbe\xd1\x76\xf2\xdf" - "\xaf\xef\xb9\xb2\x71\xdf\xaf\x79\xfe\x1b\xcd\xf3\xdf\x68\x27\xf9" - "\xef\xd7\x76\xf0\x9f\xf5\xf7\xbe\xba\xc7\x7e\x7e\x8d\xd7\x56\xec" - "\xe7\x97\x6c\x9f\xad\xfc\xbe\xbd\xb2\xb1\x9f\x5f\x11\xb5\x95\x5f" - "\x22\xb5\xd5\xaf\xcb\x9d\xb3\x95\x5f\xab\xb3\xef\x8b\x75\x8f\xff" - "\xc6\x5e\x63\xf1\xdf\x58\x3b\xe3\xbf\xb1\x57\x38\xfe\x1b\xcb\xc7" - "\x7f\x63\xf9\xf8\x6f\x8c\x93\xf1\xdf\x58\xa7\xe2\x3f\xa9\xad\x84" - "\x18\x50\x15\x74\x6d\xc5\x80\x37\xe9\xec\xb3\x95\x6a\xea\x95\x8d" - "\x01\x55\x72\x6a\xab\x9b\x6a\xa9\xad\x6e\x52\x39\x67\x2b\x95\xcd" - "\xfd\x6f\x7b\x7b\x3f\xad\x7b\x1c\x78\x73\xd3\xb5\x15\x07\xde\x6c" - "\x67\xff\xf7\xe6\xef\xaf\x6c\x1c\x78\x33\xdf\xff\xbd\x99\xef\xff" - "\xaa\x9c\xec\xff\xde\x6c\x47\xff\xd7\x9e\x71\x3f\xff\x59\x18\x03" - "\x1a\x53\xf7\xf8\x7b\x83\xfe\xbd\x63\x09\xd3\xe1\x07\xf6\xf2\x04" - "\x7b\x6d\x54\x91\xce\x54\xb0\x97\xde\x40\xe6\xbc\xfc\x0d\x5b\xd5" - "\x64\x24\x1d\x60\xab\xcb\x10\x07\x6a\xf5\x8d\xf8\x8e\xde\xef\xeb" - "\x99\x5b\xbf\x7f\xea\x65\x25\x41\x7b\xa1\xfe\x8d\x9e\xfe\x73\x59" - "\xb0\x17\x67\x3f\xcf\xe2\x46\x43\xea\xde\xbc\xd9\xe7\xbe\x61\x23" - "\x74\x2c\x5b\x19\xd6\x8e\x6b\x47\x2e\xa9\x0c\xab\x25\x21\x0d\x64" - "\x88\xea\x31\xb4\xcb\xad\xef\x60\xba\x56\x5f\x4b\x70\xdd\x4f\x6e" - "\x0c\xfc\x1b\xb5\x8f\xe1\x5f\x6a\x4f\x5c\xbf\x09\xdf\x2b\x14\xd6" - "\x68\xd2\x9e\xdd\xce\xd9\xdf\x72\x4c\x95\xb3\xff\xbf\xd4\xca\x5d" - "\xf8\x7e\xa2\xdb\x63\xc1\x5b\xb9\xf1\x3f\xd3\x37\xbe\xa3\x85\x32" - "\x46\x84\xb3\x2c\x94\x71\x44\x55\xab\x9e\x60\x39\xab\x5a\x35\x24" - "\x21\x9a\x28\xab\x3a\x1a\x49\x7c\x2b\xab\xaf\x4a\xfc\x91\x84\x5c" - "\xc4\x79\x01\xc4\xd3\xad\xa7\xa9\xbd\x6f\xf5\x30\x7d\xa3\x1e\x0d" - "\x9f\x35\x55\xd5\x84\x78\x6f\x04\x5d\x1b\x08\xc3\xbd\xaf\xc9\x10" - "\x0f\xd0\x57\x98\x36\xb1\x9e\xb0\x5e\x7f\x51\x69\x0d\x5f\xa3\x3e" - "\xc3\xe0\xfc\xb4\xae\xf9\x06\xaf\xbf\xdc\x82\x69\xa8\x5b\x7c\xce" - "\x54\x1b\xa9\xe7\x64\x84\xf3\xd4\x76\x89\x44\x1b\xdb\x41\xaa\x0c" - "\x84\xe8\x98\x5b\x0e\x9e\x0a\xad\x05\x7c\xdd\xe2\x24\x6f\xfb\x87" - "\xba\x67\xbc\xf2\xb6\x22\x8c\x5b\x01\x5f\xbb\x69\x19\x07\x36\xdb" - "\x81\xaf\x42\x33\xbe\x6e\x9b\xe9\x1a\xbe\xc6\x5d\x74\x33\xbe\xdc" - "\x1c\xbf\x8e\xd3\xb8\x86\xaf\xdb\xee\xa3\xf8\x1a\x17\x46\xf1\x75" - "\x5b\xa0\x19\x5f\x03\x9b\xaf\x1c\xbe\xc6\xf9\x50\x7c\xf9\xd7\x38" - "\x87\xaf\xdb\x4a\xdd\x33\xce\x3a\xde\x13\x63\x6d\x63\x6a\x3e\xcf" - "\x5f\xc3\xea\x7b\xc7\x57\xbe\x88\xbf\xd4\x7b\x5c\xc3\x97\x7a\x81" - "\x7b\xf1\xe5\xee\x98\x5b\xad\x72\x0d\x5f\xea\x6c\x8a\xaf\xdf\x94" - "\x53\x7c\xa9\xb7\x9a\xf1\x35\xac\xfe\xca\xe1\xeb\x37\xd1\x14\x5f" - "\xbf\x09\x74\x0e\x5f\xe3\x9d\x5a\xff\xaa\x7b\xff\xe0\xb7\xe1\xd8" - "\x3f\x00\x7c\xf1\xfc\x35\xfc\x0b\x3b\xf0\x25\xe2\xaf\xdf\x0e\x74" - "\x0d\x5f\xb7\xbf\xef\x66\x7c\xb9\xb9\x9f\x70\x7b\xa2\x6b\xf8\xba" - "\xdd\x48\xf1\x75\xbb\x9a\xe2\xeb\xf6\x56\x33\xbe\x86\x7f\x71\xe5" - "\xf0\x35\xbe\x86\xe2\x6b\xfc\x56\xe7\xf0\xf5\x5b\xdb\xeb\x3f\x3b" - "\x34\xae\x3d\xb1\x02\xfb\x34\xc6\xd4\x02\x9e\xbf\x26\xa7\xf4\x8e" - "\xaf\x02\x11\x7f\x4d\x5c\xee\x1a\xbe\x26\xde\xe0\x5e\x7c\xb9\xbb" - "\x6f\x33\x41\xe7\x1a\xbe\x26\x3e\x4d\xf1\x35\x21\x99\xe2\x6b\xe2" - "\x7c\x33\xbe\x26\xa7\x5c\x39\x7c\x4d\x08\xa4\xf8\xfa\x6d\xab\x73" - "\xf8\x9a\x68\xcf\xfa\xaf\x76\x8c\xc7\x07\x4c\xc0\x7e\x18\xe0\x8b" - "\xe7\xaf\xa7\xa6\xdb\x81\x2f\x11\x7f\x4d\x3a\xe1\x1a\xbe\x26\xad" - "\x71\x33\xbe\xdc\xdc\x1f\x9b\x14\xe4\x1a\xbe\x26\x1d\xa1\xf8\xba" - "\xa3\x91\xe2\x6b\xd2\x41\x33\xbe\x9e\x9a\x7e\xe5\xf0\x75\xc7\x56" - "\x8a\xaf\x3b\xe6\x3b\x87\xaf\x00\x7b\xd6\x3f\xb5\x73\x1e\xe1\xae" - "\x4c\xd7\xfa\x90\x77\x8d\x77\x0d\x63\x77\x7e\x75\x6d\xf7\x21\xef" - "\xdc\xed\x1a\xc6\xee\xba\x99\x62\xec\xce\x59\x14\x63\x77\xf9\xf6" - "\x4d\x1f\x32\xa0\x9d\x62\x2c\xa0\xd4\x39\x8c\xdd\xe5\xc6\xf9\x8f" - "\xc0\x56\xd7\xfa\x91\x81\x69\xae\x61\x2c\xf0\xbe\x6b\xbb\x1f\x19" - "\xe8\xe1\x1a\xc6\x02\x5f\xa3\x18\xbb\xbb\x84\x62\x2c\x30\xae\x6f" - "\xfa\x91\x77\x2f\xa2\x18\xbb\xdb\xc9\x79\x9b\x7b\xec\x78\xfe\xcd" - "\xde\x79\x9b\xdf\x85\xba\xd6\x97\x9c\xfc\xb3\x6b\x18\x9b\xfc\xee" - "\xb5\xdd\x97\x9c\x1c\xee\x1a\xc6\x26\xff\x48\x31\x36\xd9\x87\x62" - "\x6c\xb2\xae\x6f\xfa\x92\xf7\x68\x28\xc6\xee\x49\x74\x0e\x63\xbf" - "\x5b\xe6\xbe\xf9\xa6\xa9\x87\x5d\xeb\x4f\x4e\x5d\xe0\x1a\xc6\xa6" - "\x0e\xbc\xb6\xfb\x93\x53\xaa\x5d\xc3\xd8\xd4\xd9\x14\x63\x53\x62" - "\x29\xc6\xa6\xce\xe8\x9b\xfe\xe4\x14\x7f\x8a\xb1\xdf\x35\x38\x87" - "\xb1\xa9\x76\xac\xff\x6f\xef\x3c\xd9\x34\x95\x6b\x7d\xca\xdf\x1f" - "\x72\x0d\x63\xbf\x5f\x71\x6d\xf7\x29\x7f\x1f\xe8\x1a\xc6\x7e\x7f" - "\x80\x62\xec\xde\x3a\x8a\xb1\xdf\x17\xf6\x4d\x9f\xf2\xde\x64\x8a" - "\xb1\x7b\x83\x9d\xc3\xd8\xb4\x09\xee\x9b\xdf\xbb\x7f\x93\x6b\xfd" - "\xca\xfb\xc7\xb8\x86\xb1\xfb\x2a\xaf\xed\x7e\xe5\x7d\xdb\x5d\xc3" - "\xd8\xfd\x37\x50\x8c\xdd\x17\x44\x31\x76\xbf\x67\xdf\xf4\x2b\xa7" - "\x35\x51\x8c\x4d\x73\x6e\x3d\x0a\xe6\xfe\x6e\xeb\x5f\xad\x58\x15" - "\xb3\x34\x7c\xc5\x32\xd5\x8a\x55\xd1\x51\x2f\xab\x56\xaf\x58\xb7" - "\xfc\xbe\x71\x6b\x26\xa8\xa2\x62\x55\x51\x2b\x56\xbd\xc0\x27\x2c" - "\x1b\x4a\x1e\x5b\x1e\xbe\x34\x16\x53\x40\xfa\x85\x55\x2b\x97\xaf" - "\x8a\x56\x45\x2d\x7f\x79\xcd\x8a\xa8\xe5\xf8\x7d\xb5\xea\xf9\x88" - "\x28\x48\x78\x6e\xf9\x8a\x98\xe5\xaa\x67\xd7\x3c\xff\xfc\xf2\xa8" - "\xd5\x43\xc9\xec\x35\xe1\xd1\x2b\x22\xc3\x97\xab\x66\xcc\x7e\x60" - "\xe2\xfc\x99\x8f\xcf\xff\xc3\x1f\x70\x73\x32\xd1\xde\x64\x7e\x6c" - "\x6a\xb1\x0e\x30\x27\x3f\xc3\x04\x4f\xad\xf2\x25\xdc\xfe\xb8\x19" - "\xcd\x44\xb9\x25\x8a\xc8\x93\x9b\x89\x47\x5a\x33\xf1\x54\xbd\x48" - "\x82\xd8\x2d\x3f\xcd\x85\x74\x1f\x36\xed\xd6\x4c\x36\x3d\x3a\x0c" - "\x3e\xab\xf5\x0a\xcf\x30\x94\x65\xd3\x86\x25\xe3\x39\xd0\xad\x9c" - "\x4d\xf3\x9f\x52\xcf\x3c\xd4\xae\x57\x28\x42\x13\x7e\x24\x0c\x3b" - "\xf4\x0f\x9a\x62\x93\x9e\x39\x86\x3b\x52\x42\xdd\x09\x13\x54\x0b" - "\x47\x19\x61\x1e\x88\x86\x63\x13\x1c\x99\x70\x94\xc2\xa1\x81\xa3" - "\x06\x0e\x1d\x1c\x4d\x70\xb4\xc2\x01\x3d\xb8\xe9\x72\x38\x3c\xe1" - "\x48\x86\xa3\x10\x0e\x90\x9d\x5e\x4d\xf3\x99\x5e\x47\x98\x3f\x7a" - "\xc0\x31\x17\x0e\xc8\x6b\x46\x22\x1c\x45\x84\x99\x39\x0b\x3e\x2b" - "\xe0\x68\x84\x43\x0f\xbf\x7d\xe0\x00\x2b\x4c\xd7\xd1\x73\x33\x21" - "\xed\xc1\x09\x04\xca\xd9\xfb\xf1\x20\xc8\x3f\x38\x1f\x0e\xe8\xb9" - "\x3f\x08\xf7\x7c\x68\x1a\x1c\xa9\x16\x72\x35\xa2\xef\xfa\x9e\xf3" - "\x0b\x56\x7a\x6f\xbc\x49\xc7\xed\x81\xc7\x3c\x70\x8f\x31\x89\x0c" - "\x30\xa6\x29\x42\x23\x6f\x27\xb2\xb3\xcc\x03\x32\xed\x26\xe4\x99" - "\x5b\x33\xb9\x3d\x1d\xe1\x37\xea\xac\x2d\xe5\x01\xa2\x23\x69\x2a" - "\xdc\xd3\xcc\x31\xbc\x3d\x40\xf8\xeb\x83\x74\xb2\x1b\xdb\xb9\x3d" - "\xe0\x52\x74\x65\x6c\x42\xe8\x2e\x6e\xef\x37\xd4\x21\xb6\x83\x64" - "\x9d\x1f\xeb\xf1\x75\x39\xb6\x79\xcd\x3a\x2c\x57\xd0\x57\x6c\x12" - "\xf1\xd2\xc1\x79\x16\xca\xa6\x57\x44\x87\x41\x39\xe5\xf8\xdb\x98" - "\xe6\x19\x76\x59\xb1\x4f\x83\xdf\xdb\xb3\x23\xf4\x6c\xea\xbe\x46" - "\xec\x67\x6b\xe2\xdf\x22\xf5\x70\xdd\x65\xc5\xfe\x64\xd5\x23\xde" - "\x6c\x3d\x5e\x9b\x44\x18\x28\x43\x38\x6d\xab\x41\xb5\x97\x15\xd1" - "\x91\xc6\xed\xfb\x4b\x20\x5d\x6e\x4c\x8b\x0e\xa3\xf9\x7b\x86\x19" - "\x53\xf7\x66\x82\x5c\x39\x97\x9e\x15\xe9\x21\x7c\x87\xcf\x32\x63" - "\x7a\x71\x00\x7e\x2a\x36\x92\x56\xee\x77\x52\x10\xa1\x9f\x4a\xa2" - "\x7a\x84\x90\x26\x66\xfa\xca\x49\xe5\x44\xa6\x79\x04\xcb\x3d\x7d" - "\x4a\x42\x39\x6b\x52\xc5\x0f\x80\xfb\x4f\x9f\xda\x75\xdf\x51\xfb" - "\x0b\x71\xff\x54\x36\xe5\xfe\xea\xdc\xb7\x08\xc1\x6b\xb1\x6c\x3b" - "\x46\x10\x79\xf6\x5b\xc4\x03\xeb\xd8\x96\x32\x7d\x99\xb0\x0f\x1d" - "\x5e\xc3\x80\xfc\xc3\x0f\x27\xb0\xa2\xbc\xef\x34\x72\xf5\x09\xaa" - "\xa1\x3a\x9d\xbe\x55\x27\xf3\x69\x45\x79\xd5\x2d\x9c\x2e\xbf\xe2" - "\xcf\xd7\xa2\x3d\x31\x7f\x36\xad\x58\x87\xbf\x71\x9f\x3b\xef\x72" - "\xc2\xa8\xe2\xfd\x4b\xa9\x8e\xf6\x35\x62\x3e\x28\xcf\xa6\x17\xc2" - "\xf7\x07\x62\xd9\x34\x4e\xc7\x6a\xd5\x2a\x12\x54\xcf\xfc\x51\x66" - "\xdc\xf2\xed\x26\xc8\x03\xda\xdd\xb7\xc9\x97\x15\xc5\x84\xd3\x77" - "\xda\xde\x44\x1d\x33\xbd\x15\xce\x25\x77\xed\x7d\x49\xf5\x2c\x03" - "\xb9\xed\x6d\x29\x7f\x54\xeb\x64\x13\x3d\x38\x3b\xc7\xb0\x35\xb8" - "\xc7\x66\x4b\x0c\x6b\x08\x31\x7c\x63\x02\xae\x22\x70\x3e\x58\x47" - "\xee\x5f\x22\xd4\x91\xda\xbe\x2b\x9f\xaf\xf0\xb7\x7e\x08\x97\x4f" - "\xa4\xb5\x7c\x74\xcc\x1f\xa7\x2c\x36\xa8\x64\x1d\x97\xd8\xea\x8c" - "\x3f\xa1\x1e\x09\xdb\x11\xc3\x56\x6c\x08\x66\xdb\xd3\xbf\x20\xa4" - "\x32\xac\x8e\x40\x9b\xf7\xf3\x92\xb1\xfa\x90\x57\x88\xb7\x57\xa4" - "\x37\xfb\x59\x79\x1d\x59\x1f\xcc\x36\xe2\xbe\xbf\x55\xad\x0d\x24" - "\xee\x2b\xe2\x99\x50\x49\x7c\xe2\x82\x59\x7d\xc5\x92\x3a\x42\xd3" - "\x2b\x49\xc2\xb7\x44\xbe\xbe\x8c\x6d\x9f\x03\xfc\x7f\xaa\x0e\xd3" - "\x1b\x08\xee\x51\x99\xd0\xc8\x1a\xe2\x9f\x26\x9e\xf8\xbd\xb2\x0c" - "\xd3\xbf\x27\x09\xe7\x88\x3c\x24\x56\xef\x9d\x03\xf7\xc4\xeb\x73" - "\xa1\x2c\xa6\x4b\xec\xe1\x8c\x4b\x84\xac\x5f\x48\x7c\xe3\x96\x12" - "\x65\x88\x91\xb0\x5a\xc3\xfb\x24\xc4\xc8\x82\x7f\x39\x41\x36\xac" - "\x20\x1e\x21\x06\x7c\x8f\xed\x4b\x82\xfb\x7e\xe7\x82\x2c\xd4\x4d" - "\x83\x75\x5b\x7f\x9a\xf8\xe2\x3e\xe8\xf4\x9a\x23\xfc\x35\xa7\x09" - "\xea\xec\xb2\xe2\x56\x4d\x7b\x9a\x7f\x10\xd4\x7d\x1a\xea\x00\xee" - "\x53\x6d\xc2\xeb\xe0\xfa\x8c\x28\x4e\x07\xb2\xc5\x06\xe2\x69\x4c" - "\xdb\x1b\xb6\x38\x56\xc3\xe5\xab\x63\x66\xc4\xe6\x46\x71\x65\x92" - "\xc8\x86\x18\xd8\x16\xbd\x62\x2f\xe0\x7e\x46\x5e\x48\xec\x1f\x58" - "\xbc\x16\x6c\xb9\xb5\x2d\x65\x86\x4e\xd0\xb7\x60\x17\x90\xa9\x01" - "\x5b\x6c\x1d\x10\x49\xe4\x6d\x29\x33\x89\x4e\x36\xa9\xc1\x8c\xb5" - "\x07\xc2\xc1\xe6\x83\x04\x59\x5e\xc6\x5f\x27\xbb\x63\x82\x08\x8f" - "\x88\xaf\x2e\x19\x38\x3f\x03\xf2\x08\xa4\xf7\x98\x29\x47\x19\x9e" - "\xfb\x05\xd9\x01\x6c\xf2\xd7\x59\x46\xc5\x3e\x3d\xcb\xb0\xed\x80" - "\xc7\x64\xb6\xc5\xd7\x73\x8e\x81\x6d\x37\xa5\x15\x26\x02\xbf\x7b" - "\xe2\xbe\xae\x54\x7e\xe6\x97\x70\x3e\x53\x15\xc3\x7d\x6f\xc4\xfb" - "\xb0\xa9\xd1\x99\x5d\xe7\x92\xc8\x40\x36\x3b\x42\x07\xbe\x43\x19" - "\x52\xce\xb6\x43\x5b\xd7\xa5\x47\xa1\xef\xd8\xa7\xc3\x76\x6d\x52" - "\xec\xdd\xde\xbe\x63\x3f\xb6\x79\x82\x6d\x84\x4d\x2d\x4c\xa4\xd7" - "\x3e\xb0\x12\xdb\x0d\xe5\x9a\x99\x45\x46\xc8\x03\xca\x94\x07\xe7" - "\x06\xd6\x33\x0f\xaa\xf0\x7d\x52\xf8\x5d\xcb\xed\x7b\xc9\x3c\x38" - "\x8e\xe2\xf7\xeb\x2c\xc9\x6f\x06\x75\x07\xed\x09\x38\x0b\xf9\x01" - "\xd2\x67\x9a\xdb\x30\xa7\x37\x86\x72\x51\x61\x26\xe5\x91\x01\x26" - "\x90\x93\xd5\xf3\xed\xf1\xf2\x90\x6f\x53\xdb\x52\x1e\x04\xfc\x7b" - "\x47\x4b\xda\x49\xca\xbf\x82\x70\x8f\x4d\x28\xcb\x00\xc8\x33\x1b" - "\x3e\x07\xc3\xe7\xbb\xc7\xcb\xd1\xde\x5c\xbe\xc3\xf0\xfb\x8e\x91" - "\xac\x7e\xc6\x4c\x82\xfb\x69\x42\x7b\x7b\xb0\x54\x47\xc2\xe5\x98" - "\xcf\x16\xdc\x67\x14\xd2\x50\x06\xd2\xab\x21\xbd\x95\xe6\xff\x40" - "\x6c\x2b\x94\xd5\x22\xff\x8b\x34\x7f\x9a\x2f\xe6\x27\xe4\x9d\xbd" - "\x8d\x6d\xa2\x79\x3f\xe4\x23\xe4\x9d\x06\x69\x42\xfe\x33\x56\x0a" - "\xf7\x78\x28\x10\xce\xc7\x89\xeb\xb0\x7d\x1b\xdb\x8a\x79\xc0\xb9" - "\xb9\x3a\x92\xd8\x88\xe7\x92\x21\x0d\xaf\x15\xe1\x6a\xc0\xf1\x60" - "\xc8\xa3\x8c\xcb\x23\x56\x47\x12\x22\x2d\x38\x4e\x21\x70\x1c\x9f" - "\x57\x96\x90\x97\x39\x1f\x01\x4f\xdf\xeb\x79\xbb\x62\xbe\x9e\x98" - "\x2f\xc8\x57\xe8\xc8\xaa\x32\x71\xdd\x41\xe7\x71\xfc\xb9\x46\xd0" - "\x7b\xa0\xb4\x1d\x4c\xaf\x61\xd3\xf7\xb5\x23\xc7\xf1\x79\xc9\x90" - "\xaf\x85\xf3\xb8\x07\x29\xf0\x7a\x3b\xb6\x25\x8e\xdb\xd3\xf6\x46" - "\xb6\xa5\x04\x07\x58\x70\xb9\x1c\xe5\x8c\x29\x7f\x98\x98\x8d\x7b" - "\xb0\x8e\x64\x1b\x41\x66\xbe\x64\xdf\x51\x86\xdc\x0f\x69\x5d\xfb" - "\x9f\xa6\x83\x8c\x8e\xf9\xc3\x12\x5b\x7d\x82\xf8\x9b\x09\xa3\x85" - "\x9a\x43\x6c\x8d\x98\x9b\xa6\xf5\x6b\x25\xda\x2c\x13\x31\xe5\x44" - "\x2a\x83\xe2\x59\x0d\xc4\x53\xdf\xe3\x7e\xd6\x8e\xf9\xeb\x60\xba" - "\xff\x67\x07\xc4\x9c\x71\x77\x11\xf4\xd1\xe7\x99\x47\x6e\xd0\xea" - "\x9b\xb9\x76\x07\xdf\xb9\x78\xe0\x6d\x88\x51\x31\x4e\x85\xbe\x41" - "\x58\x26\x43\x63\x55\x13\xc8\xe6\x60\x3a\xc6\xb1\xc0\xa1\xb9\xa2" - "\x73\x6c\x4e\x44\x39\xd5\xdd\xc3\x95\x9c\xaf\xc0\xf2\x1a\x1e\xd2" - "\x60\x99\x4d\x59\x11\xe5\x58\x87\x84\x58\xd6\xa4\x35\xb4\x69\x90" - "\x67\x55\x31\x18\x63\x3f\xbc\x37\x24\x9b\xb0\xa6\xec\x88\x72\xc7" - "\xea\xf0\x30\xb7\xf7\x38\xf4\x23\xce\xeb\xc7\x44\x94\xe3\x3e\xd0" - "\x19\xf1\x03\x3d\xfe\x98\xc5\x6a\x5a\xc6\x46\x2a\xdb\x52\x1e\xae" - "\x10\xf6\xd9\x75\x30\xdf\x0a\xa1\xee\x39\x7c\xdd\x21\x8d\xeb\xb3" - "\x4d\xda\xce\xed\xff\x0d\xbf\x1f\x91\xdb\xb2\x17\x70\x4c\x3b\x5e" - "\x0b\x75\x0f\xca\x15\xf4\x64\xd0\xe3\xfe\xe7\xc3\xcf\x32\x8f\xec" - "\x08\x89\xd3\x10\x6e\x4d\xff\xb4\xc2\x76\xc7\xca\xf5\x08\x37\xfe" - "\x55\x05\x7d\x98\x10\xc3\x51\x96\x72\xe2\x23\xc7\xe6\xf0\xf9\xe1" - "\x39\xc1\x56\x39\x7c\xdf\xc2\x89\x7b\xd8\x1c\xff\x10\xd5\x4b\xd9" - "\xbd\x5e\x8f\xbe\xec\x7c\xbd\x1e\x9d\xd6\xbd\x5e\x8f\xee\x70\x6f" - "\xbd\x1e\xcd\xb3\xa3\x5e\xaa\xee\xf5\x9a\xf5\xb0\xf3\xf5\x9a\xe5" - "\xd3\xbd\x5e\xb3\x5e\x76\x6f\xbd\x66\xd9\x7c\xfe\x41\x54\xaf\x80" - "\xee\xf5\x9a\x7d\xb3\x0b\xf5\x6a\xea\x5e\xaf\xd9\x0f\xbb\xb7\x5e" - "\xb3\x6d\xbe\xff\x6b\x93\x0f\xd3\x8b\x83\x28\x1f\xce\xbe\xe8\x38" - "\x1f\xce\xd6\x74\xe7\xc3\x90\x71\x66\x3e\x0c\x19\xee\x14\x1f\xa6" - "\x47\xf3\xf1\xc6\x9c\xd3\xdd\xf8\x30\x35\x3a\xd1\x3a\x1f\xce\x39" - "\xc4\xf1\x61\x5a\x74\xa2\x63\x75\x98\xb3\xa9\x8b\x0f\x15\xd1\x89" - "\x12\x3e\xf4\x2a\x0e\x6a\x4b\x99\x53\xe7\x1c\x1f\xce\xa9\xeb\xce" - "\x87\x73\xa6\x49\xf9\x30\xc4\xc7\x36\x0e\xf7\xc6\x5a\xe3\xc3\x10" - "\xc3\x05\x96\x62\x63\x6f\xac\x63\xe5\x09\x09\xef\xe1\x5e\xa4\x97" - "\x7b\x39\x88\x8b\x10\x9b\xcf\x7f\x40\x3f\xf6\x30\xc4\x20\xca\x0d" - "\xef\x12\xe6\x4c\x1c\x61\xaa\xfc\x6a\xa1\x8f\xd0\x4e\xee\x88\x04" - "\x4c\x24\x91\x69\x55\x59\x4d\xa4\xca\xef\x0c\x61\x87\x7c\x7d\x98" - "\xcd\x4f\xcc\x0c\x8a\x42\x6c\xce\x7d\x53\x1b\xdd\xee\x60\x19\xe6" - "\x2e\x12\xb0\x59\x65\x00\x6c\xc6\x20\x1e\xe7\x1d\xd3\x36\x9d\xe5" - "\xb1\x39\x6f\x5f\x97\x7d\x92\x28\x3e\xad\x62\x13\xda\x84\x14\x9b" - "\x85\x7c\xcc\x34\xef\x95\xee\xd8\x2c\xd4\x5b\xc7\xe6\xbc\x05\x14" - "\x9b\x85\x7a\xc7\xea\x30\x4f\x65\xc6\x66\xa1\x5e\x82\xcd\xdb\x12" - "\x33\xdb\x52\xe6\xc5\x3a\x87\xcd\x79\xb1\x42\xdd\xb3\xf9\xba\x83" - "\xbe\x6a\xa5\xd8\x9c\x57\x62\xd3\x86\xc9\xff\xf0\x00\x3e\xf4\x3c" - "\xcb\x3c\x96\x68\x84\x98\xd6\x94\x3a\x3c\x16\xfa\x64\x6d\xb8\x9f" - "\x3c\xcb\x04\x12\x76\xad\xda\xb3\x0d\xfa\xc6\x6d\x6d\x61\x1e\xec" - "\xd0\xaf\x1f\x61\x3b\x7d\x09\x94\xdd\x9b\x6d\x53\x7b\x81\xce\xfc" - "\xe1\x73\x44\x76\x0c\xf1\x81\xc3\x37\x9b\xd7\x2b\x7c\x0f\x60\xd7" - "\xfa\x0e\x4d\x8f\x21\x13\xbc\x5b\x89\x07\x94\x21\xd4\x7b\xa3\x92" - "\x78\x1b\x88\x0f\x7e\x67\x93\x3e\x50\x43\xdf\x4d\x8e\xe3\xa2\x26" - "\x05\xdc\x2f\xd6\x9b\x65\x57\xab\x09\xf4\xe3\xe0\x9e\xc4\x37\x97" - "\x61\x4b\x8c\x6b\xd5\x0c\xeb\xb5\xaf\x93\x5d\x1f\xca\x95\xc9\xe4" - "\x9f\x58\x0d\x18\xaa\x66\x13\xc2\xf0\xbe\x41\xb8\xaf\x31\x7b\x5b" - "\x62\x0d\xdb\xe6\x3b\x34\xed\x12\x99\x90\x1b\x43\xfc\x73\x62\x88" - "\x9a\xed\x54\x33\xa0\x83\xd0\x67\x5e\x56\xa2\xdd\x43\x59\x06\xee" - "\x15\x03\xf7\x02\x5b\x1a\xd3\xe0\x5e\x06\xb8\xd7\x05\xb8\xd7\x79" - "\xb8\x57\x12\xdc\x2b\x89\xde\xcb\x31\x9d\x3f\xd6\xd4\xd3\xf8\x75" - "\xc8\x86\xb1\xb8\xce\xee\x0f\xde\xb1\x83\x83\x71\x2c\xbb\x65\x7d" - "\x98\x83\x78\x7f\xdc\xe6\xfb\x2f\x19\xc5\xc4\x8f\xf5\x1c\x16\x3b" - "\xe7\xb5\x6f\x58\xec\x63\xbf\x56\x4c\x26\x60\x9b\xab\x6a\x3f\x47" - "\x58\xc5\xb0\xd8\x13\xea\x26\x47\xef\x65\xf3\xf9\xe7\x94\x24\xb6" - "\xba\xd3\x0f\xfa\x85\xa9\xc5\x1e\x19\x0c\x1b\xdb\xe1\x17\x49\x4e" - "\xd6\x74\x90\xc5\xb1\x38\x5e\xce\xc6\xaa\x9e\x24\x1e\xf5\xcc\x93" - "\xe1\x09\x5f\xe1\xd8\xe3\xfc\x69\xd2\xb1\xc7\xf9\x4b\x08\xf3\x27" - "\x39\x61\x9e\x08\x24\x4c\xe8\x61\x02\x72\xd2\x63\x61\x6b\xc8\xde" - "\xb1\x24\xde\xc0\xfe\x00\xfd\xd9\xda\x74\xe8\x07\x87\x8c\x97\xe9" - "\x34\x31\x38\x16\xb7\xc0\x08\xfa\xfb\x09\x7c\x90\x37\x7e\xc7\xfc" - "\x22\xa3\xc8\xaf\xce\x32\x0b\x0c\xde\xad\x83\x83\x0d\x9e\xc5\x6a" - "\x03\xf4\xdf\x3a\x7d\xf7\x67\x5e\x4e\xdd\xa7\xeb\xc4\x3e\xed\xb3" - "\xc8\x03\xf3\x2f\x7a\xcb\x12\xa1\xaf\x3d\x3c\x96\x65\x7d\x71\x7c" - "\x39\x34\x0b\x0e\xb4\x3d\x67\xf7\xa1\xdf\xd4\x22\x3e\x10\x8b\xb9" - "\x34\x5d\x89\x78\xcc\xe0\x7d\xb6\x7e\xc0\xed\x4b\xb0\x0d\x18\xe1" - "\xfa\x84\xef\x89\x9f\xb6\xce\x48\x00\xd3\xa1\x8b\x8d\x1e\xd8\x8e" - "\x42\x35\x4f\x7e\x41\xce\x44\x12\x26\xe1\x67\xa2\x00\x0c\x79\x62" - "\x7b\x30\x41\x7b\x08\xa9\xf3\x6e\x87\x76\x6d\x8a\xbf\x48\xbc\x91" - "\x27\x70\x0d\x67\x6d\x93\x8e\x98\x2e\xa8\xbd\x76\xad\x22\x3e\x86" - "\x0b\x61\x23\xf4\x17\xc2\x7e\xb5\xc3\x44\x7c\xbc\x22\x89\x32\x7b" - "\x15\x60\x37\x02\xda\xc7\x79\x68\x1f\x4d\xb4\x7d\x74\xe1\x75\xf3" - "\xe7\x91\xf8\x7e\x10\xd7\x36\xd2\xf8\xb6\xb1\x16\xf0\x1a\x63\x6e" - "\x1b\x86\x08\x35\x93\xcd\xb0\x04\xca\x08\x7a\x7f\x7c\x42\x6e\xfc" - "\x60\x8c\x75\x12\xd9\xb1\x91\x91\xc0\xbb\x50\x57\xd6\xb0\x1f\x6c" - "\x31\x70\x3c\xa3\x82\x3e\xbf\xfa\xe4\xdc\x46\x62\xee\xd3\x3d\xb9" - "\xb2\x63\x4c\x24\x51\x3d\xc6\x5e\xa8\x67\x16\xb4\x42\xba\x87\xea" - "\x4f\xbf\x51\x82\x1d\x57\xd2\x3e\xe0\x93\xe1\x38\x9e\xa0\x63\x16" - "\xe0\x7a\x40\x04\xe7\x50\x4e\x71\xe3\xa7\x4f\x4c\x00\x59\x62\x04" - "\x9d\x1b\x3c\xa3\x33\x4d\x9e\xfb\xda\x35\x2f\x76\x70\x6d\xb3\x13" - "\x6c\x70\x06\x2c\xba\xb8\x09\x74\x63\x04\xdd\xb4\x71\x9c\x31\x97" - "\xe3\x8c\xe4\xaf\x67\xc4\xe9\x58\x53\xc8\xb2\x01\x2c\xe8\xc5\x03" - "\xc7\x90\x9e\x89\x24\xec\x86\x73\xa0\xa3\xd6\x5a\xe4\x17\x2f\xd3" - "\x5a\xca\x21\xbb\x40\x3f\x8a\x26\xa2\x64\xd3\x15\x91\xc5\xf1\xe5" - "\x03\x8d\x80\x73\xe4\x11\xef\x8d\xb2\x21\x60\x2b\xaf\x54\x6c\xe7" - "\xd0\xee\xbd\x37\x72\xbc\xc6\xd9\xd6\xb0\x56\x7d\x4b\xe7\x5a\xb5" - "\x0a\x8e\xb1\x02\xd7\xe0\xbe\x61\xd9\xc8\x33\x29\x8f\x6f\x45\x9e" - "\xd1\x42\xcf\xda\x00\xba\xf4\x42\xbf\xb4\x56\xed\xc7\xe9\xf4\x05" - "\xd0\xe9\xf3\xc4\x63\x52\x3b\x91\x41\xb9\x94\x50\x66\x52\x19\x56" - "\x4f\x50\xc7\x46\x68\x47\xa8\xe7\x4e\xe4\x20\xc0\x1a\xc4\x29\x99" - "\xb3\x57\xa8\xc8\x09\xf5\x97\x04\xd7\x81\x4a\xb8\xcc\x7e\x8b\xe3" - "\xb7\xda\x58\x03\xb4\xb9\x62\x35\xea\x16\xf4\x55\x71\x72\x6e\x3b" - "\xb1\x8d\xe9\xd0\xf7\xcd\x98\x0e\x7d\xdf\x8c\xe9\xd0\x83\xdc\xfc" - "\x87\x08\xd7\x97\xb7\x03\xae\x3d\xc5\xb8\x7e\xa2\xf2\x8a\xe2\x7a" - "\x8e\xe3\xb8\xde\x71\x5e\x84\xeb\xf8\xab\x83\xeb\x53\xa1\x1c\xae" - "\x07\x74\x8e\xe1\xf0\x5a\xad\x35\xbc\x47\x74\x4c\x68\x9e\x80\xdb" - "\xcf\xfe\x82\xb8\x5d\xd8\x70\xad\xe2\xf6\x72\x9b\x5a\x05\x87\xdb" - "\x71\x0b\x79\xda\x8d\xdb\x53\xa1\x1d\x44\xd0\x1f\xe2\x97\x4d\x1d" - "\x16\xab\x4a\x20\x7f\x00\x9e\x08\xf7\xde\x38\x96\x54\x72\x3a\x7c" - "\x32\x5c\xf5\x27\xd6\x04\x1c\x31\x06\xf1\xd4\x91\xc4\xb2\x26\xcf" - "\xbd\xdb\x13\x3e\x27\x4a\xb8\x87\x4e\x6b\xd8\x47\xbc\x23\x71\x3e" - "\x2a\x3a\x8c\x55\xf8\x4f\xe1\xe6\xac\x18\x22\x37\xa5\x0d\x4b\xc6" - "\xb1\x2b\x1c\x5b\x34\xa6\x15\xeb\x4c\x5b\x7e\x9a\x6b\x52\xdc\x9a" - "\x89\xf3\x59\xac\xc2\x33\xac\x2d\xe5\xc9\x70\x61\xae\xc5\x6a\x6c" - "\xe2\x59\xac\x83\xf6\x22\x3f\xc3\x3c\xb5\x02\x3e\x19\xf8\x1c\x08" - "\x9f\x03\xa0\x3c\xdc\xbe\x75\x8e\xf9\xb9\x27\xb9\xfe\x2f\xf8\xb2" - "\x40\x9e\x07\xdf\xe5\xda\xe0\xed\x44\x71\x96\xff\x0e\xe5\x31\x08" - "\x73\x37\x66\xf9\x2e\x7d\x6c\xc7\x7b\x83\x4e\xe4\x74\x3e\x89\xfe" - "\x16\xe5\xb7\x83\xfb\x4d\xe4\x2a\xa8\x7f\x1e\xce\xfb\x02\x96\x64" - "\x6d\x6c\xd8\xfd\xfc\xe7\x7d\x88\x55\x1c\x83\xc5\x38\x8f\xe7\xda" - "\x3c\x7a\xdf\xa7\xa2\xc1\x0f\x4b\xee\x6b\x4d\x1f\x3a\xe6\x29\x9b" - "\x7b\xfa\x38\xa6\x8b\xa7\x6c\xee\xff\x38\x53\x6d\x64\x1d\xcc\xcb" - "\xe6\xfb\x9f\xac\x5f\x84\x26\xa4\xd0\xa8\x31\x75\x86\x7a\x9f\x88" - "\x3b\xe7\x60\x5c\xb2\xc8\x66\xff\xd7\xe8\xb9\xb7\x24\x64\xfc\x58" - "\x62\xcc\x8a\xd0\xe0\x58\x27\xc6\x5a\x55\x6a\x03\xc1\x78\x6b\xef" - "\x8b\x3a\xa6\x13\x62\x46\x2f\x68\x8f\x73\x5a\x8f\xb2\x19\x67\x21" - "\x46\x5d\x1b\xea\x9d\xfe\x22\x99\x66\xb8\xe0\x3b\xf4\x0d\xe0\xa0" - "\x0e\xe0\x83\x8e\x0b\x61\xde\x55\x91\xed\xc4\x94\x1d\xa1\xd1\x1a" - "\xca\x49\x2e\xc8\x21\xff\x62\x79\x2f\x5f\x08\xf5\x4a\x59\x85\xf3" - "\x17\x17\x89\xe6\xd9\xbf\x00\xff\x3e\x3d\x6f\xe0\x06\xe0\x1c\xe0" - "\x0c\x8e\x87\x9d\xe0\xe0\x8e\x57\x6f\x5f\x32\x7b\x11\xdb\x5e\x55" - "\xf7\x05\x49\xa8\x24\xca\x84\x35\x44\x81\xf9\x6b\x0d\x95\x94\x97" - "\x17\x02\x2f\xc3\xef\x1c\x11\x2f\x73\xcf\x17\x58\xf0\x32\xc6\xdf" - "\x55\x0d\x8d\xc4\xab\x95\x0c\x9e\xd3\xea\xdd\x1e\xdf\xca\x9a\x30" - "\x1e\xd7\x1a\xce\xe1\xbb\xc7\x5e\x02\x47\xef\x84\xb8\xa3\x33\x82" - "\xf2\x73\x36\xcf\xcf\x3b\xcf\xbb\xce\xcf\x3b\x93\x80\x9f\x21\xde" - "\xdb\x81\xdc\x0c\xbc\x5c\x74\x46\xcf\x18\x80\x8b\x1d\xb3\xed\x33" - "\x36\x9f\xff\x98\x03\xfe\x13\x6d\x8a\xd8\xa9\x2c\x34\xe0\xf3\x08" - "\x3f\x18\xbd\xf6\x10\xf4\x8f\x1d\xe0\x1b\xf7\xbe\x58\xcb\x78\xc5" - "\x82\x6d\x23\x8f\xb2\x86\xd5\xa1\xde\x6c\x67\xa8\xc2\x98\xba\xb7" - "\xc4\xd0\xe9\xeb\xd1\xd9\x09\xf6\x05\xbe\x00\x7f\xa5\xd4\xaf\x0f" - "\xe3\x74\x62\x1a\x13\xa1\x31\x6d\x9e\x42\xc0\x37\x4d\xc9\x39\x4f" - "\x02\xd9\xb4\x3d\x2a\x43\xda\x9e\x09\x9d\x69\x7b\xfc\x01\x97\x5e" - "\x97\x53\xd1\xe6\x97\x35\xa6\xb4\x3d\x41\xa6\xf4\x42\x62\x54\xec" - "\x2d\xd1\x2b\xf6\xa8\xe1\xf7\x14\xd3\x7a\xc0\xc1\x3a\xc2\xcd\x69" - "\xa9\xe6\xa0\x1f\x5e\xbc\xd0\x1a\x0e\x76\x24\x39\xe6\x8b\x67\x87" - "\x02\x0e\x6a\x01\x07\x3f\x8b\x71\x70\x84\x18\x92\x78\x1f\xbd\x80" - "\x62\x01\xf4\xce\xf5\x65\xba\xfc\xf4\x63\x27\xad\xe3\xa1\xce\x3e" - "\x3c\x74\x5c\x90\xe2\x21\xcb\x49\x3c\x80\x7f\xf5\xcd\x81\x7e\xd3" - "\xe5\x0b\x6a\x26\x0b\xf1\xf0\xa5\x19\x0f\x7f\xfd\x8f\x9e\xe9\x74" - "\x18\x0f\x4b\xa6\x39\x88\x87\x44\x17\xf1\x10\x2a\xc2\x43\x1e\xe0" - "\xa1\x08\xf0\xb0\xdb\x8c\x87\x8b\x88\x07\x8d\x08\x0f\x85\xf0\xbb" - "\xb4\x3b\x1e\x96\xae\xe8\x5b\x3c\x0c\x6c\xfe\x65\xe0\xe1\x59\x9b" - "\xfd\x5f\xeb\x78\xc8\x77\x95\x1f\x4a\xcc\x78\xc8\x07\x7e\xc8\x07" - "\x7e\xc8\x17\xf1\xc3\x39\xc0\x43\xbe\x88\x1f\xf2\x81\x1f\xf2\xad" - "\xf0\xc3\x73\xaf\xf4\x2d\x1e\x86\xd5\xff\x32\xf0\xb0\x6c\x91\x83" - "\x78\x70\x91\x1f\xa6\x7a\x88\xf0\x00\xfc\x90\x0f\xfc\x90\x2f\xe2" - "\x87\xd3\x88\x07\x11\x3f\xe4\x03\x3f\xe4\x5b\xe1\x87\xe5\x5b\xfa" - "\x16\x0f\xc3\xbf\xf8\x65\xe0\xe1\x79\x9b\xe3\xdf\xd6\xf1\x50\xe0" - "\x22\x3f\x4c\x5d\x62\xc6\x43\x01\xf0\x43\x01\xf0\x43\x81\x88\x1f" - "\x8e\x00\x1e\x0a\x44\xfc\x50\x00\xfc\x50\x60\x85\x1f\x5e\xd8\xd1" - "\xb7\x78\x98\x9c\xf2\xcb\xc0\x43\x58\x9c\x83\x78\x70\x95\x1f\x4a" - "\x45\x78\x00\x7e\x28\x00\x7e\x28\x10\xf1\xc3\x06\xc4\x83\x88\x1f" - "\x0a\x80\x1f\x0a\xac\xf0\xc3\x8a\xbd\x7d\x8b\x87\xa7\xa6\xff\x32" - "\xf0\xf0\x62\x6a\x6f\x78\x10\xb0\x80\xb8\x40\x2c\x74\x26\x84\x12" - "\xec\x67\xec\x3d\x4b\xf1\x80\x38\xe0\x30\xd1\x12\xea\x6d\x04\x2c" - "\x18\xd6\x03\x16\x3a\x28\x16\x50\x17\x88\x07\xec\x57\x60\x7f\x02" - "\x31\x61\x84\x3e\x85\x41\x01\x7d\x8a\x8d\x72\x5f\xc4\x41\x87\x67" - "\x2f\xfd\x8a\x0e\xc2\xf5\xfd\xb0\x8f\x77\x9e\x79\xe9\x80\x35\x1c" - "\xec\x74\x70\x8c\xaf\xab\x7f\x29\xc1\xc1\x09\x33\x0e\x16\xda\xe8" - "\x57\xfc\xc9\x06\x0e\x74\x76\xe0\xe0\x7c\xf7\x7e\xa6\xab\x38\xe8" - "\x88\xe0\x71\x80\xfd\x4c\x13\xdf\xcf\x7c\x16\xfa\x99\x0a\x47\x71" - "\x10\xbe\xd5\x39\x1c\xe4\x27\x3a\x86\x83\xa9\x1e\x18\x27\x50\x1c" - "\xe4\x17\x19\x14\x10\x2b\x48\x70\xd0\x43\xbc\x20\xc1\xc1\xca\x43" - "\x7d\x8b\x03\x8b\x78\xe1\xbf\x16\x07\xab\x6c\xbe\xff\x6b\x02\xbb" - "\x23\xdf\xe3\xb8\x3d\xbe\x67\xe2\xa5\xa7\xe3\x46\xf8\xbe\x49\xc6" - "\x2a\xe2\x8f\x3e\xc2\xb8\x36\xd4\x3b\xf5\x3c\x99\xb6\x65\x15\x91" - "\x1b\x56\x83\xfd\xa3\x88\xbc\x83\x21\xa4\x63\x75\x98\x77\x45\x83" - "\x9e\x8e\x21\xe1\xf3\xa8\x20\xdf\x99\x4a\xc7\x90\x8c\x2d\xa1\x5e" - "\x5b\x9a\xe9\x33\xb0\x9a\x67\xfe\x0c\xb6\x8d\x78\xc7\x9a\x6d\x77" - "\x39\xc0\xf5\x1d\x62\xae\x3f\x27\xb5\xad\x98\xe7\xb3\x92\x44\x63" - "\x48\x73\x6c\x8c\x21\xd9\x61\x53\x6e\x6c\xff\x3c\xe5\xf9\xae\x31" - "\x24\x17\xc7\xf8\x3b\x81\xe3\x77\x32\x52\x8e\x77\xce\xa6\x91\x91" - "\x3d\x8d\x3b\x62\xfb\xc6\x76\x2d\xb4\xe9\x2e\x1f\x8f\xed\x18\xec" - "\x7d\x39\x75\x8f\x9c\xf3\xf5\xeb\xcd\x6d\x1a\xdb\x32\xb6\x6b\x6c" - "\xc7\x9c\xaf\xc7\x35\x89\x37\xdf\xab\xcc\x11\x8d\x1d\x19\x15\x3c" - "\xcf\x5b\xe1\x78\x53\x8f\x1c\xff\xb2\x55\xfb\x5f\x0f\x1c\x8f\x38" - "\x10\xda\xf7\xb5\xd7\xb6\xa3\x6c\x3f\xff\x65\x1f\x0e\x36\xd9\x81" - "\x83\x44\xc0\xc1\x32\x11\x0e\xf2\x00\x07\xc0\xf3\x74\xcc\x88\xe2" - "\xc0\x3c\x66\x64\xb2\x1c\x33\x92\xe0\x60\x75\x76\xdf\xe2\xc0\x62" - "\xcc\xe8\xbf\x16\x07\xd1\x89\xae\xe1\x20\xdf\x0e\x3e\xc8\x47\x3e" - "\x28\xcd\x11\x8d\x15\x19\x15\xf9\xc0\x07\xf9\x22\x3e\x30\x8f\x15" - "\x99\x2c\xc7\x8a\x24\x38\x58\xb3\xa7\x6f\x71\x60\x31\x56\xf4\x5f" - "\x8b\x83\x98\x64\x17\x71\x60\x07\x1f\xe4\x03\x1f\xfc\xde\x53\x84" - "\x03\xe0\x03\x3e\xee\xb3\x12\xf3\x99\x7a\x8c\xf9\xd6\xee\xbb\x5e" - "\x63\xbe\x6b\x1b\x07\xb1\x36\xe7\x4a\xed\xc3\x41\x81\x1d\x7c\x50" - "\x00\x7c\xf0\xfb\x25\x39\xa2\xb1\x21\xa3\xa2\x00\xf8\xa0\x40\xc4" - "\x07\xe6\xb1\x21\x93\xe5\xd8\x90\x04\x07\xaf\xbc\xdf\xb7\x38\xb0" - "\x18\x1b\xfa\xaf\xc5\xc1\xba\xed\x2e\xe2\xc0\x0e\x3e\x28\x40\x3e" - "\x38\x28\xc2\x01\xf0\x41\x01\xf0\x41\x81\x88\x0f\xcc\x63\x42\x26" - "\xcb\x31\x21\x09\x0e\xd6\x1f\xe9\x5b\x1c\x58\x8c\x09\xfd\xd7\xe2" - "\x20\xce\xe6\x73\x15\x02\x06\xba\xc6\x00\x58\x33\x0e\x38\xdb\xaf" - "\x0e\xf5\xee\xf0\xdc\x23\x17\xfa\xff\xa9\xdd\xfa\xff\xf7\x2a\x6d" - "\x8e\x03\x59\xcc\x2f\x73\x7d\x83\xf4\x3d\x84\xf6\x13\xf6\x96\xa0" - "\xfd\xdf\x58\x47\xfb\x89\xaa\x3f\xa1\xfd\x37\x58\xb7\xbf\xa3\x63" - "\x82\xcb\xc0\xfe\x0d\x3d\xd8\xff\x69\x1b\xfd\x84\x27\x5d\xb3\x3f" - "\x3e\xef\xd8\x79\xc1\x8d\xf6\x17\xc6\x04\x4f\x13\x66\xa7\x4b\xfd" - "\xc5\x78\x9b\xf6\xb7\xfa\x3c\x49\x21\x7d\x9e\x04\x9f\x25\xa9\x6a" - "\x6c\x24\x5b\x2e\x11\xa5\x57\x38\xc5\x04\xf7\x4c\x09\x60\x22\xf5" - "\x2c\x99\x66\xa0\x75\xeb\x7a\xa6\x04\xd7\x70\xa7\xbc\xa0\xe1\x9e" - "\x29\x11\xc6\x03\xba\x9e\x27\x79\x06\x9f\x27\x49\x78\xd7\xe5\xb1" - "\x00\x7c\x9e\x24\x1a\x6c\xdc\x0a\x36\xbe\x88\xf6\x3d\x21\x69\xd7" - "\x92\x31\x00\x5b\xcf\x91\xd8\x33\xae\x73\x05\x9e\x23\xe1\xc6\x00" - "\xdc\xd2\xa6\x13\xa3\x6d\x72\x3b\xd8\x11\xed\xa9\x55\x1b\xb8\x71" - "\x5d\xa1\x8d\x6b\x63\xab\xc9\x96\x0e\xa2\x14\xc6\xff\x05\x9b\x22" - "\xdf\xb3\x80\x03\xf6\x42\xa8\x02\x6d\xfa\xc6\x2a\xe0\xf9\x08\x33" - "\xcf\x9b\x06\x4d\x21\xd9\xeb\x80\xdf\xd7\x91\x40\x4e\x47\x5e\x85" - "\x84\x8e\x07\xec\x2d\xc1\xf6\x8e\xed\x99\x55\xec\x99\xd2\xc9\xb7" - "\x77\x6a\xef\x4a\x82\x76\xa6\x7b\x7d\x6e\x7c\x07\xdb\x1e\xda\xdc" - "\x8b\xb7\x79\x8e\x0d\x9b\x73\xf6\x96\x29\x71\xdd\x10\x7c\xcf\xac" - "\xcb\xe6\x86\x57\x45\xe3\x3f\x62\x9b\xf3\xe3\x3e\x26\x68\xcb\x76" - "\x3d\x3f\x64\xa7\xdd\xdd\x36\xbe\x0f\x76\xcf\xe1\xed\xde\x35\xbe" - "\xef\x92\xdd\x93\x6c\xbf\xff\x22\xb5\x7b\xa2\x1b\xec\x1e\x6a\xc5" - "\xee\x79\xbc\xdd\x77\x63\x3f\x1f\xec\x5e\xda\xc9\x3f\x37\xd2\xdd" - "\xee\xaf\xa6\x5d\x79\xbb\x0f\x6c\xfe\x65\xd8\x7d\x93\xcd\xf5\xcf" - "\xa4\x76\xcf\x77\x47\x7b\x2f\xe9\x6e\xf7\x7c\xbe\xbd\xe7\xfb\x63" - "\xbf\x9e\x55\xe4\xf3\xed\xfd\x9c\x15\xbb\xbf\xf6\xda\x95\xb7\xfb" - "\xb0\xfa\x5f\x86\xdd\x37\xdb\x7c\xfe\xc3\xc2\xee\x6e\x68\xef\x53" - "\x3d\xac\xd8\x9d\x6f\xef\xf9\xbb\xb1\x1f\x0f\x76\xe7\xdb\xfb\x69" - "\x2b\x76\x7f\x7d\xc3\x95\xb7\xfb\xf0\x2f\x7e\x19\x76\x4f\x9e\x6f" - "\x9f\xdd\x0b\xdc\xd0\xde\xa7\x2e\xe9\x6e\xf7\x02\xbe\xbd\x17\xf8" - "\x63\xbf\x9d\x55\x14\xf0\xed\xfd\x88\x15\xbb\x6f\x59\x73\xe5\xed" - "\x3e\x39\xe5\x97\x61\xf7\x14\x9b\xcf\xff\x59\xd8\xdd\x1d\xed\xbd" - "\xd4\x8a\xdd\xf9\xf6\x5e\xb0\x1b\xfb\xe9\x60\x77\xbe\xbd\x6f\xb0" - "\x62\xf7\x37\x56\x5e\x79\xbb\x3f\x35\xfd\x97\x61\xf7\xd4\x19\xbd" - "\xcd\xd7\x0b\xb6\x17\xc6\x6c\xb8\xf9\x59\x88\xef\x05\x7b\x23\x0e" - "\xd0\xe6\x88\x05\xb1\xcd\xb9\x67\x78\x22\xe8\x33\x3c\x18\xb7\xb3" - "\xd0\x17\x67\x07\x71\xcf\x6f\x4c\xe1\xfa\xed\x7c\x1c\xcf\xca\xe4" - "\xbe\x18\xcb\xdb\x8e\xe3\xd3\x9e\x16\xec\xed\x6c\xdf\xad\x37\x7b" - "\x5b\xf6\xc9\xaf\x15\x7b\x8b\xfb\x6f\xee\xb1\x77\x7a\xa0\x73\xf6" - "\xce\x4f\x74\xcc\xde\xf9\x79\xd4\xde\xdc\x73\x1a\xa5\x66\x7b\xe7" - "\xef\xa6\xf6\xce\x2f\xb4\xed\xcf\x33\x66\x5f\x79\x7b\x4b\xc7\xe4" - "\xff\x7b\xed\x9d\xe9\xdf\xd3\x18\x0c\xda\x1a\xed\x9e\xf1\x22\xf1" - "\x7f\xe3\x45\x3a\xb6\x62\xb8\xe0\x8b\x9c\x2f\x47\xfb\xe3\x3b\x3e" - "\x5e\x80\x81\x53\xa1\x7a\xd2\xd1\x16\x4a\xf0\x5d\x1e\x7c\xee\xa2" - "\x2a\x4c\x47\xb4\xb1\x27\xc9\x96\x28\xa2\xac\x58\xd2\x4c\xe6\x14" - "\xb2\x9d\xda\x3a\x0d\xbe\xe3\x2d\xd7\xac\x3b\x49\xd8\x08\xf5\xd0" - "\x67\x5a\x09\x73\x9e\xc9\xac\xc3\xe7\x36\xee\x68\x05\x9d\xe0\xfb" - "\x3e\x60\xf3\x2d\xe7\x09\x39\x11\x4d\x88\xea\x79\xb4\xf5\x9b\x53" - "\x07\xae\xb1\xf2\x9e\x8f\x23\xe3\x32\xe2\xb1\x57\x2b\xb6\xde\xc5" - "\xb8\xe7\xd9\x0c\xe1\xb9\x0c\xc9\xb8\x8c\xab\xef\x5f\xba\xed\xd9" - "\x8c\xb7\x3c\x7b\x7a\xde\x06\xed\x89\x6d\xda\x90\x4e\xc7\x65\xb4" - "\xb1\xe5\x04\x9f\xab\xc1\x36\x6c\x6c\xf1\xf5\x58\x1f\x0d\x6d\xbd" - "\x96\xb6\xf5\x37\x9a\x41\x76\xc9\xd7\x04\xf1\x41\x6d\xdb\x49\x6d" - "\xdb\x8c\xb6\xfd\x9a\xb0\xab\xd5\x43\xcf\x33\x6f\x1d\x44\xfb\xa2" - "\x5d\x13\xbe\x22\xca\xc5\xb8\x2e\x0a\x72\x3c\xf0\x3b\xd8\x79\x4a" - "\xee\x8b\x24\x10\xdb\xbf\x31\x6d\x8f\xbf\x21\x8d\x3e\xa3\x81\xbc" - "\xdf\xe9\x59\xac\x4e\x89\xe2\xed\xff\x24\xda\xff\x6d\xab\xf6\xdf" - "\xe5\xec\xd8\x3b\x6f\x7f\xa7\xdf\xeb\xb9\x5a\xed\x3d\xc2\x5d\xed" - "\x7d\xab\xcd\x35\x51\x2c\x70\x90\xe8\x38\x0e\xda\xac\xe0\x60\xeb" - "\x61\x2b\x38\xc8\x03\x1c\x84\x5a\xe0\x60\x37\x8f\x83\x42\x38\x5f" - "\xda\x1d\x07\xef\x3c\xd0\x37\x38\xb0\xf3\x7d\x9e\xeb\x1e\x07\xdb" - "\xfc\xec\xc3\x41\xbe\x13\x7c\x70\xc1\x0a\x0e\xb6\x95\x75\xc7\x41" - "\x3e\xf2\x41\x89\x14\x07\xf9\x3c\x1f\xe4\x03\x1f\xe4\x5b\xe1\x83" - "\xff\x79\xb8\x6f\x70\x60\xe7\x7b\x3c\xd7\x3d\x0e\xb6\xdb\xf4\xff" - "\x16\x38\x70\x82\x0f\xbe\xb1\x82\x83\xed\x15\x56\x70\x90\x87\x71" - "\xa0\x05\x0e\x78\x3e\xc8\x2f\xc4\xf8\xb0\x3b\x0e\x76\xcc\xeb\x1b" - "\x1c\xd8\xf9\xfe\xce\x75\x8f\x83\x9d\x36\xdf\xff\x95\xe2\xa0\xc0" - "\x09\x3e\x38\x6a\x05\x07\x3b\x6b\xba\xe3\xa0\x00\xf8\x60\xea\x12" - "\x29\x0e\x0a\x78\x3e\x28\x00\x3e\x28\xb0\xc2\x07\xbb\x16\xf6\x0d" - "\x0e\xec\x7c\x6f\xe7\xba\xc7\x41\x96\xcd\xfe\x9f\x05\x0e\x9c\xe0" - "\x83\x04\x2b\x38\xc8\xaa\xb3\x82\x03\xe4\x83\x52\x0b\x1c\xf0\x7c" - "\x50\x00\x7c\x50\x60\x85\x0f\xb2\x97\xf6\x0d\x0e\xec\x7c\x5f\xe7" - "\xba\xc7\x41\x8e\xcd\xf7\xbf\xc5\x38\xe8\xec\xea\x2f\x94\x72\x38" - "\x48\x59\x47\x71\xb0\x01\x71\xd0\x48\x9f\xdf\x49\xe5\x71\xd0\xd5" - "\x57\x68\xb0\xc4\x40\x8e\xae\x0b\x03\x3f\x9a\xfb\x0a\x9d\x60\x6f" - "\x6e\x3c\x88\xef\x27\x08\xe3\x40\x5c\x3f\x01\xfa\x89\x29\xcd\xbc" - "\xfd\xb9\x31\x81\x5c\xeb\xf6\x77\xa0\x9f\x28\x79\x46\xc3\xd2\xfe" - "\xd7\xf8\x7b\x3a\xdd\xc6\x05\xbe\x72\xf5\xd9\x8c\x3c\x3b\xed\x2f" - "\xc4\x05\xf6\xda\xff\x1b\x2b\xf6\xcf\xb3\x62\xff\xfc\x3c\x6a\xff" - "\xa9\x1e\x42\x3c\x20\x8c\x0b\x71\xf1\x40\x37\xfb\xbf\xdb\x47\xf6" - "\xbf\x36\xdf\xcf\x71\xbf\xfd\xff\x6c\xd3\xfe\x99\x8c\xa9\x04\x8e" - "\x52\x38\x34\x70\x94\x1b\x19\x32\x33\x9b\x31\x71\x7b\x33\xe1\x1a" - "\xe2\xd9\x49\xdd\xce\x0f\x62\x07\xdd\x98\x85\x32\x60\x43\xae\xff" - "\x29\xe4\xc1\xa6\x10\xd4\xa3\x46\x21\x5b\x82\xeb\x5f\xa1\xec\x60" - "\x21\x2f\xc5\x46\x12\x24\xe4\x05\xf5\x4b\x04\xbd\x6b\xbc\x37\x06" - "\x0d\x02\xf9\x72\x36\xe5\xa9\x22\x90\xf5\xe0\xf2\xdc\x28\xe7\xfa" - "\x32\x82\xac\x31\x49\x86\x6b\x36\x69\xbc\x65\x20\x4b\xf3\x1c\xc2" - "\xcb\xa9\x4c\x49\x44\xc5\x95\x93\x61\xf0\x7e\x96\xe5\x1c\xca\xcb" - "\xf9\x8b\xcb\xa8\xd8\x18\xc4\xe5\xc7\xcb\x0c\x63\x19\x7d\x3b\x5f" - "\x17\xb5\x58\xce\x38\x9d\x60\x9e\x82\x9c\x27\x9f\xd7\x04\x89\xcc" - "\x9f\x09\xf1\x96\xa9\x68\xf9\x62\x19\xc2\x97\x4f\x81\xb2\xc6\xa1" - "\x4f\x26\x1a\x65\xf2\x00\x13\x43\x02\x24\xd7\x6c\x26\x9c\x3c\x2f" - "\xeb\xc5\xc9\x0e\x9a\xd6\x0a\xb2\x81\xbc\xce\xe5\x62\x9d\xf3\x72" - "\xde\x82\x1e\xc5\xe7\x8c\x49\x0c\xe6\x85\xe7\x95\xec\xa0\x69\x1e" - "\x50\x87\x69\x82\x9c\x70\x3f\x6d\x18\x21\x9c\x2c\x43\xee\xe4\x6d" - "\x32\x1c\xea\x11\x24\xc8\xe1\x3a\x6a\x82\x2c\xe0\x7a\x54\xae\x59" - "\x37\x23\x8c\x29\x8b\x82\x8c\x1b\xe5\x33\x2c\xf3\xf4\xde\x28\xd3" - "\xa1\x5c\x65\x23\x97\x37\xda\xaf\x15\xe4\x7f\xc5\xeb\x28\x98\xda" - "\x44\xd9\x65\x13\x23\x63\xc0\x73\x9a\x1c\x5a\x56\x1f\x5e\x6e\x56" - "\x77\x39\xb9\x58\xee\x06\xaa\xc7\x17\x6b\x40\x37\x73\xbb\xcb\x7a" - "\x88\x65\x47\x52\xd9\x67\xa2\x41\x76\x7e\x77\x59\xa5\x58\xf6\x46" - "\x2a\xbb\x64\x13\xc8\x86\x5a\x29\xeb\x08\x91\xac\x2f\x95\x7d\x76" - "\x2b\xc8\x2e\xea\x2e\xab\x12\xcb\x8e\xa2\xb2\xe1\x75\x20\xbb\xa4" - "\xbb\x6c\x90\x58\x76\x34\x95\x5d\xb6\x1b\x64\x97\x75\x97\x4d\x14" - "\xcb\xfe\x9a\xca\x3e\x7f\x10\x64\xc3\x2c\x65\x73\xa9\x6d\x6f\xe1" - "\x6d\xeb\x47\x65\xc3\xca\x40\x36\xdc\x4a\xdd\x06\x70\xf9\x52\xd9" - "\x31\x54\x76\xd1\x76\x90\x8d\xb4\x62\x0b\xb1\xec\x58\x2a\x1b\xd7" - "\x08\xb2\xd1\x56\x6c\x21\x96\xbd\x89\xca\x46\x96\x82\x6c\xac\x15" - "\x5b\x98\x65\x87\x46\x69\x40\x26\x0e\xea\x59\x6d\x45\xb7\xe2\x3c" - "\x6f\xa6\x79\x46\x97\x83\x7c\xa2\x15\xdd\x8a\x65\x6f\xa1\xb2\x31" - "\xd5\x20\xbb\xc9\x8a\x6e\xc5\xb2\xb7\x52\xd9\xd8\x5a\x90\x4d\xee" - "\x2e\x0b\xed\x8d\xea\xf7\x2e\x5e\xbf\xfe\x54\x7e\x9d\x0e\xe4\x53" - "\xad\xe8\x17\xf3\x13\xda\xec\x38\x2a\xbb\xaa\x01\x64\x33\xad\xe8" - "\x57\x2c\x7b\x1b\x95\x4d\x4d\x05\xd9\xad\x56\xf4\x2b\x96\xfd\x0d" - "\x95\x4d\x3c\x0c\xb2\xdb\xad\xe8\x57\x2c\xab\xa6\xb2\x49\x88\x9d" - "\x2c\x2b\xe5\xbd\x45\x24\x3b\x9e\xca\x6e\x2a\x02\xd9\x3c\x2b\xf6" - "\x10\xcb\xde\x4e\x65\xd3\xe3\x40\x76\xb7\x15\x7b\x88\x65\x7f\x4b" - "\x65\x37\x23\xd6\x0b\xad\xd8\xa3\x4b\x16\xfc\xc2\x04\xe3\xd0\xe4" - "\xac\x5c\x94\x97\xc9\xb9\x35\xd4\x58\x86\xf3\xef\x9c\x2c\xe0\x44" - "\xc3\xf3\xdd\x44\x9a\x67\x0a\xb6\x4b\x6e\xed\x5d\x94\xa9\x6c\xe7" - "\xf8\x08\xfc\x8b\xe1\xee\x5c\x33\x77\xdf\x41\x65\xe3\x11\xbb\x07" - "\xc5\x1c\xca\x32\x72\xb1\xdc\x24\x2a\x97\x83\xbc\x50\x2a\x95\xf3" - "\x30\xcb\x0d\x7d\x6b\x3e\x9c\x3f\x9c\x63\xc1\xc7\x50\x4e\x71\x5e" - "\x77\xd2\xbc\xb6\x2e\x02\x59\x8d\x54\xce\x70\x97\x48\xee\x2e\x2a" - "\xb7\x6d\x19\xc8\x95\x49\xe5\x54\x62\xb9\xbb\xa9\x5c\x1e\x96\xad" - "\x5c\x2a\x17\x24\x96\x0b\x34\xa6\x6c\x0f\xe7\x64\x37\xca\x2b\x2c" - "\xf5\x07\xba\xbe\x4b\xe4\xd3\xee\x31\xa6\xec\x8c\xe6\x65\xab\x05" - "\x1d\x72\x7a\xa6\x98\x67\x78\xcc\x4f\x36\xa6\x64\xc5\xf1\x72\x35" - "\x62\x3f\x20\xf2\xb5\xbf\x63\x87\x66\x86\xf3\x7e\x94\xee\x31\xb2" - "\x51\x5e\x67\x2d\xde\x88\xbc\x9d\x0c\x3b\xcb\xfc\x75\x1a\xf5\x3d" - "\xc2\x7e\x5d\x45\x74\xdf\xe4\xac\x08\x5d\x48\x2b\x6b\x10\xa7\x65" - "\x30\x6c\xf5\xa4\x56\x22\xc7\x35\x53\x59\x45\x31\xc4\x32\x45\xbb" - "\xf5\x63\x22\x49\x5b\xca\x5f\x83\x75\xb2\xc9\xdc\x5e\x1d\xf0\x7d" - "\xbe\x8e\x24\x67\xe2\xf7\x8c\x24\xb6\x1d\x74\x22\xc3\xfd\x5d\x72" - "\xe1\x7b\x3a\x1c\xdc\x9e\x2a\x10\xd7\xb1\x9b\x49\x90\x26\xc6\x40" - "\xce\xc4\x12\xc6\x94\x1e\x9d\xa7\x8a\xc2\x75\x05\xff\xfa\x2e\xbb" - "\x36\x6c\x1a\x94\x45\x03\xf7\x5d\x56\x0f\xbf\xb9\xb2\x40\xfd\xc1" - "\x37\x1e\xd6\x44\xe1\xda\xa2\x7f\xfd\x52\xaf\x28\xd6\xb0\xaf\x3e" - "\xf5\x63\x64\x3c\xb9\x09\xca\x5f\xd3\x02\xdc\xd0\xb2\x36\xec\x7e" - "\xcc\xc3\xa4\x88\x3e\x0c\xe5\xcd\xc4\x35\x09\xd9\xed\xfb\xf3\xe8" - "\x7a\x85\x45\xdc\x7a\xee\x50\x9e\x6a\xd6\x2f\xa2\xda\xd4\xb1\x29" - "\x11\xf7\x86\xd3\xc4\x9f\x25\xf5\xa2\x73\xfa\x51\xfb\xb9\xb5\x0c" - "\xa1\x7e\xd5\xc6\xe4\xaf\x77\x9b\x3c\xbe\xce\x63\x93\xbf\x27\xda" - "\x70\x1d\xa1\x7b\xc1\x14\xed\x61\xbd\x16\x6a\x4d\xc9\x5f\x27\xb3" - "\xc9\x0d\x7a\x6d\x6b\x07\x97\x0e\x79\x2c\xc2\xb8\xb3\xc5\xe3\xdb" - "\x38\x36\xf9\xdb\x44\xcd\xe8\x0e\xd2\xc0\x14\x71\xfe\x01\xd3\xd9" - "\x2d\xdf\x13\xd4\x95\x69\x4b\x83\x7e\x80\x2f\x91\xb7\x0c\xf9\x36" - "\xae\x2d\xa5\x28\x4e\xd8\x93\x44\xb8\x17\xe6\xab\xe3\xf3\x82\xf3" - "\x59\x3a\xd9\x8d\x4a\xba\x4e\xe2\x5f\x6b\x7a\x78\x46\xc4\x9b\x4d" - "\x8b\xae\x05\xf9\x0a\x88\x2d\xe3\xa8\x0d\x8a\x6a\x75\x32\x45\x1d" - "\xff\xbd\x41\x27\x1b\x3e\x83\xff\xae\xd7\xc9\x26\x06\xf3\xdf\xbb" - "\xd6\x7f\xb4\xbe\x1e\x65\x74\x11\xe8\xbc\xcc\xb4\x2b\xd4\x03\xe3" - "\x62\x8c\xf5\x59\x45\x74\x91\x6a\x2c\xee\x43\xb8\x6f\x2b\xdc\xb3" - "\x8c\xee\x05\xb0\x6f\x21\x7c\x7a\xf3\x9f\x7a\xfe\x93\x45\x19\x0e" - "\x57\x7e\x91\x73\xd9\xd4\xc2\xed\xa8\xef\x78\x23\x6b\x82\x7c\x1b" - "\x41\x77\xed\xda\xd8\x46\x5e\xa7\xfb\xb8\x3d\x90\x39\x9b\x82\xdd" - "\xd9\x21\x0d\xed\xdc\xbd\xd2\x8a\x35\xe2\x72\x05\xdc\x79\xd7\xdd" - "\x81\xf7\x4c\xfe\xdd\x94\xa9\x4b\x9f\x7d\x6e\xd9\xf2\xe7\x5f\x08" - "\x5b\xf1\xe2\x4b\xe1\x2b\x57\x45\x44\xbe\x1c\xb5\x3a\x7a\x4d\xcc" - "\xda\xd8\x57\xd6\x41\x3e\x5d\x7b\xd0\xb1\xbb\x66\xc8\x5a\x19\x02" - "\xf7\x98\x8e\xf7\xb8\xc8\x95\x05\xd2\x28\x1e\xf6\x35\xc8\x55\xd6" - "\xf5\xa9\xf5\x85\x7e\xcf\x2d\xb8\xff\x57\xf1\x03\xb8\xef\x0d\x60" - "\x4f\xa6\xcd\x7a\x48\x83\xfb\xa6\x35\x30\xc5\x81\x55\xfa\x87\x34" - "\xb8\x6f\xdf\x71\xdf\x46\xe2\x7f\x0b\xee\xad\x56\xac\xc2\xf3\xb9" - "\xb7\x11\x52\x06\xd7\x5a\xcb\xf3\x16\x25\xf1\x7d\x7b\x24\xab\xdf" - "\x3a\x92\x6d\xc2\xfc\xb7\x6e\x63\x1b\xf5\xeb\xc3\x48\x3a\xfc\x06" - "\xcc\x2a\xcf\x30\xc5\x17\x8f\x43\xa4\x0d\x31\xb4\x5f\xce\x36\xb6" - "\x61\xd3\x48\xb6\xe1\xd5\x6d\x6c\x53\xee\x48\x56\xe7\xbf\x95\x78" - "\xb6\xa5\x14\x17\xea\x98\x62\x6e\xbd\xf4\x0c\x38\x6f\x1a\xba\x2f" - "\x2f\x03\xce\x4d\x32\x90\x01\xb9\xf0\x1b\xd2\x5a\x8f\xab\x68\xb9" - "\xf7\x37\xb7\x0f\x84\xfc\x52\xd9\xce\x70\x59\x3a\xdc\x87\xda\x68" - "\xff\xa8\x32\xf0\xfe\x70\x3f\xbd\xb6\xbd\x1e\xb0\xb8\xdf\x17\xf7" - "\x93\x82\xfb\x79\x6b\xb7\x37\x11\xcc\xaf\x38\xaa\x7d\xe0\xea\xd1" - "\xac\x01\xae\x6d\x37\xad\x0f\x97\xc1\xfd\x6a\x20\xef\x56\x71\x7d" - "\xd4\xcf\xaf\x8c\x56\xad\x5a\x13\x1e\x3e\x7e\x28\x51\x73\x9f\x92" - "\x3d\xff\xa2\x71\x2d\xda\xb7\xb7\xb1\x65\x50\x4f\x0d\xd4\xb7\xbc" - "\x12\xa2\x7d\xc0\x0b\x81\x3a\x65\x42\x19\x56\x42\xfa\x61\xf8\x7e" - "\x18\xca\x5e\x4e\xf7\x89\xd3\xec\x60\x53\xf6\xfb\x43\x39\xd1\xdf" - "\xa8\x70\xed\xda\x96\xb5\xf3\x65\x50\xef\xad\x20\x57\xae\x1a\x4d" - "\xc6\xc1\x75\x17\xa1\x1c\xbb\xe1\x3b\xca\x73\x7c\x00\xf2\x3c\xf6" - "\x34\x5b\xf0\x37\xe8\x4a\x93\x3d\x92\x4d\x6d\x4b\xd9\x5f\x8d\x6b" - "\x72\x73\x7b\x17\xc1\x6f\xd0\x4b\x39\xc8\x66\xb6\x24\xcc\x97\x41" - "\x9f\x51\x96\x6b\xce\x33\x0f\xcb\x84\xe5\xc0\x7e\xe8\x29\x88\xfa" - "\x4c\x9d\xa1\x64\x62\x3b\x91\x9d\x6a\x20\x24\x6b\x1b\x9b\x07\x47" - "\x16\x1c\xdb\x4f\xc2\xb9\xcf\xe0\x28\x87\xf4\x0a\xf8\x3c\x09\x9f" - "\x9f\xc1\x01\xfd\x58\x5f\x2c\xf7\xea\x38\xb6\x71\xd2\x76\x72\x2b" - "\xe6\x0f\xd8\x7a\xa2\x9e\x39\xaa\xc7\xb2\xe3\x9a\xf7\xec\xd0\x92" - "\x65\xd2\x75\xc2\x0f\xd4\x12\x38\x0f\x9f\x4d\xf4\x53\x7c\xbc\x17" - "\x08\xc7\x7c\xfe\x7b\x16\xc8\x94\xf1\xdf\x4b\xe0\x38\xdc\xfb\x61" - "\x99\x9f\xad\xe3\x6f\x6a\xfb\x65\xed\x39\x34\xcb\xec\x93\x3b\xa8" - "\x23\xcc\x87\xd0\x0b\xfe\x30\x52\x9a\xfe\x61\x30\x4d\x3b\xec\x43" - "\x7f\x1f\x56\xf1\x9f\xb3\xe0\x00\x3d\x1d\x81\xfc\x8f\x24\xd3\xb4" - "\x23\x5b\xe1\xb3\x0e\x8e\x46\xe9\xfd\x35\x70\xbd\x26\x0e\xed\xd9" - "\x99\x04\xfe\x02\x6c\xa9\x63\x4a\x02\xd1\x46\x19\x14\x5b\x32\x13" - "\xcb\xa5\x05\x00\xb6\xb2\xcc\xf8\x79\x6f\x9c\x14\x3f\xef\x29\x2d" - "\xf0\x93\x89\x5c\x04\xed\x25\x2e\x97\xe2\xe5\x70\xcb\xfa\x65\xf0" - "\xfb\x3d\x1f\xc8\xe7\x30\x8e\x8f\x40\x1e\x5c\xac\x9a\x71\x96\x10" - "\x45\x18\x91\x23\xbf\x34\x31\xef\x2d\x47\xcc\xe2\xbd\xf9\xfb\xd2" - "\xb2\x40\xf9\x20\x2d\x0f\xcb\x17\x01\xf9\xc2\xef\xdd\x20\x97\xa7" - "\x25\xcd\x42\xd9\xb8\x6b\x52\x5e\x04\x3c\xf2\xe5\xc5\x3c\xf1\x3a" - "\xd6\x5c\xaf\x00\xbc\x86\xde\xfb\x6f\xa3\x20\x1d\xfb\xb5\xf8\xee" - "\xd3\x00\xad\x41\x47\x10\x93\xf8\xa9\x35\x04\x40\x5b\x0a\x26\xa6" - "\xb6\x50\x32\xc9\x97\x04\x40\x7b\x1b\x52\xcf\xbc\x67\xb8\x23\x8e" - "\x04\x60\x7e\xc8\xe9\x50\x0f\x4d\x2e\xb6\x45\x9a\x17\xe7\x07\x31" - "\xff\x93\x91\x84\xbb\x4f\x0e\x96\x07\xce\x8b\xee\xbb\x15\xfb\xb0" - "\x19\xeb\x68\x5d\xe1\x5e\xbb\xe1\xfa\x12\xac\x3b\xea\x13\xce\x97" - "\x42\x3e\xa1\x78\x8e\xdb\x37\x88\xd6\x67\x37\xee\x2d\x81\xfa\x40" - "\x79\xdc\x87\x92\xae\x11\xbe\x7f\x03\xa7\x37\xb8\x1e\xed\xc1\xc2" - "\x3d\x30\x8f\x04\x03\x6b\x60\x81\x8f\xfe\x77\x5d\x3b\xc4\x1d\x07" - "\x3f\x97\xda\xe7\x6f\x25\x62\xfb\xc0\x75\x25\x70\x7d\x19\x0b\x75" - "\x44\x3e\x81\x7b\x7a\x63\xac\x01\x69\x99\xa6\x14\xc8\x23\xa6\x9d" - "\x1b\xd3\x81\x7c\x8e\x41\x59\x32\x31\x1f\x28\x4f\x19\x9f\x97\xe1" - "\x58\x9c\xd4\xd6\x7c\x7e\xbb\xd1\xe6\x5c\x7b\x5e\xc7\xd5\x09\xb8" - "\xeb\xe0\x9b\x39\xf4\x5c\x29\xc8\x94\xb2\x9d\xc1\x04\xf7\x6a\xa0" - "\xbe\x84\x3b\x77\x30\xe1\x32\x67\xdf\x32\xca\x6b\x07\x0f\xac\xde" - "\xc0\x36\x9a\xcb\x7d\x30\x4c\xd8\xef\x82\x2f\xf7\x41\xbc\x1f\xbb" - "\x76\x11\xe7\x57\xf1\x1e\x78\x3d\x9f\xdf\x0c\xcc\x4f\xd0\xd5\x1d" - "\x50\x0e\xaa\xaf\xbf\xc5\x42\xfa\x6e\xc4\x22\xa7\x37\xe0\xd1\x96" - "\x04\xc4\xe2\xc1\x70\xb8\xfe\x70\x3a\xfe\x5e\xcb\xfd\x26\x1c\xc7" - "\x76\x9d\xff\xdb\x41\x3c\xaf\x6d\x04\xbb\xbd\x04\x58\x32\x11\x72" - "\xab\x0f\x09\x68\x4d\xe2\xea\x56\xd4\xba\x7e\x86\xec\xb8\x81\x10" - "\x2c\x27\xe8\xa8\xb4\x2d\xe5\x7d\x1f\xe0\xfe\xf9\x58\x56\xe0\xeb" - "\x83\xec\xff\x86\x12\x2c\x33\xf0\x19\x5f\xbe\xf7\x5f\xe3\x6d\x7f" - "\x10\xeb\x88\xfa\xbc\x83\x72\x1f\x9c\xfb\x70\x3c\x96\xdd\x5c\xef" - "\xf7\x97\x88\x75\xcc\xd5\x1b\xec\x80\xf6\x42\xbb\x88\xf2\x44\xec" - "\x67\x42\x5e\x45\xf4\x37\xc5\x06\xea\x3a\x73\x24\x5b\x81\xf2\x66" - "\xd9\x0f\x76\xe0\xb9\x78\xb8\xf7\xa4\x48\xf0\xe9\xd0\x2e\x70\xcf" - "\x12\xc8\xb7\x08\xf7\x18\x85\x3c\x4a\x51\xa7\x20\x77\x0e\xf1\x08" - "\xbf\x2b\xf8\x7b\xe0\xfe\x76\x13\xe0\x98\x66\x6e\xff\x1f\x9c\x96" - "\xe2\xeb\x03\xcb\xf6\x8f\xf6\xce\x34\x25\x04\x13\x0e\x0f\x51\x44" - "\x75\x9e\xf9\xe0\x15\xde\x77\xf0\xb6\xfe\xa0\xf2\x38\xb4\x17\x51" - "\x1e\xf3\x2d\x6c\x5d\xca\xe1\x71\xed\x2c\x19\xd6\x19\xae\x2d\xe5" - "\xf3\xe1\xea\xcc\xe1\x29\x89\xc3\x40\x05\xbb\x16\xea\xd9\x85\x83" - "\xf7\x4b\x78\x3b\x57\x58\xe8\x84\x2f\xfb\x01\x03\xee\x2d\x87\x9c" - "\xd4\x96\x44\xee\x6f\xeb\x34\xf3\x12\xda\xde\xc4\xd9\xfe\x83\xd0" - "\x5c\xea\x6f\x79\xde\xfa\x80\x9e\x1f\x29\xc1\x30\x96\x25\x8d\xc3" - "\x2f\x96\x25\x61\x11\x96\xa5\x94\x2b\x47\x82\x8a\x9c\x67\x3e\xe4" - "\x38\x0d\xae\xcd\xe4\xdb\x2b\x9f\xd7\xfb\xcb\x30\xaf\x57\x81\xab" - "\xb0\x4c\x3a\xe6\x80\x9e\xe3\xbf\x07\x39\x1c\x2c\xe7\xcb\x5e\xde" - "\x9e\x84\xd7\xbe\x17\x7a\x99\xe1\xae\x2d\x07\xb9\x8a\x76\xba\xff" - "\xcc\x50\xb8\xbe\x10\xd7\xfc\x3f\xc3\x7c\x5c\x86\x1c\x8d\xf3\x4d" - "\xf0\x7d\x1f\xbe\x1b\x0a\x9c\x22\x87\xfc\x3c\x10\xa3\x02\x2e\x9a" - "\x98\x8f\xb3\x71\x6d\x7c\xd0\x75\x11\xc4\x48\x85\xa8\x6f\xc4\x32" - "\xc4\x48\x81\x6d\x29\x1f\x56\x08\xb8\x85\xfb\x64\xa1\xee\xa9\x7d" - "\x4a\x87\x03\x8e\x4b\xcd\xd8\x2a\x1d\xce\xeb\xb1\x10\xf4\xe8\x01" - "\xf7\x7b\x93\xaf\x57\x21\xc8\x43\x2c\xf6\xf1\x46\xbe\xec\xfc\xfe" - "\xa5\xa5\x13\x05\x3b\xf0\x6d\xb5\x22\x1d\xf9\x97\xb3\x41\x69\x19" - "\x7f\xed\x6e\xfe\x5e\x27\x04\x59\x8c\x11\xe9\xbe\x52\xa5\x27\x90" - "\x07\x27\x81\xed\x39\xee\xe3\xf6\xdf\xa5\x69\xd8\x76\xe8\x3d\x3e" - "\xe6\xf6\xa3\x78\x15\xe2\x1e\x33\x8e\x4a\xb3\x2c\xf8\x09\xb9\x38" - "\xb3\x0a\xf2\x40\x3e\x45\x2c\x21\xa7\x62\x1f\x06\xf2\x8b\xe6\xdb" - "\x0f\x5f\xe6\x43\x43\xa4\x58\xf9\x78\x21\x60\x65\xa2\x28\xef\x76" - "\x6b\x7e\x2e\x97\x72\x60\x16\xbd\xe6\xd0\xc3\x7c\xdd\x8a\x68\xdd" - "\xf8\xdf\xa8\xb7\x78\x4e\x6f\x0a\x91\x1e\x41\x6f\x1f\xbd\xc2\xcb" - "\x97\x22\x97\x9b\xdb\xeb\xa1\xf7\x85\xb6\xdc\x9d\x2f\x3e\x5a\x81" - "\xed\xc1\x5c\xae\x43\x99\x16\x7c\x51\x6a\x9d\x2f\x0e\x2d\xe1\xeb" - "\x9b\x67\xd1\x36\x76\xf3\xf1\xee\x06\xc1\x0e\x55\xd0\x47\xa3\x7b" - "\x28\xed\xdf\x80\xfc\x89\xf7\x16\xfb\xa0\x1c\xaa\x57\xbe\x2d\x7f" - "\xb4\xa0\xbb\x1d\x3e\xf2\x17\xb7\x67\xb4\x35\x72\x02\xe6\x81\x36" - "\xe5\xe2\x4a\x48\xa3\x76\x3d\x64\x40\x6e\x10\x73\x34\xc8\x6e\x35" - "\xb1\xd8\x5e\x3e\x52\x4b\xdb\xe2\xa1\xad\x7c\x5b\x14\xee\x7d\x19" - "\x6c\x14\x20\xba\x6f\x96\xc5\x7d\xd1\x36\x65\xa8\x07\x5a\xc7\x8f" - "\xbe\x17\x7c\x1a\xca\xc3\xb5\xb1\x70\x4d\xb5\x85\x7f\xcc\xc4\xf2" - "\xc1\xbd\x82\x39\xce\xda\xc6\x71\x45\x6c\x1b\x2d\x4f\x4d\x2e\xef" - "\x27\x20\x2d\x80\x4f\xcb\xe3\x7d\x89\x80\x9b\x99\xd2\x32\x7d\x1c" - "\x60\x3d\x3e\x3a\x14\x2c\xc4\x47\x5c\x5e\x1c\x17\x7d\x1c\xc8\xd7" - "\x0f\xd3\x26\xd2\xb4\x52\x03\xa6\xa5\x53\x3d\x6c\x65\x39\x7f\x55" - "\x9a\xc7\xfb\x2b\x6c\x5f\x0c\xfc\x56\x62\x1b\xc3\xdf\x90\x47\x32" - "\xe6\xaf\x4d\xec\x40\x9f\xb6\x5d\xc7\x7c\x58\x84\x7c\x80\x7c\x81" - "\xcf\xb0\x72\x9f\x73\xb8\xcf\x2f\x91\x77\x30\x0e\xc1\xf3\x20\x97" - "\x85\x5c\x04\xe9\x3f\xe2\x5e\xad\xec\x4f\x1e\x90\xef\xc7\x15\xfc" - "\xb5\x46\x2e\x56\xf8\x29\x78\x80\x90\x26\x5c\x07\xbc\xb5\x0f\xaf" - "\xc3\xeb\x05\xfe\x42\xee\x32\x20\x37\x71\xf7\x3b\xfc\x00\x8f\x71" - "\xae\xdf\x20\xc4\x45\x9d\x8c\x48\x16\xf7\x9e\xe1\x38\xed\x70\x2a" - "\xe5\xb3\xc3\x1b\xf0\x5a\xce\x7e\xc0\x95\xf1\x97\xd9\x6f\x73\xa3" - "\x88\x3c\xa7\x19\x79\x71\x7f\x1c\x2d\xe7\xe1\x5a\x5a\x8f\xc3\xef" - "\x72\xf5\xa0\x9c\x9a\x49\xcb\xb2\x3f\x2e\xa7\x83\x3b\x77\x04\xeb" - "\x82\xe7\x32\x44\xe7\xd8\x4e\x35\x9e\xe3\xf6\x58\xb6\xbc\xce\xd4" - "\x19\xd6\x4d\x1e\xf7\x1e\x06\x0e\xf5\xc8\xd9\x26\x70\xef\x91\x50" - "\x5a\xce\x23\x37\x08\xbc\x0b\x7a\xd9\x8d\xdc\xcb\x9d\x7b\x9e\x97" - "\x99\xc3\x7f\x72\xfc\x7e\x64\x26\xd5\xab\x2f\xc3\xeb\xbb\x88\xd6" - "\xe3\xc8\x42\xae\x9f\xfd\x53\x28\xe8\xf6\xc8\x34\x41\xb7\xe2\xef" - "\xd8\x7e\xe0\xfe\x68\x63\xca\x2b\x71\x5c\x1f\x36\x0b\x65\xb0\x4c" - "\xd4\x47\x1c\x0e\xb4\x8c\xa9\xcf\x30\x47\x3f\x47\xbf\x44\x63\xd5" - "\xa3\x07\xf8\x71\x21\xa2\x89\xfa\x33\xf8\x85\x23\x06\x81\x63\xd8" - "\xb6\x60\xe8\xf3\xd7\x63\x19\xb9\xbd\x94\x70\x3f\x11\xb1\x0c\xf2" - "\xd3\xfe\x0e\x1d\x9f\xe7\x91\x5a\x81\x37\x90\x4b\xaa\x5a\xeb\xf9" - "\x98\xee\x93\xe4\x1c\x9e\x4b\xce\x33\x9f\x6c\x91\xc6\x61\x9f\x6c" - "\x91\x72\xc6\xd1\x6c\x4b\xce\x80\xb8\x79\x53\x5b\xca\x27\x8b\x24" - "\x71\x00\xa4\xf5\xcc\x1d\x9f\x04\x60\x1b\xc5\xfd\xe4\x38\x7e\xe2" - "\xc6\xba\x3e\xf9\x59\x28\x33\xf2\x66\xcb\x7a\x61\xfc\xe2\x68\x1a" - "\xc6\x6a\x16\xf7\xab\x90\x70\x27\xde\x4f\xc8\x4f\x4e\x70\x3f\x32" - "\xd0\x03\x8e\xb7\x7c\x92\xc5\xf3\x7c\x9e\x84\x2b\x79\x1f\x86\x3c" - "\x29\xf5\x55\xfb\x37\x48\x7d\xd5\xd1\x57\xba\x73\xe4\xd1\x60\xfb" - "\x7d\xd5\x51\x15\xf2\x96\xc0\x91\x52\x2e\x38\x3a\x2b\x47\x12\xcb" - "\x7e\x52\x23\xc4\xb2\x66\x1e\xfd\x64\x19\x72\x14\xdc\xbf\x94\xbf" - "\x37\xc4\x1e\xfb\xca\x85\x7b\x03\x8e\x0c\x55\x2a\xc0\x66\xca\xfe" - "\x00\xf8\x5e\xc8\xc7\x80\x5c\xdb\xec\xe0\xf6\x2e\x3a\xac\x07\xfc" - "\x0d\x45\x9c\x69\x56\x35\x93\x06\xb3\xaf\x28\x6b\x89\x10\xf4\xab" - "\x59\x20\x8e\x0b\xb3\xb7\xb1\xc9\x6d\x29\x9a\x09\xe2\x3a\xa6\x41" - "\x5a\x06\x3f\x86\xc0\xe9\x96\xcb\x4b\xc3\xf5\x17\xc4\x75\xa3\xf5" - "\xd0\x04\x62\x3d\xb0\x4f\x04\xf7\x6f\xc5\xb8\x07\x62\x3e\xf8\xfe" - "\x61\x6c\x6e\x17\xe6\x0f\x54\x5c\x4e\x12\xc7\x57\xfb\x6b\x90\x2b" - "\xf9\xbe\x67\x39\xc4\x3b\x99\xe2\xb1\x98\xd9\x7f\x9c\xab\x8a\x8c" - "\x5a\xb1\x2a\xfa\xf9\xbb\x54\x2b\x56\xad\x88\x5e\xb1\x34\x7c\xc5" - "\xba\xa5\xd1\x2b\x22\x56\x4d\x58\xb9\xf4\x85\x15\xcf\xa9\xd6\x2e" - "\x5d\xad\x0a\x88\x1d\x17\x3b\x94\x98\x45\xef\x55\x2d\x5d\xbd\x7a" - "\xcd\xca\xe5\xcb\x54\xab\x56\x3c\x37\x31\x6a\xf9\xea\xe5\xd1\xaa" - "\xa5\x51\x11\x6b\x56\x2d\x53\x8d\x5b\x76\xc7\xb8\x80\xc9\xcb\x86" - "\x8a\xc7\xd0\x6e\x51\x92\x26\xd3\xa5\xc6\xc6\x8c\x4b\xc4\xc3\x5b" - "\x16\x19\xe5\x1d\xbb\x62\x15\x1d\xb3\x3b\x96\x3d\x69\x2b\x89\x84" - "\xf3\x9e\xb8\x37\x32\x9b\xa2\x29\x81\x4f\x39\xca\x41\x3d\x55\xf0" - "\xdd\x03\xca\xee\xd7\x96\x72\x6c\x89\x8e\x39\xc1\x8d\x37\x82\x2e" - "\x54\x50\x37\x3f\xf6\x52\x79\x23\xc4\x6c\x91\x38\xb7\x9e\x7b\x89" - "\xf8\x64\xc6\x10\x39\x1c\x9e\x70\x28\x19\x25\x8e\x75\x1d\xdb\xaa" - "\x63\x3e\x2d\xa1\xe3\x9e\x9f\x06\xea\x87\xd4\x1f\x64\x93\xeb\x0f" - "\x52\xbb\x7c\x7a\xa7\x30\x0e\x1d\xf2\x1a\x09\x41\x7c\xd6\x33\x9f" - "\x72\x73\xba\xaf\x02\x96\x71\x0c\xb7\xe5\x93\xe9\x41\x10\x0f\xd6" - "\xe1\x18\x2c\x9c\xbb\xb3\x95\x21\x9e\x50\x2e\xf9\xf1\xb8\x00\xf2" - "\x36\xdc\x6b\xb5\x2f\xcb\xc2\x3d\xda\x85\xf1\x34\xa8\x83\x12\xea" - "\x52\xcb\xd7\xe3\xdf\x5c\x3d\xb6\xb1\xfe\x5b\x47\x40\xf9\xde\xc2" - "\xf2\x7c\xea\x2f\xd4\x01\xca\x5d\xab\x63\x8e\x25\x43\x39\x95\x58" - "\x2e\x6b\x63\x7d\x38\xde\x05\xe5\x5c\x69\x8a\x01\xbd\x8d\xa5\xfb" - "\xe1\x65\xe4\xd0\xf6\x07\xf5\xd9\x9d\x0b\xdf\xd3\x9b\x89\x67\x1a" - "\xee\x5b\x9e\x74\x13\x5b\xd9\x6a\x20\xda\xb0\x5a\xe2\xfd\x0a\xab" - "\x67\x3f\x68\x6c\xe4\xeb\xb4\x1d\xb9\xe1\x6f\x2f\xd6\xca\xb1\x4e" - "\xe0\x2b\x3c\x73\x9b\x6d\x8e\x2d\xca\xdf\x1e\xc9\xb6\xb2\xbb\xc4" - "\x31\xd7\x71\x6e\x3f\x67\x8c\xb7\x5a\x92\x70\xff\xeb\x4f\x1b\xe1" - "\xde\x41\x7c\x6c\xdc\xca\x76\x2e\x12\xc5\x52\x9f\x22\xce\x5a\x6d" - "\xe4\xed\x21\xe4\x8d\x7b\xa4\xe3\x35\xd4\xfe\xc7\x57\xc2\x35\x7a" - "\x73\xfe\xc7\x83\x2d\xf3\xc7\x3c\xe1\xbb\x5e\xb8\x0f\xed\x87\x1f" - "\xc7\x98\x40\x0f\x58\xd6\xdb\xb8\x9f\xff\x5b\xdb\xd8\x1a\x2d\xa4" - "\x67\x5c\x26\x72\x90\x85\x18\x85\xcb\xbf\x10\xf4\xee\x89\xf9\xbf" - "\x3a\x92\x90\x4d\x20\xd3\x92\xf2\x69\x50\x2b\xb7\x5f\xf9\x71\x68" - "\xff\xfb\xa7\x58\x8e\x63\xf3\x78\xbe\xd7\x02\xcf\x41\x6f\x61\x4c" - "\xb8\x15\xf2\x07\x0c\x65\x5c\x04\x3f\x0c\xbf\xef\xd8\x4a\xd4\x78" - "\x1f\xf8\x5e\x8d\xe3\x21\x6d\x29\x65\xbe\xc2\xfd\x58\xc0\x7f\xba" - "\x89\x8e\xc1\xf0\xd8\x9a\x80\x63\xd7\x09\xb1\x2c\x7b\x1c\xf8\x1d" - "\xcb\x88\x18\x83\x6b\x66\x09\x98\x02\xac\xd7\x70\xb8\xf2\x21\x6a" - "\x36\xe5\x78\x75\xee\x08\x90\x03\x5c\xe5\x00\x9e\x10\x57\x20\x1b" - "\x2b\x60\x0a\xb0\x56\x8d\x72\x50\x86\xa1\x25\xeb\x82\xe4\xc8\x91" - "\x0d\x4c\xd9\x39\xc4\x18\xfb\x3f\x8f\xd6\xb2\x37\x3e\x55\x4b\xed" - "\x54\x76\x4e\xdb\x4e\x6d\x60\xd6\x7b\x99\x46\xa4\xf7\x6a\xc0\xf1" - "\x50\xd4\x33\x1d\xab\x2e\x3b\x07\x65\xab\xe6\x62\xf1\x0d\x60\x03" - "\xce\x57\x95\x15\xe1\xf5\xbc\x0e\x2b\xcc\x3a\x3c\xe1\x61\x4d\x87" - "\x16\xba\x93\xd3\x3d\xd1\x4f\xf8\x60\x5b\x81\x6b\xa6\x09\xfb\x9c" - "\x5b\xb3\x25\xdc\x43\x2e\xdf\x4a\x3c\xf0\x1e\x65\x3e\x9c\x7c\xb8" - "\xb5\x7b\x58\xe2\xb8\x2c\x8f\x10\x1c\x0b\xc7\xeb\xfc\x7d\x50\xaf" - "\x27\x76\x5b\xb5\xef\x73\x92\xb2\x71\x07\x94\xad\xe4\xed\x11\x80" - "\x1b\x5a\xbe\xba\x9e\xca\xe7\xaf\xa2\x7e\x51\x73\x0b\xe2\xf9\xef" - "\x37\x68\xb7\x13\x82\x69\xfc\x6f\x79\x0b\xf8\x1a\xcb\xf1\x7c\xdb" - "\xf3\x0b\x7f\x5f\x20\x9d\x5f\xf8\xfb\x0c\x5b\xf3\x0b\x16\xf7\x7d" - "\x13\xef\x6b\xca\x9d\x2f\x13\xdd\x3b\xce\x64\xe5\xde\xc2\xf5\x77" - "\xe4\x89\xfb\x2f\x7f\xff\x16\xcb\x50\x05\xde\x86\xfd\xf5\x7c\x19" - "\x0b\xf9\x94\x71\x3e\xfb\xef\x3a\x1a\xaf\x60\x1c\xf4\x77\x0d\xca" - "\x58\xd6\xa3\xeb\xcf\xc3\xe7\x18\x7e\x5c\xe6\x7e\x0c\x7c\x90\x28" - "\xf1\x73\x74\x9e\x70\x9a\x91\x08\x13\xd6\xca\x0f\x4f\x42\x7e\xcd" - "\xc9\xb3\xf0\x47\x93\xf8\xdf\x7a\xee\x87\xbc\x4b\xbe\xeb\xbc\x0b" - "\x7f\x43\x68\x79\xb9\xfc\xda\x89\x8c\xbf\x9f\x46\x24\x31\xa3\x87" - "\xab\x59\x22\x5c\x62\xed\xef\x65\x38\x12\xe7\x0f\x84\xfc\x74\x9c" - "\x30\xcb\x1a\xf8\xfc\x85\xdf\xac\xf8\x37\xa6\x48\x7f\xc3\xdf\x80" - "\x45\xa2\x1b\xdc\x34\x60\x19\xf7\x58\xd4\x58\x43\x57\x12\x93\xa7" - "\x94\xde\x34\x71\x20\xf7\xe1\x8d\xff\xc4\x42\x7e\x6a\x38\xef\x67" - "\x3e\x3d\xa0\x75\xa3\x48\xf8\x14\x2d\xfe\x98\x29\xb6\x2b\xe1\xf0" - "\xdf\x58\xd1\xf7\x9b\xe8\x87\x5f\xbb\x55\xc9\x2b\xf1\xa7\xaa\x1e" - "\x22\x7c\x35\xc3\x63\x4c\x9c\x35\x51\xb3\xfe\xc7\xd4\x09\x49\x62" - "\x7b\x9a\xcf\xdf\x1c\x2a\xfd\x7d\xab\x52\xfa\x7b\x5c\xb0\x3b\x8a" - "\xae\xc1\x7f\x12\x74\xc3\x81\x39\x7c\xba\x12\xbd\x2d\x9a\x8c\x77" - "\xa6\x45\x13\x32\xff\xf1\xa5\x19\x00\xe5\xc9\x12\x25\xcb\xad\x4b" - "\x5f\x99\xbf\xd1\x1b\x79\x05\xde\xa4\x57\x76\x3b\x69\x99\x86\xbf" - "\x07\xa9\xf8\xb4\x3b\x8f\x75\x93\xe7\xd2\x54\xa2\xdf\xb2\x20\xf8" - "\x27\x0f\x2e\x4c\x76\x47\x59\xfb\xff\x7e\x81\x7f\x32\x6c\x1f\xfd" - "\x7f\x57\xe8\x8f\xa5\x5e\x1c\x98\x88\xfb\xc0\xff\xd8\x2e\xa2\x64" - "\xf9\x13\x2c\x9f\xc0\xf2\x5f\xdc\xe2\xc7\xfb\xff\xfa\xff\xfa\xff" - "\xfa\xff\xfa\xff\xfa\xff\xfa\xff\xfe\x0b\xfe\x64\xe2\x8e\xb5\x07" - "\x1c\x83\xf9\x4f\x71\xff\x47\xc6\x1f\xe2\x34\xc6\x95\xeb\x58\xfe" - "\x8f\x24\x06\x69\x54\x79\x4b\x74\xca\xcc\xb9\xd5\x01\x25\x91\x7a" - "\x8f\xe4\xe0\x72\x75\x61\x58\xa3\xef\xf6\xd0\xda\x29\xa5\xb1\xed" - "\xf2\x4d\x33\xca\xfc\x77\x2f\x6b\xf0\xd9\x3a\xbf\x26\xf0\x60\x74" - "\xab\x67\xea\xac\x8a\x09\x45\xe1\x4d\x7e\x59\x8b\xea\xa6\x1d\x8e" - "\x33\x30\x49\xd3\x3f\xbd\xe5\xcf\xcf\xd6\x8f\x78\xeb\xb1\x2f\xee" - "\x7a\x2f\xaa\x79\x68\xca\x23\x27\x6f\xff\xcb\x8b\x67\x47\xef\x7c" - "\xf2\xeb\x7b\x3f\x5a\xd7\x31\x68\xf3\x83\x7f\xbf\x2d\xff\xf9\x33" - "\x23\xb7\xfd\xe9\xff\x26\x7f\x10\x73\xc9\x2b\x7d\x4e\xd5\x1d\xc5" - "\xab\xce\x8f\xcd\x79\xe6\x3f\xf7\x7f\x12\x6f\x92\x6d\x7c\xe0\xd8" - "\xcd\xef\x2e\xfd\x76\xf8\x9b\xf3\x3e\xbf\xf3\xc0\xcb\x3f\x0f\xd9" - "\xf2\xf0\x67\xe3\xf7\xae\xf8\x71\xd4\x8e\x85\x5f\x4d\x3d\xf4\xca" - "\xe5\x81\xaf\xcd\x3c\x31\x6e\xcf\xf2\xef\x6f\x78\x67\xc1\x97\xf7" - "\xbc\xbf\xe6\xa2\x22\x6d\x76\xe5\xc4\x7d\x2b\xcf\x8d\xc9\x7e\xfa" - "\xf4\x7d\x47\x36\x18\x07\xbc\xfa\xc7\xe3\xb7\xfe\xef\x73\xdf\xfd" - "\xea\xed\xc7\xff\x79\xf7\xdf\x56\xb7\x0c\x7b\xe3\xd1\x53\xbf\xfd" - "\xeb\x4b\x3f\xfd\x7a\xd7\x53\xff\xfe\xfd\xc7\xeb\x3b\x07\xbf\xfe" - "\xd0\x3f\x7e\x53\xf0\xc2\x0f\x37\xfe\xcf\x13\xff\xfa\xdd\x87\x6b" - "\xdb\xbc\x33\x42\xb4\x93\xf6\x47\x5c\xb8\x29\x77\xf1\x37\x7f\x38" - "\x9a\xc0\xba\xa2\x3f\xc2\x7c\xff\x5d\x5f\xdb\x8d\x7e\x6c\x4c\x74" - "\xe6\x7a\x96\xb7\x3a\xfd\x99\x78\x0f\x91\x79\x90\x41\x72\xa7\xfa" - "\x09\xce\xd6\xd7\xc6\x9f\x4a\x7c\x7d\x6f\x7f\x38\x6f\x81\xf3\x19" - "\x77\xc3\xf1\x6b\x2e\xc5\xdc\xf3\x1f\x6b\xf5\x8a\xbe\xf8\x93\x41" - "\x3d\x07\x40\x49\x06\x92\x41\xa0\x19\x0f\x32\x84\x0c\x25\xc3\x88" - "\x27\x51\x10\x2f\xe2\x4d\x94\x64\x38\x19\x41\x7e\x45\x7c\xc8\x0d" - "\x64\x24\xb9\x91\xf8\x92\x51\x64\x34\x94\xde\x8f\x8c\xb1\x5e\xe6" - "\x44\x12\xe4\x0b\xff\xc0\xff\x73\x49\x10\xf7\x7b\x49\x7f\x7a\x9f" - "\xa6\x6b\xf8\xf4\x6a\x3e\x5d\xd7\x9f\xde\xa7\xe9\xaa\xab\xfc\x79" - "\xf3\x55\xfd\x94\x41\x58\x40\x23\x03\x49\x7c\xd0\xf5\x67\x99\x2a" - "\xe3\xff\xba\x7e\x93\x5e\xae\xef\x96\x9f\xf4\x7a\xcb\xbf\x20\x38" - "\x02\xe9\xd7\x04\x42\xe8\x5c\x02\x2b\xfe\x33\xd8\xba\x52\xf8\xdb" - "\x1e\x0b\xc7\x26\x38\x32\xe1\x78\x1b\x8e\x5c\x38\xf6\x0a\xf9\x10" - "\xa2\x6f\x27\xa4\x19\xb8\xfd\xe7\xad\xf0\x59\x41\x48\xcb\x12\x42" - "\x2e\xea\x08\x69\xcd\x23\xa4\x4d\x25\x2a\xb8\xa7\xb9\x44\x46\xfe" - "\xae\x70\x5a\xc6\x6c\x15\xdd\xcc\x51\xff\x54\x3a\x73\x7e\xb0\xea" - "\xce\x3b\x02\xef\x08\xbc\x5b\x35\x71\xee\x44\xd5\x5d\x01\x01\x53" - "\x27\x05\xdc\x33\xe9\xae\xc9\xaa\xbb\xee\xbe\xf7\x9e\xc9\xf7\xde" - "\x35\x45\xb5\xf2\x95\xa8\x15\x77\x06\xbc\xb0\x5c\xf5\xfc\x8a\xa8" - "\x95\x6b\x97\x46\x2d\xef\xad\xc6\x4e\xfd\x41\x55\xc8\x18\x23\x2d" - "\xa6\xd8\x1a\x32\x1c\x21\xd7\x06\x10\xa6\xbe\x94\x74\x9d\x91\x65" - "\xf2\x55\x51\xf3\x87\xf4\x4f\xb6\xbe\x90\xc8\x62\x33\x89\x6c\x75" - "\x39\x91\xad\xdc\x44\x64\xcb\xcb\x88\x6c\xd7\x14\x22\xdb\xee\x41" - "\x64\x6f\xab\x89\x2c\xb5\x82\xc8\x36\xb5\x76\x4f\xdb\xbd\x9d\xa6" - "\x1d\x83\x6b\x0f\xc3\xf1\x81\x2f\x91\x15\xcb\x69\x5a\x45\x3b\x91" - "\xfd\xa3\xe1\x8a\xd4\xdd\xf9\x3f\x47\xed\x2d\xfb\x7f\xef\xcc\x0b" - "\xc7" +static unsigned int ethp_z8e_uncompressed_length = 377100 ; +static unsigned int ethp_z8e_length = 116536 ; +static unsigned char ethp_z8e[116536 + 1] = + "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xb5\x37\xbc\x32\x19\x60\x12\x03" + "\x13\x31\xd2\x29\xa5\x3a\x5a\xb4\xd1\x0b\x12\x15\xdb\x68\x41\xa3" + "\x80\xc5\x36\xfc\x50\xd1\x46\x45\x03\x0a\x34\x68\xc4\x08\x01\x06" + "\x08\x99\x61\xc0\xeb\x24\x02\x49\x15\x31\x42\x20\xb1\xe2\x2d\xb7" + "\xa5\x8a\x35\x40\x6c\xa3\x8e\x25\xf4\xa5\x95\x64\x62\x5f\x7c\x9e" + "\xdc\xbe\x78\x3b\xf2\x44\x9a\xf2\x04\x18\xc9\x90\x19\x93\x99\xb3" + "\x9f\xef\xda\xfb\x9c\x64\x66\x98\xa0\xdc\xde\xcf\xf3\xfe\x53\x3e" + "\x9f\x30\xe7\xec\x1f\x6b\xaf\xbd\xf6\x5a\x6b\xaf\xbd\xf7\xda\xeb" + "\x10\xfd\x03\xff\x4c\x1f\xd5\xfc\x23\xd5\xff\xf9\xef\x9f\xff\xfe" + "\xf9\xef\x9f\xff\xfe\xf9\xef\x9f\xff\xfe\xf9\xef\xff\x9f\x7f\x67" + "\x4d\x66\xfa\x7d\x35\x51\xc8\x6d\xb1\xf9\xe9\x4b\xfb\x2b\x2f\x89" + "\x08\x92\x53\xfc\x64\xb1\xf1\xaf\xfe\x47\x2f\x22\xdd\x54\x4d\x96" + "\xab\x33\x29\x63\xca\x0e\xa2\x2d\xa3\x44\xd7\x4b\x5b\x45\x60\xfd" + "\x56\xd1\x35\xf5\x0d\xa2\xe6\xb1\x44\x2f\x8d\x12\x41\xc0\x99\xeb" + "\xa7\xc7\xb6\x30\x9c\xf5\x78\xe7\xfc\x0d\xa3\x44\x00\xe9\xa5\x7e" + "\x2a\xcc\xe0\xf4\x75\xa3\x00\x2b\x8b\xc8\xbd\x55\x84\x63\xe0\x5a" + "\xb8\x3e\xc3\x9c\x7a\x95\xc4\x67\x57\x02\x1c\x86\xd1\x08\x18\x1b" + "\x2e\x00\x23\xc3\xc0\x2b\x68\xa2\x14\x86\xd7\xed\x26\x5b\xd0\xed" + "\xbd\x1c\x75\x83\xe8\x53\x36\xd7\xad\x42\x19\xe1\xa6\xd4\x66\x47" + "\x84\xec\x57\x53\xca\x09\x4a\x7f\x0d\xbf\x26\xfc\xbe\xcc\xfd\x5d" + "\xaf\xea\x8d\x65\x18\xa8\x9b\x12\x72\xa7\xe5\xf4\xd7\x05\x6c\x7b" + "\x39\x99\x51\x76\x71\xd0\xe4\x35\xa9\xb2\x99\x69\x7a\x59\x13\xca" + "\xce\x35\xca\xaa\x3c\xd3\x3d\x7a\xde\x25\xc8\x73\xc4\xe7\x99\x5f" + "\xd4\xf3\x32\x90\xb7\x25\x01\x3f\xb3\xaf\x37\x42\x27\x28\x6d\x0f" + "\x70\xb1\x1f\xc4\xa8\x70\x1d\xbd\xfc\xa5\x28\xdf\x1c\x0f\x8b\x48" + "\xcf\x1b\x89\x3c\x7f\x7c\xde\xfb\x39\x7a\xde\x37\x90\x17\x89\xcf" + "\x4b\x31\xea\xd9\x42\xee\x74\x5b\x92\x7e\x72\xfb\x29\xaa\x6d\xee" + "\x43\xfa\x24\x94\x71\x71\x99\x39\x76\x17\xf1\x58\x71\xde\xc1\xfa" + "\xfe\xf6\xb9\xcc\x3c\x03\x8e\x1f\xf5\x63\x68\x0a\x5a\xa6\x97\x19" + "\xf5\xa7\xda\x19\x06\x49\x1a\x32\x1c\x3f\xa5\x4d\x67\x38\xfc\x8e" + "\xe7\x31\xdc\x6f\xfd\xd9\xce\xfd\x8b\x1d\x73\x22\x33\xc0\x0e\xb1" + "\x10\x0d\xc5\xdf\x30\x8b\xc1\x03\xcb\x6c\x42\x73\x7e\x93\xcc\xa2" + "\xb2\x61\x9e\xe6\x16\xe4\x73\x84\xc9\x3e\x9a\x9c\xc7\xe9\x12\x1b" + "\xf0\xa3\xcd\xab\xc9\xe2\x2c\x11\x61\x9f\xa3\x8b\x5a\x03\x5d\xe4" + "\x0c\x88\x4e\x5f\xe4\x1c\x95\x9f\x23\x8b\x2f\x72\x8a\xca\x9f\x25" + "\x5b\x73\xd9\xe7\x94\x8c\xbf\x34\x93\x20\xe7\x18\xae\xdb\x41\xad" + "\xb5\x1d\xe4\xac\x8d\xaf\xeb\xfc\x36\xd9\x5a\xf0\x8e\xb1\xb3\x32" + "\x1e\xcd\xf6\x08\x45\xd2\x1b\xe6\x95\xbd\x4a\x66\xe7\x55\x64\x6a" + "\x59\xe0\x35\x70\xf1\x33\x2e\x1b\x4e\x92\xe5\xf5\x45\xe0\xa1\x93" + "\x8c\x6f\xd3\xbc\xb7\x56\x87\x4d\x07\x6d\xf9\x74\xd0\x76\x8c\x9a" + "\x6d\x93\xa9\xd9\x31\x95\x36\x9f\xa4\x8c\x83\xe1\x49\xd4\x6c\xbe" + "\x1b\x32\x36\x95\x7c\x5d\x78\xb6\x47\x51\x26\x48\xf6\x15\x04\xfe" + "\xb8\xa4\x6d\xcb\x93\x64\xf1\x2b\x98\xa0\xef\x25\xc7\x3e\x2c\x25" + "\x62\xfa\xf2\x7b\xb2\x7e\x2c\xfb\x26\xd9\x80\x5f\x27\x70\xb9\xf5" + "\x38\x65\x5c\x3e\xd6\x46\x39\xc0\x79\x98\xaf\x26\x42\xe6\x32\x4a" + "\x1b\x44\xb6\xb2\x34\xb7\x94\xf1\xae\x9d\x5b\x45\x27\xf3\x68\xf7" + "\x9a\x02\xc8\x69\x46\x3e\xda\xee\xe2\xf6\x36\x43\xd6\x9d\xaf\x91" + "\xb9\x7b\x65\x41\x4a\xdd\x56\xd1\x81\xbc\x22\x23\x0f\xfc\xd4\x81" + "\xfc\xce\x09\x59\x94\xe9\x8b\xe4\xd1\x07\xbd\x9d\x66\x86\x31\x22" + "\x48\x29\x0c\xcf\xea\xa0\x54\xf4\x67\x08\xf0\xb9\xb5\x0e\xe9\xdf" + "\x41\x39\xd4\xdf\xed\xa7\x9f\xcd\xe3\xfa\xe2\x1b\x8f\x04\xb5\x6f" + "\x3c\x72\x4e\x7b\xe5\x91\x6e\xf1\xca\x23\x67\xa3\xaf\x3c\xf2\x85" + "\x73\x15\x59\xa2\xdf\x78\x24\xd0\x5a\x22\xc7\x20\xb3\xb5\x04\x63" + "\x10\x25\xcb\xda\x53\x94\xf9\xd8\xb3\x18\xfb\xc8\xa7\xb4\x76\x31" + "\xd9\xb4\xb4\xdf\xd9\x7c\x91\x4f\xe8\xb1\x32\x12\x78\xce\x4e\xd6" + "\xbf\xee\xf4\xa6\x7a\x25\x43\x16\xf4\x69\xb8\xdd\x6f\x7a\xa7\x80" + "\xdb\x0d\xa4\x35\xd7\xe3\x6f\x17\xfe\x76\xe3\x6f\x8f\x48\x6f\xda" + "\x03\x5a\x39\x47\xac\x4b\xa1\x9d\xbd\x44\x13\x34\x4a\x39\x49\xc3" + "\x27\x01\xff\xcc\x41\xe8\x36\x46\xab\xf4\x55\x7f\xd7\x45\xe5\xa1" + "\x50\x11\xb1\x6e\x62\xbd\xc4\x7a\x0a\xed\x78\xd0\x4e\x8d\x94\xc5" + "\xad\x22\x28\xd2\x7d\xd5\x48\xef\x0c\xae\x29\x4a\x09\xac\x29\x32" + "\x75\xa7\xfb\x5e\x42\x99\x3d\x28\xd3\xa6\xd3\xb0\x93\x61\x41\x26" + "\x02\xc3\x23\x94\x0a\x98\x25\x07\x7a\xda\xcd\x3b\xb6\x8a\x63\x28" + "\x77\xb4\x1f\x16\x60\x03\x0e\xe8\x3f\xbc\xd3\x48\x03\xad\x3b\x36" + "\xa1\x1c\xd7\xf7\x85\xf3\x58\x7f\xfb\x7d\xc5\x9d\x64\x8d\x50\xba" + "\xe8\x53\xed\xa1\x4c\x27\xeb\xd9\xe1\x61\x1a\x1a\x72\xd3\x6c\x86" + "\xcd\xf5\x7c\x5d\x9d\x84\x7a\x2f\x09\x67\x11\xf4\x1b\xcd\x0c\x89" + "\xa2\x14\xe8\xf4\x8e\x83\xa8\xaf\xda\x1e\x31\xdb\xc0\x91\xdb\xe0" + "\xb1\x96\x78\x82\x1f\x0e\x16\x87\x69\x78\x0d\xa5\xa2\xde\xfd\x0c" + "\x8f\x61\x81\x0f\xfc\xe8\xeb\x4b\x07\x8b\x03\xa4\x89\x38\x98\x7e" + "\x1d\x5e\x7d\x1c\x3c\xa4\x0b\xc0\x63\xfe\x6b\x46\x9d\xe1\xf5\x12" + "\xde\x7d\x07\x34\x86\x17\x26\xb3\x5d\xe2\xfb\x20\xc3\x08\xb1\x8e" + "\x01\x4c\xef\x8a\xbb\xa8\x8b\xac\x96\x80\xb3\x28\xb5\xb5\x8c\x88" + "\xeb\xbf\x55\xde\x39\x44\x74\x17\xa4\x32\xcf\x71\xbe\x2f\x72\x16" + "\x65\x46\xfc\x5d\x74\x17\xa5\x0e\xef\x22\x33\xe3\x8c\xfa\x0e\xc6" + "\x33\x76\x2c\xef\x9b\xf6\xe0\x64\x7a\x70\xea\x3d\x53\x27\xd3\x8c" + "\x3b\xa7\x4c\xa6\x9c\x5b\xc7\xe7\xdc\xfc\xfd\xdc\x9b\x69\xf6\x4f" + "\xee\x9b\x4c\xb3\x67\x4e\xa6\xfb\xf1\x37\xfb\xfe\x69\xf7\x4d\x9d" + "\x76\xff\x64\x2a\xb8\xfb\x1e\xbc\x4d\x99\x7c\x63\xce\x0f\xc7\xcf" + "\x9e\x72\xcf\x34\xba\x77\xce\x4d\x39\x37\xdd\x44\x77\x4e\xcb\xbf" + "\x31\x27\x47\xff\xbd\x31\x87\x8b\x3c\x9c\x3b\xed\xfe\xf1\xb3\x97" + "\x3e\x53\xfa\xcc\xf8\x99\xf7\x4c\x49\x98\x67\xb3\xa3\x3d\x1a\xd3" + "\x37\x28\xce\x4c\x27\x0d\xfa\x62\x27\xc6\x1d\x7f\x5d\xde\xf2\xe3" + "\x90\xfb\xcc\x8f\x77\xf2\x78\x49\xbd\x6a\xe5\xb9\xca\x1c\x72\x5b" + "\xdb\xfd\xa6\x86\x4c\xa6\x1b\xe6\x33\x94\xb9\xfc\x1c\xf2\xae\xd3" + "\xe7\x8d\x21\xc8\x0f\xc7\xe7\x5f\x7a\x04\xf9\x13\x5a\xed\x44\x3e" + "\xfc\x81\xd6\x41\xe8\x3f\xd0\x34\x40\xdd\xce\x82\x21\xe0\xe9\x14" + "\xb4\xd1\x01\x79\x6c\x0b\xb9\x33\x27\xc6\xc8\x79\x07\xc6\xa4\xcd" + "\xbe\x9a\x52\x4f\x53\xe6\xf0\xd6\xd2\x3c\xe2\xb1\xf1\x95\xea\x30" + "\xce\xf5\xc3\x48\x97\x30\x30\xde\x80\x73\x54\x87\x53\x16\xa3\x13" + "\xfc\x0c\x67\x33\xf2\x74\x58\xf7\xb6\x42\x37\x40\x77\x3f\xa9\x39" + "\xb3\x49\xa4\x37\x14\x69\x7d\xd9\x72\x3e\x40\xbd\x06\x83\x97\x51" + "\x3e\xd8\x5c\x82\x72\xaf\x4f\x4f\xc1\xd8\xa7\x60\x9e\x42\x5f\xac" + "\x5e\xf0\x74\x50\xab\x6c\xde\x2b\x42\x05\xa4\xd2\x2e\x05\x0c\xbc" + "\x57\x36\xbf\x2d\x9c\x48\x5b\x2d\xd3\x52\x38\x0d\xe3\x9c\xca\xf2" + "\x28\xd6\xc8\xf4\x54\xa4\x2f\x07\x7e\xed\x51\xae\x7f\x46\xd6\x1f" + "\x86\xb4\x07\x50\xf6\x6d\x2d\xbd\xf9\x37\xe0\x1b\x4e\x83\x8d\x30" + "\x2a\x0b\xf0\xde\xd1\x44\x01\x89\x8c\x4c\x0f\x9e\x1b\xbc\xab\xbb" + "\xe8\x44\x09\x99\xfc\xc8\xd3\x9c\x80\xd9\xd7\xdf\xfe\x58\xae\x8b" + "\xb6\xcc\xa1\xbe\x22\xcc\x6f\x97\x66\xf3\x5c\x18\x65\x7c\xce\xf4" + "\x97\xc9\xe2\x36\x59\xa6\x31\x16\x13\x31\x4e\x69\x21\xf7\xa5\xf5" + "\x09\xe3\xd4\x08\x38\x6f\x83\xee\xed\x80\x91\xa9\x75\x17\x71\xbf" + "\xde\x06\x5c\x93\x0e\xd7\x80\x11\x54\x7c\x70\xa9\x3f\x81\x0f\xfe" + "\x03\xb0\x27\x0f\xe4\x8f\xa4\x84\xfc\xf7\x90\x7f\x97\x9e\x0f\xd9" + "\x1a\x69\x8f\xcf\x1f\x39\x09\xf9\x77\xa3\xfd\x20\x64\x27\xd5\x4f" + "\x99\xbb\x76\xb2\xed\x37\x50\x7e\x76\x42\xf9\x62\x94\xff\x11\xc6" + "\x36\xc8\x7a\x9d\xcb\xd7\xe9\xbc\x8a\xf2\x16\x94\x77\x25\xb4\xbf" + "\x03\xe5\xef\x8f\xc1\x2f\xa1\xff\x97\x15\x21\xbf\x80\x79\x0b\xbf" + "\x0b\x50\x66\x18\xcb\x2b\xeb\x8a\x83\xc5\x6c\x2b\x8e\x6c\x4b\x68" + "\x9f\x69\xf9\x94\x66\xd0\xa8\x9b\x69\x94\xb9\x4b\xb7\x43\x8e\x29" + "\x1c\x2e\x33\x27\xb4\x31\x16\x75\x96\x81\x7f\xde\x36\x78\x23\x49" + "\x9d\xdc\x84\x3a\x05\x92\xb7\x54\x3b\xfa\x18\xab\x3a\xba\x1e\x8a" + "\x85\xc1\x7d\x83\x6d\x74\x59\x59\x42\xdf\x0b\xd0\xee\x9a\x4d\x4a" + "\xce\x2f\x01\x4f\xdc\x84\xb4\x7b\x00\x73\x1f\xf3\x11\xf3\xba\x2f" + "\x10\x86\x9e\x9c\x9e\xa1\xe6\xfb\xcb\x3e\xb5\x96\x11\x3f\x8f\xe7" + "\x67\x86\x2d\xfa\xf2\x75\x19\xb8\xec\x53\xfc\x72\x7a\x33\xa7\xb3" + "\xec\x89\xbe\x1f\x6b\x0a\x66\x56\x0a\x64\xd4\x84\xf7\xa8\xde\xc6" + "\x9d\x78\x4f\x01\xfe\xbf\x81\x0e\x06\xcf\x4e\x67\x7e\x9c\x88\xf4" + "\x5b\xf5\xfc\x1b\xb9\x3c\x9e\x6f\xd4\x9f\x99\x6f\x7f\xa3\xf3\x2d" + "\xe4\xe0\xf2\xeb\x64\xdb\x52\x16\x54\x7d\x4d\xf1\xfd\x14\xe4\x5d" + "\x8e\xdf\x7b\xf0\xcb\x78\xdd\x8b\xb6\x3f\x75\x9e\x23\x9b\x33\x0a" + "\x9b\x43\xbd\xff\x11\xbf\xf7\xe1\x77\x1f\x7e\xef\xc7\xef\x6b\x2c" + "\xb7\x81\x95\x45\x94\xc0\x33\x5d\x9a\x92\xd5\x61\x6a\x0c\xb3\xaa" + "\x75\xf9\x51\xf2\x7b\x66\x20\x4d\xa8\x34\x93\xa2\xb9\x9e\xd6\x37" + "\x9d\xdb\x9f\x0d\xf8\xc5\xdc\xbe\x2e\xf7\x43\xd4\x38\xa9\x32\x9a" + "\xaa\x67\x56\xe3\xad\xa7\xa9\x72\x29\xb1\x6d\xe2\x37\xaf\x3c\x28" + "\x04\x7e\xc7\x31\x5d\xfd\x74\x79\x0e\x68\x62\xc6\x3b\xeb\x3e\x93" + "\x2c\x2f\xe1\x5e\x56\x1b\x33\xde\xb0\xc5\x2f\x2f\x8e\x1f\xef\xcc" + "\x5d\x4c\x33\x1e\x6f\x03\x5f\xc6\x1d\xfc\xcc\x73\xda\x50\x83\x67" + "\xc0\xdb\x5d\xd0\x8f\xc1\xd4\x32\xe6\xbb\xcb\xf7\xfa\xe9\x97\xd5" + "\xd2\x0e\xaa\x6c\xde\xcf\xf9\x41\xe8\x19\xe6\x8d\xd4\x12\x96\x97" + "\xcb\xdb\x8c\x7c\x99\x97\xd6\x96\xc9\xf0\x53\x8b\x65\x5e\x97\x1f" + "\xec\x62\xe4\x31\x6e\x2c\xc7\xa9\xa5\x9c\x37\xca\x32\x00\xb7\xc1" + "\xa3\xc3\x4d\x65\xfb\x81\xed\x00\xcc\xc7\x9d\x28\x33\xce\x4f\xc3" + "\x0b\x06\x5b\x73\x09\x4f\x83\x63\x3c\x91\xe9\x7a\x17\x0d\xf1\x45" + "\x8e\xd2\xac\x88\x88\x8e\x77\x51\x9a\x2f\xb2\x87\xc0\x20\x97\xfa" + "\x22\xc7\xe8\x7a\xa2\xab\x7c\x91\x2d\x98\x6f\x77\x71\xfe\x07\xd9" + "\x94\x92\x82\x5f\xe7\xb5\x2e\x53\x8a\x2f\xb2\x81\xc6\xba\xcc\xf8" + "\x2d\xa6\xbb\x87\x88\x90\x2f\x92\x8f\x72\x0b\x68\x56\x54\x9c\x99" + "\x3a\x44\xfc\xb5\x30\x4a\x99\xf9\xcf\x09\xa7\x2f\x02\xdb\x37\x72" + "\x04\xe9\x9a\x98\x15\xfd\x12\x7f\x21\xa1\x79\x1a\x3c\xb3\xa2\x67" + "\xc4\x94\xe7\x3e\xc0\xfb\x5f\x85\x30\x91\xf0\x45\x26\x51\x6b\x30" + "\x88\x72\x4e\x21\x2a\x1a\x1c\x8f\x9d\x33\x51\x1f\xe6\x4e\xad\xa2" + "\x01\xba\xba\xa1\xa6\x0f\xfd\xc3\xbc\xf2\x4a\xdf\x1a\xfc\x56\x36" + "\x6c\x95\xef\x9e\x86\xdd\xc2\xd2\x50\x73\x03\x16\x12\xdc\x07\x5f" + "\xa4\x83\x0a\x61\x0a\xcf\x5a\x15\x10\x8c\xff\x88\x75\xbc\x8e\x98" + "\x44\xd0\x7d\xd6\x59\xab\x9c\x02\x79\x16\x91\xd6\x50\xe3\x8b\x74" + "\x11\xda\xd8\x0d\x78\x6f\x48\x78\x9e\x86\xc3\x28\x1b\xe0\x72\xb1" + "\x70\x18\x06\x97\x9d\x15\x25\x2b\xca\x1f\xee\x4b\x6b\x68\xc4\x5f" + "\x7b\x5f\xda\x3e\x8b\x48\xdf\x37\x5a\xb8\xb3\x3e\x14\x98\xe7\x84" + "\x67\x5f\x36\xde\x73\x43\xb0\xdb\x25\x2d\xa3\x34\x4c\x54\xec\xcb" + "\x06\x5f\x4c\x05\x6f\x01\xdf\x7d\x05\x12\xdf\xca\x7d\x3f\x09\xc9" + "\x7e\xec\x7b\x50\xf5\x63\xdf\x03\x9c\xde\x8d\x39\x1e\xcf\x8e\x6e" + "\x95\xb7\x12\xf5\xe6\xc8\x7a\x9e\x7d\x0e\x61\xd9\xe7\x09\x43\x66" + "\x40\x57\x17\xd3\x11\x74\x75\x31\x2d\x01\xdf\xe1\x73\x6c\x24\x91" + "\xb6\xcf\x03\x7c\x6a\x50\xff\x97\x7d\x72\xee\xdd\xd7\x18\x52\xb0" + "\x0f\x00\xce\x5c\xf0\x65\x2a\x60\x34\x02\xd6\xe1\x3e\xb7\x9d\x66" + "\xad\x12\xe1\x59\x91\x75\x91\xc2\x55\x94\x3a\x8e\x5c\xc0\xf7\x3d" + "\xd0\x68\x01\xfa\xd9\x8c\xdf\xa9\xc8\xa7\xcb\xd0\xd6\x07\x80\xdb" + "\xc8\xed\xa1\x9d\xc3\x80\x79\x08\xb0\x16\x30\x4e\x5f\xba\x29\x13" + "\xef\xed\x5f\x2a\xfc\xc2\x9a\x67\xbf\x4d\xb3\xec\xb7\x18\x3c\xc4" + "\xfc\xa3\xe8\xb6\x85\x66\x06\x45\xc4\x17\xd9\x41\xe0\xb1\xcc\xd6" + "\xe0\x31\xce\x87\xad\xbf\x07\xe3\xcc\x3c\xb5\x01\xbf\xbb\x88\xf9" + "\xa7\xb5\x64\x39\x97\xfd\x80\x79\x68\x66\x49\x70\xdd\x78\x2a\x49" + "\xc1\xbb\xb3\x30\x62\xa1\xc7\x4a\xcc\xae\xa8\x67\x5f\x67\x6b\x09" + "\x8f\xcb\x51\xd4\xe1\x7a\xc5\x64\x4d\x81\xbd\x9b\x22\x22\x56\x47" + "\xc0\x3c\xbc\xc8\x29\x5a\x83\xf9\x28\x5b\x42\xdc\x1f\xe6\x23\x2e" + "\x3f\xa3\x4b\xf8\xa3\x96\xfd\x35\xdc\x37\x31\xc2\x45\x2d\x5d\xb7" + "\x10\xaf\x39\x5a\xba\x76\x31\x9f\x6a\xc2\xb2\xbf\x08\x3c\xda\x37" + "\xa3\xcb\x35\xe4\xb1\x73\x94\x82\xb4\x68\x4b\xd1\x1e\xe4\x37\xa3" + "\xdc\x11\xc9\xb7\x33\xcf\x45\xac\x11\xcb\xbe\xf6\x88\x67\xbf\x63" + "\xe6\xb9\x3e\xd1\x52\xb4\x85\x1e\xed\x72\x81\x56\x7b\x68\xc6\xa9" + "\x48\x6a\x6b\xc9\x02\x94\x09\x21\x7d\x97\xe4\xff\x19\xa7\xba\xc5" + "\xcc\x67\xc5\x99\x99\xe7\xfe\x2a\x66\x14\x89\x0f\x0a\x1d\x34\xe2" + "\x92\x75\x42\x63\xb9\x38\xd2\xb1\x87\x2e\x39\xe6\x27\x96\x89\xfc" + "\xf9\x9a\x98\x71\xea\x8c\x78\xec\x59\xa6\xcd\x24\x6a\x29\x82\xfc" + "\x38\xb6\x30\xbd\xc3\x2d\x45\x4d\x68\x7f\x2a\xe0\x3a\x85\xcf\xb1" + "\x03\x65\xbd\xd6\x47\x4f\x65\xd2\x91\x8e\x2d\x14\x49\xdb\xd7\x1e" + "\xad\xd8\xd7\xa9\xa5\xed\xb7\x68\x15\xfb\x6d\x22\x6d\x7f\x51\xa4" + "\x62\xbf\x23\x9a\xb6\x1f\x3c\xb0\x1f\x72\x0f\x3b\x04\x63\xde\x8b" + "\x35\x38\xde\x4f\xf4\xf2\xf8\x7b\xf6\x87\x85\xe5\x80\x0d\xfa\x4e" + "\x28\xde\xdf\x2f\xd7\xd1\x22\xed\x80\xad\x2f\xed\x80\x45\x54\xe2" + "\x57\xf2\xde\x81\x6c\xe6\x4b\x39\xdf\x54\x1e\xf8\x2e\xe6\x87\x54" + "\xe4\xe7\xe2\x6f\x3a\xfe\x30\x67\x1e\xd8\x0d\xf8\x97\x4a\x9e\xf2" + "\x1c\xd8\x2d\x6e\xaf\x86\xed\x78\x8e\x79\xd2\x09\x58\x87\x67\x45" + "\x73\x9d\xa0\x23\x64\xe5\xc0\x6e\xad\xe2\x40\x23\xe0\x75\x86\x25" + "\xff\x1f\xf8\x1b\xc3\xef\x5b\x93\xcd\x6b\x6c\x33\xf2\xc3\xa2\xb2" + "\xf1\xc9\x10\xf3\xab\xa5\xb1\x48\xb3\x34\x1e\x16\x9e\x46\xc7\x8f" + "\x9f\x13\x81\xa8\xa7\xb1\x46\xf3\x34\x7a\x22\x43\x61\x97\x3a\x9a" + "\x88\x75\x54\xe4\x7d\x01\x3a\x1c\x02\x4d\x76\x49\x1e\xf0\x39\x20" + "\x07\xab\x46\xbb\x5a\xba\xc0\x0f\x25\xbf\x96\xfa\xa9\x35\x78\x54" + "\xd2\x55\xa4\x35\x16\x31\x5f\xf1\x18\x3f\x56\x42\x2e\x51\xd1\xe8" + "\xd0\x2a\x1a\x3d\xd1\x0a\xc0\x4d\x43\x3b\xe9\xbf\x4b\x0f\x4b\x99" + "\xfd\x1d\x78\xb6\x09\x75\x0e\x91\xe2\xf3\xdf\x59\x06\xd3\x93\xac" + "\xaf\x58\x47\xcd\x8a\x84\x99\x6f\xfe\xc6\xba\x4d\xe9\x2a\x2a\x34" + "\x74\x15\xeb\x29\xb6\xf5\x59\x57\x69\xba\xae\xd2\x74\x5d\x25\xdf" + "\x2d\xd0\x37\x9e\x86\x1a\xd6\x49\xb3\x1c\x4a\xd7\xcc\x8a\xe6\x08" + "\xf0\x47\x06\x60\xd4\xa8\xf1\x40\x99\xca\x86\x37\x64\x79\x49\xa7" + "\x86\xc3\x1a\x74\x0e\xfe\xda\x35\xa5\x73\x6c\xba\xce\x31\x19\x3a" + "\x27\x8a\xf9\x0b\x72\xa5\x25\xd3\x39\x9a\xae\x73\xa2\x42\xe9\x1c" + "\x4d\xd7\x39\x9c\x1e\xd5\x75\x4e\x34\x89\xce\xd1\x3c\xfb\xb8\xbf" + "\xa9\xba\xae\x71\xb1\xae\xe1\xfe\x6a\x15\xfb\x3c\x9a\xd2\x35\xbb" + "\x61\xe7\x9b\x58\xd7\x44\x51\x47\x33\x74\x4d\x48\xd6\x3f\xcc\xfa" + "\xa6\xef\x5f\x09\x3a\xd4\x4e\xac\x67\xa4\x4e\x89\x5c\x15\x61\x9d" + "\x02\xfa\xdd\x91\xa8\x53\x00\xaf\x1d\xcf\x99\x4a\x57\xed\xb7\x58" + "\xd7\x89\x88\x66\xd9\xd7\x39\xcb\x11\xc4\x58\x7f\x8a\xb5\x2e\x74" + "\xb7\xa3\xd4\xe5\x73\x44\x28\x0a\x7d\x23\x5a\x5d\x04\x1c\xc1\xc3" + "\x51\xe8\x0b\x22\xc8\x66\x51\x04\x72\x0e\x3e\x77\xb4\x96\x7c\x42" + "\x51\xc8\xeb\x8c\xae\x6e\xdf\x63\xc1\xec\xcc\x19\xa7\x44\x00\xf4" + "\xf1\x3f\x56\xe2\x82\x8e\xc9\x0e\xb4\x74\xbd\x47\xf9\x1d\x42\xcb" + "\x9f\xe7\xb7\x43\x0e\x1c\x33\x16\x7b\xad\x8f\x3d\x9b\x09\x59\x13" + "\x5e\xe8\xc6\xff\x77\xc6\xa9\x4c\xeb\xdc\x0e\xba\x22\x7f\xbe\xd0" + "\xa2\x90\x35\xf4\xb7\x13\xfd\x0e\x43\xce\x2c\x51\xc8\x1b\x64\xad" + "\x28\x92\x20\x6b\x22\x7d\xff\x09\x3c\xdb\x15\xfd\x0e\xd8\xd0\x87" + "\xb0\x26\xe7\xb4\x0e\xb9\xbe\x02\xbf\xdb\x78\xef\x09\x30\xc2\x90" + "\x0b\x29\x6f\x9a\x50\xf2\xa6\x31\xfd\x4c\xba\xbc\x61\x2c\x90\x9f" + "\x8b\xbf\xe9\xf8\x4b\x2e\x6f\x25\x09\xf2\xf6\xac\x2e\x6f\x69\x4a" + "\xde\x30\xae\xa9\xd1\x35\x4a\xe6\xb8\x0d\x5e\x87\xf5\xcb\x5c\x7a" + "\x63\x91\x60\xdb\x51\xf2\x8f\x94\x3b\xcc\x2f\x8d\x35\x90\x39\x0f" + "\x64\x0e\xf0\x44\x80\xf5\x27\xf8\xf3\x3f\x79\xce\x9b\x59\x22\xfe" + "\xb3\x30\x3a\xda\x05\x99\xaa\x81\x4e\xfb\x2b\xf4\xe9\x7f\x3e\x16" + "\xa4\x7a\xc8\x54\x11\x64\xc9\x01\x99\xf2\x40\xb6\x58\xa6\x2c\xd1" + "\x35\x0c\xf3\x77\x96\x7e\x18\x72\xce\x8c\x97\x29\xb5\x73\x9d\x7c" + "\xff\x2f\xe4\xbe\x02\x9a\x71\x7f\x13\xdb\x2b\x78\xee\xf4\xd3\x81" + "\x6a\xfd\x39\xe8\xa7\xed\x1b\xa5\xad\x03\x59\x2c\x29\xa7\xcb\x4f" + "\xd2\x95\xbb\xc1\xf7\x84\xe7\x0c\x3c\xef\x99\x75\xdd\x07\xb0\x29" + "\xfa\x98\xb7\x42\x2c\x8f\xc2\x3d\x11\x6b\x0b\xca\x03\x3f\x5a\x44" + "\x28\x3b\x43\xa4\x1f\xba\x5d\xf4\xd9\x78\x8f\xc9\x8a\xf7\x11\xa0" + "\xc1\x58\xfc\x8e\xdc\xd1\x43\x59\xf8\xb3\xed\x70\x6b\x2e\xb6\xaf" + "\xf0\x9c\x23\x56\xda\xd2\x37\xaf\xa0\x71\xd6\x20\x59\xea\xdc\x5a" + "\x81\x75\x5d\x26\xef\xb5\x64\xf1\xb3\x70\xd7\xed\xad\xeb\x21\x33" + "\xdb\x91\x5a\x1a\xda\x73\x58\x85\x58\x96\x4d\x75\x4b\xa1\x27\xdc" + "\x64\xab\x73\x8b\xbd\xd1\x10\xd3\xa1\xc1\x61\xe0\xc2\xb8\x01\xcf" + "\x6f\x03\xcf\xa6\x07\x56\xe5\xd1\x21\x07\x25\xdd\xa3\x0c\xb9\xaf" + "\xec\xef\xff\x20\xf9\x11\x83\x26\xc9\xf3\xed\x63\x0c\x3a\x0d\xb2" + "\x9f\x65\xe6\xf9\x3a\xba\x42\x04\xaa\x9e\x24\xa6\x85\xcd\x19\x11" + "\xff\x0b\x74\x74\x95\x47\xe9\xdb\xb3\x56\x5d\x29\x7c\x5d\xc2\xeb" + "\x73\x9c\xa2\x3a\xe4\x97\x97\x09\x4d\x4b\x3b\x04\x19\x39\x34\xa6" + "\x7b\x85\x88\xec\x90\x76\xaf\xdd\xe5\xa7\xdb\xec\x6a\x2c\xf6\x85" + "\xe5\xba\xce\x72\x68\x0c\x60\x5d\xca\xb0\x5a\x50\x3f\x5a\x71\x68" + "\x2c\xca\xed\xf6\x53\xb3\x3c\x33\x80\x2e\x08\x97\xac\xa6\x6f\x9d" + "\x24\xbb\x5f\xda\xf6\x9e\x43\x13\x59\x2f\x20\x2d\x13\x69\x5d\x80" + "\x9f\x8b\xf2\x58\x1f\xef\xf5\x2b\x5b\xd7\xde\x65\x94\xc3\xb3\x97" + "\x9f\xe3\x78\x48\x9e\x6a\x10\xc6\xcb\x3e\x70\x18\x92\xa2\xb3\x95" + "\xf1\x2f\x13\x7f\x79\xc9\xb3\x07\xf4\xfa\x7e\x07\xec\x2e\x72\xae" + "\xa5\x31\x18\x1f\xe0\x77\xd5\x7c\xa7\x43\x9c\x10\x6e\x7b\xf8\xf5" + "\xd5\x61\xac\x0b\xae\x2a\xf6\xd3\xf3\x1d\x83\xdb\xcf\xb0\x7b\x7a" + "\x44\x67\xd5\x8a\x7e\x5a\x7e\x36\x6b\x95\x26\xf8\x99\xf5\x52\x1d" + "\xd2\x99\x6e\x80\xd3\x60\xd0\x6c\xf0\x71\x39\x94\xa3\xd6\x81\x57" + "\x67\x09\xb7\x20\xef\x15\x7c\x7e\x70\xf5\xe5\x8a\x0e\x07\x2c\xdd" + "\xd0\x27\xbc\x3f\x5a\x07\x7a\x2f\xb3\x89\x70\xc8\x7d\x35\xec\xff" + "\xeb\xab\xf5\xbd\x98\xa0\x2f\x32\x8d\x75\x4c\xd2\xf9\x8b\xcf\x67" + "\x06\xe0\x7f\x67\x62\xeb\x18\xe8\x23\xa9\xa3\xda\xe6\x94\x2b\xbc" + "\xc3\x0c\xd7\x5b\x7e\x96\x3a\x90\xbf\x2c\x28\x3a\x85\xa7\x6d\x3a" + "\xaf\x35\xbc\x2b\x7a\x39\xed\x16\xf0\xb6\xf0\x2e\x65\x9c\xbe\x73" + "\x8b\xf7\x8a\x5e\x3a\x81\x75\x1e\xd6\x78\x01\xb5\x2f\xf3\x1d\xfb" + "\xc1\x52\xd2\xf7\x7a\xae\xae\xf7\xd3\xb8\x02\x03\x2f\xb6\x37\x40" + "\x5f\xa6\x55\x98\xed\x0e\xde\x73\x5f\x56\x26\xc2\x6c\x7f\xa0\xec" + "\x11\xa3\x0f\xdc\x3f\xbd\x5f\xfe\xd8\x7e\x01\x87\x00\xd6\xcc\x92" + "\x06\xcb\x56\x91\xc5\xae\x68\x6d\xe1\xfe\x72\x5f\xb8\xcf\xb2\x2f" + "\x52\xd7\x62\xae\x88\xdc\x82\x35\x98\x4c\xb7\x85\xdc\xdf\xc1\xfa" + "\xe7\xfa\xa0\xe2\xa9\xab\xeb\x13\xf9\xa8\x7f\x1c\x2d\xfb\x0e\x3b" + "\xbf\xa4\x2b\x9c\x9a\x38\x0e\x98\xef\x82\x4e\xa9\xfc\xab\xb1\xcd" + "\x1d\x66\xfe\xfd\x88\x78\x6e\xf6\x95\x9d\x63\x5b\x9b\xcb\x5e\x86" + "\xb2\x1d\x28\xf3\xef\x7a\xd9\x7f\x57\xe7\x2d\xf2\x77\x18\xff\x62" + "\x3e\x3b\x04\x3c\xbc\x01\x39\xef\xb7\x65\x1a\xef\x02\xef\xf8\x75" + "\x88\x8a\x8f\x92\xea\x00\xe8\xe2\xc3\x3c\xaf\x45\x7b\x44\x17\xda" + "\xf9\x06\xf3\x94\x73\x15\x7d\x13\x7c\xf9\x59\xf9\x5a\xba\x8c\xf9" + "\x49\xa4\x1d\x9a\xa4\xe8\x3e\x36\x43\xb8\x61\x87\x42\xab\x96\xac" + "\xa0\x6f\x41\x8e\x26\x9e\xa4\xb1\x57\x15\x96\xd9\x81\x2b\x51\xd5" + "\x69\x22\xa9\x83\xd2\x0e\xe5\xfa\x22\x9f\x53\xdd\x69\xde\x6f\x19" + "\x9b\x67\xf0\x22\x9e\xf3\x2f\xa4\x2f\x40\xd7\xe9\x6a\xbf\x60\xec" + "\xbb\xbc\xbf\x7e\x9c\xc6\xee\xe2\xfe\xe2\x2f\x05\x69\x2f\x8b\x1e" + "\x31\x57\xa8\xb9\x2d\xd7\x4f\x63\xdb\xf0\x3b\x5d\xfe\xb9\x69\x9e" + "\xfe\x9e\x8b\x72\x1b\x44\x8f\xc6\x65\xa6\x23\xad\x56\xb8\x53\x58" + "\x26\x9a\xd0\xf6\x61\x3f\x4d\xce\x55\x63\x33\x76\x0b\xc3\x1a\x04" + "\x87\x5c\x8c\x2d\x31\x6f\x9e\xa0\x6b\x6e\xb4\x97\xa7\x00\x8f\x6b" + "\x86\x48\xb9\x00\xac\x3a\x93\xd2\xdb\x1a\x70\xdd\xe9\xd6\x8a\xa0" + "\xa3\x8b\xb4\xca\x96\x22\xf9\xac\xe7\x09\x7d\x3e\x4d\x0e\xbf\x6d" + "\x8e\x77\x34\xf3\xf8\x35\x1b\x15\x9c\xb6\xe9\xde\xd1\x27\xf9\x7d" + "\x13\xbf\x07\x2d\xad\x45\xbe\x9a\x3c\xb4\x7f\x92\xdb\xdd\xa8\xf6" + "\x01\xae\xd9\xd4\x8d\x36\x42\xee\x6b\x36\xfa\x69\xfc\x02\x75\xd6" + "\xd0\x5a\x34\x88\xec\x65\xb2\xec\xb0\xcc\x29\x99\xfe\xee\x8c\x96" + "\x7a\x29\x7f\xd9\xdd\x96\x03\xd3\x75\xbd\xc1\x7b\x2b\x19\xc7\xe9" + "\xbb\xf9\x2d\x36\xc9\xdf\x26\x61\xba\xa6\xeb\x4d\x2d\x60\xe2\xf3" + "\x20\xa5\xbe\xbe\x9b\x7f\xfe\xdf\xb5\x50\x80\xd7\xe6\xe0\x6f\x92" + "\xfe\x3e\x1d\x7f\x73\xf1\xb7\x07\xef\x93\x24\xed\xb6\x2f\x48\xf1" + "\x23\xaf\x1b\xf6\x3b\xbf\xfb\xe9\xda\x6c\xb1\x7d\xac\x09\x6b\x01" + "\xf9\x5c\xf7\x4d\xde\x4b\xb8\x76\x0e\xc6\xe0\x98\x1a\x0b\x86\x43" + "\x29\xc0\x8d\xe9\x2e\x9c\x35\x22\xdc\x5c\x1e\x04\xde\xd7\x6e\x68" + "\xae\x09\x92\xfd\x5a\xee\xff\xb5\x1e\xee\x53\x10\xf4\xe7\xdf\x65" + "\x35\x22\x70\xb0\x36\x42\x7c\x2e\x05\x58\x90\xff\x9f\x4e\x55\xfb" + "\x12\x6d\x25\x0c\x4f\xe7\x09\x61\xf4\x5f\xe9\xb4\xd6\x22\x1e\x4b" + "\xc0\xfa\x04\x7d\xb7\x9e\xa6\xef\x5e\x2e\xd2\x5b\x8a\x0e\x16\x11" + "\xed\x80\x1e\xc1\x5c\x23\xf7\xcb\xa1\x97\x18\x26\xe6\xff\x6b\x26" + "\x19\xe7\x28\x9b\x90\xbf\x19\x79\x98\x7b\x02\x2d\x45\x61\x62\x58" + "\x51\xee\x1f\xea\xbf\xa7\x05\xcc\x98\xab\x31\xe6\xad\x45\xe5\x25" + "\xd0\x33\xfd\x7a\xeb\xda\xa6\xb5\xa7\x44\xd8\xe8\x1f\x9f\x55\x86" + "\xdc\xdf\x05\xff\x2f\x9e\x37\x28\xff\xf7\xe3\x9c\xbd\xf8\xe0\x58" + "\x35\x66\x1a\xe8\x12\x3f\x66\xd9\x45\x6a\xbc\xbe\x5b\x1b\x3f\x5e" + "\xd9\xe8\xc9\x77\x3b\xf0\x17\xc1\x73\x86\x7a\x8f\xfd\xfb\x6e\x5b" + "\xcc\x3b\xb8\x23\x7b\x0e\xf0\xc1\xfc\x3f\xb6\x40\x8d\x03\xa7\xa3" + "\x1f\xcc\x23\x5f\x90\x85\xf7\xe7\xf8\x9c\x92\xd3\x99\x9f\x39\x5d" + "\x83\x3d\x83\xfe\x04\x90\x9f\xc9\xb2\x5a\xa5\x51\x5c\xbe\x6f\x03" + "\x78\x6e\x75\x2f\xe3\x7f\xa7\xdc\x53\x5c\xe7\xf1\x30\x9f\xa2\x4e" + "\xd0\x1a\xf1\x78\x42\xee\xec\x7c\x83\xae\xa8\x37\x91\xf3\x99\x27" + "\x91\xbe\x00\x74\xa9\x97\xe7\x90\x58\xfb\x25\xb7\x35\xb2\x3d\xfd" + "\x36\x99\xe5\xc0\x6e\xd6\x47\x5d\x74\xdd\x16\xe8\x2c\x8c\x6d\xcb" + "\x3c\x35\xd7\x5c\xf7\x32\xbf\x43\x57\x7e\x86\xe7\xea\x16\xe8\xa4" + "\xde\xca\xe6\xfa\x3e\x13\x0d\xeb\x35\x51\x5e\xa4\xb2\xef\x58\x24" + "\xbd\x69\x8f\xaf\xb3\x81\x5a\x23\xbf\x21\xfb\x93\x12\x46\x85\x0f" + "\x3d\x77\xae\x12\xd1\xb7\x7a\x77\x9b\x7d\x91\x33\x5e\xcc\xcd\x57" + "\x9e\xa4\xeb\x24\x3d\x5e\x38\x8e\x59\xff\x31\x09\x5b\xa7\x4f\x5f" + "\xe3\xe6\x45\x22\xb2\xf9\x84\x08\xc2\xbe\x4b\xdf\xd4\x4b\xe3\xb6" + "\xad\xa6\x9c\xda\x5e\x1a\xbb\xb3\x97\xb2\xc5\xdf\xb2\x4d\xb5\xb0" + "\xdb\x1e\x3b\x97\x49\xd0\x09\x05\x23\x4a\xc8\xb2\x73\x35\x49\x1e" + "\x89\x56\xc0\x7e\x8b\xc0\x7e\x3b\x93\xcd\xba\xb1\xdf\x7e\xeb\x93" + "\xb6\xf1\xa1\x5d\x8a\x8f\x0e\xed\x1a\x5e\x44\x29\x19\xf3\x28\x13" + "\xf8\x39\x4f\x53\xf6\x1f\x33\x3a\x60\x3b\xa2\xcf\x7e\xbd\xbf\xa0" + "\xdd\x31\x6b\x11\x0d\x93\x7d\x85\xbe\x16\x15\x2d\xf3\x06\x9d\x87" + "\x4d\xcc\x53\x41\x96\x1b\xee\xc3\x67\x7c\x56\xda\x30\x3a\x6c\x5e" + "\x56\x2b\xc2\x9c\x5e\x7a\x95\x08\x23\xfd\x30\xb7\xbd\x17\xe9\x21" + "\xf7\x75\x01\xbf\x69\x6f\xd9\x60\x3c\x8a\x75\x92\xae\x57\xae\x7f" + "\x56\x98\x5c\xcc\xa3\x9d\x6b\x23\xb0\xbf\x4f\xb3\xcc\x5e\x5f\x32" + "\xab\x58\x44\xec\x4b\xf8\xdc\xfa\x7a\x79\xa6\xce\x67\x69\x6f\xc2" + "\xb6\xf9\xaa\x73\x74\x9e\x2f\x78\xbd\x60\x2d\x06\xcc\xca\x03\x9d" + "\x02\xeb\xf4\xaf\x6b\xc7\xb3\x2f\xc7\x4b\xd2\x6f\xe4\xfa\x3d\x7e" + "\xfa\xb1\x99\x71\xe7\x33\x53\xd6\x9d\xb0\xb7\x2e\x03\x5e\x9d\x41" + "\xd0\x01\xf9\x98\xff\x7f\xd8\xae\x9f\x7b\x4a\x7f\x14\xa4\x61\xfe" + "\xbf\x67\x0c\xa7\x95\x5e\x45\xb6\x52\xbb\xe8\x1c\xcc\x66\x92\x3e" + "\x22\x26\xfa\x46\xc8\xfd\x2f\x59\x06\x1c\xcc\x53\xbf\xec\x36\x3d" + "\xf0\x00\xd2\xb2\x0d\x38\x28\x73\x39\xde\x73\xfb\xcb\xa8\x3a\xd3" + "\x63\xea\x3c\xd0\x6d\xba\xfe\x97\x48\x9b\x9b\x50\xa7\x38\xa1\x4e" + "\x59\x4c\x1d\x97\xde\x4e\x75\x42\x9d\xfa\x84\x3a\x7b\x93\xe0\xd6" + "\x9c\x50\xe7\x68\x42\x9d\x8e\x24\xb8\x85\xe3\xeb\x8c\xb3\xc4\xd7" + "\x19\x67\x8b\xa1\x25\xfb\x6b\xe4\x20\x6d\x5c\x42\x9d\x49\x09\x75" + "\xf2\x8d\xf7\xc1\x7c\x72\x96\xed\x20\x1b\x78\xb3\x93\xc7\xf3\x25" + "\x8c\x4f\xf7\x2b\x4f\x85\xf4\xba\x9e\xf3\xfb\x35\xae\x36\xa1\xbd" + "\x3d\x09\xed\x35\x9d\xdf\xaf\x71\x6d\x09\x75\xfc\x09\x75\x02\x31" + "\x75\xea\x55\x3b\xe3\xcd\xf1\x75\xc6\x67\xc5\xd7\x19\x3f\xf6\x7c" + "\xbe\x1a\x9f\x9b\x50\x67\x7a\x42\x9d\x82\xaf\xa0\x05\xcf\xe3\xca" + "\x77\x6a\x14\xdb\xca\x77\xc1\x46\x18\xff\x21\xfb\x04\x54\xa1\x8d" + "\xd7\x7b\xc3\x43\xf8\xfc\x83\xe7\xab\x83\x8e\x30\xe6\x96\xf1\xd0" + "\x0f\x37\xdb\x8d\x39\x8b\xfd\x25\x58\xa6\x95\x8d\x3d\xde\x33\x98" + "\x2d\xca\xed\x18\xbe\x54\xdc\xd6\xc1\x31\x3c\x4f\x8d\x0f\xf6\xdb" + "\xc4\xca\xbf\x88\x14\x9c\x1b\xee\x61\x38\xdc\x7e\x9d\xf2\xc3\x48" + "\x61\x9b\xfc\xa0\x83\xeb\xdc\x90\x1d\x63\x47\x73\xfb\xc1\x86\xd5" + "\x61\x73\x3c\x1e\x37\x58\x2e\x80\x47\x06\x6c\xa3\xdc\xd6\x5a\x22" + "\x3e\x63\x6e\xa9\x85\x0d\x04\xbb\x9f\x71\x3b\x4e\x37\x54\x4b\x9b" + "\x6c\x49\x2f\xf1\xb3\xaf\xec\x36\x79\x06\xad\x6c\xd2\x1b\x0e\x37" + "\xa3\x7d\xb6\xdd\x9b\x4b\xce\x52\xb7\x9c\x7f\xd9\x76\xbb\xe1\xdc" + "\xc1\xb2\x00\xe3\xe5\x35\xfc\x33\xfc\x74\x43\x50\xda\x1a\x9e\xb6" + "\x1c\x3e\x1f\xe7\x33\xa3\x83\xc1\x5c\x2e\x03\xfe\x1f\x7f\xc4\xe8" + "\x2f\xe6\x7a\xf0\xc0\x0d\xb5\x17\xa2\x99\x1a\xc3\x09\x63\xe2\x79" + "\x72\x08\x78\x65\x42\x4e\xfc\xb8\x4f\xc8\x8b\x1f\xf7\x09\xb3\xe3" + "\x79\xd2\x04\x9e\x9c\xb0\x20\xa1\x4e\x69\x42\x9d\x0d\x31\x75\xaa" + "\xf5\x76\x6a\x12\xea\xec\x4e\xa8\xd3\x18\xf3\x8e\x3e\x4e\x38\xdc" + "\xbf\xf6\x91\xbe\x3f\x13\xda\x63\xde\x4d\x5b\xa4\xfe\x9c\xd0\x65" + "\xa4\xf1\x1e\xd2\xce\xad\xca\xf7\x44\xc1\xcb\xb1\x24\xc8\x3b\xca" + "\xe7\x8c\x89\xc7\x21\x67\x5c\x3c\x0e\x39\xfd\xf2\x5f\xa5\xd6\x6e" + "\xbf\x3f\x41\x37\x66\x49\x1e\x82\x8c\x60\xce\x9e\xc5\xef\x80\x55" + "\x83\xf2\xa0\x43\x4e\x71\x02\xbc\xb2\x04\x78\x1b\x63\xde\x33\xf1" + "\x5e\x1b\xd3\x87\xcc\x54\x9b\xf4\xe3\x83\xfd\x96\xd3\x60\xa4\xf3" + "\x9a\x12\xf8\x76\x3a\xe5\x5c\x93\xc7\x3e\x55\x23\x8f\x53\xce\x6b" + "\xbc\xfe\xd4\x61\xc6\xca\x3f\xe9\xfd\x0a\xc6\xe3\x71\xa3\x39\x1e" + "\x8f\x1b\xb3\x62\xfa\x15\xb4\xae\xa3\x7b\xad\x91\xfb\x1e\x62\xdb" + "\x87\x7d\xe1\xa4\x6f\xd3\x5a\xd8\x6c\xe7\x28\x93\x7d\xca\x4e\x94" + "\x52\xaa\xcf\xd1\x89\xb5\xdc\xa1\xfa\x41\xf9\x29\xbd\x2d\x4f\xf7" + "\xcb\xb3\x03\x7e\xa9\xc1\x8f\x5a\x65\x5b\x9e\x56\x71\x24\x1f\x69" + "\xd0\x7f\x13\x48\xd9\xb9\x1f\xd5\x08\x67\x41\x0d\xe8\x89\x75\xd1" + "\x4d\xcb\xf5\x75\xc4\x1c\xf6\x8d\x82\xee\xe9\xc4\x1c\x9f\xa1\xce" + "\xc6\x6f\x6c\x8a\xe1\xeb\xa0\x7d\xf5\x1d\xe2\x38\xdd\xb4\x8e\x6d" + "\x00\x96\x51\xf6\xb1\x3a\x18\x09\x10\xaf\xbd\x7d\x91\x93\xd2\x76" + "\x43\xbe\x4b\xaf\x1b\x8e\xa9\x1b\xd0\xd7\xc6\x3c\x8f\x9a\x27\x44" + "\xc8\x7c\x30\x18\x20\xc0\xc9\x52\xf6\xde\x4d\xeb\x0e\x42\x5e\x43" + "\xee\x9b\xc6\x19\x75\x78\x1d\xcd\x75\xac\xa5\x64\xbe\xa1\x8c\xcc" + "\xde\xd5\xc7\x25\x6c\x7d\xec\x3b\x61\x4b\x77\xf9\xca\x3a\xc9\x17" + "\x6c\xe7\xbd\x2e\xb3\xf2\x53\xb9\xc9\x95\x1a\x26\x4b\x77\x45\x1b" + "\x64\xe8\x26\x57\xb4\xa2\x2d\x17\xb8\x41\x5e\x6e\xdc\xc5\xfa\x26" + "\x96\x76\xd3\xa6\xcd\xbe\x6f\xd6\x8c\xf1\x3f\xb9\xef\x9e\x39\xd3" + "\x6e\xb3\xcf\x59\xfc\xf4\xc2\x05\xe3\x9f\x59\x5e\x6a\x5f\xb9\x74" + "\x71\xe9\xe2\x25\x3f\xb5\xe7\x38\xae\x71\xd8\xe7\x97\xaa\xdf\xec" + "\xe2\xf9\xcb\x4a\x27\xf3\xe3\x38\x7b\xc9\xd2\x85\x2b\xe4\xe3\x75" + "\xe9\x14\x0f\x64\x71\xe9\xc2\xa5\xf6\x6b\x16\x8c\xb3\xdf\x3d\x7f" + "\x71\xf1\xf2\xa5\x0b\x93\xc2\xba\xcd\xbe\x74\xe1\xd2\x85\xf3\x17" + "\xd8\x27\xdb\x73\x18\x72\x2c\xb8\x98\xf1\xcc\x31\xe6\x31\x9e\xbf" + "\xaa\xdc\xa2\x4d\x9f\xcf\xfc\x8a\x7f\x6e\x9e\x73\xfe\x5c\x76\x73" + "\x51\x3c\xcf\xdd\xec\x88\xe7\xb9\x9b\x3d\xe7\xcf\x65\x37\x27\xcc" + "\x7f\x37\x27\xcc\x7f\x37\x37\x9d\x3f\x97\xdd\x9c\x30\xff\xdd\x9c" + "\x30\xff\xdd\xdc\x3f\xff\x81\x97\xfc\xeb\xa5\x5e\x98\x98\x30\xff" + "\x4d\x4c\x98\xff\x26\x8e\x4d\x78\x9f\x18\xf3\x7e\x19\xde\xa7\xc6" + "\xce\x8f\x78\x9f\x63\xc8\xe7\x80\x7e\x99\x58\x64\x94\x61\x5d\x0f" + "\xdd\xdc\xa1\x97\x75\xc5\x94\xed\xd4\xcb\x6e\xe9\x97\x3f\x3e\xfb" + "\x46\xba\x5a\xaf\x4f\xfc\x92\x75\x3a\xfb\xa1\xf1\xdc\x04\xf9\xb8" + "\xf2\x34\x4d\x7c\x96\x61\x31\x0f\xb3\x5f\xa2\x78\xe5\x91\x50\xdd" + "\x48\xb2\x70\x9d\xba\x17\xc9\x2c\xdc\x37\x6d\xc4\x2f\x21\x2d\x03" + "\x7f\xd0\x29\x13\x61\xff\xbe\x9d\xaf\xe6\x8b\x5b\xf2\xa4\xcd\x8f" + "\x3a\x0a\xfe\x2d\x72\x5d\x03\x38\x36\xd4\xb1\x54\xa9\xb9\xb8\x03" + "\xcf\x19\xcc\xd3\xa8\x6f\x16\xa6\x9b\x3e\xc6\x2f\x21\x2d\x13\x7f" + "\x59\x21\xf7\x2d\x79\x06\x3c\x3e\x23\x4f\x26\xff\x89\x76\x6e\xff" + "\x7a\xd0\x44\xd6\x2a\xb7\xd6\xee\xd3\xd8\xb6\xbe\xa5\x54\xed\x2d" + "\x34\x7b\x85\xfb\x83\x82\x3a\xa4\x27\x5f\x27\xdd\x02\xfb\xef\x96" + "\x22\xb5\xdf\x72\x0b\xc6\xff\xc7\x5b\xd4\xde\x69\xb3\x17\xfa\xb6" + "\xf7\x04\x7d\xef\x01\xfc\xf6\xe1\xf7\x56\x03\xbe\x57\xae\xb7\x6f" + "\x39\x2a\xdc\x29\xf7\x33\xdc\x84\xf4\x2e\xe8\xb7\x5e\x6b\xc4\x55" + "\x70\x7e\xde\xf7\xb0\x86\x49\xbd\x2f\x49\xba\x1d\x36\x43\xaf\x9f" + "\xbe\x37\x87\xf1\x8d\x49\xcf\x15\xee\x11\x73\xb8\xbc\x9f\xdb\x43" + "\x9d\xc1\x6c\x6d\xc3\xef\x54\xf9\x89\x7f\x6f\x43\x42\x3f\xbe\x3c" + "\x41\xdf\x4f\x51\xfd\xf8\xfe\xa3\x09\x6d\xd7\x26\xef\xc7\xf7\x1a" + "\xd0\x8f\x2f\x07\xe9\x47\x9b\xa4\xad\x09\x7d\x31\x9d\x97\xc7\xf6" + "\xcf\x97\x92\xee\x71\xe9\xdf\x37\xeb\xb6\x50\x10\xeb\xb0\x4c\xe4" + "\xc9\xba\xf7\x97\x0d\x8c\x9b\x5e\x6e\x9c\xb5\x86\x66\x9f\xdf\xe6" + "\xf7\xa7\x0a\xf7\xb0\xfb\xfd\xf4\xfd\x32\x09\x67\x20\x7d\xae\xc2" + "\x05\x74\x32\x31\x9d\xd0\x1f\xd4\x1b\x6c\xbc\x8d\x75\x89\xda\x0b" + "\xf9\x3e\xe4\xff\x7b\xf3\x8c\xbd\xcc\x65\x65\x22\x60\xd0\x11\x79" + "\x87\x13\xf2\xc2\x31\x79\x1d\x71\x79\x6b\xfb\xd3\x23\x46\xfa\xd7" + "\x1b\xa7\xdc\x71\x09\xe3\x84\xf1\xc9\x7d\x2f\xbe\xdf\xb9\x93\x54" + "\xff\x30\x46\xe7\xd1\x3a\xb7\x00\x63\xd4\x97\x7c\x8c\x72\x4b\x93" + "\xf3\x5a\xae\xdc\x47\x13\x23\x29\x19\xbc\xdd\x18\xbb\x3e\xc9\x83" + "\xfa\x38\x9d\x3f\x3e\xb9\x47\x8c\xf1\xf9\x7a\x7d\xbc\x35\x33\xa1" + "\x8f\xd1\x13\x74\xeb\x26\xd5\xd7\x5b\x3f\x8d\x87\x7d\x6b\x76\x72" + "\x5e\xbc\x35\x0f\xfd\x8c\x26\xef\xe7\xad\x73\x07\xe7\xc5\x5b\x1d" + "\xe8\x4f\xf4\x7c\x5e\xbc\x55\xf9\x30\xe9\x3c\x98\x90\xb7\x47\xb8" + "\x93\xb6\xd3\xec\x8c\xb0\x9d\x7b\x6b\x84\xf7\x97\x62\xd2\x8f\xc5" + "\xf3\x1f\xfa\xc0\xf5\x98\x7e\x11\xa5\x67\x79\x1c\x4e\xd8\xc9\xf4" + "\x55\x3c\x19\x72\xdf\x36\x29\x81\x56\x67\x4e\xd0\x6d\xef\x75\x9b" + "\x52\x76\x29\x7a\xfd\x60\x5d\x3c\x4e\xb7\x15\x24\xa7\xd7\x6d\x25" + "\xa0\xd7\x99\xe4\xf4\xba\x6d\xe3\xe0\xf4\xba\x8d\xc7\xff\xcc\xf9" + "\xf4\xba\xcd\x1b\x4b\x2f\xd8\xba\xb2\x7f\xdf\xb1\x81\x37\xfa\x0a" + "\x45\x1d\xf7\x35\x4a\x99\x56\xf0\x8a\xaa\xd3\xc5\x75\x82\xd6\xb0" + "\xe2\x13\xd8\x90\x96\xd3\x74\xdb\x31\x43\xfe\x47\xd4\xd0\x30\xd1" + "\xf7\x08\xfb\x14\xa5\x70\x3d\x9f\xe3\x8c\xd7\x17\xc9\x21\x5e\x7f" + "\xc4\xb7\xfb\x83\xdc\xe4\xba\xe0\x07\xb3\x41\xd3\x17\x93\xa4\x17" + "\x29\x7f\xb2\x1f\xd4\xc7\xeb\x88\x1f\xb8\xe2\xc7\x08\x74\x43\x3d" + "\x1a\xb8\x83\x73\xc1\xbf\x0b\x8f\xd9\x0f\x02\xe7\x8f\xd9\xa4\x9f" + "\xa9\xf1\x9a\xf4\x6c\x3c\x7e\x93\x2c\xc9\xc7\x6b\x92\x7d\xf0\xf1" + "\x9a\x34\x69\xf0\xf1\x9a\x54\xc0\xe3\xe5\xa7\x49\xd5\xf1\xf3\xc6" + "\xa4\x92\xf8\xfe\x4e\x92\x32\x2c\x4c\x43\x2f\xe3\xf7\xaf\xdb\x6f" + "\xe3\x8f\x75\x1c\x8f\x55\x5d\x39\x81\x97\x53\xae\x62\x1c\x2f\x16" + "\xc6\xa0\xb0\x41\xc3\xea\xd5\xc9\xcf\x5b\x79\x8d\xdb\x5a\x43\xc4" + "\xe7\xc8\xf6\x2b\xd8\x76\x9f\xbc\x50\x33\x51\x3b\x9e\x4d\x27\xe8" + "\x8e\x1b\x35\x93\xa9\x8c\xcf\x3c\xa5\xef\xb6\xdc\x43\x98\x5c\x16" + "\x3b\x16\x7c\xf6\xc9\x6b\xd3\xcd\x6a\xed\xf4\xd7\x13\x74\xfb\x10" + "\x35\x2e\x77\x5c\x1a\x4f\xc7\xc9\xf5\xc9\xc7\x65\x72\x23\xc6\xe5" + "\xaf\xc9\xc7\x65\xf2\xd1\xc1\xc7\x65\x72\x00\xe3\xf2\xd7\xf3\xe5" + "\xe8\x76\x8b\x2e\x47\xeb\xb9\x8e\x7d\x09\xaf\xc7\x6f\x5f\xc5\x65" + "\xf0\x0c\x19\xb9\x7d\x3e\xe7\x8f\xef\x32\xe4\x48\xd6\x99\x04\x58" + "\xb2\x7d\xbd\x4c\xae\x0e\x23\x16\xee\x3c\x6b\x57\x32\x39\xb9\xdd" + "\xc1\x65\x6f\x28\x21\x0b\x68\x58\xb0\x83\x61\x2c\x25\x02\x8c\x16" + "\x2e\xc7\xe9\x58\xe1\xc7\xc8\xc9\xed\xbb\x8d\x72\xac\xeb\xf4\xb2" + "\xf5\x22\x54\xc4\x3b\x01\x89\x6d\xea\xfd\x1f\x26\xe7\x11\x2e\xcf" + "\xe5\x12\xca\x84\x95\x3c\xde\x31\x29\x5e\x1e\xef\xc8\x8c\xe7\x4f" + "\xd0\x1f\xf5\x34\xe8\x39\x3c\x2f\x00\x0e\x5f\x9b\xbf\x2e\x2c\x9b" + "\x77\x6c\x4c\x90\x4d\xf0\x40\xde\x78\xc5\x03\x79\xc3\xe3\x71\xbd" + "\x63\x57\x72\x1e\xb8\xa3\x69\x70\x1e\xb8\xa3\x7d\x70\x1e\xb8\x23" + "\xc8\x3c\xe0\xa7\xbc\x71\xf1\xb2\x99\x97\x11\xdf\x77\xb4\x2b\x65" + "\x93\x2e\xbd\x18\xd9\x84\x2d\x74\xd9\x60\x72\xc8\x32\xc5\x3e\x24" + "\x75\xbd\xc6\x59\xc7\xd7\xa2\x99\x05\x72\xc5\xf8\x79\x79\x4f\x09" + "\x3a\x3e\x97\x69\xb8\x53\xde\x0d\xcc\x3b\x1a\x4b\xc7\xcd\xea\xfe" + "\x9a\xf3\x04\xdd\xf9\x10\x9f\x2b\x2b\x7a\xde\x75\x55\x7c\xff\xf3" + "\x82\xc9\xe9\x79\x67\x06\xe8\xe9\x4c\x4e\xcf\x3b\xb3\x07\xa7\xe7" + "\x9d\x53\xf9\x6e\xd0\xf9\x32\x75\xe7\x5c\xfb\x0a\x69\xa3\xc8\x3a" + "\xa7\xe9\xce\x7d\x5f\x6f\x7e\xba\x73\x4b\xfc\xfc\x74\x67\xd9\xc5" + "\xcf\x4f\x77\xb6\x27\x9f\x9f\xee\x0c\x24\x9f\x9f\xee\xb2\x28\x79" + "\xb8\x2b\x2f\x5e\x1e\xee\xb2\xc7\xf3\x44\x5e\xf0\xbf\x6f\x7e\xba" + "\xab\x3a\x41\x06\xaa\x4e\xd0\x94\x4b\x61\x53\xb8\xd4\xb8\x4d\xf9" + "\x24\x01\xc7\x3d\xc9\xc7\xed\xae\x66\x8c\x5b\x55\xf2\x71\xbb\xcb" + "\x3f\xf8\xb8\xdd\x15\xc1\xb8\x55\x9d\x3f\x6e\x53\xb2\x2e\xde\xa6" + "\x98\x32\x3d\x7e\xcc\xa6\xe4\x5c\xfc\x98\x4d\xd9\x98\x7c\xcc\xa6" + "\xec\x4a\x3e\x66\x53\x9a\xd4\x98\x4d\x09\xc6\x8f\xd9\x94\xa3\xf1" + "\x63\x06\xba\xfd\x83\x63\x86\xf1\x69\x56\xfe\x09\x53\x1f\xc0\xba" + "\x7d\x58\xc8\x3d\x35\xdf\x4f\xd3\xb2\xd4\xda\x7a\x9a\x9a\x3b\xd4" + "\x18\xbe\x85\x32\x79\xe7\xcf\x03\x53\x8b\xf4\xb4\x9f\x9c\x3f\x0e" + "\x53\x37\x40\x47\x77\x35\x97\xc9\xb3\x2d\x35\x86\x4c\x73\x94\xf3" + "\xae\xe6\xf3\xa9\xa9\xd2\x7f\x1d\x63\x2c\x7c\xe1\x08\xb1\x5e\x47" + "\xf9\x20\xc3\xe1\x3b\x91\x09\xb0\xda\x2e\x66\x8e\x1f\xdc\xa7\xa6" + "\xb9\xd9\x5b\x7e\x13\xe0\x4d\xfb\x5c\xf1\xea\xb4\x44\xfb\xb7\x0e" + "\x79\xef\x2a\x3e\xfd\xe1\x73\xf1\x38\x4c\x9b\x93\x9c\x4f\xa7\x15" + "\xa3\x0f\x75\xc9\xf9\x74\x9a\x67\x70\x3e\x9d\x86\xf1\xa7\xba\x98" + "\xb5\xcf\xc8\xc7\x22\xfe\x84\xb5\xcf\xb4\xc3\xd6\xa0\xe2\x1d\x69" + "\x13\x55\x34\x37\x03\xe7\x44\xfb\x0f\x63\x73\xf7\xd3\x3a\xce\x0b" + "\xe3\xeb\xdf\x3d\x88\xfd\x77\x37\xdb\x7f\x6f\x25\xc7\xf9\xee\x0b" + "\xd8\x7f\x77\xb3\xfd\xf7\xd6\xf9\xb2\x75\xb7\x6e\xff\x25\x5b\xe3" + "\xdd\xbd\x31\xf9\xf8\xdf\x9d\x30\xfe\x54\x50\x8a\xf5\xb0\xac\x1f" + "\x5f\xee\x48\x6c\x39\xf6\x4d\xe2\xb2\xcc\x23\x49\xca\x86\x13\x61" + "\x26\x2f\xf7\x43\xfb\x79\xbc\xc7\xbe\x54\x49\x79\xef\x87\xf9\x4a" + "\x1e\x7f\xb8\x2b\x5e\x1e\x7f\xb8\x20\x5e\x1e\xef\x4e\x18\xbb\x1f" + "\x6e\x88\xcf\x07\xff\xfc\xb7\xe9\xd8\x1f\x06\x13\x78\xe0\x83\x13" + "\x34\xfd\x59\xc5\x03\xd3\xff\x18\x8f\xc7\xf4\x8c\xe4\x3c\x30\x7d" + "\x2c\xfa\xff\x41\x72\x1e\x98\x9e\x37\x38\x0f\x4c\x67\x1f\x9f\x0f" + "\x62\xf9\xf6\xfe\xb2\xbc\x61\x09\x65\x5c\xc9\x75\xde\xf4\x9a\xe4" + "\x7b\x04\xd3\xf7\x2a\x1a\x4f\xef\x8c\xa7\xf1\xf4\xc3\xf1\x34\x44" + "\x5f\xfe\x71\x1a\xf6\xc7\x26\x08\xb9\xef\x49\x94\x7f\xdf\x09\xba" + "\x47\x97\xff\x1f\xbd\x1d\x8f\xe3\x3d\x73\x14\x2e\xc9\xf6\x45\xee" + "\xe1\xf5\xaf\x2f\x39\x2d\xef\xd9\x98\xbc\xcf\xf7\xec\xc2\x1c\xe4" + "\xd3\xce\x93\xa5\x7b\x9a\x90\x7e\x3f\xef\x87\xf2\x7e\xc8\x4e\xa4" + "\xdf\x1f\x21\x8b\x9c\xaf\xfa\xe7\xa5\x7b\xfc\xec\x8b\xc2\xf4\x67" + "\xfe\xb5\x8e\xa1\xd9\x3c\x07\x31\x5e\x85\x65\xd2\x6f\xc1\xba\x81" + "\x79\xfd\x6a\xe6\xf5\x1f\x49\xfb\x8f\xcf\x59\xd8\x8f\xd0\xea\xa0" + "\xd9\xbe\x60\x84\x0c\x7e\xe7\xf2\xf1\xb0\x7f\x34\x89\xe5\x82\xcb" + "\x1b\x65\xd5\xbe\x99\x2b\x81\xbf\x7f\xb4\x20\xf9\x18\xff\xa8\x6c" + "\x70\xde\xf9\x51\x8d\x1a\xe7\x1f\x1d\x89\x1f\xe7\x1f\xed\xd5\xdc" + "\x23\xe6\x70\x5f\xfd\xa0\xf3\xc5\x8c\x71\xa9\x5d\x04\x06\xd5\xf7" + "\xeb\x1f\x69\x2f\x29\xa7\x2b\x4e\xd2\x8f\x27\xca\xf6\x4c\x22\x6c" + "\x5d\x97\x42\xcd\x52\x07\xfc\xb8\x42\xe2\x89\x32\x85\x11\x32\x89" + "\xf5\x4f\xb5\x73\x5e\x9d\x5b\x84\x51\xae\x8d\xcf\x04\xf8\x4e\x31" + "\x78\xe1\xb2\xe3\xf4\xe3\x19\x71\xf5\xcd\x44\x3e\x05\xc3\x53\x27" + "\xe5\xf1\xc7\x1b\x8c\x3d\xdd\x0d\x78\x4f\xbe\xef\xfb\xe3\xdd\x86" + "\xef\x83\xf2\x19\xfb\xf1\xa0\xe7\x97\x8c\x13\xdf\x9b\x61\x9c\x2e" + "\xac\x07\x7e\x1c\x31\xf8\x57\xf9\x5a\xe6\x67\x0c\xf8\xf2\xe5\xdb" + "\x90\xe7\xbd\xc0\xde\x60\x8c\x1c\xe4\x4f\x8d\x85\xa3\xe2\x73\xe4" + "\x17\x18\xfe\x78\x78\x5e\xf0\x15\xb0\x74\x7c\xf2\x37\x26\xe0\x53" + "\x0b\x3b\xa5\x54\x87\xb1\xfb\x42\x30\x78\xcc\x15\xcf\x32\x3f\xe4" + "\x7b\x2f\xb4\xe7\x97\x6a\xa3\xd9\x2f\x9d\xc7\x5b\xf9\xd2\x5e\x62" + "\x18\x17\xc6\x71\x46\x4e\xdc\xda\x42\x9e\xdd\xf3\xd9\xd6\x8c\xa8" + "\x92\xfb\x19\x09\x7b\x84\x33\xf2\xa5\x3f\x95\x2e\xf7\x8f\x45\x12" + "\xe5\x60\x46\xb1\x31\x47\x27\xa4\x6f\x30\xe4\x1e\xeb\x5a\x86\x9b" + "\xb0\xcf\x3a\x63\x97\x92\x85\x19\x11\x2d\x2d\x76\xbd\x36\x43\xda" + "\x7f\xc6\x7e\x29\xf2\x77\x25\xd4\x4b\xd8\xff\x9b\x91\x2f\x06\xdf" + "\xa7\xcf\xc0\xf8\x06\xf9\x6c\x4b\xc5\x28\x98\x39\x2e\x61\xbf\x22" + "\xb0\x59\xde\x41\xff\x0b\xe0\xce\xd4\xf5\xde\xac\xd7\xe2\xdb\x9b" + "\x99\xef\x3c\x75\xa1\xfe\xcf\x1c\xa4\xff\x33\x07\xfa\xbf\x44\xc2" + "\x4d\xd8\x4b\x9c\x29\xfb\x1f\x3d\x4f\xff\xcd\x6c\x82\xfe\x32\xe8" + "\x06\x9b\x7b\xd6\xe5\x86\xad\xce\xfb\x07\x83\xdb\xea\x33\x07\xf6" + "\xff\x64\xbd\x99\x03\xfb\x7f\x81\x64\xb6\xba\x9f\xe4\xd9\x6a\x5c" + "\xdb\xb3\x72\xad\xb5\xc9\xfa\x32\x6b\x90\xfd\xbf\x59\xfa\xfe\xdf" + "\x2c\x6f\xbc\x3e\x9b\xe5\x8a\x1f\xc3\x99\x09\x63\x38\xab\x3e\x7e" + "\x0c\x67\xe6\xff\x57\xe7\x35\xbc\x53\x6a\x6a\xaa\x29\x35\xc5\x94" + "\x92\x8a\x6c\x74\x91\x86\xa5\x9a\x53\x87\xe0\x6f\xa8\xfe\x3b\xcc" + "\x94\x6a\x32\xe3\x6f\x88\xfe\x3b\x34\xe1\x7d\x18\xd7\xc5\x9f\x59" + "\xff\x1d\x92\xf0\x3e\xf4\x2b\xf2\x87\xe9\xed\x1a\xed\x9b\x13\xde" + "\x87\x7c\x45\xfe\xd0\x7f\xb0\x3e\x9d\xf7\x1e\xef\x87\x76\xcf\x92" + "\x15\xf3\x8b\x17\x2f\x90\xe7\xc5\x0b\xed\xf3\x9f\x78\x62\xe1\xb2" + "\x65\xf6\xd2\x67\xec\x77\xdd\x79\xdf\x4d\xb7\xd9\xd5\xb1\x73\xf1" + "\xe4\x6b\x16\xa4\xd3\x8c\x95\x4b\x39\x63\xc6\xfd\xf7\x14\xd8\x67" + "\xdf\x75\x67\x7c\xa6\x01\x46\x1e\x2f\x5f\x08\x4a\x8c\xfc\xe5\x55" + "\x8c\x22\xda\x38\x4a\xea\x9e\x0e\xf6\xf3\x55\x7b\x1e\x0f\x5e\x7a" + "\x04\xdc\x2f\x7a\x9d\xc2\x7b\x35\x9f\xe9\xdf\x7b\x88\x3b\x31\xbe" + "\xde\x45\x25\x8b\xf8\xfe\xca\xbd\x9f\x89\xf7\x03\x64\xff\x11\x99" + "\x8e\xd3\x23\x57\x35\x4f\x47\x59\xbc\xfb\x3a\x22\x64\x77\x92\xe5" + "\x04\x3d\xf0\x21\xf2\x52\xc4\xed\x1a\xd2\x82\xba\x2f\xf4\x9c\x8f" + "\x65\xda\xfb\x2e\xa3\x9c\xf5\x04\xdd\xf7\x9c\x78\x5f\xc8\x77\xbe" + "\x27\xa4\xca\xdd\xf7\x90\xe6\xbe\xd7\xc6\xba\xa1\xf6\x45\x32\xef" + "\x7c\x91\xe8\xd5\x91\x64\x79\x75\x14\xc7\xea\xb8\x2f\xdf\x38\x0b" + "\xad\xc0\xbb\x9f\x1e\xb1\x73\xdb\x5c\x56\x33\xdd\x7b\x97\x2c\x3f" + "\x32\xae\x7c\xd9\xc0\x59\xec\x7d\xf9\x26\x94\x9b\xf5\x39\x59\xc3" + "\xe9\x4d\xf5\xbe\x32\x17\x59\xa3\xe2\x8b\x1b\xa6\x53\x4a\x2b\x2c" + "\xe1\x55\x11\x11\xf1\x2e\x3d\xc9\xed\xff\xd1\xba\x4a\x7c\xe1\x83" + "\xb6\x9e\xd1\xe5\x14\x9b\x4f\x91\x19\x72\x9d\xe2\x5d\xca\x7e\x0a" + "\xf7\xed\xdd\xf9\x25\x99\x41\x83\x31\x27\xe9\x7e\x7f\xd9\x0c\x11" + "\x75\xce\x20\xf3\x9f\x1c\xec\x73\x78\xe8\xf6\xcd\x7f\x26\xf3\xaf" + "\x7a\x5d\xa6\x5e\x61\xa3\xb2\x52\xd1\x29\x38\x86\x4f\x50\x84\xd9" + "\xcf\xff\xc8\xbc\x28\x97\xb9\x21\xe4\xb4\x51\x6b\x69\x90\xd6\x1e" + "\x13\x61\xcf\x9f\xd5\xfd\x80\x96\xae\x20\xfb\x30\x5a\xd6\xce\xa0" + "\xd4\x13\x05\x64\x6a\x29\xaa\x21\xdf\xdc\x20\x95\x1d\x13\x9d\x47" + "\xe6\x7d\x4e\xad\x45\x7b\xa9\xb0\x9d\x4c\x47\x3a\x3e\x25\x19\x87" + "\xa6\xb2\xaf\xad\xfc\x1c\xd9\xd6\x2e\xe6\xb4\x73\xb4\x7a\x2d\x0d" + "\x5f\xfd\x09\x59\x7d\x9d\xed\x68\xe7\x14\x3d\x7c\x94\x52\x00\xcf" + "\xb4\xe6\x53\xb2\xad\x79\x88\x7d\x7d\xf3\xa8\xb6\x9c\x6c\xc2\x99" + "\x9d\xd1\xeb\xcc\xce\xec\x15\xd9\x23\x43\xce\xec\xac\xd6\x12\x94" + "\xef\x78\x8f\x46\xb4\x53\xd6\xfb\x27\xdb\x4d\x35\x67\x69\x8c\x7d" + "\x26\x8f\xff\xfd\xc7\x6a\xcf\xa2\x7c\xe5\xc7\x2e\x0d\x75\x63\xeb" + "\x44\xd2\x3e\xae\xf1\x15\x84\x49\x03\xac\x9a\x5e\x1a\x53\xdb\x4b" + "\x36\xad\xe2\x63\x17\xd3\xa2\xaf\xb2\xb9\x1e\xba\x70\xd8\x5b\x8f" + "\x37\x9a\x7d\x47\xba\xa8\x25\xd8\x4b\xad\xf4\x17\xf2\x39\xfe\xe6" + "\xfd\xd5\xe3\x8d\x43\x34\x30\xbf\x77\x75\x07\xe0\x2b\x9e\x71\xb6" + "\xf0\x7d\x65\x17\x55\x95\x53\x46\xc9\x6a\x1a\x76\x12\xe9\x6a\x4d" + "\x7f\x60\xb7\x2f\xf2\x37\xef\x6a\xe9\x87\xfb\x88\xbd\xbc\x85\x52" + "\x5b\x83\x35\xec\xef\x69\x8a\xa6\xf7\xb5\xf9\x82\x6d\xe4\x2b\xf9" + "\xab\x57\xb3\xf4\x35\x6e\xd4\xc8\xf2\xeb\x9e\x36\x93\xcf\xdc\x43" + "\xbe\x82\x20\x7d\x80\xb6\x45\x65\xdf\x31\xe8\xab\xbc\xd6\x60\x98" + "\xef\x39\xe5\x88\x6e\x5b\x7a\xd5\x52\x1a\xb7\xf3\x2c\x8d\xdd\x71" + "\x96\xb2\x45\x28\xdb\xc4\xbe\xb5\x7c\x3f\x75\x07\x7e\x33\x3a\xc8" + "\x82\xfe\x2a\x3f\xec\x34\xdd\xc7\xb6\x2f\x9b\xea\x7a\x07\x7c\x6c" + "\x7b\xbb\x07\x7c\x6c\xc1\x4b\xb3\xd9\xcf\xf6\x38\xdd\x67\x61\x7e" + "\xae\x3a\x4d\xe6\xf5\xa7\x89\x6e\x70\x99\xc8\xfe\x38\xdf\xab\x78" + "\x60\x9f\x6f\xc1\x29\xf9\x7c\x9c\x1e\x28\xc6\x6f\x06\xfe\x52\x90" + "\x2e\xf7\xb3\x3b\x74\xbe\x45\x9a\x09\x69\x0f\xe0\x37\x15\xbf\x33" + "\x9c\xb5\x22\x80\x36\xc2\xdd\x26\x4a\x67\xfe\xd5\xfd\x79\xc3\x21" + "\xf7\x03\xb0\x7f\x9e\x2c\x36\xf8\x58\xe9\xf4\xfb\x66\x7f\x70\xe2" + "\x14\xc7\x85\x0a\x48\x7c\xfa\x8a\x52\x38\x46\x94\x9e\xce\x38\xfc" + "\x9a\xdb\x45\xfb\xd5\xf8\xb5\xe2\x8f\xe5\x72\xac\x51\xb7\xbb\xaf" + "\x88\xdb\x7c\x03\xe9\xc2\x48\x47\x7f\xcd\x9c\xf7\xce\x89\x53\x26" + "\x55\x26\xdb\x04\x98\x61\x1d\x3e\x64\xfd\xde\x20\xcb\x74\xb7\xc9" + "\x2a\x0e\x2e\x98\x48\xb5\xa3\x44\xdb\x8e\xad\xa2\x59\xc9\xda\x03" + "\x68\xfb\xa9\xbd\x8c\x23\xe6\xed\xe6\x8d\xc8\x3b\x88\x55\x2c\xd3" + "\xa5\x79\x1e\xfb\x8f\x3d\xc8\x71\xa3\xc6\xc6\xf6\x41\xb8\x67\x85" + "\x79\xee\x7c\xb3\xdc\x3b\x44\x98\x66\x87\x5b\xfd\x5d\xf4\xab\xde" + "\xce\x21\xce\x3f\x92\xc9\x17\x39\x4e\x13\xb2\xc8\xc6\xf6\x5f\xdd" + "\x56\xe1\xc7\x6f\x27\xfb\x73\x82\x4f\xbe\x7d\x92\x1e\x7c\xe0\x5f" + "\xb2\x28\xeb\x23\x07\xe9\xfa\xe8\xc1\xa7\x07\xf4\xd1\xc3\xe7\x5a" + "\x3a\x1a\x63\x74\xd1\xc3\x6f\x9c\xaf\x8b\x1e\x7a\x4d\xe9\x22\x11" + "\x51\xba\x27\xea\xd7\xd3\x37\x25\xa4\xeb\x7e\x21\x0f\x3d\x9b\x90" + "\x1e\xd6\xd3\x1f\x4d\x48\x0f\xa8\xf4\x82\x1d\x86\xae\x6b\x65\x3c" + "\x56\xb2\xae\x2b\x58\xc7\xba\xae\x75\x81\xae\xeb\xa4\x8f\x61\xc1" + "\x42\xf1\x73\x17\xf1\x9d\x25\x3c\x4f\x66\xfc\xc5\xfb\x64\xe0\x9e" + "\x76\x82\x7e\x12\xe5\xb4\xea\xbf\x90\x19\x7f\x52\xcf\x09\xf7\xbd" + "\x85\xac\xe7\x58\xc7\xb1\xdf\xc9\xf6\x51\xa2\x7d\xfb\x56\x71\xb4" + "\x76\xab\x38\x12\x72\xff\xa4\xd8\xd0\x77\x2f\x20\x6d\x23\xd2\x5e" + "\x40\x3e\xeb\x3d\xa6\x49\x4b\x41\x23\xc7\x71\xe8\x00\x8f\x4d\xb2" + "\xa6\x50\xc9\x66\xf0\x3c\xdf\x2f\xdc\x00\xfa\xfa\x4a\xf9\xde\x6a" + "\x94\x64\x3c\x25\x53\x0e\x74\x54\x07\xcb\xdb\xa8\xf5\x90\x2f\x9f" + "\xe3\x73\x2a\x0f\x8a\x93\x7c\xcf\x8e\x71\x28\x5c\xf5\x23\x8e\x11" + "\x94\xd2\x0c\xeb\x82\xfd\xc0\xd9\x5f\x05\x7a\xd7\x5c\x0d\x9c\x54" + "\x8c\x94\x9f\x60\xfd\x5f\xa7\xdf\x63\x7a\xc4\xce\xf1\xc7\x8e\xd3" + "\x4f\x72\xb1\xbe\x0b\x73\xdf\xac\x51\x17\xf1\xbd\x17\xc8\x28\xaf" + "\xf1\x8a\xb6\xe3\xaf\xda\xb8\xfb\xc2\xb1\xe8\x50\xc6\xd7\x1e\x26" + "\xc6\xd9\x4f\x3f\xd9\xd0\x52\xd6\xc8\xf5\xb3\x99\x36\xc2\xed\x34" + "\x60\xa4\xc8\xbb\x33\x6e\xb2\xf0\xdd\x19\x3f\x15\xc8\x18\x82\x22" + "\xbd\xb9\xbe\x65\x6e\x80\x58\xcf\xfb\x3a\x01\xa3\xec\xb8\x82\x01" + "\x58\x02\x7a\x3f\x2e\x4f\x87\x3f\x7c\xad\xf8\xe2\x38\x3d\x18\xe4" + "\xf1\xe2\x7b\x90\x7c\xbe\x06\xba\x64\xb0\x6f\xbc\xb2\x3d\x7f\xb2" + "\xb6\xee\x2f\x44\xfa\x5d\x4e\xf0\xdb\x4f\xca\xf8\x9e\x12\xdf\xdf" + "\x94\x77\x37\x4d\x13\x49\xac\xcc\xce\xe8\xbf\xbf\xf9\x7f\xe1\xee" + "\x26\xe8\x6f\xdb\x69\x12\x7b\x81\x7f\x19\xdf\xdf\x04\xfe\xc7\x98" + "\x0f\xf5\x3e\xb9\x5e\x7e\x98\x69\xfe\x60\x33\xa7\x61\xad\x78\xd8" + "\x18\x7f\xee\x2f\xf7\x05\x79\xbb\x95\x4d\x28\xda\xfc\xf4\x90\x8b" + "\xf3\x91\xb6\x85\xcb\x4f\x80\x1e\xf3\x2d\x88\xd2\x5b\x27\xa2\xa6" + "\xaa\xd5\x64\x56\x3a\xed\xe1\x57\xb9\xbe\xd2\x69\x0f\xcf\x1e\xd0" + "\x69\x0f\x4f\x53\x3a\x4d\xd1\x58\xe9\xb4\x87\x6f\x55\x3a\xed\xe1" + "\x1b\xe5\x39\x18\x74\x1a\xe7\xb1\x5e\x33\x74\xda\x8e\x51\xe2\x30" + "\xeb\x8e\x90\xfb\x61\xbb\xa1\xdb\x36\x21\x8d\x75\x07\xe3\xa8\xf4" + "\x54\x81\x43\xfc\x7f\xd9\xa4\xfc\x0c\xf8\xb9\x88\xef\x2b\x74\xea" + "\xcf\x18\x97\x87\x7f\xa6\x74\xdc\xc3\xa5\x03\x3a\xee\xa1\xf0\x40" + "\x5d\xd6\x71\x0f\x57\x28\x1d\xa7\xd2\xeb\x1e\x66\x1d\x57\xe0\x60" + "\x1a\xe8\xf0\x4d\xbc\x67\xa7\x97\x67\x3a\xba\x62\x75\x5c\xbc\x7c" + "\x3d\x7c\xc4\xd0\x71\xac\xdb\xf0\x0e\x1b\x24\xfd\xb0\x94\x37\x94" + "\xdb\x02\x9a\x1b\x72\xc7\x63\xc0\x7d\xe6\x38\x63\x4c\xb7\x29\xa7" + "\x68\x98\x7e\x57\x48\xef\xf7\x23\x36\xc3\xd7\xd1\x4f\x0f\xdb\x93" + "\xd9\xcd\x86\x9d\x06\x7e\xbc\x32\xca\x71\x3a\x5c\x98\x4b\x6b\x84" + "\xab\x35\x72\x94\x1e\x2b\x25\x93\x96\xfa\xd4\x67\x3c\xb6\x58\x67" + "\x0c\xe5\x5f\xd6\x3d\x98\x43\x1f\x2d\x0c\xd2\x50\xac\xcd\x3f\xab" + "\x32\x21\xcf\x41\x3f\x88\xc9\x5b\xc5\xed\xc4\xd4\x1b\x1f\x93\x27" + "\xe3\x51\x8e\x3f\xcd\x31\xe6\x1e\xc9\x1b\x6c\xed\x7f\x91\xb8\xfc" + "\x7d\x70\x5c\xe6\x0e\x19\x1c\x97\xb9\xd2\x0e\x18\xdf\x45\x29\x58" + "\x9b\x5d\x7a\x9a\x1e\x91\xfb\x31\x32\xee\xcd\xfa\x64\xed\xcc\xbd" + "\x57\xcf\x1f\x12\x93\x1f\xdb\xd6\xb3\x49\xea\xc7\xb6\xf7\xb3\xaf" + "\x80\xff\xf6\x57\xc0\xff\xf8\x2b\xe0\x7f\xc1\x3a\x10\xb4\xb3\x6a" + "\xa6\xf8\x72\x37\x44\xa4\x0c\x1e\xe6\xfb\x7a\x27\xe9\xd1\x6f\xea" + "\x7b\x3e\x9f\x39\xaf\x92\x6b\x41\x79\x6f\x6b\x33\xf2\xf9\x5e\x3e" + "\xeb\xe7\xa9\x18\x41\x75\x46\xdd\x5f\x67\x46\x22\x6e\x23\x22\x06" + "\x6e\x32\xff\xe9\x44\xdc\x90\x3f\x3e\x26\x7f\xd3\xc0\xb8\x3f\x7a" + "\x41\xff\x7a\x5f\x0d\xc9\x18\x9c\x07\xb1\x7c\xc1\x9c\xcc\x71\xff" + "\xf4\xfd\x99\x47\x3b\xa0\xe7\x73\x62\xfc\x76\xbb\xa0\xdb\xaf\xe4" + "\xf8\x0b\x6c\xfb\x56\xa9\xf5\xf0\x37\x30\x9f\x8c\xe4\xfb\x3a\x7c" + "\x77\xa7\x30\x3a\xdb\x74\xb0\x8c\x65\xe8\x31\xbb\x51\x77\xb0\x7d" + "\x20\x6e\x57\x6f\x93\x7d\x60\x83\xa8\x33\xc7\xa8\xc3\xb0\xd9\x8f" + "\x12\xf3\xc0\x95\xf2\xce\x6b\xa4\x8b\xf5\xee\x37\x60\x27\x8f\x54" + "\xed\xcc\x23\xbd\x1d\x0f\xea\x0c\x7a\x57\xfd\xc2\xfd\x7b\xac\xf9" + "\xe2\xfb\x47\x7a\xff\x0a\xe9\x2b\xfa\x77\x81\x76\x0b\x27\x5d\x7c" + "\xbb\x99\x46\xbb\x8e\x8b\xa7\x6b\xe1\x9e\xaf\x4f\xd7\x1c\x9d\xae" + "\x85\xfe\xaf\xa0\x6b\x92\x76\xe6\x65\x7d\xfd\x76\xec\x7a\x3b\xf3" + "\xa6\x27\x6b\x87\xe4\xbf\x41\xef\x75\x59\x8c\x18\x98\x1c\x0f\x56" + "\xc5\xbb\x9b\x57\x1d\x1b\xeb\x57\xc5\x89\x9d\xb7\xcb\x88\xf5\xab" + "\xc7\xa2\xc5\xdc\x32\xef\xc3\xc2\x7a\xb6\x47\x84\xe6\xa7\x79\xcd" + "\x1c\x5f\x75\xea\x5a\x75\x67\x5c\xaf\xd3\x7e\xa1\x18\xc3\x1c\x67" + "\x4b\x88\x02\x3a\x58\x23\xfd\x01\x30\x0f\xcd\xbf\x94\xef\x07\xa8" + "\xf3\xcc\xf9\x63\x94\x4c\xce\x1f\x03\xd8\x45\x83\xc3\x68\x2b\xd9" + "\x55\x9e\x33\x64\x30\x9f\x7f\xd4\x9f\xeb\xa7\xa7\xe7\x70\xfd\x68" + "\x65\xab\x43\x9c\xb1\xe9\x71\xfe\x9e\x78\x37\x26\x0e\x21\xe6\xee" + "\xc7\xff\xae\xdf\x4d\x00\x0d\x5c\xa0\xe5\xfc\x2d\x06\x0d\x8c\x74" + "\xa4\xed\x36\x68\x00\x7b\x25\xc3\x57\x1f\xe1\xbb\x43\x41\x75\x4f" + "\x7c\x7e\x8b\xa8\x68\xd3\xef\x48\x3e\xae\xce\x19\xd2\x5b\x1d\xc1" + "\x35\x36\x93\x51\x7f\xac\xdd\xf9\x25\xf3\x70\x20\xad\x6d\x1e\x60" + "\x05\x0d\xf8\x82\xf1\x12\x03\xe5\xea\xa4\x5f\xd2\xe3\x18\xff\x42" + "\x15\xdf\x11\x6d\x48\xdc\x4d\x94\xaa\x01\x7f\xf4\xc1\xe4\x2b\x09" + "\xb2\x9d\xda\x15\x45\xff\x59\xd7\x35\x2c\xf1\x9b\xb9\x8c\xb4\x1d" + "\xce\x64\x9b\x54\x0c\xc5\xc7\x9f\xd6\xce\x70\x4c\x1c\x89\x57\x06" + "\xfa\xdc\xc8\x38\xf9\xf1\x1b\x58\x93\x4d\xb3\xce\x91\x4e\x8b\xc7" + "\x1f\xd0\x90\xae\x2d\x1b\xc0\x61\xa7\xbc\xe3\xf1\x78\x8d\x81\x83" + "\xc6\xed\x87\x6c\x26\xd8\x62\xdc\x6e\xa7\xbc\x6b\x89\xb6\x27\x70" + "\x4c\x3b\x8e\x8d\xb1\x32\x9b\x18\x07\xd4\x39\x62\xd0\x5b\xaf\x63" + "\xb4\x51\xa6\xc9\xb6\x15\x6d\x14\x9d\x0f\xc2\x1e\x7c\x3c\x72\x3e" + "\x9d\x9f\xc8\x8c\xa1\x73\x2a\xf3\x15\xef\xb1\x00\xff\x5f\x33\xbd" + "\xf9\x5c\xc3\xbe\x82\xed\xaa\x27\xee\x3c\x18\x94\x7e\x27\x19\x0c" + "\x57\x03\xfd\x19\x06\xe0\x5e\xa2\x68\xfc\x44\x41\x3f\x8d\xd1\xb6" + "\xc0\x58\xac\x57\x77\x52\xd8\xf7\x1d\xba\xe3\x09\x47\x7f\x3b\x8c" + "\xab\xd3\x66\xd2\x84\x8d\x63\x66\x06\x18\xd7\x52\xbb\x08\xb3\x5d" + "\x29\xfd\x98\xd0\xd7\x86\xf2\x76\x33\x6c\x4b\x93\x6c\xab\x3b\x9b" + "\xed\x7b\x8b\x7c\x46\x5b\x83\xf0\xf7\xdb\x1c\x97\xd2\xe8\x17\xfa" + "\x62\x61\xde\x02\xee\xb0\xff\x16\xbc\x27\xf9\x65\x05\x8f\xd3\x82" + "\xd7\x38\xcd\x28\x87\xf7\xe5\x5c\xce\x78\x47\x1e\xf8\x6b\xc1\x2d" + "\xe8\x57\x3a\xe3\x19\x70\xca\xd8\x2f\xe8\xf3\x82\x76\x86\x11\x72" + "\x2f\xc8\x8b\xeb\x67\x5f\x81\xd9\xe0\x3b\x3e\x23\x6a\xb6\x87\xa5" + "\xee\x54\xb4\x5d\x50\x6c\xc8\x24\xd7\x57\x32\xb6\xc0\x15\xcb\x8b" + "\x41\xe7\x00\x1f\x94\x5e\x45\x16\xb3\x9d\x63\x69\x2e\x98\xa7\xe2" + "\x80\x2f\xd8\x93\x38\x5e\x9c\xc7\x71\x27\x75\x1a\xb2\x3c\x65\x1e" + "\xa7\x05\xf5\xdc\x37\xf0\x5a\xf0\x42\xf3\x25\xc7\x84\xe4\x58\x9e" + "\x2f\x29\x39\x02\x5d\x16\x7d\xf3\x25\x75\xbf\x27\xa8\xe2\x2b\x2e" + "\xfc\xb6\x30\xbd\x26\xc7\x8b\xfd\xf2\x64\x1c\x0d\x79\xf7\x7b\x21" + "\xfb\xb8\x89\x11\x25\xaf\xc9\x38\xac\xba\xcf\x5e\xa0\xb9\x24\x22" + "\xe3\xf0\x39\x4b\xf9\x2e\x6c\x84\xd7\x64\xd2\x27\xed\x60\x69\x84" + "\xee\x0f\x33\x6d\x17\x16\xf3\x1d\xf7\xa0\xa4\xc5\x42\x87\x71\xaf" + "\x9d\xe3\x4c\x72\x9c\xd2\x09\x11\x4a\x65\x9b\xc2\xee\xe4\x98\x04" + "\x8b\x66\xb3\x4d\xa2\x68\x0a\xbe\x37\x89\x36\xc5\xcb\x0b\x3f\xe4" + "\x7b\xec\xea\x7c\xe9\x38\xf8\x3b\xf5\x6f\xc7\x69\xe1\x7f\xa8\x7d" + "\x19\x43\xd6\x16\xdd\xcb\x67\x4c\x7e\x1d\x06\xda\xc2\xfc\x3f\x7f" + "\xea\xf9\x72\xb1\xf0\x43\x63\x8d\xc1\xf7\xe2\xd4\x79\xd5\x00\x3c" + "\x3f\x2d\x94\xfb\xd2\x03\xba\xe9\xf7\x80\xb5\x28\xe7\x7c\x99\x59" + "\x34\xd5\xe0\xe5\x92\xab\xf9\x6e\xf5\x42\x0b\xb7\x3f\x98\xce\x14" + "\xce\x87\x78\x9c\x2c\x27\xec\x94\xfa\x55\xf7\x25\x06\xce\xbf\x16" + "\xed\x36\xfa\x60\xd0\x44\xf5\xe1\xa7\x29\xdd\xe9\xcd\x87\x07\xfa" + "\xfe\x53\xe5\x6f\x36\x90\x7f\x6b\x0c\x6d\xf8\x3d\x57\xf1\xdd\x22" + "\xac\x29\x9e\x68\x56\xbc\xa8\xd2\x44\x7a\xdb\x13\x1c\x03\x56\xe1" + "\xb8\x98\x0c\x7e\x0f\xb9\x7f\x3a\xd6\x4f\x67\x8e\xa8\x73\xa8\x9f" + "\xa2\xff\x8b\x5c\xaa\xde\xa2\x23\x8c\x4b\xd2\x7e\xc6\xe3\xb8\x97" + "\xe7\x58\x15\xeb\xe0\xa7\x6f\x33\xbe\xf6\x6b\x79\x8c\x7f\xba\x96" + "\xdb\x95\x71\x0f\xfa\x8a\x86\x04\xfb\xb2\xa9\xbb\xaf\x08\xf2\x93" + "\x6d\x42\x3b\xd0\x7f\xa7\x77\xeb\x6d\xee\x32\x70\x65\xdc\x60\x2b" + "\x5a\x42\x62\x71\x72\xfa\x72\xbb\x32\x1e\x53\xd1\x30\xfc\x59\xf0" + "\x37\xf4\xeb\xce\xc7\xb0\x6b\x3b\x03\x15\x1f\xe5\x6a\x2b\xc4\x61" + "\x8e\xff\x85\x75\x41\x67\x15\xf8\x77\xc4\x3a\x2f\x8d\x08\x3e\x6a" + "\x2a\x5c\x45\x79\x58\xdb\x92\xe8\x11\xb9\x3b\x35\xfc\xae\x10\x13" + "\x39\xee\x35\xde\x73\xf4\xf7\x71\xfc\xde\xbd\x42\xcc\x0d\xb9\x8b" + "\x0a\x8c\xb3\x3b\x15\xb3\xa6\xa8\xa8\x3f\xce\x4f\xea\x23\x7c\xcf" + "\x87\x63\x42\x69\x22\xf5\xa9\x4e\x6e\xb7\x90\xe7\x0e\xb4\x87\x72" + "\x98\xff\xe7\xc9\x18\x39\x81\xd4\xeb\x47\xe2\x2f\x69\x8c\x6e\xae" + "\xc3\x78\x75\xa7\x7d\x94\x6b\xe0\x3a\x22\x98\x67\xfa\x9a\xb8\x05" + "\x0d\xdc\x90\x7e\xb8\x4a\xa5\x47\x38\x46\x21\xfb\x20\x86\xdc\x8b" + "\xb3\x0c\x5c\x0d\x1c\xb8\x3d\xbe\x57\x29\xd2\x9b\xdb\x39\x26\x0c" + "\xb7\x17\x58\x53\xc4\x65\xf3\x0c\x7c\xbf\x2e\x2f\x97\xd7\x0a\xc1" + "\x73\x0b\x9f\x27\xd9\x47\x13\xb5\x06\x59\xa7\x2c\xde\x72\xb0\x36" + "\xc8\xf1\x3f\xff\x82\x36\xfe\xa3\x5b\x14\x91\xd6\x57\x94\x74\x8c" + "\xb9\x0e\xca\xb7\x49\xfd\x50\xd9\xfc\x1f\x9a\x98\xce\x31\x80\xff" + "\xc2\x71\x57\x61\x6b\x42\x6e\x17\x47\x9a\xcb\x3a\xf9\x2e\x24\x74" + "\xce\x62\x8e\x13\xda\xce\xb6\x06\xd6\x29\x1c\xbf\x22\x95\x75\x93" + "\x77\xc5\x44\x86\x11\x35\x3b\xc8\xdc\xec\xf8\x7a\xf1\xf4\xfd\xf4" + "\xe4\x44\x25\x3b\x4f\x4e\x34\xe6\x59\x3c\xe7\xc5\x9f\x4b\x3f\x99" + "\x9d\xa8\x73\x1f\x7f\xe6\x99\xd2\xc2\xa5\x0b\xf9\x27\xfb\x9a\xe5" + "\xd7\xa5\xc7\xae\x9d\x59\x0f\xab\x38\x06\x4f\x16\xf0\x3e\xd5\x4b" + "\x23\x8d\x73\xd6\x27\x6b\x8c\xbd\x32\xdd\x9f\xfb\x0e\xb6\xa9\xd9" + "\xf6\x44\x5e\xc3\x87\x65\x2c\x3a\x94\xf2\x99\x85\x4c\x89\xed\x2d" + "\x9a\x5f\x3a\xbf\xf8\x36\x3e\x51\x49\x4f\xd6\xce\xe1\xf8\x76\x9e" + "\xa2\xfe\x76\x94\x1e\x0c\x9a\xb8\xdc\xa6\x11\x25\x22\x2d\x94\xa9" + "\xee\xd2\x3e\x35\xd6\xd8\x03\x49\xee\x07\x77\xc8\x16\xad\xfc\xd8" + "\xcb\xe3\xe2\x5c\x4b\xa6\x77\x56\xb7\x9b\xd8\x46\x29\xc7\x33\xaf" + "\x0d\xa5\x5d\xa4\xc7\x13\x7a\xff\x6c\x3b\xe6\x99\xa7\x1c\xa2\xe2" + "\x90\xcd\x4f\x4f\x95\x0c\x36\x3f\xc5\xfa\x10\xb0\xcf\x59\x07\x3d" + "\x55\x3d\xe8\x79\xbf\xa7\xd5\xa3\xf4\xcc\x53\x9f\x37\xdb\x88\xc7" + "\xfd\xf9\xe3\xf4\xd4\x67\x66\x1b\xe6\x92\xd1\xf4\x0b\x3c\x7f\xce" + "\x75\x39\x2f\x6e\x9c\xbf\x7d\xaa\xde\x0c\x2e\x04\x37\xa6\x08\xf5" + "\x8f\xcc\xfa\x43\x2a\xfe\x4c\x22\x45\x9e\x86\xa5\x82\xc2\xc3\x86" + "\x9a\xc9\x3a\x22\xc3\x72\xe5\x15\x63\x6c\x77\xdc\x3e\x29\xd7\x59" + "\x5e\x06\xe9\x8d\x84\xad\x22\x36\xfe\x55\x4f\xe3\x03\xd7\xb9\x48" + "\xfa\x43\x54\xf4\x34\x26\xc3\x75\x93\x5b\x94\xf0\xdd\x63\x6d\xc4" + "\x70\xbf\x73\x39\x99\xde\xea\xf5\x9b\x38\x06\x3b\xdb\x20\x1c\xa3" + "\xff\x38\x15\x3f\xfb\x01\xd2\xd0\x7f\x87\xd8\x38\xdc\xaf\xce\x3b" + "\x8b\xdf\xd6\x36\x0f\xf7\x0f\xc0\x37\x13\xc3\x77\xbe\x4a\xa6\x5d" + "\xe5\x9d\x26\x9f\xf9\x76\xf2\xd9\x83\xf4\x01\x9e\x93\xd2\x12\x6d" + "\x0a\x8e\xfb\x0a\x18\x75\x6e\xcd\xe3\xfc\x92\x4c\xfa\xfd\x41\xd3" + "\x69\x2a\xfe\xfb\xde\x41\xea\xf1\x7d\xdd\xee\xf4\x3f\x69\x21\xf7" + "\xd3\x18\xff\xbc\x5d\xfa\x9c\x07\xdd\xfc\x34\xf8\xff\x29\x39\xdf" + "\x21\x3f\xda\x2d\x63\xfe\x3e\x3d\xdd\x28\x93\x7c\xde\xe3\x3d\x55" + "\xe1\xe5\x71\x15\x3d\x7f\xef\xe4\xbb\x09\x83\xf8\x31\x0c\xf3\x39" + "\x6e\xe2\x73\xa4\x21\x23\xc2\x94\xe1\x3c\x27\xfa\xa2\x6e\xca\x02" + "\xbb\x9b\xa2\x58\x5b\x46\x7a\x44\x41\x4b\xd7\x59\x19\x9b\x92\xf5" + "\xc7\x9b\x8b\x7e\x6f\xf2\x85\xcf\x78\x7d\x1b\x34\x6a\x85\xfd\xe1" + "\xab\x3d\xe3\x55\x31\x2c\xa3\xd4\x42\x7f\xa1\x16\xc7\xff\x74\xc9" + "\xbd\xa0\x5a\xe1\x62\x3a\xf7\xf5\x88\x39\x3e\xf3\xff\x20\xfe\x86" + "\x08\xeb\x42\xd0\xdd\x7e\x9a\x96\x5c\xfa\x3e\xe0\xbc\xf5\x9f\x80" + "\x25\x63\x5e\x4d\xa6\x0f\xf0\x1c\x72\x2f\x19\x63\xe8\xc9\xa4\xb1" + "\x42\x52\xbc\x9b\xac\x8e\x47\x4d\x1a\x74\x2e\xc7\x26\x83\xae\x9d" + "\xc8\xfd\xc2\x7b\x0e\xbf\xe3\x77\x1c\xff\x5a\xd7\x79\x77\x58\x23" + "\x8f\xb2\x0e\x2e\x60\xfd\x8a\xf4\x39\x75\x3d\x52\x27\xcf\xd6\xdf" + "\xf3\xf5\xf7\xe9\xfa\xfb\x54\xfd\x3d\x4f\x7f\x9f\xc4\xef\x4a\x77" + "\x2f\xd9\xdb\x3f\xaf\x98\x86\xb5\xe1\xdd\x6b\x8c\x05\xf0\x19\x6e" + "\x75\xac\x95\x73\x80\x8e\xc7\x44\x1d\xaf\x1c\xfd\xdd\xc0\xe7\xdb" + "\xd6\xc8\xda\xff\x26\x7c\x9e\xc9\x8b\xc7\xe7\x99\xd9\x31\xf8\x90" + "\xd5\x91\xf7\x75\xf0\xc9\xb4\x72\xac\xfb\x7f\x00\x1f\xc6\x85\xd3" + "\xd0\x7e\x5b\x02\x3e\x7e\x03\x9f\xa4\xfc\xb6\x42\x74\xf2\xfc\xb7" + "\xec\x9b\x32\x46\xef\x30\x9e\xdb\xea\x7a\x8d\x38\x73\x25\x63\x2e" + "\x14\x67\x0e\xb2\x60\x43\x19\xf4\xff\x99\x2e\x7d\x9e\x6f\x52\xf6" + "\x60\xc9\x1c\xc3\xf7\x07\x7d\xdd\x5d\xa5\xfa\xba\x67\x03\xc7\x5a" + "\x5b\x45\xdf\x72\x3a\x44\x27\xd6\x37\xff\xab\xd9\x1e\x88\x93\x81" + "\xe2\xd2\x65\xcb\x9e\xbe\xcd\x5e\x3c\x7f\xc9\x42\xfb\x35\x0b\xec" + "\xcb\x8a\x16\x2f\x2a\x5d\x18\x7f\x1e\x9e\xa9\x7f\x77\x44\xfa\xf9" + "\xb3\xcd\xcd\x32\xc0\xfc\xcf\x7a\x5b\xf9\x66\x3e\x7b\xb9\x70\x97" + "\xb8\x58\xd7\xef\x7c\x91\xcc\x7c\x06\x03\x7c\x3a\x0c\x1d\xaf\x62" + "\xeb\x53\x0a\xeb\x78\xa4\xc3\x86\x7b\xba\x2c\x26\x1d\x65\x9f\xcd" + "\x34\xd2\x18\xbe\xae\x9b\x86\x1d\xa7\x92\xb7\xb9\xcd\xa4\x34\xec" + "\x11\xf5\x98\x5f\x53\xb0\xde\xe2\xb5\xaf\xe0\xb8\x49\x7c\x7f\x0e" + "\xf5\x04\xf0\x91\x67\x8a\xfc\x6d\x1b\x65\xdb\x0b\xc6\x71\x39\xea" + "\xec\x42\x9a\x79\x33\xca\x62\xbd\xd0\xc9\xf5\x90\xbe\x89\xe3\x18" + "\x20\xdd\xa2\xc7\x83\xe2\xb4\xd7\x38\xce\x00\xd2\x32\x63\xd2\xf6" + "\x71\x0c\x73\xa4\xd9\x75\x78\x87\x98\xce\x78\xcf\xd3\xf7\x14\xb8" + "\xcc\x7f\xe8\xed\xba\x62\x71\xe6\x8f\x50\xdc\x74\x43\x8e\x7d\xce" + "\xfd\xdf\x9b\x7c\xfb\x13\xcf\x2c\x59\x94\x4e\x92\xec\xd9\x98\x2e" + "\x73\x6e\x72\x5c\x77\x9b\xbd\x64\xe1\xc2\xa5\xf6\x95\x0b\x97\x94" + "\xda\xe7\xaf\x9c\xbf\x2a\x9d\x16\x3d\xb3\xf4\x09\xbe\x25\xcf\xc3" + "\xb2\xac\xf0\x89\x45\x3f\x65\xa7\x05\x55\x3a\x3d\x6e\x1e\x9f\xc3" + "\xba\x4d\x8f\x2b\x71\xb8\x8a\x6d\x8d\x34\xdf\x6c\x3c\x73\xbc\x25" + "\x1b\x7e\x9b\xf1\xd7\x84\xbf\x46\xfc\x1d\xc5\x5f\xdb\x49\x5a\xc9" + "\xdf\x0e\x68\x08\xb9\x97\x6e\x30\xec\x89\x01\x1e\x5a\x5a\x63\xf0" + "\x10\xe6\xff\x06\x35\xbf\x2d\x3d\xdc\x1a\x91\xf2\xd3\xcf\x53\x55" + "\x3d\x03\x3c\xc5\xf1\x22\x5b\xd9\x27\x67\x05\xf2\xc1\xc3\xbc\x4e" + "\x07\xcd\xd3\x98\x6e\x27\x68\xf9\x7b\x75\x5b\xc5\x11\x8e\x75\x82" + "\xdf\x66\xf0\xcb\x11\x15\x5f\x64\xd9\x54\x94\xbb\x0a\x6d\x34\xa9" + "\x36\xf4\xf7\x51\xe2\x30\xef\x63\x1c\xd7\xdf\xd5\x9a\x7f\xf9\x03" + "\xfc\xcc\xbf\xfa\x59\x98\x95\xfd\x1b\xd5\xda\xd1\xc8\x5b\x76\x4a" + "\x6f\xc3\x0b\x5a\xb8\x76\xba\xa5\xcd\x2d\xd7\x58\xbc\x87\x66\x4d" + "\xb9\x43\x00\x9f\x33\x5a\xea\x23\xed\x32\x7e\xa1\xab\x17\x3a\xe2" + "\xe6\x9b\x7d\x0e\x59\x3e\x85\xf7\xd8\x66\x96\x08\x8d\x63\x4a\x6b" + "\xa9\x4f\xb5\x73\x3d\x61\xf1\xcd\xc6\xdc\x95\xa7\x6c\x01\x8e\x1b" + "\xb7\xec\xb0\x0e\x33\xcc\xb4\x3d\x49\x4b\x57\xa9\xf5\xda\x4a\xfd" + "\x7b\x03\xcb\x8e\x1a\xbe\x72\x90\xd1\x6c\xbc\x77\x18\x3a\xc0\x4f" + "\xcb\xf6\xea\x7e\x4d\x5e\xd5\xff\xd2\x31\xfa\x7b\xa3\x8e\x63\x0a" + "\xc7\xb2\x00\xfe\x6d\x3c\x76\x58\xfb\x36\xe2\xf9\x28\xe8\x73\x44" + "\xd1\xa7\x54\xda\x80\xb0\x6b\x38\xff\x28\x7f\xb3\x03\x79\x47\x55" + "\x9c\x88\x65\x73\xb8\xcf\x03\xbe\x8f\xb5\x79\xc0\xf5\x01\x3e\x33" + "\x84\x2c\x35\xfa\x7a\x58\x3e\x97\xcd\x06\xbc\xbd\x86\xde\x61\x3d" + "\x53\x18\x85\x9c\x4a\xbb\xbb\x74\xa3\xa1\x6f\x06\xf8\xa0\xb4\x3e" + "\x99\x2e\x49\x36\xee\xfa\xd8\xa4\x09\xf7\xb3\x1d\xc0\x69\xaf\x1c" + "\x03\x8e\xa7\xd9\xd3\x6f\xdf\xf7\x29\x1d\x59\x1a\xec\x5f\x8b\xe8" + "\x78\x70\x9c\x6e\x3f\xe3\xd6\x2b\xcf\x71\x75\xbd\xb1\x7c\x8c\xa1" + "\x37\x0c\x38\xd6\x14\xa1\x59\x1d\xf8\xcf\x73\xa8\x91\xf7\x90\x79" + "\xbe\x94\xf6\x08\xe0\x8c\x38\xa7\xee\x30\x69\x15\x87\x1a\xfd\x54" + "\x7a\x14\x3a\xc6\x2c\x6d\x4e\xf7\xb3\xa1\x01\x5d\xb4\xbc\x24\x16" + "\xa6\xb0\x1c\x6a\x64\xb8\xac\x8f\xd8\x26\x29\x8c\x9a\x39\x8e\x48" + "\xa3\x3e\xbf\x40\x07\x2f\xaf\x37\x70\x05\x0d\x0f\x1b\xf8\xea\xdf" + "\x4a\x3a\xec\xa7\xe5\xc0\xbd\x8f\x7d\x79\x9b\xd5\x78\xae\x94\xfa" + "\x06\x79\x7b\x50\xf7\x98\x9f\x9e\xcd\xd1\x65\xe8\x08\xea\xef\x39" + "\x58\x3e\x15\x65\x96\x87\x75\x7f\xd4\x36\x8c\xef\xd1\x01\xde\x5f" + "\x7a\x2a\x66\x3f\xe0\xa8\x1a\xc3\xdb\x5d\xc7\x69\x45\x6e\x4c\xba" + "\x3e\xb6\x07\x67\x23\xfd\x94\x5a\x5b\x1f\x72\xa8\xfa\x2b\x94\xef" + "\xae\x8e\x23\xeb\x02\xbe\x6f\xc5\x32\x2e\x69\x2f\xc7\x78\x45\x89" + "\x31\x5f\x00\x56\x83\xa4\xf9\x28\xd1\xc4\x74\x52\xf1\x1a\x96\x8e" + "\x52\x74\x5a\x51\x13\x47\x7b\x9e\x37\xd1\x0e\xd3\x69\xc4\x3a\xa1" + "\x8d\x08\xa6\x88\xc2\x55\x66\x19\x47\x93\x65\x9c\xcf\x5e\xc0\x1f" + "\xd2\xae\x52\x74\x5b\xd1\x6e\xd0\xcd\x18\x3b\xa6\x93\x9f\x56\x4c" + "\x67\xda\xc6\xf7\x71\x58\xdb\x71\xa3\xef\xa0\x29\xef\x07\xe3\xbd" + "\x4b\x97\x8b\x23\xde\xd1\xec\x0b\xb0\xf4\x8b\x83\xe6\xef\xd1\x41" + "\xc7\x44\x52\xb4\x5d\x99\xeb\xa7\x92\x9a\x98\x75\xc3\x61\xa6\x2f" + "\xcb\x0a\xf0\x6c\xd0\x63\x27\x1d\x56\xfe\x28\x4b\x39\x26\x6d\x83" + "\x94\xe5\x15\x32\xc6\x05\xc7\x5d\x6d\x63\x1a\xb1\x5e\x64\x59\x62" + "\x19\x60\x79\x52\x34\x5a\xb9\x25\x86\x46\xcd\x4c\x1f\x9d\x4e\x0d" + "\x09\xba\x7c\xa1\xbd\x78\xb2\xd2\xc5\xf6\xec\x6b\x16\x4c\x90\x81" + "\x4a\xec\x77\x4f\xb9\xcd\x3e\x7b\xf2\x35\x8e\xa2\x71\x33\xd5\xcf" + "\x94\xd9\xf9\xfc\x9b\x1e\xbf\xee\xb2\xa3\x9d\x48\xfc\xda\x6d\xad" + "\x47\xe9\x0f\x47\x96\x3f\x65\xa8\xdc\x7b\xe0\xb8\xa1\x55\x4b\x88" + "\xa2\xc0\x7b\xf3\x49\x8c\xa9\xe5\xd0\x1c\x8e\x53\x3b\x0b\x6b\xc6" + "\x99\xe7\xc4\x97\x75\xc8\xdb\x89\xf4\x11\x25\x1c\xeb\xfe\xaf\x42" + "\x4b\x3b\x34\x87\xd7\xf6\xa2\x62\xbf\x2d\x90\xd6\xd3\x88\x3f\x57" + "\x20\xed\xa3\xcc\x69\xd7\x39\x05\xe0\x16\x1b\xfd\xe2\x3d\x00\xd0" + "\x69\xce\x2c\x87\x88\x32\x8d\x0a\x1d\x1c\x4f\x1a\xb0\x53\x79\x0f" + "\xc0\x81\xfe\x17\xb7\xa9\xf5\xa5\x03\xfc\xbf\x74\xa2\xae\xcb\x66" + "\xe3\x9d\xe3\x5f\xcc\x96\xe3\xea\xb6\xc9\x38\xd4\xda\xfa\xeb\xef" + "\xc3\x7a\xc0\x65\xc0\x04\xac\xa1\xfa\x39\xb6\x84\xf7\x75\xfd\x22" + "\xb5\xca\x3f\xe4\x5b\x53\x54\x5c\x3f\xc8\xb8\xab\xce\xa4\x15\xf4" + "\xfb\x3d\x20\x6f\xc4\xba\x4c\xf6\x8b\x28\x00\xef\xb9\xb8\x8c\x91" + "\x57\xe5\xd6\xfc\x55\x26\x2d\x8c\x71\xcc\x54\xf6\x73\x17\xeb\x4f" + "\xac\x2d\x57\xf5\xef\xff\xcb\xf9\xd0\x44\x2e\xb5\x9e\x59\x25\xf7" + "\x7d\xce\xba\xcd\x04\x9d\xdd\x75\x75\x96\x5c\xa3\x84\x35\x77\x0a" + "\x29\x5f\xd4\x55\xf7\x1a\x3a\x96\xcf\x93\xac\xeb\x44\x80\xf7\x12" + "\xad\x11\x11\x90\x31\xd3\x79\xee\xa0\x93\xe4\x2b\x0b\xb9\x38\x56" + "\xab\xb4\x81\xd0\xae\x9a\x37\xa2\x6a\xde\x40\xfb\x81\xd4\xeb\xe7" + "\x61\x7e\x48\x39\x49\xab\xec\x8c\x3f\xd3\x86\xf7\xab\x35\xd0\xca" + "\xc7\xf3\x24\xd3\x27\xfd\xff\x39\xc2\x3e\x0d\xdc\x57\x6b\x04\x7d" + "\x8e\xed\x97\x49\xf3\x6f\x76\xa3\x5f\x26\xf4\xcb\x71\x8a\x65\x26" + "\xcc\xbe\x26\x90\xb7\x51\x32\x1e\xb1\x5c\x3f\xaf\xce\x8b\xed\x23" + "\xeb\x7f\xd5\x87\xd5\xf3\x93\xf5\x51\x98\xb8\x8f\x4c\x83\xd5\xb7" + "\xe8\xf2\x26\xf1\x64\xfd\xd1\x45\xab\x82\x23\xd6\xb1\x8f\xc7\xa1" + "\x39\xd0\x6f\x53\x78\x0c\x31\x7f\x56\x33\x9e\xc9\xc6\x8b\xe1\x29" + "\x58\x6b\x60\x43\xbb\xe6\x01\x97\x23\xc9\xe9\xbd\xfa\xd4\x85\xe9" + "\xbd\xfa\x43\xae\xcf\x78\xb0\xcf\x8b\x35\x82\xc5\x3a\xf8\x16\xeb" + "\x35\x4f\xb2\x76\x47\xac\xab\x67\xbc\x92\xe6\x09\x96\x17\x5d\x07" + "\x81\x0f\x05\xe4\x44\xb0\x4e\x0a\xb9\xd7\xf4\xef\x7f\x59\x53\xec" + "\xa9\x52\x3f\x98\x44\x75\x32\x18\xd6\x75\xd5\xec\x63\x32\x05\xed" + "\x27\xcd\xd7\xf8\x3b\x0c\x9e\x43\x79\xda\xfa\x7f\xb9\xda\x9a\x42" + "\x77\x04\x52\xff\x25\xdd\xea\x88\x8c\x65\x1a\x02\xa6\x03\x72\xbc" + "\x9c\xd7\xa9\x6a\xef\x62\x0d\xec\xff\x8d\x72\x5d\x1a\x48\x3b\x94" + "\xa7\x62\x85\xad\xc1\xfc\xf7\x52\xff\x1e\x6e\xc8\x5d\x66\xf6\x53" + "\xc7\x18\x25\x97\xdf\xda\x26\x2a\xff\x74\x4c\x73\x5b\x85\x7d\xb5" + "\x15\x76\x64\xd9\x0e\x4d\x70\x5c\xfe\x3f\x1d\x1b\xe0\x13\xe5\xff" + "\x62\xf0\x09\xea\x4f\x4d\xce\x03\x65\x0b\x2f\xcc\x03\x65\x72\x6f" + "\x96\xe9\xae\xd6\x2a\x65\x1b\x0d\x3b\x45\xac\xff\xd6\x36\x7b\xb9" + "\x6c\xdf\xae\xda\x66\x9a\xe4\xf1\xb9\x44\x3e\xe8\xe2\x42\xd9\x46" + "\x43\x0f\x30\xbf\x58\xa3\xfc\xcd\x02\x92\x3c\x8d\x3c\xd8\x3f\x25" + "\xd9\x6a\xbf\xf4\xa3\x1a\xf9\xdd\x3d\xf7\xca\xbd\x01\x67\xd1\x76" + "\xf6\x57\x0d\xa6\x1d\x6a\x42\x99\xb0\x9f\x3e\x90\x31\x49\x31\x07" + "\x37\x00\x46\xe3\x96\x91\x98\xa3\x95\xdf\x56\x06\xcb\x34\xc7\xf8" + "\x61\xb9\x46\x5a\x16\xf0\xe6\x78\x3f\x58\xef\xac\xcd\xe9\x9f\x97" + "\xdc\x79\xd0\x15\x42\xfa\xe9\x60\x5e\x1a\xd3\x0d\xda\xbd\x6c\xd2" + "\x76\xf7\x4c\xb0\x11\xf7\xb9\x67\xfd\xe8\xdd\xcf\xdf\x40\xe6\x3f" + "\xd8\x1e\xa7\x92\x9b\x28\x6b\xdd\xf7\xcc\xf4\xbf\x73\xc9\xc4\x74" + "\xf0\xd3\xda\x3c\x45\xbb\xb5\x2e\x63\x7c\xfc\xb4\x46\xee\x8b\xf2" + "\x5e\xe3\xac\x88\xf8\x52\xed\x87\xae\x85\xfe\x7b\xd2\xa6\xf2\x1d" + "\xe7\x9d\xff\xb3\x3d\x6f\x5f\xbc\xcc\xbe\xe0\x99\x95\x4b\xae\xba" + "\x2a\x6e\xad\x64\x96\x77\x58\xdc\x6b\x1b\xd4\x7c\xba\xb6\xd3\xc0" + "\x9b\xed\x12\xbc\xa3\xff\x2b\xcf\xdb\xb7\xcc\x2f\xd4\xdd\x94\x0b" + "\x73\x68\xe0\xf9\x46\xca\xbf\x31\xe6\xf5\x66\xca\xbf\xe9\xe6\xc2" + "\xfb\x16\xce\x5f\xb0\x2a\x26\xf5\x96\xd8\x7d\xbd\xaa\x6d\x68\x3b" + "\x75\xf4\x5d\xd0\x15\x29\x33\xd7\xf0\xdc\x52\xfe\x69\x79\x44\xfc" + "\x0d\xfa\x9a\xe3\x00\x17\xb6\x94\x46\xa8\x05\xba\x4c\x7c\x8b\x75" + "\xf8\x30\x75\x37\x0f\xf6\x14\x78\xcb\x8a\xbe\x07\x60\xd7\x9d\xe3" + "\xfd\x99\x13\xe4\x4c\x69\xad\xe1\x98\xbc\x1f\xd9\x94\x8d\x51\xde" + "\x84\xf4\x4b\xf1\xfb\x39\x7e\x87\xe2\xf7\xef\xf6\x25\x58\xf7\xb0" + "\x2f\xf4\x0a\xf6\x85\x2e\x97\xbe\x1e\x37\x04\x5d\x74\xc3\x52\xb6" + "\xd9\xcb\x4b\xd9\x06\xf1\x93\x93\xbf\x8b\x47\x5c\x16\x69\xef\xd9" + "\x9f\xa4\x1c\xfe\x15\xf2\x0c\xa9\xbc\x49\x54\x7c\x64\x13\xdb\x0b" + "\xf8\x1b\x57\x63\xd1\xe6\x55\xa9\x29\x9f\x51\xaa\x6d\x58\x28\xe4" + "\x76\xb2\xff\xd3\x51\xa6\xd3\x60\xdf\xd0\x64\x3a\x27\xda\x87\x03" + "\xb6\x61\x25\x49\xfb\x56\xb7\xe7\x76\xca\x79\xc1\x59\x1a\x63\xd3" + "\xf1\x99\x60\xba\xb2\x4f\x44\x54\xd9\xa7\xce\x2d\x86\x1c\xe0\xb9" + "\xde\xe0\xd3\xb8\xf8\x68\x4b\x4a\x17\x2e\x5d\xb8\xc0\x7e\xcd\xb2" + "\x74\x8a\x89\x8e\x56\xb4\x70\x89\x7d\xe9\xc2\x67\x97\x2f\x5c\x26" + "\x23\x9b\x71\x6e\xdc\x9c\x9f\x25\xd2\xff\x98\x6f\xdc\xdb\xb1\x8f" + "\x66\xfa\xba\x86\x70\x4c\x2d\x51\xf9\xc7\x23\x7c\xf6\x2b\x6d\x94" + "\x8c\xe1\xe1\xf8\xf5\xc6\xba\x1a\x65\xe7\x7d\x64\x51\x6b\x9d\x75" + "\xe3\xf9\xfd\x38\xb9\xf6\x0e\xc4\xef\x76\xcd\x07\x2d\x4d\x8a\x6e" + "\x16\x7f\xc8\xed\x2a\x30\xe8\xe6\xa7\x75\x7e\xdd\x96\xea\x92\xfa" + "\x03\x73\x2c\xf4\x5f\xdc\xfc\xaa\xbe\x9d\xe9\x62\xfd\x9b\x2a\xf7" + "\x7b\xd3\x3e\xca\xe0\xb6\x18\x26\xda\xf3\x63\x7c\x2c\xd0\x9b\xac" + "\xdf\x3c\x06\x3c\xb4\x39\x9d\xdb\xd3\xd7\x41\xdf\x38\x49\xeb\xec" + "\x52\x3f\x7a\x3e\xca\x60\x9d\xc2\x67\xa7\x5a\xc5\x47\xfa\xb7\xd2" + "\xd6\xf9\xd9\xc6\x94\x31\xe4\x01\x8b\xf7\x69\xa1\x1b\xc6\xf0\x77" + "\x56\x39\x4d\xc5\xf6\x72\xee\xe1\xbd\x61\xb4\x05\xf9\x58\x67\x1b" + "\xf0\x4d\x5f\xe7\x67\xbb\x93\xe1\xfa\xc9\x75\x8c\xe1\xa9\xd8\x65" + "\xeb\x26\x81\x77\xa6\x0e\xd8\x4f\xeb\x5c\x31\xeb\x32\xc6\x47\xe2" + "\x19\x04\x2e\x32\x4e\xa6\xf2\x1d\x94\xfd\x66\xfd\xb9\x45\xef\xbb" + "\xd1\x1f\xc0\x83\xfe\x73\xe6\x18\x67\xcf\x7e\xbd\xdf\x8c\x1f\xe3" + "\x1e\x8b\xb3\x8e\x6f\x23\xe3\x8b\x7a\xcd\x31\xb2\xcd\xfb\x32\x43" + "\x90\xd6\x3e\xe0\x93\xec\xb2\x27\xea\x8d\x67\x96\xd8\x8b\x17\x2f" + "\x79\xaa\x70\xe5\xfc\xa7\x16\x16\x2e\x2f\x19\x67\x5f\xbe\xe4\xf1" + "\xe2\x67\x9e\x78\x8a\xb9\x66\x59\xe9\xf2\x27\x9e\xb2\xb3\x66\x29" + "\x9c\x9a\x9f\x5f\x78\xd7\x03\xf7\x3f\x94\x4e\x77\xcd\x47\x1a\x56" + "\xfe\xf9\x39\xe3\x54\xd6\x7d\xd3\xa6\x3c\x58\x38\x65\xd6\x03\x33" + "\xe7\xc8\x4b\x0b\xfd\xf9\x53\x97\x24\x2f\x10\xc7\x87\x99\xe0\x25" + "\x33\xc6\x77\xc8\x71\x7a\x6e\xae\x8a\x77\xed\xde\x18\x1f\xef\xda" + "\x8d\xb5\xac\xdb\x8b\xbf\x63\x44\x1b\x32\xf1\x87\x75\xea\x73\xb3" + "\x15\x7f\xa5\xdd\x13\x72\xbb\x1b\x07\xf8\xeb\x39\x19\x53\x89\x7d" + "\x39\xd4\xfe\xac\x1b\xfa\xdf\xd9\x1e\x9b\x37\xb0\x9e\x74\x07\xfa" + "\xd7\x93\xfd\x3a\x65\xfd\x18\x63\x6d\x89\xb4\x4c\xac\x2b\xd3\x78" + "\x5d\xa9\xf6\x93\x9e\x7b\x54\xf2\xd4\xa0\xf2\x6d\x21\x63\x5d\xc9" + "\xb2\xcd\x67\xc5\x6a\xfd\xb1\xbe\x20\x56\xc6\x65\x8c\x45\x5d\xc6" + "\xb9\x9e\xdc\xbf\xcb\x18\xde\xc1\x7b\xda\xb0\x8f\xcd\xb0\x15\x30" + "\x7f\x85\x84\x18\x3e\xbc\x43\xc7\xa9\x86\xf7\xb8\xd9\x6e\xd6\xf9" + "\x69\xc4\x49\x5a\xff\x89\x70\xaf\xeb\x52\x6b\x4a\xf7\xb7\x59\xaf" + "\x8b\xf5\xa3\xef\x9a\x15\x95\xf1\xe8\xc0\xb3\xeb\x8f\x0c\xf0\xec" + "\x73\x73\x99\x17\x06\xd6\xb2\xeb\xe3\xf4\x7f\xb7\xfc\x56\xe3\xfa" + "\x88\x71\x5f\xbf\xf4\x2a\x32\x99\xaf\xaa\xa6\x2d\x26\x81\xf9\x68" + "\xfd\x1e\x6e\x83\xe9\xe9\x27\xf7\x61\x94\x35\x0f\xd0\x6f\x43\x4e" + "\x3f\xfd\xf4\x7d\x16\x63\x8f\x45\xe1\xfd\xdc\xa3\x83\xd1\x2a\x39" + "\x9d\x36\xb8\xbe\x92\x4e\x6e\x1a\xc2\x32\x69\xd0\xeb\x7c\x5a\x6d" + "\x68\x3e\x9f\x56\xcf\x5d\x1e\x43\xab\xc9\xe7\xd3\x6a\x43\x38\xe6" + "\xdc\x47\xdf\x47\x79\xee\x51\xa6\x19\xf3\x18\xfa\xbd\x07\x7c\xb6" + "\x7e\x80\x7e\xcf\x65\x9f\x4f\xbf\xe7\x26\x25\xa7\xdf\x86\xf6\xab" + "\xe3\xe1\x54\x24\x9b\x37\x46\xac\x33\xe9\xf7\x79\x9e\x7b\xbb\x79" + "\x8c\x5c\x93\x86\x5f\x32\x69\x45\x2f\xb9\xf1\x87\x5f\x5e\x47\x0c" + "\xd8\xe2\x22\xac\xd3\x77\x6f\x33\xd6\xbc\xbc\xaf\x74\x81\xb9\xe8" + "\x98\xb1\xe7\x81\xe7\x76\x5e\x3b\xcf\x8a\xde\x21\x38\x9d\xe9\xc9" + "\xdf\x8a\x02\xbf\xb7\x2b\xbb\xf4\x5f\xa9\x7f\xcf\xe5\xda\xa7\xf3" + "\x52\xd7\x91\xfd\x60\xed\x4d\x9c\x6e\x03\x0f\x49\xdf\x27\xf9\x2d" + "\xd5\x41\x60\x16\x46\xf3\x68\x10\xb8\xfd\xfc\x3f\xd8\x9d\xd6\x04" + "\x7d\x54\x34\x7f\xc9\x82\x67\x16\x2d\xfa\x6a\x55\x14\xeb\x3f\x56" + "\xed\xd6\x3c\x21\xfe\x56\xe2\xfa\x27\x57\xa3\x4d\xb6\xff\x2d\x6a" + "\xde\xfc\x57\xe8\xbf\x9f\x36\x29\x5b\xf2\x91\x4e\x75\x8f\xf7\xf9" + "\x89\x31\xfa\x19\x3c\xf2\x7c\x9e\x70\xff\x6b\xd9\xc0\x18\x3f\x9f" + "\x71\xfe\x18\x3f\x6f\x4f\x3e\xc6\xcf\x4f\xd5\x56\xf0\xbd\x8a\xe7" + "\xb1\xfe\x59\x22\x6d\x4d\x7e\xe7\xf3\x72\xac\x99\x3b\xb1\x5e\xee" + "\x9a\xb5\xca\x7b\x47\xe1\xaa\x14\xf6\x07\x97\xdf\xce\x88\xf4\x88" + "\x0e\x3e\xb3\xe6\xf3\x31\xfe\x76\x06\x7f\x33\x87\xbf\xa1\x2a\xcb" + "\xe0\xb9\xea\x04\xc9\xb5\x23\xf2\xed\x75\x27\xe4\x37\x7e\x61\x2b" + "\x3c\x5f\x6f\xd8\xd6\x56\x4c\x6f\x7c\xbf\x78\xb3\x1a\x8f\x76\x1e" + "\x0b\x6e\xaf\x70\x95\x57\xb5\xd1\xc3\xdf\xc7\x22\xab\xb2\x21\x9e" + "\x6f\xbf\xe0\xde\x7d\x5a\xcf\x60\xb1\x6a\x21\x2f\xae\x61\x2f\xa9" + "\xd8\xd3\xec\xd3\x18\x30\x7c\xea\xd8\xbf\x2e\xe4\xf6\xe4\x24\xfa" + "\xe7\x29\x1f\x13\xcf\x74\xc3\xb7\x07\xcf\x73\xfa\xd7\x03\xfc\xbd" + "\x15\xac\xe3\xec\xe5\xeb\x86\x9e\x26\xcf\xe5\x75\x83\xec\xa1\x1b" + "\xf7\x89\x75\x1f\xb8\x61\x80\x51\xd3\xef\x17\x84\x77\xd6\x17\x03" + "\xbe\x7d\x9e\x06\xc3\x37\x4c\xfa\x03\x62\xee\xe5\x6f\xba\x9c\x20" + "\xcf\x27\xf2\x1b\x32\x57\xf3\xfe\xb7\x27\xd8\x2c\xfd\x12\x3d\xfe" + "\x58\x5c\x74\x3c\x5e\xe3\x3d\x5a\xce\x8f\xc5\xc5\x31\x7f\xf9\xe2" + "\x09\x8e\x45\x8b\xed\x4f\x14\x2d\x2e\x29\x5c\x2c\x63\xc0\xca\xf0" + "\xb2\xa5\xab\x4a\xf8\x44\xe2\xba\xf4\x84\x39\x4c\xf7\x21\xec\xf7" + "\x95\x92\x7e\x84\x15\x0f\x81\x1e\x26\xe5\x47\x58\x99\xaf\xe6\xf5" + "\x8a\x05\xe7\xfb\xcc\x54\xf4\xfb\x7f\x81\xaf\x32\xb7\xa8\xd8\xf3" + "\xba\x9f\x0d\xf3\x5d\x45\x4d\x92\x3a\x7b\xfa\x7d\xc6\xd8\x77\xa9" + "\xaf\x40\xde\xf7\x90\x71\xc2\x5f\xe4\x71\xab\x20\x9f\x63\x1a\xc7" + "\x3a\xd5\xf9\xb9\xe2\x98\xc1\xcf\x86\xbf\x21\xc3\xe2\xfb\x26\x13" + "\xc2\xb1\xbe\x46\x95\x77\x62\xce\xb3\xf5\xf7\x63\x8d\x89\x18\xf7" + "\xa0\xc9\x0b\x3c\x2a\xed\x89\x78\x00\xbf\xab\x90\x9e\x3b\xe0\xcb" + "\x65\xf4\xb3\x32\x1f\xcf\xe7\xd9\xaa\x77\x4e\xcb\x87\x51\xba\x6c" + "\x61\x69\x3a\x4d\x99\x5f\x5c\xcc\x72\x3d\x7f\x61\xf1\xf2\xa5\xcf" + "\x2c\x2b\x5c\xbc\x64\x31\x52\xef\x5c\xc4\xa1\x79\x65\x91\xdb\xf4" + "\x1c\xfb\x92\x85\x0b\x17\xa8\x24\x7d\x18\xe2\xcf\x81\xd4\xd9\x7d" + "\x65\x93\x9f\x3c\xa5\x03\xf6\xd7\x0b\x59\xc2\x54\x59\x80\xbf\x27" + "\xa4\x4c\x4b\xdb\xa8\xd2\x1f\xbf\xee\xa9\x0c\x18\xfc\x20\xc7\xcf" + "\xc9\xfe\x3e\xcd\x6f\x77\x0b\x79\x6e\x82\x31\xdb\x38\x8d\xbf\x8f" + "\x8d\x35\xd9\x54\xb6\xf7\x07\xe0\xbc\xd0\xaf\xff\xf9\x7e\xfd\x7a" + "\xe5\x27\x60\xe6\x6f\x7a\xf2\x3d\x7b\xe4\x83\xff\x9f\x8f\x28\xfe" + "\x7f\xa1\x9f\xff\xbb\x4d\xa9\x58\xc3\xbd\xb0\xc0\xb0\xe7\xe3\x65" + "\xe6\x85\xb2\xf3\x65\x89\xfd\x3f\x5f\xd8\x62\xd0\xd6\x18\x67\xc5" + "\x5b\x1b\x6f\x34\xf6\x61\xeb\xf4\x38\xf1\xfc\xcc\x75\xd9\x56\x17" + "\x23\x86\xdf\xc1\xfe\xec\xc7\x69\xa3\xce\x2f\x2f\x1c\x8b\xf1\xcb" + "\xca\x3c\x49\x2f\x44\xd4\x38\xbd\x10\x34\xf0\xf3\xd3\x0b\xf2\x3c" + "\x80\x61\x28\xd9\xaf\x5c\xa5\x78\x67\xa3\xcd\xa0\x2d\xaf\x8b\xf1" + "\x9e\x3d\x60\x5b\x54\x1e\x96\x3e\x12\x2a\xce\x40\x1f\xf7\x1f\x70" + "\x76\x1b\x70\x50\x16\xfd\xb7\x34\x1b\xb4\x32\xca\xc4\xf2\xc4\x94" + "\xf9\x25\x58\xb4\x2e\x5e\xb4\x68\xe1\xd2\x65\x46\xec\xe5\xec\x67" + "\x8a\x17\xa8\x58\xcb\xb7\x61\xf8\x57\x42\x02\x27\x73\xb8\x66\xa4" + "\xaa\xc7\x04\x1b\x72\x1c\xef\x33\x48\xdf\x3d\xb9\x8e\xf9\xd9\x8d" + "\x3b\xf5\x35\xcd\x71\xda\xd4\xac\x7c\x5f\x36\x3d\xa7\xec\xc5\x4b" + "\x9e\x05\x4e\x9d\x86\xbd\xc8\xfb\x97\xdd\x64\x0f\xf3\x3d\x22\xf6" + "\x5f\xde\xb1\x55\x74\xf0\x7e\x65\xc8\xbd\x29\xc3\xf8\x3e\x17\xdb" + "\x22\x9b\xd4\xb7\xcd\x03\xde\x25\x1c\xdb\xfe\x67\xf7\x6a\x15\x87" + "\x72\x44\x7a\xc3\x3c\xd8\x3c\x19\x2c\x0b\xc3\xbb\x38\xee\x3d\xc7" + "\x03\xda\x54\xc0\xb6\x12\xeb\x17\x8e\x61\xdf\x41\x9b\xb2\xb1\xbe" + "\xc9\xf4\xd3\xcf\xe6\x04\xd2\x0e\xe5\x6c\x58\x4d\x16\x6e\x03\xba" + "\xc9\xdf\x5c\xcf\xb4\xdd\x54\xfa\x21\x74\x8f\xbe\xbf\xeb\xe7\x76" + "\xfc\xb4\x29\x4f\xdf\x4b\x9f\xaa\xef\x5d\x4e\x45\xb9\x5a\x3f\x0d" + "\xd7\x63\x82\xef\xfb\x9f\xdf\x75\x91\x83\xbf\xdb\xa7\x62\xf9\xb4" + "\x7a\x84\x67\x5f\x3b\x7f\x1b\x0f\xf6\x15\xd6\x10\x1b\x3b\x45\xc5" + "\xbe\x76\x15\x07\x9c\x79\x65\xf3\x9d\xca\xb7\x78\x63\x3b\xd3\x00" + "\x70\x67\xeb\x70\x67\x03\x2e\xc6\xff\x5b\xf3\x14\xaf\x6e\x26\xa3" + "\x0d\xcc\x29\x01\xd8\xa2\xc4\xf6\x28\xf0\xce\xc6\xdf\xb8\x2a\x79" + "\x3e\xed\xc7\xba\xc5\x2a\xd8\x6f\x68\xe0\x1b\x64\x9b\x73\x8d\xf9" + "\x85\xdb\xd6\x71\xe7\x7b\xe8\x16\xde\x3b\xd3\xdb\xca\xe7\xf5\xb5" + "\x01\x13\xef\xd9\x5a\xcf\xa9\x7a\xc0\xb4\x60\xae\x0c\xe8\xdf\x9e" + "\x1a\x57\x75\x96\x7d\xcc\xfc\x98\x0b\xaf\x14\x85\x91\x4c\x3e\xd7" + "\x19\x6e\x7c\xdb\xab\xee\x2c\xd3\x6b\xf3\xae\x81\xf3\x1a\xd4\x07" + "\xfd\x21\x0f\xae\x0e\xda\xfc\x1e\xb7\xcb\xb2\xc0\x63\xd9\x8b\xb1" + "\xe1\xef\xc4\x8b\x9e\x53\x7b\xb1\xce\x1f\x0e\x1a\x7c\xc6\x63\xc4" + "\x67\xac\xec\xfb\x85\x34\x2b\xc7\x22\x3f\x4e\x9b\x5b\x78\x7c\x18" + "\x17\xd0\x30\x37\x12\x2a\xf8\x21\xdf\x47\x65\x7d\xb8\xb6\x0c\x76" + "\xec\x22\xd6\x25\xd5\xf7\xf2\xba\x98\xbf\x21\xc3\xcf\xce\x05\x42" + "\x93\xe3\xbb\x9a\xc7\xb7\xfa\xde\xb5\x9d\x42\xfb\xd2\x4d\xe2\x70" + "\x90\xe8\x4b\x13\x45\xc2\xa6\x14\xc6\xdb\xe4\x3c\xc5\x77\x66\xeb" + "\xa1\x87\x3d\x84\x76\x2d\x9b\x57\x53\x26\xdf\x31\xe6\xef\xa3\xb4" + "\x06\x6b\xa9\xb5\xa4\x96\xfe\x14\xd9\x42\xde\x15\x1c\x33\xa2\x3a" + "\xfc\x91\x63\x0b\x9f\x5b\xa5\xe1\xf9\x5d\xfb\x83\xdc\x56\x55\xf5" + "\x47\x47\xff\x4c\x1f\x79\xff\x4c\xf6\x87\xe5\x7b\xfd\x91\x82\x3f" + "\xd1\x91\xbc\x3f\x91\xb3\x43\x68\xbc\x56\x2a\x7f\x9a\xdb\xf0\x00" + "\x56\x3d\xdf\xcd\xcd\xd4\xba\x6d\xe9\xe8\xbf\x99\xf7\xe4\x5b\x83" + "\x01\xf2\x2e\xf9\x2d\xe3\x78\xd5\xce\xb3\x64\xf1\x2e\xf9\xbd\x7c" + "\x56\x6b\x98\x53\xf5\xbe\x05\xed\x6c\xa7\x45\xf8\x2e\x32\x9f\xf3" + "\xc1\x6e\xd7\xaa\x18\xc7\xa8\xc2\x9b\xbf\xa5\x6e\xd4\x87\x1d\xa7" + "\xd7\xaf\xea\xe0\xfa\x3b\x98\x1e\xc0\xa9\x65\x8e\xa2\xc9\x91\x76" + "\xd0\xf4\x41\x9d\x3e\x05\xb1\xf4\xa9\xca\x63\xfa\x70\x1c\x4b\x0d" + "\xe3\x05\xdc\xf2\x40\x03\xcd\x68\x03\x38\x5b\xf4\x7d\x51\xcb\xe6" + "\xb3\x94\xe1\x5d\xc2\xdf\xc7\xaa\x7e\xc3\x3a\xdb\x6c\xd1\x7a\x4e" + "\xef\xad\x3a\x47\x66\x1e\x37\x3e\x0b\xa9\x92\xf9\x92\xe6\x1e\x1e" + "\xb3\x40\x5a\x73\x3d\xfe\x76\xe1\x6f\x37\xf3\x1d\x7e\xf7\x60\xbc" + "\x3c\xc0\xc1\x8e\xb1\xaa\xe7\x5f\xc5\x8b\xfb\xda\x39\x56\x83\xbe" + "\x2e\x19\x48\x87\x1c\x45\x84\xfc\x1e\x2d\x64\xa6\xda\xae\x41\x8e" + "\x78\x5f\x64\xe7\x8b\x94\xa1\xb9\x37\x16\xef\x80\xae\xab\xc5\x5c" + "\xba\x73\x24\x65\xf2\x5e\xe1\x36\xe9\x8b\xfe\xb3\xb1\x86\xee\xab" + "\x1c\xc5\xf7\xdb\xaa\x67\x9b\x78\x2f\xc5\x73\x68\xba\xce\xe7\xd3" + "\x51\x06\xfa\x7f\x94\xfe\xfd\xb1\x4d\xd2\xef\x98\x65\x7f\x30\x1b" + "\x1d\xf6\xe1\x11\xb1\xbd\x80\xf8\x4c\x25\x63\x9d\x08\x64\x74\x58" + "\x45\x6b\xf0\x88\xbc\xd7\xd8\x1a\x8c\xca\x33\x15\xe4\xa7\xcc\x0c" + "\x06\xac\xb0\x27\xdb\x98\x76\x46\x3a\x9f\xc7\xf0\x5e\xd5\xcc\xa0" + "\x08\xcc\x5a\x65\xe5\xef\x03\x8e\x91\xfb\xf1\x7a\x7a\xab\x0d\xb6" + "\xf8\xaa\x80\x15\x7d\x8f\xf4\xc3\xea\x2e\x48\x65\x79\x43\xd9\xac" + "\xfe\xb2\xdd\x05\x66\xfe\xee\x2d\xb7\x19\x93\x36\x64\x96\x03\x75" + "\x79\xac\xf4\x34\x65\x87\xbe\x98\xdd\xbf\x4e\xe3\x78\x8d\xdd\x98" + "\x37\x97\x15\xa4\x68\xdd\x05\xa6\x28\x60\x83\xf7\x33\xe5\x77\x0a" + "\x23\x01\xfd\xbb\x3f\x9d\x90\xdf\x76\x12\x9b\x46\x70\x39\x33\xc3" + "\xe5\xbb\xf1\xfc\xbd\x04\x31\x3c\xd3\x93\xdc\x8f\xad\xaf\xd1\x5b" + "\xfe\x30\xf8\xe9\xa5\x1c\x96\xe7\xa8\xe5\x0f\x93\xec\x4f\xb2\x7d" + "\xf2\xe2\xbf\x33\x3d\xa3\x90\xb1\x68\xda\x1f\x26\x4d\xe8\xa4\x94" + "\x72\xf0\xad\xda\xd7\x79\xf1\x8f\x1c\x0b\xc0\xa9\x09\xd8\x7c\x2f" + "\x36\x31\xdf\x58\xbb\xd8\xff\xec\x0f\x79\xd2\xe7\x2b\x3d\xb4\xd7" + "\x17\xee\xa4\x23\xae\xbf\xd0\x91\x88\xcf\xd5\x74\x36\x60\x56\xbe" + "\x5f\x66\x86\xfb\x29\xe7\x39\xc1\xab\x85\xd1\x7a\x1a\x6c\xbf\x9d" + "\xd7\x9c\x98\xc3\xfe\xaa\xd6\x5f\x2f\xe5\x18\x6b\xcd\xaf\xe8\x83" + "\x87\xe3\x09\x08\x61\x23\xad\xf2\x13\x3f\x70\x71\x8a\x50\x36\x4d" + "\x58\xcd\xfb\x5c\x2f\xcd\x83\xdd\x9f\xa7\xc3\x3d\xa3\xc3\xf5\x5c" + "\x08\x2e\xf3\xcc\x91\x1a\x79\xd6\x83\x3e\x7d\xd2\x16\x05\xec\x68" + "\xfa\xff\xc8\x84\x8e\x77\x3a\xbf\xe4\x7d\xd0\x2d\x2d\x68\xa7\xad" + "\x35\xd2\x46\x1c\x9b\x64\xa7\x86\xf9\xf1\x8c\x8d\x74\x3f\x37\xe7" + "\x69\x7a\xe9\x5d\x4d\x64\x67\x62\x0d\xcc\x7b\x6c\x4e\xd6\x71\xbc" + "\xbe\x2e\x8f\xd2\x50\x5f\xa9\x9f\xf8\x5e\x3d\x60\x7c\x78\x88\xcf" + "\x93\xa0\x27\xa2\xc2\x66\x7a\xaf\xc7\x4f\xec\xcb\x22\xef\xd9\xaf" + "\xff\xd6\xb6\x11\xeb\xe8\x0e\x61\xb2\x4a\x3f\x46\xad\xe2\x5c\x27" + "\xc6\xd6\x22\xf1\xa9\x3c\x54\x10\xe3\x53\x97\x7a\x9a\xb6\x4c\x66" + "\x9f\x3a\x61\x39\x34\xa6\x56\xee\xe5\xfd\x61\x52\xc8\xbd\xa5\xc8" + "\x4f\x2f\x3a\x98\x7f\x36\xb2\x7f\xbd\xd4\xb1\x5b\x3e\x09\xa4\x7d" + "\xbc\x57\xa8\xbb\x77\x29\xda\x8a\xe8\xde\xaa\x2f\xc8\xac\xe8\xb1" + "\x65\x5f\x6b\x57\xc8\x2b\x3c\x1f\xef\xe5\xbb\x53\x3a\x6c\x2b\x60" + "\x3f\x27\x2a\x3e\xde\xeb\xa7\x2d\x2a\x9e\xa1\x47\x3e\xd7\x73\x7e" + "\xa4\x2f\x1b\x73\xd9\x16\x8e\x79\x60\xf1\xd3\x4b\x87\x85\xfb\x4a" + "\x6f\xb7\xe5\xe3\xbd\xf7\xdb\xd8\xa6\xda\xd2\xe9\x4f\x79\xbf\x41" + "\xdf\x5b\x93\x31\x03\x12\xf7\xc4\xfa\xc7\x70\xbb\x2d\xdd\x07\x20" + "\x58\x23\x66\x9d\xa4\x57\x1e\xea\x75\x93\xa9\x0f\xb6\x60\xaf\x09" + "\x36\xff\xf6\x82\x8c\xcd\xa3\x29\x07\x79\xa3\x4f\xd2\xcb\x93\x23" + "\x26\xca\xc2\x5f\x66\xe0\x5b\x45\x69\x80\x9b\xc7\xfb\x8e\x2d\x67" + "\x79\xdf\xe8\xe5\x1d\xd2\x56\xdb\x46\x63\x35\xc0\xe3\x33\x94\xaa" + "\xd1\x34\x96\xf7\xfe\x90\x96\x5d\x18\x55\x67\x89\xc6\xfa\x7e\xfd" + "\x68\x1a\x17\xdf\xee\xcb\x7a\x2c\x80\x57\x0a\xf8\x77\x65\x80\xae" + "\x28\xb9\x9d\xbf\x27\xb9\xd5\x26\xdc\xa9\x42\x7c\xcb\x66\x52\xe7" + "\xfd\x5b\x53\xac\x35\x8a\xef\xe4\xd9\x19\xf8\x8d\xcf\x26\xf5\x73" + "\x9a\x14\x19\x2b\x21\xfd\x4f\x47\xf8\xfb\xbc\x31\x7b\xaf\x99\x12" + "\x0f\xfd\x9e\x73\x74\xfd\xf5\xf3\x18\x06\xe3\x53\x38\x5f\x9d\xf1" + "\xf0\x1d\x68\x3f\xbd\x2c\xe3\xf1\x6e\xdc\x46\x19\x2f\x6c\xa3\xcc" + "\x96\x45\xdc\xaf\xad\x39\x4a\x16\xcd\xc4\xf8\x6a\x1e\x96\x33\xf0" + "\x04\xf0\xe6\xf6\x98\x37\x5a\x23\x67\xbc\xce\x52\xa1\x79\x9f\x64" + "\x5b\x74\xeb\xb3\xde\xa5\x7b\x68\x16\xdf\x19\xe7\xfb\x62\x73\x29" + "\x50\x07\x78\x75\xa3\x29\x13\xb0\xd6\xfa\x8a\x89\xcf\x00\xae\xf6" + "\x2e\x6d\x60\xd8\x3f\xe3\xb9\x60\x13\xe8\xa3\xe6\x84\x57\xa6\xfa" + "\xc2\xed\xd4\x02\xf9\x9e\x59\x22\xa2\x0c\x07\x65\xfe\x28\xfb\xbb" + "\xdd\x66\x2f\x54\xf7\xd4\x65\x5f\xfb\xcf\xce\xf4\x7e\xf8\xce\x4a" + "\x78\xc7\x7c\xf3\x60\xe3\xe9\x7d\x32\x68\xad\xf8\xeb\x95\x6f\x7a" + "\x97\xee\x22\x1e\x1f\x2e\x8f\x77\x8b\xaf\x0b\x65\x4f\xc5\x8f\x0b" + "\x97\x41\xde\xad\x80\xfb\xfd\x81\xf3\x5f\x3e\x97\x1c\x28\x53\xbb" + "\x8d\xef\xc3\xbc\x5c\xb6\x1d\x34\x52\xfb\xe5\x5b\xdf\x60\x5c\xfd" + "\xb4\x75\x97\xaf\xf4\x2f\xc9\xfd\x3c\x21\xfb\xe0\xfb\x75\xad\xf2" + "\x1c\xec\x95\x97\x67\x46\x34\xa1\xf4\x59\xcd\x74\x0d\x7a\xc0\x8f" + "\x5f\xd6\x05\x52\x9f\xdc\xc0\xbe\x35\x35\xf7\x58\x53\xd4\xf8\x72" + "\x5f\xd8\x5e\x49\x36\xc6\x31\x67\x74\x99\x8c\xab\x31\xc6\xfc\x5d" + "\x3b\x8d\xcf\x59\x47\x83\xde\x7d\x36\x52\xfc\x27\xaa\x01\x57\xbf" + "\x1f\x71\xa8\x46\x9f\xcb\x6a\xba\xd3\xfe\x30\x5d\xac\xb1\x91\xe1" + "\x6f\x0b\xf9\x9d\x5a\xa8\x7c\x98\x6d\xac\xa3\xea\x4c\x42\x8f\xb7" + "\x57\x33\x5d\xaf\xbb\x45\xf9\x39\xd4\x58\x50\x7f\x4b\xd2\xfe\xa6" + "\x42\xef\xb8\xa1\xa6\xd1\x1f\xb6\x23\x05\x74\x15\xe6\x83\xa1\xbe" + "\x60\xaf\xfe\x4d\xc1\x9a\x43\xb0\xa9\x87\xf2\xdd\x14\x03\xb7\x8b" + "\x3b\x4f\xab\xa9\x56\x6b\x9b\x9a\x36\x63\xbf\x46\x58\x40\x63\xb7" + "\x55\xf0\x1d\x2e\xbe\x6b\x10\x4c\xeb\xf3\x06\x86\x0f\xd7\xbf\x31" + "\x5b\x13\x86\x9d\x2a\xf5\x6d\x61\x98\xbf\xe9\xde\xd3\xc8\xe7\xa5" + "\x58\x37\x0d\xe5\x3e\x87\xdc\xaf\x62\xfd\x53\x3c\x57\xcd\xe7\x35" + "\x83\xfa\x5e\xcb\x35\x93\xd1\x37\xf4\x49\xf6\x0d\x7d\x94\x7d\xd3" + "\xbf\xb9\x73\x82\x5e\x95\x77\xb7\x2f\xae\x3f\xaf\xce\x53\xb4\xed" + "\xf3\xf2\xf7\x44\x4f\xd0\xf6\xf1\xf2\xfe\x01\xc6\x44\x9d\x2d\xbc" + "\xda\x29\xd2\x5f\x48\xbf\x48\x98\x0d\x12\xe6\xc6\xe1\x81\x97\x39" + "\x3e\x9f\xfe\xdd\x2e\xc0\xbe\x5c\x6c\x1a\xce\xeb\xc9\x60\x37\xda" + "\xe3\xef\x1e\x0e\xe8\xa1\x6d\x35\x3c\x56\x37\xec\xa1\x3c\xc5\x87" + "\xdb\x36\xf1\xfe\xad\x5a\xe7\x6d\x9b\x04\xbe\x57\xeb\x93\x7e\xdf" + "\xec\x14\xe9\x9b\x1d\xab\x63\x2f\x0e\xc7\x6d\x52\x96\x45\xfa\xb9" + "\x6a\x3c\x8f\x63\x1f\x03\xc6\x77\x65\xc4\xd0\x7f\xdb\xc6\xb1\x9f" + "\x4f\xff\x19\xfb\x2a\xf0\x4a\xb9\xba\xbb\x0a\x7c\x8e\x18\x36\x8a" + "\xfc\x4e\x93\x5b\x1c\xe6\x72\xb3\x56\x9d\x91\x67\xf0\x55\xf2\x9e" + "\xf6\x49\xfd\x8e\xd3\xb6\xcf\xf4\xfd\x8c\x6c\xf6\x8b\x0f\xb9\xb7" + "\xa3\xed\x26\xe9\xcf\xc3\x34\xe0\xb6\x25\xee\xf2\x5b\x49\xdb\xc7" + "\x0e\x9c\xa5\x6c\x93\xe7\x13\xca\x57\x74\xfb\x24\x83\x47\xd0\xdf" + "\xa1\x2a\x5e\xe2\xab\x6f\x1c\x1c\x47\x92\x07\xba\x85\x2d\xfd\x3b" + "\xb5\xcc\x93\xdb\x17\xc4\xd2\x69\x56\x44\x73\x2a\x1d\xb4\x2d\x5f" + "\x48\x59\xdf\x96\xff\xd5\xf6\xc4\xf6\x77\x0d\x5b\x44\xd1\x39\x13" + "\xfa\x65\xe7\x06\x49\x6b\xcf\x3e\x07\xc7\xb2\x58\x53\xce\xf1\x78" + "\x6a\x57\x71\xac\xa3\x88\x67\x5f\x4d\x94\xef\xc3\x61\x9e\xd5\x3c" + "\xfb\x76\x9f\x28\x21\x53\x61\x09\x9f\x1f\x7d\xec\xe2\xf5\x95\x70" + "\xc2\x16\x48\x87\x7d\x02\x39\x5f\xbb\x98\xac\x8f\x16\x01\xb6\x33" + "\x3b\x8b\x63\x11\x71\x1c\x22\x8e\x27\x16\x75\x66\x8f\xc4\xf3\x28" + "\xd8\x73\x99\xc2\xb2\xcf\xc3\x3e\x28\x51\xb7\x80\x3e\x3e\xc6\xf1" + "\x90\x4c\xbe\x40\x98\xd6\x9e\x22\x0b\xc7\x3a\x8a\x54\x7c\x5c\xd3" + "\x1a\xfc\x54\xae\x2d\x46\x94\xc0\x9e\xd6\x68\x0c\x68\x6e\xd3\xd2" + "\x3e\x76\x61\x8e\xdf\xa0\xfa\x7d\x46\xa8\x7e\x2b\xbc\x19\x7f\xa5" + "\xe3\x0e\xec\x2e\x97\xb8\xef\xfc\x76\x04\xf0\x35\x4f\xd3\xae\xa8" + "\xa7\xa9\x5e\xdd\xa3\x3b\x42\xe5\xa5\xa2\xd3\x07\xdb\x98\x7d\x22" + "\xf9\x4e\x21\xfb\xb8\x70\x1f\xb9\x7f\xdc\xf6\x47\x67\x4f\xc9\xd8" + "\x4d\x11\xbc\x3b\x8b\xf5\x3a\x5d\xa8\xd3\x75\x84\x7a\x3d\x4d\xb2" + "\xef\xad\x41\x55\xb7\x50\x3e\x73\xfd\x18\x3a\xe8\x7d\xee\xa7\x03" + "\xfa\xce\xfd\xe3\xfe\x47\x98\x26\xa0\x81\xde\x57\x5b\x9f\xde\x4f" + "\xee\xe3\x9f\xc0\xa9\xdb\xd0\x4f\xf4\x55\xf6\xb3\x0f\xfd\x3c\x5c" + "\x44\x14\xae\xec\x6b\xfb\x32\xbd\xa9\x9e\xd7\x87\xce\x8f\x61\x47" + "\x97\x55\x13\xd6\x81\xe6\x5f\x97\x57\x9b\x2a\x61\x9b\x94\x07\xb0" + "\x1e\x0c\x88\x4e\xb6\xf7\x7d\x25\xf8\x8b\xd4\xca\x6f\xb1\x4a\xfb" + "\x98\xbf\x9b\xf9\x2c\xfa\xa4\x7d\x4e\xe5\x9d\xa2\x13\xb6\x69\xd8" + "\x17\x41\x99\x22\xf4\x1f\xeb\xc7\x13\x3a\xfe\x5c\x76\xed\x17\xaa" + "\x5f\xd6\x62\xca\xfa\xe0\x61\x8f\xc9\xd7\xee\x21\xa3\x2f\x8f\xa1" + "\x1c\xfa\x63\x03\x2c\x19\x37\x5e\x43\x3f\xb7\x03\xcf\x70\x4c\x9f" + "\x5a\xba\xc2\x80\xf9\x09\xa5\xcf\xa6\x94\x6d\xa7\xd1\x8f\xd3\x64" + "\xab\x2e\x87\xfd\x75\x1f\xdb\x8b\x3b\x1e\xb8\xa4\x80\xc0\xf7\xb5" + "\xea\x7b\x25\x2a\xb6\xca\xe5\x27\x69\xe7\x5a\x23\x7e\x8a\xc6\xf1" + "\xa7\xd2\x3e\xae\x65\x3e\x92\xb1\x54\x78\xce\x08\x81\x67\xd8\x3f" + "\x65\x25\xda\x08\x65\x8f\x92\xf8\xb8\x55\xfc\x15\xbc\xf3\x77\x74" + "\xb2\x78\x4f\x00\xf5\x6a\x04\x68\xc6\xf0\x61\xcf\x6d\xe0\x5f\xa6" + "\x61\xd2\xfb\x1b\x6f\x52\x2e\xda\x28\xe0\xb5\xef\xde\xf2\x80\xe9" + "\xb9\x37\x69\xdc\xc5\xe9\x94\x9d\x7b\x06\xd3\xdf\x7c\x16\xc0\xf0" + "\xd0\xb7\x91\x27\xa9\xee\x67\xf1\x32\x66\x97\xba\x4c\xe9\xc1\xba" + "\x02\xde\x7f\xbf\xb8\x76\xeb\x54\xdc\x26\xb7\xf0\x5c\x64\xbd\xb9" + "\x06\x1e\x78\xb6\x0d\x86\xfb\xc5\xd3\xa1\xae\x61\x30\x58\x9b\xb6" + "\xca\x58\x5a\xce\xcd\x5b\xd9\xc7\xaf\xaf\xf1\xa0\x8d\xe3\x1a\x63" + "\xee\xdc\x15\xa4\x65\x3b\xc8\xe2\x3c\xc5\x7b\x32\x33\xe8\x60\x6d" + "\x0e\xed\xc4\x9a\x5c\x74\x67\x8f\x7c\xe9\x2c\xfb\x13\x28\x1d\xc2" + "\x36\x29\xdf\x63\x13\xcb\xb2\x33\xab\xb6\x1a\x36\x7c\xfd\xda\xb2" + "\x73\x64\x52\xdf\x8d\xa8\x2f\x9b\x6a\x17\x91\x2d\x26\xad\xa8\x96" + "\x63\x0b\xa5\xf7\xb0\x9d\x52\x64\xc4\xda\x91\xb6\x8f\x03\x32\xd7" + "\x6d\x4b\xdf\xb4\x94\xc6\x71\x5c\x30\x6b\x40\xd9\x72\x6a\xbe\xae" + "\xdf\x03\xfc\x32\xf5\x33\xf4\x4c\x15\x7f\x67\x67\xb0\xee\x2c\xda" + "\x52\xf9\x9f\x46\xb1\x86\x91\x70\x97\xd2\xd8\xda\xb3\x94\xcd\x76" + "\x50\xe1\xe7\xca\x66\xe3\x75\xe1\x8c\x2e\xab\x88\xfe\xef\x6c\xda" + "\x71\x72\x20\x6e\x58\x60\x19\xc7\x1a\x13\xb6\xc1\xee\x08\x57\x8d" + "\x92\x7e\x34\x32\x06\x84\xfa\xae\x18\xd1\x96\x17\xc9\xcc\xdf\xd1" + "\xe4\xbd\x3c\xde\x1b\xe6\xbb\x34\x6a\x0e\x79\x2d\xdf\x88\xab\x34" + "\xe8\xd9\x9c\x47\xad\x77\xb4\xa1\x58\x7f\x05\x42\x5e\xef\x0a\x9e" + "\x33\x5e\xdb\xc2\xf7\x77\x06\xd6\x38\xaf\x2d\xe7\x3c\x4e\x63\xff" + "\xf2\x3c\x49\xcb\xd7\x9a\x78\xdd\xa3\xaf\x19\x3f\xb0\xf7\xa7\x29" + "\x1b\x86\xe7\x32\xc6\xa1\x4e\xed\x23\x8f\x00\x2e\xed\xc6\x7c\xc6" + "\xf3\xba\xfa\x86\xe7\x6b\x5d\xfe\x14\x6f\xd7\x05\xf0\xcb\xd4\xbf" + "\x81\x6b\xea\xe6\x58\x49\xee\x9f\x8f\x31\xe6\x37\xf9\x8d\x86\xf5" + "\xa3\xef\x5a\xb6\x8a\xc6\xdc\xff\x4d\x3e\xf3\x96\xf7\x30\x3a\xd5" + "\xbc\xfb\xf3\xa9\x03\x67\x54\x79\x92\xde\xf2\xfb\x6b\xbc\xc6\x30" + "\x61\x0e\x56\x31\xc2\xba\xd4\xfc\x6b\xdc\x31\xfe\xf9\xfc\x98\x76" + "\x36\xf4\xcf\xa3\x68\x83\x7d\x25\x18\xbe\xb2\x4d\x7e\x9e\xcb\x6d" + "\xf0\xda\x4a\xcd\xaf\x3f\xcf\xbd\x80\x2d\x96\xcd\xf4\xd5\xf4\xf5" + "\xa4\xaf\xeb\x6f\x8a\xbe\x0e\x4a\x9d\xb0\x85\x6c\x1f\x94\xfb\xcd" + "\xec\xa7\x6a\x5f\x4a\x56\xb4\xff\x09\xe7\x33\xaf\x7b\x6f\xe0\xbd" + "\xb8\xd7\x6f\xf4\xf1\xbc\xdd\x57\x90\x31\x93\xd7\xfa\xd2\x16\x7f" + "\xdd\x3e\x1e\xf5\x90\x36\xf2\xfd\xd3\x61\x73\xd5\x6a\x1a\xc7\xdf" + "\x39\x44\xba\xfc\x36\x58\xe0\x1b\x4f\x85\xbe\x93\x45\xb6\xef\x6c" + "\x61\x1f\xfb\xd7\xa7\xfb\x53\x3e\x50\xe7\x80\xdc\xfe\xe6\x11\x76" + "\x8e\x8f\xf6\x56\xaf\x7f\x88\x1a\xab\xd7\x3f\xc7\x7b\x76\xcc\xfb" + "\x3a\x63\x2f\xdf\x4f\xaf\x77\xc8\xf3\x40\xf6\x23\x5e\xc2\xf3\x75" + "\x4f\xfd\x80\xef\xcd\xeb\x9f\xeb\xb8\x7c\x7e\xb0\x84\x78\xaf\xfa" + "\xe8\xce\x51\xa2\x0d\xed\x41\x37\xbc\x16\xd6\xf7\x63\xda\x24\x5f" + "\xb1\xbd\xfb\xaf\xbc\x06\xfb\x1b\xc7\x66\x3d\xca\xf3\x44\xa1\x83" + "\xf2\x94\x0d\xdf\xd3\xa8\x81\x7f\x06\xfa\xff\xfa\xbd\xbc\xd7\x97" + "\x54\x27\xc2\xc4\x91\x75\x2a\xce\x85\xa5\x1f\xd7\xa6\x4c\x17\x7e" + "\x61\xdb\x87\xea\xf1\x9b\x01\x9e\xdb\x8b\xdf\x4c\xfc\xee\xc6\x6f" + "\x96\xd8\x34\x62\x1e\xf3\x25\xd6\xb0\x36\xac\x13\x2c\xdd\x69\xe7" + "\x02\x83\xdd\xff\x63\xda\xf8\x36\x3c\x48\xca\x2f\x75\xd7\xe1\x96" + "\x00\xec\x33\xac\x94\x97\x45\x44\xaf\xfd\x0a\xbe\x67\xb3\xeb\xb0" + "\x73\x07\xfb\x83\xec\x4a\xf8\xfe\xf9\xae\x26\xfc\x41\xd2\xde\x98" + "\x8d\x3f\xe8\x8c\x5d\x87\x07\xfe\xde\x68\x0a\xb9\x77\x1d\xf6\xd3" + "\x2e\x69\x63\x5d\x9c\x4e\xdc\xa5\xee\x52\xf0\xba\x28\xed\x13\xaf" + "\xea\xef\xf0\x36\xbc\x5b\xc4\xf0\x11\x99\x7a\x7f\xbd\x78\xcf\xb4" + "\x3b\x31\xaf\xa5\x81\x26\xa3\xd1\xe7\xe1\x99\x2e\xee\x2f\xe3\xdb" + "\x9d\x16\xaa\x8f\xbd\xfb\xc8\x30\xb9\xff\x81\xb4\x1e\x86\x47\xe2" + "\xda\xa7\xf3\x0c\x7a\xea\x74\xe2\x73\x23\x53\x37\x60\x28\x3b\x08" + "\xe5\x01\xc3\x28\xdf\x4f\xfb\xd1\xfc\xcd\x01\x8c\x29\xca\x61\x4d" + "\x6c\x31\xee\x55\x86\xdc\x6f\x34\x7c\x58\xac\xce\x0f\xb8\x6e\x30" + "\xa6\x2e\xc7\x1b\x48\x56\x1f\x6d\xca\xfa\x8c\xeb\x09\xda\xf5\x47" + "\xd5\xee\x1b\xbb\x07\x93\xa5\xf2\xab\x60\xdf\xd5\xfa\x39\x26\x01" + "\xdb\x43\x93\x7c\x63\x82\xe4\xab\xd5\x30\xe7\xf7\xb4\xe5\x95\x0b" + "\xef\x09\xfa\xb7\xc5\xad\xe1\xce\x8b\x9c\x0f\xff\x4d\x9e\xbf\x8b" + "\x5e\x17\xf9\xca\x6e\x92\xdf\xf7\x3d\x4d\xbf\x78\xd5\x17\x90\x71" + "\xb2\xf9\xf9\x39\xce\x67\xdf\x07\x9e\x1b\x38\x6e\x9c\xb1\xc6\xd6" + "\x50\x76\x27\xa7\x23\xcd\x17\x0c\xc8\xf8\x74\x03\xbe\xd9\xe7\xda" + "\x95\x4c\xfd\xe2\x5e\x79\xf7\x9d\xf1\x8d\xfc\xd0\xcb\x38\x6b\x9e" + "\x73\xed\xdc\x07\x27\xd6\x7f\xbe\x48\xc8\xcb\x32\x61\x5f\xc1\x7b" + "\x85\xbf\x18\x0f\xbe\x13\x5a\xc5\xb9\xf6\x8b\xec\x83\xbc\x3b\xe1" + "\x8c\x88\xd3\x81\xb4\x73\xbc\xc7\x6c\xaa\x2a\x1f\x62\x99\x52\x2b" + "\xbc\xdd\xe9\x3d\x90\xcb\x5f\xcc\xfe\xd0\x41\xff\x05\x3e\xfc\xc5" + "\x6c\xa3\xef\x3b\xf5\xbe\xa3\x2d\xb9\x7e\x9a\x50\xa3\xe2\xf1\xa1" + "\xcc\xa0\xdf\x79\xe6\x71\x66\x7b\x80\xfd\x46\x75\x5a\xb4\xf7\xcf" + "\x0d\x17\x87\x47\xfb\xd7\x68\xa3\x4f\xb5\xb1\x7b\xd2\x7f\xad\x8d" + "\xdd\x93\x2e\xd4\x06\x74\xc3\xb7\x4f\xd2\xee\xc3\x17\xbf\x76\xdc" + "\xbd\x45\xf2\x8a\xa7\xc7\xab\x74\xe6\x2f\x6f\x8d\x62\xfd\x16\xc9" + "\x18\xde\x26\xbf\xc5\x63\x22\x97\xcf\x1f\xa1\x88\xe7\x13\x6f\x8b" + "\xa3\x97\xbc\x2b\xfe\x4c\x1d\xf4\xef\x72\xdf\xa8\x05\x7a\x46\x6c" + "\x1c\x91\xd9\x57\x19\xb2\xf7\x99\x76\xdb\x98\xde\x3b\x38\xf6\x61" + "\x0c\x9f\xb5\x06\xff\x4c\xbe\x79\xbc\xbf\xda\xc6\xfb\xda\x99\x62" + "\xf8\xf0\x36\x0d\xba\x01\x36\x7a\x54\xd2\x03\xf6\x8b\x5a\x6f\xf5" + "\x35\xca\xf5\x56\x40\xde\xf9\x1b\x0e\xbb\x37\x43\xb8\x8b\xb3\x78" + "\xef\x3b\xda\x57\x60\x0f\xb9\x69\x36\xc7\x21\xe4\x7d\x67\x61\x39" + "\x34\x71\x56\x24\x55\xc8\xf5\x14\x6c\x7f\x8e\x47\xe8\x0b\xfa\x29" + "\x0a\x3b\xba\xb6\x87\xb2\x6a\x61\x7b\x42\x67\x67\xb2\x5e\xaf\xd3" + "\xe3\x11\x6e\xea\x19\x88\x47\xb8\x93\xf7\x7a\xda\xf1\xdc\x43\xe6" + "\x68\x45\x5f\xe3\xf6\x1e\x1a\xbb\x63\x05\x65\x6f\xe7\xbd\xbc\xbf" + "\x2b\xdb\x87\xed\x0a\x19\x9b\xf0\x99\x6c\xde\xcf\x1f\xb0\x7d\x56" + "\x72\xcc\xd4\x7e\xbd\x65\x96\x7b\x20\x17\x45\xef\x5f\xca\x79\x30" + "\xe2\x39\x17\x8e\x64\x64\xba\x40\xbb\x7a\x3f\xfd\x7b\x6e\x9f\xe9" + "\x17\x0d\xc9\xc6\xd6\xf0\x6d\xda\x12\x13\x4f\xf2\xc3\xb1\x4a\xbf" + "\x03\x56\xd9\x60\x3c\x11\xdd\x5e\x40\x13\xba\x28\x47\xf9\x2b\xa4" + "\x61\x4e\xfc\xa5\x9f\xcf\xcf\xcb\x9f\x26\x5b\x74\xfb\xdc\x14\xe7" + "\x6b\x94\xca\xdf\x7e\xe6\xbf\xf2\x2f\x44\xe7\x84\x62\xca\xe1\xf3" + "\x07\xf6\x69\xb0\xaf\x91\xe5\xdf\x1e\x5b\x46\x71\x67\x31\xd3\x95" + "\xb3\xd1\x6d\xf6\x7b\x96\x3c\xf1\xcc\xd3\x25\xf3\x4b\x17\x3f\xbe" + "\xb8\x78\x71\xe9\x2a\x19\x36\x60\x9c\xfc\xef\xee\x6b\x16\xcc\x91" + "\x87\xce\x31\xf6\xc5\xd8\x81\xfd\xb8\x5f\x2d\x8e\xf2\xfe\xc1\x45" + "\xd1\xeb\x57\x13\xf5\x73\xb4\xc0\x0e\x79\xae\xf4\xab\x32\xd8\x0c" + "\xd2\x67\x60\x93\x8a\x23\xd3\xa9\xfc\x18\x54\x39\x6d\xe3\x08\x8e" + "\xd1\x33\xe9\x38\xbd\x59\xc0\xe7\x21\x18\xab\xbd\xbe\xb2\x93\x04" + "\x3b\x64\x12\x9f\xb3\xb4\xf0\x5e\x86\xb4\x7d\x7f\xf5\x77\x39\x87" + "\x9d\x96\x31\x95\x76\x1d\xc7\x3b\xfb\xbd\x6b\xa2\x60\x7b\xf4\x19" + "\xdb\x2e\xed\x19\xdb\xbf\x09\x51\xb0\x4d\x3b\x53\xb4\x5d\x9c\x29" + "\xda\x26\x3c\xfb\x0e\x43\xc6\xc6\x9c\xa4\x5f\x45\x23\x6e\xfa\x06" + "\xfe\x86\x0d\xc4\x10\xd8\x73\x69\x7e\x87\xe8\xc3\x9f\x26\x3c\xfb" + "\x3b\x63\xce\xd0\x38\x4f\xde\xd9\x28\x59\xca\xbe\x54\x7b\xa6\x71" + "\xdb\xa2\x72\xff\xdf\x02\xce\xa2\x54\x94\x8f\x2a\x5c\xf6\xcc\xf7" + "\x6d\x38\x41\xea\xdc\x74\xcf\x3c\xaf\xdc\x33\xde\xf3\x25\xd7\xe3" + "\x73\x36\xb6\xa1\x65\x2c\x56\xd3\x2f\xbb\xd8\x0f\x8f\xed\xe7\x1d" + "\x23\x29\xb3\x7a\x24\x65\x84\xdc\x7b\x36\xf6\xfb\x58\x58\xd4\x9c" + "\xca\xf3\x1a\xc7\x0e\x86\xce\x09\xf1\x1c\xc9\x78\x30\x9f\x02\x66" + "\x23\x9f\xc1\xa9\x7b\x45\x7b\x9a\x61\x3f\xe6\x5e\xbc\xce\xdd\xd3" + "\x2c\xe7\x0f\x93\x53\x4c\xd8\x48\xf3\xe4\xf9\xa8\xf2\x39\x34\x43" + "\x2e\xb3\x55\x7f\xde\xbc\x51\x9e\x9f\xaf\x38\x55\x0f\xb9\x71\xd5" + "\xf5\x52\x86\xe6\x39\x34\x8e\xed\x98\x96\x32\x79\xae\x6c\x41\xbd" + "\xbd\x7c\xee\x2c\xef\xe5\xc9\x58\xd4\x7f\xa6\xba\x73\x64\xee\xa0" + "\x5f\xe7\xf1\x5e\xfb\x00\x6d\x7f\xfd\x32\x9f\xad\x88\xca\x86\x79" + "\xd6\x32\x93\x87\x61\x68\x3d\xa7\x73\x8d\x7a\x98\xbb\x87\x71\xbd" + "\xe3\xf4\xeb\x55\xb2\x1e\x97\x95\xdf\x31\xcc\x9c\x8b\x79\x2c\xcc" + "\xe5\x23\x78\xdf\xa9\x65\xce\x16\x90\xb7\xe8\x8a\xe8\x5e\xe4\xcd" + "\xd1\x3c\xa1\x7a\xa4\x15\xc8\x3d\x5e\xac\xcb\x65\xbc\x13\xcb\xc7" + "\x7b\x7d\xfe\xbf\x79\x25\x3e\xec\xc7\x5a\x0a\xdd\x24\xed\xbe\x5f" + "\xb7\xec\xfc\xbb\x8c\x91\x8d\x31\x7c\x73\x9e\xce\x37\xbb\x15\x7e" + "\x6f\xce\xef\xae\x6c\xaa\xef\xb6\xf4\xec\x0d\x9a\x2c\x74\xd0\x16" + "\x66\x9d\x38\xef\xa0\xad\x17\x6b\x87\x37\xb3\xfd\xa6\x77\xda\x94" + "\xcd\xa1\xea\xf1\xd9\x0e\xec\xd1\xae\x54\x5b\xe6\x74\xe4\x4f\x37" + "\xfc\x2b\xf8\xdb\xdf\x7c\xc6\xe3\xa7\x5f\xdb\x99\x6e\xe0\xfb\x06" + "\xb9\xcf\xbf\xfe\x91\x4e\xf4\x67\x28\xfb\xc0\x31\x9d\xf9\x7e\x83" + "\x15\xcf\x62\x85\xc8\xb5\x46\xf2\x4c\x75\xf2\x5e\xa3\xbc\x2f\x3f" + "\x51\x8f\xd9\x92\xa3\xc7\x70\x19\xc7\xef\xea\xbe\xfd\x9b\xfd\xf7" + "\xff\x39\x4e\x0d\xfb\x0e\x44\x75\xbf\x3a\x19\xbf\xe5\xac\x3a\x1f" + "\x65\xbf\x3a\xde\x1f\xe4\xfb\x81\x7c\x86\x89\x7a\x9d\xfd\x7e\x8e" + "\xf2\x5e\xcc\x9b\x61\x23\x6e\x4b\xc8\xfd\x96\xb9\xdf\x5f\x07\x7d" + "\xef\xf6\xf4\xec\x0e\x66\x8c\x98\x17\xf4\x9c\xc3\xda\xe6\x2d\x3b" + "\x74\x53\xc1\x05\xd7\x74\x1c\x8f\x76\x39\x99\xb4\xf4\x43\x05\x1c" + "\xcf\x82\xe3\x82\x29\x3f\xf9\xb7\xd6\xe9\xf7\xc7\x53\x4f\xd3\x5b" + "\x93\x07\xce\x12\xa3\xfa\x3e\xd8\x5b\xbb\x95\x1d\xf6\xd6\x6e\xb9" + "\x0f\x56\xd9\x53\xfd\xfa\xea\xb0\x69\xef\x6a\xbf\x49\xdd\x13\x78" + "\x0b\x16\xd8\x81\x36\xc3\x1f\x05\xe5\x38\x5e\x43\xd2\x98\x49\xc2" + "\xf3\x51\x96\x82\xb9\x57\xee\x61\x0c\xac\x6b\xf6\xaa\x73\xb2\xf5" + "\xa3\xe7\x69\x3c\x07\xa6\x7f\xd2\x26\x7d\x2b\x4a\xce\xf2\x7e\xd8" + "\x50\xb5\xc6\x52\x65\x74\xbf\xc8\xcb\x4e\xc6\xbf\x8f\xe4\x77\x45" + "\xb3\xbd\xe3\x8c\xbd\xf5\xcd\x26\xcd\x6f\x4d\x21\xe1\xac\x17\x41" + "\x8e\x07\x07\xfb\x2a\xe0\xc3\x9c\x8a\x36\x04\xf4\xc3\x30\xd4\x99" + "\xcf\xb4\x57\x32\xb4\xf7\x13\x89\x93\xfb\x0e\xe1\x64\xbb\x32\xc0" + "\xbe\x1d\x67\x09\xe5\x2e\x45\xb9\x4d\xcd\x65\x5d\xec\x9f\x62\xe7" + "\x38\x6b\x1d\x7a\xdb\x81\xb4\x8f\xb2\xbe\x93\x41\xf3\xd0\x26\xf8" + "\xc7\x3d\xef\xe2\x65\x7b\x6f\xfd\x85\x6c\x0c\x35\xe7\xe5\xd1\x60" + "\xeb\x14\x5e\x87\xde\x80\xf6\x67\x08\xc6\xff\xed\x4d\x11\x53\x98" + "\xfa\x4c\xc3\xc4\xbf\xb8\x1c\x14\x71\x0f\x13\xd1\xd5\x18\xaf\x6e" + "\x1b\xec\xd8\x23\xd4\x1a\x69\x96\xbe\x1f\x90\x59\x6b\x79\x50\x9c" + "\xf5\x45\x1a\xa4\x2f\xac\xba\x33\xfe\xf6\x73\xbe\xc8\x7b\xd4\x5a" + "\x12\x20\xd6\x0b\xc7\xe9\x6d\x19\xeb\xf4\x86\x12\x17\x71\x4c\x4f" + "\xe4\xe7\xa8\xf9\xef\xed\x8d\xfa\xef\x5c\xd1\x9d\x1d\x77\x66\x74" + "\xf7\xf2\x25\x4f\x94\x2e\x7e\x66\xc9\xf8\xfc\x85\x2b\x16\x16\xdb" + "\xef\x53\xae\x74\x71\xf3\x92\x65\x20\xf6\xf1\x6f\xe4\x5c\xc1\x36" + "\x08\xc7\x40\x96\xf1\x8f\xdd\x13\xa9\x3f\xf6\x31\xdb\x22\xff\x17" + "\xe2\x1f\x1b\x36\x06\xc7\x3e\x1e\xd8\xc3\x7e\xc7\xd6\x2f\x03\xda" + "\x07\x21\x7e\xe7\x7b\x92\x9a\xfb\x6d\xbe\xa3\x25\xbf\x25\x10\x72" + "\xff\xa6\x3a\x36\xee\x0f\xfb\xd8\xf1\xbe\x07\xd2\x77\x1b\x77\x52" + "\xc1\x8b\x98\x2b\x7e\xd3\x38\x70\x47\xe6\x37\xd0\xff\x6f\x9b\x95" + "\xfc\xca\xb2\x47\x8d\xb3\x5e\xfd\x1b\x53\xf2\x6c\x5a\x73\x9f\x0b" + "\xaa\xfd\x95\xdf\xfc\xc7\x4e\x6d\x98\x45\xed\xed\xbf\x43\xc6\xfd" + "\x2b\x25\x9b\x1f\xe8\xb2\xf9\x8e\xed\x42\xe7\xf1\x03\xb2\xf1\xce" + "\x9c\x01\xb9\xfe\xab\x51\x77\xce\x57\x9d\xe5\xeb\x76\xee\xe5\x27" + "\x69\xdf\x62\xde\x73\xc1\xf3\x95\x78\x96\xf7\x3e\x95\x2f\xfa\xbe" + "\xf1\xfa\x33\xda\xd8\x77\xb9\xfe\xfc\xad\x93\xd4\x10\xd5\x9f\x47" + "\xe3\xf9\x73\xfd\x19\x32\xdb\xd0\xa2\x3f\x67\xe1\x79\x9f\xfe\x0c" + "\x1d\xdf\xb0\x43\x7f\x1e\x85\xe7\xe7\xf4\xe7\x6f\xe2\xf9\x69\xfd" + "\x19\x32\xd8\xf0\x80\x7e\x2e\x6a\x39\x41\x0d\x77\x5e\xbc\xdd\xdd" + "\x90\xa1\xce\xde\x1a\xf2\xa1\xeb\xf5\xbb\x6a\xfd\x69\xf3\x30\x36" + "\x7b\x0d\xfa\x22\x9d\xf7\x06\x2d\x48\x77\xf8\xe9\xb5\x82\x81\xf4" + "\x77\x82\x7a\xf9\x6a\xe8\xb9\x71\x31\xe9\x9d\x7a\xfa\x6e\xd8\xf7" + "\x65\x31\xe9\xc7\xf4\x74\x2f\xca\x37\xc4\xa4\xb7\xe9\xe9\xed\x7e" + "\xda\xbe\x31\x26\xbd\x59\x4f\x0f\x18\x7e\x08\x7a\x7a\xa3\x4a\xdf" + "\xc7\x3e\x03\x93\x62\xd2\xf7\xe8\xe9\xd0\xff\xef\x8c\x8d\x49\x97" + "\x7a\xa5\x4a\xde\xdb\xb2\x8a\x83\x65\x2c\x5b\xfb\xa6\xfa\xe9\xd5" + "\x58\x9c\xb7\xe8\x75\xe7\xfa\xa9\x66\x4e\x4c\xba\x7e\xbf\x7a\x5f" + "\xa9\x9f\x3a\x62\xd3\x07\xb5\x7d\x53\x6a\x28\x69\x7c\x47\xde\x93" + "\xe4\x6f\xf2\x48\xff\x47\x69\x33\xee\x7f\x9b\xef\x74\x59\x77\x88" + "\xe3\xf6\x72\x21\x8e\xd3\xfe\x1a\xdd\xef\x6f\x0c\xfb\x61\xf1\xdd" + "\xb8\x0e\xda\xbf\x4e\xde\x97\xe2\x58\x86\x7c\x5f\x6e\x35\xdf\x97" + "\xdb\x2f\xe3\x3c\x4f\x70\xb8\x54\x9c\x43\xe5\x57\xda\x25\xd7\xe8" + "\xfa\xf9\x25\xca\x8c\xe7\x3d\x4b\x86\xc3\xfb\x78\xbe\xd2\x5e\xe9" + "\xeb\xc8\x6b\x24\x4e\xe3\xb5\xaa\xbc\x43\x15\xb3\x56\x52\x7a\x7f" + "\xff\xdb\x1a\xdf\x71\x77\xab\xf5\x7c\x95\x8a\x9f\xd9\xc5\x3e\x37" + "\xb1\x65\xfd\xb4\x5f\xae\x73\x53\x6d\x97\xbe\x1a\x72\xef\xaf\x1e" + "\xb8\xd7\xb3\xaf\x53\x4f\xaf\x41\xfa\xee\x98\xf4\xa3\x83\xeb\x76" + "\xe8\x3b\x4b\xc3\xee\xbe\x1e\x11\x8c\xf4\x88\xf0\xe6\xff\x04\xde" + "\x8b\xe4\x1d\x95\x2b\xa2\x9e\x86\x46\x3d\x5e\xc4\x67\x91\x15\x22" + "\x00\x9d\xcd\xf1\xf5\x2f\x99\x19\x0c\xd0\xcc\x92\x90\xd8\xf4\x38" + "\xfb\xcf\x9d\x93\xb1\x93\x9c\x5d\x1c\xcb\x97\x7d\xb2\x82\x7c\xee" + "\x93\xd1\x8a\x39\x6e\xe7\x22\xce\xff\x94\x66\x14\xc1\xf6\x2e\x8a" + "\xd2\x4e\xc0\xde\xf1\xb8\xe1\x0f\x79\x60\x7a\xbf\x8f\x22\x70\xe0" + "\xf6\x9c\xf2\xfb\x18\x07\x64\x6c\x0e\xfe\xee\x97\xd8\x94\x59\x2d" + "\x7e\xcf\xf6\xeb\x39\xbf\x75\x1d\x81\xaf\x0e\x6c\xc0\x73\x9b\xfc" + "\xe3\x3c\xa4\x0f\xd6\x27\x25\xcb\x07\xbc\x4a\xd7\xec\xcb\x56\xfa" + "\xe2\x80\x57\xfc\x9c\xef\xe8\x1c\xe0\xfb\x2f\x1e\xd8\xca\x49\xfd" + "\xaa\xd6\xee\x20\x53\x5f\x25\x6c\x93\xd3\x8d\x26\xa5\x9f\x1a\xf7" + "\x6a\x26\xcb\x3a\xde\x2f\x94\x31\xf2\x2b\x0f\x15\xed\x59\x12\x36" + "\xb5\xac\xee\xa0\x35\xdf\x24\xdb\xdc\x30\xfb\x7f\x37\xde\x38\xa2" + "\x94\xe3\x56\xf5\x54\xc3\xee\x34\xbd\x83\xfc\xf7\x97\x34\x9a\x22" + "\xd2\x5e\x69\xdc\x2b\xf7\x98\x3c\x87\x26\xf1\x1c\xe2\x6b\x8f\xb2" + "\xcd\x9c\x01\x9b\x79\x1c\xf4\xbf\x25\xba\xb2\x68\x64\x64\x59\xd1" + "\x25\x3b\x96\x52\x46\x74\x59\x76\xd6\x4b\x3d\x94\x6b\xcc\x3f\x58" + "\x9b\xe6\x88\x90\x2d\xbd\x0a\x73\x0a\xaf\x5d\x47\xa4\x64\xca\xb3" + "\x34\x7e\xd6\x4c\x3b\x6b\x76\xae\xb8\xf0\x77\x3e\xa2\x58\xb3\x72" + "\x8c\x6e\xc6\x25\x59\x5f\x37\x6e\xc3\x3a\x58\xbf\x53\x5a\xfe\x39" + "\x8d\x82\x9d\x6b\x1a\x71\x4e\x78\x4f\x16\x93\x89\xbf\x91\x50\xbe" + "\x50\xee\x0f\x0d\x69\x29\x8a\x90\xcf\xf1\x17\x2a\x5f\xca\x63\xf4" + "\xee\x10\xb6\xd3\xd8\x1f\x12\xe5\x33\x4f\xd2\xbb\x97\x5b\xc3\x98" + "\x33\xc2\xb0\x9d\x9f\xe4\xb5\xde\xbb\xd7\xf1\x7a\xd3\x4f\xef\x16" + "\xb3\x4f\xb8\x77\xe9\x5d\x9c\x36\xcd\xf9\xb9\xf4\x7d\xb0\xab\x7b" + "\xa7\xef\xda\xf9\xdd\xc9\x77\x5c\xd3\xff\x94\xff\x66\x6f\x78\x88" + "\xda\x83\x78\x57\xff\x66\x4a\x8f\x4b\xad\xb9\xde\xb5\x0f\xc6\xbb" + "\x9a\xa7\xf1\xb0\xe0\x38\xcb\xb5\x11\x9a\x19\x14\x7e\x79\x4e\xc9" + "\x77\xfb\x1d\x77\x78\x45\x4f\x35\xa9\xfb\x68\xef\x7e\xae\x55\x34" + "\x1e\x56\x31\x00\xdf\xfd\x94\x94\x8f\x11\xe6\xc8\xc6\x76\xb5\x47" + "\xdb\xd8\xa9\xf6\x2c\x1b\xc3\xeb\x47\xb3\x0f\xf2\xbb\x1d\xdd\x69" + "\xef\x42\xb7\xbd\xdb\xd8\x9d\xde\x5a\x3d\xf8\x7c\xb4\x2f\x6c\xbf" + "\x82\xb2\x78\xaf\x9c\xfd\x89\xeb\x94\x1f\x31\xda\xf8\x2d\xfb\x15" + "\x73\xde\x95\xc7\x4b\x28\x95\xf7\x17\x91\x76\xcb\x84\x5a\xb2\x03" + "\xd7\xe1\xc2\xd2\xb8\x5b\xfa\x6e\x79\x1a\x1b\x7d\x5d\xc2\xcb\x3e" + "\x83\xea\x4c\xe3\xb7\x41\x91\xd6\xb8\x5b\x2f\xff\x5c\x6b\x17\xfa" + "\x60\x69\x74\xf8\xc2\xa7\x74\x9b\xf0\xb7\xe0\xfd\x46\x87\xf0\x34" + "\x7a\xd4\x5d\xf1\xdf\x7e\x62\xe8\x55\xc5\xa3\xbf\xfd\xa3\xce\xeb" + "\x61\x45\xb7\xdf\x06\xf5\xf9\xea\x4a\x7e\xc6\xdc\x9d\xa3\xce\xe0" + "\x7f\xeb\x35\x6c\x64\xbf\x5e\x86\xeb\xe0\x59\x8f\x85\xf3\x5b\x3f" + "\xfa\xee\xd0\xf3\xe5\x77\x0b\xd0\x3f\xd0\xe3\xb7\x63\xb8\x5f\x83" + "\xe9\x56\x49\x8b\x32\x4a\x05\xce\x35\x9a\x8a\x8b\x1c\xf4\x05\xef" + "\xf0\xaa\xef\xf6\x35\xad\x95\x77\x66\xd1\x0e\xc6\xc7\xc4\x7a\x93" + "\xef\xf8\x32\xbc\x01\xfc\x7f\x37\xdf\xc0\x85\xdb\xe3\x3c\xf4\x95" + "\xe3\x28\x33\xad\xe4\x7a\x90\xc7\xf5\x44\x09\xef\x5d\x9c\x03\xcd" + "\xd8\x0f\xa8\x69\x23\xd3\x44\xd1\xac\x49\x7e\x1b\xac\xaa\x7f\x1c" + "\x9a\x1e\x8d\xa7\x87\x7a\xd7\x2c\xd0\x0d\x4b\xd9\x1f\xa4\x69\xa3" + "\x4e\xbf\x2e\xd5\x7e\xd3\xad\xfa\x5a\x1d\x79\xbf\xfb\x22\xa6\xee" + "\xb7\xfb\xcb\xaa\x6f\x44\x9a\xf8\x6c\x95\xf7\xda\x15\xbf\x36\x8d" + "\x19\xa8\xd7\x34\xa6\xf0\x0b\xb6\x91\x1b\x1c\xfc\x4d\x3f\xa6\x79" + "\xc8\xdd\x94\x33\x40\x6f\x05\x27\x49\x1b\x57\x18\x6d\xf8\xe9\x77" + "\x01\x03\x4f\x3c\xeb\x73\x70\x53\xe9\xc0\x98\xfc\x6e\x8b\x51\x8f" + "\xfd\xf7\xf1\x9e\xc7\xf7\x05\x93\xea\x41\x3e\xd3\x01\x76\xad\x91" + "\x3b\xbc\x92\x1f\xa9\xa9\x8b\x7d\x5d\x41\xd7\x1a\xc5\x43\x4d\x6d" + "\x6a\x2e\x6c\x92\xb1\x5b\xf8\xbc\xe4\x60\x98\x79\xa4\xa9\x03\x70" + "\xf5\xfd\xf2\xa6\xb0\x8e\x03\x78\xe4\xdd\x40\xe2\xba\xee\xae\xf9" + "\x0b\xe4\xc5\xd8\xf1\xcb\x4b\x12\xe3\x54\x5a\x06\xee\x40\xbe\x37" + "\x31\xe6\x0e\x69\xae\xa2\xf7\x7b\x2e\xac\x53\xff\x0f\x7b\xef\x03" + "\x17\x65\x95\xfd\x8f\xdf\x19\x46\x1d\x74\x80\xd1\x25\x1b\x0d\x6d" + "\x2a\xdc\x1d\x5b\x2c\x2a\xeb\x4b\xad\xed\x52\xe9\xe6\xf6\xd1\x70" + "\x5b\x6b\x69\x23\x85\xc2\xc2\x5d\xd4\x09\x91\xd0\x10\x10\x59\xbe" + "\x60\x03\x2a\xa0\x1f\x05\x44\xdb\x9f\xbb\x6b\x9f\xd5\x62\xfb\xb8" + "\xdf\x1f\x7d\xbe\x56\x94\xb0\x8b\xf2\x67\xb0\xb0\xb0\xc5\x1c\x09" + "\x0d\x5d\xb4\x11\x46\x19\x61\xe6\xb9\xbf\x73\xee\x7d\x1e\x66\x06" + "\x18\x18\x06\x34\xfb\xad\xbc\x5e\xcf\xeb\xe1\xb9\xcf\x9d\xfb\xdc" + "\x7b\xce\xfb\x9e\x73\xee\xbf\x73\x0e\xe6\xf1\x71\x6b\x79\x1e\xf0" + "\x2c\xed\x32\x99\x8a\xb1\x31\x52\xf5\xf4\x7c\xbd\x1e\xc6\xd2\xca" + "\xaa\x4c\x90\x17\xd9\xa9\x97\xc9\x78\xdc\x4b\x81\xf2\x06\xf7\x6a" + "\x52\x5f\x48\xcf\xa9\xca\x76\x9c\x53\xfb\xa8\x10\xc6\xb6\xfb\x72" + "\x61\x2c\x9b\x76\x81\x4c\xe5\x7b\x23\x3e\xf8\x00\xe7\x74\x68\x5a" + "\x64\x91\x90\x5d\x65\xc0\x33\x90\xf5\x30\x22\xa4\x69\x71\x45\x42" + "\x4e\x95\x01\xca\x2d\x49\x5b\x41\x26\xa1\x7e\xc3\xb9\x21\x8e\x99" + "\x8f\x12\xa1\xdc\x12\xf4\x4f\x26\xd0\x48\x19\x7c\xdf\x24\x28\x6b" + "\xd4\xb9\x02\x61\x7b\xbf\x01\x67\xf2\x16\xf2\xa1\x1f\x7c\xdf\x84" + "\x31\xfa\x70\x9e\xc7\x68\xb5\xa2\x0f\x05\x13\xbc\xf3\x87\x77\x0f" + "\xc3\x5d\x40\x5f\x65\xe8\x4b\x1a\xca\xd7\x60\xf9\xf0\x2d\x13\xaf" + "\x3b\xf3\x21\x62\x82\x7c\x2b\x30\x8f\xe4\x03\x4d\x48\x8b\xf4\xc1" + "\xf7\x78\xa6\xd6\x0e\xbf\x33\x02\xe7\xf9\x6f\x9a\x7a\x7f\x23\xda" + "\xcf\xd0\x97\x3f\x5a\x41\x37\xd5\xef\x83\xbc\xe5\xb8\xd7\x94\xdb" + "\xb2\x1f\xc5\x89\x7d\x1d\xec\xe3\x8f\x96\x8b\xff\xab\x7a\xf3\xa6" + "\x45\x92\xd4\xab\x44\xc3\xd6\x4b\x5f\xf7\x01\xd9\xfb\xd1\x36\xa0" + "\x03\xce\x2f\x34\xb1\xf1\xb8\xfc\x83\xde\x73\x39\xa5\xec\xec\xce" + "\x87\xbd\xfe\xdf\x80\x37\x95\x9b\xb9\xcf\xbc\x6a\x01\xff\x4f\x62" + "\x67\xe6\xc6\xe3\x38\x03\xe7\x0e\x96\xae\xdd\xd3\x7b\xc6\x81\x8f" + "\xc1\x3f\xd2\x3a\xf9\x8a\x62\xbf\xc5\xb1\x38\xfe\x36\xc2\x46\x2f" + "\x6f\x16\xf3\xe2\x6f\x23\xd6\x2e\xa5\xf8\x5b\xf8\xcd\xe2\xde\xdf" + "\xb8\x9c\x91\xf9\x88\x63\x1d\xda\x80\xff\x9b\xa1\xce\xe2\x1e\x24" + "\x2d\x5f\x3f\xfe\xc8\x20\xad\xd9\x9a\xc8\x07\xcd\xc8\xb7\x81\x7d" + "\x21\x7f\x74\xd0\xd5\x6f\x4f\x45\x26\xfa\x14\x82\xf4\x5a\xc9\xbf" + "\x0e\xfc\x0f\xdf\xfb\x80\xef\x83\x73\xf2\x9b\x95\xe7\xe4\x83\x2f" + "\xcd\x4c\xbf\x46\x7e\x40\xff\xf5\x01\x4b\x2f\x98\xe6\xd4\xa8\xf9" + "\x39\xa3\x8a\x35\x58\xcf\x16\x52\x31\x17\x9e\x03\xf8\xf9\xfe\x8a" + "\x07\x79\x3f\xfd\x3f\x9a\x08\xbb\x2d\xc0\x04\xdf\xc4\x33\x33\x4e" + "\xcf\x21\xd0\x6f\xd5\x90\x6f\x19\xf7\x51\x57\x11\xdc\x27\x3f\xbe" + "\x4f\xef\xf3\x1c\xde\xe7\x59\x6b\x01\x7c\xba\x5b\x9b\xce\x9d\xca" + "\xe6\xe5\xe6\xf8\x6f\x20\xfa\xb4\x73\xc4\x07\xf0\x7a\x06\xeb\x56" + "\xdf\xd6\x8e\x6d\x0a\xa0\x19\xa1\xc4\xd8\x66\xe3\x36\x1c\xe8\xce" + "\x96\x60\xc8\x73\x8e\x4c\xc6\x7d\xd3\x18\xd7\x00\xf2\x9f\xe7\x3e" + "\x98\x3f\xf1\x8b\x5a\x33\x9e\x08\xaf\x46\x4e\xa0\xf2\x08\xd4\x93" + "\xca\x03\xdd\xa6\x31\xb8\x4e\x94\xba\x93\x04\xa1\x7f\x1b\xe8\x9f" + "\xad\x18\xf3\x0a\x63\x90\xff\x3f\xdd\x6d\x63\x8c\xb6\x2f\x89\xfe" + "\xb7\x44\x7e\x9e\x7c\x42\x14\x29\x44\xb1\xf9\x2c\x51\x03\x5f\x6d" + "\x87\x6d\x61\x44\x3a\x9f\x5f\x32\x89\x9f\x2d\x2e\x01\x39\xb6\x5a" + "\x43\xad\x5d\x19\x1f\x83\xfd\xff\x96\x52\x1a\xcb\x1a\x78\xec\x02" + "\xc5\x59\xf2\xf1\x11\xb9\xe8\x8b\x80\xd3\xf6\xe3\x9d\xfc\x9c\x52" + "\xe0\xad\xf0\x1b\x27\xfb\xf7\x93\x20\x4e\xc3\x9a\xd9\x5c\xc6\x7c" + "\x12\x74\x38\x96\x60\xcc\x1a\x5c\xe3\x0f\x84\xbc\x87\x7a\xd7\xf8" + "\xd9\xfc\xd0\x27\xa0\xd3\x6a\x66\x73\x1b\xb8\x66\xf6\x52\xbb\x52" + "\x94\x03\x98\x7e\x30\x19\x7f\x0b\xbf\x0b\xb0\xb0\xb9\x9c\x8f\xad" + "\x0e\xac\x7d\x5c\x81\xb2\x15\xda\xa4\x82\xff\x67\x63\xbb\x90\x26" + "\x90\x4f\x01\xcf\x61\x87\xf7\xba\xf1\x55\xaa\xfc\x9b\xce\xc6\xe6" + "\x1a\xae\x64\x03\x9e\x2e\x00\x0f\x7e\x80\xfe\x88\x8c\xf0\x9d\xba" + "\xd2\x6e\x52\xa7\xe9\x24\xf5\xf0\x3f\xee\xe5\xad\xf8\xed\xd7\xa4" + "\x55\x3b\xb0\x5c\x07\xdd\xb0\x0f\xea\x5c\x8e\x65\x81\xac\x6c\xc3" + "\xfd\x4f\x46\x18\x11\xd5\x9b\x31\xd6\x16\x61\x65\xd4\x09\x6d\xa4" + "\x2e\x19\xc6\x33\x06\xf5\x96\xfa\xd2\x2f\x49\xbd\xe6\x33\xf6\x1d" + "\xb4\xbd\x2a\x12\x3a\x07\x2b\xbb\x1a\xca\x6e\x12\xcb\x6e\x87\xb2" + "\x03\xdd\x96\x9d\x7d\xd9\x34\xcc\xb2\x3d\xaf\x77\xf6\xe5\x86\xe1" + "\x94\x0d\xf2\x32\xc4\xa8\xe1\xe7\xa2\x52\xa7\x10\x3f\xfb\x15\xf4" + "\x45\x79\x3b\xe5\xfb\x49\x0f\x5f\x62\x67\xa7\x32\xd8\x7e\x5d\x1d" + "\x3b\x43\x75\x91\xb0\x3d\x81\xfc\xdc\xd4\x19\x82\xfb\x09\xba\x32" + "\x0e\x37\x3b\xc6\x24\xbd\xeb\x3c\x60\x13\x56\xf2\x3d\x9a\xd9\x55" + "\x3a\x8e\xab\xc3\x7f\xc3\xb2\x06\xae\xc7\xdf\xe7\xf0\xfd\xa7\x95" + "\x0f\x4b\xf3\x1c\x9d\xbe\x7f\x9f\x23\x96\xa5\xed\x3b\x7f\x26\x05" + "\xb9\x5c\x96\x9c\x28\xc5\xcb\x4c\x14\x8f\x6f\x3e\xb3\xec\xe5\x65" + "\xcb\x93\x96\xc5\x6a\x17\xaf\x49\x58\x39\x6b\xd5\x2b\xaf\x68\x17" + "\x2e\x5b\xbd\x3a\xe6\xd5\x65\xe3\xc9\xe2\x84\x98\x95\xab\x97\xe3" + "\x1c\x97\x56\x3b\xf7\x81\xa5\x71\xab\x12\x67\xfd\x74\x6e\x68\x9f" + "\x39\x2e\x3c\xeb\xd7\x8c\xb6\x6e\xda\x7a\xe8\x9f\x76\x32\x11\x7d" + "\xcb\x04\xac\xa5\x15\x6f\xc0\x38\x0b\xf0\x77\x1e\xf5\x01\xf4\xdb" + "\xd3\x68\x83\xa3\x5f\x3b\x90\xdf\xb5\xc5\xdb\x69\xc3\x59\xf2\xf9" + "\x5f\xc1\x7e\x6b\xda\xcd\x7d\xb4\x35\xc3\xd8\xd7\xcc\x63\xba\x7d" + "\x8e\x7b\x59\x2b\xdf\x84\x34\xb3\x6f\xcd\xec\xcd\x5f\x11\x05\xe8" + "\x19\xb0\xff\xf1\x1c\xdb\x38\x6a\x98\x4c\x2b\xe9\xd7\x1a\x22\xfa" + "\x9d\x96\x1b\x4d\x56\x5c\x0f\x57\x46\xd8\xd2\x28\xca\x53\xde\xb7" + "\xaa\x16\x72\xba\x94\x57\xf3\x7d\xb9\x9f\xaf\xc0\xb1\xc2\x46\x16" + "\x73\xaf\x0a\xfa\x7f\xf9\x21\x87\x9c\xae\x4f\x16\x6d\x34\x5c\xaf" + "\x7e\xbd\x05\x9e\xb9\xef\x8b\xaa\x6c\xd7\xbd\x0e\xff\x00\xfd\xf7" + "\x69\x09\xbf\xf0\x37\x9f\x1e\xe2\x17\xfe\xef\x7c\x7d\xbe\x88\x5f" + "\x7d\xd3\x47\x7a\x49\xdf\xf7\xf6\xf7\xc6\xd0\xc1\x2f\x4f\xbe\xcf" + "\xda\xfd\x1d\xb6\x7f\x24\xbf\x37\x86\x0d\x76\x21\xde\x00\x5b\xcd" + "\x6f\x7e\x45\x94\x80\xcf\xc2\xdc\x97\x00\xd3\x27\x89\x26\xc5\x46" + "\x5b\xd3\x5e\x24\x41\xa9\xe7\x08\xc6\x3c\x6b\x4b\x4c\xa6\xad\xa9" + "\x57\xd0\xf6\x33\xfa\x02\x7e\xcb\xf3\x5a\x88\x2a\xb7\x85\xa8\xeb" + "\x13\x31\xf6\x29\xfa\x9f\x82\xd2\xc0\xd2\x35\xc2\x73\x6d\x92\x95" + "\xd4\x98\x2f\xe1\xfe\xa0\x8a\xfa\x68\x90\x3b\xcd\x18\x37\x96\x56" + "\xaa\xa2\x49\x60\xc9\x64\x7a\x88\x66\xc4\x2b\xa8\xfc\x77\x16\x48" + "\x6b\x7c\x57\x08\x1f\xf3\xee\xba\xea\x31\x18\x1f\xae\x85\x54\xfb" + "\x89\xd8\x5c\xcb\xcf\xe4\xd4\xb3\xf9\x0a\xe8\x27\x8d\x7c\xfe\xba" + "\xfe\x32\xd7\xe7\xf5\x55\xe2\xbc\x0e\xfe\xcf\x6c\x32\x68\x47\x39" + "\xc6\x88\xc4\x32\xdf\x11\xca\x59\x8c\xc8\x77\xd7\x85\x8f\x49\x89" + "\x21\xf2\x7a\xd3\x79\x72\x18\xe4\x20\xc6\x1b\x84\x7e\xb7\x1f\xfa" + "\x59\xd9\xae\xc9\x74\x0b\xd4\xcf\x50\x3a\x99\x66\x43\x9d\xf6\x75" + "\x65\x54\xa7\x80\xce\xd2\x8b\xeb\x1b\x15\xd0\x2f\xf6\xe7\x42\x9e" + "\x88\x35\xe4\xf6\x5c\xc8\x97\x07\xf9\xd0\x1e\xe5\xf5\xab\x7d\x0c" + "\x68\x70\x10\xbe\xd9\xa0\x5d\x82\xcf\x47\xd8\xdc\x10\x7e\x1b\xda" + "\xa1\x6d\x21\x47\x6a\x41\xb7\x29\xf0\x1b\xd2\x77\xa1\x7c\x90\x7f" + "\x87\x75\xe2\xfa\xea\x16\x5e\xce\x11\x25\xef\xaf\x55\xfb\x37\x3b" + "\x62\x78\xee\xcf\x5d\x07\x3a\xbd\x9b\xf9\x65\x2c\xc4\x79\x0d\xb4" + "\x31\x98\x5d\x61\x27\x01\x7c\x1c\x0e\xb6\x45\x1c\xc8\x01\xb0\x27" + "\xd8\x5e\x62\xb0\x25\xa0\x2e\x85\x18\x47\x13\xdf\xc3\xf8\xe8\x20" + "\xe8\xe5\x32\xb4\x03\x96\x5c\x7e\x8a\xe0\x5c\x36\xd8\x03\x8a\xd5" + "\x51\xd4\xca\xe3\x7d\x1c\x89\x93\x6c\x01\x94\x41\xa8\xff\x73\x93" + "\x88\xa2\x07\x78\x08\x18\xa8\x06\xdb\x62\xe2\x79\x72\x64\xaf\x48" + "\xfb\x6a\xa6\xf3\x93\x98\x1f\x61\x1f\x2e\xa3\x8f\xfc\x15\xda\xa7" + "\x82\x6f\x54\x9b\xc8\xe7\x2c\xc6\x37\x97\x31\x47\x2a\x24\x3d\x8e" + "\x63\x4b\x13\x94\x41\x41\x96\x89\xef\xa0\xfd\x15\x85\xd2\x37\xe1" + "\x9d\x5e\xa4\x59\x2d\xd0\x0c\xca\x3c\xca\xce\x93\x83\xcd\x35\x5b" + "\xa4\x4d\x0a\xda\x15\xfc\xb7\x47\x35\x52\xb9\x38\xfe\x15\xc0\xae" + "\x40\x7a\x21\x9d\xa0\x9c\x14\x51\x8e\x35\x72\xfb\xa5\x76\xa6\xb8" + "\xae\xbd\x05\x78\x9d\xe9\xa0\xff\xd1\x28\x67\xfa\xc3\xef\x33\xf9" + "\x77\x6a\x8e\x3b\xf1\x0e\xc6\x20\x35\xfb\x71\x3e\x12\xea\x78\x88" + "\xcf\xa5\x1c\xdd\x86\xfe\xbb\xd0\x5f\x30\xd0\xf8\x90\x01\x7d\xd3" + "\x82\x6c\xde\xf8\x15\x11\xe3\xb7\xd6\x6c\xe3\xf6\x29\xd4\x9b\xc5" + "\x38\xac\x99\x86\xcf\xad\x50\x2f\x1e\xdf\xb0\x66\x0c\x8f\x6f\x78" + "\xd4\xee\x1c\xb3\xd5\x11\xaf\xf5\xa8\xc5\xb1\x9f\xff\xa8\x96\x8f" + "\x53\x8f\x6a\x71\xae\x89\xe5\xef\x89\xc3\xba\x35\x63\xbf\x94\xda" + "\x8a\xb1\x5b\x21\x1d\x6d\xff\x66\xe4\x9b\x94\x8e\x7e\x6d\x81\x4f" + "\x2a\xf8\x66\xae\x58\xa7\x38\x78\x56\xc2\xb7\xd9\x3e\x1a\x8c\xe3" + "\xba\x19\x7f\x93\xea\xf8\x0d\xf6\x1b\xc0\x70\x00\xfc\xe6\xf7\x70" + "\xa7\x52\x5e\x1e\xdf\xb5\x46\x55\xd0\x8d\x73\x4d\x35\xc1\x52\x7c" + "\x57\x8c\xed\x8a\x32\x23\x77\x89\x0b\xed\x91\x36\xfb\x81\x57\x0c" + "\x77\x87\x6d\xe5\x40\xef\x1a\xb0\xff\xff\x26\xfa\x92\xab\x51\x89" + "\xf5\xab\xe0\x71\x0f\x2a\xe7\x96\xe6\x4b\xbe\x0c\x6a\x2c\xbd\xe3" + "\xa1\x5e\xdb\xb2\x46\x85\x98\x84\xb2\x6a\x91\xff\x68\x27\x76\x65" + "\xd4\x06\xf5\x62\x8b\x9d\x97\xad\x29\x41\xfb\x52\xac\x3f\xe2\x65" + "\xbd\x48\xbb\xb9\xce\xfd\xce\xb9\x9f\x43\x19\xd1\xd0\xc7\x7b\x31" + "\x20\xf5\x6b\x8e\x83\xba\x6d\xa2\x4d\x91\x8d\x7e\x65\xa1\xdc\x0a" + "\xb4\xc1\xb9\x5e\xad\x8b\x3b\xdc\x6c\xc3\xb9\xea\x46\x78\x86\xfe" + "\x5d\x37\xb7\x73\x7c\x7d\x59\x26\x93\x1b\xb5\x30\xfe\xb9\x87\xcd" + "\x9f\x23\x5d\xa4\xfe\xba\x79\x09\x8e\xfd\x42\x79\x9f\x4d\x6e\x25" + "\xf5\xd6\x76\x22\xee\x95\x87\x3e\x7b\x06\xd7\x28\xcf\x03\x86\x94" + "\xd8\x7f\x81\xbf\xd8\xff\x51\xe6\x34\x64\x6e\x67\xfd\x56\x85\xfd" + "\xb6\x07\x7d\x30\xc0\x77\x2a\xa3\xc3\xc9\xe1\xe4\x0a\xd6\x8f\xd1" + "\xb7\x46\x31\xd0\x0e\x63\xa9\x76\x65\xd4\x85\x4a\x7b\x7c\x11\x23" + "\xe8\x4b\x43\xc4\x49\x32\xf6\x65\x91\x76\x0a\xc8\x17\x29\xf5\x3d" + "\x27\xfe\xb3\x3c\x7d\xfa\x5b\x00\xef\x6f\x75\xd9\x12\xad\x6d\xac" + "\x1f\xd7\x04\xdb\xa0\x1f\x3b\xd3\x14\xe9\x89\x74\x85\xbc\xd0\xfe" + "\x4f\x6a\x25\x9a\x3a\xe8\x59\x3f\x43\xe4\x79\x03\x9f\xcb\xa9\x6b" + "\x13\xe7\x79\x7a\x69\x28\xe2\xaf\x11\xfb\xd4\x46\x6c\x3b\xe8\x06" + "\xfc\x3e\x62\xa4\x58\x94\x59\x95\x66\xc4\x48\x3d\xf4\xff\x5f\x66" + "\x3b\x64\x47\x8d\x8e\x8d\x59\x80\x4f\x9c\x3f\xf5\xbf\x64\xfe\x2a" + "\x06\x90\x1d\x26\x52\xab\x76\xc8\xa7\xfa\x68\x89\x0e\x12\x26\xa5" + "\x7e\x0f\x65\x1c\x70\x95\x3f\xf5\x5b\xa1\x8c\x49\x28\xdf\x1c\x36" + "\x54\xfd\x1e\x57\xf9\x56\x9f\x8d\xf2\x0d\x71\xad\x4f\xc2\xb9\xac" + "\x7a\xd1\xf7\x75\x75\xa8\xab\x4c\xaa\x9e\xc1\xd7\xe0\xb9\xcd\x85" + "\xd8\xd2\x2f\xe1\xf9\x51\x87\x41\x7e\x16\xa7\x44\xd4\x79\xe8\xbf" + "\x18\xd3\x24\x5f\xd8\xcd\x90\xbf\x12\xcf\x1d\xa2\xaf\x81\x09\xcd" + "\x7c\xac\x07\x72\xfa\x10\xfa\x94\x36\x91\x7f\x34\xd7\x43\x2f\xec" + "\xc9\xe2\xb2\x5b\x92\x15\xf4\xe5\xc8\x09\xaf\xb7\x11\x5f\xfd\x4f" + "\xe9\xd7\xa0\xb3\xd1\xb7\xa0\x15\xfd\x1a\x42\xd9\xda\xb3\xe4\xd3" + "\xdf\xc3\x77\x03\xc5\xbb\x06\xee\x2b\xe0\x3e\x05\xee\xcf\xc2\xfd" + "\x36\xb8\x3f\x0a\xf9\x05\x31\x7f\x28\x3c\xcf\x80\xf4\x07\xc4\x3b" + "\xd4\xd1\x78\x10\xee\x8b\x44\xdb\x11\xd2\x8f\x5d\xc5\x67\xb8\x9f" + "\x13\x79\x5e\xcb\x79\x6e\x3c\x0d\xe5\x24\x43\xfd\x9b\x8c\xcd\xac" + "\x2c\x3d\xe4\x79\x1b\xcb\xc6\x73\xc0\xf0\xff\x8b\x4e\x36\x28\x94" + "\xd3\x90\x03\xf7\xd9\x70\x5f\x08\xf7\x44\xb8\xdf\x21\xd2\xa0\x01" + "\x65\x43\x6c\x32\xa3\xf9\x1c\x2d\xb7\x77\x17\x49\x7d\x1e\xf5\xb0" + "\x43\x76\x1c\x49\x89\x8d\xe2\xfc\x36\x91\x3a\x86\x03\xc8\xfb\x18" + "\xe6\x85\xfb\x13\xe2\x3d\x5c\xbc\xcf\x13\xef\x4f\x8a\xf7\xb9\xe2" + "\x7d\xbe\x89\x34\x04\x8b\x36\x06\xd0\xa5\x21\x98\xed\x2f\xca\xae" + "\x8a\xe5\xdf\x38\x36\x17\xc7\xc8\x20\xc7\x1f\x84\xf2\x7d\xba\x32" + "\x1a\xca\xa5\x79\x48\x9c\xf3\xe9\xc9\xa8\x5c\x5a\xcc\xd6\x8f\x1b" + "\x1a\x9c\x64\x9b\x42\x25\x0b\x27\x60\x03\xdd\x52\x22\x07\xfd\xcf" + "\xcb\xd1\xc9\xc5\xf5\x57\xd1\x5f\xbd\x0f\xfa\x70\x63\xe3\x21\x3f" + "\x3f\x9c\xbf\x6d\x66\x73\xb4\xe8\x6f\xcc\xb7\x46\x09\x57\x20\x8c" + "\x0d\x34\x92\xfc\xc6\x71\x8f\xe8\x1b\xf2\xc3\xae\x8c\x63\x73\x1c" + "\x63\xf5\x86\x76\xbe\x56\x75\xeb\x1d\x90\xbe\xd8\x29\x7d\x1f\xd6" + "\x19\xe8\xd9\x04\xed\x99\xdd\x42\x8e\xa5\xc0\xfd\xfe\x56\xde\xe6" + "\x50\xa9\xcd\x22\x3f\xf4\x12\x7d\x5b\x49\x43\x08\xc8\xc2\x04\xc4" + "\x70\x4b\xaf\x9c\x6d\x60\x67\xd2\x44\x8c\x00\x2f\x8d\xe8\x03\x33" + "\xcd\xa9\x0f\x3a\xcb\xa0\x40\xa8\x47\xb3\xab\x4c\x39\xd2\x8c\x32" + "\x05\xb1\x01\xf2\x1b\x78\x6d\x3c\xd4\xa7\xff\x65\x63\xff\xe3\xfd" + "\xee\x53\x8d\xeb\x6f\xeb\xb3\x6d\xbc\xdf\x35\x01\xce\x00\x9f\xc6" + "\x12\xe4\x8f\x89\x1c\xb3\x8a\x7d\xba\x09\xfa\xf4\x83\x90\x2e\xc6" + "\x06\xe6\xe9\xe2\xb7\x00\x67\x46\x6c\xf7\x6d\x52\xba\xd8\x5e\x2c" + "\x27\x11\xf9\x2d\xa5\x8b\xe5\x03\x1e\x8d\xf1\xd8\x4f\xa4\x74\xb1" + "\x4d\x60\x47\x7d\x5a\x26\xc9\x13\x03\xc7\x5b\x98\xf4\x3b\xe4\x1b" + "\xfa\x75\xe2\x73\xe9\x9f\x96\x40\x5f\xdd\x83\xfa\x61\xe3\x12\xa2" + "\x7a\x7d\x07\xf1\xe3\xfd\x12\xc7\x14\xce\x32\xf2\xf8\x7a\x9a\x11" + "\x60\xa3\xca\x1a\x52\x67\x9b\x2d\xd9\xab\x25\x5d\x19\x9f\x69\xa4" + "\x58\xc2\x0e\xdf\xf7\x9f\x2d\xac\xdb\xd3\x4b\x5f\xa8\xcb\x67\x73" + "\xa4\xba\x38\xe9\x67\xc6\x03\xac\x1b\x96\xb5\x11\xec\x75\x0b\xc8" + "\x05\x2e\xb7\x3f\x8b\x97\x62\xac\xe7\x89\x7a\x8b\xc5\xf9\x4e\xe2" + "\x71\xbe\x51\x37\xe2\x5e\x1a\x01\xe7\xb1\x92\xed\xa4\x5e\x0f\x63" + "\xf9\xe4\x33\x64\xe9\xda\xf1\xe8\xbb\x24\x12\xea\x1a\x03\x75\xdb" + "\x6b\xc7\x39\xf6\x95\x38\x4e\x3d\x7e\x8b\x3d\x89\x5a\x45\x9a\x41" + "\x3f\x6a\xbc\x2a\xd2\x16\xe5\xd7\x5e\x94\xe9\x1b\x53\x79\x1c\x1b" + "\x9c\xcb\xc1\xfe\x51\x80\x7a\x4c\x43\xad\x95\x25\xd8\x57\x3e\xb3" + "\x49\x36\x29\xd4\x77\x0f\xb7\x09\xeb\x9e\x67\xbe\x7d\xb2\x6b\x44" + "\x9f\x43\x8d\x39\xbc\xed\x8d\x7a\xbe\x9e\x5c\x23\x9e\xed\x69\x8c" + "\xf2\xd1\x4c\xfe\xdf\x7c\xff\x53\xe5\x3a\xbe\x77\xa3\x71\x41\xef" + "\xde\x0d\x87\xad\x98\xc8\xfd\x2e\x35\xc6\x39\xfa\x44\x63\x18\xfe" + "\x0e\x7e\x5f\x04\xe9\xe9\x8e\xf4\xba\x48\x71\xbe\x4b\xe1\xbf\x21" + "\x1c\xf7\x70\xdd\x82\xfe\x9f\xc5\xef\x99\xd8\xf7\xd9\x9c\x47\x4d" + "\x6f\xff\x45\x3a\xa3\xce\x66\x7d\x18\xfa\x2f\xf6\xe3\x9e\x9c\x1a" + "\x25\x5c\xbc\xdf\x72\xdd\x9c\xc8\xfa\x2d\xeb\xb3\x8d\x66\xa7\x7a" + "\xec\x63\xf3\x5e\xc8\xcf\x37\x34\xaa\xae\x8c\xe3\x2a\xb0\x57\xc5" + "\x38\x09\x9f\xb1\xfd\xc7\xe8\x9f\xc3\x76\x85\x9a\x71\x0d\x19\xd7" + "\x14\xf1\x8c\x53\x00\xa0\x1b\x7d\x6a\x48\x6b\xc2\x0b\xdb\xd3\xa8" + "\x1d\xd7\x77\xae\x50\xcb\x96\x5e\xff\xf3\xc7\x23\x1d\xfe\x71\x3e" + "\x2b\x17\xdb\x85\xf6\x4c\x09\xdf\x73\xf5\xd9\xdb\xdc\xa6\xfa\x6c" + "\x1f\xe2\xd4\x08\xd8\x83\xfb\x0e\x1e\x4b\xf5\x78\xa1\x84\x3d\xe8" + "\x97\xb1\x67\xc9\xe7\x33\x0a\x27\xd3\x1d\xc0\xd3\x1d\xd0\x97\xe2" + "\xe1\x79\x22\xdc\x63\xf9\x5d\xa6\xc6\xbb\xd8\x47\x76\xc0\x6f\x1b" + "\xa4\x98\xd7\x48\x1b\x8b\xef\x15\xb6\x4e\x9b\x07\x74\x40\xac\xb1" + "\xf5\x5a\x3d\x8f\x25\x8f\x38\x43\x8c\x05\x6c\x78\x8a\xe1\x8c\x9d" + "\xdf\x87\x74\xac\x2f\xe2\xac\x2b\xe3\xf3\x20\xc9\xf7\xac\x89\x1c" + "\xaf\xe0\xeb\x26\x9f\x87\x4a\x7b\x56\x71\xcd\x26\xf1\x0e\x72\x0b" + "\x94\xab\xad\xd4\x32\xff\x8e\xa7\x8c\xb6\x79\x04\xf3\xe2\x7a\x17" + "\x97\x93\xb7\x26\xc2\x6f\x62\x1d\x34\x3f\xc2\xf6\x6d\x1c\x8e\x62" + "\x73\x91\x3f\x80\x77\xe9\xce\xe3\x0c\x13\xa9\x5a\x80\x63\x0d\xdc" + "\x43\x77\x57\x20\xc1\xd8\xf4\x20\xc7\x3e\xdf\x2b\xd9\xb5\xf7\x06" + "\xe2\xba\x79\xa5\x15\xea\x87\x63\x68\x68\x6b\x65\x2b\x8c\x25\xab" + "\xdd\xcc\x19\xcf\xc6\xb9\x1e\x31\x66\x4c\x33\xce\x63\xa1\x8f\xfd" + "\xb3\xe4\xcb\x19\x75\x3b\x80\x9f\xab\xfa\xfb\x1e\x4e\x4d\xa6\x97" + "\xd1\xff\xb0\x36\x81\xfc\xa0\x85\x7c\x89\xe3\xc1\xa6\xb4\x4b\x38" + "\x47\xf3\x45\x88\xeb\x1c\xcd\x17\x29\xe2\xb5\x05\x2e\x8b\xe3\x6a" + "\xca\x14\xef\x64\x88\xab\x84\xe7\x6d\xda\x07\xd7\x41\x91\x56\x07" + "\xbb\x32\xbe\xe8\x9d\xff\x45\x5c\x62\xdf\xc6\xfd\x12\x38\xe7\x24" + "\xb3\x11\xf4\xdd\x01\x7c\x82\x7a\x6f\xbc\xfb\x99\x8a\x75\x88\xa3" + "\x2f\x58\x0c\x47\xf4\x8b\x3b\xbc\x3d\x3b\x5f\x30\x7e\x72\x1f\x95" + "\x5f\x64\xc2\xb7\x2b\x37\x5f\x24\x0a\x7d\x02\x99\x86\xf3\xdf\x01" + "\x76\x5a\x81\x63\x5c\xc4\xc4\x6e\x16\xab\xa5\xe9\xf7\x89\xeb\x89" + "\x1c\xde\xdf\x0e\xff\x27\x4a\x76\x12\xfc\x46\xed\x63\x25\x81\x68" + "\x1f\x3d\xb1\x9e\xdc\xde\x95\xd1\xb4\x48\xe2\x15\xda\x10\x38\x0f" + "\x27\xce\x25\x60\x5d\xd9\xde\x44\xf4\x9d\x6e\x62\x74\x63\x72\x18" + "\xcb\x80\x7e\xd7\x34\xc7\xc7\x42\xd4\x5c\xf7\x34\x01\xfe\x2b\x45" + "\x9b\xb1\x29\x12\xb0\xdf\xe8\x54\xcf\x2b\x8e\xff\x35\x0f\xe1\xef" + "\x03\x2c\x68\x9f\xb9\xa3\x4f\xd3\x69\x89\x3e\xb8\x2f\x34\x00\xc6" + "\x09\x8c\xdf\x36\xda\x0e\x75\xab\xd5\xaf\x23\xca\xf3\xe4\xc4\xb1" + "\xdd\xdb\xd9\x39\xb5\x6a\x3e\x3f\x7f\xa2\x4a\x1a\x87\xf3\x7a\x9f" + "\xd8\x1a\xb0\xc1\x87\xe0\xbc\x3a\xfa\x0b\x63\x7b\xea\xbe\xd5\xb0" + "\xb9\x74\xa3\x6d\x0e\xa9\x48\x7d\x04\xf3\x48\x76\x55\x73\x67\x9a" + "\x86\x1c\xd6\xcc\x81\x7e\x7c\x22\xca\x24\xab\x88\x1d\xfe\xde\xc5" + "\x13\x51\x22\x7d\x6b\xf9\x9a\xff\x89\x59\xa8\x4b\x32\xc5\xd8\xf4" + "\xa8\xa3\xa1\xec\x72\xa9\xdf\x80\xde\xa8\x84\xdf\x84\x70\x19\x83" + "\xeb\xac\x27\x98\x7f\x11\x36\x6e\xe0\xf9\x55\x7c\xce\xff\x44\x7b" + "\xaf\x2d\x0d\xf9\xf0\x77\x7c\x2f\xd8\x09\xb2\xd4\x2e\x03\x9a\x9e" + "\x60\x6d\xe3\x58\xd4\xcc\xe9\xca\xf8\x32\xc8\xd1\x6f\x9b\x98\x6c" + "\x3e\xdc\xee\xdc\x2f\xbf\x9c\xe3\x18\x6f\x7e\x6e\x9e\x55\x48\xb4" + "\x03\xf5\x43\xbd\x3f\x51\xff\x4b\x49\x7e\xb5\x79\x33\xdd\xb3\x45" + "\x2e\x3c\xbe\x31\x8f\xa8\x64\x06\x20\x1b\xf6\xb3\xa4\xe8\x5b\xa0" + "\x3f\x7e\x10\xa0\xba\x75\xd1\x13\x89\xe3\x68\xaa\x86\xc8\x73\x3b" + "\xc6\x29\xef\xb0\xde\xba\x87\xfa\xdc\xfd\xcc\xc2\x44\x2b\xd1\xfe" + "\x76\x0b\xf9\x26\x9e\xf8\x3c\x61\x87\x6f\xab\x88\xde\x44\x9a\xab" + "\xf1\xcc\xe5\x61\x15\xda\x1f\xcd\xd5\x58\x66\x4a\x09\x51\xa6\xb4" + "\xd2\x36\xc3\x2b\x63\x94\xa0\x0f\xd4\xc5\x80\xb1\x09\xaa\x5b\xf7" + "\xf4\x40\x19\x1f\x47\xb3\xdf\x95\x0d\xbf\x6e\xfa\xc9\x67\xc9\x3f" + "\x9f\x1f\x5e\xdd\xbe\x8a\x73\xd4\xed\xab\xb8\x51\xae\x9b\xda\x51" + "\xb7\x38\xac\xdb\xe5\xe1\xd5\xcd\xa4\x74\xd4\xcd\xa4\xf4\xb0\x6e" + "\xfb\x87\x5f\xb7\xe4\x5b\xcf\x92\xe6\xad\xc3\xab\xdb\xe9\x7d\x8e" + "\xba\x9d\xde\x37\x92\xba\xe1\x58\x3e\x35\x88\x9e\x61\x3e\xce\x13" + "\x88\x0a\xf7\xc8\x9d\x25\x27\x2f\xa5\x96\xb0\xe7\x49\xf0\xff\x01" + "\xb1\x7f\x9b\xd3\x2c\xf4\x6b\x6e\xe7\x9c\x9c\x72\x8f\x1e\xf7\x95" + "\x9e\x54\x03\x96\xab\x39\xa6\xbf\x62\x7b\x3b\xd3\xcc\x54\xdc\xd7" + "\x79\xf2\xe1\x52\xb6\xef\xc3\x18\x29\x3e\xa7\x74\x8e\xaf\x99\x83" + "\x7b\x2e\x04\xe8\xcf\x74\x7c\xcd\x7c\x8c\xf9\xf8\x6e\x82\x59\x4e" + "\x33\xd0\xf7\x16\xfa\xcb\x53\x10\xba\xa9\x26\xf2\xdd\x04\xab\x1c" + "\x7d\x66\x6c\x64\xe7\x65\x4f\x26\x4a\x67\xc4\xa4\x6f\x98\x7d\x8d" + "\x91\x90\x6e\x90\xe2\xcc\x52\x39\xd8\x33\xbe\x35\xe1\x58\x3e\xa4" + "\xef\x95\x62\xc1\x9a\xc8\xc9\x30\x51\x36\x58\x02\xac\x83\xc9\xbd" + "\x93\x27\x24\xb9\xf7\x44\x22\x09\xc0\x58\x89\x9b\x53\xc7\xe1\x9a" + "\x23\xd8\x3f\x27\xe3\x90\xee\x11\x96\x71\x34\x20\x85\xf8\xe0\xd9" + "\x38\xdc\x0b\x67\xd4\x98\x49\x70\x0a\x19\x13\x91\x0c\x65\x5a\x49" + "\x74\x40\x32\x94\x07\xb4\xe6\x63\x83\xaf\xd8\x1c\x5f\x21\x94\x87" + "\xeb\xdf\x3e\x89\x44\xf5\x84\x26\x8d\x6e\xdc\x49\x14\x78\x8e\x0e" + "\xcf\xc3\xf1\xb3\x70\x63\x95\x5d\x19\x5f\x2d\x96\xda\xe7\x01\x7f" + "\xfc\x39\x7f\x4e\x6d\x75\xf0\xe7\xd4\xc2\xfe\xfc\xf9\xea\x7d\xce" + "\x9f\xaf\xca\x1c\xfc\x39\x65\x71\xe5\xcf\x57\x27\x5c\xf9\x73\x2a" + "\xc8\x3b\xfe\x9c\x0a\x74\xf0\xe7\x94\xc5\xc1\x9f\x53\x21\x03\xf3" + "\xe7\xd4\x5c\x07\x7f\xbe\x6a\xf2\x8c\x3f\xa7\xd6\xba\xe7\xcf\x29" + "\xe5\x20\xfc\x19\x3b\x30\x7f\x4e\x1d\xf1\x9c\x3f\xa7\x2c\xc3\xe0" + "\x8f\x1f\xe7\xcf\xe9\xfb\x1c\xfc\x31\x5d\xe8\xcf\x1f\xd3\xf3\x9c" + "\x3f\xa6\x45\x0e\xfe\x9c\x2e\x74\xe5\x8f\x69\xad\x2b\x7f\x4c\x87" + "\xbc\xe3\x8f\xe9\xa0\x83\x3f\xfc\x1b\x9c\x3f\xa6\xda\x81\xf9\x63" + "\x6a\x75\xf0\xc7\x94\xec\x19\x7f\x4e\x4f\x71\xcf\x1f\xd3\xbe\xe1" + "\xf3\xe7\xf4\xf2\x3e\xfc\x51\xbb\xe7\xcf\xe9\xc2\x61\xf0\x27\x80" + "\xf3\xa7\xe5\x98\x83\x3f\x2d\xb9\xfd\xf9\x73\xfa\x2a\xe7\xcf\x69" + "\xb3\x83\x3f\x5f\xcf\x76\xe5\x4f\xcb\x14\x57\xfe\xb4\x44\x79\xc7" + "\x9f\x96\xc5\x0e\xfe\xf0\x6f\x70\xfe\xb4\xc4\x0f\xcc\x9f\x96\x4c" + "\x07\x7f\x5a\x34\x9e\xf1\xa7\xe5\x7d\xf7\xfc\x69\x99\x3f\x08\x7f" + "\xc6\x0d\xcc\x9f\xaf\x7d\x3d\xe7\xcf\xd7\xb3\x07\xe3\xcf\xf0\x6c" + "\xbd\xaf\x99\x0f\xad\x51\x28\xc7\x7d\x7c\x60\xa0\x1d\xee\xf3\x13" + "\x32\xbe\xde\x52\x2a\x8c\x55\xf2\xb3\x10\x5f\xcf\xd7\xae\x23\x3f" + "\x6b\x21\x5f\x9f\x2c\x15\xc6\x28\x69\xc6\xde\x58\x21\xe3\x4f\x2a" + "\xba\x61\xac\x42\xd8\x30\x4e\x81\x67\x9b\xdd\xc7\x9e\x6e\x7d\xd4" + "\x67\x0a\x99\x8e\xe7\xd3\x36\x82\xbd\x8c\xff\x77\x65\xb4\xce\x07" + "\x5b\xd0\x30\xd8\x39\x29\xdc\xeb\x74\x38\x13\xc7\xb7\xad\x89\xbd" + "\x7e\x25\x32\x68\x32\xfa\xe7\xd2\xdf\x89\xe7\x19\x5a\x4b\xd0\x0f" + "\x36\x8c\x57\x5b\xc3\xef\xa4\xa7\x70\xec\x71\x96\x9c\xd9\x49\x73" + "\xaa\xd0\x0f\xaf\x05\x6c\xf5\x1f\x40\x9e\xd6\xde\x7d\x70\x34\xb2" + "\x48\x9c\x23\xdc\xc2\xf3\x7e\xe3\x0b\x79\xb7\x60\x6c\xcc\xd5\xa9" + "\x18\xf3\xf1\xec\x25\xb0\x7d\x7f\x88\xdf\x40\xdf\x43\xbb\xe1\x8e" + "\xfb\x64\xf8\x1e\xc8\x33\xec\xec\x2a\xfa\x35\xe4\x7b\xce\xce\x9e" + "\x90\x70\x07\xdf\x19\x0f\xcf\x1f\x8b\xf6\x3c\xe6\x9f\x00\xcf\x6f" + "\x3b\xbd\x57\xc1\x73\x2e\x94\x3d\x51\x7c\xef\x07\xcf\xaf\xa1\x9d" + "\xcd\xfc\x64\xe4\xa5\x8b\x7b\x75\xcf\x2e\x86\x34\xb5\x98\x67\x22" + "\xe4\x79\x18\x6d\x77\xb1\x8c\x49\xf0\x3c\x0d\xc7\xc0\xe2\xfb\x40" + "\x78\x46\xbf\x52\x0a\xf1\xfd\x2d\x50\xc7\x33\xf0\xfc\x23\x7e\xb6" + "\xa4\x47\xec\xa3\x67\xca\xbc\x3b\x73\x7d\x86\xfb\xe2\x92\xb3\xb9" + "\x20\x18\x0b\x9c\x71\xda\xff\x73\x66\x87\xeb\xbb\xb3\x81\x4e\xef" + "\xb2\xa5\x77\x7c\x8f\xda\xd9\x50\xa7\x77\xc9\x7d\xde\x2d\x70\x7a" + "\x17\xd7\xa7\xcc\x38\xa7\x77\x91\x7d\x7e\x97\xe9\xf4\x6e\x6e\x9f" + "\x77\x7b\x9c\xde\xcd\x16\xdf\xf9\x40\x7a\xb9\x63\x0d\xef\x4c\xb0" + "\x98\x2e\x87\xf4\x06\xa7\xf4\x40\x31\x1d\xbf\xdf\x66\x22\xff\x19" + "\x2b\xa6\x33\xde\xf3\xf2\xbf\x21\x8e\xf2\x5b\x5b\xf9\x1c\xc7\x37" + "\x81\xbd\x7b\xe7\xc6\xd7\xec\x10\x7a\x22\x8b\xe0\x5d\x2d\xe2\xca" + "\x19\xdb\x2b\x93\xb4\x2f\xad\x79\x55\x9b\xb0\x2c\x11\xb7\xaf\xac" + "\x58\x9e\xa8\x5d\xb1\x2a\x76\x99\x8b\x9f\xf2\x40\xf4\xd9\x87\x71" + "\xbe\xd0\xf7\x89\xe8\x53\xbf\xad\x37\x0e\x05\xc8\x55\xf8\x56\xba" + "\x89\xcc\x65\xeb\x63\x85\xdc\x9f\x77\x35\xfa\x4e\xe1\x7e\x52\xc8" + "\x53\x2d\xe4\x9b\xdf\x8b\x7e\x52\x2a\x20\xef\x7e\xf7\x7e\x52\xce" + "\x65\x33\xff\x80\x90\x8f\xfb\x49\x39\x67\x80\x7e\xfe\x04\x1d\xcf" + "\xe3\x4a\xf0\x78\x5b\xdf\x48\xb6\x89\x79\xe9\x55\xe6\x63\x2f\x9d" + "\xcf\x65\xf4\xf5\x77\x5a\x55\x89\xbf\x13\xd7\x4b\x2b\x1d\xbf\x6f" + "\xd3\xf0\xf7\x92\x7e\x10\xbf\x99\x5d\x85\xe3\xe6\xf1\x2d\xf0\xcc" + "\xe6\xef\xd9\xbb\x36\x3e\x97\x97\x53\x55\x8b\x6d\xc2\x76\xbb\xb6" + "\x4d\xfe\xeb\x16\xd2\x16\xe3\x68\x5b\x5b\xb6\x93\x2f\x35\xb1\x0d" + "\x6d\x65\xbc\x8f\xf6\x6b\x2b\xdb\x9f\x48\x95\x55\xb5\xf8\x6d\x94" + "\x67\xfc\xcc\x00\x3c\xe7\x54\x55\x4b\xf5\x71\xaa\x1f\xce\xdf\x2a" + "\xa0\x7e\xb9\x9c\x26\x20\x3f\x80\xa7\x62\x1b\x16\xd2\x8c\x6f\x42" + "\xd9\x1e\x78\x3c\x6b\x8b\x71\x42\x98\xae\x3a\xd7\x1b\xff\x07\x75" + "\x14\x9f\xc3\x3c\xe7\xb0\xff\xd0\xc7\x55\x8e\xa4\xbf\xce\x39\xd9" + "\x7f\xfc\x9b\x90\x16\xe9\x8c\x21\xa7\xef\xfd\x1e\xbf\x07\xf9\x08" + "\xdf\x77\x5f\x85\x34\xb1\x98\x48\x5b\x25\xee\xc5\xc4\xdf\x62\x1d" + "\xdd\xc5\x86\x73\xe7\x83\xd0\x41\xc7\x73\x0d\x12\x1d\x0b\x59\x8c" + "\xa2\x73\x26\x69\xbe\x8e\x9d\xfb\x81\x3c\x85\xbd\xb1\x92\xcf\x33" + "\x3f\xe6\xd4\xe0\x1f\x77\xaf\x8a\x44\x73\xda\x9e\xbf\x05\x65\x3c" + "\xf6\x19\x2e\xeb\xcf\x27\x8a\x3c\x0f\xe5\xf5\x3f\xff\x28\xa6\x3b" + "\xf6\xb9\x9f\x2f\x94\xf2\x49\x72\x99\xaf\x57\x9d\x5f\xc1\xf2\xf1" + "\xf8\xb5\x61\x9c\xe7\x3f\x52\xb7\x90\xf3\xe9\x62\x7e\xee\x1f\x95" + "\xf9\xbf\x39\x5f\x42\x73\x8c\x61\x5d\x19\xe7\x61\xfc\xf3\xcd\x7c" + "\x4e\x47\xfe\x5d\xb8\xa7\x63\x5d\x90\x46\x78\x46\x9b\xe6\xfa\xc7" + "\x01\x7f\x06\xf4\xab\x2c\xee\x9f\xbe\xfd\x3c\x69\xe7\x36\x84\x9c" + "\x5a\x71\x8e\x95\xb7\xb5\x7d\x8a\xd3\x1e\x63\x95\x94\x87\xcb\x6e" + "\xf6\x8e\xed\xdd\xd6\x27\xe1\x7c\x90\xf8\x2e\x09\xcf\xb1\xf6\xfe" + "\x3f\xd6\xe9\xff\x31\xf8\x3f\x4d\xa2\x65\x9b\xd7\x31\xdd\xaa\x70" + "\x9c\x91\x6f\xd7\xc0\xb3\xaa\xcf\x73\xa0\xcb\xf3\x5a\x12\xc4\xf6" + "\xdf\x5a\x68\x2b\xdb\xab\x2d\xa6\x8b\x65\xfb\xb2\xfa\x24\xd1\x30" + "\xc0\x06\xc6\xf8\x88\x12\xfb\x61\x13\x9e\x95\x0e\xb0\xbd\xc8\xce" + "\x49\xc3\xfb\xd9\xe2\x3d\x54\xbc\x87\xf0\xd8\xa1\xff\x72\x8a\xff" + "\x8d\x73\x34\xff\x32\xb9\x8b\x47\x2e\xc5\x6b\x97\xe2\x91\xe3\x39" + "\x6b\x31\x7e\x6a\x54\x57\x46\xbb\x66\xb0\xd8\xef\xf0\x3e\x4c\x3a" + "\x33\x6d\xcf\xae\x4a\x11\xb2\xaf\x54\x63\xac\x4a\xf4\xb3\x95\xd6" + "\x8e\xbe\x56\x2c\xc4\x48\xba\x89\x31\xb1\x2b\x1d\xe3\x55\xd6\x5b" + "\x99\xef\x62\x3c\x6b\x2a\xc3\x79\x73\xb4\x1d\xeb\xf5\x17\x58\xac" + "\xca\xd7\xdb\x49\x90\xfe\xa7\xb4\x15\x68\x50\x62\xcf\xa9\x4a\x11" + "\x71\xb4\x13\x74\xe0\x74\xa0\x05\x9b\x2f\x66\xb1\x96\xdb\xd9\xba" + "\x97\xf2\x2c\xb9\x10\xc2\xf2\xd0\xc8\x9d\x9c\x76\x17\xd8\xdc\xd7" + "\xee\x0c\x29\x1e\x61\x7b\x6f\xfc\x63\x13\xb9\x10\x7a\xd9\xf7\xd8" + "\x3e\x48\x6b\x73\xdd\x33\x7d\x81\x95\x89\x75\x37\x91\xf6\xbd\x58" + "\x76\x57\xc6\x05\x55\x6f\x9f\x85\xf4\xd7\x6d\x64\x2a\xd4\xeb\xac" + "\x54\x3e\xbc\x87\xfe\x7f\xbe\x1c\xdf\x63\x99\x97\x73\xba\xa0\xdc" + "\x0b\xe1\x26\xf9\x8e\x64\xbe\xe7\xfa\x02\xe8\xbf\x3f\x94\x0f\x66" + "\x03\x41\x5f\x88\x83\xbe\xa4\x17\xb2\x8d\xd1\xcc\x17\xb6\xaf\x31" + "\x8e\xcf\x31\x5e\xd8\x89\xfb\xba\x36\x5f\x21\x0a\xdc\x03\xc1\x31" + "\x7b\x81\x9f\xef\x81\x34\x90\xd5\xfb\xa0\x8f\xb0\xfd\x3b\xc3\xd3" + "\xfb\x17\x98\x8f\x9f\xcd\x1d\x44\x99\x97\x20\xf9\xf2\xbe\x60\x71" + "\x8a\x3f\x20\x9e\x2f\xb9\x38\x0d\x57\xca\x37\x77\xf3\x3a\xf6\xad" + "\x03\xd6\x17\xca\xda\xe1\xd6\xc6\x54\x1a\xa3\xd9\xfa\xcc\xa6\x9a" + "\x38\xbe\x47\xf5\xe2\x32\x1f\xcd\x6d\xdb\xbb\x32\x2e\x46\xf7\xc6" + "\x5d\x80\x3c\x79\xb8\xf7\x1e\xca\xef\x6d\x67\x02\x7e\xe3\x62\x36" + "\xef\xeb\x17\x4b\x84\x1c\x23\xc6\x57\x50\x88\xe9\x25\xf5\x36\x2b" + "\xfa\x58\x18\xd0\x4f\x15\x8b\xe7\x86\x7b\xc2\x37\x19\xa3\xf1\x7c" + "\xce\xbd\x56\xa9\xce\xdf\x96\xe0\xb9\x10\xac\x33\xa7\xed\xb7\x5b" + "\x25\x3a\xe6\x76\x40\xd9\xa9\x5f\x92\x56\xf2\xed\x14\xdc\x37\x87" + "\xe7\x9c\xb0\x0f\x73\x1a\x7c\xcb\xc6\x7c\xec\xfb\x2c\xcf\x45\x36" + "\xf6\x67\xb1\x75\xa0\xfc\x52\x16\x1f\x0c\xda\x00\xbc\xa8\x48\xc5" + "\xb3\xf5\xdf\xb2\x33\x3e\x1b\x13\x08\x6f\x37\xdb\x27\xfb\xad\xb8" + "\x4e\xf2\x6d\xa4\xa4\x2b\x4c\x62\xda\x66\xfc\x76\x52\x37\xb9\x48" + "\xbe\x7d\x18\xe3\x7e\x03\x3d\xf4\xe8\xdf\xad\xde\x02\xfd\x24\xb9" + "\x1b\xb1\xa0\xc7\x78\x92\x90\x3f\x8c\xeb\x37\xa4\xf9\xb7\x41\xf8" + "\x7d\xa4\x2d\xf0\xce\x0c\x34\xdd\x0b\x65\x1f\x94\x68\x9a\x37\x19" + "\xc7\x3b\x17\x1b\x06\xd3\x0d\x76\xa8\x73\x3d\x70\xae\x62\xea\x97" + "\x50\x3f\xf3\x7a\x61\xbc\x31\x1a\xf7\x64\xc3\xff\xe2\xd9\x34\xce" + "\x3b\xde\x97\xcc\xcf\xc2\x37\x8c\xb8\xbf\x01\x65\x25\xfa\x20\x83" + "\x36\xd9\x44\xfa\xb1\x78\x0c\x5b\x92\x38\x1d\xc4\xfc\x65\x7c\xbe" + "\xf8\xb6\xe3\x5d\x19\xe6\x05\x8e\xf9\x62\x33\xd3\xdd\x88\xb7\x52" + "\x36\x26\x34\xc7\x39\xd5\xd9\xc2\xce\x99\x76\xe0\x5c\x9f\x59\x8d" + "\xdf\xca\x45\xff\x5b\x88\x8b\xf3\xce\xf8\xff\xf6\x12\xd6\x13\xf7" + "\xfc\xda\x7d\x6b\xe2\x40\xdf\xc6\x23\x9d\xe1\x37\x3a\xe8\x0b\xee" + "\xce\xc5\xa2\x2e\x64\xb1\xe0\xe0\x9b\xcd\x92\x2e\x84\xf1\x05\xe8" + "\x85\x4b\xc7\xd9\xb8\x13\xec\x69\xa3\x80\xf6\xcc\xa5\x46\xc4\x0d" + "\xf4\xf5\x0a\x51\xc6\x82\xfe\xbc\xa4\x96\xd6\xbc\xec\x78\x6e\xe2" + "\x22\x5b\xef\xb5\x48\x31\xce\xb8\xbf\xbb\x4b\xb3\x1d\xe7\x2c\x2e" + "\x85\xf7\x3b\x67\x81\x67\x6c\xb6\xb3\x58\x58\xfb\x51\xa7\xd4\xb5" + "\xb7\xa2\x8e\x60\xbf\xc7\xb3\x17\xa9\x30\x26\xe7\xe7\x74\x5a\x71" + "\x7e\x9e\xc5\x0c\xc1\xba\xf0\xd8\x0d\x2d\xec\x7f\xc0\xad\x02\xef" + "\x1c\x4b\x97\xf6\xf6\xc6\xf1\x06\x7e\xe3\x5a\xdb\x61\xc5\xcf\x49" + "\xc5\x9d\xa8\xaf\x2f\x1d\xc7\x98\xd4\x90\xa7\x5a\x8a\x47\xcd\xe2" + "\x4f\xf3\xf6\x0c\xe8\x87\x87\xf9\x35\xbc\x87\x84\xe2\xb9\x7c\x3c" + "\xc7\xc6\x68\xa0\xf2\x57\xa2\xaf\x64\xf4\xfb\x58\xb1\x0e\x63\x9a" + "\x74\xfc\xbe\x60\x32\x3b\x0b\x6c\xa9\xb8\xa7\x03\xd7\x2d\xdb\xcf" + "\xa6\x30\x7f\x46\xca\x88\x64\x1b\xc5\xdf\x31\x7b\xc2\xcf\x1f\xf7" + "\x04\xb5\xb3\x58\x01\x58\xa6\xd7\x7e\x7f\x3b\x16\x89\xb6\x69\x3b" + "\xc8\xfd\x5b\xcf\x93\x0e\x66\xbb\xc3\xff\x93\xcf\x93\xce\x03\x3c" + "\x2e\x2a\xf7\x5d\x2f\xee\xc7\x1e\xcb\x7d\x59\x00\xcd\x98\x6f\x81" + "\xce\x3b\xb4\x77\x63\x0c\xe1\xce\x19\xcc\x8f\x74\x76\x55\x83\x48" + "\x83\x86\xcd\xbc\x5e\x01\x4b\x93\xe5\xac\x8e\x58\xbf\x61\xd6\xad" + "\x5d\x1c\x47\x8c\xed\xca\xe8\x0c\x95\x7c\x60\x70\x7b\x8a\xfb\x97" + "\xe6\xbc\xe8\xdc\x25\xda\xcf\x8d\xe2\xb7\x1b\x47\xfe\xed\xce\x38" + "\xb1\xcc\x7d\xdc\xc7\x76\x47\x20\x94\x0b\x7a\xa7\xb3\x5c\x1a\xcf" + "\x88\x67\x88\x42\xf8\x38\xab\xb3\xc1\x31\x9e\xe1\x34\x74\x39\xdf" + "\xb6\x6a\x55\xa2\x36\x76\xf9\x6a\x7d\x4c\xe2\xcb\x71\xda\x65\x09" + "\x09\xab\x12\xb4\xe8\xe4\xc8\xb9\xff\xf0\x38\x40\x9d\xad\x62\xcc" + "\xbc\x7d\x8e\x98\x79\x96\x10\xe7\x38\x93\x26\x62\x09\x1d\x9d\xb9" + "\x0b\xcb\x02\x77\xe5\x6c\x91\x0b\x65\x70\x95\xc3\x55\x01\x17\xda" + "\x18\x64\xa9\x95\x84\x83\xae\x67\x32\xcf\xe1\xdb\xc1\x82\x7e\x40" + "\xc3\x5b\x88\xe5\xed\x52\x41\x41\x98\xaf\x9e\x0c\x81\xf9\xda\xdc" + "\x0d\xbf\x87\xab\x02\xae\x6a\xb8\xd8\xef\x84\x4f\xd8\xb9\xf4\x32" + "\xe7\x77\x7c\xff\xc8\xfa\x5a\xcc\x43\x37\xe0\x10\x11\xf2\xe5\xf3" + "\x7c\x7d\xea\x20\xa7\x19\x17\xa2\xc5\x7c\x6c\x2c\xe9\xbf\x81\x68" + "\x07\xc8\xe7\x43\x33\x5a\xa3\xc4\x7c\x6c\xdf\xb1\xd4\x1e\xf4\xd5" + "\x0f\xf9\xa5\x7c\x0a\x9a\x71\xa9\x4d\xcc\xc7\xf6\xc8\x09\x19\xf2" + "\x81\xbe\x3b\x86\x66\xfc\x77\x9c\x98\x4f\xed\x5c\x9e\x53\x9e\xb1" + "\x42\xc6\x97\xe8\x13\xbf\x41\xd8\xa0\x08\xe4\xb6\x93\x65\x01\xe4" + "\x1f\xd0\xc7\xe9\xf0\xf8\x74\xd9\xd2\x97\x4f\xfa\x97\x97\x2f\x7b" + "\x64\xf9\xca\x24\x8c\xd4\x94\xb8\x6a\x4d\x22\xde\x57\xc6\xfc\x8e" + "\xdd\x56\x2d\x7d\xe5\x65\xfe\x4f\x62\x7c\x28\xfe\x13\x0f\x78\xc3" + "\x7b\xec\x1a\x3d\xde\x5e\x5e\x85\x8f\xc9\x71\x21\x6b\x5e\x96\xc2" + "\xd3\x3b\xe3\x50\xd7\x95\x71\xa5\x04\xb0\x61\xe0\x72\xf6\x0a\xe8" + "\xc5\xaf\xd9\x7e\x2f\x8c\x47\x54\xa5\xb3\x11\x69\x5e\xcb\xd5\xb7" + "\xc7\x95\xbf\xa1\x6f\x8f\x80\x0d\xfa\x97\x03\x6c\xcb\x97\x81\xce" + "\x28\x81\xdf\xb6\x9a\xc8\xab\x56\x51\x36\x9a\x98\x9f\xd0\x8c\x2b" + "\xb3\xc5\xbd\x9d\x0a\x21\xbb\x0a\xf7\x7c\xef\x80\x67\x16\xfb\x19" + "\x9e\x2b\xe0\xb9\x19\x9e\x31\xe6\x73\x20\x3c\x97\xe0\x9c\x14\x3c" + "\x6b\xe0\x39\x48\xc8\x2e\xdf\x87\x67\x79\xe1\x59\x0b\xcf\xc1\x5d" + "\x19\x5d\x73\xa5\x7e\x31\xb0\xad\xdc\x15\x2b\xc5\xa3\xe6\xb1\xa7" + "\xbb\x12\x7b\x63\x4f\x63\x3c\xa4\x54\x75\x14\xd3\xbf\xcc\x06\xe9" + "\xda\xe1\xa3\x99\x86\x65\xee\x90\xf4\x25\x9f\xef\xe8\xda\x27\xf9" + "\x29\xe1\xf3\x19\x5d\xe5\x4e\x31\xbc\xf1\xb9\x5a\x8a\xe1\x8d\xf3" + "\x5d\x2c\x86\x20\xdc\x69\x06\xfa\x63\xa5\xfb\x06\x9c\xcb\x63\xb1" + "\x27\xad\xb3\xd0\xb7\xad\x39\x2d\x56\x76\x57\x29\xce\xa1\xc1\x33" + "\xf7\xcd\x48\x2f\x92\x2e\xe6\x6b\x44\xf2\xdb\xe6\xec\xb3\x61\xc0" + "\xf3\x50\x9f\x82\xcd\xc0\xe2\x45\xc5\xaf\x0a\xb0\xc5\x2c\xe3\x76" + "\xa0\x35\x97\xcb\xaf\x1a\x03\xb7\x17\xac\xc9\xf4\x19\x1e\x53\xc4" + "\x44\xac\x36\x1c\xb3\x04\xc8\xe2\x57\x51\xf8\x6d\x40\x72\xcc\x32" + "\x96\x06\xf9\x36\x82\xad\x26\xd6\xef\x45\x63\x10\x9e\x25\x15\x44" + "\x5f\x14\xd6\xa8\x25\xd3\xd2\xf1\x3b\x4a\x66\x87\x7c\x4a\x54\x18" + "\x03\x12\xeb\x56\xea\xe4\x57\x6e\x33\xa4\xe1\x1e\xd2\xce\x67\x88" + "\x0a\xfd\xe8\x8a\x75\x89\xe2\xf1\xb7\xac\x16\xc9\xa7\x13\x7c\x2f" + "\xaa\x6f\x7b\x9e\xf9\x15\x43\xe5\x8c\x97\x43\x16\xcd\x83\xff\x42" + "\xc4\x30\xca\xce\xd8\x0c\xea\x1c\x5f\x17\xdd\xf9\xa7\x15\x4f\xf2" + "\x58\x99\x57\x61\xfc\xdf\xd5\xc6\xf6\xb0\xe0\xb8\xa4\x2b\x72\x07" + "\xdf\x83\x7a\x75\x3d\xfa\xad\x15\x32\xd0\x9e\xc4\xf3\xc9\x57\xe3" + "\x11\xb3\x54\x59\xb3\x65\xf7\x7a\xf4\x91\x2c\x03\x1a\x5f\x8d\xc1" + "\x77\xa2\x6f\x2c\x39\xf3\x25\x65\x27\x1a\x76\x16\x17\x6c\x14\x3c" + "\x83\x7a\x96\xd8\x56\xa0\xdd\x81\xf3\x49\x42\xc6\x55\x25\xe2\x16" + "\x78\x8c\xbe\x3a\x2c\x74\x7c\x55\x3a\xf5\xad\x9d\x8d\x38\x46\x5b" + "\xd7\xa8\x46\x9a\x5d\x6d\x84\xef\x3e\x01\xd7\xaf\x79\xec\x96\x17" + "\xda\xa4\x32\xd1\x7f\x19\xd8\x50\x25\x70\x57\x43\xbd\x6d\x4e\x31" + "\xed\xc4\xb3\xc7\xdd\xd3\xd0\xaf\x1a\x96\xcd\x6d\x67\xdb\xf3\xdc" + "\x06\xe9\xd6\x99\x48\xc0\x16\xde\x17\xbb\xc1\xfe\xc9\xda\x27\xfe" + "\x0f\xf6\xcf\x7d\x8b\xfa\x94\x91\x23\xcd\x95\x72\x4c\x77\xc7\x02" + "\x46\x9f\x80\xeb\xd7\x90\x5f\x2f\xc5\x6d\xdf\x28\x67\xe7\x24\xcf" + "\xfa\x68\xf0\x5c\x79\x77\xb6\x94\x3e\x46\x16\x0e\x34\xed\xde\x21" + "\xf5\xfd\xce\xf1\x35\x89\xf0\xbc\x4f\x9a\x63\xe1\x73\x2e\xdd\xe5" + "\x4e\xcf\xe9\xf0\x5c\x2d\x3d\xc3\xff\x8d\x92\xac\xc0\x71\x62\x27" + "\x8c\x25\x71\xdc\xf9\xb2\x06\xec\x42\x0d\x8e\xf3\xba\x81\xff\x59" + "\x71\x3c\x6f\x0f\xd8\xa0\x39\xc1\xe2\xff\x2a\x93\xbc\x28\x48\x6a" + "\x8b\x90\xe1\x13\xc0\xdb\x63\x9b\x2b\xe4\x5c\xa9\x36\xfb\x56\x85" + "\x43\x1e\xd0\xff\x5d\xbc\xbd\x49\x17\xf6\x18\xba\xd5\x8b\x71\xc7" + "\x63\xc5\x2b\x88\x2f\x1b\xdb\x87\x95\xbb\x4e\xbd\x08\x6d\x4c\xf4" + "\xad\xc1\xfc\xe0\xa1\x2f\x48\x1b\x19\xcb\xfc\xef\xe7\x5c\x29\x67" + "\x7e\xe7\x5f\xd7\xa9\x24\x3f\x90\x20\x5b\x66\x53\x79\x7c\x20\xfa" + "\x86\x64\x71\x36\xba\x74\xfe\xcc\x1f\xa4\xe8\x07\x72\x57\x12\x09" + "\x2c\x11\xb8\x1f\x48\xe6\x77\x63\x2c\x8c\x49\x92\x06\xf6\x05\x49" + "\x33\xfe\x7c\x48\xf2\x05\x49\xaf\xd8\xad\xf0\x7f\x30\xb4\x1d\xe3" + "\x8f\xeb\xd8\xb3\xc3\x87\x93\x62\x40\xdf\x90\x72\x90\x71\x72\xee" + "\x1b\x72\x78\xba\xc1\xa6\xe6\x38\xb1\x2d\x92\xe2\xca\x3b\xa5\x81" + "\xfc\xb3\x8a\xb1\xb1\xba\x83\xc4\xb4\x64\x13\xf9\xfd\x21\x71\x7f" + "\xa5\x19\xe7\xc8\x0a\xd9\x3c\xd8\xd5\x3d\xb4\x27\x6e\xe7\x40\xf2" + "\xa5\xc3\x5f\x9d\xde\xc1\x7c\x3e\xd8\x80\xf7\x76\xc6\x27\x3e\x6e" + "\xb4\x95\xf7\xed\xc3\x2f\xbd\xbc\x2a\x76\xd9\xd2\xdf\xae\xd0\x6b" + "\x9f\x59\xfc\x04\x0b\x2a\x18\xa2\x5d\x9e\xb8\x8c\xa9\x1f\xed\x33" + "\xf3\x1e\x8f\x88\x58\xbc\xf4\x57\x8b\x1f\x5b\xfc\xec\xaf\x1e\xe5" + "\xa7\x13\x17\x27\xac\xc5\xc0\x94\x89\xab\xb4\xf8\xa3\x97\xc4\x68" + "\xd6\xeb\x96\x25\xac\xea\xdb\xf7\x03\xd9\x9c\x96\x9c\xcd\xdf\x5a" + "\xf0\x7f\x3e\x6f\x66\x5f\x2c\xcd\x67\x71\x39\x67\x9f\x87\xb4\x65" + "\x71\x42\x33\x6c\xb5\x68\x4b\x89\x71\xc6\x51\xc7\x28\xb0\xff\xa2" + "\xae\xe9\xca\xb0\xa7\x3b\xfb\xbb\x12\x7f\xbb\x57\x8e\xbf\x13\xfb" + "\xad\x98\xf6\x3e\x9d\x3a\x35\x8d\xfb\xac\xb2\x1f\x94\xe6\xb8\x31" + "\x4d\xaa\x43\x0b\xe6\xc9\xb0\xd9\x1d\xf1\x6c\xed\xcd\x8e\x98\x8d" + "\xec\xcf\x85\x46\x84\xa0\xe9\x32\x06\xec\x92\xb1\x70\x8d\xc3\x6b" + "\x7e\xaf\x2c\x4f\xa2\x4d\x38\x3e\x0b\x90\x81\xbe\x4d\xf6\xe1\x31" + "\x9f\xb2\x1a\x59\x9c\x82\x08\xbb\xcd\x67\xa9\x5d\x0e\x77\x1f\xba" + "\xd4\xae\x60\x63\x42\x9a\x44\x1b\xd9\xb9\xfa\x24\xda\x80\xb1\xcd" + "\x00\xc7\xd9\x11\xb6\xd4\xec\x08\x3b\xb5\x2d\x05\x5b\x1d\xee\xdf" + "\xe0\xf9\xf0\x08\xfb\x37\x94\xc5\x77\xc1\x73\xf4\xdc\x77\x5f\x35" + "\xee\x97\x5c\x02\x18\x2e\xed\xe0\x31\x71\x23\xd6\x7e\x7b\x6a\xe9" + "\x5a\x13\x8f\x89\x7b\x91\xc7\x91\xe6\xb1\xb6\x49\x2a\x94\x73\x64" + "\xa9\xdd\x47\x1b\x61\xef\xa1\xfc\x8c\xab\x50\x31\x58\x9c\x5b\x94" + "\xa7\xab\xa7\x10\x39\xce\xad\xd8\x4b\xa3\x2a\xd0\x4f\x5f\x9a\x99" + "\x5a\xd1\xdf\xcb\x47\xdd\x4d\x72\x6d\x12\xc6\x01\x13\xce\xd4\xeb" + "\x43\x07\x3e\xe3\x9c\x75\x62\x3f\xcd\xdd\xba\x98\x66\x35\xa7\xc0" + "\xbd\x91\x66\xd7\xe2\xb8\x57\x46\xb3\x4e\x2d\xa0\xb9\xf9\x90\xde" + "\x12\x04\xf7\x46\x9a\xd5\xda\x4e\x73\x0b\xe0\xf9\x9b\x43\x70\x87" + "\xe7\x4f\x32\x21\xff\x22\x9a\x75\x18\x7f\xd7\x40\xb3\x2a\x13\x21" + "\x1f\x3c\x57\xc5\xc3\x1d\x9e\xff\x1e\x0b\xf9\xe0\xf9\x1f\x51\x67" + "\x09\x2d\x83\xff\x21\xed\xbc\x81\x7f\xeb\x82\x81\x7d\x2b\xcb\x6c" + "\xe0\xdf\xe8\x34\xf0\x6f\x5c\x31\xf0\x6f\x5c\x35\xf0\x6f\x54\x2f" + "\x86\x7c\x91\x34\xeb\x48\x25\xdc\x9b\x68\x56\xcd\x6c\xc8\x07\xcf" + "\xb5\x7b\xe1\x0e\xcf\xf5\x81\x90\x0f\x9e\x8d\x50\x97\x02\x78\x6e" + "\xb0\x40\xbe\x28\x9a\xf5\x69\x1c\xdc\x9b\x69\xd6\x67\xcd\x90\x0f" + "\x9e\x8f\x2f\x82\x3b\x3c\x7f\x0e\xe5\x14\xc0\x73\x53\x18\xdc\xe1" + "\xd9\x86\xf5\x88\xa6\x59\x02\x94\xbb\xd5\x44\xb3\x28\xe6\x8f\xa6" + "\x9b\x64\x50\x5e\xbe\x89\x6e\xf2\x09\x81\x7c\xf0\xac\x68\x84\x3b" + "\x3c\x8f\xc5\xb6\xc6\xd2\x4d\x4a\x1d\xdc\x5b\xe9\x26\x5f\x48\xcf" + "\x87\xe7\x09\xe9\x70\x87\x67\x3f\xcc\x0f\xcf\xfe\x4d\x70\x87\x67" + "\x35\xd2\x28\x8e\x6e\x9a\xd4\x0a\xf7\x36\xba\xe9\x96\xb9\x90\x0f" + "\x9e\x6f\xc5\xfa\xc3\xf3\x54\x05\xe4\x83\xe7\x20\xa4\x15\x3c\x4f" + "\xc7\x76\xc6\xd3\x4d\x77\x60\xf9\xed\x74\xd3\x5d\x48\x17\x78\x9e" + "\x61\x86\x3b\x3c\xeb\x80\x1e\x05\xf0\x7c\x77\x39\xdc\xdb\x07\xe4" + "\xe7\xa6\x59\x5b\xe8\x86\xb1\x84\x6e\x7a\x48\x4b\x37\x8c\x83\xfb" + "\xff\x02\x5b\x7a\x8c\x8e\x6e\xfa\x49\x28\xa4\xc3\x3d\x6c\x1f\x3c" + "\x87\x88\xcf\x70\x7f\x38\x1d\x9e\x43\xc5\x67\xb8\x3f\x12\x09\xcf" + "\xb3\xc5\x67\xb8\xcf\x31\xc1\x73\x18\xdd\xf4\x68\x39\x3c\xe3\x1d" + "\x6c\xed\x31\x73\xc4\x67\xb8\xff\x2c\x05\xee\x36\xf3\xb4\x28\x8d" + "\xd9\x2f\xba\xc1\xec\xb7\x0d\xed\x01\x62\xcf\xdb\xba\x48\xf0\xdf" + "\x8a\x7b\xd0\xc7\xa6\x5d\x26\xe3\xce\xca\xe4\xeb\x51\xa6\x18\x53" + "\x4c\x2c\x6e\x9e\xe8\x37\x72\x6c\x8b\x4c\xb6\x16\xec\xa1\x30\x90" + "\xe1\x72\x68\xb3\x81\x66\x8c\xe9\x80\xb6\xaa\x68\xc6\x84\x16\xb8" + "\xc3\xf3\xc4\x4f\xa1\xad\xf0\xfc\xd0\x26\xb8\xc3\xf3\x0b\x8f\xd3" + "\xdc\x42\x55\x57\x96\xac\xc9\x44\x28\x8f\x21\xfb\xa7\x15\xe1\x01" + "\xb6\x34\x1a\x61\x03\xdd\xb1\xb3\x04\x64\x7f\x34\xa1\xb9\xdb\x4c" + "\x01\x18\xdf\x62\x57\x54\x24\xf5\x8f\x61\x75\xc2\x18\x36\xb4\x27" + "\x58\xce\xbf\x3d\x81\xb6\xc8\xe4\x63\x30\xd6\x02\xf5\x5f\xeb\xee" + "\xfd\x0c\xf6\x7e\x6a\x89\x9a\xbf\x57\x12\xc7\xfb\x17\xf0\xfd\xbc" + "\x00\xf4\x59\x3e\x7d\x31\x7b\x6f\xb4\xb4\x89\xed\xf2\xc1\x77\x31" + "\x98\xd7\x24\x93\xf3\xf3\x02\x32\x59\x36\xcd\xf0\x21\x9d\xca\xda" + "\x45\x5d\x59\xf2\x42\x13\x11\x6a\x45\x7b\xbd\x90\x2a\xab\x76\x70" + "\xbf\x21\xc6\x01\xfd\x5b\xe1\x78\x55\x30\x14\x85\xe5\x82\x1c\xc4" + "\x31\x30\xe8\x43\xb9\x36\x35\xb8\xbc\x45\xa6\x88\xde\xc5\xe6\x36" + "\x8a\x9b\x98\x7c\x94\xf9\xcc\xe8\xd9\x54\x9b\xa9\x5d\x17\x00\xdf" + "\x57\xc4\xa4\x59\xe9\xe5\x8a\xd4\xc7\xc9\x59\x9e\x5e\xc1\xce\x0b" + "\xf1\xff\xf7\xb3\x7d\xa0\xfc\xff\x1d\x6c\xce\x19\xca\xc2\xdf\x3a" + "\x8f\x39\xec\x59\x3f\x36\x0b\xfe\xc5\x26\xb6\x8e\x2e\xf3\x99\xf9" + "\x81\x60\x92\x07\x24\x92\x31\xda\x75\x1f\x41\xf9\x3e\x7a\x97\xf1" + "\x69\x6f\x5e\xf6\xee\xd9\x0f\x21\x6f\x31\xce\x25\x65\xf9\xa4\xf7" + "\xc6\x23\x86\x36\xbc\x89\xba\x50\x4e\xc2\x51\x3f\x33\x7b\x57\xa6" + "\x60\x7e\x66\x6d\xaa\x6d\x15\x36\x43\x74\x85\xdd\x50\xdc\x44\xf3" + "\x8a\x4d\xfe\x36\x19\x61\xfb\xf5\x65\x8a\x07\xef\xb5\xa2\x7d\x79" + "\x14\xdb\x77\x41\x18\xfb\x60\xd9\x3d\xc9\x44\x5e\x91\xf0\x25\xfe" + "\x76\x16\xcd\xfa\x49\xa4\xb1\xbd\x89\x54\x24\xb0\xb2\x42\x68\xd6" + "\x93\x73\x84\xb1\x8f\x05\x96\xa2\x9d\x9e\x8c\xf3\x6c\x9f\xe2\xef" + "\xfe\x0a\x7c\x51\x74\x65\x29\x54\xbd\xb1\xb2\x81\x96\xb9\x40\x3b" + "\xb4\xa1\xd1\xf7\xc5\x52\xbb\x1d\x7d\xb6\x65\x9b\x80\x0e\x9c\x5f" + "\x3e\x66\x8c\x33\xce\xbf\xab\x98\x27\x8c\xaf\xd5\xd7\x47\xe1\x9a" + "\xa1\x12\x7d\x60\x5d\x66\xe7\xe5\x6d\x18\x3f\x10\x74\x8f\x98\xd7" + "\x99\x77\x2b\x5e\xd6\x2f\x5d\xa7\x5f\x95\x90\xb8\x74\x8d\xfe\x11" + "\x2d\x0c\x1c\xb5\xab\x5e\xd1\xae\x58\xb6\x62\x55\xc2\xda\x7e\x7e" + "\x77\xa0\x5e\x7b\x01\x27\x6c\x3f\xfc\x11\xb0\xdf\xd9\xfc\xbd\x6c" + "\x6c\x22\xf2\x7a\xe7\x76\x1e\xaf\x02\xf2\x80\xfd\x17\xc7\xc6\x47" + "\xc2\x8e\x62\x2b\x2d\x89\x8a\xcc\x41\x9f\x1f\x6b\x30\x1e\x82\x99" + "\x18\x49\x07\x8f\x61\xcb\xe2\xd3\xc1\x78\x22\x69\x3d\xad\x48\xea" + "\xc0\x7e\x00\xb2\xa8\xb0\x0d\xfa\xc1\x9e\xab\xb9\x31\x61\x2d\xb2" + "\xb1\x91\x57\x73\x0b\x9b\xa4\xf8\x42\x76\xc3\xb6\x30\x41\x55\xb4" + "\x08\xe3\x0b\xf5\x50\x0d\xa9\x03\x5a\x76\x67\xd7\x46\x81\x1e\x88" + "\xdc\x95\x41\xcb\xed\x30\xbe\x62\xbe\x7d\xfe\xb4\x42\x6b\xa7\x3a" + "\x85\x3d\x83\x28\xe1\xee\x4f\xfd\x8b\xd3\x7b\x54\xdb\x1a\xf0\x3d" + "\xc6\x15\xb2\xf7\xe8\x48\x6a\x23\x15\x7e\x13\x07\xb8\xc9\x20\x94" + "\xc5\x51\x8d\xbb\x40\x20\x7d\xbc\x90\xb7\x2d\xfa\xec\x7c\x22\xc7" + "\xbc\x60\xef\x91\x28\xf8\x3f\x25\x86\xf8\x41\xbe\x80\x94\x23\x90" + "\xde\xa5\x1b\x6f\x4b\xd3\x29\xbb\xd3\x74\xe3\x7b\xa8\x4e\x65\x6c" + "\xb5\x92\x9e\x19\x2b\x42\x67\x99\x89\x62\x27\xd8\x85\xbb\x04\xe8" + "\x83\x25\x51\xe1\xf6\x37\x74\x63\x6d\x6f\xe8\x14\x3d\x3d\x3a\xa5" + "\xed\x75\x9d\xa2\xfb\x75\xdd\xd8\x9e\x2e\x9d\xd2\x18\x6b\x26\x47" + "\xcd\xff\x45\xea\x5b\xdb\xd8\x1c\x6f\x8f\x5f\xb1\xa1\xc7\x6f\x5b" + "\xbc\xaa\x95\x04\xde\xa3\x07\xbb\x10\x6c\xe3\x22\x18\x17\x00\x26" + "\x54\xb6\x3f\xae\xd0\xd2\xdc\xe2\x50\xa0\xef\xa3\xf3\x66\xd2\x6f" + "\xed\x59\x13\x94\xda\xa7\x40\x5e\x6d\x50\x68\x20\x0d\xf0\x73\x6b" + "\x32\xcd\xfa\x41\x05\xdd\xa0\x08\x82\x4b\x6b\xe2\x7c\x20\x34\xcb" + "\xf7\x10\xce\x31\x60\x5e\x9e\x4f\xad\x32\xb1\xbb\x2a\x8a\xc5\x3b" + "\xcd\x52\xc4\xef\x42\x9b\x24\x6b\xac\x5e\xb2\x49\x2a\x15\x03\xfb" + "\x15\x81\x3c\x85\xbd\xe3\x75\x01\x64\x4e\xee\xd6\x70\xb7\xbe\x77" + "\xf1\xdb\x79\x5b\xf5\x5b\x84\x5e\x1f\xca\x20\x33\xc7\x7e\x00\xfd" + "\x27\x9d\xbd\x33\x6c\x33\xa5\x5e\x22\x3e\xf8\xae\xec\x8a\x55\x8e" + "\xcf\xda\x04\x19\x35\x5a\xac\x04\x7e\xa3\xa0\x41\x51\x91\x65\x57" + "\xcc\x72\xc4\x4b\x3d\xa4\xc1\x6f\x8f\x6f\xb9\x22\x96\xbb\xa3\x84" + "\xa4\xbd\x46\x58\xcc\x10\x8c\x3b\x84\x38\xda\x92\x0a\xe3\x4d\x8c" + "\x91\x94\x80\x32\x6c\xdc\x44\xf8\x5f\x89\xf9\xa8\x6a\x9b\x49\x80" + "\x32\x00\x4f\xf3\xa9\xdf\xb6\x6a\x21\x77\xdb\x22\xc0\x94\x9a\x4e" + "\x8b\x2a\x17\x76\x16\xb7\x75\x65\x8d\x8b\x03\x7a\xa4\x4b\xf3\x17" + "\xf5\xfb\x6c\x04\x7d\x62\xd1\xc7\x6d\xa4\x2a\xf1\x32\xfa\xcd\xf5" + "\x31\xfb\xd6\x46\x9b\xfd\x8a\xc2\xcc\x7e\xc5\xa1\x42\x6e\x51\x3a" + "\x5c\x99\xfa\x04\xa2\x3a\x2f\x53\x86\xf4\xfa\x74\xbd\x74\x83\xf8" + "\x74\x05\x3b\x8f\xd9\x7b\x80\x1d\xb4\xdf\xa0\xbd\xe5\x18\xfb\x03" + "\xed\x3a\x94\xb9\x5d\x59\xca\xde\xf3\x2f\x28\x47\xec\x39\xb5\xf1" + "\x70\xc5\x41\xba\xde\x24\xbb\x6d\x87\x24\x63\xa8\x7f\xb4\x59\xd8" + "\xf4\x8b\xb9\x5d\x78\x9e\xaa\x27\xee\x67\x98\x17\xe8\x86\xbe\xe5" + "\x7c\xec\x3d\x71\x73\xe0\x7a\x14\xae\x9f\xda\x73\xb7\x55\xd8\x73" + "\x0b\x4d\xf6\xdc\x62\xb5\x3d\x37\xda\x02\x97\x15\x2e\x9b\x3d\x37" + "\x86\xc0\xa5\x80\x4b\x49\x73\x63\x54\x70\x87\xf7\x31\x81\x70\x69" + "\xe0\x0a\x82\x4b\x0b\x57\xb0\x7d\x67\xb1\x59\x00\x7c\xc2\xa5\x85" + "\x0b\xd2\x8b\x92\xe1\x9a\x3f\xb0\xcf\x93\xcb\x6d\x2c\xce\xc1\x98" + "\x53\x34\x00\xe3\xe0\xa6\x5c\x46\x9f\x8d\x6d\x55\x3a\xcb\xf0\xfc" + "\xbd\xcb\x7c\x83\xdd\xcd\x95\x60\xf9\xd0\xbf\x7a\x86\x59\x5e\xa2" + "\xdb\xb9\x17\x4d\xb1\xd5\x16\x14\xb5\xc7\x96\x41\xd2\xa1\x4f\xcb" + "\xea\xa3\x5b\x49\x84\x99\xa4\xd5\xb6\x76\x93\xb4\x58\xd1\x37\x7b" + "\x0a\x9e\x63\x89\x0f\x44\x1c\xdb\x69\xa4\xb6\xc7\x50\xd8\x66\x57" + "\x15\xa9\xa9\xaa\x68\x3e\xf3\x03\x09\xf2\x07\xe3\x8a\xf5\x8e\x4b" + "\x11\x57\x30\x36\xad\x6b\xbf\x4c\xde\x88\xa5\x42\x5d\x1c\xd8\x26" + "\x4d\x00\x30\x19\x79\x0b\x31\x26\x8d\x4d\xff\xa3\x99\xa6\x03\x5e" + "\x7c\xed\x40\x37\x01\xc7\xa4\x80\x2d\x1c\x9f\x4a\xf8\x02\x7d\xa6" + "\x96\x62\x31\xd1\xb1\xbe\x4a\x78\xa7\xc0\x58\x4d\x25\x30\x26\x2d" + "\x49\x22\xc1\x25\xf0\x8e\xc5\xd5\x84\x7a\x3f\xad\x0f\xa0\xc2\xef" + "\x74\xa4\xf4\xb7\x44\xe9\x77\x81\xc7\x6a\xb5\x03\xed\x7b\xe3\x15" + "\x18\x62\xc2\x16\x5e\xd0\x92\x2a\xdd\x49\xd0\x4b\x65\x20\xbf\x63" + "\xc2\x7a\x40\x76\x03\x2d\xed\xc3\xa3\xe5\xf8\x8a\x6b\x45\xcb\x9e" + "\xa0\xa8\x70\x4e\xcf\x68\x82\x34\xeb\x4b\x4f\xa4\xf1\xba\x56\xa0" + "\x27\xd0\xd5\xd8\x68\x27\xfe\x32\x12\x23\xd1\xb3\x18\xe8\x09\x34" + "\xd5\x20\x4d\x81\x1e\x8c\xa6\x54\xa4\x69\xa9\x13\x4d\x41\x3e\x31" + "\x9f\x99\x48\x53\x01\x68\x5a\xea\x86\xa6\xbd\xe3\x7b\xa0\xe9\x6e" + "\x8f\x68\xba\x6f\x04\x34\x55\xf5\x5b\x6f\x90\x68\x6a\x43\x9d\x99" + "\x17\x13\x4a\x41\xe6\x19\x6d\x47\x99\xff\x57\xb0\x77\x32\xc1\x6e" + "\x4b\x17\x54\xdb\xc2\x80\x26\x2a\xdc\x13\x80\xb1\xc1\xd2\x92\xe9" + "\xe9\xb4\x7d\xf4\xaa\x3d\xaf\x78\x0b\xa6\x81\xec\x8a\xbb\x17\xfd" + "\xdd\xe9\x4d\xa4\x54\x4e\xcb\xeb\xaf\x58\x40\xc7\x04\x2c\xec\x46" + "\x9b\x33\xaf\xd8\x28\xd0\x38\x82\x72\x64\xc9\x4c\xa2\xe8\x06\x59" + "\xa1\x4f\x22\xb7\x6f\x01\x79\xd7\x0d\xf2\xf3\xbc\x4c\xd5\x36\x4f" + "\x2f\x50\xb8\xd2\xd0\x8f\xa9\xe0\x57\x94\x4e\x77\x70\xfe\x22\xcf" + "\x70\xad\xb1\x6e\xc9\x27\x50\x9e\xdf\x89\x9a\x68\x1b\x49\x8b\xeb" + "\xcf\x5f\x21\x2d\x52\x6b\x37\x0c\xdd\x4f\x30\x3e\x61\x4a\x1b\xf2" + "\xb5\x8c\x18\x5b\x1d\xfd\x44\x78\x9d\xcb\x61\xe4\x05\xf6\x0b\xec" + "\x23\x9b\x9d\xe4\x2f\xc8\x76\xf5\x2e\x31\x5e\x87\x1d\xe4\xef\x2e" + "\x8c\x3f\x00\xbc\xc4\x38\x1e\x03\xf6\x8f\x37\xa0\x7f\xac\x63\xb1" + "\x94\x34\x40\x8f\xb2\xee\x2e\xce\x43\xe4\x99\xd1\x56\xcd\xf8\xb7" + "\x45\x94\xf7\x9c\xee\x45\xff\x41\x69\x24\xb1\x43\xdd\x85\xbc\xe2" + "\x74\xda\x15\x37\x1e\xe7\x25\x61\xfc\x1c\x1a\x10\x0b\xb6\xc3\xb7" + "\xa0\x0f\x56\x02\xbe\x2e\x92\xe0\xdd\x2b\xc1\x1e\xe8\xc2\x98\x68" + "\x50\x9f\xb5\x3c\x96\xac\x90\xe5\x1b\x0f\xef\x98\x5f\x56\x41\xf2" + "\xcb\xda\xa9\xc3\x71\xbf\x63\xbe\x68\x95\x4e\xee\xf8\xe6\xb1\x74" + "\xbb\xb2\xa7\x9c\x9d\xad\x97\xf9\xbf\xc5\xd7\xb2\xff\xdf\x7d\x48" + "\xd7\x76\x99\x3f\xf7\x47\x9f\x7d\x68\xbf\x3e\x95\x8c\x3b\x2f\xf3" + "\xcf\xa1\x9b\x2a\xf7\xe8\x31\x2e\xb6\xf4\x2e\x2d\x12\xe9\xb0\xef" + "\x9e\x74\x92\x6e\xcf\xe9\x69\x32\x26\x5f\x40\x3f\x87\xc3\x94\xbd" + "\xfe\x7b\xb0\x2c\x7b\xf6\xb1\x4c\xa0\x53\xb8\xb0\xe9\x98\x01\x64" + "\x4a\x28\xfd\x1d\xb4\xf5\xb7\xd0\xd6\xf3\x40\xd7\xf3\xd0\xd6\xd7" + "\xc5\xb6\x8a\x71\xe2\x04\xa0\x3f\xbc\x1b\x58\xff\x49\x6d\xfd\x1d" + "\xfa\x34\x3f\x98\xbc\xfe\x02\xf9\x01\xbd\x13\xd7\x77\xd9\xd9\xc7" + "\x2e\xa3\xed\x24\xc1\xef\x32\xfd\x6c\x88\x51\x3e\x0b\x78\x44\x9a" + "\x83\x4d\xa0\xa7\xfe\xdb\xa2\x25\x3e\x60\x7d\x68\x4f\xdc\xf8\xd2" + "\x95\x50\x1f\xa4\xfd\x45\x82\xf1\x24\x02\x81\xf6\xc1\xa5\x48\x7f" + "\xd7\x58\xcd\x81\x8c\x07\x63\x81\x07\x2b\x45\x1e\xe4\x88\x3c\x00" + "\x5b\x11\x74\x35\xce\x71\x68\x4a\x33\x38\x0f\x86\x47\xa3\x80\xca" + "\x51\xee\xaf\x85\xee\xfb\xeb\x0f\x64\xdd\x7c\x0c\x29\x43\xff\xb0" + "\x60\x1f\x7f\x26\xf4\x40\xbf\xcd\x13\xfb\x2d\x8d\xfb\xa9\xd4\x67" + "\xcf\xca\xd4\xbb\x3c\xeb\xb3\x13\x73\xff\x4d\xfb\x6c\xe0\xb5\xed" + "\xb3\x93\x9e\x75\xed\xb3\x93\xb2\x5d\xfb\xec\xa4\x47\x1d\x7d\x56" + "\x7c\x37\x2a\x7d\x76\xd2\xe2\xef\xa6\xcf\x4e\x5a\x3c\x40\x9f\x4d" + "\xf4\xa0\xcf\x6a\xdc\xf4\x59\xcd\xb5\xeb\xb3\x3f\x48\xbe\x7e\x3a" + "\x76\xf2\xfb\xdd\xf2\x01\x74\xec\x1b\x4e\x3a\xd6\x0f\x75\x6c\xe0" + "\x82\x81\xfa\x6b\x4f\x09\xf4\x57\x95\xd8\x5f\x7f\xf3\x3f\x50\xde" + "\x2d\xf3\x8e\x36\x0f\xdd\x5f\x6d\x25\x0e\xfb\xc9\x6d\x9f\x8d\xc3" + "\x3e\xbb\x8f\x18\x4d\xac\xcf\xc6\x48\x7d\xb6\x44\x1c\xef\x0c\xd2" + "\x6f\x03\xdd\xf5\x5b\x8c\x9d\x85\x71\xb3\x06\xed\xb7\xa2\xbd\xd4" + "\x33\x0d\xfb\x6d\xc5\x0d\xa6\x6b\x27\xfb\xb9\xf6\xdb\xc9\xe1\xae" + "\xfd\xf6\x96\xcb\x8e\x7e\x2b\xbe\x1b\x95\x7e\x3b\x59\xf5\xdd\xf4" + "\xdb\xc9\xaa\xef\x8f\xae\xbd\xd5\xed\x5e\x99\xd1\xd7\xb5\x53\xd7" + "\xb0\x7e\xeb\x4e\xd7\xa6\x89\xba\xd6\x0f\x75\xad\xc6\xd7\xb3\xbe" + "\x3b\x45\xf6\x6f\xde\x77\xaf\xb1\xce\x9d\x72\xc4\xb5\xef\x4e\xb1" + "\xb9\xf6\xdd\x29\x7f\x75\xf4\x5d\xf1\xdd\xa8\xf4\xdd\x29\xd5\xdf" + "\x4d\xdf\x9d\x52\xfd\xfd\xd1\xb9\x53\xdb\xdd\xf5\x5d\xed\x74\x92" + "\xde\x22\xbb\x6d\x9e\xb1\x84\xed\xc1\x4b\x37\xda\x1e\x21\x6c\xdf" + "\x8a\xec\xb6\x15\x46\x4d\x18\x11\x36\xd5\x36\x61\xfc\x13\xdc\x3f" + "\x53\xe0\xb4\x3f\x85\xad\xe9\xca\x6e\xcb\x95\xf6\xd7\xec\x16\x63" + "\xa4\x0c\xb6\xbf\x86\x66\xd7\xc6\x89\xbf\xab\xe6\xd8\xa8\x8d\x97" + "\x9e\x99\x2f\x19\xd9\x6d\xb5\x34\xa7\x36\xd6\xec\x5b\x1b\xeb\x6e" + "\x9d\xc4\x7f\x03\xa5\xb8\xa7\xa4\x73\x7a\x7c\x43\xe7\x26\x42\xb6" + "\xb0\x35\x88\x20\x05\xfc\x96\xc5\xaf\xe9\xf4\x57\x97\x75\x66\x2c" + "\x22\x90\xa6\x91\xd2\x58\xbc\xea\x0c\x1f\x2a\xc0\x3b\x90\x21\x25" + "\xbb\x53\x89\x12\xfd\x1c\xdf\x73\x05\xb1\x18\xa4\x03\x19\xc1\xf6" + "\x8b\xb0\x75\xfc\x5b\x6f\xb3\x94\x76\x10\x45\x7d\x26\xdb\x37\x87" + "\xfb\x72\xf6\xe4\x21\xfe\x7d\xee\xde\x41\xe5\x0a\x22\xec\x8a\xda" + "\x47\xfd\x8a\xb2\xd9\x3e\x62\xc0\x8a\xb4\x57\x07\x63\xf0\x09\xd3" + "\xa2\xe6\x4b\xbe\x76\x29\xd4\xef\xc3\x54\x3c\x67\xea\x43\x4b\x13" + "\x88\x1a\x2e\x15\xcd\x2d\xca\x86\x7a\x95\x49\xf3\x87\x6e\xf7\x84" + "\x63\xcc\xdd\xdb\x34\x0a\x71\x5f\x10\xfa\x1c\x60\xfb\xd6\x37\xcb" + "\x85\x6c\x3b\xa4\xd3\x8c\x34\x6a\x4c\xb6\x91\x00\xa0\x05\xae\xe1" + "\x63\xec\x2e\xa1\x34\xbe\x61\xe3\x54\x42\xde\x59\xd7\x26\xc7\xfd" + "\x1c\xf6\xff\xbc\xcd\x52\x91\x7a\x3f\xae\xf1\x33\x3f\xfd\x67\x65" + "\xd3\x0e\x44\x9c\xe3\xf1\x75\xe1\xff\xf7\x71\xed\x61\x21\x3c\xe3" + "\x1a\xb9\xd0\xa9\x51\x60\x5e\x48\x5f\x56\x91\xf4\x25\x09\xd0\xb3" + "\xbd\xf6\x4a\x31\xef\x6c\xcc\x6b\x92\x4d\x63\x7b\x14\xe0\x79\x3e" + "\xce\x97\xe3\x7e\x7c\x76\x6e\xa3\x24\x6a\x1f\x93\x0f\x86\xa2\x6c" + "\x68\x3f\xdb\xe3\x89\xed\xdc\x0c\x6d\x86\x3c\x2a\xdc\xaf\xc3\xee" + "\xa9\x44\x5d\x08\x69\x58\x0e\xdc\x55\x6c\xcf\xb0\x6c\x5a\x30\x96" + "\xed\xf6\xac\x81\xaa\x28\x9b\x02\xb6\xf9\xd9\x1b\xd9\xb1\x16\xd9" + "\x74\xe8\x2b\x94\xc2\x37\xe7\x6f\xc4\x79\x6c\xdc\xdf\x8d\x7b\xd6" + "\x65\xd3\xef\x83\xf2\x15\xbb\xd9\xbc\xed\x74\xf8\x46\xd0\xa1\xde" + "\xfd\x08\x6c\xad\x65\x7a\x1c\x7e\x07\x7f\x23\xe6\x67\x7b\x09\xb0" + "\xce\xda\x54\x1f\x0a\xcf\xbf\xe4\x7b\xc0\x95\xd1\xf0\xfb\x45\xbd" + "\x7b\xc0\xf9\xef\x00\x4b\xd3\x63\x81\x67\x4d\x6c\xff\x9b\x7c\xe0" + "\x39\x7f\xb6\x27\x59\xe4\x5b\x9d\x06\xb0\xd1\x97\x77\x12\x46\x00" + "\x17\x12\x46\xb0\xbe\xef\xa6\x9a\xe4\x4c\x1f\xc9\xa6\xb3\xf8\x13" + "\x79\xc0\x43\x7b\xb1\x46\xc1\xe6\xa6\x7b\x90\x2f\x2d\xf0\xee\xf6" + "\xb7\x91\x2f\x9b\x41\x17\x88\x79\x6b\x1d\xf5\xc7\xe7\xdb\x19\x3f" + "\x05\xe0\x05\xdb\xf3\x24\xbb\x7d\x3d\x8b\x93\x04\x32\x03\xf7\xaa" + "\x57\x82\xc5\x4d\x11\xb7\x80\x91\x77\x12\xac\xf2\xd2\x24\x9e\xfe" + "\x61\x87\x55\xbe\xf9\x3c\x41\xd9\x42\x72\x7f\x4b\x14\xa0\x87\x14" + "\x58\x26\x0d\x8a\x9a\x7f\xaf\xc4\xc7\x75\xc0\xbb\x24\xc0\x2e\xd0" + "\x7c\x33\xd0\xaf\xb4\x9b\xad\xd5\xcc\x2f\x15\x88\x4a\x80\x7c\x26" + "\xd9\xed\xe5\x50\x9e\x1a\x63\x82\xe2\x9e\x6a\xa0\x61\x62\x57\xd6" + "\xed\x85\x12\x0d\xb1\x4e\xb8\x27\x1a\xe3\x83\x42\x5e\x35\xc7\xd0" + "\x74\x93\xd4\x66\x77\xf4\xcc\x7d\x87\x04\xe5\xde\x43\xc2\x04\xe5" + "\xe5\x36\xea\x73\xdb\x1e\x9c\x6f\x7e\xba\x1d\x7d\x56\xb5\x91\x88" + "\xdf\x9f\xa2\x46\xb3\x9d\x08\xbe\x97\xdb\x70\x1d\xc2\xbe\xf1\xee" + "\x49\x11\x6b\x81\x5e\xa0\xef\xd3\xac\x44\x6d\x4c\x35\xf3\x78\x7e" + "\xe4\x12\xb1\xaf\x06\x19\x0e\x72\x1d\x74\xaa\x22\xed\x12\x99\x82" + "\xf4\x12\xfc\x0a\xdb\xce\xca\xb4\xcb\x9f\x4d\x24\xe9\xc3\x93\xa3" + "\x5a\x76\x7e\x13\xed\x0b\x90\xf9\x72\x16\xdf\xde\x0c\xf6\x49\x6e" + "\x61\xdb\x30\xcb\x71\x1b\x2f\x0b\xdb\x2d\xe0\x3c\xb4\xd8\xe6\x08" + "\x6c\xb3\xc5\x4a\x70\x2e\xff\xe9\xd7\xd0\x57\xf2\x65\x22\xe4\x5c" + "\x6e\xc3\x36\x83\xad\x13\x37\xfc\x39\x7d\xad\x75\xb0\x6f\x53\xa0" + "\xb7\xb0\xf1\xb6\x3d\x82\xaa\x28\x0e\xbf\x8d\x75\xc0\x73\x3e\x4f" + "\x5f\x26\x8c\xee\x48\x7f\xa3\xd5\x4e\xa8\xaf\x73\x1d\x6c\xc3\xac" + "\xc3\x1d\xee\xdb\x7f\x0f\x09\x32\xbc\xc3\xf9\x6e\xdf\x28\xd2\x20" + "\x0e\xd7\xc1\x8a\xe2\x30\x06\xe1\xd3\x58\x07\xf3\x05\xb2\xf0\x02" + "\x61\xfc\x37\xea\xda\x89\xdd\xe7\xee\x49\xb8\xe7\x00\xf9\x9f\x6a" + "\x03\xfe\x5f\xb1\xa2\x7f\x24\xb3\x31\xfd\x2a\x41\xfb\xc5\xd6\xa9" + "\x93\xf7\xe7\xff\x9d\xcb\x9f\x4d\x1e\x2e\xff\xef\x1c\x25\xfe\xdf" + "\x79\x03\xb4\xff\x2e\x2f\xda\x7f\xd7\x28\xb5\xff\xae\x1b\xa0\xfd" + "\xc1\x5e\xb4\x3f\x78\x94\xda\x1f\xec\xb6\xfd\x4f\x4c\x11\x28\xdb" + "\x8b\xe2\xbf\x75\x11\xea\x00\xae\xaf\x66\xc4\xe0\xbe\x13\x76\xae" + "\x4b\x7c\x26\xfc\x9c\x97\xb2\xcf\xb3\xaa\xcf\xb3\xba\xcf\x73\x60" + "\x9f\x67\x4d\x9f\xe7\x20\xe9\x19\xf4\xc8\x98\x8b\xb2\xe0\x63\x60" + "\x97\xa6\x9b\x64\x33\xe2\xc5\xf7\xc1\xe8\x3f\x0c\x74\x7a\xf0\x20" + "\x31\x25\x6f\x3b\x2f\x9b\xc1\xce\x69\xd3\x8d\x53\x75\x74\x5d\x3a" + "\x11\x0c\x31\x81\x4f\xaf\x07\xd9\x05\xfc\xa3\x3d\x9a\xb1\x60\x23" + "\xdc\x8a\x3e\xea\x70\xdf\x81\x36\x01\xf7\x93\xcc\xa8\xc2\xf6\xdd" + "\xa3\xaf\x20\x82\xcf\xdd\x6c\x3d\x5f\xc8\x8d\x09\x34\xfb\xdc\x3d" + "\x95\xee\x2c\x36\xe7\xc9\x05\x65\x5e\x86\xa0\x5d\x6f\xa6\xe6\x05" + "\xa0\x25\x23\x2e\xa3\xdf\x78\xe0\x71\x22\x35\x57\x24\x5c\x80\xfa" + "\xfe\x70\x56\x5d\x0a\x94\x0d\xdf\x81\x6f\xc1\x38\x2e\xda\xc2\x63" + "\x9c\xc7\x04\xd6\x5b\xaa\x09\xc6\xed\x11\xcb\x54\x53\xbf\x68\x0b" + "\x96\x39\xa0\x7d\x6a\xd8\x9a\x09\xdf\x7c\xe4\x59\x9d\x82\xd0\x0d" + "\x8a\xc0\xe1\xf1\xf4\x87\x8b\xdc\xda\xbd\x86\x7c\x05\x2f\x57\xe9" + "\x4d\xb9\xfb\x06\x29\x57\xac\xaf\xda\x8b\x72\x7f\xd4\x6f\x3f\xa5" + "\xa3\xdc\x02\xb1\xbe\x5a\x6f\xca\x8d\x1c\xa4\x5c\xb1\xbe\xe1\xde" + "\x94\x5b\xe6\xbe\xdc\x42\xb1\xbe\xe9\x5e\x94\xab\x53\xba\x2f\x77" + "\x6b\xa6\x77\x58\xd0\xf5\xdb\x93\xef\x8c\x05\xef\x70\xa0\x1b\xa4" + "\xfd\xf9\x99\xde\x61\x60\xa6\x62\x30\x0c\x78\xc7\xff\x99\x83\xf2" + "\xdf\x3b\xde\xcf\xdc\x3f\x18\xef\xbd\xe3\xfb\xdd\x6e\xf1\x8f\xb6" + "\x3c\xf0\x3e\x9c\xfa\x17\x9b\x84\xbc\x98\x70\xc1\x7f\xeb\xe3\x1b" + "\x85\x70\xf2\x04\xc8\xb0\x80\x1d\x64\x62\x38\x1b\x1f\xdf\x5d\xb8" + "\xbe\x84\xc8\x61\xbc\x2b\x3f\xb0\xae\x49\x6e\xb4\x85\xa1\xce\xb1" + "\xef\x4d\xb2\xca\xee\x82\xf4\x8f\x41\x67\x59\xc0\xee\xe4\xe5\xc4" + "\x84\xe7\xa5\x86\x13\xd1\x67\x86\x05\x7d\xa4\x46\x80\x1c\x33\xee" + "\xb0\xe2\xbe\x95\x89\xf0\x3b\x1b\xe0\x17\xca\xb0\x92\x77\x05\xb3" + "\x2c\x3c\x81\xe5\x33\xb3\xf3\x79\x79\x5b\x1f\xa7\x69\x3a\xf4\x9d" + "\x68\x86\x6f\xda\x7d\xcc\x44\x8e\x3e\x8e\xba\xb2\xee\xb6\x9a\x64" + "\x3f\x6e\x13\xcf\xa3\xb6\x33\x1f\x9f\x50\x5f\x3c\xeb\x89\x79\xd1" + "\xd7\xe7\x3d\x7a\x22\x47\xff\xeb\x5d\x59\x3f\x0e\x46\xbf\x9f\x83" + "\x9d\xeb\xb6\x1b\x8a\x82\xf1\xf7\x40\xcf\xb6\xd4\x0b\x44\x8e\x67" + "\x39\x61\x1c\xb0\x27\x0f\xc6\x10\xf3\x66\xe2\x9c\x47\x07\x49\x5d" + "\x4f\x05\x9c\x7f\xa2\xaa\xc2\x26\xdc\x1b\xc7\xf6\x8d\xcb\x7e\x5c" + "\x51\xca\xf7\x91\x5b\x59\x4c\x5f\x78\x66\xe3\x18\xdc\x1b\xa3\x8a" + "\xae\xa6\x79\x7e\xe1\xf5\x96\x0e\x16\x2f\xa8\x45\xf6\xe3\x8f\xd1" + "\xff\x62\xa7\xaa\x48\x6b\x51\x15\xe9\xa0\x5e\x87\xa4\x36\xe0\xf7" + "\xa5\x74\x1c\xb7\x61\x3e\x78\xdf\x2c\x9d\xf3\x76\x13\xe3\x7a\x52" + "\x84\x86\x9a\x7b\xfd\x6a\xc8\x66\x3d\x86\xb4\x07\x5b\x41\x63\x49" + "\xd3\x4d\xe7\xf3\x18\x21\x71\x38\x1e\x86\x7a\xf3\xb8\x9c\xb9\x31" + "\x0a\xe6\x83\x17\x74\xc0\xb3\x3a\xf9\x30\xed\xd6\x10\xa6\xff\x2b" + "\xa6\xa3\x8e\x9c\x35\x13\xca\xff\x49\x8b\x2c\xc4\xc0\xc7\x62\x31" + "\x1a\x76\xbe\x51\x16\xa2\x83\x6f\x68\xa8\x21\xba\x02\xf3\xc1\xfb" + "\xfd\xe2\x7b\xad\xd3\x7b\x2d\xee\x95\x14\xdf\x8b\x63\xb9\x98\x60" + "\xa7\xf7\xc1\xfa\xe9\x38\x37\x11\x62\xc1\x36\x50\x55\x0c\xd3\x6d" + "\xbd\x7e\x42\xfc\x62\x88\x98\x2f\xb0\x5d\x36\xcb\xaf\x13\xb0\x05" + "\xef\x83\x9c\x7e\x1f\x74\x38\x39\x94\x3c\xb1\x0b\x69\x38\x4b\x6b" + "\x92\x17\x25\xf2\xf1\x6c\x48\x08\x6b\xbb\x2a\xda\xea\x5c\x1e\xa4" + "\xb7\x83\x5e\xb4\x5a\xc0\x8e\x82\xff\x03\xf1\x9b\xce\xf4\x96\x4e" + "\x59\x6a\x63\x57\xc4\x68\x5f\x5e\xb5\x66\x25\x9e\x92\x1b\xef\xb2" + "\xc7\x51\x8d\xe7\x48\x05\xc3\x76\xa5\x71\x07\x9e\x6b\x53\xb3\xf3" + "\xe0\x85\xb8\x6f\xca\xbf\x38\xdc\x9e\x57\xd4\x20\xf8\x17\x9a\x2b" + "\xd6\x3d\x4e\x2e\xca\x66\xfd\x15\xdb\x6b\xd4\x12\x62\xd8\x8e\x7e" + "\x3c\x8e\x62\x1a\xf3\x57\x8a\x71\xa5\xd8\x98\x7d\x9d\x92\x54\x6a" + "\x3b\xd8\xb8\x1f\xde\xd9\xd9\x1c\xc7\x65\x22\xb7\x65\x28\xc9\x7f" + "\xa7\x36\xc8\x0f\x09\x26\xf9\x7f\x0b\x4d\x6c\x9f\xee\x61\x4d\x35" + "\xb9\x37\x59\x89\xb1\x0a\xe5\x1f\xc1\x58\x1a\xdf\xe3\x3b\xe9\x2c" + "\xc2\x45\xd9\x3d\x0b\xd9\x9e\xdd\x3b\xf9\xff\x69\x3b\xe8\xe9\xc3" + "\x1a\xd1\x67\x85\x6c\xd6\x5b\x58\x57\xf4\xe7\x01\x74\xfc\x23\xd6" + "\xcf\x24\x9b\xb5\xd7\xa7\x84\xed\x5d\x56\x41\xfe\xad\x42\xee\x76" + "\x26\x0f\x6c\x59\xb3\x22\x69\x86\x6a\x2f\x9e\xb1\x2b\x11\xcf\xdd" + "\x75\x65\xdd\x93\xe2\x74\x9e\x14\x7d\x91\xfc\x0c\xd2\xb6\x48\x67" + "\x1b\x30\xce\x99\x3b\xf9\x62\x05\x1b\xef\x6a\x50\x94\x4e\x50\x6d" + "\x03\x5e\x6c\x57\x56\xcf\x25\x38\xef\x22\xc3\x3d\xb3\xed\xb2\xd0" + "\x6c\xea\xb7\xcd\x9a\x8a\x7d\x3a\xaf\xd0\xfc\x5f\xb8\xef\x0f\xe8" + "\xb8\x1f\xf7\xf9\x01\x2d\xdf\x86\xe7\xa3\xf3\xf7\x11\xed\x33\x68" + "\x3b\xdd\x2b\xfb\x8f\x58\x6a\xbb\x7b\x51\x05\xa9\x6d\x7d\x8f\xd4" + "\x34\x56\x13\x55\x14\xf1\x49\x33\x51\x3b\x6b\x63\x22\x91\x47\x98" + "\x88\x4f\xea\x65\xec\xd3\x76\x82\xe7\x07\xea\xad\x75\x60\x0f\xc5" + "\x07\x1e\x48\x6d\x1b\xa3\x7d\x9a\x10\xe8\x7b\x6c\x8d\x99\x9d\xf3" + "\x31\xb3\x33\xd2\x7e\x38\xdf\xed\x74\xbe\x27\x2c\x25\x9a\x0a\xeb" + "\x2f\x10\x65\x5d\xdc\x49\x12\x11\xed\x43\xd9\xf9\x9e\x64\xc8\x68" + "\x06\xde\xbf\xae\xf3\xb7\xbf\xae\x9b\xb4\xf3\x0a\x09\xac\x4f\x34" + "\x81\x6d\x56\x4d\x8a\x13\x48\x20\xed\x8a\xf3\xad\xad\x3e\x4a\xe8" + "\xa6\xae\xb2\x77\x53\x2b\xc6\xd8\x95\x7c\x7f\x55\xc0\x06\x19\xf6" + "\x45\x7f\x03\xee\xb3\xba\x42\x42\x97\x9e\x49\x67\x73\xb2\x38\xff" + "\x6d\xeb\xd2\x69\x7b\xba\x74\x77\x76\xbf\xae\x9b\x2e\xcd\x9b\xbf" + "\x78\x41\x8d\xeb\x04\x91\x34\xeb\x8e\x70\xdc\xdb\x87\xe3\x00\x9b" + "\x6f\x4f\x39\xce\x91\x23\x86\xe1\xfb\x41\xc2\xcb\x3a\x72\xaf\x99" + "\x9d\x3d\xc2\x79\x7b\x75\xe9\x4b\x58\xd7\x0e\xc2\xf6\x0a\xf9\xf2" + "\xbd\x42\x56\x5c\xb3\x56\x15\x25\x2f\x5c\xae\x25\xdd\xd3\xa2\x74" + "\xc6\xe4\xff\x22\x69\x57\xe9\x69\x66\xc7\x27\x03\x6e\xb3\xee\xc1" + "\xb9\xbd\xe4\x2a\xdd\x71\xd4\x27\xb3\x87\x2f\x1f\x42\xd9\xfa\x2f" + "\xd2\x86\xe6\x01\xbf\x3a\x90\x6f\x85\xe6\xbf\x24\x98\xe5\x4f\xb5" + "\x52\x5b\x5d\xec\x7f\x91\x9a\xa6\x06\x17\xfe\x30\x7e\x42\x3e\xe4" + "\x13\xf2\x08\x79\xe5\xe0\xd3\x71\xc6\xa7\xfd\x02\xe7\x53\xb7\x6a" + "\x6b\xb8\xc4\x2b\x6b\x49\x54\x98\x27\xfc\xaa\x6d\x1d\x98\x5f\x40" + "\xe7\x5e\x7e\x15\x75\x90\x40\x63\x3b\xd8\xcb\xc0\xaf\xa7\x7e\x49" + "\xc8\x53\x6f\x53\xa1\x6e\xfe\xa7\xbd\x7c\xb3\x65\xbb\xe1\xdb\x39" + "\x07\xdf\x80\xff\x83\xf1\xad\x72\x38\x7c\xab\x6d\xe5\x7c\xb3\x89" + "\x7b\xbc\x74\x95\x44\x6e\x7d\x5d\x27\xdf\x71\x85\x84\x21\xff\x16" + "\x9c\xd1\x92\xaa\xc5\x75\xc0\xb3\xf7\x5c\xf8\x27\xe4\x16\x69\x80" + "\x07\x8b\x90\x87\xde\xf5\xbb\xd9\xc4\xf3\x7e\x77\xff\xda\x9b\xfd" + "\x6e\xb4\xfa\xdd\xfd\xda\x91\xf5\xbb\x07\x6a\x6f\xf6\xbb\xef\xba" + "\xdf\x3d\x50\xdd\xb7\xdf\xf5\xda\x0d\x09\xcb\x56\xc4\x2c\x5f\x89" + "\xc7\x13\x5f\x5a\x9b\xb8\x6c\x35\xb7\x1e\x5c\xec\x07\x8d\x3d\x35" + "\x5c\x8e\xfe\xe5\x6a\x77\x34\x90\x77\xa7\x36\xc8\xed\xdf\x68\x14" + "\xd4\xe0\x4f\x04\x83\x3a\x1b\xfd\x84\x62\xff\x2c\x44\x1f\x1e\xb2" + "\x47\x32\xeb\x83\x78\x4c\x4e\xfc\x9f\xd9\x4e\x41\x51\xe5\xb8\x5e" + "\xb3\xb1\x1b\xae\x75\x44\x11\x60\x25\xca\x8a\xe9\xf8\xfe\xe1\xd3" + "\xe8\x37\x91\xee\x8a\x2a\x2f\x85\x77\xe8\x87\xc7\xa2\x8a\xae\xc8" + "\x84\xf2\xcc\x7e\xdb\x95\x0a\x2d\x9e\xbb\x78\x28\x1c\x74\xbe\xbe" + "\xd7\xaf\x92\xec\xe1\xbd\x74\xec\x83\x5b\x50\x36\xe0\x39\xb9\x8b" + "\xb2\x87\xd6\x5c\xc5\xf5\x0e\xb0\xa9\x9f\x9d\x09\xdf\x9a\x16\x15" + "\xc6\xfc\x2c\x80\x9c\xe0\xef\xc3\x58\x0c\xb2\xab\x86\x42\x33\xda" + "\x1c\x9d\xaa\xe2\xf0\x4e\x43\x51\xc3\xd1\x94\x1d\xa2\x9c\x78\xe8" + "\xad\xa7\x76\x70\x39\x51\xa7\x01\x1c\x2e\x00\x1c\x46\x0e\x25\x27" + "\x9c\xf0\x37\x7d\x78\x72\x02\xf1\x86\xb8\x43\xcc\x4d\x00\xcc\x21" + "\x0e\x25\xdc\x15\x88\xb8\x0b\x68\x26\x6a\x86\x3d\x1b\xc7\x1e\x9e" + "\x73\xae\x4b\x76\xe0\xce\xde\x17\x77\x57\xfa\xe0\x4e\x2e\xe2\xee" + "\x75\x57\xdc\xbd\x70\x52\x4d\x8a\x19\xee\xb4\x0e\xdc\xe5\xf4\x94" + "\x4b\x98\x43\xfc\x21\xd6\x84\x57\x75\xa4\xae\xbd\xa3\x17\x7f\xa5" + "\xaf\xf0\x35\x57\xb6\xa7\x57\x4e\xcb\xae\xbe\x2e\xca\x8b\x0b\x92" + "\xbc\x28\x72\xa3\xa7\x4f\x7a\x29\x2f\xfe\x17\x5b\x7f\x46\x5e\x75" + "\x03\xdf\x90\x5f\x4f\x69\x40\x4e\x68\xfe\x40\x6a\x16\xdf\x20\xfc" + "\x49\x18\x1d\xfe\xa0\xef\x5b\xa8\xcb\x00\x3c\xba\xbd\x76\x28\x1e" + "\x21\x7f\x90\x4f\x8c\x3f\xc0\x27\x69\x5d\x1c\xd7\x49\x91\x57\xc8" + "\x9f\x7b\x52\x88\x1c\xf9\x55\x9a\xc4\x65\x04\xca\x02\xb6\x0f\xbb" + "\x8f\x8c\x07\x9a\x5b\x91\x67\x6c\x6c\x9d\xe1\x17\x5f\x88\xe7\x88" + "\x27\x49\x76\xf4\xc3\x95\xfd\xed\xe8\x87\x9b\x7a\xfd\x60\xca\x1e" + "\x62\xfe\x55\x2a\xa6\x3e\x02\xfd\xf3\x21\xee\xc3\xd1\xb0\xad\x9c" + "\xdb\xf0\x3f\x79\x50\x94\x01\x7b\x70\xec\xca\xc6\xa9\x76\x18\xa7" + "\xaa\x60\x9c\x6a\x80\x71\x6a\x72\x1b\xf7\x9d\x20\x7b\xe4\x3e\x22" + "\x9e\x6f\xa6\x7e\x85\x4d\x34\x37\x9a\xf9\x2d\x64\x6b\xbe\x7e\x45" + "\x5a\x5c\xa3\xa2\xb9\x30\x06\xfe\x83\x1c\x6c\x80\x22\x5d\x95\xce" + "\x3e\x4c\x4c\x3d\xb2\x48\x5c\xd3\x8e\xd5\xaf\xc3\xfd\x0e\x3f\xd1" + "\xf2\xfa\x3d\xc8\x62\xda\xb0\xf5\x40\xb9\xb0\xc7\xbe\xd1\x75\x3d" + "\xd0\x79\xbd\xf8\xdd\x54\xb3\xb8\x16\xf8\x13\xe6\x2b\x11\xe5\x09" + "\xca\xc1\x03\x30\xa6\x71\xac\x07\x7e\x8a\xef\x7d\x5d\xd7\x03\x1f" + "\x61\x3e\xe6\x4c\xb2\x9f\xcc\xc6\x3d\x30\xf0\x6c\xe6\xe9\x0f\x5a" + "\x9d\xd3\x1d\xeb\xed\x3c\x5d\x90\xb3\x98\x2b\x38\x5f\xd0\xce\xe7" + "\x09\x7e\xb2\x40\x1a\x8f\xbb\xb1\x9f\x86\x21\xa7\xc3\xc3\x1d\x72" + "\x3a\x9c\xef\xd5\xd2\x14\xb7\xd5\xf5\x93\xd3\x5f\xc2\xfb\x9f\xed" + "\x7a\x1a\xe5\xb4\xa1\xd0\x24\xf2\xf4\x04\xd0\xc4\x07\x63\x67\x62" + "\x3a\x9e\x3f\x42\x79\xbd\x0b\xcf\xe6\x30\x19\x5e\xdc\x94\xc9\xd6" + "\xfd\x7f\x62\x73\x95\xdd\x3f\x8b\x76\x95\xdd\x73\xee\x1b\x5c\x76" + "\x3f\x7a\x61\x70\xd9\x3d\xe7\xc5\x9b\xb2\x7b\xb4\x65\xb7\x64\xeb" + "\x79\x2b\xbb\x1f\x2d\xbf\x29\xbb\xaf\xb7\xec\x7e\xf4\xa0\x93\xec" + "\xfe\xb5\xab\xec\xfe\x59\x7a\x7f\xd9\xfd\xb3\x42\x87\xec\x9e\xa3" + "\x74\xc8\xee\x9f\x54\xb8\xca\xee\xf0\x4b\x9e\xc9\xee\x9f\x5d\xb8" + "\xb6\xb2\x3b\x5c\xe5\x2a\xbb\xc3\x9b\x45\x39\xf4\xd6\xf0\x65\x77" + "\xf8\x07\x83\xcb\xee\xf0\x2a\x57\xd9\x1d\xbe\x83\xcb\xe8\x70\x33" + "\x97\xdd\xe1\xfb\x45\x1d\xb0\xc7\x39\xdd\x21\xbb\x79\x7a\x7f\xd9" + "\xfd\x98\x72\x08\xd9\xad\xb3\x0b\x92\xec\x6e\x02\xd9\xdd\x24\x17" + "\x5e\x75\x27\xbb\x7f\x1e\x57\x87\xb2\x3b\x01\x65\xf7\xcf\xe3\x06" + "\x97\xdd\x3f\x7f\x16\x65\x34\xe0\x98\x94\xa0\x8f\x64\xc0\x65\xc5" + "\x2b\x5f\xe2\xfc\x75\x2b\xe2\xf6\xac\x6c\xde\x81\xa7\x53\x9c\x65" + "\xfb\x63\x7f\xeb\x95\xed\x90\x2e\x4c\x71\x95\xed\x28\xd7\x51\xbe" + "\xef\xda\x4e\x4d\xa5\xdb\x69\x33\xb4\xcb\x24\xc9\xf8\x5c\x48\xc3" + "\x78\x49\xe8\x03\x69\xd7\x15\x76\x29\x80\x06\xad\x1b\xe1\xbb\xf8" + "\x9b\xae\xac\xc7\x55\xae\xfa\x60\x9e\xde\x96\xe5\xac\x0f\x1e\x7f" + "\x0c\xf5\x81\x81\x9f\x51\x67\x7a\xc0\xb6\x2b\x2a\x0c\x75\x03\x7f" + "\xff\x84\x7d\x70\x7d\xf0\xf8\x8a\xef\x4a\x1f\xa0\xac\x99\xe0\x34" + "\x86\x74\xa7\x0f\x70\x4e\xb5\x2e\xf6\xfa\xe8\x03\x94\x33\x28\x5f" + "\x50\xd6\xa0\xdc\x41\x39\x83\x32\xc7\x26\x9e\xcf\x2b\xc9\xf0\x40" + "\x1f\x80\x5c\xa1\x63\xef\xd7\x32\x7d\x20\xf3\x46\x1f\x3c\x51\xfd" + "\xbd\xd2\x07\xc8\x9f\x94\x6b\xab\x0f\xa4\x71\x3e\xf2\x07\x79\x25" + "\xf1\x48\x1a\xeb\x23\x7f\x90\x4f\xc8\x1f\xb4\x8d\x24\x7d\x30\x2b" + "\x99\xeb\x83\x5d\x43\xea\x83\x27\x2a\x7b\xf5\x81\x9c\xeb\x03\x36" + "\x27\x3e\x09\xf5\xc1\xbc\x2d\xfd\xf5\xc1\xbc\xbd\x0e\x7d\xf0\xb8" + "\x46\x94\x8f\xad\xe8\x7b\x01\xe4\x41\x89\xab\x4e\x78\x72\x8a\x67" + "\x3a\xe1\xe7\xb2\x7e\x3a\x01\x68\x6b\xe0\xeb\x66\xa8\x0f\xb4\xa8" + "\x0f\x6c\xa8\x17\xbc\xd2\x09\x3f\xd7\x3a\xf4\xd6\x63\x29\x5c\x16" + "\xcf\x3b\xe4\xaa\x27\x9e\x54\x88\x32\xed\x45\x67\x3d\x21\xf8\x78" + "\xa2\x27\x7e\x7e\x46\xd2\x13\x28\x87\x0f\xe0\x9a\x45\xaf\x9e\x60" + "\x72\xf5\x42\x45\x52\x8b\x93\x9e\xf8\x79\x05\xaf\xc3\x93\x1a\x3b" + "\xd3\x13\x3f\x6f\xe4\xe9\x8f\x45\x39\xa7\x3b\xf4\x04\x4f\xb7\x3b" + "\xeb\x89\x36\xd4\x13\x4f\x86\x0e\xa1\x27\x66\x7b\xae\x27\x16\x2a" + "\x1d\x7a\x62\xa1\x72\x70\x3d\xb1\xe0\x32\xea\x09\xe6\x83\x17\x78" + "\x0f\x38\x57\xe4\x4d\xe6\x3a\x02\xe7\x68\x40\x77\x98\xd0\xe7\x07" + "\xe4\x3b\xcd\x7c\xed\xc3\x05\xef\xdb\x0c\xf8\xbf\xc0\x7e\xd3\x1c" + "\x60\x26\x4a\xd4\x19\x86\xb3\x44\x81\x71\xea\x38\x9d\x16\x3c\x5a" + "\x82\xb1\x53\x7b\xf5\xcb\xfc\x5b\x3c\xd4\x2f\x8d\xa0\x5f\x1a\xba" + "\xb2\xe6\x87\x3b\xe9\x17\x8c\xf5\xd7\xd0\x47\xbf\x98\x40\xbf\xb4" + "\x4a\xbf\x81\xfc\x7a\xe7\xfc\x58\x3f\x96\xff\x2c\xbb\x30\x7f\x13" + "\xe4\x6f\xe6\xfa\x68\x7e\x89\xab\x3e\x5a\x40\x04\x97\xf1\xc9\xfc" + "\x63\x92\x3e\x42\x7d\x2e\xf4\xd3\x47\x4f\xe5\xf6\xea\xa3\xc9\x4e" + "\xfa\x28\x59\xd2\x47\xf3\xed\x37\xfc\xf8\x64\x04\xf2\xee\x5a\xeb" + "\x23\x01\xf4\x4e\x5f\x7d\x84\x3a\x4a\x1a\x9f\x08\x5e\xe9\xa3\xa7" + "\x22\xbf\x57\xfa\xe8\x3a\x8c\x4f\xfa\xf2\x46\xe2\x19\xf2\x07\x79" + "\x83\x7c\x41\x3f\xe0\xc8\x33\xe4\x17\xf2\x6a\x96\xde\x55\x17\x31" + "\x7e\x81\x3e\xea\xb7\x76\x00\xbc\x02\x9a\x2f\x46\x7e\x39\xeb\xa3" + "\xd2\x49\x92\x3e\x5a\xa0\xed\xaf\x8f\x16\xcc\x76\xe8\xa3\xf9\x6c" + "\x7f\x15\xf3\x7f\x28\x7b\xd2\xe6\xaa\x8b\x16\xbe\xef\x99\x2e\x5a" + "\x90\x3b\x80\x2e\x62\x7d\xd6\xb0\xdd\x65\x6c\xa2\x05\x7d\xe4\x85" + "\x2e\x5a\xb0\x9f\xd7\x11\xf7\x82\x3f\x59\xcb\xe5\xfd\x82\xf9\x0e" + "\xfd\xf4\xe4\x5e\xe7\x34\x87\x7e\x5a\xb8\x57\xd4\xa9\xbf\x1f\xbe" + "\x7e\x5a\xc8\x7e\x83\xfb\xc4\x0f\x74\x70\x1d\xe0\xaa\x9f\x16\xe6" + "\xba\xea\xa7\x85\xd1\xbc\x0e\x0b\xcb\xb9\x7e\x5a\x98\xc8\xd3\x9f" + "\xcc\x74\x4e\x77\xe8\x27\x9e\xde\x5f\x3f\x2d\x6c\x18\x42\x3f\xa9" + "\x7a\x4a\xa2\xc2\xba\x0d\xc5\x5a\xdb\xde\xf8\x86\x90\xa8\xdb\xed" + "\x7d\xfb\x13\xef\x47\x76\x82\xfd\xaa\x77\xbd\xed\x39\x42\x7a\x54" + "\x5b\xc3\x05\xf1\x3c\x75\x77\x50\x94\xee\x6c\x3c\xf4\xa9\x76\xf7" + "\x7d\x0a\xfa\x93\x52\xea\x4f\x75\x71\x67\x08\xf4\x31\x39\xae\xb7" + "\x15\x41\x5f\x32\x5a\x9a\x58\xdf\x52\xb5\x6a\x09\xfa\xb6\xf4\x6b" + "\x27\x6a\x3f\x99\x6c\xec\x7f\x3c\x0f\x7d\x16\xfa\xd5\xbc\x99\x54" + "\xb8\xbb\x59\x4b\xfc\xe2\x88\x3f\xf6\xad\x77\xc4\xf5\x1c\xf4\x85" + "\x81\xeb\x38\x80\xeb\xd0\xa5\xc7\x78\x9f\x2a\x82\xab\x9b\xf7\xa9" + "\xe9\xdd\x5d\xba\x3b\xdd\xad\xe3\x18\x93\x4d\x6c\x1d\x07\xcf\x2a" + "\xe1\x19\x31\x01\xfb\x10\xae\xe3\x58\xb9\x6d\x07\xf5\x55\xef\x66" + "\xeb\x38\x2d\x2e\xeb\x38\x3f\x6e\x26\x72\xf4\x93\x51\xec\xbc\x8e" + "\xa3\xab\xeb\x67\xd7\x61\xff\xc2\xfe\x34\x7c\x99\x17\xe1\xd6\xff" + "\x35\xdb\x3b\x01\xb4\xb6\xab\x8a\xb5\xb4\xa8\x44\xfd\x97\x16\xab" + "\x0c\x7d\x8a\xda\x81\x77\x02\xc8\x36\xaa\xec\x23\xdb\x7a\x44\x3e" + "\xf4\x70\x3e\x00\x0f\x95\x4b\x2c\x84\x2e\xb5\x41\xff\xe9\x11\xfd" + "\x8a\x5a\x4d\x80\x43\xdd\xa4\x5d\xeb\x90\xee\x1a\xb2\x4b\xf4\x2d" + "\x2a\xbc\x11\xe7\x2b\x00\xad\x69\x86\x9c\x1c\xb8\x62\x65\xeb\x9e" + "\x86\x6e\x12\x02\xb2\xcc\x0f\x65\x19\x60\x77\xfc\xee\x6e\xa0\xfb" + "\x69\x4e\x77\xf4\xf7\x86\x77\xdb\x1b\x3a\x2d\x94\x7d\x67\x4f\x0f" + "\xc8\x32\x2b\xa7\xfd\x92\xd7\xd4\x84\xf9\x23\xc5\xb5\x4f\xb0\x1b" + "\xea\x81\xdf\x4c\x96\x59\x02\x28\xc6\x08\x11\xbe\xd1\xa1\xef\xab" + "\xa0\x7b\x2d\x40\xfb\x1e\x1d\x62\x43\x5d\x7a\x16\xd7\x3e\xbf\x74" + "\x59\xfb\x34\xbf\xe1\x58\xfb\xac\xdf\x77\x9c\xef\x55\x71\x99\x0f" + "\x5b\xd8\xda\xb3\x8b\xeb\x1c\x36\x1f\x96\x38\x5c\xda\x2f\xaa\xfe" + "\xee\x68\xaf\xfe\x9e\xd3\x3e\xa2\x70\x64\xb4\x7f\x66\xee\x77\x47" + "\x7b\xe5\xf7\x9c\xf6\xbf\x54\x8f\x8c\xf6\xbf\xaa\x18\x8c\xf6\x38" + "\x86\x91\xc6\x2f\xd2\xd8\x05\x75\x18\xd7\xd7\xcf\x2d\x76\x8c\x5b" + "\x9e\x5b\x2c\xad\x21\x03\xcd\x14\xb9\xe8\xcf\x1b\x68\xa1\x7f\x85" + "\xdc\x7e\x5e\xf6\xec\x11\x69\xfd\x78\x0b\xc6\x95\x41\x3e\x16\x01" + "\x1f\x57\xe2\x59\x23\x91\x87\xa0\x73\x96\x5a\x40\x2f\x4c\x8b\x0a" + "\xb3\xe7\x82\x4e\xfa\x63\x7c\x83\x1b\x7e\xca\x51\x9f\xf8\x25\x12" + "\xf5\x12\xbd\x83\xaf\xc2\x1b\xc0\xcf\x6e\xb0\xcd\xac\x6d\x04\xcf" + "\x0f\x07\xb4\x81\xdd\xda\x13\xe7\x1b\x05\x63\x00\x89\xa7\xef\x24" + "\x59\x99\x5d\x36\x20\x4f\x77\xba\xf2\xb4\x73\x00\x9e\xbe\xb8\x1c" + "\xfa\xa9\x5c\xb4\x9d\x19\x4f\x4d\xbd\x3c\x65\x7a\xe4\x0d\x5d\x10" + "\xf2\x55\xe2\x29\xea\x11\xc6\xd3\x76\xae\x47\x7a\x7d\x2d\xbd\xe1" + "\xb0\x9d\x6b\xa3\x4f\x0e\xc0\xd3\x67\x0c\x2e\x3c\x8d\x1e\x2e\x4f" + "\x9f\x2d\x74\xb5\xbf\x7e\x2d\xf3\xcc\xfe\x7a\x6e\x22\xda\x57\xce" + "\xf6\x17\x3e\x77\x82\xbd\x65\xf7\x2b\x0a\xb6\x78\x35\xfe\x7f\x4e" + "\xeb\x6a\x4b\x3d\xd7\xce\xeb\xb4\xf8\xd1\xe1\xdb\x52\xcf\xd5\x61" + "\x9e\x03\x45\x03\xd9\x51\xcf\x1d\x77\xb5\xa3\x9e\xdb\xc7\xed\xa5" + "\x5f\xe3\x79\x5c\xb0\xa3\x9e\x3b\xc4\xd3\x17\xcf\x71\x4e\x77\xd8" + "\x51\x3c\xbd\x13\xfd\xcf\x65\xfd\x5a\x35\x3c\xdb\xe9\xd6\xef\xd8" + "\x76\xd2\x0c\x62\x3b\x69\xfe\x4d\x6c\xa7\xc8\xec\x9b\xfa\xdb\x5b" + "\x1d\xf2\x6b\xed\xc8\x74\xc8\x6f\xdc\x9e\x7f\xb8\xa9\xbf\x87\xa2" + "\x7d\x64\xc3\xc8\x68\xff\x42\xba\xf7\xfa\x7b\x49\xa0\x43\x7f\x2f" + "\x09\x74\xaf\xbf\x5f\xcc\xb9\xa9\xbf\x87\xa3\xbf\x7f\xb3\x60\x64" + "\xfa\xfb\xc5\xc5\xae\xfa\x7b\xc9\xc7\x9e\xe9\xef\x17\x8f\x8d\xbe" + "\xfe\x7e\xd1\xe4\xaa\xbf\x97\xec\xe7\x75\x7a\xc1\x3e\x7c\xfd\xbd" + "\x24\xd7\xbd\xfe\x5e\xb2\xcd\x55\x7f\x2f\x89\xe3\x7a\x7a\x49\x05" + "\xd7\xdf\x4b\x52\x78\xfa\x0b\x36\xe7\x74\x87\xfe\xe6\xe9\x5c\x7f" + "\x2f\xa9\x1d\x9e\xfe\x0e\xf8\x8e\xf5\xb7\x7a\x10\xfd\xad\xfe\x37" + "\xd1\xdf\xd1\x6e\xe3\x9f\xdf\xd4\x21\x43\xe9\x90\x25\xa6\x91\xe9" + "\x90\x18\xb7\xfe\x1f\x87\xd6\x21\xb1\x91\x0e\x1d\x12\x1b\xe9\x5e" + "\x87\xbc\x5c\x77\x53\x87\x0c\x47\x87\x44\x6f\x19\x99\x0e\x79\x79" + "\x87\xab\x0e\x59\x36\xc6\x33\x1d\x12\x7b\xcb\xe8\xeb\x90\xd8\x60" + "\x57\x1d\x12\x6b\xe6\x75\x7a\xe9\xb1\xe1\xeb\x90\xd8\x63\xee\x75" + "\x48\xec\x09\x57\x1d\x12\xbb\x9f\xeb\x8a\x65\x0a\xae\x43\x62\x2b" + "\x78\xfa\x4b\xe1\xce\xe9\x0e\x1d\xc2\xd3\xb9\x0e\x59\xa6\x1e\x9e" + "\x0e\x19\xf7\x1d\xeb\x10\xe5\x20\x3a\x44\xf9\x6f\xa2\x43\x5e\x31" + "\x78\x2f\xc7\x96\x6b\x1d\x72\x6c\xb9\xd6\xbd\x1c\x8b\xdb\x76\x53" + "\x8e\x0d\x47\x8e\x2d\x0b\x1e\x99\x1c\x8b\x8b\x76\x95\x63\xcb\xeb" + "\x3c\x93\x63\x71\x27\x47\x5f\x8e\xc5\xb5\xbb\xca\xb1\xe5\x62\x9d" + "\x5e\xf5\x1d\xbe\x1c\x5b\xbe\xd3\xbd\x1c\x5b\xfe\x96\xab\x1c\x5b" + "\x9e\xc8\xe5\xd5\xf2\x5a\x2e\xc7\x96\x67\xf3\xf4\x57\x95\xce\xe9" + "\x0e\x39\xc6\xd3\xb9\x1c\x5b\xde\x34\x94\x1c\xc3\x7e\x51\xa7\xe9" + "\xd3\x2f\x7e\x27\xf5\x8b\xf8\xf9\x35\x25\x52\xbf\x88\x67\x36\x9a" + "\x50\x12\x55\xfe\x66\x12\x51\x18\x30\x76\x0c\xc8\x08\xfd\x6f\xb0" + "\x5f\xfc\xee\x03\xdc\x27\xa2\x6a\x06\xb9\xd7\x2a\xca\xc1\x64\x90" + "\x83\xad\xf0\x8c\x7e\xd5\xa6\x45\x95\xa3\xfc\xc2\x98\x1a\xf8\xcc" + "\xe5\xa1\x79\x0c\xc6\xae\x61\x6b\xf3\x4e\xfd\x86\xf5\x95\x4e\xb1" + "\xaf\x74\xf2\xbe\x22\x9d\xdd\x4b\x69\xa5\x82\x7d\xb5\x6e\x52\x44" + "\xac\x0f\xc5\xfe\xc3\xce\x84\x41\xff\xa1\xab\x75\xfe\x25\x09\xd0" + "\x67\xcc\x6d\x04\x7d\xe7\x63\x9f\xf1\xdb\x20\xf3\xa7\x9d\x71\xbe" + "\x20\x13\xb9\xec\x13\xaa\xc7\xd8\xd0\x0f\xd6\x6a\x90\x7d\x1d\x20" + "\xfb\x3a\x1c\x7d\x05\xd7\xdb\x3b\x57\xeb\xb4\x96\xd5\xba\xe9\x3d" + "\x9d\x20\xfb\xcc\x7d\xfb\xc9\xed\xb5\xbb\x3b\x50\xf6\xb5\xb1\x7e" + "\xc2\x64\x1f\xf4\x0d\xa1\x13\x64\xdf\xab\xa2\xec\xeb\xd4\xa1\xac" + "\x57\xef\x7e\x05\x64\x5f\xf4\x79\x2e\xfb\x44\x1b\xee\x2e\x94\x7d" + "\xab\x75\xf2\x82\x0e\x51\xf6\xc5\xa0\xec\xab\x82\x3e\xf2\x3f\xae" + "\xb2\xcf\xcf\x5b\xd9\xf7\xbb\x6c\xd7\x7e\x12\x7f\xd9\xb3\x7e\x12" + "\x3f\xc6\x5d\x3f\xe9\xc9\xf5\xb6\x9f\xc4\x07\xba\xf6\x93\x78\x71" + "\x4f\xd1\x6f\xef\x18\x7e\x3f\x89\xff\xb8\xb7\x9f\xfc\xae\x6f\x3f" + "\x89\x3f\xe2\xda\x4f\xe2\x4b\x78\x7f\x88\xb7\xf0\x7e\x12\x5f\xc6" + "\xd3\x7f\xab\x75\x4e\x77\xf4\x13\x9e\xce\xfb\xc9\x0a\x72\x73\xbd" + "\xfc\xfb\xa6\xef\x57\xba\xf5\xff\x74\x73\xbd\x7c\xa8\x31\xe3\x8a" + "\xc0\x91\x8d\x19\x57\xb9\xf5\x7f\x77\x73\xbe\x7d\x28\xda\xaf\xac" + "\x1c\x19\xed\x5f\x73\x1b\xff\xe7\xe6\x5c\xc9\x50\xb4\xd7\x87\x8f" + "\x8c\xf6\x09\xe6\xa1\xc6\x18\xee\x6d\xa9\x35\x25\xb5\xbd\x63\x8c" + "\x35\x25\xd2\x3e\xdf\xfe\x63\x8c\x35\x13\x5d\xcf\xf1\xad\x7e\xab" + "\xef\x39\xbe\xa1\xc6\x1e\xb6\x9b\x63\x0f\xe0\xf5\x6b\x87\x46\x36" + "\xf6\x48\x6c\x76\xb5\xa9\x92\x7e\xe1\x99\x4d\xb5\xe6\x79\x77\x36" + "\x95\xcd\xeb\xb1\xc7\x9a\x38\x57\x9b\x2a\x69\xb6\x88\x8d\x15\xc3" + "\xb7\xa9\x92\x6e\x71\x6f\x53\x25\x4d\x73\xb5\xa9\xd6\x98\xb9\xed" + "\x94\x34\x9f\xdb\x54\x49\x0a\x9e\xbe\x3a\xde\x39\xdd\x61\x53\xf1" + "\x74\x6e\x53\x25\x2d\xbe\xb9\x8e\xfe\x7d\xb3\xa9\x5e\x6f\xb8\xa9" + "\xd7\xbd\xd5\x2d\x49\x71\x23\xd3\x2d\x6b\xbf\xc3\xfd\x9f\xdf\x77" + "\xbd\x9e\xac\x19\x19\xed\xd7\x0d\xba\xff\x73\x70\xbd\xbe\x3e\xd1" + "\xa1\xd7\xd7\x27\xba\xd7\xeb\x29\xe7\x5c\xf5\xfa\x1b\x6b\x6f\xea" + "\x75\x6f\xf4\xfa\xda\xc2\x91\xe9\xf5\x94\x83\xae\x7a\x3d\xf5\x0e" + "\xcf\xf4\xfa\xfa\xfb\x46\x5f\xaf\xaf\x0f\x77\xd5\xeb\xa9\x2a\x11" + "\x1b\xf3\x86\xaf\xd7\xd7\x5f\x70\xaf\xd7\xd7\x5f\x76\xd5\xeb\xeb" + "\xab\xb9\xfe\x4e\xd5\x72\xbd\xbe\xbe\x99\xa7\xbf\x31\xd7\x39\xdd" + "\xa1\xd7\x79\x3a\xd7\xeb\xa9\x21\x37\xd7\xd7\xbf\x6f\x7a\x3d\xcd" + "\xad\xff\xe3\x9b\xba\x65\x28\xdd\x92\x3a\xc2\x31\xe3\x06\xb7\xf1" + "\x7f\x87\xd6\x2d\x1b\x1b\x1c\xba\x65\x63\x83\x7b\xdd\xb2\x71\x9e" + "\xab\x6e\xd9\x70\xfc\xa6\x6e\xf1\x46\xb7\xa4\x99\x47\xa6\x5b\x36" + "\xaa\x5d\x75\x4b\xe6\x7a\xcf\x74\xcb\xc6\xdc\xd1\xd7\x2d\x1b\x4b" + "\x5c\x75\x4b\xa6\x18\x37\x68\xc3\x5b\xc3\xd7\x2d\x99\xbf\x70\xaf" + "\x5b\x32\x7f\xe9\xaa\x5b\x32\x83\xb9\x0e\xc9\x4c\xe1\xba\x25\x33" + "\x8c\xa7\x6f\xd8\xe3\x9c\xee\xd0\x2d\x3c\x9d\xeb\x96\xcc\xec\x9b" + "\xeb\xee\xdf\x37\xdd\x92\x35\xe8\xfe\xdf\xc1\xe5\x5b\x76\x99\x43" + "\xbe\x65\x97\xb9\x97\x6f\xd9\x33\x5c\xe5\x5b\xd6\xdf\x6e\xca\x37" + "\x6f\xe4\x5b\x66\xc9\xc8\xe4\xdb\xff\x36\xbb\xca\xb7\x9c\x17\x3d" + "\x93\x6f\xd9\x2b\x46\x5f\xbe\x65\xa7\xb8\xca\xb7\x9c\xf9\x22\x36" + "\x36\x0c\x5f\xbe\xe5\xcc\x74\x2f\xdf\x72\xee\x73\x95\x6f\x39\x0a" + "\x2e\xc7\x72\xa2\xb8\x7c\xcb\xd1\xf0\xf4\xac\x74\xe7\x74\x87\x7c" + "\xe3\xe9\x5c\xbe\xe5\xc4\x8d\x6c\x3d\xfe\x4d\xb3\x63\x3d\xfe\x4d" + "\xc6\x0b\x61\x47\x71\x5b\xff\xf5\xf8\x37\x97\xb9\xfa\x0b\xca\x39" + "\xc7\xd6\xe6\xb1\xcf\x58\xb8\x4f\x87\x01\xd7\xe9\xa7\x14\xb7\xdd" + "\x5c\xa7\xbf\x96\xeb\xf4\x6f\x86\xba\xf6\x1f\xc3\x2e\xcf\xfa\xcf" + "\x9b\x07\x46\x7f\x9d\xfe\xcd\x3e\x7e\x58\x0c\x62\x1c\xb4\x9c\xbf" + "\x0e\xbf\xff\x18\x96\xbb\xef\x3f\x86\xd7\x5c\xfb\x8f\x41\x1c\x63" + "\x1a\x4a\x78\xff\x31\x44\x8a\xfd\xaa\xcc\x39\xdd\xd1\x7f\x78\x3a" + "\xef\x3f\x86\x7d\x9e\xd8\x07\x36\x55\x71\x30\xea\xfb\x90\xe6\xdb" + "\xed\xbd\x38\x4f\x14\x71\x3e\x90\x7d\xf0\x12\xd7\x17\xcc\x36\xd8" + "\x1b\xdf\x38\xa4\x7d\xd0\x2a\xda\x07\xb1\xfd\xed\x03\xc9\x36\x28" + "\x01\x7c\x17\x79\xb4\x46\x2f\xe2\x1d\x6d\x83\x2b\xc3\xb5\x0d\xee" + "\x74\xd8\x06\x39\x7d\x6c\x83\x57\xfb\xd8\x06\x0c\xef\x2d\x2e\x78" + "\xef\x67\x1b\xf4\xe2\x7d\xb4\x6c\x83\x3c\xed\xcd\x35\x7a\x6f\xc7" + "\x9d\x86\x43\x23\x1b\x77\x6e\x2e\xb9\x39\x97\xef\x2d\xed\xf3\x46" + "\x38\x97\xbf\x55\x73\x73\xbe\xc5\x5b\xda\x6f\x1e\xa1\x2f\x87\xfc" + "\x42\xef\xc7\x23\xdb\xa2\x1d\xe3\x91\x6d\xd1\x92\x7d\x85\x72\x97" + "\xf9\xcc\x02\x59\x9b\x9b\x00\xd7\x15\x42\xde\x4c\x60\x31\x0f\x94" + "\xc6\xd6\xe3\x44\x9f\x8a\x36\x57\xe1\xf1\x88\x64\x67\x9b\xab\xe0" + "\x79\xc9\xde\x8a\x40\x5b\x0c\x6c\x2b\xb4\xab\xa4\x31\xc8\x96\x8e" + "\x21\xf6\x0f\xcf\x88\x6f\xc4\x31\x4b\x8f\x5f\x71\xf0\xbf\xef\x78" + "\x65\x6b\xf4\xc8\xc6\x2b\x85\x7b\x5c\xed\xad\xed\x7e\x9e\xd9\x5b" + "\xdb\xa6\x8d\xfe\x78\x65\x5b\x88\xab\xbd\xc5\xfc\x27\x23\x4e\x26" + "\x0e\xdf\xde\xda\x76\xc2\xbd\xbd\xb5\xed\xb4\xab\xbd\xb5\xed\x20" + "\xb7\xab\xb6\xab\xb8\xbd\xb5\xad\x9a\xa7\x17\xa8\x9d\xd3\x1d\xf6" + "\x16\x4f\xe7\xf6\xd6\x76\x8d\x87\xf6\x96\x6e\x04\xf6\x56\xd3\xf7" + "\xc7\xde\xba\xeb\x06\xb7\xb7\xfe\x73\x8b\x07\x7a\x27\xb8\x8f\xde" + "\x69\xbc\xa9\x77\x50\xd6\x6c\x0f\x19\x99\xde\xd9\xa9\x1a\x92\xf6" + "\x06\x27\xda\xa3\xcc\x17\xe9\x6e\x0f\x8e\x6f\xf4\x9a\xf6\x20\xeb" + "\x77\xa5\x7e\x9f\xe9\xfe\x9f\x4d\x23\xa3\x7b\x51\xe6\x4d\x5b\xcb" + "\x5b\xda\xef\x5c\x3c\x32\xda\xe3\x10\xc3\x5b\x5b\xab\xb4\xbd\xa6" + "\xd7\xd6\x2a\x6d\xef\x6b\x6b\xa1\x6d\xb5\xd0\xca\x6d\xae\x37\xc1" + "\x56\xda\xb4\x12\xec\xae\x24\x42\x8c\xad\x1f\x10\x03\xd8\x5e\x9b" + "\x2e\x82\xfd\x15\x0f\xf6\x97\xed\x8f\xa2\xfd\x55\x1a\xe3\x6a\x7f" + "\x95\x9c\x18\xd0\xfe\xf2\x73\xd8\x5f\x36\xb0\xad\x7a\xfe\x18\xdf" + "\xb8\xe5\xa2\x93\x2d\xf6\xdb\xfe\xb6\x58\x77\x6e\xb1\xae\x7b\x46" + "\x7c\x53\x0f\xd8\x63\x83\xd9\x62\x0c\x13\x03\xd8\x63\xff\xff\xb0" + "\xc5\x8a\x6a\x47\x66\x8b\x95\x86\xb8\xda\x62\xbb\x77\x7a\x66\x8b" + "\x95\xbe\xed\x76\xee\xcb\x6b\x5b\xac\xb4\xdc\xd5\x16\xdb\x9d\x29" + "\x62\x66\xfd\xf0\x6d\xb1\xdd\xcb\xdc\xdb\x62\xbb\x57\xb8\xda\x62" + "\xbb\xc5\xb3\xa7\xbb\x77\x70\x5b\x6c\xf7\x62\x9e\x5e\x92\xe2\x9c" + "\xee\xb0\xc5\x78\x3a\xb7\xc5\x76\xef\xf5\x70\x6d\x2c\xd8\x06\x3a" + "\xfd\xbb\xdf\x4f\x39\xd8\xda\xd8\x68\xed\xa7\xbc\xf3\x06\x5f\x1b" + "\x7b\x6b\xe8\xf9\xaf\x9b\x36\xc1\x00\xb2\x66\x77\xf9\xc8\xf4\xd2" + "\x1f\x76\xdc\xb4\x09\xbc\xa5\xfd\x5b\x23\x9c\xfb\xda\x1b\xe8\xbd" + "\x4d\xf0\x27\x93\x63\xfe\xe5\x4f\xa6\xe1\xcd\xbf\xfc\xe9\x59\x57" + "\xfd\xbf\x77\x60\xfd\x7f\x73\xfe\x65\x18\x3a\xff\x0f\xa6\x91\xe9" + "\xfc\x3f\x69\x5d\x75\xfe\x9f\x73\x3d\xd3\xf9\x7f\xda\x35\xfa\xf3" + "\x2f\x7f\xda\xef\xaa\xf3\xff\x9c\x2c\xe2\x64\xeb\xf0\x75\xfe\x9f" + "\x9f\x77\xaf\xf3\xff\x1c\xe3\xaa\xf3\xff\x3c\x9b\xeb\xf6\x3f\x1b" + "\xb8\xce\xff\xf3\x7c\x9e\xbe\x77\x8b\x73\xba\x43\xe7\xf3\x74\xae" + "\xf3\xff\xbc\x63\x78\xeb\x5d\x01\x37\xe8\x7a\x97\xfa\xdf\x64\xbd" + "\xeb\x6d\xf5\x4d\xbd\xe3\xad\xde\xf9\xf3\xfe\x91\xe9\x9d\xff\x1a" + "\xd2\xff\x87\x7b\xbd\x73\x20\xd2\xa1\x77\x0e\x44\x0e\x4f\xef\xec" + "\xaf\x73\xd5\x3b\x7f\xf9\xe5\x4d\xbd\x33\x52\xbd\xf3\x76\xe4\xc8" + "\xf4\xce\xfe\x3e\xfe\x8f\xde\xf1\xd0\xff\xd1\x01\xb7\xfe\x8f\xbc" + "\xd7\x3b\x07\xfa\xf8\x3f\x3a\x20\xfa\x3f\xfa\x8b\x17\x7e\x43\x0e" + "\x1c\x73\xaf\x77\x0e\xf4\xf1\x7f\x74\x40\xf4\x7f\xf4\x8e\xe8\xff" + "\xe8\x80\xe8\xff\xe8\x2f\x4a\xe7\x74\x87\xde\xf9\x8b\x93\xdf\x90" + "\x77\x6e\xfa\x3f\xfa\xde\xed\xc3\x7c\x77\x04\xf2\xef\xbd\x30\x87" + "\xfc\x7b\x2f\xcc\xfd\x3e\xcc\xbf\x1e\x70\xdd\x87\x59\xf6\xe8\xcd" + "\x7d\x98\xde\xc8\xb7\x77\x46\xe8\x17\xe9\xaf\xc9\xae\xf2\xed\xbd" + "\x33\x9e\xc9\xb7\xbf\x5e\x1e\x7d\xf9\xf6\x9e\xc2\x55\xbe\xbd\xd7" + "\x20\x62\xc3\x0b\xf9\xf6\xde\x5f\xdd\xcb\xb7\xf7\xde\x77\x95\x6f" + "\xef\x19\xb8\x1c\x7b\xaf\x95\xcb\xb7\xf7\xf6\xf0\xf4\x32\xa5\x73" + "\xba\x43\xbe\x95\x39\xc9\xb7\xf7\xcc\xc3\x5b\xd7\xf4\xca\xae\xbe" + "\x0e\xeb\x9a\xa3\x65\x57\xdf\xe8\xeb\x9a\x07\xe3\x6e\xce\xa3\x79" + "\x63\x53\xff\xb7\x62\x64\x36\xf5\xdf\x4c\xde\xeb\x94\xf2\x4a\x87" + "\x4e\x29\xaf\x74\xb7\xbe\xb3\x09\x70\x67\x00\x9b\x38\xe7\x22\x51" + "\xbc\x89\xeb\x3b\x8d\x75\x24\x17\xd7\x77\x56\x4a\xeb\x3b\xbb\x44" + "\x3b\xbb\xfc\x61\x57\x3b\xfb\xff\xbc\x3f\x90\x9d\x8d\xf6\xb5\x1d" + "\x6c\x67\x5b\xdf\x75\x9d\xdf\x0c\xac\x8b\xba\xfd\x8a\x75\x57\xff" + "\x18\xdf\x34\x5c\x5d\x54\xbc\x8e\xeb\xa2\xa2\xef\xbd\x2e\x3a\x58" + "\x36\x32\x5d\x54\xae\x70\xd5\x45\xef\xbf\xe6\x99\x2e\x2a\xdf\x30" + "\xfa\xba\xa8\x7c\x8b\xab\x2e\x7a\x3f\x4a\xc4\x8a\x17\xb1\x25\xdf" + "\x7f\xd4\xbd\x2e\x7a\x7f\x9e\xab\x2e\x7a\x5f\xc3\x75\xce\xfb\x7a" + "\xae\x8b\xde\x0f\xe1\xe9\xff\x27\xca\x39\xdd\xa1\x8b\x78\x3a\xd7" + "\x45\xef\xa7\x0c\x6f\x8e\x67\xdc\x0d\x3a\xc7\xa3\xfc\x37\x99\xe3" + "\xf9\x1f\x8b\xf7\x32\xf1\x83\xf2\xda\xde\xf3\x1b\x1f\x94\xf7\x9b" + "\x67\x48\x02\x7b\xbb\x83\xaf\x73\xf7\xce\x33\x98\x4e\x8a\xf2\xef" + "\x83\x59\xae\xf2\xef\xff\xba\x95\x7f\x83\xad\x65\xe3\xbc\x82\x1d" + "\x64\x23\xc6\xc8\xf4\x7a\x2d\x3b\xe9\xfb\x2e\xf3\xde\x1f\xa1\x7f" + "\xe5\x43\x56\x57\x99\xf7\xe1\x32\xcf\x64\xde\x07\x6b\xdc\xca\x3c" + "\xaf\xcf\x71\x7c\x90\xe9\x2a\xf3\x3e\x5c\x24\xe2\xe3\xb5\xe1\xcb" + "\xbc\x0f\xef\x73\x2f\xf3\x3e\x7c\xd8\x55\xe6\x7d\xa8\xe2\xb2\xed" + "\xc3\x58\x2e\xf3\x3e\xd4\xf2\xf4\xff\xab\x77\x4e\x77\xc8\x3c\x9e" + "\xce\x65\xde\x87\xfa\xc1\x64\x1e\x35\xc4\xe8\xb6\xc8\x85\x32\xb8" + "\xca\xa1\x8e\x53\x00\x1b\x15\xf0\x7f\x35\xf0\x78\x22\xfc\xef\xd6" + "\x47\x8d\xd9\x2f\x46\x27\x64\x40\x9d\xe5\x44\x66\x34\x7f\x5b\x51" + "\x31\xd5\x86\xf5\x14\xcf\xac\xc5\xe8\x02\x6c\xe3\xe6\x0b\x34\x8e" + "\x00\x5f\x74\x2c\x7e\x26\xe4\xc7\xf3\x41\xda\x24\xe2\x7f\x51\xf6" + "\x91\x5a\xca\x07\xf5\xf5\x6f\x91\x7d\x58\x87\x65\x74\x65\x7d\x14" + "\x04\x6d\x49\x71\x5b\x57\x28\x2b\xe2\xed\xe9\x64\xbd\x8d\x7e\x53" + "\xb1\xb2\x83\xb4\xca\x3e\x5a\x16\xd0\x3e\x6e\x3e\x4d\x8b\x24\x68" + "\xcb\x95\x4d\x35\x2b\xb0\xcc\x8a\x95\xdd\xf8\x6e\x3e\xbe\xb3\x43" + "\x1d\x53\x57\x10\x79\x5e\xc7\x38\x25\xc8\x89\x31\x69\x16\xda\xb6" + "\xca\x06\x75\x06\x6c\x7e\x34\xbd\x49\xf1\x6e\x11\xa4\xd9\x89\x06" + "\xe3\x99\x62\x19\x60\xcf\x42\x7d\x3e\x5a\x5e\x0a\xf9\x07\xaa\xc3" + "\xef\xdf\x21\x21\x63\x66\x52\xd3\xf0\x70\xf3\xd1\x21\x77\x74\x0c" + "\xd8\x30\x9d\x54\xdc\x0d\xb4\xd3\x12\xf9\x40\xef\x87\xf7\x9d\x8a" + "\xc1\xce\xbf\x2b\x31\x46\x72\xda\x4e\x22\xdf\x2c\x8c\x53\x1e\x4e" + "\x61\x31\x8a\xcd\x5d\x59\x15\x5b\x4c\xb2\xe0\x43\x48\x73\x8c\x6b" + "\x89\xf1\xb5\x01\x37\x04\xd2\xf7\x7d\x0c\x23\xdf\xbe\xbc\x48\x88" + "\x5d\x11\xa3\x4d\x5c\xbe\x62\xd9\xaa\x35\x89\xda\x19\xb1\xe3\xc9" + "\xe2\x55\xab\xb4\x2b\x62\x56\xae\xd5\x3a\xbf\x79\x44\x1b\xbb\x7c" + "\x75\xcc\x4b\xf1\xcb\x66\xad\x78\x59\x3f\x1e\x37\x2e\x39\xd5\x23" + "\x10\xeb\x22\x64\x55\x1c\x2c\xcd\x27\xa4\x60\x12\x51\x60\xbd\xba" + "\xb2\x3e\xd6\x48\x71\x4f\xf3\xb6\x53\x8b\x1c\xf2\xa4\x81\x7c\xdc" + "\x9c\x3a\x0e\xf3\x06\xef\x86\x7a\x95\x42\xbd\xa1\x8e\x50\xe7\x8f" + "\xe7\x4a\x75\x96\x30\x91\x86\x98\x48\xed\x00\x0c\x7e\xbc\x2c\xc0" + "\x3a\xee\x49\x4a\x23\xb1\x7d\x16\xe8\x27\x32\x48\xfb\x1b\xd3\x65" + "\xb9\x31\x3a\xf8\x6d\xba\x84\x31\xfc\x2d\xcd\x8b\x36\x77\x61\x3f" + "\xa1\x71\x3f\xe5\x7d\xea\x93\xc8\x67\x75\x32\xc2\xe3\xae\x7e\xbc" + "\xdf\x11\x77\xf5\x13\x36\x57\x0d\xf5\x68\x87\xf4\x4a\x13\xb9\x92" + "\x89\xe9\x18\x2f\x18\xe3\x77\x63\x9d\xa1\x5d\xa0\x4b\x69\x05\xcd" + "\x10\xb1\x9f\x7d\x30\x59\xc8\x3e\x56\x66\x54\x5c\x21\x11\x36\xda" + "\x43\x73\x0e\x26\xd7\x5b\x2c\x24\x60\x83\xfe\x65\x3a\xb6\xa2\x2a" + "\xc0\xb6\x7c\xd9\xee\x49\xd0\x87\x72\x8e\x95\xd1\x9c\x9a\x92\x67" + "\x67\x12\x75\x57\xd6\x27\xce\xf1\x5f\x15\xc3\xe3\xff\x27\x8c\xff" + "\xc8\x47\xa8\x8f\xc8\xc7\x4f\xf4\x1f\x27\xf6\xe7\x63\x2f\xfe\xde" + "\x16\x48\x15\x60\x81\xaa\xb6\xea\x23\xec\x9c\x8e\xd8\x77\x3b\xd3" + "\xe2\xc8\xbd\x8c\x76\x87\x75\x42\xde\xd6\x45\x82\x61\x6b\x36\x35" + "\x6c\x4d\x04\x9a\x29\xf3\x92\x88\x76\xa9\x5d\x4d\x72\xaf\x90\x50" + "\x73\xee\x56\xbd\x9f\x2c\x5d\x06\xf6\x88\x1c\xf4\x49\x28\xc8\x8c" + "\x50\xb1\xbf\x2b\x91\x8e\xff\x68\x27\xe4\xe9\xd5\x84\x7c\x33\x87" + "\xf8\x94\xc2\xef\x86\xd9\x1e\xa6\xff\x69\xd6\x27\xfb\x77\xc3\x6f" + "\x31\xae\xef\xf0\x7e\x7f\x78\xb6\xdb\x7e\xe7\x68\xb7\x79\xe0\x76" + "\x57\x6a\xa1\xdd\x0d\x82\x21\x1f\x64\xe4\x56\xcb\x00\xed\x36\xf3" + "\x76\x8f\xe9\x18\xfd\x76\x1f\xe6\xfe\xaf\xb3\x0e\xef\xf5\xae\xdd" + "\x95\x21\x43\xb7\x3b\xdf\x0d\xbf\xab\x34\x42\x5e\x3e\xf0\x3b\x1f" + "\xf8\x9d\x3f\x00\xbf\xf3\x45\x7e\x4f\x68\x19\xfd\x76\x57\xb6\xf2" + "\x76\x57\x96\x78\xd7\xee\x2a\xb7\xf2\xcf\xa9\xdd\x6e\xf8\xfd\x77" + "\x35\xb4\x1b\xf8\x5d\x00\xfc\xce\x1f\x80\xdf\xf9\x22\xbf\x27\x7e" + "\x3a\xfa\xed\xae\xe2\xfe\x0f\xb3\xaa\x0a\xbd\x6b\xf7\xdf\x83\x86" + "\x6e\x77\x81\x1b\x7e\xff\x43\x29\xe4\x15\x00\xbf\x0b\x80\xdf\x05" + "\x03\xf0\xbb\x40\xe4\xf7\x43\x9b\x46\xbf\xdd\x7f\x6f\xe4\xed\xfe" + "\xbb\xc1\xbb\x76\xff\xc3\xed\xfe\x17\xa7\x76\xbb\xe1\x77\x35\x81" + "\x76\x03\xbf\x0b\x81\xdf\x05\x03\xf0\xbb\x40\xe4\xf7\x0b\x8f\x8f" + "\x7e\xbb\xff\x51\xcb\xdb\xfd\x8f\x4c\xef\xda\x5d\xed\x76\xff\xbb" + "\x93\x5c\x4b\x06\x99\xdd\x8f\xe7\xc6\xe4\x30\x72\xcf\x15\x6c\xff" + "\x11\x3d\xf5\xdb\x9a\x3c\x61\x43\xba\xcc\xa6\xda\x9a\x32\x01\xc6" + "\x72\xc5\x19\x42\x5c\x80\x89\xf8\x42\x5b\xe3\x68\xde\x76\x35\xde" + "\x05\x28\xc7\x06\xb2\xdf\xae\xda\x9a\xd8\x6d\x88\x51\xbe\xf9\x0a" + "\xd1\xa6\x99\x89\xba\x3e\xd5\x44\x52\xf5\xd4\x5c\x4f\x4e\x13\x3f" + "\x13\x91\xe3\x7c\x59\x4d\x7b\x39\x59\x99\x40\x29\x94\xfd\x3c\x8e" + "\x31\xf3\xce\x92\x50\xb0\x89\xd3\x29\xe8\x8f\x2d\x02\xd1\x42\xf9" + "\xa1\x48\x4b\x28\x7b\x52\xc0\x62\x22\xfb\xf0\x25\x2b\x41\x7a\x22" + "\x6d\x61\x3c\x1a\xca\xe8\x0a\x12\xff\x3f\x5e\xe0\x74\x2d\x7e\x65" + "\xb8\x74\x3d\xc2\xd7\xff\x0c\x5b\xb7\x18\x4d\xdd\x04\x6c\x4b\x35" + "\x9e\xb9\x07\x7a\x99\xea\xf5\x1d\x30\x16\xa9\xce\xa4\xb9\x5b\xd3" + "\x05\xd0\x59\xc3\x2c\xd7\xad\xff\x6b\x27\x7a\x5b\x81\xde\xfd\xb0" + "\xe6\xa0\xf7\x51\x13\xd0\xdb\x2a\xd2\xdb\x36\xa1\x79\x4c\x87\x1b" + "\x7a\x5b\x6d\xa0\x73\x80\xde\x16\xcf\xe9\x7d\xf4\x48\x1f\x7a\x37" + "\x5c\x1f\x7a\x1f\x15\xe3\x9f\xe6\xab\x5d\xe9\x7d\x74\x11\xa7\xf7" + "\x11\x0b\xcd\xcd\x87\xf1\xff\x56\xf3\x30\xcb\x6d\xf7\x40\x8e\x03" + "\xbe\xfb\xeb\x30\x07\xbd\x6b\x17\x51\xbf\x7c\x11\xdf\xf9\x80\xef" + "\x09\x2d\x03\xd3\x3b\x1f\xf0\x9d\x0f\xf8\xce\x1f\x06\xbe\x6b\x1f" + "\x76\xa5\x77\xfe\x75\xc2\x77\xad\x38\xff\x97\xdf\x07\xdf\x35\x15" + "\x9c\xde\x35\xb1\x40\x6f\xc0\x77\xfe\x30\xf1\x5d\x1b\xe5\x01\xbd" + "\x01\xdf\xfd\x75\xa7\x83\xde\x75\x15\x40\x6f\x11\xdf\xf9\x80\xef" + "\x89\x9f\xba\xa1\x37\xe0\xbb\x00\xf0\x9d\x3f\x0c\x7c\xd7\xbd\xdd" + "\x87\xde\xd7\x09\xdf\x75\xdc\xc7\xa4\xa1\xa0\x0f\xbe\xeb\x42\x39" + "\xbd\x6b\x1b\x69\x6e\x01\xe0\x3b\x7f\x98\xf8\xae\xab\xf5\x40\x6f" + "\x01\xbe\xfb\xeb\x6c\x07\xbd\x8d\xa1\xd4\xaf\x40\xc4\x77\x01\xe0" + "\xfb\xa1\x4d\x03\xd3\xbb\x00\xf0\x5d\x00\xf8\x2e\x18\x06\xbe\x8d" + "\x53\x5c\xe9\x5d\x70\x9d\xf0\x5d\xdf\x2a\xd2\xbb\x0f\xbe\xeb\xf7" + "\x70\x7a\xd7\xcf\x05\x7a\x03\xbe\x0b\x86\x89\x6f\xe3\x1c\x0f\xe8" + "\x0d\xf8\xee\x6f\x2b\x38\xe8\xdd\xb0\x07\xe8\x2d\xe2\xbb\x00\xf0" + "\xfd\xc2\xe3\x6e\xe8\x0d\xf8\x2e\x04\x7c\x17\x0c\x03\xdf\x0d\x39" + "\x7d\xe8\x7d\x9d\xf0\xdd\x20\xc6\xbf\x2c\xec\x83\xef\x06\x35\xa7" + "\xb7\xf1\x20\xcd\x2d\x04\x7c\x17\x0c\x13\xdf\x0d\xfb\xbd\xb1\x4f" + "\x56\xef\x22\x4a\x57\x9a\x7f\x1a\x78\xed\x6c\x94\x63\xf6\xef\xc6" + "\x46\x39\x56\x3d\xb0\x8d\x72\x2c\x93\xd3\xfc\x98\xce\x3b\x1b\xe5" + "\x53\xb7\xe7\x1f\x06\xb3\x51\xfa\xd3\xfc\xb3\xec\x6b\x67\xa7\x7c" + "\xf6\xda\x77\x63\xa7\x7c\x36\x67\x60\x3b\xe5\x53\x2b\xa7\xf9\xa7" + "\x25\xde\xd9\x29\x9f\xb9\xf5\x7f\x30\x98\x9d\xd2\x9f\xe6\x8d\xb6" + "\x6b\x67\xab\x34\x9e\xf9\x6e\x6c\x95\xc6\xb2\x81\x6d\x95\xc6\x78" + "\x4e\xf3\x46\xb5\x77\xb6\xca\x71\xa5\x37\xb6\x4a\x7f\x9a\x7f\xae" + "\xbf\x76\xf6\xca\xe7\xcf\x7f\x37\xf6\xca\xe7\xc1\x03\xdb\x2b\xc7" + "\xc5\xf1\xcf\xf1\x4c\xef\xec\x95\xcf\x3d\x18\xff\xf4\xb7\x57\xfa" + "\xd3\xfc\x8b\xd6\x6b\x67\xb3\x7c\x51\xf7\xdd\xd8\x2c\x5f\xec\x18" + "\xd8\x66\xf9\x62\x31\xa7\xf9\xe7\x56\xef\x6c\x96\x2f\xdc\xc6\x3f" + "\x19\xcc\x66\xe9\x4f\xf3\x13\x91\xd7\xce\x6e\x39\xf1\xd8\x77\x63" + "\xb7\x9c\x50\x0d\x6c\xb7\x34\x55\x73\x9a\x37\xc5\x7b\x67\xb7\x9c" + "\x88\xf5\xc6\x6e\x41\x5a\x23\xcd\xd1\x56\xe1\x34\x6f\xd6\x51\xff" + "\xad\x8b\x7a\xc0\x1e\xf1\x03\xba\xfb\xb5\x13\xf9\x2e\xa4\x79\x13" + "\xa7\xb9\xdd\x7f\xbb\x1a\xe8\x13\x87\x34\x63\xed\xf8\x97\xc6\xdf" + "\x6e\xd8\x9a\x42\xe5\x04\xda\xa2\x24\x67\x65\x5f\x3e\x68\xcb\x20" + "\xfe\xda\xd4\x0d\xf0\x7f\xf3\x14\xcc\xa3\x4d\xcd\x3a\x09\x6d\xf4" + "\xc1\x35\x0a\x5b\x6e\x74\x99\xdd\x6f\x5b\xe8\x59\xd9\x3f\xd7\xd0" + "\x69\x51\x65\x3d\x60\x4b\xd0\xdf\x69\x02\x8d\xed\x65\xc4\x68\x3b" + "\x4a\xea\x9b\xfe\x87\x08\xfe\xdb\x27\xdd\x6b\x23\x3a\xfa\x2f\x5d" + "\x60\x6d\xa2\x89\xd8\x5f\xd6\xa8\x8c\xc9\xd5\x80\x8b\xf7\x48\x44" + "\x1b\xbd\x42\xbf\xd6\xa9\x7a\xfc\x8a\xf4\x50\x8e\xd9\x9e\x5b\x1c" + "\x66\xf3\x2b\x8a\x3e\x90\x64\x92\xab\xac\x44\x17\xdf\x4a\x69\xde" + "\x4b\x44\x91\xd7\x42\x94\x9b\x5f\x22\xaa\xcd\x2d\x44\x5d\xdb\xda" + "\x44\xea\xce\x57\x93\xba\x8e\x13\xa4\xee\x0a\x5c\xdd\x70\x09\x70" + "\xa5\x9f\x20\xb5\x30\x5a\x5f\x78\x81\x90\xb4\x56\x6a\xfe\x71\x33" + "\x09\xac\xb5\x35\x11\xed\x12\x42\x2e\xca\xfe\xe9\xab\x8a\x26\x81" + "\xf4\x6b\x0d\xa1\x2f\x6b\xe4\xf0\x4e\x81\xe9\x46\x9b\x99\xd4\xb6" + "\x5a\xe1\xfd\x97\x6d\xf0\x5e\x91\xd6\x0a\xe5\x0b\xd5\xe8\xcb\xd0" + "\x5c\x9b\x7e\x04\xda\xa7\xde\x03\x74\xce\x96\x6c\xb2\xbc\x6e\x12" + "\xba\x19\xd8\x8c\x98\x89\xa0\x1c\x33\xbb\xbb\x87\x8b\x99\x7f\xb2" + "\xf3\xc0\x40\xa7\x49\x40\xef\xa9\xc2\xef\x22\xd5\x4f\x9f\x38\x45" + "\x71\x3f\x18\xae\xcf\xd4\x5b\x8e\x12\x5c\xb3\x8e\x58\x4b\xc8\x02" + "\x3b\x21\x48\x13\x5c\x4b\x7e\x5a\x4f\x02\x70\x9f\x9a\xf0\x2f\xdd" + "\x24\x63\xab\x99\xac\xb7\x41\x5d\x2f\x5a\x7b\xeb\x5a\x9f\x59\x4f" + "\xe0\xdd\xd4\xfa\x38\x13\x51\xe9\x89\x1a\xe9\x0c\xb6\x68\xf2\xd3" + "\x6d\xc4\x77\xa5\x85\x52\xa4\x31\xd2\x16\xe9\x8c\xe5\x49\xb4\x37" + "\xc6\x9a\x49\x9a\x95\xa8\x8d\xa9\x70\x4f\xa6\x66\x23\xb9\x44\xa0" + "\x8e\x41\xd4\x4f\xbd\x07\xf0\x11\x88\x98\x30\xc9\xbe\x0c\x01\x1c" + "\x4c\xa2\x59\x27\x4c\xa5\xd0\x5e\x5c\xdb\x1f\x5e\x9b\x9b\x3d\x59" + "\xff\xe8\x67\x13\x3a\xe1\xd9\xca\xf1\xfc\x95\x15\xf0\xdc\x00\x78" + "\xb6\x70\x3c\x8f\xe9\xf0\x00\xcf\x36\x07\x9e\x4f\x8e\x71\xe0\xf9" + "\xab\x73\xee\xf1\xfc\xd5\x3c\x8e\xe7\x7c\xf5\x8d\x89\xe7\x93\x27" + "\x06\xc7\xf3\xc9\x72\xf7\x78\xce\x57\x4a\xf6\xee\xe8\xe0\xf9\x2b" + "\xf5\x75\xc4\xb3\xd5\x3b\x3c\x9f\x6c\x77\xc5\x73\xb3\x8d\xe3\xb9" + "\xb9\xcc\x3b\x3c\x9f\x72\xeb\xff\x78\x30\x7b\xdb\x81\xe7\x7c\x51" + "\x3e\x9f\xae\xa6\xfe\xf9\x20\x9f\xf3\x45\xf9\x3c\xa1\x65\x68\x3c" + "\xe7\x3b\xc9\xe7\x53\xc7\x1d\x78\x3e\xfd\xbe\x7b\x3c\x9f\xbe\x45" + "\xc4\xf3\x0d\x2a\x9f\x4d\x6f\x0f\x8e\x67\x53\xf6\x20\x78\xce\x96" + "\xc6\x12\xa3\x83\x67\x93\xe9\xfa\xe1\x39\xdf\x4b\xf9\x6c\x3a\xe4" + "\x8a\xe7\x53\xb5\x1c\xcf\xa7\xd2\xbd\xc3\xf3\xe9\x46\x6f\xc6\x32" + "\x4e\x78\x16\xe5\x73\xeb\x0e\xc0\x33\xc8\xe7\x7c\x51\x3e\x4f\xfc" + "\xd4\x03\x3c\x3b\xc9\xe7\x96\x3f\x3a\xf0\xdc\x9a\xe3\x1e\xcf\x5f" + "\x9f\xe1\x78\x2e\xb8\x41\xe5\xf3\xd7\x6b\x07\xc7\xf3\xd7\x91\xee" + "\xf1\x5c\xa0\x94\xc6\x69\xa3\x83\xe7\xaf\xcb\xae\x23\x9e\xbd\x94" + "\xcf\x5f\x1b\x5c\xf1\xdc\x52\xc2\xf1\xdc\xb2\xc8\x3b\x3c\xb7\xee" + "\xf5\x66\x9c\xe8\xc0\x73\x81\x28\x9f\xbf\x89\xa3\xfe\x05\x20\x9f" + "\x0b\x44\xf9\xfc\xd0\xa6\xa1\xf1\x5c\xe0\x24\x9f\xcf\xac\x71\xe0" + "\xf9\x9b\xe7\xdd\xe3\xf9\xec\xdf\x44\x3c\xdf\xa0\xf2\xf9\xec\x2f" + "\x06\xc7\xf3\x59\xdd\x20\x78\xce\x96\xc6\xc0\xa3\x83\xe7\xb3\xe9" + "\xd7\x0f\xcf\x05\x5e\xca\xe7\xb3\x51\xae\x78\x3e\x13\xcf\xf1\x7c" + "\x46\xeb\x1d\x9e\xbf\x71\x1b\xff\x75\xb0\x31\xb8\x13\x9e\x45\xf9" + "\x7c\x3e\x0c\xf0\x0c\xf2\xb9\x40\x94\xcf\x2f\x3c\xee\x01\x9e\x9d" + "\xe4\x73\xdb\x3c\x07\x9e\xcf\xcf\x74\x8f\xe7\x73\xbf\xe7\x78\x2e" + "\xbc\x41\xe5\xf3\xb9\x29\x83\xe3\xb9\xcd\xea\x1e\xcf\x85\x4a\x69" + "\x7e\x61\x74\xf0\x7c\x6e\xd1\x75\xc4\xb3\x97\xf2\xf9\x5c\x88\x2b" + "\x9e\xdb\xe6\x70\x3c\x7f\x63\xf6\x0e\xcf\xe7\xe7\x8e\xce\xfc\xc6" + "\x85\x30\x9c\xdf\xe8\xc6\xf9\x0d\xc7\xde\xbf\xb8\x80\x06\x8e\xe7" + "\x1e\xc0\x73\xb1\x33\x9e\xff\xd9\x77\x7e\xe3\x5f\xb7\x08\xbd\x78" + "\xbe\xd0\x0f\xcf\x02\xe0\xb9\x87\xe1\xb9\xfd\x31\x69\x7e\xc3\xd8" + "\xbe\x07\x70\x72\x9e\x18\x17\x01\x96\xf3\x44\x2c\xff\x13\xb0\x0c" + "\x34\x14\x80\xc6\xb5\xcd\x4d\x24\xc2\xcc\x69\xd9\x0d\x34\x16\x9c" + "\x71\xdc\xdd\x26\x47\xfc\x22\x6e\x25\x0c\xd7\xad\x04\xec\x26\x1c" + "\x23\x75\x49\x70\xad\x83\x2b\x15\x2e\x72\x8c\xd4\xb6\x01\x76\x97" + "\x3b\x63\xb7\x41\xc4\xee\xbf\x8e\x0f\x8e\xdd\x7f\x1d\xbc\x7e\x73" + "\x19\xed\x7c\xfe\xeb\x9f\x91\xea\x88\x5f\x9e\xa2\xc6\xe4\x26\x11" + "\x9f\xe7\x49\x84\x8d\x04\xd0\x17\x74\x93\x54\x91\x44\xfd\x86\x9d" + "\xc8\x73\x5f\x22\xea\xdc\x2f\xa1\xdd\x52\xff\x6d\x21\xaa\xa3\xd6" + "\xff\x21\xb5\x1d\x4d\xa4\xf6\xca\x11\x52\x2b\xc0\x75\x1e\x2e\xa8" + "\x6b\xc4\x32\xe7\x76\x9b\xc5\x76\xb7\xd7\x41\x59\xc1\xee\xdb\xdd" + "\xbe\x9f\xb5\x3b\x16\xda\xdd\xed\x68\xb7\x11\xfa\x01\xf0\x67\xaa" + "\x20\xce\x87\x44\x98\x89\xef\x2a\x1b\xa5\xdd\x22\xfe\x91\x3f\x47" + "\x1b\xad\x24\x42\x0f\x3c\x7b\x19\xf0\xdf\xba\x8f\xa4\xa5\x00\xfe" + "\xbb\xad\x88\x3b\xb3\x31\xfd\x2a\xe0\xff\x5f\x6d\x14\xe8\xd7\x83" + "\xf8\xff\x27\xe2\xff\x5f\x2a\x81\xe1\xff\x7c\x85\x77\xf8\xbf\xe0" + "\x09\xfe\x3d\x98\x0f\x31\x23\xfe\x1b\xba\x71\x3e\xc4\xb1\x07\x74" + "\x28\xfc\x3b\xc9\xf3\x8b\x4e\xf8\x37\x0f\x82\xff\x6f\x1f\x93\xe6" + "\x43\xbe\x7b\xfc\x5f\x1c\x02\xff\x17\x07\xc1\xff\x68\xcf\x7d\x7c" + "\x7b\x1d\xf1\xff\xed\x10\xf8\xff\xd6\x13\xfc\x5b\xbd\xc3\xff\xc5" + "\x3e\xf8\xbf\x28\xe2\xff\x82\x97\xf8\x37\x7b\x80\x7f\x4f\xe6\x4f" + "\x3a\xc3\x70\xfe\xa4\x1b\xe7\x4f\x1c\x7b\x81\x87\xc0\xbf\xf3\xfc" + "\xc9\x25\x27\xfc\x77\x0e\x82\xff\x0e\x09\xff\x37\x80\xfc\xbf\x34" + "\x04\xfe\x2f\x0d\x86\xff\x51\x9e\x2b\xe9\xb8\x8e\xf8\xef\x18\x02" + "\xff\x1d\x1e\xe0\x3f\xdf\x4b\xf9\x7f\xa9\x0f\xfe\x2f\x89\xf8\x37" + "\x7b\x89\xff\x4e\x4f\xf0\xef\xc1\x7c\xcb\x15\xc4\x3f\xc8\xff\x7c" + "\x8b\xd3\x9e\xf0\xa1\xf0\xef\x24\xff\x2d\x4e\xf8\xbf\x32\x08\xfe" + "\x2f\x3f\x26\xcd\xb7\x7c\xf7\xf8\xb7\x0c\x81\x7f\xcb\x20\xf8\x1f" + "\xed\xb9\x95\xcb\xd7\x11\xff\x97\x87\xc0\xff\x65\x4f\xf0\xef\xa5" + "\xfc\xb7\xf4\xc1\xbf\x45\xc4\x7f\xa7\x97\xf8\xbf\xe2\x01\xfe\x3d" + "\x99\x9f\xb9\x8a\xe3\x59\x90\xff\x05\x89\x4e\x67\x03\x86\xc0\xbf" + "\xf3\xfc\x4c\x97\x13\xfe\xaf\x0e\x82\x7f\xab\x84\xff\x1b\x40\xfe" + "\x77\x0d\x81\xff\xae\xc1\xf0\x3f\xca\x73\x31\xd6\xeb\x88\x7f\xeb" + "\x10\xf8\xb7\x7a\x80\xff\x02\x2f\xe5\x7f\x57\x1f\xfc\x77\x89\xf8" + "\xbf\xe2\x25\xfe\xaf\x7a\x82\x7f\x0f\xe6\x73\x6c\x6c\x3e\xa7\x1b" + "\xe7\x73\x1c\x67\x44\x86\xc2\xbf\x93\xfc\xef\x76\xc2\xbf\x6d\x10" + "\xfc\xf7\x3c\x26\xcd\xe7\x7c\xf7\xf8\xef\x1e\x02\xff\xdd\x83\xe0" + "\x7f\xb4\xe7\x6e\x7a\xae\x23\xfe\x7b\x86\xc0\x7f\x8f\x27\xf8\xf7" + "\x52\xfe\x77\xf7\xc1\x7f\xb7\x88\xff\xab\x5e\xe2\xdf\x36\x4a\xf3" + "\x3f\x76\x13\xce\xff\x08\xaa\xad\x89\x3d\x25\x51\x65\x82\xa1\x48" + "\x1f\x20\xd3\x12\x9b\x6a\x5b\xa8\x31\xd1\x42\x9e\xbe\x0c\x3c\xd1" + "\x5f\x26\x4b\x2e\xab\x31\x96\x65\x34\x85\xf1\xbf\xcb\x19\x51\xb8" + "\x6c\x06\xf5\x9e\xcd\x2b\x89\xc2\xee\xbf\x7d\x12\xa6\x19\xcf\x5a" + "\x09\xb6\x79\x3d\xd2\xe0\xbc\x83\x06\x38\x07\x47\xbf\xd5\xa9\x4b" + "\x33\x20\x4f\xb7\x89\xb4\x02\x5e\x6a\x5b\x4d\x40\xfb\x75\x0c\x5b" + "\xc8\x0b\xa8\x4f\xfa\xee\x8b\x44\x61\xfb\x5a\x33\x15\x78\x1c\xe8" + "\xf7\x3a\x91\x05\xb5\x52\x01\x79\x89\x3c\x42\xbe\x6a\xd7\xe1\x7e" + "\x25\xfb\x89\x7a\xc0\xb7\xed\x6b\xdd\xd4\x52\xc8\x37\xfa\xf3\x32" + "\xf6\xbd\xfc\x3c\xbe\x3d\xb9\xb6\x19\x68\x99\x65\xf3\x92\x4f\x76" + "\x0f\xce\xbf\x78\x32\x4f\x41\xb3\x71\x9e\x02\xf8\x64\xf1\x90\x4f" + "\x56\x97\x33\xad\xa3\xce\x27\xaa\xf3\x8c\x4f\x74\x83\x2b\x9f\x46" + "\x7b\xfe\x80\x2e\xe0\x7c\xa2\x5a\xce\x27\x21\xce\x3b\x3e\x51\xaf" + "\xf6\xff\xf6\x1b\x4f\xcb\x65\xa1\x38\x9e\x16\x60\x3c\xed\x19\x9f" + "\xf2\x93\x5d\xce\xe0\x8e\x36\x9f\xe4\xa4\xc1\x23\x3e\xc9\x65\x33" + "\xfb\xf0\x69\x74\xc7\xb9\x72\xc2\xce\x7f\xc3\xbd\x9a\xf1\x69\x13" + "\x51\x7b\xc5\x27\xb9\xcc\x83\xf3\x1f\x1e\x8c\xfb\xe4\xf2\x26\x1c" + "\xf7\x01\x9f\x3c\xec\x4f\xf9\x56\x97\x33\xc3\xa3\xce\x27\x79\xb2" + "\x67\x7c\x92\x1f\x73\xe5\xd3\x28\x8f\xc7\xe4\xf2\x12\xce\x27\xb9" + "\x9e\xf3\x49\x56\xee\x1d\x9f\xe4\xad\xa3\x32\x3e\x91\x2b\xd2\x71" + "\x7c\x22\xc0\xf8\xc4\x33\x3e\x15\x24\xbb\x9c\x71\x1e\x75\x3e\x29" + "\xb4\x9e\xf1\x49\xb1\xb6\x0f\x9f\x46\x77\xdc\x20\x57\xf0\x78\xc0" + "\x72\x85\x86\xf3\xc9\x27\xda\x3b\x3e\x29\xdc\xfa\x3f\x1d\x96\x1d" + "\x2d\x1f\xab\x43\x3b\x1a\xf8\xe4\x61\x7f\x2a\xb0\xba\x9c\xc9\x1e" + "\x75\x3e\x8d\xa9\xf6\x8c\x4f\x63\xef\x70\xe5\xd3\x28\xdb\xb7\xf2" + "\x31\xed\x9c\x4f\x63\x2a\x38\x9f\xc6\x28\xbd\xe3\xd3\x58\x4f\xf6" + "\x7f\x0e\x78\x0e\xab\x9f\xcd\x27\x1f\xd7\x78\x43\xd9\x7c\xf2\x71" + "\x89\x9e\xf1\x6a\x5c\xdd\x35\xb5\xf9\xe4\xe3\x76\x70\x5e\x8d\x8b" + "\xe7\xbc\x1a\x7b\xd0\x3b\x5e\x8d\x33\x79\x7b\x7e\xab\x9f\xdd\x27" + "\xf7\x4d\xbf\xa1\xec\x3e\xb9\xaf\x87\xf2\xcf\x77\xed\x35\xb5\xfb" + "\xe4\xbe\xa2\xfc\xf3\x15\xe5\x9f\xd2\x4b\xf9\xe7\xeb\x81\xfc\x1b" + "\xf8\xdc\x57\x7f\xdb\x6f\x42\xc8\x8d\x65\xfb\x8d\xaf\xf5\x8c\x57" + "\x13\x66\x5c\x5b\xdb\x6f\xbc\x99\xf3\x6a\x7c\x25\xe7\xd5\x78\x95" + "\x77\xbc\x9a\x10\xe6\xed\x79\xb1\xfe\xf6\x9f\xea\x06\xb3\xff\x54" + "\x1e\xda\x7f\xaa\x6b\x6c\xff\xa9\x44\xfb\x4f\x25\xda\x7f\x13\xbc" + "\xb4\xff\x54\x5e\xd9\x7f\xae\xbc\x92\x6c\x40\xff\xcc\x1b\xcb\x06" + "\xf4\x0f\xf6\x8c\x57\xfe\xeb\xaf\xad\x0d\xe8\x3f\x9f\xf3\xca\x3f" + "\x88\xf3\xca\x2f\xd6\x3b\x5e\xf9\xbb\x8d\x7f\x3b\xd4\xf9\xb4\xfe" + "\x76\xa0\x3a\xf4\xc6\xb2\x03\x03\x3c\x1c\xff\xaa\x67\x5e\x5b\x3b" + "\x30\x40\x1c\xff\x06\x88\xe3\xdf\x00\x2f\xc7\xbf\x6a\x0f\xc6\xbf" + "\x1e\xcc\xfb\xc9\x27\x6d\x41\x1b\xd0\x6e\xd8\x9a\x18\x00\xf4\x0f" + "\x48\x26\xf2\xee\x20\xe0\x97\x0a\xf8\xb5\x41\x4b\x7a\x0c\xc0\x2f" + "\xb3\x8d\x3c\xfd\xda\x29\x5a\xdf\x6e\x27\xdd\xc0\xab\xab\x60\x07" + "\x1a\xcd\x6d\x78\x46\xef\x27\x2d\xf2\x49\x33\x5f\x78\x4d\x4d\x90" + "\x5f\x48\x7f\xbb\x4a\xbd\x87\x02\xbf\x18\xff\x54\xc5\x61\x36\xc3" + "\x36\xf3\xc2\x0b\xa7\xe8\x2a\x13\xa5\x75\x71\x56\xa8\x53\x74\x59" + "\x5d\x5c\x13\x89\x68\x25\xbe\xda\x67\x90\x2f\x13\x4f\x60\xba\xd1" + "\xdc\x44\xd0\xef\x27\x9b\x03\x3f\xa5\x0b\xb4\x7d\xa1\x53\xa1\xff" + "\x26\x3c\x57\x28\xf9\x68\x32\x9e\xdf\xc1\xf8\xdf\x77\x4e\x95\xf1" + "\xff\x0b\x1d\xce\xcf\x87\x8e\xbe\x2d\x38\x91\xcd\xff\x09\xa7\x34" + "\x53\xa5\x3a\xae\x8a\xa7\x14\xea\x38\xa9\xde\x62\x26\x58\xcf\x7a" + "\x4b\x05\x49\x4b\x24\xea\xfa\xee\x36\x92\x6a\xa1\xe6\xfa\xf4\x73" + "\x24\xe2\x32\xae\x0b\x20\x9e\x26\xdd\xc1\xf9\x3d\x71\x81\x70\x4a" + "\x37\xd5\x24\x9f\xa4\xa9\x6f\x20\x24\x60\x03\xd0\xda\x46\xe4\xec" + "\xbc\xa6\x9c\x28\x81\x5e\x71\xc6\xf4\x16\x02\xb4\xd3\x1b\x6d\x5f" + "\x22\x3d\xe3\xe0\xfd\x9c\xde\xf5\x06\xff\xed\x09\x98\x86\xb4\xc5" + "\x7d\xa6\x46\xbd\x99\xe5\x91\xde\x73\xde\xa5\x13\x63\x72\x37\xa9" + "\xb7\x11\x02\xf8\xb0\xd6\x44\x36\x01\xbe\xd4\x5e\xca\xed\x49\x25" + "\xa3\x32\x5f\x29\x0f\x34\xa3\xdd\x0a\xf8\xb2\xf0\x3a\x8e\xe9\xf0" + "\x00\x5f\x56\x07\xbe\x02\x73\x46\x86\xaf\xc0\x87\x47\x17\x5f\xa3" + "\x6d\xbf\x06\x2a\x46\x86\xaf\xc0\x0d\x1c\x5f\x3f\xd8\xcf\xf1\x15" + "\x98\xec\xc0\xd7\x98\x8e\x6b\x87\xaf\x1f\x44\x72\x7c\xfd\x40\xe3" + "\x1d\xbe\x02\x6d\xa3\x33\xcf\x7a\xeb\x22\xb4\xb5\xed\x86\x7c\x51" + "\x7e\x4d\x68\x19\x1a\x5f\xf9\x4e\xf2\x6b\xf2\xb9\x91\xe1\x6b\xf2" + "\xce\x51\xc6\xd7\x28\xdb\xdc\x93\x63\x47\x86\xaf\xc9\xa7\x39\xbe" + "\x26\xab\x38\xbe\x26\x37\x39\xf0\x35\xa1\xe5\xda\xe1\xeb\x96\x72" + "\x8e\xaf\x5b\x92\xbd\xc3\xd7\xad\x5e\xf9\xbf\xea\x3f\x3e\x98\x52" + "\x86\xe3\x03\xc0\x97\x28\xbf\x26\x7e\xea\x01\xbe\x9c\xe4\xd7\x94" + "\x5f\x8c\x0c\x5f\x9a\xab\xa3\x8b\xaf\xd1\x1e\x27\x68\x2a\x47\x86" + "\xaf\x29\x8f\x71\x7c\x69\xe2\x39\xbe\xa6\x84\x39\xf0\x35\xf1\xd3" + "\x6b\x87\x2f\x8d\x86\xe3\xeb\xd6\x26\xef\xf0\x35\xc5\xbd\xff\xe7" + "\x61\xcd\x6b\x07\xa9\x71\x4c\x63\x37\x14\x88\xf2\xeb\xa1\x4d\x43" + "\xe3\xab\xc0\x49\x7e\xdd\xf6\xf6\xc8\xf0\x75\xdb\xf3\xa3\x8c\xaf" + "\x51\x1e\xdb\xdc\x16\x3c\x32\x7c\xdd\xf6\x16\xc7\xd7\xd4\x5a\x8e" + "\xaf\xdb\x76\x38\xf0\xf5\xd0\xa6\x6b\x87\xaf\xa9\xc9\x1c\x5f\x53" + "\xc3\xbc\xc3\x57\x90\x27\xfe\x5f\x3d\x98\x8f\x9f\xae\xc7\x71\x18" + "\xe0\x4b\x94\x5f\x2f\x3c\xee\x01\xbe\x9c\xe4\xd7\x74\xdf\x91\xe1" + "\x6b\xda\xfb\xa3\x8b\xaf\xd1\x1e\x8f\x4d\xcb\x1c\x19\xbe\xa6\xcb" + "\x38\xbe\xa6\x85\x70\x7c\x4d\xb3\x3a\xf0\xf5\xc2\xe3\xd7\x0e\x5f" + "\x41\x4d\x1c\x5f\x41\x3b\xbc\xc3\xd7\x74\x4f\xfc\x9f\x7a\xb8\x8e" + "\xa0\x6d\x1c\xd9\x18\x52\xbb\x62\x64\x18\xd3\x4e\xbb\xb1\xc7\x90" + "\xb7\xb7\x8d\x0c\x63\xda\x65\x1c\x63\xb7\x6f\xe1\x18\xd3\x46\x5d" + "\x9f\x31\xe4\xed\x73\x38\xc6\xa6\xdb\xbc\xc3\x98\x76\x14\xd7\x3f" + "\xee\x0a\x1b\xd9\x38\xf2\xce\x63\x23\xc3\xd8\x9d\x1b\x6e\xec\x71" + "\xe4\x9d\x0b\x46\x86\xb1\x3b\x8f\x70\x8c\xdd\x61\xe1\x18\xbb\xb3" + "\xe2\xfa\x8c\x23\xef\xd8\xc3\x31\x76\x87\x97\xeb\x36\x77\x79\x75" + "\xfe\x65\xe0\x75\x9b\x19\x25\x23\x1b\x4b\xce\x78\x70\x64\x18\x0b" + "\x3e\x73\x63\x8f\x25\x83\xcb\x46\x86\xb1\x19\xb3\x38\xc6\x82\x23" + "\x39\xc6\x66\x04\x5f\x9f\xb1\x64\xb0\x82\x63\xec\xae\x4a\xef\x30" + "\x36\x63\xdf\xe8\xad\x37\xe9\xc8\xc8\xc6\x93\x3f\xda\x39\x32\x8c" + "\xfd\xe8\x17\x37\xf6\x78\xf2\x47\x81\x23\xc3\xd8\x8f\xb6\x72\x8c" + "\xfd\xf0\x10\xc7\xd8\x8f\xb2\xaf\xcf\x78\xf2\x87\x71\x1c\x63\x3f" + "\xd4\x79\x87\x31\x9d\x07\xfe\xff\x3d\x5d\x27\xbb\x3b\x76\x64\x63" + "\xca\x99\xf6\x91\x61\x6c\xe6\x81\x1b\x7b\x4c\x39\x33\x79\x64\x18" + "\x9b\x79\x99\x63\x6c\xa6\x96\x63\x6c\x66\xfb\xf5\x19\x53\xea\x6a" + "\x39\xc6\x74\x06\xef\x30\x76\xb7\x7e\xf4\xd6\xf7\x42\xaa\x47\x36" + "\xae\x0c\x89\x19\x19\xc6\x42\x26\xde\xd8\xe3\xca\x1f\x37\x8f\x0c" + "\x63\x21\xcf\x73\x8c\xfd\x38\x93\x63\x2c\x64\xd1\xf5\x19\x57\xfe" + "\x38\x94\x63\xec\x6e\xef\xfc\x51\xc8\x43\xfa\xf9\xbf\x5a\xbe\x32" + "\x29\x26\x7e\x79\xac\x76\xf9\xca\xc4\x84\xd7\xb4\xab\x97\xaf\x5b" + "\xf6\xe8\x8c\x35\x21\xda\x84\x64\x6d\xc2\xf2\x95\xaf\x8a\x09\xb1" + "\xe3\xc9\x33\xcb\xe2\x63\x92\x31\x05\x72\xbf\xba\x72\xc5\xb2\x95" + "\x89\xda\x84\x65\xaf\xad\x59\x9e\xb0\x0c\xff\x5f\xad\x7d\x65\x55" + "\x02\x24\xbc\xbc\x6c\x79\xd2\x32\xed\x4b\x6b\x5e\x79\x65\x59\xc2" + "\xea\xf1\x64\xe1\x9a\xf8\xc4\xe5\xfa\xf8\x65\xda\xb9\x0b\x1f\x9b" + "\xb5\x78\xde\xaf\x16\xff\xec\x67\x18\x9c\xcc\x29\x36\x59\x10\x35" + "\x14\x87\x02\xe6\x14\x67\xe5\x0f\x1e\xab\xd7\x10\x16\x1f\x77\x73" + "\x07\x51\x6f\x4a\x20\x8a\x9c\x0e\xa2\xcc\xed\x20\x2a\xed\x6f\x49" + "\x38\xcd\x39\x5e\x91\xd7\x41\x02\x69\x5e\x74\xb9\x90\xeb\xd7\x40" + "\x73\xfd\xd5\x66\xdf\x2b\x98\xa6\x16\x72\x2e\x5b\xe1\x37\x81\x40" + "\x5b\x05\xcd\x55\xa7\xb7\xc8\x1f\xdc\x62\xf6\xed\xda\x93\x76\x8e" + "\xc8\xe9\xf8\x7b\x14\xef\x08\x66\xf9\xc7\xe8\x59\x06\xda\x4e\xe4" + "\xf7\x06\xc1\xa5\x84\xab\x1c\xae\x6a\xb8\x1a\xe1\x82\x91\x5a\xa8" + "\x02\x2e\x0d\x5c\xc1\x70\x85\xc2\x05\x54\x0b\x0d\x87\x6b\x3e\x5c" + "\x8b\xe0\xaa\x85\xab\x1d\x2e\xc8\x7b\x5f\x20\x2f\xe7\x3e\x2d\x5c" + "\x0b\xe0\x4a\x84\xcb\x40\xe4\xf7\x43\xfe\xfb\xa3\xe1\x32\xc1\x05" + "\x23\xed\xfb\x33\xe1\xc2\xf4\x32\xb8\xe0\xf7\xf7\x05\xf3\x77\x0f" + "\x64\xc3\x55\x49\xa0\x9e\x43\x5f\x0f\xb4\xc2\x05\xdf\x9d\xad\x86" + "\x4b\x0f\x17\xd4\xf7\xc1\xe0\x3e\xf9\xe2\x9d\xfe\xcf\x1e\xa2\xcc" + "\x7d\x01\x1b\x6e\x37\xb1\x18\x78\xf2\x7b\xd7\xd2\x0c\xe2\x43\x73" + "\xba\xf6\xe8\xef\x26\xb2\xf3\xf2\x7b\xe7\x19\x33\x51\xce\xf8\x35" + "\xb0\x98\x8e\xf0\x8c\x34\xeb\xda\x74\xef\x5c\x13\x89\x0f\xc3\x98" + "\x66\xc3\xc3\xdb\xbd\x73\xc5\xdf\x67\x9a\x64\x63\xf7\xb1\x18\x70" + "\x9b\x6a\x76\xd0\xb4\xc8\x62\x16\xfb\x0d\x68\x88\xe7\xb2\x68\x76" + "\x8d\x9a\x2a\xab\x0e\x61\x9f\xaf\x58\xc7\xea\x35\x8d\xf7\x2f\x78" + "\x0f\x75\x33\xfb\x45\x97\x43\x3d\x15\xf8\x4c\x73\xae\x54\x74\xfb" + "\x15\xa9\xf1\xff\xab\xbb\xa2\xc2\xa9\xa1\x28\x0c\xc7\xd9\x15\xa9" + "\x7f\x20\x2d\xf0\xbb\x6e\xbf\xe2\x26\xed\x33\x01\xb4\x85\x97\x2d" + "\x87\x7c\x65\x52\x59\xdd\x7e\xd1\x15\x74\x47\x09\xa1\xb9\x80\x21" + "\xb1\x3c\x01\xca\xa3\x86\x6d\x26\x93\x3c\x54\x85\xe9\xb4\x24\x2a" + "\x52\xfa\x1f\xee\x20\x77\x8a\xd2\xf1\x1e\xb0\x81\x58\xd8\x73\x46" + "\x38\xe1\x77\x35\x41\x59\xd7\x2e\x0f\xfd\xeb\xbd\x0d\x44\x56\xf1" + "\x0c\xd6\x3b\x34\x25\xad\x81\x0a\xda\x54\x1f\xf8\x7e\xe8\xfa\xde" + "\xef\x4e\x29\xb6\x62\xfc\x54\x61\xd3\xac\x40\x8c\xc1\x87\xbf\xc5" + "\xba\x15\x4d\x22\x8a\xdd\xf9\x44\x89\x6d\xec\xda\x14\xba\x4f\x8a" + "\x43\x87\xbf\x91\x43\xfe\xa7\x7e\x99\x46\x9d\xca\x5e\x43\x79\x7b" + "\x34\x9c\xa6\xa1\x4d\x26\x99\xc2\x80\xf9\xb5\x77\x32\x5a\x4e\x13" + "\xdf\x07\x21\x3f\xb1\x7c\x21\xb7\x38\x14\x9f\x31\xce\x5d\x40\x03" + "\x91\x6b\x53\x83\xcb\x39\x8d\x8a\xc2\xb0\x1c\xcc\x2f\xe4\x6d\xc3" + "\xff\x0f\x09\xd0\x5e\x7b\x06\xd1\x69\x57\x92\xf0\x16\xf9\x7d\xf3" + "\xec\x39\xb5\x91\xf0\x1e\xfa\x5d\x6d\x14\xe4\x5f\xc4\xe8\x9d\xbb" + "\xad\xc1\x24\xbf\x2f\x0c\xde\x45\xf5\xc6\xbe\xe4\x74\x96\x09\x39" + "\xb5\xf1\x5d\x9b\xee\x8b\x37\xc9\x6e\xdb\x21\xb5\x81\xc9\x38\x47" + "\x3e\x91\xa7\xf7\x45\x9b\x7d\x6b\xe3\x7b\x92\x68\xc3\xe6\x2f\x09" + "\x81\x6f\xd2\xee\x2b\xb4\x36\x65\x11\xb5\xe6\x3d\x47\x48\x6d\x74" + "\x33\x49\x8b\x21\x41\x13\x36\x50\xd0\x73\x24\x60\x42\x73\x00\xad" + "\x5b\xd4\x0c\x32\xfa\x32\x49\x69\xa0\x6d\xf5\xfa\x43\x24\xe5\x0c" + "\x51\xad\x5f\x4e\x02\xd3\x16\x51\x73\x6a\x2d\xb5\x1a\x93\x9b\x49" + "\xbd\x05\x2e\x7d\x1d\xe4\x3b\x0e\xd7\x21\x92\xb6\x96\x28\x9e\x06" + "\x79\x9a\x7a\x99\xa8\xea\xf5\x97\x21\xed\x02\x49\x89\xa6\xb6\xba" + "\x5a\xcc\x57\x45\x22\x6c\xe6\x80\xf5\x17\x88\xa2\xf4\x39\x3c\x5b" + "\x76\x92\xec\x86\xba\x74\xfb\xf9\x93\xab\xb9\xea\xec\xce\x24\x6a" + "\xeb\xda\x74\x7f\x98\x89\x3c\xa2\x75\x69\x0b\xd6\x19\xe3\x86\x42" + "\x7b\x31\x8f\x90\xbb\xad\x7c\xa9\x0d\x71\x7e\x7f\x08\xc8\x62\x22" + "\xbd\xc7\x77\x66\xbf\x6d\x80\x9f\xfb\x23\x23\x6c\xb4\x0b\xf3\x63" + "\xbb\x81\x46\x71\x62\xfb\xe3\x7c\xf4\x44\x01\xdf\x28\x31\xc9\xa6" + "\x27\x3a\xf1\x10\x79\x32\x56\xfa\x9e\x98\xa7\xc2\x24\x0b\x62\xb1" + "\x17\x05\xfe\x6e\x1f\xe6\x85\x74\xe0\xff\xb4\x4a\x5e\xbf\xfb\xf7" + "\x60\x9a\x28\x4b\xb1\x9c\x32\x01\xfb\x75\x76\xd5\x16\xbb\x5f\x51" + "\x38\x95\x53\x2b\xe0\xb9\x89\x76\x6a\x54\x4f\xdb\xa8\x55\xc8\x2d" + "\x6c\x00\x79\xa9\xc2\x38\xa9\x3c\xff\x03\xaf\xc1\x7b\x93\x36\x89" + "\xfd\xff\x3c\x7e\x47\xd8\x15\x15\x8a\xb2\x35\xa2\x01\xf3\xc7\x84" + "\xe6\x25\x80\xec\xcd\x2d\x0a\xc5\x7e\x28\xf8\x6d\x6b\xbb\xba\xb3" + "\xd8\x84\xfd\x9b\x02\xc6\xa8\x21\xda\xd4\x5b\x4e\x06\x19\x63\x92" + "\x3f\x10\x4a\xe1\xf7\xd4\x50\xd8\x20\xd6\x67\x0a\xc7\xe6\x03\x21" + "\xd8\xef\xa0\x5e\x85\x90\x3e\xa6\x45\xfe\x40\x39\x9e\xd1\x84\xe7" + "\x5a\x16\x4b\x52\xfe\xc0\x07\x1c\x33\x55\x5b\x5c\x9e\xe5\x48\x3f" + "\xe8\x93\x20\x07\xb8\x7d\xf1\xc0\x49\x47\xbf\xe0\x38\xe6\xfd\xbb" + "\x10\xea\x74\x9f\x46\xc8\xf0\x11\x20\x9f\xac\x85\xd3\x41\xde\xed" + "\x5b\x1b\xdd\xb5\x69\xb6\xd2\x04\x92\xcd\x85\x9f\x9b\x2a\xcb\x30" + "\x6e\x25\xd4\xc5\xe7\xac\x7c\xf6\x83\x70\x1f\x07\xf7\x87\x0f\x37" + "\xa0\xae\x65\xe5\x4e\xc0\xff\x8b\x26\x53\xf3\xdc\x85\x04\x63\x54" + "\x02\xdd\x67\x2f\x32\x91\x25\x85\x58\xce\x26\x8c\xdd\x09\x69\x98" + "\x07\xd2\xe3\x4c\x64\x69\x26\x2f\x3f\x54\x65\x41\x99\xe5\x5a\x7e" + "\x2e\x2f\x9f\x97\x8b\xe5\x49\x65\xef\xda\x4e\xdb\xc5\xb2\xf7\x4b" + "\x65\xe7\x42\x9a\x54\xfe\xdc\x15\xbd\xdf\xa8\x85\x6f\xb8\xb4\x61" + "\xe7\x76\x6a\xc1\x32\xe0\x5d\x9b\x89\xbc\xf2\xff\xb1\xf7\x3e\x70" + "\x51\x55\xe9\xff\xf8\x33\x97\x41\x07\x02\x19\x8d\x6c\x6a\xa9\x46" + "\xd3\xa2\xf2\x0f\x96\x96\x19\x26\xa5\x16\x96\x0a\xa5\x15\x25\x29" + "\x16\xb6\x58\xa8\x04\xa4\xa3\xa2\xe0\x64\xfb\x45\x16\x95\x94\x75" + "\x31\x11\x68\x63\x5b\x2b\xdb\xdc\x5d\x3f\xdf\x2f\xfb\xfa\xd5\x36" + "\xfb\x91\x5e\x3f\xb6\x15\x86\xcf\x7e\xed\x1b\x96\xd5\xe4\x97\x75" + "\xc9\x50\x27\x19\x9d\x11\x66\xe6\x7c\x9f\xe7\x9c\x7b\xe1\xde\xe1" + "\x8e\x4a\xb9\x7d\xf6\x4f\xd4\x75\xee\x3d\xe7\x39\xcf\x39\xe7\x79" + "\xde\xcf\x73\xfe\xdc\x73\xce\xcd\xa4\xb8\x4d\x18\x46\x69\x55\x98" + "\x8a\x38\x90\x8e\x3c\x0e\x12\x8f\x49\x66\x17\x64\xb7\xab\xfd\x06" + "\xca\x28\x56\xf1\xb5\x82\xd7\xa4\x89\x0a\x2f\x15\x1f\x19\x53\xad" + "\x59\xb2\x4e\x89\x6f\x0c\xf1\x45\xfa\x6c\x17\x2c\x4e\x54\xd7\x1d" + "\x65\x9e\x2e\xc7\x95\xb8\x20\x78\x50\x5d\x66\xd9\xaf\xa6\x62\x7a" + "\x83\xcc\x6b\x26\xf9\x2c\x25\x9e\xbe\xeb\xc9\xca\xc6\x26\x93\xdd" + "\xa0\x7f\x04\xb4\x33\x07\xf2\x69\x0a\xf1\x8f\x46\xa2\x43\x9f\xfa" + "\x3c\xff\xae\xe9\x70\xd6\x81\x34\x9d\x9a\x6f\x79\x4a\x70\xb7\xb7" + "\xec\x76\x50\xbe\x29\xba\x05\x69\x5c\xd2\xd8\xb0\x67\x26\xae\x1f" + "\x01\x92\xb3\xda\x45\xfd\x55\xc2\x5c\xb2\x33\xc1\x03\xce\xea\x20" + "\x04\x6b\x32\xb3\x52\xd6\x33\xc7\x31\xe9\xf6\x75\xf4\x8d\xe8\x81" + "\xb5\x81\xb7\xf3\xf5\x7f\xac\x1b\xfb\x71\x45\xb7\x02\xb5\x7b\x27" + "\xa5\x3b\xde\x76\xba\x4f\x73\xdb\xc3\xfb\x9d\x14\xbf\x1d\xfb\x7d" + "\xd4\xf7\xc3\xfe\x76\x4e\x85\x24\xfa\x7f\x41\xa4\xad\xa1\x70\xea" + "\x1b\x62\xbf\xb4\x56\x15\xc7\x6a\x32\x2d\x42\x76\x77\x2c\x21\x39" + "\xf2\xf2\xfa\xef\x77\x50\x99\x83\xd5\x99\x16\xaa\x43\xb1\x8d\x05" + "\x9d\x7e\xaf\x83\xbe\xb5\x6b\x5d\x49\xfd\xd6\x3b\xee\x49\xdb\x0d" + "\x0c\x6d\xdb\x32\xb0\x3a\xdc\xc1\xc7\xbf\xd8\x37\x3f\xe9\xbe\x26" + "\xd3\x42\xdf\x56\xde\xba\x3e\xd2\x34\xbd\x9a\x39\xba\xae\xcd\x44" + "\xdb\xba\x23\x5b\xf9\x76\xed\x00\xf9\x66\x2b\x75\xaf\x91\xeb\x8e" + "\xf2\xe2\xef\xac\xc7\x57\xf1\x6f\x6a\xe3\xf3\x1d\x61\xd7\x3a\x61" + "\xbb\x9d\x4a\x69\xb1\xee\x29\xb5\x8a\x9c\xfc\x6e\xfa\xa6\xf8\xd0" + "\xe3\xd2\xe4\x09\x69\x45\x0e\xe0\xe7\xe4\x6f\xfe\x59\xea\x00\xcb" + "\xc5\xd7\xbf\xb4\xe0\xb8\x20\xcd\xff\x3e\x13\x7e\x71\xf2\xe3\x73" + "\x65\x7e\x14\xa7\xe8\xaa\x46\xee\xaf\x0f\x3c\x8f\xc9\x59\x17\x51" + "\x2f\x73\xff\x7a\xdd\x19\xf5\xed\xeb\x35\xf9\x50\xff\x7a\xdd\x39" + "\xe1\xd2\xd6\xeb\xce\xb0\xeb\xbf\x55\xf5\xb2\xea\xd4\xeb\xcb\x6f" + "\x5f\xaf\x3b\xf7\xf6\xaf\xd7\x94\xa8\x4b\x5b\xaf\x29\xe6\x8b\xa8" + "\x57\x52\xff\x7a\x4d\xf9\xfd\xb7\xaf\xd7\x94\x8d\x3a\xf5\xfa\xf2" + "\x12\xd7\xab\x63\xc0\xfe\x70\xcb\x2b\x15\xc2\x1f\xde\xb5\x79\xe0" + "\xfe\xf0\xae\x8c\xfe\xfe\x30\xf9\xbd\x3e\x7f\x98\xfc\xc6\xb7\xf2" + "\x87\x5b\xb2\xe4\xbe\x46\xf2\x0b\xfd\xfc\x61\x79\x56\xab\xbe\x3f" + "\x4c\x7e\x88\xfb\xc3\xcd\x59\xad\x03\xab\x43\x72\x42\xaf\x3f\x8c" + "\xcd\x6a\xd5\xf8\xc3\x21\xaf\x54\x78\xcb\x92\x0b\xbf\x9d\x3f\x4c" + "\x2e\xec\xef\x0f\xef\x3a\xa4\xf5\x87\xc9\x61\xbf\xf5\x85\x38\x6c" + "\xd2\xf3\x87\x69\xfe\x53\x4c\xc6\x46\xd3\xc0\xca\x33\x35\xec\xf9" + "\xef\x98\x57\xfa\x05\xf2\x4a\x1f\x60\x5e\x61\xe7\xbf\x70\x6c\xb8" + "\x0f\xfb\x20\xe6\x75\xaf\x82\x74\xac\x08\xa4\x96\x84\x36\x70\xda" + "\x7c\x30\x2e\x0f\x31\x61\x87\xe4\x96\xea\x4e\x68\x49\x38\x06\x2c" + "\xea\x83\x7d\xec\xf5\x5c\x57\x4a\x3e\x61\xf3\xee\x9b\x9c\x85\xbe" + "\x01\x62\x73\xaa\x47\xc1\x66\x8b\x1f\xb1\xb9\x92\xf0\x38\xed\x71" + "\x67\xe7\x71\x19\x9b\xd3\x66\xf6\xea\xc7\x2e\xf0\xa9\x8b\x4d\xb4" + "\x09\x2d\x36\x7f\x96\x22\xb0\x39\x6d\x68\x7f\x6c\xfe\x2c\x45\x1f" + "\x9b\x77\x9f\x10\xd8\xfc\x59\xca\xc0\xea\x70\x77\x43\x1f\x36\x7f" + "\x96\xa2\xc1\xe6\x0d\xb9\x2e\x6f\xd9\x34\xf3\xb7\xc3\xe6\x34\xb3" + "\x52\xf7\xdd\x72\xdd\x31\xaf\x3c\x2d\x36\xa7\xa5\x86\xd5\x61\xe9" + "\x7e\x1b\xfa\xc3\x98\xe3\x52\x8a\x25\x80\x7d\xda\x60\x69\x4f\x43" + "\x5a\x80\x79\xe9\x1b\xed\x4c\x9a\x08\x6c\x55\x62\x8c\x17\xc7\x9b" + "\x5e\x6f\x8e\x89\x45\x7f\x70\x37\xeb\xb1\x00\x96\x3d\x8e\x79\x13" + "\x87\xa0\xcc\x46\xe1\xef\xb0\xdd\x2b\x21\x1e\x2f\xcb\x6e\x59\xae" + "\x78\x9f\xc4\x56\x59\xa2\xb7\xac\x84\x31\x71\x1e\xa0\xef\xdd\x64" + "\xc4\x6d\x30\x43\x9c\x1f\xe2\xe9\x9e\xd9\x6b\xf7\xd5\x9e\x05\x23" + "\xcd\x35\x06\xa3\x30\x3f\x5b\x1c\x63\x05\x89\x50\x9b\x8f\xe5\x91" + "\xc0\x52\x2b\xb1\x7d\x81\x55\x89\x12\x1b\xf2\xca\x83\x6c\x6d\x06" + "\x2f\x53\x70\xd4\x32\x2b\x7b\x1d\xaf\xe2\x1c\xca\x37\x85\xbe\x15" + "\xcc\x6e\x58\x86\xf9\x5b\xa2\x37\x9f\x85\x31\xb5\x2b\x61\x54\xcd" + "\x4a\x48\x64\x3d\x89\x12\xca\x20\x63\xe1\xf3\x66\xd2\x7b\x06\x93" + "\x30\xaf\x95\x98\x17\xea\x32\xb0\x09\xf3\xf2\x63\x5e\xa7\x30\xaf" + "\x93\x98\x97\x1d\xf3\xb2\x8b\xbc\x06\x26\xf3\x94\x8d\xe7\x9b\x13" + "\x4e\x5b\x77\x2d\x9d\x5d\xfb\xb7\x38\xdb\xe0\x54\x9a\x1f\xee\x5a" + "\x9b\x33\x40\xbc\xa7\x84\xdd\xff\xb3\xf5\xd7\x90\xc0\x4c\x67\x3a" + "\xe6\xbe\xf4\x05\x4b\xc3\xde\xd0\x4b\xbf\x86\x31\x64\x73\x2d\xbe" + "\x13\x68\x67\x67\x3a\x3e\x48\xec\x1c\x60\x5e\xf7\xa4\x87\xcb\xab" + "\xcc\xce\x5a\x7b\x12\x68\xbc\xf8\x4a\xc6\x56\x89\xd9\xba\x13\x32" + "\xd3\x3f\x3c\xd4\x0d\x8b\x6c\x34\x07\xcd\x6c\xd6\x27\xc0\x74\x54" + "\x4a\x35\x16\x1f\xa6\xf9\xbc\x7b\x0e\x69\xe7\xf3\xee\xf1\x81\x34" + "\xbd\x1a\xa4\x19\x07\x41\xba\x6f\x3e\x20\x9d\xf6\xba\xbf\x3c\xed" + "\x8d\x6b\x61\xbd\x9f\xfd\x8d\x95\x2f\x4e\xdc\x82\x63\xe1\xb4\x9b" + "\x0c\x2e\xc7\x4a\x9a\xdf\x9a\xfe\x33\x94\xdf\xd7\xd8\x06\xc5\xd1" + "\x3d\xf1\xcb\xcb\x87\xcb\x8f\x4b\xd3\x2b\xe3\x3c\x83\x53\xfd\x31" + "\xaf\xd8\xfc\x38\x7e\xeb\xb1\xec\x72\x9d\x2b\x7f\x25\xa9\x87\xc6" + "\xb3\x4f\x91\x1f\xb8\x77\x73\x9c\xa1\x04\xc7\xad\x3d\x0d\x8c\x59" + "\x68\xce\x36\xa3\x1a\x2f\xd2\x3d\xd7\x7b\xf4\x87\x07\x09\x1f\x84" + "\xc5\x5a\x11\x4e\xdf\x7c\xca\xd8\x2a\xb7\xd9\xee\x88\x9b\xb3\xc8" + "\x06\x02\x98\xbe\xf8\xaf\x90\xe0\x3c\x12\x00\xc4\x74\xc6\xa2\x80" + "\x89\xec\x28\xc3\xf1\xc4\x5f\xe0\x58\x1e\x48\xc5\xdf\x40\x2c\x62" + "\x28\x86\xec\x21\x88\xf6\x90\x76\x24\xce\x87\x76\x1d\x5c\x7f\x06" + "\xe2\xc8\x4f\xd0\xb9\xc8\xce\x4e\x1c\x5d\x9d\x4a\x1c\xb2\x6b\x39" + "\xc4\xfb\x4f\xe5\x0c\x73\x9f\xca\xb9\x7c\x67\x10\xe2\x87\xe4\x81" + "\x79\xf7\x72\xc4\xee\x0a\xb4\x8f\x93\x68\x1f\x9d\xc2\x3e\x7a\xf1" + "\xfa\x93\xf7\xf7\xd3\x9e\x1b\x6e\x1b\x9b\x64\xdb\x58\x85\x78\x5d" + "\xd9\x67\x1b\xfe\x15\x89\xd2\x6e\x89\x01\x96\x11\xe5\x9e\xd2\x58" + "\xbb\x7e\xb0\x89\xc6\xf4\xec\xda\x4c\x07\x8d\xcd\xd2\xfc\xcc\xff" + "\x0e\xea\x22\xf2\x26\xc9\xca\x36\xbf\x62\xfb\x30\xbd\x03\xfa\xc6" + "\x74\xa9\x91\xdd\xd7\x64\xa6\x5b\x1f\x66\xa7\x8e\x4a\xd3\xcb\x31" + "\xdc\x64\x7d\xf4\x46\x33\xea\x31\x52\x8c\x01\x53\x8d\x34\x47\xe0" + "\x92\xa6\x67\x21\x2f\xa0\xf7\x12\x7f\xe6\x73\x92\x33\x1a\x91\x16" + "\x02\x28\x73\x7f\x4c\x96\x2b\x18\xf3\x4a\xaa\xe3\xd9\x6e\x6e\x9b" + "\x3d\xa8\x83\x63\xb9\x20\x2d\xea\x44\xd9\x04\x50\x36\x5e\xee\x33" + "\xd2\xb9\xcf\x28\xfd\x60\x72\x91\x8b\x05\xd3\xb2\x23\x18\xca\xc5" + "\xe4\xb4\x05\x60\x61\x1e\xb0\x75\x27\x50\x46\x9e\x36\xf2\x2f\x43" + "\x82\xab\x84\x0f\xd9\x85\xf2\x89\xed\x04\x33\x2b\xf3\xee\xfb\xf5" + "\xfa\xa6\xc8\x00\xe2\x9c\xfc\x48\xdc\x06\x43\x14\xea\x6a\x48\x39" + "\xd9\x39\xda\x7d\xdc\x06\xee\xd7\xb8\x6e\xfd\xab\x12\x47\xf6\xac" + "\x4a\xb4\xe2\x75\xad\xe2\x6b\xe8\x5b\x5c\xbb\xc9\xcf\x94\xdd\x43" + "\xf4\x46\xa7\xcd\x05\x7e\x94\xe5\x10\x6a\x97\x56\x25\x26\x70\x99" + "\xfe\x18\x65\xfa\x0c\x98\xc6\xfb\xc0\x80\xe5\x32\x63\x99\xa1\x39" + "\xe7\x28\x90\x8c\x03\x68\x47\x24\xe7\x1e\xf2\x41\x88\x35\xec\xa7" + "\xb8\xe6\x2c\xb5\xc2\x07\x89\x1f\x01\x9d\xad\x54\x7c\x8e\x7d\x49" + "\x73\xa2\x4e\x9b\x1f\x58\xec\x2b\x36\xc6\xe7\x91\xa6\x67\x7f\x98" + "\xee\x83\xf0\x98\xbe\x6f\x4e\x1f\xa6\xef\x9b\xd3\x87\xe9\xfb\xf8" + "\x1a\x14\x35\xae\xcf\x55\x21\xae\x63\xd4\xb8\x9e\xb9\xe4\xef\x8a" + "\xeb\xb9\x03\xc7\xf5\xce\x93\x2a\x5c\xaf\xff\xef\xc1\xf5\x9f\x33" + "\x38\xae\x23\x7a\xae\xe1\x78\xc5\x7e\xce\x6f\xc1\x25\xdd\x37\x59" + "\xc1\xed\x9f\xde\x24\xdc\xde\x5f\xf4\x8f\x8a\xdb\x73\xde\x44\x2b" + "\x5e\x97\x1c\xb7\xc8\xf3\xa2\x71\xfb\xe7\x8c\x6e\x50\xe4\x47\xf8" + "\x65\xa5\x67\x3a\xac\xc5\x30\x0d\xfd\x84\x31\x6e\xc3\xb5\xd0\xcc" + "\x65\x98\x6a\xb4\x3e\xca\x82\x47\xa5\xfb\xff\x83\xf0\xd4\x6d\x67" + "\x2c\x18\xf3\xb3\x8e\xe2\xff\x02\x73\xb0\x7c\x71\x92\xd3\xff\x36" + "\xc4\xe5\xd1\x3b\x9e\xac\x06\x16\x6b\x2e\xa1\x77\x41\x58\x1e\x23" + "\xbd\xff\x09\x6c\xf2\xd6\x05\xd0\x9f\x04\x36\xef\x4a\x0a\x6e\xfa" + "\xc8\x11\x8c\x15\xef\x88\x58\xd4\x59\x87\xb7\x2c\xd5\xa8\xbc\xbf" + "\xd0\xed\x9b\xc4\xec\x4a\x42\x7b\x31\x1e\x93\x66\x19\xf0\x57\xc2" + "\x72\xec\xc6\xdf\x08\xfc\x5d\x46\xe5\x18\x58\x3b\x97\xca\xc7\xbf" + "\xd8\x96\x6d\x94\xfd\xe0\x9d\xdc\x06\x6f\x86\xd8\xe3\xf2\x3d\x96" + "\xa7\x52\x79\x1f\xd2\x4b\xdf\x27\x0f\x2a\x4b\x04\xca\xc4\x28\xde" + "\xd1\x88\x67\x15\xbf\x09\xfc\x19\x8c\x09\x58\x7f\x37\xbd\x4b\x45" + "\x2c\x19\xbc\x2c\xe7\x6e\xf9\x77\x2a\x7f\xa7\x83\x72\xa0\x7e\x9e" + "\xec\x6b\x27\x8b\x7c\x67\xc5\x60\x3b\x5c\xa1\xce\x57\x4f\x1e\x2e" + "\x69\x56\x62\xb8\xb8\x81\xc9\x62\x56\xd8\xf5\x5f\x33\x13\x03\x6c" + "\x80\xbc\xc2\xee\x7f\x65\x09\x99\xe6\xb4\x3d\x01\x47\xb0\x27\x23" + "\xee\x83\xa2\x13\x03\xec\x97\xcc\x0a\x3b\xfe\x0d\xc4\xec\x80\xb4" + "\x9b\xae\x85\x40\x75\xa6\x99\xe6\x3a\xa9\xaf\xd5\x92\xe8\x07\xea" + "\x6f\xbd\xf1\xac\x4b\xea\xc1\x3e\xe3\x10\xb4\xc7\xb9\x9e\xf7\xd9" + "\xd6\xe3\xd8\x47\x5d\x95\x11\xb7\xe5\x59\x48\xf6\x9f\xb2\x44\xff" + "\x14\x7d\x50\x37\xfa\x83\xee\x53\x39\x71\x2d\x79\x3e\x08\xee\xce" + "\x34\x3b\xfd\x4d\x50\x8b\x74\xe4\x7f\xa9\xbc\xe7\x4e\x65\x0c\x29" + "\x5b\x0e\xfc\xdd\x86\xe3\xa9\x37\xd1\xff\x3e\xf0\x55\xe4\x3a\xf4" + "\x39\xe8\x33\xb8\x1f\xfe\x16\x3e\xb8\xfb\xc5\x9b\xb3\xe6\x64\x32" + "\x5f\xcb\x91\xbf\x40\x71\x33\x98\x8b\x5f\x80\x58\xe2\xef\xf4\x37" + "\x0b\xbf\xfc\x38\xfa\x65\x7c\xae\x51\xf9\x65\x3e\xa7\x1e\xe2\x97" + "\xa9\xff\xdd\xd2\xde\x01\x43\x3c\x30\x78\xae\x27\xce\xb7\xde\xc3" + "\x82\xd4\x1f\xa7\xf7\x28\x48\x33\x44\xf1\xd1\xaf\x60\xbf\xa3\x67" + "\x85\xf0\xcf\xbb\x65\xff\xfc\xca\xc9\xef\xee\x9f\x5f\xb1\xa3\x7f" + "\xc6\xfe\xde\x4e\xf2\xcd\xe8\x97\xf7\x1e\x73\x4b\x7e\xf4\xc5\x03" + "\xd3\xed\x83\x8d\xe1\x74\x3b\x17\xdb\x4f\xd2\x29\x61\xa7\x79\x8f" + "\x9f\xde\xf1\xff\x2d\x30\xe4\xe5\x74\x6a\x1f\xbb\xb1\x6d\x7c\xe3" + "\xd9\x36\x69\x88\x0d\x75\x9b\xf7\x3e\xf3\x17\x64\xc4\xb1\x9e\x8c" + "\xd8\x40\xf9\x0e\xf0\xf7\x58\x4c\x3d\x3d\xa8\x5f\xf4\x17\xd8\x5e" + "\x99\xdd\x6b\x73\xb8\x4c\x82\xd7\x64\x9a\x83\x3f\xb9\x21\x05\xdb" + "\xa6\xc9\x35\x27\x61\x22\xdb\xfc\x72\x9e\x7f\xf3\xcb\x45\x3d\x9b" + "\x5f\x2e\x44\x5c\x0e\xc1\xfe\x23\xea\xfc\x9c\x23\xb8\xf9\xe5\x8a" + "\xe0\x96\xca\xf4\x40\xec\x0e\x70\xc7\xbe\x6c\xc3\xe7\xd2\xe0\x5a" + "\xc4\xc1\x1a\xc2\xc1\x07\x60\x9d\x4b\xed\xf0\xec\x6f\xf4\x70\xb0" + "\xd3\x3e\xb0\xb6\x78\x4e\x06\xe2\xa0\x0d\x71\xf0\x8d\x1a\x07\xef" + "\x81\xdf\x2e\xb7\xd1\x8f\x08\x2c\xa0\xdc\xf9\x58\xa6\xb7\x9d\x7e" + "\xf8\x43\x7d\x3c\x1c\xb9\x38\x3c\x74\x9f\xd2\xe2\xa1\xfa\x5b\xe2" + "\x01\xdb\x57\x4b\x0d\x8e\x9b\xce\x9d\x4a\x94\xaa\x09\x0f\x1f\xf5" + "\xe1\xe1\xad\xcf\xdd\x52\xcf\x80\xf1\x30\x27\xec\xf7\xbf\xc2\xe0" + "\xa1\xf5\x3b\xe2\xa1\x4a\x85\x07\x37\xe2\xc1\x8f\x78\xf0\xf4\xe1" + "\xe1\x0c\xe2\x61\x9b\x59\x85\x07\x1f\x3e\x9b\xfa\xe3\x21\xcd\xf0" + "\xfd\xe2\x21\xf2\xf4\xbf\x07\x1e\xd2\xc2\x8e\x7f\xf5\xf1\xb0\xed" + "\xbb\xfa\x07\x77\x1f\x1e\xb6\xa1\x7f\xd8\x86\xfe\x61\x9b\xca\x3f" + "\x9c\x20\x3c\xa8\xfc\xc3\x36\xf4\x0f\xdb\x74\xfc\xc3\x43\x43\xbf" + "\x5f\x3c\x5c\x76\xf4\xdf\x03\x0f\x0f\x79\x06\x88\x87\xef\xe8\x1f" + "\x6e\x4c\x55\xe1\x01\xfd\xc3\x36\xf4\x0f\xdb\x54\xfe\xe1\x33\xc4" + "\xc3\x76\x95\x7f\xd8\x86\xfe\x61\xbb\x8e\x7f\x98\x37\xe2\xfb\xc5" + "\xc3\xd0\xbf\xfc\x7b\xe0\x61\x7e\xd8\xf9\x6f\x7d\x3c\x6c\xff\x8e" + "\xfe\xe1\xc6\xba\x3e\x3c\x6c\x47\xff\xb0\x1d\xfd\xc3\x76\x95\x7f" + "\x78\x8f\xf0\xa0\xf2\x0f\xdb\xd1\x3f\x6c\xd7\xf1\x0f\x8f\x4c\xf8" + "\x7e\xf1\x70\x7b\xd9\xbf\x07\x1e\x1e\x8d\x1f\x20\x1e\xbe\xab\x7f" + "\xf0\xa9\xf0\x80\xfe\x61\x3b\xfa\x87\xed\x2a\xff\xb0\x0e\xf1\x50" + "\xa9\xf2\x0f\xdb\x69\x6d\x8f\x8e\x7f\x78\xec\x9e\xef\x17\x0f\x0b" + "\xee\xfd\xf7\xc0\x43\xc6\xa8\x0b\xe1\x41\xc1\x02\xe1\x82\xb0\xd0" + "\x53\x9c\x01\x34\xce\x78\xe3\xb8\xc0\x03\xe1\x80\x63\xa2\x2b\x23" + "\x2e\x80\x58\xf0\xaf\x45\x2c\x74\x0b\x2c\x90\x2c\x08\x0f\x34\xae" + "\xa0\xf1\x04\x61\x22\x80\x63\x0a\x7f\x2c\x8e\x29\x36\x18\xe3\x09" + "\x07\xdd\x31\x17\x18\x57\x74\x03\x1f\xfb\xd1\x18\xef\xa4\xf4\xf8" + "\x2c\x3d\x1c\xbc\x32\xc0\x39\xbe\xde\xf1\xa5\x06\x07\x1f\xf4\xe1" + "\xe0\xf1\x30\xe3\x8a\x47\xc3\xe0\xc0\x75\x11\x38\x38\xd9\x7f\x9c" + "\xf9\x5d\x71\xd0\xbd\x42\xc6\x01\x8d\x33\x83\xf2\x38\xf3\x29\x1c" + "\x67\xc6\x0e\x14\x07\x4f\x8c\xf9\x76\x38\xd8\xd6\x3a\x30\x1c\xdc" + "\x98\x4a\xfd\x04\x81\x83\x6d\x7e\x7f\x2c\xf6\x15\x34\x38\x38\x4f" + "\x7f\x41\x83\x83\x05\x0f\x7d\xbf\x38\x08\xe9\x2f\xfc\xcb\xe2\x20" + "\x33\xec\xf9\xaf\x41\xd4\x3b\xf9\x7b\x9a\xb7\xa7\xbd\x1b\x43\xdc" + "\x62\xde\x88\xf6\x70\x6c\x5d\x0e\xa3\xa8\x8d\x08\xac\xca\x88\x2b" + "\x3f\x09\xc9\x9b\x96\x83\xd1\x5f\x80\xfa\xcf\x07\x63\xb7\x04\xd0" + "\x5d\x90\x13\x77\xb0\xdd\x2d\xe6\x90\x6c\x0e\xa8\x45\xfa\x9e\x72" + "\x31\x87\x14\xe8\xca\x18\xb2\xe9\x34\xf0\x75\xaf\x8e\x85\xbf\x40" + "\xdd\x3e\x39\x56\x4f\xb7\xbb\x06\xe0\xeb\xbb\xd5\xbe\xfe\x84\x56" + "\xb7\x6a\x3f\x5f\x6d\x57\xcd\x21\xcd\x0d\x33\x87\x74\x11\x3a\xe5" + "\x73\xfb\x27\x85\x9f\xef\x9d\x43\xfa\x8e\x73\xfc\x3d\xe8\xe3\x5f" + "\x91\xb4\x3e\xfe\xdb\xe9\x74\xa1\xe9\x7c\xf3\x8e\x64\xdf\x64\xd7" + "\x8a\x4d\xf7\xb6\xf1\x64\xc7\xa8\xef\x73\xe5\x2f\xcf\xe7\x6d\xfd" + "\xda\x3e\x9b\x26\x5b\x26\xbb\x26\x3b\xe6\x6d\x3d\x9d\xf3\xfb\x93" + "\xc4\xf4\x1a\xd5\xdc\x51\x20\x56\xf6\xf3\x3a\x3e\x3e\x78\x5e\x1f" + "\xbf\x48\x57\xff\xff\x0c\x3e\x9e\x70\xa0\xd8\xf7\x3f\x9e\x6d\x67" + "\x85\x5f\xff\x75\x71\x38\x38\x74\x11\x38\x68\x45\x1c\xd4\xab\x70" + "\xe0\x46\x1c\xa0\x9f\x17\x73\x46\x02\x07\x7d\x73\x46\xc1\xd0\x39" + "\x23\x0d\x0e\x16\x4f\xfa\x7e\x71\x10\x32\x67\xf4\x2f\x8b\x83\xa7" + "\x2c\xdf\x0d\x07\xdb\x2e\xc2\x1f\x6c\x23\x7f\xe0\xab\x51\xcd\x15" + "\x05\x62\xb7\xa1\x3f\xd8\xa6\xf2\x07\x7d\x73\x45\xc1\xd0\xb9\x22" + "\x0d\x0e\x9e\x9e\xfa\xfd\xe2\x20\x64\xae\xe8\x5f\x16\x07\xd9\xd6" + "\xef\x88\x83\x8b\xf0\x07\xdb\xd0\x1f\xdc\x34\x5b\x85\x03\xf4\x07" + "\x72\xbf\x4f\xa7\xcf\x17\x3c\x6f\x9f\x6f\xc9\xcc\x7f\xd6\x3e\xdf" + "\x3f\x36\x0e\x9e\x09\xfb\xae\xf4\xe2\x70\xb0\xfd\x22\xfc\xc1\x76" + "\xf4\x07\x37\xd5\xd5\xa8\xe6\x86\x02\xb1\xdb\xd1\x1f\x6c\x57\xf9" + "\x83\xbe\xb9\xa1\x60\xe8\xdc\x90\x06\x07\x3f\x9e\xf3\xfd\xe2\x20" + "\x64\x6e\xe8\x5f\x16\x07\x39\x49\xdf\x11\x07\x17\xe1\x0f\xb6\x93" + "\x3f\xf0\xa8\x70\x80\xfe\x60\x3b\xfa\x83\xed\x2a\x7f\xd0\x37\x27" + "\x14\x0c\x9d\x13\xd2\xe0\x60\xe9\x23\xdf\x2f\x0e\x42\xe6\x84\xfe" + "\x65\x71\xf0\x6c\xd8\x75\x15\x0a\x06\x7a\xe7\x00\x58\x1f\x0e\xb8" + "\xee\x0b\x32\xe2\xba\x63\x5e\x9e\xaf\x8c\xff\xcb\xfb\x8d\xff\x13" + "\xd3\xc3\xce\x03\x85\xbc\x5f\xe6\x63\x83\x2d\x2f\xa7\x8b\x71\xc2" + "\x0e\x20\xfd\xff\x74\x8d\x18\x27\x5a\x1f\x25\xfd\x3f\xa7\xaf\xff" + "\x81\xce\x09\x66\xa3\xfe\xdb\xcf\xa3\xff\x27\xc3\x8c\x13\x9e\xf8" + "\x6e\xfa\xa7\xf5\x8e\x3d\xa7\x2e\xa1\xfe\x95\x39\xc1\xcf\x40\x7a" + "\xe5\x3b\x8d\x17\x73\xc3\xea\x5f\x77\x3d\xc9\x1e\xb1\x9e\x84\xd6" + "\x92\xb4\x74\x74\xc0\xa6\xb3\x60\x1e\x92\x2b\x30\xc1\xd7\x94\x20" + "\x26\xca\x8f\x43\xb2\x5f\xd4\xad\x77\x4d\x09\x9d\x8b\x2e\xfc\x82" + "\x83\xaf\x29\x51\xe6\x03\x7a\xd7\x93\x2c\xa4\xf5\x24\xcb\xee\xfc" + "\xce\x73\x01\xb4\x9e\xa4\x10\x75\xec\x41\x1d\x9f\x21\xfd\x7e\xa0" + "\xb1\x6b\xcd\x1c\x40\xb8\x75\x24\x17\x33\xaf\xf3\x77\x58\x47\xc2" + "\xe7\x00\x2e\x89\x4d\x2f\x0f\x7b\xfe\x0b\xe9\x91\xf4\xe9\x4c\xf4" + "\xf3\x79\x5d\xc5\xc6\x9d\xb6\x56\xd8\xd4\x0d\x66\x65\xfe\x5f\xd1" + "\x29\xf9\x7b\x86\x38\x60\xa7\x32\x62\x49\xa7\x3f\x5d\x8e\x7e\x7e" + "\x45\x9f\x9f\x0f\x0e\xba\x21\x65\xf7\x1a\xf4\xef\x6b\x60\x22\x97" + "\xd1\x90\xca\x74\x31\x1f\xb0\x03\xc8\xde\xc9\x9e\x59\xec\xcb\xa5" + "\x3d\xb2\xbd\x0b\x7d\x37\x03\xe9\x99\x7f\x3f\x53\x5a\x31\x96\x6c" + "\x8f\x74\x3e\x44\xd6\x79\x4d\x18\x9d\x73\x7d\x1b\xcc\x74\x16\x07" + "\xed\x33\xeb\xd5\xb9\xff\x45\xd5\xfc\x8f\x5a\xe7\xf2\xbc\x4f\x10" + "\x6d\xf9\xa2\xd6\x0f\x5d\xa4\xde\x2f\xd9\xfc\x3e\xea\xbd\x46\xd6" + "\x7b\xef\xfc\xfe\x77\xd2\x7b\x5e\xf8\xfd\x2f\x5a\xbd\xb7\x5e\x02" + "\xbd\x57\xe9\xe8\xdd\x2d\xeb\xdd\x43\xe3\x7c\x16\xbb\xcd\xd4\x23" + "\xaf\x1b\xe9\xaf\xf7\xe7\x47\xff\xfd\xf5\x1e\x79\xfa\xdf\x43\xef" + "\xcf\x87\x3d\xff\x5c\xab\xf7\x6d\x97\xc2\xde\xdd\xfd\xf5\xbe\x4d" + "\xb6\xf7\x6d\x85\x34\xae\x47\xbd\xcb\xf6\x7e\x42\x47\xef\x05\xd7" + "\xfc\xfd\xf5\x7e\xd9\xd1\x7f\x0f\xbd\x17\x84\x5d\xff\x11\xa2\xf7" + "\x4b\x60\xef\x37\xa6\xea\xe8\x5d\xb6\xf7\x6d\x1e\x1a\xc7\xb3\xd8" + "\xed\xb2\xbd\x7f\xa6\xa3\xf7\x17\xae\xf8\xfb\xeb\x7d\xe8\x5f\xfe" + "\x3d\xf4\xfe\x42\xd8\xef\xff\x6a\xf5\xbe\xfd\x12\xd8\xfb\x8d\x75" + "\xfd\xf5\xbe\x5d\xb6\xf7\xed\x85\x34\x6e\x47\xbd\xcb\xf6\xfe\x9e" + "\x8e\xde\x57\xc5\xfe\xfd\xf5\x7e\x7b\xd9\xbf\x87\xde\x57\x85\x5d" + "\xff\x17\xa2\xf7\x4b\x61\xef\x3e\x1d\xbd\xcb\xf6\xbe\xdd\x43\xe3" + "\x74\x16\x5b\x29\xdb\xfb\x3a\x1d\xbd\xaf\x8e\xfc\xfb\xeb\x7d\xc1" + "\xbd\xff\x1e\x7a\x5f\x7d\xe4\x42\xef\xeb\x15\xdd\x2b\x73\x36\xfc" + "\xfd\x2c\xf6\xef\x15\x7d\x13\x0e\x48\xe7\x84\x05\xb5\xce\xf9\x1a" + "\x9e\x15\x62\x0d\x0f\xf5\xdb\x19\x8e\xc5\xd9\x20\xbe\x7e\xa3\x94" + "\x8f\xdb\xe5\x7e\x3c\x33\x18\xe3\xa9\x2f\x1f\xbe\x1f\xbf\xe6\x8c" + "\xa2\xef\x6f\x3b\x76\xbb\x90\xbe\x43\xc7\xe4\xff\x28\xfa\x56\x8f" + "\xdf\x2e\x8d\xbe\xd7\x1e\xfc\x76\xfa\xde\xd6\x3a\x30\x7d\x6f\x73" + "\x0b\x7d\xd3\x3a\x8d\xed\xa6\x3e\x7d\x6f\xf3\x08\x7d\x6f\xf3\x85" + "\x6f\xcf\x8b\xfe\xfa\xf7\xd7\xb7\x76\x4e\xfe\x5f\x57\xdf\xeb\xc2" + "\x7e\xff\x83\xe6\x60\x48\xd7\xa4\xf7\xad\xcf\xc2\xa8\x9f\x3e\x2b" + "\xe6\x56\xfc\xa7\x2c\xe4\xf3\x8d\xa4\x7f\xda\xe3\x33\x04\x31\xf0" + "\xe7\x0c\x37\x74\x7b\x33\x80\xf6\xf2\xd0\xba\x8b\x96\x1c\x17\x38" + "\x6d\x1f\xc2\xa6\x7c\x30\x1f\xcc\x3a\x0d\x73\xf7\xb0\x1e\xe7\x11" + "\x07\xed\xf1\x36\x3a\xd6\x7c\x08\x6c\x45\x62\xf4\x42\x0f\x48\x27" + "\xa5\xf5\x85\xb4\x6e\x63\x9c\x07\x65\x42\xfb\x7d\x50\xe7\x9b\x4e" + "\x02\x7c\x50\x08\x60\x7d\x86\x74\xbd\xfe\xbf\x22\x5f\xd0\xd9\xe7" + "\x33\x90\x79\x19\xf5\xdc\xab\x8e\xae\x77\x49\x97\x66\x6d\x86\xb2" + "\x2e\x43\x33\x2f\xf3\x5d\xf7\x5f\x5e\xb2\xb5\x19\xc5\x61\xcf\x72" + "\xa2\xf5\x36\xa4\x4f\xb2\x69\xff\x16\x31\x2f\xe3\xb4\x35\x01\xad" + "\xab\x21\x1b\x0e\x74\x59\x4c\x6b\x0b\xd1\xd6\xdb\x84\xad\xff\xf4" + "\x34\xd2\x66\x7d\x02\x84\x0f\xa1\xdb\x1e\xa1\xdb\xd3\xa4\xdb\x4f" + "\x80\x15\x24\x46\x9f\x94\x4a\x66\x93\x7e\x49\xaf\xc5\x87\xc1\xbc" + "\x88\xce\x45\x21\x1f\x8f\xfe\x1d\xf5\x3c\xb9\xf6\x59\x98\x48\xf6" + "\x1f\xd8\xfc\x72\xa1\x7f\xb3\x58\xa3\x41\x7e\xbf\x27\xe6\x15\x5b" + "\x59\xbe\xac\xff\x27\x48\xff\x25\xba\xfa\xdf\xf5\x6d\xe7\xde\x65" + "\xfd\x7f\xeb\x7d\x3d\xff\x5d\xf6\xbe\xe2\x52\xd9\xfb\x86\xb0\x67" + "\xa2\x84\xe0\xa0\x75\xe0\x38\xf0\xea\xe0\xc0\x3e\x5f\x07\x07\x6e" + "\xc4\x41\x55\x08\x0e\x3c\x32\x0e\x7c\xd8\x36\x98\xfa\xe3\xc0\x7e" + "\xf8\xfb\xc1\xc1\x45\xee\xe7\xf9\xa7\xc7\xc1\x8b\xfb\x2f\x0e\x07" + "\xdb\xbe\x85\x3f\x38\xa5\x83\x83\x8d\x99\xfd\x71\xb0\x8d\xfc\x81" + "\x5b\x8b\x83\x6d\xb2\x3f\xd8\x86\xfe\x60\x9b\x8e\x3f\xd8\xf8\xe5" + "\xf7\x83\x83\x8b\xdc\xc7\xf3\x4f\x8f\x83\x97\xc2\xb6\xff\x21\x38" + "\xf8\x16\xfe\xe0\x0b\x1d\x1c\xfc\x24\x5b\x07\x07\x6e\xea\x07\x86" + "\xe0\x40\xf6\x07\xdb\x7c\xd4\x3f\xec\x8f\x83\x9f\x7c\xf5\xfd\xe0" + "\xe0\x22\xf7\xef\xfc\xd3\xe3\xe0\x7f\x84\xdd\xff\xab\xc5\xc1\xf6" + "\x6f\xe1\x0f\xde\xd7\xc1\x41\x69\x6e\x7f\x1c\x6c\x47\x7f\x70\x63" + "\x9d\x16\x07\xdb\x65\x7f\xb0\x1d\xfd\xc1\x76\x1d\x7f\x50\xfa\xcd" + "\xf7\x83\x83\x8b\xdc\xb7\xf3\x4f\x8f\x83\x4d\x61\xc7\x7f\x21\x38" + "\xf8\x16\xfe\xa0\x58\x07\x07\x65\x85\x3a\x38\x20\x7f\xe0\x0b\xc1" + "\x81\xec\x0f\xb6\xa3\x3f\xa8\xd4\xf1\x07\x65\xe7\xbe\x1f\x1c\x5c" + "\xe4\x7e\x9d\x7f\x7a\x1c\xfc\x34\xec\xfe\x6f\x35\x0e\x7a\x7a\xc7" + "\x0b\x0d\x1c\x07\x65\x6b\x04\x0e\xd6\x11\x0e\x3a\xc4\xfa\x9d\x72" + "\x19\x07\xbd\x63\x85\xf6\x50\x0c\x94\xdb\x7a\x31\xf0\x55\xdf\x58" + "\xa1\x07\xf5\xcd\xe7\x83\xe4\x71\x82\x32\x0f\xc4\xc7\x09\x38\x4e" + "\x2c\x3b\x2d\xeb\x9f\xcf\x09\x94\xeb\xeb\x7f\x00\xe3\x44\xcd\x1a" + "\x8d\x50\xfd\xff\x83\xef\xd3\xe9\x37\x2f\x70\xf8\xbb\xae\xcd\xd8" + "\x7c\x91\xfa\x57\xfa\x05\x17\xab\xff\x2f\x74\xf4\xbf\x45\x47\xff" + "\xdb\xdc\x42\xff\x37\xa6\x2a\xfd\x01\x65\x5e\x88\xf7\x07\xfa\xe9" + "\x7f\xcb\xf7\xa4\xff\x7f\xcc\xfd\x39\x97\x5e\xff\x5b\xc3\xea\x3f" + "\x80\x36\xb0\x5b\x0a\xee\xab\x90\x82\x0d\x78\x39\xf0\x6a\xc2\xb0" + "\x48\x0c\x6b\xa5\x34\x15\x72\x5c\xa0\x0c\xe8\xec\x24\x47\x9c\x21" + "\x8b\xe4\x4d\x34\x83\x14\x9a\xb8\x0d\x90\x82\x75\x13\x74\x12\x94" + "\x60\xb8\x23\x76\x43\xca\x20\xa4\x6f\x62\x65\xb3\x66\x60\xd8\x60" + "\xa2\x65\x1b\x8c\x7c\x0d\x79\x9c\x81\x9f\x9d\x29\xd3\x1b\xe8\xac" + "\x2c\x07\xd1\x22\x9d\x49\xa6\x13\xe7\x94\x4b\x12\xd4\xf6\x2f\x5b" + "\x94\x4c\x63\x0d\xda\xc1\xaa\x2e\x63\xac\x21\x85\xf3\x92\xe9\xa2" + "\x03\xf6\x4f\x32\x88\x36\xb0\xc1\x38\x4a\x4d\xc7\xee\x05\xe2\xab" + "\xd0\x5d\x26\xf3\x4b\xd4\xd4\x77\x24\x40\xec\x06\x2b\xe7\x17\xdb" + "\x29\x81\x5c\x3e\xc4\x44\xaa\x85\xd3\x1b\x8c\x63\x34\xf4\x83\x40" + "\x5d\x8f\x58\x36\xe8\x96\xc9\x32\x5d\x52\x50\x02\xbe\x46\x12\xc3" + "\x8d\x6a\x59\xcb\xb4\x43\x14\x39\xd2\x99\x4e\xea\xfa\x06\xb0\xfe" + "\xbb\x45\x19\xe3\x02\x3f\xb9\x39\x55\xae\xcb\x64\x75\xbe\x44\x87" + "\xe9\x26\xc8\x3a\x31\x63\x3d\x92\x7b\xf9\x95\x2f\x4e\x54\xe8\x10" + "\xb3\x57\xa1\x8e\x1c\xce\x1c\x00\xb9\xde\x43\x51\x37\x6d\x72\xdd" + "\x53\xb4\x72\x34\xb8\x14\x39\x22\x4d\x39\xd2\x0e\x43\x9a\x19\x0a" + "\xdf\x80\x9d\x9f\xa3\x25\xea\x6d\xf7\x5f\x4e\xb8\x68\xee\x00\xa8" + "\x11\xf5\xb9\x5c\xe6\x99\x2a\xea\x6c\x86\xdd\xbd\xba\x36\x52\x9c" + "\x43\xa6\x8b\xe7\xf5\x89\xce\xc8\x0d\x18\x8c\xb3\xfb\xd3\x9a\xd4" + "\xb4\x57\x08\xda\xd9\x31\x48\x9b\xde\x9f\xd6\xac\xa6\x1d\x2e\x68" + "\xe7\x26\x20\xed\xfc\xfe\xb4\xfe\x61\x2a\xda\x2b\x05\x6d\xfa\x18" + "\xa4\xcd\xe8\x4f\x6b\x55\xd3\x5a\x04\xed\x13\x85\x48\x9b\xd9\x9f" + "\x36\x45\x4d\x7b\x95\xa0\x7d\x38\x19\x69\xb3\xfa\xd3\x96\xa8\x69" + "\xaf\x16\xb4\xf3\x67\x23\x6d\x76\x28\x6d\x2d\xc7\x01\x8c\x94\x71" + "\xf0\x23\x41\xfb\x68\x26\xd2\xe6\xe8\xd4\x2d\x82\xf3\x15\xb4\x09" + "\x82\xf6\x81\x24\xa4\xcd\xd5\xd1\x85\x9a\xf6\x1a\x41\xfb\x6c\x09" + "\xd2\xe6\xe9\xe8\x42\x4d\x7b\xad\xa0\x5d\x98\x8e\xb4\x85\x3a\xba" + "\x50\xd3\x5e\x27\x68\xb3\x32\x90\xd6\xa6\x23\xdf\x3e\xda\xe8\xa7" + "\xb2\x90\xa6\x08\x65\xd2\xaa\x23\x5b\x35\xcf\x11\x82\x67\x76\x0e" + "\xd2\x97\xe8\xc8\x56\x4d\x3b\x52\xd0\x3e\x93\x87\xb4\x1b\xfb\xd3" + "\x82\x61\xb7\x90\xef\xad\xb2\x7c\xaf\x17\xf4\x39\x36\xa4\x2f\xd5" + "\x91\x2f\xc5\x3b\x64\x5b\x1b\x25\x68\x33\x8b\x90\xb6\x5c\x47\xbe" + "\x6a\xda\xd1\x82\x76\xcd\x28\xa4\xad\xd0\x91\xaf\x9a\xf6\x06\x41" + "\xbb\x7c\x3e\xd2\x56\xea\xc8\x57\x4d\x7b\xa3\xa0\xcd\x23\xec\x54" + "\xe9\x94\x77\xa4\x8a\x36\x51\xd0\xe6\xcf\x40\xda\x6a\x1d\x5d\xa8" + "\x69\x6f\x12\xb4\x45\xf1\x48\x5b\xa7\xa3\x0f\x35\xed\xcd\x82\xb6" + "\x90\xb0\x5e\xaf\xa3\x0f\x35\xed\x2d\x2c\x7a\xe5\x44\xd9\x2f\xee" + "\x09\xa5\x45\xdd\x0b\x9f\x68\x87\x31\x2c\xda\x36\x06\xef\x89\x8e" + "\xcf\x71\xf6\xf2\xb3\xfb\x6f\x23\x7f\x23\xfb\xb0\xb1\x2c\x3a\xb7" + "\x44\xe6\xb7\xaf\x5f\xde\x76\xa3\x9a\x76\x1c\x8b\x2e\x4f\x90\x69" + "\xf7\xf7\xa7\x35\xa9\x69\xc7\xb3\xe8\xe2\x4e\x99\xb6\xa1\x3f\xad" + "\xb9\x97\x96\x45\x6f\xa0\xbe\xcc\xbb\x35\xb2\x6f\x54\x95\xf3\x56" + "\x15\xbf\x09\x2c\xfa\x45\xbf\xcc\xcf\xd1\x9f\x9f\x55\x4d\x7b\x2b" + "\x8b\xde\xa2\x94\xb3\xb1\x3f\x6d\x8a\x9a\xf6\x36\x16\xfd\x13\xa3" + "\x4c\xdb\xd4\x9f\xb6\x44\x4d\x3b\x91\x45\x97\xc6\xc8\xb4\x07\xfb" + "\xc9\x9e\xec\xc0\x8e\x7d\x01\xe1\x93\x26\xb1\xe8\xb2\x78\x99\x56" + "\xd3\x0f\x50\xb5\xc3\xb7\x0b\xbd\xaf\x37\xa2\xde\x79\xff\x02\x7d" + "\x7e\x9b\x5e\x1f\x23\xef\x66\xb8\xec\xb8\x54\xd5\x24\xda\x24\xe5" + "\xbb\x57\xaf\xf0\x7d\x85\xc1\xea\xcc\xa4\x34\x0f\xf3\xab\xc3\xb6" + "\x4a\xac\x75\xbc\x07\xf8\x39\xa9\x2c\xf6\x95\x0c\x17\x86\xbb\xaf" + "\xc9\x4c\xf7\x96\x55\x1d\x72\x19\x46\xdb\xe8\x1c\x3f\xbc\x77\xb9" + "\x60\x29\xff\xe6\xc5\x56\x3b\xf3\xd1\xf9\x95\x81\x2d\x59\x6e\x67" + "\xb0\x13\xfb\x72\xcc\x87\x3c\x7c\xd8\x97\x8b\xb0\xe2\xb8\xb2\xd8" + "\xc6\xba\x9d\xb6\x4e\x38\x26\xed\x1c\xcd\x56\xe4\x24\x63\x19\xcc" + "\x98\x5f\xf6\x51\x7c\xe6\x65\xc0\x3e\x10\xb6\x95\x31\x8e\x7c\x3a" + "\x47\x74\xe7\x23\xee\xd8\x5d\x66\xf6\xe2\x82\x8e\xbc\xf5\x70\xdd" + "\x71\x69\x27\x6f\x43\xf8\x19\x83\xa7\x72\xee\x0e\xc6\x2e\x8e\xa1" + "\xb3\x07\x59\xd5\x2e\xb7\x38\x97\x70\x27\xff\xb6\x23\x96\xa1\x95" + "\x25\x64\x5a\x83\xdd\x1b\x4b\xe8\xbb\x6a\x8e\xf5\xc7\xe1\xa8\x2a" + "\xce\x7d\xd5\x2e\x7e\x66\x21\xd6\xc9\x1a\x28\xfd\xa0\x2a\x68\xfa" + "\xa0\x92\x95\x3a\x4b\x9d\xb9\x2e\x10\xdf\x7c\x79\x65\x28\x1b\xf2" + "\xb8\x33\x58\xfa\x41\x11\x86\xdb\x9c\x9e\x6e\x1e\x8e\x3c\x8e\x50" + "\xff\xb2\xcb\x74\x30\x9d\x95\x1e\x9c\xef\xb8\xba\x1b\xda\xa5\x9d" + "\xfc\xec\x3e\x0a\x67\x9b\x9c\xa5\x24\x9f\xe0\x26\xa7\x2d\xc2\x02" + "\xc6\xae\xa8\x83\x28\xa7\x9d\x7e\xe5\xdb\x23\x4a\x5e\xc4\xd7\x25" + "\xf3\x0a\xb3\xee\x23\x8e\x6d\x5e\x9c\xe8\x2d\xa3\x6f\x24\x55\xc4" + "\x0b\x19\xbf\x32\x03\xf9\x18\xe5\xfb\x74\x97\x01\x8e\xc8\xf7\x99" + "\x2e\xc3\x8f\xda\xe4\xfb\x1c\xe5\x4c\x47\xfd\x33\x26\xb3\xfc\x28" + "\xdb\xf8\xe0\xae\x0c\x13\xf5\x75\xa9\xff\xce\x62\xb3\xfc\xd6\x6b" + "\xe9\x7b\x7d\xbb\x00\xf3\x8c\x17\xe7\xfb\xbf\xf2\x01\xfe\xc6\xc9" + "\xbf\x6e\xf9\x97\x11\x0d\xc7\x4d\x42\x66\x1d\x2b\xaf\xec\x20\xd9" + "\xae\x0f\xb0\x20\x8b\x59\x3c\x19\xe5\x54\xe2\xb4\x75\x28\xf2\xfb" + "\x86\xf7\xfb\x49\x77\xa8\x5f\x16\xe5\x2c\xe1\x79\x6d\xde\x65\x56" + "\x97\x8b\x98\x25\x4d\xb8\xf5\xb6\x89\x93\x6e\xbf\x63\xf2\x9d\x8b" + "\x9f\x7a\x3a\x7b\xc9\x33\x3f\xce\x59\xfa\xec\x73\xb9\xcb\x96\xaf" + "\xc8\x7b\x3e\xbf\xa0\xf0\x85\x95\xab\x6c\xab\xd7\x10\x5d\x6f\x1d" + "\x76\xcd\x30\x78\x24\xc0\x7c\xee\xc5\x7c\x76\xf1\xef\x5e\x53\x98" + "\xd0\xff\xae\xf9\x46\xab\x7e\xdf\xda\x89\xbd\x5d\xfa\x86\x4c\xa7" + "\xb4\xeb\x37\xf4\x3d\x1b\xc4\x99\xc1\x59\x7d\xbf\x83\xbe\x31\xd6" + "\x2e\xed\xaa\x6f\x71\xdf\xef\xa0\x6f\xdc\x1d\xb0\x74\xc0\xa8\x91" + "\xf4\x1d\xb2\x5d\x15\x14\x5f\x7b\x03\x40\x23\xa6\xd5\xe3\x39\xd2" + "\x0c\x96\xed\xc3\x99\xbb\x72\x38\xeb\x24\xfe\x95\x3b\x58\x87\x7b" + "\x6d\x0e\x6c\xc1\x67\xc4\xba\xf9\x98\x54\xbd\xe4\x40\x02\xff\x56" + "\x53\x42\xcd\x0e\xd6\xbe\x71\x38\x6b\x7f\x71\x07\xeb\xac\x1d\xce" + "\x5c\xa3\x2a\x21\xc6\x5b\x56\x6d\x71\x49\xbb\xf2\xb8\xdd\x60\x7c" + "\x30\x7a\x97\x79\x2b\xc6\x8d\xf7\x43\x44\x2d\x3e\x63\x98\xe7\x80" + "\x55\x94\xfb\x9d\xd3\xbe\x48\xac\x9f\x9f\xf5\xe4\x1a\xb6\x60\x3e" + "\x42\x4f\xd5\x9b\x1a\xb1\x25\xc7\xfc\xdc\x4e\xdf\x51\x70\x49\xd5" + "\xa5\xb5\x67\x79\x7e\x71\xce\xaa\x4e\x20\x7e\xbf\xce\xf7\x45\x16" + "\x5c\xcd\xfc\x48\x9b\x13\x5c\x9b\x6b\x40\x9a\x19\xc8\xdb\xa3\xae" + "\x4f\xe2\x33\xcb\x0a\xad\xcb\x5f\xc8\xcd\xbd\x29\x1a\x12\xf9\xaf" + "\xe6\xfb\x78\x85\x74\xc6\xec\xf6\x1d\xac\x11\xeb\xe9\xc0\xfa\x36" + "\x35\x63\x0f\x1e\x31\x03\x58\xa7\x0a\xe4\xfb\x19\x86\xbf\x8b\xf7" + "\xef\x62\xd9\x9b\xc4\x37\xd5\x7e\x1d\xc5\xca\xaa\x2b\xb1\x9c\x4d" + "\xf4\x9d\x0d\x3a\x93\xb6\x6b\xd5\x7c\x03\xd6\xbb\x12\xe9\x9a\xac" + "\x57\xc3\xe8\x63\xd2\xee\x25\x58\x8e\x7a\xbc\x27\xfa\xa1\xa4\x47" + "\xa4\x6f\x14\xf5\x7a\xfb\x1c\x3d\xa3\xac\x1c\xbb\x87\xb3\x72\x6f" + "\xd9\xee\x14\x3a\x6b\x9b\x7f\x93\x08\x9f\x51\x2e\x4d\x48\x5b\xd1" + "\x55\x3c\xdf\x80\x63\x41\x43\x6d\x1f\x4f\x33\x95\x89\xca\x41\xe3" + "\xcb\x3f\x63\x0f\x2e\xd8\x93\x01\x63\x7d\x60\xf8\x73\x3b\x40\xf5" + "\x0e\x56\x87\x57\x35\x5e\x55\x1f\x62\xdc\x9f\xf0\x6a\xc2\xf0\x83" + "\xf8\xfb\x21\xfe\xfe\x09\x2f\x1c\x9f\x5a\xa8\xdc\x05\x45\xac\x63" + "\x7c\x15\x5c\x4f\xfc\x11\x5b\x8f\x1d\x95\xde\xce\xa2\xb2\xd3\x59" + "\xf6\x2c\x7a\x77\xc8\xf9\xdf\xb5\xa9\x80\xf1\xf8\x9b\x29\x7e\xd5" + "\x57\x6d\x3d\x5e\x8d\xe2\xbe\x2e\x06\xef\x27\xca\xf7\x56\xbc\xc6" + "\x5c\xf8\x0a\xe5\x17\xee\xaa\xab\xba\x78\xda\x8b\xba\x0e\x5d\x1c" + "\xdd\x2f\xd2\x41\xaa\xdf\x83\x97\x4b\x1b\x5e\xdf\x20\xc2\xde\xd8" + "\x28\x9e\xdf\xa8\x90\x7f\xdf\x05\xe9\x4d\x94\xd3\x9b\xc8\xff\x4d" + "\x9f\x08\x7b\xcb\x88\xbf\xb3\xf1\xca\x08\xc9\x9f\x78\x76\x92\x3e" + "\x7b\xe8\xfb\x6e\xa8\x4b\x97\xb4\xbb\x9e\x74\xb4\x55\x60\xcb\x10" + "\x64\x3c\xac\x0e\xb1\x55\xdd\x87\x9f\xda\x9f\x69\xf1\x53\x5b\x12" + "\x82\x9f\x0a\xf2\x47\x68\x0b\x9d\xb5\x02\x2f\xef\x76\xad\xcd\xc6" + "\xe7\xda\x8d\xc8\xe7\x5d\x9a\xf7\x40\x1e\x3e\xde\x5e\x1c\xc7\xb1" + "\x67\x0e\x18\xc9\xbf\x74\x4a\xb5\x1f\x11\x66\x29\x6f\x39\x5f\x51" + "\x16\x2c\x1f\x86\xd5\x51\xf9\x56\x20\x5f\x7c\xae\x47\xba\x3a\x27" + "\x9c\x56\xca\xc6\xd3\x94\x3d\x8b\x78\x94\xcb\x4b\x3c\x29\x1d\xeb" + "\xab\x57\x1d\xa5\x11\x79\xd7\x6d\xc2\x70\x1a\xab\xd2\x9e\xa6\x08" + "\x27\xb6\x20\x84\x49\xfa\x75\xfa\x93\xd0\x96\x52\x21\xe8\xcd\x80" + "\xf1\x16\xa0\x73\x79\xa3\x8e\x4a\x75\xb9\xe3\x8a\x20\x89\xf8\x91" + "\x5f\x77\x49\x75\x49\xb5\x64\x8b\x82\xd7\x06\xaa\x07\xf1\xff\x30" + "\x0f\x78\x3e\x35\x54\x1e\x8c\x57\xe5\x5b\x49\x63\xd1\xad\x6b\x44" + "\x5d\x31\xaf\x7a\x4c\xbf\x8f\xea\x4e\xf2\xc4\xf8\x06\xe4\xd3\x44" + "\x71\xfc\x7b\x40\xa2\x3e\xf5\xf4\xcd\x08\x92\x07\xd1\xd3\x37\x1b" + "\xc5\xd9\xdf\xd5\x27\xb8\xdc\x30\x3d\xe9\x83\x61\x1e\xc4\xa3\xd8" + "\xcf\xfc\x0c\xfd\xd1\x6b\x6b\x7c\xd8\xb7\xf8\xc5\x3d\x5a\xfd\xbc" + "\x6a\x55\xeb\x07\xd3\xed\xc3\xf4\x8d\x0c\xeb\x48\xfe\x04\xf3\x8c" + "\xa3\xef\xc4\x61\x58\x45\xb0\x0c\x79\xac\xf4\xf1\xb9\x1a\xe4\x33" + "\x01\xcb\x52\x41\x7c\xb0\x3c\x8d\x32\xaf\xdc\x3f\x16\x69\x75\x2d" + "\xf3\xab\x27\x9d\x73\x7b\x5e\xc3\xeb\x84\xbe\xeb\x17\x86\x1a\x11" + "\xd7\x80\x34\x0d\xac\x27\x15\xe8\x1b\x0c\xa2\x2d\xe1\x71\xfb\x8b" + "\xcf\x71\xfd\x36\x0a\xbf\xf6\x8b\x11\x05\xeb\x58\x87\xaa\xdc\x6d" + "\xca\x77\x2c\xe4\x72\xef\xa7\xfc\xd8\xaa\x4c\xde\xb6\x52\x1e\x94" + "\x5e\xf0\x7b\x75\x3f\xf1\x53\x64\x35\x0e\xcb\x21\xe4\x55\xd7\x81" + "\xe1\xf5\x84\x45\x2e\x37\xf4\xa3\x5d\xc5\x84\xc5\x57\x8f\x60\xfa" + "\x77\xb7\xd0\xf3\x2a\xfe\x9c\xc7\x7d\x6c\x5f\xfc\x28\x8a\x77\x62" + "\xef\x63\xeb\x73\x88\xa5\x20\xc0\xf5\xf1\x90\xe4\xb1\xf3\xba\xed" + "\xf5\xac\x9d\x61\x38\xe0\x07\xa0\x72\xa2\x8c\x1a\xbc\x65\xbf\xd8" + "\x88\x6d\x0d\xff\x56\x1f\xfa\xeb\xfd\xec\xb5\x0c\xa0\x32\xa3\x3f" + "\x93\xcb\xf7\x8b\x33\xb2\xee\xf7\x53\x1d\x49\x9e\xe3\x84\xef\xc3" + "\xb8\xfa\x9d\x54\xf6\xbe\x7a\xff\xa2\x55\x2d\x63\x5e\x6f\xd4\x03" + "\xe9\x8b\xf4\xa2\xe2\x49\xd8\xaf\x40\x5e\x7b\xc5\xb3\xc0\x06\xc9" + "\xba\x62\x38\x3b\x48\xf4\x7d\xb4\xf5\x51\x14\xb7\x1e\xf3\x1e\x9f" + "\x87\x6d\x3a\xda\x05\x7d\x8b\x04\xf9\xee\xa5\xef\x71\x22\x8f\x06" + "\x92\x29\xd2\x3d\x49\x78\xc4\xe7\x83\x22\xdd\x6b\x99\xd8\x9e\x8f" + "\xc1\x2b\xb9\xcf\xfe\xeb\xe7\x68\xf1\xf5\x5a\xa8\xfd\x93\xbe\x2b" + "\x82\xc5\xa9\xc0\xf1\x90\x0f\xd6\x93\xd2\x6b\x5f\xc9\x6d\x87\xac" + "\xeb\xfa\xa9\x07\xd0\x5e\x54\x3c\x1a\x43\x74\xdd\xc0\xf1\xb8\x6a" + "\xb6\x81\xea\x8c\x69\x1b\x64\x3e\xbc\xce\x1c\x4f\x76\x8e\x81\x83" + "\x6c\x15\xd6\xb3\x17\x07\xaf\x59\x65\x3d\x1f\x0c\x91\x89\xe2\xbb" + "\x72\xe9\x9b\x71\xe4\x93\xb0\x9f\x7b\xb7\xb7\xa7\xcf\x2f\x91\xee" + "\x83\x5c\xf7\xaf\x35\xd5\x8a\xf6\x56\xf6\x5b\xaf\x89\xf8\xe1\x1a" + "\x0c\x53\x59\x02\x1c\xbf\x54\x96\xe2\x4c\x2a\x4b\x03\x2f\x47\xb1" + "\x15\x4e\x4a\xf5\x85\x94\xbf\x4b\xaa\x07\xd9\x5e\x65\x5e\xbf\x38" + "\x44\xbc\x5e\x44\x5f\x45\x65\xc2\xbc\xb3\xb8\xff\xbb\x8f\xcb\xe4" + "\x23\xb9\xec\x4d\x3e\x3b\xa5\xad\x6d\x3a\x27\xf1\xb4\x4d\x78\x9f" + "\xec\x13\xdf\x95\x89\xc6\xf4\x7b\xe8\x2c\xff\x63\xd2\x1b\x13\xc9" + "\x47\xd3\x7b\x24\xbc\xbf\x86\xf6\x7c\xa2\x4f\x31\x22\x3f\x13\x61" + "\x54\xc1\x45\xa7\xf4\x46\x2c\x8d\x19\x50\xd6\x7b\xb1\x8f\xb4\x87" + "\xe4\x4d\x58\xc6\x3e\xd2\x44\x6f\xd9\x2f\x93\x15\xdc\x62\x3e\xd5" + "\x24\x7b\xa1\x9f\x5f\x6e\x40\x1c\x37\xf4\x61\xeb\x97\x1b\x64\x39" + "\xee\x41\x39\x9a\x30\x3f\x83\x5c\xaf\x3d\x48\x8f\x7d\xb1\x3d\xdf" + "\xc8\x65\xaf\x92\xe9\x77\x2b\x7a\x90\x6d\xf5\xe0\x16\xf2\xbf\x5c" + "\x07\xaf\x4f\x94\xd3\xd6\x8b\xbc\x5e\x9f\xa4\xd0\x52\x1f\x51\x7c" + "\x2f\xea\xf5\x49\xe4\x07\xc7\xa3\xee\xb9\xef\xe3\xdf\xaa\x15\x61" + "\x64\x3b\x22\x8f\x3d\x9f\x71\x1c\x62\xbf\xa7\x0f\x47\xaf\xc7\x84" + "\xf8\x27\xf2\xc5\x15\x2d\xc8\x83\xfc\x29\x61\x89\x7c\x2a\x8d\x59" + "\xb0\x8c\xed\xb2\xfd\xc8\x65\x7e\x7d\xb5\x16\x2b\x7b\xfe\x84\x58" + "\x19\xab\xe2\x9d\xa3\xd7\xce\xd5\x0a\x1f\x58\x2d\xd7\xed\xf7\x72" + "\xdd\xf6\xca\x75\xfb\xbd\x5c\xb7\x3d\x98\x07\xca\x6d\xcf\x3a\x95" + "\x1c\x51\x6e\xbf\xfa\x4a\xa6\x6f\x20\x5f\xde\x67\xaf\xbf\x1a\xad" + "\xd8\x72\x7f\x7f\xf1\xab\xc3\x64\x0f\x7d\xe5\xfa\x15\x84\xf8\x8b" + "\x06\x7d\x7f\xf1\x7a\xab\x5c\xdf\xba\x10\xdb\xa8\x97\xfb\xbb\x27" + "\x14\x3d\xb4\xe0\x98\x4c\x7c\x1b\xa9\xfa\x04\xf9\x4f\xca\x5b\xdd" + "\x06\xd5\x08\xb9\xca\xb6\xfc\xab\x0f\xfa\xeb\xe1\x57\x95\x6a\x7b" + "\x26\x5d\x93\x4f\x20\x1e\xa4\x53\xde\xaf\xc4\x30\xa1\xd7\x5f\xe5" + "\x92\x6f\x50\xfb\x68\xa4\xad\x0c\x32\xb2\x97\x5f\x55\x69\x6d\xf1" + "\x57\x46\xd9\x16\xe5\xbc\xf7\x2c\x45\x1d\x25\xf5\xe5\xbb\x27\x26" + "\x24\x5f\xd2\x4d\x23\xc9\x41\xd6\xe9\x23\x4a\x9b\x46\xf4\x98\xd6" + "\x86\x69\x52\x42\xda\xc7\x0a\x2a\x9f\x4b\x7a\xbd\x81\xfb\xac\x1d" + "\xdc\x57\xd8\xbc\xbc\x3c\x7b\x66\xd4\xca\xed\x04\x86\x25\xc9\x61" + "\x66\xb9\x2d\x51\x70\xf3\x1f\x21\x65\xaa\xd3\xef\x1f\xbd\xde\xa0" + "\xf4\x8f\x38\x2f\xee\x8b\xf6\xd4\xcb\xf5\xa3\xb0\xb1\x22\xec\xf5" + "\x5c\x0a\xdb\x22\xe4\x50\xc9\x78\x7b\xf5\xba\x59\x6e\xaf\xc8\xbe" + "\x24\x97\xf4\xcb\x12\xb2\x31\x7a\x46\x1e\x3e\xe2\xef\x2c\xe9\xa6" + "\x31\x44\x15\xc6\x25\x90\x3f\x20\x7f\x41\x6b\x53\xf9\xef\x5c\xfe" + "\x3b\x93\xfc\x0e\xf5\x43\x28\x1e\xe9\x62\xc8\x17\x61\xf8\xe3\xd6" + "\x07\xb0\x5f\xf0\xb5\x09\xf9\xbe\x91\x2c\xa7\x5d\xc6\xfb\x0a\x5f" + "\xa7\x46\x28\x61\x4a\x3a\xb4\xa3\x6b\x28\x1d\xa5\x57\xfc\x17\xf9" + "\x2e\x3f\xf9\x26\x91\xdf\x6f\x64\x8c\xf3\x71\x83\xd2\x2f\xea\x91" + "\x54\xb4\xf4\x4d\x19\xe1\xd3\xfc\xb2\x3f\x3b\x41\x69\xb9\xfe\xd0" + "\x57\xae\x3f\xc7\xbe\xac\xcd\x07\x63\xcd\x69\xf2\x8b\xd5\x9d\xa2" + "\x9c\x6f\xa6\x8a\x7a\xbc\x39\x94\xd7\x43\xf8\xd4\x0a\x51\x96\xea" + "\xce\x9a\x6e\x1e\x37\x96\xea\x42\x71\x5b\x55\x71\xac\x27\x91\xe2" + "\x66\xf1\x72\x85\xa4\x0b\xf6\xe4\xf4\xa3\xaf\x15\xdf\x04\x36\xd5" + "\xec\x50\x7c\xef\x9b\x4d\xa2\x9c\x6f\xbe\xa4\xf8\x5d\x94\x4b\x3c" + "\xf9\x5e\x1e\xf7\x8c\x4c\x33\x57\xfe\xe5\xfe\xfd\xcd\xff\x10\x72" + "\xb5\x48\xb2\xbc\x13\xe4\x7a\xfc\x89\x8f\xb3\xbf\xce\x40\xd9\xbe" + "\xb9\x57\x91\xad\xfa\x9e\xec\x07\xf3\x27\x9c\x09\xbf\x52\xc4\xc7" + "\xb0\xd5\x44\x43\x65\x12\x6d\xc4\x1b\xf5\xa1\x7d\x6a\x1c\xeb\xdd" + "\x43\xed\x92\xe8\xab\xbe\x3d\x42\x9e\x03\x02\x47\xfe\x2f\xb0\x5d" + "\x78\x2b\x57\xf1\x31\xcc\x9b\x8a\x63\xfe\xa3\x48\xf3\x16\xff\x1e" + "\x06\x7d\x27\x44\x4d\x43\xfe\xe9\x9d\x6e\x97\xcc\xf3\xad\x54\xc5" + "\x6f\x90\x2f\x69\xf1\x1c\x95\xfb\x74\x6f\xf9\x6a\x64\x5f\x72\x52" + "\x7a\xeb\x9c\xb6\x1f\xf6\xd6\x39\xad\xcf\x78\x3b\x36\xd4\x67\x60" + "\xbf\x79\xa3\xb7\xec\xad\x83\x9a\x7e\x00\x86\x9d\xdf\x77\xbc\x55" + "\x47\x36\x4a\xdf\x89\xe3\xfe\x89\xcf\x6b\xed\x5d\xac\x94\x99\xfc" + "\x66\xd7\x5a\x65\xfe\x62\x6f\x80\xfa\x6a\xda\xfc\xf6\x26\x6b\x7c" + "\x27\xe5\xa7\xf0\x33\x02\x7d\x67\x0c\xe5\x40\x73\x2e\x7b\x63\x64" + "\x3f\x5f\xa7\xf1\x95\x72\x1b\x46\x7e\x52\xdb\x56\x55\x9f\xd0\xb6" + "\x55\x7b\xbf\xea\xef\x23\xf7\x36\x5c\x7c\x5b\xb5\xb7\x82\xfc\x96" + "\xe2\x23\xb5\xbe\x60\x2f\x9f\x1f\xe8\xeb\xcb\xee\x9d\xa1\xf4\x65" + "\xfb\xfc\xe8\x5b\x87\xc8\x47\x61\xfe\x0d\x22\xef\xb7\x27\x62\xbb" + "\x3f\x59\xc9\x1b\xe3\x73\x5b\xb0\xe7\xc4\xca\xaa\xeb\xf0\xde\x22" + "\xf7\x01\xb9\x6d\x76\xf3\x6f\x12\xbd\x49\xdf\x70\x8a\x26\x9c\x39" + "\x96\x9f\x86\xf6\xbe\xb6\xa2\xb1\x6b\x85\x22\xdf\xb7\x3f\x50\xf7" + "\x0b\x77\xef\x60\xa5\x98\x4f\xb5\xba\x8e\x9b\x31\x6c\xab\x3c\x87" + "\xc0\x65\xcb\x79\xbd\x9d\x57\xbb\x43\x5b\x37\x51\x8f\xb7\xeb\xa9" + "\x1e\x34\x26\xc2\xfc\xb3\xa9\xdf\x83\x7d\x3e\xbc\xaf\xef\xa8\xed" + "\xc5\x7c\x6d\xf2\x39\xbb\xba\x7f\xb5\x7b\x06\xf9\x4a\x79\xec\xd9" + "\x84\xfd\x9d\x0a\xf5\x5c\xcc\x9c\xe9\xe9\xd6\xbc\xfc\xa5\xcb\x0b" + "\x9f\xb9\xd5\xba\x74\xf9\xd2\xc2\xa5\x8b\x73\x97\xae\x59\x5c\xb8" + "\x74\xc5\xf2\x31\xcb\x16\xff\x78\xe9\xd3\xd6\x55\x8b\x0b\xac\x49" + "\xb6\xd1\xb6\x68\xe8\x23\x9d\x62\x5d\x5c\x50\xf0\xc2\xb2\x25\xd9" + "\xd6\xe5\x4b\x9f\x1e\x9b\xbf\xa4\x60\x49\xa1\x75\x71\xfe\x8a\x17" + "\x96\x67\x5b\x47\x67\x8f\x1b\x9d\x74\x7b\x76\xb4\x7a\x0e\x6d\xa4" + "\x19\x3a\x83\x67\xbf\xea\xd8\x7a\x16\x4c\x71\x86\xbc\xfc\x38\xdb" + "\xd2\xe5\x62\xde\xee\x9d\xd8\xf1\x95\x90\x47\xdf\x89\xa7\x6f\x1e" + "\xb3\xb2\x5f\x5b\xf1\xd7\x48\x74\x58\x4f\xba\x37\x61\xd9\x13\xbc" + "\x65\xbf\x6e\x75\x49\xbf\x6d\xe0\xdf\x33\xc6\x70\xac\x5b\x02\x3b" + "\xfb\xa7\x0e\xec\xb3\xe5\xd1\x3b\xf3\xda\xb3\x10\x5f\xb1\x12\x8c" + "\x78\xc5\xe0\x65\xa6\xef\xc8\x7b\xcb\xde\x41\xff\xb3\x4f\xfe\x96" + "\xf9\x3b\xf5\xee\xa8\xe6\x0c\x56\xda\x9c\x21\xf4\xf2\xce\xab\xca" + "\x5c\x73\xda\x4b\x90\x46\xf8\x3c\x2a\xbd\xc3\xdf\x75\xbc\x88\x58" + "\xa6\x39\xdb\xae\x3f\xdc\x9b\x82\xfd\xc1\x23\x34\xe7\x8a\x71\xaf" + "\x7a\x24\x88\xc1\x72\x19\x0f\x14\x25\xc1\x76\xcc\xab\xc0\xc2\x18" + "\xe6\x91\xa3\xcc\xa7\x61\x1d\xcc\x58\x97\x36\xb9\x1e\x0f\xf2\x7a" + "\xec\x60\xa3\x2a\x87\x61\xf9\xb6\xf1\xf2\x54\x2a\x75\xc0\x72\xb7" + "\xb9\xa4\x5f\xfb\xb0\x9c\x66\x2a\x97\xde\x5c\x1f\xcd\x77\x61\x39" + "\x3f\x0b\xae\x44\xb9\x5d\x2b\xbe\x73\xb7\xb5\x46\xd8\x1f\xd6\x2b" + "\xbe\x16\xef\xb7\x9c\x86\x98\xcd\xf4\x8d\x72\xfb\x75\xac\xd9\xe3" + "\x07\x67\x4e\x1b\xc4\xad\x66\x6e\xf6\x3f\xbf\xea\x10\x75\xda\x67" + "\x22\xdf\xf0\xbb\x67\xdb\x8c\x54\x27\x6c\x2b\x62\x6a\x4f\x87\x9d" + "\x5b\x34\x6e\x1f\xce\x3c\x6c\x97\xba\xcf\xb5\xef\x79\x92\x09\xf5" + "\xb7\xba\xec\xf4\x5d\xeb\x7d\x19\x28\xcb\x7d\x72\xdf\xd8\xc3\x7a" + "\x32\x55\x7d\xa9\x7d\x84\x33\x4f\x18\xde\x26\x85\x37\x7d\xfb\x9c" + "\xd2\x08\xfd\xef\xfb\x0c\xd3\xb8\x55\xfc\x1b\x42\xf9\x13\x4f\xbc" + "\x77\x2b\xf9\x88\x71\xf8\x3e\xea\x13\xb8\x11\xcb\xee\x30\xf9\x8d" + "\xda\xb6\x83\x1d\x72\x62\xf8\xd6\x73\x40\xfd\x23\xb4\x75\xe2\xff" + "\x1b\x0b\xca\xbd\x88\xf8\xbf\x38\x1c\x60\x23\xd2\x74\x95\xbd\xb3" + "\xcf\xc3\xbf\x43\xfe\x1b\xb4\xff\xea\x7e\x73\xd9\x32\x9e\xa7\x84" + "\xe0\x39\x65\x1b\xf5\x09\x2b\x91\x3f\x62\x68\xeb\x19\x6c\x87\xf1" + "\x79\x5c\x25\x24\x52\x3e\x78\x4f\xfd\xca\x26\xe4\x59\xaa\xe4\xc7" + "\x10\xff\x5b\x82\x62\x0e\x46\xc6\xd6\x18\x9a\xbf\x2e\xb6\x31\x76" + "\x00\xfd\x3b\x95\x91\x30\x86\x69\xde\x55\x30\x85\x58\x3f\xc4\x71" + "\x15\x0f\x89\xac\xec\x37\x29\xb5\xc3\x90\x0e\x71\x55\x83\x78\x22" + "\x5c\x21\x6d\x87\x82\x29\xc4\x5a\x2b\xd1\x61\x19\xa2\xf7\xad\x49" + "\x31\x92\x8f\x6c\x97\x7e\xfb\x24\x61\x8c\xfd\xfc\xc1\x36\x76\xe5" + "\x82\x36\xa1\xa7\xdf\x3e\xe9\xf4\x09\x1d\xf4\xc9\xfd\xb7\x49\x2a" + "\xb9\xb7\x22\x8e\xa3\x49\xce\x62\xae\xfa\xb7\x4f\x62\xd9\x5a\x79" + "\x5f\x7c\x1d\xea\x80\xb7\x55\xbf\x4d\xa0\xf4\xb2\x0c\x0f\xf6\xc9" + "\xf0\xb7\x36\x3d\x19\x86\xc8\xce\x28\xbe\x75\xfe\xdb\x8d\x64\x2b" + "\x98\x66\xaf\xf2\xfd\x72\x3d\x5d\x62\x1e\x46\x63\x25\x98\x28\x8f" + "\xc6\x78\x4e\x7f\x44\x2f\x8f\x50\x1c\x37\xa2\x35\xd3\x5c\x38\xa5" + "\x1b\x15\x4f\x72\xfd\x5d\xbc\xae\x7e\x9f\xd6\x94\x8d\x5f\xac\xec" + "\x77\xd6\xed\xc3\x10\x37\xbc\x7c\xbf\x9b\x7d\xbe\xf2\x8d\xb2\x8a" + "\x76\xd1\x31\x92\xf0\xfc\xbb\x97\x9c\x55\x00\x14\x26\x3f\x17\x76" + "\x61\x5b\x13\x3a\x9f\x1f\xfe\xfd\xc2\xef\x3e\xd0\xbe\x5f\xf8\xdd" + "\xfe\x70\xef\x17\xb4\xf9\xee\x37\x50\xbe\xc1\xda\xf9\x06\x55\xde" + "\x9d\x41\x9d\xbc\x95\xf4\xe3\xea\xd4\xe3\x97\xfd\x0f\x51\x19\x5a" + "\xb0\x5d\x62\x3f\x9a\x6f\x60\xc8\xa7\x91\xb7\xd9\xfb\xd3\x45\x7f" + "\x85\xfa\x41\xfb\x93\x88\x26\xb4\x1e\xbd\x7f\xa6\xf8\x3f\xd2\xcf" + "\x39\xfe\x10\x79\x1f\xd0\xdb\x3c\xb8\xb6\x49\x89\x96\x34\xc4\xc0" + "\x74\x1e\xb0\xaf\x7c\x1d\xa7\x67\xf8\x27\x82\xe4\x67\x37\x7f\x30" + "\xf6\xd2\xf7\xc6\x7f\x87\xbf\x28\x51\x5e\xce\xcf\x07\x06\x39\xbf" + "\x0e\x15\xc5\x8c\xf3\xa4\x66\xa0\x24\xd1\xfb\x23\xaf\x59\x32\x3f" + "\x12\xc0\x6a\xe2\xc4\x8c\xf9\x45\x44\xef\x33\x53\x3f\x53\x88\xf6" + "\x19\xff\x22\x32\x55\x19\x5c\x17\x91\xcd\x97\x3b\x5d\x9f\xd2\x1b" + "\x24\xd5\x99\xd5\x59\x9a\xa1\x24\x92\xdf\xc4\xd1\x3f\x3e\xe4\x97" + "\x88\xf1\xd6\xc4\x5e\x82\xcb\x3d\x1b\x54\xe4\x7f\x16\xc5\x1f\x61" + "\x3b\x4f\x1d\x07\xfa\x77\xad\xea\xfe\x3a\xf1\x33\x62\xf2\x25\xe4" + "\x7f\xfe\x3f\x6b\x6b\x94\x72\xdb\x07\x8f\x11\x0e\x3d\xd2\x3e\xf9" + "\x8f\xb4\x2a\x41\x6a\x84\xf6\xc5\x8f\xae\xd6\x3e\xdf\x98\xa1\x7d" + "\xbe\x69\xcf\x25\x28\x39\xf0\x42\x16\xbb\x86\xa2\xce\x0a\x7b\x03" + "\xe3\x42\x4c\x26\xae\x22\xc4\x84\xfa\xfe\xe4\xd2\x44\x60\x79\xfc" + "\xaa\x60\xa3\x3e\xf5\xdf\xe7\xef\xea\x0d\xb2\x41\x5c\xe7\x36\xf7" + "\x8b\x9c\x16\x12\x46\xcf\x83\xac\x72\xd8\x84\x3f\xf6\xa3\xe7\x61" + "\x56\xd5\xb3\x21\x05\xff\xa9\x43\xfc\x1f\xbc\x14\x65\xfd\xe1\xef" + "\xdf\xf0\xcf\x40\xf6\xf1\xc3\xdf\xdf\xe9\x8f\x89\x56\x1c\x3d\x11" + "\xff\xa1\xff\x58\xaf\xa3\x64\x72\x04\x93\x03\x98\x7c\x73\x49\xda" + "\xf1\x1f\xfe\x7e\xf8\xfb\xe1\xef\x87\xbf\x1f\xfe\x7e\xf8\xfb\xe1" + "\xef\x5f\xe0\xcf\xc0\xc7\x11\x4c\xfe\x53\xee\x45\x1c\x0d\x81\x9e" + "\xa9\xe4\x61\x92\x01\xfa\x28\x70\xb8\x3d\x09\x0c\x26\x18\x64\xbc" + "\x74\xbd\x3c\x6b\x6f\x81\x2e\x32\x01\xed\xf3\x99\x80\xd7\x6d\x78" + "\xfd\x48\x15\x7e\xad\x3e\xf9\xf7\xf0\x67\x40\x81\x45\xe0\x38\x30" + "\x12\x06\xc1\x60\x30\x41\x14\x44\xc3\x65\x10\x03\xb1\x30\x04\xc7" + "\x97\x66\x18\x0a\xc3\xe0\x72\x88\x87\x2b\x60\x38\x5c\x09\x16\xb8" + "\x0a\xae\xc6\x92\x27\xc0\x35\xfa\x65\x2e\x81\x14\x0b\xfe\x83\xff" + "\xa7\x43\x0a\x7f\xce\xfa\x21\xfc\x7b\x0d\x77\xc8\xe1\xad\x72\xb8" + "\xeb\x87\xf0\xef\x35\xdc\xfa\xdf\xfc\x3b\xe2\xbf\xf5\xd7\x80\xae" + "\x59\x78\x67\x83\xae\x4f\x0c\x0d\x35\xc8\x7f\xbd\xcf\x70\x81\xf4" + "\xfd\xf8\x69\xd3\x87\xfe\xa5\xe0\x35\x51\xdc\x16\x03\x88\xf9\x5c" + "\xa6\xfe\xf3\x87\x4b\xa9\xfc\xad\x37\xe2\x65\xc6\x2b\x01\xaf\xeb" + "\xf0\xba\x05\xaf\x49\x0a\x1f\x41\x43\x53\xb2\x5f\xed\x03\xf8\x24" + "\x03\xe0\xd3\x0a\xfc\xf5\x00\x1c\x19\x83\x97\x03\x38\x2e\x3e\xcf" + "\x02\xf8\xb2\xae\x8f\xe7\xc9\x89\x7d\xa5\xeb\x1c\x25\xee\xad\x78" + "\xb9\xe9\x7c\x16\x4c\xe1\x57\x68\x1b\x66\xce\x4f\xb5\x4e\x18\x37" + "\x71\xdc\xc4\xc9\x4f\x59\xc7\xa6\x8f\xb5\xde\x9a\x94\x74\xe7\xf8" + "\x09\xb7\x8e\x9f\x30\xd9\x3a\x61\xd2\x94\x5b\x6f\x9f\x32\x69\xb2" + "\x75\xd9\xea\xfc\xa5\x13\x92\x7e\xbc\xc4\xfa\xcc\xd2\xfc\x65\xab" + "\x16\xe7\x2f\xb9\x50\x95\xbe\xcd\x1f\x15\xef\x9a\x20\x70\x0d\x68" + "\xa5\x7d\x1d\x48\xef\xd6\x81\xd4\x9c\x05\xbd\x31\x86\x0a\x79\xae" + "\x34\x51\xbe\xb4\x7f\x86\xa5\x9d\x60\x78\xe6\x10\x18\x9e\x8a\x01" + "\xc3\x82\x26\x30\xcc\x37\x81\x61\x53\x11\x18\x7e\x32\x1b\x0c\x1b" + "\x72\xc1\xb0\xd6\x0c\x86\x82\xc9\xfd\xc3\xb6\x1d\x11\x61\xef\x60" + "\xda\x37\xf1\xaa\xcf\x04\x43\x75\xaa\x08\xfb\xff\x92\xc1\xf0\x3f" + "\xfb\xe7\xf5\xdf\xfb\x77\xb1\xfd\x82\xf0\x7f\xd2\x37\xfb\x2f\x41" + "\x39\x7e\xf8\xfb\xe1\xef\x87\xbf\x1f\xfe\x7e\xf8\xfb\xe1\xef\x87" + "\xbf\xef\xf9\xef\xb4\x64\x84\xff\xc4\x1e\x91\xd7\x6e\xb2\xb8\x0c" + "\x3f\xca\xa6\x75\x22\x40\xfb\x9f\xc0\xc4\xcf\x3b\x91\x2f\xf5\x1a" + "\x93\x98\xe9\xbb\x01\x68\x0f\xe7\xf6\x1d\xcc\x4d\xfb\x33\x67\xfc" + "\x12\xa0\x11\x7b\x8a\xb4\x6e\x05\xf9\x64\xba\xe0\xf9\xd9\x62\x8d" + "\x12\xf3\x50\x3c\xad\x73\xc2\xf0\x42\x0c\x6f\x3c\xcf\xba\x17\xbe" + "\xc6\x8a\x78\xce\x18\xc1\xcb\x53\x1f\xc2\x87\x78\x34\xb8\x20\x3f" + "\xf9\x3c\x3c\x62\x94\x72\x79\x24\x30\x10\xbf\x2e\x3b\x58\x3c\x76" + "\xc7\x15\x98\xd6\x83\x75\x4a\x94\xd7\x08\x75\x32\x3b\x44\x34\xda" + "\xfc\xb4\x57\xd4\x70\x0c\xa2\x5f\xc5\x5f\x09\x7f\xc5\x3e\x38\x91" + "\x6e\x14\xf1\xc0\xb4\x06\xaf\x3d\x2a\xa9\x37\x2d\xf2\xe6\xfb\xbd" + "\x21\x7a\xa9\x47\x72\x48\x82\xd6\x1c\x25\xd3\x4a\x48\x9b\xa9\xd0" + "\x8a\x38\x69\x96\x1c\x77\x19\xc6\xd9\xb4\x71\xc6\x6d\x72\x5c\x0c" + "\xc6\x55\x86\x94\xcf\xe8\xec\xf6\xc3\x31\x88\xda\x8b\x65\xb1\xd2" + "\xde\x24\x4a\x23\xd3\x0f\x45\xfa\x46\x2d\x2f\x00\x39\x6e\x18\xc6" + "\xb9\xb4\x71\x7f\x48\x92\xe3\xae\xc4\x38\xbf\x36\xce\xa0\xa4\xb3" + "\x78\xed\xd1\x16\x9d\x7a\x52\xfe\x06\x91\x37\xd5\x21\x3a\x19\x69" + "\x4a\x88\x66\xbe\xb5\x04\x48\x57\x14\x77\xa0\xae\x37\x7f\xa2\xc9" + "\x52\xf8\xb8\x30\xbd\x4a\xa6\x28\xcb\xe8\x22\x25\xfd\x0c\x2b\xf1" + "\x00\x2e\x43\xe2\xe3\x82\xa8\x54\xe2\x43\xcf\x78\x9f\x40\xf5\x96" + "\xef\xad\x54\x3f\xed\xda\x1d\x1c\xfa\x40\x24\x0e\x6e\x06\xe1\x35" + "\xd8\xa4\x60\xa0\xc0\xc2\x82\xc5\x57\xd1\xfa\xac\x8f\x9b\x82\x76" + "\x06\x4e\x9b\x0f\xac\x57\x43\xf1\x51\xb8\xcc\x42\xeb\x7f\xb6\xac" + "\x01\x53\x71\x1e\xf3\xd1\x9e\xfa\x16\x77\x27\x14\xbb\x59\x07\x9d" + "\xa7\xb4\xfe\x0c\x98\xe8\x5c\xa4\xf5\xcf\x83\xa5\xb1\xe8\xaf\xba" + "\x6b\x8e\x82\x74\xfe\x71\x02\xa5\x6d\x87\x96\xea\x76\x28\xae\xd6" + "\xa6\x2d\xbe\x06\x2c\xcd\x74\x36\x93\x1d\xe2\xa8\x1c\x8d\x56\x3f" + "\xf8\xa3\x3f\x6e\x2a\xda\x09\xc6\xe2\x11\x38\x0a\xc9\x76\x28\x65" + "\x71\x51\x59\x36\x1e\x07\xd3\x6b\xcf\x20\x86\x8e\x53\x79\xbf\x68" + "\x7a\x67\x8d\x4f\x3a\x60\x99\x0d\x07\x2c\x47\xa0\xd1\x32\x15\x1a" + "\x6d\x33\x60\xcb\x71\x88\x39\xe0\x4b\x86\x46\xe3\x7d\x68\x63\x33" + "\xc0\xd9\x89\xf7\xd6\x00\xd2\x78\xf8\x7e\x8e\x63\x70\x59\x6b\xe5" + "\xb3\x60\x72\x09\x9e\x28\xdf\xcb\x8e\x28\x7b\x13\xe8\x59\xaf\x1e" + "\x05\x57\x81\x05\xcb\xd7\x81\x65\xb9\xf3\x28\xc4\x5c\x31\xca\x02" + "\x49\x58\xe6\xc1\xce\x2a\x3f\x18\x8b\x20\x2a\x8c\x6d\xc5\xf3\x7d" + "\xcd\x88\xcd\x9a\x1d\xac\x83\x30\xda\xb5\x36\x03\xed\x34\x66\x36" + "\xe6\xdd\x29\xaf\xf7\xeb\x2c\x7e\x15\x8c\x5d\xab\x32\x68\x9d\x73" + "\x3b\xc6\xe5\x28\x71\xb4\x5f\x9b\xf6\x61\x8f\x8f\xa7\x6f\xe3\xa5" + "\xc0\xfb\xdd\x1d\xb4\x96\xb0\x93\xd6\x77\x12\xbf\x38\x1b\x44\x60" + "\x7d\x22\xb1\x3c\x77\xd6\x62\xf8\xf5\x48\x87\xe9\xf7\xb8\x60\x3f" + "\xc7\x11\xbb\x72\x81\x27\x78\xe5\x82\x33\xc1\x9f\x2f\xe8\x62\x3f" + "\x5f\x70\x3a\xf0\xf3\x05\xdf\x14\xaf\x06\x53\xe0\xca\x05\xee\x96" + "\x3c\xae\x03\x73\x4b\xde\x09\x5a\x17\x68\x5a\x77\x02\xcc\x0b\x9f" + "\x47\xdd\xfb\x3f\x83\x75\x4b\xc1\x12\x8c\xfa\xbc\x84\xbe\xa1\xb7" + "\xb0\x08\x18\xde\x57\xe8\xd5\xaf\x2b\xda\x65\x12\x36\x64\xc2\x3a" + "\xc5\x5a\x5d\xd2\xff\x71\x50\xbe\xee\xa8\x0e\x13\x5e\x31\x78\x99" + "\xf1\x8a\x67\xd1\xae\x78\x94\x55\xf1\x90\x0d\x06\xa0\xfd\x08\xe3" + "\x83\x60\x38\x0e\xb1\xc9\xf4\xdd\x86\x30\x72\x4b\x08\x96\x9d\xb5" + "\xde\x58\x02\xeb\xbd\xde\x1c\xda\x17\xee\x26\xbf\x44\x7e\x0a\xf3" + "\x29\x75\x49\x1f\x73\x5d\xa1\x7f\xf3\xb0\xe8\xb3\x56\x0c\xef\xf0" + "\xac\xcd\x31\xb8\xd7\xe6\x48\x5d\xd1\x67\xaf\x47\x9a\xbd\x48\x33" + "\x59\x96\x61\x07\xf1\x42\x9b\x70\xc7\xfa\x21\x02\x79\xe6\xfd\xaf" + "\xb3\x6d\xc6\xdd\x3b\xd8\x11\xa4\x3b\xd4\xcb\x0b\x79\x23\x1f\x94" + "\x7f\x6c\x87\x12\x86\xb2\x6e\xdf\x8c\x74\x94\xde\xe9\x4b\x21\xff" + "\xed\x72\xe6\x76\xd0\x7a\xdc\x68\xd6\x23\xf2\x43\x1a\xda\xab\xe9" + "\x8e\xf5\xc1\x20\xaf\x1d\xd2\x89\x37\xa5\x73\x76\x76\x00\xa6\xbb" + "\x9e\x15\xe7\xa0\x7f\x83\xb9\x5e\x96\x63\xa0\xbd\xf9\x07\x30\xbd" + "\xc8\x7b\x48\xba\x52\x46\xca\x83\xef\xcd\xa7\x72\x22\x1e\x0e\xe4" + "\xfa\x20\xb6\x0a\x22\x30\xdd\x3c\xe2\x47\xbc\x10\x07\x2e\xac\xeb" + "\xf5\x07\x72\xdd\x10\x64\x1a\x9e\x2e\x99\x5f\x9d\x86\x1f\x86\x33" + "\xe4\x47\xf8\x6b\xc4\x34\xb1\x75\x9c\xdf\xc3\xff\x2b\x48\xfc\x7c" + "\x60\xb4\xf2\xf2\x3e\x4a\x3c\xf8\x59\x17\xc8\xd3\xb1\xf2\x5e\xe8" + "\x84\x38\x93\xbb\x38\x27\x82\xaf\x0b\xc4\xf4\xef\xac\xef\x88\x64" + "\x5d\x19\x11\x43\xf8\x9a\xc0\x7b\x81\xce\x63\xe8\x84\x21\x5f\xb1" + "\xae\x9c\x88\xd8\x4e\x30\x52\x99\x69\x5f\x10\x95\x53\xad\xcb\x87" + "\x67\x3e\x3a\x15\x1e\x9d\x31\x6b\xc6\x54\x98\x73\xcf\xf4\xa9\x90" + "\x74\xe7\xd8\xa4\xdb\xee\x98\x7c\x1b\xa4\x3f\xf6\xf0\x54\x48\x9f" + "\x3b\x15\xe6\xe1\x95\x3e\x6f\xe6\xc3\x33\x66\xce\x9b\x0a\x19\xf7" + "\xcd\xc2\xa7\xe9\x53\x27\x24\xdd\x3f\x36\x7d\xfa\xac\x99\xf0\xd0" + "\xfc\x5b\x93\x6e\xbd\x15\xee\x99\x39\x7b\x42\x52\x92\xfc\x3b\x21" + "\x89\x48\x9e\x98\x3c\x73\xde\xd8\xf4\xfc\x15\x85\x2b\xc6\xce\x9d" + "\x35\x1d\x66\xce\x9c\x9a\xae\x6d\x6b\x13\x03\x67\x03\x24\x63\x0f" + "\x3b\x95\x4a\x67\x30\x40\x0d\xea\x1e\xaf\x4e\xbe\xb7\x03\xcc\x1f" + "\xd5\x90\xce\xb8\x6f\x8d\xa3\xf6\xca\xe8\xb5\xc7\x1d\x41\xd9\xf1" + "\x73\x46\xe8\x1c\x84\x63\x30\x7c\x34\xc6\xdd\x24\xb7\x1d\x91\x18" + "\xef\xd7\xc6\x0f\x6d\xc5\xf8\xf1\xb4\x57\xc0\x89\x17\xca\xdb\x83" + "\x3e\x10\xe5\xea\x86\xae\xe2\x8c\x48\xbe\x57\x13\x75\x4d\x6b\x68" + "\xbd\x76\xf3\x64\x95\xad\xb7\xd3\x5a\x5b\xeb\x1a\x88\x38\x09\xe6" + "\xa1\x2d\x85\x29\xb4\x9f\x06\x9c\x85\x32\x8f\x33\xbd\x3c\xa2\xe5" + "\xfd\x9e\xae\x1a\x5a\xc7\x2c\xf8\x94\xa8\xfc\x82\x8b\xf8\x6c\xc1" + "\x38\x99\xd7\x23\x2d\xe8\x1f\xd0\x7f\xff\x25\x58\x9c\x08\x2c\xfa" + "\xe3\xd6\x60\x4f\x22\x6f\x13\x30\x5d\x83\x82\xe7\x2d\xb4\x46\x36" + "\x0f\xe9\x5e\x4b\x35\xd0\x1a\x53\xbe\xde\x14\xe2\xe8\xcc\x05\x4f" + "\xb0\xac\xc3\xc2\xf7\x42\xf3\xb0\xa1\x46\x16\x8d\xcf\x65\x1d\x57" + "\xb1\x62\xb1\x3f\x1a\xc3\x22\x29\x0c\x75\x1d\x41\x36\xc9\xf7\x7f" + "\x62\xde\x18\xbe\x1a\xcb\xd7\x16\xa0\xf4\xa7\x78\xfa\xc1\x18\xf6" + "\x38\xd2\x5e\x15\x8c\xee\xb8\x1a\xb1\x43\x61\xd8\x4f\x18\x3e\x03" + "\xf9\xfd\x88\xf6\xa6\xb3\x98\x49\x56\xbc\x4f\x70\xac\xe9\xe4\xe7" + "\xef\xb9\x30\x2e\x58\x8c\x3c\x7b\x7a\xf3\x4f\xa4\xb4\x98\x97\xd1" + "\xdb\x93\x83\x6d\xdc\x50\x7e\xf6\x5a\x80\xca\x73\xaa\x97\xc6\x42" + "\x79\x92\x5d\xa3\x2e\x26\xa2\x9e\xa2\xbc\xf6\xa1\xf5\x21\x7a\x7a" + "\x17\xf9\x5c\x85\x72\x6f\x43\x1e\xf1\xc1\x2e\xcc\x03\x9f\x91\xaf" + "\x24\xf3\x55\x78\x78\x04\x0e\x86\xb6\x87\xe0\x20\x0a\x79\x4f\xed" + "\x8b\x1f\x66\xd4\xc6\x5f\x71\x02\xe3\xef\x95\xe3\xd1\xbe\x86\x8d" + "\xd2\xc6\x0f\x4b\xc1\xf8\xfb\x30\x7f\x0f\xda\x4f\x84\x0b\xcc\x7b" + "\x6a\xa8\xff\xd7\x47\x3f\x3f\x84\x3e\x0f\xe9\x1f\xa0\x75\xf0\xe4" + "\xdb\x89\xbe\x56\xc6\x2a\xd2\x9b\x90\x7e\x63\x48\xfe\xcd\x48\x3f" + "\x4f\x55\xbe\x90\xfa\x5f\x9e\x8b\xf1\x19\x84\x2d\xfc\xcd\x46\x9a" + "\xc1\x64\xb3\xe4\x2f\x0e\xe4\x52\x7f\x71\xd8\xa1\x90\xfc\x89\xee" + "\xb9\xa0\x22\xa3\x2e\x92\x91\x79\x8f\xdc\x17\x39\x22\xca\x70\xb9" + "\x29\x24\x8f\x44\x4c\x53\x80\xf8\xb9\x4a\xc1\x86\x4e\x9a\xe4\x90" + "\x34\x99\x1c\x5b\x22\x1f\x59\xc7\x22\x8d\xec\x8b\xd4\x3c\xa8\x6e" + "\xd8\x3f\xba\xbc\x24\xa4\xee\x99\x98\xef\xda\xcd\xc2\xce\x2f\x43" + "\x4c\xdc\x8a\x61\x73\x90\xe7\x35\x84\x23\xc2\xba\xd3\xed\x43\x5f" + "\x99\x1a\x23\xda\xfc\xcb\xbf\x8c\x2b\x02\xba\x1f\x4b\xf7\xc4\x9b" + "\xf5\xcc\x96\x6d\xe0\xf2\x2f\xf1\x97\xc2\xf9\x99\x45\x64\x7b\xac" + "\xe7\xc1\xa0\xe0\x19\x1f\x89\x36\x2a\xe1\x73\x40\xce\x63\x26\xed" + "\x23\xc6\xf2\x5f\x8d\x7e\x18\x68\x2f\x34\x86\x4f\xc4\xf0\xa9\x72" + "\xfc\x24\xa2\xc7\xfb\x09\xf2\x3d\xe1\xf6\x6a\x19\xb7\x68\x07\x57" + "\x8c\xe5\x79\x73\x5b\x10\xe9\x83\x02\xf7\xd3\x31\xee\x2a\xfc\x9d" + "\x85\xbf\x91\xf8\xfb\x10\xe6\xfd\x25\x9d\xfd\x50\x1c\xc0\x7e\x87" + "\x78\x6e\xc6\xdf\x87\xf1\xf7\xf7\xf8\x3b\x0f\x7f\x7f\x49\x76\xeb" + "\x5e\x95\x03\x21\x98\xe9\x0c\x0a\x5b\x1d\x2c\x74\x18\x5f\x29\xdb" + "\x8f\xb0\xdf\x53\x7d\x61\x4c\x84\x49\x42\xe6\x72\x58\x4f\x2a\xc9" + "\x25\x1d\xf9\xe7\x51\xfe\xb2\xdd\x47\x0a\x3d\x09\x9a\xa0\x48\x67" + "\x14\xfa\x96\xc3\x04\x9d\x41\x9d\x27\xfe\xce\x58\xef\x61\x0c\x7f" + "\x93\xf8\xb9\x11\x70\xc5\x44\x94\x89\x11\x9f\x8d\x24\x27\x4e\xcf" + "\xf9\x5e\x5e\xa7\xd2\x37\xf6\xc7\xaf\xc8\x0b\xd1\x77\x3d\xea\x7b" + "\x33\xd7\x37\xca\x4e\x29\x33\x95\x1f\x31\x4d\x6d\xdb\x20\x05\x37" + "\x88\xef\xce\x3e\xdf\x7d\x45\x83\x96\x8f\x79\x0f\xa6\x29\xc7\xfc" + "\xf8\x99\x7e\x74\xfe\x4d\x44\x11\x61\xf4\x0a\xec\xff\x37\xf3\xf3" + "\x8e\x30\xfe\x5a\xe2\xe3\x29\xe6\xe7\xec\x78\x22\xf2\xc8\xb6\x86" + "\x83\x12\xcf\xe3\xa2\xce\xd6\x51\x59\x22\x72\x79\x5c\x82\x0b\xa1" + "\xa5\xc4\x81\xd8\xbf\xe5\x89\x28\xe4\x71\x93\xfb\xf8\x7e\xec\x96" + "\xf9\x46\x50\x7f\x83\xfa\x0d\xd8\x7e\x77\x20\x0d\x8e\x7f\x62\x33" + "\xc2\x9e\xa9\x54\xfa\xb1\x0b\x41\x23\xdd\x5c\x02\x91\x4e\xff\x21" + "\x48\xf3\xb3\xc0\xd8\x12\x88\x72\xfa\xf7\xc2\x4d\x00\x43\x9d\xfe" + "\x23\x70\x33\xc0\x08\xa7\xbf\x12\xdb\xe7\x7a\x8a\x7f\x3f\x11\x0c" + "\x06\xfc\x2d\xbe\xa1\x44\x32\x38\xfd\x1b\x61\x54\x89\x11\x7f\x73" + "\xe1\xbe\x48\xe6\x75\xfa\x67\x23\x5d\x36\xa4\x05\xd8\xa9\x19\x91" + "\xec\x8b\x45\x01\x30\xcf\x7e\x89\x15\x3b\xfd\xd8\x57\xf6\x1f\xc4" + "\xf0\x20\x4b\x0b\x9c\xc3\xcb\xcb\x82\xa5\x1f\xbb\xd3\x02\xa7\xd8" + "\xf4\x97\xde\xc7\xe7\x2f\x18\x93\x80\x39\xfd\xc9\xd0\xe2\xf1\x20" + "\x5d\x31\x63\x9b\x3e\x76\x2d\x3c\x23\x41\x0f\x9d\x77\xb4\xe9\x63" + "\x37\x2b\x6b\x83\x1e\xac\x1f\xb6\x41\xac\x67\x2d\xfe\x96\x7d\x1c" + "\xe4\xcf\xa5\x6d\x66\x66\x6a\x83\x71\x38\xf0\xa0\x3a\x38\xfd\xed" + "\xb0\x08\xbb\xce\x69\xab\xdd\x8c\xca\x3f\x64\x03\x8d\x3b\x92\xe9" + "\xac\x84\xb8\xb4\xd5\xc5\x0c\xe3\x4c\x2c\xaa\x0d\xe9\x3a\x81\x6d" + "\xc2\xb4\xd1\x6d\xb1\x9c\x5f\x69\x5b\x12\xd2\xba\x89\x4e\xcd\x87" + "\x78\x10\x6d\x5a\x00\xe2\x90\x3e\xa9\x27\xaa\xcd\x8a\x57\x0a\x5e" + "\x79\x98\xd6\xce\xec\xf1\x7f\xa4\xfd\xae\x98\xbe\x02\x9f\xeb\xbc" + "\x74\x36\x13\xc9\x32\x00\x83\x91\xbe\x02\xf1\x33\x03\x71\x88\xe5" + "\x6d\x73\xf0\xf2\x96\xb5\xbd\xef\xe5\xf5\x68\xfb\x83\xa8\x47\xdb" + "\x7b\x14\xde\x85\x98\xc2\x7b\x57\x97\x88\xfb\x02\xd3\xcd\xe7\xe9" + "\x4a\xdb\x5c\x58\x3f\xb7\x0f\xed\x0b\xe5\x5a\x42\x72\x44\xb9\x96" + "\x90\x2c\x91\xbf\xcb\x69\x2b\x07\xac\x8f\xbb\x27\xea\x30\x62\xf6" + "\xf0\xb0\x1e\xde\x4e\x1f\xb6\x7a\x39\xef\xc3\xd7\x21\x9f\x4c\xc4" + "\x6f\x04\x33\x1d\xb6\xb2\xd2\xc3\x49\x3d\x76\x2b\xa4\xad\x66\xbe" + "\x34\xff\x06\xff\xa2\xd5\x10\x31\x06\x4a\xb0\xbc\xef\xa1\x8c\xb2" + "\xb1\x9e\x8d\xf8\x3b\x03\xe3\xe1\x72\xcc\xeb\x7d\x16\x75\xd8\x4a" + "\xf9\xb1\x4d\x87\x93\x90\xe7\x58\xe4\x95\x4d\x65\x3a\x67\x07\x94" + "\xdb\xe1\x94\x73\xbc\x7c\x87\xb3\x82\xa5\x87\x4b\x82\xa6\xc3\x79" + "\x0a\x86\x08\x3f\x42\x6e\x95\x30\xd7\xc3\xfc\x4e\xff\x6e\x40\x8c" + "\x99\x5b\x3c\x47\x28\x1e\xc7\x06\x7b\x51\xcf\x84\xa9\x8d\xf8\x5b" + "\x0f\x84\x9f\x96\xbc\x17\x88\xf6\x7d\xc2\xd0\xdc\x3c\xcf\x86\xb1" + "\x90\x67\xc0\xe7\xe2\x45\x7e\x13\x2c\xcc\x33\x96\x04\x4a\x0f\xa7" + "\xb7\xe4\x91\x5e\x0e\x61\x1a\x4a\x97\x0b\x71\x06\xec\x1f\x1b\x98" + "\x3f\xce\xe6\x36\xc6\xe6\x14\xb3\x16\xcf\x6c\xa4\xcd\x03\xaa\x0f" + "\xe1\x88\xe8\xe7\x74\x32\x57\xc0\xf4\x09\xaf\x1b\x1b\x52\x02\xcd" + "\x9d\x93\x80\xc6\x28\xcd\x9d\xf5\x84\xd3\x20\xca\xa5\x15\x31\xda" + "\x33\xa7\xb3\x24\x72\xe1\x19\x30\x60\x58\xa0\x39\x67\x2f\xc6\x37" + "\x22\xdd\x41\x8e\xdb\xb9\x67\xfc\x71\x7e\xd3\xe1\x14\x7f\xe9\x61" + "\xd7\xdc\x33\x3d\xac\x39\xa7\x12\x9e\xec\x2c\x41\x59\xed\x85\x39" + "\x27\xfc\x11\x2d\x79\xd9\x48\xe3\xc5\xf0\x7a\x8e\xff\x39\x27\xba" + "\xd8\xdc\xe7\xd9\xa9\xb9\x67\xbe\x60\x73\x72\xd8\xfb\x8b\x6c\x30" + "\xe4\xb2\x0d\x2c\x48\x76\x71\xb0\x7d\x2f\x5c\x76\x84\xce\xc2\x99" + "\x01\xb3\x17\x07\xd9\x9c\x13\xa7\xd8\xc2\xe7\x49\x36\xc9\xd0\x9c" + "\x83\xf6\x63\xab\x24\x79\x67\x35\xe7\xbc\x8b\xf9\xcf\x40\xbe\xc5" + "\xcc\x69\xdb\x8d\xb4\x8e\xb8\x27\x4f\x98\xe1\x60\x7b\x25\xf8\xa3" + "\x0e\xa7\x04\x36\x1d\x4e\x0f\x46\x1d\xce\x0b\x6e\x3a\x5c\x82\x7a" + "\x6a\xf5\x6f\x3a\xec\x0a\x44\x7d\x82\x18\xf8\x24\x1d\xf5\x14\x45" + "\x3a\xef\xc6\x31\x3b\x3e\xcf\xed\x26\xfd\x97\x7e\x92\xc5\x4c\x9f" + "\x94\xa0\x6f\x64\x02\xfb\x9f\x64\xd1\xb8\x9b\x45\x7d\x52\xd2\x13" + "\xf5\x49\x1e\xd2\x95\x08\xfb\xfa\xa4\x82\x70\xc9\xdb\xa6\xb2\x4f" + "\xb6\x62\x5b\x12\x81\xf1\x75\x78\xed\xc3\xcb\xc1\xca\x3e\xc5\xb1" + "\x20\x0c\xe5\x98\x2a\xfd\xd4\xcc\xee\xae\xc0\x7e\xe6\x19\xc2\x64" + "\x31\x8b\xfa\x34\x29\x2d\x30\xb9\x18\xe5\x88\xb6\xf2\xa9\x39\xb8" + "\xe9\x53\x2b\x8b\xfe\x34\xdd\xc7\xf1\xff\x69\x1a\xf1\xef\x59\x9b" + "\x48\x63\x72\x23\xc6\x67\x61\xd8\x5f\xbc\x84\x57\xd3\xa7\xad\x41" + "\xd3\x91\x24\xe4\xe7\x7a\xf0\x25\xe6\x0e\x94\x1e\x81\x60\xe9\xa7" + "\x6e\xff\x20\xec\xc3\xda\xde\x05\xf2\x51\xfe\x3f\x30\x94\xc3\x07" + "\x28\x93\x7a\x8e\x01\xa7\x0d\xed\x60\xf5\xd5\x25\xcd\x9d\x88\x87" + "\xbc\xb7\xb9\x7f\x6a\xf1\x1c\xe2\x72\xc5\x72\xb4\x12\xae\x48\xc7" + "\x0b\xf3\xa0\x04\xf3\x72\x61\x59\xdc\x81\x4d\xc8\x37\x0a\xf3\x89" + "\xfe\x3c\xdf\xc7\x6d\xf6\x73\xc4\xec\xbb\xfc\x7b\xeb\x02\xe7\x9f" + "\xe7\x85\xf3\x93\xe4\xaf\xc8\x47\xa5\xf9\x7d\x84\x9b\xbf\x91\x6f" + "\x13\xbe\x0a\x16\x29\xbe\x8a\xfc\x14\x8d\x0b\xc8\x57\x05\x65\x5f" + "\x15\x94\x7d\x15\x7f\x36\xa1\xbf\x29\x6d\xe3\x3e\x29\xcd\x26\x7c" + "\x4d\x5a\x20\x89\x21\x3e\x62\xd0\x96\x41\xe8\x03\x69\xca\xda\x62" + "\x39\x3d\x97\x53\x5b\x52\x10\x7d\x0e\x5e\x29\x41\xe1\x73\x4a\x64" + "\x9f\x23\x29\x3e\x27\x60\xa7\xb3\xac\x09\x5f\xfd\x7d\x4e\x50\xf6" + "\x39\x01\x26\x7c\x4e\x50\xf6\x39\x14\x1e\x90\x7d\x4e\x40\xc7\xe7" + "\x04\x4b\xdb\xa8\xbe\x11\xb2\xaf\x29\x21\x5f\x43\xf5\x0d\x6e\x6a" + "\x73\x07\x85\xaf\x31\xe3\x98\x40\x22\x5f\x13\xc0\x34\x41\xc5\xd7" + "\x78\xb9\x4f\x48\x22\x7f\xd3\xf3\x13\x40\x1f\x6a\x05\xf2\x33\xdc" + "\xa7\xf8\x47\xf8\xc9\xa7\xa0\xfc\xa6\x85\xfa\x14\xe4\x97\x82\xf7" + "\x66\xd9\x57\xe5\xc5\x6d\x60\x7e\xf4\x29\xe9\x69\x36\x0f\xca\xe5" + "\x33\x1c\x1b\xa3\xef\xb6\x15\x96\x38\x6d\x7e\x40\x5f\x50\xc2\x5a" + "\x4a\x10\x23\x87\x11\xc3\x01\xf4\x17\x00\x68\x9b\xad\x7e\xb4\x73" + "\xcc\xdb\xd5\x92\xf7\x11\x04\xd0\x5e\xe7\x74\x76\x39\x17\x7a\x12" + "\xcd\x73\x4e\x30\x37\xca\xc7\xb5\x30\xaf\x04\x7d\x4c\xa2\xbb\xb9" + "\xf3\x3d\x98\xdd\xce\x82\xb3\xb3\x5c\x56\x2c\x87\x6b\xce\x52\x47" + "\x1c\x9d\xa7\x3d\xf7\x0c\x73\xa0\x6f\xfc\xdf\x73\x4e\x98\xe3\x32" + "\xdb\xe1\xda\xd9\x8b\x59\x30\x80\xb6\x86\xf5\x4d\x47\x3b\xcb\xc2" + "\xb2\xe7\xa1\xdd\x95\xa0\xad\xb5\xfa\x43\x6c\x0d\xed\x66\x2e\xde" + "\x5b\x85\xfc\x3e\x29\x41\x5b\xcb\x0a\xf2\x36\xad\x9d\x8f\xc5\xd0" + "\xde\x4a\x68\xae\x0a\xed\x2d\x2b\xb8\x49\xd8\x5b\x50\xa4\xab\x08" + "\x92\xfc\x24\xd9\xde\x50\x17\x18\x5f\x87\xd7\x3e\xbc\xf4\xed\x2d" + "\x2f\xc4\xde\x9e\x97\xed\x2d\x4a\xd8\x1b\xea\x35\x22\xb0\x56\xd8" + "\x1c\xe5\x41\x63\xb6\x5e\x9b\x8b\xfe\xb4\x95\xce\xf6\x11\xf8\x21" + "\xbb\xfb\x14\xdb\x97\x23\x28\xd3\x4f\xdd\xc1\xd2\x23\xc8\x8f\xb9" + "\xc9\x7f\x22\x3e\x3f\xa7\x36\x6f\x6e\x1e\xfb\x7c\x51\xe0\x6a\xf4" + "\x31\x47\x00\x7d\xda\x17\xe8\x4f\x3f\x5f\xe8\x81\x3a\xe4\xd5\x8a" + "\xf9\xb9\x02\x68\x57\xc1\x4d\xdc\xa6\xf2\x02\x6b\x89\xe7\xe7\x79" + "\xbd\x3c\x78\x9b\xa9\xb5\x29\x31\xd3\xad\x3f\x5f\xe8\xb5\x5f\x17" + "\xe3\x82\x23\xe2\x3c\x48\xfb\x75\x16\x17\x7c\xb6\x57\xbe\x1f\xe5" + "\x82\x3f\xf0\x70\xb2\xc5\xbc\xf5\x70\xc5\x71\xb8\xae\x0d\x71\x0f" + "\x78\x1f\x83\xf7\x47\xd2\x6e\x7a\x9f\x05\xcb\x47\x66\x60\xde\x5e" + "\xb2\x47\x66\x9f\x88\xe3\x10\x48\x41\x3c\x9a\x98\x97\xce\x60\xff" + "\x7a\x24\x9d\xc1\x4e\x67\xae\xe3\xf3\x10\x94\xc1\x28\xfc\x1d\xb6" + "\xfb\x2c\xc4\xe3\x65\xd9\x2d\x9f\xf7\x8e\xf7\x49\x6c\x95\x25\x7a" + "\xcb\x4a\x18\x13\xe7\x11\x67\xad\xd3\xd9\xf0\x71\x7e\x88\xa7\x7b" + "\x66\xff\x4f\x7f\xed\x59\xf9\xbc\xf5\x58\xcc\x8f\xce\x5b\x2f\x48" + "\x84\xda\x7c\x7e\xf6\xa5\xa5\xd6\xce\xf6\x05\xbc\x24\x87\x8f\x5d" + "\x4a\x59\xa8\x6c\x58\xce\x6b\xb0\x9c\x9d\x8f\xac\x4e\x81\x0f\x6c" + "\xfa\xfb\x28\xbd\x76\x6b\x6f\xfd\xc3\xc4\x8f\x51\x64\x12\x26\x7e" + "\xb6\x22\xa7\x70\xfb\x59\xa9\xbd\x0e\xac\x64\x9d\x74\x06\x07\xed" + "\xbb\x2d\xf6\xb3\xff\x8b\x72\x2c\x59\x1f\x00\x53\x9a\xcd\xc7\x9c" + "\x9d\xcc\xe1\xb4\x9d\x80\x5a\x3a\x17\xa4\x88\x05\x83\x51\x5f\x23" + "\x6e\xbe\x86\xae\x95\xcc\x4f\x73\x1f\x98\xc7\x3e\x17\x4c\xdf\x23" + "\x74\x71\x38\x8b\x8f\x01\x4d\x5f\x13\xaf\xa1\xc4\xab\x19\xd3\x07" + "\x36\x7d\x4d\x65\xc1\xb1\xf1\x71\x0f\xa7\x33\x1d\xce\xca\x5b\x03" + "\x3f\x3a\x0e\x23\xf8\xb9\xac\xac\xf4\x6b\x0b\xf9\x05\x0c\x33\x63" + "\x58\x02\xf2\x4f\xf0\xda\x47\x98\x5c\xf0\x7f\xfc\xa2\xaf\x3b\x22" + "\x41\xa1\x73\x81\x95\x76\x6c\x6a\xe6\x4e\xe5\xd5\x12\x25\x9a\x7d" + "\x5d\x06\xd0\xee\x52\xa3\x9c\x52\xf4\xa3\xfb\xfc\xfa\x61\x17\x9d" + "\xa7\x59\xbc\x0e\x12\x50\x3f\x54\xbe\x97\x8b\x6d\xec\x18\xb3\x8f" + "\x48\x7c\x6d\x8d\x0f\xc7\x10\x23\xaa\x5d\xf0\xeb\xc2\x70\xf2\x0c" + "\x9e\x65\xed\xc8\xa3\x64\x2b\x8e\x03\x49\x3e\x24\x4f\xb4\x9b\x20" + "\xca\xe1\x4b\xf2\x4b\xb5\x2b\x69\x2c\x3c\xc2\xa5\xc8\x2b\xbc\x4e" + "\xbe\x8e\x17\xe3\xc5\x91\x29\xcc\xce\xc0\x71\x2d\xbd\x6b\x18\x79" + "\x8f\x90\xc1\x27\x79\x5d\xe8\x4b\x68\x2e\x95\xce\xbe\x2c\xb0\x30" + "\x9f\xd7\x3e\x72\xa2\x0b\x6e\x6e\x95\xe7\x6c\x3c\x4e\xff\x4c\xf2" + "\x2f\xba\x6d\x17\xdf\x83\xdc\xcb\xff\xfa\xac\x96\x04\xfa\x46\x26" + "\xf9\xa7\xb3\xed\xeb\x85\xfe\x7d\xc4\x97\xf6\xd0\xb7\x63\x7c\x81" + "\x87\x75\xb0\xd2\xb3\x6d\x34\xce\xa0\xfd\xbc\x18\xb6\x18\x71\xcd" + "\x1c\xf9\x54\xa6\xeb\x17\x3b\xae\xed\x86\x63\x38\x1e\xa4\x3d\xf3" + "\x62\xfe\xe6\xfa\xd9\x07\x0a\x41\x9e\x13\x1a\x79\xd0\x05\x63\x73" + "\x95\x72\x51\x5f\x03\x65\x6b\xa2\xbe\x07\xf5\x39\x68\x7e\xbe\xa0" + "\x88\xf9\xa8\xef\x81\xb4\x3e\xa5\x0e\x54\x3f\x51\xaf\xeb\x63\xd4" + "\xf5\xc2\x32\xb8\x71\x6c\xcd\x65\x50\xb0\x1a\x4c\xfc\x2c\xbe\x00" + "\xcd\xef\xcf\xe4\x75\xa1\x3a\xf3\xba\x70\x3f\x8b\xed\x84\x7f\x12" + "\x8e\xa5\x78\x78\x09\xf2\xca\x70\xc1\x2d\x6d\x02\x4f\x23\xc3\x7e" + "\xbf\x06\xb1\x99\x54\x7c\x0e\xae\x2d\x0e\xb2\xa3\xc8\xf3\xaf\x28" + "\xa7\x08\xfa\x0d\x52\x7f\xdb\x47\xd8\x75\xfb\xa9\x5d\x76\x16\x9d" + "\x41\xdf\xcd\x69\x2f\x47\xda\x76\xa4\xf9\x48\xa6\xfd\x48\xbc\x9b" + "\xe1\xbf\x83\xe9\x17\xdb\xb2\xb1\x58\x8e\x4e\x37\x6f\xf3\xcf\xd6" + "\x29\xcf\x0c\x9f\xf1\xb7\x9e\x6d\x72\xeb\x8f\xc7\xb0\x0f\x44\x6d" + "\x5a\xe0\x2c\xeb\xc4\x7c\xae\x24\x1c\x15\xaf\x86\xab\x10\x93\x5f" + "\xae\x5f\x07\x57\x10\xc6\x58\xd4\xd7\x56\x21\xf7\x51\x93\x99\x1d" + "\xfb\xa0\xe8\x51\xf3\x56\xc2\x8f\xd0\x86\x2c\xc7\x61\xd4\x9c\x45" + "\x45\x56\x2c\x2b\xc0\xd6\x93\x40\xfd\x94\x2f\x90\x3e\xc1\xe9\xff" + "\x2b\x7d\x63\x13\xb1\x38\x2a\x57\xc1\x22\xde\xdb\xce\xe7\x2b\x50" + "\xae\xfb\xc4\xbc\xc2\xa8\xbf\xd2\x5c\xfc\x51\x18\xd5\x4a\xf5\xc5" + "\xcb\x80\x61\x7f\x64\x67\x59\x02\x13\xed\x5a\x9d\x0b\x46\xf9\xf1" + "\x77\x1f\xbf\xd0\x97\xc8\xcf\x75\x48\xb7\x8f\x9d\x0d\x10\x0d\xfa" + "\x8c\x51\x4d\xcc\x6e\x20\x3b\xa9\xc6\xbc\x3d\x2e\xb8\xcf\x21\x74" + "\x33\xca\x41\xbc\xc2\x94\xa1\x8e\xf1\xfd\xec\xa7\xb1\xbe\xa3\x9f" + "\xb4\xae\x37\x60\x39\x46\x4f\xe0\x76\x81\xbc\x6a\x25\xe1\xb3\x83" + "\x58\xd6\x1a\x7b\x30\x07\xfd\x73\x4e\xb0\xac\x4b\xdc\xcb\x71\x4c" + "\x6e\x4b\xf5\xf9\x9f\x6d\xe7\xe7\x20\xc3\xe8\x06\xc1\xe7\x6c\x9b" + "\xe3\xea\xe3\xf4\xcc\xcf\x15\xf3\x98\x3c\xfb\x9c\x55\x29\xe2\x0c" + "\x66\xa4\x11\xe3\xfc\xd1\xbf\xef\xc2\x3c\xbc\xf6\xd1\x0d\x2e\x18" + "\xb7\x47\xbc\x97\xf0\xe8\xf2\xa7\xf3\x16\xc8\x76\xc8\xe6\x84\x4d" + "\xdf\xb8\xb9\xb9\x8e\xdb\x5f\x05\x62\x7e\x9f\xec\x7f\x69\x0e\x26" + "\xe6\x28\xdc\x58\xde\x6c\xe1\xf8\x96\x98\x74\x83\x45\x73\x46\x2b" + "\xc6\xf5\xbf\x6e\x98\x8d\x57\x26\x5e\x39\xf2\x33\x52\xdf\x50\x8a" + "\x57\x1b\x3e\x17\x71\xd9\xed\xca\x36\xb8\x30\xae\x0b\xfb\xee\xf4" + "\xec\x82\x1b\xe6\xb3\x5d\xa3\x24\xe5\xbe\x76\x27\xcd\x23\xdc\x80" + "\xfa\x1a\x6d\x12\xba\xb8\x91\x9f\x3f\x8f\x65\x23\xb9\xb3\xe2\x2a" + "\xe6\x6b\x5c\xef\xc1\x72\xdf\xb0\xaf\xb1\xca\x03\xd6\x1b\xa8\xfe" + "\x37\xec\xa7\x3a\x79\x50\xfe\xf4\x5b\x50\xc5\xdc\x07\xaa\xfd\x40" + "\xef\xb0\x90\x17\xda\xff\xff\x28\x17\x73\x12\x5e\x33\xf1\x93\x31" + "\xc1\x94\xfa\x0b\x39\x7b\xf6\x59\x57\x1a\xe8\xf9\xaa\x1a\x31\xef" + "\x52\xde\x37\x1f\x7c\xe3\x50\xb4\xf3\x69\x74\x86\xf3\x49\xb8\xf1" + "\x11\x86\xb2\x3e\x90\xc3\xcf\x82\x74\xd3\xfc\x4b\x0d\x9f\xd7\xb8" + "\x11\xfd\xdf\xe8\x1c\xf9\xdc\x1b\x37\xf7\x35\xc8\x73\x0b\xc6\x61" + "\x7b\xd4\xd9\x9c\xe3\x83\x00\xd5\x19\xd3\xbe\x77\xd6\x67\x8c\x2b" + "\x04\xc3\xfa\x3c\xf4\x3b\x58\x0e\x86\xba\x12\xbe\xec\x86\x8e\x75" + "\x27\x98\x4f\xa9\x33\xbd\xeb\x44\xbe\xe5\x2e\xa8\xa8\x0a\x6b\x13" + "\xbd\xf5\x48\x7c\xe3\xc0\x28\xa1\xc7\x20\xca\x4a\xab\xc7\xc4\x3d" + "\x42\x87\x37\x1e\xd1\xea\x30\x71\x0f\x5e\x98\x2a\x31\x19\xaf\xd9" + "\xf2\xb3\xfa\x32\xab\xee\x51\xaf\x89\x95\x5e\x7b\x62\x02\xda\xc7" + "\x46\xa1\x9b\x44\x3e\xff\xc3\x08\x37\xdf\x60\xdb\xd3\x93\x01\xf4" + "\x9e\x93\xc2\x09\xe3\x14\x1e\xc4\xfe\x0d\x3e\x27\x61\xbc\x99\xec" + "\x97\xce\xd5\x54\xc7\xf7\x9e\x9f\x04\x89\xfc\xbc\xc1\xb8\x0d\xa5" + "\xa5\x84\x5d\xa4\x99\x18\xe7\x2f\x2d\xc5\xfc\xca\x15\xb9\x62\x58" + "\x21\xc5\x13\x4e\x31\xbc\x1e\xe5\xc2\x7d\x85\x07\xc7\x82\xfa\x7d" + "\x8f\xc4\xa6\xde\x3e\x9a\xe9\x53\x33\xe9\xb2\x13\x6e\x3a\x84\x7e" + "\x0c\xfd\x77\xd7\x1e\xd1\xfe\xdc\xf4\x11\x3d\xa3\xff\xfc\x12\xef" + "\x5b\x9b\xd1\x4f\x75\x97\x75\x98\x7a\x24\x18\xdc\x2d\x41\x8a\x7f" + "\xcb\xc8\x22\x7f\xb4\x2b\xde\xd9\xb1\x1f\x5a\xfc\xbf\x05\xeb\xb3" + "\x9c\xc7\x9f\xe8\x7c\xd7\xe2\xd5\x2c\xf0\x4e\xf7\x1e\xa3\xd3\x7f" + "\xca\xc1\xcf\x53\x17\xfb\xe5\x0d\x3f\x3d\x2a\xbe\xf5\x73\x4c\x7e" + "\x66\x31\x23\x33\xb6\x3c\xc3\xfc\x5b\x8e\xd1\x99\x2f\x96\xe8\xcd" + "\xdd\x30\xe6\x95\x35\x90\x54\xdd\x0d\xa3\x6a\xba\x21\x91\xfd\x8d" + "\xbe\x85\x13\xcc\x58\x78\xc6\x4c\xdf\x19\xc9\x18\x92\x07\xa6\x9a" + "\x35\xd8\x9f\xf3\x83\x21\xb0\x19\xfb\x73\xf4\x4d\xa0\x53\x89\xe4" + "\x2f\x7b\xfb\x73\x3d\xbc\xaf\xfc\x75\x39\x3f\x07\x7c\xd3\xd7\xe5" + "\xb1\x39\x60\x88\xc9\x02\x33\x96\xaf\xf8\x24\xdc\x14\x15\xd3\x8e" + "\x7d\x49\xac\xb3\x4b\xae\x2f\xfe\x26\xc4\xe5\xc0\x60\x5e\x57\xf4" + "\xe1\x6c\x53\xd7\x9e\xb0\x6d\xb3\x44\x98\xf2\x90\x2d\x61\x1d\x6e" + "\x1e\x41\xef\x5a\xf7\x5f\xed\x33\x16\x54\x33\x1f\x85\x17\x8e\x60" + "\x3e\x0c\x37\x51\xde\xfb\x30\xdc\x6b\xbf\x39\xc9\x25\xfd\xef\xf6" + "\x70\x18\xc5\x71\x93\xec\x6b\x6e\xfe\x0d\x93\x4a\x10\xa3\x9f\xa6" + "\xaf\xf3\x63\x7f\xfc\x24\xd9\xf1\xcd\xfb\xd2\x72\x99\xdf\xba\x9c" + "\xde\x7b\xdf\x5c\x47\xef\xe4\xe9\x5d\xdc\xaf\xb1\xaf\x73\xa1\xf7" + "\xf0\xd4\x86\xd0\xf8\x21\x2e\x17\x79\x96\x7d\x9a\xce\x70\xdc\x7e" + "\xb1\xfd\x7a\x5a\x0b\xb2\x9d\xaf\x3b\xb9\xb9\xd3\x05\x8f\xa6\xc8" + "\xe7\xb8\x76\x0a\x7f\x7a\xcb\x41\x0f\xca\x40\xeb\x03\x6e\xa9\xa3" + "\xf3\x48\xba\x4a\x3b\x2a\x1d\xd7\x92\xef\xbf\x65\xa7\xe8\x0b\x75" + "\x54\x88\xb6\xe0\x96\xd5\x62\x4e\xff\x96\x64\x17\x4c\xe1\x98\xcb" + "\x1b\x49\x98\xb8\xa5\x90\x45\x77\x6c\x27\xba\x71\x25\x50\xb2\xc2" + "\x0f\xd8\x17\xe8\xa8\x60\xdc\x56\x4e\x02\xfb\xf9\x73\x5e\x5a\x4b" + "\xe1\xb9\x72\x81\x17\xfb\x06\x07\x31\xae\x92\xf2\x70\x23\x0d\xca" + "\x3d\x4a\xbc\xb3\xbf\xa5\xc2\x05\x77\xca\xfe\xf0\x96\x6c\x31\xd7" + "\x7c\x4b\x76\x17\xa6\xc5\xbe\xe2\xe5\x18\x8f\xf6\x32\x2f\x5e\x7e" + "\xb7\xcb\xd7\xdc\x60\x58\xa3\x0b\xe6\xf3\x79\xd6\xc2\x11\x60\x29" + "\xb4\xb2\x8e\xb0\x7d\x3d\x4d\x3d\xc7\xce\xe2\xeb\x62\x24\xb8\xd2" + "\x6b\x1f\x63\x52\xf8\x62\x7b\xfb\x66\x97\xf4\xc8\x23\x18\x96\xa0" + "\xf0\x45\x9a\x2b\xf0\x79\x4c\x2f\x8d\x48\x93\xac\x4a\xf3\x48\x97" + "\x74\xf3\x9b\x18\x96\x1e\x92\x26\x2b\x24\x4d\x9e\x2a\x4d\x89\x9c" + "\xcf\xc6\x90\x34\x95\x21\x69\xea\x75\xca\xd6\x10\x92\xa6\x29\x24" + "\x4d\x9b\x4e\xd9\x3a\x43\xd2\xf8\xb5\x69\xc6\xc6\xa8\x64\x4b\x6b" + "\x54\x92\x30\xcc\xaa\x4d\x33\x36\x29\x24\x4d\x8a\xf2\x8c\x7d\xcf" + "\x2c\xd1\x37\x40\x3c\xa1\x4e\x51\xaf\xe8\x43\xc7\x62\xfd\xa7\x86" + "\xed\xc3\x13\x36\x11\x33\xe5\xc5\xbb\xc5\x79\xf8\xe4\x57\x69\xfe" + "\x9c\xfc\x39\xf6\x8b\x3b\x09\x13\xd4\xef\xa4\xbc\x8e\xc1\xb8\xcd" + "\x84\x21\xe4\xb9\xbf\xbf\x3c\xc6\x36\x85\x94\xb3\x2d\xa4\x9c\x1d" + "\xfd\xe5\x31\xd6\xaf\x4d\x33\x2e\x46\x9b\x66\x5c\x82\x2a\x4d\x9d" + "\xc8\x67\x5c\x52\x48\x9a\x94\x90\x34\xe9\xfd\xf1\x39\x2e\x3b\x24" + "\x4d\x61\x48\x9a\x8d\x7d\x32\x1c\xc7\xbf\xe9\x42\xf6\x80\xe1\x38" + "\xfe\xb9\xeb\x7c\xeb\xc4\xcc\x0a\x9e\x95\xf5\x62\x02\xd7\xe3\x47" + "\x54\x8a\x75\x53\xfc\x2c\xa2\x76\x18\x2f\xce\xa0\xc5\xf2\xbc\xd6" + "\xed\x8b\xa4\x77\x4a\x28\xdb\x8e\x03\x36\x1f\xb6\xb9\xe3\xb1\x8d" + "\x9a\xd4\xbb\xa6\x82\xd6\xa1\xf0\xb3\xeb\xf8\x78\x64\x9c\x4b\xd8" + "\xdf\xf8\x89\xf2\x3b\x1c\xaa\x0f\x8e\x33\xc6\x4f\xfc\x96\xe5\xfa" + "\x88\xca\x45\x67\x39\x21\x0f\x5b\xef\x58\xa3\xb7\xac\x94\xe7\xf8" + "\x2f\x95\xb2\xd6\x8a\xb5\x30\x74\x6e\x98\x9b\xce\xd5\xc2\x34\x7b" + "\x55\xe3\x13\x2a\xab\x67\xff\x1a\x9f\x51\x5b\xe6\xf1\xe5\x72\x99" + "\x5d\xc2\x47\x8d\x77\x29\xfe\x24\x2c\xfe\x4a\xcf\x36\xb5\xa0\xd4" + "\xe9\xbd\x7f\x73\x35\xf6\x37\x71\x8c\x45\xe5\x3e\x0a\x49\x89\xbc" + "\xff\xbb\xbc\x1b\xe8\xde\x59\x34\x85\xaf\x0b\x10\x75\x49\xca\xa2" + "\xef\x27\x50\xdf\xa7\x31\xef\x34\x74\xf1\x31\x1a\xf9\xc6\xa4\xcd" + "\x07\x8a\xdc\x58\xd6\xa4\x0c\x65\xdd\x8c\x0b\x92\x44\xbf\xae\xf4" + "\xac\x83\xd6\x2c\xd0\x7b\xbc\x03\x9e\xc9\x44\x53\x84\xe5\x4c\x51" + "\x64\x40\xdf\x62\x40\xda\x89\xe1\xc6\x4a\x6a\xb9\x8a\x32\xdc\x7a" + "\x4e\xe0\x27\xa9\x51\x6b\x0f\x91\x88\xd3\xa4\x36\x2d\xe6\x92\x3a" + "\xb4\x98\x4b\xf2\x69\xed\x41\x42\x7b\x98\x10\xa3\x4d\x33\x21\x41" + "\x9b\x66\xc2\x18\x55\x9a\x0a\x91\xcf\x84\x94\x90\x34\xe9\x21\x69" + "\xd4\xfe\x0f\xeb\x3c\x21\xaf\x77\xdc\xc9\xfd\xfd\x84\x12\xd5\xb3" + "\x54\xc9\xdb\xa9\x09\x95\x4a\x18\xcd\xdd\x51\x1f\x95\x70\x23\xf3" + "\xdb\x17\xe2\xa3\x88\xbe\x31\xa4\x0c\x87\x42\xca\xd0\xae\x3c\x6f" + "\x15\xe3\xe6\xff\x44\xd9\xdd\x24\xe3\xcc\x13\xb7\x01\x1e\x8a\xf3" + "\x3f\xfc\x38\xf5\xcd\xa8\x7d\xe2\x6b\xb7\xd6\x61\x9f\xf2\x0c\x98" + "\x69\xcd\xdc\xb1\x42\x88\xa0\xf3\xdd\x5c\x70\x5b\x26\x8e\xe7\xe8" + "\x8c\xc7\x4e\xec\x4f\xa5\x1d\x83\x09\x94\x7f\x15\xe6\x81\xb2\xbb" + "\x35\x55\x5b\x86\x5b\x33\xb4\x65\xb8\x35\x47\xf5\x6c\xc6\x67\x9b" + "\xaa\xde\xe6\x08\x0b\x5f\xa3\x89\x7d\xeb\x5b\x2b\x94\x70\x9a\x03" + "\xc0\x3a\x76\x14\xf3\x7e\x40\x0a\xad\x97\x1b\x76\x14\x6e\x5d\x47" + "\xf3\x05\x32\xcf\x77\xd5\xb2\x15\xb2\xb8\xb5\x35\xa4\x1c\xae\x90" + "\x72\xb8\xfb\x7c\xcd\x04\x8f\xb0\x91\xdb\x8c\x2e\xb8\x3b\x89\xc2" + "\x50\x16\xd6\x38\xbf\xf5\x72\xc7\x48\xea\xa7\xde\xf6\x90\x07\xeb" + "\xcb\x7e\x22\x0d\x93\x9f\x1f\x61\x23\xa9\xdf\xfd\x75\x29\xfa\x67" + "\x5a\x13\x79\x1d\x86\x65\x0a\xbd\xde\x86\xf5\xbf\x2b\x55\xf0\xbd" + "\x8d\xbf\x83\x25\x5a\xbc\x4f\x64\x51\x67\x75\xbf\x27\x44\x78\xee" + "\x8a\x3e\xdb\x2a\xaf\xd7\xb4\x22\x8f\x72\xc5\x1e\x82\x65\x67\x5b" + "\x83\x9b\x4e\xe7\x60\x18\x8e\x95\x92\xaa\xc4\x98\xe6\x9b\xfd\x88" + "\xfd\x2a\xd4\x1f\x8e\x81\x27\xca\x63\x99\xb3\xed\xb4\x66\x0e\xfd" + "\x12\x9d\x21\x19\x23\xd6\x4b\xdc\x76\x48\x65\x57\x1e\xeb\x9a\x69" + "\xec\x28\x4c\xdc\x49\x7d\x3b\xf2\x1b\xb4\xf6\xee\x80\xdf\x0d\x34" + "\xcf\xe2\xf4\x1f\xe7\x7d\x72\x8c\xaf\x12\x69\x27\x9a\x55\x69\xdd" + "\xf2\x3c\x48\x07\xc5\x8d\xf7\x83\xf1\x80\xc7\x4d\x67\xe5\xc7\x8b" + "\x7e\xfc\xc4\x9d\x07\xd0\x5f\x60\x9a\x19\x4a\x1a\x9a\x33\xa1\x34" + "\x38\xe6\x31\x8e\x2b\xa2\xef\x69\x1e\xe5\xbc\xe5\x77\xd2\x7c\x7c" + "\xe4\x2c\xea\x00\xa7\xa7\x8d\xe6\x34\x8d\x62\xed\xd2\xc4\xaa\x08" + "\x1f\x98\xba\x36\x9d\x75\xb8\xf0\x3e\xb0\xe9\x6c\x13\x96\x0d\xf5" + "\x76\xdb\xbb\xe4\x03\xd5\xb2\x9b\x39\x33\xfd\xe1\xb4\x39\x63\x1f" + "\x7b\x78\xd6\xfc\x99\x53\xac\xf3\x97\x2e\x5b\x92\x3d\x76\xc5\x0b" + "\x85\xd6\x55\xf9\x4b\x0b\x97\x2e\xff\x31\x3f\xde\xd3\xba\xb8\x50" + "\xfc\x26\xe6\x2e\x2e\x28\x9c\x4a\xb7\x63\xac\x79\xf9\x4b\x56\xf2" + "\xdb\x9b\xa2\x41\xcb\x64\x69\xe1\x92\x7c\xeb\xe8\xec\x31\xd6\xfb" + "\x16\x2f\xcd\x7d\x21\x7f\x89\x2e\xaf\x29\xd6\xfc\x25\xf9\x4b\x16" + "\x67\x5b\xa7\x5a\x93\x88\xb3\x9a\x9d\x4a\x9f\x49\x8a\x7f\x2a\xc0" + "\xf6\x1c\xfb\xd0\x1d\xe4\xa7\xa8\x5d\x3f\x06\x77\xac\xa3\x3e\x1c" + "\x3f\x8f\x13\x71\x88\x6d\x82\xcb\x6b\x9f\x54\xd4\xbf\x1d\x9f\x54" + "\xa1\xc5\xef\xa4\x3a\x2d\x7e\x27\xed\xeb\xdf\x8e\x4f\x0a\xb1\xff" + "\x49\x21\xf6\x3f\xa9\xbd\x7f\x3b\x3e\xc9\xa7\x4d\x73\xbb\x49\x9b" + "\xe6\x76\x4b\xaf\x9f\xc1\xb2\xbe\xc8\xfd\xd2\xed\x63\x42\xd2\x24" + "\x87\xa4\x99\x1d\xf2\x9c\xa9\x7a\xc6\xbe\xeb\xed\xb9\xea\xbe\x01" + "\x3e\x17\x29\xb6\xde\xe7\xdf\x6e\xaf\x50\x68\xa8\xed\xa9\xa5\xef" + "\xfe\x08\xda\x3d\x2a\xda\x0e\x99\xb6\xd7\xfe\xc9\x27\xd1\x9a\x45" + "\xd1\x3f\xbf\x63\xac\xec\xdb\xe8\x3b\x40\x4a\x1b\xda\x8e\xba\xb8" + "\xee\x24\xdc\xbe\xb3\x56\xd0\xba\x69\x1d\x2b\xfb\xf9\x02\x6f\xed" + "\x30\x30\x51\x5a\x3a\x8f\x92\xd9\x27\xd6\xd3\x59\x89\x18\x16\x83" + "\x17\xfa\xa9\x3b\xac\x2e\xe9\xd0\x7e\xca\x83\xd6\x34\xb8\xe0\x0e" + "\x8e\x65\x4a\xb7\x91\xaf\xbd\xe3\xf9\xed\xa4\xef\x19\xd1\x19\xaf" + "\xe4\x3f\x29\x5f\x3a\x27\x95\xf2\x46\x1e\x46\x26\x4d\xfc\x4a\x3e" + "\xef\xd2\x8c\x57\x3c\xf2\x2c\x54\x78\x22\x3f\x2b\x88\x73\x75\xf9" + "\x3a\x75\xd1\xef\xb9\xa3\x52\xe9\x5f\xd0\x58\x41\xcf\x77\xe8\xaf" + "\x49\x86\xb8\xad\xf6\x60\x9b\x63\x7d\x3b\x95\xa9\x91\xfa\xa1\x4e" + "\x8b\x1f\x5a\xaa\xfd\x38\x7e\x05\x33\x1f\x4f\xd9\x4e\x80\xb3\xce" + "\x0f\x34\x3f\xbc\xc8\x06\x25\xb5\x52\xb0\x8d\xf5\xa6\xa3\x31\xda" + "\x1d\x7c\xcd\xff\x46\x0a\xc7\xf4\x38\x96\x70\xd3\xda\xe5\x70\xdf" + "\xda\x22\x3a\xc7\x48\x1a\xef\x4d\x9e\x28\xf7\x7d\x4b\x6b\x91\x97" + "\xee\xba\x5a\x09\x9c\x5e\xfb\x64\x6c\xff\x16\xb5\x29\x3e\xfb\x40" + "\x15\xf7\x7d\x12\x86\x97\xa2\x2c\x1a\xc2\xf5\x53\x64\xff\x9e\x47" + "\x6b\xbd\x90\x76\xff\xf9\x68\xa9\xdc\x07\xb0\xde\x68\x8b\x55\xaf" + "\xad\x4f\x8a\x94\xfd\xab\x09\xd3\x75\x2a\xe9\x2e\xa6\x7e\xf2\x1e" + "\x02\x37\xda\xaa\x47\x8c\x15\xa7\x2c\xde\xce\xd7\xea\xde\x89\xfd" + "\xbf\xc9\x8a\x1d\x5c\x86\xcf\xe8\xff\x26\xf3\xbe\x0e\xad\xab\xa1" + "\x31\x75\x41\x1e\xf6\xd9\x2c\x1e\xf4\x8d\x77\x66\x29\x71\x7c\x9e" + "\x88\xe2\x8a\x98\xef\x80\xa5\x9d\xe2\x8a\x7a\xe3\x28\x1d\x95\xdb" + "\xe6\xa7\xf0\x4a\x25\x5c\xb4\x2d\x77\xd6\x87\x3c\xef\x57\x9e\xf1" + "\x1e\x7d\xe6\xe4\xde\x75\xfa\xe8\x73\x69\x8d\x93\xe1\x28\x4c\x19" + "\x51\xc3\xed\xe6\x4e\x97\x12\xcf\xe7\xd4\x5e\xa5\x77\x63\x1e\x08" + "\x46\x77\x54\xf1\x3e\x17\xa6\xa1\xef\x63\xe1\x18\xc3\xc0\x7a\xf8" + "\x7a\xab\x4e\xe2\x43\x36\xc3\xbf\x51\x83\xcf\x47\xe1\x4e\x3a\x5f" + "\xda\x4d\x18\x59\xe5\x87\x84\xbc\xbb\x69\xfe\x79\x0a\xc7\x2d\x85" + "\x11\x5f\xe2\x47\x6d\x22\xf1\x26\x7e\xf4\x1d\x2f\xd6\x95\x83\x65" + "\x9d\x42\xf5\xaf\x0c\xa7\x2b\x8c\x2f\x51\xc9\x32\x12\x9f\x2b\xb4" + "\x75\x9d\x52\x17\xf2\xbc\x4f\x79\xa6\xb9\x5e\x81\xbd\x29\xf5\x72" + "\xdc\xc1\xf3\xe5\x45\xe3\x5f\xa4\x71\x6b\xf3\xbb\x0b\xb4\xfc\xef" + "\x32\x87\x3c\x5b\x95\xe7\x4a\xfe\x8e\xe1\xae\x24\x25\x0f\xae\x33" + "\xc4\x58\xfd\x7a\x77\xe4\xf9\xce\x6f\xc5\x34\xd9\xaa\x3c\x07\xe1" + "\x73\x61\x9f\xfe\xee\x2a\x51\xf8\xe1\x7d\xb9\x8a\x0e\xfb\x25\x77" + "\x55\x2b\x74\xe2\xfd\xc6\x5d\x7b\x55\xe9\x1a\x2e\x50\xd7\x10\xec" + "\x4e\x8d\x14\xd8\xbd\xcb\xad\x2d\x4b\x32\xf4\xf1\x4c\x8e\xe9\x2b" + "\x4b\xb2\x45\x45\x87\xf6\x99\x9c\x18\x8a\xd5\x02\x1b\x61\x9c\xf0" + "\x9a\x3c\x43\x27\xce\x27\xc7\x65\xe9\x63\x3c\xd9\xa6\x0a\x97\xc7" + "\x47\xc9\x9f\xc9\xfd\x04\xf2\xcf\x1e\xfa\x46\x99\x7c\x4e\x3a\xc7" + "\x24\x9d\x9f\x2c\x7f\x37\x09\x71\x9d\xdc\x10\xca\x97\xbe\x75\xd3" + "\xcb\xa3\x8f\x67\xa9\xe8\xe3\x25\x77\xa8\xea\xe6\x71\xc1\x14\xe5" + "\x3d\x91\xf8\xfe\x21\xdc\xd5\x1e\x6e\xdc\xe1\xb5\x4f\x1d\xa5\x95" + "\xd9\xd4\x89\x7d\x32\x9b\x9a\xd2\xc7\x77\xea\x6c\x15\xdd\xff\x8f" + "\xcf\x99\x2a\xba\x9c\x0b\x61\x53\x60\x65\x6a\x45\x48\x5e\x75\x2a" + "\x1e\x7b\x55\x79\x35\xa8\xe8\xda\xf0\xb9\x29\xbc\x7e\xa6\xb6\x87" + "\xd7\xcf\xdd\xa0\xaf\x9f\xbb\x2d\x7d\xf9\xde\x3d\xea\xc2\x76\x75" + "\x77\xaa\xaa\x3c\xb5\xf8\x9c\xa1\xb5\xa3\xbb\x73\x42\x9e\x7b\xf5" + "\xcf\xd0\x77\xd4\xaf\x49\x89\xa4\xf0\xc2\x11\x60\x16\x76\x76\x77" + "\x95\x3a\xfe\x9d\x6e\x11\x4f\x65\xe4\xef\xe0\xe8\xfd\xa6\xa0\x73" + "\x84\xd2\x11\x8d\x2a\xde\xa5\x94\x7d\x63\x98\x33\xbd\x95\xf6\xcf" + "\x19\xa4\xf6\xef\x6e\xbf\x78\x6f\xf3\xd5\x41\x66\x7f\x3f\x23\x5c" + "\x5b\xe6\xb5\x4f\x9b\x8c\x63\x06\xb7\x90\xcf\x34\xc4\xff\xa3\xbc" + "\x6f\xc2\x4a\xbf\xa2\x6f\x13\x75\x1f\x83\x69\x9f\xe1\x6f\x0f\xfe" + "\xfe\x51\xdb\xbe\x4e\xcb\x64\x76\xc3\xbc\x5a\x7b\x68\xbb\x3b\xad" + "\x10\xc7\x1e\xdd\x71\xfe\x92\x0c\x9d\xb8\x0a\x66\x8f\x78\x58\x27" + "\x9c\xce\xcc\xef\x76\xc1\xb4\x23\x54\x5e\x55\xb8\x83\xd9\x87\xcc" + "\x27\x7a\x17\xe5\x87\x69\xc2\xe9\x4d\xd9\xff\x23\xb0\x97\x12\x13" + "\x52\x8f\x73\xc7\x20\x65\x93\xa8\x47\xca\x5f\xb5\x79\xa7\x8c\xd2" + "\xaf\x47\x4a\x32\xd6\xe3\x9c\x7e\x3d\x52\xf8\xb7\xa9\x99\x84\x75" + "\xe9\xd7\xef\x48\x29\xc4\xba\x9c\xe3\x72\xd7\x86\x97\x2b\xe3\xd4" + "\xe2\x73\x38\xfe\x97\x80\xa7\x9d\x57\xd4\xa7\x37\x99\x6e\x7f\x5c" + "\x15\xa4\xeb\xe4\x89\x7a\x1c\x3c\xcf\x05\xf7\x18\x95\xf6\x4a\x0e" + "\x6f\x17\x65\x41\x39\x49\x24\x27\xac\x0f\xa6\x0b\xa7\x6f\xc5\x3e" + "\xc5\x7b\xa6\x7b\xd0\xfe\xa7\x75\x28\x6d\x3a\xb6\xe7\x6e\x45\x8e" + "\x18\x97\x1e\x12\xe7\x53\xc5\xe5\x6a\xe2\xd6\xf5\x86\x6f\x54\xc2" + "\x2f\x4e\x4f\xf7\xec\x0f\xd1\x13\xea\xe7\xde\x99\xda\x7a\xdf\xd3" + "\x28\xea\x87\x3a\xea\x27\xeb\x7b\x5c\xa8\xa3\x1e\x7d\x1d\xdd\xe3" + "\xd7\xc7\xda\xbd\xf1\x9c\xdf\x30\xd0\xe1\x77\x2f\xed\x19\xeb\xe1" + "\x18\x94\xf5\xd4\x5f\x3f\xf7\xce\x57\xf4\x73\x71\x75\xbc\xb7\x2a" + "\xa4\x8e\x81\x63\x30\xfd\x0a\x51\xd7\xe9\x4b\x42\x78\xef\xd3\xc7" + "\xe2\xbd\x4d\x58\xcf\x80\x7e\x3d\xef\x6d\x0f\x8f\xc5\xe9\xf4\x3e" + "\x24\xd0\x1f\x8b\xd3\x2d\x22\x0d\xe8\xa5\x99\xc8\xec\x7a\xf9\x4c" + "\x9f\x4d\xfd\x22\x17\x4c\xdf\x48\xef\xe9\x54\xe1\xd9\x5a\xfc\x61" + "\x1d\x28\x1d\xc9\xcf\x2f\xc6\x31\xa4\x87\x63\x56\x90\x2e\x84\x49" + "\xaf\x7d\x7a\x63\x88\xac\x4e\x1d\x83\x19\x33\xbb\x24\xe9\x3e\x21" + "\xaf\x99\x51\x21\x65\x72\xe9\xcb\x6b\xba\x0f\xe5\x75\x4a\x5f\x5e" + "\x33\xe2\xc3\xcb\x6b\x06\xe9\xff\x54\x7f\x79\xcd\x48\x55\xcb\x8b" + "\xbe\xad\x4a\xf5\xbb\xde\x82\xd8\xe8\x59\xc4\x6a\x85\x2f\x37\xc7" + "\x21\x56\x44\x9a\x4e\x4a\x53\x14\xe7\x13\x38\xb1\x5e\x0d\xa6\x93" + "\x30\x23\x5b\xb1\xff\x21\x55\x30\x98\xf5\x2c\xa0\xb5\xda\xf4\xad" + "\x06\xb3\xd3\x76\xca\x41\xdf\x74\xa4\xf9\xc6\x90\x7c\x1d\xfa\xbe" + "\x60\x06\xf6\xf9\x23\xb6\xe9\x84\xbb\xc5\x9c\xe9\xcc\x44\xad\x8f" + "\x98\x69\xd2\xea\x08\xe5\x26\xf1\x53\xc9\x0d\x17\x73\x9d\x5f\x67" + "\x33\x6d\xfd\x75\x76\xdf\x55\xb2\xbe\xce\x69\xcb\x37\xb3\x42\x5f" + "\x5f\x33\xf7\x84\xd7\xd7\xcc\xc6\xf0\xfa\x9a\xe9\x22\x7d\xb9\xe0" + "\x3e\x8b\xb6\xdd\x98\xe9\xd3\xd6\x17\xf3\xc5\x74\x4c\x1a\x74\x39" + "\x3d\x5f\x6c\xbd\x95\x8b\x7c\x1c\xe9\xaa\x16\xfb\x57\x58\xfe\x11" + "\x54\xc6\x81\xf2\x08\xcb\x1b\x65\x58\xb1\x26\xec\xf7\x3f\x62\x5a" + "\x70\x5c\x49\xeb\xf3\xf8\xf7\x99\xe1\xbe\x13\x41\xc9\x30\x05\xef" + "\xa5\x63\x90\xfa\xfb\xa0\x14\x51\x42\x6b\xc9\xf8\xfe\x39\xfe\x7e" + "\xe2\x7e\xa3\x5a\x17\xb4\xa6\x8c\xe6\xa2\xb7\x88\x79\xce\x2f\x8e" + "\xc1\xfd\x9b\x85\x5e\x52\x77\x6a\xe5\x78\x7f\xa2\xbe\x5e\xee\x4f" + "\x41\xbd\x7c\xa1\xaf\x97\xfb\x33\xc3\xeb\xe5\x7e\x1b\xea\xe5\x8b" + "\xfe\x76\x74\x7f\x85\x6c\x47\x2f\x52\x1a\xeb\x72\xea\xaf\xa6\xd2" + "\x73\x1c\xde\xa3\x8d\xdc\xcf\xbf\x3f\x34\xb6\x53\xb1\x23\x9e\x86" + "\xc6\xff\x3c\x7f\x99\xc6\x21\xf3\x50\xf3\xed\x88\xeb\xd4\xb3\x93" + "\x54\xbe\x66\x60\x5c\x1e\x98\x50\x86\x19\xbb\x89\x47\x3e\xc0\x49" + "\x48\x7d\x84\xe8\x28\x9c\xbe\xa5\xa0\xa2\x4f\x52\xe8\xf8\xbc\xa8" + "\xa0\x4d\x64\xde\x1c\xfe\x8d\xa8\x10\xde\x72\xfd\x07\xf3\x76\x84" + "\xe8\x89\x2e\x84\xa6\x44\xd8\x63\x6a\xa3\xd6\x1e\x53\xab\xb4\xf8" + "\xbc\x9f\xde\x4f\xc4\x05\xd1\xcf\x21\x96\x3b\x03\x76\xc3\x94\x4b" + "\x63\x9b\xb3\xe2\x43\x6c\x13\x31\x30\xeb\x3f\x04\x06\x66\xfd\x4c" + "\x5b\xd6\x59\x63\xf4\x31\x30\x6b\x46\x78\x0c\xcc\xca\x0a\x8f\x81" + "\x59\x45\x84\x01\x17\xcc\xda\xaf\xb5\xcd\x59\x95\xda\xba\x63\xbe" + "\xdc\x36\x61\xe8\x40\x6c\x13\xfb\x42\x97\x87\xb3\x43\xb9\xff\x6f" + "\xa0\xef\xa1\x0d\x40\x66\xe2\xfb\x3e\xf0\x40\x2a\xbd\x43\x42\x1f" + "\x9f\x43\x32\xac\xe1\x63\xb4\x07\x32\xd5\x72\xdc\x22\xc6\x5a\xc5" + "\x48\xfb\x25\xad\xd9\x13\xf2\x7c\xf0\x0d\x6d\xfd\x1f\x28\xd2\x97" + "\xe7\x03\x95\x28\xcf\x62\x7d\x79\x3e\xb0\x2f\xbc\x3c\x1f\x38\x48" + "\x7b\xb4\xfb\xdb\xd4\x03\xed\xf4\xad\x4b\xa5\x6d\x3a\x09\x0f\x4e" + "\xbd\xb8\xf6\xe9\xc1\x04\x6d\xfb\xf4\xa0\x71\xe0\xed\xd3\x83\x59" + "\xfa\xed\xd3\x83\x36\xfd\xf6\xe9\xc1\x0a\x61\x0f\x0f\x36\x69\xed" + "\xe1\xc1\x3d\x5a\x4c\xa0\xec\x2e\x59\xfb\x34\xdb\x12\x62\x03\x5b" + "\x8f\xc1\xec\x9d\xd8\xa7\x78\x49\xe8\x6d\xce\x93\xda\x32\xce\x9e" + "\xa8\xaf\xb7\xd9\xb3\x51\x6f\x5b\xf5\xf5\x36\x3b\x27\xbc\xde\x66" + "\x6f\x44\xbd\x6d\xed\xaf\xb7\xd9\xd5\x03\xef\x53\xcc\x6e\xd5\xea" + "\x6c\x76\xc3\xc0\x75\x36\x27\x5e\x5f\x67\x73\xc6\xe8\xeb\x6c\xce" + "\x0c\xa1\xb3\x39\x45\x5a\x9d\xcd\xc9\xd4\xea\x6c\xf6\xc4\x4b\xa7" + "\xb3\x39\x07\x43\x74\xb6\xe2\x18\xcc\x9d\x83\x3a\x6b\x15\x3a\x4b" + "\x1b\x1a\x52\xc6\x0e\x7d\x9d\xcd\xc5\x01\x23\xac\xd0\xd7\xd9\xdc" + "\x84\xf0\x3a\x9b\x3b\x19\x75\xb6\xa2\xbf\xce\xe6\xa6\x0f\x5c\x67" + "\x73\x37\x6a\x75\x36\x37\x77\xe0\x3a\x9b\xdb\xa4\xaf\xb3\xb9\x2e" + "\x7d\x9d\xcd\xf5\x09\x9d\xa5\x25\x69\x75\x96\x66\xd6\xea\x0c\xe5" + "\xf6\x1d\x75\x86\xfa\x69\x15\xeb\x75\xd3\x5e\xee\xe2\x73\xda\x69" + "\xa5\x2e\x48\x4f\x17\xef\x04\xd2\x39\x76\x64\x1d\xbe\x83\x34\x45" + "\xfd\xdb\xee\xb4\x7a\x39\xec\xb1\xfe\x7a\x48\x73\x60\xbb\xda\xd9" + "\x58\xc4\xd7\x75\x09\x1d\x92\xcc\x91\x4e\xcc\x91\xa5\xb9\x28\x2d" + "\xea\x98\x39\x7d\x7e\xa0\xb6\x18\xe9\x3d\xc4\x87\xce\x13\xd1\xf2" + "\x4a\x8f\x19\x48\xbf\x2c\xfc\x1a\xf3\xaf\x5a\x1d\xeb\x6f\x45\x7e" + "\x0f\x8d\x10\x58\x4d\x0f\xed\xff\xd6\x62\x5e\x67\x04\x4e\x1f\x0e" + "\x99\x33\x49\x0f\xd3\xff\x4d\xa7\xfe\x6f\xad\x3e\x4e\xd3\xcf\xd3" + "\xff\x4d\xa7\xfe\x6f\xad\x6a\xbc\x3a\x6c\xa1\xdf\x15\x32\x5e\x7d" + "\xc8\x18\xe7\x11\xd8\xe1\xfd\xd8\x4d\x5f\xb5\x7a\xed\x0f\x8d\x09" + "\x29\x33\xea\xe6\xa1\x37\xe4\x32\xbf\x1a\x92\x7e\x86\x7e\x99\x1f" + "\xca\xc4\x32\xbf\xa3\x5f\xe6\x87\x6c\xe1\xcb\xfc\x50\x25\x96\xf9" + "\x9d\xfe\xb6\xf5\xd0\x5e\x19\x07\x3a\xe3\xf2\x87\x9a\xf4\xf5\xff" + "\x50\x88\xfe\x21\xa3\xb0\x88\xb9\x79\x7a\x0d\xdd\xc3\x26\x35\x1d" + "\xad\xd5\x27\x5a\xc2\x88\x0e\xed\xc4\x50\x9e\x61\xe8\x32\xfb\x61" + "\x8f\xf6\x16\xe8\x62\xef\xe1\x52\x61\x8f\x0f\xbb\xb4\xf6\xf8\x70" + "\x9d\xd6\x1e\x51\xd6\xda\x74\x0e\x6d\x7c\x7a\xc5\xa5\xf3\xb1\xf3" + "\x92\x42\x30\xf0\xfe\x31\x98\xf7\xb6\xc0\xc0\xfc\x48\x6d\x39\xe6" + "\xa5\xea\x63\x60\x5e\x16\xd6\xff\x7d\x7d\x0c\xcc\x2b\x0a\x8f\x81" + "\x79\x55\x28\xcb\xf7\xd5\xb8\x9d\x57\x94\x32\x38\x84\xe6\x5d\x7d" + "\x9f\x37\xef\x90\xfe\xbc\xce\xbc\x4e\x21\xe3\xf9\xa3\xb4\x32\x9e" + "\x6f\xd4\xca\x10\xeb\xf2\xdd\x65\xd8\x7b\xae\x97\xd7\x3e\x3f\xd4" + "\xfe\x9d\x98\xa7\x6c\xff\x8f\x9c\xd0\x96\x71\xbe\x3c\xfe\xd1\x9b" + "\xcb\x9a\xbf\x17\x65\xe9\xd4\x97\xe5\xfc\x26\xfd\x3a\xcf\x77\x61" + "\x1b\xe4\x0c\xf6\xb3\xa5\xf9\x3e\x0c\x9f\xc7\xbf\xd1\x78\x0e\xcc" + "\x35\x18\x3e\xcf\x0f\x26\xde\x5e\xf5\xb6\x4b\x8f\xd0\xbe\x03\xc6" + "\xe7\x98\x11\xbf\x71\x09\x90\x4e\x6d\x10\x95\x6b\x51\x51\xe8\x3b" + "\xd1\x47\x94\x6f\xe9\x7a\x68\x5f\x4d\x9c\x0d\xd2\x9d\x1e\x3f\x28" + "\x78\x27\xfa\x10\xde\x36\xb2\x0b\xa2\x57\x68\xc5\x5c\x67\x49\x88" + "\x6f\x7a\xa4\x4e\x5f\xc7\x8f\x34\x84\xc7\xce\x23\x87\x84\x9e\x1f" + "\x35\x69\xf5\xfc\x48\x67\xd0\x3e\x64\x3e\xd5\x15\x31\x30\x20\x3b" + "\xa1\x77\xa7\x61\xfd\xfd\x8b\x0b\xda\xf2\xd6\xc3\xb5\xc7\xe1\xd1" + "\x3c\x9e\x9f\xc4\x7c\x71\x1b\x0c\xd0\xc8\x7d\xc0\xa3\xe2\xdb\x80" + "\x48\xb3\xc8\x0f\x12\x7b\xf1\xb9\x36\x8a\xab\xb5\x33\x1f\xff\x06" + "\xa5\x9d\xb5\xd2\x79\x3c\x88\x85\xcb\x8f\xc2\xa3\x9b\x34\xe9\x11" + "\x95\x4e\xc1\xa3\x51\xcc\xef\x3f\xea\x50\xe6\xe1\xc3\xcd\xef\x23" + "\x4d\xbb\xb2\xee\x57\xbc\x0b\x7b\xb4\x2d\x6c\xbb\x8c\x65\xa2\x3d" + "\xe4\x54\xa6\xf3\xfb\x81\xc7\x26\x2b\xf8\x15\xef\xe6\x1e\x4b\xed" + "\xdb\xdb\xf2\xd8\x7c\x8c\xf3\x9f\x67\x3e\x57\x65\x07\x8f\x95\xa8" + "\xf9\x88\xb3\xed\x1e\xab\x54\xf6\xa7\xe0\x7d\xdd\x05\x78\x29\xe5" + "\x69\x0a\x29\x0f\xea\xf3\x41\xbf\xcc\xa3\xfd\x02\x3c\xe2\x9d\xf5" + "\x53\x60\x5c\x10\x22\x8e\xc3\x13\x13\x2a\x69\x8d\x4e\x75\x07\xc4" + "\xf8\xc1\x28\xc6\x76\x19\x77\xd2\xde\x10\x1a\x1b\x3a\xfd\xd3\x1c" + "\xf4\x0e\x8e\xaf\x21\xb0\x4c\x73\x34\xdb\x02\xf2\xd9\x63\x19\xfc" + "\x7b\xdb\xcd\x39\xa7\x1c\xd5\x3b\x58\xc7\x6e\x7e\xe6\x54\x86\x66" + "\xfc\x57\x4e\xeb\x7f\x68\x1d\xc6\x7a\x98\x86\xf4\x5f\x0a\x5b\x7f" + "\x22\xa4\x4f\x9a\x11\x66\xfc\x97\x41\xe3\xbf\x69\xfa\x76\x9e\x71" + "\x9e\xf1\x5f\x06\x8d\xff\xa6\xa9\xdb\x4d\xf1\x9e\x27\xa3\x5d\xdd" + "\x27\xa5\x73\xa1\xac\xcf\x50\x3f\xf3\xf1\xc7\x6f\xa9\x04\xb3\x9f" + "\xde\x69\xa3\x6d\x3a\x3b\x1a\xc9\x5e\xcd\xcd\xee\x06\x3a\x8f\xc1" + "\x44\xdf\xce\x16\x6d\x19\xd9\xeb\xe3\x7c\xbe\x30\xce\x2f\x6c\xb1" + "\xd8\xc6\xdc\x63\xda\x11\x43\x2b\x72\x14\x5e\xf1\xeb\x72\xc4\xbe" + "\x8f\x21\xed\x30\xd8\xd9\xc1\xdb\x45\x03\xf5\x57\x79\xbf\xd5\x7f" + "\x06\x88\xef\x81\xa2\x66\x20\xbe\xc1\xde\x76\x92\xf3\xde\x48\x36" + "\x4e\x3c\x89\x77\x0b\xd2\x11\x5f\xa2\x53\xea\x21\xf6\xc6\x3c\xbe" + "\x57\x5d\x77\x3e\xff\x82\x79\x63\xf8\x57\x34\xaf\xe2\xa4\x74\xc5" + "\x0b\xd8\xb8\x76\x7a\x67\x76\xca\xc1\x8a\x9f\x63\xe3\xf2\x69\x4e" + "\xec\x89\x3b\x29\xdd\x3b\x9f\xbb\x22\x0b\x47\x80\x49\x84\x3d\xee" + "\x69\xb4\xfa\xc0\x05\x4f\x4c\xd6\xfa\x88\x27\x42\xfa\xbf\x19\x7c" + "\x9c\x89\xbf\x31\xb4\x3e\x51\x5e\xbf\x4a\xfe\x80\x39\xfd\x5e\x8e" + "\x8f\xf3\xad\xa9\xa0\x77\xd2\xb4\x26\x4a\x9c\x7b\xf6\x44\x49\xc8" + "\xdc\x9b\x7b\x0b\x5f\x57\xf3\x09\xe6\xbb\x20\x56\x60\x24\x33\x56" + "\xab\xd3\x27\xea\x8a\x4f\xd0\xbb\x20\xd1\x1e\x2c\xf4\x87\xfa\xc7" + "\x27\x1c\x4a\xdf\x2d\x24\xbc\x4d\x69\x0f\xac\xcb\x89\xef\x82\x90" + "\x76\xe6\x09\xde\xff\x0f\xf4\x6b\x17\x16\xd0\x3e\x2a\x0d\x26\x5b" + "\x38\x86\x16\x24\x36\x7b\x10\x37\xf9\x84\xff\x05\xaf\x22\xcd\x06" + "\xda\x73\x88\xcf\x83\x4f\xc2\x82\x8c\x80\x1d\x4c\xcd\x6e\xbe\xa7" + "\xca\x8c\x18\xe1\xb8\xa5\x76\x63\xbc\x58\x8f\xe4\x09\xc9\xa3\x50" + "\x91\x39\xd1\xb4\xe4\x7f\x02\x62\x3d\x05\x61\x61\x41\x2a\xad\xcd" + "\x18\xd2\x09\x83\x89\x97\x82\x21\xa7\xbf\x0d\x5a\xfc\xa1\x63\x9e" + "\x05\xef\xea\xd7\x7d\x01\xb5\xff\xdb\x5c\x90\x39\x46\xab\xdb\x05" + "\xbc\xfd\x57\xde\xeb\xa0\xee\x7d\xda\x74\x99\x31\x5a\xdd\x3f\x41" + "\x7b\xb3\xc2\xbe\x27\xeb\x2a\xfd\xea\x10\x8e\x67\x16\x79\xf8\x7a" + "\xaf\x4c\xb4\xff\x27\x32\xcf\xe7\x07\x99\xe9\xab\x43\x41\xa4\x95" + "\xd7\x05\xa3\xdf\xca\xac\xd0\xcc\x19\x0d\xe7\x73\x46\x8b\x8e\xc1" + "\x93\xf2\xbb\x9f\x27\x3f\x0a\x29\xdf\xde\xf0\x7d\x83\x4c\x7a\xff" + "\xb3\x48\xdf\x67\x64\xb6\xeb\xf7\x0d\x32\xfd\xb2\x5f\x58\xc4\xa2" + "\x42\x71\xf0\xa4\x05\x75\xcc\xd3\x28\x63\x58\x9a\x0b\x0d\x3f\x86" + "\x7d\x32\xb5\x77\x0c\x9b\x4f\xfe\xe0\xc9\xa4\xde\x31\xac\x5b\x6f" + "\x0c\xeb\xd2\xd1\xe7\x93\xe5\xfa\xfa\x7c\xb2\x5e\x7f\x0c\xfb\xe4" + "\xbb\xa2\x9d\x7f\xd2\xad\xd5\xf3\x93\x87\xfa\xde\x09\x67\xee\xbd" + "\x74\xfd\xe1\x85\x29\xfd\xfb\xc3\x0b\xdf\x13\xba\x5a\x18\xd0\x96" + "\x6d\x61\x86\xbe\x6f\x5f\x98\x17\xbe\x3f\xbc\xb0\x3c\xbc\x6f\x5f" + "\xb8\xa7\x7f\x7f\xd8\x3a\x28\x84\xe6\x60\x6f\x5f\x49\xd3\x37\x5b" + "\xd8\x2e\xe4\xb4\x88\xfa\x73\x11\x2a\x7a\xbf\x16\xef\x58\x66\xe4" + "\x87\xbe\xed\x38\xf9\x34\x05\x33\xe1\x64\x42\x67\x33\x5d\x5f\x09" + "\x51\x68\x03\xef\x7b\xed\x8b\x7a\xf1\x4f\xeb\xf8\x28\x1f\xf2\x91" + "\x61\xd7\xd3\x49\x4a\xf9\xa8\x1c\x8b\x36\x9e\xef\x7d\x69\x84\x05" + "\xd2\xb7\xf7\x93\xc7\x22\xde\xff\x23\x1e\xe7\xd7\xd9\x22\x4f\x88" + "\x8d\x79\xc4\x3a\xdc\xac\x3f\x0a\xbd\x65\x85\x8c\x65\xb3\xcc\x7c" + "\x4f\x5f\x58\x7f\x9b\x95\xa4\x8f\xd1\xac\xd4\x5e\x7f\x9b\xcf\xf9" + "\x6e\x08\x89\xcf\x11\x3a\xc8\x72\x04\xa3\xd4\x73\xdd\x59\x25\x5a" + "\x9f\x94\x95\x13\x92\x2e\x64\xfc\x97\x45\x3e\x31\xdc\x1a\x87\x90" + "\xf6\x26\xcb\x1d\xbe\xbd\x59\xbc\x4e\xd4\xff\xa9\x90\xf7\xcb\x8b" + "\xcd\xe7\x6f\x6f\x16\x87\xa9\xff\xe2\x54\x6d\x7b\xf3\x54\xc8\x3b" + "\xfa\xc5\x39\xfa\xed\xcd\xe2\x12\xc5\xcf\x08\xbf\xb1\xf8\xf0\xc5" + "\xf9\x9b\xc5\x0d\x5a\x7f\xb3\xb8\xee\x42\xfe\xe6\x40\x3f\x7f\xb3" + "\xd8\x1f\x57\xad\x57\x97\xa7\xe2\xf5\xfd\xcd\x53\x63\x84\x0e\x9f" + "\xda\xa8\xf5\x37\x4f\xcd\xd0\xea\x70\x71\x88\x0e\x9f\x0a\x79\xff" + "\xbd\xd8\xfc\x6d\x7d\x52\x44\x44\x84\x14\x61\x90\x0c\x11\x40\x1f" + "\x89\x32\xc0\xe0\x08\x63\x44\x24\x5e\x83\xe4\xdf\xc1\x52\x84\x64" + "\xc4\x2b\x52\xfe\x1d\x14\xf2\x3c\x98\xd2\xe2\x65\x94\x7f\x23\x43" + "\x9e\x07\x5d\x20\x7e\xb0\x9c\xaf\x92\xbf\x31\xe4\x39\xf2\x02\xf1" + "\x83\xbe\x63\x7a\xe8\xf7\xac\xdd\x07\x39\x6b\xf9\xca\xc5\xb9\x4b" + "\xb3\xf9\xba\xf6\x25\xd6\xc5\x4f\x3f\xbd\xa4\xa0\xc0\x5a\xb8\xc2" + "\x7a\xef\x3d\x0f\xdf\x3a\xc5\x2a\x96\xc7\xe7\x4e\x1d\x9d\x1d\x0d" + "\x73\x56\xe5\x53\xc4\x9c\x79\xb3\x32\xac\xe9\xf7\xde\xa3\x8d\x54" + "\xd8\xf0\x65\xf0\xe7\xe3\xa2\xb2\xbd\x94\x4d\xc3\x01\xca\x87\x73" + "\xbf\xd3\x4e\x7b\xcf\xc5\x78\x22\xe7\xbf\x0e\xd6\xe3\x78\xa2\xbb" + "\x98\xd1\xbe\x8a\xa3\x90\xfd\x12\x55\x62\x6c\x5d\x09\xe4\x3d\x43" + "\xe7\xa9\x64\xbf\xca\xfe\xe0\x06\xeb\x03\x20\x1d\x85\x65\x5f\x36" + "\xe2\x28\x9a\x9e\x9d\xed\x7e\xb0\x16\x53\xdf\x36\x67\x03\xc6\x19" + "\xd8\xdd\x41\x0c\xf3\xc8\xfb\xf3\x7f\xfc\x32\x0f\xfb\x43\x89\x42" + "\x17\x77\x0c\x96\xcc\x64\x7f\x60\xfc\x99\xce\xad\x11\x74\x4b\xae" + "\x0a\xda\x9f\x6e\x23\xbf\x50\xbd\x0d\x8c\x35\xdb\x00\x76\x0e\x03" + "\xd3\xce\xe1\x74\xd6\xec\x92\x18\x65\x5d\xf6\x26\x7c\x76\xc1\x32" + "\x17\xe5\x4d\xb4\x41\x29\x5b\xe2\xf4\xc3\x34\xf4\xc9\x7d\xeb\xb8" + "\x97\xc4\x48\x48\x97\xf6\x57\x88\xf3\x45\xbb\x4c\xce\xa2\x12\x88" + "\x0b\xb0\x6f\xc6\xa5\x82\xa1\x05\x2d\x63\xb5\x9f\xf9\x1d\xf9\xc7" + "\x29\xff\x4d\x71\xab\xd9\x37\x4e\xec\x37\xce\xe9\x2c\x66\x5b\x4e" + "\x80\x11\x6d\xda\xe0\xc8\xa7\xfd\x14\x4b\xf2\x6a\xce\x81\x11\x65" + "\x90\x70\x1c\x9e\xa9\x2b\x9a\xc3\x02\xc5\x73\xc0\xf8\xa1\x8d\xf6" + "\xbc\x7e\x3d\x72\xcb\x5f\xc0\xf8\x56\x77\x89\xd4\xcd\x2c\x50\x54" + "\xc8\x3a\x18\x9d\x41\xed\x61\x3e\x5a\x73\x7b\x30\x2b\x40\x34\xc3" + "\xbc\xc5\x16\x68\x29\xf4\xc0\xba\x23\xcc\x57\xfa\x17\x71\x66\x45" + "\x73\xa7\x87\xf6\xd0\x9a\xd6\xcd\x81\x88\x63\x19\x20\x35\xe7\x54" + "\x81\x33\xd3\x03\x45\x47\x58\xc7\xc1\xac\xbf\x42\x4b\xce\x3e\x58" + "\xd4\x06\xd2\xc1\xf6\xcf\x80\x9f\xa3\xbc\x65\x64\xde\xfa\x33\x60" + "\x59\xb7\x94\xc2\xce\xc0\x9a\x75\x10\xbb\xe6\x23\x1a\x0b\xb5\x61" + "\x3e\x27\xe0\x89\x43\x60\x40\x7e\xd2\xda\xcf\xc0\xb2\xf6\x71\xda" + "\x6b\x9e\x02\xd5\xeb\xc1\xc2\x8a\x13\x63\xba\x8b\x13\xcd\xdd\x2c" + "\x11\xcb\x91\x18\xdf\x92\x87\xf4\xed\xef\xc1\x90\x36\x88\xff\xc3" + "\xf1\x36\xa9\xea\x34\x24\x58\xe7\x92\xfe\x9f\xa9\xae\x3e\x8d\xf4" + "\x65\x3e\x6b\x10\xd3\xaa\xd3\xf8\xa3\x7c\x93\x9d\x19\x3e\x08\x22" + "\xaf\xaa\x6e\x48\xa8\xee\x06\x4b\x70\x93\xcf\x4a\xb2\xe8\x29\xeb" + "\xa0\xf9\x92\xc1\xef\x3c\xd5\x60\x74\x1e\xec\x84\x66\x4f\x37\xb4" + "\xc0\x27\xe0\xb4\xfd\xcd\xf1\xd6\x53\x0d\x91\xd8\x8f\x34\x38\xd6" + "\xd0\xda\x77\x81\x99\xe2\x66\x3a\x3f\xaf\x04\xb6\xae\x87\x98\xbc" + "\x35\x30\xf8\x38\x86\x73\x9f\x53\xfa\x29\x8e\xbd\xfe\xe6\x58\xc3" + "\xf7\x81\x2f\x73\xad\x6f\x86\x88\x16\x4f\x15\xed\x37\x96\x02\x43" + "\x46\xe6\x39\x3d\xad\xe0\xcc\xfb\xc2\x11\x8c\x19\x99\x51\x1e\x04" + "\xd3\xdb\x67\x5b\x25\xa7\xf1\x2c\x38\x33\x3c\xf0\x3e\xe6\xcd\xb6" + "\x8c\xa4\xf1\x4f\x4a\x8b\xc7\x47\xe7\xee\x24\xb1\x2e\x4b\xf4\xd6" + "\x7c\x18\x53\x73\x1a\x46\xed\x3e\x0d\x89\xcc\x9b\x28\xd1\xde\x6e" + "\x3a\x2f\x6d\x37\xfe\xc6\xe0\xd8\x0b\xeb\xcb\xf7\x78\xb3\x58\x79" + "\x8f\x77\x4f\x22\xd4\x76\xf7\xed\xf1\xee\xee\xea\xdb\xe3\x8d\x58" + "\x32\xd3\x3e\x6f\xb4\x8b\x26\xc2\xf3\xd6\x93\x60\x7c\xf1\x24\xc0" + "\xb8\x12\x09\xac\x4f\xd1\x59\x1f\x39\x2f\x38\xb3\x4f\xf0\xfb\xa3" + "\x90\x33\x06\x7f\x63\xf0\xc2\xf1\x5b\xce\x08\xaa\x5f\xbb\x8c\x5b" + "\x0c\x93\x30\xec\x0a\xfc\x8d\xc0\xdf\xd8\xe2\x6a\xe6\xc6\x3c\xe8" + "\xcc\x99\x68\xc2\xaf\xbc\x9f\xdc\xe5\xb5\xe7\x18\x5d\xf0\xf2\xbb" + "\x0a\x8e\x85\x3f\x5f\x62\x7e\xff\xd8\x09\x3a\xd7\xdc\xcd\xcb\xd3" + "\x93\x63\xa0\x33\xce\xe5\x70\x2a\xc3\x32\xca\x17\xf3\x4f\xc7\xdf" + "\x38\xbc\xd0\x2e\x7f\xdc\xae\xa4\xed\xea\xc9\xa1\x3c\x97\x60\x38" + "\x53\xc2\xb1\xbe\x46\x8a\xfb\xdd\xb1\x13\x92\xa0\x49\x94\x90\xa7" + "\x4f\xe6\x8f\xb6\x9e\xbd\x9f\x6c\xba\x4b\x8a\x63\x07\xb2\x27\x42" + "\xf5\x70\xd6\xba\x7b\x07\x6b\x14\xb6\x96\xb3\xc7\x05\xdb\xf9\x79" + "\xbf\xd8\x66\x37\x96\x63\xdc\x01\x2b\x00\xc9\xa5\x31\x8b\xd6\x93" + "\xe6\x34\xb9\xe0\xb2\x51\xea\x3a\x30\xfb\x53\x0d\xd4\x6e\xfe\x7a" + "\xbd\x23\x92\x49\x4f\x37\xb4\xb8\x3a\xe1\xad\xee\x8e\xc8\xe2\x3f" + "\x81\xe4\xf4\x1f\x85\xf1\xf1\x60\xa1\x39\x98\xda\x1d\xcc\x85\xbf" + "\x1d\x78\x75\x22\x4e\xae\x39\x0e\x4b\xaf\xb8\x25\x1e\xe2\xff\x6c" + "\x03\xd9\x1f\x2d\x1d\xab\xf2\x47\xff\xd1\xdc\xde\xa0\xf2\x45\xcb" + "\x96\xf4\xf7\x45\xb9\x8b\x85\x2f\x62\x7e\xe1\x7b\x02\x2e\x39\x7c" + "\x4e\x48\xb8\xbc\x5f\x25\x77\x42\x48\xb8\x4f\x0e\xbf\x26\x24\xdc" + "\x2d\xc2\x9f\x7b\x52\xf1\x75\x2d\x54\x8e\x55\xe4\xeb\x9e\xbb\x87" + "\x7c\x5d\x4b\xb6\xec\xeb\xf8\x5e\xcc\xe7\x46\xb3\x5f\x94\x00\x9d" + "\xa3\x73\x0c\x9e\x0d\x50\xf9\xd9\x1f\x40\x29\x7b\x14\x86\xbd\x47" + "\x61\x15\x9f\x80\x11\x2f\xee\xe7\x98\x3d\xfb\x3a\xf2\x73\xe4\xe3" + "\x68\x1f\xcc\xae\xe1\xac\x6d\xd7\x0e\x76\xa8\x7a\x07\x3b\xe8\xb5" + "\x3f\x3b\x46\xf1\x77\x3f\xc5\xb0\x72\x0c\xfb\x29\xc6\x93\xdf\x23" + "\x99\x34\x67\x34\xd0\xb9\xa2\xed\x88\x31\x6b\x9c\x01\xf2\xb6\x20" + "\xe6\xe9\xbc\xab\x8d\x28\x5f\x67\xa1\x87\xef\x39\xe1\xe7\x81\x4b" + "\x49\xe8\xa3\xda\xc9\xde\x86\xbf\x18\xa4\x79\x89\xbf\xc2\x7a\x0f" + "\x3b\x4e\x7b\x53\xa8\x0c\x8b\x56\x3f\x40\xe7\x5b\x1b\x1a\xb1\x77" + "\x44\xe7\x10\xd0\xde\x19\xf4\xbb\xc6\x0a\x2c\x93\x38\xdf\xf7\xd9" + "\xfd\xd8\x73\x49\x11\xba\x5e\xc6\xcf\xcf\x3f\x0a\x4b\x7d\xcc\x8e" + "\xbe\x10\xeb\x16\x17\x28\x01\x3a\x8b\x05\x6d\x94\xe6\x59\x73\x76" + "\xe1\x55\xa1\x9c\xc7\x42\xdf\x52\x40\x1a\x67\x9b\x0f\xa8\xcc\x2e" + "\x78\x76\x46\x73\x51\x03\xa5\xef\x20\xd9\x30\x7b\xb1\xc2\xc3\xc0" + "\xcf\x73\xc1\x31\x3c\x9d\xe7\x82\x74\x7c\xce\x90\x45\x77\x98\x9a" + "\x33\xdd\x40\x7e\xde\xd9\x81\x3c\x8a\x8e\x0a\x1e\xc8\x8b\xa1\xdf" + "\xd7\xc4\xc9\xfc\x63\xd7\xb1\x6f\x90\xff\x7e\xd2\x17\x9d\xcb\x45" + "\xeb\x92\x50\x2e\x31\x74\x36\x83\xe8\x77\x3e\x3b\xb5\xf6\x13\x00" + "\xf9\x6c\x31\xc4\xdb\xb3\xc9\x74\x76\x17\x9d\x27\xc6\xcf\x12\x93" + "\x26\x02\x5b\x95\x18\xd3\x7b\x9e\xd8\xf7\x70\x96\x18\xca\xdf\x52" + "\x23\xb1\x7d\x58\xfe\x64\x3a\x4f\x0c\xcb\x5f\x4d\x38\x94\xeb\x94" + "\xf2\xb3\x27\xb8\xcc\x37\x52\xd8\x56\x3b\x6b\x52\xf4\x4f\xf5\xa5" + "\xba\x60\x5c\x8e\xe8\x0f\xb2\x56\x17\xe4\xa6\x50\x3c\x86\xcd\x27" + "\xfa\xf1\xe8\xc7\x9c\xd9\x01\x78\xe7\x58\x40\xda\xba\x06\x8c\xc2" + "\xa7\x2d\x7b\x9c\xd2\x0b\x9f\xb6\xcc\xdc\xe7\xd3\x96\x45\x0a\x9f" + "\x26\x64\x2c\x7c\x5a\xee\x39\xe1\xd3\x72\xbf\xe1\xeb\x87\xd0\xa7" + "\x51\x1c\xf9\x35\xc5\xa7\xed\x1e\xce\x9a\xc8\x77\x78\xed\xb9\x2e" + "\xc5\xb7\x6d\xc6\x30\xf2\x1d\x54\x46\xe1\xa7\x9e\x9b\xcc\x3e\x4d" + "\x04\xb1\x3e\x93\xee\x73\xe8\xbc\x8c\x0e\xf9\x9e\xda\x91\x87\x84" + "\x8f\x5b\x36\xb1\xcf\xc7\xe5\x36\xf4\xa5\x25\x1f\xb7\x6c\x96\xf0" + "\x71\x22\xbc\xf6\x09\xf2\x71\xcf\x4d\x26\x19\xc8\xfc\x25\x7a\x6f" + "\x26\xd3\x93\x1c\x53\xd4\x3e\x4e\x6b\x5f\xcb\xca\x15\x1f\x47\xbe" + "\x0d\x9f\xab\x5d\x10\xdd\xc4\xed\x0d\xe9\x2a\x51\xe6\x8a\xdd\x91" + "\x0e\xa8\xce\x74\x4e\x3e\xc9\x6d\xfa\x09\x18\x2c\x9f\x53\x23\xd7" + "\x7b\x59\x9b\xb2\x27\x13\xe5\xef\x0a\xed\x33\xe3\x73\x6f\x3f\x0d" + "\x75\x7d\x1d\x9d\xe1\xe8\x2c\x39\x0a\xce\x2a\x56\xd2\xe2\x3f\x02" + "\xc1\x17\x9f\xfb\x92\xf4\x8a\xe3\x8b\x41\xf4\x4b\x7e\xe7\x38\x2c" + "\xbf\x6a\x91\x87\xcf\xd7\x7f\xb9\x55\xc2\x38\x1b\xdc\xa5\x8a\xe3" + "\x7b\xec\x55\xe9\xc6\xaa\xe2\x1e\xa2\x38\x9a\x63\xc4\x7b\x08\x37" + "\xa7\x30\x80\x72\xbc\x7a\x9e\x72\xbc\x77\x9e\x72\x1c\xe6\xe5\xc0" + "\xfe\x16\x8e\x8f\x86\x9e\x84\xe5\xf2\xde\x10\xbc\x74\xf3\x59\x11" + "\x25\xc7\x47\xa8\xe2\x55\x79\xad\xb8\x49\x27\xbd\x2a\xbf\x15\xb3" + "\x2e\xc0\x7f\xe9\x05\xf8\x6f\xba\x00\xff\x37\xc8\xf7\xd1\xbe\xbf" + "\x80\x5d\x4b\x37\xce\xcf\x6d\xaf\x89\xce\x8e\x42\xba\xff\x92\xdf" + "\xb7\x7c\x59\x3c\x82\x8f\xff\xf8\x79\x41\x5b\x30\x9e\x9f\x93\x8b" + "\x7e\x79\xc6\x6a\x00\xb1\xa6\x4f\x49\x93\x17\x19\x5a\xb6\x21\x7e" + "\xa5\x6c\x3c\x7e\x74\x68\xd9\x30\x7e\xac\x2a\x7e\x66\x9f\xce\x57" + "\x38\xce\x33\x8f\x14\xe3\xac\x02\xfe\xed\x98\x03\x38\x6c\xa1\xbd" + "\x3e\x95\xbd\xef\x46\xf2\x10\xff\xcb\xf8\xbb\x1d\x79\x5f\x71\x27" + "\xfa\xf4\xeb\xe8\x1c\x50\xea\xf3\xca\x7b\x41\xae\xc4\x76\x64\x18" + "\x9d\x13\x43\xf3\xe9\x8b\x02\xe9\xd2\x81\x22\xb2\x9d\xbc\x36\x25" + "\x6d\xb8\xb9\x47\xca\x57\xce\x93\xef\x93\xf2\xda\x9f\x8f\x51\xd2" + "\x10\x6f\xda\x1b\x84\xfe\xff\x3a\x7e\xfe\x9a\xbf\x93\xfc\xed\x95" + "\xd8\x3f\x1e\x26\xf2\xc9\x02\x91\xcf\xf3\x29\x2e\x58\x6e\x3b\xdf" + "\x3e\xac\xf0\xf5\x7b\xbe\x68\xe0\xf5\x03\xb9\x7e\xcf\x37\x5c\xa0" + "\x7e\xe7\xcb\xd7\x33\xf0\x7c\xcd\x72\xbe\xf9\x49\x03\x97\x6b\x7e" + "\xf6\xc5\xcb\x35\x49\x96\x6b\x7e\xd5\x05\xe4\xaa\x97\xcf\xc1\x8b" + "\xcf\xc7\x2a\xe7\x53\x00\x7a\xf9\x00\xff\x0b\x7b\x9e\x90\x49\xf9" + "\x76\x0b\x7d\xc7\x48\x7c\xa3\xa1\x20\x55\xfd\x8d\x2a\xf1\x7d\xa3" + "\x82\x4c\xe5\x1b\x55\x7d\xfb\xcc\x0a\x56\x2f\xaa\xa3\x7e\x08\x0b" + "\xba\xa0\xa0\x88\xe6\x02\x67\xac\x13\xe7\x17\xca\x69\x2a\x2e\xf0" + "\x6d\x2c\x3a\xc3\x87\xce\x8a\xf1\x30\xc6\xcf\x8a\xf1\x88\x73\x00" + "\x0b\xfe\x8b\xf6\x0c\x8a\x35\x45\xfc\xd0\x2f\xe2\x85\x63\xd8\x02" + "\x7e\x7e\x3b\x9d\x2d\xdf\x55\x2c\xd3\x5f\x4d\x6d\xa8\x42\x53\x08" + "\x0a\x8d\xee\x9c\x64\x99\xd7\x5c\xbf\x3e\x49\xb3\xbf\x71\x66\x7e" + "\xfe\x8a\xfc\x29\xd6\x82\x65\x4f\x8d\x2d\x28\x5c\x5c\xf8\x42\x01" + "\xdf\x08\x1f\x0d\x18\x60\x2d\x5c\xba\x6c\xc9\x8a\x17\x0a\x13\x57" + "\x2d\x5e\x2a\x36\xce\xdf\x84\x84\x6a\x22\xd0\x7c\xd3\xc4\x82\x3e" + "\xa8\x95\x49\xfc\x8c\x8b\x4e\xaa\x13\x9d\x75\xa2\xec\x0b\x6e\xb4" + "\x00\x78\x70\x7c\x84\x65\xac\x77\xc1\x63\x6e\x45\x8e\x74\xfe\x22" + "\xf6\x93\x2c\xc7\xa1\xf0\x8f\xa4\xfb\x34\xec\xf2\xd6\x8a\x73\x2b" + "\xf8\xd9\x03\xce\x42\x0c\x68\x01\x93\x63\x25\xcd\xf3\xbe\x30\x39" + "\x68\x2f\x4c\xe4\xe7\x49\xae\xa1\xf1\xf7\x0b\x4f\x2a\xfd\x12\x7a" + "\x6f\x25\xde\x33\x5f\x37\xed\x28\x14\x6e\xa6\x7c\xc9\x6e\x6a\xb0" + "\xff\x4b\xbc\x98\xbd\x30\x85\xfa\xc0\xf8\x6c\xf2\xda\x5f\x48\x54" + "\xfa\xbe\x58\xde\x18\x16\xe5\x45\xb9\xbd\x90\xf9\x9f\x66\x37\xc8" + "\x7b\xc9\x4d\x35\x62\xdf\xb8\x11\x69\xe7\xf7\xd2\xda\xe9\x6c\x65" + "\x2f\xb5\xd3\xba\xef\xca\x59\xb4\xa7\x35\xd8\x93\x11\xa9\xae\x33" + "\x8e\xd9\x51\x3f\x2b\x63\xb1\xee\xf1\xa4\x6b\xf9\xbc\x93\x41\x58" + "\xf6\x33\xe2\x7c\x67\x4f\x2b\x86\x0d\xc2\xdf\x0e\xd2\x29\x9d\xb1" + "\x80\x71\xb4\xd6\xc7\xd0\x52\x74\xca\x71\xc0\x72\x14\x71\xfd\x02" + "\xcd\x5d\x8f\x12\xfb\xe2\x90\x1e\xf3\x70\x96\x74\x43\xa3\x95\x39" + "\x68\x0e\xd0\x05\x2b\x47\x35\x5a\x3d\xc0\x22\x16\x7c\x49\xe9\xd0" + "\x2e\x2c\xc5\x36\xea\xfb\x60\x38\xdf\xff\xb7\xd2\xa2\xc8\xbc\xd0" + "\xca\x4e\x10\x4d\xb8\x79\x6b\x6a\x83\xb7\xf2\xb6\xe4\x34\xd0\x1a" + "\xaf\x76\x58\x99\x1c\xea\xef\x47\x67\x4f\xb1\x66\x2f\x2e\xb4\xe6" + "\x2e\x5d\xbe\xc4\x9a\xbd\x34\xdb\xba\x7c\x45\xa1\xf5\xc7\x2b\x68" + "\x02\x89\xa6\x8c\x34\x98\x08\x52\xfd\x56\x65\x44\x2a\xef\xc8\xbb" + "\x56\xe5\x0c\xc2\xfa\xa3\x4c\x56\xfd\xac\xcb\x9b\x33\x58\x2b\x93" + "\x55\xf2\x59\x5c\x2b\x71\xfc\xf7\x42\xae\xd8\x5f\x18\xd1\x81\xcf" + "\x58\xff\x95\x49\x5a\xdb\x5b\xf5\x81\x4c\xeb\x51\x68\x39\x2e\x46" + "\x1e\xef\x8d\xdb\x2a\xe3\xb1\x56\xec\x83\xe6\xe7\xea\xd4\xf2\x3d" + "\x02\xab\x12\xc3\xa6\xa1\xb3\xc4\xd6\xc0\xd3\x27\x61\xd5\x50\x66" + "\x5f\x99\x29\x63\xc8\x14\x2c\xf5\xb8\x64\xfc\x20\x26\x56\xe5\xf4" + "\xc7\xcf\xaa\x46\xc2\x0f\xf3\x66\x98\xf8\x7a\x12\xbf\x0f\xfd\x14" + "\x3e\x63\x7b\x8a\x65\x3f\x48\xf5\xf0\xac\xca\x30\x15\xef\xe4\xed" + "\xf5\x57\xf4\x6e\xf6\x80\x8f\x9f\x05\x15\x85\xd8\x40\x1d\xad\x7a" + "\x57\xd1\x91\x42\xaf\x6f\xc3\x1c\x2f\x5a\x8c\x71\x79\xda\xae\xe0" + "\x18\xc3\x7e\x01\x96\x49\x52\xfa\x05\xd4\x06\xb8\xc0\x36\xa6\x70" + "\x1d\x63\x5e\xbb\xcd\xaa\xc2\xc1\x49\x3d\x1c\xa0\x6e\x9f\xce\x5d" + "\xf1\xf4\x73\x68\xe8\xf9\x4b\x0a\x9f\xce\xa1\xb3\x33\xc8\x0f\xf0" + "\x83\x39\x46\x67\x5b\x5f\x28\x58\xf2\x74\x34\xe8\x51\xf5\x46\xaa" + "\xf5\x6f\x0e\x22\x5e\xbb\xba\x32\x22\x69\x0f\x87\xd8\xb3\xb1\xfa" + "\xaf\x5d\x05\x38\xee\xd1\xe8\x7d\xf5\x61\xa7\x25\x09\xfb\x89\x49" + "\xc0\xfb\xfc\x28\x33\xb1\x0e\x61\xcd\x35\x24\x87\x2e\xc9\x80\xed" + "\x81\xed\x88\x82\x01\xbc\x47\x6c\xaf\x6a\xed\x5b\x03\xb2\x26\xa1" + "\x4b\x8a\x3c\x42\xfe\x47\xac\x37\x39\x8e\x7e\x20\xae\xf6\x28\xac" + "\x4e\x21\x9d\xd6\xf0\xf6\x64\x75\x82\x92\x66\x4b\xef\x3e\xea\xd5" + "\x1b\x15\x9c\xa8\xd2\xc4\x52\x98\x18\x3f\xdb\x26\x93\xce\x99\xd0" + "\xbd\x51\xa1\x43\xb9\xb2\x5a\xee\x47\x56\xe7\x85\xfa\x86\xff\x34" + "\xd3\x3b\x77\x51\x1e\x8e\x3f\x93\xa7\x81\x9f\xcb\x82\x7d\x3c\xe4" + "\xbd\x4e\x5e\xff\xd2\xca\xdb\x74\x1b\xf2\xf2\x09\x5e\x98\xd7\x42" + "\x25\x2f\x16\xe5\x69\xa8\xe5\x38\x5b\xdd\xda\x37\x27\xb9\xba\x88" + "\xc6\xe6\xac\x2b\x63\x10\xea\xf3\x5d\x8e\x2d\xbc\x2f\xbc\x4a\x9c" + "\x11\x47\x78\xa3\x7a\x12\xae\xfa\x30\xb5\xc6\xac\xe8\x9b\xea\x8c" + "\xe9\x1a\xad\xfc\x1c\xe1\x35\x89\x8a\x2c\xc3\x9d\x65\xc3\xed\xd6" + "\x84\x65\xf1\x0a\xdb\xe5\xe3\x4a\x71\x7e\x11\xed\xa3\x89\xc0\x32" + "\xba\x8e\xc1\xda\x3b\x69\x6f\x40\x9c\x8f\xc6\x69\x1e\x17\x9d\xcd" + "\x20\xf6\xba\xaf\x29\x45\xfe\x45\x7d\x7b\xdf\xd7\x60\xfb\x6f\x2b" + "\x12\xba\x5b\x53\xaf\xb2\x3d\xb7\xbc\xde\x60\x30\xc9\x88\xfc\x99" + "\xd3\x36\x93\xdb\xab\xd8\x57\xbc\xa6\x55\x49\xc7\xcf\x31\xf0\x8b" + "\x36\xf1\x24\xac\xa1\x79\x1e\x37\x95\x0f\x65\x9d\x47\xf9\x53\xfd" + "\xa8\xcd\xe5\xb8\xb1\xd0\xb7\x56\xd6\xc6\x68\xcb\xb0\x36\x41\xe1" + "\x25\x78\xaf\x1d\xa3\x3c\xd3\xb9\x66\x2e\x28\x6a\x68\x4c\x40\x9b" + "\xf2\xf0\x3a\x5c\xd6\x88\x4d\x6a\xa3\x87\xd3\xcd\x57\x64\x88\xe1" + "\x25\xf8\x8c\xfd\x9f\xc2\x1c\xf1\xce\xc9\x2b\x7f\xe7\xa9\x68\x3f" + "\x9d\x99\x55\x6c\xa5\x73\x0f\x93\x85\xbf\xe1\x67\xf5\xf0\xb8\xe7" + "\x65\x9b\x8d\xa2\x3d\x48\x7c\xdd\x8d\xc7\xcf\x7d\x83\x38\xdb\x01" + "\xe3\xd1\x46\xbc\xe2\x7b\x4f\x51\x72\xd9\x9a\x7a\xf3\x40\x4c\x34" + "\xf2\x77\x9c\x6b\x1b\xc4\x59\x29\x83\x91\x76\x6d\x87\xa2\xbf\x8d" + "\x3b\x30\x0c\x79\x62\x3a\x53\x23\x3f\x8b\xac\xc8\xa8\x94\x57\x8e" + "\x93\x38\x1e\xb8\x0c\x8a\x7a\xed\xbf\x6b\x18\xa7\x4d\x52\xf2\xe1" + "\xb4\x48\x47\xf4\xf4\xcd\x4f\x8c\x9b\xdd\xcb\x47\x9c\xd1\x42\xdf" + "\xd1\x33\x34\xd6\xf1\xb8\x9c\x3e\x5f\xb5\x96\xbf\x33\xe2\xeb\xe2" + "\xb0\x1e\xee\xb5\x39\x51\x5c\x07\x56\xa0\xef\x90\x18\x89\x9f\xc0" + "\x62\x51\xb5\x92\x26\xc2\x40\x72\x2c\xda\xab\xe4\xad\xf0\xa0\xf2" + "\x9f\xd7\xe7\x89\xba\x18\xc9\x46\x88\x96\xf8\x72\x4c\xf0\x6f\x7c" + "\xad\x9b\xc4\x31\xc8\xeb\xb9\xce\xa4\xd6\xb5\xe8\x8b\xad\x4b\x50" + "\xe1\x01\xcb\xf3\xff\x88\x7b\x1f\xb8\xb8\xaa\x6b\x5f\x7c\xcf\x30" + "\x24\x03\x02\x33\x2a\xc6\x49\x24\x71\x54\xbc\x77\xb4\x51\x51\xc9" + "\x7d\xa9\x9f\x58\x69\x8d\xf7\xa6\x7d\x6a\xd2\x36\xde\x47\x6f\x53" + "\x21\x06\x2c\xa9\x31\x19\x09\x21\x93\x48\x18\x98\x10\x3a\x20\x10" + "\xd4\x68\x31\x21\x04\xdb\xd4\xc6\x1a\x2b\xbd\x8d\x2d\xb1\x51\xc7" + "\x06\x5b\x54\xc2\xa0\x8d\x15\x15\xeb\x88\x88\x84\x90\x38\x84\x81" + "\x99\xc0\xcc\xd9\xbf\xef\xda\xfb\x1c\x66\x12\x21\x36\xb7\xef\xf3" + "\x7b\x7c\x3e\xc3\x39\x67\x9f\x7d\xf6\x9f\xb5\xd7\x5e\x7b\xad\xb5" + "\xd7\x5e\x6b\xcb\xe4\xf8\xfb\xd8\x96\x15\x72\x2d\xd9\x92\x15\xd3" + "\xc6\x2c\x3c\x2f\x9b\x1c\x87\x6a\x31\x46\x14\xf7\x69\xca\x38\x8a" + "\x62\xae\x20\x8f\xc2\x45\x3b\x69\x3c\x20\x8b\x2d\x64\x6d\xa0\x7b" + "\x34\x57\x00\x13\x6a\xe3\xbb\x84\x57\x28\x77\xdf\x99\xb8\xb9\xa5" + "\x35\xa6\xbd\x3a\xa2\xeb\x48\xeb\xd0\xf2\xa0\x7d\xc2\x96\x45\x83" + "\x27\xde\x0d\x4c\x8e\xe3\x4d\x22\x6f\x48\x6b\xe7\x57\xac\x19\x2a" + "\xac\x4a\x6f\x94\x75\x94\x66\x68\x75\xe0\x7e\x11\xe6\xc0\x97\x78" + "\xd5\xfb\x36\x15\xe5\x4b\xe7\x49\xb4\xc8\xaf\x5c\xf5\x40\x7e\xde" + "\x7c\xeb\xca\xfb\xc9\xcd\xd2\xfa\x35\xf9\xf9\x76\xb1\x49\x74\x26" + "\x1f\x98\x2a\xea\x03\x1c\x24\x2f\xeb\x3c\xf8\xb8\xb4\x8f\xa1\x79" + "\x41\xf3\xdd\x4f\xf3\xfd\x70\xc9\x29\x21\x9b\x78\xcb\x6e\x62\xde" + "\x10\x2f\x23\xfe\x5d\xd0\x3e\xea\xbf\x25\x20\xd7\x01\x8c\x27\xad" + "\x91\x68\x5b\xf7\x99\xf0\x2a\x1d\x38\x73\x2e\x97\x86\xa6\xa6\x13" + "\xa5\x4f\x09\x3a\xe1\x96\x78\x41\xf4\x89\xce\x16\x50\xb9\x41\x97" + "\x73\xfe\x99\x65\x3a\x17\x45\x69\x94\x73\x89\x46\xa3\xe4\x3a\xe1" + "\x5c\x83\x35\xa8\x5e\xd6\xe5\xcc\x8b\xe2\x8d\xb3\x4f\xe2\x8d\xd3" + "\xe1\x63\x8f\x1d\xd5\x64\x15\xb9\x76\x94\x2e\x21\xfe\x91\x68\x3a" + "\xde\x37\x68\xe5\xed\xb8\x88\xd6\x0d\xe7\xbe\x2f\xf3\x0f\xce\xe5" + "\xc4\x3f\x90\xdd\x23\xc1\x02\x6d\x35\xca\x79\xe3\x3c\x1a\x43\x7f" + "\xcc\x78\xee\x9b\x6a\xac\xef\xa3\xe5\xf8\x3a\xda\xce\xbb\x6e\xd5" + "\xda\xa2\x5b\xc9\x05\x56\xbe\xc3\x9e\xbf\xaa\x28\x3f\xef\xec\x7d" + "\x3c\x9b\xc6\x8b\xd1\x1e\xfa\x0e\xcc\x7b\x7f\x02\xc1\xa3\x0c\xfd" + "\x77\xe5\x69\x7d\x10\x74\x0a\xbc\xa3\x4a\xe3\x92\xfa\x99\xeb\xc6" + "\x3d\xc2\x0e\xb0\x2c\x4f\xc3\x13\xca\x77\xbb\x83\x2b\x48\x43\xff" + "\x4b\xed\xaa\xbc\x04\x99\xb4\xcc\xad\x3d\x47\xbf\x2f\x3b\x22\xd6" + "\xbe\x27\x85\xcd\x20\x60\x5a\x7e\x67\x0c\xbf\x45\xcf\xe9\xea\xb3" + "\xf0\xf3\x44\x3e\xc9\x86\x58\xd9\x27\x12\xbe\x65\x18\xff\x2d\x2a" + "\xad\x70\x49\xbb\x9b\x27\x19\xfb\x45\xa9\x3f\x7e\x8f\xd8\x4f\x28" + "\x0b\x69\xf5\xe1\xfb\x9e\xd8\x3a\x69\xdd\x3a\xbb\x3c\x1f\x2b\x13" + "\x3e\xdc\xb7\x0a\x1f\x75\xe5\x99\x53\xb4\xb5\x35\x36\x1f\xf2\x64" + "\x23\x8f\x41\xeb\xf3\xf7\x1d\x22\x6d\xcd\x39\xfa\x38\xa4\xf6\x91" + "\xe8\xa6\xa8\x9f\xf0\x5f\x6d\x43\x87\xea\xf7\xc4\x47\x31\x12\xa9" + "\xfd\xc2\xff\x9a\x85\xe6\x75\xb9\x07\xeb\x59\xa6\xd6\x0f\xea\xe3" + "\x81\x52\xbf\x41\xf3\x7b\x25\xbf\x2f\xff\xe5\x59\x6d\x0b\xc4\x7c" + "\x33\xe0\xb9\x92\xf6\x0a\xca\x6b\xb9\xcb\x49\x72\x0c\xf9\xbd\x32" + "\xee\x98\xc4\x43\x97\xf5\xcb\x78\x57\x5e\x43\x78\x17\x8b\x4b\xab" + "\x6f\x5a\x05\x4c\x5a\x9f\x5f\x74\x8b\xe0\xee\xc1\xd8\x91\x5b\xb5" + "\x95\x45\xab\xd7\xad\x5d\x3f\xdf\xba\x3e\x6f\xa5\x3a\xe9\xcf\x98" + "\xf3\x2e\x21\xbb\x07\xb4\x79\x86\xba\x6a\xa2\xb4\xc5\x15\xc5\x7f" + "\xb2\x01\x13\xb1\x99\x5d\x9f\xc8\xf9\xe4\x3a\x10\x33\x77\xc5\xf7" + "\x34\x47\xf7\x08\x9e\xcd\x15\xbb\xfe\x93\x6c\x9c\x70\x92\xb9\xb6" + "\xa8\x30\x0d\x48\x18\x6f\xbd\x46\xf4\x53\xf8\xfb\x72\x2d\xa2\x7e" + "\x0a\xff\x32\x82\x3f\xdb\x6a\xd6\xfa\x1b\x95\x1b\xb6\xda\x04\x1f" + "\xa5\xf2\x6b\xe7\x92\xcb\xa3\xfc\xe9\xd6\x36\x55\xe7\xd6\xad\xc9" + "\x78\x1a\x7f\x8d\xb6\xe4\x49\x5e\x75\xeb\x96\xa5\x25\x7c\x22\xc7" + "\x41\x7e\xf0\x68\x0c\xb6\x3e\xab\xf1\x96\xc2\x3e\xb0\x2a\xe0\x41" + "\x7b\x9a\x63\xe9\x04\x8f\x7b\xa0\x5b\xe5\x11\x3d\x52\x76\xbd\xe0" + "\x0f\xbd\xa8\x0b\x6d\x33\x9e\xa3\x6d\xd4\x2f\xd0\xbf\x1d\x7b\xa9" + "\x1c\xe2\xaf\xf9\x88\x45\xe5\x43\x2a\x1e\x15\xfc\x2e\xca\xf6\x63" + "\x6c\x83\xae\x0a\xf0\x7f\x5b\x05\x6e\x28\xc0\x51\xb2\x0d\x0a\x68" + "\x3c\x12\xab\xb8\x95\xd6\x22\xdc\x03\x6f\x2b\xd4\x33\x89\x15\xf5" + "\xfe\xf5\x36\x36\x32\x62\xd1\x8f\xac\xcf\x36\x90\xbe\x80\x60\xe1" + "\x6d\x0c\x31\x89\x3f\x15\xb9\xc0\x3b\x73\x6c\x79\x6a\x59\x04\x53" + "\x03\xb5\x83\xaf\xb7\xe8\x09\xbf\x45\x7c\xc2\x11\x1b\xf0\xab\xc2" + "\xc6\xd7\xdb\xf4\xd3\xf8\xf6\x3a\x57\x3f\x93\x28\xc6\x23\xc5\xe6" + "\x24\x7a\x25\xe3\x07\x6c\x3b\xf1\xb8\xd4\x0d\x68\xf5\x0e\x73\xfd" + "\xd3\x62\x5d\xa9\x13\xeb\x0a\x67\xd2\x1f\xfb\x36\xe1\x2b\x3f\xc5" + "\xfe\xb4\x88\xab\xaa\x9e\xff\xf6\xb7\xd9\xc3\xa2\xcd\xce\x22\xe2" + "\xd3\xc2\xb4\x4f\x25\xce\x37\x1f\x2e\x0a\xb3\xef\x87\x08\x27\xb7" + "\x65\x91\x2f\xfa\x80\xe0\x17\xb6\xdd\xa9\xf9\x9f\xa7\xb8\x91\x14" + "\x77\x14\xfd\x8a\xa3\x71\xb7\x3a\x29\x76\x40\x25\xc5\x65\x65\x52" + "\x1e\xb7\xb0\x3a\xf0\xf4\x72\x0c\xb6\x3d\x41\x71\x5c\xa5\xac\xd0" + "\x8b\x71\x89\xfb\xbc\x97\x6d\x7b\x5e\xee\x55\x6b\x74\xa2\xf2\x6a" + "\xb2\x7d\xf7\xa9\x65\xa0\x2e\xac\xff\x5b\xa5\x8f\x50\x5a\x3b\x83" + "\xda\x78\x6e\x7b\xe2\xcb\xfa\x8d\x68\x79\x3e\xb6\x6d\x87\xca\x17" + "\x30\xa9\xbb\xfa\x13\xca\xaa\x34\x68\xba\xab\x28\xef\x53\x69\xd1" + "\x74\x57\xd2\xb7\x75\x45\x0f\xd5\x3f\x9d\x8e\x88\x3b\x7f\x40\x78" + "\x6f\x24\x1e\x6e\x5a\x7e\x02\xeb\x3b\xb5\x5d\xe3\x0b\xe5\xf8\x54" + "\xfe\x96\xf8\xc3\xb6\x12\x29\xd7\x8e\xc8\x18\x93\xe0\x01\x2a\x0f" + "\xc9\xb5\xac\xb2\x59\x5b\xcb\xf0\xed\x01\x95\x56\xa8\xeb\x5c\xe5" + "\xa4\xfc\x3b\xb5\xdd\x7f\x65\x8f\x06\x23\x0d\xe6\x12\x46\x3f\x5d" + "\x30\x92\x38\xb8\x38\x0a\xdb\x9f\x8a\xbd\x8b\x98\xf7\x0f\xc6\xc0" + "\x9e\x9e\xd7\x48\xba\xf9\x53\xac\xff\x15\x8d\x72\x4d\x91\x69\x3c" + "\x31\x18\x47\x31\x63\x25\x0c\x56\x0b\xdd\x8c\xdf\x69\x43\xdb\x7e" + "\x9a\xed\xd3\x5d\xb4\x4c\xd2\xb2\x9f\x62\xfd\xab\x5c\xae\x7e\x27" + "\xc6\x3f\xb6\xbd\xf7\xac\x7d\x60\xed\xba\x8d\x6b\x49\xa1\xb6\x61" + "\xbd\x75\xd5\xba\xbc\xfc\xc4\x29\xf4\x21\x16\x8a\x17\x1d\xd8\x31" + "\xe9\xd7\xaa\xda\x4e\x76\xfa\x32\x26\x42\xf5\x43\xd6\x7f\x21\xfc" + "\xfa\xe9\xbb\xa4\x2b\x10\xb1\x29\xc8\x87\xab\xd4\x1b\x0c\xd0\xf7" + "\x12\xd6\xd5\x3f\x1a\xd9\x58\xa0\xf2\x58\xd5\xb3\x09\x8e\xaa\xcc" + "\xc1\xfb\x99\xfb\xbb\xda\x3a\x44\xed\x13\xbc\xf9\x84\x4d\xd0\x45" + "\x65\xa2\xc0\x20\xe0\x35\x61\xc3\x7a\xe3\xce\xf0\xe9\x2e\x9c\x2f" + "\xfb\xe5\x5e\xa4\xc1\x83\xfa\x0f\x5e\xd7\x18\xe4\xab\x81\xa3\xd5" + "\x76\xb5\x2c\xa2\x9f\x54\xb6\x41\xb3\x13\x27\x5f\xa5\x9e\x62\xf2" + "\x53\x5c\x75\xab\x52\x45\xf4\xc6\x5d\xa6\xd1\x25\x5a\x8b\x14\x94" + "\xf3\xc2\x98\x3f\x1e\xf3\xe6\x9b\xf8\x76\x56\x2f\xab\xea\x90\xf1" + "\x0c\xdc\xfb\xcf\x8c\x67\x50\xe5\xc6\xaf\x43\xfd\x0d\xc5\xdc\x9f" + "\xeb\xa7\x7d\xd3\x1a\x93\x66\x3c\x2b\xcf\x50\xd0\x55\x95\x3a\xc9" + "\xaf\x48\x7f\xa9\xaa\x7f\x65\x8a\xcd\x51\xf5\x5d\xf2\x49\x1a\xc5" + "\x0d\xf7\x06\x95\x07\x19\x20\xd8\xd1\x7a\x8b\x3c\xc2\x96\x1b\x30" + "\x89\x23\x1d\x2d\xf5\x89\x07\x57\xa3\xaf\x55\x6b\xa2\x78\x20\x61" + "\x84\xb4\xb2\x28\x9f\x52\xb5\x9c\xbe\x89\x85\x03\xea\xf8\xa6\x94" + "\x4d\xab\xf6\x69\x6b\x36\xf9\x63\x95\xf1\x2d\xaa\x52\x0f\x94\x0e" + "\x40\xe6\xaf\x6a\x8b\x29\x23\x55\xd5\x45\x18\xb8\xfe\xa7\x8e\x3d" + "\x42\x66\xab\xea\x8b\xea\x04\xaa\x52\x89\xee\x8a\x32\x12\x83\x66" + "\x6f\x40\xc4\x65\xd6\x69\xb1\xd7\x83\xae\x6a\xb3\xc6\xa3\x68\x65" + "\xb5\x49\x9d\x93\xf0\xa1\x89\x39\x58\x8f\x3c\x99\x93\xfa\x58\xa4" + "\x4d\xca\x80\x0e\xcc\x63\xc1\x7b\x57\x2f\x8f\xca\x7a\x3f\x15\x3e" + "\x76\x85\x1c\x28\xcb\x81\x9c\x55\xbd\xe4\x6c\xb9\x0d\xfc\x83\x75" + "\xf5\xda\xd5\x60\x1f\x7e\x6c\x5f\x77\x2b\x44\x87\x1f\xdb\x57\xdf" + "\x4a\x26\x65\x77\x2d\xfe\xb6\xb8\x62\x72\xdc\x3a\x85\xfe\x78\x32" + "\xf6\x32\xe9\x8c\x20\xe7\x92\xee\x34\x28\x63\xaf\xce\x54\xaf\x46" + "\xf5\x3a\x03\xeb\xde\x00\xf0\x7e\x94\x62\xeb\xf8\xd8\x23\x46\x35" + "\xde\xad\xb6\x66\x83\x96\x57\x9f\xd0\xf6\xc9\x84\x8d\x3d\xf9\x49" + "\xa4\xd8\xca\x5b\x1f\xf8\x24\xe8\x7a\x64\x52\xff\x21\xf5\x8b\x72" + "\xdf\x0b\xe9\x59\x5a\xba\xa6\x8f\x45\xda\x72\x4d\xf7\x2a\xf3\x3e" + "\x92\x17\xfd\xf6\x0c\xdd\x76\xaa\xb6\xbf\x86\x3c\x6e\x0d\x66\x5a" + "\x39\x4e\x2b\x3f\xa9\xf2\x49\x71\x82\xaf\x76\x55\x97\x08\xdf\xa4" + "\xc4\x8b\x0b\x3d\xf3\x23\x87\xb4\x7a\x48\x46\xa0\x76\xab\x7b\x37" + "\x62\xde\x93\x0f\x52\xe9\xc3\xf4\x91\xc9\xf1\x3f\x73\x8f\x63\xea" + "\xfd\x8d\x89\x62\xde\x16\x1e\xe3\xad\x75\x1f\x60\xce\xde\xcf\x58" + "\xb8\x98\xb7\x4c\x8c\xf1\x03\x04\xeb\xba\xfb\x18\xab\xfd\x3b\x63" + "\x91\xb8\x1f\x1e\x1b\x07\xdc\xef\x1e\x55\x4e\x52\x7c\xbd\x3d\xc8" + "\x77\x77\xe0\x0b\xde\x84\x6f\xee\xb6\xf3\x93\x4d\xc8\x77\xd7\x89" + "\x93\x7c\x37\xf2\xde\x55\x80\x7e\x17\xf3\x70\x24\xee\x81\x63\xd6" + "\xff\x24\x3a\x54\xe3\xf0\x57\x0d\x67\x72\x97\x7e\x3b\xdf\xfa\xb5" + "\x6b\x83\xae\x9a\x8a\xc9\x98\x5e\x28\x97\x60\xb4\xd4\x41\xf7\x0f" + "\x1c\x43\x9f\x8e\xe5\x60\x0d\xc5\x18\x1c\x43\x3e\xc8\xff\xeb\x05" + "\xbd\xf1\xc7\x5d\x7b\x11\x7e\xb6\xa9\xe8\x3e\xda\xda\x16\x29\xe6" + "\xad\xdb\xef\x45\xfb\x07\xd1\xfe\x31\xde\x82\x3e\x1c\xa8\xeb\x67" + "\x8c\xda\x1f\xa1\x32\x23\x2c\x2e\x67\x93\xee\xc2\x3d\x78\x9f\xe3" + "\x30\xb3\x3d\xc8\x7b\x6f\x80\x5d\xd8\x84\x3c\xf7\x3e\x74\x21\x13" + "\xed\x1f\x42\xbb\x13\x86\x33\x23\xa8\x9b\xda\x1f\x74\xd5\xce\xd7" + "\xda\xa9\xd5\x4f\xed\xd5\x70\x30\x87\xf4\x5d\x89\x83\x15\xd4\x6e" + "\xa9\xc3\xaf\xcd\xf7\xaf\x2f\x60\xfe\xb8\xaf\x5d\xeb\x63\xb5\x65" + "\x34\x87\xa8\x3f\x7e\xe0\x94\x7a\xee\xed\x98\x06\x03\x29\x4f\xd6" + "\xd6\x68\xfd\x8b\xed\xd7\xb2\x75\x85\x42\x8f\xba\x72\x55\xd1\xea" + "\xe2\x95\x90\xce\x12\x99\x9d\x92\x84\xfc\x96\x9f\x67\x5d\xb7\xd6" + "\x7a\xff\xca\xd5\x6b\xd6\x15\xe7\x17\xce\x17\x22\xf7\xfa\xfc\xb5" + "\x79\xa4\x5e\x2d\x5c\x59\x68\x4f\x3c\x8b\xe7\x76\x0f\x67\x92\x3d" + "\x22\xd1\xb2\x7e\x56\x5f\xab\xea\x16\x43\xdc\x95\x25\x64\x37\x39" + "\x0f\xea\xbe\x69\xdd\x9c\x45\xef\xcb\xe5\x5a\x53\x5f\xc3\xab\x07" + "\xb7\x71\x2e\x62\x42\xeb\x4e\xb2\xfa\x4d\xa2\x9f\x23\x4b\xb4\x72" + "\x84\x8d\xbe\xe0\x59\x29\x7d\x62\x09\x8b\xda\x94\xd7\xd7\x72\x3d" + "\xfa\x08\x18\xa8\x7c\xab\x5f\x3d\xdb\xf7\x97\x5e\x56\x9f\x8f\x7e" + "\xd3\xde\x41\x97\xe0\x0b\xc5\x19\xa4\xfa\x7b\xc0\xf7\x82\x2f\x9b" + "\x91\x44\x70\xa9\x93\x72\xa5\xde\xa4\xa3\x38\xb1\xbd\x74\x1e\x32" + "\x83\xf6\x08\xf7\xb8\x94\x8c\xa8\x4d\x4f\x6d\x03\xf1\xb8\x42\xd7" + "\x2e\xe6\x45\xdd\x51\x0d\xdf\xf5\x74\xc6\x64\xeb\x9c\x5b\x24\xad" + "\xae\x13\xfb\xff\x18\xb7\x5b\x64\xfb\x45\x7c\x6a\xac\x4f\xdb\x87" + "\xd1\xbf\x4a\xee\x5c\xa2\xfa\x95\xdf\x3e\xac\xa4\x64\x36\x47\xd6" + "\x5b\xd4\x98\xee\x83\x4d\x4a\xf5\x60\x5d\x04\xeb\xba\x02\x5e\x95" + "\xd7\x2d\xb8\x2a\x52\x3d\xe8\x56\x36\xda\xf4\x44\xdf\x9d\x0e\xc0" + "\x6f\x5d\x41\x22\xff\xa2\xe0\x82\xc8\x46\x1b\x78\x80\xc1\x7a\xce" + "\xf1\x6d\xe2\x60\xb3\x88\xcd\x5b\x3d\xf8\x98\xfa\xfc\x73\x7a\x56" + "\xc0\xab\x21\x6d\x1f\x9e\x7f\xad\xf0\x98\xfc\x67\xe6\xdd\x4f\xcf" + "\x26\x9d\xb0\x21\xa4\x18\xd3\x8b\xa8\xef\x5a\x9f\x85\x8c\x40\x7a" + "\x8a\xc9\xbe\x6d\x1f\xd2\xd2\x89\x77\x95\x7c\x24\x5b\x05\x18\x33" + "\x49\xd3\x26\xf3\xbd\xae\xc1\x40\xc0\xb6\x7a\x10\x73\xaf\xbe\x46" + "\xc4\xa9\xdf\x7a\xd9\xb5\x5c\x5f\xfb\x1c\xad\x1d\x4b\x23\x62\x2f" + "\x8b\xc9\xbd\x8f\xfa\x74\x0d\x9e\x64\x2b\x4f\xeb\x07\xc6\xcd\x96" + "\xe3\x67\x89\x72\xfe\xd6\x2f\x8e\x91\x51\x86\xb8\xc0\xf7\xed\x3d" + "\xa2\x5e\xbd\x71\xab\x7c\xae\xdb\x21\xd7\xbb\x7a\xbb\x96\x17\x69" + "\x0e\xc9\x93\xd6\x2d\x26\xd9\x8d\xf6\xb6\xe8\xbe\x69\x9a\x73\x9c" + "\xa5\x8d\x9c\x13\x2d\x24\xda\x6c\x9d\xc3\x58\x67\x80\xf8\xf6\xfa" + "\x8e\xc3\x8d\x01\x26\xc6\x2f\x71\x70\xdb\x08\x2f\x60\xe0\x57\xa6" + "\xe4\x53\xe9\x9b\x7e\xf6\xa8\x51\xf0\xe0\xc0\x67\x05\xf8\x8c\x6f" + "\x2a\x09\x5f\x4b\x47\xa9\x1d\x8f\x2e\x69\x2b\x19\x20\x3f\xf3\xc0" + "\xc3\x47\x97\x10\x6c\x68\x6d\xa8\x73\x89\x33\x7c\x82\x06\x7b\x8a" + "\x33\xa9\x8c\x05\x29\x21\x66\xe8\x04\x05\x05\xbc\x43\xf6\x52\x76" + "\xe1\x20\xf2\x1b\x8a\x98\x91\xe4\xa3\x7f\x74\x1f\x19\xf5\x55\x48" + "\x98\x3c\x5a\xa1\xf1\x40\xb8\xaf\x3f\xf3\xac\xea\xa3\x8e\xb3\xf7" + "\xd2\xee\x5b\xb7\xae\x28\xa7\x30\x9f\x2e\xb6\xab\x37\x5c\x73\xf6" + "\x9a\x98\x24\xe3\xfa\x3c\xba\x8f\xc6\x8f\xd6\x09\x79\xe6\xe3\xd1" + "\x81\x18\xb9\x96\x74\x6b\xb7\xd1\xfa\x46\x7b\xe2\x41\xd7\x63\x86" + "\xd7\x4a\xb6\x08\x3c\xf9\xc4\xc8\xf4\x67\xd7\x77\xff\xca\xa2\x95" + "\x6b\x6e\x91\xdb\xb7\x5f\xae\xe7\x31\xcb\x99\xf5\x3c\xb6\x6c\xb2" + "\x1e\x29\x83\x04\xc4\x1c\xac\x5d\x60\xe6\xc9\x73\x5b\x24\x9d\x7b" + "\xac\x48\xb3\xc9\x9a\xda\x37\xc6\x60\x38\x52\x1d\xca\xa5\xf1\x72" + "\x6e\x61\xfa\xdf\x6d\xee\xd6\x13\xff\x55\x8a\x7b\xb2\x59\x11\x7a" + "\x3e\x35\xe6\xde\x2b\xa7\xba\x41\x67\x1f\x6b\xe7\x55\x83\xc0\xa7" + "\xc7\xa6\xb5\x33\x89\x3d\x57\x2c\xf7\x28\x1f\xf3\x4d\x97\x97\xbb" + "\x03\x21\x39\x57\x1e\x5f\x20\xf6\xca\xe6\xb0\x9f\xf6\xb2\xc7\x6f" + "\x34\x58\x20\xc7\xcd\x61\xbf\xc2\xbd\x90\x17\xe8\xdd\x19\x63\x3d" + "\x77\xa8\xd9\x00\xec\x04\x96\xea\xb8\xfc\x03\x13\x26\xff\xc0\x08" + "\xe2\x85\x4e\x58\xe7\xc7\x01\xc2\x33\x67\x18\x98\x29\x25\xc9\x78" + "\xf9\xbc\x34\xcb\x6d\xdf\x58\xb4\xd0\x59\x5a\xe2\xe0\x4a\x38\x64" + "\xe2\x31\xf1\x21\x6b\xe6\x66\xdf\x73\x4d\x99\x5c\x2b\x6a\xe7\x66" + "\x4f\xd5\xd6\x5a\x17\xb7\x13\x6f\x0d\x7a\x55\xe6\xdc\xc0\xf4\x2f" + "\x8c\xfb\xf4\xc4\xcb\xd1\xfa\xe3\x0d\x7f\x04\x99\xe0\xf1\xd7\x5e" + "\x45\x1a\xfa\xef\xe0\x35\x99\x65\xf2\xec\xc5\x0e\x9d\x52\x97\x59" + "\x16\x2d\xdf\xc0\xa8\x7c\xc8\x0b\xfa\xbd\xa5\x03\x7a\xaf\xe1\x1b" + "\xcc\x6b\x0d\xb0\x57\x71\x3f\x25\x2c\x51\x27\xe9\xa6\xa8\x0c\xd0" + "\x61\xb7\xf3\x34\xe8\xb3\x43\xe8\x89\xf5\x27\xd9\x8e\xaf\xb7\x4c" + "\xf3\x9d\xd8\xeb\x49\xf4\xf7\x07\x5d\x3b\x30\xfe\xdf\x99\xaf\xf2" + "\x43\xe0\xd7\x76\x54\x68\x34\x01\xef\x3f\x93\xfa\xea\x1d\x0d\x5a" + "\x9e\xa9\xe5\x49\xb2\xf1\xe4\x1e\x1a\x57\x3e\x36\x30\x40\x3e\xe6" + "\xa6\xd1\x09\x2c\xc6\xfa\x3c\x97\xe6\x71\x72\xb9\x79\x46\x4a\x79" + "\xc6\x83\x1d\x98\x75\xc9\x43\x97\xb0\x94\xc0\x8f\xa8\xcd\xac\xf1" + "\x49\x61\x67\x3c\x40\xfb\x54\x26\x5d\xc6\x6a\x53\x79\xc6\xca\x88" + "\x6b\xd1\xcd\xb4\x4e\x9a\x1c\xdf\xd6\x99\xc2\xdf\xd4\x85\x5d\x99" + "\x37\xef\x91\x31\x59\x02\xf5\xb3\x78\x37\xbe\xe9\xc1\x37\x3e\xfc" + "\x28\xfe\x42\x47\x3f\x7b\xe2\x07\xb8\xb6\x9b\x74\x7c\x8f\x09\x23" + "\x79\x43\x99\x88\x51\x49\x34\xba\x83\x27\x82\xc7\x9c\x10\xba\x80" + "\xf8\xa8\x2e\xe0\x89\x12\x8c\xdb\x8c\x3b\xb7\xf1\x57\x51\x56\x7b" + "\x64\x4c\x69\x6f\x3a\xc9\x98\xaa\xf3\x3e\x8a\x39\x7a\x74\xfe\x0e" + "\x66\x51\x6d\x45\xf5\x1d\xe1\x76\xa2\xc5\x74\xb6\xba\x0d\x75\x1e" + "\xc2\xaf\xd5\xba\x96\xc5\x9d\x64\x4f\x1c\x21\xfe\x23\xca\xc3\xfe" + "\xec\x0e\x55\x1e\xf1\x5c\x8f\xef\xb7\x3c\x48\x38\x31\xa0\x0f\xa3" + "\x7c\xf0\xfc\xed\xde\x82\x76\x61\x0b\x43\xb6\xd8\x94\x07\x75\xd8" + "\xbc\xa1\x76\xa6\x70\x8b\x1e\xcf\xad\x64\x5b\xc8\x91\xb7\xd3\xd1" + "\xcd\x3a\xed\x21\xd0\xd8\x0e\xf0\xc0\xb6\x74\xb4\x47\x94\x87\xf7" + "\x47\x5f\xc0\xf8\x5a\xc1\xef\xa1\xbc\x2e\xb2\xad\xa1\x33\xca\x7c" + "\xbd\xed\x5f\xf0\x7d\x1b\x64\x68\x3d\x95\x7f\x92\x3d\xf9\x2e\x1f" + "\xb1\xd9\x6e\x18\x92\x31\x1b\x7b\xd9\x93\xfb\xd1\xce\x79\x31\xed" + "\x5c\x80\xf6\x1b\x40\x57\x3d\x28\xf3\x10\x2f\x46\x9d\x7d\xa8\x13" + "\xf2\x08\xf0\x37\x1d\xf2\xae\x81\xda\xdc\x49\xed\x75\x44\xc8\xfe" + "\xd5\xb0\xfd\x14\x33\x60\x2e\x78\xf6\xe0\x8a\xfe\x1f\x00\x4f\x96" + "\x16\x74\x3d\xe9\xd1\xce\xb9\x13\x2f\x81\xe7\x2e\x0d\x97\x6a\x91" + "\x07\x6d\x6c\x45\xbb\x0e\x25\x0f\x31\x92\x71\xe2\x81\xa7\xf1\xa8" + "\x77\x26\xc6\xaa\x15\xb0\xfb\x2d\x60\x7d\x88\xfa\xa4\x8c\x29\x03" + "\x0a\xca\xdb\x3e\x86\x36\xad\xb7\x18\x92\xfa\x28\xa6\x75\x90\x03" + "\xde\x47\x97\x3a\x82\x9c\xec\x64\xd1\x67\x82\x77\x2d\xfa\x6a\xf0" + "\xb1\x9f\xad\x21\x79\xa3\x9f\x3d\x59\x24\x63\x4e\x3e\xe9\x50\xf7" + "\xb4\x8e\x4a\x3d\xd3\x13\x47\x08\xf6\xd4\xaf\xa4\x72\x73\xa5\x77" + "\xc0\xcf\x92\xfa\x2e\xc1\xfa\xf6\x84\xbf\x51\x21\x1e\xe5\x67\x93" + "\xfa\xff\x69\xe6\x58\xc8\x0b\xfa\xa2\x8c\xf1\x01\xe2\x3d\xa5\xbd" + "\xcb\xcf\xf6\xe7\x38\xe2\xb2\xc0\x67\xea\xd1\x4e\x3a\xab\x31\x0b" + "\xeb\xf4\x6d\x64\xcf\x84\xf6\x41\xee\xf8\x59\xc7\xb9\x62\xbd\x02" + "\x3e\x16\xe4\xf1\xa3\xed\x22\xa6\x1f\xc5\xc2\x94\xba\x9e\x06\x83" + "\xe6\x6f\x80\x8f\xf1\x92\xed\xa5\xa2\xde\xb2\x8a\x62\x51\x07\xc5" + "\xff\x1c\x28\xb2\xf2\x4f\xda\xac\xfe\x69\xf5\x6e\x31\x76\x3c\x7e" + "\x35\xa6\x98\xd8\xd3\x3c\xd3\x8e\xa7\x61\x4d\x8c\xdc\x48\xfb\x9a" + "\x65\xb4\x77\x2b\xfd\xc2\x34\x08\x5b\xcc\xa5\x0e\xe9\xff\xc2\x1b" + "\x1a\x52\x79\xcb\x86\x83\x22\xce\x10\xf1\x35\xc2\xf6\x67\x50\xb5" + "\xd7\x69\xf8\x2e\xd5\xd1\x76\x56\x2c\xe3\xfc\xb5\x2b\xef\x5b\x93" + "\x2f\x55\x29\xd7\xfd\xa4\x68\xe5\x8f\xcf\xe4\x7f\x0d\x42\x2e\x76" + "\x35\xb4\x49\xdd\x64\x43\x38\x86\x4f\x34\x4c\xea\x96\xf4\xec\x80" + "\xd4\x2f\x3d\x95\x36\x95\x7e\xe9\xdb\x3f\x5e\xbb\xae\x50\xd4\x21" + "\x4c\x9b\xf2\xe5\xe9\xa7\x44\x76\xcf\xe2\x6f\x2f\xbe\x6e\x7d\x7e" + "\x91\x08\x1e\x22\x95\x39\x2b\xf3\xf2\x0a\x55\xc3\xa7\xd5\xf4\x15" + "\xbd\xb9\x7f\xa3\xf8\xd4\xfe\x40\x91\x34\x99\x5a\xbf\x66\x65\x71" + "\xbe\x5a\x44\x6c\x5b\xd3\x88\x5e\xb6\x35\x0a\x99\x39\x51\xee\xd3" + "\x3e\xb5\x3f\x66\x5f\x27\x56\x8e\x9c\x8d\x77\xed\xda\x3b\xfb\x95" + "\x84\x2b\x3b\xaf\xeb\x6c\x16\x3e\x1b\x0c\x87\x7f\x4e\xf0\xdd\x49" + "\xfb\xc4\xf1\xb4\x66\x2b\xfa\xa7\x6c\x4d\xea\x59\xa6\xa0\x6b\x27" + "\x8b\xea\x06\x76\x1f\x52\x6d\x1f\xfa\xa8\x3e\xaa\x1b\xef\xad\x31" + "\xf6\x00\x7d\x3e\xf6\xd4\x00\x95\x41\xfb\xd6\x22\xbe\x04\x78\x22" + "\xf5\x2c\xbb\xbe\xf3\xe7\xb4\xb6\x34\xce\x27\x3a\xaa\xb8\x47\xcd" + "\x72\x1e\xec\x5a\xc9\xab\xfd\x9f\xdf\x10\x60\xa9\x92\x0e\xec\x7c" + "\x1e\xe9\x17\x9f\x64\x3b\xdd\x48\x1f\x00\x2d\x89\x27\x7e\x44\xea" + "\xbf\x77\x3e\xaf\xea\x0a\xa8\xcf\xf1\x31\x6d\xd8\x1b\xd5\x27\xec" + "\x3e\xe4\x4f\x18\x35\x57\xc8\xfd\x7e\xb1\xb7\x29\xf7\x97\x77\x4e" + "\xf6\x9f\xa3\x6e\x75\x3f\x2f\xb5\x1f\xf9\x79\xd5\xa8\x59\xdd\x63" + "\xa3\xbe\x67\x51\xbf\xa5\x9d\xd6\xce\x70\x2c\x5f\x2b\xfd\xf9\xfb" + "\x3f\x27\x5e\x58\xca\x01\xbb\xae\x11\xbc\x0b\xe9\x2e\xc6\x09\x86" + "\xbb\x6e\xc5\x7b\xac\x5f\xbb\x32\x7d\xac\xa1\x3b\x16\x66\x45\x0e" + "\x2c\xf0\xf8\x8e\xd6\x33\xb4\x69\x26\xf2\x64\x47\xdb\xbc\x4b\xf8" + "\x89\x20\x59\x41\xf2\x15\xbb\x4e\x88\xf8\x63\x01\xf4\x4f\xb5\x19" + "\x20\x98\xcb\x78\x04\xbb\xea\xb5\xef\x94\xc4\x51\xb2\xd7\x20\x3a" + "\xdb\x27\x61\xb7\xeb\xed\x38\xdd\x27\x62\x0f\xf4\x86\x10\x6b\x46" + "\xda\x0c\xa4\xbd\x4e\xf9\xa8\x1d\x42\x57\x81\xf6\x53\x7d\x0a\xf8" + "\xe0\x38\xcb\x8c\x5b\x51\x9e\x0f\x74\x26\x3d\x3a\x7e\xbb\xf6\x45" + "\xf5\x43\x4f\xdd\x2b\xf5\x43\x8d\x06\x0d\x0e\x14\x47\x48\x9d\x0b" + "\xf1\xda\x7e\x39\xde\xa7\xc7\xc2\x5f\xd0\x39\x15\x9e\xdc\xf5\xd4" + "\xfa\xa8\xdc\xd5\x78\xe7\xe4\x5e\x11\xda\x11\xa5\xf5\x8d\x0f\x11" + "\x1c\xa9\xdd\xf6\xcd\xa4\x4b\xde\xbd\x57\xf4\x43\xee\xc7\xfc\x09" + "\x63\xf4\x04\x07\x5f\x40\x6b\x24\xc9\x00\x34\xbe\x94\x57\xc6\x18" + "\xda\x7d\x57\x93\xd4\x79\x3e\x89\xfb\xef\x2a\xfa\xa9\xf0\xa3\xb1" + "\x2d\xd6\x3e\x50\xc2\x78\x77\x92\x42\x65\x02\x7e\x54\x16\xd6\x8d" + "\x49\xbb\x67\x59\x6e\x63\x04\x65\xfe\xac\x3f\xda\x1f\x3f\xaf\x56" + "\xe1\x48\xe3\x28\xe0\xb2\x1b\xf3\xbf\x41\xe8\x6d\x9c\xcd\xfc\xc4" + "\x3a\x94\x21\x63\x7f\xee\x5e\xc4\x69\x6c\xd4\xfc\x7e\x92\x9d\xd0" + "\x76\x79\x76\x0b\xf8\x06\xf9\x83\xda\xa9\x54\x8f\x1a\xa9\xed\xb4" + "\x0f\x10\x95\x87\x77\x3f\x44\xdf\xfa\x1f\x96\xdf\x6c\x97\xfb\x14" + "\x18\xdb\xc6\x67\xf9\xc6\x02\xa6\xea\xc7\x41\x8f\x1b\x53\x09\xb7" + "\xa9\x9c\x80\x90\x8b\x76\xbb\x15\xc0\x05\x63\x4a\xed\x3a\xa0\x8d" + "\x29\xf2\xd9\xa7\xe3\x63\xa5\x5f\xfe\xdd\x3e\xcd\xf7\x0b\xad\x29" + "\x98\xa7\x2a\x0f\xd8\xf4\xb4\xa9\xfc\x36\x6e\x0a\xdf\x7c\x33\xf1" + "\x34\x7b\xf4\x42\x56\xd1\xec\xdf\x2e\x07\x9c\xbe\xd0\x6c\x81\x95" + "\xad\x3f\xec\x26\xdb\x41\x6f\x48\xda\x0e\x52\xfa\xdd\x01\xae\x74" + "\x06\x22\x64\x9f\xdf\x1d\x74\x35\x2d\xd6\xe4\x17\xa2\x4b\x71\xe5" + "\x3a\xb4\xb1\x09\xf8\xff\xf8\x7e\x95\x1e\xcd\x1c\x64\x4d\xe5\x6a" + "\xf9\x31\x6d\xd8\x1d\x96\xf2\x5f\x53\xb3\x94\x83\x9a\x6a\x40\x5f" + "\x2a\xa4\x1c\xd4\xd4\xa0\xb5\x1b\xef\xf3\xce\xee\xe3\xb2\xdb\xbf" + "\x9d\x6f\x5d\x43\xa4\x35\xe3\x26\x87\xd5\x76\x75\xde\x0d\xc2\xd8" + "\xd4\xfa\xef\xb7\xdf\x62\x5d\x76\xeb\xd5\x8e\x82\xf9\x77\xcb\xcb" + "\xed\xcb\xee\xa4\xeb\x59\x7b\x8f\x56\x94\x1f\x3a\x53\xce\xda\xab" + "\xb6\x61\x8f\xd9\xa7\xb3\xc9\xb5\xd0\x78\x7c\x21\xc5\x57\xc7\x5a" + "\x38\x44\xfc\xed\xd2\xc8\xc7\x9c\x57\xbd\x5f\xc6\x13\x8e\x2f\xf4" + "\x27\xcf\xcd\xc6\xcf\xea\x4f\x18\x4e\xa2\xf8\xeb\xa6\x72\x1e\x32" + "\x85\x67\x4a\x7a\x88\x67\xf0\x12\x03\xe0\x57\x68\x2c\xd9\x1d\xd7" + "\x38\xf9\xd2\x08\xf7\x82\x6f\x01\x5c\xf6\xd8\xb5\xf5\x57\xe8\x8e" + "\xdc\xc7\x17\x2e\x75\xf0\x09\xc2\x1d\xac\xeb\x46\x5e\x85\x3a\xe3" + "\x48\xd7\xb5\x07\xfd\xdf\x61\x95\xb0\xd8\x03\xfa\xb7\xbb\x5d\x85" + "\xef\x32\x3c\x53\xfc\x1b\xb9\x97\xe7\xb2\x08\x1a\xaf\x6c\xbd\xf6" + "\x7b\xe0\xe1\xad\x5a\x99\x28\x2b\x49\x3d\x0b\x23\xca\x63\xe7\x38" + "\x4b\x1d\xfb\x53\xaa\x87\x32\x49\xe7\x40\xe7\x17\x4d\x0e\x1d\xc5" + "\x07\xca\x9e\xd4\xb3\xe0\x5d\x4a\xb9\x99\x74\x2f\xd9\x29\x01\x5d" + "\x19\xe5\x89\xea\x23\x14\xdf\x76\xbd\x12\x02\x1f\x60\x96\xb1\xd0" + "\x87\xd4\xfd\xd8\xe6\xdc\x49\xfd\xfe\x19\x63\xdf\x2c\xf0\xe1\x94" + "\xcb\x00\xdc\x6e\x1a\xb8\x32\x55\xf2\x3c\x8a\x4b\xc7\xe4\x59\xf6" + "\xe6\x7b\xc4\xbc\x54\xf1\x11\xf0\xf5\xd3\xde\x9b\x29\xcc\xfd\x64" + "\xa7\xae\xc4\x01\x27\xd9\x20\xf3\x96\x04\xcb\x28\x06\xf9\x24\x5e" + "\xda\x81\x97\x76\xe0\x25\xed\x93\xa2\x7e\x7f\xdc\xb5\xb9\x98\xb3" + "\xba\x41\xd6\x9c\x4e\xed\x27\xd8\x80\xef\x4e\x52\x00\x2b\x61\x0f" + "\x47\xf0\x49\x3c\x71\x80\xce\x45\x51\x5f\x4d\x61\x1d\xc9\x34\xd1" + "\x7e\xe9\x15\x5f\x9d\x0b\xfd\xd2\xa3\x5f\x8e\x13\x42\xde\xa7\xf3" + "\x6a\xa0\x25\xb3\xa2\x31\x26\x9e\x5e\x1c\xdb\x47\x85\xe2\xd2\x88" + "\x3e\x3c\x9d\x3f\x55\x1f\xb9\x9e\xfa\x48\x30\x78\xfa\xeb\xea\x3e" + "\x89\x68\x27\xd1\xad\x21\xd6\x1c\x4a\x29\xa7\x73\x62\xc7\x17\x82" + "\x5f\xbd\x9d\xc6\xb0\xc9\xc5\xeb\xa9\x9d\x53\x8d\x17\x95\x27\xcb" + "\xfa\xb9\xc1\x54\x5e\x96\x8b\xb6\x74\x4d\x0d\xef\xa7\x87\xcf\x0d" + "\xef\xa7\x5f\xa7\xef\xa9\x1d\x74\x6e\xce\x44\x0e\x90\x80\xdf\x90" + "\xb1\xdc\x53\xd5\x9b\x52\xde\x4c\xed\x9a\xf2\x1d\x70\x7f\x68\x7b" + "\xe1\x99\x73\x42\x69\x0a\x31\x82\xdf\x1e\xa4\x4b\x5d\xea\xcf\x1d" + "\x93\x3a\x5f\xf7\xf1\x5c\x93\xce\x1a\x47\x73\x4c\xf0\xb2\xe8\xef" + "\x54\xe5\x9a\x74\xf5\xe4\x43\xed\x76\xd0\xaa\x29\xdf\x63\x1e\x58" + "\xf9\xd6\xaf\x5d\x89\xf2\xd2\x53\xca\x75\xdc\x1f\xf7\xb5\xc4\x94" + "\x40\x38\x9d\xe0\x8a\xb6\x3a\x30\xc7\x6b\xc5\xfa\x2c\x74\x10\x3f" + "\xc7\xfc\x7f\x21\x57\xe8\x72\x13\x8e\xa7\x4b\xbb\x82\x5f\x24\xf9" + "\xd8\xef\x7d\x51\x1b\xa1\x5f\xa4\xf9\x74\x09\x6d\x72\xae\x5e\xb6" + "\x13\x6b\x5a\x9b\xe2\x32\x71\xeb\x66\x13\xef\x67\xbf\x78\x51\xe1" + "\x36\x3d\xd6\xad\xb6\x28\xee\xc8\x73\x75\x1a\xee\xe0\xfb\x15\x53" + "\xe3\xc5\x2f\xb6\x9c\x1b\x2f\x7e\xf1\x5d\x55\x47\x97\x2b\x6d\xf7" + "\x7e\xb1\x57\x93\x15\xf8\xd6\xcb\x76\x5a\x4b\x45\xfd\x0b\x65\xdd" + "\x80\x49\x38\x8b\xe8\xcc\x9d\x80\x5b\x19\xf2\x76\x69\xb4\x81\x70" + "\xc8\x14\x21\x39\x86\x09\x3c\xc7\xbb\x21\xd0\x1e\x19\x23\xbb\x7a" + "\xf8\x00\xf1\x98\x8a\xab\x69\x3f\xd6\xaf\x5d\x64\xbb\x1e\x48\x38" + "\xbe\x37\xe8\xda\x6b\xf6\xb1\xfe\x0a\x95\xfe\x35\xa2\x8c\x66\x61" + "\x0b\x22\xcf\x83\x26\xd1\x3c\xa7\x38\x66\x34\xd7\x91\x96\x8a\x76" + "\x53\x4c\x33\xf0\xf6\x7b\x97\x68\x6b\xbf\xe2\xca\x22\x78\x0b\x3e" + "\x43\x4f\x7c\x2c\x60\xf7\x84\x5e\xd9\x37\x76\x83\x85\x51\x9f\xc7" + "\xb6\xce\xd9\xf7\xd3\xeb\x99\xe1\xcf\x96\xfb\x98\xfd\x26\x96\x5a" + "\xfe\x6f\x06\x06\xec\xd6\x13\x1c\x7c\x6c\x6f\xb6\x84\xdd\xde\x06" + "\x6d\x7c\x7c\xec\x17\x82\x8e\x92\xee\x7c\x69\x98\x8f\xc8\xbd\x80" + "\xbd\xad\x3e\xf6\xa8\xba\xe7\xb5\xc7\x30\xc5\xfa\x70\x87\x75\xf5" + "\x7a\x6b\xde\xba\x8d\x6b\xaf\xb8\x22\x71\x0a\x19\x60\x6f\x87\x94" + "\x01\x7e\xc9\x62\x65\x00\x3c\xa3\xff\x4d\xbe\xb3\x79\xfe\x3b\x73" + "\x54\xf7\x07\x39\x19\x2c\x7a\x7f\x23\xbb\xf3\xc6\x98\xc7\x9b\xd9" + "\x9d\x37\xdd\x9c\xf3\xbd\xfc\x95\x79\x9b\x62\x52\x17\xc4\xea\xe7" + "\xb6\xef\x44\xdd\x71\x73\xbe\x05\xfa\xa1\xbb\xfb\x61\x5a\x77\x7e" + "\x39\x5a\x1a\xe6\x9f\x03\x77\x17\x92\xcf\xa1\x23\x45\x61\x76\x04" + "\xf4\x8d\x5f\x46\x74\x7d\xa6\xf4\xbb\x09\xf9\x1f\xb8\x65\x42\xdf" + "\xfd\x90\xc5\x46\xa5\xed\xf6\x33\xb3\x3b\x1b\x42\xa0\x13\xc3\xa9" + "\x92\xdf\xf9\xe5\x51\xa4\x5f\x88\x6b\x44\xda\x9f\x3c\xa3\x83\x9c" + "\x9b\x25\x7c\x2c\x14\x93\x8f\x85\x5f\x8a\x35\xe0\xfa\x40\x19\x93" + "\xbe\xbe\x7e\x59\x43\x3e\xb8\x7d\xec\x99\x45\xc4\x5f\x50\x5e\xa4" + "\xbd\x6b\xfd\x09\xcb\xa0\x2b\xf1\xbc\x3e\x94\xc9\xab\x86\x53\xf9" + "\xae\x6c\xda\x93\x4f\x47\x99\x5f\x27\xbe\x2d\xce\x32\x33\x18\x74" + "\x3d\xb3\x50\xe3\x41\xc8\x4e\x74\x3a\xfe\x43\x5b\x07\x53\x40\xbf" + "\x53\x02\x26\x9e\x43\x3e\x4b\x74\x2c\x9d\xd6\x07\x93\x63\x99\x38" + "\x5b\x44\xeb\x22\xd1\x84\x26\x41\x4b\x9f\xa9\xd7\xe8\x42\x9d\x94" + "\x23\x13\xe9\x7b\xac\x9f\x5f\xc8\xf5\xf3\x99\x16\x6d\x2e\xe0\xfe" + "\x90\x86\xab\x67\x9c\x4f\x59\x5b\x94\x5f\x98\x9f\x67\xbd\x7a\x7d" + "\x22\x8b\x89\x10\x59\x90\xbf\xd6\x5a\x98\xff\xd0\x86\xfc\xf5\x42" + "\x40\xa3\xb7\x67\xee\x8d\x80\x06\x45\xe3\xf5\x8a\x33\x32\xbf\xba" + "\x82\x64\x58\x53\xf9\x15\x42\x0f\x2e\x78\xa3\xa4\xcc\x06\xa5\x2e" + "\x39\x4b\xea\x11\x07\x01\xd7\x7d\xd2\x1f\xb5\x7b\xd8\x40\x7c\x5c" + "\x3f\xdb\xb7\x40\xee\xb5\xff\xea\x41\x09\x2b\xa3\x33\xe8\xfa\x55" + "\x5e\x94\x5f\xdb\x27\xec\xff\xa4\xcd\xdb\xaf\x4a\x00\xe3\x15\x51" + "\x1e\x64\xdf\x67\x44\x07\x05\x3d\xfc\x0a\x5a\xa8\xf2\xce\xa8\x67" + "\xdf\x35\xbc\x98\xf7\x6d\x1f\x67\x42\x8f\x47\xbe\xdb\x25\x7d\xfd" + "\x55\xb7\x06\x47\xf0\x2f\x7d\xa4\x2f\xd0\x64\xa0\xa5\xe1\xd3\xbc" + "\x74\x13\xd3\x93\xce\x80\x27\x0e\x5b\x7e\x53\xe8\xd7\x73\xd7\x33" + "\xed\xe0\x65\x48\x27\x14\x68\x52\x6d\xbf\x78\xc2\x30\xe0\xbd\xcf" + "\x1a\x95\x0f\xf7\xf5\x09\x3e\x7e\x9c\xf0\xe6\x57\x6d\x39\xb4\x46" + "\x48\xda\x7d\xc1\x57\xb5\x97\x27\x4a\x5d\xb9\xa4\x6f\xfb\x72\xd5" + "\x3e\x0c\x11\xcd\x52\x6d\x07\xf5\x12\xaf\xf7\xf5\x01\xe7\x0c\x34" + "\x16\xa0\xf3\x6e\x0d\x5e\xd4\x5f\x21\x77\x6e\x61\x7a\xd0\x2e\xcb" + "\x0b\x9b\x43\x7a\x19\x5b\xf1\x99\xa3\x52\x86\xd9\xd7\x1e\xbb\xe7" + "\x23\x65\xa9\x7d\x3d\x51\xbf\x06\xbf\xfa\xd2\x99\x94\x75\x6b\xe9" + "\x38\xca\x03\x39\x1b\x57\x3e\x90\x9f\xb3\xc1\x3e\xdf\xba\x61\xad" + "\xd8\x52\x13\xe2\x7b\xd1\x86\x55\x0f\x58\x89\x8a\xe4\x2c\xbe\xf3" + "\xce\x9c\x6f\xdd\xf3\xfd\x1f\x24\xb2\x6f\xad\x44\x5a\xd1\x3a\xeb" + "\x9d\x19\xf3\xe5\xab\xef\xdd\x71\xfb\x7f\xe6\xdc\xbe\xf4\x9e\xbb" + "\x97\x4f\x61\xd3\x9a\x04\x9c\x20\x79\x2f\xbe\x97\x3d\x97\x29\x6d" + "\x18\x9e\xb5\x9f\x69\xc3\xf0\x2c\xd6\xcf\x67\xf7\xe2\xe7\x61\xec" + "\x39\x48\x33\xcf\x65\xe2\x67\x53\xf1\x66\x22\xe8\x7a\xb6\x31\x8a" + "\x37\xcf\x09\xff\xba\x24\xf3\x4b\x9d\xe9\xb3\xa0\x7f\xcf\x04\x62" + "\xdf\x45\x69\xc1\xaf\x7f\x29\xe8\xa5\x8a\x17\x84\x0f\x39\x61\xa3" + "\xc0\x0d\xc9\xaf\x3c\x1b\xd0\x70\x43\x9c\x93\x43\x3a\xe9\xba\xe8" + "\x3d\xf0\xbb\x82\xf4\xc2\xc0\x05\xb1\x9f\x49\xe9\x3c\x39\xb3\x42" + "\x2d\x77\x3e\xe9\x89\x89\x9f\x55\xf7\x3d\x52\x06\xd9\xaf\x57\x73" + "\xd7\x3e\xbf\x94\x05\x9f\xbd\x42\xe0\xcd\xd6\x39\xdf\x12\xfb\x47" + "\xe2\x3c\xc2\xaf\x73\xa3\xf8\xf3\x5c\x26\x8d\x0d\xd1\x05\x49\x7b" + "\x7f\x5d\x72\x96\xfe\x25\x0e\x69\xf5\x9a\x1f\xec\xa2\x2b\x98\xde" + "\x70\x45\x3d\xdb\xa1\xe7\x65\x3e\xf6\xeb\x2c\x69\xc7\xf6\xeb\x16" + "\x8d\x7f\xc6\x3d\xe6\xff\xa7\x59\x67\xeb\xad\xea\x62\xf4\x56\xa5" + "\x76\xfe\x49\xa7\xdd\x4f\x3c\xb2\xc7\xeb\x17\xfe\x17\x6f\xeb\xb4" + "\x07\xc8\x67\x5f\x62\x3f\x7b\x2e\xde\x19\xe1\xe3\xb8\x9f\x83\xbe" + "\x89\x35\xe4\x06\xa9\x37\x80\x3c\xf6\xdc\x02\x29\x9b\xc8\x74\x82" + "\xbb\x8f\x3d\xbb\x9f\x64\x33\x1a\x1f\xdc\xd7\xc7\x59\x12\x6e\x99" + "\x8a\xee\xa5\x94\xeb\x55\x3f\x37\xcf\x55\x91\x8c\x4a\xb0\x7a\x5c" + "\xaf\x14\x3c\xee\xc2\x0f\x57\xa2\x7d\x51\xfe\x92\xab\x7b\x0d\xcf" + "\xb9\xdb\x1c\x43\xb4\x6e\x86\xa6\xb5\x2f\x2c\xe6\x3d\xda\x78\x2e" + "\x8d\xf8\x6f\xa3\xf1\x0a\xba\x9e\xf3\x68\x63\x39\xf2\x2f\x8f\x76" + "\xc5\x95\x33\xeb\xe1\xc6\x9b\x28\x1d\xf3\xff\xb9\x2c\xd5\x7e\x32" + "\x70\xf6\xb7\xa0\xc3\x59\xf2\xfb\xfd\x4c\xfb\xfe\x6c\xff\xa9\xe2" + "\x80\x1f\x29\xa7\x6e\x11\x2a\x2c\x9b\x1a\xee\xf6\x8c\xb3\x3a\x74" + "\x06\xb3\x4d\xe2\xa4\xa6\x3b\x33\xcb\xfe\xec\x3f\xad\x54\x43\xfe" + "\xae\x1e\x98\xa3\xea\x01\x30\xb7\xf7\xef\xbe\x9e\xb1\x35\x81\x8d" + "\xd9\x93\x7a\x12\xd2\x2f\x90\x4f\x34\xb4\xc3\x1d\xa3\xdb\x9a\xb4" + "\xf1\xf2\xb1\xfd\x21\xb2\x39\x41\x39\x69\x54\x0e\xcd\x2b\xa9\x9b" + "\xd9\xdf\x4a\x3e\x74\x50\xde\x5a\xb1\x77\xe9\xda\x6f\x16\xb8\x07" + "\x59\x5b\xc8\xf9\x25\xfc\x73\xd5\x06\x42\xf0\x2e\xf2\x3c\xcf\xfe" + "\xa1\x49\x7d\x8f\x38\xdb\xb2\xbf\x80\xec\x3a\x83\xae\xe7\x0d\x53" + "\xe9\xf9\x40\x1f\x0a\x56\xae\xcd\x5b\x77\xff\xfd\x5f\x4d\x1a\x62" + "\x6d\x2d\xeb\x5d\x8a\x1b\x65\x42\xfe\xdd\x91\x2d\xf1\xf4\x79\xd0" + "\xff\x6a\xc9\xeb\x82\x87\xc1\xbc\x99\x3b\xc8\x9e\xf7\x68\xfc\xbb" + "\x9c\x47\xcf\x77\x70\xd7\xf3\xe6\xe8\xdc\x78\xbe\xe1\xcb\x73\xe3" + "\xf9\xfd\x53\xcf\x8d\xe7\xbb\xb0\xce\xf6\xe0\x7d\x07\xea\xec\x10" + "\x34\x9f\xc6\x5b\xf2\xe0\x1e\x53\xf8\x36\xc1\x83\xe7\x6c\x62\x3a" + "\xe2\xbf\x49\xa7\x4c\xeb\x41\x04\x72\x6d\x04\x34\x22\x27\xcc\xcc" + "\xb4\x16\x6c\x5f\x4b\xfa\xc2\xcb\x79\x78\x8c\xfb\x72\x36\x81\x5e" + "\xe0\xb9\x6e\x50\xee\xb3\xde\x3b\x0a\x39\x04\xf7\xdb\xfb\x89\x56" + "\x28\xe4\xac\x9d\xc9\xf5\xfa\x37\x59\x1a\x8f\x6b\x2a\xb7\x0a\x1f" + "\xbe\x62\xdd\x06\x9e\xd1\xba\x9d\x13\x31\x79\xe4\xba\xfd\x9b\x82" + "\x73\xea\xa6\x93\xe7\x66\x4d\x95\x8e\x36\xb6\x51\xbb\xd0\xce\x16" + "\xb4\xeb\x00\xb5\xa7\xee\x7e\xea\x57\xdc\xcd\xa6\x70\x86\xd8\x1b" + "\xa0\x76\xde\x1b\x60\x37\x53\xfb\xee\x7d\xe8\x66\xd6\x74\x3f\xed" + "\xef\x4a\xbb\x1e\x15\x97\x0c\xc0\x99\x99\xfd\xec\x85\xb4\x80\x88" + "\xa9\xf8\x1b\x8c\xbd\x51\xf2\xf5\xea\xde\x09\xe5\xa1\x77\x12\x4f" + "\x5f\x48\x3b\xec\xa0\x36\xbf\x90\xa6\xe5\x8b\x6d\xdb\xed\x2b\xed" + "\x60\x2c\x57\xdf\x7f\x7f\x7e\xe1\x7a\x2d\x3e\xb4\x6d\xdd\x9a\xbc" + "\x5b\xd5\xf3\xae\x6b\xf3\x37\xe6\xac\xce\x13\xf6\xf4\x48\x95\xb7" + "\x67\xf1\x1a\xf3\x49\x16\x10\x36\xaa\x82\xcf\xf8\xdd\xe9\x26\x95" + "\xe7\xe8\x65\x2d\x6e\xb9\xff\xdc\xf2\x4d\xb9\x0e\x5c\xf0\x10\xda" + "\xb1\x57\x5b\x07\x48\x1f\x31\xc2\xae\xb0\xd1\xbe\x10\x9d\x61\xa6" + "\xfd\x27\xd2\x49\x20\x4f\xbb\x8f\xfd\xa6\x48\xc3\xed\x5a\xa4\xd3" + "\xb9\x09\xcf\x5a\xb2\xb5\x3b\x30\x5b\xa9\x3a\x9e\xca\x13\xdf\x6b" + "\x07\x0d\x48\xa2\xb5\x81\xf6\x43\xa4\x3f\xfe\x96\x54\xa2\x6d\xa4" + "\x37\xf3\xac\x25\xdb\xb5\x17\xfa\xb0\x96\x83\x07\x3e\x90\x06\xb9" + "\x28\xb5\x62\x33\x33\x52\x1d\x58\x37\x7c\x52\xcf\xda\x92\xf1\x5a" + "\x09\x63\xea\xda\xe1\xab\x15\x3a\xc5\x17\xa4\xcf\x44\xf7\x71\x9b" + "\xaa\x73\xb0\x21\x1f\xf0\x3f\x99\xc9\x36\xbf\xe7\x17\xfb\x5e\x82" + "\x2e\xb4\x94\xf0\xea\xee\x32\x61\x5f\x58\xfd\x9e\x5f\xe1\x05\x71" + "\xf4\x0c\xba\x9c\x88\x72\xf6\x72\xa7\x8d\xa9\x36\x89\x71\xfd\xec" + "\xb7\xf1\xb8\x1a\x30\x1e\x3b\x08\x16\x28\x3f\x53\x2d\x3f\x13\xe5" + "\x63\xfd\xbb\xac\x5e\xce\xaf\x96\x36\xad\x2e\xe0\xb6\xdf\x9f\xe0" + "\x0f\xd3\xfa\x85\xf6\x27\xe1\x67\x96\xfa\x99\x10\xe4\xa4\xcb\x27" + "\xf5\x33\x92\x47\x6a\x09\x6b\x38\x49\x75\xab\x7d\xc8\x20\x9f\x2f" + "\xa4\x4f\x50\xeb\xca\x20\x5d\x81\x56\x26\x47\x99\x7c\x6c\xa8\x19" + "\x6b\x8d\x11\x73\xcc\x9f\x52\x1e\xa6\x34\xb3\xe0\x71\x03\x97\x73" + "\xac\x39\x91\x9c\x88\x41\x9e\x37\xdf\xc4\x92\x63\xf9\xdb\xa0\xeb" + "\xb7\x6b\xa2\x3c\x19\xca\x18\x03\x2d\x2b\x65\x65\x7d\xec\xb7\xc2" + "\xff\x19\xd9\x73\xd0\xb8\x8e\x63\x9c\x30\x56\x5d\xa8\xa7\x05\x7c" + "\x79\x32\xe0\xf0\x2c\x8d\x57\x9d\x82\x39\x37\x2e\x78\x75\x13\xc5" + "\x4e\xef\x65\xbf\x7d\x82\xc6\x8a\xca\xe2\xee\xee\xe6\x70\x30\xfb" + "\x3f\xc8\x2f\x15\xc1\x7a\x4b\x09\x1f\xa0\x3d\x3a\xe0\xd6\x6c\xe2" + "\x61\xc1\xd7\x8b\x7b\x67\x1e\x57\xc4\x58\x0b\x3b\xc5\xdf\xcd\xde" + "\x32\xc0\x95\xd3\x2e\xc6\xdb\x41\x4b\x4f\xeb\x59\x38\x04\x19\x14" + "\xed\xd6\x3b\x4f\x90\xef\xac\x66\xcc\x2f\x37\x43\xbd\xc6\xba\xcd" + "\xcc\x4c\xbe\xc6\x9c\x76\x1e\xea\x0c\x34\xb2\x4e\x7b\x23\x7b\x33" + "\xbc\x83\x79\x8a\x49\xa7\xf9\x3b\xcf\x5b\x8e\x1d\x64\x17\x9e\x80" + "\xfb\x72\xeb\x7f\x52\x5d\xff\x9d\xfd\xd6\xd1\x77\xd8\x5b\x9e\x77" + "\x98\xf5\xbf\xc4\x73\x41\x47\xf6\x9b\xac\x23\xeb\x4d\xe6\xec\xe3" + "\x0a\xf1\x43\xa5\x0f\x52\x1d\x6e\x94\xd5\x4c\x3e\xba\xcc\xca\x88" + "\x25\x11\xfd\x37\x2c\x75\x30\xb1\x0f\xe8\x59\xfb\x12\xda\xf8\xdf" + "\xc7\x9a\x4e\x31\xa3\x67\xed\x9f\xc4\xbd\xd0\x2f\xa0\xbf\xde\xbc" + "\x6e\x61\x23\x46\x3e\xc9\xbc\x8e\x01\x3a\x5f\xa9\x6c\xa7\x36\x46" + "\x64\xbb\x01\x2f\x83\xf6\xfd\x9e\xd2\xc9\xef\x85\xaf\xd8\xdd\x04" + "\x0f\xb4\xe9\xc8\x72\x09\x93\x8e\x6e\xc0\xf4\x3f\x55\xf8\x64\xc7" + "\xc2\xe7\xbf\x8d\x04\x1f\xb2\xff\x54\x8a\x87\x9a\xd1\xb6\x2c\xc0" + "\x40\xd1\xea\x20\x1c\xa0\xfd\x2a\x2a\xbf\xee\x14\x4b\xf2\xac\x25" + "\xfb\xd0\xdf\x3d\x68\x5a\x66\x30\x2a\x63\x27\x5a\xb6\x8f\x32\x03" + "\x8d\x1b\xad\xb3\xdb\xc5\x7b\x01\xf3\x65\x34\x66\xfe\x84\x01\x23" + "\x7e\xc0\xcf\x01\x33\xe1\x1e\xae\xa9\x18\x2f\x37\xe0\x34\x80\xb1" + "\x6a\xa6\xab\xc4\xc7\xf7\x69\x3c\xcd\xb4\x96\x01\x57\xa2\xe9\xd5" + "\xef\xdf\x16\xc6\xdc\x51\x84\x9c\xf6\xdf\x03\x4a\x55\x20\x24\x6d" + "\x05\x5f\xb0\xed\x06\x5f\xdc\xf8\x98\x38\x8f\x9e\x04\x5e\x5e\xac" + "\x8b\x3b\xc5\xb9\x95\xdf\x4d\xae\x7f\xd5\x22\x96\xf9\xef\x2c\x7a" + "\x61\x13\x76\x7c\xbe\x8a\xeb\xf3\x83\xae\x03\x68\xcf\x2c\x55\xae" + "\x6e\x11\x67\x5a\x88\x0e\x4c\xc7\x93\x80\x2e\x77\x90\x8d\x1d\xbf" + "\x2c\x9b\x25\xe9\xb8\x3f\x29\xd7\xc4\xbd\xe1\x36\xc2\xa1\x24\x81" + "\xfb\xf2\x1d\xf8\x48\xbf\x09\xb4\xbc\x0b\xe9\x06\x2d\x9d\xe8\xba" + "\x02\xd9\x92\xe4\xda\xa5\x9b\x4c\xbc\x74\x94\xa5\x09\x1d\x91\x96" + "\xbe\xc9\x6f\xea\xb4\x30\xb2\xb9\x0f\x93\x1f\x0a\xfa\x06\xe9\x71" + "\x58\x07\x0e\xa1\x5e\x0f\xf2\xa7\x6a\xf9\xf9\x48\xb6\xc1\xeb\x68" + "\x13\xf3\x8c\x7c\x2b\x69\xeb\x02\xd2\xe3\x97\x3a\xfc\x26\x31\x66" + "\x5a\xda\xfa\x6c\xb1\x8e\xd1\x99\x77\xf0\xa9\x5c\xb4\xa7\x5f\xa4" + "\xeb\x20\x67\x8a\x58\xe9\x31\x69\x7a\xf2\x2f\x40\x7e\xf1\x62\xd2" + "\xe2\xd0\x66\x36\xf9\x8c\xba\xb7\xff\x44\xec\xd3\x5b\x96\x6e\xa2" + "\x3d\x31\xd4\xf3\x13\xb5\xee\x4d\x9c\x49\x7f\x9b\x32\x4d\xae\x99" + "\x2f\x16\xc5\xca\xb8\xb4\x47\x41\x75\x2b\x23\xd9\xfa\xc8\x48\x76" + "\x1c\xd5\x4f\x65\x91\x7e\x52\xc4\x6c\x0f\x0f\x30\xf2\xf5\xcc\x6b" + "\x33\x9b\x39\x9d\xb1\x40\xb9\xa2\x3d\x0e\xc8\xff\xc9\x0b\xac\x53" + "\xda\x47\xd4\x5c\x99\xed\x29\xfd\x2f\xe0\xf4\xef\x4b\x88\xa6\x44" + "\x8c\x43\xe9\xd6\x9f\x90\xdd\xc1\x8b\xa3\x34\xa6\x11\xcc\xf3\x48" + "\xc2\x50\xfa\x0d\x03\x4c\x57\x8a\xb9\x23\xf7\xea\x7e\x7f\x09\xf1" + "\x54\x4e\x85\x73\xdc\x1b\x09\x77\x4d\x43\x90\x5b\xaa\x86\x6c\xc2" + "\xde\x23\x65\xde\x32\x6f\x68\x80\x75\x94\x7d\xc0\x3a\xc2\xde\xb2" + "\x43\xa7\xfc\x06\x69\xf7\x61\x40\xb9\xbf\xbf\x86\xde\x39\x31\x5f" + "\x72\x22\xcd\xd3\xcb\x81\x90\x2d\x00\xbb\x8f\xe5\x5a\xf0\xfb\x12" + "\x4d\x9e\xf8\x8a\x3e\x1c\x25\xdf\x86\x64\x17\xa7\x54\x87\x69\xad" + "\x70\xf2\xa0\x8d\xdd\xb0\x99\xf4\xba\xbf\xdf\x9f\x12\x60\x59\x6a" + "\xb9\x5f\xa8\xe5\x1e\x3d\x57\xb9\x84\xb7\x1d\x0d\xd2\xd6\x42\x49" + "\x0c\xdb\x23\x28\x3b\x92\x18\x6e\xc1\x5a\xe3\x74\x9e\x26\xdd\x49" + "\xeb\x6c\xd4\x63\xef\x0c\x77\x31\xf2\x91\xda\xa4\x60\xbd\xfe\xc2" + "\xc2\x54\x1b\x17\xe7\x49\xf6\x87\x78\x85\xdb\xcc\x90\x73\x48\x57" + "\xea\x24\x3a\x4b\xba\xe7\xd2\x08\x9b\xe1\xc5\xc8\x92\x8f\x3f\x94" + "\x91\xfc\x3a\xe9\xa5\x41\xab\x22\xdc\xa2\x7f\x79\xcc\xc7\xb6\x83" + "\x7e\x0b\x9f\x7f\x5b\x2f\xdb\x99\x52\xce\x6e\xe3\x7a\x93\xb0\x61" + "\x52\x6a\xd3\xdc\x18\xdb\x7d\xa2\x3d\xd5\xc7\x17\xc5\xd8\xd3\xc4" + "\xa1\xae\x2a\xb2\xa7\xe1\xc6\xe3\x64\xa7\x12\xe0\x18\xb3\xa0\xeb" + "\x0f\x07\x7c\xec\x45\xc1\x97\xd4\x90\x1e\x40\xd0\xf9\xd6\x2b\xfc" + "\x09\xa1\x65\x54\x06\xf9\x02\x52\x8a\xc3\x2d\xdb\x87\x99\x41\xc2" + "\xa3\x55\xd7\x39\x14\xf4\x70\x77\x68\x19\xcd\x23\xb5\x6c\x13\xca" + "\x7e\x9b\x57\x85\x96\xf9\x58\xab\x55\xd2\x1a\xba\xff\x83\xd8\xeb" + "\x08\x4f\xd0\x39\x9c\x3f\x14\x34\x8e\x93\x4e\xee\x0f\xa0\x2b\x97" + "\x7b\x46\x8c\xa1\x65\xdf\xb7\x94\x81\x07\x68\xcd\xf4\xe9\x3e\x59" + "\x22\xd6\x76\xd5\x7f\xe1\x74\x7b\x50\x7c\x97\x25\xd1\x8b\x42\xc0" + "\xe3\xa6\x0e\xb2\x97\x7e\x39\x0e\x39\x7f\x02\x6b\xeb\x38\xe4\x04" + "\xbe\x2b\x3b\xa9\x6e\x0e\xcb\xc0\xbb\x39\x83\xac\xb5\x2a\xac\x67" + "\xa9\xf8\x99\xfd\x97\x15\x24\xa0\xdc\x2c\xd2\x7f\x1e\x39\x45\xfb" + "\xae\xad\x82\xee\x6f\xdf\xc9\xd2\x15\x94\x47\x7a\xd7\xed\x73\x58" + "\x3a\xe9\x5c\x91\x66\xcb\x89\xc8\x3d\x09\x4d\xa6\xda\x3a\x87\xcd" + "\x3f\xb3\xde\x56\xbb\x94\xe5\x5e\x12\x6b\xfc\x46\x3f\x9b\x67\xff" + "\x06\xef\xed\x67\x07\xf3\xb8\x2b\x8e\xf3\xcb\x2c\x7a\x29\x53\x1c" + "\xbc\xcb\xd4\x20\xf1\x4e\xe8\xe0\x81\x6f\xb4\xc7\xa1\xea\x76\x75" + "\xc2\x6f\x63\xa2\xff\x00\x9d\x83\x10\x69\x3a\x33\xc1\xd2\x2c\xda" + "\xa1\xfa\x5c\x8b\x6c\xbd\x96\x62\xbb\x09\x5f\x6b\x39\x2b\xa5\x5e" + "\x98\xfc\xb1\x01\xc6\xe2\x3c\x58\xcd\x4e\x96\xf4\xc8\x4e\x66\x3e" + "\x72\x3f\xf5\xeb\x60\x89\x9c\x8b\x06\x46\xed\x55\xdc\x34\xcf\x80" + "\x13\x68\x37\xd5\x47\xb8\xd1\x19\xfe\xc2\xe3\x2c\xe2\x8a\xe7\x27" + "\xe4\x0b\xe0\xe0\xcb\x9e\xc2\xfd\x6c\x29\xf9\xaf\x23\x1f\x36\x2b" + "\x98\x7f\x0f\xca\xdb\x33\x87\x99\x51\xd6\x1b\xde\x35\x44\x6b\x2d" + "\x57\x7a\x0a\x0f\x50\xd9\x1f\xd1\x7a\x54\x0b\xf8\xc8\x75\xe9\xa5" + "\x7a\x6f\xa8\x9b\x91\xbf\xfa\xbb\xed\x3c\x42\xe5\xf4\xb3\x97\x2e" + "\x11\xfd\xdd\x65\xb1\xe6\x48\x9f\x79\xa2\xaf\x93\xfa\x76\xb5\x1f" + "\xde\x53\x54\xde\x4b\x36\x6f\x2e\x78\x4e\xb5\x4f\x1a\xac\x25\x7e" + "\xbd\x94\xef\x29\xdc\xcb\x68\x7c\x28\x3f\x9e\x97\x7b\x87\x90\xf7" + "\xc4\x99\xe3\x42\x79\xf0\x6e\x1b\xca\xfd\x5f\xd1\x7d\x24\xda\xdf" + "\x88\xe6\x69\x44\x7f\x00\xab\xf6\x5d\x80\x91\xd4\xaf\x1d\x1c\xa6" + "\xb6\xfa\xd8\x41\xbf\xb7\xe8\x83\xa9\xcf\x1f\x61\xee\x03\xef\xcb" + "\x3b\x85\x6e\xe9\xa5\x4f\xee\x0e\x2b\x5c\xd2\xb3\x3f\xee\x00\xef" + "\x06\x3e\xf4\x8f\x3b\x88\x16\x08\x7a\x72\x3d\xed\xfd\xfe\xf1\x09" + "\x93\x4e\x8e\x2f\xf5\x85\x78\xa6\xa9\xc6\x38\x46\xaf\x6f\xa6\xb6" + "\x6a\x63\xcc\x93\xae\xcc\x56\x68\xbf\x66\x0e\xe0\x3d\x61\x61\x12" + "\xff\x78\x3d\xca\xdd\xa6\xf2\x90\x65\xea\x7a\x5a\x36\x92\x30\x94" + "\xc1\x1f\xb6\x30\xcd\xd6\x0e\xf3\x77\x7e\x8e\xb4\x5f\xb4\x10\x8d" + "\xda\xa3\x97\x73\x87\xda\xa8\x7e\x5b\x22\xf7\x91\xff\xb8\x1c\xdf" + "\x97\x4c\xd9\xdf\x38\xd0\x1d\x17\xc8\x34\xfa\x23\xce\x05\x80\x56" + "\x61\x3d\x98\xe1\x0d\x8c\x33\xb9\xb7\x7d\xe8\x42\x8a\x1d\x4f\x67" + "\xc2\xb4\xb6\x9d\x9f\x0e\xfe\x8f\x3d\x52\x07\x7f\x28\x4d\x93\x37" + "\x79\x12\x60\xec\x32\x09\xdf\xe5\xe0\xbb\x94\x40\xf2\x95\xb9\xfe" + "\xe4\xcc\x7a\x39\x6f\x0e\x2d\xe6\xc9\x92\xde\xe6\x84\x58\x19\xf5" + "\x4b\x95\xbb\x66\x50\x9f\x51\x4e\x9e\xb6\x17\xac\x95\x3d\x6d\x3c" + "\x00\xad\x6f\xe8\x93\xe8\x1b\xfa\x28\xfa\x46\xfe\x30\x64\xdf\xc4" + "\x79\xdc\xf3\xeb\xcf\x21\x19\x23\xa0\xe6\xca\x5c\xcf\x1c\x2a\xe3" + "\x95\x4d\xc2\x16\x1f\x63\x02\xfa\x70\xe9\x20\x7b\x39\x93\x27\x3e" + "\x92\x78\x7e\x65\xbe\xcc\x64\x99\x99\xf5\x4f\x80\x06\xcb\xf3\x41" + "\x64\xc3\xf2\xca\x4a\xd0\xf2\x7a\x92\x61\x46\x50\x1f\xf0\x23\x86" + "\x0e\xbd\xdc\x47\x63\x75\xfd\x7e\x96\x25\xf1\xf0\xe5\xf7\x49\x2f" + "\x21\xe3\xb5\xbc\xec\x06\xde\x8b\x33\x78\x51\xbb\x4c\x9d\xb0\xcb" + "\x8c\xa5\xb1\xe7\xd9\x46\x29\xd3\xa4\xa4\x65\xe0\xde\x21\xec\x74" + "\xd0\xde\x8d\x61\x8d\xfe\xbd\xec\xe0\xa4\x1b\x2e\x55\x75\x84\x44" + "\xcb\x4a\xa5\x3f\xad\xa0\xeb\x15\xcb\xa4\x8e\x90\xce\x4f\xba\x78" + "\x3b\xe5\xc3\xd8\x7f\x41\x79\xa4\xbf\x9f\x41\xf5\x6c\xe1\x2b\xd7" + "\xa9\xe7\x06\x6d\x64\x8f\x84\x6f\x97\xfb\x58\xaf\xe0\x33\x09\x06" + "\x54\xb7\x68\xbb\x9e\xf4\x81\xaf\xd8\xa3\x3a\xd9\x97\xc5\x79\x6e" + "\x79\xf6\xf7\x15\xb7\x86\x23\xe8\xef\x0c\xe9\xa3\xff\xd0\xf0\xe1" + "\xf9\x4c\xe0\xc0\x08\xb7\x24\x5e\xd5\x48\x38\xf9\x4a\x4b\x2c\x9c" + "\x96\x86\x15\xa7\xa4\x41\x2f\x37\x70\x31\xd7\x5f\x6e\xf8\x6a\x7e" + "\xe2\xd5\x78\x8d\x17\x91\x70\x36\x83\xbe\xbc\xd6\x25\x60\xed\xee" + "\xf6\x91\x5f\xcd\x87\x4b\xc9\x37\xf0\xab\xaf\x93\xdf\xe5\xb0\xfb" + "\x7d\x16\x71\x5a\x28\xa6\x0b\x53\xdc\xef\x9b\xfb\xed\x4c\x9f\x63" + "\x27\x3d\x74\xc8\x4a\x32\x1e\x64\x56\x33\x4f\x04\x7f\x82\x79\xbe" + "\x65\x35\x33\xfd\xa8\x00\x65\x3b\x6d\xa9\xe4\x17\x99\x7c\x22\x93" + "\x5f\xf3\x88\xd3\x76\x11\xee\x67\x81\x9f\x33\x73\x63\xb7\xd8\xcb" + "\x8e\xb8\x38\xe8\x71\x0f\xf9\x66\xd6\x7b\xfd\x21\xb6\xe5\x04\x33" + "\x92\xdf\xe5\x70\x55\x68\x61\x67\xe0\x23\x21\xdf\xa4\xd8\x59\x2a" + "\xf8\x8f\x34\xc0\xdc\xa2\x24\x84\x20\x87\x86\xd2\x65\xbf\xbf\xe0" + "\xb2\xdf\xb2\xdd\xd4\x7e\x41\xe3\xdc\x1f\x9a\x4b\x45\xdb\x5f\x5b" + "\x1d\x46\xf9\x8a\xdb\x97\x14\x71\xfb\x8c\xf2\xfc\x6a\x07\x2b\x2d" + "\xe2\x03\xde\x40\x07\x64\xae\x51\x11\x87\x8a\xf6\xca\xa9\x8f\xd4" + "\x3f\xaa\xfb\xad\x53\x27\x84\x1f\xe9\x30\x9e\x9d\x6b\xd4\x6f\x86" + "\xf0\xcd\x50\x07\x1b\x77\xfb\x44\xdf\x3b\x03\xf2\xdb\x1c\x71\x4f" + "\xdf\xc7\xc0\x41\xed\xf3\x24\x1c\xd0\x77\xea\x1f\xf5\x3f\x4c\x30" + "\x01\x0c\xd4\xbe\x5a\x26\xd4\x7e\x52\x1f\xdf\xc4\xaa\xb3\x13\xfd" + "\x44\x5f\x45\x3f\x27\xd0\xcf\xf6\x02\xc6\x42\x75\x57\xda\x4f\x27" + "\xfa\x8c\x24\xa3\x3a\xdf\x06\x0f\x5f\x52\xcf\x20\x8b\x1a\x9e\x2f" + "\xad\xd7\x57\x83\x37\x29\xf5\x43\x26\xf5\xf3\x01\xb2\x53\xf5\xda" + "\xf1\x0b\x37\x32\xe2\x71\x34\x7e\x1d\x75\x5b\xde\x52\x3e\x63\xa5" + "\x03\x7c\x00\xbc\x69\xc8\x1b\x46\x9e\x02\xf4\x1f\x32\x6c\xbf\xda" + "\x7e\xca\xbb\x65\x58\xf6\xcb\xb4\x86\xa5\xbe\xfa\x5f\x6e\xbd\xb7" + "\xdb\xcd\xb4\xbe\xdc\x8b\x7c\xe8\x8f\x05\x65\x89\x38\x34\x0a\xfa" + "\xb9\x0b\xed\x0c\xc5\xf4\xe9\xc8\x10\xd9\xca\xbe\xcb\x12\x97\x31" + "\xdd\xce\x93\xe8\xc7\x49\x66\xa9\x2f\x05\xff\xf5\x3d\xe2\x17\x3d" + "\x4f\x5f\x90\xcd\xd2\x7d\xec\x55\x19\xaf\x55\xfa\x79\xbd\x64\x90" + "\xbd\xf6\x86\xe6\xcb\x55\x21\x5f\xd8\x09\xa1\x45\x84\x47\xc2\xaf" + "\x2b\xad\x19\x41\xe0\x0c\xed\x69\x6f\x44\x1d\x41\xdb\x2c\xd1\x1e" + "\x97\xf4\x05\x8b\x67\xf2\x97\x4f\x67\xc3\x74\xf8\x6e\x21\x07\xcc" + "\xa8\x7c\xf0\x73\xa2\x1e\x82\xe1\x94\x76\xa5\xbf\x61\x0b\x51\xc7" + "\x22\x92\xbf\x5b\x4a\xfd\xfa\x6d\xbf\x61\xf3\xcf\x8f\xa6\xbc\x16" + "\x9a\x8e\x7e\x93\x2e\x93\xca\x43\xdf\x2e\x1a\x64\x7f\xfa\xe8\xcc" + "\x39\x66\x15\xb4\x4c\xd2\xc1\x3f\xed\x25\x5d\xe1\xf9\xd5\xfb\x27" + "\xc1\xc3\x91\x3d\xc2\x79\x7e\xb7\x4f\x6b\x07\xee\xbf\x64\x47\xa4" + "\xb5\xfd\xfc\xe1\x70\x98\x4d\x57\x56\xed\x93\xc2\x66\xd0\x59\xf7" + "\x24\xe8\x05\x78\x85\xc3\x16\xda\x77\xc0\xda\xb9\x37\xc0\xd6\xef" + "\x66\x46\xe7\x09\xd2\x0b\xdd\xc5\x0e\x37\x66\xb0\xa6\x53\xe4\x9f" + "\xc9\x76\xd1\xe3\xa7\x30\x96\x2a\x0d\x21\x9e\x94\x74\xae\x7c\xbd" + "\xcd\xbc\xfd\x49\x8d\x87\x3f\xfc\x46\xc9\x28\xd3\xcb\xd8\xdf\x87" + "\xdb\x17\x5b\x79\x78\x87\x5e\x29\x68\x24\x3f\xc7\x29\x69\xcd\xe4" + "\xe7\x58\xf3\xfb\x2b\x78\x1f\x07\xe6\xdc\x88\x25\xb1\xb6\x90\xcd" + "\x27\x1f\xe5\x26\xbf\xe4\xe5\xe4\x7a\x7d\x98\x6c\x37\xcd\xaa\x2f" + "\x60\xb3\xea\x0b\x38\x8b\xec\xaa\xe5\xfb\xb6\x6b\x22\x90\x61\x44" + "\xb9\x85\x2c\xbd\xf1\x14\xb3\x11\x1f\x94\xf3\x99\xe4\xd9\x48\x2e" + "\xbc\x6b\xc8\xc4\x23\xc7\x6d\x6c\xf7\x60\xd4\x87\xb9\x7f\x3d\xf9" + "\x3d\xe7\x96\xe9\x6c\x84\xb7\xcf\x12\x7b\xef\xc2\x2f\x25\xe9\xe4" + "\xf1\xcc\x76\x3c\xc6\x0c\x87\xc9\x8e\xaf\x59\x9e\x37\x3a\x1c\x96" + "\x36\xad\x41\x57\x5b\x83\xe6\xe3\x79\xda\xbd\x65\xb7\x94\x77\x94" + "\x19\x90\xbf\xfc\x41\x8f\xf4\xf7\xd7\xe6\xf3\x56\x28\x31\x32\x4e" + "\xdb\x6b\xf4\x8e\xd2\xc8\x87\x52\x96\x80\xe5\xeb\x46\x92\x7b\x54" + "\x99\xf1\x55\xab\x96\xa6\xca\x8c\xc2\xae\xd8\x22\xf7\xca\xb0\x36" + "\xa5\x04\x5d\xaf\xa7\x6b\xeb\x19\xad\xeb\x52\x37\xfc\xfa\x42\x9f" + "\xee\xd3\xb2\x73\xb4\xcf\xac\xda\x41\xd3\x3e\x47\x16\xf2\x17\x68" + "\xeb\x9b\xd8\xef\xdc\x3a\xe7\x5b\xeb\x37\xb1\xb4\xef\xcf\x36\x32" + "\xda\x2b\x43\xde\x01\xb9\xee\xbe\x5e\x1f\xd5\xa7\x67\x09\x78\xd3" + "\x79\x60\x21\x63\x90\x9f\x3d\xe9\xaf\x7c\x48\xf3\xb7\x27\xd7\xdf" + "\xd7\x9f\x8f\xa9\xa7\x6b\x72\x1d\x45\x1d\x64\x67\x4d\xe5\x4b\xde" + "\xe4\xf5\x0a\x71\x66\x0c\xf9\xe4\xfa\xfa\x7a\xc5\x39\x78\x31\x1b" + "\xc1\x57\x51\xe5\x49\xef\xd0\xe7\x12\xbe\x0e\x16\x77\xc3\x0e\x66" + "\x79\xb5\xd4\x67\x48\x91\x7e\x74\x4d\xbd\xec\xcf\x57\xd0\x7b\xc2" + "\x75\xcf\xf5\xa4\x0f\xfc\xf3\x16\x2f\xad\xdb\x13\xd9\x49\x77\x93" + "\xac\x2f\x78\xf1\x3f\xaf\xb9\x0e\xdf\x21\xed\xa2\x57\x4e\x86\x0c" + "\xdb\x37\xb3\xf9\xd2\x6f\xe1\x9f\x45\x6c\x60\xff\xa5\x0f\x04\xaf" + "\x4a\x65\x96\xab\x76\x30\x5b\xd0\xf5\xe7\x1d\x90\x2f\x05\x8f\x20" + "\xea\xaf\xcb\xf4\x90\xaf\xf6\x17\xc6\x7d\xf1\x72\xac\xfe\x72\x23" + "\x9e\x6d\xd1\xe7\x3f\x1f\x51\xf7\x52\xd0\xf7\xbf\x64\xec\x39\x29" + "\xed\xc5\x85\x7e\xa9\x66\x6e\xcc\x5e\xfd\x5f\x6e\x94\x6d\xf9\xcb" + "\x8d\x87\x41\x4d\x76\x3f\xc9\x8f\x36\xcd\xe2\x5d\x41\xd7\x5f\x0c" + "\x3e\xf6\xfa\x62\x55\x1f\xd3\x25\xf0\x8a\xf8\xdd\x4a\x92\xc1\x3e" + "\xf7\xd4\x22\x1f\xad\x13\xe0\x8f\xb2\x04\x0f\x0f\x5e\x57\x01\xfe" + "\xc4\xf4\x7f\x37\xe9\x1b\xa7\xa4\x89\x3b\x19\x13\xdf\xd4\xa6\x35" + "\x08\xdb\x8f\xda\x05\x16\x5c\x81\x6b\xf3\xb2\x70\x4d\x02\xce\x2d" + "\xc3\xd5\x8c\xeb\x12\x5c\x53\xf1\x5e\xc8\x0a\x90\x61\x2d\x14\x6f" + "\x6e\x24\x39\xad\x7e\xba\xb3\x3f\x04\x1b\x6f\xc5\x7f\x32\x69\xdf" + "\xd6\x9e\x4a\xb1\xc6\x96\xee\x66\x6c\x7d\x98\x8f\x5b\xe7\xb1\x99" + "\xbd\x48\x73\xee\xa6\x7d\xe7\xbf\x0c\x9c\xb9\xef\xdc\x6e\xc4\x6f" + "\x09\x7e\x8d\xf8\x75\xe0\x97\x1a\xfd\xbd\x61\x0c\xba\xda\x53\x01" + "\x47\xe9\x0f\xe2\xbc\x68\x62\xbb\x38\x2f\xbe\x9d\xe4\xa2\x84\x70" + "\xae\xec\x6f\xa6\x1d\xcf\x46\x9e\x9c\xd9\xa2\xf6\x37\x17\xcf\x66" + "\xab\x13\xeb\x5a\x32\x60\x32\x07\x7d\x4e\x5e\x60\xa1\xfe\x52\x7b" + "\x47\x92\xe7\x65\xc5\x9e\x7b\xa2\x32\xa9\xff\xfe\xe4\xb9\x54\x1e" + "\xe3\xff\xf2\x68\x97\x06\x4f\x15\x4e\x74\x26\x44\x3f\x82\x32\x24" + "\x1f\x84\xfc\x28\x43\xcb\x3f\x09\x7b\xe4\x13\x72\x22\xf2\x41\x26" + "\x36\x6a\x67\xaa\x82\xae\x37\xd8\x6b\x6b\xe4\x7e\x06\x7d\x1b\x88" + "\xf9\x96\xfc\x7c\x4c\xf5\x3d\xea\x34\xca\x3a\xe7\x65\xf5\xb3\xf6" + "\x4b\xd4\x7a\x03\xd3\xcd\xa5\xd2\x2b\xc0\xdf\x35\xfa\xe8\xfc\x0f" + "\xf1\x43\x8b\xbc\x69\x01\xe6\x6d\x54\x98\x52\x37\xd7\x9e\x55\xca" + "\x3d\xfd\xec\x8d\x17\x3b\x43\x03\xe7\xb9\x1e\xbe\x21\x65\xd1\xf1" + "\x32\xe6\x2d\xb9\x49\xd8\xab\x9f\x64\x6f\x7e\xe6\xf5\x8b\xb3\xb5" + "\x74\x2f\x7c\x3e\xd3\x7e\x33\xad\x0d\xe4\xc3\x5e\x93\xb1\x15\xe4" + "\x6d\xa2\x74\xa4\xd1\xf9\xff\x3d\x31\xef\x78\x5d\x9a\x43\xce\xa9" + "\x37\x77\x13\x6f\x21\xda\x1b\xfe\x0f\x0f\xb5\x59\xa9\x49\x73\x50" + "\x1f\x9c\x90\xff\x28\xce\x1f\xcd\x09\x6b\x31\xe9\x0a\xdf\xdc\x04" + "\xbc\xe3\x4a\x6d\x9a\xe3\xfc\xfa\xf0\xa6\xf0\xc3\xee\x0c\xf3\x93" + "\xfe\xe4\x34\x07\xf1\x24\xdb\x4b\xe3\x8d\xb7\x37\x72\xcf\x48\xca" + "\x5c\x7b\xd0\xf5\x66\xe3\x6b\x0e\x39\x36\xe7\x59\x6e\xa3\xd6\xf7" + "\x26\xb5\xef\x80\x97\xd8\xa3\xba\xa1\x41\xc6\x06\x40\x9e\xa3\xd3" + "\xea\xac\x30\xce\xc4\x0f\x60\x6d\x38\x2d\x61\xf1\x56\xfa\xe4\xda" + "\x70\x5e\xed\x78\x2b\xfd\x1f\xa8\x63\x42\xad\xc3\xfd\x3f\xac\xc3" + "\x7d\xae\x3a\xe4\x5e\x73\x47\xea\xf9\xcb\x8e\x6f\xf9\x04\xae\xd4" + "\xcc\xcd\x95\x34\xf3\xc8\xb6\x08\xe4\xb7\x70\x52\xa6\x9d\x78\x1b" + "\xb2\x2b\xf5\xfa\xc2\x2c\xec\x0e\xe7\x1e\x71\x8c\x33\x4f\xf1\x3b" + "\xac\x8f\x75\xdc\x45\xdf\x1c\x29\x22\x99\x2d\xb3\x65\xa2\x6e\xae" + "\x67\x42\xff\x56\x1e\xc1\x7b\x37\xc5\x61\x88\xc1\xb3\xce\xc0\x3b" + "\xcc\x9b\x4b\xfa\xd5\x2e\xd2\x6b\xb7\x80\x3e\xd8\x15\xd0\x06\xf0" + "\xe8\x11\x01\x0f\xf0\x2f\x42\xde\x82\xcc\x26\xe4\x2d\xbf\xf0\x4f" + "\x9a\x0c\xbe\x37\x89\xbb\x1e\xcf\x23\xdd\x77\x64\x22\xdb\x1a\x74" + "\xb1\x65\x14\x13\x81\xf4\xce\xdc\x78\xdc\xb2\x34\x1c\xc7\x85\x3c" + "\x05\xde\x9f\x62\x23\x78\x03\x3e\x16\x01\x1f\xdd\x38\xc6\x52\x1b" + "\xc1\x7b\x82\x66\x9b\x89\xae\xef\x51\x63\x23\xd4\x8e\x45\x63\x23" + "\x34\x91\xae\xa7\x1b\xf7\x63\xcc\x10\xa9\xbd\x32\x7b\xd7\x18\x4b" + "\xdf\x5d\xcc\x6c\xbb\x48\x97\x77\x4c\xf2\x3e\xc2\x0e\x9c\xe2\x24" + "\xac\xb3\xd1\x5e\x42\x94\xf7\xa1\xb3\xe0\x51\xba\x65\x10\x3a\x90" + "\xf3\x82\xf7\x11\xb1\x0e\x86\x6b\xd2\x1a\xc2\x49\x0b\x2c\x13\x75" + "\xf3\xb2\x7c\xac\xa3\x02\xf0\x9b\x52\xe7\xa5\xd9\x93\xec\x88\x89" + "\x6d\xf1\x5a\xba\xa4\xef\x28\xab\x7d\x3a\x9c\x88\xec\xca\x66\x37" + "\x0c\xb1\x0c\x79\x0e\x31\x01\x6b\x62\xe7\x7c\xb2\xff\x2b\x7d\x90" + "\x59\x22\xbb\x56\xe8\x9c\x4f\xb3\x38\x6f\x38\x8b\xd1\xaf\x74\x98" + "\x0f\xdc\xb0\x86\x65\xd0\xfe\x03\xed\x95\x58\x1f\xa6\xfc\x47\x22" + "\xe9\x25\x2c\x23\xb6\xec\x07\x37\x15\xae\xbe\x31\xe3\xc7\xf9\xd6" + "\xfb\x57\x17\x3e\xb8\x71\x65\x61\x3e\x5b\x22\xcd\x26\x84\xeb\xe7" + "\x4d\x64\x33\xb1\x71\x75\x51\x81\x75\xd5\x86\xc2\xc2\xfc\xb5\x45" + "\xd6\xbb\x6e\x5f\xf6\x65\xff\x7f\xbb\x2c\x7b\x85\xbf\x57\x61\x43" + "\xe7\xfd\x88\xff\xec\x6b\x63\x75\xc5\xcc\x60\x2a\xbf\x63\xb9\x29" + "\xbc\xc4\x2a\xe3\x23\x01\x57\xaa\x87\x0f\x70\x67\x76\x83\xe4\x53" + "\xbb\x74\xaa\xdd\x53\xab\x3c\x5b\xd1\x25\x75\x32\xc1\x25\x69\x72" + "\x4e\x79\x2f\x8c\x2b\x62\x74\xff\x20\xdd\x9b\x8a\x98\xdb\x33\x87" + "\xf6\xc3\xbd\x17\x8a\x7c\xbb\xee\xd4\x69\xf9\xb4\x3c\xf2\x7d\xa7" + "\x88\x9d\xd8\x24\x7c\x61\x76\x2e\x04\x7c\x2e\x0a\xba\xbc\x36\x9f" + "\xfe\x3d\x87\xba\xbf\x3e\x20\xed\xf5\xba\x18\xf9\xc3\xe3\x3f\xbb" + "\x6c\x4c\x2d\x27\x17\xf5\x5d\x80\xbc\xcb\x31\x06\x3d\xaa\x5d\xdf" + "\xe5\xbd\x6a\xbb\xa4\xdd\x69\xe7\x77\xa4\x7d\x87\xd7\x11\x73\x1e" + "\x5b\x9c\xa9\xa7\xb5\x51\xe5\x49\x83\x6a\x79\x8d\x1a\x4d\x40\x7e" + "\x8a\x7f\xe3\x3e\x7f\x5a\xe8\x95\xf2\xcf\x19\x7e\x4e\x54\x38\xed" + "\xb2\x3c\x03\xfa\x90\x36\xc8\x3a\xeb\xcf\xc6\x97\xc9\x11\xfc\xf6" + "\xda\x55\xeb\x1e\xb4\xaf\x2c\x5a\x7d\xdf\xea\x35\xab\x8b\x36\x89" + "\x63\xe0\xf3\xc5\xbf\x7f\xbf\x3a\x6f\xf9\xd9\xbe\x9b\xe7\x93\x8e" + "\x45\xf5\xf9\x1a\x20\x9b\x06\xa9\xe7\xea\x7a\x22\xec\x62\x97\x9f" + "\x5f\xbb\xbb\x72\x85\x3e\x58\xf8\x1f\xe8\xda\xeb\xd3\xf5\xd6\xab" + "\xfb\x1d\x43\x2a\xec\xc5\xfb\x91\xa4\x05\x74\x3e\x7b\x51\x2f\x3b" + "\xba\x98\xf6\xb9\x00\xbf\x65\xb4\x1e\xd6\x6d\xa6\x75\x0b\xa3\x10" + "\xbe\x49\x8d\xcf\xfa\xf6\x6f\x09\x06\xc4\x13\x02\x06\x7b\x7b\xd9" + "\xdb\xb3\x05\x0c\xbe\xb0\xec\x15\xbe\x07\xbe\xb0\x3c\x43\xb8\x45" + "\x6d\x56\x78\xf6\x2e\xce\xb3\x77\x2a\x5f\x14\xec\xe2\x5f\x14\xec" + "\x8c\xfa\x8d\x7b\xbb\x02\xdf\xee\xc7\xb7\x55\x14\x87\xa6\xee\x24" + "\xdb\x4f\xfb\xdf\xf4\x6c\x2a\x32\xb3\x48\xd2\xdc\x25\xd4\x1e\xef" + "\x40\x86\xe0\xb7\xfb\x90\xdf\x1b\xb8\x89\x81\x97\x5c\x26\xce\x34" + "\x8a\xfd\x3a\xf0\x7b\xf8\xce\x8b\x76\x79\x07\xc6\x49\x26\x5e\xa2" + "\x80\xe7\x43\x7f\x0f\x60\xfd\xac\xa7\x72\xa9\xcf\xe2\x5c\xf1\x2c" + "\xee\x0b\xba\xde\x6e\xf6\xb1\x4e\xbb\xca\x9b\x0a\x7b\x0b\x82\xc1" + "\x99\xe3\xf9\xb6\xf0\xe9\x00\x18\x5f\xca\xdd\xef\x67\xc8\x31\x7d" + "\x5b\xf8\xba\xb8\xb3\x8f\x7f\x11\x3d\xcf\xfe\xf6\x09\x3c\x4f\xe0" + "\xa7\x70\xf7\x07\xcb\x62\xf6\x95\xf1\xee\x9d\x4b\x04\xef\x36\x8b" + "\xfb\xed\x9b\x29\x6e\xf7\x3b\x57\x48\xbc\xf9\x60\xa9\xdf\x59\x10" + "\x87\x6f\x22\x74\xfe\x52\xc2\xf2\x9d\x6f\x7a\x2b\x4e\x6a\x76\x1a" + "\xa8\xff\x9d\x4f\x3c\xf7\x87\x99\x88\x23\xdd\x17\x16\x76\x7f\xaa" + "\x8f\x01\x9d\xe2\xea\x22\x3f\x7b\x66\xc8\x76\xb4\x17\x2d\x7c\xa4" + "\x07\x5d\xef\x14\x4d\x9e\x13\x4b\x92\xfc\x1e\xf1\x5c\x14\x63\x8b" + "\x70\x9f\xf8\x37\x6a\x13\xe1\x3e\xca\x6e\xa6\x3d\x6a\x39\x07\xde" + "\xd9\xff\x3f\x9b\x03\xef\x08\xfd\x2f\xca\xca\xe2\x7a\x27\xbf\xa1" + "\x86\xe5\x0a\x1b\x82\x70\x80\xce\xcd\x1a\xb0\x6e\xa8\x36\x65\x47" + "\xe7\x0a\x3b\x93\xe2\xa1\x66\x3a\x9b\xba\x67\x9c\x25\x29\xee\xe3" + "\x66\xe2\xb3\x8f\x94\x08\xdb\x0b\x23\xbe\x6b\x21\xdb\x0c\xb2\xa5" + "\x4b\x11\x71\xdb\xde\x61\x7b\x46\x99\xa1\x8f\xfd\x75\x3e\xed\x05" + "\x45\x61\xfd\xd7\x72\xda\xfb\xe3\xd5\xef\xb5\x9b\x4a\xf4\x6e\x2a" + "\x43\x19\x3b\xb1\x50\xfb\x8e\x62\x04\xd3\x77\xbd\xec\xaf\xf9\xe2" + "\x3b\xca\x4b\x3e\x96\x4a\xcd\x2b\xc0\x67\x35\x50\xfe\x30\x9e\x9b" + "\x14\x33\x64\x91\x05\x96\x48\x71\xb8\x05\xef\x96\x2b\x35\xf3\xb2" + "\x90\x96\x2d\xf6\x20\x26\x2c\xb4\x37\xc9\xb8\x31\xb4\xcc\xeb\xfb" + "\xdc\x23\xda\x43\x67\x69\x8b\xb0\x76\x0a\xb9\xe4\xaf\x07\x9b\x8e" + "\x89\x78\x72\x18\xcf\xa3\xd2\x77\xe6\x49\xb6\x4f\xb6\xef\xe8\x5d" + "\x23\xd5\x3e\xe3\x08\x70\x33\xa0\x37\xb2\xc3\x16\xe0\x66\xcd\x02" + "\x5c\xc7\x31\x3e\x47\x53\x41\xeb\x16\x4a\x9e\x58\x7e\xa7\xe1\x64" + "\x9c\xc5\xbc\x04\xef\x33\x35\x7b\x24\x0d\x1f\x7d\xec\xaf\x49\x04" + "\x37\xe0\x71\x77\xe7\x1a\xb2\x2d\x53\x3a\x50\x17\x8b\x14\x2b\x3d" + "\xb4\x37\x4e\x76\xfb\x24\xcf\x2c\x75\xf0\x11\x92\xcf\xe8\xac\x13" + "\xed\x87\xd3\x19\xee\xdd\x90\x6f\xa9\x6c\x94\x5b\xa3\x9d\xe5\xae" + "\x45\x1a\x95\x4d\xe7\x99\xea\x7e\x22\xe6\x1a\xd9\x70\x26\x89\x3d" + "\x81\xb8\x07\x8e\xdd\x1d\xe0\x23\x74\x5e\xfe\x6e\x3b\xae\x6a\x39" + "\xe4\x67\x07\x65\x74\x69\x65\x28\x64\xff\x5a\x28\xec\xdc\x7c\xf2" + "\x7b\x69\xff\x73\x77\x40\x11\xe7\x50\xe8\x7b\x69\x97\xf3\xae\x61" + "\xd2\x86\x52\x9c\x0d\x79\x37\x55\xf3\xc3\x83\x7b\xeb\xe4\xd9\x36" + "\xc0\x6a\xa4\x66\xee\x92\x00\xe6\x78\xa0\x26\xad\x1e\xef\x16\x81" + "\xc2\xec\x3d\xa7\x8e\x82\xce\xef\x6f\x60\x7a\x25\xf1\xf8\x22\xf2" + "\xcd\x40\x67\x3e\xa5\xdd\xf6\xbb\xbb\x55\x3f\x0d\x71\x27\xd9\xbb" + "\x3f\x88\xee\x8d\x47\x54\xbd\xee\xbb\x6d\x52\xae\x78\xb7\x4d\xe8" + "\x75\xeb\xe6\x66\xfc\x62\x73\x48\xdf\xb2\xd9\xa7\x97\xb6\x8c\xef" + "\xb6\xfa\xd8\x47\x43\x51\x5b\xc6\x77\x1d\x54\xd6\xd4\xfe\x2c\x86" + "\x55\x9b\xcc\xbf\x89\xf3\xb5\x51\x39\xfd\x6f\x62\x9d\xa3\x7d\x6c" + "\x85\x78\xba\xc4\xb0\x9d\xec\x96\xbc\xf6\x53\xa4\xdf\x9d\x21\x75" + "\x06\x7f\x53\xe3\x08\x0b\x3b\xc5\x8b\x07\xcf\x7c\xbe\x88\x9e\x25" + "\xcc\xfe\xb6\x44\xdb\x2b\xaa\xd3\x2b\x3e\x93\x8e\x71\x67\x33\x68" + "\x9e\x3d\x20\xfc\x03\x78\xc1\x23\x52\x6c\x6c\x7b\x21\x9d\x05\xfc" + "\xdb\x16\xf2\x1b\x20\xe7\xdc\xdf\xc4\xb9\x24\xc5\x75\x1b\x77\x92" + "\x9c\xe4\xa7\x58\x1d\xa7\x18\xf2\x5d\x88\x7c\xcf\xb6\x95\x0c\x91" + "\xdd\x97\x81\xe2\x44\xf6\xa9\x75\xfb\x13\x86\xcd\x57\x25\xb1\x5c" + "\xd4\x79\xc8\xc7\x9e\x5d\x7c\xfe\xf4\xe0\x6f\x87\xce\xc5\x33\x4b" + "\x1e\x2e\x8b\x4d\x27\x77\x93\x5e\xe5\x7a\xd4\x7f\x17\xa7\xf6\xbf" + "\xf7\x6c\x58\x1f\x62\x13\xfa\x99\xfc\x6b\x65\x0e\x16\x76\xcd\xe4" + "\x91\xcd\x18\xaf\x11\x0b\xe4\xb2\x0e\xd6\x29\x6d\x61\x68\x3f\xdf" + "\x54\x1a\xe0\xa7\xbc\xe1\x03\xa4\xd7\xf7\x63\xac\x40\x8f\xde\x7b" + "\xda\x1b\x7e\x99\x91\x7d\x32\xd1\x91\x5e\xf6\x9e\xf0\xc7\x74\xbd" + "\xbd\x8c\x5d\x77\x52\xbc\xbf\x53\xf2\x73\xef\xed\x53\xaf\x0e\xf2" + "\x8f\x19\xdb\xa6\x7f\xdf\xb0\x76\x15\x39\x59\xbd\xee\xce\xfc\xe2" + "\xfc\x35\xd6\xef\x91\x0b\xd6\xb3\x6c\x0d\x8d\xd1\xb8\x62\xdd\x45" + "\xb4\x46\x12\x4f\x4d\xf1\xc5\x44\x6c\x31\x57\x26\x9b\x8c\x2b\x46" + "\xbc\xf5\xff\x0f\xb1\xc5\x34\x9e\x99\xe2\x8a\x45\xf7\x64\xde\xcf" + "\x9c\x9c\x03\xca\xab\x41\x7a\x16\xeb\xb2\xeb\x3d\x3a\xa7\x64\x90" + "\xeb\x46\xf7\xfe\x58\x1f\x36\x82\x67\xaa\x0a\x2d\x43\x7a\x9b\x76" + "\x66\x13\xb8\x98\x84\xe7\xa3\xd1\x33\x22\xdd\x3e\xc0\x4d\x9c\xa3" + "\x24\xfb\x05\x3c\xfb\x35\xdb\x05\x35\x66\xb4\xb0\xb5\x50\x2a\x2f" + "\xdd\x2f\xf5\x85\xdd\xa3\x4d\xca\x4c\xa3\xdc\xab\x7a\x3f\x4d\x3b" + "\x83\x24\xe7\xe6\xab\xea\xdc\x7c\x3f\xf3\x5c\xf6\x25\xd1\xb9\xf1" + "\xbe\x3d\x3a\xaf\x3f\xd6\xbe\xb5\x7f\x95\x6d\x8a\x2a\xb7\x5d\x32" + "\xc8\x3e\xdc\x46\x3a\x44\x79\xe6\xf8\x43\xe1\x93\x52\xfa\x81\xf8" + "\xf0\xdb\xea\x3d\xea\xf8\xf0\x46\xf5\xfe\x32\xdc\xcf\x56\xef\xe7" + "\xe0\x5e\xa7\xde\x63\xce\x7e\x70\x4c\xbd\x4f\xc5\xfd\xdb\xea\x3d" + "\xd6\x84\x0f\x0e\xaa\xf7\xb3\x70\xff\xb4\x7a\x3f\x1b\xf7\x55\xea" + "\x3d\xe6\xe0\x07\x0f\x31\xb9\xcf\x6f\xec\x67\x1f\xfc\xe8\xfc\xe5" + "\xc8\x0f\x6c\x72\x2f\xf9\x03\xc8\xdc\x5d\xea\x9a\x32\x99\x56\x82" + "\xb1\xe9\xd0\xe0\x8b\x74\x2b\xd5\x83\xf4\x1d\x3e\xd6\xb6\x37\x26" + "\xdd\xac\xe6\xc7\xfa\xff\xee\x92\x98\x74\x83\x9a\xde\x06\x79\xb5" + "\x3d\x9a\xfe\x7e\x48\x4d\xef\x41\xfe\xae\x98\xf4\x21\x35\x1d\xf4" + "\xf2\x95\xee\x98\x74\x9f\x4c\xff\x30\x49\xb3\xab\x51\xd3\x8f\xaa" + "\xe9\xe9\x3e\xf6\x7b\x77\x4c\x7a\xbb\x9a\x0e\xfa\xff\x7e\x56\x4c" + "\xba\xa0\x2b\xd2\x27\xb1\x89\x1f\x2e\xa1\xb9\xf5\x61\xae\x8f\x1d" + "\x72\xc4\xe4\x69\x51\xbf\x75\xf8\xd8\x1f\x9b\x63\xd2\xf7\xaa\xe9" + "\xf5\x3e\x5d\x62\x6a\x4c\x7a\xc3\x74\xb4\x4a\xd7\xc0\x72\xa7\xd3" + "\xb5\x93\x5c\x22\xec\x8b\x05\xaf\xdc\x73\x84\xce\x34\x99\x76\xf3" + "\x5e\x6b\x29\xe7\xbd\xac\xe7\x80\x6a\x4f\x4b\xbe\x05\x86\xe8\x7c" + "\x58\x1f\xeb\xd9\xad\xfa\x16\xf0\x8b\x33\x63\x9b\xe9\xcc\x58\x8f" + "\xe0\x01\x6f\x70\x94\x49\x7f\xb9\x5a\xec\x05\xd2\x39\xa9\xfb\xf1" + "\xc8\xf3\x6d\xd2\xc1\x53\x39\xa4\x97\xf6\x16\x8d\x4b\x5f\xca\x90" + "\x4d\x29\x8d\x74\x2f\x04\x8f\x58\x1d\x93\xa4\xfb\x3d\x47\x94\x71" + "\x3a\x97\x29\xf5\x53\x34\x17\x29\x3f\xd9\x90\xc5\xe6\xf5\xb1\x1e" + "\xe1\xb3\x3a\xce\x72\xe1\x53\x41\x57\xcf\xfe\xe8\x79\x98\x1e\x83" + "\x9a\xde\x80\xf4\xb6\x68\xfa\x87\xfe\x69\x69\x3b\xe8\x20\x37\x76" + "\x9b\x27\xc6\x78\x20\x3c\xc6\x43\x75\x7f\x97\xb6\xe4\xa0\x75\xf3" + "\x22\xee\x6e\x2b\x9d\x17\xa1\x98\x8c\xe1\x62\xee\x27\x3b\x45\xa4" + "\x5f\x70\x77\xc0\x0f\x1e\x23\xc8\x6b\xef\x23\x9b\xd4\x51\x46\xfb" + "\xa5\xce\x21\x8a\x97\x65\xe2\x74\x0e\x79\xcb\x09\x96\x44\xe7\x49" + "\xc8\xe6\x9c\xf6\x32\xef\x2a\xf0\xb3\x23\x05\x11\xd6\x84\xb2\x77" + "\xdf\xa7\xf1\x17\x1f\xe5\x45\xcf\xba\xbe\x47\xfb\xcb\xf3\x9c\x22" + "\xf6\xec\x47\xc2\x57\xaf\xa9\x9c\xf6\xf9\x17\xd8\xf8\x9f\x88\xe7" + "\x4d\x2b\x33\x95\x33\xf0\x1c\x1f\x35\xe3\xde\x2e\x7f\x78\x87\xf4" + "\xe9\xfa\x24\xe7\xf2\x47\xd2\xdf\x9a\xbb\xbb\x5e\xd2\x8b\x8f\x7a" + "\xf8\xcf\xe9\xfc\xc4\x47\x3e\xd0\x1b\x1b\xf8\xeb\x29\x7d\x25\x6e" + "\xd9\xcd\xf4\x13\xd5\xe0\x4d\x4e\xb6\xea\x25\x7d\xfa\x7b\x87\xa2" + "\x37\x96\x93\xfe\x5b\xc4\x9f\xac\x3e\x7e\xe7\xfe\xb5\x21\xfd\x91" + "\xcd\x7d\xec\xe1\xd9\xcc\xb2\x22\xa4\xa7\x3c\x77\xa5\x14\xa1\x6e" + "\xf0\x24\xe0\x53\xf5\xbf\xc3\xfb\x57\xd6\xb6\xea\xc3\x82\x5f\xf9" + "\x7b\x87\xd0\x99\xba\x8f\x5b\x69\x0d\xf1\x76\x47\x88\xc7\x4e\x02" + "\x8f\x6d\x06\xfd\x37\x46\x36\x16\x5c\x14\x5e\x5f\x70\xc1\xee\x42" + "\x96\x14\x59\x6f\x4b\x7d\x7c\x8c\x2d\xd4\xd6\x9f\xdd\xc5\x58\x53" + "\x82\x96\xc4\xed\x58\x53\x48\x17\x93\xa2\x33\x8b\xbd\x61\xba\x57" + "\xf4\xaf\xf5\x35\x15\x9f\x3b\x86\x6e\x64\xa3\x4d\xf8\x4b\xa0\xb6" + "\x4c\xd5\xd7\x9a\x9d\xcc\x10\x51\xcf\x55\x96\x7e\xc6\x66\x81\x2f" + "\xd6\xa7\x8c\x72\xcf\xe0\x1a\xa6\xa7\xf8\xa3\xa5\xf9\x42\xdf\x19" + "\x7f\xa4\x20\xcc\xbc\x8e\x0f\x58\x69\x21\x8d\xd1\xc7\x57\x10\x9f" + "\x46\x36\xc6\xc8\x6f\x1e\x64\x1f\xdf\x68\x0a\x61\xcd\x08\x81\xd7" + "\xfe\x09\xc9\xb6\x1f\xdf\x21\xfd\x33\x7c\xec\xa6\x73\x90\x9e\xc2" + "\x6f\x51\xda\x4a\xe7\x67\xc2\x96\xc7\x20\xcf\x5e\x7e\xbc\x88\x9e" + "\x9d\x74\xce\x33\xd1\x9f\xf9\x9b\xf1\x50\xbc\xd4\xa9\x7d\x7c\xab" + "\xba\x3e\x58\xa5\xcc\xf6\xf1\x97\xce\xa8\x4d\xea\xfa\xdd\x3d\x19" + "\x9c\x62\x99\x35\x12\xff\xca\x7d\x62\xdf\x9d\xce\xbc\x3b\x6e\xf3" + "\xf0\xb1\x7a\xd5\x87\x8e\x4f\xa7\x54\xf5\x64\x48\x3f\x77\x1f\x9f" + "\x66\xd2\x66\x0e\x6b\x64\x4f\x96\xd8\x73\xa8\xea\x59\x26\x74\xf0" + "\x55\x3d\xb9\x5b\xe7\x90\x8d\xbf\x8f\x8d\x24\xf4\xd8\xd1\xf6\xa3" + "\x23\x89\xa3\xd3\xed\xdb\x19\x20\x53\xe6\x5a\xe7\xb1\x54\xda\xfb" + "\xc9\x89\x48\x3f\x8f\x72\x0e\x7f\x82\xb2\xc5\xbb\xcb\x7b\xed\x2c" + "\x4e\xca\x86\xbe\xef\xde\xd0\xc8\xac\x68\x6b\x32\x37\xf6\x98\x85" + "\x2d\xa2\xbb\xc7\xea\x1d\xa2\x38\x2d\x11\x26\xf7\xe8\x3e\x31\xf3" + "\x84\x1e\xb3\x9a\xff\xe9\xce\x21\xf4\xc1\xf8\xa1\xcf\x1b\x3a\xa1" + "\xf2\x84\xbe\x66\x5e\xf5\xa1\x8f\xbb\x3f\xf4\xcb\xf3\xd2\xbe\x61" + "\x8d\xae\x4a\x1c\xf5\x7d\x26\x71\xfd\xfd\x5c\x09\xb7\x4f\xcc\xea" + "\x7a\x75\x39\xdd\x63\xed\xce\x90\x36\x25\xbe\x1e\x8d\x47\xf6\xa9" + "\x79\xe8\x1b\xf4\xdb\x23\x69\xad\x0f\xe9\x1f\xef\x90\xef\x7d\xcd" + "\x94\x86\xfe\x61\xcd\xf2\x2d\xa4\x7e\x4d\x47\x5b\x05\x2c\x4a\x58" + "\x1c\xfa\x47\x3c\x2d\xd9\xed\x07\xbc\x81\xdb\x3c\x5e\x31\x06\xbd" + "\x4f\x91\xbd\x3d\xd5\x43\x3e\x71\x88\x6e\xa2\x4c\x01\xa7\x68\xfb" + "\x3f\xd9\xa2\xb5\x85\xea\xa3\x77\xe8\xab\x88\x63\xa1\xa0\xcf\x94" + "\x87\xc6\xb5\xdf\x4e\xba\xb8\x51\xc0\x8c\xec\xda\x7a\xf7\x11\x4c" + "\x24\xcc\x7a\x2b\x54\x59\x5d\x1d\x87\xde\x4d\x67\xc2\x43\x3e\x2b" + "\x46\xd0\x86\x42\xb2\x6f\xea\xdd\xa7\xc2\x4f\x8d\x31\xd0\x2b\x7c" + "\x2b\xa8\xef\x92\x63\xbe\x9d\x3b\x99\x17\xed\x26\xde\x88\x6c\x05" + "\x68\xef\x48\xe2\x6b\xef\xc2\x98\xef\x16\xe6\x0c\x83\x47\x06\x0f" + "\xb9\xf5\x49\x11\xb3\x2d\x23\xe8\xea\xbd\x33\x0a\x6f\x59\xce\x14" + "\x75\xcc\xd3\xea\x40\x9e\x24\xad\x9d\x18\x1f\x75\x0d\xee\xad\x8f" + "\x8e\xc9\x27\x2d\xda\x77\xa4\x97\xc1\xf3\x0a\x8a\x7f\x38\x8d\x5f" + "\x78\x9d\x37\x0d\x34\x38\x7c\x9b\x47\xe0\x23\xfb\xd4\x48\xb6\xe3" + "\xdc\xdd\xa3\xfa\x37\xe8\x55\xf5\x46\x9f\x1a\xa9\x4c\xda\xff\x93" + "\x71\x42\x3e\xc5\x2c\xf8\x24\x4d\xd6\xf7\x69\xaa\x6c\xc3\xa7\x90" + "\xff\x7c\x49\x67\xcb\x75\xdf\x5a\x99\x67\x5d\x76\xa3\x38\x33\x7a" + "\xdd\x06\x3b\x1d\x07\xcd\x8b\x3e\x9c\xc9\x73\x9b\xa3\xbe\xb5\x3e" + "\xcd\x9d\xf4\xad\xe5\x1e\xce\x94\xf0\xff\x74\x3f\x1f\xe3\x3b\xe8" + "\x3c\x07\x2f\xe6\x0d\x75\x18\x43\xe7\x28\xbb\x94\xe2\xd0\x96\xda" + "\xf9\xe7\xe4\x77\x0d\xf4\x72\x0d\xe8\x07\xc5\x61\x9f\x49\xb6\x42" + "\x44\x7f\x48\x9f\xc5\x13\x90\x5e\x75\xdc\x1e\x3d\x47\xd6\x4f\x36" + "\x5c\x25\xdc\x99\x4d\xf1\xc3\x49\x3f\x25\xe2\x04\xf5\xb3\xfe\x6c" + "\xe4\xab\xc0\xbb\xa2\x5a\xa1\x23\x38\xde\x1e\x31\x0e\x27\x39\x4f" + "\xb0\x19\x22\xc6\x97\x23\xc4\xac\x3f\xa1\xf3\x46\x7d\xc9\x28\xb3" + "\x1d\xe9\x29\x22\x3d\x14\x22\x5f\x01\xed\x78\x97\x82\x77\xdf\xc6" + "\x55\x41\x19\x8e\x3a\xb4\xbb\xf4\x04\x9b\x87\xb6\x0c\xa0\x9e\x76" + "\xb4\xb3\xdf\xf9\x20\x9b\xd5\x69\x1f\x20\xf9\x0e\xe5\xf9\x98\xea" + "\x4f\xa3\x1d\xdf\xed\x46\xbf\x1c\xa4\xeb\xc0\xb5\xa4\x16\xd7\xd2" + "\x08\x4b\x29\xdd\x82\x75\x6f\x0b\xea\xa7\x73\x99\x28\x87\x7c\x68" + "\xc8\xb6\xa0\x6f\xa4\x1b\x43\xb9\x5b\x86\x78\x3f\xca\x1e\x38\x32" + "\x84\xf2\x1c\xdd\x93\x65\xaa\x3c\x35\xe6\x77\xff\x77\x79\xf5\x68" + "\x06\xda\xd4\x40\xf6\xd4\x48\x03\x4d\xee\xbf\x33\xca\x0f\xf7\xdf" + "\xa5\xde\x27\x4c\xe6\x75\x66\xb3\xd2\xd3\xcc\x22\x6c\x02\x36\xc6" + "\x81\x1e\x7f\xd6\x43\xbe\x9a\xa2\xbe\x3b\x3f\x7b\x17\xf9\x16\xa2" + "\xcc\x1a\xb5\x4c\x4a\xeb\x8a\xf2\xcf\x9f\x69\x3c\x73\xe2\x64\xde" + "\x2f\x95\xd9\xbf\x89\xca\x94\x7e\x95\x3e\xb5\xca\x33\xc9\x9f\xad" + "\x98\xf4\x89\x30\xc6\x5b\xe8\xcc\x9d\x52\xcc\x0f\x90\x4e\x82\x74" + "\x21\x24\xbf\xd0\xb9\xbb\x9c\x4d\xee\x32\xa1\x8f\x98\x25\x75\xa6" + "\x92\x67\xf8\xac\x61\xf2\x8c\xc0\x93\x22\x1e\x81\x3c\x53\x47\xe7" + "\xf4\x0a\x85\x3e\x25\xb8\x74\xd3\x46\x27\x7d\x4f\xdf\x22\x7f\x7b" + "\xf4\x2c\x53\xbf\x43\xea\xee\x46\x17\xd2\xbd\x5f\x6b\x97\xeb\xd3" + "\x0c\xa9\x7b\xfe\x2c\x30\xa9\x7f\x2b\xe6\x6d\x34\x4e\xe2\x8c\x21" + "\xd9\x00\x46\x98\x3b\x27\xec\xd6\xce\x0a\x0f\x05\x5d\xfd\xd6\x98" + "\xb3\xc2\x43\xa2\x0d\xe3\xe2\x3c\xfe\xc6\xa5\xe1\x8d\x5c\x9e\x21" + "\xed\x5f\x1c\xad\xbb\xcf\xaf\xd6\x9d\x41\xf7\x7e\xe9\x13\x8b\x6c" + "\x03\xad\xd2\xae\xa3\xdf\xae\xd9\x52\x60\xbe\x75\x13\x7e\x4e\xed" + "\xbb\xbf\xbf\xe1\x4c\xff\x3c\x9f\x17\x90\xef\x70\xa4\xc7\x9c\xff" + "\xed\xff\xca\xf3\xbf\x4e\x3f\xff\x84\x70\xc8\x2e\xe2\xd0\x7e\x0e" + "\x5a\x3b\x9c\x24\xfd\xdf\x7f\x2e\x74\x2e\xbd\xec\x73\x1b\x9e\x4d" + "\x72\xdf\xe1\xf3\xd9\x2a\xbd\x29\x5b\x1a\x09\x9b\x7c\xa8\x53\xf8" + "\xfb\x89\x3e\x9b\xc9\x7f\x01\xf2\x7d\x5b\xfa\x0d\xfe\xdc\x78\x56" + "\x7e\x7a\x7f\x76\xfe\xac\xb3\x9e\xad\x01\xcc\xc3\xe9\x6c\x46\x6a" + "\xe7\x08\x7d\xa4\x35\xa5\x9c\xd9\x9d\xc7\x58\x1c\xe6\xc7\x67\xd4" + "\xb6\xce\x01\x71\x9e\xcc\xc4\x5d\x19\xcc\x3b\x10\x96\xbc\x28\x78" + "\x80\xde\x74\xe4\x39\xc6\x66\xd1\x79\x06\x8a\x0f\x80\xfc\x83\x32" + "\x26\xc0\xc0\xf0\x8a\x0d\x89\x4c\xf9\x71\xf6\x05\x5c\x7f\x5f\x2b" + "\xed\x59\x3f\x3f\xee\x23\xbf\xfa\xba\xd2\xa7\x58\x1a\xcd\x3d\xcc" + "\xc1\x3e\xae\x5f\xd5\x8a\x6f\x86\x7e\x31\x3e\x10\xef\x0d\x7f\xc0" + "\xec\xa0\x09\x83\x6c\xa0\xcf\x50\xc2\x0c\xdb\xfb\x99\x19\x78\x16" + "\x3e\x1c\x5e\xc8\xb4\xf3\xf7\x8d\x17\xc9\x73\xdd\x8d\xc0\xc9\xf5" + "\x16\x1e\x0a\xba\x06\xb2\x20\xab\x2d\xd7\x64\xf2\x1a\xe9\x7f\xcb" + "\x80\xfa\x9f\x17\xbe\x02\xe4\x9a\x07\xd8\x0e\x6c\x91\xe7\x19\x53" + "\x2f\xc5\x37\x45\x51\x7e\xfd\x18\x53\xf7\x70\x32\x24\x6d\x3c\xc6" + "\x0e\xe7\x31\x11\xd3\x68\x44\xf8\x47\x1f\x68\x9e\xb4\xbd\x11\x7a" + "\xae\x63\xa0\x07\xc3\x19\x92\x97\x1f\xce\xc8\x89\x18\x55\x9e\xe1" + "\x98\x58\x8b\xe8\x5b\x7c\x67\x92\xb1\xcb\x06\x7a\xa2\xb8\x36\xb0" + "\x97\xd6\x08\xf4\x09\x32\xde\x80\x85\xfa\x45\x30\x09\x08\x5f\x5b" + "\x03\x69\x87\xf7\x4e\x13\xdb\xc2\xd8\x5d\x1f\x16\x3a\x93\xb9\x36" + "\xe0\xd3\x09\x8c\xc1\xc5\xe4\x6f\xc8\x8b\x7a\x8e\x34\x8d\xb3\x23" + "\x96\x11\xd6\x89\x7b\xb2\xb1\xf7\xfc\xe4\x53\xd6\x67\x9d\x7a\x7d" + "\x52\x20\x77\x80\x37\xb7\x52\x59\x44\xdf\xc8\x2e\xd1\x5b\xc2\xc4" + "\x4e\x93\xb7\x8f\x89\x32\x8e\x28\x03\xec\x88\xe3\x13\xd2\xc3\xda" + "\x3a\x9b\x3e\x60\x9d\x96\xbf\x8a\x7a\x88\x87\xf4\x14\x8e\x9c\xab" + "\x6c\xc0\xa3\x3b\x4b\x2d\x7b\x08\x65\xa7\x4e\x5f\x76\x5a\xd9\x79" + "\x96\x7d\x1e\xed\x4e\xb3\x9f\x4f\xd9\xce\x06\x1e\xc1\x9a\x90\x0c" + "\xba\x6f\x26\x5f\x97\x74\x96\x32\x32\x46\x7e\x42\x2e\xe7\xd2\xd6" + "\x7b\xf0\x7d\xa2\x37\xc2\x0e\xa1\xea\x78\x92\x38\x67\x49\xba\x63" + "\xf5\x7c\xa5\x37\xfc\x19\x23\x5d\x72\xd0\x35\xd8\x36\x29\x5f\x45" + "\xf7\x60\xc1\xdf\x0e\x0e\x48\x9b\xde\xe3\x49\x12\xb7\x06\x85\x4d" + "\xc3\xd4\x72\xd4\x50\xba\xb4\x0d\x3f\x7e\x85\xa6\xb3\x19\x49\x18" + "\x4a\x57\xcb\xb2\x9e\xad\x0b\x54\x9d\xbb\x58\xf3\x1d\x45\xd6\x8d" + "\x85\xab\x8b\xf2\xb5\x83\xc0\x89\xec\x7b\xf9\xab\xf2\x57\x17\xe7" + "\xe7\x59\x97\x6f\x28\x5c\x7b\xdd\xba\xfb\xef\xb7\xde\x95\xbf\x7e" + "\xfd\xca\x1f\xe7\x27\xb2\xe5\x85\x2b\xd7\xae\x5f\x4d\xfa\x3a\xab" + "\x75\xf1\xcd\x39\x05\xeb\x8a\xae\xfb\xc6\xe2\x8c\xb3\xf4\x75\x74" + "\x2e\xb8\x87\xf8\x76\xac\x95\xb3\xb0\x6e\x5e\x48\xbe\x62\x4c\x9b" + "\xb8\xe7\x61\xc8\x8c\xc0\xc1\x41\x5a\x73\x30\x77\x3f\x21\x79\x82" + "\x7c\xc5\x92\xff\xd9\x5d\x4f\xf2\xae\x7e\x16\x79\x1f\xbc\x68\x37" + "\xd2\xc8\xd7\x6b\x0f\xe4\x78\x3f\x8d\x01\xd2\x5f\x44\x9e\xb6\x47" + "\x90\xe6\x4f\x18\xce\xd8\xfe\x77\x66\x90\xeb\xe6\x50\x26\xd7\xcf" + "\xe4\x35\xe4\xb7\xf5\x53\x0b\x53\xfd\x41\xeb\xbd\xbe\x10\xd9\xaa" + "\x18\x97\x86\x9d\x9c\x68\xaa\x9c\x5f\x43\x32\x46\x0a\xe4\x10\x69" + "\x33\x1f\x79\x82\xe4\x9e\xad\x22\x96\xd6\x10\xe8\xff\xdf\xbb\xa3" + "\xb4\x7a\xb4\x44\xe5\x37\xbb\x01\xf7\x8d\xbd\x78\x96\xfe\x2f\x86" + "\xce\xf2\x7f\x71\x72\x19\x63\xa7\x5b\xe5\x8f\xbe\x39\xdd\x26\x7f" + "\x74\x1f\xfb\x8b\x38\xe4\xef\xec\xf4\x7f\xf6\xa7\xd5\xff\x3f\xfd" + "\x7e\x2c\xf3\xdc\xbf\x7f\xa4\x7e\xd1\xef\xff\x87\xfd\xff\x67\xbe" + "\x1f\x5b\x74\xae\x1f\xe1\x1b\x70\xab\xe7\x91\xbf\x33\x23\xf0\x73" + "\x47\xed\x7d\xc0\xe9\x8f\x98\xa5\x24\xcc\xfb\x9c\x3f\x62\x69\xa5" + "\xc7\x98\x9e\xf8\xbf\x22\x07\xef\x2b\x1d\x23\x59\x7b\x2c\x19\xf8" + "\xdb\x5a\xd7\xcb\x92\x6a\x7b\x99\xb9\xb3\x48\xc6\x60\xa0\x3d\x14" + "\x3a\x4f\xe4\xc5\x73\x47\x71\x88\xbd\xe5\x1f\x26\xdb\x3d\x4f\x67" + "\x2e\x68\x4f\x0f\x63\x84\xbf\x49\xb9\x2c\xb5\x71\x16\x3f\xc4\x5d" + "\x8f\x2f\xe7\xfa\xc7\x17\x23\xed\xe8\x0b\x4a\x56\xfc\x0b\x9b\xdb" + "\xe3\xad\xf7\xd1\x3a\x7f\x72\x54\xc5\xcd\x2d\xf2\xbc\xdc\xa8\x90" + "\xc1\x54\x7f\xbd\x58\x9f\x46\x4f\xcb\x35\x7d\xf4\x0d\x55\x47\x45" + "\xf7\x42\xe7\x8a\x7e\xb4\x72\xd7\x7d\xad\x54\xe6\x6f\x94\xd6\x78" + "\x5a\x33\x5f\xd8\x9c\x15\x5f\xb2\x92\xe9\x3b\x7d\x83\xec\x30\x68" + "\x21\xed\xdb\x62\xde\xed\xc7\x3c\x6b\xd9\x3d\x8b\xd7\xa3\x7d\x35" + "\xe0\xe7\xdc\x68\xd3\xbe\xa0\xeb\x8b\x3c\xac\x5b\xcb\x55\x5e\xce" + "\x83\x79\xb1\xbf\x16\x79\x96\x6e\x60\x97\xd7\x22\x1f\x78\x3b\x37" + "\xf1\xdd\xb2\x7d\x23\x3f\x02\x0c\x0e\xa0\xce\x2e\xeb\xbd\xf4\x3c" + "\x2c\x78\x0c\xaa\x1b\xfd\xb0\xf6\x32\xbf\xf0\x87\x43\x75\x68\xf5" + "\xa2\x7c\xd0\xbf\xc1\x24\x75\xdf\xac\x5e\x96\xf3\x85\xe4\xc3\xdc" + "\xc7\x77\x50\x5c\x38\xf5\x3c\xd2\x8e\xda\xcd\x58\xd7\xc7\x99\x11" + "\x75\xec\x40\x1d\x1e\x53\x39\xe3\x26\x3a\xcb\xda\x13\x06\xaf\xae" + "\xa8\x76\xa2\xfe\x77\xd5\x6f\x05\x1f\x22\x78\x8f\x08\x33\x49\x9d" + "\x03\xf8\x8f\x02\xd0\x09\xf0\x1c\xe2\x1c\x00\xf8\x0d\x4a\x47\x1d" + "\x3b\xd0\xaf\x2e\xc8\x82\x07\xb0\x76\xb7\x10\xaf\x70\xef\xe8\x77" + "\x98\x88\x89\x0d\x7e\x61\xbd\x83\x87\x64\x8c\x2c\xbf\x5d\xe3\x17" + "\x08\x3f\x88\x47\xa8\xbd\x97\x19\x26\x30\xc6\xc0\x91\x76\xf0\x1f" + "\xe0\xbd\xfd\xfb\xd5\xb1\x69\x17\x7c\x81\x1a\x1b\x54\xd2\x70\xff" + "\x41\xac\xef\x49\xa8\x03\xfc\x6e\x44\xf3\xa5\x04\x1a\xe4\x6f\xd7" + "\xd6\x7a\x19\xdf\xda\xbf\x9f\x83\xd6\x01\x6e\x07\xe6\xe7\xea\x20" + "\xe3\xf9\xcd\x18\x8b\x03\x94\x97\x7c\x3d\x20\x7f\x08\xfc\x98\x66" + "\xcf\xd1\x53\x5b\x4c\x7c\x80\xbf\x8c\xda\x81\x6f\x3a\x00\x6b\x1a" + "\x0b\x35\x6e\x20\x60\x2f\x78\x98\x91\xd9\x1a\xec\x31\xd6\x15\x51" + "\xf8\x0f\x2f\x8e\x85\x3f\x60\x51\x21\xc7\xe0\xd4\xeb\x31\x63\x07" + "\x59\xeb\x54\x23\xe9\x56\x51\xdf\x21\xa9\x17\x1a\xde\x42\xfe\xb8" + "\x80\x33\x87\x00\x8b\x43\xc8\xd7\x4a\xb4\x79\xeb\xdf\x41\x73\xef" + "\x23\x1e\xea\xd4\x36\xc9\xa3\x9e\x4a\x27\x1c\xc6\xb3\x90\xa3\xfb" + "\x98\xbf\x82\xca\x03\x6e\x8c\xe2\x0a\x5e\x76\xf8\x84\xb3\x91\x62" + "\x56\x1e\xa7\x98\x95\x89\xea\x58\xfb\xd0\xae\x49\xff\x47\x84\x03" + "\x34\xf6\xe8\x63\x85\x94\xbd\x87\x7b\x48\x7f\x26\xbe\x9b\x28\xa0" + "\x36\xf6\xd0\xfc\xd4\xde\x23\x7d\x80\xfc\x98\xc6\xc0\xa6\x42\x1d" + "\x93\x56\x19\xff\xed\xd4\x16\xb5\x6d\xd9\x78\x36\xa2\x0d\x42\xa7" + "\x32\x32\x51\x10\xb7\x9d\xbe\x29\x8d\x7e\x43\xf3\x07\xb8\x6c\xc2" + "\x37\x1b\x70\xe5\x5a\x5e\xf2\x41\x8e\x76\x84\x1f\x17\xfe\xa4\x4e" + "\xa5\x8e\x4c\xd8\xf4\xa8\x37\x84\x7a\xf5\x84\x1b\x84\x17\x5a\x19" + "\xdb\x25\x8c\xf6\x63\xfc\x04\x7e\x1d\x0e\xb7\x02\xee\xa7\xc0\xff" + "\x7f\xe8\x91\xfc\xdd\x70\x58\x6d\x9f\x47\xc6\x25\x38\x3e\xbf\x49" + "\xfa\x7e\xa1\x7c\x93\xf1\x6f\xa2\x7c\xe6\xb0\xf0\x13\x85\xb2\x3a" + "\x54\x9c\x30\x05\x5d\x23\x49\x93\x38\x24\xce\xd5\x9f\xaa\x21\x5e" + "\x53\x6d\x3f\xe1\xde\x36\x15\x76\xf3\x09\x07\xc0\xc7\x67\xc8\x71" + "\xf6\x57\x10\xaf\x2a\xf1\x70\x64\x99\x56\x86\x3c\x9b\x3f\xdc\xa3" + "\xa0\x0c\x0d\x57\x62\x69\x03\xf2\x96\x80\x2e\x4c\xe2\x8d\x46\x0b" + "\x64\x99\x81\x17\x55\x3e\xc4\x86\xb1\x21\xdf\xd7\x1e\xe1\x9b\x48" + "\xe0\x65\xc0\x7d\x38\x10\x66\x8f\x10\x5e\xde\x4b\x34\x61\xe4\xb3" + "\x91\xc4\xd1\xac\x28\x6e\x8f\x1c\xd5\x70\x3b\x66\x5c\x05\x6e\x57" + "\x08\x7a\x34\x02\x3e\xfa\x06\x6d\xef\xb8\x87\xe6\xb9\x82\x79\xbd" + "\xbd\x58\xe8\xbc\x4d\xa4\xe3\x12\xf3\x3e\x34\x24\x64\x0c\x1a\xcf" + "\x4e\x47\x9f\xf0\x37\xbe\x55\x61\xc6\xce\xc0\x67\x24\xf3\x0f\xd2" + "\xfc\xd7\xe6\x38\x8d\x0d\xea\xf2\x90\x4f\xf8\x0a\xd0\x40\x9a\x83" + "\x01\xb4\x89\xe2\xa0\x93\x9f\xae\xb6\x15\x59\x6c\x3d\xc6\xf6\x70" + "\x2e\x8d\x5b\xa0\x48\xb3\xed\xdf\x2e\x69\x40\x92\x8a\x2f\xa2\x8d" + "\x67\xc1\xd5\x24\xe1\x1a\xd8\x77\xe6\xfc\x3e\xb5\x84\xe6\x77\x2c" + "\x5c\x09\xa6\x04\x5b\xe4\x45\xff\x8f\xb5\x68\x70\x8d\xc2\x74\xf4" + "\x0e\x15\x1f\x55\xda\x3a\x3a\x25\x6d\xdd\x2e\xfd\xef\xb7\x6e\xa5" + "\xbe\x60\x4d\xa1\xfa\x45\x7c\x19\x55\xf6\x69\xf3\x13\x4e\x91\x6c" + "\x9d\xb7\x44\xa3\x63\x68\x4f\x3d\xe1\x13\x8d\x95\x46\x3b\x48\xff" + "\x23\xdb\x3e\x9a\xa7\x8d\x07\xb5\x3b\x96\x26\xa0\x0d\xbf\xa5\xe7" + "\x68\x9f\x47\x9f\xc0\x77\x17\x11\x6d\x8b\xf2\x57\xa3\x7b\xcf\xec" + "\xfb\x68\x0d\xf5\x9d\x70\xc2\x5e\x4c\x3a\x20\xb9\x96\xf9\xd8\x17" + "\x96\x33\xe9\xd5\x17\xc9\xd2\xd6\x40\xf2\x63\x44\xef\xed\xf7\xca" + "\xfc\xb4\xbe\x21\xbf\xd0\x89\xaa\xeb\x61\x09\xad\x7f\x48\x33\xa8" + "\x30\xe8\x41\xfe\x36\x3a\x2f\x4c\x3e\x63\x2e\xe8\x91\xb2\x20\x68" + "\xf4\x21\x8a\x43\xe0\x63\x27\xdb\x3a\x51\x6a\x78\x06\x63\x8d\x2a" + "\xbf\x49\x74\x82\x6f\xcc\xbe\x60\xe3\x00\x4b\xb0\x7f\x83\x7f\x8a" + "\xf5\xfc\x35\xcc\xa3\x10\xf9\x30\x44\xd9\xd6\x7e\x76\xfa\x69\xd4" + "\x9b\xaa\x5e\x2d\xb8\x56\xe1\x3a\x1b\xd7\x87\x70\xbd\x0c\xd7\x1f" + "\x20\xbf\xa2\xe6\xcf\xc0\xf3\x37\x91\x7e\xb3\x7a\x45\x1b\xc7\x5a" + "\x71\x5d\xf6\x08\xf1\x95\xf7\x8a\xf4\x4b\xe8\x19\xd7\x78\xb5\xdf" + "\x1d\x72\x6e\x8f\x7d\x86\x72\x1c\x94\x8f\xd6\x35\xa4\xd9\xfb\x59" + "\xe8\x0d\x2a\x9b\xce\xef\xe3\x7e\x4b\x0c\x7f\x8a\x72\x82\xcf\xe2" + "\x9a\x89\xeb\x83\xb8\x16\xe1\x7a\x23\x95\x0b\x18\x74\x45\xe9\x85" + "\xbf\x22\xcf\x21\xc7\xd3\xc7\x46\x48\xc6\x4c\xd5\xe8\x01\xe1\xd3" + "\x19\xf9\x56\xc8\x7c\x52\x7e\x0d\xe6\x6a\x63\x17\x96\x78\x9b\x1a" + "\xc6\xd8\xa1\xfc\x6f\xd2\xf7\xb8\xde\xae\x5e\xb3\xd4\xeb\x1d\xea" + "\xf5\x3f\xd4\xeb\x62\xf5\xba\xc4\xc7\x82\x19\x2a\x6f\x02\x98\x05" + "\xa9\x0c\xd2\x99\x2d\x91\xf5\x86\xf2\x48\xbe\x06\xfd\x5f\x30\x42" + "\x31\xc5\x5c\xc1\x6e\x4d\x17\x4b\xba\x9f\x09\xd7\xf1\xff\xd8\x25" + "\x74\x3f\x41\x7f\x0c\x2d\x64\x49\xba\x2c\x06\xde\x69\x46\xa3\x1e" + "\x7c\x83\x2c\x67\x89\x5e\xdd\x83\xa6\xd8\x1a\x14\x2b\x8d\x7c\xc7" + "\x09\x39\x2a\x39\xb3\x81\xe6\xab\xd0\x53\x57\x91\x2f\x9c\x61\x03" + "\x7e\x66\xc8\x14\xa9\x1a\xbd\x27\x79\x49\xf5\x11\xf9\x4a\xd0\x15" + "\x5a\x11\x95\xf3\x43\x49\x72\xbf\xee\xd2\x2b\x90\x1e\x23\xff\x07" + "\xdb\xa9\xcd\x80\x75\x37\xfa\x93\xd9\xcb\x42\x8d\xb8\xde\xd4\x27" + "\xfb\x9c\xa1\xf5\x59\x1d\x2b\xbb\x06\xf3\x3e\x16\x5c\x08\x7a\x58" + "\x48\xf8\xdd\x3b\x49\x97\x83\x42\x3f\xad\xe2\x0f\xc6\x79\xec\x18" + "\x8d\x77\x0c\x3d\x29\x89\xd2\xe9\x50\xe8\xcc\x71\xf1\x87\xc2\x92" + "\x5f\xe8\xc6\xbc\x04\x0e\x8c\x79\xce\x9a\x97\x35\x34\x2f\xe5\xb7" + "\xa7\x33\xcf\xa4\xf1\xa3\x35\x44\xe3\xd5\x36\x02\x6f\xc7\x9a\x69" + "\x6c\x7c\xec\x74\xaa\xba\x26\x75\x63\x8d\x5c\x80\x74\xb7\x6c\xa7" + "\x4c\x57\xeb\x02\xfe\x8d\x95\x11\xfe\x6b\xe9\x2a\x7e\x53\x39\x0e" + "\x1a\x6b\x2d\x5d\x2d\x1f\x78\x3a\x66\xa7\xf9\xa3\xa5\xab\x38\xd9" + "\x4e\xf4\x86\xbe\x0d\x0b\xbb\x3b\xc8\xdf\xf7\xb6\xa1\xdd\xa7\x49" + "\xa7\xd8\x4c\xf3\x79\xeb\x66\x96\xb4\xb1\x81\x25\xcb\xb9\x39\x7e" + "\x89\xf6\xad\xd4\x53\x8f\x1b\x35\x1a\xb5\x5d\xd0\xb3\x40\xc9\x99" + "\xb4\x32\xfc\x4b\xee\x32\x85\xc3\x46\x7f\xf8\x48\x38\x53\xd0\x5c" + "\xcc\xfb\x46\x7c\x97\xe5\x63\x8f\x33\x75\x2d\xe9\x90\xfb\x04\xe3" + "\x1b\x8e\x34\x4b\xda\xa5\x96\x3d\x49\xff\x62\xf8\x10\x41\xeb\xa9" + "\x2e\x2a\x0b\xeb\x8a\x39\xe0\xcc\xbe\x40\xd2\xef\xf1\x1d\x3e\x76" + "\x41\xba\x46\x5b\x69\x7d\x32\xe9\x98\xbd\xee\x5e\xb9\x3e\x29\xa4" + "\x03\xb3\x07\x84\xef\xaf\x4e\xfb\x10\xa3\x75\x93\x7c\x32\xe7\x6c" + "\x4a\x24\xdf\x48\xd9\x68\x6b\x15\xf8\xb3\xbd\xea\x7e\x03\xe4\xdc" + "\xf0\xd7\x49\x96\x55\xe1\x8a\xf9\x14\x9e\xab\x8e\x4b\x0f\xda\xb3" + "\x97\x68\xfb\xd6\x62\x19\x9f\x86\xf4\x41\x22\x9e\x11\xf1\xac\x16" + "\x1e\x92\xfe\xe5\x27\xd2\x63\x74\x5c\xcd\x72\x9e\x8c\x27\x88\xd8" + "\x00\x6e\x7f\x58\xea\x13\x27\x7e\x2b\xd3\x27\x54\x5f\x55\xc3\xaa" + "\xaf\xff\x89\xb2\x38\xcb\xac\x9f\x4a\xbd\xf0\xf1\xfb\x24\x3f\x32" + "\x51\x14\x63\xc7\x22\x60\x2d\x7d\xcf\x4e\xd4\x44\xe7\xc5\x44\x2e" + "\x7d\x83\x6f\x77\x22\x7d\xd2\xff\x97\x5c\x6b\xfc\x0e\x55\x67\xc6" + "\x2e\x28\xcf\x62\xa0\xcd\x33\x76\xb9\xb4\xf9\x1b\x16\xfe\x09\xb5" + "\xf9\x4b\x7d\x24\x7c\xa0\x39\x1c\x26\xff\x55\x98\xc3\x34\x97\x71" + "\x6f\x08\x6b\x73\x57\xf2\x77\x25\x62\xee\x8a\x79\x1b\x4e\x8d\x69" + "\x47\x87\x8a\xab\x3d\x23\xab\x2c\x49\x78\x87\x39\x39\xa8\xfa\x07" + "\x1a\x97\x32\x46\xd5\xfb\xb9\xca\x18\x0f\x91\x6e\x9a\xf4\x09\xa4" + "\xb3\x51\x6d\x2b\x49\xff\x1f\x20\x9f\x5c\xf5\x98\x0f\x51\x3f\x5c" + "\x66\xa6\xf9\xe1\x42\x79\x65\x51\xdd\xf1\xb8\x4f\xf6\xcb\x4f\x7c" + "\x4b\xa3\xa7\xf4\x4f\x04\xe7\xb7\xe5\x1c\x1b\xef\x22\x3c\xf6\x02" + "\xf7\xb0\xfe\x34\x50\xbc\x73\x7c\x7b\x48\xc3\x3d\xcc\xd1\xbc\x7e" + "\x16\xb9\x6b\xc7\x2c\xde\x80\x31\x25\xfb\xf0\x35\x78\xfe\x3a\xae" + "\x79\xf2\xaa\x33\xd3\x55\xc5\xf9\x06\x7c\x8b\xf9\x9f\xd8\xae\x8d" + "\x41\x20\x39\xad\x59\xe0\x58\x29\xd9\xec\x65\x88\xfd\x6b\xc2\x31" + "\xc2\x2f\xb1\x8f\x0d\x5c\x33\x95\x7f\x87\x11\x9e\x09\xdf\x1c\x78" + "\xa6\xf6\x12\x9e\x05\x5d\x91\xc5\x9a\x1f\x5a\x1f\x0b\x0f\xc8\x3d" + "\xa4\x48\xb6\x66\xb3\x4c\x78\x58\x74\x05\xbb\x04\xe5\x5b\xdb\xac" + "\x01\xd2\x9d\x7f\xec\x0d\xdf\xc1\x28\x2f\xc1\x4e\xd2\xcb\x4b\x8b" + "\xf0\x4d\xcc\xf8\xfb\x85\x0d\xcb\xe1\x15\x42\x9f\x79\x31\xde\xed" + "\x3b\x93\xe6\x0c\x65\x0a\xbe\x12\xeb\xf3\x55\xa9\xcc\x0a\xbc\xc5" + "\x5a\x13\xe9\xd0\xf8\xe1\x1b\x52\xc9\x86\xe0\xb8\x88\x15\x4e\x3c" + "\x09\xee\x3b\x68\x9d\x9e\x46\xef\x9c\x49\xba\x22\xa2\x19\xa4\x7b" + "\x22\x3d\x18\x60\x7d\xb4\x5f\xa7\xbb\xeb\x08\xf9\xc9\x59\xf7\x65" + "\x5f\xc4\xa5\x0e\x3e\x4a\x7e\x9b\xac\x85\xec\xe2\x5e\x9d\x2e\x83" + "\xf4\x4e\xce\x61\xd2\xf1\x28\xcb\xcf\xd4\xf1\x28\x7b\xd5\x5f\x2b" + "\x4a\x4a\x8b\xf9\xed\x57\xaf\xb6\xaf\xf8\xb5\xa9\x79\xbb\xf0\xeb" + "\x51\x61\x75\x20\xe8\x52\x5a\x35\x58\x11\x4d\x21\x1a\x4b\xb6\x23" + "\x34\xcf\x75\x61\x46\x7b\xaf\x18\x27\xb4\x7b\xeb\xb5\xdf\xf3\x6c" + "\x26\x99\x56\x11\x36\x50\xe4\x53\xf6\xfc\xec\x97\x14\x31\x9e\xd2" + "\xe7\xa7\xb2\x1f\x75\xb7\x6d\x3f\xc9\x0c\xf6\x42\x36\x97\x74\xe8" + "\xa6\x08\xf7\x90\x0c\x6c\x92\xf1\xd9\xbb\x06\x19\x7f\xbe\x68\x0b" + "\xd3\xe3\xfd\xe5\xb8\x6f\xd4\x78\x29\x7c\x63\x8e\x0b\xb1\x54\xe2" + "\xa1\x6e\xdf\xc2\x2e\x0f\xba\xb8\x43\x1b\x2b\xe2\x33\x48\x8f\x17" + "\x8d\x1d\xa4\x08\xbb\x2c\xf2\xaf\xee\x13\x70\x53\x69\xd5\x49\xd2" + "\x5d\xf3\xbc\xb8\x00\x33\xcb\x75\x88\x03\xff\x8f\x97\x48\x7c\xe1" + "\x65\xc0\xfd\xa3\x31\xed\x1c\x8b\xde\x5b\xfe\x8d\xbe\x37\x05\x88" + "\x87\x9b\x06\x3e\x3a\x96\xa0\xc1\x87\x6c\xe4\x4d\xe0\xff\xc5\x78" + "\x87\xf9\x10\xda\xd6\x61\xdf\xcc\x8c\x83\x3a\x76\x1a\x7d\xa4\x33" + "\xa8\xed\x42\xc7\xaf\x63\x27\x34\x39\x5d\xb4\x5b\xc7\x0e\x9a\xca" + "\xe3\x18\xe9\xe6\xc9\x37\xa1\xb0\x2f\x04\x4b\x4a\x3c\xbc\x37\xbc" + "\x88\x79\x4a\x6f\xa1\x3c\xdb\xd4\xb5\xac\x67\xc4\x69\x61\x87\x2d" + "\x8b\x58\xb0\x92\x55\x60\xae\x84\xce\xdb\x8e\x53\xc7\xb4\x7d\xf0" + "\x0e\x61\xff\xa0\x63\xf7\xd0\x5a\x42\xba\x01\xac\x23\x6d\xb4\x5e" + "\xa3\x6c\x9f\x36\x6f\xb0\x4e\xb4\xe1\x9b\xe5\x92\xc6\xbc\xe7\xc3" + "\xfd\x32\xf2\x8f\x22\xe4\x07\x99\x3f\x49\xec\x1b\x54\xea\x52\x27" + "\xf9\x6d\xe4\xa3\xef\x84\x5d\x9c\x8e\x7c\x0d\xe9\x18\xbe\xb3\x51" + "\xdf\x24\x2e\x5a\x16\x21\xff\xe2\xe8\xbc\xe5\x65\x62\xde\x0e\xc5" + "\xcc\xcb\x4a\x5d\x5e\x54\x4e\x55\x2c\xd7\xed\x60\x53\x9e\xcd\xb7" + "\xa7\x30\xf3\x71\x23\xfb\xfe\xf6\xed\xbc\xb9\x5e\xaf\x7c\x6b\x6b" + "\x1d\xd8\xb3\x1a\x80\x8d\xe6\x59\x71\xee\x25\x98\x8f\x9f\x99\x92" + "\x2e\x5d\x76\x7b\xd1\x4c\x5e\x6a\x61\xfa\xda\x53\x33\x8d\x57\x84" + "\x2e\x6d\xe6\x71\xd7\x7e\xef\xae\x22\xda\xcf\xad\x67\x9f\xaf\x61" + "\x71\xb7\x47\x50\x77\x12\xb3\xfb\x74\x71\x7e\x3a\x4f\x7d\x18\x9c" + "\x17\xdd\x53\x99\x25\x8d\xcc\x58\xd2\xc7\x07\x6a\xee\x8f\x37\x62" + "\xfd\x35\x63\xdd\x70\x5f\x90\x74\x69\xf3\x04\xca\x78\x2d\x57\x7c" + "\xd7\x72\xfe\x6d\xb3\xcf\xea\xd7\xe9\xcb\xcf\xaf\x6d\xf1\x19\xd1" + "\xb6\xc5\x67\xfc\x5f\x6e\x9b\x39\xda\xb6\x02\xb4\x2d\x6e\xee\xf9" + "\xb5\x6d\x86\x3d\xda\xb6\x19\xf6\x7f\xb0\x6d\xfb\xcf\xbf\x6d\x8e" + "\x4b\xd1\xb6\x83\xe7\xd7\xb6\x99\x2d\xd1\xb6\xcd\x6c\xf9\x67\xda" + "\x56\xda\xc8\x3f\xeb\x04\x05\x26\x7d\x0e\xd1\xf9\x7e\x9d\xe1\xe5" + "\x2d\x69\xc2\x36\xf9\x22\xdc\x3f\xe4\x6c\xe4\x9f\x0a\xde\x46\x67" + "\x10\xba\xff\x60\xa5\x61\x3e\xe4\x52\x19\x07\x48\x17\x9f\x26\x6c" + "\x37\xe2\xe6\xec\xe3\x2e\x1e\xbe\x3e\x40\x76\x70\x61\xf2\x21\x42" + "\xfe\xb9\x17\xbe\x30\x16\xd2\xf3\xc4\xe1\x25\x7b\x4e\x19\xd8\x0b" + "\x63\x7e\x3d\xbe\x2d\xd0\xfc\x86\x6a\xdf\x9a\x1a\xce\x45\x8f\x0c" + "\xbb\x6f\x2f\x60\x26\xa2\x47\x74\xa5\xd8\x84\xdb\x4b\x67\x1a\x6f" + "\x1f\xc6\xba\x5f\x69\x38\xa0\x9d\x0b\xd5\xca\x5a\x3a\x30\x93\x9b" + "\x4a\x58\x1c\x9d\x4d\x15\x3e\x06\x2d\x7e\x96\x5e\xc2\xe2\x97\x3a" + "\x50\x7e\x88\xe5\x9a\x1c\x28\x1b\xf0\x10\xbc\xbc\xce\x70\x3a\x6e" + "\x0d\x4b\xda\x81\xb2\xe9\x7a\xbb\xc5\xc9\xb7\x3e\xc5\x0c\x74\x86" + "\x95\xce\xa2\xca\x73\xa8\x33\x8c\xc1\xca\xf8\x34\xad\x9e\xaf\x80" + "\x5f\x8a\x84\x5f\x7c\x24\x0a\xbf\xf8\xdf\x46\xe1\x17\xbf\x41\xc2" + "\x2f\x7e\x4d\x14\x7e\x33\x56\x9c\x1f\xfc\xe2\xf7\x45\xe1\x27\xbf" + "\x3d\x37\xfc\xe2\x3f\x9a\x1e\x7e\xf1\x81\x28\xfc\x64\x59\xd3\xc0" + "\x6f\xc6\xd4\xf0\x9b\xf1\xf5\x7f\x0c\x7e\x33\x56\xfc\x83\xf0\x4b" + "\x96\xf0\x9b\x79\x6b\x14\x7e\x33\x86\xa3\xf0\x9b\xf1\xa2\x84\xdf" + "\x8c\xfd\x51\xf8\xcd\x6c\x3c\x3f\xf8\xcd\x18\x88\xc2\x4f\x7e\x7b" + "\x6e\xf8\xcd\x9c\x3b\x3d\xfc\x66\x66\x46\xe1\x27\xcb\x3a\x3f\xf8" + "\xcd\xdc\x04\xb8\x99\x55\xf8\x99\xa7\x87\xdf\xcc\xc6\x7f\x10\x7e" + "\x26\x09\x3f\xe3\x96\x28\xfc\x8c\x37\x46\xe1\x37\x73\x54\xc2\x6f" + "\xe6\x50\x14\x7e\xc6\x9e\xf3\x83\x9f\xd1\x16\x85\x9f\xfc\xf6\xdc" + "\xf0\x33\xfe\x68\x7a\xf8\x19\x8b\xa2\xf0\x93\x65\x4d\x03\xbf\x99" + "\x53\xc3\xcf\x78\xf0\x1f\x83\x9f\xb1\xe7\x5c\xf0\x3b\x3f\x5e\xc3" + "\x38\xad\x5d\xf1\xf9\x95\x93\xb0\x70\xba\x72\x08\x86\x64\x73\xa7" + "\x54\x26\x2c\x6c\x52\x66\x18\xe5\xb9\x04\x23\xc5\x3e\xbb\xad\x57" + "\x97\xb0\xad\x49\x89\x37\x72\xd7\x5f\x5a\x14\xd7\x1b\xd9\xbc\x7c" + "\x86\x41\x29\x9f\x69\xa0\x73\xf3\xd3\xc6\x3a\xd6\x25\x7c\x16\x37" + "\x9b\xcd\xa3\xb3\x65\x5b\xc1\xaf\xd1\x7d\xb0\x32\xc1\x0f\x5e\xe4" + "\x4b\x7e\xb8\xf3\x56\xaf\x17\x81\x13\x0b\xf3\xf3\x36\xac\xcd\x5b" + "\xb9\xb6\xc8\xba\x72\xd5\x03\xeb\xcf\xf4\x6b\x2e\x62\x0e\x56\xd0" + "\xf8\x25\x66\x4e\xfa\x32\x01\x1f\x4b\x3e\xe1\xec\x57\xb2\x84\x41" + "\x5d\x62\x91\xf0\x35\x9f\x38\x7c\x80\x4f\x64\xef\xcc\xba\x8a\xbf" + "\x2a\x7c\xdd\x4d\x14\xec\x84\x3c\x55\x44\xfe\x4b\xd4\xbd\x89\xa2" + "\x7e\x5d\x52\x2d\x4f\x18\xf5\x91\x4d\x87\x38\xaf\xa0\x4b\x14\xfe" + "\x11\xc9\xaf\x09\x37\x1e\xef\x50\xdc\xa3\x3e\x5e\x35\xda\x4d\x30" + "\xe8\x24\x3f\x63\xc5\x71\x97\xf7\xea\x52\x96\xf1\x84\xe3\x1d\x28" + "\xab\x4b\x2d\x47\xc4\x17\xce\xda\xcc\x3f\xa6\xf2\x54\x5e\x90\x62" + "\x49\x78\x24\x3f\x78\x41\x82\xa9\xdc\x1a\x47\x79\xc9\xdf\x1f\xf9" + "\xc1\xd3\xe2\x07\x51\xbb\x29\x2f\xf8\xf1\xdb\xf0\xfd\x6d\x7b\x28" + "\x3e\x90\x56\x86\x6c\xd3\xc5\x83\xba\x0b\xb2\x44\x5f\xdc\xc7\x1d" + "\x23\x0f\x67\xef\x14\x31\x05\x05\x5c\x53\x16\xa0\x6e\x07\x95\x41" + "\x7e\xb8\xe8\x5b\xf5\x9b\xb9\xf8\x46\xd0\x53\xf2\xf1\x29\xcb\x48" + "\x99\xab\xb5\x0b\x3c\x74\x22\x9e\xe3\x63\xea\xb8\x60\x50\x97\x7c" + "\x22\xe6\x7d\x12\x9e\xdf\x06\x1f\x7a\xa1\xfa\x3e\x19\xcf\x2f\x12" + "\x5f\x2a\xfa\x55\x57\x26\xed\x7c\x75\xc9\x0d\x48\x33\xab\x79\x2e" + "\x44\x9e\x2d\xc4\xeb\xaa\x65\x5c\x84\xe7\x95\x24\x33\xaa\xef\x53" + "\xf1\x7c\x07\xed\x0b\xa8\xef\x2f\xc1\xf3\x35\x78\xfe\x57\xf5\x3d" + "\xf8\xfa\xa4\x5c\xd1\x66\xe3\xf1\x36\xea\x13\x60\xef\x21\xb8\x03" + "\xd6\x6d\x48\x2b\x82\xbc\xea\xa4\x71\xa4\x7e\x7a\x36\x0f\xb2\x5e" + "\x5d\xd2\x3d\x74\xd6\x4c\x8e\xd5\xa8\x4f\xfa\xa1\xd1\x67\x23\x7d" + "\x39\xa5\x93\xbd\xb4\x52\x35\xea\xa1\x7b\xc0\xf4\x04\xc1\x50\xad" + "\xeb\x72\xd4\x55\xa2\x8e\x33\x60\x47\xbe\x62\x59\xd9\x1e\x75\x2c" + "\xd0\xb6\x99\x78\xff\xbe\x66\x7f\xb1\x34\x3c\x21\xcf\xcc\xe8\x92" + "\xf6\xfe\x8f\x7c\x23\xe0\x3b\x49\xf7\x92\xfa\xb4\xb8\x72\x48\x13" + "\xb1\xea\x09\x3f\x49\xbf\xe2\x4f\x38\x9e\x2b\x7c\x81\x00\x47\x35" + "\x5c\x21\x3c\xe1\x33\x12\xc2\x42\x57\x53\x99\x1c\x8d\x7f\xa2\x4b" + "\x5a\xa1\xfa\xe2\x67\x52\x4e\x48\x5e\x34\x69\x5f\xa4\xbb\x40\xd0" + "\x87\x98\x77\xd9\x31\xef\x7c\xda\x3b\x61\x03\x57\x99\x5c\x14\xf3" + "\xae\xeb\xac\x77\xf5\x31\xef\x3c\x67\x95\xb9\x3f\xe6\x5d\xcb\x59" + "\xdf\xb5\xc7\xbc\x6b\x3c\xeb\x5d\x5f\xcc\xbb\x1a\xf5\x5d\x1c\xd2" + "\xc3\x93\xbe\xf8\x74\x17\x94\xa8\xe9\xa0\xf5\x29\xa9\x31\xe9\x6b" + "\xd4\x74\xd4\x9f\x02\xfe\xef\xa5\x16\x35\x5d\xe0\x39\xf0\xe8\x5f" + "\x64\x1d\x29\x4b\x62\xea\x58\xa4\xee\x1f\xe7\xca\xf1\x4b\x3c\x60" + "\xd2\x59\x67\x12\x4e\x99\xca\xcb\x28\xae\x4b\xbd\xf4\x3b\x25\xe7" + "\xa1\x88\xe9\x4b\xf2\x30\xf2\x4d\x47\x1b\xa7\xb4\x11\xac\x4c\x39" + "\xa4\x9d\xcd\x8c\xb8\x8f\xe7\x29\x35\x73\x0b\x28\x56\x1c\xf9\xa7" + "\x72\x0e\x91\x8f\x92\x00\xf3\xb2\x71\xe6\x2d\x0a\x96\x51\xbc\xb8" + "\x4e\x19\x27\x8e\xce\xb4\xe9\xe8\xcc\x06\xf9\xd8\xea\xb4\x9f\x10" + "\xb1\xe2\x36\x0e\xb1\x34\xfb\x37\x78\x5f\xbf\xce\x64\x8d\x54\x1d" + "\xcf\x53\xfd\x0c\x3c\x25\xce\x42\xeb\x4c\x72\x7e\x90\x1c\x3b\x24" + "\x74\xcb\x46\xe4\x6b\x11\x79\x78\xf6\x53\xb2\x8f\x26\x31\x1e\x7b" + "\xd4\xf3\x71\xc1\x4a\x53\xf6\x64\xfc\x42\x9d\xe9\xc0\x68\x42\x68" + "\x09\xd2\xd6\x9c\x61\xd3\xa8\x33\x6d\xa3\x32\xa9\xed\xc8\x63\xa3" + "\xb2\x91\xa7\x7e\xd2\xa6\x11\xe9\x1b\xc3\x6c\x0e\xda\xd5\xaf\x95" + "\x8f\xf7\x2d\x3e\x5d\x8a\xb0\x8f\xa6\x32\x47\x6b\xe7\x51\xb9\x6d" + "\x3e\xfd\x1f\xc5\xb9\x25\xdc\x77\xf9\xd8\x9f\x0d\xd3\xad\x79\x42" + "\x0f\x69\x1c\x0d\x71\xf7\x18\xc3\x3c\xf7\x0b\xbb\xdb\x84\xd1\x90" + "\x94\xdf\xcd\x73\xc9\xe6\x82\x62\x20\xd3\x5e\xa3\xa4\x35\xe6\x95" + "\x62\xbe\x22\x0d\x63\xb4\x8f\x57\x8d\x09\xbd\xce\xf9\xcd\x43\xf3" + "\x7c\x51\xc6\x29\x66\xac\x53\xed\x5c\x83\x95\x66\x47\x4c\x1c\x01" + "\x69\xc7\xae\x33\x3f\xdd\xe9\x10\xfb\x4d\xa2\x8d\x67\xb7\x81\xda" + "\x8b\xb2\xd2\xa6\x5d\x3f\x8d\xa3\x7e\xa1\xfb\xac\x1e\xce\x16\xf6" + "\x63\x3a\xf3\xb1\x38\xcb\x65\x4f\xa2\xae\xbe\xc9\xf8\x09\xc8\x53" + "\x37\xce\x98\x82\xf2\x27\xfb\x59\x48\x75\x5c\x28\xf6\x27\x7c\xba" + "\x0b\xad\xa0\x5d\x7e\x6a\x83\x9a\x6e\xed\x0c\x87\xe8\xec\xf7\x94" + "\xfe\x9d\x68\x5d\x14\xbe\x81\xaa\x47\x45\x6c\xf0\x1b\x42\x5a\x9b" + "\x2f\xb2\x92\xfd\x39\xb5\x59\xc2\xf6\xa2\x4b\x34\x38\xd6\x9e\x42" + "\xd9\xa5\x1f\xb0\x3e\xdd\x85\xbb\xc9\xa6\x85\xce\x53\x6c\xdf\xac" + "\xda\x59\x21\x4d\xe4\x1b\x9f\xcc\x23\x74\xbd\x64\xe3\x4b\x34\xb4" + "\x89\xce\xc5\xa3\xcc\x3a\x8c\x85\xf0\x79\xa1\xbb\x50\x9c\x85\xd8" + "\x5a\xc8\x64\xbf\xc9\x86\x4d\x77\xd1\x62\x89\x2b\x17\xf6\xf8\x74" + "\x17\x2d\x93\x38\x28\xd3\x28\x86\x36\xd9\x1e\x9c\xd4\x5d\xf8\x32" + "\xc5\xf4\xe4\xc6\x31\xe1\x17\xad\x33\x80\x79\xe2\xc0\x73\xc2\x98" + "\x88\xdd\x06\x38\x1c\x92\x6b\x02\xc1\xfc\x42\xf2\x03\x27\xf6\x75" + "\x28\x9e\x29\x60\xba\x37\x58\x79\xd1\x64\xfc\x2f\x8a\x9d\x8a\x3c" + "\xcb\xa7\x1b\x17\x82\x51\x04\x6d\x26\xff\x1e\x9e\x39\x1f\xa0\x7d" + "\x17\xeb\x94\xc4\x51\x3f\xd9\x4c\xa2\xad\xbf\x94\xb4\x42\x8e\x9d" + "\x9c\x4b\x17\xbd\x8f\x3a\xbc\xb4\xbf\x48\xf6\xd8\x22\x0e\xb4\xee" + "\xa2\x32\x15\x7e\x22\x9e\x42\x7d\xb1\x84\x83\xcc\x7f\x71\xa6\xd4" + "\xc5\x5c\xf6\x2e\xda\xd5\x35\xa9\x8b\x41\xba\xd0\xa3\xa9\x76\xd5" + "\x78\x37\x14\xd3\xe6\x80\x38\xcf\x76\x8a\xe4\xe8\x8b\x76\x50\x5d" + "\xb5\xe4\xb7\x8a\xf0\x62\x30\x16\xff\x2f\xda\x40\xed\x24\x7b\xbc" + "\x48\xc2\x70\x36\xaf\x1a\x5e\x41\x70\xc6\x37\xfb\xc1\x9f\xf8\xa7" + "\x89\xb3\x2d\xe2\x05\x05\x2b\x2f\x5e\x11\x13\x03\x15\x6b\xdf\xc5" + "\xb5\xda\xda\x46\xeb\x32\xf9\x21\x98\x4c\xab\x5d\x60\xc4\x7c\xdf" + "\xa7\xf2\x35\xfb\xa6\xf5\xa1\x77\x3d\xcb\xa0\x33\xb3\x64\x9b\x4d" + "\xf8\xc6\x93\x32\xf7\x91\x5f\x5e\xf2\x31\xe8\xd9\x7c\x13\xda\x9b" + "\x7a\xeb\xe3\xb3\xc4\x39\xbd\x80\xe7\xfa\x53\x64\x97\x33\xd4\x5f" + "\x22\x7c\xe7\x18\x97\x3a\xc2\x7c\x8f\x8c\x73\xec\xe7\xc9\x99\xfb" + "\xe8\x9d\xf0\x4b\x4f\x65\xfe\x4f\x7d\xcc\xea\x52\x8d\x2a\xff\x32" + "\x04\x5a\x79\x29\xfa\x23\xf6\x0b\x70\x3f\x6b\x50\x77\x49\xbe\x8c" + "\xdb\x27\xfd\xa4\xab\xf6\x85\x33\xe4\x39\x73\x3f\x13\xe7\x7e\x75" + "\xa9\xef\x5b\xaf\x65\x6c\x48\x97\xfa\x91\xf0\x59\xec\x3e\xde\xaa" + "\xc2\xa0\x75\xbb\x6c\x97\x29\xc7\xa1\x17\x6d\xa4\xf6\x9d\x67\xdb" + "\xf6\xaa\x6b\xd7\x8c\x60\x65\xea\x80\x76\x3e\x5d\xf4\x5f\xf5\x65" + "\xec\xb9\x92\x64\x95\x4b\xee\x51\xd7\xab\x43\x6a\xdd\x87\xfe\xf9" + "\xba\x2f\xb1\xaa\x65\xd6\x0b\x7f\xce\x80\x0b\xca\xad\x0f\x56\x5e" + "\x62\xd7\xd6\x50\xd5\x2e\x7e\xbe\x5c\xdb\x2f\x71\x47\xd7\x4f\x09" + "\xc3\x33\xce\x9e\xac\x5b\x57\x64\x05\x93\x6e\x5f\x59\xb4\xaa\xc0" + "\x9a\x5f\x58\xb8\xae\xd0\x4a\xce\x57\x62\xe7\x98\xb0\x7b\xa9\xbc" + "\xa4\x51\x8d\xc1\xb5\x6f\x32\x06\x57\xe5\x25\x7d\xb1\xb1\xd1\xd0" + "\xb6\x81\xff\x3b\xb2\xcc\xac\x2f\xc5\x5d\xd4\xca\xa9\xd7\x2b\xa4" + "\x9b\x6a\xc5\xcf\x83\x5f\x3b\xc9\x36\x39\x21\x96\x85\xf5\x51\xf0" + "\x3b\xd1\x73\xd7\x97\x1c\xa2\xbd\xef\x5e\xdd\xac\x95\x4d\x8a\x81" + "\x09\xbf\x1b\x2e\x85\xec\x47\xc8\xf7\x76\x2b\x7e\x1e\xfc\xda\xf1" + "\x13\xdf\x29\x7f\x12\x67\x46\x5b\x62\xdf\xd1\x7e\x34\x77\xed\xed" + "\xa3\x3c\xbc\xdc\x20\xd6\x27\xe5\x31\x99\xef\xac\x36\xe8\x79\xa5" + "\x49\xcb\x27\xda\x9e\x52\xce\xac\x53\xe4\x8b\xe3\x95\x89\x69\x6a" + "\x3e\x81\xdf\x5a\x7f\xc8\x2f\x3c\xf2\x6b\xf9\x0c\xbc\xf2\xe2\x66" + "\x35\x9f\x3c\xcb\xe4\xd2\x4f\x55\x6f\x3c\x77\xbd\x5f\xa1\xe6\x33" + "\xc7\x96\x17\x93\x67\x86\x52\x29\xe2\xed\x76\x29\xe5\x06\xb1\xaf" + "\xcb\x2b\x67\x19\x90\x7f\xca\x73\x79\xe7\x37\x4e\x97\xee\x3f\x7b" + "\x9c\xec\xab\x56\xe7\xdf\xb2\x7a\x6d\x31\x45\x29\x2a\x5a\xb7\xa1" + "\x88\xae\x6b\x57\x3e\x20\x2e\xeb\x72\xee\x5f\x25\x6f\x8a\xd6\x64" + "\xd0\xcd\x1a\xe0\x1b\x5d\xf3\x36\xd8\xe9\xb2\x6a\x1d\x3d\x3a\x0a" + "\xe6\x6f\x58\xa5\x85\x56\x8e\xc5\x43\x5b\xb0\xd2\xb2\x1c\xb8\xb1" + "\x58\xf2\x23\x96\x5c\xc8\xbc\x62\xef\xd7\x54\xee\x63\xaf\xdb\x44" + "\x0c\x36\xf6\xa5\x73\xf7\x3a\xcb\x83\x74\xee\xde\x54\x6e\x5f\x65" + "\x0a\xaf\xce\x07\x9d\x6d\xc5\xb7\x8d\x3e\x56\xa3\xc6\x10\x3a\xde" + "\x2e\x7c\x52\x56\x5e\x3a\xa4\xd9\x14\x2a\xee\xe3\x25\xe4\x6b\x5d" + "\xd8\x18\x3d\x26\x7c\xb5\xec\xc3\x73\x5b\xd3\x63\x22\xe6\x49\x2a" + "\x9e\x2b\xf0\xdc\x81\x67\x0b\x9e\xd3\x14\x77\x8f\x99\xce\xd9\xe1" + "\xd9\x8a\xe7\x74\x94\x3f\x19\xff\x3d\x16\x36\x6a\xd0\xaf\x5b\xa6" + "\x94\x89\xcf\xf4\x77\x84\xb9\x35\x3b\x4b\x8b\xa9\x2a\xe2\xa7\x56" + "\xce\x5e\xa6\xed\x05\xca\x38\x41\xe6\x15\x62\x5d\x13\x6b\xfb\xec" + "\x23\x71\x96\xb9\xe9\x92\xf7\x9e\xed\xd0\x7c\x0b\x48\xde\x7a\xb6" + "\x3b\x26\xf6\x2c\x3d\x37\x4c\xc6\x9e\x95\xbc\xe8\x4e\xc9\x8b\xce" + "\xf6\xf1\xca\xd9\xd1\x18\x7a\x95\xb3\x3d\xb1\x71\xc2\x7c\x78\x4f" + "\x32\x0d\xd2\xbb\xa3\xeb\xe0\xec\x35\x54\xe7\x54\x71\x76\x21\x93" + "\x3b\x72\x36\x81\xff\xc6\x55\xf0\xe2\x11\x1d\x13\xf2\x18\x9e\xb9" + "\x2b\x8b\xfc\xb4\x58\xe9\x1d\xf1\x7e\x53\xea\x19\x28\xce\x9d\x6e" + "\xce\x43\xe4\xd3\xd5\xef\xcc\xd3\x5d\xd5\xc4\x74\xe2\x59\xfa\x24" + "\xe4\x27\x75\x73\xbe\x49\xb8\xa7\xf9\x2b\x8b\x3d\xdb\x3d\xe5\x79" + "\x83\x77\xb4\x7d\xe2\x35\xeb\x4c\xe1\x95\xf9\x92\x8f\x9b\xf3\xb6" + "\xba\xdf\x5d\x22\xd7\xfb\x39\x87\xf8\xf7\x64\x2c\x0d\x9f\xee\x32" + "\x11\xc7\xce\xa4\x5b\xb3\x8e\xe3\x5b\x93\x63\x65\xbe\x48\x43\xbe" + "\xad\xe0\xb5\xd4\xf6\x3d\xed\x4d\x1b\x60\x7c\x2c\x22\xcf\xac\xeb" + "\xe6\x34\xdf\x3b\xb7\x8c\xea\x31\x0a\x3e\xe2\x1d\x96\x44\x31\xdb" + "\xa8\x6d\x4d\x31\xfe\xd4\xb6\x23\x4d\xc4\x63\xff\x1e\x4b\x22\xff" + "\xb1\x6a\x5b\x9a\x45\x1c\xac\xca\xcb\x16\x6a\xbe\x5f\x7c\x48\x3b" + "\xbb\x3f\xdf\xfb\xbe\x98\x21\x57\xaf\x9a\xbf\xec\x0e\xdc\xcd\x57" + "\xc3\x8d\xc6\xe2\x4e\xda\x48\xe2\xc8\xbe\x91\x67\x1e\x7d\x4f\xc4" + "\xeb\xab\xbc\xcc\x8d\x72\xe6\x8b\xf1\xde\xfa\xc3\x63\x44\x5b\xb4" + "\x78\xf5\x5e\x25\x80\x7a\xe7\xe5\x0b\xdf\xad\x7a\xc9\x2f\x0a\x9f" + "\x69\x95\x97\xdd\xc9\x13\x8f\x17\xc8\x58\x9d\xa7\x96\x61\xfc\xc4" + "\xba\x4f\x73\x43\x9c\x03\x34\x53\xdf\x2f\xf3\x81\xa6\xde\x8e\xdf" + "\xff\x91\xb1\x47\x7e\x78\x4c\x2b\x97\xfc\x1b\x01\xb7\x5a\x71\x35" + "\x07\x2b\xd3\x8c\x93\x76\x41\xda\xd9\x42\x5d\xda\x35\xe4\x7b\x29" + "\xca\x9f\xcf\xfb\xae\xe4\x2b\xd3\x32\x7d\xcc\xb4\x43\xce\xef\x34" + "\xe0\xff\xf3\x8b\xd4\xfb\x3b\x7d\xec\xe6\x82\xb3\xca\x78\x42\xd3" + "\x77\xc8\xb1\x4b\xb3\x03\x17\x6f\xc7\xef\xff\x20\x7f\x89\x16\xab" + "\x78\xab\x5e\x9c\x27\xea\x8f\xb3\xb0\x0c\xa4\xef\xd0\xd2\xe3\x75" + "\x59\x80\x4d\xda\x5e\x8d\x9e\x8c\x24\x0e\xe7\xe1\xf9\x00\xf8\xcd" + "\xf9\xea\xb3\x1d\xcf\x6d\xda\x33\xee\xbb\x34\x7a\x43\x7a\x87\x91" + "\x87\xb3\x9f\x22\x79\x6f\x95\x05\x3c\x99\x85\xe4\xab\x34\xbf\x8f" + "\xed\xb7\xa9\x79\x21\xff\xfe\xa6\x46\xde\xcf\x45\xff\x5f\x76\x47" + "\xe1\x1f\x67\x92\xed\x9f\xb7\x88\x27\xcf\x2d\xa0\x18\xd1\xc8\x33" + "\x1f\x73\x49\x7c\x4b\xbe\x8e\x6a\xc6\xcd\xcb\xbd\x15\xe0\x4f\xef" + "\x27\xbc\x98\x27\xf6\x4f\x6b\x37\x9b\x85\x5f\x61\x3a\x3b\x2f\x62" + "\x6e\x91\xef\xc2\x30\x9b\x21\xfc\xc5\xd7\xce\xcd\x16\x7e\xd2\x37" + "\xda\x92\x34\xbf\x85\x98\x93\x16\xae\x7f\x3c\x8f\x7c\x19\x0a\x5d" + "\x59\xd0\x96\x22\xfc\x17\xaa\x7e\x0b\x77\x17\xb3\xd4\x46\x45\xfa" + "\x2d\x14\xe7\xea\xcf\xe1\xbb\x90\xbb\xde\x9a\xf4\x5d\x48\x31\xe1" + "\x71\x6f\xe3\x63\xe1\x10\xae\xe9\x31\xfe\x59\x0c\x53\xfa\x31\xd4" + "\x83\x46\xea\xa5\x1f\xc3\xf3\x5b\x5b\xe6\x19\x25\x4e\xcc\x5b\xa2" + "\xc5\x4d\x8e\x49\x5b\x01\x9c\x96\xfb\xd3\xba\x34\x9b\x9a\x06\xfe" + "\xe7\xb9\x1d\x93\x7c\x18\x68\x1b\xe9\x0c\x31\x67\xf7\x73\x67\xc1" + "\x53\xb1\x73\x88\x31\x5a\xa2\xe3\x51\xd6\x0c\xfc\x66\xd2\x6f\xc9" + "\x24\x9d\x18\xe3\xdd\x24\x0b\x98\x74\x58\x57\x1c\x71\x7c\x69\x38" + "\x1c\x97\x13\xd6\x1d\x25\x1e\x93\xce\x08\x2f\x8d\x84\xe9\xac\xba" + "\x61\x69\x64\x84\xe2\x19\x1e\xa5\x73\x62\xdb\xef\xa7\x73\x8b\x97" + "\x73\x8a\x75\xb2\x34\xf2\x05\xdf\x23\xcf\x63\x76\x91\x0c\x10\x19" + "\xe3\x1d\x91\x62\xde\x8e\x31\x48\x22\xf9\x82\xfc\x45\xa5\xe8\x42" + "\x2c\xc5\x1e\xf7\xea\xdd\xa3\xaf\x72\xf2\x15\x45\x71\xae\x94\xca" + "\x10\x68\xa2\x55\x97\x13\x8e\x2b\xf3\x86\xfb\x84\xaf\xf9\xa5\x91" + "\x99\x7c\xa9\xe3\x56\x2e\xe2\x53\x15\xf3\x36\xd0\xd3\x38\x11\xb3" + "\x78\x13\x1f\xc1\xbd\x71\xe9\xa6\x11\x4e\xf1\x14\x51\x76\xfb\xd2" + "\xb0\x32\xbe\xd4\xa1\x38\x73\x1c\x3a\x7c\xf7\x29\xbe\xfb\x14\xed" + "\xc9\x40\x99\x66\x3c\xdf\xc6\xf7\xdc\x4f\xe7\x9b\xca\x84\x8c\x83" + "\x3e\x7a\xd4\x33\xa3\xad\x68\xdf\x01\xf2\x55\x9d\x13\xf6\x94\xed" + "\x51\xcf\x80\x8a\x58\x9e\x8e\x09\xae\xd6\xb3\x70\xe9\x26\x76\x5b" + "\xce\xa6\xcb\xc5\x59\x52\x3a\x27\xb5\x34\x6c\x45\x9d\x65\x04\x8f" + "\x24\x11\x3f\x99\xce\x4a\x55\x5e\xee\x3f\x57\x1c\x46\xb2\x01\x59" + "\x3f\x9b\xe9\x49\x0f\x10\x69\x2a\x5f\x46\xbe\xab\x9c\x7e\x1e\x22" + "\x9d\xde\xab\xe3\xdd\x7a\x6b\xb1\x01\xf4\xd3\x7a\x49\xa7\x3d\x63" + "\xea\xf3\x72\x95\xe1\x2c\x5e\xfb\x62\x1f\xaf\xe4\x66\x5e\xfb\xfb" + "\x3c\xee\x3e\x45\x34\x5b\xc7\xab\x75\x3e\x3c\xf7\xf1\x6a\x43\x0b" + "\xaf\xfd\x43\x1e\xaf\x9e\x59\x86\x2b\x9e\x13\x97\xf1\xda\xd6\x3c" + "\x5e\xf9\x99\x05\xdf\x61\x6d\xeb\xa7\xef\x72\x79\xe5\xe7\x46\x5c" + "\xf1\x0c\xba\x5d\xfb\x07\x3c\x0f\x84\x70\xc5\xf3\x31\x7f\xbf\xce" + "\x8a\xb2\x5a\x73\x79\x75\xb2\x55\xd4\x55\x6d\xb6\x8a\xba\xaa\x2f" + "\xb6\xca\x3a\x66\x59\x65\x1d\xb3\xad\xb2\x8e\x34\xab\xac\x83\xce" + "\x83\xbd\x38\xc0\x2b\x87\xb2\x91\xaf\x80\x57\x9e\x68\xc7\x15\xcf" + "\x5f\x2c\x44\x3e\x3c\xfb\xf7\xe1\x8a\xe7\x53\x68\x4b\x2b\x9e\x47" + "\xdc\xc8\x3f\xc4\x2b\x03\x61\xe4\x5b\xc3\x2b\xc7\xec\xb8\xe2\x39" + "\xd8\x87\x7c\x78\x3e\x8d\x72\xfe\x80\xe7\xf1\x0e\xe4\x5f\xc3\xab" + "\x2f\xa7\xf6\x00\xa7\xad\x54\xae\x9d\x57\x5f\x49\xf9\xf1\x9c\x8e" + "\xf2\xfe\x80\xe7\xab\x3d\xb8\xe2\xf9\x5f\x0b\x90\x1f\xcf\xd7\xa0" + "\xaf\x2f\x06\x78\xf5\xb5\x87\x90\xaf\x88\x57\xcf\x47\xfa\xef\xf1" + "\x7c\x7d\x2a\xf2\xe1\xf9\x06\xca\x8f\xe7\x1b\xd7\x20\x3f\x9e\x6f" + "\x26\x18\x85\x78\xf5\x02\x07\xf2\x39\x78\xf5\xff\xea\xc6\x15\xcf" + "\xb7\x50\xfb\xf1\xbc\xa8\x01\x57\x3c\x7f\x03\xb0\x6a\xc5\xf3\x37" + "\xd1\xbe\x17\xc1\x3f\xdc\x4e\xe5\x97\xf0\xea\x7f\x27\xf8\xe0\x79" + "\x49\x05\xf2\xe1\xf9\x3b\x80\xc7\x1f\xf0\x7c\xd7\x9d\xc8\x3f\x75" + "\xac\x99\xea\x65\xe9\xbc\x7c\x06\xe3\xd5\x3f\xc8\xe5\xe5\x33\x71" + "\xfd\xa1\x99\x97\xc7\xdb\x78\xf5\xbd\x76\xa4\xe3\xfa\xc3\x01\x3c" + "\xcf\x57\x9f\x71\x5d\xe1\xc1\x73\x86\xfa\x8c\xeb\x8f\x1a\xf0\x9c" + "\xa9\x3e\xe3\x9a\x6b\xc5\xf3\x42\x5c\x43\x78\xa6\x6b\x0d\x9e\x17" + "\xa9\xcf\xb8\xde\x77\x08\xd7\xb0\x7f\x6e\xd9\x3e\x7f\xf2\xb6\x5c" + "\x7f\xf2\x41\xb2\x41\x65\x91\xba\x17\x7d\x4a\xca\xef\xc9\x17\xed" + "\x0c\xe7\x28\x9b\xd9\xaf\xbb\xea\x79\x5a\x0b\xbd\x25\x3e\x11\x1b" + "\x4d\xf5\xa5\x36\xa3\x57\x77\xe5\xb3\x58\xfb\x17\x52\x3c\x69\xf4" + "\x35\x8d\xbb\xe2\x4f\xe1\xda\xc8\x5d\x17\xf4\xa2\xaf\x78\xbe\xf0" + "\x1d\x5c\xf1\xfc\x6f\xd5\xe8\x33\x9e\x7f\xf8\x2d\x5c\x1b\x83\x95" + "\x57\x81\x96\x59\xc5\x3a\xc6\x9f\x79\xb4\xcb\x14\x76\x82\xa6\x80" + "\xde\x3e\xe5\x81\xfc\x96\x0b\x1c\x7c\xc9\x6e\xa2\x18\x06\xbb\xcb" + "\x06\x78\xca\x36\xd1\x26\x8a\x53\xc2\x27\xd2\xf5\xb2\xee\x0b\x78" + "\xaf\xee\xaa\x05\xa4\xd7\xe4\x29\xbb\xa7\x7b\x7f\x8f\x78\x3f\xc7" + "\xd3\x2c\xdf\x1b\x59\xf4\xfd\x0f\xe9\xfd\x06\x13\xe9\xa2\xe7\x39" + "\xc4\x7b\x6f\x60\x40\xed\x57\x1c\xbd\x7b\x94\xf2\xfa\x74\x57\x1d" + "\x90\x7a\xaa\x2b\x5b\xb9\x2b\x8e\x8d\x18\x4f\xad\x41\xdb\xb1\xfe" + "\x5d\x1e\x56\xf9\xe4\x12\x6e\x3c\x5e\x26\xcf\xcd\x8f\x4d\xe7\xd3" + "\xc3\xa8\xd4\xbc\xd2\x5e\xeb\xe2\x5d\x24\x7b\x62\x0d\xd1\x5b\x4b" + "\xd3\x5b\x7b\x75\x57\xd3\xd9\x84\x00\x4f\xf2\x14\xd0\x39\xa0\x5e" + "\x5d\xfa\x3d\x13\xd5\xa7\x9a\xad\x9b\x4d\xa8\xff\xea\x47\x9d\x21" + "\x3e\xea\x29\xfd\x16\xd6\x3a\x91\xde\x23\x6c\xcb\xe5\xbd\x6a\x0f" + "\x24\xee\x0f\x48\xfd\xe8\xd5\xf5\xf4\x6d\x2c\xaf\x1f\xa9\xbc\xbb" + "\x42\x49\xf1\xd8\xe5\x7e\x56\xfa\x0f\x5e\x56\x7c\x7a\x53\x11\x8b" + "\xb7\x6e\x7e\x15\xe5\xa7\x37\x9f\x29\x17\x6a\x79\xc5\xbb\x6d\xaf" + "\x20\xef\x2e\xa1\xc3\x49\x6f\xd1\x74\xbe\x1c\x7d\x78\x44\xf2\x44" + "\x59\xb4\xae\x49\xde\xee\xea\x0c\xf2\xd5\x18\x4e\x7a\x69\x59\xb8" + "\x66\xdb\xb2\x48\x8d\xa7\x80\xd7\x79\xec\x29\x61\x1d\x13\x76\xf9" + "\xba\xab\xf3\x6f\x08\x91\x6e\xed\x4d\xca\x3b\x57\x99\x91\xbd\xf8" + "\x7a\x07\xd3\x7b\x0a\x3f\xa0\xe7\x1f\xf1\xca\x1f\x0d\x79\x87\xba" + "\x19\xf9\x9b\xc5\xf3\x0a\x5e\xb9\xba\x4b\x99\xb1\x6a\x5f\x13\xf1" + "\xa4\x0e\xd2\x09\xbd\x43\x70\xf9\x04\xe3\x02\xde\xff\xea\x45\x5a" + "\x5b\xc8\xdf\x7c\x2d\x60\x47\xfc\x22\x9d\xa3\xce\x89\x44\xc8\x8f" + "\x11\x78\xba\xab\xeb\xe5\x78\x5d\x6d\x25\xba\xad\xd6\xbb\x41\x49" + "\x3c\x55\xd3\xb9\x82\xf6\x4c\x8d\xe4\x17\x66\x54\x9c\xbb\x0c\x53" + "\x8c\x38\x5a\x2b\x65\xde\x33\x7c\xec\xae\xb2\xe7\x6c\xb6\xaf\x2b" + "\x2c\xca\xd9\x60\xbf\xc5\x4a\xf1\xec\xd7\xdd\x6f\x7d\x30\xff\xc1" + "\x75\x85\x9b\xce\xe6\x2b\x8d\x68\xd7\x51\xe0\x89\x58\x8b\xdf\x00" + "\x54\xa5\xae\xf9\x5f\xf7\xd2\x58\x3f\xf5\xa4\x8c\x49\x80\x3c\x21" + "\xc8\x56\xc2\x26\x49\x69\xf0\xb8\x79\x63\xd9\x40\x15\x9d\x1f\xdf" + "\x40\xb2\x81\x9f\x79\xd9\x29\xb4\x4d\xc6\xa7\xeb\x0c\x83\x06\x17" + "\x97\x70\x4f\xf1\x29\x9a\x07\xa0\x51\x07\x1d\x7c\x77\x79\xc6\xe9" + "\xda\x6d\xed\xbd\xba\x7f\x75\x9f\xae\x3d\x58\xa0\xc5\x90\x89\xd4" + "\x1c\x6c\x57\x92\x5e\xf1\x51\x0c\x99\x09\x6e\x61\x47\x00\xcb\x71" + "\xf7\x29\x07\xd6\x81\xa2\xdd\x2e\xac\x63\x90\x29\x84\x7f\x8b\x67" + "\x1e\x6d\x89\x70\x9b\x21\xe2\x62\x46\x5c\x53\x78\x8a\xc7\x3c\x91" + "\xf4\x52\x2e\xbd\xa7\xd8\x31\x91\x09\x1b\x2b\x3d\xca\x95\xff\x2a" + "\x00\xde\xb8\x18\x17\xf1\x3a\x0b\x4e\x30\xa4\x27\x2a\x75\x07\xfd" + "\xfd\x4b\x98\x9e\xf2\x82\x47\x62\x2b\x70\x5f\xb2\x92\x25\x23\x9f" + "\xa9\xe4\x0d\xa4\x07\x6d\x89\x61\xa7\xcd\x38\xee\xb4\x25\x4e\x70" + "\x5b\x92\xb7\x2f\xc4\x26\xae\x7e\xd4\x73\x9d\x9f\x19\x9e\x02\x2f" + "\xb5\x5b\xc1\x1c\x6c\x2c\xeb\x8a\x3c\x6c\x9b\x11\x7e\xd8\x66\x98" + "\x98\xb0\x19\xc3\x1b\x6d\x86\xf1\x8d\xb6\x19\x13\x41\x9b\xd1\x9b" + "\xe7\x67\x6f\xfa\x7f\xcd\x3a\xfb\x06\x84\x3e\x72\x22\xd9\x93\x36" + "\x91\x7c\x30\x9c\xd4\xc7\x52\xaf\xb7\x83\xa7\x02\x3f\xb9\x13\xbc" + "\x33\x70\x22\x29\xfc\xcb\x47\xb1\x9e\xbd\xea\x01\x7c\x1f\xbc\xe3" + "\x1a\xfe\x45\xa4\xf2\xba\x2c\xeb\x77\x40\xaf\xca\x0d\x69\x48\x03" + "\xfe\x7c\xbd\x85\x57\x2e\x00\x6d\x33\x80\xee\x19\xd2\x7d\x72\x1c" + "\xc0\xc7\x7d\x2d\x80\xe7\x34\xca\x2b\xf3\xdd\xb4\xd8\x27\xae\xd7" + "\xef\x10\x71\x35\x2b\xaf\x6e\xdc\x2d\xe4\xbb\x7f\x6d\xd6\xf8\xf2" + "\x36\xc3\xd4\x67\xd4\x91\xa7\x6d\x52\x4e\x56\x40\x73\x6a\x5f\xec" + "\x9a\x9a\x96\x0f\x56\xd0\xfe\xa5\x02\xb8\xf5\xeb\x6c\x0b\xc8\x57" + "\x12\x77\x2e\x51\x65\x53\x9b\xe0\xd9\xe8\x5c\x37\xe9\x2f\xd4\x34" + "\x69\xe3\xa3\xcf\x22\x7f\xf1\xad\xe4\x9f\x8a\xf4\x15\xc0\xeb\x76" + "\x9f\xce\xb6\x04\x70\x88\x87\x5c\xd7\x82\x5f\x2b\x7e\x9e\xc7\x49" + "\x8f\xe1\x62\x77\x68\x3a\x9e\xa9\xdb\x6a\x03\xff\x57\xdb\x1d\x95" + "\x73\x6d\x65\xe8\x77\xf7\xf9\xdb\xfe\xd9\xa6\x95\x21\x85\xdf\x4d" + "\x82\x71\xdd\xef\x59\xbd\x32\xe9\x6f\x15\x6b\x83\xed\x5d\xd0\x89" + "\x32\xf1\xae\xe6\x25\x7b\xe9\x30\x8b\xa3\x77\x2d\x64\xeb\x80\x67" + "\x6b\xa1\x8e\x7b\x03\x21\xfa\xc6\xc0\xd3\xca\x06\x5a\xc6\xfc\x7a" + "\x9a\x17\x9d\x48\xc3\xb7\x27\xea\xc7\xd4\x72\x1b\x3c\xf5\xce\x87" + "\x98\x88\x7f\x41\x31\x74\x68\xbe\xd4\x97\x42\x86\xa4\x78\x3f\x85" + "\x44\xab\xaf\xb9\x06\xf7\x46\xca\xc7\x93\x5e\xb2\x2b\x28\x03\x73" + "\xa6\x9b\x27\xbf\x94\xad\xd4\x1e\xf4\x61\x0d\x69\xe6\x73\xcb\x97" + "\x28\x4f\x79\x1c\xc1\xca\x6b\xa8\xff\x42\x1f\x48\x7e\x70\x48\x47" + "\x12\x81\xac\xde\xb9\x2f\xcc\xf8\xb7\xc2\xec\xf5\xa2\x51\xe6\x4f" + "\x38\x55\xe2\x4f\x7e\xa5\xdd\x9f\xfc\xaa\x27\x92\xfc\xaa\x19\xbf" + "\x54\x7b\x21\xed\x15\x5f\xbb\x78\xd2\x9f\xe3\xf0\xb9\xfd\x39\xa2" + "\xcc\x74\xcd\xa7\x63\x64\xe3\xf9\xfb\x73\x8c\xe8\xff\x14\xde\x5d" + "\xfc\xd5\xfe\x1c\xc1\xb3\x52\x2c\x72\x8f\xe6\xa7\x24\x22\x6c\xcf" + "\x59\x52\x24\xf9\xa5\x25\xc2\xd7\x89\xc3\x23\xfc\x95\x10\xef\x4a" + "\x6b\x4d\xb0\xf2\xda\x49\xfb\x6f\xa2\x9f\x91\xaa\x53\x6e\xfc\x2a" + "\x90\xde\xe0\xd3\xdd\xda\xa5\xd1\x56\xac\xb9\x65\x91\xc4\x35\x15" + "\x41\x3a\x4f\x30\x51\x70\x1b\xe5\x05\x1c\x5b\x50\x77\x5c\x64\xa2" + "\x60\x11\x7e\xb7\xe2\xf7\x8d\x48\xed\x41\x7b\xa4\xf6\xd5\xe6\x48" + "\xed\xb6\x0a\xfc\xdc\xf8\xd5\xe0\x57\x8f\xdf\x0e\xfc\xc0\x1f\x6d" + "\x6b\xc4\x95\xde\xef\xc5\x6f\x1f\x7e\xfb\xf1\x6b\xc1\xef\x40\xe4" + "\x29\x4f\x59\x44\x67\x48\xc3\x2f\x1d\x3f\x2b\xca\x31\x46\x6a\x5f" + "\xe9\x8e\xd4\xbe\xb4\x4c\x9c\xf3\xac\xfc\xda\x7c\x0d\x57\xa7\xf6" + "\x1d\x9a\xe6\x16\x3e\xfd\xe3\x3f\xe6\x26\x8a\x37\x5b\x32\x4a\xfe" + "\xdc\xdc\xaf\xdb\x02\xe7\x17\xdb\x41\xf7\xb5\x15\xd3\xe1\x36\x95" + "\x0f\x3a\x33\x71\x9e\xe5\x7d\x49\xff\x37\xc9\xef\x5b\x3c\xee\x70" + "\x5a\x79\x46\xd8\xc5\xca\x40\xdb\x74\x9d\xb9\x7d\x6c\xa9\x9f\x39" + "\x3b\xfa\xc6\x99\x33\x8f\x47\x04\x1d\x28\x21\xbb\xee\xc7\xf3\x08" + "\xcf\x23\x3c\xdb\x3a\x51\x73\xd0\x11\x49\x7a\xa5\x99\x27\xbd\xd2" + "\x2d\x7c\xc4\x81\x9e\x50\x0c\xad\x49\x99\x96\xf0\x0e\x72\xed\x91" + "\xa1\x51\xf6\x70\x1e\x57\x8e\x14\x80\x47\xeb\x06\xf2\xe9\xd8\xd3" + "\x02\xff\x54\xb9\xf6\x7f\xf7\xf0\x32\xe0\x53\x42\x04\x70\x53\x48" + "\x9e\x05\xee\xed\x29\x66\x19\x1a\xfe\x61\x5d\x37\x6b\x71\x87\xf8" + "\x8c\xaf\x65\xe1\x9d\x81\xe2\x12\x35\x42\xae\x6d\x2c\x66\xe9\x8d" + "\x78\x27\x62\x48\xa2\xdd\x77\xdb\x4d\x5c\x79\xc0\xc6\x9a\x7e\xc2" + "\x8c\xc9\x27\x64\x5c\xd2\x08\x60\x1f\xf5\xcd\xbf\xad\xfd\xae\x13" + "\x56\xf6\xba\xed\x23\xac\xcf\x2d\x18\x97\x6d\xed\x13\x58\xc3\x00" + "\xcb\xc8\xf9\xc1\x72\xfe\xb4\xf1\xaf\xfe\x59\x58\x4e\xa4\x95\x75" + "\x49\x78\xe6\x32\x82\xd9\xd9\xf0\x24\x18\x6f\xee\x03\x3c\x01\x57" + "\xef\xd1\x08\xe4\x53\xb6\x52\x83\xe7\x2e\xc0\x13\x30\xb5\x10\x4c" + "\x01\x0f\x01\x53\xae\xc2\xb4\x29\x06\xa6\xa0\x5f\xc2\x9f\x1e\xc1" + "\x54\x01\x4c\x9b\xa6\x81\xe9\xa4\x7e\x00\x30\xdd\xf3\x0f\xc1\x74" + "\xdf\x3f\x01\xd3\xeb\xef\x9c\x0e\xa6\x61\xe2\x1d\xea\xb6\x79\x38" + "\x68\xa3\x37\xfc\xa6\xf0\x0d\xc9\x6b\x5e\x4d\x55\x6a\x5e\x35\x2b" + "\x49\x07\xdb\x29\xce\x34\xed\xe3\x53\x1c\x2c\xa7\x83\x7f\xe2\xdc" + "\xc7\x4f\x47\xea\x3c\x56\x4a\x03\x6d\x2b\xb8\x81\xec\x87\xb0\xe2" + "\x34\xe9\x79\x6b\xe7\x18\xe9\xd1\x6e\xdc\x36\x4e\xbc\x77\x9d\x27" + "\x47\xe1\x05\x8c\xe8\xca\xbd\xd7\x30\xc3\x38\x68\x87\xbd\x98\x5d" + "\x5e\x0f\x7a\x38\x5e\xfb\x6a\xea\xa0\xee\x06\xeb\x1d\x76\x85\xe3" + "\xe7\x24\x1f\x87\x0a\xe8\x2e\xe8\xb9\x18\x5f\x1a\x33\xda\x1f\x3c" + "\x72\xef\x9f\x50\x5e\xc6\x85\x6f\xe5\x86\x99\xb3\xe0\xcb\xe3\xab" + "\x38\xb3\xad\x91\x9a\xaf\x9e\x27\x14\x8b\xaf\x64\x80\xc6\xb5\x85" + "\x79\xfb\xa2\xf3\x44\x51\xe9\xf4\xff\xc7\xde\xf7\x00\x44\x55\x65" + "\xff\xdf\x79\x8e\x85\x36\x03\xa3\x4b\x35\x19\xda\x64\xb6\x3b\xb5" + "\x9a\xd4\x6a\x6b\xbb\x56\x54\xba\x91\xa9\x58\x69\x4b\x65\x85\x8a" + "\x2e\x18\x22\x29\x2a\xfe\x83\x81\xc0\x90\x06\xc4\x72\x5b\x2a\xfe" + "\x6d\x4b\xad\x6d\x56\xee\x2e\xca\xe8\xd7\x64\x2a\xdd\x45\x05\x86" + "\x5a\xdd\x68\xb3\x5f\x93\x4b\x46\x86\x36\x01\x09\xc2\xcc\xbb\xbf" + "\x73\xde\x7d\x8f\x79\x33\xcc\xc0\xcc\x80\x68\x1b\xd4\x73\x66\xee" + "\xbb\xef\xbe\x7b\xcf\xf9\x9c\xcf\x39\xf7\xbe\xfb\xee\x45\x5d\xa0" + "\x5d\xa0\x8d\x6c\x91\xf1\x33\x70\xbf\xa6\x48\xdc\x9b\xc2\x91\x01" + "\xfc\x8c\x6b\x99\x83\x2e\x71\xcf\x0a\x8f\xf6\xb1\x1e\xec\x63\x9d" + "\xb0\x6f\x90\x16\xe4\xb1\xb3\xa3\x8d\xe9\x10\x75\x66\xb1\x57\x09" + "\xfa\xcb\x17\xfd\x01\x93\xfb\xfe\x4f\x29\x8d\x86\x98\x6e\x6c\x34" + "\x9f\x67\xd6\xd0\xb6\xb8\xe1\xb8\x77\x54\xc9\x19\xc0\x53\x2c\xc4" + "\x50\xdf\x82\xbf\x48\x04\x7c\x9d\x21\xe3\x4a\x12\x21\x2e\x6a\xc3" + "\xfd\xbf\xa0\x3e\x6b\xd9\xbe\xa9\xfc\xa6\x9f\x97\xc1\x39\x61\xcd" + "\x46\x5e\x5a\xb3\xb1\x45\x8f\x63\x1b\xce\xf1\xa6\xe5\x7a\xce\x79" + "\xcf\x76\x9d\x43\x35\x36\x5a\x78\x1f\x55\x11\xce\xe6\x01\x05\x7d" + "\xaa\x41\xb9\x36\x29\x6e\x56\xb1\x31\x60\x6b\x68\x52\x2a\xce\x13" + "\x0a\x7f\x8f\xe6\x34\x06\x25\xe1\x1e\xd0\xd2\xb9\xb4\x68\x94\x43" + "\xeb\x4d\x06\x62\x70\xe4\x8e\x4d\xc1\xbd\xc1\x71\x4d\x2e\xff\xb0" + "\x18\x5e\x8f\x65\x39\xb2\xdb\xc7\x81\x9c\x22\xf8\x9c\xf6\xf1\xc0" + "\x29\xe1\xf4\x29\x68\xeb\x52\x68\xeb\x29\x90\xeb\x29\x68\xeb\x1a" + "\xb1\xad\xe2\x9e\x68\x3c\xc8\x1f\xce\x79\xf6\x8f\x52\x5b\x9f\x02" + "\x79\x67\x7f\x6c\xdd\x78\x9a\xfc\x84\x42\x4c\x5e\xd3\x24\xbc\x0b" + "\xd4\x66\xb1\x7f\x46\xf0\xbe\x82\xff\x36\x66\x15\xcc\x03\x3c\xa2" + "\xcc\x21\xd6\x06\x7c\xee\xb1\x49\x7a\xc0\xfa\xd0\xce\xb8\xe1\xc5" + "\x89\x50\x1f\x94\xfd\x19\x32\x1e\xed\x19\x64\x3f\xae\x18\xe5\xef" + "\xba\x2f\x71\xa8\xa0\x83\x4b\x40\x07\x89\xa2\x0e\x72\x45\x1d\x40" + "\xcc\x0c\xbe\x18\xc7\x7a\xb4\xc5\x19\x4c\x07\xfe\xc9\xe8\x66\x7b" + "\x3f\xdb\xeb\x38\xef\xf6\x3a\xf9\xb6\x0e\xd6\x97\x56\xe0\xda\x91" + "\xd0\x4f\x58\xc4\x77\x82\xdd\xe6\x89\x76\x4b\xe3\xee\x90\x6c\xf6" + "\xa4\xe2\x96\x63\xbe\xd9\xec\x2f\x0e\xfe\x48\x6d\x36\xf4\xfc\xda" + "\xec\xa4\x5c\x57\x9b\x9d\x64\x76\xb5\xd9\x49\xab\x9c\x36\x2b\x9e" + "\xeb\x17\x9b\x9d\x64\xbc\x30\x36\x3b\xc9\xe8\xc1\x66\x95\x3e\xd8" + "\xac\xd6\x8b\xcd\x6a\xcf\x9f\xcd\x4e\xf6\xba\x47\x7b\xff\xfb\xd8" + "\x29\xdf\x75\x70\x1e\x7c\xec\x7a\x99\x8f\x55\xa3\x8f\xbd\x35\xd3" + "\x93\xbd\x76\x16\x82\xbd\xaa\x44\x7b\x7d\x74\x2f\x94\xf7\xcb\x8d" + "\x87\x8f\xf7\x6e\xaf\xf6\x42\x67\xfc\xe4\xd5\x66\xe3\xd0\x66\xb7" + "\x13\x8b\x55\xb0\xd9\x05\x92\xcd\x16\x8a\xfd\xa1\x1e\xec\x36\xd4" + "\x9b\xdd\xe2\x3e\x51\xb8\x47\x54\x8f\x76\x2b\xc6\x4b\x9d\xa3\xd1" + "\x6e\xcd\x17\x99\xaf\x9d\x32\xdd\xd5\x6e\xa7\xa4\xb8\xda\xed\x94" + "\x09\x4e\xbb\x15\xcf\xf5\x8b\xdd\x4e\x99\x76\x61\xec\x76\xca\xb4" + "\x1f\x8e\xaf\xbd\x2d\x6e\xe0\x7c\xed\xd4\xb7\x04\xbb\xf5\xe6\x6b" + "\xd3\x44\x5f\xab\x46\x5f\xfb\xab\xbb\x7c\xb3\xdd\x5f\xdf\xf6\x23" + "\xb7\xdd\xf3\xec\x73\xa7\x2a\x5c\x6d\x77\xea\x24\x57\xdb\xfd\xf5" + "\xd7\x4e\xdb\x15\xcf\xf5\x8b\xed\x4e\x25\x17\xc6\x76\xa7\x92\x1f" + "\x8e\xcf\xbd\xdd\xeb\xfe\x8f\xba\x31\xc4\x70\x42\x71\xfb\x46\x4b" + "\xa1\x30\x07\xd0\x60\xb1\xff\x8a\xb0\xb9\x2a\xb7\xbf\x66\xd1\x4e" + "\x21\x7c\x4e\xb3\x0d\xf7\x46\xc0\x39\x33\x2f\xc8\xe6\xa4\xb0\x39" + "\x14\xb7\x1f\x94\xe6\xd4\x94\x88\xfb\x27\xf4\x34\xa7\x86\x66\x37" + "\x67\xb2\xeb\xee\x20\x0c\x1b\xcd\xd9\xd2\x6f\x61\x9d\x2b\xc5\x1d" + "\x4a\xba\xb9\xd9\x60\x1b\xd6\xec\x71\x8f\x01\x7c\xa6\x10\x9c\x4e" + "\x29\xee\x3b\xd4\x32\x66\x6b\x4c\x4b\x0e\x21\xf9\xc2\xb3\x98\x3b" + "\xa6\x42\x1b\x63\x85\xb1\xdb\xe0\xc9\x11\x2d\x19\x73\x08\xa4\xcd" + "\x91\xd2\x84\xbd\x99\x33\x86\x50\x1e\xce\x01\x87\x8c\x2f\x49\x25" + "\x41\xb8\x76\xe8\x4d\x67\x11\x8b\x77\xc4\x00\x47\x84\xe2\xde\x45" + "\xb8\x5f\x04\xbd\xf2\xea\xd6\xe2\x66\xa2\xac\xcd\x14\xc6\x9f\x71" + "\x2e\x4e\x69\x1e\xe2\x7f\xc8\x8d\x05\x94\x53\x12\xbe\x28\x7d\x0a" + "\x55\x57\x6a\x85\xb9\xbf\x80\x15\x69\x7e\x0e\xee\xe7\xc5\x8f\x36" + "\xd4\x4b\x6b\x57\x52\xa8\xdf\xfe\x54\x1b\x87\x7b\x68\x17\xaf\x20" + "\x1a\x38\x54\x34\xb7\x52\x0b\xf5\x6a\x94\xc6\x13\xbd\xce\xe3\xc6" + "\xfd\x65\xaf\xd6\x2a\xc5\xb9\x40\xf8\x0e\xae\xb0\xf7\xc6\x16\x8e" + "\xcf\x76\x40\x3a\xcd\x48\x13\xf6\x8f\x0a\x01\x59\xe0\xdc\x5b\xdc" + "\xd7\x87\x2f\xde\x8a\x6b\xe9\x93\xb7\xd7\x35\x72\x38\x17\xc4\xf1" + "\x87\xab\x5b\xcd\xa9\xb7\xe0\x1a\x15\xc2\x9a\xdd\x27\x15\x77\x7e" + "\x19\xf5\x35\xdb\x4b\x16\xbe\x7f\x87\xcf\x60\x66\xc1\x6f\x9c\x1f" + "\xc0\xb7\x68\x95\x98\x17\xd2\x8b\xcc\xab\xff\x43\x42\x92\x84\xf9" + "\xf1\x41\x62\xde\x04\xcc\x6b\x55\xdc\x29\xbc\x57\x02\xbf\x0d\xf8" + "\xdc\x00\xe7\xd0\xe3\x7c\x27\x5a\x98\x3e\x45\xe0\x07\x63\xa5\x96" + "\x1f\x9d\x3e\x45\x98\xb7\x0a\xed\xdc\x02\x6d\x86\x3c\x2a\x9c\xdb" + "\x23\x7c\xa6\x12\xcd\x36\x48\xc3\x72\xe0\x53\x65\x4e\xc4\xb9\x2a" + "\x77\xce\xc7\xb2\xbd\xbe\x1f\xa0\xaa\xd4\xd2\x0c\x25\x61\xef\xf5" + "\x28\x3e\x3c\xa1\x88\xc8\x0f\x51\x50\x4a\x0b\x0d\xf5\xcf\xe0\x38" + "\x37\xce\xc9\x16\xe6\x99\x47\xc4\x43\xf9\xca\x12\x61\x1c\x37\x22" + "\x12\x70\xd4\x2a\xae\xa7\xc1\xf6\x1d\x51\x44\x94\xe2\x7d\xf0\x1a" + "\x31\xff\x14\x36\xff\xb9\x52\xab\x4b\x1d\x42\xe1\xf7\x66\x36\x6f" + "\x3b\x28\x06\xae\xcf\x76\xce\x57\x13\xae\x03\x2c\x45\x14\x42\x99" + "\x1a\x61\x6e\x1d\xe7\xf9\xd9\x87\x30\x27\x5a\xd4\x5b\x8d\x16\xb0" + "\xe1\xae\x3b\x09\x23\x80\x0b\x09\x23\x58\xdf\x77\x52\xad\x1c\x7b" + "\xc6\x71\xd7\x0d\x98\x2f\x0f\x74\xe8\x78\x45\x8b\x6b\x23\x12\xbe" + "\x13\xf5\x82\x73\xeb\xef\xfa\x02\xf5\xb2\x05\x7c\x81\x98\x57\xe9" + "\xac\xbf\xf0\x5b\xd0\x27\x0f\xba\x60\x73\xfc\xef\xda\x25\xec\xa1" + "\x02\x9c\x81\xf3\xcb\x0f\x40\xa4\x44\x11\xb7\x80\x91\xb7\x57\xb4" + "\x73\xc5\xab\x59\xfa\xfe\xe6\x76\x0e\xe7\x92\xe0\x78\x78\xee\x52" + "\xa2\xc4\x71\x75\x2c\x93\x86\x19\xea\x27\x4a\x7a\x5c\x07\xba\x5b" + "\x0d\xd8\x05\x99\x6f\x01\xf9\x15\x77\x08\xcf\xac\xea\x8b\x79\xa2" + "\xe2\x21\x9f\x55\x71\x97\x0d\xca\xd3\x14\x5d\x41\x6d\x38\xa7\x1b" + "\x64\x98\xdc\xb6\xe9\xae\x6a\x49\x86\x58\x27\x9c\x93\x9d\x2b\xcc" + "\xcd\xbf\x2b\x92\x61\xe8\x2e\xad\xd4\x66\x6f\xf2\xcc\x7d\x9b\x84" + "\xe5\xde\x44\xa6\xf0\xaa\xb0\x6c\x3a\xe4\xea\x52\x1c\x6f\x9e\xdd" + "\x44\x08\xae\xf3\x1e\x95\xf5\x39\xb5\xd8\x1c\x84\x57\x87\x65\xe3" + "\xf3\x09\xc7\x33\x37\x8e\x8c\x5a\x8b\x7b\xdc\xef\x49\x49\x6b\x27" + "\x1a\x4b\xaa\x8d\xed\xf5\x45\xbe\x23\x8e\x95\xc0\xe1\xc0\xeb\xe0" + "\x53\x95\x69\xdf\x91\xab\x50\x5e\xbc\x7a\x4f\xca\x49\xc5\xdd\x7f" + "\x9c\x97\x4c\x0c\xfe\xf1\xe8\xdd\xc2\x3b\x48\x18\x5f\x00\xe7\x73" + "\xc2\x5e\xee\x36\x88\x4f\x72\xf7\xf8\xb7\xdf\xb0\xe2\x6e\xaf\xef" + "\x17\x61\xbb\x79\x1c\x87\x16\xdb\x1c\x85\x6d\x6e\x6d\x27\x38\x96" + "\x3f\xfb\x69\x5c\x7b\xf4\x7b\xc2\xe7\x86\x65\x63\x9b\x79\xf5\xfe" + "\x76\xff\xc7\xf4\xef\x09\xef\xe9\xde\x14\xe4\xcd\x3f\x73\x75\x29" + "\xaf\xda\xdf\x8e\xf7\xc6\x3a\xe0\xbb\x39\xb3\xbf\x27\x82\xdc\x51" + "\xfe\x96\x76\x07\xa1\x6a\x79\x1d\xec\xfe\xd6\xc1\x7b\xfb\x6f\x22" + "\x61\xc6\xb7\x99\xde\x1d\xcf\x88\x32\x88\xc3\xe7\x64\xfb\xdb\x71" + "\x7f\xb2\xd9\x58\x07\xdb\x69\x32\xeb\x34\x11\xf4\x6f\xd1\x37\x11" + "\xc7\x90\x1b\x47\xe2\xdc\x0b\xd4\x7f\xaa\x1d\xf4\x7f\xb6\x1d\xd7" + "\x0b\xb1\x59\x0c\xe7\x08\xc6\x2f\xf6\x16\x3d\xd7\x5d\xff\xd3\xfe" + "\x38\x2f\xc5\x5f\xfd\x4f\xeb\x27\xfd\x4f\xbb\x08\xda\x3f\x3d\x80" + "\xf6\x4f\xef\xa7\xf6\x4f\xbf\x08\xda\xff\x9b\x00\xda\xff\x9b\x7e" + "\x6a\xff\x6f\xbc\xb6\xff\x9e\xab\x78\x2a\xcc\xc9\x09\xde\x65\x45" + "\x1f\xc0\xfc\xd5\xbd\x2f\xe1\xfc\x1b\xe1\x5d\x2c\xf1\x37\x61\xef" + "\x66\x05\xb9\xfd\x56\xb9\xfd\xd6\xb8\xfd\x0e\x75\xfb\xad\x75\xfb" + "\x1d\x26\xfd\x06\x3f\x32\xf4\x8c\xe2\xde\x61\x10\x97\x1a\xac\x8a" + "\x7b\xcb\xc4\xf3\xe3\x70\x3d\x1d\xf0\xe9\xe3\xbc\xed\x37\xa7\x56" + "\x10\xda\xc9\x51\x22\xec\x03\xa7\x88\xd4\x76\x64\x10\x4a\x87\x8c" + "\xd2\xe3\x5e\x5d\xbc\x31\xab\x6c\x36\xf0\xb4\xc5\xd6\x0e\x71\xbe" + "\xf6\x12\x28\xfb\x4a\xdc\x83\x10\xf5\xaa\x5b\x81\xf3\x6b\x22\x87" + "\x62\x3b\x6f\x4a\x32\x13\x7e\xc8\x8d\xc2\xfc\x06\x3e\x37\xab\xcc" + "\x36\xe4\xc6\x51\xf4\x25\xb3\x21\x37\x83\x0f\xb2\x34\x1d\x25\x79" + "\x1c\xaf\xdb\xb0\x01\xf4\xdb\x54\x4e\xd6\x37\xd1\xc6\x0d\x76\xda" + "\x6e\x99\x6f\x26\x69\x36\xdc\xc3\xa3\x8a\xd4\xda\x8e\x0a\xfb\x78" + "\x08\xfb\x95\xd8\xca\x09\xc6\x3f\x69\x98\x07\xd2\x6a\x6d\x3b\x48" + "\x0d\xfc\x36\x27\x7e\x09\xed\x8c\xdc\x65\x69\xda\x01\xfd\xa5\x2c" + "\xe0\xbb\xac\x4c\xaa\xca\xca\xae\x69\xc2\xfd\x47\xb3\x8c\x58\xd7" + "\x5a\xa8\x87\xc5\x6e\xc2\x7e\x96\x51\x28\xb7\xb5\x4e\x88\x53\xf1" + "\xb9\x2d\xaf\x86\xfc\xea\xac\x6c\xac\x1f\xd6\xcd\xf3\x73\xd8\xdd" + "\xa1\x50\xf7\x5f\xcd\xd3\x2b\x09\xbe\x3f\xe1\x1f\x46\x22\xeb\xbd" + "\xc6\xd1\xc6\xdd\xdb\x58\xb9\x41\x01\x94\x7b\x9f\x57\xfe\xa7\xc6" + "\x0a\xb1\xbe\x9a\x40\xca\xed\x61\xff\xf7\x0a\xb1\xbe\xba\x40\xca" + "\xb5\x7a\x2f\xd7\x24\xd6\x37\x22\x80\x72\x67\x78\x5f\xff\xc0\x68" + "\x12\xeb\x6b\x08\xa4\xdc\x6e\x7b\x58\xcb\xf1\x10\x18\x16\x66\x34" + "\xf4\x84\x85\xc0\x70\x70\x7f\x0f\xed\xaf\x08\x0d\x0c\x03\xf7\x1b" + "\x7b\xc2\x40\x60\xfa\xbf\xbf\x47\xfd\x07\xa6\xfb\x99\x93\x7a\xd2" + "\x7d\x60\x7a\x9f\xe9\x15\xff\xd8\x37\xa0\xc6\x5d\x75\x34\xd8\x9c" + "\xc4\xe7\x65\xd5\xf1\xc1\xbb\x3e\x7a\x86\x8f\x20\xf7\x6c\x24\x24" + "\xa4\x80\x8c\xb8\xa7\xe8\x73\x1a\x21\xf4\xb9\x67\xe9\x36\x16\x12" + "\x0e\xfa\xd0\xdc\x5b\xeb\xea\x39\x8b\x7d\x0a\xf2\x96\xa3\x6c\x75" + "\xbb\xe2\x3a\x48\x7f\x0f\xfc\x60\x2b\xc4\xb2\xac\xac\xac\xba\xbc" + "\xd4\x08\x22\xbc\x5b\x07\xfd\x88\xd9\x4f\x7f\x4e\x71\x2d\xc2\xa8" + "\xef\x80\x5f\x0b\x70\x6d\x43\x32\x02\xae\xb5\x03\x8e\xa1\x9c\x76" + "\xf2\x0e\x6f\x53\xcc\xb6\x09\x79\x6d\xc2\x7c\xf7\xbc\x5d\x1f\x61" + "\x5f\x81\xa6\xe9\x71\x9d\x32\x1b\xdc\x7b\xeb\x10\x1b\xe1\x8a\x71" + "\xaf\x9d\x4d\xb3\x8c\x56\xc5\xec\x0d\xe2\xfb\xa9\x4d\xc2\x7a\x7a" + "\x50\x77\x5c\x4f\xef\x19\xe8\x37\x60\xfe\x9b\x92\x08\x87\x6b\x1e" + "\x43\x5e\x13\xae\xb1\xd7\xd3\x7b\xde\x0e\xe3\xfe\x72\xbc\x9e\x1a" + "\xc1\x3f\x9f\x26\x5c\x6d\xab\x8d\xd0\xb0\xf4\xf0\x3c\xe8\x9f\x4c" + "\xbf\x01\xc7\x53\x9a\x49\xea\x46\xca\xe3\xd8\x16\x55\xed\x89\xc3" + "\xf9\x87\xc2\xfa\xef\x8a\xd9\x73\xb1\xaf\x2f\xee\x8f\x34\xea\x14" + "\xfc\x16\xfa\x48\x38\x0f\x47\x95\x15\x4d\xf3\xd4\x11\xb5\xad\xcd" + "\xc2\xfe\x1e\x27\x14\xb3\xe7\xe1\x5a\x67\x2d\xaa\xfd\x3b\x5b\x55" + "\xfb\x4d\x6d\x9b\x66\xcf\x91\xda\x80\xf7\x97\xd2\xb1\x4f\x88\xf9" + "\xe0\x7c\x92\xf4\xde\xb7\x97\xbd\x75\x47\x46\x69\xa9\x0d\xe5\xcb" + "\xea\x12\x75\x0c\x75\x00\x71\xc8\xf6\xd6\x34\xfd\x18\x36\x46\x32" + "\xdb\x8e\x7d\x6d\xa8\xf7\x36\xd6\xef\xcd\xda\x26\xec\x11\x02\xfe" + "\x60\x9e\x9e\xf3\x33\x26\x9e\x2d\xec\xe5\x69\x1e\x83\xfe\x37\xea" + "\x5d\x28\xff\xd7\x27\x14\x51\x3a\xd6\xcf\xcb\xda\xce\xde\xdd\x9c" + "\xbd\x0f\xee\xb1\x1d\x7e\xcf\xc1\x7c\x70\x3e\x42\x3c\xbf\x53\x76" + "\x7e\x27\xce\x47\x15\xcf\xc7\x88\xe7\xcb\x65\xe7\xcb\x93\xc6\xe0" + "\xb8\x47\x54\x36\xb6\x01\xe4\x98\x0f\xe7\xcb\x84\x35\x11\x84\x3d" + "\x0d\xb3\xf2\xc5\x7c\x65\x4d\x8a\xa8\x3f\xb6\x00\xc6\xe0\xfc\x0e" + "\xd9\xf5\x3b\x3e\x48\x09\x27\xf7\x14\xa1\x0c\xa3\xca\xad\xdc\xbb" + "\xe2\xbb\x16\xb3\xcd\x42\xdb\xc1\x87\xca\xcb\xb3\x2a\xa2\x0c\xe8" + "\x27\x5b\x21\x46\x83\x3c\xdb\xf1\x9e\x72\x79\x4b\x6f\x90\xea\x62" + "\x97\x2d\xd0\x2d\x5a\xbe\x2a\x11\xdf\x00\x74\x7d\xb7\x4d\x83\xef" + "\xc8\xf2\xc6\xbd\x05\x96\x02\x7c\x67\x4f\x23\xbc\x1f\xbe\x0d\xe7" + "\x68\x05\x57\xd6\x39\xf2\x2a\x63\xf8\xe0\x3d\x06\xf3\xba\xbb\xc9" + "\x19\xc5\x1c\xe1\xf9\x81\x05\xa4\x66\x84\xf3\xe6\x75\x87\x31\x4d" + "\xd8\x5f\x09\xf7\x81\x11\xc6\x03\xd6\x05\x91\x03\xba\x66\x61\x4c" + "\x01\xce\x6d\x15\xc6\x4f\xbe\x27\x9c\x3d\x23\x88\xfc\x3d\xb5\x8e" + "\xdb\xc7\x5b\xb9\xbf\xf3\xf5\xc2\x5c\xe8\x0f\xb4\x55\x64\x62\x4a" + "\x10\xee\x89\xc6\x55\x42\x3f\x1d\xcf\xe3\x39\xe9\x1d\x22\xb8\xfe" + "\x0b\x61\x5e\xf4\x58\xf6\x3d\xad\x80\x7e\xf1\x81\xd6\x26\xbe\x3b" + "\x3e\x67\x32\xd6\x15\xe7\x39\x36\x29\xe6\xdc\x86\xf5\xb3\x2a\xe6" + "\x4c\x19\x52\x88\xf3\xa8\x89\xea\x8c\xe2\x81\xeb\xf9\xdc\xbd\x05" + "\xc8\x0d\xf6\x4d\x51\x4d\x34\x43\x55\x86\xef\x0f\x16\x3e\x2f\xbd" + "\x2b\xfb\x80\x46\xf6\x3e\x9d\xaa\x85\x23\x77\x42\xda\x38\x69\x3d" + "\x0c\xdc\x97\xc8\x1b\xd7\xb4\x43\xfc\x78\x2e\xcc\x60\xe2\x55\x7b" + "\x41\x17\x7b\x0b\xaa\xa6\x11\x1c\xd3\x51\xe0\xbc\xe4\x26\xc5\x43" + "\x61\x54\xbd\x37\x3b\x15\x6d\x3a\x6f\x8f\xe1\x2f\x38\xe7\x10\xe4" + "\xb8\x03\xe7\x18\x82\x2c\xdf\x80\xdf\x87\x23\xb7\x13\xdd\x83\x18" + "\x8f\x3d\xf0\xfb\xfb\x63\xa9\xfd\xc6\x39\x66\x52\xdd\xf0\x37\x72" + "\xe4\x68\x15\x51\xcd\x27\x43\xd2\xac\xd4\x21\xb4\x31\x99\x70\x51" + "\x56\x32\x04\xd7\x6a\xc2\xf5\xd9\xf1\x1d\x8d\xda\xf6\x1a\x88\x91" + "\x5e\x88\x7d\x2b\xb5\x71\xa8\x6e\x36\x81\xd8\x8a\x3d\xbf\x16\xde" + "\x3f\xb2\x09\xef\x7f\xab\x71\x2c\x5d\xf6\xde\x51\xd8\x86\x18\xca" + "\x6f\x3c\x4d\x82\x6a\xe2\x3e\x23\x51\x31\x43\xa8\xf0\xde\x51\x0a" + "\x64\xb4\x81\xee\xd7\xb0\x79\x82\x2f\x9d\x25\xa1\xb5\xc9\x56\x62" + "\x69\xaa\x22\xaf\xac\x20\xa1\xb4\x2d\x6e\x58\x75\xd5\x61\x42\xf3" + "\xc6\xcc\x79\x27\xd5\x3c\xd4\xa1\x62\x73\xb7\x42\xd2\x15\x38\x76" + "\x1a\x6c\xc4\x39\x5c\x67\x49\xf8\x93\x5f\x1a\x84\xf1\x5e\x1c\x5b" + "\xb7\xb7\xe9\x75\x9d\x6d\xfa\xb1\x1d\x6b\xf4\x63\xa4\x31\xf9\xc7" + "\x4f\x6b\xf0\x19\x44\x34\xdd\x74\x4f\x0a\xbe\xb3\x84\xb1\xa8\x5d" + "\x3d\x36\x1a\xc7\xdf\x85\xb5\x67\xd6\xe8\xc3\xf8\x45\x7a\x32\xd1" + "\x26\xbc\x13\x85\xcf\x04\x34\xc5\x0b\xb1\xae\xcd\x44\x98\x87\xa4" + "\x66\xf3\x90\xda\xf1\x79\xb8\xaa\x32\x68\x56\xbc\x8e\x74\x8c\x36" + "\x98\x2c\x29\x7f\x21\x69\xe7\xe8\x17\x42\x1f\x01\xf7\x8a\xdf\xf4" + "\xc0\x54\xaa\xae\x0c\x3a\xa8\x3f\x86\xbe\x65\x8a\xff\xfc\xf0\xa0" + "\xf0\xae\x34\xca\x06\xf4\x54\xb7\xa3\x19\xf5\xb6\xc7\xf0\xe6\x0a" + "\x1b\x37\xa3\x81\xda\x6b\x62\xff\x42\x8e\xd4\xd7\xb9\xe8\x47\xd0" + "\x27\xe4\x43\x3d\xa1\x8e\x50\x57\x4e\x3d\x1d\x13\xf4\xb4\x83\x67" + "\x7a\xea\x50\xed\xaa\x93\x74\xd5\x5e\x68\xa8\xf2\x45\x5f\xd5\x0d" + "\x9e\xf5\x05\x72\xee\xd2\xd7\xcb\xcd\x24\xd4\xd2\x04\x71\x33\xe8" + "\x6b\xc6\x03\x84\xcc\x78\x83\xf2\x35\x91\x1f\x75\xe9\xcd\x6e\xf4" + "\xa2\xb7\xaf\x9d\x7a\x03\xfd\xf7\xa4\x37\xbb\x3f\x7a\xab\x6e\x60" + "\x7a\xb3\x8b\xf3\xc7\xf4\x07\x08\xd7\xbe\x46\xcf\x15\x9c\x25\x53" + "\x50\x7f\x33\xbf\xd4\x91\x83\x73\x6b\x40\x67\x7f\x73\xd1\x1f\x9f" + "\xbb\x7f\x3b\xe8\xa0\x01\x75\x18\x98\xdd\x3d\xbc\xcd\x77\xbb\x9b" + "\xa7\x1e\xb4\xbb\xfe\xb2\xbb\xb9\xe5\x7d\xb3\xbb\x87\x63\x06\xed" + "\xee\x42\xdb\xdd\xc3\xf3\xdd\xed\xae\x2b\x6e\x58\xb1\x78\xd9\x82" + "\xf8\xc4\xf8\xc4\xdf\xe9\x16\xae\x4d\x5e\xbc\x92\x45\x0f\x2e\xf1" + "\x83\xd6\x91\x1a\xc1\xe1\x1e\xe4\xd5\x05\x75\xe4\x9d\x51\x75\x9c" + "\xe3\x2b\xad\x92\x1a\x27\x95\xf2\xc6\xc9\x3a\xdc\x8f\x1c\xed\x13" + "\xf7\x29\x3f\xa9\x78\x5c\x8b\xeb\x18\xb2\xf5\x60\x1e\x17\xf6\xb0" + "\x80\x38\x35\x12\x9f\x05\x3d\xd3\x01\xc7\x3a\xa2\x0c\x69\x27\x41" + "\xe6\x31\x78\x7e\xfe\x2a\x5c\x73\x8d\x16\xa5\x47\x16\xe3\xfe\xe1" + "\x1d\x44\xd9\xaa\xca\x9a\x93\x09\xe5\xd9\xd4\x7b\x0b\x94\x3a\x7c" + "\xb7\x25\xfa\x28\xf8\x7c\xa5\x73\x9d\xa5\xf9\x53\xe8\x25\xd1\xe3" + "\x90\x1b\xf0\x5d\xc4\x33\x8a\x47\x86\x9d\xc3\x67\x29\x10\x4f\xcf" + "\xbb\x01\xee\x35\xda\xc0\xd6\x90\x00\x9e\x60\xe7\x1f\x15\x9e\xaf" + "\x9d\x33\xee\x31\x08\x7b\xb9\xab\x2a\xeb\x5a\x8c\x95\x31\x87\x37" + "\x14\x88\x3c\xf1\xc8\xe4\x19\x05\x8c\x27\x6a\xb4\x80\xc3\x99\x80" + "\xc3\xe8\xde\x78\x42\x86\xbf\x31\xfe\xf1\x04\xe2\x0d\x71\x87\x98" + "\xbb\x0c\x30\x87\x38\x94\x70\xf7\x82\x88\xbb\x90\xe3\x44\x23\x60" + "\xcf\xce\xb0\x87\xef\x6c\xd7\xa4\x38\x71\xe7\x70\xc7\xdd\x59\x37" + "\xdc\x71\x22\xee\xd6\xb8\xe2\xee\xb1\xcf\x34\xe4\x15\x01\x77\x77" + "\x3b\x71\x97\x3b\x36\x5a\xc2\x1c\xe2\x0f\xb1\xc6\xff\x4e\x4f\x6a" + "\x9a\x9a\xbb\xf0\x57\xbc\x84\x3d\xcf\x15\xe6\x0b\x73\x74\xe7\xb9" + "\x35\x22\x5f\x9c\x96\xf8\xe2\x65\x2f\x7e\xfa\xb3\x00\xf9\xe2\x51" + "\xa1\xff\x8f\xba\xea\x00\xbd\xa1\xbe\x66\x68\x81\x27\xb4\xaf\x92" + "\x23\x73\x2f\x12\xfd\xac\xe8\x1f\xfd\xe0\x3e\xce\x50\x17\x4f\x3a" + "\x52\xf6\xa6\x23\xd4\x0f\xea\x49\xd0\x0f\xe8\x49\x7a\xe6\x8e\xcf" + "\x60\x51\x57\xa8\x9f\x9b\x36\x10\x0e\xf5\x55\xbc\x9a\x71\x04\x72" + "\x81\x30\xc7\xdb\x8d\xe3\x41\xe6\x46\xd4\x99\xd0\xcf\xce\x50\x27" + "\x6c\x1b\xe9\xdc\x23\xa7\x6d\xd3\xfc\xe8\xee\x71\xf4\xfc\x04\xe7" + "\xba\x72\xd1\xc2\xf8\x82\x79\x14\xae\x09\x1e\xbd\x83\xf5\x97\xf6" + "\xb2\xbd\x4c\x14\x8f\x1f\x12\x39\x20\x1c\xfb\xae\x42\x3f\xd5\x01" + "\xfd\x54\x15\xf4\x53\x8d\xd0\x4f\xc5\x71\x44\x61\x2d\x86\xf9\x07" + "\xd9\x33\x3e\xe8\x97\xaa\xf7\xc4\x41\x1f\x29\x1a\xe5\x2a\x3c\x4f" + "\x56\xef\xdf\x89\xcf\xbf\x68\x2e\xf4\x81\x5f\xe5\x08\xfc\x36\x1d" + "\xd4\x3b\xfc\xc4\xd4\xfc\x06\xf1\x79\xb9\x81\xad\x4d\xf8\x78\x39" + "\xab\x5f\xb4\x30\xcf\x51\x78\xd6\xc8\xf1\xa5\x8e\x67\x5c\x9f\x35" + "\xca\x9f\x45\xbf\x93\x6a\x13\x9f\x33\x3e\xde\xb5\x0e\x02\xf2\xe0" + "\x5b\xd0\xa7\x71\x3e\x6b\xfc\x08\xcf\x17\xb9\x3e\x6b\x7c\x3c\x89" + "\x08\xef\x0d\x3e\x5e\x85\xf3\x6b\xe0\x77\x26\x4b\x8f\x36\xca\xd3" + "\x9d\xcf\xf2\x59\x3a\xbe\xd3\x25\x8e\x15\x34\xb1\x71\x82\xc7\xad" + "\x52\x7f\xdc\x4b\xfc\xe4\x07\x4f\x2f\x3c\xea\xe4\xe9\x85\x47\x05" + "\xd9\x68\xcd\x29\x35\xdd\x78\x1a\xd7\xf8\x5a\x78\xf3\x6c\xe4\x69" + "\xe3\x9e\x24\x56\xbf\x27\x96\x81\x4c\x86\xe0\x3e\x77\x98\x8e\xef" + "\x3e\x21\x5f\x17\xc1\x75\x45\x02\x87\x9b\xe3\x32\x85\x39\x05\x4f" + "\xe4\xbb\x72\xf7\x82\x56\x57\xee\x7e\xe2\x60\xcf\xdc\x1d\x93\xde" + "\x33\x77\x3f\xf1\xdd\x20\x77\xf7\x37\x77\x4b\xb1\x5e\xa0\xdc\x1d" + "\x33\x73\x90\xbb\x07\x9a\xbb\x63\x22\x65\xdc\xfd\x5b\x57\xee\x5e" + "\x18\xda\x9d\xbb\x17\xea\x9d\xdc\xfd\x44\xa1\x93\xbb\x9f\x98\xeb" + "\xca\xdd\x8b\xb2\x7c\xe3\xee\x85\xe9\xe7\x97\xbb\x17\x96\xba\x72" + "\xf7\x22\x89\x87\x26\xfb\xcf\xdd\x8b\x1e\xe8\x99\xbb\x17\x3d\xe2" + "\xca\xdd\x8b\xc6\x33\x8e\x5e\x94\xc9\xb8\x7b\x51\x04\x4b\x7f\x62" + "\x92\x3c\xdd\xc9\xdd\x2c\xbd\x3b\x77\x2f\x2a\xec\x85\xbb\xf5\x0e" + "\x5e\xe2\xee\x7a\xe0\xee\x7a\x8e\xff\x9d\x37\xee\x8e\xb3\xd7\x20" + "\x77\xaf\x40\xee\x8e\xb3\xf7\xcc\xdd\x71\x5f\x23\x47\x03\x8e\x49" + "\xe1\x8b\xb4\x11\xd7\xac\x34\x2f\xf9\x0f\x8e\x61\x37\x20\x6e\xe1" + "\xfc\x5d\xb3\x37\xc8\xb9\x3d\xf6\xbe\x2e\x6e\x87\x74\xfe\x2a\x57" + "\x6e\x47\x5e\x47\x7e\x2f\x7a\x91\x5a\x8b\x5f\xa4\xc7\xdb\x36\xc5" + "\x26\x4b\x1c\x9f\x0b\x69\xb8\x37\x09\xae\xa9\x54\x74\x56\x38\x94" + "\x20\x83\x86\x67\xe0\xbe\x78\x0d\xe4\x2d\x75\xf5\x07\x71\x4a\xfb" + "\x26\xb9\x3f\x88\x3d\x86\xfe\xc0\xc8\xd6\x01\x10\xfc\x80\xbd\xc8" + "\x50\x85\xbe\x81\x9d\x5f\xb2\xb5\x67\x7f\xb0\x58\x71\xa1\xfc\x01" + "\x72\xcd\x65\xb2\x3e\xa4\x37\x7f\x80\x63\xaa\x35\xb1\x03\xe3\x0f" + "\x90\x67\x90\x5f\x90\x6b\x90\x77\x90\x67\x90\x73\xec\xe2\xbb\x7f" + "\x85\x19\x3e\xf8\x03\xe0\x15\x7a\xc9\xdc\x72\xc1\x1f\x28\x02\xf1" + "\x07\x4b\xe6\xff\xa0\xfc\x01\xea\x67\xc3\xf9\xf5\x07\x52\x3f\x1f" + "\xf5\x83\xba\x92\x74\x24\xf5\xf5\x51\x3f\xa8\x27\xd4\x0f\xc6\x46" + "\x92\x3f\x98\x90\xc2\xfc\x41\x51\xaf\xfe\x60\x49\x74\x97\x3f\xe0" + "\x98\x3f\x10\xc6\xc4\x47\xa2\x3f\x88\x1b\xd7\xdd\x1f\xc4\x4d\x71" + "\xfa\x83\xd8\x1d\x22\x3f\x36\xe0\xfa\x16\xc0\x07\xe1\xae\x3e\x21" + "\xfe\x2d\xdf\x7c\x42\xdc\xef\xbb\xf9\x04\x90\xad\x91\x3d\x3b\x43" + "\x7f\xb0\x13\xfd\x81\x1d\xfd\x42\x40\x3e\x21\xae\xdc\xe9\xb7\x62" + "\x35\x8c\x8b\xe3\xe6\xb8\xfa\x89\xf8\x02\xd1\x8f\x7d\x27\xf7\x13" + "\xfc\x10\x5f\xfc\x44\xfc\x5a\xc9\x4f\x20\x0f\xbf\x85\xcf\x2c\xba" + "\xfc\x04\xf2\x6a\x7c\xba\x79\xf5\x09\x99\x9f\x88\x9f\xcb\xea\x10" + "\xbf\xc3\x21\xf8\x89\xf8\x38\xd1\x7f\xd8\xe4\xe9\x4e\x3f\xc1\xd2" + "\x1d\x72\x3f\xd1\x88\x7e\x22\xfe\x40\x2f\x7e\x62\x92\xef\x7e\x62" + "\x79\xa1\xd3\x4f\x2c\x2f\xec\xd9\x4f\x2c\xdf\x8c\x7e\x42\x58\x93" + "\x17\x74\x0f\x38\x57\xe6\x5d\xc1\x7c\x04\x8e\xd1\x80\xef\xb0\xe2" + "\xba\x2a\x90\x6f\x55\x09\xfa\x11\x38\xe0\x7c\xa3\x11\xbf\xf3\xc2" + "\x35\xc7\x43\x6c\x24\x08\x7d\x86\xf1\x24\x51\xe2\x9e\x50\x4c\x4e" + "\x89\x1f\xc2\xb5\xf5\x4e\xff\xb2\xf4\x0d\x1f\xfd\xcb\x51\xf0\x2f" + "\x75\x6d\x9b\x96\x1e\x95\xf9\x17\xdc\x57\xab\xce\xcd\xbf\x58\xc1" + "\xbf\x34\x48\xd7\xb4\x6d\x7a\x4a\x29\xcf\x8f\xf5\x13\xf2\x9f\x14" + "\x0e\xcc\x5f\xff\x0c\xee\x11\x27\xf8\xa3\xa7\xc2\x5d\xfd\x51\xe2" + "\x36\xde\xa5\x7f\xf2\xd4\x62\xc9\x1f\xa1\x3f\xe7\xbb\xf9\xa3\x65" + "\xd7\x76\xf9\xa3\x2b\x64\xfe\x28\x45\xf2\x47\x4f\x6d\xbd\xe8\xfb" + "\x27\x7d\xe0\xbb\xf3\xed\x8f\x78\xf0\x3b\xee\xfe\x08\x7d\x94\xd4" + "\x3f\xe1\x03\xf2\x47\x09\x4d\x3f\x28\x7f\x34\x00\xfd\x13\x77\xdd" + "\x48\x3a\x43\xfd\xa0\x6e\x50\x2f\xb8\x2e\x38\xea\x0c\xf5\x85\xba" + "\x9a\x90\xe4\xea\x8b\x04\x7d\x81\x3f\xea\xf6\xec\x00\x74\x05\x32" + "\x6f\x44\x7d\xc9\xfd\x51\xf1\x48\xc9\x1f\x25\x96\x77\xf7\x47\x89" + "\x55\x4e\x7f\xf4\x94\xb0\xff\x00\x5b\x97\x71\x69\xbe\xab\x2f\x4a" + "\x9a\xe5\x9b\x2f\x5a\x7e\xad\x07\x5f\x24\xac\xaf\x69\x7c\xd1\xa5" + "\x6f\xb2\x13\xfc\x51\x00\xbe\x68\x79\x04\xab\x23\xce\x33\x5f\x1a" + "\xc3\xf8\x3e\xf1\xb8\xd3\x3f\x2d\x9d\x22\x4f\x73\xfa\xa7\xa4\x29" + "\x22\x27\x5e\xe5\xbf\x7f\x4a\x12\xae\xc1\x39\xe8\x6f\x35\x33\x1f" + "\xe0\xea\x9f\x92\xae\x75\xf5\x4f\xcb\x5b\x59\x1d\x92\x66\x32\xff" + "\x94\x24\xa6\x2f\xd5\xca\xd3\x9d\xfe\x89\xa5\x77\xf7\x4f\x49\xb1" + "\xbd\xf8\x27\x55\x67\xa1\xa1\xaa\xc3\x58\xb9\xd3\x5e\xb6\x35\x66" + "\xfc\xfc\x6b\x1c\xee\xf6\xc4\xec\xc8\xc1\xf6\x27\x92\x9e\xb7\x3d" + "\x4c\x48\xa7\x6a\x57\x1d\x2f\xbe\xab\xdd\x11\x66\x30\x9d\x4c\x00" + "\x9b\x6a\xf2\x6e\x53\x60\x4f\x41\x92\x3d\xd5\xc4\x7d\x49\xc0\xc6" + "\x38\x7c\xde\xf6\x32\xd8\x92\xa5\xb5\x5e\xb0\x2d\x55\x83\x8e\xe0" + "\x9a\x9b\xea\x26\xa2\x51\x2b\x14\x97\xdc\xff\x08\xd8\x2c\xd8\xd5" + "\xf4\x1b\x28\x7f\xe3\x71\x1d\x51\xc7\x91\x60\xb4\xad\xb7\xc5\xe7" + "\x39\xb8\xce\x06\x3e\xc7\x01\x5c\x87\x3f\xf9\x21\xb3\xa9\x97\xe1" + "\xe8\x60\x36\x35\xa6\xa3\x4d\x3f\xd6\xdb\x73\x1c\x4b\x8a\x55\x78" + "\x8e\x83\xef\x41\xe1\xfb\x67\x3c\xda\x10\x3e\xc7\x69\x67\xb1\x1d" + "\xd4\x57\x53\x22\x3c\xc7\x39\xe1\xf2\x1c\xe7\xe7\xc7\x09\x87\x6b" + "\x70\xbc\x22\x7f\x8e\xa3\xaf\xe9\x16\xd7\xa1\x7d\xa1\x3d\xf9\xcf" + "\x79\x4f\x7b\x9d\xff\x25\xcc\x9d\x00\x59\x3b\x54\x95\x3b\xe9\xcb" + "\xe6\xd2\x37\x4f\xb4\x2b\x70\xad\x53\x07\xe8\x8e\x07\x6e\xa3\x2a" + "\x37\x6e\xeb\x14\xf5\xd0\xc9\xf4\x00\x3a\x0c\x7a\xa2\x95\xd0\x27" + "\xed\x60\x3f\x9d\xe2\x7a\xa7\xed\x56\xc0\xa1\x7e\x64\xd1\x3a\x94" + "\xbb\x96\x14\x89\x6b\x9e\xf2\xeb\xe3\x86\xf1\x20\x6b\x9a\xc1\x91" + "\xb7\xce\xb6\x0b\xcf\x3d\x8d\x1d\x64\x3c\x70\x99\x1a\xb9\x0c\xb0" + "\x3b\xbc\xa4\x03\xe4\xfe\x05\x93\x3b\xae\xa9\x87\x9f\xf6\xf5\x7a" + "\x1d\x94\x3d\xb6\xb3\x13\xb8\xac\x9d\xc9\xfe\x89\xa7\x35\x44\x58" + "\x27\x15\x9f\x7d\x42\xdc\x50\x0b\xfa\x16\xb8\xac\x35\x84\xe2\x9e" + "\x21\xfc\x57\x7a\x5c\x5f\x2c\x6c\x62\x2b\xee\x0f\xa3\x47\x6c\x68" + "\x8a\x4f\xe2\xb3\xcf\xff\xb8\x3c\xfb\xb4\xad\x77\x3e\xfb\xac\xdd" + "\x7e\x8c\xcd\x55\x71\x19\x0f\x4b\x4a\xe9\x2c\x62\x3e\x47\x18\x0f" + "\x4b\xf6\x57\xf6\x2b\xbd\xae\xff\x73\xfe\x65\xaf\xf9\x81\xcb\x7e" + "\x85\xbe\x6f\xb2\x4f\xf6\x3a\xff\xf7\xfc\xcb\x3e\xe8\x07\x2e\xfb" + "\x95\x65\x7d\x93\xfd\xea\x9e\xf6\x10\x51\x61\x1f\x46\xea\xbf\x48" + "\x7d\x17\xf4\x61\xcc\x5f\xa7\x34\x3a\xfb\x2d\x29\x8d\xd2\x33\x64" + "\x90\x99\x32\x17\xd7\x07\x07\x59\x24\x2d\xc1\x3d\x38\x52\x1e\x97" + "\x9e\x1f\xe7\xe3\x3e\x33\xa8\xc7\x97\x41\x8f\x89\xf8\x1e\x93\xa8" + "\x43\xf0\x39\x4f\xb6\x82\x5f\x18\x6d\xa8\x72\xe4\x82\x4f\x7a\x6d" + "\x6b\x8c\x17\x7d\x72\xe8\x4f\xd4\xc9\x44\xf3\x44\x92\x53\xaf\xfc" + "\x7a\xd0\x67\x07\xc4\x66\xed\x8d\x04\xdf\x4d\x0e\x69\x84\xb8\xb5" + "\x33\x6e\xd8\x7c\xe8\x03\x48\x3a\x7d\x7b\x75\xbb\x10\x97\x79\xd4" + "\xe9\x4b\xae\x3a\x6d\xf1\xa0\xd3\xc7\xe3\xc1\x4e\x39\x31\x76\x16" + "\x74\x6a\xed\xd2\xa9\xe0\x47\xd6\xeb\xc3\x50\xaf\x92\x4e\xd1\x8f" + "\x08\x3a\x6d\x62\x7e\xa4\x6b\x1d\xa7\xf5\xce\xd8\xb9\x3a\xe6\x33" + "\x0f\x3a\x5d\xa5\x73\xd1\x69\x8c\xbf\x3a\x4d\xd1\xbb\xc6\x5f\x6b" + "\x7f\xef\x5b\xfc\x95\xf2\x1a\xc6\x57\xf2\xf8\x0b\x7f\xb7\x40\xbc" + "\xe5\x50\xef\x2f\x6f\x0d\xa8\xff\x9f\x52\xee\x1a\x4b\xad\x35\xb0" + "\x3a\xad\xfe\xd0\xff\x58\x6a\xad\xb0\x27\xd1\x5b\x2f\x7b\x8a\xa3" + "\xd6\xc6\xbb\xc6\x51\x6b\xa7\xb2\x78\x69\xed\xb6\x96\x0c\x8c\xa3" + "\xd6\xce\x61\xe9\xab\xeb\xe4\xe9\xce\x38\x8a\xa5\xb7\xe0\x5a\x77" + "\x9b\xd6\x96\xfa\x17\x3b\x5d\x79\x81\x63\x27\x6d\x0f\xb1\x93\xf6" + "\x47\x12\x3b\xad\xf7\xba\x47\xd5\xa0\xff\xee\xcd\x87\xac\x2d\xef" + "\x9b\x0f\xd9\x50\x30\xe8\xbf\x03\x95\xfd\xfa\xd8\xbe\xc9\x3e\x35" + "\x34\x70\xff\x6d\xd8\xee\xf4\xdf\x86\xed\xde\xfd\xb7\x61\xf4\xa0" + "\xff\xf6\xc7\x7f\x6f\xb0\xf6\xcd\x7f\xa7\x35\xba\xfa\xef\xf4\x79" + "\xbe\xf9\x6f\xc3\xe2\xfe\xf7\xdf\x86\x64\x57\xff\x9d\x1e\xc1\xea" + "\x94\xba\xd5\x7f\xff\x9d\x7e\xad\x77\xff\x9d\x7e\x83\xab\xff\x36" + "\xd8\x99\x9f\x4e\x9f\xcb\xfc\x77\xba\x86\xa5\xa7\xe6\xcb\xd3\x9d" + "\xfe\x9b\xa5\x33\xff\x9d\x1e\xe3\x9f\xff\x0e\xb9\xc0\xfe\x5b\xd3" + "\x83\xff\xd6\xfc\x48\xfc\x77\xc6\xf1\x41\x1f\x12\xa8\x0f\x49\x4f" + "\xee\x9b\x0f\xc9\x8c\x0e\xdc\x87\x6c\x6a\x72\xfa\x90\x4d\x4d\xde" + "\x7d\xc8\xa6\x05\x83\x3e\xc4\x1f\x1f\xf2\xcc\xb8\xbe\xf9\x90\x4d" + "\xe3\x5d\x7d\xc8\xb3\x2f\xf9\xe6\x43\x36\xbd\xd1\xff\x3e\x64\x93" + "\xc9\xd5\x87\x3c\x2b\xae\x8d\x94\x79\xcc\x7f\x1f\xf2\xec\x62\xef" + "\x3e\xe4\xd9\x65\xae\x3e\xe4\xd9\x08\xe6\x2b\x9e\x2d\x60\x3e\xe4" + "\xd9\xb9\x2c\x3d\xf3\xa8\x3c\xdd\xe9\x43\x58\x3a\xf3\x21\xcf\x96" + "\xf9\xe7\x43\x2e\xbd\xc0\x3e\x24\xa8\x07\x1f\x12\xf4\x23\xf1\x21" + "\x9b\x75\x81\xf3\xd8\x73\xe5\x4e\x1e\x7b\xae\xdc\x3b\x8f\x3d\x77" + "\xc3\x20\x8f\xf9\xc3\x63\xcf\x9a\xfa\xc6\x63\x39\xad\xae\x3c\x66" + "\x5c\xe0\x1b\x8f\x3d\xf7\x74\xff\xf3\xd8\x73\x06\x57\x1e\x33\xce" + "\x64\x75\xda\x5c\xe4\x3f\x8f\x19\x27\x78\xe7\x31\xe3\x64\x57\x1e" + "\x33\x06\x31\xbe\x32\xc6\x30\x1e\x33\x86\xb1\xf4\xcd\x85\xf2\x74" + "\x27\x8f\xb1\x74\xc6\x63\xc6\x84\xde\x78\x0c\xed\xa2\x46\xeb\x66" + "\x17\x4f\x49\x76\x91\x77\xfc\x48\xa1\x64\x17\x79\x42\x8c\xc6\x17" + "\xa6\x47\x3e\xb7\x9a\x28\x8d\xb8\x3f\x0f\x70\x44\xd2\xa3\x68\x17" + "\x79\x0f\xe0\x3c\x11\xd5\x71\xe0\xbd\x06\x91\x07\x53\x80\x07\x1b" + "\xe0\x37\xae\xd9\x36\x3a\x3d\x12\xf9\x0b\xf7\xf3\xc0\xdf\x8c\x0f" + "\x6d\x43\x71\x7f\x20\xe1\xd9\xbc\xcc\x6e\x04\x5b\x69\x11\x6d\xa5" + "\x85\xd9\x8a\xf4\xee\xde\x86\x06\xca\x3b\x56\xea\x47\x46\xc5\x0e" + "\xa1\x68\x3f\xc2\x3b\x61\x60\x3f\x74\xa5\x3e\xb8\x70\x05\xd8\x8c" + "\xad\x91\xe0\xba\xfc\x68\x33\xea\x74\x45\x30\x6d\x89\x1b\x06\x9c" + "\xc8\xb8\x8f\xaf\x1a\x6a\xc7\x35\xb6\x56\x02\xf7\x35\x03\xf7\x35" + "\x3b\x6d\x05\x9f\xb7\xb7\xac\xd4\xeb\x5a\x57\xea\xc7\x74\xb6\x00" + "\xf7\xd9\xba\xd9\x89\xb2\xa4\x19\xb9\xaf\x51\xb0\x13\x81\xfb\xc0" + "\x36\xf8\x16\xe0\xbe\xdf\x89\xdc\xd7\xa2\x47\xae\xd7\x94\x2c\x01" + "\xee\x8b\x39\xc5\xb8\x4f\x8c\xe1\xae\x43\xee\x5b\xa9\xe7\x5e\x68" + "\x16\xb9\x6f\x01\x72\xdf\x41\xb0\x91\xbd\xae\xdc\xa7\x0e\x94\xfb" + "\xf2\xc2\x5c\xed\x64\xcb\x66\xdf\xec\x24\xef\x25\x6f\x76\xd2\x99" + "\x1b\xa8\x9d\xe4\x6d\x77\xb5\x93\x2d\xc9\xa2\xed\xee\xf2\xdf\x4e" + "\xb6\xcc\xeb\xb2\x93\xa7\xdc\xed\x64\xcb\xe3\xae\x76\xb2\x25\x9c" + "\xd9\xc3\x96\x6c\x66\x27\x5b\xa6\x89\xf6\x53\x2e\x4f\x77\xda\x09" + "\x4b\x67\x76\xb2\x65\xdb\xe0\xf3\xf2\x1f\x9a\xbf\xdf\xaa\x19\x7c" + "\x5e\x1e\x68\x9f\x71\xcb\xf6\xbe\xf5\x19\x9f\xf7\xba\xfe\xcd\xe0" + "\x78\x7b\x6f\xb2\xdf\x1a\xdd\x37\xd9\x6f\x0b\x1a\x1c\x2b\x09\x54" + "\xf6\xcf\x1f\xed\x9b\xec\x7f\x9f\xd9\x5b\x1f\xc3\x7b\x2c\x55\x10" + "\x5e\xdd\xd5\xc7\x28\x08\x97\xe6\xf9\x76\xef\x63\xfc\xe1\x35\xd7" + "\xf7\xf8\x5e\x9c\xec\xfe\x1e\x5f\x6f\x7d\x0f\xfb\x60\xdf\x03\x74" + "\xbd\x6d\x4e\xdf\xfa\x1e\x7f\x48\x72\x8d\xa9\x0a\x3e\xf3\x2d\xa6" + "\xfa\xc3\x69\x6f\x31\x95\x3d\xe0\xbe\xc7\x1f\xec\xae\x31\x55\x41" + "\x95\x88\x0d\x85\xff\x31\x55\xc1\x1b\xde\x63\xaa\x82\xbf\xba\xc6" + "\x54\x05\x99\x2c\x76\x2a\x38\xce\x62\xaa\x82\x02\x96\xfe\x22\x91" + "\xa7\x3b\x63\x2a\x96\xce\x62\xaa\x82\xc6\xc1\xe7\xe8\x3f\xb4\x98" + "\xea\xe5\xd8\x41\xbf\x1e\xa8\x6f\x29\xb0\xf7\xcd\xb7\xbc\x72\x01" + "\xe7\x7f\xfe\xd0\xfd\xfa\xcb\x3b\xfa\x26\xfb\xa2\x1e\xe7\x7f\xf6" + "\xec\xd7\x4b\x83\x9c\x7e\xbd\x34\xc8\xbb\x5f\x2f\xd9\xe8\xea\xd7" + "\x8b\xd5\x83\x7e\x3d\x10\xbf\x5e\xa8\xef\x9b\x5f\x2f\x89\x74\xf5" + "\xeb\xa5\xbb\x7c\xf3\xeb\x25\x07\xfb\xdf\xaf\x97\x1c\x75\xf5\xeb" + "\xa5\xa5\xac\x4e\x45\x9f\xf8\xef\xd7\x4b\xd3\xbd\xfb\xf5\xd2\xcd" + "\xae\x7e\xbd\x74\x3e\xf3\xdf\xa5\xe5\xcc\xaf\x97\x26\xb1\xf4\xa2" + "\x7a\x79\xba\xd3\xaf\xb3\x74\xe6\xd7\x4b\xcd\x83\xcf\xd7\x7f\x68" + "\x7e\xfd\xd5\xa9\x83\xbe\x25\x50\xdf\x52\xda\xc7\x3e\xe3\x9f\x4c" + "\x81\xfb\x96\xd7\x63\x9d\xbe\xe5\xf5\x58\xef\xbe\xe5\xb5\x4f\x5c" + "\x7d\x4b\x59\xfc\xa0\x6f\x09\xc4\xb7\xbc\x9a\xd9\x37\xdf\xf2\x5a" + "\x99\xab\x6f\xf9\xf3\x08\xdf\x7c\xcb\xeb\xd7\xf6\xbf\x6f\x79\x3d" + "\xdc\xd5\xb7\xbc\x6e\x17\xb1\x31\xd9\x7f\xdf\xf2\xfa\x67\xde\x7d" + "\xcb\xeb\x5f\xba\xfa\x96\xd7\x4d\xcc\x87\xfc\x59\xc3\x7c\xcb\xeb" + "\xd5\x2c\xbd\x6c\x92\x3c\xdd\xe9\x5b\x58\x3a\xf3\x2d\x7f\x0e\x1b" + "\x7c\xee\xfe\x43\xf3\x2d\xdb\x7b\x9c\xff\xdb\x33\xbf\xbd\x39\xcd" + "\xc9\x6f\x6f\x4e\xf3\xce\x6f\x7f\xd9\xe3\xca\x6f\x6f\xdc\x37\xc8" + "\x6f\x81\xf0\xdb\x9f\xc3\xfb\xc6\x6f\x7f\xc9\x74\xe5\xb7\x37\xbf" + "\xf3\x8d\xdf\xde\x54\xf4\x3f\xbf\xbd\xa9\x71\xe5\xb7\x37\x8f\x8b" + "\xd8\xb8\xdc\x7f\x7e\x7b\xf3\x5d\xef\xfc\xf6\xe6\x41\x57\x7e\x7b" + "\xb3\x80\xf1\xd8\x9b\x36\xc6\x6f\x6f\xee\x60\xe9\x6f\x84\xca\xd3" + "\x9d\xfc\xc6\xd2\x19\xbf\xbd\x69\xef\xdb\xf3\xf8\xb7\x33\x9d\xcf" + "\xe3\xdf\x16\x74\xc1\x17\x98\x53\xba\x3f\x8f\x7f\xeb\x9c\xeb\x7a" + "\x41\x3b\x36\x0a\xcf\xe6\xd1\x66\x5a\xd9\x9a\x0e\x1e\x9f\xd3\x5f" + "\x65\x4e\x19\x7c\x4e\x7f\x3e\x9f\xd3\xbf\x75\xc0\xd5\x7e\xde\xb9" + "\xd9\x37\xfb\x79\xfb\xae\xfe\x7f\x4e\xff\xb6\xdb\x3a\x2c\xef\x84" + "\x89\x58\x99\xee\xbf\xfd\xbc\xed\xf0\x6e\x3f\xef\x0c\x75\xb5\x9f" + "\xb7\xc5\x3e\xe6\x3b\xe1\xcc\x7e\xde\x6e\x62\xe9\x3b\xa6\xc9\xd3" + "\x9d\xf6\xc3\xd2\x99\xfd\xbc\x33\xd5\x97\xf8\xc0\xae\xaa\x2c\x47" + "\x7f\x3f\xfe\xf8\x35\x8e\x2e\x9c\x27\x8b\x38\xf7\x14\x1f\x2c\x64" + "\xfe\x42\x88\x0d\xca\xb6\xc6\xf6\x1a\x1f\x34\x88\xf1\x41\x6c\xf7" + "\xf8\x40\x8a\x0d\x0a\x01\xdf\x2f\xfb\xf4\x8c\x5e\xc4\x3b\xc6\x06" + "\x67\xfd\x8d\x0d\xa6\x39\x63\x83\x5c\xb7\xd8\xe0\x77\x6e\xb1\x81" + "\x80\xf7\x13\x2e\x78\xef\x16\x1b\x74\xe1\xbd\xbf\x62\x83\x9d\x5e" + "\xf7\x7f\x1a\x7c\x46\xdf\x5b\xbf\xf3\x9d\x39\x7d\xeb\x77\xfe\xcd" + "\xeb\xfe\x47\x83\x63\xf9\xbd\xc9\x7e\x67\x1f\xc7\xf2\xff\xbe\x63" + "\x70\xbc\x25\x50\xd9\xff\xad\x8f\x6b\x39\xec\xd2\x07\xde\x1f\xa9" + "\x68\x75\xf6\x47\x2a\x5a\xa5\xf8\x0a\x79\x57\x58\x33\x0b\xb8\x36" + "\x77\x05\x1c\x67\x09\x79\x6e\x85\xb0\xe7\x41\x90\xa5\xe1\x18\xee" + "\x01\x07\x31\x57\x45\x7c\x54\x8a\x3c\xe6\xda\x75\x5a\x8a\xb7\xa2" + "\x30\x16\x83\xd8\x0a\xe3\x2a\xa9\x0f\x92\xdf\xdc\xcb\xfc\xe1\xeb" + "\xb7\xc6\x62\x9f\xa5\x53\x5d\x59\xfe\xe3\xed\xaf\xfc\xbd\xb5\x6f" + "\xfd\x95\x8a\x49\xae\xf1\x96\xe9\x8f\xbe\xc5\x5b\x15\x7f\xed\xff" + "\xfe\x4a\x85\xd9\x35\xde\x32\x19\x45\x9c\xbc\xe6\x7f\xbc\x65\x5a" + "\xe6\x3d\xde\x32\xad\x72\x8d\xb7\x4c\x91\x2c\xae\x32\x95\xb2\x78" + "\xcb\x34\x9f\xa5\xef\x2a\x93\xa7\x3b\xe3\x2d\x96\xce\xe2\x2d\xd3" + "\x0e\x1f\xe3\x2d\x53\x1f\xe2\xad\xb8\x1f\x4e\xbc\x35\xfd\x22\x8f" + "\xb7\xf6\x7a\xdd\xff\x5c\xe6\x77\xca\xdd\xfc\x4e\xec\xa0\xdf\x41" + "\xae\x31\x99\xfb\xe6\x77\xfe\xaf\xb4\x57\xd9\x1b\x65\xb2\x47\xce" + "\x17\xe5\xee\x18\xb7\x35\x36\x60\xd9\x03\xd7\x17\xa5\xfe\x90\xe5" + "\xbe\x37\xa1\x6f\x72\x7f\x57\x3b\x18\x6b\x05\x2a\xfb\xff\x6b\xec" + "\x9b\xec\xf7\x6f\x0b\x3c\xd6\x7a\xcf\x70\xa4\x2b\xd6\x7a\xcf\xe0" + "\x1e\x6b\x61\x6c\x35\xab\x9d\xc5\x5c\xcf\x41\xac\x94\x93\x08\x71" + "\xd7\x6a\x42\x2c\x0d\xef\x12\x23\xc4\x5e\x39\x67\x20\xfe\x4a\x80" + "\xf8\xcb\xfe\x9a\x18\x7f\x99\xbf\x77\x8d\xbf\x2a\x97\x79\x8c\xbf" + "\xd4\xce\xf8\xcb\x0e\xb1\x55\xe7\x6b\x5b\x63\xf3\xcf\xc8\x62\xb1" + "\xa5\xdd\x63\xb1\x8e\xdc\x4a\x53\xc7\xf5\x5b\xe3\x3a\x21\x1e\xeb" + "\x29\x16\x13\x30\xe1\x21\x1e\xfb\xdf\x88\xc5\xde\x8d\xe9\x5b\x2c" + "\x66\x36\xbb\xc6\x62\xef\x4f\xf0\x2d\x16\x7b\xef\x76\xaf\x63\x5f" + "\x01\xc7\x62\xef\xcd\x74\x8d\xc5\xde\xd7\x8a\x98\x19\xe1\x7f\x2c" + "\xf6\xde\x39\xef\xb1\xd8\xfb\x0a\xd7\x58\xec\x3d\xf1\xdd\xd3\xf7" + "\xc7\xb3\x58\xec\xbd\x46\x96\x5e\xa9\x91\xa7\x3b\x63\x31\x96\xce" + "\x62\xb1\xf7\xa7\xf8\xf8\x6c\xac\xdc\x0e\x3e\xfd\xc2\xcf\xa7\xec" + "\xe9\xd9\x58\x7f\xcd\xa7\x9c\x76\x91\x3f\x1b\xfb\xa0\xf7\xf1\xaf" + "\xc1\x98\xc0\x03\xd7\xbc\x3f\xb3\x6f\x7e\xe9\xe0\xf8\xc1\x98\x20" + "\x50\xd9\x7f\xd0\xc7\xb1\xaf\x7f\x6c\x0f\x3c\x26\x38\x94\xec\x1c" + "\x7f\x39\x94\xec\xdf\xf8\x4b\xd5\xd7\xae\xfe\xff\x9f\x9e\xfd\xff" + "\xe0\xf8\x8b\x1f\x3e\xff\x60\x72\xdf\x7c\x7e\x55\xb9\xab\xcf\x3f" + "\x7c\xad\x6f\x3e\xff\xd0\xcd\xfd\x3f\xfe\x72\x28\xc2\xd5\xe7\x1f" + "\x56\x89\x38\xb9\xde\x7f\x9f\x7f\xe8\xb4\x77\x9f\x7f\xe8\x7b\x57" + "\x9f\x7f\xa8\x8a\xf9\xf6\xc3\x3a\xe6\xf3\x0f\x1d\x67\xe9\xff\x1c" + "\x27\x4f\x77\xfa\x7c\x96\xce\x7c\xfe\xe1\xf1\xfe\x3d\xef\x0a\xb9" + "\x48\x9f\x77\x69\x7e\x24\xcf\xbb\x8e\x94\x0d\xfa\x9d\x40\xfd\xce" + "\xe1\x88\xbe\xf9\x9d\x1a\x5d\xe0\x7e\xc7\xd2\xe4\xf4\x3b\x96\x26" + "\xff\xfc\x8e\x65\x81\xab\xdf\xa9\xf9\x72\xd0\xef\xf4\xd5\xef\x1c" + "\x69\xea\x9b\xdf\xb1\xb8\xad\x7f\x54\xe7\xe3\xfa\x47\x16\xaf\xeb" + "\x1f\x05\xee\x77\x2c\x6e\xeb\x1f\xd5\x89\xeb\x1f\xd5\x04\xb0\x6e" + "\x48\xdd\x62\xef\x7e\xa7\xce\x6d\xfd\xa3\xba\x08\xe6\x5f\xea\xc4" + "\xf5\x8f\xea\xc4\xf5\x8f\x6a\x0a\xe5\xe9\x4e\xbf\x53\x23\x5b\x37" + "\xa4\x6e\x70\xfd\xa3\x1f\xdc\x3c\xcc\x8f\xfa\xc0\x7f\x47\xab\x9d" + "\xfc\x77\xb4\xda\xfb\x3c\xcc\xa3\x77\xb9\xce\xc3\xfc\xe8\xc3\xc1" + "\x79\x98\x81\xf0\x5b\x5d\x1f\xd7\x45\x3a\xaa\x72\xe5\xb7\x63\x6b" + "\x7d\xe3\xb7\xa3\x9b\xfb\x9f\xdf\x8e\x16\xb8\xf2\xdb\xb1\x58\x11" + "\x1b\x01\xf0\xdb\xb1\xe9\xde\xf9\xed\xd8\x2c\x57\x7e\x3b\xa6\x63" + "\x3c\x76\x2c\x85\xf1\xdb\xb1\x49\x2c\xfd\xa3\x42\x79\xba\x93\xdf" + "\x3e\x92\xf1\xdb\xb1\x4c\xff\x9e\x6b\x06\x14\x57\x0f\xc0\x73\xcd" + "\xfe\x8a\xab\x2f\xf6\xe7\x9a\xff\xb6\x0f\x8e\xa3\x05\x12\x53\x1f" + "\x2b\xe8\x5b\x4c\x5d\x9f\x1c\xb8\x4f\xf9\x34\xda\xe9\x53\x3e\x8d" + "\xf6\xf6\x7c\x27\x07\x70\x67\x84\x98\x78\xf3\x19\xa2\x7c\x0e\x9f" + "\xef\x1c\xad\x21\xb9\xf8\x7c\x27\x51\x7a\xbe\x53\x24\xc6\xd9\xff" + "\xa9\x71\x8d\xb3\x3f\x99\xe5\x29\xce\xc6\xf8\xda\x01\xb1\xb3\xdd" + "\xfd\xb9\xce\xa3\x9e\x7d\x51\x87\xba\xd2\x74\xee\xb5\xad\x71\xfe" + "\xfa\xa2\x57\xd6\x31\x5f\xf4\xf2\x0f\xde\x17\x7d\x3c\xad\x6f\xbe" + "\xe8\x3f\x05\xae\xbe\xe8\xf8\x50\xdf\x7c\xd1\xa7\x97\xf7\xbf\x2f" + "\xfa\x74\x9c\xab\x2f\xfa\xd4\xc6\xea\x54\x1f\xc0\xde\x92\x9f\x7e" + "\xe8\xdd\x17\x7d\xfa\x89\xab\x2f\xfa\x74\x07\xf3\x39\xc7\x95\xcc" + "\x17\x7d\x6a\x66\xe9\xf5\x36\x79\xba\xd3\x17\xb1\x74\xe6\x8b\x8e" + "\x6b\xfc\x1b\xe3\xb9\xf4\x22\x1d\xe3\x09\xfa\x91\x8c\xf1\x7c\x96" + "\x1d\x38\x27\x5a\x67\x56\x77\xbd\xbf\x61\x9d\xd9\x6d\x9c\x61\x35" + "\xc4\xdb\xcd\xec\x39\x77\xd7\x38\x83\xf5\x33\x91\xff\x3e\x7f\xcf" + "\x95\xff\xfe\x9f\x57\xfe\xeb\xe9\x59\x36\x8e\x2b\x38\x80\x1b\x71" + "\x8f\xcc\x80\x9f\x65\xaf\xfe\xa1\x73\xde\xf1\x3e\xae\xaf\xfc\xb9" + "\xd1\x95\xf3\xac\xe7\x7c\xe3\x3c\xeb\x30\xaf\x9c\x17\xf0\x7b\x1c" + "\x56\xad\x2b\xe7\x59\x1b\x44\x7c\x0c\xf5\x9f\xf3\xac\x07\xbd\x73" + "\x9e\xb5\xc6\x95\xf3\xac\xa5\x8c\xdb\xac\xed\x8c\xf3\xac\xe5\x2c" + "\xfd\xff\x29\xe5\xe9\x4e\xce\x63\xe9\x8c\xf3\xbe\x50\xf6\xc4\x79" + "\xd4\x98\x65\xca\xe7\xf8\x9d\x70\x98\xa0\x8e\x57\x01\x36\xcc\xf0" + "\xbd\x0a\x74\x3c\x12\xbe\xd7\x79\xb3\x3f\x9b\x3a\xcb\xc4\x67\x40" + "\x9d\x39\xa2\xb0\xd8\xbe\x35\x9b\x47\xd9\xe1\xbe\x5f\x88\xef\xac" + "\x65\x99\x42\xec\x97\x46\xf2\x34\x8e\x80\x5e\x4c\xc2\xfe\x99\x90" + "\x1f\xdf\x0f\xd2\xad\x26\xc1\x67\x14\x5f\x94\x49\xf9\xa0\xbe\xc1" + "\x27\x14\x5f\x2c\xc0\x32\xa0\xae\x3b\xad\x8a\x2f\x34\x5e\xeb\x0a" + "\x65\x45\xbd\x31\x86\x6c\xb4\xd3\xaf\xcc\x89\xcd\xa4\x41\xf1\xc5" + "\xb9\x90\xa6\x4b\x23\x69\x5a\x34\xc1\x58\x6e\xe7\x28\x9b\x12\xcb" + "\x34\x27\x76\xe0\xb9\xe3\x78\xce\x01\x75\x4c\x5d\x46\xb8\xbc\xe6" + "\x4b\x83\x80\x27\x86\xa6\xb5\xd2\xc6\xe5\x76\xa8\x33\x60\xb3\x72" + "\x4c\xbd\xf2\x9d\x97\x21\xcd\x41\xb4\xb8\x9f\x29\x96\x01\xf1\x2c" + "\xd6\xc7\x51\x0c\xf9\x3d\xd5\x21\xeb\x6d\x32\x7e\xe8\x0d\xd4\xea" + "\x1f\x6e\x4e\xcc\xf1\x26\xc7\x90\xf4\x31\xc4\x7c\x23\xc8\x4e\x47" + "\x38\x4f\xe7\xfd\xbc\x4f\x4f\xef\xbf\x07\xe1\x1e\xc9\x69\x2f\x11" + "\x6e\x0b\x7f\x69\xd0\x07\x1b\x84\x3d\x8a\x6d\x6d\x9b\xfe\x3b\xce" + "\xaa\xf8\x4d\x2b\xca\x1c\xf7\xb5\xc4\xfd\xb5\x01\x37\x04\xd2\xa7" + "\xbe\x97\x42\x88\xbb\x2e\x56\xc4\x2e\x5b\xa0\x4b\x8e\x5f\xb6\x78" + "\xf9\xaa\x64\xdd\xf5\xb1\xc3\xc9\xdc\xe5\xcb\x75\xcb\x16\x24\xae" + "\xd5\xc9\xcf\xfc\x4a\x17\x1b\xbf\x72\xc1\xc2\x84\xc5\x13\x96\x2d" + "\x4a\x1a\x0e\x75\x22\xb2\x7a\x84\x62\x5d\xf8\x4d\xff\x8d\x2c\x7e" + "\x9e\x90\x17\x46\x12\x25\xd6\x0b\xee\xb7\x43\xda\xf7\x34\xef\x45" + "\xda\xca\x41\x9e\x34\xe0\xc7\x2d\xa9\x97\x42\xde\x13\xa6\x12\xa8" + "\x57\x31\xd4\x1b\xea\x88\x75\xae\x97\xea\x2c\x61\x22\x0d\x31\x91" + "\xda\x0c\x18\xfc\xef\xb9\x90\xf6\x4b\xef\xa5\x34\x1a\xdb\xd7\x0a" + "\x76\xa2\x38\xa9\x68\xb8\x4f\xf0\x65\xb9\x59\xa6\xb6\x4d\x0d\xa1" + "\x12\xc6\xf0\x5a\x9a\x97\x65\x68\x43\x3b\xa1\x71\x77\x30\x9b\x6a" + "\x68\x9a\xa7\x57\x10\xb6\xef\x6a\x43\x84\x73\xdf\xd5\x06\x61\xac" + "\x1a\xea\xd1\x04\xe9\xd1\x56\x85\x76\x2a\xa6\xe3\x7e\xc1\xb8\x7f" + "\x37\xd6\x19\xda\x05\xbe\x94\x9a\x69\x86\x88\xfd\xec\x8f\xad\x7c" + "\x76\xfb\x1c\x8b\xf2\x2c\x89\xb2\xd3\x4e\xba\xf9\x63\x6b\x6d\x6b" + "\x2b\x09\x49\x4f\x5a\x44\x2f\xf9\xef\x23\x21\xf6\xf8\xc5\x25\x23" + "\xc1\x86\x36\xb7\xcf\xa1\x9b\xbf\x33\xcd\xbb\x81\x68\xa0\x6c\xf9" + "\xfe\xaf\x4a\xff\xf4\xdf\x20\xe8\x1f\xf5\x08\xf5\x11\xf5\xf8\xa5" + "\xf2\xbd\xe4\xee\x7a\xec\xc2\xdf\x1b\x3c\x39\x08\x58\xa0\xaa\xdd" + "\x24\xca\xc1\xe4\x88\xb6\xdb\x92\x16\x47\x26\x0a\xb2\xfb\x72\x1f" + "\x9f\xb7\xcb\xca\x1b\x77\x6b\xa9\x71\xb7\x12\x64\x56\x90\xb7\x9a" + "\xe8\x9e\x74\x68\x48\xee\x59\x12\x6e\xcb\xdd\x4d\xd4\x0a\x83\x02" + "\xe2\x11\x0e\xfc\x49\x38\x70\x46\xb8\x68\xef\x05\x28\xc7\x7f\x82" + "\xd4\x66\xaf\x24\xe4\xab\xa9\x64\x48\x31\x5c\xe7\x5f\x7b\xbe\x14" + "\xfc\x3f\xdd\xf4\x65\x44\x09\x5c\x8b\xfb\xfa\xfa\x79\x7d\x95\x57" + "\xbb\x73\xb6\xdb\xe0\xb9\xdd\x27\xcb\xf9\xbc\xdd\x31\xd0\xee\x02" + "\x68\x77\xa6\x87\x76\x1b\x58\xbb\x87\x36\xf7\x7f\xbb\x4f\x1a\x58" + "\xbb\x4f\x4e\x09\xac\xdd\x27\xcd\xbd\xb7\xbb\xc2\x8b\xbe\xbf\xda" + "\x01\xed\x06\x7d\x57\x80\xbe\x2b\x3c\xe8\xbb\x42\xd4\xf7\x65\x27" + "\xfa\xbf\xdd\x5f\xa5\xb0\x76\x7f\x15\x1e\x58\xbb\xbf\xf2\xca\x7f" + "\xb2\x76\x7b\xd1\x77\x63\x19\x9f\x57\x01\xfa\xae\x00\x7d\x57\x78" + "\xd0\x77\x85\xa8\xef\x11\x1f\xf5\x7f\xbb\x1b\xd9\xfa\x87\x9b\x1a" + "\xf5\x81\xb5\xbb\x71\x67\xef\xed\x36\x79\xd1\xf7\xd7\x85\xd0\x6e" + "\xd0\xb7\x09\xf4\x6d\xf2\xa0\x6f\x93\xa8\xef\x5b\x73\xfa\xbf\xdd" + "\x5f\xc7\xb1\x76\x7f\xad\x0b\xac\xdd\x5f\x7b\x9d\xff\x22\x6b\xb7" + "\x17\x7d\x9f\xda\xc6\xe7\x99\x40\xdf\x26\xd0\xb7\xc9\x83\xbe\x4d" + "\xa2\xbe\x1f\xbb\xbb\xff\xdb\x7d\x2a\x86\xb5\xfb\x94\x36\xb0\x76" + "\x9f\xf2\x3a\xff\x5d\xc6\x6b\x41\xc0\x5d\xdd\x74\x6e\x49\x99\x42" + "\x6e\x3a\x8b\xed\x6f\x52\x52\xf5\xee\xa0\xcb\xd2\x0d\x0a\xbb\x6a" + "\xb7\xea\x32\xe8\xcb\xbd\x92\xc1\xc7\x85\x58\xc9\x30\x68\x6b\x1c" + "\xcd\xdb\x5b\x8a\x9f\x3c\x94\x63\x07\xee\x77\xa8\x76\x2b\x3b\x8c" + "\x59\x05\xcf\x2d\x21\xba\x34\x1b\xd1\xd4\xa6\x5a\x49\x6a\x12\xb5" + "\xd5\x92\x2f\x88\xda\x4a\x38\x1c\x2f\x3b\xd2\x64\x22\x89\x2b\x28" + "\x3d\xa9\xf8\xe6\x34\xf6\x31\xf3\x4e\x92\x70\x88\x89\x0d\x14\xfc" + "\x47\x3e\x4f\x74\x50\x7e\x38\xca\x12\xca\x7e\x35\x64\x2e\x51\xec" + "\x5f\xd8\x4e\x50\x9e\x28\x5b\xe8\x8f\x86\x0b\x72\x6d\x25\xe4\xfe" + "\xc7\x98\x5c\x5f\x59\xe2\xaf\x5c\xbf\x61\xcf\xff\x8c\xbb\x75\x16" + "\x6b\x07\x81\xd8\x52\x83\xef\xdc\x43\x7a\x72\x6d\x52\x33\xf4\x45" + "\xbe\xd1\xd2\xdc\xdd\x1a\x1e\x7c\x96\x7f\xe5\x36\x79\x5d\xff\x5a" + "\x26\xef\x6c\x90\x77\x37\xac\x39\xe5\x7d\x3a\x19\xe4\x9d\x2d\xca" + "\xdb\x78\xd9\xf1\xa1\xcd\x5e\xe4\x9d\x0d\xf2\x2e\x00\x79\x67\xfa" + "\x2e\xef\xd3\x8f\xbb\xca\x7b\x77\xcc\xc0\xc8\xfb\xb4\xb8\xff\xe9" + "\xee\x52\x57\x79\x37\x35\x30\x79\x37\x65\x83\xbc\xf3\x41\xde\x06" + "\x3f\xcb\x35\xf8\xc0\xe3\x80\xef\xee\x3e\xcc\x29\xef\x33\x0d\x54" + "\x5d\x21\xe2\xbb\x02\xf0\x7d\xd9\x09\xcf\xf2\xae\x00\x7c\x57\x00" + "\xbe\x2b\xfc\xc0\xf7\x99\x1a\x37\x79\x0f\x10\xbe\xcf\x88\xe3\x7f" + "\x15\x6e\xf8\x3e\x33\x97\xc9\xfb\x74\x3b\xcd\xad\x00\x7c\x57\xf8" + "\x89\xef\x33\x36\x1f\xe4\x0d\xf8\xee\xee\x3b\x9d\xf2\xb6\xcd\x05" + "\x79\x8b\xf8\xae\x00\x7c\x8f\xf8\xc8\x8b\xbc\x01\xdf\x15\x80\xef" + "\x0a\x3f\xf0\x6d\xbb\xdd\x55\xde\x15\x03\x84\x6f\x5b\x90\x28\x6f" + "\x37\x7c\x7f\x7b\x80\xc9\xfb\xdb\x38\x90\x37\xe0\xbb\xc2\x4f\x7c" + "\xdb\x62\x7c\xf0\x5b\x80\xef\xee\x3e\xdb\x29\xef\xef\x0e\x50\xb5" + "\x49\xc4\xb7\x09\xf0\x7d\x6b\x8e\x67\x79\x9b\x00\xdf\x26\xc0\xb7" + "\xc9\x0f\x7c\x7f\xf7\x96\x9b\xbc\x07\x08\xdf\xdf\xb1\xf8\xcf\x68" + "\x72\xc3\xf7\x77\x93\x98\xbc\x6d\xf5\x34\xd7\x04\xf8\x36\xf9\x89" + "\xef\xef\xbc\x8e\x63\xc8\xe4\x0d\xf8\xee\x1e\x2b\x38\xe5\xdd\x32" + "\x09\xe4\x2d\xe2\xdb\x04\xf8\x7e\xec\x6e\x2f\xf2\x06\x7c\x9b\x00" + "\xdf\x26\x3f\xf0\xdd\x32\xda\x55\xde\xa6\x01\xc2\x77\xb3\xb8\xff" + "\xa5\xc9\x0d\xdf\xcd\x65\x4c\xde\xcd\x91\x20\x6f\xc0\xb7\xc9\x4f" + "\x7c\xb7\x44\x04\x12\x9f\xac\x2c\x22\x41\xae\x32\x6f\xdd\x7e\xfe" + "\x62\x94\xd6\xad\x17\x26\x46\x69\x9d\xef\x39\x46\x69\xd5\x32\x99" + "\xb7\xec\x0b\x2c\x46\x69\xf5\xfa\xfe\x43\x4f\x31\x4a\x77\x99\x9f" + "\x0d\x3b\x7f\x71\xca\xd9\xa1\x17\x26\x4e\xf9\xbe\xce\x73\x9c\xf2" + "\xbd\x91\xc9\xfc\xfb\xf0\xc0\xe2\x94\xb3\x5e\xd7\x3f\xe8\x29\x4e" + "\xe9\x2e\xf3\xb6\xfc\xf3\x17\xab\xb4\xad\xbd\x30\xb1\x4a\xdb\x34" + "\xcf\xb1\x4a\x1b\x61\x32\x3f\x5b\x16\x58\xac\xd2\x56\x18\x48\xac" + "\xd2\x5d\xe6\xe7\x94\xe7\x2f\x5e\x69\x3f\x7d\x61\xe2\x95\x76\x93" + "\xe7\x78\xa5\x5d\xec\xff\xb4\x6b\x03\x8b\x57\xce\xf9\xd0\xff\xe9" + "\x1e\xaf\x74\x97\x79\x47\xca\xf9\x8b\x59\x3a\x16\x5c\x98\x98\xa5" + "\x63\xbc\xe7\x98\xe5\x5c\x23\x93\xf9\x39\x63\x60\x31\x4b\x87\xd7" + "\xfd\x4f\x7a\x8a\x59\xba\xcb\xbc\xb3\xe9\xfc\xc5\x2d\x9d\xc7\x2e" + "\x4c\xdc\xd2\x59\xea\x39\x6e\xe9\x9c\xcf\x64\xde\x49\x02\x8b\x5b" + "\x3a\xdb\x03\x89\x5b\x50\xd6\x28\x73\x8c\x55\x98\xcc\xf9\x7d\x34" + "\x78\x97\xb5\x13\xe2\x11\x35\xc8\x5d\xdd\x44\xb8\x22\x94\x79\x3d" + "\x93\xb9\x23\x78\x6f\x29\xc8\x27\x0e\x65\x26\xb4\xe3\x1b\x6d\xb0" + "\xc3\xb8\x5b\x45\x39\x02\x6d\x09\x22\x27\x15\xf6\x43\xf6\x0c\x12" + "\xac\x4b\x4d\x87\xef\xfc\x5b\x98\x47\x97\xba\xe9\x33\x68\xe3\x10" + "\x7c\x46\x61\xcf\xcd\x8a\x70\xa8\xf7\x98\xe1\xdc\x30\x3a\x3a\x3d" + "\xa2\x13\x62\x09\xfa\x94\x36\xd4\xd2\xb4\x93\x58\xec\x87\x49\x6d" + "\xfd\x5e\xc2\x07\xef\x7d\x75\xa2\x9d\xe8\xe9\x37\xfa\xd0\xea\x64" + "\x2b\x71\x2c\xd2\xaa\x2c\x29\x55\x80\x8b\xbf\x91\xa8\x46\x7a\x96" + "\xfe\x57\xaf\xea\x54\x57\x12\x87\x7a\xaf\xc1\x91\x5b\x59\x65\x57" + "\xef\xb7\xbd\xb5\xda\xca\xa9\xda\x89\x3e\xa1\x81\xd2\xbc\x85\x44" + "\x99\x77\x82\x04\x6d\x59\x48\x54\x5b\x4e\x10\x4d\x75\x43\x3d\xa9" + "\x39\x55\x45\x6a\x9a\x3f\x21\x35\x67\xe1\xe8\x80\x83\x87\xc3\xf0" + "\x09\xa9\x6e\x22\x64\xd6\x69\x42\xd2\x1a\xa8\xed\xe7\xc7\x49\x68" + "\xb5\xbd\x9e\xe8\x9e\x20\xe4\x8c\xc2\x51\xa4\x8a\x21\xa1\xf4\xbf" + "\x5a\x42\x17\x69\x39\x38\xa7\xc4\x74\x8b\xdd\x46\xaa\x1b\xda\xf1" + "\xfc\x06\x38\xaf\x4c\x6b\x80\xf2\xf9\x2a\x5c\xcb\xd0\x56\x6d\x38" + "\x04\xed\x9b\x1c\x0e\x72\xd6\x4a\x31\x59\x5e\x07\x09\xdf\x02\x6a" + "\x46\xcc\x44\x51\x86\x99\x92\x0e\x7f\x31\xe3\x60\xeb\xbf\x3f\xa5" + "\x1d\x09\xf2\x1e\xc5\x3f\x15\xad\x99\xfd\xc9\xe7\x14\xe7\x83\xe1" + "\xf3\x99\xda\xd6\xc3\x04\x9f\x59\x47\xad\x25\x64\xa6\x83\x10\x94" + "\x09\x3e\x4b\x9e\x9d\x44\x42\x70\x9e\x1a\xff\x8d\x7e\xa4\xa5\xc1" + "\x46\x36\xda\xa1\xae\x67\xda\xbb\xea\x5a\x9b\x59\x4b\xe0\xdc\xa8" + "\xda\x38\x2b\x51\x25\x11\x0d\xca\x19\xe2\xa2\xa0\xd9\x8d\x64\x58" + "\x62\x2b\xa5\x28\x63\x94\x2d\xca\x19\xcb\x93\x64\x6f\x89\xb5\x91" + "\xb4\x76\xa2\xb1\xa4\xc2\x67\x0a\xb5\x59\xc8\x77\x04\xea\xb8\x93" + "\xaa\x27\x87\x03\x3e\xca\x10\x13\x56\x85\xdd\x0c\x38\x18\x49\x37" + "\xd9\x93\x8b\xa1\xbd\xf8\x6c\xdf\xbf\x36\xf3\xbe\x3c\xff\xe8\x16" + "\x13\xca\xf0\x9c\x2d\xe0\x99\x53\x18\x69\xf0\xee\x18\xc0\x73\x26" + "\xc3\xf3\xd0\x66\x1f\xf0\x6c\x74\xe2\x99\xbe\xd4\x85\x67\x4e\xb1" + "\xd1\x2b\x9e\x39\xf2\x89\x88\xe7\xd2\x8b\x12\xcf\x1c\x59\xd6\x23" + "\x9e\x39\x32\xb3\x07\x3c\x17\x48\xf1\x6e\xbf\xe0\x99\x23\x65\x03" + "\x88\xe7\xec\x80\xf0\xcc\x11\x83\x2b\x9e\x69\x3e\xc3\x33\x9d\x16" + "\x10\x9e\x39\x85\xd7\xf5\x8f\x7b\x8a\xb7\x9d\x78\xae\x60\xfc\xcc" + "\x29\xe7\x03\x9e\x81\x9f\x2b\x44\x7e\xbe\xec\x44\xef\x78\xae\x70" + "\xf2\x33\xc7\xc5\x3b\xf1\xac\x9c\xe5\x1d\xcf\x43\xde\x60\x78\xae" + "\xb8\x38\xf9\x99\x1b\x72\x7b\xcf\x78\x1e\x12\xe6\x1d\xcf\x15\x5a" + "\xa9\x2f\xd1\x3f\x78\x1e\x92\x3c\x70\x78\xae\x08\x8c\x9f\xb9\x21" + "\x73\x5c\xf0\xcc\x71\x31\x02\x9e\x73\xb8\xd0\xc0\xf0\xac\x8c\x0b" + "\xa4\x2f\x23\xc3\xb3\xc8\xcf\x97\x8e\xa7\xc1\x15\xc0\xcf\x15\x22" + "\x3f\x8f\xf8\xc8\x07\x3c\x3b\xf9\x99\x1b\x7a\x9b\x13\xcf\x97\x8e" + "\xf6\x8e\xe7\x4b\xd6\x8a\x78\xbe\x48\xf9\xf9\x12\x75\xcf\x78\x1e" + "\xda\xd4\x03\x9e\x0b\xa4\x7e\x5a\xff\xe0\xf9\x92\x69\x03\x88\xe7" + "\x00\xf9\xf9\x12\x9d\x2b\x9e\x87\x86\x33\x3c\x2b\x1b\x02\xc3\xf3" + "\xa5\x53\x02\xe9\x27\x3a\xf1\x6c\x12\xf9\x79\x98\x1d\xf0\x0c\xfc" + "\x6c\x12\xf9\xf9\xd6\x9c\xde\xf1\x6c\x92\xf1\x73\xd0\x30\x27\x9e" + "\x87\x9d\xf6\x8e\xe7\x61\xf7\x31\x3c\x9b\x2e\x52\x7e\x0e\xfa\xac" + "\x67\x3c\x07\xed\xf3\x8e\x67\x93\x56\xea\x03\xf7\x0f\x9e\x87\x85" + "\x0e\x1c\x9e\x4d\x01\xf2\x73\x90\xcd\x15\xcf\x41\x84\xe1\xf9\xd2" + "\xf2\xc0\xf0\x3c\xdc\xeb\xfe\xaf\x3d\xf5\xc1\x65\x78\x16\xf9\x59" + "\x55\x4d\x83\x4d\xc0\xcf\x26\x91\x9f\x1f\xbb\xdb\x07\x3c\xcb\xf8" + "\x79\xf8\x27\x4e\x3c\xab\xde\xf5\x8e\x67\xd5\x55\x22\x9e\x2f\x52" + "\x7e\xbe\xec\xad\x9e\xf1\x7c\x99\xb1\x07\x3c\x17\x48\xe3\x0b\xfd" + "\x83\xe7\xcb\x1a\x06\x10\xcf\x01\xf2\xf3\x65\x66\x57\x3c\x0f\xaf" + "\x63\x78\x1e\x9e\x19\x18\x9e\x55\xf5\xfd\x32\xbe\xc1\x85\x54\xe3" + "\xf8\x46\x07\x8e\x6f\x38\xe7\xfe\xc5\x85\xd4\x31\x3c\x77\x02\x9e" + "\x5f\x91\xe3\xf9\x53\xb7\xf1\x0d\x4e\xfd\x06\xdf\x85\xe7\x90\x6e" + "\x78\xe6\x01\xcf\x9d\x02\x9e\x83\x8f\x49\xe3\x1b\x96\xa6\x52\xc0" + "\xc9\x29\x62\x99\x03\x58\xce\x13\xb1\xfc\x29\x60\x19\x64\xc8\x83" + "\x8c\xab\x8f\xd7\x93\x28\x1b\x93\x65\x07\xc8\x98\x97\xe3\xb8\xa3" + "\x91\x43\xfc\x22\x6e\x25\x0c\xd7\x24\x02\x76\x57\x7c\x48\x6a\x56" + "\xc3\xb1\x0e\x8e\x54\x38\xc8\x87\xa4\xba\x11\xb0\x1b\x2f\xc7\x6e" + "\x9d\x88\xdd\xe0\xf8\x9e\xb1\x1b\x1c\x39\x60\x63\x19\x5c\x30\x1b" + "\xff\xfa\x34\x5a\x13\xf5\xc0\xe7\xd4\x92\x52\x2f\xe2\xf3\x14\x89" + "\xb2\x93\x10\xfa\x98\x7e\xa4\x2a\x9a\x68\xd6\x3b\x08\x97\xbb\x90" + "\x68\x72\xff\x03\xed\x96\xec\xf7\x04\x51\x1d\x6e\xdf\x4b\xaa\x9b" + "\xeb\x49\xf5\xd9\x43\xa4\x9a\x87\xe3\x14\x1c\x50\xd7\xa8\xc5\xf2" + "\x76\xdb\xc4\x76\x87\x2c\x80\xb2\xc6\x79\x6f\x77\x48\x84\xd0\xee" + "\x58\x68\x77\x87\xb3\xdd\x16\xb0\x03\xd0\xcf\x28\x5e\x1c\x0f\x89" + "\xb2\x91\x61\xcb\xed\x94\x76\x88\xf8\x47\xfd\x1c\x3e\xda\x4e\xa2" + "\x92\x40\x67\x8b\x00\xff\x0d\xdb\x49\xda\x06\xc0\x7f\x47\x3b\xe2" + "\xce\x66\x31\x9c\x03\xfc\x07\x6f\xa0\x20\xbf\x4e\xc4\xff\xa7\x88" + "\x7f\x75\x29\x2f\xe0\x5f\x3d\x37\x30\xfc\x87\xf8\x82\x7f\x1f\xc6" + "\x43\x46\x56\xe3\x78\x48\x07\x8e\x87\x38\xe7\x80\xf6\x86\x7f\x19" + "\x9f\x6b\x64\xf8\x1f\xd9\x03\xfe\x47\x48\xf8\x2f\xbd\xf0\xf8\x1f" + "\xd1\x0b\xfe\x47\xf4\x84\xff\x7e\x1e\xfb\x18\x31\x80\xf8\x1f\xd9" + "\x0b\xfe\x47\xfa\x82\xff\xec\xc0\xf0\x3f\xc2\x0d\xff\x1a\x11\xff" + "\x9a\x00\xf1\x3f\xd2\x07\xfc\xfb\x32\x7e\x72\x39\xe2\x1f\xf8\xbf" + "\x42\x29\x9b\x0b\xdc\x0b\xfe\xe5\xe3\x27\x3f\x91\xe1\xff\xf2\x1e" + "\xf0\x1f\x7a\x4c\x1a\x3f\xb9\xf0\xf8\x0f\xed\x05\xff\xa1\x3d\xe0" + "\xbf\xbf\xc7\x4a\x42\x07\x10\xff\x97\xf7\x82\xff\xcb\x7d\xc0\x7f" + "\x45\x80\xfc\x1f\xea\x86\xff\x9f\x88\xf8\xff\x49\x80\xf8\xbf\xdc" + "\x17\xfc\xfb\x30\xde\xa2\xad\xc6\xf1\x96\x0e\x1c\x6f\x71\xce\x09" + "\xef\x0d\xff\x32\xfe\xbf\x42\x86\x7f\x6d\x0f\xf8\xbf\x52\xc2\xff" + "\x45\xc0\xff\x57\xf6\x82\xff\x2b\x7b\xc2\x7f\x3f\x8f\xad\x5c\x39" + "\x80\xf8\xd7\xf6\x82\x7f\xad\x2f\xf8\x0f\x90\xff\xaf\x74\xc3\xff" + "\x15\x22\xfe\xaf\x08\x10\xff\x5a\x1f\xf0\xef\xcb\xf8\xcc\xd5\x88" + "\x7f\xe0\x7f\x93\x52\xf6\x6e\x40\x2f\xf8\x97\x8f\xcf\x5c\x25\xc3" + "\xff\xd5\x3d\xe0\x7f\xd4\x31\x69\x7c\xe6\xc2\xe3\x7f\x54\x2f\xf8" + "\x1f\xd5\x03\xfe\xfb\x7b\x2c\x66\xd4\x00\xe2\xff\xea\x5e\xf0\x7f" + "\xb5\x0f\xf8\x37\x05\xc8\xff\xa3\xdc\xf0\x7f\x95\x88\xff\xab\x02" + "\xc4\xff\xd5\xbe\xe0\xdf\x87\xf1\x9c\x31\xc2\x78\x4e\x07\x8e\xe7" + "\x38\xdf\x11\xe9\x0d\xff\x32\xfe\x0f\x93\xe1\x7f\x4c\x0f\xf8\x1f" + "\x2d\xe1\xff\x22\xe0\xff\xd1\xbd\xe0\x7f\x74\x4f\xf8\xef\xe7\xb1" + "\x9b\xd1\x03\x88\xff\x31\xbd\xe0\x7f\x8c\x2f\xf8\x0f\x90\xff\x47" + "\xbb\xe1\x3f\x4c\xc4\x7f\x58\x80\xf8\x1f\xd3\x4f\xe3\x3f\xba\x64" + "\x1c\xff\xe1\x55\xbb\x95\x9d\x85\xe9\x11\xbc\xb1\x92\x84\x28\x74" + "\xc4\xae\xda\x63\xb6\x24\xb7\x92\xd9\xdf\x83\x4e\x92\xbe\x27\x4f" + "\x7c\xaf\xc1\xbd\x2c\x6d\x14\xfa\xff\x2e\xef\x88\xc2\x61\x37\x4e" + "\x0e\xdf\x92\x48\x94\x8e\xe0\xbd\xaf\x62\x9a\xe5\x64\x3b\xc1\x36" + "\x6f\x44\x19\x9c\x72\xca\x00\xc7\xe0\xe8\xb7\x7a\x4d\x71\x06\xe4" + "\xe9\xb0\x92\x06\xc0\x4b\x75\x83\x15\x64\xbf\x4e\xc0\x16\xea\x02" + "\xea\x13\x5a\x72\x86\x28\xed\xff\xd5\x8e\x02\x1d\x87\xaa\xd7\x10" + "\x45\x58\x03\xe5\x51\x97\xa8\x23\xd4\xab\x6e\x1d\xa5\x90\x6f\x59" + "\x2d\xe0\xdb\xfe\x5f\xfd\xa8\x62\xc8\xd7\xff\xe3\x32\x3a\xe1\xf9" + "\x07\x7c\x82\x3d\x82\x2c\x73\xae\x09\x50\x4f\x3a\x1f\xde\x7f\xf1" + "\x65\x9c\x62\x6c\x18\x8e\x53\x80\x9e\x32\x7d\xd4\x53\xb6\xcb\x3b" + "\xad\xfd\xae\xa7\x6b\xf7\xf9\xa6\xa7\xb1\x97\xbb\xe9\xa9\x9f\xc7" + "\x0f\xae\xb5\x32\x3d\x5d\x5b\xce\xf4\xa4\xb3\x07\xa6\xa7\xb1\x01" + "\xcd\xff\xed\xde\x9f\xbe\xee\x00\xf6\xa7\x79\xe8\x4f\xfb\xa6\xa7" + "\x8a\x20\x97\x77\x70\xfb\x5d\x4f\xd7\xc5\xfa\xa6\xa7\xeb\xde\x75" + "\xd5\x53\x7f\xf7\x73\xaf\xcb\x66\x7a\xba\x6e\x3e\xd3\xd3\xd8\xb2" + "\xc0\xf4\x74\x9d\x0f\xef\x7f\xf8\xd2\xef\xbb\x3e\x01\xfb\x7d\xa0" + "\x27\x1f\xed\xa9\x22\xdb\xe5\x9d\xe1\x7e\xd7\xd3\xf5\x2a\xdf\xf4" + "\x74\xfd\x62\x37\x3d\xf5\x73\x7f\xec\xfa\x70\xa6\xa7\xeb\x95\x4c" + "\x4f\xe3\x66\x06\xa6\xa7\xeb\x53\xfa\xa7\x7f\xf2\xb3\x50\xec\x9f" + "\xf0\xd0\x3f\xf1\x4d\x4f\xa6\x20\x97\x77\x9c\xfb\x5d\x4f\x3f\x2d" + "\xf7\x4d\x4f\x3f\x53\xbb\xea\xa9\xbf\xfb\x0d\x3f\x65\xfb\x01\x73" + "\x3f\xdd\xc1\xf4\x74\x7d\x6b\x60\x7a\xfa\x99\xae\x7f\xe2\x68\xfd" + "\x3e\x8c\xa3\x41\x4f\x3e\xda\x93\x29\xdb\xe5\x9d\xec\x7e\xd7\x93" + "\x7e\xbe\x6f\x7a\xd2\xef\x72\xd3\x53\x3f\xc7\xb7\x7a\x03\xd3\x93" + "\x7e\x2e\xd3\xd3\xcf\x0a\x03\xd3\x93\xde\x97\xf9\x9f\x1e\xdf\xc3" + "\xea\x1e\xf3\xdd\x18\x77\x71\xc5\x7c\x37\x06\xf9\xa6\xab\x1b\x17" + "\x9c\xdf\x98\xef\xc6\xf1\x4c\x57\x37\x12\xa6\xab\x1b\x22\x03\xd3" + "\xd5\x8d\x5e\xd7\x7f\xec\xed\xfd\xad\xee\x71\xdf\xf8\xd0\x8b\x2b" + "\xee\xfb\xb9\x8f\xfc\x37\x5e\x7d\x7e\xe3\xbe\x9f\x8b\xfc\xf7\x73" + "\x91\xff\x6e\x0c\x90\xff\xc6\xfb\xc0\x7f\x9e\xdf\xfb\xea\x1e\xfb" + "\x4d\x30\x5f\x5c\xb1\xdf\x84\x18\xdf\x74\x35\x61\xcf\xf9\x8d\xfd" + "\x26\x64\x32\x5d\x4d\x88\x66\xba\x1a\x5f\x1a\x98\xae\x26\x54\x07" + "\xfa\xbe\x58\xf7\xf8\x6f\xe2\x45\x16\xff\x4d\xf4\x31\xfe\x9b\x78" + "\x9e\xe3\xbf\x89\x62\xfc\x37\x51\x8c\xff\x6e\x0a\x30\xfe\x9b\x18" + "\x50\xfc\xe7\xaa\x2b\x29\x06\xbc\x59\x7b\x71\xc5\x80\xe1\x26\xdf" + "\x74\x75\xf3\x88\xf3\x1b\x03\x86\x1f\x67\xba\x0a\xdf\xc9\x74\x35" + "\xb1\x3d\x30\x5d\xdd\xec\x75\xff\xdb\xde\xde\x4f\xeb\x1e\x07\xde" + "\x72\xe0\xe2\x8a\x03\x6f\xf1\xb1\xff\x7b\xcb\xbb\xe7\x37\x0e\xbc" + "\x45\xec\xff\xde\x22\xf6\x7f\x6f\x0e\xb0\xff\x7b\x8b\x0f\xfd\x5f" + "\x5f\xc6\xfd\x26\x8f\xc3\x18\xd0\x61\xdc\xad\x0c\x01\xf9\x87\xa4" + "\x10\xae\x23\x0c\xf4\xa5\x02\x7d\xa5\xeb\x48\xa7\x11\xf4\x65\xb3" + "\x93\xd9\x4f\x7f\x4e\x6b\x9b\x1c\xa4\x03\x74\x75\x0e\xe2\x40\x8b" + "\xad\x11\xdf\xd1\xfb\xf5\x09\x6e\xd2\xbb\x8f\x3d\xad\x21\xa8\x2f" + "\x94\xbf\x43\x35\x39\x9c\x82\xbe\x04\xfd\xa9\x2a\xab\xec\xc6\xbd" + "\x86\x59\xa7\x3f\xa7\xcb\xad\x94\xd6\xc4\xb5\xe3\xda\x91\x11\x35" + "\x71\xf5\x24\xaa\x81\x0c\xd3\x3d\x88\x7a\x99\xb4\x0c\xd3\x2d\xb6" + "\x7a\x82\xeb\x7e\x0a\x63\xe0\x9f\xeb\x43\xed\x1f\xeb\x55\xb8\x7e" + "\x13\xbe\x57\x28\xad\xd1\x64\x39\x55\x20\xe8\xdf\x7d\x4c\x55\xd0" + "\xff\xc7\x7a\xcd\x2b\xf8\x7e\x62\xbf\xc7\x82\x93\x84\xf1\x3f\xfe" + "\x73\xed\x28\xa9\x8e\xcb\x13\x28\x85\x3a\x8e\xac\x6d\xb5\x11\xac" + "\x67\x6d\xab\x99\xa4\x25\x13\x4d\x6d\x47\x23\x49\x6d\xa5\xb6\x5a" + "\xc3\xd7\x24\xea\x7b\x7c\x2e\x80\x78\x9a\xb4\x8b\xe9\xfb\x17\x56" + "\xfe\x73\xfd\x28\x28\x6f\x47\x2d\x68\x2e\x24\x1d\x64\x6d\x27\x9c" + "\xf0\xbe\x26\x47\x82\x40\x5e\x71\x16\xc3\x09\x42\x83\xff\x0f\xee" + "\xf1\x1f\x94\x67\x1c\x9c\x9f\xda\xf5\xbc\x21\xf8\xff\x38\x4c\x43" + "\xd9\xe2\x3c\x53\x4b\x92\x4d\xc8\x23\x9d\x67\xba\x33\x10\x4b\x4a" + "\x07\xa9\xb5\x13\x02\xf7\x33\x1e\x89\xae\x07\x7c\xfd\x22\x40\xde" + "\x9e\x1c\xde\x3f\xe3\x95\xbf\xcc\xc4\xb8\x15\xf0\x95\xc9\xea\x38" + "\xb4\xd9\x07\x7c\x65\x3b\xf1\xf5\xcb\xd1\x7d\xc3\xd7\xad\x35\xfd" + "\x8c\xaf\x7e\x8e\x5f\x6f\x2d\xe8\x1b\xbe\x7e\x79\x39\xc3\xd7\xad" + "\x11\x0c\x5f\xbf\x54\x39\xf1\x35\xb4\xf9\xfc\xe1\x6b\x72\x13\xc3" + "\xd7\xe4\x1d\x81\xe1\xeb\x97\xf9\xfd\x33\xce\x7a\x5b\x03\xc6\xda" + "\x0e\x63\x85\xc8\x5f\x97\x9d\xe8\x1d\x5f\x15\x32\xfe\xba\x6d\x63" + "\xdf\xf0\x75\xdb\x84\xfe\xc5\x57\x7f\xc7\xdc\x53\xda\xfb\x86\xaf" + "\xdb\x56\x31\x7c\x4d\x29\x65\xf8\xba\x2d\xc1\x89\xaf\xcb\x4e\x9c" + "\x3f\x7c\x4d\x99\xc9\xf0\x35\x45\x15\x18\xbe\x6e\x0b\x68\xfd\xab" + "\xee\xfd\x83\xa9\xd3\xb0\x7f\x00\xf8\x12\xf9\x6b\xc4\x47\x3e\xe0" + "\x4b\xc6\x5f\xbf\xfe\xac\x6f\xf8\xfa\x75\x6e\x3f\xe3\xab\x9f\xfb" + "\x09\xbf\x8e\xee\x1b\xbe\x7e\x7d\x8c\xe1\xeb\xd7\x84\xe1\xeb\xd7" + "\xd5\x4e\x7c\x8d\xf8\xe8\xfc\xe1\xeb\x57\x3b\x18\xbe\x7e\x95\x10" + "\x18\xbe\xa6\x7a\x5f\xff\xd9\xaf\x71\xed\x3b\xca\xb0\x4f\xe3\x30" + "\x9a\x44\xfe\xba\x35\xa7\x77\x7c\x99\x64\xfc\x75\xc7\xed\x7d\xc3" + "\xd7\xed\xa7\xfb\x17\x5f\xfd\xdd\xb7\xb9\xdd\xd4\x37\x7c\xdd\x31" + "\x99\xe1\xeb\xf6\x18\x86\xaf\x3b\xc6\x3b\xf1\x75\x6b\xce\xf9\xc3" + "\xd7\xed\x2a\x86\xaf\xa9\xd5\x81\xe1\xeb\x0e\x5f\xd6\x7f\xf5\x61" + "\x3c\xfe\x2e\x25\xf6\xc3\x00\x5f\x22\x7f\x3d\x76\xb7\x0f\xf8\x92" + "\xf1\x57\x44\x51\xdf\xf0\x15\x31\xab\x9f\xf1\xd5\xcf\xfd\xb1\x08" + "\x6d\xdf\xf0\x15\xf1\x7b\x86\xaf\x3b\xcd\x0c\x5f\x11\x46\x27\xbe" + "\x1e\xbb\xfb\xfc\xe1\xeb\xce\x04\x86\xaf\x3b\xc7\x07\x86\xaf\xbb" + "\x7c\x59\xff\xd4\xc7\xe7\x08\xf7\xc4\xf5\xad\x0f\x79\x8f\xa2\x6f" + "\x18\xbb\xfb\xaf\x17\x77\x1f\xf2\xee\x0d\x7d\xc3\xd8\xdd\xe7\x18" + "\xc6\xee\x1e\xc7\x30\x76\xb7\x6d\x60\xfa\x90\x77\xd5\x31\x8c\xdd" + "\x95\x1f\x18\xc6\xee\xe9\xc7\xe7\x1f\xd3\xab\xfb\xd6\x8f\x9c\xbe" + "\xb8\x6f\x18\x9b\x7e\xf9\xc5\xdd\x8f\x9c\x66\xed\x1b\xc6\xa6\x3f" + "\xce\x30\x36\x2d\x9b\x61\x6c\xfa\xdc\x81\xe9\x47\x4e\x9b\xc4\x30" + "\x76\x4f\x80\xcf\x6d\xa6\x07\xf4\xfe\x8b\xe7\xe7\x36\x91\xe1\x7d" + "\xeb\x4b\xde\x7b\xa8\x6f\x18\xbb\x77\xed\xc5\xdd\x97\xbc\x77\x5a" + "\xdf\x30\x76\xef\x7b\x0c\x63\xbf\x69\x62\x18\xbb\xd7\x34\x30\x7d" + "\xc9\xdf\x14\x30\x8c\xfd\x26\x3a\x30\x8c\x45\x4e\xed\xbf\xe7\x4d" + "\x33\xb6\xf5\xad\x3f\x39\x63\x42\xdf\x30\x76\xdf\x67\x17\x77\x7f" + "\xf2\xbe\xed\x7d\xc3\xd8\x8c\xeb\x19\xc6\xee\x9b\xc3\x30\x36\x23" + "\x6c\x60\xfa\x93\x91\x76\x86\xb1\xc8\x7d\x81\x61\x6c\x46\x69\xff" + "\x3d\x27\x9b\xd9\xde\xb7\x3e\xe5\xcc\xad\x7d\xc3\xd8\xcc\xbb\x2e" + "\xee\x3e\xe5\x4c\x55\xdf\x30\x36\x73\x33\xc3\xd8\xfd\xe5\x0c\x63" + "\x33\x0d\x03\xd3\xa7\xbc\x3f\x86\x61\xec\x7e\x5d\x60\x18\x9b\xa5" + "\xec\xbf\xe7\x7b\x51\xf3\xfb\xd6\xaf\x9c\xfd\x7d\xdf\x30\x36\xfb" + "\xb5\x8b\xbb\x5f\x39\x3b\xa9\x6f\x18\x9b\x7d\x9a\x61\x6c\xb6\x96" + "\x61\x6c\x76\xc3\xc0\xf4\x2b\x67\x1d\x60\x18\x9b\x15\xe0\x7a\x14" + "\x51\xdd\xd6\xbf\x8a\x4f\x5c\xbd\x20\x21\x3e\x56\x17\x9f\x98\xbc" + "\xe2\x69\xdd\xca\xf8\x75\x8b\x6f\xbf\x7e\xd5\x78\xdd\x8a\x14\xdd" + "\x8a\xf8\xc4\xdf\x89\x09\xb1\xc3\xc9\x83\x8b\x13\x16\xa4\x60\x0a" + "\xe4\xfe\x5d\xe2\xb2\xc5\x89\xc9\xba\x15\x8b\x9f\x5e\x15\xbf\x62" + "\x31\x7e\x5f\xa9\x5b\xb2\x7c\x05\x24\x2c\x5a\x1c\xbf\x7a\xb1\x6e" + "\xe1\xaa\x25\x4b\x16\xaf\x58\x39\x9c\xcc\x5a\x95\x90\x1c\x9f\x94" + "\xb0\x58\x37\x6d\xd6\x5d\x13\xe6\x4e\x7f\x68\xee\x9d\x77\xe2\xe6" + "\x64\xb2\xbd\xc9\xc2\xa8\xb1\xd2\x0c\x98\x53\x9e\xe4\x1e\x19\x51" + "\x0b\xbd\x7d\xdc\x1f\x77\x4b\x33\xd1\x6c\x5e\x41\x94\xd9\xcd\x24" + "\x28\xb7\x99\xa8\x74\x4b\x49\x04\xdd\x6c\x8f\x81\xf4\x50\x9a\x3b" + "\x29\x89\xe6\x65\x45\xc2\xe7\x4e\x9b\x7a\x34\xa6\x69\x68\x6e\x58" + "\x01\x9e\x03\xd9\x2a\x69\xee\x64\xed\x09\x2e\xba\xce\xa6\x1e\x13" + "\x91\xf6\x35\xe1\xe8\xf0\x39\x05\x6f\xf3\x36\xee\x3d\xec\xed\x40" + "\xdb\x09\xf7\xc0\x4e\x38\x0a\x09\xf7\xe0\x4c\x38\xe6\xc3\x11\x07" + "\x47\x3e\x1c\x05\x70\xec\x80\xc3\x04\xc7\x01\x38\xaa\xe1\x38\x0a" + "\xc7\x71\x38\x1a\x08\xf7\x50\x0c\x1c\x06\x38\x20\xef\x43\xdb\x59" + "\x39\x0f\x95\xc3\x61\x25\xdc\x5c\x3d\x1c\x50\xd6\xbc\x68\x38\x32" + "\x09\xf7\xf0\x38\xf8\x2c\x83\xc3\x0c\x47\x15\x1c\x4d\x90\xa6\x81" + "\xbc\x26\x76\xee\x61\x48\xfb\xad\x92\x40\x3d\x7b\x3f\x7e\x0b\xf9" + "\x7f\x3b\x1e\x8e\x39\x70\xc0\x3d\xa3\x43\xe1\x88\x75\xcb\xb7\x43" + "\xf6\xbd\xaa\x97\x32\x1b\x43\xd2\xaf\xb1\x0a\x7b\xe0\x71\x0f\xaa" + "\x1d\x19\x64\x88\x23\x77\x4c\x44\xd2\x8d\x44\x71\x8a\x7b\xe0\x13" + "\x4b\x26\xf2\xcc\xa4\x24\x61\x4f\x47\xf8\x8d\x32\x6b\xcb\x79\xa0" + "\xde\x4a\x5e\xc8\xc6\x3d\xcd\xfc\xc3\xdb\x03\xf5\xec\xfa\x07\xb5" + "\x56\x85\xde\x2c\xec\x01\x97\xf3\x5d\x39\x4d\x8b\x7e\x45\xd8\xfb" + "\x0d\x65\x88\x76\x90\xfd\x9d\x8a\x06\x7d\x53\x86\x36\x6f\x5e\x87" + "\xf5\x7a\xe0\xaf\x34\x83\x04\xc3\xf5\x3b\x29\xd4\xcd\xa6\xce\xc2" + "\x7d\x05\x95\xf8\xdb\x91\x3b\x3a\xe6\x9c\x7a\x7f\x29\x7e\x6f\x2f" + "\x32\xd4\x51\xe3\xfe\x2a\xec\x67\x9b\x53\x9f\x27\x27\xe0\xba\x73" + "\x6a\x73\x9c\x6e\x46\x08\x3d\x81\xd7\x66\x10\xce\xca\x3d\x38\x8d" + "\xd9\xea\x03\x3b\xcf\xa9\xb3\xe6\x38\x0a\xcc\xf9\x90\xae\x74\xe4" + "\x66\x45\xb2\xf2\x47\x03\x4f\xee\x4d\x82\x7c\xa5\x42\x7a\xa1\xa1" + "\x51\xfa\x0e\x9f\x85\x8e\xbc\x4a\x0d\x7e\xaa\xd3\x49\xab\xf0\x3b" + "\x23\x82\xb0\x4f\x0d\xd1\xcd\x20\xa4\x89\x7b\x68\xfa\xc4\x2a\xa2" + "\x30\xcf\xc0\x7a\x3f\xa4\x49\xab\xa2\xbc\x2e\x75\x08\xdc\xff\xa1" + "\x11\x5d\xf7\xbd\xca\x9c\x8d\xfb\xa7\xd2\x9c\xa8\xed\x25\xcf\x13" + "\x82\xd7\x62\xdd\x5e\x1a\x49\x94\x45\xcf\x93\x20\x6c\x63\x5b\xce" + "\x43\x53\xa5\x7d\xe8\xf0\x1a\x0e\xf2\xdf\x77\x5f\x1a\x95\x95\x3d" + "\xcc\x21\xb4\xe7\x81\x1d\x4c\xa6\x0f\x25\x58\x15\xd7\x0b\x7b\xe5" + "\xe9\xc6\x0a\xb2\xfc\xab\x78\x7e\x27\xea\x13\xcb\xa7\xb9\x95\x66" + "\xfc\x8d\xfb\xdc\x85\x00\x2a\x74\xa9\xe3\x4c\x4c\x46\xfb\xab\xb0" + "\x1c\xcc\x4f\xf3\xf6\xc0\xf7\x07\xe7\xd0\x5c\x41\xc6\x7a\x5d\x22" + "\x89\x80\xba\x7f\xe2\xd8\xdc\x9c\x0c\x65\x80\xdd\x35\xa7\x40\x7e" + "\xab\x20\xef\xdc\xbd\x31\x56\xee\xa1\x6a\x38\x97\xd2\xb5\xf7\x25" + "\x93\xb3\x02\xf2\x65\xb7\xe5\xcc\x25\x56\xc5\xed\x75\x82\x9e\x57" + "\xd3\xa3\xb8\xc7\x66\xcb\x6a\x6a\x8f\xb2\x7f\xce\x03\x57\x11\x38" + "\xaf\xb3\x92\x7b\xb6\x4b\x6d\x64\xba\xef\x2a\xe7\xaf\xf8\xdb\x36" + "\x4c\x28\x27\xd2\x53\x39\x56\x6e\xae\xe6\x49\xbb\x4e\xd1\x71\x96" + "\xd6\x6d\x79\x18\xe5\x48\x68\xc7\x6a\x5a\xbd\x31\x92\xb6\xe7\x7d" + "\x44\x48\x4d\xdc\x71\x02\x36\x1f\x16\xac\xa0\xb6\xa8\xb5\x24\x24" + "\x38\x29\x84\x1e\xaa\x3a\x4e\xd6\x47\xd2\x46\xdc\xf7\xb7\xb6\xb5" + "\x81\x6c\xf8\x84\xa8\xd2\x6a\x48\xe8\x86\x48\x6a\xab\x8e\x39\x4e" + "\x58\x7a\x0d\x49\xfb\x82\x28\xd7\x1f\xa0\xed\xb3\x81\xff\x8f\x1c" + "\xc7\xf4\x06\x82\x7b\x54\xa6\x35\x52\x7b\xea\xe3\x44\x85\xdf\x6b" + "\x0e\x60\xfa\x97\x24\xed\x34\x51\x46\xa5\xd8\x42\x8a\xe1\x9e\x78" + "\x7d\x09\xd4\x85\x3f\x4b\xf7\x6d\x39\x4b\xc8\xfa\x47\x88\x76\xc3" + "\x02\xa2\x89\x72\x10\x6a\xb1\xef\x82\x78\x90\x02\xf7\x1f\x24\x1b" + "\xe3\x49\x50\x94\x1d\xdf\x63\x3b\x46\x70\xdf\xef\x12\xc8\x0b\x6d" + "\x33\x63\xdb\xd6\x7f\x46\xb4\xb8\x0f\x3a\xbb\xe6\x5d\xf1\x9a\xcf" + "\x08\xca\xec\x9c\x7a\x52\x69\x7b\xee\x64\x1d\xb4\x3d\x14\x65\x00" + "\xf7\xa9\xe3\xf1\x3a\xb8\x7e\xcb\x0a\x41\x06\x8a\x27\xed\x44\xe5" + "\xc8\xdd\x1b\xf9\x64\x8a\x59\x28\xd7\xca\xcd\x9b\x53\xb2\x42\xa8" + "\x93\x4b\xde\x28\x3b\x6d\xb1\xa9\xf7\x02\xee\xe7\xa5\x44\xa5\xdc" + "\x49\xf1\x5a\xd0\x65\x66\x5b\xce\x3c\x93\x24\x6f\x49\x2f\x90\x67" + "\x07\xe8\x22\x73\x48\x12\x51\xc2\xf9\x7a\xab\x22\x62\x87\x13\x6b" + "\x0f\x4e\x03\x9d\x5f\x22\xe5\x15\xf3\xd8\xad\x8a\x3b\x5a\x65\x78" + "\x44\x7c\x75\xe5\x69\xcb\x79\x38\xcc\xaa\xb8\xd3\xce\xee\x31\xef" + "\x38\xe6\x11\xb9\x5f\xca\x3b\x84\x66\x7f\x93\xe2\x50\xef\xaf\xa3" + "\x1c\x6d\x07\x3c\xc6\xd1\x16\xad\x6a\xb6\x9d\xb6\xf3\xb9\x7b\x90" + "\xe7\x55\xb8\xaf\x2b\xcb\xff\xf0\x5b\x70\x3e\x49\xb7\x5a\xf8\x6e" + "\xc6\xfb\x50\x63\x56\x52\xd7\xb9\x0c\x32\x94\x16\x19\xcc\xe0\x3b" + "\x34\x51\x55\xb4\x1d\x6c\xdd\x9c\xb7\x02\x7d\xc7\x7e\x33\xda\x35" + "\xaf\xde\x9b\xd2\xfe\x92\x39\x09\xf9\x09\x6d\x84\x1a\xf7\xc4\xb0" + "\x6b\x1f\x9c\x8e\x76\xc3\xb8\xe6\xe1\x4c\x07\x94\x01\x75\xda\x00" + "\xe7\x86\x9e\xe0\x1e\x6e\xc7\xf7\x49\xe1\x77\xb9\xb0\xef\x25\xf7" + "\xb0\x83\xe1\xf7\x9b\x14\x97\xdf\x1c\xca\x0e\xec\x09\x38\x0b\xf9" + "\xe1\x24\xf7\xdb\xd1\x4e\x1b\x16\xe4\xc6\x31\x2e\xda\x93\xc4\x78" + "\x64\x08\x0f\xf9\x14\x27\x44\x7b\x3c\x37\xac\x79\x43\x5b\xce\x6f" + "\x01\xff\xba\xa9\x2e\x76\x92\xd3\xa8\xc5\x3d\x36\xa1\x2e\x43\xa0" + "\xcc\x55\xf0\x79\x29\x7c\xae\xfd\xa0\x0a\xf5\x2d\x94\x7b\x19\x7e" + "\x7f\xe9\x0a\x6a\x9b\x36\x9d\xe0\x7e\x9a\x60\x6f\xbf\xcd\xb7\x92" + "\xa7\x67\x62\x39\x9b\x71\x9f\x51\x48\xc3\x3c\x90\xbe\xdd\x4a\x56" + "\x88\xe5\x3f\x38\xa7\x15\xea\xea\x56\x7e\x0d\x2b\x9f\x95\x8b\xe5" + "\x49\x65\x17\xbd\x48\x9b\xc4\xb2\x9b\xa4\xb2\x73\x21\x4d\x2a\x7f" + "\xda\x32\xe9\x1e\xd1\x2a\x38\x7f\x40\xde\x86\x82\x17\x69\x2b\x96" + "\x01\xe7\xf4\x56\xb2\x29\x1c\xcf\x65\x43\x1a\x5e\x2b\xc3\xd5\x90" + "\x0f\x22\xa1\x8c\x03\x42\x19\x73\xac\x24\xd3\xe4\xc6\x71\x6a\x89" + "\xe3\xc4\xb2\x92\xa5\xb2\x9c\xe5\x48\x78\x6a\x13\xf1\x22\x94\xab" + "\xc2\x72\x21\x7f\x99\x95\x24\xab\xe4\x6d\x07\x99\x27\x88\xe7\xcc" + "\x56\xc5\x35\x76\x57\x3b\x78\x68\x07\xcd\xdb\x5f\x8f\x1c\x27\x62" + "\xf5\x13\xe4\x6b\xe9\x3c\xee\x41\x0a\xbc\x5e\x87\xb6\x24\x70\x7b" + "\xee\xde\x39\x6d\x39\x8f\x04\xb9\x71\xb9\x12\xf3\x39\x72\xe6\x0c" + "\x2d\xc2\x3d\x58\xaf\xa0\x8d\x90\x67\xbc\xcb\xbe\xa3\x1c\xb9\x03" + "\xd2\xba\xf6\x3f\xcd\x83\x3c\x56\x6e\x8e\xd7\xf5\x1d\x53\xaf\x25" + "\x9c\xa5\xd0\x8a\xb1\x35\x62\x6e\xaa\x25\xac\x95\x58\x0a\x79\xc2" + "\x17\x1b\x6c\x11\xa9\xd4\x0c\xf1\xd4\xbb\xb8\x9f\xb5\x7f\xfe\xfa" + "\x11\xb6\xff\x67\x07\xc4\x9c\x1b\x6e\x21\xe8\xa3\xcf\x70\x8f\x9e" + "\xb6\xd8\x9a\x05\x39\xc2\x77\x21\x1e\x78\x01\x62\x54\x8c\x53\xa1" + "\x6f\x10\x97\xcf\xb1\x58\x95\x87\xbc\xc5\x98\x8e\x71\x2c\x70\x68" + "\x89\xec\x1c\x2d\x36\x6c\x67\xb2\x7b\xf4\x35\xc1\x57\x60\x7d\xed" + "\xf7\x9a\xb1\xce\x7c\xa1\x61\x3b\xb6\x21\x2d\x85\xf2\x16\x7b\x9b" + "\x19\x79\x56\xb7\x1a\x63\xec\x47\xd3\xa3\x8a\x08\xe5\x8b\x0c\xdb" + "\xfd\x6b\xc3\xa3\xc2\xde\xe3\xd0\x8f\x38\x63\x1b\x6d\xd8\x8e\xfb" + "\x40\x6f\x49\x1d\x1a\x74\x4f\x21\x35\xb7\x8c\x31\x00\x5e\x1e\x2d" + "\x93\xf6\xd9\xf5\xb3\xdc\x32\xa9\xed\xc5\x62\xdb\x21\x4d\xe8\xb3" + "\x4d\x2c\x10\xf6\xff\xc6\xdf\xc7\xbd\xe9\x0b\x38\xa6\x1e\xaf\x85" + "\xb6\x47\x94\x48\x72\xb2\xdb\x70\xff\xf3\x11\xa7\xb8\xc7\x9e\x8e" + "\xda\x60\x26\xc2\x9a\xfe\xb9\x7b\xea\xfd\xab\xd7\x63\xc2\xf8\x57" + "\x2d\xf4\x61\xa2\xec\x95\x94\x71\xe2\x63\x2f\xcd\x16\xcb\xc3\x73" + "\x92\xae\x8a\xc5\xbe\x45\x00\xf7\xf0\x3a\xfe\x21\x6b\x97\xa6\x7b" + "\xbb\xe6\xdf\x17\x78\xbb\xe6\x87\x76\x6f\xd7\xfc\xa7\xfb\xb7\x5d" + "\xf3\xbd\xce\x7f\x96\xb5\x4b\xd7\xbd\x5d\x8f\x5f\xdb\x87\x76\x35" + "\x75\x6f\xd7\xe3\xf7\xf5\x6f\xbb\x1e\xf7\x3a\xff\x41\xd6\xae\x70" + "\x0f\xed\x3a\x17\x78\xbb\x1e\x3f\xd0\xbd\x5d\x4f\x5c\xdb\xbf\xed" + "\x7a\xc2\xeb\xfb\xbf\x5e\xf9\x30\xaf\x52\xc7\xf8\xf0\x89\x1a\xff" + "\xf9\xf0\x89\x82\xee\x7c\xf8\xa4\xc3\xc9\x87\x4f\x7e\x1d\x10\x1f" + "\xe6\x65\x89\xf1\xc6\x93\xbb\xba\xf1\xa1\x31\x2b\xc6\x33\x1f\x3e" + "\xb9\x55\xe0\xc3\xdc\xac\x18\xff\xda\xf0\xe4\xfc\x2e\x3e\x54\x67" + "\xc5\xb8\xf0\x61\x70\xa5\xae\x2d\xe7\xc9\xf2\xc0\xf8\xf0\xc9\xf2" + "\xee\x7c\xf8\x64\xa8\x2b\x1f\x3e\xd9\xe4\x1d\x87\x7b\xa3\x3d\xf1" + "\x61\x94\xfd\x5b\xca\xb0\xb1\x37\xda\xbf\xfa\xc4\x4c\xeb\x01\xf3" + "\xd6\x9e\xef\xb5\xc7\xbf\xfd\xe5\xb9\x18\xaf\xf3\x3f\xa0\x1f\x5b" + "\x00\x31\x88\x66\xe3\x1f\x09\x77\x72\x03\xe1\x6a\xc3\xea\xa1\x8f" + "\xd0\x4e\x6e\x4a\x02\x4c\x64\x90\xa9\xb5\x85\x4d\xa4\x36\xec\x24" + "\xa1\xc3\xbe\x29\xa0\xaf\x6f\x4d\x8a\x58\x81\xd8\x5c\x10\x6f\x49" + "\x6e\xf7\x13\x9b\x0b\x26\x49\xd8\xac\xb5\x03\x36\x57\x23\x1e\x17" + "\xbe\x64\x69\x3a\x25\x62\x73\x61\x56\x97\x7e\x32\x18\x3e\x3d\x62" + "\x13\x6c\xc2\x15\x9b\x7b\xea\x18\x36\x17\x3e\xd0\x1d\x9b\x7b\xea" + "\x3c\x63\x73\xe1\x04\x86\xcd\x3d\x75\x7e\xb6\xa1\xdd\x89\xcd\x3d" + "\x75\x2e\xd8\xfc\xe9\xd6\xa4\xb6\x9c\x85\x73\x02\xc3\xe6\xc2\x39" + "\x52\xdb\x8b\xc4\xb6\xc3\xbd\x76\xba\x62\x73\x61\xb6\x57\x1d\x66" + "\x7f\x6c\x05\x3e\x54\x9d\xe2\x16\x45\x3b\x20\xa6\xe5\x8d\x63\xa3" + "\xa1\x4f\xd6\x86\xfb\xc9\x53\x6e\x12\xa1\x6b\xf4\xaa\x36\xe8\x1b" + "\xb7\xb5\xc5\x05\xd1\xe1\xdf\x8c\xa5\x9d\x5a\x02\x75\x0f\xa1\x6d" + "\xfa\x60\x90\xd9\x38\xf8\x1c\x59\xb4\x9a\x84\xc2\xa1\x2d\x12\xe5" + "\x0a\xdf\xc3\xe9\x1a\xed\xf0\xbc\xd5\x64\x7c\x48\x2b\x09\x82\x3a" + "\x44\x87\xa4\x6b\x48\x88\x9d\x84\xe2\x77\x9a\xf1\xbe\x1d\xfa\x6e" + "\x4a\x1c\x17\xe5\xd5\x70\xbf\x94\x10\x4a\x57\xea\x09\xf4\xe3\x82" + "\x40\x07\xda\x12\x8e\xee\x74\xac\xd1\x73\x34\x78\xff\xa7\x74\x7d" + "\xb4\x50\x27\x7e\xdc\xd6\x9d\x80\xa1\x9d\x34\x2d\x0e\xef\x1b\x81" + "\xfb\x1a\xd3\x9f\x6e\x2d\xa7\x6d\xda\xe1\xb9\x67\xc9\xf8\x92\xd5" + "\x64\x5c\xf1\x6a\xa2\xa7\x9d\x7a\x1c\x67\x8c\x7e\xe2\x69\x0d\xea" + "\x3d\x9a\x72\x70\xaf\xd5\x70\x2f\xd0\xa5\x23\x17\xee\x65\x87\x7b" + "\x7d\x0b\xf7\x3a\x03\xf7\xca\x80\x7b\x65\xb0\x7b\xf9\x27\xf3\x45" + "\x07\x7a\x1a\xbf\x8e\xda\x38\x06\xd7\xd9\xfd\x2a\x24\xe5\xd2\x48" + "\x1c\xcb\x6e\x59\x1f\xe7\x27\xde\x63\xbd\xbe\xff\xb2\xe5\x6d\x12" + "\x46\x55\x61\xd9\xb3\xb3\x3e\xa7\xd8\xc7\xce\x7a\x9b\x8c\x47\x9b" + "\xab\x6d\x3f\x4d\xa8\x3a\x2c\xfb\xa0\xbe\xc9\xdf\x7b\x79\x9d\xff" + "\x9c\x93\x41\xeb\x3a\xc3\xa0\x5f\x68\xdc\xdf\xb8\x85\xa3\x29\x1d" + "\x61\x06\xeb\xe1\xa3\x1d\xe4\xc9\x14\x1c\x2f\xa7\x29\xba\x47\x49" + "\xd0\x09\xee\xa9\x69\x69\x9f\xe0\xd8\xe3\xe2\x50\xd7\xb1\xc7\xc5" + "\x70\x87\x25\xc7\x09\x17\xa7\x22\x5c\xfc\x36\x02\xf9\x5c\x8f\xa5" + "\xd5\x51\x6f\x8c\x21\xa9\x76\xfa\x15\xf4\x67\x4d\x79\xd0\x0f\x8e" + "\xba\x41\x61\x35\xaf\xc6\xb1\xb8\x25\xc7\x40\x7e\xdf\x80\x0f\x0a" + "\xc1\xef\x58\x5e\xd2\x0a\xf2\x93\x53\xdc\x92\xa3\x21\xad\x97\x46" + "\xda\x55\x95\x41\x76\xe8\xbf\x75\x6a\xcd\x49\xe7\x8c\xfb\xcd\x9d" + "\xd8\xa7\x5d\x88\x3c\xb0\xb8\x26\x44\x61\x80\xbe\xf6\xd8\x68\x4a" + "\xb5\x38\xbe\x1c\x5d\x08\x07\xea\x5e\xd0\xfb\x70\x5b\x39\xe2\x03" + "\xb1\x58\xc2\xd2\x35\x88\xc7\x2d\xa2\xcf\xb6\x0d\xb9\x31\x06\x6d" + "\xc0\x01\xd7\xa7\x7d\x49\xc2\x2c\xc7\x1d\x04\x30\x1d\xfd\xa4\x23" + "\x08\xed\x28\xda\xfc\xe8\x47\xe4\x64\x12\xe1\xd2\xbe\x23\x6a\xc0" + "\x90\x0a\xed\x81\x07\x7b\x88\x3a\x1e\xd2\x0e\x76\xcd\xa7\x7e\x4f" + "\x42\x90\x27\x70\x0d\x67\x0b\xf4\x18\xf9\x6f\xf5\xc1\xaf\x24\x92" + "\x50\xfb\xb7\x71\x23\x6d\xdf\xc6\xfd\xe4\x25\x9e\x84\x06\x27\x11" + "\x4d\x51\x22\x60\x77\x39\xd8\xc7\x19\xb0\x8f\x26\x66\x1f\x5d\x78" + "\xdd\x74\x22\x12\xdf\x0f\x12\x6c\x23\x57\xb4\x8d\x35\x80\xd7\xd5" + "\x4e\xdb\xb0\x2f\xd7\x73\x45\x1c\x25\x50\x47\x90\x7b\xac\xb2\x24" + "\xf5\x52\xe4\xfd\x18\x3a\x26\x7d\x0e\xf0\x2e\xb4\x95\xda\xdf\x01" + "\x5d\x0c\xbd\x81\xd3\x41\x9f\x3f\xe8\xf0\x9c\x46\xe2\xec\xd3\x3d" + "\x35\xbd\x63\xb4\xc1\xaa\x7b\x90\x7e\x7b\x82\x5b\x52\x0d\xe9\x41" + "\xba\x87\x7f\xa6\x01\x3d\x4e\x67\x7d\xc0\xa7\xa6\xe1\x78\x82\x95" + "\x5b\x82\xeb\x01\x09\xcf\x50\x8e\x08\xe3\xa7\x71\x4a\xc8\x4b\x1c" + "\x20\x73\xbb\x2a\x2b\x89\x57\xed\xaf\x37\x2f\xed\x10\x6c\xb3\x13" + "\x74\x70\x32\x81\xa0\x07\xe4\x80\x1b\xd4\xc0\x09\xc8\x19\x73\x04" + "\xce\xc8\xfe\x26\x6c\x83\x95\xf2\x51\xb1\x43\x28\xc8\x25\x08\xc7" + "\x90\x9e\x48\x22\x74\xe3\x69\x90\x51\x6b\x3d\xf2\x4b\x30\xbf\x86" + "\x71\xc8\x2b\x20\x1f\x75\x13\xd1\xd0\xbc\x31\x73\xde\x4e\xad\x1a" + "\xea\x00\x9c\x23\x8f\x84\xa4\x2b\x86\x81\xae\x82\x8d\x68\xe7\x60" + "\xf7\x21\xe9\x02\xaf\x09\xba\xb5\xaf\xd1\x8f\xed\x5c\xa3\xd7\xc1" + "\x31\x46\xe2\x1a\xdc\x37\xac\x08\x79\x26\x27\x36\x01\x79\xc6\x92" + "\x62\x25\x76\x90\x65\x30\xfa\xa5\x35\xfa\x30\x41\xa6\xbf\x03\x99" + "\x2e\x21\x41\x13\xdb\x89\x02\xea\xa5\x81\x3a\x93\x9a\xb8\x13\x04" + "\x65\xec\x00\x3b\x42\x39\x77\x22\x07\x01\xd6\x20\x4e\x49\x9a\x15" + "\xaf\x23\x07\xf5\xc7\x08\xae\x03\x95\x76\x8e\x7e\x81\xe3\xb7\x96" + "\x14\x3b\xd8\x5c\x25\xf2\x08\xc8\x6d\x49\xd9\xe1\x39\xed\xc4\x3b" + "\xa6\xe3\x73\x9d\x98\x8e\xcf\x75\x62\x3a\xde\x28\x3c\xff\x90\xe1" + "\xfa\x5c\x01\xe0\x5a\x25\xc7\x75\xdc\x6b\xe7\x15\xd7\xb3\xfd\xc7" + "\xf5\x4b\x67\x64\xb8\x4e\xbd\x30\xb8\x3e\x12\x2d\xe0\x7a\x48\xe7" + "\x68\x01\xaf\xdb\x2d\xf6\xbf\x11\x2b\x17\x9f\x22\xe1\xf6\xd0\x5f" + "\x10\xb7\x4b\xf7\x5d\xac\xb8\x3d\xd7\xa6\xd7\xc1\xd1\xef\xb8\x85" + "\x32\x7d\xc6\xed\x91\xe8\x0e\x22\xc9\x0f\xf1\x4b\x8d\x61\xd9\xba" + "\x34\x72\x27\xf0\xc4\xb4\x90\xf4\x31\xa4\x46\x90\xe1\x53\xd3\x74" + "\x0f\x53\xfe\x04\xb7\xf4\x7b\xc4\x53\x47\x06\xa5\xbc\x6a\x6f\x4a" + "\xda\x87\x44\x03\xf7\x30\x5b\xec\x6f\x91\x90\x24\x7c\x1e\x95\x15" + "\x49\xd5\x93\xb5\xc2\x33\x2b\x8e\x28\xf9\xdc\xb0\x02\x1c\xbb\xc2" + "\xb1\x45\x47\x6e\xa5\x99\xdf\x6c\x8f\xe1\xd5\x93\x92\xf0\x79\x16" + "\x55\x8f\x8e\x69\xcb\x79\x6a\x9a\xf4\xac\xc5\x63\x6c\xa2\xaa\x34" + "\x83\xbd\x28\x4f\x72\x09\x77\xc1\x27\x07\xf5\xf8\x0c\x3e\x87\xc0" + "\xa7\xb0\x6f\x9d\x7f\x7e\xee\x29\x71\xff\xe7\xca\x50\x91\x07\xd7" + "\x0a\x36\x78\x23\x51\x9f\x12\xbf\x43\x7d\x8e\x4a\xcf\x6e\x9c\xf9" + "\xbb\xe4\x91\x84\xf7\x06\x99\x28\xd9\xf3\x24\xf6\x5b\x56\xde\xd3" + "\xc2\x6f\xa2\xd4\x41\xfb\x0d\xf8\xdc\x17\xb0\xa4\x68\xa3\x71\x77" + "\x88\x9f\xb7\x23\x56\x71\x0c\x16\xe3\x3c\x91\x6b\x53\xd8\x7d\x13" + "\x66\x82\x1f\xae\x93\xdf\xd7\x93\x3c\xac\x5c\x82\xd7\x3d\x7d\xfc" + "\x93\x45\x82\xd7\xfd\x1f\xa7\xeb\x1d\xd4\xcf\xb2\xbc\xbe\xff\x49" + "\xc3\x0c\xa5\x51\xdb\x1d\x66\xbe\x33\x3a\xe4\xe0\x86\xd3\x7e\xc6" + "\x25\xcb\xbc\xf6\x7f\x1d\xaa\xbd\xf9\x51\x37\x8c\x21\x8e\x42\x03" + "\x3e\xbb\x52\x61\xac\x55\xab\xb7\x13\x8c\xb7\xde\x58\x6a\xe5\x3a" + "\x21\x66\x0c\x06\x7b\x9c\xdd\x5a\x49\xb7\x9c\x82\x18\x75\x4d\x74" + "\x48\xde\x52\x32\xd5\xfe\xad\x76\xf8\x73\xc0\x41\x1d\xc0\x07\x1d" + "\xdf\xc6\x85\xd4\x26\xb5\x13\xbe\xc8\x50\x6a\xb1\x57\x91\x12\xc8" + "\x87\xfc\x8b\xf5\x3d\xf7\x6d\x74\x70\x4e\x22\x3e\xbf\xf8\x9e\x98" + "\x17\xfe\x05\xf8\x37\xf1\x86\xa1\x1b\x81\x73\x80\x33\x04\x1e\x0e" + "\x80\x83\x3b\x9e\xb9\x31\x66\xd6\x7c\xda\x5e\x7b\xfc\x23\x92\x56" + "\x43\x34\x69\xab\x88\x1a\xcb\xb7\xd8\x6b\x18\x2f\x3f\x02\xbc\x0c" + "\xbf\x8b\x65\xbc\x2c\xcc\x2f\x70\xe3\x65\x8c\xbf\x6b\x1b\x1a\x49" + "\x70\x2b\xb9\x74\x76\x6b\x48\x7b\x6a\x2b\xe5\x31\x1e\xb7\xd8\x4f" + "\xe3\xbb\xc7\xc1\x12\x47\xbf\x0c\x71\x47\xe7\x72\xc6\xcf\x45\x22" + "\x3f\xbf\x7c\xa6\xef\xfc\xfc\x72\x06\xf0\x33\xc4\x7b\x2f\x21\x37" + "\x03\x2f\xef\x38\x69\xe3\xec\xc0\xc5\xfe\xe9\x76\xb9\xd7\xf9\x1f" + "\xb3\xc1\x7f\xa2\x4e\x11\x3b\x35\xdb\xed\x38\x1f\xe1\x2b\x47\xf0" + "\x2e\x2b\xfa\xc7\x0e\xf0\x8d\x6f\x2c\xad\xe7\x82\x53\x40\xb7\x49" + "\x95\xd4\xbe\x32\x3a\x84\x76\x46\xab\x1d\xc6\xbd\xf9\xf6\x4e\x6d" + "\x50\x67\x27\xe8\x17\xf8\x02\xfc\x95\xc6\xb6\x3e\x4e\x90\x09\x3f" + "\xda\x50\xca\x6f\x8a\xac\x02\xdf\x34\xa5\xf8\x0c\x99\x44\x73\x77" + "\x03\xa7\xee\x56\x75\xe6\xee\x56\x02\x2e\x83\xcf\x19\x51\xe7\xe7" + "\xcc\x7c\xee\x6e\x1d\x9f\x67\xb2\x3a\xd4\x7b\xf3\x6d\xea\xdd\x41" + "\xf0\x5b\xcb\xaf\x07\x1c\xac\x23\xc2\x33\x2d\xdd\x6c\xf4\xc3\x49" + "\x37\x7b\xc2\xc1\x4b\x19\xfe\xf9\xe2\x59\xd1\x80\x83\x7a\xc0\xc1" + "\x77\x72\x1c\xbc\x8b\xfb\xc9\x30\x2c\xcc\x63\x58\x00\xb9\x0b\x7d" + "\x99\x2e\x3f\xfd\xe0\x61\xcf\x78\x38\xee\x1b\x1e\x3a\xbe\x75\xc5" + "\x43\x61\x80\x78\x00\xff\xaa\x2d\x86\x7e\xd3\xb9\x6f\xf5\x5c\x21" + "\xe2\xe1\x98\x13\x0f\x6f\xfe\x3f\x1b\xd7\xe9\x37\x1e\x9e\x0e\xf5" + "\x0f\x0f\xbb\x63\xfa\x86\x87\xfb\x74\x32\x3c\x18\x00\x0f\x46\xc0" + "\x43\xa6\x13\x0f\xdf\x23\x1e\x4a\x65\x78\xc8\x86\xdf\x05\xdd\xf1" + "\xb0\xe2\xae\x81\xc5\xc3\xd0\xe6\x1f\x07\x1e\x56\x7a\xed\xff\x7a" + "\xc1\x43\x1f\xf9\xe1\xbe\x14\x27\x1e\x2a\x80\x1f\x2a\x80\x1f\x2a" + "\x64\xfc\x70\x1a\xf0\x50\x21\xe3\x87\x0a\xe0\x87\x0a\x0f\xfc\x90" + "\xfc\xc0\xc0\xe2\xe1\xb2\x13\x3f\x0e\x3c\xac\x9a\xe4\x1f\x1e\x2a" + "\xfa\xca\x0f\x75\x32\x3c\x00\x3f\x54\x00\x3f\x54\xc8\xf8\xe1\x33" + "\xc4\x83\x8c\x1f\x2a\x80\x1f\x2a\x3c\xf0\xc3\xea\x05\x03\x8b\x87" + "\x11\x1f\xfd\x38\xf0\xb0\xc6\xeb\xf8\xb7\x17\x3c\xf4\x91\x1f\x66" + "\xe8\x9d\x78\x30\x01\x3f\x98\x80\x1f\x4c\x32\x7e\x78\x17\xf0\x60" + "\x92\xf1\x83\x09\xf8\xc1\xe4\x81\x1f\x52\x9e\x1e\x58\x3c\xdc\x9a" + "\xf3\xe3\xc0\xc3\xda\xb9\xfe\xe1\xc1\xd4\x47\x7e\x98\x61\x90\xe1" + "\x01\xf8\xc1\x04\xfc\x60\x92\xf1\xc3\x46\xc4\x83\x8c\x1f\x4c\xc0" + "\x0f\x26\x0f\xfc\xb0\x2e\x7d\x60\xf1\xf0\xd8\xdd\x3f\x0e\x3c\xac" + "\x8f\xed\x0d\x0f\x12\x16\x10\x17\x88\x85\xce\xb4\x68\x82\xfd\x8c" + "\x37\x4e\x31\x3c\x20\x0e\x04\x4c\xb4\x44\x87\x38\x00\x0b\xf6\xf5" + "\x80\x85\x0e\x86\x05\x94\x05\xe2\x01\xfb\x15\xd8\x9f\x40\x4c\x38" + "\xa0\x4f\x61\x57\x43\x9f\x22\x5d\xa9\x45\x1c\x74\xa8\x7a\xe9\x57" + "\x74\x10\xa1\xef\x87\x7d\xbc\x33\xdc\x86\xcd\x9e\x70\xf0\xb2\x9f" + "\x63\x7c\x5d\xfd\x4b\x17\x1c\x1c\x74\xe2\xe0\x11\x2f\xfd\x8a\x87" + "\xbd\xe0\xc0\xea\x03\x0e\xce\x74\xef\x67\xf6\x15\x07\x1d\xcb\x45" + "\x1c\x60\x3f\x93\x17\xfb\x99\x0b\xa1\x9f\xa9\xf6\x17\x07\x1b\x13" + "\x02\xc3\x41\x45\x8c\x7f\x38\xb8\xaf\x0e\xe3\x04\x86\x83\x0a\xa3" + "\x5d\x0d\xb1\x82\x0b\x0e\x7a\x88\x17\x5c\x70\x90\xba\x75\x60\x71" + "\xe0\x16\x2f\xfc\xcf\xe2\x20\xcd\xeb\xfb\xbf\x3c\xe8\x1d\xf9\x1e" + "\xc7\xed\xf1\x3d\x93\x60\x1b\x1b\x37\xc2\xf7\x4d\xb6\x24\x92\x71" + "\xe8\x23\x1c\x6b\xa2\x43\x8c\x67\xc8\xd4\xcd\x89\x44\x69\x5f\x09" + "\xfa\x5f\x41\x94\x1d\x1c\x21\x1d\x2b\xe3\x42\xaa\x1b\x6c\x6c\x0c" + "\x09\xe7\xa3\x42\xfe\x4e\x23\x1b\x43\x72\xb4\x44\x07\x6f\x6e\x66" + "\x73\x60\xcd\x4f\xbc\x0a\xba\x35\x2c\xf3\xa4\xdb\x57\xfc\xe0\xfa" + "\x0e\x39\xd7\x9f\x76\xd5\xad\x9c\xe7\x0b\x33\x64\x63\x48\xb3\xbd" + "\x8c\x21\xf9\xa0\x53\x61\x6c\xff\x0c\xe3\xf9\xae\x31\xa4\x3e\x8e" + "\xf1\x77\x02\xc7\xbf\xcc\xb9\x72\x7c\x60\x3a\x4d\x8f\xec\x69\xdc" + "\x11\xed\x1b\xed\x5a\xb2\xe9\x2e\x1f\x8f\x76\x0c\xfa\x3e\x67\xdc" + "\xd5\x20\xf8\xfa\xf5\x4e\x9b\x46\x5b\x46\xbb\x46\x3b\x16\x7c\x3d" + "\xae\x49\xbc\x69\x46\x7d\xb1\x6c\xec\xc8\xa1\x16\x79\xde\x03\xc7" + "\xf3\x3d\x72\x7c\x86\x47\xfd\xff\x10\x38\x1e\x71\x20\xd9\xf7\xc5" + "\x67\xdb\xcf\x78\x9f\xff\xe5\x13\x0e\x76\xc7\xf6\x8e\x83\xdd\x31" + "\xfc\xa6\xfb\xc7\xcb\x70\x60\x00\x1c\x00\xcf\xb3\x31\x23\x86\x03" + "\xe7\x98\x11\xef\x3e\x66\xe4\x82\x83\xcc\x55\x03\x8b\x03\xb7\x31" + "\xa3\xff\x59\x1c\x64\x45\xf7\x11\x07\x3e\xf0\xc1\x6e\xe0\x83\xfb" + "\x0d\xc5\xb2\xb1\x22\x87\xba\x02\xf8\xa0\x42\xc6\x07\xce\xb1\x22" + "\xde\x7d\xac\xc8\x05\x07\x9b\x36\x0e\x2c\x0e\xdc\xc6\x8a\xfe\x67" + "\x71\xf0\x6c\x4c\xdf\x70\x50\xe1\x03\x1f\x54\x20\x1f\x1c\x95\xe1" + "\x00\xf8\x40\x8c\xfb\x3c\xc4\x7c\x7c\x8f\x31\x5f\x76\xd6\x0f\x35" + "\xe6\xbb\xb8\x71\xb0\xd9\xeb\xb3\x52\x1f\x71\xe0\x03\x1f\x54\x00" + "\x1f\xcc\xd4\x17\xcb\xc6\x86\x1c\x6a\x13\xf0\x81\x49\xc6\x07\xce" + "\xb1\x21\xde\x7d\x6c\xc8\x05\x07\x39\xb9\x03\x8b\x03\xb7\xb1\xa1" + "\xff\x59\x1c\x3c\x97\xd4\x37\x1c\x98\x7c\xe0\x03\x13\xf0\xc1\xcc" + "\x0d\x32\x1c\x00\x1f\x98\x80\x0f\x4c\x32\x3e\x70\x8e\x09\xf1\xee" + "\x63\x42\x2e\x38\x30\xfe\x7e\x60\x71\xe0\x36\x26\xf4\x3f\x8b\x83" + "\x5c\xaf\xf3\x2a\x24\x0c\x74\x8d\x01\x50\x27\x0e\x04\xdd\xaf\x8c" + "\x0e\xe9\x50\xed\x6a\x90\xfa\xff\xc6\x6e\xfd\xff\x19\xf5\x5e\xc7" + "\x81\xdc\x9e\x2f\x0b\x7d\x83\xbc\x5d\x56\xd6\x4f\xd8\x9b\x8f\xfa" + "\x7f\x6e\x1d\xeb\x27\xea\x1e\x46\xfd\xe7\x79\xd6\xbf\xbf\x63\x82" + "\xb1\xa0\xff\x86\x1e\xf4\xff\xb8\x97\x7e\xc2\xa3\x7d\xd3\x3f\xce" + "\x77\xec\xfc\xb6\x1f\xf5\x2f\x8d\x09\x7e\x46\xb8\x97\xfb\xd4\x5f" + "\xdc\xe2\x55\xff\x1e\xe7\x93\x6c\x67\xf3\x49\x70\x2e\x49\x6d\x63" + "\x23\xd9\x7c\x96\x68\x82\x13\x18\x26\x84\x39\x25\x80\x09\xe3\x29" + "\x32\xd5\xce\xda\xd6\x35\xa7\x04\xd7\x70\x67\xbc\x60\x16\xe6\x94" + "\x48\xe3\x01\x5d\xf3\x49\x9e\xc0\xf9\x24\xf9\x6b\xfb\x3c\x16\x80" + "\xf3\x49\x92\x41\xc7\xad\xa0\xe3\xef\x51\xbf\x07\x5d\xec\xda\x65" + "\x0c\xc0\xdb\x3c\x12\x5f\xc6\x75\xce\xc3\x3c\x12\x61\x0c\xa0\x5f" + "\x6c\x7a\xeb\x4c\xaf\xdc\x0e\x7a\x44\x7d\x5a\xf4\x76\x61\x5c\x57" + "\xb2\x71\x4b\x4a\x1d\xd9\xdc\x41\x34\xd2\xf8\xbf\xa4\x53\xe4\x7b" + "\x0a\x38\xa0\xdf\x46\xab\x51\xa7\xcf\x25\x02\xcf\x2f\x77\xf2\x3c" + "\x7f\x49\x64\x55\xd1\x3a\xe0\xf7\x75\x64\x92\x20\xa3\x60\x93\x95" + "\x8d\x07\xec\xcd\x47\x7b\x47\x7b\xa6\xea\xdd\xda\x4e\xd1\xde\x99" + "\xbe\x6b\x08\xea\x99\xed\xf5\xf9\xfc\x32\xb4\x3d\xd4\x79\xb0\xa8" + "\xf3\x62\x2f\x3a\x17\xf4\xad\xd0\xe0\xba\x21\xf8\x9e\x59\x97\xce" + "\xed\xcf\xc8\xc6\x7f\xe4\x3a\x17\xc7\x7d\x78\xb0\x65\x9f\xe6\x0f" + "\xf9\xa8\xf7\x7e\x1b\xdf\x07\xbd\x17\x8b\x7a\xef\x1a\xdf\xef\x93" + "\xde\x5f\xf0\xfe\xfe\x8b\x8b\xde\x77\xc7\xf4\x5d\xef\xf7\xe9\x3c" + "\xe8\xdd\x20\xea\x3d\x13\xfb\xf9\xa0\xf7\x82\x4e\x71\xde\x48\x77" + "\xbd\x6f\x5b\x7c\xfe\xf5\x3e\xb4\xf9\xc7\xa1\xf7\xdf\x7b\x5d\xff" + "\xcc\x4d\xef\xfd\x60\xef\xf7\xa5\x74\xd7\x7b\x85\x68\xef\x15\x4a" + "\xec\xd7\x53\x75\x85\x68\xef\xa7\x3d\xe8\xfd\xc5\xc7\xcf\xbf\xde" + "\x2f\x3b\xf1\xe3\xd0\xfb\x1f\xbc\xce\xff\x70\xd5\x7b\x45\x7f\xd8" + "\x7b\x9d\x07\xbd\x8b\xf6\x5e\x91\x89\xfd\x78\xd0\xbb\x68\xef\x9f" + "\x79\xd0\x7b\xc1\xbc\xf3\xaf\xf7\x11\x1f\xfd\x38\xf4\xfe\xd2\x78" + "\x1f\xf5\xde\x0f\xf6\x3e\x43\xdf\x5d\xef\x26\xd1\xde\x4d\x4a\xec" + "\xb7\x53\xb5\x49\xb4\xf7\x77\x3d\xe8\xfd\xe5\x59\xe7\x5f\xef\xb7" + "\xe6\xfc\x38\xf4\xfe\x8a\xd7\xf9\x7f\xae\x7a\x37\xf5\x83\xbd\xcf" + "\x30\x78\xd0\xbb\x68\xef\xa6\x4c\xec\xa7\x83\xde\x45\x7b\xdf\xe8" + "\x41\xef\x85\xd3\xcf\xbf\xde\x1f\xbb\xfb\xc7\xa1\xf7\xa2\xb0\xde" + "\x9e\xd7\x4b\xba\x97\xc6\x6c\x84\xe7\xb3\x10\xdf\x4b\xfa\x46\x1c" + "\xa0\xce\x11\x0b\x72\x9d\x0b\x73\x78\x96\xb3\x39\x3c\x18\xb7\x53" + "\xe8\x8b\xd3\x4b\x84\xf9\x1b\x5a\xa1\xdf\x2e\xc6\xf1\x54\xa1\xd4" + "\x62\x2c\xef\x3d\x8e\x2f\x9e\x2c\xe9\x3b\xd0\xbe\x5b\x6f\xfa\x76" + "\xef\x93\x5f\x2c\xfa\x96\xf7\xdf\xfa\x47\xdf\x25\xaa\xc0\xf4\x5d" + "\x11\xe3\x9f\xbe\x2b\x0c\x4c\xdf\xc2\x3c\x8d\x02\xa7\xbe\x2b\x32" + "\x99\xbe\x2b\xb2\xbd\xfb\xf3\xd2\xeb\xcf\xbf\xbe\x5d\xc7\xe4\xff" + "\x77\xf5\x5d\x6a\xef\x69\x0c\x06\x75\x8d\x7a\xdf\xb2\x94\x8c\x7b" + "\x6e\x29\x1b\x5b\xb1\x7f\xab\x45\xce\x57\xa2\xfe\xf1\x1d\x9f\x60" + "\xc0\xc0\x91\x68\x1b\xe9\x68\x8b\x26\xf8\x2e\x0f\xce\xbb\xa8\x8d" + "\xb3\x12\x4b\xca\x61\xb2\x79\x05\xd1\x54\xc7\x34\x93\xd9\xdb\x69" + "\xa7\xe5\xb8\x19\xdf\xf1\x56\x9a\xd7\x1d\x26\x74\xb9\x7e\xf8\x13" + "\xad\x84\x3b\xc3\xfd\xb1\x1c\xe7\x6d\xdc\xd4\x0a\x32\xc1\xf7\x7d" + "\x40\xe7\x9b\xcf\x10\x72\x30\x99\x10\xdd\x12\xd4\xf5\xab\x23\x86" + "\xae\xf2\xf0\x9e\x8f\x3f\xe3\x32\xf2\xb1\x57\x0f\xba\x7e\x85\xeb" + "\x9f\xb9\x19\xd2\xbc\x0c\x97\x71\x99\xbe\xbe\x7f\xd9\x6f\x73\x33" + "\x5e\x6d\xe8\x69\xbe\x0d\xea\x13\x6d\xda\x9e\xc7\xc6\x65\x2c\x29" + "\x55\x04\xe7\xd5\xa0\x0d\x3b\x5a\xb4\x41\xeb\x93\xc1\xd6\xeb\x99" + "\xad\x3f\xd7\x0c\x79\x63\xfe\x43\x10\x1f\x4c\xb7\x9d\x4c\xb7\xcd" + "\xa8\xdb\xff\x10\xba\x52\x3f\xfc\x0c\xf7\x27\x23\xea\x17\xf5\x9a" + "\xf6\x09\xd1\x3c\x89\xeb\xa2\x20\xc7\x03\xbf\x83\x9e\xa7\x94\x2c" + "\x25\x93\xd0\xfe\x1d\xb9\xbb\x95\xf6\x5c\x36\x47\x03\x79\xbf\x53" + "\x55\x19\x94\xb3\x42\xd4\xff\xa3\xa8\xff\x32\x8f\xfa\x7f\x25\xd0" + "\xb1\x77\x51\xff\x01\xbf\xd7\x73\xa1\xec\x7d\x79\x7f\xd9\x7b\x99" + "\xd7\x35\x51\x5c\x71\xc0\xc6\x69\xfc\xc3\x41\x9b\x07\x1c\xbc\xb6" + "\xcd\x03\x0e\x0c\xc0\xfb\x3a\x37\x1c\x64\x8a\x38\xc8\x86\xf3\x05" + "\xdd\x71\xf0\xfa\x55\x03\x83\x03\x1f\xdf\xe7\xf9\xc1\xe3\xe0\xf5" + "\x56\x1f\x71\x10\x00\x1f\x7c\xeb\x01\x07\x7f\x2e\xec\x8e\x83\x0a" + "\xe0\x83\xfb\x52\x5c\x71\x50\x21\xf2\x41\x05\xf0\x41\x85\x07\x3e" + "\xd8\x7e\xed\xc0\xe0\xc0\xc7\xf7\x78\x7e\xf0\x38\xd8\xee\xd5\xff" + "\xbb\xe2\xa0\x22\x00\x3e\xf8\xdc\x03\x0e\xde\x28\xf3\x80\x03\xe4" + "\x83\x3a\x37\x1c\x88\x7c\x50\x91\x8d\xf1\x61\x77\x1c\xfc\xe5\x86" + "\x81\xc1\x81\x8f\xef\xef\xfc\xe0\x71\xf0\xa6\xd7\xf7\x7f\xdd\x70" + "\x10\x00\x1f\x54\x7a\xc0\xc1\x9b\x3b\xba\xe3\xc0\x04\x7c\x30\x43" + "\xef\x8a\x03\x93\xc8\x07\x26\xe0\x03\x93\x07\x3e\xd8\x71\xf3\xc0" + "\xe0\xc0\xc7\xf7\x76\x7e\xf0\x38\x78\xcb\x6b\xff\xcf\x15\x07\xa6" + "\x00\xf8\x20\xcd\x03\x0e\xde\x2a\xf7\x80\x03\xe0\x83\x19\x06\x37" + "\x1c\x88\x7c\x60\x02\x3e\x30\x79\xe0\x83\xb7\x6f\x1b\x18\x1c\xf8" + "\xf8\xbe\xce\x0f\x1e\x07\xef\x78\x7d\xff\x5b\x8e\x83\xce\xae\xfe" + "\x82\x49\xc0\x41\xce\x3a\x86\x83\x8d\x88\x83\x46\x36\x7f\xc7\x28" + "\xe2\xa0\xab\xaf\xd0\xe0\x8e\x81\x77\x4c\x5d\x18\xf8\xda\xd9\x57" + "\xe8\x04\x7d\x0b\xe3\x41\x62\x3f\x41\x1a\x07\x12\xfa\x09\xd0\x4f" + "\xcc\x69\x16\xf5\x2f\x8c\x09\xec\xf4\xac\x7f\x3f\xfa\x89\x2e\x73" + "\x34\xdc\xf5\x7f\x91\xbf\xa7\xd3\x6d\x5c\xe0\x93\xbe\xce\xcd\xf8" + "\xab\x8f\xfa\x97\xe2\x02\x5f\xf5\xff\xb9\x07\xfd\xff\xd5\x83\xfe" + "\x2b\x0c\x4c\xff\xf7\xd5\x49\xf1\x80\x34\x2e\x24\xc4\x03\xdd\xf4" + "\xff\xb7\x01\xd2\xff\xc5\xf9\x7e\x4e\xff\xeb\xff\xef\x5e\xf5\x9f" + "\xcf\xf1\x3b\xe1\x30\xc1\x61\x86\xa3\xca\xc1\x91\xe9\x45\x1c\x2f" + "\xac\x39\x83\x6b\x88\x17\x65\x74\x3b\x7f\x09\xbd\x44\x1f\x8b\x79" + "\x40\x87\x42\xb9\x52\x19\x34\x87\xa0\x1c\xcd\x6a\x45\x0c\xae\x7f" + "\x85\x79\x2f\x95\xca\x52\xa7\x93\x08\xa9\x2c\x68\x9f\x01\xe4\x6e" + "\x0e\x49\x8f\xb8\x04\xf2\x57\xd1\x9c\x84\x4c\xc8\x1b\x24\x94\x99" + "\xae\x14\xc6\xa8\xa5\xbc\x8e\x0c\x05\xae\xd9\x64\x0e\x51\x40\x5e" + "\x56\xe6\x30\x31\x9f\x8e\xcf\x20\x3a\xa1\x9e\x1c\x87\xf7\x73\xaf" + "\xe7\x70\x31\xdf\x38\x79\x1d\xd5\xe9\x11\x42\x79\x62\x9e\xcb\xe8" + "\x25\x0a\x83\xd8\x16\xbd\x3c\x9f\xe3\x6e\x82\x65\x4a\xf9\x54\x62" + "\x59\xe3\x5d\xf2\xbc\x4a\x48\x88\x42\xc7\xea\x97\xc2\x11\xb1\x7e" + "\x6a\xcc\xeb\x18\xfe\x54\xb4\x43\xa1\x0c\xe7\x39\x12\xee\x72\xcd" + "\x26\x22\xe4\x17\xf3\x06\x0b\x79\x2f\x99\x55\x0d\x79\x27\x89\x32" + "\x57\xca\x65\x2e\xe6\x0b\x91\xe4\x28\x3f\xe7\xc8\xe0\xb0\x2c\x3c" + "\xaf\xa1\x97\xcc\xc4\x36\x4c\x95\xf2\x49\xf7\xb3\xc4\x11\x22\xe4" + "\xe5\xc8\xcd\xa2\x4e\x46\x40\x3b\x22\xa4\x7c\xb8\x8e\x9a\x94\x17" + "\x70\x7d\x55\x89\x53\x36\x23\x1d\x39\xcb\xb4\x8e\x74\xe5\x34\xf7" + "\x32\x43\xd2\x15\x56\xcc\x57\xd3\x28\x94\x8d\xfa\xab\x86\xfc\x3f" + "\x11\x65\x14\xc9\x74\xa2\xe9\xd2\x89\x83\xb3\xe3\x39\x73\x31\xab" + "\x6b\xa8\x98\x6f\x66\xf7\x7c\x4a\x79\xbe\xcb\x99\x1c\xd7\xef\x00" + "\xd9\xcc\xe9\x9e\x37\x48\x9e\xf7\x0a\x96\x77\xf9\x4c\xc8\x3b\xb7" + "\x7b\x5e\x8d\x3c\xef\x95\x2c\xef\xd3\xf3\x21\x6f\xb4\x87\xba\x8e" + "\x94\xe5\xd5\xb2\xbc\x2b\x13\x20\xef\xfc\xee\x79\x75\xf2\xbc\x57" + "\xb1\xbc\x1b\xcb\x21\x6f\x4c\xf7\xbc\x11\xf2\xbc\xa3\x58\xde\x55" + "\x1b\x20\x6f\x6c\xf7\xbc\x06\x79\xde\xab\x59\xde\x35\x46\xc8\x1b" + "\xe7\x9e\xb7\x84\xe9\x76\xac\xa8\xdb\x30\x96\x77\x6d\x21\xe4\x4d" + "\xf0\xd0\xb6\x21\x42\xb9\x2c\xef\x68\x96\x77\x59\x12\xe4\x4d\xf2" + "\xa0\x0b\x79\xde\x31\x2c\x6f\xae\x19\xf2\x26\x7b\xd0\x85\x3c\xef" + "\x35\x2c\x6f\x7a\x3e\xe4\x4d\xf1\xa0\x0b\x67\xde\xe1\xcf\x14\x40" + "\x9e\x0d\xd0\xce\x3a\x0f\xb2\x95\x97\x79\x2d\x2b\x33\xab\x14\xf2" + "\x1b\x3c\xc8\x56\x9e\x77\x2c\xcb\xfb\xec\x76\xc8\x9b\xe9\x41\xb6" + "\xf2\xbc\xd7\xb1\xbc\x9b\x77\x42\xde\xec\xee\x79\xc1\xde\x98\x7c" + "\x6f\x11\xe5\x3b\x8e\xe5\x7f\xce\x04\xf9\x8d\x1e\xe4\x8b\xe5\x49" + "\x36\x7b\x3d\xcb\x9b\xb6\x0f\xf2\xe6\x7b\x90\xaf\x3c\xef\x4f\x59" + "\xde\xa2\x58\xc8\xbb\xcd\x83\x7c\xe5\x79\x7f\xc6\xf2\x6e\xdd\x06" + "\x79\x0b\x3c\xc8\x57\x9e\x57\xcf\xf2\xbe\x80\xd8\x29\xf4\x50\xdf" + "\xb1\xb2\xbc\x37\xb0\xbc\xbf\xcf\x84\xbc\xa5\x1e\xf4\x21\xcf\x7b" + "\x23\xcb\x5b\x32\x17\xf2\x96\x79\xd0\x87\x3c\xef\xcf\x59\xde\x3f" + "\x20\xd6\xb7\x7b\xd0\x47\x57\x5e\xf0\x0b\xe3\x1d\xc3\x5f\x4a\x2e" + "\xc1\xfc\x0a\xa5\xb0\x37\x0d\xe5\x04\xff\x2e\xe4\x05\x9c\x98\x45" + "\xbe\x9b\xc0\xca\x7c\x05\xed\x52\x58\x8b\x17\xf3\xd4\xb4\x0b\x7c" + "\x04\xfe\xc5\xfe\x8b\x12\x27\x77\xdf\xc4\xf2\x6e\x41\xec\x96\xcb" + "\x39\x94\x72\x4a\x79\xbe\x89\x2c\xdf\x3b\xc8\x0b\x26\xd7\x7c\x41" + "\xce\x7c\xc3\xff\x34\x1e\xce\xef\x2b\x76\xe3\x63\xa8\xa7\xbc\xac" + "\x9b\x59\x59\xaf\x4d\x82\xbc\x66\xd7\x7c\xf6\x5b\x64\xf9\x6e\x61" + "\xf9\xfe\x3c\x15\xf2\x1d\x70\xcd\xa7\x93\xe7\xfb\x05\xcb\xf7\x57" + "\xac\x5b\x95\x6b\xbe\x08\x79\xbe\x49\x8e\x9c\x37\x04\xbe\x06\xde" + "\xae\x76\x97\x1f\xc8\xfa\x16\x99\x4f\x9b\xec\xc8\x79\x73\xa6\x98" + "\xb7\x4e\x92\xa1\x20\x67\x86\x79\x4e\xc4\xfc\xad\x8e\x9c\xb7\xe6" + "\x8a\xf9\x8e\xca\xfd\x80\xcc\xd7\xfe\x92\x0e\xff\xe3\x34\xd1\x8f" + "\x0a\xfb\x34\x01\xbf\x1f\xf7\x14\x6f\x24\xdd\x48\x2e\x3b\xc5\xed" + "\x0b\x65\xbe\x47\xda\xaf\xeb\x5d\xb6\x6f\x72\xa1\xc1\x1c\xd5\x4a" + "\xed\xf2\xb4\x2d\x1c\xad\x9b\xd8\x4a\x94\xb8\x66\x2a\x55\xef\x6f" + "\xb4\x42\xba\x6d\xb4\xc1\xda\x96\xb3\x4f\x67\x55\xdc\xbb\x13\xd7" + "\xf4\x83\xef\xe3\xad\x24\xb7\x1e\xbf\x6f\xc9\xa0\xed\x20\x13\x05" + "\xee\xef\x52\x02\xdf\xf3\xe0\x10\xf6\x54\x81\xb8\x8e\x6e\x22\x11" + "\xe6\xd5\x76\x72\x32\x85\x70\x7c\x5e\x96\x41\xb7\x02\xd7\x15\xdc" + "\xb7\x96\xae\x89\x9b\x0a\x75\x29\x85\xfb\xc6\x9e\x80\xdf\x42\x5d" + "\xa0\xfd\xe0\x1b\x0b\xcd\x2b\x70\x6d\xd1\x7d\x6f\xd9\xd4\x95\xa5" + "\xf4\x99\xc7\xbe\x4e\x4a\x25\xd7\x40\xfd\x77\xb4\x00\x37\xb4\xac" + "\x89\xbb\x03\xcb\xe0\xd5\x59\x85\x50\xdf\x38\x5c\x93\x90\x16\x98" + "\x0d\x6c\xbd\xc2\x7d\xc2\x7a\xee\x50\x9f\x3a\x1a\x66\xd8\xc9\x77" + "\x64\x1a\x70\x6f\x38\x73\xea\x29\x72\x42\x76\xce\x76\x95\x59\x58" + "\xcb\x10\xda\xb7\xd3\x91\xfd\x8d\x81\x0f\xfa\x66\x03\xcd\x3e\xab" + "\xb5\x24\x58\x09\xdb\x0b\xe6\xdd\x8d\x34\xf8\x11\x0b\x9f\xfd\x4d" + "\x2c\xa4\x07\x59\x5a\x3b\x84\xf4\x13\xdc\xbb\x93\x30\xee\x6c\x09" + "\x6a\x4e\xa0\xd9\xcd\x49\xe6\x51\x1d\xa4\x81\x7b\x37\x02\xcb\xc5" + "\x74\xba\xf9\xac\x16\x65\xc5\x6f\x3e\x1b\x34\x44\x4b\x94\x2d\xc3" + "\x9a\x13\xda\x72\xde\x9d\x2b\xed\x49\x22\xdd\x0b\xcb\xb5\x8a\x65" + "\xc1\xf9\x64\xab\xe2\x67\xf5\x6c\x9d\xc4\x7d\x3b\x7a\x98\x23\x12" + "\x42\x73\xb3\x4c\x90\xbf\x0c\x62\xcb\xb9\x4c\x07\xef\xee\xb4\x2a" + "\xc6\x94\x89\xdf\xf7\x59\x15\x63\x55\xe2\xf7\x2a\xab\xe2\x0e\x8d" + "\xf8\xbd\x6b\xfd\x47\xcf\xeb\x51\x66\x19\x41\xe6\x65\xfc\x2b\xd1" + "\x41\x18\x17\x63\xac\x4f\xd5\x59\x46\xdd\x18\xdc\x87\x70\x7f\x02" + "\xdc\xb3\x8c\xed\x05\xb0\xff\x66\xf8\x0c\x11\x3f\x6d\xe2\x27\xc5" + "\x3c\x02\xae\xc2\xd2\xc3\xa9\x71\x4f\x0a\xca\x3b\xd5\x41\x79\x28" + "\xb7\x0a\x64\xa7\xb1\xa4\x34\x8a\x32\xdd\x2f\xec\x81\x2c\xe8\x14" + "\xf4\x4e\x87\x9d\xd5\x08\xf7\xca\xad\x2c\x95\xd7\x2b\xfc\xe6\x5b" + "\x7e\x31\x69\xf2\xad\xbf\x9c\x72\xdb\x82\x85\x8b\x62\x17\x2f\xf9" + "\x5d\x5c\xfc\xd2\xa7\x12\x96\x25\x2e\x4f\x7a\x7a\xc5\xca\xe4\x55" + "\xab\xd7\xa4\xac\x5d\x07\xe5\x74\xed\x41\x47\x5f\x99\xa6\x68\xe5" + "\x08\xdc\xe3\x6e\xbc\x47\x8d\x50\x17\x48\x63\x78\xd8\xbf\x4f\xa9" + "\xf3\x2c\x4f\x8b\x16\xfa\x3d\x63\x71\xff\xaf\xca\xab\x70\xdf\x1b" + "\xc0\x9e\xc2\x52\x78\xaf\x19\xf7\x4d\x6b\xe0\x2a\x55\xb5\xb6\x7b" + "\xcd\xb8\x6f\xdf\x07\xda\x46\x32\x6e\x2c\xee\xad\xb6\xbf\x1d\xcf" + "\x97\xfc\x94\x90\x03\x70\xad\xa7\x32\xc7\x6a\x88\xf6\x85\x2b\xa8" + "\x6d\xdb\x15\xb4\x09\xcb\xdf\xf6\x22\x6d\xb4\xad\x8f\x23\x79\xf0" + "\x1b\x30\xab\x39\xc9\x55\xd6\x7c\x00\x91\x36\xc4\xd0\x61\xc5\x2f" + "\xd2\x86\xcc\x2b\x68\xc3\x33\x2f\xd2\xa6\x92\x2b\xa8\x75\xdc\x36" + "\xa2\x6a\xcb\xa9\x34\x58\xb9\xfd\xcc\xa6\xe0\x3c\x3f\x7c\x7f\xca" + "\x16\x38\x37\xd1\x4e\x86\x94\xc0\x6f\x48\x6b\xfd\x40\xc7\xea\xfd" + "\x4e\x73\xfb\x50\x28\x2f\x96\x76\x26\x28\xf2\xe0\x3e\x4c\x47\x95" + "\xdf\x1d\x00\xef\x0f\xf7\xb3\x59\xda\x4f\x10\x2b\x57\x69\xc3\xfd" + "\xa4\xe0\x7e\x21\x96\x82\x26\x82\xe5\xbd\xbd\xa2\x7d\xe8\xca\x51" + "\xd4\x0e\x79\xeb\xf8\xf5\x09\x0a\xc8\xb3\x03\xca\x6e\x95\xb7\x47" + "\xbf\x64\x59\xb2\x2e\x71\x55\x42\xc2\x0d\xc3\x89\x5e\xf8\x74\xd9" + "\xf3\x2f\x19\xd7\xa2\x7d\xe1\x45\x7a\x00\xda\x69\x86\xf6\x56\xd5" + "\x40\xb4\x0f\x78\x21\xd0\xa6\xfc\x93\x9c\x79\x3a\xa4\xef\x83\xef" + "\xfb\xa0\xee\x55\x6c\x9f\xb8\x0f\x9f\xa6\x39\x95\x76\xa8\x27\xfa" + "\x1b\x1d\xae\x5d\xdb\xb2\x66\xae\x02\xda\xbd\x0d\xf2\x55\xe9\x46" + "\x91\xeb\xe1\xba\x1a\xa8\x47\x19\x7c\xc7\xfc\x02\x1f\x40\xfe\x03" + "\xac\x5d\x1f\x2e\xc0\xdf\x20\x2b\x73\xd1\x15\xd4\xd8\x96\x63\xde" + "\x8e\x6b\x72\x0b\x7b\x17\xc1\x6f\x90\x4b\x15\xe4\xcd\x6f\x49\x9b" + "\xab\x80\x3e\xa3\xa2\xc4\x59\x66\x0a\xd6\x09\xeb\x81\xfd\xd0\x23" + "\x10\xf5\xf1\x9d\xd1\x64\x42\x3b\x51\x1c\x69\x20\xa4\xf0\x45\x5a" + "\x0a\x47\x21\x1c\x05\x87\xe1\xdc\x21\x38\xaa\x20\xbd\x1a\x3e\x0f" + "\xc3\xe7\x21\x38\xa0\x1f\xab\xc5\x7a\xaf\xdc\x40\x1b\x27\x16\x90" + "\xeb\xb0\x7c\xc0\xd6\x6f\x4f\x70\x75\x55\x58\x77\x5c\xf3\x9e\x0e" + "\x7f\x6f\xaa\xeb\x3a\xe1\xef\xef\x24\x70\x1e\x3e\x0f\xb0\x4f\xf9" + "\xf1\x81\x0a\x8e\xf1\xe2\xf7\x64\xc8\x53\x28\x7e\xcf\x86\x63\x5b" + "\xef\x87\x7b\x79\xde\x0e\x70\x6d\x3e\xe7\xf5\xe5\xf8\x70\xaa\x6f" + "\xf9\x0e\x9a\x08\x57\xa5\x81\x23\xd2\x35\xbd\x4a\xc7\xd2\xaa\x9b" + "\xd8\xef\xea\x76\xf6\x09\xe8\xe1\x6a\x40\x4e\xb5\x50\x7e\x6d\x0c" + "\x4b\xab\x4d\x80\xcf\x72\x38\xcc\xae\xf7\xff\x10\xae\xff\x70\x2e" + "\xea\xb3\x33\x03\xfc\x05\xe8\xd2\xca\xbd\xa7\x42\x1d\x6d\x61\xd8" + "\x52\xf0\x54\x48\x0b\x02\x6c\x15\x3a\xf1\xf3\xbe\xc3\x15\x3f\xef" + "\x37\xba\xe1\x27\x1f\xb9\xc8\xca\x99\xe7\x96\x30\xbc\xec\x6b\x59" + "\x1f\x0b\xbf\xdf\x47\xdb\xdc\x87\xe3\x23\x27\xb9\x0f\x84\xfe\xc5" + "\x96\x53\x84\xa8\xe3\x88\x12\xf9\xa5\x89\xfb\xe0\x76\xc4\x2c\xde" + "\x5b\xbc\x2f\xab\x0b\xd4\x0f\xd2\x4a\xb1\x7e\xcb\xa1\x5c\xf8\x5d" + "\x06\xf9\x4a\x2d\xa4\x59\xaa\x9b\x70\x4d\xce\x52\xc0\xa3\x58\x5f" + "\x2c\x13\xaf\xa3\xce\x76\x05\xe1\x35\xe2\xbd\xbf\x83\x74\xec\xd7" + "\xe2\xbb\x4f\x43\x2c\x76\x2b\x41\x4c\xe2\xa7\xc5\x1e\x0e\xb6\x14" + "\x49\xf8\xb6\x68\x32\x51\x4b\xc2\xc1\xde\x86\x9d\xe0\x3e\x38\x7a" + "\xd3\x06\x12\x8e\xe5\x21\xa7\x5b\xb9\x0f\x0a\x4a\xd0\x16\x59\x59" + "\x82\x1f\xc4\xf2\x0f\x27\x11\xe1\x3e\xc5\x58\x1f\x38\x2f\xbb\xef" + "\x36\xec\xc3\x6e\x59\xc7\xda\x0a\xf7\x2a\x83\xeb\x77\x62\xdb\x51" + "\x9e\x70\xde\x74\x92\x3b\x10\x8e\xe7\x84\x7d\x83\x58\x7b\xca\x70" + "\x6f\x09\x94\x07\xe6\xc7\x7d\x28\xd9\x1a\xe1\xe6\x79\x82\xdc\xe0" + "\x7a\xd4\x07\x85\x7b\x60\x19\x69\x76\x6a\xa7\xc0\x47\x7f\x5a\xd7" + "\x0e\x71\xc7\xc1\x37\x5c\xf5\x73\x20\x5b\xae\x1f\xb8\x6e\x27\x5c" + "\x7f\x80\x42\x1b\x91\x4f\xe0\x9e\x21\x18\x6b\x40\x5a\x3e\x9f\x03" + "\x65\xac\x6e\x17\xc6\x74\xa0\x9c\x97\xa0\x2e\xf9\x58\x0e\xd4\xe7" + "\x80\x58\xd6\xd1\xf7\x36\xb8\xea\x5a\x2c\xaf\x0c\x75\x2e\xd8\xf3" + "\x3a\xa1\x4d\xc0\x5d\x07\xe3\x8b\xd9\x39\x13\xe4\x31\xd1\xce\x48" + "\x82\x7b\x35\x30\x5f\x22\x9c\x2b\x4f\x3b\x27\xe8\xf7\x00\xe3\xb5" + "\x83\x9b\x57\x6e\xa4\x8d\xce\x7a\x1f\x8c\x90\xf6\xbb\x10\xeb\x5d" + "\x8e\xf7\xa3\x6b\xe6\x0b\x7e\x15\xef\x81\xd7\x8b\xe5\xa1\x0f\x28" + "\x97\x64\x75\x13\xd4\x83\xc9\xeb\xc0\x1c\x48\x2f\x43\x2c\x0a\x72" + "\x03\x1e\x6d\x49\x43\x2c\x1e\x9c\x06\xd7\xef\xcb\xc3\xdf\x6b\xf0" + "\xf7\x81\x7a\x81\x63\xbb\xce\x1f\x30\xe2\x79\x4b\x23\xe8\xed\x29" + "\xc0\x12\x4f\xc8\x75\xa1\x24\xbc\x35\x43\x68\xdb\x8e\xd6\xf5\xd3" + "\x14\x1f\xd8\x09\xc1\x7a\x82\x8c\x20\x8e\x38\xd8\x04\xdc\x3f\x1e" + "\xeb\x0a\x7c\x5d\x4e\xff\x14\x4d\xb0\xce\xc0\x67\x62\xfd\xfe\xf1" + "\xb8\xa8\xfb\x72\x6c\x23\xca\xf3\x26\xc6\x7d\x70\xae\x4a\x81\x75" + "\x77\xb6\xfb\x1f\x53\xe4\x32\x16\xda\x0d\x7a\x40\x7d\xa1\x5e\x64" + "\x65\x22\xf6\xf3\xa1\xac\x1d\xec\x37\xc3\x06\xca\x3a\xff\x0a\x5a" + "\x8d\xf9\x9d\x79\xff\xf9\x34\x9e\x4b\x85\x7b\x4f\x4c\x02\x9f\x0e" + "\x76\x81\x7b\x96\x40\xb9\x3b\x70\x8f\x51\x28\xc3\x84\x32\x85\x7c" + "\x07\x11\x8f\xf0\xbb\x5a\xbc\xc7\x01\xf0\xe7\xe3\xe1\x98\xea\xb4" + "\xff\x7f\xee\x72\xc5\xd7\x3f\xdc\xed\x1f\xf5\x9d\xcf\xa7\x45\x12" + "\x01\x0f\x2b\x88\xee\x0c\xf7\xcf\x07\x44\xdf\x21\xea\xfa\x9f\xaf" + "\x7d\x00\xf6\xe2\x2c\xe3\x9f\xe3\xdd\x74\x6d\x12\xf0\xb8\x66\xa6" + "\x02\xdb\x0c\xd7\x9a\xc4\x72\x84\x36\x0b\x78\xca\x10\x30\x50\x4d" + "\xd7\x40\x3b\xbb\x70\xf0\x8f\x6c\x51\xcf\xd5\x6e\x32\x91\xb8\xeb" + "\x28\xee\x2d\x87\x9c\xd4\x96\x41\xee\x68\xeb\x74\xf2\x12\xea\x9e" + "\x17\x74\xff\xcf\xf0\x12\xe6\x6f\x45\xde\xfa\x07\x3b\x7f\x85\x0b" + "\x86\xb1\x2e\x8b\x05\xfc\x62\x5d\xd2\xe6\x63\x5d\x4c\x42\x3d\xd2" + "\x74\x04\xce\x1d\xc7\xfb\x43\x59\x71\xa2\xbd\x4a\x65\x4d\xc5\xb2" + "\x9e\x01\xae\xc2\x3a\xc1\xbd\xab\x04\xfe\xfb\x8d\x80\x83\xdb\xc5" + "\xba\x57\xb5\x67\xe0\xb5\x1f\x84\x9f\xe3\x84\x6b\xab\x20\x5f\x59" + "\x3b\xdb\x7f\x66\x38\x5c\xbf\x1d\xd7\xfc\x3f\xc9\x55\x17\x22\x47" + "\xe3\xf3\x26\xf8\x9e\x85\xef\x86\x02\xa7\x28\xa1\x3c\xe4\x9c\x1d" + "\x12\x2e\x9a\xb8\xea\x55\xb8\x36\x3e\xc8\x7a\x07\xc4\x48\xdb\x51" + "\xde\x88\x65\x88\x91\x26\xb5\xe5\x54\x95\x49\xb8\x85\xfb\x14\xa2" + "\xec\x99\x7e\xaa\xbe\x06\x1c\x9b\x9c\xd8\xaa\xfa\x5a\x94\xe3\x76" + "\x90\x63\x10\xdc\x2f\x5e\x6c\xd7\x76\xc8\x0f\xb1\x58\xf5\x23\x62" + "\xdd\x0b\x58\xfe\x43\x43\x25\x3d\x88\xb6\x5a\x9d\x87\xfc\x2b\xe8" + "\xe0\x50\xa1\x78\x6d\x19\xbb\xd7\xa1\x22\x29\x2f\xc6\x88\x6c\x5f" + "\xa9\x43\x45\xc8\x83\x13\x41\xf7\x02\xf7\x09\xfb\xef\xb2\x34\xb4" + "\x1d\x76\x8f\x6a\x61\x3f\x8a\x67\x20\xee\x71\xe2\xe8\x50\xb2\x1b" + "\x3f\x21\x17\xe7\xd7\x42\x19\xc8\xa7\x88\x25\xe4\x54\xec\xc3\x40" + "\x79\x33\x45\xfb\x91\xea\xfc\x85\x2b\x56\xaa\x6f\x06\xac\x4c\x90" + "\x95\x5d\xe7\xc9\xcf\x95\x30\x0e\x2c\x64\xd7\x1c\xbe\x56\x6c\xdb" + "\x0e\xd6\x36\xf1\x37\xca\x2d\x15\xe5\x76\xe4\x4b\x99\x1c\x41\x6e" + "\x47\x1e\x10\xf3\x9b\x90\xcb\x9d\xf6\x7a\x38\x57\xb2\xe5\xee\x7c" + "\x71\xe4\x2e\xb4\x07\x67\xbd\x0e\xc7\xb9\xf1\x85\xc9\x33\x5f\x1c" + "\x9e\x22\xb6\xb7\xd4\xcd\x36\xc4\x3e\x89\xe8\x5b\x40\x0f\xb5\xd0" + "\x47\x63\x7b\x28\x99\xe7\x21\x7f\xe2\xbd\xe5\x3e\xa8\x98\xc9\x55" + "\xb4\xe5\x23\x13\xba\xeb\xe1\xb0\x5d\x6e\xcf\xa8\x6b\xe4\x04\x2c" + "\x03\x75\x2a\xc4\x95\x90\xc6\xf4\x7a\xf8\x28\x72\x83\x9c\xa3\x21" + "\xef\x36\x9e\xa2\xbd\x1c\x21\xae\xb6\x78\x38\x41\xb4\x45\xe9\xde" + "\x1f\x82\x8e\xc2\x9d\xf7\x3d\x92\xec\x76\x5f\xd4\xcd\x01\x94\x03" + "\x6b\xe3\x91\x77\x25\x9f\x86\xf9\xe1\xda\x14\xb8\x66\xbb\x9b\x7f" + "\xcc\xc7\xfa\xc1\xbd\x74\x02\x67\xbd\x28\x70\x45\x4a\x1b\xab\xcf" + "\x8e\x12\xd1\x4f\x40\x5a\xb8\x98\x96\x22\xfa\x12\x09\x37\xa3\x5d" + "\xeb\x54\x1d\xe4\x39\x3e\x3a\xac\x93\xe2\x23\xa1\x2c\x81\x8b\xaa" + "\x55\x62\xfb\x30\x6d\x02\x4b\x3b\x74\x14\xd3\xf2\x98\x1c\xb6\x51" + "\xc1\x5f\x1d\x4a\x11\xfd\x15\xda\x17\x67\xe5\xaa\x1a\xd1\xc6\xf0" + "\x37\x94\x11\x83\xe5\x5b\x0c\x1d\xd8\x87\x28\x80\x73\x99\xc8\x07" + "\xc8\x17\x38\x87\x55\xf8\x9c\x2d\x7c\xbe\x85\xbc\x83\x71\x08\x9e" + "\x87\x7c\xc9\xc8\x45\x90\xfe\x1e\xee\xd5\x4a\xbf\x09\x82\x72\xab" + "\xcb\xc4\x6b\x8f\x09\xb1\xc2\x37\x91\x43\xa4\x34\xe9\x3a\xe0\x86" + "\x2c\xbc\x0e\xaf\x97\xf8\x0b\xb9\xcb\x8e\xdc\x24\xdc\xaf\xe6\x2a" + "\x11\xe3\x42\xbf\x41\x8a\x8b\x3a\x39\x59\x5e\xdc\x7b\x46\xe0\xb4" + "\x9a\x58\xc6\x67\x35\xf3\xf0\x5a\x41\x7f\xc0\x95\xa9\xe7\xe8\x17" + "\x25\x2b\x88\xb2\xb8\x19\x79\xd1\x3c\x97\xd5\xb3\x66\x27\x6b\x47" + "\xcd\x5a\xa1\x1d\x8c\x53\xf3\x59\x5d\xcc\x73\x8b\x3b\x84\x73\xbf" + "\xc7\xb6\xe0\xb9\x2d\xb2\x73\xb4\x53\x8f\xe7\x84\x3d\x96\xdd\xaf" + "\xe3\x3b\xe3\xba\xe5\xc7\xbd\x87\x81\x43\x83\x8a\x5f\x94\xb8\xb7" + "\x36\x5c\xac\xe7\x69\x89\x77\x41\x2e\x1b\x90\x7b\x85\x73\x4b\xc4" + "\x3c\xb3\xc5\x4f\x81\xdf\x6b\x47\x33\xb9\x6a\x39\x51\xde\x99\xac" + "\x1d\xb5\x37\x0b\xfd\xec\x6f\xa2\x41\xb6\xb5\xa1\x92\x6c\xe5\xdf" + "\xd1\x7e\xe0\xfe\x1a\xfc\x2d\xe0\x7e\x83\xd0\x87\x2d\xc4\x3c\x58" + "\x27\xe6\x23\x6a\x54\xee\x31\xf5\x49\xae\xee\x0d\xf4\x4b\x2c\x56" + "\xad\xdb\x2c\x8e\x0b\x11\xf3\x8a\x57\xc1\x2f\xd4\x1e\x95\x38\x86" + "\xb6\x45\x42\x9f\xff\x04\xd6\x51\xd8\x4b\x09\xf7\x13\x91\xe7\x41" + "\x7e\x7a\xa7\xc3\x2a\x96\x59\xbb\x53\xe2\x0d\xe4\x92\xda\xd6\x13" + "\x62\x4c\x67\x89\x29\x16\xb9\xe4\x0c\x67\x59\xe0\x1a\x87\x59\x16" + "\xb8\x72\x46\xdd\x2a\x77\xce\x80\xb8\x39\xb3\x2d\xc7\x32\xc9\x25" + "\x0e\x80\xb4\x9e\xb9\xc3\x82\x3a\xc9\xc7\xfd\xe4\x04\x7e\x12\xc6" + "\xba\x2c\x87\xa4\x3a\x23\x6f\xb6\xac\x97\xc6\x2f\xea\x16\x63\xac" + "\xe6\x76\xbf\x32\x17\xee\xc4\xfb\x49\xe5\x29\x09\xee\x47\x06\x72" + "\xc0\xf1\x16\x4b\xb2\xc8\xf3\xa5\x2e\x5c\x29\xfa\x30\xe4\x49\x57" + "\x5f\x65\x9e\xe7\xea\xab\xea\x1e\xe8\xce\x91\x75\x3a\xdf\x7d\x95" + "\xa5\x1d\x79\x4b\xe2\x48\x57\x2e\xa8\x1b\x57\xec\x12\xcb\x5a\x76" + "\x48\xb1\xac\x93\x47\x2d\x53\x91\xa3\xe0\xfe\x26\xf1\xde\x80\x9d" + "\xfd\xa5\xd2\xbd\x01\x47\x47\x6b\x75\x80\xcd\x1c\x73\x10\x7c\x37" + "\x88\x31\xa0\x60\x9b\x1d\xc2\xde\x45\x35\x55\x80\xbf\xe1\x88\x33" + "\x73\x62\x33\x69\x70\xfa\x8a\x03\x2d\xcb\x25\xf9\x7e\x38\x41\x1e" + "\x17\x16\xbd\x48\xb3\xdb\x72\x3e\x54\xca\xdb\x98\x0b\x69\x5b\xc4" + "\x31\x04\x41\xb6\x42\x59\x75\xf5\x25\x2f\xba\xb6\x8d\xb5\xe3\x43" + "\x15\xb6\x03\xfb\x44\x70\xff\x6a\x8c\x7b\x20\xe6\x83\xef\x55\x73" + "\x4a\xba\x30\xff\x7e\xd9\xb9\x0c\x79\x7c\x65\xde\x81\x5c\x29\xf6" + "\x3d\xab\x20\xde\xc9\x97\x8f\xc5\xcc\xba\x67\x8e\x2e\x69\x45\x7c" + "\x62\xf2\x92\x5b\x74\xf1\x89\xf1\xc9\xf1\x0b\x12\xe2\xd7\x2d\x48" + "\x8e\x5f\x9e\x38\x7e\xd9\x82\xdf\xc5\x2f\xd2\xad\x59\xb0\x52\x17" + "\x9e\x72\x7d\xca\x70\xe2\xcc\xfa\x2b\xdd\x82\x95\x2b\x57\x2d\x5b" + "\x1c\xab\x4b\x8c\x5f\x34\x61\xc5\xe2\x95\x8b\x93\x75\x0b\x56\x2c" + "\x5f\x95\x18\xab\xbb\x3e\xf6\xa6\xeb\xc3\x6f\x8d\x1d\x2e\x1f\x43" + "\x1b\xab\x21\x4d\xfc\xd9\xc6\xc6\x2d\x67\x49\x50\x88\x22\x69\x45" + "\x48\x4a\x7c\x22\x1b\xb3\xfb\x68\xd5\xc4\x6d\x24\x09\xce\xab\x70" + "\x6f\x64\x9a\xf3\x61\x36\x7c\x2a\x31\x1f\xb4\x53\x07\xdf\x31\xb6" + "\x0d\x6b\xcb\xf9\x68\x8a\x95\xfb\xb7\x4e\xd8\xf7\x18\xd2\xa1\x6d" + "\x61\xf4\x6c\x55\x23\xc4\x6c\x49\xf8\x6c\xbd\xe4\x2c\x09\xcd\x5f" + "\x4d\x94\x70\xa8\xe0\xd0\x70\x1a\x1c\xeb\xfa\x28\xc1\xca\xfd\x2b" + "\x9b\x8d\x7b\xfe\x4b\x65\x1b\xd6\x52\x46\xb3\x5b\xca\x98\x5e\xfe" + "\x35\x4c\x1a\x87\x8e\xca\x22\x51\x88\xcf\x13\xdc\xbf\x82\x04\x5d" + "\x01\x96\x71\x0c\xb7\x65\xff\xdd\x11\x10\x0f\x1e\xc7\x31\x58\x38" + "\x37\xac\x95\x23\x2a\xa8\x97\xf2\x83\x0d\xe1\xe4\x05\xb8\xd7\x4a" + "\x2d\xa5\x70\x8f\x3a\x69\x3c\x0d\xda\xa0\x81\xb6\xd4\x8b\xed\xf8" + "\xbb\xd0\x8e\x17\xe9\xb8\x6d\x23\xa1\x7e\xcf\x0b\xf5\xb1\x4b\x6d" + "\x80\x7a\xd7\x5b\xb9\x8f\x62\xa0\x9e\x1a\xac\x97\xa7\xb1\x3e\x1c" + "\xef\x82\x7a\x4e\xe7\x57\x83\xdc\xc6\xb0\xfd\xf0\xb6\x14\x33\xfb" + "\x83\xf6\x6c\x28\x81\xef\x79\xcd\x44\x95\x8b\xfb\x96\x67\x5c\x43" + "\x6b\x5a\xed\xc4\x12\x57\x4f\x42\xd6\x52\x1b\xdd\xdd\xd8\x28\xb6" + "\x29\x09\xb9\xe1\xef\x4b\xeb\x95\xd8\x26\xf0\x15\xaa\x92\x66\xaf" + "\x63\x8b\xca\x17\xae\xa0\xad\xf4\x15\x79\xcc\xf5\x2f\x61\x3f\x67" + "\x8c\xb7\x5a\x32\x70\xff\xeb\x7f\x99\xe1\xde\x5a\x31\x36\x6e\xa5" + "\x9d\xf3\x65\xb1\xd4\xbf\x10\x67\xad\x5e\xca\x0e\x92\xca\xc6\x3d" + "\xd2\xf1\x1a\xa6\xff\xa3\xd3\xe1\x1a\x9b\xb3\xfc\xa3\x3a\xf7\xf2" + "\xb1\x4c\xf8\x6e\x93\xee\xc3\xfa\xe1\x47\x31\x26\xb0\x01\x96\x6d" + "\x5e\xee\x37\xee\xf9\x17\xe9\x51\x0b\xa4\x6f\x39\x47\x94\x90\xf7" + "\x68\xc9\x8b\x42\xf9\x06\xb0\xa1\x06\x2c\xff\x99\x2b\x08\xc9\x84" + "\x3c\x2d\x39\xff\xd2\xb6\x0a\xfb\x95\x1f\x05\xfb\x37\x6b\xdc\xc7" + "\xb1\x45\x3c\xff\xca\x0d\xcf\x11\xcf\x63\x4c\xb8\x0d\xca\x07\x0c" + "\x6d\xf9\x1e\xfc\x30\xfc\xbe\x69\x1b\xd1\xe3\x7d\xe0\x7b\x1d\x8e" + "\x87\x40\x99\x36\xe9\x7e\x14\xf0\x9f\xc7\xb3\x31\x18\x11\x5b\xe3" + "\x71\xec\x3a\x2d\x85\xd2\x0f\x80\xdf\xb1\x8e\x88\xb1\xb6\x9c\x63" + "\xe3\x24\x4c\x01\xd6\x8f\x0a\xb8\x0a\x25\x7a\x9a\x73\x74\x7b\xc9" + "\x48\xc8\x07\xb8\x2a\x06\x3c\x21\xae\x20\xef\x1c\x09\x53\x80\xb5" + "\x3a\xcc\x07\x75\x18\xbe\x73\x5d\x84\x12\x39\xb2\x81\x3b\x76\x10" + "\x31\x46\xff\x70\x7f\x3d\xbd\xf2\xb1\x7a\xa6\xa7\x63\x07\x2d\xed" + "\x4c\x07\x4e\xb9\x1f\x2b\x90\xc9\xbd\x0e\x70\x3c\x1c\xe5\xcc\xc6" + "\xaa\x8f\x1d\x84\xba\xd5\x09\xb1\xf8\x46\xd0\x81\xe0\xab\x8e\x65" + "\xe2\xf5\xa2\x0c\xab\x9d\x32\x3c\x66\xf5\x24\x43\x37\xd9\x29\xd9" + "\x9e\xe8\xc7\x9a\xd0\x56\xda\x72\xfe\x1d\x2a\xed\x73\xee\x49\x97" + "\x70\x0f\xa5\x72\x1b\x09\xc2\x7b\x1c\x08\x15\xf2\x4f\xf3\x74\x0f" + "\x77\x1c\x1f\x28\x25\x04\xc7\xc2\xf1\xba\x71\xa1\x28\xd7\x7f\x6f" + "\xf0\xa8\xdf\x45\x2e\x75\x13\x0e\x9a\xf3\xef\xec\x17\x46\x02\x6e" + "\x58\xfd\xca\x7b\xaa\xdf\x38\x1d\xf3\x8b\xe6\xb1\x88\xe7\x7f\x9f" + "\xb6\x14\x10\x82\x69\xe2\xef\xe3\x2d\xe0\x6b\xdc\xc7\xf3\xbd\x3f" + "\x5f\xf8\x78\x82\xeb\xf3\x85\x8f\xc3\xbc\x3d\x5f\x70\xbd\xef\xc7" + "\xf1\x78\x5f\xbe\x64\xae\xc2\x79\xef\x8f\xe7\xf2\x1e\xee\x2d\x5d" + "\x7f\x53\xa9\xbc\xff\xf2\xf1\x1e\xac\x43\x2d\xf8\x25\x7a\xf5\x5c" + "\x05\x85\x72\x0e\x08\x3e\xfb\x63\x13\x8b\x57\x30\x0e\xfa\xb8\x00" + "\xf3\xb8\xb7\xa3\xeb\x2f\x28\xf4\x3d\xfc\x38\x27\xfc\x18\xfa\x1b" + "\xa2\xc1\xcf\x31\x5d\x79\x38\x97\xcc\x84\x7a\xf8\x01\xb1\xda\x35" + "\x42\x7e\x0a\x7f\x2c\x49\xfc\x6d\x13\x7e\x28\xbb\xf2\x77\x9d\xef" + "\xc3\xdf\x30\x56\x5f\xa1\xbc\x76\xa2\x60\xdf\x74\x5a\x59\x8e\x69" + "\x3d\x5c\x4d\x89\x74\x89\xa7\x3f\x1c\x59\x32\xcc\x85\xfe\xbe\x6e" + "\x8a\x90\x99\x52\xbb\x58\xbe\xf4\x9b\xca\x7f\x63\x8a\xeb\x6f\xf8" + "\x1b\x32\x5f\x76\x83\x6b\x86\xc4\x0a\xd3\xa2\xae\x4b\xe8\x4a\xe2" + "\x4a\x35\xf2\x5b\x6a\x88\x61\xa8\xf0\x25\x04\xff\x69\x87\xf2\xf4" + "\x70\x5e\x17\xdd\x95\xe1\x27\xad\xe9\xb2\xec\x47\x58\xf5\xaf\xdd" + "\xde\x43\x1b\xfd\xfd\x1b\x23\xfb\x7e\x0d\xfb\xb8\x36\xae\x1f\xcb" + "\xef\xf9\x4f\x57\x37\x4c\xfa\xea\x84\xc7\xb5\x4d\x9e\xb2\x3a\xe5" + "\x3f\x76\xa6\x94\x24\x47\xa8\xf3\xfc\xf5\x55\xae\xbf\x7f\x56\xe0" + "\xfa\xfb\x86\xc6\xfe\xa8\xba\x19\xff\x49\xb3\x8e\x00\x9d\x95\x77" + "\x25\x86\xb8\x99\x4c\x48\xbe\x9b\x09\x39\xff\xc4\xda\x0c\x21\xe4" + "\xc6\xa9\xb2\x64\xa5\xe7\xdc\xe7\xe7\x6f\x54\xba\x68\x10\xd7\xd8" + "\x34\xdd\x4e\xde\xe9\x96\x86\xbf\x2f\xd1\x89\x69\x37\xbf\xd7\x2d" + "\xbf\x90\xa6\x93\xfd\x56\x44\xc0\x3f\xa5\x80\xff\xf6\xee\x79\x07" + "\xff\x06\xff\x7c\xf8\x53\xa0\x7d\x0c\xfe\x9d\xa7\x3f\xca\xbc\x38" + "\x30\x91\xf0\x81\xff\xd1\x2e\xa2\xa4\xe2\x09\x2a\x26\x50\xf1\x4b" + "\xbf\xf8\xf1\xc1\xbf\xc1\xbf\xc1\xbf\xc1\xbf\xc1\xbf\xc1\xbf\xc1" + "\xbf\xff\x81\x3f\x85\xbc\x63\x8d\x63\xb2\x97\x8a\x9f\xf2\xfe\x8f" + "\x42\x3c\xe4\x69\x5c\x5f\xae\xa3\xe2\x1f\x31\x44\x98\x75\xa5\x31" + "\x56\x4d\xfe\x9c\xba\xf0\x9d\x49\xb6\xa0\xec\xc8\x2a\xfd\xf6\xb8" + "\x46\x6d\x41\x74\xfd\x14\x53\x4a\xbb\x32\x73\xda\x81\x71\x65\xb1" + "\x0d\xa1\xdb\xe6\x1e\x9d\x54\x9e\xdc\xaa\x32\xce\xac\x1e\xbf\x23" + "\xa1\x29\xac\x70\xfe\xf1\xa9\xfb\x36\xd8\xb9\x8c\xbb\xdf\x1f\xfb" + "\xea\xc2\x13\x23\x9f\x7f\xf0\xa3\x5b\xfe\xb6\xa2\x79\x78\xce\x8c" + "\xc3\x37\xfe\x65\xe9\xa9\x51\x2f\x3f\xfa\x9f\x5f\xed\x5d\xd7\x71" + "\xc9\xa6\xdf\xfc\xe3\xa7\xaf\x2f\x39\x79\xc5\x8b\x0f\xff\xfb\xd6" + "\xdd\xab\xcf\x06\xe7\xcd\xae\xbd\xe9\xed\xc4\x33\x63\x8a\x9f\xf8" + "\x7f\x77\xec\x4f\xe5\x15\xe9\x77\xbd\x77\xed\x1f\x17\x7c\x31\x62" + "\xeb\x03\x1f\xde\xfc\xd7\xa7\xbf\x1b\xb6\xf9\xbe\x43\x37\xbc\x11" + "\xff\xf5\x55\x2f\x3d\xf2\xc9\x6d\x7b\xd6\x9e\x1b\x9a\x35\xfd\xe0" + "\xf5\xaf\x2d\xfe\xf2\xf2\xdf\xcf\x3b\x36\x79\xd7\xaa\xef\xd5\xb9" + "\xb3\x6a\x26\xbc\xb5\xec\xf4\xe8\xa2\xc7\x3f\xbb\xfd\xdd\x8d\x8e" + "\x21\xcf\xdc\xf3\xc1\x75\x7f\x5a\xf4\xdf\x9f\xbc\xf0\xd0\xbf\x7e" + "\xf1\xf7\x95\x2d\x97\x3d\x77\xff\x91\x9f\xbf\xf9\xd4\x37\x57\xbf" + "\xf2\xd8\xa7\xbf\xfe\xbf\xf5\x9d\x97\x3e\x7b\xef\x3f\x7f\xf6\xe7" + "\xdf\x7d\x75\xe5\x1f\x7e\xfb\xf1\x2f\x2b\xd6\xb4\x85\x6c\x89\xb2" + "\x4c\x7c\x67\xf9\xb7\xd7\x94\x3c\xf9\xf9\x9d\x95\x69\xb4\x2f\xf2" + "\x23\xdc\xd9\x96\x81\xd6\x1b\xfb\xd8\x54\x15\xc8\xf5\x94\x53\x88" + "\x7a\x67\x09\x86\xc9\x44\x11\x44\x2e\x51\x06\xd0\x53\x08\xb4\xbd" + "\x5e\xfe\x74\xf2\xeb\x7d\xf9\xc3\xf7\xd1\xf0\x99\xe9\x2f\xe0\xb8" + "\x5a\x48\x71\xf6\xfe\xc7\x78\xbc\x62\x20\xfe\x14\xd0\xd6\x21\x50" + "\x93\xa1\xe4\x12\x90\x4e\x10\x19\x46\x86\x93\xcb\x88\x8a\xa8\x49" + "\x30\x09\x21\x1a\x32\x82\x8c\x24\x3f\x21\xa1\xe4\x72\x72\x05\xb9" + "\x92\x68\xc9\x55\x64\x14\xd4\x3e\x8c\x8c\xf6\x5c\x67\x03\x89\xd0" + "\xc2\x3f\xf0\xff\x1c\x12\x21\xfc\x8e\x19\x4c\x1f\xd0\x74\xb3\x98" + "\x5e\x27\xa6\x5b\x07\xd3\x07\x34\x5d\x77\x81\x3f\xaf\xbd\xa0\x9f" + "\x0a\x08\x0d\x58\x74\xe0\x12\x23\x74\xfd\xb9\xa7\x2a\xc4\xbf\xae" + "\xdf\xa4\x97\xeb\xbb\x95\xe7\x7a\xbd\xfb\x5f\xc4\xff\x1f\x10\x9b" + "\x40\x98\xf5\x0c\x0c\x90\xf9\x84\xff\xc8\xe0\xcf\x34\xc6\x43\x2c" + "\x82\x0d\xa0\xa9\x11\x0e\x06\x11\x30\x49\x18\x2c\x95\x01\x62\x0d" + "\x20\x06\x1a\xbd\xd4\x1c\x88\x9d\x81\xd8\x17\x66\x36\xd0\x51\x0d" + "\x0c\x8c\x4c\x3b\x80\x58\x86\x81\x91\x39\x04\x88\x5f\x30\x30\xb2" + "\x65\x30\x30\xb2\x6a\x30\x30\xb2\x23\xc6\xf3\x19\x05\x76\xc0\x5d" + "\xc9\xc8\x07\x15\x57\x00\xb2\x85\x1d\x90\x2c\x23\xb5\xde\xda\xe1" + "\x1a\xe2\xa1\x60\xa8\x67\xa2\x67\x62\x91\xa4\xa0\x1b\xa0\xab\x60" + "\x64\x60\x60\xa9\x6f\x68\xa4\x6f\x68\xa1\x60\x68\x6a\x65\x64\x66" + "\x65\x6a\xa1\x90\x5b\x59\x94\x69\x68\x90\x9e\xaa\x90\x96\x59\x94" + "\x5b\x9e\x58\x94\x4a\x84\xaf\x49\x06\x40\xaf\x30\xc8\xfe\x85\x38" + "\x13\x39\x86\x18\x19\xe4\x19\x98\x1e\x70\x30\x30\x7d\x5e\xc1\x00" + "\x97\x61\x9c\x00\xf5\x8a\x06\x14\xa3\x02\xc6\x1e\x60\x98\x76\x02" + "\xc3\xb0\x65\x01\x03\x63\x5d\x0c\x03\x63\xd9\x1c\x06\xc6\x35\x02" + "\x0c\x8c\x2b\x1e\x30\x30\x2e\x01\xed\xcc\x5b\xc2\xc0\x38\xf5\x0c" + "\xa6\xd8\xd6\x02\x88\xd8\x25\xa0\xde\xb3\x40\x7c\xec\x03\x03\xe3" + "\xbe\x3b\x10\xb1\xbb\x17\x18\x18\x6f\xec\xa1\x85\xd7\x29\x00\xa4" + "\xc6\x37\x23\x00\x3c\x25\xc4\xe8" ; diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c index 6e8ca67eb98a..5b8bb99776c5 100644 --- a/sys/dev/mxge/if_mxge.c +++ b/sys/dev/mxge/if_mxge.c @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include /* count xmits ourselves, rather than via drbr */ #define NO_SLOW_STATS @@ -103,7 +104,7 @@ static int mxge_verbose = 0; static int mxge_lro_cnt = 8; static int mxge_ticks; static int mxge_max_slices = 1; -static int mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT; +static int mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_DST_PORT; static int mxge_always_promisc = 0; static int mxge_initial_mtu = ETHERMTU_JUMBO; static int mxge_throttle = 0; @@ -2248,7 +2249,7 @@ mxge_transmit_locked(struct mxge_slice_state *ss, struct mbuf *m) return (err); } - if (drbr_empty(ifp, tx->br) && + if (!drbr_needs_enqueue(ifp, tx->br) && ((tx->mask - (tx->req - tx->done)) > tx->max_desc)) { /* let BPF see it */ BPF_MTAP(ifp, m); @@ -2773,6 +2774,7 @@ static struct mxge_media_type mxge_xfp_media_types[] = }; static struct mxge_media_type mxge_sfp_media_types[] = { + {IFM_10G_TWINAX, 0, "10GBASE-Twinax"}, {0, (1 << 7), "Reserved"}, {IFM_10G_LRM, (1 << 6), "10GBASE-LRM"}, {IFM_10G_LR, (1 << 5), "10GBASE-LR"}, @@ -2907,7 +2909,7 @@ mxge_media_probe(mxge_softc_t *sc) if (mxge_verbose) device_printf(sc->dev, "%s:%s\n", cage_type, mxge_media_types[0].name); - mxge_set_media(sc, IFM_10G_CX4); + mxge_set_media(sc, mxge_media_types[0].flag); return; } for (i = 1; i < mxge_media_type_entries; i++) { @@ -3172,23 +3174,23 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, bytes = rx_ring_entries * sizeof (*ss->rx_small.shadow); ss->rx_small.shadow = malloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK); if (ss->rx_small.shadow == NULL) - return err;; + return err; bytes = rx_ring_entries * sizeof (*ss->rx_big.shadow); ss->rx_big.shadow = malloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK); if (ss->rx_big.shadow == NULL) - return err;; + return err; /* allocate the rx host info rings */ bytes = rx_ring_entries * sizeof (*ss->rx_small.info); ss->rx_small.info = malloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK); if (ss->rx_small.info == NULL) - return err;; + return err; bytes = rx_ring_entries * sizeof (*ss->rx_big.info); ss->rx_big.info = malloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK); if (ss->rx_big.info == NULL) - return err;; + return err; /* allocate the rx busdma resources */ err = bus_dma_tag_create(sc->parent_dmat, /* parent */ @@ -3206,7 +3208,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d allocating rx_small dmat\n", err); - return err;; + return err; } err = bus_dma_tag_create(sc->parent_dmat, /* parent */ @@ -3233,7 +3235,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d allocating rx_big dmat\n", err); - return err;; + return err; } for (i = 0; i <= ss->rx_small.mask; i++) { err = bus_dmamap_create(ss->rx_small.dmat, 0, @@ -3241,7 +3243,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d rx_small dmamap\n", err); - return err;; + return err; } } err = bus_dmamap_create(ss->rx_small.dmat, 0, @@ -3249,7 +3251,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d extra rx_small dmamap\n", err); - return err;; + return err; } for (i = 0; i <= ss->rx_big.mask; i++) { @@ -3258,7 +3260,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d rx_big dmamap\n", err); - return err;; + return err; } } err = bus_dmamap_create(ss->rx_big.dmat, 0, @@ -3266,7 +3268,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d extra rx_big dmamap\n", err); - return err;; + return err; } /* now allocate TX resouces */ @@ -3286,7 +3288,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, sizeof (*ss->tx.req_list) * (ss->tx.max_desc + 4); ss->tx.req_bytes = malloc(bytes, M_DEVBUF, M_WAITOK); if (ss->tx.req_bytes == NULL) - return err;; + return err; /* ensure req_list entries are aligned to 8 bytes */ ss->tx.req_list = (mcp_kreq_ether_send_t *) ((unsigned long)(ss->tx.req_bytes + 7) & ~7UL); @@ -3296,13 +3298,13 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, ss->tx.seg_list = (bus_dma_segment_t *) malloc(bytes, M_DEVBUF, M_WAITOK); if (ss->tx.seg_list == NULL) - return err;; + return err; /* allocate the tx host info ring */ bytes = tx_ring_entries * sizeof (*ss->tx.info); ss->tx.info = malloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK); if (ss->tx.info == NULL) - return err;; + return err; /* allocate the tx busdma resources */ err = bus_dma_tag_create(sc->parent_dmat, /* parent */ @@ -3321,7 +3323,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d allocating tx dmat\n", err); - return err;; + return err; } /* now use these tags to setup dmamaps for each slot @@ -3332,7 +3334,7 @@ mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries, if (err != 0) { device_printf(sc->dev, "Err %d tx dmamap\n", err); - return err;; + return err; } } return 0; @@ -3639,7 +3641,6 @@ mxge_open(mxge_softc_t *sc) #endif sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc); return 0; @@ -3660,7 +3661,6 @@ mxge_close(mxge_softc_t *sc, int down) int slice; #endif - callout_stop(&sc->co_hdl); #ifdef IFNET_BUF_RING for (slice = 0; slice < sc->num_slices; slice++) { ss = &sc->ss[slice]; @@ -3701,10 +3701,16 @@ mxge_setup_cfg_space(mxge_softc_t *sc) if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) { lnk = pci_read_config(dev, reg + 0x12, 2); sc->link_width = (lnk >> 4) & 0x3f; - - pectl = pci_read_config(dev, reg + 0x8, 2); - pectl = (pectl & ~0x7000) | (5 << 12); - pci_write_config(dev, reg + 0x8, pectl, 2); + + if (sc->pectl == 0) { + pectl = pci_read_config(dev, reg + 0x8, 2); + pectl = (pectl & ~0x7000) | (5 << 12); + pci_write_config(dev, reg + 0x8, pectl, 2); + sc->pectl = pectl; + } else { + /* restore saved pectl after watchdog reset */ + pci_write_config(dev, reg + 0x8, sc->pectl, 2); + } } /* Enable DMA and Memory space access */ @@ -3733,12 +3739,11 @@ mxge_read_reboot(mxge_softc_t *sc) return (pci_read_config(dev, vs + 0x14, 4)); } -static int -mxge_watchdog_reset(mxge_softc_t *sc, int slice) +static void +mxge_watchdog_reset(mxge_softc_t *sc) { struct pci_devinfo *dinfo; struct mxge_slice_state *ss; - mxge_tx_ring_t *tx; int err, running, s, num_tx_slices = 1; uint32_t reboot; uint16_t cmd; @@ -3765,7 +3770,6 @@ mxge_watchdog_reset(mxge_softc_t *sc, int slice) cmd = pci_read_config(sc->dev, PCIR_COMMAND, 2); if (cmd == 0xffff) { device_printf(sc->dev, "NIC disappeared!\n"); - return (err); } } if ((cmd & PCIM_CMD_BUSMASTEREN) == 0) { @@ -3816,29 +3820,51 @@ mxge_watchdog_reset(mxge_softc_t *sc, int slice) /* release all TX locks */ for (s = 0; s < num_tx_slices; s++) { ss = &sc->ss[s]; +#ifdef IFNET_BUF_RING + mxge_start_locked(ss); +#endif mtx_unlock(&ss->tx.mtx); } } sc->watchdog_resets++; } else { - tx = &sc->ss[slice].tx; device_printf(sc->dev, - "NIC did not reboot, slice %d ring state:\n", - slice); - device_printf(sc->dev, - "tx.req=%d tx.done=%d, tx.queue_active=%d\n", - tx->req, tx->done, tx->queue_active); - device_printf(sc->dev, "tx.activate=%d tx.deactivate=%d\n", - tx->activate, tx->deactivate); - device_printf(sc->dev, "pkt_done=%d fw=%d\n", - tx->pkt_done, - be32toh(sc->ss->fw_stats->send_done_count)); - device_printf(sc->dev, "not resetting\n"); + "NIC did not reboot, not resetting\n"); + err = 0; } - if (err) + if (err) { device_printf(sc->dev, "watchdog reset failed\n"); + } else { + if (sc->dying == 2) + sc->dying = 0; + callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc); + } +} - return (err); +static void +mxge_watchdog_task(void *arg, int pending) +{ + mxge_softc_t *sc = arg; + + + mtx_lock(&sc->driver_mtx); + mxge_watchdog_reset(sc); + mtx_unlock(&sc->driver_mtx); +} + +static void +mxge_warn_stuck(mxge_softc_t *sc, mxge_tx_ring_t *tx, int slice) +{ + tx = &sc->ss[slice].tx; + device_printf(sc->dev, "slice %d struck? ring state:\n", slice); + device_printf(sc->dev, + "tx.req=%d tx.done=%d, tx.queue_active=%d\n", + tx->req, tx->done, tx->queue_active); + device_printf(sc->dev, "tx.activate=%d tx.deactivate=%d\n", + tx->activate, tx->deactivate); + device_printf(sc->dev, "pkt_done=%d fw=%d\n", + tx->pkt_done, + be32toh(sc->ss->fw_stats->send_done_count)); } static int @@ -3862,8 +3888,11 @@ mxge_watchdog(mxge_softc_t *sc) tx->watchdog_req != tx->watchdog_done && tx->done == tx->watchdog_done) { /* check for pause blocking before resetting */ - if (tx->watchdog_rx_pause == rx_pause) - err = mxge_watchdog_reset(sc, i); + if (tx->watchdog_rx_pause == rx_pause) { + mxge_warn_stuck(sc, tx, i); + taskqueue_enqueue(sc->tq, &sc->watchdog_task); + return (ENXIO); + } else device_printf(sc->dev, "Flow control blocking " "xmits, check link partner\n"); @@ -3879,10 +3908,11 @@ mxge_watchdog(mxge_softc_t *sc) return (err); } -static void +static u_long mxge_update_stats(mxge_softc_t *sc) { struct mxge_slice_state *ss; + u_long pkts = 0; u_long ipackets = 0; u_long opackets = 0; #ifdef IFNET_BUF_RING @@ -3904,6 +3934,8 @@ mxge_update_stats(mxge_softc_t *sc) #endif oerrors += ss->oerrors; } + pkts = (ipackets - sc->ifp->if_ipackets); + pkts += (opackets - sc->ifp->if_opackets); sc->ifp->if_ipackets = ipackets; sc->ifp->if_opackets = opackets; #ifdef IFNET_BUF_RING @@ -3912,23 +3944,43 @@ mxge_update_stats(mxge_softc_t *sc) sc->ifp->if_snd.ifq_drops = odrops; #endif sc->ifp->if_oerrors = oerrors; + return pkts; } static void mxge_tick(void *arg) { mxge_softc_t *sc = arg; + u_long pkts = 0; int err = 0; + int running, ticks; + uint16_t cmd; - /* aggregate stats from different slices */ - mxge_update_stats(sc); - if (!sc->watchdog_countdown) { - err = mxge_watchdog(sc); - sc->watchdog_countdown = 4; + ticks = mxge_ticks; + running = sc->ifp->if_drv_flags & IFF_DRV_RUNNING; + if (running) { + /* aggregate stats from different slices */ + pkts = mxge_update_stats(sc); + if (!sc->watchdog_countdown) { + err = mxge_watchdog(sc); + sc->watchdog_countdown = 4; + } + sc->watchdog_countdown--; } - sc->watchdog_countdown--; + if (pkts == 0) { + /* ensure NIC did not suffer h/w fault while idle */ + cmd = pci_read_config(sc->dev, PCIR_COMMAND, 2); + if ((cmd & PCIM_CMD_BUSMASTEREN) == 0) { + sc->dying = 2; + taskqueue_enqueue(sc->tq, &sc->watchdog_task); + err = ENXIO; + } + /* look less often if NIC is idle */ + ticks *= 4; + } + if (err == 0) - callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc); + callout_reset(&sc->co_hdl, ticks, mxge_tick, sc); } @@ -4070,6 +4122,13 @@ mxge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) } if (mask & IFCAP_VLAN_HWTAGGING) ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + if (mask & IFCAP_VLAN_HWTSO) + ifp->if_capenable ^= IFCAP_VLAN_HWTSO; + + if (!(ifp->if_capabilities & IFCAP_VLAN_HWTSO) || + !(ifp->if_capenable & IFCAP_VLAN_HWTAGGING)) + ifp->if_capenable &= ~IFCAP_VLAN_HWTSO; + mtx_unlock(&sc->driver_mtx); VLAN_CAPABILITIES(ifp); @@ -4122,7 +4181,7 @@ mxge_fetch_tunables(mxge_softc_t *sc) sc->pause = mxge_flow_control; if (mxge_rss_hash_type < MXGEFW_RSS_HASH_TYPE_IPV4 || mxge_rss_hash_type > MXGEFW_RSS_HASH_TYPE_MAX) { - mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT; + mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_DST_PORT; } if (mxge_initial_mtu > ETHERMTU_JUMBO || mxge_initial_mtu < ETHER_MIN_LEN) @@ -4549,6 +4608,17 @@ mxge_attach(device_t dev) sc->dev = dev; mxge_fetch_tunables(sc); + TASK_INIT(&sc->watchdog_task, 1, mxge_watchdog_task, sc); + sc->tq = taskqueue_create_fast("mxge_taskq", M_WAITOK, + taskqueue_thread_enqueue, + &sc->tq); + if (sc->tq == NULL) { + err = ENOMEM; + goto abort_with_nothing; + } + taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq", + device_get_nameunit(sc->dev)); + err = bus_dma_tag_create(NULL, /* parent */ 1, /* alignment */ 0, /* boundary */ @@ -4565,7 +4635,7 @@ mxge_attach(device_t dev) if (err != 0) { device_printf(sc->dev, "Err %d allocating parent dmat\n", err); - goto abort_with_nothing; + goto abort_with_tq; } ifp = sc->ifp = if_alloc(IFT_ETHER); @@ -4671,6 +4741,11 @@ mxge_attach(device_t dev) #ifdef MXGE_NEW_VLAN_API ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM; + + /* Only FW 1.4.32 and newer can do TSO over vlans */ + if (sc->fw_ver_major == 1 && sc->fw_ver_minor == 4 && + sc->fw_ver_tiny >= 32) + ifp->if_capabilities |= IFCAP_VLAN_HWTSO; #endif sc->max_mtu = mxge_max_mtu(sc); @@ -4706,6 +4781,7 @@ mxge_attach(device_t dev) ifp->if_transmit = mxge_transmit; ifp->if_qflush = mxge_qflush; #endif + callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc); return 0; abort_with_rings: @@ -4727,7 +4803,12 @@ abort_with_lock: if_free(ifp); abort_with_parent_dmat: bus_dma_tag_destroy(sc->parent_dmat); - +abort_with_tq: + if (sc->tq != NULL) { + taskqueue_drain(sc->tq, &sc->watchdog_task); + taskqueue_free(sc->tq); + sc->tq = NULL; + } abort_with_nothing: return err; } @@ -4748,6 +4829,11 @@ mxge_detach(device_t dev) mxge_close(sc, 0); mtx_unlock(&sc->driver_mtx); ether_ifdetach(sc->ifp); + if (sc->tq != NULL) { + taskqueue_drain(sc->tq, &sc->watchdog_task); + taskqueue_free(sc->tq); + sc->tq = NULL; + } callout_drain(&sc->co_hdl); ifmedia_removeall(&sc->media); mxge_dummy_rdma(sc, 0); diff --git a/sys/dev/mxge/if_mxge_var.h b/sys/dev/mxge/if_mxge_var.h index b25adb4363cb..5c1627f71e53 100644 --- a/sys/dev/mxge/if_mxge_var.h +++ b/sys/dev/mxge/if_mxge_var.h @@ -270,10 +270,13 @@ struct mxge_softc { int dying; mxge_dma_t dmabench_dma; struct callout co_hdl; + struct taskqueue *tq; + struct task watchdog_task; struct sysctl_oid *slice_sysctl_tree; struct sysctl_ctx_list slice_sysctl_ctx; char *mac_addr_string; uint8_t mac_addr[6]; /* eeprom mac address */ + uint16_t pectl; /* save PCIe CTL state */ char product_code_string[64]; char serial_number_string[64]; char cmd_mtx_name[16]; diff --git a/sys/dev/mxge/rss_eth_z8e.h b/sys/dev/mxge/rss_eth_z8e.h index 61e5e929e2e2..ef10b61f7c52 100644 --- a/sys/dev/mxge/rss_eth_z8e.h +++ b/sys/dev/mxge/rss_eth_z8e.h @@ -28,9380 +28,9635 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int rss_eth_z8e_uncompressed_length = 544748 ; -static unsigned int rss_eth_z8e_length = 149961 ; -static unsigned char rss_eth_z8e[149961 + 1] = - "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x3f\xbc\xe6\xcc\x00\x91\x06" - "\x66\x12\x23\x1d\x11\x75\x50\x68\xa3\xf2\x23\x2a\x5a\xb4\xa0\x51" - "\xa2\x85\x4a\x20\x28\xd8\xb4\xa2\x01\x0d\x18\x34\x42\x48\x22\x04" - "\x0c\x99\x30\xa0\x05\x1b\xc8\x24\xa6\x36\x4a\x48\x62\x8b\x2d\xb6" - "\xa8\xb4\xa5\xbd\xb9\xbd\x58\xc7\x12\xdf\x87\xde\x26\x99\xd8\x97" - "\xbe\x2f\xb7\x2f\xde\x0e\xdc\x48\x23\xdf\x00\x23\x19\xc8\x98\xcc" - "\xcc\xfe\x7e\xd6\xde\xe7\x24\x33\xc3\x04\xe5\xf6\x3e\xef\xf7\x9f" - "\xe6\x79\x26\xe7\x9c\x7d\xf6\x5e\x7b\xed\xb5\xd7\x5e\x7b\xad\xbd" - "\xd7\x5e\x87\xe8\x1f\xf8\xb3\x8c\xdb\xf6\x8f\x14\xff\xe7\xdf\x3f" - "\xff\xfe\xf9\xf7\xcf\xbf\x7f\xfe\xfd\xf3\xef\x9f\x7f\xff\x67\xfe" - "\xce\x69\x16\xfa\x83\x9b\xa8\xcf\x95\x64\xf7\xd1\xd9\xf2\x1f\xbd" - "\x22\x42\x48\x36\xf9\x28\xc9\xce\x57\xfd\x47\xb5\x48\xd7\xdc\x94" - "\x74\x83\x8d\x92\xe7\xec\x26\xaa\x1b\x27\x7a\x5e\x79\x55\xf8\xb7" - "\xbc\x2a\x7a\xb2\xde\x24\x6a\x9d\x44\xf4\xca\x38\x11\x00\x9c\xa5" - "\x3e\xfa\x6e\x17\xc3\xd9\x82\x67\x7e\xbf\x75\x9c\xf0\x23\xbd\xd4" - "\x47\xdf\x5b\xca\xe9\x9b\xc7\x01\x56\x1a\x91\xeb\x55\x11\x8c\x82" - "\x9b\xc4\xe5\x19\x66\xd6\x44\x89\xcf\x9e\x38\x38\x0c\xa3\x05\x30" - "\x8e\x5c\x02\x46\xb2\x81\x57\x40\x23\x13\xc3\xeb\x75\x91\x3d\xe0" - "\xf2\x5c\x85\xb2\x01\xb4\x29\x9d\xcb\x56\x23\x8f\x70\x91\xb9\xb5" - "\x2c\x44\x8e\x1b\xc8\x74\x92\xae\xf8\x14\x57\x0d\xd7\x8f\xb9\xbd" - "\x5b\x54\xb9\x49\x0c\x03\x65\x4d\x7d\xae\x2b\x32\x06\xcb\x02\xb6" - "\xa3\x82\x2c\xc8\xfb\xcb\x80\xe6\xd1\x54\x5e\xdb\x15\x7a\x5e\x0d" - "\x79\x97\x1a\x79\xd5\x3b\x6d\x9e\xfe\xee\x2b\x78\x57\x16\xfb\xce" - "\x52\xab\xbf\x4b\xc6\xbb\xba\x38\xfc\x2c\xde\xfe\x10\xa1\x1e\xc6" - "\xc5\xe1\xc3\xf5\x10\x7a\x46\xc7\x8d\x71\x6a\x45\xfe\x4a\xce\x9f" - "\xe5\x10\xa1\xc5\x0e\x92\xb8\x30\xed\x90\x77\xee\xa1\x66\x95\x17" - "\xf7\x13\xb8\xbc\x7e\xef\xc0\xbd\x4c\xd7\xeb\x4d\xe9\x73\x8d\x4e" - "\x8e\xc5\x89\x48\x7f\x97\x8a\x77\xe9\xb1\xef\x7e\x9f\xa1\xbf\xfb" - "\x2a\xde\x65\xc5\xbe\x33\x19\xe5\xec\x78\xb7\xcc\x78\x17\xdd\x4f" - "\x8a\xe3\x2c\xf8\x8d\x48\x22\x1a\x89\xdf\xa8\x24\xa3\xef\x4a\xec" - "\x22\xe2\xbc\x9a\x2c\x62\xa7\xc8\x8d\xb8\x04\x79\xcb\x82\xe4\x18" - "\x4f\xce\x13\x34\xba\x13\x70\x69\xe7\x46\x4a\x72\x16\x89\xa0\xb7" - "\xac\x87\x3a\xfc\x3d\xe4\xf4\x8b\x6e\x6f\xe8\x3c\x55\x9c\xa7\x24" - "\x6f\xe8\x34\x55\xac\x25\x7b\x6b\xf9\x27\x94\x88\x2f\x22\x9a\x20" - "\xe7\x04\x2e\xdb\x45\x1d\x0d\x5d\xe4\x6c\x88\x2d\xeb\xbc\x96\xec" - "\xed\x78\x06\xcd\xad\x8c\x47\xab\x23\x44\xa1\xb1\x22\xb7\xfc\x35" - "\xb2\x38\x27\x92\xd6\x9e\xef\xd1\x71\xf9\x4a\x3d\xe3\xb2\xf5\x14" - "\x25\xfd\x64\x25\xfa\xfe\x14\xf0\xad\x1d\x95\xfb\xee\xc6\xa0\x76" - "\xc8\x3e\x9f\x0e\xd9\x8f\x51\xab\x7d\x36\xb5\x96\x65\xd1\xce\x53" - "\x94\x7c\x28\x38\x8b\x5a\x2d\x0f\x62\x6c\x64\x91\xb7\x07\xf7\x8e" - "\x30\xf2\x04\xc8\xb1\x8e\xd0\xaf\x5f\xd9\x56\xf7\x0c\x25\xf9\x14" - "\x4c\xf4\xe7\x57\xea\x3e\x28\x25\x62\x9a\xf1\x73\xa2\x76\x94\x5c" - "\x4d\x76\xe0\xd7\x0d\x5c\xee\x02\x2e\xed\x93\xec\x94\x01\x9c\x47" - "\x79\xeb\x43\x64\x29\xa7\x2b\x86\x19\x13\x69\x11\x97\x1c\x9b\x3d" - "\x8d\xaf\x8a\x6e\xe6\xad\xde\x17\x72\x31\xbe\x92\x2d\xa8\x7b\x0f" - "\xd7\xb7\x13\x63\xd4\xf9\x06\x59\x7a\xd7\xe7\x9a\x9a\x5e\x15\x5d" - "\x78\xe7\x30\xde\x81\xdf\xbb\xf0\xbe\x7b\x7a\x1a\xd9\xbc\xa1\x4c" - "\x7a\xbf\xbf\xdb\xc2\x30\xc6\x06\xc8\xc4\xf0\xac\x65\x64\x46\x7b" - "\x46\x00\x9f\xcf\x9a\x90\x7e\x23\xf2\xa1\x3c\xfa\xff\xe5\xbd\x5c" - "\x5e\x7c\xf5\xb1\x40\xe4\xab\x8f\x9d\x8f\xfc\xe8\xb1\x5e\xf1\xa3" - "\xc7\xce\x85\x7f\xf4\xd8\x67\xce\x0d\x94\x14\xfe\xea\x63\xfe\x8e" - "\x22\xd9\x07\xb6\x8e\x22\xf4\x41\x98\x92\x36\x9d\x26\xdb\x13\x6b" - "\xd1\xf7\xa1\x8f\x69\xd3\x2a\xb2\x47\x52\x46\xa2\xce\xbf\xd0\x13" - "\xe5\x24\x70\xef\x48\xd4\xbe\xde\xd4\x51\xf5\x8a\x67\x93\xb8\x4d" - "\x47\x7d\xe6\x48\x0e\xd7\xeb\x4f\xb1\xd6\xe3\xd7\x80\x5f\x33\x7e" - "\x7b\x44\xea\xa8\x3d\xa0\x95\x73\xec\x66\x13\x35\xf6\x13\x4d\x8f" - "\x90\x09\x5d\x14\x00\xfe\xb6\x61\xe8\x36\x21\x52\xfb\x90\xed\xeb" - "\x95\x54\xd1\xd7\x57\x40\x2c\x53\x58\x9e\xb0\x7c\xe9\x73\x8d\xc9" - "\x44\x3d\x6e\xc9\xfb\xaf\x8a\x80\x48\x7d\xc8\x86\xf4\xee\xc0\x0b" - "\x05\x26\xff\x0b\x05\x5a\x6f\xea\x43\x57\x22\x4f\x3e\xf2\x1c\xd6" - "\x69\xd8\xcd\xb0\x30\x4e\xfc\x63\x42\x64\x06\xcc\xa2\x7f\xb9\x70" - "\xd4\xb2\xfb\x55\x71\x0c\xf9\xaa\x06\x61\x01\x36\xe0\x80\xfe\x63" - "\x9a\x8d\x34\xd0\xba\x6b\x07\xf2\x71\x79\x6f\x30\x93\xe5\xae\xcf" - "\x5b\xd8\x4d\xd6\x10\x8d\x16\x03\xaa\x3e\xe4\xe9\x66\xf9\x38\x26" - "\x48\x23\xfb\x5c\x94\xc3\xb0\xb9\x9c\xb7\xa7\x9b\x50\xee\x4a\xe1" - "\x2c\x80\x5c\xa2\x05\x7d\xa2\xc0\x04\x59\xdc\x75\x08\xe5\x55\xdd" - "\x63\x93\x0c\x1c\xb9\x0e\xee\x6b\x89\x27\xf8\xe1\x50\x61\x90\xc6" - "\xd4\x93\x19\xe5\x1e\x61\x78\x0c\x0b\x7c\xe0\x43\x5b\xaf\x3c\x54" - "\xe8\xa7\x88\x88\x81\xe9\xd3\xe1\xe5\xc6\xc0\x43\xba\x00\x3c\xe6" - "\xbf\x56\x94\x19\xd3\x2c\xe1\x3d\xfc\x2f\x11\x86\x17\x24\x8b\x43" - "\xe2\xfb\x28\xc3\xe8\x63\x99\x06\x98\x9e\x75\xf7\x53\x0f\x8d\xf5" - "\xf8\x9d\x05\xe6\x8e\x72\x22\x2e\xff\x6e\x45\xf7\x08\xd1\x9b\x6b" - "\x66\x9e\xe3\xf7\xde\xd0\x39\xce\xf3\x86\xe8\x2d\x30\x8f\xe9\x21" - "\x0b\xe3\x8c\xf2\x65\x8c\x67\x74\x5f\x3e\xfc\xc0\xa3\xb3\xe9\xd1" - "\xac\x79\x59\xb3\x29\xfb\xbe\x39\xb3\x29\xe3\xae\xa9\x19\xb7\x7f" - "\x63\xe6\xed\x94\xf3\x9d\x87\x67\x53\xce\x82\xd9\xf4\x08\x7e\xb9" - "\x0f\xce\xc3\xc3\x9c\xd9\xb7\x66\x7c\x6b\x6a\xce\x9c\x79\x0f\xd0" - "\xa2\xc5\xb7\x65\xdc\x76\x1b\xdd\xf7\xc0\xfc\x5b\x33\x32\xf4\xeb" - "\xad\x19\x9c\xe5\x7b\x33\x1f\x78\x64\x6a\x4e\xf1\x9a\xd2\x35\x53" - "\x17\xcc\x9b\x13\x3d\x27\xa6\x87\x2f\x44\x98\xa6\x01\x71\x76\x2e" - "\x45\x20\x23\x1a\xd1\xd7\xf8\xf5\x78\x2a\x4e\x60\xac\xdb\x36\x35" - "\x72\x1f\x49\x39\x39\xf6\x18\xc6\xb7\xa5\xcf\x65\xdd\xea\x33\x8b" - "\x24\xa6\x15\xe6\x1e\xe4\xb9\x6a\x39\xde\x1d\xd7\x65\xf3\x08\xbc" - "\xdf\x13\xfb\x3e\xa5\x0c\xef\xff\xde\xe1\x20\xf2\xe2\x07\xfa\x06" - "\x20\xf3\x40\x47\x3f\xf5\x3a\x73\x47\x80\x8f\x4d\xa8\xa3\x0b\x63" - "\xb0\x13\x65\x7d\x51\x63\xbb\x0b\xfd\xd0\xe9\xd8\x48\xe6\x33\x64" - "\xfd\xd7\x8e\xd2\x4c\xe2\xfe\xf0\x96\xea\x30\xce\x0f\xc2\x18\x2d" - "\x61\xa0\x8f\x01\xe7\x88\x82\x63\x4b\x8f\x92\x03\x3e\x86\xb3\x13" - "\xef\x74\x58\xe1\x0e\xc8\x03\xc8\xeb\x27\x23\xce\x74\x12\x63\xc5" - "\xb2\xc8\x40\xba\x9c\x5b\x50\x6e\x99\xc1\xbf\xc8\x1f\x68\x2d\x42" - "\xbe\x9f\xcc\x35\xa1\xbf\x4d\x98\x3b\xd1\x16\x6b\x21\xf8\x38\x10" - "\xa9\xb5\xee\x15\x7d\xb9\xa4\xd2\x6c\xfb\x44\x2a\x9e\x6b\xad\x6f" - "\x09\x27\xd2\x36\xca\xb4\xb7\x39\x0d\x7d\x6b\xe6\x31\x28\x5e\x90" - "\xe9\x66\xd0\x62\x22\xf0\x3b\x1a\xe6\xf2\x67\x65\xf9\x51\x48\x33" - "\x21\xef\x5b\x91\x54\xeb\xcf\xc1\x2b\x9c\x86\xf9\xfc\xaa\x4a\xc0" - "\xfb\x45\x44\xe4\x92\xb0\x55\xcd\xc4\xfd\x3e\xcf\xc6\x1e\x3a\x59" - "\x44\x9a\x0f\xef\x22\x4e\xc0\x1c\x18\xac\xbf\x93\xcb\xa2\x2e\x4b" - "\xdf\x40\x01\xe6\x50\xdb\x11\xd6\x05\xc2\x8c\xcf\xd9\xc1\x3c\x1e" - "\xae\x93\xc7\x31\xfa\xa2\x07\xfd\x74\x45\x9f\x2b\x65\x7e\x5c\x3f" - "\xe5\x03\xce\x5b\xa0\xfb\x51\xc0\x38\x18\xe9\x45\x1d\x78\x06\x5c" - "\x4d\x87\x6b\xc0\x08\x28\x3e\x48\xa9\x8a\xe3\x83\x07\x00\xfb\x7c" - "\xd4\xfb\x7d\x71\xef\x6f\xc2\xfb\x7e\xfd\x3d\xc6\x53\x4a\x5b\x5c" - "\xfd\xdd\x78\x1f\x41\xfd\x01\x8c\x17\x33\xea\xcb\x69\x64\x3d\x6d" - "\x28\x7f\x28\x36\x7f\xaa\xbd\xd7\x65\x65\x19\xc2\xb2\x50\xe6\x6f" - "\xd2\x79\x55\xd5\x9f\x3a\x25\x2e\x3f\x78\xd8\x3a\x0a\xfc\xc0\xd7" - "\x2b\x91\x67\x14\x64\x91\x05\xf3\xc6\xb1\x43\xe5\xac\xb7\xa5\x2e" - "\x8d\xcb\x5f\x8e\x7c\xe3\x99\x8e\x92\x06\x67\x25\x0d\x72\x74\x3d" - "\x8b\xc7\x42\x12\xca\xb8\xe3\xca\xec\x47\x99\x1b\x22\x8a\x6e\xe6" - "\xbe\xde\x84\x65\x5a\xe3\xca\x74\xc9\xfe\x57\xf5\x58\x98\x5f\x8c" - "\x32\x52\xb6\x0c\xc4\xc0\xe0\xb6\x41\x1f\xbb\x32\x29\x16\x46\x5a" - "\x17\xea\xbd\x79\x87\x1a\xc7\x5f\x41\x9f\xdf\x86\xb4\xbf\x00\xee" - "\xdb\xcc\x27\xcc\xcb\x5e\x7f\x10\xb2\x6f\x6e\xb2\x9a\xc3\xaf\x5c" - "\x65\x2d\x27\xbe\x9f\xca\xf7\x0c\x5b\x0c\xcc\xd7\x79\xfc\xca\x55" - "\xb8\x72\xba\xac\x93\xc7\x96\x18\x78\x28\xa2\x60\x5e\xb9\x03\x63" - "\x50\xc3\x73\x58\xaf\xa3\x1d\xcf\x26\xf0\xe7\xcf\x21\x57\xc1\x93" - "\x73\x99\xdf\x66\x20\xfd\x43\xfd\xfd\x7b\x9c\x1f\xf7\xb7\xea\xf7" - "\xcc\x97\x3f\xd7\xf9\x12\x7c\x9e\xf6\x1b\x59\xb7\xe4\x75\x55\x3e" - "\xa2\xf8\x7a\x0e\xde\xbd\x81\xeb\x3c\x5c\x77\xe0\xba\x08\xd7\x55" - "\xce\xf3\x64\x77\x86\xa1\x47\xa8\xe7\x25\xb8\x3e\x8c\xeb\x7d\xb8" - "\x3e\x82\xeb\x54\x1e\x97\xfe\xf5\x05\x14\xc7\x13\x3d\x11\x35\x16" - "\x47\xa9\xfe\x48\x9b\xa0\x8f\x0f\x35\x3e\xcf\x0e\xa5\x09\x95\xa6" - "\x41\x9e\x0f\xa5\x0d\xcc\x65\xba\xe4\xa0\xed\x41\xae\x5f\x1f\xd7" - "\x23\x54\xbf\xa8\x3c\x11\x55\x4e\xef\x3b\x3d\x4d\xe5\x33\x45\xd7" - "\xe9\xa3\x2b\xdb\x2a\x02\x42\xe0\xda\xc2\x74\x45\xfa\x41\xd0\x04" - "\xfa\xcc\x95\x55\x4c\xa7\xa1\xfe\xbe\x32\x3d\xaa\xbf\xa1\xcf\xa6" - "\x05\x63\xfb\xdb\x96\xc3\x34\xe3\xfe\x36\xf0\x65\xdc\x31\xa7\xf0" - "\x3c\x35\x52\xe1\x6f\xcb\x81\x5c\xef\xe1\xbe\x37\x17\xf1\x78\xb8" - "\x6a\x96\x8f\xf6\x48\x99\xc8\xef\x02\x29\x0f\xb9\xb9\xbc\xb9\x50" - "\xbe\xcb\x85\xbc\x3c\x6a\xbc\xe3\xba\x79\x1c\x9a\x4b\xe5\xbb\x52" - "\xa3\x1c\x64\x66\xa5\x2c\x8b\x39\x8e\xe7\x7c\x9e\xbb\x31\x87\x76" - "\x23\x4f\xbd\x8f\xc6\xd8\x86\xb3\x6f\x44\x95\x28\x9a\x5a\x49\xda" - "\x8d\x95\x34\xc2\x1b\x3a\x46\x0b\x43\x22\x3c\x95\xe8\x0a\x6f\x68" - "\x16\xdd\x44\x94\xe2\x0d\x1d\x21\x34\x78\xa2\x37\x54\x87\x39\x72" - "\x2b\xbf\x7f\xff\x66\x32\x99\x70\x75\xde\x42\x9a\xc9\x1b\xda\x83" - "\xf4\x03\x74\x23\x59\x4c\xdf\x1a\x21\xfa\xbc\xa1\x19\x78\x2e\xa5" - "\x07\x47\x88\xbf\xe5\x85\xc9\x36\xff\x45\xe1\xf4\x86\xf2\xe9\xc1" - "\x17\x23\xc2\x1b\x6a\xc3\xbb\x42\x5a\x18\xfe\x5c\x2c\x0c\xf7\x09" - "\x91\x2c\x2a\x17\x86\xcf\xe2\xfe\x6f\x02\xb4\xc4\xf5\x7d\xfc\x9c" - "\xc2\x0b\x5d\x57\xec\x10\x45\x79\x1b\x34\x1a\xc0\xbc\x22\xc6\x88" - "\x4a\xb4\xcf\x3d\x20\x0a\xcc\x98\x13\xaa\x07\x06\x70\xdd\x29\x76" - "\xca\xe7\x2a\xd1\x0c\x38\xee\x69\x50\xfc\x19\x7f\x6f\xa8\x8b\xf2" - "\x20\x3b\x16\x6e\xf0\x0b\xc6\x7d\xec\x66\x41\x0b\x37\xbc\x2f\x20" - "\xb7\xac\x0b\x37\x38\x05\xde\x25\x01\x9e\xdb\x1b\xea\xe1\x3a\x9a" - "\x01\x6f\xb7\x84\x57\x25\x3c\xc8\xeb\xe7\x7c\xd1\x70\x18\x06\xe7" - "\x5d\x18\x26\x2b\xf2\x7b\x06\x76\x88\xfd\xf8\x75\x0e\xd4\x00\xaf" - "\x54\x4a\x8d\xb8\xd2\x3e\xe0\x39\x4a\xb8\xc9\x81\xe7\x8c\xcf\xc1" - "\x27\x92\x8e\x61\x1a\x25\x6a\xc8\x81\x3e\xcf\xea\x63\xf8\xb5\x94" - "\x23\xf1\xad\xa5\x85\x9f\xf3\x35\x95\x16\x0c\xa8\xf4\x6c\x4e\x0f" - "\x80\x6f\x71\x5f\x14\x50\xef\xd6\xa0\xdc\x62\x59\xce\x4d\x45\xc2" - "\x46\x95\xe0\x41\xf3\xc2\xb0\xa8\x64\x1a\x82\xae\x95\x4c\x47\xb6" - "\x5b\x50\x47\x91\x48\xa1\x4a\xe0\xe3\x46\xf9\x1f\x0f\x88\x74\xc6" - "\x6b\xff\xe7\x0a\xf6\xbb\x80\xb3\xb4\x8f\x61\xda\x68\x3f\x60\x79" - "\x42\x9a\x03\xf4\x10\xc1\x85\xa1\xcd\xa1\xbc\x0d\x64\xf6\x86\x3e" - "\xa4\xf4\xca\x4a\x93\xb7\xac\x14\xed\xac\x02\xcc\x7c\xbc\xa7\x2b" - "\x51\xd7\xfb\x80\xbb\x9f\xeb\x43\x1d\x1e\xc0\x7c\x0f\xb0\xf2\x19" - "\xa7\x7e\x17\xd9\xf0\xdc\xd9\xaf\xf0\xf3\x47\xdc\x26\x5b\xc4\x66" - "\x22\x83\x7f\x98\x77\x14\xdd\x98\x67\xde\xe6\x34\x9b\xc1\x27\x61" - "\x37\xf9\x6e\x21\xb2\x2d\x08\x88\x10\xf3\xca\x74\x2a\x32\x75\x04" - "\x8e\x80\xd6\x49\xd4\x51\x74\x80\x6e\x26\xb6\x9f\x02\xd4\x11\xa8" - "\xc3\xf3\x6e\x62\xfc\x3a\x02\x5b\xa9\xbd\x67\x0f\x2d\x28\x0a\x6c" - "\x0e\xdb\x4c\xcb\xda\x7b\xb2\x09\xe5\xdf\x07\x8e\x91\x27\x8a\x2c" - "\x95\x1d\x45\x01\x7e\x76\xb6\xf7\x80\x3f\xc3\x22\x1c\x72\x53\x67" - "\xc8\x66\x2a\x5a\x70\x5e\xf8\xb3\x7b\x2a\x47\x20\x6d\xc0\x6a\x12" - "\x21\x6b\x99\x53\xb4\xf7\x54\xd1\x13\xe7\xc9\xd4\x5e\x70\x40\xf2" - "\xe9\x13\x45\x45\x24\xcb\x9f\x0f\x59\x1f\xef\xa9\xa4\xc7\x0b\x68" - "\x2c\xf2\x9f\x65\x9e\x15\x63\x2b\xa9\xad\xab\x90\xb2\x4f\x87\xcc" - "\x0b\xce\x0f\x88\xb6\x65\x75\xd4\x5e\x50\xc7\xf4\x90\x76\x46\xf6" - "\xe9\x5e\xb1\xe0\x7c\x9f\x68\x2f\x78\x9b\xda\x96\x1d\xa0\xf9\x9f" - "\x78\xac\xe1\x1a\xf2\x45\x52\x4c\x14\xa9\x31\xd9\xc2\x29\xa6\x65" - "\xa1\x1a\xe0\x92\x62\x2a\x12\xb5\x26\x1f\xe8\x77\x85\xec\x8b\x54" - "\xd3\x7f\xe2\xde\x21\xfb\xd7\x66\xf2\x0b\xb7\x66\x1b\xa8\xd1\x48" - "\xf2\x7d\x8a\xc9\xef\x0d\xe1\x5a\xa3\x81\xc6\x48\x97\xfd\xa8\x39" - "\x24\xef\xa4\x6a\xd7\x73\xbf\x22\x6f\x06\x7e\x99\xf8\x41\xd6\x68" - "\xcd\x80\x95\xc2\x70\x23\x6e\x6d\x7f\xc4\xa6\x35\x0b\x9b\xe6\x81" - "\x5d\xa2\x75\x04\xf6\x50\x18\xb2\xb5\x23\x10\xa6\x05\x6b\x83\x80" - "\x8f\x3e\x28\x0b\x83\x9e\xc7\xe8\x89\xb5\xe4\xf4\x96\x1d\x23\xf1" - "\x7b\x37\xd3\xc3\xba\x60\xed\xfb\x22\x52\xa3\xed\xe7\xf7\x0b\xd6" - "\x3a\x61\x1b\x01\x4e\x8a\xe6\x89\xd4\x6a\x3e\x5d\x57\x62\x3c\xfe" - "\xc6\x78\x0c\xf4\x81\xc7\x30\x8f\xe3\xbd\x5f\xd4\x9a\x9f\xe4\xb9" - "\x23\xc2\x7c\xe7\x36\x2f\x13\x36\xb3\x27\x7b\x84\xf0\x87\x5f\x22" - "\xc9\x03\x91\x7b\x84\x60\xdb\x2b\xaf\x8c\x9a\xe5\x98\x0a\x8f\xaf" - "\x14\x29\x66\x8f\xa8\x31\x2f\x8b\xd4\x8e\xd4\x00\xc7\x2c\xd6\x73" - "\xd9\x91\x3a\xcf\x7c\x2c\xc7\x9e\xa8\x19\x49\x5f\xd6\xce\xef\x73" - "\x8d\x2f\xf7\xd1\x3b\xb9\x2c\xe3\x70\xbf\xcd\x47\xef\x4e\xd1\xef" - "\xeb\x7c\x54\x77\x4c\xca\x47\xc8\xb9\xa2\x0a\xba\xea\x14\x5d\x33" - "\x17\x34\x21\xdc\x27\xe3\x7e\xfe\xc2\x9b\xd0\x6e\xf7\xfa\x02\xf4" - "\x79\x1f\xcb\x1c\xe1\x9a\x01\x7d\x83\x32\xd1\xde\x24\xd1\x97\x9e" - "\x2c\x52\x6d\x77\x8a\x01\x3b\xdb\x92\x56\x3c\x8f\x05\x5d\x27\xe1" - "\x9a\xba\xfb\x02\xa5\xe1\x67\xdf\xed\x8a\x54\xb2\x4c\xc6\x7d\x86" - "\x58\x6f\x1f\xbd\x73\x1d\x4d\xb1\x06\x28\xa9\xc9\x15\xc9\xb5\x6e" - "\xb6\xb1\x4d\x95\xc6\xf7\xc2\xf5\x1a\x35\x5d\x20\x0b\xcf\x2d\x91" - "\x14\xd4\x57\x66\x15\xa2\x24\x9d\x9a\x8a\x21\x8f\x5c\x64\x6f\x72" - "\x89\xfd\xe1\xbe\x74\x8d\xf1\x34\x70\x61\xdc\x80\xe7\xb5\xc0\x73" - "\xe9\x92\x0d\x99\xf4\x61\x19\x25\x5c\x8b\xe8\x73\x5d\x33\xd8\xfe" - "\x61\xde\x37\x18\x34\x19\xe6\xfd\x41\x83\x4e\xc3\xd9\xfb\x3c\xce" - "\xc3\x17\x84\xbf\x7a\x35\x31\x2d\xec\xce\x90\xf8\x2f\xd8\x24\x95" - "\x15\x61\xba\x76\xe1\x86\xeb\x85\xd7\x2f\x3c\xde\xb2\xd3\x72\xbd" - "\xae\x09\x79\x2a\x42\x22\xc2\xf6\x2d\xdb\xb6\x75\x6c\xab\xd6\xd8" - "\xec\xa2\xc6\x96\xd6\xbb\x4e\x84\x1a\xa5\x3d\x3a\x21\xc3\x47\x77" - "\x14\xc9\xbe\x01\x6c\xcc\x85\x5d\xbd\x36\x5b\x1a\x60\xa7\x30\xec" - "\x8e\x22\xe1\x89\xa4\xd8\x26\x20\x1f\xe6\xbf\xdf\x19\xb6\x6c\x40" - "\x9f\xd7\x7a\xb6\xbe\xca\x73\xdb\x04\xcc\x7f\xd7\x2f\xbe\x68\x4d" - "\x48\xae\x2e\x12\xfa\xc5\x31\xb4\x28\x69\xd2\xd9\xc7\xf8\xb3\xe1" - "\x97\x99\xf8\xf5\xe0\xdc\xe8\x36\x15\xf5\xc2\xee\x72\x6e\xa2\x09" - "\xe8\x87\x6b\x4e\xd1\x84\x4f\x9d\x65\xe2\xa4\x70\x4d\xa8\xfc\xc9" - "\xc6\x20\x74\x82\x09\x01\x1f\x6d\x2e\x18\x76\x6e\x65\xb9\x78\x41" - "\x74\x57\xaf\x1b\xa4\xd9\xf1\x85\x1b\x22\x82\xef\x79\x9c\x35\x21" - "\x9d\xe9\xd1\xe7\xba\x76\x96\x41\x8b\x61\xe8\x6f\x11\x6e\x5b\xba" - "\xd2\x01\xaf\x6d\x10\x2e\x41\x9e\xeb\x78\x1d\xef\xda\xdd\x52\x0f" - "\x72\x6b\xd4\x0b\x39\xc2\xeb\x1d\xd0\x99\x03\x25\x76\x11\x04\x4c" - "\xb7\x8f\x26\xfb\x74\x3b\x2b\xe0\x0d\x3d\xc0\x32\x25\x21\xff\xf0" - "\x3a\xe9\x10\xfc\xeb\x0e\x76\x40\x23\x62\x99\x24\x6c\x0f\x1d\xa9" - "\x50\x78\x07\x19\xae\xa7\xe2\x1c\x75\xe1\x7d\x49\x40\x74\x0b\xf7" - "\x43\x87\x59\x0f\xf1\xac\xeb\xe7\xb4\xf7\xc0\xc3\xc2\x53\xcc\x38" - "\x5d\xf7\x9e\xe7\xba\x7e\x3a\x09\x1d\x0f\xfa\x9d\x5f\xd9\x5c\xd7" - "\xed\x3d\x54\x4a\xba\x1d\x77\x1d\xec\xbf\xaf\xef\x35\xf0\x82\xec" - "\x10\xa0\x2f\xd3\xca\xcf\xf3\x2c\xaf\xa1\x95\x94\x8b\xa0\xa8\x31" - "\xf9\x91\x77\xb1\xd1\x06\x6e\x9f\x6a\xd7\x75\x05\xd1\xed\x02\x0e" - "\x7e\xe8\xcb\x92\x06\x25\x1b\x28\xc9\xa1\x68\x9d\xc4\xed\xe5\xb6" - "\x70\x9b\x65\x5b\x70\xe1\x79\xc5\x1b\xba\x03\xfa\x97\x4c\x87\x7d" - "\x7f\xdd\x01\x1f\x7d\x2d\x4b\xe9\x56\xd7\x49\xbd\x2e\x61\x3f\xda" - "\xc8\xe3\xfc\x9c\xae\x73\x46\xc4\x89\x93\x74\x3d\xeb\xb4\x66\xbe" - "\xca\x39\x39\x08\xfe\xb5\x5d\x15\xe0\xb9\xd8\x5b\x7e\x1e\xf2\x5b" - "\xe6\xbd\x12\x79\xbb\x90\xe7\x56\x3d\xef\xad\x6a\x7d\x57\x5e\x47" - "\xf1\x15\x73\xf3\x7b\xe0\xdd\xb9\xbc\x26\x01\x3a\xbb\x8d\x67\x81" - "\x67\x5c\xd1\x57\x57\x05\x12\xe3\x62\xf6\x44\xd4\x58\xec\x41\x3d" - "\x5f\x65\x9e\x72\x6e\xa0\xab\xc1\x97\xc7\x2b\x36\xd1\x95\xcc\x4f" - "\x22\xc5\x36\x43\xd1\xfd\xfa\x3a\xe1\xaa\x24\x2f\xa4\x67\xd1\x3a" - "\xba\x06\xe3\x6f\xca\x29\xba\xfe\xad\xbc\x72\x07\x70\x25\xaa\x3e" - "\x43\x24\x65\x4d\x8a\x2d\xc3\x1b\xfa\x84\x9a\xce\xb0\xad\x75\xfd" - "\x61\x83\x17\x71\x7f\xe4\x52\x72\x01\x74\xcd\x54\xb6\x82\xe3\x3e" - "\x5e\x2f\x3b\x41\x8e\x29\xdc\x5e\xfc\x4c\x48\xbb\x56\x5c\x10\x4b" - "\x05\xeb\x6f\x98\xaf\x7c\xe4\xc8\xc5\x35\x53\xfe\x5c\xb4\x4c\x7f" - "\xce\x40\xbe\x64\x71\x21\xc2\x79\x32\x91\x36\x49\xb8\x4c\x3c\x26" - "\x0e\xf6\xb9\x1c\x39\x3e\x9a\xb9\x4d\xf5\x8d\x63\x02\xc3\x1a\x06" - "\x87\x0c\xf4\x2d\x31\x6f\x02\xd6\xbf\x3a\x2a\x4c\x8c\xc7\x0e\x39" - "\x2e\x00\xab\x49\x53\xf2\x19\x73\x63\x66\xa3\x2b\x52\x00\x59\x5c" - "\x10\xa9\xb5\x17\xc8\x7b\xfd\x1d\xe3\x81\xb9\x2f\x33\x31\xfc\x87" - "\x8e\x78\xc6\x33\x8f\x4f\x4c\x53\x70\x1e\x3a\xec\x19\x7f\x8a\x9f" - "\xaf\xe2\xe7\x80\xed\xea\x02\x6f\x7d\x26\xea\x3f\x85\x7a\x27\xa6" - "\x29\x1b\x60\xe2\x55\xbd\xa8\xa3\xcf\x35\x31\xcd\x47\xe9\x07\xd4" - "\xda\xe1\xd5\x05\xc3\x8c\x3d\x1b\x8f\x9d\xf6\x06\xd2\xc7\xf4\x0d" - "\xff\xca\xeb\x18\x68\x97\x23\x6c\xd3\x32\x75\xb9\xc1\x76\xd5\x57" - "\x4e\xd0\x0d\x2d\x1d\x05\x92\xbf\x31\x6f\x4e\x2c\x7d\x27\xe2\xd7" - "\x78\x7d\x57\x89\xaf\x1b\x5a\x2e\xfe\x4d\xdc\x83\xdf\x01\xfc\x3c" - "\xfa\x73\x1b\x7e\x3e\xdc\x67\x48\xba\xf5\xe6\xc3\xce\xb9\xa1\x05" - "\x73\x7d\x26\x3f\xfb\x68\xe2\x3e\xd1\x3b\x49\x8b\xe8\xf7\x8d\x9f" - "\xb1\x8d\x31\xf1\x28\xe8\x9f\xaf\xfa\x81\x61\x90\xa9\xd7\x26\x69" - "\x2e\x9c\xf5\x22\xd8\x5a\x11\x60\x9c\x93\x5a\xeb\x03\xe4\xf8\x1a" - "\xb7\xfd\x86\xe4\x92\x7a\xe1\x0f\x80\xf6\x7c\xe5\xb6\x1d\x6a\x08" - "\x11\xaf\x31\xf7\xb9\x6e\x98\xe4\xa3\x27\xeb\xa4\xcc\x4f\x7d\xc8" - "\xcf\xf0\x44\x8a\xe4\x07\x61\xb4\x5d\xc9\xb3\xab\x0b\xb8\x1f\xf1" - "\xfc\x5d\xb4\xdb\x7a\x86\x6e\x90\xfd\x79\x08\x6d\xdf\x0d\x99\xc2" - "\xb6\x53\x93\x94\xff\x37\x40\xfe\x3b\x5a\x8d\xf5\xd0\x1d\x78\x07" - "\xbb\xa9\xa7\xbd\x20\x48\x0c\x23\x0c\xd8\xd5\x72\x4d\xc8\x5e\xb0" - "\xa9\x47\x04\xdf\xaf\xe8\xb6\x60\x3e\x46\x7f\x5f\x5d\xc0\x75\x3a" - "\xa1\x07\x7b\x56\xcb\x7a\x33\x21\xab\x12\x8f\xb7\x41\xdc\x6e\x7c" - "\xef\xd0\x24\x29\x17\x1d\xd0\xb1\x32\x62\xfb\xe5\xc6\x83\xaa\x4f" - "\x6e\x4c\x8a\xed\x93\x1b\x0f\xe2\x37\x1f\xbf\x7c\xfc\x4a\xf5\xe7" - "\xe8\xdf\xcc\xa8\xfb\xad\x7d\xae\x1b\xb3\x30\xf6\x7d\x8a\xd6\x9c" - "\x06\x5c\x99\x07\x3e\xa3\x24\xb6\xbd\x79\x5f\x81\xd3\x99\x5f\x39" - "\x3d\x02\xbd\x04\xcf\xb9\x78\x6f\xe3\xb1\x58\x1d\xa1\x98\xf7\xde" - "\xad\xe0\xa9\x8d\xfd\x8c\xfb\x5b\x72\xbd\x60\xf3\xb6\x6d\xcc\x87" - "\xc8\xb3\xd4\x1a\xda\xb6\x0d\xf5\x1d\x30\xe8\x87\xb4\x06\x7e\x9f" - "\x58\x3f\xb8\xf1\xd8\xa0\x1e\x05\xfd\x92\x65\x4b\x0f\x4d\xea\x86" - "\xfc\x41\x5f\xd9\x97\xa9\x79\x63\xd2\xa7\xfc\x0c\xb9\x77\x1c\xf7" - "\x5d\xed\x90\x2f\xfd\xb5\xd6\xfa\x01\x8d\x46\xf5\x6b\x94\x19\xaa" - "\x5d\x5f\x15\x4a\x1d\xb5\xc7\xdb\x7d\x80\x3a\x42\xbf\x22\xc7\x33" - "\x12\xc6\xc7\x5e\xe6\xe7\x0d\x22\xfc\x6e\xff\x5e\xd8\x5a\x67\x3d" - "\x98\x67\xaf\x3f\x45\x93\x64\xdb\x7f\x70\x02\x33\xf8\x13\x12\xb6" - "\x4e\x8b\xf5\x05\x3b\x57\x8a\xd0\xce\x93\x18\x1f\x03\xf6\xd1\x3b" - "\xfa\x69\xca\xeb\x1b\x29\xa3\xa1\x9f\x26\x35\xf6\x53\xba\xf8\x7b" - "\xba\xd6\x00\x5d\xeb\x89\xf3\x36\xc2\xf8\xce\x1d\x5b\x44\x49\x8d" - "\x1b\x49\xf6\x79\xb8\x06\x3a\x57\x08\x3a\xd7\xd9\x74\x96\x73\x83" - "\x3a\xd7\xc0\x00\x74\x2e\xb7\xad\x5e\xf1\x85\xad\x7e\x4c\x01\x99" - "\x92\x97\x91\x0d\xf8\x39\xcf\xd0\xa4\x6b\x93\xbb\xa0\xef\xa1\xcd" - "\x3e\xbd\xbd\xb8\x66\x58\x0b\x68\x94\x6c\x2b\x64\xaf\xa8\xb1\x2f" - "\x1b\x76\x4e\xd5\x98\x77\x02\xbc\x07\x84\x36\x4c\xbe\x83\xf7\x31" - "\x0e\x8c\x0f\x5a\x4a\x1a\xc0\x77\x48\x2f\x9d\x28\x82\x48\x9f\xc0" - "\x75\xef\x47\x7a\x9f\x6b\x72\x96\xcf\x3c\x50\x3a\x9c\xbc\xb5\x6e" - "\x36\xe6\xfd\xc9\x1f\x0a\xad\x92\x79\xd1\xb7\x29\x24\xfc\xde\x33" - "\x3c\x06\x27\xb7\x2e\x2c\x14\x21\xc7\x6a\xde\x53\x9a\x7c\x80\xf7" - "\xbb\x78\x9d\xfb\x1d\xe8\x29\x5f\xb4\xc7\xc5\xb2\x1f\x3c\xe3\xb7" - "\x16\x02\x26\xf4\x7d\xe1\x4c\x8f\xd3\xbd\x13\xeb\xdd\xbc\x37\xfa" - "\x8a\xdc\x87\x9d\x0c\xfe\x79\x50\xea\x61\xac\xef\xb1\x0c\x84\xde" - "\x74\xe5\x49\xfa\xda\x4c\xb6\xeb\xfb\x5c\x5f\x9b\xe0\xa3\x39\xc6" - "\xbe\x9e\xdc\xdf\x45\x1a\x64\x4c\x56\x21\xa7\x95\x4e\x24\x7b\xa9" - "\x43\x74\x0f\xa7\xfb\xc8\x3d\x57\x8d\xbe\x8a\x32\xf9\x06\x1c\xcc" - "\x37\x3f\xef\xd5\x96\x2c\x41\x5a\x99\x01\x07\x79\xae\xc2\xf3\xb6" - "\xc1\x3c\xaa\x4c\x7d\x54\x99\x25\xbd\xda\xcd\x3f\x47\xda\xbe\xb8" - "\x32\x07\xe3\xca\xb4\x45\x95\xa9\xd4\xeb\xf1\xc5\x95\xf1\xc7\x96" - "\xf9\x3a\x5d\x8c\xdb\xd7\xd3\x62\xcb\x7c\x7d\x52\x5c\x99\x19\x17" - "\xe3\xf6\xf5\xb9\x71\x65\x72\xe3\xca\x14\x44\xd1\x92\xf7\x56\x33" - "\x90\x56\x1e\x57\xa6\x2a\xae\x4c\x83\xf1\x3c\xdc\x1e\x77\xc9\x6e" - "\xb2\x83\x2f\xbb\xb9\x3f\xa1\xb7\xf7\xf4\xfe\xe8\xd9\x3e\xbd\xec" - "\xd1\x04\xed\xea\x89\xab\x2f\x14\x5b\x5f\x7a\xf2\xc5\xed\x4a\x77" - "\xc4\x96\x49\xcf\x88\x2b\x93\x19\x55\xa6\x59\xd5\x93\xbe\x38\xae" - "\x4c\x7e\x5c\x99\xd2\x8b\xf9\x2a\x7d\x5b\x5c\x99\xfa\xb8\x32\x7b" - "\xbf\x80\x16\x3c\x1f\x2b\x5f\x84\x71\xac\xf3\xde\x8f\xb9\xfe\xa6" - "\x14\xb6\x65\x30\x97\xf8\x7f\xd2\x1f\x1c\xc1\x73\x0a\xcf\x3f\x87" - "\xca\x82\xd0\x97\xd2\x83\x3e\x9a\x56\x64\xcc\x41\xbc\x8f\xc9\xe3" - "\x59\xe9\xca\xe9\x47\x87\xd3\x29\xb9\x1e\xc3\x37\x81\xeb\x3a\x34" - "\x81\x75\xaf\x9b\xb2\x06\x75\x5b\xb5\x5f\x4f\x0a\xce\x4d\xaf\x31" - "\x1c\xae\xbf\x49\xed\x8f\x9a\x58\xb7\x3e\x54\x26\xcb\x94\x45\xe9" - "\xc3\x5c\x7f\xe0\xc0\xc6\xa0\x25\x16\x8f\x9b\x72\x2f\x81\x47\x32" - "\x74\x9c\x96\x0e\xe8\x1f\xbc\x0f\xd4\xde\x00\x5d\x06\xfa\x3b\xe3" - "\x76\x82\x6e\xf2\x49\xdd\x6a\x75\x3f\xf1\xbd\xb7\xfc\x6e\xb9\x4f" - "\xa4\x74\xcb\x9b\xed\xad\xa8\x9f\x75\xf0\xd6\xa2\x73\xd4\x2b\xf5" - "\x7f\xd6\xc1\x6e\x7e\xe0\x50\xb9\x1f\x78\xdd\x6c\x33\xf6\x4d\x7d" - "\x74\x73\x96\xd4\x1b\xdc\x0f\xed\xe7\x3d\x2c\x5e\xf7\x3d\x14\x98" - "\xc9\x79\xc0\xff\x37\x4d\x30\xda\x0b\x1b\x10\x63\xea\xa6\x9e\x4b" - "\xd1\x4c\xf5\xe1\xcd\x85\xb1\x3c\x39\x02\xbc\x72\x73\x65\x6c\xbf" - "\xdf\xec\x8e\xed\xf7\x9b\x9b\x63\x79\x52\x03\x4f\xde\x7c\x20\xae" - "\x4c\x6b\x5c\x99\x23\x51\x65\xdc\x7a\x3d\xdd\x71\x65\x82\xb1\x65" - "\x6e\x49\x8a\x7a\x46\x1b\x6f\xb1\x0f\xda\x30\x72\x4f\xfe\x96\xf4" - "\xa8\x67\xad\x4e\xca\xcf\x5b\x66\x19\x69\xbc\x8f\xd6\xf8\xaa\xda" - "\x13\xd6\xe1\xe5\xc6\x8d\x77\xce\x5f\x18\x8b\xc3\x2d\xe5\x71\x38" - "\x0c\x8e\xff\x6a\x65\x83\xfd\xe1\x24\x4d\xc9\x97\x3c\x84\x31\x82" - "\xf9\x7a\x21\x3f\x03\x56\x3d\xf2\x83\x0e\xb7\x1c\x8c\x83\xd7\x16" - "\x07\xef\x58\xd4\x33\xec\xa6\x5b\x7a\xa2\xda\x60\x33\xdb\xa5\x5f" - "\x0c\xf4\xb1\x29\x16\x23\x9d\x6d\x43\xe0\xdb\xed\x94\xf3\x4c\x26" - "\xfb\x3a\xa4\x9e\xa0\x5b\x3e\x63\x3b\x52\xc1\x9c\x12\x3d\xfe\x49" - "\xb5\x6b\x4a\x56\x2c\x1e\x53\x16\xc7\xe2\x31\x25\x3f\xaa\x5d\x01" - "\xeb\x66\x5a\x64\x0d\x3d\xfc\x5d\xd6\x71\xd8\x87\x46\xfa\x1c\x6c" - "\x82\x5e\x76\x9e\x6c\xec\xeb\x71\xb2\x94\xcc\xde\xb2\x6e\xd8\x64" - "\xb6\xba\x61\xf9\x29\xf5\x21\x8f\xee\x9f\xe2\x00\xfc\x56\x83\x1f" - "\x23\xb5\x0f\x79\x22\x35\x5f\x9d\x85\x34\xc8\xbf\x9b\x25\x1f\x8b" - "\xda\x71\xdb\x84\x33\xb7\x1e\xf4\x84\x7d\x33\xf5\x43\xdd\x1e\x38" - "\xc2\x3e\x0b\x90\x3d\xdd\x98\xdf\x93\xd5\xfe\xd6\xd4\xe4\x28\xbe" - "\x0e\x38\x36\xde\x2b\x4e\xd0\xd4\x8f\x78\xfe\xe7\x31\xca\xbe\x0f" - "\x87\x42\x7e\x62\x1b\xda\x1b\x3a\x25\x75\x34\xbc\xef\xd4\xcb\xce" - "\x8d\x2a\xeb\xd7\x6d\xdc\x6e\x7e\x37\x3d\x44\x96\x43\x01\x3f\x01" - "\x4e\x9a\xd2\xeb\xa6\x7e\x74\x08\xe3\x15\x65\xca\x8d\x32\x6c\x0f" - "\x73\x19\x6b\x29\x59\xa6\x95\x93\xc5\xb3\xf1\x84\x84\xad\xf7\x7d" - "\x37\xeb\xc7\xde\xf2\x6e\xf2\x06\x8e\xf2\xda\x94\x45\xed\x25\x4f" - "\xed\x34\x07\x29\xa9\xb7\xe6\xa1\xfd\x3e\xdc\x87\x6b\x1e\x6a\x01" - "\x6e\x9d\x3e\x9a\x22\xe5\x5c\x34\xed\x1e\x78\x20\xe7\xe1\x85\xd9" - "\x53\xbf\xf3\xf0\xbc\xc5\x0f\xdc\xed\x58\xbc\xea\xb9\x15\xf9\x53" - "\xd7\x3c\x5f\xea\x58\x5f\xbc\xaa\x74\xd5\xea\xa7\x1d\x19\x65\x93" - "\xcb\x1c\xcb\x4b\xd5\x35\xbd\x70\x79\x49\xe9\x6c\xbe\x9d\xe2\x28" - "\x2a\x5e\xb1\x4e\xde\xde\x34\x9a\x62\x81\xac\x2a\x5d\x51\xec\x98" - "\x9c\x3f\xc5\xf1\xe0\xf2\x55\x85\xcf\x17\xaf\x48\x08\xeb\x6e\x47" - "\xf1\x8a\xe2\x15\xcb\xf3\x1d\xb3\x1d\x19\x0c\x39\x1a\x5c\x54\x7f" - "\x66\x18\xf3\x18\xcf\x5f\xd5\x2e\xd1\xa9\xcf\x67\x3e\xc5\x3f\xd3" - "\xf6\x5c\x3c\x97\x4d\x6b\x89\xe5\xb9\x69\x87\x63\x79\x6e\xda\xd1" - "\x8b\xe7\xb2\x69\x71\xf3\xdf\xb4\xb8\xf9\x6f\x7a\xf2\xc5\x73\xd9" - "\xf4\xb8\xf9\x6f\x7a\xdc\xfc\x37\x7d\x70\xfe\x03\x2f\xf9\xb6\x48" - "\xb9\x30\x3d\x6e\xfe\x9b\x1e\x37\xff\x4d\x2f\x8d\x7b\xde\x1a\xf5" - "\x7c\x25\x9e\xeb\xa2\xe7\x47\x3c\xef\x31\xc6\xe7\x90\x7c\x99\xde" - "\x62\xe4\x61\x59\x0f\xd9\xdc\xa5\xe7\xed\x8c\xca\xdb\xad\xe7\xed" - "\x1a\x1c\x7f\xe0\x23\xf6\x11\x51\x76\x77\xc6\x3c\x96\xe9\xec\x1f" - "\xc2\x73\x13\xc6\xc7\xf5\x67\x68\xfa\x07\x0c\x8b\x79\x58\xae\x1f" - "\xfe\xe8\xb1\xbe\xa6\x54\x4a\xe2\x32\x4d\xb5\x64\x11\xae\xa9\xc7" - "\x70\x25\xa4\x25\xe3\x07\x99\x92\x91\xe9\x33\x87\xf4\xb5\x98\x0c" - "\xb7\xd4\xf7\x51\x46\x87\x5f\xc3\xcf\x80\x63\x47\x99\xa4\x6a\x35" - "\x17\x77\xe1\x3e\x99\x79\x1a\xe5\x2d\x42\x9b\x36\x11\x57\x42\x9a" - "\x0d\xbf\x34\xc0\x73\x1b\xf0\x78\x1f\x2c\xd1\xf8\x8f\x5f\x5f\x1e" - "\xb4\xf9\x34\xb2\x56\xbb\x22\x47\xbd\x11\xd6\xab\x33\x5a\xd5\x1a" - "\x81\xb5\x45\xb8\xde\xcf\x6d\x42\x7a\x62\x1b\xe9\x56\xe8\x7f\x19" - "\x2d\x6a\xdd\xe4\x56\xf4\xff\x83\x5d\x6a\x6d\xd3\xda\x02\x79\xdb" - "\x7f\x92\x6e\x7d\x13\xd7\x01\x5c\xb7\x1b\xf0\x3d\xd2\x76\xbe\x95" - "\xd7\x3c\x1e\x61\xb8\x71\xe9\xb3\x20\xdf\xfa\xad\xa1\xca\xdc\x04" - "\xef\x72\x85\xcb\xfc\x70\x82\xf4\x22\xe8\x0c\xfd\x3e\xba\x75\x0f" - "\xe3\x1b\x95\xbe\x4d\xb8\xc6\x2e\xe6\xfc\x3e\xae\x0f\x65\x86\xd3" - "\xb5\x0d\x7f\x30\xe5\x77\x79\xeb\x91\xb8\x76\x7c\x7e\x92\x6e\x5b" - "\xa4\xda\x71\xdb\xdb\x71\x75\xf7\x24\x6e\xc7\x6d\x16\xb4\xe3\xf3" - "\xc4\xed\xb8\xcd\x21\x69\xab\xa1\x2d\xda\x45\xef\x66\xa1\x2d\x9f" - "\x4b\xba\xc7\xa6\x2f\xd6\x75\xa1\x00\x6c\x30\x5e\xd7\x93\x65\x1f" - "\x29\x1f\xea\x37\x3d\x5f\xb9\xb5\x9e\x72\x12\xd4\x59\x27\x5c\xa3" - "\x1e\xf1\xd1\x6d\x6d\x12\xce\x50\xfa\x3e\x85\x0b\xe8\xa4\x49\x3a" - "\xf5\x70\xb9\xe1\xfa\xdb\xb0\x4b\xd4\xba\xc6\x6d\xe0\xd9\x5b\xf7" - "\x1b\x6b\x92\x25\xe5\xc2\x6f\xd0\xb1\xcf\x75\xbb\x3d\xee\x5d\x30" - "\xea\xdd\x8c\x98\x77\x9b\x06\xd3\xe7\x1b\xe9\x5f\xae\x9f\x6e\x2f" - "\x8f\xeb\x27\xf4\xcf\x8c\x31\xb1\xed\xbe\xbd\x4a\xb5\x0f\x7d\x74" - "\x11\xad\x6f\xdf\x8b\x3e\x1a\x48\xdc\x47\xb7\xb7\x26\xe6\xb5\xdb" - "\x8f\x49\x78\xa9\x94\x08\x5e\x10\x7d\x37\x20\x79\x50\xef\xa7\x8b" - "\xfb\x67\xc6\x04\xa3\x7f\xbe\x5c\x1b\x67\x2c\x8b\x6b\x63\x18\x30" - "\x3e\x56\x6d\xbd\x63\x6a\x1c\xec\xb2\xc4\xbc\x38\xc3\x8d\x76\x86" - "\x13\xb7\x73\xc6\xbe\xe1\x79\x71\xc6\x61\xb4\x27\x7c\x31\x2f\xa2" - "\xfb\x64\x19\x4a\x54\x26\x24\x5c\x89\xea\xb9\x23\xcd\x19\x62\x3d" - "\xf7\x8e\xf9\xbc\x86\x14\x95\x3e\x25\x96\xff\xd0\x06\x2e\xc7\xf4" - "\x0b\x29\x39\xcb\xfd\x70\xd2\x41\xda\x17\xf1\x64\x9f\xeb\x8e\xaa" - "\x38\x5a\x9d\x3d\x49\x77\x8e\xe9\xd5\x4c\x7b\x14\xbd\xee\xfc\x28" - "\x0e\xa7\xbd\x89\xe9\x75\x87\x07\xf4\x3a\x9b\x98\x5e\x77\x1c\x1b" - "\x9e\x5e\x77\x70\xff\x9f\xbd\x98\x5e\x77\xda\xa2\xe9\x05\x5d\x57" - "\xb6\xef\x46\x3b\x78\x63\x20\x4f\xf0\x1a\x1c\x68\x62\xb3\x82\x57" - "\x54\x99\x1e\x2e\x93\x65\x0d\x2a\x3e\x81\x0e\x99\x74\x86\xee\x9c" - "\x62\x8c\xff\xb1\xf5\x34\x4a\x0c\x3c\x26\x00\xcf\xc4\xe5\xbc\x65" - "\x67\x3d\xde\x50\x06\xb1\xfd\x11\x57\xef\xb6\xc4\xb2\xe0\xce\x66" - "\xd0\xb4\x36\x41\x7a\x8b\xf2\x09\xb9\xd3\x1f\x2b\x23\xee\xec\x8c" - "\xed\x23\xd0\x0d\xe5\x68\xc8\xa7\xfd\x92\xbf\x4b\xf7\xd9\x37\x32" - "\x2f\xee\xb3\x6f\x1c\x57\xfd\xf5\x8d\x0f\x62\xf1\xfb\x46\x6e\xe2" - "\xfe\xfa\x46\xd1\xf0\xfd\xf5\x8d\xaa\xe1\xfb\xeb\x1b\x7b\xb9\xbf" - "\x7c\xf4\x0d\x5f\xec\xbc\xf1\x0d\x4f\x6c\x7b\x51\x2f\xca\x09\x6d" - "\xe4\x95\xfc\xfc\x65\xdb\x6d\xfc\x58\xc6\x71\x5f\x35\x55\x10\x78" - "\xd9\x34\x91\x71\xbc\x5c\x18\xc3\xc2\x06\x0d\xdd\x1b\x13\xef\x8f" - "\xb2\x8d\xdb\x51\x4f\xbc\x17\x4e\x8e\xeb\x58\x77\x9f\xf9\x9b\x88" - "\x46\x47\x71\xaf\x9d\xa4\xbb\x37\x47\x34\xad\x9c\xfd\x2c\xa5\x7f" - "\xa5\x5c\x43\x98\xd9\x16\xdd\x17\xec\x8b\xc3\xb6\xe9\x4e\x65\x3b" - "\xfd\xed\x24\xdd\xb5\x44\xf5\xcb\xdd\xcb\x63\xe9\x38\xd3\x9f\xb8" - "\x5f\xee\x4a\x42\xbf\xfc\x2d\x71\xbf\xdc\x35\x69\xf8\x7e\xb9\x8b" - "\xd7\xc6\xff\x76\xf1\x38\xba\x2b\x57\x1f\x47\x5b\xb8\x8c\x63\x35" - "\xdb\xe3\x77\xfd\x91\xf3\xe0\x1e\x63\xe4\xae\x5f\xf2\xfb\xa9\x3d" - "\xc6\x38\x92\x65\xaa\x00\x4b\xd6\xaf\xe7\xd9\xa6\xc3\x88\x86\xbb" - "\xdf\xda\x93\x68\x9c\xdc\x75\x98\xf3\x4e\x2b\xa2\x24\xd0\x30\x77" - "\x37\xc3\x28\x26\x3a\x43\x77\x5f\xcb\xf9\x38\x7d\x5a\x20\x7a\x9c" - "\xdc\x15\x34\xf2\xb1\xac\x53\x79\xef\xf2\x8b\xbe\x02\xe2\x7c\xb1" - "\xb0\xef\xd6\xdb\x3f\x4a\xce\x23\x9c\x9f\xf3\xc5\xe5\x99\xab\xc6" - "\xe3\xdd\x55\xb1\xe3\xf1\xee\x65\xb1\xfc\x09\xfa\xa3\x5c\x04\x72" - "\x0e\xf7\x07\x80\xc3\x97\xe6\xaf\x4b\x8f\xcd\xbb\x8f\xc5\x8d\x4d" - "\xf0\xc0\x37\x37\x29\x1e\xf8\xe6\xe3\x71\xb8\x06\x12\xf3\xc0\x37" - "\x93\x87\xe7\x81\x6f\xa6\x0f\xcf\x03\xdf\xcc\x62\x1e\xf0\xd1\x37" - "\xcb\x63\xc7\xe6\x37\x97\xc6\xb6\xfd\xee\x80\x1a\x9b\x94\x72\x39" - "\x63\x13\xba\xd0\x95\xc3\x8d\x43\x1e\x53\xa8\xdb\xd4\xd4\x6f\xec" - "\x67\x7c\x29\x9a\x25\x61\x5c\x01\xbf\x59\x36\x5e\x53\x82\x8c\x9f" - "\xc9\x34\x6c\x94\x67\x6d\x66\x4d\x8a\xa6\xe3\x4e\x75\xee\xc5\x89" - "\xbc\x6f\xf1\xfe\xb0\xa2\xe7\xec\xb5\xb1\xed\x9f\x95\x95\x98\x9e" - "\xb3\x96\x82\x9e\xce\xc4\xf4\x9c\x55\x36\x3c\x3d\x67\xd5\xb1\xcf" - "\xfe\xc5\x63\x6a\xd6\x3e\xc7\x3a\xa9\xa3\xc8\x32\x67\x68\xf6\x88" - "\x2f\x37\x3f\xcd\xea\x8a\x9d\x9f\x66\xb5\x5d\xfe\xfc\x34\x3b\x3d" - "\xf1\xfc\x34\x3b\x33\xf1\xfc\x34\x3b\x57\x8d\x87\xd9\xee\xd8\xf1" - "\x30\xbb\x28\x96\x27\x40\xbb\xff\xb1\xf9\x69\xb6\x2f\x6e\x0c\x54" - "\x9f\xa4\x7b\x96\x43\xa7\xa8\x54\xfd\x76\xef\xe4\x38\x1c\x43\x89" - "\xfb\xed\x9e\x34\xf4\x5b\x75\xe2\x7e\xbb\x27\x63\xf8\x7e\xbb\x67" - "\x3e\xfa\xad\xfa\xe2\x7e\xbb\x27\xff\xf2\x75\x8a\x7b\xea\x63\xfb" - "\xec\x9e\xca\xcb\xef\xb3\x7b\x8e\x25\xee\xb3\x7b\x02\x89\xfb\xec" - "\xde\x64\xd5\x67\xf7\x66\xc5\xf6\xd9\xbd\x93\x62\xfb\x6c\x76\xe8" - "\x1f\xed\x33\xf4\xcf\x41\xe5\x67\x70\xef\x9b\xb0\xdb\x47\xf5\xb9" - "\xee\x6d\xf0\x51\xa6\xbe\x87\x9b\xa9\xe6\x0e\xd5\x87\xef\x22\x8f" - "\xfb\xe2\x79\xe0\xde\x16\x3d\xed\x3b\x17\xf7\xc3\xbd\x47\x20\xa3" - "\x7b\x5a\xcb\xe5\xbe\x96\xea\x43\xa6\x39\xf2\x79\x36\xf2\xde\xd4" - "\xbd\x01\x2e\x8b\x3e\x16\xde\x60\x88\x58\xae\x23\x7f\x80\xe1\xf0" - "\x59\xa5\x58\x58\x99\x8e\xcb\x99\xe3\x87\xf7\x8d\xb1\x1e\xf4\x54" - "\xdc\x06\x78\xf7\xdd\xa1\x78\x35\x33\x5e\xff\x6d\xc2\xbb\x2b\x14" - "\x9f\xde\xff\x97\x38\x1c\xf6\x24\xe6\xd3\xcc\x83\x68\x43\x53\x62" - "\x3e\xcd\x3c\x3a\x3c\x9f\x66\xb2\xcc\x6c\x8a\xb2\x7d\x52\x9f\x08" - "\xf9\xe2\x6c\x9f\xfb\xec\xd6\x80\xe2\x1d\xa9\x13\xd5\x58\x0f\xf6" - "\xb9\xee\x8b\xd7\xff\xd0\x37\xf7\xbd\xa7\xe3\xfc\x9b\xb8\xf2\xc3" - "\xe8\x7f\xf7\xb1\xfe\xf7\x6e\x62\x9c\xef\xbb\x84\xfe\x77\x1f\xeb" - "\x7f\xef\x5e\x3c\xb6\xee\xd3\xf5\xbf\x44\x36\xde\x7d\xc7\x12\xf7" - "\xff\x7d\x71\xfd\x4f\xb9\xa5\xb0\x87\x65\xf9\x98\x7c\xf7\x4f\x88" - "\xce\xc7\x3e\x46\x9c\x97\x79\x24\x41\xde\xb9\xf1\x30\x87\xc9\x57" - "\x74\x11\xef\xb1\x4f\x54\x42\xde\xbb\xbf\x41\x8d\xc7\xfb\x03\xb1" - "\xe3\xf1\xfe\x03\xb1\xe3\xf1\xbe\xdc\xb8\x72\x47\x62\xdf\x83\x7f" - "\xfe\xc7\x64\xec\x9c\xac\x38\x1e\x78\xff\x24\xcd\xf9\x40\xf1\x40" - "\xd6\xd5\xb1\x78\xcc\x59\x9a\x98\x07\xe6\x94\xa2\xfd\xef\x27\xe6" - "\x81\x39\xee\xe1\x79\x60\xce\x3e\xd0\xf2\xfd\x68\xbe\x7d\xa4\x3c" - "\x73\x54\x5c\x9e\xce\xc4\x32\x6f\x4e\x77\xe2\x35\x82\x2c\x52\x34" - "\xce\x9a\x19\x4b\xe3\x2c\x7b\x2c\x0d\xd1\x96\x7f\x9c\x86\x83\x67" - "\x7d\xfb\x5c\x59\xf1\xe3\xdf\x7b\x92\x1e\xd0\xc7\xff\x83\x71\xb2" - "\x2e\x6b\x8f\xc2\x25\xd1\xba\x48\x16\xdb\xbf\xde\xc4\xb4\xcc\x3a" - "\x36\x4c\x9b\xd9\xa7\xcd\x1b\xb9\x68\x2c\x3d\x90\x8c\xf4\x47\x78" - "\x3d\x94\xd7\x43\x1a\x91\xfe\x48\x88\x92\xe4\x7c\x35\x38\x2f\x3d" - "\xc0\x67\x2f\x05\xd3\x9f\xf9\xd7\x3a\x81\x72\x78\x0e\x62\xbc\xf2" - "\xca\xa5\xcf\x82\x75\x2b\xf3\xfa\x0d\xcc\xeb\x0f\x48\xfd\x8f\xf7" - "\x59\xd8\x1f\xd0\x5a\x46\x39\xde\x40\x88\x0c\x7e\xe7\xfc\x71\xb0" - "\xab\x78\x5c\x70\x7e\x23\xaf\x5a\x37\xab\x8c\x93\x4d\x0f\x1c\x48" - "\xdc\xc7\x0f\xb4\x0d\xcf\x3b\x0f\x74\xab\x7e\x7e\x70\x42\x6c\x3f" - "\x3f\x08\xfd\x6f\xec\x62\x6e\x2b\x78\xe0\xb2\xc6\x49\xa9\x43\xf8" - "\x87\x95\xf7\x5b\x1e\x3b\x5a\x54\x41\xd7\x9d\xa2\x07\xb7\xca\xfa" - "\x34\x11\xb4\x6e\x36\x51\xab\x94\x01\x0f\xfe\x87\xc4\x13\x79\xf2" - "\x42\xa4\x89\x2d\xcf\x1e\xe5\x77\x4d\x2e\x11\x44\xbe\x4e\xde\x13" - "\xe0\xb3\x7e\xe0\x85\x2b\x4f\xd0\x83\xbb\x63\xca\x5b\x88\xbc\x0a" - "\xc6\xd1\x26\x39\x1e\x1f\x3c\x62\xac\xe9\x6e\x1d\xc6\x3f\x08\x79" - "\x82\x86\xef\x83\xf2\xfd\x7a\x70\xd8\xfd\x4b\xc6\x89\xfd\xe3\x19" - "\xa7\x4b\xcb\x81\x6f\xcd\x37\xf8\x57\xf9\x4c\x7e\x6b\xe9\x90\x4f" - "\xde\xb7\x0a\x7c\xf4\xad\x61\xcf\x73\xc4\x8e\x83\x6f\xd5\x45\xc3" - "\x51\xe7\xdd\xbf\xb5\xd7\xf0\xab\xc3\xfd\x81\x2f\x80\x65\xe0\x73" - "\x2c\x0e\x9f\x1e\xe8\x29\xad\x3a\x8c\xe0\xa5\x60\x70\x9f\x2b\x9e" - "\x65\x7e\x98\x6b\xbb\xd4\x9a\x9f\xd9\x4e\x39\xaf\x5c\xc4\x5b\x73" - "\xa5\xbe\xc4\x30\x2e\x8d\xe3\xdc\xca\x18\xdb\x42\xee\xdd\xf3\xde" - "\xd6\xbc\x6c\x35\xee\xe7\xc5\xad\x11\xce\x6d\x90\x7e\x53\xfa\xb8" - "\x7f\x22\x14\x3f\x0e\xe6\x1e\x34\xe6\xe8\xb8\xf4\x23\xc6\xb8\x87" - "\x5d\xcb\x70\xe3\xd6\x59\xe7\x06\xd4\x58\x98\x37\x3f\x92\x12\x6d" - "\xaf\xcd\x93\xfa\x9f\xb1\x5e\xea\x43\xbe\xd8\x72\xf3\xe2\xd6\xff" - "\xe6\x36\x88\xe1\xd7\xe9\x93\xd1\xbf\x01\xde\xdb\x52\x67\x87\xe7" - "\x95\xc7\xad\x57\xb0\x3f\x75\x8f\xa7\xe2\xaf\x80\xfb\x6d\x5d\xee" - "\x7d\xfb\xb3\xb8\xfa\x1a\x9c\xa7\x2f\xd5\xfe\x79\xc3\xb4\x7f\xde" - "\x50\xfb\x57\x4b\xb8\x71\x6b\x89\xf3\x64\xfb\xc3\x17\xc9\xbf\x6f" - "\x27\x43\x7e\x19\x74\x83\xce\xfd\xed\x15\x86\xae\xce\xeb\x07\xc3" - "\xeb\xea\xdf\x1e\x5a\xff\x53\xe5\x86\xd6\xff\xfc\x89\x74\x75\x1f" - "\xc9\xbd\xd5\xd8\xba\xb7\x59\x1b\x12\xb5\xe5\xdb\xc3\xac\xff\x7d" - "\x5b\x5f\xff\x7b\xc8\x16\x2b\xcf\xbe\xdd\x19\xdb\x87\xf3\xe2\xfa" - "\xf0\xdb\xfe\xd8\x3e\x9c\xd7\xf0\xdf\x9d\xd7\x78\xe2\x34\x9b\xcd" - "\x9a\xd9\xa4\x99\xcc\x78\x8d\x26\xd2\x28\xb3\xc5\x3c\x02\xbf\x91" - "\xfa\x75\x94\x66\xd6\x2c\xf8\x8d\xd0\xaf\x23\xe3\x9e\x47\x71\x59" - "\xfc\x2c\xfa\x75\x44\xdc\xf3\xc8\x2f\x78\x3f\x4a\xaf\xd7\xa8\xdf" - "\x12\xf7\x3c\xe2\x0b\xde\x8f\xfc\x07\xcb\xd3\x45\xcf\xb1\x7e\x68" - "\xf3\x56\xaf\x5b\x5e\xb8\x2a\x5f\xee\x17\xaf\x70\x2c\x7f\xea\xa9" - "\x15\x25\x25\x8e\xd2\x35\x8e\xfb\xef\x7b\xf8\xb6\xbb\x1d\x6a\xdb" - "\xb9\x70\xf6\xe4\xfc\xd1\x94\xbd\xbe\x98\x5f\x64\x3f\x32\x2f\xd7" - "\x91\x73\xff\x7d\xb1\x2f\x0d\x30\x72\x7b\xf9\x52\x50\xa2\xc6\x5f" - "\xe6\xf6\x71\x44\x55\xe3\xa4\xec\xe9\x6a\x6f\x26\x52\x6b\x1e\x8b" - "\x96\xb7\x41\x9b\x10\xfd\x4e\xe1\xb9\x81\xf7\xf4\xb3\xa5\x8f\xf0" - "\xd4\xe6\x4a\x2a\x5a\xc9\xe7\x4d\xb2\x6f\x15\xbf\xf7\x93\xe3\xdb" - "\xa4\x9d\xa0\x47\xd7\xb6\x42\xab\xe5\x67\x6f\x57\x88\x1c\x4e\x4a" - "\x42\xf9\x14\xbc\x33\x89\x7b\x22\x48\x0b\xe8\x3e\xcd\x39\x13\x65" - "\xda\xef\x2b\x8d\x7c\xd6\x93\x94\xfd\x17\xf1\x7b\x21\x9f\xc5\x3d" - "\x6e\x3d\x5f\xf6\x5b\x11\xd7\xfc\x02\x96\x0d\x0d\xb5\x64\x69\xac" - "\x25\x7a\x2d\x95\x92\x5e\x1b\xc7\x67\xe8\xb3\x1b\x8c\xbd\xd0\xed" - "\x78\xf6\xd1\xa3\x45\x5c\x37\xe7\x8d\x68\xf3\x6b\x65\xfe\xd4\x98" - "\xfc\x6d\x43\x7b\xb1\xd9\x0d\x1a\xf2\x2d\xfc\x84\xac\xc1\xd4\x51" - "\xf5\xde\xf2\x4a\xb2\x86\xc5\x67\xd3\xe6\x92\xa9\x03\xb3\xef\x86" - "\x90\x08\x79\x8a\x4f\xa1\xfe\x05\x57\x5b\x37\x88\xcf\xbc\x18\xfd" - "\xd9\x3d\x4e\xb1\xf3\x34\x59\x30\xae\x4d\x9e\x62\xf6\x53\x58\x40" - "\x8d\x9f\x93\x05\x34\x98\x70\x8a\x16\x66\x94\x67\x8b\xb0\x33\x9b" - "\x2c\xff\x5e\xc6\xfe\x86\xb6\x3b\x77\xfe\x99\x2c\xbf\xe8\xaf\xd4" - "\xfa\x85\x9d\xca\x4b\x45\xb7\xe0\xd8\x1a\x01\x11\x64\x7f\xfd\xb6" - "\x65\x61\xce\xf3\xb5\x3e\xa7\x9d\x3a\x4a\x03\xb4\xe9\x98\x08\x6e" - "\xfb\xb3\xf2\xf3\x6f\xef\x09\xb0\xff\x62\xd2\xa6\x6c\x32\x9f\xcc" - "\x25\xad\xbd\xa0\x9e\xbc\x4b\x03\x54\x7e\x4c\x74\xb7\x2d\xfb\x84" - "\x3a\x0a\xf6\x53\xde\x51\xd2\xda\xba\x3e\x26\x19\x1f\xa2\x76\x7d" - "\x65\xc5\x79\xb2\x6f\x5a\xc5\x69\xe7\x69\xe3\x26\x1a\xb3\xf1\x2f" - "\x64\xf5\x76\x1f\x45\x3d\xa7\xe9\x7b\x47\xc8\x04\x78\xda\x0b\x1f" - "\x93\xfd\x85\xef\xb2\x3f\x6f\x26\x35\x54\x90\x5d\x38\xd3\x93\xfb" - "\x9d\xe9\xb6\x7e\x91\x9e\xda\xe7\x4c\x4f\xeb\x28\x42\xfe\xae\xf7" - "\x68\xec\x51\x4a\xfb\xfd\xa9\xa3\x5a\xfd\x39\x9a\xe0\x58\xc0\xfd" - "\xbf\x70\x4a\xc3\x39\xe4\xaf\xcd\xa6\x08\xca\x46\x97\x09\xa5\x64" - "\xdb\xbd\xb9\x41\x8a\x00\x56\x7d\x3f\x4d\x68\xe8\x27\x7b\xa4\x26" - "\x9b\x98\x16\x03\xb5\xd6\x7a\xc8\xc2\x51\xef\x3e\xd9\x62\xf1\xb6" - "\xf5\x50\x7b\xa0\x9f\x3a\xe8\xaf\xe4\x2d\xfb\xbb\xe7\x17\x4f\xb6" - "\x8c\x88\x80\xf9\x3d\x1b\xbb\x00\x5f\xf1\x8c\xb3\x9d\xcf\x25\x56" - "\x52\x75\x05\x25\x17\x6d\xa4\x51\xa7\x90\xae\x6c\x7a\xad\xd9\x1b" - "\xfa\xbb\x67\xa3\xf4\xc1\x7d\xb4\xa8\xa2\x9d\xcc\x1d\x81\x7a\xf6" - "\xf5\xd4\xc2\xa9\xeb\x2b\xbd\x81\x4e\xf2\x16\xfd\xcd\x13\xb1\xad" - "\x2f\xa8\x8a\x50\xd2\xdb\x17\x3a\x35\xaf\xe5\x02\x79\x73\x03\xf4" - "\x3e\xea\x16\xb5\xeb\xab\x20\xaf\x32\x3b\x02\x41\x3e\x97\x94\x21" - "\x7a\xed\xa3\xab\x8b\x69\x4a\xe3\x39\x9a\xb4\xfb\x1c\xa5\x8b\xbe" - "\x74\x8d\xfd\x6a\x1f\x3f\x6d\xa3\xdd\xb8\x26\x77\x51\x12\xda\xab" - "\x7c\xaa\x53\x74\xff\xda\x81\x74\x6a\xea\x1f\xf2\xaf\xed\xef\x1d" - "\xf2\xaf\x05\x2f\x35\xb3\x8f\x2d\xc6\x45\x2e\xf3\x73\xf5\x19\xb2" - "\x6c\x39\x43\x34\xad\x52\x23\xc7\x93\x7c\x3e\x62\xd1\x08\x6f\xfe" - "\x69\x79\x7f\x82\x72\x0e\xe2\x9a\x8c\x9f\x09\x63\x40\xae\x67\x77" - "\xe9\x7c\x8b\x34\x0d\x69\x6f\xe2\x6a\xc6\x75\xb7\xb3\x41\xf8\x51" - "\x07\xfb\x33\x8c\x66\xfe\xd5\x7d\x79\x31\x2f\xe6\x40\xff\x59\x91" - "\x66\xf0\xb1\x92\xe9\xd9\xcd\xef\x9f\x3c\xcd\xf1\x5a\xfc\x12\x9f" - "\x81\x02\x13\xc7\x6e\xd1\xd3\x81\x43\x4e\x98\xeb\x45\xfd\x3e\x5c" - "\xad\xf8\x61\x5c\xe6\x94\x1a\x65\x7b\x07\x0a\xb8\xce\xf3\x48\x17" - "\x46\x3a\xda\x6b\xe1\x77\xbf\x3e\x79\x5a\x53\x79\xd2\x35\xc0\x0c" - "\xea\xf0\x31\xd6\xb3\xb3\x78\x4c\xf7\x6a\x56\x71\x28\x7f\x06\x35" - "\x8c\x13\x9d\xbb\x5f\x15\xad\x6a\xac\x2d\x9a\xe9\xa3\x95\x0e\xc6" - "\x11\xf3\x76\x6b\x15\xde\x1d\x72\x10\x31\x5d\x5a\x97\xb1\xff\xd8" - "\xa2\x5c\x1f\x8d\x3e\x16\xdd\x06\xe1\x7a\x68\x2e\xcf\x9d\xef\x54" - "\x78\x46\x08\x6d\xfe\xdc\x0e\x5f\x0f\xfd\xa2\xbf\x7b\x84\xf3\x8f" - "\xa4\x79\x43\x27\x68\x7a\x1a\xd9\x59\xff\x6b\x7a\x55\xf8\x70\xed" - "\x66\x7f\x4e\xf0\xc9\xb5\xa7\x68\xd1\x9b\xb7\xa4\x51\xda\x9f\xca" - "\x48\x97\x47\x8b\xde\x8b\x92\x47\x0f\xb4\x77\xb5\x44\xc9\xa2\x25" - "\xe7\x2f\x96\x45\x8b\x3f\x53\xb2\x48\x84\x94\xec\x09\xfb\xf4\xf4" - "\x8f\xe3\xd2\x75\xbf\x90\xc5\x1f\xc4\xa5\x07\xf5\xf4\xb7\xe3\xd2" - "\xfd\x2a\xfd\x91\xd3\x86\xac\xeb\x60\x3c\xd6\xb3\xac\x7b\xe4\x23" - "\x96\x75\x1d\xf9\xba\xac\x93\x3e\x86\x8f\xfc\x46\xfc\xb8\x92\xf8" - "\xec\x11\xee\x77\x30\xfe\xe2\xf7\x64\xe0\x7e\x05\xd2\xb2\x39\xcd" - "\xfd\x57\xb2\xe0\x27\xe5\x9c\x70\xcd\x7f\x97\xe5\x1c\xcb\x38\xf6" - "\x3b\xd9\x35\x4e\x1c\xdd\xf5\xaa\x38\xd2\xf0\xaa\x68\xeb\x73\x3d" - "\x7c\xd0\x90\x77\x3f\x40\x5a\x15\xd2\x7e\x80\xf7\x2c\xf7\x98\x26" - "\xed\xb9\x2d\x7c\x4e\xbf\x0b\x3c\x36\xc3\x6a\xa2\xa2\x9d\xe0\x79" - "\x3e\x0f\xb8\x15\xf4\xf5\x42\x26\xf1\x59\x2e\x19\xe7\x44\xcb\x80" - "\x8c\xea\xe2\xf1\x36\x6e\x0b\xc6\x97\xb7\xec\x13\xaa\x08\x88\x53" - "\x7c\x2e\x8e\x71\xc8\xdb\xf0\x6d\x8e\xe3\x61\x6a\x2d\x20\x62\x1f" - "\x70\xf6\x57\x81\xdc\xb5\xb8\x81\xd3\xa1\x42\xee\xeb\x47\x60\xff" - "\xbf\xa6\xcb\xdd\x47\x8b\x38\x2e\xd0\x09\x7a\x78\x1b\xec\xbb\x20" - "\xb7\xcd\x1a\xae\x24\x3e\xbf\x82\x31\xca\x36\x5e\xc1\x2e\xfc\xdc" - "\xc6\x19\x16\x8e\xed\x84\x3c\xde\xa3\x41\x62\x9c\x7d\xf4\xf0\x91" - "\xf6\xf2\x16\x2e\x5f\xc6\xb4\x11\x2e\xa7\x01\xc3\x24\xcf\xc0\xb8" - "\x28\x89\xcf\xc0\xf8\xe8\x91\x02\xa5\xd3\x58\xeb\xdb\x97\xfa\x89" - "\xe5\xbc\xb7\x1b\x30\xca\x4f\x28\x18\x80\x25\x20\xf7\x63\xde\xe9" - "\xf0\xc7\x6c\x12\x9f\x01\x7e\x16\xf7\x17\x9f\x5b\xe4\xfd\x35\xd0" - "\x25\x99\xfd\xe2\x95\xee\xf9\x70\x7b\x13\xe8\xaf\x9f\xbd\x04\xbf" - "\x3d\xdc\xc6\xe7\x8d\xf8\xbc\xa5\x3c\x6b\xa9\xcd\x20\xb1\x3e\x3d" - "\x79\xf0\xbc\xe5\xff\x0f\x67\x2d\x41\x7f\x7b\xa3\x26\xf6\x03\xff" - "\x36\x3e\x6f\x09\xfc\xa7\x30\x1f\xea\x6d\xea\xfc\xe1\xf7\x24\xcd" - "\xd3\x38\x0d\xb6\xe2\x61\xa3\xff\xb9\xbd\xdc\x96\x13\xb4\x28\xa8" - "\x74\x42\xd1\xe9\xa3\xc5\x9d\xfc\x1e\x69\x5d\x9c\x7f\x3a\xe4\x98" - "\x37\x3f\x4c\xef\x9e\x0c\x6b\xd5\x1b\xc9\xa2\x64\xda\x92\x4f\xb9" - "\xbc\x92\x69\x4b\x9a\x87\x64\xda\x92\x1f\x2a\x99\xa6\x68\xac\x64" - "\xda\x92\xed\x4a\xa6\x2d\xd9\x2c\xf7\xc1\x20\xd3\xf8\x1d\xcb\x35" - "\x43\xa6\xed\x1e\x27\x0e\xb3\xec\xe8\x73\x2d\x29\x32\x64\xdb\x0e" - "\xa4\xb1\xec\x60\x1c\x95\x9c\x7a\xe4\xb0\xf8\xff\xd2\x49\xf9\x19" - "\xf0\x7d\x01\x9f\x55\xe8\xd6\xef\xd1\x2f\x4b\x8e\x2b\x19\xb7\xa4" - "\x75\x48\xc6\x2d\x99\x3b\x54\x96\x65\xdc\x92\xff\x50\x32\x4e\xa5" - "\x37\x7d\x8f\x65\xdc\x23\x87\x99\x06\x3a\x7c\x8d\xd7\xec\xf4\xfc" - "\xa0\xe3\xa2\xce\x68\x19\x17\x3b\xbe\x1e\x9d\x60\xc8\x38\x96\x6d" - "\x78\x9e\x02\x99\x26\xe3\x8c\xf1\x38\xab\x03\xcd\x8d\x71\xc7\x7d" - "\xc0\x6d\xe6\xf8\x3f\x4c\xb7\x39\xa7\x69\x94\x7e\xee\x47\x6f\xf7" - "\xa3\x05\x86\xaf\xa3\x8f\x96\x14\x25\xd2\x9b\x0d\x3d\x0d\xfc\x78" - "\x7d\x18\xe3\xcd\x5b\x89\xb9\xb4\x5e\x54\x76\x84\x8e\xd0\x13\xa5" - "\xa4\x45\xcc\xcf\x1e\xe7\xbe\x85\x9d\x31\x92\xaf\x2c\x7b\x30\x87" - "\xbe\x9d\x17\xa0\x91\xb0\xcd\x8f\x57\x6b\x78\x57\x46\xdf\x8c\x7a" - "\xf7\x47\xae\x27\xaa\xdc\xd4\xa8\x77\x9f\x48\x1d\xef\x0c\xc7\x7e" - "\x7a\xd4\x3d\x9c\xed\x7f\x79\xb8\x7c\xe7\xae\xe1\x71\xf9\xce\x92" - "\xe1\x71\xf9\x8e\xd4\x03\xa6\xf6\x90\x09\xb6\x59\xca\x19\xfa\x8e" - "\x5c\x8f\x91\xb1\x2b\xb6\x24\xac\xe7\x0d\xfd\xfd\x88\xa8\xf7\xd1" - "\x75\x7d\x90\xa0\x7c\x74\x7d\xc7\x2f\x0d\x3f\xd7\x74\x69\xf8\xb9" - "\x13\x2f\x0d\x3f\xf7\x3e\x96\x81\xa0\x9d\x35\xa2\xc5\xe6\x9b\x16" - "\x92\x63\xf0\x30\x9f\xbb\x43\xbe\x55\xfa\x9a\xcf\x71\xe7\x44\x69" - "\x0b\xca\xb3\x59\x3b\xf1\x9e\xcf\x92\xb3\x7c\xce\xda\x40\xa4\xf6" - "\xa8\x07\xcb\xec\x8e\xc7\x6d\x6c\xc8\xc0\x4d\xbe\x7f\x2f\x1e\x37" - "\xbc\x9f\x1a\xf5\xfe\xe3\xa1\x7e\xcf\xbd\xa4\x7f\xbd\xb7\x9e\x88" - "\x63\xe8\x1d\x82\xf9\x82\x39\x99\xe3\x71\xe9\xeb\x33\xdf\x9d\x01" - "\x39\x5f\x19\xe5\xb7\xcb\x3e\x67\xd7\x77\x04\xf8\x9c\x6a\x40\xc6" - "\x4a\x41\x5b\xbe\x8a\xf9\x24\x95\xcf\xea\xf0\xb9\x9d\xbc\x70\x8e" - "\xa6\x62\xe2\x7c\xb7\xc8\x28\x3b\xdc\x3a\x10\xd7\xab\xd7\xc9\x3e" - "\xb0\x01\x94\xd9\x63\x94\x61\xd8\xec\x47\x89\x79\xe0\x7a\x79\x76" - "\x35\xd4\xc3\x72\xf7\xab\xd0\x93\x53\x55\x3d\xcb\x48\xaf\x07\x76" - "\xec\x77\x92\x2f\x75\x76\x64\xf8\xf6\x7d\x2f\xed\xf2\xdb\x47\x7a" - "\xfb\xbe\x97\xf3\x05\xed\xbb\x54\xbd\x55\x97\x5f\xaf\xcd\xa8\xf7" - "\xf0\xe5\xd3\xf5\x7b\xa1\x2f\x4f\xd7\x0c\x9d\xae\x8f\x65\x7c\x01" - "\x5d\x13\xd4\xf3\x58\xfe\x97\xaf\xc7\x61\xd4\x53\x9f\xa8\x1e\x92" - "\x7f\xc3\x9e\xeb\x4a\x32\x62\xd3\x71\x5c\x48\x15\x93\xea\x31\x5f" - "\x74\xec\x4c\x15\x2f\xf2\xb1\x80\x11\x3b\x53\x8f\x61\x89\xb9\x65" - "\x69\x4a\x5e\x33\xeb\x23\x22\xe2\xa3\xa5\x69\x1c\xf7\x30\x6b\x53" - "\x74\x8c\xc9\xa5\xe9\x97\x8a\xd9\xc9\xb1\x72\x84\xc8\xa5\x43\xf5" - "\xd2\x1f\x00\xf3\xd0\xd2\xe5\x7c\x3e\x40\xed\x67\x2e\x2d\x54\x63" - "\x72\x69\xa1\x8f\x1e\x6b\x19\x1e\xc6\x43\xfe\x3d\x15\x19\x23\x86" - "\xf3\xf9\x47\xf9\x7d\x3e\x7a\x5a\xae\x5f\x86\x6b\xaf\x2e\x13\x67" - "\xed\x7a\x2c\xae\xbc\x2b\xa2\x62\x85\x61\xee\x7e\xe2\x2e\xfd\x6c" - "\x02\x68\x50\x09\x5a\x2e\xed\x32\x68\x60\xa4\x23\x2d\x68\xd0\x00" - "\xfa\x4a\xb2\xb7\x39\xc4\x67\x87\x02\xea\xbc\xf7\xe3\xd7\x8a\x9a" - "\x87\x7c\x0a\xf6\xe3\x6a\x9f\x21\xf5\xea\xb2\xc0\x0b\x76\xcd\x28" - "\x3f\xc9\xe1\xfc\x9c\x79\xd8\x9f\xf2\x90\xaf\xcf\xf5\x78\x96\x01" - "\x5f\x30\x5e\x62\x28\x5f\x93\xf4\x4b\x7a\x1c\xfd\xff\xd8\x2c\xc9" - "\xd7\xa8\x43\xe2\xae\x91\x39\x02\xfc\xd1\x06\xcd\x5b\x14\x60\x3d" - "\xb5\x27\x8c\xf6\xb3\xac\x3b\xb0\xda\x67\xe1\x3c\x52\x77\x38\x9b" - "\xae\xa9\x38\x67\x8f\xbf\x17\x39\xcb\xf1\x36\x24\x5e\xc9\x68\x73" - "\x12\xe3\xe4\xc3\xd5\xff\x42\x3a\x2d\x3c\x4f\x3a\x2d\x1e\x7f\x33" - "\x82\xf4\x48\xc9\x10\x0e\x8d\xf2\x8c\xc7\xe3\xdd\x06\x0e\x11\xae" - "\xbf\xcf\xae\x41\x17\xe3\x7a\xbb\xe5\x39\x4b\xd4\x3d\x9d\xe3\x52" - "\x71\x2c\x8b\xf5\xe9\xc4\x38\xf4\xb9\x9e\x98\x60\xd0\x5b\x2f\x63" - "\xd4\xd1\x16\x91\x75\x2b\xda\x28\x3a\x1f\x82\x3e\xf8\xc4\xfc\x8b" - "\xe9\xfc\xc4\xb2\x28\x3a\x9b\x99\xaf\x78\x8d\x05\x7d\x14\x66\x7a" - "\xf3\xbe\x86\x63\x1d\xeb\x55\x4f\xd4\x1c\x0a\x48\xbf\x93\x64\x86" - "\x1b\x01\xfd\x19\x06\xe0\x7e\x45\xd1\xf8\x89\xbd\x83\x34\x46\xdd" - "\x02\x7d\xb1\x45\x9d\x49\x61\xdf\x77\xc8\x8e\x27\x0e\x0f\xd6\xc3" - "\xb8\x3a\xed\x5a\x44\xd8\x39\xae\x9d\x9f\x71\x2d\x75\x88\x20\xeb" - "\x95\xd2\x8f\x09\x6d\x3d\x50\x71\xd4\x02\xdd\x52\x93\x75\xf5\xa6" - "\xb3\x7e\x9f\x24\xef\x51\xd7\x30\xfc\xfd\x16\xc7\x8e\x33\xda\x85" - "\xb6\x24\x31\x6f\x01\x77\xe8\x7f\xcb\xc6\x48\x7e\x59\xc7\xfd\x94" - "\xf7\x19\xa7\x19\xf9\xf0\xfc\x21\xe7\x33\x9e\xf1\x0e\xfc\x95\xf7" - "\x22\xda\x35\x9a\xf1\xf4\x73\xbc\x3c\xd9\xe6\x65\xe9\x0c\xa3\xcf" - "\x95\xe7\x8e\x69\xe7\x40\xae\xc5\xe0\x3b\xde\x23\x6a\x75\x04\xa5" - "\xec\x54\xb4\xcd\x3b\x68\x8c\x49\x2e\xaf\xc6\x58\x5e\x67\x34\x2f" - "\x06\x9c\x43\x7c\x50\x3a\x91\x92\x2c\x0e\x8e\x77\x97\xb7\x5f\xc5" - "\xd5\xcd\x0b\xc5\xf7\x17\xbf\xe3\xd8\x70\x3a\x0d\x79\x3c\xd9\x4e" - "\x50\x9e\x9f\xdb\x86\x77\x59\x97\x9a\x2f\x39\x46\x1b\xc7\xdb\x7b" - "\x45\x8d\x23\xd0\x65\xf9\xaa\x57\xd4\xf9\x9e\x80\x8a\x91\xb6\xec" - "\x39\xa1\xbd\x21\xfb\x8b\xfd\xf2\x64\x3c\x0c\x19\x7b\x62\x19\xfb" - "\xb8\x89\xb1\x45\x6f\xc8\x58\x89\xba\xcf\x9e\xbf\xb5\x28\x24\xe3" - "\xac\x39\x4b\xf9\x1c\x6c\x88\x6d\x32\xe9\x93\x76\xa8\x34\x44\x8f" - "\x04\x99\xb6\xcb\x0e\xf2\x79\xf5\x80\xa4\xc5\xb2\xc3\xc6\x19\x75" - "\x8e\xfb\xc6\xb1\x04\xa7\x87\xc8\xcc\x3a\x85\xc3\xc9\xb1\x05\x96" - "\x37\xb3\x4e\xa2\x68\x0a\xbe\xd7\x44\xa7\xe2\xe5\xe5\x29\x1c\x9b" - "\x51\xed\x2f\x9d\x00\x7f\x9b\xff\x8e\xbc\x37\xa9\x75\x19\x63\xac" - "\x2d\x7f\x83\xf7\x98\x7c\x3a\x8c\x3e\xd7\x72\xcc\xff\x4b\xeb\x2e" - "\x1e\x17\xcb\x53\x0c\x1b\x83\xcf\xc5\xa9\xfd\xaa\x21\x78\x28\x2f" - "\xd7\xa5\x87\x64\xd3\x1f\x18\x56\xe5\xc5\x63\x66\x79\x9d\xc1\xcb" - "\x45\x37\xf0\xb9\xea\x65\xb9\x5c\xff\x70\x32\x53\x38\xbf\xcb\xfd" - "\x94\x74\xd2\x41\xe6\x2f\x3a\x2f\x31\xb4\xff\xb5\x3c\x68\xb4\xc1" - "\xa0\x89\x6a\xc3\x93\x8b\x7a\x53\xad\x9e\xa1\xb6\x3f\xb9\x48\xd2" - "\x62\xe8\xfd\xf6\x28\xda\xf0\xf3\x36\xc5\x77\x4f\xce\x05\x7f\xe8" - "\x6b\x36\x2a\x4d\xa4\x3e\xf4\x5f\x1c\xa7\x51\xe1\xb8\x8a\x0c\x7e" - "\x47\xde\x52\x1f\x9d\x4c\x57\xfb\x50\x4f\xa2\xfd\xcb\x3b\xf5\x72" - "\x13\x18\x97\x84\xed\x8c\xc1\xf1\x29\xe2\x39\x56\xc5\x2d\x78\xca" - "\xc4\xf8\x3a\xbe\xc6\x7d\xfc\x64\x3b\xd7\xcb\x3c\x21\x06\x0a\x46" - "\x04\x06\xd2\xa9\x77\xa0\x00\xe3\x27\x5d\x43\x3d\x90\x7f\x9f\x58" - "\xf4\x3a\x03\x06\xae\x8c\x1b\x74\xc5\xa4\x3e\xb1\x2a\x31\x7d\xb9" - "\x5e\x1e\xef\x03\x05\xa3\xf0\x4b\xc2\x6f\xe4\x97\x9d\x8f\xa1\xd7" - "\x76\xfb\x6b\xc6\x4d\x89\xac\x13\x87\x17\x86\x44\x04\x76\x41\x77" - "\x35\xf8\x77\xec\x66\x0f\x8d\x0d\x3c\xae\xe5\x6d\xa0\x4c\xd8\xb6" - "\x24\x2e\x88\x99\x8d\x11\x5c\xd7\x89\x19\x1c\x8f\x16\xcf\x19\xfa" - "\xf3\x14\x7e\xee\x5d\x27\x96\xf6\xb9\x9e\xda\x6b\xec\xdd\xa9\xd8" - "\x33\x4f\xb5\x0c\xc6\xe1\x31\x3f\xc6\xe7\x7c\x68\x61\x19\xea\x30" - "\x3f\xdb\xcd\xf5\xe6\xf1\xdc\x81\xfa\x90\x0f\xf3\xff\xd2\x19\x9c" - "\xcf\x6f\xbe\x39\x15\xbf\xf4\x61\xf6\x38\xbb\x19\xaf\xde\x94\x71" - "\x53\x0c\x5c\xc7\x06\x32\xb5\x2f\x87\x5b\x7e\x96\x81\x1b\xd2\x0f" - "\x57\xab\xf4\x10\xc7\x22\x63\x1f\x44\xbc\xcf\x37\x70\x35\x70\xe0" - "\xfa\xf8\x5c\xa5\x48\xb5\x76\x72\x6c\x17\xae\xcf\xff\x42\x01\xe7" - "\x75\x1b\xf8\x7e\xf1\xd9\x9f\xc4\x74\xf7\x51\xfe\x31\xc5\x93\xf9" - "\xc7\x8c\xf9\x0b\xf7\xdd\xb1\xfb\xbd\xf9\x9d\xf1\xb2\xec\xc9\x35" - "\x6b\x4a\xf3\x8a\x57\xf0\x25\x7d\xf2\xf3\x37\x8d\x8e\xb6\x49\x59" - "\xbe\xa9\xd8\x00\x2b\xf8\xec\x13\xbd\x92\x6a\xec\x5f\xae\x18\x3c" - "\xff\xa4\xfb\x49\xdf\xcb\xba\x2a\xeb\x74\x78\xb7\xf4\x83\xf2\x4d" - "\x0c\xc6\x74\x3c\x89\xb4\xe1\x64\x27\xcb\x8b\xde\x94\xe2\xfd\x92" - "\x1e\x35\x2f\x3b\x50\x6e\x70\xfd\x33\xb1\x9f\x98\xcd\x16\xae\xcd" - "\xce\x74\x8c\x97\x31\x8e\xb4\x5f\x6f\x3c\xaa\xf1\x1c\x5e\x81\x7b" - "\xb6\x9d\xa4\xde\xa0\xc7\xcd\xf9\xfd\xb9\xa3\x90\xc3\x2b\xba\x45" - "\x8d\xcd\x06\x98\xbe\x61\x71\x88\xda\x63\x67\x9f\xac\x2e\x5a\x49" - "\xc3\xee\x87\xbb\xaf\xde\xa6\xc6\xe1\xca\x25\xad\x76\xe2\x33\xa2" - "\xdf\x3f\x41\x2b\x17\x59\xec\x90\xb5\xe3\xe9\x67\xb8\x97\xb6\x2e" - "\xbf\x8b\xe9\xaf\x6b\x4f\x37\x5b\xcc\x42\x13\x42\x98\x84\xfa\x23" - "\x8b\x7e\x63\xc6\x4f\x13\x26\xb9\x5b\x64\x06\xa5\x46\x8d\xb4\x90" - "\x75\x6c\x72\xd2\xf5\xd7\x4d\xb0\xdf\x7b\xcf\xac\x99\xce\x8a\x72" - "\x70\x77\x28\x68\x15\xd1\x71\x9e\x8a\x73\x96\xdc\x54\x49\xd2\x5f" - "\xa0\xa6\x38\x27\x11\xae\x3b\x5c\xa2\x88\xcf\xe6\x46\x52\xb7\xbb" - "\x9d\xcf\x93\xf6\x6e\xbf\x4f\xe3\xd8\xc1\x3c\x47\x73\xcc\x32\xe0" - "\x7a\xfc\x7d\xa4\xa1\xfd\x65\xc2\xbd\xdd\xad\xf6\x03\x9f\x9e\x18" - "\xa9\xdd\xee\x1e\x82\x6f\x21\x86\xef\x7c\x8d\xb4\x3d\x15\xdd\x9a" - "\xd7\x72\x0f\x79\x1d\x01\x7a\x1f\xf7\xc3\xf4\x67\x11\xe8\x4f\x0c" - "\xa3\xc9\x15\xd9\xe6\xfc\x9c\x34\xfd\x7c\x9d\x76\x86\x9e\xfe\xee" - "\xfe\x61\xca\xf1\x79\xd6\xde\xd4\xab\xce\xf5\xb9\x9e\x46\xff\x7f" - "\x33\xa0\xcf\x09\x90\x5d\x4f\xc3\xfe\x5b\xa1\x9e\x53\xaf\xfa\xac" - "\x57\xc6\xb5\x7c\xba\xc5\xc8\x93\xb0\x8f\x5e\xe6\x35\x47\xe1\xe1" - "\x7e\x15\x17\x3e\xed\x66\xdf\xfd\x61\xf6\xf9\x47\x79\xcb\x6e\xe3" - "\x7d\x96\x11\x63\x83\x94\xec\x3c\x2f\x06\x60\xb7\xa7\x81\x6d\xb5" - "\x30\x6c\xaf\xd0\x05\x91\xdb\xde\x73\x8e\x38\xd6\x1f\xef\xd7\xbe" - "\xb3\xf2\x0f\x9a\x37\x78\xd6\xe3\xdd\x1a\xa1\x0e\xcc\xcf\xde\x86" - "\xb3\x9e\xf6\x9e\x23\xb8\x0f\x53\x3b\xfd\x95\xda\xcb\xfe\xdf\x4a" - "\xb9\x56\xd2\x20\x2a\x99\xce\x03\x17\xc4\x62\xaf\xe5\xff\x21\x8e" - "\x57\xcf\xb2\x02\x74\x77\x9c\xa1\x82\xcd\xbf\x07\x9c\x77\xff\x13" - "\xb0\x64\x6c\xa7\xd9\xf4\x3e\xee\xfb\x5c\x05\x55\x86\x1c\x49\x18" - "\x47\xc3\xe4\xd9\x61\x2d\x7b\x5c\x8b\x40\x26\x71\x0c\x2e\xc8\xa2" - "\x19\xdc\x2e\x3c\x67\xf0\x33\xae\x53\xf8\x6a\xdd\xec\xd9\x6d\x0d" - "\x3d\xce\x32\x2a\x97\xe5\x0f\xd2\x17\x37\x5d\x90\x32\x2b\x47\x7f" - "\x9e\xaf\x3f\xcf\xd5\x9f\xb3\xf4\xe7\x4c\xfd\x79\x16\x3f\x2b\xd9" - "\xb6\xca\x31\x28\x77\xb5\x51\x9d\x78\xce\x30\xfa\x02\xf8\x8c\xb1" - "\x96\x6d\x92\x32\x52\xc7\x63\x86\x8e\x57\x86\xfe\x6c\xe0\x73\xad" - "\x35\xb4\xe9\x7f\x0a\x9f\xfd\x71\xf8\x78\xa2\xf0\x21\x6b\x59\xe6" - "\x97\xc1\xc7\x66\xe5\x78\xcd\xff\x00\x3e\x8c\x0b\xa7\xf5\xb9\x9e" - "\xc9\x8c\xc5\xe7\x99\x1c\x03\x9f\x84\xfc\xb6\x4e\x74\xf3\xfc\x50" - "\x72\xb5\x8c\x55\x39\x8a\x65\x7f\x53\xbf\x11\x4f\xed\x99\xaa\x4b" - "\xc5\x53\xc3\x58\xb0\x23\x0f\xda\xff\xcc\x52\x7d\x1e\x3c\xa8\xf4" - "\xa5\x67\x5a\x0d\xdf\x18\xb4\x75\x6f\xb5\x6a\xeb\xbe\xad\x1c\x53" - "\x6c\x03\x5d\xe3\x2c\x13\xdd\xd0\xff\xff\xab\xd5\xe1\x8f\x19\x03" - "\x85\xa5\x25\x25\xcf\xdd\xed\x28\x5c\xbe\x7a\x85\x63\x72\xbe\xa3" - "\xa4\x60\xd5\xca\xd2\x15\xb1\xfb\xc5\x36\x3d\x5e\xbe\xf4\x83\x67" - "\x9d\x94\xc7\x00\xf3\x3f\xdb\xf1\xca\x77\xf1\xd9\x17\x85\xeb\x19" - "\x3e\x2b\x9b\xd4\x58\x4b\x16\xde\xa3\xe8\x73\x3d\xbb\xd8\x98\x13" - "\x54\x7c\x68\x32\x69\x36\xd6\xb9\x9e\x85\xfd\xfb\x74\x4f\x54\x3a" - "\xe7\xad\x34\xd2\x18\xbe\x2e\x9b\x46\x9d\xa0\x67\x27\x72\x9d\x09" - "\x69\x78\x41\x34\xc3\xd6\x35\xc1\x1e\x61\xdb\x50\x70\xfc\x20\x3e" - "\x5f\x86\x72\x02\xf8\x7c\xc4\xb2\x97\xbf\x01\xa1\x74\x5f\xc1\x38" - "\x7e\x82\x32\x7b\x90\x66\xd9\x89\xbc\xd0\xa7\xbb\xb9\x1c\xd2\xc3" - "\x7c\xce\x1f\xe9\x49\x7a\x4c\x24\xa4\x15\xa6\xf0\x39\x7c\xa4\xd9" - "\xa2\xd2\x26\x73\x9c\x5e\xa4\x39\x14\xbc\xc2\x3b\x98\xce\x78\xce" - "\xd4\x6d\x6e\xce\x33\x4f\xaf\xb7\x32\x1a\x67\x8e\xa2\x7e\xdb\xb4" - "\x0c\xc7\xe2\x47\xee\x9c\x7d\xcf\x53\x6b\x56\xaf\x1c\x4d\x92\xec" - "\xe9\x19\x65\x93\x33\x6e\x2b\xbb\xe9\x6e\x47\xd1\x8a\x15\xc5\x8e" - "\xf5\x2b\x56\x97\x3a\x96\xaf\x5f\xbe\x61\x34\xad\x5c\x53\xfc\x14" - "\x9f\x22\xe7\x6e\x29\xc9\x7b\x6a\xe5\xd3\xbc\xa9\xaf\x72\x8f\x8e" - "\x99\x8f\x17\xb3\x6c\xd3\xe3\x2e\x1c\x86\xcc\x0d\x8a\x94\xf1\x73" - "\x71\xcf\xb1\x88\xec\xb8\xb6\xe2\x77\x10\xbf\x16\xfc\xf8\xac\x7f" - "\xe7\x29\x2a\x4e\xc3\xf5\x40\x9f\xab\x30\x60\xe8\x05\x43\x3c\xf4" - "\x5c\x92\xc1\x43\x98\xc7\x0f\xa8\xf9\xed\xb9\x99\x1d\x21\x39\x7e" - "\x06\x79\xaa\xfa\xc2\x10\x4f\xc9\x78\x87\xec\xb3\xb2\x0e\xef\xc1" - "\xc3\x6c\xc7\x82\xe6\x57\x30\xdd\x4e\x52\xd1\x54\xd8\xfe\x6d\x1c" - "\x0b\x04\xd7\x56\xf0\x4b\x9b\x8a\xbf\xf1\xdc\x01\xe4\x9b\x88\x3a" - "\x0e\xea\x75\xa8\xe7\x71\xe2\x30\xdb\xf9\x27\xf4\x67\x65\x13\xaf" - "\xf9\x90\xef\xf9\xaa\xef\x15\x59\xd9\xff\x4f\xd9\x56\xc6\xbb\xd5" - "\x8f\xeb\x75\x78\x40\x8b\xca\x46\x97\x18\xdc\xe7\xe0\x35\x26\xab" - "\xe9\x5e\x01\x7c\xce\x46\xcc\x8f\x1d\x95\x71\xfa\x2a\xfb\x21\x23" - "\x6e\xbf\xdd\x5b\x26\xf3\x9b\x78\x0d\x6a\x41\x91\x88\x70\x5c\xd4" - "\x88\xf9\xd9\xa3\x5c\x4e\xd8\xc6\xcf\x8d\xec\x1c\x93\xa9\x74\x01" - "\x8e\x8f\xb6\x5a\xf7\x03\x15\x41\xa6\xed\x29\x2a\xfc\x54\xd9\x33" - "\xc5\x69\x4a\xcf\x5a\x9d\x65\xf8\x92\x61\x8c\xa6\xe3\x79\xb1\x21" - "\x03\x7c\xb4\xda\xa1\xfb\xfd\x78\x54\xfb\x57\x57\xe9\xcf\x2d\x3a" - "\x8e\x26\x8e\xf5\x00\xfc\x3b\xb9\xef\x60\x1b\xb6\xe0\xfe\x08\xe8" - "\xd3\xa6\xe8\xb3\x5a\xae\x31\x40\xaf\xe1\xf7\x47\x38\xee\x3c\xde" - "\x1d\x51\x71\x14\x9e\x6b\xe5\x36\x0f\xf9\x06\x36\x64\x82\x7e\x1f" - "\xf2\x9e\x1a\xc6\x52\x8b\xf7\x02\x8f\xcf\xe7\x3c\x80\xb7\xdf\x90" - "\x3b\x2c\x67\xf2\xc2\x18\xa7\x52\x2f\x5d\x1d\x32\xe4\xcd\x10\x1f" - "\xac\xb1\x25\x92\x25\x89\xfa\x5d\xef\x9b\x0d\xc2\x55\xb8\x18\x38" - "\xed\x97\x7d\xc0\x71\x23\x2f\x0c\xea\xbf\x03\x4a\x46\xae\x19\xd4" - "\x7f\x0d\x3c\x38\xde\xad\x8f\x71\xeb\x97\xfb\x9c\xba\xdc\x58\x53" - "\x65\xc8\x0d\x03\x8e\xd5\x24\x22\xd6\x32\xfc\x73\xdb\xf6\xf1\x1a" - "\x2b\xcf\x97\x52\x1f\x01\x9c\xb1\xe7\xd5\x19\x9f\x48\x8d\x6d\x9f" - "\x8f\xd6\x64\x41\xc6\x58\xa4\x8e\xea\x2a\x7c\x7a\x48\x16\xad\xf1" - "\x45\xc3\x14\x36\x9b\x6c\x0b\xcb\x23\xd6\x49\xf2\xc2\x16\x8e\xb3" - "\xb1\x4f\x9f\x5f\x20\x83\x8b\x6c\x06\xae\xa0\xe1\x61\x03\x5f\xfd" - "\x1b\x1f\xb0\xb1\xd7\x14\x2d\x0c\x0f\xb0\xaf\x6b\xab\xea\xcf\xb5" - "\x52\xde\xe0\xdd\x3e\x94\x9d\xef\xa3\x67\x9b\xf5\x31\xd4\x86\xf2" - "\xfb\x0e\x55\x64\x21\x4f\x51\x81\xee\xaf\xd9\x89\xfe\x3d\x12\xc5" - "\xfb\x8f\x47\xd9\xcb\x47\x54\x1f\xde\x53\x79\x82\x8a\xf6\x46\xa5" - "\xeb\x7d\x7b\x28\xe7\x04\xad\x7d\x5c\xd9\x9e\xb6\x42\x55\xbe\x48" - "\xfa\x6c\x1a\x38\xb2\x2c\xe0\xf3\x48\x3c\xc6\x25\xed\x65\x1f\x17" - "\xf9\x8c\xf9\x02\xb0\x0e\x48\x9a\x8f\x13\x07\x99\x4e\x2a\x9e\x41" - "\xe1\x4b\x8a\x4e\x6b\x93\x62\x68\xcf\xf3\x26\xea\x61\x3a\x8d\xdd" - "\x2c\x22\x63\x03\x26\x91\xb7\xc1\x22\x63\x37\xf3\x18\xe7\xbd\x09" - "\xf0\x87\xd4\xab\x14\xdd\xd6\xce\x35\xe8\x66\xf4\x1d\xd3\xc9\x47" - "\x45\x2d\x4c\xdb\xd8\x36\x8e\xea\x3c\x61\xb4\x1d\x34\xe5\xf5\x52" - "\x3c\x2f\xd5\xc7\x45\x9b\x67\x3c\xef\x95\x3f\xb7\xfc\x90\xe5\x4e" - "\x3a\x54\x36\x83\x14\x6d\xd7\xc2\xfe\x7b\x56\xc6\x2b\xd7\x61\x71" - "\x1c\xcf\x7d\x3c\x56\x80\xe7\x5e\x3d\xb6\xd0\x61\xe5\xaf\xf1\xdc" - "\x52\xe8\xfb\x7b\xe5\x58\x5e\x27\x63\x40\x70\x7c\xd1\x4e\xa6\x11" - "\xcb\x45\x1e\x4b\x3c\x06\x78\x3c\x29\x1a\x15\x5b\xa2\x68\xd4\xca" - "\xf4\xd1\xe9\x74\x20\x4e\x96\xaf\x70\x14\xce\x56\xb2\xd8\x91\x3e" - "\x39\x7f\xba\x0c\xe4\xe1\x78\x70\xce\xdd\x8e\x9c\xd9\x93\xcb\x0a" - "\xa6\x2c\x50\x97\x39\x39\xf3\xf9\x3a\x3a\xd6\x7e\x82\x5d\x53\x5c" - "\x18\x6b\x83\xad\xef\x51\xf2\xa3\x78\xab\xcf\x44\x32\xde\x22\x6c" - "\xe5\x9e\xea\x73\x44\x61\xa6\xe1\x6a\xf4\xa9\xdb\x36\x77\x21\x64" - "\xf0\xc2\x0d\xe2\xf3\x26\xa4\x73\x8c\x5a\xe6\x45\xf0\xfc\x5c\xb6" - "\x79\xfd\x29\xc5\x39\xf8\xd9\xfc\x29\xe3\x2c\x0f\xdc\xe4\x14\x80" - "\xd5\x69\xb4\x85\xed\x62\xc1\xe5\xcb\x44\x98\xe9\x92\x57\x86\xfe" - "\x46\x39\xb6\x91\x91\x2f\x88\x39\x20\x53\xd9\x86\x25\x68\x7f\xe1" - "\x1e\x5d\x7e\xe5\xe0\x39\xcd\x47\x19\x92\x8f\x23\x2e\x3b\xaf\xcf" - "\x59\x22\x5b\x6e\x7e\x18\x36\x80\xcd\x80\x09\x58\x23\xf5\xbd\x5d" - "\x09\xef\xcb\xfa\x0a\x46\x6a\x53\x32\xad\x26\x15\xe7\x0e\xe3\xba" - "\xb2\x49\x8b\xe4\x0e\xfa\x02\xe0\xdd\xd8\xcd\x36\xf6\x15\xc8\x05" - "\xbf\x55\x72\x1e\xe3\x5d\xb5\x2b\xe2\xab\xd6\x22\x41\xf4\x9d\x4d" - "\xe9\xcc\x3d\x2c\x33\x61\x7f\x96\x78\x8c\xb9\x4c\xce\x81\x1a\x55" - "\x2a\x1b\xa6\x44\xee\xf1\x9d\x73\x59\x08\x72\x7a\xe9\x0d\x69\xd2" - "\x2e\x09\x46\x5c\x26\x52\xfe\x99\x25\xbf\x31\xe4\x2a\xef\xb1\x58" - "\x37\x0b\x3f\xaf\xaf\x59\x43\xc2\xcf\xfb\x2d\x72\xbe\xa0\x53\xe4" - "\x2d\xef\xab\xe4\x38\xa4\x52\xef\x41\xbd\x6a\xae\x08\xab\xb9\x02" - "\xf5\xc3\x96\x5f\x86\x39\xc1\x74\x8a\x4a\xb6\x32\xfe\x4c\x1b\x5e" - "\xc3\x8d\x80\x56\x5e\x9e\x1b\x99\x3e\xa9\xa9\x1e\xde\xe7\xe7\xb6" - "\x5a\x43\x68\x73\x74\xbb\xb4\x88\x6f\xa7\x0b\xed\xd2\xd0\xae\xb2" - "\xd3\x3c\x4e\x82\xec\x7f\x81\x31\x36\x4e\xc6\xda\x95\x36\x76\xe9" - "\x9e\xe8\x36\xb2\xcc\x57\x6d\x28\xfd\x30\x51\x1b\x85\xc6\x6d\x64" - "\x1a\x94\xbe\xa6\x8f\x31\x89\x27\xcb\x8c\x1e\x2a\xcd\x1d\xbb\x99" - "\x63\xf0\xd9\xe6\x82\x8f\xe6\x70\x1f\x62\xce\x74\x33\x9e\x89\xfa" - "\x8b\xe1\x29\x58\xcf\xe7\x5b\x37\x57\x2e\xeb\x73\x3d\x9f\x91\x98" - "\xde\xcf\x2f\xba\x34\xbd\x9f\x9f\xcc\xe5\x19\x0f\xf6\x03\xb1\x86" - "\x60\xa0\x83\x6f\x61\xa3\x6d\x4b\x54\xef\xd8\xcd\xcd\x8c\x57\xc2" - "\x77\x90\x3b\x3d\xd5\xba\xdc\x01\x1f\x8a\x85\xf8\xb1\x1c\x02\x6e" - "\x6d\x86\x0c\xb2\x9a\x1c\x66\x29\x13\x34\xe1\x4e\x04\xc3\xba\xd9" - "\xcd\x7e\x17\x73\x50\x7f\xc2\xf7\xa0\xb1\x03\x34\x9a\x19\xd9\x72" - "\xcb\x0d\x56\x13\xdd\xeb\x37\xdf\x32\xda\x5a\x16\x9a\xc4\x34\x04" - "\xcc\x32\x8c\xdd\xff\x60\xdb\x54\xc5\xc6\x5a\x87\xf9\xff\x25\xb9" - "\x9e\xe7\x4f\xb1\xcd\x54\xf1\xb3\xd6\xe5\xfa\xa8\xea\x98\xb1\xae" - "\x89\xe7\x02\x1f\xfd\x55\x5f\xaf\xba\xe6\x75\x51\x7b\x15\xe6\x7e" - "\xab\x70\x6c\xb4\x42\x77\x5c\xcf\x71\xc8\x35\x91\x7a\x55\xe7\x10" - "\x9f\x28\x9f\x10\x83\x4f\x50\x7e\x6f\x62\x1e\x58\xf7\xc7\x4b\xf3" - "\xc0\x3a\xb9\x5f\xcc\x74\x57\xf6\xc9\x3a\xbf\xa1\x9b\x88\x2d\xd7" - "\xbc\xee\xa8\xe0\xfa\xd7\x6d\x55\x75\x33\x4d\x32\x79\xad\x7e\x3e" - "\xe8\x52\xd9\xe7\x5a\x3f\xc1\x90\x03\xcc\x2f\xd6\x30\x99\x58\x16" - "\x31\xaf\xe0\xdd\x4c\xc8\x99\x7a\xb5\x86\x38\x6e\x9b\xfc\x46\x94" - "\xab\xd8\xe1\x77\x16\xec\x62\x1f\xce\x40\x8a\x6d\x3f\xf2\x2c\xf5" - "\xd1\x6f\x27\xc9\x3c\x36\xdb\x5e\xc0\xd8\x57\x97\x8a\x79\x59\xf9" - "\x32\x25\xf3\x98\xe6\xb8\x37\x3c\xae\x91\x96\x06\xbc\x39\x06\x0e" - "\x6c\x9c\xf5\x75\x83\x73\x91\x2b\x13\xb2\x42\xc8\xf9\x10\x73\xd1" - "\x84\x5e\xd0\xee\x87\x5a\x64\xef\x85\xe9\x76\xe2\x36\x5f\xd8\x32" - "\x7e\xef\xf7\xa7\x91\xe5\xff\xb2\x3f\x49\x45\xb7\x51\xda\xe6\x3b" - "\x2d\xf4\xbf\x66\x92\xc6\x74\xf0\xd1\xfa\x3d\x8a\x76\xeb\xbb\x8c" - "\xfe\xf1\xd1\xba\xf9\xdc\x1f\xbc\xfe\xb6\x30\x24\x3e\x57\x6b\x84" - "\x65\x90\x7f\xf9\x1e\xf5\xbe\xb8\x2c\x7e\xdd\x87\x75\x78\xc7\xaa" - "\x12\x47\xfe\x9a\xf5\xab\x27\x4e\x8c\xb1\x8f\x2c\xf2\x5c\x87\xab" - "\xcc\xae\xe6\xd0\xb2\xf9\x06\xde\xac\x8b\xe0\x19\xed\x2f\xbe\x28" - "\xce\xf7\xfc\x3c\xdd\x75\x37\x2f\x83\x86\xee\x6f\xa5\xf9\xb7\x46" - "\x3d\xde\x4e\xf3\x6f\xbb\x3d\xef\xe1\x15\xcb\xf3\x37\x44\xa5\xde" - "\x11\xbd\x26\x57\xfd\x3a\xea\x36\x8f\xbf\x1f\xb2\xc2\xb4\xe0\x05" - "\x9e\x4f\x36\xdc\x57\x11\x12\x7f\x87\xbc\x9e\x89\x31\x96\xd7\x5e" - "\x1a\xa2\x76\xc8\x32\x71\x0d\xcb\xf0\x51\xea\xbc\x1a\x74\x28\xf0" - "\x96\x15\x6d\xf7\x43\x97\x3b\xcf\x6b\x32\x28\xb7\xa2\xa3\x9e\x63" - "\xcf\x8e\x4b\x56\x7a\xc5\x06\x07\xd2\x53\x70\x9d\x87\xeb\x48\x5c" - "\xb3\x1d\xab\x61\xeb\xb0\x7f\xf0\x3a\xf6\x0f\xde\xc0\x78\x98\xa6" - "\x05\x2a\x69\x5a\x31\xeb\xe9\x65\x47\x59\xef\xf0\xd1\x86\x6d\xbc" - "\x3f\xc0\x79\x51\x66\xa2\xe3\x19\xca\xe0\xab\x90\xfb\x2a\x1b\x1c" - "\xa2\x66\x5c\xb2\xd8\x95\xcb\xdf\x6e\x99\x84\xf4\x17\xcd\xa6\xe3" - "\x64\xb6\x8f\xfa\x56\x9f\x6b\xc3\x56\xf0\xa4\x1c\x1b\xc3\x7d\xef" - "\x8d\x75\x0d\x1e\xf3\x43\xba\x08\x74\x41\xe8\x22\x79\x65\x2f\x13" - "\xee\x2d\x43\x7a\xc8\x86\xce\x41\x9d\x56\xa3\xd1\x78\xf6\x19\xfc" - "\x8e\xfb\x1e\x83\x1f\x63\x62\x83\xad\x2e\x5d\x51\xbc\x22\xdf\x31" - "\xb9\x64\x34\x45\x45\x06\x2b\x58\xb1\xda\x51\xbc\x62\xed\xf3\x2b" - "\x4a\x64\x54\x2f\x7e\x1b\x33\x9f\xa7\x89\xd4\xb4\x4c\xe3\xcc\x8a" - "\x63\x3c\xd3\x71\xe3\x22\x8e\x27\x25\x6a\xd3\x58\xe7\xee\x51\xb6" - "\xc4\xf6\xbd\xb1\xb6\xc4\x0b\x5d\x4a\x87\xbb\x2a\xa4\xec\x98\x17" - "\x36\xf0\xf3\x09\xda\x18\x1a\x8a\x41\xbd\xf1\x6d\xfe\x0e\x82\x4e" - "\x9f\xa3\x7d\xae\x8d\x7b\x0c\xfa\xf8\xa8\xdc\x38\x47\xd0\x23\xe5" - "\x04\xe6\x52\xc8\xb9\x98\x79\x54\x7d\xcf\x6d\xe3\x3e\xde\x63\x95" - "\x6b\xb2\x29\xe3\xa4\xcd\xc4\x30\x4f\xa2\xbc\xa8\xb9\x8a\xe5\x23" - "\xcb\xb1\x6d\x06\x3c\xd4\x59\xc7\xf5\xe9\x36\xce\x57\x4f\xd1\x0b" - "\x72\xcf\x3a\xe2\x1e\x47\x2c\x3b\xa6\x49\x9d\x63\x9c\xfe\xbd\xbe" - "\xf2\x29\xac\x3f\xca\x38\xe8\x80\xc5\x6b\xb0\x90\x01\x36\xfe\xf6" - "\x1f\xa7\xa9\xb8\x56\x1b\xa4\x9f\x20\xea\x0a\xf6\xb9\x5e\xc8\x1f" - "\xf2\xcb\x2e\x9f\xc2\x3a\x25\xc3\xf5\xd1\x0b\xe9\x0c\x4f\xc5\xed" - "\x7a\x01\xb8\x94\xed\x1d\xd2\x8d\x5e\x68\x8b\xb2\xb9\x80\x8f\xc2" - "\x33\x00\x5c\x64\x8c\x48\xe5\x37\x27\xdb\xcd\x72\xb2\x4e\x6f\xbb" - "\xd1\x1e\xc0\x3b\x0a\x9e\xab\x33\xf6\x5d\x7d\x7a\xbb\x19\x3f\xc6" - "\x3d\x1a\x67\x85\xef\x46\x96\x4b\x18\xc3\xe5\xb6\xa8\x31\xcc\x6b" - "\x2e\x23\x90\x36\x69\xc8\x1f\x77\x63\x61\xbc\x7c\xb8\x7f\xf9\x53" - "\xcf\xb2\x91\x3e\x3f\x63\x8a\x83\x65\x45\xde\xc3\x0f\xcc\x79\x34" - "\x6f\xce\xc2\x25\x0b\x16\x4b\xff\xfb\xc1\xf7\x59\xab\x13\x67\x88" - "\xe5\x2b\x1b\x78\x23\x88\xfe\x1a\x71\x82\x2a\x7c\x2a\x3e\x73\xf9" - "\xde\xd8\xf8\xcc\xe5\x1e\xfc\x8e\xe1\x07\xcd\x64\x93\x0f\x3f\xe8" - "\x91\x15\x47\x74\x7e\xe9\x01\xbe\x47\x86\xf8\xa5\x42\xae\x79\xb3" - "\x5f\x82\x5a\x4b\x2d\x87\xfc\xdf\x38\x29\xfa\xdd\x90\xed\xb7\x29" - "\x79\xd0\xf6\x1b\x94\x05\x9b\x66\x1a\x76\x20\xd2\x2c\xb0\x01\xaf" - "\x60\x1b\x50\xad\xfd\x54\x48\x1d\x2b\xde\x56\x1b\xb2\xd3\x92\xc8" - "\xb0\x01\x39\x36\x24\xef\x7b\xaa\x31\xba\xa9\x34\xca\xc6\x0a\xc8" - "\x78\x81\x17\x94\x4d\xc8\xe5\xe4\x5a\x9b\x6d\x7b\x1d\xaf\x3f\xfb" - "\x53\xae\x0a\x62\x8e\xc7\xbc\xd3\x27\x44\xca\xf6\x3a\x1d\xa7\x03" - "\xbc\x1e\xcd\xfa\xae\xb2\xf7\xca\x67\xb2\xfc\x15\x5b\xc6\xdf\xbf" - "\x30\x2c\x63\xa9\x41\xf6\x6e\x3a\x3a\xc4\x73\x15\x3e\xee\x4b\xa6" - "\x01\xf8\xa0\x0b\x74\xb0\x0c\xb5\xb9\x82\x06\xdb\xac\xaf\x63\x18" - "\x6b\x18\xaa\xae\x8a\xe3\xc3\xb5\x2f\x71\xdb\x2a\x72\xbe\xb0\x6d" - "\xfc\xcd\x1c\x8c\x0b\xa3\x8d\x17\xb7\xaf\xa2\x2e\xae\x7d\xb9\x17" - "\xb7\xaf\xa2\x65\x70\xdf\x65\x70\x5d\xa2\xe2\x38\xb7\x93\xf9\x00" - "\xed\x3c\x6c\xb6\x27\x7d\x2d\xea\x7e\x4a\x22\xb9\x3a\x76\xb3\xa6" - "\x9f\x01\x71\xde\xd1\x3a\x41\xda\x69\xc1\x57\xb4\x48\xc1\x2b\x2e" - "\xfc\x70\x65\x3d\x7b\x48\x57\x15\x41\x85\x9f\x73\x46\x2b\x64\x2f" - "\xaf\xb5\x0c\x77\xb6\x0d\x34\x3b\x66\xac\x03\xe0\xfe\x28\xdb\x93" - "\x0b\xc3\xf7\x0a\x4e\x67\x1a\xc0\x26\xf1\x83\xaf\x8e\x2a\xbd\xcd" - "\xb9\x75\x50\x66\x4f\xb3\xf9\xcd\x9b\xc9\x71\xa8\xe1\x36\x4e\x6f" - "\x40\xdf\xc9\xb5\x41\xf9\x8d\xbc\x61\x60\xe6\x85\x33\x69\x18\xb8" - "\xc7\x0c\xb8\xc3\x9d\x83\x8c\x4e\x5b\xb3\xda\x51\xb0\x7c\x75\xfe" - "\x9a\x95\x2b\xa7\x38\x9e\x5f\xfd\x64\xe1\x9a\xa7\x9e\x65\xc1\x5f" - "\x52\xfa\x3c\xc6\xaf\x1c\xb7\x59\xf3\xe7\xe7\xdd\xbf\xe4\x91\xef" - "\xc6\xe8\x00\x49\x6e\x57\x64\x9b\xfc\x46\xd6\x96\x67\x36\xf6\xb9" - "\x2a\xd1\xff\x4f\x97\xa9\xf9\xa6\x12\xf3\xff\x53\xc9\x4a\xd7\x7a" - "\xac\x5b\x9d\xfd\xac\x6c\x89\x92\x6b\x63\xf1\xdc\xca\xdf\x3a\x18" - "\x5a\x03\xa9\x74\x47\xeb\x10\xbd\xf2\x3b\x75\x95\x7b\x8c\x38\x08" - "\xa5\x13\x49\xb3\x4c\x74\x53\x9d\xc6\xdf\xcd\xaa\x3c\x0c\x7b\xf1" - "\x18\xde\xb7\xfa\xa8\xa0\x5e\xb7\x1f\x8f\xf1\x1e\x2b\xdb\x8f\x61" - "\xd8\x92\x0b\x37\x78\xee\xcd\xdb\x60\x62\x1f\x62\xf9\xdd\x84\xd0" - "\x05\xd1\xc5\xfb\x9c\xbc\x67\xc4\xdf\x4d\xa8\x7e\x46\xda\x93\x66" - "\x99\x07\xf7\xd5\x27\x49\xda\x56\x78\xef\x68\x3a\x29\xbf\xdd\x08" - "\xfb\x63\xf3\x24\x43\xf7\xb4\x6e\x76\xc8\x33\xa9\x3b\x55\x7f\x1c" - "\xe5\xbe\xe0\xfa\xf2\x36\x78\x54\x1d\xe8\x03\x94\xb5\xaa\x75\x9f" - "\xcd\x4b\x2f\xb9\x9e\x9d\x52\x3c\x73\xd8\x18\xe4\xae\xca\x51\xaf" - "\xa8\x78\xc5\xec\x07\xe7\x37\xfc\xb0\xd8\x27\x0b\x70\x0f\xc4\xfb" - "\x74\x29\xbf\x84\xcd\x6d\x86\x3f\x08\xee\x8f\x0e\xea\xcb\xfc\xad" - "\x0d\xd8\x39\x8e\x8a\xcd\x23\xcf\xd0\xe6\xd7\x9a\x86\x59\x57\x36" - "\xce\xa0\xea\x7e\x53\xa3\xfa\x5c\xae\x09\x83\xbe\x24\x78\xe6\x31" - "\x3e\xe4\x0f\xe6\x9a\x69\xf8\x13\x49\x1f\x32\xcc\x59\xfc\x3d\x8f" - "\x93\xe4\xfa\xae\xfc\x7e\xc8\x0d\xbc\x26\xec\x2a\x6b\x95\xbe\x6c" - "\xae\xfc\x68\x5c\x14\x1e\xae\xc9\xbc\x6e\xc9\xef\xa3\x71\x29\x5b" - "\xfe\xfc\xaa\xe9\x65\x2b\x57\x39\x9e\x2a\x58\x55\x94\xb7\x4a\xc6" - "\x0d\x95\x21\x49\x4b\x37\x14\xf1\x2a\xfd\x4d\xa3\xe3\xe6\x0a\xdd" - "\xef\x6c\xd0\xbf\x46\xfa\x9e\xb9\x3e\x06\x3d\x34\xe5\x7b\xb6\xa5" - "\x53\xcd\x87\xae\xee\x8b\xfd\x2c\x5c\x21\xc3\xcf\x02\x7c\xc5\xdf" - "\x6d\x0d\x0c\xf9\x66\x30\xdf\x6d\x99\x70\x71\x99\x2d\x19\x83\x7e" - "\x46\xec\xef\x32\x90\x2b\xcf\x08\xc8\xd8\xd2\xb5\xdc\x6f\xae\xad" - "\xde\xb2\x07\x78\x8f\x58\xe7\xe7\x2d\xcb\x0c\x7e\x36\x7c\xd4\x18" - "\x16\x9f\x51\x98\x1e\x8c\xf6\x4f\xd9\xf2\x21\xe6\x16\xfb\x60\x3b" - "\x5e\xd0\x88\x71\x0f\x68\x1e\xc6\x63\x4f\x3c\x1e\xc0\x6f\x22\xd2" - "\xa3\xfc\x7f\x8c\x76\x6e\x81\xfe\xb7\xf5\x22\x1d\xef\xbe\x07\xe6" - "\x43\x99\x2b\x59\x51\x3a\x9a\xe6\x2c\x2f\x2c\xe4\x71\xbd\x7c\x45" - "\xe1\xf3\xc5\x6b\x4a\xf2\x56\xad\x5e\x85\xd4\xfb\x56\x72\x38\x57" - "\x99\xe5\x6e\xfd\x8d\x63\xf5\x8a\x15\xf9\x2a\x49\xef\x86\xd8\xbd" - "\x11\xb5\xff\xbd\x35\xd3\x47\x9b\x83\x43\x7a\xcb\xd6\x7a\xa1\x6d" - "\x39\x86\xdf\xdf\xe5\x98\x96\x3a\xc5\xd6\xfc\x58\xbb\x60\x6b\xa9" - "\xc1\x0f\xb2\xff\x9c\xec\x23\x62\x7d\xab\x57\xc8\xbd\x04\xf4\xd9" - "\x8b\x7f\xe4\xef\x9e\xfa\xe8\xc5\xc3\xac\x0f\x47\xc1\xd9\x37\x48" - "\xcb\x2d\x8f\x1d\x65\x5e\x64\x78\xfc\xbd\x37\x3e\x9b\x8d\xf7\xe0" - "\xff\xcd\x95\x8a\xff\xb7\x0e\xf2\x7f\xaf\x66\x86\x8d\xb3\xb5\xdb" - "\xd0\x83\x63\xc7\xcc\x8b\x74\xf1\x58\x62\x9f\xc1\x17\xed\x06\x6d" - "\x8d\x7e\x56\xbc\xf5\xe2\x6f\x8c\xb5\xc9\x26\x3d\xb6\x38\xdf\x73" - "\x59\xd6\x71\xc5\xd8\x31\xf7\xb2\x0f\xf4\x09\x7a\x71\xab\xe2\x97" - "\x17\x97\x45\xf9\xf2\xd8\x4e\xd1\x8b\xba\x3d\xfb\x62\x99\x81\x1f" - "\xda\x39\x83\xd3\x18\x86\x1a\xfb\x5b\xc2\x8a\x77\x5e\x6c\x30\x68" - "\xcb\x76\x23\x9e\xf7\x0d\xcd\xe9\x5b\xe7\xf3\x5c\xa7\x9f\x4d\x1f" - "\xe0\xf6\x03\xce\x14\x03\x0e\xf2\xe2\x39\xa9\xd5\xa0\x95\x91\x27" - "\x9a\x27\xe6\x2c\x2f\x82\x51\xb7\x6a\xe5\xca\x15\xc5\x25\x46\xbc" - "\xde\xf4\x35\x85\xf9\x2a\x3e\xef\xdd\xe8\xfe\xf5\x18\x81\xb3\x39" - "\xc4\x2f\x52\xd5\x6d\x9c\x0d\x30\x85\xed\x70\xe9\xef\x25\xf5\xff" - "\x97\xef\x68\xd4\x6d\x81\x13\xf4\xfd\x19\xb8\x42\x1e\xbc\x74\x5e" - "\xe9\x65\x57\x9c\xed\x73\xbd\x54\x68\xe8\x65\xbd\x23\x67\xc2\xbe" - "\x7e\xa9\xdc\xf8\x0e\x93\xa1\x2b\xf0\x59\x14\xcf\x6a\x8e\x7d\xfe" - "\xf2\x6b\x91\x1a\x5b\xba\x18\x2b\x72\xa1\x93\x24\x33\xdf\x8f\xe9" - "\xe1\xb8\xe8\x1c\x2f\xe6\xa5\xc3\xac\xcb\xb0\x2c\xe1\x18\xe7\x5d" - "\xf4\x52\x3d\x7f\xbb\xd9\x47\x2f\x37\xf8\x53\x6c\xe9\x5b\x37\x52" - "\xd2\xee\x57\xe5\xf7\x6f\x7d\xad\xcd\x4c\xc7\x97\xba\x3e\x28\x57" - "\xdf\xd3\xe6\xef\x10\xef\xc0\x3b\xd8\xc3\xfb\xf5\xb5\xe4\x59\xfa" - "\x3a\xde\xac\x3e\xd7\xf7\xa1\xff\x25\xb7\x28\xbe\x24\xef\xd7\x2b" - "\xa9\x8c\xbf\xcf\xa6\x62\xbd\x5c\xbd\x4d\xb8\xa9\x13\x7a\x8c\x1f" - "\xfa\x0f\xf4\xec\x97\x0a\x45\x0d\x75\xaa\x38\xd1\xcc\x17\x2f\x2d" - "\xe5\x76\x02\x1e\xc7\x6e\x4a\xe2\xb5\x1d\x1d\x2e\xc7\x01\x33\x41" - "\x8f\x0b\xb0\x2e\x87\x67\x47\xe4\xc2\xe9\x66\xcc\xdd\x49\x98\xab" - "\xfc\xfa\x77\x7f\x26\xf1\x9a\xe7\xd8\xcd\x3e\xcc\x45\xd7\x8b\xbc" - "\x90\x8d\xf7\x1a\xc6\x18\xdf\x55\xe2\x75\x4f\xe0\xb6\x77\x68\x0f" - "\x01\xe5\x41\x13\xf0\x63\x65\x17\x7d\x5f\xfa\xfa\x33\x2f\x32\xed" - "\xfa\x41\x2f\xfe\xfe\xae\xb8\x70\x7a\x3f\xec\xd0\x31\x27\xe9\xfb" - "\x9f\x30\xdd\x78\xdf\x8f\xfd\x75\x90\x66\xe5\xf8\xd1\xe8\x9f\x8f" - "\x98\x66\x8c\x0b\xda\x95\x11\xea\xcb\xfd\x16\x9f\x21\x64\x79\xb4" - "\xa9\x1c\xba\xdf\x4a\x1e\xcb\xdb\x97\xb0\x3d\xc7\xdf\xfc\xe0\x7b" - "\x67\xbe\x88\x48\x9a\x6f\x64\x9a\x6f\x5f\xb2\xa9\x5b\x44\x3e\x77" - "\x91\x38\x1c\x20\xfa\x5c\xa3\x50\x50\x33\x31\xde\x9a\xf3\x34\x9f" - "\x73\x6c\x26\x6f\xd9\x36\x42\xbd\x49\x3b\x37\x92\x8d\xcf\x85\xf2" - "\xf7\x2c\x3a\x02\x0d\xd4\x51\xd4\x40\xff\x1e\xaa\x23\xcf\x3a\x3e" - "\xe7\xbf\x3d\xf4\xa7\xb2\x3a\xb6\xab\xae\xc0\xfd\x7b\x8e\x47\xb9" - "\xae\x6d\x75\x7f\x3a\xf2\x67\xfa\x93\xe7\xcf\xe4\xf8\x9e\x7c\xde" - "\xd3\x96\xfb\xef\xd4\x96\xf9\xef\xe4\xec\x12\x11\xb6\x09\x2a\x9e" - "\xe3\x3a\xb6\x01\x56\x33\x9f\xa7\xb4\x45\x7a\xed\xa3\xd1\x7e\xcb" - "\xc2\x32\xa2\x8e\x80\x1f\x3c\xf4\x3b\xc6\x71\x72\xe3\x39\x4a\xf2" - "\xac\xfe\x83\xbc\x57\xba\xfa\xe9\x66\x6f\xfe\x51\xd6\x93\x42\x7c" - "\x7e\x94\xf7\x9e\xa0\xeb\x46\xaa\x19\xc7\xb0\xc2\x9b\xbf\x23\x6d" - "\x94\x87\x1e\xa5\x97\xdf\x26\xd7\x78\x77\x33\x3d\x80\x53\xfb\x62" - "\x45\x93\xb6\xa3\xa0\xe9\xa3\x3a\x7d\x72\xa3\xe9\xb3\x2d\x8b\xe9" - "\xc3\xb1\x07\x23\xe8\x2f\xe0\x96\x09\x1a\x44\x8c\x3a\x80\x73\x92" - "\xbe\x6e\x97\xb4\xf3\x1c\x25\x7b\x56\xf3\xb7\x89\xb6\xbf\x65\xcd" - "\xb1\x24\x45\x2e\x9c\xd9\x5f\x7d\x9e\x2c\xdc\x6f\xbc\x3e\x5f\x2d" - "\xdf\x4b\x9a\x57\x71\x9f\x45\x7f\xcf\x9c\xf9\x90\xbf\x69\x8e\xfe" - "\xda\x06\x1c\x26\xa1\xaf\x9a\xf9\xaa\x78\x9b\x3a\xf9\x7c\xbd\xae" - "\xcb\x0f\xa5\x83\xb7\x43\xfc\xdd\x41\xb9\x2e\xb1\x7d\x52\x04\xbc" - "\xcd\xf6\x7c\x63\x2d\x25\x47\x5c\x2f\xfa\x77\x43\xd6\x34\x60\x2e" - "\x6b\x4c\x25\x1b\xaf\x65\xbd\x2e\xfd\x87\x5f\x4e\x37\x64\xcf\xcb" - "\xe3\xf8\x4c\xd2\xf6\xc5\x9a\xfc\xbe\x9c\x2d\x53\xe7\xf3\x4c\xe4" - "\x99\xef\xa3\xab\xf6\x28\xf9\xfb\x72\xae\x31\x96\xa0\x27\xf9\x0d" - "\xfe\xc7\xf8\x74\xf8\x99\xdf\xa5\x1f\x82\x0f\x36\xac\x55\xb0\x6f" - "\xe7\xd0\x37\xd5\x5e\x76\x1b\x7c\x8e\xb6\x15\xb1\x9c\xe0\x31\x3d" - "\x9c\x9e\x0d\x1d\xaf\x4d\xec\xca\xa5\x9d\xa7\x88\x92\x37\x0b\x7f" - "\x72\x97\x55\x74\x04\xda\xe4\x79\x36\xfe\x7e\x62\x23\xd2\xf1\xde" - "\xb4\x20\xe0\xb7\x42\x27\x64\x7a\x58\x8c\x74\xde\x5f\xe0\xf5\x98" - "\x05\x01\xe1\x5f\xb8\xc1\xca\xdf\x77\x9b\x20\xd7\x9c\xf5\xf4\x0e" - "\x3b\xef\x3b\xf8\xad\xa0\x5f\x68\x10\x56\x6f\xae\x99\xf1\x44\xde" - "\xb4\xc1\xbc\xbd\xb9\x16\x6f\x99\xaa\x33\x2a\x6d\xc4\xc2\x32\x94" - "\xe5\xfe\xd6\xd3\x94\x2e\xf9\x83\xa2\x41\xfb\x88\xe3\xf4\xf5\x62" - "\xee\x2b\xc9\x35\x45\x7a\x73\xb5\x30\x60\x63\xfc\xd8\xe4\x77\xe6" - "\x42\x7e\xfd\x5b\x2f\xdd\xe8\xac\xa3\x24\x6a\xb6\xef\x47\x3e\x0b" - "\xc3\xe5\x33\xd1\x1c\x27\x5f\xa4\x54\x25\xd4\x1f\x85\x7b\x7d\x81" - "\xa7\xe2\x7b\xe0\xc9\xaa\x32\x96\x09\x61\x5b\x4a\x86\xe3\x19\xd6" - "\x31\x7e\xf0\x19\xf7\x7f\x18\xe3\x34\x9c\x92\x92\x31\xbd\x9b\x4c" - "\xfc\xbd\x3f\xb5\xa6\x51\x95\xc2\x67\xc0\x9d\x11\x01\xbd\xad\x4a" - "\xf2\x9e\xb5\x87\xfd\xaa\x52\x66\x48\x5f\xa6\xd4\x92\x65\xde\x60" - "\x37\xb5\x55\xfe\x95\xda\x42\xde\xca\x83\xe7\xfc\x16\xe5\xd3\x64" - "\x01\xdc\xaa\xc9\xfc\xce\x09\x7e\xcf\x0b\x37\xd3\x70\x6b\xca\x6c" - "\xeb\x61\x1e\xfa\x9b\xb2\xa1\xaa\xca\x0c\x1b\xef\x0b\xda\xd0\xc9" - "\xe7\xc8\x85\xb0\x53\xa4\x76\x11\xaf\x9d\x3b\x45\x5f\x3a\x4d\xdf" - "\xc8\x6b\x3c\x55\x7b\xa1\xbb\x67\xea\x70\xcf\xea\x70\x3b\x2f\x05" - "\x97\x79\xa6\xad\x5e\xee\x67\xa0\x4d\x8b\x72\xc2\x80\x1d\x4e\x5d" - "\xe4\x86\x0c\x77\x3a\x3f\xe7\xb5\xbe\x9d\xd7\xa2\x9e\x9c\x8e\x50" - "\x27\x71\x4c\x8a\xc6\x08\xe6\xb8\xb3\x76\xd2\xfd\xb7\x9c\x67\x68" - "\x07\xaf\x55\xdb\x60\x8b\x4a\x5c\x58\x4e\xb2\x5d\x5b\x11\xa6\x91" - "\x5e\x68\x35\x7c\x9e\x1a\x30\x52\x3e\xe4\x3d\x13\xc8\x9a\xb0\xb0" - "\x6b\xef\x5d\xf0\x11\xfb\x68\xc8\xf3\xd5\x5b\xae\x79\x7d\xec\x66" - "\xba\x57\x68\x56\xe9\x9f\x17\xa9\x59\x5b\x80\xbe\x6d\x51\xfe\x62" - "\xb6\xf9\x51\xbe\x62\x66\xd4\xf5\x22\xfb\x8a\x09\x9b\x2d\xad\x81" - "\xf7\x30\x52\x4a\x32\xfd\x29\xc5\x19\x02\x7d\xd7\xe7\xda\xd1\xe2" - "\xa3\x1f\xc8\x35\xdb\x2a\xf6\xaf\x96\xf2\x7a\xe7\x64\x7f\x4a\x36" - "\xaf\x7d\xf2\xd9\x2b\x53\x64\x5d\x78\x7f\xf5\x67\x64\x51\x74\xd9" - "\x39\xa2\xa3\xa7\xcf\x23\xdc\xd9\x33\xf9\xec\x8c\x5e\x87\x15\x75" - "\xfc\x45\xd4\x64\x43\x97\xdf\xa9\xcb\x0c\xbe\xdf\xe1\xe7\xf7\xa1" - "\x81\x74\xe8\x46\x3b\xf2\x1b\xfa\x79\x2d\x79\x87\x4d\xb8\xae\xf7" - "\xf4\xda\xb2\x67\x3e\x62\x67\xfd\x68\xe7\x4c\x9f\xf6\xaf\x47\xf5" - "\xf5\x25\x79\x66\x3c\x7e\x5d\x68\xb0\x2f\x77\xd9\x47\x7b\x01\x04" - "\xf6\x5e\xda\x29\x72\xbf\xd5\xef\x22\x6d\x00\x7a\x5d\xbf\x06\xfd" - "\x7d\x57\x6e\xf2\xce\xf1\x94\x81\x77\xe3\x4f\xd1\xce\x1d\x21\x8d" - "\xd2\xf0\xb3\xf9\xaf\x29\xb8\x02\x70\x33\x79\xed\xad\xfd\x1c\xaf" - "\xb5\xec\x3c\x2d\xf5\xae\xd7\x69\x52\x04\xf0\x78\xbf\xa0\x7a\x3c" - "\x4d\xe2\xf5\x2f\xa4\xa5\xe7\x85\xd5\xbe\x99\x61\xab\x6f\x19\x4f" - "\x53\x62\xeb\xdd\xa9\x9f\x05\x77\xcb\xb5\xf4\xf5\x7e\xba\xae\xe8" - "\x1e\xfe\x2e\x60\x75\x81\x70\x99\x85\xb8\xc6\xae\xa9\xfd\xec\xea" - "\x45\xd6\x7a\xc5\x7f\x72\x9f\x08\x7c\xc7\xfb\x70\xfa\x9e\x84\x49" - "\x9e\x95\x4f\xbd\xca\x23\x06\xd2\xb5\xa8\xf5\x47\x9b\xc4\x43\x3f" - "\xe7\x1a\xde\x72\xf3\x32\x86\xc1\xf8\xe4\x2d\x57\xfb\x19\x7c\x06" - "\x16\x34\x96\xf1\x58\xab\x5e\xa7\xe4\x1f\xbc\x4e\xb6\xf6\x95\xdc" - "\xae\x6a\x55\x46\xb3\x10\xe3\x1b\x71\xf3\x78\x03\x6f\x00\x6f\xae" - "\x4f\x7e\x53\x37\x74\xd6\xe3\x2c\x15\x11\xcf\x33\xac\x57\x56\x7f" - "\xe0\x29\xde\x47\x0b\xf9\xcc\x30\x9f\x17\x5a\x4a\xfe\x26\xc0\x6b" - "\x1a\x4f\x36\xc0\x6a\xf7\x16\x12\xaf\x77\xdf\xe0\x29\x3e\xc0\xb0" - "\x8f\xf3\xbc\xb2\x03\xf4\x51\xf3\x8b\xbb\xce\x1b\x3c\x4a\xed\x18" - "\xe7\x0b\x8a\x44\x98\xe1\x9c\x24\xf7\xd5\xb2\xbd\xbb\xec\x8e\x3c" - "\x75\x4e\x59\xb6\x75\x70\x9f\x48\x6f\x87\xf7\x1c\xc3\x73\x4f\xf1" - "\x2e\x83\x7d\xab\xb7\xc9\xa0\xb5\xe2\x2f\xf7\x2a\x4f\xf1\x1e\xe2" - "\xfe\xe1\xfc\x78\xce\xf5\xf6\x20\xef\xe9\xd8\x7e\xe1\x3c\x78\xb7" - "\x1d\x70\xbf\x31\xb4\xd7\xc9\x7b\x70\x43\x79\x1a\x5e\xe7\xf3\x10" - "\x3b\xdb\x76\x81\x46\x6a\xcd\xb8\xfa\x3c\xe3\x8a\x51\x14\xf0\x96" - "\xfe\x35\xb1\x1f\x23\x64\x00\xf8\x7e\x73\x87\xdc\xf3\x71\x7f\xb2" - "\x20\x14\x11\x4a\xae\xd5\xd4\x47\x20\x0f\x7c\xb8\xb2\x4c\x90\x72" - "\x65\x1a\xfb\x8e\xd4\xbc\x66\x35\xa9\xfe\xe5\xb6\xb0\xee\x93\xa8" - "\x8f\xa3\xf6\xa3\x6c\x8c\xab\xd1\xc7\xfc\x4d\xb3\x08\xef\x29\x8e" - "\x07\xbd\x07\xec\xa4\xf8\x4f\xb8\x01\x57\xf7\x8f\xb7\x55\xe9\xf3" - "\x62\x55\x6f\x4a\xca\x2c\xf1\x82\x9d\x0c\x7f\x52\x8c\xdf\x99\x79" - "\xca\x47\xd7\xce\xb2\xaa\x49\x53\x63\x87\x71\xd4\xcb\x6e\x53\xfb" - "\xf8\x35\xb9\x28\x9f\xf0\xdb\x6e\xc2\x0c\xf9\xe3\x82\xb8\x46\x7b" - "\x78\xfe\x14\x90\x59\x98\x17\x46\x7a\x03\xfd\xfa\xb7\xe3\x6a\xaf" - "\x82\xce\x3c\x92\xcf\x26\x18\xb8\x5d\xde\xde\x51\x8d\x4f\xd9\x29" - "\xb5\x0e\x63\xed\x45\xd8\x40\x63\x97\x55\xf0\x19\x1e\xf6\x35\x0f" - "\xa4\xac\x2f\xf2\xa7\x6c\x6f\x56\xe3\xa6\x76\x2e\x74\x5e\x29\x77" - "\xf3\x82\x54\xc9\xed\xe2\xbd\x41\xd8\x40\x23\xb9\xcd\x80\x53\xe0" - "\xa3\x95\x6d\x6a\x5e\x57\xb0\x87\x5d\xfb\x30\xda\x86\x36\xc9\xb6" - "\xa1\x8d\xb2\x6d\xfa\x37\x57\x50\x97\x3c\xbb\x7b\x79\xed\xa9\xd5" - "\xf5\xfd\xf5\x45\xfc\x5d\xc8\x93\x54\xb7\x49\xfa\x5b\xa3\x4f\xd4" - "\xfa\xfa\x2b\x33\xc5\xe8\x1f\x8c\xbe\x3c\x98\xaf\x58\x14\xcc\xed" - "\xcd\x3f\xe4\xf8\x6c\xfa\x77\x9b\x00\x7b\x05\x64\x7a\x33\xdb\x06" - "\xbd\xa8\x8f\xbf\x79\x37\x24\x87\x5e\xe9\xe6\xbe\x9a\xb6\x8f\x32" - "\x15\x1f\xbe\xf2\x71\xa3\xfa\xe6\x0e\x74\x83\x57\xaa\xc0\xf7\xea" - "\x9b\x35\x83\xbe\xc7\x26\xe9\x7b\x1c\x2d\x63\x2f\x13\x47\x29\xef" - "\x44\xea\x5a\xd8\x47\xaf\x94\xf3\x7e\x3a\xe3\xbb\x3e\x64\xc8\xbf" - "\x57\xca\x8d\xbd\x25\xb9\x9f\xbc\x01\xbc\x52\xa1\xce\x2e\xf6\xb9" - "\xea\x26\x18\xba\x8a\xfc\x4e\x8f\x4b\x1c\xe6\x7c\x0b\x37\x9c\x95" - "\xfb\xcd\xd5\xf2\x9c\xee\x29\xfd\x8c\x4b\xdd\xad\xfa\xda\x44\x3a" - "\xfb\x7d\xa3\x2c\xf4\xbf\x03\xd2\x8f\x9f\x69\xc0\x75\x4b\xdc\xe5" - "\xb7\x72\xea\x4a\x87\xf6\x13\x5e\xc9\x91\xe9\xd2\x17\xb2\xae\xca" - "\xe0\x11\xb4\x77\xa4\x8a\x97\x57\x7b\xfe\xd0\x14\x92\x3c\xd0\x2b" - "\xec\xa3\x6f\x6c\x60\x9e\xac\x3b\x10\x4d\xa7\x85\xa1\x88\x53\xc9" - "\xa0\x57\x1a\x84\x1c\xeb\xaf\x34\x7c\xb1\x5e\xf1\xc3\x2b\x0c\x9d" - "\x44\xd1\xd9\x06\xf9\xf2\xa3\x23\x92\xd6\x6e\x2a\xe2\x58\x06\x2f" - "\x54\x70\x3c\x96\x1f\xfe\x91\x63\xdd\x84\xdc\xe4\x0e\xf3\x79\xa8" - "\x95\xec\x93\x02\x5d\xba\x88\xb4\xbc\x22\xde\x43\xc9\x96\xb6\x9a" - "\x70\x42\x27\x48\x85\x9e\x82\x71\xbe\x69\x15\x59\x1f\x2f\x00\x6c" - "\x67\x7a\x1a\xc7\xa2\xe1\x38\x34\x1c\x4f\x2a\xec\x4c\x4f\xc5\xfd" - "\x38\xe8\x75\x36\xfe\x36\x3c\xfb\x5b\x84\x5d\x02\xf2\xf8\x18\xc7" - "\xc3\xd1\xbc\xfe\x20\x6d\x3a\x4d\x49\x1c\xeb\x26\x54\x93\x6d\xef" - "\x08\x7c\x2c\xed\x94\xb1\x45\xd0\xcd\x23\x34\x01\x34\xb7\x47\x52" - "\xb2\x09\x73\xbc\x45\xb5\xfb\xac\x50\xed\x56\x78\x33\xfe\x4a\xc6" - "\x69\xcd\x15\x12\xf7\x1f\x3d\x17\x02\xfc\x88\x7b\x54\x43\xd8\x3d" - "\xaa\x5e\x9d\xa3\x6a\xa3\x8a\x52\xd1\xed\x85\x8e\xcc\x3e\x7f\x7c" - "\xa6\x8c\xfd\x39\xb8\x8d\xdc\x3e\xae\xfb\x4f\xe7\x4e\xcb\xd8\x3d" - "\x21\x3c\x3b\x0b\xf5\x32\x3d\x28\xd3\xd3\x46\xfd\xee\x51\xb2\xed" - "\x1d\x01\x55\x36\x4f\xde\x73\xf9\x28\x3a\xe8\x6d\x1e\xa4\x03\xda" - "\xce\xed\xe3\xf6\x87\x98\x26\xa0\x81\xde\x56\xfb\x80\xde\x4e\x6e" - "\xe3\xbf\x63\xd6\x79\x1d\xed\x44\x5b\x65\x3b\x07\xd0\xce\xc3\x05" - "\x44\xc1\xda\xf5\x95\x9f\xa7\x8e\xaa\x67\x5b\xd3\xf9\x11\xf4\xe9" - "\x72\x37\xc1\xa6\xb4\xbc\x5d\xe1\xd6\x5e\x86\x6e\x52\xe1\x87\x6d" - "\xe9\x17\xdd\xac\xf7\x7b\x8b\xf0\x0b\x35\xc8\x6f\x6e\x4a\x3d\x99" - "\xbf\x99\xb8\x16\x6d\x8a\x7c\x42\x15\xdd\xa2\x1b\x3a\x6a\xd0\x1b" - "\x42\x9e\x02\xb4\x1f\xb6\xe8\x49\x1d\x7f\xce\xbb\xe9\x33\xd5\x2e" - "\x6b\x21\xa5\xbd\xff\xbd\x6d\x9a\xf7\xe8\x36\x32\xda\xf2\x04\xf2" - "\xa1\x3d\x76\xc0\x92\x71\xe3\x22\x68\xe7\x2e\xe0\x19\x8c\x6a\x53" - "\x7b\x4f\x10\x30\xff\x42\xa3\x73\xc8\xf4\xfa\x19\xb4\xe3\x0c\xd9" - "\xdd\x15\xd0\xbf\x1e\x66\xbd\xf1\xd5\x37\xbf\x92\x4b\x93\x7c\xf4" - "\x43\xf5\xbd\x8a\xc1\xef\x9a\xff\xa8\xdd\x88\x9f\x11\xe1\xf8\x43" - "\x29\xd9\x13\x98\x8f\x64\x2c\x0d\x9e\x33\xfa\xc0\x33\xec\x8b\xb1" - "\x1e\x75\xf4\xa5\x8f\x93\xf8\xb8\x54\xfc\x0d\x3c\xf3\x77\x54\xd2" - "\x78\x7d\x01\xe5\xec\x02\x34\x63\xf8\xd0\xe7\x2c\x7c\x65\x1a\x26" - "\x3c\x9f\xf0\x0e\xcd\x44\x1d\xfc\x1d\x0b\x6d\x7f\x85\x5f\x7b\xf1" - "\x1d\x9a\x72\x79\x32\xe5\x47\xa1\xe1\xe4\x37\xaf\xeb\x33\x3c\xb4" - "\x2d\xf5\x14\xd5\x1f\x8f\x1d\x63\x0e\x29\xcb\x94\x1c\xac\xdf\xcb" - "\x6b\xe9\x97\x57\x6f\xbd\x8a\xdb\xe3\x12\xdb\x2e\xb3\xdc\x3e\x03" - "\x0f\xdc\x17\x0c\x87\xfb\xe5\xd3\xe1\x35\xcb\x70\xb0\x76\xbc\x2a" - "\x63\x29\x39\x77\xbe\x0a\x79\x01\x5d\xe1\x90\x9d\xe3\xda\x62\xee" - "\xdc\x13\xa0\x92\xdd\x94\xe4\x3c\xcd\xeb\x3b\xd9\x74\xa8\x21\x83" - "\x1a\x61\xdf\x8b\xde\xf4\xd4\x57\xce\xf1\x9e\xba\x92\x21\xac\x93" - "\x76\x04\x50\xa6\x24\xdd\x56\xfd\xaa\xa1\xc3\xbf\xd6\x5e\x7e\x9e" - "\x34\xf5\xdd\x80\xd7\xda\xb2\x1c\x22\x54\xa7\x45\x0a\x1a\x38\xb6" - "\x4c\xea\x5a\x37\xc7\x96\x31\x62\xad\x48\xdd\xa7\x0c\x63\xae\xd7" - "\x3e\x7a\x47\x31\x4d\xe1\xb8\x50\x56\xbf\xd2\xe5\xd4\x7c\xfd\x1a" - "\xcb\x58\x9b\xbe\x8f\x6c\x53\xf1\x57\xea\xb3\x9a\xce\xa1\x2e\xf9" - "\xfe\xf5\xa9\x61\xd8\x32\x12\x6e\x31\x4d\x6a\x38\x47\xe9\xac\x07" - "\xe5\x7d\xa2\x74\x36\xb6\x0f\xb3\x7b\xac\x22\xfc\xbf\xd2\x69\xf7" - "\xa9\xa1\xb8\x51\xfe\x12\x8e\x35\x25\xec\xc3\x9d\x11\xad\x1e\x27" - "\x7d\x46\x64\x0c\x00\xf5\x5d\x29\xa2\xba\x5a\xb2\xf0\x77\x14\x79" - "\xad\x8e\xd7\x79\xf9\xac\x88\x9a\x43\x5e\x6f\x30\xe2\xea\x24\x96" - "\xe5\x25\x99\xd3\xa5\x8e\x55\x92\x79\x79\xfd\xf6\xfa\xc1\x61\x6d" - "\x15\xc0\x64\x3e\xf8\xef\xc1\xdd\x95\x76\x09\xbd\xc6\x12\x71\x2b" - "\xdb\x2c\x32\x12\x36\xa3\xbf\xcf\xe3\x59\xc7\xf3\xdb\x2e\x37\x9f" - "\xa5\x19\xb2\xc7\x76\xad\xe5\x77\x9c\xc6\xbe\xde\x99\xb2\xdf\x77" - "\xb5\xb0\x8d\xa6\xdb\xb9\xef\x3b\x06\xd3\x94\xbe\xc5\xf3\x2e\xd3" - "\xab\x49\xad\x5f\x8f\xed\x73\xed\x3a\x62\xcc\xbd\xac\x83\xa8\xef" - "\x4d\xee\xea\xf6\x69\x07\x2f\x15\x33\xd4\xa6\x7f\xaf\x55\xeb\xe5" - "\xb8\x3e\xae\x06\xbb\x31\x17\xcb\xef\x09\x6c\x19\x7f\x7f\xc9\x06" - "\x9a\xf0\xc8\xd5\xbc\xa7\x2d\xcf\x44\x74\x2b\x1d\xa1\x21\x73\x68" - "\x6f\x2c\x53\xf2\x86\xfc\x56\x18\xdb\x43\x1a\xf4\x05\x15\xcf\xaa" - "\x47\xe9\x0a\xc6\x79\xd8\x86\xc7\xa3\xea\xa9\x1c\x9c\xf3\x51\x07" - "\xfb\x36\x30\x7c\xa5\x47\x35\xcc\xe0\x3a\xd8\x0e\x54\xba\x40\xc3" - "\x8c\x4b\xd0\x37\x9d\xe9\x1b\xd1\x6d\x5f\x6f\xcf\xdf\x15\x7d\xcb" - "\xc8\x3c\xbd\x8e\xec\xef\x57\xf8\x2c\x98\x63\x4c\x8e\x62\xb2\xa2" - "\xfe\x8f\xf8\x3d\x8f\x4b\xcf\x34\x5e\x83\xdc\x3d\xd5\xcb\x3a\xc6" - "\x40\x6e\xf2\x02\x5e\x9f\x90\x76\xc3\xee\x09\x53\x51\x0e\x69\xa9" - "\xbf\x3f\x13\xb4\x54\x6f\xa4\x29\xfc\x4d\x3e\xa4\x4b\x1f\x04\xff" - "\x57\x9f\xed\xbb\x31\x8d\xec\x37\xd6\xb1\xbf\xfb\xee\x2c\x9f\xf6" - "\xbb\xf9\x72\xad\x8b\xeb\xaf\xdd\xde\xc9\xb1\xbc\xde\xed\xf7\x8d" - "\x50\x7d\xb5\xfb\x38\x9e\xd3\xa3\x9e\x37\x19\x7b\x08\x3e\xda\xed" - "\x93\xfb\x90\xec\xd3\x2b\xfd\x5d\x8b\x67\x0e\xf9\xca\xec\x3e\xae" - "\xe3\x72\xfc\x50\x11\xd1\x6e\x3e\xc7\x30\x4e\x74\xa2\x3e\xe8\x3f" - "\xbb\x02\xfa\x1a\x52\xa7\xe4\x2b\xd6\xcd\x5f\x62\x7b\xf1\xef\x9e" - "\x1d\xc8\xc7\x73\x5a\x5e\x19\x65\x2a\x7b\xa3\x38\x27\x02\xfe\x19" - "\x6a\xff\xee\x6c\x5e\xe3\x4c\x28\xbf\x5f\x27\x92\x65\x6a\xd6\x96" - "\x49\xff\xaa\x9a\xaa\x0c\x5c\x93\x30\x16\xe6\xe2\x9a\x0c\x9e\xe3" - "\xab\x0d\xd7\x4c\x5c\xd3\x44\xcd\xcb\x36\xe6\x4b\xd8\xdb\x76\xd8" - "\x34\x49\xbd\x29\x6b\x8b\x86\x3b\x8b\xc7\xb4\xf1\x6e\x7d\x94\x94" - "\xbf\x68\x63\x6b\xbb\x1f\xba\x24\xc8\x59\x12\x12\xfd\x8e\xeb\xf8" - "\xcc\x4b\x63\xab\x73\x37\xfb\x7b\x34\xd6\xc7\xfa\x7b\x34\xb6\xe0" - "\x17\x04\x87\xcf\xc7\x0f\x7a\x64\x63\xeb\xd0\xaf\xa9\xa5\xcf\xd5" - "\xd8\x0a\x3a\x86\xa4\xae\x79\x59\xe3\xb5\x51\x7e\x23\xae\x9a\x6d" - "\xb8\x94\x45\x99\xaa\xbd\xdb\x2b\xf1\x9c\x24\x52\xb6\x7b\xf4\xf6" - "\xe6\xe2\xd9\xe6\x70\x62\x0e\x4e\x01\x4d\xc6\xa3\xcd\x29\x55\x19" - "\xdc\x5e\xc6\xb7\x37\xa5\x64\x6e\xf4\x39\x44\x86\xc9\xed\xf7\xa7" - "\x14\xf3\xba\x04\x89\x69\x36\xbf\x41\x4f\x9d\x4e\xbc\x5f\xa5\xf5" - "\x02\x86\xd2\xd9\x90\x1f\x30\x8c\xfc\x83\xb4\x1f\x4f\x52\xc7\xe3" - "\xba\x60\xbf\x27\x19\x67\x1c\xfb\x5c\x4d\xfb\x3f\x28\x54\x7b\x19" - "\x5c\x36\x10\x55\x96\xcf\xc6\xc7\x94\x4f\x89\xea\xbb\xf1\x68\x4b" - "\x4a\x76\x86\xea\xbb\xb5\x95\x3a\x2e\x69\x0a\x97\xe2\x8c\x93\xd4" - "\xf8\xa1\xc2\xa7\x69\xcf\x70\x63\xac\x62\x22\x74\x54\x48\xe4\xe9" - "\xca\x76\x9d\xe5\x9d\x10\x20\x6f\x43\x04\x7a\x4b\x71\x51\x66\x85" - "\xf0\x9c\xa4\xe6\x4d\x1d\xc1\xee\xcb\x9c\xd3\x9b\xa5\xdf\xad\xe8" - "\xaf\x24\x6f\xf9\x6d\xf2\x1b\xb5\x67\xe8\x8d\xb7\xbd\x7e\x19\xeb" - "\x99\xef\xa5\x0f\x2f\xfb\x62\xf0\xfc\xc6\xb1\xcf\x8c\x75\x82\x08" - "\xf2\x36\x72\x3a\xd2\xbc\x01\xbf\x8c\xb1\x36\xe4\x4b\xbd\x36\x57" - "\x8d\xb5\x37\x56\xc8\xf3\xdb\x8c\x6f\xe8\x5b\x1e\xc6\x39\xe2\x5e" - "\x9b\xcb\x6d\x70\xc2\x86\xf5\x86\xfa\x3c\x3c\x56\x1c\xeb\x78\xdd" - "\xf3\x8d\xfb\xc0\x8f\x22\x52\xb3\x36\xf7\xf2\xda\xf0\x86\x8c\x11" - "\xec\x0c\x89\x33\xfe\x94\xb5\xb9\xac\x57\x55\x57\x8c\x48\x9a\xd3" - "\x20\x3c\xbd\xa9\xc5\x45\x7d\xae\x37\xf2\x3f\x28\x53\x7d\x76\x99" - "\x70\xf3\x8d\xb6\x37\xea\x6d\x07\xbd\x24\xcf\x4e\xaf\x57\x31\xe5" - "\x90\xa7\x61\xf8\xb9\xac\x38\x87\xe7\x32\xf6\xf3\xd4\x69\xd1\x33" - "\x38\x67\x5c\x1e\x1e\xc3\xc7\xc6\x1e\xaa\x63\x40\xd5\xf1\xe3\x9c" - "\xff\x5e\x1d\x3f\xce\xb9\x54\x1d\x90\x19\xd7\x9e\xa2\x1f\x1f\xbb" - "\x7c\xfb\xf7\xc7\xd2\xfe\x85\x5c\xcd\x55\xb2\x74\x4f\x76\x18\x36" - "\x68\xc8\xb6\xbd\x52\x7e\x4f\x46\xa3\x4a\xaf\x2f\x44\x21\xf7\xa2" - "\xcc\xf6\xb2\x7e\xf2\xac\xfb\x33\x75\xd1\x4f\x64\xfc\xd7\xf6\x52" - "\xb6\x3b\xb7\x7b\x06\x6a\x8b\x3d\x03\xda\x8f\xa7\x30\xbd\x77\x73" - "\xfc\xbe\x28\x3e\xeb\x08\xfc\x99\xbc\xcb\x78\xad\xb8\x93\xd7\xe8" - "\x3d\x90\x1b\x95\x11\xc8\x0c\xd8\x19\x61\x49\x0f\xe8\x60\xca\x66" - "\x5c\x5f\x20\x6d\x46\xbf\x3c\x97\x37\x06\xba\x7b\xb2\x70\xad\xdc" - "\xca\xeb\xf8\xe1\x81\x5c\x47\x9f\x8b\x72\x38\x96\x1e\xaf\xa1\x0b" - "\x9b\x0d\xf4\x34\x0b\x69\x13\xc2\x7e\xe1\x98\x7a\xde\x80\x8f\xc2" - "\xb0\x05\x1a\x2e\x50\x5a\x03\xf4\x67\xc8\x72\x1b\xcb\xfb\x26\x3d" - "\xa6\xde\x8e\x0b\x43\x31\xf5\x1a\x79\xbd\xea\x28\xee\x2f\x90\x25" - "\x5c\xb3\xbe\x60\xd7\x05\x9a\xb4\x7b\x1d\xa5\xef\xe2\xf5\xc8\x4f" - "\x95\xfe\xc6\xfa\x86\x8c\xaf\xb7\x26\x9d\xf7\x26\x86\xf4\xb7\xf5" - "\x1c\xf7\x73\x50\x9e\x59\xe4\x3a\xce\x65\xd1\x7b\x8f\xfc\x46\x40" - "\xc8\xbd\xb6\x2c\x64\xab\xca\x18\xa8\x2d\x99\xeb\xa3\x9f\xcc\x1f" - "\xd0\xde\x38\x9c\xa8\x6f\x0d\x5f\xab\xba\xa8\x98\x88\x1f\x4c\x52" - "\x72\x1f\xb0\x86\x8f\xcb\xb6\x2b\x97\xa6\xf7\x50\x86\xf2\x9f\xb8" - "\x02\x73\xe5\x9e\x00\xef\xe7\x57\x3c\x47\xf6\xf0\xae\xa5\x26\xe7" - "\x1b\x64\xe6\xef\x17\xf3\xaf\xe2\x33\xd1\x3d\xbd\x90\x32\x78\x2f" - "\x85\x7d\x2c\x1c\x2f\xc8\xfc\x1f\x4e\x2a\xa7\x8c\x68\xd8\x73\x95" - "\xf3\xd3\xdd\x8e\x79\xab\x9f\x5a\xf3\x5c\xd1\xf2\xd2\x55\x4f\xae" - "\x2a\x5c\x55\xba\xe1\x6e\x19\x4c\x58\xfe\x7b\x70\x72\xfe\x62\xb9" - "\x09\x1e\xa5\x77\x4c\x1a\x5a\x53\x7c\x73\x53\x98\xd7\x40\x2e\x8b" - "\x5e\x6f\xce\xd5\xf7\x15\xfd\xbb\xe5\x3e\xdb\x9b\x6e\x9f\xf6\x6f" - "\x0e\xb5\xb6\x51\x92\xb9\x43\xc5\x43\xe9\xf6\xdc\x10\x66\xf8\x73" - "\x15\x2f\xbf\x6c\x03\x2f\xcf\x3a\x41\x7b\x97\xf2\xfe\x0e\xfa\x6b" - "\xae\xb7\xfc\x14\x41\x47\x99\xc5\xfb\x46\xed\xbc\x26\x23\x75\xf8" - "\x9f\xaa\x33\x0c\x67\x64\x6c\xa0\x3d\x27\xf0\xcc\xbe\xea\x11\x91" - "\xbb\x2b\xbc\xc6\xbe\x27\xb2\xc6\xfe\x53\x21\x72\x5f\x8f\x9c\x2d" - "\xd8\x25\xce\x16\xbc\x3e\x74\xae\xff\xa7\x57\x85\x5c\x64\xc6\x0f" - "\xbc\x60\xf2\x45\xed\x21\xf2\xbb\xbb\x18\x66\x51\x31\xfb\x72\xfd" - "\x94\xfd\xa3\x61\xfb\x9b\xfe\xe6\x77\x16\x98\xe7\x77\x81\xe7\x55" - "\xbd\x2b\xbc\x5b\x4f\x92\xda\x37\xfe\x69\xbe\x47\xae\x73\xff\x34" - "\xcc\xe5\x78\x9f\x91\xf5\x7e\x19\x3f\x54\x7b\x53\xfa\xf2\xb1\xce" - "\xbf\x3b\x95\x6c\xee\x54\x4a\xee\x73\xfd\x74\xd0\xff\x4b\xd8\xd4" - "\xdc\xca\xf3\x1b\xc7\xbb\x85\x8c\xe9\xe3\xb9\x92\xf1\x60\xbe\x04" - "\xcc\x83\xbc\x07\xa9\xce\xfd\xfc\xf4\x30\xf4\xc8\xbd\x97\x2f\x63" - "\x7f\x2a\xd7\xe4\x85\xe6\x14\xd3\xab\x68\x99\xdc\x1f\x56\x7e\x8a" - "\x16\x8c\x43\x87\x6a\xcf\xde\x3b\xe4\xde\xfe\xba\xd3\xcd\x18\x27" - "\x95\x4d\xfd\x94\x1c\x71\xdb\x26\xb1\x3e\xd3\x5e\x2e\xf7\xd5\x93" - "\x50\x6e\x3f\xef\xbb\xcb\xb3\x72\x32\x7e\xf2\x9f\xa9\xe9\x3c\x59" - "\xba\xe8\x67\x59\xbc\x3f\x30\x44\xdb\x9f\xbd\xc6\xfb\x42\x62\xa7" - "\xc8\xb5\x96\x6b\xdb\x18\x46\xe4\xc2\x99\x99\x46\x39\xcc\xe1\xa3" - "\xb8\xdc\x09\xfa\xd9\x26\x59\x8e\xf3\xca\x6f\xef\xd9\x96\x62\xde" - "\x2a\xe3\xfc\x21\x3c\x37\x46\x6c\x39\x02\xe3\x2b\xbc\x2e\xbc\x1f" - "\xef\x16\x47\xdc\x25\x73\x91\x96\x2b\xd7\xa5\x07\xec\x24\x63\x74" - "\xd8\xb2\x67\x7a\x7d\x7f\xf7\x48\x7c\xd8\x5f\xb5\x14\xb2\x48\xea" - "\x7f\x3f\xfb\xa8\xf1\x53\x19\xd7\x19\x7d\xb8\x37\x5f\xe7\x91\xbd" - "\x0a\xbf\xbd\x2b\x7a\x6b\x47\xd5\xf7\xda\x8a\xe7\x06\xb4\x24\x3a" - "\x64\x67\xbf\xf8\x97\x6d\x87\xec\xfd\xb0\x21\xf6\x4e\xf1\x99\x23" - "\x87\x95\xee\xa1\xca\xf1\xbe\x14\xf4\xd2\x1e\xb3\x7d\xec\x00\xde" - "\xcf\x37\xfc\x3b\xf8\x7b\xd5\xbc\x2f\xe5\xa3\x9f\x4d\x62\xba\x81" - "\xcf\xdb\xe4\xde\xc4\x96\xc7\xba\xd1\x9e\x91\xec\x83\xc7\x74\xe6" - "\xf3\x07\x56\xdc\x8b\x75\x62\xa6\x35\x94\xa9\x35\xc9\xb3\x86\xf2" - "\x0c\xfb\x0c\x3d\xce\x48\x86\x1e\x77\x64\x0a\x3f\xab\x33\xf0\x7b" - "\x0f\x18\x67\xce\x39\xb6\x8a\x7e\x5e\x4c\xfa\xf5\xc9\x98\x23\xe7" - "\xd4\xde\x2e\xfb\xf5\xf1\x9a\x26\xfb\xc9\xf3\xfe\x2b\xca\xf5\x44" - "\xf9\xc6\x9b\xf0\x1c\x32\x62\x8d\xf4\xb9\xde\x4a\x1a\xf4\x17\x42" - "\xdb\x7b\xdd\xc5\x99\x01\xdb\xcb\xb6\x80\x7b\x2d\xe6\xef\xb7\x26" - "\x41\x16\x15\x5e\xc2\x76\xb2\xf0\xd9\x43\x8e\x2f\x11\x49\xb5\xcd" - "\xe7\x18\x13\x1c\xcb\x4a\xf9\xb7\xbf\xf5\xa2\x7e\xa6\xdb\x7c\x86" - "\xde\xba\x6f\x68\x1f\x34\xac\xaf\xdd\xbd\xb5\x4f\xe9\x5d\x6f\xed" - "\x93\x6b\x77\xb5\xc5\x8e\x9f\x6c\x0c\x6a\xfb\x37\xfa\xb4\x46\x79" - "\xbe\xeb\x2d\xd0\xee\xdd\x42\xc3\x47\x06\xf9\x96\x31\xac\xc4\xf3" - "\xe4\xb8\x24\x05\xf3\xe7\x32\x46\xe9\x90\x7d\xf3\x73\xf5\xdd\xa3" - "\x2d\xe3\x97\x45\x78\xce\x4b\x5d\x94\x23\x7d\x4b\x8a\xce\xf1\x1a" - "\xde\x48\x65\x6b\xa9\x3c\xba\x5f\xe6\x95\xa7\x62\x9f\x53\xf9\x59" - "\xd1\xec\xe7\x19\xc6\x7e\xc0\x4e\x2d\xe2\xb3\x9a\x48\x38\x9b\x45" - "\x80\x63\x98\x41\x9f\xf2\x7b\x31\x87\xa2\x0e\x01\xf9\x30\x0a\x65" - "\x56\x30\xed\xd5\x18\xfa\xb9\xfc\xbe\x47\xc4\x75\xaf\x70\xb2\x1e" - "\xe9\x67\xdf\x96\x73\x84\x7c\x29\xc8\x57\xd3\x5a\xde\xc3\xbe\x33" - "\x76\x8e\x0d\xd6\xa5\xd7\xed\x4f\x19\x97\x74\x63\x32\x2d\x43\x9d" - "\x7b\x7c\x54\x5e\x7e\xf9\x63\xfb\xe7\xc3\xea\xb2\x43\xed\xfa\x45" - "\xda\x50\x9f\xfc\x4d\xef\x93\x5f\xa4\x7d\xd1\x1e\xb2\xae\x93\x5c" - "\x75\x8a\xde\x1e\xc1\x76\x33\xee\xaf\x3f\x45\xfb\xe4\x1e\xa5\xf2" - "\x45\xde\xf7\x47\xfd\x1e\x75\xec\xfb\xa5\x7e\x7f\x0d\xee\x5f\xd3" - "\xef\xc7\xe3\x7e\xb3\x7e\x0f\x7a\xef\x5b\xa5\xdf\xa7\xe1\x7e\x91" - "\x7e\x8f\xf1\xb9\xef\x2e\xfd\x7e\x1c\xee\x27\xea\xf7\x57\xe3\xfe" - "\x0a\x7d\xef\x2d\x09\xf8\x9e\xbf\x7c\xbd\xe8\x17\x1e\xb5\xbf\xc3" - "\xfb\x6a\x6f\x4e\x51\x63\x7a\x30\x2d\x0d\xf6\xe5\x62\x63\x7d\x1d" - "\xe9\xfc\x2d\x9e\x24\xa4\x4f\x01\xff\x65\x44\xa5\xef\xd5\xf3\x67" - "\x41\xcf\x72\x47\xa5\x37\xe8\xe9\x4b\x91\xbf\x25\x2a\xdd\xad\xa7" - "\x97\xfa\xa8\xee\x58\x54\xfa\x56\x3d\xbd\xca\xd8\xd3\xd6\xd3\xcb" - "\xf4\x74\xf4\x7f\xd5\xd6\xa8\x74\x3d\x9e\xe0\xbe\x83\xe8\xe3\xae" - "\xa8\xf4\x65\x92\x67\x65\x5c\x38\xab\x38\x54\x3e\x03\x63\x7e\x9f" - "\xcf\x47\xb5\xe5\x51\x79\x16\xeb\x65\x83\x3e\xaa\xd9\x13\x95\x3e" - "\x57\xa5\xbf\x6d\xf3\xd1\x5f\xf7\x46\xa5\xcf\x1a\x8e\x87\x4c\xf5" - "\xb4\x6c\xb8\x75\x2e\xfe\xbe\x87\xf4\x8b\x93\x3e\x91\xef\x64\xf3" - "\x19\x19\xeb\x6e\x71\xc2\x51\x21\xc4\x09\x7a\x67\x86\xee\x2b\x96" - "\xc6\xfe\x41\x7c\xa6\xa8\x8b\xde\xb9\x56\x9e\x3f\xe1\xb8\x68\x7c" - "\xce\x68\x23\x9f\x33\x7a\x5b\xc6\x79\x9d\x5e\x56\xa9\x62\xa6\x29" - "\x7f\xc3\x1e\x69\x2b\xe9\x7b\x61\xc8\xc3\xdf\x0f\x25\x86\xc3\xeb" - "\x2c\xde\xd2\x7e\xe9\x17\xc7\xba\x2a\xa7\xb1\xcd\x20\xcf\xa4\x44" - "\xe9\xac\x6a\x3c\xbe\x93\x1d\xe1\xf3\xc0\x2e\x65\x57\x55\xab\x58" - "\x7c\x3d\xec\xc7\x11\x9d\xd7\x47\xef\xcc\xe7\xab\xd9\x6e\x3d\xde" - "\xe7\x7a\x67\xca\xd0\xb9\x8a\xb7\xb7\xea\xe9\x3e\xa4\x67\x45\xa5" - "\x5f\x14\xdb\x77\x50\x3e\x55\x89\x22\x91\x2c\x9a\x07\x2e\x88\x40" - "\xe8\x82\x08\xee\xfc\x4f\xe0\xbd\x52\x9e\x37\xb8\x2e\x5c\x25\xf6" - "\xeb\x67\xeb\x8f\x87\xd6\x09\x3f\xf4\x34\x8e\xd5\xfd\x95\x05\xb0" - "\xeb\x16\x14\xf5\x89\x1d\x4f\xb2\x5f\xd7\x79\x19\x67\xc6\xd9\xc3" - "\x71\x41\xd9\xcf\x27\xc0\x7b\x08\xc9\x1d\x90\x3d\x8d\x2b\xf9\xfd" - "\xc7\x94\x5d\x00\xfd\xa7\x20\x4c\x8d\x80\xbd\xfb\x49\xc3\xa7\xe8" - "\x9d\xae\x41\xdf\x39\xe0\xc0\xf5\x39\x65\xac\xfd\x77\xa5\x9e\xcf" - "\xdf\x10\x12\x35\x55\x99\xe2\x0f\xac\x57\xac\x5d\x66\xdd\x4c\x0e" - "\xc8\x5c\x07\xee\x73\xd4\x0f\xef\x90\x3e\x5c\x9b\xd4\x38\x7d\x57" - "\x7d\xd7\xd3\x4d\x0e\x25\x0b\xde\x5d\x2a\x7e\xcc\xe7\x2d\xde\x5d" - "\x06\x59\x62\x87\x0e\x93\x70\x4d\x74\xd3\x6e\xd2\x06\x6a\x31\x67" - "\x9c\x69\xd1\x94\xec\xd9\x3f\x3f\xa2\x25\x6d\xe6\xf5\x1c\x19\x6f" - "\xbb\xd6\xb6\x74\xdf\xea\xa0\xd6\xbe\xb1\x8b\x5e\xb8\x9a\xec\x4b" - "\x83\xec\x17\xfc\x6e\xfb\xd8\x52\x8e\xfd\x56\xec\x80\x3e\xa0\xfd" - "\x1a\xef\x7f\xbf\xba\x45\x0b\xc9\x79\x64\xff\x7c\xb9\x06\xe0\xb6" - "\xcd\xe0\x3d\x04\xef\xd1\x30\xeb\x32\xc9\xd0\x65\x26\x89\x92\xf4" - "\xa4\xf0\xfa\x82\xd4\x50\x49\xc1\x57\x76\x17\x53\x72\xb8\x24\x3d" - "\xed\x95\x0b\x34\xd3\x88\xe3\x0d\x1b\x21\x43\xf4\xd9\x47\x57\xaf" - "\xa3\x29\x6c\x43\x8c\x35\xd9\xe4\xbe\x0c\xdf\x47\xb4\x1f\x75\x37" - "\xae\xbb\xf4\x37\x03\xc2\xb0\x1d\x38\xde\x2f\xe3\x92\xa8\xad\x55" - "\xaf\xc3\x1e\xd1\xcf\xe2\x55\x7c\x42\xe3\xa0\x7f\x68\x63\xcf\x0b" - "\xcf\xa9\x42\xd2\x38\xde\x7a\xc5\x0a\x69\xa7\x8f\x68\x2f\x08\x91" - "\xb7\xec\xaf\x54\x51\xcc\x7d\xb4\xff\x0d\x9e\x3f\xd9\x4f\x0f\xf9" - "\x6d\xa7\x68\xff\x2f\xad\x41\xd2\xf0\x33\x79\x9e\x61\x9d\x7b\xff" - "\x87\xac\xf7\xfb\xe8\x97\x49\xec\x2b\xec\x29\xbe\x9f\xd3\x8e\x3b" - "\x3f\x91\xfb\xe8\x76\x75\x5e\x6f\xff\x41\x7e\x76\xf2\xd9\xc0\xd4" - "\xab\x32\xdf\xe9\x0f\x8e\x50\xb6\xe0\xfe\xf7\x74\xd9\x6f\x43\x9f" - "\x4d\x00\xec\x61\xd7\x85\x23\x6e\xb3\x47\x70\xcc\xd6\x86\x10\x2d" - "\x08\x08\x9f\xdc\xf3\xe2\x33\xd1\x65\xf7\x7a\xc4\x05\x37\xa9\xf3" - "\x40\xbf\xdc\x1c\xa9\x31\x7b\xd8\x27\x00\xf7\xf2\x5c\x9b\x5a\x53" - "\x32\x77\xaa\x75\x18\xb3\x4f\xad\x29\x99\xfd\x5b\xc6\xb3\xbf\xea" - "\x2f\x2b\x7b\x53\xf8\xdc\xea\x2f\x17\xf7\xa6\x5e\xed\x1e\x7e\xae" - "\x21\xbf\xe3\x3a\x4a\xe3\xb5\x4c\xf6\x3d\x6d\x52\x3e\xa7\xa8\xe3" - "\x57\x5b\x45\x8d\x7c\x77\xfd\x89\x22\x32\xf3\xfa\x0f\xea\xfd\x68" - "\x7a\x03\x39\x80\xeb\x18\x61\x33\x37\x4b\x3f\x20\xb7\x79\xbf\xb7" - "\x47\x78\xd8\x0f\x4d\xad\x39\xff\xca\x2d\x52\xcc\xcd\x2a\xff\xaf" - "\x26\x76\xf4\xa0\x0d\x36\x73\x91\x37\x78\x5a\x9f\xab\x7f\x05\xde" - "\x37\x17\x09\xb7\x59\x3f\x63\xfb\xab\xb5\x86\x5c\x55\x3c\xfa\xab" - "\x15\x3a\xaf\xfb\x15\xdd\x7e\xe5\xd6\xe7\xa5\xeb\xf9\x1e\x7a\x42" - "\x86\xda\xcf\xfd\xd5\x52\x43\x77\xf1\xe9\x79\xb8\x0c\xee\x33\x95" - "\xac\xfd\x55\x39\xda\xae\xef\x03\xff\xca\xc1\x69\x68\x1f\xe6\xa6" - "\x5f\xb6\x70\xbb\x86\x93\xad\x92\x16\xe5\x64\x06\xce\xee\x88\x8a" - "\xb1\x1a\xf0\x06\xee\xf5\xa8\x6f\x80\x1d\xb8\x5a\x9e\x41\x44\x3d" - "\xe8\x1f\x8d\xe5\x26\xc7\x3a\x60\x78\x51\xf8\x87\x0d\x5c\xb8\x3e" - "\x7e\x87\xb6\x72\xcc\x2e\xa6\x15\x7f\x17\x95\xb8\x5f\x61\xaf\x9b" - "\xd9\xfe\xf6\xac\x63\x9f\x92\x03\xe9\x4c\x13\x45\xb3\x03\x72\xdf" - "\xa7\x7a\xb0\x1f\x7e\xfd\x79\x2c\x3d\xd4\x73\x24\x19\xb2\xa1\x98" - "\x7d\x0b\x0e\xa4\xeb\xf4\xeb\x51\xf5\xff\xfa\x2f\xba\x0d\x85\x77" - "\xbf\xde\x11\x55\xf6\xda\xc1\xbc\xea\x7b\x73\x1a\xef\xd3\xf1\x5a" - "\xa8\xe2\xd7\x5f\xb7\x44\x95\x6b\xc9\xfb\x2c\x93\x38\x1e\x3f\x7f" - "\x1f\x8c\x69\xde\xe7\xfa\x75\xdb\x10\xbd\x15\x9c\x04\x75\x5c\x67" - "\xd4\xe1\xa3\x5f\x57\x19\x78\xe2\x7e\x99\xea\x93\x03\xb6\xa1\x3e" - "\xf9\x75\x86\x51\x8e\xfd\xba\xd1\x47\xc7\xf8\xec\x57\x42\x39\xc8" - "\x6b\xee\x13\x20\x83\x43\xf7\x7a\x24\x3f\xd2\x81\x6d\xec\x3f\x09" - "\xba\xba\x15\x0f\x1d\x28\x54\x73\xe1\x01\x79\xa6\x9d\xd7\xb3\x0f" - "\x05\x99\x47\x0e\x54\x02\x6e\x83\x8e\x73\x9d\x8e\x43\x1d\x70\xa8" - "\x1a\xf6\xdc\xcc\xe0\xd9\xb5\x03\x07\xa3\xce\xeb\x4d\x51\xb4\xfd" - "\x0d\x9f\x95\x3d\xb0\x53\xd9\x0e\x2d\x3b\xd1\x3f\xce\xf3\x34\x9e" - "\x63\xea\x57\x14\x89\x53\x1d\x45\xb0\x67\x6c\xb6\x32\xc8\x86\xf2" - "\x8a\xf3\x34\x9a\xf7\xe0\x59\xb6\xb0\xaf\x9f\x48\x41\x7a\x8d\xad" - "\x7c\xe8\xac\xd2\x6f\xed\x7c\xf6\x6f\x07\xc7\x4c\x3a\x4d\xe3\xd5" - "\x9e\xfa\x6f\x1e\x60\x1b\x5a\x38\x61\x37\xbb\x6d\x95\x7c\x76\xad" - "\x03\x5a\xb9\x70\x16\xbc\x1e\xa9\xb1\x55\x02\xae\xdb\xf9\x1c\xa5" - "\xf2\x5c\xc6\xb6\xb8\xe2\x8f\xdf\xb0\xdf\xb7\x9b\xe3\x36\xc1\xf6" - "\x36\xa1\xfe\x23\x11\xdb\x38\x0b\xc3\xe5\xba\xc1\x53\xda\x09\xfa" - "\xcd\x0f\x51\xff\x11\xfe\xb6\x17\xdb\xda\xde\x60\x90\xcf\x99\x1f" - "\xc1\xbb\xb1\x78\xf7\x01\xae\x11\x8e\xe1\xc4\x31\x68\x01\xdf\xce" - "\xf0\x51\xd7\x11\x85\xbb\x8c\xb3\x70\xe4\x04\xfd\xf6\x6a\xce\x63" - "\xc4\x86\x8a\x38\x73\xcd\xfc\x9e\xdb\x10\x46\x39\x6f\x99\x8f\x54" - "\x99\xa3\xb2\x8c\x8f\xdb\x87\x72\xba\xdf\x86\x43\xed\xb9\xfd\xd6" - "\x66\xec\x1d\xf9\xe8\x37\xf9\x8c\x73\xe2\xf8\xa1\xbf\x9d\x19\x1b" - "\xcb\xe3\x5f\xf8\xac\x28\xa7\xe7\x18\xf1\x37\x70\x8f\xf1\x7f\x40" - "\x9d\x9f\x8f\x8a\xa5\xb3\x33\x2a\x2e\x97\xd3\x2f\xfe\x8b\x71\x01" - "\x9f\x9a\x41\xef\xbd\xa2\x66\x9c\x45\x9d\xb3\xf8\xad\x1c\x43\x68" - "\x13\xc7\x47\xb1\xaa\x73\xc1\xbf\xfd\x57\xc5\x8f\x26\xdb\xc2\x70" - "\xc8\xea\x43\x9d\xa2\xc6\x64\x1b\x7a\xfe\xed\x7e\xf0\xa7\x0d\xf9" - "\x3e\x55\x71\xab\x7e\xbb\x37\x36\xbf\x7c\x5f\x19\xf7\x9c\x19\xf7" - "\xec\x08\xa0\x6f\x86\xdb\x23\xdb\x31\x5e\xae\x0b\xcc\x18\xbb\x99" - "\x8a\x9c\x9f\x92\x19\x7d\xf5\x09\xe3\xd6\xd1\xdd\xc3\x6d\xb2\x0a" - "\x57\x06\x79\xbb\x43\x4a\x57\xc1\x1c\x71\x62\x12\xf2\x7c\x4a\xe3" - "\xd8\xe7\x94\x63\x81\x23\xff\x29\x15\xb7\xb4\xa5\x66\xe9\xf3\xa3" - "\x29\xf2\x74\xee\x57\x84\xf6\xd0\x5c\xcc\x07\x49\x6f\xf7\xfb\x46" - "\xf0\xba\x74\xc5\x6b\x34\x81\xe3\x5f\x80\x37\xbb\xf8\x3b\x31\xfc" - "\xdd\xde\x9f\xf4\x77\x8f\xf0\x86\xfe\x4a\x45\xcf\x90\x76\x8a\x5a" - "\xb6\x5a\xca\xc9\x52\x7d\x92\x6c\x0b\x43\x22\x74\x28\x34\x93\x8c" - "\x73\xbd\x0d\xa9\xea\x7c\x24\xec\x72\x7f\x89\x5d\x04\xfb\x5c\xff" - "\x02\xfd\xf7\xf5\x5c\xdd\x87\x27\x50\xa5\xe2\x7d\x5b\x50\x7f\xb6" - "\xa6\x9f\x61\x56\xb4\x6d\xb9\x56\x9d\xd3\x48\xfd\x5a\x9f\xab\x25" - "\x6d\x48\x9f\x6b\x69\x56\x34\x1c\x97\xae\xc6\x57\x4b\xf3\x21\x58" - "\xfe\x5b\xd5\x5e\x63\x1a\xf2\x66\x0e\xee\x35\x4a\xfb\xb4\xa5\x19" - "\x7d\x98\x2e\x75\x3d\xdb\xb8\xf4\xbc\x70\x92\x3e\x06\x90\x0e\x59" - "\xc5\x65\x51\xce\x1a\x90\xb6\x64\x4b\xf9\x10\xaf\xb5\xc8\x73\x12" - "\x68\x53\x32\xfa\xb5\x85\xdb\xc5\x34\x41\x3e\x0b\x9e\x0f\x1e\xda" - "\x33\x4c\xfc\x42\x1b\x39\x42\x2e\xb9\x6f\xc6\x63\xe2\x34\xfa\xe0" - "\x4a\x8e\x57\xe2\x45\x3d\xed\x8d\xfd\xd4\x6e\xef\xa5\x8e\x7c\x3e" - "\x53\x02\x7d\xf9\x99\xff\xa2\x2e\x47\x62\xf9\x05\x19\xd8\x0c\x9c" - "\xf7\x33\x2c\xc8\x89\x6e\xf6\x19\xf1\x96\x43\x9e\xf9\xf9\xfb\x34" - "\x24\x61\xb4\x47\xba\xa9\xbd\x8c\xf5\xf6\xaa\xcc\x8e\xc6\xbf\x52" - "\x87\xfd\xff\x96\xf5\xb0\x8e\xe1\x29\xee\xbd\x14\x6c\x0f\x60\x77" - "\xea\xb0\x7b\x00\x3b\x6d\x78\xd8\x6b\x97\x5d\x26\xec\xcb\xc0\x7b" - "\x6d\xce\xe5\xc0\x86\xac\x98\xe4\xb5\xab\x73\x29\x15\x57\xd3\x98" - "\xf0\x05\x8e\x4f\x77\xbd\x50\x3e\x78\xbf\x7b\x5e\x9e\x5d\x71\x49" - "\x1f\x47\x87\x3c\xc3\x72\x86\xa4\x1f\x95\x3a\xb7\xf2\x09\xf1\xbe" - "\x66\x9f\xeb\x77\xcb\x06\x75\xef\xa1\x75\x65\xc8\x98\xdf\x6d\x55" - "\xbe\x56\x36\x87\xe2\xab\xdf\xdd\xc5\xb0\x12\xe3\x91\x92\xa1\x7c" - "\xf6\x7e\x67\xe8\x6b\x39\xbd\x29\x29\x19\x3a\x2c\x47\xfc\x7e\xa3" - "\xf1\x61\xb8\x15\x65\xa5\xc6\x37\xe6\x4a\xf5\xe3\x6b\x0f\xaf\x78" - "\x6a\xc5\xaa\x75\x2b\xf2\x1d\x8b\x9f\x2f\x5e\x3d\x75\xcd\xca\x95" - "\x8e\xec\x15\x25\x25\xcb\x9f\x5e\x31\x9a\x16\x17\x2f\x5f\x5d\xb2" - "\xaa\x74\xd5\x9a\xd5\x0e\x47\xd6\xed\x79\x05\x6b\x4a\xa7\xde\x93" - "\x95\x11\x77\xde\x89\xcf\x3a\x1d\x63\x9d\xce\xb9\x09\xe3\x33\x4c" - "\x29\x1c\x7b\xc2\xba\x41\x78\x5e\x80\x3d\x01\xfe\x3b\xc5\xeb\xea" - "\x18\xb7\xc7\x59\xd7\xe4\x58\x57\x98\x37\xdb\x76\xbd\x2a\x3a\x4f" - "\x52\xdb\x79\xe8\x29\xfc\x7d\x52\x8e\xdb\x74\x0c\x36\x9e\x5f\x7d" - "\x07\xa9\xed\x23\x8e\xc9\xf4\x03\xa4\xf9\x53\xc6\xa5\x57\xff\x27" - "\x59\x30\xf7\x40\xcf\xfd\xb7\x4e\xa1\x8d\x12\x55\xe3\x44\xab\xf8" - "\x2f\x3b\xe9\x31\x65\x35\xaf\x2f\xc8\xfb\x6f\x49\x0b\x43\x4e\xc1" - "\xf2\x54\x8d\xad\x7f\xfb\x48\xd1\xc5\xec\x51\xbe\x8c\x6d\xbf\x64" - "\x9d\x78\x8b\xfc\x4e\xd5\xbf\x61\xfc\xef\xcf\x1d\x92\xd3\xad\x21" - "\x5d\x17\x39\x0a\xba\xaf\x3f\x81\x67\x75\xc6\xfe\x60\x72\xec\x9e" - "\xeb\x7b\x3d\x44\x7f\x74\xa8\x1f\x97\xf9\x63\xa6\xfa\xf1\x7d\xf4" - "\xaf\xad\x4e\xfd\xe2\xd3\xff\xd1\x9f\x51\xff\x7f\xb7\xfc\x87\x07" - "\x2e\xfd\xfb\x32\xf5\xcb\x76\xff\x1f\x6c\xff\x3f\x52\xfe\xc3\x83" - "\x97\xfa\x31\xbf\x81\xb7\x8e\xfd\xe0\x3f\x29\x09\xfc\x59\x07\xfb" - "\xda\xe2\xfc\x98\xec\xe5\x21\xd1\xe5\x7c\x9c\x26\x54\x7c\x4a\xfc" - "\x9d\xa0\xee\xd2\x32\xd1\x55\x71\x81\xf5\x9e\x0f\x77\x80\x7f\x5b" - "\x76\x9e\xa0\xe4\x1d\x27\xc8\xd6\x51\xca\xdf\x0b\xe4\xf8\x34\x90" - "\x33\xc0\xd4\x8b\xe7\xb6\x75\x41\xfa\x93\xff\x33\xf6\x53\xf0\xfc" - "\x6f\xf6\xbe\x3f\x2e\xaa\x2a\xef\xff\xcc\x30\x20\x19\xca\xe0\x02" - "\xa2\x59\x8d\xad\xba\x63\xf9\x83\x76\x6d\xbf\xd4\xda\x2e\x25\xf6" - "\x58\xab\x49\xad\xb6\x54\xa6\x58\xda\xa2\x8b\x3a\x22\x22\x22\x02" - "\xa2\xf1\x50\x29\xa2\xa1\x0f\x2a\x22\x3e\x6b\xfb\x50\xf9\x83\x9e" - "\xc7\x9e\x07\x5d\xb3\x31\xb1\xd0\x80\xa1\xc2\x1a\x5d\xd0\x11\xc1" - "\x25\x42\x9d\x64\x94\x01\x66\xee\xfd\x7e\x3e\xe7\xdc\x3b\x77\xee" - "\x30\x03\x0c\x69\xd6\xf3\xec\x1f\xf3\xba\x73\xee\x3d\xf7\xdc\x73" - "\xcf\xe7\x73\xde\xe7\x7d\x3e\xf7\x9c\xcf\xa7\x0a\xd8\x64\x65\x2d" - "\xc6\x5a\xe4\xcb\x02\x62\x49\x70\x41\x28\x7f\x84\xcf\x7c\x35\x91" - "\x57\xbe\x3a\x0f\xce\xd5\x1c\xe0\x22\x7d\x0f\xa4\x94\xfb\x62\x4c" - "\xa5\x7a\x72\x74\x93\xa0\x9b\x76\xb6\x8f\xa1\x8c\xf2\x73\xe8\x27" - "\x35\xcc\x0f\xe2\x89\x95\x6c\x3c\x3f\xf1\xa4\x60\xbf\x80\xff\x65" - "\xd4\xd6\x06\xef\x51\x8a\x71\xd5\xb0\xcc\xfd\x5c\x29\x8d\xab\x76" - "\x20\x25\xd2\x37\x75\x2e\x51\x56\x99\x9a\xc9\x71\xc0\x41\x8c\xd1" - "\x05\xfd\x6e\x2f\xf4\xb3\x92\x9d\xa1\x7c\x2e\xd4\x6f\x7d\x61\x28" - "\x9f\x0d\x75\x2a\x6e\xcb\xfc\x08\x78\x50\xa9\x45\xb0\xaf\xea\xa1" - "\x5f\xec\xdd\x00\x79\xa6\x2f\x27\xf7\x6e\x80\x7c\x39\x90\x0f\xb9" - "\x18\xab\xdf\xc7\x27\xa0\x0d\x0e\xc2\x33\xab\x35\xb3\x31\xad\xa7" - "\x76\x28\x7c\x36\xbc\x87\xa6\x9e\xe8\xa3\x61\x6c\x53\xe1\x33\xc4" - "\xe7\x42\xf9\x80\x7f\x87\xf6\x52\x9b\x38\x9c\x67\xe5\x7c\xc4\x62" - "\xba\xe7\xaa\x71\x8d\xb0\x18\xf7\xae\x68\x43\x0a\x8c\xe9\x1d\xd4" - "\x57\x5b\x1e\xce\xdf\x91\x63\x50\x5e\x01\xf3\x78\x36\xdf\x04\x6e" - "\x11\x07\x38\x00\x7c\x82\xae\xbf\x04\x2e\x01\x75\xc9\xc3\xd8\x73" - "\x78\x1d\xe6\x01\x07\x61\x5c\x2e\x41\x1e\x30\xfb\xfa\x53\x04\xf7" - "\x6e\x01\x1f\x50\x2d\x9b\xc5\x5b\x99\x8f\xfc\x8f\x5a\x44\x2e\x80" - "\x18\x84\xe3\xff\x06\x98\xd3\x77\x82\x0c\x41\x07\xca\x81\x5b\x04" - "\xc1\x28\xa9\x15\xda\xbe\x9c\x8e\xf9\x49\xd4\xb7\xa8\x0f\xc3\x68" - "\xfd\x43\xf0\x7e\x01\xf0\x8c\x72\x13\xa9\xa4\x38\xc1\x30\x46\x1f" - "\x25\x8e\xe3\x38\x87\x32\x41\x19\x3c\x60\x99\x70\x0d\xde\xff\x7f" - "\xc2\xc4\x67\x9a\xc8\x47\x16\xa1\xcd\x2a\xa0\xcd\xb0\x4c\xba\x9f" - "\x16\x38\x97\x96\xb5\x8d\x1e\xf9\x41\xb0\x70\x6f\x81\x58\x2e\xce" - "\xf3\x38\xe0\x15\xd8\x5e\xd8\x4e\xf0\x0c\x22\xe0\x58\x0d\xe3\x2f" - "\x1f\xef\x13\xbe\xa3\xe5\x82\xac\xd7\x49\xed\xaf\x37\x39\xb7\x3f" - "\xdc\xbf\x4e\x90\xe5\xf3\x4e\xb2\x03\xfe\xfd\x71\x38\xda\xdd\xa0" - "\x8e\x47\x98\xcd\xe0\xd8\x10\xf4\xef\x83\x3e\x44\xa1\x8d\x8f\xac" - "\x47\x7f\x95\x80\xcd\x6b\xcf\x11\x21\xe6\xe1\xc7\x43\x18\x3f\x3d" - "\x56\xca\xe2\x82\x1d\xa3\xb6\xba\x06\xa8\x17\x8b\x09\x76\x4c\x88" - "\x09\x76\x6c\x8d\x73\x9c\x43\x29\xc6\xe1\xb1\x64\x69\x0d\xb4\x7e" - "\x0f\x9b\x8f\xe9\xf7\xa0\x4d\x85\xe6\xef\x8c\xc3\xba\xd5\x62\xbf" - "\x14\xdf\x15\xe3\x1d\xc2\x79\xb4\xf5\xd5\xa2\xdc\xc4\xf3\xe8\xeb" - "\x12\xe4\x14\x00\x75\x0a\x12\xea\xd4\x02\x69\x7f\x78\x36\xb5\x49" - "\x61\xec\xc3\x8d\x78\x4f\x9a\x74\x0f\xf6\x1b\xd0\xe1\x40\xb8\xe7" - "\x0e\x38\xf2\x62\x5e\x16\x13\xf1\x58\xee\x5b\x1d\x68\x53\x39\x56" - "\x2c\xc6\x44\xc4\x78\x88\x88\x19\x1b\x66\xcb\xda\x1e\xdb\x66\x2f" - "\xc8\x8a\xea\xdd\x71\x5b\x29\xb4\xf7\xc7\xc0\xff\xf7\x45\xb2\xf7" - "\x3a\x96\x2b\xd4\x4f\xcf\x7c\xa7\x1f\x2e\x2f\xdc\x2c\xee\xe5\xfe" - "\x38\xd9\xf1\x9d\xcf\xc1\x2d\x8f\xe5\xa2\x4e\x42\x59\x15\x28\x7f" - "\xe4\x89\x90\xaf\xc8\xa1\x5b\x74\xbf\xe2\xc7\xe8\x47\x49\x2b\xd4" - "\x1f\xf5\x45\x21\xb4\x5d\xb9\x73\xbf\x73\xee\xe7\x50\x46\x03\xf4" - "\x71\x87\x0e\x88\xfd\x5a\xc0\x9c\x21\x02\xa7\x08\x43\x5f\x93\x50" - "\xae\x1e\x39\x38\x1b\x57\x8f\xb7\x1c\xaf\xb5\xa1\x4d\xb6\x06\xd2" - "\xd0\xbf\x8f\x97\xb7\x0e\x1a\x52\xbc\x8e\xe2\xc6\x71\x98\xff\x8c" - "\xa6\xf6\x63\x6c\x17\xb1\xbf\x6e\x84\xf6\xc1\x78\x82\xb4\xcf\x26" - "\x37\x90\x2a\x6b\x0b\x11\xd6\x17\x43\x9f\x6d\xc4\x6f\x24\xcd\xa0" - "\x43\xfe\xd8\x7f\x41\xbe\x7b\xd1\x2f\x2a\xb4\x63\xf5\xba\xad\xb4" - "\xdf\x06\x60\xbf\xed\xc4\x3d\xe8\xf0\x9c\xb2\xd8\x48\x72\x3c\x59" - "\x4f\xfb\x31\xfa\x16\xd8\x01\x6d\x87\xf1\x07\xe1\xd9\x07\xc5\x75" - "\x91\xa8\x23\xe8\x4b\x80\xe9\xc9\x47\x36\xec\xcb\x42\xdb\xa9\x20" - "\x5f\xad\xd8\xf7\x24\xf9\xb3\x3c\x2e\xfd\x2d\x90\xf5\xb7\xb2\x00" - "\xb1\xad\x6d\xb4\x1f\x1f\x2b\xb6\x41\x3f\x76\x6e\x53\x6c\x4f\x6c" - "\x57\xc8\x0b\xef\x7f\x28\x5a\x6c\x53\xa7\xf6\x7c\x47\x90\x79\x35" - "\xb3\x59\x94\xc5\x0b\xf6\x0c\x47\x1b\x0a\xfa\x57\x83\x7d\x6a\x2d" - "\xbe\x3b\x8c\x0d\xf8\x7c\xd4\x91\x1d\x02\x66\x95\x99\x51\x47\xca" - "\xa0\xff\x4f\x35\x4a\xd8\x71\x6c\x2f\x9d\xb3\x80\x9c\x98\x7c\xca" - "\x4e\xd3\xfd\xfa\x6e\xb0\x03\xf4\x24\x4f\xc2\xa7\xb2\x06\xb1\x1d" - "\x44\x9d\x14\xfb\x3d\x8c\x29\x0f\xca\xf1\xe7\x44\x08\x94\x31\x08" - "\xf1\x4d\xe2\x50\x27\x46\xc8\xf1\xed\x44\x00\xe2\x1b\xea\xb5\x2e" - "\x09\x6d\x36\x6c\xbc\x32\x91\xa3\x07\xe5\x98\x74\xf4\x1d\xf6\x0d" - "\x90\x71\x2e\xd4\x2d\xdd\x6c\x96\x1f\xc7\x30\xc8\x4f\xd7\x25\x0b" - "\x63\x1e\xfa\xbf\xc2\x73\x45\x42\x7b\xd5\x42\xfe\x32\xdc\xab\x85" - "\x7b\xbd\xef\xac\x65\x73\x3d\xc0\xe9\x23\xe8\x67\x16\xf2\xc5\x56" - "\x01\xcf\xef\xcc\x62\xd8\x2d\x62\x05\xff\x4a\xcc\x9d\x2b\x9a\xc8" - "\x1d\xba\xdf\xf2\x17\x2f\x91\x4f\x1e\x83\x3e\x63\x45\xbf\x67\x50" - "\xb6\xe6\x12\x39\x79\x07\x3c\x37\x58\x38\x86\x5d\x22\xe5\xdf\xc1" - "\x71\x08\x1c\xcf\xc0\xf1\x2e\x38\x1e\x83\xfc\x9c\x90\x3f\x1c\xd2" - "\xef\xc0\xf9\x5f\x09\x47\xa8\xe3\x27\x11\x70\x8c\x16\xb8\x23\x9e" - "\x5f\x8d\x69\x38\x2e\x12\x64\x5e\xc1\x64\xfe\x09\xae\xb9\x4a\x86" - "\xfa\x1b\x0d\xb5\xb4\x2c\x1d\xe4\x19\x8b\x65\xe3\x1e\xca\x4b\xe4" - "\xd3\x0b\x4e\x1c\x14\xca\xf9\x74\x00\x1c\x27\xc0\x7d\x9f\xc3\x31" - "\x11\x8e\x6f\x0b\x6d\x50\x8d\xd8\x30\x2f\x19\xdb\xb6\x4c\xaf\x61" - "\x7c\x37\x5a\xec\xf3\x38\x0e\x4b\xd8\xa1\x27\xf3\x66\x31\x79\x43" - "\x5e\xaa\x07\x90\xf7\x31\xcc\x0b\xc7\x49\xc2\x31\x52\x38\x4e\x16" - "\x8e\xff\x22\x1c\xa3\x84\xe3\x14\x13\xf9\xa4\x58\xe0\x18\xd0\x2e" - "\x9f\x14\xd3\xf5\x0d\xb9\x6a\x61\x2d\xd9\xa7\xe5\x38\x47\x06\x1c" - "\xc7\x71\xd0\xa7\x2d\xf3\xd3\x89\xa2\xbd\x0d\xed\xb4\x9d\x99\x87" - "\x2f\xee\xa0\x7e\x1b\x3e\x9d\x21\x61\x5b\x88\x35\x40\x11\x49\x80" - "\x03\x85\x14\x28\x61\xfc\x67\xe5\xa0\x1e\xd3\x6f\x88\x82\x0f\x6b" - "\x1f\xf4\x15\x45\xe7\x43\x41\xaf\x17\x63\x5f\xa5\xb6\x48\xf4\x91" - "\x14\x14\x62\x03\x5d\xf3\x87\xb9\x41\x80\x88\xdf\x38\xef\x11\x7c" - "\x5d\x85\xc2\xb3\xf4\xd2\x5c\xfd\x53\x1d\xfb\x26\x13\x02\x7d\xff" - "\x53\xa3\xd3\xf9\x31\x58\x67\x68\x4f\x23\xbc\xcf\x84\x7a\x52\x8e" - "\xed\xf8\xcb\x06\xf6\xce\xe1\xe2\x3b\x0b\xf2\xd0\x89\xed\xdb\x40" - "\x3e\x29\x01\x2c\x4c\x40\x1d\xae\x77\xe0\xec\x27\x74\x0f\x92\xa0" - "\x23\x20\xcb\x4f\x16\xa0\x4c\xa5\xfe\x23\xc3\xa0\xe0\xb6\xcc\xf2" - "\x58\x39\xa6\xe8\x63\x11\x53\x50\x37\x00\xbf\x51\xd6\x91\x2e\xfd" - "\x2f\x00\xfb\x1f\xeb\x77\xe5\x05\xf2\x7b\x4f\x04\xd8\x58\xbf\x33" - "\x82\x9e\x81\x7e\x7e\x42\xd7\x67\x98\x48\x79\xaa\xd0\xa7\x8d\xd0" - "\xa7\x1f\x82\xf3\xfe\xac\xae\xec\xbc\xf0\x2c\xd0\xb3\x4f\xf0\xbd" - "\xef\x12\xcf\x0b\xef\x0b\xe5\x9c\xb0\xa2\xbc\xc5\xf3\x42\xf9\xa0" - "\x8f\x27\xcc\xd8\x4f\xc4\xf3\xc2\x3b\x01\x8f\x3a\x39\x41\xc4\x93" - "\xf5\x54\xdf\x8e\x1f\x11\xef\x43\xb9\xa1\x5f\x1b\x66\x33\x3e\xa9" - "\x81\xbe\x5a\x84\xe3\xc3\xda\xd9\x24\x60\x45\x3e\x19\xc0\xfa\xe5" - "\x49\x8d\x1c\x23\x3f\x3b\xc4\x67\x06\xda\x78\x75\x88\xa5\xd2\x36" - "\x41\xe4\xab\x05\xf0\x9c\x02\x31\xfe\xa6\xe4\x0f\xfb\xe4\xe7\x18" - "\xb7\xdc\xa9\x2e\x7a\xb1\x2e\xd2\xf8\xcc\x64\x80\x75\xc3\xb2\xd6" - "\x02\x5f\xb7\x00\x2e\x30\xdc\x3e\x69\x16\xe3\x12\xe7\x08\xe3\x16" - "\x8d\x8d\x9b\xc4\x62\xe3\xe2\xd8\x88\xdf\xf2\x39\xb4\x63\x25\xdb" - "\x49\x95\x0e\xe6\xf2\xc9\x8d\x64\xce\xca\xfe\xe8\x3b\x22\x06\xea" - "\xba\x13\xea\xb6\x47\x68\x23\xe8\x37\x9f\xad\x11\xda\x12\xf1\x6a" - "\x0f\x62\xf8\xda\x34\x16\xcb\x02\x6d\x37\xd8\x1f\xde\xc2\x71\x2b" - "\x8c\xb7\x96\x15\x60\xdf\x38\xa5\x13\x39\x28\xd4\xaf\x88\x71\xc0" - "\xe3\x75\xd4\x97\x49\x6e\x88\x85\xd9\xfe\x3e\x0b\x62\xef\x7a\xca" - "\xca\xbe\x93\x86\x08\x7e\xb7\x4e\x35\xf8\x84\x05\x27\xb0\xf5\x16" - "\x87\xb9\x42\xda\xd7\x4e\xe9\x5d\xfc\x45\x29\xe1\x5c\x8d\xe8\xef" - "\x52\xe2\x8b\xac\x4d\xe0\x9a\x59\xea\x17\xa7\xf6\x62\x59\x50\xe6" - "\xea\xb6\xcc\xcf\xfc\xa5\xf3\xc7\x6b\x19\x27\x08\xb1\x0e\x5c\x13" - "\x89\xeb\x48\x42\xd0\x47\x2c\xab\xc3\x67\x71\xb4\x4e\xd4\xee\x01" - "\xfd\x53\xe8\xc3\xd8\xd6\x38\x6e\xd3\x7e\x0c\x7d\x18\xfb\x72\xe7" - "\xa6\x10\x5b\xe7\x26\xa1\xef\xb2\xf1\xd9\x4a\xfb\x2e\xed\xb7\x9f" - "\x25\x4b\xcf\xfb\x2c\x9c\xda\xbe\x50\xa6\xab\xc2\x02\xe0\x5a\x9e" - "\x89\x1c\xf6\x17\xea\x38\x51\xa8\x0b\xfa\x47\x29\x60\x6b\x35\x4e" - "\x8d\x65\x5c\xe8\xd4\x18\xd4\x2f\x03\xe8\x0c\x1c\xf3\x59\xdc\xc0" - "\xcf\xaa\x45\x9d\x81\xfe\x34\xef\x12\xa9\x98\x9b\x17\xca\xe7\x83" - "\x6c\xf2\xa1\x0f\xc4\x43\x7a\x1a\x1c\xe7\xb1\xa3\x42\x8d\x47\x41" - "\xb7\xf3\xdb\x32\x2b\x02\xc4\xf8\xae\xf8\x3e\x96\xa0\xa5\xb9\xa8" - "\x1f\x39\x50\x77\xd4\x11\xfa\x3d\x51\xc7\xe2\x26\xa3\x7e\xa0\x6e" - "\x04\xae\x79\x8a\xea\x07\xdd\xab\x0c\xe7\x69\x9d\x40\x3f\xa0\xac" - "\x18\xd1\xd7\x24\xbc\x9f\x8d\xd9\xf5\x2b\xe2\x9d\xd7\xb6\x41\x99" - "\x9a\x32\x0d\xcc\x6b\x72\x89\x39\x71\x38\x09\x29\xd3\x50\x9f\x72" - "\xe7\x0d\xb6\xc9\x04\xef\xc1\xef\x32\x0c\xe7\x42\xfe\x08\xf7\x16" - "\x4b\xed\xa5\xa7\xdf\x2a\x8e\xcf\xa2\xb6\xc4\x9f\xc1\xb5\x32\xe7" - "\x79\x82\x89\xfc\xad\x1a\xe7\x0a\xb8\x06\xe7\xe7\xc1\x44\x03\x7a" - "\x08\x38\x54\xd1\x24\xf2\xd2\xf1\xc1\xf8\x7d\xf7\x6f\xb8\x17\x12" - "\xe7\xc0\xd0\x5e\x7f\x8b\x83\xb9\xa0\xdb\xf5\x89\xa0\x1f\x13\xd0" - "\x56\x23\xc4\x81\xa8\x45\x3b\x14\xfa\xcd\xbe\x44\xaa\x57\x56\xa2" - "\x1f\x81\x25\x5d\x7d\x8b\xa6\x25\xf3\xd7\xd1\xbf\xa8\x26\x81\xfc" - "\xac\x9e\x54\xcf\x42\xbb\x4f\xfa\x77\x68\x63\xa9\xd4\xc9\x6d\x2c" - "\x95\x7a\xe1\x57\x43\x48\x55\x84\xd3\xaf\x5c\x38\x46\xf5\xf0\x33" - "\x09\x79\x61\x06\x5e\x65\x15\xda\xea\xdf\xda\x32\x2b\x1d\xfe\x0f" - "\x51\xa7\xb0\xaf\xe2\x77\x7d\xb4\x19\x29\x6c\x04\xfd\x16\x80\xbc" - "\xa0\xde\x6b\xef\x7f\x56\x9f\x82\xfa\x54\xe5\x4b\xb9\xbf\xd2\xdb" - "\x7d\x55\x55\xf4\x3b\x18\xf3\xb1\x57\x59\x0e\xcf\xfe\x0f\x8c\x0d" - "\xaf\x4b\x20\x77\xa3\xfd\x3a\xd0\xce\xeb\x71\x8e\x8a\xba\xb1\x8b" - "\xc6\x5f\xa8\x3a\x99\xb8\x9a\x28\xe1\xfa\xbd\xf0\xbf\x54\xe4\x39" - "\x70\x8f\xda\xc7\x4a\x82\x91\xdf\x4c\x5a\x4d\xee\x6d\xcb\xac\xca" - "\x13\x65\x85\x1c\x00\xed\x68\x82\x2d\x00\xea\x5a\x49\xbf\x9d\xa1" - "\x6f\x64\x13\x6d\x37\x8a\xa3\x58\x06\xe8\x6e\x55\x86\x8f\x85\xa8" - "\xd9\xd8\x51\x05\xe3\xdf\xdf\x04\xce\x57\x55\x00\x7d\xa0\xc6\xa9" - "\x9e\x67\xa4\xff\xa1\x43\xf0\xfe\x40\x0b\xf2\x2b\x4f\xed\x63\x18" - "\x29\xb6\x0f\xae\x2b\x0b\x04\x9e\x4f\xe5\x6d\xe3\x5b\xa0\x6e\x15" - "\xba\x14\xe2\xdf\x4c\xaa\x47\xee\xda\x4a\xf7\xbb\x94\x33\xfb\x7a" - "\xf5\x10\x71\x1e\xcd\xea\x6d\x68\x0c\x5c\xe3\x43\x63\x6a\x63\x8c" - "\x4f\x1a\x47\xfb\x6a\x18\xe5\xde\x06\xdb\x44\xa2\x4f\x7b\x04\xf3" - "\x9c\x16\xb1\xb4\x35\x3d\x8c\x1c\x0f\x9b\x08\xfd\xd9\x50\x04\x7d" - "\x26\xdb\xfb\xb5\x4f\x06\xc1\x6e\xcf\xf6\x48\x61\x1a\xf7\x33\x51" - "\xff\xf2\xf4\x3b\xa9\x61\x29\x8e\x0d\xeb\x84\xf8\xcc\x38\xe6\xb6" - "\x65\x56\x3b\xf8\x3f\x8b\x4b\x6d\xa0\x7c\x02\xeb\x0c\xff\xe3\x71" - "\x1f\x39\x9d\x07\xb0\xfc\x01\xcc\x86\x5f\xed\xb0\xff\x63\x3e\xbc" - "\x8f\xad\x4f\x32\x44\xcd\xb1\x2b\xa0\x8d\x0d\x51\xf8\xae\x4c\x37" - "\x43\x41\xb6\xd5\x3a\xa9\x1f\x57\xd1\x75\x42\xc7\x5b\x9c\xfb\x69" - "\x75\xae\x34\x7f\xac\x9c\x30\x36\x8f\x68\xdc\xf5\x4b\xdd\x40\xa2" - "\xfe\xd6\x9f\xfc\x61\xe3\x46\xbe\x28\x57\xc9\x3d\xbe\x36\x87\x04" - "\x28\xd6\x43\x33\x62\xbf\x4b\x8a\x0d\xb9\x44\x3e\x0f\x0a\x0c\x18" - "\x1c\x3d\x29\xb1\x1f\x9f\x16\x46\x94\x1b\xae\xf5\xf3\x1f\x6e\x1d" - "\x5c\xc4\xfb\xdc\xff\xec\xb4\x44\x2b\xd1\x2c\xcc\x25\xff\x88\x27" - "\x3e\x93\x80\xb9\xff\x3c\x80\x40\x9d\xbe\x1c\x86\xfb\xce\x8e\x07" - "\x20\x9f\xf8\x72\x18\x96\x99\x5a\x40\xfc\x53\x1b\xf8\xa6\xf5\xaf" - "\xfa\xfa\x03\xb6\xab\x77\x80\xce\xdd\x19\x30\xb8\xa8\x13\xca\x38" - "\x16\x4b\xef\x2b\xf1\xbe\x6e\xba\x50\xa8\xdb\x3e\xef\xea\x56\x73" - "\x44\xaa\x5b\xcd\x91\x9b\x5c\x37\xb5\x54\xb7\x38\xa8\xdb\x17\x4f" - "\x7a\x57\xb7\xaf\x66\x49\x75\xfb\x6a\x56\x2f\xeb\xb6\xd7\xfb\xba" - "\x25\x0f\x86\xba\x35\x7a\x57\xb7\xaf\x6d\x52\xdd\xbe\xb6\x7d\x9f" - "\xba\xe1\xdc\x3c\x6d\x18\xdf\x48\x7d\x1d\x27\x90\x00\x5c\xdb\x75" - "\x89\xd4\x4c\x4e\x2b\xa0\xe9\x41\xf0\x5f\x21\xf4\x77\x73\xba\x85" - "\xbf\xc8\x78\xcc\x97\x8b\xc6\xe9\x70\x4d\xf3\x97\xf3\x40\x97\x03" - "\x98\x4e\xd7\x50\xae\x9d\x6e\xe6\x85\xb5\x86\x5f\x6e\x28\xa4\xeb" - "\x15\x86\x46\x0b\xe9\xea\xd6\x41\xa1\xe1\xb8\x56\x80\x83\xfe\xcd" - "\x0f\x0a\x9d\x88\x71\xdd\x0e\x24\x98\x95\x7c\x26\xfa\x21\x42\x5f" - "\x49\x2a\xc2\x6f\x0e\x9d\x7a\x20\xc1\xaa\x44\xbf\x01\x6b\xe9\x3e" - "\xbc\x2f\xcb\xc5\x3d\x26\xe2\x33\xcc\x41\x43\xa3\xe1\xbc\xc9\x24" - "\xc4\x5a\xe4\x95\xc8\x4d\x42\x27\x60\xf9\x70\xde\x2a\xc6\x43\x04" - "\x7d\x17\x63\xb2\x58\x02\xad\xdd\xe1\x60\xcd\x58\x11\x07\x27\x25" - "\x92\x40\x8c\x87\xb6\x31\xad\x1f\x7e\x43\x04\x4e\xf5\xe5\x11\x6c" - "\xf7\xe9\x96\x7e\x7c\x60\x2a\xf1\xc1\xbd\x35\xb8\x86\xcb\x10\x66" - "\x26\x23\x52\x89\xef\xf4\x64\x28\xd3\x4a\x62\x03\x93\xa1\x3c\x68" - "\x6b\xc6\xf5\x6b\xe8\x3e\xb8\x3c\x28\x0f\xd7\xb6\xfa\x24\x92\x80" - "\x49\x61\xe9\xfc\xda\x6d\x44\x85\xfb\x70\x70\x3f\x0d\xdb\x4b\xe3" - "\xe7\xdf\x96\x59\x53\x2c\xbe\x5f\x2f\xe4\x33\x90\xc9\xe7\x74\xa3" - "\x24\x9f\xd3\xbb\xbb\xca\xe7\xf4\x00\x26\x9f\xd3\x2a\x49\x3e\x5f" - "\x4d\x91\xcb\xe7\xf4\x58\xb9\x7c\x4e\xeb\xfa\x26\x9f\xd3\x71\x92" - "\x7c\xd8\x33\x98\x7c\x4e\x67\xb8\x97\xcf\xe9\x7c\x49\x3e\xa7\xc7" - "\xf4\x4e\x3e\xa7\x2b\x3d\xcb\xe7\xf4\xac\x6e\xe4\xe3\xe7\x5e\x3e" - "\x5f\xdd\xdd\x7b\xf9\x7c\x35\xc5\x0b\xf9\x0c\x60\xf2\xf9\xfa\x35" - "\x49\x3e\x5f\x3f\xd6\x55\x3e\x5f\xed\x63\xf2\xf9\x6a\x8f\x24\x9f" - "\xaf\x9b\xe4\xf2\xf9\xaa\x52\x2e\x9f\xaf\xd5\x7d\x93\xcf\xd7\xfe" - "\x92\x7c\xd8\x33\x98\x7c\xbe\xd6\xb8\x97\xcf\xd7\x11\x92\x7c\xbe" - "\xaa\xe8\x9d\x7c\xbe\x5e\xe4\x59\x3e\x5f\xd9\xbc\x97\xcf\xd7\x1f" - "\xba\xc8\x47\xed\x59\x3e\x5f\x37\x79\x21\x9f\x40\x26\x9f\x33\x23" - "\x25\xf9\x18\x2f\x74\x95\x8f\x71\x1a\x93\x8f\x31\x4a\x92\xcf\x99" - "\x6c\xb9\x7c\x8c\x8b\xe4\xf2\x31\x96\xf4\x4d\x3e\xc6\x62\x49\x3e" - "\xec\x19\x4c\x3e\x46\xbd\x7b\xf9\x18\x8d\x92\x7c\x8c\xf1\xbd\x93" - "\xcf\x99\x01\x9e\xe5\x63\x2c\xe8\x46\x3e\xfd\xdc\xcb\xe7\xcc\x4b" - "\xbd\x97\xcf\x99\xec\xee\xe4\xe3\x1d\xf7\x3b\x43\x79\xd5\x4d\x28" - "\xa7\xc1\x53\x39\xd8\x76\xb8\x3e\x8d\xcb\x3c\xd3\x50\xc8\xf9\xd1" - "\x58\x52\xf0\xbf\x40\x93\x42\x7e\x57\x4f\xce\x3e\x58\xc8\xf9\xfa" - "\xf3\x99\x85\xb1\x5c\x66\x91\x86\x5f\xe3\xa7\xe2\xd6\xf4\x53\xe1" - "\xde\x48\x77\x65\xb1\xf5\x92\x67\x37\xf9\x0c\x21\xf7\xe0\x7e\x97" - "\xb5\xc0\x9f\xf1\x7f\x5b\xe6\xd9\x02\xe0\x82\xda\xee\xf6\x5d\xe0" - "\xda\xa5\xe3\xeb\x70\xde\x7b\xb6\xdc\xb1\x5f\x3d\x93\x4f\x46\x1f" - "\x45\xba\xfb\x70\x8d\xfd\x59\x73\x1e\xf5\x79\xa3\x36\x46\xde\xc7" - "\x9f\xc7\xb9\xc8\x25\xf2\xf7\xcb\xfc\x26\xb5\x11\xf5\x01\xb8\xfb" - "\xcf\x9a\xc9\xdf\x23\x1c\x6b\xba\xf8\x98\xed\x82\xcd\x6f\x1d\xcb" - "\x5b\xf7\x12\xe4\x5d\x87\xf1\xef\x96\xa5\x61\x5c\xb7\xba\xc9\xc0" - "\x7d\x47\xe1\x33\xd0\xff\xca\x2e\x38\xe2\xba\x17\xb6\x76\xef\xef" - "\xd4\x6f\x16\xfa\x78\x63\x6b\xfa\xeb\xc6\x8a\x7a\x07\xcf\xe9\x0f" - "\xe9\x10\x81\xdf\x63\xfe\x3b\x9b\x49\xad\xdd\xe9\x7a\x00\xa4\x2f" - "\x40\xd9\x41\xc2\xf5\x01\x90\x3e\x81\x3c\x9b\xee\xbf\xcf\xc9\x10" - "\xd6\x98\xd6\x16\xc3\x39\xb5\x90\x27\x08\xf2\x6c\x40\xee\x2e\x94" - "\x31\x08\xd2\x4b\x71\x4e\x2c\x5c\x0f\x86\xf4\x4c\xfc\x16\x20\x5c" - "\x0f\x81\xf4\xc3\x90\xfe\x05\xdb\xef\xd0\x29\xf4\xd1\x5a\x55\xdf" - "\xf6\x6c\xd6\xd2\xf9\x1f\x8b\xd3\x8e\x73\x81\xda\xa9\xd2\x7a\x9e" - "\xbf\xb7\xb8\x5c\x8b\x73\xba\x56\x2b\x5e\x63\x6b\xce\x6a\xd7\x39" - "\x5d\xab\x70\xb9\x56\xe4\x74\xed\x88\x4b\x99\x47\x9c\xae\xed\x75" - "\xb9\xcf\xe8\x74\x2d\xdf\xe5\x9a\xc5\xe9\x5a\xb6\x70\xcd\xa7\x2d" - "\xb3\x2e\x40\xfa\x26\xf7\xf7\x64\xe1\xbc\x12\xce\x3b\xc5\x3f\xf8" - "\x7b\x9c\x70\x1e\x9e\x5f\x37\xd1\x44\x72\x0f\x0a\xe7\xa9\xec\x59" - "\xf9\x75\x33\x9c\xca\x8f\x60\xb6\x8f\xba\x38\xc7\x5a\xb8\x41\xa1" - "\xd9\x5c\x67\xcc\x76\xb8\xa6\x41\xbd\x72\xd6\xed\xc5\x49\x9a\x97" - "\x97\xff\x49\x93\x30\x3f\x11\x97\xa3\x2c\x5a\x90\xa8\x59\xb4\x64" - "\xde\x7c\x99\xdf\xe5\x60\xf4\x5b\x86\x71\x7d\xd0\xa7\x82\xe0\x23" - "\xbc\xc9\xe1\x1b\x1f\x70\x15\x9e\x05\xf3\xff\xdf\x51\x1f\xec\x79" - "\xcc\x3f\x71\x39\xfa\x64\x60\xfe\x17\xc8\x53\xf5\xa4\xee\x8c\xe0" - "\x7f\x41\xdf\x96\x79\x8e\x78\xf6\xbf\x70\xbe\x96\xfa\x48\x83\x7c" - "\xcc\xff\xc2\x79\x13\xf4\xf3\x49\x7c\x7f\xe6\x27\x9f\xc5\xd7\x39" - "\x27\x72\x13\xf3\x9c\x76\xea\x67\x2c\x83\xd9\x36\x5c\x7d\x3f\xaa" - "\x4b\xf1\x3e\xe1\xfb\x67\xa9\xd3\xfd\xf1\xec\xba\x38\x3e\x08\xcf" - "\xcc\x55\x63\x8c\xb8\xfe\xf5\x90\xa6\xf6\x78\x7a\xed\x1c\xf3\xe3" - "\xb2\x49\xad\xc7\x77\xc2\xf7\x96\xbf\x9b\xf2\x8f\xf5\xe4\xdc\x07" - "\x4e\xef\x56\xeb\xe4\x4f\x4a\x7c\x07\xe6\xb3\xab\xeb\xbb\xd2\xfd" - "\x3a\xbc\x5a\xad\xc7\x67\x23\x9e\xb1\xb5\xee\x90\xde\xa4\x3e\x22" - "\xd6\xc7\xa9\x7e\xf8\x3d\x42\x05\xf5\xbb\x40\xdb\x04\x64\xca\x83" - "\x4c\x85\x77\xd8\xcd\x67\xd6\xad\xa3\x6b\xb7\x71\xef\x1e\xc6\x2e" - "\xa0\x63\xd5\xf9\x78\xd1\x56\x89\x63\x14\xf3\x85\x7d\x5e\xe2\x7f" - "\xe8\xe7\x67\x93\x38\x7e\x9d\x77\xe2\x7f\xec\x99\x70\x6e\xaf\xb3" - "\x0e\x39\x3d\xef\x0c\x3e\x0f\xf2\xcd\x60\xeb\xc5\xd5\x47\xb0\xbf" - "\x43\x9a\xfa\x11\xc5\x7b\xb1\x8e\x9e\x62\x41\x79\xf2\xc3\x26\xb5" - "\xa3\x69\x84\xd8\x8e\x79\x34\x56\x89\x69\x82\x68\xc7\xa3\xfb\x55" - "\x20\x0f\xf6\x2d\xc4\x27\x5e\xbd\x2c\xb2\x4c\x73\x1d\xea\x64\x8a" - "\x63\xb8\xfb\x46\xd8\xf8\x00\x12\xcb\xda\xd8\xb4\x14\xb1\x1e\xfb" - "\x0e\xc3\x7c\x53\xb5\x20\x7b\xe1\x1b\x8e\x69\x1b\x9e\x97\xd6\x69" - "\x9b\xcc\x62\x3e\x11\x9f\xd9\x77\x28\xd3\x49\x9a\x8f\xc5\xaa\x0c" - "\x67\xb2\xff\x85\xba\x9e\x98\x6a\x85\xfc\x74\xed\x28\xf3\xaf\x61" - "\xb2\xf2\x9b\x86\x42\x7b\x9a\x9a\x4c\xa4\x4e\x58\x67\xcc\x9e\x0b" - "\xc7\x5a\xac\x0b\xb6\x15\xee\xfd\xe4\x37\xbd\x11\x06\x72\xf2\x18" - "\x1f\x9d\xad\x6f\xaf\xa7\x3e\x88\x30\x16\x04\xda\x60\x19\x26\xd7" - "\x2f\xe7\x6f\xf0\xa5\xe8\xe3\x13\xf2\x04\x88\x79\x18\x86\xd3\x6b" - "\x74\x3d\xb2\x2e\x09\xed\x44\xc2\xb5\x24\xdc\x1f\xe7\xf8\xef\xe7" - "\xf4\xdf\x17\xff\xf3\x49\x7c\xc9\xc6\x14\x3a\xc6\xaa\xa4\xbd\xb7" - "\xf5\x89\x90\x0e\x70\x49\x07\xcb\xd2\x2b\xc9\x30\xba\xae\xd6\xc2" - "\x37\xd0\xf5\xc7\xc2\x79\xa1\xec\x3b\x68\x7d\x92\xf8\x08\xd0\x91" - "\x0a\xdc\x4b\x29\xf4\xc7\x0a\xdc\x83\x19\x68\x7b\x89\xee\xbf\xc4" - "\x58\xef\xc2\x31\x5c\x38\x8e\x61\x71\x02\xeb\xc7\x48\xb1\x7e\xd1" - "\x56\x53\x3f\xd1\x53\xec\x61\x31\x36\xb3\x18\x7b\x18\xf7\x6f\x0a" - "\x31\x8a\x66\xc1\x7d\x89\xdd\xc5\x79\x86\xeb\x79\xe2\x5e\x4c\x7b" - "\xae\x5a\xc7\xe5\x26\x20\x57\xbb\x17\x7d\x0e\xa5\xb7\xa0\xcf\x06" - "\x0b\x31\x90\x0e\x62\x48\x6c\xcb\xc0\x38\x75\x55\x2c\x3e\xdd\x40" - "\x94\x07\xee\x05\x42\x0e\x59\xa5\xbb\x4c\x63\xd4\xad\x68\x21\xc3" - "\x74\xbf\xe5\x1b\xa0\x0d\xac\xf6\x4d\x6a\x9d\xa0\x47\xdb\x60\x2c" - "\xbc\xa7\x99\x5c\xa4\xd8\x4c\xe3\xaa\xb6\xd0\xef\x59\xfe\x97\xc8" - "\xc5\x6c\x9a\x87\x8f\xd9\xc6\xda\xee\x22\x1d\x1f\x76\x65\x8a\x71" - "\xc8\x2e\x86\x8b\xb1\x4e\x4d\xe4\xe2\xfa\xeb\x41\xd3\xb4\x70\x2e" - "\x4a\xbe\x16\xfa\x22\xc6\x64\x0d\xc4\xba\x43\x1e\x82\x65\x43\x1e" - "\x09\xff\xe1\xfc\x0a\x1b\x19\x0a\xf5\xba\x24\x96\x0f\xd7\xb3\x4d" - "\xe4\x02\x1d\x63\xb0\xcc\xeb\x9b\x96\x01\x5e\x5c\x2c\x30\xf9\x5c" - "\xd4\xb1\xb5\xd4\x17\x8b\x4d\xa4\xe0\x60\x77\x5c\x08\xfa\x42\x2c" - "\xf4\xa5\x38\x2e\x77\x68\x0c\xf3\x0f\x3c\x34\x96\xd9\x1e\x2f\x5e" - "\xc7\xf5\x5a\x1b\x6f\x10\x15\xda\x02\x99\xce\x36\xd0\x7d\x85\x78" - "\x0e\x30\xbb\x18\xfa\x08\x1b\xd7\xbc\x1a\xff\x1b\xd8\x3e\x88\x6b" - "\xc4\x3f\x27\x41\xf4\x6f\xdc\x10\xed\xe4\x6b\x5d\xd8\x1f\xd1\xb0" - "\xb2\x2a\x99\x7e\xc7\xa6\x75\x74\xad\x03\xd6\x17\xda\xc9\xe2\x91" - "\x6b\xaa\x87\xc6\xd0\x6f\x2e\x9b\x43\x67\xb1\xb5\xa7\x0d\xc7\x7c" - "\xc2\x86\xac\x82\x67\x1d\x11\x6d\x89\x98\x27\x07\x63\x80\x42\xf9" - "\x8e\xf7\x4c\xa0\xcf\x68\x60\x7d\xbd\xc1\xca\x6d\x1a\x8a\xbe\xe4" - "\x55\xc2\x79\x6b\x95\xcd\x8a\x7b\xb7\x3d\xad\xf5\xf6\xa7\x3e\x54" - "\x36\x0f\x8d\xc1\xfd\x25\xe3\xad\x62\x9d\x1b\xad\xb8\xaf\x01\xeb" - "\xcc\xda\xb6\xf1\xb2\xd8\x8e\x1b\xae\x41\xd9\x69\x67\x49\x03\x69" - "\x5c\x8e\xeb\xe1\x70\x9f\x0e\xf6\x61\xd6\x06\x8d\xcb\x69\xbe\x0e" - "\x47\x1e\xea\xef\x82\xc6\x0c\x81\xf2\x0b\x69\x7c\x21\x78\x07\x90" - "\x85\x3e\x0d\xf7\xec\x36\xd2\xb9\xdd\xda\x04\xc2\xde\x9b\xae\x7f" - "\xbd\x34\x8c\xe9\x4a\xe3\x41\x71\xcc\x30\x09\xe7\x36\xe2\xb3\x93" - "\x3a\xc8\x15\xd2\xb8\x05\x63\xfc\x42\x7b\xc4\xa1\xff\xa8\x2a\x0b" - "\xf4\x93\xe4\x0e\xd4\x85\x38\x8c\x23\x07\x63\x4a\x1e\x1b\xe7\xb0" - "\xcd\x1b\x93\xf1\xf9\xd8\xb6\x20\x3b\x33\xb4\xe9\xeb\x6d\x99\x97" - "\xd4\x62\x9b\xe6\x84\xe2\xbc\xa7\x71\x4c\x77\x63\x84\x1d\xea\x5c" - "\x05\xec\x4a\x3f\xf4\x2c\xd6\xef\x0c\x37\x68\x68\x0c\xae\xb5\x86" - "\xff\xab\x05\x6c\xa7\xb2\x63\x7d\xe9\xd2\xfb\xf0\x8c\x83\xb8\x6e" - "\x01\xb1\x12\x7d\x1c\xc1\xb9\x18\xa1\xfd\xa8\x9f\xfb\xdc\x24\xd6" - "\x0e\x2c\xff\x3f\x02\x98\xdd\x78\xc8\x61\xa8\x97\xd3\xf7\x9f\x7f" - "\x50\x7f\x2b\x85\x42\x5c\x6e\xb8\x56\xe6\x54\x67\x0b\xdd\x27\x79" - "\x0d\x6d\x7e\x97\xe2\xf1\x59\x1b\xd0\xbf\x0f\xea\x45\xb3\xb3\xfe" - "\x5f\x9a\x86\xf5\xc4\xb5\xbc\xf6\xa0\xd0\x59\x30\xee\xc6\x62\x3b" - "\xc3\x3d\xeb\xa0\x2f\xb8\x9d\xa7\x08\x63\x22\x8d\x25\xd5\x96\xf9" - "\x8f\x08\x71\x4c\x84\x79\x06\x8c\x0b\x4d\x0f\xd2\xf9\x27\xf0\x6a" - "\x03\x87\xbc\xa6\x29\x1c\xf5\x06\xfa\xfa\x41\x01\x63\x0f\xc2\x3d" - "\xf1\xe2\x37\x31\x3b\xee\x87\xb8\x42\xbf\xe3\x5a\xc4\x78\x4b\xcc" - "\x9f\xd6\x3f\x72\xa5\xfd\x13\xff\x28\xe8\xb2\x7f\x02\xf7\x8d\x6c" - "\xa5\x31\x7e\xf6\xe2\x98\x52\xd9\xd2\x80\x63\x04\xbd\x1f\xf7\x54" - "\xa4\xc1\xdc\x9c\xed\x3d\x69\x40\x3b\x3d\x8d\x8f\x80\x75\x61\x3e" - "\xf1\xeb\xe9\x7f\xd0\x5b\x15\x1e\x99\x2e\x35\x11\x47\xcc\x5e\x90" - "\x37\x7e\x83\x3b\xae\x7a\x82\xe8\xef\xc3\xf1\xba\xe9\x41\x8c\x3f" - "\x0b\x79\x46\x88\xb1\x67\x69\xac\x59\xf6\x3e\xc5\x1e\x7d\xbc\x8d" - "\x23\xe1\xe8\x13\x03\xf7\x61\xd1\x36\x50\xbf\x5e\x8a\x7e\x63\xd1" - "\x07\x9e\x3e\x05\xe3\x37\x34\x5d\x78\x2b\x94\xee\x65\xb5\xe8\xc7" - "\x5d\xc3\xf5\x55\x2d\x97\x52\xa9\x5f\x14\xff\xe9\xc9\x36\x1e\xef" - "\xa3\xbc\x22\xe8\xf5\x52\xbc\x46\xfd\xa7\x63\x99\x7d\xf6\x81\xda" - "\xb4\x57\xe0\xa8\x2d\x80\xfb\x83\x41\x56\xf4\xbb\x06\xfc\x0f\x6d" - "\x26\xcd\x77\xb0\x78\x88\xcc\x9f\xb7\xb0\xce\xda\x8f\xed\x91\x87" - "\x36\xa3\xbe\x42\xbf\x59\xad\xb9\x1f\x63\x87\x7e\xb3\x86\xfa\xd4" - "\xcd\x55\x97\x09\x6d\x50\xb6\x91\xd5\x2b\x70\x4e\xb2\x92\xd6\x11" - "\xeb\xe7\x5d\xdd\xbe\x99\x22\xcc\x27\xfc\xda\x32\xbf\x59\x2f\xee" - "\xad\x67\xbc\x8a\xf9\xda\x65\xb2\xf8\x46\xd8\x63\xa6\x2e\x17\x9e" - "\x5d\x7e\x13\x9e\x5d\x26\x94\x59\xc0\xfc\x0d\x37\xe9\xa0\xdc\x82" - "\xb6\xcc\xe6\x60\x71\x5e\x23\xec\x0d\x1a\xc3\xe6\x5b\xcd\x63\xa4" - "\x79\x4d\x53\x97\x7d\xbe\x8f\x2f\x59\x92\xa8\x99\xb7\x60\x99\x6e" - "\x6e\xe2\x2b\x71\x9a\xf9\x09\x09\x4b\x12\x34\xe8\x2c\xc5\xb9\xff" - "\xb0\xf8\x26\xcd\x91\x42\x3c\xaf\x62\x29\x9e\x57\x73\xb6\x73\xdc" - "\x39\x13\x69\x5e\x7f\x73\x6c\x18\xcd\xc5\x9e\xca\xc9\x55\x72\x25" - "\xf0\x2b\x85\x9f\x1e\x7e\xe5\x68\xd3\x98\x63\x25\x91\x30\xd6\x53" - "\x7e\x28\xfa\x62\xe7\x32\x9b\x63\x71\xed\x50\x3d\xf9\xd6\xb7\x90" - "\x53\x11\xea\x03\x24\x93\x2b\xc1\xfc\xbb\xe0\x7e\xf8\xe9\xe1\x57" - "\x0e\x3f\x7a\x1f\xf7\x31\xdd\x57\x5d\xe2\x7c\x8d\xad\x0b\x49\x0e" - "\xc7\x3c\xfc\x1a\x15\xfd\xfe\xcb\x6d\x66\xf9\x5c\xea\xa0\xe4\x33" - "\x2f\x1e\x11\xf2\xd1\xf1\x75\xe0\x1a\xa2\x71\x93\xcf\x87\xcf\x3c" - "\x5b\x22\xe4\xa3\xeb\x5d\xc4\xf7\x41\xbf\xe5\x90\x5f\xcc\xa7\xe2" - "\x33\x9b\xa2\x84\x7c\x14\x37\xb9\x4c\xa5\xbb\xe7\xfa\xf2\x99\xef" - "\x69\x85\x7c\x6a\xe7\xf2\x9c\xf2\xf8\x71\x99\xd5\x7b\x31\x0f\xb7" - "\x46\xc5\xfc\x26\x64\x36\x17\x43\x7e\xb7\x7b\x9b\xbd\x93\x53\x4b" - "\x17\xff\x4f\xba\x57\x16\xcc\x7f\x64\xc1\xe2\x24\x8c\x40\x93\xb8" - "\x64\x79\x22\x1e\x17\xcf\xfd\x33\x3d\x2c\x99\xf3\xea\x2b\xec\x4f" - "\x62\x7c\x38\xfe\x89\x07\x7d\xc3\xe3\xbc\xe5\x3a\x3c\xbc\xb2\x04" - "\x93\xc9\x71\x63\x96\xbf\x22\x86\xa2\x76\xd6\x43\xe0\x6c\x2d\x56" - "\xd0\x8d\x26\x86\xb3\x97\x55\x26\x72\x96\xe2\x32\xc6\xa4\x38\xa1" - "\xb5\x11\xd1\xbe\xc5\xe4\xdf\x12\xcd\x7c\x33\x5e\x0e\x2a\xe4\xfa" - "\xf9\x07\xae\xd1\xbd\x12\x68\x5b\x30\x1f\xc6\x8c\xf5\x70\x6f\xa4" - "\x89\xbc\x32\x45\xc0\xc6\x1a\xea\x87\x30\xb3\x25\x57\x58\xb3\xa9" - "\xe2\x72\xd5\xd9\xe8\x0b\x1c\xd2\x34\xe6\x2b\xa4\x0f\x42\xba\x1a" - "\xd2\x18\xeb\x35\x18\xd2\xb8\xc6\xc2\x08\x69\x8c\xa1\x3a\x8c\xcb" - "\xf5\x29\xc2\xbd\xa8\x90\xd6\x40\x7a\x04\x94\x5f\x24\xf6\x0b\xf7" - "\x5c\xf9\xb2\x5e\x8c\x43\xcb\x62\xce\x5e\xae\x76\xc4\x9c\xc5\x38" - "\x33\x69\x6a\x1a\x97\x86\x71\x90\xcb\x16\x9f\xb0\xbb\xfa\x43\x1e" - "\x8b\x23\x0e\x0f\xb5\x7b\x5c\x51\x89\xeb\x65\x98\x5d\xe3\x4a\xb0" - "\x53\xec\x5e\x4c\x8f\x10\x63\xf7\xa2\xdd\x8b\xc6\x46\x83\x23\x9f" - "\x89\xfe\x1e\x79\xb7\xe3\x00\x8b\xa9\x77\xe5\x75\xf4\xf3\x69\x4e" - "\x9f\xa7\xf8\x79\x21\xda\xd2\x20\xcd\x7c\xbc\xf1\x57\xc8\x15\xba" - "\xfe\x5a\xf4\xff\xe4\xec\x73\xc0\xed\x3e\xa7\x2f\x80\x33\xd0\x98" - "\x21\xf1\x4b\x02\x6d\x73\xe7\x33\x1e\x78\xe5\x1b\x86\x5f\xa1\x19" - "\x8c\x2f\x5c\xa9\xe1\x9f\x65\x71\x16\x4c\xe4\x6a\x0c\xce\x59\x02" - "\x15\xf1\x4b\x78\xb8\x37\x30\x79\xee\x7c\x7a\x0e\xf2\xad\x05\xae" - "\x26\xd4\xef\x90\x61\x18\xee\x8f\xe4\x04\x5f\x0a\x57\x4a\x67\xdf" - "\x9d\x81\xcf\xf1\xa7\x3c\xe4\x0b\x12\x80\xb1\xed\xb0\x6e\x85\x4e" - "\xfe\xa9\x36\xc2\x39\x5c\x1b\xda\xfa\x2c\x09\x40\x3f\x9d\x42\x5d" - "\x4a\x59\xac\xa1\xab\xd1\xa2\xaf\x18\x13\x9c\x73\x7d\x9f\x67\xff" - "\x40\xb5\x72\xe4\x2b\x63\xa2\x27\xc3\xbf\x31\x42\x58\x55\x67\xdd" - "\x1c\xd6\x3a\x28\x2c\xb6\x75\xbf\xba\x8d\xc5\x00\xbc\x5a\x04\xe5" - "\xb0\x58\xc0\x38\x2f\x69\x8b\xc9\x67\x6b\x4b\xaf\x9e\x41\xbf\x98" - "\x5c\x26\xf2\x49\xdc\x5f\x7b\x95\xe2\x17\xaf\x0e\x5d\xb7\x6b\x35" - "\xfa\x8b\x55\x40\x1b\x5f\xfd\x10\xaf\x09\x3e\x77\x94\xd4\x47\x8d" - "\x9d\x84\xd1\xfd\xa5\xc0\x51\xd0\xbf\xcc\x25\x72\xed\x03\xe4\x1d" - "\x68\x57\xe2\x32\xaf\xce\x43\xbd\x05\x19\xa3\xaf\x09\x0b\x3f\x48" - "\x9d\xc8\x07\x0d\x1e\x81\x7a\x8c\x5c\xd7\xa0\xc6\x36\x33\xe3\x98" - "\x33\x09\x7e\x7f\x64\xf1\x2c\x5e\x6c\x12\xcb\x44\xbf\x48\xc0\xa1" - "\xd6\xc3\x51\xdd\x96\x69\x8e\x71\x8a\xd5\x25\xec\xa7\x35\xaf\x44" - "\x7f\x4d\x58\x36\xe3\xce\xd7\x76\x33\x0e\x62\x5e\x67\x22\x81\x13" - "\x59\x5f\x34\x03\xff\xc9\x18\x23\xfc\x07\xfe\x33\xa6\xc8\xa5\x8c" - "\x46\xd1\x66\xca\x74\xda\x8c\xb6\x87\x49\xf0\xfb\x23\xe4\xaf\x10" - "\xe3\x35\xaf\x55\xd2\xfd\x8f\x97\x7c\xc2\x70\x5f\xb4\xb9\x41\x3c" - "\xef\xab\x88\x84\x36\x35\x5b\xc4\xbe\xdf\x3a\x28\x34\xae\x2d\xf3" - "\x3b\x95\x68\x6b\x61\xb6\x97\xef\x82\x9d\xd2\x89\x90\x1e\x21\xa6" - "\xe1\x7f\xb8\x88\x15\xf0\x1f\xe6\xbf\xe9\x2d\xc2\xff\x29\x26\x92" - "\x59\x2c\xfc\x9f\x61\xf2\x69\xd4\x8a\xf5\xe6\x32\x7d\x02\x59\xdd" - "\xaf\xad\xe7\x36\x25\xc4\x62\x8c\x6c\xc8\x93\x6c\x22\x97\xe9\x9a" - "\x74\xf4\x8f\xb4\xbe\x43\x3d\xc3\xb0\x0e\x38\xf1\xab\xa8\x4b\xd7" - "\x68\xdf\xd8\x90\xa2\x8e\x46\x3e\x89\x7e\x20\xa8\x2f\x2d\xf4\x1f" - "\x67\x23\x7e\xd4\xef\xf8\xa6\x84\x68\xea\x6f\x7b\x85\x36\x40\xf4" - "\x1d\x07\x38\x32\x86\x57\xbe\xba\x0e\xfd\xc9\xd1\xf8\x02\x6d\xda" - "\x81\xd4\x87\x9c\xe0\x3b\x6e\x67\x12\x09\x2e\xe0\x98\xef\x38\xea" - "\x23\xc2\x0f\xe6\x1f\x49\xee\xfd\xc7\xf1\x99\xbb\xab\x45\xff\x71" - "\xfc\x0d\xbb\x15\xfe\x8f\x00\x99\xab\xe0\xa8\xa5\x69\xf4\x21\xc7" - "\x7c\x07\xab\xdc\xfa\x93\x53\x02\x9e\x29\x99\x3f\x39\xef\xc6\x81" - "\x6b\x31\x4c\x27\xae\xe5\x8b\xb1\xa3\x9d\xce\xed\x85\xbe\x90\xc7" - "\xce\x99\x05\xdf\x30\xd7\x00\xff\xd2\x23\x85\x35\x92\x66\xb4\x8b" - "\xe5\x51\xdb\xd7\x55\x1b\xdf\x19\xb7\xcd\x1d\x96\x5c\x1b\xb4\x3e" - "\xfc\x1a\x5d\x0b\xd8\x0a\xdc\xb7\x95\xf2\x2d\x36\x47\x6c\x25\xae" - "\xfd\xf5\xe5\x57\x96\xcc\x9b\x3f\x67\xe1\x22\x9d\xe6\xd9\x19\x93" - "\x68\x60\xb4\x31\x9a\x05\x89\xf3\xe9\x50\xa3\x79\x76\xf2\xe3\xd3" - "\xa7\xcf\x98\xf3\x87\x19\x8f\xcd\x98\xf9\x87\x47\xd9\x0e\xc3\x19" - "\x09\x2b\x31\xb8\x5e\xe2\x12\x0d\xde\xf4\xb2\x10\xfa\x36\x65\x7e" - "\xc2\x12\xd7\x7e\x1e\x4c\xed\x57\x4a\x6a\xb3\xb5\xe0\x7f\x66\x23" - "\x6b\x2d\x10\x6d\x57\x0c\xd3\x5a\x37\x60\xdb\xd2\x58\x87\x99\xad" - "\xc1\xc8\x9b\x84\x18\xc3\x38\x9e\xa8\xb0\xaf\xe2\xb8\x02\xef\x52" - "\xee\x88\x87\xea\xb0\x9f\xb5\xb6\x28\xf1\x3e\xa1\x8f\xb2\x73\x16" - "\x05\x3f\x74\x68\x3a\xf3\xc3\xdf\x6a\x13\xed\xda\x78\x4e\xac\x43" - "\x3d\xe6\xc9\x6c\x9d\x2c\xc5\xe4\xb4\x8c\x90\xe2\xce\x91\x2e\x6d" - "\x44\x08\xd2\x14\x5f\xe0\x20\x7e\xf0\xeb\x87\xbf\x29\x0e\xdc\x4e" - "\xe2\x8d\x38\x17\x0b\x54\xc0\xd8\x9a\xec\xc3\x62\xde\x64\xd5\x50" - "\xff\xec\xd3\xed\x36\x9f\x39\x76\x25\x1c\x7d\xf8\x39\x76\x15\x9d" - "\xff\xf1\x49\x7c\x0d\xfa\x42\x83\xfb\xaa\x31\xb6\x13\xe8\x71\xf6" - "\x74\x5b\x5a\xf6\x74\x3b\x6f\x9b\x03\xbc\x1c\x8e\xff\xc0\x3d\xde" - "\xd3\xed\xff\xe0\x69\x5c\x0b\xc8\x9b\xc3\xfc\x7f\x95\xe3\x7e\xd4" - "\xd9\xa0\xc3\x85\xd7\x58\x5c\xcf\xe9\x2b\xaf\x9e\x9f\xb3\xd2\xc4" - "\xe2\x7a\x5e\x61\xf1\x6b\x59\x5c\x5e\x92\x06\xe5\x9c\x9c\x63\xf7" - "\xd1\x4c\xb7\x77\xf2\x6c\x9f\xea\x75\xff\xee\x62\x75\xba\xb5\x4b" - "\xe4\xdc\x5d\xcd\x6f\x09\x29\xe3\x73\x34\x7b\xf9\x2d\xa1\x51\x7c" - "\xee\xe0\xa9\x88\xcd\x7c\xce\xcf\xb3\x21\x0d\xe7\x47\xcd\xe3\xb7" - "\x0c\x8e\xe2\x73\x46\x47\xc2\x11\xd2\x63\x86\xf1\x5b\xc2\xa2\xf8" - "\x37\x38\x7f\xb8\x4f\xcf\xbf\x01\x63\xe8\x96\xd0\x48\x3e\x87\x34" - "\xc1\x51\xcf\xe7\x28\x63\x20\x1f\xa4\x7d\xca\xe1\x08\x69\xdf\x88" - "\x4b\xe4\x7a\x05\xdc\x03\xe7\xc6\x59\xd9\xb3\x7e\xa9\xa2\xcf\xca" - "\x79\x48\xcd\x9e\x11\x31\x8c\x3d\xe3\x37\x5a\xf6\x8c\xdf\x4e\xa0" - "\xcf\xc8\xf1\x2b\x86\xfc\xe5\x7c\x8e\x7f\x1e\xe4\x9b\xc2\xe7\xf4" - "\xcf\x80\x23\xa4\x03\xe2\x21\x1f\xa4\x07\xe2\xb3\x20\xad\x8e\x82" - "\xfc\x90\x1e\x14\x0e\xf9\x2b\xf8\x9c\x60\x0d\xe4\x9b\xca\xe7\x84" - "\x62\xf9\x90\x0e\x23\x90\x0f\xd2\x43\xcc\x70\x84\xf4\x5d\x26\xc8" - "\x0f\xe9\xc7\xe0\x9d\x42\xaa\xf9\x9c\xc7\x2d\x90\x2f\x9a\xcf\x89" - "\x82\xe7\x85\x42\xfa\x89\x59\x90\x0f\xd2\x53\xe0\xfe\xc1\x90\x7e" - "\xb2\x0c\xf2\x43\xfa\xf7\xf0\xae\x21\x35\x7c\xce\x34\x78\x4e\xe8" - "\x0c\x3e\xe7\x69\x7c\x67\x48\x47\x17\x41\x3e\x48\x3f\x8b\xf5\x81" - "\xf4\x0c\xb8\x2f\x0c\xd2\x33\xa1\x0d\x42\x8c\x7c\x4e\x4c\x3e\xe4" - "\x8b\xe1\x73\x5e\x8c\x83\x23\xa4\x67\x47\x40\x3e\x48\xcf\x85\x36" - "\x1c\x0c\xe9\x57\x8c\x90\x1f\xd2\xaf\xe2\xfb\xd6\xf2\x39\x0b\x52" - "\x21\xdf\x2c\x3e\x27\x3e\x1a\x8e\x90\x5e\x32\x02\xf2\x41\x7a\x29" - "\xb4\xdf\x60\x48\x27\x62\x7b\xce\x72\x2f\xcf\xe4\x28\x7e\x8d\x1f" - "\xe1\x73\xd6\xee\xe1\xd7\xf4\x83\xe3\x6b\x33\xf8\x35\xbe\x5a\x3e" - "\xe7\x75\x15\x9c\x87\x63\x56\x24\xa4\xc7\x08\x69\x38\xfe\xeb\x18" - "\x48\x87\x0b\x69\x38\x66\x87\x41\x7a\x82\x90\x86\xe3\x06\x4c\x47" - "\xf0\x39\x39\x70\xf4\x83\xe3\x86\x7c\x48\x4f\x14\xd2\x70\xdc\xd8" - "\x00\x47\x1b\x9f\xf3\x06\x70\x6e\x5f\x90\xf1\x9b\xb9\x90\x86\xe3" - "\xfa\x68\x48\x83\x0c\xd7\x1f\x84\x74\x94\x79\xa4\xaf\x0e\xc7\x6e" - "\x7e\x50\x6d\x06\x17\x3a\x34\x32\xfd\x3a\x51\xa2\x4f\x9c\x92\x34" - "\x13\xfa\x05\xb9\xb7\x9e\xb4\xbd\x83\x7e\xfc\x31\x8f\x7d\x6b\x88" - "\x9e\x0b\x0d\x8d\x84\xf3\x7e\x90\xaf\xdf\x25\x62\xa5\xfe\xa1\x0c" - "\xa9\x26\x1a\x47\x4c\xf0\x45\xe7\x07\xf7\x7c\x0e\x5c\x28\x02\x63" - "\xa2\x43\xbb\xd9\xf8\x4c\xdf\x6b\xd0\x5e\xa9\x7c\xe6\x9d\xf5\x70" - "\x84\x74\xd0\x17\xd0\x5e\x90\xfe\xf5\x1b\x70\x84\xf4\x8b\x8f\x43" - "\xbb\xa5\xb6\x65\x5a\x61\xfc\xbb\xce\xc6\xb6\x2c\x9e\x47\xff\xc6" - "\xb8\x3f\x92\xf6\xad\x54\x0b\xe1\xb3\x22\x09\x3f\x3c\x4a\x47\xed" - "\x8f\x21\xda\xd8\xc0\x64\x48\x8f\xf4\xd3\xf1\x83\x1a\x73\xe9\x3b" - "\x64\xc2\xfc\xb9\x73\x84\x92\xd5\xe3\x4e\xbe\x9e\x58\x17\xa0\xff" - "\x79\x7e\x90\xdd\xd3\xf5\xd7\xe9\xf5\xfb\xa2\xcc\xec\xba\x9a\x48" - "\xd7\xff\x88\xd7\xdf\x09\x44\xdf\xc8\xf7\x59\xcc\x26\x62\xc5\xbd" - "\x14\x80\xe9\x6d\x26\x3e\xd3\x87\x18\x2c\x4d\xc2\xfb\xf6\xc3\x7c" - "\x9f\xe3\x7d\x9e\xec\x3a\x5c\xde\xd8\xa6\x0d\x80\x7f\x38\xcf\x85" - "\x71\x50\xa9\x49\x1b\x51\x5a\x4f\x3a\x8a\x76\x22\x0f\x0a\x9e\x54" - "\xc2\x70\xb1\x7d\x7e\xe7\xe6\xc1\xeb\x34\x29\x81\x50\x5e\xc7\xee" - "\x74\x2b\x6f\xd1\xa7\xa1\xbf\x21\x7a\x5e\xcf\xf6\xfa\xd0\xff\x7b" - "\xd9\x1a\x50\xfa\x3f\x9f\xd9\x95\x3b\x8a\xf0\x5e\xe7\x79\x85\x3d" - "\xeb\xd0\x04\x2e\x74\x92\x9e\x7d\x33\x6f\x5f\xf0\x21\x67\x52\x06" - "\x26\x12\x5f\x4d\xca\x47\x50\x7e\x7b\x89\x6c\x0e\xea\xc8\x4b\xaf" - "\x6d\x39\x0a\x79\x77\x50\x7b\x51\xbb\xde\x11\x4b\x15\xde\xe1\x4d" - "\x1c\x03\x95\x04\x63\xf2\xa9\x18\xa7\xed\x88\x44\x1f\x95\xb6\xe0" - "\x51\xd5\xb6\xdc\x5a\x9d\x3d\x6f\x52\x09\xbf\x75\x92\x7e\xa0\x4d" - "\x41\xd8\xda\xfb\x8e\xe5\xe3\xad\xc8\x21\x4f\x61\xde\xb1\x9c\xdf" - "\xc7\xd6\x71\xc9\x44\xa9\x4f\x38\x8b\xe9\x45\x7c\x56\xa5\xc5\xd0" - "\x62\x24\xfa\x04\x5a\x56\x3c\x9f\xd5\xb0\x9e\xf3\x33\xda\x0a\x91" - "\x8b\x27\xa3\x2d\xed\x0b\x6c\x97\xef\xa0\x9d\x61\x3c\xe9\x98\xea" - "\x88\xf3\x0b\x6d\xb9\x01\xda\x0e\x79\x32\xfa\xad\x98\x63\xb7\xa3" - "\x5f\xb1\x6c\x13\xb4\x03\x1b\x6b\x3b\xc2\x31\x46\xb2\xf0\xdc\xd7" - "\xb8\x41\x83\x75\x55\xb3\xf0\xfb\xa0\x1a\xfd\x34\x59\xe8\x5e\x77" - "\x1b\xc6\x4d\xc3\x31\x87\xe5\x75\x96\xdd\x02\x61\x8f\xff\x82\xc5" - "\x89\x09\x4b\x35\xcb\x16\xa4\xcc\x7f\x74\xe4\xf2\x31\x9a\x84\x64" - "\x4d\x02\x8d\x59\x4d\x4f\xc0\x10\xbd\x2c\x7e\x49\xa2\x06\x63\x07" - "\x77\x8d\x5d\x1a\xc6\xab\x07\x4f\xa1\x1c\x52\x41\xe8\xf7\x11\xbe" - "\x28\x2a\x2e\x31\x95\xe7\x34\xf7\xf5\x03\xee\xdc\x19\xd9\xae\xec" - "\xc0\xfd\x01\x6a\x2e\x53\x23\xfa\x29\x0d\xd8\x36\x88\xe0\x7e\x3c" - "\x98\x77\x75\x46\x38\xc6\x44\x05\xc9\x60\xf6\x91\x4e\x78\x7f\xab" - "\x59\xf8\x4e\xc6\x7c\xbf\x09\xd7\xd8\x77\xe4\xce\x78\x98\x2b\xd2" - "\xef\x25\x7c\xd1\xa4\x72\x36\x1e\x77\xd2\xf1\x9e\xd7\x44\xc5\xf1" - "\x7b\xfc\x74\xc0\xe9\x14\xf4\x9b\x9d\xed\x5e\xde\x40\xae\x31\x1f" - "\x99\x5b\x7e\x61\x42\x7f\x1b\xf6\xad\x43\x62\xb9\xd0\x5f\x98\xb8" - "\xbf\xf6\x0b\x4f\xdf\x4d\x94\x07\xa0\xff\xab\x34\xa0\xdf\xf7\x91" - "\x7b\x3f\x4a\x6b\x52\x42\x9d\xf7\x7d\x94\x66\x54\xf2\x79\x43\x23" - "\x5a\x47\xf8\x47\x5b\x85\x18\xb7\x06\x9b\x95\x7c\x1a\x45\x70\xae" - "\x56\x6a\x09\x09\x4f\xb6\x84\x0c\x99\x62\xdd\x12\x61\xd2\xdf\xf7" - "\x4b\x32\x79\x34\x7f\xf5\x93\x32\x42\x5a\x14\x24\xee\x93\x28\x9c" - "\x3f\x0c\x8e\xb4\xaa\x07\x47\x59\xb6\xfe\x22\x16\x7d\x27\xb5\x6f" - "\x7d\x38\xbc\x23\xf4\x2e\xfd\x71\xc8\x73\x0a\x24\xf7\x99\x06\xf4" - "\x77\x38\x51\xb6\x8f\xf2\xd5\x1f\xe8\xc8\x55\x96\x97\x4d\x64\xb6" - "\xdd\x58\xe8\x33\x54\x9f\x6c\xcf\x7c\x72\xb0\x8c\xc0\xb3\xc9\x81" - "\x8e\x29\xca\x4f\x23\xba\x5c\x5f\xfa\x49\x78\x19\x69\x43\xbf\xa7" - "\x30\x7f\x3c\x7a\x36\x9f\xf0\x5b\xc7\x15\xed\x4b\xb1\x2a\x67\x99" - "\x88\xb2\xd2\x98\x4f\x52\x1b\xc9\x00\xdb\x55\xad\xea\x3d\xb8\xbf" - "\x1d\x63\xa3\x7c\x16\x46\xfd\xe2\xa5\xe9\x69\xfc\xcc\xc0\x2a\xe0" - "\x0e\xdc\x55\xad\x5f\xd5\x0c\x3d\x81\xeb\xa3\x6c\xbf\x0f\x23\x95" - "\x71\x66\x62\x88\x29\x22\xed\xca\x48\x72\xe8\x85\x22\xb2\x03\xe6" - "\x22\x3b\xae\x90\x00\xca\x83\x3b\xb5\x7e\xb6\x4e\xad\xca\xb6\x4a" - "\x8b\x7e\x8a\x78\xfe\xaa\xb6\x3f\xf2\x62\xdb\x12\xad\x7f\x95\xb9" - "\x88\x8c\x6f\x22\xda\x76\x25\x09\x6c\x5f\xa5\xed\x5f\xa5\xcb\x87" - "\xb2\x80\xe8\x42\xbb\xa2\x8f\x34\xf4\x9d\x86\xed\x74\x67\x0c\x99" - "\xd1\x42\x6c\xa3\xfb\xd7\x90\x10\x8c\xd7\x82\x5c\x13\xfd\xac\x72" - "\xc1\xe3\x8a\xec\xc1\xbf\x88\x4d\xbb\x0e\xf5\x42\xdf\x42\xfb\xd5" - "\xd5\xc8\xd5\x81\x87\x28\xf0\x9d\x39\x5e\xdb\x7f\x0e\x1e\x37\xab" - "\x47\x21\x5f\xe7\xda\xc2\x30\x9e\x8c\x3f\xd6\x13\xe3\xc4\xae\xbe" - "\x00\x6d\x99\xae\x55\x41\xbe\x00\x38\x3f\xd0\xd0\x62\x25\xf6\xb1" - "\x6a\xd3\x38\x1d\x8d\xff\x19\x5c\x98\x46\xd4\xb9\x69\x24\x58\xf3" - "\x6b\xaa\x4b\x4f\xda\xf7\xa9\xab\xf9\xac\x01\x23\xd0\xe6\x42\xcf" - "\x11\x7e\xb4\xe6\x09\x42\x34\xbf\xc4\xff\xdc\xe7\x9a\x47\x40\x86" - "\xc1\xe3\x08\x9d\x4b\xd0\x79\x29\x77\x82\xcd\x93\xb8\x0f\xdb\xfd" - "\xfe\x18\xc3\x65\xbd\x91\xc8\xad\x51\x0d\xc3\xd8\xbc\x57\x08\xb7" - "\x9b\xcf\xd9\x3e\x83\xcf\x8b\x28\x67\xbe\xd6\xb9\x9d\xed\x7e\xfe" - "\x30\x06\x6f\x2f\x85\xf2\x27\xb6\x2b\x54\x35\xf0\x33\x0a\xf7\xe7" - "\xe1\x7b\xdb\xf7\xf8\x4d\xc1\xf7\xa6\x31\x48\xe0\xbd\xe6\x80\xcc" - "\xf8\xd0\xb1\x25\xd4\xa7\x75\x27\xb4\xaf\x10\xab\x11\xdb\x03\xdb" - "\x80\xeb\xd4\xf6\xa7\xef\xda\xa9\x0d\x80\xf6\x45\x3f\xa9\x81\x69" - "\x73\xe1\x9e\xad\x63\xcb\xe0\xda\xc0\xf6\xe0\xb1\x56\x8c\x05\x64" - "\xd0\x99\x89\x7d\xcb\x58\xf4\x55\x1b\xbc\x2d\x05\xfa\x5c\xc8\xd8" - "\x12\x7e\xcb\xd8\x0a\xa1\x6f\x11\xac\x27\x97\xb3\x43\xd5\x8e\xfb" - "\xe2\xa0\x6e\x50\xbf\x1a\xf8\x19\x4d\x84\x0b\x6b\x1f\xe9\x17\x03" - "\x33\x9c\x16\xa8\xeb\x30\x3e\x6b\x64\x14\xfe\x87\x6b\xc3\xa0\x6d" - "\x14\xd8\x0e\xd8\x1e\x42\x5b\xb4\x4b\x6d\xf1\x4c\x06\xe4\x6b\xe2" - "\xb2\x30\xce\x33\x57\xce\x67\x69\x54\x52\x3e\x7e\xb8\x94\xef\xa5" - "\x11\x2c\xdf\xc6\x72\x96\xef\xfe\x54\xb8\xfe\x21\x6b\x6f\x7e\x7e" - "\xd7\xf6\xe6\x5f\x92\xee\x9d\x5c\xc1\xee\x4d\x89\x61\xf7\x86\xe0" - "\xbd\x5b\xe4\x75\xe2\x37\x48\xf9\x23\x09\xcb\xbf\xdc\x9f\xe5\x57" - "\x4f\x71\xca\xf7\x81\x94\xef\xf7\xeb\x59\xbe\xf4\x22\x96\x6f\x68" - "\x31\x5c\xff\xce\x4d\x5d\xbe\x91\xee\x59\xa0\x66\xf7\x6c\x3f\xc2" - "\xee\x79\x28\x02\xf4\x69\xb8\xac\x2e\x0a\x32\x44\xca\xff\x8a\xf0" - "\xde\x5b\xa6\xb2\xfc\xe3\x1b\x9c\xf2\x3d\xc6\xf2\xe1\xf5\x22\xc8" - "\xc7\x1d\x69\xf7\x5b\x6c\x61\xf9\x1e\x59\x87\xfa\x08\x79\xe6\x72" - "\x59\x03\xf7\xb6\xfb\xdd\x59\x0c\xe5\x94\x80\x6c\xc2\xf0\x08\xb2" - "\x0b\xe3\x72\x07\x47\xc2\x7f\x2d\x7e\xbb\x41\xcc\x35\x91\x4e\x7f" - "\xc0\x5d\xbb\x5b\xfb\x56\x16\x29\x72\xd8\xd7\x38\xe0\x06\x5b\x42" - "\x3c\xfa\xc9\xa3\xbe\xb0\xb7\x86\x98\x72\x39\x16\x2b\x1a\x74\xd4" - "\xaf\x5e\x41\x4e\xc2\x58\x98\x81\xd7\xb8\x3c\x6d\x2c\x37\x02\x30" - "\xf6\x32\xf1\x31\xa4\x36\x91\x12\xae\x49\x99\xdb\x41\x54\x55\x30" - "\xc2\x60\xfe\x12\x18\x53\x35\x8b\x7d\x78\xb8\xe7\x42\xee\x0d\xa1" - "\xbc\xa2\x28\x5d\xfa\x22\x16\x8b\x17\x39\x16\x62\x33\xf4\xc7\x00" - "\x1a\xd7\x69\x31\xf0\x00\x85\x22\x04\xfe\xfb\xd3\xd8\xcb\xa3\x54" - "\xe6\xf6\x7f\x8f\xd2\x75\x6c\x1d\xaa\xef\x1c\xd5\xaf\xba\x3d\x54" - "\x1b\x6b\xdb\x3a\xca\x64\xbb\x6f\x92\xa9\xf3\xaf\x7e\x3a\x7b\xe8" - "\x5d\x91\xf0\x6c\xc0\xed\x7c\xe5\x7e\x2e\x57\xb9\x3f\xad\x54\x89" - "\xe5\x7e\x94\x56\xac\x3c\x9a\x56\xad\x3c\xca\x95\x2b\x3f\x4a\x2b" - "\x82\x63\x09\xc6\xf8\xb9\x17\xca\x9e\x7f\x34\x4d\xaf\x6c\xcb\x52" - "\xec\x81\x7e\xb0\x5e\xb4\x4f\xf2\x8f\xdb\x48\x55\xb1\x8d\x9c\x48" - "\xbc\x4e\xcc\x41\x83\xa7\xc0\x6f\xaa\x39\x64\x6c\x93\x39\x24\xc2" - "\x44\xeb\x1c\x3a\x9e\xbe\x23\xee\x2b\x3d\xca\xb1\x3a\x0b\xed\x81" - "\x65\x56\x16\x72\x44\x25\xf8\xad\x0c\x68\x56\x28\xb3\x69\xdb\xe4" - "\xae\x88\x83\x39\x51\x1b\xdd\x97\xa2\x64\xf1\xa5\x44\xbf\x90\x62" - "\x7c\x2a\x1a\x93\xaa\x4d\x8b\xdf\xd9\x47\x60\x5c\xaa\x9d\x37\x48" - "\x30\xfc\xc2\xc4\x98\x43\x3b\x05\x5f\xf4\x39\x49\x92\x2d\x41\xb0" - "\x11\x04\xb3\xf8\x42\xdb\xa8\x5f\x6d\xca\x67\xd0\x87\x24\xda\x0b" - "\x96\x69\xc9\xae\x04\xc9\x5e\x60\x6f\xd3\x2a\x61\x0e\x58\x4d\xe7" - "\x80\x30\x7e\xd1\x98\x74\x36\xe0\x67\x5b\x46\x45\xe2\x5c\x0f\xf9" - "\x58\x5b\x96\xf2\xa0\x38\x57\x43\x8e\x61\xdf\x34\x38\x06\x7e\x33" - "\xe0\x3c\xe0\xc5\x5f\x35\xe2\x79\x7e\x73\x5d\x06\xda\xc9\xed\x7c" - "\xdc\x6f\xdb\x70\xaf\x24\x1f\xf7\x3b\xfb\x96\x21\xd1\xf6\x2d\x11" - "\x7a\x38\x37\x11\x7e\x8f\xda\x37\xd5\xad\x83\x5f\x36\xfc\xd6\xc3" - "\x2f\x17\x7e\x79\xf0\xcb\x87\x5f\x11\xfc\xf6\xc0\xaf\x18\x7e\x7b" - "\xe1\x57\x02\xbf\x83\x7c\x50\x5d\x01\xfa\x54\x84\xb2\xf5\x20\xf7" - "\x30\xb1\x5c\xa9\x7d\x7d\x1e\x84\xf7\x8d\x44\xfe\xc3\xe5\x6c\x67" - "\x3e\x05\x41\xe7\xf9\xb7\x7d\x93\x11\x77\xf9\x91\xfe\xd1\xe6\xe1" - "\x51\xb1\xe6\xe1\x93\xca\xcd\x41\x4f\x59\xcd\x41\xbf\x07\x19\xfe" - "\xde\xdf\xbc\x65\x1c\x01\xf9\x95\x9b\x43\xc6\xe5\xb6\x65\xf9\xe4" - "\x99\x14\xfd\xa9\xbf\x5b\xf8\x5f\x04\xff\xf7\x08\xff\xf7\x9a\x14" - "\xfd\xe8\x3a\x5b\x73\xc8\xf8\x68\x48\x1f\x31\x29\xfc\x69\xbe\xd6" - "\xd0\x71\x6a\x61\xcf\x65\x06\x9c\xaf\x31\xf9\x70\xd1\x2c\xdf\xa8" - "\x6a\xe7\xfe\xb2\xe8\x15\xdd\x9c\x45\x73\x93\xe7\x2c\x8b\x5f\xf0" - "\xca\xfc\x65\x8f\x68\x46\xce\xd3\x68\x17\x24\x2c\x9d\xb3\x74\xf9" - "\xfc\xe5\xf3\x29\x6d\x82\x53\xa3\xe5\xeb\xcd\x70\xdf\xa4\x6d\xbf" - "\xda\xcc\x01\xdf\xaf\x6a\x68\x22\x77\x02\xd7\x5f\xfd\x12\x51\x56" - "\x58\x0e\x12\xe0\xe5\x3a\xce\x2f\xf2\x77\x55\xf3\x4c\xe4\x48\xb3" - "\x59\x69\x03\x1e\x33\xd5\xac\x87\x7e\xa8\x8d\x1d\xd0\x30\x87\x3f" - "\xd2\x6c\x55\x4e\x6d\xd1\x93\xf4\x0b\xc0\x6b\xe6\x59\x49\xe7\x28" - "\x3f\xdd\x91\xe6\x12\xe0\xb4\xc0\x6f\x32\x3a\x48\x85\xd5\x06\xfa" - "\xfa\x0b\x13\xde\xcb\x03\xbf\xc1\xfc\x38\x97\x40\xdf\xae\xd0\x87" - "\xc2\x79\xe8\x4b\x98\xff\x28\x9c\x7f\x5a\xa7\x27\xd3\xa0\xac\xce" - "\xd0\x51\x26\x1e\xfa\x12\x7f\x63\x35\x5f\xd1\xa0\x27\x47\x17\x96" - "\x28\x3f\x84\xfb\xd1\x76\xc6\xff\x55\x65\xc6\xbe\xc7\x43\x9f\xc3" - "\x7b\xf0\x5a\xbd\xc2\x37\x15\xaf\xe3\xdc\xa0\x13\xea\x7b\x00\xca" - "\x4b\x5f\x4e\x54\x6c\x0e\xe5\xd2\xa7\x93\x02\xf9\x2b\x0a\xd5\x37" - "\xd8\xa7\x79\xa8\x2b\xbe\xc7\x3e\xb8\x77\xff\x42\x2b\xb3\x9f\x5e" - "\x47\xec\x30\x11\xc4\x0d\xc4\x0b\x43\x2a\x9b\x53\x95\x70\x46\x98" - "\x8b\xf9\xc0\xbd\xbe\x23\xf1\x1a\x70\x73\x0b\xfa\x60\x6b\xcb\xf2" - "\x8d\x15\x39\xf1\x9b\x82\xff\xb5\x3b\x6b\x41\x57\x66\x93\x7b\xe1" - "\x39\x23\xb1\x4d\xb1\xcd\xf0\xbb\x69\xa7\x9f\x4f\x03\xfa\x78\x28" - "\x18\x44\xfc\x3b\xb7\x4c\x2a\xdd\x81\x7e\x32\xb2\x7c\x1d\xf6\x7f" - "\x4b\xf0\xa4\x52\x67\x59\x32\x19\x6a\xe6\x2f\x9e\xfb\x72\xfc\xfc" - "\x79\xf4\x53\xdb\xdc\x65\xcb\x96\x2f\x9a\xaf\x99\x3f\xf7\x95\x38" - "\x0d\xbd\xac\x59\xbe\x0c\xb2\x2c\x48\x5c\xa6\x59\xb2\x62\xb1\x66" - "\xd1\xb2\x05\xc8\x98\xe7\x27\x24\x2c\xd7\x25\xf6\x27\xec\x4e\xcd" - "\xa2\xe5\xf1\x89\x0b\x74\xf0\x67\xd9\xfc\xc5\xf3\x34\x54\x13\x96" - "\x41\x51\xf1\xf1\x1a\xe1\x09\xcb\xe2\xe6\x26\xa0\x72\x2c\xfe\x13" - "\x64\x72\xba\x5f\xce\xa7\x03\xd0\xbf\x1d\xae\xbf\xba\xa2\xe8\xa7" - "\x28\x53\x01\x0e\xe5\x4d\x2a\xc5\x75\x0b\x90\x26\x74\x8e\x95\xe5" - "\x5b\x82\xf6\xe5\xb7\x06\x11\x55\x2b\xf4\x83\xb6\x2c\xbf\x54\xf1" - "\xdd\xa8\xbd\x19\x7d\x48\xa2\x7f\x52\x85\xdf\x65\xba\x1f\x18\xfa" - "\x04\x5d\xd7\x92\xe5\x7b\x9c\xda\xa1\xb2\xfc\xf6\x3a\xdb\xb8\xa8" - "\x4d\x55\xe1\x77\x02\xd7\xd1\x41\xbf\xa0\xfe\x1a\x04\x5f\xec\x0a" - "\xb8\xe7\x3b\xbc\x87\xdb\x12\x51\x0e\xf7\x35\x48\x5c\xdd\x0f\x63" - "\x06\xa8\x68\xbe\x2c\xbf\x81\x7c\xc8\x38\x02\xe7\x8a\xb0\x5e\x1e" - "\xc6\x15\xcd\x0d\x28\xf7\x33\x98\x8d\x3d\x10\x4c\xb4\x37\x36\x0f" - "\x4d\x6e\x1b\x34\x38\xb6\x23\x93\xf4\xeb\x80\xbe\x6d\x55\x92\x7b" - "\xdb\x41\x2f\x56\x3e\x48\x7c\x56\x4f\x23\xca\x12\xd0\x37\xf4\xd1" - "\x5f\x31\x25\x9f\x18\x40\xf2\x06\xeb\x5e\x52\xa1\xaf\x27\x95\xb6" - "\x77\x99\x7f\xff\x14\xe4\xda\xfe\xf3\xd1\x47\x5d\xfa\x6a\xde\x7e" - "\xe0\xb0\xd9\x77\x3f\xe8\xa3\x26\x81\xdc\x6b\xb0\x9d\xd7\x1b\x52" - "\xf7\x10\x43\xb2\x41\x8f\xfe\x41\xa0\xdd\x9e\x39\x0a\xd7\xee\xa8" - "\x80\xfb\x9e\x26\xfd\x20\x3d\x19\x9f\x91\xbd\x95\x37\xbe\x1e\xca" - "\xd7\xbe\xbe\x95\x37\xad\x0f\xe5\x1b\x40\xa7\x9a\x36\x84\xf2\x2d" - "\xb8\x2e\x00\xd7\x3f\xa0\x9e\xea\x92\x48\x58\xb3\xa2\x5f\x2d\x9d" - "\xfb\x47\xd1\xf4\x10\x48\xd3\x35\xb9\x86\xe4\xad\x98\x1e\x0a\x69" - "\x1b\x4b\x17\x62\xfa\xae\x66\x85\x7f\x00\x4b\x7f\x82\xe9\x61\x90" - "\x1e\xc6\xd2\x55\x84\xfa\xb9\x50\xf8\x8f\x61\xe9\xaf\x30\x0d\x6d" - "\xef\x3f\x51\x9f\x84\xf5\x3d\x07\x32\xf3\x7f\x32\xbd\x0e\xe6\x6c" - "\xc9\x97\x68\x7f\xf8\x28\x2d\x0e\x6d\x13\xd0\x1f\xfa\x55\xa2\xbe" - "\x03\x4e\xc5\xfb\x85\xe3\xb1\x9f\x2e\xd0\x4a\xfa\x01\x7f\xba\x13" - "\xae\x3d\x8a\x6d\xe7\xd6\x16\xb3\xdf\x7f\xd7\x74\x1b\xaf\xe7\xdf" - "\xf6\x8b\xe3\xb7\x68\x4d\xfc\xdb\xfd\x4a\x78\x3a\xb6\x85\x14\x95" - "\xa4\x58\xa9\x1f\x62\xe0\xac\xd0\x87\xfc\xa9\xbf\x11\x33\x70\x40" - "\x0f\x7e\x49\xd5\xfc\x96\x21\x26\x98\x5b\xc5\x4c\xd3\xda\x70\xbd" - "\xb3\xe2\x8a\xe2\x8e\x47\x4f\xc4\x21\x57\x18\xff\x07\x6e\x4f\xbf" - "\x12\x2e\x3d\x86\xf0\x23\xfc\xe2\xa6\xc5\xf1\x7a\x18\xb7\x14\xcc" - "\x96\xcd\x9f\xc7\x58\xe5\xf4\xb9\x23\xfd\xe2\xb8\x15\x71\x18\xa7" - "\x85\xe2\x4b\x1a\x8e\xe1\x49\x80\x07\xab\x62\x02\xed\x5b\xc6\x47" - "\x9f\x88\x6b\xf4\x2e\xe6\x87\xe2\x8e\x89\x1e\xd7\x3a\x41\x9d\xd0" - "\x57\xa7\x0d\x9e\x63\x83\x77\x45\xbe\xb0\x1f\x78\x01\xf0\x96\xb8" - "\x7d\x2f\x1b\x7d\xf9\x15\x31\x81\xf0\x4e\x0f\x1a\xb4\xd7\x49\x55" - "\x07\xf6\x95\x3b\x6c\x27\x92\x09\x99\x9c\x6c\xd3\x07\x9a\xa9\xff" - "\x64\xb5\x6e\x21\xb9\x87\x0f\x19\x62\x6a\x56\xf4\x9f\xfa\x74\x2a" - "\xbc\x03\xbc\xfb\xd1\x7a\xa3\x8a\x83\xf7\x18\x6f\x13\xd6\xd2\x2a" - "\xfa\x87\x43\xdb\xc6\x88\x5c\xdf\xcb\xfa\x53\xbd\xe1\x96\xc5\x10" - "\xdc\xd7\x7c\x20\x0d\xea\xd7\x19\x13\xc8\xc1\x98\x84\xd7\x4e\x68" - "\x2f\x13\x7c\xa6\xd0\xd6\xcc\xd7\xee\x08\x68\x67\x78\x3e\xfa\x6d" - "\x16\xdb\x15\xc6\xb5\x70\x7b\x67\x9c\x7b\xf9\x6f\x1d\xaf\x81\xfa" - "\x45\xf3\x9b\xea\x74\x6e\xaf\x6f\xae\x9b\xce\xf4\xc3\x37\x1b\x7e" - "\xf9\xfc\xee\x49\xd5\xe6\x91\xbe\xc5\x34\xbe\xde\xd6\x51\xd1\x4e" - "\x71\xd4\x41\x47\xfa\x57\x62\x1c\x75\xf7\xbe\x05\x97\xc6\xd1\xf8" - "\x45\xbe\xe7\xf9\x40\x3b\xc6\x16\xbd\x8e\x3e\xc0\xe3\x4e\x68\x2d" - "\x5e\xca\xf4\x4e\xb5\x27\x99\x62\xf9\x30\xcf\xee\xf4\xb2\xbc\x58" - "\x8f\x3a\xb2\x07\xda\x45\x5d\xa7\xeb\xe0\xa3\x14\x8c\x8f\x07\xd8" - "\xb1\xad\x3a\x81\x4b\xa7\x9c\x26\xca\x0e\x18\x37\xdf\x7b\xae\x48" - "\x39\x06\xfa\x1d\x70\x95\x8c\x0a\x63\x05\x99\x3e\x8f\xa4\x57\xb6" - "\x5c\x43\xdf\xe9\x34\x2e\x11\xcc\xd9\x34\x7b\x9f\x33\x2b\x31\x26" - "\x08\xc6\x21\xaa\xb2\x58\x71\x1e\xae\x3e\xf0\x9c\x55\x69\x5f\x11" - "\xa3\xc1\xd8\x11\xf8\x7d\x37\xad\x85\xe7\xe8\xf7\xa5\x56\xe0\x81" - "\xad\x30\x47\xcd\x55\x8f\xa9\x88\x2d\xa7\xf1\x52\xd1\xaf\x51\x65" - "\xdc\x75\xf2\xd9\xba\xa3\xa4\xc2\x68\xc4\x7d\xd1\xbb\x2b\x1a\x8e" - "\x10\xae\x55\x3b\xd0\xbe\x4c\x3b\xa8\x20\x81\x04\x43\x3f\xbd\x83" - "\x83\x36\xe6\x97\x09\x71\x28\xaf\x49\x71\x28\x31\xce\x7b\x01\xc6" - "\x94\xbc\xac\x26\x36\xbf\xfe\x16\xc8\xaf\xc2\x98\x93\x3b\xaf\x11" - "\xed\x8e\x04\x32\x62\x07\x5c\x93\x7d\x5b\xfa\xb3\x16\x6d\xf9\xfe" - "\x03\xaf\xb3\x98\xf3\x1c\xc8\x49\x8c\x39\xf9\xf4\x75\x0d\x39\xf2" - "\x55\x91\x12\x75\xcf\xbb\x76\x0e\xa0\xfe\x88\x6c\xa1\xe3\x35\xb6" - "\xa0\x3a\x9d\x6d\xa4\x1f\xe8\xf0\x9d\x7a\x90\x97\xdb\xf9\x88\xd8" - "\xf6\x9d\xe9\x62\xdb\x0f\x7c\x4d\x6c\xfb\x55\xcf\xc3\x5c\xfe\xaf" - "\xfd\xc2\xdf\x3d\x9b\x2f\xb5\x7d\x4d\xd7\xb6\x77\x6d\xf3\xfd\x2f" - "\x58\x95\x54\x1e\x2f\x00\x07\xfa\xab\xaf\xfe\xdd\x17\x98\x0c\x78" - "\x2a\x83\x58\x49\x06\x9d\x20\x83\x4e\x49\x06\x69\x4b\x45\x19\x34" - "\x32\x19\xd4\x50\x19\xcc\xa5\x32\x80\xb9\xb5\x7d\x95\x76\xd0\xf6" - "\x14\x12\x5c\x90\x42\xc2\xa8\x1c\xd4\x4b\x31\x36\x4c\xff\x0d\x29" - "\x04\xd7\xf3\x86\x43\x5f\x14\xe5\x10\x2c\x93\x43\x8a\x20\x87\x0e" - "\xa2\xdd\xde\x41\x46\x6c\xcf\x64\x72\x40\x5c\x7f\xda\x12\xc8\x73" - "\xdf\x6a\x49\x61\x33\xc8\x61\xa9\x20\x87\x20\x41\x0e\xab\x40\x0e" - "\x4b\x41\x0e\xf0\xfe\x27\xb4\xde\x62\xe2\xc0\xe8\xae\x72\x18\x30" - "\xb1\x27\x39\x74\x38\xe4\xa0\x1e\x4e\xe5\x00\x5c\x2a\xe5\x19\xb4" - "\x4f\xf5\x0b\x7f\xe7\x8b\x5c\xe5\x98\x18\xc0\x1e\x68\xd3\x8a\xa9" - "\x65\x64\x7a\x2c\x49\xb7\x81\x4c\xde\xfd\xc2\xaa\xac\x68\x00\x79" - "\xcc\x13\xe2\x15\x39\xc9\x83\xb6\xfb\xd6\xb1\x9a\xf7\x20\x8f\xe6" - "\x39\xec\x27\xe3\xd4\xfb\xbe\x00\xee\xe8\x26\x7e\x97\xf3\x77\x57" - "\x28\x8b\xc3\xd8\xcd\xb8\x56\x0d\xe6\x4e\x03\xb7\xc3\xdc\xa8\x32" - "\xae\x8e\x88\xdf\x5f\x3f\xab\xd5\x43\xd9\xda\x41\x9f\xa9\xfe\x9b" - "\x9c\xaa\x28\x27\x81\x30\xf7\xde\xc1\x91\xe0\x53\x35\x07\x91\x17" - "\xa8\x41\xc7\xef\xb0\x83\x7c\xec\x6d\x61\xfd\xd7\xc3\xfc\x09\xbf" - "\xcb\x3a\x7f\x8f\xc5\xb8\xab\x3c\xc8\x06\xce\xab\x6c\x20\x9b\x82" - "\x1b\x44\xbb\xed\x06\x19\xb1\x4d\x90\x8d\x23\x1e\xeb\x45\x2d\xd9" - "\x59\x4f\xfc\x07\x2c\x60\xb2\xb1\x8b\xb2\x59\xa1\x55\x4e\x5b\xa0" - "\x21\x87\xa1\x4d\x4e\x68\x4f\x7b\x29\x9b\x40\xca\x1b\x60\x5e\xa9" - "\x81\xf9\x8f\x8e\xa7\xb2\x19\x58\xe6\x49\x36\xf6\x3d\xbe\xd9\x76" - "\xf5\x60\xf4\xe7\x7b\x2f\xb7\x64\x86\x82\x83\xb9\x52\x07\xcc\x49" - "\x3f\x33\xdb\x48\x2a\xcc\x1b\x52\xea\x88\x9f\x61\xc6\x17\xc4\x60" - "\x2a\xa5\xfe\xaf\xd1\xd6\x8b\x31\x28\x0c\xb6\x52\x68\xef\x87\x23" - "\x31\xbd\x93\xa6\xcd\x64\xd5\x4b\xc4\x87\xc6\xf7\x8b\x29\x22\xeb" - "\x81\x57\xef\x7b\xa1\x48\xc9\xe5\x0d\x8d\xe0\x03\x60\x9e\x9a\x49" - "\xf4\x55\x3a\x1b\x62\x51\x40\x65\x5c\x05\xfa\xa3\x3c\x9f\x9e\xcc" - "\x5f\xa8\xb2\x40\x99\x66\xbe\xc3\x0e\x63\x43\x61\x26\x5f\x8a\xf1" - "\x04\xc6\x27\x53\xce\x8d\x7a\x62\x47\xce\x81\x36\x2f\x7d\xda\x76" - "\xe0\x58\x41\x74\x0f\x04\x9c\x53\x54\x2e\xb4\xc0\xf5\xe0\xa5\x58" - "\x2f\x66\x7f\x66\xc7\xf1\x18\x07\x2d\xf4\xe1\xb5\x1f\xa6\x99\x55" - "\xb9\x30\xd7\x05\x2e\x06\xf9\x82\xa6\xf1\x6c\x1e\x58\x6a\xa8\xb1" - "\x52\xdb\xa3\x39\x3d\xce\x2f\x37\x05\xd7\x5b\x61\x6c\x02\x1c\x9b" - "\x83\x87\xe3\x1a\x0d\x7e\x0f\x8c\x4b\xa1\xa3\xa2\x4b\x5e\x36\x2b" - "\xa5\xf1\x37\x28\x19\xc6\xad\xe2\xc9\x5a\x3e\x1d\x63\x38\x1c\x85" - "\xf7\xc2\xf9\xcf\xbb\xf5\x56\xa5\x15\x30\xe4\xbd\x97\xb3\x95\x68" - "\x1b\xb1\x82\xfe\x55\x7c\xf5\x9f\x34\xe6\xe2\x25\xc5\xa0\xd7\x4f" - "\xc5\xd8\x08\x3e\x7f\xe6\x68\xa2\x82\x32\x8e\xb4\x2b\xf3\xad\xed" - "\x7e\x77\x46\xa7\x37\x48\xf1\xe6\x9c\xe3\xca\xa1\x2e\xef\x7b\x19" - "\xca\x84\x72\xf6\xd7\x67\x28\x79\x11\xd7\xaf\xa3\x0d\x5b\x8e\x29" - "\x95\x2d\x97\x49\x1a\xe8\x71\x65\x5c\x11\x8d\xb3\x31\x10\xf0\x9c" - "\x5b\x05\x38\xd2\x09\x73\x7d\xc0\x11\xec\xff\x85\x80\x1b\xdc\x2a" - "\x98\xe3\x77\xc0\x1c\x5f\xc0\x0f\xe4\x58\x78\x7c\x09\x74\x34\xb0" - "\x1c\xce\x81\x9c\xb8\x4d\xa0\xa3\x80\x1f\x3b\x52\x18\x8e\xef\x44" - "\xfc\x00\xfe\xfb\xb4\x0e\xf0\x63\x05\xe0\x47\x12\x8d\x07\x1a\x56" - "\xa8\x64\xb8\x71\xb8\x3e\x5b\x99\x2b\xc6\x2e\xa6\xed\xfb\xb3\xbb" - "\xab\x50\x3f\x62\x33\xb0\xae\x4a\x3b\xc6\xc2\x58\x15\xe3\x53\x65" - "\x01\x1d\xd9\xfa\x70\x38\x9e\xa3\xf8\xb9\x22\xae\x3f\xc7\x74\x2d" - "\x12\xdb\x64\xd7\x15\x12\x4e\x63\xe3\x5d\x0d\xeb\xbf\x71\x31\x19" - "\x53\x78\x85\x8c\x28\x5c\x4c\xb4\xd0\x5f\x95\x85\x50\x87\xd9\x4b" - "\xd5\x84\xc6\xb3\xf0\xbb\x33\x06\xce\xbb\x8d\x67\x01\xfc\x39\xac" - "\x10\xfb\xcc\x12\xad\xa3\x4e\xb6\xdc\x69\xc4\x0e\x6d\x47\x7d\xb5" - "\x29\x7e\xb6\x9c\xad\xa1\x56\x16\x31\x3e\xff\x33\xc1\xcf\x78\xbf" - "\x3d\x30\x27\xe9\xd7\xac\xf8\xd9\x4b\xfc\xe6\xc0\x7c\x5d\x0a\x51" - "\x34\x8b\xd7\x80\x63\x72\x20\xab\x71\x19\x24\x83\x0b\x5a\x91\x6d" - "\x48\xbe\x8c\x3e\xe3\xbd\xec\x87\x3f\xa3\xdf\x29\xec\xb9\xd3\x54" - "\x74\xed\xcf\xe6\x69\x01\xbb\x9a\x49\x38\xff\x67\x90\xc7\x42\x78" - "\xd7\x66\x32\xa2\xa0\x19\xde\x75\x05\x7b\x57\x31\x56\x33\x97\xb9" - "\x0d\xf1\xda\xbd\xdd\x45\x8c\xfb\xf7\x67\xad\x12\x6d\x42\x80\x61" - "\x3f\xe3\xef\xc3\x75\xc5\xd4\x17\x4f\x9b\xc1\x56\x47\xf0\xb9\x68" - "\x17\x32\x5c\xa3\x3a\xfd\x0c\xea\x32\x57\x34\xa9\x7a\x4e\x2d\xe8" - "\x76\x5b\x1c\xe1\xe1\xff\xd1\x7a\x33\xfa\xbe\xa1\xdc\xce\xa4\x08" - "\xca\x40\x3e\xf6\x11\x9c\x43\xdd\x77\xd2\xf9\x0c\xd4\x79\xbc\x4e" - "\xf5\x1e\xee\x33\xd4\x36\x12\x2c\xcf\xb9\x1c\x94\xbf\x58\xd6\x25" - "\x45\xc8\x43\x58\x16\xea\x02\xda\x73\xb0\xaf\x31\xd9\x97\xe2\x1a" - "\xf2\x30\x3e\xf4\x2e\x3d\x4b\x9b\xd1\xb6\xa4\x46\x1d\xa0\xba\x02" - "\xe3\x2a\xfa\x4a\xe6\xf9\x18\x1f\xd0\x33\xac\x67\x7f\x90\x77\xb8" - "\xa8\x17\x70\x2e\xd8\x55\x37\x06\xae\x51\xe3\xdc\x25\x18\xff\xf7" - "\x56\x3f\xbc\x93\x5f\xc8\x04\x8f\xeb\xdb\x46\x00\x8f\x05\xbc\x44" - "\xdc\xb4\xb7\x3a\x61\x66\x0b\xc3\x4c\xc4\x24\x11\x37\x29\x36\x51" - "\xbf\xff\xa5\xb8\xfe\x34\x8e\xd6\xd1\x4b\xdc\xac\x6c\x91\x70\xf3" - "\x69\x9d\x13\x6e\xb6\xf0\x1d\xdc\x48\x77\xb8\x19\xfa\x90\x1c\x37" - "\x43\x1f\x96\xe3\xe6\x90\x9d\xae\xb8\xd9\x15\x33\x43\x57\xba\xc3" - "\x4b\x98\xaf\xdc\xdb\xac\x18\x32\xd5\x33\x56\x86\xee\xf1\x1e\x2b" - "\x07\x7f\x20\xc7\xca\xd0\xa6\xff\xbd\x58\x19\xf6\xa4\x0c\x2b\xd5" - "\xbd\xc4\xca\x66\x8a\x95\xc1\xfc\xb7\xd0\x27\x04\xfc\x28\x5c\xe8" - "\x01\x2b\x17\xf6\xd0\x17\xfe\xec\x09\x2b\xc3\x76\xcb\xb1\x32\xac" - "\x46\x8e\x95\x61\xaf\x4b\x58\x29\x5c\xbb\x29\x58\x19\x56\x74\x7b" - "\xb0\x32\x8c\xc6\x39\x30\x5c\x41\xac\x1c\xb2\xba\x67\xac\x0c\xdd" - "\xeb\x1e\x2b\xe1\x3c\xc5\xca\xd0\xbd\x12\x56\xd6\xf5\x80\x95\x43" - "\xe7\x7a\x81\x95\xc1\x14\x2b\xd5\x1e\xb0\x72\x21\xb4\x95\xa0\x17" - "\x54\xf7\x5c\x74\x43\xc0\xca\x30\x07\x56\xf6\x42\x3f\xbc\x93\xdf" - "\x50\x8f\xf3\x5f\xc4\x4a\x2e\x97\xf1\x4b\xc4\x4a\x7e\x90\x80\x95" - "\xf1\x36\x92\x72\x06\x30\xb2\xa6\x99\xc6\x37\xa1\xeb\x76\xe1\x97" - "\xfa\x3c\x62\xd1\x2f\x62\xf7\x43\x7b\x19\x4c\x25\x14\x9b\xe8\xfa" - "\xd3\xa9\x88\x55\x25\x90\x37\xdf\xc1\x3b\x29\x76\x9e\x11\xb0\x73" - "\x96\x80\x9d\xb3\xbf\x07\x76\xbe\x80\xb2\xbc\x6b\x69\xbb\x52\xc4" - "\xce\xcd\x80\x9d\x77\x51\xfe\x80\xdf\x32\x19\x76\xde\x73\x59\xac" - "\x17\xda\x2e\x0d\x89\xdb\x09\xab\xd7\xb5\xae\x38\xfa\x14\x2d\xef" - "\x84\x7e\x61\x0b\x71\x60\xe9\x2c\x09\x4b\xa1\xac\x9d\x9e\x71\xf4" - "\xae\x16\x07\x8e\x66\x02\x8e\x9e\x73\xc2\x51\xb4\x19\x20\xe6\x01" - "\x8e\xb6\x51\x1c\x3d\x2c\xe0\xe8\x30\xfb\xa9\x59\x80\xa3\x4f\x89" - "\x38\x3a\x2c\xdc\x9a\x99\x6f\xb5\x66\xf5\x8c\xa3\x6d\x14\x47\x75" - "\xb7\x1e\x47\xcb\x5c\x70\x14\xe6\xac\x18\xeb\xd8\x2d\x8e\x8a\xfa" - "\x48\x71\x34\x43\xc2\x51\xda\xae\x77\x6f\xab\x8a\x85\x76\x8f\xd5" - "\xd1\x79\x9b\x03\x47\x75\x25\x0c\x47\xe1\x1c\xfd\xc6\xbf\x0c\x70" - "\x14\xf4\x2f\xbd\x12\x7d\xfa\x91\x48\xa8\xa3\x1a\xf1\x75\x17\xf4" - "\x19\x6c\x23\x07\x9e\x2e\x84\x3e\x83\x18\xd3\x0a\x7d\x06\x70\x74" - "\xf6\x75\x35\xa1\xfd\x25\x0b\xfa\x4b\xb3\x87\x58\x6a\xe2\xba\x59" - "\x8f\x78\x7a\xf7\x77\x72\x3c\xbd\x67\x84\x1c\x4f\xef\x3e\x23\xe1" - "\xa9\x70\x0d\xf1\x14\x64\x06\xed\x93\x8d\x98\xda\x37\x3c\xbd\xdb" - "\xec\xc0\x53\xa5\x80\xa7\x0b\x7b\xc6\x53\xfa\xcd\xcf\x03\x9e\x3a" - "\x63\x83\x67\x3c\xbd\xdb\x2c\xe1\xe9\x3d\x95\x0e\x3c\x35\x7a\xc2" - "\xd3\xbb\x2c\xee\xf1\x14\xce\x53\x3c\xbd\xcb\xe2\xc0\x53\xa3\x1b" - "\x3c\x7d\xca\x19\x4f\xef\xfd\x90\xe1\x69\x09\xc5\x51\xc4\xd4\x2a" - "\x0b\xe8\x07\xf6\xb9\xc4\x7c\x8a\xa9\x1c\x60\x2a\x60\x81\x12\x63" - "\x2b\xe1\xba\x77\x77\x98\xca\x30\xd7\x44\x10\x57\xb1\x6f\xa6\x4f" - "\x83\xf9\x2e\x8c\x45\xd0\x26\x74\xec\x15\xdb\x6f\x97\x13\xbe\xce" - "\x59\xa9\x46\x6e\x27\xd3\x15\x4e\xd4\x95\x56\x2d\xae\x95\x95\xe9" - "\x8a\x77\xb2\xbc\xf7\x88\x27\x6c\xf5\x34\x77\x3f\x85\x73\xf7\x99" - "\x44\xb9\x6a\x26\xe0\x6b\x0c\xce\xdd\x8b\x5d\xe6\xee\xc5\x5d\xe7" - "\xee\xa7\xbb\xc7\x51\xaf\xe6\xee\xcf\xa1\x0c\x35\x87\xe4\x38\xaa" - "\xf9\x50\x8e\xa3\x23\x1e\xc6\x7a\x31\x1c\x2f\x76\x3f\x77\xa7\xfd" - "\x7c\xf8\x1d\x8e\xb9\xbb\x51\x8e\x9f\xd2\xdc\xfd\xe7\xdf\x78\xc6" - "\xd1\xe1\x13\x64\x7c\x74\xb6\x80\xa3\x2f\x0b\x38\xfa\xb2\x84\xa3" - "\x9f\x7d\x21\xf2\xd1\xfb\x9e\x39\x69\x74\xc6\xd1\xe1\xc9\x0e\x1c" - "\xad\xed\x8a\xa3\x22\x86\xd2\xd8\xf0\x50\x0e\xda\xb0\xf6\x02\x4e" - "\x1f\x78\x59\x47\x6d\x51\x68\x17\x44\x1b\xac\xc3\x06\xd5\x26\xe2" - "\xe9\x75\x92\x36\x0b\xf1\x34\x9f\xe2\x69\x20\xae\xc3\x58\x01\x78" - "\x2a\xc4\x8e\xdf\x99\x44\xc2\xb0\x2f\xa2\x7d\x89\x5b\xc1\x62\x3d" - "\x8a\x76\x26\x78\x5f\xfa\x9d\xfe\xa5\x3a\x01\x53\x31\x06\x76\x10" - "\x8d\x1f\xaf\xdd\x91\xe4\x86\x9b\xae\x02\x4c\x4d\x71\xe2\xa6\xd0" - "\xf7\x0f\xbf\xec\x8a\xa9\xf7\x35\x56\xa1\xae\x20\xa6\xca\xe6\xf1" - "\xc5\x3f\x82\x79\xfc\xcf\x1f\x95\x63\xe9\xcf\x75\x72\x2c\xfd\xf9" - "\x48\x09\x4b\x85\x6b\x37\x85\x9b\xfe\x7c\xe2\xed\xe1\xa6\x3f\x9f" - "\x28\xcd\xe3\x47\x0c\x71\x60\x69\x8d\x27\x2c\x1d\x3e\xd1\x3d\x96" - "\xc2\x79\x8a\xa5\xc3\x27\x3a\xb0\xb4\xc6\xcd\x3c\x5e\x86\xa5\x23" - "\xec\x0c\x4b\x8b\x19\x37\x35\x8a\xdc\xb4\xf8\x27\x38\x8f\x1f\x61" - "\xf3\x76\x1e\x7f\xaa\x85\xe1\x27\xe2\x93\x88\xa1\xd2\x3c\xbe\xd8" - "\xf3\x3c\xbe\x07\x0c\xf5\x8a\x8b\x52\x0c\x1d\x69\x97\x63\xe8\x28" - "\x85\x1c\x43\x47\x2f\x75\xc5\xd0\xae\xf8\x39\xea\x31\x77\xd8\xc9" - "\xe6\xf1\xa3\x35\x9e\x71\x73\x54\xbc\xf7\xb8\xf9\x8b\xd7\xe5\xb8" - "\x39\xaa\xe4\xff\x06\x6e\x6a\xef\x96\xe1\xa6\xba\x97\xb8\xf9\x83" - "\xcc\xe9\xb5\x2e\xf6\x4f\xad\x8b\xfd\x53\xeb\x64\xff\xd4\xde\x44" - "\xfb\xa7\xf6\x36\xd9\x3f\xb5\x89\x12\x07\x1d\xfd\x4c\xcf\xb8\x39" - "\x2a\xd1\x3d\x6e\xc2\x79\x8a\x9b\xa3\x12\x25\xdc\xec\x89\x83\xde" - "\xff\x90\x17\xb8\xf9\x23\x9f\xd3\xdf\xdf\xad\xfd\xd3\xdd\x9c\x1e" - "\x71\x93\xe2\xa5\xd1\x65\x4e\x3f\xd3\x79\x4e\x5f\x2c\xcd\xe9\xa7" - "\x30\xdc\x32\xd8\x72\xe5\x73\xfa\x9b\x8e\xa3\x0f\x4c\xb6\x3a\xec" - "\xa1\x6f\x00\x8e\x3e\x40\x63\x93\x59\x1d\xf6\xd0\x71\x95\x62\xbd" - "\xd8\x9c\x7e\x33\x61\xf5\x72\x33\xa7\xa7\xeb\x65\x1f\xd8\xe6\x98" - "\xd3\x1b\x5d\xe7\xf4\xe3\x56\x7b\xc6\xd4\x07\xf4\x6e\xe7\xf4\x38" - "\xff\xa6\x98\xaa\xa3\x98\x7a\x63\xab\x33\xa6\x8e\xa9\xa3\x98\xfa" - "\x84\x88\xa9\x63\x54\x56\xe8\x9b\x56\xbf\x9e\x31\x15\xcb\x91\x30" - "\x35\xee\x87\xc1\x54\x7d\xef\x31\xd5\x79\xdf\xe9\x61\x78\x77\x07" - "\xa6\xd2\x36\x1e\xbb\xb2\x2a\x16\x31\x35\xce\x65\x7e\x5f\xec\x7e" - "\x7e\x7f\x92\x28\xb1\x7d\xc4\xf9\x3d\xca\x80\xe2\xcd\x2d\x9d\xdf" - "\x8f\xfd\x5c\x8e\xad\xe3\x54\x72\x6c\x1d\x7b\x48\xc2\x56\xe1\xda" - "\x4d\x99\xdf\x8f\xad\xbe\x3d\xf3\xfb\xb1\xd5\x12\xb6\x8e\xdb\xd7" - "\x33\xb6\x3e\x50\xee\x1e\x5b\xe1\x3c\xc5\xd6\x07\xca\xbb\xc5\xd6" - "\x27\x9c\xb1\x75\xfc\x4e\x11\x5b\xa5\xf9\x3d\xe8\x07\xf6\xbf\xc4" - "\xdc\xbe\xcf\xef\x9f\xbc\xdd\xf3\xfb\xf1\x1e\xfd\xbf\xba\x9d\xdf" - "\x6f\x05\x9c\x85\xb9\xf8\xaa\xcf\x61\x7e\xff\x8c\x30\xbf\xaf\x2d" - "\x72\x99\xdf\x17\x75\x99\xdf\xa7\x3e\x23\x60\x2a\xf4\x29\x8a\xa9" - "\x2f\x17\xf7\x7d\x7e\xff\x2c\xca\x30\x7c\x9b\x1c\x53\xc3\x77\xca" - "\x31\x75\xc2\x58\xac\x17\xc3\xf4\x22\xf7\xf3\x7b\xda\xcf\xc3\xbf" - "\x91\xcd\xef\xa1\x7e\x5d\xe7\xf7\xbf\xaa\x93\x61\xea\x6c\x67\x4c" - "\x7d\x30\x58\xc6\x53\xe1\xbd\x10\x53\xdf\x39\xc7\x30\xf5\xdd\x73" - "\x4e\x98\xfa\xf4\xbb\x02\xa6\xfe\x72\xf2\xc9\x19\xce\x98\xfa\x60" - "\x8c\x88\xa9\x14\x2f\x67\x5b\x95\xe9\x31\x9e\xd7\x9b\xec\x85\xb2" - "\x71\x7f\x14\x96\xb9\xef\x5c\x5c\xcf\xeb\x4d\x62\xe4\xeb\x4d\x1c" - "\x6b\x4d\x12\x4d\xa4\xa2\x21\x97\xae\x35\x29\x48\x22\xc1\x81\x6b" - "\xc8\xf0\x82\x0e\xb6\xe7\x9f\xc6\xe1\xb8\xe1\x7e\xbf\xff\x4b\xcf" - "\x4b\x38\x8b\x7b\xfe\x01\x63\xb5\xdb\x6f\xb0\xb5\x3f\x20\xef\xae" - "\xfb\xfb\x45\xde\x04\x78\x70\xe8\x9c\x2b\xce\xfe\xf2\x4c\x15\xea" - "\xcf\xac\x38\x97\x39\x7f\xd1\x8f\x60\xce\xff\xab\x07\xe5\xf8\xfa" - "\xab\x79\x72\x7c\xfd\xd5\x10\x09\x5f\x85\x6b\x37\x85\xbb\xfe\x2a" - "\xfc\xf6\x70\xd7\x5f\x85\x4b\x73\xfe\x09\x03\x1c\xf8\x5a\xed\x84" - "\xaf\xe7\x9c\xf1\xf5\xc1\x61\x14\x5f\xcf\xb9\xe2\x2b\x9c\xa7\xf8" - "\xfa\xe0\x30\x07\xbe\x56\xbb\xcc\xf9\xcf\xb9\xe2\xeb\x84\xef\x28" - "\xbe\x82\x2e\xc8\xb9\x6b\x51\xcf\x73\xfe\xda\x1f\xdb\x9c\x7f\x82" - "\xd9\xab\x39\x3f\x62\x6a\x3c\xc3\x54\xc4\x2c\x11\x57\xa5\x39\x7f" - "\x91\xc7\x39\x7f\x4f\xb8\xea\x15\x57\xa5\xb8\xfa\xd0\x77\x72\x5c" - "\x7d\xe8\xba\x1c\x57\x1f\x5e\xe9\x8a\xab\x5d\x31\xf5\xd7\x0f\xb9" - "\xc3\x53\x36\xe7\x7f\x58\xeb\x19\x4b\x7f\x1d\xeb\x3d\x96\xfe\xbf" - "\x4d\x72\x2c\xfd\xf5\x9e\xff\xbb\x58\x1a\x31\x52\x86\xa5\xea\x5e" - "\x62\xe9\x0f\x62\x07\x88\x58\x2d\xc7\xd2\x88\x12\x39\x96\x46\xcc" - "\x97\xb0\x54\xb8\x76\x53\xb0\x34\x22\xf5\xf6\x60\x69\x44\xaa\xc4" - "\x55\x1f\x7e\xbe\x67\x2c\xfd\x75\x9c\x7b\x2c\x85\xf3\x14\x4b\x7f" - "\x1d\x27\x61\x69\x5d\x0f\x58\xfa\xc8\xa3\x5e\x60\xa9\xdc\x0e\xe0" - "\x8a\xa5\xb7\xdd\x0e\xf0\x88\xc7\xfd\x0f\x6e\xed\x00\x22\x96\x3e" - "\xd3\xd5\x0e\x80\xf8\x4a\xed\x00\xd0\x5e\x22\x86\x51\x3b\x40\x14" - "\xc3\x32\x83\x2d\x5b\x66\x07\xb8\xf9\xd8\xfa\x9b\x69\x56\x87\x3d" - "\x35\x13\xb0\xf5\x37\xcf\x50\x6c\x75\xd8\x53\x7f\xfb\x8d\x58\x2f" - "\x66\x07\x78\x83\xb0\x7a\xb9\xb1\x03\x3c\x4e\xcb\xdb\x2d\xb3\x03" - "\x38\x61\x2d\x94\xb5\xcd\x33\xce\xfe\xa6\x5c\x66\x07\xa8\x97\x70" - "\xf6\x06\xae\x49\x07\x1c\xa4\x38\x1b\xea\x8c\xb3\x13\xdb\x29\xce" - "\x3e\x2e\xe2\xec\xc4\x80\x36\xe8\x9b\x6d\xde\xe2\x2c\xae\x91\x3e" - "\x17\x7b\x7b\x70\xb6\xd4\x0b\x9c\x75\xb2\x0d\x1c\x82\xf6\x70\xe0" - "\x2c\x6d\xf7\x47\xb7\x54\xcd\x42\x9c\x8d\x75\xb1\x0d\x14\xb9\xb7" - "\x0d\x9c\xb8\x1d\xb6\x81\x47\x2f\xcb\xf1\xf6\xb7\x1a\x39\xde\x3e" - "\x7a\x5a\xc2\x5b\xe1\xda\x4d\xb1\x0d\x3c\xda\x72\x7b\x6c\x03\x8f" - "\xb6\x48\x78\xfb\xdb\x93\x3d\xe3\xed\x6f\xaa\xdd\xe3\x2d\x9c\xa7" - "\x78\xfb\x9b\xea\x6e\xf1\xf6\x71\x67\xbc\xfd\xdd\x21\x11\x6f\x25" - "\xdb\x40\x91\x60\x1b\xc8\xee\xd9\x36\x50\xeb\xc1\x36\x30\xf9\x76" - "\xdb\x06\x7e\xd7\xc5\x27\x61\x77\xb6\x81\xf6\xad\x6c\xdd\xfe\x2a" - "\x5c\xb7\xff\x12\xe0\x6f\xf4\x17\xd0\x06\x3d\xaf\xdb\x4f\x15\xd7" - "\x9f\xc6\xe6\x0b\x38\x9b\xef\xd6\x36\x70\xaa\xc9\xb3\x6d\xe0\x54" - "\x8d\xf3\xfa\xd3\xc8\x0f\xe4\xdf\xad\x22\x0f\x89\xdf\xad\x4e\x7d" - "\x85\x38\x1b\x75\x0c\xd3\x5c\xde\xb8\x5c\x8a\xff\x8a\x28\x3d\xd6" - "\xd3\xdd\x3a\xfe\xc3\x9c\xf3\xb7\xac\xc7\x42\x1c\xb6\x82\x6a\xc4" - "\xdb\x7c\xc2\xf1\x71\x7e\xe8\x17\x9c\xda\x0a\x9e\x43\xdd\x8b\x5a" - "\xea\x8c\xbb\x47\xcf\x3a\xe3\xee\x63\x91\x22\xee\xda\x01\x77\x3f" - "\xac\xcf\x67\xf6\xd7\x17\xd8\xda\xd4\xbd\x2f\x38\xad\x4d\xfd\xe2" - "\x63\x01\x77\x1f\x7f\xf4\xa4\x09\xde\xbf\xbb\xf5\x53\x70\xff\xfe" - "\xb3\xbd\x5d\x83\x9a\xef\x76\xed\x94\x80\x4f\x6e\xd7\x4f\x41\x5d" - "\xd5\x3b\x85\xbe\x6a\x87\x7e\xba\xd3\x69\xfd\x54\x41\x0a\xf4\x67" - "\x61\xef\x55\xb7\xeb\x50\x5f\x90\xd6\xa1\xf2\x79\x63\x2b\x70\x7c" - "\xe3\xb6\x8c\xcb\xed\xe0\xe3\x7c\xf8\xe0\xb1\x15\xf8\xfc\xce\x4e" - "\x18\x77\x26\xc5\xf8\xb0\x79\xdd\xd8\x12\xc0\x9e\x81\xac\xdd\x1f" - "\x4f\xb6\xc3\x58\x63\x87\xb1\x86\xcb\x1b\x5b\x62\x43\x6e\xb2\x75" - "\xec\xc1\x02\x98\xe7\xd9\x32\x69\x5c\xd5\xfe\x39\x30\xd7\xdb\x85" - "\xf3\xbc\x2b\xd0\x37\xd2\xb5\x4a\xac\x8f\x88\xa3\x81\x4d\xf0\x1e" - "\x57\xba\xe7\x72\xb6\xab\x12\x8e\xea\x9f\x3a\x05\xcf\x9c\xb4\xa8" - "\x0a\x75\x37\x46\xda\x53\x40\x39\xb3\x87\xb5\xb2\x58\x17\xe6\x2b" - "\x11\x74\xe1\x26\xd8\x24\x9c\xeb\x23\xc7\xf5\x49\x27\xe4\xb8\x3e" - "\xc9\x2a\xc7\xf5\x49\xfb\x24\x5c\x17\xae\x01\xae\xdb\x33\x19\x8f" - "\x86\xb1\xaf\x8f\x3c\x7a\x52\x99\x88\xeb\x9c\x80\xeb\x85\xbd\xc0" - "\xf5\x6e\x79\xb4\x13\x2e\x79\xc6\xf5\x49\x65\x92\x4d\x22\x6a\xb7" - "\xdb\x35\xb2\x67\x9d\x71\xfd\xb1\x29\x14\xd7\xcf\xba\xe2\x3a\x9c" - "\xa7\xb8\xfe\xd8\x14\x8f\xfb\x09\xce\xba\x7e\x4f\x9b\xfc\x1a\xc5" - "\x75\xa3\xb0\x46\xb6\xda\x8b\xfd\x04\x46\x86\xe9\x22\x96\xa3\xbd" - "\xea\xf6\xda\x24\x26\xaf\xf3\xc6\x26\x41\xb1\xbc\x85\x61\x39\x62" - "\xa3\x88\xe7\xbd\xd9\x4f\xd0\x13\x9e\x8b\xbc\x19\xf1\xdc\x13\x6f" - "\x96\xe3\xf9\x13\xaf\xc9\xf1\xfc\x89\xd7\xe5\x78\xfe\xd4\x6b\x72" - "\x3c\x7f\x6a\x9d\x2b\x9e\x77\xc5\xf2\x27\xce\xb8\xc3\x71\xdd\x73" - "\x68\xa3\x78\x6a\x82\x67\x0c\xff\x17\x95\xf7\x18\x3e\x45\xf1\x7f" - "\x0e\xc3\xd5\xae\x18\x3e\x65\x22\x62\x90\x3d\xcb\x05\xc3\x17\x0a" - "\x18\x2e\xe0\xc8\xae\x66\x81\x0b\xbb\x62\x78\x0b\xbc\x47\x0f\xf3" - "\x71\xdb\xb7\xae\x18\xfe\xe4\x83\x32\x0c\x57\xf7\x80\xe1\x0b\x99" - "\x1d\x44\xb6\x2e\xd7\x83\x2d\x04\xde\x23\x66\xa7\x07\x6e\x2e\xb6" - "\x99\x73\x7d\xe4\x18\xfe\xe4\xeb\x72\x0c\x7f\xf2\x88\x1c\xc3\x9f" - "\x5c\x2a\x61\xb8\x70\xed\xa6\x70\xf3\x27\xb3\x6f\x3a\x37\x17\xf5" - "\xa3\x5b\x0c\x7f\x32\x5b\xe2\xe6\x4f\xcd\xef\x19\xc3\xff\x25\xc0" - "\x3d\x86\xc3\x79\x8a\xe1\xff\x12\xe0\x71\x9f\x43\x17\x0c\xff\xfd" - "\x64\x2f\x30\x5c\x6e\x0b\x11\x31\x5c\xb0\x85\xec\x72\xb2\x85\xd8" - "\x33\x99\x2d\x64\x67\x33\xd3\x8d\x81\x0a\xa6\xa7\xa0\x3f\x61\x85" - "\xca\xee\xe7\x6e\x3b\xfb\x64\x07\xf9\x7d\x94\x37\x76\x10\x8a\xdf" - "\xb8\xc7\xe1\x79\xc0\xed\xea\x5e\xee\x71\x98\x22\xee\x71\xc8\xf5" - "\xb0\xc7\x41\xc0\xf3\xd9\xdf\x03\xcf\xe9\x1e\x87\xa9\x33\xe5\x36" - "\xe6\xa9\xcf\x8b\x36\x66\x86\xe7\xd1\x0b\xe4\x78\x1e\x1d\xe7\xd8" - "\xf3\x00\x98\x6f\xd0\x6d\xee\xb2\xe7\xc1\x81\xed\xd4\x0e\x3a\xf5" - "\x90\xfe\xb9\x06\xe2\xc0\xf7\x59\x12\xbe\x43\x59\x43\x64\xd8\x5e" - "\xef\x8c\xed\x53\x4d\x32\x6c\x3f\x97\x2f\x5f\x1f\x51\xaf\x73\xc2" - "\x76\x71\xcf\xc3\xb4\xba\x93\xb5\x3d\x60\x3b\xdc\xdf\xfb\x3d\x62" - "\x37\x17\xdb\xc5\xfd\x0d\x6e\xb1\xdd\x79\x7f\x83\xd3\xfa\x07\xc4" - "\x76\x1a\x83\x22\xc4\x05\xdb\x57\xc5\x29\xed\xc7\xa1\x3f\x00\xae" - "\x63\x1f\xb1\xf3\x80\xed\xb4\xbd\x9f\x0e\x73\xc6\xf6\xce\x4c\x86" - "\xed\x3b\x9a\xbf\x3f\xb6\x3b\xf8\xb0\x33\xb6\x3f\x81\xd8\x3e\x3d" - "\x84\xed\xbf\xc8\xe8\xdd\xfe\x0b\x97\xf5\x19\x3b\x7a\x61\x7f\xe9" - "\x16\xe3\xdd\xd4\x4b\x8e\xf1\xd3\x17\xc9\x31\x7e\x7a\x91\x1c\xe3" - "\xa7\xcf\x94\x30\x5e\xb8\x76\x53\x78\xfa\xf4\xf8\xdb\x63\x7f\x99" - "\x1e\x2f\x61\x7c\xf4\x93\x3d\xef\xbd\x98\xda\xe4\x7e\x6d\x06\x9c" - "\xa7\x18\x3f\xb5\xa9\xdb\xbd\x17\x32\x7b\xf7\x33\x0f\xbb\xdd\x7b" - "\x51\xfd\xc3\xad\xcd\x70\xd6\x15\x57\xfb\x4b\xdf\x6d\xdf\xcf\x44" - "\x78\x6b\x7f\xc1\xbd\x17\xab\x4e\x3b\xed\xbd\xa8\xed\x79\xef\x45" - "\xea\xcc\x5e\xda\x5f\xba\x59\x9b\x71\x2a\xda\x79\xbd\xdb\xb3\x0f" - "\xc9\xf1\xfd\xd9\x87\x1d\xf8\xfe\x2c\xe2\xfb\x73\xd3\xe4\xf8\xfe" - "\xdc\x54\xac\xa7\xbb\xbd\x18\x87\x65\xdf\x15\x9f\xdd\x22\x5f\xab" - "\xe1\x62\x7f\x79\x16\x75\x6f\xa6\x5d\x86\xef\xe7\x9c\xf1\xfd\x59" - "\xbd\x3b\xee\x8e\x76\x6f\xba\xa6\x78\xb6\xd3\x9e\xb6\xa7\xc5\xf5" - "\x6f\x7f\x38\x79\x32\x06\xde\xdf\xe4\x61\xad\xdb\x6c\xb6\xd6\x8d" - "\xae\x6d\x43\x3b\x38\x94\x75\x60\xb6\x4e\x99\x16\xcb\x73\xb8\xd6" - "\xcd\x75\x9d\x1b\xae\x7d\xc3\xb5\x6e\x95\x71\xb9\x1e\xd7\xb9\xa1" - "\x6e\x7a\x5a\xeb\x06\xf5\x0e\xa6\x58\x7f\x41\xc0\x7a\x61\xad\x5b" - "\x41\x92\xb4\xd6\x4d\x86\xf5\x6e\xd6\x0f\x1f\x3a\x97\xe1\x9e\xc7" - "\xa7\x4b\x58\xdf\x81\x3c\xfe\x37\x2e\xb6\x18\x2a\x83\x19\xaa\x1f" - "\xd4\x16\x43\xb1\x7e\x46\x7b\x15\xea\xf1\x2c\x9d\x1b\x5b\x4c\xd7" - "\x35\xce\x3f\x9c\x2d\x66\xe6\x33\x72\x8c\x9f\xb9\x4e\x8e\xf1\x33" - "\x1f\x96\x30\x5e\xb8\x76\x53\x30\x7e\x66\xf4\xed\xb1\xc5\xcc\x8c" - "\x96\x6c\x31\xcf\x8d\x75\xbb\xfe\x4e\x66\x63\x7f\xb6\xdc\xbd\x8d" - "\xfd\x59\x61\xfd\xdd\xb3\xe5\x1e\xf7\x84\x74\xf9\xa6\xf9\xc7\x20" - "\x66\x63\xef\xc3\x9e\x90\xda\x1f\x9b\x2d\xe6\x8f\x1e\xfd\x7f\x79" - "\xb2\xc5\xd0\xb5\xcd\xa7\x71\x7d\x88\x77\x7b\x42\x7a\xc2\x76\x07" - "\x77\xef\xe6\x1b\xa6\x1c\xdb\x63\x82\xe4\xd8\x1e\x13\x22\xc7\xf6" - "\x59\x77\xcb\xb1\x7d\xd6\x30\x57\x6c\xef\x8a\xeb\x31\xf3\xdd\x61" - "\xba\xee\x59\xb4\xc5\xbc\x58\xe1\x19\xcf\x63\x72\xbd\xc7\xf3\xe7" - "\xb7\xfd\x9f\xc6\x73\xb5\x2b\x9e\x3f\x5f\xf3\x83\xda\x65\x28\x9e" - "\xbf\x70\x52\x86\xe7\xea\x1e\xf0\xfc\x07\xb3\xcb\xbc\x38\x5c\x8e" - "\xe7\x2f\xce\x90\xe3\xf9\x8b\x77\x48\x78\x2e\x5c\xbb\x29\x76\x99" - "\x17\x35\xb7\xc7\x2e\xf3\xa2\x46\xe2\xec\x2f\xda\x7b\xc6\xf3\x98" - "\x7c\xf7\x78\x0e\xe7\x29\x9e\xc7\xe4\x7b\x5c\x4f\xdd\x05\xcf\x67" - "\xd5\x79\x81\xe7\x6e\xd7\xa8\xfc\x38\xec\x32\xb3\x6a\xbd\xb5\xcb" - "\x78\xda\xa7\x82\xf8\x2e\xad\x4f\x71\xda\xa7\x12\x29\xee\x53\xc9" - "\x90\xaf\x4f\xb9\xe9\xd8\xfe\xd2\x65\x39\xb6\xbf\xf4\x9d\x1c\xdb" - "\x5f\x1e\x20\xc7\xf6\x97\x03\xc4\x7a\x32\xbb\x4c\x66\x97\x7d\x2b" - "\x72\x9c\x9f\xfd\x8c\xfe\xd9\x06\xe2\x0e\xeb\x2f\x29\xe6\x7e\xe8" - "\x19\xe7\x67\x27\x7b\xc2\x79\x5c\xaf\xf2\xde\xec\x38\x37\x38\x3f" - "\x67\xcd\xff\x06\x9c\xf7\xb4\x0e\x85\xce\x83\x00\xe3\x11\xef\x29" - "\xbe\x0b\x58\x8f\x38\x6f\xff\x9b\x3b\x1b\xcd\x9c\x23\xb7\x0a\xe7" - "\x3d\xdb\x68\x62\x0f\x55\xcd\x12\x70\xbe\x37\x7b\x68\x8e\xc9\x6d" - "\x34\x05\x0b\x6f\xb5\x8d\x66\x6e\x90\x1c\xef\xe7\x46\xc9\xf1\x3e" - "\xb6\x5d\xc2\x7b\xe1\xda\x4d\xe1\xef\x73\xd5\xb7\xc7\x46\x33\x57" - "\x2d\xe1\xfd\xdc\xcb\x3d\xe3\xfd\xec\x0c\xf7\x78\x3f\x5b\xf0\xcd" - "\x36\x3b\xa3\xf7\x78\xff\xb2\x03\xef\xbb\xee\x9f\xc9\xe8\xfb\x1a" - "\x99\xc7\x6e\xb7\x8d\xe6\x65\x8f\xf8\xdf\x9d\x7f\x8c\xbe\xdb\x68" - "\x84\x3d\x89\x2f\xbb\xf7\x8f\x71\xb2\x9b\x35\x32\x27\x2b\x9c\xb1" - "\xfe\x95\x33\xf2\xb5\x88\xaf\xd4\x89\x6b\x11\x4f\x56\x21\xd6\xc7" - "\xf9\xca\xb1\x3e\x4e\xe5\xc9\x46\x73\x88\x73\x5e\x93\x38\xef\x61" - "\xb9\x8d\xa6\x48\x6e\xa3\x79\x1a\x75\xef\x4f\x1f\x78\xc6\xfa\x79" - "\xf3\xe4\x6b\xc0\xd9\x1e\xc5\x77\x66\x0b\x6b\xc0\x67\x3b\xad\x01" - "\x7f\xea\xdf\x05\xac\x9f\xbf\xa6\xbc\xda\x46\xbc\x59\x87\xf8\xfd" - "\xd7\x7a\x67\xbb\x5d\x83\x48\xc7\x80\x6e\xd6\x21\xce\x39\xa3\x26" - "\x9c\x72\x1b\xda\xdf\xa5\x75\x88\x80\xff\xdb\x95\x2e\xfe\x8b\xdd" - "\xad\x43\x9c\xad\xf3\x88\xff\xed\xbc\x84\xff\xdc\xff\x93\xec\x36" - "\x1c\xf2\x7c\x2a\x97\xf9\x47\x6e\x95\xdd\xc6\x9d\x9d\x44\xff\x38" - "\xe2\xff\xab\xef\x33\x9e\x1f\xf7\x23\xb3\xdb\xfc\xe9\x0e\x39\xee" - "\xff\x69\xa2\x1c\xf7\x5f\xfd\x4e\xc2\x7d\xe1\xda\x4d\x59\x8b\xfe" - "\x27\xff\xdb\xc3\xf3\xff\xe4\x2f\xd9\x6d\xfe\xd4\xd8\x33\xee\xcf" - "\x8b\x77\x8f\xfb\xf3\xe2\x19\xee\xcf\x8b\xef\xd6\x6e\x23\x5b\x1b" - "\x19\x77\xf2\x7b\xdb\x6d\x44\x9e\x7f\xdb\xf7\xf5\xc4\x95\x7b\x63" - "\xb7\x71\xec\x49\xff\x5e\x76\x1b\xf7\x78\x2f\x72\xfb\x93\xdd\x7c" - "\x73\x95\xe3\xfd\x82\x93\x72\xbc\x5f\x50\x29\xc7\xfb\x45\xdf\xc8" - "\xf1\x7e\x51\x93\x3b\xbb\x8d\x1c\xeb\x17\xde\xed\x0e\xe7\x75\x4f" - "\xa3\xdd\x66\x51\xbe\x67\x8c\x5f\x38\xc5\x7b\x8c\xff\xf3\xfc\x7f" - "\x62\xbc\x0b\xc6\xab\x5d\x31\xfe\xcf\x45\x3f\x28\xc7\xa7\x18\x1f" - "\xbf\x45\x86\xf1\x37\xd1\x96\xd3\x9b\xfd\x24\x9e\xb9\x7d\xbc\xcb" - "\xfa\xf7\x45\x1a\x39\xc6\xc7\x3b\xad\x7f\x17\xae\xdd\x14\x8c\x8f" - "\xbf\xf9\xeb\xdf\x7b\x85\xf1\xf1\x4e\xeb\xdf\x17\x9d\xec\x19\xe3" - "\x17\x46\xbb\xc7\x78\x38\x4f\x31\x7e\x61\x74\xb7\xdc\x5e\x86\xf1" - "\x8b\xf7\xdd\x0a\x5b\xce\xed\xd9\x6f\xb4\x78\xaf\x37\xf6\x9c\xee" - "\xfc\x8e\x78\xb4\xe7\x44\x88\xf6\x1c\x9d\x07\x7b\xce\xcd\xc2\xfc" - "\x25\x1f\xca\x31\x7f\xc9\x31\x39\xe6\x2f\xfb\x4e\x8e\xf9\xcb\xcc" - "\x72\x7b\x4e\x42\x17\x7b\x8e\x1c\xff\x75\xc3\xf5\x4f\x3b\xdb\x73" - "\x8a\x9c\xec\x39\xcb\x76\x7b\xc6\x7f\x9d\x47\xfc\xbf\x41\xf1\x3f" - "\xd6\x0d\xfe\x2f\xfd\x3f\x82\xff\xb1\xdf\x03\xff\x97\xde\x06\xfc" - "\x4f\xd8\xc9\x6c\x3c\xbd\xf4\x93\x72\xc8\x7b\x1b\xcf\xf7\x1b\x07" - "\x12\xae\xcb\xc7\x01\x78\x21\xd9\x38\x90\x50\x27\x8d\x03\xc2\xb5" - "\x9b\x32\x0e\x24\x58\x6e\xcf\x38\x90\x60\x91\xc6\x81\x65\x9f\xf7" - "\x3c\x0e\xe8\x3c\x8c\x03\x3a\x61\x1c\xd0\x79\x31\x0e\x24\x1e\xf3" - "\x6c\xe3\xd1\xf5\xdd\xc6\xf3\xf0\xed\xde\x07\x95\xa8\xf7\xca\xc6" - "\xb3\x75\xbc\xae\x02\x7d\xa4\x5c\x20\xca\x55\x73\x45\x1b\x8f\xde" - "\xc5\xc6\xa3\xef\x62\xe3\x59\x79\x41\xc0\xff\xa9\xc2\x7e\xd3\xa7" - "\xbf\x87\x8f\x14\x8c\x9f\xac\x58\xfe\xa1\x7c\xdd\xfc\x72\x8a\xff" - "\x92\xff\xbe\x95\xd3\xb0\x5e\x6c\xfc\xd1\x77\xe3\x03\x35\x69\x80" - "\xcc\xa6\x33\xd5\x9d\x8f\x94\x64\xd9\xba\x1b\xf9\x7e\xd3\xa4\x08" - "\x19\xde\x3f\xcd\xf6\x9b\xbe\xeb\xee\x3b\xad\xc3\x27\xff\x8a\x27" - "\xa9\x4f\x7e\x87\x2f\xbf\xa4\xd4\x5e\xf9\x92\x9e\x2d\xf8\x92\x3e" - "\x77\x1b\x7c\x49\xf7\xd6\x27\xff\x39\x57\xff\x7d\x2b\x1a\x0d\x15" - "\x7a\x52\x85\x3a\x32\xcb\xd5\xf7\xa9\xde\xfd\xde\x7d\xa5\xb0\x77" - "\x7f\xf1\xad\xf1\x83\x82\xf5\xa1\x63\xfe\xa0\x15\x19\xfb\xd2\xcc" - "\xb4\x3e\x18\xab\x1a\xe4\xbc\xa0\x02\x74\x95\x43\x3c\x4d\x40\x3c" - "\x4d\x2e\xa0\x79\x2f\x80\x2e\x0c\xea\x97\x8f\x7a\x9c\xc3\x91\x00" - "\x5d\x12\x62\x6b\x32\x5d\xf7\x05\x34\x02\xb0\x95\xe5\x5b\x7d\x81" - "\xb7\xdb\x07\x05\xe6\x43\xfd\xfb\xed\x5f\x5c\xed\x5b\x65\xb2\x40" - "\xbf\x68\xc6\x3d\xb1\x0a\x83\xad\x4d\x8f\xb2\x38\xba\xb8\x1a\x30" - "\x33\xdf\xba\xeb\x55\xe2\xef\x5d\x3f\x4d\x8e\xa3\x7c\x06\xc7\xbd" - "\x41\x2b\xd6\xa3\x1f\x10\x91\x5b\x71\x57\x25\xfb\xd6\x4e\x68\x1f" - "\x8e\x67\x63\xdf\x9c\x05\x0c\x37\x78\x18\xaf\xa1\x2d\xe9\x1a\x5b" - "\xc4\x0d\x1a\xbb\x0a\x70\xa3\xf0\x9a\xf4\x1d\x1b\xcb\xc7\x36\x62" - "\x76\x94\x95\xd2\xfa\x17\x93\x27\x6c\x4d\x8a\x74\x8f\xad\x49\x91" - "\x0c\x5b\x93\x22\x1d\xd8\x6a\x72\x63\x47\x91\xad\x63\x4f\x11\xd6" - "\xbf\xe8\x5d\x38\xb6\xfe\x27\xe8\x1f\x25\xc5\xab\xf5\x2f\x14\x4f" - "\xe3\x19\x9e\x22\x5e\x89\x98\x2a\xd9\x51\xf4\x1e\xed\x28\x3d\x61" - "\xaa\x57\x7b\xf8\x29\xa6\xae\x0a\x92\x63\xea\xaa\x10\x39\xa6\xa6" - "\x6d\x71\xc5\xd4\xae\x78\xba\x6a\xa6\x3b\x2c\x65\xfe\x51\xd2\xa2" - "\x3c\xe3\xe8\xaa\x0c\x4f\x38\x4a\xd7\xa7\xcf\x76\x5a\x9f\xee\xc0" - "\xd1\xd4\x4d\x72\x1c\x5d\x55\xd6\x5b\x1c\xa5\xb1\x4d\xce\xfd\x00" - "\xb1\x4d\xfa\x8c\xa3\x3a\x17\x1c\x5d\x3d\x56\xc2\x51\xd7\xf8\x26" - "\x3d\xe0\xe8\xc2\x5b\xe3\x03\x45\x86\xa3\x9c\x99\xd6\x47\xb3\x98" - "\xd6\xf5\x7d\x39\x8e\xae\x6e\xf0\x8c\xa3\xab\xd7\x48\x38\xca\xf2" - "\xdd\x5a\x1c\x5d\x5d\x22\xc3\xd1\x85\x4e\x38\xfa\xad\x34\x87\xc0" - "\x35\x16\x0e\x1c\x5d\xe4\x84\xa3\x0b\x7b\xc2\xd1\xd5\xb4\x8d\x18" - "\x47\x4d\x5b\xde\x33\x8e\xae\xca\x76\x8f\xa3\xab\xb2\x19\x8e\xae" - "\xca\x96\x70\xd4\x0d\x47\x95\xe1\x68\xfa\xf3\x5e\xe0\xe8\x8f\xdc" - "\x37\x0a\x4c\x54\xbc\xf4\x8d\x22\xec\xe9\xec\xea\x23\xf5\x25\xe7" - "\x3d\x41\xa5\x2e\x71\x4f\x4a\xbb\xc4\x3d\x59\x29\xee\xf1\x9c\x22" - "\xe0\xea\x53\xdf\x03\x57\xe9\x1e\xcf\x8c\x05\xf2\xb5\x27\x19\x8b" - "\xc4\xb5\x27\x0c\x57\xd7\x29\xc4\x7a\x49\x71\x4f\x4a\xbb\xf1\x91" - "\x9a\xf1\xa1\xcc\x37\xca\x14\x67\xdf\x28\x6b\xdf\xf7\xec\x23\x35" - "\xa3\x41\xe6\x1b\xe5\x54\xb1\x23\xee\x89\xab\x8f\x54\x09\x63\xd7" - "\x5c\xa7\x18\xeb\xf0\x41\xb5\x46\xeb\xf0\x91\xda\xc3\xbe\x20\x2c" - "\x67\x7f\x7d\xdc\xad\xc7\x58\xbd\x17\x18\x2b\x8b\x7b\xe2\xea\x63" - "\x2a\x73\x9b\xa1\xbc\x94\x54\xc5\x96\xba\xf1\x8d\x5a\x7a\x5b\x63" - "\x9f\x60\xbd\xdc\x63\xed\xda\xbb\xe5\x58\xbb\x36\x9a\xe6\xad\x73" - "\x87\xb5\x99\x97\x25\xac\x65\xf9\x56\xd7\xb9\x60\x6d\xad\x07\xac" - "\x85\x71\x75\xd7\x25\x6f\xb1\x76\x2d\x8d\x9b\xcd\x65\x0a\x58\xdb" - "\x7c\xb3\xb1\x76\xed\x30\x09\x6b\xd7\x5e\xe8\x39\xc6\x54\x46\x8b" - "\xfb\x7d\x39\x19\x2d\x0c\x6b\x33\x5a\xba\x8d\x31\x25\x5b\xf3\xb1" - "\xee\x73\x31\xc6\x94\x64\x0f\x28\x15\xec\x01\x3f\xe5\x98\x28\xeb" - "\xaa\xbd\xb5\x07\x7c\x06\x73\x77\xdc\x77\xb9\x0a\x63\x4e\xcd\xc2" - "\x98\x28\x25\x2e\xf6\x80\x92\xae\xf6\x80\xe7\xbb\xc7\x58\xaf\xec" - "\x01\x74\xdf\xe5\x6b\x95\x72\x8c\x7d\xed\x73\x39\xc6\xbe\xbe\x40" - "\xdc\x67\x89\xf5\xf1\xec\x33\x35\xeb\x6e\x87\x3d\xa0\x56\x8e\xad" - "\x92\x3d\xe0\xf5\x21\x9e\x31\x36\x4b\x6e\xff\x7d\xaa\x58\xb6\xcf" - "\xf2\xdd\x7a\x67\x3f\xd4\xa2\xff\xa9\x7f\x9d\x7f\xb2\xc6\x19\x63" - "\xb3\xd6\xff\x94\xfc\x50\x3b\x7c\x4d\xf5\xb0\x96\xbb\xab\x1f\xea" - "\x6c\xc0\xb5\x12\x82\x7b\xdb\x28\xde\xca\x6c\x03\x25\xb7\xc7\x36" - "\x50\x5e\xe2\xc1\x36\x90\xfd\x9a\x1c\x67\xb3\x4b\x69\xde\x33\xee" - "\x70\x36\x7b\xa6\x84\xb3\x2c\xdf\xea\x33\x2e\x38\x6b\xbc\x99\x9c" - "\x36\x7b\xdd\xad\xb5\x0d\x64\xaf\x93\x6c\x03\xaf\xf7\x62\xff\x63" - "\x56\xb4\x7b\x9c\xcd\x12\xec\xae\x59\x92\xdd\xd5\xe8\x26\x5e\x8a" - "\x0c\x67\xdf\x18\x2b\xee\x7f\xa4\x9c\xb6\x56\xe4\xb4\x25\x3f\xc1" - "\x78\x29\x6f\x8c\xf1\xd6\x36\x80\xfb\xdc\x11\x5b\x11\xbb\x44\x7c" - "\x95\x6c\x03\x25\x9e\x6d\x03\x3d\xe0\xab\xf7\xb1\xfb\xde\x1c\x2b" - "\xc7\xd7\x37\x1f\x94\xe3\x6b\xce\x87\xae\xf8\xda\x15\x5b\xdf\x5c" - "\xea\x0e\x57\x99\x6d\x20\x27\xde\x33\xa6\xbe\x59\xe0\x09\x53\xa9" - "\x4f\xbf\x7a\x69\x8d\xb4\x84\xa9\xeb\x0f\xc9\x31\xf5\x4d\x53\x6f" - "\x31\xf5\xb6\xc4\x4b\xe9\x33\xa6\xc6\xb9\x60\xea\x86\x99\x12\xa6" - "\xba\xc6\x4c\xe9\x01\x53\x6f\x95\x9d\xc0\x19\x53\x65\xdc\x75\xc3" - "\x19\x39\xa6\xe6\x04\x78\xc6\xd4\x0d\xef\x48\x98\xca\xf2\xdd\x5a" - "\x4c\xdd\x60\xbc\xb5\x76\x82\x0d\x46\x89\xbb\xe6\xec\xec\x19\x53" - "\xdf\xdc\xe3\x1e\x53\xdf\xdc\xc3\x30\xf5\xcd\x3d\xbd\xdf\x53\xbe" - "\x71\x8d\x17\x98\xfa\x23\x8f\xa5\xb2\x31\xc3\x6b\x3b\x01\xda\x5b" - "\x11\x4b\x6b\xbf\x9f\xef\x90\x64\xd1\x77\x48\x94\x80\xb1\x4f\x7c" - "\x5f\x8c\xcd\xdd\x24\x5f\xd3\x90\xbb\x45\x5c\xd3\xc0\x30\x36\xef" - "\x21\x79\x7c\xd4\xae\xbe\x42\xe4\x3e\x54\x73\x1b\x1d\x76\x02\xc4" - "\xdc\x28\x67\x3b\xc1\x5b\x8d\x9e\xf1\x76\x53\x80\xcc\x4e\xf0\x89" - "\x7b\xbc\xbd\x21\xc3\xdb\xcd\xa3\x29\xde\x3a\x7c\xa8\x6e\x8a\x16" - "\x7d\xa8\xf6\xc8\x61\x65\x78\x1b\xfb\xc3\xe0\x6d\x69\xef\xf1\x56" - "\x1e\x4b\xc5\xd5\x5f\xea\xe6\x4a\x43\x19\xe0\x2d\xf5\xd7\xe1\xea" - "\x33\xb5\x77\xfe\x3a\x6e\x95\xcf\x54\xac\x97\x7b\xdc\x7d\xeb\x19" - "\x39\xee\xbe\xb5\x8e\xe6\x75\x8b\xbb\x6f\x0d\x97\x70\x97\xe5\xeb" - "\x35\xee\xf6\xc9\x66\xf0\x56\xf4\xad\xb5\x19\xbc\x15\x2d\xe1\x6e" - "\x5e\x48\xcf\xb8\xbb\x29\xd8\x3d\xee\x6e\x0a\x66\xb8\xbb\x29\xb8" - "\x5b\xdc\x95\xad\x21\xd8\xe2\xeb\xd6\x97\x47\xed\x4f\x3d\xce\xca" - "\x16\x55\x5f\x6c\x06\x80\xc1\xca\x54\xf4\xe1\x14\x8b\x6b\x08\x7a" - "\xb6\x19\xf4\x84\xb7\xde\xdb\x0c\xb6\x2a\xe4\x78\xbb\xd5\x57\x8e" - "\xb7\xdb\xde\xc7\x7a\x75\x6b\x33\xa0\x18\xb0\xf5\x19\x87\xcd\xc0" - "\x24\xc7\x59\xc9\x66\xb0\x6d\xae\xe7\x6f\x5f\x5b\x53\x65\xfc\xf6" - "\x09\x17\x9f\xd5\xb3\x25\xbc\x3d\x55\x25\xae\x19\xfb\xb7\x7d\x27" - "\xa3\x9d\xf1\x76\xab\xbe\x8b\xcf\xea\x19\x37\xd1\x67\xf5\x8c\x9b" - "\xec\xb3\x7a\xa6\xdc\x67\xf5\xf6\x1b\xd2\x3a\x32\xef\x7d\x56\xe7" - "\x3f\x49\x31\x18\x75\x08\xfd\x56\xf7\xc6\x8e\x70\x8b\x63\xad\xc8" - "\xb0\x57\x66\x47\xc8\xaf\x94\x63\xef\x36\xe2\x19\x7b\xf3\x77\x4a" - "\xd8\xcb\xf2\xdd\x5a\xce\x9b\x5f\x71\x6b\xed\x08\xf9\x15\x92\x1d" - "\x61\xdb\x26\xb7\xd8\x2b\xfb\x36\xb6\x75\x9d\xfb\x6f\x63\x70\x9e" - "\x62\xef\xd6\x75\x1e\xed\x08\x5d\xd6\x6f\x6d\x5f\xce\xbe\x8d\x09" - "\x9c\xd7\xe4\x85\x1d\xe1\x47\xb7\xc6\x60\x7b\x62\x5f\xec\x08\x88" - "\xb7\x88\x67\x22\xe6\xf6\xc6\x8e\x70\xf3\x39\xee\x8e\xe5\x72\xcc" - "\xdd\xb1\x52\x8e\xb9\xbb\x86\xb8\x62\x6e\x57\xbc\xdd\x71\xc8\x1d" - "\xd6\x32\x3b\x42\x61\xb9\x67\x9c\xdd\xd1\xe0\x11\x67\x5d\xd6\xe6" - "\x4a\x38\xbb\x33\x44\x8e\xb3\x05\xda\x3e\xe1\x6c\x6f\x63\xb0\xfc" - "\xa8\x70\x36\xd6\x05\x67\x77\xbe\x2f\xe1\xac\x6b\x1c\x96\x1e\x70" - "\xf6\x16\xc5\x61\xf1\xcc\x71\x0b\x1f\x92\xe3\x6c\x61\x9c\x67\x9c" - "\x2d\xf4\x95\x70\x96\xe5\xbb\xb5\x38\x5b\x38\xe1\xd6\xda\x16\x0a" - "\x27\x48\x1c\xb7\xb0\xbd\x67\x9c\xdd\xd1\xe2\x1e\x67\x77\x08\xdf" - "\xc5\x76\xb4\x78\xe4\xb8\x5d\x70\x76\x57\x9d\x17\x38\xfb\x23\x5f" - "\x83\xb0\xcb\x2b\xff\x17\x4e\xf6\x5a\x3f\x83\xc9\x65\xbf\xc4\x19" - "\xe7\xfd\x12\x4e\xb6\x85\x28\xd1\xb6\x20\x8f\xcf\x92\x2c\xda\x6f" - "\x23\x05\xdc\x7d\xfc\xfb\xe2\x6e\xd1\xe5\x36\x07\xee\x26\x00\xee" - "\x16\xd1\xfd\x11\x6d\x0e\xdc\xdd\xf3\xb6\x58\x2f\x29\x3e\x8b\x07" - "\xdb\xc2\x23\x58\xde\xee\xc7\x1c\xb6\x05\xc4\xe1\x48\x67\xdb\xc2" - "\x9e\x99\x9e\x31\x78\x77\x9c\xcc\xb6\xf0\xb1\x7b\x0c\xb6\xc8\x30" - "\xf8\xdf\xb7\x51\x0c\x7e\x44\xc4\xe0\xdd\x7b\x6f\xc0\xdc\xf2\x46" - "\x96\x77\x18\x6c\xa1\x18\x3c\xe5\xf6\x60\xf0\xc1\x9b\x80\xc1\xb4" - "\xdd\xff\xf2\xa8\x41\x0f\x18\x3c\x0b\x31\x78\x4a\xef\xec\x0d\x3f" - "\x50\x8c\x16\xac\x97\x7b\x2c\xfe\xcb\x31\x39\x16\xff\xc5\x42\xf3" - "\xba\xc5\xe2\xbf\x6c\x92\xb0\x98\xe5\xbb\xb5\xf6\x86\xbf\xe8\x6f" - "\xad\xbd\xe1\x2f\x7a\x09\x8b\xf7\xbc\xd6\x33\x16\xef\xd6\xb9\xc7" - "\x62\x38\x4f\xb1\x78\xb7\xae\x5b\x2c\x7e\xc4\x19\x8b\xdf\x76\x70" - "\x5e\x99\xbd\xc1\xf4\x53\x8f\xdd\xf2\xb6\x47\xfe\xab\xb9\x87\x64" - "\xd4\x2b\xde\xae\x34\x14\x10\xd2\x9a\x49\x32\x0c\xb6\x47\x08\x9c" - "\x83\xf6\x7b\xfb\xba\x21\x2c\x82\x70\x9b\x07\x1b\x11\x8f\xdf\xc2" - "\x1f\x70\xdc\x5c\xa5\xd0\xb7\x68\x1b\xff\x95\xae\x77\xc5\xf3\x88" - "\xbd\xbb\x9c\xae\xbb\x7b\x16\x9f\x3b\x78\x86\x70\x5f\x34\xdb\x77" - "\x33\x38\x46\x4c\xa3\x6e\x9a\x14\x7f\x9d\xc1\x6f\x1a\x1c\x6d\x0e" - "\x1a\x1c\xed\xee\xfe\xfb\xd4\xc4\x7f\xe0\x1a\x9e\x2f\xdc\xca\x5b" - "\x5a\x47\xf9\xc7\xb6\xbe\x41\x48\xee\x56\xde\xdc\x96\xf5\xd7\xf5" - "\xf0\x8e\x07\xff\x0d\xf2\xb5\x0e\x5a\x1f\xdb\x9a\x19\x4d\xe0\x5c" - "\x91\x78\x0e\xda\x8d\x70\x99\x3e\x3c\x07\xd7\xf8\xcd\xb5\x53\x77" - "\xa5\x01\x56\xa5\x12\x32\xee\x06\xf6\x99\xbf\x96\x80\xce\x04\xe7" - "\x40\x99\x1b\xa1\x2c\x7e\xf0\x5d\x16\xd0\x47\x55\xd5\x3a\x82\x7d" - "\x3a\x1b\xde\xab\x28\x07\xdb\xde\xe7\x7e\xe8\x4f\x2a\xc2\xbd\xdd" - "\xaf\x94\x0f\x09\xd7\x81\x3c\x48\x6e\x02\xa1\x7b\xf8\x37\x42\x3e" - "\x5e\x99\xce\x73\x23\xfd\x22\x0d\x36\x0b\xeb\xd3\x50\xbf\xa3\x30" - "\x8f\xe5\xe1\xb9\x85\x09\x44\x0d\xbf\x00\x7e\x4b\xb8\xae\x2d\xeb" - "\x3f\x22\xe0\x3d\x35\x58\x2f\x4f\xef\xb8\x71\x3b\x8c\x3b\x77\x85" - "\xe1\xd8\x41\x9f\x8f\xcf\xa6\xcf\x51\x72\xd9\x76\x38\xcf\x67\xa6" - "\xf3\x86\x64\x1b\x09\x84\xb6\xd8\x05\xf5\x46\x7d\xe4\xfe\xea\x1f" - "\xbb\x76\x28\x21\xfb\x53\x9a\x94\x06\xa8\xbb\xfd\xdf\xee\xb2\xe8" - "\xd3\x7e\x49\xe0\xba\x19\xe7\x2c\x97\x14\xc5\x0f\x4d\xff\x86\x10" - "\xc4\x13\xf8\xff\x98\x05\xc6\xb1\x69\x90\xde\x08\xef\xc1\xb5\x86" - "\xa9\x30\xef\x25\xc5\x7f\x5c\xd6\x27\x9d\x25\x81\x3a\xe2\x9f\x03" - "\xef\xc6\xf2\xfe\xc7\x11\xcc\x6b\x52\x14\x47\x62\x1d\x20\x5d\x0d" - "\x69\xbc\x0f\xd7\x90\x11\x7e\x4f\xbf\x52\xaa\x9b\x79\xe1\x3a\x6e" - "\x64\xbf\x52\x8a\x7d\xf0\x9e\x1b\xe1\x9d\x21\x4f\x00\xe4\x09\xa0" - "\xc7\x34\xa2\xce\x83\x73\x58\x0e\x1c\x03\xf4\x8b\x3b\xb0\xec\xbd" - "\x58\xb6\x87\x76\x50\xf1\xc1\xe1\x30\x76\xab\xe8\x98\xaa\x49\x53" - "\x7c\x5e\xaf\x28\x36\x05\x2a\x78\x9e\xdf\xe3\x17\xb9\x36\x8d\x04" - "\xe4\x72\x84\xe8\x87\x62\x39\xc5\x87\xa0\x7c\x15\xb6\x45\x5b\x56" - "\x71\xbe\x49\xf1\x1f\x51\xd8\xbe\x20\x4f\x8b\xe6\x3e\xfa\xbe\x66" - "\x7c\x0e\xde\x23\xe4\xa7\xbe\xef\xb1\xce\x9a\x34\x1f\x1e\xd2\x67" - "\x7c\x14\x17\x88\x4f\x58\xc0\x0b\x70\xbf\xd1\x44\xe6\xeb\xf0\x7e" - "\x13\xbb\x0f\x74\xa9\xb8\x05\x64\x16\x8b\xe7\x30\xed\xa1\xbe\x01" - "\xa2\xdc\x2a\xc3\x40\x37\x5c\x65\x27\xea\x08\xe8\x85\xa8\x23\x58" - "\xdf\x03\x69\x26\x25\x1d\x87\x15\xef\xd0\x79\x5d\x0e\xc8\xd0\xbe" - "\x23\x4c\xb5\x11\xda\x96\xeb\x44\xb9\xd4\xc3\xb5\x77\x1f\x44\xb9" - "\x6c\x4c\x01\x99\xb0\xbc\x33\xa4\xfa\x63\xfa\x5d\x2a\x4f\x0e\x64" - "\xc1\xf6\x6e\xbe\xeb\x8b\xef\xb3\xf1\x06\xc8\x31\x94\xb7\x94\x25" - "\x43\xbd\x50\x6f\x41\x47\xf6\x27\x58\x95\xb8\xae\x0f\xcf\x1f\xbd" - "\x66\x55\x6e\x6c\x26\xc8\x2b\xc9\x06\xc0\xe5\x9d\x49\xd0\xe6\x50" - "\x26\x3f\xc2\x2f\x72\xbc\x28\xc7\x14\x90\x5d\x12\xe8\x2e\xb4\xf9" - "\x46\x68\xbf\x42\xc0\x3c\xfc\x5f\x08\xe3\x0f\x07\xf9\x4c\x8a\x77" - "\x23\xa1\x3c\xf5\xce\x50\xde\xbc\x2b\x94\x6f\x81\x36\x5c\xdc\x96" - "\xf5\xee\x30\xb1\x0d\xb1\x4e\x1b\xe1\xfc\x06\xb8\x6e\x52\xbc\x93" - "\xcf\x74\xe8\x9d\x38\xf1\x9d\x3d\xb5\xe7\xfa\xfd\x24\x62\xc3\x7e" - "\x32\xec\x8d\xfd\x64\x62\xea\x3c\xe8\x97\x99\xbf\xe3\x3f\x8b\xb5" - "\xc1\x98\xb8\x34\xae\x23\x74\x48\x2c\xf2\x43\x6e\xed\x5d\x45\xaf" - "\xed\x27\x63\xf6\xcd\x2e\x52\x4e\x6f\x21\x04\xc7\xf0\xe9\xbe\xe7" - "\x79\x83\xee\x3a\xe1\x82\x96\xc6\xd9\xd7\xde\x3f\xe8\xe9\xeb\x84" - "\x9c\xd0\x5a\x48\x5a\x22\x8c\xe5\xd7\x9a\x48\x9a\x85\x37\x57\x65" - "\x7c\x43\x00\x7b\xa6\xb0\xb6\x7b\xaf\x7a\xfa\x7c\x42\x70\xcf\x20" - "\xf7\xad\x96\x0c\x88\x23\xaa\xd4\x33\x24\x2c\xbd\x81\x6f\xb2\x6f" - "\x1d\x15\x9d\xb6\x9a\x28\xf7\x5f\x33\x32\xee\xa9\x78\x6f\xf7\x87" - "\xf0\x2c\xbe\x2d\x86\xcc\xb1\x09\xe3\x51\x5e\x78\x72\xfa\x02\x32" - "\x04\xdf\x27\x90\x72\xaf\xf7\x9e\x84\x76\x4b\xf6\x0e\x9f\xdf\x0b" - "\x66\x78\x58\xa7\x4b\x9f\xcf\x37\xc1\x98\xa2\xe4\xd3\xe7\x29\x78" - "\x4d\x54\x1c\xbf\xa9\x4e\x67\x50\xdd\x20\x86\x38\x0b\xf9\x08\x9e" - "\xed\x65\xb9\xd4\xff\x37\x1d\x3f\xa1\xbe\x33\xb5\x24\x83\xd6\x19" - "\xc6\xc9\xc0\x44\xe4\x50\xfc\x79\xac\xf3\x51\x78\x3f\x7e\xf8\xa4" - "\x6a\x90\xa5\x0d\xc7\xcc\xe9\x26\x3d\xa9\xb0\xda\xc9\xf6\x66\xda" - "\x2e\x7e\xd0\x2e\x2a\xb8\x56\x0d\x6d\xe3\xef\x4e\x56\x28\x27\x2e" - "\x77\x69\x1c\xe7\xc3\xe4\x41\x65\x61\x61\xb2\x78\x7a\x29\x81\xb1" - "\x13\xe4\xb1\x89\xc9\x83\x0b\x19\x1f\x8b\xf2\xf0\xee\x3d\xf6\x4e" - "\xf0\x34\xa6\xe0\xb3\x79\xd0\x09\xd4\x05\x2e\x78\x7c\x2c\x3e\x1b" - "\xeb\x80\xdf\xcc\x50\xf6\xd3\x5f\x3b\xcf\x57\xe9\x9a\x88\x01\xde" - "\x87\x0f\x72\xae\x83\xcd\xdb\x3a\x78\x8c\x7f\xb6\x7e\x1c\xe8\xea" - "\x38\xd0\xd5\x71\x64\xe2\x2a\x13\xd3\xd5\x53\xb5\x4c\x57\xed\x50" - "\xaf\x76\xe0\xeb\xab\x66\x12\x25\xd6\x6b\xef\x59\xf4\xcb\x07\xf5" - "\x6c\x92\xf4\x75\xda\x65\x68\x23\x51\x67\x7d\xee\x1f\x84\xed\x53" - "\x65\x31\x92\x74\xd4\xd9\x0e\x77\x3a\xbb\x7f\xdd\xf4\xb9\x20\x9b" - "\x3f\x81\xce\xfe\x43\x4b\x02\x1a\x88\x6a\xf5\x4c\xd0\xd9\x26\x77" - "\x3a\xbb\x7f\xe6\x11\x78\x66\x17\x9d\x9d\xef\xac\xb3\xfb\xec\xde" - "\xeb\xec\xbe\x72\x87\xce\x2e\xf0\xa0\xb3\xf3\x40\x67\x5f\xc8\xf7" - "\x52\x67\xf7\x6b\xbc\xd3\xd9\x7d\x25\x54\x67\x6b\x41\x67\x61\xfe" - "\xb1\xfd\x55\xda\x2e\x7e\xd0\x2e\xa0\xb3\xfb\xd6\x41\xdb\xb8\xd5" - "\xd9\x1f\x5e\x66\x25\x11\xbd\x97\x59\xc9\x1d\x3d\xcb\xec\xc0\xfb" - "\xde\xcb\xec\x40\xea\xad\x91\xd9\x81\x1a\xef\x64\x76\x60\x9e\x67" - "\x99\x1d\x88\xf8\xf1\xc8\xec\xfd\x96\xde\xcb\xec\xfd\x0f\x7b\x96" - "\xd9\xfb\xf3\xbd\x97\xd9\xfb\xe1\xb7\x46\x66\xef\x67\x7b\x27\xb3" - "\xf7\xc3\x3c\xcb\xac\xa4\xc5\x93\xcc\x26\x0d\xe1\x78\x0e\xd7\xc1" - "\x85\x86\xe8\x91\xd3\x30\xfe\xf5\x9f\x87\x70\x0e\x08\x69\x95\x98" - "\xa6\x1c\x09\xe6\xc9\x2e\xe9\x00\x97\xb4\xda\x25\x1d\xec\x92\x0e" - "\x73\x49\x0f\x13\xd3\x20\x23\xdf\x2b\x8a\xff\x1c\x0d\x73\xb0\x0c" - "\x93\xe2\x3f\xcb\x84\xeb\x23\xe6\xd8\x35\x38\x8f\x1b\xe1\xae\xee" - "\x1b\x33\x79\xab\x2e\x8d\xdc\xd5\xac\xf8\x2f\x26\x83\xb5\x43\xb5" - "\x7c\x4a\x06\xe1\x72\xeb\xf6\x3c\xbd\x1a\x75\xc9\x4c\xf8\xce\x30" - "\x3f\x68\xa7\xc1\x30\x7f\x34\xa3\x9e\x69\x12\x3e\xe2\xeb\x15\xff" - "\x75\x37\xbe\xdf\x38\x9d\x9e\x70\x3e\xf7\x63\x8c\x73\x05\xb7\xa9" - "\x6e\x8f\xd9\xe7\xfe\xa1\xfc\xee\xa8\xd8\x1c\x25\xe7\x9f\x93\xc9" - "\x69\x56\x9b\x79\xf3\xd4\xef\x60\x8c\x82\x71\xca\xd0\x62\x05\x3d" - "\xe4\xcd\xfa\x84\xcb\x50\xdf\xff\x7a\xad\x32\x15\xca\x86\xe7\xc0" - "\xb3\x8a\x78\x75\xdd\x3a\x83\xad\x9a\x80\xbc\xf7\x54\x59\xca\x61" - "\x2e\x6f\x24\x42\x99\x45\x7c\x50\xdd\x3a\x2c\xd3\xed\x7c\x2b\x2f" - "\xc4\x02\xcf\x7c\x64\xa6\x56\x45\xf8\x35\xaa\x60\xef\xf4\xe3\xbf" - "\x8a\x3d\xce\xe3\xf2\x42\x13\x59\xb9\xfe\x7d\x28\xf7\x20\xe9\xa6" - "\x5c\xa1\xbe\xea\xbe\x94\xeb\x71\xff\x13\x9f\x37\x58\xa8\xaf\xa6" - "\x2f\xe5\x96\x74\x53\xae\x50\xdf\xc8\x3e\x94\xfb\x81\xbf\xe7\x72" - "\xc3\x84\xfa\x66\xf4\xa5\xdc\x58\xcf\xe5\x86\x58\xfa\xa6\x0b\x1f" - "\x1c\xec\x4e\x17\xfa\xa6\x07\xff\xdd\xcd\xfb\x87\x5a\xfa\xa6\x03" - "\xff\x3d\xab\x3b\x1d\xe8\x9b\xfc\xff\xbb\x5b\xf9\xf7\x4d\xf6\xff" - "\xe3\x71\xfd\x07\xca\xbe\x6f\x72\xff\x1f\x8f\xfa\x8f\x73\x53\x90" - "\x7d\x2e\x1f\x3a\x49\xcf\x6d\x6e\xcc\xe5\x42\x43\x36\xaf\xe5\x22" - "\xc9\x24\xc0\xb0\xc0\x7c\x12\x14\x49\xed\x3d\xff\xd3\xb2\xba\x80" - "\x28\x73\x95\x9c\x72\x5f\x8a\x51\x69\xb0\x45\x90\x74\x1b\x6f\xdf" - "\x93\x64\x55\xfc\x1c\xce\x1f\x8b\x23\xc4\xb2\x4c\x4b\x68\x39\x83" - "\x1a\x73\x73\xd2\x22\xc9\x74\x3b\x41\xfb\x82\xe5\x38\xb0\x8a\xe9" - "\x80\x63\x86\x7c\x2b\x8e\x73\x41\x70\x9f\x0d\xf4\x17\xca\xb0\x92" - "\x03\x9c\x59\x11\x99\x40\xf3\x99\x61\x1e\x68\xe6\xb7\x86\x6c\xe6" - "\xd3\xb5\x64\x1d\xfc\xbf\xa4\x28\x9d\xe9\x63\x26\xca\x42\x98\x1f" - "\xb6\x65\x95\x46\x9b\x14\x87\xc6\xe0\x9c\x11\xe6\xa6\x2d\xe9\xdf" - "\xa1\x0d\x7d\x92\x7e\x2d\xcc\x53\x31\xef\x7e\xce\xac\x1c\xa7\x23" - "\xca\xe3\x66\x9c\x8f\x97\xa6\x1e\x4b\x24\xa4\x1b\x1b\x8a\x8a\x0b" - "\x1e\x5b\x83\xf7\x63\x39\x68\x9b\xdc\xc8\x41\xdb\x06\x87\x27\x63" - "\x7d\xf9\xbc\x21\x53\xf4\x29\x38\x2e\x1c\x52\x4d\x1e\xcd\xb7\x09" - "\x38\x3f\xb4\x19\xd2\x74\x0e\x9e\xc9\x57\xf3\xea\xda\x64\x3e\x67" - "\x40\x64\x95\xe5\x1a\xd1\x27\x75\x90\x7a\xc5\x21\x5f\x7c\x76\x6b" - "\xf0\xd8\x6a\x4b\xf0\x58\x63\x5b\xd6\x21\x22\xd6\x17\x9f\x25\x9e" - "\x47\x9b\x03\xab\xe3\x21\xcd\xb1\x54\xcf\x75\x84\xb1\x64\xd0\xf4" - "\x30\xde\x8c\x6d\xa8\x4f\xbb\x06\x75\x39\xbc\x05\xdb\x99\xcf\x1b" - "\x5b\x64\x49\xd7\xde\xc3\x6c\x70\x87\x8e\xa0\x2d\x07\xc6\x81\x3c" - "\x6a\x57\xd9\x54\x97\x47\xd7\xcd\x00\xde\xc3\x1c\x9c\xda\xce\xae" - "\x28\x0e\xd1\xf8\x81\x33\xb5\x4a\x2f\xe7\x33\x87\xe8\xf8\xaf\xbf" - "\x07\xdb\xe1\xf0\x6a\x78\xde\x6f\xe0\x1d\x4d\x02\xd7\x28\xc6\xe7" - "\x41\x9e\x78\x78\x66\x31\x9f\x5b\xab\xc3\x7c\xf5\x8a\xc3\x44\xb8" - "\x5e\xe2\x74\xbd\x04\xea\xdc\x24\x5c\xd7\x08\xd7\x0f\x3a\x5d\x3f" - "\xa8\xbb\x07\xed\x6c\x87\xa7\xe0\x3b\xc1\x58\x96\x8b\xe3\x1a\xda" - "\xf0\x99\x9d\xbc\x2e\x57\xc8\xb7\xa7\x45\x71\x78\x6e\x2b\xe8\x15" - "\x5c\xdf\xeb\x74\xff\xde\xe3\xc9\xe1\x64\xd2\x4e\x6c\xd3\xc3\x89" - "\x26\x9f\xc6\x0c\x66\x9b\x39\xa4\xa3\x6d\xa1\xae\xcb\x76\x2e\xcf" - "\xa4\x38\x1c\x09\x65\x66\x5b\x80\xdf\x41\x9e\x18\x7c\xa6\x73\xfb" - "\xcf\x4f\x48\x58\x92\xa0\x19\x39\x4f\x33\x6f\xd1\x5c\xcd\x2b\x4b" - "\x96\x2f\x4e\x7c\x74\xe4\xbc\xfe\x84\x38\xe9\x8e\x9a\xcf\x0c\xe4" - "\xb9\xbc\xd1\x61\x86\x7c\x1b\xe1\x95\x6a\x18\x6f\x3b\x48\x1e\xc8" - "\xd5\xb6\x35\xc2\x6c\x0f\x8d\xc8\xb0\x6f\x1d\x62\x4e\xbf\x4e\x94" - "\x69\x61\xfc\x05\x7d\xca\xe3\x20\x83\xbf\x0d\xc0\xf1\xde\x00\x6f" - "\xbf\x1e\xf4\x55\x9f\xf2\x31\x9e\x1b\x49\x6d\xfc\xb1\xec\xdc\x7f" - "\xa5\x95\x2b\x3f\x4a\x33\x2a\x2b\x62\xaf\x91\xe3\x61\x66\x52\xa6" - "\xb9\x46\x0a\xf0\x3c\x57\x4d\xbf\xb5\x40\xfe\xe5\xf8\x2c\xb4\x57" - "\xe1\x7f\x66\x7b\x3b\xdc\x8e\xcf\xd1\x0c\xc5\x6f\x00\x87\xed\xf8" - "\x3c\x78\x3f\x9b\x4f\x01\x51\x00\x9f\x09\x80\x7c\x87\xb8\x2d\xa3" - "\xc3\x68\xff\xce\x3a\xbc\xd7\xa6\x0c\xfa\x75\xe1\x66\xe2\xbf\x6b" - "\x33\x21\x05\x83\x88\xaa\x2d\xeb\x6f\x7b\x4c\x3e\x36\x6a\x0b\x83" - "\xa2\x03\x5a\x95\xe4\x77\x70\xae\xd4\x44\xe6\x07\xe3\x39\xe8\x57" - "\x16\x4f\x78\x81\xdf\xbe\xac\x7b\x7c\x33\xb8\xe0\xd1\x80\x49\xa3" - "\xc3\xac\x23\x7c\x4b\x02\x75\xa0\x2f\xd0\x6f\xf8\x90\xd1\xfe\x2d" - "\x8a\x0f\x0f\x7e\x02\x33\xe2\x34\xec\xa7\xd0\x1e\xef\xdd\xb0\x42" - "\x7f\x8d\x30\xef\xbd\x61\x86\x74\x44\xc6\x3b\x49\x56\xe5\xa9\xa8" - "\x52\xa2\x79\x16\xf9\xd0\x91\xb1\xbf\x9f\xc7\xdb\xee\x8f\x06\xee" - "\xd8\xf0\x9f\xe4\xb3\xda\x72\x12\x30\x8b\xf8\x38\xfc\xb1\x27\x12" - "\xe5\x74\x13\xa4\x97\x13\x65\x15\xcc\xd3\xd1\x7e\x9e\xf6\x18\xda" - "\xd0\x2b\x09\xda\xd5\x79\xe5\xab\xeb\xf6\x5d\xb3\x02\x2e\x35\xf9" - "\xe2\xfe\x6d\x4e\xbd\x22\x0e\xef\x99\x63\x11\xbe\x47\xb5\x0a\xdf" - "\xa3\x5a\xe9\xf7\xa8\x70\xfc\x16\x85\xdf\xa0\x52\x63\x79\xce\xbe" - "\x4c\x3b\x68\x7a\xac\x0f\x8f\x65\xe2\xf7\xa9\x01\xc0\xf5\xf9\x65" - "\xda\x81\xdb\x12\x48\x70\x95\xb9\x89\x18\x9a\xca\xc9\x8e\x24\x12" - "\xcc\xb7\xc6\xdd\x51\x51\x76\x8a\xf0\x9b\x97\xc5\x1e\x48\xd3\xfb" - "\xda\xd1\x9e\xd1\x1a\xd6\x3f\x70\x8d\x02\x6d\xf1\x03\xd7\x27\x90" - "\x31\xbb\xae\x91\xf0\x39\x8d\x19\xd4\x37\x13\xc6\xd1\xb3\xb5\x6a" - "\x35\x9d\xad\xda\xfb\x3a\x96\x69\xef\x09\x34\xb3\xef\x57\x2f\x2d" - "\x50\x13\xfc\x46\xc5\x67\xed\x4d\xdd\x85\x76\x64\x8b\x99\xd8\x82" - "\x56\xc4\xa1\x7e\xc2\x73\x87\xe1\x37\x8f\xf4\x95\x44\xcd\x5d\xd4" - "\x92\xca\x96\x6b\x64\x3c\xe8\x0d\xda\xf7\x0b\xeb\x99\x7d\xdf\xbe" - "\x69\x69\x1c\xda\xf8\xdb\x96\x69\x95\xd3\x2e\xc3\x78\x95\xf5\xb7" - "\xea\x8e\x91\xbe\x19\x27\xb4\x75\x38\x26\x84\x4b\xfd\xfe\xc3\x35" - "\x7d\xeb\xf7\x1f\x52\xfb\x3c\x7e\xf3\x02\x39\x99\xf7\x5e\x43\xb9" - "\x81\xfc\xae\x99\x95\x4f\x35\xf0\xb6\xca\x86\x77\x41\x3e\x46\x99" - "\x7c\xa8\x3c\x13\xac\xca\x4b\xf3\x40\x2e\x8d\x4c\x56\x15\x16\x90" - "\xd3\x31\x2c\x63\x9c\x7a\x1f\xc8\x1a\xe6\x39\xca\x0a\x6b\x1d\xf5" - "\x2d\x81\xf2\xda\xdb\x51\xee\xdb\x11\x1c\x92\x8b\xdf\x0e\xdb\x46" - "\xf8\x16\xb5\xe7\x69\x9b\x3a\x83\xb5\xd6\x6e\xbe\x23\x86\xa3\xbc" - "\x56\x2f\x20\xfe\x15\x0d\xa7\x09\x95\xd9\x52\x41\x66\xb8\xde\x6c" - "\x85\x76\xa0\xad\x4d\x3b\x68\x1b\xc8\xaa\x2a\xd1\x44\xb6\x5f\x23" - "\xc1\x86\x26\x23\x7e\x63\xb9\xe3\xa9\x67\x08\x79\xea\x1d\x9e\xab" - "\x2c\x3b\x4b\xe5\xb7\x1f\xe4\x67\x03\xf9\xe1\xb7\x45\x87\xfc\x92" - "\x40\x7e\x37\x40\x7e\x97\x25\xf9\xd9\xdb\x40\x7e\x6d\x20\xbf\x15" - "\x20\x3f\x8b\xab\xfc\xf6\xa1\x5d\x54\x85\xdf\x79\x50\x7e\xb8\xc6" - "\x99\x5b\xa1\x1d\x46\xbf\x3b\xbe\xa2\x25\xbb\x5e\x26\xfe\x63\xad" - "\x44\x91\x7e\x8c\xa8\xa1\x9e\xea\x5f\x40\xfb\x42\x79\xa0\xdf\xf5" - "\xc4\x50\x6a\x27\xab\x9e\x27\xf7\xa0\x3c\x6d\x82\x3c\x0d\xb6\x0f" - "\xc8\x8d\x36\xad\x12\xca\x8c\xd8\x76\x83\x4c\x9c\xda\xa8\x21\x27" - "\x66\x54\xc2\x18\xf2\x61\x3c\xb7\x65\x6c\x51\xdf\xfb\xe1\xb1\x89" - "\xbd\xef\x87\x1f\x7d\xf0\xcf\x7e\xd8\xd7\x7e\xf8\x51\x8c\xfb\x7e" - "\x78\xec\x8e\xbe\xf5\xc3\x63\xfe\xff\xec\x87\x3f\xa6\x7e\xa8\xb7" - "\xb8\xf6\x43\x07\x57\x48\x98\xbf\x68\xee\x82\xc5\x0b\x16\xff\x49" - "\xf3\xf2\xca\xc4\xf9\xcb\x18\x63\x90\x71\x06\xad\x9d\x8b\x54\xbe" - "\x05\xe3\xe9\x67\x61\x46\x72\x60\xa8\x51\xc9\xbd\x18\xa6\xe2\x73" - "\x5f\x2f\xe1\x72\xd7\x47\xbc\x05\xdc\x17\xfb\x6b\x1e\xf0\xda\x4b" - "\x8a\x4a\xcd\xa7\xc3\x80\xf3\x25\x34\x13\xfc\xcf\xf8\xd2\xef\x09" - "\xee\x15\xcc\xdf\xca\x37\xe1\x5e\xc1\x53\x51\x38\xf6\x1f\xdf\x76" - "\x67\x0c\x8c\xeb\x2f\x86\x91\xf6\x17\x63\x94\x6f\x9c\x25\xfe\x81" - "\x46\x32\x95\xe3\x78\x5e\x9f\xd6\x0c\x5c\xeb\xd4\x3c\xfd\x0b\xcd" - "\x44\x93\xe2\x0f\x79\xcb\x8f\x69\x52\xd6\xe0\xf1\x6d\x4d\x4a\xd6" - "\x79\x38\xce\xc7\x72\x37\x40\x79\xdc\xa8\x7e\xd5\xf8\x2d\x13\xfa" - "\xa2\x72\xe7\x56\xbe\xe1\xc0\x62\x93\x72\x6d\x07\x21\x6b\x53\x88" - "\x0a\x7d\x43\xe8\xef\xc1\x7a\x7c\x7a\x62\xba\xed\x3c\xbf\x1e\xae" - "\x7f\x74\xc9\xa4\x2c\x84\xeb\xe8\xb7\xd3\xa2\xae\xd5\xad\x83\xba" - "\x43\xbd\x4c\xdb\x43\xf9\x5a\x73\xc8\xe8\x30\x95\x86\x28\xdb\xb2" - "\x8e\x03\xff\x3a\x5c\x86\x1c\x22\x1b\xae\xbd\x01\xd7\xd8\x77\xb6" - "\x4f\x33\xec\x59\x1f\x1b\x11\xa7\x40\x5f\x15\x57\x14\x65\x4f\xb6" - "\xc3\x7b\x41\xb9\x66\xac\x0b\xc6\x91\xb5\xbd\xed\x5b\x64\x7f\xdb" - "\xb7\xc4\xba\x45\x6b\xed\x08\xd1\x36\x21\x86\xcd\x1c\x4d\xbf\x27" - "\x43\xfe\x4f\xe8\xba\xb2\xce\xe0\x21\x66\xe4\xd1\xad\xc1\x11\xe6" - "\xd6\xbc\x88\x8c\x53\xa9\x25\x02\x7e\x95\x2d\x7f\x2a\x5f\xc0\xaf" - "\x7c\xe8\x1f\x31\x80\x5f\x31\x5d\xf1\x8b\x7d\x7f\xb7\x13\x86\x63" - "\x95\x04\xe6\x1d\x0d\xd8\x3f\x90\x0b\xee\xeb\x80\xfe\x03\xba\x8f" - "\x3a\x4e\xf1\x0c\xb0\x4c\xec\x07\xd8\x47\x10\xb3\x68\x9f\x74\xe9" - "\x13\xd8\x0f\xee\x34\x13\x35\xf6\x03\xc4\x34\xec\x07\xb8\xae\xe5" - "\xad\x1b\xac\x1f\x04\xd6\x12\x35\xed\x0b\xb6\x72\xda\x17\xb0\xfe" - "\x15\x36\x17\x1c\x73\xea\x07\x1b\xc4\x7e\x20\xe2\x18\xe8\xba\x0d" - "\xfb\xc1\x0a\x79\x3f\x78\xb1\x4e\x4d\x28\xc6\x65\xed\x25\x05\xd0" - "\x0f\xaa\x74\x66\x62\x17\x71\x0c\xfa\x01\xee\xbb\xa1\x38\xf6\x67" - "\x01\xc7\xcc\x70\x1e\xf4\xbf\x70\xa1\x1c\xc7\xda\xdb\x7a\xe2\x13" - "\x27\x3e\xef\x1b\x8e\x9d\xa0\xfe\x0f\x50\x56\x28\x37\x94\x17\xca" - "\xe8\xa7\x24\x1f\xc4\x29\xbb\x7a\x69\xdc\x00\x90\xcd\x80\x16\x32" - "\x10\xf1\x0a\x71\x6a\xa7\x07\xf9\xc0\xbd\x2d\xf0\x7c\x37\x32\x7a" - "\x77\x46\x81\x13\x56\x21\x46\x21\x5e\x21\x4e\x21\x66\xe1\xfa\x02" - "\xe8\x0b\x4d\x88\x57\xbf\x48\x65\x38\x85\xf8\x95\xde\xc8\xb0\xab" - "\x32\x8e\x61\x56\xfa\x64\x72\x0f\xc6\xae\xb2\x07\x2d\x8d\xc3\x38" - "\x54\x06\xdb\x75\xd2\x2e\x60\xd6\xf6\x24\x32\x71\xda\x02\x0d\x41" - "\xac\x82\xb6\x3f\x72\x42\x7b\x9a\x50\xfe\xaf\xfc\x99\xdf\x4e\xe0" - "\xfd\xbb\x80\xf7\xe7\x0d\x22\xfe\x6d\x59\x9f\x16\x75\xe5\xfe\x9f" - "\x1e\x14\xb9\x3f\xf6\x59\xec\xbb\x26\x45\x19\xf5\xbf\xa6\x1f\xfa" - "\x08\x62\x0e\xfb\xa6\x93\x37\x2a\x92\xd9\xbf\x2b\xa9\x4e\xe0\xbc" - "\x59\x9a\x33\x97\x2b\xd8\xf7\x6c\x98\x23\x87\x0c\x99\xc2\x6f\xaa" - "\x4d\xc6\xb6\x14\xfa\x78\x0b\xbf\x65\x6c\x35\xea\xd4\x9c\xd1\xc4" - "\xdf\xb6\x65\x6c\x8d\x7d\xcb\x58\x23\xd3\xaf\xf2\x07\x4f\x24\x13" - "\x32\x33\xd9\x5b\xfd\x2a\x67\xb6\xd7\xbf\xc7\xfc\x8c\x7f\x31\x46" - "\xc5\xfd\x3d\xc6\x17\x74\x21\x6c\x89\x3d\x83\xdc\xc8\x7d\xca\x9a" - "\x6e\xe3\x9b\x34\x29\xe4\x7e\xa8\xd7\xa6\x53\x30\xdf\x3e\x95\x48" - "\x88\x21\x3a\x1e\xe4\xfa\x54\xf2\x01\xce\xac\x32\x29\x8e\xe7\xc3" - "\x9c\xbf\x09\xb0\x54\xe5\x8c\xa5\x0c\x37\x8f\xd3\xef\xd1\xd6\xdc" - "\xdf\xfb\x63\x59\xd3\xcb\x49\xa0\xe6\x09\x5c\x2f\x77\xea\xa1\x95" - "\xab\x09\xee\x01\xf5\x85\xff\x8a\xf6\xcd\x43\x93\xe1\xfe\x81\xfc" - "\xdf\x67\x28\x74\x4f\xc0\x78\xf2\xe2\x0c\x05\x7e\xbf\x7f\x37\x2d" - "\x5f\xc9\xc1\x39\xb6\x1e\x28\x9f\xe0\xf5\xf5\x1d\x2a\xca\x9b\x38" - "\xc8\x53\x65\xc9\x27\xeb\x93\xfc\x09\xe6\x67\x6b\xcc\xf2\x09\xe6" - "\xdf\x90\xa0\xa6\xdf\xff\xe9\x7d\xb6\x7c\x82\xf7\xda\xe1\xfc\x9b" - "\x5c\x00\xc9\x49\x09\x26\xa7\xa2\xab\x68\x19\xa7\xa2\x3f\x21\x58" - "\x06\x62\xf7\xa9\xe8\xa3\x64\x63\x52\x18\xf4\xf1\x7c\xb8\xfe\x15" - "\xd9\x78\x65\x18\x1c\x2f\xc1\xef\x06\x69\x56\x9c\x2c\x3a\x15\xcd" - "\x91\xc0\x35\xbf\xe3\x01\x5b\x78\x03\xee\x2b\x4c\x23\x7e\x97\x14" - "\x27\xe9\x1e\x60\x68\xc3\x5c\xdc\x77\x6e\x30\xe6\x12\x3e\xfd\xc5" - "\x16\x8e\x7f\xf1\x32\x97\xfe\xe2\x15\x7c\xbe\x9d\x7f\xf1\x2a\x3e" - "\x7f\x43\x8a\x46\x58\x77\x9a\x4f\xd7\xc8\xad\xbf\x31\x82\x60\x7d" - "\xf1\xd9\xf8\xcc\x8d\x09\x5a\xe1\xb9\x63\x68\xfd\xf0\xb9\x58\xae" - "\xf3\x73\x31\xae\xbb\xe6\x39\x7c\xee\xa9\xe1\x70\x0c\x02\x99\xe4" - "\xa1\x2c\xf0\xb9\x1c\x1f\xe3\xcb\xa7\xc7\xf8\xd0\x7b\x92\x9b\xdc" - "\xdd\x33\x53\xb8\x27\x97\xce\x9b\xe1\x9e\x0e\x96\x9f\x96\x01\xe3" - "\xdd\x52\x3c\xff\x40\x8c\x9e\x74\x95\xe3\x67\x03\xd8\xf8\x77\xaa" - "\x8e\x8d\x7f\x4c\xae\x54\x5f\x5e\x8c\xf1\x05\xd9\xa9\x71\xac\x84" - "\x32\x3e\x70\x94\xf1\xf7\x18\x1f\x94\x39\xea\x8e\xa8\x4f\xa8\x4b" - "\xa2\x1e\xd1\x7a\xea\x08\x71\xd6\x1b\xf8\xef\x2f\x94\x63\x17\xcb" - "\x81\x3a\x10\x51\x97\x1e\x80\xeb\x5d\x75\xa9\xe2\x8c\xa4\x4b\x15" - "\x2b\xad\x69\x3c\x8f\xba\xa4\x7f\x21\x13\xca\xf9\x6c\xb2\x54\x9f" - "\x19\x54\xcf\x7e\x62\xfa\x55\x24\xca\xea\x81\x54\x12\xcc\xde\xa9" - "\x62\x08\x7d\xa7\x54\x7d\x30\xd6\x57\x7c\x17\xac\x47\x0e\xa7\x21" - "\xe2\xbb\x6c\xec\x18\x01\x65\x5f\x21\xc2\x3d\xd3\xb0\x7c\xb1\x1d" - "\x40\x6e\x44\xbc\x47\xcc\x9f\xc3\x69\xa1\xee\x63\xe8\x3d\x4c\xef" - "\x2e\xb9\xd1\xa1\x8a\x6d\xae\x7a\x77\x67\x2a\x01\x02\x0b\x9c\xe9" - "\x85\x6b\xf8\x1c\x26\xff\xd4\x8f\xec\x1d\xf0\x0c\x90\x83\x52\x38" - "\x5f\xe9\xa4\x17\x42\xf9\x56\x77\xe5\xb7\xcb\xca\x8f\x81\xf2\x93" - "\xa1\x7c\xe4\x64\x2f\xa0\xfd\xab\x92\xae\x87\x7b\x20\x99\x95\x2f" - "\xea\x2e\x9f\x3b\x38\x5a\x97\x82\x6b\x35\x2b\x8f\x30\x5c\x3d\xfe" - "\x18\xe6\xa3\x6b\x84\x94\x5c\x11\xe7\xb2\x46\xc8\x79\x0d\xd9\x81" - "\x34\xb3\xb0\x3e\xa8\x92\xee\x6d\x02\x9c\xb5\x20\xb7\xdc\x77\xc9" - "\xa8\x94\xd6\x08\x9d\xc5\xeb\x6f\xeb\x93\xea\x9d\xd6\x08\x55\x26" - "\xb3\xbe\x5f\x59\x0d\x73\x48\x25\xa4\xd7\xb3\xf3\xc7\x23\x9d\xcf" - "\x4b\x6b\xf0\xd8\x79\x5c\xdf\x2c\xd8\x5c\x5b\x8e\x97\xa2\xcd\xad" - "\xb2\x49\xb4\x73\x7a\x98\xa3\x7a\xc1\x7d\x8d\x5a\x89\xfb\x1a\xb5" - "\x9e\xb9\x6f\xd5\x96\xee\xb9\xef\x69\x9d\xc4\x7d\xbf\xfc\x9c\xf5" - "\xfd\x2f\x3f\x60\x7d\xff\xcb\xe5\xb4\x2d\x43\xf9\x26\xfb\xbf\x4f" - "\x32\x55\xa9\x08\xd5\xa1\x5d\xc0\x31\x0e\xa4\x18\x5d\xb8\x2f\xae" - "\xad\xfa\xe2\xf4\xd3\xc0\x7d\x61\x7c\x8b\x66\xed\x50\x55\x07\x6d" - "\xef\x63\xb0\x5a\x09\x9e\x87\xb1\xad\x01\x79\xef\x51\xce\xa8\x2c" - "\x84\xf6\x83\x9f\xca\x12\x3c\xa9\xc4\x99\x17\xb7\x65\x19\x02\xdc" - "\xf3\xe1\x2f\x72\x6d\x32\x3e\x6c\x78\x5e\xe4\xc3\x58\x3f\xe4\xc0" - "\xc8\x87\x6d\x68\xc7\x1c\xe9\x5b\x82\x7c\xd8\xb6\xc5\x99\x0f\x7f" - "\x1e\xe2\xe0\xc3\xa1\x4e\x7c\x38\x59\xe4\xc3\x86\xd7\xfe\xc9\x87" - "\xbf\x2f\x1f\xf6\x34\xaf\xaf\xbe\xd0\x37\x3e\x5c\x6d\xfa\xdf\xc2" - "\x87\xdd\xce\xdb\xdd\xc8\x07\xf4\xb9\xc5\xe6\x86\x0f\xf3\xc0\x87" - "\x77\x75\xc3\x87\xb1\x1f\x20\x17\xa6\xf3\xf6\x79\xc0\x39\x00\x03" - "\x90\x03\x8b\x9c\x18\x79\x30\xf2\x61\xe4\xbf\xc8\x95\xa9\xfc\x82" - "\x24\xf9\x75\xe5\xc3\xd5\x15\x12\x1f\x1e\xf4\x5d\x81\x8c\x0f\x7f" - "\x51\xd2\x95\x0f\x7f\x51\xd6\x95\x0f\x1b\x34\x12\x1f\xae\x2a\x93" - "\xf3\x61\xe3\x99\xae\x7c\xf8\xcb\x20\x4f\x7c\x18\x39\x30\xf2\x61" - "\x9c\x2f\x20\x17\x86\xff\x46\x49\xbf\xbe\x7c\xac\x6f\x7c\xf8\xcb" - "\xc8\xde\xf1\xe1\x2f\x77\xbb\xe7\xc3\x55\x79\x9e\xf9\x70\x55\x9e" - "\x7b\x3e\x7c\xfa\x31\x89\xc3\x9c\x1e\xf0\xe3\xe7\xc3\x35\x25\xee" - "\xf9\x4a\xcd\x21\xe4\x04\xd0\x86\x45\xc8\x87\x6f\x2e\x17\xfe\xb2" - "\xc8\x3d\x17\x3e\x3d\x96\x71\x86\x2f\xf7\x74\xe5\xc2\x70\x8f\x5b" - "\x2e\x7c\x7a\xae\x70\x8f\x83\x5f\x31\x2e\xcc\xca\x80\xf1\x6f\xb5" - "\x67\x2e\xfc\xd5\x10\x36\x1e\x9e\xfe\x86\x8d\x87\x4c\xa6\x5d\xb9" - "\xf0\xe9\x63\x3d\x73\x61\xa6\x43\xb4\x9e\x1e\xb9\xf0\x57\x77\x74" - "\xe5\xc2\x55\x79\xee\xb9\xf0\xd7\x17\x24\x3d\xfa\x7a\x8d\x9c\x0b" - "\x7f\xf5\xcc\x4f\x83\x0b\x7b\xd4\xad\x12\x39\x0f\xfe\x7a\xb8\xf7" - "\x3c\xf8\xeb\x99\xde\xf1\x60\xd4\x39\x77\x3c\xf8\xeb\xdd\xae\x3a" - "\x27\xe7\xc1\x5f\x7f\xe8\x9e\x07\x7f\x7d\x5a\xce\x83\xb1\x7c\x77" - "\x3c\xd8\xa8\x90\x95\xdf\x85\x07\x1b\xef\x96\xf3\x60\x96\x4f\xe2" - "\xc1\xc6\x32\x81\x6b\x3d\xea\x3d\x0f\x36\xbe\xdd\x3d\x0f\x36\xee" - "\x93\xf3\x60\x63\x06\xe3\xbb\x46\x23\xe3\xc1\xc6\x3c\x76\xbe\x6a" - "\xa2\xf3\x79\x89\x07\xb3\xf3\x5d\x79\xb0\xd1\xdc\x03\x0f\x8e\xe8" - "\x3d\x0f\xbe\x58\x5a\xee\xe0\xc1\x17\x4b\x45\x1e\xcc\x29\x81\x5f" - "\xc2\xd8\x0f\xbf\x26\x5c\xf7\x8f\x7d\xee\x92\xe2\xcc\xee\xee\xb9" - "\xb0\xc9\x22\x71\xe1\xf3\x93\x59\xdf\x3f\x3f\x9a\xf5\xfd\x73\xdf" - "\x38\xb8\xf0\x7d\x93\x4c\x95\xeb\x1c\x5c\xd8\x78\x20\xa5\xda\x85" - "\x0b\x63\xdb\x9d\xa3\x5c\x78\xe3\x0d\xba\x5e\xc3\x84\xe3\xf9\xd3" - "\xa9\xe7\xf9\xf5\x30\x86\xc3\x18\x66\x62\xed\x7b\xee\xa1\x82\xad" - "\x7c\xad\xc4\x97\xcf\x0e\x70\xf0\xe5\x54\x6a\x43\x36\x52\xbe\xfc" - "\x6a\xb5\x72\x27\x94\x0f\x3f\x15\x72\x65\xe4\xcc\xc0\x95\x6b\x76" - "\x6e\xe5\xab\x0b\xb7\xf2\x15\x6d\x59\x67\x23\x45\xce\xbc\x01\xce" - "\xe5\xc0\xb9\x32\x40\xbb\x9d\x37\xe8\x4f\x05\x6d\x5f\xbb\x16\x9e" - "\x89\xf7\x41\xde\x78\x31\x2f\x8c\xd3\x35\x8c\x5b\xd7\x59\x38\x3f" - "\x67\x6e\x7d\xf6\x90\xc8\xad\x73\xe0\x7d\x91\x43\x89\xdc\x9a\x03" - "\x6e\xcd\x87\x30\x7b\xb3\x9c\x5f\xd7\x2e\x17\xf9\x75\x8e\x33\xbf" - "\xd6\x89\xfc\xfa\x6c\x63\x1f\xf9\xb5\xf1\x7f\x33\xbf\x46\x6e\x8d" - "\x7c\x1a\xb9\x35\x72\x6d\xe4\xd7\xc8\xb5\x39\x81\x5f\x17\x3a\xf3" - "\x6b\x3f\x27\x7e\xad\x70\xe6\xd7\xb5\x8f\xf5\x8d\x5f\xd7\x46\x3a" - "\xf3\x6b\x90\x9b\xd1\x5b\x7e\x8d\x32\xee\xf2\x3d\x13\xd7\xdb\x80" - "\x9c\x50\x26\xdd\x7e\x17\x13\xe4\x85\xf2\x41\xd9\xa0\x8c\x7a\x25" - "\x1f\xd0\xaf\x0a\xeb\xed\xe3\xd7\x5a\x17\x7e\x8d\x7c\x1a\xda\xae" - "\x01\x79\xb6\x41\x0f\x6d\xb3\x14\xb8\x36\xf0\xec\x9e\x39\x76\xed" - "\x18\x67\x8e\x5d\x38\xc8\x99\x63\x9f\x0b\xee\xca\xb1\xcf\x69\x9d" - "\x38\x76\x8d\x49\x71\x96\xae\x41\xd7\xbf\x8a\xdc\xf9\x8c\x45\xce" - "\xaf\x1b\x16\x74\xe5\xd7\xe7\x96\x7a\xe2\xd7\xb8\x4e\xcc\xd5\xde" - "\xcc\x85\x88\xf6\xe6\x73\xbb\xfb\xc6\xaf\xcf\x15\x49\xfc\xff\x4c" - "\x35\x1b\x23\xce\x79\xe4\xdc\x6d\x6a\x67\xce\x7d\x3e\x44\xe2\xdc" - "\x89\x4e\x9c\xfb\x4c\x91\x67\xce\x7d\x86\x3e\x8f\x57\xff\xde\x1f" - "\xcb\x42\xae\x84\xb6\x0a\x0d\xdd\x17\x6e\x3a\x81\x7c\x09\x6d\x10" - "\xf0\x4e\xc0\x99\x4c\x9b\x9c\xb9\x37\x7e\xaf\xeb\x8e\x1f\xe9\x5e" - "\x25\xf7\x20\x47\x42\x7e\x24\xf2\x59\xcc\x8f\x3c\xe9\xd6\x72\x24" - "\x53\xb8\x7b\x8e\x64\x7a\x94\xf2\x5f\xba\x9f\xf0\x7c\x30\x8e\x75" - "\x37\x97\x83\x9f\x0f\x76\xcf\xc1\x4d\xef\x33\xbe\x72\x3e\x0c\xe5" - "\x22\xe7\xe0\x70\x8f\x5b\x0e\x6e\x6a\x14\xee\x09\x96\x73\x70\x56" - "\x46\xbd\xe2\x82\xc2\x33\x07\xbf\xb0\x93\x8d\xc3\x17\x16\xb1\x71" - "\x58\x90\x71\x17\x0e\x7e\xc1\xc9\xfe\x1b\xe3\x83\xf2\xef\xca\xc1" - "\x99\x4e\xd1\x7a\x7a\xe4\xe0\x17\x36\x74\xe5\xe0\x67\x8a\x90\x83" - "\xbb\xd7\xab\x8b\x4b\xe5\x7a\x75\x31\xc8\xca\x89\x5c\xfc\x0d\x2c" - "\xaf\xce\x95\x8b\xff\x04\x75\x2d\x5c\xe2\xe3\xf8\x4e\xf5\xef\x7b" - "\xc7\xc7\xe9\x3d\x8d\xde\xf1\x71\xd4\x3f\x77\x7c\xfc\xe2\x83\xae" - "\xfa\x27\xe7\xe3\x17\xa7\xb9\xe7\xe3\x17\xe7\xcb\xf9\x38\x96\xef" - "\x8e\x8f\x5f\xdc\x24\x2b\xbf\x0b\x1f\xbf\xb8\x4f\xce\xc7\x59\x3e" - "\x89\x8f\x37\x08\xfb\xb2\xcf\x4c\xf6\x9e\x8f\x37\x3c\xd4\x3d\x1f" - "\x6f\x78\x54\xce\xc7\x1b\xd4\x0c\x53\x1b\xe2\xac\x94\x8f\x37\x8c" - "\x60\xe7\xcf\x44\x39\x9f\x97\xf8\x38\x3b\x6f\x75\xe6\xe3\x7a\xe4" - "\xe3\x0d\x19\x3d\xf0\xf1\xa8\xde\xf3\xf1\xab\x7a\x89\x8f\x5f\xd5" - "\x77\xcf\xc7\x1b\x1f\xec\x9e\x8f\xb7\xd8\x24\x3e\xfe\xed\x34\x86" - "\x03\xdf\x3e\xc8\x70\xa0\xf9\x3b\x0f\x7c\xbc\xc2\x3d\x1f\x6f\xae" - "\x73\xe2\xe3\xb5\xc8\xc3\x61\xcc\xab\x45\x1e\x80\xeb\x35\x80\x87" - "\x1b\xf5\x09\x34\xdf\x49\xe4\xeb\xc8\xd1\xe1\xba\x69\x3d\xfe\xe7" - "\xe8\x3d\x35\xb8\x1e\x8a\xf2\xf2\x4b\x94\xc3\xd7\x30\x99\x34\x8f" - "\x86\x7b\xab\x25\x0e\xdf\xf8\xb9\x0b\x87\xaf\xe8\x86\xc3\x97\x03" - "\x87\x2f\x03\x0e\xaf\x6f\xcb\xba\xa4\x72\xe2\xf0\x65\xc0\xe1\xf5" - "\x2e\x1c\xde\x08\x1c\xbe\x16\xef\xc3\x7b\x20\xff\x04\x59\x7e\xa8" - "\x2b\xcd\x7f\x8d\xfe\x30\x7f\x35\xe4\xaf\x61\x9c\xff\x52\xac\x13" - "\xe7\x2f\x67\x9c\xff\x9b\x26\x5e\xc6\xf9\x2f\xed\xf3\x9e\xf3\x37" - "\x2d\xe8\x9e\xf3\x5f\x3a\xd3\x47\xce\x5f\xf1\x4f\xce\xdf\x13\xe7" - "\x6f\x7a\xa8\x6f\x9c\xbf\x69\x82\x0b\xe7\xaf\xf8\x27\xe7\xff\x21" - "\x39\x7f\x93\xc6\xc1\xf9\x33\x07\x7d\xb7\x0b\x39\xff\x66\x91\xf3" - "\x37\xfb\x77\xe5\xfc\xcd\xc3\x9c\x38\x7f\xb9\x49\x01\xad\xec\xe0" - "\xfc\x8d\xa5\x72\xce\x6f\x5e\xda\x95\xf3\x37\xcf\xef\x1b\xe7\x6f" - "\xde\xd2\x37\xce\xdf\x9c\xc7\xea\x87\xdf\x03\x1b\xb3\xd9\x38\xd4" - "\x3c\x41\x9a\x07\x34\xc6\x3a\x9f\xeb\x79\x1e\xf0\xed\xdd\xee\xe7" - "\x01\x8d\xe1\x9e\xe7\x01\x8d\xe1\x9e\xe7\x01\x2d\x95\x72\xbe\xd6" - "\xb2\xed\xa7\x31\x0f\x68\x89\x70\xcf\xcd\x5a\x26\x4b\xf3\x80\x6f" - "\x87\xdd\xfc\x79\xc0\xb7\xc3\xdc\xcf\x03\x5a\x0e\x31\x9e\xf4\xad" - "\xa6\xeb\x3c\x00\xee\x71\x3b\x0f\x68\xb9\x2c\xdc\x33\x4c\x3e\x0f" - "\x60\x65\xd4\x2b\x2e\x3b\xec\xdf\x5d\x65\x7a\xf9\x6d\x36\xfe\x5f" - "\x5e\xce\xc6\x7f\x41\xc6\x5d\xe6\x01\x97\xa7\xf5\x3c\x0f\x60\x3a" - "\x45\xeb\xe9\x71\x1e\x70\x79\x4b\xd7\x79\x40\x63\xb8\xe7\x79\xc0" - "\xd5\x95\x72\xbd\xba\x3a\x44\x3e\x0f\xb8\xdc\xf8\xd3\x99\x07\x78" - "\xd4\xb5\x08\xf9\x3c\xe0\xca\x21\xef\xe7\x01\x57\x2e\x7b\x37\x0f" - "\x40\xfd\x73\x37\x0f\xb8\xfa\xb0\xab\xfe\xc9\xe7\x01\x57\x67\xba" - "\x9f\x07\x5c\x5d\x24\x9f\x07\x60\xf9\xee\xe6\x01\x57\xb7\xc9\xca" - "\xef\x32\x0f\xb8\xfa\x81\x7c\x1e\xc0\xf2\x49\xf3\x00\xf3\x2c\xc1" - "\x0e\x73\xda\xfb\x79\x80\xf9\xd1\xee\xe7\x01\xe6\xc9\xf2\x79\x80" - "\x39\x8c\x61\xaa\x59\xc7\xe6\x01\xe6\x31\xc2\xfc\xa0\xc6\xf9\xbc" - "\x34\x0f\x60\xe7\xbb\xce\x03\xcc\xd9\x3d\xcc\x03\x02\x6c\x7b\x7c" - "\x8b\x3a\x46\xf8\x96\x74\x06\x47\x54\x3f\xd0\xf0\x3b\xbb\xc3\xbf" - "\x7e\x2c\x8c\xe9\xb5\xc0\x1d\xe6\x12\x25\xee\x69\x4f\xfb\x1c\x38" - "\xdb\x5c\xb6\x96\x1e\x79\xc2\xfe\x24\xe4\x09\x7a\x5f\xf4\x07\xd8" - "\x91\x17\x92\x6b\x1b\xe3\xaf\x47\xae\xd0\xbe\xc7\x37\xc3\x9a\xa7" - "\x6d\x6a\xc7\x75\xf4\xf1\x44\x39\xa7\xc5\x3d\x77\x58\x55\xcb\x73" - "\xa0\xf3\xfe\xd3\x67\x31\xde\x50\x19\xd7\x48\xf5\x18\x39\x03\xee" - "\x75\x30\x58\x8c\x94\x43\x04\xc4\x46\x92\x82\x34\x12\x3c\xa0\x85" - "\xa8\x07\x28\x14\x7e\x4f\x41\xeb\xdb\x81\x3f\x4c\x1e\xcd\x73\x0f" - "\xcc\x8b\x44\x9f\x34\x03\x19\x87\x28\xf5\xb5\x09\x1c\xe2\xcd\x1b" - "\x64\xcc\xce\x24\xe0\x0e\x95\x12\x77\x68\x17\xb9\x9d\x13\x6f\x78" - "\xe9\xb2\x9a\xec\xcc\x94\xaf\xa3\xef\xdc\x24\xf1\x06\xe4\x0c\xfc" - "\x1c\x2d\x19\x6f\x65\xeb\x24\x52\x9e\x61\x6b\x51\xc7\x34\xc0\xbc" - "\x64\x36\xf1\xaf\x88\xad\xc7\xbd\xe6\x61\x15\x0d\x6f\x93\x95\x4f" - "\x92\x7b\x6c\xc8\x13\x32\xf9\x92\x8a\x86\x2d\x04\xfd\xed\x01\x5f" - "\x8c\xc8\xbf\x41\x26\xe2\x78\x3c\x75\x2e\xe3\x0b\x6c\x2c\xbe\x36" - "\xfc\x84\xf6\x04\xf1\x9e\xeb\x5d\xa3\xdf\xdf\x3d\xee\x63\xdd\xe3" - "\x5b\x62\x1b\xe1\x9b\x61\x07\x59\x32\x3f\x8b\xe3\xd4\xdc\xbf\x47" - "\x99\xf7\x83\x1e\xbe\x57\xdf\xa4\x40\x9f\xd1\x18\x3f\x91\xdb\xeb" - "\xaf\x97\xc9\xa6\x53\x90\x4d\x27\x93\x0d\xca\x65\xb6\x8e\xa0\x7f" - "\xbe\x81\x28\x13\x83\xd5\x48\xb8\x55\x62\x0c\xc5\x70\x52\xc8\x31" - "\x79\xd8\x3b\xe3\xee\xe0\xa0\xed\xd1\x0f\x15\xe8\x03\xe5\x70\xeb" - "\x31\xae\xe2\x1a\xc5\x00\xe4\x70\xa0\xdf\xfd\x77\x75\x80\x1c\x2e" - "\x30\x39\xf0\x99\x6a\x7a\xb4\xad\xd2\x6a\xa0\xec\xfb\x3a\x3b\x41" - "\x16\x56\x57\x59\xec\x4d\xc5\xf8\x8b\xe8\x23\xce\xb6\x89\xf9\xc1" - "\xa3\xb2\x58\xa5\x1d\x86\x7e\x26\xe8\x5e\x94\x4e\x2d\xe2\xa5\xba" - "\xf0\x12\xee\xa1\x61\x32\xb0\x0b\x6d\x8f\xb1\x18\xb1\xbd\x91\x9f" - "\x19\x80\x97\xd1\xbd\x21\x59\xe6\x82\xce\xb7\x7d\x33\x70\x0d\xcb" - "\x15\x45\xeb\xce\xbe\xf1\xa0\xd6\x82\xdb\xdf\xf6\x9a\x9f\x60\xdb" - "\x5f\x8b\x93\xda\xfe\xfa\x90\xbe\xb5\xfd\xf5\xb0\xdb\xdf\xf6\xea" - "\x9f\x60\xdb\xb7\x36\x48\x6d\x7f\xa3\x8f\xfc\xff\x46\x5e\x77\x6d" - "\xff\xff\xd9\xfb\xfe\xb8\x28\xea\xfc\xff\x37\x33\x8b\xa2\xa2\x80" - "\xc1\xee\x6a\x5a\x6b\x87\xb6\xdc\x69\x62\x61\xe1\x9d\x5e\x58\x78" - "\xe1\xa5\x82\xa5\x85\xa6\x89\x8a\xb5\x16\xea\xfa\x1b\x7f\x01\x7a" - "\xda\xa9\x87\x08\x05\x7e\xb0\x50\xb1\xac\xd3\x0e\x8d\x3a\xec\xb0" - "\xd3\x6b\xbd\xf4\x73\x58\x08\xd8\x47\xef\xac\x83\x6b\xf3\xd0\xd0" - "\xd0\x56\x45\xf9\xb5\xbb\xf3\x7d\xbd\xe7\x3d\xcb\xec\xec\xce\x2c" - "\x3b\xb3\x4a\xd8\xd7\x3f\xe6\x01\x3b\xf3\x9e\xf7\xbc\xdf\xaf\xe7" - "\xf3\xfd\x7a\x3f\x5f\xef\x79\xbf\xdf\x83\xc7\x91\x1c\x63\x48\x8e" - "\xf1\x23\xdc\xc7\x91\x58\xc5\x1e\xcb\xcf\x69\xb4\xc7\x3a\xcf\x69" - "\x3c\x19\x8b\xd7\x76\x3b\xe6\x34\x36\xce\xf5\x3c\x6e\xd4\xba\x91" - "\x1f\x37\x6a\x3e\x4f\x74\x63\xf3\x09\xa2\x1b\x9b\xd9\x35\xde\x78" - "\x2d\x4f\xda\x45\x44\x7d\xb0\xcc\x4c\xe1\x3d\x6e\xb7\x40\xff\x8a" - "\x6d\x0c\x9a\xeb\xfe\x4b\x7e\xcd\x7e\x78\x4c\xe8\xd3\x9b\x66\x2a" - "\x1b\xae\xb1\x7d\xd8\x03\xb1\x96\xa2\xbe\x16\x3f\xdc\x8f\xe1\x7d" - "\x45\x19\xa7\xf5\x7a\xb6\x81\xfe\xc5\xd7\xdf\xf5\x2f\x74\xac\xc3" - "\xb1\xe5\x45\x57\x59\xf7\x07\x98\x44\x39\x83\xd7\x01\x02\x6f\xf0" - "\x9a\x3d\x07\x77\x58\xce\xb4\x40\xdc\xdb\x54\x87\xc7\x0c\x42\x83" - "\xea\x50\x30\x03\x9c\x79\x61\x1f\x94\xd3\x99\x37\xd9\x12\xbc\xd9" - "\x2e\xe4\xcd\x75\x8e\x37\xc0\x1f\x9e\x37\xfc\x1a\x3e\x24\x8b\x37" - "\xf5\x1c\x6f\x72\x5c\x78\x73\x59\x87\xbe\xa8\xae\xe1\x78\x73\x23" - "\xc9\x3a\xd0\xc1\x9b\xa6\x93\xc7\xa7\x01\x6f\xa6\xc9\xe5\x4d\x53" - "\xb9\x30\x96\xb5\x5f\x75\x8f\x65\x9b\x87\xb9\xc6\xb2\x8e\xd8\xf5" - "\x7a\xd8\x90\xaa\xeb\x10\xbf\x36\xb4\xc5\xaf\xcd\x93\x95\xf1\xb7" - "\x79\x92\x77\x73\xc2\x9a\x0f\xba\xce\x09\xdb\x9f\x86\xe3\xd2\xc6" - "\x14\xcc\x2d\xf1\xb8\x94\x5c\x73\x9f\xcb\xd3\x3a\x85\x9f\xcb\xd3" - "\x3a\xb0\xf3\xcf\x09\x6b\x39\x26\x1e\x1f\xb4\x9c\x24\x7a\xb3\xb9" - "\xe4\xf6\xac\x91\x68\x2e\x11\x8f\x45\x5b\xc7\x10\xad\xde\x5c\xea" - "\x3e\x2f\x0c\xee\x11\x8d\x45\x5b\x57\x70\xf7\x94\x08\x63\x51\x92" - "\x07\xf8\x90\x3c\xe9\x58\xd4\x3a\x8c\xf8\x14\xab\x1f\xf1\x29\x04" - "\x57\xf7\x58\xb4\xf5\xab\xf6\xe7\x85\x11\x1e\xb1\xe5\x94\x8c\x45" - "\xad\x03\xdc\x63\xd1\x46\x83\xf8\xbc\x30\x9b\x8d\xe7\x92\x6d\x87" - "\x70\x5e\x98\x75\xee\x9d\x31\x2f\x4c\x92\x5f\xc7\x1c\x58\xf1\x73" - "\xc3\x6c\xa3\xe4\xcf\x0d\xb3\x2d\x94\x17\x83\x62\xde\x89\xc5\xa0" - "\xb6\x23\xae\xbc\x13\xc6\xa0\xb6\xaf\xc4\x63\x50\xdb\x55\x61\x0c" - "\x8a\xf3\x17\x8b\x41\xed\xfd\x05\xf9\xbb\xc5\xa0\xf6\x11\xc2\x18" - "\x94\xa4\xe3\x63\x50\x7b\x35\xf1\xa5\x8d\x21\xf2\x63\x50\x3b\x3b" - "\xaf\x6d\xff\x9b\xe4\x5d\x8f\x30\xfe\xb4\x1f\x17\xc6\x9f\xf6\x7c" - "\xd2\xee\xed\x16\x32\x2f\xcc\x5e\x44\xce\x37\x06\x3b\x9f\xe7\xe3" - "\x4f\x72\x1e\xcf\x0b\x23\xf3\xc1\x18\x24\x2f\xee\x1c\xda\x09\xe3" - "\xce\x48\x0f\x71\x67\xe4\x9d\x19\x77\x52\x68\xbb\xa2\xb8\x93\x42" - "\xf9\x3f\xbe\xfe\xbe\x13\x63\x1f\x26\xb4\x4d\x7f\x53\x54\x98\x22" - "\xfd\x42\x51\xa1\x3f\xbe\xed\xef\xc0\xd8\x67\x33\x32\xf3\xb6\xa7" - "\x73\x94\xd9\x9e\xce\x56\x1c\xfb\x50\x3d\x62\xda\x62\x1f\xf8\x5f" - "\x32\xf6\xa1\x54\x73\x3c\xc6\x3e\x54\xc0\xfa\xb6\xd8\x87\xea\xf2" - "\x2d\xab\x53\xa8\x2e\xc7\x59\x9d\x42\x75\xd9\xd0\x6e\xec\x43\xf9" - "\xdb\xee\xc6\x3e\x32\x62\x9f\xcd\xd4\xb4\xb6\xd8\x87\xf2\x3f\xa1" - "\x28\xf6\xa1\xfc\x85\x6b\xc5\xa9\x1e\x97\xdd\x62\x1f\xaa\xcb\x10" - "\xaf\x63\x1f\xaa\xcb\x44\x65\xfc\xed\x92\xe0\x55\xec\x43\x75\xf9" - "\x50\x34\xf6\xa1\x54\x06\xc9\xd8\x87\xbb\xe6\xa6\x57\xa9\x80\xc9" - "\x6d\x7a\x95\x0a\x18\xd0\xe9\x63\x1f\xaa\xab\x49\x54\x9b\x52\x5d" - "\x4f\xb0\x5a\x87\xea\x52\x7c\x5b\x62\x1f\xc8\x57\x34\xf6\xa1\x02" - "\x46\xb3\x1a\x91\xea\x52\xe2\x16\xfb\xe0\x7b\xc4\x62\x1f\x2a\x60" - "\x29\x77\x4f\xb1\x20\xf6\xe1\xf2\x00\x1f\x92\x23\x19\xfb\x50\xdd" - "\x86\x10\x9f\x12\x60\x23\x3e\x85\xe0\xea\x16\xfb\x50\x01\x67\xda" - "\x8d\x7d\x38\x1e\xb1\xe5\x94\x8a\x7d\xa8\x6e\xfd\xdd\x62\x1f\x4a" - "\x95\x2c\x1a\xfb\x50\xdd\x9b\x79\x2e\x75\xdf\x2e\x88\x7d\xa8\x6e" - "\x73\xee\x88\xd8\x47\x9a\x5f\x26\xb7\xd8\x87\xea\x3e\x42\x76\xec" - "\x43\x75\x9f\x27\x2b\xf6\x61\x79\x27\x12\xfb\x50\xdd\x0f\xb9\xf2" - "\x4e\x10\xfb\x50\xdd\xcf\x88\xc6\x3e\x54\xf7\xcb\x82\xd8\x87\xcd" - "\x5f\x24\xf6\xa1\x7a\xf4\x11\xe4\xef\x1a\xfb\x50\x3d\x86\x0b\x62" - "\x1f\x2e\x5d\x5b\xec\x43\xf5\x38\x4b\x7c\xa9\xaa\xa7\xec\xd8\x87" - "\xea\x71\x48\x32\xf6\xa1\x7a\x1c\x15\xc4\x3e\x54\x8f\x5c\xd2\xee" - "\x7b\xd4\xb3\xb1\x0f\xd5\x63\x2f\x39\xaf\x0a\x74\x3e\xdf\x16\xfb" - "\x70\xe7\xdb\x62\x9f\xcd\x3d\xac\xf2\x62\x9f\xfb\x3b\x61\xec\xa3" - "\xf3\x10\xfb\xe8\xee\xd0\xd8\xa7\x67\x9e\xb2\xd8\xa7\xa7\xc7\xf1" - "\xef\xbb\xfa\x5b\x4a\x7f\x07\x06\xf3\xfa\x3b\x28\x44\x99\x7e\x09" - "\x0a\x56\xae\xbf\xd5\x26\x5e\x7f\xab\x4d\xd2\xfa\x3b\xe8\xbc\x67" - "\xfd\x1d\xaa\xe2\xf5\x77\xef\x99\xa4\xaf\xec\x3d\x86\xf4\x95\xbd" - "\xfd\xdb\xd7\xdf\x21\x6b\xee\xea\x6f\x39\xfa\xbb\x67\x35\xaf\xbf" - "\x43\xc6\x2a\xd3\xdf\x21\x71\x42\xfd\xad\x99\xe7\xae\xbf\x43\xf6" - "\x7b\xaf\xbf\x43\x4e\x29\xe3\x6f\x48\x95\x77\xfa\xbb\xf7\x30\x71" - "\xfd\x1d\x54\x27\xad\xbf\xc9\x35\x77\xcd\x74\xcf\x19\x5e\x33\xdd" - "\xb3\xbb\xf3\xeb\xef\x7b\x62\xc4\xf5\xd1\x3d\x63\x49\x7f\xdb\x3b" - "\xf2\xf6\xe8\xef\xde\x91\xe2\xfa\xfb\x9e\xa3\x44\xa7\xf4\x8e\x72" - "\xd7\xdf\x70\x8f\xa8\xfe\xbe\xe7\x06\x77\x4f\xa4\x50\x7f\x93\x3c" - "\xc0\x87\x84\x48\xeb\xef\xd0\xfd\xc4\xa7\x84\xae\x21\x3e\x85\xe0" - "\xea\xae\xbf\x43\x27\xb7\xaf\xbf\x09\x8f\xd8\x72\x4a\xea\xef\xd0" - "\x1d\xee\xfa\x3b\xa8\x56\x5c\x7f\xab\x57\xf0\x5c\x52\xf7\x11\xea" - "\xef\x50\xb7\xf9\x6f\x77\x18\xbf\x62\xdc\xf5\x77\x98\xcc\xf9\x6f" - "\xec\x3d\xf2\xe6\xbf\xb1\xbc\x13\xd3\xdf\xea\x11\xae\xbc\x13\xea" - "\x6f\xb5\xf8\xfc\x37\x4a\x2d\x9c\xff\xc6\xe6\x2f\xa6\xbf\xd5\xdb" - "\x05\xf9\xbb\xe9\x6f\xb5\x70\xfe\x1b\x97\x8e\xd7\xdf\x0e\xbd\x1b" - "\xb4\x45\xbe\xfe\xd6\x8c\x90\xd6\xdf\x9a\xd1\x42\xfd\xad\x09\x25" - "\xed\x5e\x93\x42\xf4\xb7\x46\x4f\xce\x07\x65\x3a\x9f\xe7\xf5\x37" - "\x39\xcf\xeb\x6f\xcd\x6a\x79\xfa\x3b\xa8\x13\xea\xef\x60\x0f\xfa" - "\x3b\xf8\x0e\xd5\xdf\x7d\xc2\x94\xe9\xef\x3e\x1e\xc7\xbf\x3d\x6b" - "\x40\xdd\x31\x5e\x03\xea\x8e\x49\x6b\xc0\x3e\x17\x3d\x6b\xc0\xfb" - "\x02\x78\x0d\xd8\x6f\x0e\xf1\xd7\xfd\xc6\x12\x7f\xdd\xaf\x5b\xfb" - "\x1a\xf0\xde\xb5\x77\x35\xa0\x1c\x0d\xa8\xc9\xe6\x35\xe0\xbd\xe3" - "\x95\x69\xc0\x7b\xc7\x09\x35\xe0\x00\xf7\xb5\x14\xd4\xbd\x1f\x7a" - "\xaf\x01\xef\x3d\xa3\x4c\x03\xde\x7b\xda\x3b\x0d\xd8\x6f\xb8\xb8" - "\x06\xec\x53\x2f\xad\x01\xc9\x35\xf7\x7e\xbb\x3f\xbf\xaf\x22\xd5" - "\xff\xdd\xce\xaf\x01\xfb\xc7\x8a\xf7\xd1\xfd\xc7\x13\x9f\xdf\x2f" - "\xea\xf6\x68\xc0\x7e\x51\xe2\x1a\xb0\xff\x71\xd2\x57\xf6\x8b\x76" - "\xd7\x80\x70\x8f\xa8\x06\xec\xdf\xcc\xdd\x13\x25\xd4\x80\x24\x0f" - "\xf0\x21\x61\xd2\x1a\xf0\xbe\x0f\x89\x4f\xb9\x6f\x2d\xf1\x29\x04" - "\x57\x77\x0d\x78\xdf\x94\xf6\x35\x20\xe1\x11\x5b\x4e\x49\x0d\x78" - "\xdf\x6e\x77\x0d\xd8\xa7\x4e\x5c\x03\xea\xd6\xf0\x5c\xd2\xf5\x17" - "\x6a\xc0\xfb\x2e\xde\x19\x1a\x50\x92\x5f\xb1\xee\x1a\xf0\xfe\x23" - "\xf2\x35\xe0\xfd\x57\xe5\x69\x40\xcc\x3b\x31\x0d\xa8\x1b\xe5\xca" - "\x3b\xa1\x06\xd4\x4d\x11\xd7\x80\xba\x85\x42\x0d\x88\xf3\x17\xd3" - "\x80\xba\x1d\x82\xfc\xdd\x34\xa0\xee\x90\x50\x03\x92\x74\xbc\x06" - "\x1c\x40\xd6\x40\x50\x7d\x72\xe4\x6b\xc0\x01\xa3\xa4\x35\xe0\x00" - "\xe1\xfa\x07\x6a\x00\x59\xff\x40\x0d\x30\x12\x0d\x38\x80\xac\x7f" - "\xa0\xfa\x64\x3b\x9f\xe7\x35\x20\x39\xcf\x6b\xc0\x01\xed\xad\x7f" - "\x6e\x47\x37\x44\x04\xf2\xba\x21\x22\xd0\x59\x37\x9c\x38\xe6\xac" - "\x1b\x1e\x18\xe0\x59\x37\x0c\x9a\xc4\xeb\x86\xf0\x83\xa4\x8d\x87" - "\x6f\x27\x6d\x3c\x9c\xc5\xb2\xf5\xbd\xae\x55\x6b\x4e\x22\xea\xc0" - "\x95\x52\xea\x0f\xcb\x90\x2a\x73\x19\xe8\x06\xd0\x6a\xc6\xa9\x58" - "\x37\xfc\xec\xd4\xf8\xd5\xdf\x30\x81\x05\xa0\x49\x6b\x39\x8d\x6a" - "\x04\x8d\x5a\x0b\xbf\xa1\xbd\x1c\x99\x5f\x4a\x55\x80\x8e\xcc\x06" - "\x1d\xc7\xae\x99\x65\xd7\xd3\x9a\xfd\xd9\xef\x1d\x5c\x69\x62\xbf" - "\x9d\xe3\xf5\x77\x28\x6a\xb9\xef\x50\x24\x0b\xbf\x43\x81\xbf\x3f" - "\x81\xbf\x45\x51\xb0\x08\x85\x62\x8d\x8a\xb5\x44\xaf\xb5\x7e\xbd" - "\xf0\xb7\x28\x7a\x35\x10\x1d\xba\xdf\x5e\x46\x74\xe8\x62\x6d\xf7" - "\xcc\x6b\x68\xf0\xce\x6b\xbc\x86\x78\x03\xeb\x87\xc5\x7a\x5d\xc3" - "\x62\xfd\x7d\xd7\xaf\xeb\x1f\x70\xff\x06\xc5\xfb\x93\xf0\x37\x28" - "\xf0\x77\xfb\xac\x9c\x0e\x65\x5e\xd6\xa3\x5d\x2f\x81\xa6\xa9\x47" - "\x7e\x0f\xe1\xfd\xc0\xfb\x41\xd9\x4f\xa2\x60\xdb\x75\x7d\x3f\xe7" - "\x7d\x0f\xa1\xec\xc1\xf6\xeb\x7a\x54\x9e\xf4\x35\xbb\x4e\xd3\xca" - "\xad\xd3\xb4\x2c\xd6\x53\x90\x67\xf4\x9b\x8b\x9c\x74\x68\x98\x43" - "\x87\xfe\x6c\x87\x32\x1d\xfa\xb3\x02\xa1\x9e\x88\x38\xe4\xae\x27" - "\xc2\xdd\xf6\xff\x96\xd6\x13\xe1\x03\x95\xe9\x89\xf0\x70\xef\xf4" - "\x44\xf8\x06\x57\x3d\xb1\x0f\xaf\xb3\xa4\x1e\x08\xc7\x9c\x13\xd7" - "\x13\xe4\x9a\x7b\x1f\x30\x68\x20\xdf\x07\x0c\xbc\xda\xf9\xf5\xc4" - "\xc0\x5c\x71\x7f\x3f\x70\x07\xbb\xc7\x21\x15\xbe\xfe\x96\xef\x71" - "\x08\x79\x8a\x6b\x89\x41\x21\xc4\xe7\x86\xaf\x77\xf4\x35\xbc\x96" - "\x80\x7b\x44\xb5\xc4\xa0\x31\xae\xf7\x10\x2d\x11\xbe\x91\x68\x89" - "\x41\x33\xa5\xb5\xc4\x20\x1b\xf1\x33\x83\x4e\x12\x3f\x43\x30\x75" - "\xd7\x12\x83\xde\x6d\x5f\x4b\x10\x0e\xb1\xe5\x94\xd4\x12\x83\x2e" - "\xbb\x6b\x89\x07\x74\xe2\x5a\x42\x7f\x9c\xe7\x91\x7e\x8e\x50\x4b" - "\x3c\x38\xfc\xce\xd0\x12\x92\xdc\xca\x15\xea\x08\xbd\xbf\x7c\x1d" - "\xa1\x1f\x21\x4f\x47\x60\xce\x89\xe9\x08\xfd\x06\x8e\x3f\x1b\xc5" - "\x75\x84\x7e\xb7\xb8\x8e\xd0\x1f\x12\xea\x08\x9c\xbf\x98\x8e\xd0" - "\x9f\x17\xe4\xef\xa6\x23\x22\xfc\x84\x3a\x82\xa4\xe3\x75\x44\xc4" - "\x1e\x2e\x26\x3b\x21\x5f\x47\x44\x6c\x90\xd6\x11\x11\x5b\x84\x3a" - "\x22\x22\x89\xe8\x85\x88\x52\xa2\x23\x22\x96\x70\xfa\xa2\xcc\xf9" - "\x3c\xaf\x23\xc8\x79\x5e\x47\x44\x94\xdd\x5d\x3f\xd9\x19\xc7\x92" - "\x7e\x31\x53\x59\x1f\xfe\x8b\xa4\x1f\xff\x5d\xee\x1d\xb8\x7e\x72" - "\x73\x44\x35\xff\x2e\x77\x70\x8d\x32\xdd\x32\xb8\xfa\xc7\xb7\xfd" - "\x1d\x38\x87\x78\xf3\x2f\xf6\xf2\xb6\x7f\x68\x8a\x32\xdb\x3f\xe4" - "\xf9\xfb\xb7\x77\xe7\x30\x48\xd8\x7e\x48\x38\x6f\xfb\xa1\x0a\xc7" - "\xff\x86\x9e\x56\x3e\x7e\xfd\x58\x2e\x1f\x87\x3e\x96\x2b\x3d\x7e" - "\x1d\xb9\xcf\x73\x1c\x1a\x55\xcd\xc7\xa1\x8f\x8c\x22\xfa\xf0\x91" - "\x01\x44\x1f\x3e\xcc\xee\xe5\x6f\x7d\xe0\x49\x33\x19\xbf\x36\x89" - "\x8c\x5f\x3f\x3c\x05\xef\x7d\xd5\xb6\x27\x16\x15\x79\xde\x79\x4f" - "\xac\xbf\xc1\x3d\x77\xc7\xb5\xbd\x19\xd7\x7e\xa8\x90\x1f\xd7\x7e" - "\x78\xa0\xb2\x71\xed\x87\xc3\x85\x71\x68\xf4\x68\xf7\x38\xf4\xe1" - "\x4d\xde\xc7\xa1\x0f\xef\x57\xc6\xeb\x87\x8b\xbc\x8b\x43\x1f\xe9" - "\x29\x3e\xae\x1d\x59\x84\x39\x27\x1e\x87\x92\x6b\xee\xf1\x43\xd4" - "\x7e\x3e\x7e\x88\x5a\xd1\xf9\xe3\xd0\xa8\x7e\xe2\xb1\x42\xd4\x40" - "\x12\x87\x3e\x12\x78\xeb\xe3\xd0\x47\x02\xc5\xe3\xd0\x28\xee\xfd" - "\xef\x23\xc1\xee\x63\xda\x70\x8f\x68\x1c\x1a\x75\x92\xbb\x27\x50" - "\x18\x87\x92\x3c\xc0\xaf\x5c\x94\x8e\x43\x87\x6f\x20\x7e\x66\xf8" - "\x64\xe2\x67\x08\xa6\xee\x71\xe8\xf0\x21\xed\xc7\xa1\x84\x43\x6c" - "\x39\x25\xe3\xd0\xe1\x4b\xdd\xe3\xd0\xc8\xbd\xe2\x71\xe8\x63\xe3" - "\x79\x1e\x3d\x7a\x59\x18\x87\x0e\x3f\x72\x67\xc4\xa1\x92\xdc\xea" - "\x27\x8c\x43\x1f\xdd\x22\x3f\x0e\x7d\xf4\xa8\xbc\x38\x14\x73\x4e" - "\x2c\x0e\x7d\xac\xa7\x2b\xe7\x84\x71\xe8\x63\x11\xe2\x71\xe8\x63" - "\xa3\x85\x71\x28\xce\x5f\x2c\x0e\x7d\x6c\x9e\x20\x7f\xb7\x38\xf4" - "\xb1\x4d\xc2\x38\x94\xa4\xe3\xe3\xd0\xe8\xc1\x5c\x7f\x36\x51\x7e" - "\x1c\x1a\xdd\x53\x3a\x0e\x8d\x0e\x13\xc6\xa1\x8f\xd5\x91\x78\x33" - "\x3a\x86\xc4\xa1\x8f\x59\xc9\xf9\xc8\x04\xe7\xf3\x7c\x1c\x4a\xce" - "\xf3\x71\x68\x74\xc2\xdd\xf5\x94\x9d\x31\x0e\x1d\x71\x51\x59\x1c" - "\x3a\xa2\xee\xc7\xd7\xe3\x77\x62\x2c\x14\x9d\xcc\xeb\xf1\x5f\xcd" - "\x51\xa6\x5b\x7e\x95\xfc\xe3\xdb\xfe\x4e\x8c\x85\x7e\x19\xc9\xdb" - "\x7e\xe4\xb7\xca\x6c\x3f\xd2\xac\x3c\x16\x8a\x2d\xe4\x63\xa1\xd8" - "\x42\xe9\x58\x68\xd4\x41\xcf\xb1\xd0\xe8\x3a\x3e\x16\x8a\x19\x4b" - "\x34\x4a\xcc\x10\xa2\x51\x1e\xbf\xdc\x7e\x2c\xf4\xf8\x1c\x61\x2c" - "\x34\xea\xea\xdd\x58\x48\x49\x2c\xf4\xab\x22\x3e\x16\x7a\x7c\x98" - "\xb2\x58\xe8\xf1\x48\x61\x2c\x34\x66\xbc\x7b\x2c\xf4\x78\x9e\xf7" - "\xb1\xd0\xe3\x87\x94\xf1\xfa\xf1\x52\xef\x62\xa1\x98\x3e\xe2\xb1" - "\xd0\xa8\x52\xe9\x58\x88\x5c\x73\xd7\xb0\xa3\x0f\xf1\x1a\x76\xf4" - "\x86\xce\x1f\x0b\x8d\xd6\x8b\xeb\xd5\xd1\xc3\x48\x2c\x14\xa3\xbd" - "\xf5\xb1\x50\x8c\x56\x3c\x16\x1a\xfd\x2e\xd1\x8d\x31\xfd\xdc\x63" - "\x21\xb8\x47\x34\x16\x1a\xfd\x15\x77\x8f\x56\x18\x0b\x91\x3c\xc0" - "\xaf\xdc\x90\x8e\x85\x9e\xc8\x21\x7e\xe6\x89\x99\xc4\xcf\x10\x4c" - "\xdd\x63\xa1\x27\x46\xb4\x1f\x0b\x11\x0e\xb1\xe5\x94\x8c\x85\x9e" - "\x58\xeb\x1e\x0b\x8d\x2a\x11\x8f\x85\x62\xf9\xbd\x8a\xa8\x27\x9b" - "\x85\xb1\xd0\x13\x27\xee\x8c\x58\x48\x92\x5b\x7a\x61\x2c\xf4\xe4" - "\x76\xf9\xb1\xd0\x93\x27\xe5\xc5\x42\x98\x73\x62\xb1\x50\x6c\x1f" - "\x57\xce\x09\x63\xa1\xd8\xe1\xe2\xb1\x50\xac\xf3\xfe\xb7\x5c\xfe" - "\x62\xb1\x50\xec\x0a\x41\xfe\x6e\xb1\x50\x6c\x9e\x30\x16\x22\xe9" - "\xf8\x58\x68\x4c\x34\xd7\x9f\x4d\x97\x1f\x0b\x8d\xe9\x23\x1d\x0b" - "\x8d\x19\x20\x8c\x85\x62\x1b\x48\xcc\x33\x66\x1c\x89\x85\xc6\x70" - "\xe7\x47\x4d\x73\x3e\xcf\xc7\x42\xe4\x3c\x1f\x0b\x8d\x99\x76\x77" - "\x7d\x65\x67\x8c\x85\x7e\x73\x43\x59\x2c\xf4\x9b\x86\xbb\x7a\x5c" - "\x89\x1e\x1f\x63\xe4\xf5\x78\xdc\x42\x65\xba\x25\xce\xa8\x5c\x8f" - "\x27\x44\xf2\x7a\x3c\x21\x52\x5a\x8f\x8f\x1d\xe3\x59\x8f\x8f\x4f" - "\xe5\xf5\xf8\xd3\x5f\x91\x7e\xf2\xe9\x23\xa4\x9f\x7c\x7a\x4d\xfb" - "\x7a\xfc\xb7\x37\x84\x7a\x7c\xec\xda\xbb\x7a\x5c\x89\x1e\x7f\x6a" - "\x24\xaf\xc7\x7f\x7b\x54\x99\x1e\xff\xad\x49\xa8\xc7\x13\x6a\xdc" - "\xf5\xf8\xd3\x03\xbd\xd7\xe3\x4f\x8f\x55\xc6\xeb\xa7\xe3\xbc\xd3" - "\xe3\x4f\xef\x13\xd7\xe3\x63\xe3\xa4\xf5\x38\xb9\xe6\xae\xa3\xc6" - "\x8f\xe5\x75\xd4\xf8\xb0\xce\xaf\xc7\xc7\x95\x8a\x6b\xa6\x71\x47" - "\x89\x1e\x7f\x7a\xef\xad\xd7\xe3\x4f\xef\x15\xd7\xe3\xe3\x87\x13" - "\xed\xf2\x74\x91\xbb\x1e\x87\x7b\x44\xf5\x38\x78\x43\x72\xcf\x5e" - "\xa1\x1e\x27\x79\x80\x5f\xd9\x20\xad\xc7\x27\x0c\x20\x7e\x66\xfc" - "\x55\xe2\x67\x08\xa6\xee\x7a\x7c\xfc\x89\xf6\xf5\x38\xe1\x10\x5b" - "\x4e\x49\x3d\x3e\x21\xc4\x5d\x8f\x8f\x8d\x15\xd7\xe3\xf1\x17\x79" - "\x1e\xc5\x6f\x12\xea\xf1\x09\x53\xee\x0c\x3d\x2e\xc9\xad\x52\xa1" - "\x1e\x8f\x8f\x90\xaf\xc7\xe3\xa7\xcb\xd3\xe3\x98\x73\x62\x7a\x3c" - "\x7e\x9f\x2b\xe7\x84\x7a\x3c\xfe\xb8\xb8\x1e\x8f\xaf\x11\xea\x71" - "\x9c\xbf\x98\x1e\x4f\xe8\x26\xc8\xdf\x4d\x8f\x27\x0c\x14\xea\x71" - "\x92\x8e\xd7\xe3\x09\x65\xc4\x87\xc6\x5d\x96\xaf\xc7\x13\xf6\x49" - "\xeb\xf1\x84\x0f\x85\x7a\x3c\x61\x3d\xd1\xdd\x09\xd5\x44\x8f\x27" - "\xe4\x93\xf3\x71\xf5\xce\xe7\x79\x3d\x4e\xce\xf3\x7a\x3c\xa1\xfe" - "\xee\x7a\xcb\xce\xa8\xc7\x9f\xd9\xa0\x4c\x8f\x3f\xb3\x5e\xb9\x26" - "\x9c\xca\xef\xf7\x0d\xff\x4b\x6b\xc2\x67\xa7\x78\xd6\x84\xcf\x67" - "\xf2\x9a\x70\xf2\x65\xe2\xab\x27\x9f\x22\xbe\x7a\x72\x4e\xfb\x9a" - "\x70\x72\x37\xa1\x26\x7c\x36\xef\xae\x26\x54\xa2\x09\x27\x22\x5e" - "\x13\x4e\x3a\xa3\x4c\x13\x4e\x3a\x2d\xd4\x84\x53\xdd\xf7\x01\xa7" - "\x26\x8f\xf0\x5e\x13\x4e\x9e\xae\x4c\x13\x4e\x9e\xe6\x9d\x26\x9c" - "\x7c\x44\x5c\x13\x3e\x3b\x4d\x5a\x13\x92\x6b\xee\x7d\xf9\xf3\xd3" - "\xf9\xbe\xfc\xf9\x88\xce\xaf\x09\x9f\x2b\x17\xef\xb7\x9f\x3b\x43" - "\x34\xe1\xe4\xc3\xb7\x5e\x13\x4e\x3e\x2c\xae\x09\x9f\x1f\x4b\xfa" - "\xcf\xc9\x26\x77\x4d\x08\xf7\x88\x6a\xc2\xe7\xd7\x70\xf7\x1c\x16" - "\x6a\x42\x92\x07\xf8\x95\xed\xd2\x9a\x30\x71\x38\xf1\x33\x89\xfe" - "\xc4\xcf\x10\x4c\xdd\x35\xe1\xf3\x35\xed\x6b\x42\xc2\x21\xb6\x9c" - "\x92\x9a\x30\x71\xa0\xbb\x26\x7c\x36\x51\x5c\x13\x4e\xe1\xf7\x00" - "\xa7\xa6\x08\xf7\x00\xa7\x12\xe7\xdd\x19\x9a\x50\x92\x5b\xe5\x42" - "\x4d\x38\x45\xfe\xfe\xdf\xd4\x14\x79\xfb\x7f\xb3\x9c\x13\xd3\x84" - "\x53\x8e\xb8\x72\x4e\xa8\x09\xa7\x88\xef\xff\x4d\x4d\x11\xee\xff" - "\xcd\xe6\x2f\xa6\x09\xa7\xf6\x17\xe4\xef\xa6\x09\xa7\x0a\xf7\xff" - "\xe6\xd2\xf1\x9a\x70\x6a\x35\xd7\x9f\xf9\xc9\xd7\x84\x53\xa5\xf7" - "\xff\xa6\xa6\x0a\xf7\xff\xa6\xa6\x92\xfd\xbf\xa9\xa9\x64\xff\x6f" - "\x6a\x2a\xd9\xff\x9b\x7a\x16\x39\x9f\xe7\x35\x21\x39\xcf\x6b\xc2" - "\x17\xda\xdd\xff\xdb\xb3\x8e\x98\xb5\x87\xd7\x11\xb3\xf6\x38\xeb" - "\x08\xe1\xfa\xcb\x17\x76\x7b\xd6\x11\x33\xea\x79\x1d\xf1\x22\xf9" - "\xde\x2c\xf5\x22\xf9\xde\x2c\x35\x9d\xc5\xac\x15\xda\x38\x59\x7f" - "\x59\x4c\x81\xa6\xe3\xd7\x5f\xbe\x88\x75\xc4\xf4\xb9\xe3\x05\x3a" - "\xe2\x85\x6f\xd9\xb5\x98\x58\x4b\x34\x34\x21\x7c\x4d\x7c\x5d\x66" - "\x71\xc7\xae\xcb\xbc\xf9\x53\x58\x97\x39\x7d\xb8\x32\xbd\x3a\x3d" - "\x4a\xa8\x2f\x66\x4f\x74\xd7\x17\xd3\xb7\x7b\xaf\x2f\xa6\x1f\x51" - "\xa6\x2f\xa6\x1f\xf6\x4e\x5f\xbc\xd8\x5f\x7c\x5d\xe6\x0b\x7b\x5a" - "\x25\xf5\xc5\x0b\xec\x7c\x07\xf7\x7e\x61\xc6\x11\xbe\x5f\x98\xb1" - "\xa9\xf3\xeb\x8b\x19\x83\xc5\xfb\x80\x19\xc3\x89\xbe\x78\xb1\xdf" - "\xad\xd7\x17\x2f\x8a\x7f\xef\x92\x9a\xc1\xc5\xff\x2f\xb6\x7d\xbb" - "\x92\xd7\x17\x2f\x8a\x7f\xef\x92\x9a\x51\xe3\x7a\x0f\xd1\x17\x2f" - "\xea\x88\xbe\x98\xd1\x2c\xad\x2f\x92\xf2\x88\xff\x49\x9a\x43\xfc" - "\x0f\xc1\xd4\x5d\x5f\x24\x8d\x6a\x5f\x5f\x10\x0e\xb1\xe5\x94\xd4" - "\x17\x49\x1b\xdc\xf5\xc5\x0b\x85\xe2\xfa\x62\x96\x93\x4e\x9d\x69" - "\x13\xea\x8b\xa4\x93\x77\x86\xbe\x90\xe4\xd6\x60\xa1\xbe\x98\xb9" - "\x43\xbe\xbe\x98\x79\x4a\x9e\xbe\x78\x51\xfc\x1b\x97\xd4\x2c\xae" - "\xff\x27\x7c\x71\xd7\x17\xb3\x46\x88\xeb\x8b\x59\x13\x85\xfa\xe2" - "\x45\xf1\x6f\x5c\x52\xb3\xd6\x08\xf2\x77\xd3\x17\xb3\xb6\x0b\xf5" - "\x05\x49\xc7\xeb\x8b\xd9\x23\xb9\x7e\x6e\xac\x7c\x7d\x31\xbb\xbf" - "\xb4\xbe\x98\x3d\x50\xa8\x2f\x66\x35\x11\x1d\x31\x3b\x81\xe8\x8b" - "\xd9\x81\xe4\xfc\x0b\x71\xce\xe7\x79\x7d\x41\xce\xf3\xfa\x62\x76" - "\x92\x8c\x31\xa7\xd3\x72\xd6\x65\xee\xbf\x29\x1c\x73\x72\x8c\x37" - "\x59\x07\x07\x1c\x6b\x1b\x73\x82\xbe\x5e\xea\x9b\xd8\x78\xcc\x09" - "\xf7\xdd\xfc\x98\x53\x0d\xeb\xab\xf8\x31\x27\x33\x3b\xe6\x84\xc7" - "\x9b\x20\x3e\x6f\x1b\x6f\xb2\x2f\x77\x5f\x93\xb9\xdf\x2e\x7f\xbc" - "\xe9\xc5\x85\xc1\x68\x27\xdb\x7f\x1f\x28\x21\xe3\x4d\x67\xdb\xc6" - "\x9b\x70\xbf\x6d\x6b\x74\x1f\x6f\xc2\xfd\x35\x3f\xde\xf4\xb5\xc2" - "\xf1\xa6\x64\x85\xef\x7f\x93\x3b\xc1\xfb\xdf\x3b\x71\x4d\xe6\xec" - "\x25\xfc\xfb\xdf\x97\x14\xbe\xff\x7d\xc9\xe3\xfb\xdf\xbb\xf3\x90" - "\xa5\x6c\x3f\x67\x24\x6f\xfb\x97\x2f\x2b\xb3\xfd\xcb\xf5\x3f\xbe" - "\xed\xef\xc4\x79\x0f\x2f\x95\xf2\xb6\x9f\x3b\x57\x99\xed\xe7\x1a" - "\x94\x8f\x71\x2f\x8c\xe3\x63\xd3\x85\x71\xd2\xb1\xe9\x2b\xa3\x3c" - "\xc7\xa6\xf3\xb3\xf9\xd8\x34\xe5\x2a\xd1\x86\x29\x67\x88\x36\x4c" - "\xc9\x73\x8c\x71\x93\xd8\xd4\x44\x61\xff\x8e\xc7\xae\x33\xc1\xa7" - "\xff\x01\xe2\xb2\x2d\x10\xa7\xfe\x61\x11\xc4\xaa\x46\x14\x50\x59" - "\x7b\x04\x19\xd3\x70\xbc\x9a\xd2\x33\x3e\xd5\x39\x5e\x7d\x65\x8b" - "\x23\x56\x8d\x87\x7b\x3f\x9d\x6f\xa2\x70\x4c\x6a\x0b\x23\xe3\xd8" - "\xd9\x90\x8f\x63\xfc\x1b\xf7\x7f\x07\xe6\x43\x6c\xfa\x8a\x70\x0c" - "\xbc\x75\x7f\xc0\xb1\xd6\xb0\xe8\xd3\x78\x1c\xbc\xf9\x5d\xff\x62" - "\xc7\x58\xb8\xa7\x31\x70\xcc\x2d\xd7\x71\xf0\x3b\x77\x0c\xdc\x10" - "\xc5\x8f\x81\xbf\xfa\x95\xb2\x31\xf0\x57\xcf\x0a\x63\xd4\x85\x37" - "\xdc\x63\xd4\x94\x51\xde\xc7\xa8\x29\x33\x95\xf1\x3e\x25\xc9\xbb" - "\x18\x35\xe5\xa8\x78\x8c\xfa\x4a\x8c\xf4\x18\x38\xb9\xe6\x1e\x5b" - "\xcc\x9f\xc9\xc7\x16\xf3\x87\x74\xfe\x18\x75\x5e\x95\x78\x1c\x31" - "\xef\x2b\x12\xa3\xa6\x98\x6e\x7d\x8c\x9a\x62\x12\x8f\x51\xe7\x8f" - "\x27\x7a\x3e\xc5\xe4\x1e\xa3\xc2\x3d\xa2\x31\xea\xfc\xb5\xae\xf7" - "\x90\x18\x35\xe5\x18\x89\x51\xe7\xef\x90\x8e\x51\x17\x8c\x20\x7e" - "\x68\x41\x37\xe2\x87\x08\xa6\xee\x31\xea\xfc\x6f\xdb\x8f\x51\x09" - "\x87\xd8\x72\x4a\xc6\xa8\x0b\x22\xdc\x63\xd4\x57\x46\x8a\xc7\xa8" - "\x0b\xfd\x78\x1e\x19\x77\x0b\x63\xd4\x05\x0b\xef\x8c\x18\x55\x92" - "\x5b\x55\xc2\x18\xd5\x38\x5a\x7e\x8c\x6a\x5c\x2a\x2f\x46\xc5\x9c" - "\x13\x8b\x51\x8d\xdc\xfe\xe7\x84\x2f\xee\x31\xaa\xb1\x46\x3c\x46" - "\x35\xde\x10\xc6\xa8\x38\x7f\xb1\x18\x75\xe1\x00\x41\xfe\x6e\x31" - "\xea\xc2\x51\xc2\x18\x95\xa4\xe3\x63\xd4\x85\x66\xe2\x43\xe7\x9e" - "\x97\x1f\xa3\x2e\x3c\x2a\x1d\xa3\x2e\x3c\x21\x8c\x51\x17\x16\x90" - "\x58\x74\x61\x03\x89\x51\x17\x16\x93\xf3\x73\x6b\x9d\xcf\xf3\x31" - "\x2a\x39\xcf\xc7\xa8\x8b\x54\x32\x62\xd4\xb3\xb7\x28\x46\x2d\xbb" - "\xb3\x62\xd4\x62\x43\xc7\xc6\xa8\x8b\x15\x7e\xff\x72\xb1\xb7\xdf" - "\xbf\x3c\xdd\x8e\x56\x3f\xf6\xff\x97\x56\x5f\xa4\xe5\xb5\xfa\x52" - "\x85\xdf\xbf\x5c\xea\xed\xf7\x2f\x6f\x9b\xed\xef\x3c\xbb\x2f\x76" - "\xfa\xf6\xe5\xb2\x2d\xca\xec\xbe\x2c\xf3\x6e\x7c\xaa\xc4\xf6\x4b" - "\xa7\xf1\xb6\x4f\xed\xa6\xcc\xf6\xa9\x01\xca\xe3\xd3\x8c\x00\x3e" - "\x3e\xcd\x08\x70\x8e\x4f\xcb\x04\x73\xb0\x52\x6b\x3c\xc7\xa7\x6b" - "\x12\xf8\xf8\x74\x15\xb7\x3f\xf5\xaa\x3c\xa2\x0b\x57\xb1\xdf\xa2" - "\x68\xc6\xf1\xe9\x68\x88\x4f\x2f\x65\xb7\xc5\xa7\x38\x1e\x1d\xdf" - "\xf4\x0d\x83\xdf\xa5\x42\x7c\xaa\xda\x74\x05\xa9\x20\x66\x45\x95" - "\xd5\x07\x51\x26\xc4\xab\x9b\xaf\x40\xcc\x9a\x02\x31\xab\x75\x07" - "\x17\xb3\xae\x3c\x29\x8c\x59\x57\x8c\x16\xc4\xac\xaf\x64\xb3\x31" - "\x2b\xc4\xa1\x26\x6b\x5e\x74\x15\x8e\x59\xad\x10\x8f\xb6\x0e\x09" - "\x38\x96\x7d\xc5\x25\x7e\x7d\x05\xe2\xd7\x97\x84\xf1\x6b\x4b\x5e" - "\xf4\xd9\xe6\xfd\x01\x65\xec\x3c\xae\x81\xde\xc5\xaf\xae\xb1\x6b" - "\x01\x37\x87\xeb\xad\x3b\x32\x7e\x5d\x76\x9a\x8f\x5f\x57\x6e\x57" - "\x16\xbf\xae\xcc\x17\xc6\xaf\x19\x07\xdd\xe3\xd7\x95\x36\xef\xe3" - "\xd7\x55\x03\x94\xb5\x8b\x55\x3a\xef\xe2\xd7\x55\x6b\x5d\xe3\xd7" - "\xbd\xec\x1c\xae\x54\x73\xb3\x64\xfc\x9a\x5a\x2d\xfe\x8e\x75\xcd" - "\x00\x3e\xee\x58\x7d\xb9\xf3\xc7\xaf\xab\xb3\xc5\x63\x8c\xd5\xdb" - "\x49\xfc\xba\x2a\xe3\xd6\xc7\xaf\xab\x32\xc4\xe3\xd7\x35\xdc\xfe" - "\x2f\xab\x32\xdc\xe3\x57\xb8\x47\x34\x7e\x5d\x33\xda\xf5\x1e\x12" - "\xbf\xae\x5a\x4f\xe2\xd7\x35\xd3\xa5\xe3\xd7\x35\xcd\xc4\x4f\xad" - "\x39\x41\xfc\x14\xc1\xd4\x3d\x7e\x5d\xb3\xbb\xfd\xf8\x95\x70\x88" - "\x2d\xa7\x64\xfc\xba\xe6\xa2\x7b\xfc\x9a\x5a\x2d\x1e\xbf\xa6\x1f" - "\xe5\x79\x94\x3e\x53\x18\xbf\xa6\x0d\xbb\x33\xe2\x57\x49\x6e\x65" - "\x0b\xe3\xd7\x74\x3f\xf9\xf1\x6b\xfa\x70\x79\xf1\x2b\xe6\x9c\x58" - "\xfc\x9a\xce\x8d\x7f\x10\xbe\xb8\xc7\xaf\xe9\x3b\xc4\xe3\xd7\xf4" - "\x83\xc2\xf8\x15\xe7\x2f\x16\xbf\xa6\x7f\x2b\xc8\xdf\x2d\x7e\x4d" - "\xb7\x09\xe3\x57\x92\x8e\x8f\x5f\x33\x0a\x89\x0f\x4d\xdd\x20\x3f" - "\x7e\xcd\x58\x2b\x1d\xbf\x66\x6c\x12\xc6\xaf\x19\xdc\x7a\xda\x8c" - "\x12\x12\xbf\x66\x18\xc9\xf9\xd4\xf5\xce\xe7\xf9\xf8\x95\x9c\xe7" - "\xe3\xd7\x8c\x63\xf2\xde\xb1\xfa\xb4\xe7\xd0\xb1\x8e\x9f\xd7\x7f" - "\xab\xf6\x1c\x72\xbc\x67\xed\xa8\x79\xfd\xeb\xa6\x2b\x8b\x61\xd7" - "\x4d\xbb\x1b\x47\xc9\xd5\xf2\x19\x67\x79\x2d\xff\x3b\x85\xfb\x7f" - "\xfe\xce\xe3\xfe\x9f\x77\xe3\x28\x29\xdb\xaf\xdb\xc3\xdb\x7e\xc3" - "\x44\x65\xb6\xdf\x90\xa0\x3c\x8e\xda\xe2\xb4\xbe\x79\x8b\x60\x7d" - "\xb3\xf0\x3d\xdf\x6b\x03\x3d\xc7\x51\x9b\x9d\xd6\x37\x6f\xe4\xd6" - "\x37\x6f\xe4\xd6\x37\x6f\x6c\x5b\xdf\x2c\xef\x3d\xdf\xef\x6f\x08" - "\x63\xa6\xd7\x96\xde\x7d\xcf\xe7\x6b\x9c\xb4\xbe\x1f\x1f\x27\xfd" - "\x5e\xe1\xfa\xe7\xdf\x9b\x84\x71\xd2\x16\x91\xf5\xcf\x1b\x65\xac" - "\x7f\xde\xa8\x70\xfd\xf3\x46\x2f\xd7\x3f\x6f\x74\x5b\xff\x4c\xde" - "\xf3\xbd\xa6\x97\x7e\xcf\x47\xae\xb9\xeb\xdb\xcd\x4e\xeb\x9f\x37" - "\xdf\x01\xeb\x9f\x37\x49\xac\x51\xdd\xc4\xad\x7f\xde\x78\x1b\xd6" - "\x3f\x6f\x94\x58\xff\xbc\x99\x5b\xff\xbc\x71\xaf\x7b\x9c\xb4\x51" - "\x62\xfd\xf3\xe6\xb9\xae\xf7\x90\x38\x69\x23\xb7\xfe\x79\xb3\x87" - "\xf5\xcf\x7f\xe0\xd6\x3f\x6f\xe6\xd6\x3f\x13\x4c\xdd\xe3\xa4\xcd" - "\x5e\xac\x7f\xde\xc8\xad\x7f\xde\xe8\x61\xfd\xf3\x1f\x44\xd6\x3f" - "\xbf\x16\x2e\x1e\x27\x65\x3a\xad\x7f\xce\x74\x59\xff\xfc\x87\x3b" - "\x64\xfd\xb3\x24\xb7\x5c\xd6\x3f\x67\x2a\x58\xff\x9c\x29\x73\xfd" - "\xf3\x46\x89\xf5\xcf\x99\xdc\xfc\xe7\x8d\x12\xeb\x9f\x33\x25\xd6" - "\x3f\x67\xba\xac\x7f\xde\x28\xb1\xfe\x79\x4b\x37\x41\xfe\x6e\x71" - "\xd2\x16\x97\xf5\xcf\x1b\x5d\xd6\x3f\x6f\xe1\xd6\x3f\x6f\x38\x29" - "\x3f\x4e\xda\xe2\x61\xfd\xf3\x16\x97\xf5\xcf\x5b\xb8\x78\x68\x0b" - "\xb7\xfe\x79\x0b\xb7\xfe\x79\x43\xb9\xf3\x79\x3e\x4e\x22\xe7\xf9" - "\x38\x69\x8b\x9c\xf5\xcf\xa7\xe5\xec\x47\xf4\xe3\xcf\x45\xd5\xdd" - "\xa1\x73\x51\xb7\xae\x55\x16\x23\x6d\xcd\xb8\xab\xd5\x95\x68\xf5" - "\x2c\xc4\x6b\xf5\x6c\x9b\x32\xcd\x92\x6d\x55\xae\xd5\xf3\xab\x79" - "\xad\x9e\x5f\x2d\xad\xd5\x73\x4e\x79\xd6\xea\xdb\xc2\x79\xad\x9e" - "\xcb\xed\x5f\x9e\x3b\x97\xf4\x91\xb9\x11\xca\xb4\xfa\x1b\xbb\x85" - "\x5a\xfd\xf5\x01\x77\xb5\xba\xaf\x5a\x7d\x6b\x19\xaf\xd5\xdf\x98" - "\xa7\x4c\xab\xbf\x91\x22\xd4\xea\xdb\x37\xb9\x6b\xf5\x37\x4e\x79" - "\xaf\xd5\xdf\xb8\xa1\x8c\xf7\x6f\x34\x78\xa7\xd5\x73\x27\x8b\x6b" - "\xf5\x9c\xd3\xd2\x5a\x9d\x5c\x73\xd7\x58\x79\x37\x78\x8d\x95\x77" - "\xb4\xf3\x6b\xf5\xbc\x64\x71\x3d\x95\x37\x8f\x68\xf5\xdc\x49\xb7" - "\x5e\xab\xe7\x4e\x12\xd7\xea\x79\xdc\xf8\x6f\xee\x24\x77\xad\x0e" - "\xf7\x88\x6a\xf5\x6d\x61\xae\xf7\x10\xad\x9e\x9b\x48\xb4\xfa\xb6" - "\x61\xd2\x5a\x7d\xdb\x49\xe2\x87\xb6\xed\x20\x7e\x88\x60\xea\xae" - "\xd5\xb7\x2d\x6d\x5f\xab\x13\x0e\xb1\xe5\x94\xd4\xea\xdb\x8e\xb8" - "\x6b\xf5\x9c\x2a\x71\xad\x9e\x9f\xc7\xf3\x28\x7f\xb8\x50\xab\xff" - "\x8f\xff\x9d\xa1\xd5\x25\xb9\x95\x2c\xd4\xea\xff\x73\x46\xbe\x56" - "\xcf\xef\x26\x4f\xab\x63\xce\x89\x69\xf5\xfc\xc9\x1c\x7f\x12\xc5" - "\xb5\x7a\xfe\x42\x71\xad\x9e\xbf\x49\xa8\xd5\x71\xfe\x62\x5a\x3d" - "\xff\xa0\x20\x7f\x37\xad\x9e\x7f\x4a\xa8\xd5\x49\x3a\x5e\xab\x6f" - "\x5f\x42\x7c\x68\xce\x0a\xf9\x5a\x7d\xfb\x64\x69\xad\xbe\x7d\xba" - "\x50\xab\x6f\x8f\x24\x9a\x7c\xfb\x46\xa2\xd5\xb7\xc7\x92\xf3\x39" - "\xa9\xce\xe7\x79\xad\x4e\xce\xf3\x5a\x7d\x7b\xfe\xdd\xbd\x8a\x3a" - "\xe3\x5e\x45\x6f\x0d\x53\xa6\xd7\xdf\x8a\x54\xae\x19\xdf\xb6\xf0" - "\x9a\xf1\x6d\x8b\xb3\x66\x14\xee\x55\x54\xe0\xef\x59\x33\x16\x46" - "\xf3\x9a\x71\xe7\x76\xe2\xab\x77\xae\x21\xbe\x7a\xe7\x28\x87\x66" - "\x94\xde\xab\x68\xc7\x41\xe1\x5e\x45\x05\xa3\xef\xee\x55\xa4\x44" - "\x13\x6e\x77\xda\x4f\x7e\xc7\x5a\x65\x9a\x70\x47\x86\x50\x13\xbe" - "\xb3\xc3\x5d\x13\xee\x38\xef\xbd\x26\xdc\xa9\x70\xfe\xd7\xce\x00" - "\xef\x34\xe1\xce\xb9\xe2\x7b\x15\x15\x04\x48\x6b\x42\x72\xcd\xbd" - "\x2f\x2f\xec\xc6\xf7\xe5\xbb\xce\x74\x7e\x4d\xb8\x2b\x55\xbc\xdf" - "\xde\xb5\x96\x68\xc2\x9d\x86\x5b\xaf\x09\x77\x1a\xc4\x35\xe1\xae" - "\x1b\xa4\xff\xdc\x99\xe2\xbe\x57\x11\xdc\x23\xaa\x09\x0b\x23\xb8" - "\x7b\x0c\x42\x4d\x48\xf2\x00\xbf\x32\x46\x5a\x13\x16\x7e\x4b\xfc" - "\x4c\xe1\x87\xc4\xcf\x10\x4c\xdd\x35\x61\xe1\xa6\xf6\x35\x21\xe1" - "\x10\x5b\x4e\x49\x4d\x58\x78\xca\x5d\x13\x16\xa8\xc4\x35\xe1\xdb" - "\xfb\x78\x1e\xbd\x3d\x56\xa8\x09\x77\xf7\xb9\x33\x34\xa1\x24\xb7" - "\x52\x85\x9a\x70\xf7\x45\xf9\x9a\xf0\xed\xfe\xf2\x34\x21\xe6\x9c" - "\x98\x26\x7c\x7b\xae\x2b\xe7\x84\x9a\xf0\xed\x0d\xe2\x9a\xf0\xed" - "\x1d\x42\x4d\x88\xf3\x17\xd3\x84\x6f\x9f\x10\xe4\xef\xa6\x09\xdf" - "\x3e\x2f\xd4\x84\x24\x1d\xaf\x09\xdf\xd9\x48\x7c\xe8\x5b\xfb\xe5" - "\x6b\xc2\x77\xe6\x4a\x6b\xc2\x77\x16\x0a\x35\xe1\x3b\xb1\x44\xfb" - "\xbd\x53\x40\x34\xe1\x3b\x89\xe4\xfc\x5b\x45\xce\xe7\x79\x4d\x48" - "\xce\xf3\x9a\xf0\x9d\x22\x79\xeb\x34\x6e\xc9\xf8\x6d\x07\xad\xd3" - "\xb8\x55\xe3\xb7\x1d\xbd\x4e\xe3\xdd\xd1\xca\xf4\xe0\xbb\x31\x77" - "\xe7\xb8\xc8\x1d\xbb\x7d\xc7\xc4\x8f\xdd\xbe\xa7\xf0\xfb\x37\xef" - "\x95\x2a\xd7\xe1\x07\x8a\x79\x1d\x7e\xa0\x58\x7a\xbe\xfa\x1f\xb7" - "\x78\xd6\xe1\x7f\x6a\xe2\x75\xf8\xfb\x53\x48\xff\xf8\xfe\x28\xd2" - "\x3f\xee\xb3\xb5\x3b\x5f\x7d\x19\x52\x65\x72\xf3\xd5\xff\x80\xe7" - "\xab\x9f\x3d\x8e\x32\xaf\x89\xcd\x57\xdf\xb7\x54\x38\x9e\xfb\xc7" - "\xab\x62\xf3\xd5\xd9\x79\xea\x79\xd1\xa7\xad\x52\xf3\xd4\x5f\xbc" - "\xb5\xf3\xd4\xdf\x02\xed\xee\x18\xd3\xc5\xbe\xe1\xce\xd3\xef\xef" - "\x6e\xe4\xf5\xfb\xbe\xd1\xca\xf4\xfb\xbe\x18\xa1\x7e\xff\x60\xba" - "\xbb\x7e\xdf\xf7\xae\xf7\xfa\x7d\xdf\x09\x65\xed\x61\x5f\x99\x77" - "\xfa\xfd\xfd\x08\xf1\x79\xea\x7f\xcc\x96\x9e\xa7\xfe\xc7\x4c\xf1" - "\x79\xea\x7f\x3a\xc1\xeb\xae\x3f\xe5\x75\x7e\xfd\xfe\xa7\x68\x71" - "\x8d\xf5\xa7\xd1\x44\xbf\xbf\xaf\xbf\xf5\xfa\xfd\x7d\xbd\xb8\x7e" - "\xff\x13\x37\xfe\xf5\xbe\xde\x7d\x4c\x17\xee\x11\xd5\xef\x7f\xba" - "\xe8\x7a\x0f\xd1\xef\xef\x0f\x26\xfa\xbd\xc8\x5f\x5a\xbf\x17\xed" - "\x26\xfe\xa9\x68\x21\xf1\x4f\x04\x53\x77\xfd\x5e\x34\xb6\x7d\xfd" - "\x4e\x38\xc4\x96\x53\x52\xbf\x17\xe5\xb8\xeb\xf7\x3f\x66\x8a\xeb" - "\xf7\x03\x73\x79\x1e\x1d\xe8\x26\xd4\xef\x45\x5f\xdd\x19\xfa\x5d" - "\x92\x5b\xd1\x42\xfd\xbe\x7f\x9f\x7c\xfd\xbe\xbf\x46\x9e\x7e\xc7" - "\x9c\x13\xd3\xef\x07\xb8\xf8\x8f\xf0\xc5\x5d\xbf\x1f\x18\x23\xae" - "\xdf\x0f\x4c\x17\xea\x77\x9c\xbf\x98\x7e\x3f\xb0\x49\x90\xbf\x9b" - "\x7e\x3f\xf0\xae\x50\xbf\x93\x74\xbc\x7e\xff\x20\x8e\xeb\xdf\x86" - "\xcb\xd7\xef\x1f\x44\x48\xeb\xf7\x0f\x86\x09\xf5\xfb\x07\x2a\xa2" - "\xd3\x3f\x98\x46\xf4\xfb\x07\x5a\x72\xfe\x8f\x51\xce\xe7\x79\xfd" - "\x4e\xce\xf3\xfa\xfd\x83\x14\x79\xf3\x2f\xbc\x1f\xd3\xfd\xf1\xe7" - "\x5f\x04\xdf\xa1\xf3\x2f\x3e\xf4\x53\xa6\xdf\x3f\x44\xca\x75\x64" - "\xe9\x59\x5e\x47\x96\x9e\x95\x9e\x03\xf0\xe1\x19\xcf\x3a\xf2\x63" - "\x1d\xaf\x23\x4b\xd6\x12\x3f\x5d\xc2\xed\xd9\x58\x32\x50\x6a\x0e" - "\x00\x5e\xef\xb8\x65\x11\x59\xeb\xd8\x36\x07\xa0\xfa\x0c\xa7\x19" - "\xff\xbc\x43\xa8\x19\x3f\x1a\x28\x36\x07\x40\xf4\xdd\xbf\xcb\x7a" - "\x46\xdb\x10\xf9\xef\xfe\x7f\x5a\xeb\x19\x3f\xc8\xe0\x75\xe2\x9f" - "\xe7\x2a\xd3\x89\x7f\x36\x08\x75\xe2\xa1\x0d\xee\x3a\xf1\xcf\x27" - "\xbd\xd7\x89\x7f\xbe\xaa\x4c\x27\xfe\xd9\xe2\x9d\x4e\x2c\x99\x28" - "\xfe\xee\xff\xc3\xb3\xd2\xe3\xbc\xe4\x9a\x7b\xff\x7e\xf0\x2a\xdf" - "\xbf\x1f\x3c\xd2\xf9\x75\xe2\xc1\x24\xf1\xbe\xfc\xe0\x5c\xa2\x13" - "\x4b\x12\x6e\xbd\x4e\x2c\x49\x10\xd7\x89\x07\xb9\xfd\x5f\x4b\x12" - "\xdc\x75\x22\xdc\x23\xaa\x13\x3f\x0e\x71\xbd\x87\xe8\xc4\x92\x49" - "\x44\x27\x7e\x3c\x44\x5a\x27\x7e\x7c\x82\xf8\x9f\x8f\xb7\x13\xff" - "\x43\x30\x75\xd7\x89\x1f\x2f\x6c\x5f\x27\x12\x0e\xb1\xe5\x94\xd4" - "\x89\x1f\x1f\x72\xd7\x89\x1f\x9e\x16\xd7\x89\xa5\x39\x3c\x8f\x4a" - "\x87\x09\x75\xe2\x5f\xfc\xee\x0c\x9d\x28\xc9\xad\x24\xa1\x4e\xfc" - "\xcb\x29\xf9\x3a\xb1\xd4\x5f\x9e\x4e\xc4\x9c\x13\xd3\x89\xa5\x13" - "\x39\xfe\x4c\x12\xd7\x89\xa5\xf3\xc4\x75\x62\xe9\x06\xa1\x4e\xc4" - "\xf9\x8b\xe9\xc4\xd2\x0f\x05\xf9\xbb\xe9\xc4\xd2\x93\x42\x9d\x48" - "\xd2\xf1\x3a\xf1\x90\x91\xf8\xd0\x0f\xd7\xc8\xd7\x89\x87\x26\x4a" - "\xeb\xc4\x43\x53\x84\x3a\xf1\xd0\x60\xa2\x07\x0f\xad\x27\x3a\xf1" - "\x50\x0c\x39\xff\xe1\x6a\xe7\xf3\xbc\x4e\x24\xe7\x79\x9d\x78\x28" - "\xd7\x93\x4e\x64\xb2\x6b\x4a\xb3\x29\x7b\x31\x1c\xa5\x50\xce\x3e" - "\xd0\x8f\x99\xe0\xff\x32\xe8\x8f\x82\xe1\xff\x2a\x29\x5d\x62\x09" - "\xa9\x29\xb5\x83\xc6\xb0\xc3\x73\x2a\x2d\x3f\x98\x4c\x7d\xad\xf0" - "\xec\x4f\x42\x89\xfe\xa8\x29\x0d\xb2\x76\x8d\xb3\x33\x06\xe8\xc3" - "\xe1\xff\x54\x38\x07\xe9\x7b\x41\xbf\xa7\x5b\x86\x7a\x5d\xa1\x3e" - "\x89\x72\xa4\x83\x32\xf7\x3a\x47\x1d\xba\x8a\xf3\x68\xdc\xfc\x49" - "\x0c\xd4\xa7\x50\xb2\xac\x90\x57\xfc\xbe\xfb\xd0\x1a\x2b\xf3\x9d" - "\x69\xfe\x35\x54\x4b\x7d\xb2\x29\xa8\xbe\x6b\x1c\xf8\x21\x84\x75" - "\x5d\x71\x5f\x8b\x0a\xe7\x69\x9a\xdf\x82\xaf\xa5\xe0\x6b\x36\x28" - "\x63\xda\x3c\x44\x65\x5d\xeb\x1a\x00\xfa\xc9\x3f\xbd\x81\xa9\x5b" - "\x60\x85\x32\xa7\x5a\xd1\xa7\xf7\x9d\x55\x7d\xf0\xe6\x59\xb6\xef" - "\xa9\x68\xb0\xb1\x79\xe8\xe6\xe3\xf2\x7c\xb2\x65\x27\xa4\x17\x2b" - "\xc3\x86\x03\x68\xb0\x7f\x04\x63\x96\xd7\xdf\x7d\x62\x96\xb2\x63" - "\xd0\xda\xfb\x90\xe9\xe7\x60\x3b\x1d\xa2\xc4\xae\xcb\x7b\xce\x5f" - "\xe3\x3c\xe8\xc8\x80\x37\xd4\x4c\x43\xfa\x76\x44\x6d\xb5\x77\x0d" - "\xf8\x0c\x58\xb2\x6b\x1b\x63\x69\xdc\xfc\xd7\x12\xb3\xdf\x47\xa1" - "\xd8\xe6\xbf\x83\xeb\x5b\xd5\x8c\xe5\xfa\x3a\xcc\x9b\xbf\x96\x1f" - "\x85\xbe\xdd\x15\x8b\x45\xc9\xf3\x66\xea\x96\xcc\x9d\x37\x67\xc1" - "\xd2\x25\xba\x81\xc9\xdd\xd1\xa4\x05\x0b\x74\xf3\x66\xce\x5f\xa1" - "\x73\xbe\xf2\x4b\x5d\xf2\xdc\xc5\x33\x67\xa5\xcc\x19\x32\x6f\xb6" - "\xb1\x3b\x16\xb7\x4e\xe5\x08\xc5\x65\xb1\x6f\xfe\xeb\xd9\x9d\xaf" - "\x23\xf4\x46\x6f\xa4\xc2\xe5\x6a\xdc\x7c\x78\xa4\x99\xb6\xc6\xe2" - "\xe7\x65\x6d\x63\x1a\x28\x48\x93\x0e\x3e\x6d\x6b\x5a\x57\x9c\x36" - "\x6e\x17\x94\x6b\x27\x94\x1b\xca\x08\x65\x3e\x6c\x70\x94\xd9\xc1" - "\x89\x74\xcc\x89\xb4\x6b\xc0\xc1\xc3\x9b\x82\x9a\xba\x3e\xc5\x30" - "\x89\xb8\x7e\x0d\xd0\x56\xfc\x2e\x50\x47\x06\xb0\x5a\x3f\xa7\xa6" - "\x14\xee\xdd\xe3\xe0\x98\x3d\x77\x50\x02\xf3\x7a\x4d\x06\x68\x47" - "\xbf\x46\xc6\xf0\x6b\xe0\x26\xbe\xff\xea\x50\x84\x32\x98\xc6\x44" - "\x76\x4f\x7f\xa6\x11\x38\x4c\x78\x0a\xd7\x8e\x1c\xbb\x4e\xa1\xc7" - "\x21\x8f\x3a\x33\x9a\xc3\x3e\xdf\x0c\xe7\xb0\xcd\xed\x85\x4f\x56" - "\x4d\xd6\xa3\x8c\x07\x33\x50\x46\x23\xbe\x67\x8f\xff\xde\xa0\x25" - "\xc8\x2f\x3e\x95\xf9\x06\xfc\x8e\x1f\x33\xe0\xc9\x2a\xe6\x5d\xff" - "\xbd\x66\xea\x70\xb9\x3d\x6f\x50\x02\xd4\xa7\xbe\x71\xf3\x91\x48" - "\x33\xaa\x37\xe3\x7c\xb6\x6e\x63\x6d\x5f\x8f\xeb\x0e\xf6\x81\x98" - "\x85\x31\x31\xeb\xb8\x36\x94\xc9\x18\xed\xd9\xe3\xa3\x2b\x55\x37" - "\x51\xbc\x95\x69\x65\xb6\x30\xc6\x8a\x86\x06\xf0\x69\xc6\xd9\x4c" - "\xf7\xbf\x5e\x0c\xb2\xce\x9d\xb3\xab\x37\xb4\xc5\x9c\xf1\xd1\x4c" - "\x8e\x3a\x73\x72\x04\x0a\x86\xbc\x33\x1d\xf6\x04\x5b\xaa\xe4\xf1" - "\xe8\x48\x36\xae\x13\xe6\x03\x94\x87\xe3\xc3\x91\xea\xa3\x4b\xdc" - "\xf9\xd0\xd6\x36\xb7\x85\x99\xac\x4c\xe2\x53\xad\xb9\x61\x4d\x4c" - "\x68\x58\x6d\xda\x79\xd4\x05\xdb\xb6\x02\xb4\x7e\xd6\x32\xa4\xdd" - "\xf2\x22\xd2\xcd\x58\x11\x8c\x2c\x79\x61\xe6\xa0\xb5\x19\x7e\x60" - "\x13\x0a\xfc\x4b\x24\xf8\xcc\xc8\x56\xf5\xa0\x84\xd5\x73\x10\xb5" - "\xff\x5c\x31\x85\x75\x32\x9e\xe3\x71\x81\xfa\xdb\x8e\x9d\x70\x1f" - "\xf3\x43\x22\xc2\x78\xb0\x58\xfc\x60\x40\xe3\xe7\x42\xff\xfc\x0a" - "\x7b\xfd\xd4\x0e\xc8\x53\x5e\xbd\xfe\xc6\xea\x5f\x1b\x60\x35\x14" - "\x70\xaa\xac\xb5\xb1\x79\xb2\x58\xa5\xf0\x58\x1d\x81\x72\xf0\x78" - "\xfd\x2d\x11\xe3\x2a\x5e\x67\x75\x0c\xa9\xb3\x3a\x95\x09\x55\x27" - "\x4b\xd7\x59\x9d\x44\xea\xec\x7f\xcd\x73\x9d\x3f\xcd\xf1\x5c\xe7" - "\x4f\x8f\xcb\xaf\xf3\xa7\xd3\xe4\xd7\xf9\xd3\x71\x1e\xea\xcc\xe1" - "\xac\x06\x9c\xd5\x1e\x70\x56\x73\x38\xf7\x38\xe7\xb9\xce\xa6\x0d" - "\x9e\xeb\x6c\x3a\x24\xbf\xce\xa6\x04\xf9\x75\x36\xc5\x48\xd7\x59" - "\xc3\xe1\xac\x01\x9c\x35\x1e\x70\xd6\x70\x38\x87\x7c\xe9\xb9\xce" - "\x47\x57\x78\xae\xf3\xd1\xfd\xf2\xeb\x7c\x34\x56\x7e\x9d\x8f\x46" - "\x79\xa8\x33\x87\xb3\x06\x70\xd6\x78\xc0\x59\xc3\xe1\xfc\xe8\x66" - "\xcf\x75\xfe\xfb\x3c\xcf\x75\xfe\xfb\x6e\xf9\x75\xfe\x7b\xb4\xfc" - "\x3a\xff\x5d\x2f\x5d\x67\x2d\x87\xb3\x16\x70\xd6\x7a\xc0\x59\xcb" - "\xe1\xfc\xc2\x13\x9e\xeb\xfc\xd9\x4c\xcf\x75\xfe\x2c\x4f\x7e\x9d" - "\x3f\x1b\x2c\xbf\xce\x9f\xf5\x93\xaa\x73\x0b\xf8\xed\x40\xa8\x4b" - "\xeb\xbf\x12\x9f\xb2\x85\x86\xd5\x07\xd6\x22\xaa\x60\x9d\xdd\x10" - "\x54\x87\xba\x41\xdd\x0c\xcc\xb6\x08\x1d\xfe\x6b\x0f\x0d\xab\x6b" - "\x09\x0d\x6b\x6a\xee\x5d\x93\xb1\x6a\x3a\xea\x82\xf5\xf8\x26\x3b" - "\xd2\xda\x73\xc3\x6a\x33\x9f\x41\xba\x74\x0b\x0a\xae\x48\x33\xa3" - "\x34\x23\x63\xa9\x40\xdf\xa2\x9e\x75\x38\xf6\xfc\x1a\x95\xd7\x97" - "\xa1\xf9\x8b\x18\xe6\x02\x75\xec\x5b\xfc\x3e\x17\x74\x72\x46\xf6" - "\x3f\x91\x0e\x9e\x11\xb9\x13\x0e\x9c\x4f\xd0\x38\xe8\x3f\xb7\x45" - "\x3c\xb0\x2b\x0d\x69\xff\xf6\x4a\x1d\xc2\xe7\x77\xc0\x61\xdb\x36" - "\x28\x21\x6d\x3a\xa2\x0e\x5c\x3b\x4b\x91\xbe\xf9\xd8\x7e\xd7\xbe" - "\x79\xdc\x4c\xb0\xe5\x2c\xf6\x5a\x73\xc1\x33\x72\x6d\x79\x2c\xd5" - "\xd1\x77\xb3\xb6\xac\xb6\x91\xfe\xde\xa5\xef\xfe\x1b\x3c\x9f\xb7" - "\xe5\x31\x03\xb6\x25\x93\xab\x46\x95\x75\x2d\x38\x6e\x0a\xbe\x90" - "\x8a\x28\x38\xaf\xad\x30\x5e\x43\xe2\x36\x56\xc7\xf0\x36\x56\xa7" - "\x04\xd6\xfa\x5f\x13\xb7\xb1\xda\xd0\x12\xaa\x4e\x75\xb7\xb1\x3a" - "\xd9\x3b\x1b\xff\xef\x18\xdf\x6d\xfc\xbf\x21\xd2\x36\xfe\xdf\xe9" - "\xf2\x6d\x7c\xbc\x5a\xbe\x8d\x8f\x97\x73\x36\xce\x10\xda\xf8\xf8" - "\x6a\x0f\x36\x76\xe2\xb1\x1a\x78\xdc\xe3\x9c\x84\x8d\x81\xc7\x6a" - "\x11\x1e\xab\xbd\xe4\xf1\x3f\xf6\xf9\x6e\xe3\x7f\x2c\x95\xb6\xf1" - "\x3f\x8e\xca\xb7\xf1\x3f\x62\xe4\xdb\xf8\x1f\x91\xc4\xc6\x1a\x17" - "\x1e\xff\xaf\x59\xda\xc6\x1a\x27\x1e\x6b\x80\xc7\x21\x5f\x8a\xdb" - "\x58\x03\x3c\xd6\x88\xf0\x58\xe3\x25\x8f\x4f\xf4\xf4\xdd\xc6\x65" - "\x5f\x49\xdb\xf8\xc4\x40\xf9\x36\x2e\xdb\x23\xdf\xc6\x65\xb9\x9c" - "\x8d\x5d\x78\x5c\x16\xeb\xc1\xc6\x4e\x3c\xd6\x00\x8f\x1f\xdd\x2c" - "\x61\x63\xe0\xb1\x46\x84\xc7\x1a\x2f\x79\xfc\xf9\x42\xdf\x6d\xfc" - "\xf9\x28\x69\x1b\x7f\xbe\x49\xbe\x8d\x3f\x0f\x90\x6f\xe3\x13\x4d" - "\xc4\xc6\x5a\x17\x1e\x9f\xd8\x2b\x6d\x63\xad\x13\x8f\xb5\xc0\xe3" - "\x17\x9e\x10\xb7\xb1\x16\x78\xac\x15\xe1\xb1\xd6\x4b\x1e\x7f\x71" - "\xc6\x77\x1b\x7f\xb1\x5b\xda\xc6\x5f\x5c\x96\x6f\xe3\x2f\x52\xe4" - "\xdb\xf8\x8b\x69\x9c\x8d\x5d\x78\xfc\x45\xa0\x94\x8d\x5b\x21\x06" - "\xec\x09\x36\xee\x59\x8f\xa8\x1d\xd8\xb6\x67\x89\x6d\x6d\xea\x08" - "\xdd\x0e\xca\x6e\xc0\x36\x61\xc7\x80\xbe\xd7\xf6\xb2\xe5\x86\xd5" - "\x33\x14\xd4\x29\x0d\x8f\xbb\x96\x4f\xb6\xae\x43\xbd\x74\x69\x78" - "\xfc\xb7\x82\x5d\x1f\xa6\x4b\x7b\xad\x06\x9e\x47\xe3\x71\x2f\x6b" - "\x4e\x75\x92\x2d\xac\x6f\xe4\x05\xea\xe4\x16\x66\x60\x57\x13\xc4" - "\x21\x88\x79\x55\x1b\x5a\x59\x5f\x0c\xf6\xf9\x1c\x55\x9c\xfd\x04" - "\xd9\xd5\x11\x0f\x0c\xb5\x22\x3d\xf3\xbd\x3e\xb4\x7c\x89\x19\xd9" - "\x66\x6b\x03\x2b\x53\xcb\x50\x65\xea\x47\x28\xbe\x8e\xb9\xc9\xfc" - "\x57\x1f\xd8\x1a\x36\xd4\x60\x0b\x8b\x40\xb6\xbc\xe8\x3a\x6b\xd8" - "\xd0\xc4\xfd\xcb\xcc\x54\x60\x13\xd2\xa7\xd4\x32\x4c\xd6\x2c\xa4" - "\xca\x3a\x87\x02\xb6\xce\x42\x81\x5b\xcf\xa1\xe0\xf2\xda\xb3\xe8" - "\xe4\xa5\x32\x74\xf2\xda\x57\xe8\xe4\x4d\x38\x5a\xe0\xb0\xc3\x91" - "\xf1\x15\x60\x8d\xd0\xf8\xcb\x08\xa5\xd7\x32\x96\x5f\x54\xa3\xd0" - "\x72\xeb\x59\x84\xe7\x38\x5d\xa1\x4e\x46\x04\x26\xa1\x50\xe6\xbf" - "\x5a\xc4\xcc\xd6\x52\x70\x4d\x85\xcf\x57\x5a\x2d\xa8\xbc\xb6\x09" - "\x5f\x0f\x80\xeb\xaa\xf4\x5a\xc8\xdf\x5e\x86\xbf\x77\x68\x29\xcf" - "\x38\x01\xf5\xcb\x4c\x60\x70\x0c\xad\x0e\x33\x65\x83\xa9\xed\x8c" - "\xf6\x01\xc2\x83\x8a\xd1\x3b\xed\x72\xb1\x3e\x99\xc8\xda\xf8\x55" - "\x6d\x6f\xb0\x73\x5f\xfb\xab\x89\xc1\x13\xbe\xfa\x86\xa9\x68\x38" - "\x8b\xf0\x58\x42\x45\xc3\xe7\xa8\x72\xbd\x1d\xc5\xaf\x40\x68\x9c" - "\x0d\xb1\xb6\xa8\x4c\xad\x43\x13\x8c\x28\x08\x8f\x3f\xdb\xbf\xd7" - "\xf7\xae\xac\xb5\xa0\x35\x56\x28\xe3\x95\xa6\xb6\x32\x56\xac\xaf" - "\x40\x70\xad\x6f\x85\xc1\x8c\x02\x8d\x28\x18\xdb\xd7\x9a\x1b\x56" - "\x37\x01\xda\xcf\xfc\x06\x86\xc1\xb6\xc5\x36\xc5\xf6\xc5\xf9\x39" - "\x6c\x5e\x99\x6c\x41\xe9\x4d\x28\xb8\x32\x0d\xfe\xa6\x32\x96\x4a" - "\x74\x15\x41\x19\x47\x32\x21\x99\x09\xc0\x8b\x70\xcc\x05\x33\x55" - "\x3e\x0e\xf0\xef\x2d\xce\x29\x75\x32\xe1\x94\xff\xb5\xf6\x39\xa5" - "\x4e\xe1\x39\x55\xb1\x8f\xe7\x54\xd5\x06\x69\x4e\x55\x7e\xcb\x71" - "\x2a\xa3\x73\x72\xaa\x72\x8d\x67\x4e\x55\x4e\x93\xe6\x94\x3a\x95" - "\x51\xab\x63\x84\x9c\xaa\xca\x93\xcf\xa9\xca\xa2\x8e\xe3\x94\xda" - "\xa0\x8c\x53\x95\xd9\x42\x4e\x55\x14\x7a\xe0\x14\xe7\xa7\x7a\x9c" - "\xf3\x82\x53\x4e\x7e\xaa\xca\xc6\x73\xea\xcb\xaf\xa4\x39\xf5\xe5" - "\x70\xc2\x29\x4d\x27\xf5\x53\xa7\x4e\x79\xe6\xd4\xa9\x62\x0f\x9c" - "\x02\x3f\xa5\x76\xf1\x53\x5f\x5e\x94\xcf\xa9\x2f\x51\x07\x72\x4a" - "\xa1\x9f\x3a\x55\x2b\xe4\x54\x55\x83\x34\xa7\x34\x9c\x9f\x0a\xf9" - "\xb2\x7d\x4e\x69\x9c\xfc\xd4\xff\x4d\xe4\x39\x75\x66\x88\x34\xa7" - "\x4e\x6f\xe2\x38\xd5\x49\xfd\xd4\xe9\x81\x9e\x39\x75\x5a\x25\xcd" - "\x29\x0d\xf8\x29\x8d\x8b\x9f\x3a\x33\x4a\x3e\xa7\x4e\x4f\xea\x38" - "\x4e\x69\x14\xfa\xa9\xd3\xd1\x42\x4e\xfd\x5f\x9c\x07\x4e\x71\x7e" - "\xea\xd1\xcd\x5e\x70\xca\xc9\x4f\x9d\x79\x97\xe7\xd4\xbf\xd6\x4a" - "\x73\xea\x9f\x35\x84\x53\xda\x4e\xea\xa7\xfe\xb9\xc2\x33\xa7\xfe" - "\x99\xe8\x81\x53\xe0\xa7\x34\x2e\x7e\xea\x5f\x39\xf2\x39\xf5\xcf" - "\xbd\x1d\xc8\x29\x85\x7e\xea\x9f\x99\x42\x4e\x9d\x29\x90\xe6\x94" - "\x96\xf3\x53\x2f\x3c\xd1\x3e\xa7\xb4\x4e\x7e\xea\x5f\xcd\x3c\xa7" - "\xbe\x3a\x23\xcd\xa9\xaf\x86\x71\x9c\xea\xa4\x7e\xea\xec\x49\xcf" - "\x9c\x3a\x5b\x24\xcd\x29\x2d\xf8\x29\xad\x8b\x9f\xfa\xea\xbc\x7c" - "\x4e\x9d\xb5\x76\x1c\xa7\xb4\x0a\xfd\xd4\x59\xb3\x90\x53\xff\xb2" - "\x48\x71\xaa\x05\xc7\x7d\x7e\xc0\x29\x03\xc4\x7d\xc0\xa1\xa0\x2a" - "\xc2\xa9\x56\xe0\xd4\x5b\xce\x9c\xfa\xb7\x6b\xdc\xf7\xf5\x78\x7b" - "\x1b\xa7\xaa\xa7\xb8\x72\xca\x0e\x9c\x6a\x65\x39\xf5\xef\x85\x8e" - "\xb8\xaf\xb2\xbe\x10\xb0\xba\x84\x2a\x13\x80\x4f\xdb\x38\x3e\xfd" - "\x1b\xf8\x04\xf5\xb1\x43\x7d\xcb\xab\xcf\xa2\x78\x0b\xa9\x57\x0b" - "\xd4\xd7\xee\xcc\xa5\x96\x3a\x0a\x73\x08\x73\xc7\xc1\xa3\x93\xf3" - "\x81\x3f\x8b\x4e\xa1\x93\xcb\xe0\x58\x09\x47\x1a\x1c\xe8\x14\x2a" - "\xaf\x43\xec\x98\x3d\xcf\x9f\x2a\x8e\x3f\xff\xee\xe9\x99\x3f\x5f" - "\xd7\xcb\x8b\xf1\xaa\xe7\xca\xe7\xcf\xbf\x47\x72\x73\xe9\x82\xe3" - "\x27\x7e\xc3\xe0\xb9\xae\x84\x23\x97\x50\xbc\x15\x05\x31\x2f\xe8" - "\x7b\x07\x26\xa2\xe0\x55\x36\x44\x6d\x99\x85\x82\xb7\x7c\x0d\xf5" - "\x75\xb4\x9d\x73\x28\xf0\xf3\xa6\x4f\x50\xf9\xb5\xb3\xa8\xfc\xe6" - "\x09\x54\x6e\x87\xe3\x12\x1c\x50\xc6\xf8\x39\xce\xf5\xb5\x38\xea" - "\x6b\x83\xbc\xc2\xa5\xeb\xfb\xef\x6a\xb6\xbe\xc9\x50\xdf\x16\xbe" - "\xbe\x95\xc0\x45\xc0\xa5\xaf\x9d\x8b\x13\xe3\x2d\xa8\xdb\x02\x2b" - "\xc3\xb4\x70\x1c\xc4\xb8\x7c\x7e\xba\x09\xc5\x1b\x01\xab\xd9\xc0" - "\xc1\xda\xbd\x28\x7d\x35\x70\xb0\xa5\x09\xbf\xd7\xb7\x54\x66\x34" - "\x03\x07\xff\xad\x63\xc0\x6e\xad\x98\x83\xff\xc6\x1c\xfc\x3a\xd6" - "\x2e\xc9\x41\x88\x13\x59\x0e\x42\x9c\xd8\x2e\x07\x9d\xe3\xc4\xea" - "\x53\x3c\x07\xff\x53\x23\xcd\xc1\x9a\x1b\x8e\x38\xf1\xc7\xe7\x60" - "\x4d\x8e\x67\x0e\xd6\x18\xe5\xc5\x84\xff\xb9\x2c\x9f\x83\x35\xa6" - "\x8e\xe3\xe0\x7f\xd6\x7a\xe6\xe0\x7f\x92\xda\xe7\xa0\xda\xa0\x8c" - "\x83\x35\x7b\x84\x1c\xac\x2e\xf3\xc0\x41\xce\x0f\x42\x5c\xd9\x3e" - "\x07\x9d\xfc\xe0\x37\x93\x79\x0e\x7e\x3b\x53\x9a\x83\xe6\x15\x8e" - "\xb8\xf2\xc7\xe7\xa0\x39\xcc\x33\x07\xbf\x69\x90\x17\x43\x7e\xbb" - "\x50\x3e\x07\xcd\xb1\x1d\xc7\xc1\x6f\xfd\x3d\x73\xd0\x5c\xeb\x05" - "\x07\x15\xfa\x41\xb3\x5e\xc8\xc1\x6f\xc6\x49\x73\x50\xc3\xf9\x41" - "\x88\x43\xdb\xe5\xa0\x73\x1c\xfa\xed\x57\x3c\x07\xff\x7b\x5e\x9a" - "\x83\xe7\x6c\x8e\x38\xf4\xc7\xe7\xe0\xb9\xed\x9e\x39\x78\x2e\x55" - "\x5e\xcc\xf9\xdf\x1b\xf2\x39\x78\xae\xac\xe3\x38\xf8\xdf\x4d\x9e" - "\x39\xf8\x5f\x43\xfb\x1c\xd4\x28\xf4\x83\xe7\x8a\x84\x1c\xfc\xb6" - "\xca\x03\x07\x39\x3f\x08\x71\x6b\xfb\x1c\x74\xf2\x83\xb5\xd3\x79" - "\x0e\x5e\x98\x2b\xcd\xc1\xf3\x6b\x1d\x71\xeb\x8f\xcf\xc1\xf3\xfd" - "\x3d\x73\xb0\xd6\x2a\x2f\x46\xbd\xb0\x42\x3e\x07\xcf\x8f\xeb\x38" - "\x0e\x5e\xe8\xe9\x99\x83\xe7\xeb\xbd\xe0\xa0\x42\x3f\x78\x3e\x52" - "\xc8\xc1\xda\x49\xd2\x1c\xd4\x72\x7e\x10\xe2\xdc\x76\x39\xe8\x1c" - "\xe7\x5e\xf8\x96\xe7\x60\xdd\x65\x69\x0e\xd6\xf9\x3b\xe2\xdc\x1f" - "\x9f\x83\xdf\xed\xf6\xcc\xc1\xef\x32\xe4\xc5\xb4\x75\x36\xf9\x1c" - "\xfc\xae\xaa\xe3\x38\x58\x97\xe3\x99\x83\x75\xc6\xf6\x39\xa8\x55" - "\xe8\x07\xbf\x2b\x11\x72\xf0\xc2\x59\x29\x0e\xda\x21\x2e\x6e\xdd" - "\xd3\xd5\x64\xcf\x1d\x6a\x08\xf2\xd3\x21\x6b\x68\xdf\xc8\xca\x25" - "\x0d\x68\xc2\x0d\xb0\x8f\xf1\x06\x7a\xf1\x46\x30\xb2\xe5\x0e\x4d" - "\x84\xb8\xb0\xce\x29\x7e\x66\xe7\x96\x59\xb3\x33\x13\xb6\xce\x47" - "\x2a\x88\xbf\x1f\xc0\xe7\x2a\x2f\x34\x21\xfc\xfc\x35\xb8\x3c\x97" - "\xf8\xf2\xe0\x71\x02\xe6\x07\x7d\x30\xfb\x8e\xb9\xc5\x8c\x6a\x47" - "\x22\xba\xbc\xd6\x0c\x76\x58\xc9\xe2\x8b\xed\x72\x81\xba\x58\xb5" - "\xeb\x0a\x52\x59\xff\xab\xed\x0b\xf6\x0e\xed\xb9\x1c\xf9\xf5\xab" - "\x65\xec\xd8\xae\xd8\x5e\xd8\xc6\xba\x95\xf8\xdd\xf5\xa5\x01\x15" - "\xc0\x31\xeb\x7f\xf5\x7d\x77\x42\x3a\xf1\x78\xf5\x52\x84\x7c\x6e" - "\x5c\xac\x27\xeb\x16\x2e\x96\x95\x57\x23\xd1\x77\xc7\x76\x88\xdf" - "\xbc\xb3\x95\xda\xe0\x14\xe7\xdd\x06\x5b\x5d\xb2\x7a\x67\xab\xef" - "\xc7\x0b\x6d\x25\x16\x57\x7d\x3f\x59\xbe\xad\xbe\xd7\x12\x5b\x5d" - "\x6a\xf0\x60\x2b\x2f\x79\xa5\xae\x73\x8a\x47\x6e\x83\xad\xea\xf5" - "\xde\xd9\xaa\x7e\x85\x8b\xad\x44\xf4\x7f\xfd\x5a\xf9\xb6\xaa\xe7" - "\xf6\x43\xaa\xd7\x49\xdb\x4a\xe3\x25\xaf\x34\x06\x27\xdd\x7c\x1b" - "\x6c\x75\x79\x92\x77\xb6\xba\xfc\xae\xd0\x56\x62\x3a\xf5\xf2\x7e" - "\xf9\xb6\xba\x6c\x24\xb6\xba\x3c\xce\x83\xad\xbc\xe4\x95\xa6\xce" - "\x49\xdf\xdd\x06\x5b\x5d\xc9\xf0\xce\x56\x57\x4e\xb9\xd8\x4a\x44" - "\x4f\x5d\xf9\x4a\xbe\xad\xae\x70\xdf\x43\xbf\x92\x2a\x6d\x2b\xad" - "\x97\xbc\xd2\x1a\x9c\x74\xc8\x6d\xb0\xd5\x0f\x45\xde\xd9\xea\x07" - "\x9b\xd0\x56\x62\xfd\xbe\xc5\x5f\xbe\xad\x7e\x28\x23\xb6\xfa\x61" - "\x8f\x94\xad\x6c\xb9\x61\xb5\x41\x60\x83\xe6\x6d\x61\xa6\xa0\x54" - "\x44\xb5\x84\x83\xdd\x42\xc1\x6e\x6b\x75\xa8\x35\x17\xec\x66\xb1" - "\xa2\x09\x0b\xbf\x61\x2a\xea\x6d\xa8\x05\x6c\xd6\x1c\x1a\x56\x57" - "\x69\xa9\xc3\x73\x8e\x7e\x75\x8e\xba\x7a\xfe\x85\x85\xc1\x08\xdb" - "\x0d\xdb\x01\xdb\x8e\x01\xbb\xb1\x76\x0c\x8d\xae\xb3\x85\x46\xa0" - "\xf1\x97\xbf\x61\x16\x98\x19\x06\xd7\x97\x09\xae\x4e\xc2\xef\x05" - "\xe2\xeb\x50\x37\xdd\x33\xb8\x4e\x57\xf3\xf0\xf9\x4a\xcb\x59\xd0" - "\x07\xd7\x10\xab\xcd\xbe\xd1\x87\xda\x9e\xd7\x07\xda\x2a\x13\x9f" - "\x62\x7a\xd7\x64\x58\xd5\x83\x12\xd2\x2f\xa3\x2e\x58\x3f\x64\xd9" - "\x91\x76\xcd\x3c\x44\x1d\x78\xc5\x44\xb1\x6b\xd7\x16\xb1\x79\xcc" - "\x04\xbb\x68\x99\xeb\x4e\x73\xba\xaf\x1b\x50\xe5\x85\x6c\x16\x37" - "\x57\x8d\xc0\xe2\xf6\x2f\x7d\x30\xe8\xcc\x48\x26\x34\xac\x29\xbb" - "\x02\xe9\x98\x56\xb0\x31\xbb\x9e\xe8\xda\xf8\x5d\x2d\x72\x6d\x7c" - "\x95\x9d\xff\x6d\xd7\x71\xf3\xb7\xc0\x4e\xf8\xf9\xec\xfc\x2d\xa3" - "\xd3\xfc\x2d\x28\x33\x3f\x7f\xcb\x62\xc1\xf3\xb7\xec\xdf\x68\xfb" - "\x3a\xea\xbe\x20\x85\x61\xa0\xee\xbd\x2b\x1a\x2c\x08\xd7\xbf\xa2" - "\xc1\x84\xd2\x97\xa0\xe0\x8a\x96\x3a\x94\xd6\xc0\x58\x2a\x32\x2e" - "\xa2\xf8\x1b\x58\x07\x63\xbe\x5c\xad\x21\xb8\x5a\x8a\xed\xdf\xe8" - "\xfb\x42\x19\x4e\x57\x80\xc2\x73\x5a\xc7\x63\x00\xcd\x1c\x00\x38" - "\x18\x2a\x33\xce\x21\xc0\x04\xec\xf2\x35\xc6\xc9\x00\xd7\x47\xb6" - "\xe9\x6b\x75\xc4\x3a\x7c\x0e\x63\x86\xdf\x37\x55\x1a\x2d\x6c\x1a" - "\xc7\x75\xcc\x8b\xa0\xd4\x0c\x54\x99\xda\x82\x2a\xac\x78\xcd\xae" - "\x65\xda\x17\x89\x67\x25\x78\xa4\x4e\x26\x3c\x52\xc7\x04\xa5\xfa" - "\x5f\x6b\x9f\x47\x6a\x03\xcf\xa3\x86\x21\xbe\xf1\xe8\x7a\x8d\xef" - "\x3c\xba\xbe\x4f\x39\x8f\xd4\xa9\x42\x1e\x35\xe4\xc9\xe7\xd1\xf5" - "\x25\xf2\x79\x74\x3d\xda\x37\x1e\x35\x0c\x24\x3c\xba\xd6\x44\x78" - "\xd4\xd0\x8f\xe7\x11\xbb\x36\xea\x36\xf1\xe8\xda\x1e\x0f\x3c\xe2" - "\xfc\x91\x1a\xfc\x51\x8f\x73\x5e\xf0\xc8\xc9\x1f\xdd\x5c\xea\x1b" - "\x8f\x6e\x0e\xf4\x9d\x47\x37\xae\xfa\xc0\x23\x17\x7f\x74\xb3\x46" - "\x3e\x8f\x6e\x1c\x96\xcf\xa3\x1b\x19\xbe\xf1\xe8\xe6\x3c\xc2\xa3" - "\x1b\x31\x84\x47\x37\x93\x79\x1e\xb1\xeb\xcd\x6e\x13\x8f\x1a\xea" - "\xa5\x79\xa4\xe1\xfc\x91\x06\xfc\x51\xc8\x97\xed\xf3\x48\xe3\xe4" - "\x8f\x9a\x8e\xf8\xc6\xa3\xa6\x79\xbe\xf3\xa8\x69\x84\x72\x1e\x69" - "\x5c\xfc\x51\xf3\x40\xf9\x3c\x6a\x52\xc9\xe7\x51\x63\x99\x6f\x3c" - "\x6a\x3a\x48\x78\xd4\xb8\x91\xf0\xa8\xa9\x88\xe7\x11\xbb\x86\xef" - "\x36\xf1\xa8\x31\xca\x03\x8f\x38\x7f\xa4\x01\x7f\xf4\xe8\x66\x2f" - "\x78\xe4\xe4\x8f\x5a\xfd\x7d\xe3\x51\xcb\x41\xdf\x79\xd4\xb2\xd6" - "\x07\x1e\xb9\xf8\xa3\xd6\x79\xf2\x79\xd4\x32\x4e\x3e\x8f\x5a\x82" - "\x7d\xe3\x51\x8b\x8d\xf0\xa8\xb9\x8a\xf0\xa8\xa5\x81\xe7\x11\xbb" - "\x2e\xf2\x36\xf1\xa8\x79\xb5\x34\x8f\xb4\x9c\x3f\xd2\x82\x3f\x7a" - "\xe1\x89\xf6\x79\xa4\x75\xf2\x47\xb6\xf1\xbe\xf1\xc8\x6a\xf3\x9d" - "\x47\xd6\x13\xca\x79\xa4\x75\xf1\x47\xb6\x83\xf2\x79\x64\xcd\x95" - "\xcf\x23\x6b\xa2\x6f\x3c\xb2\x8d\x21\x3c\xb2\x6a\x09\x8f\x6c\x23" - "\x79\x1e\xb1\x6b\x4d\x6f\x13\x8f\x5a\x8f\x49\xf1\x08\xef\x45\xf0" - "\x06\xd9\x17\xa2\x61\xeb\x4a\x14\xbd\x0b\xff\x6d\x41\x91\x8d\x9b" - "\x6d\xf5\x47\x57\x93\xfd\x00\xa0\x9c\x92\xfb\x84\xf4\xd8\x07\xb8" - "\x84\x86\x99\xe3\x6b\xc8\x1e\x0d\x78\x5f\x90\xeb\xe9\x06\x34\x94" - "\xdd\x97\x81\x09\xc7\xfb\x58\xb5\xed\x1d\x10\x2a\xb1\x77\xc0\x54" - "\xe9\xbd\x03\x5a\xb6\x39\xd6\xdd\xee\x75\x5a\x77\x6b\xbf\xea\x79" - "\xdd\xad\xfd\xab\x1d\x53\xe5\xf2\xc1\xce\xae\xff\xba\xae\x0e\x33" - "\x35\x6e\xb6\xd7\x41\x9d\x4d\xa4\xee\x4c\x32\xf2\x6a\x3d\xee\x5e" - "\x27\x9e\xd8\x73\x27\x4f\x43\x19\xcc\xe6\x23\x75\x4c\x58\x98\x99" - "\xc9\x0b\xb3\xc8\x2b\x0b\x23\xf9\xfd\x0f\x62\x6f\x75\x92\xa8\xbd" - "\x69\x94\x4b\xec\xcd\xed\x5b\x10\x2a\xb1\x6f\xc1\x54\xe9\x7d\x0b" - "\x44\xed\x4d\x23\xcf\xeb\x9c\x69\x34\x56\xb6\xbd\x69\x14\x4a\xec" - "\xad\x8e\x69\xcc\x42\x89\x6d\xf6\xa6\xd1\x69\xd9\xf6\xa6\x91\x8a" - "\xd8\xfb\x6f\xd5\x4c\x98\x3a\x89\xc9\x53\x1b\x65\x96\xa5\xb0\x1d" - "\x7b\x8b\xf3\x9b\xa6\x54\x9c\xbd\x39\x7e\x4b\xec\x99\x30\x55\x7a" - "\xcf\x04\x71\x7b\xfb\x9d\xf2\x6c\x6f\xbf\x43\xf2\xed\xed\xb7\x9e" - "\xb3\xb7\xa9\x31\xcb\xaf\x8c\xb7\x37\xe5\xe5\xbe\x02\xce\xf6\xf6" - "\x5b\x42\xec\xfd\x69\x15\xd8\x1b\xf8\xad\x96\xc7\x6f\x9a\x0a\xf6" - "\x6c\x6f\x8d\x04\xbf\xe9\x25\xc4\xde\xdc\x7e\x0d\xa1\x12\xfb\x35" - "\x4c\x95\xde\xaf\x41\xdc\xde\xf4\x68\xcf\xf6\xa6\x23\xe4\xdb\x9b" - "\x6a\x20\xf6\xd6\x00\xbf\xe9\x68\xde\xde\x74\x89\x7c\x7b\x53\xb5" - "\xc4\xde\xa6\x63\x4c\x98\x06\xf8\xad\x91\xc9\x6f\x3a\xa3\x1d\x7b" - "\x4b\xf0\x5b\x55\xcb\xd9\x9b\xe3\xb7\xc4\x5e\x11\x53\xa5\xf7\x8a" - "\x10\xb7\xb7\xea\x43\xcf\xf6\x56\x6d\x97\x6f\x6f\x55\x32\x67\x6f" - "\xe0\xb7\x6a\x2f\x6f\x6f\xff\x70\xf9\xf6\x56\x4d\x22\xf6\x3e\x5a" - "\x0a\xf6\x06\x7e\x6b\x64\xf2\x5b\x65\xf1\x6c\x6f\xad\x04\xbf\xbb" - "\x4c\x22\xf6\xe6\xf6\xa9\x08\x95\xd8\xa7\x62\xaa\xf4\x3e\x15\xe2" - "\xf6\xee\x32\xc0\xb3\xbd\xbb\x74\x93\x6f\x6f\xff\xd3\xc4\xde\x5a" - "\xe0\x77\x17\x2d\x6f\xef\x2e\xb9\xf2\xed\xed\x7f\x8c\xd8\xfb\xef" - "\x45\x4c\x98\x16\xf8\xad\x95\xc9\xef\x2e\x49\x52\xf6\x0e\x02\x7b" - "\x1f\x07\x1d\x03\xba\xa3\xce\x9e\x0b\x3a\xc5\x26\xb4\x7b\x65\x6a" - "\x34\x7a\xe8\x26\xb6\x7d\x40\x0c\xf4\xd5\x75\x1d\xb6\x5f\x06\x1d" - "\x10\xe1\xf3\xda\x61\xba\xeb\x0d\xc9\xb5\xc3\x74\xd7\x1a\xd9\x6b" - "\x87\xe9\xae\x7b\xdb\x34\x50\x56\xd7\x7a\x1e\xd3\x00\xd6\x7f\xc8" - "\x5a\x53\x4c\x77\xcd\x17\xdd\x47\x83\xee\x1a\x87\xd7\x14\x33\x9b" - "\x3f\x2b\xb4\xe7\x29\xd0\x46\x74\xc0\xb8\xf6\xb1\x56\x1b\xec\xb9" - "\xa0\x91\x24\xb1\xee\x3e\x18\xfa\x2d\x43\x87\xed\xdb\x41\x77\x0f" - "\xf3\x1d\xeb\x6e\xdf\x4a\x63\xdd\xed\x84\x7c\xac\xbb\xe5\xf2\xfa" - "\xab\xdb\x59\x1e\xeb\xee\xf2\xd7\x8f\xd3\xdd\xd6\x8b\xee\xe7\x41" - "\x77\x8b\x22\x58\x1f\x57\xd9\xf3\x94\xe8\xb2\xee\xd1\x5e\x60\x0d" - "\xed\x5a\xed\xa1\x5d\x07\x6a\x01\xeb\xba\x0e\xdb\x3f\x84\x0e\xf4" - "\xf3\x1d\xeb\x1e\x27\xa5\xb1\xee\x71\x50\x3e\xd6\x3d\x32\x78\xed" - "\xd7\xe3\x18\x8f\x75\x60\xa2\x7c\xac\x7b\x18\x45\xf7\x15\xa1\x7b" - "\xe8\x08\xd6\xff\x6b\x00\xac\x15\x68\xc2\xc0\xf0\xf6\xb1\xd6\x40" - "\xbb\xd6\x78\x68\xd7\xbd\x54\xd0\x5f\x1b\x3a\x6c\x1f\x13\xba\xe7" - "\x65\xdf\xb1\xee\x79\x48\x1a\xeb\x9e\xbb\xe5\x63\xdd\x33\x85\xd7" - "\x9d\x3d\x8b\x79\xac\x7b\xc5\xca\xc7\xba\xe7\x34\xd1\xfd\x4d\xe8" - "\x9e\x81\x04\xeb\x7f\x94\xdb\xf3\x94\xe8\xd1\x5e\x92\xfa\xdf\x09" - "\x6b\x68\xd7\x1a\x0f\xed\x3a\xc8\x02\x58\xd7\x75\xd8\x7e\x2a\x74" - "\xd0\x57\xbe\x63\x1d\xf4\xae\x34\xd6\x41\x5b\xe4\x63\x1d\x94\xc8" - "\x6b\xde\xa0\x02\x1e\xeb\xe0\x48\xf9\x58\x07\xc5\x89\xee\xb3\x42" - "\xf7\x6a\x22\x58\x9f\x88\x04\xac\x15\x68\xe1\x20\x6b\xfb\x58\x6b" - "\xa1\x5d\x6b\x3d\xb4\xeb\x10\x88\xeb\xb5\x86\x0e\xdb\xd7\x85\x0e" - "\x39\xee\x3b\xd6\x21\x39\xd2\x58\x87\xac\x90\x8f\x75\x48\x2c\xaf" - "\xb7\x43\x36\xf2\x58\xf7\xee\x27\x1f\xeb\x90\x28\xd1\xfd\x5e\xe8" - "\xe0\x5a\x82\xf5\xe7\xb9\xf6\x3c\x25\x3a\x3c\xa4\x4e\x89\x0e\x5f" - "\xbc\x03\x05\x08\xf1\xbe\xa7\xbc\x63\xb5\xf8\x3d\x07\x7d\xc7\xfb" - "\x9e\xb5\xd2\x78\xdf\x33\x57\x3e\xde\xf7\x44\xf1\x5a\xfc\x9e\x54" - "\x1e\xef\xd0\x40\xf9\x78\xdf\x13\x2e\xae\xc5\x7b\x9f\xf6\x4d\x8b" - "\xdf\x73\x56\x89\x16\x77\xc7\x3b\xec\x70\xc7\xea\xf1\xb0\x77\x7d" - "\xc7\x3b\x6c\xa1\x34\xde\x61\x53\xe4\xe3\x1d\x16\xce\xeb\xf1\x30" - "\x03\x8f\x77\x98\x55\x3e\xde\x61\xa1\xe2\x7a\x3c\xf4\x98\x6f\x7a" - "\x3c\xac\x4c\x89\x1e\x77\xc7\x5b\x53\xd4\xb1\x9a\x5c\x93\xe7\x3b" - "\xde\x9a\x99\xd2\x78\x6b\xc6\xca\xc7\x5b\x13\xca\x6b\x72\x8d\xd3" - "\xf8\xb7\xa6\x5e\x3e\xde\x1a\x95\xb8\x26\x57\x97\xf8\xa6\xc9\x35" - "\x92\xdf\x3f\xf4\xa4\xc9\xdd\xf1\xee\x53\xd0\xb1\xba\xbc\xcf\x06" - "\xdf\xf1\xee\x33\x51\x1a\xef\x3e\x23\xe4\xe3\xdd\x47\xc5\xeb\xf2" - "\x3e\x71\x3c\xde\x7d\xe4\xef\x9f\x49\x6b\x1b\xc4\x75\xb9\x76\x8f" - "\x6f\xba\xbc\xcf\x5e\x25\xba\xdc\x1d\xef\x7b\x33\x3b\x56\x9b\xdf" - "\xbb\xd4\x77\xbc\xef\x1d\x2d\x8d\xf7\xbd\x11\xf2\xf1\xee\xdb\xc0" - "\x6b\xf3\x7b\x9d\xc6\xff\xef\x2d\x97\x8f\x77\xdf\x5a\x71\x6d\xde" - "\x37\xd7\x37\x6d\x7e\x6f\xbe\x12\x6d\xee\x8e\x77\xff\xd5\x1d\xab" - "\xcf\xfb\xcf\xf1\x1d\xef\xfe\xc3\xa4\xf1\xee\xdf\x47\x3e\xde\xfd" - "\x6a\x79\x7d\xde\x5f\xcf\xe3\xdd\xff\xb0\x7c\xbc\xfb\x9d\x16\xd7" - "\xe7\xfd\xd6\xfb\xa6\xcf\xfb\x6f\xf4\x7d\x9c\x5c\x97\x88\xb5\xb9" - "\xdc\xfd\x1f\x2b\x97\x70\x6b\xee\xe8\xfb\xf8\xfd\x1f\x69\x1d\xfb" - "\x1d\x48\xd1\xbd\x65\xe8\xfb\xdf\xed\xd4\xfb\x3f\xd2\xf7\x7b\xde" - "\xff\x91\xbe\x5f\xde\xfe\x8f\xf4\xfd\x5b\x64\xcf\xc7\xa7\xef\x4f" - "\xe4\x63\x84\xfb\x9d\xe2\x7f\x1d\xdb\xae\x3b\xf5\xbe\x90\xf4\xfd" - "\xc2\x7d\x21\xe9\xfb\xd8\x7d\x21\x99\xcd\x5f\x34\x29\x8b\x45\x74" - "\xc9\xbe\xbf\x17\xf8\x59\x14\x8e\x43\xe4\xee\x43\xc9\x73\x7b\xc0" - "\x30\x9e\xdb\x3f\x1b\x28\xcd\xed\x07\xd6\x76\xea\x7d\x28\xe9\x07" - "\xfc\x3d\x73\x7b\x40\xad\xac\x3d\x47\xe8\x07\xe4\xef\x7b\x43\x3f" - "\x10\xc5\xc7\x43\x0f\x38\xc5\xbf\x3f\x5b\xd2\x71\xdc\x56\xb8\x3f" - "\x25\xfd\x80\x56\xc8\xed\x01\x7a\xc2\xed\x8a\x71\xca\xe2\xae\x9f" - "\xc5\xf8\xfe\x1e\x64\x50\x30\x8e\xb9\xe4\xee\x87\xc9\x73\x3b\xbc" - "\x27\xcf\xed\x41\x7e\xd2\xdc\x1e\x38\xbd\x53\xef\x87\x49\x87\x7f" - "\xeb\x99\xdb\xe1\x26\x59\x7b\x99\xd0\x03\xc7\xc8\xe7\xf6\xc0\x60" - "\x3e\xf6\x1b\x38\x89\xe7\xf6\xa0\x84\x0e\xe4\xb6\x42\xbf\x1d\xde" - "\x20\xe4\x76\xb8\x8a\x70\xbb\xaa\x50\x59\x8c\x39\xa8\x9f\xef\xef" - "\x7d\xf4\xf5\x38\xbe\x94\xbb\x2f\x27\xcf\xed\x41\x17\x79\x6e\xeb" - "\xdd\xf6\x85\xe2\xb9\xad\x1f\xd1\xa9\xf7\xe5\xa4\x1f\x3c\xe2\x99" - "\xdb\x0f\x16\xc8\xda\x23\x85\xd6\x0f\x90\xcf\xed\x07\xeb\xf9\x38" - "\x57\x1f\xc9\x73\x3b\x62\x70\xc7\x71\x5b\xe1\x7e\x9d\xf4\x83\x55" - "\x42\x6e\x0f\x32\x13\x6e\x7f\xd9\xa0\x2c\x9e\xd6\x37\xf9\xfe\x9e" - "\xeb\x17\x65\x38\x96\x96\xbb\x3f\x28\xcf\xed\x88\xe3\x3c\xb7\x7f" - "\x71\x48\x9a\xdb\xbf\x08\xeb\xd4\xfb\x83\xd2\x3f\xf7\xbc\xff\x0f" - "\xfd\x73\x4f\xfb\xff\xb8\xaf\x15\xa6\x7f\x2e\x7f\xdf\x0b\xfa\xe7" - "\x65\x7c\x4c\xff\x8b\x40\x9e\xdb\x83\x03\x3a\x90\xdb\x0a\xfd\xf6" - "\xcf\x8b\x84\xdc\x8e\x38\x4c\xb8\x7d\x26\x4e\xd9\xd8\xc1\x2f\x4e" - "\xfb\xfe\x5e\xef\xa1\x3d\x78\xdc\x40\xee\x3e\xa5\x3c\xb7\x07\xef" - "\xe6\xb9\xfd\x50\x9e\x34\xb7\x87\x5c\xed\xd4\xfb\x94\xd2\x43\x96" - "\x7a\xe6\xf6\x90\x49\xb2\xf6\x74\xa1\x87\xc8\x5f\x07\x4f\x0f\xd9" - "\xc3\x8f\x5f\x0c\xe1\xe7\xbf\xd3\x0f\xd5\x76\x1c\xb7\x15\xee\x5f" - "\x4a\x0f\xd9\x28\xe4\xf6\xe0\x7c\xc2\xed\x7f\x15\x28\x1b\x27\x79" - "\xa8\xd8\xf7\x71\x92\x61\xc5\xec\x3b\x4c\x99\xfb\xa5\xf2\xdc\x1e" - "\xba\xa6\x6d\x6f\x22\x7a\xd8\x6e\x57\x6e\xb7\xed\x4d\x44\x47\x1e" - "\xea\x34\xfb\xa5\xd2\x91\xa3\x3c\xf3\x38\xb2\x9f\xbc\x31\x91\xc8" - "\xdd\xf2\x79\x1c\x99\xc2\x8f\x89\x44\x3a\xcd\x7f\x19\xe6\xf8\x26" - "\xf9\xed\xdf\xb3\x88\x1e\x36\xc6\xe3\x9e\x45\xf4\xb0\xf0\xdb\xb6" - "\x8f\x2a\x1d\x99\x20\xd8\xb3\x88\x1e\xba\xc4\xce\xb6\x85\xaf\x2c" - "\xca\xc6\x55\x86\x1d\xf6\x7d\x5c\x25\x8a\xbc\xdf\x95\xb9\x6f\x2b" - "\xdf\x16\x1e\xde\xc4\xb7\x85\xa8\xfd\xd2\x6d\xe1\x91\xe3\x9d\x66" - "\xdf\x56\xfa\x91\xb1\x9e\xdb\xc2\x23\x7a\x79\x63\x28\x8f\xc8\xdf" - "\x07\x86\x7e\x24\x95\x1f\x43\x79\xe4\x30\xdf\x16\xa2\xac\x1d\xd7" - "\x16\xa2\x26\x7a\x6e\x0b\x51\x91\xb7\x6d\x3f\x57\xfa\x91\x69\xc2" - "\xb6\xf0\x70\x06\x69\x0b\xd5\x4b\x94\x8d\xc3\x44\x29\x7a\xff\x2d" - "\x6c\x0b\x8f\x95\xb1\xef\xbe\x65\xee\x1f\xcb\xb7\x85\xe1\x79\x7c" - "\x5b\x78\xcc\x4d\xcf\xf3\x6d\xe1\xd1\x53\x9d\x66\xff\x58\xfa\xd1" - "\xc9\x9e\xdb\xc2\xa3\x51\xf2\xc6\x5c\x1e\x3d\x24\xbf\x2d\x3c\xea" - "\xb4\xfe\xe9\x51\xa7\xf5\x4f\xd1\x01\x1d\xd7\x16\x1e\x9b\xee\xb9" - "\x2d\x3c\x36\xf2\xb6\xed\x2b\x4b\x3f\x6a\x10\xb6\x85\xe1\x99\xa4" - "\x2d\xfc\xa7\x49\xd9\xb8\xcd\x63\x5e\xe8\xff\xf6\xc6\x6d\x7e\x79" - "\x9a\x9d\x17\x20\x73\x1f\x5b\xbe\x2d\x44\xef\xe6\xdb\xc2\x2f\x8f" - "\x4b\xb7\x85\x11\x35\x9d\x66\x1f\x5b\x7a\xc4\x4c\xcf\x6d\x61\x44" - "\x8c\xbc\x31\x9a\x11\xc7\xe5\xb7\x85\x11\xd9\xfc\x18\xcd\x88\xd3" - "\x7c\x5b\xf8\x55\x68\xc7\xb5\x85\x5f\xce\xf5\xdc\x16\x7e\x19\x77" - "\xdb\xf6\xb7\xa5\x47\x2c\x11\xb6\x85\xe8\x7c\xd2\x16\xbe\x5d\xad" - "\x6c\x9c\xe7\x97\x66\xdf\xc7\x79\x46\x99\xd9\x39\x13\x32\xf7\xd3" - "\xe5\xdb\xc2\xaf\xf6\xf3\x6d\x61\xd4\x29\xe9\xb6\x30\xf2\x62\xa7" - "\xd9\x4f\x97\x1e\x39\xcf\x73\x5b\x18\x39\x4e\xde\x98\xce\xc8\x53" - "\xf2\xdb\xc2\xc8\x02\x7e\x4c\x67\xa4\x99\x6f\x0b\xbf\xd6\x75\x5c" - "\x5b\x18\xb5\xd4\x73\x5b\x18\x35\xe9\xb6\xed\xb3\x4b\x8f\xcc\x10" - "\xb6\x85\x5f\xed\x21\x6d\xa1\x16\x29\x1b\x17\x1a\x55\xef\xfb\xb8" - "\x50\x4c\x3d\x3b\x9f\x44\xe6\xbe\xbe\x7c\x5b\xf8\xf5\x21\xbe\x2d" - "\xc4\x48\x7f\xe7\x81\x7e\xfc\x46\xa7\xd9\xd7\x97\x7e\xdc\xf3\xf7" - "\x8f\xe8\xc7\x3d\x7c\xff\x48\x6c\x0c\xe8\xf1\x1a\xf9\x6d\xe1\xf1" - "\xbd\xfc\x18\xd0\xe3\x4e\xeb\xff\x46\x0f\xee\xb8\xb6\x10\xe3\xf9" - "\xfb\x0f\x74\x8c\x17\xdf\x7f\x50\xb8\xdf\x2f\xfd\x78\xa6\xb0\x2d" - "\xfc\xba\x98\xb4\x85\x0b\xeb\x95\x8d\x23\xc5\xb4\x3b\xfe\x8f\xe3" - "\xfc\xd6\x50\xf7\x71\xa4\xf2\xda\x68\xf4\x8b\xa9\xb8\x2d\x3c\x51" - "\x68\xcd\x0b\xab\xc3\xfb\x0b\xdb\xc2\xb9\x3d\x28\xd7\x72\x7b\xbc" - "\x34\x58\xc9\x1e\x94\x16\x5b\xdb\x1e\x94\x64\xef\x0f\x44\xe1\xb5" - "\xc0\x78\x4d\xb0\x35\x98\xec\x3f\xc9\xe0\x39\x51\x78\x8e\xd4\xb9" - "\x32\x76\x7f\x95\xd5\x56\xa8\xfb\x85\x76\xf6\x9f\x4c\x32\xa3\xf2" - "\xa4\x95\xc8\x1a\x92\x99\x40\xd6\x09\x3f\x11\xc9\xee\x3f\x39\x43" - "\xdb\x37\xeb\x3f\x28\x34\x08\xef\x3f\x99\xc4\xd8\xd3\xcd\x8c\xa5" - "\x02\x6a\x5a\x9e\x04\xf6\x9d\xc9\xed\x41\x49\x3f\xb1\x1d\xd7\xdd" - "\x3a\x43\xdf\x77\xe7\x7f\x24\xf6\x17\xa6\x9f\x90\xbf\x0f\x2c\xfd" - "\xc4\x38\x7e\x7c\xe7\x89\x6c\x9e\xa3\x4f\xb0\x7d\x30\xfc\xd5\x97" - "\x27\x82\x8f\xd9\x7c\x31\xa0\x55\xc9\xde\x1b\xf4\x13\x45\xed\x63" - "\xc6\xce\x11\x71\xf3\x5f\x3c\x66\xb1\x93\xac\x79\x6a\x3c\x6f\x39" - "\xd9\x7b\xcc\xfc\xaf\xdd\x1e\xcc\x9e\xac\xf5\x1e\xb3\xd8\xf1\x42" - "\xcc\xc4\xc6\x21\x62\x87\xcb\xc7\x0c\x2f\x5d\x71\x8c\x43\xc4\xc6" - "\xf2\x98\xc5\xe6\x12\xcc\x9e\xac\x26\x98\x5d\x8a\x6a\x55\xb4\x7f" - "\x47\x6c\x92\x17\x98\xe1\xb9\x0f\x1e\xda\xd9\x6f\x02\x00\xb3\x3a" - "\xbc\xdf\xb2\xf7\x98\xf5\x38\x77\x7b\x30\x1b\x93\xef\x3d\x66\xbf" - "\xf1\x73\xc1\x4c\x24\x5e\x1e\x23\xff\x9b\x9d\xf4\x98\x12\x3e\x5e" - "\x1e\xd3\xc4\x63\xf6\x9b\x38\x82\xd9\x98\x6c\x82\xd9\xf7\xd0\x97" - "\x2a\x89\x1f\x7f\x13\xda\x3e\x66\xec\x3b\x7d\x0f\xed\xec\xa9\xc3" - "\xd6\x3c\x0d\x9e\x3f\x2c\xa3\x9d\x85\x7c\x79\x7b\x30\x7b\x6a\x9c" - "\xf7\x98\x3d\x75\x50\x88\x99\x58\x5c\xf7\xd4\x0e\xf9\x98\x3d\x65" - "\xe0\xe3\xba\xa7\x8a\x78\xcc\x9e\xb2\x12\xcc\x9e\x8a\x25\x98\xd5" - "\x67\xb6\x2a\xda\x47\xe4\xa9\x76\xc7\xbf\xb0\x0e\x6d\x0d\x75\x8f" - "\x73\x78\xcc\xc6\x1a\x01\xb3\x3a\xbc\xff\xb4\xf7\x98\x3d\xba\xf9" - "\xf6\x60\x36\x16\x79\x8f\xd9\xd8\xb9\x2e\x98\x89\xc4\x1f\x63\x27" - "\xca\xc7\x6c\x6c\x3f\x3e\xfe\x18\x9b\xc4\x63\x36\xb6\x98\x60\x16" - "\xd7\x44\x30\xbb\x5c\xda\xaa\x68\x2f\x92\xb1\xab\xdb\xc7\x8c\x7d" - "\x07\xeb\xa1\x9d\x3d\x1d\x6e\xcd\xd3\xe2\x79\xdb\x32\xda\xd9\x0b" - "\x4f\xdc\x1e\xcc\x7e\x5b\xe2\x3d\x66\x4f\xf7\x17\x62\x26\xa6\x93" - "\x9f\x96\xbf\x0f\x36\xfd\xdb\x2a\x5e\x27\x3f\x1d\xca\x63\xf6\x74" - "\x32\xc1\xec\xb7\x45\x04\xb3\x2b\xb5\xad\x8a\xf6\x33\x79\x5a\x72" - "\xff\x2f\x4f\xba\xd1\x31\x2f\x9f\xc7\x6d\x5c\x75\xe7\xd1\x8e\xe3" - "\x52\xbc\xc7\x6d\xdc\x99\xf6\xb5\xe3\xb8\x23\xf2\x71\x1b\xb7\x91" - "\xd7\x8e\xe3\xca\x79\xdc\xc6\xf7\x23\xb8\x8d\x4b\xf6\x4d\x3b\x8e" - "\x6b\x77\xfd\xab\x98\x76\x74\xc7\x6d\x42\x6e\xe7\xd1\x8f\x13\xc2" - "\xbd\xc7\x6d\xc2\x96\xf6\xf5\xe3\x84\xa5\xf2\x71\x9b\x10\xc3\xeb" - "\xc7\x09\xeb\x79\xdc\x26\x9c\x26\xb8\x4d\xe8\xe7\x9b\x7e\x9c\x50" - "\xa8\x44\x3f\xba\xe3\x96\x30\xae\xf3\x68\xc8\xf8\x6a\xef\x71\x4b" - "\x18\xd3\xbe\x86\x4c\x18\x22\x1f\xb7\xf8\x26\x5e\x43\x26\x8c\xe4" - "\x71\x4b\xc8\x24\xb8\xc5\x9f\xf6\x4d\x43\x26\x24\x2a\xd1\x90\xee" - "\xb8\x3d\xa3\xea\x3c\x3a\x72\x62\xae\xf7\xb8\x4d\xb4\xb5\xaf\x23" - "\x27\xca\xff\x66\x31\x3d\xb1\x98\xd7\x91\x13\x1b\x78\xdc\x9e\x21" - "\xdf\x60\xa1\x27\x66\xfa\xa6\x23\x9f\x69\x77\xff\x0f\x31\x1d\xe9" - "\x8e\xdb\xb3\x87\x3b\x8f\x96\x7c\x56\x86\xfe\x7f\xd6\x55\xff\x8b" - "\x68\xc9\x67\x15\xe8\xff\x67\x0d\xbc\x96\x7c\xd6\x49\xff\x3f\xcb" - "\xe9\xff\x67\x63\x7d\xd3\x92\xcf\x7a\xa1\xff\xdd\xb5\xa4\x3b\x6e" - "\x93\x97\x74\x1e\x3d\x39\x59\xe5\x3d\x6e\x93\xe7\xb5\xaf\x27\x27" - "\xcb\xff\x0e\x14\x3d\x59\xc7\xeb\xc9\xc9\xc9\x3c\x6e\x93\x4b\x08" - "\x6e\x93\xac\xbe\xe9\xc9\xc9\x19\xed\xe1\x66\x0b\x0d\xab\x63\x44" - "\xc6\x21\x4f\x1a\xa2\xb9\xbd\x09\x13\x63\x6d\x61\x61\x75\x72\xbf" - "\xef\xe2\xd8\x73\xfa\x04\x30\xf3\x1c\xfd\x7c\x8d\x4f\xfb\x4e\xd3" - "\xcf\x6f\xf1\x79\xdf\x69\xfa\xf9\x29\xb7\xec\xfb\x2e\xf4\xf3\xa3" - "\x65\xef\x3b\x4d\x3f\x1f\xc8\x6b\xd0\xe7\x13\x78\xac\x13\xd9\xf9" - "\x09\xb2\xf6\xa3\xa6\x9f\xab\xf2\x69\x3f\x6a\xfa\xf9\x33\x84\x5f" - "\xcf\x65\xb3\xfb\x51\xd3\xcf\x97\x77\xc8\x77\x5f\xe8\xe7\x46\xe2" - "\xfd\xa8\x99\xcd\x96\x60\x45\xfb\x23\xd3\x89\x09\xed\xf3\x59\x6d" - "\x60\x44\xc6\x68\x79\x3e\xbf\x10\x6a\x0b\x53\x1b\xe4\x7e\x67\x46" - "\xc8\xe7\xa9\xfb\x7d\xe3\xf3\xd4\xe9\xbe\xf3\x79\x6a\xc4\x2d\xfb" - "\xce\x0c\x3d\x35\x44\x3e\x9f\xa7\x54\xf3\xda\x7c\xaa\x8e\xe7\xf3" - "\x0b\x93\xe4\xf3\x79\x4a\xa1\x6f\x7c\x9e\xfa\x2e\xe1\xf3\x94\x24" - "\xc2\xe7\xa9\x05\x1d\xf2\xfd\x19\x7a\x4a\x20\xe1\xf3\xb5\x44\x65" - "\xfb\x4f\xbf\xa0\xf3\x82\xcf\x75\x8c\xc8\xf8\x35\xcf\xe7\xe9\xb5" - "\xc0\xe7\x3a\xb9\xdf\xbb\x11\xf2\x79\xfa\x1a\xdf\xf8\x3c\x7d\x88" - "\xef\x7c\x9e\xd6\x7c\xcb\xbe\x77\x43\x4f\xfb\x56\x3e\x9f\xa7\x15" - "\xf1\x31\xcb\x34\x0b\xcf\xe7\x17\xc3\xe5\xf3\x79\x9a\xd1\x37\x3e" - "\x4f\x5f\x4a\xf8\x3c\x2d\x92\xf0\x79\x7a\x4a\x87\x7c\x07\x87\x7e" - "\xa1\x9a\xf0\xb9\xa1\x50\xd9\xfe\xde\xd3\x25\xf7\x3f\xe6\xf9\xac" - "\x31\x30\x22\x63\xfb\x3c\x9f\x93\x4a\x6c\x61\x1a\x83\xdc\xef\xee" - "\x08\xf9\x9c\xe4\xdb\x77\x2e\xe8\x19\xbe\x7f\xe7\x82\x9e\xe1\xc3" - "\x77\x2e\x5c\xbe\xbb\x43\xcf\xf8\x50\x3e\x9f\x67\xac\xe6\x63\xb9" - "\x19\x26\x9e\xcf\x49\x0d\xf2\xf9\x3c\x23\xc6\x37\x3e\x27\x91\xef" - "\x5f\xd0\x33\x10\xe1\x73\xd2\xc8\x0e\xf9\x1e\x0f\xfd\x62\x11\xe1" - "\xf3\xcd\x3a\x65\xfb\xa7\x27\x99\xbc\xe0\x73\x1d\x23\xf2\xde\x83" - "\xe7\xf3\xec\xf5\xc0\xe7\x3a\xb9\xdf\xff\x11\xf2\x79\x76\x7f\xdf" - "\xf8\x3c\xeb\xa4\xef\x7c\x9e\xb5\xfd\x96\x7d\xff\x87\x9e\xb5\x56" - "\x3e\x9f\x67\x8d\xe3\x63\xdc\x59\x4e\xef\xff\x67\x1f\x93\xcf\xe7" - "\x59\xbe\x7d\x17\x88\x9e\x1d\x46\xf8\x3c\x93\x7c\x17\x88\x9e\x1d" - "\xd8\x21\xdf\x05\xa2\x67\xae\x26\x7c\x6e\x8e\x54\xb6\x3f\xfd\xec" - "\xec\xf6\xf9\xac\x35\x30\x22\xef\x84\x78\x3e\xbf\x34\xc9\x16\xa6" - "\x35\xc8\xfd\x0e\x91\x90\xcf\x73\x2e\xfb\xc6\xe7\x39\x3b\x7c\xe7" - "\xf3\x9c\xb9\xb7\xec\x3b\x44\xf4\x9c\x89\xf2\xf9\x3c\xa7\x1f\x1f" - "\xfb\xcf\x71\x7a\xff\xf7\x92\xfc\xef\x13\xd1\xc9\x66\xdf\xf8\x3c" - "\xe7\x3c\xe1\x73\x72\x21\xe1\xf3\x9c\xea\x0e\xf9\x3e\x11\x9d\x3c" - "\x8e\xf0\xb9\x35\x55\xd9\xfe\xff\x2f\xb5\x3b\xff\x43\x6c\x7c\xc3" - "\x31\x2e\xc5\x73\x7a\xae\xde\xf7\x31\x0e\xc3\x51\xdf\x38\x6d\x58" - "\xe8\x3b\xa7\x0d\xa3\x6e\xdd\x18\x87\x41\xfe\xb7\xfe\xe8\x97\x2d" - "\xfc\x18\x87\x21\x8a\xe7\xf4\x5c\x83\x7c\x4e\xbf\x5c\xe2\x1b\xa7" - "\x0d\x87\x08\xa7\x5f\x5e\x42\x38\x6d\x28\xee\x98\x31\x8e\x97\x75" - "\xbe\x8d\x71\xcc\x8d\x52\x32\xc6\xe1\xce\xe9\x57\xad\xbe\x8f\x73" - "\xbc\x9a\xe7\x1b\xa7\x5f\x1d\xe3\x3b\xa7\x5f\x0d\xb9\x75\xe3\x1c" - "\xaf\x34\xcb\xe7\xf4\x2b\xc7\xf8\x71\x8e\x57\x03\x78\x4e\xa7\x8c" - "\x94\xcf\xe9\x57\x36\xfa\xc6\xe9\x57\xb7\x10\x4e\xbf\x12\x47\x38" - "\xfd\xea\xfa\x8e\x19\xe7\x98\xdb\xe0\xdb\x38\x47\x4a\x80\x92\x71" - "\x0e\x77\x4e\xcf\xaf\xf2\x7d\xac\x63\xfe\x5c\xdf\x38\x3d\xbf\x8f" - "\xef\x9c\x9e\x77\xfe\xd6\x8d\x75\xcc\x3b\x29\x9f\xd3\xf3\xf2\xf9" - "\xb1\x8e\x79\xd5\x3c\xa7\x17\x04\xcb\xe7\xf4\xbc\x69\xbe\x71\x7a" - "\xfe\x4c\xc2\xe9\x79\xfd\x08\xa7\xe7\x27\x76\xcc\x58\x47\x4a\x99" - "\x6f\x63\x1d\xf3\xab\x95\x8c\x75\xb8\x73\x7a\xe1\x1e\xdf\xc7\x3b" - "\x16\x8e\xf2\x8d\xd3\xc6\xcb\xbe\x73\xda\x78\xe8\xd6\x8d\x77\x18" - "\x77\xcb\xe7\xb4\xd1\xe9\xfb\x17\x46\xa7\xf5\xff\x0b\x6b\xe5\x73" - "\xda\x18\xe9\x1b\xa7\x17\x0e\x27\x9c\x5e\x60\x21\x9c\x5e\x38\xb8" - "\x63\xc6\x3b\x16\x14\xf8\x36\xde\xb1\xb0\xdd\xfd\x2f\xc4\xc6\x3b" - "\xdc\x39\xbd\x24\xd5\xf7\x31\x8f\x25\x21\xbe\x71\x7a\xf1\x51\xdf" - "\x39\xbd\x78\xcb\xad\x1b\xf3\x58\xbc\x54\x3e\xa7\x17\xc7\xf0\x63" - "\x1e\x8b\x9d\xe6\x3f\x2d\x29\x95\xcf\xe9\xc5\x2a\xdf\x38\xbd\xa4" - "\x1b\xe1\xf4\xa2\x63\x84\xd3\x4b\x50\xc7\x8c\x79\x2c\x32\xfa\x36" - "\xe6\xb1\x64\xbd\x92\x31\x0f\x77\x4e\x2f\x1f\xe7\xfb\xb8\xc7\xb2" - "\xf3\xbe\x71\x7a\x59\x9e\xef\x9c\x5e\x36\xf3\xd6\x8d\x7b\x2c\x1b" - "\x2b\x9f\xd3\xcb\x42\xf9\x71\x8f\x65\x4e\xfb\xdf\x2f\xcf\x94\xcf" - "\xe9\xa5\x67\x7d\xe3\xf4\xb2\x1a\xc2\xe9\xa5\xf9\x84\xd3\xcb\x4e" - "\x77\xcc\xb8\xc7\xd2\x58\xdf\xc6\x3d\x96\xbb\xcd\x7f\x5b\x3c\x67" - "\x7e\xb2\x6e\xc1\x4b\x2f\x2d\x9e\xb3\x44\xb7\x38\x65\xee\xec\x39" - "\xa3\x06\x3a\x7e\x8f\x8a\x4c\x1d\x98\xda\x1d\x25\xcf\x9b\x39\x63" - "\xd9\xc3\xfc\xc5\x94\x39\xf3\xe1\x4f\x77\x64\x98\xb9\xd8\xa0\x5b" - "\xb2\xc2\x38\x47\x87\x7f\xcd\x9b\x6d\x84\x24\x0b\x96\xf0\x67\x9e" - "\x99\x93\x32\x33\x75\xee\xfc\x97\x75\x33\x53\xe6\xbe\x3c\x7f\xde" - "\x9c\xf9\x4b\x74\x8b\xe6\x2c\x5c\x3a\x77\xd1\x1c\xfc\xff\x62\xdd" - "\x4b\x0b\x16\xc1\x89\xd9\x73\xe6\x2e\x9b\xa3\x9b\xb5\xf4\xa5\x97" - "\xe6\x2c\x5a\xdc\x1d\x8d\x5f\x9a\xb2\x64\xae\x31\x65\x8e\x2e\x76" - "\xfc\xe8\x21\x93\xc6\x3c\x3b\xe9\xf1\xc7\xbb\x23\xa7\x6f\x4f\xeb" - "\x98\xdc\x68\x33\x70\x48\x75\x81\xfe\xdd\xe4\x0a\x2d\x42\x5b\x80" - "\x9b\x5b\x17\xa1\xe0\xcd\x8b\x90\x6a\xd3\x35\x14\xb0\xe5\x1a\x0a" - "\xb4\xbf\x5e\x6d\xd0\xbd\x82\x62\x98\x90\x89\x31\x5b\xaf\xa1\x50" - "\x7b\xce\x26\x13\x93\xb3\x29\xc3\x12\xb2\x28\x11\xa7\x65\x42\x16" - "\xa6\xe2\xf3\x80\x85\x8a\xc9\xc9\x8c\x3c\x47\xff\x2e\xd4\x12\xb2" - "\x38\x2e\xfd\x22\xa2\x98\x5e\xa9\xa5\x07\xec\x16\xea\x28\xde\x35" - "\x16\x6c\x85\xe8\x15\x55\x70\x1c\x46\xf4\xca\x14\x38\x56\xc3\x51" - "\x06\x87\x05\x8e\x26\x44\xaf\x4a\x86\x63\x2f\x1c\x67\xe1\xa8\x85" - "\x03\xce\xad\x0e\x84\x23\x14\x8e\x0c\x38\x0a\xe1\x28\x86\xa3\x8c" - "\xe4\xb3\x1a\x8e\x35\x09\x70\xa4\xc2\x91\x8d\xe8\xb4\x58\x38\x20" - "\x8f\x34\xc8\x2f\x0d\xf2\x4e\xdb\x08\x07\x3e\x5f\x04\x07\x4e\x7f" - "\x9a\x5c\x4b\x2f\x80\x03\x9e\x91\x0e\xf9\x67\x40\xde\x19\x71\x70" - "\x4c\x83\xc3\x00\x87\x11\x8e\x5c\x38\x20\x4d\x06\x3c\x6b\x2d\x5c" - "\x5b\x0b\xcf\x58\xbb\x04\x8e\x72\x44\xaf\x8b\x84\x03\xca\xf2\xbb" - "\x50\x72\xac\x2b\xe3\xff\x67\x8f\x40\x97\xdf\xae\xc7\xe0\xa0\xb5" - "\xf7\x9b\x4d\x3f\xb7\x42\xbb\x5d\x39\x84\x59\x87\x68\x26\x67\x71" - "\x9c\xf1\xe7\xc8\xef\x12\xbd\xa2\xb9\x12\xbc\x24\x13\xbc\x29\xc3" - "\xb4\xb2\x05\xae\xaf\x68\xc6\x36\x6b\xcc\x5a\xd1\x64\x46\x2f\xed" - "\xc5\xed\x53\x1e\x3f\x57\x34\x91\xfb\x57\x46\x9b\xfd\x50\x09\xbe" - "\x9f\x79\x5d\xbd\x91\x49\x4f\x7c\x0b\xaf\xc3\x85\xfc\xab\xf0\x3a" - "\x5d\x26\x5b\xad\x62\x82\x83\x8b\xb1\x8f\x31\xad\xc4\xe5\x5a\x71" - "\x8a\xb4\x47\xb8\x0e\x65\xb3\x84\x54\xe3\xf6\xa7\xc2\xbf\x19\xc0" - "\x9c\x29\x7c\xb2\x8c\xf8\x9d\x95\x6c\xfc\xd2\x12\x36\x44\x87\xaf" - "\x35\xbf\xeb\x6f\x62\xf6\x04\x24\x98\xe6\xb7\xa0\x5a\x7a\xc5\x49" - "\xa8\x1b\x05\x3e\x90\x62\x06\xf9\x9b\xec\xdb\x86\xe8\x0e\x01\x0f" - "\x70\xba\x4f\xd2\xea\xf0\xdf\x72\x7c\x9d\xc9\x1d\x52\x87\xc7\x81" - "\x4c\x69\x6f\x83\x5f\x5e\x71\xaa\x25\xec\xc9\x62\xdd\x33\x41\xcc" - "\x39\x7a\xe5\x1c\x28\x1b\x9b\xde\x51\x96\x96\x90\x6a\x23\xce\x9f" - "\xd1\xc5\x1a\xe1\x9a\xca\x9e\xb3\x28\x11\xca\xe1\x77\x05\xee\x63" - "\xa0\x8c\xa6\x67\xf0\x73\x57\x4d\x87\xb2\x52\xe9\x13\x21\xef\xb7" - "\x63\x8d\x1f\xac\x6c\xa2\xf0\x35\x7b\x76\xb5\x01\xf8\x1e\xc8\x64" - "\x2d\xcf\x7f\xb3\x37\x52\xed\x7a\x1d\xa1\x9d\xaf\xa3\x80\xc6\xac" - "\x55\x93\xcc\xb4\x35\x96\xf8\xbe\x15\x55\x14\xa4\x31\xd3\xab\x22" - "\x19\xe0\x2f\xfb\xac\x50\x7d\x92\x87\x67\xed\x6e\x7b\xd6\x36\x7d" - "\x12\x7e\x16\xb1\x51\xb5\x81\xfc\x25\x79\xd8\xf7\x74\x31\x62\xfb" - "\x61\xdb\x39\xf2\xb0\xe7\x38\xf2\x58\x79\x14\xdf\x0f\xcf\xcc\x65" - "\xde\xeb\x62\xb4\x6f\x1b\x6a\x34\xd3\x2b\x8d\xf8\x7a\xd0\x5a\xd4" - "\xc0\xc0\x5f\xfc\x7c\x82\x05\xd8\xbe\x0b\xf0\x03\xe3\xc1\x9d\x63" - "\xe0\x1c\xdc\x5b\x6d\x5f\xa7\x03\xde\x68\xe2\x08\xae\xab\x23\xe0" - "\x8a\x1d\x0e\xdb\xd0\x2a\xe4\x67\x7a\x06\x63\xba\x3a\x4e\x37\xa1" - "\x2b\xd8\x75\xf5\xd8\x36\x7b\x0e\x88\xc5\x36\x09\xde\xd5\x1b\xec" - "\xb2\xae\xa5\x88\xcd\x03\xea\xe3\x6c\x1f\x5c\x87\xc6\xac\xd5\xa9" - "\x2e\x36\x0a\x86\x73\x99\x66\xd4\x52\x8b\xcf\xe9\x1e\x60\xb9\x74" - "\x8a\xe1\xf0\xc2\x7c\xc6\xd8\xd9\xf3\xa2\xcd\xf8\xf7\xe4\x08\x14" - "\x1c\x54\x85\x28\x5d\x5a\x78\x29\xc1\x78\x48\x1d\x94\xb9\x10\x3f" - "\x0b\xfe\xd6\x31\xdb\xfa\x46\xdb\xd6\x41\x1f\xda\xc6\xab\x35\x01" - "\xb6\x1c\x4d\x4c\x4b\xd8\x43\x85\xcd\x79\x0f\x26\x31\xd9\x9a\x18" - "\xbc\xae\xfc\x1c\xbd\x86\x5d\x6b\xc7\xac\x0b\x40\xe4\x39\x9a\xd8" - "\xb4\x14\xc6\x92\x76\x15\xec\xaf\x7e\xa8\xf0\x93\x65\x16\xc0\xe1" - "\xc1\x24\x8c\xf3\xa1\x9b\x4d\x14\xde\xeb\x8f\xe9\xb5\xfc\x93\x9d" - "\x50\x9f\x1d\x50\x17\xa8\x27\xc2\xf9\x36\x66\xad\x89\xe3\xeb\xb3" - "\xba\x1e\x63\x0e\xcf\x48\x24\xcf\x86\x7c\x29\x78\x46\x88\x26\x11" - "\xd2\x19\xcd\x7e\xef\xe9\x1c\xf5\x66\x9f\xcd\xa7\xe3\xda\xc8\x9a" - "\x64\x0b\xa4\x6d\x5d\xc6\x54\x6d\xfd\x1a\xf2\x5f\x87\x98\x96\x9b" - "\x4c\xf9\xea\x04\xa6\x29\xeb\x39\x3c\x7f\xb1\x1a\xa5\xcf\x44\xfd" - "\x7a\xac\x65\x2c\xf1\x36\x14\xd4\xa3\x3a\x88\x39\x99\x50\xcd\x7e" - "\xf3\x60\x75\x15\x53\x57\x61\x3c\x8c\x56\x9f\x47\x81\x6b\xe6\xa2" - "\xd0\xf4\x04\xa8\x4b\x39\xd3\x54\x99\x5a\x8d\x2a\x1a\xe0\x30\x9e" - "\x84\x74\x67\xe0\x38\x8c\xd2\x57\x20\xd5\x04\xe8\xcf\xd2\x6e\xa0" - "\xc0\x0a\xe3\x0d\x38\x77\x19\xad\x4e\x62\xac\x27\xcb\x71\xba\xe3" - "\x28\xde\x6a\x09\x5a\x73\x19\xa9\x76\x3e\x87\xd7\x6a\xd7\xa0\x5d" - "\x50\x96\x96\x90\x4d\xc5\xcd\x39\x99\xd1\xd7\x97\x31\xd6\xc6\xac" - "\xb4\x91\x66\x34\xdc\x28\xa8\x0b\x2e\x73\x0b\x42\x80\x95\x1f\x4e" - "\x63\xcf\x1b\x14\x33\xc3\x8a\xfd\x46\x5a\x24\xe8\x09\xe4\xb8\x8e" - "\xaf\x59\xc2\x06\xc5\xc0\xf9\x69\xf1\x56\xa6\x11\x70\x66\xeb\x0d" - "\xf6\x9f\xc4\xd5\x7f\x12\x6d\x44\x2a\x78\x46\xa1\xd9\x6f\xaf\x15" - "\x3f\x03\xf2\xec\x02\x3c\x9e\x86\xb9\xc1\x5d\x3b\x6c\xf6\xfb\x63" - "\x2c\xcf\x17\x16\xff\x2e\x8e\xb2\xc0\xf5\x6a\xb8\x77\x9c\x13\x9f" - "\xb0\x7f\x68\xbb\xce\xf5\x53\xd8\xe7\x24\xdb\xb1\xcf\x0c\x0e\x5e" - "\x6f\x0b\x1b\x62\x61\x42\x6a\x40\x9f\x68\x03\x19\x8a\x69\x9a\x60" - "\x65\x9a\xec\x79\x7d\x70\x1f\x15\x58\x69\x6d\x40\x24\x7d\xfa\x5a" - "\x26\xa7\x26\x80\xcc\x0d\x4d\x9f\x8b\xf3\x04\xcd\x92\x9d\x75\x0d" - "\x05\xc7\x57\x31\x4d\xb8\x5d\xda\x73\xce\x67\x64\x2d\x42\xa1\x4c" - "\xde\x10\xb3\x3d\x4c\x6f\x69\xde\xfd\xa4\x09\xfb\x4e\x26\x2c\xda" - "\xcc\x64\xc3\xbd\x5c\x3e\xf0\x5c\x7f\x33\x9d\x1e\x63\x87\xfb\x99" - "\xdc\x3e\x31\x1c\x0f\x58\x3f\x47\xfc\x63\x7a\x0c\x33\x10\xae\x65" - "\x07\x6f\x84\x6b\xfe\xe7\xe8\xf4\x72\x38\x8f\xe0\xb7\xc9\x94\x76" - "\x0d\xe7\x71\x8a\x70\x28\x78\xbd\xe0\x37\x85\xed\xb9\xaa\x1e\xb7" - "\x6b\xa2\x2f\xd3\xaf\xf2\xed\xd6\xd1\x4e\xa0\xbd\x86\xf5\x49\x68" - "\xcc\xca\x50\x99\xfd\x54\x81\xac\x2f\x87\xfb\x1a\x58\x5f\xb3\x1a" - "\x81\x16\x2b\xfb\x2c\x01\xa1\xcf\xca\x11\x82\x34\x7a\xb3\x5f\x97" - "\x28\xde\x96\x19\xa3\x71\x5a\xb6\x4d\x42\xdb\x24\xcf\x03\x9e\xc3" - "\x3d\xcc\xb6\x87\xb2\xb1\x7f\xc1\x7e\xc6\x4c\x67\x8c\xc4\x3e\x06" - "\xda\x67\x13\xf1\xe7\x5d\xe2\xd8\xf6\xf9\xfa\x6f\x53\xa1\x5c\x19" - "\xe7\xb8\xb2\x38\x97\xcd\xe1\x4b\x98\x9c\xdf\x36\x91\xb4\x9a\x24" - "\x78\xfe\x5e\xb3\x5f\xd7\x40\x67\xae\x91\x7a\xad\xed\x3f\xb4\x1c" - "\xfe\x07\xbd\xe1\xc8\x0b\xda\x6a\x00\xf8\xe4\x2f\x31\x07\xb1\xcf" - "\xd9\xfe\x3a\xc6\xe3\x69\xd4\x9c\xf3\x34\xf8\xe6\x0c\x8b\xa3\x9d" - "\xda\x97\x31\x67\x01\x57\x64\xbf\xc9\x9c\xde\x0a\x58\xc6\xdb\x68" - "\x66\x86\x6d\x30\x02\x3d\x6a\xdd\x05\xe7\x77\x2d\xc3\x7a\x2e\x6d" - "\x30\xb4\xe5\x00\xf1\xb4\x2a\x84\xd3\xb1\xe9\xb9\xb4\x2d\x21\x4f" - "\x23\xb6\xcc\xeb\x68\x3b\x94\xcf\xcf\x51\xa6\x96\x10\xcd\xb8\xc6" - "\xac\xb5\x29\x66\x74\x43\x2f\x68\x2f\xaf\x07\xed\x65\x98\x44\xcc" - "\x2b\x1a\xea\x92\x03\x7f\xbb\x72\x3c\xed\xf1\x19\xa4\xc0\xab\xb7" - "\xaf\x03\xde\x6f\xaa\x19\x0b\xdc\x5f\x64\x46\x53\x58\xff\xb8\x19" - "\x7e\xe3\xf3\x38\x0d\x9c\x3f\x66\x46\x53\x4f\x93\x7c\x57\xd5\x63" - "\xfc\x5c\xf2\xbd\x48\xf2\x65\xcb\xd2\x03\xe7\x89\xef\xc3\x79\xee" - "\xd8\xc6\xd4\xe3\x7c\x1a\xb3\xd6\x05\x38\xf2\xde\x02\xe7\x1c\xf9" - "\xc7\xce\x73\x3c\x63\x9d\x1e\x9e\x31\xcd\xb9\xec\xdb\xb7\x31\x0d" - "\xa4\x5c\xeb\x62\xcd\x68\x66\x11\xbe\xb6\x09\xce\xe1\x7b\x9d\xda" - "\x1b\xcd\x73\x68\x1d\xd4\x3f\x29\xca\xd9\xbf\x03\x46\x3d\x1d\x9a" - "\x80\xcb\x2b\xdb\x91\x97\x6b\x3e\x4c\xf6\xd3\xce\xed\x35\x10\xe7" - "\x0b\xe9\x4d\x66\x34\x2d\x95\x94\x6b\xa5\xb1\x81\xf0\x1d\xec\xbe" - "\xee\x3c\xb6\x3b\xee\x6b\xec\xeb\x38\xdd\xb1\xfb\xc9\x32\x8e\x1b" - "\x66\x47\x7f\x04\xb8\x40\x5f\xf4\x3b\x15\xef\xbb\xd7\x9d\xc5\x78" - "\x83\x1d\xad\xe0\xff\x83\xb1\x5f\xe2\xda\x64\x33\xee\x83\x1c\x75" - "\x87\x7c\x54\xf6\xac\xe5\xd7\x30\xef\xa1\x4f\x43\x4c\xd8\xa0\x2a" - "\xc8\x67\x9c\x4b\x9f\xa6\x22\xe9\x52\x1f\xc4\x69\xde\x50\x33\x75" - "\x90\xc6\xe8\x48\x83\xaf\x83\x8d\x7f\x0d\xe7\xd6\x9b\xd1\x9c\x50" - "\x7c\x2e\x0b\xd2\x98\xe9\x54\xc9\x35\x30\x69\x03\x10\x55\x59\x60" - "\xc6\xf1\x21\x6e\xe3\x23\x2b\xfb\x35\xa0\xca\x02\x3b\xb2\xbf\xd7" - "\xc5\x12\x93\xc6\x98\x2e\xd0\xeb\xfd\x2a\x9a\xea\x90\x3c\x4d\xf7" - "\x3b\xf6\xfb\x45\x4c\x0b\xc4\x31\xab\x1f\x46\xb8\xbf\xbf\x42\x6f" - "\x18\x56\x69\xb9\xc6\xfa\x3b\xf8\x9f\x5d\x73\xf9\x06\xc4\x3d\x38" - "\xf6\x81\xf8\xd6\x90\x4d\x91\xf8\xc7\x0e\x69\x77\xe2\xf3\x38\x36" - "\x82\xb8\x6c\x97\xd3\x35\xe6\x3d\x7f\x23\xb1\xdd\xfa\x8b\xd8\x8e" - "\x6c\x79\xad\x4f\x99\x70\x99\xed\x7b\xfc\x8d\xb8\x0e\xe9\xa9\x8c" - "\xbd\xd2\xda\x68\xaa\x68\xb0\x21\xdd\x32\x1c\xb7\xad\x3f\x1e\xbf" - "\x03\x31\xe0\x0f\x65\xc6\x4d\xeb\xd9\xf9\x0f\x10\xdb\x5e\xb1\x0c" - "\xf4\x37\xa6\xdb\x10\xb5\x35\xcd\x3f\xe0\xc9\x02\xc6\x74\x7d\x50" - "\x17\xe0\xd5\xfa\xba\xa3\xa9\x08\xc9\xd7\xbb\xeb\xeb\x1c\x75\xdf" - "\xc9\xd5\x1d\xce\xb1\xeb\xe5\x87\xe6\x67\xb0\xf5\x35\xd3\x1b\x74" - "\x52\x78\x31\xeb\x82\x98\xcf\x0a\xac\x68\x71\x01\xd3\xb2\x78\x07" - "\xa2\x6c\xdb\xfa\x9a\x3e\xd8\x79\x16\xfb\xf6\x18\x87\x3d\x59\xdb" - "\x41\x4c\x6f\x4c\x43\x41\x97\xe8\x0d\x27\xe2\x57\x23\xf6\x3b\x48" - "\x9f\x42\x3a\x79\x65\xdd\xc0\xce\x2f\xa8\x80\x58\x39\xde\xc6\xd8" - "\x49\xff\xb4\xe1\xea\x04\x2e\x3f\x7c\xcd\x81\xdf\x4e\x2e\x86\x55" - "\xf0\x0c\xc9\xfd\x4f\x3c\xd4\x35\x58\xbc\xae\xaf\x1d\x54\x5e\xd7" - "\xd7\x32\xdc\xeb\xfa\x5a\xcd\xad\xad\xeb\x6b\xb5\x0a\xea\xaa\x13" - "\xaf\xeb\xef\x77\x2b\xaf\xeb\xef\x53\xdc\xeb\xfa\xfb\x13\xb7\xb6" - "\xae\xbf\xaf\x52\x50\xd7\x48\xf1\xba\x6e\xdc\xa2\xbc\xae\x1b\x13" - "\xdd\xeb\xba\xf1\xe0\xad\xad\xeb\x46\xc9\xfd\x6f\x19\x2a\x88\xc1" - "\xfe\x09\xfc\x52\x4b\x5a\x33\xe8\xba\x6d\x91\x19\x6b\x76\x23\xaa" - "\xbc\xa1\x09\x55\xf4\x3b\x8b\x35\x33\xf5\x90\x91\xd5\x3d\x23\x99" - "\xd7\xab\x33\x2a\x0a\xea\xe1\xfc\x05\x74\x32\xb5\x09\xc5\x2c\xc2" - "\xfe\x77\xd3\xda\xca\x64\xb9\xfe\x77\xd3\xb8\x36\xff\x6b\x7d\x98" - "\xf3\xb9\x9b\xf7\x57\xd4\xb7\x20\x5c\x7f\xf8\x7f\x7b\x9b\xff\x5d" - "\x47\xec\xed\xea\x7f\xb1\x3d\x2a\x9b\x9a\x04\xfe\x97\xac\x85\xda" - "\x3c\xc7\xd5\xf7\x66\x5d\x42\x48\xdc\xf7\x6e\x1e\x8d\x7d\xef\x4e" - "\xb8\x2e\xaf\xfc\x9b\x03\x1d\xbe\x37\x1b\x9e\xe9\xec\x7b\x3f\x4b" - "\xc6\x7d\xf4\xe6\x64\x65\xbe\x77\x73\xb2\xa3\xde\x3b\xb8\x7a\x83" - "\xad\xca\x84\xbe\x77\x73\x81\x37\xbc\x65\xb6\x85\x15\x7e\x70\x5f" - "\x93\xbf\x7d\x4f\xd7\x62\xdc\xbf\x35\x82\x4d\xfe\xb2\xb3\x49\x75" - "\x81\xfe\x03\x99\xab\xd5\x98\xec\xc7\xec\xe9\x92\x18\xbf\x84\xf9" - "\x86\x19\xd8\xb5\x18\x8f\x47\xe2\xb8\x1a\xae\x4f\x64\xde\xed\x92" - "\x28\xaf\xdc\x24\x4f\xe6\x3d\x95\x25\x0d\xda\xcb\x07\xcb\x9a\x28" - "\xfb\xaa\xc4\x20\xc0\x21\x98\xc9\xeb\x63\x66\x5e\xeb\xb6\xfe\x7a" - "\xde\xd0\x84\xe3\xfa\xf3\x08\xa7\x65\xd6\xaa\x46\xfa\x50\xfe\x6a" - "\xcf\xe5\xcf\x0c\x51\x50\xfe\x6a\x19\xe5\xaf\xf6\xaa\xfc\x6a\x28" - "\x7f\x4b\xb4\x3f\xc4\x82\xd4\xa7\x2d\xd1\x2a\x79\xe5\xc9\x4c\xf1" - "\x0a\x63\xdf\x9e\xe1\xb5\xff\x63\xd4\x83\xcc\x1f\xec\xb4\x50\xe0" - "\x03\xd8\x3e\x1c\xb7\x3d\xe2\xff\xea\x20\x66\xfe\x86\x21\x3e\xc9" - "\x22\xd3\x27\x6d\x91\x5c\xff\xe4\xfe\xfc\x7b\x63\x6e\xc3\xf3\xa5" - "\xeb\xef\xea\x13\x0f\x04\x54\x49\xfa\xc4\x6d\x7d\x63\xdc\x7d\x62" - "\x56\x9e\x7c\x9f\x98\x95\xe4\xee\x13\xb7\x1e\xe5\x7d\xe2\xd6\xfd" - "\xca\x7d\xe2\xd6\x15\xde\xfb\xc4\xad\x93\x95\xf9\xc4\xad\x3a\xcf" - "\x3e\x71\x6b\xaa\x32\x9f\xb8\x35\xd5\xdd\x27\x66\x55\x0b\x7d\xe2" - "\x56\xc9\x77\xbd\x4c\x26\x63\x84\x3e\x3a\xf0\x12\x9d\x9d\x61\x5d" - "\x07\xf1\x6c\xf6\x72\x03\xf4\xb3\x8d\xcc\x16\xc6\x68\xa7\xa2\xb0" - "\x5f\x89\x69\x6c\x34\x04\xd8\x97\xeb\x03\x99\xde\xc1\x8f\x32\xad" - "\x5a\x3c\x7e\x17\x0e\xe5\x0f\x62\x1a\xf5\xbd\x98\xe5\xfa\xde\x05" - "\x37\x51\x28\x1c\xda\x02\xae\x3f\x86\xff\x23\x99\xe5\xda\xee\x59" - "\xcb\xd0\xe0\xa0\x06\x14\x00\x65\x48\x0c\x5a\x1b\x8c\xc0\x07\x85" - "\xe2\xff\x99\x75\xdb\xd1\xae\x9b\x48\x15\x94\x0a\xd8\x84\xc0\xf3" - "\x52\x83\x18\x66\xb1\x1e\xed\x5a\x04\x71\x35\x85\xb4\x3b\x29\xa6" - "\xd8\xda\xa8\xa7\x6c\xa1\x0f\x21\x82\x4f\x4e\x14\x1b\x7b\xe5\x0e" - "\x29\xb7\xab\x87\x94\xd8\xd2\x0d\x34\xb3\x2a\x91\xc6\x65\xb5\xe5" - "\x0e\x29\x66\xb6\xc1\x91\x6e\xe8\x85\x35\x34\xc4\xdd\x91\x4c\xa3" - "\xb6\x3b\xc4\xe4\x83\x77\x2e\x43\xe1\x3b\x6e\x22\x3d\x73\x5d\x4f" - "\x01\xfe\x89\xf8\x7b\xa2\x60\xa3\x44\x3b\xb5\x1d\xc1\x35\x15\xf6" - "\x89\x0c\x7e\xbe\x15\x9e\xdf\x0a\xcf\x6f\xc1\xdc\x46\xda\x5d\xf0" - "\x7c\xdb\x72\xbd\xcc\xf6\x92\xc3\xbe\x7b\x70\x94\xcb\x3e\x38\xb8" - "\x8a\x39\x00\x07\x2e\x17\xd8\x70\x17\xb6\xc9\x43\xc1\xa7\x71\xd9" - "\xb6\xdc\x44\x83\xa1\x9c\xe1\x50\x06\x3d\x3c\x17\xef\xc5\x92\xf8" - "\xe2\xc2\x60\xcc\x51\x41\xd9\x6c\x39\x5c\xd9\x7e\xd0\xe3\x3d\x8c" - "\xda\xca\x86\x9f\x85\xed\x23\xf5\x9e\x33\x7e\xcd\x7d\xb8\x6d\x7e" - "\x17\x94\xda\x35\x0e\xbf\xf3\xbc\xbe\xca\x20\x93\xab\x39\xe5\x52" - "\x7c\xd9\x7a\x00\xf5\x63\x82\x17\x1a\x26\x6c\xf8\x86\x89\xb7\x22" - "\xb4\xe1\x00\x1a\x5c\x09\xed\xba\xa2\xe9\x32\x62\x42\x16\x1a\x8e" - "\xeb\xeb\x65\x3e\xeb\xf5\x68\xa9\x67\x6d\x5e\xc7\x54\xd9\x43\x87" - "\x58\x98\xd0\xa1\x71\x5b\xd7\x31\xa9\xad\xe1\xfe\xd9\x2d\xe1\x5d" - "\x92\x66\x58\x83\x81\xd7\x4c\xaa\x6e\x11\xd2\x5d\xa0\xf3\xd7\x7c" - "\x7e\x1a\xe2\xd2\xa9\x28\xe0\x1c\x9d\x5f\x92\xfe\x15\x7e\x1f\xf4" - "\x7a\x99\xf0\x7d\xd0\xeb\xf5\x88\xce\x9d\x86\xe8\xbc\x14\x44\x6f" - "\xcb\x46\x90\x4e\x78\xfc\x4f\x11\xc9\x2b\x77\x44\xfc\xbe\xfb\x50" - "\x9a\x95\xf9\x8e\xc9\xae\x29\xcd\xa2\x98\xa6\xf8\x08\x3f\xb3\x69" - "\x19\x7e\x4f\x92\x3b\x0c\x6c\xfa\x3d\xf4\xb5\x41\x17\xe8\x37\x6c" - "\x80\x29\x32\x2e\x42\xf7\x5c\xa2\xdf\xb0\xe2\x76\x13\xd4\xd0\x35" - "\xce\x96\x9e\x88\xac\xba\x27\x4d\xad\xb9\x43\xcc\xb6\xdc\x3e\x31" - "\xf6\xe0\xe5\x86\xf4\x8b\xa8\x1f\x7e\xbf\x09\x6d\x23\x71\x86\x2d" - "\x00\xb7\xc7\x44\xd3\xac\xcf\xd1\x85\x25\x88\x4a\xbf\x81\x7a\x02" - "\x37\xdb\xda\xd5\xf8\xfa\xa0\xa6\x35\xf5\x8c\x1d\xb7\x2d\x3c\xbe" - "\x0a\xd7\x7a\xa5\xdd\x80\xf8\xde\x52\x87\x0a\x16\xa1\x50\xdb\x62" - "\x43\x6f\xcb\x75\xc3\x3d\x6f\xd9\x51\x68\xaf\x06\x14\x5c\x70\x0d" - "\x38\xb5\x18\xf8\x74\x0d\xda\x99\x85\xb4\x33\xbc\x9e\x7e\x27\x6e" - "\x63\x9b\x3f\x39\xbb\xeb\x1a\x69\x63\x2c\x8f\x70\x1b\x5b\x00\x3c" - "\x9a\x8f\xfb\x0f\xe0\xd1\x3a\x68\x63\xd0\x2e\x98\xac\x9c\xa2\x82" - "\x75\x0c\x5a\x33\x17\x51\xbb\x2e\x75\xc5\xd7\xfc\xfc\x23\x28\xdd" - "\xe7\x09\x4d\x88\x1f\xeb\xc8\x3f\xd8\x32\xb0\x4b\x92\xee\x19\xe6" - "\x87\x73\x74\xae\x1e\xce\x07\xe8\x9e\x7b\x30\x18\xec\x7d\x90\x8c" - "\xcd\xe5\x97\xe0\xf1\x4e\x33\xd8\x02\xdb\x45\xf7\x0c\x7a\xf0\x1c" - "\xfd\xba\x0d\xdb\x71\xf9\x5e\x44\x1b\x7f\xcd\xd4\x82\xfd\x54\x64" - "\x4c\xf7\x75\x76\x9f\x02\xfc\x0e\xfd\x0b\xf6\xfd\x14\xb9\xc7\x06" - "\x76\xb3\x06\xd7\x04\xd8\x43\x1f\x0a\x36\xbd\xd2\xc2\xfa\x21\x6c" - "\xc7\x0b\x29\x88\x9a\x51\x0f\xb6\xb2\x81\xad\x1a\xf5\x81\xe0\x8f" - "\x12\xb0\x3f\x62\xb2\x83\x23\x57\x9b\x19\x7b\x7c\x32\xcd\xa4\x2d" - "\x44\x01\x95\xa9\x36\xf4\xa2\x11\x31\x6b\x2e\x83\xbd\x1a\xce\x22" - "\xf0\x4b\xbd\xc0\x67\xf5\xde\xb1\x0c\x85\x62\x7b\xf5\xac\x07\xad" - "\xf2\xfa\xe2\xa4\x03\x69\x65\xfe\x36\xe0\x2f\xf6\x4f\x41\x6b\xfd" - "\xba\x41\x3b\xeb\x95\x89\xdb\x23\xb4\xcf\xa0\xb5\xac\xbf\x4c\x2c" - "\x80\x76\x68\x5d\xae\x7f\xa0\x75\xb9\x5e\x07\xc7\x7d\x0e\x1f\xe6" - "\xf0\x1f\x4c\xd6\xeb\xa1\xd8\x7f\x55\xa6\x9a\x91\x15\x6c\xdb\x0b" - "\xf7\x75\xcb\xf5\xfd\x58\x1b\xbf\xac\x47\x43\x9b\x90\x1f\x94\x29" - "\x18\xca\x8b\x76\xbd\x84\x02\x4e\x1a\xce\x21\x1b\xb4\x0d\x87\xdd" - "\xc7\xcf\xd5\x21\xc8\x97\x3a\xae\x3f\x83\x38\x9b\xf9\x49\xf3\x6e" - "\xdb\x26\x9e\x77\xdb\x36\x61\xdb\x11\xde\x6d\xdb\xf8\x53\xe4\xdd" - "\x17\x89\x2c\xef\xe8\xd6\x81\x98\x4f\xb9\xaa\x4a\xeb\x47\x60\xa3" - "\x6d\x4b\x30\x47\x30\x67\x4e\xbc\x8f\x39\xf3\x3f\x05\x9d\x95\x33" - "\xcd\x8d\x7a\x1d\x1c\xb7\x85\x33\x90\x2f\xcb\x19\x6c\xab\x2f\x12" - "\x5b\x90\xc3\x46\x6c\x5b\xcd\x5e\x68\xd0\xa5\xa3\xc7\xa1\xad\x96" - "\x04\xad\xbd\x0f\x9d\x64\xed\x94\x5f\xa2\x7b\x8e\xb1\x9f\xa3\xff" - "\xe7\x4c\xfa\x29\x14\xdc\xb2\x8e\x61\x2a\xad\xfb\x91\x3d\x54\x6f" - "\x61\xdf\xf9\x65\x9f\xcf\x80\x98\xd5\xc0\xe0\x77\xed\xeb\x00\x33" - "\x23\x1e\xa3\x5f\x94\x68\xcb\x8b\x36\xdb\x73\x16\xa6\x32\x21\x99" - "\x91\x36\x68\xd7\xf6\x9c\x89\x31\xf6\x90\x4d\x19\x8d\x59\xf9\xfd" - "\xcc\xa8\xa4\x90\x7d\x2f\x90\x3b\xc4\x02\xbe\x01\xfb\x5f\x76\xbd" - "\x9f\x85\x7d\x87\x97\x3f\xd2\xf1\x0e\x19\xfb\x04\xee\x3d\x04\xf7" - "\x9e\x22\x1f\x63\xd8\x1d\xbf\xa7\xe0\x7c\xca\x10\xc7\x7b\x0a\xc7" - "\x6f\x7c\x1d\xee\x8b\xc4\xe3\xaa\x4e\xf7\x15\x71\xe9\xb8\xfb\x5e" - "\xff\x10\xfb\x7a\xfe\x3e\xf2\x1b\xfc\x4a\x51\x2b\x85\x02\x44\x35" - "\x4e\x68\xb4\x19\xda\x0f\xc4\x46\x6f\x0e\x81\xbf\xd4\x05\x7a\xfb" - "\x78\xf8\x4b\xc3\x5f\x76\x1c\x53\x5e\x7f\x95\x5f\x47\xde\x15\x0d" - "\x5d\xc2\x95\xfb\x22\xdb\x26\x7f\x8e\x7a\x5e\xe2\xfe\x6f\xcc\xda" - "\x1e\xeb\x78\x17\xde\x96\x9e\xc7\x07\x97\x85\x06\x8c\x54\xe4\xfd" - "\x3c\xf9\x8d\xe7\xbe\x70\xf9\xb1\xbf\xed\xe1\x01\x09\xa6\xb4\x73" - "\xa8\x9e\xde\x5e\x5c\x09\x7d\xb8\x7d\xdb\xd0\x25\x5b\x6f\x42\x1b" - "\x48\x6d\xf3\xc9\x17\xa1\x2d\x06\x98\x56\xb2\x69\x72\x58\x9d\x9b" - "\x3b\x28\x81\x79\xbd\x26\x03\xc7\x82\x8d\x8c\xe1\xd7\xdc\xdf\x51" - "\xb8\x3d\x91\x71\x93\xed\x36\x06\xb0\xc5\xdf\x43\x6f\x9b\x0f\x84" - "\xbf\x53\x9e\xa1\xea\x77\x74\x35\xe9\x2b\x1d\xe5\xc5\xdf\x32\xc7" - "\xf3\x6d\x1e\xcc\x40\x19\x8d\x22\xdf\x32\xe7\xe7\xe5\x6c\xaf\xb3" - "\xe7\x0d\x4a\x68\xcc\x7a\x33\x1a\x30\x48\x75\xae\xb3\x18\x16\x66" - "\xfa\xcd\x49\x52\xd7\xe4\xe1\xf0\xa6\x51\x2a\x9f\x31\x7a\x1b\x23" - "\x33\x2f\xe9\xf1\x9f\x70\x95\x25\x7e\xaf\xcd\x64\x6f\x4d\x0c\x3a" - "\xbe\xfa\xb2\x4c\x6d\xf3\x96\xe4\xfe\xa7\xb6\xdc\x88\xe0\xd6\x41" - "\x2a\x0b\x60\x13\x68\x5b\x90\xf8\x54\xc5\x5e\x2b\xda\x37\xbf\x8e" - "\xc2\xfe\xb0\xe8\x52\x31\x15\x1f\xc1\x69\xb8\x5a\x14\x8c\xc7\xbd" - "\xb0\x96\xcb\xba\x82\xc2\x5b\xd2\x13\x83\x5a\x5a\x13\xd1\x1f\xae" - "\xa0\x91\xf6\x97\xb5\xdd\x33\x5f\x42\xaa\x66\xf0\x85\xcd\xdf\x19" - "\x82\xbe\xa8\xae\x43\x9f\xc2\xbd\x15\x0d\x66\xb4\x13\xd2\x32\xdf" - "\x25\xf6\x7a\x3a\x89\x69\x2a\x4f\xfa\x08\xc5\xeb\x6d\xa6\xb4\x6f" - "\x51\x4f\xf0\x89\xc1\x95\xa9\xef\xb2\xef\x76\xfd\x57\x50\xba\x4a" - "\xeb\x79\xb4\xe5\x25\xf0\xa5\xe0\x3b\xd3\x27\x43\x9f\x01\x9c\x78" - "\xcb\xb9\xcf\x78\xe5\x4d\xbe\xcf\xf8\x01\xfa\x8c\xd7\xa1\xcf\x48" - "\xd7\xa2\x0a\xa3\x09\x81\x0f\xeb\x3a\xc1\x18\xd4\x94\x66\x84\xbe" - "\x63\x05\xf4\x1d\xa9\xe7\x11\xdb\x6f\xd4\xd7\x21\xf0\xf9\xbd\x76" - "\xcc\x47\xa1\x2d\x3f\x40\xdf\xf1\x03\xf4\x1d\x69\xa4\xef\xd8\x7e" - "\x05\xfa\x8e\x05\x10\x1b\xcc\x87\xbe\xa3\x5e\xa4\xef\xb8\x22\x1e" - "\x17\x38\xfc\x60\xf3\x0f\x7a\x6a\x3b\xf4\x1b\x2b\xcf\x20\x6a\xfb" - "\x73\x5d\x65\x72\xa6\x60\x8f\x24\xce\xdb\x86\x3e\x6b\x67\x12\x11" - "\xb6\xfb\xca\x26\xe8\x87\x01\x97\x4a\xbd\x15\x05\x9d\xee\x1a\xd7" - "\x0c\xe7\x5b\xd5\x61\xa6\xbd\x5f\x5b\x28\x26\xb7\x8f\xb9\x19\x70" - "\x5b\xb9\x14\x51\xad\x80\x61\xd1\x33\xd9\x14\x8e\x13\xed\x79\x6a" - "\x15\x89\x49\x77\x1e\xc1\x63\x22\x41\x66\x82\x9b\x95\x49\x0c\x62" - "\x66\x27\xf6\xdc\x32\x0b\xa9\x6c\xff\xd5\x76\xb7\xcf\xd6\x06\xa4" - "\x9d\x41\xc1\x96\xd9\x06\xb0\xd7\x65\xf4\xe9\x97\xd9\xd4\xae\xa9" - "\x48\x87\xf7\x3e\x64\x5e\xfb\x73\xfe\xae\x17\x51\xf4\xae\xff\xa0" - "\xa8\x9d\x53\xd1\xe0\x1d\x5f\xe3\x3d\xd2\x01\xc3\x3a\xa6\xe9\xa4" - "\xe1\x13\xfc\xbe\x3d\x86\xd9\xa6\x35\x31\x61\x11\xc1\xf0\x7f\x74" - "\xf6\x54\x88\x1f\xe0\x7a\xbc\xbe\xd9\x54\x99\x7a\x12\x65\x9e\x43" - "\x28\xed\x22\x87\x71\x1b\xbe\x35\xc8\x4a\x81\xff\xc0\x9a\x60\x3c" - "\xc1\x17\xbf\x07\xc3\x31\x47\x1b\xc6\x2f\xfd\x5d\xa8\x0b\x38\x8c" - "\x4f\xd6\x57\x21\xe8\x03\xbb\xb6\xe9\x03\x16\xe3\x1a\xe4\xd0\x06" - "\x80\x4d\x2f\xd0\x02\xa1\xcd\xd7\x5d\xf4\xc1\x22\x85\xfa\x80\x8b" - "\x6f\xac\x8b\xf5\x54\x01\xc5\xa0\xf4\x93\x88\xca\xb7\xcb\xc5\x78" - "\x27\xbb\xff\x23\x1e\xfb\x22\xf3\x60\x76\x8c\xc6\x58\x98\xe9\x1d" - "\x31\x93\xf5\x7e\x48\x19\xf6\xea\x98\x76\xb0\x5f\x4f\xb0\x2f\x3c" - "\xa4\x0c\x7b\x75\x0c\x60\x6f\x51\x86\xfd\x0d\x99\xd8\xb3\x7b\x48" - "\xfe\x44\xb1\x2f\x5c\x2f\xc4\x7e\xd7\x28\x82\xfd\xae\x91\x3e\x60" - "\xdf\x4e\xbb\xd7\x70\xed\xfe\xed\x83\x0a\xb1\x87\x76\x5f\x12\xa7" - "\x0c\xfb\xcb\x32\xb1\x67\xf7\xa1\xfc\x89\x62\xff\x76\x86\x10\xfb" - "\xdd\x23\x08\xf6\xbb\xa3\x95\x63\xaf\x69\xa7\xdd\x6b\xb8\x76\xbf" - "\xe7\x43\x65\xd8\x6b\xa0\xdd\x97\x14\x2a\xc3\xbe\x46\x26\xf6\xec" - "\x5e\x96\x3f\x51\xec\xf7\xac\x16\x62\xff\xce\x70\x82\xfd\x3b\x51" - "\x3e\x60\xdf\x4e\xbb\xd7\x72\xed\xfe\xbd\xfd\x0a\xb1\xc7\xed\xbe" - "\x49\x19\xf6\x47\x64\x62\xcf\xee\x87\xf9\x13\xc5\xfe\xbd\x54\x21" - "\xf6\xef\x0e\x23\xd8\xbf\x1b\xa9\x1c\x7b\x6d\x3b\xed\x5e\xcb\xb5" - "\xfb\xbd\xfb\x94\x61\xaf\x85\x76\x7f\x30\x41\x19\xf6\x6b\x64\x62" - "\xcf\xee\xa9\xf9\x13\xc5\x7e\xef\x12\x21\xf6\x7f\x1c\x42\xb0\xff" - "\xe3\x60\x6f\xb0\x5f\xe5\x8c\x7d\x75\xd7\x38\x88\xad\x58\x9d\xbf" - "\x6f\x2a\x87\xfd\x7b\x80\x3d\xd4\xbf\xe8\xb9\x7c\x17\x8d\xff\xfe" - "\x0e\x16\xf7\x24\xc0\x7d\x05\xe0\x0e\xb1\xa1\x03\x73\xc0\xa8\x27" - "\xc6\x1d\x63\x9e\x56\x83\x82\x3f\x85\x7b\x31\x3e\x18\x63\xc0\x51" - "\xc7\xe2\xdc\xe5\xcf\xf9\x8c\x9f\x2a\x14\xe3\x89\x75\x3f\xc6\xbc" - "\x3d\x6d\x8f\x39\xd1\x2e\xe6\x13\x6f\x8f\xbe\x6f\x71\x1d\xff\xbb" - "\x55\x98\x9f\x82\x18\x2e\x4d\x2e\xe6\xef\x1b\x84\x98\xef\x1b\x88" - "\x71\x30\xd3\xfb\xc2\x95\x63\xae\x89\x91\xc6\xdc\xd1\xc7\x17\xe5" - "\xf8\x86\x79\x49\x21\x8f\xb9\x26\xc6\x33\xe6\x35\x0a\x30\xbf\xb5" - "\xfd\x7b\xe7\xc2\xbc\x68\x9a\x10\xf3\x3f\xf5\x21\x98\xff\x49\x2b" - "\x85\xb9\x1d\xfc\x35\x1e\x53\xc7\x6b\xfc\x6c\x8d\x89\x4f\xb5\x02" - "\xae\x78\xad\x1f\x1e\xeb\xdd\x3f\xbf\x94\x6a\x05\xdc\xb7\x2e\x43" - "\xe1\x99\xcb\xd0\xc8\xa0\x3a\xe2\xbf\x5b\xc0\x7f\x6f\xba\x89\x54" - "\xf6\x57\xb5\xdd\x33\x2f\x21\x55\x0b\xd8\xb8\xe5\x55\x43\x50\x79" - "\x92\x05\x7d\x7a\xa5\x94\xc2\x63\xb7\xf8\xbd\x1d\xf3\x7d\x62\xaf" - "\xb1\xc9\x4c\x53\x79\xed\xeb\x64\x5c\xe5\xbc\x63\x5c\x65\xbf\x60" - "\x5c\xe5\x0f\x97\xb8\x71\x95\x29\x04\xa3\x02\x67\x7c\x5e\x7c\x5b" - "\x62\x5c\xa5\xac\xdd\x71\x15\x76\x3c\xe5\x0a\x0a\x6d\x5d\x60\xe8" - "\xbd\x9d\x1b\x57\x79\x73\xbe\x6f\xe3\x2a\x2d\x0b\xf4\xd4\x9b\x80" - "\xcf\xaa\x29\x80\xcf\xd7\x72\xf1\xd9\x6f\xf5\x76\x5c\xc5\xd1\xc7" - "\x3a\xfa\x55\xdc\xe6\x70\xdf\xda\x94\x1b\x76\xcc\x75\x2c\x05\xb7" - "\xb7\x2b\x74\x71\x4f\xec\x93\x95\x8d\xa7\x1c\xdc\x7b\xa7\x8d\xa7" - "\xe0\x36\xe7\xe8\x67\x3b\x47\x1f\xfb\xc1\x59\x61\xdb\x3b\x90\x43" - "\xfa\xd8\x03\xd9\xde\xea\x2b\x69\xcc\xd5\xb1\xae\x63\x28\x04\xf3" - "\x8f\xfc\xf0\x98\x8b\xb2\x71\x94\x83\xd6\x3b\x6d\x1c\xa5\xf3\x61" - "\xfe\x61\xb9\x10\xf3\xe2\x0d\x04\xf3\xe2\xf5\xb7\x00\xf3\x63\xae" - "\x63\x27\x04\xf3\x3f\xdf\xc0\x63\x2d\xca\xc6\x4f\x3e\x56\xa8\xa5" - "\x7f\xbc\xf1\x93\xce\x87\xf9\x9f\x4d\x42\xcc\x3f\x5a\x41\x30\xff" - "\x28\xd5\x77\xcc\x35\xb1\xae\x63\x26\x04\xf3\x83\x17\xb1\xf6\x52" - "\x36\x6e\xf2\xf1\x9e\x3b\x6d\xdc\xa4\xf3\x61\x7e\xb0\x44\x88\x79" - "\xc9\x3c\x82\x79\x49\xca\x2d\xc0\xfc\x98\xeb\x58\x09\xc1\xfc\x2f" - "\x35\x78\x6c\x45\xd9\x78\xc9\xc7\x77\xdc\x78\x49\xe7\xc3\xfc\x2f" - "\x7b\x85\x98\x7f\x3c\x93\x60\xfe\x71\x92\xef\x98\x6b\x63\x5d\xc7" - "\x48\x08\xe6\x87\x4e\xe1\x31\x15\x65\xe3\x24\x7f\x19\x77\xa7\x8d" - "\x93\x74\x3e\xcc\x0f\x15\x08\x31\x2f\x9d\x4c\x30\x2f\x9d\xe4\x6d" - "\xcc\xec\x88\x95\x1d\xf1\x31\x1b\x2b\x87\x82\x66\x77\x19\x1b\x21" - "\x78\xff\xf5\x08\xab\xd9\x15\xc7\xca\x07\xf7\xde\x29\xe3\x23\x0e" - "\xac\x71\xbc\xdc\x39\x62\xe5\xbf\xba\xbc\xff\xfc\x64\x0c\x89\x95" - "\x3f\x89\x95\xc2\x5a\x6c\x2e\x42\x05\xc4\x9a\x8e\xb9\x08\x9b\x96" - "\x01\x8e\xc0\x03\x3c\x17\x01\xcf\x49\x10\x9b\x8f\x80\xe7\x21\x38" - "\xe6\x24\x38\xcf\x47\x88\x33\x33\x4d\x78\x4e\x02\x8e\x93\xcb\x93" - "\x36\x23\xc7\xdc\x04\x3c\x07\x21\xfd\x5b\xd4\x13\x63\x84\xe7\x1f" - "\xe0\x78\xf9\x76\xcf\x41\xc8\xb7\x77\x86\x39\x08\x47\xf4\xed\xc5" - "\xca\xe3\xf7\xdd\x87\x80\x6f\x6d\xe3\x54\xad\xdb\xc2\x4c\xb8\xcd" - "\x61\x8c\x82\xea\x49\x3b\xdc\xff\x5c\x31\x55\x99\x5a\x8a\x36\xad" - "\x44\xc1\x8e\xf1\x0b\xdc\x06\xc1\x2f\x07\x59\x01\xcf\xcc\x57\xc8" - "\x38\x86\xfd\xfb\xc4\x9e\x96\x57\x0d\x78\xdd\x7e\xf0\xa7\xff\x2c" - "\xa6\xf0\xd8\xe3\xae\x97\x50\xd4\x5b\x17\x50\x74\x45\x43\x0d\x62" - "\xdb\x54\x5e\x58\x93\x3d\x2f\xcc\xdc\x9a\x17\x11\x6c\x0f\x0b\xab" - "\xb5\x84\x85\xd5\x61\xdc\x32\x2f\x21\x84\xdb\x17\xc6\xad\x32\x75" - "\x47\x1b\x5e\x2c\x56\x14\x37\xb6\x21\xd9\xa6\xbe\x54\x8c\x59\xc1" - "\x15\xc0\x6c\x81\x10\xb3\x1d\x4a\xc7\x37\x1c\xf3\xb9\x17\xe8\xa9" - "\x1d\xd0\xa6\x56\x4e\x04\xcc\x9e\x91\x8b\xd9\xdf\x24\xf7\xff\x93" - "\xc6\x4c\x1d\xe3\x25\x66\xeb\xbd\xc0\xcc\xe2\x8e\x99\x3a\x15\xee" - "\x4d\x22\x98\xa9\x93\x2d\x61\x6a\x03\x8f\xd9\x0d\x2f\x31\x73\x8d" - "\x61\x7f\x4a\x98\x99\x24\xf7\x3f\xf7\x80\x99\x97\xed\x4c\xe3\x45" - "\x3b\x2b\x89\x13\xc1\x0c\xda\x99\x9a\x6b\x67\x6a\x68\x67\x6a\xa7" - "\x76\x76\xd9\x4b\xcc\x5c\x63\xd0\x9f\x12\x66\x7f\x8f\x95\x8f\x99" - "\xc6\xcb\x76\xa6\xf1\xa2\x9d\x95\x14\xba\x63\xa6\x81\x76\xa6\xe1" - "\xda\x99\x06\xda\x99\xc6\xa9\x9d\xd5\x78\x89\x99\x6b\x0c\xf9\x53" - "\xc2\xec\x33\xe9\xf5\xdf\xd2\x98\x79\xd9\xce\xb4\xde\xb4\xb3\x26" - "\x11\xcc\xa0\x9d\x69\xb8\x76\xa6\x81\x76\xa6\x71\x6a\x67\x47\xbc" - "\xc4\xcc\x35\x06\xfc\x29\x61\x76\xbc\x48\x3e\x66\x5a\x2f\xdb\x99" - "\xd6\x8b\x76\x76\x30\xc1\x1d\x33\x2d\xb4\x33\x2d\xd7\xce\xb4\xd0" - "\xce\xb4\x4e\xed\x6c\x8d\x97\x98\xb9\xc6\x70\x3f\x25\xcc\xfe\x91" - "\x24\x17\x33\x16\x2f\xd0\x8e\xa2\x98\xb5\x08\x75\xa3\x15\x74\x3c" - "\x7e\xe7\x25\x8a\xd7\x6b\x7f\xce\x67\xd6\xaa\x42\x31\x56\x58\x0f" - "\x62\xbc\x2a\x53\x8f\x23\x31\xdd\x88\xdf\x8b\x01\xee\x08\xbf\x1b" - "\x4b\x3f\x2f\x43\x2f\xce\x92\xc2\xaa\xfd\xf7\x61\x05\xf3\x79\xac" - "\x1c\xef\xc3\x6e\x29\x56\x5f\xca\xc5\xea\x44\xa0\x32\xac\x34\x31" - "\xed\x63\xa5\x59\xef\x19\xab\x92\x42\x1e\xab\x1a\x27\xac\xdc\xfb" - "\x31\xef\xb1\x72\xe9\xbf\x7e\x52\x58\x7d\x5e\x2a\x85\x95\x35\x34" - "\x22\x18\xaf\x79\x9f\x00\xb1\x2f\x33\x3b\xf1\xa9\xac\x73\x28\x7c" - "\xf3\x39\x34\x12\xaf\x6f\xde\xbf\xb2\x89\x82\x3a\x7e\xf7\xf9\xe9" - "\x3a\xd4\xfa\xbd\xb6\x3b\x5e\x3f\xc3\xfa\xc9\x57\xb5\x01\x95\x49" - "\x16\xd6\x27\x6e\x01\x8c\x2a\x1a\x4a\xc1\x26\x5d\xe3\x2a\x1a\x3e" - "\x42\x2d\x8b\x13\xd1\x17\xd5\x97\x00\x17\xa6\xb5\xb2\xbe\x14\xed" - "\x82\xeb\xa6\x65\x1f\x21\xfb\xf7\xfa\xee\x33\x52\x11\x75\x85\xfe" - "\x62\x35\x8e\x9d\x87\xa6\xa2\xe0\x71\xf5\x4c\x53\x45\xfd\xe7\xe8" - "\xad\x59\x28\xfc\x78\x2a\x42\xd8\xd6\x6c\xac\xfc\x0a\x8e\x95\x8f" - "\x08\xf0\x79\xd3\x29\x56\x66\xd7\xcb\x1a\x01\x9b\xab\x2e\xd8\x40" - "\x2c\x0e\xb6\xee\x3a\xa1\x01\xb0\x69\x70\x60\x73\x19\xa5\x2d\xc4" - "\xd8\x98\xf9\x58\x99\xc3\xa6\x00\xfb\x3c\xa3\x53\xac\x7c\xc5\x09" - "\x1b\x6e\xad\xaa\x00\x1b\xc7\x58\xc6\x72\x3d\x7e\x47\xee\x16\x2b" - "\x2b\x1b\xcb\x28\x97\x5c\x2b\xc2\xb6\x23\x68\x23\x13\xa0\x1d\xad" - "\x5e\xc2\xb6\x23\x62\x7f\x75\x18\xf0\xbd\x18\x05\x99\xbb\xc6\x6d" - "\x06\x0c\x5a\xa0\xad\xe1\xbe\x28\x1d\xea\x89\xb1\xc4\xb8\x4d\xd8" - "\xdb\xda\xfa\x62\x03\xa2\x40\x83\xab\x30\x76\xb6\xef\xb5\x01\x59" - "\xd0\x57\x55\x4e\xfb\x1a\xf0\xb9\x86\x2a\x2d\x1c\x36\x2b\xbf\x46" - "\x57\xe8\x93\xc1\xcc\xab\xfa\xee\x0f\x01\x4f\xa1\xef\x09\x9e\x81" - "\xd7\xbe\x80\xcf\x7b\xeb\x25\x14\x3d\xce\xc8\x34\xb1\x73\x79\xa0" - "\x8d\xe1\xfe\x0c\xfb\xc3\x0a\xe3\xdf\x91\x2d\x2f\xac\xb6\x35\x2c" - "\x22\xf8\xf8\x12\x84\xb0\x4f\xc4\x58\xf8\x2f\xe5\xb1\xc3\xeb\xf6" - "\x9c\xc7\x3a\xdc\x7c\xe1\x2b\x9f\x8b\xb7\xaf\x69\x66\x59\xe3\x1d" - "\x05\x5c\xfb\x2a\x50\x3a\xde\xe1\x18\x8f\x02\x0c\xf1\x5a\xbd\xf4" - "\x33\x88\x7a\x53\x36\x86\x78\xc7\x57\xb9\x18\xaa\x63\xda\xc7\xb0" - "\xd1\x81\xe1\xfa\xf6\x31\xac\x38\xed\x8e\xa1\x3a\xc9\x09\x43\x0b" - "\x8f\xa1\x3a\x95\x60\xa8\x4e\xe6\x31\x54\x1b\xda\xc7\xd0\x25\x96" - "\xfe\x49\x61\x58\xe9\x79\xfc\x43\x1c\x43\x2f\xda\xe1\x0f\x1c\x86" - "\x1a\x2f\xda\x61\x55\xbe\x08\x86\x4e\xed\xb0\x24\xce\x09\x43\xae" - "\x1d\xaa\x9d\xda\xa1\xda\x8b\x76\xe8\x12\x5b\xff\xa4\x30\x3c\x55" - "\x28\x1f\x43\x8d\x17\xed\xf0\x1b\x07\x86\x5e\xb4\xc3\x2f\xa7\xb9" - "\x63\xa8\x71\x6a\x87\xa0\x5d\xda\x30\xd4\x70\xed\x50\xe3\xd4\x0e" - "\x35\x5e\xb4\x43\x17\xad\xf2\x93\xc2\xf0\xff\x92\x15\x60\xe8\x45" - "\x3b\xfc\x94\xc3\x50\xeb\x45\x3b\x3c\xad\x13\xc1\xd0\xb9\x1d\x36" - "\x39\x61\xc8\xb5\x43\x8d\x53\x3b\xd4\x78\xd1\x0e\x5d\x62\xef\x9f" - "\x14\x86\x67\x3c\x8f\xff\x8b\x62\xa8\xf5\xa2\x1d\xa6\x3b\x30\xf4" - "\xa2\x1d\x9e\xa9\x75\xc7\x50\xeb\xd4\x0e\x0f\x26\xf0\x18\x6a\xb9" - "\x76\xa8\x75\x6a\x87\x5a\x2f\xda\xa1\x4b\x2c\xfe\x93\xc2\xf0\x9f" - "\xf5\xde\x60\x08\x3a\xdb\x5d\x97\x36\xf0\x18\x3a\xe3\xe7\xaa\x45" - "\xe3\x41\xa3\x62\xec\xa6\x59\x11\xe5\x8e\xdf\xbf\xf6\x60\xfc\x06" - "\xe3\xf7\x71\x37\x78\x4d\xca\x62\xc7\xbd\xcf\xc1\x98\x1d\x07\x6f" - "\x81\xf5\xa9\x43\x8f\xe2\x77\xaa\x6d\x7a\x74\xce\xff\xaf\x7a\xf4" - "\xec\x5e\xf9\xd8\x71\xfd\xa0\x24\x76\xc2\xbe\x2f\x1e\xfa\x44\x69" - "\xec\xbe\x4a\x72\xc7\x4e\x93\xc4\x63\x47\xfa\x3d\x82\x5d\x49\xa1" - "\xa3\xff\x23\xd8\x71\xfd\x9f\x47\xec\x7e\xca\xfd\xdf\xd7\x92\xfd" - "\x9f\x6d\x1d\xa2\x76\xac\xb3\x17\x67\x53\xf6\x52\x38\x4c\x70\x94" - "\xc1\x39\x7f\x38\xc7\xee\x63\x06\xbf\xd9\x6b\xf6\xee\xec\x5e\x60" - "\xa6\x20\xbf\x24\xfc\xdd\x0e\x9c\xa6\x8b\x23\x4d\xd0\x5a\x14\xb3" - "\x8b\xcb\x03\xce\x67\xc0\x79\x53\x2f\xbf\x98\x2e\x90\xbe\x8c\xc9" - "\x7a\xd3\x08\xe7\xba\xe2\xb4\xcc\x5a\x15\x1b\xd3\x30\x14\x85\xf3" - "\x70\x7d\x66\x00\x97\xa6\x9f\xf3\x73\x7b\xae\x8d\xc1\xfb\x80\x38" - "\xd2\x74\xb3\x53\x55\x45\x38\x9d\xdd\x4f\xa5\xb3\xaf\x43\x3a\xe7" - "\xb4\xcc\x13\x08\xe7\xeb\x48\xdb\x9d\xcb\x2f\xdc\x39\x8d\xed\x6d" - "\x84\x7a\xf9\xe9\xd8\x3c\x7b\x19\x29\x5c\x27\x9c\xb6\x07\xd3\x2b" - "\xbf\x8c\x4d\xef\xa7\xd2\x0b\xd2\xbf\x86\xd8\xb4\x5c\xba\x40\xa6" - "\x4b\x69\x36\x97\x6e\x30\x4e\x07\xe7\x54\xce\xf6\xe3\xd2\xf5\x74" - "\xd8\x06\xef\x3d\xee\x5c\x57\xdb\x3a\x0a\xe7\x87\xd3\xf4\xb2\x77" - "\xf9\x4b\x21\x57\x97\x28\xe7\x67\xe2\x74\x70\xdf\x30\xce\xce\x41" - "\x50\x87\xe8\xb6\xfc\xb2\x6b\x4a\x1d\xe9\xd2\x6d\xa8\xcf\x2e\xde" - "\x36\xc1\x4c\xd6\x5b\x2a\xbc\x87\xa0\x2b\x76\xbd\xfc\xfc\xcc\x18" - "\xbb\x4a\xf0\xbe\x38\x2d\xd3\xeb\x4d\x8c\x53\x08\x57\x8f\x18\x52" - "\x0f\x76\xbf\x15\x82\x35\x65\xbd\x67\x27\x5b\x56\x3f\x1d\x57\xd6" - "\xde\x90\x2e\xd6\x91\xaf\x9d\x62\xc7\x31\xb8\xb4\x2a\x36\x6d\x45" - "\x0a\xde\x5f\xbf\x2d\xfd\x3d\x38\xad\x2d\x6b\xef\x69\xdb\x5a\x55" - "\x9c\x6b\xfe\xb6\x75\x01\xf8\xba\x73\xfe\xa1\x24\x7d\x41\x3d\xa4" - "\x1f\xe7\x9e\x3e\xd8\x35\x7d\x18\x49\xbf\xb3\x0e\xd2\x27\xb8\xa7" - "\xb7\xf6\x76\x49\xaf\x26\xe9\x0b\x6b\x21\xfd\x24\xf7\xf4\x3a\xd7" - "\xf4\x1a\x92\xfe\xfd\x32\x48\x9f\xe8\x9e\x3e\xc6\x35\xbd\x96\xa4" - "\x7f\xdb\x0c\xe9\xa7\xb9\xa7\xcf\x70\x4d\xdf\x87\xa4\xdf\x53\x0d" - "\xe9\x93\x5c\xd3\xef\x62\xd3\xa2\x07\xb8\xb4\x7d\x49\xda\xf7\xce" - "\x42\xda\x64\x91\xba\xd2\x5c\xde\x91\x5c\xfa\x7b\x49\xfa\xb7\xa6" - "\x41\x7a\x83\x7b\x7a\x95\x6b\xfa\x7e\x24\xfd\x21\x2b\xa4\x4f\x11" - "\xc1\xca\x35\x7d\x7f\x92\xfe\x40\x2c\xa4\x37\x8a\x60\xe5\x9a\xfe" - "\x3e\x92\xbe\x38\x1a\xd2\x2f\x11\xb1\xbd\x6b\xfa\xfb\x49\xfa\x8f" - "\x06\x43\xfa\x54\x11\xdb\x0b\xd3\x67\x95\xe8\x20\xdd\xea\x9d\x1c" - "\x37\x5d\xec\xee\x9a\xf7\x00\x92\xf7\xc7\xa1\x70\x4f\x86\x7b\x7a" - "\xe4\x47\xd2\xa3\x87\xb9\xf4\x0f\x90\xf4\xa5\x01\x90\x7e\xbd\x88" - "\xed\x7f\x86\xd3\xef\x22\x69\x7f\x46\xd2\x16\x1d\x86\xb4\x1b\x45" - "\xec\xee\x9c\x36\x9c\xa4\xfd\xc7\x5e\x48\x9b\x29\x62\x73\xe7\xb4" - "\x03\x49\xda\x23\x46\x48\x9b\x2d\x62\x6f\xe7\xb4\x83\x48\xda\x4f" - "\xc3\x21\x6d\xae\x48\x79\x1f\x70\x4a\xfb\x20\x49\x6b\xc2\xbc\xca" - "\x17\xc1\xc5\x39\xad\x9e\xa4\x3d\x31\x09\xd2\x16\x88\x60\xe2\x9c" - "\x36\x82\xa4\xfd\x7b\x26\xa4\x2d\x14\xc1\xc4\x39\xed\xcf\x99\xac" - "\x63\x31\x9c\x9f\xde\xe3\x9a\x76\x27\xef\x77\x7f\x61\xef\x75\xbc" - "\x81\xf3\x95\x64\x1e\xe6\x3a\xbc\x97\x5d\x5b\xbd\x1e\x71\xf4\x11" - "\x76\x0a\x0d\x66\xb2\xfe\x5a\x07\xf7\xe1\x3c\x8b\xdc\x7d\x9b\xea" - "\x91\x9d\x7c\x1f\x31\x84\xc9\xfa\x57\x14\xf7\xfc\x62\xf7\xb4\x01" - "\xce\x69\x1f\x62\xb2\xca\x0b\xb8\xb4\x25\xee\x69\x83\x9d\xd3\x0e" - "\x65\xb2\x2a\x92\xb8\xb4\xa5\x22\xfe\xf5\x61\xa7\xb4\x91\x4c\x56" - "\x55\x38\xa4\x3b\x2c\xe6\x5f\x99\x75\xba\x87\xb1\x3f\x70\xf8\x6e" - "\x48\x3f\x8c\xd8\xf7\xac\x05\xec\xcb\xce\x3d\x77\xa4\x05\x1c\x1e" - "\x76\xea\x2b\x1f\xb6\xf7\x3a\x55\xc7\xd9\xec\x98\x7b\x19\x32\x9c" - "\xcb\xf0\x08\xc9\xf3\xff\x8a\x20\xcf\x32\xd7\x32\x70\xfe\x08\xeb" - "\x04\x6c\xdf\x28\x5b\xd6\x19\x23\xb6\x2f\xa4\x2d\x17\x68\x04\xca" - "\x8f\xc6\x79\x72\xd8\x0e\x67\xb2\xbe\x40\x9c\x0d\x04\xfd\x11\xb4" - "\x47\xd6\x1f\x02\xbe\x65\xcc\x6b\x01\xa7\x21\xed\xa3\x5c\xba\xd3" - "\xae\xfd\x20\x57\xbe\xc7\xe0\xda\xd9\xb6\x3e\xd0\x4f\x55\x2d\xa6" - "\x65\x8c\x3f\x47\x3d\x2e\xd1\xff\x25\xf3\xf1\xdb\xbe\x9d\x75\x9e" - "\xd5\x13\xf6\x3d\xfe\xd9\xf1\x0d\x8c\xd5\xf9\xdc\x56\x8a\xa9\x1a" - "\xda\x80\x54\x78\x0f\x3e\x26\x6c\x68\x9c\x19\xce\x5b\x06\x76\x49" - "\x6a\xcc\xfa\x6f\xb9\xd9\xef\xa3\x2a\xbc\x27\x13\xfc\x7f\xd6\x8c" - "\x92\x0b\xf0\xff\x5b\xd7\x31\x4d\xf8\x1b\x08\xb6\xd7\x6b\x32\x2a" - "\xed\xf5\x78\x2f\xc5\x26\xc8\xa3\xe9\x82\x11\xd1\xf8\xbb\x71\x78" - "\x5f\xd7\xca\xd4\x7a\x74\x81\xae\xed\xcf\x2c\x30\x8c\x84\x32\xe0" - "\xbd\xb7\x92\xcf\xc1\x6f\x62\x53\xd0\xbe\xd9\x35\x05\xa6\x45\x78" - "\x7f\xba\xda\x39\x96\xb0\x68\x13\xf3\xbb\x17\xea\x8c\x69\xe8\xfe" - "\x4b\x74\x6d\xb2\x63\x2f\x2a\x76\xff\xa9\x1f\x0c\xbf\x26\x7b\x4f" - "\xd5\x5e\xb6\x87\xd4\x14\xb8\xed\x3d\x55\x18\x9b\x44\xf6\xb3\x3a" - "\xcf\xe6\x0d\x65\xab\x62\xc2\xfd\x53\xed\x2d\xeb\x33\xf0\x37\xde" - "\x4c\x69\x97\xd0\x39\xee\x1a\xce\x93\xcb\xeb\x08\xce\x03\xe7\xe5" - "\xc8\x07\xdf\x67\x19\x10\x9b\x84\xeb\x0e\x76\x48\xf5\x7e\xff\xaa" - "\xda\x22\xbc\x7f\x95\x8c\xf4\xc9\x38\xbd\xf8\xbe\xbc\xa0\x71\x72" - "\x6a\x4a\x1b\xb3\xce\xc7\x82\x56\xdd\x43\xec\x7e\x3e\xc1\x8c\x1a" - "\xc6\x71\xff\x83\xea\xbe\xd9\xc4\xfd\x6f\x30\xfb\xbd\x97\xc4\xfd" - "\xbf\xc4\xb1\x5f\x98\x68\xbe\xc1\x35\x99\x60\xef\x3d\xf6\xb7\x12" - "\x03\xb0\xb6\x26\xfb\x96\xd6\x64\xea\xee\xc3\xfb\x39\x9f\x6f\x82" - "\x67\xee\x21\x76\x39\x7f\x0a\xfe\x06\x71\x7f\x2d\xdc\x5f\x06\xa7" - "\x61\xb9\x14\x1a\x99\xca\x64\xf7\x35\x92\xef\xc2\x9c\x67\xf7\x2a" - "\x63\xb1\x03\x7c\x99\x90\xbe\x46\x36\xdf\xbc\x68\x93\x73\x19\xf0" - "\xa6\x60\x91\xc3\x1e\x7e\x24\x6a\xf8\xa3\x8f\x45\x8f\x98\x39\x6b" - "\x76\xf2\x9c\x97\x5e\x36\xcc\x7d\xe5\xd5\x94\x79\xf3\x17\x18\x17" - "\x2e\x5a\xbc\x64\xe9\xb2\xe5\xa9\x2b\x56\xe2\x74\x6d\xe5\x7d\x2b" - "\xd6\xaf\x81\x42\x80\xdd\x13\xf0\x9c\x0b\xd3\xd9\x67\xc3\x39\x82" - "\xf3\x85\x71\x2a\x9d\xb8\x86\xaf\x04\x55\x8d\xbf\xef\x51\x4f\x5f" - "\xd8\x87\xbf\x35\x02\x3c\xf3\xab\x2c\x78\xca\x84\xbf\x53\x56\x4b" - "\x5f\x28\xa8\xb0\x3c\x65\xc2\xdf\xd5\xfb\x4c\x5b\x87\xc2\x1f\xc0" - "\xdf\x32\xbb\xb0\x11\x5f\xdf\x35\x08\xa1\x63\x70\xaf\x58\x9e\x0f" - "\x04\x23\xed\x1b\x6a\xc6\x92\xab\x66\xea\x71\xfe\xb9\xdb\x98\x3a" - "\xcb\x2a\x03\xca\x82\xdf\xc0\xf5\xe0\x0b\xf4\x77\xd3\x3f\xeb\xc7" - "\x7e\x9f\xa8\xdf\xce\x6d\x4c\xed\x7a\x35\x53\xfb\xbb\x6d\x4c\xfd" - "\x2e\x35\x63\x0e\xcf\x45\x81\x8d\x59\xdf\x05\x9b\xe9\x0b\x06\xb6" - "\xdd\xc0\x75\x7b\xaf\x0b\x01\x5b\xe1\xda\x50\x2b\xa2\x77\xc1\x6f" - "\x38\xd7\xf0\x99\x8e\x94\xfb\x83\x6b\x4d\xfe\x50\xbf\x06\xa6\x35" - "\xc5\x2f\x0b\x9e\x43\x30\xf9\x6e\xed\x31\xe8\xfd\xe1\x79\x96\xca" - "\xa6\x73\xc8\x4c\x7f\x97\xb1\xeb\x26\xfb\xbc\xa0\xca\xfc\x7a\x84" - "\xf3\x3b\xb0\xa8\xc9\x7f\x71\x5f\xc6\x0a\x69\x93\xec\xab\x52\xfc" - "\x20\xcd\x48\xc8\xbb\xc1\xb9\x3e\xfa\x97\xe6\x2d\xd1\xcd\x5f\x9a" - "\x92\x12\xd1\x1d\xe9\xd9\xbf\xc8\xf9\x1b\x7b\x4b\x20\x3f\xf4\xc6" - "\x36\xe6\x18\xd4\xd3\x04\xf5\x2d\x3b\x09\xd1\x02\xf0\x03\x41\x9d" - "\xb2\x21\xdf\x33\x70\xfe\x30\xfc\x7f\x18\xca\x5e\x46\xbe\xdf\xd5" - "\xec\xc7\x64\x7d\x97\x09\xe5\x2c\xc3\xdf\x28\xc0\xfb\x29\x5e\x5f" - "\x3e\xc9\x0f\xea\x9d\x0b\xe9\xca\x74\x7d\xd1\xc0\x0b\x74\xdd\x74" - "\x28\xc7\x1e\xf8\x1f\xa7\x67\xbf\x09\x0a\xe9\x8f\x91\x7a\x35\x5d" - "\xc5\xbf\xc1\x56\xa6\x1d\x6a\x26\xb3\x31\xab\x2e\x1a\xef\xb7\xca" - "\x7e\x2f\x06\x7e\x83\x5d\xca\x20\x6d\xf6\xf5\xf4\x49\x7e\xf8\x7b" - "\x94\xbb\xf8\x3c\x03\x70\x99\x70\x39\x70\xec\xfa\x05\x78\x0b\x7b" - "\x6b\x22\x1a\xd2\x84\xfc\xbe\xa8\x45\xa8\x60\x1b\x53\x08\x47\x01" - "\x1c\xf9\x9f\xc3\xb5\x13\x70\x94\xc1\xf9\x72\xf8\xfb\x39\xfc\x3d" - "\x51\xcb\xbe\x0b\xd5\xe2\x72\x2f\x5e\xcd\xd4\x0d\xcd\x47\x3f\x63" - "\xbf\x77\x99\x86\x9e\x3f\x47\x37\x25\xe2\xb2\xe3\xbd\x95\x99\x5e" - "\x75\xe5\xc2\x3d\x60\x2f\xc5\x20\xb8\x0e\x7f\x27\x91\xbf\xce\xc7" - "\xa5\x02\x38\x0e\x93\xff\xbf\x57\xc1\xff\x83\xb9\xff\xb5\x70\x84" - "\xb7\x7f\xb8\xe6\x27\x75\x7c\x9f\xed\x7d\x5a\xaf\x8e\x72\xef\xd2" - "\x5d\x8e\x43\xf4\x0f\x85\x70\x9c\x15\x9e\xff\xa1\x98\x9c\x6b\x58" - "\x4d\x7e\x37\x6c\xe4\xfe\x96\x20\xfa\x06\xd8\xe9\x06\xe4\x7f\xc3" - "\x42\xce\xdd\x00\xc6\x37\xc5\xc2\x91\xe0\xf2\x7c\x9c\x67\x2d\xc6" - "\xb3\x15\xfc\x3d\xc6\xd2\x4c\xd7\x15\x60\x8c\xb6\x12\x6e\xf9\xe1" - "\xf9\x0e\x70\x2e\x1f\xb8\x55\xc0\xf3\xe7\xd2\x16\x21\x7f\x2e\xa5" - "\xba\xf0\x27\x1b\xfb\x23\x68\x0b\xb5\xbb\x08\x5f\x0e\x5f\x5f\x95" - "\x0c\xbf\x2f\xad\x86\x7c\x0e\xeb\x5e\x64\xf3\xb0\xb0\x7d\xc6\x25" - "\x84\x7a\x1a\x10\xbb\xfe\xa0\x9e\xbe\x74\x12\x73\x16\x3f\x9b\x7b" - "\x2e\x29\x0b\x94\x0f\xce\x15\xe2\xf2\x2d\x80\x7c\xe1\xf7\x1e\x48" - "\x57\x58\x89\xae\x39\xca\xc6\xde\xb3\xf9\x15\xe0\x23\x57\x5e\x9c" - "\x27\xbe\x8f\xe1\xeb\x95\x8f\xef\x21\xcf\xfe\x7e\x2d\x9c\x8f\x04" - "\x1f\x85\xd2\xaf\x22\xba\xd2\x6a\x46\x98\x93\xf8\x6f\xa5\x35\x12" - "\xda\x52\x1c\xb2\xe3\xbe\x4e\x8b\x22\xa1\xbd\x75\x3b\x47\x7f\x9f" - "\xfc\xd0\x6a\x14\x89\xf3\xc3\x3e\xdc\x4c\x7f\xaf\xdf\x85\xdb\x22" - "\xc9\x6b\x05\x62\xf7\x5e\xac\xcb\xff\xdc\x88\xd8\xe7\xec\xc4\xe5" - "\x81\xeb\x4e\xcf\xcd\xad\x84\x28\x68\xeb\x4a\x52\x57\x78\xd6\x1e" - "\xb8\xbf\x18\xd7\x1d\xdb\x13\xae\x97\x42\x3e\x26\x7c\x0d\x7f\x5f" - "\x85\xab\xcf\x1e\xbc\x36\x03\xdb\x03\xa7\xc7\xdf\x7d\x24\x7b\xca" - "\x7e\x77\x9e\xb5\x1b\xdc\x8f\xf1\x60\xe0\x19\x38\x8f\x74\x2b\x63" - "\x65\xc0\x1f\xbd\xb3\x12\x7f\x47\xe0\xf2\x08\x21\x3e\xf5\x5a\x67" - "\x7c\xe0\xbe\x62\xb8\xff\x18\xee\x83\xb1\x3f\x81\x67\x06\xe1\xef" - "\xa1\xc1\xb9\x6c\x7b\x16\xe4\xb1\xac\x89\x1d\x07\x82\x7c\x22\xa0" - "\x2c\xd9\x38\x1f\x28\xcf\x31\x2e\xaf\x64\xbc\xdf\xa4\x33\xd6\x5c" - "\x7e\x7b\x30\xe6\x6c\x7b\x5e\xc9\xd6\x09\x7c\x57\x7d\xf3\x4e\x72" - "\xad\x14\xd2\x94\x32\xad\x71\x88\x59\x95\xc8\x7d\x77\x8d\xbd\x56" - "\x92\xde\xcc\xe2\x7b\x8c\xf8\xb5\xcb\x7d\x16\xaf\x61\xea\x9c\xca" - "\x5d\xe5\xd8\x57\x9d\x2b\x77\x09\x7e\x1e\xb3\x7c\x1a\xdb\x8f\xe2" - "\x67\xe0\xfb\xb9\xfc\x8a\x70\x7e\x0e\x5b\x3d\x04\xe5\x20\xf6\xfa" - "\xde\x0c\xe7\xf7\x60\x2e\xb2\x76\x03\x3f\x7a\x3d\x1d\x73\xb1\xfe" - "\x34\xdc\x7f\x38\x0b\xff\x5e\xce\xfe\x36\xb0\x3e\x96\xbf\xde\x0f" - "\x5f\xaf\xac\x03\xdc\x5e\x05\x2e\xd9\x11\xfa\x59\x28\x8a\x6c\x58" - "\xc7\xd6\xad\xa8\x61\x55\xac\xdf\x67\x56\x84\x70\x39\xc1\x46\xa0" - "\x1b\x2e\xaf\x86\xbe\xe6\x30\x2e\x2b\xf8\xeb\x12\xe6\x9d\x44\x84" - "\xcb\x0c\xfe\x8c\x2b\xdf\xe5\xcb\x1c\xf6\x25\xb8\x8e\xd8\x9e\x0f" - "\x11\xdf\x07\xd7\x7e\xc8\xc1\x65\xe7\xeb\x7d\xb9\xcc\xd9\xc6\x6c" - "\xbd\x01\x07\x8c\x17\xc6\xc5\x29\x4f\xcc\xfd\x6c\xc8\xab\x88\xfc" - "\x26\xdc\xc0\xb6\xce\x56\x33\xe5\x38\x3d\x9f\xf6\x07\xf6\xdb\x88" - "\x69\xf0\xec\xa1\x46\x1c\xbb\x40\xff\x6c\x6d\x34\x41\xbe\x45\xf8" - "\x9b\x9e\x90\x47\x29\xb6\x29\xa4\x9b\x8c\xf9\x08\xbf\xcb\xc9\x7d" - "\x57\x26\x41\x7f\x3e\x18\x8e\x91\x7c\xfb\xff\x61\x8c\x90\x5f\x57" - "\x5c\xdb\x3f\xc6\x3b\xdb\x9e\x1e\x87\xb8\xef\x19\xeb\xae\xd0\x57" - "\xbe\xe5\xfa\x0e\x0e\xeb\x1f\x86\x7f\x06\xed\xc5\x29\x8f\xc3\x2e" - "\x58\x97\xb2\x7c\x5c\x3e\xce\x0f\xd7\x19\xee\x2d\xe5\xf2\x61\xeb" - "\xcc\xf2\x69\x1d\xcb\x81\x72\x66\x39\xd4\xb3\x8d\x07\x57\xb4\x1c" - "\xce\xe5\x2e\x36\x71\xf8\xae\x64\xfc\x9d\x2e\xec\x93\x40\xe3\xfe" - "\xba\xb1\x95\xf7\x4b\x18\x7b\x3b\x8b\xfd\x15\xd3\x2e\xd2\xdf\x72" - "\x7e\xeb\x0a\xb9\xae\x16\x70\x18\x97\xe5\x06\xcb\x5f\x5c\x96\xf4" - "\x69\xb8\x2c\xa5\x6c\x39\xd2\x75\xe8\x0a\xfd\x43\x0a\x7e\x3e\xdc" - "\xdb\xc4\xb5\x57\x2e\xaf\xcb\xe5\x38\xaf\xdf\x81\xaf\xc2\x65\x82" - "\x67\x27\xb2\xfe\xef\x37\xac\x4d\x4e\x72\x65\x2f\x6b\x5a\x87\xef" - "\xbd\x64\x6a\xa6\xd8\x7b\xcb\xe0\xff\xa8\x26\xf2\x9d\x83\xee\x70" - "\xff\x5e\xdd\x2c\x9c\xbe\x61\x30\xf6\xd1\xba\xa9\xec\xff\x61\xba" - "\xe7\x80\xab\x97\x90\x0a\xf2\x0b\xc0\x1c\x75\xf0\xa2\x9e\x6e\xf0" - "\xc7\x31\x03\xd8\xba\x08\x34\xd2\x5e\x6c\x6f\xcc\x65\xd0\x48\x51" - "\x8d\x59\x96\x28\x07\x6f\xe1\x39\x05\xd8\xf6\x04\x1f\xcb\x0a\xe0" - "\x71\x29\xcf\x2d\xcb\x0a\xce\x8e\x7b\xc1\x8e\x01\x17\xe8\xeb\xcd" - "\x5c\xbd\xf6\x42\x7a\xd0\x62\xd7\x2f\x72\x65\xcf\xe7\xd2\xe7\x39" - "\x70\xe0\xda\x6a\x79\x16\xf6\xbf\x2c\x06\x57\x07\x73\xf7\xee\x21" - "\xcf\xba\x3a\xc4\x91\x16\x6b\x44\xf2\xcd\xb2\xab\x43\xb0\x1f\x1c" - "\x0a\xd8\xb3\xbe\x8f\xfd\xde\x2d\x39\x87\xdb\x0e\x79\xc6\xf5\x33" - "\x2c\x0f\x41\xf7\xf0\x3c\xba\xaa\x72\xf1\x4f\xd8\x17\x67\x57\xac" - "\x27\xdf\x84\xc0\x5c\xc2\x3e\x15\xc7\x26\x50\xc6\x6a\xae\xfd\x70" - "\x65\xbe\xba\x50\xc8\x95\xeb\x47\x81\x2b\x43\x9c\xf2\x4e\x12\xeb" - "\xe7\x76\x11\x1f\x58\xc0\xd5\xed\x43\xae\x6e\x45\x5c\xdd\x3e\xe4" - "\xea\x86\xf7\x08\xc6\x76\x5b\xea\x64\x47\xb0\xdb\xb5\x6f\xb9\xf4" - "\xa5\xd8\x97\xf3\xed\xf5\x5a\x7f\x47\x5b\x76\xf7\x17\xd7\x4e\xe1" - "\xf6\xe0\x54\xae\x26\x17\x7f\x51\x2a\xee\x2f\xae\x96\x71\xf5\x2d" - "\x74\x69\x1b\x5c\x0c\xc2\xf5\x2d\x80\x43\x45\x83\xe3\xdb\x1c\xdf" - "\x9d\xc7\xfe\x13\x3f\xdb\xb9\x0f\xda\x49\xec\xca\xb5\xe5\x6b\x47" - "\xdc\x71\xb8\x96\xe9\xdc\x9e\x31\xd6\xd8\x27\xe0\x3c\x30\xa6\xac" - "\xae\x84\x73\x04\xd7\x6b\xc9\xd8\x37\x38\xfb\x68\x48\x9b\x6b\x67" - "\x70\x7b\xb9\x96\x2d\x6c\x8b\x57\xad\x5c\x5b\xe4\x9e\x7d\x7d\x26" - "\x60\x14\xc9\x3f\xf7\xba\xca\xe5\xb9\x18\x9b\x63\xec\xde\xcb\x04" - "\xd3\xf1\x8e\x3e\x0d\xa7\x87\x7b\x53\xe1\x9e\x68\x97\xfe\x31\x1b" - "\x97\x0f\x9e\x55\xcc\xfa\xac\x6d\xac\xaf\x48\x6d\x64\xcb\x73\x7d" - "\xe4\x2e\xae\x9f\x80\x73\x91\xdc\xb9\x00\xae\x2f\x71\xf0\x66\xbf" - "\x4b\x99\xf2\xc5\xf5\xd1\xd5\x62\x87\x3e\x62\xf3\x62\x7d\xd1\xf5" - "\x02\xae\x7e\xf8\xdc\x10\x72\xee\x6a\x32\x3e\x97\x45\xec\x90\xcb" - "\xb0\xfd\xd5\xd5\x00\xae\xbf\xc2\xed\x8b\x32\xd3\x96\x54\xdc\xc6" - "\xf0\x6f\xc8\xc3\x82\xf3\xaf\xcc\x68\xc1\x31\x44\x3e\x5c\x0b\xc5" - "\xfe\x00\xfb\x0b\xdd\x4b\xc4\x6f\xe8\x26\xb0\x7f\x47\x61\xbf\x83" - "\x75\x08\xbe\x0e\xe9\xb0\xef\x00\xfd\xd0\x30\x51\xf7\x5b\xd0\x05" - "\xdf\x07\x40\xbe\x0d\x51\xdc\xbd\x73\x58\xad\xf0\x7d\x1c\xed\x38" - "\xe7\xb8\x0f\xda\x51\x18\xbe\x0f\xdf\xef\xf0\x5f\xd8\x77\x59\xb1" - "\x6f\x22\xcf\xdb\xc7\x71\x9c\x8d\x1b\x1c\xba\xa8\x95\x72\x4a\x8b" - "\xbf\x57\x40\x7c\x5a\x03\xe7\xcf\xce\xe3\x7b\xff\x1f\x7b\x6f\x03" - "\xde\x64\x95\x2d\x0a\xaf\xfc\x14\x0a\x16\x92\xd6\xaa\x19\x68\x21" - "\x40\x71\xaa\x96\x52\xa0\x68\x65\x40\xab\x80\x96\x19\xa0\x15\x50" - "\x8b\xa0\x2d\xd2\x6a\x2b\xb5\x84\xb6\x40\xc0\xd2\x84\x80\x73\x70" - "\xc4\x36\xad\x15\xab\x96\xb6\x8e\x38\x83\x33\x3a\xd6\x73\x38\xe7" - "\xf0\x9d\x87\x19\xe3\xd0\xb9\xa7\x33\xd3\x36\xcc\xb9\xcc\xbd\x3d" - "\xf3\xe1\x9d\xc8\xd7\xc1\xc8\x2d\x10\x69\x68\x42\x9b\x64\x7f\x6b" - "\xed\xfd\xbe\xcd\x4f\x13\xd4\x7b\xbc\xe7\x3e\xcf\xf7\x59\x7d\xc9" - "\xfb\xee\x9f\xb5\xd7\x5a\x7b\xed\xb5\xd7\xfe\x5b\x9b\xd7\x1f\xea" - "\xca\xba\xeb\xec\xb3\xf6\x2a\x50\xb7\x5d\x25\xbd\xf8\xf9\x80\xc0" - "\xf3\x5a\xae\xa0\xe3\xda\x24\x4e\x87\xd0\xa9\x56\x81\xcb\xe7\x03" - "\x6d\x23\x3c\x6e\x2e\xd1\x42\x71\x0d\x21\x71\x74\x67\x08\xc6\x3d" - "\xc0\xf1\x8a\xc8\x17\x18\x2d\x1b\x97\xbe\x5d\xdc\x83\x4b\x3c\x97" - "\x74\xef\x35\x9b\xc0\xf3\xda\x3e\x59\xef\x22\x5f\x12\x48\xf7\xf2" - "\xb8\x67\xa4\x34\x6b\xa5\x5f\xae\xdf\xaf\x7d\x20\xf8\xaa\x53\x4a" - "\xfc\x4e\x96\xe8\xf8\x84\x8f\xb3\xff\x67\x21\xf2\xf6\xda\x31\x99" - "\xb7\xa1\xef\xd4\x7e\xb0\x7c\x2d\x7d\x73\xb9\xaf\xe5\x63\xd8\x56" - "\x4a\x43\x38\x89\x3e\xc2\xdd\x1a\x69\x53\xe3\x58\xef\x5e\xea\x97" - "\x84\xad\xea\xfd\x9e\x34\x07\x04\xb6\xaa\x9f\x62\xbf\x30\x5c\x22" - "\xeb\x18\xe6\xc9\x03\xf2\x59\x7e\x41\x35\x5c\x4a\x61\xe4\xe3\x3e" - "\x34\x0d\xe9\xa7\x0f\x47\x1c\x12\xcc\xe1\x5c\x59\x6f\x90\x2e\xe9" - "\x73\x9f\x97\x6c\xba\x61\x57\x9b\xa4\x4b\x2e\xab\x86\xbf\x0c\xb7" - "\xc3\x86\xbf\x0c\xd7\x19\xde\xb8\x48\x9d\x81\x76\xf3\x41\x4f\xfd" - "\x70\x57\x98\x1d\x80\x61\x37\xd6\x1d\xc3\x2d\xd4\x46\xe9\xce\x22" - "\xae\x9f\xf8\xbc\x96\x67\xa3\x8c\x33\xe9\xcd\xa1\x17\xe4\xf9\x0b" - "\xcf\x35\xb2\xd5\xc2\xcb\xf3\x64\x87\xe9\x4e\x2a\x4f\x86\x87\xd2" - "\x4c\xed\xc8\x56\x45\x73\x2e\x1e\xb5\xa4\xe7\x3b\xc2\x74\xa5\xd4" - "\x87\x91\x9e\x0c\xef\xab\x3e\xff\x5b\x78\x5f\xe5\xf9\x6c\xbc\x8e" - "\xf4\x74\x7e\xfd\xbe\xca\x73\x88\xf4\x96\xac\x23\xc3\x75\x81\xe7" - "\x44\x5b\x98\x2d\xeb\x59\x2a\xdb\xb2\x41\x3d\x3a\xdc\x43\x3a\x0a" - "\xcb\x3f\x29\xca\xf6\x66\x60\xbf\x9f\x25\x97\x8d\xf1\x25\x7d\x7a" - "\x94\xcd\xfa\xcf\x51\x5f\x0c\x6b\x25\x1b\x90\xb7\xcd\x11\x7e\xf7" - "\xc7\xb5\x42\x94\xbf\xc9\x24\x67\xb6\xca\xab\x30\x10\xec\x2b\xba" - "\x86\xb6\xcb\xfc\xf5\xfe\x3a\xd4\x2e\x3c\x7a\x84\x1d\xc2\x72\x9a" - "\x43\x69\x7c\x05\xc3\x1a\xa4\x39\x04\xce\x5b\x0e\xcb\x5b\xd6\x7e" - "\x24\x9c\x36\x41\x87\xb7\x95\xe8\xa0\x31\x11\x96\xbf\x99\xec\x1e" - "\xba\xb7\xcc\xa1\xba\xe2\x68\x1f\x93\xf9\x8b\xd9\xd7\x2d\xa1\xf6" - "\x95\x73\x29\xe9\x4a\x69\xec\xd9\x8d\xf6\x8e\x35\x74\x2e\x66\xcd" - "\xf2\x02\xbd\xa1\xaa\xbc\xb2\xe6\x99\x85\xfa\xf2\xca\xf2\x9a\xf2" - "\x2d\x15\xe5\x7b\xb7\xd4\x94\x6f\xaf\xcc\x78\x7e\xcb\xb3\xe5\x5b" - "\xf5\xbb\xb7\x54\xeb\xb3\x8c\x73\x8d\x93\x21\x98\x74\x89\x7e\x4b" - "\x75\xf5\xce\xe7\x4b\x4b\xf4\x95\xe5\x5b\xe7\x55\x95\x56\x97\xd6" - "\xe8\xb7\x54\x6d\xdf\x59\x59\xa2\x9f\x5b\x92\x39\x37\xeb\xee\x92" - "\xc9\xa1\x73\x68\xb3\xb5\x30\x18\x18\xfe\xc2\xd9\x30\x0c\xf1\x1a" - "\x85\xa1\x4a\x63\x2c\xaf\x14\xf3\x76\x23\x71\xf3\x9b\xc1\x40\xf7" - "\x8f\xd3\x7d\xb5\xac\xfe\xba\x0e\x7f\xd5\x94\x0e\xe9\xd4\xb7\xd3" - "\x1d\xe4\xb7\xb2\x14\x4f\xfd\x75\xa4\xcb\xdf\xc9\xef\x90\xc5\x70" - "\xa4\x2d\x85\x0d\xff\xde\x89\x36\x9b\x81\xf6\x67\xb7\x0f\x43\xb2" - "\x75\x17\xa8\xf1\x49\xc0\x47\x4b\xf7\x93\x63\x1e\x9f\x43\x35\xaa" - "\x13\x3e\xfc\x47\x5a\x5d\x89\xba\x42\x66\xd5\x49\x77\x91\x8f\xbc" - "\x21\xcf\x35\xe7\xbf\x08\xf9\x24\x9f\xe7\x55\x23\x7c\xbd\xe5\x00" - "\xca\x32\xcd\xbf\x0e\xfd\xe6\xc1\x5c\xb4\x07\xcf\xd9\xa6\xf1\xb8" - "\x37\xdc\x4a\x48\x40\xbc\xd4\xa7\x6b\xb3\xe0\x55\x2c\xab\x5a\xc7" - "\x98\xa7\x7e\xa4\x58\x9e\x4f\xa3\x7b\xe1\x91\x96\x7e\x89\x8e\xe5" - "\x9c\x8e\x23\x2c\xad\x39\x09\xf1\x6b\x22\x7c\x46\x0e\xcb\x34\x20" - "\xde\xfd\x0e\xd5\x75\x17\xdd\x0b\x4f\x78\x45\x9b\xeb\xa3\xf9\x2e" - "\xc4\xf3\xcf\x81\x5d\xc8\xb7\x19\xe2\xde\xa3\x86\x36\xd1\xfe\x90" - "\xae\x84\x76\x7c\xaf\xbf\x0a\x09\xaf\xd0\x3d\xdc\x96\x99\xac\xd7" - "\xed\x03\x7b\x59\x3f\x68\xf6\x30\x17\xfb\xa7\x2f\x9c\x82\xa6\x51" - "\x3e\xde\xf8\x87\xe7\xfa\xd5\x44\x13\xf6\x15\x09\x74\xa7\x73\x8c" - "\xb9\x45\xf5\xab\xb7\x32\x37\x7b\x2b\xd4\xe6\x1a\x2d\x27\x9e\x90" - "\xbd\x35\x64\xa1\x7b\xbd\x46\x0b\x90\x97\xc7\x25\xdb\xd8\xcd\x46" - "\x37\x87\xd8\x52\xa3\x24\x67\xee\x18\xb0\xe3\x65\xd8\x74\xbf\x37" - "\xe5\x11\xf5\x3f\xfa\x67\xcc\xe3\x0a\x81\xdf\x19\x09\x9f\x60\xe2" - "\xbb\x4b\x2e\x47\x8c\xc3\x47\xc9\x26\x70\xa1\x2c\xbb\x62\x94\x97" - "\xd6\x74\x84\x9d\xb5\x63\x78\xc3\x75\x50\x63\x5a\x1c\xdb\x12\x7c" - "\x1f\xb6\x95\xeb\x35\x04\xff\xc0\xad\x00\x07\x31\xcd\x50\xfd\xc8" - "\x71\x37\xbf\x23\xda\x87\xed\xff\xf3\x8e\xc8\x79\x6b\x49\x9e\x97" - "\x44\xc8\x73\x6e\x13\xd9\x84\xcd\x08\x1f\x65\xa8\xe1\x1a\xf6\xc3" - "\xf8\x9d\xd9\x0c\xe9\x54\x0e\xbe\x9f\xa1\xf9\x10\x84\x69\x96\xcb" - "\x63\x28\xff\xf5\x01\x31\x07\x23\xc9\x56\x86\xdd\xe8\xa4\xf5\x09" - "\x76\x1a\xf5\x3b\xe1\x48\x32\x86\x79\x4e\xc8\x32\x85\xb2\x7e\x96" - "\xcb\x55\x32\xa4\xb3\x7a\x5f\x4e\x7b\x12\xa6\x43\xb9\x6a\x43\x79" - "\x22\xb9\xc2\xb4\x0e\x59\xa6\x50\xd6\xce\x50\x3a\xc4\x61\x72\xe7" - "\xde\x5c\x35\xe9\xc8\x01\x95\xff\x51\x92\x31\xf6\xfa\x8f\xfa\xd9" - "\x6d\x9b\xfa\x45\x3d\xf9\x1f\xb5\x7b\x45\x1d\x04\xf9\xee\x4f\x0f" - "\xe1\xfb\x19\x94\xe3\xc9\xc4\x67\x31\x57\xed\x7f\x14\x71\x3b\xc3" - "\x6d\xf1\x7d\x58\x07\xbc\xaf\xf2\x27\x53\x7e\x89\x87\x3d\x41\x1e" - "\xfa\x0d\xd1\x78\x18\xc1\x3b\x7e\x6f\x34\xab\xf7\xd7\x52\x5b\xc1" - "\x3c\xc7\xe4\x3b\xa3\xa3\xd5\x25\x96\xa1\x56\x37\x43\x3c\x95\xd1" - "\x95\xcc\xd3\x9f\x8d\x56\x46\xa4\x1c\x77\x75\x00\xd0\x5c\x38\xe5" - "\x4b\x4b\x26\xbe\x06\x12\xa2\xd6\xef\xd6\x30\xdc\xe2\xc5\x1d\xda" - "\x01\xdd\xab\xd2\x1d\xda\x98\x6f\xc5\x8d\xf0\x4b\xd3\x8b\x7e\xd1" - "\x36\x9b\xe4\x39\xb0\xcf\x8e\x5a\x84\xc2\xa4\xef\x8a\x21\xec\x6b" - "\x22\xe7\xf3\x63\xaf\x2f\x04\x7e\x1d\xbe\xbe\x10\x78\x3f\xd6\xfa" - "\x42\x44\xb9\xd7\xa9\xdc\x40\xfb\x06\x45\x48\xd9\x03\x81\x28\x65" - "\xcb\xf9\x33\x3b\x42\xc7\x2f\x6c\x15\xe1\xd0\x87\xfd\x12\x9b\xbe" - "\x41\xc1\x10\x4e\x17\xef\xb3\x59\x9e\xb0\x57\xc8\x0e\x62\xe9\x94" - "\x26\x92\x8e\xb1\xbf\xf8\x64\xb2\xd9\xe0\x3a\xff\x88\x7b\x08\xb4" - "\xf4\x3b\xad\x4c\x8e\x56\x86\x25\x06\x16\xe5\x23\x01\x60\x3a\x4f" - "\xcf\xf0\x4f\x04\x49\xdf\x2e\xfe\xa1\x1e\x4b\x3f\x16\xff\x1f\xf8" - "\x9b\x24\xf0\xe5\xf0\xbc\xa0\x90\xca\x3b\x14\x92\x62\xc5\x0d\x72" - "\x33\x90\xb3\x44\xfb\xa3\x51\xb3\x79\x03\xda\x73\xd3\x8f\xf3\xc4" - "\x8c\xf9\x24\xf8\xf2\x37\x0b\xfd\xa6\x90\xf0\x6f\xfc\x53\x6d\x0e" - "\x29\x60\xa6\xaa\x84\x6f\xab\x9a\xd1\x3d\x16\xa4\xec\xd0\x86\x17" - "\x6a\x8e\xe3\x3f\x1a\xfa\xc7\x88\xf0\xd2\x31\x7e\x7a\x30\xbd\xca" - "\xbd\x3f\x24\xf1\x1f\x05\xfa\xa9\xb1\x69\xf8\xe6\x7f\x33\x42\xde" - "\x67\x8a\x9f\x14\xdb\xb7\x59\xc0\x0d\xff\xf4\x67\x26\xc9\xaf\x41" - "\xf1\x48\xcd\x8b\x96\x34\xc8\xff\x54\x99\xdf\x61\xf5\x19\x8c\x9f" - "\x95\x16\xfe\x3d\xbb\x2b\xfc\x3b\xcd\xf7\x6d\xa0\x6e\xa3\x7f\x4c" - "\x8e\x44\x80\x39\xc1\xfa\xd2\x44\x34\x19\x8d\x35\xa2\x09\x05\xff" - "\x24\x6c\x54\x00\x73\x0b\x42\x82\xd5\xd1\x53\xff\xef\xf9\x9b\xb6" - "\x5f\x62\xe0\x4c\x97\x76\x5c\x64\x64\x18\x7d\x4f\xd0\x4b\x61\x0b" - "\x3e\x19\x97\x9e\x87\xe9\x43\xbe\x15\xb9\xf8\x4f\x07\x66\xdc\xf0" - "\x6d\xe0\xfa\xdd\xdf\xff\x0f\xff\x14\xd4\x3e\xbe\xfb\xfb\xdf\xf4" - "\xc7\x44\x2f\x8e\x9a\x88\xff\xd0\x7f\x6c\x4c\x51\x32\x29\x82\x49" - "\x01\x4c\x7a\xf9\x56\xfa\xf1\xef\xfe\xbe\xfb\xfb\xee\xef\xbb\xbf" - "\xef\xfe\xbe\xfb\xfb\xee\xef\xff\x03\x7f\x0a\x3e\x8e\x60\xd2\x9f" - "\xfc\x2e\xe2\x68\x08\xb4\x65\x80\x87\x41\x30\x1e\xc7\xbe\x8b\x41" - "\x11\x0f\x13\xd4\xdf\xa6\x8d\xa7\x1f\x43\xe8\x6b\x24\xce\xc2\x67" - "\x01\x3e\x8b\xf0\x99\x1e\x12\x3e\x23\x7a\xf2\xff\x84\x3f\x05\x32" - "\x4b\x85\x63\xc0\x38\x98\x00\x13\x21\x1e\x26\xc1\x64\xb8\x09\x12" - "\x60\x0a\x4c\xc5\xb1\xa5\x16\x12\x21\x09\x6e\x86\x64\xb8\x05\x6e" - "\x85\xdb\x40\x07\xdf\x83\x69\x88\x79\x0a\xa4\x46\xc7\xd9\x0c\xb9" - "\x3a\xfc\x07\xff\x2f\x80\x5c\xfe\x5d\xfc\x5d\xf8\x7f\x6a\xb8\x4d" - "\x0a\x3f\x23\x85\x3b\xbe\x0b\xff\x4f\x0d\xd7\xff\x1f\xfe\x9d\xf5" - "\x7f\xf4\x57\x81\x6a\x59\x68\x66\x45\x54\x7d\x18\x19\xaa\x90\xfe" - "\xc6\xbe\xe1\x2b\xf2\x8f\x83\x17\x9e\x3f\xf2\x2f\x17\x9f\x6c\xf1" - "\x6a\x02\x10\x73\xb9\x2c\xf4\xef\x2b\x67\xe6\x8c\x65\xf8\xd4\xe0" - "\x63\xc6\xe7\x00\x3e\x0d\xf8\xbc\x21\xc3\x11\x69\xe2\xf1\x71\xa8" - "\x01\xce\xbc\x0f\xf0\xa7\x01\x7c\xf2\x00\xfe\x0d\xd3\xff\xd7\x64" - "\x80\xff\xb6\x01\xe0\xec\x09\x80\xff\xee\x0e\xc2\x1c\xb0\x06\xb1" - "\x3b\x6f\x16\xef\x7a\x7c\x3e\xa7\x3d\x78\x28\x49\x57\xe9\x2e\xf1" - "\x93\x2b\x37\xe4\xe9\x17\x64\x66\x67\x66\x2f\xd2\xcf\x9b\xa7\x5f" - "\x98\x95\x75\xef\xfc\xac\xc5\xf3\x17\xde\xad\x5f\xb8\x68\xc9\xe2" - "\xbb\x97\x2c\xcc\xd1\x3f\xbf\xa7\xaa\x7c\x41\xd6\xb3\xa5\xfa\xca" - "\x92\xf2\x6a\xfd\x33\xe5\x55\xcf\xef\xde\x52\x55\xfa\x55\x14\x7d" - "\xe3\x3f\x42\x2d\x35\x00\x9c\xfb\xe1\x9c\xd6\x80\x7a\x62\x0b\xa8" - "\x75\xc5\x10\x8c\x49\x97\x9e\xa8\x7f\xcf\x3f\xf1\xd8\x5f\xe6\x6e" - "\x9a\xfa\xdb\x07\x9e\x9d\xbb\x6c\xf9\x3b\x0d\x9d\xa0\x9c\xd5\x0c" - "\xca\xef\x6d\x06\xa5\xa6\x10\x94\xaa\x7e\x50\x0c\x9f\x03\xe5\xa6" - "\x64\x50\xae\xeb\x01\x65\xde\x49\x50\x2e\x4b\x07\x65\x56\xca\xf8" - "\xb0\xf2\x4e\x11\xf6\x96\x11\x94\x8d\x2b\x40\xf9\x62\x0b\x28\x8d" - "\x05\x22\xec\xa3\x3c\x50\xfe\xfc\x5b\x67\xc3\x7f\xf0\xef\xeb\xd8" - "\x07\x37\xfe\x53\x2f\x3e\xf8\x2d\xe0\xf1\xdd\xdf\x77\x7f\xdf\xfd" - "\x7d\xf7\xf7\xdd\xdf\x77\x7f\xdf\xfd\xfd\x27\xff\x5d\x55\xaa\xe1" - "\xb7\x68\xfd\x79\x2c\xf1\x3a\x87\x62\xf2\xfb\xb4\x5f\x04\xe8\x1c" - "\x14\xc4\xf3\xf3\x17\xd2\x13\xba\xd7\x24\x61\xf9\x51\x00\x3a\xcb" - "\xf9\xea\x11\xe6\xa2\x73\x9a\x2b\xde\x05\xe8\x4a\x03\xa0\xfd\x2b" - "\x08\x67\xb3\x03\x2a\xd4\x62\xaf\x12\x73\x53\x3c\xed\x77\xc2\xf0" - "\x1a\x0c\xaf\xbd\xc1\xfe\x17\xbe\xd7\x8a\x60\xae\x98\xc5\xf1\x39" - "\x16\x01\x87\x60\x9c\xc4\x30\xf7\x0d\x60\x24\xc8\x78\xb9\x95\xa0" - "\x20\x78\x43\x16\xd0\xb9\x2d\xb6\x5b\x30\xaf\x1b\x69\x4a\x97\xf6" - "\x0a\x0d\x32\x0b\xa8\xba\x8c\x3e\x3a\x33\xaa\xb8\x00\x93\xbe\xc0" - "\x5f\x25\xfe\x7e\x0a\x62\x6f\x27\xe5\x4b\x23\x18\x98\x57\xe1\xb1" - "\x4c\xca\x1a\xcb\x8b\xb0\xf9\xb9\x6f\x98\xf4\x91\x5b\x69\x53\x8a" - "\xb4\xda\x49\x52\x5a\x25\xa6\xdd\x2c\xa7\x15\x71\xca\x55\x52\xdc" - "\x4d\x18\x67\x0c\x8f\x53\x37\x49\x71\x09\x18\xd7\x1c\x81\x9f\xda" - "\x3e\xe2\x03\x2c\x87\x70\xd1\x3b\xf0\x97\xce\x29\x49\xb8\x11\x4e" - "\x5d\x98\xde\x4c\xe9\x57\xe8\x99\x6f\x83\x1e\x38\x2e\xc4\x3b\x4c" - "\x9b\x77\xba\x43\xa4\xc5\xf7\x14\xca\x2f\xbd\xeb\x69\xdf\x14\xbd" - "\x4b\xe5\x26\x7a\x2c\x93\x13\xc2\x71\x02\x90\xe2\x92\x30\x2e\x3d" - "\x3c\xee\x37\x59\x52\xdc\x6d\x18\xb7\x22\x3c\x4e\x21\xe7\xd3\x61" - "\x5c\xb1\x1c\x37\x7e\xdf\x0d\x0e\x4b\x20\x0e\x07\x28\x13\xf0\x99" - "\x18\x2f\xd7\x5d\xb5\x8e\x05\x4c\xdf\x03\x35\x6b\x9a\xde\x19\xb0" - "\x30\xb0\x1b\xbd\xa0\x9f\x06\xa6\xf3\x30\xf9\x0c\xed\xdf\xa9\xdf" - "\x0b\xf1\x26\x03\xf3\xd2\x99\xf8\x3e\xd7\x20\x98\x5c\xcc\x49\xe7" - "\xce\xeb\xae\x41\x3c\xdd\x33\x54\xb7\x03\x74\x5d\xb5\x7f\x8b\x7e" - "\x0f\x2d\xdd\xe3\x93\x42\x79\x07\xa0\xaf\x75\x00\x4c\xad\xe1\x79" - "\x4d\xa9\xa0\xeb\xa5\x33\xec\x16\xd0\x10\x1e\x5d\x7a\x1f\xf8\x92" - "\xa6\x77\xd6\xbe\x01\x6a\xd3\x2c\x50\xf6\x96\xd8\x24\x5c\x6e\x6a" - "\x21\x5c\x0e\x5e\x84\xf8\x77\x9e\xc1\xba\xbf\x48\xf8\xce\xe9\xfc" - "\x70\xaf\x57\x79\x5a\xb7\x1a\x4e\xeb\xce\x41\x97\x6e\x19\x74\x19" - "\x57\x40\xfd\x45\x48\x38\xed\x5d\x0a\x5d\xea\x87\xb0\x6d\xac\x00" - "\xfb\x20\xbe\xeb\xfd\x98\xc6\xcd\xcf\x63\x5c\x80\x9b\x0e\x35\x3f" - "\x07\xf1\x0e\x01\x13\xeb\xf3\xa6\x66\xf9\x6c\x01\x7d\x47\xa3\xa3" - "\xfa\x7b\xa0\x43\xfc\x9c\x88\xcb\xbd\x88\x4b\x6f\x9a\x0e\xb2\x10" - "\xe7\x89\xf6\x16\x1f\xa8\x6b\x61\x52\x8c\x36\x91\xcc\xcf\x25\xa3" - "\x4c\xb5\x1d\x61\x4e\x92\xad\xa1\x17\x0a\xb1\x7d\x25\xa8\xb1\xec" - "\x63\xd2\x7e\xbd\x41\xd3\xdb\xa0\x1e\xda\x5d\x48\xfb\x94\x07\x30" - "\x4e\x2f\xc7\xd1\x79\x6b\x3a\x47\x3d\x3f\x99\xee\x73\xca\x85\x8f" - "\x47\x9c\xb4\x17\x70\x90\xf6\x67\x12\x3c\x8d\x11\x54\x48\x4f\x1c" - "\xe2\xf3\x65\x3b\x86\xcf\xc1\x74\x98\x1f\xeb\xff\xe7\xfc\xbc\x3d" - "\xbb\x6d\x93\x3b\x70\xdb\xa6\x6b\x81\xd7\x37\x0d\xb1\xd7\x37\x5d" - "\xf5\xbf\xbe\xe9\x4b\xd3\x1e\x88\xf7\xdf\xb6\xc9\xd5\x67\xe0\x75" - "\xa0\xed\x33\x5c\xa2\x7d\x7d\xf1\xe4\x3f\xfb\xa9\x1d\x58\xf7\xbe" - "\x4f\xe9\xde\x23\x5d\x20\x71\x76\x99\xdd\xf7\x67\x78\xaa\x16\x18" - "\xbe\x1b\xa3\xd1\x37\x94\x34\xc7\x25\x64\x36\x9e\x68\xea\x77\xa8" - "\xa7\xf1\xfd\x80\xae\xc4\xbb\x5c\xf8\xb8\xf1\xf1\xe2\xe3\x63\x49" - "\x73\x7c\xc8\x2b\xd3\xd4\xfd\x0a\xa0\xf3\x04\xf3\x03\xa0\xc0\x2a" - "\x72\x23\xfe\xda\x18\x7c\x4b\x09\x34\x3d\x57\xfc\x7d\x33\xd4\x91" - "\x2f\x02\xd2\x29\xa4\x4f\x48\xbf\x78\x2c\x53\x72\xb1\x1c\x27\x97" - "\xfd\x23\xcc\xcd\x92\x9e\x2b\xc6\x70\xa7\xfb\x85\x32\x85\xeb\x85" - "\x32\xe5\x50\xd2\x73\x5b\x31\x4d\x89\x43\x3d\x5d\x2f\xf1\xd0\x49" - "\xb0\xb0\x9d\xb8\xa6\xf8\x40\x85\x30\x0d\xff\x3c\xdc\xaf\x3e\x7a" - "\x84\x9d\xc3\x74\x87\xc7\x60\x21\x6c\x84\x83\xfc\x9f\xd2\x21\x87" - "\x21\xaf\x07\x5e\xc1\x74\x94\xdf\xee\xcd\x25\xbd\xeb\xb0\x57\x38" - "\x69\x3f\xed\x64\x36\x2a\xca\xc3\x34\x74\xd6\xd2\x35\xc5\x0b\x13" - "\x3c\x16\x28\x20\xd8\x94\x8f\x7c\x88\x61\xbe\xad\xcc\x54\x86\x7a" - "\x09\xd6\x7a\x58\x99\x82\xce\xd6\x9f\xc6\xfc\xa2\xec\xa9\xf1\x32" - "\x8e\x54\x06\x3f\x5b\x4f\x78\xa2\x3c\x9c\xae\xf0\xc2\x94\x16\x50" - "\x61\xbe\xf5\x04\x8f\x60\xa1\x1c\x38\x90\xd6\xad\xa7\x2b\x5c\x10" - "\x60\x61\x30\x1d\x12\xbc\xc2\x30\x78\x18\xce\x10\x1e\xc9\x5f\x17" - "\xe6\x99\xd2\xc1\xe1\xad\xfb\xe7\x00\xc1\xf3\x82\x5a\xcf\xf1\x7d" - "\x8c\x60\x70\x3f\x15\x08\xd3\xb6\xeb\x41\x18\x84\xa9\x36\x97\xa9" - "\x4c\xc5\xf7\xf5\x61\xfe\x0f\xeb\x9c\x71\x6c\xa8\x50\x35\x95\xef" - "\xe9\x7b\x10\xc8\x27\x05\xa6\x79\x9b\x0d\x95\xa9\xa6\x0c\x82\x9a" - "\x70\xa6\x73\x3d\x84\x67\x68\x5d\xae\x5b\xf9\xd8\x32\x78\x6c\xc5" - "\xaa\x15\xcb\x60\xcd\x03\xcb\x97\x41\xd6\xbd\xf3\xb2\x16\xdd\x93" - "\xb3\x08\x0a\x1e\x5f\xb7\x0c\x0a\xd6\x2e\x83\xf5\xf8\x14\x3e\xb4" - "\x0a\x3f\x96\x2f\x5b\x90\xf5\xf0\xbc\x82\xe5\xab\x56\xc2\x23\x1b" - "\x16\x66\x2d\x5c\x08\x0f\xac\x5c\xbd\x20\x2b\x4b\xfa\x5d\x90\x45" - "\x49\x9e\xc8\x59\xb9\x7e\x5e\x41\xd5\xf6\x9a\xed\xf3\xd6\xae\x5a" - "\x0e\x2b\x57\x2e\x2b\x88\xe8\x1b\xd3\xfd\xc3\x7e\xe2\xad\x9b\x5d" - "\xc9\x23\xdf\x09\xd0\x86\x75\x8e\xcf\x20\x3f\x93\x01\xda\x17\xdb" - "\xa8\xae\xb8\xbe\x9c\x7a\x0e\xdb\xb9\xda\x63\xd1\x60\xfd\x4f\xe7" - "\x3e\x28\xc8\x7f\xc1\x05\xb8\xe5\x28\xc6\x7d\x26\xe9\xe8\x38\x8c" - "\x7f\x3f\x3c\x3e\xd1\x8c\xf1\x9f\xd3\x1e\x7f\x3b\x3e\xc8\x67\x37" - "\xea\x3e\xe4\xa7\x0b\x86\x4c\x85\x71\xfc\x8c\x25\xd6\x31\xed\x7d" - "\xc5\xbc\xce\x90\x36\x4e\xe7\xc3\xcf\xe8\xf7\x82\xea\x32\x68\x3e" - "\xe9\xab\xc9\xa5\x73\x30\x60\xaf\x91\x60\x5c\x1b\x83\x31\x59\x3a" - "\xa7\xe9\x68\xa3\xfd\xc7\x1c\x8e\x36\x2b\x44\x1f\x38\x08\x4e\x3d" - "\xc6\x09\x58\xda\xb8\x3e\xd4\x0b\xa8\xb7\xff\x25\x60\x4a\x07\x96" - "\x34\xfd\x64\x60\x34\x9d\xf7\x31\x98\xaf\x4c\x96\xe3\x7a\xda\xdb" - "\x6a\xc0\x74\xef\xe4\x29\x68\x6f\x28\xdf\x27\x0a\x9a\x1a\x94\x67" - "\x77\xa0\x29\x03\xf8\x19\x66\x1e\xa6\x3d\xc1\x92\xf0\xbb\x29\x43" - "\xc1\x4c\xe2\x5c\x33\x86\xfd\x23\x85\x61\x1d\xab\xb8\x5f\x90\x17" - "\x78\xb8\x0a\x79\x41\xe7\x9a\xfb\xfd\x94\xff\x0a\xcf\x3f\x11\xc3" - "\x26\x61\x5a\x45\x20\x29\x43\x89\x32\x43\x61\xd8\xaf\xdf\x72\x0a" - "\xe1\xa9\xe8\x4c\x39\xd3\xbe\x67\xc5\x77\xb5\x6d\xef\x20\xf7\xd1" - "\xee\xc0\xb8\x80\x09\x61\x8e\x8e\x95\xdf\x4f\x79\xb1\x2c\xb5\x67" - "\xb4\x0c\xfb\x52\x2d\xf7\xbb\xec\x27\x7c\xae\x8c\xa5\xe9\xa6\x32" - "\xa9\x3d\x63\x5d\x0c\x62\x3d\x4d\xf2\x58\x12\x37\x44\xd4\x53\x05" - "\xc2\xa1\x33\x10\xfd\x08\xa3\x2b\x30\x84\x65\xe0\x37\xc2\x55\x4a" - "\x70\x65\x18\x6e\x21\x07\x89\xcd\x11\x72\xb0\x1f\x61\x5f\x0b\x89" - "\x3f\x11\x11\x5f\x8a\xf1\x23\x52\x3c\xb6\xab\xc4\xb3\x11\xe5\x13" - "\x6e\x01\x2c\xdf\x8d\xed\x46\x85\xe5\x91\x5f\x06\x57\x30\x7d\x92" - "\x3a\x3c\x7d\x12\xda\x06\x1a\xd2\x25\xa4\x13\x79\xfa\x76\x49\x56" - "\x45\xf9\x49\xd9\x11\xe9\x7d\x98\x7e\x22\xf9\xde\xc0\xdf\x9b\x31" - "\xcd\x44\xd4\x49\x74\xb6\xe6\xdc\xe9\x5a\xb2\xdf\x92\x4a\x22\xd2" - "\x1f\xc4\x74\xd3\x88\x8f\x9c\x07\x57\x38\x0f\x0a\x25\x7b\x8b\xda" - "\x42\x3c\xe6\x69\x89\xc8\x73\x12\xf3\xcc\x0e\x08\xbe\xa9\x3c\x43" - "\x51\xf3\xf4\x44\xe4\x19\xe4\xf5\x2f\xca\x51\x93\xbc\xc8\x79\xb8" - "\x8e\x19\x0d\x83\x41\xb4\xa1\x5d\x76\xb3\x36\x1c\x46\xf2\x20\x96" - "\x7b\xe7\x2b\xa2\x1d\xdf\x84\x75\xbe\x10\xc3\x3e\x45\xb8\x71\x24" - "\x27\x24\xcb\x76\x97\x17\x75\x60\x5e\x82\xe8\xcb\x6f\xde\xa1\xa9" - "\x05\x7a\x9f\x47\xef\x04\x9b\x8d\xae\x96\x64\xfc\xe6\x1d\xf8\x4b" - "\xe1\xbc\x4c\x6a\x5b\x6c\xf4\x47\x01\x01\xf3\xe6\xd7\xb0\x0d\x2a" - "\xf1\xdb\x2f\x95\xf1\x67\x3a\xdf\x8b\xf2\xa9\x44\xfd\x0a\x74\x46" - "\x19\xc3\xb3\x31\xbc\x57\x8a\xff\x1d\xa5\xc7\xf7\x05\xd2\x3b\xc9" - "\xa5\x52\x92\x4b\x94\xf3\x64\xb1\x0f\x9b\xcb\xba\xc8\x1f\x10\x72" - "\xbd\x1c\xe3\xde\xc3\xdf\x55\xf8\xfb\x1a\xfe\x3e\x82\xbf\x3b\xc8" - "\x27\x83\xc9\x8f\xf6\x84\xf8\x7e\x12\x7f\xd7\xe1\xef\x2a\xfc\x5d" - "\x8f\xbf\x8b\xa9\x5d\xba\x76\x97\x41\x84\x4c\x0c\x06\x44\x5b\x9c" - "\x28\xea\x23\x39\x4d\x6a\x1f\xa2\x7d\x5e\x09\x86\x31\x11\xa6\x44" - "\xbd\x1e\x0c\x1b\xcd\x23\xbe\x14\x20\x7c\xee\x43\x44\x6a\xd7\x71" - "\xa2\x5e\x44\x9a\x80\xc8\x27\xd5\x9d\x14\x26\xd2\x29\x42\xcb\x74" - "\xc0\xcd\x67\xeb\xdc\x8c\xe1\xaf\x8d\xfb\x73\x80\xe4\x2e\xe4\x09" - "\xda\x35\x37\x37\x13\x9f\x82\xf5\x7d\x73\x56\x48\x7d\xa3\x5d\x7b" - "\x0b\x44\xb4\xa5\x6c\xac\xef\xa5\xbc\xbe\x91\x77\x32\xce\x84\x3f" - "\xf6\x2f\xf4\x3d\x41\xd0\xa0\x2d\x44\xdd\x3e\x18\xd4\xcd\xb7\xe4" - "\x85\xc3\xd1\x16\x62\x9e\x1a\xa9\x2f\x1b\x93\x33\x92\x17\x95\x81" - "\xda\xd0\x2d\x68\xff\x7f\xd2\xc3\xcf\xf6\x60\x9c\x3b\xf1\x39\x07" - "\x95\xa9\xaa\xe0\x71\x68\xff\xdf\xd4\x2f\xc7\x81\x38\x3f\xe5\x56" - "\xd5\xf0\xb8\x4e\x39\x1f\xea\xd9\x7e\x9e\x17\xfb\x47\xb2\x17\xa8" - "\xdf\xc7\xfe\xd7\x89\x69\xce\x3a\x60\x8a\x36\xa6\xff\x22\xeb\xf4" - "\xee\x79\x66\x50\xce\x31\x43\x9c\xdd\x77\x0e\xf2\x7d\xcc\x3f\x0f" - "\x60\x92\xdd\xb7\x14\xee\x00\x48\xb4\xfb\xce\xd2\x24\xf9\x2c\xbb" - "\xaf\x19\xfb\xd7\x83\x14\xff\xf1\x9d\xa0\x50\xe0\xaf\xe9\x2e\x50" - "\x2a\xec\xbe\x63\x18\x7e\x02\xe6\x80\x5a\xf1\x70\x1c\xf3\xd8\x7d" - "\xd9\xf8\x5d\x03\x0f\xc5\xb1\xbf\x16\xf9\x41\xbb\xfa\x45\x66\xb2" - "\xfb\x4a\xe0\xa1\x17\x03\xcc\xee\xeb\xc1\xb8\x0a\xc8\xf7\x5f\x67" - "\xf9\x7e\x0f\x63\xda\xe9\xfd\xf9\xfe\x2b\xf8\xfe\x57\x86\x7c\xc3" - "\xdf\x8f\xf1\x31\x31\x3b\xda\xc9\xac\x71\x7a\x77\xd1\x1e\x25\x8c" - "\x62\x5f\xc4\x12\xa7\xf7\x23\x7d\xce\x51\x56\xa6\xc2\x7e\xe4\xf3" - "\xd1\x51\xfc\x6d\x9a\x7e\x81\x7f\x5b\xa7\x7b\x11\x8e\x33\x13\x07" - "\x0d\x84\xbf\xdd\x37\x00\x45\xa8\x6f\xf2\xf7\xb8\x18\xe1\x3e\x75" - "\x3f\x83\xfc\x3d\x1f\x33\xd4\x75\x9a\xfc\x3d\x26\x86\x71\xf1\x08" - "\x0f\xed\xfc\x41\x2a\xc3\x8b\xf0\xae\x71\x78\xd6\x14\x1d\xa6\x75" - "\x51\xba\x50\x38\x04\x83\xd2\xe6\xfb\xc9\x7f\x54\x8a\x6e\xb4\x31" - "\x25\x1e\x9f\x74\x7c\x0a\x59\x52\xca\x73\x01\x4b\xf2\x27\xd4\xaf" - "\x61\x7e\x23\x7e\x1f\xba\xce\xfd\x2e\x9c\xa3\xf4\x13\x31\xbd\x11" - "\xeb\x7c\x85\x87\xe3\x9b\x72\x9c\xe3\xdb\x94\xf2\xf3\xeb\x9c\x8e" - "\x94\x9f\x09\x3a\x52\xde\xa5\x70\x37\xca\x3a\xbe\x77\xbb\x45\xdc" - "\xbf\x62\xbe\x0d\x1e\x81\x57\x37\xd3\xa6\xf4\xa3\xdc\xaa\xf2\xfd" - "\xcc\x4c\x3c\x44\xbe\x9a\x89\x8f\x34\xe6\xc1\x32\xba\x59\x62\x4a" - "\x3f\xe2\xe3\xc4\xfc\x23\xa3\x8c\xfa\xda\xd4\xf8\xeb\x1c\x76\xea" - "\x44\x84\xb3\xd9\x43\x30\xb5\xa9\x58\xd7\xa9\x3a\x9f\x52\x8f\xfc" - "\x60\xde\x7c\xdf\x7e\x5f\xd1\x1e\xf2\x8d\xf2\x3b\x48\x37\x9b\x15" - "\x76\x63\x0d\xd2\x79\x18\x61\x96\x60\x3c\xdc\x8c\x65\x7d\xcc\x12" - "\x53\xe3\xa9\x3c\xd6\x98\x8a\xed\x31\x15\xc7\xca\x50\x42\x38\x8d" - "\x90\x1f\xd0\xa4\xd4\xf4\x11\x8e\x5f\x6a\x5e\xc0\x9a\x5a\x16\xd0" - "\xa6\x16\xca\xf2\x43\xb2\x23\xf8\x46\x32\xf3\x01\x85\x69\x65\x39" - "\xf1\x5b\x53\x73\xee\x02\xd0\xae\x75\x33\x1f\xc9\xca\x7c\x30\x28" - "\xfa\xdc\x67\x91\xd7\xf1\xd0\x67\x38\x01\x77\x02\x8d\xbd\xdc\xd0" - "\xe7\x6e\xc6\xef\xa3\x40\xf8\xf5\xb9\x0f\x42\xef\xe0\x31\x58\x6b" - "\x70\xef\xf7\x6b\x53\x4f\xf6\x0e\xae\x01\xcc\xff\x31\xdd\xb9\xf3" - "\x94\x41\x6d\xee\x33\xb8\xe9\xdb\xd4\x3b\x88\xf2\xe9\x67\x7e\x9f" - "\x35\x35\xdd\xa7\x4d\xed\x5e\x7b\x8d\xb9\xd6\x0c\x9a\xe3\x30\x6c" - "\x54\xa3\x60\x3e\x8d\xd1\xc4\x7a\x07\x0f\xc3\x53\xd7\x40\xd1\x5b" - "\x76\x82\xcb\xe9\x53\x06\x03\xf0\xfc\xd7\x7c\x9a\x27\x07\xcd\xf0" - "\x64\x19\x4c\xc5\xf4\x57\x48\x66\xd9\x54\x33\xf4\x0c\x54\xc0\x9a" - "\x4b\x3e\xd5\xda\x6b\xa3\xac\xa7\xb8\x19\x7a\xcb\x9a\x89\x1f\x79" - "\x34\x46\x59\x73\x69\x88\xad\xbd\xe6\x61\xbd\x65\x1f\x40\x4f\xf1" - "\x09\x58\xfd\x37\x9b\xc6\xdf\x98\x9a\x13\x48\x4c\x2d\x0c\x34\xa6" - "\x96\xf9\x13\x53\x4f\xfa\x1a\x11\x97\xc4\xd4\x6e\xd6\x34\x23\x07" - "\xf9\x37\x89\xd7\x45\xd2\x8c\xbb\xf1\x5d\xcf\xeb\x57\x3b\x23\x8f" - "\x59\x67\x94\x8d\x36\xce\x28\xe4\x72\x9f\x38\x23\xcf\xee\x23\xf9" - "\x9f\x51\x86\xe9\xca\x84\x8c\xcc\x30\x0a\xd9\x9f\xb1\x9b\xea\x15" - "\xd3\x1e\xc2\xa7\x05\x9f\xe3\x18\xe7\x45\x58\x89\x04\x37\x60\x9d" - "\x19\x1f\xd0\xce\xc0\xf6\x30\x53\x87\x63\x1a\x65\x9f\xfb\x18\x90" - "\x5f\xdc\x3e\xb7\x1f\xd6\xee\xf0\x62\xdd\x62\x1d\x18\xfd\xc8\xcf" - "\x73\xf0\xd4\x0e\x30\xd9\x8d\xe7\x80\xfd\xc6\x4a\xfc\xd0\xac\xdd" - "\xf1\x31\x0b\x34\xce\x8c\xa7\xf8\xb5\x3b\x4c\x38\xae\x42\x38\x89" - "\x33\x75\x81\xa6\x99\x39\x92\x7d\x85\x78\xcc\xbc\x87\xf0\x18\xf5" - "\xa4\xd3\xb9\x37\x35\xc6\xe7\x61\xd8\xbf\x50\x7f\x13\x20\xb9\xb3" - "\xce\x3c\xc9\xb4\x7a\xdd\x9a\x38\xe6\x22\x9f\xb6\x24\x03\x81\xfb" - "\x18\xa3\x71\x5b\x91\x11\x3a\x78\x9b\xf2\x4f\x33\xb3\x44\xbd\x8e" - "\x35\xce\x3c\x19\x68\x9a\xfd\x04\xc2\x51\xd1\xbd\x34\xcc\x3a\xbb" - "\x50\xc8\xcc\xa7\xbc\xed\xb1\xc6\xd9\x85\xe1\x73\x04\xd1\xe7\x07" - "\x3c\x96\x69\x27\x1c\xd0\xc7\xcf\x97\xe1\xbb\xcd\x01\xf6\xa5\xd2" - "\x7b\x8f\x03\xfe\x9e\xcf\x13\x91\x8e\x33\xd4\xc1\x2d\x17\x61\xba" - "\x19\xf9\x01\xf8\x9e\x80\xef\x07\xf3\xef\x40\x9a\xad\x47\xba\xb1" - "\xbe\x3d\xa4\x6f\x98\x25\x9b\xfa\x92\x5c\xa4\x35\x9e\x79\xd2\x13" - "\x58\xd2\x7c\x1c\x4b\xe9\x68\x0c\xaa\xc1\xef\xa9\xc8\xd3\x34\xfc" - "\x4d\x3a\x3a\x0c\xc9\xf8\x90\x3f\x56\x33\xe9\x63\x7c\xcf\x62\xbb" - "\x75\x93\xeb\x77\x41\x86\xc6\x2d\xfc\x2e\x6b\xf6\x6b\x69\x2c\x96" - "\x4c\xef\xcc\xf2\x4f\xe9\xed\xc3\xb2\xef\x65\x2c\x2f\xca\xbd\xb5" - "\x7e\x4f\xba\x92\xf0\x94\x71\x21\xdc\x10\xcf\x54\xc4\xb3\xf9\xd1" - "\x3d\xb9\x40\xf7\x0c\x45\xd3\xdf\x1e\xcb\xf4\x31\xfa\x63\xc4\x9f" - "\x95\x79\x12\x23\xde\x2d\xf3\x29\xd6\x3c\x01\xb5\x71\xff\x30\x1b" - "\x6c\xa8\x14\xe7\xec\x4c\x3e\xf6\xff\xe0\x18\xc6\x5c\x87\x63\xf3" - "\x7c\xa3\x97\xd9\x5d\xcc\x46\xf7\x15\xd1\x38\xb8\x1d\xd3\xd4\xf9" - "\x58\x80\xc6\xc5\x34\x26\x26\x9f\x6e\x81\xc6\xcc\x41\xd6\x98\xe9" - "\x1c\xda\xc5\x7c\x6d\x7c\x1c\x9b\x52\xe6\x80\xfb\x8a\x45\xdd\xa4" - "\xe6\x61\x3f\x38\x30\xa4\xcd\x74\x22\xec\x44\x82\xdd\x67\x60\xb6" - "\x40\x62\xa6\x0b\xd3\x59\x1d\x20\x7c\xf5\xc9\x73\x7d\xd8\xa7\x0d" - "\x1e\x3c\x42\xfd\x5a\xca\xfb\x0e\x98\x79\x68\xdc\x5c\x92\x58\xbd" - "\x34\x87\x9d\xb7\x50\x40\xf8\xe9\x11\x3a\xa9\x91\x1b\x3d\x3a\xd8" - "\x2f\xa6\x76\x93\x9f\x3b\xd3\x3e\x48\xc1\x7a\x98\x7e\x11\x52\x67" - "\x99\x8c\xec\x02\xb3\xa4\x9c\x7c\x67\xaf\x17\x6d\x88\xd4\x0c\x07" - "\xbc\xdd\x1f\x8b\x6f\x81\x61\x36\x80\x30\xca\x1a\xd0\x0e\x24\xba" - "\x89\x6f\xf9\x46\x16\x40\xfa\x3e\xa3\x36\xd6\xbe\x8b\x6c\xe1\x54" - "\x83\xcc\x87\x58\x67\xff\x98\x35\xd3\x27\xec\xc5\xd4\x33\xcc\xc2" - "\xc0\x36\x83\xe6\xfe\x52\xff\xc4\x6d\x26\xeb\x8c\xc2\x21\xd4\x1f" - "\x34\x47\x42\x3e\xe9\xaa\x75\x0c\x75\x41\x6a\x97\x03\x6e\xcf\x92" - "\xc6\x64\x6e\xbb\x6f\x25\xe9\x92\xa8\x67\x72\xf9\xd9\xc0\x31\xf8" - "\x33\x5c\x7d\x29\xd8\xd7\xa2\x2e\x62\xda\x6d\x69\x75\xa2\x9e\xbd" - "\x04\x97\xce\xb6\x0e\x60\x7c\xb5\x9b\x39\x99\x75\x1b\xf9\x77\x73" - "\xd3\x39\x3b\x0c\xfb\x12\xe5\x97\xd9\xaa\x08\xa7\x19\x5f\xda\x66" - "\x8c\xc0\x05\xb4\x07\xe9\x2c\xab\x18\x9f\xcd\x38\x77\xba\x06\xa4" - "\x31\xdf\x8c\xcd\x0e\x48\xef\x91\xf1\x42\x9d\xc1\x90\xb7\x58\x3e" - "\xe9\xbb\x41\xee\x2b\xb2\xba\x96\x79\x11\xd7\x3c\x4c\x7b\x48\xa6" - "\x81\xe8\x13\x74\xcd\x68\x0d\xa5\x0b\x71\x70\xa1\x6d\xcd\x79\x50" - "\xbd\x07\xe2\xb9\x8f\x2c\x3f\xf5\x1d\x2b\x39\x2d\x44\x33\xa7\x05" - "\xed\x0a\xea\x4f\xec\xbe\xc5\x68\x77\xf1\xf0\x32\x84\x85\xe3\xdf" - "\xef\xe7\x08\x9b\x6a\x06\xf7\xa5\x1c\xdd\xb7\x63\xaa\xce\x74\x1d" - "\x66\x98\x02\xec\xfc\x05\x98\xb9\x13\xf9\xa4\xa2\x5f\xde\x17\x7b" - "\x51\x76\xb5\xd9\x3d\xd4\x07\xdb\x6b\xaf\xa1\xde\xe6\x69\x6f\xc6" - "\xb4\x03\x98\xa6\x54\x4a\x5b\x2a\xe6\x84\xf9\xef\x44\xfa\xc5\x3e" - "\xf9\x16\x94\xdb\x5a\x9a\xc7\x60\xda\xe7\x1c\xf2\x37\xc3\x6f\xfc" - "\xcd\x66\x8d\xd9\x3d\xd1\x71\xd1\xeb\x02\x52\x3b\xc4\x72\x6e\x23" - "\x39\x32\xed\x81\xef\xa1\x4c\x7e\x56\xb7\x0f\x6e\x21\x19\x63\x89" - "\xf3\xe3\x05\xdf\x67\xa2\x2e\x33\x03\x9d\x8b\x35\xec\x82\xe9\xac" - "\x71\x3e\x5c\x84\x99\x9f\x16\xd5\xea\x11\x57\x80\x86\xcb\x40\xfd" - "\xe4\x5f\x31\xbd\x9a\xee\x94\x6b\xbf\x4c\xb2\x38\xd3\x27\xcb\xa2" - "\xc7\xa2\x8f\xbf\x91\x4e\x40\xbe\xb6\x88\x71\x85\x7e\x27\xcd\xb1" - "\x9d\x07\x3d\xf9\x09\x55\xd1\x9d\xe6\x18\xf6\x08\x1b\x66\x29\xe4" - "\xb3\x10\x79\x8d\xf5\xa8\x3f\x8c\xbf\x2d\xfc\xb1\x80\x59\xfa\x3e" - "\x84\xe9\x72\xd9\xb0\x9f\xd2\xb4\x60\x18\xea\x48\x05\xb5\x93\x56" - "\x2c\xfb\xa0\x03\x1e\x30\x8a\xba\xd1\x17\x10\xac\x18\x38\x1c\x62" - "\xfc\x9c\xe9\x55\xa4\x57\x7f\x49\x5f\xa7\x20\x3c\x84\x9f\x0d\x84" - "\xd5\xae\x14\xba\x39\x80\xb8\xb6\x59\x02\x65\xa8\x87\xcb\x02\x4d" - "\xf7\x58\xf9\xbb\x14\x47\x78\x04\xb0\xfc\xe8\xf0\xb7\xa5\xd1\x59" - "\xf9\x01\x98\x95\x27\xe0\x6c\xd3\xd9\xa6\x5d\xa4\xef\x55\xf4\xed" - "\xd6\xe6\x58\xed\x2d\xb9\xc2\x07\x2a\xa6\x11\x76\xfe\xac\x55\x43" - "\x58\x86\xc7\x32\x2b\xcf\x01\x77\xc6\x8b\xf9\xc6\x1c\x6b\x8c\xb6" - "\xa7\xa5\xb6\xd3\xdb\x0a\x52\x9b\x9e\x13\x47\x73\x1e\x48\x97\xd1" - "\xaf\x9d\xd1\x22\xe9\x59\x1a\x83\xdd\x74\x1e\xe6\xa8\xfb\xca\xb8" - "\x7c\x2b\x99\x72\xd6\xf1\x30\xdf\x89\x18\x37\xfe\x99\xd5\x8f\x8f" - "\x13\x1f\xb7\xf8\x46\xe4\x60\x36\x62\x30\xbb\x84\xf3\x6d\xa8\x04" - "\xc7\x44\x73\xd4\xd8\xc7\xb7\xd0\xb7\x03\x66\x39\xd8\x50\x9a\x12" - "\x6d\x11\xfe\xde\xbe\x83\xc6\x16\xb3\x13\x90\xff\x2d\xa2\x1e\x08" - "\x06\x28\xb0\x2d\x12\xcf\x99\xa9\x85\x79\xbb\xea\xdc\x88\xf3\xec" - "\xa5\x5d\x2d\x6e\xd0\xdf\x4e\xb4\xcf\xce\x25\x7a\xdc\xc8\x7b\xfa" - "\xad\x6e\x61\xae\xd3\xad\x3e\xa0\x79\x69\x84\x55\xe8\x00\xcb\x0a" - "\x31\x4e\xd9\x56\x40\xf0\x24\x79\x60\x32\xed\x82\xc7\x39\x56\xfd" - "\x2e\x05\xc1\x7a\x97\xe6\x24\x68\xcc\x14\x9c\xeb\x99\x7d\x14\xdb" - "\xf8\xfd\xe4\x43\xf5\x32\xcc\xe6\x7e\xa1\x4e\x97\x71\xff\x6c\x83" - "\x47\x79\x7f\x30\xfb\x14\xe2\xeb\x95\xfc\x50\x0c\xd2\x19\x7b\x82" - "\x87\xe3\x28\x67\x6f\x99\x0b\xfc\x48\x2b\x3f\x83\x8f\xf5\xb3\x6f" - "\x90\x79\x3f\xde\xe5\x55\xf3\xf2\x2b\xb9\x6f\x34\x37\xf9\x93\x65" - "\x58\x57\x38\xee\xf5\x62\x59\x35\x91\x3e\x3e\x43\xfc\xc8\x4a\x38" - "\xa7\x4d\x3a\x9d\xc6\xf5\xa5\x11\x6d\xae\x43\xe1\xf5\x95\x16\x2f" - "\xea\x6a\xce\x86\xf0\xba\x4a\x43\xdb\x65\x4e\x0b\x3e\x9d\xf8\xd8" - "\xc4\x77\xe8\x33\xe7\x60\xc8\xfb\x19\x8f\x65\x0e\xf6\x7f\xfa\x64" - "\x51\x07\x14\x86\x38\x92\x6c\x7c\x89\xfd\xcb\x28\xf9\xd7\xbd\x04" - "\x14\x4e\x72\x4c\xe1\x01\xb4\x55\x90\xb7\xc7\x30\x5e\x4b\x6d\x94" - "\x7c\xda\x85\xc6\x8f\xf9\x2e\x81\x39\xd7\xf8\x9c\xc3\xfe\x43\x87" - "\x48\x3e\x31\xcf\x71\x8d\xef\xd0\x21\x8f\x25\x0d\x64\x1e\x62\x98" - "\x93\xe2\xa3\xdb\x0c\x69\xe9\x63\xb6\x15\xda\x9b\x54\x3f\x83\x30" - "\x37\x1b\xf5\x12\xea\xe3\x7b\x0e\x89\xfe\x64\xee\x62\xfa\x46\x7d" - "\xf8\x19\xbe\x67\xf5\xa2\xde\x19\x69\xba\xcb\x35\xaa\x84\x89\x23" - "\x4a\xc8\xf5\x35\x1d\x19\xf4\x25\xcd\xf1\xd9\x9d\x27\xa0\xcf\xf7" - "\xf7\x40\x77\x23\x22\x8c\x3b\xc8\x8f\xa2\x69\x0f\xf3\x7f\x38\x72" - "\x1c\x75\xd3\x15\x1b\xf7\x5b\x0c\x73\x39\xed\x2f\x9f\xc7\x5e\xfd" - "\x29\x0e\x5b\xe2\xc5\x91\xee\xfa\x67\x98\xaf\xfe\x02\xf9\x56\xd0" - "\x4d\x7e\x65\x04\x32\xde\xdc\x0b\x59\xad\x23\x90\xd6\x36\x02\xe9" - "\xec\x73\xba\xcf\x22\x78\x07\xc6\x54\x03\xc4\xb7\xed\x45\x3b\xcc" - "\x07\x0a\x7f\x23\xda\x61\x3e\xb4\xc3\xae\xa4\x93\xfe\x1b\xb3\xc3" - "\x46\x47\xc9\x0e\x9b\x2f\xfc\xed\x36\xce\x37\x4c\x29\x03\x45\x42" - "\x31\x68\x11\x3f\xd3\x65\x48\x2b\x4f\x18\x40\x1b\x10\x69\x76\x48" - "\xf4\x22\x7f\x6b\x35\x65\x30\x91\xd3\x8a\x3a\x99\x35\xde\x13\x95" - "\x67\xbc\xaf\x55\x92\xec\xb8\xa9\x7d\x10\x0d\xfb\x69\x4d\xe4\xc4" - "\x34\xaf\xba\xba\x95\x79\x29\xbc\x66\x16\xc9\xde\xdc\x32\x2a\xbb" - "\x13\xc3\x3d\x96\xb9\x56\x87\xfa\xb6\x9e\x58\x7a\x58\xb3\x5f\xb6" - "\x07\x6e\x4f\x64\x4a\x33\xd9\xdf\x39\xfb\x7c\xcc\x65\xbf\x4c\x6d" - "\xf3\x76\x6d\x7e\x05\xf3\xe9\x2b\x69\x7d\xea\x76\xa0\xb5\x33\x9a" - "\x33\xff\x15\xda\x2e\x5f\xb5\x5e\x46\x7d\x02\xda\xe7\x79\x9a\x0a" - "\x84\x89\xf6\x3f\x33\xa5\x47\x39\x27\x1f\xdd\x1e\xa7\xb5\xd6\x57" - "\xf9\xba\xee\xed\xab\x1d\x50\xe0\x95\xfc\x25\x0e\x0a\xfd\xf8\xfd" - "\x0c\x1a\xe7\x87\xb7\xeb\xef\x03\x9d\xfb\x1f\xb2\x66\xd4\xda\x66" - "\x90\x2e\xbf\xfd\xba\xb0\x6d\x32\x8c\x42\xb7\xdf\xfe\xef\x62\x8e" - "\xee\x76\xec\xff\xef\x4e\x20\x78\x86\xd9\x24\x13\xb7\x9f\x65\x49" - "\x19\x2f\x50\xba\x4c\x33\x98\xb7\xfb\xa0\x98\x35\x66\x18\x19\x6f" - "\x17\x97\x81\xbd\xbe\xcd\x43\x6b\xb2\xee\xdb\x36\x79\xb0\xaf\xcf" - "\xc0\xb8\x5a\x2a\xc3\x85\x69\x90\xef\x93\xc4\xda\xda\xed\x2e\x07" - "\x64\x2f\x15\xf2\x7e\x7b\x97\x98\x3b\xba\xbd\x6b\x08\xf3\xa2\xed" - "\x77\xb3\xc7\xf2\x7d\xad\x03\xd6\xf4\x48\xf6\x27\x5f\xd3\xc6\xb0" - "\x34\x07\xe4\xf3\xf9\x94\x9a\x59\xa0\xab\xd1\x33\x67\x4c\xdb\x2d" - "\x8c\xce\xf4\xf7\xf8\xba\xb3\x12\x6e\x43\x18\x65\x32\x5c\xec\x3f" - "\x7f\x31\xa4\x7c\xf4\x51\x0c\xab\x95\xe1\x62\x1a\x1c\x6b\x7f\xff" - "\xf0\x58\x1a\x91\xa7\x35\x24\xcf\xa3\x43\xca\x3b\x7f\x81\x61\x9d" - "\x11\x79\x6c\x11\x79\xce\x84\xe4\x31\x4b\xe5\x0c\x44\xe4\x71\x87" - "\xe7\x49\x57\x8f\xc7\x2d\x5d\x17\x9e\x27\x3d\x3d\x22\x4f\xce\x78" - "\xdc\xd2\x57\x47\xe4\xd9\x1c\x91\xa7\x22\x84\xb7\xb4\xbe\x9c\x85" - "\x61\xe6\x88\x3c\xd6\x88\x3c\x1d\xf2\x37\xda\x92\x36\xd1\xd7\xa3" - "\x3c\x61\x9d\x62\xbd\xd6\x62\x3c\xd2\x9f\x93\x71\xa3\x7d\x00\x28" - "\x33\x35\xa6\xa3\xc2\xef\x34\xe9\x50\x1a\x53\x90\xde\x46\x7d\x4f" - "\xf3\xf5\xdc\x87\x1c\x95\x75\x01\xee\xb8\x44\x32\xe4\xb1\xdc\x91" - "\x3c\x9e\x1f\x77\xa4\x87\xe3\x79\x47\x4e\x38\x9e\x77\xe4\x8d\xe7" - "\xc7\x1d\x9b\x23\xf2\x54\x44\xe4\xa9\x0d\xc9\xd3\x21\x95\x63\x8d" - "\xc8\xd3\x11\x91\xa7\x73\xbc\x7c\xde\xd1\x15\x91\xe7\x6c\x44\x9e" - "\x81\x20\x0f\xef\xe0\x7b\x3a\xa8\x3d\x60\x38\x7e\xdf\x7d\xa3\x7d" - "\x18\x5a\x59\x9e\xe5\xfd\x18\x42\xae\xef\xdc\xdf\x2c\xf6\x25\x70" - "\x9f\x1f\x03\x70\xa7\xf0\x0b\x89\xf8\xbc\x33\xe2\x8d\xa3\x3e\x17" - "\x79\xeb\x3c\x6d\xf4\xa2\x8d\x79\x67\xb1\x03\xb2\x2a\xe4\xb5\x4f" - "\x5a\x2f\xe6\x3e\xa2\xf8\xf8\xe2\xce\x5c\xd1\xfe\xee\x6c\x96\xe6" - "\x64\x89\x1e\x1c\x37\xdc\xd9\xfc\xbf\x86\xd7\x5d\x8b\x09\x2f\xf2" - "\x99\x82\x30\xfa\xc7\xc6\x0e\x63\xb8\x52\x99\x77\x3d\x20\xe3\xda" - "\x2e\xd6\xac\xc9\x3f\x8f\x8b\xfc\xd7\x78\x2c\x77\x25\x84\x8c\x37" - "\x08\x57\xf7\x89\xbd\x5e\x75\x04\xce\x83\x02\xe7\xbb\x72\x85\x8e" - "\xba\x2b\x57\xd6\x27\x31\xe5\xcf\xba\x2d\xbe\x0f\x6d\x3e\x5a\xa7" - "\xeb\x6d\x45\xfb\x11\xc7\x4c\x84\xf7\x79\xb8\x4b\xd8\xb3\x95\x23" - "\x40\xef\xf6\xda\x25\x7c\x1d\x4f\xa2\xc5\x46\x7e\xca\xc9\x4e\xe9" - "\x32\x5c\x85\x21\x3e\xe6\x22\xdd\x78\xd7\xa5\xd3\xb5\x2e\xc2\xf5" - "\xa4\xbc\xbe\x8d\xb8\x70\x9c\x86\xac\xdb\xf8\x1a\x23\xcd\xcb\x9f" - "\x76\xe7\x50\x9a\x73\xc8\xdb\x0e\x99\x07\xe4\xf3\x1c\xd3\x36\xc7" - "\x1a\xfb\x84\xf2\x55\xe0\x90\xb9\x51\xc8\x4f\x46\x5a\x78\x7b\x88" - "\x43\x39\xcd\xc8\x09\x97\xb9\x8c\xbc\x70\x99\xcb\x28\x0c\x6f\x0f" - "\x4a\x6c\x0f\x19\x15\x11\x79\x6a\x23\xf2\x1c\x0e\xc9\x63\x95\xca" - "\xe9\x88\xc8\xd3\x19\x91\x27\x54\xff\x21\xcd\x19\x67\xc6\xc6\x91" - "\x5c\xdf\x67\x38\x42\xbe\x95\xcd\xbc\x9f\xca\x70\xcb\x61\xb4\xee" - "\x89\x76\x27\x5f\xcb\x17\xf0\xe6\x69\x23\x74\x14\xa6\x9f\x97\x16" - "\x8e\xc3\xbc\xec\x70\x1c\xe6\xad\x90\xbf\x1b\xc4\x38\xf8\xb7\x17" - "\x60\xde\x4b\x92\x9c\xb9\x35\xfb\xe1\x11\x8d\x6f\xdd\x46\xb2\xc3" - "\xa8\x7f\xe2\x7b\x2c\xf6\xa1\xed\x78\x0d\xb4\xb4\xb7\xe5\x42\x0d" - "\xa8\xc8\x8f\x92\x03\x32\xad\x38\x3e\xab\xc0\x34\x83\x68\x4f\xe5" - "\x23\x8c\x0d\x58\x7e\x0b\x96\x81\xbc\x9b\x77\x3c\x02\x87\x93\x11" - "\x38\x74\x87\x7c\x6b\xf1\xbb\x3f\x84\x6e\xad\x4a\xc7\xf7\x40\xa1" - "\xcd\x3c\xcf\x25\x87\xd3\x98\x1e\x69\x74\x9a\xb8\x1d\x90\x4b\xfb" - "\x5a\x92\xce\xc3\xbc\x4f\xc9\x0e\x16\x30\x33\x53\x42\x79\x2b\x78" - "\x91\x99\x15\x8e\x47\x66\x6e\x38\x1e\x99\x05\x41\x5d\x33\x6f\x83" - "\x68\x23\x99\x25\xa8\xa3\xf9\xda\x2f\xf2\x42\xaf\xf1\xe9\x6f\xb6" - "\xcd\x26\x9b\x34\xf3\x25\x37\xd2\xcb\x7e\xac\x4c\x92\xbe\xf9\x3d" - "\x34\x6c\x36\xcd\xff\x6f\xd3\xc5\x92\xd1\xa1\xa4\x6d\x5a\x69\x6f" - "\x92\x1e\x61\xdb\x64\x19\x0f\x34\x6d\xd3\x06\x1a\xef\xce\xc1\x30" - "\xd4\x7f\x77\x79\xc5\xd8\x63\xf1\x41\x94\xe7\x16\xac\x13\x1c\xa7" - "\xce\xff\x44\x1a\xd7\xa5\xd1\x7e\x15\xd4\x35\xe4\x7f\x2d\x41\xac" - "\x69\xce\x8f\x0f\x69\x2b\x6e\xfd\xde\xfb\xd9\x79\x98\xdf\x4b\xf6" - "\x1a\xe9\x02\xda\xf7\x72\xda\xe7\x02\x9a\x0b\xb1\xfb\x2e\x72\x9b" - "\x1a\xe3\x7b\xa4\xbc\x2b\x42\xf2\xba\xa4\xb9\x0a\x27\xc5\xcd\xf7" - "\x81\xfa\xb4\xdb\x45\x7e\xa6\x93\x85\x1d\x3e\xbf\xf7\x34\xea\x00" - "\xcc\x63\x94\xf3\xd0\xbc\x86\x34\x1e\x51\x67\xd6\xd2\xbd\x74\xe7" - "\x39\x6c\x10\xbe\xf8\x9c\x38\x9e\x19\xb4\xd7\x3a\xc1\xee\xee\xa7" - "\xf9\x45\xb5\xd8\x3f\x30\xbf\x47\xe5\x85\xf8\xa1\xc6\x6d\x28\x37" - "\xf3\x7b\xfc\x8d\xdb\x68\xfc\xaa\x47\x19\xe2\x7a\x2d\x94\x77\x2b" - "\x57\x16\xac\xcb\x5f\x33\xef\xf1\x75\xab\x36\xac\x5c\xa2\xdf\x50" - "\xfe\x7c\x69\xc9\xbc\xed\x3b\x6b\xf4\xbb\xab\xca\x6b\xca\x2b\x9f" - "\xe5\xae\xf1\xf4\x5b\x6a\xc4\x6f\x7a\xc5\x96\xea\x9a\x65\xf4\x9a" - "\xa1\x37\x54\x95\xee\xe2\xaf\x77\x4c\x86\x70\x20\xe5\x35\xa5\x55" - "\xfa\xb9\x25\x19\xfa\x87\xb6\x94\x57\xec\xac\x2a\x8d\x0a\x6b\x89" - "\xbe\xaa\xb4\xaa\x74\x4b\x89\x7e\x99\x3e\x8b\x20\x87\x82\x0b\xa9" - "\xcf\x2c\x59\xe7\x54\x63\x1f\x8d\x76\xb1\x93\x74\x0f\xf5\xd5\x17" - "\x60\xe1\x47\x64\x97\x71\x5f\x76\x28\x5b\xa8\xe7\x1d\x1e\x4b\x56" - "\xe7\xf8\xbe\x39\x2b\xa2\xff\xcb\x8a\xe8\xff\xb2\x06\xc6\xf7\xcd" - "\x59\xde\xf0\x3c\x0b\xe2\xc3\xf3\x2c\xd0\x8d\xef\x9b\x17\x64\x44" - "\xe4\x59\x1a\x91\x67\xf5\x98\xee\x40\x5c\x0f\x70\x5d\xb3\xa0\x38" - "\x22\x8f\x21\x22\x8f\x39\xe2\x3b\xd4\xfe\x41\x7b\x74\x41\x47\x68" - "\x7f\x8f\xdf\x9d\x72\xfb\x0d\xea\xac\x05\x5d\x72\x1a\xea\x4f\xda" - "\xe9\xce\x0c\x91\xf6\x5c\x48\x5a\xa7\x94\xd6\x35\xa6\xab\x8e\xf0" - "\x31\xb3\x53\xd8\xdc\x0b\xb7\x48\xfa\x8a\xee\xd0\x90\xfb\xc5\x01" - "\xac\x8b\x99\x97\x61\x01\xf9\xf0\xe7\xe3\x6b\x3e\x37\xfc\xfa\x26" - "\x4f\x7b\x12\xd0\xbd\x1b\x4e\xf2\xe5\xc6\x2c\xf3\xb9\xcf\x40\x0c" - "\x4b\xc0\x07\x75\xcf\xc2\x0d\x0e\xb5\x8e\xdf\x6d\x43\xeb\x91\x0e" - "\x58\xc8\x65\x99\xf2\x1d\xe4\xfb\x5f\x78\x79\xbd\x74\x17\x08\xf9" - "\x47\x24\x9d\x48\xe5\x92\x8f\x41\x2a\x1b\x61\xa8\x99\x32\x2b\x55" - "\xf2\x15\xa7\xc5\x27\x19\x61\x1e\x97\x61\x22\x3c\xae\x57\x0e\x48" - "\x7b\x3b\x85\x2d\xb3\xb0\x5b\xb6\x19\xc8\xfe\x8f\xa6\x3b\xa2\xef" - "\x07\x04\x4d\x83\x25\xd0\x6f\xab\x1b\x20\x9c\xbc\x64\x5b\xda\x75" - "\x3e\xe8\x6b\xf5\xe1\x98\x14\xb4\x7c\x8c\x64\xbc\x04\xf6\x0e\x1f" - "\x5f\x47\x29\x32\x82\xb9\x5d\x19\xe8\x67\x63\xf9\x68\xdc\xb5\x88" - "\xaf\x29\x1f\xa4\x70\xcc\x8f\xe3\x03\x17\xed\x1b\x8c\x75\x27\x0d" - "\xa5\xb3\xcd\xa6\x31\xdc\xa2\x32\xc9\x9e\x3d\xd4\x8e\xb0\xa2\xee" - "\x69\x53\x82\xdd\x63\x59\x74\xcc\x01\x4f\x58\x65\x3d\x7c\xba\x85" - "\xeb\x3e\x25\x86\x9f\x42\x5e\x0c\xc6\xb2\x3d\x24\x9d\x6d\xa0\xfd" - "\x18\x98\xd6\x79\xa3\xb4\x84\xf7\x69\xa4\x1b\xdb\xa2\xf9\x9d\xba" - "\xac\x38\x49\xbf\xe2\xb8\x3f\x5b\x2f\xe7\xfb\x3a\xf4\x49\xfb\x6e" - "\x5d\xd8\x56\xdd\x62\xfc\xb7\xf8\xb5\x57\xf9\x3e\xb9\x6c\x1c\xff" - "\x2c\x3a\x2c\xd1\x70\x13\x7e\xa3\xfe\x5b\xc4\xf7\xef\xd2\x9a\x38" - "\x8d\x93\xab\x0d\x68\x87\xe9\xdc\xa8\x1b\xb3\x9b\xe5\x38\x3e\x6f" - "\x4c\x71\xb5\xcc\x7b\x5a\x37\x40\x71\x9d\x63\x71\x94\x8f\xf0\x36" - "\xfa\x28\xbc\x5b\x0e\x17\x76\x40\x76\x7f\xc4\xb7\x53\xfe\xc6\x77" - "\xec\xff\x17\x6d\x96\xe0\xbb\x50\xe7\xd2\x3e\x04\xc5\x79\x58\xfc" - "\x68\x1b\x6f\x37\x8b\x93\xe5\x78\x3e\xf7\xf5\x36\x8e\xaf\x7d\x6e" - "\x08\x24\x65\x98\xb9\x1d\x85\x79\xe8\x6e\x19\x1c\x37\x28\xd8\x28" - "\xdf\x13\x31\x48\x70\xa8\xcd\xf0\xfb\x1d\xf0\x1b\x61\xd1\xfc\xbc" - "\x8b\x64\x64\xb7\x0f\x52\x0c\xf7\xd1\x1c\xf1\x62\x2e\xb7\x14\x46" - "\x70\x09\x9e\xc9\x27\x60\x13\x3c\xba\x03\x87\x0d\x95\x21\xae\x8b" - "\x89\xfe\xee\x58\x75\x85\xf1\x27\x42\x78\x19\x87\xdf\x5d\xe1\xb4" - "\x2e\x3e\x1b\xf1\x3d\x20\x7f\xd3\x7c\xac\x90\xbd\xc5\xfd\x22\xee" - "\x6e\xb8\x51\x59\x34\xa6\xc5\x34\x69\xe1\xe5\xdd\x9d\x1d\x0e\xff" - "\xee\x15\x11\xdf\x1b\xe4\xef\x66\xbe\x0e\x70\x77\x89\x5c\x86\x98" - "\x8f\xcb\x30\x1f\xab\x73\xc5\x7d\x3d\xf9\xb9\xe7\xd7\x42\x7e\xee" - "\x3e\x1e\x82\xc3\x04\xfc\x3e\x19\xac\xcf\xbb\xbb\x64\xf8\xf8\x7e" - "\x26\x24\x1d\xb6\x91\xbb\x1d\x91\xf2\x52\x6d\x24\x39\x23\x99\xb9" - "\xdb\x17\x25\xce\x2b\xe2\xee\xd1\x45\x97\xb3\x7b\xb2\x42\xc2\xa5" - "\x71\xc7\x3d\xb2\x5f\x7c\xd2\x91\x6e\xba\x63\x47\xf2\xf3\xcb\xe5" - "\x82\xfc\x7f\x4a\xf7\x7e\xa0\x6c\xdd\x63\x88\x84\x4b\x77\x35\x8c" - "\xc1\x08\xc2\x94\xc6\x17\xf7\x74\x04\x69\xbb\xe7\x7d\x07\x2c\xee" - "\x90\xe5\x56\xcc\xb9\xdd\xdd\x1a\xcb\x9e\xc7\xf4\xe7\xc2\x79\x76" - "\xcf\x60\x90\x67\xf7\x78\x83\x70\x73\xd4\x21\xe9\xfe\x15\xbf\x93" - "\x83\xe9\x72\xf4\x5f\x25\x1f\x62\xaf\x7f\x4e\x5e\x78\x59\x39\x85" - "\x21\x30\x4a\x42\xca\x32\x84\xa4\xeb\xc7\x6f\x73\xec\xfa\xc9\x69" - "\x8d\x5d\x3f\x39\x27\xa3\xd7\x4f\xce\x99\x90\x72\xcf\x7d\xb5\x6c" - "\xdf\x0b\x21\xf8\xb4\xe3\xb7\x36\x5c\x96\xef\xd5\x47\x7c\x8f\xd5" - "\x3f\xc3\xf6\x7b\x6c\x6f\x6e\x1c\x85\xd7\xcc\x02\xad\x90\xf5\x7b" - "\x0b\x42\xe3\x3f\x1c\x11\xf1\x84\x23\x5f\xab\xa2\x75\x40\x91\xce" - "\x18\x99\x8e\xd2\x84\xc4\xb7\xc8\xb8\x1f\x8c\xe1\x93\x56\xee\x83" - "\xec\x01\xea\x83\xee\x3d\x21\xd6\x37\xe6\x9d\x60\x96\x8f\x0b\x63" - "\xf5\x27\x08\x17\xfb\xff\x7b\x8f\x0b\xfe\xdc\x8b\xf2\xff\x08\x5f" - "\x4f\x65\xd6\x79\x27\x50\x9e\x46\x2e\xc0\x12\xda\x13\x36\x8a\xbf" - "\x7b\xc2\xfb\xb8\x25\xc9\xcc\xa2\x58\xdf\x6e\x89\xec\xfb\x96\x64" - "\xa0\x4d\x3f\xa2\xf1\x99\x0b\xa3\xc4\xe5\x31\x8b\x6a\x5d\x94\xf0" - "\x62\xac\xaf\x11\x07\x2c\x69\x26\x7c\x43\xc2\x8d\xcc\x32\x75\x03" - "\xa5\x77\x50\x79\x98\x27\x56\xbd\xc9\xfb\xdf\x85\xec\x2d\xe9\x8a" - "\xa0\xe3\xfa\x05\xf8\xc1\x03\x82\x8e\x1f\x1c\x8d\x28\xfb\x5c\x0c" - "\x3a\x68\x9c\x76\x3d\x3a\x1d\x3f\xd0\x72\xde\x2a\x91\x96\x71\x7d" - "\xff\x0f\x32\x90\x96\xeb\x9c\xef\xe1\xe1\x2b\xe4\xf1\x9f\xe9\x3a" - "\x8e\xab\x95\xc0\xf3\xae\xaf\x0d\xd6\x9b\x94\xae\x42\xd3\x02\x05" - "\x51\xca\x3c\xc8\x2c\x13\xd7\x3b\xe0\x07\xa7\xe4\x3e\x43\x0a\x6f" - "\x15\xb8\x20\x9f\x94\x9c\x4f\xe7\x28\x5f\xac\xfa\x96\xdb\xa7\x58" - "\x93\xf9\x01\xb6\xff\x25\xb2\xfe\x70\x63\x9f\xea\x92\xf9\xe8\xb1" - "\x2c\x8d\x8f\x88\xf3\x86\xc4\xa5\x85\xc5\xed\x1b\x0b\x5f\x2a\x87" - "\x7f\xbd\x7a\x5a\x5a\x11\x51\x4f\x58\x3f\x4b\xfd\xe1\x74\x2f\xad" - "\x15\xf4\x61\x1d\x8d\xe3\xf5\xd2\x16\xac\xa3\xd1\xe8\x75\xb4\xf4" - "\x44\x74\x59\x5b\x2a\x6c\xcf\x24\x88\x06\xcf\x89\x75\x37\xca\x65" - "\x50\xaa\xa7\xf1\xf5\xb3\x2c\x41\xae\x9f\xaf\x47\xe3\xb2\x82\x08" - "\x1a\xfd\x08\xa3\x57\xd0\x7a\x5f\x6a\x04\xec\xb2\xe8\xb2\xb8\xcc" - "\x8c\x74\xfa\xa3\xd3\xb9\xac\x35\xb6\x2c\x2e\xa3\xfb\x73\xfc\xe3" - "\x65\x71\x99\x7c\x67\x74\xb4\x3c\x83\xcc\x12\xad\x9c\xfb\xd4\x64" - "\x9b\x38\xe0\xbe\xa5\xb4\xce\x15\x12\x9e\x12\x2e\x7f\xcb\xca\x78" - "\x3e\xe2\x9f\x4f\x8c\x25\xa8\x1e\x2e\xe8\x41\xf9\x55\x32\xe9\xb1" - "\xdc\x57\x1b\xc1\xab\x2b\x08\xdf\x3f\xa4\x54\x3e\x24\xf8\x75\xff" - "\x27\x11\x38\xb5\x44\xe7\xd7\x7d\x9d\xc8\xaf\x2b\xd1\xf9\x75\x5f" - "\x4f\x6c\x7e\xdd\x47\xf5\x7f\x65\x3c\xbf\xee\x87\x50\x7e\xd1\xdd" - "\x80\x44\xdf\x1c\x1d\xca\xc6\x68\x11\x6b\x17\xba\x5c\xab\x41\x59" - "\x11\x79\x06\x29\x4f\xb6\xc6\x2b\xe4\x44\x3f\x0d\xe2\x2f\xc3\xfd" - "\x29\x72\xfb\x9f\xda\x02\x13\xd9\xe8\x26\x46\xf7\xfa\x50\x3e\xbb" - "\xf1\x8a\x8d\xee\x24\xa3\x79\xbc\x88\x72\x8d\xd1\x75\xc1\xfd\x56" - "\xe4\x69\x53\x94\xf0\xe3\x62\x2e\xf2\x7e\x47\xb8\x8e\xb8\xdf\x16" - "\x5e\x47\xc8\x37\x25\xf7\xaa\xab\xf8\x3a\xcf\x8d\xeb\x2c\x37\x6b" - "\x7c\x9d\xe5\xfe\x49\xd4\x57\xee\x47\xe1\xf8\xe5\xe6\x45\xaf\xaf" - "\xdc\xe2\xd8\xf5\x95\x5b\x1b\xbb\xbe\x72\x69\xfd\xf8\x8a\x03\x72" - "\xcf\x84\xf7\x1b\xb9\x9d\xe1\xf4\x62\xb9\x98\x8f\x29\x27\xdc\x4c" - "\xdf\x5f\x97\x6e\xf9\x21\x1d\x47\x75\xd5\x8e\xf6\x15\xe2\x3f\x8b" - "\x70\xfc\xa6\x30\x62\xc2\x46\x1e\x5a\xf7\xc6\xf4\x5f\x9f\xd0\xd7" - "\x42\xf7\x9d\xf3\xbb\x22\x15\x17\xe0\x81\x77\x03\x4a\xc5\x12\x7c" - "\x57\x5e\x80\xe5\x3b\x02\x4a\x95\x99\xce\x93\xf0\x73\x24\x7c\xde" - "\xff\x81\x53\xa1\x75\x41\xfb\x87\x69\x8e\xb7\x5e\xcc\x1f\xfe\xf5" - "\x02\x3c\xb8\x52\xd4\xcb\xf2\x47\xc2\xf9\xf8\x80\x23\x7a\xbd\x3c" - "\xe0\xc5\x7a\xf9\x6b\xf4\x7a\x79\x30\x39\x76\xbd\x3c\x48\x67\xcf" - "\xfe\x3a\xbe\x1d\x3d\x98\x27\xb5\xa3\x03\x94\x47\x5f\x49\xf6\xea" - "\x83\xff\x17\xa5\xc1\x77\x6c\x23\x0f\xbe\x4d\xf1\xf3\x06\xe5\x76" - "\xc4\xf3\xd4\x22\x2c\x5e\xbe\x94\xc6\x28\xc1\x08\x85\xdb\xa1\x19" - "\x8c\xd6\x4e\x1e\xe4\x77\x22\x67\x1a\x20\x1e\x79\x58\x78\x94\x60" - "\x54\x01\x5c\x86\xe5\x53\x28\x1d\x85\x93\x2f\xf0\x90\xf4\x4e\x39" - "\x1d\xe9\x3a\x91\xf6\x41\x07\xdd\x5f\x4b\xe9\xc2\x61\x2f\x97\xe8" - "\x9f\xc8\xfb\x11\x4a\xcf\xef\xcb\x0d\x4f\x93\x23\xda\xe3\xf2\xda" - "\xf0\xf6\xb8\xbc\x20\x5c\x3e\x91\xff\x98\x2f\x80\x7a\x0e\xdf\x8f" - "\xf9\x2d\x8a\x25\xdf\x4e\xdb\x5c\xde\x13\xd1\x36\x51\x06\x56\x3c" - "\x2f\x64\x60\xc5\x9a\x08\x5c\x07\xa2\xcb\xc0\x72\x5f\x6c\x19\x58" - "\xa1\x8b\x2d\x03\x2b\xb2\x49\x06\x1c\xb0\xa2\x22\xbc\x6d\xae\x58" - "\x1d\x4e\x3b\x96\xcb\xdb\x26\x24\x7e\x93\xb6\x89\xb6\xd0\xcd\xb1" - "\xda\xa1\x64\xff\x2b\xe8\x3e\x9f\x6f\xc0\x33\x71\x3f\x05\xac\x04" - "\x5a\x9b\x41\x1d\x5f\x46\x3c\x6c\xe3\x63\xb4\x95\xc9\xa1\x7c\xac" - "\x17\x63\x2d\x13\xa6\x7d\x83\xf6\xb6\x09\x7e\x3e\xb4\x25\x9c\xfe" - "\x95\xd9\xd1\xf9\xb9\x72\x35\xf2\xd3\x14\x9d\x9f\x2b\xcb\x62\xf3" - "\x73\xe5\x41\x3a\xa3\x38\xbe\x4d\xad\xa4\x3b\xc9\xe2\xe5\xbe\xe9" - "\x32\xac\xbc\xf6\xf5\xfa\xa7\x95\x67\xc3\xfb\xa7\x95\xa7\xbe\x79" - "\xff\xf4\x90\x2e\x7a\xff\xf4\x50\x56\xf4\xfe\xe9\xa1\x3c\xd1\x1e" - "\x1e\x32\x87\xb7\x87\x87\x8a\xc3\x65\x02\x79\xf7\xad\xf5\x4f\x0f" - "\x9d\x89\x68\x03\x0d\x17\xe0\xe1\x47\xd0\xa6\x78\x51\xd4\x5b\xde" - "\x2d\x11\x38\x0e\x46\xaf\xb7\x87\xd5\x58\x6f\x0d\xd1\xeb\xed\x61" - "\x7d\xec\x7a\x7b\x78\x29\xd6\x5b\xc3\xf8\x7a\x7b\x78\xc3\x37\xb7" - "\x29\x1e\x3e\x14\x5e\x67\x0f\x1b\xbe\x79\x9d\x3d\xdc\x13\xbd\xce" - "\x1e\x1e\x88\x5e\x67\x0f\x4b\x67\xfe\xf3\xb2\xc3\xeb\x2c\x2f\x39" - "\xbc\xce\x90\x6f\xdf\x5a\x9d\xe5\x1d\x8c\xa8\xb3\xed\x17\x60\x15" - "\x8e\x9b\x95\x67\x44\x9d\xad\xfa\x7d\x38\x8e\x79\x1d\xd1\xeb\x2c" - "\xef\x24\xd6\xd9\xf6\xe8\x75\x96\x77\x36\x76\x9d\xe5\xb9\xb0\xce" - "\xb6\x8f\xaf\xb3\x55\xf1\xdf\xbc\xce\x56\x2d\x0d\xaf\xb3\x55\x69" - "\xdf\xbc\xce\x56\x99\xa3\xd7\xd9\xaa\x96\xe8\x75\xb6\xaa\x53\xd4" - "\xd9\x2a\x67\x78\x9d\xad\xea\x0e\xaf\x33\xe4\xdb\x7f\xb0\xce\xb0" - "\x7e\x4e\x8a\x7d\xad\x3f\x5c\x35\xc4\xe7\x95\x7f\x98\xeb\x80\x1f" - "\xc5\x8b\x79\xf9\x1f\x72\xd9\x91\xea\xf0\x43\x4c\x93\x3d\xbe\xef" - "\xfe\xe1\x66\x29\xec\xf1\xf1\xf5\xf0\x43\x23\xf6\xab\x83\x5d\xb5" - "\x7c\xbf\x94\xa8\x43\xe2\x39\xa6\x13\x73\x64\x3f\xe4\xf7\x1b\x61" - "\x1d\x33\xbb\xd7\x07\xd4\x17\x63\x7a\x37\xc1\xa1\xf3\xf4\x11\xb0" - "\xba\xbe\x89\x5d\x16\x7b\x2f\xf6\xbc\x93\xb6\xba\x85\x08\xef\x47" - "\xff\x2e\x64\xf5\x47\x91\xf6\x6f\x3b\xc6\x7d\x20\xe4\x74\x4d\xc4" - "\x9c\xc9\x8f\x62\xd8\xbf\x3f\x22\xfb\xb7\x3d\xba\x9c\xfe\xe8\x06" - "\xf6\xef\x8f\xc8\xfe\x6d\x0f\x19\xaf\x26\x3d\xe5\x73\x44\x8c\x57" - "\x7f\x74\x4a\xe3\x16\xb2\xc3\xed\xd8\xc6\x79\x27\x11\xe7\x81\x08" - "\x9c\xb1\x6e\x56\x6f\x91\x70\xde\x18\x91\xdf\x17\x1d\xe7\xd5\xc9" - "\x88\xf3\x87\xd1\x71\x5e\x9d\x15\x1b\xe7\xd5\xab\x11\xe7\x0f\xc7" - "\xb7\xad\xd5\x25\x92\x1c\x44\x19\x97\xaf\x36\x47\xaf\xff\xd5\x11" - "\xf5\x0f\x85\x35\xb5\xcc\xc5\xf3\x87\xa7\xb3\x85\xa6\xa3\x3d\xed" - "\x94\x96\x64\x24\x4a\xda\xc1\x48\x98\xd1\xd3\xad\x49\x1e\x27\x7b" - "\xb4\x07\x3f\xaa\xec\xad\xc9\x15\xed\x71\x4d\x4b\x78\x7b\x5c\x53" - "\x18\xde\x1e\x7f\xe4\x8b\xc8\x67\x8c\x88\xcf\xfb\xf6\x74\xec\x1a" - "\x67\x84\x0c\x7c\x7c\x01\xd6\x96\x0a\x19\x58\xfb\xeb\x70\x3c\xd6" - "\x42\x74\x19\x58\xab\x43\xfa\x3f\x8e\x2e\x03\x6b\xb3\x63\xcb\xc0" - "\xda\x02\xe4\xe5\xc7\xa1\x72\xbb\xbe\x36\x77\x62\x44\x9a\x9a\xe8" - "\x3a\x6f\xed\xe1\xe8\xf3\x3a\x6b\x8f\x09\x1e\xaf\x3d\x17\xce\xe3" - "\xb5\xa7\xc2\x79\xb8\x16\xbe\x05\x1e\x8e\xf9\xa3\xf1\x58\xf2\x23" - "\xdb\xbf\xfd\x02\xe4\x4b\xed\xbf\xe0\xdd\x70\x1c\xf3\xa5\xf1\x4f" - "\xb4\xb9\xac\xfc\x12\xe4\xa5\x3d\x3a\x2f\xf3\xcd\xd1\x69\xce\x6f" - "\xc1\x3e\xc8\x1e\x18\xd7\x96\xf2\x3b\x31\x7c\x3d\xbf\x63\xec\x3a" - "\x68\xdb\x30\x7c\xbd\x0f\xe2\x79\x7f\x35\xd6\x2f\xe5\x9f\xa5\x39" - "\x72\x3e\xc7\x8c\xf2\xab\x49\x81\x02\xea\x83\x08\xaf\xa2\xda\xc8" - "\x75\x49\xee\xca\x80\x9f\x39\xa5\xf3\x27\x1a\x23\x14\xd8\xdd\x3e" - "\x90\xe5\x9d\xd2\x87\xc3\x2e\xc8\xa2\x76\x41\xe9\xe5\xb4\x62\xae" - "\xd3\x1c\xa1\x9b\x0a\x0a\xa3\xd7\x71\x81\x21\xb6\xec\x14\x1c\x16" - "\xf5\x5c\x60\x0b\xaf\xe7\x82\x63\x01\xcb\xd4\x0d\x44\xab\x03\xf9" - "\xfc\x4d\xea\x98\xd6\x2f\x63\xea\xfb\x03\x9b\xfa\x0d\x75\x30\xe3" - "\x22\x3c\x92\xce\xcb\x53\x32\x1c\x13\x2b\xa0\x8b\xeb\x80\x47\xf6" - "\x71\x3c\x31\x4d\x91\x0f\x94\xec\xc0\xb6\x7e\x8a\x6b\xb7\x30\x2f" - "\xbf\x43\xcd\xc2\xce\x90\x3f\x0a\x94\x85\x9b\xcf\xc3\x23\x0f\x84" - "\xe5\x57\x03\xd8\x05\x8c\x5a\x31\xbf\xff\x88\x51\x9e\x87\x8f\x35" - "\xbf\x8f\x69\x5a\xe5\xfd\xb4\x62\x2d\xec\x11\x6b\xcc\x7e\x19\x71" - "\xa2\x73\x98\x84\xd3\x8d\xf5\xc0\x23\x2e\x59\x7e\xc5\x19\x9d\x75" - "\x10\x3c\x03\xb2\x2e\x01\xe3\x4e\xdc\x60\x3e\x37\xa4\x1d\xac\xcb" - "\x09\x85\x23\x7c\x32\xad\x5b\x2d\x9f\xe3\xc0\xf7\xc2\xaf\x80\x25" - "\xe1\xb3\xce\x1c\x81\x8f\x15\x6d\xcb\x13\x12\x8c\xd6\xaf\x80\x91" - "\x6c\x3f\xb6\x04\x32\x03\xa0\xba\x08\x1b\xbe\x68\xa6\x7d\x32\xad" - "\x4e\x48\xf0\x81\x5a\x8c\xed\xd6\x7d\xd9\xab\xa3\x39\x1c\x3a\x9f" - "\x7b\xbf\x8d\xd6\xe0\xf8\x3a\xbe\xee\x7e\x5b\xaf\xd1\x2f\xf9\xde" - "\x59\xcf\x65\xa2\xb7\xec\x8a\xad\xf5\x08\x73\x1e\xe5\x67\xd5\xd6" - "\x87\x8d\xff\x0e\xd3\x1e\x1c\xda\x0b\x51\x07\xf7\x63\xfa\x37\x44" - "\x5b\xdf\x10\x61\x93\xae\x8f\x31\xfe\x5b\x4f\xe3\xbf\xfb\xa3\xb7" - "\xf3\xf5\x37\x18\xff\xad\xa7\xf1\xdf\xfd\xa1\xfd\xa6\x58\xe7\x59" - "\xdf\x1a\x6a\x93\x92\x5f\x14\xfd\x33\x64\x67\x6e\x48\xbc\xab\x19" - "\xb4\x3e\x5a\x57\xc6\xb6\x69\x77\x76\x51\x7b\xd5\xf6\xba\x4e\xd2" - "\x99\xe6\x78\xba\xfb\x55\xf4\x65\xd4\x5e\xd7\x3b\x78\x5f\xe6\x13" - "\x6d\xd1\x64\x64\xae\x8c\x01\x94\xa1\xed\x65\x12\xac\xf5\x3d\xfb" - "\xca\x18\xdf\x0b\x31\x75\x00\x26\xda\x9d\xbc\x5f\x54\x90\xbd\xca" - "\xed\x56\xdf\x35\x20\xb8\xa7\x6b\x7b\x81\xe0\x06\xc6\xfa\x49\x82" - "\xbd\x61\x29\xb5\x71\x82\x49\xb0\xfb\x30\x1d\xc1\xa5\x74\x32\x1d" - "\xe2\x1c\xc9\x86\x92\x50\xda\xf9\xfc\x0b\x96\x8d\xe1\x6f\xd3\xbc" - "\x8a\x9d\xf2\x99\x36\xb1\xcc\x01\x5a\x33\xbb\x62\x63\xa6\x6d\x2c" - "\xb3\x8a\xe6\xc4\x36\x7c\x49\xf9\x3e\xfc\x1f\x8e\xb8\x9a\x59\x10" - "\x2f\x85\xbd\xdf\xa5\xf7\xa2\x1c\x6f\x70\x85\xeb\x88\x0d\x11\xf6" - "\xef\x7a\x3e\xce\x74\xc0\x3a\xf2\x0d\x00\xd2\xbe\x50\xd2\x07\xcc" - "\xee\xf3\x70\xf9\xb8\xd1\xbe\x06\x5a\x93\xa6\x7d\x49\xc2\xef\xcf" - "\xa3\x39\x11\x73\x6f\xae\x7a\xbe\xb7\xe5\x2f\x58\xee\xa3\xbf\x13" - "\x32\xf2\xd8\xef\xc2\xeb\xf4\xd1\x42\xd3\x25\x5a\x0b\x12\xfd\xc1" - "\x53\xbe\x48\xfd\xf8\xa8\x51\xb6\xdd\x22\xc2\xad\x72\x7f\xa0\xaf" - "\xe4\x70\x23\xfa\x99\x47\xb9\xfd\xef\x1f\xd7\x2f\x3c\xda\x8d\xf4" - "\x85\xc9\x64\x1f\x97\xa1\x47\x1d\xbd\x6e\x94\x9b\x2a\x92\xff\xc7" - "\x36\x62\x9a\xfd\x74\x36\x0f\xbf\x27\x5e\x86\xc7\xb4\x7e\x0b\xc4" - "\xf7\xba\xf8\xd9\x23\x2d\xca\x08\x97\x5b\xea\x37\xe6\x8b\x3d\x41" - "\xee\xf0\x32\x1e\xcb\x90\x79\x4e\x69\xfa\xaa\xfe\x02\x62\x4f\x03" - "\xc9\xc2\x63\x40\xfb\x23\xa6\x0e\xc2\x44\x82\x25\xcb\x90\xdd\xd7" - "\x0f\x7d\xbe\xc8\x31\xcf\x63\x35\xd1\x69\x7f\x8c\xfa\xff\x26\x07" - "\x3c\x36\x10\x5e\xb7\x8f\xf1\xfe\x5f\x5e\xd7\x71\x20\x0f\x22\xf2" - "\x75\x85\xd7\xfd\xa3\x85\x14\x1f\x73\x9f\x8d\x75\xde\x29\x1c\xcf" - "\x14\xb9\xf9\x9e\xab\xc7\xb1\xfd\x3f\x9a\x7c\x23\x3d\xc8\xb4\xf3" - "\x4e\x05\x30\xad\xb4\xdf\x16\xf5\xd6\xe3\x79\x61\x73\x46\xb7\xf2" - "\x39\xa3\xa2\x0b\xf0\xb8\xb4\xf6\x53\xf8\x4a\x38\x7e\x8f\x97\xc4" - "\xb6\x0d\x1e\xa7\xf5\x9f\xa2\xe8\x3a\xe3\xf1\xd6\xe8\xb6\xc1\xe3" - "\x27\x24\xbd\x50\xc4\x12\x23\xe5\xe0\xf1\x33\x58\xc7\x3c\x8f\x3c" - "\x86\xa5\xb9\xd0\xd8\x63\xd8\x42\x18\x1b\xc3\x56\x91\x3e\x78\xdc" - "\x39\x36\x86\x75\x45\x1b\xc3\x3a\xa2\xd4\x67\xe1\x8a\xe8\xf5\x59" - "\xb8\x39\xfa\x18\xb6\xb0\x46\xf4\xf3\x85\xc7\xc3\xeb\xb9\xf0\x70" - "\x70\x4d\xf8\xf1\x92\x6f\xcf\x1e\x2e\xf4\x8e\xb7\x87\x37\xee\x14" - "\x75\xb5\xf1\x1f\xc3\x71\xdb\xa8\x8d\xae\xdb\x37\xa6\xc7\xb6\x87" - "\x37\xae\x88\xad\xdb\x37\x16\x8f\xb7\x87\xf5\x13\x22\xd2\x1c\x1c" - "\xb3\x95\xc2\x6c\xb3\x8d\xad\x82\x4f\x1b\xc9\x9e\x53\x85\xa4\x3f" - "\x11\x2e\xef\x1b\xa9\xbd\x69\x50\xb7\x5d\x24\x9d\x26\xcb\x4c\x2c" - "\x9e\x90\x0f\x93\x39\xcd\x30\x09\xdb\xc0\xc7\x1e\xcb\x13\x63\xf2" - "\x4f\x7b\xe9\xa8\x1c\xd2\x91\x31\xf7\xb4\x29\x65\xfc\x08\x8f\x27" - "\x96\xde\x68\xbd\x54\xa5\x83\x82\x57\xc7\xf1\xe3\x09\x6e\xff\x11" - "\x8c\x1b\xd7\xd9\x13\xef\x47\xb4\x31\xb7\xd8\x0b\xbb\x69\x8f\xa8" - "\xb7\x4d\x11\x63\xd9\x27\xba\xf9\xb9\xb8\x98\xfa\xf6\x09\x67\x74" - "\x19\xdd\x34\xc6\x2f\x94\x7f\x82\x7b\x6f\x44\xbc\x5e\xd4\xc1\x26" - "\x63\x20\x31\x74\xae\x7b\x53\x4e\xb8\x4e\xda\xa4\x8f\xc8\x17\x31" - "\xfe\x7b\xa2\x9b\xe2\xbf\x5e\x7f\xb3\xe9\x78\xec\xfe\x66\xf3\x62" - "\x41\xff\x93\x11\xeb\xcb\x9b\xba\x6f\xdc\xdf\x6c\x8a\x41\xff\x66" - "\x08\xef\x6f\x36\x47\xac\xd1\x6f\xd6\x47\xef\x6f\x36\xe7\xc8\x7a" - "\x46\xe8\x8d\xcd\x8d\x5f\x4f\xdf\x6c\x36\x84\xeb\x9b\xcd\x85\x5f" - "\xa5\x6f\x4e\x8f\xd3\x37\x9b\x4f\x68\x5a\xa3\xd2\xd2\x13\x5d\xdf" - "\x6c\x1e\x10\x75\xf8\xe4\xd2\x70\x7d\xb3\xd9\x17\x5e\x87\x9b\x23" - "\xea\xf0\xc9\x88\xf5\xef\x4d\xdd\xff\xab\x3a\x49\xa5\x52\x29\x55" - "\x0a\xa5\x42\x05\x74\xd1\x89\x02\x26\xaa\xd4\xaa\x38\x7c\x26\x48" - "\xbf\x13\x95\x2a\xa5\x1a\x9f\x38\xe9\x77\x42\xc4\xf7\x44\xca\x8b" - "\x8f\x5a\xfa\x8d\x8b\xf8\x9e\xf0\x15\xf1\x13\xa5\x72\xe5\xf2\xd5" - "\x11\xdf\x71\x5f\x11\x3f\xe1\x3f\x98\x1f\xc6\x7d\x87\x9f\x2f\x5c" - "\x55\xb9\x6b\x4b\x45\x79\x09\xdf\x5b\x5e\xaa\xdf\xb2\x75\x6b\x69" - "\x75\xb5\xbe\x66\xbb\xfe\xc1\x07\xd6\x2d\x5c\xa2\x17\x5b\xd4\x2b" - "\x96\xcd\x2d\x99\x0c\x6b\x76\x57\x51\xc4\x9a\xf5\xab\x0a\xf5\x05" - "\x0f\x3e\x10\x1e\x29\x83\xe1\x5b\xd1\x6f\x04\x25\xf4\x6e\xec\x97" - "\x6e\x05\x38\x7c\x2b\xd7\x3b\x03\xbd\x1d\x00\x62\x3c\xb1\xf5\xa5" - "\x1e\xb4\x3a\xd8\x88\x89\xd1\x79\x85\xf3\x50\xb4\x8c\x88\x98\xd7" - "\x61\x06\xc3\x33\xe4\x5f\xa4\x68\x23\xfb\x8d\x0b\xf4\x3f\x04\xe5" - "\x79\x28\x7b\xa3\x0b\x47\xff\xf4\x6d\x1f\xf0\x81\xde\x44\xb6\xed" - "\xd6\x7b\x31\x4e\xc1\xee\x0b\x60\x98\x5b\x3a\xc7\xfe\xf4\x2a\x1e" - "\xf6\x1b\xb3\x9c\x4e\x73\x01\x8a\xfc\xec\x37\x8c\x7f\xb3\xfb\xac" - "\x52\xba\xa2\x3f\x05\x2c\x4f\x59\x49\x2f\xb4\x8a\xfb\xb3\xe1\x8d" - "\x24\x88\x7f\xe3\x56\xf2\xb5\x58\xd4\x25\xef\x8d\x7e\x09\xbf\x1d" - "\x50\xd6\x42\x65\x53\xda\x80\xf2\xa9\x7f\xe1\xe9\x93\xc2\xd2\xbb" - "\x83\x7b\xa9\x8b\xba\xe8\xae\xf9\xfc\xbf\x61\x97\x9f\x34\xc7\x65" - "\xaf\x35\x83\xc6\xcf\xbe\xcc\xcc\x03\x45\xdf\x41\x80\x3d\x3e\xe6" - "\xb3\x55\x5d\xc4\xf2\x8b\x1f\xd0\xec\x61\x5f\xda\xd1\x6e\x5c\x33" - "\x68\x62\xf5\x97\x40\x8d\x6d\x5a\x61\xab\xa2\x33\x0d\xc5\xe9\x6d" - "\xd7\x41\x8d\x3c\x48\xb9\x08\x5b\x0a\x6b\xd7\x30\xbf\x69\x0d\xa8" - "\xff\x60\xa4\xb3\xa4\xf3\x27\xd7\xff\x1b\xa8\x7f\x39\x62\x56\x8e" - "\x30\x1d\xd4\xd6\x30\x27\x23\x1f\xac\x6e\xe6\xa5\x7d\xaf\x3d\xc5" - "\x7e\x4c\x93\x39\xe2\x31\xe9\xa0\xaf\xc6\x0d\xfb\xce\x31\xef\xa1" - "\x7f\x13\xbe\x1d\x7a\x07\xdd\x74\x36\x35\x7e\xdf\x1a\x50\x5d\x28" - "\x04\x65\x6f\x59\x0b\xd8\x37\xbb\xa1\xf6\x1c\x73\xf6\x14\xff\x0d" - "\xfa\xca\x3a\xa1\xa8\x1f\x94\x3d\x03\x9f\x02\xf7\x23\xda\x74\xc4" - "\x51\x77\x0d\x74\xfb\xca\x29\xec\x1a\xec\xdd\x07\x53\xf6\xfe\x99" - "\xc6\x42\xfd\x58\xce\x25\x78\xe2\x2c\x28\x10\x9e\xf2\x85\x4f\x41" - "\xf7\xc2\x46\x3a\xab\x9d\x0b\xad\x75\xa0\x63\xa6\xf4\x84\x11\x53" - "\xba\x76\x84\xa5\x27\x79\x4c\xe9\xc9\x7d\x06\x4c\x3f\xf0\x6b\x98" - "\xda\x0f\xc9\xbf\xb9\xd8\xaf\x6c\xb9\x0a\x29\xfa\xb5\x54\xff\x5b" - "\x36\xb4\x5e\xc5\xf4\x4d\x15\xc5\x01\xcc\x1b\x9a\xc7\x97\x58\x61" - "\xb4\x17\x7a\x21\x80\xb0\x5a\x46\x20\xa5\x75\x04\x74\x81\xc6\x8a" - "\x62\xe2\xc5\x68\xd3\x5d\x2e\xd4\x83\x13\x3f\x7c\xfa\xa4\xda\xde" - "\x33\x08\xbd\xee\x11\xe8\x83\xbf\x80\xdd\xf8\xb9\xed\x97\x4f\x9f" - "\x8c\x43\x3b\x52\x61\xdb\x4b\xfb\xcf\x85\xcc\x98\x7a\xc9\x07\x95" - "\x19\x1a\xea\x20\xc1\xb0\x17\x26\x5e\xc4\x70\xae\x73\xac\x33\x90" - "\x67\x9f\xdb\xf6\xf2\xf3\xd5\x65\x2d\x75\xbd\xa0\xea\x73\xb7\xd0" - "\x39\x5e\xa5\x3f\xe9\x88\xc3\xee\x3e\x03\x76\xc3\x5f\x6d\x01\xed" - "\x91\xee\xc3\x01\x88\xff\x60\xf8\x8c\xd2\xae\x1e\x06\x7b\xa1\x1b" - "\x3e\xc6\xb2\x59\xd3\x11\x5a\xb3\xc9\xed\x73\x7b\xc9\x0f\x4d\x16" - "\x1b\xd2\x4d\x6e\xa8\x82\x8c\xb6\xab\x90\x76\xf4\x2a\xa4\x33\x4f" - "\xba\x92\xce\x4c\x3f\x79\x49\x0b\x47\xf1\x37\x01\xc7\x5e\x48\x2f" - "\x3f\x3b\xcd\x12\xa5\xb3\xd3\xa3\xe9\xd0\x3e\x12\x3c\x3b\x3d\x32" - "\x14\x3c\x3b\x8d\xb2\xd4\x4d\xe7\xa7\xb1\x5d\x98\x49\x9e\x1b\x2e" - "\x83\xfa\xc0\x65\x80\x4c\xb3\x12\xf4\x4f\x93\x4f\x8c\xad\xf3\xec" - "\x25\x97\xf8\xfb\x79\x78\x7a\x00\x7f\x13\xf0\xc1\xf1\xdb\xd3\xfc" - "\xbc\xef\x80\x24\xb7\x18\xa6\xc4\xb0\x5e\xfc\x55\xe1\xef\xef\x4c" - "\xad\xcc\x85\x65\x74\xa1\x6d\x32\x99\xe4\x57\x3a\xa7\xdd\xe5\xb1" - "\x3c\x7d\xca\x01\x2f\x1f\x96\xe5\x58\xe8\xf3\xa2\xee\x8f\x2f\x5c" - "\x22\xbf\xbe\x2e\x8e\xcf\x68\x99\x82\x7c\xfc\x4a\xe1\x84\xc3\x5c" - "\x2a\xf7\x3c\x6c\x8d\xc7\x5f\x0d\x3e\xd8\x2e\x9f\x6e\x95\xf3\x0e" - "\x8d\x96\x61\x99\x5b\x53\x31\x9c\xc9\xe1\x48\xaf\x9a\xe2\xfe\xe1" - "\xc2\x25\xa5\x48\x93\xae\x44\x98\x5e\x09\x3e\xb6\xf5\xa2\x0a\x6a" - "\xd3\x43\x4a\x0d\x3b\x5d\x92\x0d\xad\xb7\xb2\x33\x47\x8f\xb0\x2e" - "\xd1\xd6\xb6\x16\x3b\xe0\x30\xf7\xa9\x80\x7d\x76\xd7\x61\x8c\x3b" - "\x8d\xbd\x27\xf1\xa5\xab\x98\xf6\x93\x6e\x35\x3b\x60\xf2\xb9\x50" - "\x1a\x98\xe5\x49\x03\xf5\x9b\xbf\xaa\xb3\xc5\x31\xe5\x53\x86\x3e" - "\xc7\x20\xfc\x72\xc4\x19\x67\xfa\x3d\x28\xed\xbe\xf3\x30\x3f\x19" - "\x74\x34\x07\xd3\x7e\x84\x39\xf0\xd7\x89\xcf\x20\xca\x49\xea\x45" - "\xd8\xda\x7b\x57\x32\x24\xff\xd1\x08\x92\x3e\xda\xfa\xb7\x10\x7d" - "\xf4\x7c\xef\xc0\xc9\x10\x5d\x54\x96\x3a\x5e\x17\x3d\xfb\x3d\xa1" - "\x8b\x98\x4f\xe8\x1e\xbf\x43\x0a\x8f\x8b\x08\x97\xce\x8c\x3c\xf3" - "\x45\x44\xb8\x57\x0a\xff\x73\x44\xb8\x4b\x0a\xbf\x45\xd6\x75\x7d" - "\x84\xc7\x6e\xd2\x75\xa5\xd7\x49\xd7\xf5\x95\x48\xba\x8e\x9f\x71" - "\x2c\xfd\x94\xfd\xd4\x2c\xee\x75\x87\xd2\x7f\x24\xfc\xd9\x6f\x40" - "\xc6\x7d\x12\x86\xed\xa4\x30\xeb\x5f\x40\x8d\x0f\xd7\x73\xcc\xf2" - "\xd4\x7f\x27\x3d\x47\x3a\x8e\xce\xa2\xbc\x75\x2b\xeb\x7f\xeb\x08" - "\x3b\xdb\x7a\x84\xf5\x78\x2c\x25\x03\xb2\xbe\x7b\x19\xc3\x0e\x63" - "\xd8\xcb\x18\x4f\x7a\x8f\x78\xd2\x5b\x78\x92\xfc\x38\x0e\xa0\x8c" - "\xc5\x6b\x14\x60\xa8\x47\x99\x27\xff\x4f\x07\x91\xbf\x76\xd4\x49" - "\xb4\x27\x97\xfb\xc3\x55\x66\xa1\x8e\x1a\xa0\xf6\x76\xeb\x81\x00" - "\xcd\x4b\xfc\x0d\xea\xdc\xec\x22\x9d\x0f\x21\x1c\x8a\xf6\xfc\x90" - "\xfc\xbc\x2a\xba\xca\x00\xe8\x7c\x3f\x9d\x5f\x41\xbd\xab\xb6\x22" - "\x4e\xa7\x2b\xa8\xae\x4b\x2b\x1c\xf0\x4f\x15\xa2\xae\xcb\xb8\xff" - "\xe8\xf3\x50\xd2\xc9\x2c\xa8\x0b\x91\x36\x8d\xdf\x0c\xe4\xb3\x04" - "\xdb\x28\xcd\xb3\x96\xbd\x85\x8f\x55\xf6\x5b\x42\x3e\xc0\x31\x8d" - "\xbd\xdf\x0b\x84\xb3\x03\x4a\x7c\xbd\xb5\x27\x29\x7f\x07\xf1\x86" - "\x59\x4c\x32\x0c\x05\xf7\x7b\x82\x63\x78\xf2\x7b\xe2\x80\x52\x71" - "\xa6\x2e\xe9\x2e\x57\xef\x66\x17\x90\x9e\xb7\x3b\x11\x46\xed\x79" - "\x01\x03\x61\x31\xd4\xfb\x61\x71\x12\xfc\x29\xfb\xd8\x97\x08\xbf" - "\x82\xea\x8b\xfc\x54\xd1\xbe\x24\xe4\x4b\x02\xf9\x3c\x10\x76\x67" - "\xc9\xb5\xf6\xbf\x00\x48\xbe\xb6\x50\xde\x4a\xdc\xe4\xcb\x8a\xfc" - "\x6b\x71\xdf\x5a\xca\x6c\x60\xbb\xd3\x13\xc6\xfc\x6b\xfd\x27\xf8" - "\xd6\x42\xfe\xeb\xda\x94\xac\x13\xf1\x77\x93\x7f\x2d\xc4\x7f\x03" - "\xc9\xa1\x44\x93\xf7\xb5\x27\x38\xcf\x97\x52\x58\x83\x85\x75\xcb" - "\xf5\x4f\xf4\x12\x2d\x18\xa7\x17\xf6\x20\x3b\xe3\x80\x67\xbc\x14" - "\x8f\x61\x09\x94\x7e\x3e\xea\x31\x7b\x89\x1f\x3e\xbc\xe0\x57\x36" - "\xec\x05\xb5\xd0\x69\x65\x89\x94\x5f\xe8\xb4\x67\xbb\x83\x3a\xed" - "\xd9\x5f\x0b\x9d\x26\x78\x2c\x74\xda\xb3\x1f\x09\x9d\xf6\xec\x7b" - "\x7c\xff\x10\xea\x34\x8a\x23\xbd\x26\xeb\xb4\xa3\xb7\xb2\x6e\xd2" - "\x1d\x1e\xcb\xb3\x2d\xb2\x6e\x7b\x05\xc3\x48\x77\x10\x8e\x42\x4f" - "\x95\xba\xd8\xff\x9d\x0e\x62\x7f\x26\xbd\x97\x91\x1f\x0a\xa7\xf4" - "\x4e\xfd\xc8\x24\xa1\xe3\x9e\x1d\x0c\xea\xb8\x67\x0d\xc1\xbc\xa4" - "\xe3\xca\x14\x42\xc7\x89\xf0\xf6\x27\x48\xc7\x95\xba\x88\x07\x12" - "\x7c\x25\xad\x9b\x49\xe9\x91\x8f\x5b\xbd\xa1\x3a\x2e\xbc\x7d\x95" - "\xad\x90\x75\x1c\xe9\x36\xfc\xde\x80\x3a\x8d\xfb\xa3\xa7\x76\xd6" - "\x8c\x3c\x97\xdb\x1d\xd5\x01\xd1\x4c\x7e\xa2\x89\x6f\xcb\x2f\xc1" - "\x44\xc9\xa7\x8b\x44\x77\x99\x55\x3e\x17\xe9\x80\x67\x5b\x22\x6d" - "\x66\x5a\x98\x08\x39\xbb\x35\xd3\x4f\x73\xbb\xe6\xf3\x60\x6f\x61" - "\xe6\x3e\xdf\x39\x08\x1c\xd8\xf6\x19\xd5\x2b\x8e\x2f\x26\xd0\x2f" - "\xe9\x1d\xec\x3f\xff\x54\xe4\xe6\xf3\xf5\x9f\x35\x28\x31\xce\x08" - "\x3f\x08\x89\xbb\x44\x65\x84\xe4\x9b\x17\x8c\x2b\x9f\x44\x71\x34" - "\xc7\x88\xe9\x4e\xc6\x9a\x53\xf8\xfa\x78\x94\x6f\x8c\x8d\x47\xf9" - "\xce\x1b\xe0\xd1\xc8\xf1\x40\x7b\x0b\xc7\x47\x89\x97\xa1\x3c\x97" - "\xbe\xb9\x6f\xd1\xe8\xe5\x7c\x22\xc5\xab\x42\xe2\x43\xcb\xfa\x2c" - "\x4a\xfe\x90\xf2\x9e\x53\xdc\x18\xfe\x73\xb3\x6e\x0c\xff\xb9\x07" - "\xbe\x02\xfe\x16\xd2\x7d\x74\xf6\xce\x6f\x09\x4f\x97\xe9\xe3\x6d" - "\xaf\x9b\x7c\x2c\x61\xba\x97\xa4\xf5\x96\xcf\x4c\xb3\xf8\xf8\x8f" - "\xfb\xdb\xa9\xc7\x78\xee\xaf\x13\xf5\xf2\x8a\x3d\x00\x62\x4f\xdf" - "\x58\x9e\x5f\x47\xe2\x36\xd5\x27\xe3\xc6\xe3\x3f\x8d\xc4\x0d\xe3" - "\xe7\x85\xc4\xfb\x83\x75\xfe\x9c\xf1\x06\xf3\x48\x09\x76\x94\x4e" - "\xba\x63\xe1\x34\x0e\x5b\xe8\xac\x4f\xf3\xd8\xda\xc8\x36\x94\xff" - "\x32\xbe\xb6\x23\x9d\xed\x25\xbb\x6b\x66\x9f\x9b\x7c\x92\xb9\xe5" - "\xb3\x20\xb7\x61\x3f\x92\x44\xfe\x57\x68\x3e\xbd\xc8\x5f\xa0\x14" - "\xbe\x92\xb7\x59\xe5\xbc\xb1\xe6\x1e\xa9\x5c\xa9\x4c\x7e\x4e\x0a" - "\xf3\x74\xc9\x79\x08\x36\x9d\x0d\x42\xfd\x3f\x93\xfb\x29\xf3\x0d" - "\x92\xbe\xbd\x0d\xed\xe3\x24\x51\x4e\x31\x48\xe5\x60\xdb\x2e\xcf" - "\xba\x41\x39\x37\xa0\xaf\x22\xfb\x9b\xd3\x07\x12\x7d\x15\x86\xaf" - "\xa0\xef\x46\xe5\xbe\xff\xcd\xcb\xd5\xca\xe5\x3a\xbf\x39\x5f\x9f" - "\x4f\xf9\xfa\x7c\xcd\x92\xf8\xfa\x7c\xc1\x57\xf0\x35\x5a\x39\x07" - "\xbf\x7e\x39\x7a\xb9\x9c\x93\xd1\xca\x01\xfe\x17\xd3\x4f\x4f\xbc" - "\x7c\x77\x01\xdd\x1b\x22\x7c\x95\x57\x42\xe8\xdd\x2a\xe2\x3e\x91" - "\xca\x64\xf9\x6e\x95\xe0\x39\xb3\xca\x05\x45\x1d\x64\x87\xb0\x80" - "\x03\x2a\xb3\x69\x2e\x70\xc5\xbe\xd0\x3b\x48\x2a\xf3\xbe\xe2\x4e" - "\x17\xf2\x8d\xc3\xfd\x5e\x30\xc6\x7d\xb0\xb8\x85\xbf\xbc\xca\x97" - "\xc8\x4f\x83\xd8\x53\x54\x79\x52\xb4\xcd\xca\x66\x07\x3c\xcf\xfd" - "\x2c\x92\x0f\xe6\x21\x93\x94\x7e\x1a\xf5\xa1\x63\x69\x4e\xca\x69" - "\xa2\xce\x49\x36\x6d\x2b\x38\x56\x97\x15\x76\xc6\x70\x65\x55\xd5" - "\xf6\xaa\x25\xfa\xea\xe7\x9f\x9e\x57\x5d\xb3\xa5\x66\x67\x35\x3f" - "\x8c\x3e\x19\x30\x40\x5f\x53\xfe\x7c\xe9\xf6\x9d\x35\xe9\xbb\xb7" - "\x94\x8b\xc3\xeb\x77\x60\xc2\xd0\x44\x10\xe6\xdb\x5f\x87\x3a\xe8" - "\x0c\x53\x72\xdf\x11\x83\xdc\x07\x26\xf9\x7f\x97\xce\xe6\x76\xe9" - "\x00\xdc\x38\x3e\xf2\x58\xb6\x6f\x76\xc0\xba\xe3\x32\x1f\xc9\x4f" - "\x21\xda\x49\xba\x8b\xb0\x7d\x0f\xd5\x7d\x3e\x9a\xbc\xed\xc2\x1f" - "\x04\x3f\xff\x6f\xaf\xc1\x80\x3e\x88\xb7\xed\xa2\x79\xde\xed\x28" - "\x03\x95\x0e\xee\x77\x71\x2f\x8d\xbf\x0d\xb7\xc8\x76\x09\xad\x5b" - "\x89\x75\xe6\x99\xf7\x9f\x87\xed\x2b\xa9\x5c\x6a\x37\x6d\x68\xff" - "\x12\x2c\x66\xa9\xf4\x92\x0d\x8c\xdf\xf1\x88\x83\x43\xb6\x7d\x11" - "\xdf\x04\x96\xb8\x2d\xd7\x01\x86\xe4\xdf\x6a\x5d\x20\x9d\xe7\x8e" - "\x6f\x13\x67\xb7\xd5\x1e\x8b\x21\x61\x2c\xad\x05\xd3\x36\x6e\xcb" - "\xa5\xfb\x7a\xa2\xf2\x37\x29\xa7\x33\x30\x5a\x18\x17\x4a\x33\x8e" - "\xd9\xb1\x7e\x0c\xbf\x43\xda\x93\xa9\xae\x25\x3f\x22\x13\x30\xec" - "\x03\xba\xff\x80\x35\xe5\x74\x62\xd8\x04\xfc\xed\xa6\x3a\x25\x3f" - "\x07\x18\x47\x7b\x7d\x14\x7d\xb5\x57\x6c\xa7\x75\xe7\x51\xae\x0d" - "\xa8\xff\x0a\xcf\x89\x73\x71\x98\x1e\xcb\xb0\x9b\x47\xa0\x4b\xcf" - "\x6c\x34\x07\x88\xb8\x9f\xeb\xd2\xbb\x81\xa9\x36\x7d\x46\xf9\xb0" - "\x5d\xe8\x4c\x46\xb2\x7d\x30\x9c\x9f\xff\x33\x9c\x91\x79\x5e\xa3" - "\x67\x97\x28\x4d\xac\x79\x6b\xea\x83\x1b\x78\x5f\x72\x15\x68\x8f" - "\xd7\x00\x18\xdc\x91\xfa\x7e\x6e\xc9\x12\x7d\xc9\x96\x1a\x7d\x45" - "\x79\x65\xa9\xbe\xa4\xbc\x44\x5f\xb9\xbd\x46\xff\xec\x76\x9a\x40" - "\xa2\x29\xa3\x30\x99\x08\x10\x7d\xbb\x0b\xe3\xe4\x35\xf2\xa1\xdd" - "\x65\x13\x90\x7e\xe4\x49\xd5\x9a\x21\x4f\xd9\xc4\x70\x9e\x54\x2d" - "\x10\x72\xbc\x03\xc7\x7f\x86\x34\x71\xbe\x50\xe5\xc4\x6f\xa4\xdf" - "\xe0\x0c\x6f\x7b\x55\xfb\xa4\xb4\xef\xcb\x69\xb9\x5c\xcc\xbe\x38" - "\x16\xd7\x20\xc9\x63\xbb\x38\x8b\xcc\xfd\xd5\xb4\xf3\x33\x02\x3b" - "\x1c\x31\xf3\x90\x8f\xae\xbd\xb0\xf5\x32\xec\xf8\x3d\xb3\xec\x48" - "\x96\x64\x28\x3e\x60\xcd\xb1\x49\xf2\x83\x32\x51\xa5\x1f\x2f\x3f" - "\x55\xb5\x24\x3f\xcc\x53\x18\xcf\xf7\x93\xf8\xbc\xa8\xa7\xf0\x1b" - "\xfb\x53\x07\xec\x38\x48\x74\xb8\x77\x17\xc6\x9b\xde\xe0\xfd\xf5" - "\x17\xb4\x36\x7b\xda\xcb\x7d\x2c\x4d\x42\xd9\xc0\x3a\xaa\xaa\x91" - "\xeb\x48\x4e\x1f\xbd\x0d\x73\x79\x09\x97\x31\xc1\xcf\x5e\x2e\x63" - "\x68\x17\x20\x4e\x4a\xd9\x2e\xa0\x3e\x00\x71\x1b\xa8\xd9\xc7\x18" - "\x96\xd1\x1f\x22\x07\x97\xa3\xc9\x01\xd6\xed\xd6\x8a\xed\x5b\xb7" - "\x61\x43\xaf\x2a\xad\xd9\x5a\x46\xfe\x2b\x48\x0f\x70\xe7\x18\x73" - "\x4b\xf4\x3b\xab\x4b\xb7\x4e\x86\x68\xa9\xc6\x22\x43\xeb\x5f\x1b" - "\x40\x79\x1d\x1a\x2a\x8c\xa3\x33\x1c\xe2\xcc\x46\xcd\xd1\xa1\x6a" - "\x1c\xf7\x84\xd5\x7b\x4d\xa3\x5d\x97\x85\x76\x62\x16\x70\x9b\x1f" - "\x79\x26\xf6\x21\xd4\xfc\x99\xf8\x30\xa4\x54\x60\x7f\x50\xdd\x2c" - "\xcb\x00\xbe\x77\x20\x4d\x87\x82\x7b\x40\x6a\xce\x0e\x29\xe3\xce" - "\x91\xfe\x11\xfb\x4d\x2e\xa2\x1e\xd0\xb4\x9f\x87\x6a\xd2\xfd\x74" - "\x57\x07\xe5\x3f\x2b\xe7\xa9\x1f\x3b\x47\x5d\xb3\x54\x96\x93\x90" - "\x3c\xbf\xa3\x30\x31\x7e\xae\x72\x51\x9d\x33\x51\xf7\x6a\x39\x1d" - "\xf2\x95\xb5\x73\x3d\x52\x93\x1e\xa9\x1b\x7e\xab\xa5\x35\x77\x81" - "\x0f\x97\x3f\x6d\x4e\x0b\xf7\x8d\x82\x36\xde\x79\xa8\x59\x2c\xed" - "\x7f\x39\xc3\xfb\x74\x23\xc2\xf2\x0a\x58\xcc\x52\x7d\xab\x5c\x16" - "\x4b\xcc\x69\x69\xe7\x72\x56\x73\x28\x38\x27\x59\x93\x4d\x63\x73" - "\x36\x54\x38\xc1\x01\xd5\x35\x5c\xb6\xf0\xbd\xe6\x7b\xc2\xf7\x1a" - "\xc9\x1b\xd1\x49\x72\x15\x94\xa9\x9a\x6e\xb9\xbe\x89\x66\xcc\x57" - "\xab\xe7\xfe\x76\x6b\x1c\x32\x2f\x63\xf9\x93\xe1\xed\x56\x8b\xb8" - "\x78\x44\xdb\xe5\xe3\x4a\xe1\x17\x88\xce\xd1\xa8\x10\x47\xdb\x05" - "\xd8\xf9\x25\x9d\x0d\xd0\x78\x69\x9c\x96\x63\x23\xff\x08\xc2\xbf" - "\xd0\x4e\x6c\x0f\x3b\xb2\xa5\xf3\xc1\xf4\x8d\xfd\x7f\x75\xb6\xa8" - "\xbb\x9d\x9b\x43\xda\x9e\x4b\xda\x6f\x30\x91\x78\x44\xfa\xcc\x6e" - "\x5c\xc9\xdb\xab\x38\x57\xbc\xf3\x90\x9c\x8f\xfb\x12\xf0\x89\x3e" - "\xf1\x32\xec\x3c\x4e\x7d\x04\xe1\xe7\x80\x9d\xe9\x54\x3e\xd1\x47" - "\x7d\x2e\x97\x1b\x1d\xdd\x49\xb0\xb3\x2b\x02\x87\xb3\x32\x2c\x09" - "\xf6\x80\xfc\x4d\xfe\xc2\x1c\xb0\xdb\xd0\x95\x82\x6d\xca\xcd\x69" - "\xb8\xa9\xab\x06\xdb\x96\x9b\xd2\xed\x4a\x90\x79\x88\xe1\x66\xfc" - "\x46\xfb\x67\xbb\x5e\xac\x39\x6d\xcb\x15\xba\x68\x77\x05\xf9\xa2" - "\x32\xe9\xc9\x9f\xe0\x52\xa1\x6f\xb8\xbf\x1c\x1e\x77\x87\xd4\x66" - "\x27\xd1\x19\x24\xbe\xef\xc6\xed\xe3\xba\x41\xf8\x57\xc0\x78\x6c" - "\x23\x1e\x71\xef\xc9\x24\x81\xdb\x2e\xf3\x58\x19\x28\x13\x5d\x7c" - "\x8d\x73\x97\x41\xf8\x2b\x99\x78\x06\xe3\x3b\xe4\xfa\x23\x1f\xd0" - "\x44\x37\xe6\x8b\xef\xe2\x3e\xbe\x76\x9d\x92\xf1\x95\xe2\x94\x5c" - "\x1e\x38\x0f\x76\x8d\xb5\xff\xa1\x24\x9e\xd6\x29\x97\xc3\xd3\x62" - "\x3a\x4a\x4f\x77\xd5\x79\x2c\xbb\xd5\x63\x70\x84\x9f\x94\x78\x2a" - "\xa7\xab\x83\xc7\xe9\x83\xba\x6a\x27\x5f\x33\xe2\xfb\xe2\x90\x0e" - "\xd7\x0b\x38\xce\xa6\x3a\xd0\x83\x0a\xf3\xa8\x09\x9e\x90\xc5\xdd" - "\x1b\xe4\x3c\x2a\x05\xf1\x71\x77\x89\x5c\xb6\x0c\x83\xf0\xbf\xa1" - "\xce\x13\xb4\xa8\xa9\x8d\x50\x5a\x82\xcb\x65\x82\xdf\x75\xb3\xfb" - "\x12\x97\x41\x4e\xe7\x6e\x5b\x68\x5d\x0b\x5b\x6c\xf7\xd9\x10\x79" - "\x20\x7c\xc6\xea\xdf\x01\xc6\x64\xd1\x97\xec\xf6\x86\xe0\x98\xeb" - "\xb1\x18\xe3\x83\xf5\xc0\xeb\x88\xee\xad\x88\x7a\x8f\x18\x6f\x2b" - "\x98\x26\xc0\x38\x9e\x54\x1f\x38\x16\xcb\x81\xae\x16\xf2\xdb\x94" - "\x63\x43\x9e\x20\x8e\xc6\x57\x48\xae\x10\x6e\x71\xb8\x6c\x1a\x0d" - "\x21\xf8\x2a\x48\xaf\x63\xd8\x41\x39\x0d\xe2\xc7\xf7\xb2\xc8\xfc" - "\xc4\xb8\x8e\xb1\x7a\x5c\xc8\xd3\x76\xca\x78\x7e\x45\x9f\x21\xf1" - "\xca\xf8\x85\x54\x86\x53\x2e\x03\xdf\x51\x3f\xec\x1e\x67\xab\x3e" - "\xbd\xa7\xa6\x54\x38\x30\xa2\x4e\x7e\xcb\xd6\x6d\xa5\x25\x19\xfa" - "\x2d\xcf\x90\xab\xa3\xea\x8a\xd2\x52\x03\x5f\x24\x0a\xb7\x03\x93" - "\x79\x79\xc8\x07\x61\xcb\xee\xdd\xf1\xaa\xd8\x1f\x43\xed\x82\xda" - "\x3b\x9d\x2b\x98\x78\xba\xf6\x2a\x1f\x9b\xd8\xcd\x0b\xc1\xee\x65" - "\x66\xb2\xdf\xb9\xee\x23\xfa\x75\x6e\xd1\x0f\x60\x7d\x52\x1f\xe9" - "\xb1\xec\xb1\x86\xf3\x6b\x4f\x47\x78\x5b\xde\xd3\x19\x5d\x4f\xec" - "\x79\x84\xeb\x09\xab\x90\x0b\xd2\x4f\x74\xb6\x80\xe0\x62\x9e\x81" - "\x08\x98\xee\xa0\x8e\xda\x0b\xb2\x8e\x12\xfd\xc4\xde\x34\xec\x83" - "\xac\xa2\xac\xbd\x29\x41\xb9\xd9\xdb\x2a\xe4\x66\x6f\x96\x03\x0e" - "\x57\xc8\x63\x15\xd1\x77\xec\xe1\xf6\x23\xe9\x74\x8c\x2f\x90\xe1" - "\x35\x27\x51\xbf\xb1\xb7\x78\xbc\xfd\xb0\x37\x81\xec\x07\xda\xf7" - "\x48\xbc\x40\x5c\xe3\x45\xbb\xd9\x7b\x38\x44\xff\x68\xf1\xbb\x35" - "\x5a\x5d\x3f\x4d\xdd\xf1\x3c\x5a\xce\x9b\xb7\xb5\xb2\x66\x19\xb9" - "\xa1\x2a\x35\x1a\x4a\xb7\xd6\x94\x96\x44\xae\xe3\xa5\xcb\xb6\x98" - "\xec\x97\xde\x95\x48\xfc\xd8\x8b\xf4\xef\x4b\x91\x69\xe0\x7a\x0a" - "\x6d\x47\x49\xc7\x25\x5c\x80\xda\x2f\xda\xf9\x3e\xc0\x17\x52\x64" - "\x39\xa1\x74\xcb\x8d\x2c\x80\x61\x48\xff\x1e\xf9\xae\x43\x1c\x93" - "\xbe\x90\x2b\x7f\x07\xf3\xbf\xf0\x22\xef\xfb\x8e\xf0\x3d\x83\xc8" - "\xd3\x5a\x75\x88\xbd\x85\xdf\x2f\x9c\x93\xbe\xb9\xaf\x25\xf2\x0b" - "\x36\x08\x2f\xbc\x21\xf8\xfb\x02\xd6\xbf\x51\xd2\x15\xb5\x62\xdf" - "\xcd\x11\x80\x77\xea\x5c\x71\xed\x7c\x3d\xe1\x85\x4e\xb9\x3c\xcc" - "\x7f\x2e\xb4\x4c\xea\xb7\x22\xe1\x39\xe0\x05\xba\x97\x9b\x7c\x2b" - "\xa2\x6d\xf9\xc2\x60\x14\x5c\x0d\xa1\xe9\x3c\x96\x5a\x2d\x96\x7f" - "\x4a\xa6\x79\xbd\x91\x87\xa5\xdd\x80\xc6\x41\x89\xc6\x0e\x92\x2d" - "\x2a\x9f\xe4\x5f\xc2\xe1\xa0\xe4\xf7\xc4\x41\x77\x85\x11\xfe\xdc" - "\x07\x9a\x8e\xda\x75\xad\x11\xfb\xf9\x41\x99\x0e\xa2\xf1\x44\x9d" - "\x4b\x2d\xfb\x9e\x12\xf9\x6b\x9f\x8c\xc0\xed\xfd\x90\x3c\x4e\xdb" - "\x6c\x5a\x2b\xa8\x5d\xc9\x2c\x7b\x8f\x93\x1c\x92\x4f\xaa\xe6\x31" - "\x39\xac\xed\x1f\x2f\x77\xb5\x2b\x48\xee\x42\x65\xa9\x7c\xe1\x56" - "\x94\xa4\xea\xd2\x9a\x25\xdc\xba\x47\xc3\x8e\x5c\x9b\x6d\xa9\x29" - "\xdf\x5e\x59\x9d\xa1\xaf\x2e\xd9\x22\x35\xfa\xb0\x36\x6f\xe1\x63" - "\x77\xb7\xdc\xce\x3c\x96\x7d\x2b\x82\xba\x65\x5f\x50\xfe\x69\x0f" - "\x18\xbf\x53\x74\xdf\x1b\xa2\x3d\xed\xab\x08\x69\xbb\x3c\x3f\xb5" - "\xd1\x76\x6e\xb3\xed\x0b\xed\xff\x69\x6c\x3c\xe9\x32\xec\x5b\x2c" - "\xf1\xd4\x2d\x78\xbc\xef\x33\x4e\x27\xf7\xb9\x55\xeb\x26\x3a\xb9" - "\x7f\x19\x6e\x9f\xed\xeb\x96\xe9\x0d\x8e\x1b\xf6\x39\xb8\x1d\x25" - "\xd9\x6b\x37\x1a\x97\x07\xed\xd3\xba\x5a\x69\xce\xad\x5f\x1e\xe3" - "\xc9\xf6\x35\xe2\x52\x22\x6c\xd5\xba\xc5\xf9\xb5\x6c\xb4\xc8\x48" - "\xbe\xe8\xa8\x0e\xea\xb6\xc8\xb6\x25\xdf\x1f\xd8\x98\xd3\xe1\xb1" - "\xd4\x15\x86\xea\x09\xa6\xda\xd6\x2f\xd9\x88\x1d\x62\xec\x7a\xd3" - "\x3f\x9f\xc7\xb2\x10\xb7\xf8\x1b\xe0\x86\x74\xd5\xa1\xfe\xab\xe7" - "\xfe\x35\xc9\xbe\x66\x43\x3a\xe9\xde\x35\x13\xf7\xc9\xde\x86\xb0" - "\x5d\x58\xb7\x98\x0e\xed\xbf\x7d\x5c\x36\x02\x28\xa3\xb4\x37\xc8" - "\x2d\xdb\x48\x50\x77\x8d\xfa\x22\x7c\x47\xb9\x35\x49\x67\x12\x4d" - "\x79\xae\xea\x74\x18\x1a\xd2\x29\x87\xaa\x0b\xd5\x34\x5f\x40\xbc" - "\xb0\xb7\x7a\x41\xc8\x8f\x49\x87\x7a\xaa\x3b\x14\x9e\x04\x8b\x78" - "\xaa\x26\x3c\x58\xb5\x4e\x49\xf2\xcd\xef\xf1\x1a\x4a\x47\x3d\x5a" - "\xe7\x60\xd5\xe9\xca\x18\xfe\xb5\x6e\x44\x67\x02\xdd\x6b\x46\x77" - "\xd4\x91\xbe\x12\x7e\xf6\xcd\xef\xbe\x2a\xe6\x06\xa4\x72\x4d\xef" - "\x31\xe5\xdb\xbc\x5f\xa9\xe7\xfd\x0a\x03\x71\x07\x83\xa9\x9b\xef" - "\xd3\x35\xbc\xcd\x7d\x7f\x4a\xe7\xbf\x5d\x5d\x06\x1f\xbf\x9b\xcc" - "\x54\x43\x76\x9a\x8f\xd6\xa9\xf8\xf9\xe6\xd3\x35\x3e\x58\xef\x25" - "\x99\x34\x79\xc9\x6f\xbb\x9b\xdb\x0b\x66\xb5\xec\xab\x9d\xee\x4a" - "\xa3\xfb\xf7\x90\x2e\x15\xd5\xbb\xde\x44\x3e\xf6\xcd\x74\xbf\x1a" - "\x88\xf1\xb8\x0e\xea\xd1\xa6\x17\x75\x60\x5e\x43\xf7\x19\x8a\xb1" - "\xc2\x79\xac\x17\xd5\xe7\x98\xb6\x54\xac\x55\xcb\x7a\xc2\xfc\x29" - "\xed\x7d\x77\x48\x30\xb0\x2c\xec\xff\xeb\x0e\x89\xb2\x10\x9e\x47" - "\xae\x4f\xf3\x9a\xf1\xf3\x1b\x41\x78\x98\x7f\xb5\x64\x17\x80\x98" - "\xbb\xfa\x2d\xc1\x3a\x25\xcf\x5d\x05\x6d\x1f\xf3\x19\x79\xee\x4a" - "\xf8\x8c\x36\x35\x53\xf9\xb1\xe6\x88\x98\x69\x23\xc9\x7d\x3c\xd9" - "\x70\x31\xed\x09\xec\xdf\x09\x77\xd9\x2e\x14\xf5\xb3\xbf\x9c\xec" - "\xc3\xae\x5a\x31\xae\x1d\x12\x77\xb1\xa1\x0d\xb0\xbf\x46\xf4\x65" - "\xfb\x0b\xe5\xbe\x0c\xf3\x9e\x90\x74\x85\xd4\xcf\xed\x1f\x1b\xff" - "\x46\xdf\xf7\xbf\xbf\x59\xe6\x91\xcc\x73\xc1\xa3\xfd\x97\x86\x92" - "\x32\x33\x82\xbc\xdd\xcf\xd7\x2e\x82\xf1\x96\xb9\x21\xbc\xa7\xef" - "\x34\xa1\x37\xf7\x63\xff\x6f\xda\x20\xfa\x14\x11\xc6\x92\xb6\x2d" - "\xa7\xbb\x13\x05\x0f\xca\xf9\xdc\x8c\xcb\x94\x8e\xb8\x59\xb4\x0e" - "\x85\xe2\x98\xd0\x65\x16\xec\xff\xf6\x27\x88\x7c\xfb\x4f\x12\x2e" - "\xa1\xf8\x3e\x5a\xb9\xad\x72\xfb\xee\x4a\x9a\x50\xdb\x59\xad\xdf" - "\xba\xbd\xa4\x74\x72\x94\xf9\x10\x1d\xdd\x97\xea\x6e\x1e\xf3\x6b" - "\xf5\x62\x3a\xed\xd3\x17\xf7\x07\xbc\x78\x87\xfe\x76\x92\x2f\xcb" - "\x2b\x34\x57\xc0\xef\x70\x20\xdf\xa8\x62\xde\xc0\x49\xf9\x05\xaf" - "\x5f\xbc\x65\x68\x77\x99\x64\x63\x1d\xfc\x13\xf1\x51\x1a\x73\xb0" - "\x0b\x70\x60\x92\xdc\x0f\x11\x7e\xdc\x36\x1f\x4d\xe7\x7a\x31\x30" - "\x5a\xa6\xe6\xfc\x1a\x4d\xc7\xfe\xc6\xe2\x74\xa0\x2d\x2e\xd1\xe5" - "\x96\xf9\x41\xf4\xa3\xad\x1b\xef\x61\xe5\x28\xa3\x2f\xa6\x4b\xb0" - "\x48\x7f\x22\x6c\xcb\x29\x79\x9f\x38\xf9\x0b\xb5\xed\x22\xff\xbf" - "\x07\xae\x05\x1a\x49\xdf\x1c\xc8\x91\xf5\x12\xf5\x45\x01\x84\xf3" - "\xe1\xb0\x2b\x0e\xdb\x0d\xf9\x1d\xba\xf5\x3c\x1c\x3c\x28\xee\x03" - "\x38\x50\x12\x7e\x1f\xc0\xc1\x5c\x7c\x0e\x4a\xcf\xb1\x90\xf7\x1b" - "\x3d\x72\x1e\x43\x30\xec\x80\x2d\x22\xcd\x31\xc4\xa9\x67\xcc\x5e" - "\x11\x3e\x4b\x25\xbf\xc5\x74\x87\xc5\xc1\x49\xe4\x17\x34\x28\x1b" - "\x07\xe6\x49\x36\x88\x93\x78\x47\xfd\x2d\xa6\xe1\x7b\xb9\x91\x27" - "\xcb\x69\x8e\x96\x68\x62\x9e\x72\x94\x89\x83\x69\x41\x39\x10\x3c" - "\xc2\xb0\x9c\xa0\x9d\x72\x30\x81\xf2\x84\xf2\x01\xcb\x78\x40\x8c" - "\x4d\x0f\x16\xcb\x7d\x36\xf9\x44\x15\x77\x41\x1c\xe8\x39\x51\xe7" - "\xc4\x31\xff\xc1\xda\x20\x8c\x03\x3d\xd2\x5c\x84\x9a\x29\x2d\x59" - "\xed\x7c\xcc\x76\xb0\x35\x38\x27\x70\xa0\x87\xf4\x2e\x87\x91\xb4" - "\xad\xc0\xee\xe6\xf7\x93\x2a\xe4\xbb\x87\x31\x6d\xb7\x6c\xa3\xc8" - "\xb0\xba\xc4\x9c\x13\xf7\x63\x89\x6d\xd0\x8a\x69\x06\xc7\xe6\x63" - "\xe9\xfe\x21\x79\x0c\x68\xc4\x76\xcc\x6d\xef\x17\x13\x82\x63\x3d" - "\xcb\xfb\x5c\xdf\x58\xc6\xe0\xe0\xf8\xe8\x45\x88\x1c\xb7\xa1\xfd" - "\xa0\x2f\xaf\x2c\x47\xf3\xe1\x59\xc3\xf6\x65\x38\x74\x78\xd6\x50" - "\xbe\x8c\xb6\x94\xad\x59\xb1\x8a\xff\x62\xe3\x58\x16\x65\xfe\x78" - "\xec\x0e\x52\x9a\x33\xc2\x71\x2e\xcd\x9d\x7a\xc4\x1d\x85\x13\xa5" - "\xdf\x78\xe9\x77\x02\xf6\x7b\xdd\xd8\x06\x3e\xa0\x3b\x68\x10\x07" - "\x9b\x74\x2f\xa4\xdc\x67\xa3\x2e\x7f\xf1\x5d\x79\x9d\x8c\xef\xb1" - "\x27\x5f\x85\x74\xc7\xe8\x81\x6d\x9f\x21\x4d\x63\xf3\x1f\x62\x7e" - "\x51\xac\x7b\x61\xb8\x57\x0e\x97\xe7\x63\x3d\x96\x1f\x27\xc8\x73" - "\xaf\x22\xed\x8f\x53\x82\x79\xc3\xe6\xb6\x93\xe5\xf5\x35\x4c\x93" - "\x2b\xf3\x4c\x86\x63\xd2\xb3\xcb\x92\x9d\xa4\xe2\x76\xb5\xe5\xc5" - "\x6c\xee\x1f\x94\x6c\x71\x3e\xcf\xfc\xe3\x1a\xb9\x1c\x1a\x23\x10" - "\xde\xd2\xda\x0d\x6f\xf7\xe4\x07\x54\xf8\x11\xfd\xf1\x58\xfd\x7f" - "\x9d\x7b\xc1\x46\x77\xb1\x2e\xdf\x30\x3b\x59\xff\x17\x6c\xb3\xcf" - "\x00\xf8\x76\xb1\xce\xd1\x61\x76\x82\x78\x5d\xff\x34\xc0\x2b\xff" - "\x03\xc0\xaf\xda\xf4\xc5\x08\xf2\x7d\xed\xb5\xc0\x65\xba\x0b\xaf" - "\x1d\xd3\xad\x75\x5f\x61\x6d\x98\x67\xad\x81\x5d\x6e\xc3\x74\x6b" - "\x2e\x5d\x66\x47\x31\xed\x9a\x32\xa4\x7b\x17\xf3\xf9\x55\xdb\xbe" - "\xd0\x3f\x46\x7a\xe8\xef\xb2\x5c\x8d\x8b\xd1\xf6\x52\x36\xb0\x03" - "\x77\xdd\xe9\xb1\xfc\xdd\xd2\xb1\x3b\xad\x10\x2e\xf1\x28\xdf\x48" - "\xef\xdb\xbe\x40\x9a\xbe\x28\xc2\x3e\x14\xeb\xe0\x0b\x4c\x87\xe3" - "\xff\x4a\xae\x6f\x5c\xaa\x3b\x93\xf0\x49\x8f\xa6\xf7\x11\xd7\x2e" - "\xff\x2e\x76\xb2\xe1\x29\xc4\xff\x22\xe2\x3f\xcc\x3a\x91\x86\x13" - "\xf5\x17\x00\x08\x7f\x3f\xc1\xf4\x83\xaa\x68\x8f\x22\xb1\x1d\xe3" - "\x8b\x8c\x5a\x68\xc7\xb4\x4f\xb9\x21\xb1\x0d\xd3\x3c\xb5\x23\x11" - "\x38\xfe\x83\x88\x77\xe2\x62\xb5\x1f\xcb\x26\xfc\xb1\xfc\x01\x19" - "\x4f\xb9\x7c\xc2\x57\x96\xc1\x22\x9a\xef\x4a\xca\xac\x20\xbc\xc5" - "\x1c\xfe\xa1\x54\x57\x75\x19\xb8\x54\x77\xdd\xe9\x80\x43\x39\xd4" - "\x86\x88\x1e\x17\xca\x94\x74\xee\xed\x0b\x99\x07\x62\x3c\x79\x68" - "\x85\x4c\x5f\x28\x5d\x05\xdb\xab\xf8\x3c\xea\x96\xad\x35\xe5\xbb" - "\xb6\xe0\xe8\x6c\x32\x18\x28\x88\x8f\xdf\x4a\x4b\xf4\xdb\x2b\xf5" - "\xcf\x6c\x29\xaf\xd8\xbe\xab\xb4\x2a\x83\x0f\xb9\xab\x4b\x2b\x4b" - "\x68\x7a\xb5\x6a\x4b\x95\x61\x72\x84\xcd\x6d\x5d\xac\xa6\xfd\x88" - "\xa4\xcb\x2e\xc0\xcb\xa9\xd2\xdc\xa2\x97\x59\x72\xf9\xd8\x4d\xb4" - "\x83\x43\x5f\xe8\xf7\xe6\x52\x7c\xa2\xe8\x6b\x5e\x4e\xe1\x74\x0d" - "\xe5\xc9\xf9\xf8\xde\x5d\x6e\xa3\x52\xf8\x68\x1e\x04\xf7\x90\xbf" - "\x9c\xca\x94\x48\x13\xd2\x2c\xd9\xa9\xf2\x59\xbe\x7f\x3d\x0f\x3f" - "\xf1\x23\x9d\xb4\x56\x70\x86\xdb\x81\xfc\xcc\xd1\x4f\x68\x0e\xe6" - "\x0c\xb3\x4c\x48\x20\x3e\xd4\x8b\x71\xa4\x52\xa3\x30\x2b\xc8\x16" - "\x6a\x57\x06\xb2\x68\x4d\xb0\xdd\x12\xc8\x0a\xee\xe1\x39\x44\x36" - "\x26\xdf\x9f\xd4\xc6\xdb\xc1\x4b\xb5\xb2\x7c\x2b\xe9\x4c\xc9\x81" - "\x69\x4b\x84\x6e\x7e\x69\x3f\xa5\xc7\x7a\x5a\x22\xf0\xe7\xf7\xb6" - "\x62\x7f\xf4\x93\x97\x02\x49\xef\x69\xfd\xd5\x3a\xe9\xee\xe2\xcc" - "\x83\x81\xa6\xcc\x1a\x3f\xf6\xdb\x01\xb4\x45\x59\xd3\x7b\xaf\xfa" - "\x9b\x32\x2b\x03\xbb\xd3\x95\xa4\xbf\x4d\x46\xe4\xcf\xf6\xb2\xc9" - "\xec\x4a\xd9\x4d\x7e\xba\x6f\xaf\x29\x73\x17\x63\x98\x37\x29\xf3" - "\xc7\xd4\x47\xe2\xb7\x51\xfa\x3e\x44\xdf\x01\xb4\xc5\x30\xac\x1e" - "\xbf\xad\xfc\x6e\x3f\x39\x7d\x78\xda\x26\xfa\xd6\x28\xf8\x1e\xc1" - "\x2c\xb4\x7d\x97\x12\xad\x32\x8d\x7c\x0c\x40\xf3\x10\x63\xb4\xfc" - "\xe4\xa0\x1c\x4e\xb6\xa9\xb0\x13\x61\x2b\xf2\xb4\x45\xe8\xac\xb1" - "\x74\x4f\xca\x34\x73\x5e\x36\x65\xe2\x58\x09\xeb\x8f\xee\x63\x3e" - "\x30\xfd\x4e\xa6\x3c\xb4\x95\xfa\x86\x7c\x3f\x5f\xab\x02\xb1\xb6" - "\xf1\x93\x53\x32\xff\x68\x2f\x3c\xf5\x0f\x58\x4f\xe9\x45\x2e\x98" - "\x2c\xda\xe7\x4f\xce\x85\x8c\x41\x06\x19\x97\xe7\x9f\xf0\x73\x26" - "\x4c\x19\x7f\x40\x7c\xbf\xb4\x54\xf4\x67\x2f\xc7\xcb\x69\x31\x8c" - "\xef\x01\xa2\x35\x2b\x94\xff\xc1\xb6\x88\xf3\x99\xb1\xf4\x0f\xe2" - "\x2b\xf9\x3b\x7f\x79\x83\x6c\x1b\xe0\x7b\x71\xf8\x19\xce\x97\xf3" - "\x22\xd7\x98\x9e\xde\xbe\xbd\xa6\xa8\xaa\x94\x7e\xd2\xe7\xee\xbc" - "\x23\xb2\xaf\x48\x10\xf7\xc8\xbc\x6c\x24\xba\x49\x7f\x8a\xb3\x10" - "\x2f\x9f\x0c\x19\xef\xd1\x9c\xd3\xfd\xa4\xf7\x69\xad\x18\xe3\xce" - "\x7e\x52\xbb\x8f\xdb\x1b\x9f\xc5\x83\x32\xd6\x1e\x06\xee\x57\x3b" - "\xb1\x49\xcb\xdb\x77\xe3\x7b\x66\x8f\xe5\x70\x82\xbc\xe7\x28\xba" - "\xef\x87\xcc\x01\x7f\x53\x45\x87\x7e\x1a\xbf\x23\x4f\xf9\x0f\x7b" - "\xfb\x95\x64\x5f\xd4\xe1\x3b\xed\xc9\xe0\xf3\x58\xd2\xdd\x6b\xbf" - "\xb9\xda\x8f\x7a\xe4\x70\x31\x6b\xcc\x44\xdd\x73\xb8\x30\x26\x0e" - "\x21\xe7\x66\xc5\x1a\xdc\xe1\x98\x7b\x2e\x98\x35\xa7\x5f\xc8\xca" - "\xe1\x5e\xbe\x16\x34\x0d\xfe\xee\x3c\x1c\xfe\xbd\x5a\x87\xe3\x94" - "\x69\xf0\x73\x7c\xef\xe5\xfd\xbe\x2e\xbc\x8f\x86\xd4\xc1\x0e\xb5" - "\x8a\x61\x9b\x60\x0a\x26\xfe\xd0\xc8\x10\x7f\x2a\x7c\x94\x4c\xc1" - "\x77\x9f\xab\x90\x53\x13\x27\xa8\x41\x33\x35\x21\x7e\xe6\x8c\x14" - "\xdd\xfd\xf7\x2d\xcd\x31\xd5\xd5\x1a\x59\xc0\xe7\xd5\xb0\xd0\x7b" - "\x02\x1b\x3b\x1f\xbd\xc3\x2c\x74\x61\x63\x63\x67\x34\x5c\x5f\xb1" - "\x30\xda\xc3\x09\x81\xa4\xe3\x2e\xd3\x4e\x50\x7e\x38\xe2\x50\x92" - "\xad\x42\xfa\x95\xee\xbb\x3c\x0f\xaf\x6c\xfc\x18\xc3\x90\x7e\x23" - "\xb3\x1e\x77\x89\xb3\x05\xaf\xbc\x11\x68\x3a\xee\x0a\xc2\x57\x03" - "\xc1\x47\x7b\x58\x79\xac\xce\xa9\xb4\xab\xef\x03\xbb\xde\x0d\x1f" - "\xe3\x7b\x8c\xfa\x34\xd0\xdc\x0b\xc1\x40\xbd\x73\xc8\x74\x1d\xf5" - "\x91\x91\xcf\x83\x2a\x2f\xc3\x2b\x7f\xea\x8c\x91\x8f\xaf\x65\x24" - "\x65\xff\xc1\x63\xa9\xc7\xfa\x5f\x31\x20\xf5\xf7\x68\x8f\xd4\xa7" - "\xc8\x6d\x02\xe3\x7f\x2f\xe6\x63\xeb\xb3\xe4\x34\x51\xeb\xe8\x27" - "\xb4\x87\x91\xd9\xa8\x5e\xd9\xb0\xd3\x49\x3e\xd4\x62\x8c\x79\x73" - "\xb1\xff\x89\x23\x1b\xa6\x17\x35\xc4\xd4\xfd\x5a\x5a\x2b\x45\xbd" - "\x92\xf5\xbc\x66\x7f\x56\xf9\x54\xf7\x2d\xa0\x31\x3e\xa9\xd0\xf8" - "\x56\x29\x8e\x1e\x61\x67\xc8\xc6\xa3\xb5\x06\xd2\x2d\x53\xf6\x67" - "\x6d\x61\xca\xa5\x8b\xe8\x6e\xab\x29\x83\x0f\x28\x02\x96\xec\x45" - "\xe4\x17\xcd\x7a\x2b\xeb\xc7\x74\xe7\x30\x1d\xcd\x35\x0d\x60\xda" - "\x9e\x0b\x50\xff\x25\xfe\x76\x4f\xd9\xcf\xda\xa7\x0c\xb2\x40\xa6" - "\x19\x54\x12\xbc\x1e\x7e\xb7\xfc\x28\x1f\xeb\xc6\x05\xc7\xba\x0d" - "\xc9\x7e\x0b\x4c\xc8\x8f\x63\x1f\x23\x8c\x6e\x36\x1c\xe8\x3e\x1a" - "\xe0\xfe\xa1\x68\x3d\xe8\x2c\xea\x91\xb3\xf3\x9b\x71\x6c\x43\xf7" - "\x44\xee\xc1\xba\xf4\x7a\xc9\xae\xb1\x61\x19\x5d\xa8\x27\x4e\xed" - "\xdb\x01\x4a\x3f\xe6\xc1\x3e\x42\x75\x19\x1a\x9e\xef\x73\xf6\x93" - "\x4f\x6d\x55\xd0\x56\xb3\xf2\x79\xb9\x57\x8e\x30\x1b\xed\xe3\xfd" - "\xf0\xb2\x8b\xee\x59\xef\xa6\x36\x43\x7b\x1a\x29\x1c\xbf\x4f\x65" - "\x36\x43\xba\x7d\xd0\x09\x7d\x68\xa5\x31\x93\x4e\x89\xe1\xa7\x32" - "\x5c\x68\x4f\x20\x6c\xda\xbf\x8d\x6d\xbe\x67\xca\x20\xc4\x21\x2d" - "\xa7\xb8\x8d\xb5\x3b\x3d\x0d\xf3\xd9\xe6\x21\x6e\xd8\xe7\xa7\x7c" - "\x38\xd2\xaf\xe4\x67\x7e\x6f\x65\x67\xa6\xb8\x21\x8d\xeb\x06\xee" - "\xb3\x2c\xfd\x76\xcc\xdb\x85\x76\xf4\x59\x82\x4b\x73\x0b\xf8\x7d" - "\x86\x60\x5c\x06\xeb\x23\x6c\x7b\xba\x9a\xca\x40\x9b\xc0\xa6\x7f" - "\x86\xd6\x6c\xac\x19\x7d\x4e\x2f\x50\x78\x03\xe2\x87\x32\x6f\x23" - "\x3c\x91\xd6\x93\x1e\x8b\x75\xa9\x7c\x56\x9b\xfa\x47\xfc\x5e\x2d" - "\xcb\x0b\xea\xe3\x93\xe2\x3c\x69\xc3\x2a\xe2\x09\xe2\x7f\x36\x30" - "\x1c\x70\x06\x10\x37\x82\xc3\xaa\x75\x6a\xc4\x5f\x91\xef\xf3\x30" - "\xa4\xe1\x6c\xbe\xd1\xc3\x08\xae\xbe\x92\xf3\x6d\x2e\xab\xa6\x3b" - "\x89\xac\x27\xc8\x36\x26\x9e\x8b\xfe\xbc\xe1\xf9\x29\xfb\xb5\x3f" - "\x9e\x32\x78\x0b\xea\xe5\x86\x83\x47\x87\xa9\x0f\xb5\xda\xe4\x32" - "\x63\xb4\x09\xaf\x1d\xf5\x41\x60\x98\xf1\xbb\x48\xc5\xfe\x0b\xab" - "\xbb\xc8\xa8\xca\x45\x1a\x95\x88\x0b\xd5\xe3\xad\xd8\xaf\xdc\x4f" - "\xfb\x6b\x10\x07\xb4\x83\x1b\x93\x6f\x74\x47\x27\xd2\xaa\xc3\x34" - "\x38\xfe\xb1\x0a\x3f\xfd\xbb\x58\xab\x98\x7b\x68\x1c\x3b\xff\xce" - "\x86\x59\x6d\x43\x1d\x2f\xd7\x7c\x70\x17\x2f\x83\xee\x6d\x74\xd6" - "\xe8\xd9\x67\x5d\x7a\x57\xac\x36\x81\xf4\x34\x5a\xe5\x33\xef\x84" - "\x3b\xb6\x67\xb3\xd0\x0d\x4d\x93\xa6\xee\xbf\x9f\x4d\x75\x2f\x5a" - "\x44\x6b\x9f\xed\x4a\xbe\xd7\x47\xf4\xab\x42\xff\xcf\xc4\xfa\xbd" - "\x42\xf5\x8c\xb6\x5d\x3f\xed\x99\xb0\xbb\x19\x1f\x2b\xf0\xbb\xac" - "\x51\x8b\xd1\x7e\x39\x9a\x87\xc3\x32\xdc\x63\x63\xd7\xb0\x32\x1a" - "\xdf\x8f\xd4\xbd\x05\xcb\x57\x95\xea\x2b\x68\x0f\x4c\xd6\x42\xa3" - "\x3e\x7d\x6e\xc9\x7c\xbe\x39\x46\xff\xd0\xf2\x25\xfa\x02\x1c\xd8" - "\x94\x65\xac\x15\x3f\xcb\x0b\x56\xd3\x6f\xc4\x5c\xa9\xde\x63\x69" - "\x8a\xe8\xff\x5e\xf7\x89\x3e\xb2\xc9\xe8\x50\x4c\x3f\x25\xe6\x94" - "\xe7\xa7\x20\x9f\x06\x5d\x89\x8d\x9d\xd2\x3e\xd8\x14\x7c\x37\xb8" - "\x12\xb3\xcf\xd1\x5d\xaa\x9a\xfd\xcc\xab\xf1\x4d\x64\x24\xa3\x74" - "\x87\x2a\xca\x90\xb3\xe1\x2a\x1f\x93\xc1\xca\x3b\x4c\x2c\xdf\xcf" - "\xec\xed\x57\xa9\xde\x9a\x7a\xe4\x3a\xe1\xf6\x2d\xc2\x45\xba\x47" - "\x09\x26\xd6\x75\x3c\xc1\x25\x1b\x17\xd3\x21\xfd\xaf\x9c\x14\xfd" - "\xf3\xab\x28\x4b\x8d\x46\x49\x86\x0b\xf0\x5b\xeb\x80\x85\x7c\x5f" - "\x51\xc0\xa2\x23\xdf\x01\xea\xc0\x81\x3b\xd7\xa1\x1e\x36\xc8\x30" - "\x11\x56\x82\x8c\x27\xc1\x83\xaf\x79\xf6\x2b\xd0\x94\xa5\x23\xbb" - "\x89\xce\x58\x68\x8c\x0a\xba\x47\xa0\x70\xcc\x36\xc4\x38\xd4\x81" - "\x64\x2f\x16\x4e\x75\x2b\xcc\x94\x26\x68\x53\x05\x1c\x0d\xca\x80" - "\x17\xfb\x58\xad\xb8\xd7\x74\x50\x9a\x33\x7e\xf5\x54\xf4\x7a\x7c" - "\x95\xef\x71\xbc\x6a\x51\x23\x6d\x4d\x05\xb3\x93\x45\x3b\x08\x58" - "\x14\x20\xce\xdb\xbd\xfa\x11\x5f\xc7\x14\x7b\x46\x66\x22\x7f\x5d" - "\x34\x3f\xa8\x41\xfd\x40\x7b\xe9\x02\x24\x3f\x70\x11\xec\xb5\x1e" - "\x33\xdd\x27\x2a\x8f\x29\x71\x7c\x14\xe8\x33\xf8\x31\x7e\x1b\xf7" - "\x2d\x84\xb6\x5a\x31\xb6\x27\xc5\x45\x78\xd5\x4c\xf8\xf3\x7a\xb4" - "\x40\x42\x00\x79\xc5\xd7\xec\x89\x3f\x49\x0b\x5a\x68\xef\x36\xd1" - "\xaa\xf1\x21\xcd\xa1\x74\x29\x03\x8e\x7a\x0b\xd2\xa5\x44\xba\x8c" - "\x97\x80\xb7\x55\xe3\xdf\xc8\x86\xb9\x35\xe8\x07\xbb\xb9\x23\x94" - "\xc6\x00\xf9\xaf\xe7\x34\x34\x7f\x12\x8d\x46\xa6\x24\x1a\x89\x07" - "\xcd\xb2\x4f\x76\x8e\x27\xd9\x0d\x83\xd0\xbc\x61\xea\x7e\xda\xcb" - "\x3e\x3f\x05\xfb\xe2\xe5\x54\x87\x6d\x16\x66\x25\x3c\xa3\xd5\x17" - "\xc1\x13\xb0\x5e\x2b\xd6\xec\x37\x17\x7b\x2c\xaf\x65\x44\xe7\xf7" - "\x6b\x6b\x6e\xcc\xef\xd7\x66\x51\x7e\xc2\x83\xf6\xf6\x6b\xc8\x49" - "\x03\xca\x37\xf6\x93\x87\xa2\x95\x3b\x75\x7f\x07\xe1\x15\x35\x0e" - "\x65\x7f\xb0\xa1\x2a\xbc\x4d\x04\xda\xe8\x9e\xef\x4b\xb4\xff\x1d" - "\xc4\x78\xef\xb5\xb3\xc1\xbb\x96\xe7\xaf\xd0\x28\xf4\x2a\xb2\x03" - "\xb8\x7e\x43\x7a\xa3\xc1\xd5\x28\xac\xe4\xe7\x65\x39\xea\x95\xa8" - "\xf1\xd8\x0e\xf4\x68\x53\xcf\x46\x78\x09\x53\xf7\x03\xc3\xb1\xe1" - "\xe4\xa9\x6e\x5f\x1a\xf1\x15\x71\x35\x62\xbb\xa6\xf1\xaf\x52\x8c" - "\x07\x8f\xa0\xfd\xfb\xd3\x2e\x3e\xde\x4c\x9c\x9f\x20\xd6\x3e\x8e" - "\x94\x39\xe0\x17\x63\x73\xb5\xf8\x6d\x74\xc0\xf5\xa5\xa2\xad\x4e" - "\x7f\x93\x35\x65\x1f\x0f\x58\x34\x4c\xbf\x57\x83\xe3\x9c\xd7\x13" - "\x71\xfc\xa1\x64\x49\xd9\xc7\x83\xb2\x23\xf6\xfe\xcb\xb2\x83\xf9" - "\x4f\x46\x97\x8b\x23\xff\x7e\x63\xb9\x38\xf2\x81\x34\xce\x28\x16" - "\xfb\x0b\x5e\x07\xb9\xff\xc0\x71\xc6\x9b\xfa\x3a\x2a\xff\x48\xb3" - "\x28\x1b\x79\xe2\xcb\x25\x3d\xb3\x1a\xf9\x86\xf6\xf1\xeb\x19\xb2" - "\x6e\x20\x19\xd2\xf8\xa9\xff\x02\x2e\xe7\x18\x97\x87\x7a\x44\x5a" - "\x3f\x5f\x7c\x10\x75\x1f\xb6\x85\xa6\x64\x97\xa9\xec\x2d\xda\x5f" - "\xe7\x4e\x9c\x7f\x08\xd3\xe0\x98\xe6\xbf\xf1\x3b\x88\x99\x76\xbe" - "\x19\x61\x1c\xe4\xeb\x55\xe2\xcc\x4a\x02\xb5\x73\xba\xef\x84\xda" - "\x3a\x86\x25\x23\xde\x74\xf7\x09\xf6\x35\xaf\x1f\x93\x6d\xfd\x80" - "\x25\x97\xf8\xcd\xcf\xc8\xe3\x78\x27\x65\x08\x79\xf7\x9a\x32\x70" - "\x7c\x78\xbe\x0e\x88\xe6\xe1\x03\xd3\x8e\xff\x5d\x26\xa8\xff\x8b" - "\xee\x69\x30\x2c\x84\xe4\xfd\x77\xab\xe1\x7f\xe6\x80\x92\xf8\xe0" - "\x80\xd7\x4f\x08\xde\xbd\xee\x96\xeb\xc7\x01\x47\x36\x53\x7d\xd0" - "\xf8\x3e\xdf\xc7\x86\xc4\x7c\x45\x0b\xf6\x7f\x2f\x4b\x77\x25\x37" - "\x55\x44\xe9\x13\x56\xea\xcb\xab\xf5\x25\xdb\x77\x57\xce\x9a\x15" - "\x36\xe7\xab\xe6\xf3\x77\x96\x96\x74\xb1\x86\xd2\xb2\x39\x64\x7c" - "\x8b\x7d\x5b\x0b\xd2\xdf\x94\x17\xd9\xaf\xae\x2e\x92\x8e\x68\x16" - "\x65\x41\xf0\x7d\x01\xac\x5e\x10\xf2\xb9\x08\x56\x2f\x5c\x54\xb4" - "\xae\x74\x4b\xc9\x9e\x90\xd0\xc5\xa1\x63\xa5\x86\x37\xb1\x6c\xd5" - "\xb4\x07\x51\x7f\x28\xd6\xbe\x40\x7d\xcd\x1b\x8f\xd4\xf9\xd8\xe7" - "\x28\xbb\x39\xe4\x17\xa1\xb7\xc6\x07\xbd\xa8\xdf\xd8\x74\xd2\xeb" - "\x13\x85\x6f\x30\x3f\xd0\x18\x46\x83\xb4\xbb\xb0\x7f\xbe\x26\xf6" - "\x97\xbd\xb1\xb3\xaf\x05\x6d\x1e\x6b\xb6\xb4\x7e\xfb\x46\x16\x86" - "\x27\xe2\xef\x46\xb1\x46\xf6\xc6\x93\x68\xa7\xe4\xf2\x73\xa0\xbb" - "\xe8\x1c\xe8\x1b\x2b\x89\x47\x99\x6e\x33\x08\x7f\x24\x2d\x4e\xf2" - "\x13\xea\x80\x37\xf8\x19\x1f\x4a\x8b\x79\x16\xe8\x9f\x83\x2c\xfa" - "\xa5\xf5\x66\x8c\xcb\x62\x8d\xd9\x03\xec\xad\x42\x5a\x37\x48\xc3" - "\xf0\xd7\x54\x8a\xcf\x40\xa5\x9b\xf8\xb0\xc7\xf2\x46\x33\xf2\xdf" - "\x29\xad\x1d\x44\x3f\x73\x20\xf5\x81\x53\x51\x77\x4f\x75\x6b\x58" - "\x11\x9d\xa9\x56\x90\x9d\x37\x88\xed\xb8\x80\xef\x7d\xa6\x3e\x51" - "\xe8\x83\x37\xc6\xe6\x7f\xe8\xac\x09\x7e\xbb\x65\x99\xf7\x58\xde" - "\x04\x59\x26\xc3\xf6\xca\x56\xd6\x94\x56\x95\x96\xe8\xe7\x56\x4f" - "\x86\x90\x1b\xa3\xca\x4a\x2b\xf5\x55\xa5\x3b\x76\x96\x56\xf3\xdb" - "\x9e\x28\x36\x62\x9e\x26\x69\x91\x6e\xec\x4e\x3e\xbe\x5f\xf7\xcd" - "\x52\xb2\xdb\x59\xd3\xa2\x16\x7e\x1f\x06\x9f\x5b\x79\x2f\x3e\x50" - "\x3f\x25\x57\x8c\xf9\xe8\x2e\xe5\xb7\xbc\x62\xdd\x22\xfb\xac\x98" - "\xef\x7f\xeb\x15\xfa\xc6\x70\x6d\xf0\x8e\xe9\x37\x3f\xa1\xf9\x15" - "\x89\x47\x68\xc3\xbc\x79\x52\xe6\x91\x03\x5a\x73\xa5\xb9\xec\x41" - "\xae\x2b\xb0\x8f\xd5\x88\x7b\x7a\xc6\xf4\xc5\xfc\x00\xf5\x53\x6f" - "\xd2\x9e\x0b\x15\x1f\x2f\x27\x66\xd3\x58\x52\x49\x30\x2f\x60\x7e" - "\xac\x8b\xb3\xa8\x27\x51\xd7\xb0\x43\x32\x3c\x2c\xf3\x38\x95\x47" - "\xfa\x03\xfb\xb9\xdb\x2e\xc2\x5b\x1c\x56\xc0\x9a\xdd\x4f\xfa\x83" - "\xce\x1d\x04\x1a\x11\x0e\x5f\x9f\x6b\xcd\xa5\x71\x3a\xbf\xaf\x06" - "\x61\xd1\xf8\x18\x75\x9a\xf3\xc3\xbd\x5e\x25\x85\x89\x3b\x8d\xde" - "\xa4\x79\x4d\xd4\x17\xd9\xa8\x77\xde\x32\x06\xe7\xb6\x5b\x73\x69" - "\xfe\x87\xe0\x3a\xe0\xad\xa5\x04\x4f\xec\x2d\x78\xab\xd5\x01\x2d" - "\x27\x83\xb6\xd3\x5b\x0e\xb9\x5f\x12\xf8\x08\x3c\xdd\x88\x0b\xbf" - "\xa3\x50\x9c\x91\xe2\x74\x93\xae\x6c\x96\x68\x97\xe9\x41\x78\x83" - "\x28\x77\x7c\x6d\x87\xf1\xb9\x64\x41\x37\xe1\x47\xb8\x87\xe2\x2c" - "\xe1\xab\x13\xf3\xf0\xad\x69\xa1\xf3\x54\xe2\x0e\x98\xd6\x9c\xe0" - "\xd9\xcb\x37\xcd\x91\x3a\xe2\xc1\x2d\x5b\xb7\xd1\x26\xd9\xd5\x59" - "\x19\x7a\xd2\x17\x45\xeb\x56\x2e\x7f\xac\x68\x79\xfe\xa3\x6b\x37" - "\xf0\x15\xf5\xb1\xf8\x15\x95\xd1\x13\x84\xcb\x95\x16\x65\x83\xd6" - "\x1c\xe3\xce\x43\x9b\x5b\xac\xab\xb4\x9e\x0a\x5f\x57\x69\x3d\x8b" - "\x8f\x0b\xe0\x68\x02\x3e\x6e\xec\x95\x30\xb8\xcd\x29\xc9\xcb\x20" - "\xe2\xeb\x0c\xca\x4b\x1b\xdf\xe7\x4b\xf3\xd9\x62\x9c\x7b\x14\xc7" - "\x1a\x6f\xe6\x84\xc6\x05\x6d\xfa\xa3\xfa\x31\x9b\x7e\x4c\x1f\x1c" - "\x5d\x2d\xdb\xf7\x18\x76\x0e\x6d\xfb\x89\x64\xdb\x0b\x3f\x81\x6d" - "\xfc\x9e\x65\x1a\x6f\xd0\xd8\x42\xa3\xa0\x7b\x81\x44\xfb\x24\x1b" - "\xaa\x08\xfb\x13\xba\x87\x9d\xc6\x19\xdc\x8e\xa7\x7d\xe3\xbc\x8d" - "\x1e\x3d\x24\xb7\x51\xb2\xe7\xf9\x3d\x72\xc3\xfc\xce\xf6\x2b\xd2" - "\xd8\x10\x98\xf6\xb8\x9b\xe6\x06\xd0\x2e\x3e\x43\x73\xb6\x34\x76" - "\x62\x89\xc7\xa5\xbd\x01\x47\xbb\x69\xae\x80\xec\x61\x3e\x5f\x64" - "\x69\x5d\xcd\xf7\x58\x1e\x98\xf6\x20\x9f\x33\xe3\x7b\x2c\x8f\x0e" - "\x06\x65\xae\xcd\x4d\x75\x49\x3c\x40\x39\xf0\xf2\xfd\x56\x63\x34" - "\xb7\x25\x8f\xd1\xbc\x0b\xe9\x1c\xe1\xe7\xfe\x26\x4a\x77\x5d\x73" - "\x1a\x63\xd1\x17\x9d\xb6\xb6\x92\xaf\xa4\xcd\x02\x71\xd4\x2e\x64" - "\x1a\xc7\xd3\xd7\x76\x3c\x82\xbe\x8a\xf1\xf4\xb5\xf5\x8c\xcd\x89" - "\x89\x36\x82\x63\xbd\xb6\x6b\x44\x27\xc9\x01\xd2\x79\x4e\xa5\x8b" - "\xbf\x3d\xe4\x3d\x23\x9a\x6e\x9d\xba\x5f\x29\x9d\xf7\x6f\x5f\x45" - "\xeb\x3d\x04\xeb\x55\x65\xa0\xec\x55\x0b\x3e\xf8\x4b\x3a\x36\x68" - "\xc3\x32\xaf\xc0\xaf\x3d\xaf\xcb\x38\x48\x7d\xb3\x37\xe6\x3e\x8b" - "\x5d\xec\x1c\xf1\x92\x78\x92\xef\x77\xdd\x4f\xfe\xaa\x3d\x96\x76" - "\xf3\x98\x6e\xce\xcc\xcc\x55\xed\x07\xfd\xe9\xd6\x85\x14\xde\xe2" - "\x80\x76\x90\xf6\x91\xb8\x23\xf3\x22\xbf\x73\xa5\xfc\x36\x39\x7f" - "\xa4\x1f\x39\x7e\xd0\xa1\x62\xcb\xae\xd2\x25\xfc\x0c\x43\xba\x74" - "\xf5\x5e\x78\xbb\x6a\xca\x50\xd2\xdc\x04\xd6\xfb\x44\x5a\x9b\x16" - "\xfd\x5f\x47\x19\xdd\x87\x8a\x71\x6a\xc6\xf7\xe9\xff\x90\xdf\x51" - "\x89\x75\xf4\x43\xbe\x77\xb5\x16\xa4\xf1\x47\xc7\xd2\x90\xf3\x0d" - "\x7c\x2f\x98\xbd\x96\xef\x9f\xc0\xfa\x69\x3f\x13\xdc\x13\xd6\x51" - "\x12\xa2\x3f\x12\x42\x71\xdc\x5e\xa9\x2f\xdb\x52\x59\xb2\xfd\x99" - "\x67\x32\xf4\x3b\x2b\xf9\xca\x00\x75\x2c\xd5\x35\x3b\x51\x3f\x70" - "\xbd\xb0\x62\xf5\xea\xa2\x07\x1f\x5d\xbf\x31\xcc\xce\x88\xb7\x5a" - "\x02\x68\x4f\x75\xe0\xf8\xe7\x15\x97\xe8\xc7\x3a\xba\x1d\xf0\xa2" - "\xb0\x79\xd1\x96\xc1\xba\x4f\xbd\x08\x6f\xa7\x85\xe8\xcb\xa9\xf8" - "\x9d\xc5\x2c\x1d\x35\x54\x17\x12\x5e\xbe\x50\xfb\x04\xdb\x80\xca" - "\x63\x79\x5b\x2b\xfb\xb3\xad\x99\x05\x4a\xf5\x2c\x2b\x34\x2b\x19" - "\xd6\xd1\xdb\xd9\xd8\xe7\x9e\xc3\xf8\x2c\xb4\x3b\x4b\xb8\x2d\x46" - "\x75\x22\x6c\x71\x9b\xc6\x77\x3f\xb7\xc5\x8b\xf6\x80\x82\xec\x70" - "\xb9\x7d\xf8\x71\x5c\xeb\xdf\xc5\x06\x8a\x7c\xa0\x25\x39\x6f\xa8" - "\x24\x59\x9f\xc9\x7c\xc3\xcc\x51\xb4\x27\x1e\xda\xf1\xbb\xfe\x22" - "\x40\x9f\xdb\x07\x4f\x5d\xc3\xf1\x08\xbe\x37\x5c\xc0\xb6\xe1\x0b" - "\x90\x63\x59\xda\xd3\x81\x7c\x7e\xfb\x98\x6c\xeb\x6a\xf6\xeb\xb9" - "\xbf\x41\x9a\x23\x27\x59\x20\x1b\xa0\xc8\xaf\xb1\x89\xf1\xef\xdb" - "\x3d\x37\x9c\xb7\x48\x6c\x6c\x89\x16\x8e\x38\x76\x11\x5e\x88\x67" - "\x27\xe2\x75\x82\xf0\xa9\x7f\x86\xe8\x52\x2d\xd2\xf8\xb2\xf8\x39" - "\x3b\xc2\xf3\x29\x37\x2c\x22\xfc\x9e\xda\xb1\x08\xda\x9e\xe1\xf2" - "\xc1\xd7\x20\xa5\xbd\x0d\x6a\x94\x9d\x89\x17\xe0\xa7\x66\x37\xbf" - "\xff\xe9\xa7\x85\x0e\x88\xef\x12\xf6\xb0\x98\xff\xa2\x34\x14\x27" - "\x64\xec\xa7\x66\x71\xe7\xee\x4f\xcd\x72\xba\x50\xdc\x96\x6f\x31" - "\xa0\x81\x59\xfe\xcc\x33\xa5\x55\xd5\xf2\x7d\x92\xe9\xdb\x2b\x4a" - "\x96\x49\x67\x73\x2a\x4b\x77\x17\x95\x97\xf0\xbd\x7f\x18\x2a\x5e" - "\x23\x6c\x91\x0c\x1a\x13\xf0\xfd\x34\xdc\x0e\xf9\xd9\xbf\xb7\x49" - "\x36\xc9\x79\x78\x87\x7c\x33\x63\xff\xfe\x4e\xa3\xe8\x1f\x26\x5d" - "\xf1\x58\xde\x89\x97\xfb\x87\xa1\x09\x39\x68\xeb\xbf\xa3\xc3\x3a" - "\xef\x0f\xd5\x59\x74\xfe\xd9\x56\x49\x7b\x00\x7e\xbe\x2c\xd0\x98" - "\xe9\x63\x49\xd3\x3b\xb1\x4d\xf2\xf1\x0d\xcd\x65\x09\x3f\xc1\xef" - "\x94\x90\x4e\xa5\x3d\x04\x74\xaf\xef\x00\xbc\x93\x8d\xb6\x08\xca" - "\xd4\xcf\x73\x5d\x89\x99\xbe\x83\x7b\x21\xfe\xe8\x11\x36\x40\x73" - "\x94\x62\x7f\xf1\x3b\xe6\x4f\xb0\x3d\x49\x6b\x14\x8e\x57\x30\xce" - "\x01\xef\x08\x9f\xf9\xd6\xf9\x5a\x69\x9e\x41\x8b\xe9\x8e\x3b\x20" - "\xe1\xa4\xe8\x87\xa6\xf7\xf3\xf9\x4a\xae\x77\xde\xe9\x61\x4d\x29" - "\x65\x7c\x0e\xa8\x69\x7a\x7f\x80\x95\xa9\xe8\x1b\xed\x9c\xc9\x08" - "\x27\x9e\xee\x71\x97\xf6\x4a\xa8\x90\xe7\x5e\xa2\x17\xe1\xea\xe8" - "\x7c\x38\x8d\xeb\x25\xf8\x3a\x1a\xb3\x63\xbf\xd2\x43\x7d\x0b\x4b" - "\xcc\x74\xb3\xe1\xc1\x0e\xec\xdf\xc8\xce\x74\x4d\xdd\xef\xc3\xf1" - "\x6a\xa6\x97\xdb\x9b\xee\x99\x0c\xfb\x3a\x3f\x3f\x97\xb6\x07\xa6" - "\x84\xdb\x99\xc7\x56\xcb\xf2\x17\xa0\xfc\xc3\x90\x80\x38\x9a\x07" - "\xe0\x18\xdf\xc3\x43\x73\xb7\xc4\xc3\x11\xe4\x1b\xf2\xee\x24\x96" - "\xd1\x89\xb6\xf1\x94\x0b\x70\xec\x25\xe2\x5f\x7d\x00\xe5\x7d\x84" - "\xdb\xcb\x1a\xba\xe7\xf4\x3c\x1c\xdb\x49\xbc\x23\x58\xcc\x9a\x72" - "\xc8\xe7\x29\x7c\x98\xfc\x57\x10\xed\xfb\x6a\xb1\x2f\x7a\x86\xe8" - "\x7f\xf7\x3a\xd9\x97\x68\x5b\xf3\x77\x53\x09\x0b\x70\xde\xf3\xfd" - "\x0c\xef\x5e\xdf\xe7\x64\x81\xeb\x16\x60\xdd\xd8\xab\x5f\x57\x82" - "\xcf\x8b\xe3\x40\x9a\xb7\x35\x5d\x22\x1f\x1b\x1d\x28\xdb\x87\x00" - "\xcb\x8d\xaf\xdf\x0b\x5a\xf2\x49\x62\x32\x30\x6f\x9f\xbb\x15\xfa" - "\x0c\xad\xf0\x07\x5f\x33\xd8\x76\xd1\xda\xe0\xcf\x3a\xfe\x68\x6c" - "\xa6\xfd\x63\x93\xf0\x7d\x8b\xfe\x31\x5e\x56\xce\x1f\xcf\xfe\x1b" - "\xfc\xd1\xf6\x6f\xa0\x7f\x82\x7f\xe7\xf5\x14\xfe\x01\x7a\x72\xff" - "\x00\xa6\x01\x16\x20\x1b\xa5\xee\x79\x2a\xe3\x10\xc2\xea\x20\x5f" - "\x1e\xda\xc0\x90\x6e\x32\xd2\xaf\xce\x37\x52\x7b\x77\xa1\x2c\xfd" - "\x0b\xe1\xf8\xfb\xb6\xab\x10\x6f\xab\xfc\x2d\x7f\x17\xb6\xc3\x60" - "\x87\xbd\xa4\x9f\xaf\x25\x93\xef\x12\xba\x1b\x18\xfb\xde\x40\x03" - "\xe1\xe8\x17\x78\x23\xbf\xd4\x72\xfe\xf6\xba\xb1\xfc\xdc\x57\xea" - "\x51\xe2\x07\xe2\xd4\xbb\x41\xf0\xa4\xa7\x1f\x79\xfa\x98\xc4\x9f" - "\xc2\x50\xfe\x1c\x73\x12\x7f\x68\x9f\x48\x60\xd7\x60\x07\xe2\x96" - "\x8b\x3c\x08\xc8\x65\x50\xfd\x23\xae\x8c\xe0\xd7\x5f\x85\x04\x5b" - "\x25\xed\x23\xf9\xd9\x1a\x4d\x81\x3a\x3e\x30\x7c\xa9\xb3\xe1\x1a" - "\xf0\x39\x5c\xea\x87\x1a\x78\x3c\xc1\xfc\x19\xad\x09\x6a\x5d\x89" - "\x77\xb9\xf0\x71\xe3\xe3\x25\x39\xc4\x5f\x1f\xd6\xd7\x21\xc4\xa1" - "\x1b\xeb\xaa\x83\x7e\x85\x8c\xa7\xa6\x93\x5f\x27\xc9\xb6\x08\x86" - "\x37\xa5\x7e\xdf\x87\xb2\x1c\xe0\x63\xa5\x77\xbb\x03\x8d\x39\xfd" - "\x62\x4f\xc1\x4f\x0f\x1f\xc5\x7e\xa5\xb5\x89\x9f\x5b\x4b\x68\x4b" - "\xe2\xf7\x83\xc2\x9b\x7c\x7f\xeb\xcf\xc6\xfa\xff\x9f\xf0\x7b\x47" - "\xdf\xf5\x2a\xf9\xda\xf1\xfc\x64\x49\xce\x93\x31\x8d\xcb\x01\xb7" - "\x38\x44\x9f\xf1\x33\x9f\xdc\xa6\x50\x5f\xbb\x64\xf9\xc7\x76\x8a" - "\x78\xa3\xbc\xf3\xb9\x47\x1c\x1c\xfa\x66\x8e\xcd\x3d\x0a\x39\xff" - "\x79\xb6\x2c\xe7\x48\x5b\x02\xe9\x0b\x6a\xdb\xb1\xfa\x7d\xd4\xab" - "\x3d\xb4\x9e\xcf\xa6\x17\x42\x02\xda\x4b\x09\xc5\x1a\x66\xf7\x75" - "\x91\x1c\x26\xf0\xf6\x23\xe2\xd0\xde\x71\x69\x50\x17\x9f\xc1\x70" - "\xb5\x1c\x4e\x7a\x39\x80\x63\x44\x1a\x9f\xe6\xef\xd1\xb0\xba\x6b" - "\x90\xc2\xe7\x7a\xe4\xf0\x3d\x2e\x4d\x9f\x0e\x68\x7f\x9f\x8f\xce" - "\xbc\x52\x1e\x0c\x57\xa1\x1e\x3f\x85\xe5\xda\x30\x7d\xb2\x9c\x9e" - "\x0d\x15\xaa\xed\xc6\x2e\x4e\x03\xf9\x71\x90\xf5\x3a\x86\xc7\xe5" - "\x1b\x5d\x1a\x5e\xef\x72\x58\x75\x21\xef\x87\xe8\x7c\x1d\xda\x57" - "\x8c\xe3\x73\x81\x87\x2b\xd0\x6e\xe3\x77\xa3\x86\x84\x29\xe9\x2c" - "\x23\xf9\xe0\x09\x09\x53\x21\xce\x30\xf6\x8d\x65\x37\x3c\xc7\xed" - "\x48\x5d\xfe\x1e\x84\x47\xe5\x3c\x27\x95\xbd\x87\x81\xf0\xed\x25" - "\xc2\x44\x9f\x77\xbc\x65\xcc\x66\x24\xfb\x67\xa8\x90\x97\x1d\x18" - "\x2a\x54\xfa\x87\x0a\x55\x54\x3e\xc1\xa2\x79\x46\x7e\x47\xab\xcf" - "\x09\xe4\x57\x92\x35\xbe\xa7\x65\xb4\x9f\x13\xe1\x72\x7c\x8c\x38" - "\x8e\x4f\x7c\xcf\x1a\x7d\x3d\xf1\x48\xb7\xad\xee\x09\x6c\x17\xef" - "\x91\xec\x83\x5f\x9b\x15\xaf\x7f\x8e\xd6\x80\xde\xfb\x1e\xc9\xa0" - "\x1f\x75\x85\x3f\x31\x2b\x7e\xbe\x13\x14\x75\xd8\xfe\xc4\x38\xef" - "\xbd\x7b\xc9\x07\x92\x29\xc0\x18\xbe\x67\x90\xfc\x6b\x06\x69\x1d" - "\x30\x2b\x81\xaf\xbd\x25\x35\xd9\xec\x5e\x27\xf4\x98\xff\x02\x3d" - "\x3e\xbb\xf9\xd4\x55\x97\x5a\xac\xc1\xa9\x09\xee\x1a\x8a\x33\x61" - "\x9b\x2b\xf2\x77\xc4\x9c\x8b\x23\xfb\x17\x79\xf7\x57\xa1\xdf\xdf" - "\xeb\x90\xed\xde\xaf\xa0\xc1\x4b\x7e\x94\x68\x8d\x3e\xd0\x64\xa0" - "\x71\xae\x89\x79\xd2\x61\xfe\x5e\x1a\xf7\xbe\x77\x66\xaa\x1b\x72" - "\x25\xb8\x57\x24\xb8\xde\x1b\xc1\x25\xb9\xed\x69\xe1\x73\xbf\x48" - "\x93\xa1\xd3\x8f\xb0\xfd\x49\x06\xda\xc3\x67\x32\x5d\xa7\x39\x90" - "\x5f\xae\xc4\x72\x3a\xfb\x7c\x67\x80\xfc\xb1\xb5\x05\xb0\xbf\xbd" - "\xa2\x03\x69\xbd\xd1\x74\x19\x7e\x71\x47\x80\xa5\x6b\xd1\x3e\xa7" - "\x39\x4f\x13\xe9\x6a\xb2\xf5\xeb\xfc\x30\xc1\x5e\xe3\x00\xf2\x27" - "\x84\x30\xee\xfd\x1d\xcd\x2f\xa3\xbe\xf3\x33\x9d\xf2\xd7\xc3\x0e" - "\x68\xc0\x3e\x80\xfb\x17\x3a\x30\xfd\xcd\xa9\xfb\xe1\x7e\xa6\xd4" - "\xf0\xf5\xe4\x40\xa3\x15\xc7\x37\xef\xe9\xc4\xfa\xe6\x7c\x7d\xc8" - "\xda\xa6\x0a\xcb\xfa\x80\xd6\x36\x99\x36\xd3\xd9\x4a\xf3\xbd\x89" - "\x4d\x1d\xae\xc4\x46\x2b\xc3\xba\xf3\x58\x7e\xe1\x70\xc0\x71\xde" - "\xaf\x1f\xa6\xbd\xb4\xbc\xcf\xf8\xe5\x1a\x57\x62\x05\xdd\x89\x45" - "\x77\x2d\x29\x02\xbb\x7c\x9d\x0d\x5f\xa2\xfd\xc2\xf9\xf2\xcb\x79" - "\x7d\x83\x1e\x1b\xb3\x56\xb4\x50\x7b\x92\xca\xd0\x60\x19\x7e\xd6" - "\x58\x81\x32\xf9\x4b\xa9\x6f\xe6\xef\x3a\x8a\xf7\x8d\xd2\xde\xdf" - "\x5f\x1c\x6e\x1d\xa1\x39\xb6\x5f\xe4\xa0\x7d\x67\x1b\xd2\x56\xb4" - "\xac\xd7\x99\xb1\x7f\xff\x65\xb1\x43\xf9\xe7\xd5\xd2\x98\x9b\xfb" - "\x4c\x8a\xb9\xbe\xfd\x96\x6e\xb2\x1d\x81\xa0\xad\x9a\x7c\x11\x3e" - "\xf8\xd3\x88\x05\x94\xa3\xd8\x47\x8f\x28\xd1\x4e\x7f\xab\x30\xa1" - "\x7e\x1a\x64\x61\xdc\xb4\x8b\xf0\xcb\x7f\xf4\x29\x21\x19\x1f\xad" - "\x6b\x7a\xd9\x24\x84\x9b\x4b\xf3\x11\xbd\x57\x69\xfc\xf9\xbe\x38" - "\x27\xfc\x26\xa4\x05\x10\x1e\xcd\xa3\x36\x4c\x83\x34\x9a\x13\xc0" - "\xb0\xf4\x22\xbf\x58\x63\x90\xc7\x2f\x07\xa6\x41\x46\x78\xb9\xbf" - "\x94\x7c\x21\x7d\xc0\xef\x8c\xdb\xed\x82\x19\x86\xfb\xd8\x79\x84" - "\x4b\x3e\x68\x19\x9b\xae\x53\x8a\xb5\xb8\xf7\xf7\x68\x5a\x84\xfc" - "\xf1\x39\x75\x94\x3b\x5a\xb3\x90\xe6\x6a\x15\xdc\x57\x54\x52\x76" - "\x0b\xed\xbd\x0c\x99\x93\xd1\x72\x3c\x24\x3f\x2f\xfe\x03\x77\x16" - "\x13\x0c\xc2\xa7\x68\x8b\x98\xe7\x25\x1f\x30\xc8\x57\xee\xc7\xf7" - "\xf0\x9b\x90\xf0\xf2\x9b\xa0\xed\x7d\x86\xd3\x75\x5c\xb4\x49\x35" - "\x10\xbe\x01\x2b\xb5\x37\x94\x0d\xc4\x9b\xca\x23\x19\xe9\xf3\x5d" - "\xb1\x99\x6a\x58\xc0\xf6\x1c\x9d\x3f\x7c\xff\x0b\x5b\xd5\xfb\x90" - "\x4f\x3e\x73\xe8\xdc\xfc\x66\x70\xb5\x23\xbc\xf6\x69\xa0\x45\x58" - "\xd7\xec\x15\xa4\x73\x75\xb3\x6d\x55\x27\x10\xf6\x07\x93\xa8\x6f" - "\x7b\x05\xf9\x23\xfa\xb8\x0f\x4e\xd9\xbd\xfd\x40\x3e\x72\xd7\x1a" - "\x98\x9f\xe0\x60\x9a\x07\x38\xbd\x6f\xe9\xf4\x45\xc2\x4f\x0f\xa7" - "\x75\x6c\xfe\x5c\xa2\xc3\x7e\x95\xc3\xdb\x60\x2f\x46\xbb\x5c\xa2" - "\x49\xe6\xb5\x90\xaf\x0f\x1a\x6d\x55\xc7\x80\xea\x87\xd2\xe3\xb7" - "\xd9\x3e\x88\x69\x2f\x85\xd7\x0b\xa5\xc1\xb8\x8f\x10\xee\x3d\xc1" - "\x75\x21\x5a\xaf\x08\xa6\x69\x45\x7a\x90\x57\xee\xb7\x90\x47\x62" - "\x1e\xed\x83\x54\xc2\x15\xeb\x2e\xc5\x5e\xf3\x97\xe8\x7b\x9e\x51" - "\x07\xa0\xdc\xef\xef\xe3\x73\xe1\xbf\x9a\xb2\xd6\x17\x60\x42\xaf" - "\xfd\xca\x86\x36\x60\xa7\x03\x7f\x49\x27\x70\xbd\x92\x49\xfe\x97" - "\x7e\xf5\x89\x46\x21\xea\x97\x68\x21\xfb\x2b\x5a\x1d\x87\xcc\xd3" - "\x6b\x09\x57\xb9\x8e\x99\xf6\x48\x77\x80\xd6\x5f\xa6\x21\xbf\x47" - "\x75\x20\xe4\x8f\x59\x11\xee\x47\x92\x8d\x5b\x22\xf5\xcd\x25\x43" - "\x89\x59\xc9\xec\x05\x1d\xc8\xfb\x1f\xb0\xfd\x6a\x8b\xc4\x9e\x12" - "\x1d\xe9\xaa\x76\x25\x93\xee\x39\xf9\x95\x4d\xca\x5b\x2c\xfc\x8e" - "\xfd\xca\x8c\xf9\x8b\xa3\xd2\xab\x9a\x46\xbe\x56\x4d\xe4\x93\x88" - "\xaf\x93\xa3\xce\xc2\x7e\x61\x82\xdd\x3d\xc2\xcf\xa8\x5c\x80\x0f" - "\x97\xd1\x7d\xb5\xb4\x0f\x5d\xc6\xed\x9b\xcd\xa9\x7f\x18\x2f\xe6" - "\xd6\x3e\xcc\x93\xc7\x8d\x4c\x8b\x3c\xb6\x68\xb8\xbf\x54\x5a\x77" - "\x75\x27\x1e\x41\x9b\xe2\x3d\x10\xed\xe6\x43\x03\x4b\x14\x7a\xb7" - "\xc8\x0b\x66\xa2\x4b\x1a\x3f\x4d\x20\x9a\x11\x8e\x15\xc7\xb4\x2b" - "\x84\x6d\x21\x60\xc7\xf4\x41\x2c\xd3\x86\x34\x89\xf3\x4b\x47\xba" - "\x39\x6d\x74\x06\x97\xd3\xd6\x39\x85\xcf\x65\x7d\x33\x7a\xfa\x05" - "\x6f\x8f\x9c\xb1\x4d\x23\x18\x1f\xbd\xcb\xf7\x07\x61\x9d\x88\x39" - "\xc7\xce\x62\x36\xf9\xe5\xc9\xdf\x0c\x66\xa7\xd8\x57\x6c\x7d\x0f" - "\x5e\xa3\x3b\x02\xf8\x9e\x64\x3a\x37\xf2\xd1\x2b\xa8\xd3\xf9\xf8" - "\x64\x08\xcb\x43\xf9\x08\xd1\x43\x1f\x69\xa9\xae\x32\xdf\x87\x5c" - "\x21\x87\x1f\xc5\xd1\x9c\x92\xf0\x11\xdf\x79\x02\xe5\x5e\x9a\x93" - "\x93\xf7\xca\x28\xf8\x5e\x99\x50\x1d\xfb\x0d\x71\x14\x77\x64\x26" - "\x59\x0d\xf8\x7e\x8c\xef\x11\x44\x7c\x77\xfb\x64\xfd\xd7\x79\x8c" - "\x0d\xb3\x01\x9a\xf3\x23\xfb\xa9\x88\x74\x59\x9d\xf0\xe1\xe1\xb1" - "\x7c\xb4\x42\xb6\x55\xc8\xb6\xa6\xbd\x50\x94\x0e\xeb\xfe\x0a\xa5" - "\x11\x3e\x06\x2e\x4a\xe7\x19\x3e\xda\x28\x9d\x55\x48\xa7\x7d\x4a" - "\x98\x17\xf5\xdd\x59\x5e\xdf\xc4\x03\x2a\x9b\xe3\xae\xa4\xf9\xac" - "\x8f\x5a\x83\x73\xac\x9d\x7c\x5f\x94\x38\x6f\xf4\xd1\x09\x59\x46" - "\x90\xde\x09\xc2\x2f\x70\x67\xea\xe9\x0c\xe0\x32\x30\xc4\x74\x93" - "\xe7\xb4\x92\x4c\x7e\x74\x2e\x94\x4f\xf9\xbe\x80\x49\xe8\xa0\xce" - "\x2e\xc6\xdb\x7a\x67\xd7\x57\xdb\x15\x7f\xbf\x40\xb6\x49\x04\x9f" - "\xb5\xa8\x5f\x4e\xf8\x38\xaf\xad\x29\xdd\xe4\xcb\xeb\x85\x3a\xf2" - "\x47\xf8\xf7\x5f\x92\xaf\x47\x9f\x35\xc5\xe9\x37\xe9\xc8\x8f\x3c" - "\x04\xac\x29\xde\x0b\x06\x50\x16\x19\x68\x5e\xb9\xa2\x98\xc6\x8b" - "\x38\x1e\xd5\xb2\x24\xb4\x53\xb0\x9d\xef\x2b\x07\xcd\x93\x65\x08" - "\xdb\x94\x9e\x4c\xbe\x18\xc9\x0f\x23\xf9\x52\xf5\x9b\xd2\x93\xf0" - "\xfd\x56\xb4\xeb\xb4\x4c\x9b\xd2\x4f\x6b\xd3\x7e\x0b\x43\x7d\x7c" - "\x8e\xfc\x41\x2a\xed\x2e\x2f\xec\xbb\x04\xf1\xe4\xeb\xd1\xd7\x58" - "\x61\xec\x73\x7f\xca\xc7\x4a\x53\x0d\x90\x8c\x76\x48\x0a\xf2\x5c" - "\x17\x48\xac\x28\xc6\x3e\xbe\x44\xd0\x7d\x85\x09\xba\x05\xde\x84" - "\xbf\xd0\x71\x33\xbc\x75\x1c\xf7\x13\xaf\xf9\x10\x7e\xc0\x3a\xc7" - "\xed\xb7\xce\x71\x89\x33\x33\x3d\x50\x57\xc3\x9c\x76\x77\x0f\x8e" - "\xdf\xae\xf1\xbb\x2f\x68\xed\x9b\x68\x24\xfa\xa8\xec\x3f\x5e\xbd" - "\xc4\x7d\x57\xfa\xf0\xdb\x54\x21\xe5\x19\xc4\x3c\x83\x3d\x30\x62" - "\x9d\xc3\x69\xef\x73\x8b\xbc\x45\xfc\x9d\xf2\x87\xf0\x41\xa2\x79" - "\x8c\x0f\x48\x3b\xd1\x47\xf4\xfb\x88\x27\xc8\x03\x89\x56\xdd\xa8" - "\x44\x27\xd1\xf8\x07\xec\x75\xde\x44\x3a\x91\x56\x4e\xe7\x28\xd2" - "\xd9\x5d\x06\xe0\x6d\x3a\xe2\xb8\x9e\x34\xc7\x45\xe3\x5d\xd3\x9f" - "\xd0\x96\xaf\xb5\x02\x8e\x6b\xd5\x1f\xd4\x59\x95\x3f\x41\xdb\xa4" - "\xce\x85\xe3\x5b\x17\x73\xf6\x21\x4d\x76\x03\x3e\xbe\x56\x20\x1b" - "\x47\xb6\xdb\xb1\x6c\xdd\x1f\x03\x7f\x83\x3a\x27\x73\xa2\x8d\xea" - "\xb5\xfb\x30\x4d\x19\xd2\x8f\xe3\xe1\x0b\x12\xfe\x94\x76\xdf\x97" - "\x82\x2e\x4d\x05\x24\x7f\xfc\xc4\x21\xa5\xbd\xff\x10\xc8\xb4\x3c" - "\x85\xe9\x90\x1e\x1d\xc2\xe2\x77\x2e\x06\x90\xce\xb7\x10\x4f\x6f" - "\x08\x4d\xbd\x83\x5e\x84\xf9\x67\x98\x5c\x00\x8a\x37\x2f\x23\x1d" - "\x97\x41\x67\xad\x43\xfb\x6b\x1d\xd9\x8d\xff\xd0\x7b\x53\x21\xa4" - "\x39\xe0\xef\xc5\x7d\x5d\xc2\xb7\xdc\x2d\x17\xe1\xc4\x35\xd9\x7f" - "\x5c\x80\xfc\x6f\x26\x56\xd4\xfe\xbf\xec\xbd\x7f\x40\x54\x55\xde" - "\x3f\x7e\x66\x40\x25\x45\x19\x08\xd9\x51\x29\x47\xc5\x9e\x69\x97" - "\x04\x4b\x4d\x7b\xdc\x8d\x12\x7b\x2c\x7f\xd6\xaa\x0f\xb5\xfe\x80" - "\xc2\x16\x0d\x6d\x44\x44\x54\x04\xc4\xe2\xb1\x4d\x71\x30\x74\x51" - "\x11\xe9\x59\xeb\xc1\x16\x8d\x9e\xb5\x16\xcb\x74\x4c\x6c\xd1\x80" - "\x21\x97\x7a\xc8\x25\x1b\x09\x0d\x09\x75\x92\x01\x46\x98\xb9\xf7" - "\xfb\x7e\x9f\x73\xef\xdc\xb9\xe3\x0c\x38\xa6\xd9\x7e\xf6\xfb\x07" - "\xdc\x39\xe7\x9e\x7b\xee\xb9\xef\x73\xce\xeb\xbc\xdf\xef\xf3\x3e" - "\xef\x37\x8e\x23\xea\x4b\x0e\xd7\x8c\x0e\x18\x33\xb8\x47\xbd\x0a" - "\xde\xd1\xa1\x0d\xa1\xed\xc9\x62\xfe\xe7\x20\x8d\xbe\xb0\xd1\x1e" - "\x5d\x01\xcf\xa5\xf2\x40\x33\xac\x1f\xf8\xb9\x78\xbc\x22\x0d\xdd" - "\xda\x0e\x1d\x20\xe3\xe1\x9d\x1a\x94\xe5\x4b\xd3\xcd\xca\x57\x0f" - "\x90\x70\xef\x30\xe5\xfd\x30\x4f\xf8\x8d\x3a\x49\xac\x0f\xbe\x2d" - "\xa8\x99\x7c\x70\x97\x7c\x8e\x69\x28\x96\x31\x1c\x7c\xbf\x06\x75" - "\x7e\x5e\xbe\x97\xf9\xad\xcc\xe2\x37\x7a\xf9\x5c\xad\xd8\x0e\xf8" - "\xed\x31\xd6\x88\xf7\x74\xf8\x20\xdc\x53\x5d\x9b\xb7\xd3\xb3\x71" - "\x19\x39\xdb\x01\x2f\x80\x57\xc0\xd8\xee\xc8\xd7\x95\xef\xb5\x90" - "\x15\xbb\x89\x5f\xc6\x25\xd4\x31\x4d\x27\xc7\x0b\x22\x49\xe1\x55" - "\xf4\x09\xa1\x0d\x7a\xe3\x2a\xee\x33\x32\x0c\x41\x9e\x14\x75\xa7" - "\xfc\x0a\xad\x6a\xcb\x76\x91\x87\xff\xa0\x2d\xad\x8d\x28\x59\xbc" - "\xd1\x0f\x2c\xd1\x1a\xde\x96\xa7\xe4\x12\x0a\xd0\xb7\x62\x90\x1e" - "\xe3\x45\x25\x88\xbe\x06\x29\xef\x93\x0a\x73\xae\x55\xdd\x77\x73" - "\x12\x09\x47\xbf\xa8\x01\x66\xc6\xcb\xb1\xf5\xfa\xaf\x61\xd0\x3e" - "\x95\xb0\xb7\xa6\x62\xfe\x07\xdf\x4f\xdc\x73\x95\xea\x3b\xf1\xfe" - "\x1c\x3b\xc8\x32\xb4\xde\x24\x12\x56\x70\x95\x68\x91\x0f\x5a\x78" - "\x9e\xf1\x6c\x28\x1f\x4e\x6f\x09\xe0\xed\xdf\x6b\xc9\xee\x66\xc9" - "\x6f\xaa\x79\x05\xfa\x5a\xe5\xd5\x9e\xce\x03\x6e\x09\xa1\x7b\xe9" - "\xd4\x17\x16\xda\x07\x40\x9a\xe4\x6d\x25\xbe\xc7\x43\x09\x41\xbd" - "\x21\xee\xcb\x1d\xb7\xb1\xf3\x18\x1d\x59\x7f\x2d\x17\xfd\x4a\xba" - "\xc7\xf2\xad\x45\x11\x94\xc7\xda\x5a\xe4\x5d\xbf\xfd\xb5\xd1\xa3" - "\xac\x02\x75\xe2\x38\xb8\xb9\x7a\xcb\x26\x76\xc3\xd7\xf8\x72\x7a" - "\x26\x9b\x71\xbd\x41\x66\x34\x77\x18\x98\x3f\xa4\xb2\x32\xe3\x2b" - "\x9c\x93\x3c\x56\xb6\x03\xef\x61\x1e\xfa\x98\x88\xa2\xfd\x5e\x66" - "\x42\x19\x4d\x90\x73\x8f\x6a\x1c\x79\x8c\xdf\xc2\x75\x17\xe9\xb5" - "\x87\xf9\xac\x1a\xd0\x91\x55\x66\x13\xd7\x5e\xe4\x41\x98\x3e\xfa" - "\x90\xca\xa4\xfc\xbf\x57\x3c\xd1\x12\xf7\x4c\xa8\xff\x2c\xb4\x75" - "\x41\xbf\x96\x59\x87\xa2\xc4\xb5\x98\x9e\x73\xdd\x30\xf8\xf1\x15" - "\xab\x49\xe8\x6f\x07\xf9\x11\xdc\x97\x82\xb2\x4d\x8c\x47\x38\x94" - "\x20\xe9\xf0\xa3\xe8\xd8\xc0\xf3\x52\x54\x1e\x42\x3f\x44\xcc\x9f" - "\x6b\x8b\xe8\x8f\x88\xf1\x0a\x87\x5e\x75\x7a\x4f\xb1\x63\xcd\x87" - "\x77\xe0\x7e\x2f\xd6\xcf\xf8\xa8\x43\xf3\xa8\xcd\x3d\x94\x63\xbc" - "\xc0\xa1\x79\xdd\xd0\x57\x8b\xf4\xe5\x04\xd9\xd7\xd8\xf2\x1d\xa3" - "\x6f\x2a\xf1\x41\xbb\xd6\xa3\xe9\x26\xdf\x01\xcc\xcf\x60\x00\xbc" - "\xff\x1a\xde\xc7\x79\x69\x18\x85\x7a\xd0\x0f\xe7\x18\x91\xc7\xe8" - "\x8a\xf1\x9f\x81\xfa\x09\x2a\x37\x7c\x18\x8d\x36\xa7\x90\x17\x74" - "\xe4\xb2\xd5\x77\xcb\x1a\x12\xce\xfc\x3a\x7d\x48\xcf\x89\x99\x7f" - "\xf1\x52\xc7\x88\x60\xa2\x1e\x91\x47\xb4\x1d\x59\x1f\x26\x82\x2c" - "\x6c\xa0\xfa\x36\x7c\xff\xd6\x7d\x91\xd4\x06\xb6\xd3\xd4\x8b\xf5" - "\xd5\x47\x77\x41\x5a\x2b\xa5\x3f\x7c\x4b\xd8\xbf\x01\xbe\xe8\x23" - "\xbf\x3d\x97\x29\x2f\x55\x43\x75\x62\xfa\xdc\x7c\xc9\x7e\xe0\x23" - "\xe6\x87\x03\xae\xc7\x75\x84\xa0\x3d\x69\x61\x08\x5f\x03\xef\x03" - "\xfe\xe7\x50\xa8\xa0\x43\xaa\xa1\xe3\x0a\x79\xf3\x6c\x94\x17\xbf" - "\x33\xa0\x4d\x2a\xae\x69\xc0\xcb\x45\x31\x79\x23\xb7\x94\x83\xf1" - "\x23\x7d\xff\x87\x2b\x51\xcf\xea\x16\xbf\x77\x12\x42\x9f\xc9\xd5" - "\xd7\x51\xbb\x93\xdc\x7d\x1b\xe1\xea\x07\x73\xa1\x18\xae\xfe\x30" - "\xe6\xf0\xaa\x82\x6b\x11\x5c\x83\xe1\xbe\x0e\xc7\x25\xc8\xdb\x6a" - "\x8c\xc7\xd3\x1a\xa8\xaf\xf1\x64\x3b\x8e\xb4\x31\xbe\x32\x97\x30" - "\xdb\xba\x8f\x5a\x30\x16\xcb\xcc\xdd\x84\xac\xb0\xf1\x9d\x9a\x7b" - "\x49\x1f\xf8\xde\x96\x8c\xdd\xb8\x07\xfe\x91\x41\xbe\x07\xfe\x91" - "\x89\x90\xc3\x1a\xf8\x83\x9c\xc3\xc0\x47\x7e\xd4\x22\xfd\x1d\x36" - "\x75\x64\x7d\xd4\x02\x74\x64\xbe\xa6\xbc\x9a\xaf\x1f\xd1\x18\x79" - "\x5b\x50\x86\x0b\xd4\x15\xb1\xef\x2d\x36\x41\xda\x8f\x0f\xdc\xa7" - "\x11\xbe\xb7\x0c\xd2\x2a\x4d\x06\xac\xc1\x81\x40\x93\xc1\xf0\xcd" - "\x81\xfb\x36\xe2\xf7\x62\x7b\x5b\x03\xb7\x16\x3b\xdb\xcd\x63\x9d" - "\xf8\xfd\xe6\x40\x78\x0e\x68\xc9\x8f\x1a\x15\x25\xd2\x53\xa0\x13" - "\xda\x1a\x2b\x5b\xa1\x0e\xc6\xb3\x41\x79\xa8\x43\x2c\xef\xa0\xfd" - "\x60\xf4\x91\x02\x7d\x0a\xe5\x40\x7e\xf7\x13\x6d\xf2\x3b\xb2\x0e" - "\xd7\x1d\x4b\x64\xfb\x2a\xf8\xac\xc5\xe9\x59\x3c\x07\x2d\x7b\x3e" - "\xd0\xa9\xef\x06\xa3\xaf\x80\x44\x3d\xeb\x3b\xbd\x49\x68\x4b\x30" - "\x6b\x4b\x2e\xc8\xad\x1f\x5d\x62\xed\x39\x5c\xe9\x69\x8e\xa5\x0f" - "\x03\x1e\x15\x38\xf7\x08\x26\xbb\x4e\x34\x86\x5a\x88\xb1\x80\x03" - "\xbe\x25\xb7\x26\x2a\x9d\x37\x5c\x20\x1f\xbf\x55\x6d\x6d\xf2\x72" - "\x4d\xff\x98\xc5\x48\xeb\xcc\x24\xc6\xb4\x07\xa9\x2c\x79\x99\x1c" - "\xf9\xc2\x68\xa6\x67\x94\xf0\x37\xb5\x87\xc4\xfd\x69\x5c\xdf\xd0" - "\xf7\xaf\xa8\x27\xe0\xa0\x6c\x21\xe6\x43\x1e\x9e\x9b\xdc\xe3\x74" - "\x8f\xdf\xaa\x2f\x63\x73\xed\xc8\x66\xe4\x8f\x68\x7b\x6d\xff\x61" - "\xc0\x36\x73\x7a\x7d\x19\x7e\x43\x06\xda\x0e\xdb\x3a\x0c\x38\x57" - "\x34\x29\xa8\xf7\x3c\xb2\x18\xc6\x23\xcf\xe5\xea\xcb\xbc\xfb\x86" - "\x23\x63\xf0\x9d\x19\x36\xfe\xb2\x39\x50\x5f\x86\x7c\xd5\x96\xf4" - "\x5e\x7e\x93\x0a\x78\x43\x6b\x50\x2e\xcc\xd7\x23\x9b\x8e\xa5\xb2" - "\x3e\xf3\xb2\xde\x4d\xe2\xb7\x17\x0a\xdf\x0e\xf4\xa2\x63\x36\x22" - "\x9f\xf9\x54\x86\x32\xe5\x9e\xd7\xb2\xdc\x52\x5c\xcb\x60\xcd\xb8" - "\xc6\x68\x71\x34\xd8\xb1\x66\x78\xd5\x8e\xa3\xc1\x37\xf0\x8e\x2e" - "\xe1\x1d\xa9\x37\xf9\x8e\x6e\xce\xc7\x50\x9e\xf1\x1e\x90\xfe\x7d" - "\xbd\x97\x7f\x8f\xd6\x30\xdb\xa6\xdc\x32\x86\xa5\xc7\x56\xda\x41" - "\x06\xb5\xa9\x8a\x4d\x34\x0e\xb5\x92\x64\x1a\x4d\x36\x62\xd3\xeb" - "\x8a\xaa\x52\x3b\x89\x21\xe5\x34\x69\x24\x06\x1a\xff\xa0\x2a\x19" - "\xe5\xce\x7d\x9a\xae\xad\x5b\x35\x5d\xca\xa3\x18\xab\x27\x61\x37" - "\xfa\xaf\x76\x1a\x67\xd5\x96\xd3\xc4\x18\x8b\xba\xe2\x1a\xd4\xd1" - "\x03\x46\x14\x9b\x38\xc0\x0c\x90\x33\xec\x94\x1e\xc0\x83\x31\x99" - "\x71\x7b\x05\x95\x19\xcd\xd4\xaf\x5b\x7f\xe0\xdd\xfd\xf9\xac\x4d" - "\x36\xd4\xe3\xdb\xbb\x62\x34\x1d\x59\x64\x16\xfa\x92\x46\x1d\x3a" - "\xaf\x8a\x20\x33\x6d\x3e\x3c\x95\x09\x41\x7e\x41\x9f\xd2\x46\x8b" - "\x89\xd8\x41\x16\x28\x68\x27\xc1\x05\xc0\x3f\x03\x96\xab\x10\xef" - "\xf7\x08\x3e\xa5\x37\xb7\x4b\x3e\xa5\x0b\x51\x5f\x55\x07\xbf\xdb" - "\x89\xaf\x3d\x77\x7b\xc5\xae\x76\x12\xb6\x3b\x85\x68\x77\xa1\x3e" - "\xf2\x22\xe3\xdf\x90\xdf\xa0\xfe\xa5\x5f\xd6\xe2\xbe\x88\xc4\xbf" - "\xe1\x19\x3b\x09\xcf\x7c\xa9\x1e\xc7\x2b\x7a\x1f\xa3\x36\x59\x36" - "\xbd\xbe\xce\xa6\xda\xb7\x11\x68\x07\xeb\xbb\x21\xb9\x4b\x79\xc4" - "\xad\xbf\x45\xd1\xfe\x24\xcf\xc9\x27\xf8\xb1\x30\x86\xfb\x50\x97" - "\x47\xdf\xc4\xf6\x5d\x31\x24\xa2\x85\x44\xb2\xf3\x2d\x77\xc1\x5a" - "\xf9\x49\x28\xda\x24\xa6\x2f\x25\x6a\xfb\xae\x79\x8a\x8c\x37\x89" - "\x8f\xd1\x16\x45\xf0\x2f\xfd\x07\xbe\x29\x22\x91\x44\xe2\x5e\x0a" - "\xee\xfb\x68\xd6\x62\xf9\x63\x97\xc2\xd2\x48\xa4\x73\xdd\x4b\x57" - "\x27\x2d\x1e\x1d\xf9\xfb\x45\x9a\x17\x17\x27\x2d\x5d\x15\x97\xb4" - "\x88\x4c\x61\x26\x1c\xd4\x65\xe6\x6a\xb4\xdf\x58\xb5\x38\x39\x41" - "\xf3\xc2\xca\xa4\xa4\x45\xcb\x92\x35\xd3\x27\xcd\xba\xde\x6f\xd2" - "\x2e\xf5\x5e\xea\x27\x8f\xda\xf6\x1d\xaf\xe2\xff\xf8\xab\xf6\x9c" - "\x14\xe2\x1b\xb0\x7e\xf2\xec\x00\xdb\x14\x0d\x8b\x2b\x71\xdc\x8c" - "\xb6\xb4\x7c\x46\x4c\x3e\xe3\xb5\x8f\xff\xc0\xe4\x93\xb1\x1b\xd9" - "\x99\xcd\xe3\x54\x4f\xcc\x77\x4c\x09\x65\x73\xea\xb8\xc2\x27\x99" - "\xe0\xef\xa5\xf8\x3b\x20\x99\x6c\x34\x0c\xc6\xfd\xfa\xe3\x6c\x5f" - "\x65\xd7\x34\x85\x58\x4e\x2c\xc3\xee\x7f\x62\xc2\xfb\x85\xd4\x87" - "\xd8\x27\x5a\xa0\x4f\x50\x47\xd6\x71\xb5\xc9\x77\x88\x68\xb3\xd4" - "\xc4\xec\xef\x8e\x53\x3f\x42\xfc\x1f\x87\xb4\x0b\xf5\xcc\x82\xf7" - "\xf5\x83\xb2\xd1\xd0\x07\x95\x82\x9d\xde\xd0\x06\xa1\x5d\xcc\x16" - "\xf6\x93\x47\x98\xad\xc9\xf1\x04\xa7\xf3\x7a\xf4\xac\x22\xae\x99" - "\x02\xaf\xda\x21\xd4\xb7\x49\xc4\x04\x28\x9f\x0f\xfc\x9e\xc6\x7b" - "\x2c\x3c\xce\xce\x55\xca\xce\x87\x0b\x74\xda\xa5\x7e\x1b\xf0\x21" - "\xb4\x99\x7c\x92\xe9\x3a\x5e\x1c\x3d\xf8\xe4\xb2\x17\x5e\x5e\xaa" - "\x8b\x4b\x5e\xfc\xfc\xe2\xc4\xc5\xc9\xab\x1f\xa1\x01\x52\xe8\xbf" - "\x27\x46\xc6\xcf\x76\xf5\x79\x19\x8e\x7a\x22\x3c\x1b\x85\xb2\x3e" - "\xea\xe7\xd0\xc6\x82\xe9\xeb\xca\x5f\xa3\xbe\xed\xbc\x6a\x7b\xb9" - "\x70\x7e\xb2\x3c\xcf\xa4\xfc\x32\x8f\xe9\xad\xb6\x16\x19\x86\xdb" - "\xb1\x3e\x7a\xaf\x55\xb5\x4f\xa7\x19\x4c\x26\x36\x90\x8a\x89\xb8" - "\x67\x07\xf4\x2b\xc6\xf5\x30\x67\x0d\xae\x5b\x26\x52\x65\x7b\x50" - "\x88\x6b\x77\x62\x07\xd2\x00\x79\x45\xa0\xc1\xde\x06\x72\x82\xc9" - "\xd8\x57\xd4\x7b\xd1\x76\x89\xbb\xa2\x7e\x1b\xc7\x16\xb6\x97\xe3" - "\x63\x76\xf1\x7c\xcc\x4e\xee\x4a\xc2\x2e\xfe\x4a\xc2\x4e\xc9\xdf" - "\xce\x89\x64\x78\xb6\x04\x9e\x5d\x8d\xfe\xfb\x73\x2e\x93\x12\xb4" - "\x07\xc0\x74\x40\xb2\x8a\xd8\x55\xb9\x45\xd8\x1e\x63\x53\x24\xe5" - "\xc3\x1b\xa1\xbc\xd1\xf2\x20\x01\x1e\xb3\x18\xed\x31\xd8\xde\x23" - "\xf0\x81\xf0\x9c\x11\xda\x65\x6c\xea\x44\xb9\xbe\x88\x03\x5e\x10" - "\xbe\x75\x2f\xac\x9f\x35\x58\x2f\xda\x83\x00\xbf\x0a\xfc\xd9\x89" - "\x4d\x26\xf2\x89\xb8\xe7\x49\x6d\x41\xe4\xfd\x78\x62\x3f\xd0\xb9" - "\x8f\xe8\xe3\x13\xd7\x12\x94\x19\xa4\x73\x91\x27\xbe\xc0\x6f\xc4" - "\xfd\xfc\x19\x16\x9e\x2b\xa4\xf7\xee\x1d\xef\xb4\xbf\x8e\x65\xa8" - "\x7f\x6b\xb4\x67\xd1\xad\xc1\x38\xa7\x9f\x06\xb2\xf1\x72\xef\xc3" - "\xe6\x8c\x04\x1f\xa1\x5e\x3b\xd6\x8b\x7e\x64\x18\x2d\x3f\x1d\x6d" - "\x7c\xe5\xb2\x68\x47\x02\xed\xf8\xf4\x0b\xa1\x8e\x16\x9c\xcb\x5c" - "\xd6\x71\x1b\xda\x52\x53\xbf\x91\xec\x2c\x92\x02\xe4\x53\xf4\x53" - "\xa4\x2a\x0c\x62\xfe\x65\x3b\xb2\x3e\x75\x8c\x7f\x5e\xc5\x78\x41" - "\xe4\xc7\x30\x3e\x09\x8e\x7f\xe4\xed\xb0\x7d\x38\xfe\xa1\xfe\x3c" - "\xdc\xb7\x67\xf3\xe0\xd3\xa2\x9b\x9b\x07\x9f\x16\x89\xb4\x60\xf2" - "\xe3\xa7\x91\xbc\x32\x83\x8f\xd8\x44\x62\xa9\x7d\x85\x70\xde\x8e" - "\x57\x8d\x12\x7c\x17\x56\xdc\x43\x6d\x63\x52\x5a\x8a\x00\xe3\x33" - "\xf7\x74\x12\x7f\x4e\x3f\xca\x8a\xbc\x78\x55\x1a\xb5\x4b\xf1\x83" - "\xe7\xa8\xdd\x0a\xda\xe1\x0d\xa0\xb1\x6f\x4e\x93\x3d\x6d\xc4\xb7" - "\x91\xfc\x4d\x8b\x7b\x5b\x52\x3f\xfc\x6d\x1d\xee\x69\xf2\x5b\x87" - "\x94\x06\xa4\x29\x37\x62\x1d\x5c\xfb\xa5\xf1\xe2\x73\x78\x2e\x0e" - "\x9f\x6b\x20\x7f\x8b\xa3\xcf\x61\x59\xa4\x59\xba\x6a\x1e\xf0\x5c" - "\x75\x58\xde\x06\xbc\x58\x21\xa7\x9a\xc5\xc3\xda\x60\x4f\xb1\x95" - "\xc2\xbd\xd9\x9c\x7e\x6b\x31\xe4\xc5\xd0\x3d\x95\x2e\x35\xee\xb9" - "\xc2\x58\x4b\xcc\x37\x36\x7e\x67\xa0\xed\x41\xfb\xd3\x64\x58\x47" - "\xa9\xec\xf2\xb7\xf7\x0b\x2f\x42\x7f\x84\xd0\xd8\x20\xd0\xcf\x15" - "\x34\x1e\x1d\x8c\xc5\x62\xd6\xc6\x8a\xc9\xad\x5b\x47\x98\x5b\x61" - "\xac\x5a\x94\x7e\xe4\xb8\x1a\xed\xdd\xf7\xe9\x8e\xab\x3b\xa1\xaf" - "\x2a\x82\x01\xfb\x04\xbf\x1c\xec\x39\x1c\xa3\x3e\xea\x01\x5d\x70" - "\x2f\x52\xb4\x93\x62\xb6\x4a\x7f\xf3\x43\x9a\xc1\x78\xae\xa8\x4e" - "\x44\x7b\x37\xae\x12\xde\x41\xec\x29\x5c\x3d\xee\xf7\xe3\x99\x02" - "\x94\x77\x66\xa6\xf2\xad\x28\xbf\xe1\x39\x2c\xdc\xe3\xc7\x33\x8a" - "\xbb\x41\xfe\xc5\x7a\xa1\xce\x57\xc4\x73\x84\x9b\x21\x8f\x8e\x7b" - "\x9f\xdf\x5d\xcc\x59\x42\xe7\x1c\xda\x86\xfa\xd3\xfd\x0d\x9f\x97" - "\x2e\xc2\xb8\x6e\x2d\xbc\x4c\xf7\xe5\x5a\x0b\x85\x7a\xd0\x4f\x01" - "\xd4\x51\x21\xd6\xc1\xa5\xf0\x8d\x68\x97\x67\x6f\xe7\x4d\xec\x79" - "\x66\xbf\x31\xc3\xc2\xd1\x33\x32\xf8\x3c\xb3\xe3\xa8\xb0\x39\xd9" - "\xc5\x03\xee\x9c\xf4\x17\xfd\x18\xc0\x6f\xb5\x28\xaf\x23\x8d\x5a" - "\xf5\xb9\x45\x16\x98\xeb\x16\xbd\x1e\xf8\xd4\x93\x63\x00\xef\xf3" - "\xba\xd1\x11\xf8\x22\x26\xe2\xb9\x5f\x2e\x28\x42\x83\x67\x7f\xd1" - "\xd7\x26\xb3\x6d\x3f\xb9\x4d\x38\x07\xec\x73\x99\x9c\x7c\x5a\xda" - "\xef\xb7\x0b\x3a\xea\x93\x87\x99\x7c\x71\xf2\x30\xd5\x51\x6f\xcd" - "\xcd\xfc\xd3\x1a\xab\xb2\x74\x8d\x49\xc9\x7c\xbb\x9e\x84\x7b\xc6" - "\x34\xd1\x2e\x0d\xca\xe9\xb0\x2e\xf7\xfc\xe0\x18\x13\xab\xf3\x14" - "\x95\xa3\x25\x39\xfe\x14\xf5\x2b\x87\x7b\xf3\x1c\xf2\x76\x41\xba" - "\x52\xb4\xe7\x32\xea\xae\xa2\xae\xba\x37\xd3\x29\xb0\x32\x82\xed" - "\xe4\xdd\xcd\xf2\x74\x10\xa6\x19\xcd\x4e\x45\x89\xfb\x5e\x39\x4a" - "\xce\x14\xa0\x00\xb8\x2a\x02\xec\xd3\x59\xd0\xff\x80\xd9\x08\xbc" - "\x22\xc6\x16\xd5\x25\x61\x1c\xa3\x53\x2b\xd1\xa7\x39\x9b\x6f\xa7" - "\xe8\xb9\x39\x2e\xeb\x51\x3e\x03\xe5\x25\x33\xfa\x3a\xbf\x4a\xa0" - "\x5c\x20\x94\x7b\xb3\x3c\xad\x05\xc6\xe3\xa8\x16\x8c\xb3\xd5\x28" - "\xbc\xdb\x1c\x38\xc6\x34\xc2\x9f\xc4\xc2\x3b\x0f\x9a\x48\x81\xde" - "\x7b\x4c\x38\x75\xb0\x3b\x7d\x2c\xfb\xae\xcf\xc2\xa4\x3e\xf9\x46" - "\xe8\x93\xcf\xc2\x7a\xb2\x95\x10\x78\xef\x81\xcd\xa4\x6a\x20\xea" - "\x87\xe0\xf7\xd0\x66\x52\x49\xb1\x96\xd9\x21\x57\x7e\x25\xfc\x86" - "\x77\x54\x1e\x13\x7e\x0f\x81\xdf\xfb\x84\xdf\x83\xe1\x77\xae\xf0" - "\x1b\xe8\x5d\xb9\x5a\xf8\x1d\x0c\xbf\xe3\x84\xdf\x30\x8f\x2b\x9f" - "\x14\x7e\x87\xc0\xef\xd1\xc2\xef\x41\xf0\x7b\x90\xb0\xc7\xec\x77" - "\x81\x54\xf6\xf2\x9e\xff\xff\xac\x86\xad\xbd\x95\x2a\x98\xcb\x82" - "\x1f\x1d\x47\x5e\x98\x89\x94\xa5\x89\xfb\x48\x90\x5f\x81\xef\x81" - "\xfc\x89\x30\xfe\xa2\x9c\xf2\x05\xdf\xec\x95\xb3\x41\x9e\x28\x73" - "\xca\x2f\x11\xf2\x13\xa1\x7c\x85\x53\x7e\x91\x90\x0f\xf3\xff\x7f" - "\x7d\x9d\xf2\xf3\x84\xfc\x02\xd1\x76\x43\xc8\xdf\x28\xe4\x43\xff" - "\xef\x2b\x71\xca\x4f\x13\xf2\x2b\xa1\x8f\x2d\x4e\xf9\x54\x66\x66" - "\xbe\xf6\x02\xf8\xe3\x69\x63\x00\xdb\x2a\xcd\x26\xf2\xee\x5e\xa7" - "\x32\xf1\xec\xd9\x2a\xa0\xc1\x81\x4a\xa7\xfc\x18\x21\x5f\x63\x22" - "\xd7\x36\x39\xe5\x4f\xf3\x34\x86\x14\xf9\xc4\xed\x3e\x02\xea\x71" - "\x91\x6f\xa4\xb6\xa8\x94\x8f\xac\x9e\x8f\xe7\x63\x02\x76\xf3\x0d" - "\x9a\x74\x9e\x6f\x20\xd5\xd1\xcc\x2e\x73\x54\x13\x5b\xaf\x70\xcc" - "\x57\x3f\x40\xcf\x9e\xa0\xaf\x37\x3c\x67\xb4\x06\xcf\x19\x55\xd1" - "\x3d\xf3\x88\xd4\x4c\xe6\x07\x4e\xf4\x29\x8c\x3a\x01\x61\xcf\x17" - "\xca\x7c\x85\xba\x53\xac\x07\xd7\x70\x63\x72\x27\xf3\x11\x08\xb2" - "\x03\xe6\xa1\x6c\x4c\xcf\xa3\x38\xc9\x66\x6c\x3e\x56\xcf\xe7\x3a" - "\xf1\x2c\x1f\xd3\x1f\xe0\x5a\x8f\xe5\xd1\x5e\xc9\xb9\xac\x89\x54" - "\x53\xdd\xa2\x8f\x3a\xe0\x5c\x47\x56\xf5\x44\xe9\x4c\x45\x55\x9e" - "\x90\x0f\x7c\x4c\xf5\x6c\xa7\xfc\xeb\x78\x4d\x09\x9f\x86\x54\xf0" - "\xaa\x21\xd6\xae\x76\xde\x62\x6b\xe7\xad\x39\x67\x99\xdd\x31\x60" - "\xd0\xbd\x76\x7d\xa8\x1f\x9e\xa9\xc0\x58\x43\xb6\x14\xde\x8c\x36" - "\x71\x90\xdf\x6f\x86\xc5\x0c\xd8\xdf\xc1\x6f\x7e\x1e\x6d\x28\xdb" - "\x08\xee\xc9\x65\xb4\x60\x1c\x88\x00\x1e\xcf\xae\xae\xbb\x44\xfc" - "\xab\x01\x7b\xd0\x3e\x19\xf7\xcb\xa6\x27\x98\x49\x55\x82\x9d\x14" - "\x42\xdd\xbb\x9f\x17\x71\xbf\xda\x22\x9d\x8f\x1c\x82\x7b\x98\xf7" - "\x66\xd0\x98\x6a\x46\xea\x3f\x0d\xe3\xb5\x83\x8c\x9a\xcf\x7f\x82" - "\xfc\x88\xde\x10\xb0\x9e\xc0\x18\x30\x46\xc2\xef\x52\xf6\x07\xf7" - "\x20\xdf\xd3\x37\xb1\x79\x6a\x4c\x64\x38\x12\x9a\xca\xb0\xc0\x98" - "\xc8\xff\x37\x9e\xb5\x30\xea\x00\x4b\x52\x81\xf7\x49\x75\xf7\xfc" - "\xba\xdd\x44\xd9\xb5\x15\xd6\x8c\xcb\x65\x4a\x86\x3d\x35\xf3\x38" - "\xa5\xdf\x7a\xd4\x5b\xd2\xb8\x4a\x5b\x23\x22\x4b\x96\x59\x95\x55" - "\x6b\x1a\xc9\xda\x41\x44\x3d\xcf\xaa\x84\x32\xc6\xaf\x07\x24\xa3" - "\xaf\xba\xdc\x4c\xe0\x1d\x94\x7f\x81\xfb\x47\x96\x95\x29\x6d\x74" - "\x1d\xa9\x99\x47\x75\x5d\xfa\x08\x3f\xdc\x2b\x33\xd6\xd9\x91\xef" - "\xf1\x07\xbe\xc7\xca\xaf\xd0\xfa\xd9\x57\x25\x04\xd9\x56\x24\xf4" - "\xdb\x9d\x44\xfc\xed\x2b\xb4\xc1\x6f\xb4\x93\xf1\x62\xbc\x26\x90" - "\x85\x23\xf9\x0e\x75\xdf\x2d\x29\x24\x1c\x65\xe5\x01\x0a\x15\xdd" - "\x7f\xc4\xdf\x9c\xf2\x7d\x55\x61\x4a\xf7\xb1\xe1\xec\x20\x23\x63" - "\x3c\x2c\x6c\x8b\xbb\x6f\xdd\xb4\x13\xe4\x6e\xe1\x2c\x5e\xfa\x79" - "\x12\xa2\x7b\x91\x28\x07\xb4\xf1\x86\xe6\x44\xa2\xc4\xb8\x5a\xe9" - "\x8b\xa8\x3e\xaa\x57\x55\x82\x8d\x18\x53\xcf\x90\xf4\x24\xec\xa3" - "\x9a\xf7\x70\xfd\x44\x9b\x58\x28\xaf\x6a\x26\x35\xc7\x02\xac\x44" - "\x89\x7e\xb1\x0d\x4b\x50\xee\xa8\xf9\xc2\x42\xfd\xb6\x7c\xae\xc6" - "\xb3\x73\x86\xa4\xc7\x31\xef\x87\x8c\xf3\xd8\x17\xa3\x5a\xd8\x79" - "\xbd\x9a\x4a\x4c\x67\xe0\xd9\xc0\xa0\x31\xea\x03\x9d\xd6\x5e\x4c" - "\xe7\x51\x53\x25\x60\xbf\x8e\xc9\x49\x35\x1e\x75\x7c\x9c\x5e\xa3" - "\xe6\x31\x46\x47\x01\xf2\x15\xbc\x89\xee\xed\xd2\xf8\xd6\x8f\x1a" - "\xf8\x76\x3d\x61\x67\x81\x3e\xcf\xe5\x72\x35\xe8\x9b\x04\x7f\xd3" - "\x58\x36\x4c\x77\xaa\xd1\x32\x7d\xa3\x66\x3c\xd3\x9d\x6a\xa6\x6c" - "\x18\x8c\x36\xe2\x9f\xeb\x5b\x03\x35\x31\x70\x8d\x6f\x0d\x1a\x6f" - "\xf2\xbc\xd6\xdc\x33\x45\x73\x2f\x09\x46\x9d\xfd\x42\x3b\xf3\x67" - "\xc4\xe6\xf0\xe9\x3c\x3e\x97\xde\x1b\xda\xa0\x23\x3e\x8c\x77\xff" - "\xfc\x5c\x44\x01\xd1\x40\x5b\xfb\xf3\xaa\xa1\x56\x6a\xef\xa6\xd7" - "\xf8\x19\x5b\xd0\xff\xb8\x9d\x30\xde\xf8\x74\x11\x1f\x38\xd4\xca" - "\xca\x9f\x1e\x5d\xdd\x02\xdf\xa0\x1a\x5a\x61\xb4\x5e\x12\xd6\xea" - "\xd3\x30\xf6\x87\x56\xf0\xfa\xa1\x42\xbc\xd6\xd3\xeb\x45\x5c\x65" - "\x63\xf4\xf4\x4a\x46\xb7\x7b\xa6\x30\xba\x9d\x2e\x12\xd6\xa5\xa1" - "\xf8\x1b\xf8\x84\x48\x66\xb7\x70\x3a\x51\xe4\x5d\x4c\x42\x19\x7c" - "\x06\x7e\xcf\x62\x58\x7b\x1a\xe4\x9f\xcf\xc3\x84\xfb\x91\x98\x07" - "\xdf\x07\xb8\xfc\x79\x05\x7e\x97\x27\x6c\xa5\xb4\x48\x23\x3e\xd0" - "\xe6\x26\xb4\x17\x46\xf9\xce\x68\x79\xd4\x60\xa4\x7d\x50\x7b\x3f" - "\x3d\x7f\x08\xef\xc1\x58\x01\x88\x9b\x50\xa7\x2f\xd6\x27\xb5\xff" - "\xef\xfd\xc5\xb6\xe0\xfb\xf0\x1e\x7c\x2b\xc6\x75\x05\x5a\x0d\xa5" - "\x3c\x3d\xf6\xeb\x05\x1d\xea\x4a\xda\x80\x66\x68\x3b\x55\x3b\x1e" - "\x69\xc2\x68\x56\x1b\x2c\xc8\x43\x42\x3f\xd4\xde\x25\xa7\x07\x4b" - "\x73\x2a\xc0\x86\x24\xb4\xa1\xa9\x1d\x2f\xd0\x4f\xf0\x9d\xfb\xf7" - "\xf3\x94\x5e\xf4\xde\xdf\x77\x3b\x3d\x7b\x8f\xa3\x2c\xb4\x1b\x6d" - "\x1e\x71\x3f\x1a\x75\xfe\x6c\xbc\xfe\xbd\xc2\xe9\xb9\x8a\x85\x3f" - "\x44\x11\x8c\xbb\xb6\x61\x3b\x8d\x45\x12\xd9\x91\xf5\xf7\x7a\x89" - "\xde\xac\x1e\x37\xef\xb8\x57\x7c\x87\x89\xfc\xbd\x40\x6c\x27\xfc" - "\xd6\xb1\x3e\xa9\xd5\x48\x7d\xf2\xf7\x28\xf1\x39\x94\x9b\xa1\x8f" - "\x5a\x30\xae\x8f\x07\x7f\xa7\x0a\x63\x28\x60\xb0\xed\x51\x03\x1d" - "\x8f\xa4\x36\x1f\xed\x94\x81\xae\x4d\x6c\x0c\xd5\xa6\xb1\xb5\xb0" - "\x96\xea\x2b\x70\xdf\x86\xf9\xbf\xae\xd5\x43\xbd\x25\x42\x9b\xf7" - "\x0a\x6d\xd8\x0b\x6d\xb8\xce\x0f\x9c\xe3\x5c\x8b\xe3\xdc\x5a\x6d" - "\xa5\x74\x56\x6f\xac\xb0\x17\xfc\x85\x9a\x6f\xe7\xf3\xf0\x6c\x01" - "\x9f\xc2\xe7\xe7\x40\xff\x64\xb4\x91\x5f\xa0\x2f\x94\x74\x1d\xff" - "\x5d\xb5\x0e\xe4\x1e\x55\xc4\x2c\xc0\xc7\xd9\xe9\x6d\xa4\x0f\xda" - "\x9a\x20\xb6\xa0\x2e\x81\x0f\x84\xfc\xdc\x88\xd9\xd2\x79\xa2\x2f" - "\xc3\xf1\xdc\x1f\xc8\xe3\x18\xf3\x32\x01\xfb\x1a\xed\x8f\x2f\x90" - "\x2f\x61\x0e\x47\x24\xc0\xbd\xe4\xcd\x54\x26\x8b\x28\xb1\xab\xc6" - "\xd4\x67\x5c\x22\xbd\x69\x5c\x8a\x54\x2b\xd1\x2c\xc1\x73\x27\x5f" - "\xac\x86\x3a\x4b\x20\x7f\x00\xcd\xb7\x5a\xf1\xec\x78\x09\xdc\x1b" - "\x00\xf7\xde\x87\x2b\x07\x75\xa4\xe6\x40\xbb\xd3\x2f\x91\x7b\xa1" - "\x2d\x4d\xf0\x9e\x12\x68\xe7\x85\x8c\xa5\x24\xa4\x5a\xd7\x84\x3c" - "\x35\xd4\x67\x22\x82\x7f\x85\x92\x06\xf2\xe5\x03\xf0\x5d\xa9\x28" - "\x5b\xe2\x59\xbd\xcd\x70\x4d\xb7\x93\x01\xe9\xeb\x60\x4d\x5b\x07" - "\xef\x87\xf2\x58\x0f\xfa\x54\x60\x6d\x81\x6f\x43\xbd\x04\xd4\xbb" - "\xae\x85\xbf\x00\x75\x37\x55\xb5\x40\x7d\xa9\x75\xb4\x4e\x13\x7e" - "\x23\xd4\x2b\xd8\x28\x69\xd8\xfe\xf2\x97\x61\xe2\x3e\xa9\x89\x7c" - "\x11\x8d\xdf\xe9\xde\x6f\xe9\x97\xd3\xe4\xbe\x3e\xfe\x2f\x14\xfd" - "\x26\x42\x7e\xbc\xe8\x97\x03\x7e\xeb\xa0\xae\x52\xda\x47\x4e\x3e" - "\x52\x72\x9c\x7c\xa4\x64\x98\xf9\x73\xd8\x16\x1d\x8d\xc1\xf5\x25" - "\xc8\x43\x63\xea\x99\xef\xcf\xff\xa3\xf3\x14\xbe\x19\xd3\x01\x4c" - "\x77\xf8\xa5\x80\xd9\xf7\x24\xcc\xb4\xdb\x02\x4c\xf0\x4e\x98\xbf" - "\x09\x52\xfa\xcb\x72\x3c\x9b\x08\xe5\xec\xcc\x87\xda\x97\x87\xe5" - "\xe5\xe9\xfd\x4c\x97\x74\x94\x4b\x5a\x63\x81\xfe\xf4\xb4\x1f\xbc" - "\x19\xf7\x90\x54\x11\x7e\x03\xd6\x13\x5d\xc6\x45\xe2\x03\x74\x3e" - "\x8f\x6d\xab\x6e\xa2\x67\x64\x02\xf8\xac\x48\x62\x6c\xb2\x31\x7e" - "\x05\xd6\x89\x86\x30\x28\x73\x91\x84\xa0\x7d\x35\xfa\x46\x85\xf2" - "\xcd\xcc\x1f\x6a\xdd\x5b\xf3\x56\xf6\x25\xdc\xef\x63\xfa\xf1\xca" - "\xf9\x3a\x58\x13\xfc\xf6\x77\x9a\xd0\xa7\xa8\x22\x7d\x07\x09\xc5" - "\x3e\x84\xbe\x6c\xc4\x98\xa0\xf0\x4c\xcb\x9f\x3a\x9b\x7a\x19\x6d" - "\x67\x88\x0e\xc6\x56\x33\xa9\xcb\xf7\x4d\x03\x79\xff\x02\x51\x81" - "\xcc\x6d\x3b\x6e\x1b\x4f\xc4\x73\xbd\x05\x41\xec\x7c\x64\x01\xcc" - "\xd9\x15\x6a\xde\xda\x91\xf5\x7f\xc0\xff\xfc\x35\x53\x3c\xb7\xb7" - "\x89\xf9\x3b\xf5\x85\xf7\xc7\x29\x85\x33\xcc\x8c\xb6\x75\xa3\xd9" - "\xf9\xa8\xa0\xfb\x3a\xb2\xea\xb4\x12\x4f\x57\x77\x50\xd0\xc3\x0a" - "\x7e\x67\xeb\x0e\x1e\x07\x2e\xfa\x15\xb6\xaf\x1e\x0c\x65\x67\x3b" - "\xf6\xd5\xa9\x8c\x5a\x77\x90\xcf\x1d\x4b\x18\xbf\x37\x96\x2c\xb4" - "\xfb\x09\xeb\x0a\xe6\x0f\xa9\xc0\x67\xe1\xb9\x00\x16\xb7\xa1\x4e" - "\x2f\x8d\xb5\xba\x18\xc4\x11\xf8\x26\x90\xcb\xff\xaf\x12\xbf\x0b" - "\x69\x02\xe5\x7c\x21\x5d\x73\x7c\xaf\x07\xbf\xbe\xaa\xd0\x54\x5b" - "\x16\xdd\x23\x4e\x85\xf1\x74\x09\xfa\xe0\x6e\xf4\x63\x62\x84\xf7" - "\x54\x15\x76\x92\x2a\x75\x2b\xa9\x8e\xc7\xb3\x5c\xc0\x33\x2f\xf9" - "\x96\x34\x6a\xdc\x63\x18\xe0\xa0\x15\xf8\x37\x3f\xac\x0b\xe7\x09" - "\xda\x47\x19\x41\xd2\xa8\x36\x63\x2c\x52\x42\xeb\xa8\xe2\x9a\x48" - "\x55\x2a\xf2\xee\xfb\xf2\xab\x0b\xcf\x90\x6a\xf5\xdf\xe9\x7b\x90" - "\xcf\x30\x24\xb5\x76\x53\x77\xa8\x1a\xea\xd6\x0a\x75\xb7\x40\xdd" - "\xc1\x9e\xeb\xd6\x1b\xbc\xab\xdb\x9b\x76\xeb\x4b\xbd\xa9\x3b\x23" - "\x9f\xb7\x03\xb6\xf4\x07\x5e\x8a\xfa\x55\xc2\xb3\x61\xf6\x76\xf4" - "\x41\x30\x94\x67\x36\xa7\x67\x5e\x43\x1e\x9b\xee\x25\xe6\x8e\xb2" - "\xd0\x73\x63\x97\x09\xf5\x59\x63\xb4\x9d\x27\xa8\x03\xea\xc8\x3a" - "\x93\x2c\xf1\xdf\x8e\x3d\x14\xe0\x7f\xce\xe4\x33\xbb\xc2\x51\xc2" - "\xba\x7c\xe6\x69\xac\xc7\x3d\x9f\x1d\xe9\xc7\xec\x53\xcf\x7c\x2e" - "\xca\xeb\xad\x81\x91\x7e\x42\x5d\x1a\xd7\xbd\x75\x31\x08\xf8\xa2" - "\xd4\x64\x31\x9e\x38\x3b\x54\xd8\x97\x3c\xb3\xe8\x85\x45\x8b\x53" - "\x16\xc5\x6b\x66\xaf\x4c\x5a\xf6\xc0\xcb\x2f\xbe\xa8\x99\xbe\x68" - "\xc5\x8a\xb8\xdf\x2f\xea\x4b\x66\x27\xc5\x2d\x5b\xb1\x18\x9d\xc1" - "\x6b\x34\xd1\x0f\x2d\x4c\x78\x39\xf9\x81\xdf\x44\x47\xba\x9c\x33" - "\xc4\x33\x86\xf5\xc8\xd7\x01\xde\x86\x00\xf6\x06\xa2\xff\x89\x80" - "\xd5\xbc\x61\x2d\xc8\x14\x30\xfe\x9a\x71\x0f\x09\xe6\xed\x39\xe4" - "\x37\x81\xff\xa8\x45\xdf\x63\xbb\xb6\xf3\x35\x17\xc8\xa5\xc7\x80" - "\x57\xa9\x43\x3f\x63\x20\x6b\xd5\x83\x9c\x67\x66\x31\x6f\x2f\xdd" - "\x03\x65\xca\x5f\x87\x3c\x73\xe0\x58\xb2\xe5\x2c\xf1\x85\xf5\x07" - "\x78\xdd\x7f\xc0\xdc\xef\xc3\x6f\x0a\xe1\xcb\xf9\x6f\xd5\x44\xf0" - "\xf7\xa7\x34\x9a\xac\xb8\xd7\xec\x37\xd3\x96\xc1\x23\x9e\xb2\xb9" - "\xf5\x8f\xf3\x8c\x2e\x1a\x35\xb3\xdb\x6d\xb1\x23\x5f\xbc\x81\xc6" - "\x10\xf8\x07\xcc\xc9\x9a\x04\x09\xa7\xcf\x87\x0b\xfc\x08\xf2\x3a" - "\xab\x1a\x20\xcd\xce\xd8\xd7\x6b\xe4\xf6\x05\x20\x44\x91\x8b\x09" - "\xec\x0f\x9f\xb9\x98\xcc\xfe\xf0\xb7\xf3\x1f\x2c\x28\xf4\xcf\x35" - "\xff\xc7\xfe\x89\xef\xbf\xe9\x3a\x1a\x7b\xf8\xbb\x81\xf7\xd3\xef" - "\xbe\x83\xdf\xff\xa3\xea\x68\xe9\xee\x0f\xc7\x1b\x8c\xad\xfa\xd7" - "\xcf\x12\x3f\x18\x9f\x79\x20\x63\xfb\x66\x7c\x4d\xd4\x69\x36\xbe" - "\x31\x63\x3e\x09\x4d\xbf\x48\x30\x26\x6c\x53\x72\x2a\xdf\x98\xde" - "\x8e\xb2\xd8\xf9\x8f\x61\xfc\x96\xe5\x34\x10\xff\xcd\x0d\x44\x55" - "\x9d\xcc\x7c\xcf\xa2\xee\x13\xcf\x34\x18\x21\x5d\x99\x62\x25\x9f" - "\x99\x7f\xc0\x3d\x0e\x43\x75\x2c\xe0\x4e\x3d\x21\x38\x7e\xfd\x63" - "\x49\x70\x41\x08\x7f\x98\xcf\xda\x04\xb2\xfb\x26\x7c\x6f\xed\xbb" - "\x5c\x54\xaf\x77\xd7\x54\xf4\xc2\xf8\xb9\x0d\xe4\xec\x5b\xc2\xd8" - "\x7c\x80\x9d\xd9\x39\xff\x80\xa0\xcf\xaf\x05\xde\x17\xd6\xa6\xf3" - "\xfb\xd8\x7a\x7e\x7e\xb5\xa0\xc3\xc0\xdf\xd4\x2f\x2c\x7c\x47\x19" - "\xc6\xd0\xc6\x3a\x0f\x70\x65\x34\x86\xf6\xbb\x6b\xa2\x7a\xa5\xc5" - "\x11\x65\xb5\xa9\x99\xee\x86\xe1\xbe\x0b\xcc\xbb\x12\x98\x67\xa5" - "\xbb\x43\x78\x3d\xb4\x6f\x53\x61\x08\xbf\x11\xda\x54\xdc\x91\xf5" - "\x4d\xb0\x89\x7c\xe5\x27\xe8\x58\x0d\x30\x2f\x4a\x36\x43\x99\x99" - "\x2b\xc9\xd0\xcd\x50\x2e\x07\xca\x21\xef\xc6\xda\xf7\x6d\x7f\xa0" - "\xc1\x41\x78\x67\x8d\x66\x01\xa6\x4d\x54\x07\x86\xef\x86\xef\xd0" - "\x34\x10\x13\xd5\x8b\xe0\x3b\xc4\xf7\x42\xfd\x80\x7f\x5f\x19\x04" - "\x7d\xb7\x9e\xd5\xf3\x8d\x20\x0f\x45\xa4\x6e\x91\x62\x9c\xa7\x6e" - "\x5e\x03\x6b\x3a\xc8\xd4\xf0\x8e\x3c\x78\x07\xea\x22\xf8\x00\x3c" - "\x57\x57\x6f\x03\x7e\x8f\x13\xec\xbf\x4c\xaf\x0a\xcf\x52\x1e\x84" - "\xf2\x1d\x20\xeb\x33\x99\x14\x78\x8f\x04\xc0\x09\xe0\x37\xa8\x2d" - "\x32\xf0\x1a\x98\x0f\xef\xc8\x43\xbf\x7f\x20\x2b\x1c\x84\x75\xbb" - "\x14\xf9\x84\x05\x6d\x4f\x11\x1a\x0b\x10\x78\x85\x15\xa9\xbc\x95" - "\xc5\x06\x30\x69\x44\x5e\x01\xc7\x07\xf2\x07\x9b\x17\x10\xdf\x2e" - "\xe8\x63\x18\x23\x15\xc0\x7b\x04\x36\x13\xd3\x3c\xa1\x6f\x2a\x28" - "\x4f\x20\xc4\x44\x62\x18\x6e\x5a\x0c\x6b\xbb\x3f\xbc\x03\x64\x8a" - "\x4b\x54\x77\xc6\x30\xc8\x94\x2a\xae\xf3\x2c\xae\x9f\x69\x1e\x0f" - "\x58\x07\x74\x3b\x18\x1e\xab\x00\x3e\xf4\x1b\x03\xf4\xc5\x41\x2c" - "\x8b\xe7\xc6\xa1\x7c\x31\xac\xf9\xe1\x42\x9f\xd4\x6f\x4e\x41\x1e" - "\xc0\x14\x89\xed\x80\x67\x2a\x81\xd6\xf0\xae\x06\x93\x80\x63\xb5" - "\x8c\x7f\x69\x38\x29\xd2\x1e\xfa\xfa\x15\x89\xfe\x26\x8b\x33\xfd" - "\x81\x16\xaf\xb0\x3e\x68\x58\xe9\xd4\x77\xc0\xaf\x37\x4c\x43\xdd" - "\x1b\xbc\xef\x30\xd3\x1b\x9c\x7b\x00\x7d\xfc\xc0\x98\x39\x0c\xb4" - "\x38\x0c\xe5\xca\x10\x9b\x37\x9c\x25\x42\x7c\xfb\x86\xb1\x8c\x3f" - "\x3d\x57\xcb\x62\x40\x9f\x13\x62\x40\x9b\xc6\xb0\xf8\xcf\xe7\xde" - "\x62\xf1\x9f\xcf\xed\x76\x8e\x69\x2f\xc5\xb3\x3f\xb7\x49\xb4\xf7" - "\xc7\x31\x80\x7d\x0f\xdf\x38\x86\xc9\x66\xe7\x36\xa1\x7e\x85\x3e" - "\xd7\x95\x80\x6d\xac\xc7\xf9\x29\xde\xc7\x18\xf7\x90\x4f\x9c\x68" - "\x33\x46\xe8\x93\x32\x16\xf7\xa2\xe1\x01\xd6\xb6\x06\x3f\x48\xfb" - "\x41\x1b\xa8\x7c\x87\xf1\xee\xb7\xe0\x33\xe9\xd2\x33\x38\x7f\x60" - "\x2c\x07\xc0\x33\x23\xe1\xca\x8b\x65\xf7\x74\x62\x99\x73\x25\x6f" - "\x74\xa2\x7e\xe5\x5c\x79\x6b\x97\x56\x09\xef\xb5\xc2\x7b\x95\x38" - "\x36\x70\x5c\x88\x75\x6c\x61\x34\x2a\x81\xfe\xa3\xe3\xeb\xb8\xad" - "\x0c\xe8\xde\x00\xf2\x7f\xd5\x2c\xc6\xdb\x9d\x2b\x11\xda\x67\x60" - "\xfe\x6d\xcf\xd4\x63\xbc\x41\xe6\x6f\xa6\x21\xcf\xb1\x57\xe8\xe0" - "\x31\xcf\x95\xe0\xd8\x83\xba\x2a\x85\x31\x11\x00\xe5\x0e\x3b\xc6" - "\x10\x3d\x27\xdc\x30\x11\xf9\x4c\xa1\xfd\x38\xf6\xc6\x32\xda\x99" - "\xea\x71\x0c\x58\x80\xf7\x64\xfd\x6c\x1a\x83\x7c\x2a\x1b\x87\xdf" - "\x12\xb1\x0e\x76\xd6\xf8\xdc\x26\x0e\xea\x10\xc7\x8a\x33\x36\x40" - "\xd9\x70\xe0\x49\x1d\xe3\x46\xc4\x02\x56\x67\xa3\x10\xf7\x22\x37" - "\x15\xfa\x06\x7d\x32\x1a\x90\x6f\x67\xe3\xb2\x71\xfc\x71\x8b\x8d" - "\xc6\xc0\x86\x76\x01\x26\x7c\xbb\xad\x35\x68\xbc\x55\x1a\xdb\xdf" - "\xbe\x22\x8e\x6d\xa7\x7e\xa5\x63\xfb\x15\x8a\x47\xdf\x82\xfc\xfb" - "\xab\x69\xe2\xd8\xc7\x79\x8e\xb1\xe8\xb7\xa4\xb0\x38\xf5\xa8\x03" - "\xa1\xf3\xde\xda\x42\xe5\x0b\xec\xcf\xea\xd4\x46\xea\xd7\x12\xe3" - "\xd4\x57\x5b\xce\xa3\xdc\xd8\x8c\xf3\x5f\x9c\xe3\xd8\x37\xf0\x2e" - "\x03\xd4\x57\xf3\x0a\x60\x20\xce\x41\x0b\xb4\x09\xe3\x3f\xa2\xdf" - "\x8e\xf2\x79\x51\x34\x86\xfd\xf1\x58\xec\xb7\xc6\x30\xd1\xbe\x78" - "\x0b\xc3\x00\x7f\x61\xbc\xd0\x36\xba\xd0\x35\x80\xd1\xb5\x31\x46" - "\x3e\xbf\xcf\x59\x71\x7e\x3b\xd3\x15\x69\x8a\xb4\x85\xb2\xf0\xfd" - "\x5f\xc5\x8b\x74\x75\xa2\x69\x9b\x30\x1e\x05\x6c\x6d\x74\x8b\xad" - "\xe8\x1f\x14\xda\x55\xb6\x01\xbf\x05\xd6\x14\x7c\x3f\xf5\xb3\x2d" - "\xc8\x3d\xe5\x66\x1c\x53\x8d\x4d\x26\xb2\x90\x88\x38\x06\x63\x85" - "\xfa\x5c\xc2\xbe\x12\xb1\x03\x75\x08\xac\xed\xe7\x83\xc5\xfe\xc0" - "\x76\x3b\x63\x02\xac\x31\x74\x2f\x46\xfa\xe6\xf3\x93\xe1\xb9\x20" - "\xc4\x36\x89\xbf\x3a\x3f\x5b\xfe\xed\xe7\x27\xe2\xb7\xe3\x98\xd0" - "\xa5\xa0\x1e\x81\xad\x65\x26\x72\xb6\x42\x8e\x57\x67\x3f\x66\x7b" - "\x84\x8c\x1f\x43\xbc\xd7\x2d\x60\xe5\x71\x7d\x83\xf2\x06\xba\xd6" - "\xb1\xf5\x30\x1c\xd7\x3f\xc8\x3b\x28\xd0\xa0\x1e\xca\x97\xe3\x99" - "\x45\xf4\x49\xd1\xaf\x9e\xc9\x81\x80\xd1\x87\x61\xed\x30\x40\xb9" - "\xe4\x6a\x90\x01\x6c\xbd\x09\x29\x10\xf8\x4d\xc4\x09\x7e\x55\x4c" - "\xbf\x55\x4d\xe4\x2e\xdd\x6f\xf8\x6f\x2f\x90\x0b\xcb\x61\x1e\x59" - "\x71\x2f\x1f\xea\xd6\x5c\x20\x17\x9f\x86\xf7\x06\x0b\x57\x35\x5c" - "\x27\xc0\x75\x10\x5c\x87\xc1\x75\x08\x5c\xf1\xec\x29\x27\x94\x8f" - "\xbc\x40\x9a\x7e\x80\xfc\x87\x84\x2b\xb4\xf1\x02\xea\x48\x66\xbd" - "\x8e\x7c\xe5\x02\x9a\x7f\x02\xd3\x70\x7d\x5f\xf8\xee\x4a\x36\xb7" - "\x2f\x6c\x83\x7a\x52\xb1\x1c\xae\x6b\x90\xa7\x83\x32\xab\xb1\x6e" - "\x3c\x4b\x0c\xbf\x1f\x70\xe2\x4f\xa1\x9e\xef\x9e\x85\xeb\x18\xb8" - "\xde\x03\xd7\x64\x78\xfe\x1c\xd6\x8b\xbe\x6e\x25\xbc\x30\x8d\x89" - "\x4f\x65\xfd\x09\x7d\x5d\x8a\xf3\x5d\xc4\x03\x1c\x4f\xb2\x72\xf3" - "\x58\x39\x26\xbb\x7e\xa7\x12\xfb\xce\xc6\xc6\x6d\xb9\x0d\xfa\x0e" - "\xea\x7f\x0c\x9f\x87\xeb\x24\xe1\x1a\x25\x5c\x27\x0b\xd7\xff\x10" - "\xae\xd1\xc2\x75\x8a\x89\x5c\x30\x09\xbc\x09\xd0\xec\x82\x09\x69" - "\x02\x73\x37\x9c\xbd\xb7\x29\x18\x65\x6b\xc0\xff\xb1\xad\x18\x4b" - "\x21\xeb\xbb\x8d\xa2\xae\x0e\x75\xbc\x5d\x59\x67\x3a\x76\x51\xbb" - "\x89\xef\x8a\x24\x2c\x1c\x53\xe3\xaf\x88\x22\xc0\x3b\xf5\x2e\x50" - "\x02\xdf\x40\xeb\xf9\xce\xaa\x14\xf6\x1f\xd1\xe7\x32\xc6\x88\x58" - "\x68\xf3\x63\x67\xe1\x02\xf7\xa1\x2c\x5f\x4f\xf5\x98\xe8\x5b\x29" - "\x70\x4c\x2d\xfc\x99\xcc\x81\x63\x1a\x45\xbc\x47\x79\x49\xf0\x91" - "\x15\xd2\x91\xd5\xe4\x2f\xc9\xf8\xdf\x1d\x66\xfb\x39\x03\x01\x9f" - "\x9a\xc2\x9c\xf2\x53\xb1\xcd\x40\xeb\x3a\xf8\x9e\x31\x0d\xa4\x69" - "\x1a\x5c\x1f\x6c\x64\xdf\x1c\x29\x7e\xb3\xd0\x57\x3a\x91\xe6\x8d" - "\xe4\x42\x13\xe0\x61\x12\x8e\xef\x06\x07\x2e\x5f\xa0\xfb\xba\xc2" - "\xf8\x81\x7e\xbe\xb0\x03\xfb\xdb\x09\x4f\xc2\x25\x9c\x6e\x2a\x96" - "\xf7\x8b\xa9\xd8\xc6\xf8\x85\x3a\x98\x97\x38\x06\x74\x2e\xf3\x72" - "\x22\xce\x4b\xe1\xd9\x46\x39\xc6\x9f\x9f\x88\x18\x2f\xb4\x11\xc6" - "\xed\x85\x59\xd8\x37\x26\xd2\x54\x2e\xac\x49\xe8\xd3\x6d\x2c\xe4" - "\x0b\x7a\x51\x96\x2f\xbc\x0b\xc6\xdf\x05\xf4\x07\x38\x44\xcc\x17" - "\xc6\x37\xd6\xa3\xc5\xbe\x16\xf3\x85\xfa\x61\x9c\x5e\xd0\xe0\xfc" - "\x11\xf3\xd9\x98\xfc\x36\x15\xf1\x06\x9f\xc5\xef\x41\x9e\xd9\xb0" - "\xa0\x1c\xda\x7d\x71\x2f\xf0\x17\x45\x38\x9f\x37\xac\x21\xfe\xab" - "\xf2\x49\x7f\x36\x37\x2f\x9e\x10\x9f\x65\xba\xce\x8b\x65\x22\x46" - "\x6d\xa1\x78\xd6\x18\x2e\xc7\xca\x96\x5e\x7c\x56\x80\xcd\xa6\x1a" - "\x53\x59\x65\x1b\x43\x31\x17\xe6\x7d\x01\x3c\x67\x36\x91\x4d\xf9" - "\xc2\x5a\x52\xc9\xf4\xc8\xcd\x23\xab\x8a\x18\x76\xb1\xba\x9b\x1d" - "\xf8\xe7\xc4\x87\x50\xac\xc7\x77\x61\x5d\xb0\xae\xa8\x2c\x19\x31" - "\xfd\x18\x7e\x37\x47\x9b\x48\xdf\x7a\x11\x5b\x71\x7d\x0a\x50\x10" - "\x5d\xce\x02\xb6\x3e\x71\xa8\xff\xd2\x59\xa8\x1f\xa1\x6a\x5d\x0b" - "\xc1\x75\x13\xfd\xbc\x2e\x5c\xdd\x17\x7d\xbd\xc4\x5c\x20\xdf\x63" - "\xbc\xbd\xbd\x02\x1d\x61\xfe\x7c\x5f\x25\xf4\x43\x3d\xbc\x7f\x2f" - "\x62\xf9\x86\x14\xe6\xa7\x1c\x75\x3f\xd4\x0f\x3e\xf2\xa8\x6a\xde" - "\x5a\x5e\x80\x73\xa4\xb9\xdc\x49\x9f\x55\xc4\xe6\xc5\xc5\x43\x34" - "\xa6\x82\x7e\x4c\x25\xd3\x1d\x7e\x1f\xc7\xf2\xbf\x17\xf6\x5a\xc7" - "\x08\x31\xac\xbe\x8f\xf4\x51\x07\x27\xb1\xb8\x33\xff\x08\x62\xfc" - "\xc7\xf7\xc1\x2e\x7e\xa1\x94\x90\xa7\x95\x7c\x66\x5e\x14\xf6\xb9" - "\xbf\x77\xda\xff\xfc\x1e\x63\x70\xfb\x42\x5d\xeb\x20\xdf\xb1\xff" - "\xc9\xd6\x1a\x93\x96\xf1\x06\x63\x6a\xfa\xad\x8f\x22\x80\xcd\xbd" - "\x77\x65\x89\xf3\xf7\xfb\x83\xac\x3d\x6c\xfe\xe2\x37\xe3\x78\xc0" - "\x39\x6c\xa3\xbe\x78\xf6\xf9\xe1\x5c\x86\xdf\xb5\x36\x71\xee\x32" - "\xfe\x2e\x9c\xce\x5d\x3a\x6f\xbf\x2f\x77\x6a\x47\x9a\x30\x56\xeb" - "\x5b\x5f\x50\xfb\xc3\x3d\x93\x89\x9c\x09\x65\xf7\x9a\xf5\x42\x3b" - "\x2a\xe1\x7e\x81\x21\xfd\x13\xec\xfb\xf5\x6c\x4e\x34\x67\xe2\xb8" - "\x33\xc2\x58\x81\xf5\x22\x9f\xc5\x98\x6f\x09\x15\xc7\x0a\xcc\xa9" - "\x78\x18\x53\xfb\xf3\x42\xf8\x7c\xe8\x13\xb4\xc7\x4c\x84\x34\xce" - "\xd7\x78\x76\x55\xa8\xf0\x2a\x8c\xd1\x7c\x78\x16\xd6\xff\xbe\x62" - "\x9f\xd4\x5b\x02\xf5\x66\x3a\x26\xd2\xd1\x36\x26\x92\xee\x47\xe2" - "\x98\xc0\xf1\x40\xf7\x25\x61\x6c\x04\xac\x7f\x8a\xe0\xb8\xa0\xe7" - "\xf9\x21\x8d\x6d\xc2\x71\x01\x75\xed\x15\x7d\x54\x9a\x48\xcb\x14" - "\x46\xfb\x96\x32\x67\x1b\x41\xa8\x5b\x53\xae\x01\x79\x47\x7f\xcf" - "\x94\xe4\x61\x64\x20\xc6\x08\x47\x5f\x74\x18\x73\x1d\x9f\xc1\x3d" - "\x1d\x86\x73\x03\xff\x13\x9e\xb5\x48\xf4\x32\x51\xbf\x02\xc7\xe7" - "\x51\x1d\xe4\xdd\x1d\x59\x97\x54\x72\xac\xf8\x47\x23\xe5\x07\x61" - "\x5d\x1d\x11\x4c\x34\x30\xfe\x60\x8d\xb8\x34\x46\xe4\x63\x23\x82" - "\x71\x6f\xf8\x1f\x28\x5f\xa0\x0c\x5b\x03\xbf\xd3\x70\x7d\xf5\xa0" - "\x2b\x1e\x83\x3a\x1e\x9c\xeb\xa8\x33\x42\xfd\x15\xfa\x94\xbf\x40" - "\xcc\x27\xaa\xd0\xd7\xc6\xcb\xd7\xfb\x25\x4d\x4f\xe5\xdb\xd0\xf7" - "\x8b\x26\x89\xdc\xdd\x40\xcc\x18\x0b\xb8\x2e\xe3\x07\xd4\xcd\x5c" - "\x72\xf1\x7f\x78\xd9\x5f\xf8\xd3\xc0\xdf\x2b\xd2\xdf\x95\x60\xe1" - "\xb7\xbe\xfb\xbf\x2b\xe1\xac\xec\x15\xc0\xbc\x2b\xd1\x02\xad\xfe" - "\xd8\x91\x75\x59\x23\xd2\x0a\xb1\x00\xb1\x11\x6d\x02\x50\xd7\xa4" - "\xb0\x11\xf4\xed\x01\xfd\x05\xed\xde\xf0\xcb\x67\x0c\x6b\x50\x16" - "\xbd\x4c\x6d\x9a\xd0\x8f\xa6\x77\xf6\x27\x97\xe9\x1e\x20\xf3\xcd" - "\x77\x39\x18\xde\xfd\x3f\x5b\x2e\x13\x5f\x5d\x12\xb9\x07\xf5\xde" - "\x01\x76\xde\x80\xb2\xab\x10\xd7\xbc\xa6\x99\x5c\x19\x98\xbc\x8e" - "\x28\xe1\xfe\x50\xf8\x2d\xc6\xd7\xac\x87\x67\x54\x3e\x56\x12\x8c" - "\xbc\xcf\xa4\x75\x64\x28\xb4\xdf\x24\xf6\x15\xf2\x07\xa8\x7f\x13" - "\x74\x08\xd8\xd6\x61\xf8\x1c\xfa\x5a\x36\x51\xba\x09\x98\x73\x19" - "\xf5\xcd\x97\x2b\x7d\x2c\x44\xc5\xd6\x8f\x2b\xb0\xfe\xfd\x43\xe0" - "\x07\x2f\x37\xc1\x1c\xa8\x75\x6a\xe7\x57\xd2\xef\x90\x41\xf8\x7c" - "\x80\x05\x79\x2f\x4f\xf4\xb9\xb2\x5c\xa4\x0f\xda\xa6\x82\x3c\xaf" - "\xa3\xfd\x6d\xe3\x5b\xa0\x6d\x95\xba\x35\xc4\xaf\x99\x98\x97\x63" - "\xcc\x02\x98\x37\x15\x4c\x2f\x6f\x5e\x24\xca\xd7\xac\xdd\xe6\xd1" - "\x01\xeb\x7d\xa8\x3e\x7d\xa1\x5d\x43\xf7\xfc\xf8\x2b\x6a\xaa\x43" - "\x37\xda\x26\x12\x43\xfa\x23\x58\x66\x98\xb0\x06\xd5\xb7\x66\xa8" - "\xc9\x71\xf5\x44\x98\xcf\x57\x5a\x60\xce\xd8\xbc\xb7\x9b\xba\xd2" - "\xc2\x70\x83\x9d\x23\xc4\x34\x9e\xf9\x03\x7a\x56\xb2\x7d\xee\x2b" - "\x1f\xe3\x9a\x80\x32\x3e\xac\x07\xe5\xb8\xee\x76\x64\x99\x1d\xfc" - "\x3f\xe0\x3d\xe0\xd3\x15\x61\xdf\x05\xf7\x16\xaf\x94\xa1\xaf\x05" - "\xc1\xf6\x15\xcb\xfb\x33\xdd\xbf\x79\x93\x83\x6f\x86\x72\xf8\x1c" - "\xb3\x6d\xba\xa2\x5f\x68\x47\x9d\xc0\x15\x3d\x7e\x2b\x1b\x9b\x21" - "\xd0\xb7\xe6\xc3\xd2\x3c\xbe\x4c\x79\x89\xe3\x2d\xce\xf3\xd4\x5c" - "\x2f\xc9\x9b\x97\x32\x1f\xc8\x23\x1a\x77\xf3\x52\x37\x80\xa8\xbe" - "\xf7\x23\xbf\xdd\xb2\x85\x2f\xd2\x2b\xb9\xc7\x37\xe4\x10\x7f\xc5" - "\x26\x20\x23\xce\xbb\x94\xd8\x81\x17\xc8\x0f\xf3\x03\xfc\x7f\x31" - "\x6b\x52\x72\x1f\x3e\x5d\x4d\x94\x9b\xaf\xf6\xf1\x1b\x66\xfd\x45" - "\x11\xef\xf3\xcb\x67\xa6\x27\xe3\xde\x9e\x9e\x7c\x97\x48\x7c\x26" - "\xd9\xe1\xdd\xfe\x44\x67\x22\xad\x09\x78\x36\xf3\xb8\x3f\xf2\x14" - "\xad\x68\x3b\xf3\x78\x5a\x01\xf1\x4b\x6b\xe4\x9b\x36\xbd\xd8\xcb" - "\x0f\xd6\x51\x15\xe0\xff\xc6\x7e\xfe\xbf\x28\xea\x82\x3a\x8e\xc5" - "\xd2\xe7\xdc\x9e\x05\xeb\xbe\x6d\xba\x10\x68\xdb\x35\xef\xda\x66" - "\x29\x96\xda\x66\x29\xbe\xc5\x6d\x53\x49\x6d\x4b\x80\xb6\x5d\xdd" - "\xe6\x5d\xdb\xda\x9a\xa4\xb6\xb5\x35\xdd\x60\xdb\x4a\xbc\x6f\x5b" - "\xea\x2f\x2e\x90\xd6\xd1\xde\xb5\xad\x43\x2b\xb5\xad\x43\xfb\x63" - "\xda\x96\x5e\xc0\x9f\xaf\x0e\x65\xf1\x48\x11\xf7\x2f\x10\xcb\xd8" - "\x75\xa1\xd8\x2e\x12\x04\xed\xba\x98\x51\xc0\x7f\xcb\x78\x96\xd6" - "\xfd\x6c\xad\x6b\x85\xf5\xef\x52\x0c\x1b\xc7\x16\x2a\xf3\x72\x3e" - "\x83\x8b\xf9\x2c\xde\x36\xca\x82\xf6\x4e\x36\xf4\x47\xa0\xe4\xb7" - "\x8e\xf5\x7b\xb7\xdd\xaa\xe4\x83\xc6\xaa\xf7\x5c\xf5\x25\xef\xb6" - "\x9b\x81\x6f\x69\x35\x89\xfe\x05\xc5\x67\x03\xf2\xbb\xc3\x27\xcb" - "\xc0\x49\x09\x24\x00\xf1\x09\xaf\x18\x7b\x66\x4b\x7a\x1f\xbf\x49" - "\x3f\x20\x3f\x60\x09\x17\xcf\x67\x89\x75\xcd\x6c\xea\xc3\x07\xa4" - "\x11\x1f\x3c\x23\x46\xfd\x96\xa9\xcd\x24\x2c\x8d\xf4\x9a\x99\x0a" - "\xf5\x5b\x49\x6c\x40\x2a\xd4\x0d\xf4\x60\x3c\xb9\x65\xb9\x4f\x22" - "\xf1\xcf\x83\xba\xf1\x3a\x49\x9d\xc1\x6f\xd8\x41\x7c\xf1\x2c\x19" - "\x9e\x09\x63\xe7\xc1\x7a\xfb\xc1\x7b\xf2\xc4\xf7\xf4\x40\xbf\x01" - "\x8c\x7e\x6d\x2b\x25\xfa\xb5\xdd\x2f\xd1\xcf\x72\x89\xd1\xcf\xd2" - "\x28\xd1\xaf\xad\xd6\x3b\xfa\xb5\x69\x24\xfa\xb1\x67\xbb\xa7\x5f" - "\xdb\x1c\xcf\xf4\x6b\x4b\x94\xe8\xc7\xea\xf2\x40\xbf\xde\xee\xe9" - "\xd7\xf6\xde\x8d\xd1\xaf\xad\xf6\x06\xe9\xd7\x9f\xd1\xaf\xfd\x7d" - "\x89\x7e\xed\x8b\x25\xfa\xb5\x3f\xc0\xe8\xd7\x1e\x26\xd1\xaf\x23" - "\xd8\x3b\xfa\xb5\xc7\x4a\xf4\x63\xcf\x76\x4f\xbf\xf6\x6d\x9e\xe9" - "\xd7\x5e\x22\xd1\x8f\xd5\xe5\x1d\xfd\xda\x7f\x00\xba\xa9\x04\xfa" - "\xa9\x3c\xd3\xaf\x23\xf8\x06\xe9\x17\xc0\xe8\xd7\xd1\x26\xd1\xaf" - "\x63\x9f\x44\xbf\x8e\xa5\x8c\x7e\x1d\xf1\x12\xfd\xac\xb3\xbd\xa3" - "\x5f\x47\x91\x44\x3f\xf6\x6c\xf7\xf4\xeb\xf8\xc2\x33\xfd\x3a\x5a" - "\x24\xfa\xb1\xba\x3c\xd0\xaf\x8f\x7b\xfa\x59\x47\xdf\x18\xfd\xac" - "\xb3\xbb\xa3\x9f\x77\xbc\x87\x35\x81\x78\xb0\xc1\xf3\xb2\x1e\xcf" - "\x7e\xd7\x30\x96\xd3\x35\xa2\xe4\xb2\xac\xa5\x85\x5c\x6f\x3f\xdc" - "\xaf\x85\xdf\xa8\xbb\x7a\xb4\x81\x58\xed\x85\x5c\x2f\x3f\x3e\xeb" - "\xa3\x8d\x5c\xd6\xc7\x53\xf8\xf5\xbd\x7d\xb9\xf5\x7d\x7c\xf1\xfc" - "\xaa\xbb\xba\x98\xad\xdf\xb5\xf9\x3e\x83\xc8\xbd\x78\xae\x63\x03" - "\xf0\x6f\xf8\xbb\x23\xeb\x5a\x02\xf0\x22\xd7\xf9\xd9\x8f\x5f\xbc" - "\x22\xee\xf9\xc4\x45\x9a\xa4\x45\xf1\x2b\x97\xc5\xc7\x2d\x4b\xd6" - "\xc4\xbd\xf0\xd2\x0a\xb9\xaf\x63\x1a\x7b\xf3\x15\xec\xbf\x6b\x25" - "\x0e\x5f\x03\x59\x7c\x2a\xfa\x97\xd2\x0d\x27\x77\x35\x93\x6b\x2d" - "\xd4\x47\x74\xd0\xd8\x57\xf8\xae\x98\x9d\x51\x23\xf8\xa3\xd4\x6f" - "\x56\x57\xc2\x4e\x90\xb3\xa8\x7f\x01\x61\x8f\x01\x64\xed\xae\x36" - "\x3e\x70\x42\x3e\xda\x65\x30\x9b\xf3\x4e\xea\x8b\x01\xfd\x0e\xf0" - "\xaa\x88\x52\x4e\x3f\x21\x9f\xcf\x9d\xa0\x47\x1a\x54\xa3\xcf\xa2" - "\x14\x9f\xa1\x0d\xc4\xbe\x97\x0f\x8c\x28\x85\xba\x0e\x0a\xf5\x1c" - "\x44\x5b\xb7\xa8\x35\xfc\x37\x58\x9f\xc0\x7b\x63\xfc\x43\x03\xe3" - "\x07\x3b\xd7\x07\xac\xd7\xf8\x60\x59\xf4\x1d\x86\x3e\xb5\xc4\xd8" - "\x22\xd8\x6e\x2c\x0b\xfc\xf9\xa3\xf0\xfc\xa3\x7b\x68\xec\x10\xa1" - "\x0e\xd6\xa6\xbb\xa1\x4d\x65\xf4\x5b\xf4\x11\xf3\x5a\xd7\xc6\xec" - "\xc4\x7a\x18\x5d\xed\xaf\xc1\xbb\xe7\x61\x1d\xe8\xd3\x07\x9f\x15" - "\x9e\xb9\x07\x9e\x61\xbe\x4b\x36\x0c\xd9\xc9\xea\xb0\x2f\x17\xdb" - "\x05\x3c\x75\x5f\x48\x3f\xeb\xf4\x8e\x7e\x90\x7e\xcc\xe9\xbe\x3f" - "\xa4\x47\x02\x1f\x1a\x28\xdc\xef\x0f\x69\x8c\x0d\xeb\x4f\xbf\x2b" - "\x27\x53\xb0\xe7\xb4\xb5\x40\x9e\x4a\x28\x13\xd8\x4c\x6c\x18\x8b" - "\x38\x48\xa8\x23\x08\xd2\xef\xa3\x0c\x29\xdc\x0f\x86\xf4\x0e\xd4" - "\xef\x0b\xf7\x07\x42\x7a\x1d\xa4\xff\x4d\xb8\x0f\x7c\x7e\x17\xf3" - "\xb5\xa5\x8a\x28\xc6\x6f\x02\xda\xa7\xd2\x58\xe2\x81\x11\xc5\x90" - "\x17\x03\xf2\x6b\x06\xf6\x23\x7e\xa7\x61\x0d\xfa\x39\xe8\xaa\xc2" - "\xb3\x1e\xac\xaf\x26\xe4\x33\x3f\x11\xca\x18\xc8\x47\x3d\x8e\xcf" - "\x00\x1a\x8f\x60\x42\x2a\xfe\x86\xb6\x3e\x86\x34\x14\xde\x05\x32" - "\x52\x97\x45\xe8\x67\xa0\x1d\xfa\x9f\x24\x99\x58\x2f\x3b\xe7\xd0" - "\x25\x9c\x73\xb0\xf9\xdf\xdc\x99\x64\x9b\x3f\xfd\x0e\x18\x7b\xa8" - "\x03\x31\x07\x46\x44\xd3\x73\xf8\x30\xfe\xc4\x71\x80\x63\x80\x57" - "\x5e\x4b\x66\xfa\x15\x5b\xb2\xe4\x87\xbe\xab\x56\xd0\xb1\x10\x26" - "\x03\xd8\x9c\xec\x7f\xba\xe8\xdc\x77\xba\x57\xe2\x74\x2f\x46\xbc" - "\xc7\x6c\xd4\x6c\x15\x4e\xf7\xa6\xb8\xdc\x6b\x74\xba\x37\x5e\x5e" - "\xa7\x9d\x38\xdd\xd3\xca\x9f\xb3\x87\x3a\xdd\x0b\x76\xb9\x37\xde" - "\xe9\x9e\xaf\x70\xcf\x07\xf2\x67\x49\x3e\xbb\x3a\x2d\x42\x3e\xe0" - "\xb8\x3d\xc1\x29\xbf\x51\xc8\xc7\xf7\x67\x9a\xc8\xfe\x7a\x21\x9f" - "\x8e\x61\x18\x23\xf7\x09\xef\x28\x90\xde\xd1\x29\xd8\x5c\x45\x44" - "\xb3\xbe\xea\x0c\x0f\x50\x68\xfa\xe0\x78\x09\x58\x9f\x89\x71\x2b" - "\xf4\xcc\x3f\x0d\x9b\x63\x34\x4e\x1b\x5c\xe1\xb9\x70\x4f\xb8\xe7" - "\xde\x86\x8f\x53\x89\xe7\x9e\xec\xfa\x88\x29\x9c\x3e\x17\x7d\x89" - "\x0e\x45\x3f\x36\x19\x2d\xe8\x07\xc0\x42\x8c\xa4\x93\x18\x93\x3b" - "\x32\x31\x4e\x54\x35\x8b\x0f\x35\x00\xf7\xdf\xd0\xee\x1e\x7d\xf1" - "\x54\xeb\x2e\xd1\x18\x51\xab\x5a\x48\xa8\xee\x37\x7c\xe3\x05\xc2" - "\x25\xdb\x73\x23\xa6\x08\x67\x79\x77\xb0\xf3\x68\x1c\xfb\x1e\x94" - "\x59\x5b\xa8\xfe\xd7\xef\x02\xe1\x7d\x69\x19\x3e\x66\x07\xfb\x46" - "\x9e\xd2\x75\x4f\x96\x18\xf3\x87\x2b\x11\x63\xa3\x99\x08\xef\xd7" - "\x16\x98\xb8\x11\xf2\x0c\x72\x9b\x43\xee\x2b\xac\x13\xdb\x6e\x22" - "\x5c\x1a\xd6\x0d\x65\x1a\x1d\x36\x87\x90\xbf\xca\x46\x06\x43\xbb" - "\x2e\x88\xf5\x77\x64\xf1\xbe\x26\x62\xa7\x72\x24\xd6\xd9\x96\xbb" - "\xb5\x14\xf2\xd4\x26\x1f\xbe\x88\xd9\x2c\xf2\xc0\xff\x1c\xaa\xef" - "\xee\xbc\x17\xcc\x47\xc0\xc7\x09\x65\x30\x87\x8b\xd9\xb9\xcf\x09" - "\xa5\x4c\x56\xe7\x97\xa3\x5d\x04\xc6\xbc\x43\xd9\x99\xe1\x08\xcf" - "\xf6\x3f\x20\x0f\xfa\xa8\x18\xf0\x96\xea\x13\xbd\x9b\x73\x3c\xa5" - "\xc9\x96\xab\xc4\x2f\x27\x49\xf4\x99\xcb\x57\x3a\xf9\x12\x17\x6c" - "\x91\xf9\xb6\xea\x54\xba\x27\x44\xdb\xe8\xda\x06\x6c\x2f\xd4\xa5" - "\xf3\xb8\x36\xaa\x26\xd0\x18\x28\xd0\x2f\x5a\x6a\xdf\xa5\x20\xbf" - "\xf6\x51\x0f\x5a\xdb\x91\x4d\xc6\x8b\xb2\x37\x96\xc9\xe9\x44\xff" - "\x4d\x13\x4a\x1d\xdf\x99\x64\xc3\xb2\xb1\x54\x7f\xae\x20\xc9\x80" - "\x4b\xc5\xd8\x06\x21\x3f\xb9\xda\x66\xc5\x33\x95\x6e\x7d\xab\xd0" - "\x38\x2a\x68\x53\xb9\x75\x02\xea\xbb\x2c\x11\x56\xa1\xcd\x0a\x45" - "\x32\xda\x10\x63\x9b\x29\x6d\x15\x8a\xc5\x22\x1d\x37\x5f\x85\xba" - "\xd3\xcf\x90\x46\x05\xf9\x01\xed\x4e\xd0\x26\x7e\xcb\x1a\xc1\x16" - "\x0a\xf2\x68\xb9\x4e\x47\x19\x6a\xd7\x8f\x67\x01\x11\x1f\x0b\x69" - "\x1c\x0f\xf8\x06\xe8\x0b\x7a\xae\x5c\xa1\x98\x40\xf5\x98\x49\x84" - "\x7d\x37\xda\x99\x29\x14\xd4\x4e\xb9\x23\x5b\x11\x69\x52\x28\xe8" - "\xf9\x21\x93\x90\xb7\x05\xdf\x9d\xd2\x49\x2e\x2b\x14\x81\x18\x77" - "\x0f\xe8\x51\x86\x3e\x89\xaa\x2d\x30\x4f\x52\x3b\x71\x2c\x94\x61" - "\xcc\x26\x28\xaf\x62\x78\x0f\x34\x57\x10\x0b\xbe\x1f\x69\x0b\x7d" - "\x67\x06\x9a\xbe\x06\x75\x6f\x12\x69\x8a\xb1\x72\xa1\x4c\xb1\xa7" - "\x7e\x41\x1a\xd9\xa1\xcd\x78\x86\xde\x30\xf8\x0c\xb4\x4f\x39\x87" - "\x0b\x9a\x50\x8c\x36\x8d\xd0\xd6\x6b\x0c\x2b\x58\xdf\xd1\xb9\xa4" - "\x50\x3e\x00\xef\x38\x88\x7b\x80\xe8\x63\x97\xc6\x43\x56\x28\x6a" - "\x05\xfa\x51\x1f\xee\xfa\x14\x46\x07\xa1\xfc\x46\xa6\x67\x19\xf4" - "\x61\x47\xb6\x52\xda\xff\x81\x7c\xaa\x33\x0b\x61\x67\xbd\xe1\x5e" - "\x94\x53\x9b\x2d\xf4\x4c\x12\xd4\x05\xdf\xda\x84\xef\xda\x8c\x3e" - "\x63\x70\x5c\x34\x3b\x8d\x7f\x85\xe2\x24\xb6\x13\x6d\xe6\xec\x81" - "\x63\xb5\x7c\xee\xd8\x70\xa4\x33\xd4\x4d\x60\x2e\x14\x7b\x88\xb9" - "\x48\xe3\xb5\xc0\xfb\x4a\x45\x1e\x08\x78\x9f\xa1\xcd\x0a\xe5\x39" - "\xf6\xad\xcc\x5f\x1a\x9e\xef\x75\xe4\xe5\xee\x83\xf5\x2d\x62\x93" - "\xc0\xb3\x6c\xf2\xe8\x6b\x6b\x14\x89\xc4\x73\xec\x42\x7c\x51\x0b" - "\xaf\xda\xa7\x46\xff\x9d\xe8\x8b\xcc\xb0\xe6\x41\x68\xaf\x4f\xee" - "\x1b\x21\xf4\xac\x95\xc5\x30\xea\x2a\xda\xce\xb4\x5c\x48\xa3\xfe" - "\x29\xfc\x66\xa6\xda\x78\x7a\x1e\x1b\xcf\x69\x05\xee\x53\xe3\x3d" - "\xea\xc7\x1a\xeb\xbc\x59\x5f\x94\x0a\x9f\x79\x02\x6f\x82\x67\x77" - "\x7f\xd1\xac\xf0\xa1\xba\x49\xf8\x1d\xd2\xac\xf0\x3d\xc4\xe2\x75" - "\x31\xbf\xca\x82\x0d\x60\x6f\x76\x86\xd3\x4c\xa8\xcf\x46\x85\xef" - "\x03\x9a\x5f\x12\xd2\xa2\xf0\x1d\x4d\x7d\x9b\xea\x23\x0a\x04\x1a" - "\x14\x6c\x61\xed\x0a\x58\x98\xaa\xa4\x6d\xc4\xf6\x79\xd9\x36\xab" - "\xb0\x76\xf5\xee\xc8\xf6\x9d\x28\x9e\xfd\xa4\xdf\x2f\xf8\x3c\x35" - "\x0c\xbf\x8a\x6d\xd8\x27\xac\x57\x45\xc2\xbb\x8b\x7e\xfc\xbb\x7d" - "\x93\x85\x3a\x93\xa9\xdf\x57\xa0\x0b\xd4\x9b\x0c\xed\x28\x17\xd7" - "\x50\xc1\x6e\x3d\x9c\xae\xed\xd9\xbe\xf5\x8e\xf5\x53\xa0\xa1\x2c" - "\x46\xd1\xcb\x2f\x27\x6b\x80\x01\xd7\xc5\x25\xbf\x90\xa0\x59\x94" - "\x94\xf4\x72\x92\x06\x1d\x1c\x38\xcf\x31\x6a\x9b\x92\xed\x6b\x16" - "\x62\xcd\x14\x3b\x62\xcd\x64\xf7\x1a\xef\x1c\x13\xc9\xa4\xe8\xe5" - "\xd1\xa7\x99\x77\xdf\xd8\xcb\x63\xac\x64\xbd\x92\x2b\x85\xbf\x32" - "\xf8\x33\xc0\x1f\x9e\x4f\x21\x0b\xad\x24\x0a\xd6\x47\x7a\x4e\x53" - "\xf4\x89\xcd\x65\xf7\x52\xe1\xfe\x74\x83\xa2\xd7\xfb\x85\x9c\x2f" - "\xa1\xe7\xd9\xb3\x38\xb4\xf1\x40\x1f\xbd\x65\xf0\x67\x80\xbf\x0a" - "\xf8\x63\x3e\x5f\x3e\xa1\xe7\xfe\x4a\x9d\xef\xe1\x9e\x31\x9f\x95" - "\x8f\xbe\x7e\x6b\xf8\xf5\xbe\x74\x8f\x81\xdb\xca\xca\xb9\xb4\x41" - "\x09\x72\xec\x78\xa1\x1c\x5d\x4f\x07\xac\x27\x1a\x37\xe5\x7c\xf8" - "\xac\x6b\x79\x42\x39\xea\xd7\x56\xfc\x1e\xf4\x1f\x0d\xe5\xc5\x72" - "\xbe\x7c\xb6\xd2\x22\x94\xa3\x7c\x25\x97\xa5\x74\xf7\xde\x5e\x7c" - "\xd6\x67\xe2\x7b\x55\xce\xf5\x39\x95\xe9\xcd\x65\x99\xad\x58\x86" - "\x5b\xef\x4b\xf9\x37\x3e\xbb\x57\x0c\x94\x77\xeb\x77\xcf\xbb\x7e" - "\xea\x43\x5c\xfb\x49\xf7\xc2\xe2\x45\x8f\x2c\x5e\x96\x82\x51\x49" - "\x92\x5f\x5e\x99\x8c\xd7\x65\x71\x2f\xd1\xcb\xcb\x0b\x5f\x7c\x81" - "\xfd\x48\x4e\x8c\xc4\x1f\x89\x30\xde\xf0\x1a\xbf\x52\x87\x97\x17" - "\x5e\xc6\x64\x6a\x42\xf8\xca\x17\xc4\x30\xaa\xce\xe3\x50\xdb\x91" - "\xdd\x07\xd6\x8c\x5e\x74\x2f\x0e\x7e\x1f\x04\x79\x96\xc6\xbd\x09" - "\x58\x6f\x22\x27\xb4\x36\x22\xca\xb0\xac\xff\xfb\x10\xea\x23\x4f" - "\xd1\xe7\x58\x21\xd7\xc7\x2f\x60\xbd\xee\x85\x00\xdb\xe2\x45\x80" - "\xb3\x1b\xe1\x59\xb3\x89\x64\x0b\x67\x73\x23\x4a\xa8\x3f\xb8\xec" - "\x3e\x51\xa2\xdd\x1f\xa7\x8f\x88\x45\x9f\xcc\xd4\x0e\x68\x2b\xfa" - "\x40\x88\xd8\x04\xe9\x62\x48\x63\x9c\x85\x60\x48\x27\x40\xba\x14" - "\xd2\x6a\x48\x87\x72\xfa\xa1\x56\x3c\x2b\x05\x69\x0d\xa4\xc3\x3a" - "\xb2\xfd\x66\x89\xf3\xc2\x99\x36\x42\x90\x9f\x47\xdc\xca\xbb\x72" - "\x9f\x22\x30\xb7\xfc\xf2\xc4\x58\x8a\x34\x6e\x62\xb6\x9f\x63\xff" - "\x8f\xc5\x25\x51\xcd\xa3\xeb\x1a\x5d\xdb\xef\x1a\xe6\xa3\x1e\xd2" - "\x97\xf2\xde\xd9\x7e\x95\xe2\x1e\x2d\xe5\xad\xb3\xfd\xea\x9d\x62" - "\x4e\x62\xba\xc5\x11\x73\x92\xf1\xa2\x3b\x29\x2f\xaa\xb8\x6b\x0c" - "\x9f\xed\x37\xcf\x11\x17\x28\xfb\x2e\xd9\xfe\xaf\x09\xee\xa3\x4c" - "\x03\xf9\xe1\xd2\x3a\xe8\x67\xc0\x77\xba\x8b\xaf\x89\x31\xbd\x17" - "\xae\x06\xfe\x1b\xae\x02\x2f\xae\xa1\xb2\x56\x16\xfa\xfd\xe3\xdd" - "\xae\x6f\x34\xde\x94\xe2\xae\x43\xe8\xef\xd1\x9c\x11\xaf\x18\x51" - "\x48\x14\x34\xcd\x7c\x7d\xf1\x97\x15\x77\xd1\xf3\x83\xa2\x1f\x20" - "\xe7\x33\xb9\x6e\xcf\x00\x9c\x26\x84\xc5\xaf\x48\x7c\x39\xc0\x16" - "\xb7\x88\xf1\x6e\x7d\x07\x31\xfc\x1c\x3b\x8d\xad\xf1\x7d\x7d\xf9" - "\x67\x98\xbf\x7d\x93\xa2\xef\x46\x8c\xe3\x11\xa0\x48\x7c\x99\x87" - "\x67\x03\x52\xe3\x16\xd1\x3c\x28\xb7\x01\xe3\x32\xb3\xf6\x5d\x34" - "\x86\x36\x11\xbe\xdd\xce\xce\x1a\x2b\xee\x6a\x5a\x70\x4f\x26\xbe" - "\xc7\x8f\xf2\x0e\xa7\x89\x3f\xc6\x65\xc2\xb6\x15\x3a\xf9\x29\xda" - "\x02\x79\x68\x1b\xd5\xfa\x0c\xf1\x47\x7f\x8d\xac\x2d\x77\x35\xd1" - "\xf8\x37\xd9\x7d\x33\x45\x5f\x0a\x40\xe7\x26\xd7\xef\x79\xe6\xb7" - "\x74\x56\x8c\x7c\x21\x7c\xd6\x64\xf8\x15\x2e\x84\x1c\x74\x1e\x2f" - "\xa1\xad\x41\x0f\x6f\x6c\x3d\x30\xea\x3f\x68\xdc\xac\xec\xbe\x35" - "\x50\x4f\x32\xed\xe3\x0d\xbf\xbb\x88\x78\x42\x7d\x31\xd8\x89\x9a" - "\x9e\x7f\xe2\x2c\x34\x36\xd9\x05\x45\xff\x1d\xe8\x33\x91\xfa\x22" - "\xca\xee\x9b\x87\xfd\x0e\x7d\x45\xd7\x78\x6e\x6b\x04\xc6\x4e\xa3" - "\xfe\x3d\xb9\xdc\x71\x1a\xa3\x0a\xbf\xbd\x9f\x16\x70\x74\x12\xfc" - "\xfd\x27\x8b\x4f\xf0\xbb\x8b\x62\x9d\xe8\x2b\x04\xc6\x13\xd2\x4f" - "\xd5\x91\xdd\xcf\x31\xfe\x1d\xe7\xc6\x14\xfd\x96\xa3\x3f\x13\xf4" - "\xd7\xc0\xf8\xd6\xfe\xaf\x32\x5e\xb2\x5f\x9a\x89\x04\x44\xb3\x39" - "\xdd\x6f\xa3\x89\x14\x15\x09\xbf\x61\xfc\x8f\x72\xad\xe3\x6b\x51" - "\x5f\xc1\xc6\x7d\xbf\x32\x18\x7f\x93\xe0\xef\x3f\xa1\x7c\xb9\x18" - "\x97\x74\x83\x92\x9e\xf1\xb9\xe0\xa3\x26\x91\x90\x5f\x2f\xe6\xf7" - "\x52\x44\x01\x6d\xfa\xb5\x88\x18\xd2\x1a\x34\x76\x0c\xa4\x81\xe6" - "\x24\x53\x48\x47\x75\x64\xfb\xfb\x8b\x69\xf8\xad\x16\x31\x06\x7e" - "\x03\xff\xb7\xa7\x49\xf8\x1d\x69\x22\x6f\x8a\xf9\x13\x4d\xbe\x8a" - "\x4c\xb1\x9d\x5c\x96\x4f\x00\x6b\x6b\x7f\x1d\x97\x9b\x6b\xc0\xd8" - "\xaf\x50\x26\x16\xe6\x0a\xf3\x1d\x90\xd2\x52\xb4\xa9\x53\x35\x1b" - "\xe3\xb6\x1b\x5e\xc4\x31\xd0\x9f\xfa\x0f\xdb\xbc\x46\x35\x0b\xf9" - "\x37\x3c\xdf\x4c\xe3\xf8\xa0\xff\x2f\x1b\xe9\x4d\xfd\x46\xe7\xe6" - "\x96\x52\x7f\xc9\xab\xb4\xfe\xa2\xef\x2f\x98\x73\x80\x77\x9b\x6c" - "\xe8\x0f\x8c\xea\xb9\x3a\xb4\x03\xa8\x0f\x30\xc1\xf7\xd7\xee\x14" - "\x12\x5c\xc0\x31\xdf\x5f\xf4\xec\x73\x6f\xe0\xf5\x53\xdc\xfb\xff" - "\xe2\xb3\x8e\x58\x45\xff\x5f\x18\xeb\x19\x7e\x6b\xf9\x76\x1b\xe6" - "\x51\xff\xfc\x82\xdf\x57\x5f\xb7\xbe\xc0\x94\x80\x81\x4a\xe6\x0b" - "\xcc\xbb\xb5\xa3\xff\x44\xd6\xff\xfd\xd3\xc4\x78\xa8\x4e\x79\x7a" - "\x18\xbf\xcc\xce\x44\xd1\x4f\x27\xe4\x01\xfe\xed\x99\xed\xe0\xb3" - "\x00\xbb\x50\xdf\x07\xf3\xd3\xc2\x67\x24\xec\x70\x9e\x2f\xd4\x1a" - "\x80\xe0\x32\xdc\x0b\xd6\xd8\xde\xf0\xd7\x07\xff\xa6\x38\x70\xa1" - "\x9d\xaf\x13\xe2\xf6\xd9\x02\x52\x7d\xf8\x99\x36\x9b\xcf\x42\x9b" - "\xa2\x96\xc6\x26\xb4\x13\xe5\x4c\xbb\x0d\xcf\x14\xfb\xda\xda\xf9" - "\xda\x99\xf6\x56\x7e\xcb\x8b\x84\x9e\xd7\x9a\x69\x1f\xca\x2f\xb4" - "\xeb\x69\xac\x3e\x2e\x85\xaf\x41\x1e\xdf\xde\xce\x57\xda\x53\xf8" - "\x0a\xe8\x03\x7f\x94\x1f\xd0\xd7\xca\x00\x85\x95\x0c\xd0\xf9\x1c" - "\x9d\xd1\x76\x94\x47\x3f\x2b\x18\xf7\x86\xcb\xb6\xa2\xdf\x17\xc5" - "\x42\x9b\x4f\xa6\xd1\xd6\x48\x7d\x4e\xcf\x4c\x7d\x94\x9f\x69\xef" - "\xc3\x03\x4e\xfa\xd0\x98\x35\x29\x7c\xf9\xcc\xd5\x7c\x2b\x8d\x67" - "\xb6\x1a\xf8\xea\xd5\xad\x3c\xc6\x47\x83\xba\x2b\x16\xa6\x0e\xc7" - "\x78\x68\x9d\x33\x53\xb9\x8c\x85\xa9\x0a\x68\xcb\xb7\xfc\xcc\xd4" - "\x6f\xa1\x3d\x91\x50\xaf\x0a\xd2\x8f\xf2\x7b\x68\x3b\x33\xa9\x1c" - "\x03\xdf\x68\xd8\xc2\xda\x59\x06\x6d\x3c\x88\xbe\x60\x17\xda\x0c" - "\x99\x34\xfe\x9a\x10\x23\x79\x66\x6a\x17\x8f\xef\x83\x77\x8d\x9f" - "\xb9\x9a\x3c\xba\x70\xf5\xd0\x4c\x2a\x0f\x5e\x46\x9f\x35\x1a\x78" - "\x6f\x26\xd2\xc3\x1f\x63\x14\xd2\x33\x4b\xd9\x01\xda\xee\x62\xab" - "\xb9\x95\x9d\x73\x26\x44\xf3\xdb\x1e\x0a\xe6\x73\x26\x6a\xe0\x9a" - "\xc7\xeb\xc7\x4d\x41\x3b\x4f\x3e\xe7\x37\x36\x7e\xdb\x18\xc8\x7f" - "\xac\x0e\xae\x79\x7c\x4e\xf4\x41\x7e\xdb\x58\x48\xff\x87\x1e\xae" - "\x90\x1e\x94\x06\xe5\x55\x7c\xce\xe0\x16\xb8\xea\xf9\x9c\xd0\x79" - "\x50\x0e\xd2\xf7\x54\xc2\x15\xd2\x43\x27\x42\x39\x48\x6b\x4a\x2e" - "\x28\x02\xa0\xcc\x58\xc8\x7b\x2a\x91\xbd\x6b\x7a\x2a\x7d\x57\xce" - "\xac\x57\xd8\x3b\x7e\xab\x67\xef\x98\x5b\xc0\xde\xf1\x6c\x31\x7b" - "\xc7\xf0\x50\x28\xa7\xe6\x73\xc2\xfc\xe0\x9a\xcf\xe7\x8c\xb4\x40" - "\x39\x48\xff\x9b\x09\xae\x90\xbe\x1f\xde\x35\x16\xd2\xbf\x2a\x83" - "\x2b\xa4\x1f\xd8\x0b\xe5\x42\xf9\x9c\x88\x3c\xb8\x16\xf0\x39\xa3" - "\xb1\x7e\x48\x3f\x94\x0c\x57\x48\x8f\x8d\x87\x72\x90\x7e\x78\x36" - "\x5c\x21\x3d\x0f\xbe\xe9\x21\x0d\x9f\xb3\x20\x01\xae\x45\x7c\x4e" - "\x2c\xbc\x6f\x0c\xa4\xe3\x6a\xe0\x0a\xe9\x17\xe0\xf9\xb1\x90\x5e" - "\x34\x1e\xae\x90\x7e\x11\xbf\x35\x8c\xcf\x49\xc0\xf7\xec\xe5\x73" - "\x96\xe0\x37\x43\x3a\x31\x18\xae\x90\x5e\x8a\xed\x81\xf4\xcb\xf8" - "\x1c\xa4\x97\x03\x0d\x1e\xd2\xf2\x39\xc9\xfe\x70\x2d\xe6\x73\x52" - "\xea\xa1\x1c\xa4\x57\x97\xc0\x15\xd2\x69\x40\x43\x90\x2d\x73\x32" - "\xa6\xc1\x15\xd2\x59\xf8\xbd\xe1\x7c\xce\x2b\x66\xb8\x96\xf0\x39" - "\xff\x55\x0e\xe5\x20\xfd\x87\x7c\xb8\x42\x7a\x33\xd0\x0f\xe4\xd0" - "\x1c\x7d\x14\x5c\xdd\xee\xdb\xf2\x39\x6f\x94\xf1\xeb\x7b\x13\x3e" - "\x67\x4f\x31\xbf\xbe\x0f\x5c\xdf\x04\x5e\xb2\x17\xbc\xe3\x2d\x3f" - "\xc8\x87\xeb\x7f\x47\x43\x3a\x5c\x48\xc3\xf5\x4f\x91\x90\x8e\x14" - "\xd2\x70\xdd\x1b\x0a\xe9\x31\x42\x1a\xae\xfb\x30\x3d\x9e\xcf\x79" - "\x07\xae\xbd\xe1\xba\xaf\x00\xd2\x13\x85\x34\x5c\xff\xdc\x04\x57" - "\x1b\x9f\xf3\x76\x2d\xe4\x47\xf1\x39\xff\x93\x07\x69\xb8\x16\xcf" - "\x86\x74\x34\x5c\xb1\x3d\xd1\xe6\x91\xc3\x0d\xd4\x07\x5b\xd0\xb5" - "\x1a\x2e\xe4\x61\x7d\x46\x1b\x51\xa2\x2e\xb8\x34\xdd\x84\xe7\xc4" - "\x87\x36\x28\x02\x4f\xa2\xff\x72\x2c\x63\xdf\xfe\x90\x8a\x0b\x79" - "\x48\x0f\xf9\xbd\xa1\x5c\x9f\x0b\x8a\x20\x5c\x23\x89\x31\xcd\x44" - "\xe3\x27\x09\xbe\x89\x7a\xc3\x33\x3f\xc0\xda\x3f\x1e\xe3\xe3\x02" - "\xbd\xa6\xf1\x59\xbd\xae\xc2\xb5\x92\xcf\xea\xd7\x00\xf4\x82\x74" - "\xe0\x69\xb8\x42\x7a\xdc\x1f\x80\x5e\x90\xfe\xdd\xe3\x70\xad\xec" - "\xc8\x0e\x9a\x65\x52\x04\x50\x4c\xe3\xb3\x79\x1e\xfd\xba\xe2\x59" - "\x19\xc0\x1b\xce\x98\x66\x21\x7c\x76\x14\xe1\x87\xc5\x19\xa8\x8e" - "\x6c\xe0\xe4\xd2\x80\x54\x48\x8f\x1c\x61\xe0\x43\x94\x26\xfa\x0d" - "\x59\x20\xaf\x76\x85\x29\x59\x3b\xfa\xf1\x0d\x8a\xa0\xd7\x50\xaf" - "\xc9\x87\x0c\xf6\x74\x7f\x1f\xbd\x3f\xfc\xf9\x28\x76\x5f\x45\xa4" - "\xfb\xff\x89\xf7\x4f\x06\xa0\x2e\xfa\xbe\xa0\x28\x93\x22\x88\xda" - "\x5e\xc1\x15\xfd\x86\x13\xa3\xa5\x49\xf8\xde\x3e\x58\xee\x07\x7c" - "\xce\x93\xae\x85\xcb\x9b\x3a\x7e\x73\x16\x5f\x83\x72\x25\xac\x1f" - "\x4a\x4d\x7a\x58\x59\x83\x22\xd8\xb0\x1b\xf5\x05\xc1\x71\xf4\x1c" - "\x4e\x83\xe2\xee\x57\xbb\xb6\x8e\x4b\xc3\x18\xe6\x70\xef\x58\x86" - "\x95\xb7\x18\xd2\x1f\x87\x75\x8e\xe6\x97\x51\xdb\x6e\xf6\x7b\x2f" - "\xb5\xeb\x61\xbf\xf5\x54\xf7\x09\x75\xe1\xb3\xce\x7c\xbc\x3d\xbb" - "\xb6\x98\x0b\x89\x53\xd1\x7d\x28\xc5\xdd\xaf\x7d\xcc\x99\x94\x01" - "\xc9\xa4\x97\x66\xcd\x51\xa8\xff\x6e\x17\x99\x4f\x2c\x4b\xef\xbd" - "\x7f\x04\xca\xee\xa2\xfa\x99\xbb\x4d\xa2\x3e\x97\x87\x6f\x78\x1d" - "\xfd\x44\x2b\x49\x14\xae\x69\x8c\x87\x0b\x8e\x45\xff\x66\xb6\xe0" - "\x68\x8d\x4d\x7f\xcd\x60\xcf\x8b\x23\xfc\xf6\x38\xd5\x00\x9b\x82" - "\x50\xbb\x78\x45\xf0\xb6\x08\x2b\xea\xcd\x4e\x61\xd9\xe9\x5c\xef" - "\xb3\x89\xa3\x52\x89\xd2\x90\x74\x06\xd3\x9b\xf9\xec\x8b\x09\xc6" - "\x96\x3a\x82\xfe\x1a\x21\xbd\x89\xff\x03\xfa\xed\xb6\xe8\x0a\x91" - "\xf7\x4c\x45\x7d\xcf\x69\xcc\x0f\x04\x3a\x03\x5f\x1f\x9c\xe8\x14" - "\xb3\xbd\x66\x33\xd0\x0e\xf9\x42\x3c\xc3\xbc\xd0\x6e\x47\x3f\x33" - "\x1b\x4d\x40\x07\xa6\x33\x0c\x9e\x85\x78\x2d\xbc\xf7\x2d\x2e\x68" - "\x5c\x02\x7a\x9e\x09\xb0\xa9\xd0\x6f\x07\x8d\x01\x8c\x67\xf4\xb7" - "\x70\xb8\x4e\xb2\xb2\xce\x7d\xb7\x58\x38\xef\xb9\x78\x59\x72\xd2" - "\x72\xcd\x8a\xc5\x6b\x16\xfd\x7a\xe4\xca\x70\x4d\x52\xaa\x26\x89" - "\xc6\x17\xa5\x19\xf1\xe1\x9a\x15\x89\x2f\x27\x6b\x92\x57\xeb\x16" - "\x5d\x1f\x3f\x52\xcd\xab\xc6\x45\x33\x5e\x6b\x30\xb5\x75\xe0\x8b" - "\xe2\xca\x92\xd3\x78\x4e\x33\xbc\x0f\xf0\xe3\x03\x63\xaf\xf5\x0e" - "\xae\xc4\xf3\xdf\x5c\x96\x86\xca\x4e\xe8\xf3\x6e\x47\x10\xc1\xf3" - "\x15\x7e\x1d\xd9\x03\x63\x1c\x7b\x1c\x8a\xc1\x45\x4c\x1f\x31\x30" - "\xd1\xa4\xb8\x5b\x85\x79\x79\xa2\x2f\x20\xe1\x1e\xdd\x23\xc8\x1e" - "\xb8\xc9\x44\xfe\x8b\xf9\x2f\x28\x8a\x63\xf1\x1d\x15\x03\x99\xdd" - "\x94\x26\xae\x8c\xdf\x3b\xc2\x00\xbc\x90\x02\xf5\x3c\x34\x26\x1d" - "\xb9\x4a\xcf\x80\xf2\xdb\x26\x47\xe2\xd9\x6b\xfb\xf6\x71\xa5\x5c" - "\xc8\xe4\x48\xee\xed\xb0\xcc\x8c\x37\x89\xf2\x5d\x98\xff\xbe\x1a" - "\x18\xdf\xc3\xc9\xd0\xa3\xe9\x4d\x4a\x68\x73\xd5\xd1\xf4\x3a\x25" - "\x9f\x07\xfc\x72\xd8\xc8\x22\x6b\x16\x51\x30\xfa\x5b\xc9\xdf\xa2" - "\x09\xca\x26\x65\x96\x81\xd3\x2b\x2c\x03\xc7\xe5\x5b\xb7\xcd\x8d" - "\x34\x0c\x7f\x90\x4c\xbe\x9f\xbf\xf2\x69\x39\xea\x92\x06\x6f\xfc" - "\x34\x1a\x75\x79\xe3\x26\x5a\x55\xe3\xa2\x2c\xdb\xa3\x4b\xd1\x97" - "\xc6\xb5\xed\x73\x33\x3b\x43\x26\xa8\x8e\x43\x99\x53\xc0\xcf\x7f" - "\xa6\x81\xf1\x3b\x8c\x28\xaf\xdd\x37\x42\xf5\x6e\xa7\x5e\x59\x51" - "\x3e\x91\xe9\x1f\x63\x61\xce\xd0\xf1\x14\xb2\xfc\xd3\x83\xe5\x04" - "\xde\x4d\xde\xed\x9c\xa2\xfc\xdb\xf8\xeb\xee\xe7\x7e\x1a\x59\x4e" - "\x3a\xd0\x67\x1e\xc8\x4b\x47\xce\xe4\xc3\x78\x9c\x6a\xde\xbf\xc6" - "\xaa\x9c\x67\x22\xca\xaa\xba\x7c\x92\x76\x9e\xf4\xb7\x5d\xd1\xfa" - "\xfe\x19\x9e\xbf\x86\x31\x21\x3e\x53\x53\x3f\x49\xe9\x06\x1a\xbb" - "\x30\xa0\x1a\xf8\x0b\xee\x8a\xb6\x77\xf5\x6c\x03\xb9\x16\x34\xaa" - "\xd3\x36\x55\x4d\xaa\x12\xcc\xc4\x18\x53\x44\xae\x29\xa3\xc8\xa1" - "\xe7\x8a\xc8\x2e\xe0\xd9\x77\x5d\x26\xfe\x6c\x9f\x54\xdb\xdb\xd6" - "\xa5\xf5\xb5\xad\xd5\xa2\xdf\x0a\x9e\xbf\xa2\xed\x8b\xfc\xa4\xed" - "\x65\xad\x5f\xb5\xb9\x88\x44\x34\x11\xed\x35\x25\x09\xb8\xb6\x56" - "\xdb\xb7\x5a\x97\x0f\x75\x61\xb0\x53\xa2\x40\x9f\x39\xe8\x4b\x07" - "\xe9\xd4\x2f\x86\xcc\x6e\x51\x84\x3c\xd9\xb7\x96\x0c\xc4\x38\x15" - "\xe8\x73\x09\x7d\xf4\x71\xc1\x53\xcd\xf6\xe0\xe8\xd2\xf4\x36\x68" - "\x17\xfa\x9a\x38\x30\x4a\x83\x3c\xee\x02\xc0\x1d\xfc\x66\x8e\xd7" - "\xf6\x5d\x88\xd7\xad\xa3\x3a\x91\xcf\xe5\x3a\xd4\x18\x47\xc3\x0f" - "\xdb\x09\xf3\xd4\x6f\xdd\x39\xa0\x65\x86\xd6\x17\xca\xf9\x43\xfe" - "\x00\x63\x8b\x95\xd8\x1f\x18\x15\x39\x4a\x47\x63\x2f\x06\x17\xa6" - "\x13\x95\x3e\x9d\x04\x6b\xc6\xd1\xb1\xb4\xd8\xbe\x7f\x94\x86\xcf" - "\xd6\x4e\xe3\xd7\xfb\x86\xb2\xbc\x41\x4f\x6a\x9e\x20\x44\xf3\x20" - "\xfe\x56\xff\xa0\x79\x04\xfa\x30\x78\xea\x2c\xca\x83\x53\x39\x4c" - "\x7d\x9e\x8d\x71\xf5\xd7\xd7\x7a\x27\x65\x72\xd9\x6f\x15\x70\xeb" - "\x7d\x35\x18\x1f\xf5\xb2\x42\x7d\x8c\xcf\xf9\x20\x86\xcf\x9b\x4b" - "\xc7\x22\xa4\x3f\xbe\xd6\x7b\x04\xac\x47\x1f\x1c\x86\xfa\xa3\xae" - "\x29\x7c\xeb\xe0\xaf\x5e\x78\xfe\x20\x7e\xb7\x7d\xef\x88\x7c\xfc" - "\x6e\x1a\x7b\x01\xbe\x6b\x21\xf4\x19\x1f\x32\x95\x50\x5f\xbe\x5d" - "\x40\x5f\x21\x46\x1d\xd2\x03\x69\xc0\x75\x69\xfb\xd2\x6f\xed\xd2" - "\xfa\x03\x7d\x51\x56\x0b\x48\x8f\x83\x67\xb6\x4f\x0d\x86\x7b\x03" - "\xae\x05\x4f\x9d\x82\x31\x50\x8c\x3a\x33\xb1\x6f\x9b\xaa\x42\xff" - "\x43\x3b\xd6\xc0\x9c\x1b\x38\x15\xc6\xfd\xd4\x50\x61\x6e\x11\x6c" - "\x27\x97\xf3\x57\xa0\x1b\xd4\x09\x6d\x83\xf6\xd5\xc1\x5f\xbd\x49" - "\xa1\x1e\x7f\x6d\xe4\x88\x62\xb8\xfa\x43\x5b\x81\x36\x51\x89\xf8" - "\x1b\xee\x69\x80\x36\xc3\x90\x0e\x48\x0f\x46\x8b\x41\x83\x24\x5a" - "\x24\xe2\x33\x7e\x5c\x76\x11\xac\x1b\xea\x26\x3e\xfb\xdf\xc3\x9d" - "\xca\x3d\x26\x95\x4b\x9d\xc6\xca\xbd\x63\x66\xe5\x26\xef\x85\xfb" - "\x5f\x33\x7a\x0f\x7a\xf5\x7a\x7a\x0f\x5a\x27\x3d\x1b\x6b\x61\xcf" - "\x6e\xcb\x64\xcf\x46\xe2\xb3\xef\xbb\xb4\x69\xbf\x54\xfe\x77\x5a" - "\x56\x5e\x1f\xc9\xca\xff\x4a\xe7\x54\xee\x0b\xa9\xdc\x8b\x07\x59" - "\xb9\x9d\x15\xac\xdc\xd8\x1a\x18\x1b\x81\xd7\xb7\x65\xf0\x5d\xd2" - "\x33\xaf\x8c\x67\xcf\xbc\xdf\xc8\x9e\x99\x15\x0b\xf7\x1f\x93\xb7" - "\x65\xf0\x04\xa9\x7c\xba\xf0\xdd\xa5\xc9\xac\xfc\x54\x7f\xa7\x72" - "\x71\x42\x39\xb8\xff\x11\x96\xab\xbf\xd6\xfb\x0f\xa1\xac\xdc\x9c" - "\x12\x1c\x8f\x50\x66\x3d\x97\x7d\x7f\xed\xb5\xde\xf7\x81\xbc\xfe" - "\x8b\x1a\xe8\x9b\x50\xbc\x42\xdf\x85\x72\xfa\x71\x13\xe1\x37\xf5" - "\x31\x83\x98\x6b\x52\x0c\xd4\x02\xee\xda\xdd\xee\x57\x66\x0f\x36" - "\x38\xf4\x59\x1c\xf0\x06\xdb\x1e\x74\xeb\x37\x09\xc6\x5d\x22\xda" - "\x10\x20\xa6\x5c\x50\x0c\x19\x8d\x7e\xa9\xf8\x8c\x29\x82\x0e\x69" - "\x08\xd5\x5b\xa2\x7f\x04\xd4\x33\x0a\x79\x6a\xaa\x7b\x84\xb1\x09" - "\x72\x62\x19\xfa\x02\x43\xbd\x22\xac\x51\x40\xd3\x21\xd1\x18\xaf" - "\xfc\x0d\x25\x57\x0a\x7f\x65\xf0\x67\x78\x03\xf5\x8d\x59\x64\xb2" - "\xa8\x8b\x75\xdf\xd6\x21\xb0\xfe\x6d\xd4\x4b\xfa\xa8\x21\x69\x30" - "\x7e\x6b\xbd\xb6\xc7\x55\x0c\x49\xeb\x66\x5f\xc8\x97\xfa\xc5\xdd" - "\xfe\x50\xa4\x9e\x63\x71\x89\x61\x2e\x02\x3f\x37\xe4\x73\x58\xf3" - "\x33\xf1\x1e\x97\x37\xb9\x94\x0b\x83\xb5\xe4\x12\xf1\x31\xa6\x35" - "\x91\x52\xae\x49\xa9\xef\x24\xbe\xd5\xb0\x9e\x62\xf9\x52\xe0\x1d" - "\x34\xcb\x7c\x80\x8f\x18\x72\x51\xdf\x2e\xd4\x57\x14\x67\xc8\x58" - "\xca\xe2\xbd\x22\x2f\x89\x6b\x10\xe0\x8e\x3f\x8d\xdb\xb3\x0c\xf9" - "\x9d\xd0\x7b\xe0\xb7\x1f\x8d\xef\xfb\xf6\xf0\xa8\x6b\xff\x1d\x67" - "\xe8\x0a\x19\xaf\xea\xbc\x6f\xa4\xe6\x5a\xc8\xe4\x52\xdb\xf6\xe8" - "\x48\xdb\xf0\xb8\xc8\xae\xb7\x47\x18\xec\x21\xe3\xf5\xf0\x6e\x58" - "\x9f\xf2\x95\x07\x38\xbd\xf2\x40\x7a\x99\x12\xeb\x3d\x9a\x5e\xaa" - "\x3c\x92\x5e\xa3\x3c\xc2\x55\x28\x8f\xa6\x17\xc3\xb5\x08\x63\xb8" - "\x00\xff\x1a\xba\xf4\x48\xba\x01\xd6\xc7\xd0\x12\xa0\x57\x89\xa8" - "\xf7\xe4\x1f\xb7\x91\xea\x62\x1b\x39\x91\xdc\x46\xcc\x81\xe3\xa2" - "\xe1\x6f\x8a\x79\xe0\xd4\xf1\xe6\x81\x73\x23\x69\x9b\x43\xa6\xd1" - "\x6f\xc4\x33\x51\x47\x38\xd6\x66\x81\x1e\x58\xe7\x17\x85\x1c\x9e" - "\x9b\xa2\xfe\xda\xfc\x9b\x15\xf7\xe8\x29\x6d\xf4\xdb\x2b\x40\xe6" - "\xeb\xa0\x36\xd5\x4a\x16\x3f\x48\xf4\x87\x26\xc6\x1f\xa2\x31\x87" - "\x3a\xb4\xb8\xe7\x1d\x86\x71\x87\x76\xb7\x93\x60\xf8\x53\x8b\x31" - "\x65\x76\x0b\xbe\xc6\x73\x52\x24\x5d\x83\xa0\x47\x08\x66\xf1\x63" - "\x3e\xd0\xa2\xce\x81\xf2\x6d\xe8\x3b\x0d\x75\x0a\x2b\xb4\xe8\x9b" - "\xd4\xa1\x53\xb0\x77\x68\x95\x20\xc7\xd6\x08\x72\xac\x01\xe5\x56" - "\x94\xb3\x51\x76\x45\x5e\x67\x61\xaa\x81\xfa\x32\xa5\x7e\x36\xb6" - "\x4d\xc2\x33\xaa\x96\x8e\xec\x7b\x1c\xf1\xbf\x91\xb7\xb2\xe7\x8e" - "\x9b\x0d\x7f\xb3\x20\x1f\xe6\xf4\xb1\x29\x62\x3e\xbf\xb5\x93\x9e" - "\x13\xb3\xf3\x09\xbf\xe9\xc0\xf3\x3e\x7c\xc2\xa3\xf6\x6d\xe3\x8a" - "\xec\xdb\xe6\xaa\x20\x6f\x22\xfc\xfd\xda\x9e\xdb\x59\x0b\x7f\x75" - "\xf0\x57\x0f\x7f\x26\xf8\x6b\x84\xbf\x26\xf8\x33\xc3\x1f\xd4\xdd" - "\x69\x85\x3f\x9b\x3d\xb7\x8b\xc0\x9f\x2f\x97\xdb\xd9\x82\xbe\xc5" - "\xf8\xad\x5d\xb8\x1e\xa9\xc5\x7a\x25\x7a\xdf\xfb\x24\x7c\x7f\x14" - "\xf2\x7d\xfc\x80\x0f\x92\x79\x98\xef\xfc\x5b\xc3\x2b\x68\xfb\x11" - "\x97\xdf\x1a\x59\x64\x1e\x16\x57\x0a\x7f\x6a\x73\xe0\x92\x29\xf0" - "\x37\x0b\xfe\x62\xcc\xdb\xa6\xce\x82\xfe\x54\x43\xbf\x9a\x3a\xb2" - "\xef\x85\xfe\x1f\x59\xc2\x74\x4f\xf7\x02\x2e\x8c\xac\x14\x7e\x97" - "\x9b\x14\xc3\xc7\xe0\x6f\xf3\xc0\x69\x45\x90\xae\x35\x29\x46\xd0" - "\x72\xad\x21\x53\x63\x85\x73\x43\x99\x90\xdf\x62\xf2\x1d\x5c\xcc" - "\xca\x45\x6b\x70\xaf\xa8\x23\x7b\x28\x11\xe7\xa0\xcc\xc7\xf9\x0b" - "\xba\x85\x4b\xe3\x52\x17\xae\x48\x5c\xfc\xc2\xa2\x15\x8f\x68\x46" - "\xc6\x6b\xb4\x8b\x93\x96\x2f\x5c\xbe\x72\xd1\xca\x45\x94\x7d\x84" - "\xac\xfb\x65\x7b\x45\xc1\x78\x3e\xca\x76\x60\x54\x14\x07\x72\x4f" - "\x75\x63\x13\xe9\x07\x32\xcf\xba\xf9\x44\x59\x69\x39\x48\xf8\xe1" - "\x71\x06\xae\x77\xd4\xa3\xd5\xf1\x26\x72\xb8\xd9\xac\xb4\x01\x3f" - "\x37\xcd\x6c\x80\x79\x3a\xb9\xb4\x7f\xe3\x42\xfe\x70\xb3\x55\x39" - "\xad\xc5\x40\x32\xce\x01\x7f\x17\x6f\x25\x5d\xf7\x8d\x30\x1c\x6e" - "\x2e\x05\xde\x1e\xf8\xbc\xcc\x4e\x52\x69\xb5\xc1\x78\x9e\x1c\x89" - "\xcf\xf2\xc0\xe7\x61\x79\x94\xa9\xd0\xe7\x61\xd7\x7d\x61\x99\xfc" - "\xf6\xf1\x2a\x2c\x7f\x04\xf2\x67\xe8\x0c\x64\x3a\xd4\xd5\x15\x12" - "\x1d\xc9\xc3\x5c\xe3\xdb\xd3\xf8\xca\x46\x03\x39\xb2\xa4\x54\xf9" - "\x31\x3c\x8f\xba\x37\x1e\xe6\x68\x17\xcc\x4d\x68\x57\x24\x3e\x83" - "\xf7\x1a\x14\x9a\xbd\x78\x1f\x65\xa4\x2e\x68\xef\xbb\x50\x5f\xc6" - "\x4a\xe2\xcb\x64\x49\x97\x39\x9f\x12\x00\x3c\xb0\x26\x10\xe7\x3c" - "\x0f\x6d\xc5\xef\xd8\x0f\xcf\x1e\x58\x62\xa5\xcf\x83\x6c\xe9\x83" - "\x32\x25\xe2\x0a\xe2\x89\x31\x8d\xc9\x96\xa5\x5c\x1d\xc8\xa4\x3e" - "\xf8\xec\x74\xbc\x07\x32\x8a\xa5\x80\xca\x29\x9a\x8d\xa2\x6c\xf0" - "\xba\xe0\x93\xa8\x5f\x3d\x8c\x9d\x05\x64\xe8\x65\xc5\xd0\xe9\x48" - "\x53\xa4\x19\xee\xd7\x76\xf5\x1e\xea\xbf\x0b\xfd\x19\x05\x11\xbf" - "\xae\x6d\x71\x7e\xbb\xd0\xa6\x28\x5b\x53\x21\xf2\xdb\x96\xe0\x38" - "\x99\x3e\x86\xf5\xa1\x66\xd1\x32\xdc\x79\x88\xa7\x5b\x7c\x71\x2b" - "\x56\xac\x5c\xba\x48\xb3\x28\xee\x85\x04\x0d\xbd\xad\x59\xb9\x02" - "\x8a\x2c\x4e\x5e\xa1\x79\x79\xd5\x32\xcd\xd2\x15\x8b\x51\x72\x58" - "\x94\x94\xb4\x52\x97\xdc\x97\xb0\x27\x35\x4b\x57\x26\x26\x2f\xd6" - "\xc1\x8f\x15\x8b\x96\xc5\x6b\xe8\x48\x58\x01\x55\x25\x26\x6a\x84" - "\x37\xac\x48\x88\x4b\xc2\xc1\xb1\xec\xf7\x50\xc8\xe9\x79\xb9\x5c" - "\xe1\x8f\x3e\x9f\x70\x2d\xba\xac\x18\x7e\x7f\x39\xac\x3c\x7c\x5e" - "\x1c\xf5\x65\x03\x69\x2d\x95\x35\xb3\x35\x75\xb8\x1f\xf3\x46\x10" - "\xf1\x6d\x1d\x39\x12\xc6\xf3\xb0\xbd\xe2\xb7\xd1\x38\xef\xe8\x5b" - "\x0d\xfd\xf6\x29\x86\x0f\xa4\x67\xdc\x60\x8e\x50\x1b\x94\x6c\xcd" - "\xf7\x6c\xff\x62\x58\xad\x93\xaf\x79\x0b\xf5\xf1\xa6\x18\x76\x89" - "\xed\x65\x0c\x47\xff\xf6\x44\xf0\x51\xac\xe0\xb3\x87\x0d\xc2\x67" - "\xb8\x6d\x73\xd5\x1d\xd9\xc3\xfd\x25\x99\x65\x58\x23\x96\xa7\xe5" - "\xb2\x87\x8d\xe3\x07\x4e\x05\xb9\x7e\x18\xee\xf3\xb8\xf5\xb9\x04" - "\xe5\x34\xed\x50\xef\x67\xa5\x84\xfc\x2a\x98\x68\xdb\xb7\x4e\xa8" - "\xe8\x08\x1a\x17\xd3\x99\x45\xfa\x74\xc2\x5a\x67\x55\x92\xa1\xd7" - "\x60\x5c\xac\x1e\x4d\x7c\xd6\x4d\x27\xca\x52\x18\x6f\xe8\xe7\xba" - "\x72\x4a\x3e\x31\xc6\x9a\x88\xd1\x5a\x42\x2a\x0d\x0d\xa4\xca\xf6" - "\x0e\xf3\x91\xbd\x06\x65\x8e\x11\x9b\xd1\x6f\x53\xc6\x3a\xde\xfe" - "\xee\x87\xe6\x5e\x07\x60\x3c\x6a\x92\xc8\x50\xa3\xed\x1b\x83\x31" - "\x6d\x2f\x31\xa6\x1a\x0d\x78\xa6\x1d\xe8\xb6\xfa\x08\xdc\xbb\xab" - "\x12\x9e\x9b\x41\xfa\x40\x7a\x29\xbe\x63\xe3\x76\xbe\xee\xb5\x10" - "\xbe\xfe\xb5\xed\xbc\x69\x53\x08\xdf\x08\x63\xaa\x69\x73\x08\xdf" - "\xb2\x19\x63\x34\xa2\x9e\x1f\xda\xa3\x4b\x21\xea\x66\xc5\x08\x5f" - "\xaa\x03\x89\xa6\xe9\x41\x90\xa6\x7b\x85\xc6\xd4\xed\x98\x1e\x0c" - "\xe9\x30\x96\x2e\xc4\xf4\x10\x48\x8f\x61\xe9\x4f\x31\x1d\x0a\xe9" - "\x68\x96\xae\x26\xf4\x7c\xb7\x62\xc4\x6c\x96\xfe\x12\xd3\x40\xfb" - "\x11\xf1\x86\x14\x6c\xef\x59\xe8\xb3\x11\xcb\x33\xbe\x06\xd9\x35" - "\xf5\x02\x9d\x0f\x47\xd3\x13\x50\x47\x03\xf3\x61\x78\x1b\x8e\x77" - "\xc0\xad\xbc\xde\x91\x78\x1d\x9e\x1f\x60\x25\x7d\x80\x8f\xec\x07" - "\xf7\x16\x21\xed\xdc\xf2\x35\x07\x46\x5e\x99\x69\xe3\x0d\xfc\x5b" - "\x23\xca\xf8\x6d\x4f\x44\x02\x8e\xe2\x9a\x00\x58\xf1\xa0\xb9\x74" - "\x8d\x95\xfa\xe7\x04\xde\x1d\xe6\xd0\x08\xea\x27\xc9\x0c\xbc\xb0" - "\x07\x7f\x7d\x2a\x7e\xdb\xc3\x91\x20\x63\x16\x4f\xd7\xda\xd0\x1e" - "\x10\xf8\xff\xb0\x45\x27\x12\x90\x97\x98\xf6\x27\x6e\xef\x48\xc2" - "\x65\xc4\x10\x3e\x6c\x44\xd9\xf4\x04\xde\x00\xeb\x9a\x82\xe9\xc3" - "\xf9\x6f\x30\x56\x35\x7d\xef\xc8\x11\x65\xdc\xaa\x04\x8c\xd3\x41" - "\xf1\x25\x1d\xd7\xf8\x14\xc0\x83\xb5\x31\x01\xf6\x6d\xd3\x8a\x4e" - "\x24\x9c\xf7\x2e\xe6\x8d\x22\x2c\xde\xa3\x5d\x12\xb4\xc9\xce\xc7" - "\x10\x1b\xbc\xc7\x06\xdf\x8a\xfc\xc4\x01\xe0\x1b\x80\xaf\x29\xdb" - "\xff\x7c\x5d\x2f\x7e\x55\x4c\x00\x7c\xd3\x68\xa3\xb6\x8d\x54\x77" - "\xe2\x5c\x19\x19\x76\x22\x95\x90\xc9\xa9\x36\x43\x80\x99\xfa\x15" - "\x55\xe9\x96\x90\x7b\xf9\x81\x0f\x47\x36\x2b\x46\x26\xcf\x48\x83" - "\x6f\x80\x6f\x3f\xd2\x50\xe7\xcb\xc1\x77\x44\x30\xba\xe1\x73\x31" - "\x40\xdb\x62\x51\xe6\xf1\xae\xfd\x23\xe9\xb8\xe1\x56\xc4\x10\x3c" - "\xb3\xf7\x6e\x3a\xb4\xaf\x2b\x26\x80\x83\x35\x0a\xef\x9d\xd0\x5e" - "\x22\xf8\x4e\x46\xeb\x91\xd4\xf7\x2c\x1f\x06\x74\x86\xf7\xa3\x3f" - "\x53\x91\xae\x50\x36\xc6\xde\x95\xe0\xbe\xff\xb7\x4f\xd3\x41\xfb" - "\x8a\xf8\xdc\x4e\xf7\xfe\x68\xb7\x76\xee\x61\xe3\x63\x78\x1d\xfc" - "\x35\xf1\x6f\xc6\x69\xcc\x23\x87\x5b\x69\x7c\xb5\xed\x93\x8a\x9c" - "\xe2\x68\xc3\x18\x19\xd9\x86\x71\xb4\xdd\xfb\xdb\xd2\x57\xd0\xf8" - "\x35\xbd\xbe\xe1\x03\x30\x4e\x7c\x5a\x1b\xfa\xc6\xad\x38\xa1\xb5" - "\x78\xd9\xa7\xf7\x8d\xf7\xd4\xa7\x58\xff\xe4\xfb\xf9\x2e\x2f\xeb" - "\xdb\xe8\x71\x8c\xec\x05\xba\xa8\x3a\x0d\x9d\x7c\xb4\x82\xc9\x25" - "\xda\x91\x48\xab\x2e\x90\x29\xd6\x7c\x41\x94\x9d\xb0\x6e\xfe\x79" - "\x6e\x91\x32\x1c\xe6\x1d\xf0\x2e\x99\x95\x75\x95\x64\x66\x3c\xc9" - "\xa8\x6a\xb9\x8a\x3e\x85\x69\x5c\x1a\x3e\xe4\x29\x5d\xc9\x5c\xb3" - "\x12\xfd\xea\x63\x1c\x9a\x6a\x8b\x15\xf5\x11\xb1\xef\xce\xb5\x2a" - "\xed\xab\x62\x34\xe8\x53\x1d\xf7\x75\xd3\x5b\x78\x8e\xee\x4f\xb5" - "\x02\x9f\xd8\x0a\xb2\xba\x3e\x82\x54\xc6\x56\xd0\x78\x99\xe8\x93" - "\xa3\x2a\xa1\x8d\x7c\xf6\xca\x11\x52\x59\x57\x87\x67\xfe\xde\xac" - "\x6c\x3c\x4c\xb8\x56\xed\x00\xfb\x0a\x6d\x50\x41\x12\x09\x86\x79" - "\x7a\x17\x07\x34\xe6\x57\x08\x71\x08\xaf\x4a\x71\x08\x31\xce\x77" - "\x01\xc6\x14\xbc\xa4\x22\xb6\xde\xf7\x85\x42\x79\x5f\x8c\x39\xb8" - "\xfb\x2a\xd1\xee\x4a\x22\x61\xbb\xe0\x9e\x6c\x7f\xea\x25\xe0\x25" - "\x97\x10\xbf\x01\x6d\x2c\xe6\x38\xc6\x4e\x17\x63\x0e\xce\x68\xd3" - "\x90\xc3\x5f\x16\x29\x71\xec\x79\x47\xe7\x7f\xa3\x31\x44\x6c\x21" - "\xd3\x74\xb6\xc0\x4e\x83\x6d\xe4\x08\x18\xc3\xf7\x35\x41\x7f\xb9" - "\x95\xcb\x44\xda\x77\x65\x88\xb4\xbf\x7f\xbf\x48\xfb\xb5\xcf\x12" - "\xe5\xb5\xb7\xc3\x32\xdf\x39\x93\x2f\xd1\xbe\xf6\x7a\xda\xbb\xd2" - "\xfc\xc0\x73\x56\x25\xed\x8f\xe7\x80\x07\x7a\x7b\x84\xea\x9d\xe7" - "\x58\x1f\xf0\xb4\x0f\x62\xa5\x3e\xe8\x82\x3e\xe8\x92\xfa\x20\x7d" - "\xb9\xd8\x07\xe7\x59\x1f\xd4\xd2\x3e\x88\xa3\x7d\xd0\x05\x7d\xb0" - "\x56\x1b\xb4\x73\x0d\x09\x2e\x58\x43\xd4\xb4\x1f\x54\x7a\x8c\xaf" - "\xd0\x77\xf3\x1a\xe8\x87\x4e\xe8\x07\xab\xa3\x1f\x82\x65\xfd\xb0" - "\x46\xe8\x87\x4e\xa2\xdd\xd9\x49\xc2\x76\x66\xb1\x7e\x40\x5c\x9f" - "\x61\x09\xe0\xb9\xef\xb5\xa4\xb0\x19\xfa\x61\xb9\xd0\x0f\x81\x42" - "\x3f\xac\x85\x7e\x58\x0e\xfd\x00\xdf\x7f\x42\xeb\x2d\x26\xde\x9f" - "\x7a\x7d\x3f\x68\xe3\x7b\xea\x87\x4e\x47\x3f\xfc\xea\x49\xda\x0f" - "\xc0\x4b\xad\x79\x1a\xf5\x74\x61\x99\xfb\x4e\xeb\x95\xe1\x31\x80" - "\x3d\x40\xd3\xca\x69\xe5\x64\x66\x2c\xc9\xb0\x41\x9f\xbc\x73\xda" - "\xaa\xac\x6c\x84\xfe\x88\x87\xfe\x58\x23\xef\x0f\x4a\xf7\xed\x4f" - "\xe9\xfe\x0c\x65\x34\x73\x71\x9e\x4c\x8d\xdd\x7f\x1a\x78\x47\x37" - "\xf1\x9b\x9c\xf7\x6d\xa1\x2e\x0e\x63\xf7\xa2\x8d\x1c\xc8\x56\x03" - "\x76\x82\xec\x54\x95\xf0\x35\x11\xf7\x6f\x3f\xab\x37\x40\xdd\xda" - "\xa0\xcf\x7c\x3f\x20\xa7\x2a\x2b\x48\x80\x82\x0c\xdb\xc5\x91\xe0" - "\x53\xb5\x07\x91\x2f\x50\xc1\x18\xbf\xcb\x0e\xfd\x63\xef\x50\xf7" - "\xdd\x04\xf2\x15\xee\xeb\x3a\xef\xe7\x62\xdc\x4d\x1e\xfa\x06\xf2" - "\x7d\x6d\xd0\x37\x05\xed\x44\xbb\xa3\x9d\x84\xed\x10\xfa\xc6\x11" - "\x8f\xf3\x5b\x2d\xd9\xdd\x40\xfc\xfa\x2f\x66\x7d\x63\x17\xfb\x66" - "\x95\x56\x39\x7d\xb1\x86\x7c\x08\x34\x39\xa1\xfd\xc2\xcb\xbe\xf9" - "\x15\xb3\x31\x82\xbe\xe1\xa1\x6f\x78\xda\x37\xf7\xb7\x78\xea\x1b" - "\xfb\xde\xe1\x75\x76\xd5\xb8\x28\xf4\x23\xcd\xbd\x3c\x5b\xc1\x81" - "\xec\xd4\x09\x32\xeb\x67\x66\x1b\x49\x03\xb9\x61\xcd\xd7\xa4\xb7" - "\x71\xf6\x69\x62\x34\x95\x11\xf4\xdb\x8a\x3a\x6f\xf4\xcd\x6e\xb4" - "\x95\x01\xbd\xe7\xea\x31\xbd\x9b\xa6\xcd\x64\xed\x7c\xe2\x43\xe3" - "\xbb\xc5\x14\x91\x4d\xc0\x57\xef\x7f\xae\x48\xc9\xe5\x3d\xbc\x91" - "\x57\x0d\x41\x19\xcb\x80\x67\x8c\x00\x8b\xfc\xab\x12\x2a\xd1\x47" - "\xdb\x37\x19\xa9\xfc\xb9\x6a\x0b\xd4\x69\xe6\x3b\xed\xb0\x36\x14" - "\x66\xf1\x65\xe8\x67\x3b\x22\x95\xf2\xdc\x30\x4e\xc2\x47\x22\xcf" - "\x81\xba\x3f\x43\xfa\x4e\xe0\xb1\xc2\xef\xc7\x6f\x83\x3c\x45\xd5" - "\x12\x0b\xdc\x8f\xd8\x81\xed\x62\x7a\x78\x76\x8d\xc0\x38\x58\x21" - "\x73\xff\xfe\x71\xba\xd9\x57\x0f\xb2\x30\xf0\x62\x58\xcf\x4a\x9e" - "\xc9\x85\x7e\xc6\x5a\x2b\xd5\xc1\x9a\x33\x12\x7a\xeb\xd7\x60\x6c" - "\x24\xf4\xd9\x8d\x6b\x73\xc4\x93\x18\xbb\x92\xdf\x0b\xeb\x52\xc8" - "\xa4\xa2\xd2\xe7\xcd\x4a\x69\xfd\x0d\x2f\x82\x75\xcb\x3a\x59\xcb" - "\x67\xa0\x6f\xf3\x23\xf0\x5d\x28\xff\xbc\xd3\x60\x55\x5a\x01\x43" - "\xfe\xfc\xfc\x46\x25\xea\x88\xac\x30\xfe\x2a\xbf\xfc\x5f\x1a\x73" - "\xef\x82\xe2\x81\xf7\x4e\xc5\xd8\x08\xbe\x7f\xce\xfd\xb8\xcf\x12" - "\xde\x78\x4d\xf9\x81\xe6\x5a\xef\xfb\x52\x33\x1a\xa5\x78\x63\xce" - "\x71\xc5\x70\x2c\xef\x7f\x1e\xea\x84\x7a\x0e\x34\x64\x2a\x79\x11" - "\xd7\xdb\xd0\x26\x5e\x8e\x29\x55\x2d\x97\x48\x3a\x8c\xe3\xaa\x84" - "\x22\xea\x7f\x7e\x00\xe0\x39\xb7\x16\x70\xa4\x4b\x1b\xb4\x1b\x70" - "\x04\xe7\x7f\x21\xe0\x06\xb7\x56\xdd\x37\xa7\x93\x84\x8b\xf8\x81" - "\x3c\x16\x5e\xe7\xc3\x18\x0d\xa8\x80\x3c\xe8\x27\x2e\x17\xc6\x28" - "\xe0\xc7\xae\x35\x0c\xc7\x77\x23\x7e\x00\xff\x3b\x43\x07\xf8\xb1" - "\x0a\xf0\x23\x85\xc6\x83\x54\x17\x2a\x19\x6e\x7c\xd8\xb0\x51\xa9" - "\x17\x63\xd7\x52\xfa\x8e\x9a\x5c\x8d\xe3\x23\x36\x93\x9e\x21\xb3" - "\xa3\x8f\xf8\xb5\x31\x3e\xd5\x16\x18\x23\xdb\xe7\x66\x62\x1e\xc5" - "\xcf\x55\x09\x7d\x39\x36\xd6\xa2\x90\x26\x7b\x2e\x93\x48\x1a\x1b" - "\xed\x8a\xba\xef\x96\x65\x24\xbc\xf0\x32\x09\x2b\x5c\x46\xb4\x30" - "\x5f\x95\x85\xd0\x86\x05\xcb\x55\x84\xfa\x79\xef\x7d\x5f\x26\xe4" - "\xbb\xf5\xf3\x0e\xfc\xb3\xba\x10\xe7\xcc\xcb\x5a\x47\x9b\x6c\xfa" - "\xc4\x58\x3b\xd0\x8e\xfa\x28\x52\x8c\x62\x7e\xa6\x55\xf7\x5a\x19" - "\x3f\x3f\x8a\xc5\x58\xd7\x8f\xb0\x81\x4c\xd2\xa7\x59\x31\xea\x55" - "\x7e\xeb\xaf\x30\x0e\x91\xa2\x59\xbc\x07\x3c\x26\x07\x7d\x35\x2a" - "\x93\x64\x72\x81\xdb\x9b\x8c\xa9\xc0\x23\x65\x24\x78\x39\x0f\x47" - "\x51\x3f\xd6\x76\x7d\x62\x3c\x7e\x2f\xb7\x35\x31\x71\x4f\x33\x89" - "\xe4\x5f\x82\xfe\x58\x02\xdf\xda\x4c\xc2\x0a\x9a\xe1\x5b\x57\xb1" - "\x6f\x15\x63\xf5\x72\x59\x1f\x68\xe1\x9e\x7b\xbd\x8c\x18\xf7\xed" - "\x25\x8c\xfb\x36\xa4\x02\x30\xec\x6e\x7e\x38\x81\xb1\x40\xfd\x4c" - "\x74\x18\x6d\x5f\x13\x7c\x2f\xea\x8d\x8c\x57\xe9\x98\x5e\x8d\x63" - "\x99\x2b\x8a\xd3\x2c\xac\x87\xb1\xdd\x91\x80\x3a\x34\xcd\x91\x06" - "\x33\xfa\x75\xa0\xbc\x9d\x49\x11\x5e\x8c\xfc\xd8\x51\xc8\xc3\xb1" - "\xef\x34\xe6\x8b\x71\xcc\xe3\x7d\x3a\xee\xe1\x39\x63\xfd\x79\x82" - "\xf5\x39\xd7\x83\xfd\x2f\xd6\x75\x41\x11\x39\x1f\xeb\xc2\xb1\x80" - "\xfa\x1d\x9c\x6b\xac\xef\xcb\xd0\xde\x5b\xcd\x87\x4c\x50\xb1\xb4" - "\x19\x6d\x38\x54\x38\x06\xe8\x58\x81\x75\x15\xfd\x87\xf2\x7c\x8c" - "\x0f\x8c\x33\x6c\x67\x5f\xe8\xef\x48\x71\x5c\x40\x5e\xb0\xeb\xd8" - "\x18\xb0\x5e\x85\xb2\x4b\x30\xfe\xbe\xd1\xf1\xe1\x5d\xff\x45\x7a" - "\x8c\x5f\xcb\x85\x01\x1f\x0b\x78\x89\xb8\x69\x6f\x75\xc2\xcc\x16" - "\x86\x99\x88\x49\x22\x6e\x52\x6c\xa2\xbe\xbc\xcb\xd0\xee\x35\x81" - "\xb6\xd1\x4b\xdc\xac\x6a\x91\x70\x73\x86\xce\x09\x37\x5b\xf8\x4e" - "\x6e\xa4\x3b\xdc\x1c\x3d\x5f\x8e\x9b\xa3\xe3\xe4\xb8\x39\xe6\x84" - "\x2b\x6e\x5e\x8f\x99\xa3\xdf\x74\x87\x97\x20\xaf\x0c\x6d\x56\x8c" - "\x49\xf6\x8c\x95\xa3\x2b\xbd\xc7\xca\x07\xbf\x96\x63\xe5\x83\xaa" - "\xff\x77\xb1\xf2\xa1\xe5\x32\xac\x54\xdd\x20\x56\x36\x53\xac\x0c" - "\xe6\xbf\x87\x39\x21\xe0\x47\xe1\x12\x0f\x58\xb9\xa4\x87\xb9\xf0" - "\x92\x27\xac\x7c\xe8\xa4\x1c\x2b\x1f\xb2\xc9\xb1\xf2\xa1\xf7\x24" - "\xac\x14\xee\xdd\x12\xac\x7c\xa8\xe2\xce\x60\xe5\x43\x15\x14\x2b" - "\x2f\x23\x56\x8e\x79\xab\x67\xac\x1c\x5d\xeb\x1e\x2b\x21\x9f\x62" - "\xe5\xe8\x5a\x09\x2b\xbf\xee\x01\x2b\xc7\xbe\xe6\x05\x56\x06\x53" - "\xac\x54\x79\xc0\xca\x25\x40\x2b\x61\x5c\xd0\xb1\xe7\x32\x36\x04" - "\xac\x54\x3b\xb0\xf2\x06\xc6\x87\x77\xfd\x37\xd6\xa3\xfc\x8b\x58" - "\xc9\xe9\x19\x7f\x89\x58\xc9\x07\x09\x58\x99\x68\x23\x6b\xbe\x02" - "\x8c\xac\x6d\xa6\x3e\xff\xa9\xbd\x2e\xfc\xa5\x3d\x8b\x58\x14\x5d" - "\x7a\x00\xe8\x65\x34\x95\x52\x6c\xa2\xf6\xaa\xd3\x10\xab\x4a\xa1" - "\x6c\xbe\x83\xef\xa4\xd8\xf9\x95\x80\x9d\xf3\x04\xec\x5c\xf0\x23" - "\xb0\xf3\x39\xec\xcb\x71\x3b\xae\x29\x45\xec\xdc\x0a\xd8\x39\x8e" - "\xf2\x0f\xb8\xa7\xcb\xb0\xf3\x91\x81\x62\xbb\x50\x77\x69\x4c\xde" - "\x49\x58\xbb\xae\x5e\x8f\xa3\x4f\xd1\xfa\x2e\x19\x96\xb4\x10\x07" - "\x96\xce\x93\xb0\xf4\x82\x62\xc2\x09\xcf\x38\xfa\x70\xb0\x03\x47" - "\xb3\x00\x47\xcf\x3a\xe1\x28\xea\x0c\x10\xf3\x00\x47\x3b\x28\x8e" - "\x7e\x28\xe0\xe8\xf8\x91\xa7\xe6\x01\x8e\x3e\x25\xe2\xe8\xc3\x31" - "\xd6\xac\x0f\x34\xd6\xec\x9e\x71\xb4\x83\xe2\xa8\xee\xf6\xe3\x68" - "\xb9\x0b\x8e\x82\xcc\x8a\xb1\x6e\xdd\xe2\xa8\x38\x1e\x29\x8e\x66" - "\x4a\x38\x4a\xe9\x3a\xfe\x58\x75\x2c\xd0\x3d\x56\x47\xe5\x36\x07" - "\x8e\xea\x4a\x19\x8e\x42\x1e\xb5\x75\x58\x01\x38\x0a\xe3\x2f\xa3" - "\x0a\xfd\x55\x91\x28\x68\xa3\x0a\xf1\x75\x0f\xcc\x19\xa4\x91\x03" - "\x4f\x97\xc0\x9c\x41\x8c\x69\x85\x39\x03\x38\xba\xa0\x4d\x45\xe8" - "\x7c\xc9\x86\xf9\xd2\xec\x21\xc6\x90\x68\x7b\xeb\x11\x4f\x27\x0c" - "\x92\xe3\xe9\x84\x69\x72\x3c\x9d\xa0\x90\xf0\x54\xb8\x87\x78\x0a" - "\x7d\x06\xf4\x69\x42\x4c\xbd\x39\x3c\x9d\xa0\x76\xe0\xa9\x52\xc0" - "\xd3\x25\x3d\xe3\x29\xdd\x13\xf4\x80\xa7\xce\xd8\xe0\x19\x4f\x27" - "\xa8\x25\x3c\x9d\xd0\xe6\xc0\xd3\x3a\x4f\x78\xfa\x70\xa8\x7b\x3c" - "\x7d\x38\x94\xe1\xe9\xc3\xa1\x0e\x3c\xad\x73\x83\xa7\x4f\x39\xe3" - "\xe9\x23\xe7\x19\x9e\x96\x0a\x7e\x2c\x3a\x6b\xaa\x2d\x30\x3e\x70" - "\xce\x25\xe7\x53\x4c\xe5\x00\x53\x01\x0b\x94\x18\xbb\x04\xed\xe4" - "\xdd\x61\x2a\xc3\x5c\x13\x41\x5c\xc5\xb9\x99\x31\x1d\xe4\x5d\x58" - "\x8b\x80\x26\x74\xed\x15\xe9\xb7\xc7\x09\x5f\x17\xae\x56\x21\x6f" - "\x27\x1b\x2b\x9c\x38\x56\x5a\xb5\x68\x0f\x2c\x1b\x2b\xde\xf5\xe5" - "\x23\x8d\x9e\xb0\xd5\x93\xec\x7e\x0a\x65\xf7\x39\x44\xb9\x76\x0e" - "\xe0\x6b\x0c\xca\xee\xc5\x2e\xb2\x7b\xf1\xf5\xb2\xfb\x17\xdd\xe3" - "\xa8\x57\xb2\xfb\x5c\xec\xc3\x7f\x3f\x27\xc7\xd1\x7f\x3f\x2f\xc7" - "\xd1\x47\xe3\xb0\x5d\x0c\xc7\x8b\xdd\xcb\xee\x74\x9e\x4f\x1c\xed" - "\x90\xdd\xeb\xe4\xf8\x29\xc9\xee\x8f\x06\x7a\xc6\xd1\x89\xf3\x64" - "\xfc\xe8\x02\x01\x47\x9f\x17\x70\xf4\x79\x09\x47\x3f\x3b\x2d\xf2" - "\xa3\xbf\x5e\x7d\xb2\xce\x19\x47\x27\x16\x39\x70\xb4\xfe\x7a\x1c" - "\x15\x31\x94\xc6\x06\x87\x7a\x50\x87\x55\x02\x38\xfd\xee\xf3\x3a" - "\xaa\x8b\x42\xbd\x20\xea\x60\x1d\x3a\xa8\x0e\x11\x4f\xdb\x48\xfa" - "\x3c\xc4\xd3\x7c\x8a\xa7\x01\x0a\x12\x07\xd8\x37\x40\x8c\x1d\xbe" - "\x3b\x85\xa8\x71\x2e\xa2\x7e\x89\x5b\xc5\x62\xa0\x89\x7a\x26\xf8" - "\x5e\xba\x8f\x3f\xff\x6b\x01\x53\x31\x8e\x6c\x20\x8d\x1f\xae\xdd" - "\x95\xe2\x86\x37\x5d\x0b\x98\xba\xc6\x89\x37\x85\xb9\xff\xe1\xf3" - "\xae\x98\xfa\x9b\xfe\xd5\x38\x56\x10\x53\x65\x72\x7c\xf1\xcf\x40" - "\x8e\xff\xcd\x22\x39\x96\xfe\x26\x5f\x8e\xa5\xbf\x99\x2e\x61\xa9" - "\x70\xef\x96\xf0\xa6\xbf\x89\xbf\x33\xbc\xe9\x6f\xe2\x25\x39\xfe" - "\xd1\xc7\x1c\x58\x5a\xeb\x09\x4b\x27\xc6\xbb\xc7\x52\xc8\xa7\x58" - "\x3a\x31\xde\x81\xa5\xb5\x6e\xe4\x78\x19\x96\x46\x8d\x64\x58\x5a" - "\xcc\x78\xd3\x3a\x91\x37\x2d\xfe\x27\x94\xe3\xa3\xc2\xbc\x95\xe3" - "\x4f\xb5\x30\xfc\x44\x7c\x12\x31\x54\x92\xe3\x8b\x3d\xcb\xf1\x3d" - "\x60\xa8\x57\xbc\x28\xc5\xd0\xc7\x46\xca\x31\xf4\xb1\xfb\xe5\x18" - "\x1a\xbd\xc3\x15\x43\xaf\xc7\xcf\xc7\x16\xbb\xc3\x4e\x26\xc7\x47" - "\x4f\xf1\x8c\x9b\x8f\xe5\x79\x8f\x9b\x8f\xbf\x27\xc7\xcd\xc7\xea" - "\xfe\x35\x70\x73\xd2\x64\x19\x6e\xaa\x6e\x10\x37\x7f\x12\x99\x7e" - "\x92\x8b\xfe\x73\x92\x8b\xfe\x73\x92\x93\xfe\x73\xd2\x2d\xd4\x7f" - "\x4e\xba\x43\xfa\xcf\x49\x05\x12\x0f\x1a\xbd\xba\x67\xdc\x7c\xac" - "\xc0\x3d\x6e\x42\x3e\xc5\xcd\xc7\x0a\x24\xdc\xec\x89\x07\x9d\x3c" - "\xdf\x0b\xdc\xfc\x99\xcb\xf4\x93\xbb\xd5\x7f\xba\x93\xe9\x11\x37" - "\x29\x5e\xd6\xb9\xc8\xf4\x73\x9c\x65\xfa\x62\x49\xa6\x9f\xc2\x70" - "\xcb\x68\xd3\xcb\x65\xfa\x5b\x8e\xa3\x4f\x2c\xb5\x3a\xf4\xa1\x7f" - "\x00\x1c\x7d\x82\xfa\xe5\xb2\x3a\xf4\xa1\x4f\xb6\x89\xed\x62\x32" - "\xfd\x56\xc2\xda\xe5\x46\xa6\xa7\x76\xc3\x4f\x1c\x73\xc8\xf4\x75" - "\xae\x32\xfd\x93\x6f\x79\xc6\xd4\x27\x9a\xdc\xca\xf4\x28\x7f\x53" - "\x4c\xd5\x51\x4c\x6d\xdf\xee\x8c\xa9\x53\x7a\x51\x4c\x7d\x42\xc4" - "\xd4\xff\x08\xb7\xc2\xdc\xb4\xf6\xee\x19\x53\xb1\x1e\x09\x53\x13" - "\x7e\x1a\x4c\x35\xdc\x38\xa6\x3a\x9f\x5d\xfd\x10\xbe\xdd\x81\xa9" - "\x94\xc6\x53\xde\xac\x8e\x45\x4c\x4d\x70\x91\xef\x8b\xdd\xcb\xf7" - "\x27\x89\x12\xe9\x23\xca\xf7\xd8\x07\x14\x6f\x6e\xab\x7c\x3f\xe5" - "\x9a\x1c\x5b\x9f\x0c\x97\x63\xeb\x94\x73\x12\xb6\x0a\xf7\x6e\x89" - "\x7c\x3f\xc5\x7a\x67\xe4\xfb\x29\x56\x09\x5b\x9f\xfc\xa2\x67\x6c" - "\x7d\xc2\xec\x1e\x5b\x21\x9f\x62\xeb\x13\xe6\x6e\xb1\xf5\x09\x67" - "\x6c\x7d\xea\x84\x88\xad\x92\x7c\x0f\xe3\x03\xe7\x5f\xb2\xfe\xe6" - "\xe5\xfb\x27\xef\xb4\x7c\xff\x54\xb9\x57\xf2\xfd\x76\xc0\x59\x90" - "\xc5\xd7\x7e\x0e\xf2\xfd\xd3\x82\x7c\x5f\x5f\xe4\x22\xdf\x17\x5d" - "\x27\xdf\xa7\x3d\x2d\x60\x2a\xcc\x29\x8a\xa9\xcf\x17\xdf\xbc\x7c" - "\xff\x0c\xf6\xe1\xd4\x63\x72\x4c\x9d\x7a\x42\x8e\xa9\x33\xe7\x60" - "\xbb\x18\xa6\x17\xb9\x97\xef\xe9\x3c\x9f\x16\x28\x93\xef\xa1\x7d" - "\xd7\xcb\xf7\x33\x7b\xc9\x30\x75\x81\x33\xa6\x4e\x9b\x28\xe3\x53" - "\xe1\xbb\x10\x53\xf7\x9d\x65\x98\xfa\xce\x59\x27\x4c\x9d\xf1\x8e" - "\x80\xa9\xd3\x97\x9e\x9c\xed\x8c\xa9\xd3\x32\x45\x4c\xa5\x78\xb9" - "\xc0\xaa\xcc\x88\xf1\x6c\x6f\x52\x02\x75\xe3\x39\x31\xac\x73\xff" - "\xd9\x84\x9e\xed\x4d\x62\xe4\xf6\x26\x0e\x5b\x93\x64\x13\xa9\x6c" - "\xd4\x53\x5b\x93\x82\x14\x12\x1c\xb0\x9e\x0c\x2b\xe8\x64\x3e\x03" - "\xa8\xbf\xc2\x76\xf7\xfe\x02\xe6\x3f\x2b\xe1\x2c\xfa\x0c\x00\x8c" - "\xd5\xee\x6c\x67\xb6\x3f\xd0\xdf\xd7\xfb\x08\x10\xf9\x26\xc0\x83" - "\x43\x67\x5d\x71\x76\x86\xa2\x1a\xc7\xcf\xbc\x04\x17\x99\xbf\xe8" - "\x67\x20\xf3\xcf\x78\x56\x8e\xaf\x33\x36\xc9\xf1\x75\xc6\x63\x12" - "\xbe\x0a\xf7\x6e\x09\xef\x3a\x23\xe6\xce\xf0\xae\x33\x62\x24\x99" - "\x7f\xe6\x58\x07\xbe\xd6\x38\xe1\xeb\x59\x67\x7c\x9d\x16\x4d\xf1" - "\xf5\xac\x2b\xbe\x42\x3e\xc5\xd7\x69\xd1\x0e\x7c\xad\x71\x91\xf9" - "\xcf\xba\xe2\xeb\xac\x41\x14\x5f\x61\x2c\xc8\x79\xd7\xa2\x9e\x65" - "\xfe\xfa\x9f\x9b\xcc\x3f\x4b\xed\x95\xcc\x8f\x98\x9a\xc8\x30\x15" - "\x31\x4b\xc4\x55\x49\xe6\x2f\xf2\x28\xf3\xf7\x84\xab\x5e\xf1\xaa" - "\x14\x57\x9f\x1e\x24\xc7\xd5\xa7\xef\x91\xe3\xea\xec\x37\x5d\x71" - "\xf5\x7a\x4c\x7d\x7a\xbe\x3b\x3c\x65\x32\xff\xec\x59\x9e\xb1\xf4" - "\xe9\x8d\xde\x63\xe9\x33\x87\xe4\x58\xfa\x74\xe5\xbf\x2e\x96\xfe" - "\x76\xba\x0c\x4b\x55\x37\x88\xa5\x3f\x89\x1e\xe0\xb7\x6f\xc9\xb1" - "\xf4\xb7\x75\x72\x2c\xfd\xed\x66\x09\x4b\x85\x7b\xb7\x04\x4b\x7f" - "\xbb\xf7\xce\x60\xe9\x6f\xf7\x4a\xbc\xea\xec\xf5\x3d\x63\xe9\xd3" - "\x7a\xf7\x58\x0a\xf9\x14\x4b\x9f\xd6\x4b\x58\xfa\x75\x0f\x58\x3a" - "\x67\x91\x17\x58\x2a\xd7\x03\xb8\x62\xe9\x1d\xd7\x03\xcc\xf1\x78" - "\xfe\xc1\xad\x1e\x40\xc4\xd2\xa7\xaf\xd7\x03\x20\xbe\x52\x3d\x00" - "\xd0\x4b\xc4\x30\xaa\x07\x88\x66\x58\x66\xb4\x6d\x94\xe9\x01\x6e" - "\x3d\xb6\xce\x5d\x69\x75\xe8\x53\xb3\x00\x5b\xe7\xd2\xb8\xbd\x56" - "\x87\x3e\xf5\xb9\x40\xb1\x5d\x4c\x0f\xf0\x07\xc2\xda\xe5\x46\x0f" - "\xf0\x38\xad\xef\xa4\x4c\x0f\xe0\x84\xb5\x17\x14\xcf\x1e\xf3\x8c" - "\xb3\x73\xcd\x32\x3d\x40\x83\x84\xb3\xed\x68\x93\x0e\x38\x48\x71" - "\x36\xc4\x19\x67\x63\x86\x51\x9c\x7d\x5c\xc4\xd9\xff\x1c\xd3\x01" - "\x73\xb3\xc3\x5b\x9c\x45\x1b\xe9\xb3\xb1\x77\x06\x67\xcb\xbc\xc0" - "\x59\x27\xdd\xc0\x21\xa0\x87\x03\x67\x29\xdd\x63\x3e\xae\x9e\x87" - "\x38\x1b\xeb\xa2\x1b\x28\x72\xaf\x1b\x38\x71\x27\x74\x03\xcf\x0e" - "\x94\xe3\xed\xb3\x53\xe4\x78\x1b\x63\x97\xf0\x56\xb8\x77\x4b\x74" - "\x03\xcf\x06\xdf\x19\xdd\xc0\xb3\xc1\x12\xde\x3e\xfb\x43\xcf\x78" - "\x3b\xd7\xea\x1e\x6f\x21\x9f\xe2\xed\x5c\x6b\xb7\x78\xfb\xb8\x33" - "\xde\x3e\x77\x4e\xc4\x5b\x49\x37\x50\x24\xe8\x06\x36\xf6\xac\x1b" - "\xa8\xf7\xa0\x1b\x98\x7c\xa7\x75\x03\xcf\x99\xbc\xd1\x0d\x5c\xdb" - "\xce\xec\xf6\xd7\xa2\xdd\xfe\x7c\xc0\xdf\x59\xa7\x81\x06\x3d\xdb" - "\xed\xa7\x89\xf6\xa7\xb1\xf9\x02\xce\xe6\xbb\xd5\x0d\x9c\x6a\xf2" - "\xac\x1b\x38\x55\xeb\x6c\x7f\xfa\xbb\xaf\xe5\xfb\x56\xbf\x3b\x27" - "\xee\x5b\x9d\xfa\x12\x71\x76\xe1\x45\x4c\x73\x79\x53\x4d\xcc\x17" - "\xe1\xc2\x26\x6c\xa7\x3b\x3b\xfe\x0f\x39\xe7\xbd\xac\x79\xbf\x76" - "\xe8\x0a\x6a\x10\x6f\xf3\x09\xc7\x27\xf4\x46\x1f\xde\x54\x57\x30" - "\x17\xc7\xde\xc2\x1d\xce\xb8\x7b\xe4\x8c\x33\xee\xce\x4b\x10\x71" - "\xd7\x0e\xb8\xfb\x71\x43\x3e\xd3\xbf\x3e\xc7\x6c\x53\x4b\x9e\x73" - "\xb2\x4d\x3d\xfd\x89\x80\xbb\xf3\x17\x9d\x34\xc1\xf7\x77\x67\x3f" - "\x05\xcf\x1f\x38\x73\xa3\x36\xa8\xf9\x6e\x6d\xa7\x04\x7c\x72\x6b" - "\x3f\x05\x6d\x55\xed\x16\xe6\xaa\x1d\xe6\xe9\x6e\x27\xfb\xa9\x82" - "\x35\x30\x9f\x85\xb3\x57\xdd\xda\xa1\x3e\x27\xd9\xa1\xf2\x79\x53" - "\x43\x71\x7d\xe3\xb6\x4d\x35\x75\xf2\x09\x3e\x7c\xf0\xd4\x50\x7c" - "\x7f\x57\x17\xac\x3b\x93\x62\x7c\x04\xb9\x0e\xb1\x67\x00\xa3\xfb" - "\xfc\x22\x3b\xac\x35\x76\x58\x6b\xa0\xcf\x88\x0d\x79\x93\xed\x53" - "\x7d\x0b\x40\xce\xb3\x65\xd1\x98\x81\x7d\x73\x40\xd6\xdb\x83\x72" - "\xde\x65\x98\x1b\x19\x5a\x25\xb6\x47\xc4\xd1\x80\x26\xf8\x8e\xcb" - "\xdd\xf3\x72\xb6\x2b\x12\x8e\x1a\x9e\x3a\x05\xef\x5c\xb0\xad\x1a" - "\xc7\x6e\x8c\x74\xa6\x80\xf2\xcc\x1e\x6c\x65\xb1\x2d\xcc\xd7\x22" - "\x8c\x85\x5b\xa0\x93\x70\x6e\x8f\x1c\xd7\x17\x5c\x92\xe3\xfa\x42" - "\x8d\x1c\xd7\x17\x7c\x21\xe1\xba\x70\x0f\x70\x1d\xfa\x8d\xf2\xd1" - "\xb0\xf6\xdd\x24\x1f\xbd\xa0\x45\xc4\x75\x4e\xc0\xf5\xc2\x1b\xc0" - "\xf5\x6e\xf9\x68\x27\x5c\xf2\x8c\xeb\x0b\x5a\x24\x9d\xc4\xc2\x93" - "\x6e\x6d\x64\xcf\x38\xe3\xfa\x3c\x1d\xc5\xf5\x33\xae\xb8\x0e\xf9" - "\x14\xd7\xe7\xe9\x3c\x9e\x27\x38\xe3\xba\x9f\x16\xbb\x9f\xe2\x7a" - "\x9d\x60\x23\x5b\xe3\xc5\x79\x82\x3a\x86\xe9\x22\x96\xa3\xbe\xea" - "\xce\xea\x24\x62\x4b\xbc\xd1\x49\x50\x2c\x6f\x61\x58\x8e\xd8\x28" - "\xe2\xf9\x8d\x9c\x27\xe8\x09\xcf\x45\xbe\x19\xf1\xdc\x13\xdf\x2c" - "\xc7\xf3\xb8\xfd\x72\x3c\x8f\x7b\x4f\x8e\xe7\x8b\xf6\xcb\xf1\x7c" - "\x51\x89\x2b\x9e\x5f\x8f\xe5\xcf\xbb\xc5\x71\xdd\x5c\xd4\x51\x2c" - "\x9a\xe7\x19\xc3\x9f\x0f\xf7\x1e\xc3\x5f\xb8\xff\x5f\x0e\xc3\x55" - "\xae\x18\xfe\x42\x3c\x62\x90\x3d\xdb\x05\xc3\x97\x08\x18\x2e\xe0" - "\xc8\x9e\x66\x81\x17\x76\xc5\xf0\x16\xf8\x8e\x1e\xe4\x71\xdb\xf7" - "\xae\x18\x1e\xff\xac\x0c\xc3\x55\x3d\x60\xf8\x12\xa6\x07\x91\xd9" - "\xe5\x7a\xd0\x85\xc0\x77\x64\xee\xf6\xc0\x9b\x8b\x34\x73\x6e\x8f" - "\x1c\xc3\xe3\xdf\x93\x63\x78\x7c\xa3\x1c\xc3\xe3\x77\x48\x18\x2e" - "\xdc\xbb\x25\xbc\x79\x7c\xe9\x2d\xe7\xcd\xc5\xf1\xd1\x2d\x86\xc7" - "\x97\x4a\xbc\xf9\xa2\xcd\x3d\x63\xf8\xf3\x63\xdc\x63\x38\xe4\x53" - "\x0c\x7f\x7e\x8c\xc7\x73\x0e\xd7\x61\xf8\x8b\x4b\xbd\xc0\x70\xb9" - "\x2e\x44\xc4\x70\x41\x17\xb2\xc7\x49\x17\x62\xcf\x62\xba\x90\xdd" - "\xcd\x6c\x6c\x0c\x50\xb0\x71\x0a\xe3\x47\x5d\xa8\xec\x5e\x76\xdb" - "\x7d\x53\x7a\x90\x17\x13\xbd\xd1\x83\x50\xfc\xc6\x33\x0e\xcf\x02" - "\x6e\xd7\xdc\xe0\x19\x87\x29\xe2\x19\x07\xbd\x87\x33\x0e\x02\x9e" - "\x2f\xf8\x11\x78\x4e\xcf\x38\xfc\x7e\x9d\x5c\xc7\xfc\xfb\xf5\xa2" - "\x8e\x99\xe1\xf9\x4b\xb9\x72\x3c\x7f\x49\xef\x38\xf3\x00\x98\x6f" - "\xd4\x6d\xbd\xee\xcc\x83\x03\xdb\xa9\x1e\xf4\xf7\xe7\x0c\x73\x1b" - "\x89\x03\xdf\xe7\x49\xf8\x0e\x75\x3d\x26\xc3\xf6\x06\x67\x6c\x07" - "\xac\x75\xc6\xf6\xb3\xf9\x72\xfb\x88\x06\x9d\x13\xb6\x8b\x67\x1e" - "\x16\xf7\x3a\x59\xdf\x03\xb6\xc3\xf3\x37\x7e\x46\xec\xd6\x62\xbb" - "\x78\xbe\xc1\x2d\xb6\x3b\x9f\x6f\x70\xb2\x7f\x40\x6c\xa7\xb1\x2f" - "\x06\xba\x60\xfb\xda\x04\xa5\xfd\x38\xcc\x07\xc0\x75\x9c\x23\x76" - "\x1e\xb0\x9d\xd2\x7b\x71\x94\x33\xb6\x77\x65\x31\x6c\xdf\xd5\xfc" - "\xe3\xb1\xdd\xc1\x0f\x3b\x63\xfb\x13\x88\xed\x4b\x7e\xcd\xce\x5f" - "\x64\xde\xd8\xf9\x0b\x17\xfb\x8c\x5d\x37\xa0\x7f\xe9\x16\xe3\xdd" - "\xb4\x4b\x8e\xf1\x4b\xb6\xc9\x31\x7e\x49\x85\x1c\xe3\x97\xac\x93" - "\x30\x5e\xb8\x77\x4b\xf8\xf4\x25\x79\x77\x46\xff\xb2\x24\x4f\xc2" - "\xf8\x97\x96\xf7\x7c\xf6\x22\x41\xe5\xde\x36\x03\xf2\x29\xc6\x27" - "\xa8\xba\x3d\x7b\x21\xd3\x77\x27\xc6\xb9\x3d\x7b\x51\xf3\xd3\xd9" - "\x66\x38\x8f\x15\x57\xfd\xcb\xcd\xeb\xbe\x13\x63\xbd\xd5\xbf\xe0" - "\xd9\x8b\xb5\x5f\x38\x9d\xbd\xa8\xef\xf9\xec\x45\xda\x9c\x1b\xd4" - "\xbf\x74\x63\x9b\x71\x6a\x96\xb3\xbd\xdb\xd2\xf9\x72\x7c\x5f\x1a" - "\xe7\xc0\xf7\x67\x10\xdf\x97\xaf\x94\xe3\xfb\xf2\x64\x6c\xa7\xbb" - "\xb3\x18\x1f\xca\xf6\x15\x97\x7e\x2c\xb7\xd5\x70\xd1\xbf\x3c\x83" - "\x63\x6f\xf9\x48\x19\xbe\x9f\x75\xc6\xf7\xa5\x4d\xee\x78\x77\xd4" - "\x7b\x53\x9b\xe2\x05\x4e\x67\xda\x66\x88\xf6\x6f\xcb\x7e\x38\x19" - "\x03\xdf\x6f\xf2\x60\xeb\xb6\x80\xd9\xba\x51\xdb\x36\xd4\x83\x43" - "\x5d\xef\x2e\xd0\x29\xd3\x63\x79\x0e\x6d\xdd\x5c\xed\xdc\xd0\xf6" - "\x0d\x6d\xdd\xaa\x12\xf4\x1e\xed\xdc\x70\x6c\x7a\xb2\x75\x83\x76" - "\x07\x53\xac\x3f\x27\x60\xbd\x60\xeb\x56\x90\x22\xd9\xba\xc9\xb0" - "\xde\x8d\xfd\xf0\xa1\xb3\x99\xee\xf9\xf8\x0c\x09\xeb\x3b\x91\x8f" - "\xff\x77\x17\x5d\x0c\xed\x83\x97\xc3\x7f\x52\x5d\x0c\xc5\x7a\xdd" - "\xb0\x6a\x1c\xc7\xf3\x74\x6e\x74\x31\xd7\xdb\x38\xff\x74\xba\x18" - "\xdd\x6a\x39\xc6\xeb\x4a\xe4\x18\xaf\x8b\x93\x30\x5e\xb8\x77\x4b" - "\x30\x5e\x97\x7a\x67\x74\x31\xba\x54\x49\x17\xb3\x7c\x8e\x5b\xfb" - "\x3b\x99\x8e\x7d\xa9\xd9\xbd\x8e\x7d\xa9\x60\x7f\xb7\xd4\xec\xf1" - "\x4c\xc8\x75\x7b\x9a\x49\x13\x98\x8e\xfd\x26\xce\x84\xd4\xff\xdc" - "\x74\x31\x49\x1e\xfd\x7f\x79\xd2\xc5\x50\xdb\xe6\x2f\xd0\x3e\xc4" - "\xbb\x33\x21\x3d\x61\xbb\x83\x77\xef\x66\x0f\x53\x8e\xed\x2b\x26" - "\xc8\xb1\x7d\xc5\xaf\xe5\xd8\xbe\x6a\xb2\x1c\xdb\x57\x45\xbb\x62" - "\xfb\xf5\xb8\xbe\x62\xb3\x3b\x4c\xd7\x3d\x83\xba\x98\x14\x8b\x67" - "\x3c\x5f\x51\xe6\x3d\x9e\x27\x1f\xfb\x97\xc6\x73\x95\x2b\x9e\x27" - "\xdb\x7e\x52\xbd\x0c\xc5\xf3\x95\x3f\xc8\xf0\x5c\xd5\x03\x9e\xff" - "\x64\x7a\x99\x94\x27\xe5\x78\x9e\x92\x26\xc7\xf3\x94\xd1\x12\x9e" - "\x0b\xf7\x6e\x89\x5e\x26\x65\xca\x9d\xd1\xcb\xa4\x4c\x91\x78\xf6" - "\x55\x23\x7b\xc6\xf3\x15\x06\xf7\x78\xbe\xc2\xc0\xf0\x7c\x85\xc1" - "\xa3\x3d\xf5\x75\x78\x9e\xda\xcb\x0b\x3c\x77\x6b\xa3\xf2\xf3\xd0" - "\xcb\xa4\xfa\x7a\xab\x97\xf1\x74\x4e\x05\xf1\x5d\xb2\x4f\x71\x3a" - "\xa7\x12\x25\x9e\x53\xc9\x94\xdb\xa7\xdc\x72\x6c\x5f\x3d\x50\x8e" - "\xed\xab\x07\xc9\xb1\x7d\xdd\x58\x39\xb6\xaf\x1b\x23\xb6\x93\xe9" - "\x65\xb2\xae\x3b\xb7\x22\xc7\xf9\xd5\xab\x0d\xcf\x34\x12\x77\x58" - "\x7f\x41\x91\x76\xde\x33\xce\xaf\x2e\xf2\x84\xf3\x68\xaf\xf2\xe7" - "\x05\x09\x6e\x70\x7e\xcd\xbe\xff\x17\x70\xde\x93\x1d\x0a\x95\x83" - "\x00\xe3\x11\xef\x29\xbe\x0b\x58\x8f\x38\x6f\xff\xc8\x9d\x8e\x66" - "\x4d\xe3\xed\xc2\x79\xcf\x3a\x9a\xb5\xe7\xaa\xe7\x09\x38\x7f\x23" - "\x67\x68\x8e\xc9\x75\x34\x05\x4b\x6e\xb7\x8e\x26\x6d\x82\x1c\xef" - "\xd3\x12\xe5\x78\x9f\x36\x4c\xc2\x7b\xe1\xde\x2d\xe1\xdf\xd3\xc6" - "\xdf\x19\x1d\x4d\xda\x78\x09\xef\xd7\x0d\xec\x19\xef\x57\x17\xbb" - "\xc7\xfb\xd5\x82\x6f\xb6\xd5\xc5\x37\x8e\xf7\xe9\x0e\xbc\xbf\xfe" - "\xfc\x4c\xe6\xcd\xdb\xc8\x3c\x76\xa7\x75\x34\xe9\x1e\xf1\xbf\x3b" - "\xff\x18\x37\xaf\xa3\x11\xce\x24\x3e\xef\xde\x3f\xc6\xc9\x6e\x6c" - "\x64\x4e\x56\x3a\x63\x7d\x86\x42\x6e\x8b\x98\xd1\x4b\xb4\x45\x3c" - "\x59\x8d\x58\xbf\xe1\x01\x39\xd6\x6f\x08\xf7\xa4\xa3\x39\xc4\x39" - "\xdb\x24\x66\xc4\xc9\x75\x34\x45\x72\x1d\xcd\x0c\x1c\x7b\x59\x5f" - "\x7b\xc6\xfa\x8c\x4d\x72\x1b\x70\x76\x46\x71\xdf\x02\xc1\x06\x7c" - "\x81\x93\x0d\xf8\x53\xff\x2d\x60\x7d\xe6\xbe\x8a\x1a\x1b\xf1\xc6" - "\x0e\xf1\xc7\xdb\x7a\x6f\x74\x6b\x83\x48\xd7\x80\x6e\xec\x10\x17" - "\x7e\xa5\x42\x9b\x66\x6d\x61\x8a\x93\x1d\x22\xe0\xff\x4e\xa5\x8b" - "\xff\x62\x77\x76\x88\x0b\x74\x1e\xf1\xff\x1a\x2f\xe1\x3f\xf7\xb0" - "\xa4\xb7\xe1\x90\xcf\xa7\xfd\x92\xd9\x78\xbb\xf4\x36\xee\xf4\x24" - "\x86\xc7\x11\xff\xd7\x7f\xc5\xf8\xfc\x84\x9f\x99\xde\x26\x6b\xb4" - "\x1c\xf7\xb3\xe2\xe5\xb8\x9f\x35\x48\xc2\x7d\xe1\xde\x2d\xb1\x45" - "\xcf\x8a\xbc\x33\x7c\x7e\x56\xa4\xa4\xb7\xd9\xd0\xbf\x67\xdc\xcf" - "\xc8\x73\x8f\xfb\x19\x79\x0c\xf7\x33\xf2\xba\xd5\xdb\xc8\x6c\x23" - "\x37\xfc\xf0\xa3\xf5\x36\x22\x9f\x7f\xc7\xcf\xf5\x6c\x30\x7b\xa3" - "\xb7\x71\x9c\x49\xff\x51\x7a\x1b\xf7\x78\x2f\xf2\xf6\x27\xbb\xd9" - "\x73\x95\xe3\xfd\x2b\x3f\xc8\xf1\xfe\x95\x36\x39\xde\xbf\x16\x28" - "\xc7\xfb\xd7\x54\xee\xf4\x36\x72\xac\x7f\x75\xb2\x3b\x9c\xd7\xcd" - "\x40\xbd\xcd\x46\x83\x67\x8c\x7f\x55\xe7\x3d\xc6\x67\x6f\xfe\xff" - "\x31\xde\x05\xe3\x55\xae\x18\x9f\x5d\xf1\x93\xf2\xf8\x14\xe3\xff" - "\xeb\x63\x19\xc6\xdf\x42\x5d\xce\x8d\x9c\x27\xf1\xcc\xdb\x6f\x74" - "\xb1\x7f\xdf\xe8\x62\xff\xfe\x5f\x4e\xf6\xef\x1b\xa7\xdc\x3a\x8c" - "\xdf\x78\xeb\xed\xdf\x6f\x08\xe3\x37\x3a\xd9\xbf\x6f\xfc\xa1\x67" - "\x8c\x7f\x35\xd5\x3d\xc6\x43\x3e\xc5\xf8\x57\x53\xbb\xe5\xed\x65" - "\x18\xff\xda\x17\xb7\x43\x97\x73\x67\xce\x1b\xbd\x56\xeb\x8d\x3e" - "\xa7\x3b\xbf\x23\x1e\xf5\x39\xe3\x45\x7d\x8e\xce\x83\x3e\xe7\x56" - "\x61\xfe\x1f\xce\xcb\x31\xff\x0f\x17\xe5\x98\xbf\x65\x90\x1c\xf3" - "\xb7\xa8\xe5\xfa\x9c\xa4\xeb\xf4\x39\x72\xfc\x7f\xfd\x49\xc3\x0c" - "\x67\x7d\x4e\x91\x93\x3e\x27\xe7\xa4\x67\xfc\x7f\xdd\x23\xfe\xb7" - "\x53\xfc\x8f\x75\x83\xff\x9b\xfe\x45\xf0\x3f\xf6\x47\xe0\xff\xa6" - "\x3b\x80\xff\x9b\x4f\x30\x1d\xcf\x0d\xfa\x49\x39\xe4\xbd\x8e\xe7" - "\xc7\xad\x03\x39\xf7\xc8\xd7\x81\x9c\x59\xf2\x75\x20\xa7\x97\xb4" - "\x0e\x08\xf7\x6e\xc9\x3a\x90\x13\x7a\x67\xd6\x81\x9c\x50\x69\x1d" - "\xc8\xb9\xd6\xf3\x3a\xf0\xba\x87\x75\xe0\x75\x61\x1d\x78\xdd\x8b" - "\x75\x60\xcb\x45\xcf\x3a\x1e\xdd\xcd\xeb\x78\x26\xdc\xe9\x73\x50" - "\x5b\x9a\xbc\xd2\xf1\x6c\x9f\x66\xa8\x44\x1f\x29\xe7\x88\x72\x6d" - "\x9c\xa8\xe3\x31\xb8\xe8\x78\x0c\xd7\xe9\x78\x56\x9f\x13\xf0\x7f" - "\x9a\x70\xde\x74\xc6\x8f\xf0\x91\x42\xe3\x48\xeb\xcf\xcb\xed\xe6" - "\xf5\x14\xff\x25\xff\x7d\x79\x2b\xb1\x5d\x6c\xfd\x31\x74\xe3\x03" - "\x35\x77\xac\x4c\xa7\x33\xcd\x9d\x8f\x94\x3c\x99\xdd\x8d\xfc\xbc" - "\x69\x6e\xac\x0c\xef\x67\xb0\xf3\xa6\xef\xb8\xdb\xa7\x75\xf8\xe4" - "\xdf\xba\x9c\xfa\xe4\x77\xf8\xf2\xcb\xdd\x7b\x43\xbe\xa4\x17\x08" - "\xbe\xa4\xcf\xde\x01\x5f\xd2\x37\xea\x93\xff\xac\xab\xff\xbe\x37" - "\xfa\x1b\x2b\x0d\xa4\x1a\xc7\xc8\x3c\x57\xdf\xa7\x06\xf7\x67\xf7" - "\x95\xc2\xd9\xfd\x65\xb7\xc7\x0f\x0a\xb6\x87\xae\xf9\x41\xdb\x4d" - "\xfb\xd3\xcd\xb4\x3d\x18\xb3\x1b\xda\x9a\x5b\x09\x63\x95\x43\x3c" - "\x4d\x42\x3c\x7d\xa3\x9c\x96\x3d\x07\x63\x21\x68\x84\x19\xc7\x71" - "\x0e\x47\xfc\x75\x29\x88\xad\x6f\x50\xbb\x2f\x60\x23\x00\x5b\x59" - "\xb9\x75\xe7\x78\xbb\x3d\xe8\x57\x66\x68\x7f\x9f\x03\xcb\x6a\x7a" - "\x55\x9b\x2c\x30\x2f\x9a\x69\x0c\x57\xa3\xad\xc3\x80\x7d\x71\x64" - "\x59\x8d\x2f\x0f\xf8\xbb\xe7\x45\xe2\xe7\xdd\x3c\x7d\x43\x4f\xf9" - "\x19\x5c\xf7\x82\xb6\xb7\xa0\x1f\x10\x91\xb7\xe2\xae\x48\xfa\xad" - "\xdd\x40\x1f\x8e\x67\x6b\xdf\xc2\xc5\x0c\x37\xe0\x7d\x5a\xa0\x25" - "\xb5\xb1\x45\xdc\xa0\xb1\xab\x00\x37\x0a\xaf\x4a\xfb\xd8\x58\x3f" - "\xd2\x88\xe9\x51\xf2\x24\xfb\x17\x93\x27\x6c\xcd\x4d\x70\x8f\xad" - "\xb9\x09\x0c\x5b\x73\x13\x1c\xd8\x6a\x72\xa3\x47\x91\xd9\xb1\x6f" - "\x13\xec\x5f\x0c\x2e\x3c\xb6\xe1\x9f\xd0\x3f\xca\x36\xaf\xec\x5f" - "\x28\x9e\x26\x32\x3c\x45\xbc\x12\x31\x55\xd2\xa3\x18\x3c\xea\x51" - "\x7a\xc2\x54\xaf\xce\xf0\x53\x4c\xdd\x3e\x41\x8e\xa9\xdb\x7f\x2d" - "\xc7\xd4\x1d\x1f\xbb\x62\xea\xf5\x78\xba\x7d\x9d\x3b\x2c\x65\xfe" - "\x51\x76\x24\x7a\xc6\xd1\xed\xc5\x9e\x70\x94\xda\xa7\x2f\x70\xb2" - "\x4f\x77\xe0\xe8\x1f\x0f\xc9\x71\x74\x7b\xcb\x8d\xe2\x28\x8d\x6d" - "\x72\xf6\x27\x88\x6d\x72\xd3\x38\xaa\x73\xc1\xd1\xfc\x39\x12\x8e" - "\xba\xc6\x37\xe9\x01\x47\x97\xdc\x1e\x1f\x28\x32\x1c\xe5\xcc\xb4" - "\x3d\x9a\x65\xb4\xad\x5f\xc9\x71\x74\x87\xbf\x67\x1c\xcd\xdf\x27" - "\xe1\x28\x2b\x77\x7b\x71\x34\xbf\x4e\x86\xa3\x4b\x9c\x70\xf4\x7b" - "\x49\x86\x40\x1b\x0b\x07\x8e\x2e\x75\xc2\xd1\x25\x3d\xe1\x68\x7e" - "\x1d\xd2\x88\xf1\xa8\x3b\x76\xf7\x8c\xa3\xdb\x4b\xdd\xe3\x28\xe4" - "\x53\x1c\xdd\x5e\x2a\xe1\xa8\x1b\x1e\x55\x86\xa3\x3b\xd7\x7b\x81" - "\xa3\x3f\x73\xdf\x28\x3b\x33\xbd\xd2\x55\x48\x67\x3a\xaf\xf7\x91" - "\x3a\xdf\xf9\x4c\x50\x99\x4b\xdc\x93\xb2\xeb\xe2\x9e\xac\x16\xcf" - "\x78\x4e\x11\x70\xf5\xa9\x1f\x81\xab\xf4\x8c\xe7\xae\x5c\xb9\xed" - "\xc9\xae\x6d\xa2\xed\x09\xc3\xd5\x3d\xf7\x8b\xed\x92\xe2\x9e\x94" - "\x75\xe3\x23\x75\xd7\x79\x99\x6f\x94\x29\xce\xbe\x51\x0a\xbf\xf2" - "\xec\x23\xb5\xc0\x5f\xe6\x1b\xe5\x54\xb1\x23\xee\x89\xab\x8f\x54" - "\x09\x63\x77\xdf\x43\x31\xd6\xe1\x83\xaa\x60\x96\xc3\x47\x6a\x0f" - "\xe7\x82\xb0\x9e\x03\x0d\x09\xb7\x1f\x63\x0d\x5e\x60\xac\x2c\xee" - "\x89\xab\x8f\xa9\xdd\xc7\x8c\x15\x65\xa4\x3a\xb6\xcc\x8d\x6f\xd4" - "\xb2\x3b\x1a\xfb\x04\xdb\xe5\x1e\x6b\x0b\x27\xcb\xb1\xb6\x30\x95" - "\x96\xfd\xda\x1d\xd6\x16\x0e\x94\xb0\x96\x95\x5b\xf7\xb5\x0b\xd6" - "\xd6\x7b\xc0\x5a\x58\x57\xf7\x5c\xf0\x16\x6b\x0b\x69\xdc\x6c\x2e" - "\x4b\xc0\xda\xe6\x5b\x8d\xb5\x85\xd1\x12\xd6\xee\xb9\xab\xe7\x18" - "\x53\x05\xc1\xee\xcf\xe5\x14\x04\x33\xac\x2d\x08\xee\x36\xc6\x94" - "\xcc\xe6\x63\xcf\x35\x31\xc6\x94\xa4\x0f\x28\x13\xf4\x01\xff\xcc" - "\x31\x51\xf6\x58\xbd\xd5\x07\x7c\x06\xb2\x3b\x9e\xbb\x5c\x8b\x31" - "\xa7\xe6\x61\x4c\x94\x52\x17\x7d\x40\xe9\xf5\xfa\x80\x67\xbb\xc7" - "\x58\xaf\xf4\x01\xf4\xdc\x65\x51\x9b\x1c\x63\x8b\xae\xc9\x31\x76" - "\x6f\xae\x78\xce\x12\xdb\xe3\xd9\x67\xea\x9b\x93\x1d\xfa\x80\x7a" - "\x39\xb6\x4a\xfa\x80\xbd\x8f\x79\xc6\xd8\x37\xe5\xfa\xdf\xa7\x8a" - "\x65\xe7\x2c\xdf\x69\x70\xf6\x43\x2d\xfa\x9f\xfa\xef\xcd\x27\x6b" - "\x9d\x31\xf6\xcd\x83\xff\x4c\x7e\xa8\x1d\xbe\xa6\x7a\xb0\xe5\xbe" - "\xde\x0f\xf5\x9f\xee\x37\x56\x94\x12\x3c\xdb\x46\xf1\x56\xa6\x1b" - "\x28\xbd\x33\xba\x81\x8a\x52\x0f\xba\x81\x3f\xed\x97\xe3\xec\x9f" - "\x4c\xb4\xec\x57\xee\x70\xf6\x4f\xeb\x24\x9c\x65\xe5\xd6\x7d\xe5" - "\x82\xb3\x75\xb7\x92\xa7\xfd\x53\xc9\xed\xd5\x0d\xfc\xa9\x44\xd2" - "\x0d\xec\xbd\x81\xf3\x8f\x6f\xa6\xba\xc7\xd9\x37\x05\xbd\xeb\x9b" - "\x92\xde\xb5\xce\x4d\xbc\x14\x19\xce\xbe\x35\x47\x3c\xff\x48\x79" - "\xda\x7a\x91\xa7\x2d\xfd\x27\x8c\x97\xf2\xd6\x6c\x6f\x75\x03\x78" - "\xce\x1d\xb1\x15\xb1\x4b\xc4\x57\x49\x37\x50\xea\x59\x37\xd0\x03" - "\xbe\x7a\x1f\xbb\xef\xed\x39\x72\x7c\x7d\xfb\x59\x39\xbe\xee\x3b" - "\xef\x8a\xaf\xd7\x63\xeb\xdb\x3b\xdc\xe1\x2a\xd3\x0d\xec\xcb\xf3" - "\x8c\xa9\x6f\x97\x7b\xc2\x54\xea\xd3\xaf\x41\xb2\x91\x96\x30\xf5" - "\x7f\xce\xc9\x31\xf5\x7f\xfc\x6e\x14\x53\xef\x48\xbc\x94\x9b\xc6" - "\xd4\x04\x17\x4c\x2d\x5e\x27\x61\xaa\x6b\xcc\x94\x1e\x30\xf5\x76" - "\xe9\x09\x9c\x31\x55\xc6\xbb\xee\x53\xc8\x31\x75\xdf\x18\xcf\x98" - "\x5a\xfc\xb9\x84\xa9\xac\xdc\xed\xc5\x54\x54\x4b\xdc\x4e\x3d\xc1" - "\x3e\x22\xf1\xae\xfb\x4e\xf4\x8c\xa9\x6f\x57\xba\xc7\xd4\xb7\x2b" - "\x19\xa6\xbe\x5d\x79\xe3\x67\xca\xdf\xd9\xe7\x05\xa6\xfe\xcc\x63" - "\xa9\xbc\x53\xec\xb5\x9e\x00\xf5\xad\x88\xa5\xf5\x3f\xce\x77\x48" - "\xaa\xe8\x3b\x24\x5a\xc0\xd8\x27\x7e\x2c\xc6\xfe\xf9\x90\xdc\xa6" - "\xe1\xcf\x1f\x8b\x36\x0d\x0c\x63\xdf\x9d\x2f\x8f\x8f\x7a\xbd\xaf" - "\x10\xb9\x0f\xd5\x92\xfe\x0e\x3d\x01\x62\x6e\xb4\xb3\x9e\xe0\xdd" - "\xfe\x9e\xf1\xb6\x64\x8c\x4c\x4f\xf0\xa9\x7b\xbc\x6d\x97\xe1\xed" - "\xfe\xa7\x29\xde\x3a\x7c\xa8\x96\xa4\x8a\x3e\x54\x7b\xe4\x61\x65" - "\x78\x1b\xfb\xd3\xe0\x6d\xd9\x8d\xe3\xad\x3c\x96\x8a\xab\xbf\xd4" - "\xfd\x6d\xc6\x72\xc0\x5b\xea\xaf\xc3\xd5\x67\xea\x8d\xf9\xeb\xb8" - "\x5d\x3e\x53\xb1\x5d\xee\x71\xf7\xc0\x6a\x39\xee\x1e\x28\xa1\x65" - "\xdd\xe2\xee\x81\x27\x25\xdc\x65\xe5\x6e\x18\x77\x6f\x4a\x67\x70" - "\x20\xf5\xf6\xea\x0c\x0e\xa4\x4a\xb8\xfb\xee\xaf\x7b\xc6\xdd\x92" - "\x89\xee\x71\xb7\x64\x22\xc3\xdd\x92\x89\xdd\xe2\xae\xcc\x86\xa0" - "\xf4\x01\xb7\xbe\x3c\xea\xff\xd9\xe3\xac\x94\x86\xdf\x8c\xce\x00" - "\x30\x58\x99\x86\x3e\x9c\x62\xd1\x86\xa0\x67\x9d\x41\x4f\x78\xeb" - "\xbd\xce\xe0\xbd\xfb\xe5\x78\xfb\xde\x03\x72\xbc\x3d\xf8\x15\xb6" - "\xab\x5b\x9d\x01\xc5\x80\xf7\x56\x3b\x74\x06\x26\x39\xce\x4a\x3a" - "\x83\x83\xaf\x79\xde\xfb\x7a\x6f\xaf\x8c\xbf\x7d\xc2\xc5\x67\xf5" - "\x02\x09\x6f\x4f\x55\x8b\x36\x63\xff\xfb\xc5\xc9\x59\xce\x78\xfb" - "\x5e\xd3\x75\x3e\xab\x67\xdf\x42\x9f\xd5\xb3\x6f\xb1\xcf\xea\x39" - "\x72\x9f\xd5\x3b\xdb\x25\x3b\x32\xef\x7d\x56\xff\x65\x39\xc5\x60" - "\x1c\x43\xe8\xb7\xfa\x46\xf4\x08\xb7\x39\xd6\x8a\x0c\x7b\x65\x7a" - "\x84\xbf\xb4\xc9\xb1\xf7\xa0\xd6\x33\xf6\xfe\xe5\x84\x84\xbd\xac" - "\xdc\xed\xe5\x79\xff\x62\xb9\xbd\x7a\x84\xbf\x58\x24\x3d\xc2\xc1" - "\x43\x6e\xb1\x57\xb6\x37\xf6\x5e\x89\xfb\xbd\x31\xc8\xa7\xd8\xfb" - "\x5e\x89\x47\x3d\xc2\x75\xf6\x5b\xef\xef\x66\x7b\x63\x02\xcf\x6b" - "\xf2\x42\x8f\xf0\xb3\xb3\x31\x78\xbf\xe0\x66\xf4\x08\x88\xb7\x88" - "\x67\x22\xe6\xde\x88\x1e\xe1\xd6\xf3\xb8\x1f\xec\x96\x63\xee\x07" - "\x6f\xca\x31\xf7\xc3\xc7\x5c\x31\xf7\x7a\xbc\xfd\xe0\x9c\x3b\xac" - "\x65\x7a\x84\x43\x66\xcf\x38\xfb\x57\x7f\x8f\x38\xeb\x62\x9b\x2b" - "\xe1\x6c\xd9\xaf\xe5\x38\xfb\xd7\x59\x37\x85\xb3\x37\x1a\x83\xe5" - "\x67\x85\xb3\xb1\x2e\x38\x5b\xf6\x95\x84\xb3\xae\x71\x58\x7a\xc0" - "\xd9\xdb\x14\x87\xc5\x33\x8f\x7b\x68\xbe\x1c\x67\x0f\xe9\x3d\xe3" - "\xec\xa1\x07\x24\x9c\x65\xe5\x6e\x2f\xce\x1e\x9a\x77\x7b\x75\x0b" - "\x87\xe6\x49\x3c\xee\x87\xc3\x7a\xc6\xd9\xbf\x06\xbb\xc7\xd9\xbf" - "\x0a\xfb\x62\x7f\x0d\xf6\xc8\xe3\x5e\x87\xb3\x1f\xf5\xf2\x02\x67" - "\x7f\xe6\x36\x08\x1f\x79\xe5\xff\xc2\x49\x5f\xdb\xdb\x68\x72\x39" - "\x2f\xf1\x95\xf3\x79\x09\x27\xdd\x42\xb4\xa8\x5b\x90\xc7\x67\x49" - "\x15\xf5\xb7\x51\x02\xee\x3e\xfe\x63\x71\xf7\xf0\xc0\x0e\x07\xee" - "\x26\x01\xee\x1e\xa6\xe7\x23\x3a\x1c\xb8\x7b\xb4\x4a\x6c\x97\x14" - "\x9f\xc5\x83\x6e\xe1\x11\x5a\xdf\x62\x87\x6e\x01\x71\x38\xca\x59" - "\xb7\x70\x74\x9d\x67\x0c\x3e\xac\x97\xe9\x16\x3e\x71\x8f\xc1\x16" - "\x19\x06\x7f\x7c\x8c\x62\xf0\x23\x22\x06\x1f\xae\x6d\x07\xd9\xb2" - "\x3d\xdb\x3b\x0c\xb6\x50\x0c\x9e\x72\x67\x30\xf8\xe0\x2d\xc0\x60" - "\x4a\xf7\x23\x8b\x8c\x06\xc0\xe0\x79\x88\xc1\x53\x6e\x4c\xdf\xf0" - "\x13\xc5\x68\xc1\x76\xb9\xc7\xe2\x23\x17\xe5\x58\x7c\x34\x94\x96" - "\x75\x8b\xc5\x47\x0e\x49\x58\xcc\xca\xdd\x5e\x7d\xc3\x91\xa6\xdb" - "\xab\x6f\x38\xd2\x24\x61\xf1\xd1\xfd\x3d\x63\xf1\xe1\x7c\xf7\x58" - "\x0c\xf9\x14\x8b\x0f\xe7\x77\x8b\xc5\x8f\x38\x63\xb1\xc1\xc1\xf3" - "\xca\xf4\x0d\xa6\x7f\xf6\xd8\x2d\x06\x8f\xfc\xaf\xe6\x5e\x92\xd9" - "\xa0\x30\xb4\x19\xa1\x44\x6b\x16\xc9\x34\xda\x1e\x21\x90\x07\xf4" - "\x3b\x76\x8f\x51\x3d\x9e\x70\x5b\xc7\xd5\x20\x1e\xbf\x81\x7f\xc0" - "\xe3\xea\x95\xc2\xdc\xa2\x34\x3e\x46\xed\x5d\x31\x1f\xb1\x77\x8f" - "\xd3\x7d\x77\xef\xe2\xf5\xe3\x66\x09\xcf\xa5\xb2\x73\x37\xe3\x66" - "\x8b\x69\x1c\x9b\x26\xc5\xb1\x34\x3e\x77\xdc\x34\x73\xe0\xb8\x69" - "\xee\x9e\x1f\xae\x22\x7e\x03\xd6\xf3\x7c\xe1\x76\xde\xd2\x7a\xdf" - "\xc8\xd2\xd6\x3f\x10\xa2\xdf\xce\x9b\x3b\xb2\x8f\x1d\x84\x6f\xac" - "\xff\x23\x94\x6b\x0d\xda\x57\xda\x9a\x35\x8b\x40\x5e\x85\x98\x07" - "\x74\x23\x5c\x96\x0f\xcf\xc1\x3d\x7e\xeb\xb5\x82\x3d\xe9\x80\x55" - "\x69\x84\x8c\x6a\xc7\x39\x73\xac\x0e\xc6\x4c\x70\x0e\xd4\xb9\x05" - "\xea\xe2\x7f\x31\xc4\x02\xe3\xd1\xb7\xfa\x15\x82\x73\x7a\x23\x7c" - "\x57\x51\x0e\xd2\xde\xe7\x97\xf9\xbc\xd2\x97\x70\x6f\x8d\xf4\xe3" - "\x07\x4e\x37\x40\x7f\x10\x7d\x12\xf1\xc3\xef\xd8\x02\xe5\x78\x65" - "\x06\xcf\x8d\x1c\xa1\x37\xda\x2c\x6c\x4e\x43\xfb\x8e\x80\x1c\xcb" - "\xc3\x7b\x0b\x93\x88\x0a\xfe\xfc\xf9\x6d\xd3\x0d\x1d\xd9\x9f\xc4" - "\xc2\x77\x4e\xc1\x76\x79\xfa\xc6\x2d\x3b\x61\xdd\x19\xa2\xc6\xb5" - "\x83\xbe\x1f\xdf\x4d\xdf\xa3\xe4\x36\xda\x21\x9f\xcf\xca\xe0\x8d" - "\xa9\x36\x12\x00\xb4\xd8\x03\xed\xc6\xf1\xc8\xbd\x3d\xb2\x74\xc3" - "\x60\x42\x0e\xac\x69\x52\x1a\xa1\xed\xf6\x3f\x0e\xb1\x18\xd2\x1f" - "\x24\x70\xdf\x8c\x32\xcb\x05\xc5\xf1\xf9\x33\x2f\x12\x82\x78\x02" - "\xbf\x17\x5b\x60\x1d\x9b\x0e\xe9\x2d\xf0\x1d\x5c\xab\xda\x17\xcb" - "\x42\xfe\x40\x43\xca\x19\x12\xa0\x23\x7e\x39\xf0\x6d\xac\xec\x27" - "\x8d\x58\xd6\xa4\x38\x9e\x80\x6d\x80\xb4\x15\xd2\xf8\x1c\xda\x90" - "\x11\x7e\xef\x48\x3f\x3a\x36\xf3\xa6\x1b\xb8\x91\x23\xfd\x28\xf6" - "\xc1\x77\x6e\x81\x6f\x86\x32\xfe\x50\xc6\x9f\x5e\xd3\x89\x2a\x0f" - "\xf2\xb0\x1e\xb8\xfa\x1b\x96\x75\x62\xdd\xb5\x58\xb7\x07\x3a\xf8" - "\xf2\xc1\xd3\x0d\x3c\x8c\x6d\x5c\x53\x35\xe9\x8a\xcf\x1b\x14\xe5" - "\x7e\x01\x0a\x9e\xe7\xf7\x8e\xd0\x6f\x48\x27\xfe\x7a\x8e\x10\xc3" - "\x60\xac\xe7\xf8\x39\xa8\xdf\x17\x69\xd1\x91\x7d\xdc\x60\x52\x7c" - "\x92\x88\xf4\x85\xfe\xb4\x68\x86\xe3\x37\x94\xab\xf1\x3d\xf8\x8c" - "\x50\x9e\xfa\xbe\xc7\x36\x6b\xd2\x7d\x78\xb8\xaf\xf0\x51\x9c\x23" - "\x3e\x6a\xff\xe7\x3a\xb2\xcb\x89\x89\xbc\xde\x84\xcf\x9b\xd8\x73" - "\x30\x96\xca\x83\xa1\xcf\x36\x62\x1e\xa6\x3d\xb4\xd7\x5f\xec\xb7" - "\x2a\x35\x8c\x0d\xd7\xbe\x13\xc7\x08\x8c\x0b\x71\x8c\x60\x7b\xdf" - "\x4d\x37\x29\xe9\x3a\xac\x28\xa7\x72\x5d\x0e\xf4\xa1\x7d\x97\xda" - "\x77\x0b\xd0\x96\xeb\xc2\x7e\x69\x80\x7b\x27\x9e\xc5\x7e\xd9\xb2" - "\x06\xfa\x84\x95\x4d\x93\xda\x8f\xe9\x13\xb4\x3f\x39\xe8\x0b\x76" - "\x76\xf3\xc4\x03\xf8\x3d\x5b\xda\xa1\x1f\x43\x78\x4b\x39\xcc\x36" - "\x1e\xc7\x2d\x8c\x91\x03\x49\x56\x25\xda\xf5\x61\xfe\x91\xab\x56" - "\xe5\x96\x66\x82\x7c\x25\xd9\x0c\xb8\xbc\x3b\x05\x68\x0e\x75\xf2" - "\x61\x23\xf4\x11\x62\x3f\xae\x81\xbe\x4b\x81\xb1\x0b\x34\xdf\x02" - "\xf4\x2b\x04\xcc\xc3\xdf\x85\xb0\xfe\x70\x50\xce\xa4\x38\x91\x00" - "\xf5\xa9\x76\x87\xf0\xe6\x3d\x21\x7c\x0b\xd0\x70\x59\x47\xf6\x89" - "\x68\x91\x86\xd8\xa6\x2d\x90\xbf\x19\xee\x03\x3d\x0d\x6c\x0c\x95" - "\xeb\xc5\x6f\xf6\x44\xcf\x4d\x07\xc8\xf8\xcd\x07\x48\xe8\x1f\x0e" - "\x90\x89\x69\xf1\x30\x2f\xb3\x1e\xe5\x3f\x8b\xb5\xc1\x9a\xa8\xaf" - "\xe8\x0c\x19\x57\x8a\xfc\x21\xb7\x61\x48\xd1\xab\x07\x48\xf8\xfe" - "\x05\x45\xca\x99\x2d\x84\xe0\x1a\x3e\xb3\xd7\x37\xbc\x51\xd7\x46" - "\xb8\x40\x7d\x85\x7d\xc3\x2f\x83\x66\xb4\x11\x72\x42\x6b\x21\xe9" - "\xc9\xb0\x96\x5f\x6d\x22\xe9\x16\xde\x5c\x9d\x79\x91\x00\xf6\x44" - "\x33\xda\x7d\x6a\x9d\xb9\x88\x10\x3c\x33\xc8\x7d\xaf\x25\xfd\x13" - "\x88\x6f\xda\x57\x44\x9d\xd1\xc8\x37\xd9\xb7\x4f\x2a\x4a\x5f\x47" - "\x94\x07\xae\xd6\x31\xde\x53\xf1\xe9\xc9\x8f\xe1\x5d\x7c\x47\x0c" - "\x59\x68\x13\xd6\xa3\xbc\xe9\x15\x19\x8b\xc9\x20\xfc\x9e\x00\xca" - "\x7b\x7d\xba\x1c\xe8\x56\xe1\x1d\x3e\x7f\x3a\x91\xe1\x61\xa7\x21" - "\x63\x11\xdf\x04\x6b\x8a\x92\xcf\x88\x57\xf0\x9a\xb8\x32\x3e\xb7" - "\xd3\x60\xf4\x6d\x27\xc6\x04\x0b\x39\x0a\xef\xf6\xb2\x5e\xea\xff" - "\x9b\xae\x9f\xd0\xde\x39\x5a\x92\x49\xdb\x0c\xeb\x64\x40\x32\xf2" - "\x50\xfc\x37\xd8\xe6\x23\xf0\x7d\xfc\xb0\x38\x0d\x94\x0f\xc3\x35" - "\x73\xa6\xc9\x40\x2a\xad\x76\xb2\xb3\x99\xd2\xa5\x37\xd0\xc5\x17" - "\xfa\xd9\x0a\xb4\xf1\x73\xd7\x57\xd8\x4f\x9c\x5e\x5f\xc1\xf9\xb0" - "\xfe\xa0\x7d\x61\x61\x7d\x31\x63\x39\x81\xb5\x13\xfa\x23\x97\xf5" - "\x07\x37\x70\x5a\x29\xf6\x87\x77\xdf\xf1\xb7\x79\x9e\xd6\x14\x7c" - "\x37\x0f\x63\x02\xc7\x02\x17\x3c\xad\x14\xdf\x8d\x6d\xc0\x3d\x33" - "\xec\xfb\x99\xaf\x7e\xc3\x57\xeb\x9a\x88\x11\xbe\x87\x0f\x74\x6e" - "\x83\xcd\xdb\x36\x98\x3c\xb5\x61\xd3\x28\x18\xab\xa3\x60\xac\x8e" - "\x22\x13\xd7\x9a\xd8\x58\x3d\x55\xcf\xc6\xaa\x1d\xda\x75\x0d\xf8" - "\xf5\xb5\x73\x88\x12\xdb\x55\x72\x06\xfd\xf2\x41\x3b\x9b\xa4\xf1" - "\x3a\xfd\x12\xd0\x48\x1c\xb3\x3e\xbf\x0c\x42\xfa\x54\x5b\xea\x48" - "\x06\x8e\xd9\x4e\x77\x63\xf6\x64\xc9\xcc\x38\xe8\x9b\xdf\xc3\x98" - "\xfd\x4e\x4b\xfc\x1b\x89\xef\xba\x39\x30\x66\x9b\xdc\x8d\xd9\x93" - "\xeb\x0e\xc3\x3b\xaf\x1b\xb3\x8b\x9c\xc7\xec\xc9\x91\xde\x8f\xd9" - "\x0a\xb3\x63\xcc\x2e\xf6\x30\x66\xe3\x61\xcc\x3e\x97\xef\xe5\x98" - "\x3d\x39\xc5\xbb\x31\x5b\x51\x47\xc7\x6c\x3d\x8c\x59\x90\x3f\x76" - "\xbe\x48\xe9\xd2\x1b\xe8\x02\x63\xb6\xa2\x04\x68\xe3\x76\xcc\xfe" - "\xf4\x7d\xf6\x59\xec\x8d\xf7\xd9\x67\xa3\x7b\xee\xb3\x53\x5f\x79" - "\xdf\x67\xa7\xf6\xde\x9e\x3e\x3b\x65\xf3\xae\xcf\x4e\x6d\xf2\xdc" - "\x67\xa7\x62\x7f\x3e\x7d\x56\x15\x7c\xe3\x7d\x56\x79\xbe\xe7\x3e" - "\xab\xdc\xec\x7d\x9f\x55\xc6\xdc\x9e\x3e\xab\x2c\xf5\xae\xcf\x2a" - "\xa3\x3c\xf7\x59\x65\xb0\xa7\x3e\x9b\x34\x88\xe3\x39\xb4\x83\x0b" - "\x79\x48\x85\x3c\x0d\xe3\xbf\xaa\xce\xa1\x0c\x08\x69\x5f\x31\x4d" - "\x79\x24\x90\x93\x5d\xd2\xfe\x2e\x69\x95\x4b\x3a\xd8\x25\xad\x76" - "\x49\x87\x8a\x69\xe8\xa3\x5e\x97\x15\x55\x4f\x83\x0c\x96\x69\x52" - "\x54\xb5\x08\xf7\xc3\x16\xda\x35\x28\xc7\x85\xb9\x6b\xfb\x96\x2c" - "\xde\xda\x5f\x41\xf8\x2e\x25\x4f\x74\xe9\x64\x48\xb3\xa2\x3a\xb6" - "\x33\x0b\x44\x3c\x9f\xc1\x5a\xbe\x33\x93\x70\xfa\x4e\xcb\x8c\xd5" - "\x30\xa6\xcc\x20\xf7\x65\xa8\x7b\x43\xdd\xbf\x00\xba\x99\xab\x75" - "\x66\xe0\xb3\x8f\xf2\x0d\x8a\xea\xe9\xf8\x9d\xa3\x74\x06\xc2\xf9" - "\xfc\x52\x8b\x32\x0e\x97\xdb\x69\x31\xfb\xfc\x72\x30\xc8\x99\xa5" - "\x9b\xb3\x38\x3f\x63\x4b\x2d\xc9\x51\x72\x9a\xb4\x34\xe0\xd3\x5b" - "\x0e\x92\xb5\x2d\x7c\x53\x9a\x8d\xb7\x1a\xe7\x19\x70\x1f\xb6\xc9" - "\x98\x5a\x41\xaa\xcd\xb5\x04\xd7\x33\x1c\x9f\x46\xf3\x41\xb6\xef" - "\x8b\x65\x20\xaf\xda\x5c\x42\xaa\x20\x6d\x58\x76\x1e\xbe\xb3\xda" - "\x6e\x6c\x29\x21\x76\x7d\xa7\x99\x53\x75\xd6\xf2\xaa\xce\xba\xaa" - "\x16\x68\x9b\xbe\xb3\x1e\xdb\x5a\x0d\xed\xa0\x31\x37\x73\x3b\xeb" - "\x69\xbd\x96\x1a\xaa\x13\xb0\xe7\x42\xf9\x40\x28\x1f\xd8\x59\x87" - "\xed\xc3\xb6\xb9\x95\xdf\xf2\x1e\x8a\x86\xb6\x3f\x32\x47\xeb\x4b" - "\xf8\xf5\xbe\x6a\xef\xc6\x9b\x51\xe3\x51\x2e\xcc\x7b\xa8\x9c\xd5" - "\xeb\x77\x33\xf5\xa6\x7a\xae\x77\x8c\xd0\x5e\xd5\xcd\xd4\x5b\xd3" - "\x4d\xbd\x42\x7b\x35\x37\x51\x6f\x8d\xd6\x73\xbd\x63\x85\xf6\x46" - "\xdd\x4c\xbd\x9e\xe5\xee\xbc\xb1\x42\x7b\x33\x6f\xa6\xde\xba\x6e" - "\xfa\xed\xff\x63\xef\xec\xe3\xa2\xb8\xae\xff\x7f\x77\x16\x0c\x2a" - "\xca\x62\x17\x8b\xd6\x98\x55\xd1\xac\x8d\x46\x54\x30\xd8\x68\x83" - "\x11\x2d\xc6\x07\x30\x51\x8b\x4f\x11\x12\x34\x68\xd4\x20\x3e\x04" - "\x15\x01\x8d\x1a\x35\x88\x60\x80\x60\x04\xc5\x06\xf3\xc5\x56\x23" - "\xa6\xd8\x62\xab\x09\x36\xfa\x0d\x5a\x10\x4c\x35\xc5\x04\xeb\x6a" - "\xd0\xa0\x45\xb3\x0a\xca\xd3\xee\xce\xef\xdc\xb9\xb3\xcc\xce\xee" - "\xcc\xb2\x33\xab\x04\xbf\x3f\xff\xd8\x97\x38\x0f\x77\x66\xce\xf9" - "\xdc\x73\xdf\xe7\xce\xbd\x77\x82\xe4\x69\xe1\xbc\xe8\xf8\x07\xac" - "\x05\x79\x3a\x38\x6f\xe7\xf9\xfd\x82\xe4\x69\xe0\xbc\xe8\xfa\x3f" - "\x58\x03\xf2\xfc\xff\x8d\x5d\xff\xcb\xf3\xfd\x37\x71\xf6\x7c\x2f" - "\xcf\xef\xdf\x88\xea\x1f\xe7\xba\x74\xda\x30\x1d\xdd\x3d\x42\x65" - "\xca\xa0\x74\xa6\xee\xc3\xae\xbd\x67\x0a\x44\x63\xd7\x41\x3b\x97" - "\x89\x3c\xc7\x66\x23\xb4\x2e\x0b\x51\x29\x94\x89\x3a\xb4\xa6\x82" - "\x2a\x33\x04\xe0\x78\x65\xcc\x5d\xd5\xa0\xe8\x07\xdb\x4f\x46\x21" - "\x54\xb7\x5c\x8b\x48\x19\x94\x2e\x39\x3e\x10\x85\x18\x11\xee\xab" - "\xa8\xfb\x0a\x9e\x24\xe4\x2e\xc4\xd4\xcc\x06\xdc\x66\x7a\xc2\x79" - "\x06\xd0\x2e\x94\xd1\x80\x0e\x9b\xf4\x8a\xc0\x18\xe6\x38\x3d\xe4" - "\x94\x7a\x3a\x63\xd8\x35\x3a\x41\x8b\x36\xc2\xdf\x37\x14\xff\x3a" - "\xa3\xd4\x23\x6a\x0f\xe4\x9a\xf5\x9b\xff\x75\x4a\xa7\xb8\x90\x83" - "\xf3\x4f\xc8\x73\x6b\x12\xee\xe2\xfe\xf8\x08\xd5\x7b\x90\xf3\xe2" - "\x63\x3f\x33\xe9\xa9\xe7\xa3\x11\xf5\x95\x1e\xe7\xf6\xff\xd2\x9f" - "\x5c\x81\x90\x9d\xfe\x18\x17\x93\x7a\xa2\x0f\x3e\x1f\x97\x83\xfb" - "\x39\x77\x98\xc0\xae\xea\xc9\xc5\xf8\x7e\xe9\xb4\x11\x99\x45\x6b" - "\x70\x1b\x73\x21\x76\xdc\x40\xba\x1e\xb7\x19\xd0\x56\xf4\xbc\x05" - "\xff\x67\xf2\xf9\x0d\x74\x39\xad\x6a\x2c\xa6\x93\xbb\x04\x9e\xab" - "\xbb\x87\x8a\x56\x35\xa1\x6b\x8a\x0b\xab\xf1\xb5\x6b\xd5\x13\x35" - "\x75\xea\x89\xda\xfa\xcd\x17\x56\x98\xef\x17\x5f\xcb\xbc\x1d\xf7" - "\x5f\x90\x7b\xbc\x90\x76\x32\x4e\xfc\x1e\xe9\xf7\x7a\x76\x0b\xf1" - "\xa6\xf5\xd8\x86\x45\xf1\xf7\xe0\x5e\xbe\xed\x88\xed\x4c\xa7\xbd" - "\xa2\xaf\x4b\xd0\xf6\x26\xfd\x79\x17\x7d\x71\xbf\x10\xb4\x05\x55" - "\x4c\x1f\x4d\x6a\x53\x15\x33\x06\x07\x62\x3d\xe4\xf3\x79\x98\x77" - "\xee\x28\x2e\x18\xf1\x3d\x4f\xd7\x52\x12\x73\xa3\x0b\x0c\xff\x15" - "\xf5\xc6\x76\xb8\x78\x17\xae\xf7\xe2\x35\xc5\xc5\x69\x2c\xb7\x34" - "\xe0\xeb\xc1\x31\x3a\xb8\x66\x03\x9d\xd2\x58\x84\x8f\x83\xfd\x2b" - "\xc8\xfe\x66\xc4\xed\x6f\x06\x4d\x4c\x0c\x60\xf7\xa7\xb1\xfb\x5d" - "\x2c\xf6\xbb\x44\xf7\xc6\x7d\x76\x17\x8f\xe3\x67\x82\xf6\x4d\x07" - "\xe5\xd7\xe1\xf7\x01\xa4\xcf\xbd\x49\xc7\x5e\xa7\xae\x46\x71\xf1" - "\x62\x2d\xe8\x0a\xf6\x1b\x2c\xae\x6f\xf8\x2a\xd6\x17\x61\x7d\xd6" - "\x6f\xbe\x58\xad\x73\x51\x54\x90\x7e\x9e\x0b\xc4\x16\xd0\x5e\x5a" - "\x96\xa7\x53\x5c\x2c\xc0\x6d\x62\x1d\xb0\x22\x1c\x53\x82\xaf\x69" - "\x69\xff\xf9\x31\x31\xef\xc4\x68\xfa\x47\x6a\x22\x97\x44\x68\xde" - "\x7c\x67\xe5\xd2\x15\xa3\xfb\x47\x76\x42\xc8\x42\x3b\x2a\x7a\x83" - "\x07\x6d\x4a\x1b\x1f\x55\x96\x69\x40\x34\xa5\x82\xb6\xbb\x09\xa5" - "\x81\x5f\x0d\x19\x33\x02\x8d\xdd\xa7\x97\x1b\x33\x5e\x08\x4c\xb8" - "\x8f\xa8\x78\x6f\xfa\x6a\xd1\x9a\x97\xc1\x07\xdf\xae\xc7\xcc\x80" - "\x5b\xcb\x24\xd0\x6b\xd1\x9a\x7f\xe0\x6d\xbb\x98\xf7\x05\xe1\x64" - "\xdb\x9f\xe3\x8b\xa9\x2f\xe3\x2b\xa8\x92\xf0\x7b\xe8\x2b\x6f\x3d" - "\x3a\xa5\xb9\x87\xb2\xf0\x76\x53\x39\xf3\xde\x06\x8e\xbf\x89\xaf" - "\x85\xfb\xbe\xf0\xdf\xa4\x1f\xef\xdb\x25\xf8\x3a\x9a\x9e\xf8\x7d" - "\xc2\xb7\xcb\xf0\xf5\x74\x8a\x6f\xa3\x95\x59\x48\x01\x6c\xe4\x7e" - "\x47\xf1\xef\xc1\xa6\xf4\xf1\x51\x4c\xdd\xde\xfc\xad\xc6\x40\x79" - "\x8e\xd8\xb3\x13\xb9\xed\xdd\x89\x50\x56\x37\xe4\x52\xbf\xf9\xdf" - "\xde\x3a\x17\xef\x2c\x6c\x2f\x28\xda\xbd\x96\x42\x2f\xc1\xb6\x41" - "\x3a\xf4\x41\x12\xde\x06\xf5\xaa\x4e\x2c\x56\xe0\xf7\x68\x0d\xb9" - "\x7d\xcb\x4d\xea\xf1\x61\x34\xd8\xa2\xc1\xa7\x1f\xee\x63\x54\xe0" - "\x7a\x43\x7b\x8d\x0f\xab\x51\x5c\xd2\xfe\x6f\x21\x42\xf1\xb8\x9e" - "\x82\x3d\xfe\xf4\xa0\x01\xbf\x3f\x0b\x3c\xf8\x40\x0f\xff\x9f\x5e" - "\x7e\x60\x55\x03\x75\x36\xa8\x10\x69\x5e\xc5\x4c\xf5\xef\x7d\x13" - "\x23\x69\xc3\xaf\x43\x81\x43\xab\x3e\x47\xff\xac\x2c\x46\xee\x73" - "\x90\xb2\x65\x6d\xf7\x15\x88\x0a\xd1\xc1\xff\x57\x22\xea\x1c\xe4" - "\xfc\xb8\x2f\x3e\x7e\x0c\xee\x8f\x2f\x45\xb8\x8f\x9e\xa6\x92\x0c" - "\x87\xee\x35\x40\x5c\xaa\x76\xc5\x73\xc1\x4d\xaa\x8c\x62\x7c\xce" - "\xbc\x3a\xf6\xdd\x56\x2d\xfb\x6e\xab\x96\x79\xb7\xe5\x82\xdf\x6b" - "\xe1\xf7\x59\x71\xe1\xb4\xc9\xb8\x5c\xdb\x2d\x24\x5c\x49\xe3\x32" - "\xf1\xbb\xae\x2e\x90\x37\xd0\xcb\xb5\x5d\x77\xc5\x20\xf5\x39\x7d" - "\x35\x2a\xab\x2e\x46\xbb\x57\x21\x35\x5d\x1b\xd5\xb1\xe4\xd4\x59" - "\x44\xef\xdc\x59\x74\x38\xbe\xc8\xd5\x88\xfb\x46\x6a\xbd\x3b\x79" - "\xac\x57\x60\x2d\x77\x4d\x8a\x41\x83\xf6\xde\x43\xbe\xf3\xae\x27" - "\x32\xeb\x3c\xe1\x6f\xf2\x19\x6a\xb5\x9a\xe6\x5a\x6d\xdf\xa6\xe5" - "\xda\xde\x1e\x7a\xf2\x2e\x6c\xee\x42\x15\xc2\xef\xbb\xe8\xcd\x5f" - "\xe7\xee\xc5\x7d\xd2\x75\x7a\x64\xf0\xcc\x28\xc6\xfa\x84\xeb\xf6" - "\xc2\xef\x4f\x12\x56\x23\x95\xe9\x07\x2d\x2a\xad\xb9\x87\x86\x80" - "\x6e\xf0\xbb\x82\x3d\xd7\xc8\xbb\x02\x63\x6a\x4a\x31\x7e\x5f\x50" - "\xbf\x5c\x4b\x4d\xbe\x0d\x6d\xd5\xe6\x7f\x07\x35\xf5\xef\x5b\x7e" - "\x5a\x7b\x19\xb7\x07\x7e\x5c\xbd\xaf\xb8\x2f\xaf\xde\x57\x30\xe3" - "\x9f\xf0\xfb\x33\x1a\xf4\x7c\xf0\x1e\xf6\x1b\xf8\xef\x9e\x9e\x7a" - "\xa5\x8a\x36\x94\x56\xfd\x11\xfc\x53\xc1\xf3\x0f\xe3\xcf\x98\x06" - "\xea\x46\x24\xf8\xe5\x3a\xf1\x55\x49\x1d\xf8\xe9\x24\x2e\x63\x62" - "\xf8\x21\xf0\x35\xe4\x4c\x54\x49\xc3\x65\x66\x9d\x0a\xec\xaf\x83" - "\x4d\xc5\xae\x4d\xea\x61\x3a\xfc\x1e\xb2\xde\xa7\xaf\xbe\x31\x6d" - "\x7c\x40\xb3\x7a\x7c\xb0\x9d\x77\x92\x2e\xd8\x5f\xeb\x16\x22\xb7" - "\x92\xaa\x8b\x88\xf1\xd9\x32\xd6\x67\x78\xec\xda\xbb\xda\xae\x86" - "\x7a\x6d\xb7\x5d\xe0\xab\x73\x2b\x74\xe8\xe3\x7b\x48\x5d\x56\x5d" - "\x81\xdf\xd7\x74\x7c\x65\x2a\x42\xaf\x1c\xa0\x4d\xa5\xa7\xbe\x63" - "\xfc\xf7\x19\xf8\xcf\x00\xfe\xc3\xef\x29\x5b\xfc\xb7\x0a\xfc\xf7" - "\x00\xfc\x77\x9b\xf3\x9f\xb1\x1e\xfc\x57\x0f\xfe\x7b\x17\xfc\x57" - "\x67\xed\xbf\x62\x2d\x7e\x97\x89\xdf\x19\x61\xff\xe1\xf1\xd2\xa6" - "\x77\xb5\xbd\x98\x77\x98\x6f\x6a\xd1\xde\x37\x90\xdb\xe0\x06\xa4" - "\x48\x38\x89\x54\x70\x9f\xaa\x67\xc1\xbe\x50\x1e\xe8\xfb\x1a\x2a" - "\x2b\x34\xa2\xb5\x33\x51\x6f\xec\x4f\x03\xeb\xcf\x32\xc3\x51\xf4" - "\xa0\x5e\x4b\x41\x99\x01\xbb\x1e\xa0\x51\x93\xae\x6b\xd0\xe9\x69" - "\xa5\x08\xfc\xa1\x33\xa5\xbf\xa2\x97\x5f\x0f\x2b\xf3\x1d\xaf\x87" - "\xdf\x0f\x7c\x52\x0f\xe5\xd6\xc3\xef\x4a\x84\xeb\x61\xe5\x3a\x79" - "\xf5\xb0\x32\xee\x49\x3d\x6c\x4f\xf5\xb0\x32\xca\xba\x1e\xb6\xb0" - "\x42\xcc\xfc\x25\x11\x0b\x97\x2e\x5c\xfa\x96\xe6\x8d\xd5\x2b\xe6" - "\x2f\x27\xc4\xc0\x63\x06\xad\xd1\x14\x48\x7d\x08\xed\xe9\x3f\xbd" - "\x2b\xd0\xe1\x9e\x15\x94\x69\xb6\xb7\x0b\x9d\x72\x40\x65\x4a\x39" - "\x90\xf2\x21\xb0\x2f\xae\xaf\x69\xc0\xb5\x37\x14\xd5\x69\x5f\xf7" - "\x02\xe6\x8b\xb9\x85\xf0\xdf\x84\x97\x16\x85\xe2\x79\x87\x99\x19" - "\x74\x35\x9e\x77\x78\x36\x08\xb7\xfd\x57\xba\x74\x0e\x83\x76\x7d" - "\xb6\x37\x6a\x9c\x1d\x46\x6d\xfb\x0e\xb9\x79\x54\xa0\x49\x26\x13" - "\x4d\x17\xc5\xdf\x02\xd6\xba\x5e\x51\x34\xeb\x16\xd2\xac\x71\x83" - "\x63\xab\xfc\x35\x6b\xd6\xe3\x7f\x7b\x68\xd6\x6c\xbe\x72\x43\xf1" - "\xc3\x25\x5c\xee\x76\x28\xcf\x34\xa0\xbf\x06\xbf\x17\x85\xba\x48" - "\x65\x67\xd0\x55\x87\x97\xea\xa8\xf7\x9a\x10\x7a\x6f\x0d\x72\xc1" - "\xeb\x4c\x14\xf5\xc6\xf7\xf1\xc3\xc8\x10\xc3\x15\x3a\x09\xf6\x7f" - "\x79\x43\x47\xed\x81\xfd\x78\x0d\xd0\x3a\x55\x63\xd1\x46\xb8\x77" - "\xb8\x2f\xdd\xc7\xdd\xe9\x4a\xbd\xd7\xf8\x28\x17\x0d\xa2\xea\x37" - "\x5f\x89\x06\x0e\x09\xc0\x0c\xb1\x05\xf6\x6d\x83\x7d\xe4\x9d\xdd" - "\xb5\x3a\xe3\xe6\xff\x4c\xc2\x71\x0a\xf4\xaa\xb8\xa3\xb8\x72\xa2" - "\x11\x9e\x0b\xca\xd5\xe3\x7b\xc1\xdf\xa4\x35\xec\xef\xab\x37\xee" - "\xef\x87\x1a\xd2\xc7\x07\x37\x79\x8d\x0f\xc0\x31\x6c\xfa\x40\xe6" - "\xdd\x34\x1c\x7f\x95\xf9\x1e\x5f\xb3\xfa\x85\x40\xcc\xd1\xb5\xea" - "\x19\x81\xb5\x69\xd3\xcb\xcf\xc6\xe5\xb3\xf1\xeb\xca\xcd\x57\x32" - "\xd9\xf8\x95\x09\xf5\x23\x0c\xe2\x57\x98\x6d\xfc\x22\xef\xf2\x8d" - "\x88\xc4\xb1\x52\x04\x79\x47\x15\xae\x1f\x98\x05\x0f\x35\x41\xfd" - "\x01\xed\x63\x8d\x33\xf1\x0c\x62\x99\xb9\x1e\xe0\x3a\x82\x63\x16" - "\x53\x27\xad\xea\x04\xae\x07\x9d\xf5\x48\x85\xeb\x01\x8e\x69\xb8" - "\x1e\xe0\x31\x32\x1f\x3e\x20\xf5\xc0\xa3\x12\xa9\x98\xba\x60\x28" - "\x66\xea\x02\xbe\xff\x12\x83\x55\x1c\xb3\xa8\x07\xdb\xcd\xf5\xc0" - "\x1c\xc7\x40\xeb\x06\x5c\x0f\xde\xe5\xd7\x83\xd9\x97\x55\x88\x89" - "\x71\x9b\xbf\xd6\x66\x41\x3d\xc0\xfd\x54\x46\x73\x1c\x83\x7a\x80" - "\xe7\xf0\x30\x71\xec\x6d\x36\x8e\xe9\x61\x3b\xe8\x7f\xcf\x22\x7e" - "\x1c\x6b\xac\x6f\x8d\x27\xae\x8e\x93\x17\xc7\xae\x32\xeb\x5f\x60" - "\x5f\x61\xbf\x61\x7f\x61\x1f\x3d\x4e\xfe\xc1\x71\xca\xa8\x4a\x29" - "\xee\x02\xbe\xe9\x52\x83\xba\xe2\x78\x85\xe3\x54\xb6\x88\x7f\xe0" - "\xdc\x1a\xb8\xbe\x80\x8f\x4e\xc7\x65\x59\xc4\x2a\x1c\xa3\x70\xbc" - "\xc2\x71\x0a\xc7\x2c\x3c\x56\x01\xea\x42\x35\x8e\x57\xcf\xc6\x91" - "\x38\x85\xe3\x57\xc2\x75\x12\xbb\x4a\xa3\x48\xcc\x4a\x18\x87\x7a" - "\xe3\xef\x60\x19\x3d\x53\x8a\xf1\x37\xad\xca\x0c\xf7\x51\x23\x1b" - "\xb3\x3e\x5e\x85\x46\x4d\x5e\xa8\x41\x38\x56\x81\xed\x7d\x4f\x6b" - "\x2f\x22\x86\xff\xa9\x5f\x74\xc8\x06\xee\xdf\x0b\xdc\x9f\xd6\x0d" - "\xb9\xd5\x6f\xfe\x41\x6d\xcb\xfe\x3f\x68\xcd\xec\x8f\xeb\x2c\xae" - "\xbb\x3a\xc5\x95\x8d\x4c\x1e\xd8\xf3\x37\x38\xe6\x90\x77\x9a\x69" - "\x63\x53\x48\x5f\xfa\x4d\x46\x13\x38\x6f\xe6\x72\xe6\x1f\x56\x92" - "\x77\xe3\x90\x23\x7b\x8d\xc8\xa4\x53\x1b\x8b\xb1\x2d\xd9\x3a\x5e" - "\x43\xa7\x4f\xd4\x60\x4d\xcd\x1b\x88\xdc\x0c\xe9\x13\x7d\x8c\xe9" - "\x13\xb5\x44\x5f\x3f\xec\x3f\x0d\xd9\xf5\xf4\x58\xa9\xfa\xfa\x81" - "\xbc\xff\xf8\x3e\xec\x17\xf4\xec\x30\x17\xd3\xf7\x61\xae\xa0\x05" - "\xef\x77\x8c\x89\xe8\x41\xca\xa2\xe0\x04\x03\x5d\xad\x59\x83\x7e" - "\x0d\xb1\xcf\xf5\x2c\xb4\xa8\x67\x21\x43\x2d\x0b\x5d\x0c\x7e\x5d" - "\x58\x7c\xd8\xa4\x77\x81\xe7\x73\x87\x9c\xbf\x1a\x62\xa9\x8b\x65" - "\x2c\x25\x71\xf3\x8a\x3b\x33\x2e\x3b\x65\x51\x18\x2e\x2b\xa4\x18" - "\x79\x68\xc6\xe3\xb1\x77\xd7\x0f\xac\x5e\x87\xf0\x7c\x52\x57\xf8" - "\x7b\x65\xe3\xce\x91\xc5\x70\x7e\x57\xfa\xfb\x69\x8a\xe8\xf1\xd0" - "\x9e\xcc\x9e\xa6\xc0\x63\x01\xfe\x18\x9f\x49\x99\x60\x1b\x19\x5b" - "\x94\x89\xf0\xfe\xa4\x26\x17\x86\x9b\x4c\x70\xcc\xb9\xba\x4c\x94" - "\xb4\xca\x0d\xe1\xe3\xc9\x78\xb5\x4c\x84\x8f\xdf\x1e\xa3\x62\xc6" - "\x12\x30\xe7\x19\x32\x11\x3e\xd7\x08\xdb\x3f\x30\xb9\xa3\xe4\x35" - "\x6a\x74\x36\xf4\x1c\x53\xc6\xd9\xd0\xff\x45\xb8\x0c\x1c\xbb\xcf" - "\x86\x7e\x81\x76\xac\xf2\x86\x3a\x9e\x09\xfb\xbf\x45\x3b\xee\xf4" - "\x82\x7f\x6f\xc0\xef\x01\xba\xa5\xb8\xae\x3e\x1b\x6a\x42\x1e\xeb" - "\x5f\xa2\x21\xb6\xd0\x65\x78\x8e\x62\x3c\xea\x00\xf7\xce\xac\x9d" - "\xab\x53\x54\xb9\xe0\x39\xec\x65\x15\x29\x88\x4e\x98\x5d\x63\xa2" - "\x67\xdf\x36\x25\xcc\xbe\x83\xaf\x6f\xa4\x67\xff\x84\xaf\xbf\x7d" - "\x8d\x86\x1d\xc3\x9a\xc9\x8c\xb7\x4b\x7a\xe0\x83\xf0\xfd\xe2\x6b" - "\xe3\x6b\xee\x88\xd1\xb2\xd7\x1d\xc4\xdc\x1f\xbe\x2e\x2e\xd7\xf2" - "\xba\xf8\x1b\xf1\x9a\x19\xcc\x75\xd3\xe1\x5f\x4f\xf0\x89\x1b\xf6" - "\x05\xbe\xae\x89\x0e\x73\xa5\x13\xc2\x94\xcc\x39\xb1\xd5\x42\xe7" - "\x9c\x61\xcf\x61\xc6\xa3\xe2\x73\x9a\xc8\xf1\x4c\x19\xd0\xde\x5d" - "\xc7\xdb\x9f\x0b\x2b\x42\xb6\x7e\xbc\xb1\x9e\xb4\x7f\x37\xa6\x92" - "\xf6\x8f\xf8\x95\xd1\xcb\xec\x30\x57\xf0\x9d\x0a\xb7\x95\xd7\x14" - "\x37\x06\xb6\x94\xf1\x7d\x98\x12\xfb\x1c\x6b\xc7\xac\x27\xac\x25" - "\xb3\x8e\x98\xfb\x8c\x46\xc8\x52\x37\xf0\xb7\x1b\x5b\xce\x32\x73" - "\x39\x70\x0f\xc8\xac\xa5\xe7\x60\xbf\xad\x96\xaa\x27\x73\x5a\xfa" - "\xf1\x76\x43\x3c\x4d\x63\x2d\x15\xcd\xda\x80\xcb\x39\xc6\xdd\xcf" - "\x34\x05\xd6\xd9\x63\xa6\x2f\xb5\xd9\x57\xcf\xc5\x21\x35\x79\xa6" - "\x1f\xb7\x33\xcf\x14\x57\xa4\xc6\xf7\x6b\x7e\x16\x7c\x1f\xc9\x26" - "\x0d\x32\x3f\xcb\x8e\x26\x1f\x28\xfb\x0e\x62\xcf\x39\x89\xcb\x37" - "\xdb\x01\xfc\x86\xcc\xe7\x98\x8f\x4f\x36\x69\xe1\xde\x07\x31\xe7" - "\x10\xdd\xdd\x10\xd0\x50\x75\x17\x6b\xdd\x75\x8e\x43\x00\xb0\xc0" - "\x4c\xb3\xee\xc1\x75\xaa\x89\xff\xe3\xbe\x34\x36\xc1\x35\xc0\x0f" - "\x14\xbb\x7d\x8c\x85\x2e\xd8\xf2\x1b\x84\xca\x5f\xc2\x2b\x3f\x0c" - "\xca\x8f\x85\xf2\x31\x93\xcd\xc2\xfd\x5f\xd5\x5b\x99\x72\x62\x49" - "\xf9\x66\xed\xd2\x29\x23\x26\x45\xaf\xc1\xe3\x3e\x6f\xfa\x92\xb8" - "\xfa\x9f\xa3\xf8\x38\x66\xbc\x11\x65\xca\x31\x59\x8d\x37\xb2\x1c" - "\x8f\x76\x38\x5e\xcf\x8e\x35\xba\xc9\x7c\xdf\x03\xe2\x6c\x1d\x66" - "\xcb\x43\x37\x2a\x28\x6e\xbc\xd1\x77\x78\x7f\x8f\xa2\x55\xd7\x2c" - "\xc6\x1b\x55\xd7\x90\xba\x7f\x33\x08\x72\x48\x0a\xf6\x23\xb2\xfd" - "\x3f\x05\x96\xdb\xb9\xf1\x7c\x64\x3b\x1e\x2b\xcd\xf6\xb9\xd6\x7c" - "\x55\x88\xfb\xdc\x6e\xce\x31\xf7\x73\x8a\xe4\xa8\x12\xd8\xb7\x36" - "\x8b\x63\xdf\xda\x2c\x71\xf6\xbd\xd5\xd1\x3e\xfb\xea\xab\x38\xf6" - "\xfd\x69\x1c\xa9\xfb\x3f\x0d\x24\x75\xff\x0e\xb3\x46\x32\x30\x45" - "\xb5\xf1\x0f\x11\xbe\xe7\x20\x9a\x60\x0d\xed\x05\xc6\x38\xbc\xa6" - "\xc2\x8a\x7d\xf1\x38\xad\x3b\x13\xa6\x00\xfb\x42\xfb\x96\x43\xec" - "\x70\x6b\x2a\xd8\x5e\x59\xd6\xd0\x80\xf0\x76\x68\xdb\xaa\x30\xf7" - "\x7e\x61\xaa\xa0\xf6\x80\xfd\xe0\xe7\x52\xa7\x8e\x40\x96\x5c\x5c" - "\xbf\xf9\x56\xa2\x30\x0f\xdf\x71\x31\xf0\x78\xf8\x56\xa9\x99\x87" - "\xf1\xfd\x61\x06\xc6\x3c\x6c\xc0\xfd\x98\xfd\xfb\x21\xcc\xc3\x86" - "\x74\x4b\x1e\xae\xd9\xda\xc2\xc3\xdd\x2d\x78\x38\xd6\xcc\xc3\xb7" - "\x1a\x9f\xf0\xb0\xb3\x3c\x2c\x96\xd7\xd7\x4c\x97\xc7\xc3\x35\xd3" - "\xfe\xaf\xf0\xb0\x60\xde\x2e\xe0\x1f\xd0\x73\x8d\x41\x80\x87\x69" - "\xe0\xe1\xbd\x76\x78\x18\xd7\x03\xcc\xc2\x4c\xde\x1e\x09\xcc\x01" - "\x31\x00\x33\xb0\x99\x89\x31\x07\x63\x1e\xc6\xfc\x8b\x59\x99\xf1" - "\x9f\x27\xe7\x3f\x5b\x1e\xae\x09\xe4\x78\xb8\xdb\xdd\x2c\x1e\x0f" - "\xdf\xf1\xb1\xe5\xe1\x3b\x01\xb6\x3c\x7c\x2b\x8d\xe3\xe1\x5b\x01" - "\x7c\x1e\xae\x9b\x6c\xcb\xc3\x77\x36\x89\xf1\x30\x66\x60\xcc\xc3" - "\x38\x5f\xc0\x2c\x0c\x7f\x6b\x39\x7d\xdd\x39\x2a\x8f\x87\xef\x14" - "\x38\xc6\xc3\x3f\x79\x09\xf3\xf0\x2d\x37\x71\x1e\xbe\xe5\x26\xcc" - "\xc3\xfa\xa3\x1c\xc3\xe8\xd7\xb7\x7f\x1e\xd6\xfb\x08\xf3\x8a\x7e" - "\x30\x66\x02\x9d\xe2\x27\x35\xe6\xe1\x87\xcb\xc2\x3f\xa9\x85\x59" - "\x58\xbf\x8f\x30\xc3\x4f\xde\xb6\x2c\x0c\xe7\x08\xb2\xb0\xfe\x22" - "\x7b\x8e\x9a\xcf\xc2\xa4\x0c\x68\xff\xee\x8a\xb3\xf0\xdd\xed\xa4" - "\x3d\xbc\x3b\x97\xb4\x87\xc4\xa7\xb6\x2c\x7c\xd7\xbf\x75\x16\x26" - "\x1a\x62\xee\x53\x94\x85\xef\xae\xb3\x65\xe1\x5b\x6e\xc2\x2c\x5c" - "\x3b\x9d\xd3\xd1\xbd\xfb\x7c\x16\xbe\x7b\xfa\xf1\x60\x61\x51\x6d" - "\xf9\xf0\x39\xf8\x5e\xba\x74\x0e\xbe\x77\x46\x1a\x07\x63\xcd\x09" - "\x71\x70\xad\x97\xb5\xe6\xf8\x1c\x5c\x3b\x54\x98\x83\x6b\x27\xf0" - "\x39\x18\x97\x2f\xc4\xc1\xb5\x2b\x79\xe5\xdb\x70\x70\x6d\x2a\x9f" - "\x83\xc9\x71\x1c\x07\xd7\x05\xb0\xfd\x0b\x47\xa4\x73\x70\x5d\x0f" - "\xfb\x1c\x5c\xd7\x87\xcf\xc1\xb5\x75\x84\x77\xeb\x26\x11\x0e\xae" - "\x63\xb7\xdf\xcc\xb7\xdc\xce\x71\x30\xd9\x6e\xcb\xc1\x75\x91\xad" - "\x70\x70\x80\xe3\x1c\x4c\x0f\x2a\x6e\xe1\x60\x7a\x90\x99\x83\x4d" - "\x14\xf0\x25\xb4\xfd\xf0\xab\xc6\x73\x08\x70\x9d\xbb\xa1\xb8\xef" - "\x65\x9f\x85\x0d\x51\x1c\x0b\x37\x1d\x23\x75\xbf\x29\x9b\xd4\xfd" - "\xa6\xb9\x2d\x2c\xdc\x37\xc2\xb7\x74\x63\x0b\x0b\x57\x1c\x5e\x53" - "\x6e\xc5\xc2\xd8\x76\x4d\x0c\x0b\xef\x78\xc0\x8c\xd7\xd0\xe1\xf6" - "\x7c\x4a\xdc\x15\x3a\x09\xda\x70\x68\xc3\x74\xc4\xbe\x8d\x07\xb2" - "\x32\xe8\x4a\x8e\x97\xef\xaf\x6f\xe1\xe5\x38\xa6\x0f\xb9\x82\xe1" - "\xe5\x05\xe5\x54\x36\x94\x0f\x3f\x17\xcc\xca\x98\x99\x81\x95\x2f" - "\x64\x67\xd0\xe5\x7b\x32\xe8\x92\xfa\xcd\xf7\x0b\xcc\xcc\xbc\x1d" - "\xb6\x25\xc3\xb6\x53\x39\x70\xfc\x03\xe6\xe7\x02\xb6\xaf\x7c\x0f" - "\xae\x89\xcf\x83\x63\x75\xe6\x63\xa1\x9d\xbe\x40\xd8\xba\x31\xca" - "\xd4\xc1\x92\xad\x1f\x0c\x36\xb3\x75\x32\x3c\x2f\x66\x28\x33\x5b" - "\x9b\x80\xad\x69\x2f\xd2\xdf\xcc\xe7\xeb\xfa\x9b\x66\xbe\x4e\xb6" - "\xe4\xeb\x68\x33\x5f\x3f\x98\x29\x93\xaf\x2b\xfe\x2f\xf3\x35\x66" - "\x6b\xcc\xd3\x98\xad\x31\x6b\x63\xbe\xc6\xac\x6d\x62\xf9\x7a\x8f" - "\x25\x5f\x77\xb0\xe0\x6b\x85\x25\x5f\xd7\x1f\x95\xc7\xd7\xf5\x05" - "\x96\x7c\x0d\x7e\xab\x90\xca\xd7\xd8\xc7\x36\xef\x33\xf1\x78\x1b" - "\xf0\x13\xf6\x89\xdd\xf7\x62\xac\xbf\xb0\x7f\xb0\x6f\xb0\x8f\x1c" - "\xf2\x0f\xe8\xab\xa4\xe1\xe7\xe3\x6b\xad\x15\x5f\x63\x9e\x06\xdb" - "\x55\x61\xce\x2e\x2b\x02\xdb\x2c\x03\xd6\x06\xce\x6e\x9d\xb1\xeb" - "\x73\x2c\x19\x7b\x4f\x37\x4b\xc6\x6e\xdc\x62\xcb\xd8\x8d\x59\x16" - "\x8c\x7d\x41\xa7\xb8\xcf\xcc\x41\x28\x5a\x80\xd9\xf9\x7e\x14\x9f" - "\xaf\xe9\xcb\xb6\x7c\xdd\x78\x5d\x8c\xaf\xf1\x38\x31\xeb\xfe\x66" - "\x93\x97\xb9\xbf\xb9\xc9\x4b\x1e\x5f\x37\xa9\x39\xfe\xbf\x1f\x44" - "\xda\x88\x46\x51\xe6\xae\x57\x59\x32\x77\xd3\x56\x8e\xb9\x57\x58" - "\x30\xf7\x7d\xb5\x38\x73\xdf\x67\xae\x47\xab\x16\x85\xe1\xb2\x30" - "\x2b\xe1\xbe\x0a\x0d\x33\xc7\xdc\x30\x12\xf3\x12\xee\x83\x80\x67" - "\x02\x66\x32\xb8\x5a\xb2\x37\x7e\x5f\x67\x8f\x8f\xa2\x17\xa0\xde" - "\x98\x91\x30\x1f\x99\x79\x16\x1f\x8f\x39\xe9\xd1\x32\x52\x73\xae" - "\x30\x23\x35\x1f\x61\xf8\x97\x99\x9b\xd8\xb4\x05\xb7\x75\x0f\x97" - "\xc1\x9b\xb6\x08\x33\xb8\xa1\x3f\xe1\x95\xa6\x24\xec\x17\x3e\x83" - "\xc3\x39\x82\x0c\x6e\x98\xc9\x9e\xb3\x85\xcf\xe0\xa4\x0c\x68\x77" - "\x57\x8a\x33\xb8\xd1\x93\xb4\xc3\x86\xab\xa4\x1d\x66\x7d\x6c\xc3" - "\xe0\x86\x63\x96\x0c\x8e\xfd\x6f\xcb\xe0\x44\x53\xcc\x7d\x8a\x32" - "\xb8\x51\x61\xcb\xe0\xf7\xd5\x98\xc1\x85\x75\x65\xba\xce\xd7\x95" - "\x69\x53\x83\xc9\xcc\xe2\xdb\x70\x79\x53\xad\x59\xfc\x31\xd4\x5a" - "\x2e\xc7\xe3\xf8\x99\x4c\xfd\xa5\xf1\x38\x73\xce\x4c\x69\x3c\x8e" - "\xf5\x27\xc4\xe3\xa6\xfd\xd6\xfa\xe3\xf3\xb8\xe9\xa4\x30\x8f\x9b" - "\x2e\xf1\x79\x1c\x97\x2f\xc4\xe3\xb4\x2b\xaf\x7c\x1b\x1e\xa7\xfb" - "\xf0\x79\x9c\x1c\xc7\xf1\x38\x5d\xcc\xf6\x6f\x1c\x93\xce\xe3\xf4" - "\x01\xfb\x3c\x4e\x1f\xe1\xf3\x38\xbd\x91\xc4\x54\xba\xb2\x81\xe1" - "\x71\x3a\x93\xe5\xfa\x42\xcb\xed\x1c\x8f\x93\xed\x0d\x96\x3c\x5e" - "\x84\x79\x9c\xae\x6b\x85\xc7\x83\x1c\xe6\x71\xaa\xb3\x5f\x0b\x8f" - "\xc3\xdf\x76\x79\x9c\x42\xfb\xed\xf2\x38\xe5\x16\xdd\xc2\xe3\x54" - "\x87\x93\x4c\x1c\xa0\x3a\xec\x67\xe2\x00\xd5\x61\xbe\x08\x8f\x97" - "\x08\xf2\x38\xd5\x61\xaa\x05\x8f\x57\x62\x0e\x87\x36\xaf\x12\x73" - "\x00\x1e\xaf\x01\x1c\x5e\x51\x14\xc3\x1c\x37\x1a\xf3\x3a\x66\x74" - "\xd8\xaf\x4b\xc2\x7f\x9b\x98\x73\x2e\xe0\xf1\x50\x0c\x97\xdf\x60" - "\x18\xfe\x02\xe3\x13\xca\x35\x1b\xce\x2d\x6f\x61\x78\x4a\x31\xce" - "\x8a\xe1\x4b\xec\x30\x7c\x31\x30\xfc\x29\x60\xf8\xa2\xfa\x6d\x8a" - "\x58\x0b\x86\x3f\x05\x0c\x5f\x64\xc5\xf0\x15\xc0\xf0\x95\xf8\x3c" - "\x7c\x0e\x1c\x9f\xc7\x3b\x1e\xee\x95\x39\xfe\x1e\xf3\xc3\xc7\x97" - "\xc3\xf1\x17\x18\xe6\xdf\xa6\xb8\x60\xc1\xfc\xc5\x0c\xf3\x53\xae" - "\x73\x68\x4b\xe6\xa7\xa8\x3e\x92\x99\x9f\x52\x5e\xb6\xcb\xfc\x14" - "\x35\x59\x26\xf3\x97\x3c\x61\xfe\x56\x98\x9f\x52\x1e\x90\xc5\xfc" - "\x94\x32\xcf\x8a\xf9\x4b\x9e\x30\x7f\x1b\x32\x3f\xa5\x4c\x6b\x61" - "\xfe\x0d\xdd\xee\xee\xc5\xcc\xbf\x93\x65\xfe\x6d\xae\x71\x36\xcc" - "\xbf\xcd\x35\xc5\x82\xf9\x8b\x75\x94\xa2\xaa\x85\xf9\x29\xc5\x20" - "\x1e\xf3\x53\x9d\xaf\xdb\x30\x3f\xe5\x7a\x49\x16\xf3\x53\x1d\x3a" - "\xca\x62\x7e\xaa\x83\x1b\xb9\xbf\x6b\x38\xbe\x33\xf3\x22\x74\x94" - "\x6b\x5e\x4b\x1e\x40\xa1\x0b\x96\xdb\x5a\xcd\x03\xa8\x0e\xa9\x82" - "\x79\x00\x85\x72\x45\xf3\x00\xd8\x27\x9a\x07\x50\x6e\x63\x78\xbc" - "\x46\xb9\x75\x79\x2c\xf2\x00\xea\xa9\x83\x82\x6c\x46\x3d\x75\xac" - "\x25\x0f\xa0\x3a\xa4\x3c\xf4\x3c\x00\xca\x14\xcc\x03\x28\xb7\xc1" - "\x0c\x27\x51\x1d\xd2\x6c\xf2\x00\x7c\x8e\x50\x1e\x40\xb9\x45\xb0" - "\xe7\xa4\xf0\xf2\x00\xb6\x0c\x68\xef\x5b\xfa\xbf\x6d\x7d\xda\xb1" - "\x07\x69\xff\xdd\x6e\x92\xf6\x9f\xf5\xb1\x75\x1e\x40\xb9\x9d\x6c" - "\x35\x0f\x60\x35\xc5\xdc\xa7\x58\x1e\x40\x75\xec\x68\x93\x07\xc0" - "\x35\x45\xf3\x00\xaa\xd3\x6d\xbe\xae\x3a\x6d\xe7\xe5\x01\x54\xc7" - "\x99\x8f\x4d\x1e\x20\xae\xb5\x83\xbc\x3c\x80\xea\x34\x58\x72\x1e" - "\x40\x75\x8a\x90\x94\x07\x30\xfa\x13\xc8\x03\xa8\x4e\x87\xac\xf5" - "\xc7\xcb\x03\xa8\x4e\x67\x04\xf3\x00\xaa\xd3\x55\x5e\x1e\xc0\x94" - "\x2f\x90\x07\x50\x9d\xbb\xf0\xca\xb7\xce\x03\xa8\xce\x03\x79\x79" - "\x00\x7b\x5c\x4b\x1e\x40\x75\x2e\x27\x31\x19\x4d\x90\x9c\x07\x50" - "\x9d\x8f\xd8\xcd\x03\xa8\xce\xc7\x78\x79\x00\xd5\x39\x89\xc4\xd4" - "\xce\x55\x4c\x1e\x40\x75\xce\x21\xdb\x51\xb0\xe5\xf6\x96\x3c\x80" - "\xdd\x6e\x93\x07\x6c\xeb\x6c\x68\x25\x0f\x70\x37\xe4\xf6\xd5\x37" - "\xf9\xf4\x43\xcd\xea\x19\x9a\xe7\xaa\x5e\x32\xb6\xac\xd5\x1f\x0e" - "\x6d\x7a\x25\xb0\x43\x04\xa2\xf0\xfc\xf8\xf8\xf3\xc0\x6c\x11\x64" - "\x2c\x3d\xe6\x84\xcf\x56\x61\x4e\x28\x72\xc5\x6b\x0b\x36\xa5\x0d" - "\xd3\x19\x06\x0d\x50\x61\x56\x68\xcc\xed\x5b\xde\x90\x36\x3e\xa0" - "\x11\x8f\xa3\x5f\x8c\xa8\x79\x35\xc2\xec\xb0\xb6\x92\x36\x81\xe6" - "\xdd\x42\xe6\x10\x6e\x28\x8d\xba\xce\xe8\x18\x33\x03\x9e\xeb\x50" - "\x56\x57\xc1\x30\x84\x7b\x78\x20\xca\x8a\x47\xea\x2e\x35\x48\xd5" - "\x45\xa1\xe8\xf0\xca\x45\x84\x8c\xc0\x0f\xe3\x06\xd2\xa6\xe7\x22" - "\x03\xf1\xfa\x36\x5d\x09\x43\x14\xba\x1a\x58\x86\xf8\xe0\x01\x1a" - "\x94\xbd\x0a\xd8\xa1\x94\x63\x87\x46\x33\xdb\x59\x70\xc3\xdc\xdb" - "\x2a\x94\xbd\x81\x3f\x8e\xbe\x39\x95\xe3\x06\xcc\x0c\xf4\x3c\x2d" - "\x1a\xd2\x40\xc6\x49\xac\x99\x4a\xc6\xa2\x0e\xaa\x82\xbc\xe4\x75" - "\xe4\x56\x12\x7e\x0d\xcf\x37\xf7\x2e\xa9\xda\x8f\x56\x4f\x40\xbd" - "\x0d\x98\x13\x36\xd0\xf9\x25\x55\xe9\x08\xaf\xdd\x07\xbc\x18\x90" - "\xf9\x00\x8d\xc2\xed\xf1\xa4\x08\xc2\x0b\xa4\x2d\xee\x92\x7e\x5a" - "\x7b\x1a\x49\x67\xbd\x2e\xcc\xfb\x77\xd1\x39\xac\xb9\xfd\x90\xc1" - "\xa7\x6f\xb9\x11\x7c\x49\xd6\x6c\x9c\x18\x6e\xfa\xc3\x1b\x81\x9f" - "\x81\x0e\xff\x74\xad\x5a\x81\xd7\x9f\xc6\xdf\x62\x34\x1d\x1c\xa0" - "\xe2\xf9\xa6\x99\xf5\x4d\x33\xf1\x0d\xf6\xcb\xeb\xd1\x08\xaf\xf5" - "\xd7\x15\xfb\xa4\xac\xa1\x02\x99\xd6\x9a\xbf\xc7\xe8\x8b\xf6\x98" - "\x88\x3f\x8c\xcd\x51\x1d\x4d\x60\x7b\xbc\xa6\x15\xe8\x81\x61\xb8" - "\x24\xfc\x8d\xc6\xf5\x8a\x2e\x98\xe1\x40\xdf\x9d\xf6\x36\x81\x1f" - "\xae\x12\x3f\xd0\x1b\x54\xcc\xbf\x86\xb5\x5a\x0d\x94\xdd\xb7\xb9" - "\x19\x7c\xd1\x60\xed\x8b\xaf\x73\xf1\xb7\x1c\xf1\x7a\x73\x86\x54" - "\xb2\xa6\x1e\xe3\x8b\xb5\xda\x5e\x78\xcd\x0a\x66\x2e\x4a\xb3\x16" - "\xc7\x4b\xd5\x9e\x1b\x78\x0e\x0d\xf1\x81\x91\xb5\x3d\xfe\xae\x23" - "\xb6\x37\xe6\xb3\x32\xe0\x32\x66\x6e\xc8\x36\x77\x55\xf3\xfe\xbe" - "\xe5\x78\x0c\xcb\x1d\xca\xc3\x53\x1e\x07\x79\xa8\x7e\x7e\xdb\x6b" - "\x1e\x43\xdb\x77\xa9\xe4\x6c\xaf\xda\x2e\xcf\xf6\xaa\xa4\x9f\xdf" - "\xf6\xaa\xc7\xd0\xf6\x1e\x61\x9c\xed\xbb\xc9\xe4\xff\x6e\x6e\xf6" - "\x6c\x8f\xfb\x91\xcc\x7d\x48\xe6\xfe\x23\xdc\xc6\x91\x5c\xa5\x47" - "\x61\xcb\x98\x46\xf8\xdb\x72\x4c\x63\x69\x10\x9e\xdb\xcd\x8e\x69" - "\xa4\xba\x5d\xb6\xdf\x6f\xd4\xdd\xc0\xf5\x1b\x79\xcd\x24\xdc\xe8" - "\x35\x9a\x70\xa3\x9a\x99\xe3\x8d\xe7\xf2\xc4\xdf\x44\xd4\xe1\x55" - "\x3a\x0a\xaf\x97\xbb\x1d\xda\x57\x6c\x63\x60\xae\x67\x6e\x51\xea" - "\x95\xb8\x4f\xe8\xcb\x07\x3a\x2a\x05\xf6\x31\x6d\x58\xdf\x37\x02" - "\x0f\xf6\xd4\x2b\x70\x3b\x86\xd7\x28\xa5\x2d\xe6\xeb\x19\xfb\xf7" - "\x43\xb5\xfb\xfb\xea\xcd\xf3\x70\x8c\xe9\x33\x34\x86\x43\x03\x54" - "\x82\x9a\xc1\xf3\x00\x41\x37\x78\xce\x9e\x59\x3b\x8c\x66\x9a\x20" - "\xef\x6d\xa8\x46\xf8\x9b\x34\x1e\xd5\x48\x45\x83\x66\x66\x1f\x80" - "\xfb\xb4\xd4\x4d\x8a\x88\x6e\x76\xf1\x75\x53\xcb\xea\x06\xf4\xc3" - "\xe9\x86\x9b\xc3\xa7\x95\xa4\x9b\x1a\x56\x37\xa9\x56\xba\xb9\xad" - "\x41\xff\xac\xbc\xcc\xea\x46\x75\xc1\xd0\xdf\xac\x1b\xf5\x98\xd3" - "\x73\x40\x37\x73\xa4\xea\x46\x1d\xc8\xcf\x65\x7b\xce\xb7\xcd\x65" - "\xd5\xfb\xad\x73\x59\x73\xee\x5a\xeb\x35\x51\x53\x0b\xf9\x6b\x5d" - "\x4b\xfe\xaa\x3e\x23\x4f\xbf\xea\x62\x87\xc6\x84\x51\x5e\x03\xad" - "\xc7\x84\x1d\x8a\xc7\x79\x69\x37\x1d\xd6\x96\x70\x5e\x4a\xf6\xd9" - "\x8c\xe5\xa1\xba\x97\xb6\x8c\xe5\xa1\xba\xef\x6a\xf7\x63\xc2\xa8" - "\xee\x01\xc2\xf9\x41\xf7\x31\x84\x37\xbd\xb4\x8f\x64\x8e\x04\x94" - "\x2b\x9c\x8b\x76\x3f\x46\x58\xdd\x6b\x90\xcd\xb8\x30\x7c\x8e\x60" - "\x2e\xda\xfd\x36\x7b\x8e\x96\x9f\x8b\x92\x32\xae\x51\xbf\xec\x28" - "\x9e\x8b\xfe\x72\x3f\x89\x29\xbf\x5c\x49\x62\x0a\xf1\xab\x6d\x2e" - "\xfa\xcb\xc9\xad\x8e\x0b\x63\x75\xc4\xdc\xa7\x68\x2e\xfa\xcb\x74" - "\xdb\x5c\xb4\x5b\xa5\xe0\xb8\x30\xaa\xc7\x32\x4e\x4b\x3d\x3c\x79" - "\xe3\xc2\xa8\x5f\x5e\x7e\x2c\xc6\x85\x89\xeb\x2b\xc0\x66\x8e\x04" - "\xe5\x7d\x44\xf2\xd8\x30\xca\xfb\xba\xb4\x1c\x14\xeb\x4e\x28\x07" - "\xed\x31\xd4\x5a\x77\xfc\x1c\xb4\xc7\x64\xe1\x1c\xb4\xc7\x7c\x7e" - "\x0e\x8a\xcb\x17\xca\x41\x7b\xa4\xf2\xca\xb7\xc9\x41\x7b\x1c\xe2" - "\xe7\xa0\xe4\x38\x2e\x07\xed\x49\xd6\x1b\xa6\xba\x6d\x92\x9e\x83" - "\xf6\x64\xc6\xb5\x1d\xfa\x98\xbc\xeb\xe1\xe7\x9f\x3d\x47\xf2\xf3" - "\xcf\x9e\xee\xa4\xde\xf7\x8c\x64\xc6\x85\x51\x3d\x35\x64\x7b\xb7" - "\x8d\x96\xdb\xb9\xfc\x93\x6c\xc7\xe3\xc2\x98\xf1\x60\xdb\x7a\xae" - "\x90\x96\x77\x0e\x69\x87\x79\xa7\xaf\x9d\xbc\xd3\xf7\x31\xcd\x3b" - "\x7b\x75\x91\x97\x77\xf6\x72\xff\xf9\xf9\xfb\x71\xcc\x7d\x7a\x6e" - "\xe1\xf8\xfb\xe9\xad\xf2\xf8\xe5\xe9\x2d\x3f\xbf\xed\x1f\xc7\xdc" - "\xa7\xd7\x34\xce\xf6\xcf\xb8\xca\xb3\xfd\x33\xa2\xdf\xff\x68\x3d" - "\xf7\x19\x50\xc0\xe5\x3e\x03\x0a\xc4\x73\x9f\x67\x2e\xd9\xcf\x7d" - "\xfa\x35\x70\xb9\x4f\xdf\xe9\x84\x53\xfa\x8e\x24\x9c\xd2\xa7\xb1" - "\xf5\xdc\xa7\xcf\xb2\x27\xb9\x8f\x94\xdc\xe7\xe9\x72\x2e\xf7\xe9" - "\x33\x5a\x5e\xee\xd3\x87\x3f\x57\x9c\x7a\x36\xc2\x36\xf7\xe9\xb3" - "\xcf\xf1\xdc\xa7\xcf\x69\x79\xfa\xed\x73\xca\xb1\xdc\xa7\x6f\x7f" - "\xe1\xdc\xe7\x99\x4a\xf1\xdc\x87\xec\xb3\xe5\xd5\x7e\x67\x38\x5e" - "\xed\x97\xde\xfe\x73\x9f\x7e\x7e\xc2\x6c\xda\x6f\x34\x61\x9d\xbe" - "\x3e\x8f\x26\xf7\xe9\xeb\x23\x9c\xfb\xf4\x3b\x4a\x18\xb1\xaf\xd6" - "\x36\xf7\x81\x73\x04\x73\x9f\x7e\x37\xd9\x73\x7c\xf8\xb9\x0f\x29" - "\xe3\x1a\xe5\xe3\x2a\x9e\xfb\xf8\xec\x23\x31\xc5\x67\x19\x89\x29" - "\xc4\xaf\xb6\xb9\x8f\xcf\x84\xd6\x73\x1f\xa2\x23\xe6\x3e\x45\x73" - "\x1f\x9f\x54\xdb\xdc\xe7\x99\x0a\xe1\xdc\x67\xc0\x12\x4e\x4b\x03" - "\xba\xf0\x73\x1f\x9f\x4b\x8f\x47\xee\x23\xaa\x2f\x3f\xdb\xdc\xa7" - "\xff\x21\xe9\xb9\x4f\xff\xab\xd2\x72\x1f\xac\x3b\xa1\xdc\x67\xc0" - "\x60\x6b\xdd\xf1\x73\x9f\x01\x13\x84\x73\x9f\x01\x11\xfc\xdc\x07" - "\x97\x2f\x94\xfb\x0c\xd8\xce\x2b\xdf\x26\xf7\x19\x70\x80\x9f\xfb" - "\x90\xe3\xb8\xdc\xe7\xd9\x49\x24\x96\x3e\xb3\x5e\x7a\xee\xf3\xec" - "\x60\xf1\xdc\xe7\x59\x7f\x7e\xee\xf3\xac\x1b\xa9\xf7\xcf\x86\x93" - "\xdc\xe7\xd9\x5e\x64\xfb\x33\x89\x96\xdb\xb9\xdc\x87\x6c\xe7\x72" - "\x9f\x67\xa3\xa5\xe5\x3e\xcf\xb4\xc3\xdc\x47\x63\x27\xf7\xd1\x3c" - "\xa6\xb9\xcf\xc0\x8e\xf2\x72\x9f\x81\x76\xfb\xbf\x9f\xf0\xb7\x18" - "\x7f\x3f\xbb\x91\xe3\xef\x5f\x6f\x92\xc7\x2f\xbf\xde\x28\x9f\xbf" - "\x87\xf9\x71\xfc\x3d\xcc\x4f\x9c\xbf\x9f\x9b\x69\x9f\xbf\x87\xc4" - "\x72\xfc\x3d\xf8\x22\x69\x2b\x07\x1f\x23\x6d\xe5\xe0\xd5\xad\xf3" - "\xf7\xa0\xbb\x4f\xf8\x5b\x0a\x7f\x0f\x0c\xe5\xf8\x7b\xd0\x09\x79" - "\xfc\x3d\xe8\x38\x9f\xbf\x87\x5d\xb5\xe5\xef\xc1\x7d\x1c\xe7\xef" - "\xc1\xe3\xe4\xe9\x77\x70\x90\x63\xfc\x3d\x78\xbf\x30\x7f\x3f\x37" - "\x47\x9c\xbf\xc9\x3e\x5b\x66\x1a\x32\x81\x63\xa6\x21\x5e\xed\x9f" - "\xbf\x9f\x2f\x10\xe6\xa3\xe7\x4f\x90\xf6\x76\x70\xee\xa3\xe1\xef" - "\xc1\xb9\xc2\xfc\x3d\xc4\x9f\x70\xca\xe0\x3c\x5b\xfe\x86\x73\x04" - "\xf9\x7b\xc8\x42\xf6\x9c\x5c\x3e\x7f\x93\x32\x20\x86\x6c\x12\xe7" - "\x6f\xdf\x3e\x24\xa6\x0c\xb9\x4b\x62\x0a\xf1\xab\x2d\x7f\x0f\x39" - "\xd3\x3a\x7f\x13\x1d\x31\xf7\x29\xca\xdf\xbe\x9e\xb6\xfc\xfd\x5c" - "\x98\x30\x7f\x0f\xbd\xcd\x69\x69\xe8\x76\x3e\x7f\xfb\xda\x8c\x7f" - "\x7b\xcc\xf4\x55\x60\xcb\xdf\x43\x25\x8e\x7f\x63\xce\x91\x38\xfe" - "\x0d\xeb\x4e\x88\xbf\x87\x1e\xb2\xd6\x1d\x9f\xbf\x87\x8a\x8c\x7f" - "\x1b\x6a\x35\xfe\x0d\x97\x2f\xc4\xdf\xc3\xba\xf0\xca\xb7\xe1\xef" - "\x61\x56\xe3\xdf\xc8\x71\x1c\x7f\x0f\x2b\x21\xb1\xf4\x39\x85\x74" - "\xfe\x1e\x76\x48\x9c\xbf\x87\x1d\xe5\xf3\xf7\xb0\x2d\xa4\xde\x0f" - "\xd3\x11\xfe\x1e\x96\x45\xb6\x3f\x87\x2c\xb7\x73\xfc\x4d\xb6\x73" - "\xfc\x3d\x4c\x2f\x8d\xbf\x3d\xda\x21\x7f\xab\xec\xf0\xb7\xea\x31" - "\xe5\x6f\xbf\xad\xf2\xf8\xdb\xcf\x6e\xff\xb7\x7d\x06\x1c\x15\xc0" - "\x31\xe0\xa8\x00\x71\x06\xf4\x9f\x6b\x9f\x01\x47\xc6\x71\x0c\xf8" - "\xc2\x25\x12\xaf\x5f\x38\x41\xe2\xf5\x0b\xeb\x5a\x67\xc0\x11\xf7" - "\x9f\x30\xa0\x14\x06\x1c\xee\xc2\x31\xe0\x88\x93\xf2\x18\x70\x44" - "\x11\x9f\x01\x47\x09\xcc\xa5\x78\xa1\xbf\xe3\x0c\xf8\xc2\x04\x79" - "\x0c\xf8\x42\xb0\x63\x0c\xf8\xc2\x01\x61\x06\xf4\x0f\x17\x67\x40" - "\xb2\xcf\xb6\xdd\x1e\xc9\xad\xab\x48\x8d\xec\xd1\xfe\x19\x30\xa0" - "\x50\xb8\x8d\x0e\x38\x49\x62\xfe\x0b\x79\x8f\x86\x01\x5f\xc8\x13" - "\x66\xc0\x91\x23\x49\x5b\xf9\xc2\x41\x5b\x06\x84\x73\x04\x19\x70" - "\xe4\x12\xf6\x9c\x3c\x3e\x03\x92\x32\x20\x86\x6c\x15\x67\xc0\xdf" - "\xf4\x27\x31\x65\xe4\x7d\x12\x53\x88\x5f\x6d\x19\x70\x64\x69\xeb" - "\x0c\x48\x74\xc4\xdc\xa7\x28\x03\xfe\xc6\xcb\x96\x01\xfd\xe7\x08" - "\x33\xe0\x8b\x77\x39\x2d\xbd\x98\xca\x67\xc0\xdf\xcc\x7d\x3c\x18" - "\x50\x54\x5f\x85\xb6\x0c\xf8\xe2\x50\xe9\x0c\xf8\xe2\x7c\x69\x0c" - "\x88\x75\x27\xc4\x80\x2f\x1e\xb1\xd6\x1d\x9f\x01\x5f\x2c\x15\x66" - "\xc0\x17\xaf\xf3\x19\x10\x97\x2f\xc4\x80\xa3\x3c\x79\xe5\xdb\x30" - "\xe0\xa8\xc1\x7c\x06\x24\xc7\x71\x0c\x38\x8a\x9d\x03\xe1\xef\x2a" - "\x9d\x01\x47\x1d\x11\x67\xc0\x51\x56\xf3\x1f\x46\xb1\xf3\x1f\x46" - "\x55\x11\x06\x1c\xc5\xce\x7f\xf0\x77\xb1\xdc\xce\x31\x20\xd9\xce" - "\x31\xe0\xa8\xd6\xe6\x3f\xb7\xc2\x0d\x41\x89\x1c\x37\x04\x25\x5a" - "\x72\xc3\x99\x53\x96\xdc\x30\x3a\xdd\x3e\x37\x8c\x29\xe6\xb8\x21" - "\x70\x20\xa9\xe3\x81\x5d\x48\x1d\x7f\x89\xf1\x65\xf3\xa7\xfd\x35" - "\xeb\x4a\x11\xf5\xd9\x9d\x42\xea\x83\x55\xc8\x25\x69\x15\x70\x03" - "\xb0\x5a\xf4\x2c\xcc\x0d\x2f\x8d\x9b\x1c\x77\x85\x76\xcf\x02\x26" - "\xad\x62\x19\x35\x1a\x18\xb5\x0a\xfe\x0f\xf5\xe5\xc4\xd2\x42\xea" - "\x1c\x70\x64\x0a\x70\x1c\x33\x67\x96\x99\x4f\xab\x73\x65\xbe\x77" - "\x70\xa7\x81\xf9\x76\x8e\xc3\xdf\xa1\xa8\x62\xbf\x43\x11\xc9\xff" - "\x0e\x05\xfe\xfe\x04\xfe\x16\x45\x56\x0c\x52\x63\x46\xc5\x2c\xd1" - "\x75\xbd\xa2\x2b\xfe\x16\x45\xd7\x3a\xc2\xa1\x87\x4c\xc5\x84\x43" - "\x97\x7b\x77\x4a\xba\x87\x06\xed\xb9\xc7\x31\xc4\x87\x98\x1f\x96" - "\x6b\x35\x75\xcb\xb5\xbd\x6b\x6b\xb5\x7d\x6d\xbf\x41\x71\x3a\x0e" - "\x7f\x83\xa2\x2c\xb6\x82\xe1\x07\xe6\xdb\x05\x6f\x69\xd1\xde\x05" - "\xc0\x34\x35\x48\xf1\x3c\x5e\x0f\xbc\x17\xdc\x7b\x29\x52\x19\x6b" - "\xb5\xbd\x2c\xd7\x3d\x84\x7b\x57\x99\x6a\xb5\xa8\x24\xfc\x3b\x66" - "\x9e\xa6\x81\x9d\xa7\xa9\x5f\xae\xa5\xa0\xcc\x80\x8f\x63\x2c\x38" - "\xd4\xcb\xcc\xa1\x2f\x79\xca\xe3\xd0\x97\x54\x7c\x9e\x18\x37\xd8" - "\x96\x27\x5e\xb2\x59\xff\x5b\x9c\x27\x5e\xda\x25\x8f\x27\x5e\xca" - "\x74\x8c\x27\x5e\x6a\xb4\xe6\x89\x03\xcc\x3c\xcb\xd1\x99\x58\x73" - "\xc2\x3c\x41\xf6\xd9\xb6\x01\x63\x76\x71\x6d\xc0\x98\xf9\xed\x9f" - "\x27\xc6\xb8\x09\xc7\xfb\x31\x9e\xcc\x1a\x87\xd4\x4b\x0d\x0f\x7d" - "\x8d\x43\x28\x53\x98\x25\xc6\x6c\x22\x31\xf7\xa5\x06\x73\x5b\xc3" - "\xb1\x04\x9c\x23\xc8\x12\x63\x8e\x59\x9f\x43\x58\xe2\x25\x03\x61" - "\x89\x31\x17\xc5\x59\xe2\xe5\x65\x24\xce\xbc\x3c\x86\xc4\x19\xe2" - "\x53\x5b\x96\x78\xb9\x47\xeb\x2c\x41\x34\xc4\xdc\xa7\x28\x4b\xbc" - "\x1c\x61\xcb\x12\xa3\xd3\x84\x59\x22\x68\x24\xa7\xa3\xb1\x97\xf8" - "\x2c\xf1\xf2\x81\xc7\x83\x25\x44\xb5\xe5\xc6\xe7\x88\xb1\xab\xa5" - "\x73\xc4\xd8\x43\xd2\x38\x02\x6b\x4e\x88\x23\xc6\x36\xb2\xfa\x31" - "\x08\x73\x44\x90\x97\x30\x47\x04\x0d\xe6\x73\x04\x2e\x5f\x88\x23" - "\x82\x66\xf2\xca\xb7\xe1\x88\xa0\x95\x7c\x8e\x20\xc7\x71\x1c\x31" - "\xce\x9b\xc4\xd0\xd1\xa3\xa5\x73\x44\x50\xa3\x38\x47\x8c\x53\xf0" - "\x39\x22\x88\x9d\x9b\x3e\x6e\x10\xe1\x88\xa0\x6a\xb2\x7d\xf4\x28" - "\xcb\xed\x1c\x47\x90\xed\x1c\x47\x8c\x1b\xf5\x64\xfe\x64\x7b\xec" - "\x4b\x1a\x7f\x51\x5e\x1b\x3e\x5e\xf4\xfb\xa7\x4f\xe6\x4f\xda\x7b" - "\x97\x3b\x2e\x94\x7b\x97\x1b\x3c\x55\x1e\xb7\x04\x87\xfe\xfc\xb6" - "\x7f\x1c\xc7\x10\xff\xae\x17\x67\xfb\x09\xa5\xf2\x6c\x3f\xa1\xe4" - "\xe7\xb7\xfd\xe3\x38\x86\x21\x38\x93\xb3\xfd\x44\x99\xfd\x7f\x13" - "\x83\xe5\xf7\x5f\xbf\xe6\xc6\xe5\xa1\xaf\xb9\x89\xf7\x5f\x4f\x7a" - "\xda\x7e\x1e\x1a\x1a\xca\xe5\xa1\x53\x8e\x10\x3e\x9c\x92\x4e\xf8" - "\x70\x0a\xb3\x96\xbf\xa1\x6f\x84\x2f\xe9\xbf\x2e\x12\xe8\xbf\x9e" - "\x5c\x8a\xd7\xbe\xe2\xd6\xc4\x9a\x34\xd3\x72\x4d\xac\x2f\xe0\x9c" - "\x27\xfd\xda\x8e\xf4\x6b\xbf\xa2\xe6\xfa\xb5\x27\xef\x92\xd7\xaf" - "\x3d\x39\x93\x9f\x87\xbe\x76\xd4\x36\x0f\x9d\x6c\x74\x3c\x0f\x9d" - "\xd2\x47\x9e\xae\xa7\x68\x1c\xcb\x43\xa7\xac\x17\xee\xd7\x9e\xa4" - "\xc1\x9a\x13\xce\x43\xc9\x3e\xdb\xfc\x21\xb4\x0f\x97\x3f\x84\xdc" - "\x6e\xff\x79\x68\x48\x8a\x70\xae\x10\xb2\x8b\xe4\xa1\x53\x12\x1f" - "\x7e\x1e\x3a\x25\x51\x38\x0f\x0d\x65\xdf\xff\x4e\xd9\x68\xdb\xa7" - "\x0d\xe7\x08\xe6\xa1\xa1\x63\xd8\x73\x12\xf9\x79\x28\x29\x03\xe2" - "\xca\x5c\xf1\x3c\x34\xb4\x91\xc4\x99\xd0\x33\x24\xce\x10\x9f\xda" - "\xe6\xa1\xa1\xfb\x5a\xcf\x43\x89\x86\x98\xfb\x14\xcd\x43\x43\x6f" - "\xda\xe6\xa1\x93\x7a\x09\xe7\xa1\xaf\x9e\xe4\x74\xf4\x6a\x04\x3f" - "\x0f\x9d\x3a\xf4\xf1\xc8\x43\x45\xb5\x95\xc2\xcf\x43\x5f\x55\x48" - "\xcf\x43\x5f\xf5\x97\x96\x87\x62\xcd\x09\xe5\xa1\xaf\xae\xb7\xd6" - "\x1c\x3f\x0f\x7d\x35\x5b\x38\x0f\x7d\xf5\x28\x3f\x0f\xc5\xe5\x0b" - "\xe5\xa1\xaf\x5e\xe5\x95\x6f\x93\x87\xbe\x6a\xe4\xe7\xa1\xe4\x38" - "\x2e\x0f\x7d\x8d\x6d\xcf\x26\x9e\x96\x9e\x87\xbe\xb6\x5e\x3c\x0f" - "\x7d\x6d\x2b\x3f\x0f\x7d\x6d\x0e\xc9\x37\x5f\x2b\x20\x79\xe8\x6b" - "\xd1\x64\xfb\xc4\x53\x96\xdb\xb9\x3c\x94\x6c\xe7\xf2\xd0\xd7\x4e" - "\x3d\x99\x4f\xd9\x1e\xf3\xd0\xe9\x73\xe5\xe5\xa1\xd3\xe7\xfc\xfc" - "\x3c\xfe\x38\xe6\x42\xaf\x55\x70\x3c\x3e\xe3\x92\x3c\x6e\x99\x51" - "\xf1\xf3\xdb\xfe\x71\xcc\x85\xa6\xe7\x72\xb6\x0f\x9b\x2e\xcf\xf6" - "\x61\xd3\xe4\xe7\x42\xe1\x6a\x2e\x17\x0a\x57\x8b\xe7\x42\x33\x07" - "\xda\xcf\x85\xe6\xce\xe1\x72\xa1\xd9\x27\x08\xa3\xcc\xde\x47\x18" - "\x65\x76\x44\xeb\xb9\xd0\xac\x4b\xfc\x5c\x68\xe6\xfc\x27\xb9\x90" - "\x9c\x5c\xe8\xf7\x1a\x2e\x17\x9a\xb5\x5f\x5e\x2e\x34\x2b\x97\x9f" - "\x0b\x85\x9f\xb4\xcd\x85\x66\x77\x74\x3c\x17\x9a\x3d\x58\x9e\xae" - "\x67\x0f\x72\x2c\x17\x9a\xbd\x5d\x38\x17\x9a\x39\x48\x3c\x17\x22" - "\xfb\x6c\x19\x76\xee\x60\x8e\x61\xe7\x34\xb6\xff\x5c\x68\x4e\x96" - "\x30\xaf\xce\xd9\x4f\x72\xa1\xd9\x49\x0f\x3f\x17\x9a\x9d\x24\x9c" - "\x0b\xcd\xed\x41\xb8\x71\x76\x8a\x6d\x2e\x04\xe7\x08\xe6\x42\x73" - "\x27\xb3\xe7\x24\xf1\x73\x21\x52\x06\xc4\x95\x85\xe2\xb9\xd0\xeb" - "\xae\x24\xce\xcc\xbd\x48\xe2\x0c\xf1\xa9\x6d\x2e\x34\xf7\x50\xeb" - "\xb9\x10\xd1\x10\x73\x9f\xa2\xb9\xd0\xdc\xfb\xb6\xb9\xd0\x4c\xad" - "\x70\x2e\x34\xcf\x62\xad\xa2\x79\x4b\xf8\xb9\xd0\xeb\xa3\x1f\x8f" - "\x5c\x48\x54\x5b\x59\xfc\x5c\x68\x5e\x17\xe9\xb9\xd0\xbc\x31\xd2" - "\x72\x21\xac\x39\xa1\x5c\x68\xde\x76\x6b\xcd\xf1\x73\xa1\x79\x07" - "\x84\x73\xa1\x79\x27\xf9\xb9\x10\x2e\x5f\x28\x17\x9a\x77\x9b\x57" - "\xbe\x4d\x2e\x14\xde\x91\x9f\x0b\x91\xe3\xb8\x5c\x28\xfc\x20\x89" - "\xa1\x61\xe7\xa5\xe7\x42\xe1\xdb\xc5\x73\xa1\xf0\x74\x7e\x2e\x14" - "\x1e\x45\x72\x9e\xf0\x22\x92\x0b\x85\xc7\x91\xed\x61\xe5\x96\xdb" - "\xb9\x5c\x88\x6c\xe7\x72\xa1\xf0\xf2\x27\xf3\x2b\xdb\x63\x2e\xf4" - "\xc6\x42\x79\xb9\xd0\x1b\x51\x4f\x78\x5c\x0e\x8f\x87\x57\x71\x3c" - "\xfe\xe6\x75\x79\xdc\xf2\x66\x95\x7c\x1e\x7f\x3b\x97\xe3\xf1\xb7" - "\x73\xc5\x79\x3c\xf2\x98\x7d\x1e\x8f\xaa\xe1\x78\xfc\xad\xc9\xa4" - "\x9d\x7c\x6b\x28\x69\x27\x17\xdc\x6d\x9d\xc7\x17\x2c\xe4\xf3\x78" - "\xe4\xfd\x27\x3c\x2e\x87\xc7\xdf\xc8\xe7\x78\x7c\x81\xbf\x3c\x1e" - "\x5f\xe0\xc7\xe7\xf1\xc5\x53\x6d\x79\x7c\xc1\x2e\xc7\x79\x7c\xc1" - "\x09\x79\xba\x5e\x70\xdc\x31\x1e\x7f\xeb\x69\x61\x1e\x8f\x3c\x2e" - "\xce\xe3\x64\x9f\x2d\x47\x45\x9d\xe0\x38\x2a\x6a\x6b\xfb\xe7\xf1" - "\xa8\x41\xc2\xcc\x14\xe5\x4f\x78\xfc\xad\x5e\x0f\x9f\xc7\xdf\xea" - "\x25\xcc\xe3\x51\x07\x08\xbb\xbc\xa5\xb1\xe5\x71\x38\x47\x90\xc7" - "\xa3\x2e\xb3\xe7\xf4\xe2\xf3\x38\x29\x03\xe2\x4a\xa3\x38\x8f\x2f" - "\x4c\x27\x71\x66\xe1\x7c\x12\x67\x88\x4f\x6d\x79\x7c\xe1\xe8\xd6" - "\x79\x9c\x68\x88\xb9\x4f\x51\x1e\x5f\xb8\xc9\x96\xc7\x23\x0b\x85" - "\x79\xfc\xed\xb9\x9c\x8e\x16\x19\xf9\x3c\xbe\xb0\xf4\xf1\xe0\x71" - "\x51\x6d\x0d\xe2\xf3\xf8\xa2\x6c\xe9\x3c\xbe\xe8\xbc\x34\x1e\xc7" - "\x9a\x13\xe2\xf1\xb7\x9f\xb6\xd6\x1c\x9f\xc7\xdf\x1e\x29\xcc\xe3" - "\x6f\x4f\xe5\xf3\x38\x2e\x5f\x88\xc7\xdf\x5e\xc7\x2b\xdf\x86\xc7" - "\xdf\xde\xc5\xe7\x71\x72\x1c\xc7\xe3\x8b\x47\xb1\xed\x59\x84\x74" - "\x1e\x5f\xfc\xb4\x38\x8f\x2f\xee\xcf\xe7\xf1\xb7\x1b\x08\x77\x2f" - "\x0e\x25\x3c\xbe\xd8\x9d\x6c\x8f\x0c\xb7\xdc\xce\xf1\x38\xd9\xce" - "\xf1\xf8\xe2\xf0\x27\xf3\x2d\xdb\x23\x8f\x2f\x69\x94\xc7\xe3\x4b" - "\x1a\xe4\x33\xe1\x4a\x8b\xf5\xbe\x57\xda\x59\xef\x7b\x69\xa9\x7d" - "\x26\x5c\x8e\x38\x26\x5c\x16\x41\x62\xf5\xb2\x71\x24\x56\x2f\x73" - "\x6d\x9d\x09\xa3\xd7\xf1\x99\xf0\x9d\x8e\x4f\x98\x50\x0e\x13\x2e" - "\x5e\xc1\x31\x61\xf4\x04\x79\x4c\x18\x1d\xcc\x67\xc2\x55\x02\xeb" - "\x80\x47\x1f\x72\x9c\x09\xa3\xcf\xcb\x63\xc2\xe8\x72\xc7\x98\x70" - "\xd9\x50\x61\x26\x5c\x5a\x2e\xce\x84\x64\x9f\x6d\x5b\x1e\x73\x9e" - "\x6b\xcb\x63\xb2\xdb\x3f\x13\xc6\x04\x0a\xb7\xdb\x31\x13\x08\x13" - "\x2e\xf3\x7d\xf8\x4c\xb8\xcc\x57\x98\x09\x63\x4e\x90\xf6\x73\x99" - "\x9f\x2d\x13\xc2\x39\x82\x4c\x18\x73\x97\x3d\xc7\x97\xcf\x84\xa4" - "\x0c\x88\x2b\x5d\xc4\x99\x70\xf9\x01\x12\x67\x96\xaf\x26\x71\x86" - "\xf8\xd4\x96\x09\x97\x4f\x6d\x9d\x09\x89\x86\x98\xfb\x14\x65\xc2" - "\xe5\xbb\x6c\x99\x70\x69\x89\x30\x13\xae\xb4\x58\x03\x7c\xa5\xd5" - "\x1a\xe0\xcb\xaf\x3e\x1e\x4c\x28\xaa\xad\x40\x3e\x13\xae\x90\xb1" - "\xfe\xf7\x0a\x89\xeb\x7f\x63\xcd\x09\x31\xe1\xca\xa1\xd6\x9a\xe3" - "\x33\xe1\x4a\x91\xf5\xbf\x57\x5a\xad\xff\x8d\xcb\x17\x62\xc2\x95" - "\xa9\xbc\xf2\x6d\x98\x70\xa5\xd5\xfa\xdf\xe4\x38\x8e\x09\x57\xb1" - "\xeb\x7f\x2f\x5d\x29\x9d\x09\x57\xd9\x59\xff\x7b\x95\xd5\xfa\xdf" - "\xab\xd8\xf5\xbf\x57\xb1\xeb\x7f\xaf\x62\xd7\xff\x5e\xba\xc2\x72" - "\x3b\xc7\x84\x64\x3b\xc7\x84\xab\x5a\x5d\xff\xdb\x3e\x47\xc4\x7b" - "\x73\x1c\x11\xef\x2d\x3e\xff\xf2\x5d\x2f\xfb\x1c\xb1\x36\x9c\xe3" - "\x88\xd5\xec\xf7\x66\x57\xb3\xdf\x9b\x5d\xcd\xf8\xac\x19\xea\x38" - "\x99\x7f\x99\x4f\x01\xd3\x71\xf3\x2f\x5f\xc7\x1c\x11\x7b\x79\x32" - "\x8f\x23\xde\x9d\xce\xcc\xc5\xc4\x2c\x51\xd7\x80\xf0\x3e\xe1\x79" - "\x99\xf9\x6d\x3b\x2f\xf3\xc1\xff\x85\x79\x99\xb1\x07\xe4\xf1\x6a" - "\x6c\x1e\x9f\x2f\xe2\x4f\xdb\xf2\xc5\xea\x2e\x8e\xf3\xc5\xea\xa1" - "\xf2\xf8\x62\xb5\xaf\x63\x7c\xb1\x3a\x55\x78\x5e\xe6\xbb\xde\xcd" - "\xa2\x7c\xf1\x2e\x33\xde\xc1\xb6\x5d\x58\x3b\x94\x6b\x17\xd6\x18" - "\xdb\x3f\x5f\xac\xc9\x11\x6e\x03\xd6\x1c\x20\x7c\xb1\x3a\xe5\xe1" - "\xf3\xc5\x6a\x91\xef\x5d\xae\x65\xf3\xff\xd5\x2d\xdf\xae\xe4\xf8" - "\x62\xb5\xc8\xf7\x2e\xd7\x4e\xb5\x3e\x87\xf0\xc5\xea\x34\xc2\x17" - "\x6b\x97\x88\xf3\x45\x5c\x47\x12\x7f\xd6\x5e\x22\xf1\xe7\x5d\xe1" - "\xef\xde\x53\x6b\x8f\xb4\xce\x17\xab\xd9\xef\x5d\xae\xb6\xf3\xbd" - "\xcb\xb5\x8d\xb6\x7c\xf1\xae\x5a\x98\x2f\xd6\x59\x70\xea\xba\x65" - "\x7c\xbe\x88\x1b\xf3\x78\xf0\x85\xa8\xb6\x72\xf8\x7c\xb1\xce\x53" - "\x3a\x5f\xac\x1b\x27\x8d\x2f\x56\x8b\x7c\xe3\x72\x1d\xdb\xfe\x13" - "\xbd\xd8\xf2\xc5\xba\x43\xc2\x7c\xb1\xee\x34\x9f\x2f\x56\x8b\x7c" - "\xe3\x72\xdd\x5d\x5e\xf9\x36\x7c\x11\xdf\x85\xcf\x17\xe4\x38\x8e" - "\x2f\xe2\xf3\xd9\x1c\xed\x84\x74\xbe\x88\x4f\x15\xe7\x8b\xf8\x5d" - "\x7c\xbe\x88\x5f\x4c\x38\x22\xfe\x14\xe1\x8b\xf8\x44\x96\x3b\x8e" - "\x5b\x6e\xe7\xf8\x82\x6c\xe7\xf8\x22\xfe\x82\x84\x3e\x27\x1f\x29" - "\xf3\x32\x0f\x3d\xe0\xf7\x39\x99\xfb\x9b\x0c\x83\x06\xa8\x5b\xfa" - "\x9c\xa0\xad\x17\xfb\x26\x36\xee\x73\xc2\x6d\x37\xd7\xe7\x74\x99" - "\x89\x55\x5c\x9f\x93\x8e\xe9\x73\xc2\xfd\x4d\x90\x9f\xb7\xf4\x37" - "\x99\xde\xb5\x9d\x93\x79\xc8\x24\xbd\xbf\xe9\xf5\x65\x2a\xb4\x87" - "\x69\xbf\xcf\x54\x92\xfe\xa6\x8a\x96\xfe\x26\xdc\x6e\x1b\xeb\x6d" - "\xfb\x9b\x70\x7b\xcd\xf5\x37\x7d\x27\xb3\xbf\x29\x51\xe6\xfb\xdf" - "\xc4\x76\xf0\xfe\xf7\x71\x9c\x93\x19\x5f\xcd\xbd\xff\x5d\x2f\xf3" - "\xfd\xef\x7a\xbb\xef\x7f\x9f\x8c\x43\x16\xb3\x7d\x62\x3e\x67\xfb" - "\xf7\x22\xe4\xd9\xfe\xbd\xf0\x9f\xdf\xf6\x8f\xe3\xb8\x87\x0d\x83" - "\x38\xdb\x6f\xbc\x2c\xcf\xf6\x1b\x2b\xe5\xf7\x71\x27\x1d\xe7\x72" - "\xd3\xa4\xe3\xe2\xb9\xe9\xa6\x23\xf6\x73\xd3\x6d\x2e\x5c\x6e\xba" - "\x65\x3e\x61\xc3\x2d\x13\x08\x1b\x6e\xe9\x68\xee\xe3\x26\xb9\x69" - "\x11\x85\xe3\x3b\xee\xbb\x4e\x82\x98\xfe\x01\xe4\x65\xdb\x21\x4f" - "\xfd\x20\x06\x72\xd5\x68\xe4\x56\x56\x75\x02\x45\xc7\xe3\x7c\xf5" - "\xfd\xf5\x21\xb1\x96\xf9\xea\x66\x85\x39\x57\x0d\x81\x73\xbf\x5c" - "\x5a\x44\xe1\x9c\xd4\xe8\x45\xfa\xb1\x53\xa0\x1c\x73\xff\x37\x6e" - "\xff\x3e\x5b\x0a\xb9\xe9\x22\x7e\x1f\x78\xf3\xa1\x01\xea\x66\xaf" - "\x19\x3e\xb8\x1f\xbc\x71\x7f\x3f\x64\xee\x0b\xb7\xd7\x07\x8e\xb5" - "\x65\xdd\x0f\xfe\xf8\xf6\x81\xbf\x97\xc7\xf5\x81\xbf\x3f\x59\x5e" - "\x1f\xf8\xfb\x93\xf8\x39\xea\xf6\x85\xb6\x39\xea\xfb\x47\x1c\xcf" - "\x51\xdf\xbf\x28\x4f\xf7\xef\x5f\x70\x2c\x47\xdd\xe2\x2f\x9c\xa3" - "\x6e\x2a\x10\xef\x03\x27\xfb\x6c\x73\x8b\xad\x17\xb9\xdc\x62\xeb" - "\xbe\xf6\x9f\xa3\x6e\x0d\x12\xce\x23\xb6\x4e\x26\x39\xea\x16\xbf" - "\x87\x9f\xa3\x6e\xf1\x13\xce\x51\xb7\x9e\x24\x3c\xbf\xc5\xcf\x36" - "\x47\x85\x73\x04\x73\xd4\xad\xf7\xad\xcf\x21\x39\xea\x96\x00\x92" - "\xa3\x6e\xf3\x14\xcf\x51\xb7\x1d\x22\x71\x68\xdb\x3a\x12\x87\x88" - "\x4f\x6d\x73\xd4\x6d\xd3\x5b\xcf\x51\x89\x86\x98\xfb\x14\xcd\x51" - "\xb7\x65\xdb\xe6\xa8\x9b\xf2\x85\x73\xd4\xa4\x95\x9c\x8e\x92\xbc" - "\xf8\x39\xea\xb6\xeb\x8f\x47\x8e\x2a\xaa\xad\x20\x7e\x8e\xfa\xc1" - "\x51\xe9\x39\xea\x07\x37\xa5\xe5\xa8\x58\x73\x42\x39\x6a\x12\xbb" - "\xfe\x39\xd1\x8b\x6d\x8e\x9a\x34\x55\x38\x47\x4d\x5a\xc8\xcf\x51" - "\x71\xf9\x42\x39\x6a\x52\x3a\xaf\x7c\x9b\x1c\x35\xe9\x08\x3f\x47" - "\x25\xc7\x71\x39\xea\x76\x36\x27\xdc\x34\x53\x7a\x8e\xba\xdd\x5f" - "\x3c\x47\xdd\x3e\x9a\x9f\xa3\x6e\x57\x91\x5c\x74\x7b\x14\xc9\x51" - "\xb7\xfb\x90\xed\x9b\xc2\x2c\xb7\x73\x39\x2a\xd9\xce\xe5\xa8\xdb" - "\x63\x25\xe4\xa8\xda\x87\x94\xa3\x7a\x3f\x5e\x39\xea\x3f\x53\xda" - "\x36\x47\xdd\x21\xf3\xfb\x97\x3b\x1c\xfd\xfe\xa5\x4f\x2b\xac\xae" - "\xfe\xff\x8b\xd5\xb7\x27\x71\xac\x9e\x22\xf3\xfb\x97\x29\x8e\x7e" - "\xff\xf2\x91\xd9\xfe\xf1\xb3\xfb\x0e\x8b\x6f\x5f\xee\x54\xc8\xb3" - "\xfb\x4e\xf4\x24\x3f\x95\x63\xfb\x94\x72\xce\xf6\x1f\xae\x93\x67" - "\xfb\x0f\xe3\xe4\xe7\xa7\xbb\xe3\xb8\xfc\x74\x77\x9c\x65\x7e\x5a" - "\xcc\x1b\x83\x95\x36\xd5\x7e\x7e\x9a\x79\x8a\xcb\x4f\x3f\x62\xd7" - "\xa7\xfe\xa8\x23\xe1\xc2\x0c\xe6\x5b\x14\x8d\x38\x3f\x1d\x03\xf9" - "\xe9\xad\x94\x96\xfc\x14\xe7\xa3\x93\x1b\xae\xd0\xf8\x5d\x2a\xe4" - "\xa7\x2e\x5b\xef\x20\x17\xc8\x59\x51\x59\xe5\x51\x94\x04\xf9\xea" - "\xb6\x3b\x90\xb3\x2e\x86\x9c\xd5\x90\xcd\xe6\xac\x19\x63\xf8\x39" - "\x6b\xda\x51\x5e\xce\xba\x28\x85\xc9\x59\x21\x0f\x55\x19\xd2\x67" - "\x68\x70\xce\x6a\x80\x7c\xb4\x79\xf0\x00\x75\xca\x1d\xab\xfc\x75" - "\x11\xe4\xaf\x0b\xf8\xf9\x6b\x53\xfa\x0c\x6d\xe3\xa1\x01\xde\xcc" - "\x38\xae\xfe\x8e\xe5\xaf\xd6\xb9\x6b\x16\x3b\x86\x6b\xf7\x63\x99" - "\xbf\xee\x0c\xe6\xf2\xd7\x8c\x2e\xf2\xf2\xd7\x0c\x77\x7e\xfe\x9a" - "\x35\xd0\x36\x7f\xcd\x58\xe6\x78\xfe\x9a\x91\x2e\xaf\x5e\x64\xa4" - "\x39\x96\xbf\x66\xdc\xb7\xce\x5f\xf3\x98\x31\x5c\x69\xd3\x1a\x45" - "\xf3\xd7\xb4\x50\xe1\x77\xac\x99\xe9\x5c\xde\x91\x19\xd1\xfe\xf3" - "\xd7\x4c\x17\xe1\x1c\x23\xb3\x0b\xc9\x5f\x33\xea\x1e\x7e\xfe\x9a" - "\x51\x27\x9c\xbf\x66\xb2\xeb\xbf\x64\xd4\xd9\xe6\xaf\x70\x8e\x60" - "\xfe\x9a\x79\xd4\xfa\x1c\x92\xbf\x66\x34\x90\xfc\x35\xf3\xbc\x78" - "\xfe\xba\x6b\x09\x89\x53\xbb\x46\x93\x38\x45\x7c\x6a\x9b\xbf\xee" - "\xf2\x6a\x3d\x7f\x25\x1a\x62\xee\x53\x34\x7f\xdd\x35\xd7\x36\x7f" - "\x4d\x0b\x15\xce\x5f\x77\xfb\x73\x3a\xfa\xf8\x22\x3f\x7f\xdd\xb5" - "\xff\xf1\xc8\x5f\x45\xb5\xe5\xc2\xcf\x5f\x3f\x5e\x29\x3d\x7f\xfd" - "\xf8\x80\xb4\xfc\x15\x6b\x4e\x28\x7f\xfd\x98\xed\xff\x20\x7a\xb1" - "\xcd\x5f\x77\x7b\x0a\xe7\xaf\xbb\x07\xf2\xf3\x57\x5c\xbe\x50\xfe" - "\xba\x7b\x3a\xaf\x7c\x9b\xfc\x75\xf7\x32\x7e\xfe\x4a\x8e\xe3\xf2" - "\xd7\x2c\x35\x89\xa1\x1f\x36\x4a\xcf\x5f\x77\xdf\x17\xcf\x5f\x77" - "\x1b\xf9\xf9\xeb\x6e\x76\x3e\x6d\x96\x96\xe4\xaf\xbb\xab\xc8\xf6" - "\x0f\x1b\x2c\xb7\x73\xf9\x2b\xd9\xce\xe5\xaf\x59\x01\xd2\xde\xb1" - "\x3a\xb5\xe6\x90\xba\xed\xc7\xf5\x3f\xac\x35\x87\xcc\xef\x59\xdb" - "\x6a\x5c\x7f\xf6\x79\x79\x39\x6c\x76\xf9\x93\x3c\x4a\x2a\xcb\x67" - "\x4d\xe2\x58\x7e\xaf\xcc\xf5\x3f\xf7\xda\x5d\xff\xf3\x49\x1e\x25" - "\x66\xfb\x3d\xde\x9c\xed\x73\x4e\xcb\xb3\x7d\xce\x29\xf9\x79\x54" - "\x9e\xc5\xfc\xe6\x3c\xde\xfc\x66\xfe\x7b\xbe\x7d\xbb\xec\xe7\x51" - "\xfb\x2d\xe6\x37\xe7\xb2\xf3\x9b\x73\xd9\xf9\xcd\x9f\xb4\xcc\x6f" - "\x96\xf6\x9e\xef\x93\x85\xfc\x9c\x69\xdf\xcd\x27\xef\xf9\x9c\xcd" - "\x93\xf6\xa6\x70\x79\xd2\x27\x32\xe7\x3f\x7f\x62\x35\xff\xf9\x80" - "\xc0\xfc\xe7\x4f\x24\xcc\x7f\xfe\x44\xe6\xfc\xe7\x4f\x1c\x9c\xff" - "\x9c\x6b\x33\xff\x99\xbc\xe7\xdb\x97\x25\xfe\x9e\x8f\xec\xb3\xe5" - "\xdb\xfd\x16\xf3\x9f\xf7\x3f\x06\xf3\x9f\xf7\x8b\xcc\x51\xdd\xcf" - "\xce\x7f\xce\x7d\x04\xf3\x9f\x73\x45\xe6\x3f\xef\x67\xe7\x3f\xe7" - "\xf6\xb2\xcd\x93\x72\x45\xe6\x3f\xef\xbf\x6c\x7d\x0e\xc9\x93\x72" - "\xd9\xf9\xcf\xfb\xed\xcc\x7f\xfe\x94\x9d\xff\xfc\x29\x3b\xff\x99" - "\xf8\xd4\x36\x4f\xfa\xd4\x81\xf9\xcf\xb9\xec\xfc\xe7\x5c\x3b\xf3" - "\x9f\x3f\x15\x98\xff\xbc\x2f\x53\x38\x4f\xca\xb3\x98\xff\xfc\x3f" - "\x56\xf3\x9f\x3f\x7d\x4c\xe6\x3f\x8b\x6a\xcb\x6a\xfe\xf3\xff\xc8" - "\x98\xff\xfc\x3f\x12\xe7\x3f\xe7\x8a\xcc\x7f\xce\x63\xc7\x3f\xe7" - "\x8a\xcc\x7f\xce\x13\x99\xff\x9c\x67\x35\xff\x39\x57\x64\xfe\x73" - "\xde\x3a\x5e\xf9\x36\x79\x52\x9e\xd5\xfc\xe7\x5c\xab\xf9\xcf\x07" - "\xd8\xf9\xcf\xfb\xc6\x48\xcf\x93\x0e\xd8\x99\xff\x7c\xc0\x6a\xfe" - "\x73\x1e\x9b\x0f\x1d\x60\xe7\x3f\x1f\x60\xe7\x3f\xef\x0b\xb4\xdc" - "\xce\xe5\x49\x64\x3b\x97\x27\x1d\x90\x32\xff\xd9\x47\xca\x7a\x44" - "\x3f\xff\x58\x54\xcd\x63\x3a\x16\xf5\x8f\xf7\xe5\xe5\x48\x7f\xac" - "\x7b\xc2\xea\x72\x58\xfd\xc0\x0a\x8e\xd5\x0f\x2e\x93\xc7\x2c\x07" - "\xa3\xe5\xb3\x7a\x41\x28\xc7\xea\x05\xa1\xe2\xac\x7e\x68\x9c\x7d" - "\x56\x3f\x92\xc9\xb1\xfa\x61\x76\xfd\xf2\xc3\x97\x49\x1b\x79\x38" - "\x5b\x1e\xab\x1f\xf6\xe2\xb3\xfa\xa1\xf4\x27\xac\xee\x2c\xab\xff" - "\x69\x14\xc7\xea\x9f\x5d\x95\xc7\xea\x9f\xe9\xf8\xac\x5e\x60\xb4" - "\x65\xf5\xc3\xe3\x1c\x67\xf5\xc3\x0b\xe5\xe9\xfe\x70\x94\x63\xac" - "\x7e\xf8\x8c\x30\xab\x1f\x0a\x16\x67\x75\xb2\xcf\x96\xb1\x8e\x2c" - "\xe4\x18\xeb\x88\x7f\xfb\x67\xf5\xfc\x0a\x61\x9e\xca\xbf\x4a\x58" - "\xfd\x70\xf1\xc3\x67\xf5\xc3\xc5\xc2\xac\x7e\x84\xed\xff\x3d\x5c" - "\x6c\xcb\xea\x70\x8e\x20\xab\x1f\xd9\x6a\x7d\x0e\x61\xf5\xc3\x25" - "\x84\xd5\x8f\xec\x17\x67\xf5\xcf\xc7\x90\x38\xf4\xb9\x27\x89\x43" - "\xc4\xa7\xb6\xac\x7e\xe4\x66\xeb\xac\x4e\x34\xc4\xdc\xa7\x28\xab" - "\x7f\x3e\xd4\x96\xd5\x0f\x05\x09\xb3\x7a\x41\x47\x4e\x47\x7f\x3e" - "\xc0\x67\xf5\xcf\x57\x3f\x1e\xac\x2e\xaa\xad\x0a\x3e\xab\xff\x79" - "\x82\x74\x56\xff\xf3\x3a\x69\xac\x8e\x35\x27\xc4\xea\x7f\x3e\xc3" - "\xea\xa7\x44\x98\xd5\xff\x7c\x5d\x98\xd5\xff\x6c\xe4\xb3\x3a\x2e" - "\x5f\x88\xd5\x0b\x06\xf2\xca\xb7\x61\xf5\x82\x71\x7c\x56\x27\xc7" - "\x71\xac\x5e\x50\x4d\x62\xe8\xc1\xdb\xd2\x59\xbd\xe0\x8c\x38\xab" - "\x17\x9c\xe7\xb3\x7a\x41\x2e\x61\xf2\x02\x03\x61\xf5\x82\x42\xb2" - "\xfd\x60\x8d\xe5\x76\x8e\xd5\xc9\x76\x8e\xd5\x8f\xba\x3f\x59\xab" - "\xa8\x3d\xae\x55\xf4\x97\xfd\xf2\x78\xfd\x2f\xb9\xf2\x99\xf1\x8b" - "\x48\x8e\x19\xbf\x88\xb4\x64\x46\xfe\x5a\x45\x7f\x5d\x6d\x9f\x19" - "\xff\x7e\x90\x63\xc6\xbf\x75\x21\xb1\xfa\xd8\x5d\x12\xab\x8f\x1d" - "\x31\x33\xa3\xf8\x5a\x45\xc7\x06\xf2\xd7\x2a\xfa\xeb\xd1\x27\x6b" - "\x15\xc9\x61\xc2\xa3\x16\xeb\xc9\x17\xde\x97\xc7\x84\x85\x75\x7c" - "\x26\xfc\xd2\xd3\x96\x09\x8f\xcd\x74\x9c\x09\x8f\xc9\x1c\xff\x75" - "\x2c\xce\x31\x26\x3c\x76\x59\x78\xad\xa2\xbf\xc6\x89\x33\x21\xd9" - "\x67\xdb\x96\xff\x7d\x1d\xd7\x96\xff\x7d\x42\xfb\x67\xc2\xbf\xd5" - "\x08\xb7\xdb\x7f\xbb\x4f\x98\xf0\x58\xe5\xc3\x67\xc2\x63\x95\xc2" - "\x4c\xf8\xf7\x85\xa4\xfd\x3c\xa6\xb3\x5d\xab\x08\xce\x11\x64\xc2" - "\xbf\x67\xb3\xe7\x54\xf2\x99\x90\x94\x01\x71\xe5\x98\x38\x13\x1e" - "\x9f\x4e\xe2\xcc\xf1\xfe\x24\xce\x10\x9f\xda\x32\xe1\xdf\x8d\xad" - "\x33\x21\xd1\x10\x73\x9f\xa2\x4c\x78\x7c\x9c\x2d\x13\xfe\x35\x56" - "\x98\x09\xbf\x78\x9a\xd3\xd1\x89\x13\x7c\x26\x3c\xbe\xfd\xf1\x60" - "\x42\x51\x6d\xd5\xf0\x99\xf0\xc4\x5c\xe9\x4c\x78\x22\x55\x1a\x13" - "\x62\xcd\x09\x31\xe1\x89\xcb\xd6\x9a\xe3\x33\xe1\x89\x46\x61\x26" - "\xfc\xc2\x93\xcf\x84\xb8\x7c\x21\x26\xfc\x62\x34\xaf\x7c\x1b\x26" - "\xfc\x62\x26\x9f\x09\xc9\x71\x1c\x13\x7e\x61\x60\xdb\xb3\x3e\xd2" - "\x99\xf0\x8b\xcb\xe2\x4c\xf8\xc5\x75\x3e\x13\x7e\x51\x48\xd8\xef" - "\x4b\x15\x61\xc2\x2f\x4a\xc8\xf6\xbf\x6a\x2c\xb7\x73\x4c\x48\xb6" - "\x73\x4c\xf8\xa5\x46\xda\x3c\x8d\x87\xd2\x7f\xdb\x46\xf3\x34\x1e" - "\x56\xff\x6d\x5b\xcf\xd3\x28\x3a\x2a\x8f\x07\x8b\x0a\x9e\x8c\x71" - "\x91\xda\x77\xfb\xa5\x1f\xd7\x77\xfb\x0f\x99\xdf\xbf\xf9\xc7\x20" - "\xf9\x1c\x7e\xd6\x87\xe3\xf0\xb3\x3e\xe2\xe3\xd5\xbf\x52\xd8\xe7" - "\xf0\xaf\x17\x73\x1c\x7e\xba\x94\xb4\x8f\xa7\x8f\x90\xf6\xf1\xf4" - "\xb2\x56\xc7\xab\xaf\x42\x2e\x49\xec\x78\xf5\x0f\xf0\x78\xf5\x8a" - "\xd3\x28\xe9\x9e\xd0\x78\xf5\x53\x37\xf9\xfd\xb9\x5f\xcd\x17\x1a" - "\xaf\xce\x8c\x53\x4f\x9f\xe1\x63\x10\x1b\xa7\xfe\xfa\xc3\x1d\xa7" - "\xbe\x1b\xd8\xdd\xdc\xa7\x8b\x63\xc3\xe3\xc7\xef\x45\x06\x8e\xdf" - "\x4f\x1d\x95\xc7\xef\xa7\x0a\xf8\xfc\x7e\xf6\xbc\x2d\xbf\x9f\xee" - "\xe1\x38\xbf\x9f\x1e\x2d\xaf\x3e\x9c\x1e\xe5\x18\xbf\x9f\xce\x16" - "\x1e\xa7\xfe\x95\x8b\xf8\x38\xf5\xaf\x90\xf0\x38\xf5\xaf\x47\x73" - "\xdc\xf5\x75\xc7\xf6\xcf\xef\xff\x7b\x50\x98\xb1\xfe\xf7\x28\xe1" - "\xf7\xd3\x59\x0f\x9f\xdf\x4f\x67\x09\xf3\xfb\xd7\x6c\xff\xd7\xe9" - "\x2c\xdb\x3e\x5d\x38\x47\x90\xdf\xbf\x9e\x6b\x7d\x0e\xe1\xf7\xd3" - "\x39\x84\xdf\xbf\x5e\x2d\xce\xef\xc5\x5e\x24\x3e\x7d\x7d\x9d\xc4" - "\x27\xe2\x53\x5b\x7e\xff\xfa\x44\xeb\xfc\x4e\x34\xc4\xdc\xa7\x28" - "\xbf\x17\xbb\xda\xf2\xfb\x57\x48\x98\xdf\xcf\x5c\xe6\x74\x74\x66" - "\x1d\x9f\xdf\x8b\x27\x3f\x1e\xfc\x2e\xaa\xad\x83\x7c\x7e\x3f\xf3" - "\xb4\x74\x7e\x3f\x33\x55\x1a\xbf\x63\xcd\x09\xf1\xfb\x19\x36\xff" - "\x23\x7a\xb1\xe5\xf7\x33\xc7\x84\xf9\xfd\xcc\x79\x3e\xbf\xe3\xf2" - "\x85\xf8\xfd\x8c\x91\x57\xbe\x0d\xbf\x9f\xed\xc1\xe7\x77\x72\x1c" - "\xc7\xef\x67\x8f\x93\x18\xfa\x8f\x03\xd2\xf9\xfd\x6c\xb6\x38\xbf" - "\x9f\xdd\xcf\xe7\xf7\xb3\xb1\x84\xd3\xcf\x96\x13\x7e\x3f\x9b\x44" - "\xb6\xff\x23\xcf\x72\x3b\xc7\xef\x64\x3b\xc7\xef\x67\x75\xd2\xc6" - "\x5f\x38\xde\xa7\xfb\xf3\x8f\xbf\x50\x3d\xa6\xe3\x2f\x4a\x56\xca" - "\xe3\xf7\x92\x15\xf2\x39\xf2\xc2\x24\x8e\x23\x2f\x4c\x12\x1f\x03" - "\x50\x3a\xc1\x3e\x47\x9e\x4f\xe3\x38\xb2\xec\x3e\x89\xd3\x65\xec" - "\x9a\x8d\x65\xbb\xc4\xc6\x00\xe0\xf9\x8e\xdb\x63\xc8\x5c\xc7\x96" - "\x31\x00\x95\x17\x59\x66\x2c\xf3\xe4\x33\x63\xe9\x2e\xa1\x31\x00" - "\x82\xef\xfe\xad\xe6\x33\x1a\x07\x4b\x7f\xf7\xff\x7f\x6b\x3e\xe3" - "\xd9\x3a\x8e\x13\xcf\x5d\x96\xc7\x89\xe7\x2a\xf9\x9c\x78\xa1\xd1" - "\x96\x13\xcb\xc6\x38\xce\x89\x65\xf3\xe5\x71\x62\x59\xa4\x63\x9c" - "\x58\x76\x5a\xf8\xdd\x7f\xe9\x24\xf1\x7e\x5e\xb2\xcf\xb6\x7d\x3f" - "\x3f\x9f\x6b\xdf\xcf\x0f\x6d\xff\x9c\x58\x7e\x41\xb8\x2d\x2f\xbf" - "\x4c\x38\xb1\xec\xd4\xc3\xe7\xc4\xb2\x53\xc2\x9c\x78\x9e\x5d\xff" - "\xb5\xec\x94\x2d\x27\xc2\x39\x82\x9c\x78\x7e\x93\xf5\x39\x84\x13" - "\xcb\x8a\x09\x27\x9e\xdf\x27\xce\x89\xdf\x8c\x26\xf1\xe7\x9b\x2e" - "\x24\xfe\x10\x9f\xda\x72\xe2\xf9\xeb\xad\x73\x22\xd1\x10\x73\x9f" - "\xa2\x9c\xf8\xcd\x60\x5b\x4e\x2c\x0d\x16\xe6\xc4\x0b\xae\x9c\x8e" - "\xfe\xb5\x9f\xcf\x89\xdf\xac\x7c\x3c\x38\x51\x54\x5b\x17\xf8\x9c" - "\xf8\xaf\x71\xd2\x39\xf1\x5f\xab\xa5\x71\x22\xd6\x9c\x10\x27\xfe" - "\xeb\x34\xab\x9f\x62\x61\x4e\xfc\xd7\x55\x61\x4e\xfc\x57\x23\x9f" - "\x13\x71\xf9\x42\x9c\x78\xa1\x3f\xaf\x7c\x1b\x4e\xbc\x30\x86\xcf" - "\x89\xe4\x38\x8e\x13\x2f\x54\x91\x18\x5a\x72\x57\x3a\x27\x5e\x38" - "\x2d\xce\x89\x17\x4a\xf9\x9c\x78\x21\x87\xf0\xe0\x85\x06\xc2\x89" - "\x17\x0a\xc8\xf6\x12\xbd\xe5\x76\x8e\x13\xc9\x76\x8e\x13\x2f\xba" - "\xd9\xe3\x44\x3a\xa5\xd9\x2d\x85\x32\xe5\xc3\xaf\x10\xee\xb3\x07" - "\xb4\x63\x45\xf0\x77\x31\xb4\x47\x9e\xf0\xb7\xe8\xdc\x39\xbd\x67" - "\xb3\x9b\x09\x18\xc3\x04\xd7\x29\xd3\xff\x54\x54\xd4\xd3\x00\xd7" - "\xbe\xb8\x85\xf0\x47\xb3\x9b\x87\xe1\xa9\x60\x13\x1d\x05\x6d\x38" - "\xfc\x1d\x0b\xdb\xe0\xf8\xae\xd0\xee\x69\x56\xa1\xae\x77\xa8\x8b" - "\x79\xe6\xe3\xe0\x9e\xbb\x5e\xa3\x2e\xce\xc7\x65\xc0\xbd\x16\xe8" - "\xa8\x8b\x6a\xd1\x7b\x85\xb2\x42\x0e\xf4\x46\xeb\x0c\xf4\x8f\x45" - "\x4b\xef\xa1\x2a\xea\xa2\xd1\xa3\xe6\xa9\x60\x88\x43\x08\x73\x5d" - "\x7e\x4f\xbd\x0b\x2e\xb3\x68\x69\x13\xde\xa7\xc3\xfb\x8c\x70\x8f" - "\xf1\x4b\x10\x95\x7c\xef\x29\x37\xe0\x27\xd7\x84\x3a\xba\xfa\x1d" - "\x03\xdc\x73\xac\x01\x7d\xd9\xbb\xc2\xe5\xf0\xc7\x15\x4c\xdb\x73" - "\xae\xce\xc8\x94\xa1\x59\x8a\xef\xe7\x5b\xc5\x1e\x38\x5e\xe8\x1e" - "\x36\x7d\x86\x06\xb9\x0e\xa4\x75\xd2\xda\xbb\x6f\x45\xbf\xff\xee" - "\xb1\xbe\x37\x2a\xfa\x35\xd8\x4e\x83\x28\xa1\xfd\x12\xaf\x73\xdc" - "\x0e\x47\xba\x7d\xd8\x9d\xae\x4b\xd8\x85\xa8\x1d\xa6\xa7\xdc\xbe" - "\x82\x98\xb8\x37\x83\xd6\xd7\x6f\xfb\xb7\x56\xa7\x28\x1d\x85\x6d" - "\xfe\x1e\xec\xdf\xd1\x9d\xd6\xd7\x6e\xc0\xba\xf9\x77\xe0\x49\x68" - "\xdb\xad\x7d\x11\x13\xb9\x24\x42\xb3\x62\xe1\x92\xf9\xef\xac\x5c" - "\xa1\xe9\x1f\xd9\x09\x4d\x7b\xe7\x1d\xcd\x92\x88\xa5\xab\x35\x96" - "\x7b\x7e\xa3\x89\x5c\xb8\x3c\xe2\x8d\xc5\xf3\x07\x2f\x79\x33\xba" - "\x13\x4e\xf2\x2d\xee\x43\x8d\xef\xc5\xb4\xed\xdf\x93\xf6\xec\x44" - "\xe8\xc3\x6e\xc8\x05\xdf\x17\x5c\x2f\x5f\xe7\xe2\x9d\x85\xaf\x97" - "\x9c\x41\xd7\x51\x70\x4c\x02\xc4\xb4\x1d\xf1\x4f\xc1\xb1\xdf\x1e" - "\xdf\x0b\xf7\xb5\x07\xee\x1b\xee\x11\xdf\x73\xa5\xf9\x9e\xcd\x9a" - "\x48\xc0\x9a\x88\xbf\x07\x1a\xfc\xb7\xd1\xa3\xe1\xa9\xdf\xd1\x74" - "\x18\x7e\xbe\x3a\xa8\x2b\x8a\x1b\x54\x45\x3a\xc3\xfa\xa9\xcd\x6e" - "\xf5\xdb\x2a\xbc\xcd\x1a\x33\xa5\x8d\xcd\xa1\x77\x36\x95\x03\x3b" - "\x2a\xea\xe9\xa8\xdf\x82\x36\xe1\xfc\x8a\xf9\x43\x10\x4a\xa4\xeb" - "\xc3\x98\x35\xfd\xe9\x7a\xd0\x30\xd1\x29\xec\xbb\x14\x50\x4b\xa1" - "\x97\xa0\x8c\x39\x3a\xf4\x41\x12\x2e\x43\x07\xdb\xb0\xcd\x4d\x39" - "\x11\x9a\xe9\x5a\x94\xf8\x6c\x22\x4a\xac\xc7\xe7\xe4\xf6\x6d\xf0" - "\x58\x81\x14\x21\xb1\xf4\x15\x88\x3b\x0a\xba\x4f\x84\x86\xde\xdf" - "\xb7\x41\x47\x55\x04\x9a\xd2\xc7\xe6\xc0\xf3\xd4\x40\x39\xb9\x3a" - "\xc5\x53\x29\xb8\x9c\x1d\x19\x8c\xed\x6b\xf0\xb3\x83\x7d\x20\x67" - "\xa1\x81\x49\xd9\x3a\x94\xf2\xab\x62\x53\xca\xe2\xcc\x32\x97\x07" - "\x28\xc4\x40\x37\xd3\xa9\xbf\x2a\x3e\x57\x57\x07\x31\x2d\xfa\x4d" - "\xba\xd3\xbf\xe7\x7a\x18\x16\xce\xdf\xdb\x0d\xea\x62\xea\x62\xe0" - "\x35\xff\x2d\xd3\x07\x22\x55\xfd\xb6\x4b\xc8\x6c\x4f\xb0\xa5\x8b" - "\x34\x1d\x5d\x72\xc1\xcf\x84\xf5\x00\xf7\xc3\xea\xe1\x52\xe8\xc9" - "\x15\xb6\x7a\x68\xa9\x9b\x19\xc3\x55\x06\x3a\xec\x77\xcd\x69\xc3" - "\x83\x69\xf5\x70\xbf\xf8\xeb\xa8\x03\xb6\xed\x39\x60\xfd\xe4\x55" - "\xc8\x7b\xfb\xeb\x48\x33\x6f\xb5\x0a\xe9\xd3\x87\xfb\x7a\xac\x4f" - "\x54\x80\x4d\x28\x88\x2f\xbe\x10\x33\x7d\x9b\xbb\x8f\xcd\x89\x9b" - "\x8f\xa8\x43\xd7\xf2\x29\xcc\xc9\x78\x8c\xc7\x0d\xea\x3b\xcf\x3d" - "\x70\x1e\xfd\x53\x18\xc2\xfe\x60\x7c\xf1\x53\x14\x9a\xbc\x10\xda" - "\xe7\x45\xcc\xfe\x71\xd9\x50\xa6\xc4\xe7\x62\xf8\xd7\x08\xbe\x1a" - "\x02\x7e\x2a\xab\x32\x32\x65\x32\xbe\x5a\xcc\xf9\xea\x04\xdc\x07" - "\xe7\xaf\x4b\x25\xd8\xaf\x22\xcf\x9c\xc2\x3e\x73\x31\x3c\x73\x81" - "\x9d\x67\xce\x27\xcf\xec\x7a\xcf\xfe\x33\x7f\xef\x6a\xff\x99\xbf" - "\x1f\x29\xfd\x99\xbf\x2b\x97\xfe\xcc\xdf\x15\x89\x3f\xb3\x1f\xeb" - "\x67\x3f\xf0\xb3\x9f\x1d\x3f\xfb\xb1\x7e\xee\x7c\xad\x95\x67\x6e" - "\xb4\xff\xcc\x95\x83\xa5\x3f\xf3\xf7\xa7\xa4\x3f\xf3\xf7\x05\x76" - "\x9e\x99\xf5\xb3\x1f\xf8\xd9\xcf\x8e\x9f\xfd\x58\x3f\x7b\x7e\x63" - "\xff\x99\x2b\x6f\xdb\x7f\xe6\xcb\x7d\xa4\x3f\x73\x65\xa1\xf4\x67" - "\xae\xcc\x13\x7f\x66\x7f\xd6\xcf\xfe\xe0\x67\x7f\x3b\x7e\xf6\x67" - "\xfd\x3c\x62\x9b\xfd\x67\xbe\x7c\xd5\xfe\x33\xff\xc7\x4b\xfa\x33" - "\x5f\x3e\x28\xfd\x99\x2f\x67\xd9\x79\x66\xd6\xcf\xfe\xe0\x67\x7f" - "\x3b\x7e\xf6\x67\xfd\x3c\xfb\x65\xfb\xcf\xfc\x9f\x8b\xf6\x9f\xf9" - "\x4a\x47\xe9\xcf\xfc\x9f\x1c\xe9\xcf\xfc\x9f\x14\xb1\x67\x6e\x82" - "\xb8\xed\x0e\xcf\xd2\xfc\xef\xb0\xdf\x19\xd5\xc3\x47\xb9\x57\x21" - "\x2a\x6b\x83\x29\xca\xa3\x1a\x75\x84\x67\x8b\xa2\x33\xc6\x47\xe3" - "\x7f\x4d\xea\xe1\x01\x4d\xea\xe1\xc1\x8d\xdd\x9a\xca\xd7\xce\x45" - "\x1d\x30\x8f\x6f\x35\x21\x6f\x53\xda\x70\xbf\xa4\x57\x91\x26\x41" - "\x8f\x54\xe7\xe2\x75\x28\x3e\x9a\xd6\x9f\x43\x57\x51\x97\x6a\x9c" - "\x7b\x7e\x87\x4a\x6a\x8a\xd1\xd2\x18\x9a\xbe\x41\xe9\xa6\xe3\xf7" - "\xb9\xc0\xc9\x89\x29\xdf\x22\x0d\x5c\xc3\x77\x0f\xfc\x70\x39\x1e" - "\x93\xa0\xfd\xcc\x18\x1f\xb3\x37\x1e\x79\x7f\xb1\xa8\x1a\xe1\xed" - "\xd9\xf0\x33\x66\x8c\xcd\x89\x9f\x8b\xa8\xcf\xee\x55\x50\xa4\x6d" - "\xd6\xf5\xb1\x6e\x9b\x27\x45\x80\x2d\xdf\x60\xf6\x2d\xc9\x7a\x55" - "\xaa\x2d\xaf\xd4\x98\xdb\x6e\xc6\x96\x95\x46\xd2\xde\x5b\xb5\xdd" - "\x5f\xc0\xf5\x39\x5b\x5e\xa9\xc4\xb6\xa4\xd3\x86\x87\x96\x55\x37" - "\xe1\xbc\x49\x75\x23\x16\x51\xb0\x3d\xe9\x5c\xf4\x3d\x24\x62\xe3" - "\x14\x0b\x1b\x1f\x77\xaf\x72\xbd\x27\x62\xe3\x42\xb0\x71\xb1\x80" - "\x8d\x0b\x1c\xb3\xf1\xd5\x63\xce\xdb\xf8\xea\x26\x71\x1b\x5f\x3d" - "\x2f\xdd\xc6\x57\x43\xa5\xdb\xf8\x6a\x20\x6b\xe3\x72\xbe\x8d\x75" - "\x7a\x71\x1b\xfb\x59\xe8\xd8\x0f\x74\xdc\xf9\x9a\xb0\x8d\xfd\x40" - "\xc7\x7e\x02\x3a\xf6\x73\x50\xc7\x3f\x3c\xed\xbc\x8d\xaf\xdd\x14" - "\xb7\xf1\x0f\xfe\xd2\x6d\x7c\xad\x40\xba\x8d\xaf\xe5\x12\x1b\xfb" - "\x59\xe9\xf8\xda\x34\x3b\x36\xb6\xd0\xb1\x1f\xe8\xd8\xf3\x1b\x11" - "\x1b\x83\x8e\xfd\x04\x74\xec\xe7\xa0\x8e\xab\xd6\x3b\x6f\xe3\xaa" - "\xc9\xe2\x36\xae\xda\x25\xdd\xc6\x55\xde\xd2\x6d\x5c\xe5\xc6\xda" - "\xd8\x4a\xc7\x3f\x14\x8a\xdb\xd8\xdf\x42\xc7\xfe\xa0\xe3\x11\xdb" - "\x84\x6d\xec\x0f\x3a\xf6\x17\xd0\xb1\xbf\x83\x3a\xbe\x7e\xdd\x79" - "\x1b\x5f\x3f\x22\x6e\xe3\xeb\x46\xe9\x36\xbe\x1e\x27\xdd\xc6\xd7" - "\x17\x13\x1b\xfb\x5b\xe9\xf8\x7a\x2f\x3b\x36\xb6\xd0\xb1\x3f\xe8" - "\x78\xf6\xcb\x22\x36\x06\x1d\xfb\x0b\xe8\xd8\xdf\x41\x1d\xff\x38" - "\xc1\x79\x1b\xff\xe8\x25\x6e\xe3\x1f\x23\xa4\xdb\xf8\x86\x4e\xba" - "\x8d\x6f\x94\xb3\x36\xb6\xd2\xf1\x8d\x44\x31\x1b\x37\x43\x0e\xd8" - "\x05\x6c\xdc\xa5\x06\x51\xd9\xd8\xb6\x15\xc4\xb6\xc6\xee\xe3\xa3" - "\xb3\x29\x53\x14\xb6\x09\xd3\x07\xf4\x5f\xef\xae\xc6\xb4\xe1\xa3" - "\x68\x0a\x9e\x29\x1e\xf7\xbb\xfe\x78\xc6\xb0\x01\x75\xd5\xc4\xe3" - "\xfe\xdf\x9b\xcc\xfc\x30\x4d\xfc\xe6\xcb\x70\x3d\x25\xee\xf7\x32" - "\xa4\x36\xe6\x1b\xbd\x5e\x48\x84\x7d\x0a\xba\x7f\x7f\x15\xe4\x5e" - "\xa1\xf4\xdb\xde\xea\xb2\x9a\x7c\xb0\xcf\x59\x74\xae\xe2\x6f\xc8" - "\xd4\x7d\x7c\xcc\x10\x03\xd2\xd2\xff\xd5\xaa\x4b\x56\xe8\x90\xf1" - "\x4d\x6f\xf7\xb2\xd8\x62\x54\x16\xfb\x39\x0a\xa9\xa6\x1f\xd0\x3f" - "\x68\xdd\x9b\xbd\x26\x15\x1a\xbd\xc6\x87\x1a\xd3\x67\x04\x18\xbc" - "\x26\xe5\x1d\x5a\xa5\xa3\xdc\x1b\x90\x76\x71\x15\x4d\x27\xbf\x81" - "\x5c\x92\xaf\x21\xb7\x1d\x6f\x20\xf7\x1d\xd7\x90\xaa\xa4\xaa\x02" - "\x95\xde\x2a\x46\xa5\xf7\x2e\xa1\xd2\x07\xf0\x6b\x82\x9f\x09\x7e" - "\x89\x97\xc0\xd7\x08\x4d\xbe\x8d\x50\x42\x15\xad\x7f\xae\x12\xa9" - "\x4b\x0c\x15\x08\x8f\x71\xba\x43\x55\x67\xbb\x87\x23\x35\xfd\x83" - "\x37\xa2\xdf\xf4\xa6\x60\x9f\x0b\xde\x5e\x66\xd0\xa3\x92\xaa\x06" - "\xbc\x3f\x0e\xf6\xbb\x24\x54\x41\xf9\xa6\x62\xfc\xbd\x43\x7d\x49" - "\xe2\x19\x78\xbe\x03\x39\x34\xce\xa1\xbb\x0f\x57\xa5\x80\xa9\x4d" - "\xb4\x77\x5f\xa2\x83\x9b\x47\xf7\x98\xa4\xfa\xba\xba\x84\xb1\xf1" - "\xdb\xde\xdd\xc0\xce\x3d\x4d\x6f\x87\xa9\xa6\x5c\xba\x42\x9f\xab" - "\xab\x40\xb8\x2f\xe1\x5c\xdd\x59\x54\xb6\xd1\x84\x42\x56\x23\x34" - "\xc9\x88\x10\xb6\x45\x59\x6c\x35\x9a\x12\x8d\x3c\x70\xff\xb3\xe9" - "\xbf\xda\x6e\x65\x55\x7a\xb4\xce\x00\xf7\x78\xa7\xa1\xe5\x1e\xcf" - "\x6d\x3c\x87\x60\x5f\xcf\x73\x51\x3a\xe4\x1e\x8d\x54\xd8\xbe\x86" - "\xb4\xe1\x01\x53\xa0\xfe\x2c\xad\xa3\x69\x6c\x5b\x6c\x53\x6c\x5f" - "\x5c\x9e\xd9\xe6\x65\x91\x7a\x94\xd0\x80\x54\x65\xf1\xf0\x6f\x2c" - "\xad\x2f\x43\x77\x11\xdc\x63\x3e\xed\x79\x20\x07\x74\xb1\x02\x6b" - "\x41\x47\xfd\x58\x04\xfe\xef\x26\xa2\xa9\x02\xa2\x29\xd7\x7b\x0e" - "\x68\xea\x38\xa7\xa9\x5b\x4f\x73\x9a\xfa\x6f\xa3\xb8\xa6\xfe\x3b" - "\x9d\xd5\x54\x79\xfb\xd4\xd4\xad\xbb\xf6\x35\x75\xab\xdc\x8e\xa6" - "\x8a\x41\x53\x29\x7c\x4d\xd5\x74\x94\xae\xa9\xff\x6a\xda\x50\x53" - "\x85\xf2\x34\xf5\x5f\x17\xbe\xa6\x6e\xa9\xc5\x35\xe5\xc7\xc6\xa9" - "\xce\xd7\x5a\xd7\x94\x9f\x45\x9c\xaa\x59\xc6\x69\xea\xce\x64\x71" - "\x4d\xdd\x3e\x40\x34\xe5\xd7\x4e\xe3\xd4\xed\x71\xf6\x35\x75\xdb" - "\x47\x5c\x53\x7e\x10\xa7\xfc\xac\xe2\xd4\x9d\xb9\xd2\x35\x75\x7b" - "\x45\xdb\x69\xca\x4f\x66\x9c\xba\x1d\xc6\xd7\x54\x4d\x94\x1d\x4d" - "\xb1\x71\xca\xf3\x1b\x07\x34\x65\x11\xa7\xee\x9c\xe6\x34\xa5\xdf" - "\x27\xae\xa9\x9f\x8c\xac\xa6\xda\x69\x9c\xfa\x69\x97\x7d\x4d\xfd" - "\x14\x6b\x47\x53\x10\xa7\xfc\xac\xe2\x94\xfe\x88\x74\x4d\xfd\x54" - "\xdc\x86\x9a\x92\x19\xa7\x7e\x3a\xc8\xd7\xd4\x9d\xe3\xe2\x9a\xf2" - "\x67\xe3\xd4\x88\x6d\xad\x6b\xca\xdf\x22\x4e\xdd\xed\xc1\x69\xea" - "\xde\x7d\x71\x4d\xdd\x9b\x4a\x34\xe5\xdf\x4e\xe3\xd4\xdd\xdb\xf6" - "\x35\x75\xb7\x44\x5c\x53\xfe\x10\xa7\xfc\xad\xe2\x54\xad\xab\x74" - "\x4d\xdd\xeb\xd5\x76\x9a\xf2\x97\x19\xa7\xee\x21\xbe\xa6\xee\xaa" - "\xec\x68\x8a\x8d\x53\xb3\x5f\x76\x40\x53\x16\x71\xaa\x76\x09\xa7" - "\xa9\xfb\x13\xc4\x35\x55\xb7\x9f\xd5\x54\x3b\x8d\x53\x75\x63\xec" - "\x6b\xaa\x4e\x63\x47\x53\x10\xa7\xfc\xad\xe2\xd4\xfd\x99\xd2\x35" - "\x55\x17\xdd\x86\x9a\x92\x19\xa7\xea\xa6\xf1\x35\x55\x1b\x29\xa6" - "\xa9\x26\x9c\xf7\x29\x40\x53\x51\x90\xf7\x81\x86\x3c\xca\x89\xa6" - "\x9a\x41\x53\xbb\x2d\x35\xf5\xbd\x75\xde\x77\xff\xa4\xa9\x45\x53" - "\xf5\xa5\xd6\x9a\x32\x81\xa6\x9a\x19\x4d\x3d\xb8\x6e\xce\xfb\xca" - "\x6a\x72\xc0\x57\xb7\x50\x59\x28\xe8\x29\x83\xd5\xd3\xf7\xa0\x27" - "\x78\x1e\x13\x3c\x6f\x49\x65\x05\x0a\xd1\x93\xe7\x6a\x82\xe7\x35" - "\x59\x6a\xa9\xa9\x9a\xc2\x1a\xc2\xda\x31\xeb\xa8\x74\x29\xe8\x27" - "\xe6\x3c\x2a\x5d\x05\xbf\x35\xf0\x8b\x87\x1f\x3a\x8f\x4a\xaa\x11" - "\xd3\x67\xcf\xe9\xa7\x9c\xd5\xcf\x83\xf5\xf6\xf5\xf3\x20\x5c\x5a" - "\x8e\x57\x7f\x59\xba\x7e\x1e\xe4\xb3\x63\xe9\x54\x21\x53\xaf\xd0" - "\x78\xac\x2b\xd1\xc8\x2d\x14\x62\x40\x1e\xf4\x6c\x6d\x37\xf7\x30" - "\xa4\x5a\x6b\x44\xd4\xf6\x37\x90\x6a\xfb\x77\xf0\xbc\xe6\xba\x73" - "\x0d\xb9\x9f\x6d\xf8\x1b\x2a\xb9\x57\x81\x4a\x1e\x9c\x41\x25\x26" - "\xf8\xdd\x82\x1f\xdc\x63\xc8\x7c\xcb\xe7\xd5\xb3\xcf\x5b\xbf\x0c" - "\xca\xf2\x11\x7f\xde\xfa\x50\xe6\x79\x23\xe1\x79\x9b\xb8\xe7\x2d" - "\x03\x2d\x82\x5f\x7a\x9a\xd8\x3c\x31\x44\x8f\x3a\xbe\x63\xa0\xe9" - "\x26\x56\x83\xd8\x2f\x67\x2f\x34\xa0\x90\x68\xf0\xd5\x9b\xa0\xc1" - "\xaa\x3c\x94\x10\x07\x1a\x6c\x6a\xc0\xef\xf5\xf5\x65\x89\x8d\xa0" - "\xc1\x07\x69\x34\xd8\xad\x19\x6b\xf0\x7b\xac\xc1\xfb\x85\x26\x71" - "\x0d\x16\x10\x0d\x42\x9e\xd8\xba\x06\x2d\xe2\x5a\xc3\x38\x4e\x83" - "\x4d\x53\xc5\x35\xd8\xb8\xd0\x9c\x27\xfe\xfc\x1a\x6c\x74\xb5\xaf" - "\xc1\x86\x2a\x69\x39\x61\x53\x84\x74\x0d\x36\xfa\xb5\x9d\x06\x1b" - "\xef\xdb\xd7\x60\xe3\x05\x07\x34\x58\x28\x4f\x83\x8d\xde\x7c\x0d" - "\x36\x8c\x12\xd7\xa0\x1f\x1b\x07\x21\xaf\x6c\x55\x83\x96\x79\x65" - "\xd3\x19\x4e\x83\x86\x8b\xe2\x1a\x6c\xbe\x6d\xce\x2b\x7f\x7e\x0d" - "\x36\x6f\xb5\xaf\xc1\xe6\x28\x69\x39\xa4\xe1\xba\x74\x0d\x36\x17" - "\xb6\x9d\x06\x0d\xab\xed\x6b\xd0\x10\xd6\xba\x06\xfd\x64\xc6\xc1" - "\xe6\x2c\xbe\x06\x9b\x8a\xec\x68\x90\x8d\x83\x90\x87\xb6\xae\x41" - "\x8b\x38\x68\x9c\xcc\x69\x90\x9e\x29\xae\x41\xd3\x32\x73\x1e\xfa" - "\xf3\x6b\xd0\xd4\xc5\xbe\x06\x8d\x35\xd2\x72\x4e\x7a\xa1\x74\x0d" - "\x9a\x46\xb5\x9d\x06\x4d\x46\xfb\x1a\x34\x55\x3a\xa0\x41\x99\x71" - "\xd0\xa4\xe1\x6b\xd0\x18\x24\xae\x41\x7f\x36\x0e\x42\xde\xda\xaa" - "\x06\x2d\xf3\x56\xfa\x7c\x8b\x06\x95\x8a\xcb\xa2\x1a\x54\xa2\xfb" - "\xe6\xbc\xf5\x67\xd7\xa0\x12\xa5\xda\xd5\xa0\x12\x45\x4b\xca\x51" - "\x95\x8a\xdb\x92\x35\xa8\x44\x45\x6d\xa6\x41\xa5\x62\xbd\x5d\x0d" - "\x2a\x15\xe1\xad\x6b\xd0\x5f\x5e\x1c\x54\xa2\x5c\xbe\x06\xe9\x62" - "\x3b\x1a\x64\xe3\x20\xe4\xb9\xad\x6b\x90\x8b\x83\x4a\x6a\x3a\xa7" - "\x41\x97\x08\x71\x0d\x2a\x57\x9b\xf3\xdc\x9f\x5f\x83\x4a\x2f\xfb" - "\x1a\xa4\xea\x24\xe5\xb4\x4a\x97\x65\xd2\x35\xa8\x0c\x6a\x3b\x0d" - "\xba\xb8\xda\xd7\xa0\xb2\xca\x01\x0d\xca\x8b\x83\x4a\xa5\x96\xa7" - "\x41\x25\x35\x49\x4c\x83\x26\xc8\x8b\x9b\x73\xfb\xab\x4c\x69\x93" - "\x0a\x3d\x14\x1a\x64\x50\xbf\x90\x58\xb6\xa2\x0e\x4d\xb9\x0f\xf6" - "\x89\xbe\x8f\x5e\xbf\xaf\x42\xc6\xb4\x49\x79\xc0\xe4\x01\x16\xf9" - "\x33\x33\xb6\xcc\x90\x72\x20\x67\xc7\x52\xe4\x02\xf9\x77\x0c\xde" - "\x56\x76\xa3\x01\xe1\xeb\xaf\xc3\xf7\x73\x8b\xbb\x1f\xdc\x4f\x40" - "\xff\xa4\x55\x31\xef\x98\x9b\x74\xa8\x6a\x14\x52\x96\x54\xe9\xc0" - "\x0e\x6b\x18\xff\x62\xbb\xdc\x50\xba\x06\xed\xbd\x83\x5c\x0c\x3f" - "\x78\xf7\x04\x7b\xab\xbb\xbc\x8b\x14\xbd\xaa\x68\x13\xb6\x2b\xb6" - "\x17\xb6\xb1\x66\x0d\x4d\xc3\x71\xe9\xe7\x40\x63\x86\x1f\xb4\x3d" - "\xf7\xc0\x71\x82\xf9\xaa\xd2\x35\x5b\xba\x36\x5c\xc3\x99\x79\x0b" - "\x4a\xd7\x51\x25\x95\x48\xf0\xdd\x31\xd8\xaa\xc0\x41\x5b\x15\x5a" - "\xe4\x79\x8f\xc0\x56\x1d\xa2\x1d\xb3\x55\x87\x93\x56\xb6\xb2\xcd" - "\xab\x94\x1d\xce\x48\xb7\x55\x87\x24\x62\xab\x0e\x51\xe2\xb6\xf2" - "\x73\x50\x57\x7e\x01\x16\xf9\xc8\x23\xb0\xd5\x53\x59\x8e\xd9\xea" - "\xa9\xdb\x7c\x5b\x09\xf0\xbf\xf2\xa9\xfb\xd2\x6d\xf5\x14\x59\x0f" - "\x49\xf9\x54\x9a\x1d\x5b\x39\xa8\x2b\xbf\x42\x0b\x6e\x7e\x04\xb6" - "\x72\x2b\x76\xcc\x56\x1d\x7b\x58\xd9\xca\x96\x53\x95\x1d\xfb\x48" - "\xb7\x95\x5b\x15\xb1\x95\x5b\x91\xb8\xad\xfc\x1d\xd4\x95\x7f\x80" - "\x05\xdf\x3d\x02\x5b\x75\xac\x73\xcc\x56\x9d\xc6\xf1\x6d\x25\xc4" - "\x53\x9d\x26\x4b\xb7\x55\x27\xf2\x3d\x74\x65\xc7\x1a\x3b\xb6\x72" - "\x50\x57\xfe\x85\x16\x1c\xf2\x08\x6c\xd5\x59\xe3\x98\xad\x3a\x2f" - "\xb3\xb2\x95\x40\xbb\xdf\x79\xb5\x74\x5b\x75\x1e\x45\x6c\xd5\xd9" - "\x5b\xcc\x56\xc6\xb4\xe1\x7e\x1e\x60\x83\xc6\x8c\xe1\x2a\x8f\x58" - "\x44\x35\xf9\x80\xdd\xd4\x60\xb7\xf5\x1a\xd4\x9c\x06\x76\xd3\x1b" - "\xd0\x94\x65\x57\xe8\x73\x35\x46\xd4\x04\x36\x6b\x54\x0f\x0f\x28" - "\xd3\x57\xe3\x31\x47\x2f\x5e\x53\x76\x99\x39\x7b\x99\x0a\x61\xbb" - "\x61\x3b\x60\xdb\xd1\x60\x37\xc6\x8e\xea\x19\x01\x46\xf5\xf8\xd0" - "\xc9\xb7\xaf\xd0\xef\xe8\x68\x1a\x3f\x2f\xad\x6a\xcc\xc7\xef\x05" - "\x42\xaa\x51\x47\xcd\xab\xf8\x99\xba\x74\xc4\xdb\xcb\xf4\x15\xc0" - "\x07\xf7\x10\xc3\x66\x57\xb4\x6a\xe3\xef\xb5\xee\xc6\xb2\xb0\xdf" - "\xd1\xdd\x9a\xca\x0d\xdd\xc7\xe6\x24\xdc\x46\x1d\x30\x3f\x24\x9b" - "\x90\xf7\xba\x25\x88\xfa\x6c\x51\x11\xc5\xcc\x5d\x8b\xc1\x65\xb8" - "\x5f\x04\xbb\x78\xd3\xb5\x16\x63\xba\x6b\xa3\x50\xd9\x8d\x14\xc6" - "\x6f\xd6\x8c\xc0\xf8\xed\xdf\x5a\x15\x70\xa6\x2f\xad\x1e\x1e\x9c" - "\x72\x0e\x69\xe8\x66\xb0\x71\x3c\x73\x3f\x27\xf7\x36\x49\xb5\xb1" - "\x3b\x33\xfe\xdb\xa4\x61\xc7\x6f\x81\x9d\xf0\xf5\x99\xf1\x5b\xd1" - "\x16\xe3\xb7\xe0\x9e\x5b\xc6\x6f\x29\xdd\x23\xf1\xf8\x2d\xd3\x15" - "\xef\x9e\xe6\x67\x7f\x67\x31\x4d\xc3\xb3\x77\x3b\x57\xa7\x47\xf8" - "\xf9\xcf\xd5\x15\xa1\x84\x15\x48\x75\xae\xa9\x1a\xc5\xd7\xd1\xfa" - "\x73\x89\x37\x51\xc8\x7d\xcc\xc1\x58\x2f\x5d\xa6\x12\xbf\xba\xfb" - "\x98\xae\x68\x7b\xea\x94\x5d\x82\xcf\x95\x23\x64\x31\x8f\x27\x0a" - "\x98\xd9\x0d\xfc\x10\x55\x96\x78\x0d\x81\x4f\xca\xcb\x0c\xdf\x61" - "\x3f\x45\xc1\xfe\x51\x2d\x7c\xdd\x7d\xfc\x37\x78\x1b\xf6\x19\x7e" - "\xdf\x54\x16\xad\x67\x8e\x31\xef\xc7\xba\xf0\x88\x4d\x44\x65\xb1" - "\x4d\xe8\x9c\x01\x01\x5f\x75\x2e\xff\x67\x58\x85\x98\x8e\x0a\x58" - "\x1d\xa5\x78\xc4\xba\xde\x73\x40\x47\x85\x9c\x8e\x3c\xf6\x39\xa7" - "\x23\x8f\xa9\xce\xeb\xc8\xe3\x69\x27\x74\x54\xcc\xd7\x91\xaa\xa3" - "\x74\x1d\x75\xad\x96\xae\xa3\xae\x07\x9d\xd3\x91\xc7\x2e\xa2\xa3" - "\xae\x8b\x89\x8e\x3c\x52\x38\x1d\x31\x73\xa3\x1e\x91\x8e\xba\x7a" - "\x8b\xeb\xc8\x8f\x8d\x47\x7e\x10\x8f\x3a\x5f\x6b\x5d\x47\x7e\x16" - "\xf1\xc8\xf3\xa6\x73\x3a\xf2\xdc\xe5\xbc\x8e\x3c\xe7\xcb\xd7\x91" - "\x9f\x55\x3c\xea\x36\x55\xba\x8e\x3c\x7d\xa5\xeb\x48\x55\xe7\x9c" - "\x8e\x3c\xaf\x12\x1d\xa9\x0a\x88\x8e\x3c\x2b\x38\x1d\x31\xf3\xcd" - "\x1e\x91\x8e\x54\xe1\x76\x74\xc4\xc6\x23\x3f\x88\x47\x9e\xdf\x38" - "\xa0\x23\x8b\x78\xa4\x1e\xea\x9c\x8e\x7e\x71\xd5\x79\x1d\xfd\xe2" - "\x90\x13\x3a\xb2\x8a\x47\xea\x5d\xd2\x75\xf4\x8b\x58\xe9\x3a\xfa" - "\xc5\x28\xe7\x74\xa4\x1e\x48\x74\xd4\xcd\x40\x74\xa4\xd6\x70\x3a" - "\x62\xe6\xf0\x3d\x22\x1d\x75\xcb\x13\xd7\x91\x3f\x1b\x8f\xfc\x21" - "\x1e\x8d\xd8\xd6\xba\x8e\xfc\x2d\xe2\x51\xf7\xd5\xce\xe9\xa8\xfb" - "\x40\xe7\x75\xe4\x75\x5f\xbe\x8e\xfc\xad\xe2\x51\xf7\xab\xd2\x75" - "\xe4\x55\x24\x5d\x47\x5e\x1b\x9d\xd3\x51\xf7\x65\x44\x47\x5e\x41" - "\x44\x47\xdd\xa3\x38\x1d\x31\xf3\x22\x1f\x91\x8e\xd4\x7a\x3b\x3a" - "\x62\xe3\x91\x3f\xc4\xa3\xd9\x2f\x3b\xa0\x23\x8b\x78\xe4\x7d\xd2" - "\x39\x1d\x79\x2f\x73\x5e\x47\xde\xa3\x9d\xd0\x91\x55\x3c\xea\x31" - "\x50\xba\x8e\xbc\xdd\xa4\xeb\xe8\x97\x25\xce\xe9\xc8\xfb\x18\xd1" - "\xd1\x2f\x93\x88\x8e\xbc\xf3\x39\x1d\x31\x73\x4d\x1f\x91\x8e\x7e" - "\x19\x20\xa6\x23\xbc\x16\xc1\x87\x64\x5d\x88\xba\x1d\x6b\x50\xc0" - "\x5e\xfc\x6f\x13\xf2\xad\x4f\xee\x11\x7e\x32\x8e\xac\x07\xa0\x53" - "\xf6\x60\xfa\x7b\x85\xce\xef\x7c\x00\xfc\xa2\x1e\xee\x1b\x72\x99" - "\xac\xd1\x80\xd7\x05\xa9\x4d\x88\x42\x43\xf0\xba\x0c\xca\x9e\x99" - "\x78\x1d\xab\x96\xb5\x03\xd4\x22\x6b\x07\xcc\x12\x5f\x3b\xa0\x29" - "\xc3\x3c\xef\x36\x8f\x9b\x77\xab\xec\x39\xdf\xee\xbc\x5b\x65\xcf" - "\xc9\xd9\xb3\xa4\xea\xa1\x27\x33\xff\xab\xb6\xfb\x70\x55\x7d\x72" - "\xcf\x39\xf0\xcc\x7e\xe4\xd9\x7b\x56\x20\x87\xe6\xe3\xe6\x59\xe8" - "\xa4\xa7\xdb\xf4\x39\x28\x91\xde\x76\x69\x0e\xed\x35\xdc\x97\x4e" - "\x1f\x1e\x28\xf1\x5e\x44\xbf\xff\xc1\xda\x3b\x5f\xd8\xde\xbd\xdc" - "\x58\x7b\xa7\xb0\xf6\x16\x5e\xb7\x60\x96\xf8\xba\x05\xc2\xf6\xfe" - "\x95\xfd\x79\xce\xca\x5f\x9d\x90\x6e\xef\x5f\x6d\x61\xed\x9d\x52" - "\x9f\xfc\xab\x12\xce\xde\xbd\x82\xa5\xdb\xfb\x57\xb1\xc4\xde\xdf" - "\x85\x82\xbd\xf3\xc1\xde\x45\xd2\xee\xa5\x97\xda\xbe\xbd\xfd\x44" - "\xf4\xfd\x74\x2c\xb1\x37\xbb\x66\x82\x5a\x64\xcd\x84\x59\xe2\x6b" - "\x26\x08\xdb\xfb\xe9\x71\xf6\xed\xfd\xf4\x60\xe9\xf6\xee\xd5\x40" - "\xec\xed\x07\xfa\x7e\x7a\x14\x67\xef\xa7\x1d\x5c\x57\xc0\xd2\xde" - "\xbd\xaa\x89\xbd\xbf\x0f\xa2\xbd\xfc\x40\xdf\x7e\x12\xf5\xfd\xf4" - "\xc6\x56\xec\x2d\xa2\xef\xde\xd5\xac\xbd\x59\x7d\x8b\xac\xd7\x30" - "\x4b\x7c\xbd\x06\x61\x7b\xf7\x3e\x6a\xdf\xde\xbd\xb3\xa5\xdb\xbb" - "\x77\x14\x6b\x6f\xd0\x77\xef\x83\x9c\xbd\x9f\xd1\x4a\xb7\x77\xef" - "\x30\x62\xef\xca\x00\xb0\x37\xe8\xdb\x4f\xa2\xbe\x7b\x8b\x7e\xff" - "\x93\xd8\xdb\x5f\x44\xdf\x9a\x30\x62\x6f\x76\xad\x08\xb5\xc8\x5a" - "\x11\xb3\xc4\xd7\x8a\x10\xb6\xb7\xa6\xbf\x7d\x7b\x6b\xba\x48\xb7" - "\xf7\x33\x15\xc4\xde\xfe\xa0\x6f\x4d\x2f\xce\xde\x9a\x4c\xe9\xf6" - "\x7e\xa6\x98\xd8\xfb\xf2\x20\xda\xcb\x1f\xf4\xed\x2f\x51\xdf\x9a" - "\xc8\x56\xec\x2d\xa2\xef\x3e\xc5\xac\xbd\x59\x7d\x8b\xac\x53\x31" - "\x4b\x7c\x9d\x0a\x61\x7b\xf7\x49\xb7\x6f\xef\x3e\xeb\xa4\xdb\xbb" - "\x4f\x30\x6b\x6f\xd0\x77\x9f\x24\xce\xde\x7d\xdd\xa4\xdb\xbb\x4f" - "\x00\xb1\xf7\x7f\x34\x60\x6f\xd0\xb7\xbf\x44\x7d\xf7\xb9\x20\x66" - "\x6f\x0f\xb0\xf7\x69\xe0\x18\x68\x07\x03\x4c\x69\xc0\x29\x46\xbe" - "\xdd\xcb\x62\x03\xd0\xf3\x0f\xb0\xed\xfb\x15\x40\xdb\x11\xd0\x66" - "\xeb\x65\x28\xfb\x65\x3b\x3d\x77\x58\xd9\x6f\xa1\xe8\xdc\x61\x65" - "\xbf\xa9\x92\xe7\x0e\x2b\xfb\xf5\xe2\x18\xa8\x5f\x38\xe7\xd3\x7e" - "\x4c\xfc\x90\x34\xa7\x58\xd9\xcf\x5d\x70\x1d\x0d\x65\xdf\xe3\x78" - "\x4e\x31\xbd\xed\x8a\xda\x94\x2e\x87\x8d\xfa\x15\x39\xe0\xeb\x42" - "\xf0\x43\xbe\xb8\xaf\xfb\xe7\x80\xaf\x0b\xdb\x6c\xdd\x0e\x65\xff" - "\xad\xce\xfb\xba\xff\x74\x71\x5f\xf7\x1f\x2d\xdd\xd7\xfd\xdd\x38" - "\xfe\xea\x3f\x89\xf3\x75\x7f\x9d\x74\x5f\xfb\x34\x08\xae\xe7\xa1" - "\xf4\xc9\x23\xbe\xd6\xc5\x82\xaf\x65\x70\x59\xff\x83\xad\xfb\xda" - "\x0f\xea\xb5\x9f\x9d\x7a\xfd\x6c\x12\xb4\x99\x01\x6d\xb6\x7e\x88" - "\xf2\xd9\x95\xce\xfb\xfa\xd9\x31\xe2\xbe\x7e\x76\xa0\x74\x5f\x0f" - "\xa8\xe3\xd8\xef\xd9\x00\xce\xd7\xcf\x96\x48\xf7\xf5\x80\x2a\xc1" - "\x75\x45\x94\x03\xd2\x88\xaf\xaf\x56\x9a\xd2\xe5\x30\xe1\xb3\x99" - "\x0e\xf8\x1a\xea\xb5\x9f\x9d\x7a\x3d\x30\x16\x7c\x5d\xd8\x66\xeb" - "\x98\x28\x07\x46\x38\xef\xeb\x81\x83\xc5\x7d\x3d\xd0\x4b\xba\xaf" - "\xb5\x3a\x8e\x3b\x07\xfa\x70\xbe\x1e\x58\x28\xdd\xd7\xda\x72\xc1" - "\xf5\x4d\x94\xda\x44\xe2\xeb\x1f\x02\xc1\xd7\x32\x78\x74\xa0\x28" - "\xff\x73\xbe\xf6\x87\x7a\xed\x6f\xa7\x5e\x3f\x17\x09\xac\x10\xd0" - "\x66\xeb\xa9\x28\x9f\x9b\xec\xbc\xaf\x9f\xeb\x21\xee\xeb\xe7\x14" - "\xd2\x7d\xfd\xeb\x12\x8e\x79\x9f\x53\x71\xbe\x7e\x2e\x57\xba\xaf" - "\x7f\x7d\x5c\x70\x9d\x15\xe5\xaf\x17\x13\x5f\x57\xe5\x9a\xd2\xe5" - "\xb0\xf0\x73\xd1\x0e\xf8\x1a\xea\xb5\xbf\x9d\x7a\x3d\x18\xf2\x7a" - "\xff\xc2\x36\x5b\xd7\x45\x39\x78\xa4\xf3\xbe\x1e\xec\x2a\xee\xeb" - "\x41\xb7\xa5\xfb\x7a\x50\x21\xc7\xdb\x83\x0c\x9c\xaf\x07\xa7\x48" - "\xf7\xf5\xa0\x3c\xc1\xf5\x5e\x94\x83\xc2\x88\xaf\x6f\xb8\x81\xaf" - "\x65\x70\xf8\xe0\x39\x72\x38\x7c\x79\x36\x72\xe3\xfb\x7b\x48\x60" - "\xdb\xb2\xf8\x90\x81\xce\xfb\xfb\xf9\xfb\xe2\xfe\x7e\xfe\xb2\x74" - "\x7f\x3f\x9f\xc7\xb1\xf8\xf3\x35\x9c\xbf\x87\x24\x4a\xf7\xf7\xf3" - "\x99\xc2\x2c\xfe\x7c\xb0\x73\x2c\x3e\x64\x92\x1c\x16\xb7\xf5\xf7" - "\x50\xdf\xb6\xe5\xf1\xa1\x3d\x9c\xf7\xb7\xef\x75\x71\x7f\xfb\x96" - "\x4a\xf7\xb7\x6f\x26\xc7\xe3\xbe\x95\x9c\xbf\x87\x46\x4b\xf7\xb7" - "\xef\x16\x61\x1e\xf7\x0d\x70\x8e\xc7\x87\x8e\x92\xc3\xe3\xb6\xfe" - "\x1e\xae\x69\x5b\x26\x1f\xde\xd1\x79\x7f\x0f\xbb\x28\xee\xef\x61" - "\x27\xa4\xfb\x7b\xd8\x16\x8e\xc9\x87\x59\xf4\x7f\x0f\x0f\x97\xee" - "\xef\x61\xb1\xc2\x4c\x3e\x4c\xeb\x1c\x93\x0f\x17\xfd\xfe\xa1\x3d" - "\x26\xb7\xf5\xb7\xbf\xaa\x6d\xb9\xdc\xaf\xd1\x79\x7f\xfb\x9d\x16" - "\xf7\xb7\xdf\x21\xe9\xfe\xf6\x8b\xe5\xb8\xdc\xef\x38\xe7\x6f\x7f" - "\xe9\xeb\x67\x2a\xfd\xa2\x84\xb9\xdc\xcf\xdb\x39\x2e\xf7\xef\x25" - "\x87\xcb\x6d\xfd\xfd\x02\x6a\x5b\x36\x1f\x71\xd3\x79\x7f\x8f\x38" - "\x2a\xee\xef\x11\xd9\xd2\xfd\x3d\x22\x8a\x63\xf3\x11\x16\xfd\xff" - "\x2f\x04\x4a\xf7\xf7\x88\x30\x61\x36\x1f\xe1\xe6\x1c\x9b\xbf\xe0" - "\x2e\x87\xcd\x6d\xfd\x1d\xa0\x6f\x5b\x3e\x0f\xb8\xe4\xbc\xbf\x03" - "\xf6\x8b\xfb\x3b\x60\xbb\x74\x7f\x07\x84\x71\x7c\x1e\x90\xc5\xf9" - "\x7b\xa4\xaf\x74\x7f\x07\x04\x0b\xf3\xf9\x0b\x0d\xce\xf1\x79\x80" - "\xc1\xf9\x7e\xf2\x17\x4b\x30\x9b\x4b\x5d\xff\xb1\x6c\x85\x79\xce" - "\xdd\x48\x6e\xfd\x47\xe5\x8b\xcc\x77\x20\x05\xd7\x96\x51\xbe\xd8" - "\xa3\x5d\xaf\xff\xa8\xfc\x8d\xfd\xf5\x1f\x95\xbf\x91\xb6\xfe\xa3" - "\xf2\x45\x85\xf4\xf1\xf8\xbf\x29\xe1\x72\x84\x17\x2d\xf2\xff\x51" - "\x4c\xbd\x6e\xd7\xeb\x42\x2a\x7f\xc3\x5f\x17\x52\x39\x92\x59\x17" - "\x92\xde\xf6\xe3\x62\x79\xb9\xc8\x8b\x15\xce\xbf\x17\xf8\x6d\x1e" - "\xce\x43\xa4\xae\x43\xc9\x69\x7b\xd4\x7e\x4e\xdb\xbf\xdd\x25\xae" - "\xed\xd1\xf7\xdb\xf5\x3a\x94\xca\xd1\xab\xed\x6b\x7b\x74\x98\xa4" - "\x35\x47\x94\xa3\xa5\xaf\x7b\xa3\x1c\x9d\xc7\xe5\x43\xa3\x2d\xf2" - "\xdf\xdf\x56\xb7\xa1\xb6\xe5\xad\xa7\xa4\x1c\x9d\xc4\xd7\xf6\xa8" - "\x2c\xa2\xed\x9b\x45\xf2\xf2\xae\xdf\x8a\x7e\xff\xdd\xf1\xf7\x20" - "\x63\x36\xe2\x9c\x4b\xea\x7a\x98\x9c\xb6\x5f\x5a\xcf\x69\x7b\xcc" - "\x4a\x71\x6d\x07\x9e\x6f\xd7\xeb\x61\x2a\x03\xa7\xdb\xd7\x76\xa0" - "\x9f\xa4\xb5\x4c\x94\x81\xc7\xa4\x6b\x3b\x70\x23\x97\xfb\x05\x16" - "\x73\xda\x1e\x73\xaa\xed\xb4\x2d\x73\x9d\x4c\x65\x60\x14\x5f\xdb" - "\x2f\xc5\x12\x6d\xd7\xa8\xe5\xe5\x98\x63\x52\x9c\x7f\xef\x13\x14" - "\x8e\xf3\x4b\xa9\xeb\x72\x72\xda\x7e\x79\x2e\xa7\xed\x20\x9b\x75" - "\xa1\x38\x6d\x8f\x3d\xd4\xae\xd7\xe5\x54\x8e\x1d\x6a\x5f\xdb\x63" - "\x55\x92\xd6\x48\x51\x8e\x4d\x97\xae\xed\xb1\xe1\x5c\x9e\x3b\x36" - "\x97\xd3\x76\x50\x4e\x1b\x6a\x5b\x66\xdc\x1e\x1b\xc4\xd7\xf6\xcb" - "\xd3\x88\xb6\xef\x44\xc9\xcb\xa7\x83\x16\x3b\xff\x9e\xeb\x77\xa3" - "\x70\x2e\x2d\x75\x7d\x50\x4e\xdb\xe3\x46\x72\xda\xfe\xdd\x60\x71" - "\x6d\x8f\xdf\xda\xae\xd7\x07\x55\x8e\xb7\xbf\xfe\x8f\x72\x9c\x9d" - "\xf5\x7f\x84\xe6\x0a\x8f\x97\xb1\xee\xc5\xf8\x51\x5c\x4e\x3f\x3e" - "\x91\xd3\xf6\xef\xe2\xda\x4e\xdb\x32\xd7\x0d\x55\x8e\xd7\xf0\xb5" - "\x3d\xce\x97\x68\x5b\x7f\x5c\x5e\xdf\xc1\xef\x82\x9d\x7f\xaf\xf7" - "\x8a\x37\xee\x37\x90\xba\x4e\x29\xa7\xed\x60\x2f\x4e\xdb\xaf\x74" - "\x14\xd7\xf6\x84\xf9\xed\x7a\x9d\x52\x65\xf0\x4d\xfb\xda\x0e\x2e" - "\x96\xb6\xa6\xcb\x04\x19\xf3\xe0\x27\x78\x73\xfd\x17\x13\x2c\xc6" - "\xbf\xbf\x12\xd6\x86\xda\x96\x19\xb7\x83\x0d\x7c\x6d\x07\xbb\x13" - "\x6d\xd7\xaa\xe4\xf5\x93\xbc\xe2\xe3\x7c\x3f\xc9\x64\x1f\xe6\x1d" - "\xa6\xc4\xf5\x52\x39\x6d\xbf\x72\x97\x5b\x9b\x68\xb2\x97\xb5\xb6" - "\xb9\xb5\x89\x26\x0d\x6e\x37\xeb\xa5\x2a\x27\x1e\xb1\xaf\xe3\x89" - "\x29\xd2\xfa\x44\x26\x79\x49\xd7\xf1\x44\x1d\xd7\x27\x32\xc9\x62" - "\xfc\xcb\x64\xf3\x37\xc9\xdb\x60\xcd\xa2\x49\xc7\xec\xaf\x59\x34" - "\x29\xf3\x91\xad\xa3\xaa\x9c\x78\x8a\xbf\x66\xd1\x2b\xd5\x26\xa6" - "\x2e\xdc\x8f\x94\xd7\xaf\x32\xd9\xd7\xf9\x7e\x95\x50\xf2\x7e\x57" - "\xe2\xba\xad\x5c\x5d\x98\x6c\xe4\xea\x42\x68\x1f\xf1\xba\x10\x32" - "\xb2\xdd\xac\xdb\xaa\x9c\x72\xc2\x7e\x5d\x98\x92\x25\xad\x0f\x25" - "\x44\xc6\x3a\x30\x53\x6a\xb8\x3e\x94\x10\x5f\xae\x2e\x84\x46\xb7" - "\x5d\x5d\x08\x39\x6d\xbf\x2e\x84\xe4\x3e\xb2\xf5\x5c\x95\x53\xca" - "\xf9\x75\x61\x72\x1d\xa9\x0b\xf5\xd5\xf2\xfa\x61\x42\x65\xbd\xff" - "\xe6\xd7\x85\xd7\x46\x31\xef\xbe\x25\xae\x1f\xcb\xd5\x85\xa9\x1d" - "\xb9\xba\xf0\x9a\x0d\xcf\x73\x75\xe1\xd5\x71\xed\x66\xfd\x58\xe5" - "\xd4\x33\xf6\xeb\xc2\xd4\x3c\x69\x7d\x2e\xaf\x0e\x96\x5e\x17\xa6" - "\x5a\xcc\x7f\x7a\xd5\x62\xfe\xd3\x6b\x71\x6d\x57\x17\x5e\x3d\x6f" - "\xbf\x2e\xbc\x9a\xff\xc8\xd6\x95\x55\x4e\xad\xe4\xd7\x85\xa9\x88" - "\xd4\x85\xa6\xc5\xf2\xfa\x6d\x5e\x73\x80\xff\x5b\xeb\xb7\x99\x11" - "\xcc\x8c\x0b\x90\xb8\x8e\x2d\x57\x17\xa6\x79\x71\x75\x61\xc6\x48" - "\xf1\xba\x30\x7d\x6a\xbb\x59\xc7\x56\x39\xed\xa2\xfd\xba\x30\xad" - "\x40\x5a\x1f\xcd\xf4\x91\xd2\xeb\xc2\x74\x17\xae\x8f\x66\x7a\x30" - "\x57\x17\x66\x6c\x69\xbb\xba\x30\xfd\xb2\xfd\xba\x30\xfd\xf8\x23" - "\x5b\xdf\x56\x39\xad\x9a\x5f\x17\xa6\xb9\x93\xba\x60\xd0\xcb\xeb" - "\xe7\x99\x31\xcd\xf9\x7e\x9e\x99\xd3\x98\x31\x13\x12\xd7\xd3\xe5" - "\xea\xc2\xef\xfb\x70\x75\x61\xe6\x38\xf1\xba\x10\x36\xb7\xfd\xac" - "\xa7\xfb\xfb\xab\xf6\xeb\xc2\xef\x8b\xa4\xf5\xe9\x84\x8d\x93\x5e" - "\x17\xc2\x54\x5c\x9f\x4e\xd8\x34\xae\x2e\xcc\x4c\x6b\xbb\xba\x10" - "\x76\xd3\x7e\x5d\x08\x2b\x7e\x74\xeb\xec\xfe\xbe\x8e\x5f\x17\x7e" - "\xef\x4d\xea\x02\xbd\x42\x5e\xbf\xd0\xcc\x70\xe7\xfb\x85\xe6\x84" - "\x33\xe3\x49\x24\xae\xeb\xcb\xd5\x85\x59\x83\xb9\xba\x30\x47\xfc" - "\x3b\x0f\xca\xd9\x0b\xdb\xcf\xba\xbe\xb3\xec\x7f\xff\x48\x39\xcb" - "\xde\xf7\x8f\x04\xfa\x80\x66\x4f\x95\x5e\x17\x66\xf7\xe2\xfa\x80" - "\x66\x5b\xcc\xff\x9b\x93\xd3\x76\x75\x61\xb6\xfd\xef\x3f\x28\x67" - "\x3b\xf0\xfd\x07\xb9\xeb\xfd\xce\x46\xfc\xba\x30\xcb\x87\xa9\x0b" - "\xc9\x8a\x06\x79\xfd\x48\x73\x5a\xed\xff\xc7\x79\x7e\xb3\xda\xb6" - "\x1f\xa9\xa4\x2a\x00\x3d\x37\x0b\xd7\x85\xd7\xd5\x86\xf4\xe1\x01" - "\x78\x7d\x61\xa3\x0f\xbb\x06\xe5\x7a\x76\x8d\x97\x3a\x03\x59\x83" - "\x52\x6f\x6c\x59\x83\x92\xac\xfd\x81\x28\x3c\x17\x18\xcf\x09\x36" - "\xa8\xc8\xfa\x93\x34\x1e\x13\x85\xc7\x48\x5d\x2b\x66\xd6\x57\x89" - "\x33\xc0\xb3\xdf\x68\x65\xfd\xc9\x70\x1d\x2a\x09\x5f\x83\x0c\x9e" - "\x07\x72\xc8\x3c\xe1\xb9\xb9\xcc\xfa\x93\xf3\xbc\x7b\x26\xff\x07" - "\xa9\x3d\xf0\xfa\x93\xe1\xb4\x29\x41\x47\xeb\xcf\x01\x5d\x97\x84" - "\x83\x7d\x23\xcc\x6b\x50\xbe\xde\x05\x3f\xbb\x61\x9e\xb6\xe7\x9e" - "\xff\x88\xad\x2f\x3c\x57\xc6\x3a\xb0\x73\x8b\xb8\xfe\x9d\xd7\x5d" - "\x38\x8d\xbe\xce\xb4\xc1\xb0\x3f\xab\x24\x0c\x62\x4c\xb2\x4b\x5c" - "\xb3\xac\xb5\x37\x5e\xd7\x38\xe0\x33\x3c\x46\xc4\x26\x7e\x71\x3e" - "\x9b\x57\x0c\x3e\x2b\xc4\xeb\x1c\x3b\xee\x33\xd7\x7b\x8f\xc6\x67" - "\xf3\xc2\x1c\xf7\xd9\xbc\x93\x56\x3e\x13\xe8\x87\x98\x77\x40\xba" - "\xcf\xe6\xad\xe0\xfa\x21\xe6\x15\x72\x3e\x0b\x77\x23\x3e\x9b\x17" - "\x4a\x7c\xe6\x9a\xd7\x2c\x6b\xfd\x8e\x79\xad\xce\xff\xc6\x79\x53" - "\xb3\xda\x36\x2f\xe7\x7c\x16\x11\x67\x48\x87\xdc\x1d\xf2\x72\xc7" - "\x7d\xd6\xf9\xda\xa3\xf1\x59\x84\xbb\xe3\x3e\x8b\x58\xc9\xf7\x99" - "\x50\xbe\x1c\x21\xfd\x9b\x9d\xca\x08\x2d\x97\x2f\x47\x2c\xe6\x7c" - "\x16\x71\x9c\xf8\x2c\xc2\x85\xf8\xac\xc3\x85\x66\x59\x6b\x80\x44" - "\x6c\x71\xc0\x67\xf8\x9d\xbe\x9d\x7a\xf6\xa6\x2f\xf8\xac\x10\xaf" - "\xfb\xec\xb8\xcf\x3c\xbf\x79\x34\x3e\x7b\xa3\xc8\x71\x9f\xbd\x39" - "\xd0\xca\x67\x02\x79\xdd\x9b\x9e\xd2\x7d\xf6\x46\x25\x97\xd7\xbd" - "\xa9\xe1\x7c\xf6\x66\x34\xf1\xd9\x1b\x85\xc4\x67\x6e\xa8\x59\xd6" - "\x3a\x22\x6f\xb6\xda\xff\x85\x39\xb4\x59\x6d\x9b\xe7\x70\x3e\x8b" - "\xac\x32\xa4\x43\x2e\x04\x79\x8e\xe3\x3e\x1b\xb1\xed\xd1\xf8\x2c" - "\x72\x85\xe3\x3e\x8b\xbc\xcc\xf7\x99\x50\xfe\x11\x79\x5a\xba\xcf" - "\x22\x53\xb8\xfc\x23\xf2\x02\xe7\xb3\xf9\x3e\xc4\x67\x91\x8b\x89" - "\xcf\x3a\x0e\x6a\x96\xb5\x16\x49\xa4\xde\x01\x9f\xe1\x77\xb0\x76" - "\xea\xd9\x82\x4c\xf0\x59\x21\x5e\x07\xdb\x71\x9f\xcd\x7e\xf9\xd1" - "\xf8\x6c\x81\xd6\x71\x9f\x2d\x48\xb5\xf2\x99\x00\x27\x2f\x90\xb1" - "\x0e\xf6\x82\x20\x8e\x93\x17\x6c\xe1\x7c\xb6\xa0\x82\xf8\x6c\x81" - "\x86\xf8\xac\x53\x58\xb3\xac\xf5\x4c\x16\x88\xae\xff\x65\x8f\x1b" - "\xcd\xe3\xf2\x39\xbf\x45\x85\xb6\x1f\x76\x7c\x4b\xe7\xb8\xdf\xa2" - "\x26\xb4\xce\x8e\x51\x43\xa5\xfb\xed\x2d\x03\xc7\x8e\x51\x81\x9c" - "\xdf\xa2\x52\x88\xdf\xde\xaa\x70\x8e\x1d\xa3\x5a\x9d\xff\x2a\xc4" - "\x8e\xb6\x7e\x5b\xe4\xd6\x7e\xf8\x71\x61\xa6\xe3\x7e\x5b\xa4\x68" - "\x9d\x1f\x17\xde\x94\xee\xb7\x85\x05\x1c\x3f\x2e\x6c\xe0\xfc\xb6" - "\x28\x98\xf8\x6d\x61\x8a\x73\xfc\xb8\x48\x74\xfd\x37\x7b\xfc\x68" - "\xeb\xb7\xb7\x8b\xda\x0f\x43\xbe\x1d\xea\xb8\xdf\xde\x3e\xd6\x3a" - "\x43\xbe\xbd\x4f\xba\xdf\xde\x5e\xcc\x31\xe4\xdb\xf9\x9c\xdf\xf0" - "\x66\xec\xb7\xb7\x83\x9d\x63\xc8\xb7\x4b\xe4\x30\xa4\xad\xdf\x96" - "\xc4\xb6\x1f\x8e\x5c\xe2\xe6\xb8\xdf\x96\x2c\x6b\x9d\x23\x97\x48" - "\xff\x66\xb1\x72\x89\x0f\xc7\x91\x4b\xa2\x38\xbf\x2d\x61\xbf\xc1" - "\xb2\x04\x39\xc7\x91\x4b\x5a\x5d\xff\x43\x88\x23\x6d\xfd\xf6\x8e" - "\x6f\xfb\x61\xc9\xa5\x12\xf8\xff\x9d\x81\xad\xb3\xe4\x3b\x32\xf8" - "\x7f\x69\x25\xc7\x92\xef\x58\xf0\xff\x3b\x2c\xff\x2f\x2d\x74\x8e" - "\x25\xdf\x71\x84\xff\x6d\x58\xd2\xd6\x6f\xd1\xd5\xed\x87\x27\xa3" - "\x63\x1d\xf7\x5b\xf4\xd5\xd6\x79\x32\x5a\xc6\x77\xa0\xa2\xd3\x38" - "\x9e\x8c\xae\xe0\xfc\xb6\x4c\x4b\xfc\x16\x1d\xed\x1c\x4f\x46\x8b" - "\xae\xff\x68\xf6\x9b\x51\x3d\x3c\x80\x16\xe8\x87\x2c\x8d\x0a\x60" - "\xd7\x26\x5c\x5e\x68\xf4\x1a\x1e\x20\xf5\xfb\x2e\xe6\x35\xa7\xcf" - "\x44\x21\x74\x4d\xb9\x7c\xaa\x73\xeb\x4e\x2f\x57\x38\xbf\xee\x74" - "\x4c\xe9\xc3\xfb\xbe\x4b\xcc\x51\xe9\xeb\x4e\xc7\x24\x72\x0c\x1a" - "\x73\x8a\xf3\xf5\x72\x66\x7c\x82\xb4\xf5\xa8\x63\x82\x9c\x5b\x8f" - "\x7a\xf9\x04\xa2\xaf\x18\x17\xb2\x1e\xf5\xf2\xc0\xb6\xf9\xee\xcb" - "\xb2\x7c\xbc\x1e\x35\x9d\xdc\x79\xa3\xbc\xf5\x91\x97\x9f\x72\x40" - "\xcf\x85\xb4\x40\x1f\x2d\xa7\xe7\x55\x5b\x40\xcf\x85\x52\xbf\x33" - "\xc3\xd7\xf3\xaa\x3e\xce\xe9\x79\xe5\x79\xe7\xf5\xbc\x32\xfb\xe1" - "\x7d\x67\x66\xe5\x26\xe9\x7a\x5e\x19\xca\xb1\xf9\xca\x34\x4e\xcf" - "\xab\x8a\xa5\xeb\x79\xa5\xda\x39\x3d\xaf\xea\x41\xf4\xbc\xe2\x02" - "\xd1\xf3\x2a\x55\xdb\x7c\x7f\x66\x45\x22\xd1\x73\x97\x12\x79\xeb" - "\x4f\xaf\x4a\x6b\x5d\xcf\x7e\x01\xb4\x40\xff\x35\xa7\xe7\xd5\x61" - "\x46\x2f\xbf\x00\xa9\xdf\xbb\xe1\xeb\x39\xf6\xae\x73\x7a\x8e\xdd" - "\xe7\xbc\x9e\x63\x97\x3c\xbc\xef\xdd\xc4\x4e\x97\xae\xe7\x58\x0d" - "\x97\xb3\xc4\x46\x72\x7a\x5e\x9d\x29\x5d\xcf\xef\x56\x39\xa7\xe7" - "\xd8\x9b\x44\xcf\xef\xe6\x12\x3d\xc7\xea\xda\xe6\x3b\x38\xef\x86" - "\x12\x3d\xab\xd4\xf2\xd6\xf7\x5e\x2d\xba\xfe\xb1\x85\x9e\x0b\x69" - "\x81\xbe\x7d\x4e\xcf\x71\x5a\xd0\x73\xa1\xd4\xef\xee\xf0\xf5\xbc" - "\xd6\xc9\xef\x5c\xac\x7d\x08\xdf\xb9\x58\xeb\xc4\x77\x2e\xac\xbf" - "\xbb\xb3\xb6\xbf\x74\x3d\xaf\xd1\x73\xb9\xdc\x5a\x3f\x4e\xcf\x71" - "\x51\xd2\xf5\xbc\xa6\xc0\x39\x3d\xaf\x65\xbf\x7f\xb1\x66\x05\xd1" - "\xf3\xda\xfc\xb6\xf9\x1e\xcf\x1a\x0d\xd1\x73\xb7\x39\xf2\xd6\x4f" - "\x8f\xf3\x6b\x5d\xcf\xfe\x01\xb4\xc0\x7b\x0f\x4e\xcf\xf1\x0d\x46" - "\x2f\xff\x00\xa9\xdf\xff\xe1\xeb\x39\x3e\xd5\x39\x3d\xc7\x8f\x71" - "\x5e\xcf\xf1\x5d\x1e\xde\xf7\x7f\xd6\xdd\x97\xae\xe7\x75\x45\x5c" - "\x8e\x1b\x6f\xf1\xfe\x3f\x21\x40\xba\x9e\xd7\x39\xf9\x5d\xa0\xf8" - "\xad\x44\xcf\xeb\xd8\xef\x02\xc5\x27\xb6\xcd\x77\x81\xe2\xf4\x44" - "\xcf\xea\x5c\x79\xeb\xd3\x27\xb8\x38\xa0\xe7\x42\x5a\xe0\x9d\x10" - "\xa7\xe7\xf5\xc5\xa0\xe7\x42\xa9\xdf\x21\xe2\xeb\x79\x7d\x84\x73" - "\x7a\x5e\xef\xe9\xbc\x9e\x13\x2f\x3f\xbc\xef\x10\x25\x9e\x96\xae" - "\xe7\x44\xf3\xfb\x3f\x88\xcf\x89\x16\xef\xff\x36\xc8\xf8\x3e\x51" - "\xe2\x34\xe7\xf4\xbc\x7e\x26\xd1\x73\xa2\x9a\xe8\x79\x7d\x68\xdb" - "\x7c\x9f\x28\xa1\x88\xe8\xb9\x7b\x8d\xbc\xf5\xff\xd7\xb7\x3a\xfe" - "\x43\xa8\x7f\xc3\xdc\x2f\xc5\x69\x7a\x63\x96\xf3\x7d\x1c\x1b\xfd" - "\x9d\xd3\xf4\x7b\xd7\x9d\xd7\xf4\x7b\x47\x1e\x5e\x1f\xc7\x7b\x32" - "\xbe\xf5\xf7\x5e\x24\xd7\xc7\xf1\x5e\x1e\xa7\xe9\x8d\x95\xd2\x35" - "\xfd\x9e\xd6\x39\x4d\x6f\x1c\x4c\x34\xbd\xa1\x9a\x68\x7a\xa3\x4f" - "\xdb\xf4\x71\x6c\x48\x73\xae\x8f\x63\x63\x9e\x9c\x3e\x0e\x5b\x4d" - "\xbf\x1f\xed\x7c\x3f\xc7\xfb\x1d\x9d\xd3\xf4\xe6\x63\xce\x6b\x7a" - "\xf3\xa6\x87\xd7\xcf\xb1\x79\x89\x74\x4d\x6f\x0e\xe0\xfa\x39\x36" - "\xc7\x71\x9a\x7e\x3f\x5f\xba\xa6\x37\x19\x9c\xd3\xf4\xfb\x0a\xa2" - "\xe9\x4d\xc7\x89\xa6\x37\x37\xb4\x4d\x3f\xc7\xa6\x28\xe7\xfa\x39" - "\xde\x8f\x93\xd3\xcf\x61\xab\xe9\x6d\x41\xce\xf7\x75\x6c\xbd\xec" - "\x9c\xa6\xb7\x6e\x77\x5e\xd3\x5b\x67\x3e\xbc\xbe\x8e\xad\x63\xa4" - "\x6b\x7a\xab\x3b\xd7\xd7\xb1\x35\x94\xd3\xf4\xb6\x8d\xd2\x35\xbd" - "\xa5\xdc\x39\x4d\x6f\xbd\x48\x34\xbd\x25\x85\x68\x7a\x6b\x49\xdb" - "\xf4\x75\x6c\x19\xe5\x5c\x5f\xc7\xb6\x50\x39\x7d\x1d\xb6\x9a\xde" - "\xee\xed\x7c\x7f\x47\xd2\x11\xe7\x34\x9d\x14\xe1\xbc\xa6\x93\x06" - "\x3f\xbc\xfe\x8e\x24\x2f\xe9\x9a\xfe\x40\xc7\xf5\x77\x24\x59\xcc" - "\xff\xdf\x1e\x26\x5d\xd3\x1f\xe4\x3a\xa7\xe9\xa4\x03\x44\xd3\x1f" - "\x44\x12\x4d\x27\xe5\xb4\x4d\x7f\xc7\x07\x2a\xe7\xfa\x3b\xb6\xb7" - "\xba\xfe\x85\x50\x7f\x87\xad\xa6\x77\xd4\x38\xdf\xe7\xb1\x63\x93" - "\x73\x9a\xde\xe1\xef\xbc\xa6\x77\x28\x1e\x5e\x9f\x47\xf2\x4d\xe9" - "\x9a\x4e\x2e\xe0\xfa\x3c\x92\x2d\xc6\x3f\xa5\x0c\x92\xae\xe9\xe4" - "\x58\xe7\x34\xbd\x63\x1d\xd1\x74\x72\x00\xd1\xf4\x8e\x15\x6d\xd3" - "\xe7\xb1\xbd\xca\xb9\x3e\x8f\x1d\x0d\x72\xfa\x3c\x6c\x35\xbd\xb3" - "\xc8\xf9\x7e\x8f\x9d\x33\x9d\xd3\xf4\xce\x8e\xce\x6b\x3a\xf5\xe2" - "\xc3\xeb\xf7\x48\x3d\x21\x5d\xd3\xa9\x5b\xb8\x7e\x8f\x54\x8b\xf5" - "\xef\x3f\x44\xd2\x35\x9d\x3a\xc9\x39\x4d\xef\x9c\x4a\x34\x9d\xea" - "\x4e\x34\xbd\x33\xb8\x6d\xfa\x3d\x52\x0a\x9d\xeb\xf7\xd8\x69\x33" - "\xfe\x6d\xf9\xfc\xa5\x91\x9a\x77\x16\x2c\x58\x3e\x7f\x85\x66\xf9" - "\xe2\x85\x6f\xce\x1f\xdd\xdf\xfc\xff\xd1\xbe\xb1\xfd\x63\x3b\xa1" - "\xc8\x25\x11\xf3\x56\x0d\xe3\x76\x2e\x9e\xbf\x14\xfe\xe9\x84\xa2" - "\x22\x96\x47\x69\x56\xac\x8e\x9e\xaf\xc1\xff\x5b\xf2\x66\x34\x1c" - "\xf2\xce\x0a\x6e\xcb\xab\xf3\x17\x47\xc4\x2e\x5c\xfa\x96\x26\x62" - "\xf1\xc2\xb7\x96\x2e\x99\xbf\x74\x85\x26\x66\xfe\xb2\x95\x0b\x63" - "\xe6\xe3\xbf\x97\x6b\x16\xbc\x13\x03\x1b\xde\x9c\xbf\x70\xd5\x7c" - "\xcd\x1b\x2b\x17\x2c\x98\x1f\xb3\xbc\x13\x9a\xbc\x72\xf1\x8a\x85" - "\xd1\x8b\xe7\x6b\x82\x26\x8f\x19\x3c\x6d\xdc\x6b\xd3\x5e\x7a\xa9" - "\x13\xb2\xf8\xf6\xb4\x86\x4e\x9b\xe1\x0b\x1a\x72\xb9\xa1\xdc\x3b" - "\xf3\x9c\x37\x42\xdb\x41\x9b\x3b\x62\x90\x6a\x6b\x0c\x72\xd9\x72" - "\x0f\xb9\x6d\xbf\x87\xdc\x35\x8b\x50\x20\xed\x19\x9d\xb3\xe3\x1e" - "\x52\xd3\xdd\x1a\x0b\xe9\xd4\x3c\x1d\xed\x79\x40\xa3\xf7\x4c\x2d" - "\x84\x6d\x2a\x3a\x35\xa5\x02\xef\x03\x5f\xb8\xd0\xa9\x07\xb6\x5c" - "\x53\xee\xf5\xd6\x7b\xee\xcc\x4b\xb8\x89\x28\xba\x6b\xda\xa0\xcf" - "\x4c\x7a\xea\x24\x9e\x81\x04\xb6\x42\xca\xf4\x20\xf8\xf9\xc2\x4f" - "\x07\x3f\x3d\x52\x66\x04\xc0\x2f\x1c\x7e\x51\xf0\xbb\x80\x94\x1f" - "\xf5\x82\xdf\x24\xf8\xc1\xb6\x8f\x56\xc0\x2f\x11\x7e\x5b\xe0\x57" - "\x87\x94\x99\x6a\xf8\xf9\xc0\x6f\x14\x29\x27\x13\xff\x4e\x21\xe5" - "\x2e\x77\xf8\x05\x22\xe5\xc7\xb0\xfd\x63\x28\x67\x37\x1c\xf7\x31" - "\x9c\xf3\x71\x2e\xfc\x0e\xc2\xaf\x1c\x7e\xf8\xfc\x60\xb2\x6f\x77" - "\x11\xfc\x0c\x48\x99\x05\xd7\xca\x82\xeb\x67\x2d\x86\x1f\x5c\x27" - "\x2b\x09\x7e\x69\xf0\x2b\x84\x1f\x1c\x93\x05\xf7\x93\x0d\xe7\x64" - "\x87\xc2\x0f\xee\x25\xbb\x04\x29\xf7\xc0\xbd\xef\xd9\x88\xe0\x19" - "\xc9\x6f\x4f\x09\xf7\x37\xf3\x53\x59\xfd\xdf\xfa\xe7\xeb\xb1\xfe" - "\x19\x5d\xd1\xaf\x0d\x50\x6f\xd3\xf7\x19\x37\x20\xa5\x31\x75\x67" - "\x5e\xf4\xaf\x91\xe2\x96\x32\x7d\x49\x19\x90\x3f\xad\xca\xd3\x15" - "\xad\x69\xc2\xfb\x97\x60\x9b\xd5\x27\xa7\x2f\xd6\xa1\xed\x1a\x5c" - "\x3f\xa5\xe9\x33\x7d\x31\x7b\xfe\x41\x9d\xe2\x57\xc7\xf1\xf9\xf4" - "\x4e\xff\x8d\x74\x42\xd8\x6e\x3c\x0f\xf7\x06\xb6\x21\xae\x37\x29" - "\x7e\x95\xb4\x6a\xc8\x16\x1c\x63\x8a\xd6\x30\xf7\x35\x0e\xea\x5b" - "\x57\x38\x3f\x88\x06\x3f\xea\x3d\xc1\xe7\x1b\x90\x0b\xf3\xff\xd4" - "\xd4\x42\x3a\x27\xc2\x9b\xc4\x9d\x0c\x26\x7f\x69\xf4\x7a\x25\x1a" - "\xef\x6b\xd8\xdf\x4f\x45\xe7\xf6\xcf\x29\x5a\xda\x84\xaa\x94\x19" - "\x43\x21\xfe\x51\xf4\x80\x7e\x2a\x53\xc6\x2b\xd1\x85\xa0\x01\x7c" - "\xcc\xb1\xf8\x6a\xfc\x6f\x20\x3c\x37\x45\xa7\x4d\x0c\xc0\x7d\x40" - "\x45\xf1\x3b\x21\x26\xa7\x8f\x6b\xf4\x8a\x40\x9a\x57\x3c\xe8\x6b" - "\xec\x7d\xc1\x71\x15\x70\x1f\xcc\x79\x8d\x9e\x8d\x45\xb8\x6c\x63" - "\x4e\x44\x11\x6c\x73\xa1\x41\x7b\x70\x0f\x8a\x3b\x70\x9e\x31\xb5" - "\xb1\xb0\xe8\x15\xe6\x9a\xa5\x70\x9f\x54\xc2\x04\x28\xfb\x0f\x11" - "\x45\x87\xd7\x34\x50\x34\xbe\x77\x55\x63\x21\x68\xdd\xdd\x98\xfc" - "\xa1\xfb\xae\x6e\xc8\x25\x7b\x27\x42\x7b\xbb\x21\xb7\xfa\xe4\x8c" - "\x53\x3a\x17\xef\x2c\x12\xf7\xd2\x83\x28\x38\x46\xa7\xcc\xc8\xa1" - "\xc1\x1f\xcc\xb5\xd2\xc6\xe5\x8b\x5f\xeb\x23\xaf\x96\x6b\x65\x8c" - "\xcb\xc7\xd7\x22\xf6\x62\x6c\x45\xfe\x36\x97\x93\xdb\xcf\xce\x3d" - "\x7f\xe4\x89\xcb\xd0\x29\x3f\x72\xa1\x3f\xed\x57\x64\xcc\x98\x54" - "\x84\xf7\xe1\xe3\x49\x79\xa9\xd0\xa6\xa1\x3a\x1a\xb6\x19\x59\x1f" - "\x18\xb1\x0f\x3a\xe0\xf8\x95\x5e\x85\xaf\x07\xe7\x86\x1a\x37\x68" - "\x40\x37\x23\x82\x88\x5f\x3f\xca\x8e\x2d\xa6\x4d\xf0\x33\x0e\x29" - "\x46\x8a\xa2\x57\xb0\x4f\x3f\x3a\xae\x19\xff\x14\xd8\xf6\xa3\x13" - "\xac\x6d\x83\x1a\xfb\x44\x60\xbb\xa8\xc0\x16\xee\xf4\x66\x75\x09" - "\x53\x06\xd8\x1b\xdb\x68\x2f\xd8\x08\xec\xe4\x86\xfd\x5f\x9f\xfc" - "\x51\x8d\x95\x9d\x80\x83\x32\x91\x4e\xe1\xe5\x82\xb7\x69\xfa\x22" - "\xa2\x19\x8b\xe7\xc6\xfe\x35\xa6\xcf\xf0\xc5\xff\x9f\x3e\x10\xa9" - "\x3c\x8a\x11\xa5\x89\xf7\x29\x24\x7e\x9e\x18\xc0\xf9\xf6\xa3\x48" - "\x3a\xe3\x85\x2d\x70\xbc\x96\xd3\x55\x66\x9c\x31\x75\xc4\x28\x38" - "\x4e\xdf\x90\x1e\x94\x4f\xa7\x8c\x18\x85\xe7\x95\x5f\x53\x66\x32" - "\x73\xed\xe8\x0d\x6e\x88\x5c\x67\x44\x60\xfc\x62\x5a\x1f\x7f\x17" - "\x7c\xd0\x7d\xa2\xfe\xd8\x2a\x3d\xf8\x22\x28\x1f\xfb\xba\xf0\x41" - "\x03\x85\xd7\xfa\xa3\xbb\x7e\xf8\xfc\x1e\xe2\x73\x37\x78\x4e\x84" - "\xcb\x85\x7b\x3f\xce\x3d\x4f\x66\x38\xf6\x3b\x5c\x63\x1a\xb9\x36" - "\x94\x4b\xc1\x35\x3c\x47\x4c\x83\xe3\xaa\x74\x8a\x93\xc1\x4c\xbd" - "\x59\x45\x5f\xd8\xd1\x84\x50\xed\x2a\xda\x10\x62\xb8\x62\x82\xf6" - "\x16\xd5\x27\xef\x72\xd1\xa1\xdf\x86\x9b\xed\x42\xea\x52\x4b\x39" - "\xcc\x1a\x10\x7a\xa6\x9c\x5d\x83\x84\xca\x81\x6b\xd7\xcd\x33\x68" - "\x14\x4d\x0f\xe8\xf2\x1d\x33\xe0\xde\x36\x20\xba\x69\x15\x5d\xb2" - "\x2e\x98\x6e\x48\xfe\x06\x01\xf3\x54\x22\x88\xa1\xbd\xba\x2a\x68" - "\x7d\xc8\x6a\xe4\xd1\x35\xda\x83\x3e\x53\x5c\x89\xd6\x06\xd3\xd5" - "\x65\xb1\x46\x74\xae\xae\x0a\xc5\x5d\x42\xee\x09\xa5\x48\x1d\x17" - "\x4c\xeb\x4b\xc2\x2b\x11\xd9\x5e\x8a\x12\xae\x22\x97\xb5\xa7\xe8" - "\x86\x29\xd0\xfe\xfe\xb3\x12\x6f\xaf\x82\xed\x46\x94\x50\x4d\x1b" - "\xe2\xe7\x22\x77\xfc\x77\xe9\x29\xbc\xfd\x3a\x82\x7a\xea\x12\x12" - "\xab\xf7\xd8\x03\xd7\xc4\xe7\xef\x85\x7b\x31\x3d\xa0\x8f\xef\x78" - "\x80\xd0\xda\x99\xc8\x3b\x2e\x02\xa9\x42\x00\x03\xca\x0c\x47\x51" - "\x88\x91\x86\xf6\xfd\x34\x5a\xb7\x10\xb9\x85\x18\xf0\xbc\xf0\x8b" - "\xf0\xcb\x46\x7b\xe1\x58\x78\xb6\x22\xfc\x6c\x6b\x2f\x03\xef\xdc" - "\x36\x9f\x73\x82\x3d\xe7\x32\xc2\x36\x6b\xf4\x3c\xa0\x6a\x48\x3d" - "\x90\x02\xcf\xde\x80\x6d\x00\xd7\x29\x37\xe1\xf3\x1e\x30\xed\x0e" - "\xb6\x81\x62\x9e\x01\xea\x6a\xfa\xd8\x94\x79\xb1\x45\x4c\xb9\x3a" - "\xe5\xc7\x7e\x7b\x63\x98\x7b\xe2\x1d\x1b\x62\xa0\x6b\xf5\x5e\x63" - "\xa1\xac\x8f\xe7\x84\xc4\xbe\x44\x83\xfe\x14\xa0\x89\xd0\xfa\xe4" - "\x8f\xb3\xcc\xf6\xd6\xb5\xc4\x92\x8f\x53\xc0\x17\xa1\xca\x68\xe4" - "\x02\xfb\x8f\xeb\x14\xa7\x7c\x2c\xb4\x8b\xe3\x51\x07\xf3\xb1\xec" - "\x31\x3a\x9d\xe2\x1f\x8b\x2d\x8e\xc1\x7a\x6d\x39\xa6\x3e\x79\x37" - "\xe8\xff\xab\x15\xdc\xfe\x8f\xd4\xb4\x45\x19\x6c\xbb\x6a\x2e\x5b" - "\x09\xf1\x75\x8e\xd1\x6b\x22\xb4\xa3\x4d\xa1\x74\xad\xb7\x3b\x4d" - "\x81\x6f\x0c\x74\x83\x29\x7d\x44\x0a\xb4\x9d\xee\x65\x86\x3a\x44" - "\x8e\xdf\xbd\x9f\x4e\x6d\x0a\x23\x63\x59\x77\x6f\xc7\x65\x02\x63" - "\xe9\xa0\x1d\x56\x85\x14\xd3\x0d\x38\x2e\x18\xd3\xa9\xf2\xe4\x18" - "\x68\x8b\xd3\x27\xfa\x9a\xbc\xc6\x07\x36\xec\x8b\x50\xe1\x58\x4f" - "\x7b\xcd\xf0\xa5\x53\xe0\x5c\xb6\x1c\xb8\xae\xab\x4e\xb9\x3b\xd2" - "\x08\xe7\xd3\x69\x23\x52\xc8\x76\x12\xb7\x48\x7c\xd9\x1d\x49\xf7" - "\x87\x7d\x29\x43\xc2\x61\x9f\xeb\x35\xe5\x6e\x3d\x6c\x47\xf0\xff" - "\xcc\xa2\xf8\x7b\xb8\x8c\xfb\x44\xd3\x43\xe6\xf0\xfe\x4f\x61\x7b" - "\x7e\x14\x85\x63\x8f\xe6\x15\x5c\x66\x96\x17\x17\x67\x2c\x62\xb6" - "\xd7\x88\x9c\xfa\xe4\x2c\xad\x4e\xf1\x0c\xc3\x96\xf8\xbc\x3a\x26" - "\x5e\x41\xdc\xea\x13\xe1\xfd\x55\x30\x42\x5f\x9d\xc2\xf5\x28\x6b" - "\x92\x4e\xd1\x67\x0e\x67\xcb\xac\xf9\xf8\x58\x26\x86\xe0\x18\x4a" - "\x91\x78\x85\xcf\xa1\x33\x26\xea\x70\x1c\xc4\xf1\x50\xa7\xcc\x0a" - "\xc7\xb1\x10\xe2\x44\x30\xdb\xfe\x64\x32\xf1\x64\xe7\xc2\x62\xb8" - "\xaf\xc4\x6b\xec\xbd\x58\xde\x9b\x39\xf6\xd1\xa9\x8b\x82\xc9\xb1" - "\x23\xc2\xe0\xfa\x25\x3a\x45\x5f\x3f\x4b\xbd\x90\xe7\xca\x1e\x0a" - "\x9a\xae\x18\x72\x0a\xfe\x0f\x8c\x74\x4d\x99\x11\x46\x27\x7f\x38" - "\x1e\xe2\x8b\x1b\xd6\x29\x8e\x91\x99\x3b\x91\x4b\x43\xea\xa2\x30" - "\x63\xea\x22\xd0\x5d\xb6\xda\x1c\x57\xf0\x79\xb8\x2e\x40\x6c\x71" - "\x63\x62\x86\xd1\xa0\x64\xea\xbb\x11\x0d\x6a\x89\x23\xb0\xad\xd1" - "\x73\x51\x28\xbb\xdd\x85\xb9\x9f\x0d\x4a\x13\x5c\x5b\x61\xbe\xf7" - "\x46\xcf\x11\xc1\x50\xee\x62\x9d\xc2\x83\xa7\x67\x7a\xe7\x20\x44" - "\xd3\x61\x58\x33\x4a\xb8\xcf\x54\xf8\xf7\x29\x56\x83\x9d\xbf\x2a" - "\x46\x28\x08\xa2\x4f\x2d\xf8\x72\x57\x77\x5a\x0f\xe7\x1f\xd4\xa1" - "\xc5\x4c\xac\xde\x0a\xff\xc7\xdb\xf1\x31\xb0\xfd\x14\x6c\xaf\x23" - "\xe5\x7e\x14\x85\x7d\x63\x55\xee\x4d\x52\x2e\x73\x2f\x9d\x71\x99" - "\xf8\x3c\x5c\x66\x76\x06\x5d\x83\xcb\xa9\x4f\xde\xe3\x66\x2e\x7b" - "\x3b\x6c\x33\x97\x1f\xb4\xc4\x7c\x8d\x3d\x5a\xd8\x1f\x67\x79\xef" - "\x99\x19\x74\x1d\xb9\xaf\x3d\x41\x3a\x94\x58\x8d\xf7\x6d\x81\x6d" - "\xf8\x5c\xe2\xff\x3d\x11\x58\x1b\x3a\xf2\x3c\x4a\xa2\x91\x3d\xd1" - "\x3a\x94\x10\x6d\xd9\xde\x80\x0f\xba\x90\xf6\x70\x67\x1e\x5b\x5e" - "\x9a\xb9\x3c\xae\x2c\x52\x06\x9d\xf2\x76\xa0\x45\x7d\x74\xc7\xe5" - "\xc3\xf1\xf0\xfc\x4b\x4f\xb1\xcf\x3f\xad\x8e\xe8\x19\x6c\xbf\xe7" - "\x26\xb6\x3d\x6e\xfb\xb0\x9f\x99\x6b\xec\x8b\xf0\xc6\x7e\x07\xff" - "\x4f\x33\xb7\x8f\xe0\x9b\xa0\xfa\xe4\xbd\x6e\x5c\x5b\xb2\xa7\x12" - "\xfb\x1b\xca\x8a\x85\xf6\x28\x1c\xc7\x23\xf6\x9a\x4b\x70\x9b\x68" - "\x7e\x7e\x28\xc7\x05\x58\x64\x01\xd6\x35\x66\x11\xda\x2b\x48\x03" - "\xe5\x84\x5a\xb5\xb1\x2e\xec\x71\xbb\xf1\x31\x1f\x76\xa7\xab\xe1" - "\x98\x15\xe6\x63\xf0\x7e\xb0\xf3\x6f\x61\xdb\x16\x1d\xfa\x20\x09" - "\x6f\x4b\x86\x63\x20\x7f\x13\x9d\x93\x13\xdf\x07\x51\x65\x59\x3a" - "\x9c\xaf\xe2\x3a\x3c\xaa\xac\x57\x1d\x2a\xcb\x32\x21\xd3\xa7\x3e" - "\x81\x81\xf1\x74\xd1\x0d\x65\x8e\xeb\xb9\x86\x6a\x24\x8d\x31\xf7" - "\x96\x33\x7a\x6c\x82\xbc\x2a\x6e\x18\xc2\xfc\x71\x47\xb9\xcf\xbf" - "\x4c\x7f\x8f\x89\x67\xf0\x37\xb3\x5e\xe4\x87\x90\x87\xe1\x5c\x0c" - "\xf2\xed\xa8\x14\x8a\xe4\x63\x26\x38\x76\x0f\xde\x8e\x73\x35\x68" - "\xa7\xf6\x5a\xec\xa3\x3f\xed\x5b\x44\x6c\x97\x73\x9b\x89\xeb\xf8" - "\x7e\x0d\xbf\x2b\xc2\xf7\x6c\xca\xed\x5b\x84\x9f\x21\x21\x96\x36" - "\x95\x19\xea\x8b\x70\x5b\xa6\x59\x85\xf3\xc8\x9c\x33\x21\xd9\x88" - "\x36\xed\xef\x2b\x31\x8f\xcb\x61\xc6\x7f\x42\xae\x7d\x47\xdf\xbf" - "\x6f\x51\x82\x11\x51\x3b\xe2\x5d\xdd\xc6\x66\xd1\x45\xb5\x03\x7c" - "\x02\xeb\x93\x73\x6a\x4e\xc6\x22\x24\x9d\xbf\x73\x6a\xcc\xcf\xbe" - "\x87\x7d\x76\xd8\xc6\x7c\xb3\x71\x48\x66\x22\xf3\xbc\x3a\xe5\x3e" - "\xd1\xbe\x3e\x7a\x83\x07\xfd\x55\x96\x01\x2d\xcf\xa2\x9b\x96\x67" - "\x43\x2c\xcc\x08\x50\x1d\xde\x53\x81\x63\x77\xa0\xd9\x9e\x8c\xed" - "\x0c\x7a\x14\x1d\x8f\x3c\x6e\x29\xf7\x95\x86\xc4\x21\xe6\xbb\x4c" - "\x5f\xc2\x71\xd2\xee\x75\x1f\x33\xbe\xf2\x1c\xe4\xee\xd0\x5e\x9b" - "\x48\xfb\xb3\xef\xfe\x14\xb6\x3c\xbc\xcf\xec\xbf\x3d\x6c\x4e\x2d" - "\xe3\x1a\xa2\xdf\x3f\xb2\xf3\xac\x2a\xe1\x67\xfd\xc3\x31\xf9\xcf" - "\xfa\x87\x8d\xb6\xcf\xfa\x87\xab\x0f\xf7\x59\xff\x50\x2d\xe3\x59" - "\x35\xc2\xcf\xfa\xc9\x7e\xf9\xcf\xfa\x49\xb4\xed\xb3\x7e\x52\xfa" - "\x70\x9f\xf5\x13\xd1\xf1\x1f\x76\x9e\xd5\x57\xf8\x59\x73\x53\xe5" - "\x3f\x6b\xee\x1c\xdb\x67\xcd\x3d\xf6\x70\x9f\x35\xb7\x48\xf4\x59" - "\x29\x0f\x1a\xc7\x27\x88\x4b\x4d\xf1\x8d\xc0\x6d\x19\x93\xcb\xd7" - "\xed\x43\x54\x49\x5d\x03\x3a\xd7\xab\x02\x25\xac\x46\xd4\xf3\xd1" - "\x10\xf7\x36\xa0\x51\xf4\xce\xc6\xf2\x73\x59\x35\xb0\xfd\x06\x2a" - "\x8d\x6d\x40\x81\x31\x38\xfe\xee\xdf\x54\x16\x29\x35\xfe\xee\x0f" - "\x6d\x89\xbf\x86\x61\x6c\xcc\xfd\xf4\xc8\xb9\x9a\x26\x84\x9f\x1f" - "\xfe\xce\x6e\x89\xbf\x1b\x88\xbd\xad\xe3\x2f\xb6\x47\x59\x43\x03" - "\x2f\xfe\x92\xb9\x59\x9f\x2e\xb4\x8e\xbd\xc9\xb7\x10\x12\x8e\xbd" - "\x9f\x8e\xc3\xb1\x77\x0f\xec\x97\x76\xff\x9f\xaa\xcc\xb1\x37\x05" - "\xae\x69\x19\x7b\xbf\x8a\xc4\x6d\xf4\xa7\x51\xf2\x62\xef\xa7\x51" - "\xe6\xe7\xce\x66\x9f\x1b\x6c\x55\xc2\x8f\xbd\x9f\xe6\x38\xa2\x5b" - "\x3a\x63\x98\xfe\x70\xef\x06\x57\x53\x6e\x7f\xa6\x7d\xab\x07\x9b" - "\xfc\x75\x4f\x83\xcb\x0d\xe5\xff\x68\x98\x3e\xd4\xfa\x48\x05\x9d" - "\xdb\x2f\x2f\x64\x05\x7d\x85\xee\xdf\x1f\xe1\xfe\x51\x9c\xe7\xc3" - "\xfe\xe9\xf4\xfe\x7e\x79\xd2\xee\x9b\x94\x09\xed\x5f\x60\x3c\xd4" - "\x97\xc3\xab\x1a\x28\xd3\xda\x30\x0f\xf0\x83\x8a\x4e\x7f\xc1\x97" - "\xde\xec\x73\xb0\x36\x7d\x52\xce\x69\xed\x75\x84\x8f\xa5\xd7\xbb" - "\x04\x3a\x71\xff\x3a\xfb\xf7\x9f\xe7\x25\xe3\xfe\x75\x12\xee\x5f" - "\xe7\xd0\xfd\x77\x87\xfb\x6f\x0a\x70\x85\xbc\x90\xfa\xb2\x29\xc0" - "\x45\xda\xfd\xe4\x89\x7e\xff\xfc\x21\x5e\xc3\xe1\xf8\x47\x77\x0f" - "\xf2\x3d\xbc\x47\x4f\x41\x0c\x60\xda\x70\x5c\xf7\x48\xfc\xab\x86" - "\x7c\xf6\x0a\x4d\x62\x92\x5e\x62\x4c\x3a\x20\xba\xfe\xa5\xed\xf5" - "\x03\x52\x1e\xc1\xf5\xc5\x9f\xdf\x3a\x26\x7e\x36\x40\x23\x1a\x13" - "\x33\x5e\x48\xb1\x8d\x89\x7f\xdc\x25\x3d\x26\xfe\x31\xd2\x36\x26" - "\xfe\xe9\x34\x17\x13\xff\x74\x44\x7e\x4c\xfc\xd3\x3a\xc7\x63\xe2" - "\x9f\x66\xca\x8b\x89\x7f\xf2\xb1\x1f\x13\xff\x14\x27\x2f\x26\xfe" - "\x29\xce\x36\x26\xfe\x51\xc7\x8f\x89\x7f\x12\xfd\xd6\x19\x9d\xf2" - "\xab\x62\x68\xa3\xdd\x6f\x29\x0f\x6e\x34\x6c\x40\xc8\x94\x92\x51" - "\x0c\xed\x6c\x3d\x9d\xfa\xab\x62\x13\xe5\x87\xe3\x4a\x60\x7d\x7d" - "\x94\x9b\xe9\x5d\xad\x3b\xdd\x6d\x48\x27\xba\xd9\x1b\xf7\x27\xfa" - "\xc0\xfd\x7b\xd0\xf5\xda\xae\xf4\xbb\xda\x6e\x59\x0f\x90\x1a\x7e" - "\xde\x59\x6c\x7b\x0c\x7f\xfb\xd2\xef\x7a\x77\x4a\x5e\x85\x06\x79" - "\xd4\x21\x37\xb8\x87\x30\x8f\xf5\x2a\x1c\x83\xd4\xf8\x6f\x7a\xc3" - "\x5f\xb4\x7b\x1f\x20\x17\x8f\x58\xf0\x8d\x27\x5c\x2f\xd6\x83\xa6" - "\x97\x6b\xd1\xde\x18\xe4\x66\xa2\x90\xf7\x1e\x8a\xce\x37\xd4\x6b" - "\x29\xa3\x7a\x62\x28\xf1\xcf\xa1\x00\x26\xf7\x4a\x9b\xd8\xcb\xd4" - "\x7d\xa2\x8b\x31\x21\x4a\x49\xaf\x0d\x53\xe2\x7b\x35\xa6\x4d\x44" - "\x74\x06\xfc\x12\xa2\xba\x62\x86\xde\xbb\x0a\xae\x5d\xef\xdd\x69" - "\x07\x5c\x7b\xcf\x2a\xe4\x93\xfd\x00\x69\xe9\x5a\x2d\x05\xfe\x0f" - "\xc3\xdf\x37\x05\x1b\x85\x99\xa8\xbf\x68\x61\x9f\x0b\x8e\x89\x34" - "\xbe\xbe\x01\xae\xdf\xac\xc5\x7d\x59\xa0\x6d\xe4\xbd\x17\xae\x6f" - "\x7c\x57\x2b\xb1\xbe\x1c\x62\xc6\x7f\x9b\xef\xcb\x34\xe8\x79\x0d" - "\xfd\x19\xfc\xf0\x7d\x81\x0d\xf7\x62\x9b\x3c\xff\xbc\x0f\xbe\xb7" - "\xed\x0f\xd0\x20\xb8\x4f\x1f\xb8\x07\x2d\x5c\x17\xaf\x0d\x13\xf6" - "\xfa\x32\x15\xd6\x28\xef\xde\x8c\xa9\xec\xbd\xfd\x04\xf7\x76\x87" - "\xbb\x37\x7c\x2d\x6c\x1f\xb1\xf7\xae\x21\xeb\x7a\xe3\xba\xf9\xa3" - "\x47\xec\x53\xc1\xf8\x1d\x6c\xed\xda\x28\x89\x5a\x3d\x54\x2e\xa6" - "\x97\x1d\x9f\xa1\x5e\xb4\x2a\xa5\x78\xca\xa6\x2b\x34\xee\x2b\xdc" - "\xf4\x19\x1a\x54\x06\xf5\xfa\x5c\xc3\x6d\x44\x7b\xa6\x14\x9f\xd6" - "\xd6\x48\xbc\xd6\x67\xa2\xf3\xdf\xb7\x6d\xa0\xcb\x4d\xea\x89\x81" - "\xb4\x7a\x52\xe6\x8e\x0d\x74\x6c\xb3\x4f\x5f\x5d\x93\x4f\xbf\xfc" - "\x79\x06\x15\xe8\x9a\x8e\xd5\xc4\x20\xcd\x0d\x65\xc1\xfa\xb3\x17" - "\x20\x2f\x9d\x85\xdc\xae\x29\x0b\x0a\x13\x2e\xe1\xf7\x53\x9f\x95" - "\xf0\xdf\x4f\x7d\xa6\x47\xca\xfc\x70\xa4\x3c\x12\x8d\x94\x9f\xa7" - "\x21\x38\x8e\xff\xfb\x73\x3e\x29\x2b\x7f\x74\xc8\x81\xde\x28\xde" - "\x40\xff\x48\xa7\x34\xbb\x25\x53\x74\x43\xc8\x40\x85\xae\x68\x15" - "\x7e\x6f\x93\xef\x0f\x36\xfd\x2f\xb4\xb5\x1e\xf0\xb7\x02\x7c\x8a" - "\xa2\x63\xd0\x2f\x6e\x29\xf3\x11\xae\x37\x1e\x75\x4f\x05\x1b\x13" - "\xc2\x90\x41\x13\xa1\x6a\x4e\x9b\xe8\x6b\x4c\x1b\x91\x62\x52\x65" - "\x14\xe3\xbe\x5e\xfc\xbe\x15\xea\x46\xd8\x3c\xa3\x1b\xae\x8f\x61" - "\x45\x6f\x9c\x45\x37\x56\x20\x2a\xe1\x3e\xea\x02\xda\x6c\xa9\x57" - "\x93\x6b\x3c\x1a\xd6\xd5\xd0\x26\x5c\xb7\x70\xdf\x2a\xec\xeb\x1a" - "\x7f\x1f\xf2\x7b\x7d\x35\xca\x8a\x41\x6a\xe3\xf2\xa8\x6e\xfa\xda" - "\xa8\x5f\xec\x36\x21\x75\xd7\x3a\xa4\xca\xba\x07\x9a\x5a\x0e\x7a" - "\xba\x07\xf5\x4c\x4f\xea\x19\x9e\xdf\xbf\x07\xd7\xb1\x6d\xdf\x4e" - "\xda\x7b\x8f\xd4\x31\x46\x47\xb8\x8e\xbd\x03\x3a\x5a\x8a\xdb\x0f" - "\xd0\xd1\x06\xa8\x63\x50\x2f\xe8\xe4\x43\xf9\x59\x1b\x68\xdc\xf7" - "\x4b\xed\xbd\xf5\x14\xde\xa7\x70\x1d\x48\x69\xce\x86\x36\x20\xae" - "\xaf\xa3\xe0\x58\x53\xff\x7e\xf9\x9a\x57\xe9\x9f\xae\x29\xf3\x07" - "\xc1\x76\x37\xcd\x8c\x67\x55\x60\x6f\x76\xee\x51\x41\x21\xee\xcf" - "\xd4\x81\x2d\xb0\x5d\x34\xaf\xa2\x67\xaf\x29\x0f\x2b\xb0\x1d\xdf" - "\xcd\x43\xca\xe8\xdf\xd2\x55\x60\x33\xa6\x6c\x9d\xf2\x30\xe3\x13" - "\xfc\x4e\xff\x9f\xcc\xfb\x32\x72\x8e\x11\xec\x66\x50\x35\x85\x81" - "\xbf\xc3\x8b\x16\x35\x31\x71\x08\xdb\xf1\xc6\x62\x44\xcd\xab\x01" - "\x5b\x19\xc1\x56\xf5\x5a\x77\x88\x47\xa1\x38\x1e\xd1\x29\x43\x5c" - "\xe2\x74\xb4\x29\x24\x52\x49\xc7\x2f\x43\x6e\xb8\x8f\xfb\xf5\x68" - "\x44\xaf\xbb\x0d\xf6\xaa\xab\x40\x10\x97\xba\x42\xcc\xea\x96\xbd" - "\x0a\xa9\xb1\xbd\xba\xd4\x00\xab\xec\xdc\x59\xf4\x59\x7c\xb1\xab" - "\x11\xf4\x8b\xe3\x93\xc7\x7a\x45\x47\xa8\x67\x5d\x93\x70\x7d\x84" - "\xfa\xe9\xb1\x9e\x89\x97\x61\x59\x50\x0f\x0d\xef\x6a\xfb\x36\xbf" - "\xab\xd5\xc0\xaf\xb7\x39\x86\x99\xe3\x07\x9d\xfc\x99\x37\x8e\x5f" - "\x65\xb1\x3a\x64\x00\xdb\x76\xc5\x6d\xdd\xbb\xda\x5e\x8c\x8d\xdf" - "\xd2\xa2\x21\x0d\x48\x01\xf7\xa4\x82\xfb\x45\x7b\x17\x20\xb7\xd2" - "\xa8\x6b\xc8\x08\x75\xc3\x6c\xf7\xc9\x0b\x35\x08\xca\xa5\x4e\x6b" - "\x2f\x22\xd6\x66\x0a\x71\xdd\x7d\xbe\x9d\xd3\xdd\xe7\xdb\xb1\xed" - "\x88\xee\x3e\x4f\xfa\xbf\xa8\xbb\x7f\x86\x31\xba\x53\x36\xf7\x67" - "\xf4\xe4\x56\x66\xf8\x1c\x6c\xf4\x79\x2c\xd6\x08\xd6\xcc\x99\x3f" - "\x62\xcd\xfc\x39\xa7\xbd\x6a\xa6\xb1\x5e\xab\x81\xdf\x23\xd1\x0c" - "\x94\xcb\x68\x06\xdb\xea\x9f\x61\x4d\xc8\x6c\x23\xa6\xae\xa6\xa4" - "\x14\x6b\x12\xd0\x4b\x50\x57\x0b\x3d\xd6\xf7\x46\xa5\x8c\x9d\x0a" - "\x0a\x35\x33\x68\xd3\x35\xe5\x9f\x2f\x25\x9c\x47\xaa\xa6\x0d\x34" - "\x5d\x66\x38\x84\x4c\xea\xf1\x81\xb8\xaf\xdd\x94\x46\x95\x43\xce" - "\x5a\x48\xa7\x1e\xd0\xe0\x77\xc1\x1e\xd1\xb8\x0f\x3e\xb5\x10\xbf" - "\xe3\x33\xa5\xa6\x54\xd0\x9e\x07\xb6\xe0\xf7\x0c\xa6\xd4\xe8\x1c" - "\x93\x67\x9e\xae\x3e\xb9\x40\xa3\x43\x17\xf2\x99\xbe\xf0\xb4\x89" - "\xb8\xef\x15\xc7\xdf\x09\xe4\x9d\x18\x7e\xa7\x58\x10\x68\x7e\xa7" - "\x8d\x63\x02\xfb\x9e\x81\x7d\x0f\x51\x80\x7d\xd8\x09\xbf\x87\x60" - "\x63\xca\x50\xf3\x7b\x08\xf3\xff\xf1\x7e\x38\xcf\x8f\x79\xc7\xca" - "\x9d\x97\xcf\x1e\xc7\x9e\xf7\xd9\x51\x1c\xeb\xb9\xf3\xc8\xff\xa1" - "\x1d\xc9\x6f\xa6\x90\x9b\x20\xe3\xa8\x67\xf8\x42\xfd\x81\xdc\xe8" - "\x2f\x43\xe1\x5f\xea\x86\xf2\xe8\x54\xf8\x57\x09\xff\x32\xfd\x98" - "\xd2\xda\xab\x82\x1a\xf2\x2e\x68\xd2\x29\xf6\xbe\x6f\x33\x75\xf2" - "\xd7\xa8\xcb\x2d\xf6\xef\xfa\xe4\xa3\xc1\xe6\x77\xf3\x2d\xc7\x73" - "\xfe\xa9\xc2\xd7\x06\x1f\xb9\x90\xf1\x02\xe4\xff\x78\x2c\x0e\x5b" - "\x1e\xf3\x7f\x93\x4f\xff\x9c\xa2\xf8\x6b\xa8\x46\x79\xb4\xa0\x0c" - "\xda\x70\x53\xc6\xa4\x53\xf8\x1d\x19\xae\x57\xe6\xeb\x42\x5d\x74" - "\x2b\x5a\xc3\x1c\x93\xce\x70\x6e\xda\xd8\x1c\x7a\x67\x53\x39\xce" - "\x05\xeb\xe9\xa8\xdf\xb2\xff\x8e\xc6\xf5\x89\xf4\x9b\xfc\x45\x41" - "\x83\x6f\xf1\xf7\xd9\x5b\xc6\x27\xe1\xef\xa6\x27\xba\x68\x4e\xc6" - "\x91\xb6\xd2\x7c\xbf\xf8\xdb\xea\x78\xfc\xcf\xb3\x89\x28\xb1\x5e" - "\xe0\xdb\xea\xdc\x38\xa1\xa3\x35\xa6\xf4\xb1\x39\xf5\xc9\x7f\x19" - "\x05\x3e\x88\xb3\x7c\x66\x21\x5f\xe8\x94\x7f\x09\x13\xdb\x27\xcd" - "\x0f\x7f\x59\x21\x56\xce\x38\xad\x91\x96\x58\x96\x78\xff\x8f\x4f" - "\xdf\xc0\x90\x3c\x63\x91\xa9\x39\xcc\xe3\x74\xdc\x6d\x89\x6c\xf3" - "\x57\x6f\xb1\x72\x8d\x69\xe3\xc3\x9b\x07\xf4\x0d\x04\xdf\xb8\x1b" - "\xdf\x09\xfb\xdd\xb9\x3c\x03\x3a\xb0\xb4\x9a\xc2\xf1\xf0\xe0\xad" - "\x7c\x2a\x64\x20\xcb\x70\x55\xf8\x9d\x2b\x6d\xc2\x2c\x97\x7c\x07" - "\xf9\x34\x25\x84\x79\x34\x35\x87\xa1\x0f\xee\xa0\x51\xa6\xb7\xbc" - "\x3b\x25\x2d\x40\x2e\x8d\x10\x0b\x1b\x7f\x8c\xf2\xf8\x67\x65\x35" - "\xfa\x12\xce\x3d\x57\xa7\x43\x7b\xe0\x58\xfa\xc7\xb0\xae\x40\xcd" - "\x0d\x25\xe1\x9f\xa3\x10\xad\xb1\x28\xfe\x2a\xea\x02\x31\x51\x55" - "\x16\xbb\x1f\x72\xa8\xdb\xc8\x75\x35\xa5\x29\x33\x5c\x47\xdb\x17" - "\x40\x2c\x85\xd8\x99\x30\x1d\xda\x0c\xd0\xc4\x6e\xcb\x36\x63\xd1" - "\xc7\x5c\x9b\xf1\x13\xb4\x19\x3b\xa1\xcd\x48\xf0\x46\xe7\xa2\x8b" - "\x10\xc4\xb0\xa7\xa6\x44\x7b\x34\xc4\x47\x43\xdb\xb1\x1a\xda\x8e" - "\xd8\xeb\x88\x69\x37\x6a\xaa\x11\xc4\xfc\xae\xd9\x4b\x91\xba\xe9" - "\x27\x68\x3b\x7e\x82\xb6\x23\x9e\xb4\x1d\xbb\xee\x40\xdb\xf1\x0e" - "\xe4\x06\x4b\xa1\xed\xa8\x11\x68\x3b\xee\x08\xe7\x05\xe6\x38\xd8" - "\xf8\x93\x96\xda\x05\xed\xc6\x9a\x8b\x88\xda\x35\xe3\x29\x89\x9a" - "\x29\x14\x9d\xff\x43\x67\x4c\xfa\xc4\x44\x87\x21\x6c\xf7\x35\x0d" - "\xd0\x0e\x83\x5f\xca\xb4\x06\xe4\x71\xe1\xa9\xe0\x46\xd8\xde\xdc" - "\x7d\xb8\x2a\xef\x3b\x3d\x45\xa7\xbd\xe0\xdb\x08\x7e\x5b\xb3\x12" - "\x51\xcd\xe0\xc3\x83\xaf\xa6\x50\x38\x4f\x34\xa5\x0f\x9f\x46\x72" - "\xd2\xbf\x9d\xc4\x7d\x22\x1e\x3a\xe2\x37\x03\x1d\xe6\x41\xbf\x19" - "\xd6\x65\xfb\x1b\xc8\xc5\xf8\x83\x77\x27\xd3\x9b\xde\x6e\xf1\x17" - "\x91\x4a\xff\x66\x14\xd8\xeb\x36\xfa\xf2\x9b\x14\x6a\xef\x2c\xa4" - "\xc1\x6b\x31\xd2\x9b\xcb\x54\x7b\x5f\x47\x01\x7b\xff\x83\xfc\xf6" - "\xcc\x42\x83\xb2\xbf\xc3\x6b\xb6\x83\x0f\xab\xe9\x86\xd2\xa8\xbf" - "\xa1\xbd\xdf\xa1\x40\x3a\x63\x84\x8a\xf6\x1a\x1f\x0e\x7f\x07\xa4" - "\xcc\x82\xfc\x01\xf6\x87\x68\x1b\x8b\xca\x62\x4b\x51\xd2\x35\x84" - "\xe2\x6f\xb2\x3e\x6e\xf1\xef\x65\x64\xa0\x20\x7e\x60\x26\x98\x4c" - "\xfc\x8b\xdf\x83\xe1\x9c\xa3\xc5\xc7\x0b\xfe\xc1\xe7\x02\xd6\xc7" - "\xa5\x35\xe5\x08\xda\xc0\xa7\x5a\xf8\x80\xf1\xf1\x65\x64\x66\x03" - "\xf0\x4d\x57\x60\x01\x75\x63\xad\x15\x1f\xc4\xc8\xe4\x03\x36\xbf" - "\x31\x2c\xff\x7f\xed\x5d\x0d\x60\x54\xc5\xb5\x9e\xbd\xb9\x24\x4b" - "\x48\xb2\x9b\xb0\x09\xcb\xff\x0a\xa1\x8d\x96\x9f\x00\xbb\x0a\x3e" - "\xec\x8b\xd6\x9f\xf8\x8a\x8a\x7d\xd4\x46\x45\x1b\x34\x60\x90\xbf" - "\x08\x11\x22\x20\x09\x18\x7d\x68\x31\x59\x43\xa0\xa9\x04\x12\x2b" - "\xed\xc3\xf7\xa0\x4d\x5b\xb4\xb1\x0d\xba\x4a\xb4\x11\x63\x12\x30" - "\x2a\x5a\x6c\x57\x8a\x18\x21\xe0\x42\x56\x13\xf2\xb3\xd3\x73\x66" - "\xe6\x66\xef\xde\xdd\x90\xcd\x82\x16\x53\x2e\xdc\xdc\xbd\x33\x67" - "\xce\x9c\x99\xef\x9c\x33\x67\x66\xef\xde\x49\x92\x4a\x25\x4a\x72" - "\xdf\x21\x52\x89\xa7\xaf\x18\xff\x69\x23\xf3\xb7\x3b\xc6\xee\xe4" - "\xcf\xe5\xbc\x7c\x03\x62\xe1\x0c\x7b\xf9\xfa\x1f\x27\xe9\x48\x88" - "\xd8\xdb\x7b\xc1\xbe\x91\x63\x5f\xb5\x37\x44\xec\xed\x80\x7d\x66" - "\x68\xd8\x7f\xd9\x47\xec\xd9\x3b\x2d\xfb\x29\xf6\x55\x1b\x7c\xb1" - "\xff\xf3\xb5\x1c\xfb\x3f\xa7\x84\x8e\xbd\xb5\x17\xbb\xb7\x0a\xbb" - "\x7f\xe5\xe5\xd0\xb0\xb7\xa2\xdd\x3b\x42\xc3\xfe\x64\x1f\xb1\x67" - "\xef\xc5\xec\xa7\xd8\xbf\x92\xef\x8b\xfd\xde\x6b\x38\xf6\x7b\x67" - "\x9c\x07\xf6\xbd\xd8\xbd\x55\xd8\xbd\xe3\xc5\x10\xb1\x07\xbb\x6f" - "\x30\x87\x86\xfd\xc7\x7d\xc4\x9e\xbd\x5b\xb3\x9f\x62\xef\xc8\xf3" - "\xc5\xfe\xd5\xe9\x1c\xfb\x57\xa7\x85\x8e\xbd\xad\x17\xbb\xb7\x09" - "\xbb\x7f\xfd\x77\xa1\x61\x6f\x03\xbb\x6f\xc8\x0a\x0d\xfb\xbd\x7d" - "\xc4\x9e\xbd\x9f\xb3\x9f\x62\xff\xfa\x1a\x5f\xec\x5f\xb3\x71\xec" - "\x5f\xb3\x9e\x07\xf6\xbd\xd8\xbd\x4d\xd8\x7d\xf5\xee\x10\xb1\x47" - "\xbb\xaf\x09\x0d\xfb\x47\xfb\x88\x3d\x7b\xc7\x67\x3f\xc5\xbe\x3a" - "\xc7\x17\xfb\x7d\x93\x39\xf6\xfb\x92\x83\xc1\x7e\xb5\x1a\xfb\xc3" - "\x11\xa9\x30\xb7\x62\x71\xfe\x0b\x77\x09\xec\x7f\x0d\xd8\x43\xfb" - "\x77\xdd\x51\xa2\x89\xf1\xdf\x7c\x8e\xe1\x9e\x0e\xb8\x3f\x02\xb8" - "\xc3\xdc\x50\xc1\x1c\x30\x8a\x46\xdc\x11\xf3\xb5\x1f\x13\xe3\xab" - "\x50\x16\xf1\x41\x8c\x01\x47\x0b\xc3\x39\xbc\xde\x48\x75\xb2\x19" - "\xf1\xc4\xb8\x1f\x31\xef\x2d\xb6\x47\x9d\xe8\x15\xf3\xdb\xbf\x9e" - "\xf8\xbe\x5d\xbb\xfe\x77\xa1\x30\x3f\x00\x73\xb8\xb5\x7d\xc5\xfc" - "\xcd\x45\xbe\x98\xbf\x71\x39\xe2\xe0\x0c\x7b\x23\x29\x74\xcc\xad" - "\xf6\x9e\x31\x57\xc6\xf8\x9a\xcd\xe7\x87\x79\x83\xd9\x8b\xb9\xd5" - "\x7e\x6e\xcc\x3f\x0e\x01\xf3\x0b\x3b\xbe\x5f\x5c\x98\xd7\xa4\xfb" - "\x62\xfe\x97\x91\x1c\xf3\xbf\x8c\xe8\x09\x73\x0f\xf8\x6b\x5c\x53" - "\xc7\xdf\x1c\x76\xb5\xa6\xdd\xd4\x01\xb8\xe2\x6f\x0f\x71\xad\x77" - "\xf7\x92\x4a\xa9\x03\x70\x2f\x5c\x41\x12\x37\xae\x20\x33\x0c\x4d" - "\xdc\x7f\xb7\x83\xff\x7e\xf2\x2b\x22\x7b\x16\x9a\x23\x37\x1e\x27" - "\x72\x3b\xf4\x71\xfb\xc2\x4c\x43\x6d\xba\x8b\xbc\x7a\xaa\x52\xc2" - "\xb5\x5b\xfc\xde\x8e\x9e\x48\x8b\xb9\x39\x83\xb6\xd5\x1e\x2d\xe2" - "\xeb\x2a\x9f\x2a\xeb\x2a\xbb\x7d\xd6\x55\x7e\x76\x5c\xac\xab\xdc" - "\xc9\x31\x2a\x55\xe3\x73\xef\x2f\x7b\x58\x57\xa9\xe9\x75\x5d\x85" - "\xad\xa7\x9c\x22\xa6\x8e\xa5\x99\x71\xbf\x10\xeb\x2a\xcf\x2e\x39" - "\xbf\x75\x95\xf6\xa5\x49\xd2\xb3\x80\xcf\xea\x3b\x01\x9f\x8f\xfa" - "\x8a\xcf\x7e\x12\xec\xba\x8a\x32\xc6\x2a\xe3\x2a\xda\x1c\x8e\xad" - "\x6d\xc5\x53\x4d\xda\xb5\x14\xb4\xb7\x53\x61\xb5\xb1\xe8\x93\x43" - "\x5b\x4f\x39\x60\xf9\xb6\xad\xa7\xa0\xcd\x29\xe3\xec\xc5\x31\xc6" - "\xbe\x7d\xd8\xd7\xf6\xf6\x6f\xe6\x63\xec\xfe\xe2\x60\xe3\xab\x73" - "\x60\x5e\xac\x5d\x43\xe1\x98\xd7\x0d\xc0\x35\x97\xd0\xd6\x51\x0e" - "\x64\x7f\xdb\xd6\x51\x2e\x3e\xcc\xdf\x69\xf0\xc5\xbc\xf6\x49\x8e" - "\x79\xed\x86\xf3\xc7\xdc\x6a\xd2\xae\x9d\x70\xcc\xeb\xcf\xe2\x5a" - "\x4b\x68\xeb\x27\x07\x42\x8c\xa5\xff\x75\xeb\x27\x17\x1f\xe6\xf5" - "\xd5\xbe\x98\xd7\x3d\xca\x31\xaf\x5b\x73\x01\x30\x2f\xd6\xae\x99" - "\x70\xcc\x0f\x9c\xc4\xd8\x2b\xb4\x75\x93\x83\x23\xbe\x6d\xeb\x26" - "\x17\x1f\xe6\x07\x2a\x7d\x31\x6f\x78\x88\x63\xde\x90\x75\xfe\x98" - "\xdb\x4c\xda\xb5\x12\x8e\xf9\xbb\x9f\xe0\xda\x4a\x68\xeb\x25\x07" - "\xbf\x75\xeb\x25\x17\x1f\xe6\xef\xee\xf2\xc5\xfc\xe0\x3c\x8e\xf9" - "\xc1\x8c\x0b\x80\x79\xb1\x76\x8d\x84\x63\xfe\xde\x7b\xb8\xa6\x12" - "\xda\x3a\xc9\xc1\xea\x6f\xdb\x3a\xc9\xc5\x87\xf9\x7b\xe5\xbe\x98" - "\x37\xde\xc9\x31\x6f\x4c\x0b\x76\xce\xac\xcc\x95\x95\xf9\x31\x9b" - "\x2b\x9b\x20\x66\xd7\xac\x8d\x70\xbc\x3f\x78\x8d\xc5\xec\x21\xcf" - "\x95\x0f\x58\xbe\x2d\xeb\x23\x0a\xd6\x38\x5f\xbe\x38\xe6\xca\x1f" - "\x68\xbe\xff\x7c\xff\x66\x3e\x57\x7e\x3f\xb5\x27\xac\x03\x3d\x8b" - "\x50\x07\x73\x4d\xe5\x59\x84\x27\x57\x00\x8e\xa0\x07\xf8\x2c\x02" - "\x3e\x93\x10\xe8\x79\x04\x7c\x0e\x41\x79\x26\x41\xfd\x3c\x42\xaa" - "\x93\xb6\xe1\x33\x09\x38\x4f\xae\x4d\x7f\x8a\x28\xcf\x26\xe0\x33" - "\x08\xb9\x9f\x90\x68\xc4\x08\x9f\x3f\xc0\xf9\xf2\xd7\xfd\x0c\x42" - "\x89\xe7\x62\x78\x06\xe1\xc3\xf1\xbd\xcd\x95\x6f\x79\x61\x14\x01" - "\x7d\xeb\x5e\xa7\xea\xd8\x32\xd5\x88\x36\x87\x18\x19\x9a\xb9\x1d" - "\xee\xbe\xa3\x42\xaa\xcf\xa9\x24\x4f\xae\x22\x46\x65\xfd\x02\x6d" - "\x10\xfc\xb2\xa1\x13\xf0\xdc\xf8\x20\x5f\xc7\xf0\x9c\x48\x8b\x76" - "\x2d\xcc\x34\xe0\x6f\xf7\x5f\x7d\xbf\x42\xc2\xb5\xc7\xb2\xf9\xc4" - "\xba\xf5\x18\x99\x56\xe7\xfe\x98\x30\x9b\xda\x3c\x35\x15\xca\x26" - "\x77\x6c\xbe\x31\xdd\x13\x3f\xd5\xea\x8a\x9f\x3a\x0d\x71\xdb\x78" - "\x9c\x10\xb4\x2f\xc4\xad\x3e\x67\x5b\x37\x5e\x0c\x2b\x49\xac\x6d" - "\xf4\x68\x53\x07\x43\xc6\xac\xf4\x14\x60\xb6\xd4\x17\xb3\x6d\xa1" - "\xae\x6f\x28\xcf\x73\x2f\x4d\x92\xb6\x81\x4d\xad\xba\x1d\x30\xfb" - "\x51\x5f\x31\xfb\xc8\x19\x02\x66\xf6\x20\x31\x6b\x0c\x02\xb3\xcc" - "\x00\x98\xd5\x40\xd9\x0a\x81\xd9\x1e\xc0\xac\xd2\x8b\xd9\x97\x41" - "\x62\xa6\x9d\xc3\xf6\x27\xcc\x0e\xf7\xb8\xff\x4b\xcf\x98\x59\x83" - "\xb4\x33\x6b\x30\x76\xe6\xf0\xc7\xcc\x0a\x76\x66\x15\x76\x66\x05" - "\x3b\xb3\xaa\xec\xec\x64\x90\x98\x69\xe7\xa0\xfd\x09\xb3\xbf\xa5" - "\x86\x80\x59\x90\x76\x66\x0d\xc2\xce\x1a\xcc\x01\x30\x03\x3b\xb3" - "\x0a\x3b\xb3\x82\x9d\x59\x55\x76\xf6\x71\x90\x98\x69\xe7\x90\xfd" - "\x09\xb3\xbf\xf7\xfc\xfb\xef\x1e\x31\xb3\x05\x69\x67\xb6\x20\xec" - "\xac\x21\xcb\x1f\x33\x1b\xd8\x99\x4d\xd8\x99\x0d\xec\xcc\xa6\xb2" - "\xb3\xbd\x41\x62\xa6\x9d\x03\xf6\x27\xcc\x3e\xa9\x08\x01\xb3\x20" - "\xed\xcc\x16\x8c\x9d\xd5\x04\xc0\x0c\xec\xcc\x26\xec\xcc\x06\x76" - "\x66\x53\xd9\xd9\xa3\x41\x62\xa6\x9d\xc3\xf5\x27\xcc\xfe\xd1\xe3" - "\xfe\x4f\x3d\x61\xc6\xf0\x82\xd8\x31\x20\x66\xed\xbe\x71\x63\x27" - "\xc4\xf1\xf8\x9d\x57\x40\xbc\x9e\xa8\x37\xd2\x75\xb2\x19\xb1\xc2" - "\x78\x10\xf1\xaa\xcf\x79\x83\x04\x8a\x1b\xf1\x7b\x31\xc0\x9d\xe0" - "\x77\x63\xb9\x9f\xf6\x21\x5e\xbc\xaf\x27\xac\x7a\xff\x3e\xac\x74" - "\x89\x17\x2b\xe5\xfb\xb0\x0b\x8a\xd5\xc1\xbe\x62\xf5\xa9\x31\x34" - "\xac\xac\xf6\xde\xb1\xb2\x36\x9e\x1b\xab\x06\xb3\x17\xab\x8f\x55" - "\x58\xf9\x8f\x63\xc1\x63\xa5\x19\xbf\xfa\x15\x56\xc7\xaa\x7a\xc2" - "\xaa\xd3\x74\x63\x3a\xfe\xe6\xfd\x56\x98\xfb\xd2\xfb\xd3\x6e\x2a" - "\x38\x42\x12\x9f\x3a\x42\x66\xe0\xef\x9b\x77\xaf\x6a\x93\xa0\x8d" - "\x9f\xed\x6f\x6c\x22\x1d\x27\xcc\x91\xf8\xfb\x19\xe6\x27\x17\x9a" - "\xf5\xf5\xe9\x2e\xe6\x13\x9f\x06\x8c\xea\xdc\x95\xd0\x27\x11\xa9" - "\x75\xee\xdf\x93\xf6\xe5\x69\xe4\xed\xc3\xc7\x01\x17\xda\x51\xdf" - "\x5c\x49\xca\x20\xdf\xb1\xe2\xf7\xc4\x73\x22\x29\xf2\xa7\x39\x44" - "\x3a\x15\xf6\x59\x1e\xce\x9d\x27\xe5\x10\xe3\xcc\x66\xda\x56\xd7" - "\xbc\x9f\x6c\xbd\x8f\x24\xbe\x91\x43\x08\xf6\x35\x9b\x2b\x3f\x88" - "\x73\xe5\xbd\x3e\xf8\x3c\xab\x9a\x2b\xb3\xdf\xcb\x66\x01\x36\xa7" - "\x35\xd8\xc0\x5c\x1c\xfa\x3a\xe2\x56\x37\x60\xe3\x56\xb0\x39\x49" - "\xd6\x3e\x84\xd8\x38\xbd\x73\x65\x81\x4d\x29\xfa\xbc\x2c\xd5\x5c" - "\xf9\x94\x0a\x1b\xf1\x5b\x55\x1f\x6c\x94\xb5\x8c\x95\x49\xf8\x1d" - "\xb9\xdf\x5c\x39\xb4\xb5\x8c\xa6\x1e\x7f\x2b\xc2\xec\x08\x6c\xe4" - "\x56\xb0\xa3\x35\xd9\xcc\x8e\x78\xff\x27\x4c\x05\x7d\xaf\x20\x06" - "\x67\x44\xea\x53\x80\x41\x3b\xd8\x1a\x8e\x45\xb9\xd0\x4e\xc4\x12" - "\x71\xbb\x75\x67\x47\xc7\xbd\x6e\x22\x81\xcf\x9a\x8d\xd8\x75\x9d" - "\x30\xeb\x0b\x60\xac\xaa\x9f\xf3\x11\xe0\x73\x86\xd4\xbb\x04\x36" - "\xab\x3e\x22\xa7\xc2\x3e\x37\xd1\x85\x49\x91\x13\x41\x4f\x61\xec" - "\x31\xfe\x14\x7f\xfb\x02\x3e\x6f\xeb\x7c\x32\x6d\x66\x16\x6d\x63" - "\xcf\xf2\x80\x8d\xe1\x78\x86\xfe\xb0\x2e\xeb\x75\xd2\xb5\x79\xaa" - "\xb5\x23\xfe\xc6\xf4\x37\xb2\x09\x41\x9f\x88\x58\x0c\x78\xd8\x8b" - "\x1d\xfe\x6e\x4f\xbd\xd6\xe1\xe7\x0b\x1f\xdc\x1f\xd8\xbe\xe6\x38" - "\xfb\xb4\xde\x51\x2a\xec\xab\x34\xd4\xf5\x0e\x65\x3d\x0a\x30\xc4" - "\xdf\xea\xe5\xbe\x47\xa4\x67\xfb\x8c\xe1\xf1\x11\x21\x60\x68\xef" - "\x1d\xc3\x56\x05\xc3\xc6\xde\x31\x3c\x7e\x28\x00\x86\x15\x2a\x0c" - "\x33\x55\x18\xd6\x08\x0c\xf7\xa8\x30\xac\xec\x1d\x43\xcd\x5c\xba" - "\x5f\x61\x78\xe2\xdc\xeb\x1f\x01\x31\xb4\x06\x61\x87\x5f\x08\x0c" - "\xad\x41\xd8\x61\x73\xa9\x3f\x86\x56\xb5\x1d\x3a\xbc\x18\x5a\x85" - "\x1d\x5a\x55\x76\x68\x0d\xc2\x0e\x35\x73\xeb\x7e\x85\xe1\xc9\x1d" - "\x21\x60\x18\x84\x1d\xfe\x5d\xc1\x30\x08\x3b\x3c\x95\x1e\x00\x43" - "\x95\x1d\x42\xec\xe2\xc5\x50\xd8\xa1\x55\x65\x87\xd6\x20\xec\x50" - "\x13\xab\xf4\x2b\x0c\xbf\xc8\xec\x3b\x86\xb6\x20\xec\xf0\x55\x81" - "\xa1\x2d\x08\x3b\x74\x25\xfa\x63\x68\x53\xd9\x61\x43\x96\x17\x43" - "\x9b\xb0\x43\x9b\xca\x0e\x6d\x41\xd8\xa1\x66\xee\xdd\xaf\x30\x3c" - "\x7d\xee\xf5\xff\xc0\x18\x06\x61\x87\xb9\x0a\x86\x41\xd8\xe1\xe9" - "\xa6\x00\x18\xaa\xed\xb0\x46\x85\xa1\xb0\x43\x9b\xca\x0e\x6d\x41" - "\xd8\xa1\x66\x2e\xde\xaf\x30\x3c\xe3\x0a\x06\x43\x88\xb3\xfd\xe3" - "\x52\xb7\x17\x43\x35\x7e\xda\x58\xf4\x36\x88\x51\x11\xbb\x39\x9d" - "\x44\xf2\xc7\xaf\x65\x27\xe2\x37\x1e\xbf\x8f\xfb\xd2\x1b\x93\x32" - "\xec\xc4\xf7\x39\x88\xd9\x1b\x19\x84\x60\x7c\xaa\xc4\xa3\xf8\x9d" - "\x6a\x77\x3c\x3a\xef\xdf\x35\x1e\x75\xef\xea\x3b\x76\x62\x1c\xec" - "\x11\x3b\xdf\xb1\xef\x36\x18\x13\x7b\xc6\xee\xcb\x0c\x7f\xec\xac" - "\x15\x5e\xec\xf8\xb8\xc7\xb1\x6b\x30\x2b\xe3\x1f\xc7\x4e\x8c\x7f" - "\xe7\xc4\xae\x3f\x8f\x7f\x5f\xf5\x38\xfe\xd9\x25\x4f\x05\x9c\x95" - "\x70\x3a\xe0\xac\xe9\x92\xc8\x0d\xdb\x24\x0f\x7f\x8e\x91\xeb\xb3" - "\x36\x3f\x9c\x3e\x31\x3c\x1d\x69\xe8\x3a\xd9\x84\x74\x0a\x8f\xae" - "\x48\x42\x20\xdd\x61\xd0\xa5\xe3\x5e\x23\x48\x1b\xa1\xf0\x32\xac" - "\x23\x29\xd0\x66\x4e\x27\x91\x3c\x4e\x97\x12\x8e\x74\xb4\xe0\xa5" - "\x6c\x48\xd3\x0b\x9e\x6c\xde\xd3\x25\x49\xc8\x4b\x5b\xf7\x40\x41" - "\x63\xe9\x5a\x4f\x2c\xea\xba\x81\x17\xd6\xa9\xd0\x45\x22\x5d\x97" - "\xe4\x6a\xeb\xd2\xc9\x89\x6a\x3a\x7a\x1d\x51\xd3\x0d\x12\xfc\x92" - "\x7c\xda\x31\x86\x10\x83\xce\xc2\xdb\x92\x23\x29\x6d\x89\x62\x3c" - "\x63\xf6\xd4\x02\xcf\xf1\x3e\x3c\xc3\x09\x89\x06\x7a\xe4\x1b\x9d" - "\xc9\xe4\x46\xfa\x68\x1a\xde\x28\x33\xfe\x3a\x39\xd9\x23\x91\x64" - "\xde\x2e\x22\x6f\xeb\x96\xd9\x42\xec\xbe\x75\xc4\x28\xfd\xa5\xa6" - "\x43\x1a\x2a\x75\xd3\x18\x98\x1c\xe1\xef\x9a\x41\x8e\x69\x6a\x39" - "\x38\x1d\x99\x2c\xe8\x70\xed\x71\x46\x37\x96\xf6\x8e\x6e\xac\x73" - "\xbb\xc8\x50\xc0\xc2\x51\x0f\x5a\x21\xfa\x21\x96\x16\xfc\x51\xe9" - "\xff\x14\x35\xcf\x68\x9d\xce\xb9\x4d\xf4\x97\xa7\xe0\xa5\x2a\xa0" - "\x8d\xf3\xac\x93\xaf\xef\xe6\xbb\x1e\xdf\x29\x25\xfa\x61\x7d\xe7" - "\x60\xc6\xb7\x09\x6c\x4b\xd2\x59\x44\x3f\x0c\x46\x5a\x28\x93\xca" - "\xdb\x65\xec\xc6\xb5\x4b\x92\x31\xcf\xa1\xa2\x35\xf1\x3e\xae\x3e" - "\x04\x6d\x9b\xe9\x4f\xaf\xd7\xd2\xc7\x73\xfa\x4a\x17\xd0\xcf\xf2" - "\xa7\x37\x6a\xe9\x13\x38\xfd\x9f\x9a\x81\x7e\xb6\x3f\x7d\x67\x9c" - "\x86\x7e\x08\xa7\xaf\x6a\x02\xfa\x34\x7f\x7a\x8b\x96\xde\xcc\xe9" - "\xdf\x44\x1d\x99\xe3\x4f\x9f\xa2\xa5\x1f\xca\xe9\x5f\x39\x0a\xf4" - "\xe9\xfe\xf4\x79\x5a\xfa\x61\x9c\xde\xe1\x04\xfa\x0c\x2d\x7d\x19" - "\xa3\x25\x63\x04\xed\x70\x4e\xfb\xfa\x61\xa0\xcd\x0c\xd0\xd6\x30" - "\xc1\x3b\x59\xd0\x8f\xe0\xf4\x7f\x4c\x07\xfa\x45\x01\xb0\xd2\xd2" - "\x8f\xe4\xf4\xef\x13\xa0\xcf\x0a\x80\x95\x96\x7e\x14\xa7\xdf\x9f" - "\x0a\xf4\xd9\x01\xb0\xd2\xd2\x8f\xe6\xf4\xb5\x33\x80\x3e\x27\x40" - "\xdf\xfb\xd2\xc7\xd4\x25\x03\xdd\x9a\x6d\xeb\x15\xfb\xf1\xe9\x77" - "\x2d\xef\xcb\x38\xef\x86\x44\x28\x93\x17\xa0\xdf\xb5\xf4\x63\x38" - "\xfd\x41\xb4\xb9\x7c\x7f\x7a\xa2\xe3\xf4\x64\x8a\xa0\x1f\xcb\xe9" - "\x1b\xa3\x80\x7e\x43\x80\xbe\xc7\x7c\x87\xb0\xd3\x44\x4e\x5b\xe3" - "\x00\xda\x8d\x01\xfa\x5d\x4d\x3b\x8e\xd3\xfe\x63\x17\xd0\xda\x03" - "\xf4\xb9\x9a\xf6\x3b\x9c\xf6\xc3\x6c\xa0\x2d\x0e\xd0\xdf\x6a\xda" - "\xef\x72\xda\xbf\x26\x01\x6d\x49\x00\x79\xc7\xa8\x68\x93\x38\xed" - "\x61\xd4\xab\xd2\x00\xb8\xa8\x69\x2f\xe7\xb4\x9f\xa6\x01\x6d\x79" - "\x00\x5c\xd4\xb4\x57\x70\xda\xbf\xd9\x81\x76\x47\x00\x4c\xd4\xb4" - "\xdf\xa3\x31\xce\xeb\x85\x6f\xdd\xa9\xa5\x05\x1d\x70\x80\x1f\xaa" - "\x01\x5f\x38\x9e\x16\x7c\xd2\x56\xc6\xfd\x1a\x8b\x5f\x14\x1a\x2a" - "\x75\x4e\x55\x8d\x03\x13\x68\xc1\x07\xcd\xc2\xff\x55\x68\xf9\x51" - "\x49\x56\xd3\x4e\xa4\x05\x2d\xd3\x04\xed\x1e\x7f\x5a\xbd\x9a\x76" - "\x12\x2d\x68\x2a\x17\xb4\x95\xfe\xb4\xc6\x6e\x5a\x5a\x70\x3c\x03" - "\x68\xaa\xb6\x0b\xbf\xaa\x92\x73\x8a\x8a\xdf\x64\x5a\xd0\x9c\x24" - "\xf8\x39\xfc\xf9\x59\xd4\xb4\x53\x68\x81\xdb\x2d\x68\xab\xfd\x69" - "\x53\xd4\xb4\x53\x69\xc1\x49\xa5\xfd\x35\xfe\xb4\x79\x6a\x5a\x2b" - "\x2d\xf8\xa2\x42\xd0\xd6\x6a\x69\xb7\xf3\x31\x48\x12\x38\xd9\x68" - "\xc1\xe9\x6c\x41\xdb\xe0\x33\xc6\x4a\x3a\x66\x63\xdb\x39\xdd\x95" - "\x34\xe6\x33\x65\xac\x6c\xf4\x19\x5b\xd7\xeb\xe2\x70\x4c\xd9\x86" - "\x78\x3e\x31\xb6\x13\x68\xaf\x12\xfc\x0e\x69\xc7\x3e\x21\xdf\x34" - "\xc8\x3b\xac\x8c\x4f\x30\xee\x38\x03\xc5\x3d\x59\x57\x90\x41\xc7" - "\xc3\xa8\x8b\xbf\x93\x4a\xec\xfb\x25\xeb\x98\x5f\xf2\xec\x18\xe3" - "\xbc\xcd\x4d\x3b\xd5\x69\x85\x12\x6d\x98\xe4\x26\x32\xbe\xaf\x8f" - "\xc6\xcf\x2c\x71\x42\xba\x6b\xdc\xd8\x8a\xd6\x02\xda\xe9\xd4\xbd" - "\xd3\x86\xef\x6f\x6a\x2d\x82\x58\x8b\x6c\xb0\xe3\xe7\xc2\xf5\xb8" - "\x3f\x49\x8a\xae\xab\xa8\xbd\x01\xf7\x33\x29\x83\xfb\x02\x38\xd9" - "\xde\x21\x59\x10\x03\x3f\x41\x52\x1c\x2b\x3a\xc9\xb1\x1c\x22\xb1" - "\x3d\xf0\x64\xf2\x63\xba\x34\x73\x06\xc8\x62\x84\x7a\x33\x8e\xc0" - "\x3d\x93\x05\xf7\x5e\xb0\xb7\x37\x3b\x96\xb5\x23\xcd\x0b\xae\xf8" - "\x3b\x8c\xf4\xb1\xbb\x3f\xcf\x5a\x4b\x46\x1f\x97\xc9\x4e\xe5\xfd" - "\x55\xec\x9d\x55\x5f\x64\x7e\x9f\xbd\xaf\x4a\xd6\xdd\xe0\x89\x6d" - "\x6f\xd6\xbe\xaf\x8a\xd7\xa3\x4b\x6e\xc1\x3d\x7d\xca\xe7\x56\xb0" - "\xf7\x61\xc9\x3a\xb6\x8f\x10\xc8\xdb\x40\x13\xc7\xd4\x78\xda\xf3" - "\xf3\x70\xcf\x3a\xc7\xda\xe3\xe4\x88\xc8\x43\xfe\x82\xaf\x0e\xf9" - "\x21\x5f\x85\x27\x96\x73\x5d\x36\xb7\x02\xfb\x03\xfa\xa6\x26\xe8" - "\xf7\x5f\xc9\xc4\xc5\xde\x7f\x55\xa4\x9b\xe1\xd4\x0d\x6b\x64\xef" - "\xbf\x52\xda\x13\x3c\x8f\x52\xe4\x11\xf8\x5d\xbf\xc4\x40\x9f\xe9" - "\xd0\x03\xff\x52\x88\x7f\x77\x72\x7c\x74\x3b\x9d\xba\xe8\xc3\xe2" - "\xf3\x1e\xa7\x2e\xd6\x2c\x3e\x3b\x9c\xba\xd7\x36\x88\xcf\xb5\xca" - "\x3b\xc8\x02\xf2\x35\xb6\x1f\x06\x3c\xdc\x9e\xad\x69\x7a\x8c\xd7" - "\xf9\xbb\x50\xdb\x0f\x5b\x46\x11\xdd\x31\x59\x9a\x45\x9f\x69\x77" - "\xf3\xbe\x92\x2e\x87\xab\x41\x5c\x5d\xe2\x4a\x91\x86\xe9\x9c\xe9" - "\x96\x1a\x6a\x9f\xee\x60\xfa\x20\x4b\xd7\x62\x1a\xc3\x16\xf0\xa7" - "\xb1\xd3\x1d\x8c\xef\xe6\x3b\x8c\x6a\x19\xf0\xc7\x82\xc9\x93\xa7" - "\x4c\xb5\xda\xae\xbc\x6a\xda\xf4\xb9\xf7\xdd\x9f\x31\x6f\xfe\x03" - "\x99\x0b\x1e\x5c\xb8\x68\xf1\x92\xa5\x59\x0f\x2d\x5b\x9e\xfd\xf0" - "\x8a\x95\x39\x8f\xac\x42\xba\x6e\x79\xb7\x5e\xaf\x73\x4b\x04\xf0" - "\xbc\x0e\xeb\x79\x91\xd5\x0d\x69\x1c\x7b\x69\x87\x6c\x09\x3c\x2f" - "\xa8\x37\x13\x82\x7b\x86\x34\xcb\x61\x3a\xdc\xc3\x04\xf4\x50\x57" - "\x5f\x7a\x93\x03\xf7\x62\x3b\x2a\x4b\xee\x3a\xd7\x4d\x0e\xdc\x3b" - "\x70\x9f\xb9\x89\x24\x8e\x21\xba\xe3\xb2\xe4\xc4\xfc\xb2\xef\x10" - "\x52\x0d\x65\x03\xf1\x1c\x63\x24\xe6\x4d\x09\xd4\x55\x9c\x40\x9b" - "\x91\x7f\xf1\x16\xda\xe4\x5a\x9d\x49\x0a\xe0\x1e\x74\xd3\x78\x4c" - "\x0e\x7b\x71\x1f\x44\xff\x9e\xf5\x64\xc4\xf6\x2d\xf4\x68\x7e\x02" - "\x3d\xfa\xd8\x16\xda\x5c\x96\x40\x9d\x89\xc5\x24\xaa\xb5\x28\x2c" - "\xd3\x29\x4b\x0e\x66\x5f\x90\xef\x89\x93\xd2\x0b\x21\x6f\x52\x27" - "\x09\x2b\x83\x7b\x48\x73\xef\xb3\x70\xb9\x7f\x7b\xa6\x6d\x00\xf0" - "\x9b\x49\x3b\x16\xe9\x0a\xa0\x1e\x8e\x49\xd8\x87\xf8\xcb\x77\xa8" - "\xcf\x55\xdf\x76\x84\x38\xe5\xb0\x43\xb8\xa7\x12\xd4\x67\xa8\x2f" - "\x69\x26\xc8\xef\x37\xcb\xda\x06\x2c\x1f\x46\x3b\x81\xb6\xd2\xb3" - "\x7a\x91\x0e\x68\x8a\x81\xb7\x5b\xdd\x9e\xa4\xf9\x8b\xb3\x2d\x4b" - "\x1e\x5e\xb4\xe8\xf2\x48\x92\xc4\xae\x44\xbd\x8f\x60\x36\xf0\x23" - "\x9b\xb6\xd0\x6a\x68\xa7\x03\xda\x5b\xf3\x0e\xcc\x40\x40\x3f\x08" - "\xb4\xc9\x7e\x4c\x96\x27\x40\x7a\x15\x7c\xae\x02\xd9\x6b\xd8\x1e" - "\x65\x72\xfc\x9d\xb4\x28\xec\x28\xc8\x89\x63\x16\xbe\x53\x90\xb4" - "\xac\x9c\xad\x83\x76\x17\x03\x5d\x8d\x65\x18\x19\x07\xe5\x5e\x04" - "\x39\x76\xc0\x67\xa4\x9f\x8b\x38\x02\x7d\x35\x6f\x57\x3c\x7b\x97" - "\x20\xf4\x95\x63\x5b\x02\xdd\xd8\x5a\x24\xdb\xf1\x1d\xae\x6c\x1f" - "\x1a\xb8\x87\x7e\xa9\x01\x5a\x7b\x4b\xee\x6c\x1d\xee\xb9\x59\xe6" - "\xe5\x99\x8e\x32\xa1\x1c\x38\x1f\x7e\x1b\x22\x4a\x4f\x47\x1a\x99" - "\xd0\x46\x74\x6f\x1f\x25\xa4\x74\x0b\x2d\x87\xb3\x14\xce\x92\xfd" - "\x90\xf7\x16\x9c\x35\x90\x5e\x0b\xd7\xfd\x70\x7d\xeb\x28\xfb\x7e" - "\xd5\x8c\x72\x2f\x5f\x43\x9b\x26\x95\x90\xb1\x6c\x4f\xcf\xb5\xe4" - "\x27\x47\x64\x53\x05\xca\x8e\xef\x6b\xa6\x71\x03\x12\x7d\xde\x2b" - "\x2b\x87\x97\x10\xc8\x87\xeb\x2e\x7e\x55\x9f\xe1\xe0\x65\x23\x4c" - "\xfc\x73\xc4\x1c\xb8\xcf\x17\x9f\xb3\xe0\x5c\xd3\xfb\xa9\xe5\xd7" - "\xd3\x19\xd1\x14\x3c\x6d\x30\x67\x7c\x62\x70\x74\x03\xcb\x89\x3c" - "\xa8\x8d\xc8\x51\xc9\xbe\xe9\x51\x7a\x9e\x66\x6c\xe4\xf7\x46\x27" - "\xbf\xc6\x46\xc1\x09\xfd\x14\x07\xfc\xe3\x52\x79\x5a\xdc\x6c\xb8" - "\x96\xc2\xb9\xd3\xb7\xfe\x78\x28\x1f\x3f\x03\xf1\xec\x80\xf1\x00" - "\xb1\x74\xca\xb2\x1b\x31\x2a\xe4\xba\xa5\xc3\x67\x28\x20\xcd\x05" - "\xba\x55\xea\xd5\x9f\xf0\x4f\x7d\xf5\x27\xbc\x41\xa3\x3f\x76\xf4" - "\x47\x50\x6e\x46\x19\xd7\x97\xaa\x96\xd5\x19\x70\x1f\xde\x08\x7c" - "\xaa\x2c\xf7\x22\x8f\x08\x36\xbf\x2b\x3c\x0e\x73\xe1\x4c\x22\xa3" - "\x7f\x69\x96\x23\xc6\xa1\xce\x62\xdd\xa2\x5e\x2e\x0b\xc8\x07\x69" - "\xe5\x28\xdf\x52\xe0\x0b\xf7\x3b\x80\xae\xbc\x9e\x9c\x51\x64\x63" - "\x65\x9e\x7a\x10\xf4\x51\xc8\x8b\x3c\xb1\x1c\xf5\xb6\xcb\x85\x65" - "\x44\xdd\x1f\x42\x3a\xce\xb1\x49\xee\x69\x12\x56\xdf\xe9\x24\xa8" - "\x93\x78\xad\xef\x4c\x06\x5b\x4a\x25\x1e\x1c\x0b\xcd\x04\xdf\x67" - "\x39\xf0\x88\x1c\x51\x35\x71\x0d\x49\x46\x7e\xe8\xc3\x9d\x72\x44" - "\x5e\x19\xda\x22\xe7\x75\x00\xdb\x81\xfc\xf7\xc3\xac\x06\xaf\xdb" - "\x51\x1e\xc8\x57\xd5\x5b\x8c\x73\xe7\xc2\x55\xbc\xad\x50\xd7\x0e" - "\x28\x5f\x81\x6d\xc7\xfe\x84\xfc\xca\x63\xb2\xde\x8c\x79\xb8\x67" - "\x8b\x68\xcf\x0e\xfc\xbd\x07\xf6\x07\xd2\xe3\xde\x96\xec\x3d\xb5" - "\xb2\x7c\x0d\xeb\x37\x28\x8f\x78\x50\xa8\x03\x79\xe4\x76\xd2\x4e" - "\x0a\xfe\xe8\xf9\x55\x6d\x10\x83\x0c\x7c\xc6\x17\x1f\x7d\x96\x1a" - "\x1f\x28\x57\x01\xe5\xab\x71\x5c\x46\x7f\x02\x75\x1a\x30\xe6\x80" - "\x34\xbb\xa7\x08\x78\xac\x68\x63\x6b\x4b\xc0\x67\x1d\xc8\x62\x47" - "\x3e\x20\x4f\xb5\xe0\x55\x85\xef\xb0\x54\x63\x2d\xf8\xed\x40\xcc" - "\x99\x3d\xaf\x62\x6d\x02\xdf\x35\xf0\xf6\xed\x3c\xaf\x12\x68\x2a" - "\x69\x47\x2a\xa1\xab\xd3\xf8\x5e\x6d\x3c\x6f\x4f\xee\x59\x86\x6f" - "\x35\xf7\x6b\x03\x1f\x5a\xfe\x28\x6d\xf2\xca\x3d\x30\x49\x79\x57" - "\xbb\x90\x7b\x0f\xd6\x47\x57\xce\x61\xe3\x28\xd6\x81\xe5\x05\x3f" - "\x19\xf9\x29\x7d\x35\x11\xe4\xe0\xfd\xa5\x9f\x06\xe9\x3b\x50\x17" - "\x59\xbf\x81\x1f\x6d\xc9\x45\x5d\x1c\x38\x1e\xca\x57\x15\xe0\xfd" - "\x4a\xbc\xd7\x3b\x98\x8f\xed\xce\xd7\x67\x63\x3e\xae\x4d\x14\x2e" - "\x04\x5d\xf2\x10\x32\xd6\x44\x92\xdd\xeb\x59\xdb\x76\xb9\x57\x5f" - "\xaf\xdb\xd7\x49\x08\xca\x09\x7d\x54\x09\xb2\x36\x82\xef\x37\xa1" - "\xac\xe0\xaf\xf7\xd0\xe7\xd3\x08\xca\x0c\xfe\x4c\xc8\x17\x79\x83" - "\xc0\x7e\x0f\xb6\x11\xfb\x73\x22\xf7\x7d\x90\x37\xe8\x73\x94\xdd" - "\xdb\xee\x48\x8b\xba\x8f\x59\xbb\x01\x07\xc4\x0b\x71\xf1\xf2\x1c" - "\x88\xba\x6f\x07\x5e\xbb\xf8\x3d\xd7\x0d\xec\x6b\x7b\x02\xad\x45" - "\x7a\x2f\xed\xa0\x3b\x31\x6f\x2d\xd4\x3d\x29\x0b\xd7\x61\x60\x7c" - "\xee\x6c\x75\x00\xdf\x5d\xb8\x6f\x29\xf0\xa8\xc4\x3e\x05\xba\xdd" - "\xa8\x8f\x70\x5f\x2b\xe4\xde\x05\xe3\xf9\x78\x38\x67\x78\xed\x7f" - "\xd0\x36\x5f\xfd\x8a\xd4\xda\x3f\xe2\x6d\xf7\xe4\xa6\x12\xb1\x67" - "\xb3\xe5\x94\x3c\x68\xba\x18\x3b\x04\xd6\x83\x9e\xde\x07\xf6\xe2" - "\xe5\x31\xc8\xa4\xc1\xba\x92\xe9\xe3\xca\x99\x3a\x6c\x33\x94\xad" - "\xe4\x7c\x22\x59\x9b\x99\x3e\xad\x67\x3a\x50\x4b\x57\x42\x3b\xbb" - "\xf5\x20\x32\x4b\xe0\x5c\xab\xe9\x13\xc5\x77\x55\xe1\xde\x5f\xe8" - "\x93\x20\x06\xfe\x7e\x6b\x87\xd7\x2f\x21\xf6\x1e\x86\xfd\x20\x73" - "\x19\x1f\x6f\x85\xdf\x8a\xe4\xf9\x09\x3e\x3a\x8c\x6d\xba\x85\xe9" - "\x2f\xca\x92\x3b\x07\x65\xa9\x64\x72\xe4\x5a\x08\xe4\xb1\xf7\xd6" - "\x02\xaf\x59\xc2\x5e\x15\x5e\x89\xc8\xeb\x31\xf0\x55\x28\x13\xd4" - "\x5d\xc1\xfc\xdf\x8d\x28\x5b\xd4\x38\x21\x7b\x4d\xdb\x7a\x2c\x1b" - "\x61\x3e\x2b\xb1\xb2\x35\x40\xb7\xb1\x8d\xef\x9d\x10\x09\xe5\x77" - "\x5a\xee\x43\x7a\x63\x3e\xfa\x68\xcb\x5d\xec\xf3\x62\xcb\x1d\xa0" - "\xab\xc7\x89\x0c\xfc\xf4\xa8\xa3\x8a\x5e\x34\xcb\xc6\x7b\x20\xc6" - "\x40\xbc\x76\x41\x8c\xb4\x13\xfb\x1b\x75\x19\x62\x24\x6b\x6b\x51" - "\xd4\x46\x45\x6f\xa1\x9e\x52\xec\x7b\x8e\x4f\xd4\x01\xd0\xe3\x4a" - "\xaf\x6e\x45\x1d\x10\xfd\xb8\x13\xfa\x51\x0f\xf5\xdd\x2e\xda\xb5" - "\x13\xe8\x21\x16\x33\x5e\x2b\x64\x2f\x11\xf4\x27\x15\x1c\x84\xad" - "\xd6\x16\xa0\xff\x65\x18\x44\xe7\x8b\xb2\x3b\x78\x5d\xd1\x8f\x2b" - "\xb4\x18\x23\xb2\x7d\xd0\x20\x0d\xfd\xe0\x24\xc0\x9e\xf9\x3e\xdc" - "\xd3\x57\xa4\xa1\xed\xf0\x3a\x8c\x13\x98\x1e\x42\xdc\xe3\xd5\xa3" - "\xe8\x39\x1a\xff\x84\xbe\xd8\x5e\x97\xcf\xf7\x99\x40\x5d\x42\x9f" - "\x8a\xf3\x15\xe0\x67\x15\xf6\x23\x64\x8e\x7e\xcb\x57\x57\x8c\x43" - "\x41\x57\x26\xa8\x78\x57\x06\x1a\xe7\xca\xb8\x0f\x2c\xe5\x65\x62" - "\x06\x8a\xb6\xed\xe2\x6d\x13\xf7\xd8\x6f\x6b\xb1\xdf\x0c\xef\xa8" - "\xfa\x11\xfa\xcd\x30\x5d\xd0\x57\xa2\x2f\xf7\xda\x6b\xcc\xc3\x8a" - "\x2d\xfb\xfb\x0b\xc3\xe5\x68\x0f\x5e\xb9\x62\x66\x69\xfc\x45\x65" - "\x60\x7f\x11\x63\x11\xed\x2d\xd7\xd8\xc6\x0e\x2e\xbb\x18\x5b\x00" - "\x87\x3a\xb7\xd8\xef\x03\xd2\xd0\x7f\x62\xdd\xea\x31\x68\x3b\xef" - "\x57\x61\xcb\x86\x78\x7f\x1c\x62\x8e\xaa\xed\x19\xb1\x46\x9f\x80" - "\x3c\x10\x53\x16\x57\x42\x1a\xc7\x35\x06\xe3\x5b\xbb\xda\x47\x03" - "\x6d\xb1\x87\xa2\xbd\xc4\x34\xf9\xda\x62\xcc\x6c\x61\x8b\x4a\xdd" - "\x2f\x03\x46\xc9\xde\x7a\x0d\x73\x34\xf5\x22\x36\xd5\xec\x7d\xce" - "\xac\x8d\x86\x5f\x29\x63\x1a\xd2\x43\xd9\x1c\x28\x63\xd7\x8c\x8f" - "\x76\x94\x0f\xea\xd2\x33\x9f\xb5\x85\xf9\x8a\x9c\x56\x26\x8f\xa1" - "\xb8\x4c\x8c\x13\x90\x96\x2c\xd2\xd2\xc5\x58\xa2\xe8\xcd\x00\x8d" - "\x4c\xae\xc0\xf1\x51\x8c\x5e\x89\x8f\x18\x2f\xe6\x8b\x0c\x6e\xd1" - "\x3e\x4c\x9b\xc0\xd3\xa2\xab\x30\xad\x80\xf7\x43\x31\x65\xe3\x55" - "\x74\xba\x18\xaf\xd0\xbe\x24\xa7\x1c\xd5\x80\x36\x86\xf7\x4e\xd9" - "\x98\x8a\xfc\xeb\xf3\xda\x71\x0e\x51\x02\x79\x8b\xd0\x1f\xa0\xbf" - "\xb0\xcc\xe7\x7e\xc3\x72\x2b\xbb\x6e\x46\xbf\x83\x71\x08\xe6\x03" - "\xdd\x1c\xf4\x45\x90\xfe\x02\xee\xe1\x49\x4f\xe8\x81\xaf\x71\xa3" - "\x28\xbb\x97\xc5\x0a\x27\x52\xc3\x94\x34\xa5\x1c\xd8\xfa\x62\x2c" - "\x87\xe5\x15\xff\x85\xbe\xab\x13\x7d\x13\xab\x2f\x56\x27\x74\x9c" - "\xcd\x1b\x94\xb8\xa8\x43\x52\xd1\xe2\x1e\x08\xcc\xa7\xc5\xce\xe4" - "\xfe\x2c\xf6\x1a\x2c\xcb\xf0\x03\x5f\xb9\xf6\x2c\xfd\xa4\x6c\x19" - "\x91\xb7\x9f\x61\x31\xd6\x0c\x2e\x67\x6c\x09\x6f\x47\xec\x5c\xd6" - "\x0e\xee\x53\xed\x5c\x16\x79\xc6\xf6\x76\x96\xf7\x28\xb6\x05\xf3" - "\x0a\x55\x79\xb8\x0f\x09\xe4\xfd\x82\xc9\xa5\x29\xe7\xe9\xc8\xf4" - "\xa3\xc7\xfd\x77\xc1\x87\xa2\x3e\x08\xdf\x1b\x67\x16\x72\xbe\xa7" - "\xf8\x5d\xe8\x97\x0c\xf4\xbd\x2c\x6f\xbe\xa0\xb9\x55\x5c\x99\x7f" - "\x8f\x1b\xc0\xfb\xd5\x2c\x89\xfe\x5e\xc4\xdb\x11\x37\x94\xcd\xb3" - "\x4f\xa4\x41\xdf\xc6\x76\x2a\x7d\xab\xfe\x8c\xf6\x03\xf5\x1b\xf1" - "\x9e\xe9\xfd\x1a\x36\x87\x2d\x45\x1a\x94\x89\x8f\x11\x46\xb7\x36" - "\xa6\x3e\x26\x9b\x9e\xc1\x71\x89\xc7\xaa\xa6\x87\xc4\x1a\x11\x71" - "\x2c\xfb\x25\x8c\x0b\x71\x55\x8a\x8f\xa1\xad\xa9\x04\xdf\x83\x0e" - "\xb2\xb0\x3d\xae\xf1\xbd\xf9\x6a\x1a\xf4\x4f\xbf\x6d\x77\x0a\x9e" - "\x71\x25\x8a\xdf\x40\x5f\x52\xe7\x3e\x22\x62\xba\xc1\xa9\xdb\x85" - "\x2f\x39\x25\x0f\xbe\xd9\x37\x0e\x1b\x7c\xb3\xaf\xcf\x30\xdd\xa3" - "\xf5\x19\x10\x37\xe7\xb7\x16\x0d\x1e\xe1\x13\x07\x40\xda\xb9\x7d" - "\x47\x9c\x0b\x6d\x14\xf7\x41\x62\xfe\x89\xad\x7b\x0d\xfe\x9d\x22" - "\x33\xfa\xcd\x96\xd5\xca\xfa\x85\xe9\x16\x8c\xd5\x34\xf5\x6d\xf4" - "\xf1\x9d\x58\x9f\xc2\x4f\x26\x6c\x3f\x2f\xc7\x32\x5c\x73\x19\x3c" - "\x47\xf8\xf9\x72\x1f\x5f\x29\xc6\x30\xf4\x93\xbe\x63\x95\x7c\x8d" - "\xef\x58\x65\x9a\xee\xef\x23\x4d\xfa\xe0\xc7\xaa\xc1\x4e\xf4\x5b" - "\x8a\x8f\xf4\xf5\x05\xa6\xa8\xed\x3e\xb1\xec\xe0\x62\x25\x96\xf5" - "\xfa\xd1\xc1\x89\xe8\xa3\xa0\xfe\x4a\x51\x77\xbe\x53\x96\x36\x28" - "\x75\x3b\x01\xe7\x3a\x0b\xe8\x66\x51\x98\x0b\x3e\x67\x8a\x18\x90" - "\xd9\x66\x3b\xee\x27\x22\xc7\x56\x80\xfe\x45\xa2\x9e\x39\x96\x9c" - "\x21\x47\xbd\x63\x45\x75\xcb\x52\xa5\x7f\xe3\xe3\xd5\x71\xe1\xb6" - "\x2d\x74\x03\xd4\xd3\xac\x6e\xe3\xd3\x90\x56\x28\xd6\x10\x58\xdf" - "\x32\x5e\x26\x47\xd9\x16\xdf\xb6\xf1\x76\x98\xdc\xd8\x0e\x9c\x13" - "\x41\xfd\x7b\x30\xee\xc1\xbd\xd0\xc0\x6e\xa6\x95\x75\xeb\x7c\xf8" - "\xc6\xb3\xeb\xd5\xf1\x95\x5c\x8c\xbe\x52\xcc\x3d\x6b\x20\xde\xb1" - "\xab\xd7\x62\x6e\xf9\xc1\x2c\x4b\xd6\xb2\x05\x4b\xb2\xe7\x4f\xb1" - "\x2c\x58\xb2\x20\x7b\xc1\xdc\x45\x0b\x56\xcd\xcd\x5e\xb0\x74\xc9" - "\xf8\xc5\x73\x1f\x58\x70\xbf\x65\xe5\xdc\xe5\x96\xe4\x9c\x71\x39" - "\x91\xc4\x4b\x7a\xb5\x65\xee\xf2\xe5\x0f\x2f\x9e\x97\x61\x59\xb2" - "\xe0\xfe\x09\xcb\xe6\x2d\x9f\x97\x6d\x99\xbb\x6c\xe9\xc3\x4b\x32" - "\x2c\xe3\x32\x26\x8e\x4b\xbe\x32\x23\x52\xbd\x86\x36\xc6\x48\x9a" - "\x3d\x5f\x35\x35\x15\x7e\x45\xf4\x06\x5d\xd6\x32\x43\xce\x82\x25" - "\x7c\xdd\x2e\xe1\x9e\x49\xc5\x24\x0b\xf7\x58\xc7\x3d\x70\x69\x51" - "\x7c\x16\x5c\x65\xa4\x83\x76\x5a\xca\x70\x9f\xf5\x04\x3a\xa2\xb5" - "\x28\xc1\xe2\x94\x87\xe9\xd9\xbe\xb4\x90\x0e\x6d\x1b\x41\xbf\xaa" - "\x69\x82\x98\x2d\x0b\x9f\xf9\x2e\xfb\x8a\x98\xec\x2b\x88\x0c\x67" - "\x14\x9c\x46\xdc\x83\x1d\xca\xcc\x76\xca\x43\xb2\xf8\xba\x68\x82" - "\xdb\x15\x7b\x55\x3e\xb5\x5f\x95\xcf\x71\x49\x38\xad\xac\x49\xdf" - "\xf6\x38\xb9\x0d\xf5\xf3\x88\x9c\xc0\xd6\xb2\x1f\x03\x5d\xc6\x35" - "\xd9\x96\x57\xae\x4b\x81\x78\xf0\xb0\x63\x18\xcb\x3b\xed\x96\x48" - "\x14\xc8\x25\xef\x5b\x93\x4c\x36\x41\x5d\xcb\xcd\x94\x42\x1d\x95" - "\xca\x7a\x1a\xb4\xc1\x08\x6d\x39\x24\xda\xb1\x95\xb5\x63\x0b\x4d" - "\x2c\x8e\x03\xf9\x8a\x98\x3c\x47\x95\x36\x80\xdc\x87\x40\xa6\x54" - "\x90\xd3\x88\x72\x05\x5a\xeb\xc3\xf5\xae\x63\xf2\x90\x09\x9e\x15" - "\xd0\x6f\xa3\xf8\x5e\x4a\x85\xdb\xb9\xfd\x41\xbb\x32\xca\xe0\x73" - "\xc1\x19\x12\xf5\x34\xee\xdd\xbd\x7e\x34\x7d\xc7\xdd\x49\xea\x33" - "\x0f\x11\xc3\x23\xd4\x45\x5f\x6a\x6a\xe2\x6d\x1a\x92\x86\xbe\xe1" - "\x0f\x0f\x1e\x92\xb1\x4d\x30\x56\x44\x95\x9d\xe9\x71\x6d\x51\xde" - "\x94\x40\xdd\x74\xab\x3a\xe6\x1a\xf2\x1a\xf6\x09\xc6\x5b\x2d\x30" - "\x4e\xb5\x16\x0d\xd9\x09\x75\x13\x11\x1b\xbb\x69\xc7\x1c\x55\x2c" - "\x35\x04\xf5\xcc\xdd\x03\x6f\xbd\xc2\x1b\xf7\x04\xc7\x32\x1c\x7f" - "\xf3\x04\x28\xe3\xf2\xf2\x37\xeb\xb5\xfc\x91\x27\x7c\x76\x29\xf5" - "\xf0\x79\xf8\x10\x8c\x09\x5c\xa0\xcb\xae\x1e\xea\x4b\x2c\xda\x42" - "\x1b\xeb\x21\xbd\xf0\x2c\x91\x81\xb6\xb1\x6c\x0b\xe3\x9f\xe9\x94" - "\xe3\x6b\x91\xff\x63\x09\x84\xe4\x03\x4d\x4b\xd1\x10\x82\xeb\xbb" - "\x90\x07\xf6\x1f\xd6\xa6\x5d\xb7\x16\xfa\x7c\xb5\x46\x9f\x53\x8a" - "\x30\x26\x2c\x06\xfe\xa0\x43\x85\x5f\x12\x9c\x6b\xd7\x4e\x2c\x26" - "\x49\x58\x0f\x7c\x6e\xc0\xf5\x10\xe0\x79\x48\xa9\x8f\x82\xfe\x17" - "\x78\xf8\x1a\x8c\xd0\xad\xf1\xf5\x39\x4d\xb8\xd7\x02\xdd\x07\xfe" - "\x1d\x65\x44\x1d\x6b\x2d\x1a\x1a\xa5\xe8\x14\xe8\x7a\x23\xd3\x2b" - "\x13\x49\xa2\x45\x66\x7b\x59\x1c\xd0\x81\x5e\x6d\x07\x7d\x42\xbd" - "\x02\xda\x69\x8a\x4e\x81\xae\x35\x20\x1d\xc8\x10\x59\xb1\x2a\x45" - "\x46\x1f\x79\x54\x1e\xba\x1b\x75\x8c\xfe\xfc\x87\x87\xe8\x90\xbb" - "\x0f\x71\x9c\x86\xee\xae\x6f\xe3\x18\x78\xfb\x7d\x68\x9e\xaa\xdf" - "\x1b\x40\x8f\x23\xb1\x9f\xf9\x5a\xf5\xd0\xdd\x20\x5b\x03\x8b\xc5" - "\x1f\x05\x0c\xd8\x58\x35\x74\x11\x96\x17\x7d\x58\xeb\xed\xc3\xa1" - "\x35\x81\xfa\x50\xd3\x77\x6c\x2f\x6a\x5a\x34\xb4\x11\x6d\x05\xca" - "\x74\x2a\xfb\x50\x07\xc2\x12\xea\x00\x0f\x46\xf4\x58\x47\xb5\x09" - "\xe9\x87\x8d\x0f\x54\x87\x56\x8f\xab\xcb\x09\xc1\xb5\x70\x2c\x97" - "\x68\xc2\x7e\x1d\x96\x11\x10\xdf\xfb\x7d\x64\x63\x27\x2d\x1a\x96" - "\xb5\x49\xec\xcb\x0d\xe5\x4a\xcf\x25\x5f\xa2\x85\x8f\x8b\x8e\x31" - "\xa8\xcf\xc3\xde\xab\x87\x48\x00\xd3\xc4\x7d\x75\x0b\x8c\x35\xda" - "\xf5\xfc\x9e\xbf\x5f\x18\x1e\xef\xfb\xfd\xc2\x70\xb9\xa7\xef\x17" - "\x7c\xeb\x1d\x7e\x3b\xd6\xeb\x29\x9b\xad\xf3\xd6\x3d\x7c\x86\x27" - "\x40\xdd\x4a\xf9\x89\xe5\xea\xf9\xcb\xf0\xe7\x50\x86\x3a\x18\x97" - "\xe8\xf0\xd9\x3a\x0a\x7c\xaa\xd9\x98\x3d\xbc\x9c\xc7\x2b\x18\x07" - "\x0d\xcf\x43\x1a\x6d\x3b\xba\x0f\xbd\x09\x7d\x05\x39\xcb\x6e\x06" - "\xdc\x48\xf0\x97\x68\x64\x58\xb9\x92\x2d\xf9\x10\x13\x1a\xe0\x26" - "\x8a\x90\xe1\x8c\x9e\xc2\xc1\x93\xc4\xbd\x8b\xdd\xc8\xdd\xf4\xdd" - "\xf9\xe7\x71\x0c\xe4\xf2\x32\x7e\x6d\x44\x27\xea\x73\xa8\x28\xae" - "\x3f\x47\x69\x4a\x94\x22\x81\x0e\x8c\x2a\xf3\x66\x0f\x00\x7e\x4e" - "\x46\x4c\x69\xa7\xe0\xaf\xdc\x53\xf5\x3d\xa6\xf8\xde\xc3\x11\x36" - "\x47\x55\xc1\xe8\xb0\x0c\xf6\xb8\xd6\xa8\xce\xee\x24\xa9\xdc\xe8" - "\x5b\x69\xde\x00\x76\x31\xe0\x9f\x1c\xe0\x97\x04\xf9\x23\xbc\xd9" - "\x61\xee\x75\x2a\xe2\xb7\xb9\xf8\x23\xa7\xf5\xdc\x88\x3e\x1f\xa3" - "\x54\x9f\x47\xf3\xcb\x88\xb6\x80\x94\x5f\xc7\x61\x69\x18\xa8\x7c" - "\xf4\xaa\xc7\xc8\x35\x81\x48\xbd\xfd\x3f\xf2\xb0\x92\xa4\xc6\xd3" - "\x9b\x7f\x59\x9a\xef\xfd\x58\xa3\xef\xfd\xb8\xd4\x0b\x21\xba\x03" - "\xff\xe4\x3a\x63\x09\x7a\x2a\xe5\x30\x68\x4c\xc6\x60\xd7\x98\x90" - "\xf7\x10\xd2\x84\x81\x3c\xa5\xaa\x64\x39\x30\xf5\xd7\x73\x0c\x5b" - "\x27\x3a\x70\xb4\xcb\xe8\x97\xa9\x4d\xc3\xfb\x70\x8b\x48\x9b\xfc" - "\x9a\x1f\x3d\x4b\xb3\xa8\xee\x75\x29\xf0\xa7\x1c\x0a\x6e\xb8\x10" - "\xb2\x5e\x3a\xfe\x0d\x0f\x1d\xda\xc7\xa5\xe3\x6b\x3a\x28\x1f\xc5" - "\xc1\x13\xb1\x0b\xfe\xa3\xdd\x8e\x92\x8a\x0c\x2a\x12\xa8\xf8\x70" - "\x41\xc6\xf1\x4b\xc7\xa5\xe3\xd2\x71\xe9\xb8\x74\x5c\x3a\x2e\x1d" - "\xfd\xe0\xd0\xa9\x27\xd6\x7a\x38\x23\xc4\x55\x3d\xff\xd1\x89\x53" - "\x9d\x26\x9d\x4f\x39\x2a\x0e\x92\x97\xe2\xb0\x94\xa7\x3b\x8d\xf6" - "\x59\x0d\xc9\x15\x59\x2e\xfd\x86\xd4\x9a\xa4\x9d\x99\x4d\xe6\x92" - "\xb4\x43\xd3\x2a\x73\xda\xe4\xfc\xeb\xab\x13\x77\x64\x1c\x35\x15" - "\xcf\x6e\xb4\xee\xc9\x76\x47\x6d\x9c\x59\x3b\x7e\xd7\xa2\xe6\x11" - "\xa5\x73\x0e\xcf\xa8\x5a\xd3\x29\xad\xbf\xee\xf5\x31\xbf\xbc\xef" - "\x48\x5c\xd1\x8f\x0e\x4e\xf9\xfd\xb2\x33\x91\x4f\xfd\xd7\xfe\x2b" - "\xfe\xef\xc1\xe3\xc3\x9e\xbd\xeb\xa3\xab\xff\xb4\xaa\x3d\xfc\x89" - "\x1b\xdf\xfc\xce\xaf\xe7\x1f\x4b\xd8\x72\xc7\xfb\x57\xbe\xb4\xe2" - "\xab\x98\x82\x5b\xeb\x26\xfe\x66\xc9\xa9\x51\xdb\xef\xfd\xdb\xf7" - "\x5f\x59\xeb\xd1\xad\xbb\xf6\xb5\xcb\x9e\x9b\xfb\x49\xec\x33\xb7" - "\x1f\x98\xfc\xbb\x87\x4e\x0f\x7c\xf2\xe6\xb7\x2e\x7f\x61\xc1\xe7" - "\x43\x7f\x71\xe7\x87\xd3\x5f\x7e\xe4\xec\x80\xc7\x6f\x78\x63\xdc" - "\xaf\xe6\x7d\x1a\xbf\xf9\xc7\xef\xd9\x5e\x7c\xf8\xcb\xe8\xa7\x6f" - "\x79\x67\xc2\xee\xc5\x27\x47\x6e\xbb\xe7\xe3\x6b\xf6\x3e\xda\x15" - "\xf6\xd8\x0f\xf6\x8d\x7d\xfe\xfe\x7f\x0c\xde\xf4\xdf\xef\x4e\xfd" - "\xc3\xf2\x96\x41\x3f\xfb\xe1\xdb\xdf\xfb\xff\x85\x27\x86\x6f\xbd" - "\xfb\xaf\xff\xf1\xe7\xd5\x1d\x11\xff\x73\xd3\x5f\xbe\xfb\xbf\x0f" - "\x7c\x36\xe4\xe7\x3f\xf9\xe0\xaa\x3f\xae\x6c\x35\x14\xde\x56\x3f" - "\xe9\xb7\x4b\xbf\x18\x5d\xf6\xd3\xbf\xff\xe7\xab\xb9\xf4\x7c\xfa" - "\x8f\xc8\x0b\xa7\x7e\xd3\xb8\xf1\xcb\xba\xbc\x50\xca\x53\x81\x3a" - "\xbf\xcd\xb3\x11\x9d\x9e\x84\xcb\x21\xcd\x13\x42\x6d\x6f\x0f\x87" - "\x45\x5d\xbe\xb7\x03\x7f\x17\x87\x7b\x5a\x63\xdf\x0f\x67\x29\xde" - "\x99\xff\xa8\x80\x25\xbe\x89\x43\x07\xed\x0c\x03\x49\x06\x90\x70" - "\xe8\x19\x3d\x19\x48\x22\xc9\x20\x12\x45\xa2\x49\x0c\x31\x10\x23" - "\x89\x25\x71\x64\x30\x31\x91\x78\x92\x40\x86\x10\x33\x19\x4a\x86" - "\x81\xf4\x23\xc8\xc8\xc0\x32\xe7\x91\x14\x33\xfc\x81\xff\xb3\x48" - "\x0a\xbb\x4f\xbf\x94\xfe\x8d\xa6\x3b\x44\x7a\x83\x48\x77\x5e\x4a" - "\xff\x46\xd3\x2d\xff\xe2\xeb\x65\xff\xd2\xab\x0e\xc2\x02\x1e\x19" - "\xf8\xc4\x07\xdd\x87\x36\x55\x27\x8e\xee\x7b\xd2\x4b\x79\x3f\x7e" - "\xbe\xe5\xb5\x47\x0a\x9c\x56\xfe\x31\x97\x10\xfe\x5d\x02\x55\x1f" - "\x9d\x3d\x95\x54\x8e\x92\x1c\x38\xf3\xe1\xb4\xc3\xb9\x09\xce\x32" - "\x38\x5f\x50\xf8\x10\xe2\x6a\x23\xe4\x0c\xf8\xf6\xd3\xc5\x70\xad" - "\x25\xa4\x25\x9d\x90\x2f\x9d\x84\xb8\xcb\x09\x69\xb5\xa8\x04\x8f" - "\xf2\x4a\xd4\x25\x6a\x85\x6c\x9d\x54\xac\xaa\xac\xaf\xe3\x53\xe5" - "\x0d\xb3\x53\x2d\x93\x27\x5a\x27\x5a\xa7\x5a\x26\x4c\xb0\x4c\x49" - "\x4e\x9e\x3e\x29\xd9\x36\x69\xca\x95\x96\x29\x53\xaf\xb6\x5d\x79" - "\xf5\x94\x69\x96\xc5\x8f\x2c\x5b\x30\x39\xf9\x81\x79\x96\x25\x19" - "\x0b\x96\x5b\xe6\x2f\x58\xb6\x78\xe5\xdc\x65\xf3\x7a\x6b\x75\x9f" - "\x0f\x68\x0a\x19\xd9\xc5\xc5\x54\xa3\xa1\x83\x51\x44\x1e\xeb\x22" - "\xf2\x55\x1b\x88\x37\x27\x49\x9c\x7e\xc7\xe2\xbb\xee\xf8\x68\xdc" - "\xdd\x31\xaf\x5f\xfb\xc0\xb8\x6b\x7e\xf0\x7c\x61\x05\x91\xae\xd1" - "\x13\xc9\xda\x40\xa4\x2b\x6a\x89\x34\x7a\x26\x91\xe2\x66\x11\x69" - "\xc5\x06\x22\x2d\x49\x21\x52\xc6\x78\x22\xa5\x95\x12\xe9\x87\x76" - "\xff\xb4\xc7\x13\x79\xda\x4b\xcd\x44\xda\x55\x49\xa4\xe7\xa2\x88" - "\xb4\xa9\x9a\xa7\xd5\x56\x11\xe9\xf5\xec\x0b\xde\x07\xe7\x7f\xf4" - "\x15\x7f\xdd\x3f\x01\x3a\x76\xe1\x43" +static unsigned int rss_eth_z8e_uncompressed_length = 552620 ; +static unsigned int rss_eth_z8e_length = 154046 ; +static unsigned char rss_eth_z8e[154046 + 1] = + "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xb5\x37\xbc\x32\x19\x60\x84\x90" + "\x99\x04\xa4\x53\x12\x75\xb0\x60\xa3\x97\x1f\x51\xb1\x45\x0b\x12" + "\x05\x2c\xb6\x01\xa2\xa2\x44\x05\x13\x34\xd0\xa0\x11\x23\x04\x08" + "\x90\x64\x86\x01\xaf\xa8\x40\x26\x11\x34\x42\x20\xb1\xd2\xa7\xdc" + "\x96\x6a\x6c\xb1\xc5\x5e\xac\x63\x49\x9f\x97\xde\x4b\x32\xb9\x7d" + "\xf1\x7d\x73\xfb\xe2\x75\xe4\x46\x9a\xf2\x04\x18\xc9\x40\xc6\x64" + "\xe6\xec\xe7\xbb\xf6\x3e\x27\x99\x19\x26\x28\xb7\xf7\xf3\xbc\xff" + "\x94\xcf\x27\xcc\x39\xfb\xc7\xda\x6b\xaf\xbd\xd6\xda\x6b\xef\xbd" + "\xf6\x3a\x44\x7f\xc3\x3f\xf3\x8d\x79\x7f\x4b\xf5\xbf\xff\xfb\xfb" + "\xbf\xbf\xff\xfb\xfb\xbf\xbf\xff\xfb\xfb\xbf\xbf\xff\xfb\xff\xe7" + "\xdf\x05\x93\x99\x7e\xef\x21\xea\x71\x5b\xec\x7e\xfa\xd2\xf1\xfa" + "\xab\x22\x8c\xe4\x24\x3f\x59\xec\xfc\xab\xff\x51\x2d\xd2\x4d\x1e" + "\xb2\xdc\x68\xa3\x94\x59\x7b\x89\x76\x8e\x11\x5d\xaf\xbe\x26\x02" + "\x9b\x5f\x13\x5d\xb3\x7f\x42\xd4\x3c\x9e\xe8\xd5\x31\x22\x08\x38" + "\x8b\xfd\xf4\xc4\x4e\x86\xb3\x19\xef\x9c\xbf\x65\x8c\x08\x20\xbd" + "\xcc\x4f\x05\x29\x9c\xbe\x69\x0c\x60\x8d\x26\x72\xbf\x26\x42\x51" + "\x70\x2d\x5c\x9f\x61\xce\x1e\x27\xf1\xd9\x1f\x07\x87\x61\x1c\x06" + "\x8c\x2d\x57\x80\x91\x62\xe0\x15\x34\x51\x12\xc3\xeb\x76\x93\x3d" + "\xe8\xf6\x5e\x8b\xba\x41\xf4\x29\x8b\xeb\x56\xa3\x8c\x70\x53\x72" + "\x73\x79\x98\x1c\x37\x52\xd2\x69\x1a\xfe\x26\x7e\x4d\xf8\xdd\xc5" + "\xfd\xdd\xac\xea\x8d\x67\x18\xa8\x9b\xd4\xe3\xbe\x26\xbb\xbf\x2e" + "\x60\x3b\xaa\xc8\x8c\xb2\x2b\x82\x26\xaf\x49\x95\xb5\x5d\xa3\x97" + "\x35\xa1\xec\x62\xa3\xac\xca\x33\xdd\xaf\xe7\x8d\x40\x5e\x79\x6c" + "\x9e\xb9\x56\xcf\x4b\x41\xde\xce\x38\xfc\xcc\xbe\xde\x30\x9d\xa6" + "\x6b\x0e\x02\x17\xc7\x51\x8c\x0a\xd7\xd1\xcb\xa7\xa1\x7c\x73\x2c" + "\x2c\x22\x3d\x2f\x1d\x79\xfe\xd8\xbc\xdf\x65\xeb\x79\xdf\x40\x5e" + "\x38\x36\x2f\xc9\xa8\x67\xef\x71\x0f\xb7\x27\xe8\x27\xb7\x9f\xa4" + "\xda\xe6\x3e\x0c\x9f\x8e\x32\x2e\x2e\xb3\xd0\xe1\x22\x1e\x2b\xce" + "\x3b\xda\xd8\xdf\x3e\x97\x29\x34\xe0\xf8\x51\x3f\x8a\xa6\xa0\xe5" + "\xf0\x0a\xa3\xfe\x6c\x07\xc3\x20\x49\x43\x86\xe3\xa7\x6b\xe6\x32" + "\x1c\x7e\xc7\x73\x26\xf7\x5b\x7f\x76\x70\xff\xa2\xc7\x1c\xc6\x27" + "\xc0\x0e\xb1\x10\x0d\xc5\xdf\x30\x8b\xc1\x03\xab\xed\x42\x73\x7e" + "\x93\xcc\xa2\x76\x84\x5d\x73\x0b\xf2\x95\x87\xc8\x31\x96\x9c\xa7" + "\x68\x84\x1d\xf8\xd1\x8e\x0d\x64\x71\x96\x8a\x90\xaf\xbc\x8b\x5a" + "\x03\x5d\xe4\x0c\x88\x4e\x5f\xf8\x22\x55\x5d\x24\x8b\x2f\x7c\x96" + "\xaa\x9e\x27\x7b\x73\xc5\xe7\x94\x88\xbf\x34\x93\x20\x67\x26\xd7" + "\xed\xa0\xd6\xfa\x0e\x72\xd6\xc7\xd6\x75\x5e\x47\xf6\x16\xbc\x63" + "\xec\xac\x8c\x47\xb3\x23\x4c\xe1\xf4\x11\xf6\x8a\x37\xc8\xec\x1c" + "\x47\xa6\x96\x22\xaf\x81\x8b\x9f\x71\xd9\x72\x86\x2c\x6f\x2d\x07" + "\x0f\x9d\x61\x7c\x47\xd9\xdf\xd9\x10\x32\x1d\xb5\xe7\xd2\x51\xfb" + "\x49\x6a\xb6\xcf\xa0\xe6\xf2\xd9\xb4\xe3\x0c\xa5\x1c\x0d\x4d\xa7" + "\x66\xf3\x7d\x90\xb1\xd9\xe4\xeb\xc2\xb3\x23\x82\x32\x41\x72\xac" + "\x25\xf0\xc7\x88\xb6\x9d\x4f\x93\xc5\xaf\x60\x82\xbe\x23\x4e\x7e" + "\x54\x46\xc4\xf4\xe5\xf7\x44\xfd\x58\xfd\x4d\xb2\x03\xbf\x4e\xe0" + "\x72\xe7\x29\x4a\xb9\x76\xbc\x9d\xb2\x81\xf3\x30\x5f\x5d\x98\xcc" + "\x15\x74\xcd\x20\xb2\x35\x5a\x73\x4b\x19\xef\xda\xf7\x9a\xe8\x64" + "\x1e\xed\xde\x98\x0f\x39\x4d\xc9\x45\xdb\x5d\xdc\xde\x0e\xc8\xba" + "\xf3\x4d\x32\x77\xaf\xcb\x4f\x6a\x78\x4d\x74\x20\xaf\xd8\xc8\x03" + "\x3f\x75\x20\xbf\x73\xca\x68\xb2\xf9\xc2\x39\xf4\x61\x6f\xa7\x99" + "\x61\xa4\x06\x29\x89\xe1\x59\xcb\x29\x19\xfd\x19\x02\x7c\xee\x6c" + "\x40\xfa\xb7\x50\x0e\xf5\x0f\xf8\xa9\xa6\x90\xeb\x8b\x6f\x3c\x1e" + "\xd4\xbe\xf1\xf8\x45\xed\xf5\xc7\xbb\xc5\xeb\x8f\x5f\x88\xbc\xfe" + "\xf8\x17\xce\xf5\x64\x89\x7c\xe3\xf1\x40\x6b\xa9\x1c\x03\x5b\x6b" + "\x29\xc6\x20\x42\x96\xca\xb3\x64\x7b\xe2\x79\x8c\x7d\xf8\x13\xaa" + "\x5c\x41\x76\x2d\x2d\xad\xcd\x17\xfe\x98\x9e\xa8\x20\x81\x67\x7f" + "\xa2\xfe\x75\xa7\x8f\xca\x57\x32\x64\x41\x9f\x46\x3a\xfc\xe6\xe1" + "\x36\x6e\x37\x90\x96\x91\x8f\xbf\xc5\xf8\x2b\xc4\x5f\x91\x48\x1f" + "\x55\x04\x5a\x39\x53\x37\x25\xd1\xbe\x5e\xa2\x29\x1a\x25\x9d\xa1" + "\x91\xd3\x81\xbf\x6d\x10\xba\x65\x6a\xb5\x8f\xf8\xbf\xed\xa2\xaa" + "\x9e\x9e\x62\x62\xdd\xc4\x7a\x89\xf5\x14\xda\xd9\x8a\x76\xf2\xa4" + "\x2c\xbe\x26\x82\x22\xfd\x11\x3f\xd2\x3b\x83\x1b\x8b\x93\x02\x1b" + "\x8b\x4d\xdd\xe9\x8f\xfc\x27\xca\x1c\x44\x99\xad\x3a\x0d\x3b\x19" + "\x16\x64\x22\x30\x32\x4c\xc9\x80\x59\xfa\x9b\x4b\xed\xe6\xbd\xaf" + "\x89\x93\x28\x77\xa2\x1f\x16\x60\x03\x0e\xe8\x3f\xb2\xd3\x48\x03" + "\xad\x3b\xb6\xa3\x1c\xd7\xf7\x85\x72\x58\x7f\xfb\x7d\x25\x9d\x64" + "\x0d\xd3\x70\xd1\xa7\xda\x43\x99\x4e\xd6\xb3\x23\x43\x34\xb4\xc7" + "\x4d\x79\x0c\x9b\xeb\xf9\xba\x3a\x09\xf5\xfe\x53\x38\x8b\xa1\xdf" + "\x68\x7e\x8f\x28\x4e\x82\x4e\xef\x38\x8a\xfa\xaa\xed\xd4\x3c\x03" + "\x47\x6e\x83\xc7\x5a\xe2\x09\x7e\x38\x5a\x12\xa2\x91\x75\x94\x8c" + "\x7a\x0f\x31\x3c\x86\x05\x3e\xf0\xa3\xaf\xff\x79\xb4\x24\x40\x9a" + "\x88\x81\xe9\xd7\xe1\x35\xc6\xc0\x43\xba\x00\x3c\xe6\xbf\x66\xd4" + "\x19\xd9\x28\xe1\x3d\xf8\x1b\x8d\xe1\x85\xc8\xec\x90\xf8\x3e\xc2" + "\x30\x7a\x58\xc7\x00\xa6\x77\xed\xbd\xd4\x45\x56\x4b\xc0\x59\x9c" + "\xdc\x5a\x41\xc4\xf5\xdf\xa9\xea\x1c\x22\xba\xf3\x93\x99\xe7\x38" + "\xdf\x17\xbe\x80\x32\xa9\x7f\x15\xdd\xc5\xc9\x23\xbb\xc8\xcc\x38" + "\xa3\x7e\x39\xe3\x19\x3d\x96\x0f\xce\x79\x64\x06\x3d\x32\xfb\xfe" + "\xd9\x33\x68\xde\x3d\xb3\x66\x50\xf6\x9d\x93\xb2\x6f\xff\xee\xb4" + "\xdb\x29\x6f\xd1\x83\x33\x28\x6f\xfe\x0c\x7a\x08\x7f\x79\x0f\xcd" + "\x79\x70\xf6\x9c\x87\x66\x50\xfe\x7d\xf7\xe3\x6d\xd6\x8c\x5b\xb3" + "\xbf\x3f\x29\x6f\xd6\xfd\x73\xe8\x81\x85\xb7\x65\xdf\x76\x1b\xdd" + "\x33\x27\xf7\xd6\xec\x6c\xfd\xf7\xd6\x6c\x2e\xf2\xd8\xb4\x39\x0f" + "\x4d\xca\x5b\xf5\x5c\xd9\x73\x93\xe6\xdf\x3f\x2b\x6e\x9e\xcd\x8a" + "\x5c\xd2\x98\xbe\x41\x71\x7e\x2e\x69\xd0\x17\xfb\x30\xee\xf8\xeb" + "\xf2\x56\x9d\x82\xdc\xdb\xfe\x6d\x1f\x8f\x97\xd4\xab\x56\x9e\xab" + "\xcc\x3d\x6e\x6b\x3b\xe8\x76\x8c\xe9\x86\xf9\x0c\x65\xae\xbd\x88" + "\xbc\x9b\xf5\x79\x63\x08\xf2\x43\xb1\xf9\x69\xc7\x91\x3f\xa5\xd5" + "\x41\xe4\xc3\x1f\x68\x1d\x84\xfe\x03\x4d\x03\xd4\xed\xcc\x1f\x02" + "\x9e\x4e\x42\x1b\x1d\x90\xc7\xb6\x1e\xb7\x6d\x6a\x94\x9c\x77\x60" + "\x4c\xda\x1c\x1b\x28\xf9\x1c\xd9\x46\xb6\x96\xe5\x10\x8f\x8d\xaf" + "\x4c\x87\x71\xb1\x1f\xc6\x70\x09\x03\xe3\x0d\x38\x27\x74\x38\x15" + "\x51\x3a\xc1\xcf\x70\x76\x20\x4f\x87\xf5\x40\x2b\x74\x03\x74\xf7" + "\x8d\x9a\x33\x8b\x44\xfa\x08\x87\xd6\x97\x25\xe7\x03\xd4\x3b\x64" + "\xf0\x32\xca\x07\x9b\x4b\x51\xee\xad\xb9\x49\x18\xfb\x24\xcc\x53" + "\xe8\x8b\xd5\x0b\x9e\x0e\x6a\xb5\x19\xc5\xa2\x27\x9f\x54\x5a\x1a" + "\x60\xe0\xbd\x36\x63\x85\x70\x22\x6d\x83\x4c\x4b\xe2\x34\x8c\x73" + "\x32\xcb\xa3\xd8\x28\xd3\x93\x91\xbe\x06\xf8\xb5\x47\xb8\xfe\x79" + "\x59\x7f\x18\xd2\x1e\x46\xd9\x15\x5a\x7a\xc6\xd3\xe0\x1b\x4e\x83" + "\x8d\x30\x66\x34\xe0\x3d\xa3\x89\x7c\x12\xb6\xd7\xdb\xf1\x5c\xe2" + "\xdd\xd0\x45\xa7\x4b\xc9\xe4\x47\x9e\xe6\x04\xcc\xbe\xfe\xf6\xc7" + "\x73\x5d\xb4\x65\xee\xe9\x2b\xc6\xfc\x96\x96\xc5\x73\x61\x84\xf1" + "\x39\xdf\x5f\x66\x34\xb7\xc9\x32\x8d\xb1\x98\x8a\x71\xba\xa6\xc7" + "\x9d\xd6\x18\x37\x4e\x87\x01\x67\x05\xe8\xde\x0e\x18\x36\xad\xbb" + "\x98\xfb\xb5\x02\x70\x4d\x3a\x5c\x03\x46\x50\xf1\x41\x9a\x3f\x8e" + "\x0f\xfe\x1d\xb0\x67\x0c\xe4\xa7\x53\x5c\xfe\x07\xc8\xbf\x57\xcf" + "\x87\x6c\xa5\x3b\x62\xf3\xd3\xa7\x23\xff\x3e\xb4\x1f\x84\xec\x24" + "\xfb\xc9\xb6\x7f\x1f\xdb\x7e\x03\xe5\xf3\xe2\xca\x97\xa0\xfc\x0f" + "\x30\xb6\x41\xd6\xeb\x5c\xbe\x41\xe7\x55\x94\xb7\xa0\xbc\x2b\xae" + "\xfd\xbd\x28\xff\x50\x14\x7e\x71\xfd\x1f\x55\x8c\xfc\x7c\xe6\x2d" + "\xfc\x16\xa1\xcc\x30\x96\x57\xd6\x15\x47\x4b\xd8\x56\x4c\x6f\x8b" + "\x6b\x9f\x69\xf9\x8c\x66\xd0\xa8\x9b\x69\x64\xdb\xaf\xdb\x21\x27" + "\x15\x0e\xa3\xcc\x71\x6d\x8c\x47\x9d\xd5\xe0\x9f\x15\x06\x6f\x24" + "\xa8\x33\x2d\xae\x4e\xbe\xe4\x2d\xd5\x8e\x3e\xc6\xaa\x8e\xae\x87" + "\xa2\x61\x70\xdf\x60\x1b\x8d\xaa\x88\xeb\x3b\xe6\x1d\xeb\xc6\xed" + "\x4a\xce\x47\x80\x27\x6e\x43\xda\xfd\x80\xf9\x2c\xf3\x11\xf3\xba" + "\x2f\x10\x82\x9e\x9c\x9b\xa2\xe6\xfb\x51\x9f\x58\x2b\x88\x9f\x27" + "\xf1\x33\xc3\x16\x7d\xb9\xba\x0c\x8c\xfa\x04\xbf\x9c\xde\xcc\xe9" + "\x2c\x7b\xa2\xef\x87\x9a\x82\x39\x3a\x09\x32\x6a\xc2\x7b\x44\x6f" + "\xe3\x1e\xbc\x27\x01\xff\xa7\xa1\x83\xc1\xb3\x73\x99\x1f\xa7\x22" + "\xfd\x4e\x3d\xff\x56\x2e\x8f\xe7\x5b\xf5\x67\xe6\xdb\xa7\x75\xbe" + "\x85\x1c\x5c\x7b\xb3\x6c\x5b\xca\x82\xaa\xaf\x29\xbe\x9f\x85\xbc" + "\x6b\xf1\x7b\x3f\x7e\x19\xaf\x07\xd0\xf6\x27\xce\x8b\x64\x77\x46" + "\x60\x73\xa8\xf7\x3f\xe2\xf7\x41\xfc\xbe\x87\xdf\x87\xf0\xfb\x26" + "\xcb\x6d\x60\x5d\x31\xc5\xf1\x4c\x97\xa6\x64\x75\x98\x1a\xc3\xd1" + "\x1e\x5d\x7e\x94\xfc\x9e\x1f\x48\x13\x2a\xcd\xa4\x68\xae\xa7\xf5" + "\xcd\xe5\xf6\xf3\x00\xbf\x84\xdb\xd7\xe5\x7e\x88\x1a\x27\x55\x46" + "\x53\xf5\xcc\x6a\xbc\xf5\x34\x55\x2e\x29\xba\x4d\xfc\xe6\x54\x05" + "\x85\xc0\xef\x44\xa6\xab\x9f\xae\xcd\x06\x4d\xcc\x78\x67\xdd\x67" + "\x92\xe5\x25\xdc\x51\xf5\x51\xe3\x0d\x5b\xfc\xda\x92\xd8\xf1\xb6" + "\xed\x67\x9a\xf1\x78\x1b\xf8\x32\xee\xe0\x67\x9e\xd3\x86\x1a\x3c" + "\x03\xde\xee\x82\x7e\x0c\x26\x57\x30\xdf\x5d\xdb\xe4\xa7\x9f\x79" + "\xa4\x1d\x54\x9b\xb1\x92\xf3\x83\xd0\x33\xcc\x1b\xc9\xa5\x2c\x2f" + "\xd7\xb6\x19\xf9\x32\x2f\x6d\x51\x21\xc3\x4f\x2e\x91\x79\x5d\x7e" + "\xb0\x8b\x91\xc7\xb8\xb1\x1c\x27\x97\x71\xde\x18\xcb\x00\xdc\x11" + "\x39\x3a\xdc\x64\xb6\x1f\xd8\x0e\xc0\x7c\xdc\x89\x32\x13\xfd\x34" + "\x32\x7f\xb0\x35\x97\xf0\x8c\xc8\x9e\x44\x64\xba\xc5\x45\x43\x7c" + "\xe1\x13\xb4\x20\x2c\x22\x93\x5c\x74\x8d\x2f\x7c\x90\xc0\x20\x69" + "\xbe\xf0\x49\xba\x85\x68\x9c\x2f\xbc\x13\xf3\xed\x7e\xce\xff\x30" + "\x8b\x92\x92\xf0\xeb\xbc\xc9\x65\x4a\xf2\x85\xb7\xd0\x78\x97\x19" + "\xbf\x25\x74\xdf\x10\xd1\xe3\x0b\xe7\xa2\x5c\x11\x2d\x88\x88\xf3" + "\xb3\x87\x88\x4f\x0b\x22\x64\xcb\x7d\x41\x38\x7d\x61\xd8\xbe\xe1" + "\xe3\x48\xd7\xc4\x82\xc8\x97\xf8\xeb\x11\x9a\x67\x44\xce\x82\xc8" + "\x79\x31\xeb\x85\x0f\xf1\xfe\xa9\x10\x26\x12\xbe\xf0\x74\x6a\x0d" + "\x06\x51\xce\x29\x44\xcd\x88\xec\x27\x2e\x9a\xa8\x0f\x73\xa7\x56" + "\x33\x22\x07\x7d\xcc\xeb\x43\xff\x30\xaf\x2c\xe8\xdb\x88\xdf\xda" + "\x11\xf3\xe5\xbb\x67\x44\xa1\xb0\x8d\xc8\x9b\x8c\x85\x04\xf7\xc1" + "\x17\xee\xa0\x02\x98\xc2\x0b\xd6\x07\x04\xe3\x9f\xba\x89\xd7\x11" + "\xd3\x09\xba\xcf\xba\x60\xbd\x53\x20\xcf\x22\xd2\x46\xe4\xf9\xc2" + "\x5d\x84\x36\x0a\x01\x6f\x89\x84\xe7\x19\xe1\x42\xd9\x00\x97\x8b" + "\x86\xc3\x30\xb8\xec\x82\x08\x59\x51\xde\xd5\x97\x36\xa2\x14\x7f" + "\x1e\xfc\x79\x51\xf7\x4f\xc2\x3d\xfa\x23\x81\x79\x0e\xf5\x61\x17" + "\x8d\x08\xf4\xc0\x6e\x97\xb4\x8c\xd0\x30\x94\x67\x9b\x64\x36\x78" + "\x0b\xf8\xa6\xd8\x24\xbe\xb5\x29\xd6\x1e\xd9\x8f\x94\x54\xd5\x8f" + "\x94\x91\x9c\xde\x8d\x39\x1e\xcf\xd9\xdd\x2a\x6f\x0a\xea\x2d\x94" + "\xf5\x3c\x29\xd9\xc2\x96\x92\x13\x82\xcc\x80\xae\x2e\xa6\x23\xe8" + "\xea\x62\x5a\x8a\x9a\x94\x6c\x5f\xf9\x36\x12\x69\x29\x39\x7d\x69" + "\x29\x79\xa8\xff\x64\x9f\x9c\x7b\x53\x4a\x7b\x14\xec\xe7\x00\x67" + "\x31\xf8\x32\x19\x30\x4a\x01\xcb\xd5\xe7\x76\xd0\x82\xf5\x22\xb4" + "\x20\xbc\x29\x5c\xb0\x9e\x92\x27\x92\x0b\xf8\x7e\x00\x1a\x15\xa1" + "\x9f\xcd\xf8\x9d\x8d\x7c\x1a\x85\xb6\x3e\x04\xdc\x52\x6e\x0f\xed" + "\xb8\x00\xb3\x12\xb0\x8a\x18\xa7\x2f\xdd\x64\xc3\xbb\xe7\x4b\x85" + "\x5f\x93\xe6\x49\x69\xd3\x6c\x29\x5e\x83\x87\x98\x7f\x14\xdd\x76" + "\xd2\xfc\xa0\x08\xfb\xc2\x7b\x09\x3c\x66\x6b\x0d\x9e\xe4\x7c\xd8" + "\xfa\x07\x31\xce\xcc\x53\x5b\xf0\xbb\x9f\x98\x7f\x5a\x4b\xd7\x70" + "\xd9\x0f\x99\x87\xe6\x97\x06\x37\x4d\xa2\xd2\x24\xbc\x3b\x0b\xc2" + "\x16\x7a\xa2\xd4\xec\x8a\x78\x52\x1a\x5b\x4b\x79\x5c\x4e\xa0\x0e" + "\xd7\x2b\x21\x6b\x12\xec\xdd\x24\x11\xb6\x96\x07\xcc\x23\x8b\x9d" + "\xa2\x35\x98\x8b\xb2\xa5\xc4\xfd\x61\x3e\xe2\xf2\xf3\xba\x84\x3f" + "\x62\x1b\x99\xc7\x7d\x13\xa9\x2e\x6a\xe9\xba\x83\x78\xcd\xd1\xd2" + "\xb5\x9f\xf9\x54\x13\xb6\x91\x0e\xf0\x68\xdf\xbc\x2e\xd7\x90\x27" + "\x2e\x52\x12\xd2\x22\x2d\xc5\x07\x91\xdf\x8c\x72\xc7\x25\xdf\xce" + "\xbf\x18\xb6\x86\x6d\x29\x9e\xb0\x67\x64\xf6\xfc\x8b\x7d\xa2\xa5" + "\x78\x27\x2d\xe9\x72\x81\x56\x07\x69\xde\xd9\x70\x72\x6b\x69\x11" + "\xca\xf4\x20\x7d\xbf\xe4\xff\x79\x67\xbb\xc5\xfc\xe7\xc5\xf9\xf9" + "\x17\x3f\x15\xf3\x8a\xc5\x87\x05\xe5\x94\x3a\x62\x93\xd0\x58\x2e" + "\x8e\x77\x1c\xa4\x11\x27\xfd\xc4\x32\x91\xbb\x54\x13\xf3\xce\x9e" + "\x17\x4f\x3c\xcf\xb4\x99\x4e\x2d\xc5\x90\x9f\xf2\x9d\x4c\xef\xa6" + "\x96\xe2\x23\x68\x7f\x36\xe0\x3a\x85\xaf\x7c\x2f\xca\x7a\xad\x4b" + "\xce\xda\xe8\x78\xc7\x4e\x0a\xa7\xa5\x78\x22\x35\x29\x8d\x5a\x5a" + "\x8a\x57\xab\x49\x69\x13\x69\x23\x1d\xe1\x9a\x91\xd9\x91\xb4\x91" + "\xe0\x81\x91\x8d\x18\xa7\x6b\x78\xcc\x7b\xb1\x06\xc7\xfb\xbe\x5e" + "\x1e\x7f\xcf\xc8\x26\xf4\xb5\x0d\xfa\x4e\x28\xde\x1f\xd9\xc4\xeb" + "\x68\xd4\x6d\xeb\x4b\x1b\xe9\x45\xb9\x36\x25\x5f\x23\xfd\xcc\x97" + "\x72\xbe\xa9\x1d\xf9\x29\xe6\x87\x64\xe4\x07\xfa\xd2\x52\x09\x7f" + "\x36\x51\x9b\x5a\x08\xf8\x69\x92\xa7\x3c\xa9\x85\xe2\x6e\x0f\x6c" + "\xc7\x8b\xcc\x93\x4e\x91\x96\x0a\xbe\x9c\xe6\x04\x1d\x21\x2b\xa9" + "\x85\x5a\x4d\x6a\xa9\x48\x4f\x6d\x0c\x49\xfe\x4f\x6d\x60\xf8\x7d" + "\x1b\xb3\x78\x8d\x6d\x46\x7e\x93\xa8\xb5\xde\xd8\xc3\xfc\x6a\xb3" + "\x3a\x34\x9b\xd5\x25\x3c\xd6\xec\x1f\xbe\x20\x02\x11\x8f\x35\x4f" + "\xf3\x58\x73\xc2\x43\x61\x97\x96\x1f\x21\xd6\x51\xe1\xdf\x09\xd0" + "\xe1\x0f\xa0\xc9\x7e\xc9\x03\xbe\x72\xc8\xc1\xfa\xb1\xae\x96\x2e" + "\xf0\x43\xe9\x2f\xa4\x7e\x6a\x0d\x9e\x90\x74\x15\x69\x56\x07\xf3" + "\x15\x8f\xf1\x13\xa5\xe4\x12\x35\xd6\x6c\xad\xc6\x9a\x13\xa9\x01" + "\xdc\x34\xb4\x93\x9e\xf6\xfb\x90\x94\xd9\x34\xf0\xec\x11\xd4\xf9" + "\x03\x29\x3e\x4f\xf3\x0e\xa6\x27\x59\x5f\xb1\x8e\x5a\x10\x0e\x31" + "\xdf\xfc\x85\x75\x9b\xd2\x55\x54\x60\xe8\x2a\xd6\x53\x6c\xeb\xb3" + "\xae\xd2\x74\x5d\xa5\xe9\xba\x4a\xbe\xdb\xa0\x6f\x3c\x23\xf2\x58" + "\x27\x2d\x28\x57\xba\x66\x41\x24\x5b\x80\x3f\x52\x00\x23\x4f\x8d" + "\x07\xca\xd4\x8e\x58\x22\xcb\x4b\x3a\x8d\x70\x69\xd0\x39\xf8\xf3" + "\x68\x4a\xe7\xb4\xe9\x3a\xc7\x64\xe8\x9c\x08\xe6\x2f\xc8\x95\x96" + "\x48\xe7\x68\xba\xce\x89\x08\xa5\x73\x34\x5d\xe7\x70\x7a\x44\xd7" + "\x39\x91\x04\x3a\x07\x32\xcd\xfd\x4d\xd6\x75\x8d\x8b\x75\x0d\xf7" + "\x17\xfc\x96\xa3\x29\x5d\x53\x08\x3b\xdf\xc4\xba\x26\x82\x3a\x9a" + "\xa1\x6b\x7a\x64\x7d\x17\xeb\x9b\xbe\x7f\x24\xe8\x50\x07\xb1\x9e" + "\x91\x3a\x25\x3c\x2e\xcc\x3a\x05\xf4\x9b\x19\xaf\x53\x00\xcf\x83" + "\x67\x9b\xae\xab\xbc\xd6\x4d\x22\x0c\x9d\xd2\xb8\xa0\x3c\x88\xb1" + "\xfe\x04\x6b\x5d\xe8\xee\xf2\x32\x97\xaf\x3c\x4c\xd0\x05\x6d\xa2" + "\xd5\x45\xc0\x11\x3c\x1c\x81\xbe\x20\x82\x6c\x3a\xc2\x90\x73\xf0" + "\x79\x76\x6b\xe9\xc7\x14\x81\xbc\xce\xeb\xea\xf6\x3d\x11\xcc\xb2" + "\xcd\x3b\x2b\x02\xa0\x8f\xff\x89\x52\x17\x74\x4c\x56\xa0\xa5\xeb" + "\x03\xca\xed\x10\x5a\x6e\xa1\xdf\x01\x39\xc8\x9e\xb7\xc2\x6b\x7d" + "\xe2\x79\x1b\x64\x4d\x78\xa1\x1b\xff\xef\x79\x67\x6d\xd6\xc5\x1d" + "\x74\x7d\xee\x52\xa1\x45\x20\x6b\xe8\x6f\x23\xfa\xdd\x04\xdc\xbd" + "\x90\xbb\x36\xc8\x9a\x23\x1c\x27\x6b\x90\x9b\x7d\x78\x76\x28\xfa" + "\x8d\x6c\x83\xac\x35\x69\x72\x4e\xeb\x90\xeb\x2b\xb4\xd3\xc6\x7b" + "\x4f\x90\xb7\x26\xad\x46\xc9\x9b\xa6\xea\xf9\x35\xa6\x9f\x49\x97" + "\x37\x8c\x05\xf2\x03\x90\x1d\xd0\x7a\x10\x79\x2b\x8d\x93\xb7\xe7" + "\x75\x79\x4b\x53\xf2\x86\x71\x4d\x8e\x6c\x54\x32\xc7\x6d\xf0\x3a" + "\xac\x5f\xe6\xd2\xad\x0e\xc1\xb6\xa3\xe4\x1f\x29\x77\x98\x5f\xac" + "\x79\x90\xb9\x1c\xc8\x1c\xe0\x89\x00\xeb\x4f\xf0\xe7\x7f\xf0\x9c" + "\x37\xbf\x54\xfc\x47\x41\x64\xac\x0b\x32\x95\x07\x9d\xf6\x29\xf4" + "\xe9\x7f\x3c\x11\xa4\x46\xc8\x94\x03\xb2\x94\x0d\x99\xca\x81\x6c" + "\xb1\x4c\x79\x23\x1b\x19\x66\x9a\xb7\x1f\x86\x9c\x33\x63\x65\x4a" + "\xed\x5c\x27\xde\xff\xeb\x71\x5f\x0f\xcd\xf8\xeb\x23\x6c\xaf\xe0" + "\xb9\xd3\x4f\xbf\xf1\xe8\xcf\x41\x3f\xed\xd9\x26\x6d\x1d\xc8\x62" + "\x69\x15\x5d\x7b\x86\x6e\x38\x00\xbe\x27\x3c\xa7\xe0\xf9\xe0\x82" + "\x9b\x3f\x84\x4d\xb1\xd9\x82\xb6\x7b\x58\x1e\x85\x7b\x2a\xd6\x16" + "\x94\x03\x7e\xb4\x88\x9e\xac\x14\xd8\x8f\x97\x44\x9f\x9d\xf7\x98" + "\xac\x78\x4f\x05\x0d\xc6\xe3\x37\x7d\xef\x25\x1a\x8d\x3f\xfb\x5e" + "\xb7\xe6\x62\xfb\x0a\xcf\xd9\x62\x9d\x7d\xf8\x8e\xb5\x34\xd1\x1a" + "\x24\x4b\x83\x5b\xcb\xb7\x6e\xb2\xf1\x5e\xcb\x68\x7e\x16\xee\x86" + "\xa6\x86\x4b\x64\x66\x3b\x52\x4b\x43\x7b\xe5\x56\x21\x56\x67\x51" + "\xc3\x2a\xe8\x09\x37\xd9\x1b\xdc\xa2\x29\xd2\x23\x65\x33\xdb\xc0" + "\x85\x71\x03\x9e\xd7\x01\xcf\x23\x0f\xaf\xcf\xa1\x3f\x94\x53\xc2" + "\x3d\xca\x1e\xf7\x0d\xfd\xfd\x1f\x24\x3f\x6c\xd0\x24\x71\xbe\x23" + "\xd3\xa0\xd3\x20\xfb\x59\x66\x9e\xaf\x23\x6b\x45\xa0\xfa\x69\x62" + "\x5a\xd8\x9d\x61\xf1\x9f\xa0\xa3\xab\x2a\x42\xd7\x2d\x58\x7f\x83" + "\xf0\x75\x09\xaf\xaf\xfc\x2c\x35\x20\xbf\xaa\x42\x68\x5a\x5a\x46" + "\xbb\xa8\xc9\x38\xd1\xbd\x56\x84\xf7\x4a\xbb\xd7\xe1\xf2\xd3\x5d" + "\x0e\x35\x16\x29\x4d\x72\x5d\x67\xcb\x38\x01\x58\x69\x0c\xab\x05" + "\xf5\x23\x35\x19\x27\x51\xee\x80\x9f\x9a\xe5\x99\x01\xe4\xb9\xa9" + "\x74\x03\x65\x9c\x21\x87\x5f\xda\xf6\x9e\x8c\x2e\xd6\x0b\x48\xb3" + "\x21\xad\x0b\xf0\x03\x28\x8f\xf5\x71\x93\x5f\xd9\xba\x8e\x2e\xa3" + "\x1c\x9e\xbd\xfc\x1c\xc3\x43\xf2\x54\x83\x30\x5e\x8e\x81\xc3\x90" + "\x24\x9d\xad\x8c\x7f\x36\xfc\xe5\x24\xce\x1e\xd0\xeb\x23\xb3\x61" + "\x77\x91\xb3\x92\x32\x31\x3e\xc0\x6f\xdc\x52\x67\xb9\x38\x2d\xdc" + "\x8e\xd0\x5b\x1b\x42\x58\x17\x8c\x2b\xf1\xd3\x8b\x1d\x83\xdb\xcf" + "\xb0\x7b\x2e\x89\xce\xea\xb5\xfd\xb4\xfc\x6c\xc1\x7a\x4d\xf0\x33" + "\xeb\xa5\x06\xa4\x33\xdd\x00\xe7\x90\x41\xb3\xc1\xc7\x25\xa3\x53" + "\xad\x03\x6f\x1c\x2d\xdc\x82\xbc\xd7\xf3\xf9\xc1\x8d\xd7\x2a\x3a" + "\x8c\xf4\x76\x43\x9f\xf0\xfe\x68\x03\xe8\xbd\xda\x2e\x42\x3d\xee" + "\x1b\x61\xff\xdf\xe2\xd1\xf7\x62\x82\xbe\xf0\x1c\xd6\x31\x09\xe7" + "\x2f\x3e\x9f\x19\x80\xff\xad\xa9\xad\x99\xd0\x47\x52\x47\x2d\xda" + "\x5f\xa5\xf0\x0e\x31\x5c\x6f\xd5\x05\xea\x40\xfe\xea\xa0\xe8\x14" + "\x9e\x45\x75\xbc\xd6\xf0\xae\xed\xe5\xb4\x3b\xc0\xdb\xc2\xbb\x8a" + "\x71\xfa\xd6\x1d\xde\xeb\x7b\xe9\x34\xd6\x79\x58\xe3\x05\xd4\xbe" + "\xcc\xb7\x1c\x47\xcb\x48\xdf\xeb\xb9\xb1\xd1\x4f\x13\xf3\x0d\xbc" + "\xd8\xde\x00\x7d\x99\xd6\x4d\x6c\x77\xf0\x9e\xfb\xea\x0a\x11\x62" + "\xfb\x03\x65\x8f\x1b\x7d\xe0\xfe\xe9\xfd\xf2\x47\xf7\x0b\x38\x04" + "\xb0\x66\x96\x34\x58\xbd\x9e\x2c\x0e\x45\x6b\x0b\xf7\x97\xfb\xc2" + "\x7d\x96\x7d\x91\xba\x16\x73\x45\xf8\x0e\xac\xc1\x64\x7a\x5b\x8f" + "\xfb\x5b\x58\xff\xdc\x12\x54\x3c\x75\x63\x63\x3c\x1f\xf5\x8f\xa3" + "\x2d\xc5\xe5\xfc\x92\xae\x77\x6a\xe2\x14\x60\xbe\x0f\x3a\x25\xf3" + "\xaf\xc6\x36\x77\x88\xf9\x77\xdc\x61\x9e\x9b\x7d\x15\x17\xd9\xd6" + "\xe6\xb2\xa3\x50\xb6\x03\x65\xfe\x49\x2f\xfb\x4f\xea\xbc\x45\xfe" + "\x0e\xe3\x5f\xcc\x67\x95\xc0\xc3\x1b\x90\xf3\xfe\xa2\x42\xe3\x5d" + "\xe0\x1d\xbf\xe5\xa2\x66\xdc\xe1\xc4\xb8\x58\x5d\x3c\xaf\x45\x2e" + "\x89\x2e\xb4\xf3\x0d\xe6\x29\xe7\x7a\xfa\x26\xf8\xf2\xb3\xaa\x4a" + "\x1a\xc5\xfc\x24\xd2\x32\x82\x8a\xee\xe3\x53\x84\x1b\x76\x28\xb4" + "\x6a\xe9\x5a\xca\x80\x1c\x75\x9d\xa1\xf1\xe3\x0a\x2a\x1c\xc0\x95" + "\xa8\xfa\x1c\x91\xd4\x41\x69\x19\xd0\xc7\x9f\x53\xc3\x39\xde\x6f" + "\x19\x9f\x63\xf0\x22\x9e\x73\xaf\xa4\x2f\x30\xdf\xe8\xfb\x05\xe3" + "\xdf\xe7\xfd\xf5\x53\x34\x7e\x3f\xf7\x17\x7f\x49\x48\xdb\x25\x2e" + "\x89\xc5\x42\xcd\x6d\x01\x3f\x8d\x6f\xc3\xfc\x42\xf2\xcf\x4d\x85" + "\xea\x7d\x64\x00\xe5\xb6\x88\x4b\x9a\x4c\x47\x5a\xbd\x70\x27\xb1" + "\x4c\x1c\x41\xdb\xc7\xfc\x34\x63\x9a\x1a\x9b\xf1\x3b\x19\x56\x62" + "\x1c\x46\x06\x30\xb6\xc4\xbc\x79\x9a\x26\xdc\xea\xa8\x4a\x02\x1e" + "\x13\x86\x48\xb9\x00\xac\x06\x93\xd2\xdb\x1a\x70\xdd\xe7\xd6\x8a" + "\xa1\xa3\x8b\xb5\xda\xf1\xd9\xf2\x59\xcf\x13\xfa\x7c\x9a\x18\xfe" + "\xa2\xfd\xde\xb1\xcc\xe3\x13\xb6\x29\x38\x8b\xea\xbc\x63\xcf\xf0" + "\xfb\x76\x7e\x0f\xda\x26\x64\xfb\xea\x72\xd0\xfe\x19\x6e\x77\x9b" + "\xda\x07\x98\xb0\xbd\x1b\x6d\xf4\xb8\x27\x6c\xf3\xd3\xa4\x22\x75" + "\xd6\x30\x21\x7b\x10\xd9\xb3\xb1\xec\xb0\xcc\x29\x99\xfe\xf6\xbc" + "\x96\x46\x29\x7f\xfe\x6e\x5b\xaa\xa1\x37\x58\x36\x53\x4e\xd1\xb7" + "\x73\x5b\xec\x92\xbf\x4d\xc2\x34\xa1\xeb\x6d\x2d\x60\xe2\xf3\x20" + "\xa5\xbe\xbe\x9d\x7b\xf9\xdf\x4d\x50\x80\x37\x65\xe3\x6f\xba\xfe" + "\x3e\x17\x7f\x8b\xf1\x77\x10\xef\xd3\x25\xed\xf6\x14\x25\xf9\x91" + "\xd7\x0d\xfb\x9d\xdf\xfd\x74\x53\x96\xd8\x33\xde\x04\xfb\x44\x3e" + "\x37\x7c\x93\xf7\x12\x6e\x5a\x88\x31\x38\xa9\xc6\x82\xe1\x50\x12" + "\xe4\x91\xe9\x2e\x9c\x75\x22\xd4\x5c\x15\x04\xde\x37\x6d\x69\xae" + "\x0b\x92\xe3\x26\xee\xff\x4d\x5b\xb9\x4f\x41\xd0\x9f\x7f\x57\xd7" + "\x89\xc0\xd1\xfa\x30\xf1\xb9\x14\x60\x41\xfe\x7f\x34\x5b\xed\x4b" + "\x2c\xf2\x32\x3c\x9d\x27\x84\xd1\x7f\xa5\xd3\x26\x64\xf3\x58\x02" + "\xd6\xc7\xe8\xbb\xf5\x1c\x7d\xfb\x5a\x91\x3e\x3e\xfb\x68\x31\xd1" + "\x5e\xe8\x11\xcc\x35\x72\xbf\x1c\x7a\x89\x61\x62\xfe\x9f\x30\xdd" + "\x38\x47\xd9\x8e\xfc\x1d\xc8\xc3\xdc\x13\x68\x29\x0e\x11\xc3\x8a" + "\x70\xff\x50\xff\x03\x2d\x60\xc6\x5c\x8d\x31\x9f\x90\x5d\x55\x0a" + "\x3d\xd3\xaf\xb7\x6e\x3a\x52\x79\x56\x84\x8c\xfe\xf1\x59\x65\x8f" + "\xfb\xdb\xe0\xff\x15\x85\x83\xf2\x7f\x3f\xce\x59\x2b\x8e\x8e\x57" + "\x63\xa6\x81\x2e\xb1\x63\x96\x55\xac\xc6\xeb\xdb\xf5\xb1\xe3\x95" + "\x85\x9e\x7c\xbb\x03\x7f\x61\x3c\xa7\xa8\xf7\xe8\xbf\x6f\xb7\x45" + "\xbd\x83\x3b\xb2\x16\x02\x1f\xcc\xff\xe3\xf3\xd5\x38\x70\x3a\xfa" + "\xc1\x3c\xf2\x05\x59\x78\x7f\x8e\xcf\x29\x39\x9d\xf9\x99\xd3\x35" + "\xd8\x33\xe8\x4f\x00\xf9\x36\x96\xd5\x6a\x8d\x62\xf2\x7d\x5b\xc0" + "\x73\x1b\x7a\x19\xff\x7b\xe4\x9e\xe2\xa6\xad\x5b\x99\x4f\x51\x27" + "\x68\x0d\x6f\xdd\xda\xe3\xce\xca\x35\xe8\x8a\x7a\x53\x39\x9f\x79" + "\x12\xe9\x45\xa0\x4b\xa3\x3c\x87\xc4\xda\x2f\xb1\xad\x91\xb5\xb5" + "\xdf\x26\xb3\xa5\x16\xb2\x3e\xea\xa2\x9b\x77\x42\x67\x61\x6c\xc7" + "\x67\xa9\xb9\xe6\xe6\x5d\xfc\x0e\x5d\xf9\x19\x9e\x3d\x2d\xd0\x49" + "\xbd\xb5\x19\xf9\x7d\x26\x1a\xd6\x6b\xa2\x9c\x70\xed\xe6\x89\xe1" + "\xf4\x51\x45\xbe\xce\x43\xd4\x1a\xfe\x25\x39\x9e\x96\x30\x5e\xf2" + "\xa1\xe7\xce\xf5\x22\xf2\x4e\xef\x01\xb3\x2f\x7c\xde\x8b\xb9\xf9" + "\x86\x33\x74\xb3\xa4\xc7\x2b\xa7\x30\xeb\x3f\x21\x61\xeb\xf4\xd9" + "\x6c\xd9\xb1\x5c\x84\x77\x9c\x16\x41\xd8\x77\xc3\xb7\xf7\xd2\xc4" + "\xdd\x1b\x28\xbb\xbe\x97\xc6\xef\xeb\xa5\x2c\xf1\x97\x2c\x53\x3d" + "\xec\xb6\x27\x2e\xda\x58\x3f\xe4\xa7\x96\x92\x65\xdf\x06\x92\x3c" + "\x12\xa9\x81\xfd\x16\x86\xfd\x76\x3e\x8b\x75\x63\xbf\xfd\xd6\x27" + "\x6d\xe3\xcc\xc5\x8a\x8f\x32\x17\x8f\x2c\xa6\xa4\x94\x42\xb2\x01" + "\x3f\xe7\x39\xca\xfa\x63\x4a\x07\x6c\x47\xf4\xd9\xaf\xf7\x17\xb4" + "\x3b\x69\x2d\xa6\x61\xb2\xaf\xd0\xd7\xa2\x66\x7c\xd6\xa0\xf3\xb0" + "\x89\x79\x2a\xc8\xf2\xc0\x7d\xf8\x8c\xcf\x4a\x0f\x8d\x0d\x99\x57" + "\xd7\x8b\x10\xa7\x97\x8d\x13\x21\xa4\x1f\xe3\xb6\x9b\x90\xde\xe3" + "\xbe\x39\xe0\x37\x0f\x9b\x3a\x18\x8f\x62\x9d\xa4\xeb\x95\x5b\x9e" + "\x17\x26\x17\x78\x34\xb5\xb1\x32\x0c\xfb\xfb\x1c\xcb\xec\x2d\xa5" + "\x0b\x4a\x44\xd8\xb1\x92\xcf\xad\x6f\x29\xe4\x33\x75\x3e\x4b\x7b" + "\x1b\xb6\xcd\x57\x9d\xa3\xf3\x7c\xc1\xeb\x05\x6b\x09\x60\xd6\xa6" + "\x36\x0a\xac\xd3\xbf\xae\x1d\xcf\xbe\x1c\xaf\x4a\xbf\x91\x5b\x0e" + "\xfa\xe9\x87\x66\xc6\x9d\xcf\x4c\x59\x77\xc2\xde\x1a\x05\xbc\x3a" + "\x83\xa0\x03\xf2\x31\xff\x7f\xbf\x5d\x3f\xf7\x94\xfe\x28\x48\xc3" + "\xfc\x7f\x7f\x26\xa7\x95\x8d\x23\x7b\x99\x43\x74\x0e\x66\x33\x49" + "\x1f\x11\x13\x7d\xa3\xc7\xfd\x0f\xa3\x0d\x38\x98\xa7\x7e\xd6\x6d" + "\x7a\xf8\x61\xa4\x65\x19\x70\x50\xe6\x5a\xbc\x4f\xeb\x2f\xa3\xea" + "\xcc\x8d\xaa\xf3\x70\xb7\xe9\x96\x9f\x21\x6d\x71\x5c\x9d\x92\xb8" + "\x3a\x15\x51\x75\x5c\x7a\x3b\x9e\xb8\x3a\x8d\x71\x75\x9a\x12\xe0" + "\xd6\x1c\x57\xe7\x44\x5c\x9d\x8e\x04\xb8\x85\x62\xeb\x4c\xb4\xc4" + "\xd6\x99\x68\x8f\xa2\x25\xfb\x6b\x60\x7e\x9a\x38\x31\xae\xce\xf4" + "\xb8\x3a\xb9\xc6\xfb\x60\x3e\x39\xab\xf7\x92\x1d\xbc\xd9\xc9\xe3" + "\xf9\x2a\xc6\xa7\xfb\xf5\x67\x7a\xf4\xba\x5b\x2f\xef\xd7\xc4\xfa" + "\xb8\xf6\x0e\xc6\xb5\x77\xe4\xf2\x7e\x4d\x6c\x8b\xab\xe3\x8f\xab" + "\x13\x88\xaa\xd3\xa8\xda\x99\x64\x8e\xad\x33\x69\x74\x6c\x9d\x49" + "\xe3\x2f\xe7\xab\x49\xd3\xe2\xea\xcc\x8d\xab\x93\xff\x15\xb4\xe0" + "\x79\x5c\xf9\x4e\x8d\x61\x5b\xf9\x5e\xd8\x08\x93\x3e\x62\x9f\x80" + "\x6a\xb4\xf1\x56\x6f\x68\x08\x9f\x7f\xf0\x7c\x75\xb4\x3c\x04\x1d" + "\x3a\x09\xeb\x9f\xdb\x1d\xc6\x9c\xc5\xfe\x12\x2c\xd3\xca\xc6\x9e" + "\xb4\x75\x30\x5b\x94\xdb\x31\x7c\xa9\xb8\xad\xa3\x99\x3c\x4f\x4d" + "\x0a\xf6\xdb\xc4\xca\xbf\x88\x14\x9c\xc9\xf7\x33\x1c\x6e\xbf\x41" + "\xf9\x61\x24\xb1\x4d\x7e\xb4\x9c\xeb\x4c\xce\x8a\xb2\xa3\xb9\xfd" + "\xe0\xa1\x0d\x21\x73\x2c\x1e\x93\x2d\x57\xc0\x23\x05\xb6\xd1\xd6" + "\xd6\x7a\x22\x3e\x63\x6e\xa9\x87\x0d\x04\xbb\x9f\x71\x3b\x45\x93" + "\x3d\xd2\x26\x5b\xd9\x4b\xfc\xec\xab\xb8\x4b\x9e\x41\x2b\x9b\x74" + "\xf2\xb1\x66\xb4\xcf\xb6\x7b\x73\xe9\x05\xea\x96\xf3\x2f\xdb\x6e" + "\x93\x2f\x1e\xad\x08\x30\x5e\x5e\xc3\x3f\xc3\x4f\x93\x83\xd2\xd6" + "\xf0\x2c\x72\xf1\xf9\x38\x9f\x19\x1d\x0d\x4e\xe3\x32\xe0\xff\x49" + "\xc7\x8d\xfe\x62\xae\x07\x0f\x4c\xae\xbf\x12\xcd\xd4\x18\x4e\xc9" + "\x8c\xe5\xc9\x21\xe0\x95\x29\xd9\xb1\xe3\x3e\x25\x27\x76\xdc\xa7" + "\xe4\xc5\xf2\xa4\x09\x3c\x39\xa5\x28\xae\x4e\x59\x5c\x9d\x2d\x51" + "\x75\x3c\x7a\x3b\x75\x71\x75\x0e\xc4\xd5\x39\x1c\xf5\x8e\x3e\x4e" + "\x39\xd6\xbf\xf6\x91\xbe\x3f\x53\xda\xa3\xde\x4d\x3b\xa5\xfe\x9c" + "\xd2\x65\xa4\xf1\x1e\xd2\xbe\xd7\x94\xef\x89\x82\x97\x6d\x89\x93" + "\x77\x94\xcf\xce\x8c\xc5\x21\x7b\x62\x2c\x0e\xd9\xfd\xf2\x5f\xad" + "\xd6\x6e\xbf\x3f\x4d\xb7\x8e\x96\x3c\x04\x19\xc1\x9c\xbd\x80\xdf" + "\x01\xab\x0e\xe5\x41\x87\xec\x92\x38\x78\x15\x71\xf0\xb6\x45\xbd" + "\xdb\xf0\x5e\x1f\xd5\x07\x5b\xb2\x5d\xfa\xf1\xc1\x7e\xcb\x3e\x64" + "\xa4\xf3\x9a\x12\xf8\x76\x3a\xe5\x5c\x93\xc3\x3e\x55\xe9\xa7\x28" + "\xfb\x4d\x5e\x7f\xea\x30\xa3\xe5\x9f\xf4\x7e\x05\x63\xf1\xb8\xd5" + "\x1c\x8b\xc7\xad\xa3\xa3\xfa\x15\xb4\x6e\xa2\x07\xac\xe1\x07\x1f" + "\x65\xdb\x87\x7d\xe1\xa4\x6f\x53\x25\x6c\xb6\x8b\x64\x63\x9f\xb2" + "\xd3\x65\x94\xec\x2b\xef\xc4\x5a\x2e\x33\x7f\x50\x7e\x4a\x5f\xe4" + "\xd1\xfd\xf2\x1c\x80\x5f\x66\xf0\xa3\x56\xbb\xc8\xa3\xd5\x7c\x0b" + "\xf3\xf2\xad\xd0\x7f\x53\x48\xd9\xb9\x37\xe6\x09\x67\x7e\x1d\xe8" + "\x89\x75\xd1\x6d\x6b\xf4\x75\x04\x9f\xb3\xb3\x4f\x4e\x27\xe6\xf8" + "\x14\x75\x36\x7e\xeb\x91\x28\xbe\xc6\x1a\x6e\xa6\x38\x45\xb7\x6d" + "\x62\x1b\x80\x65\x94\x7d\xac\x8e\x86\x03\xc4\x6b\x6f\x5f\xf8\x8c" + "\xb4\xdd\x90\xef\xd2\xeb\x86\xa2\xea\x06\xf4\xb5\x31\xcf\xa3\xe6" + "\x29\x61\x32\x1f\x0d\x06\x08\x70\x46\x2b\x7b\xef\xb6\x4d\x47\x21" + "\xaf\x3d\xee\xdb\x26\x1a\x75\x78\x1d\xcd\x75\xac\x65\x64\x9e\x5c" + "\x41\x66\xef\x86\x53\x12\xb6\x3e\xf6\x9d\xb0\xa5\xbb\x7c\x15\x9d" + "\xe4\x0b\xb6\xf3\x5e\x97\x59\xf9\xa9\xdc\xe6\x4a\x0e\x91\xa5\xbb" + "\x66\x91\xcb\x8f\xe7\x48\xcd\xa2\xad\xc0\x0d\xf3\xdb\xad\xfb\x59" + "\xdf\x44\xd3\x6e\xce\x9c\xbc\x07\x17\xcc\x9b\xb4\xe8\xc1\xfb\x17" + "\xce\xb9\xcb\xb1\x70\xc5\xb3\xcb\x8a\x26\x3d\xb7\xa6\xcc\xb1\x6e" + "\xd5\x8a\xb2\x15\x2b\x7f\xe4\xc8\x2e\x9f\x50\xee\x58\x5a\xa6\x7e" + "\xb3\x4a\x96\xae\x2e\x9b\xc1\x8f\x13\x1d\xa5\xab\x96\xad\x95\x8f" + "\x37\x0f\xa7\x58\x20\x2b\xca\x96\xad\x72\x4c\x28\x9a\xe8\xb8\x6f" + "\xe9\x8a\x92\x35\xab\x96\x25\x84\x75\x97\x63\xd5\xb2\x55\xcb\x96" + "\x16\x39\x66\x38\xb2\x19\x72\x34\xb8\xa8\xf1\xcc\x36\xe6\x31\x9e" + "\xbf\xaa\xdd\xa2\x4d\x9f\xcf\xfc\x8a\x7f\x6e\x5f\x78\xf9\x5c\x76" + "\x7b\x71\x2c\xcf\xdd\x5e\x1e\xcb\x73\xb7\x6f\xbd\x7c\x2e\xbb\x3d" + "\x6e\xfe\xbb\x3d\x6e\xfe\xbb\xfd\xc8\xe5\x73\xd9\xed\x71\xf3\xdf" + "\xed\x71\xf3\xdf\xed\xfd\xf3\x1f\x78\x49\xfa\x8f\xf5\xb8\xa7\xc6" + "\xcd\x7f\x53\xe3\xe6\xbf\xa9\xe3\xe3\xde\xa7\x46\xbd\x8f\xc2\xfb" + "\xec\xe8\xf9\x11\xef\x0b\x0d\xf9\x1c\xd0\x2f\x53\x8b\x8d\x32\xac" + "\xeb\xa1\x9b\x3b\xf4\xb2\xae\xa8\xb2\x9d\x7a\xd9\x9d\xfd\xf2\xc7" + "\x67\xdf\x48\x57\xeb\xf5\xa9\x5f\xb2\x4e\x67\x3f\x34\x9e\x9b\x20" + "\x1f\x37\x9c\xa3\xa9\xcf\x33\x2c\xe6\x61\xf6\x4b\x14\xaf\x3f\xde" + "\xd3\x90\x4e\x16\xae\xd3\x50\x4b\x66\xe1\xbe\x6d\x1b\x7e\x09\x69" + "\x29\xf8\x83\x4e\x99\x0a\xfb\xd7\x62\x56\xf3\xc5\x1d\x39\xd2\xe6" + "\x47\x1d\x05\xff\x0e\xb9\xae\x01\x1c\x3b\xea\x58\xaa\xd5\x5c\xdc" + "\x81\xe7\x14\xe6\x69\xd4\x37\x0b\xd3\x6d\xff\x86\x5f\x42\x9a\x0d" + "\x7f\xa3\x7b\xdc\x77\xe4\x18\xf0\xf8\x8c\x3c\x91\xfc\xc7\xdb\xb9" + "\xfd\xeb\x41\x13\x59\xab\xdd\x5a\xbb\x4f\x63\xdb\xfa\x8e\x32\xb5" + "\xb7\x90\x51\x2e\xdc\x1f\xe6\x37\x20\x3d\xf1\x3a\xe9\x0e\xd8\x7f" + "\x77\x14\xab\xfd\x96\x3b\x30\xfe\x3f\xdc\xa9\xf6\x4e\x33\xca\xa1" + "\x6f\x7b\x4f\xd3\x77\x1e\xc6\x6f\x1f\x7e\xef\x34\xe0\x7b\xe5\x7a" + "\xfb\x8e\x13\xc2\x9d\xf4\x10\xc3\x8d\x4b\xef\x82\x7e\xeb\xb5\x86" + "\x5d\xf9\x97\xe7\x7d\x07\x6b\x98\xe4\x07\x13\xa4\xf3\x9e\x7f\xaf" + "\x9f\xbe\xb3\x90\xf1\x8d\x4a\x9f\x26\xdc\xa9\x0b\xb9\xbc\x9f\xdb" + "\x43\x9d\xc1\x6c\x6d\xc3\xef\x54\xf9\x89\x7f\x67\x4b\x5c\x3f\xbe" + "\x3c\x4d\xdf\x4d\x52\xfd\xf8\xee\x92\xb8\xb6\xeb\x13\xf7\xe3\x3b" + "\x87\xd0\x8f\x2f\x07\xe9\x47\x9b\xa4\xad\x09\x7d\x31\x5d\x96\xc7" + "\xf6\xcf\x97\x92\xee\x31\xe9\xdf\x35\xeb\xb6\x50\x10\xeb\x30\x1b" + "\xf2\x64\xdd\x87\x2a\x06\xc6\x4d\x2f\x37\xd1\x5a\x47\x79\x97\xb7" + "\xf9\xdd\xd9\xc2\x3d\xec\x21\x3f\x7d\xb7\x42\xc2\x19\x48\x5f\xac" + "\x70\x01\x9d\x4c\x4c\x27\xf4\x07\xf5\x06\x1b\x6f\x63\x5d\xa2\xf6" + "\x42\xbe\x0b\xf9\xff\x4e\xa1\xb1\x97\xb9\xba\x42\x04\x0c\x3a\x22" + "\xef\x58\x5c\x5e\x28\x2a\xaf\x23\x26\xaf\xb2\x3f\x3d\x6c\xa4\x7f" + "\xbd\x71\x9a\x36\x31\x6e\x9c\x30\x3e\xd3\x3e\x88\xed\xf7\xb4\xe9" + "\xaa\x7f\x18\xa3\xcb\x68\x3d\x2d\x1f\x63\xd4\x97\x78\x8c\xa6\x95" + "\x25\xe6\xb5\x69\x72\x1f\x4d\xa4\x53\x22\x78\x07\x30\x76\x7d\x92" + "\x07\xf5\x71\xba\x7c\x7c\xa6\x1d\x37\xc6\xe7\xeb\xf5\xf1\x4e\x5b" + "\x5c\x1f\x23\xa7\xe9\xce\xed\xaa\xaf\x77\x7e\x12\x0b\xfb\xce\xac" + "\xc4\xbc\x78\x67\x0e\xfa\x19\x49\xdc\xcf\x3b\x17\x0f\xce\x8b\x77" + "\x42\xf6\x29\x72\x39\x2f\xde\xa9\x7c\x98\x74\x1e\x8c\xcb\x3b\x28" + "\xdc\x09\xdb\x69\x76\x86\xd9\xce\xbd\x33\xcc\xfb\x4b\x51\xe9\x27" + "\x63\xf9\x0f\x7d\xe0\x7a\x4c\xbf\xb0\xd2\xb3\x3c\x0e\xa7\x1d\x64" + "\xfa\x2a\x9e\xec\x71\xdf\x35\x3d\x8e\x56\xe7\x4f\xd3\x5d\x1f\x74" + "\x9b\x92\xf6\x2b\x7a\x7d\x6f\x53\x2c\x4e\x77\xe5\x27\xa6\xd7\x5d" + "\xa5\xa0\xd7\xf9\xc4\xf4\xba\x6b\xdb\xe0\xf4\xba\x8b\xc7\xff\xfc" + "\xe5\xf4\xba\xcb\x1b\x4d\x2f\xd8\xba\xb2\x7f\xdf\xb2\x83\x37\xfa" + "\x0a\x44\x03\xf7\x35\x42\x36\x2b\x78\x45\xd5\xe9\xe2\x3a\x41\x6b" + "\x48\xf1\x09\x6c\x48\xcb\x39\xba\xeb\xa4\x21\xff\xa9\x75\x34\x4c" + "\xf4\x3d\xce\x3e\x45\x49\x5c\xcf\x57\x7e\xde\xeb\x0b\x67\x13\xaf" + "\x3f\x62\xdb\xfd\xde\xb4\xc4\xba\xe0\x7b\x79\xa0\x69\x6d\x82\xf4" + "\x62\xe5\x4f\xf6\xbd\xc6\x58\x1d\xf1\x3d\x57\xec\x18\x81\x6e\xa8" + "\x47\x03\x77\x70\xae\xf8\x77\xe5\x31\xfb\x5e\xe0\xf2\x31\x9b\x5e" + "\xa3\xc6\x6b\xfa\xf3\xb1\xf8\x4d\xb7\x24\x1e\xaf\xe9\x8e\xc1\xc7" + "\x6b\xfa\xf4\xc1\xc7\x6b\x7a\x3e\x8f\x97\x9f\xa6\x7b\x62\xe7\x8d" + "\xe9\xa5\xb1\xfd\x9d\x2e\x65\x58\x98\x86\x8e\xe2\xf7\xaf\xdb\x6f" + "\xe3\x8f\x75\x1c\x8f\x55\x43\x15\x81\x97\x93\xc6\x31\x8e\x57\x0b" + "\x63\x50\xd8\xa0\xa1\x67\x43\xe2\xf3\x56\x5e\xe3\xb6\xd6\x11\xf1" + "\x39\xb2\xe3\x7a\xb6\xdd\x67\x2c\xd3\x4c\xd4\x8e\x67\xd3\x69\x9a" + "\x79\xab\x66\x32\x55\xf0\x99\xa7\xf4\xdd\x96\x7b\x08\x33\x2a\xa2" + "\xc7\x82\xcf\x3e\x79\x6d\xba\x43\xad\x9d\x3e\x3d\x4d\x77\x0f\x51" + "\xe3\x32\x33\x2d\x96\x8e\x33\x1a\x13\x8f\xcb\x8c\xc3\x18\x97\x4f" + "\x13\x8f\xcb\x8c\x13\x83\x8f\xcb\x8c\x00\xc6\xe5\xd3\xcb\xe5\xe8" + "\x6e\x8b\x2e\x47\x9b\xb9\x8e\x63\x25\xaf\xc7\xef\x5e\xcf\x65\xf0" + "\x0c\x19\xb9\x7b\x29\xe7\x4f\xea\x32\xe4\x48\xd6\x99\x0e\x58\xb2" + "\x7d\xbd\xcc\x34\x1d\x46\x34\xdc\x42\x6b\x57\x22\x39\xb9\xbb\x9c" + "\xcb\x4e\x2e\x25\x0b\x68\x98\xbf\x97\x61\xac\x22\x02\x8c\x16\x2e" + "\xc7\xe9\x58\xe1\x47\xc9\xc9\xdd\x07\x8c\x72\xac\xeb\xf4\xb2\x8d" + "\xa2\xa7\x98\x77\x02\xe2\xdb\xd4\xfb\x3f\x4c\xce\x23\x5c\x9e\xcb" + "\xc5\x95\x09\x29\x79\x9c\x39\x3d\x56\x1e\x67\xda\x62\xf9\x13\xf4" + "\x47\x3d\x0d\x7a\x0e\xcf\x45\xc0\xe1\x6b\xf3\xd7\x95\x65\x73\xe6" + "\xb6\x38\xd9\x04\x0f\xe4\x4c\x52\x3c\x90\x33\x32\x16\xd7\x99\xfb" + "\x13\xf3\xc0\xcc\x23\x83\xf3\xc0\xcc\xf6\xc1\x79\x60\x66\x90\x79" + "\xc0\x4f\x39\x13\x63\x65\x33\x27\x25\xb6\xef\x68\x57\xca\x26\xa5" + "\x5d\x8d\x6c\xc2\x16\x1a\x35\x98\x1c\xb2\x4c\xb1\x0f\x49\x43\xaf" + "\x71\xd6\xf1\xb5\x68\x66\x81\x5c\x31\x7e\x5e\xde\x53\x82\x8e\x9f" + "\xc6\x34\xdc\x27\xef\x06\xe6\x9c\x88\xa6\xe3\x0e\x75\x7f\xcd\x79" + "\x9a\xee\x79\x94\xcf\x95\x15\x3d\xef\x1d\x17\xdb\xff\x9c\x60\x62" + "\x7a\xde\x93\x02\x7a\x3a\x13\xd3\xf3\x9e\xac\xc1\xe9\x79\xcf\x6c" + "\xbe\x1b\x74\xb9\x4c\xdd\xb3\xd8\xb1\x56\xda\x28\xb2\xce\x39\xba" + "\xe7\xbd\xaf\x37\x3f\xdd\xb3\x33\x76\x7e\xba\xa7\xe2\xea\xe7\xa7" + "\x7b\xda\x13\xcf\x4f\xf7\x04\x12\xcf\x4f\xf7\x5a\x94\x3c\xdc\x9b" + "\x13\x2b\x0f\xf7\x3a\x62\x79\x22\x27\xf8\xdf\x37\x3f\xdd\xeb\x89" + "\x93\x81\xea\xd3\x34\x2b\x0d\x36\x85\x4b\x8d\xdb\xac\x8f\xe3\x70" + "\x3c\x98\x78\xdc\xee\x6d\xc6\xb8\x55\x27\x1e\xb7\x7b\xfd\x83\x8f" + "\xdb\xbd\x61\x8c\x5b\xf5\xe5\xe3\x36\x6b\xf4\xd5\xdb\x14\xb3\xe6" + "\xc6\x8e\xd9\xac\xec\xab\x1f\xb3\x59\xdb\x12\x8f\xd9\xac\xfd\x89" + "\xc7\x6c\xd6\x11\x35\x66\xb3\x82\xb1\x63\x36\xeb\x44\xec\x98\x81" + "\x6e\x7f\xe3\x98\x61\x7c\x2a\x94\x7f\xc2\xec\x87\xb1\x6e\x1f\xd6" + "\xe3\x9e\x9d\xeb\xa7\x39\xa3\xd5\xda\x7a\x8e\x9a\x3b\xd4\x18\xbe" + "\x83\x32\x39\x97\xcf\x03\xb3\x8b\xf5\xb4\x45\x97\x8f\xc3\xec\x2d" + "\xd0\xd1\x5d\xcd\x15\xf2\x6c\x4b\x8d\x21\xd3\x1c\xe5\xbc\x1b\xf8" + "\x7c\x6a\xb6\xf4\x5f\xc7\x18\x0b\x5f\x28\x4c\xac\xd7\x51\x3e\xc8" + "\x70\xf8\x4e\x64\x1c\xac\xb6\xab\x99\xe3\xaf\xe0\x53\x53\xe1\xad" + "\xba\x0d\xf0\xe6\x7c\xae\x78\x75\x4e\xbc\xfd\xdb\x80\xbc\xf7\x15" + "\x9f\x7e\xff\x85\x58\x1c\xe6\x2c\x4c\xcc\xa7\x73\x4a\xd0\x87\x86" + "\xc4\x7c\x3a\x67\xeb\xe0\x7c\x3a\x07\xe3\x4f\x0d\x51\x6b\x9f\xf4" + "\x27\xc2\xfe\xb8\xb5\xcf\x9c\x63\xd6\xa0\xe2\x1d\x69\x13\xd5\x64" + "\x54\x00\xe7\x78\xfb\x0f\x63\x73\xdf\xb3\x3a\xce\xcb\x62\xeb\xdf" + "\x37\x88\xfd\x77\x1f\xdb\x7f\xef\x24\xc6\xf9\xbe\x2b\xd8\x7f\xf7" + "\xb1\xfd\xf7\xce\xe5\xb2\x75\x9f\x6e\xff\x25\x5a\xe3\xdd\xb7\x2d" + "\xf1\xf8\xdf\x17\x37\xfe\x94\x5f\x86\xf5\xb0\xac\x1f\x5b\xee\x78" + "\x74\x39\xf6\x4d\xe2\xb2\xcc\x23\x09\xca\x86\xe2\x61\x26\x2e\xf7" + "\x7d\xc7\x65\xbc\xc7\xbe\x54\x09\x79\xef\xfb\xb9\x4a\x1e\xbf\xbf" + "\x3f\x56\x1e\xbf\x5f\x14\x2b\x8f\xf7\xc5\x8d\xdd\xf7\xb7\xc4\xe6" + "\x83\x7f\xfe\xdb\x74\xec\xf7\x83\x71\x3c\xf0\xe1\x69\x9a\xfb\xbc" + "\xe2\x81\xb9\x7f\x8c\xc5\x63\x6e\x4a\x62\x1e\x98\x3b\x1e\xfd\xff" + "\x30\x31\x0f\xcc\xcd\x19\x9c\x07\xe6\xb2\x8f\xcf\x87\xd1\x7c\xfb" + "\x50\x45\xce\xb0\xb8\x32\xae\xc4\x3a\x6f\x6e\x5d\xe2\x3d\x82\xb9" + "\x4d\x8a\xc6\x73\x3b\x63\x69\x3c\xf7\x58\x2c\x0d\xd1\x97\xbf\x9d" + "\x86\xfd\xb1\x09\x7a\xdc\xf7\xc7\xcb\xbf\xef\x34\xdd\xaf\xcb\xff" + "\x0f\xde\x8d\xc5\xf1\xfe\x85\x0a\x97\x44\xfb\x22\xf7\xf3\xfa\xd7" + "\x97\x98\x96\xf7\x6f\x4b\xdc\xe7\xfb\xf7\x63\x0e\xf2\x69\x97\xc9" + "\xd2\xfd\x47\x90\xfe\x10\xef\x87\xf2\x7e\xc8\x3e\xa4\x3f\x14\x26" + "\x8b\x9c\xaf\xfa\xe7\xa5\xfb\xfd\xec\x8b\xc2\xf4\x67\xfe\xb5\x66" + "\x52\x1e\xcf\x41\x8c\x57\x41\x85\xf4\x5b\xb0\x6e\x61\x5e\xbf\x91" + "\x79\xfd\x07\xd2\xfe\xe3\x73\x16\xf6\x23\xb4\x96\x53\x9e\x2f\x18" + "\x26\x83\xdf\xb9\x7c\x2c\xec\x1f\x4c\x67\xb9\xe0\xf2\x46\x59\xb5" + "\x6f\xe6\x8a\xe3\xef\x1f\x14\x25\x1e\xe3\x1f\x54\x0c\xce\x3b\x3f" + "\xa8\x53\xe3\xfc\x83\xe3\xb1\xe3\xfc\x83\x26\xcd\x9d\xba\x90\xfb" + "\xea\x07\x9d\xaf\x66\x8c\xcb\x1c\x22\xa1\x3f\x8a\xd4\xf7\x9b\x1f" + "\x6f\x2f\xad\xa2\xeb\xcf\xd0\x0f\xa7\xca\xf6\x4c\x22\x64\xdd\x94" + "\x44\xcd\x52\x07\xfc\xf0\x25\x89\x27\xca\x14\x84\xc9\x24\x36\x3f" + "\xd3\xce\x79\x0d\x6e\x11\x42\xb9\x36\x3e\x13\xe0\x3b\xc5\xe0\x85" + "\x51\xa7\xe8\x87\xf3\x62\xea\x9b\x89\x7c\x0a\xc6\xd6\x06\x29\x8f" + "\x3f\xdc\x62\xec\xe9\x6e\xc1\x7b\xe2\x7d\xdf\x1f\x1e\x30\x7c\x1f" + "\x94\xcf\xd8\x0f\x07\x3d\xbf\x64\x9c\xf8\xde\x0c\xe3\x74\x65\x3d" + "\xf0\xc3\xb0\xc1\xbf\xca\xd7\x32\x37\x65\xc0\x97\x2f\xd7\x8e\x3c" + "\xef\x15\xf6\x06\xa3\xe4\x20\x77\x76\x34\x1c\x15\x9f\x23\x37\xdf" + "\xf0\xc7\xc3\x73\xd1\x57\xc0\xd2\xf1\xc9\xdd\x16\x87\x4f\x3d\xec" + "\x94\x32\x1d\xc6\x81\x2b\xc1\xe0\x31\x57\x3c\xcb\xfc\x90\xeb\xbd" + "\xd2\x9e\x5f\xb2\x9d\xf2\x5e\xbd\x8c\xb7\x72\xa5\xbd\xc4\x30\xae" + "\x8c\xe3\xbc\xec\x98\xb5\x85\x3c\xbb\xe7\xb3\xad\x79\x11\x25\xf7" + "\xf3\xe2\xf6\x08\xe7\xe5\x4a\x7f\x2a\x5d\xee\x9f\x08\xc7\xcb\xc1" + "\xbc\x12\x63\x8e\x8e\x4b\xdf\x62\xc8\x3d\xd6\xb5\x0c\x37\x6e\x9f" + "\x75\xde\x7e\x25\x0b\xf3\xc2\x5a\x5a\xf4\x7a\x6d\x9e\xb4\xff\x8c" + "\xfd\x52\xe4\xef\x8f\xab\x17\xb7\xff\x37\x2f\x57\x0c\xbe\x4f\x9f" + "\x82\xf1\x0d\xf2\xd9\x96\x8a\x51\x30\x7f\x62\xdc\x7e\x45\x60\x87" + "\xbc\x83\xfe\x67\xc0\x9d\xaf\xeb\xbd\x05\x6f\xc6\xb6\x37\x3f\xd7" + "\x79\xf6\x4a\xfd\x9f\x3f\x48\xff\xe7\x0f\xf4\x7f\xa5\x84\x1b\xb7" + "\x97\x38\x5f\xf6\x3f\x72\x99\xfe\x9b\x7f\x04\xfa\xcb\xa0\x1b\x6c" + "\xee\x05\xd7\x1a\xb6\x3a\xef\x1f\x0c\x6e\xab\xcf\x1f\xd8\xff\x93" + "\xf5\xe6\x0f\xec\xff\x05\x12\xd9\xea\x7e\x92\x67\xab\x31\x6d\x2f" + "\x98\x66\xad\x4f\xd4\x97\x05\x83\xec\xff\x2d\xd0\xf7\xff\x16\x78" + "\x63\xf5\xd9\x02\x57\xec\x18\xce\x8f\x1b\xc3\x05\x8d\xb1\x63\x38" + "\x3f\xf7\xbf\x3a\xaf\xe1\x9d\x92\x93\x93\x4d\xc9\x49\xa6\xa4\x64" + "\x64\xa3\x8b\x34\x2c\xd9\x9c\x3c\x04\x7f\x43\xf5\xdf\x61\xa6\x64" + "\x93\x19\x7f\x43\xf4\xdf\xa1\x71\xef\xc3\xb8\x2e\xfe\xcc\xfa\xef" + "\x90\xb8\xf7\xa1\x5f\x91\x3f\x4c\x6f\xd7\x68\xdf\x1c\xf7\x3e\xe4" + "\x2b\xf2\x87\xfe\x8d\xf5\xe9\xb2\xf7\x58\x3f\xb4\xfb\x57\xae\x5d" + "\x5a\xb2\xa2\x48\x9e\x17\x2f\x73\x2c\x7d\xea\xa9\x65\xab\x57\x3b" + "\xca\x9e\x73\xdc\x7b\xcf\x83\xb7\xdd\xe5\x50\xc7\xce\x25\x33\x26" + "\x14\x0d\xa7\x79\xeb\x56\x71\xc6\xbc\x87\xee\xcf\x77\xe4\xdd\x7b" + "\x4f\x6c\xa6\x01\x46\x1e\x2f\x5f\x09\x4a\x94\xfc\xe5\xbc\x34\x86" + "\x68\xdb\x18\xa9\x7b\x3a\xd8\xcf\x57\xed\x79\x3c\x92\x76\x1c\xdc" + "\x2f\x7a\x9d\xc2\x7b\x23\x9f\xe9\x3f\xf0\x07\xee\xc4\xa4\x46\x17" + "\x95\x2e\xe7\xfb\x2b\x0f\x7c\x26\x7e\x17\x20\xc7\x0f\xc8\x74\x8a" + "\x1e\x1f\xd7\x3c\x17\x65\xf1\xee\xeb\x08\x93\xc3\x49\x96\xd3\xf4" + "\xf0\x47\xc8\x4b\x12\x77\x6b\x48\x0b\xea\xbe\xd0\x0b\xff\x4d\xa6" + "\xfd\xce\x65\x94\xb3\x9e\xa6\x07\x5f\x10\xbf\x13\xf2\x9d\xef\x09" + "\xa9\x72\x0f\x3e\xaa\xb9\x1f\xb0\xb3\x6e\xa8\xaf\x25\xf3\xbe\x5a" + "\xa2\x37\xd2\xc9\xf2\xc6\x18\x8e\xd5\xf1\x60\xae\x71\x16\xfa\x12" + "\xde\xfd\xf4\xb8\x83\xdb\xe6\xb2\x9a\xe9\x81\x7b\x65\xf9\xf4\x98" + "\xf2\x15\x03\x67\xb1\x0f\xe6\x9a\x50\x6e\xc1\xe7\x64\x0d\xa5\x8f" + "\xca\xf7\x55\xb8\xc8\x1a\x11\x5f\x4c\x9e\x4b\x49\xad\xb0\x84\xd7" + "\x87\x45\xd8\xbb\xea\x0c\xb7\xff\x47\xeb\x7a\xf1\x85\x0f\xda\x7a" + "\x5e\x97\x53\xec\x38\x4b\x66\xc8\x75\x92\x77\x15\xfb\x29\x3c\xd8" + "\xb4\xef\x4b\x32\x83\x06\x99\x67\xe8\x21\x7f\xc5\x3c\x11\x71\xce" + "\x23\xf3\xbf\x94\xb3\xcf\x61\xc6\xa5\x1d\x7f\x22\xf3\xcf\x7b\x5d" + "\xa6\x5e\x61\xa7\x8a\x32\xd1\x29\x38\x86\x4f\x50\x84\xd8\xcf\xff" + "\x78\x61\x84\xcb\x9c\xee\x71\xda\xa9\xb5\x2c\x48\x95\x27\x45\x68" + "\xeb\x9f\xd4\xfd\x80\x96\xae\x20\xfb\x30\x5a\x2a\xe7\x51\xf2\xe9" + "\x7c\x32\xb5\x14\xd7\x91\x6f\x71\x90\x2a\x4e\x8a\xce\xe3\x85\x9f" + "\x53\x6b\x71\x13\x15\xb4\x93\xe9\x78\xc7\x27\x24\xe3\xd0\xd4\x6e" + "\x76\x54\x5d\x24\x7b\xe5\x0a\x4e\xbb\x48\x1b\x2a\x69\xe4\x86\x8f" + "\xc9\xea\xeb\x6c\x47\x3b\x67\xe9\xb1\x13\x94\x04\x78\xa6\x8d\x9f" + "\x90\x7d\xe3\xa3\xec\xeb\x9b\x43\xf5\x55\x64\x17\xce\xac\x94\x5e" + "\x67\x96\xad\x57\x64\xa5\xf7\x38\xb3\x46\xb7\x96\xa2\x7c\xc7\x07" + "\x94\xda\x4e\xa3\x7f\x77\xa6\xdd\x54\x77\x81\x32\x1d\xf3\x79\xfc" + "\x1f\x3a\x59\x7f\x01\xe5\x6b\xf3\xdb\x34\xd4\x8d\xae\x13\x4e\xcb" + "\xef\xf4\xe5\x87\x48\x03\xac\xba\x5e\xca\xac\xef\x25\xbb\x56\x93" + "\xdf\xc6\xb4\xe8\xab\xcd\xc8\x87\x2e\x1c\xf6\xce\x93\x87\xcd\xbe" + "\xe3\x5d\xd4\x12\xec\xa5\x56\xfa\x33\xf9\xca\xff\xe2\xfd\xf9\x93" + "\x87\x87\x68\x60\x7e\xef\x86\x0e\xc0\x57\x3c\xe3\x6c\xe1\xfb\xca" + "\x2e\xaa\xae\xa2\x94\xd2\x0d\x34\xec\x0c\xd2\xd5\x9a\x3e\xb5\xd0" + "\x17\xfe\x8b\x77\x83\xf4\xc3\x7d\xdc\x51\xd5\x42\xc9\xad\xc1\x3a" + "\xf6\xf7\x34\x45\xd2\x37\x3b\x7c\xc1\x36\xf2\x95\x7e\xea\xd5\x6c" + "\x9b\x2d\xdb\x34\xb2\xfc\xe2\x52\x9b\xc9\x67\xbe\x44\xbe\xfc\x20" + "\x7d\x88\xb6\x45\xed\xe6\x89\xd0\x57\x39\xad\xc1\x10\xdf\x73\xca" + "\x16\xdd\xf6\xe1\xd5\xab\x68\xe2\xbe\x0b\x34\x7e\xef\x05\xca\x12" + "\x3d\x59\x26\xf6\xad\xe5\xfb\xa9\x7b\xf1\x9b\xd2\x41\x16\xf4\x57" + "\xf9\x61\xa7\xe9\x3e\xb6\x7d\x59\xd4\xd0\x3b\xe0\x63\xdb\xdb\x3d" + "\xe0\x63\x0b\x5e\xca\x63\x3f\xdb\x53\xf4\xa0\x85\xf9\xb9\xfa\x1c" + "\x99\x37\x9f\x23\x9a\xec\x32\x91\xe3\x49\xbe\x57\xf1\xf0\x7b\xbe" + "\xa2\xb3\xf2\xf9\x14\x3d\x5c\x82\xdf\x14\xfc\x25\x21\x5d\xee\x67" + "\x77\xe8\x7c\x8b\x34\x13\xd2\x1e\xc6\x6f\x32\x7e\xe7\x39\xeb\x45" + "\x00\x6d\x34\x75\x9b\x68\x38\xf3\xaf\xee\xcf\xdb\xd4\xe3\x7e\x18" + "\xf6\xcf\xd3\x25\x06\x1f\x2b\x9d\xfe\x60\xde\x87\xa7\xcf\x72\x5c" + "\xa8\x80\xc4\xa7\xaf\x38\x89\x63\x44\xe9\xe9\x8c\xc3\x2f\xb8\x5d" + "\xb4\xef\xc1\xaf\x15\x7f\x2c\x97\xe3\x8d\xba\xdd\x7d\xc5\xdc\xe6" + "\x4f\x90\x2e\x8c\x74\xf4\xd7\xcc\x79\xbf\x3a\x7d\xd6\xa4\xca\x64" + "\x99\x00\x33\xa4\xc3\x87\xac\x3f\x10\x64\x99\xee\x36\x59\xc5\xd1" + "\xa2\xa9\x54\x3f\x46\xb4\xed\x7d\x4d\x34\x2b\x59\x7b\x18\x6d\x3f" + "\xd3\xc4\x38\x62\xde\x6e\xde\x86\xbc\xa3\x58\xc5\x32\x5d\x9a\x0b" + "\xd9\x7f\xec\x11\x8e\x1b\x35\x3e\xba\x0f\xc2\xbd\x20\xc4\x73\xe7" + "\xdb\x55\xde\x21\xc2\x94\x17\x6a\xf5\x77\xd1\xcf\x7b\x3b\x87\x38" + "\xff\x48\x26\x5f\xf8\x14\x4d\x19\x4d\x76\xb6\xff\x1a\x5e\x13\x7e" + "\xfc\x76\xb2\x3f\x27\xf8\xe4\xba\x33\xf4\xc8\xc3\xff\x30\x9a\x46" + "\xff\x6b\x39\xe9\xfa\xe8\x91\x67\x07\xf4\xd1\x63\x17\x5b\x3a\x0e" + "\x47\xe9\xa2\xc7\x7e\x72\xb9\x2e\x7a\xf4\x4d\xa5\x8b\x44\x58\xe9" + "\x9e\x88\x5f\x4f\xdf\x1e\x97\xae\xfb\x85\x3c\xfa\x7c\x5c\x7a\x48" + "\x4f\x5f\x12\x97\x1e\x50\xe9\xf9\x7b\x0d\x5d\xd7\xca\x78\xac\x63" + "\x5d\x97\xbf\x89\x75\x5d\x6b\x91\xae\xeb\xa4\x8f\x61\xfe\x32\xf1" + "\x63\x17\xf1\x9d\x25\x3c\xcf\x60\xfc\xc5\xef\xc8\xc0\xfd\x9a\xd3" + "\xb4\x28\xc2\x69\x9e\x3f\x93\x19\x7f\x52\xcf\x09\xf7\x03\x05\xac" + "\xe7\x58\xc7\xb1\xdf\xc9\x9e\x31\xa2\x7d\xcf\x6b\xe2\x44\xfd\x6b" + "\xe2\x78\x8f\x7b\x51\x89\xa1\xef\x5e\x41\xda\x36\xa4\xbd\x82\x7c" + "\xd6\x7b\x4c\x93\x96\xfc\xc3\x1c\xc7\xa1\x03\xb6\x55\xd0\x9a\x44" + "\xa5\x3b\xc0\xf3\x7c\xbf\x70\x0b\xe8\xeb\x2b\xe3\x7b\xab\x11\x92" + "\xf1\x94\x4c\xd9\xd0\x51\x1d\x2c\x6f\x63\x36\x43\xbe\x7c\xe5\x9f" + "\x53\x55\x50\x9c\xe1\x7b\x76\x8c\x43\xc1\xfa\x1f\x70\x8c\xa0\xa4" + "\x66\x58\x17\xec\x07\xce\xfe\x2a\xd0\xbb\x66\x0f\x70\x52\x31\x52" + "\x16\x61\xfd\xdf\xa0\xdf\x63\x7a\xdc\xc1\xf1\xc7\x4e\xd1\xa2\x69" + "\x58\xdf\x85\xb8\x6f\xd6\x88\x8b\xf8\xde\x0b\x64\x94\xd7\x78\xc5" + "\x7b\xf0\xe7\x31\xee\xbe\x70\x2c\x3a\x94\xf1\xb5\x87\x88\x71\xf6" + "\xd3\xa2\x2d\x2d\x15\x87\xb9\x7e\x16\xd3\x46\xb8\x9d\x06\x8c\x24" + "\x79\x77\xc6\x4d\x16\xbe\x3b\xe3\xa7\x7c\xbb\xb2\x69\x32\xf2\x5b" + "\x16\x07\x88\xf5\xbc\xaf\x13\x30\x2a\x4e\x29\x18\x80\x25\xa0\xf7" + "\x63\xf2\x74\xf8\x23\x2b\xc5\x17\xa7\xe8\x91\x20\x8f\x17\xdf\x83" + "\xe4\xf3\x35\xd0\x25\x85\x7d\xe3\x95\xed\xb9\xa8\xb2\xe1\xcf\x44" + "\xfa\x5d\x4e\xf0\xdb\xa2\x0a\xbe\xa7\xc4\xf7\x37\xe5\xdd\x4d\xd3" + "\x54\x12\xeb\xb2\x52\xfa\xef\x6f\xfe\x1f\xb8\xbb\x09\xfa\xdb\xf7" + "\x99\x44\x13\xf0\xaf\xe0\xfb\x9b\xc0\xff\x24\xf3\xa1\xde\x27\xd7" + "\xae\xc7\x98\xe6\x8f\x34\x73\x1a\xd6\x8a\xc7\x8c\xf1\xe7\xfe\x72" + "\x5f\x90\x77\x40\xd9\x84\xa2\xcd\x4f\x8f\xba\x38\x1f\x69\x3b\xb9" + "\xfc\x14\xe8\x31\x5f\x51\x84\xde\x39\x1d\x31\x55\x6f\x20\xb3\xd2" + "\x69\x8f\xbd\xc1\xf5\x95\x4e\x7b\x2c\x6f\x40\xa7\x3d\x36\x47\xe9" + "\x34\x45\x63\xa5\xd3\x1e\xbb\x53\xe9\xb4\xc7\x6e\x95\xe7\x60\xd0" + "\x69\x9c\xc7\x7a\xcd\xd0\x69\x7b\xc7\x88\x63\xac\x3b\x7a\xdc\x8f" + "\x39\x0c\xdd\xb6\x1d\x69\xac\x3b\x18\x47\xa5\xa7\xf2\xcb\xc5\xff" + "\x97\x45\xca\xcf\x80\x9f\x8b\xf9\xbe\x42\xa7\xfe\x8c\x71\x79\xac" + "\x46\xe9\xb8\xc7\xca\x06\x74\xdc\xa3\xa1\x81\xba\xac\xe3\x1e\x7b" + "\x49\xe9\x38\x95\xde\xf0\x18\xeb\xb8\xfc\x72\xa6\x81\x0e\xdf\xc4" + "\x7b\x76\x7a\x79\xa6\xa3\x2b\x5a\xc7\xc5\xca\xd7\x63\xc7\x0d\x1d" + "\xc7\xba\x0d\xef\xb0\x41\x54\xbc\x15\x96\xb3\x9d\xa0\xb9\x21\x77" + "\x3c\x06\xdc\x67\x8e\x33\xc6\x74\x9b\x75\x96\x86\xe9\x77\x85\xf4" + "\x7e\x3f\x6e\x37\x7c\x1d\xfd\xf4\x98\x23\x91\xdd\x6c\xd8\x69\xe0" + "\xc7\x1b\x22\x1c\xa7\xc3\x85\xb9\xb4\x4e\xb8\x5a\xc3\x27\xe8\x89" + "\x32\x32\x69\xc9\xcf\x7c\xc6\x63\x8b\x75\xc6\x50\xfe\x65\xdd\x83" + "\x39\x74\x49\x41\x90\x86\x62\x6d\xfe\x59\xb5\x09\x79\xe5\xf4\xbd" + "\xa8\xbc\xf5\xdc\x4e\x54\xbd\x49\x51\x79\x32\x1e\xe5\xa4\x73\x1c" + "\x63\xee\xf1\x9c\xc1\xd6\xfe\x57\x89\xcb\x5f\x07\xc7\x65\xf1\x90" + "\xc1\x71\x59\x2c\xed\x80\x49\x5d\x94\x84\xb5\x59\xda\x39\x7a\x5c" + "\xee\xc7\xc8\xb8\x37\x9b\x13\xb5\xb3\xf8\x01\x3d\x7f\x48\x54\x7e" + "\x74\x5b\xcf\x27\xa8\x1f\xdd\x5e\xcd\x57\xc0\x7f\xf7\x2b\xe0\xff" + "\xdb\x57\xc0\xff\x82\x75\x20\x68\x67\xd5\x4c\xb1\xe5\x26\x87\xa5" + "\x0c\x1e\xe3\xfb\x7a\x67\x68\xc9\x37\xf5\x3d\x9f\xcf\x9c\xe3\xe4" + "\x5a\x50\xde\xdb\xda\x81\x7c\xbe\x97\xcf\xfa\x79\x36\x46\x50\x9d" + "\x51\xf7\xd7\x99\x17\x8f\x5b\x6a\xd8\xc0\x4d\xe6\x3f\x1b\x8f\x1b" + "\xf2\x27\x45\xe5\x6f\x1f\x18\xf7\x25\x57\xf4\xaf\xf7\xd5\x91\x8c" + "\xc1\x79\x14\xcb\x17\xcc\xc9\x1c\xf7\x4f\xdf\x9f\x59\xd2\x01\x3d" + "\x9f\x1d\xe5\xb7\xdb\x05\xdd\x7e\x03\xc7\x5f\x60\xdb\xb7\x5a\xad" + "\x87\xbf\x81\xf9\x24\x9d\xef\xeb\xf0\xdd\x9d\x82\x48\x9e\xe9\x68" + "\x05\xcb\xd0\x13\x0e\xa3\xee\x60\xfb\x40\xdc\xae\xde\x26\xfb\xc0" + "\x06\x51\x67\xa1\x51\x87\x61\xb3\x1f\x25\xe6\x81\x1b\xe4\x9d\xd7" + "\x70\x17\xeb\xdd\x6f\xc0\x4e\x4e\x57\xed\x14\x92\xde\xce\x56\xd4" + "\x19\xf4\xae\xfa\x95\xfb\xf7\x44\xf3\xd5\xf7\x8f\xf4\xfe\x15\xd0" + "\x57\xf4\xef\x0a\xed\x16\x4c\xbf\xfa\x76\x6d\x46\xbb\xe5\x57\x4f" + "\xd7\x82\x83\x5f\x9f\xae\xd9\x3a\x5d\x0b\xfc\x5f\x41\xd7\x04\xed" + "\x14\x8e\xfe\xfa\xed\x38\xf4\x76\x0a\xe7\x26\x6a\x87\xe4\xbf\x41" + "\xef\x75\x59\x8c\x18\x98\x1c\x0f\x56\xc5\xbb\x2b\xf4\x44\xc7\xfa" + "\x55\x71\x62\x0b\xf7\x1b\xb1\x7e\xf5\x58\xb4\x98\x5b\x0a\x3f\x2a" + "\x68\x64\x7b\x44\x68\x7e\x2a\x6c\xe6\xf8\xaa\xb3\x2b\xd5\x9d\x71" + "\xbd\x4e\xfb\x95\x62\x0c\x73\x9c\x2d\x21\xf2\xe9\x68\x9d\xf4\x07" + "\xc0\x3c\xb4\x34\x8d\xef\x07\xa8\xf3\xcc\xa5\x99\x4a\x26\x97\x66" + "\x02\x76\xf1\xe0\x30\x16\x79\xf7\x57\x65\x0f\x19\xcc\xe7\x1f\xf5" + "\x17\xfb\xe9\xd9\x85\x5c\x3f\x52\x3b\x21\x47\x9c\xb7\xeb\x71\xfe" + "\x9e\x7a\x3f\x2a\x0e\x21\xe6\xee\x27\xff\xaa\xdf\x4d\x00\x0d\x5c" + "\xa0\xe5\xd2\x9d\x06\x0d\x8c\x74\xa4\x1d\x30\x68\x00\x7b\x25\xc5" + "\xd7\x18\xe6\xbb\x43\x41\x75\x4f\x7c\x69\x8b\xa8\x59\xd4\xa4\x60" + "\x3f\xa9\xce\x19\xd2\x27\xe4\x04\x37\xda\x4d\x46\xfd\xf1\x0e\xe7" + "\x97\xcc\xc3\x81\xb4\x45\x58\xaf\x2c\x0d\x1a\xf0\x05\xe3\x25\x06" + "\xca\x35\x48\xbf\xa4\x27\x31\xfe\x05\x2a\xbe\x23\xda\x90\xb8\x9b" + "\x28\x59\x03\xfe\xe8\x83\xc9\x57\x1a\x64\x3b\xb5\x2b\x82\xfe\xb3" + "\xae\x3b\xb4\xd2\x6f\xe6\x32\xd2\x76\x38\x9f\x65\x52\x31\x14\x9f" + "\x7c\x56\x3b\xcf\x31\x71\x24\x5e\x29\xe8\xf3\x61\xc6\xc9\x8f\xdf" + "\xc0\xc6\x2c\x5a\x70\x91\x74\x5a\x3c\xf9\xb0\x86\x74\x6d\xf5\x00" + "\x0e\xfb\xe4\x1d\x8f\x27\xeb\x0c\x1c\x34\x6e\xbf\xc7\x6e\x82\x2d" + "\xc6\xed\x76\xca\xbb\x96\x68\x7b\x0a\xc7\xb4\xe3\xd8\x18\xeb\xb2" + "\x88\x71\x40\x9d\xe3\x06\xbd\xf5\x3a\x46\x1b\x15\x9a\x6c\x5b\xd1" + "\x46\xd1\xf9\x28\xec\xc1\x27\xc3\x97\xd3\xf9\x29\x5b\x14\x9d\x93" + "\x99\xaf\x78\x8f\x05\xf8\xff\x82\xe9\xcd\xe7\x1a\x8e\xb5\x6c\x57" + "\x3d\x75\xcf\xd1\xa0\xf4\x3b\x49\x61\xb8\x1a\xe8\xcf\x30\x00\x77" + "\x84\xa2\xf1\x53\xf9\xfd\x34\x46\xdb\x02\x63\xb1\x59\xdd\x49\x61" + "\xdf\x77\xe8\x8e\xa7\xca\xfb\xdb\x61\x5c\x9d\x76\x93\x26\xec\x1c" + "\x33\x33\xc0\xb8\x96\x39\x44\x88\xed\x4a\xe9\xc7\x84\xbe\x1e\xaa" + "\x6a\x37\xc3\xb6\x34\xc9\xb6\xba\xb3\xd8\xbe\xb7\xc8\x67\xb4\x35" + "\x08\x7f\xaf\xe0\xb8\x94\x46\xbf\xd0\x17\x0b\xf3\x16\x70\x87\xfd" + "\x57\xf4\x81\xe4\x97\xb5\x3c\x4e\x45\x6f\x72\x9a\x51\x0e\xef\x6b" + "\xb8\x9c\xf1\x8e\x3c\xf0\x57\xd1\x1d\xe8\xd7\x70\xc6\x33\xe0\x94" + "\xb1\x5f\xd0\xe7\xa2\x76\x86\xd1\xe3\x2e\xca\x89\xe9\x67\x5f\xbe" + "\xd9\xe0\x3b\x3e\x23\x6a\x76\x84\xa4\xee\x54\xb4\x2d\x2a\x31\x64" + "\x92\xeb\x2b\x19\x2b\x72\x45\xf3\x62\xd0\x39\xc0\x07\x65\xe3\xc8" + "\x62\x76\x70\x2c\xcd\xa2\x42\x15\x07\xbc\xe8\x60\xfc\x78\x71\x1e" + "\xc7\x9d\xd4\x69\xc8\xf2\x64\x3b\x45\x45\x8d\xdc\x37\xf0\x5a\xf0" + "\x4a\xf3\x25\xc7\x84\xe4\x58\x9e\xaf\x2a\x39\x02\x5d\x96\x7f\xf3" + "\x55\x75\xbf\x27\xa8\xe2\x2b\x2e\xbb\x4e\x98\xde\x94\xe3\xc5\x7e" + "\x79\x32\x8e\x86\xbc\xfb\xbd\x8c\x7d\xdc\x44\x6a\xe9\x9b\x32\x0e" + "\xab\xee\xb3\x17\x68\x2e\x0d\xcb\x38\x7c\xce\x32\xbe\x0b\x1b\xe6" + "\x35\x99\xf4\x49\x3b\x5a\x16\xa6\x87\x42\x4c\xdb\x65\x25\x7c\xc7" + "\x3d\x28\x69\xb1\xac\xdc\xb8\xd7\xce\x71\x26\x39\x4e\xe9\x94\x30" + "\x25\xb3\x4d\xe1\x70\x72\x4c\x82\xe5\x79\x6c\x93\x28\x9a\x82\xef" + "\x4d\xa2\x4d\xf1\xf2\xb2\x8f\xf8\x1e\xbb\x3a\x5f\x3a\x05\xfe\x4e" + "\xfe\xcb\x29\x5a\xf6\xef\x6a\x5f\xc6\x90\xb5\xe5\x0f\xf0\x19\x93" + "\x5f\x87\x81\xb6\x30\xff\x2f\x9d\x7d\xb9\x5c\x2c\xfb\xc8\x58\x63" + "\xf0\xbd\x38\x75\x5e\x35\x00\xcf\x4f\xcb\xe4\xbe\xf4\x80\x6e\xfa" + "\x3d\x60\x2d\xcf\xbe\x5c\x66\x96\xcf\x36\x78\xb9\xf4\x46\xbe\x5b" + "\xbd\xcc\xc2\xed\x0f\xa6\x33\x85\xf3\x51\x1e\x27\xcb\x69\x07\x25" + "\x7f\xd5\x7d\x89\x81\xf3\xaf\xe5\x07\x8c\x3e\x18\x34\x51\x7d\xf8" + "\x51\x52\x77\x7a\x86\x6b\xa0\xef\x3f\x52\xfe\x66\x03\xf9\x77\x46" + "\xd1\x86\xdf\xa7\x29\xbe\x5b\x8e\x35\xc5\x53\xcd\x8a\x17\x55\x9a" + "\x48\x5f\xf4\x2b\x8e\x01\xab\x70\x5c\x41\x06\xbf\xf7\xb8\x7f\x34" + "\xde\x4f\xe7\x8f\xab\x73\xa8\x1f\xa1\xff\xcb\x5d\xaa\xde\xf2\xe3" + "\x8c\x4b\xc2\x7e\xc6\xe2\xd8\xc4\x73\xac\x8a\x75\xf0\xa3\x77\x19" + "\x5f\xc7\x4d\x3c\xc6\x3f\xaa\xe4\x76\x65\xdc\x83\xbe\xe2\x21\xc1" + "\xbe\x2c\xea\xee\x2b\x86\xfc\x64\x99\xd0\x0e\xf4\xdf\xb9\x03\x7a" + "\x9b\xfb\x0d\x5c\x19\x37\xd8\x8a\x96\x1e\xb1\x22\x31\x7d\xb9\x5d" + "\x19\x8f\xa9\x78\x18\xfe\x2c\xf8\x1b\xfa\x75\xe7\x63\xd8\xb5\x9d" + "\x81\x9a\x71\x01\x6d\xad\x38\xc6\xf1\xbf\xb0\x2e\xe8\xac\x06\xff" + "\xa6\x6e\xf2\x52\x6a\x70\x89\xa9\x60\x3d\xe5\x60\x6d\x4b\xe2\x92" + "\x98\xb6\x4f\xc3\xef\x5a\x31\x95\xe3\x5e\xe3\x3d\x5b\x7f\x9f\xc8" + "\xef\xdd\x6b\xc5\xe2\x1e\x77\x71\xbe\x71\x76\xa7\x62\xd6\x14\x17" + "\xf7\xc7\xf9\x49\x7e\x9c\xef\xf9\x70\x4c\x28\x4d\x24\x3f\xd3\xc9" + "\xed\x16\xf0\xdc\x81\xf6\x50\x0e\xf3\x7f\xa1\x8c\x91\x13\x48\xbe" + "\x25\x1d\x7f\x09\xef\xbe\x73\x1d\xc6\xab\x3b\x6d\x5c\xc0\xc0\x35" + "\x35\x98\x63\xfa\x9a\xb8\x05\x0d\xdc\x90\x7e\xac\x5a\xa5\x87\x39" + "\x46\x21\xfb\x20\xf6\xb8\x57\x8c\x36\x70\x35\x70\xe0\xf6\xf8\x5e" + "\xa5\x48\xcf\xf0\x70\x4c\x18\x6e\x2f\xb0\xb1\x98\xcb\xe6\x18\xf8" + "\x7e\x5d\x5e\xae\xaa\x17\x82\xe7\x16\x3e\x4f\x72\x8c\x25\x6a\x0d" + "\xb2\x4e\x59\xb1\xf3\x68\x7d\x90\xf7\xa0\x6b\xd1\x46\x4d\xb7\x28" + "\x26\xad\xaf\x38\xe1\x18\x73\x1d\x94\x6f\x93\xfa\xa1\x36\xa3\x46" + "\x13\x73\x39\x06\x70\x2d\xc7\x5d\x85\xad\x09\xb9\x5d\x11\x6e\xae" + "\xe8\xe4\xbb\x90\xd0\x39\x2b\x38\x4e\xa8\x87\x6d\x0d\xac\x53\x38" + "\x7e\x45\x32\xeb\x26\xef\xda\xa9\x0c\x23\x62\x2e\x27\x73\x73\xf9" + "\xd7\x8b\xa7\xef\xa7\xa7\xa7\x2a\xd9\x79\x7a\xaa\x31\xcf\xe2\x39" + "\x27\xf6\x5c\xfa\xe9\xac\x78\x9d\xfb\xe4\x73\xcf\x95\x15\xac\x5a" + "\xc6\x3f\x59\x13\xd6\xdc\x3c\x3c\x7a\xed\xcc\x7a\x58\xc5\x31\x78" + "\x3a\x9f\xf7\xa9\x5e\x4d\x37\xce\x59\x9f\xae\x33\xf6\xca\x74\x7f" + "\xee\x99\x6c\x53\xb3\xed\x89\xbc\x43\x1f\x55\xb0\xe8\x50\xd2\x67" + "\x16\x32\xc5\xb7\xb7\x7c\x69\xd9\xd2\x92\xbb\xf8\x44\x65\x78\xa2" + "\x76\x8e\xc5\xb6\xf3\x0c\xf5\xb7\xa3\xf4\x60\xd0\xc4\xe5\x6a\x76" + "\x79\x45\x5a\x55\xa1\xba\x4b\xfb\xcc\x78\x63\x0f\x64\x10\x3f\xb8" + "\xb6\x48\xed\xa3\x36\x1e\x17\x67\x25\x99\x7e\xb5\xa1\xdd\xc4\x36" + "\x4a\x15\x9e\x79\x6d\x28\xed\x22\x3d\x9e\xd0\xef\x2e\xb4\x63\x9e" + "\x79\xa6\x5c\xd4\x64\xb4\xf9\xe9\x99\xd2\xc1\xe6\xa7\x68\x1f\x02" + "\xf6\x39\xeb\xa0\x67\x3c\x83\x9e\xf7\x7b\x26\xe4\x29\x3d\xf3\xcc" + "\xe7\xcd\x76\xe2\x71\x7f\xf1\x14\x3d\xf3\x99\xd9\x8e\xb9\x64\x2c" + "\xfd\x14\xcf\x9f\x73\x5d\xce\x8b\x19\xe7\xeb\xce\x36\x9a\xc1\x85" + "\xe0\xc6\x24\xa1\xfe\x91\x59\x7f\x48\xc6\x9f\x49\x24\xc9\xd3\xb0" + "\x64\x50\x78\xd8\x50\x33\x59\x53\x53\x2c\x37\x5c\x9f\x69\x9f\x79" + "\xf7\xf4\x69\xce\xaa\x0a\x48\x6f\x38\x64\x15\xd1\xf1\xaf\xaa\x2c" + "\x0f\xdf\xec\x22\xe9\x0f\x51\x53\x95\x90\xf7\xb7\xbb\x45\x29\xdf" + "\x3d\xd6\xd2\x77\x65\x3b\xd7\x90\xe9\x9d\x5e\xbf\x89\x63\xb0\xb3" + "\x0d\xc2\x31\xfa\x4f\x51\xc9\xf3\x1f\x22\x0d\xfd\x2f\x17\x9e\x5d" + "\xd9\xea\xbc\xb3\xe4\x5d\xad\x76\x57\xf6\x00\x7c\x33\x31\x7c\xe7" + "\x1b\x64\xda\x5f\xd5\x69\xf2\x99\xef\x26\x9f\x23\x48\x1f\xe2\x39" + "\x21\x2d\xd1\xa6\xe0\xb8\xaf\x80\xd1\xe0\xd6\xb6\x3a\xbf\x24\x93" + "\x7e\x7f\xd0\x74\x8e\x4a\xfe\xda\x34\x48\x3d\xbe\xaf\xdb\x9d\x3e" + "\xee\xd7\x3d\xee\x67\x31\xfe\x39\xfb\xf5\x39\x0f\xba\xf9\x59\xf0" + "\xff\x33\x72\xbe\x43\xfe\x7b\xdd\x32\xe6\xef\xb3\x73\x8d\x32\x09" + "\xc7\xe8\x65\xde\x53\x15\x5e\x1e\x57\x71\xe9\xaf\x9d\x7c\x37\x61" + "\x10\x3f\x86\x61\xbe\xf2\xdb\xf8\x1c\x69\x48\x6a\x88\x52\x9c\x17" + "\x45\x5f\xc4\x4d\xa3\xc1\xee\xa6\x08\xd6\x96\xe1\x4b\x22\xbf\xa5" + "\xeb\x82\x8c\x4d\xc9\xfa\xe3\xed\xe5\xbf\x37\xf9\x42\xe7\xbd\xbe" + "\x2d\x1a\xb5\xc2\xfe\xf0\xd5\x9f\xf7\xaa\x18\x96\x11\x6a\xa1\x3f" + "\x53\x4b\xf9\xff\xeb\x92\x7b\x41\xf5\xc2\xc5\x74\xee\xbb\x24\x16" + "\xfa\xcc\xff\x0f\xf1\x37\x44\x58\x17\x82\xee\x8e\x73\xb4\x32\xed" + "\x77\x80\xf3\xce\x7f\x00\x96\x8c\x79\x35\x83\x3e\xc4\x73\x8f\x7b" + "\x65\xa6\xa1\x27\x13\xc6\x0a\x49\xf2\x6e\xb7\x96\x2f\x31\x69\xd0" + "\xb9\x1c\x9b\x0c\xba\x76\x2a\xf7\x0b\xef\xd9\xfc\x8e\xdf\x89\xfc" + "\x6b\xdd\xe4\xdd\x6b\x0d\x2f\x61\x1d\x9c\xcf\xfa\x15\xe9\x0b\x1b" + "\x2e\x49\x9d\x9c\xa7\xbf\xe7\xea\xef\x73\xf5\xf7\xd9\xfa\x7b\x8e" + "\xfe\x3e\x9d\xdf\x95\xee\x5e\xd9\xd4\x3f\xaf\x98\x86\xb5\xe1\xdd" + "\x6b\x8c\x05\xf0\x19\x69\x2d\xaf\x94\x73\x80\x8e\xc7\x54\x1d\xaf" + "\x6c\xfd\xdd\xc0\xe7\x3a\x6b\xb8\xf2\xbf\x09\x9f\xe7\x72\x62\xf1" + "\x79\x2e\x2f\x0a\x1f\xb2\x96\xe7\x7c\x1d\x7c\x6c\x56\x8e\x75\xff" + "\x37\xe0\xc3\xb8\x70\x1a\xda\x6f\x8b\xc3\xc7\x6f\xe0\x93\x90\xdf" + "\xd6\x8a\x4e\x9e\xff\x56\x7f\x53\xc6\xe8\x1d\xc6\x73\x5b\x43\xaf" + "\x11\x67\xae\x34\xf3\x4a\x71\xe6\x20\x0b\x76\x94\x41\xff\x9f\xeb" + "\xd2\xe7\xf9\x23\xca\x1e\x2c\x5d\x68\xf8\xfe\xa0\xaf\x07\xaa\x55" + "\x5f\x0f\x6e\xe1\x58\x6b\xeb\x29\xc3\x59\x2e\x3a\xb1\xbe\xf9\xcf" + "\x66\x47\x20\x46\x06\x4a\xca\x56\xaf\x7e\xf6\x2e\x47\xc9\xd2\x95" + "\xcb\x1c\x13\x8a\x1c\xab\x8b\x57\x2c\x2f\x5b\x16\x7b\x1e\x6e\xd3" + "\xbf\x3b\x22\xfd\xfc\xd9\xe6\x66\x19\x60\xfe\x67\xbd\xad\x7c\x33" + "\x9f\xbf\x56\xb8\x4b\x5d\xac\xeb\xf7\xd5\x92\x99\xcf\x60\x80\x4f" + "\x87\xa1\xe3\x55\x6c\x7d\x4a\x62\x1d\x8f\x74\xd8\x70\xcf\x56\x44" + "\xa5\xa3\xec\xf3\x36\x23\x8d\xe1\xeb\xba\x69\xd8\x29\x2a\x7d\x97" + "\xdb\x4c\x48\xc3\x4b\xa2\x11\xf3\x6b\x12\xd6\x5b\xbc\xf6\x15\x1c" + "\x37\x89\xef\xcf\xa1\x9e\x00\x3e\xf2\x4c\x91\xbf\x6d\xa3\x6c\x7b" + "\xc1\x38\xae\x41\x9d\xfd\x48\x33\xef\x40\x59\xac\x17\x3a\xb9\x1e" + "\xd2\xb7\x73\x1c\x03\xa4\x5b\xf4\x78\x50\x9c\xf6\x26\xc7\x19\x40" + "\x9a\x2d\x2a\xed\x3d\x8e\x61\x8e\x34\x87\x0e\xef\x0f\x4c\x67\xbc" + "\xe7\xe8\x7b\x0a\x5c\xe6\xdf\xf5\x76\x5d\xd1\x38\xf3\x47\x28\x6e" + "\x9b\x9c\xed\x58\xf8\xd0\x77\x66\xdc\xfd\xd4\x73\x2b\x97\x0f\x27" + "\x49\xf6\x2c\x4c\x97\xd9\xb7\x95\xdf\x7c\x97\xa3\x74\xd9\xb2\x55" + "\x8e\x75\xcb\x56\x96\x39\x96\xae\x5b\xba\x7e\x38\x2d\x7f\x6e\xd5" + "\x53\x7c\x4b\x9e\x87\x65\x75\xc1\x53\xcb\x7f\xc4\x4e\x0b\xaa\xf4" + "\xf0\x98\x79\x7c\x21\xeb\x36\x3d\xae\xc4\xb1\x6a\xb6\x35\xd2\x6e" + "\xb2\xe3\x99\xe3\x2d\xf1\x6f\x33\xfe\x8e\xe0\xef\x30\xfe\x4e\xe0" + "\xaf\xed\x0c\xad\xe3\x98\x06\x87\x7a\xdc\xab\xb6\x18\xf6\xc4\x00" + "\x0f\xad\xaa\x33\x78\x08\xf3\xff\x21\x35\xbf\xad\x3a\xd6\x1a\x96" + "\xf2\xd3\xcf\x53\xd5\x97\x06\x78\x8a\xe3\x45\xb6\xb2\x4f\xce\x5a" + "\xe4\x83\x87\x79\x9d\x0e\x9a\x5f\xc3\x74\x3b\x4d\x6b\x3e\x68\x78" + "\x4d\x1c\xe7\x58\x27\xf8\x6d\x06\xbf\x1c\x57\xf1\x45\x56\xcf\x46" + "\xb9\x71\x68\xe3\x88\x6a\x43\x7f\x1f\x23\x8e\xf1\x3e\xc6\x29\xfd" + "\x5d\xad\xf9\xd7\x3c\xcc\xcf\xfc\xab\x9f\x85\x59\xd9\xbf\x51\xad" + "\x1d\x8d\xbc\xd5\x67\xf5\x36\xbc\xa0\x85\x6b\x9f\x5b\xda\xdc\x72" + "\x8d\xc5\x7b\x68\xd6\xa4\x99\x02\xf8\x9c\xd7\x92\x1f\x6f\x97\xf1" + "\x0b\x5d\xbd\xd0\x11\xb7\xdf\xee\x2b\x97\xe5\x93\x78\x8f\x6d\x7e" + "\xa9\xd0\x38\xa6\xb4\x96\xfc\x4c\x3b\xd7\x13\xb6\x9b\xec\xda\x8e" + "\x91\x39\xca\x16\xe0\xb8\x71\xab\x8f\xe9\x30\x43\x4c\xdb\x33\xb4" + "\x6a\xbd\x5a\xaf\xad\xd3\xbf\x37\xb0\xfa\x84\xe1\x2b\x07\x19\xcd" + "\xc2\x7b\x87\xa1\x03\xfc\xb4\xba\x49\xf7\x6b\xf2\xaa\xfe\x97\x65" + "\xea\xef\x87\x75\x1c\x93\x38\x96\x05\xf0\x6f\xe3\xb1\xc3\xda\xf7" + "\x30\x9e\x4f\x80\x3e\xc7\x15\x7d\xca\xa4\x0d\x08\xbb\x86\xf3\x4f" + "\xf0\x37\x3b\x90\x77\x42\xc5\x89\x58\xbd\x90\xfb\x3c\xe0\xfb\x58" + "\x9f\x03\x5c\x1f\xe6\x33\x43\xc8\xd2\x61\xdf\x25\x96\xcf\xd5\x79" + "\x80\xd7\x64\xe8\x1d\xd6\x33\x05\x11\xc8\xa9\xb4\xbb\xcb\xb6\x19" + "\xfa\x66\x80\x0f\xca\x1a\x13\xe9\x92\x44\xe3\xae\x8f\xcd\x35\xc2" + "\xfd\x7c\x07\x70\x6a\x92\x63\xc0\xf1\x34\x2f\xf5\xdb\xf7\x7d\x4a" + "\x47\x96\x05\xfb\xd7\x22\x3a\x1e\x1c\xa7\xdb\xcf\xb8\xf5\xca\x73" + "\x5c\x5d\x6f\xac\xc9\x34\xf4\x86\x01\xc7\x9a\x24\x34\x6b\x39\xfe" + "\xf3\x64\x96\xf2\x1e\x32\xcf\x97\xd2\x1e\x01\x9c\xd4\x8b\xea\x0e" + "\x93\x56\x93\x59\xea\xa7\xb2\x13\xd0\x31\x66\x69\x73\xba\x9f\xef" + "\x19\xd0\x45\x6b\x4a\xa3\x61\x0a\x5b\x66\x29\xc3\x65\x7d\xc4\x36" + "\x49\x41\xc4\xcc\x71\x44\x4a\xf5\xf9\x05\x3a\x78\x4d\xa3\x81\x2b" + "\x68\x78\xcc\xc0\x57\xff\x56\xd2\x31\x3f\xad\x01\xee\x7d\xec\xcb" + "\xdb\xac\xc6\x73\x9d\xd4\x37\xc8\x3b\x88\xba\x27\xfd\xf4\x7c\xb6" + "\x2e\x43\xc7\x51\xff\xe0\xd1\xaa\xd9\x28\xb3\x26\xa4\xfb\xa3\xb6" + "\x61\x7c\x4f\x0c\xf0\xfe\xaa\xb3\x51\xfb\x01\x27\xd4\x18\xde\xed" + "\x3a\x45\x6b\xa7\x45\xa5\xeb\x63\x7b\x34\x0f\xe9\x67\xd5\xda\x3a" + "\x33\x5b\xd5\x5f\xab\x7c\x77\x75\x1c\x59\x17\xf0\x7d\x2b\x96\x71" + "\x49\x7b\x39\xc6\x6b\x4b\x8d\xf9\x02\xb0\x0e\x49\x9a\x8f\x11\x47" + "\x98\x4e\x2a\x5e\xc3\xaa\x31\x8a\x4e\x6b\xeb\x62\x68\xcf\xf3\x26" + "\xda\x61\x3a\xa5\x6e\x12\x5a\x6a\x30\x49\x14\xac\x37\x13\xcb\x0b" + "\xcb\x38\x9f\xbd\x80\x3f\xa4\x5d\xa5\xe8\xb6\xb6\xdd\xa0\x9b\x31" + "\x76\x4c\x27\x3f\xad\x9d\xcb\xb4\x8d\xed\xe3\xb0\xb6\x53\x46\xdf" + "\x41\x53\xde\x0f\xc6\x7b\x97\x2e\x17\xc7\xbd\x63\xd9\x17\x60\xd5" + "\x17\x47\xcd\xdf\xa1\xa3\xe5\x53\x49\xd1\x76\xdd\x34\x3f\x95\xd6" + "\x45\xad\x1b\x8e\x31\x7d\x59\x56\x80\x67\x89\x1e\x3b\xe9\x98\xf2" + "\x47\x59\xd5\x25\x6a\x32\x4b\xa4\x2c\xaf\x95\x31\x2e\x38\xee\x6a" + "\x1b\xd3\x88\xf5\x22\xcb\x12\xcb\x00\xcb\x93\xa2\xd1\xba\x9d\x51" + "\x34\x6a\x66\xfa\xe8\x74\x3a\x14\xa7\xcb\x97\x39\x4a\x66\x28\x5d" + "\xec\xc8\x9a\x50\x34\x45\x06\x2a\x71\xdc\x37\xeb\x2e\x47\xde\x8c" + "\x09\xe5\xc5\x13\xe7\xab\x9f\x59\x79\xb9\xfc\x3b\x3c\x76\xdd\xe5" + "\x40\x3b\xe1\xd8\xb5\x5b\xe5\x56\xa5\x3f\xca\x47\xfb\x93\x86\xcb" + "\xb8\x00\x1c\x37\xb4\x7a\x25\x51\x04\x78\xef\x38\x83\x31\xb5\x65" + "\xa6\x70\x9c\xda\x05\x58\x33\xce\xbf\x28\xbe\x6c\x40\xde\x3e\xa4" + "\xa7\x96\x72\xac\xfb\x4f\x85\x96\x96\x99\xc2\x6b\x7b\x51\x93\xd2" + "\x16\x48\xab\xb2\x04\xd2\x2a\xf1\x3b\xee\xd8\x9c\x9b\x9d\x02\x70" + "\x4b\x8c\x7e\xf1\x1e\x00\xe8\x94\xb2\xa0\x5c\x44\x98\x46\x05\xe5" + "\x1c\x4f\x1a\xb0\x93\x79\x0f\xa0\x1c\xfd\x2f\x69\x53\xeb\xcb\x72" + "\xf0\xff\xaa\xa9\xba\x2e\xcb\xc3\x3b\xc7\xbf\x90\xdf\xfe\xd1\xdc" + "\x76\x19\x87\x5a\xdb\x7c\xcb\x83\xa2\xa6\xb2\xcd\x80\x09\x58\x43" + "\xf5\x73\x6c\x09\xef\xeb\xfa\x45\x6a\xb5\xd7\x99\xad\x49\x2a\xae" + "\x1f\x64\xdc\xd5\x60\xd2\xf2\xfb\xfd\x1e\x90\x97\xba\xc9\xc6\x7e" + "\x11\xf9\xe0\x3d\x17\x97\x31\xf2\xaa\xdd\x9a\xbf\xda\xa4\x85\x30" + "\x8e\x36\x65\x3f\x77\xb1\xfe\xc4\xda\x72\x7d\xff\xfe\xbf\x9c\x0f" + "\x4d\xe4\x52\xeb\x99\xf5\x72\xdf\xe7\x82\xdb\x4c\xd0\xd9\x5d\x37" + "\x8e\x96\x6b\x94\x90\xe6\x4e\x22\xe5\x8b\xba\xfe\x01\x43\xc7\xf2" + "\x79\x92\x75\x93\x08\xf0\x5e\xa2\x35\x2c\x02\x32\x66\x3a\xcf\x1d" + "\x74\x86\x7c\x15\x3d\x2e\x8e\xd5\x2a\x6d\x20\xb4\xab\xe6\x8d\x88" + "\x9a\x37\xd0\x7e\x20\xf9\x96\x42\xcc\x0f\x49\x67\x68\xbd\x83\xf1" + "\x67\xda\xf0\x7e\xb5\x06\x5a\xf9\x78\x9e\x64\xfa\xa4\x5f\xbf\x85" + "\x7d\x1a\xb8\xaf\xd6\x30\xfa\x1c\xdd\x2f\x93\xe6\xdf\xe1\x46\xbf" + "\x4c\xe8\x57\xf9\x59\x96\x99\x10\xfb\x9a\x40\xde\xc6\xc8\x78\xc4" + "\x72\xfd\xbc\x21\x27\xba\x8f\xac\xff\x55\x1f\x36\x2c\x4d\xd4\x47" + "\x61\xe2\x3e\x32\x0d\x36\xdc\xa1\xcb\x9b\xc4\x93\xf5\x47\x17\xad" + "\x0f\xa6\x6e\x62\x1f\x8f\xcc\x14\xe8\xb7\x59\x3c\x86\x98\x3f\x3d" + "\x8c\x67\xa2\xf1\x62\x78\x0a\xd6\x46\xd8\xd0\xae\x42\xe0\x72\x3c" + "\x31\xbd\x37\x9c\xbd\x32\xbd\x37\x7c\xc4\xf5\x19\x0f\xf6\x79\xb1" + "\x86\xb1\x58\x07\xdf\x62\xbd\xb6\x35\x51\xbb\xa9\x9b\x1a\x19\xaf" + "\x84\x79\x82\xe5\x45\xd7\x41\xe0\x43\x01\x39\x11\xac\x93\x7a\xdc" + "\x1b\xfb\xf7\xbf\xac\x49\x8e\x64\xa9\x1f\x4c\xc2\x93\x08\x86\x75" + "\x93\x87\x7d\x4c\x66\xa1\xfd\x84\xf9\x1a\x7f\x87\xc1\x93\x11\xd2" + "\x36\xff\xc3\x8d\xd6\x24\x9a\x19\x48\xfe\x87\xe1\xd6\xf2\xf0\x78" + "\xa6\x21\x60\x96\x43\x8e\xd7\xf0\x3a\x55\xed\x5d\x6c\x84\xfd\xbf" + "\x4d\xae\x4b\x03\x69\x19\x21\x15\x2b\x6c\x23\xe6\xbf\x57\xfb\xf7" + "\x70\x7b\xdc\x15\x66\x3f\x75\x64\x2a\xb9\xcc\xd8\x2d\x6a\xc7\xed" + "\xd4\xdc\x56\xe1\xd8\x60\x85\x1d\x59\xb1\x57\x13\x1c\x97\x7f\xdc" + "\xce\x01\x3e\x51\xfe\x2f\x06\x9f\xa0\xfe\xec\xc4\x3c\x50\xb1\xec" + "\xca\x3c\x50\x21\xf7\x66\x99\xee\x6a\xad\x52\xb1\xcd\xb0\x53\xc4" + "\xe6\x8c\xdd\x8e\x2a\xd9\xbe\x43\xb5\xcd\x34\xc9\xe1\x73\x89\x5c" + "\xd0\xc5\x85\xb2\x87\x0d\x3d\xc0\xfc\x62\x8d\xf0\x37\x0b\x48\xf2" + "\x34\xf2\x60\xff\x94\x66\xa9\xfd\xd2\x1b\xf3\xe4\x77\xf7\xdc\xeb" + "\x9a\x02\xce\xe2\x3d\xec\xaf\x1a\x4c\xcb\x2c\x43\x99\x90\x9f\x3e" + "\x94\x31\x49\x31\x07\x97\x00\x46\xe9\xce\x74\xcc\xd1\xca\x6f\x2b" + "\x85\x65\x9a\x63\xfc\xb0\x5c\x23\x6d\x34\xf0\xe6\x78\x3f\x58\xef" + "\x54\x66\xf7\xcf\x4b\xee\x1c\xe8\x0a\x21\xfd\x74\x30\x2f\x65\x76" + "\x83\x76\xbb\x4c\xda\x81\x4b\x53\xec\xc4\x7d\xbe\xb4\x79\xec\x81" + "\x17\x27\x93\xf9\x7f\xda\x9f\xa4\xd2\xdb\x68\xf4\xa6\xef\x98\xe9" + "\x7f\x4d\x23\x13\xd3\xc1\x4f\x95\x39\x8a\x76\x95\x2e\x63\x7c\xfc" + "\xb4\x51\xee\x8b\xf2\x5e\xe3\x82\xb0\xf8\x52\xed\x87\x56\x42\xff" + "\x3d\x6d\x57\xf9\xe5\x97\x9d\xff\xb3\x3d\xef\x58\xb1\xda\x51\xf4" + "\xdc\xba\x95\xe3\xc6\xc5\xac\x95\xcc\xf2\x0e\x8b\xbb\xf2\x90\x9a" + "\x4f\x2b\x3b\x0d\xbc\xd9\x2e\xc1\x3b\xfa\xbf\xee\xb2\x7d\xcb\xdc" + "\x02\xdd\x4d\xb9\x20\x9b\x06\x9e\x6f\xa5\xdc\x5b\xa3\x5e\x6f\xa7" + "\xdc\xdb\x6e\x2f\x78\x70\xd9\xd2\xa2\xf5\x51\xa9\x77\x44\xef\xeb" + "\x55\xef\x46\xdb\xc9\x63\xef\x85\xae\x48\x9a\xbf\x91\xe7\x96\xaa" + "\x4f\xaa\xc2\xe2\x2f\xd0\xd7\xd3\x20\x63\x05\x2d\x65\x61\x6a\x81" + "\x2e\x13\x19\xac\xc3\x87\xa9\xbb\x79\xb0\xa7\xc0\x5b\x56\xf4\x3d" + "\x00\xbb\xee\x22\xef\xcf\x9c\x26\x67\x52\x6b\x1d\xc7\xe4\x1d\xa7" + "\x9f\x7f\x54\x1d\x41\x7a\x1a\x7e\x3f\xc7\xef\x50\xfc\xfe\xd5\xb1" + "\x12\xeb\x1e\xf6\x85\x5e\xcb\xbe\xd0\x55\xd2\xd7\x63\x72\xd0\x45" + "\x93\x57\xb1\xcd\x5e\x55\xc6\x36\x88\x9f\x9c\xfc\x5d\x3c\xe2\xb2" + "\x48\xfb\xc0\xf1\x34\x65\xf3\xaf\x90\x67\x48\x55\x47\x44\xcd\xb8" + "\x36\xb1\x27\x9f\xbf\x71\x35\x1e\x6d\x8e\x4b\x4e\xfa\x8c\x92\xed" + "\xc3\x7a\x7a\xdc\x4e\xf6\x7f\x3a\xc1\x74\x1a\xec\x1b\x9a\x4c\xe7" + "\x78\xfb\x70\xc0\x36\x7c\x99\xa4\x7d\xab\xdb\x73\xfb\xe4\xbc\xe0" + "\x2c\x8b\xb2\xe9\xf8\x4c\x70\xb8\xb2\x4f\x44\x44\xd9\xa7\xce\x9d" + "\x86\x1c\xe0\xb9\xd1\xe0\xd3\x98\xf8\x68\x2b\xcb\x96\xad\x5a\x56" + "\xe4\x98\xb0\x7a\x38\x45\x45\x47\x2b\x5e\xb6\xd2\xb1\x6a\xd9\xf3" + "\x6b\x96\xad\x96\x91\xcd\x38\x37\x66\xce\x1f\x2d\xd2\x1d\x66\xe3" + "\xde\x8e\x63\x2c\xd3\xd7\x35\x84\x63\x6a\x89\x5a\xc7\x16\x3e\xfb" + "\x55\xeb\x8d\x5d\x73\x63\xd7\x1b\x9b\xea\x94\x9d\x37\xce\xab\xd6" + "\x3a\x9b\x26\xf1\xfb\x29\x72\x35\x0d\xc4\xef\x76\x2d\x05\x2d\x4d" + "\x8a\x6e\x16\x7f\x8f\xdb\x95\x6f\xd0\xcd\x4f\x9b\xfc\xba\x2d\xd5" + "\x25\xf5\x07\xe6\x58\xe8\xbf\x98\xf9\x55\x7d\x3b\xd3\xc5\xfa\x37" + "\x59\xee\xf7\xa6\x8d\x6b\xe6\xb6\x18\x26\xda\xf3\x63\x7c\xbc\xd0" + "\x9b\xac\xdf\xb6\x1a\xf0\xd0\xe6\x5c\x6e\x4f\x5f\x07\x7d\xe3\x0c" + "\x6d\x72\x48\xfd\xe8\x19\xd7\xcc\x3a\x85\xcf\x4e\xb5\x1a\xc0\x91" + "\x67\x79\x9b\xfc\x6c\x63\xca\x18\xf2\x80\xc5\xfb\xb4\xd0\x73\x27" + "\xf8\x3b\xab\x9c\xa6\x62\x7b\x39\x0f\xf2\xde\x30\xda\x3a\xd2\xe3" + "\xde\x64\x1f\xf0\x4d\xdf\xe4\x67\xbb\x93\xe1\xfa\xc9\x75\x92\xe1" + "\xa9\xd8\x65\x9b\xa6\x83\x77\x66\x0f\xd8\x4f\x9b\x5c\x51\xeb\x32" + "\xc6\x47\xe2\x19\x04\x2e\x32\x4e\xa6\xf2\x1d\x94\xfd\x66\xfd\xb9" + "\x53\xef\xbb\xd1\x1f\xc0\x83\xfe\x73\x66\x1b\x67\xcf\x7e\xbd\xdf" + "\x8c\x1f\xe3\x1e\x8d\xb3\x8e\xef\x61\xc6\x17\xf5\x9a\xa3\x64\x9b" + "\xf7\x65\x86\x20\xad\x7d\xc0\x27\xd9\xe5\x88\xd7\x1b\xcf\xad\x74" + "\x94\xac\x58\xf9\x4c\xc1\xba\xa5\xcf\x2c\x2b\x58\x53\x3a\xd1\xb1" + "\x66\xe5\x93\x25\xcf\x3d\xf5\x0c\x73\xcd\xea\xb2\x35\x4f\x3d\xe3" + "\x60\xcd\x52\x30\x3b\x37\xb7\xe0\xde\x87\x1f\x7a\x74\x38\xdd\xbb" + "\x14\x69\x58\xf9\xe7\x66\x4f\x54\x59\x0f\xce\x99\xf5\x48\xc1\xac" + "\x05\x0f\xcf\x5f\x28\x2f\x2d\xf4\xe7\xcf\x5e\x99\xb8\x40\x0c\x1f" + "\xda\xc0\x4b\xbc\xe6\x18\x72\x8a\x5e\x58\xac\xe2\x5d\xbb\xb7\xc5" + "\xc6\xbb\x76\x63\x2d\xeb\xf6\xe2\xef\x24\xd1\x16\x1b\xfe\xb0\x4e" + "\x7d\x21\x4f\xf1\xd7\x35\xf7\xf7\xb8\xdd\x87\x07\xf8\xeb\x05\x19" + "\x53\x89\x7d\x39\xd4\xfe\xac\x1b\xfa\xdf\xd9\x1e\x9d\x37\xb0\x9e" + "\x74\x07\xfa\xd7\x93\xfd\x3a\x65\x73\xa6\xb1\xb6\x44\xda\x31\xac" + "\x2b\xaf\xe1\x75\xa5\xda\x4f\x7a\x61\x89\xe4\xa9\x41\xe5\xdb\x42" + "\xc6\xba\x92\x65\x9b\xcf\x8a\xd5\xfa\x63\x73\x7e\xb4\x8c\xcb\x18" + "\x8b\xba\x8c\x73\x3d\xb9\x7f\x67\xdb\x35\x95\xf7\xb4\x61\x1f\x1f" + "\x81\xad\x80\xf9\xab\x47\x88\xb4\x5d\x53\x75\x9c\xea\x78\x8f\x9b" + "\xed\x66\x9d\x9f\x52\xcf\xd0\xe6\x8f\x85\x7b\x53\x97\x5a\x53\xba" + "\xaf\x63\xbd\x2e\x36\x8f\xbd\x77\x41\x44\xc6\xa3\x83\x4e\xdf\x7c" + "\x7c\x80\x67\x5f\x58\xcc\xbc\x30\xb0\x96\xdd\x1c\xa3\xff\xbb\xe5" + "\xb7\x1a\x37\x87\x8d\xfb\xfa\x65\xe3\xc8\x64\x1e\xe7\xa1\x9d\x26" + "\x81\xf9\x68\xf3\x41\x6e\x83\xe9\xe9\x27\xf7\x31\x94\x35\x0f\xd0" + "\x6f\x4b\x76\x3f\xfd\xf4\x7d\x16\x63\x8f\x45\xe1\xfd\xc2\x92\xc1" + "\x68\x95\x98\x4e\x5b\x5c\x5f\x49\x27\x37\x0d\x61\x99\x34\xe8\x75" + "\x39\xad\xb6\x34\x5f\x4e\xab\x17\xae\x8d\xa2\xd5\x8c\xcb\x69\xb5" + "\x25\x14\x75\xee\xa3\xef\xa3\xbc\xb0\x84\x69\xc6\x3c\x86\x7e\x1f" + "\x04\x9f\x6d\x1e\xa0\xdf\x0b\x59\x97\xd3\xef\x85\xe9\x89\xe9\xb7" + "\xa5\xfd\xc6\x58\x38\x2f\x25\x9a\x37\x52\x37\x99\xf4\xfb\x3c\x2f" + "\xbc\xdb\x9c\x29\xd7\xa4\xa1\x57\x4d\x5a\xf1\xab\x6e\xfc\xe1\x97" + "\xd7\x11\x03\xb6\xb8\x08\xe9\xf4\x6d\x6a\xc6\x9a\x97\xf7\x95\xae" + "\x30\x17\x9d\x34\xf6\x3c\xf0\xdc\xce\x6b\xe7\x05\x91\x99\x82\xd3" + "\x99\x9e\xfc\xad\x28\xf0\x7b\xbb\xb2\x4b\xff\x91\xfa\xf7\x5c\x26" + "\x67\x7a\x92\x37\x91\xe3\x68\xfd\x6d\x9c\x6e\x07\x0f\x49\xdf\x27" + "\xf9\x2d\xd5\x41\x60\x16\x44\x72\x68\x10\xb8\xfd\xfc\x3f\xd8\x9d" + "\xd6\x38\x7d\x54\xbc\x74\x65\xd1\x73\xcb\x97\x7f\xb5\x2a\x8a\xf6" + "\x1f\xf3\xb8\xb5\xad\x3d\xfc\xad\xc4\xcd\x4f\x6f\x40\x9b\x6c\xff" + "\x5b\xd4\xbc\xf9\x8f\xd0\x7f\x3f\x3a\xa2\x6c\xc9\xc7\x3b\xd5\x3d" + "\xde\x17\xa7\x46\xe9\x67\xf0\xc8\x8b\x39\xc2\xfd\x8f\x15\x03\x63" + "\xfc\x62\xca\xe5\x63\xfc\xa2\x23\xf1\x18\xbf\x38\x5b\x5b\xcb\xf7" + "\x2a\x5e\xc4\xfa\x67\xa5\xb4\x35\xf9\x9d\xcf\xcb\xb1\x66\xee\xc4" + "\x7a\xb9\x6b\xc1\x7a\xef\xcc\x82\xf5\x49\xec\x0f\x2e\xbf\x9d\x11" + "\xbe\x24\x3a\xf8\xcc\x9a\xcf\xc7\xf8\xdb\x19\xfc\xcd\x1c\xfe\x86" + "\xaa\x2c\x83\xe7\xea\xd3\x24\xd7\x8e\xc8\x77\x34\x9c\x96\xdf\xf8" + "\x85\xad\xf0\x62\xa3\x61\x5b\x5b\x31\xbd\xf1\xfd\xe2\x1d\x6a\x3c" + "\xda\x79\x2c\xb8\xbd\x82\xf5\x5e\xd5\xc6\x25\xfe\x3e\x16\x59\x95" + "\x0d\xf1\x62\xfb\x15\xf7\xee\xd3\x2a\x07\xbb\xf7\x0c\x79\x71\x0d" + "\x7b\x55\xc5\x9e\x66\x9f\xc6\x80\xe1\x53\xc7\xfe\x75\x3d\xee\xad" + "\xd9\xf1\xfe\x79\xca\xc7\x64\xeb\x5c\xc3\xb7\x07\xcf\x0b\xfb\xd7" + "\x03\xfc\xbd\x15\xac\xe3\x1c\x55\x9b\x86\x9e\xa3\xad\xd7\x36\x0c" + "\xb2\x87\x6e\xdc\x27\xd6\x7d\xe0\x86\x01\x46\x5d\xbf\x5f\x10\xde" + "\x59\x5f\x0c\xf8\xf6\x6d\x3d\x64\xf8\x86\x49\x7f\x40\xcc\xbd\xfc" + "\x4d\x97\xd3\xb4\xf5\x63\xf9\x0d\x99\x1b\x79\xff\x7b\x6b\xb0\x59" + "\xfa\x25\x6e\xf5\x47\xe3\xa2\xe3\xf1\x26\xef\xd1\x72\x7e\x34\x2e" + "\xe5\x4b\xd7\xac\x98\x52\xbe\x7c\x85\xe3\xa9\xe2\x15\xa5\x05\x2b" + "\x64\x0c\x58\x19\x5e\xb6\x6c\x7d\x29\x9f\x48\xdc\x3c\x3c\x6e\x0e" + "\xd3\x7d\x08\xfb\x7d\xa5\xa4\x1f\xe1\x4b\x8f\x82\x1e\x26\xe5\x47" + "\xf8\x72\xae\x9a\xd7\x5f\x2a\xba\xdc\x67\xe6\xa5\x7e\xff\x2f\xf0" + "\x95\x6d\xa7\x8a\x3d\xaf\xfb\xd9\x30\xdf\xbd\x54\x97\xa0\xce\xc1" + "\x7e\x9f\x31\xf6\x5d\xea\xcb\x97\xf7\x3d\x64\x9c\xf0\x5a\x1e\xb7" + "\x97\xc8\x57\x3e\x87\x63\x9d\xea\xfc\xfc\xd2\x49\x83\x9f\x0d\x7f" + "\x43\x86\xc5\xf7\x4d\xa6\x84\xa2\x7d\x8d\x5e\xbe\x07\x73\x9e\xbd" + "\xbf\x1f\x1b\x4d\xc4\xb8\x07\x4d\x5e\xe0\xf1\xb2\x23\x1e\x0f\xe0" + "\x37\x0e\xe9\xd3\x06\x7c\xb9\x8c\x7e\xbe\x9c\x8b\xe7\xcb\x6c\xd5" + "\x7b\xe6\xe4\xc2\x28\x5d\xbd\xac\x6c\x38\xcd\x5a\x5a\x52\xc2\x72" + "\xbd\x74\x59\xc9\x9a\x55\xcf\xad\x2e\x58\xb1\x72\x05\x52\xef\x59" + "\xce\xa1\x79\x65\x91\xbb\xf4\x1c\xc7\xca\x65\xcb\x8a\x54\x92\x3e" + "\x0c\xb1\xe7\x40\xea\xec\xfe\xe5\x23\x7e\xda\x5a\x36\x60\x7f\xbd" + "\x32\x5a\x98\x5e\xce\xc7\xdf\x53\x52\xa6\xa5\x6d\xf4\xb2\x3f\x76" + "\xdd\xf3\x72\xc0\xe0\x07\x39\x7e\x4e\xf6\xf7\xc9\x58\xd1\x2d\xe4" + "\xb9\x09\xc6\x6c\xdb\x1c\xfe\x3e\x36\xd6\x64\xb3\xd9\xde\x1f\x80" + "\xf3\x4a\xbf\xfe\xe7\xfb\xf5\x9b\x95\x9f\x80\x99\xbf\xe9\xc9\xf7" + "\xec\x91\x0f\xfe\x7f\x31\xac\xf8\xff\x95\x7e\xfe\xef\x36\x25\x63" + "\x0d\xf7\x4a\x91\x61\xcf\xc7\xca\xcc\x2b\x15\x97\xcb\x12\xfb\x7f" + "\xbe\xb2\xd3\xa0\xad\x31\xce\x8a\xb7\xb6\xdd\x6a\xec\xc3\x36\xe8" + "\x71\xe2\xf9\x99\xeb\xb2\xad\x2e\x52\x47\xce\x64\x7f\xf6\x53\xb4" + "\x4d\xe7\x97\x57\x4e\x46\xf9\x65\xd9\xce\xd0\x2b\x61\x35\x4e\xaf" + "\x04\x0d\xfc\xfc\xf4\x8a\x3c\x0f\x60\x18\x4a\xf6\x5f\x5e\xaf\x78" + "\x67\x9b\xdd\xa0\x2d\xaf\x8b\xf1\x9e\x35\x60\x5b\xbc\x7c\x4c\xfa" + "\x48\xa8\x38\x03\x7d\xdc\x7f\xc0\x39\x60\xc0\x41\x59\xf4\xdf\xd2" + "\x6c\xd0\xca\x28\x13\xcd\x13\xb3\x96\x96\x62\xd1\xba\x62\xf9\xf2" + "\x65\xab\x56\x1b\xb1\x97\xb3\x9e\x2b\x29\x52\xb1\x96\xef\xc2\xf0" + "\xaf\x83\x04\xce\xe0\x70\xcd\x48\x55\x8f\x71\x36\xe4\x44\xde\x67" + "\x90\xbe\x7b\x72\x1d\x53\x73\xeb\x3e\x7d\x4d\x73\x8a\xb6\x37\x2b" + "\xdf\x97\xed\x2f\x28\x7b\x71\xc4\xf3\xc0\xa9\xd3\xb0\x17\x79\xff" + "\xb2\x9b\x1c\x21\xbe\x47\xc4\xfe\xcb\x7b\x5f\x13\x1d\xbc\x5f\xd9" + "\xe3\xde\x9e\x62\x7c\x9f\x8b\x6d\x91\xed\xea\xdb\xe6\x01\xef\x4a" + "\x8e\x6d\x5f\xf3\x80\x56\x93\xd1\x29\xd2\x47\xd8\x61\xf3\xc8\x3d" + "\xce\x91\x5d\x1c\xf7\x9e\xe3\x01\x6d\xcf\x67\x5b\x89\xf5\x0b\xc7" + "\xb0\xef\xa0\xed\x59\x58\xdf\xd8\xfc\x54\xb3\x30\x90\x96\xd1\xb9" + "\x65\x03\x59\xb8\x0d\xe8\x26\x7f\x73\x23\xd3\x76\x7b\xd9\x47\xd0" + "\x3d\xfa\xfe\xae\x9f\xdb\xf1\xd3\xf6\x1c\xb5\xc6\xca\x08\xab\xbd" + "\xcb\x0c\xf0\xd1\xf6\x7a\x3f\x8d\xd4\x63\x82\xa7\x54\x7f\xdb\x45" + "\xe5\xfc\xdd\x3e\x15\xcb\x67\x42\x1e\xfa\xe1\xe1\x6f\xe3\xc1\xbe" + "\xc2\x1a\x62\x5b\x27\xfa\xe0\x51\x71\xc0\x99\x57\x76\xdc\xa3\x7c" + "\x8b\xb7\xb5\x33\x0d\x84\x27\xd3\xa2\xef\x89\x5a\x00\x17\xe3\x9f" + "\x51\xa8\x78\x75\x07\x19\x6d\x60\x4e\x09\xc0\x16\x3d\xcc\xf6\x28" + "\xf0\xf6\xe3\xaf\xa3\x5a\x9e\x4f\xfb\xb1\x6e\xb1\x0a\xf6\x1b\x1a" + "\xf8\x06\xd9\x8e\x69\xc6\xfc\xc2\x6d\xeb\xe7\x00\x66\xde\x3f\xe3" + "\xbd\x33\xbd\x2d\x33\xaf\xaf\x0d\x98\xe8\x93\x5f\xbb\x74\xb6\x11" + "\x30\x2d\x98\x2b\x03\xfa\xb7\xa7\x3a\xaa\x2f\xb0\x8f\x99\x1f\x73" + "\xe1\x0d\xa2\x20\x6c\xe3\x73\x9d\x91\xc6\xb7\xbd\x1a\x2e\x30\xbd" + "\x76\xec\x1f\x38\xaf\x41\x7d\xd0\x1f\xf2\xe0\xea\xa0\x1d\x1f\x70" + "\xbb\x2c\x0b\x3c\x96\xbd\x18\x1b\xfe\x4e\xbc\xb8\x74\xb6\x09\xeb" + "\xfc\x91\xa0\xc1\x67\x3c\x46\x7c\xc6\xca\xbe\x5f\x48\xb3\x72\x2c" + "\xf2\x53\xb4\xa3\x85\xc7\x87\x71\x11\x9e\x11\x81\x70\x4f\xfe\xf7" + "\xf9\x3e\x2a\xeb\xc3\xca\x0a\xd8\xb1\xcb\x59\x97\x78\x1e\xe0\x75" + "\x31\x7f\x43\x86\x9f\x9d\x45\x42\x93\xe3\xbb\x81\xc7\xd7\xf3\x40" + "\x65\xa7\xd0\xbe\x74\x93\x38\x16\x24\xfa\xd2\x44\xe1\x90\x29\x89" + "\xf1\x36\x39\xcf\xf2\x9d\xd9\x46\xe8\xe1\xad\x84\x76\x2d\x3b\x36" + "\x90\x8d\xef\x18\xf3\xf7\x51\x5a\x83\xf5\xd4\x5a\x5a\x4f\xff\x12" + "\xde\x49\xde\xb5\x1c\x33\xc2\x13\xfa\xd7\xf2\x9d\x7c\x6e\x75\x0d" + "\x9e\xdf\x77\x3c\xc2\x6d\x55\x7b\xfe\xf5\xc4\x9f\xe8\x5f\xbd\x7f" + "\x22\xc7\x63\xf2\xbd\xf1\x78\xfe\xbf\xd0\xf1\x9c\x7f\x21\x67\x87" + "\xd0\x78\xad\x54\xf5\x2c\xb7\xb1\x15\xb0\x1a\xf9\x6e\xae\x4d\xeb" + "\xb6\x0f\x47\xff\xcd\xbc\x27\xdf\x1a\x0c\x90\x77\xe5\x6f\x19\xc7" + "\x71\xfb\x2e\x90\xc5\xbb\xf2\xf7\xf2\x59\xad\x61\xce\x36\xfa\x8a" + "\xda\xd9\x4e\x0b\xf3\x5d\x64\x3e\xe7\x83\xdd\xae\x55\x33\x8e\x11" + "\x85\x37\x7f\x4b\xdd\xa8\x0f\x3b\x4e\xaf\x5f\xdd\xc1\xf5\xf7\x32" + "\x3d\x80\x53\xcb\x42\x45\x93\xe3\xed\xa0\xe9\x23\x3a\x7d\xf2\xa3" + "\xe9\x53\x9d\xc3\xf4\xe1\x38\x96\x1a\xc6\x0b\xb8\xe5\x80\x06\x9a" + "\xd1\x06\x70\xb6\xe8\xfb\xa2\x96\x1d\x17\x28\xc5\xbb\x92\xbf\x8f" + "\xe5\xf9\x89\x35\xcf\x6c\xd1\x2e\x9d\x6b\xaa\xbe\x48\x66\x1e\x37" + "\x3e\x0b\xa9\x96\xf9\x92\xe6\x5b\x79\xcc\xc0\x93\xf9\xf8\x5b\x8c" + "\xbf\x42\xe6\x3b\xfc\x16\x61\xbc\xb6\x02\x07\x07\xc6\xaa\x91\x7f" + "\x15\x2f\xa6\x78\x38\x56\x83\xbe\x2e\x19\x48\x87\x1c\x85\x85\xfc" + "\x1e\x2d\x64\xc6\xe3\xd0\x20\x47\xbc\x2f\xb2\xaf\x96\x52\x34\xf7" + "\xb6\x92\xbd\xd0\x75\xf5\x98\x4b\xf7\xa5\x93\x8d\xf7\x0a\x77\x4b" + "\x5f\xf4\x9a\xf1\x86\xee\x7b\x79\x0c\xdf\x6f\xf3\xe4\x99\x78\x2f" + "\xc5\x93\x49\x3a\x9f\x83\x47\x6b\xa0\xff\xc7\xe8\xdf\x1f\xdb\x2e" + "\xfd\x8e\x59\xf6\x07\xb3\xd1\x61\x1f\x1e\x17\x7b\xf2\x89\xcf\x54" + "\x52\x36\x89\x40\x4a\x87\x55\xb4\x06\x8f\xcb\x7b\x8d\xad\xc1\x88" + "\x3c\x53\x41\x7e\xd2\xfc\x60\xc0\x0a\x7b\xb2\x8d\x69\x67\xa4\xf3" + "\x79\x0c\xef\x55\xcd\x0f\x8a\xc0\x82\xf5\x56\xfe\x3e\x60\xa6\xdc" + "\x8f\xd7\xd3\x5b\xed\xb0\xc5\xd7\x07\xac\xe8\x7b\xb8\x1f\x56\x77" + "\x7e\x32\xcb\x1b\xca\x8e\xee\x2f\xdb\x9d\x6f\xe6\xef\xde\x72\x9b" + "\x51\x69\x43\x16\x94\xa3\x2e\x8f\x95\x9e\xa6\xec\xd0\xda\xac\xfe" + "\x75\x1a\xc7\x6b\xec\xc6\xbc\xb9\x3a\x3f\x49\xeb\xce\x37\x45\x00" + "\x1b\xbc\x6f\x93\xdf\x29\x0c\x07\xf4\xef\xfe\x74\x42\x7e\xdb\x49" + "\xd4\xec\xca\x43\x39\x33\xc3\xe5\xbb\xf1\xfc\xbd\x04\x91\xf6\x7a" + "\xc2\x18\x2b\xc2\xb3\xd9\xe2\xad\x7a\x0c\xfc\xf4\xaa\xbc\xe3\x19" + "\xb1\x65\x06\x1d\x4f\xb3\x7d\x52\xfb\x4f\x4c\xcf\x08\x64\x2c\x92" + "\x96\x19\x9c\xd2\x49\x49\x55\xe0\x5b\xb5\xaf\x53\xfb\x47\x8e\x05" + "\xe0\xd4\x04\x6c\xbe\xda\x23\xcc\x37\xd6\x2e\xf6\x3f\xcb\x0c\x49" + "\x9f\xaf\x74\x27\xf9\x42\x9d\x74\xdc\xf5\x67\x3a\x1e\xf6\xb9\x8e" + "\x5c\x08\x98\x95\xef\x97\x99\xe1\x7e\xc2\x79\x4e\xf0\x6a\x41\xa4" + "\x91\x06\xdb\x6f\xe7\x35\x27\xe6\xb0\x4f\xd5\xfa\xeb\xd5\x6c\x63" + "\xad\xf9\x15\x7d\xd8\xca\xf1\x04\x84\xb0\x93\x56\xbb\x24\x1b\xb8" + "\x38\x45\x4f\x16\x4d\xd9\xc0\xfb\x5c\xaf\x16\xc2\xee\xcf\xd1\xe1" + "\x9e\xd7\xe1\x6e\xbd\x12\x5c\xe6\x99\xe3\x75\xf2\xac\x07\x7d\x5a" + "\xe2\x88\x00\x76\x24\x7d\x09\x7f\x27\xcb\xe9\xfc\x92\xf7\x41\x77" + "\xb6\xa0\x1d\x47\x6b\xb8\x8d\x38\x36\xc9\x3e\x0d\xf3\xe3\x79\x3b" + "\xe9\x7e\x6e\xce\x73\xf4\xea\xfb\x9a\xc8\xb2\x61\x0d\xcc\x7b\x6c" + "\x4e\xd6\x71\xbc\xbe\xae\x8a\xd0\x50\x5f\x99\x9f\xf8\x5e\x3d\x60" + "\x7c\xf4\x07\x3e\x4f\x82\x9e\x88\x08\xbb\xe9\x83\x4b\x7e\xf9\x0d" + "\x30\x79\xcf\x7e\x73\xc6\xee\xd4\x4d\x34\x53\x98\xac\xd2\x8f\x51" + "\xab\xa9\x9c\x86\xb1\xcd\x57\x7e\x75\x99\xb6\x28\x9f\xba\xe4\x73" + "\xb4\x73\x06\xfb\xd4\x09\x5b\x06\xdf\xcb\x0c\x0a\x8c\x59\x8f\x7b" + "\x67\xb1\x9f\x6a\xcb\x99\x7f\xb6\xb1\x7f\xbd\xd4\xb1\x3b\x3f\x0e" + "\xa4\x3d\x2a\xfb\xc4\xdf\x1c\xd6\xd6\x46\x9a\xaa\xbf\x20\xb3\xa2" + "\xc7\xce\xf7\x5a\xbb\x7a\xbc\xc2\xf3\xa8\xfc\x4e\x99\x0e\xdb\x0a" + "\xd8\x2f\x88\x9a\x47\x31\x67\xed\x54\xf1\x0c\x3d\xf2\xb9\x91\xf3" + "\xc3\x7d\x59\xfc\xcc\x31\x0f\x2c\x7e\x7a\xf5\x98\x70\xdf\xe0\xed" + "\xb6\x3d\x4a\x0f\xd9\xd9\xa6\xda\xd9\xe9\x37\xfd\xa1\x5e\xdf\x5b" + "\x93\x31\x03\xe2\xf7\xc4\xfa\xc7\x70\x8f\x7d\xb8\x0f\x40\xb0\x46" + "\x1c\x7d\x86\x5e\x7f\xb4\xd7\x4d\xa6\x3e\xd8\x82\xbd\x26\xd8\xfc" + "\x7b\xf2\x53\x76\x8c\x25\xbe\x67\x3c\xf6\x0c\xed\x9a\x11\x36\xd1" + "\x68\xfc\xd9\x02\x19\xc5\xd7\x00\x6e\x0e\xef\x3b\xb6\x5c\xe0\x7d" + "\xa3\x5d\x7b\xa5\xad\xb6\x9b\xc6\x6b\x80\xc7\x67\x28\xd5\x63\x69" + "\x3c\xef\xfd\x21\x2d\xab\x20\xa2\xce\x12\x8d\xf5\xfd\xe6\xb1\x34" + "\x31\xb6\xdd\x5d\x7a\x2c\x80\xd7\xf3\xf9\x77\x5d\x80\xae\x2f\xbd" + "\x9b\xbf\x27\xf9\x9a\x5d\xb8\x93\x85\xc8\xb0\x9b\xd4\x79\xff\x6b" + "\x49\xd6\x3a\xc5\x77\xf2\xec\x0c\xfc\xc6\x67\x93\xfa\x39\x4d\x92" + "\x8c\x95\x90\x3e\x6e\x0b\x7f\x9f\x37\x6a\xef\xd5\x26\xf1\xd0\xef" + "\x39\x47\x36\xdf\x52\xc8\x30\x18\x9f\x82\xa5\xea\x8c\x87\xef\x40" + "\xfb\x69\x97\x8c\xc7\xbb\x6d\x37\xa5\xbc\xb2\x9b\x6c\x2d\xcb\xb9" + "\x5f\xaf\x65\x2b\x59\x34\x13\xe3\xab\x79\x58\xce\xc0\x13\xc0\x9b" + "\xdb\x63\xde\x68\x0d\x9f\xf7\x3a\xcb\x84\xe6\x7d\x9a\x6d\xd1\xd7" + "\x9e\xf7\xae\x3a\x48\x0b\xf8\xce\x38\xdf\x17\x5b\x4c\x81\x06\xc0" + "\x6b\x18\x4b\x36\xc0\xaa\xf4\x95\x10\x9f\x01\xdc\xe8\x5d\x75\x88" + "\x61\xd7\xf0\x5c\xb0\x1d\xf4\x51\x73\xc2\xeb\xb3\x7d\xa1\x76\x6a" + "\x81\x7c\xcf\x2f\x15\x11\x86\x83\x32\x7f\x94\xfd\xdd\x63\x77\x14" + "\xa8\x7b\xea\xb2\xaf\xfd\x67\x67\x7a\x3f\x7c\x17\x24\xbc\x93\xbe" + "\x42\xd8\x78\x7a\x9f\x0c\x5a\x2b\xfe\x7a\xfd\x9b\xde\x55\xfb\x89" + "\xc7\x87\xcb\xe3\xdd\xe2\xeb\x42\xd9\xb3\xb1\xe3\xc2\x65\x90\x77" + "\x27\xe0\x7e\x77\xe0\xfc\x97\xcf\x25\x07\xca\xd4\xef\xe6\xfb\x30" + "\xbb\x2a\xf6\x80\x46\x6a\xbf\xfc\xb5\x9f\x30\xae\x7e\x7a\x6d\xbf" + "\xaf\xec\xcf\x83\x7c\x27\xb2\x8a\x7d\x3d\x37\xb5\xca\x73\xb0\xd7" + "\x77\xcd\x0f\x6b\x42\xe9\xb3\xba\xb9\x1a\xf4\x80\x1f\xbf\xac\x0b" + "\xa4\x3e\x99\xcc\xbe\x35\x75\xf7\x5b\x93\xd4\xf8\x72\x5f\xd8\x5e" + "\x49\x34\xc6\x51\x67\x74\x36\xc6\xd5\x18\x63\xfe\xae\x9d\xc6\xe7" + "\xac\x63\x41\xef\x3e\x3b\x29\xfe\x13\x1e\xc0\xd5\xef\x47\x64\xe6" + "\xe9\x73\x59\x5e\x77\xda\x75\x24\x36\xda\xc9\xf0\xb7\x85\xfc\x86" + "\x0b\x94\x0f\xb3\x9d\x75\x54\x83\x49\xe8\xf1\xf6\xea\xe6\xea\x75" + "\x73\x95\x9f\x43\x9d\x05\xf5\x73\x13\xf6\x37\x19\x7a\xc7\x0d\x35" + "\x8d\xfe\xb0\x1d\x29\xa0\xab\x30\x1f\x0c\xf5\x05\x7b\xf5\x6f\x0a" + "\xd6\xfd\x01\x36\xf5\x50\xbe\x9b\x62\xe0\x76\x75\xe7\x69\x75\x1e" + "\xb5\xb6\xa9\x6b\x33\xf6\x6b\x84\x0d\x34\x76\x5b\x05\xdf\xe1\xe2" + "\xbb\x06\xc1\xb4\xcd\xb0\x1f\x76\xe5\x28\xb9\xa9\x0b\x89\x34\xa5" + "\x6f\x0b\x42\xfc\x4d\xf7\x2a\xde\x37\xe7\xbb\x61\x43\xb9\xcf\x3d" + "\xee\x37\xb0\xfe\x29\x59\xac\xe6\xf3\xba\x41\x7d\xaf\xe5\x9a\xc9" + "\xe8\x1b\xfa\x24\xfb\x86\x3e\xca\xbe\xe9\xdf\xdc\x39\x4d\x6f\xc8" + "\xbb\xdb\x57\xd7\x9f\x37\x0a\x15\x6d\x37\xdb\xf8\x7b\xa2\xa7\x69" + "\xcf\x24\x79\xff\x00\x63\xa2\xce\x16\xde\xe8\x14\xc3\x5f\x19\x7e" + "\x95\x30\x0f\x29\x98\xbb\x72\x76\x71\x7c\x3e\xfd\xbb\x5d\x80\x7d" + "\x2d\x74\x79\x0e\xaf\x1d\xba\xd1\x1e\x7f\xf7\x70\x40\x0f\xed\xae" + "\xe3\xb1\x9a\x7c\x90\x72\x14\x1f\xee\xde\xce\xfb\xb7\x6a\x9d\xb7" + "\x7b\x3a\xf8\x5e\xad\x4f\xfa\x7d\xb3\x93\xa4\x6f\x76\xb4\x8e\xbd" + "\x3a\x1c\x77\x4b\x59\x16\xe9\x15\x7e\x3c\x4f\x64\x1f\x03\xc6\x77" + "\x5d\xd8\xd0\x7f\xbb\x27\xb2\x9f\x4f\xff\x19\xfb\x7a\xf0\x4a\x95" + "\xba\xbb\x0a\x7c\x8e\x1b\x36\x8a\xfc\x4e\x93\x5b\x1c\xe3\x72\x0b" + "\xd6\x9f\x97\x67\xf0\xd5\xf2\x9e\xf6\x19\xfd\x8e\xd3\xee\xcf\xf4" + "\xfd\x8c\x2c\xf6\x8b\xef\x71\xef\x41\xdb\x47\xa4\x3f\x0f\xd3\x80" + "\xdb\x96\xb8\xcb\x6f\x25\xed\x19\x3f\x70\x96\xb2\x5b\x9e\x4f\x28" + "\x5f\xd1\x3d\xd3\x0d\x1e\x41\x7f\x87\xaa\x78\x89\x6f\xfc\xe4\xe8" + "\x44\x92\x3c\xd0\x2d\xec\xc3\xbf\x55\xcf\x3c\xb9\xa7\x28\x9a\x4e" + "\x0b\xc2\x9a\x53\xe9\xa0\xdd\xb9\x42\xca\xfa\xee\xdc\xaf\xb6\x27" + "\xf6\xbc\x6f\xd8\x22\x8a\xce\x36\xe8\x97\x7d\x5b\x24\xad\x3d\x29" + "\xd9\x1c\xcb\x62\x63\x15\xc7\xe3\xa9\x5f\xcf\xb1\x8e\xc2\x9e\x94" + "\xbc\x08\xdf\x87\xc3\x3c\xab\x79\x52\x0a\x4f\x97\x92\xa9\xa0\x94" + "\xcf\x8f\xf2\xdb\x78\x7d\x25\x9c\xb0\x05\xd2\x61\x9f\x40\xce\x2b" + "\x57\x90\x75\x49\x31\x60\x3b\xb3\x46\x73\x2c\x22\x8e\x43\xc4\xf1" + "\xc4\x22\xce\xac\x74\x3c\x8f\x81\x3d\x67\x13\xb6\x94\x1c\xf6\x41" + "\x89\xb8\x05\xf4\xf1\x49\x8e\x87\x64\xf2\x05\x42\x54\x79\x96\x2c" + "\x1c\xeb\x28\x5c\x93\xdf\xd9\x1a\xfc\x44\xae\x2d\x52\x4b\x61\x4f" + "\x6b\x94\x09\x9a\xdb\xb5\xb4\xfc\xb6\x40\x5a\xfe\x09\xd5\xef\xf3" + "\x42\xf5\x5b\xe1\xcd\xf8\x2b\x1d\x97\x5a\x58\x25\x71\xdf\x77\x5d" + "\x18\xf0\x35\xcf\xa8\xc5\x11\xcf\xa8\x7c\x75\x8f\xee\x38\x55\x95" + "\x89\x4e\x1f\x6c\x63\xf6\x89\xe4\x3b\x85\xec\xe3\xc2\x7d\xe4\xfe" + "\x71\xdb\xff\x7a\xe1\xac\x8c\xdd\x14\xc6\xbb\xb3\x44\xaf\xd3\x85" + "\x3a\x5d\xc7\xa9\xd7\x33\x4a\xf6\xbd\x35\xa8\xea\x16\xc8\x67\xae" + "\x1f\x45\x07\xbd\xcf\xfd\x74\x40\xdf\xb9\x7f\xdc\xff\x30\xd3\x04" + "\x34\xd0\xfb\x6a\xef\xd3\xfb\xc9\x7d\xfc\x17\x70\xea\x6e\xf4\x13" + "\x7d\x95\xfd\xec\x43\x3f\x8f\x15\x13\x85\x6a\x37\x3b\xbe\x4c\x1f" + "\x95\xcf\xeb\x43\xe7\xbf\xc1\x8e\xae\xf0\x10\xd6\x81\xe6\x5f\x54" + "\x79\x4c\x2f\xc3\x36\xa9\x0a\x60\x3d\x18\x10\x9d\x6c\xef\xfb\x4a" + "\xf1\x17\xae\x97\x36\x8e\xb4\x8f\xf9\xbb\x99\xcf\xa3\x4f\xda\xe7" + "\x54\xd5\x29\x3a\x61\x9b\x86\x7c\x61\x94\x29\x46\xff\xb1\x7e\x3c" + "\xad\xe3\xcf\x65\x2b\xbf\x50\xfd\xb2\x96\xd0\xe8\x0f\x1f\xdb\x6a" + "\xf2\xb5\x6f\x25\xa3\x2f\x4f\xa0\x1c\xfa\x63\x07\x2c\x19\x37\x5e" + "\x43\x3f\xf7\x00\xcf\x50\x54\x9f\x5a\xba\x42\x80\xf9\x31\x0d\xcf" + "\xa3\xa4\xdd\xe7\xd0\x8f\x73\x64\xf7\x54\xc1\xfe\x7a\x90\xed\xc5" + "\xbd\x0f\x8f\xc8\x27\xf0\x7d\xbd\xfa\x5e\x89\x8a\xad\x72\xed\x19" + "\xda\x57\x69\xc4\x4f\xd1\x38\xfe\x54\x5a\x7e\x17\xf3\x91\x8c\xa5" + "\xc2\x73\x46\x0f\x78\x86\xfd\x53\xd6\xa1\x8d\x9e\xac\x31\x12\x1f" + "\xb7\x8a\xbf\x82\x77\xfe\x8e\xce\x68\xde\x13\x40\xbd\x4e\x01\x9a" + "\x31\x7c\x51\x93\x7f\x82\x7f\x99\x86\x09\xef\x6f\xbc\x4d\xd3\x44" + "\x7a\x26\xaf\x2f\x4c\x4d\x55\x01\xd3\x0b\x6f\xd3\xc4\xab\xd3\x29" + "\xfb\x0e\x0e\xa6\xbf\xf9\x2c\x80\xe1\xa1\x6f\xe9\x67\xa8\xa1\x26" + "\x56\xc6\x1c\x52\x97\x29\x3d\xd8\x90\xcf\xfb\xef\x57\xd7\x6e\x83" + "\x8a\xdb\xe4\x16\x5b\xaf\xb2\xde\x62\x03\x0f\x3c\xdb\x07\xc3\xfd" + "\xea\xe9\xd0\x70\x68\x30\x58\xdb\x5f\x93\xb1\xb4\x9c\x3b\x5e\x63" + "\x1f\xbf\xcd\x96\xa3\x76\x8e\x6b\x8c\xb9\x73\x7f\x90\x56\xef\x25" + "\x8b\xf3\x2c\xef\xc9\xcc\xa3\xa3\xf5\xd9\xb4\x0f\x6b\x72\xd1\x9d" + "\x95\xfe\xea\x05\xf6\x27\x50\x3a\x84\x6d\x52\xbe\xc7\x26\x56\x67" + "\xd9\xaa\x5f\x33\x6c\xf8\xc6\xca\x8a\x8b\x64\x52\xdf\x8d\x68\xac" + "\x98\xed\x10\xe1\x9d\x26\xad\xb8\x9e\x63\x0b\xa5\x57\xe6\x71\x6c" + "\x21\x23\xd6\x8e\xb4\x7d\xca\x21\x73\xdd\xf6\xe1\xdb\x57\xd1\x44" + "\x8e\x0b\x66\x0d\x28\x5b\x4e\xcd\xd7\x8d\x07\x81\x9f\x4d\x3f\x43" + "\xb7\xa9\xf8\x3b\xfb\x82\x0d\x17\xd0\x96\xca\xff\x24\x82\x35\x8c" + "\x84\xbb\x8a\xc6\xd7\x5f\xa0\x2c\xb6\x83\x0a\x3e\x57\x36\x1b\xaf" + "\x0b\xe7\x75\x59\x45\xe4\x7f\x65\xd1\xde\x33\x03\x71\xc3\x02\xab" + "\x39\xd6\x98\xb0\x0f\x76\x47\xb8\x7a\x8c\xf4\xa3\x91\x31\x20\xd4" + "\x77\xc5\x88\x76\xd6\x92\x99\xbf\xa3\xc9\x7b\x79\xbc\x37\xcc\x77" + "\x69\xd4\x1c\xf2\x66\xae\x11\x57\x69\xd0\xb3\x39\x8f\x5a\xef\x68" + "\x43\xb1\xfe\x0a\xf4\x78\xbd\x6b\x79\xce\x78\x73\x27\xdf\xdf\x19" + "\x58\xe3\xbc\xb9\x86\xf3\x38\x8d\xfd\xcb\x73\x24\x2d\xdf\x3c\xc2" + "\xeb\x1e\x7d\xcd\xf8\xa1\xa3\x3f\x4d\xd9\x30\x3c\x97\x31\x0e\x0d" + "\x6a\x1f\x39\x15\xb8\xb4\x1b\xf3\x19\xcf\xeb\xea\x1b\x9e\x6f\x76" + "\xf9\x4d\xff\xd7\x89\x2b\xe0\x67\xd3\xbf\x81\x6b\xea\xe6\x58\x49" + "\xee\x1f\x67\x1a\xf3\x9b\xfc\x46\xc3\xe6\xb1\xf7\xae\x5e\x4f\x99" + "\x0f\x7d\x93\xcf\xbc\xe5\x3d\x8c\x4e\x35\xef\xfe\x78\xf6\xc0\x19" + "\x55\x8e\xa4\xb7\xfc\xfe\x1a\xaf\x31\x4c\x98\x83\x55\x8c\xb0\x2e" + "\x35\xff\x1a\x77\x8c\x7f\xbc\x34\xaa\x9d\x2d\xfd\xf3\x28\xda\x60" + "\x5f\x09\x86\xaf\x6c\x93\x1f\x4f\xe3\x36\x78\x6d\xa5\xe6\xd7\x1f" + "\x4f\xbb\x82\x2d\x96\xc5\xf4\xd5\xf4\xf5\xa4\xaf\xeb\x2f\x8a\xbe" + "\xe5\x94\x3c\x65\x27\xd9\x3f\xac\xf2\x9b\xd9\x4f\xd5\xb1\x8a\xac" + "\x68\xff\x63\xce\x67\x5e\xf7\x4e\xe6\xbd\xb8\xb7\x6e\xf5\xf1\xbc" + "\xdd\x97\x9f\x32\x9f\xd7\xfa\xd2\x16\x7f\xcb\x31\x09\xf5\x90\x96" + "\xfe\xbb\x73\x21\x73\xf5\x06\x9a\xc8\xdf\x39\x44\xba\xfc\x36\x58" + "\xe0\x1b\xcf\xf4\x7c\x6b\x34\xd9\xbf\xb5\x93\x7d\xec\xdf\x9a\xeb" + "\x37\xfd\x4f\xf9\x1d\x52\xd9\x7e\xed\xae\x52\x8e\x8f\xf6\x4e\xaf" + "\x7f\x88\x1a\xab\xb7\x3e\xc7\x7b\x56\xd4\xfb\x26\x63\x2f\xdf\x4f" + "\x6f\x75\xc8\xf3\x40\xf6\x23\x5e\xc9\xf3\x75\x65\x60\xc0\xf7\xe6" + "\xad\xcf\x75\x5c\x3e\x3f\x5a\x4a\xbc\x57\x7d\x62\xdf\x18\xd1\x86" + "\xf6\x0e\xfb\xe9\xcd\x90\xbe\x1f\xd3\x26\xf9\x8a\xed\xdd\x7f\xe4" + "\x35\xd8\x5f\xbc\xdb\x51\x8e\xe7\x89\x82\x72\xca\x51\x36\x7c\x95" + "\x45\x03\xff\x0c\xf4\xff\xad\x07\x78\xaf\x2f\xa1\x4e\x84\x89\x23" + "\xeb\xd4\x54\xce\x95\x7e\x5c\x35\xaf\xb7\xe1\x17\xb6\x7d\x55\x00" + "\xbf\x29\xf8\xe5\x75\x93\x0d\xf9\x21\xfc\x8e\x86\xed\xd8\xc4\x7c" + "\x89\x35\xac\x1d\xeb\x04\x3e\x5b\xcc\x19\xec\xfe\x1f\xd3\xc6\xb7" + "\xe5\x11\x52\x7e\xa9\xfb\x8f\xb5\x04\x60\x9f\x61\xa5\xbc\x3a\x2c" + "\x7a\x1d\xd7\xf3\x3d\x9b\xfd\xc7\x9c\x7b\xd9\x1f\x64\x7f\xdc\xf7" + "\xcf\xf7\x1f\xc1\x1f\x24\xed\x27\x79\xf8\x83\xce\xd8\x7f\x6c\xe0" + "\xef\x27\x47\x7a\xdc\xfb\x8f\xf9\x69\xbf\xb4\xb1\xae\x4e\x27\xee" + "\x57\x77\x29\x78\x5d\x94\xb6\xc4\xa6\xfa\xbb\xcb\x81\x77\x8b\x48" + "\xdb\x55\xa8\xf7\xd7\x86\x77\x9b\xc3\x89\x79\x2d\x0d\x34\x19\x8b" + "\x3e\xa7\xbd\xde\xc6\xfd\x65\x7c\xbb\xd3\x30\xa3\x47\xdd\x7d\x64" + "\x98\xdc\xff\x40\x5a\x15\xc3\x23\x31\x39\xd3\x63\xd0\x53\xa7\x13" + "\x9f\x1b\x99\xba\x01\x43\xd9\x41\x28\x0f\x18\x46\xf9\x7e\xda\x8f" + "\xe5\x6f\x0e\x60\x4c\x51\x0e\x6b\x62\x8b\x71\xaf\xb2\xc7\xfd\x93" + "\x43\x1f\x95\xa8\xf3\x03\xae\x1b\x8c\xaa\xcb\xf1\x06\x12\xd5\x47" + "\x9b\x16\xd5\x66\x55\xe0\x34\xed\xff\xa3\x6a\xf7\x27\x07\x06\x93" + "\xa5\xaa\x71\xb0\xef\xea\xfd\x1c\x93\x80\xed\xa1\xe9\xbe\xcc\x20" + "\xf9\xea\x35\xcc\xf9\x55\x8e\x9c\x2a\xe1\x3d\x4d\xff\x63\x45\x6b" + "\xa8\xf3\x2a\xe7\xc3\xff\x21\xcf\xdf\x45\xaf\x8b\x7c\x15\xb7\xc9" + "\xef\xfb\x9e\xa3\x9f\xbe\xe1\x0b\xc8\x38\xd9\xfc\xfc\x02\xe7\xb3" + "\xef\x03\xcf\x0d\x1c\x37\xce\x58\x63\x6b\x28\xbb\x8f\xd3\x91\xe6" + "\x0b\x06\x64\x7c\xba\x01\xdf\xec\x4a\xfd\xfb\xf0\x3f\x7d\x40\xde" + "\x7d\x67\x7c\xc3\xdf\xf7\x32\xce\x90\xa5\x2c\xee\x83\x13\xeb\x3f" + "\x5f\xb8\xc7\xcb\x32\xe1\x58\xcb\x7b\x85\x3f\x9d\x04\xbe\x13\x5a" + "\x4d\x65\xd6\x55\xf6\x41\xde\x9d\x70\x86\xc5\xb9\x40\x5a\x65\x16" + "\xdb\x24\xd5\x55\x43\x2c\xb3\xea\x85\xb7\x3b\xbd\xca\xd1\xe3\xfe" + "\x69\xde\x47\xe5\xf4\x5f\xe0\xc3\x9f\xe6\x19\x7d\xdf\xa7\xf7\x1d" + "\x6d\xc9\xf5\xd3\x94\x3a\x15\x8f\x0f\x65\x06\xfd\xce\x33\x8f\x33" + "\xdb\x03\xec\x37\xaa\xd3\xa2\xbd\x7f\x6e\xb8\x3a\x3c\xda\xbf\x46" + "\x1b\x7d\xaa\x8d\x03\xd3\xff\x6b\x6d\x1c\x98\x7e\xa5\x36\xa0\x1b" + "\xae\x3b\x43\x07\x8e\x5d\xfd\xda\xf1\xc0\x4e\xc9\x2b\x9e\x2a\x9b" + "\xd2\x99\x3f\xbb\x33\x82\xf5\x5b\xd8\xb6\xcb\x21\xbf\xc5\x63\x22" + "\x97\xcf\x1f\xa6\xb0\x67\x89\xad\xa5\xbc\x97\xbc\x6b\xff\x44\x1d" + "\xf4\x4f\x72\xdf\xa8\xa5\x8c\xd7\x6c\xbb\x0a\xfb\x6a\xab\x4a\xfb" + "\x4c\x07\xec\x4c\xef\xbd\x1c\xfb\x30\x8a\xcf\x5a\x83\x7f\x22\x5f" + "\x21\xef\xaf\xb6\xf1\xbe\x76\x21\xf4\x83\x43\x83\x6e\x80\x8d\x1e" + "\x91\xf4\x80\xfd\xa2\xd6\x5b\x9b\x2d\x72\xbd\x15\x90\x77\xfe\x46" + "\xc2\xee\x4d\x11\xee\x92\xd1\xbc\xf7\x1d\xe9\xcb\x07\x8f\x50\x1e" + "\xc7\x21\xe4\x7d\x67\x61\xcb\xe8\x5a\x10\x4e\x16\x72\x3d\x05\xdb" + "\x9f\xe3\x11\xfa\x82\x7e\x8a\xc0\x8e\xae\xbf\x44\xa3\xeb\x61\x7b" + "\x42\x67\xdb\x58\xaf\x37\xe8\xf1\x08\xb7\x5f\x1a\x88\x47\xb8\x8f" + "\xf7\x7a\xda\xf1\x7c\x89\xcc\x91\x9a\xcd\x96\x3d\x97\x68\xfc\xde" + "\xb5\x94\xb5\x87\xf7\xf2\xfe\xaa\x6c\x1f\xb6\x2b\x64\x6c\xc2\xe7" + "\xb2\x78\x3f\x7f\xc0\xf6\x59\xc7\x31\x53\xfb\xf5\x96\x59\xee\x81" + "\x5c\x15\xbd\x7f\x26\xe7\xc1\xb0\xa7\x72\x6e\xd8\xf6\x7a\x1b\x68" + "\x17\xf0\xd3\x3f\x4d\xeb\x33\xfd\xf4\x50\xa2\xb1\x35\x7c\x9b\x76" + "\x46\xc5\x93\xfc\x68\xbc\xd2\xef\x80\x55\x31\x18\x4f\x44\xf6\xe4" + "\xd3\x94\x2e\xca\x56\xfe\x0a\xd7\x60\x4e\xfc\x99\x9f\xcf\xcf\xab" + "\x9e\x25\x7b\x64\xcf\xe2\x24\xe7\x9b\x94\xcc\xdf\x7e\xe6\xbf\xaa" + "\x2f\x44\xe7\x94\x12\xca\xe6\xf3\x07\xf6\x69\x70\x6c\x94\xe5\xdf" + "\x1d\x5f\x41\xd9\xd1\xb0\xe7\x2a\x67\xa3\xbb\x1c\xf7\xaf\x7c\xea" + "\xb9\x67\x4b\x97\x96\xad\x78\x72\x45\xc9\x8a\xb2\xf5\x32\x6c\xc0" + "\x44\xf9\xdf\x7d\x13\x8a\x16\xca\x43\xe7\x28\xfb\x62\xfc\xc0\x7e" + "\xdc\xcf\x57\x44\x78\xff\xe0\xaa\xe8\xf5\xf3\xa9\xfa\x39\x5a\x60" + "\xaf\x3c\x57\xfa\x79\x05\x6c\x06\x79\xde\xbc\x5d\xc5\x91\xe9\x54" + "\x7e\x0c\xaa\x9c\xe6\xd9\xc5\x31\x7a\xa6\x9f\xa2\xb7\xf3\xf9\x3c" + "\x04\x63\x05\xbd\x79\x86\x60\x87\x4c\xe7\x73\x96\x16\xde\xcb\x90" + "\xb6\xef\xcf\xff\x2a\xe7\xb0\x73\x32\xa6\xd2\xfe\x53\x78\x67\xbf" + "\x77\x4d\xe4\xef\x89\x3c\x67\xdf\xaf\x3d\x67\xff\x1f\x42\xe4\xef" + "\xd6\xce\x17\xef\x11\xe7\x8b\x77\x0b\x4f\x8a\x0b\x32\x96\x79\x86" + "\x7e\x1e\x09\xbb\xe9\x1b\xf8\x1b\x36\x10\x43\xe0\x60\x5a\x6e\x87" + "\xe8\xc3\x9f\x26\x3c\x23\x1b\xa3\xce\xd0\x38\x4f\xde\xd9\x28\x5d" + "\xc5\xbe\x54\x07\xe7\x70\xdb\xa2\x76\x64\x43\xc0\x59\x9c\x8c\xf2" + "\x11\x85\xcb\xc1\xa5\xbe\x2d\xa7\x49\x9d\x9b\x1e\x2c\xf4\xca\x3d" + "\xe3\x83\x5f\x72\x3d\x3e\x67\x63\x1b\x5a\xc6\x62\x35\xfd\xac\x8b" + "\xfd\xf0\xd8\x7e\xde\x9b\x4e\x36\x4f\x3a\xa5\xf4\xb8\x0f\x6e\xeb" + "\xf7\xb1\xb0\xa9\x39\x95\xe7\x35\x8e\x1d\x0c\x9d\xd3\xc3\x73\x24" + "\xe3\xc1\x7c\x0a\x98\x87\xf9\x0c\x4e\xdd\x2b\x3a\xd8\x0c\xfb\x71" + "\xda\xd5\xeb\xdc\x83\xcd\x72\xfe\x30\x39\xc5\x94\x6d\x54\x28\xcf" + "\x47\x95\xcf\xa1\x19\x72\xe9\x57\xfd\x79\xfb\x56\x79\x7e\xbe\xf6" + "\x6c\x23\xe4\xc6\xd5\xd0\x4b\x29\x9a\x27\xa3\x83\xed\x98\x96\x0a" + "\x79\xae\x6c\x41\xbd\x26\x3e\x77\x96\xf7\xf2\x64\x2c\xea\x3f\x51" + "\xc3\x45\x32\x77\xd0\x2f\x72\x78\xaf\x7d\x80\xb6\xbf\xd8\xc5\x67" + "\x2b\xa2\x76\x84\xdd\x5a\x61\xda\xca\x30\xb4\x4b\xe7\xa6\x19\xf5" + "\x30\x77\x0f\xe3\x7a\xa7\xe8\x17\xeb\x65\x3d\x2e\x2b\xbf\x63\x68" + "\x5b\x8c\x79\x6c\x2e\x97\x0f\xe3\x7d\x9f\x66\xcb\x13\x90\xb7\xc8" + "\xda\x48\x13\xf2\x16\x42\xdf\x05\x90\x96\x2f\xf7\x78\xb1\x2e\x97" + "\xf1\x4e\x6c\x8f\x92\xcf\xff\x17\xaf\xc4\x87\xfd\x58\xcb\xa0\x9b" + "\xa4\xdd\xf7\x8b\x96\x7d\x7f\x95\x31\xb2\x31\x86\x6f\x17\xea\x7c" + "\x73\x40\xe1\xf7\xf6\xd2\xee\xda\x51\xf9\xdd\xb6\x2a\x0a\x9a\x2c" + "\x74\xd4\xce\x7e\xf7\xbb\x9a\x8e\xda\x7b\xb1\x76\x78\x3b\xcb\x6f" + "\x1e\xbe\x55\xd9\x1c\xaa\x1e\x9f\xed\xc0\x1e\xed\x4a\xb6\xdb\xe6" + "\x22\x7f\xae\xe1\x5f\xc1\xdf\xfe\xe6\x33\x1e\x3f\xfd\xc2\xc1\x74" + "\x03\xdf\x1f\x92\xfb\xfc\x9b\x1f\xef\x44\x7f\x86\xb2\x0f\x1c\xd3" + "\x99\xef\x37\x58\xf1\x2c\xd6\x8a\x69\xd6\x70\x8e\xa9\x41\xde\x6b" + "\x94\xf7\xe5\xa7\xea\x31\x5b\xb2\xf5\x18\x2e\x13\xf9\x5d\xdd\xb7" + "\x7f\xbb\xff\xfe\x3f\xc7\xa9\x61\xdf\x81\x88\xee\x57\x27\xe3\xb7" + "\x5c\x50\xe7\xa3\xec\x57\xc7\xfb\x83\x7c\x3f\x90\xcf\x30\x51\xaf" + "\xb3\xdf\xcf\x51\xde\x8b\x79\x3b\x64\xc4\x6d\xe9\x71\xbf\x63\xee" + "\xf7\xd7\x41\xdf\xbb\x3d\x95\xa1\xa0\x6d\x57\x53\xd0\x53\x89\xb5" + "\xc9\x3b\x0e\xe8\xa6\xfc\x2b\xae\xe9\x38\x1e\xed\x1a\x32\x69\xe9" + "\x99\x36\x8e\x67\xc1\x71\xc1\x94\x9f\xfc\x3b\x9b\xf4\xfb\xe3\xc9" + "\xe7\xe8\x9d\x19\x03\x67\x89\x11\x7d\x1f\xec\x9d\x03\xca\x0e\x7b" + "\xe7\x80\xdc\x07\xab\xad\xf4\xbf\xb5\x21\x64\x6a\xda\xe0\x37\xa9" + "\x7b\x02\xef\xc0\x02\xfb\x4d\x9b\xe1\x8f\x82\x72\x1c\xaf\x21\x61" + "\xcc\x24\xe1\x19\xa7\xdf\xcf\x6d\x92\x7b\x18\x03\xeb\x9a\x26\x75" + "\x4e\xb6\x79\x6c\xa1\xc6\x73\x60\xfa\x12\x87\xf4\xad\x28\xbd\xc0" + "\xfb\x61\x43\xd5\x1a\x4b\x95\xd1\xfd\x22\x47\x9d\x89\x7d\x4f\xe7" + "\x77\x45\xb3\xa6\x89\xc6\xde\xfa\x0e\x93\xe6\xb7\x26\x91\x70\x36" + "\x8a\x20\xc7\x83\x83\x7d\x15\xf0\x61\x4e\x45\x1b\x02\xfa\x61\x18" + "\xea\x2c\x65\xda\x2b\x19\x6a\xfa\x58\xe2\xe4\x9e\x29\x9c\x6c\x57" + "\x06\xd8\xb7\xe3\x02\xa1\x5c\x1a\xca\x6d\x6f\xae\xe8\x02\x9f\x65" + "\xb4\x73\x9c\xb5\x0e\xbd\xed\x40\xda\xb8\xe3\xdf\x4a\xa1\x42\xb4" + "\x09\xfe\x71\x17\x5e\xbd\x6c\x37\x35\x5e\xc9\xc6\x50\x73\x5e\x0e" + "\x0d\xb6\x4e\xe1\x75\xe8\x64\xb4\x3f\x4f\x30\xfe\xef\x6e\x0f\x9b" + "\x42\xd4\x67\x1a\x26\xfe\xc1\x55\x4e\x61\xf7\x30\x11\xd9\x80\xf1" + "\xea\xb6\x43\x1f\x1f\xa7\xd6\x70\xb3\xf4\xfd\x80\xcc\x5a\xab\x82" + "\xe2\x82\x2f\x7c\x48\xfa\xc2\xaa\x3b\xe3\xef\xbe\xe0\x0b\x7f\x40" + "\xad\xa5\x01\x62\xbd\x70\x8a\xde\x95\xb1\x4e\x27\x97\xba\x88\x63" + "\x7a\x22\x3f\x5b\xcd\x7f\xef\x6e\xd3\x7f\x17\x8b\xee\xac\x98\x33" + "\xa3\xfb\xd6\xac\x7c\xaa\x6c\xc5\x73\x2b\x27\xe5\x2e\x5b\xbb\xac" + "\xc4\xf1\xa0\x72\xa5\x8b\x99\x97\x2c\x03\xb1\x8f\x7f\x29\xe7\x0a" + "\xb6\x41\x38\x06\xb2\x8c\x7f\xec\x9e\x4a\xfd\xb1\x8f\xd9\x16\xf9" + "\x3f\x10\xff\xd8\xb0\x31\x38\xf6\xf1\xc0\x1e\xf6\xaf\xec\xfd\x32" + "\xa0\x7d\xd8\xc3\xef\x7c\x4f\x52\x73\xbf\x5b\xc7\x72\xb4\x4f\xfa" + "\x9d\xfd\xd2\x13\x1d\xf7\x87\x7d\xec\x78\xdf\x03\xe9\x07\x8c\x3b" + "\xa9\xe0\x45\xcc\x15\xbf\x3c\x3c\x70\x47\xe6\x97\xd0\xff\xef\x9a" + "\x95\xfc\xca\xb2\x27\x8c\xb3\x5e\xfd\x1b\x53\xf2\x6c\x5a\x73\x5f" + "\x0c\xaa\xfd\x95\x5f\xfe\xfb\x3e\x6d\x98\x45\xed\xed\xff\x8a\x8c" + "\xfb\x57\x4a\x36\x3f\xd4\x65\xf3\x57\xf6\x2b\x9d\xc7\x0f\xc8\xc6" + "\xaf\x16\x0e\xc8\xf5\xa7\x46\xdd\x85\x5f\x75\x96\xaf\xdb\xb9\xd7" + "\x9e\xa1\xf7\x56\xf0\x9e\x0b\x9e\x6f\xc0\xb3\xbc\xf7\xa9\x7c\xd1" + "\xdf\x9b\xa4\x3f\xa3\x8d\xf7\xae\xd5\x9f\x33\xce\xd0\xa1\x88\xfe" + "\x3c\x16\xcf\x9f\xeb\xcf\x90\xd9\x43\x2d\xfa\xf3\x68\x3c\xbf\xa7" + "\x3f\x43\xc7\x1f\xda\xab\x3f\x8f\xc1\xf3\x0b\xfa\xf3\x37\xf1\xfc" + "\xac\xfe\x0c\x19\x3c\xf4\xb0\x7e\x2e\x8a\x79\xf5\xd0\x3d\x57\x6f" + "\x77\x1f\x4a\x51\x67\x6f\x87\x72\xa1\xeb\xf5\xbb\x6a\xfd\x69\x85" + "\x18\x9b\x26\x83\xbe\x48\xe7\xbd\x41\xac\x61\x0f\x95\xfb\xe9\xcd" + "\xfc\x81\xf4\x5f\x05\xf5\xf2\x1e\xe8\xb9\x89\x51\xe9\x9d\x7a\xfa" + "\x01\xd8\xf7\x15\x51\xe9\x27\xf5\x74\x2f\xca\x1f\x8a\x4a\x6f\xd3" + "\xd3\xdb\xfd\xb4\x67\x5b\x54\x7a\xb3\x9e\x1e\x30\xfc\x10\xf4\xf4" + "\xc3\x2a\xfd\x3d\xf6\x19\x98\x1e\x95\x7e\x50\x4f\x87\xfe\xff\xd5" + "\xf8\xa8\x74\xa9\x57\xaa\xe5\xbd\x2d\xab\x38\x5a\xc1\xb2\xf5\xde" + "\x6c\x3f\xbd\x11\x8d\xf3\x4e\xbd\xee\x62\x3f\xd5\x2d\x8c\x4a\xd7" + "\xef\x57\xbf\x57\xe6\xa7\x8e\xe8\xf4\x41\x6d\xdf\xa4\x3a\x2a\x1c" + "\x6c\x6f\x92\xbf\xc9\x23\xfd\x1f\xa5\xcd\xf8\xeb\x77\xf9\x4e\x97" + "\x75\xaf\x38\xe5\xa8\x12\xe2\x14\xfd\xba\x4e\xf9\xfd\x65\x9c\x60" + "\x3f\x2c\xbe\x1b\xd7\x41\xbf\xde\x24\xef\x4b\x71\x2c\x43\xbe\x2f" + "\xb7\x81\xef\xcb\xfd\x5a\xc6\x79\x9e\x52\xee\x52\x71\x0e\x95\x5f" + "\x69\x97\x5c\xa3\xeb\xe7\x97\x28\x33\x89\xf7\x2c\x19\x0e\xef\xe3" + "\xf9\xca\x7a\xa5\xaf\x23\xaf\x91\x38\x8d\xd7\xaa\xf2\x0e\x55\xd4" + "\x5a\x49\xe9\xfd\x5f\xbf\xab\xf1\x1d\x77\xb7\x5a\xcf\x57\xab\xf8" + "\x99\x5d\xec\x73\x13\x5d\xd6\x4f\xbf\x96\xeb\xdc\x64\x7b\xda\x1b" + "\x3d\xee\x5f\x7b\x06\xee\xf5\xbc\xd7\xa9\xa7\xd7\x21\xfd\x40\x54" + "\xfa\x89\xc1\x75\x3b\xf4\x9d\x6d\x44\x61\xdf\x25\x11\x0c\x5f\x12" + "\xa1\x1d\xff\x01\xbc\x97\xcb\x3b\x2a\xd7\x47\x3c\x23\x4a\xf5\x78" + "\x11\x9f\x85\xd7\x8a\x00\x74\x36\xc7\xd7\x1f\x31\x3f\x18\xa0\xf9" + "\xa5\x3d\x62\xfb\x93\xec\x3f\x77\x51\xc6\x4e\x72\x76\x71\x2c\x5f" + "\xf6\xc9\x0a\xf2\xb9\x4f\x4a\x2b\xe6\xb8\x7d\xcb\x39\xff\x13\x9a" + "\x57\x0c\xdb\xbb\x38\x42\xfb\x00\x7b\xef\x93\x86\x3f\xe4\x6f\xe6" + "\xf6\xfb\x28\x02\x07\x6e\xcf\x29\xbf\x8f\xf1\x1b\x19\x9b\x83\xbf" + "\xfb\x25\x6a\x5e\xf7\x8b\xdf\xb3\xfd\x5a\x99\x6d\xdd\x44\xe0\xab" + "\xdf\x6c\xc1\xb3\x43\xfd\x21\x0f\xe9\x83\xf5\x49\xc9\xf2\x6f\xbc" + "\xfa\x59\x8c\x5f\xe9\x8b\xdf\x78\xc5\x8f\xf9\x8e\xce\x6f\x9a\x51" + "\xb7\x3d\x90\x56\x99\xd0\xaf\xaa\x72\x2f\x99\xfa\x6a\x61\x9b\x9c" + "\x3b\x6c\x52\xfa\xe9\x70\x93\x66\xb2\x6c\xe2\xfd\x42\x19\x23\xbf" + "\x36\xd3\x71\x70\x65\xc8\xd4\xb2\xa1\x83\x36\x7e\x93\xec\x8b\x43" + "\xec\xff\x7d\xf8\xd6\xd4\x32\x8e\xd7\x58\xe9\x87\xdd\x69\xfa\x15" + "\xf2\x7f\xb7\xf2\xb0\x29\x2c\xed\x95\xc3\x4d\x72\x8f\xc9\x93\xc1" + "\xf1\x8d\xad\xbe\xf6\x08\xdb\xcc\x29\xb0\x99\x3b\xa0\xff\x2d\x91" + "\x75\xc5\xe9\xe1\xd5\xc5\x23\xf6\xae\xa2\x94\xc8\xea\xac\xd1\xaf" + "\x5e\xa2\x69\xc6\xfc\x83\xb5\x69\xb6\xe8\xb1\x0f\xaf\xc6\x9c\xc2" + "\x6b\xd7\xd4\x24\x9b\x3c\x4b\xe3\x67\xcd\xb4\xaf\x6e\xdf\xda\x2b" + "\x7f\xe7\x23\x82\x35\x2b\xc7\xe8\x66\x5c\x12\xf5\x75\xdb\x6e\xac" + "\x83\xf5\x3b\xa5\x55\x9f\xd3\x18\xd8\xb9\xa6\xd4\x8b\xc2\x7b\xa6" + "\x84\x4c\xfc\x8d\x84\xaa\x65\x72\x7f\x68\x48\x4b\x71\x98\x7c\xe5" + "\x7f\xa6\xaa\x55\x3c\x46\xef\x0f\x61\x3b\x8d\xfd\x21\x51\xde\x76" + "\x86\xde\xbf\xd6\x1a\xc2\x9c\x11\x82\xed\xfc\x34\xaf\xf5\xde\xbf" + "\x99\xd7\x9b\x7e\x7a\xbf\x84\x7d\xc2\xbd\xab\xee\xe5\xb4\x39\xce" + "\xcf\xa5\xbf\x6e\xbb\xba\x77\xfa\xbe\x83\xdf\x9d\x7c\xc7\x35\x7d" + "\x9c\xf9\xed\xde\xd0\x10\xb5\x07\xf1\xbe\xfe\xcd\x94\xca\x36\xb5" + "\xe6\x7a\xdf\x31\x18\xef\x6a\x1e\xab\x4b\x70\x9c\xe5\xfa\x30\xcd" + "\x0f\x0a\xbf\x3c\xa7\xe4\xbb\xfd\xe5\x33\xbd\xe2\x92\x87\xd4\x7d" + "\xb4\xf7\x3f\xd7\x6a\xac\x2e\x15\x03\xf0\xfd\x4f\x48\xf9\x18\x61" + "\x8e\xb4\x7a\xd4\x1e\xad\xb5\x51\xed\x59\x5a\x9b\x36\x8f\x65\x1f" + "\xe4\xf7\x3b\xba\xd3\xac\xd0\x91\xef\x1f\xee\x4e\x9f\x90\x3f\xf8" + "\x7c\x94\xd2\xe4\xb8\x9e\x46\xf3\x5e\x39\xfb\x13\x37\x28\x3f\x62" + "\xb4\xf1\x5b\xf6\x2b\xe6\xbc\x1b\x4e\x95\x52\x32\xef\x2f\x22\xed" + "\x8e\x29\xf5\xc4\x7b\x2a\x23\x85\xcd\x5a\x28\x7d\xb7\x3c\xd6\x52" + "\x5f\x97\xf0\xb2\xcf\xa0\x3a\xd3\xf8\x6d\x50\xa4\x59\x0b\xf5\xf2" + "\x2f\xb4\x76\xa1\x0f\x36\x6b\xb6\x2f\x74\x56\xb7\x09\x7f\x0b\xde" + "\xb7\x66\x0b\x8f\x35\x47\xdd\x15\xff\xed\xc7\x86\x5e\x55\x3c\xfa" + "\xdb\x3f\x2a\xba\xa5\x34\x29\xba\xfd\x36\xa8\xcf\x57\x37\xf0\x33" + "\xe6\xee\x6c\x75\x06\xff\x5b\xaf\x61\x23\xfb\xf5\x32\x5c\x07\xcf" + "\x7a\x2c\x9c\xdf\xfa\xd1\xf7\x72\x3d\x5f\x7e\xb7\x00\xfd\x03\x0f" + "\xff\x36\x93\xfb\x35\x98\x6e\x95\xb4\xa8\xa0\x64\xe0\x9c\xa7\xa9" + "\xb8\xc8\x41\x5f\x70\xa6\x57\x7d\xb7\xef\x48\xa5\xbc\x33\x8b\x76" + "\x30\x3e\x26\xd6\x9b\x7c\xc7\x97\xe1\x0d\xe0\xff\xcf\x4b\x0d\x5c" + "\xb8\x3d\xce\x43\x5f\xd9\x0f\x90\x69\x95\xc3\x65\x78\x5c\x4f\x97" + "\xf2\xde\xc5\x45\xd0\x8c\xfd\x80\x8e\x6c\x63\x9a\x28\x9a\x1d\x91" + "\xdf\x06\xab\xee\x1f\x87\x23\x4b\x62\xe9\xa1\xde\x35\x1b\x74\xc3" + "\x2a\xf6\x07\x39\xb2\x4d\xa7\x5f\x97\x6a\xff\xc8\x9d\xfa\x5a\x1d" + "\x79\xff\xfc\x45\x54\xdd\xeb\xfa\xcb\xaa\x6f\x44\x9a\xf8\x6c\x95" + "\xf7\xda\x15\xbf\x1e\xc9\x1c\xa8\x77\x24\xb3\xe0\x0b\xb6\x91\x47" + "\x64\xf3\x37\xfd\x98\xe6\x3d\xee\x23\xd9\x03\xf4\x56\x70\x12\xb4" + "\x71\xbd\xd1\x86\x9f\xfe\x39\x60\xe0\x89\x67\x7d\x0e\x3e\x52\x36" + "\x30\x26\xff\xbc\xd3\xa8\xc7\xfe\xfb\x78\xcf\xe1\xfb\x82\x09\xf5" + "\x20\x9f\xe9\x00\xbb\xd6\xf0\x4c\xaf\xe4\x47\x3a\xd2\xc5\xbe\xae" + "\xa0\x6b\x9e\xe2\xa1\x23\x6d\x6a\x2e\x3c\x22\x63\xb7\xf0\x79\xc9" + "\xd1\x10\xf3\xc8\x91\x0e\xc0\xd5\xf7\xcb\x8f\x84\x74\x1c\xb0\xfe" + "\x7b\x3f\x10\xbf\xae\xbb\x77\x69\x91\xbc\x18\x3b\x69\x4d\x69\x7c" + "\x9c\x4a\xcb\xc0\x1d\xc8\x0f\xa6\x46\xdd\x21\xd5\xe3\x91\x7f\xe0" + "\xc2\x3a\xf5\xd0\x0e\xb5\x6e\x3d\xbc\x03\x63\xe6\xbc\x48\x63\xf9" + "\xdb\x18\x55\xa5\xe2\x4c\x6b\x29\xd6\xd2\xb6\xcc\xe9\xc2\x93\x99" + "\x53\x75\x91\x86\xb3\x2f\x05\xeb\x1b\xf6\xd5\x14\x69\x48\xaf\xf9" + "\xdf\xec\x7d\x0f\x5c\x54\x55\xda\xff\x99\x01\x0d\x0d\x65\x40\xa4" + "\xa9\xa8\x06\x05\x9b\x5a\x2b\x2a\x7a\x17\x5d\xdb\xa5\xc2\xd6\xfa" + "\x69\x50\x61\x4b\x85\x8a\x26\x2d\xba\xa8\x13\x22\x22\xf2\x4f\x34" + "\xd6\x7a\x15\xd1\xc0\xd0\x10\x69\x5f\x6b\xad\xf5\x0f\xed\xda\xef" + "\xa5\x5d\xd3\x31\x71\x17\x15\x18\x2c\x34\x74\x51\x47\x42\x43\x16" + "\x75\xd4\x51\x06\x9c\xb9\xf7\xf7\x3c\xe7\xdc\x3b\x77\xee\x30\x03" + "\x8c\x69\xb6\xbf\xf7\xe5\xf3\x99\xcf\xe5\xdc\x7b\xee\xb9\xe7\x9e" + "\xe7\x39\xdf\xf3\x3c\xcf\x7d\xce\xf3\x04\x47\x49\xfb\xd4\x76\x17" + "\x83\x6e\xbb\x79\x25\xe8\xb2\xb9\xe7\xc8\x5d\xcc\x37\xe2\xcb\x2f" + "\xd1\xa6\xc3\xe7\xc6\xaf\xe7\x8a\x82\xa3\x71\x0f\x64\x3d\x68\x84" + "\x7c\x6e\xf2\x7a\x6e\x75\x70\x34\xb4\x1b\x97\x3b\x87\x04\xe0\xfa" + "\x86\xb6\x21\xc6\x33\xbb\xd3\xa0\xdd\x38\x8c\x4f\xc6\xf1\xf1\x0a" + "\x78\x7e\x29\xa7\x0a\xa9\x59\xc9\x11\xea\xfb\x0d\x7c\xa6\x6c\x21" + "\xbb\x86\xc0\xf3\x4b\x31\x47\x1f\xda\x79\x0c\x16\x0b\xc6\x50\x28" + "\x85\x6b\x43\xe1\xda\x18\x38\x72\x18\xab\x0c\x63\x49\x43\xfb\x6a" + "\x6c\x1f\x9e\x55\xca\xfa\x4e\x63\x88\x94\x42\xbd\x39\x58\x47\x8c" + "\x81\xc6\xe5\xc6\x7b\xe1\x75\xdc\x53\x6b\x83\xfb\x0c\x20\xe9\xb1" + "\x7b\x9a\xec\xf7\x08\xf2\x33\xcc\xe5\xdd\x73\xf8\x35\x61\x3a\xa8" + "\x5b\x85\xbe\xa6\x4c\x96\xdd\x9d\x2c\xcc\x75\x90\x8f\x77\xcf\x12" + "\xfe\xf7\xb5\xd7\xcd\x8d\x27\x39\x5d\x44\x4d\xbf\x97\x2e\xf4\x02" + "\xec\xdd\x5d\x02\xe3\x80\xf6\x85\x26\xaa\x8f\x2b\xbf\xb4\xef\xcb" + "\x29\xa7\x7b\x77\x76\xd9\xe3\xbf\x01\x6d\xaa\x57\xb1\x98\x79\x35" + "\x1c\xfe\x9f\x4e\xf7\xcc\x0d\x46\x3d\x03\x6d\x07\xd3\x16\x55\xd8" + "\xf7\x38\x30\x1d\x7c\xb7\xc6\x21\x56\x14\xbd\x17\x75\x71\xbc\x37" + "\xc6\xca\x5f\x59\x25\xd4\xc5\x7b\x63\x16\x4d\xe3\xf1\x5e\xb8\x27" + "\xce\x7e\x8f\x6c\x8f\xcc\x6e\xc6\xeb\xf0\x0e\xf8\xbf\x09\xfa\x2c" + "\xf8\x20\x69\xd8\xf7\xe3\xdd\x2b\xc4\x6f\xb6\x46\xf2\x65\x33\xd2" + "\xcd\x75\x2c\xe4\xdd\x3b\xe4\x71\x7b\xf4\xcb\x30\xa6\x10\x9c\xaf" + "\x15\xe3\xeb\xc0\xff\xf0\xbc\x2f\x99\x1f\x9c\x43\xdc\xac\x42\x87" + "\x18\x7c\xb9\x26\xfe\x3b\xa4\x07\xcc\x5f\x2f\x90\xf4\x42\xf9\xd5" + "\x21\x35\x6c\x9f\x91\x7e\x01\xf6\xb3\x85\xe8\xa3\xa1\xec\xc7\xf6" + "\xf7\xeb\x9f\x10\xe6\x69\x43\x8c\xcd\xea\x67\x84\x67\xe2\x9e\x19" + "\x87\xf2\x68\x98\xb7\x2a\xa8\x97\xc4\x62\xd4\xe9\x43\x9d\xea\xe3" + "\xf5\x3c\xa7\x72\x94\x53\x59\x63\x06\xfe\x74\xf7\x6d\x7a\xe5\x5d" + "\xd4\x2e\x67\x1e\xba\x84\xe8\x72\xcf\x12\x2f\xe0\xd7\xd3\xd8\xb7" + "\xfa\xb6\x0e\x7c\x27\x3f\x3e\x3f\x9c\x18\xda\xac\x4c\x86\x83\xb5" + "\xb3\x25\x14\xea\x9c\x25\x41\xe8\x37\x8d\x79\x0d\xa0\x7e\x3b\x8b" + "\xc1\xfc\xd5\x90\x84\x05\x83\x09\xf7\xdb\xf8\xdb\x79\x65\x8c\x05" + "\xbf\x8d\x6d\xed\x36\x0e\xc0\xef\x44\x39\xeb\x48\x30\xc6\xb7\x81" + "\xf9\xd9\x8a\x39\xaf\x30\x07\xf9\x7f\x75\xb7\x0d\x30\x58\x8f\x11" + "\xdd\x6c\xa2\x6c\x27\x5f\x11\xef\x2c\xe2\xbd\xea\x0c\x51\x01\x5d" + "\xad\x7b\xad\x91\x44\xdc\x9f\x5f\x16\xc0\xf6\x16\x97\x01\x8e\xcd" + "\x57\xf3\x96\xce\xfc\x3d\x20\xff\x7f\xe8\x23\xea\xb2\x2b\x58\xee" + "\x02\xef\x33\x64\xcf\x7e\xa5\x10\x8b\x80\x8d\xed\x9e\x75\x6c\x9f" + "\x52\xe0\x1d\x70\x8f\x83\xfc\xfb\x55\x30\x1b\xc3\x10\x01\xd3\xbf" + "\x0a\xde\x3b\x93\x60\xce\x1a\xfc\xc6\x1f\x08\x75\x77\xda\xbf\xf1" + "\x53\xfb\xd0\x57\xb0\xa6\x85\x74\x30\x19\x38\xa4\x63\x9a\xcd\x47" + "\xc0\x01\x3c\x7f\x7b\x38\xde\x0b\xf7\xf9\x99\xa9\x2d\x67\x8f\x45" + "\xe2\xb5\x3d\x7a\xc4\x56\x78\x27\x5f\xf8\x3f\x02\xdf\x0b\xc7\x04" + "\xea\x79\x43\x39\x72\xef\x26\x37\xb1\x4a\x55\xb7\x1b\xad\xd4\xd6" + "\x90\xdd\x04\xfc\x74\x0e\x68\x30\x0c\xe3\x11\x19\xe0\x39\x75\xe5" + "\xdd\xa4\x4e\x7d\x99\xd4\xc3\xff\xe8\xcb\xab\x9f\xfd\x1d\x69\xd5" + "\xb8\xc6\x75\x58\x1b\x12\xa1\xcf\x3a\x6c\x0b\xb0\xb2\x0d\xfd\x9f" + "\x0c\xa0\x11\xd5\x9b\x30\xd7\x16\xa1\x6d\xd4\x71\x6d\xa4\x2e\x03" + "\xf5\x99\xf7\x8d\xf5\xe5\xc7\x48\xbd\xfa\x1b\xfa\x1c\x94\xbd\xf4" + "\xa9\x97\x7b\x6b\x1b\x78\xee\xf6\x22\xa1\xed\x0e\x68\x3b\xd0\x7d" + "\xdb\xd9\xe1\x1e\xb6\xed\x41\xbf\xb3\x35\x9e\xb4\x0d\x72\x65\xab" + "\x41\xcd\xf6\x45\xe5\xdc\x49\x86\xd8\xae\x62\x2c\xca\xfb\x78\xe6" + "\x4f\xba\xf7\x22\xdd\x3b\x95\x4f\xf7\x89\x19\xe9\x1e\xaa\xf3\x84" + "\xfa\x04\xb2\x7d\x53\xa7\x09\xfa\x13\x74\xe6\xef\x6d\x96\x74\x12" + "\xfb\x77\x1e\x90\x09\xab\x99\x8f\x66\xd1\xdd\x46\xc6\x57\x7b\x3f" + "\xc7\xb6\x5c\xf7\x23\xd8\xcc\xfc\x4f\xab\xc7\x88\x76\x8e\xcb\xfe" + "\xc1\x66\xa1\x2d\x8d\xb3\xfd\x4c\x4c\x72\x99\x94\x91\x26\xe6\xcb" + "\x4c\x13\xb6\x6f\xbe\x94\xf4\x46\xd2\xac\xf4\xa4\x99\x9a\xb8\x05" + "\xa9\x73\x1f\x9a\xf7\xe6\x9b\x9a\x49\x49\xf3\xe7\x4f\xff\x6d\xd2" + "\x60\x12\x97\x3a\x7d\xee\xfc\x59\x68\xe3\xd2\x68\xa2\x1f\x9f\x96" + "\x3c\x2f\xed\xa1\x5f\x46\x87\x3b\xd9\xb8\x70\xaf\x5f\x33\xca\xba" + "\xb9\xd9\x30\x3f\x6d\xc4\x1f\x63\xcb\xf8\x2d\xe2\xf5\x8b\x41\xcf" + "\x02\xfe\x6b\xc7\xf5\x00\xe6\xed\x29\x94\xc1\x31\xae\x1d\xe0\x77" + "\xed\x07\x6b\xf9\x86\x33\xe4\xc8\x67\x20\xbf\x35\x6d\x64\x31\xda" + "\x9a\x41\xf7\x35\xb1\x9c\x6e\x47\xd0\x97\xb5\xfa\x3f\xe1\x9c\xc9" + "\x3f\xa4\x63\xd5\x09\xe2\x0d\xeb\x0c\xc8\xff\xfb\x26\xf2\xca\xdb" + "\xf8\x15\x41\x7c\x35\xff\x9d\x9a\x08\x71\xa7\x95\x06\xa3\x05\xbf" + "\x87\x83\x5e\x92\xcb\x23\x9e\xb2\xb9\xb5\x6f\x12\x1b\x17\xbf\x3c" + "\xe6\x97\x7b\x64\x0e\xea\x0a\x4b\x69\xce\xbd\x7d\x30\xff\xab\x76" + "\x4a\x38\x5d\x9f\x21\xc8\x68\x4d\x30\xee\x0b\x5b\xa0\xcc\x62\x5f" + "\xec\x5b\x2e\xf7\x75\xf8\x07\xac\x7f\x5f\x97\xb1\x1f\xde\xf3\xf5" + "\x4e\xf6\xc3\xff\x1d\x7f\x47\x62\xd9\xcf\xf9\xfc\x0f\xfd\x89\xcf" + "\xbf\xde\xfb\x0d\xe1\xbd\xff\xfa\xf3\x7c\xfa\xde\xb7\xf0\xfd\x7f" + "\xc8\xfd\x86\xc8\xde\x7e\xc8\x6f\xc0\x5b\xcd\xff\x79\x82\xf8\x00" + "\x7f\x16\xaf\x9c\x01\x3c\x7d\x9c\xa8\xb3\xac\x7c\x6b\xee\x14\x12" + "\x9c\x73\x96\x60\xce\xb3\xb6\xb4\x0c\xbe\x35\xe7\x2a\xca\x7e\x86" + "\x41\xc0\xbf\x55\x85\x2d\xc4\x77\x65\x0b\x51\xd5\xa7\x61\xee\x53" + "\x8c\x3f\x05\xad\x81\xa4\x6b\x80\x72\x6d\xba\x85\x1c\x34\x5d\x44" + "\xff\x20\x7d\x7d\x22\xe0\x4e\x33\xe6\x8d\xe5\xab\x7d\x13\x49\x60" + "\x59\x10\xbf\x93\xcf\x4f\xf1\xe6\x95\xbf\x33\xc3\xb9\xc6\xed\x5c" + "\xd4\x80\xed\x99\x35\x03\x30\x3f\x5c\x0b\xa9\x19\x22\xf0\xe6\x22" + "\xb6\x27\xa7\x9e\xda\x2b\x60\x9e\x34\x32\xfb\x75\xfd\x15\xb6\x9e" + "\xd7\xef\x13\xec\x3a\xf8\x3f\x95\xc9\xe0\x3d\xaa\x30\x47\x24\xb6" + "\xb9\x8d\xab\xa2\x39\x22\xb7\x67\x46\x0d\xc8\x9a\x4e\x94\xf5\xc6" + "\x76\xb2\x17\x70\x10\xf3\x0d\xc2\xbc\xdb\x02\xf3\x0c\x73\xca\x15" + "\x41\xff\x56\x94\x07\xf1\xcb\xa1\x4f\x9b\x3b\xf3\x6b\xb2\x60\xcd" + "\xd2\x09\xdf\x37\x30\xce\xcd\x96\x95\x50\x27\x66\x01\xb9\x6f\x25" + "\xd4\x2b\x84\x7a\x28\x8f\xb2\xfe\xd5\x3e\x05\x63\xb0\x03\x9e\xd9" + "\xa0\x99\x8a\xe5\xfd\xd4\x36\x84\xcf\x86\xf7\xd0\xb4\x90\xfd\xb5" + "\xb0\xb6\x79\xe3\x33\xc4\xe7\x42\xfb\x80\x7f\x7b\xb5\xc2\xf7\xd5" + "\x22\xd6\xce\x7e\x1f\x36\x5f\x83\x67\xae\x92\x72\x78\xce\x5c\x99" + "\x09\x6b\x7a\x37\x8d\xcb\x58\x8c\x76\x0d\x94\x31\xa8\x5c\x61\x23" + "\x7e\x4c\x0f\x07\xd9\x22\x19\x70\x00\xe4\x09\xea\x4b\x0c\xb2\x04" + "\xf4\xa5\x18\xf3\x68\xe2\x75\xd0\x8f\x76\xc0\xba\x5c\x89\x72\xc0" + "\xd4\x2b\xcf\x13\xb4\x65\x83\x3c\xe0\x3d\x3f\x81\xb7\xb0\x7c\x1f" + "\xfb\x93\x45\x59\x00\x31\x08\xd7\xff\x95\xe9\xc4\xfb\x1a\xd0\x10" + "\x78\xa0\x06\x64\x0b\xff\x76\xb2\x7f\x93\x30\xf6\x35\x74\xcd\x4f" + "\xa7\x71\x84\xbd\x18\x46\xef\xff\x0c\xde\xcf\x17\x9e\x51\x63\x24" + "\x47\x68\x8e\x6f\x86\x31\xfb\xf5\xe2\x3a\x8e\xba\xa5\x11\xda\xe0" + "\x01\xcb\x84\x6b\xf0\xfe\xfa\x62\xf1\x99\x70\x4d\x27\x8c\x59\x2d" + "\x8c\x19\xb4\x79\x80\xee\x27\x07\x99\xab\x43\x18\x9b\x2c\x94\x2b" + "\xd8\xbd\x07\xd4\x62\xbb\xa8\xff\x72\x20\x57\xe0\x78\xe1\x38\x41" + "\x3b\x59\x02\x8e\x35\x32\xf9\xa5\xf6\x01\xe1\xbb\x76\x11\xd0\x7a" + "\x99\x34\xfe\x07\x12\x1c\xc7\x1f\xee\x5f\xc6\x9e\x73\xf0\xb0\x03" + "\xed\x40\x07\x39\xb8\x05\xed\x91\xd0\xc7\x9d\xcc\x96\x72\xa0\x04" + "\xe3\x77\x61\xbc\x60\x18\xe3\x9d\x2b\x30\x36\x2d\x60\xf3\xd2\x13" + "\x44\xc8\xdf\x7a\xb0\x84\xc9\xa7\x07\x23\x58\x8e\xc3\x83\xf7\x60" + "\xb9\x15\xfa\xc5\xf2\x1b\x1e\x1c\xc0\xf2\x1b\x1e\xb0\x39\xe6\x6c" + "\x95\xf2\xb5\x1e\x30\x4b\xfe\xfc\x07\x34\x4c\x4f\x3d\xa0\x41\x5b" + "\x13\xad\x7f\x2d\x19\xfb\xd6\x8c\xf3\x52\x7c\x57\xcc\xdd\x0a\xe7" + "\x51\xf6\x6f\x46\xba\x89\xe7\x31\xae\x2d\xd0\xc9\x17\x9e\xb9\x52" + "\xe8\x53\x32\x94\x7d\xe0\xd9\xd4\x8f\x06\xf3\xb8\xae\xc2\x7b\x72" + "\xa4\x7b\x70\xde\x00\x0f\xfb\xc1\x3d\x6f\xc3\x91\x17\xeb\xb2\xfc" + "\xae\x07\x7d\xdf\xeb\x46\x5b\xd3\xc1\x50\x31\xbf\x2b\xe6\x76\x45" + "\xcc\x58\x39\x55\x36\xf6\x38\x36\x5b\x80\x56\x94\xef\xf6\x5a\xab" + "\x60\xbc\x0f\x82\xfc\xff\xb9\x10\x4b\xee\xa0\xaf\xd0\x3f\x3d\xcb" + "\x7b\x50\x1d\x5d\xbe\x46\x8c\x65\x70\xd0\x6c\xd7\x87\xec\xb2\xe5" + "\x41\x5f\xe4\x49\x68\xab\x16\xe9\x8f\x72\x62\x67\x7e\x6d\xb0\x9d" + "\xb7\xe8\x7e\xd9\x83\x65\x28\x5f\x0a\xfd\x47\x7e\xc9\x16\xc6\x2e" + "\xda\x71\xde\x39\xce\x73\x68\x23\x11\xe6\xb8\x9d\x07\xc4\x79\xcd" + "\xf8\xa0\xae\x44\xb0\x8d\x35\x61\x5c\x59\x68\x57\x8f\x32\x38\x5b" + "\x57\xeb\x92\xf7\x36\x5b\xd1\x56\xdd\x08\x65\x98\xdf\x75\xd1\x97" + "\x03\xc2\x32\x96\x51\xdc\xa8\x05\xfd\xe7\x61\x6a\x3f\xc7\x71\x11" + "\xe7\xeb\xaa\xa9\xa8\xfb\x85\xb3\x39\x9b\xd1\x4a\xea\x2d\x1d\x44" + "\xf0\x95\x87\x39\x7b\x1a\xbf\x51\xb6\x03\x0f\xf9\xe0\xfc\x05\xfa" + "\x6e\xc1\x18\xc8\x30\x8e\x0d\xcb\xd6\xd2\x79\xeb\x8b\xf3\xf6\x1a" + "\xc6\x60\x80\xe7\x54\x27\x46\x91\xbd\x19\x7a\x3a\x8f\x31\xb6\xc6" + "\x07\x30\x76\x98\x4b\xb5\x33\xbf\x2e\x5c\xf4\xf1\x45\x1e\xc1\x58" + "\x1a\x02\x9f\x64\xe0\x5c\x16\xc6\xce\x1b\xea\xc5\x8b\x73\xcf\x81" + "\xfe\xb4\x8e\xd3\x7c\xf3\x63\xf3\xad\x6e\xb9\x38\xd6\x56\x3a\x8f" + "\x0f\x86\x5a\x61\x1e\x3b\x8e\x29\x8e\x27\x8e\x2b\xd4\x85\xf7\xff" + "\xaa\x56\x1c\x53\x69\x3c\xeb\xc3\x04\x9a\x37\x30\x5b\x4e\x5d\x9b" + "\x60\xe7\xb1\x8f\xa1\xc0\x7f\x8d\x38\xa7\x96\xe2\xbb\xc3\xda\x80" + "\xcf\x47\x1e\xf9\x40\xc0\xac\x6a\x13\xf2\x48\x3d\xcc\xff\x17\x97" + "\x4b\xd8\x71\x50\x4b\x75\x16\xa0\x13\xa3\x4f\xfd\x8b\x34\x5e\x85" + "\x0b\xec\x30\x92\x5a\x95\x84\x4f\xf5\x89\xe2\x38\x88\x3c\x29\xce" + "\x7b\x68\x63\xab\x1c\x7f\xea\x57\x43\x1b\x01\x88\x6f\x92\x0c\x55" + "\x5f\x21\xc7\xb7\xfa\xe5\x88\x6f\xc8\xd7\xba\x74\xb4\x65\xd5\x0b" + "\xb1\xaf\x6b\xc2\xe5\x98\x54\x13\xc6\xbe\xc1\x33\x99\x0b\x79\x4b" + "\x37\x95\xd5\xc7\x35\x0c\xea\xd3\x3c\x25\xc2\x9a\x97\x81\x6b\x1c" + "\x9c\x13\x63\x61\x37\x43\xfd\x6a\xdc\x77\x88\xb1\x06\x6e\x6f\x66" + "\xba\x1e\xe0\xf4\x4e\x8c\x29\x6d\x24\xff\x68\xae\x87\x59\x78\xad" + "\x80\x61\xb7\x88\x15\xfc\x1b\xf1\xb7\x2f\x6c\x23\x83\x74\xbf\xe4" + "\xbf\x83\x35\x1b\x63\x0b\x5a\x30\xae\x21\xb4\xad\x39\x43\xbe\x7e" + "\x1b\x9e\x1b\x28\x1c\xd5\x70\x9c\x03\xc7\x3b\xe1\x38\x19\x8e\x77" + "\xc3\xf1\x49\xa8\xcf\x09\xf5\xc3\xa1\x1c\x06\xe7\x1f\x17\x8e\xd0" + "\x47\xc3\x0e\x38\xc6\x0a\xb2\x23\x9c\x3f\xd4\x85\x65\x38\x9e\x15" + "\x68\x5e\xcb\x68\x6e\x38\x05\xed\x64\x40\xff\x9b\x0c\xcd\xb4\x2d" + "\x1d\xd4\xf9\x04\xdb\xc6\x7d\xc0\xf0\xff\x14\x07\x19\x14\xda\x69" + "\x78\x07\x8e\x11\x70\x9c\x04\xc7\x34\x38\x86\x08\x63\xd0\x80\xd8" + "\x30\x33\x83\x8e\xf9\x38\x0d\x93\x77\x63\xc5\x39\x8f\xeb\xb0\x84" + "\x1d\xfb\xb3\x66\x26\x30\x7a\x1b\x49\x1d\xe5\x03\xa8\xfb\x14\xd6" + "\x85\xe3\x33\xc2\x31\x4a\x38\x8e\x17\x8e\xbf\x16\x8e\xd1\xc2\x71" + "\x82\x91\x34\x84\x0a\x32\x06\x8c\x4b\x43\x28\xf5\x2f\x2a\x0a\x0e" + "\x66\xcf\x38\x14\x8d\x3a\x32\xe0\xf8\x13\xd0\xbe\x57\x67\x7e\x43" + "\x95\x68\x87\x44\x9b\xcf\xb5\xfc\xea\x69\x1f\xd0\xef\xc7\x0d\x0d" + "\x0e\xd8\xb6\xd3\x57\x11\x45\x40\x06\x1a\x5e\xa6\x84\xf5\x9f\xb5" + "\xa3\x55\x0a\xdf\x5f\x85\x78\xf5\x5e\x18\xc3\x8d\xea\x43\xfe\x25" + "\x13\x70\xae\x52\x1b\x2d\xc6\x1b\xf3\x0f\xd1\xc3\xaf\x16\x74\x83" + "\x06\x11\xbf\x51\xef\x11\x62\x43\xee\xea\xcc\x3f\x34\x4e\xd2\xd5" + "\x1b\x3a\xd8\xb7\xaa\x3b\x42\xe0\x7c\x9c\xc3\xf9\xcd\xd8\x67\x18" + "\xcf\x26\x78\x9f\x88\x16\x72\x28\x0b\x8e\x8f\xb5\xb2\x77\x0e\x17" + "\xdf\x59\xa0\x87\x4e\x1c\xdf\x56\xd2\x30\x1a\xb0\x30\x15\x79\xb8" + "\xc5\x8e\xb3\x0d\x74\x4f\x9a\xc0\x23\x40\x4b\x03\xc6\xc0\xcc\x75" + "\x98\x83\x8e\x18\x14\x08\xfd\x68\x96\x63\xca\xfe\x66\xc4\x14\xe4" + "\x0d\xc0\x6f\xa0\xb5\x61\xa7\xd3\xfc\x5b\x8e\xf3\x8f\xcd\xbb\xaf" + "\xd5\xf2\x7b\xeb\x97\x5b\xd9\xbc\x6b\x02\x3e\x03\xfe\x34\x94\x21" + "\x7d\x8c\xe4\x90\x45\x98\xd3\x4d\x30\xa7\x9f\x80\xf3\x42\x6e\x60" + "\x76\x5e\x78\x16\xf0\x99\x01\xdf\xfb\x6e\xf1\xbc\xf0\xbe\xd8\x4e" + "\x1a\xd2\x5b\x3c\x2f\xb4\x0f\xfc\x68\x48\xc1\x79\x22\x9e\x17\xde" + "\x09\xe4\xa8\xaf\x2b\x45\x3c\x59\xc1\xf8\x2d\x52\xbc\x0f\xe9\x86" + "\x71\x9d\x98\x2d\xfd\xeb\x32\x98\xab\x15\xb8\x3e\x2c\x9d\x4a\x7c" + "\x17\x96\x92\x21\x6c\x5e\xa2\x4e\xe1\x88\x91\x87\xb3\xf9\x7c\x3f" + "\x2b\xaf\x0a\xa9\xaa\xb3\x46\x88\xf2\x6a\x59\x67\xfe\x37\x6a\x31" + "\x97\xb0\x14\xfb\xfe\x9b\x49\x75\x15\xf6\xf1\x85\xbe\x7c\x33\x4e" + "\xec\x8b\xc3\xfa\x4c\x69\x80\x7d\xc3\xb6\x96\x82\xbc\x6e\x06\x5c" + "\x60\xb8\xfd\x4d\x8a\x98\x63\xbd\x50\x58\xb7\x68\x9e\xef\x74\x96" + "\xe7\x1b\xd7\x46\xf4\xa5\xe1\xd0\x8e\x95\x61\x23\xf5\x3a\xd0\xe5" + "\x33\x4e\x93\x69\x8b\x06\x63\xec\x92\x78\xe8\xeb\x74\xe8\xdb\x26" + "\x1b\xda\xd8\xe7\xa2\x9e\x7a\x78\xb8\x2d\x9d\xb7\x08\x63\x06\xf3" + "\xa8\xb1\x4b\x18\x5b\xc4\xaf\x4d\x88\xe9\x4b\x73\x58\x1e\x1b\xb4" + "\xe5\xe0\xfc\x78\x0f\xd7\x31\x35\x6f\xa9\x2e\xc3\xb9\xf2\x8d\x55" + "\x94\x49\xa1\xbf\x15\x4c\x26\xac\x7b\x95\xc6\xf6\x29\x0a\xa9\x62" + "\xb6\xc0\xc6\x77\xd8\xbb\x37\xea\xd8\xf7\xe4\x10\x21\x56\x7c\x63" + "\x82\x97\x3a\xe8\xf7\xcc\xff\xa9\x3a\x93\xf9\x6e\x34\x4e\xb4\xfb" + "\x6e\x48\xb2\x62\x1a\x8b\xbb\xd4\x98\x2c\xcd\x89\xc6\x48\xbc\x0f" + "\xee\x5f\x0f\xe7\xf3\xa4\xf3\x75\xf1\x82\xbd\x6b\xe7\xd0\x25\x51" + "\xe8\xc3\x35\x1c\xe3\x3f\x0b\xcf\x33\xd2\xe7\x53\x9b\x07\xcc\x4d" + "\x61\xfe\xe2\x38\xe3\x9a\x4d\xe7\x30\xcc\x5f\x9c\xc7\xd7\x56\x87" + "\xe8\xe1\xc7\xe6\x2d\x5b\x9b\xd3\xe8\xbc\xa5\x73\xb6\xd1\xe4\xd0" + "\x8f\xcd\xd4\xee\x85\xf4\x5c\xac\xf6\xed\xcc\x3f\xec\x0b\xf2\xaa" + "\x90\x27\xe1\x1b\xea\x7f\x8c\xf1\x39\xac\x57\x79\x13\x7e\x43\xc6" + "\x6f\x8a\xb8\xc7\xc9\x0f\xb8\x1b\x63\x6a\x88\xdf\x84\x27\x75\xe4" + "\xf2\x36\xfc\xbe\x73\x95\x37\x17\xd9\xe3\xcf\x1f\x8e\x97\xe2\xe3" + "\x7c\x53\x25\xbc\x57\x15\x3c\xab\x8c\xf9\x5c\x7d\xf3\x09\x93\xa9" + "\xbe\xd9\x8c\x7c\x6a\x00\xde\x83\x63\x29\xcb\xa5\x7a\xb8\x58\xe4" + "\x3d\x98\x97\x33\xcf\x90\x23\x61\xc5\x41\x7c\x29\xd0\xb4\x14\xe6" + "\x52\x0a\x94\xfd\xe1\x38\x93\x1d\x15\x2a\x3c\x0a\x73\xa4\x14\xee" + "\x6d\x10\x73\x5e\xe3\xd8\x98\xfd\xb3\x63\x91\xcf\x0a\x61\x1c\x90" + "\xd7\xe8\xf7\x5a\x1d\xcb\x25\x8f\x7c\x86\x3c\xe6\xb7\xe4\x79\xca" + "\x67\x74\xff\x3e\x9c\xc7\xfe\x22\x9f\x75\xe6\x1f\x09\x16\x63\xcf" + "\x1a\xc9\x61\x3d\xfb\x6e\x72\x24\x5c\xf4\x59\xc5\x6f\x36\x69\x21" + "\x64\x38\xb4\xab\xa9\xd6\xd0\xf8\x8e\x27\x0d\xd6\xf1\x04\xeb\xe2" + "\xf7\x2e\x86\x93\x77\xa4\xc1\x3d\x33\xa5\x31\xdf\x4f\xfd\x36\xf6" + "\x26\x50\x5b\xe4\x30\xb8\x96\xe7\xa8\x67\x18\xc9\xbe\x89\xa8\x6b" + "\xa0\x0f\xdd\xc8\x40\x82\xb9\xe9\x01\xc7\x8e\x6c\x12\xe5\xda\x47" + "\x02\xf1\xbb\x79\xb5\x05\xfa\x87\x3a\x34\xbc\x6b\x75\x2b\xe8\x92" + "\xee\x6c\xc6\x11\x68\xeb\x11\x72\xc6\x34\xa3\x1d\x0b\x63\xec\x9f" + "\x21\xc7\xc2\xea\x4a\x81\x9e\xf3\x7a\xc6\x1e\xce\xc9\xe0\xaf\x60" + "\xfc\x61\x4d\x2a\x19\xd6\x42\x8e\xa1\x3e\xd8\x94\x7b\x11\x6d\x34" + "\xdf\x8e\x96\xdb\x68\xbe\xcd\x12\x7e\x45\xf0\x33\x4b\xbf\xa6\x65" + "\xc2\x91\xf4\xf1\x2b\x63\x75\x9b\x36\xc3\x6f\x87\x30\x56\x3b\x3a" + "\xf3\xbf\xb5\xdb\x7f\x91\x2f\x71\x6e\xa3\xbf\x04\xda\x9c\x14\x56" + "\x82\xb1\x3b\x80\x4e\xd0\xef\xa5\x0f\xbe\xa4\xcf\x44\x3e\xfa\x96" + "\xe6\x70\xc4\xb8\xb8\x9e\xf9\xec\x7c\x4b\xe9\xc9\x62\x54\x7e\xbb" + "\x0c\x9e\x5d\xbd\xea\x3c\xf1\xd6\xa5\x92\x7b\xd0\xfe\xed\x67\xe3" + "\xf5\xa8\xe3\x22\x4f\x6c\xa4\xb9\x5a\x9a\xde\x4e\xcb\x26\x4a\xb8" + "\x7e\x1f\xfc\x9f\x26\xca\x49\x70\x8f\xca\xcb\x42\x02\x51\x3e\x7a" + "\x26\x9b\xdc\xd7\x99\xdf\x14\x2b\xd2\x0a\x65\x08\xb4\xc3\x09\xb6" + "\x04\xec\x2b\xf5\x4d\xc4\xd8\xe9\x46\x3a\x6e\x14\x87\xb1\x0d\x98" + "\x77\x4d\xe3\xbc\xcc\x44\xc5\xd6\x9e\x26\xe0\xff\x6a\x41\x66\x6c" + "\x8a\x07\xde\x6f\x74\xe8\xe7\x55\xe9\x7f\xf5\x7f\xe0\xfd\x7e\x66" + "\x94\xcf\xdc\x8d\x4f\xd3\x29\x71\x7c\xd0\x2f\xd4\x0f\xf4\x04\x4a" + "\x6f\x2b\xdf\x01\x7d\xab\xd5\x65\x12\x9f\x76\x72\xf4\xd0\xc6\xb5" + "\x74\x9f\x5a\x0d\xb3\xcf\x1f\xdd\x27\xea\xe1\xac\xdf\x47\x57\xfb" + "\x2d\xf1\x22\x68\x57\xc7\x78\x61\xd4\xa7\xee\x82\x9a\xda\xd2\x0d" + "\xd6\x71\x44\x9f\x33\x16\xeb\x88\x72\x55\xf3\xe5\x5c\x35\xd9\xab" + "\x1e\x07\xf3\xf8\x68\x82\x51\xf9\x8f\x89\x9e\xfb\x2e\x1e\x4d\x10" + "\xc6\xb7\x96\x7d\xf3\x3f\xfa\x10\xae\x25\xcb\x84\xdc\xf4\xb8\x46" + "\x43\xdb\x55\xe2\xbc\x81\x75\xa3\x1a\xee\x19\xcd\x30\x06\xbf\xb3" + "\x1e\xa5\xf1\x45\xa8\xde\xc0\xea\xfb\x32\x9b\xff\xd1\x0e\xbb\x2c" + "\x0d\xf5\xf0\x3e\xe6\x0b\x76\x94\x4c\xb3\x29\x60\x4c\x8f\xd2\x77" + "\x63\xbc\xa8\x1e\xd7\x99\x7f\x2c\x58\x9a\xb7\x4d\x14\x9b\xf7\x76" + "\x38\xce\xcb\x63\xe3\x24\x7d\xf3\x88\xe9\xa1\x62\xa2\x71\x35\x0f" + "\x75\x43\x89\xea\x5f\x3e\xe4\xe5\x55\xab\xf8\x8a\x22\x25\xf7\xf4" + "\xd2\x42\xe2\xab\x58\x01\xc3\x86\xf3\x2c\x3d\x71\x38\xcc\xc7\x2f" + "\xfd\x7c\xef\x88\x7d\x26\xed\x36\x3e\x47\x4d\x94\x2b\x2f\xdd\xe6" + "\x13\x62\xb9\xa3\x82\xf7\x7a\xf0\xa5\x49\x69\x16\xa2\x99\x5d\x44" + "\xbe\x4f\x21\x5e\xcf\xd8\xe0\xd9\xbe\x44\x67\x24\xcd\x35\xb8\xe7" + "\x72\xaf\x2f\xca\x1f\xcd\x35\xd8\x66\x56\x19\xf1\xc9\x6a\xe5\xdb" + "\x56\xbc\x39\xc0\x07\xd6\x03\xd5\x07\xc0\x63\xb7\xfb\xde\x51\x71" + "\x0d\xda\xd8\x93\x48\xef\x73\xf9\xad\xbf\xf7\xbe\xe9\x82\xce\x90" + "\x7f\xbe\xea\x59\xdf\x4e\x24\x4b\x7d\x3b\x91\x7c\x83\xfb\xa6\x92" + "\xfa\x96\x8c\x7d\xbb\xe2\x59\xdf\x8c\x3e\x52\xdf\x8c\x3e\xfd\xec" + "\xdb\x16\xcf\xfb\x96\x71\xc7\x19\xd2\xbc\xda\xb3\xbe\x9d\xda\x2c" + "\xf5\xed\xd4\xe6\x1f\xd2\x37\xd4\xe5\x73\x82\xf9\xd3\x34\xc6\x79" + "\x2a\xf1\x45\x1f\xb9\x33\xe4\xf8\xc5\x9c\x32\x5a\x0e\x80\xff\xb7" + "\x0a\xf3\xdb\x94\x6b\xe6\xbf\x63\x72\xce\xf1\x3b\x1f\xd6\xa1\x5f" + "\xe9\x71\x15\xf0\x72\x0d\xe3\xe9\x13\xd4\xb7\x33\xd7\xc4\x0b\x7e" + "\x9d\xc7\xc7\x94\x53\xbf\x8f\x51\x1a\xa1\x9c\x75\x39\x20\x04\xf3" + "\xa3\x77\x70\x30\x9f\xf9\x80\x11\x04\x73\x3e\x6e\x4f\x35\x29\xf9" + "\x7c\x8c\xbd\x85\xf1\xf2\xbc\x09\xbf\x66\x84\x6a\x7b\xaa\x45\x89" + "\x31\x33\x96\xd2\xfd\xb2\xc7\xd3\xc4\x3d\x62\xe2\x33\x4c\xfe\xa3" + "\x34\x70\x7e\x85\x98\x67\x96\x57\xa2\x3c\x13\x62\xc1\xf6\xe1\xfc" + "\x26\x31\x17\xac\x91\x1c\x8f\x14\xb0\xc1\xec\x67\xe9\x0d\xf7\x8e" + "\x1f\x15\x71\xef\x99\x34\xe2\x87\xb9\x12\x57\xe5\xdc\x86\xdf\x1c" + "\x41\xfe\x39\x9e\x8c\xe3\x1e\x63\xbe\x8d\xf7\xcb\x22\x5e\xb8\x37" + "\x0e\x7d\xe1\x0c\x6a\x13\x09\xcd\x22\x03\x62\x32\xa0\x4d\x0b\x49" + "\xf4\xcb\x80\xf6\x60\xac\x99\x6e\x70\x82\xda\xf8\x8a\xa1\x3d\xfc" + "\xfe\xed\x95\x46\x7c\x9f\x51\xe7\xf2\x4b\xd7\x11\x6f\xdc\x47\x87" + "\xfb\xe1\xd8\x5e\xb8\x81\x3e\x9d\xf9\x27\xe2\xc4\xf7\xeb\x07\x7d" + "\x86\x32\xfa\x9c\x5c\x2d\xd1\xe7\xe4\xa4\x9e\xf4\x39\xf1\x05\xa3" + "\xcf\x89\x4a\x89\x3e\x27\xcd\x72\xfa\x9c\x38\x2a\xa7\xcf\xc9\xe0" + "\xeb\xa3\xcf\xc9\x40\x89\x3e\x27\xcd\x12\x7d\x4e\x8e\x76\x4d\x9f" + "\x93\xd1\x12\x7d\x4e\x34\xf5\x8f\x3e\x27\x17\xb9\xa7\xcf\x49\x9f" + "\x5e\xe8\x33\xd0\x35\x7d\x4e\xee\xef\x3f\x7d\x4e\x9a\x3d\xa0\xcf" + "\x10\x46\x9f\x53\x8f\x4a\xf4\x31\x9e\xeb\x49\x1f\xe3\xab\x8c\x3e" + "\xc6\x58\x89\x3e\xa7\x8a\xe5\xf4\x31\x2e\x92\xd3\xc7\xb8\xf3\xfa" + "\xe8\x63\xdc\x21\xd1\x87\x3d\x83\xd1\xc7\x58\xeb\x9a\x3e\xc6\x56" + "\x89\x3e\xc6\x8c\xfe\xd1\xe7\xd4\x9d\xee\xe9\x63\xdc\xec\x39\x7d" + "\x4e\xcd\x72\xa2\x8f\xca\x3d\x7d\x4e\x15\x7b\x40\x1f\x3f\x46\x9f" + "\x96\x43\x12\x7d\x5a\x56\xf6\xa4\xcf\xa9\x2e\x46\x9f\x53\x26\x89" + "\x3e\xdf\x45\xc8\xe9\xd3\x72\xa7\x9c\x3e\x2d\x09\xd7\x47\x9f\x96" + "\x38\x89\x3e\xec\x19\x8c\x3e\x2d\x29\xae\xe9\xd3\xb2\x4c\xa2\x4f" + "\x8b\xba\x7f\xf4\x69\xf9\xc2\x3d\x7d\x5a\x26\xf4\x42\x9f\xdb\x5c" + "\xd3\xe7\xbb\x41\xfd\xa7\xcf\x77\x11\xbd\xd1\xc7\x33\x59\xef\x3b" + "\x1a\x43\xeb\x06\xb4\xe3\x3e\x3f\x30\x8c\x1d\xfa\xf9\x71\xf9\xdf" + "\x15\x95\x73\x03\x7d\xd8\x5e\x88\xef\x26\x68\x32\xc9\xaf\x5a\xc8" + "\x77\xc7\xcb\xb9\x01\x3e\x7c\xfe\xa6\x99\x5c\xfe\xc7\xbe\xfc\x92" + "\x81\xde\xdc\x92\xdb\xbc\x71\x6f\xb3\xfb\xdc\xd3\xad\x4f\x7a\xdd" + "\x49\xee\xc5\xfd\x69\x4b\x41\x5e\xc6\xff\x3b\xf3\x5b\x27\x80\x2c" + "\xb8\xa2\xb7\x7d\x52\xe8\xeb\xb4\x77\x19\xea\xb7\xad\x69\xf6\xb8" + "\x12\xf9\x7c\x06\xc6\xe7\xd2\x8d\xc0\xfd\x0c\xad\x65\xc5\x34\xde" + "\x53\x70\x59\xd4\x08\xfe\x24\xea\x1e\x67\xc8\xe9\x75\xfc\xea\xe0" + "\x32\xe4\x07\x90\xd5\x87\x41\x9d\x56\xbb\x1f\x1c\x1f\xbf\x5e\xb0" + "\x11\x4e\x60\x75\xbf\x1f\x04\x75\x27\x60\x6e\xcc\xf9\x39\x98\xf3" + "\xf1\xcc\x45\x90\x7d\x47\xe1\x33\x30\xf6\xd0\x46\x38\xa2\x9f\x0c" + "\xf3\x81\x3c\x4d\xf7\xae\x62\x5c\x43\xe6\x73\x76\xe6\xa8\xc8\x77" + "\xf0\x9c\xc1\x50\xde\x23\xc8\xf3\x58\xff\x76\x28\x7f\xe2\x70\xdd" + "\x17\xca\x2b\xa1\x6d\x7f\xe1\xfa\x10\x28\xbf\x85\x72\x36\x8d\x93" + "\x51\x98\x27\xf8\xea\x9e\x89\x83\x73\x2a\xa1\x8e\x3f\xd4\x19\x83" + "\xb2\xbb\xd0\x46\x00\x94\xef\x41\x1d\x58\xb8\x1e\x08\x65\x8c\x2b" + "\xe5\x2d\x5c\x1f\x0e\x7d\x3c\x0d\xe5\xfb\xd9\xde\x92\x6b\xc2\x1c" + "\x3d\x5d\x79\x7d\x7b\xae\x4f\xb3\x58\x5c\x4a\x6a\x0b\x02\x5d\xe0" + "\xb4\x83\xff\xcf\xe9\x52\xf9\xb5\x33\x81\x0e\xd7\x96\x8b\xd7\x98" + "\x8f\xda\x99\x70\x87\x6b\x19\x4e\xd7\x26\x3a\x5c\x4b\x76\x6a\x33" + "\xd9\xe1\x5a\xbc\xd3\x7d\xcb\x1c\xae\x45\x3b\x5d\xab\x70\xb8\x16" + "\x21\x5c\xf3\x82\xf3\x55\xd2\x37\xbc\xd3\xa1\xc2\x79\x25\x9c\x6f" + "\x70\x38\x1f\x28\x9c\xc7\xe7\xb7\x19\xc9\xfb\x33\x85\xf3\x94\xf6" + "\xac\xfd\xef\x89\xd4\x7e\x6b\x2b\xb3\x71\x7c\x1f\x68\xf7\x9d\x0b" + "\x18\x11\xcb\x5d\x8b\x5f\x0f\xd7\x6a\x91\xaf\x1c\x79\x7b\x6e\xba" + "\x66\xc6\x82\xdf\x6a\x52\x93\xd2\xd0\x7d\x65\xce\xac\x34\xcd\x9c" + "\x79\x33\x93\x64\x71\xca\x03\x31\x66\x1f\xe6\xf9\xc2\xd8\x27\x42" + "\x4c\xfd\x36\x7b\x1e\x0a\xc0\x55\x78\x56\x9e\x91\x44\xd3\xef\x63" + "\xc5\x2c\x9e\x77\x0d\xc6\x4e\x61\x71\x52\xc8\xf3\x2d\xe4\xfb\xb7" + "\x85\x38\x29\x7a\xa8\xbb\xc5\x7d\x9c\x94\xb3\xcb\x69\x7c\x40\xa8" + "\xc7\xe2\xa4\x9c\x5d\x01\xf3\xfc\x19\x7e\x30\xcb\x2b\xc1\xf2\x6d" + "\x7d\x2f\xca\x26\xa6\x69\x5d\x34\xc6\x5e\x1e\xb3\x65\x38\xc7\x3b" + "\x0d\xce\xc2\xfb\x84\xef\xa5\x59\xd2\xfd\x6d\x6a\x76\x5d\x5c\x1f" + "\x84\x67\x16\x05\xe7\x41\x79\x70\x0b\x94\xa9\xfd\x9e\x5e\x6b\x63" + "\xb6\xbc\xd5\xc1\xcb\xf0\x9d\xf0\xbd\xe5\xef\xa6\xfc\x4d\x0b\x69" + "\x9b\x2e\xbd\x5b\xdb\x72\x87\x58\x6a\xc2\x3b\xb4\x55\xb2\x39\xda" + "\xe3\x5d\xa9\x7f\x22\xaf\x0a\x5e\x86\xcf\x46\x3c\x63\x7b\x06\xa0" + "\xbc\x3a\x38\x4f\xec\x8f\x43\xff\x96\xa1\x5e\x0f\xfd\x5b\x49\xc7" + "\x04\x68\xca\x03\x4d\x85\x77\x98\xc4\xe7\x7f\x1f\x4e\x7d\xe0\x71" + "\xaf\x2d\xe6\x09\xa1\x6b\xd5\x59\x7b\xfe\x1f\x5c\xa3\x98\x0d\xf3" + "\xac\x24\xff\x61\x8c\xab\xd5\xe2\xfa\x75\xd6\x41\xfe\x63\xcf\x84" + "\x73\xf1\x8e\x3c\xe4\xf0\xbc\xb7\xf1\x79\x50\x8f\x30\xbf\xfb\xe0" + "\x3c\x9c\xef\x46\xd2\x56\x8d\xbe\x98\x78\x2f\xf6\xd1\x5d\x6e\x38" + "\x77\x31\x08\xa5\x71\x3c\xdb\x20\x8e\x63\x31\xcd\x51\x74\xd6\x28" + "\xda\xeb\xe8\xbe\x1f\xa8\x53\x6c\xcf\x95\xdc\xce\x72\x35\x16\x95" + "\x54\x3d\xe2\x4b\x12\xd9\xd8\xb6\x0f\x47\x8c\xc7\x39\xc3\xb0\xbe" + "\x3d\x8d\xd1\x3c\x4c\xc8\x3f\xd2\xfe\x24\x9e\x97\xfc\xdc\xdb\x8b" + "\xc5\x7a\x22\x2e\xb3\xef\x55\xed\x73\x68\x3d\x96\xbf\x96\x30\x9a" + "\xdf\xaf\x6a\x21\xed\xc2\xde\x85\x76\x16\x1f\x95\xc6\xbf\x69\x2f" + "\xe3\x57\x8f\x82\x31\x6b\x07\xfd\xe7\xfb\x09\x6c\x1c\xd9\x73\xe1" + "\x98\x87\x7d\xc1\x31\xc2\x3d\xda\xfc\xea\x92\x2a\xde\x3f\xcc\x65" + "\xee\x13\xc1\x7f\xfa\xbe\x76\xd2\xc1\x64\x08\x25\x6f\x41\x1b\x2b" + "\x7b\xd7\x8e\x3b\x1d\x7c\x8c\x7d\xc5\x3a\x0c\xbb\xe9\x35\xea\xbb" + "\xad\x4b\x47\x7b\x90\x70\x2d\x1d\xf7\xb1\xda\xff\x1f\xe8\xf0\xff" + "\x00\xfc\x9f\x4f\xe7\x2b\x57\x65\xd2\xb5\xd5\x5b\xda\x23\xdf\xa1" + "\x86\xb2\xaf\x53\x39\x50\x56\x5e\x44\x82\xa9\xff\xad\x99\x6f\xa5" + "\xbe\xda\xc2\x79\xa1\xed\x41\xb4\x3f\xe9\x7c\x24\xf0\x46\x11\xee" + "\x79\x16\xe6\x61\x11\xee\x95\xf6\xb3\x4e\xa1\xfb\xa4\xe1\x7a\x84" + "\x70\x0c\x17\x8e\xa3\x59\xee\xd0\x7f\x39\xe4\xff\x46\x1b\xcd\xbf" + "\x8c\xee\xf2\x91\x8b\xf9\xda\xc5\x7c\xe4\xb8\xcf\x5a\xc8\x9f\x9a" + "\xd0\x99\xdf\xa1\xee\x2d\xf7\x3b\x5c\x8f\x14\xf7\x4c\xdb\x8a\x82" + "\x23\xb8\xa2\x1c\x35\xe6\xaa\xc4\x38\x5b\xb9\x1d\x18\x6b\xc5\x4c" + "\x0c\xa4\x9b\x18\xd2\x3a\xf3\x30\x5f\x65\xbd\x85\xc6\x2e\xc6\xbd" + "\xa6\x0a\xb4\x9b\xa3\xec\x58\xaf\x3b\x47\x73\x55\x2e\xec\x20\xc1" + "\xba\x5f\xf2\xad\x30\x06\x65\xb6\xd5\xc1\x11\x02\x1f\xad\x83\x35" + "\xf0\x5e\x18\x0b\x6a\x2f\xa6\xb9\x96\x3b\xe8\x77\x2f\x9f\x33\xe4" + "\xdc\x68\x5a\x87\x8f\x5f\xc7\xc6\xee\x1c\xb5\x7d\x6d\xcc\x17\xf3" + "\x11\x76\xd8\xf3\x1f\x1b\xc9\xb9\xf0\x2b\xfe\xf1\x16\x38\xd7\x26" + "\xf7\x99\x3e\x47\xdb\xc4\xbe\x1b\x49\xc7\x26\x6c\xbb\x33\xff\x9c" + "\xaf\x7d\xce\xc2\xf9\x85\x56\x72\x17\xf4\xeb\x8c\xd8\x3e\x5c\x87" + "\xf9\xdf\x5e\x85\xd7\xb1\xcd\x2b\xab\x73\xa0\xdd\x73\x51\x46\xaf" + "\x0b\x11\xcc\xe7\xfa\x1c\xac\x7f\x7f\xa8\xea\x4d\x06\x82\xb9\x10" + "\x0e\xf8\x19\xc9\x15\x8d\xd2\xb2\x58\xd8\xa3\xc2\x99\x8d\xf1\xdc" + "\x3a\xf4\xeb\x5a\x75\x95\x78\xa3\x0f\x04\xe3\xd9\x73\x6c\x7f\x0f" + "\x9c\x03\xac\xde\x0c\x73\x84\xea\xfe\x9e\xad\xfb\xe7\x68\x8c\x9f" + "\x55\x97\x88\x4f\x61\xaa\x18\xcb\xfb\x9c\xd9\x21\xff\x80\xb0\xbf" + "\xe4\xfc\x3d\xf8\xa5\x7c\x55\x37\xeb\xa3\x73\x1f\xb0\xbf\xd0\x56" + "\xa9\x5b\x19\x53\x35\x4a\x4b\xbf\xcf\xac\x19\xa1\x61\x3e\xaa\xe7" + "\x93\xbc\xd4\x77\xaf\xed\xcc\x3f\x9f\x68\xcf\xbb\x00\x75\x0a\xd1" + "\xf7\x1e\xda\xb7\xbf\x67\x2a\x3e\xe3\xfc\x72\x36\xd7\xcf\x97\x71" + "\xab\x47\x69\xb1\x0f\xc2\xf9\xb2\x7a\xab\x05\x63\x2c\xb8\x8c\x53" + "\x45\xf3\xb9\xa1\x4f\xf8\x9a\x51\x5a\xdc\x9f\xf3\x88\x45\xec\xf3" + "\x85\x32\xdc\x17\x82\x7d\x66\x63\x7b\x61\xb5\x38\x8e\x2b\x2f\x41" + "\xdb\x39\xc7\x48\x2b\xb9\x70\x27\xfa\xcd\xe1\x3e\x27\x9c\xc3\x6c" + "\x0c\x2e\x50\x9d\x8f\x3e\x9f\xd6\x39\x4f\x75\x7f\x9a\x5b\x07\xda" + "\x2f\xa7\xf9\xc1\xe0\x1d\x80\x16\xfa\x1c\xdc\x5b\x7f\x81\xee\xf1" + "\x59\x9a\x4a\xd8\x7b\x53\x3f\xd9\x0b\xc2\x77\x92\x0b\xf1\xe2\x5a" + "\x61\x14\xce\xad\xc2\x67\xa7\x77\x93\xf3\xe4\xc2\x18\xcc\xfb\x0d" + "\xe3\x11\x89\xf1\xdd\xea\xcd\x30\x4f\x32\xba\x91\x17\x22\x31\x9f" + "\x24\xd4\x8f\x64\xeb\x1b\x8e\xf9\x85\x60\x7c\x3e\x8e\x2d\xd0\xce" + "\x04\x63\xba\x09\xda\xde\x21\x8e\x69\x61\x10\xea\x3b\xe7\x1b\x7a" + "\x5b\x1b\x6c\xd0\xe7\x7a\xa0\x9c\xfe\xae\x63\xd0\x3f\x53\x36\x17" + "\x30\x8a\xc6\x57\x86\xff\x85\xbd\x69\x8c\x76\x6c\x2e\x99\x26\xc3" + "\x33\x0c\xe8\xdf\x80\x58\x89\x31\xc8\xe0\x9d\xac\xc2\xf8\xd1\x7c" + "\x0c\x45\xe9\x6c\x1c\x84\xfa\xc2\x77\x9e\xbb\x0f\x77\xe6\x9b\x26" + "\x4a\xf6\x62\x13\x5d\xbb\x91\xdf\xca\xa9\x4e\x68\x4a\x76\xe8\xb3" + "\x99\xee\x33\xbd\x84\xb6\x3e\x93\x0a\x9f\xb5\x12\xe3\x6f\x21\x5f" + "\xb4\x3b\xf2\xff\x85\x8b\xd8\x4f\xf4\xf9\xb5\xf9\x8f\x80\xf5\x76" + "\x44\x28\x8e\x33\xdc\xa3\x85\xb9\xe0\x52\x3f\x11\xd6\x42\x9a\x0b" + "\x0e\x9e\xd9\x2c\xae\x85\xa0\x5f\xc0\xba\x70\xf1\x30\xd5\x3b\x41" + "\x9e\x36\x70\x28\xcf\x5c\x6c\x44\xbe\x81\xb9\x9e\x21\x60\x6c\x46" + "\x67\xfe\x45\x95\xf8\xcd\xcb\x86\xfb\x26\xce\xd3\xef\xbd\x66\x31" + "\xc7\x19\x8b\x77\x77\x31\x42\xda\x67\x71\x31\xaa\xc7\x3e\x0b\xdc" + "\x63\xb3\x96\xe6\xc2\xda\x82\x6b\x4a\x5d\x47\x2b\xae\x11\xf4\x7e" + "\xdc\x7b\x91\x03\x3a\x39\xdb\xa7\xd3\x8a\xf6\x79\x9a\x33\x04\xfb" + "\xc2\x72\x37\xb4\xd0\xff\x81\x6f\xbd\xf1\xc8\x78\xe9\xe2\x26\x7b" + "\x1e\x6f\xa0\x37\x7e\x6b\xdb\xeb\xfd\x2c\xd1\x8f\xc0\xf5\xfa\xe2" + "\x61\xcc\x49\x0d\x75\x6a\xc4\x7c\xd4\x34\xff\x34\x7b\x9f\x14\xb7" + "\x71\x0d\x1f\x26\xe1\xb8\x2f\x1f\xf7\xb1\xd1\x31\x50\x95\xc4\x63" + "\xac\x64\x8c\xfb\xa8\xcf\xc4\x9c\x26\x97\xde\x7e\x2f\x88\xee\x05" + "\x36\xeb\x1f\xbe\x84\x7e\x58\x1d\x67\xb2\x68\x3c\x23\x9f\x98\x0c" + "\x2b\x8f\xf7\x51\x79\xc2\xbf\x04\x63\xfd\x75\xd0\x5c\x01\xd8\xe6" + "\x75\xc7\xfd\xbd\x14\x2b\xc8\xa6\x1d\x80\xfb\x77\xb4\x93\x4b\x54" + "\x76\x87\xff\x83\xda\xc9\xe5\xad\x2c\x2f\x2a\x8b\x5d\x2f\xf8\x63" + "\x0f\x64\xb1\x2c\x60\xcc\x68\x6c\x81\xcb\x21\x9a\x07\x31\x87\xf0" + "\xe5\x30\x1a\x47\xba\x28\x78\xb9\x30\x06\xcb\x57\xb1\x7e\xf9\x4d" + "\xcb\x50\xd2\x3e\x62\xff\x3c\xec\x5b\x87\xa0\x47\x0c\xec\xcc\xbf" + "\x1c\x2e\xc6\xc0\x60\xf2\x14\x8b\x2f\xcd\x68\x71\x79\x83\x20\x3f" + "\xaf\x10\x9e\xbd\xe2\x87\x3f\xfb\x72\xb2\xd0\x66\x22\x8b\xb1\x7d" + "\x29\x10\xda\x4d\x84\x7e\x54\x89\xfa\x8c\xb0\x87\x68\x34\xd3\xb3" + "\x2e\x37\x48\xfa\x0c\x1b\x43\xd9\xfe\xb6\x79\xf3\xd2\x34\x33\x67" + "\xcd\xd7\x4d\x4f\x7b\x23\x59\x93\x94\x9a\x3a\x2f\x55\x83\x41\x8e" + "\x1c\xe7\x0f\xcb\x03\x74\xb9\x55\xc8\x99\xb7\x59\xca\x99\x67\x1e" + "\xed\x98\x67\xd2\x48\xcc\xe1\x37\xc6\x76\x61\x9e\xe8\xae\x9d\x22" + "\x25\x57\x09\xbf\x2a\xf8\xe9\xe1\x57\x83\xb6\x8c\x69\x16\x12\x05" + "\x6b\x3d\xc5\x3c\x29\xb6\x83\x19\xe3\x80\x46\xb5\x10\xf3\x27\xe5" + "\x9c\x37\xa1\xb1\x7a\xf2\x39\xdc\x9f\x89\xf1\xd0\xab\xe0\xa7\x87" + "\x5f\x0d\xfc\xe8\x7d\xdc\x57\x74\x5f\x7a\xa5\xe3\x35\xe6\x3f\x92" + "\x5d\x8b\x75\xf8\x25\xa8\x22\x62\x4e\x70\x56\xcf\xa9\x0f\x4a\x3e" + "\xff\x5c\xa2\x50\x8f\xea\x92\x43\x97\x10\x8d\x8b\x7a\x5e\x7c\x7e" + "\x6b\x82\x50\x8f\xfa\x1d\x8b\xef\x83\xb1\xfa\xa1\xbe\x58\xcf\x9b" + "\xcf\xbf\xd8\x26\xd4\xa3\x3e\x72\x5c\xbe\xd2\xd5\x73\x07\xf0\xf9" + "\x7f\x49\x16\xea\xa9\x1c\xdb\x73\xa8\x33\x90\xcb\x3f\x86\x31\xf1" + "\x1b\xb8\x25\xde\x81\x4c\x76\x32\x4f\x84\xfa\x2e\x63\x9c\x7a\x46" + "\xa7\x2b\x66\x67\x3a\xe9\xde\x98\x95\x34\x76\xd6\xdc\x74\xcc\xd4" + "\x94\x36\x6f\x41\x1a\x1e\xe7\x4e\xff\x1d\x3d\xcc\x9b\xf6\xe6\x1b" + "\xec\x9f\xb4\x94\x70\xfc\x27\x05\xf8\x0d\x8f\x33\x17\xe8\xf0\xf0" + "\xc6\x3c\x2c\x66\x24\x8f\x5e\xf0\x86\x98\x9e\xde\x91\x0f\xb5\x9d" + "\xf9\x57\xcb\x80\x37\x56\x30\x9c\xbd\x0a\xeb\xe2\x77\xd4\xdf\x0b" + "\xf3\x11\xed\xd3\x5a\x89\x68\xd7\x92\xc7\xf6\xb8\xfa\x39\xc6\xf6" + "\xf0\x5b\xa2\x7b\xc3\xcf\x3a\x2b\x09\xd6\x8c\x38\xb8\xb7\xd5\x48" + "\x7e\x6b\x11\xb0\xb1\x94\xc6\x09\xcd\xbf\x1a\x21\xf8\x76\x7a\x73" + "\x45\xc1\x13\x31\xfe\x3d\x94\x69\xee\x67\x28\x67\x40\xb9\x18\xca" + "\x98\xf3\x39\x10\xca\x71\x68\x93\x82\xb2\x1a\xca\xc1\x5c\x91\x5f" + "\x22\xee\xe5\x85\xb2\x06\xca\xa1\x9d\xf9\x9d\xd1\xe2\xbc\x70\x2d" + "\x2b\x77\xce\x14\xf3\x51\xb3\xdc\xd3\x9d\x69\xf6\xdc\xd3\x98\x0f" + "\x29\x47\x95\x40\xd7\x5f\x2a\x83\x74\x96\x7a\xa9\xef\xc1\x36\x4b" + "\xc5\xf5\x92\xd9\x3b\x3a\x37\x8b\x71\x4a\x98\x3d\xa3\xb3\xca\x21" + "\x87\x37\x96\x6b\xc4\x1c\xde\x68\xef\xa2\x39\x04\xe1\xc8\xe7\x63" + "\x3c\x56\x7e\xb3\x4b\x5b\x1e\xcd\x3d\x69\x79\x08\x63\xdb\x9a\x72" + "\x67\x2a\x46\x96\xa3\x0d\x0d\xca\x2c\x36\x23\x7f\x9e\x74\xd2\x58" + "\x23\x62\xdc\x36\xc7\x98\x0d\x2e\xf7\x43\x7d\x0d\x32\x03\xcd\x17" + "\x95\x32\xcf\xcf\x3a\x3d\x89\xc9\x81\x96\x95\x0c\xbf\x46\x44\x33" + "\x79\xc1\x92\xc1\xbf\xc4\x72\x8a\x18\x89\xc5\x8a\x3a\x8b\x9f\x22" + "\x65\x1e\x0f\xf7\xfa\x65\x4c\x4f\xa2\xe7\xa0\xde\x52\x90\xd5\x84" + "\xfe\x4d\x31\x04\xe3\x5e\x52\x4e\x88\x45\x61\x49\x98\x7a\x4f\x1e" + "\x3e\xc7\x87\xca\x21\x5f\x13\x5f\xcc\x01\x89\x7d\x2b\x77\x88\x2b" + "\xb7\x0a\xce\xa1\x0f\xe9\xe5\x97\x88\x2f\xc6\xd1\x15\xfa\x92\xc0" + "\xf2\x6f\x59\xcc\x62\x4c\x27\x78\x5e\x82\xf3\xfb\xbc\xf4\x32\xe5" + "\xca\xb0\x37\x46\xc7\x8e\x87\xff\x46\x0b\x69\x94\x1d\x79\x33\xf8" + "\x72\x40\xa8\xf6\xf2\xb6\xe0\xf7\x59\xae\xcc\x2e\xd0\xff\x3b\xdb" + "\xa8\x0f\x0b\xea\x25\x9d\xf1\xa5\xcc\x07\xb5\x2b\x1b\xe3\xd6\x72" + "\xf9\x28\x4f\xe2\xfe\xe4\xae\x14\xe4\x59\x5e\x35\x62\xc2\xc6\x6c" + "\x8c\x91\xac\x80\x31\xee\x9a\x8e\xd7\x84\xd8\x58\x4a\x1a\x4b\xca" + "\x46\xd4\x74\x2f\x2e\xc8\x28\xb8\x07\xf5\x0c\xb1\xce\x41\xb9\x03" + "\xed\x49\x5c\x7e\x97\x0f\xf2\x2d\xd0\x18\x63\x75\x98\xf9\x80\xe0" + "\x48\xde\x7f\x04\x8d\xa5\x86\xb2\xae\x41\x85\x63\xd6\xd5\x08\xcf" + "\x7d\x06\x7e\xbf\x61\xb9\x5b\x5e\x6f\x13\xdb\xc4\xf8\x65\x20\x43" + "\xc5\xc1\x51\x05\xfd\xb6\x3a\xe4\xb4\x13\xf6\x1e\x77\xdf\x83\x71" + "\xd5\xb0\x6d\x26\x3b\x5b\x5f\x65\x32\x48\x37\xc8\xa2\x7e\x45\x6c" + "\x2e\x76\x83\xfc\x53\xb0\x59\xf8\x1f\xe4\x9f\x47\x63\x9d\xda\x78" + "\x47\xb4\x95\x32\x9e\xee\x9e\x09\x3c\xfa\x0c\xfc\x7e\x03\xf5\x75" + "\x62\xde\xf6\xa5\x4a\xba\x4f\xf2\x8c\x97\x1a\xf7\x95\x77\x2f\x17" + "\xcf\x0f\x50\x44\xc1\x98\x76\x97\x8a\x73\xff\x72\xc0\x88\xd1\x50" + "\xde\x2c\xda\x58\x98\xcd\xa5\xbb\x4a\x2a\x8f\x88\x84\x72\x8d\x58" + "\x86\xff\x1b\x45\xac\x40\x3d\xf1\x32\xe8\x92\xa8\x77\xbe\xa1\x06" + "\xb9\x50\x8d\x7a\x5e\x37\xd0\xbf\x20\x99\xd5\xbd\x06\x32\xe8\x3b" + "\xa1\xc2\xff\xbe\x46\x2f\x53\x87\xf8\x2e\x5c\xbe\x97\x1f\x7b\x1f" + "\x6b\x34\xb7\x3a\x47\x6d\xf2\xbf\x1b\xf4\xbd\x6b\xb0\xfe\x77\xb2" + "\xf7\x4d\x3f\x57\xb1\xa2\x5b\x15\x87\x1e\x8f\xfa\x37\x91\xbf\xac" + "\xd4\x0f\x6b\x65\xa6\x2a\x16\x65\x4c\x8c\xad\x41\xe3\xe0\x61\x2c" + "\x48\x2b\x19\x48\xe3\xef\xaf\xce\xf1\xa1\x71\xe7\x17\x6a\x7d\xc5" + "\x38\x90\x7c\xd1\xdd\x1d\xbc\x32\x25\x10\x63\x43\xd2\x3c\x1b\x9d" + "\xda\xa1\x34\x1e\xa4\x10\x07\x72\x43\x3a\x09\x2c\xe3\x58\x1c\x48" + "\x1a\x77\x63\x20\xe8\x24\xe9\xae\x63\x41\xf2\xf9\x7f\xdc\x29\xc6" + "\x82\xe4\xaf\xda\x2c\xf0\x7f\x28\xbc\x3b\xe6\x1f\xd7\xd2\xb2\x14" + "\xc3\xc9\xdb\x65\x6c\x48\x25\x60\x9c\x92\xc5\x86\xf4\x6c\x6d\xb0" + "\xaa\x18\x9f\x58\x63\xc5\xbc\xf2\x0e\xe7\x00\xff\x2c\x42\x6e\xac" + "\xee\x60\xe1\x5c\x86\x91\xbc\xbd\x53\xf0\xaf\x34\xa1\x8d\xac\x98" + "\xda\xc1\xba\x2a\xf8\x6b\xc9\xeb\x5c\xe1\xcb\xa5\x80\xf7\x1b\x2e" + "\xd1\x98\x0f\x56\xa0\xbd\x8d\x62\x1d\xd3\x1b\xad\x55\xce\x73\x78" + "\xc6\x1b\xf3\x66\x26\x4d\x9b\x3d\x47\xa7\x79\x29\xee\x19\x9a\x54" + "\x70\xb4\x66\x56\x5a\x12\x5d\x7e\x34\x2f\x8d\x7f\x3a\x26\x26\x6e" + "\xda\xcb\x71\x4f\xc5\x4d\x7e\xf9\x49\xb6\x3b\x31\x2e\x75\x11\x26" + "\xa6\x4c\x9b\xa7\xc1\x9b\x66\x08\xd9\xac\x33\x93\x52\xe7\x39\xcf" + "\xfd\x40\x6a\xd3\x52\x52\xfb\xad\x19\xff\x67\x76\x33\x5b\x9c\x68" + "\xcf\x62\x38\x67\x1b\x8f\x63\x4b\xf3\x84\xe6\x5b\x6b\x51\x96\x12" + "\xf2\x8c\xe3\x1a\xe3\x8d\xf3\x17\xd7\x9a\xce\x7c\x5b\x9e\x63\xbc" + "\x2b\xe1\xde\x4d\x4a\xbc\x4f\x98\xb7\xc2\xb9\x2f\xf8\xbb\xee\xca" + "\x65\x31\xab\x6c\x3b\x44\x1b\x37\x9e\x13\xfb\xd0\x82\x75\xf2\xad" + "\x36\x29\x9f\xad\xad\x59\xca\xd9\x48\xff\x64\x63\x44\x08\x8a\x2e" + "\x03\x40\x2e\x19\x08\xbf\xdb\xf0\x37\xc1\x8e\xe5\xe9\x7c\x13\xea" + "\x67\x7e\x0a\x58\x6f\x33\xbc\x58\xce\xa7\x82\x46\x9a\xa7\x20\xc6" + "\x66\xf5\x9a\x66\x53\xc2\xd1\x8b\x9f\x66\xf3\xa6\x3a\x21\x9f\xce" + "\x37\xd2\x7d\xf5\xe9\x7c\x03\xe6\x36\x03\x3e\x5e\x1e\x63\xcd\x59" + "\x1e\x63\xe3\xad\xd3\x40\x56\x87\xe3\xf7\xb8\x3f\x3c\xc6\xf6\x3d" + "\x4f\xf3\xbb\xe0\x3e\x7a\x16\xbb\xaf\x06\xfd\x25\xa7\x02\x0f\x97" + "\x5f\x62\x39\x71\x63\x16\x5d\x38\x39\x6d\x91\x91\xe5\xc4\x3d\xcf" + "\xf2\x48\xb3\x5c\xdb\x24\x07\xda\xd9\x3f\xcd\xe6\xa5\x89\xb1\x5d" + "\xe3\xd9\x1e\x57\x4e\xdf\x5b\x9e\x5b\x97\xb6\x8a\xc2\x07\x8a\xf9" + "\x92\x90\x99\x7c\xe1\x68\x1d\x1c\x5b\xf9\xa2\x91\x81\x88\xd7\x7c" + "\xe1\x23\x13\xf9\x92\x11\x70\xfe\x31\x2d\x1c\x5b\xf9\xc2\x27\xbc" + "\xf9\x92\x91\x50\xfe\xb9\x11\x8e\x50\x1e\x54\x0b\xf5\x13\xf9\xc2" + "\xdb\xc7\xc1\xd1\xc8\x17\xfa\x6e\x81\x7a\x50\x1e\x1a\x0c\x47\x28" + "\xfb\xad\x80\x7a\x50\x56\x59\xcf\x10\x7e\x19\xfc\x0f\xe7\xc6\xee" + "\x64\xcf\x7a\xb2\x86\x3e\xab\x30\xaa\x91\x3d\xe3\x19\x23\x7b\xc6" + "\xb3\x1d\xec\x19\xcf\x59\xd8\x33\x02\x52\xa0\x5e\x32\x5f\x18\x18" + "\x0f\xc7\x36\xbe\x30\x28\x1a\xea\x41\x59\x1d\x0e\x47\x28\xdf\x05" + "\xcf\x1a\x09\xe5\x60\x1f\x38\x42\xf9\x1e\x33\xd4\x4b\xe1\x0b\xef" + "\x6b\x85\x63\x07\x5f\x18\x82\xed\x43\x79\x64\x35\x1c\xa1\x1c\xb6" + "\x03\xea\x41\xf9\xfe\x4d\x70\x84\xf2\x24\x78\xa7\x10\x1d\x5f\xf8" + "\x42\x15\x1c\x4d\x7c\x61\x2c\x3c\x6f\x04\x94\x5f\xd2\xc0\x11\xca" + "\x2f\xc3\xfd\x23\xa1\x3c\x79\x39\x1c\xa1\xfc\x1b\x7c\xd7\x34\xbe" + "\x30\x1e\x9f\x63\xe6\x0b\x5f\xc3\x77\x86\x72\xc2\x4c\x38\x42\x79" + "\x2a\xf6\x07\xca\xd3\xf0\x3e\x28\x4f\x87\x31\x08\xc9\xe0\x0b\x67" + "\x26\xc0\xd1\xc2\x17\xfe\x76\x34\xd4\x83\xf2\x2c\x2b\x1c\xa1\x9c" + "\x02\x63\x38\x12\xca\xf3\xca\xe0\x08\xe5\x54\x7c\xdf\x2c\xbe\x70" + "\x41\x14\x1c\xad\x7c\x61\x46\x20\xd4\x83\x72\x66\x1b\x1c\xa1\x9c" + "\x0d\xe3\x37\x12\xca\x79\x45\x70\x74\x49\x63\xbe\x70\x99\x0f\xbf" + "\x64\x20\xe1\x0b\x57\x25\xf3\x4b\x6e\x83\xe3\x6a\x35\xbf\x64\x80" + "\x96\x2f\x2c\xae\x81\xf3\x70\x5c\xe3\x0d\xe5\xd1\x42\x19\x8e\x6b" + "\x4c\x50\x0e\x17\xca\x70\x7c\xaf\x19\xca\x11\x42\x19\x8e\xa5\x58" + "\x8e\xe4\x0b\xd7\xc1\x71\x20\x1e\x13\xa0\x3c\x4e\x28\xc3\xf1\x83" + "\xcd\x70\x84\xbe\xad\x2d\x86\xf3\x51\x7c\xe1\xfb\x71\x50\x86\x63" + "\x69\x20\x94\xa3\xe1\x98\x01\xe5\x68\x53\x98\xbf\x0a\xd7\x73\x3e" + "\xa0\x4d\xc3\x05\x85\x19\x73\xaf\x10\x25\xc6\x19\xaa\xcc\x31\x62" + "\xac\x95\xfb\x5a\x14\x8a\xe9\x98\xcf\x02\xeb\xd8\xd6\x86\x24\x72" + "\x41\x21\x46\x38\x3f\x10\xea\xdd\x76\x46\xa1\x5c\x80\x18\x63\xc8" + "\x32\xd2\x3c\x7a\x42\x1c\xc9\x81\x70\xcf\x3b\x20\x1f\x45\x02\xa6" + "\x2b\x61\xbc\xca\xf8\xfc\x01\x97\x60\x9c\x82\xf9\xfc\xdb\x5b\xe0" + "\x08\x65\xff\xaf\x61\x9c\xa0\xfc\x1f\xef\xc2\x11\xca\xaf\x3f\xcd" + "\x97\x84\x06\x77\x16\x28\xda\x8c\x84\x33\x52\xcc\xd8\x16\x5c\xe4" + "\x67\xe5\xf9\x18\x40\x4f\xfe\xc3\x58\x95\x9f\x55\x4f\xf8\x92\x08" + "\x58\x13\xa2\x08\xff\x51\x80\x8a\x0f\xb8\x18\x4e\xfb\x9d\x0f\x7a" + "\xf4\xb5\x50\x25\x7b\xf6\xed\x7c\x8b\x42\x39\x1c\x73\x2f\xf0\x41" + "\x83\xdc\x5d\x7f\x82\x5e\x1f\x11\x5b\xc4\xae\xab\x88\x74\xfd\x37" + "\x78\x7d\xb2\x1f\xc6\x30\x1f\x45\x8a\x8c\x0a\x65\x16\xd6\x31\x2a" + "\x14\xa5\x7c\xbe\x17\x31\x98\xdb\x84\x77\xbc\x0d\xeb\x65\xe3\x7d" + "\xee\xec\x3b\x5c\xf1\x98\xe5\x2b\x01\xf3\x50\xdf\x85\xb5\x4f\xa9" + "\xc9\x09\xad\x6a\x51\x78\x4f\xdc\x80\xf2\x50\x60\x4c\x2c\xc5\x42" + "\x85\x97\xff\xb5\x35\x23\x27\x6a\x32\xfd\xa0\x3d\xef\x49\xb9\x16" + "\xde\xac\xcf\x79\x9a\x9c\x61\xe7\x97\xd3\xbd\x41\xec\xff\x34\xea" + "\xf3\xc9\xfe\x4f\xa4\xf6\x65\x68\x0b\xef\x75\xd4\x2f\x6c\x05\x7b" + "\x03\xb9\xa0\x98\x44\xfa\xcd\x5c\xe1\x35\xfc\x4b\xce\xa8\xf4\x4b" + "\x23\x03\x34\x99\xbb\xa1\x7d\xaf\x04\x99\x2e\x6a\xaf\x4b\xaf\x3d" + "\xb5\x0b\xea\x7e\x80\x76\xa3\x02\xaf\x14\x7b\xee\x61\x78\x87\xff" + "\xc4\x75\x4f\x49\xa2\x70\x2d\xa6\xb2\xad\xc2\xab\x03\x63\xca\x5a" + "\x03\x1f\xd3\x59\x8b\xda\x54\xb6\xe2\x98\x58\x7e\x6d\x4c\xe2\x50" + "\xab\x82\x50\xdf\x7c\x85\x77\xc8\x23\x16\x94\x25\x0f\x60\xdd\xa3" + "\xdc\xc0\xda\xa6\x87\x33\x88\x52\x9f\x7a\x0c\xca\xde\x77\xf2\x05" + "\xdf\x36\x1b\x3a\x9a\x88\x3e\x15\xdb\xf2\x56\xf3\x05\xe7\x1b\xb8" + "\x81\x2d\x96\x72\x94\xc9\x33\xd0\xa6\xf6\x35\xde\xb7\x01\xc6\xd9" + "\x1b\xfa\x62\xb1\xe7\xc5\x86\xb1\x5c\x09\x63\x87\xf2\x32\xc6\xb9" + "\x98\x66\xb3\x61\x7c\xb6\xe5\x46\x18\x07\xba\xbe\x2a\xbc\x68\x7e" + "\x77\xf6\x5c\xef\x47\xb9\x80\x91\x91\xf5\x09\xf8\x7d\x50\x85\xf1" + "\xae\xcc\x74\x6f\xbc\x15\x73\x05\xc2\x3a\x23\xd4\x75\xa4\xdd\x2c" + "\x21\x26\xc0\xac\xb9\x69\xa9\x6f\x69\xe6\xcf\xca\x4c\x7a\x32\x6c" + "\xc1\x68\x4d\x6a\x86\x26\x95\xe6\x78\xa7\x27\x60\x59\x9e\x9f\x32" + "\x2f\x4d\x83\xb9\xb6\x7b\xe6\xfa\x55\xf3\xaa\x91\x2a\x2a\x4b\x2a" + "\x06\x6b\xa8\x3e\x51\x11\xeb\x93\x96\xc5\x73\x9a\x11\xb7\xf1\xe7" + "\x15\xde\x1d\x5d\x03\xbd\xe3\x71\xad\xe5\xf2\x35\x44\x88\x2b\xec" + "\xbb\x2e\x80\xe0\xfe\x3d\x9f\xce\x02\x6f\x7b\xfc\x17\xa3\x62\x30" + "\xb3\x93\x14\x78\x5b\x80\x07\xcb\x84\xef\x64\x2c\x86\x9e\x70\x8d" + "\x7e\x47\x2e\x18\xa0\x36\x92\x64\x16\x17\xb2\x22\x26\x99\xae\xc1" + "\x8a\x01\x2c\xdf\x99\x26\xd6\x87\xdf\x14\xa0\x02\x39\x4e\x41\xbf" + "\xd9\x59\xef\xe3\x0d\xe4\x12\x8b\x69\x5b\xf2\x78\x1e\xc6\xe7\xb0" + "\xad\x0d\x23\x5c\xd0\xe3\x79\xdc\xc7\x01\x0d\xb9\x1f\x12\xe5\x76" + "\x98\xf3\xde\x1a\xe0\xef\x11\xe4\xbe\xdd\x39\x6d\xca\xf3\x8a\x01" + "\xaf\xee\xce\x69\x52\xf2\xc5\x61\x4d\x97\x43\x87\x99\x2c\x42\x4e" + "\x68\x83\xd5\x42\xfe\x11\x4d\x50\x67\xab\x32\x0f\x1f\xa7\x36\x0f" + "\x0f\x6d\xb3\x94\x44\xe7\xe9\x47\x3c\x46\xc6\x3f\xc0\x5f\xf8\x7b" + "\x35\x21\x1d\x8a\xc1\x81\x7f\x8f\x46\x3d\x62\xa4\x8f\x45\x35\xd2" + "\xd7\xbc\xf6\x71\x1a\xbb\xaf\x6b\x6d\x74\x43\x77\xd0\xfd\x89\x7b" + "\xa1\xce\x01\xd0\x73\x0e\xc2\x48\x61\xbc\xd5\xae\x51\xfe\x89\xdb" + "\xbb\x8b\x94\x35\xd5\xe3\x98\x8d\x37\x11\xe6\x0c\xe5\xa7\x01\xb6" + "\xbf\xef\xa8\x26\xf0\x6c\xb2\xbd\x7b\x82\xf2\x1f\x91\xce\xd7\x07" + "\xde\xf3\xf7\xf0\x6a\xd2\x89\x71\x8a\x41\x8f\xdc\x75\xac\x94\xf0" + "\x6b\xc7\x46\x6d\xcd\xb4\x28\x13\x8c\x44\x59\xd7\x54\x4a\xb2\x4e" + "\x93\x21\xd6\x0b\x5a\xef\x3f\xc1\xfd\x5d\x18\x57\xf4\xa0\x9a\xc6" + "\x17\xcc\xd1\xd3\x7c\xaf\x7e\xf5\x20\x2f\x70\x17\xb4\x03\xeb\xe3" + "\xf4\x04\xae\x9f\xb1\xfe\x1f\x35\xa9\x4b\x36\x11\x43\x7c\x05\xe9" + "\x52\x46\x91\x2f\x5e\xab\x20\x1f\x80\x4e\xf2\xc1\x79\xe2\x4b\x65" + "\xdf\x6b\xda\x81\xd6\x6b\x5a\x6f\xeb\x62\x2d\xc6\x7b\xe2\xf9\x0b" + "\xda\xc1\x28\x0b\x5b\xe7\x69\x7d\xea\x4d\x15\xe4\x91\x36\xa2\xed" + "\x52\x12\xbf\xae\xc5\xda\xc1\xf5\xba\x52\x68\x0b\x84\x5b\x18\x57" + "\x8c\x35\x87\x31\xe8\x70\x9c\x6e\x8f\x27\x71\x1d\x8a\x01\x87\x07" + "\x37\x92\xe1\x18\xeb\x14\xe5\x4b\x8c\x8b\xcc\x05\x8e\x8d\xb2\x05" + "\x3e\x8e\x39\xa3\xfc\x68\x3c\xa6\x6d\xc1\x3a\x94\xcf\x41\xf6\x50" + "\xe0\x3b\x73\xbc\x76\xf0\x34\x3c\xae\xb9\xfb\x0c\xca\xe8\x5c\xa7" + "\x1a\x73\x29\xf9\x60\x3f\x31\xaf\x71\xf6\x29\x18\xcb\x5c\xad\x37" + "\xd4\xf3\x85\xf3\x43\x0d\x1d\x16\x62\x7b\x28\x38\xef\x61\x1d\xcd" + "\x57\x1b\x58\x9e\x43\x54\x45\x39\x24\x50\xf3\x1f\x38\x76\x83\xae" + "\xd8\xb6\x06\xeb\xf8\x82\xa0\x6a\xb4\xbd\xb0\x73\x3e\x87\x35\xcf" + "\x12\xa2\x79\x8c\xfe\x9f\xad\x19\x0b\x34\x0c\x1c\x53\x41\xf5\x07" + "\xd4\x4f\x15\x3e\x6f\x31\x1e\xf7\x99\xd5\x35\x70\xba\x0f\x57\x50" + "\x1c\xca\x2d\xf1\x0e\xc6\x5c\xd6\xe7\x15\x3e\x93\xf8\xc2\x8f\xd5" + "\x7c\x71\x34\xe5\x45\x28\x3f\xd7\x35\x10\x64\x85\xc2\x8f\xb3\xa0" + "\xfd\x71\x5d\x0a\xef\x46\xf8\x35\x09\xf7\x47\xe1\x7b\xdb\x36\xf9" + "\xb7\xe1\x7b\xd3\xfc\x3b\xf0\x5e\xd3\x80\x66\x7c\xd0\x98\x58\x1a" + "\x93\xfe\x1a\x8c\xaf\x90\x9f\x14\xc7\x03\xc7\x80\xbb\xa6\x1d\x4c" + "\xdf\xf5\x9a\xd6\x17\xc6\x17\xe3\x1a\xfb\xe5\x4c\x87\x7b\xd6\x8e" + "\x99\x09\xd7\x86\x76\x05\x8e\x29\xc5\x3c\x58\x06\x9d\x89\xd8\x4a" + "\xc6\x24\x62\xdc\xbe\x75\x99\x30\xe7\x86\x8f\x89\xe5\x4b\xc6\xa4" + "\x08\x73\x8b\x60\x3f\xb9\xc2\x8f\x6b\xba\x70\x1f\x1d\xf4\x0d\xfa" + "\xd7\x08\xbf\x26\xa3\xe2\xb6\xea\xae\x30\x7f\x98\x77\xb7\x95\x42" + "\x5f\x83\xf9\x82\x87\xcd\xf8\x3f\x5c\x0b\x86\x3e\x6f\xc5\x71\xc0" + "\xf1\x10\xc6\xe2\x23\x69\x2c\x5e\x0f\x87\x7a\xc5\x5c\x41\x61\x8d" + "\x51\xe1\x93\xc6\x17\x3c\xb0\xc3\xa1\x5e\x9d\x54\xef\xcd\x46\x56" + "\x6f\x5d\x06\xab\x17\x31\x1a\xe8\x30\x8b\x8d\xf7\x20\xff\x9e\xe3" + "\x3d\x68\x90\x74\x6f\x4c\x16\xbb\x77\x99\x0f\xbb\xf7\x3e\xbc\xf7" + "\x29\x79\x9f\x06\x8d\x91\xea\x3f\x57\xc9\xea\xe7\x54\xb1\xfa\x77" + "\x5a\x1c\xea\x4d\x97\xea\x4d\x1e\xc7\xea\xbd\x13\xcb\xea\x85\xc6" + "\xc3\xf5\x0d\x2e\xfa\x52\x22\xdd\x93\xaa\x67\xf7\x6c\x4a\x61\xf7" + "\xfc\xb2\x0d\xae\xd7\x39\xf5\x65\x9f\x54\x3f\x45\x78\xef\x72\x2b" + "\xab\x3f\xa6\xd8\xa1\xde\x39\x56\x0f\xaf\x7f\x02\xf5\x7c\x92\xbb" + "\x06\x66\x6c\x62\xf5\xa2\x23\x90\x1f\x01\xf7\x86\x70\x05\xea\xb8" + "\xae\x81\xc3\xa3\xa0\x9d\x04\xa0\x8d\x1a\x8f\x40\x3b\x35\x57\x34" + "\x12\xc6\x63\x20\xc6\x52\x31\x21\xe6\xc2\x9a\xb0\x03\x70\xd7\xe6" + "\xd2\xce\x55\x30\x78\xa2\xdd\xce\xc6\x81\x6c\x50\x12\xe2\x32\x9e" + "\x25\xcd\x7f\x8c\xf2\xc1\xda\x90\xbc\x22\x8e\xe5\x51\x07\x1e\x05" + "\xd9\x66\xf0\x02\x58\x0b\xf3\x68\xfc\xe2\xe2\x08\xc2\x85\x02\xc6" + "\x9e\x23\x5e\x86\xac\x36\x52\xc9\xb5\x29\x8b\xba\x89\x77\x3d\xac" + "\x33\x58\xbf\x12\xd6\x54\xcd\x5c\x2f\x58\x5f\x07\xaf\x2c\xba\x2a" + "\xb4\x57\x11\xab\xca\x9d\xc3\x72\x47\xa3\x5c\x85\xd8\x0c\xf3\xd1" + "\x97\xe6\x34\x9b\x8b\x72\xc5\xe0\x3d\xf0\xbf\x0f\xd6\xed\x1a\xa5" + "\x2a\xea\xfa\x43\xac\xaa\x3b\x68\x54\x62\xf7\xc7\xc3\x74\xd7\x82" + "\x22\xc8\xb5\xb5\x8f\xe5\x59\xff\x10\x93\x67\x1d\x15\xa0\xb2\x05" + "\x8d\x32\xc2\xb3\x01\xb7\x4b\x95\xdb\xb8\x4a\xe5\xb6\x1c\xbd\x12" + "\xdb\xdd\x9d\x53\xa1\xdc\x95\xd3\xa0\xdc\xc5\x55\x29\x77\xe7\x14" + "\xc1\x71\x33\xe6\xb7\x02\x59\xee\x76\xff\x5d\x39\x35\xb0\x6e\xdc" + "\x0e\x74\x1e\x1c\x29\xda\x29\xf9\xa7\xad\xa4\x7e\xb3\x95\xec\x4b" + "\xbb\x42\x4c\xfe\x23\x55\xf0\x0b\x34\x0d\x1f\xb3\xdc\x34\x3c\x9a" + "\xbe\x27\x1f\xf4\x0b\xfa\x8e\xb8\x0f\x75\x17\xc7\xfa\x2c\x8c\x07" + "\xb6\xb9\xa8\x9c\x43\x1f\x11\x21\xb6\xb3\xc2\x37\xa2\x47\x6c\x67" + "\x25\xcb\xad\x66\x8f\xef\xfc\x63\xc4\x76\x16\x6c\x04\x34\xb6\x33" + "\xe8\x7b\x54\xef\x83\xf5\x8b\xe6\x63\xb4\x82\x7c\x56\xf2\xa8\x11" + "\xf5\x3b\x94\xc7\x3a\x0b\x7c\x13\x45\xfd\x0c\x65\x0c\xdb\xea\x91" + "\x1a\xf8\x81\x3c\xea\x0b\x73\x74\x7b\x83\x78\x9e\x5f\x73\x56\x83" + "\xf6\x72\x1b\x9f\xfc\xcb\x4e\xdc\x5b\xc9\x27\xff\xca\x56\x12\x6a" + "\xb2\x95\x44\x27\xc2\xb9\x71\xf0\x7b\xd2\xb6\xfa\x6c\x28\xfc\xb4" + "\xf0\x1b\x0d\xbf\x70\xf8\x45\xc0\x2f\x12\x7e\x51\xf0\x8b\x86\xdf" + "\x04\xf8\x4d\x84\x5f\x2c\xfc\xe2\x78\xff\xb3\xe3\x30\x36\x25\xb4" + "\x9d\x08\x74\x57\x8b\xed\x4a\xe3\xeb\x7b\x1c\xde\x37\x0a\xe5\x1f" + "\xc0\xab\x08\x9e\xe1\x95\x9a\xff\xc8\x5f\x8d\xb8\xcb\x87\x0d\x33" + "\x99\x42\x62\x89\x29\x24\x26\xd9\xe4\xff\x4a\x0d\xfc\x1a\xe0\xd7" + "\x64\x2a\x19\x53\x01\xf4\x4b\x36\x0d\x1f\x1b\xde\x59\x30\x04\xe6" + "\x4c\x20\xb5\x45\xc0\xff\x13\xe1\xff\x71\xc2\xff\xf1\x46\x85\x8a" + "\xca\x0f\x50\x0f\x64\xbf\x21\xc9\x46\x45\x00\xad\x77\x39\x68\x4c" + "\xa5\xb0\x27\x33\x0f\xce\x83\xfe\x3f\x58\xc5\xea\x3d\xa6\x73\x9c" + "\x2f\x73\xde\xd0\x4d\x9b\x33\x3d\x63\xda\xfc\x94\x59\x6f\x24\xcd" + "\x1f\xab\x09\x9b\xa9\xd1\xce\x4a\x7d\x6b\xda\x5b\x0b\x92\x16\x24" + "\x51\xb1\x09\x4e\x3d\x20\xf7\x37\xb3\x62\x8e\x00\x90\xef\x87\xb6" + "\xf2\x3c\xae\x57\x13\xcd\xc0\x63\x23\x62\x55\x3b\xcf\x9b\x94\x36" + "\x90\x5b\x7c\x5b\xf3\x60\xde\x45\x90\x9d\xe7\x2d\x4a\xdf\x56\x0d" + "\xe1\x81\xd7\xf1\x9a\xa1\xb5\x41\x90\x63\xbe\x26\xb5\x28\xc7\x40" + "\x9d\x6d\x73\x2d\xca\x17\xf0\xfe\x8f\x03\x54\xdb\xe1\x7f\x7e\xed" + "\xe3\x79\x78\x1f\x0f\xb2\x0d\x3d\x82\x6c\xc3\xca\xa3\x12\x77\xd1" + "\xe3\x63\x79\xbb\x68\xbd\x51\xc6\xdd\x78\xbc\x9a\xcd\xd7\x42\xbb" + "\x68\x1b\xe3\x3f\x56\x15\xd1\x3a\x30\xd7\x68\x1d\x98\x67\x2d\x0a" + "\xbf\x40\xac\x47\x75\x05\xe8\xe3\x76\xe8\x47\xee\x02\xe2\x2d\xce" + "\x5d\xd4\x07\xec\xf3\x37\x1d\xe5\xbc\xa1\xd9\x38\x7f\xb1\x3f\x3c" + "\xcc\xd7\xad\x70\xef\xb6\xb9\x4c\x7f\x02\x9d\xc9\x0b\x75\x25\xc4" + "\x08\xc4\x06\x43\x56\x03\xbd\xbf\x92\x6b\x00\x5d\xcb\x0b\xef\xfd" + "\x12\xaf\x95\x81\x6c\x56\x46\x65\xf1\xa1\x76\xf9\x77\x45\x10\x8b" + "\xcd\xe6\x9b\x08\x7c\x31\x83\xdc\x77\x5e\x31\xe4\x10\x8e\x1f\x8e" + "\x17\x7e\x2b\xe5\x0b\x86\x14\x61\x5c\x84\x0d\x01\xc4\xc7\x3a\x3c" + "\x26\x9e\xda\x56\x0a\xfc\x22\x45\x99\xd2\x1c\x18\x23\x8b\xab\xca" + "\xe8\xa5\x49\x9a\x3b\x7d\x46\x4a\xd2\x4c\xfa\x79\x6d\xfa\xfc\xf9" + "\x0b\xe6\x24\x69\x92\xa6\xbf\x91\xac\xa1\x97\x35\x0b\xe6\x43\x95" + "\x59\x69\xf3\x35\xf3\x16\xce\xd5\xcc\x99\x3f\x0b\xa5\xe3\xa4\xd4" + "\xd4\x05\xba\xb4\xc1\x84\xdd\xa9\x99\xb3\x20\x25\x6d\x96\x0e\xfe" + "\x99\x9f\x34\x77\xa6\x86\x52\x7d\x3e\x34\x95\x92\xa2\x11\x9e\x30" + "\x3f\x79\x7a\x2a\x32\xc2\xdc\xdf\x42\x25\x87\xfb\xe5\xb2\xb3\x2f" + "\xc6\xbe\x43\x9f\xab\xf3\x0a\xd5\xba\x6a\x6f\x18\xeb\xe2\x98\x78" + "\xf4\x55\x80\x72\x29\xd5\xa7\x0a\xfc\x26\xa0\x4d\xf9\x3d\x78\xc7" + "\xcb\xc0\xf3\x9d\x05\xaa\x40\xf1\xdd\xa8\x8d\x19\xe3\x6e\x62\x4c" + "\x57\x85\xea\x6d\xba\x37\x18\xf8\x9f\xfa\xb2\x14\xf8\xbd\xce\xc6" + "\x42\x15\xed\x68\xc3\xa2\x36\x53\x85\x6a\x0a\xfa\xcc\xc1\x1c\x28" + "\x45\x99\x40\xc8\x93\xa0\x80\x7b\xde\xc1\x7b\xb8\x92\xe8\x64\xb8" + "\x2f\x4b\x92\xcb\x55\x71\x58\x9f\xd6\x2b\xf0\xfb\x98\x1f\x3e\xa6" + "\x02\xce\x45\x62\xbf\xdc\xac\x21\x9a\xab\xd0\xee\xc1\x4a\x42\x7e" + "\x16\x48\xb4\x57\xd7\x8c\x9a\xd0\x19\x30\x52\xdb\x9d\x4f\x6e\xeb" + "\x86\x79\x6c\x51\x92\xfb\xba\x80\x2f\x16\x3d\x4a\xbc\xb2\x27\x11" + "\x65\xe5\xec\x4a\x8c\x1b\x4c\x6a\x27\x94\x12\x03\x20\x92\xc1\xb2" + "\x85\xd4\xea\x5b\x48\x9d\xf5\x53\x96\x7b\x23\x13\xe5\x6a\x7f\x1b" + "\xc6\xaf\xcb\xcd\xe6\x6d\xdb\xff\x6a\x1a\xb0\xad\xbd\x12\x73\x66" + "\xdc\x67\xb0\x9e\xd4\x1b\xb2\x36\x11\x43\x86\x41\x8f\xb1\x43\x60" + "\xdc\xce\xee\x82\x6b\x83\x6a\xe1\xbe\x17\xc8\x6d\x50\x3e\x8e\xcf" + "\x58\xbe\x96\x6f\x7a\x27\x88\x6f\x7e\x67\x2d\x6f\x04\x9e\x6a\x05" + "\x9e\x6a\x5b\x19\xc4\x77\xa0\x2f\x00\xfa\x3c\x20\x9f\xea\xd2\x89" + "\xba\x5d\xe1\x9f\x46\x75\xfb\x68\x5a\xbe\x13\xca\x74\xcf\xbc\x21" + "\x63\x2d\x96\xef\x82\x72\x31\x2b\x97\x63\xf9\x6e\x28\x6f\x62\xe5" + "\xbf\x63\x39\x18\xca\x3b\x58\xb9\x9e\xd0\x18\x18\x0a\xff\x6a\x56" + "\x3e\x82\x65\x18\x7b\xff\x46\x7d\x3a\xf6\xf7\x04\xd0\xcc\xff\x54" + "\xee\x71\xd0\xcf\x32\xce\xd0\xf9\xb0\x3b\x27\x19\x6d\x0f\x30\x1f" + "\xfc\x93\x6e\x6f\x46\xdd\x2e\xc0\x7b\x60\x38\x1e\xfd\x7d\xfc\x2c" + "\xe4\x36\x90\x95\x6e\x87\xf7\x39\x8c\x63\xe7\xd2\xd6\xb2\x2d\xf0" + "\x57\x31\x56\x5e\xcf\x7f\x14\x00\x7c\x10\x91\xc7\x7f\x34\x2c\x96" + "\xa7\xeb\x58\x48\x54\x65\xa6\x85\xc6\x6e\x06\xf9\x14\xe6\x50\x00" + "\x8d\x23\x6f\x02\x79\xcf\x4d\x2c\x57\x15\x5f\x12\x96\xc7\x6f\xf2" + "\xb7\x4c\xd2\x5a\xd1\xb7\x19\x64\xdc\x80\xc3\xfb\x92\x51\x2e\x18" + "\x7b\x99\xdb\x34\x2c\x96\xcb\x8d\x27\x7c\x68\x80\xcf\xa4\x64\x5e" + "\x0f\x6b\x94\x82\xd9\xaa\xf9\x93\xf0\xfc\x93\xf4\xb9\x61\x01\x3e" + "\xdc\xc2\x64\xcc\xa9\x44\xf1\x25\x07\xd7\xeb\x74\xc0\x93\xc5\xf1" + "\x7e\xb6\x92\xb1\xa6\x7d\xc9\xa7\x3d\xcb\xcf\xa3\x08\x70\x1f\x57" + "\x1c\xfa\x84\xb1\x4c\xad\xf0\x1c\x2b\xbc\x2b\xca\x06\xdb\xb8\x1a" + "\x25\xc8\x28\x3e\x5b\x67\x34\x0d\xe0\x17\xc6\xfb\xc1\x3b\x3d\x6a" + "\xd0\x5e\x21\xf5\xdd\x38\x57\x86\x15\xef\xcb\x20\x64\x7c\x86\x55" + "\xef\x67\xa2\x31\xa7\x55\xba\xd9\xe4\x5e\x7e\x78\x58\x5e\xbb\x62" + "\x58\xeb\x0b\x59\xf0\x0e\xf0\xee\xbb\x5a\x9a\xbc\x39\x78\x8f\x47" + "\xd8\xb8\xe1\x7d\x35\xb0\xfe\x58\x44\xb9\xde\xb3\xfe\x0f\xa3\x7c" + "\xc3\xcd\x8f\x27\xb8\x67\x79\x3b\xc8\x23\xdc\xb5\x78\x3f\x0e\xd6" + "\x1f\xbc\xb6\x4f\x7b\x8e\xe0\x33\xd9\x58\x0f\x63\xb1\x77\x42\x61" + "\x9c\xe1\xf9\x18\xeb\x5a\x1c\x57\xa8\x5b\x63\xbb\x96\xec\x9a\xfe" + "\x6b\xc7\x02\xed\xfd\x4d\xfc\xea\xb3\x2a\x97\xd7\xd7\xb4\x5d\x60" + "\xfc\xe1\xaf\x85\x5f\x24\xff\x61\x8c\x0e\x78\x60\x02\xcd\x79\xb9" + "\xf6\x51\x93\x68\x23\x81\xf9\x06\x3c\x12\x98\x54\x09\xba\xb0\xeb" + "\xb8\x83\xd9\x91\x34\xd7\xd8\x80\x93\xbc\x9f\x0d\x73\xe8\x5e\xc1" + "\xb8\xe9\x91\xfb\xb4\x66\x0f\x69\x1a\xe8\x36\xc7\x1d\xb6\x0f\x3a" + "\xf5\x35\x0f\xdb\xb3\xb8\xe5\x91\x4d\x30\x2e\xaa\xb3\xaa\x6e\x3e" + "\x5a\xc1\x64\xef\xa0\x0d\x38\x56\x56\x58\x47\x32\x0f\x13\xa5\x05" + "\xd6\xcb\x4f\x5f\x59\xae\x1c\x0d\xeb\x8c\x0d\xd6\xfe\xfd\x0d\xd5" + "\x24\x66\x22\xc9\xad\x4b\xbe\x44\xc4\x1c\x62\x7c\xd0\xe3\x79\x9f" + "\xbc\x62\x52\xe2\x37\x23\xcc\x19\x46\xf5\xd4\xb5\x91\xfa\x3f\x1d" + "\xb1\xa0\xee\x56\xb9\xf5\x88\x49\x69\xbd\x1c\xaf\xa1\x71\xdb\x41" + "\x27\xcf\x4d\xe6\x39\xfb\x77\x24\xcc\xed\x51\x74\x77\x07\xe6\x64" + "\x3e\x18\xdb\x40\xf7\xf8\x1f\x8c\xaf\x26\x07\x9b\x4b\x49\x6d\xeb" + "\x71\xdc\xfb\xfc\xe1\xc1\xf8\x22\x94\x17\x87\x5a\x41\x26\xfc\x00" + "\x64\x42\x98\xaf\x83\x38\x55\x76\xa4\xf8\x2d\x09\x73\x8c\x89\xf2" + "\xa0\x15\xe6\x68\x99\x90\x47\xcc\x5a\x10\xb8\xa2\x4c\xf8\xae\x84" + "\xf9\xc5\xd6\xa7\x93\xd0\xf5\x4a\x2e\xde\xd5\x37\xa4\xa1\x6f\x51" + "\xff\x68\x35\xe7\x9f\x1d\x29\xe6\x19\x7b\xe1\x2d\x0d\xf9\x1b\xbc" + "\xfb\x3e\xad\xa7\x73\x32\x88\xfa\xbf\x58\x81\xef\xac\xc0\x73\x56" + "\x18\x4f\xa3\x62\x78\x3c\xd0\xcd\xa5\x0e\x22\xd2\xe0\x5a\xae\x48" + "\x03\xf5\x43\x94\x06\xa0\xbb\x2c\x7e\x55\xa0\xc1\x31\xa0\x41\x2b" + "\xd0\x20\x9f\xe4\x1d\x88\xab\x25\x31\xb1\x40\x83\x8e\x4b\x18\xf3" + "\x9f\xe5\x71\x4b\x63\x63\x4f\x69\x71\xcc\xa4\xac\x37\x33\x1a\x6c" + "\x79\x8d\xd1\x60\xdb\x6b\x26\x90\x63\xfc\x13\x3f\x81\xb2\x6d\x61" + "\xbc\x06\xf3\x2e\xf1\xf9\x89\x98\x73\x9a\xd1\xe2\x1a\xd0\xe2\x1a" + "\xa3\x45\xce\x5b\x40\x8b\xc6\x26\x1a\x87\xea\x60\x73\x2d\xa9\x4d" + "\xac\x20\x75\x80\x4b\x40\x8b\xe9\x48\x17\xd4\xab\x6d\x8b\xb5\x01" + "\xa0\x47\x07\x96\x65\x12\xb5\x48\x0f\xd0\xdb\x07\xaf\xcc\x24\xe8" + "\xd3\x1b\x0e\x73\x53\xa4\x47\x20\xa5\xc7\x39\x81\x1e\xdd\xe8\x17" + "\x07\xf4\xe8\x06\x7a\x74\x03\x3d\xf2\x19\x3d\x10\xe7\x5f\x30\xfb" + "\xf1\xdc\xbf\xb4\x18\xa7\xa2\x27\x3d\x16\x0b\xf4\x38\x76\x3d\xf4" + "\xb8\xc3\xd2\x93\x1e\x41\xcd\x7d\xd1\x43\x9a\x13\x77\x1e\x42\x7a" + "\x5c\xab\x10\xe6\xc4\x28\x9c\x13\x79\xca\x9f\xc1\x5a\x84\x63\xba" + "\xbf\x61\x27\x9d\x13\xf0\xae\x30\x0f\x2c\xca\xda\x56\xa0\xcb\x4c" + "\x21\xb7\x98\x40\x17\x46\x8f\xc7\xf3\x36\x1f\x61\xe3\xaf\x79\x1e" + "\xd7\x0c\x9c\x1b\x48\x1f\xa0\x13\xcc\x1f\x57\x39\xf8\x1c\xbf\xb7" + "\x42\x9b\x1c\xce\x13\x9c\x23\x38\x1f\xea\x92\x8f\xd3\x9c\xe6\x07" + "\x63\x6b\x08\x7e\x77\x3d\x18\xbf\x13\x68\x55\x4a\x6c\x0b\x81\x36" + "\xe9\xb8\x8f\x83\x84\x60\x2e\xbe\x83\xf1\xcb\x51\x5e\x50\x01\xcf" + "\x0f\xb2\x01\x9d\x6c\x9d\xea\xc1\x2b\x40\x87\xc2\xef\xb1\x8e\xdf" + "\x61\x31\xef\x30\x3f\x30\x70\x05\x9c\xf7\xb6\x02\x8d\x60\xee\xc8" + "\xe6\x8c\x3d\x1f\xf1\x77\x5a\xb2\xa1\x85\xf8\x0c\x99\xc5\x68\x64" + "\x73\x98\x33\x93\x66\xe1\x9c\xc9\x03\x1a\x1d\xf6\x90\x46\x77\xd2" + "\x18\x37\x7c\x10\x60\xb5\xff\x59\x15\x1f\x86\x34\x52\xa7\xb8\xa3" + "\x91\x6d\x93\xbf\xd6\xa6\x1a\xe9\x8b\xb9\x07\xb8\x79\x71\x0a\x0e" + "\xf4\xa5\x6e\xd0\x4b\x0f\x9a\xac\x24\x6b\x0a\x51\x66\x1e\x27\x03" + "\x0d\x71\x5f\x13\x83\xb1\x8a\xc6\x0d\x47\x7b\x2f\xe6\xf3\x30\x58" + "\xab\x00\xaf\xa2\x8d\x58\xde\x40\xcb\x26\xb2\x78\x0a\xf1\xa2\x39" + "\x3a\xe3\x2b\xc8\x0a\xe0\xcf\xad\xaf\x55\x28\xb9\xe2\xb0\x26\x5e" + "\x85\x79\x88\x88\xbe\x5e\x67\xc5\x78\x6c\xbe\x75\xc9\xb5\x18\xc3" + "\xf2\x64\x6e\x06\x7f\xaa\xde\x0c\x6d\x9a\xf8\x6e\x1b\xac\x19\xe5" + "\xf9\x7c\x15\xe6\x66\x78\x04\xd7\x08\x8c\x31\xa7\xb8\x6b\x2b\xca" + "\x22\x68\xf7\xd2\xe7\xac\x07\xd9\xeb\xae\xcf\xf0\xdd\xe0\x9c\xa2" + "\x6e\xb6\x19\xae\xdf\x1b\x82\xfd\x62\x36\x68\x76\x7c\x04\x63\x7f" + "\x07\x8d\x1f\xf9\x65\x8e\xc9\xbb\x08\xf4\x5d\x90\xd1\xb0\x1d\x1b" + "\xcf\x74\xc1\x78\x43\xa3\x85\xda\x1f\x4d\xb9\xc9\x03\x8b\x32\xd1" + "\xf7\x0a\xf3\x3c\xe0\x9a\x7d\xcf\x21\xf4\xd7\x00\x9e\x9d\xc0\x07" + "\x3d\x6a\xaa\x9c\x61\x52\x4a\xeb\xf2\xdd\xb8\x9e\x4d\x18\xaf\xe5" + "\x73\x31\x1f\xc6\x2e\x78\x2f\xd4\x83\x3e\x6d\xb1\x50\x4c\xf9\xd3" + "\x8c\xe5\x4a\xb4\x8f\x58\x00\x1f\x6a\x8f\xfc\x99\xe6\x4d\x3d\xa3" + "\x08\x1e\x73\x20\xde\x4a\xf0\xf9\x93\x1f\xc0\x6f\x0c\x77\xa7\x74" + "\x29\x37\x6e\xee\x1a\x18\xd8\x96\xdb\x2a\xe5\x8c\x74\xcc\x0d\x89" + "\x38\xb3\x75\x06\xb4\x89\x38\xd3\x92\xa7\x64\xd8\x12\x85\x36\x3a" + "\x1f\x67\x6c\xa9\xeb\x38\x47\x72\x80\x8f\xeb\x92\x2b\x68\xce\x92" + "\xa1\x80\xef\xdc\x62\xc0\x93\x6b\xa0\xef\x03\x9e\x20\x0e\x94\x03" + "\x7e\x70\x8b\x41\xcf\xef\x06\x3d\x5f\xc0\x11\x94\xbd\xf0\x38\x05" + "\x78\xd4\xaf\x06\xce\x01\x9d\x38\xc0\x75\xc0\x13\xed\x07\x99\x24" + "\xf4\x03\xe0\xd1\x0d\x88\x23\x20\x17\xbf\xa0\x03\x1c\x59\x08\x38" + "\x92\x4e\x73\xf7\xaa\xcb\x95\x0c\x3f\xfe\xda\xb2\x5c\x59\x24\xe6" + "\xee\xa6\xe3\x1b\x5c\x57\x8f\xfc\x91\x98\x87\x7d\x55\xda\x70\x7d" + "\x5a\x1c\xef\x55\x6f\x06\x1e\x59\x1b\xdd\x80\xe7\xe8\xbc\x5d\x98" + "\x3c\x98\x63\xbc\x16\x85\x63\xb2\xf1\x3c\x09\xa7\xf9\x2d\x2f\xa8" + "\x07\xaf\x9a\x4b\x46\x97\x9f\x27\xa1\xe5\x73\x89\x16\xe6\xab\xb2" + "\x1c\xfa\x30\xf5\x2d\x15\xa1\xb9\x41\x06\x06\x9a\xe0\xbc\xcb\xdc" + "\x20\x20\x57\xab\xcb\x71\xce\xcc\xd3\xda\xfb\x64\x2d\x8a\x6f\xb0" + "\xc1\xd8\xd1\xf8\x6e\x8a\x7b\xc2\x98\x3f\xf5\xd0\x44\x26\xe7\xdf" + "\x23\xc4\x19\x1a\x36\x13\x74\x95\xdb\xda\x15\xf7\x0c\xe1\xd7\xdc" + "\x1d\xaf\xcb\x24\x8a\x76\xf1\x1a\xc8\x9e\x1c\xd0\xea\xe1\x3c\x92" + "\xc7\xf9\x2f\xd5\x1a\x32\xce\x61\xac\x7d\x0f\xe7\xe1\x3d\x74\x5f" + "\x9a\xad\x28\xbe\x91\xfa\x01\xad\x89\x6f\xde\xd8\x4e\xc2\xf9\xdf" + "\x01\x3d\x66\xc3\xbb\xb6\x93\xd0\xb2\x76\x78\xd7\x85\xec\x5d\xc5" + "\x5c\xe5\x5c\xfe\xc6\x4a\xb8\xd6\x6b\x5e\x2d\xd3\xef\x30\xaf\xd6" + "\xed\xe1\x80\x61\xc3\xf8\x11\xe8\x63\x4c\xe3\xef\x74\x1a\xac\xc7" + "\x09\x3e\x17\x6d\x43\x86\x4b\xc8\xd3\xf7\x2a\x90\x97\xb9\x8a\x18" + "\xdd\xb4\x66\xe0\xed\xce\x64\xc2\xc3\xff\xbb\x5a\x4c\x18\xef\x86" + "\xca\x7c\x46\xc5\xdd\xe1\x28\xa7\xed\x86\x73\xc8\xfb\x0e\x3c\x1f" + "\x8e\x3c\x8f\xd7\x29\xdf\xc3\x7d\x86\xe6\xd3\x04\xdb\x73\x6c\x07" + "\xe9\x2f\xb6\x05\xcf\x3b\x8d\x6d\x21\x2f\xa0\x4d\x07\xe7\x1a\xa3" + "\x7d\x15\xfa\x93\xab\xf9\xa0\xfb\x13\x59\xd9\x84\x39\x63\x54\xc8" + "\x03\x94\x57\x00\xbf\x31\xbe\x32\xcf\xc7\x7b\x01\x9f\x61\x3f\x07" + "\x03\xbd\xc3\x45\xbe\x80\x73\x81\xce\xbc\x31\x74\x89\x0a\x75\x9a" + "\x40\xfc\xbf\xbf\xfc\xe1\x19\xfd\xee\x6d\x75\xeb\xeb\x16\x0a\xf2" + "\x2d\xe0\x25\xe2\xa6\xed\xb2\x03\x66\x76\x30\xcc\x44\x4c\x12\x71" + "\x93\x62\x13\xcd\x97\x50\x85\xbe\xa8\xc9\xb4\x8f\x1e\xe2\x66\x5d" + "\x87\x84\x9b\x2f\xe8\x1c\x70\xb3\x83\xef\xe6\xc2\x5c\xe1\xe6\x7d" + "\xa7\xe5\xb8\x79\xdf\x59\x39\x6e\x8e\x9c\xe4\x8c\x9b\x3d\x31\x53" + "\xf3\x80\x2b\xbc\x04\x3d\xe6\xbe\x76\xc5\x08\xab\x7b\xac\xd4\xc4" + "\x79\x8e\x95\x21\x49\x72\xac\xd4\x94\xfe\xff\x8b\x95\x21\x5d\x32" + "\xac\x54\xf5\x13\x2b\xdb\x29\x56\x06\xf2\xff\x82\x39\x21\xe0\x47" + "\xf9\x6c\x37\x58\x39\xbb\x8f\xb9\xf0\x3b\x77\x58\x39\xe2\x45\x39" + "\x56\x8e\x58\x26\xc7\xca\x11\x63\x24\xac\x14\xae\xdd\x10\xac\x1c" + "\x11\x7b\x6b\xb0\x72\x44\x2c\xc5\xca\xf3\x88\x95\x23\x1f\xea\x1b" + "\x2b\x35\x09\xae\xb1\x12\xce\x53\xac\xd4\x24\x48\x58\x79\xbc\x0f" + "\xac\x0c\xf5\xf7\x00\x2b\x03\x29\x56\xaa\xdc\x60\xe5\x6c\x18\x2b" + "\x81\x2f\x28\xef\x39\xf1\x86\x80\x95\x6a\x3b\x56\xf6\x83\x3f\x3c" + "\xa3\x5f\xa8\xaa\x37\xac\xe4\x8a\x98\x7c\x89\x58\xc9\x07\x08\x58" + "\x99\x62\x25\x99\x47\x01\x23\x1b\xdb\x69\x5e\x18\xea\xc3\x0b\xbf" + "\xac\x57\x11\x8b\x1e\x27\xdb\x60\xbc\x0c\xc6\x4a\x8a\x4d\xd4\x17" + "\x75\x22\x62\x55\x25\xd4\x2d\xb5\xcb\x9d\x14\x3b\x8f\x0a\xd8\x99" + "\x20\x60\xe7\xd4\x1f\x80\x9d\xaf\x21\x2d\xc3\x42\xba\x94\x22\x76" + "\xae\x01\xec\x0c\xa3\xf2\x03\x7e\xcf\x64\xd8\xa9\xdd\x20\xf6\x0b" + "\x6d\x9a\x86\xb4\xf5\x84\xf5\xeb\x52\x4f\x1c\x7d\x9e\xb6\xb7\x40" + "\x3f\xbb\x83\xd8\xb1\x34\x41\xc2\x52\x68\x6b\x92\x7b\x1c\x0d\x2b" + "\xb3\xe3\x68\x3e\xe0\xe8\x09\x07\x1c\x05\xbd\xe9\x4f\x88\x79\x80" + "\xa3\x9d\x14\x47\xff\x2a\xe0\xe8\xa8\xad\x07\x12\x00\x47\x9f\x17" + "\x71\x34\xcc\x68\xc9\xdf\xb8\xd9\x52\xd0\x37\x8e\x76\x52\x1c\xd5" + "\xdd\x7c\x1c\xad\x76\xc2\x51\xd0\x5d\x31\x5f\xb9\x4b\x1c\x15\xf9" + "\x91\xe2\x68\x9e\x84\xa3\x74\x5c\xef\x7f\xae\x3e\x11\xc6\x3d\x51" + "\x47\x75\x37\x3b\x8e\xea\x2a\x19\x8e\xc2\x39\x6a\x3f\x99\x0f\x38" + "\x0a\xfc\x97\x5b\x87\x71\xfc\x48\x14\xf4\x51\x85\xf8\xba\x11\xe6" + "\x0c\x8e\x91\x1d\x4f\x67\xc3\x9c\x41\x8c\xb9\x0c\x73\x06\x70\x74" + "\xea\x15\x15\xa1\xf3\xa5\x00\xe6\x4b\xbb\x9b\xbc\x74\xa2\xbf\xac" + "\x5b\x3c\xbd\xff\x43\x39\x9e\xde\xdf\x28\xc7\xd3\xfb\xdf\x91\xf0" + "\x54\xb8\x86\x78\x0a\x34\x83\xf1\xd1\x22\xa6\x5e\x1f\x9e\xde\x5f" + "\x61\xc7\x53\xa5\x80\xa7\xb3\xfb\xc6\x53\xfa\xdd\xcf\x0d\x9e\x3a" + "\x62\x83\x7b\x3c\xbd\xbf\x42\xc2\x53\x6d\xb6\x1d\x4f\x9b\xdc\xe1" + "\x69\xd8\x26\xd7\x78\x0a\xe7\x29\x9e\x86\x6d\xb2\xe3\x69\x93\x0b" + "\x3c\x7d\xde\x11\x4f\x1f\x98\xc3\xf0\xb4\x92\xe2\x28\x62\x6a\xbd" + "\x19\xf8\x03\xe7\x5c\x5a\x29\xc5\x54\x0e\x30\x15\x73\xf5\x62\x4e" + "\x2a\xf4\x81\x77\x85\xa9\x0c\x73\x8d\x04\x71\x15\xe7\x66\xee\x24" + "\xd0\x77\x61\x2d\x82\x31\xa1\x6b\xaf\x38\x7e\x1b\x1d\xf0\x75\xda" + "\x22\x15\xca\x76\x32\x5e\xe1\x44\x5e\xb9\xac\x45\x1f\x59\x19\xaf" + "\x78\x46\xcb\x07\x52\xdc\x61\xab\x3b\xdd\xfd\x00\xea\xee\x93\x89" + "\x72\xf1\x64\xc0\xd7\x78\xd4\xdd\x37\x3b\xe9\xee\x9b\x7b\xea\xee" + "\x87\x7b\xc7\x51\x8f\x74\xf7\x57\x90\x86\x0f\xce\x92\xe3\xe8\x83" + "\x73\xe4\x38\xfa\xd0\x59\xec\x17\xc3\xf1\xcd\xae\x75\x77\x3a\xcf" + "\x1f\xfc\xc2\xae\xbb\x37\xc9\xf1\x53\xd2\xdd\x1f\x5a\xe7\x1e\x47" + "\x1f\x6c\x95\xc9\xa3\x53\x05\x1c\x9d\x21\xe0\xe8\x0c\x09\x47\x0f" + "\x7e\x2d\xca\xa3\xa3\x15\xfb\x9b\x1c\x71\xf4\x67\x5a\x3b\x8e\x36" + "\xf7\xc4\x51\x11\x43\x11\x4f\xb1\x1d\xb4\x65\x6d\x01\x9c\xde\x3e" + "\x43\xa7\x64\xb6\xda\x44\x1c\x3b\x1f\x67\x5b\x6d\x5d\xc7\x15\x92" + "\x93\x80\x78\x5a\x4a\xf1\xd4\x4f\x41\xa6\x03\xf6\x0d\x45\xbf\xff" + "\x32\xfc\x66\x9f\xce\xf2\x9c\xa1\x7d\x89\x5b\xc8\xf2\x66\x8a\x76" + "\x26\x78\x5f\xfa\xad\x7e\xca\x71\x01\x53\x31\x6f\x3d\xf0\xdc\x07" + "\x57\x01\x53\xd3\x5d\xc8\xa6\x8b\x01\x53\x33\x1d\x64\x53\x98\xfb" + "\x7f\x9d\xe1\x8c\xa9\xa3\x4b\xea\x91\x57\x10\x53\x65\x7a\xfc\xe6" + "\x9f\x80\x1e\x3f\xfa\x9c\x1c\x4b\x1f\xd2\xc8\xb1\x74\xf4\x61\x09" + "\x4b\x85\x6b\x37\x44\x36\x1d\xdd\x71\x6b\x64\xd3\xd1\x1d\x92\x1e" + "\xff\xd0\x7e\x3b\x96\x36\xba\xc3\xd2\x07\x3b\x5c\x63\x29\x9c\xa7" + "\x58\xfa\x60\x87\x1d\x4b\x1b\x5d\xe8\xf1\x32\x2c\x7d\x78\x2b\xc3" + "\xd2\xcd\x4c\x36\x6d\x12\x65\xd3\xcd\xff\x86\x7a\xfc\xc3\x5b\x3c" + "\xd5\xe3\x0f\x74\x30\xfc\x44\x7c\x12\x31\x54\xd2\xe3\x37\xbb\xd7" + "\xe3\xfb\xc0\x50\x8f\x64\x51\x8a\xa1\x8f\x6c\x95\x63\xe8\x23\x9f" + "\xc9\x31\xf4\xf1\x10\x67\x0c\xed\x89\x9f\x8f\x5c\x74\x85\x9d\x4c" + "\x8f\x7f\xac\xc1\x3d\x6e\x86\x07\x7b\x8e\x9b\x8f\x8e\x91\xe3\x66" + "\x78\xe2\xff\x0c\xdc\x7c\xb4\x4e\x86\x9b\xaa\x7e\xe2\xe6\x8f\xa2" + "\xd3\x3f\xe6\x64\xff\x7c\xcc\xc9\xfe\xf9\x98\x83\xfd\xf3\xb1\x1b" + "\x68\xff\x7c\xec\x16\xd9\x3f\x1f\x0b\x95\x64\xd0\xc7\x15\x7d\xe3" + "\x66\x78\xa8\x6b\xdc\x84\xf3\x14\x37\xc3\x43\x25\xdc\xec\x4b\x06" + "\x7d\xfc\xb4\x07\xb8\xf9\x13\xd7\xe9\x1f\xef\xd5\xfe\xe9\x4a\xa7" + "\x47\xdc\xa4\x78\xd9\xe4\xa4\xd3\x4f\x76\xd4\xe9\x37\x4b\x3a\xfd" + "\x04\x86\x5b\x06\x6b\x91\x5c\xa7\xbf\xe1\x38\x1a\x71\xc5\x62\xb7" + "\x87\xbe\x0b\x38\x1a\x41\x73\x25\x58\xec\xf6\xd0\xc8\x6c\xb1\x5f" + "\x4c\xa7\x5f\x43\x58\xbf\x5c\xe8\xf4\xd4\x67\xf6\x89\xe7\xec\x3a" + "\x7d\x93\xb3\x4e\x1f\xf9\x90\x7b\x4c\x7d\x42\xe7\x52\xa7\x47\xfd" + "\x9b\x62\xaa\x8e\x62\xea\xd5\xb5\x8e\x98\xfa\x1f\x2b\x29\xa6\x3e" + "\x2b\x62\xea\x13\x3b\x2c\x30\x37\x2d\x03\xfb\xc6\x54\x6c\x47\xc2" + "\xd4\xe4\x1f\x07\x53\xf5\xfd\xc7\x54\xc7\xfd\xa6\x7f\x85\x77\xb7" + "\x63\x2a\x1d\xe3\x9f\x3f\x50\x9f\x88\x98\x9a\xec\xa4\xdf\x6f\x76" + "\xad\xdf\xef\x27\x4a\x1c\x1f\x51\xbf\x47\x1a\x50\xbc\xb9\xa9\xfa" + "\xfd\xcf\x97\xc8\xb1\xf5\xe7\x3b\xe4\xd8\xfa\xf3\x59\x12\xb6\x0a" + "\xd7\x6e\x88\x7e\xff\xf3\xbc\x5b\xa3\xdf\xff\x3c\x4f\xc2\xd6\xc8" + "\x29\x7d\x63\xeb\x13\x19\xae\xb1\x15\xce\x53\x6c\x7d\x22\xa3\x57" + "\x6c\x7d\xd6\x11\x5b\xc7\x4c\x12\xb1\x55\xd2\xef\x81\x3f\x70\xfe" + "\xa5\x15\x5d\xbf\x7e\xff\xdc\xad\xd6\xef\xc7\xb8\x8d\x7f\xe2\x52" + "\xbf\x5f\x0b\x38\x0b\xba\xf8\xe2\x43\xa0\xdf\xbf\x28\xe8\xf7\xcd" + "\x15\x4e\xfa\x7d\x45\x0f\xfd\x3e\xeb\x45\x01\x53\x61\x4e\x51\x4c" + "\x9d\xb1\xf9\xfa\xf5\xfb\x97\x90\x86\x63\x9f\x93\x63\xea\xd8\x49" + "\x72\x4c\x7d\xf2\x38\xf6\x8b\x61\x7a\x85\x6b\xfd\x9e\xce\xf3\xb1" + "\xeb\x64\xfa\x3d\xf4\xaf\xa7\x7e\xff\xe4\x4a\x19\xa6\x4e\x75\xc4" + "\xd4\xb1\xd5\x32\x39\x15\xde\x0b\x31\xf5\x93\x13\x0c\x53\x3f\x3d" + "\xe1\x80\xa9\x2f\x7c\x2a\x60\xea\x2f\xae\xec\x8f\x73\xc4\xd4\x5f" + "\xf8\x88\x98\x4a\xf1\x72\xaa\x45\x99\x1b\xdf\xd3\xef\x84\xfa\xfb" + "\xa0\x2f\x10\xb4\x8d\x7b\xa4\xb0\xcd\xad\x27\x92\xfb\xf6\x37\x89" + "\x77\xed\x6f\x62\x48\x33\x92\xda\xd6\x22\xea\x67\x52\x86\x7e\x26" + "\x4b\x48\x48\x59\x37\xdb\xeb\x4f\x73\x6f\x5c\x75\xbd\xcf\x7f\xca" + "\xab\x12\xce\xa2\x4f\xd6\x07\xe8\x93\x75\x95\xf9\x00\x01\xbd\x7b" + "\xee\xeb\x17\xe5\x26\xc0\x83\x2f\x4e\x38\xe3\xec\xb8\x77\xea\x91" + "\x7f\x12\x92\x9d\x74\xfe\x8a\x9f\x80\xce\x3f\xee\x94\x1c\x5f\x9f" + "\x0c\x94\xe3\xeb\xb8\xfd\x12\xbe\x0a\xd7\x6e\x88\xec\x3a\xce\x78" + "\x6b\x64\xd7\x71\x46\x49\xe7\x7f\xf2\x4b\x3b\xbe\x36\x38\xe0\xeb" + "\x09\x47\x7c\x1d\x5b\x4b\xf1\xf5\x84\x33\xbe\xc2\x79\x8a\xaf\x63" + "\x6b\xed\xf8\xda\xe0\xa4\xf3\x9f\x70\xc6\xd7\x5f\x7e\x48\xf1\x15" + "\x78\x41\x2e\xbb\x56\xf4\xad\xf3\x37\xff\xd4\x74\xfe\x5f\x56\x78" + "\xa4\xf3\x23\xa6\xa6\x30\x4c\x45\xcc\x12\x71\x55\xd2\xf9\x2b\xdc" + "\xea\xfc\x7d\xe1\xaa\x47\xb2\x2a\xc5\xd5\x5f\x7d\x28\xc7\xd5\x5f" + "\x7d\x24\xc7\xd5\x67\x1e\x70\xc6\xd5\x9e\x98\xfa\xab\xd3\xae\xf0" + "\x94\xe9\xfc\x4f\x37\xb9\xc7\xd2\x28\x95\xe7\x58\xfa\xd4\x53\x72" + "\x2c\x8d\x8a\xfb\x9f\x8b\xa5\x4f\x1d\x96\x61\xa9\xaa\x9f\x58\xfa" + "\xa3\xd8\x01\x9e\x7e\x48\x8e\xa5\x4f\x27\xca\xb1\xf4\xe9\xe1\x12" + "\x96\x0a\xd7\x6e\x08\x96\x3e\x3d\xfa\xd6\x60\xe9\xd3\xa3\x25\x59" + "\xf5\x99\x41\x7d\x63\x69\x94\xda\x35\x96\x46\xa9\x19\x96\x46\xa9" + "\x25\x2c\x3d\xde\x07\x96\x3e\x73\xce\x03\x2c\x95\xdb\x01\x9c\xb1" + "\xf4\x96\xdb\x01\x9e\xe9\xf0\xc8\x0e\x20\x62\xe9\x8b\x3d\xed\x00" + "\x88\xaf\xd4\x0e\x00\xe3\x25\x62\x18\xb5\x03\x44\x33\x2c\x33\x58" + "\x97\xcb\xec\x00\x37\x1e\x5b\xa3\x6d\x16\xbb\x3d\x35\x1f\xb0\x75" + "\x3c\x8d\xab\x6d\xb1\xdb\x53\x27\xac\x13\xfb\xc5\xec\x00\xef\x12" + "\xd6\x2f\x17\x76\x80\xa7\xb1\xbd\xf1\x2f\xca\xec\x00\x0e\x58\x0b" + "\x6d\x3d\xe7\x1e\x67\xc7\x67\xc8\xec\x00\x2d\x12\xce\x5e\x45\x1f" + "\x75\xc0\x41\x8a\xb3\x41\x8e\x38\xfb\xec\x27\x14\x67\x9f\x16\x71" + "\x76\xfc\xce\x4e\x98\x9b\x9d\x9e\xe2\x2c\xee\x23\x38\x91\x78\x6b" + "\x70\xb6\xca\x03\x9c\x75\xb0\x0d\x7c\x01\xe3\x61\xc7\x59\x3a\xee" + "\xbf\x1e\x5f\x9f\x80\x38\x9b\xe8\x64\x1b\xa8\x70\x6d\x1b\xd8\x77" + "\x2b\x6c\x03\xbf\xde\x20\xc7\xdb\x5f\x37\xc8\xf1\xf6\xd7\x6f\x4b" + "\x78\x2b\x5c\xbb\x21\xb6\x81\x5f\x97\xdd\x1a\xdb\xc0\xaf\xcb\x24" + "\xbc\x9d\xb0\xa8\x6f\xbc\x1d\x9f\xe7\x1a\x6f\xe1\x3c\xc5\xdb\xf1" + "\x79\xbd\xe2\xed\xd3\x8e\x78\xfb\xdc\x2c\x11\x6f\x25\xdb\x40\x85" + "\x60\x1b\x58\xde\xb7\x6d\xa0\xd9\x8d\x6d\x60\xfc\xad\xb6\x0d\x3c" + "\x97\xec\x89\x6d\xa0\x6b\x2d\xf3\xdb\x5f\x8c\x7e\xfb\x53\x00\x7f" + "\x63\xbf\x86\x31\xe8\xdb\x6f\x3f\x4b\xf4\x3f\x4d\x2c\x15\x70\xb6" + "\xd4\xa5\x6d\xe0\x40\x9b\x7b\xdb\xc0\x81\x46\x47\xff\xd3\xe7\x93" + "\xe4\xdf\xad\x9e\x9f\x25\x7e\xb7\x3a\x70\x04\x71\xf6\x85\xb7\xb0" + "\xcc\x15\x8f\x65\xf1\xcf\x15\x2f\xe8\xb0\x9f\xae\xfc\xf8\xff\xca" + "\x39\x7e\xcb\x7a\x7e\x9f\xdd\x56\xd0\x80\x78\x5b\x4a\x38\x3e\x79" + "\x20\xc6\x08\xa7\xb6\x82\x57\x90\xf7\x5e\x08\x71\xc4\xdd\x5d\xc7" + "\x1c\x71\xf7\x79\x93\x88\xbb\x36\xc0\xdd\x2f\x5b\x4a\x99\xfd\xf5" + "\x35\xe6\x9b\xba\xe5\x35\x07\xdf\xd4\xaf\xbf\x12\x70\xf7\xff\x9c" + "\xdb\x6f\x84\xf7\xef\xcd\x7f\x0a\xee\xdf\x76\xac\xbf\x3e\xa8\xa5" + "\x2e\x7d\xa7\x04\x7c\x72\xe9\x3f\x05\x7d\x55\x6d\x10\xe6\xaa\x0d" + "\xe6\xe9\x06\x07\xff\xa9\xb2\x4c\x98\xcf\xc2\xbe\x92\x5e\xfd\x50" + "\x5f\x93\xfc\x50\xf9\xe2\x31\x29\xb8\xbe\x71\x25\x63\xc3\xbb\xf9" + "\x64\x2f\x3e\x70\x4c\x0a\x3e\xff\xda\x35\x58\x77\x9e\x89\xf7\x12" + "\xf4\xba\x58\xc0\x9e\xa1\x6c\xdc\x27\x6a\x6d\xb0\xd6\xd8\x60\xad" + "\xe1\x8a\xc7\xc4\x5a\x51\x36\x59\x3b\x26\xae\x0c\xf4\x3c\x6b\x3e" + "\xcd\xa5\x3a\xb8\x10\x74\xbd\x8d\xa8\xe7\x9d\x87\xb9\x91\xab\x55" + "\x62\x7f\x44\x1c\xf5\x6b\x83\xf7\x38\xdf\xbb\x2c\x67\xbd\x20\xe1" + "\xa8\xfe\xf9\x03\xf0\xcc\x49\xf7\xd4\x23\xef\xc6\x4b\x7b\x0a\xa8" + "\xcc\xec\xc6\x57\x16\xfb\xc2\x62\x24\x02\x2f\xdc\x00\x9b\x84\x63" + "\x7f\xe4\xb8\x3e\x69\x81\x1c\xd7\x27\x6d\x96\xe3\xfa\xa4\x29\x12" + "\xae\x0b\xd7\x00\xd7\x81\x6e\x54\x8e\x86\xb5\xef\x3a\xe5\xe8\x49" + "\x69\x22\xae\x73\x02\xae\x97\xf7\x03\xd7\x7b\x95\xa3\x1d\x70\xc9" + "\x3d\xae\x4f\x4a\x93\x6c\x12\x2f\xbc\xe8\xd2\x47\xf6\x98\x23\xae" + "\x3f\x6f\xa1\xb8\x7e\xcc\x19\xd7\xe1\x3c\xc5\xf5\xe7\x2d\x6e\xf7" + "\x13\x1c\x73\xfe\x9e\x16\xf3\x04\xc5\xf5\x26\xc1\x47\xb6\xc1\x83" + "\xfd\x04\x4d\x0c\xd3\x45\x2c\x47\x7b\xd5\xad\xb5\x49\xc4\x44\x78" + "\x62\x93\xa0\x58\xde\xc1\xb0\x1c\xb1\x51\xc4\xf3\xfe\xec\x27\xe8" + "\x0b\xcf\x45\xb9\x19\xf1\xdc\x9d\xdc\x2c\xc7\xf3\xd8\x27\xe4\x78" + "\x1e\x3b\x46\x8e\xe7\x71\x4f\xc8\xf1\x3c\x2e\xc2\x19\xcf\x7b\x62" + "\x79\xec\x3b\xae\x70\x5c\xf7\x0a\xda\x28\x5e\x6e\x75\x8f\xe1\xb1" + "\x3b\x3c\xc7\xf0\x17\x3f\xfb\x1f\x87\xe1\x2a\x67\x0c\x7f\xb1\x03" + "\x31\xc8\x56\xe0\x84\xe1\xb3\x05\x0c\x17\x70\x64\x63\xbb\x20\x0b" + "\x3b\x63\x78\x07\xbc\x47\x1f\xfa\xb8\xf5\x5f\xce\x18\xfe\xd2\x29" + "\x19\x86\xab\xfa\xc0\xf0\xd9\xcc\x0e\x22\xf3\xcb\x75\x63\x0b\x81" + "\xf7\x30\x6d\x70\x23\x9b\x8b\x63\xe6\xd8\x1f\x39\x86\xbf\x3c\x46" + "\x8e\xe1\x2f\xa7\xc8\x31\xfc\xe5\x10\x09\xc3\x85\x6b\x37\x44\x36" + "\x7f\x39\xf2\x86\xcb\xe6\x22\x7f\xf4\x8a\xe1\x2f\x47\x4a\xb2\x79" + "\xdc\xf0\xbe\x31\x3c\x76\xa7\x6b\x0c\x87\xf3\x14\xc3\x63\x77\xba" + "\xdd\xe7\xd0\x03\xc3\xe3\xae\x78\x80\xe1\x72\x5b\x88\x88\xe1\x82" + "\x2d\x64\xa3\x83\x2d\xc4\x96\xcf\x6c\x21\x1b\xda\x19\x6f\x0c\x55" + "\x30\x3e\x05\xfe\x51\x97\x2b\x7b\xd7\xdd\x36\x5c\x97\x1d\x24\xae" + "\x47\xfc\xfb\xde\xec\x20\x14\xbf\x71\x8f\xc3\xab\x80\xdb\x0d\xfd" + "\xdc\xe3\x30\x41\xdc\xe3\x50\xe4\x66\x8f\x83\x80\xe7\x53\x7f\x00" + "\x9e\xd3\x3d\x0e\xaf\x0c\x90\xdb\x98\x5f\x19\x24\xda\x98\x19\x9e" + "\xbf\x76\xa7\x1c\xcf\x5f\x53\xdb\xf7\x3c\x00\xe6\x1b\x74\x6b\x7a" + "\xec\x79\xb0\x63\x3b\xb5\x83\xbe\x32\x4b\xff\x4a\x2b\xb1\xe3\x7b" + "\x82\x84\xef\x67\x14\xaf\xee\x97\x61\x7b\x8b\x23\xb6\xbf\x52\x24" + "\xc3\xf6\x13\xa5\x72\xff\x88\x16\x9d\x03\xb6\x8b\x7b\x1e\x7e\xb3" + "\x72\x7f\x73\x1f\xd8\x0e\xf7\xf7\x7f\x8f\xd8\x8d\xc5\x76\x71\x7f" + "\x83\x4b\x6c\x77\xdc\xdf\xe0\xe0\xff\x80\xd8\x4e\xf3\x51\x0c\x77" + "\xc2\xf6\xc5\xc9\x4a\xdb\x5e\x98\x0f\x80\xeb\x38\x47\x6c\x3c\x60" + "\x3b\x1d\xef\xdf\xd4\x38\x62\xfb\xb5\x7c\x86\xed\x1f\xb4\xff\x70" + "\x6c\xb7\xcb\xc3\x8e\xd8\xfe\x2c\x62\x7b\xfc\x3e\xb6\xff\x22\xaf" + "\x7f\xfb\x2f\x9c\xfc\x33\x3e\xe8\x87\xfd\xa5\x57\x8c\x77\xd1\x2f" + "\x39\xc6\xbf\x7a\x8f\x1c\xe3\x5f\x8d\x95\x63\xfc\xab\x03\x24\x8c" + "\x17\xae\xdd\x10\x39\xfd\xd5\xe0\x5b\x63\x7f\x79\x35\x58\xc2\xf8" + "\x57\xbb\xfa\xde\x7b\xf1\x4a\xa9\x6b\xdf\x0c\x38\x4f\x31\xfe\x95" + "\xd2\x5e\xf7\x5e\xc8\xec\xdd\xaf\x9d\x75\xb9\xf7\xa2\xe1\xc7\xf3" + "\xcd\x70\xe4\x15\x67\xfb\xcb\xf5\xdb\xbe\x5f\x6b\xf3\xd4\xfe\x82" + "\x7b\x2f\x16\x1f\x76\xd8\x7b\xd1\xdc\xf7\xde\x8b\xac\xc9\xfd\xb4" + "\xbf\xf4\xe2\x9b\x71\x20\xd6\xd1\xdf\xed\xf5\xd3\x72\x7c\x7f\xfd" + "\xac\x1d\xdf\x5f\x42\x7c\x9f\x66\x93\xe3\xfb\x34\x2b\xf6\xd3\xd5" + "\x5e\x8c\xbf\xca\xbe\x2b\x26\x8c\x97\xfb\x6a\x38\xd9\x5f\x5e\x42" + "\xde\x9b\xb6\x55\x86\xef\x27\x1c\xf1\x3d\x41\xe7\x4a\x76\x47\xbb" + "\x37\xf5\x29\x9e\xea\xb0\xa7\xed\x05\xd1\xff\x6d\xca\xa2\xfd\xf1" + "\xf0\xfe\x46\x37\xbe\x6e\x53\x99\xaf\x1b\xf5\x6d\x43\x3b\x38\xb4" + "\xb5\x7d\xaa\x4e\x99\x93\xc8\x73\xe8\xeb\xe6\xec\xe7\x86\xbe\x6f" + "\xe8\xeb\x56\x97\x5c\xe4\xd6\xcf\x0d\x79\xd3\x9d\xaf\x1b\xf4\x3b" + "\x90\x62\xfd\x29\x01\xeb\x05\x5f\xb7\xb2\x74\xc9\xd7\x4d\x86\xf5" + "\x2e\xfc\x87\xbf\x38\x91\xe7\x5a\x8e\xcf\x95\xb0\xbe\x1b\xe5\xf8" + "\x5f\x38\xd9\x62\x28\x0d\xa6\xec\xf8\x51\x6d\x31\x14\xeb\xa7\x7e" + "\x52\x8f\x7c\x9c\xa0\x73\x61\x8b\xe9\xe9\xe3\xfc\xe3\xd9\x62\xa6" + "\x29\xe4\x18\x3f\x2d\x42\x8e\xf1\x53\xcf\x4a\x18\x2f\x5c\xbb\x21" + "\x18\x3f\x8d\xdc\x1a\x5b\xcc\x34\x22\xd9\x62\xa6\x1d\x77\xe9\x7f" + "\x27\xb3\xb1\x27\x64\xb8\xb6\xb1\x27\x08\xfe\x77\x09\x19\x6e\xf7" + "\x84\xf4\xf8\xa6\x99\xb8\x87\xd9\xd8\xaf\x63\x4f\x48\xf3\x4f\xcd" + "\x16\x93\xa8\xf7\xd4\x16\x43\x7d\x9b\x0f\xa3\x7f\x88\x67\x7b\x42" + "\xfa\xc2\x76\xbb\xec\xde\xcb\x37\x4c\x39\xb6\x4f\xdf\x23\xc7\xf6" + "\xe9\xfb\xe4\xd8\x9e\x54\x27\xc7\xf6\xa4\x5a\x67\x6c\xef\x89\xeb" + "\x33\x86\xbb\xc2\x74\xdd\x4b\x68\x8b\x49\xca\x72\x8f\xe7\x33\xa2" + "\x3c\xc7\xf3\x37\x9e\xfb\x1f\x8d\xe7\x2a\x67\x3c\x7f\x63\xd9\x8f" + "\x6a\x97\xa1\x78\x3e\x73\x91\x0c\xcf\x55\x7d\xe0\xf9\x8f\x66\x97" + "\x99\x79\x48\x8e\xe7\x49\xde\x72\x3c\x9f\xf9\x85\x84\xe7\xc2\xb5" + "\x1b\x62\x97\x99\xd9\x70\x6b\xec\x32\x33\x1b\x24\x99\x3d\x69\x6b" + "\xdf\x78\x3e\x63\x82\x6b\x3c\x87\xf3\x14\xcf\x67\x4c\x70\xeb\x4f" + "\xdd\x03\xcf\xdf\x5c\xe9\x01\x9e\xbb\xf4\x51\xf9\x69\xd8\x65\xde" + "\x5c\xe1\xa9\x5d\xc6\xdd\x3e\x15\xc4\x77\xc9\x3f\xc5\x61\x9f\x4a" + "\x94\xb8\x4f\x25\x4f\xee\x9f\x72\xc3\xb1\xfd\xb7\x1b\xe4\xd8\xfe" + "\xdb\x0f\xe5\xd8\xfe\xbb\x2f\xe5\xd8\xfe\xbb\x9d\x62\x3f\x99\x5d" + "\x26\xbf\xc7\xbe\x15\x39\xce\x27\x83\x8c\xde\x4a\x5c\x61\x3d\xb4" + "\x35\xc7\x3d\xce\x27\x6b\xdd\xe1\x3c\xfa\xab\xfc\x69\x6a\xb2\x0b" + "\x9c\x9f\xf5\xe8\xff\x0f\x38\xef\xce\x0f\x85\xea\x41\x80\xf1\x88" + "\xf7\x14\xdf\x05\xac\x47\x9c\xb7\xfd\xcd\x95\x8d\x66\x56\xca\xcd" + "\xc2\x79\xf7\x36\x9a\xd9\xb3\xea\x13\x04\x9c\xef\xcf\x1e\x9a\x3d" + "\x72\x1b\x4d\xd9\xec\x9b\x6d\xa3\x99\xbd\x47\x8e\xf7\xb3\xcd\x72" + "\xbc\x9f\xfd\x89\x84\xf7\xc2\xb5\x1b\x22\xbf\xcf\xd6\xdf\x1a\x1b" + "\xcd\x6c\xbd\x84\xf7\xbf\xdb\xd0\x37\xde\x27\x87\xbb\xc6\xfb\x64" + "\x21\x36\x5b\x72\x78\xff\xf1\x3e\xc5\x8e\xf7\x3d\xf7\xcf\xe4\x5d" + "\xbf\x8f\xcc\x53\xb7\xda\x46\x93\xe2\x16\xff\x7b\x8b\x8f\x71\xfd" + "\x36\x1a\x61\x4f\xe2\x0c\xd7\xf1\x31\xf6\xf7\xe2\x23\xb3\xbf\xd6" + "\x11\xeb\xe7\xbc\x23\xf7\x45\x9c\xb3\x52\xf4\x45\xdc\x5f\x8f\x58" + "\xff\xd6\xe7\x72\xac\x7f\x6b\x87\x3b\x1b\xcd\x17\x9c\xa3\x4f\xe2" + "\x9c\xb3\x72\x1b\x4d\x85\xdc\x46\xf3\x02\xf2\xde\x5b\x49\xee\xb1" + "\x7e\x6e\xa0\xdc\x07\x9c\xed\x51\xfc\x64\xaa\xe0\x03\x3e\xd5\xc1" + "\x07\xfc\xf9\x3f\x08\x58\x3f\xef\xd1\x9a\x06\x2b\xf1\xc4\x0f\xf1" + "\x87\xfb\x7a\x2f\x77\xe9\x83\x48\xd7\x80\x5e\xfc\x10\xa7\x1d\x55" + "\xa1\x4f\x73\x65\x79\xba\x83\x1f\x62\x2f\xf1\x8c\x65\xf8\x3f\x55" + "\xe7\x16\xff\xbb\x78\x09\xff\xb9\x9f\x4b\x76\x1b\x0e\xe5\x7c\x4a" + "\x97\x79\x29\x37\xcb\x6e\xe3\xca\x4e\xa2\x7f\x1a\xf1\x5f\x37\x9d" + "\xc9\xf9\xc9\x3f\x31\xbb\x8d\xee\x0b\x39\xee\xeb\x3a\xe4\xb8\xaf" + "\xfb\x50\xc2\x7d\xe1\xda\x0d\xf1\x45\xd7\x55\xdd\x1a\x39\x5f\x57" + "\x25\xd9\x6d\xde\x2a\xe9\x1b\xf7\xe7\x06\xbb\xc6\xfd\xb9\xc1\x0c" + "\xf7\xe7\x06\xf7\x6a\xb7\x91\xf9\x46\xa6\x2e\xfa\xc1\x76\x1b\x51" + "\xce\xbf\xe5\xfb\x7a\x52\x33\x3c\xb1\xdb\xd8\xf7\xa4\xff\x20\xbb" + "\x8d\x6b\xbc\x17\x65\xfb\xfd\xbd\x7c\x73\x95\xe3\xfd\xfc\x45\x72" + "\xbc\x9f\x9f\x2d\xc7\xfb\x85\xeb\xe4\x78\xbf\xb0\xd4\x95\xdd\x46" + "\x8e\xf5\xf3\xeb\x5c\xe1\xbc\xee\x05\xb4\xdb\x2c\x9c\xe0\x1e\xe3" + "\xe7\x5b\x3c\xc7\xf8\x05\xc3\xff\x17\xe3\x9d\x30\x5e\xe5\x8c\xf1" + "\x0b\x62\x7f\x54\x19\x9f\x62\x7c\xfa\x78\x19\xc6\xdf\x40\x5b\x4e" + "\x7f\xf6\x93\xb8\x97\xed\xd3\x9d\xfc\xdf\xd3\x9d\xfc\xdf\xd3\x1d" + "\xfc\xdf\xd3\x1b\x6e\x1c\xc6\xa7\xdf\x78\xff\xf7\x7e\x61\x7c\xba" + "\x83\xff\xfb\xc2\x45\x7d\x63\x7c\x1a\x71\x8d\xf1\x70\x9e\x62\x7c" + "\x1a\xe9\x55\xb6\x97\x61\x7c\xc6\x94\x9b\x61\xcb\xb9\x35\xfb\x8d" + "\x32\x12\x3c\xb1\xe7\xf4\x16\x77\xc4\xad\x3d\x27\x52\xb4\xe7\xe8" + "\xdc\xd8\x73\x6e\x14\xe6\x2f\x9a\x23\xc7\xfc\x45\x6f\xc9\x31\x3f" + "\xfb\x43\x39\xe6\x67\x57\xc8\xed\x39\xa9\x3d\xec\x39\x72\xfc\x5f" + "\x74\x48\xff\x82\xa3\x3d\xa7\xc2\xc1\x9e\x93\xfd\xa2\x7b\xfc\x5f" + "\xe4\x16\xff\xaf\x52\xfc\x4f\x74\x81\xff\x8b\xff\x87\xe0\x7f\xe2" + "\x0f\xc0\xff\xc5\xb7\x00\xff\xb3\x26\x31\x1b\x4f\x3f\xe3\xa4\x7c" + "\xe1\xb9\x8d\xe7\x87\xad\x03\x59\x1f\xc9\xd7\x81\xac\x26\xf9\x3a" + "\x90\xb5\x52\x5a\x07\x84\x6b\x37\x64\x1d\xc8\xda\x74\x6b\xd6\x81" + "\xac\x4d\xd2\x3a\x90\xbd\xa4\xef\x75\x20\xd3\xcd\x3a\x90\x29\xac" + "\x03\x99\x1e\xac\x03\x39\x6f\xb9\xb7\xf1\xe8\xae\xdf\xc6\x33\xe6" + "\x56\xef\x83\xca\xd1\x79\x64\xe3\x59\xfb\x0b\x55\x2d\xc6\x48\x39" + "\x45\x94\x8b\xa7\x8b\x36\x1e\xbd\x93\x8d\x47\xdf\xc3\xc6\xb3\xe8" + "\x94\x80\xff\x13\x85\xfd\xa6\x2f\xfc\x80\x18\x29\x34\x87\x72\xee" + "\x1c\xb9\xdf\x7c\x2e\xc5\x7f\x29\x7e\x5f\xbe\x0d\xfb\xc5\xd6\x1f" + "\x7d\x2f\x31\x50\x73\xbf\x94\xd9\x74\x26\xba\x8a\x91\x92\x2f\xf3" + "\xbb\x91\xef\x37\xcd\x6d\x93\xe1\xfd\x0b\x6c\xbf\xe9\xa7\xae\xbe" + "\xd3\xda\x63\xf2\xe7\x75\xd1\x98\xfc\xf6\x58\x7e\x79\xa3\xfb\x15" + "\x4b\x7a\xaa\x10\x4b\xfa\xc4\x2d\x88\x25\xdd\xdf\x98\xfc\x27\x9c" + "\xe3\xf7\x2d\x29\x31\xd4\xea\x49\x3d\xf2\x48\x82\x73\xec\x53\xbd" + "\xeb\xbd\xfb\x4a\x61\xef\xfe\xdc\x9b\x13\x07\x05\xfb\x43\xd7\xfc" + "\x80\xa5\x9a\xad\x39\x26\xda\x1f\xcc\x57\x0d\x74\xbe\xb3\x16\x78" + "\x95\x43\x3c\x4d\x45\x3c\xcd\x9f\x48\xeb\x9e\x02\x5e\x08\x18\x16" + "\x8f\x7c\x5c\xc8\x11\x5f\x5d\x3a\x62\xeb\x12\xea\xf7\x05\x62\x04" + "\x60\x2b\xab\x97\x7d\x8a\xb7\xd9\x02\xee\x8e\x87\xfe\xdf\xb6\x6d" + "\x6e\xc3\x80\x7a\xa3\x19\xe6\x45\x3b\xee\x89\x55\x18\xac\x9d\x7a" + "\xa4\xc5\xae\xb9\x0d\xde\x3c\xe0\xef\xc6\x37\x89\x8f\x67\xf3\x34" + "\x5f\x4d\xe5\x19\x5c\xf7\x02\x96\x8e\xc6\x38\x20\xa2\x6c\xc5\x5d" + "\x90\xec\x5b\x1b\x60\x7c\x38\x9e\xad\x7d\xd3\x66\x31\xdc\x80\xe7" + "\x55\xc2\x58\x52\x1f\x5b\xc4\x0d\x9a\xc3\x0a\x70\xa3\xfc\x92\xf4" + "\x1d\x1b\xdb\xc7\x31\x62\x76\x94\x7c\xc9\xff\xc5\xe8\x0e\x5b\x61" + "\x66\xba\xc4\xd6\x5c\x13\xc3\xd6\x5c\x93\x1d\x5b\x8d\x2e\xec\x28" + "\x32\x3f\xf6\xa5\x82\xff\x8b\xde\x49\xc6\xd6\xff\x1b\xc6\x47\x59" + "\xea\x91\xff\x0b\xc5\xd3\x14\x86\xa7\x88\x57\x22\xa6\x4a\x76\x14" + "\xbd\x5b\x3b\x4a\x5f\x98\xea\xd1\x1e\x7e\x8a\xa9\xcb\xf6\xc8\x31" + "\x75\xd9\x3e\x39\xa6\x2e\x1f\xef\x8c\xa9\x3d\xf1\xf4\xed\x01\xae" + "\xb0\x94\xc5\x47\xf9\xbd\xd9\x3d\x8e\xbe\x1d\xee\x0e\x47\xa9\x7f" + "\xfa\x54\x07\xff\x74\x3b\x8e\x16\x3c\x25\xc7\xd1\xb7\xd3\xfa\x8b" + "\xa3\x34\xb7\xc9\x89\x1f\x21\xb7\xc9\x75\xe3\xa8\xce\x09\x47\x0b" + "\x8e\x4b\x38\xea\x9c\xdf\xa4\x0f\x1c\x9d\x7d\x73\x62\xa0\xc8\x70" + "\x94\x33\xd1\xfe\x68\xe6\x62\x5f\x7f\x3f\x5d\x8e\xa3\xbf\x2f\x76" + "\x8f\xa3\xbf\x7f\x54\xc2\x51\x56\xef\xe6\xe2\xe8\xef\x13\x65\x38" + "\x3a\xdb\x01\x47\xff\x25\xe9\x10\xe8\x63\x61\xc7\xd1\x39\x0e\x38" + "\x3a\xbb\x2f\x1c\xfd\x7d\x22\x8e\x11\x93\x51\x97\x87\xf5\x8d\xa3" + "\x6f\x47\xba\xc6\x51\x38\x4f\x71\xf4\xed\x48\x09\x47\x5d\xc8\xa8" + "\x32\x1c\x7d\x67\x90\x07\x38\xfa\x13\x8f\x8d\xf2\x8e\x8f\x47\xb6" + "\x0a\x69\x4f\x67\xcf\x18\xa9\x53\x1c\xf7\x04\x55\x39\xe5\x3d\xa9" + "\xea\x91\xf7\x64\x91\xb8\xc7\x73\x82\x80\xab\xcf\xff\x00\x5c\xa5" + "\x7b\x3c\xdf\xbd\x53\xee\x7b\xf2\xee\x3d\xa2\xef\x09\xc3\xd5\x95" + "\x9f\x89\xfd\x92\xf2\x9e\x54\xf5\x12\x23\xf5\xdd\x39\xb2\xd8\x28" + "\x13\x1c\x63\xa3\xac\x9c\xee\x3e\x46\xea\xbb\xc5\xb2\xd8\x28\x07" + "\x36\xdb\xf3\x9e\x38\xc7\x48\x95\x30\xf6\x3f\x3f\xa2\x18\x6b\x8f" + "\x41\xf5\x6e\x93\x3d\x46\x6a\x1f\xfb\x82\xb0\x9d\x6d\x2d\xc9\x37" + "\x1f\x63\xf5\x1e\x60\xac\x2c\xef\x89\x73\x8c\xa9\x15\xcf\x19\x6a" + "\xaa\x48\x7d\x62\x95\x8b\xd8\xa8\x55\xb7\x34\xf7\x09\xf6\xcb\x35" + "\xd6\xae\xa8\x93\x63\xed\x4a\x42\xeb\x1e\x77\x85\xb5\x2b\x36\x48" + "\x58\xcb\xea\x65\x1f\x77\xc2\xda\x66\x37\x58\x0b\xeb\xea\xc6\x33" + "\x9e\x62\xed\x8a\x5a\x8a\xb5\xf9\x02\xd6\xb6\xdf\x68\xac\x5d\x51" + "\x2b\x61\xed\xca\xd5\x7d\xe7\x98\x7a\xb7\xcc\xf5\xbe\x9c\x77\xcb" + "\x18\xd6\xbe\x5b\xd6\x6b\x8e\x29\x99\xcf\x47\xe1\x12\x31\xc7\x94" + "\x64\x0f\xa8\x12\xec\x01\xff\xce\x39\x51\x0a\xf3\x3c\xb5\x07\x1c" + "\x04\xdd\x1d\xf7\x5d\x2e\xc6\x9c\x53\x09\x98\x13\xa5\xd2\xc9\x1e" + "\x50\xd9\xd3\x1e\xf0\x6a\xef\x18\xeb\x91\x3d\x80\xee\xbb\x5c\x95" + "\x2d\xc7\xd8\x55\x4b\xe4\x18\xfb\xde\x9d\xe2\x3e\x4b\xec\x8f\xfb" + "\x98\xa9\xab\xea\xec\xf6\x80\x66\x39\xb6\x4a\xf6\x80\x35\xfb\xdd" + "\x63\xec\x2a\xb9\xfd\xf7\xf9\xcd\xb2\x7d\x96\x9f\xb6\x38\xc6\xa1" + "\x16\xe3\x4f\xad\x1e\xbe\xbf\xd1\x11\x63\x8b\xc6\xfd\x3b\xc5\xa1" + "\xb6\xc7\x9a\xea\xc3\x97\xbb\x67\x1c\xea\xd5\x9f\x19\x6a\x2a\x09" + "\xee\x6d\xa3\x78\x2b\xb3\x0d\x54\xde\x1a\xdb\x40\x4d\xa5\x1b\xdb" + "\xc0\x9a\x27\xe4\x38\xbb\x26\x99\xd6\x3d\xea\x0a\x67\xd7\x0c\x90" + "\x70\x96\xd5\xcb\x3e\xea\x84\xb3\x4d\x37\x52\xa6\x5d\x13\x71\x73" + "\x6d\x03\x6b\x22\x24\xdb\xc0\x9a\x7e\xec\x7f\x2c\x22\xae\x71\xb6" + "\x48\xb0\xbb\x16\x49\x76\xd7\x26\x17\xf9\x52\x64\x38\xfb\xde\x71" + "\x71\xff\x23\x95\x69\x9b\x45\x99\xb6\xf2\xdf\x30\x5f\xca\x7b\xcd" + "\x9e\xda\x06\x70\x9f\x3b\x62\x2b\x62\x97\x88\xaf\x92\x6d\xa0\xd2" + "\xbd\x6d\xa0\x0f\x7c\xf5\x3c\x77\x5f\xf1\x71\x39\xbe\x16\x9f\x92" + "\xe3\x6b\xe9\x1c\x67\x7c\xed\x89\xad\x25\x21\xae\x70\x95\xd9\x06" + "\x4a\x83\xdd\x63\x6a\xc9\x44\x77\x98\x4a\x63\xfa\xb5\x48\x3e\xd2" + "\x12\xa6\xae\x9d\x25\xc7\xd4\x92\xa2\xfe\x62\xea\x2d\xc9\x97\x72" + "\xdd\x98\x9a\xec\x84\xa9\xef\x0f\x90\x30\xd5\x39\x67\x4a\x1f\x98" + "\x7a\xb3\xec\x04\x8e\x98\x2a\x93\x5d\xdf\x7f\x47\x8e\xa9\xef\xef" + "\x74\x8f\xa9\xef\xbf\x2a\x61\x2a\xab\x77\x73\x31\xf5\xfd\xe5\x37" + "\xd7\x4e\xf0\xfe\x72\x49\x76\x2d\x9d\xd4\x37\xa6\x96\xc4\xb9\xc6" + "\xd4\x92\x38\x86\xa9\x25\x71\xfd\xdf\x53\xbe\xee\x51\x0f\x30\xf5" + "\x27\x9e\x4b\x65\x5d\xb8\xc7\x76\x02\xb4\xb7\x22\x96\x36\xff\xb0" + "\xd8\x21\x19\x62\xec\x90\x68\x01\x63\x9f\xfd\xa1\x18\xbb\xfe\x29" + "\xb9\x4f\xc3\xfa\xf1\xa2\x4f\x03\xc3\xd8\x0d\xa7\xe5\xf9\x51\x7b" + "\xc6\x0a\x91\xc7\x50\x5d\x5f\x62\xb7\x13\x20\xe6\x46\x3b\xda\x09" + "\x36\x94\xb8\xc7\xdb\xf5\x3b\x65\x76\x82\xbf\xbb\xc6\xdb\xab\x32" + "\xbc\xfd\xe0\x28\xc5\x5b\x7b\x0c\xd5\x0f\x88\x18\x43\xb5\x4f\x19" + "\x56\x86\xb7\x89\x3f\x0e\xde\x56\xf5\x1f\x6f\xe5\xb9\x54\x9c\xe3" + "\xa5\x96\x65\x1b\xaa\x01\x6f\x69\xbc\x0e\xe7\x98\xa9\xfd\x8b\xd7" + "\x71\xb3\x62\xa6\x62\xbf\x5c\xe3\xee\x06\x85\x1c\x77\x37\x44\xd0" + "\xba\x2e\x71\xb7\xec\x90\x84\xbb\xac\x5e\xbf\x71\xf7\xba\x6c\x06" + "\x68\xa2\xb8\x99\x36\x83\x0d\x44\xc2\xdd\x0d\xfb\xfa\xc6\xdd\xf5" + "\xd5\xae\x71\x77\x7d\x35\xc3\xdd\xf5\xd5\xbd\xe2\xae\xcc\x87\xa0" + "\xfc\x73\x97\xb1\x3c\x9a\xff\xdd\xf3\xac\x94\xef\xb8\x1e\x9b\x01" + "\x60\xb0\x32\x0b\x63\x38\x25\xa2\x0f\x41\xdf\x36\x83\xbe\xf0\xd6" + "\x73\x9b\xc1\xc6\xcf\xe4\x78\xbb\xf1\x73\x39\xde\xfe\xd7\x74\xec" + "\x57\xaf\x36\x03\x8a\x01\x15\x0a\xbb\xcd\xc0\x28\xc7\x59\xc9\x66" + "\xf0\x5f\xfe\xee\xbf\x7d\x55\x8c\x96\xc9\xb7\xcf\x3a\xc5\xac\x9e" + "\x2a\xe1\xed\x81\x7a\xd1\x67\xec\xc3\x29\xfb\x63\x1d\xf1\xb6\x42" + "\xd7\x23\x66\x75\xdc\x0d\x8c\x59\x1d\x77\x83\x63\x56\x4f\x96\xc7" + "\xac\x5e\x7f\x55\xf2\x23\xf3\x3c\x66\xf5\x87\x5d\x14\x83\x91\x87" + "\x30\x6e\x75\x7f\xec\x08\x37\x39\xd7\x8a\x0c\x7b\x65\x76\x84\x3f" + "\x64\xcb\xb1\xf7\x0f\x95\xee\xb1\xf7\x0f\x93\x24\xec\x65\xf5\x6e" + "\xae\xcc\xfb\x87\xac\x9b\x6b\x47\xf8\x43\x96\x64\x47\xf8\xaf\xa7" + "\x5c\x62\xaf\xec\xdb\x58\x45\x84\xeb\x6f\x63\x70\x9e\x62\x6f\x45" + "\x84\x5b\x3b\x42\x0f\xff\xad\x4d\x61\xec\xdb\x98\x20\xf3\x1a\x3d" + "\xb0\x23\xfc\xe4\x7c\x0c\x36\x85\x5e\x8f\x1d\x01\xf1\x16\xf1\x4c" + "\xc4\xdc\xfe\xd8\x11\x6e\xbc\x8c\xfb\x51\x98\x1c\x73\x3f\x7a\x40" + "\x8e\xb9\x9b\xf7\x3b\x63\x6e\x4f\xbc\xfd\x68\x96\x2b\xac\x65\x76" + "\x84\xcd\x19\xee\x71\xf6\xa3\x62\xb7\x38\xeb\xe4\x9b\x2b\xe1\xec" + "\xc7\xfb\xe4\x38\xfb\x51\xd3\x75\xe1\x6c\x7f\x73\xb0\xfc\xa4\x70" + "\x36\xd1\x09\x67\xff\x38\x5d\xc2\x59\xe7\x3c\x2c\x7d\xe0\xec\x4d" + "\xca\xc3\xe2\x5e\xc6\xfd\xe3\x69\x39\xce\x6e\x56\xbb\xc7\xd9\x3f" + "\x7e\x2e\xe1\x2c\xab\x77\x73\x71\xf6\x8f\xad\x37\xd7\xb6\xf0\xc7" + "\x56\x49\xc6\xdd\xfc\x49\xdf\x38\xfb\x51\x99\x6b\x9c\xfd\x48\xf8" + "\x2e\xf6\x51\x99\x5b\x19\xb7\x07\xce\x7e\xb2\xd2\x03\x9c\xfd\x89" + "\xfb\x20\x7c\xe2\x51\xfc\x0b\x07\x7b\xed\x40\x83\xd1\x69\xbf\xc4" + "\x51\xc7\xfd\x12\x0e\xb6\x85\x68\xd1\xb6\x20\xcf\xcf\x92\x21\xda" + "\x6f\xa3\x04\xdc\x7d\xfa\x87\xe2\xee\xa7\x1b\x3a\xed\xb8\x9b\x0a" + "\xb8\xfb\x29\xdd\x1f\xd1\x69\xc7\xdd\x6d\x93\xc5\x7e\x49\xf9\x59" + "\xdc\xd8\x16\xc6\xd2\xf6\x2e\xda\x6d\x0b\x88\xc3\x51\x8e\xb6\x85" + "\x6d\x03\xdc\x63\xf0\x9f\xd4\x32\xdb\xc2\x57\xae\x31\xd8\x2c\xc3" + "\xe0\x2d\xcf\x51\x0c\x1e\x2b\x62\xf0\x9f\x12\xae\x82\x6e\x79\xb5" + "\xc0\x33\x0c\x36\x53\x0c\x9e\x70\x6b\x30\x78\xc7\x0d\xc0\x60\x3a" + "\xee\x5b\xce\x19\xf4\x80\xc1\x09\x88\xc1\x13\xfa\x67\x6f\xf8\x91" + "\x72\xb4\x60\xbf\x5c\x63\xf1\xd6\xb7\xe4\x58\xbc\x75\x13\xad\xeb" + "\x12\x8b\xb7\x3e\x25\x61\x31\xab\x77\x73\xed\x0d\x5b\x75\x37\xd7" + "\xde\xb0\x55\x27\x61\xf1\xb6\x27\xfa\xc6\xe2\x3f\x69\x5c\x63\x31" + "\x9c\xa7\x58\xfc\x27\x4d\xaf\x58\x3c\xd6\x11\x8b\xb7\xdb\x65\x5e" + "\x99\xbd\xc1\xf8\xef\x9e\xbb\x65\xbb\x5b\xf9\x57\x73\x2f\xc9\x6b" + "\x51\x6c\xcf\x36\x94\x11\x72\x39\x9f\xe4\x19\xac\x63\x09\x9c\x83" + "\xf1\xdb\xfe\x91\x41\x1d\x49\xb8\x35\x23\x2b\x10\x8f\xdf\xc3\x1f" + "\xc8\xb8\x45\x4a\x61\x6e\xd1\x31\xde\x4e\xfd\x5d\xf1\x3c\x62\xef" + "\x46\x87\xeb\xae\x9e\xc5\x17\x8d\x0c\x66\xf7\x55\x12\xb6\xef\x66" + "\xa4\x46\x2c\x23\x6f\x1a\x15\x95\xde\xfc\xea\x91\x6a\x93\xff\x48" + "\xb5\xab\xfb\x47\xa8\x88\xcf\xd0\x25\x3c\x5f\xbe\x96\x37\x5f\x1e" + "\x15\x48\x2e\xbf\x4b\x48\xd1\x5a\xde\xd4\x59\x50\x39\x0e\xde\x71" + "\xe6\xfb\x50\xef\x72\x40\x29\xbc\x47\x2c\x81\x73\xb1\xe2\x39\x18" + "\x37\xc2\xe5\x7b\xf1\x1c\x5c\xe3\xd7\x7c\xdf\xb1\x31\x07\xb0\x0a" + "\x34\xb7\x87\xaf\xe2\x9c\xa9\x4c\x04\x9e\x09\x2c\x84\x36\x57\x41" + "\x5b\xfc\x1d\x77\x9b\x81\x1f\xbd\xeb\x97\x11\x9c\xd3\xcb\xe1\xbd" + "\x2a\x0a\x71\xec\xbd\x1e\x2c\xe5\x95\xde\x84\xfb\x68\x58\x3c\x3f" + "\x7c\x9c\x0a\xe8\x41\x8a\x52\x09\xf5\xb9\x5b\x05\xf5\x78\x65\x2e" + "\x0f\xeb\x88\xd1\x60\x35\xb3\x39\x0d\xfd\xdb\x05\x7a\x2c\x0f\xcf" + "\x2d\x4f\x25\x2a\xf8\xf9\xf2\x25\xe3\x54\xd0\xaf\x36\xe8\x57\x03" + "\xf6\xcb\xdd\x3b\xae\x5a\x0f\xeb\xce\xdd\x6a\x5c\x3b\xe8\xf3\xf1" + "\xd9\xf4\x39\x4a\x6e\xb9\x0d\xce\xf3\xf9\xb9\xbc\x21\xc3\x4a\xfc" + "\x60\x2c\x36\x42\xbf\x91\x1f\xb9\x8f\x03\xc9\xd2\xbb\x08\xd9\x96" + "\xd9\xa6\x34\x40\xdf\x6d\xef\xdf\x6d\xd6\xe7\x3c\x46\xe0\xba\x09" + "\x75\x96\x33\x8a\xcf\x4e\xc7\x9c\x25\x04\xf1\x04\xfe\xbf\x68\x86" + "\x75\x6c\x12\x94\x57\xc1\x7b\x70\x97\xd5\xde\x58\x17\xce\x6f\xd0" + "\xa7\x1f\x23\x7e\x3a\xe2\x53\x08\xef\x26\xd4\x4d\xc1\xba\x46\xc5" + "\x67\x26\xec\x03\x94\xf3\xa0\x8c\xf7\xa1\x0f\x19\xe1\x37\x0d\x8b" + "\xa7\xbc\x59\x3c\x4e\xc5\x85\x0d\x8b\xa7\xd8\x07\xef\xb9\x0a\xde" + "\x19\xea\xf8\x42\x1d\x5f\x7a\xcc\x21\xaa\x62\x38\x87\xed\xc0\xd1" + "\x57\x3f\xb7\x1b\xdb\x4e\xc0\xb6\xdd\x8c\x83\x37\x1f\x38\x4e\xc5" + "\x03\x6f\xe3\x9a\xaa\xc9\x51\x1c\x6a\x51\xfc\xb9\xc8\x4f\xc1\xf3" + "\x30\xcf\x8d\x4b\x73\x88\x6f\x11\x47\x88\xfe\x2e\x6c\xe7\xcf\xb3" + "\xa0\x7d\x6f\x1c\x8b\xce\x82\x3f\xc3\x9c\xaf\x34\xe3\xf8\x02\x3d" + "\xcd\x9a\x11\xf8\x0e\x7f\xae\xc0\xe7\xe0\x3d\x42\x7d\x1a\xfb\x1e" + "\xfb\xac\xc9\xf1\xe2\xa1\xfc\x8e\x97\xe2\x14\xf1\x52\xfb\x16\xc0" + "\xfd\xcb\x8d\x64\x76\x23\xde\x6f\x64\xf7\x01\x2f\xfd\xb9\x0c\xda" + "\x54\xe1\x39\x2c\xbb\xe9\xaf\xaf\x48\xb7\x3a\x35\xf0\x86\x33\xed" + "\x44\x1e\x01\xbe\x10\x79\x04\xfb\xbb\x3d\xc7\xa8\xa4\xeb\xb0\xe2" + "\x2f\x54\xaf\x2b\x04\x1a\xda\x3e\x50\x7b\xaf\x82\xb1\xe5\xae\x21" + "\x5d\x5a\xf0\xda\x29\xa4\xcb\xaa\x4c\xa0\x09\xab\xeb\x2d\xf5\x9f" + "\x96\x29\x3d\x39\xa0\x05\xdb\xbb\xf9\x97\xcf\xf1\x7d\x56\x5d\x05" + "\x3a\x06\xf1\xe6\xea\x0c\xe8\x17\xf2\x2d\xf0\xc8\xb6\x54\x8b\x12" + "\xfd\xfa\xf0\xfc\xae\x4b\x16\xe5\xaa\x76\x82\x72\x25\x59\x09\xb8" + "\xbc\x21\x1d\xc6\x1c\xda\xe4\x43\xfd\x8d\x8f\x88\x74\xcc\x04\xda" + "\xa5\x03\xef\xc2\x98\xaf\x82\xf1\x2b\x07\xcc\xc3\xff\xcb\x61\xfd" + "\x01\x99\xce\x68\x54\xfc\xc5\x04\xed\xa9\x36\x04\xf1\xa6\x8d\x41" + "\x7c\x07\x8c\xe1\xfa\xce\x82\xbf\xd4\x8a\x63\x88\x7d\x5a\x05\xe7" + "\x57\xc2\x75\xa8\x3b\x81\xf1\xd0\x5f\xd4\xe2\x3b\xbb\x1b\xcf\x15" + "\xdb\x48\xe4\xca\x6d\x24\xf8\xdd\x6d\x64\xdc\xe2\x56\x98\x97\xf9" + "\xbf\xe2\x0f\x26\x58\x61\x4d\xcc\x8e\xec\x0e\x0a\xa3\xdf\xf8\xb9" + "\xa5\x77\x57\xbc\xbd\x8d\x8c\xc6\xbd\xb1\x31\x1d\x84\xe0\x1a\x1e" + "\x33\xe0\x24\x6f\xd0\x5d\x21\x9c\x7f\x76\xa4\x6d\xe9\x83\x01\x2f" + "\x5c\x21\x64\x9f\xd6\x4c\x72\xd2\x60\x2d\xbf\xd4\x46\x72\xcc\xbc" + "\xa9\x3e\xef\x2c\x01\xec\x11\xc6\xee\xf3\x15\x31\x49\x84\xe0\x9e" + "\x41\xee\x5f\x5a\x32\x24\x99\x78\x67\x1d\x25\xea\xdc\x56\xbe\xcd" + "\xb6\xf6\x51\x53\x4e\x36\x51\x6e\xbb\xd4\xc4\x64\x4f\xc5\xe7\x53" + "\xbe\xc4\xfd\xa9\x9d\xf1\x64\x9a\x55\x58\x8f\x8a\xc7\xa9\x73\x67" + "\x91\x3b\xf1\x7d\xfc\xa8\xec\xb5\xa3\x0b\xc6\x4d\xed\x19\x3e\xef" + "\xa8\xa6\xf4\x5c\xfb\x78\xde\xb6\x19\x16\x90\xb7\xce\xaa\x72\x93" + "\xf8\x36\x94\xeb\x60\x7d\xa1\xb2\xa0\xa1\xcd\x0a\xb2\xd5\x4c\x58" + "\xbf\x8d\x64\x77\x4b\x85\x92\x5b\x7d\x56\xe5\xd9\x33\x3e\xd7\xd2" + "\x75\x1b\xd7\x52\xe8\xfb\x64\x2d\xc9\xa3\xfd\x87\x35\xd3\x2f\x0d" + "\xe5\x29\xfe\x24\xf6\x7f\x17\xbc\x2b\x1f\x12\xa3\x83\x3e\x6d\xc1" + "\xf5\x33\xa6\x59\x4f\x6a\x2d\x36\xb2\xbe\x9d\x8e\xd1\x40\x18\x23" + "\x6f\xb8\x96\x07\xe3\xe4\xe3\x8a\x6e\x48\x33\xae\x28\x3b\x92\xf3" + "\x62\xb4\xa1\x74\x31\x33\xba\x60\xa6\x2d\x43\x1a\xd0\x66\x35\xa3" + "\x0d\x37\xfc\x17\x94\x36\x1e\xbe\x87\xc9\xdd\xfa\x82\xcf\xe6\x81" + "\x3f\x90\x2f\xb8\xc0\x5f\x10\x7c\x36\xf6\x01\xbf\x9f\x21\x1f\xc4" + "\xbc\x7d\x92\xaf\xd7\xb5\x11\x03\xbc\x0f\xef\xef\xd8\x07\xab\x87" + "\x7d\xf8\xbf\x69\xee\xfa\xb0\xe2\x61\xe0\xdb\x87\x81\x6f\x1f\x06" + "\xbe\x35\x32\xbe\x3d\xd0\xcc\xf8\xd6\x06\xfd\xea\x02\xd9\x7d\xf1" + "\x64\xa2\xc4\x7e\x6d\x39\x86\x31\xfa\xa0\x9f\x6d\x12\xef\x4e\x3a" + "\x07\x63\x24\xf2\xaf\xd7\x83\x01\x38\x3e\xf5\xe6\x26\x92\x8b\xfc" + "\xdb\xed\x8a\x7f\xab\x26\xc6\x4c\x07\xda\xfc\x16\xf8\xf7\x7b\x2d" + "\xf1\x6d\x25\xde\xd9\x93\x81\x7f\xdb\x5c\xf1\x6f\xd5\x3d\x3b\xe1" + "\x99\x3d\xf8\x37\xc9\x91\x7f\xff\xfb\x0b\xcf\xf9\xf7\xbf\x97\xd9" + "\xf9\xf7\x35\x81\x7f\x67\x39\xf1\x6f\xab\x03\xff\xe2\x7b\x7b\xcc" + "\xbf\xff\xdd\xe6\x19\xff\xfe\x77\x8a\x9d\x7f\x41\x2f\x59\xff\x26" + "\x1d\xa3\x81\x30\x46\xc0\xbf\xff\x1d\x05\xe3\xe4\x92\x7f\x7f\x7c" + "\xfa\xfd\xd5\xb7\xff\xf4\xfb\xe2\x78\xdf\xf4\xfb\x62\x91\xe7\xf4" + "\xfb\x22\xfa\xe6\xd3\xef\x8b\xcd\x9e\xd1\xef\x8b\xd1\xee\xe9\xf7" + "\x05\xf9\xe9\xd0\xef\x6f\xb5\xfd\xa7\xdf\xdf\x36\xf4\x4d\xbf\xbf" + "\x8d\xf1\x9c\x7e\x7f\xf3\xbe\xf9\xf4\xfb\x5b\xb2\x67\xf4\xfb\x6b" + "\x87\x7b\xfa\xfd\x55\xef\x8e\x7e\xcf\xdc\xc9\xf1\x1c\xfa\xcd\x05" + "\x85\x24\xa2\x0c\xc4\xe4\xb5\x9d\xeb\x50\x67\x84\xb2\xb7\x58\xa6" + "\x32\x15\xe8\xd5\x4e\x65\x5f\xa7\xb2\xca\xa9\x1c\xe8\x54\x56\x3b" + "\x95\x83\xc5\x32\xd0\x6b\xc0\x79\xc5\xce\x41\xa0\xb3\xe5\x19\x15" + "\x3b\x37\x09\xd7\x43\xa7\xd9\x34\xa8\xf7\x85\xba\xea\xfb\xaa\x7c" + "\xde\xa2\xcb\x21\x77\xb7\x2b\xbe\x54\x51\x7a\x2c\xbd\x4b\xcb\x67" + "\xe6\x11\xa0\x47\xf4\x0b\xd9\xc8\x57\x26\xc2\x5f\x53\x0f\x84\x71" + "\xba\x03\xf4\x4d\x13\xf2\x9c\x26\x75\x37\xdf\xa2\xd8\x69\xc3\xf7" + "\x7b\x58\xa7\x27\x9c\xd7\x83\xf8\x3d\x42\x01\xf4\x89\x36\x79\x3d" + "\x78\x17\xff\x61\x2c\x29\x54\x72\x3e\x85\xf9\x9c\x26\xdb\xc4\x9b" + "\x26\x5e\x84\x75\x0c\xd6\x32\x43\x87\x05\x78\x92\x37\xe9\x53\xcf" + "\x41\x7f\xbf\x4c\xaa\xcb\x82\xb6\xe1\x39\xf0\xac\x28\x5e\x75\x36" + "\xd4\x60\x6d\x20\x3c\xb4\x51\x6f\xae\x01\xdd\xbf\x89\x08\x6d\x46" + "\xf1\xfe\x67\x43\xb1\x4d\x97\xfa\x59\x71\x48\x31\x3c\x73\xec\x64" + "\xad\x37\xe1\x97\x78\x07\x7a\xc6\x1f\x5f\x2e\x77\xab\xf7\x15\x8f" + "\x08\x64\xed\xfa\x5c\x4f\xbb\xc6\x5e\xda\x15\xfa\xab\xba\x8e\x76" + "\x77\x45\xba\x6f\x77\xa4\xd0\x5f\xcd\xf5\xb4\x5b\xd4\x4b\xbb\x42" + "\x7f\xa3\xae\xa7\x5d\xb7\xf9\x3f\xf8\xe2\x50\xa1\xbf\x79\xd7\xd1" + "\xee\xee\x28\xf7\xed\x86\x14\x5f\x1f\x2f\xec\x2e\xee\x8d\x17\xae" + "\x8f\x0f\x76\xf7\xf2\xfe\x23\x8a\xaf\x8f\x07\xf4\xe3\x7a\xe3\x81" + "\xeb\xa3\xbf\xbe\x57\xfa\x5f\x1f\xed\xf5\xad\xbd\xd1\xfe\xfa\xe8" + "\xbe\xc7\x2d\xff\xa3\x2e\x0b\xb4\x0f\xe7\x83\x62\x12\xb9\x35\x17" + "\xc3\xb9\xa0\x90\xc7\x96\x72\x51\xe4\x19\xc0\x30\xbf\x52\xe2\x1f" + "\x45\xed\x43\x7b\x6a\xb3\xcb\x88\xb2\x48\xc9\x29\xb7\x66\x36\x29" + "\x0d\xd6\x48\x92\x6b\xe5\x6d\x9b\xd2\x2d\x8a\x91\x70\x7e\x0f\xac" + "\x16\xe6\xf9\x5a\x42\xdb\x09\xb8\x18\x5e\x98\x13\x45\x62\x6c\x04" + "\xed\x11\xe6\xbd\x59\x80\x61\x80\x63\x86\x52\x0b\xae\x79\xfe\x70" + "\x9f\x15\xf8\x17\xda\xb0\x90\xed\x9c\x49\x11\x95\x4a\xeb\x99\x40" + "\x6f\x34\xf1\x6b\x43\x1e\xe3\x73\xb5\x64\x19\xfc\x7f\x46\xf1\xd5" + "\x13\x5e\x26\xa2\x2c\x07\x7d\xb2\xb3\xe0\xab\x70\xa3\x62\xaf\x2f" + "\xea\x98\xa0\xcb\x76\xe4\x5e\x44\x9b\x7b\x4c\xe2\x52\xd0\x6b\xb1" + "\xee\x36\xce\xa4\x7c\x58\x47\x94\x7b\x4d\xa8\xbf\x7f\x95\xb0\x07" + "\x24\xf6\x5e\x6c\x2e\xde\x5c\xe0\x98\x34\xbc\x1f\xdb\x41\x5b\xe6" + "\x2a\x0e\xc6\x36\x70\x9c\x1a\xfb\x0b\x63\xdc\xa6\xcf\xc4\x75\xe1" + "\xab\xd6\xf1\x0f\xf0\x9d\x02\xce\xdf\xd5\x0e\x65\xaa\xb3\xe7\xf3" + "\x0d\xbc\xaa\x4d\xcd\x17\x0e\x89\xaa\x37\x5f\x22\xfa\xf4\x6e\xd2" + "\xa2\xf8\xea\x34\x3e\xfb\x72\xe0\x18\x9d\x39\x70\x4c\x06\xf4\xc1" + "\x28\xf6\x17\x9f\x25\x9e\x47\x1b\x05\xeb\xe3\x5e\xb2\x27\xcb\x7d" + "\x1f\x61\x2d\x09\x88\x51\xf3\x26\x1c\x43\x7d\xce\x25\xe8\x4b\xf5" + "\x02\x1c\x67\xbe\x78\x4c\x94\x39\x57\x7b\x2f\xb3\xd9\xed\x2d\x43" + "\xdb\x0f\xac\x03\x11\xd4\x0e\xb3\xfa\x6c\x04\xf5\xb3\x01\xbc\x87" + "\x75\xda\x82\xf2\xca\x79\xc5\x5e\x9a\xff\x78\xb2\x56\xe9\xa1\xce" + "\xb3\x97\xae\xff\xfa\x7b\x71\x1c\xaa\xa7\xc0\xf3\x7e\xd1\xa2\xd8" + "\xab\x67\x76\xbc\xb3\x13\xf0\x79\x50\x67\x22\x3c\x73\x02\x5f\xd4" + "\xa6\xc2\x7a\x70\xdd\x28\x5c\x8f\x75\xb8\x1e\x0b\x7d\x5e\xce\xae" + "\x57\x0b\x76\xc0\xb3\x71\x0e\xd7\xe3\x74\xf7\xa2\x5d\xae\x5a\x8b" + "\xef\x04\x6b\x59\x38\xae\x6b\x68\xf3\x67\x76\xf5\xb3\xe1\x42\xbd" + "\xe8\x0e\x45\xf5\x53\x97\x81\xaf\xe0\xfa\x44\x87\xfb\x27\xee\xcd" + "\x08\x27\xcf\x6c\xc0\x31\xad\x8e\x33\x7a\x5d\x8c\x66\xb6\x9c\xbd" + "\xb1\x74\x2c\x54\x67\xb5\x8e\xed\x19\x15\xd5\x1a\x68\x53\x6b\x06" + "\x59\x0f\xea\x44\xe2\x33\x1d\xc7\x3f\x29\x35\x75\x5e\xaa\x26\x6c" + "\xa6\x66\xe6\x9c\xe9\x9a\x37\xe6\x2d\x98\x9b\xf6\x64\xd8\xcc\xc1" + "\x84\x38\xf0\x8e\x8a\xcf\xf7\xe3\xb9\xe2\x88\x2a\x43\x29\xc8\x58" + "\x4a\x15\xac\xb7\xdd\xa4\x18\xe8\x6a\x5d\x1b\x5d\x64\x0b\x8a\xd6" + "\xd8\xd6\x86\x15\xe5\x5e\x21\xca\x1c\x35\x7f\x4a\x9f\xf9\x34\xd0" + "\xa0\xfa\x1c\xae\xf7\x06\x0d\x21\x2b\x80\x5f\xf5\x99\x5f\xc1\xb9" + "\x7d\x74\x0f\x8c\x21\x91\x9d\xfb\x4b\x4e\x8d\x72\x77\x4e\x93\xb2" + "\x36\xf1\x12\xd9\xab\x36\x91\x6a\xcd\x25\x52\x86\xe7\xb9\x06\xfa" + "\x6d\x06\xea\x4f\xc6\x67\xa1\x7d\x0b\xff\x67\xb6\xba\xea\xa3\xf8" + "\x1c\xcd\x5d\xf8\xcd\xa0\xfa\x38\x3e\x0f\xde\xaf\xd9\xab\x8c\x28" + "\x40\x9e\xf1\x85\x7a\xeb\xb8\x92\x88\x2a\x3a\xbf\x0b\xaa\x57\x58" + "\x95\xfe\x6f\x96\xaf\x21\x3e\x1b\xd7\x10\x52\x16\x40\xbc\x3b\x0b" + "\xf6\x2d\x33\x7a\xfb\x78\xe3\x78\x41\xd3\xbe\x97\x95\xe4\x57\x70" + "\xae\xd4\x48\x66\xa7\xe0\x39\x98\x57\x66\x77\x78\x81\xdf\xca\x2c" + "\x9b\xfc\x35\x5c\x60\xc4\x66\x1e\xc6\xc2\x12\xea\x1f\xeb\xa7\x03" + "\x7e\x81\x79\xc3\x0f\x8f\xd8\xdc\xa1\xf8\x47\xf1\xdf\xab\x08\xc9" + "\xc1\x79\x0a\xe3\xf1\xa7\xab\x16\x98\xaf\xd1\x45\x5b\xae\x9a\xa0" + "\x1c\xad\xf9\x24\xdd\xa2\x3c\x10\x5d\x45\x34\x2f\xa1\x3c\xf4\xf7" + "\x21\xff\x67\x26\x6f\x7d\x30\x16\x64\xc7\xd6\x3f\x93\x83\xcd\x35" + "\xc4\x37\x81\x78\xd9\xe3\xb7\xa7\x11\x65\x8c\x11\xca\x0b\x88\xb2" + "\x1e\x74\x79\xb4\xb7\xe7\x3c\x85\x36\xf7\x3a\x82\x76\x78\x5e\x99" + "\x12\xb8\xf5\x92\x05\x70\xa9\x6d\x00\xee\xf7\xe6\x54\x4b\x7d\xf0" + "\x9e\x69\x66\xe1\xfb\xd5\x65\xe1\xfb\xd5\x65\xfa\xfd\xca\x84\xdf" + "\xae\xf0\x9b\x55\x56\x22\xcf\xd9\xe6\x6b\x03\x62\x12\xbd\x78\x6c" + "\x13\xbf\x67\x0d\x01\xb9\x9f\x9f\xaf\x1d\xba\x2e\x95\x04\xd6\x9b" + "\xda\x88\xa1\xad\x86\x7c\x90\x4e\x02\xf9\xcb\xc9\x83\x6a\xab\x0f" + "\x10\x7e\x4d\x2e\xd9\x9e\xa3\x1f\x60\x43\x9b\xc7\x65\xf5\x60\xbf" + "\x25\x0a\xb4\xdd\x0f\x5d\x91\x4a\x46\x6f\xbc\x44\xc2\xa7\x9d\xce" + "\xa3\xb1\x9c\x30\xef\x9e\xf5\xb2\x56\x73\xed\xb2\x76\x44\xf7\x7c" + "\xed\xbd\x7e\x26\xf6\xbd\x6b\xca\x2c\x15\xc1\x6f\x5a\x7c\xc1\xff" + "\x8d\xdc\x88\x76\x67\xb3\x89\x58\xfd\x97\xfa\x20\x7f\xc2\x73\x83" + "\xf1\x1b\x49\xee\x22\xa2\xe2\xbe\xd3\x92\xba\x8e\x4b\xe4\x11\xe0" + "\x1b\xfc\x1e\x50\xde\xc2\xbe\x07\xd8\x56\x67\x47\xe2\x37\x81\xce" + "\xf9\x5a\xe5\xa4\x73\xb0\x5e\x15\xec\xab\xec\x0e\xf3\xd7\xec\xd3" + "\x1e\xc7\x35\x21\x5c\x9a\xf7\xff\x98\x7e\x7d\xf3\xfe\x1f\x89\x78" + "\x1f\x7e\x23\x03\x3a\x15\x6d\xb9\x84\x74\x03\xfa\x5d\x32\x29\x9f" + "\x6f\xe5\xad\x75\xad\x9f\x02\x7d\x9a\x64\xf4\xa1\xf4\x4c\xb5\x28" + "\xcf\xcc\x04\xba\x9c\x66\xb4\xaa\x35\x03\x9d\xf6\x60\x1b\x63\x2a" + "\xb7\x02\xad\x41\xe7\x51\xd6\x5a\x8e\xd3\x58\x14\x48\xaf\x2d\xdd" + "\x35\x03\xba\x03\x43\xc2\xf1\x5b\x63\x67\xa8\x7f\x54\x57\x71\xc4" + "\xf2\x6b\x81\x11\xa5\xbd\x7c\x77\x34\x21\xbd\xb2\x67\x11\x9f\xda" + "\xd6\xc3\x84\xd2\xec\x2d\x81\x66\xe8\x9f\xb6\x50\x3b\xd4\xda\xa9" + "\x0d\x58\x07\xb4\xaa\x4f\x33\x92\xf5\x97\x48\xa0\xa1\xad\x09\xbf" + "\xc9\x0c\x7a\xfe\x45\x42\x9e\xff\x84\xe7\xea\xaa\x8f\x51\xfa\x6d" + "\x03\xfa\x59\x81\x7e\xf8\x2d\xd2\x4e\xbf\x74\xa0\xdf\x55\xa0\xdf" + "\x39\x89\x7e\xb6\x4e\xa0\x5f\x27\xd0\x6f\x21\xd0\xcf\xdc\x83\x7e" + "\x3b\xf1\x7b\x25\x7e\x17\x42\xfa\xa1\x4f\x34\xb7\x50\x1b\x4c\xbf" + "\x53\xbe\xa1\x25\x1b\x67\x10\x9f\x87\x2c\x44\x91\xbb\x87\xa8\xa0" + "\x9f\xaa\xfb\x61\x7c\xa1\x3d\xe0\xef\x16\x62\xa8\xb2\x91\xc5\xaf" + "\x92\x7b\x91\x9e\x56\x81\x9e\x06\xeb\xe7\xe4\x6a\xa7\x56\x09\x6d" + "\x46\xae\xbb\x4a\xc6\x4d\x3c\xad\x21\xfb\xe2\xea\x08\xd0\x63\x22" + "\x57\x32\x26\xea\xfa\xe7\xe1\xc1\xe0\xfe\xcf\xc3\xfd\x25\xff\x3b" + "\x0f\xaf\x77\x1e\xee\x8f\x74\x3d\x0f\x0f\x9c\xbd\xbe\x79\x78\xa0" + "\xed\x7f\xe7\xe1\x4f\x69\x1e\x1e\x68\x74\x9e\x87\x76\x59\x21\x35" + "\x69\xce\xf4\x59\x73\x67\xcd\xfd\xad\x66\xc6\xa2\xb4\xa4\xf9\x4c" + "\x62\x90\xc9\x0c\x5a\x1b\x17\xa5\x7c\x0f\xd6\xd3\x83\xea\x26\xb2" + "\xfd\xae\x26\x25\xf7\xba\xda\x9b\x2f\x2a\x89\xe5\x8a\xde\x6f\x7a" + "\x0f\x64\x5f\x9c\xaf\xc5\x20\xd7\x9e\x51\x7c\xeb\xf3\x8f\x60\x90" + "\xf9\x52\xdb\x09\xfe\xcf\xe4\xa5\x57\x1a\x70\x6f\x61\xe9\x5a\xbe" + "\x0d\xf7\x16\x1e\x88\xc6\xb5\xbf\x6e\xd1\xed\xf1\xb0\xae\xbf\xae" + "\x26\x5d\xaf\xc7\x2b\xdf\x3d\x46\x7c\xfc\x9a\xc8\x44\x8e\xe3\x79" + "\x7d\x4e\x3b\xc8\x5a\x8d\xb1\xfa\xd7\xda\x89\x26\xd3\x07\xea\x7e" + "\xfd\x99\x26\x73\x09\x1e\x4b\x34\x99\x05\x27\xe1\x38\x99\xda\x37" + "\x82\xf8\x36\x7e\x6d\x04\xb1\x7d\x3c\x4c\x87\xdf\x14\x37\x06\xf1" + "\xad\xdb\x40\xb6\xdf\xd6\x6d\x51\x2e\xbd\x04\xfc\x91\x7f\x1f\x8f" + "\xdf\x06\xf1\xdb\xe3\xd2\x54\x18\x63\x90\x35\x99\x3c\x78\xe8\x73" + "\x9c\x2f\x2b\xd6\xf2\xad\xbb\xce\x34\x29\xf1\xdb\x28\xce\x21\xb3" + "\xaa\x4d\xb5\x0c\xde\x05\xfa\x69\x5c\x1f\xc4\x37\x9b\x86\x47\x54" + "\x79\x6b\x88\xb2\xb3\xa0\xae\x03\xe4\x92\x4d\x28\x53\x2c\x87\x6b" + "\xef\xc2\x35\xf6\x9d\xee\x90\x8e\x1f\x58\x5b\x85\xb8\x05\xfc\xab" + "\x38\xaf\xa8\x1f\xd3\x05\xef\xb9\x82\xe9\x02\x6d\x96\x92\x88\x52" + "\xeb\x47\xfe\x51\x56\x94\xe3\xc2\xfc\x63\xbb\x87\x47\x2c\xb7\x96" + "\x44\x6c\x9e\xfc\x00\xfd\x1e\x0d\xf5\x0d\x57\xf0\x3d\xae\x05\x86" + "\x15\x41\x7d\xf3\xe5\xc0\xe8\xa2\xcb\xc5\xd1\x9a\x03\x19\x95\x02" + "\x9e\xd5\x27\x3d\x5f\x2a\xe0\x59\x29\xcc\x97\x78\xc0\xb3\xf8\x9e" + "\x78\xc6\xbe\xdf\xdb\x08\xc3\xb5\x3a\x02\x6d\xb5\xe2\x7c\x41\xd9" + "\x70\x2b\x8c\x05\xce\x05\xe4\x79\x8a\x6f\x80\x6d\xe2\xbc\xc0\x39" + "\x83\x18\x46\xe7\xa8\xd3\x1c\xc1\x79\x71\xbb\x89\xa8\x70\x5e\x20" + "\xc6\xe1\xbc\x40\xbf\x98\xf7\xae\xb2\x79\xe1\xd7\x4c\x54\x74\x6e" + "\x58\x6b\xe8\xdc\x40\xbd\xa0\xd6\xea\x84\x6b\x0e\xf3\x62\xa5\x38" + "\x2f\x44\x5c\x03\xde\xb7\xe2\xbc\x58\x28\x9f\x17\xaf\x1f\x57\x11" + "\x8a\x79\x05\x9f\xef\x2c\x83\x79\x51\xaf\x33\x11\x9b\x88\x6b\x30" + "\x2f\x70\xdf\x0e\xc5\xb5\xdf\x09\xb8\x66\x82\xf3\x30\x1f\xca\x67" + "\xcb\x71\xad\xab\xb3\x2f\xf9\xc2\xb0\xe7\xfa\x70\xcd\x40\x75\x08" + "\xa4\x15\xd2\x0d\xe9\x85\x34\xfa\x77\xa2\x0f\xe2\x96\x4d\xe5\x06" + "\xb7\x5c\xd0\x07\xf8\xb9\x03\xfe\xef\x41\x23\xbe\x60\x87\xb7\x23" + "\x76\x21\x66\x21\x7e\x21\x6e\x21\x86\xe1\x3c\x40\xec\xa2\xb8\x05" + "\x98\x0e\xe5\xb6\xba\xe4\x16\x8a\x69\xb9\xa7\x89\x2a\x77\x3c\xb9" + "\x17\x31\xcc\x60\xbd\x42\x10\xd3\x28\xfd\xfc\x25\xfa\x21\x86\xad" + "\x4f\x27\xe3\x26\xcd\xd2\x10\xc4\x2e\x18\xfb\x2d\xfb\xb4\x87\x09" + "\xd5\x07\xf2\x87\xfd\x6a\x63\x00\xcc\xdb\x35\xc4\xbb\x38\x80\xf8" + "\x74\x16\x1c\x2a\xea\xa9\x0b\x1c\xda\x24\xea\x02\x38\x67\x71\xee" + "\x1a\x15\xf5\x54\x87\xd3\xdf\x35\x16\x31\xa8\x8a\x7d\x97\x7e\xd4" + "\xc8\x6c\xe3\xdf\xb2\xdc\x0a\xa0\x47\x4b\x3a\xf4\xa1\x8b\xec\x7b" + "\x38\xe8\xcc\xc3\x43\xdb\xf8\xd5\x6d\x6a\x1c\x4b\x7c\xb7\x69\x0f" + "\x00\xcf\x95\x8c\xd1\xad\xc2\xf1\x29\x01\x7d\xbc\x64\x4c\x86\xc4" + "\x5f\x5f\x87\xec\xcb\x20\x64\x72\x86\xa7\xfc\xf5\xb5\x86\xf6\xe1" + "\x9f\xf1\xc3\xf8\xd7\xe3\xbd\xb9\x7f\xc6\x0f\x00\x5e\x50\xcf\xb3" + "\xe5\x91\xab\x45\xaf\xd4\xe4\x5a\xf9\x36\x4d\x26\x79\x10\x30\x70" + "\xc9\x01\xd0\xbf\x0f\xa4\x11\x62\x88\x4d\x01\xba\xbe\x32\x61\x3b" + "\x67\xf2\x36\x2a\xea\x32\x36\xc2\x38\x03\xb6\x7a\x3b\x62\x2b\xc3" + "\xd1\x3a\x9a\x03\xc0\x52\xf4\x4a\x13\xb6\x15\x53\x43\xfc\x34\xcf" + "\xa2\xbf\x5d\x63\xc8\xa2\x6c\x82\x7b\x48\x07\x9c\x51\x7c\x73\xae" + "\x6b\xcd\xa8\x09\x70\xff\x50\xfe\x9f\x71\x0a\xdd\xb3\xb0\xbe\xbc" + "\x1e\xa7\xc0\xef\xff\x9f\xe6\x94\x2a\x39\x38\xc7\xfc\x89\x4a\x09" + "\x5e\x5f\xd1\xed\x4d\xe5\x28\x0e\xea\xd4\x9b\x4b\xc9\x8a\x74\x1f" + "\x82\xf5\x99\x8f\x5a\x29\xc1\xfa\x2b\x53\x55\xd4\x7f\x80\xde\x67" + "\x2d\x25\x78\xaf\x0d\xce\xff\x27\xe7\x4b\x0a\x33\x03\xc9\x81\xd8" + "\x7a\xda\xc6\x81\xd8\xbf\x13\x6c\x03\x78\x1e\xfe\xdf\x45\x56\xa5" + "\xab\x61\x8e\x97\xc2\xf5\x23\x64\xd5\xf9\x60\x38\x9e\x81\xdf\x55" + "\xd2\xae\xf8\xa6\xe8\x40\x2c\x47\xfc\x96\xfc\x8a\x07\xde\xe5\x0d" + "\xb8\x2f\x31\x87\x0c\x84\xbe\xaf\x33\x34\x15\xc1\x5a\xf7\x75\x1e" + "\xee\x5b\xe7\x73\x5f\xef\xe0\xf8\xd7\xcf\x71\xb9\xaf\x9f\xc7\x67" + "\xdb\xf8\xd7\x2f\xe0\xb3\x57\x66\x6a\x04\x9f\xd5\x52\xea\x5f\xb7" + "\xe2\x6a\x28\xc1\xbe\xe2\x73\xf1\x79\xab\x52\xb5\xc2\x33\x47\xd3" + "\xbe\xe1\x33\xb1\x4d\xc7\x67\x62\x4e\x78\xcd\x2b\xf8\xcc\xc6\x21" + "\x70\xf4\x07\x7a\x2c\x43\x3a\xe0\xf3\x39\x3e\x7e\x00\x9f\x1b\xef" + "\x45\xef\xc9\x68\x73\x75\xcf\x53\xc2\x3d\xcc\xaf\x0e\xee\xe9\x66" + "\xf5\x69\x1b\xb0\xf6\x4d\xc1\xf3\x3f\x8b\xd7\x93\x9e\x34\x6c\xec" + "\x62\x6b\x61\xe3\x7e\xb6\x16\x32\x9a\x52\x5e\x79\x3d\x7e\x00\xd0" + "\x4d\x85\xeb\x26\xb4\xf1\xa1\xbd\x8d\x7f\xc6\x7b\x21\xbd\x91\x6f" + "\x44\x5e\x42\x3e\x12\x79\x88\xf6\x53\x47\x88\x23\xcf\xc0\xff\x3e" + "\x42\x3b\x67\xc5\x76\xa0\x0f\x44\xe4\xa3\x9f\xc1\xf5\x9e\x7c\x74" + "\x64\x8f\xc4\x47\x47\xa6\x5b\x72\x78\x1e\xf9\x48\xff\x5a\x3e\xb4" + "\x73\xf8\x51\xa9\x3f\x71\x0a\xe4\xb1\x7f\x33\xde\x2a\x42\x3a\xfd" + "\x2c\x8b\x04\xb2\xf7\x39\x42\xf3\xe7\xfe\x2c\x4b\x1f\x88\x7d\x15" + "\xdf\x03\xfb\x50\xc8\x69\x88\xf8\x1e\xab\xba\x43\xa1\xdd\xf3\x44" + "\xb8\xe7\x09\x6c\x5b\x1c\x03\xa0\x19\x11\xef\x11\xeb\x17\x72\x5a" + "\xe8\xf7\x68\x7a\x0f\xe3\xb9\x33\x2e\xf8\xe7\xc8\x12\x67\x9e\xbb" + "\x3d\x8b\x80\x20\x0b\xb2\xd3\x6b\x97\xf0\x39\x1b\x58\xdf\x76\xdb" + "\xba\xe1\x19\x40\x03\xa5\x70\xfe\x73\x07\x9e\x10\xda\xb7\xb8\x6a" + "\xff\x94\xac\xfd\x78\x68\x3f\x03\xda\x47\xd9\xec\x35\xb4\x83\x1d" + "\xa1\x39\xb0\x7f\x96\xc1\xda\x17\xf9\x96\x2f\x1a\xa9\xd6\x65\xa2" + "\x8f\xe7\xb7\x9b\x18\x9e\xd6\x85\x60\x3d\xea\x5b\xa4\xe4\x2a\x38" + "\x27\xdf\x22\x47\xdf\xb3\xed\x39\x26\xc1\xaf\xe8\xdb\xb7\xb1\x0e" + "\xe0\xab\x19\x65\xcc\xad\x20\x9f\x49\xbe\x45\xc7\xf0\xfa\x4a\x7d" + "\x7a\x8b\x83\x6f\xd1\xb7\x54\xdf\x37\x2a\xbe\xad\x02\x5d\x52\x09" + "\xe5\x34\x76\xbe\x4e\xe3\x78\x5e\xf2\xdd\x63\xe7\xd1\x2f\x5a\xb0" + "\xbd\x76\xec\xad\x42\xdb\xdb\xb7\x0d\xa2\xbd\xd3\x8d\xae\xea\x81" + "\x0c\xdc\x12\x2a\xc9\xc0\x2d\xa1\xee\x65\xe0\xa6\xec\xde\x65\xe0" + "\x93\x29\x92\x0c\x7c\xbc\x8e\xcd\xfb\xe3\x9f\xb1\x79\x7f\x9c\xc6" + "\x43\x2e\x84\xf6\xac\x7f\x88\xc9\xe3\x3f\x0e\x50\x21\x9f\x97\x83" + "\x4c\xbb\x3d\xbd\x46\xb9\x15\xf4\x64\x9b\xf2\x3e\x7e\x29\x8c\x1d" + "\xc6\x54\x5b\x9a\x09\xeb\xb4\xb5\x91\xd4\x7b\xa3\x0c\x8c\x3e\x5a" + "\xcd\x87\xea\x3b\x2c\x04\xd6\x39\x13\x1b\x97\xa6\xa3\x40\x0b\x2f" + "\x83\xc5\x42\x68\x3d\xb8\x06\xeb\x5a\x2b\xca\xc0\xbb\xb8\x1a\x65" + "\x39\x8c\x29\xfc\xbc\xcd\x81\x31\xb1\x8e\x32\x72\x67\xc1\x51\x1f" + "\xd7\xb2\x71\xf3\x0a\x6b\x81\xa3\x6c\x7c\x74\x32\xca\xc6\x68\x23" + "\x47\x39\x80\x63\x32\x71\x14\xc8\xc7\xb1\x28\x27\xa3\x6c\xcc\xc9" + "\x64\xe3\x7f\xfa\xf7\x2e\x1b\x1f\x5d\xf2\xbf\xb2\xf1\x0f\x95\x8d" + "\xdd\xe9\xfc\xc7\x8e\x5f\x9f\x6c\x7c\xac\xf9\x7f\x65\xe3\x5b\x25" + "\x1b\x1f\xab\x11\x65\x63\x2e\x7f\xd8\x83\x65\x6b\x60\xbe\xda\x65" + "\xe3\xe6\x2d\x3d\x65\xe3\x66\x7d\x4f\xd9\xf8\x68\xb0\x24\x1b\x37" + "\xed\x94\xcb\xc6\x2d\x87\x7b\xca\xc6\xc7\x87\xb8\x93\x8d\x01\x97" + "\x3a\x50\x36\x46\x9e\x42\x39\x19\xe5\x63\xe8\x67\x06\xe3\xaf\xe3" + "\x4f\x5e\x9f\x6c\x7c\x7c\x5c\xff\x64\xe3\xe3\x1b\x5c\xcb\xc6\x4d" + "\x59\xee\x65\xe3\xa6\x2c\xd7\xb2\xf1\xc9\x27\x25\x99\xe6\xe4\xa0" + "\x9f\xbe\x6c\x7c\x62\x8b\x6b\xf9\xe5\xc4\xe7\x4c\x36\x3e\x5e\x76" + "\xe3\x65\xe3\xe3\x65\xae\x65\xe3\x93\x0f\x30\x39\xe2\x78\x45\x4f" + "\xd9\x18\xee\x71\x29\x1b\x9f\x9c\x22\xdc\x53\x26\x97\x8d\x59\x1b" + "\xb0\x26\x2e\x72\x2f\x1b\x1b\x87\xb3\x35\xf2\xe4\x69\xb6\x46\x32" + "\x9a\xf6\x94\x8d\x4f\x7e\xd9\xb7\x6c\xcc\x78\x88\xf6\xd3\xad\x6c" + "\x6c\x1c\xd0\x53\x36\x6e\xca\x72\x2d\x1b\x9f\x3a\x2e\xf1\xd1\xa9" + "\x6c\xb9\x6c\x6c\x9c\xf4\xef\x21\x1b\xbb\xe5\xad\x2d\x72\xd9\xf8" + "\xd4\x3d\x9e\xcb\xc6\xa7\x5e\xf4\x4c\x36\x46\x9e\x73\x25\x1b\x9f" + "\xda\xe0\xcc\x73\x72\xd9\xf8\xd4\x17\xae\x65\xe3\x53\x87\xe4\xb2" + "\x31\xb6\xef\x4a\x36\x3e\x65\x93\xb5\xdf\x43\x36\x6e\xb9\x53\x2e" + "\x1b\xb3\x7a\x92\x6c\xdc\xa2\x17\xe4\xad\x30\xcf\x65\xe3\x96\x0f" + "\x7b\x97\x8d\x5b\x3e\x91\xcb\xc6\x2d\x59\x4c\x06\x6e\x69\x64\xb2" + "\x71\x4b\x11\x3b\xdf\x14\xea\x78\x5e\x92\x8d\xd9\xf9\x9e\xb2\x71" + "\x4b\x47\x1f\xb2\x71\x54\xff\x65\xe3\x73\xd6\x1a\xbb\x6c\x7c\xce" + "\x2a\xca\xc6\x98\xe3\xa7\x0c\xe4\xcd\x32\x2a\x1f\x1f\x20\x07\x66" + "\x62\x7f\xbe\xdb\xd0\xbb\x7c\xfc\xaf\xd1\x92\x7c\x7c\x36\x9b\xcd" + "\xfd\xb3\xd3\xd9\xdc\x3f\x1b\x62\xb7\x11\x83\x6c\x8c\x32\xb2\x60" + "\x23\x6e\x5c\x01\xbf\xed\x99\x35\x54\x3e\x46\xff\x75\x94\x91\x51" + "\x3e\x46\x39\x19\x65\xdf\xba\x65\x84\xd4\x9b\x2c\xe8\xd3\xd1\xa0" + "\xbf\x17\xc7\xf5\xec\x10\x90\xab\x8d\xb0\xb6\x35\xc0\xbd\xc6\xed" + "\x97\x2c\xb8\x17\xa2\xb9\xb0\x05\xee\x31\xb2\x7b\xe0\x7a\x13\xde" + "\x03\x75\x9a\x19\x2d\xda\x66\xb1\xf5\x53\x94\xaf\x5b\xc7\xc8\xe4" + "\x6b\x56\xb7\x51\x94\xaf\x37\x40\x1f\xe0\xe7\x8d\xb2\x35\xca\xd8" + "\x20\x5b\xd7\x6e\x58\xcb\xd7\x94\x07\xf1\xd5\x9d\x05\xad\x29\xa2" + "\x8c\xbd\x12\xce\x15\xc2\x39\xe8\x47\x43\x75\x05\x21\x5f\x5e\xd2" + "\xa3\xec\x60\xdc\x70\x86\x78\x03\xcd\x9a\x96\xc2\xf3\xf1\x7e\xb8" + "\xa7\x42\xbc\x07\xd6\xf7\x5a\x26\x93\xb7\x69\x39\x99\xbd\xba\xf5" + "\x9c\x5d\x26\x87\x71\x42\x7b\x38\xe6\xce\xa2\x72\x79\x98\x7f\xac" + "\x55\x94\xcb\x87\x3b\xca\xe5\x67\x3e\x11\xe5\x72\xdc\x83\x64\x97" + "\xcb\xd3\x44\xb9\xfc\xf4\x9d\xd7\x29\x97\x37\xfe\x54\xe4\x72\x5f" + "\x85\xc2\xdb\x37\x91\xc9\xe5\x65\xe9\x37\x46\x2e\x47\x99\x1c\xe5" + "\x70\x94\xc9\x51\x46\x47\xb9\x1c\x65\x74\x4e\x90\xcb\xcb\x1d\xe4" + "\x72\xce\x41\x2e\xe7\x64\x72\xf9\x99\x05\xd7\x27\x97\x9f\x49\xbb" + "\x01\x72\xf9\x2d\xa5\xcf\xad\x90\xcb\xb5\x4e\x72\x39\xca\xe1\x30" + "\xf7\x5a\x51\x3e\x37\xe8\x61\x6c\xde\x02\x19\x1d\xe4\xf3\xbe\x65" + "\xf3\x33\x89\x8e\xb2\x79\x79\x80\xa3\x6c\xde\x36\xa1\xa7\x6c\xde" + "\x96\xe0\x20\x9b\xd7\x1a\x15\xad\x95\x14\xf7\x61\x7e\xeb\x67\xa0" + "\xdc\xdd\x1a\x2c\x97\xcd\xcf\x6f\xed\x29\x9b\xb7\x7d\xe2\x52\x36" + "\x67\xfa\xb7\x5c\x36\x1f\x3e\x26\xcd\x6a\x97\xcd\xdb\x8e\x5e\x9f" + "\x6c\xde\xd6\x24\xe9\x0e\xdf\xb5\xb1\xf5\xa5\x2d\xc3\x9d\xbc\xde" + "\xa9\x72\x94\xd7\xcf\x4e\x92\xe4\xf5\x34\x07\x79\xfd\xbb\x32\xf7" + "\xf2\xfa\x77\x54\x3e\xe4\x54\xaf\x34\x61\x5b\x28\x67\x01\x56\xb6" + "\x6a\x52\x51\xd6\x6a\xb7\xa1\xac\x05\xf8\xd4\x8a\x7e\xd1\x50\xde" + "\x2f\xca\xed\x54\xbf\x44\xd9\x3d\xf3\xa7\x28\x5f\xb5\x27\xbb\x96" + "\xaf\xda\x17\xa0\x1c\xc3\xf6\x9c\x9e\x9d\x08\x63\xf2\xff\xd8\xfb" + "\xfe\xb8\x28\xea\xfc\xff\x37\xb3\xab\xae\x86\xb0\x28\x78\x58\x68" + "\x0b\xac\xb6\x16\x26\x16\x75\x5a\x7a\xa9\xa7\x17\x76\x2a\x58\xea" + "\xe1\xaf\x44\x05\x0f\x0d\x09\x15\x15\x8d\x5f\x9a\x1a\x2a\x22\x16" + "\x98\x16\x8a\x76\xd8\xe9\x9d\x1a\xf5\xd1\x3b\xeb\x34\xb1\xf4\x0e" + "\x0b\x01\x3b\xbd\xa3\x4e\xaf\xcd\xc8\x03\x43\x5d\x11\x65\x81\xdd" + "\x9d\xef\xeb\x3d\xef\x59\x66\x67\x77\x66\xd9\x99\x45\x82\xbe\xfe" + "\xb1\x0f\x71\xe6\x3d\xef\x79\xcf\xeb\xf9\x7c\xbf\xdf\xcf\xe7\x7b" + "\xde\xf3\x7e\x57\xb5\xad\x7e\xaf\x99\x20\xac\xdf\xaf\xd5\x10\xad" + "\x53\x13\x89\x71\xe1\xeb\x77\xb8\x46\x50\xbf\xff\xd8\x8f\xbd\x66" + "\x02\x5f\xbf\x93\x3c\xa0\xcf\x1e\x2e\xae\xdf\x7f\xbc\x48\xfa\xf0" + "\x1f\xf7\x91\x3e\x9c\x60\xec\xa8\xdf\x7f\x4c\xb5\xd5\xef\x18\x7f" + "\x47\xfd\x4e\x38\xc5\x94\x53\x54\xbf\xff\x78\xc6\x51\xbf\x7f\x9f" + "\x8f\xf5\xbb\xc9\x86\x57\xf9\x98\x57\xf3\x30\xaf\xae\x1f\xc5\xbc" + "\xc2\xfd\xa4\x66\x01\xe6\xd5\xf5\xa9\x46\x8b\x55\xc7\x6f\x82\xfc" + "\x6a\xfd\xec\x75\x3c\x6e\x2f\x9c\xf1\x2c\x71\x29\xea\x8f\xb9\x86" + "\x79\x66\xc5\x0d\xa7\xc7\x7c\xbb\xb7\x5c\xab\xbd\x20\xcc\xb5\xda" + "\xef\x18\x9c\x59\xae\xe1\xf1\x44\xa2\xeb\x99\xe7\xbb\x23\x4d\xd7" + "\xe3\x6b\xae\x0f\x92\xa6\xeb\x31\x17\x85\x74\xfd\xf5\xe5\xf6\x5c" + "\xe4\xeb\xfa\xeb\xdb\x84\x75\xfd\xf5\x03\x7c\x5d\x8f\xf3\x17\xd2" + "\xf5\xd7\x2f\xf2\xf2\x77\xd0\xf5\xd7\x6f\xf1\x75\x3d\x49\xc7\xe9" + "\xfa\x1b\x3b\x48\x5b\xfc\xfd\x68\xe9\xba\xfe\xc6\x2a\xb6\x7d\x27" + "\xba\xfe\x8a\xbd\xae\xbf\xb1\x86\xaf\xeb\x6f\x4c\x21\xed\xeb\x8d" + "\x83\x46\x46\xd7\xdf\x88\x23\xc7\xbf\x1f\x65\x7b\x9c\xd3\xf5\xe4" + "\xb8\xd1\x56\xd7\x17\x63\x5d\x7f\xe3\x74\x2b\xba\x3e\xd2\x75\x5d" + "\xdf\x34\x96\xd3\xf5\x4d\x63\x9d\xeb\xfa\x9b\xcb\x9d\xeb\xfa\x86" + "\x0c\x4e\xd7\xdf\x39\x4f\xda\x84\x3b\x47\x49\x9b\x70\x87\xd1\x40" + "\x50\xaf\xb8\x71\xef\x25\xcc\x1c\xeb\x92\xc3\x75\x25\xd4\x07\x4b" + "\xd9\x71\xef\xbb\xa0\xe9\x57\x80\x3e\xaf\x27\xfa\x1c\xda\xcc\xd3" + "\x58\xd7\x63\xfd\x4d\x34\xfd\x9d\xb9\x70\x4c\x0f\x31\x3f\x0d\x79" + "\xe9\x0f\xae\x2e\xa6\xf0\xdc\x2a\x9c\x16\xea\x7b\x65\x16\xf4\x23" + "\x70\xbc\x12\xd2\x14\xe3\x6b\xe0\xd8\x85\xe2\xa5\xcc\x75\x13\xb1" + "\xf6\x87\xeb\x8a\xe1\xfc\x25\xbb\xeb\x2a\xf0\x75\x65\xc9\x8c\xb6" + "\xaf\x20\xd8\xd5\x1f\x82\xe3\xa5\x9c\x0f\x30\x8c\x66\x7c\x40\x3d" + "\xeb\x03\x20\x2d\xe4\x55\xc2\xf8\x80\x79\xe0\x03\xa0\xdc\xf0\xb3" + "\xf5\x01\xc7\xc1\x07\x1c\x03\xdf\x72\xa4\x61\x83\x21\xc9\xc6\x07" + "\x1c\xc3\xba\x1f\x7b\x00\xac\xfd\xa1\x5f\x3b\x82\x7d\xc1\x89\x26" + "\x3d\x05\x18\x5f\x00\x1f\x50\x89\xaf\xb7\xb9\xb6\xc8\xf6\x5a\x9c" + "\x1e\xca\x58\xcc\x78\x08\xd0\x73\x50\x86\x4b\xbb\xae\x30\x1e\xa2" + "\x14\xae\xad\x20\x1e\xc2\x50\x65\xe3\x21\x8e\x13\x0f\x51\x1f\xcf" + "\x1f\xd7\xbf\x35\x54\xba\x87\xa8\xbb\xee\x7c\x6c\xff\xd6\x6c\x29" + "\x1e\x02\x9e\xbb\xc4\xaa\x53\x1d\xe6\xf1\xe1\x79\xe6\xa0\x55\xb1" + "\x2e\x75\x3a\x1f\x8c\xd5\xac\x58\xa3\x62\x7d\x8a\x75\xaa\x4b\x1a" + "\x15\xca\x5f\x6a\x6c\xc3\xb1\xfd\xae\xe0\x21\x56\x88\x7b\x08\xab" + "\x7f\x60\xc6\xf4\x59\x0f\x01\x75\x8c\xf1\x10\xf9\x6b\x6d\x3c\x44" + "\x57\x1b\x0f\xe1\x61\xeb\x21\xea\x3e\x96\xe7\x21\xea\x8e\xb5\x81" + "\x87\x28\xb9\xef\x21\xe4\x7a\x88\xba\xc2\x16\x0f\x41\xb1\xe3\xfb" + "\xbd\xac\x1e\xa2\x3e\xcb\xd1\x43\xd4\xef\xb1\xf1\x10\xc7\xf5\x1e" + "\x86\x7a\x46\x9f\x33\xfe\xc1\xa0\xe5\xfb\x87\xa6\x3b\x8e\xfe\xa1" + "\xbe\x46\x9e\x7f\xb8\xd3\x57\x9e\x7f\xb8\xe3\x4f\xca\x87\xdf\x4d" + "\xde\xac\x27\xfd\x58\xfd\x31\xce\x53\xdc\x3c\x6e\x7b\xac\x75\x4f" + "\x71\x67\xaf\xb0\xa7\xb8\x99\x24\xee\x29\x6e\x26\x89\x7b\x8a\x86" + "\xc9\x58\xfb\x61\xff\x00\xf9\x83\xf6\x6b\xe8\x67\xfb\x2e\x20\xab" + "\x15\x9d\x67\xef\x27\x12\xe7\x11\xff\x71\xef\x75\xde\xdd\xe3\xc2" + "\x3a\xef\xee\x59\xac\xa1\x4c\x8c\xce\xbb\xb3\x27\xbf\xcd\x3d\xc5" + "\x9d\x3d\xc2\x9e\xa2\x61\x24\xd1\x59\x77\x0a\x1d\x3d\x05\x5c\x23" + "\xe8\x29\x1a\x96\xb0\xd7\xec\xe1\x7b\x0a\x92\x07\xe8\x85\x2d\xe2" + "\x9e\xc2\x38\x88\xe8\x87\x86\x46\xa2\x1f\x08\xc6\x8e\x9e\xa2\xc1" + "\x76\xfc\x57\xc4\x53\x10\x4e\x31\xe5\x14\xf5\x14\xc6\xbe\x8e\x9e" + "\xe2\x66\x12\xf6\x14\xc2\xbc\x6a\x34\xf3\x79\xd5\xb8\x8b\xef\x29" + "\x8c\x0b\xed\x3d\x45\x27\xe4\xda\x71\xee\xfd\x00\x7e\xa6\xc6\x91" + "\xd2\x7d\x44\xe3\x12\x69\x3e\x02\xf3\x4f\xc8\x47\x34\x9e\xb0\xe7" + "\x1f\xdf\x47\x34\x7e\x2d\xec\x23\x1a\x6f\xf1\x7d\x04\xce\x5f\xc8" + "\x47\x34\xf5\xe3\xe5\xef\xe0\x23\x9a\x86\xf3\x7d\x04\x49\xc7\xf9" + "\x88\x26\xb6\x4d\xbe\xd9\x57\xba\x8f\x68\x3a\xe5\xdc\x47\x34\x9d" + "\xe5\xfb\x88\xa6\x7c\xd2\xa6\x36\xd5\x13\x1f\xd1\x54\x44\x8e\xdf" + "\xf4\xb7\x3d\xce\xf9\x08\x72\xdc\xd1\x47\x34\x7b\xb6\xe2\x23\x3c" + "\x4d\x85\x3e\xa3\x9a\xb4\x3e\x91\xcd\xbe\x63\x13\x1f\xab\x7a\xce" + "\xdc\xb2\x67\x40\x34\x68\x85\x4b\xa0\x1d\xe6\x22\x0a\x7f\x77\x9f" + "\x76\x1e\x34\xc1\x5c\x32\xdf\x1f\xeb\x82\xc3\x2b\xb0\x8e\x2b\xee" + "\x82\xd7\x38\x6c\xca\x0d\x0c\x35\x85\xf8\x46\x63\x7d\xd0\x58\xe8" + "\xa3\x31\xe6\x86\x65\x36\xe2\xb9\xfe\xf1\x88\x9a\x53\x2b\xac\xed" + "\x5e\xbb\x44\x5b\x80\xf3\xaa\x88\x59\x44\xd7\x9d\x8b\xfb\x81\xe1" + "\x31\xd6\x0c\xf8\x7b\x8c\xf2\xfa\x4a\x46\x43\x78\x46\x8f\x42\xf9" + "\x69\xc8\xb7\x67\x2d\x52\xf7\xf4\xf0\xe8\xfa\xc2\x45\x84\xcc\xa0" + "\x1f\xc6\x0d\xa2\x2d\x8f\xc5\x8c\xc2\xeb\xec\x78\x11\x0d\x71\xac" + "\x8b\x89\xd5\x10\x9b\xef\xa2\x90\x5d\x78\x7c\xf8\x1c\xa7\x1d\x1a" + "\xad\xda\xce\x46\x37\xcc\xbe\xae\x46\xbb\xd6\xf2\xe7\xfa\x37\x6f" + "\xe3\x74\x03\xd6\x0c\xf4\x1c\xd0\x76\x46\x32\x5f\x63\xf5\x64\x32" + "\xd7\x3f\xa4\x0a\x51\x05\x2f\x23\x55\x69\xf4\x15\x3c\xf6\xe3\x5f" + "\x5a\xb5\x0f\xad\x1a\x8f\xfa\x9b\xb0\x4e\x00\xad\x57\x5a\x95\x87" + "\xf0\x1a\x82\xf9\xa0\x15\x76\xdc\x45\x23\x70\x7f\x3c\x61\x2e\xd1" + "\x0b\xa4\x2f\x36\xed\x3b\xa3\x3b\x83\xa4\x6b\x3d\x13\xb3\x7e\x80" + "\xe8\xb7\xb6\x85\xa0\xeb\xb5\x3e\x1a\x33\x60\x49\xd6\x8e\x1c\x5e" + "\x64\x79\x2f\x32\xe7\x30\xf0\xf0\xcf\x57\xaa\x3d\xf0\x3a\xd8\x78" + "\x4f\x48\xcb\x41\xdf\x68\x1e\x36\xcd\x2c\x36\xcd\x04\x1b\x8c\xcb" + "\xcb\x89\x08\xaf\x39\xe8\x85\x31\x29\x37\x56\x22\xcb\x6b\xd6\x7d" + "\x21\x43\xd1\x6e\x0b\xc1\xc3\xdc\x1c\xd7\xdd\x02\xb1\xc7\x6b\x6b" + "\x01\x1f\x18\x0d\x97\x85\xf7\x8a\x5c\xe3\xd1\x13\x6b\x38\xe0\x77" + "\x8f\x82\x26\xc0\xe1\x3b\x82\x03\xbd\x56\xcd\xfc\x6b\x7a\x4d\xa7" + "\x81\xbc\x83\x9a\x9b\x01\x0b\xa3\x03\x16\xc3\xf0\x9e\x92\x78\xdd" + "\x3b\xd3\x36\xb2\xb6\x1f\x83\xc5\x6b\xba\x00\xbc\x2e\x06\xf3\xbd" + "\x4c\xb3\x0e\xb7\x97\xea\xdd\x57\xf1\x77\x3e\x04\x03\x33\x1b\x7b" + "\xbc\xbf\x24\x8e\x37\xd6\x67\xe5\xa0\xcb\x98\xef\x57\x36\x34\x6b" + "\x9a\xf7\xf9\x68\xf0\x5c\x9a\x1b\x1e\x16\x99\xf3\x7f\x2d\x9a\x9f" + "\x3e\xf6\x9a\x4e\x18\x7b\x53\x2d\x17\x7b\x7a\x97\xbc\xd8\xd3\xf9" + "\x3f\x7d\xec\xd5\x9d\x30\xf6\x96\xb8\x96\xd8\x53\x1e\xf2\xf4\x3f" + "\xe5\xe1\xef\x2c\xf6\x78\x1c\xca\x3a\x06\x65\x1d\x7f\xc2\x7d\x1c" + "\xe3\x55\x28\x55\x45\xcb\x7c\x4b\xf8\xdb\x76\xbe\xe5\x97\xa7\xf1" + "\xf7\xe7\xec\x7c\x4b\xca\xe3\xba\xd3\x71\x27\xaa\xab\x7f\xcb\xb8" + "\x13\xa5\x5c\xc5\xe8\x46\x4a\x39\x9b\xd1\x8d\x94\x92\x99\xd3\x90" + "\x7a\x19\x51\xa6\x81\xbd\x13\x0f\x27\x14\x53\xf8\xdb\xa3\xc3\x37" + "\x8c\x54\x56\x1d\xe8\x40\xea\x61\x1a\x8f\x03\x6d\x59\x8a\x98\xf5" + "\xf2\x12\x17\xa0\x87\xaf\x51\x8a\x3c\xbc\x96\xd8\xa7\x37\x8a\xa9" + "\x1c\x9c\x26\x28\x32\xe7\xe0\x83\x06\x0f\xdc\xb7\x1d\x4e\x30\x52" + "\x56\xbe\x58\xbf\x31\x84\x18\x46\x9a\xfd\xc6\x26\xde\xde\xe7\x33" + "\xca\x3a\x27\xd2\x74\xc8\x37\x5a\x90\x43\xf8\xdb\x45\xe0\x11\xe6" + "\x0c\xfe\xd6\xd0\xca\x27\xcc\xa3\x32\x63\x35\xc2\x7b\xe5\x78\x57" + "\x23\x35\x0d\x1c\x9a\x79\x00\xf0\xb5\xe5\x51\x8e\x08\x8f\x76\xf2" + "\x79\x74\x9b\xe5\x11\xf0\x89\xe3\x51\xcb\x77\x6b\x47\x8f\x4b\xe2" + "\x51\x2d\xcb\xa3\x6d\x76\x3c\xba\xae\x41\x5f\x5e\xba\xcc\xf2\x88" + "\xae\x32\x0d\xb0\xf2\x48\x31\xf7\xcc\x2c\xe0\xd1\x2c\xa9\x3c\x52" + "\x44\xf3\xbc\x2d\xd5\x3d\xd5\xc1\xdb\x52\x8a\x33\xf6\xde\xd6\xea" + "\x65\x6f\xfb\x0d\x4f\xbc\x9d\x37\x3c\xa9\xde\x8f\xf5\xb3\x94\xa2" + "\x46\x1e\x9f\x15\xd5\x2e\xcd\x55\xa3\x94\xe3\xed\xe7\xaa\xfd\x19" + "\xfb\x54\xca\xc3\x80\xb9\x26\xe8\x53\xd9\x73\x0e\x73\x8c\xa8\x2e" + "\x35\x2d\x73\x8c\xa8\x2e\x47\x3b\xfc\x5c\x35\xaa\x4b\x94\xa0\x5f" + "\xa0\xba\xcc\x65\xe6\xaa\x51\xca\xf0\x36\x9f\xab\x06\x79\x0a\xfa" + "\x52\xaa\x0b\x19\xff\xa7\x94\x13\x1c\xe6\xaa\xe1\x6b\x84\x7c\x29" + "\xd5\xb5\x3b\x7b\x4d\x38\xcf\x97\xb2\x79\x40\x7b\x32\x40\xd4\x97" + "\x52\x5d\x4f\x91\xf6\xa5\xeb\x36\xd2\xbe\x10\x4c\x1d\x7c\x29\xd5" + "\x75\xa1\xad\x2f\x15\x9c\xab\xc6\x72\x88\x29\xa7\x98\x2f\xa5\xba" + "\x7e\xe8\xe0\x4b\x29\x8f\x5a\xc1\xb9\x6a\x94\x6a\x23\xc7\x23\xd5" + "\x20\xde\x5c\x35\xaa\x6b\x63\xa7\x98\xab\x26\xce\xad\x28\xde\x5c" + "\x35\xaa\xdb\x59\xc9\x73\xd5\xa8\x6e\x66\x49\x5e\x94\xe1\x9c\x80" + "\x17\xa5\x54\xe3\xed\x39\xc7\xf3\xa2\x94\x2a\x56\xd0\x8b\x52\xaa" + "\x54\x9e\x17\x65\xf2\x17\xf0\xa2\x94\xea\x00\x2f\x7f\x7b\x2f\x4a" + "\xa9\xce\xf0\xbc\x28\x9b\xae\xc5\x8b\x52\xdd\xe3\x48\x1b\xea\x91" + "\x27\xd9\x8b\x52\xdd\xc7\xe3\x34\x87\xde\x21\xef\x8c\x78\x3e\x94" + "\xea\x3e\x99\xe7\x43\xa9\xee\x64\x3e\x1a\xd5\x3d\x85\x99\xa7\x46" + "\x75\x1f\x46\x8e\x7b\xe4\xda\x1e\x6f\xf1\xa1\xec\x71\x3c\x4f\x8d" + "\x99\x9f\xb6\xa9\x7b\x96\x34\xff\x39\xa4\x03\xfa\xcf\x50\x27\xfe" + "\x33\xb4\x73\xfa\x4f\xea\x81\x01\xb2\xfc\x27\xf5\x80\xe8\xfa\xdf" + "\xf7\x3d\x90\x13\x1d\xbe\xa9\xfb\x1e\x4e\x87\x7b\xee\x95\xa7\x5b" + "\x3c\xf7\xfc\xf4\xb1\xef\x84\x1e\x68\xd3\x03\xf1\x5c\xec\xbd\xfa" + "\xc9\x8b\xbd\x57\x80\x7c\x0f\xe4\x77\x81\xf3\x40\x7e\x17\xc4\x3d" + "\x90\xd7\x2d\xe7\x1e\xa8\x77\x00\xe7\x81\x7c\xc8\x9c\x5a\xca\x87" + "\xcc\xa9\xa5\x7c\x02\xa5\x7b\x20\xf5\xce\xfb\x1e\x48\x82\x07\xda" + "\xe4\x59\xcd\x79\x20\x75\xac\x3c\x0f\xa4\x8e\xe1\x7b\xa0\x3e\x6b" + "\x1c\x3d\x90\xfa\xac\xeb\x1e\x48\x7d\x5d\x1e\x9f\xd5\xb5\xae\x79" + "\x20\x9f\x89\xc2\x1e\xc8\xab\x5e\xdc\x03\x91\x73\x8e\xda\xb5\xd7" + "\x75\x4e\xbb\xf6\xfa\xb8\xe3\x7b\xa0\x5e\xb3\x84\x75\x6a\xaf\x58" + "\xe2\x81\x7c\x26\xb4\xbd\x07\xf2\x11\x9e\xef\x47\xf5\xfa\x9a\xe8" + "\x45\x9f\x48\x47\x0f\xe4\x23\x3c\xdf\x8f\xea\xdd\x93\xbd\x86\x3f" + "\xdf\x8f\xcd\x03\xda\x93\x41\xe2\x1e\xa8\xf7\x19\xd2\xbe\xf4\x26" + "\xeb\xba\xb0\x98\x3a\x7a\xa0\xde\x8b\x5b\xf7\x40\x84\x43\x4c\x39" + "\x45\x3d\x50\xef\xa3\x8e\x1e\xc8\xcb\x20\xec\x81\xfc\xb6\x70\x3c" + "\xf2\x1b\xcc\xf7\x40\xbd\xcd\x9d\xc3\x03\x89\x72\x6b\x16\xdf\x03" + "\xf9\x9e\x93\xee\x81\xfc\x3c\xa4\x79\x20\x1f\xe1\x79\x7d\x94\xdf" + "\x44\x7b\xce\xf1\x3d\x90\xdf\x42\x61\x0f\xe4\xb7\x86\xef\x81\x7c" + "\x84\xe7\xf5\x51\x7e\x87\x78\xf9\x3b\x78\x20\xbf\xb3\x7c\x0f\x44" + "\xd2\x71\x1e\xa8\x4f\x3c\x69\x43\xbd\x76\x4a\xf7\x40\x7d\x26\x8a" + "\x7b\xa0\x3e\x53\xf9\x1e\xa8\x8f\x8e\x78\x9d\x3e\x19\xc4\x03\xf5" + "\x19\x41\x8e\x7b\xed\xb0\x3d\xce\x79\x20\x72\x9c\xf3\x40\x7d\x72" + "\xa4\x79\xa0\x87\x3b\xa0\x07\xd2\x38\xf1\x40\x9a\x4e\xea\x81\xfc" + "\x07\xc9\xf3\x40\xfe\xba\xfb\x3a\x5c\x8e\x0e\xef\x53\xc8\xe9\xf0" + "\xbe\xfb\xe4\xe9\x96\xbe\x4e\xdf\x7f\x3a\xd7\xe1\x81\xb3\x38\x1d" + "\x1e\x38\x4b\x5c\x87\x3f\xe8\x7c\xfd\x33\xaa\x7f\x21\xa7\xc3\xfb" + "\x75\x21\xfd\x64\x40\x0d\xe9\x27\x03\x0e\x48\xd7\xe1\x01\x81\xf7" + "\x75\xb8\x14\x1d\xee\x9f\xc8\xe9\xf0\x87\xae\xcb\xd3\xe1\x0f\xd5" + "\xf2\x75\x78\x50\x77\x47\x1d\x1e\x30\xd9\x75\x1d\x1e\xb0\x5c\x1e" + "\x9f\x03\x92\x5c\xd3\xe1\x01\x17\x85\x75\xf8\x83\x29\xe2\x3a\x9c" + "\x9c\x73\xd4\x4f\xfd\x97\x73\xfa\xa9\xff\xe8\x8e\xaf\xc3\xfb\x55" + "\x09\x6b\xa5\x7e\xd7\x89\x0e\x0f\xb8\xd0\xf6\x3a\x3c\xe0\x82\xb0" + "\x0e\xef\x3f\x97\x68\x96\x80\x4a\x47\x1d\x0e\xd7\x08\xea\xf0\xfe" + "\x79\xec\x35\x17\xf8\x3a\x9c\xe4\x01\xed\xc9\x87\xe2\x3a\xfc\xe1" + "\x89\xa4\x7d\x79\xb8\x1f\x69\x5f\x08\xa6\x8e\x3a\xbc\xff\x9d\xd6" + "\x75\x38\xe1\x10\x53\x4e\x51\x1d\xfe\xf0\x48\x47\x1d\xfe\xa0\xf0" + "\x9a\x52\x54\xa0\x1f\xc7\x23\xcd\x51\xbe\x0e\x7f\x78\x7d\xe7\xd0" + "\xe1\xa2\xdc\xaa\xe2\xeb\x70\xcd\x54\xe9\x3a\x5c\xb3\x51\x9a\x0e" + "\xc7\x9c\x13\xd2\xe1\x9a\x8b\xf6\x9c\xe3\xeb\x70\xcd\x2d\x61\x1d" + "\x1e\xd8\x9d\xaf\xc3\x71\xfe\x42\x3a\x3c\xf0\x29\x5e\xfe\x0e\x3a" + "\x3c\x70\x32\x5f\x87\x93\x74\x9c\x0e\x0f\xac\x27\x6d\xe8\x83\xd2" + "\xd7\x94\xa2\x02\x2f\x8a\xeb\xf0\xc0\xcb\x7c\x1d\x1e\x58\x44\xf4" + "\x76\x90\x8a\xe8\xf0\xc0\xd3\xe4\xf8\x83\x1a\xdb\xe3\x9c\x0e\x27" + "\xc7\x39\x1d\x1e\xe4\x2f\x4d\x87\x7b\x77\x40\x1d\xae\x76\xa2\xc3" + "\xd5\x9d\x54\x87\x07\x7f\x28\x4f\x87\x07\x17\xc9\xd7\x82\x8f\xc5" + "\x71\x5a\xf0\xb1\x38\x71\x2d\xa8\x5d\xef\x5c\x0b\xea\x8a\x38\x2d" + "\xf8\x88\x0f\x69\xab\x07\xde\x21\x6d\xf5\xc0\xa3\xd2\xb5\xe0\xc0" + "\xc1\xf7\xb5\xa0\x14\x2d\x18\x14\xc2\x69\xc1\x01\x8d\xf2\xb4\xe0" + "\x00\x23\x5f\x0b\x86\xf8\x39\x6a\xc1\x81\xb3\x5d\xd7\x82\x03\xd7" + "\xc8\xd3\x82\x03\x33\x5c\xd3\x82\x03\xbf\x13\xd6\x82\xda\x4c\x71" + "\x2d\x48\xce\x39\xf6\xe1\xba\x35\x5c\x1f\xae\x9b\xd8\xf1\xb5\xe0" + "\x23\x06\xe1\xfe\xfa\x91\x46\xa2\x05\x07\xea\xdb\x5e\x0b\x0e\xd4" + "\x0b\x6b\x41\xdd\x62\xd2\x6f\x0e\xac\x72\xd4\x82\x70\x8d\xa0\x16" + "\xd4\xed\x65\xaf\xd1\xf3\xb5\x20\xc9\x03\xda\x93\x13\xe2\x5a\x70" + "\xd0\x74\xd2\xbe\x0c\x1a\x44\xda\x17\x82\xa9\xa3\x16\x1c\xe4\xd1" + "\xba\x16\x24\x1c\x62\xca\x29\xaa\x05\x07\x8d\x77\xd4\x82\xda\x75" + "\xc2\x5a\xf0\x31\x6e\x9d\x5a\xea\xd1\x53\x7c\x2d\x38\x68\x5b\xe7" + "\xd0\x82\xa2\xdc\x32\xf0\xb5\xe0\xa3\x73\xa5\x6b\xc1\x47\xf3\xa4" + "\x69\x41\xcc\x39\x21\x2d\xf8\xe8\x77\xf6\x9c\xe3\x6b\xc1\x47\xcd" + "\xc2\x5a\xf0\x31\x3f\xbe\x16\xc4\xf9\x0b\x69\xc1\xc7\x46\xf3\xf2" + "\x77\xd0\x82\x8f\xcd\xe6\x6b\x41\x92\x8e\xd3\x82\x21\x88\xb4\xa1" + "\xda\xc1\xd2\xb5\xe0\x63\xdf\x89\x6b\xc1\xc7\x6a\xf8\x5a\xf0\x31" + "\xf2\xcd\x19\x15\xe2\x4b\xb4\xe0\x63\x15\xe4\xb8\x36\xc4\xf6\x38" + "\xa7\x05\xc9\x71\x4e\x0b\x86\x68\x5b\xd3\x82\xce\xf5\xc3\x93\xc5" + "\x9c\x7e\x78\xb2\xd8\x56\x3f\x9c\xe5\xe9\x87\x90\x33\xce\xf5\xc3" + "\x50\x15\xa7\x1f\x86\x2c\x24\xf5\x7b\xc8\x44\x52\xbf\x87\x30\x6b" + "\xf8\xa5\x4e\x84\x7e\x1e\xf4\xc3\xa1\x6b\x45\x44\x3f\x5c\x33\x52" + "\x9b\x6f\xb0\xfa\xa1\x16\xa9\xb2\x12\x58\xfd\xf0\x32\xd6\x0f\x8f" + "\xaf\xc7\xfa\xc1\x33\x1f\xb4\x6a\x15\xab\x5d\x13\x41\xbb\x56\xc1" + "\xff\xa1\xee\x7c\x0a\x79\x94\x81\xbe\xcc\xc1\xd7\xe3\x7d\x1b\x20" + "\x2f\xe6\x5b\x4e\xe6\x3b\x4f\x7d\x17\xbc\x1f\x10\xd6\x16\x78\x7f" + "\x8d\x56\xf7\xd6\xa8\x62\xf7\xd6\x88\xe1\xef\xad\x81\xf7\xd4\xc0" + "\xfb\x6b\xe4\x2f\x45\xbe\xef\xb2\x9a\xc2\x6b\x8d\x87\x17\xde\x5f" + "\xc3\xab\x9e\xe8\xd3\x43\x96\x12\xa2\x4f\x97\xf9\xf7\x00\x2d\x14" + "\xb2\xbb\x8e\xd3\x12\x6f\x61\x1d\xb1\x4c\xa7\xa9\x5f\xa6\xeb\x7f" + "\xfb\xb6\x2e\xc8\x71\x5f\x8d\x23\x4a\xbc\x27\x00\xde\x8b\xd0\xc4" + "\xea\x53\xfa\xf7\x3a\x54\xb0\x00\xa9\x40\x17\x7b\x3c\x0e\xfa\xf4" + "\x91\x00\x28\xfb\x39\xa4\x36\xdf\xd6\x05\xd8\xae\xd7\x08\x65\x57" + "\x5b\x6e\xeb\x50\x69\xf4\x37\xcc\x77\x9d\x26\xf6\xbb\x4e\xc3\x32" + "\x1d\xde\x6b\x60\xd8\x3b\x4b\x6d\xf4\xa9\x9f\x55\x9f\x3e\x3e\x59" + "\x9e\x3e\x7d\x3c\x92\xaf\x2b\xc2\x16\x3b\xea\x8a\xc7\x8f\xba\xae" + "\x2b\x1e\x97\xb7\xfe\x0b\xf5\x78\xa5\x6b\xba\x62\xc8\x70\x7b\x5d" + "\x71\x80\xd1\x15\x21\x25\x98\x83\xc2\xba\x82\x9c\x73\xec\x0f\x42" + "\xbf\xe6\xfa\x83\xd0\x7d\x1d\x5f\x57\x84\x86\x0b\xb7\xfd\xa1\x93" + "\x89\xae\x18\x32\xac\xed\x75\xc5\x90\x61\xc2\xba\x22\xf4\x0c\x69" + "\x83\x87\x8c\x70\xd4\x15\x70\x8d\xa0\xae\x08\x6d\x64\xaf\x19\xc6" + "\xd7\x15\x24\x0f\x68\x67\xfc\xc4\x75\xc5\x50\xb2\x87\x07\x35\x74" + "\x0d\x69\x77\x08\xa6\x8e\xba\x62\xe8\xf4\xd6\x75\x05\xe1\x10\x53" + "\x4e\x51\x5d\x31\x74\xaf\xa3\xae\x08\x39\x2d\xac\x2b\x9e\x5c\xc5" + "\xf1\xe8\xc9\xbe\x7c\x5d\x31\xb4\xa6\x73\xe8\x0a\x51\x6e\x85\xf3" + "\x75\xc5\x13\x1f\x4b\xd7\x15\x4f\x5c\x97\xa6\x2b\x30\xe7\x84\x74" + "\xc5\x93\xc3\xed\x39\xc7\xd7\x15\x4f\x4e\x15\xd6\x15\x4f\x2e\xe6" + "\xeb\x0a\x9c\xbf\x90\xae\x78\x72\x27\x2f\x7f\x07\x5d\xf1\xe4\x51" + "\xbe\xae\x20\xe9\x38\x5d\x11\x16\xc5\x7a\xb3\xc5\xd2\x75\x45\xd8" + "\x70\x71\x5d\x11\x36\x9a\xaf\x2b\xc2\x7c\x89\x7e\x08\x8b\x27\xba" + "\x22\x4c\x47\x8e\x87\xc4\xdb\x1e\xe7\x74\x05\x39\xce\xe9\x8a\xb0" + "\x94\xfb\xdf\x5b\x76\xc4\x31\xa6\xa7\xfd\xe4\xf5\xe1\x4f\xfb\xfe" + "\xf4\xef\x7a\x3b\xe1\xf7\x96\x9b\xc2\x72\xb8\x77\xbd\xbf\xdc\x26" + "\x4f\xb7\xfc\x52\x74\xff\xdb\xfb\x73\x8d\x9d\xc5\xfe\xe9\x59\x5c" + "\xec\x87\xf7\x94\x17\xfb\xe1\x9e\x3f\x7d\xec\x3b\xe3\x1c\x87\x5f" + "\x56\x72\xb1\x7f\x66\xa3\xbc\xd8\x3f\x23\xba\xff\x79\xeb\xbe\x74" + "\x8c\xcd\x1c\x87\x31\xb3\xc4\x7d\xe9\xb3\xb3\x9d\xfb\xd2\xe7\x6c" + "\xe6\x38\xfc\x8a\x9d\xe3\x30\x92\x9d\xe3\x30\x92\x99\xe3\x90\x86" + "\x7d\xe9\x7b\x11\x19\x1f\x2c\x3d\x46\xe1\xb5\xbe\x0e\x2d\x35\x52" + "\x80\x89\xd2\x84\x7d\x29\xc4\x7a\x4b\x13\xf6\xa5\xa7\xd9\x71\xed" + "\x91\x81\x65\xd5\x36\x7b\x5a\x50\xcf\x1e\xe2\xd6\xdc\x3d\x8d\xf0" + "\xb9\x4f\xeb\x8e\x51\x39\x4d\x76\x63\xde\x90\xa7\x26\x81\x3f\xe6" + "\x8d\xc7\xba\x1b\x6d\xf6\xa6\x30\xe7\x8d\x4d\x6c\x6d\xcc\xdb\x7e" + "\xbc\x7b\x57\x13\xf2\xed\xbc\x63\xde\xc3\xa7\x70\x63\xde\x23\x64" + "\xce\x7f\x18\x61\x37\xff\xe1\xd7\x02\xf3\x1f\x46\x4a\x98\xff\x30" + "\x52\xe6\xfc\x87\x91\x2e\xce\x7f\x18\xe9\x30\xff\x81\x78\xd3\x67" + "\xa3\xd3\x44\xbd\x29\x39\xe7\xe8\x29\x9e\xb3\x99\xff\xf0\x5c\x27" + "\x98\xff\xf0\x2b\x91\x77\xd4\xbf\x62\xe7\x3f\x8c\xbc\x07\xf3\x1f" + "\x46\x8a\xcc\x7f\x78\x8e\x9d\xff\x30\x52\x60\xfe\xc3\x48\x91\xf9" + "\x0f\xcf\xb1\xf3\x1f\x46\xda\xcd\x7f\x18\xc9\xce\x7f\x78\xce\xc9" + "\xfc\x87\x51\xec\xfc\x87\x51\xec\xfc\x07\x82\xa9\xa3\x37\x7d\xce" + "\x85\xf9\x0f\x23\xd9\xf9\x0f\x23\x9d\xcc\x7f\x18\x25\x30\xff\xe1" + "\xd9\x59\xc2\xde\x74\x8c\xcd\xfc\x87\xd1\x76\xf3\x1f\x46\x75\x92" + "\xf9\x0f\xa2\xdc\xb2\x9b\xff\x30\x5a\xc6\xfc\x87\xd1\x12\xe7\x3f" + "\x8c\x14\x99\xff\x30\xfa\xa2\x3d\xe7\xf8\xde\x74\xb4\xc8\xfc\x87" + "\x31\x76\xf3\x1f\x46\x8a\xcc\x7f\x18\xf3\x14\x2f\x7f\x07\x6f\x3a" + "\xc6\x6e\xfe\xc3\x48\xbb\xf9\x0f\x63\xd8\xf9\x0f\xcf\x76\x91\xee" + "\x4d\xc7\x38\x99\xff\x30\xc6\x6e\xfe\xc3\x18\x76\xfe\xc3\xaf\xd9" + "\xf9\x0f\x63\xd8\xf9\x0f\xcf\x2a\x6d\x8f\x73\xde\x94\x1c\xe7\xbc" + "\xe9\xaf\x25\xce\x7f\xb8\xff\x2d\x66\xfb\x78\xd3\xb1\x32\xe7\x3f" + "\x8c\x75\x3a\xff\xe1\xbe\x3f\x12\xd3\xe8\xbf\x0e\xe1\x34\xfa\x6f" + "\x06\xcb\xd3\x2d\xbf\x09\xf9\xe9\x63\xdf\x19\xfd\xd1\x58\x23\x17" + "\xfb\xe7\x0f\xc8\x8b\xfd\xf3\xfb\xe5\xfb\xa3\x88\x14\xce\x1f\x45" + "\xa4\x88\xfb\xa3\x70\xe7\xfb\xff\x51\x13\x4e\x73\xfe\xe8\xb7\x03" + "\x88\x46\xf9\x6d\x77\xa2\x51\x5e\x38\x2b\xdd\x1f\xbd\x30\x9a\xef" + "\x8f\xc2\xcf\xdd\xf7\x47\x72\xfd\xd1\x6f\x92\x38\x7f\xf4\x42\x4f" + "\x79\xfe\xe8\x05\x4f\xbe\x3f\x8a\x1c\xe4\xe8\x8f\x5e\x58\xe2\xba" + "\x3f\x7a\x21\x4f\x1e\xd7\x5f\xc8\x75\xcd\x1f\xbd\x70\x47\xd8\x1f" + "\x85\x67\x88\xfb\x23\x72\xce\x51\xd7\x4e\xc8\xe3\x74\xed\x84\xb9" + "\x1d\xdf\x1f\x4d\x50\x0a\x6b\xd8\x09\x3d\x89\x3f\x7a\xa1\xbe\xed" + "\xfd\xd1\x0b\xf5\xc2\xfe\x68\x02\xd9\xff\x95\x7a\xc1\xe8\xe8\x8f" + "\xe0\x1a\x41\x7f\x34\xe1\x28\x7b\x4d\x3d\xdf\x1f\x91\x3c\xa0\xad" + "\x39\x2f\xee\x8f\x26\x2e\x26\x6d\xcf\xc4\x91\xa4\xed\x21\x98\x3a" + "\xfa\xa3\x89\x7e\xad\xfb\x23\xc2\x21\xa6\x9c\xa2\xfe\x68\xe2\x6c" + "\x47\x7f\x14\x2e\xbc\xaf\x1a\x15\xf1\x14\xc7\xa3\x49\x17\xf9\xfe" + "\x68\xe2\xbe\xce\xe1\x8f\x44\xb9\xa5\xe4\xfb\xa3\x49\xcb\xa5\xfb" + "\xa3\x49\x07\xa4\xf9\x23\xcc\x39\x21\x7f\x34\xe9\x8e\x3d\xe7\xf8" + "\xfe\x28\xc2\x47\xd8\x1f\x45\x0c\xe2\xfb\x23\x9c\xbf\x90\x3f\x8a" + "\x98\xca\xcb\xdf\xc1\x1f\x45\x2c\xe1\xfb\x23\x92\x8e\xf3\x47\x91" + "\xbe\x6c\x9f\x26\x7d\x5f\x35\x2a\xe2\x8e\xb8\x3f\x8a\x30\xf3\xfd" + "\x51\x44\x05\xf1\x41\x91\x3a\xe2\x8f\x22\xaa\xc8\xf1\x70\xad\xed" + "\x71\xce\x1f\x85\x6b\xf9\xfe\x28\x72\xd8\xfd\xef\x34\x3b\xa2\x3f" + "\x9a\x7c\x5e\x9e\x3f\x9a\x5c\x71\x5f\xa3\xcb\xd1\xe8\x91\x13\x38" + "\x8d\xfe\xd2\x44\x79\xba\xe5\xa5\x09\xf2\x35\xfa\x4c\x0d\xa7\xd1" + "\x67\x6a\xc4\x35\xfa\x94\x40\xe7\x1a\x3d\x2a\x8e\xd3\xe8\xd3\xce" + "\x92\x7e\x72\xda\x21\xd2\x4f\x4e\x5b\x2c\x5d\xa3\x4f\xfd\x81\xaf" + "\xd1\xa7\x2c\xb9\xaf\xd1\xe5\x6a\xf4\x17\xfd\x39\x8d\x3e\xf5\x43" + "\x79\x1a\x7d\x6a\x11\x5f\xa3\xcf\x3c\xe7\xa8\xd1\xa7\xf9\xb9\xae" + "\xd1\xa7\x0d\x97\xc7\xf5\x69\xc3\x5c\xd3\xe8\xd3\x76\x0a\x6b\xf4" + "\x29\x5a\x71\x8d\x4e\xce\x39\x6a\xab\xa8\xe1\x9c\xb6\x8a\xea\xd2" + "\xf1\x35\xfa\xef\xf6\x0b\xeb\xa8\xdf\x7d\x48\x34\xfa\xb4\x1d\x6d" + "\xaf\xd1\xa7\xed\x10\xd6\xe8\x51\x03\x88\x9e\x99\x96\xef\xa8\xd1" + "\xe1\x1a\x41\x8d\x1e\x35\x9d\xbd\x66\x07\x5f\xa3\x93\x3c\xa0\xad" + "\x59\x2e\xae\xd1\xa7\xb3\xdf\x05\x45\x7d\x47\xda\x1e\x82\xa9\xa3" + "\x46\x8f\xfa\xb8\x75\x8d\x4e\x38\xc4\x94\x53\x54\xa3\x4f\xf7\x70" + "\xd4\xe8\x53\x34\xc2\x1a\x7d\x86\xcd\x3c\xcd\x19\xab\xf8\x1a\x7d" + "\xfa\xf8\xce\xa1\xd1\x45\xb9\xb5\x9f\xaf\xd1\x67\xf4\x95\xae\xd1" + "\x67\x4c\x94\xa6\xd1\x31\xe7\x84\x34\xfa\x8c\x9d\xf6\x9c\xe3\x6b" + "\xf4\x19\x47\x85\x35\xfa\x8c\x73\x7c\x8d\x8e\xf3\x17\xd2\xe8\x33" + "\x1a\x79\xf9\x3b\x68\xf4\x99\x7e\x7c\x8d\x4e\xd2\x71\x1a\x7d\xe6" + "\x31\xd2\x86\xbe\x74\x56\xba\x46\x9f\xb9\x53\x5c\xa3\xcf\xdc\xcb" + "\xd7\xe8\x33\x93\x88\x16\x9f\x59\x4a\x34\xfa\xcc\x4c\x72\xfc\xa5" + "\x12\xdb\xe3\x9c\x46\x27\xc7\x39\x8d\x3e\xf3\xd2\xfd\x6f\x38\x3b" + "\xa2\x46\x9f\xbd\x5c\x9e\x46\x9f\x9d\x24\x5f\x27\xc6\x86\x73\x3a" + "\x31\x36\x5c\x5c\x27\xbe\x3c\xde\xb9\x4e\x9c\x97\xc3\xe9\xc4\xe8" + "\x5b\xa4\xad\x8e\xbe\x48\xda\xea\xe8\x3c\xe9\x3a\x31\xba\x27\x5f" + "\x27\xbe\xbc\xf3\xbe\x4e\x94\xab\x13\x67\x1a\x38\x9d\x38\xe7\x6b" + "\x79\x3a\x71\x4e\x25\x5f\x27\xc6\x3a\xee\xa9\x45\x45\x8f\x74\x5d" + "\x27\x46\xcf\x95\xa7\x13\xa3\xa3\x5d\xd3\x89\xd1\xa7\x84\x75\xe2" + "\xcb\x13\xc4\x75\x22\x39\xe7\xd8\xbf\xcf\x9b\xcb\xf5\xef\xf3\x06" + "\x77\x7c\x9d\x38\xb7\x42\xb8\x2f\x9f\xfb\x35\xd1\x89\xd1\xc5\x6d" + "\xaf\x13\xa3\x8b\x85\x75\xe2\x3c\x76\xfd\xb3\xe8\xd3\x8e\x3a\x11" + "\xae\x11\xd4\x89\xf3\xd8\xf1\xdf\xe8\x62\xbe\x4e\x24\x79\x40\x5b" + "\xb3\x4b\x5c\x27\xce\x1f\x4e\xda\x9e\xf9\xec\x7b\x24\x82\xa9\xa3" + "\x4e\x9c\xf7\x5d\xeb\x3a\x91\x70\x88\x29\xa7\xa8\x4e\x9c\x3f\xc8" + "\x51\x27\xbe\x1c\x2e\xac\x13\x63\x3d\x38\x1e\xc5\xec\xe5\xeb\xc4" + "\xf9\x4b\x3a\x87\x4e\x14\xe5\x56\x05\x5f\x27\xc6\x8c\x96\xae\x13" + "\x63\x96\x4b\xd3\x89\x98\x73\x42\x3a\x31\xe6\x94\x3d\xe7\xf8\x3a" + "\x31\xe6\xb2\xb0\x4e\x8c\xb9\xc3\xd7\x89\x38\x7f\x21\x9d\x18\x1b" + "\xc8\xcb\xdf\x41\x27\xc6\x8e\xe4\xeb\x44\x92\x8e\xd3\x89\xb1\x6c" + "\x1b\x3a\xfb\x96\x74\x9d\x18\x7b\x4a\x5c\x27\xc6\xf2\xf7\xbf\xa2" + "\x62\xc9\xfe\x57\x54\x6c\x3d\xd1\x89\xb1\x64\xff\x2b\x6a\xb6\xc1" + "\xf6\x38\xa7\x13\xc9\x71\x4e\x27\x2e\x50\xba\xf7\x7d\xe7\xe2\xe3" + "\x9c\xb6\x58\x7c\x5c\x5c\x5b\x2c\xd8\xe7\x5c\x5b\xbc\xa2\xe4\xb4" + "\xc5\xc2\x58\x52\xbf\x17\x8e\x27\xf5\x7b\x21\x33\x3f\x29\xf5\x1c" + "\x68\x8b\xa0\x88\x8c\xc3\x37\x8a\x18\x6d\xf1\x41\x82\x91\x02\xbd" + "\xa7\xb4\x60\x6d\x01\xba\x2e\x6b\x05\xd6\x16\x55\xec\xf7\x9d\x71" + "\x6b\xce\x25\xdb\x6a\x8b\x05\x8d\xcc\xb7\x9e\x2d\xfb\xd6\x56\x21" + "\x7c\x5e\xe8\xdb\xcf\x13\x09\xec\xb7\x9f\x90\xb7\xed\x37\x9f\xcc" + "\x77\xa0\x37\x40\x7b\xcc\x03\x3c\x6c\xb4\xc7\xfd\x6f\x3f\x71\x5f" + "\x1f\x37\x51\x9e\xae\x8d\x9b\xc0\xd7\x1c\x09\x0b\x1d\x35\x47\xdc" + "\x87\xae\x6b\x8e\xb8\x8b\xf2\x34\x47\xdc\x05\xd7\x34\xc7\xc2\xa7" + "\x84\x35\xc7\x82\xfd\x98\x9f\xc2\x9a\x83\x9c\x73\xec\x2b\x16\x5d" + "\xe4\xfa\x8a\x45\x7b\x3b\xbe\xe6\x58\x34\x56\xb8\x5f\x58\x34\x91" + "\x68\x8e\x85\x61\x6d\xaf\x39\x16\x86\x09\x6b\x8e\x45\x6c\xfb\xbf" + "\x70\x98\xa3\xe6\x80\x6b\x04\x35\xc7\x22\xf6\xfd\xdf\xc2\x30\xbe" + "\xe6\x20\x79\x40\x1b\xe4\x23\xae\x39\x5e\x39\x44\xda\xa4\x57\x52" + "\x49\x9b\x44\x30\x75\xd4\x1c\xaf\x4c\x6d\x5d\x73\x10\x0e\x31\xe5" + "\x14\xd5\x1c\xaf\xec\x72\xd4\x1c\x0b\x0a\x85\x35\xc7\x62\x9b\x79" + "\xda\x8b\xfd\xf8\x9a\xe3\x95\x1f\x3a\x87\xe6\x10\xe5\xd6\x58\xbe" + "\xe6\x88\x3f\x2a\x5d\x73\xc4\xd7\x48\xd3\x1c\x98\x73\x42\x9a\x63" + "\xf1\x53\xf6\x9c\xe3\x6b\x8e\xc5\x93\x85\x35\xc7\xe2\x85\x7c\xcd" + "\x81\xf3\x17\xd2\x1c\x8b\xf3\x78\xf9\x3b\x68\x8e\xc5\x1f\xf2\x35" + "\x07\x49\xc7\x69\x8e\x84\x29\x6c\x5f\x37\x51\xba\xe6\x48\x78\x4a" + "\x5c\x73\x24\x8c\xe4\x6b\x8e\x04\x35\xd1\x16\x09\x71\x44\x73\x24" + "\x68\xc9\xf1\x05\x13\x6c\x8f\x73\x9a\x83\x1c\xe7\x34\x47\x42\xb2" + "\x84\xb1\xa9\x24\x29\xdf\x7e\x1e\xba\xcb\x1f\x9b\xb2\x8e\x4b\x99" + "\x42\x7c\x63\x5a\xc6\xa6\xa0\xaf\x17\xdb\x47\x1d\x8f\x4d\xe1\xbe" + "\x9b\x1b\x9b\xba\xcc\xb4\x55\xdc\xd8\x94\x9e\x19\x9b\xc2\xe3\x52" + "\xe0\xd9\x5b\xc6\xa5\x2c\x2b\x1d\xbf\xfb\x3c\x64\x91\x3e\x2e\xf5" + "\xf2\x12\x35\xda\xcd\xf4\xdf\xc7\x52\xc8\xb8\x54\x65\xcb\xb8\x14" + "\xee\xb7\xcd\x0d\x8e\xe3\x52\xb8\xbf\xe6\xc6\xa5\xbe\x91\x39\x2e" + "\x95\xd8\x53\x5e\xff\x9d\xd8\x01\xbe\x7f\xeb\x8c\xdf\x7d\x26\x64" + "\x71\xef\x8e\x97\xc8\xfc\xfe\x6d\x89\xd3\xef\xdf\xee\xcf\x6b\x16" + "\x8b\x7d\xe2\x14\x2e\xf6\xcb\xba\xc8\x8b\xfd\x32\xe5\x4f\x1f\xfb" + "\xce\x38\x67\x62\x49\x05\x17\xfb\x24\x99\xeb\xbf\x25\x65\xc8\x1f" + "\x0b\x4f\x49\xe6\xfc\x6a\x4a\xb2\xad\x5f\x2d\x19\x6b\xeb\x57\x97" + "\x4f\x75\xee\x57\x57\x15\x73\x7e\x35\x39\x90\x68\xc3\xe4\x2e\x44" + "\x1b\xae\x64\xf6\x24\x4b\x1d\x8d\x18\x9f\x6a\xc2\x9e\x75\x91\x91" + "\x3a\x7c\xad\x98\x32\xad\x25\x5e\xb5\xdc\x54\x8a\xce\x19\x8c\x68" + "\xf3\x0a\xa4\xdc\x78\x03\x29\xff\x54\x67\xa4\xbc\xe3\x91\x0a\xfa" + "\x09\xd0\x52\xa5\xa0\x2d\x76\xa1\xc4\x34\xec\x63\x57\x8e\x2c\x4f" + "\x34\xd8\xf8\xd8\xe5\x27\x38\x0f\x0b\xe9\x12\x8d\xe8\xe4\xa2\x62" + "\x0a\x7b\xd5\xe6\xbc\xb1\x89\xcd\x83\x7d\xa3\x99\x35\x8b\x6c\xc7" + "\xcb\xe1\xde\x9a\x97\xf9\xe3\xe5\x4d\x79\x63\x93\x1a\x0f\xf9\xc6" + "\x30\xeb\x21\x0e\xe0\xc6\xcd\x5d\x1d\x2f\x7f\xb7\x09\xf9\x5a\xd7" + "\x43\xc4\xfd\x62\xe7\x1b\x2f\x5f\x36\x81\x1b\x2f\x5f\xd9\x5d\xde" + "\x78\xf9\x4a\x15\xdf\xbb\xa6\x0e\x70\xf4\xae\x2b\x17\xbb\xee\x5d" + "\x57\xca\xfc\xfe\x7f\x65\x8e\x6b\xde\x75\xe5\x2d\x7b\xef\xba\x3f" + "\x0d\x7b\xd7\xe5\x51\x98\xab\xc2\xde\x95\x9c\x73\xf4\x1c\xab\xb6" + "\x71\x9e\x63\xd5\xec\x8e\xef\x5d\x57\x21\x61\x7f\xb1\xaa\x3b\xf1" + "\xae\x2b\x0d\x6d\xef\x5d\x57\x1a\x84\xbd\xeb\xaa\x54\xa2\xf3\x57" + "\x1a\xac\x3e\x94\xf3\xae\x70\x8d\xa0\x77\x5d\xf5\xa1\xfd\x35\xc4" + "\xbb\xae\xac\x27\xde\x75\xd5\x39\x71\xef\xba\x9a\x5d\x2f\x6d\xf5" + "\x70\xd2\x3e\x11\x4c\x1d\xbd\xeb\x6a\x9f\xd6\xbd\x2b\xe1\x10\x53" + "\x4e\x51\xef\xba\x7a\xba\xa3\x77\x5d\x3e\x45\xd8\xbb\xa6\x0c\xe5" + "\x78\xf4\xda\x79\xbe\x77\x5d\xbd\xb7\x73\x78\x57\x51\x6e\x21\xbe" + "\x77\x7d\x6d\x89\x74\xef\xfa\xda\x3e\x69\xde\x15\x73\x4e\xc8\xbb" + "\xbe\x76\x8b\xe5\x4f\xbd\xb0\x77\x4d\xe9\x29\xec\x5d\x53\x06\xf0" + "\xbd\x2b\xce\x5f\xc8\xbb\xa6\x4c\xe6\xe5\xef\xe0\x5d\x53\x16\xf3" + "\xbd\x2b\x49\xc7\x79\xd7\x54\x35\x69\x43\x93\xcc\xd2\xbd\x6b\xca" + "\x2d\x71\xef\x9a\xd2\xc8\xf7\xae\x29\xa5\xc4\xa3\xa6\x6a\x89\x77" + "\x4d\xd1\x93\xe3\x49\x26\xdb\xe3\x9c\x77\x25\xc7\x39\xef\x9a\x1a" + "\x26\xc1\xbb\x26\xb7\x91\x77\x8d\xeb\x5c\xde\xf5\x93\x11\xed\xeb" + "\x5d\xd3\xce\xca\xf3\xae\x69\x25\x2e\x6a\xf8\xa4\x56\x34\x7c\xcc" + "\xff\x5f\x1a\x3e\x35\x9c\xd3\xf0\x19\xe3\xe4\x69\x96\x8c\xb1\x3f" + "\x75\xec\x3b\x5f\xdc\xd3\xd5\x5c\xdc\xd7\x9c\x90\x17\xf7\x35\xc7" + "\xef\xfb\x56\x39\xb1\xcf\xb0\x19\xaf\x79\x5d\xe6\xfc\xe7\xd7\x87" + "\xc9\xf7\xad\x9b\xa7\x70\xbe\x75\xf3\x14\x5b\xdf\xfa\x77\xde\x7b" + "\xd6\x75\x3d\x9d\xfb\xd6\xcc\x7c\xce\xb7\x6e\x30\x13\x5d\xb8\x81" + "\x9d\x6f\xbb\x81\xd1\x5b\x29\x47\x89\x6f\xbd\x8b\x7d\xeb\x55\xf0" + "\xad\x0b\xa2\x29\x13\xbb\x06\x3f\x9e\x97\x75\x0e\xbc\x27\xf6\xaa" + "\xe5\xc9\xf0\x77\x92\x01\x6d\x5e\x8a\x94\x9b\xc0\x73\x1e\x80\xfe" + "\xeb\xc0\x0a\x03\x95\xb9\x08\xda\xfe\xca\x43\xc8\x3b\x0e\xfc\x6c" + "\x1d\xf6\xb3\xa7\xc1\xab\xae\x67\xfd\xec\x86\xbe\xe5\x49\xb6\x7e" + "\x76\xdd\x16\xc6\xcf\x1a\xc8\x9c\xaf\xf2\x24\xf0\xb3\x70\x3f\xbc" + "\xa6\xbf\xad\x9f\x6d\x04\xbf\xda\x04\x7e\x35\xe7\x9a\x9d\xb7\x5d" + "\xe0\xe8\x6d\x1b\xfd\xc6\x26\x1b\x07\xfb\xc6\x61\x6f\x7b\x77\xdf" + "\xff\x8f\xde\x76\xad\x92\xf3\xb6\xeb\x7f\x90\xe7\x6d\xd7\x57\xf1" + "\xbd\x6d\x96\x87\xa3\xb7\xdd\x30\xde\x75\x6f\xbb\x61\xb1\xbc\x3a" + "\xb3\x21\xde\x35\x6f\xbb\xe1\x9c\xbd\xb7\x7d\x9f\x79\x2f\xbb\x4e" + "\x8d\xf9\x2c\xec\x6d\xc9\x39\x47\x4f\x92\xb9\x98\xf3\x24\x99\xc3" + "\x3b\xbe\xb7\x7d\xe3\x92\xb0\xff\x78\xe3\x07\xe2\x6d\x37\x94\xb6" + "\xbd\xb7\xdd\x50\x2a\xec\x6d\x33\xd9\xf9\xff\x1b\x4a\x1d\xbd\x2d" + "\x5c\x23\xe8\x6d\x33\xb7\xd8\x5f\x43\xbc\xed\x86\x0a\xe2\x6d\x33" + "\x0f\x88\x7b\xdb\x8d\xe3\x48\x1b\xb6\xd1\x8f\xb4\x61\x04\x53\x47" + "\x6f\x9b\x79\xbd\x75\x6f\x4b\x38\xc4\x94\x53\xd4\xdb\x6e\x7c\xca" + "\xd1\xdb\xae\xf3\x14\xf6\xb6\x9b\x7b\x72\x3c\xda\x74\x88\xef\x6d" + "\x37\xa6\x76\x0e\x6f\x2b\xca\xad\x4b\x7c\x6f\xbb\x69\xa2\x74\x6f" + "\xbb\x69\x8d\x34\x6f\x8b\x39\x27\xe4\x6d\x37\x9d\x63\xf9\x53\x21" + "\xec\x6d\x37\xd5\x08\x7b\xdb\xcd\x1e\x7c\x6f\x8b\xf3\x17\xf2\xb6" + "\x9b\x07\xf3\xf2\x77\xf0\xb6\x9b\xc7\xf3\xbd\x2d\x49\xc7\x79\xdb" + "\xcd\xb5\xa4\x0d\x7d\xfd\xa8\x74\x6f\xbb\xf9\x9c\xb8\xb7\xdd\x7c" + "\x91\xef\x6d\x37\xef\x27\x1e\x36\x0b\x11\x6f\xbb\xf9\x38\x39\xfe" + "\xfa\x11\xdb\xe3\x9c\xb7\x25\xc7\x39\x6f\x9b\xa5\x96\xf6\x5e\xd6" + "\xad\x75\x8f\x62\xda\xff\x9b\x81\xb6\x5a\xf7\xc8\xfa\x6e\xb6\xbd" + "\xbe\x19\xd8\x72\x40\x9e\xbf\xdd\xe2\x74\xfd\x97\xfb\x1e\x4b\x48" + "\xe7\x67\x69\x39\x9d\xbf\x35\x50\x9e\x66\xd9\xaa\xb9\xef\xb1\xe4" + "\xc4\x7e\x8b\x81\x8b\x7d\xce\x2e\x79\xb1\xcf\xc9\x97\xef\xb1\x76" + "\xe4\x72\x1e\x6b\x47\xae\xf8\xbb\xc1\x6d\x4b\x9c\x7b\xac\xbc\x4b" + "\x9c\xc7\xca\x1d\x49\xf4\x49\x6e\x20\xd1\x27\x6f\x7d\xd7\x76\xef" + "\x06\xdf\x9a\xce\x7f\x37\xb8\xed\xeb\xfb\xef\x06\xdb\xc2\x3f\x6d" + "\x8d\xe3\xfc\xd3\x5b\x03\xe4\xf9\xa7\xb7\xb4\x7c\xff\xb4\x73\xb4" + "\xa3\x7f\x7a\x6b\xa3\xeb\xfe\xe9\xad\x43\xf2\xea\xc3\x5b\x07\x5d" + "\xf3\x4f\xb9\x3d\x85\xdf\x0d\x6e\x4b\x12\x7f\x37\x48\xce\x39\xea" + "\xde\xbc\x43\x9c\xee\xcd\x5b\xd5\xf1\xfd\x53\x5e\x80\xb0\xc6\xcd" + "\x1b\x40\xfc\x53\xae\x67\xdb\xfb\xa7\x5c\x4f\x61\xff\x94\xc7\x7e" + "\xff\x9a\xeb\xe9\xe8\x9f\xe0\x1a\x41\xff\x94\x77\xce\xfe\x1a\xe2" + "\x9f\x72\xd5\xc4\x3f\xe5\xd5\x88\xfb\xa7\xed\xeb\x49\xfb\xb4\x7d" + "\x2a\x69\x9f\x08\xa6\x8e\xfe\x69\xfb\xe0\xd6\xfd\x13\xe1\x10\x53" + "\x4e\x51\xff\xb4\x7d\xb9\xa3\x7f\xda\x96\x28\xec\x9f\x76\x4c\xe4" + "\x78\xf4\xf6\x75\xbe\x7f\xda\x7e\xa2\x73\xf8\x27\x51\x6e\x05\xf0" + "\xfd\xd3\xdb\x5b\xa4\xfb\xa7\xb7\x4f\x49\xf3\x4f\x98\x73\x42\xfe" + "\x69\x47\x4f\x96\x3f\x6a\x61\xff\xb4\x63\x90\xb0\x7f\xda\x31\x9a" + "\xef\x9f\x70\xfe\x42\xfe\x69\xc7\x62\x5e\xfe\x0e\xfe\x69\xc7\x46" + "\xbe\x7f\x22\xe9\x38\xff\xb4\x33\x84\xed\xdf\xfa\x4a\xf7\x4f\x3b" + "\x7b\x8a\xfb\xa7\x9d\x7e\x7c\xff\xb4\xa3\x9a\xf8\xa4\x9d\xa3\x88" + "\x7f\xda\x61\x22\xc7\xb7\xf9\xdb\x1e\xe7\xfc\x13\x39\xce\xf9\xa7" + "\x9d\x91\xd2\xfc\x93\xeb\xeb\x22\xfd\xf4\xf3\x5a\x35\x9d\x74\x5e" + "\xeb\x3b\x3f\xc8\xf3\x4e\xef\x54\xdd\xd7\xf0\x72\x34\xfc\xce\x18" + "\x4e\xc3\xe7\xcb\xfc\xfe\x37\x3f\x5a\xbe\x86\x2f\x8c\xe2\x34\x7c" + "\x61\x94\xb8\x86\xdf\xf5\x94\x73\x0d\xbf\x77\x0f\xa7\xe1\xf7\x78" + "\x90\x3e\xb2\xe0\x07\xd2\x47\x16\xec\x6b\x3b\x0d\x5f\xd0\x8f\xaf" + "\xe1\x77\xed\xba\xaf\xe1\xdb\x42\xc3\xbf\x6b\xb3\xdf\xf1\xee\x1a" + "\x79\x1a\x7e\x77\x35\x5f\xc3\xef\xeb\xe2\xa8\xe1\x0b\x26\xba\xae" + "\xe1\x0b\x96\xc8\xab\x0f\x05\x89\xae\x69\xf8\x82\xf3\xc2\x1a\x7e" + "\xd7\x30\x71\x0d\x4f\xce\x39\x6a\xaf\xbd\x4b\x38\xed\xb5\x77\x64" + "\xc7\xd7\xf0\x7b\xf4\xc2\x3a\x6b\x4f\x0d\xd1\xf0\x05\x15\x6d\xaf" + "\xe1\x0b\x2a\x84\x35\xfc\xde\xd9\x44\xef\x14\x54\x38\x6a\x78\xb8" + "\x46\x50\xc3\xef\xdd\x66\x7f\x0d\xd1\xf0\x05\x17\x88\x86\xdf\x7b" + "\x48\x5c\xc3\xbf\x37\x9e\xb4\x4f\xef\xf5\x25\xed\x13\xc1\xd4\x51" + "\xc3\xef\xbd\xd5\xba\x86\x27\x1c\x62\xca\x29\xaa\xe1\xdf\x1b\xee" + "\xa8\xe1\x77\x85\x09\x6b\xf8\x42\x1f\x8e\x47\x7f\xf8\x90\xaf\xe1" + "\xdf\x5b\xd3\x39\x34\xbc\x28\xb7\xf4\x7c\x0d\xff\x87\xc9\xd2\x35" + "\xfc\x1f\xd6\x4b\xd3\xf0\x98\x73\x42\x1a\xfe\x0f\xe7\x59\xfe\x5c" + "\x10\xd6\xf0\x7f\xb8\x2e\xac\xe1\x0b\xbb\xf0\x35\x3c\xce\x5f\x48" + "\xc3\x17\x0e\xe5\xe5\xef\xa0\xe1\x0b\x27\xf2\x35\x3c\x49\xc7\x69" + "\xf8\x42\xb6\x7f\xcb\xbf\x2c\x5d\xc3\x17\x9e\x17\xd7\xf0\x85\x5f" + "\xf3\x35\x7c\xe1\x41\xa2\xd5\xf7\x29\x89\x86\x2f\x2c\x26\xc7\xf3" + "\x2f\xd9\x1e\xe7\x34\x3c\x39\xce\x69\xf8\x7d\xbe\xf7\xd7\x4d\xea" + "\x88\xeb\x26\xbd\x7f\x48\x9e\x8e\x7f\xff\xa0\x7c\x2d\x79\x38\x83" + "\xd3\x92\x87\x33\x6c\xb5\x24\x7f\x6d\x83\x3f\xae\x71\xae\x25\xff" + "\x5c\xc2\x69\xc9\x3f\x0d\x22\x6d\xf5\x9f\x7a\x92\xb6\xfa\x00\xf3" + "\x7e\x4f\xda\xba\x49\x07\xc6\xf1\xd7\x4d\xfa\xe3\xf9\xfb\xeb\x26" + "\xc9\xd5\x89\xfb\x74\x9c\x4e\x3c\xe0\x23\x4f\x27\x1e\x50\xf3\x75" + "\xe2\x07\x83\x1d\x75\xe2\x81\xe5\xae\xeb\xc4\x03\x3b\xe5\xe9\xc4" + "\x03\x3b\x5c\xd3\x89\x07\x1a\x85\xd7\x30\xf8\xe3\x3a\xf1\x75\x93" + "\xc8\x39\xc7\xfe\xfd\xcf\x3b\xb9\xfe\xfd\xcf\xb1\x1d\x5f\x27\xfe" + "\x59\x25\xdc\x97\xff\xd9\x87\xe8\xc4\x03\xc6\xb6\xd7\x89\x07\x8c" + "\xc2\x3a\xf1\xcf\xeb\x49\x9f\x7a\xc0\xe4\xb8\x86\x01\x5c\x23\xa8" + "\x13\xff\xfc\x31\x7b\x8d\x91\xaf\x13\x49\x1e\xd0\xd6\x5c\x14\xd7" + "\x89\x07\x97\x90\xb6\xe7\xe0\x68\xd2\xf6\x10\x4c\x1d\x75\xe2\xc1" + "\xbe\xad\xeb\x44\xc2\x21\xa6\x9c\xa2\x3a\xf1\xe0\x5c\x47\x9d\xf8" + "\xc7\x0c\x61\x9d\x78\xd8\x66\x9d\xd6\x43\x5f\xf3\x75\xe2\xc1\x03" + "\x9d\x43\x27\x8a\x72\x4b\xc5\xd7\x89\x87\x56\x49\xd7\x89\x87\x0e" + "\x49\xd3\x89\x98\x73\x42\x3a\xf1\x50\xa3\x3d\xe7\xf8\x3a\xf1\xb0" + "\x9f\xb0\x4e\x3c\x3c\x98\xaf\x13\x71\xfe\x42\x3a\xf1\xf0\x74\x5e" + "\xfe\x0e\x3a\xf1\xf0\x72\xbe\x4e\x24\xe9\x38\x9d\xf8\x81\x3f\xdb" + "\xa7\x0d\x92\xae\x13\x0f\x37\x8a\xeb\xc4\x0f\x3c\xf8\x3a\xf1\xf0" + "\x05\xa2\x07\x3f\x08\x21\x3a\xf1\x70\x35\x39\xfe\x47\x9d\xed\x71" + "\x4e\x27\x92\xe3\x9c\x4e\xfc\x60\x84\xb4\xef\x40\xda\x64\xac\xb7" + "\x9d\xbe\x03\x69\xab\xb1\xde\xf6\xfe\x0e\xa4\x48\xe6\xfa\xf7\x45" + "\xae\xae\x7f\x7f\x7f\x9e\x4c\xcb\x38\xef\x07\x91\xdc\x38\xef\x47" + "\xe3\xe5\xe9\x95\x8f\xc2\xe5\x6b\xf3\x4f\x6c\xf6\xef\xfd\x84\xb7" + "\x7f\x2f\x7f\x3e\xfc\xff\xf5\x73\xae\xcd\xff\x6a\xb3\x7f\xef\x5f" + "\xd8\xfd\x7b\x8f\xb2\xfb\xf7\x1e\x3d\x20\x67\x3e\xfc\xa6\x3a\xa4" + "\xdc\x6c\x3f\x1f\xfe\xc2\x09\x32\x1f\x7e\xa9\xfd\x7c\xf8\xa3\x81" + "\xfc\xf9\xf0\xff\xb7\x4b\x6c\x3e\x3c\x1e\xf7\x6d\x3e\xe4\x1b\x83" + "\xe7\xc2\x0b\xce\x83\x9f\xd1\xb6\xf3\xe0\x31\x37\xdf\x5d\x4d\xb4" + "\xfd\x3b\x9d\x52\xdb\x7f\x68\xb3\x76\xfe\x11\x99\xfb\xff\x1e\xb1" + "\xdb\xff\xf7\x6f\x02\xfb\xff\x1e\x95\xb0\xff\xef\x51\x99\xfb\xff" + "\x1e\x75\x71\xff\xdf\xa3\x0e\xfb\xff\x92\x79\xf0\xff\xa7\x11\x9f" + "\x07\x4f\xce\x39\x6a\xb2\xbf\xda\xac\x2b\xf5\xd7\x4e\xb0\xff\xef" + "\x5f\x44\xf6\x68\xfd\x0b\xbb\xff\xef\xd1\x7b\xb0\xff\xef\x51\x91" + "\xfd\x7f\xff\xca\xee\xff\x7b\xb4\x65\x2f\x5f\x4e\xdb\x1f\x15\xd9" + "\xff\xf7\xaf\x79\xf6\xd7\x10\x6d\x7f\x94\xdd\xff\xf7\xaf\x4e\xf6" + "\xff\x3d\xc6\xee\xff\x7b\x8c\xdd\xff\x97\x60\xea\xa8\xed\xff\xea" + "\xc2\xfe\xbf\x47\xd9\xfd\x7f\x8f\x3a\xd9\xff\xf7\x98\xc0\xfe\xbf" + "\xff\x17\x20\xac\xed\x3f\xb1\xd9\xff\xf7\x63\xbb\xfd\x7f\x8f\x75" + "\x92\xfd\x7f\x45\xb9\x65\xb7\xff\xef\xc7\x32\xf6\xff\xfd\x58\xe2" + "\xfe\xbf\x47\x45\xf6\xff\xfd\x98\xdd\xff\xf7\xa8\xc8\xfe\xbf\x1f" + "\x8b\xec\xff\xfb\x89\xdd\xfe\xbf\x47\x45\xf6\xff\xfd\xe4\x29\x5e" + "\xfe\x0e\xda\xfe\x13\xbb\xfd\x7f\x8f\xda\xed\xff\xfb\x09\xbb\xff" + "\xef\x47\x67\xa4\x6b\xfb\x4f\x9c\xec\xff\xfb\x89\xdd\xfe\xbf\x9f" + "\xb0\xfb\xff\xfe\x8d\xdd\xff\xf7\x13\x76\xff\xdf\x8f\x4e\xdb\x1e" + "\xe7\xb4\x3d\x39\xce\x69\xfb\xbf\x49\xd9\xff\x37\x49\xca\x18\xf0" + "\x4f\x3f\x8f\x43\xdd\x49\xe7\x71\x1c\x97\x39\xfe\x7b\xdc\x8d\xf1" + "\xdf\xd3\xf9\x9c\xc6\x3c\x9d\x2f\x3e\x97\xe0\x44\x2b\xe3\xbf\xa7" + "\xaa\x38\x8d\x59\xcc\x7e\xaf\x54\x3c\x88\xb4\xd3\x27\x6b\x5c\x9d" + "\x4b\xb0\xe9\x2e\xab\x2b\xad\x73\x09\x56\xb0\x73\x09\x40\x5b\x12" + "\x2d\x79\x72\x2e\x7f\x2e\xc1\x89\x1a\xb1\xb9\x04\x82\x73\x08\xec" + "\xf4\xa3\x55\x6b\xca\x9d\x43\xd0\xf9\xf5\xe3\xdf\x6c\xe6\x10\x9c" + "\x1c\x2c\x4f\x3f\x9e\x0c\xe1\xeb\xc7\x33\xe3\x1d\xf5\xe3\xc9\x6d" + "\xae\xeb\xc7\x93\x47\xe5\xe9\xc7\x93\x47\x5c\xd3\x8f\xc5\x7e\xc2" + "\x73\x08\x4e\xac\x13\x9f\x43\x40\xce\x39\xf6\xfb\xa7\x8e\x72\xfd" + "\xfe\xa9\x35\x1d\x5f\x3f\x9e\xd2\x0a\xf7\xf1\xa7\x06\x13\xfd\x58" + "\xec\xdb\xf6\xfa\xb1\xd8\x57\x58\x3f\x9e\xda\x4b\xfa\xda\x62\x5f" + "\x47\xfd\x08\xd7\x08\xea\xc7\x53\x17\xed\xaf\x21\xfa\xb1\xd8\x9f" + "\xe8\xc7\x53\xb7\xc4\xf5\xe3\x67\x5b\x48\xbb\xf4\xd9\x6c\xd2\x2e" + "\x11\x4c\x1d\xf5\xe3\x67\x4f\xb5\xae\x1f\x09\x87\x98\x72\x8a\xea" + "\xc7\xcf\x52\x1d\xf5\xe3\x09\x91\xb1\xe1\xd3\x53\x39\x1e\x7d\x7e" + "\x87\xaf\x1f\x3f\x3b\xd3\x39\xf4\xa3\x28\xb7\xb4\x7c\xfd\xf8\x79" + "\x9e\x74\xfd\xf8\xf9\x59\x69\xfa\x11\x73\x4e\x48\x3f\x9e\xf6\x63" + "\xf9\xe3\x2f\xac\x1f\x4f\x0f\x15\xd6\x8f\xa7\xc7\xf3\xf5\x23\xce" + "\x5f\x48\x3f\x9e\x5e\xce\xcb\xdf\x41\x3f\x9e\xde\xc6\xd7\x8f\x24" + "\x1d\xa7\x1f\xcf\x84\xb1\xfd\x9a\x8c\xb1\xe1\x33\x7e\xe2\xfa\xf1" + "\x4c\x3f\xbe\x7e\x3c\xcd\xae\x9d\x7f\x26\x9c\xe8\xc7\x33\x4a\x72" + "\xfc\x84\xce\xf6\x38\xa7\x1f\x4f\xd8\x8d\x0d\x9f\x89\x72\xa6\x1f" + "\xe9\x9c\x9a\xa8\x1c\xca\x52\x04\xbf\x63\x50\xce\xbe\xd0\x8f\x15" + "\xc3\xdf\x25\xd0\x1f\xa9\xe1\x6f\xd1\xb1\x48\x83\x4f\x4d\x94\x05" + "\xb4\x87\x05\xee\x53\x6e\xb8\x59\x5c\xfc\xa0\x09\x97\x9d\xec\xd9" + "\x02\x79\x7a\x9b\xba\x85\x5b\xe8\x38\xe8\xc3\xe1\xef\x64\x38\x06" + "\xe9\xbd\xa0\xdf\xd3\xac\x40\x5e\x37\xa8\x33\x46\x6b\x3a\x28\xb3" + "\xd7\x15\xea\xcc\x51\x9c\x47\xc3\xa6\xbf\x43\xdb\x7e\x26\x46\xb4" + "\xac\x90\x57\xc4\x81\xfe\x28\xd5\x44\xff\xaf\x38\xa1\x0e\x55\x51" + "\x7f\x9f\xe8\x5d\xdb\x2d\x1c\xda\x21\x84\xf5\x5e\xd1\x83\x06\x25" + "\xce\xb3\x38\xa1\x09\x9f\x0b\xc5\xe7\xcc\x50\xc6\xb4\xc5\x88\xca" + "\xae\xeb\xa6\x02\x5d\xd5\x25\xbd\x9e\xae\x7e\xd5\x04\x65\x4e\x36" + "\xa1\x93\xfd\x2b\x95\x1f\xbc\x53\xc9\xf4\x3d\x65\xf5\x66\x26\x0f" + "\x4d\x02\x2e\xcf\xdf\x27\xef\x86\xf4\x42\x65\x58\x7f\x18\x85\x74" + "\x19\x44\xeb\xa5\xf5\x77\x7f\x2f\x14\x8b\xa3\xf7\x9a\xfe\xa8\xf8" + "\x51\x88\x9d\x06\x51\x42\xe7\xa5\xdd\xe7\x1f\xce\xd6\xbf\x55\xbd" + "\xd5\x87\xae\x4f\xdf\x89\xa8\xad\x96\x6e\xaa\xcf\xa1\x4d\x2c\xd8" + "\x4e\x1b\x1a\x36\xfd\x23\x59\xef\xf1\xb7\x7a\x1c\xf3\xd7\xe1\xfc" + "\xd6\x3e\xb4\xe1\xf6\x5a\xcc\x9b\x7f\xe4\x9c\x82\xbe\xdd\x1e\x8b" + "\xa5\x31\x8b\xe7\x6a\x92\x16\x2e\x8e\x7d\x75\x79\x92\x66\x40\x4c" + "\x0f\x34\xe5\xd5\x57\x35\x8b\xe7\x26\xac\xd2\xd8\x9e\x79\x46\x13" + "\xb3\x70\xd9\xdc\x79\xf1\xb1\x83\x17\xcf\x4f\xec\x01\x65\x42\x36" + "\xe5\xf0\xc5\x65\xb1\x6c\xfa\x47\xfe\xee\x37\x11\x7a\xab\x17\x52" + "\xe2\x72\x35\x6c\x2a\x41\x7a\xa5\x4a\x89\xef\x97\xbd\x9d\xae\xa7" + "\x20\x4d\x3a\xb4\x69\x5b\xd3\xba\xe1\xb4\x9e\x05\x50\xae\xdd\x50" + "\x6e\x28\x23\x94\xb9\x24\xc4\x5a\x66\x2b\x27\xd2\x31\x27\xd2\xea" + "\x80\x83\x25\x13\xbd\x8d\xdd\x9e\xa7\xe9\x28\xfc\x7c\xf5\x50\x57" + "\x3c\xe0\xd8\x0f\x8c\x07\xd8\x56\x13\x05\xd7\xc6\x59\x39\x66\xc9" + "\x1d\x6a\xa0\xdf\xac\xd1\x80\x76\xf4\x68\xa0\xe3\x7e\x05\xdc\xc4" + "\xd7\x1f\x1d\x82\x50\x06\xdd\x10\xc5\xec\x3f\x40\x37\x00\x87\x09" + "\x4f\xe1\xdc\xd9\xcc\xdb\x14\x7a\x0e\xf2\x38\xa8\x47\x8b\xe2\x71" + "\x1e\x7a\x38\x86\x63\x6e\xd9\x13\x91\x38\x55\x87\x32\x1e\xc9\x40" + "\x19\x0d\xf8\x9a\x42\x9f\x70\xef\x24\xe4\x11\x91\x4c\x7f\x0b\xed" + "\x8e\x07\x1d\x18\x91\x48\xef\xf3\x09\xd7\x53\x25\x39\x96\xbc\xa1" + "\x06\x78\x9e\x5a\xc8\x07\x14\xe2\xdd\x75\x38\x9f\xad\xdb\x99\xd8" + "\xd7\xe2\x67\x87\xf8\x80\x97\xa1\x8b\xe9\xb5\x6c\x1d\xca\x79\x00" + "\xbc\xd9\x74\x54\xae\xbc\x8b\x22\x4c\x74\x33\xbd\xed\x81\xd0\xb2" + "\xfa\x7a\x68\xd3\x12\xe7\xd3\x3d\xfe\x71\xc8\xdb\xb4\x30\xb6\xa0" + "\x17\xd4\xc5\x6d\xd3\x11\xbd\x2d\x68\xca\xd4\x41\x48\xdd\xb0\xe9" + "\x6c\xa4\x35\x9e\x10\x4b\xa5\x34\x1e\x9d\x65\xd6\x74\xc1\x7c\x80" + "\xf2\xb0\x7c\x38\xbb\xe7\x54\x92\x23\x1f\x5a\xea\xe6\xf6\xc0\x68" + "\x13\x1d\xf5\x7c\x73\x6e\xe0\x0e\xda\x37\x70\x5d\xda\x0f\xa8\x2b" + "\x8e\x6d\x19\xe8\xfd\xec\x15\xc8\x7f\xcb\xcb\x48\x33\x67\x95\x1a" + "\x19\xf2\x02\x33\xbc\xd7\x64\x78\x40\x4c\x28\x68\x5f\x42\xa1\xcd" + "\x0c\x6d\xee\x33\xd4\x90\x12\x8b\xa8\x43\x57\x8a\x28\xac\x93\xf1" + "\xbc\x90\xab\xd4\x17\x73\x77\xc3\x75\xf4\xcd\x28\x84\xf1\x60\xb0" + "\xb8\x19\x87\x26\x2e\x84\xfe\x79\x11\x73\x3e\x6f\x17\xe4\x29\xed" + "\xb9\xbe\x60\xf4\xaf\x19\xb0\x1a\x02\x38\x95\x57\x99\x99\x3c\x19" + "\xac\xe2\x39\xac\x4e\x40\x39\x38\xbc\xbe\x08\xc0\xb8\x8a\x3c\xb3" + "\x9e\x3c\x73\x90\x3f\xed\x1b\xa4\x14\x7f\xe6\x20\x44\x9e\xb9\x4b" + "\x9d\xf3\x67\xfe\x72\xaa\xf3\x67\xfe\x72\xa3\xf4\x67\xfe\x52\x23" + "\xfd\x99\xbf\x54\x8b\x3f\x73\x10\x8b\x73\x10\xe0\x1c\xe4\x04\xe7" + "\x20\x16\xe7\x07\xae\x38\x7f\xe6\xd2\xf1\xce\x9f\xb9\x34\x55\xfa" + "\x33\x97\xfa\x4a\x7f\xe6\x52\xa5\x93\x67\x66\x71\x0e\x06\x9c\x83" + "\x9d\xe0\x1c\xcc\xe2\xec\xf3\x95\xf3\x67\x3e\x37\xd2\xf9\x33\x9f" + "\x5b\x22\xfd\x99\xcf\xa9\x64\x3c\xb3\x51\xfc\x99\x83\x59\x9c\x83" + "\x01\xe7\x60\x27\x38\x07\xb3\x38\x3f\xbd\xc9\xf9\x33\x97\x0d\x75" + "\xfe\xcc\x65\xb1\x32\x9e\xd9\x24\xfd\x99\xcf\xd5\x3a\x79\x66\x16" + "\x67\x2d\xe0\xac\x75\x82\xb3\x96\xc5\x79\xe6\x18\xe7\xcf\x5c\x3e" + "\xc0\xf9\x33\x97\x4f\x97\xfe\xcc\x65\x06\xe9\xcf\x5c\xa6\x17\x7b" + "\xe6\x26\x68\xb7\x3d\xe1\x59\x9a\xff\x1d\xf5\xbc\xd9\x37\x30\xcb" + "\xb3\x0a\x51\xf9\x6b\x2d\x71\xde\xd5\xa8\x3b\x3c\x5b\x1c\xbd\x3d" + "\xac\x18\xff\x6b\xf1\x0d\xcc\x6c\xf2\x0d\xdc\xd1\xd8\xab\x46\xf3" + "\xda\x6c\xd4\x15\xeb\xf1\x8d\x16\xe4\x6f\xc9\x0d\x5c\x97\xf5\x22" + "\xd2\xa4\x1b\x90\xba\x2c\x4d\x8f\xd2\x12\x69\x43\x19\xfa\x0e\xf5" + "\xac\xc6\xde\xf3\x1b\x54\x5a\x5b\x82\x12\x96\xd2\xf4\x55\xaa\x62" + "\x1f\x7e\x07\x0c\x3a\x39\x23\xe7\x5f\x48\x03\xf7\x08\xdd\x0d\x3f" + "\x9c\x8f\xf7\x04\xe8\x3f\xb7\x87\x7d\x56\x90\x86\xfc\x3f\x5d\x54" + "\x8d\xf0\xf1\x5d\xf0\x33\x6f\x1f\x6a\x48\x9b\x8d\xa8\xc3\x75\x95" + "\x14\xe9\x9b\x2b\x96\xd8\xf7\xcd\x13\xe6\x42\x2c\xe7\x31\xe7\x4e" + "\xe4\xbf\x28\x35\x96\x15\x23\xac\x7d\x37\x13\xcb\x4b\x66\xd2\xdf" + "\xdb\xf5\xdd\x9f\xc2\xfd\xb9\x58\x56\x84\xe0\x58\xd2\xb9\x81\x7b" + "\xca\xab\x9b\xb0\x6f\x52\x5f\x4d\x46\x94\x9e\x2a\xbf\x54\x96\x58" + "\x87\x44\x62\xac\xe7\x62\x1c\xe4\xe9\x59\xd5\xa5\x4e\x38\xc6\x41" + "\xaa\x26\xdf\x20\x7f\xc7\x18\x07\x29\x5d\x8b\xf1\x57\xdd\xdd\x8f" + "\xf1\xf9\x8b\xe2\x31\xfe\x2a\x50\x7a\x8c\xcf\xef\x91\x1e\xe3\xf3" + "\x39\x24\xc6\x41\x1a\x7e\x8c\xcf\x8f\x12\x8f\x71\x90\x0d\x8f\x83" + "\x80\xc7\x0f\x5c\x11\x89\x31\xf0\x38\x48\x80\xc7\x41\x2e\xf2\xf8" + "\x9f\x8b\xdd\x8f\xf1\x3f\x87\x8b\xc7\xf8\x9f\xeb\xa5\xc7\xf8\x9f" + "\x4a\xe9\x31\xfe\xaa\x9e\x8d\xb1\x1d\x8f\xbf\x2a\x74\x12\x63\x1b" + "\x1e\x07\x03\x8f\x7d\xbe\x12\x8e\x71\x30\xf0\x38\x58\x80\xc7\xc1" + "\x2e\xf2\xf8\xc2\x79\xf7\x63\x7c\x61\x97\x78\x8c\x2f\xd4\x48\x8f" + "\xf1\x85\x38\xe9\x31\xbe\x10\x45\x62\x1c\x6c\xc7\xe3\x0b\x2a\xf1" + "\x18\x07\xdb\xf0\x38\x18\x78\xfc\xf4\x26\x91\x18\x03\x8f\x83\x05" + "\x78\x1c\xec\x22\x8f\xff\xf5\x94\xfb\x31\xfe\x97\x87\x78\x8c\xff" + "\x35\x51\x7a\x8c\x2f\x96\x4a\x8f\xf1\xc5\xe3\x6c\x8c\xed\x78\x7c" + "\x31\xde\x49\x8c\x6d\x78\xac\x05\x1e\xcf\x1c\x23\x1c\x63\x2d\xf0" + "\x58\x2b\xc0\x63\xad\x8b\x3c\xfe\xf7\x4e\xf7\x63\xfc\xef\x58\xf1" + "\x18\xff\xfb\x43\xe9\x31\xfe\x77\xa8\xf4\x18\xff\x5b\x43\x62\xac" + "\xb5\xe3\xf1\xbf\x2a\xc4\x62\xdc\x0c\x1e\xb0\x27\xc4\xb8\x67\x2d" + "\xa2\x76\xe1\xd8\x56\x92\xd8\x9a\xfb\x84\x15\xef\xa2\x2c\x71\x38" + "\x26\xcc\x18\xd0\x8f\xfe\x5e\xe6\xdc\xc0\x2c\x9a\x82\x67\x4a\xc3" + "\xe3\xae\x95\x7d\x4d\x6b\x91\x97\x26\x0d\x8f\xff\x7e\xcd\xcc\x0f" + "\xd0\xa4\x6d\xb8\x0c\xf7\x53\xe0\x71\x2f\xd3\xb6\x6a\x64\xf6\x1b" + "\x50\x01\xe7\x26\xd3\x03\x7a\x47\x83\xdf\xdc\x43\xbf\xe2\xef\x5b" + "\x5e\x5b\x04\xf1\xf9\x02\x95\x55\x7e\x82\x2c\x7d\xc2\x3e\x1b\x62" + "\x42\x3a\xfa\x47\x9d\x6f\x69\x92\x1e\x99\xe7\xfb\x7b\x96\x27\x97" + "\xa0\xf2\xe4\x8f\x50\x44\x35\x7d\x97\xfe\x5e\xe7\xd9\xec\xf7\xac" + "\xca\xec\x17\xb6\xc7\x9c\x37\x36\xd3\xe4\xf7\x8c\xf1\xd0\x0a\x3d" + "\xe5\x69\x44\xba\xf8\x2a\x9a\xce\x9e\x87\x94\xd9\x57\x90\x6a\xeb" + "\x3c\xe4\xb9\xf5\x0a\x52\x97\x56\x55\xa2\x73\xd7\x4a\xd0\xb9\xba" + "\xaf\xd1\xb9\xbb\xf0\x6b\x82\x9f\x05\x7e\x19\x5f\x03\xd6\x08\x4d" + "\xbc\x8e\xf0\xde\x8d\x86\xc7\x2e\x21\xdf\x52\x53\x25\xc2\xdf\xbf" + "\xde\xa0\x2a\xaf\x7b\x46\x23\x5f\xfa\x7b\x7f\x44\xcf\xf7\xa7\xe0" + "\x9c\x12\x1f\x2f\x37\x19\x50\x69\x95\x11\x9f\x2f\x85\xf3\xca\xf4" + "\x2a\xc8\xdf\x52\x82\xf7\x66\x34\x94\x66\x9c\x85\xe7\x7b\xdb\x40" + "\x63\x0f\xdd\x27\x30\x3a\x07\x42\x6d\xa1\xfd\x83\x08\x0f\xbe\xe9" + "\xb2\xdb\x22\x15\xeb\xaf\x03\x98\x18\xbf\xe2\xdf\x0b\xe2\xfc\xa0" + "\xe5\x95\x28\xf5\xa4\xaf\xbf\xa5\xcb\xea\x2b\x99\xb1\x84\xb2\xfa" + "\x2f\x50\xf9\x3a\x0b\x8a\x58\x85\xd0\x04\x33\x42\x38\x16\xe5\xc9" + "\xd5\x68\x52\x22\xf2\xc6\xe3\xcf\x96\x1f\x75\xbd\xca\xab\x0c\x28" + "\xd5\x04\x65\xbc\x61\x6c\x29\x63\xd9\xba\x32\x04\xe7\x1e\x2c\x8b" + "\xd3\x23\xcf\x44\xa4\xc6\xf1\x35\xe5\x06\x66\x4e\x82\xfa\x93\x50" + "\x4f\xd3\x38\xb6\x38\xa6\x38\xbe\x38\x3f\x6b\xcc\xcb\x63\x0c\x28" + "\xdd\x88\xd4\xe5\x69\xf0\x6f\x32\x6d\x28\x47\xb7\x10\x94\x11\xd1" + "\x3e\x6f\x1b\x80\x17\xa7\x31\x17\xf4\x54\xa5\x1a\xf0\xef\x25\xcc" + "\xa9\x20\x25\xe1\x54\x97\xba\xd6\x39\x15\xe4\xc9\x71\xea\x9b\xc5" + "\x1c\xa7\x2e\x8d\x17\xe7\xd4\x7f\xf6\x11\x4e\x05\x69\x3a\x26\xa7" + "\xfe\x33\xda\x39\xa7\xfe\xa3\x11\xe7\x54\x90\x3f\x70\x4a\xcf\xe7" + "\xd4\xa5\xe9\xd2\x39\xf5\x9f\xc4\xf6\xe3\x54\x90\x4a\x1e\xa7\xfe" + "\x33\x85\xcf\xa9\x6f\x62\x9c\x70\x8a\x6d\xa7\x1e\xb8\xe2\x02\xa7" + "\x6c\xda\xa9\x4b\xa7\x38\x4e\xfd\x77\x97\x38\xa7\x2e\x37\xb2\x9c" + "\xea\xa0\xed\xd4\xe5\x3c\xe7\x9c\xba\x9c\xe4\x84\x53\xd0\x4e\x05" + "\xd9\xb5\x53\xff\x3d\x24\x9d\x53\x97\x4f\xb7\x23\xa7\x64\xb6\x53" + "\x97\xf7\xf3\x39\x75\xe9\x98\x38\xa7\x82\xd9\x76\xca\xe7\xab\xd6" + "\x39\x15\x6c\xd3\x4e\x7d\xeb\xc7\x71\x4a\x7f\x4b\x9c\x53\xfa\x89" + "\x84\x53\xc1\x1d\xb4\x9d\xfa\xb6\xc6\x39\xa7\xbe\x2d\x11\xe7\x54" + "\x30\xb4\x53\x41\x76\xed\xd4\x77\x1e\xd2\x39\xa5\xf7\x6f\x3f\x4e" + "\x05\xcb\x6c\xa7\xbe\x35\xf1\x39\xf5\xad\xa7\x13\x4e\xb1\xed\xd4" + "\xd3\x9b\x5c\xe0\x94\x4d\x3b\xf5\xdd\x42\x8e\x53\xdf\x8f\x13\xe7" + "\xd4\x95\xbd\x2c\xa7\x3a\x68\x3b\x75\x65\xa4\x73\x4e\x5d\x09\x70" + "\xc2\x29\x68\xa7\x82\xed\xda\xa9\xef\xa7\x4a\xe7\xd4\x95\xf8\x76" + "\xe4\x94\xcc\x76\xea\x4a\x24\x9f\x53\xdf\x45\x8b\x73\x4a\xcb\xb6" + "\x53\x33\xc7\xb4\xce\x29\xad\x4d\x3b\xf5\xfd\x09\x8e\x53\x3f\xec" + "\x14\xe7\x54\xd5\x1d\xc2\x29\x6d\x07\x6d\xa7\xaa\xb6\x39\xe7\x54" + "\x55\xa2\x38\xa7\xb4\xd0\x4e\x05\xdb\xb5\x53\x3f\x1c\x90\xce\xa9" + "\xaa\xe2\xf6\xe3\x94\x56\x66\x3b\x55\x55\xc8\xe7\xd4\xf7\x47\xc4" + "\x38\xd5\x84\x7d\x9f\x07\x70\x2a\x0e\x7c\x1f\x70\xc8\xbb\x82\x70" + "\xaa\x19\x38\xf5\xae\x2d\xa7\xfe\x63\xef\xfb\xae\xfa\x58\x5a\x38" + "\x55\xdd\xcf\x9e\x53\x16\xe0\x54\x33\xc3\xa9\xff\x3d\x65\xf5\x7d" + "\xe5\xb5\x7b\x00\xab\x6b\xa8\x3c\x12\xf8\xb4\x9d\xe5\xd3\x7f\x80" + "\x4f\xf0\x3c\x16\x78\xde\xd2\x4b\x95\x28\xc2\x40\x9e\xab\x09\x9e" + "\xd7\x62\xcb\xa5\xa6\x6a\x0a\x73\x08\x73\xc7\xca\xa3\x73\x09\xc0" + "\x9f\xa5\xe7\xd1\xb9\x15\xf0\x5b\x0d\xbf\x34\xf8\xa1\xf3\xa8\xb4" + "\x1a\x31\x63\xf6\x1c\x7f\x2a\x58\xfe\x5c\x3d\xef\x9c\x3f\x57\x8b" + "\xa4\x79\xbc\xea\xc1\xd2\xf9\xf3\x3f\xc4\xce\xa5\x53\x47\x4c\xfe" + "\x96\xc6\x73\x60\x09\x47\xae\xa1\x08\x13\xf2\xa6\x67\xea\x7a\x79" + "\x46\x21\xf5\x6b\x66\x44\x6d\x99\x87\xd4\x5b\xbe\x81\xe7\xb5\xd6" + "\x9d\x2b\xc8\xf3\x0b\xe3\x27\xa8\xb4\xae\x12\x95\xde\x3d\x8b\x4a" + "\x2d\xf0\xbb\x06\x3f\x28\x63\x44\xac\xed\xf3\x1a\xd8\xe7\xfd\xdf" + "\x29\xc8\x4b\x2b\xfe\xbc\xff\xdb\xc3\x3c\x6f\x0c\x3c\x6f\x13\xf7" + "\xbc\xe5\xc0\x45\xc0\xe5\x41\x0b\xeb\x13\x23\x0c\xa8\xfb\xab\x26" + "\x9a\x6e\x62\x39\x88\x71\xf9\xe2\x82\x11\x45\x24\x02\x56\xf3\x81" + "\x83\x55\xfb\x51\x7a\x0a\x70\xb0\xc9\x88\xdf\xeb\x1b\xca\x33\x1a" + "\x81\x83\x57\xab\x68\x88\x5b\x33\xe6\xe0\x7f\x30\x07\xaf\xaa\x2c" + "\xa2\x1c\x04\x9f\xc8\x70\x10\x7c\x62\xab\x1c\xb4\xf5\x89\xd5\x79" + "\x1c\x07\xaf\xed\x15\xe7\x60\xcd\xc7\x56\x9f\xf8\xd3\x73\xb0\x66" + "\xaa\x73\x0e\xd6\x84\x49\xf3\x84\xd7\x3e\x94\xce\xc1\x9a\x75\xed" + "\xc7\xc1\x6b\xe3\x9c\x73\xf0\x9a\xb6\x75\x0e\x06\xa9\xe4\x71\xb0" + "\x26\x8e\xcf\xc1\xea\x2c\x27\x1c\x64\xdb\x41\xf0\x95\xad\x73\xd0" + "\xa6\x1d\xfc\xb1\x2f\xc7\xc1\xeb\x03\xc4\x39\x58\x3b\xd2\xea\x2b" + "\x7f\x7a\x0e\xfe\xf8\xb5\x73\x0e\xfe\x78\x4c\x9a\x87\xbc\xfe\x94" + "\x74\x0e\xd6\xaa\xda\x8f\x83\xb5\x67\x9d\x73\xb0\x76\xbf\x0b\x1c" + "\x94\xd9\x0e\xfe\x58\xcb\xe7\xe0\x8f\x6a\x71\x0e\x06\xb3\xed\x20" + "\xf8\xd0\x56\x39\x68\xeb\x43\xaf\xef\xe2\x38\x78\xf3\x80\x38\x07" + "\x6f\x9c\xb2\xfa\xd0\x9f\x9e\x83\x37\x66\x3b\xe7\xe0\x8d\x11\xd2" + "\x3c\xe7\xcd\x8f\xa5\x73\xf0\x46\x56\xfb\x71\xf0\xe6\x44\xe7\x1c" + "\xbc\x19\xd2\x3a\x07\x83\x65\xb6\x83\x37\x12\xf9\x1c\xbc\x9e\xeb" + "\x84\x83\x6c\x3b\x08\xbe\xb5\x75\x0e\xda\xb4\x83\x86\x40\x8e\x83" + "\x75\x83\xc5\x39\x78\x6b\x9c\xd5\xb7\xfe\xf4\x1c\x34\x7c\xe7\x9c" + "\x83\x86\x62\x69\x1e\xb5\x6e\xa4\x74\x0e\xde\x52\xb7\x1f\x07\x6f" + "\x9d\x77\xce\xc1\x5b\x45\x2e\x70\x50\x66\x3b\x68\xa8\xe7\x73\xd0" + "\xe0\x2f\xce\x41\x2d\xdb\x0e\x82\xcf\x6d\x95\x83\xb6\x3e\xb7\x6e" + "\x1f\xc7\xc1\xfa\x0f\xc5\x39\x78\xfb\xac\xd5\xe7\xfe\xf4\x1c\xbc" + "\x1d\xeb\x9c\x83\xb7\xc7\x4a\xf3\xb4\xf5\xa7\xa4\x73\xf0\x76\x6e" + "\xfb\x71\xb0\x7e\xaa\x73\x0e\xd6\x87\xb5\xce\x41\xad\xcc\x76\xf0" + "\x76\x32\x9f\x83\x75\xf9\x62\x1c\xb4\x80\x2f\x6e\x2e\xec\x1d\x6d" + "\xc9\x7d\x56\xe5\xed\xa1\x41\x26\xdf\x01\x15\xe5\x49\xf5\x68\xd2" + "\x1d\x88\x4f\xe2\x1d\xf4\xf2\x1d\x35\x32\xe7\x3e\x63\x04\x5f\x98" + "\x69\xe3\x9f\x99\xb9\x65\xa6\x9c\xb7\x0d\x5b\x13\x90\x12\xfc\xf7" + "\x67\xf8\x58\xf9\x55\x23\xc2\xf7\x4f\xc5\xe5\xb9\xc6\x95\x07\x8f" + "\x13\xd0\x37\x75\x6a\xe6\x1d\x73\x93\x1e\x55\x8d\x40\x8a\xd2\x2a" + "\x3d\xc4\x61\x35\x83\x2f\x8e\xcb\x55\xea\x4e\x6e\xc1\x0d\xa4\x34" + "\x7d\xef\xff\x20\xc4\xdb\xb7\xe7\x4a\xe4\x11\x50\x45\x5b\x70\x5c" + "\x71\xbc\x70\x8c\x35\xab\xf1\xbb\xeb\x3b\x3f\x94\x01\xc7\x4c\xdf" + "\xeb\x1e\xdc\x0d\xe9\x84\xfd\xea\x9d\xeb\xd2\xb9\x71\x87\xfd\x1e" + "\xf6\x4e\x56\xe9\x25\x24\xf8\xee\xd8\x02\xfe\xcd\xb5\x58\x05\xa9" + "\x6c\x7c\xde\x3d\x88\xd5\xdd\x62\xd7\x62\xd5\xe0\xc3\x8f\x95\x90" + "\xaf\x6a\xe8\x2b\x3d\x56\x77\xd9\x75\x22\xef\x1e\x73\x12\x2b\x17" + "\x79\x15\x94\x69\xe3\x47\xee\x41\xac\x1a\x6a\x5d\x8b\x95\x71\xa4" + "\x5d\xac\x04\xf4\xbf\x71\x9c\xf4\x58\x19\x55\x24\x56\x0d\x55\xe2" + "\xb1\x0a\x76\x91\x57\xc1\x2a\x1b\xdd\x7c\x0f\x62\xd5\xe8\xef\x5a" + "\xac\x1a\x17\xf2\x63\x25\xa4\x53\x1b\x97\x48\x8f\x55\x63\x18\x89" + "\x55\xa3\xda\x49\xac\x5c\xe4\x55\x70\xa6\x8d\xbe\xbb\x07\xb1\x6a" + "\x1a\xeb\x5a\xac\x9a\xf2\xec\x62\x25\xa0\xa7\x9a\x76\x49\x8f\x55" + "\x53\x34\x89\x55\xd3\x08\xf1\x58\x69\x5d\xe4\x95\x56\x65\xa3\x43" + "\xee\x41\xac\x9a\x13\x5d\x8b\x55\xf3\x29\x7e\xac\x84\xfa\xfd\xe6" + "\xb3\xd2\x63\xd5\x9c\x45\x62\xd5\x1c\x27\x16\x2b\x73\x6e\xe0\x3a" + "\x6f\x88\x41\xe3\xf6\xc0\x68\xef\x64\x44\x35\x69\x21\x6e\xbe\x10" + "\xb7\x35\x1a\xd4\x9c\x0b\x71\x33\x98\xd0\xa4\x25\xdf\xd2\x65\xb5" + "\x66\xd4\x04\x31\x6b\xf4\x0d\xcc\x2c\x37\x54\xe3\x39\x47\xcf\x5e" + "\xa1\xcc\x07\x66\x2e\x51\x23\x1c\x37\x1c\x07\x1c\x3b\x1a\xe2\xc6" + "\xc4\xd1\x77\x6c\xa6\xd9\x37\x6c\xcf\xc4\xeb\xdf\xd2\xaf\xea\x69" + "\x1a\x3f\x2f\xad\xae\x46\xf8\xbd\x40\x44\x35\xea\xae\x79\x11\x3f" + "\x93\x79\x3a\x3e\x5e\x6e\xa8\x04\x7d\x50\x87\x18\x6d\xf6\xad\xce" + "\xd7\xfc\x3b\x9d\xa7\xb9\x3c\xea\x79\xba\x57\x8d\xc6\xd4\x67\xa8" + "\x21\xfd\x3a\xea\x8a\xf5\x43\xb6\x05\xf9\xa7\x2e\x46\xd4\xe1\x45" + "\xc5\x14\xf3\xed\xda\x52\x26\x8f\x01\x10\x17\x7f\xfa\xb6\xcd\x9c" + "\xee\xdb\x71\xa8\xfc\x6a\x0e\x83\x9b\xbd\x46\x60\x70\xfb\xb7\x4e" + "\x0d\x3a\x33\x94\xf6\x0d\xdc\x91\x53\x86\x34\x74\x33\xc4\x98\xf9" + "\x9e\xc8\xe2\x53\xd0\x24\x35\xc6\x26\x66\xfe\xb7\x45\xc3\xce\xdf" + "\x82\x38\xe1\xfb\x33\xf3\xb7\x12\x6d\xe6\x6f\x41\x99\xb9\xf9\x5b" + "\xa6\x23\x78\xfe\x96\xe5\x5b\xff\x07\xad\xcf\xfe\x6a\x3c\x4d\xc3" + "\xb3\xf7\x2a\xab\x37\x20\xfc\xfc\x65\xf5\xc5\x28\x3d\x09\xa9\xcb" + "\x9a\xaa\x51\x5a\x3d\x6d\x28\xcb\xa8\x41\x11\x77\xb0\x0e\xc6\x7c" + "\x31\xef\x25\xb8\x9a\x92\x2c\xdf\xea\x1e\xd4\x53\xe6\x1d\x65\x15" + "\x08\xd9\x7c\xc7\x13\x07\x9a\x59\x05\x38\xc4\x95\x67\x5c\x41\x74" + "\x9f\xa7\x34\xe5\xa6\x6f\x30\x4e\x71\x70\x7e\x44\x8b\xbe\xee\xf3" + "\x54\x10\x3e\x86\x31\xc3\xef\x9b\xf0\xfa\x00\x05\x36\xfa\x1b\xf3" + "\xc2\x3b\x39\x03\x95\x27\x37\xa1\x32\x13\xfe\x66\xd7\xa4\xf9\x32" + "\xaa\x52\x84\x47\x41\x4a\x96\x47\x7a\xef\xe4\x2e\x75\xad\xf3\x28" + "\x48\xc5\xf1\x88\xbe\xe5\x1e\x8f\xe8\xbd\xee\xf3\x88\x5e\x2c\x9f" + "\x47\x41\xfe\x3c\x1e\x29\xd0\x74\xe9\x3c\xa2\x87\x49\xe7\x91\xc5" + "\xe4\x1e\x8f\xe8\x1a\xc2\x23\xcb\x71\xc2\x23\x5a\xcf\xf1\x88\xf9" + "\x36\xea\x1e\xf1\xc8\x12\xe7\x84\x47\x6c\x7b\x14\x04\xed\xd1\x03" + "\x57\x5c\xe0\x11\xd7\x1e\x29\xa8\xe1\x6e\xf1\x48\xe1\x51\xe3\x36" + "\x8f\x14\x1e\x47\xdd\xe0\x11\xbf\x3d\x52\x50\x7b\x25\xf3\x48\xe1" + "\x91\x21\x99\x47\x0a\x8f\xb1\x6e\xf1\x48\x41\x31\xdf\x7e\x43\x3e" + "\x4a\x86\x47\x0a\x4a\xc7\xf1\x88\xf9\xde\xec\xde\xf0\x48\x81\x8a" + "\xc4\x79\x14\xcc\xb6\x47\x41\xd0\x1e\xf9\x7c\xd5\x3a\x8f\x82\xb9" + "\xf6\x48\xa1\x5c\xe3\x1e\x8f\x94\x43\xdd\xe7\x91\xc2\x2c\x9f\x47" + "\xc1\x76\xed\x91\xb2\x46\x3a\x8f\x14\x25\xd2\x79\xa4\xc8\x72\x8f" + "\x47\xca\x55\x84\x47\x8a\x09\x84\x47\xca\x44\x8e\x47\xcc\x37\x7c" + "\xf7\x88\x47\x94\xd1\x09\x8f\xd8\xf6\x28\x18\xda\xa3\xa7\x37\xb9" + "\xc0\x23\x9b\xf6\xa8\xeb\x59\xf7\x78\xd4\x75\x95\xfb\x3c\xea\x3a" + "\xce\x0d\x1e\xd9\xb5\x47\xdd\x86\x4a\xe7\x51\x57\xb5\x74\x1e\x75" + "\xb9\xe0\x1e\x8f\xba\x9e\x22\x3c\xea\x92\x4b\x78\xd4\xf5\x18\xc7" + "\x23\xe6\xbb\xc8\x7b\xc4\xa3\x2e\xa3\xc4\x79\xa4\x65\xdb\xa3\x60" + "\x68\x8f\x66\x8e\x69\x9d\x47\x5a\x9b\xf6\xa8\xbb\x8f\x7b\x3c\x52" + "\x9d\x72\x9f\x47\xaa\x2d\xf2\x79\xa4\xb5\x6b\x8f\xba\xaf\x92\xce" + "\x23\x55\x94\x74\x1e\xa9\x02\xdc\xe3\x51\xf7\xee\x84\x47\xdd\x2e" + "\x11\x1e\x75\x47\x1c\x8f\x98\x6f\x4d\xef\x11\x8f\xba\x65\x8a\xf1" + "\x08\xaf\x45\xf0\x16\x59\x17\xa2\x7e\xeb\x6a\x34\xac\x00\xff\xdb" + "\x84\x42\x1b\xb2\xbb\x17\x9d\x4a\x21\xeb\x01\x40\x39\x99\xf1\x5e" + "\xa1\xeb\x1f\x38\x00\xb8\xf8\x06\x66\x44\x5c\x26\x6b\x34\xe0\x75" + "\x41\x6e\xa7\xc7\xa1\x21\x78\x5d\x06\x45\x8f\x6a\xbc\x8e\x55\xcb" + "\xda\x01\xbe\x22\x6b\x07\xcc\x10\x5f\x3b\xa0\x69\xbb\xf5\xbb\xdb" + "\xfd\xdc\x77\xb7\x8a\x1e\x47\x9d\x7e\x77\xab\xe8\xb1\x6b\xd7\x0c" + "\xa9\x7c\xe8\xc1\x7c\xff\x75\xbb\x4f\x60\x74\x43\x76\x8f\x83\xf0" + "\xcc\xeb\xc8\xb3\x3f\xc0\xac\xb7\xd2\xfa\xf7\xb8\xfb\x6d\x78\xd2" + "\x23\x6a\xea\x2c\x94\x41\x6f\x3a\x7b\x90\xf6\x0b\xcc\xa0\xf3\x02" + "\x73\x24\x96\xa5\xde\x79\xbc\x83\x90\x70\xbc\x3d\xa3\xd8\x78\x93" + "\xef\x9c\x7d\x45\xd6\x2d\x98\x21\xbe\x6e\x81\x70\xbc\x3d\x9d\x7f" + "\xe7\xac\xf0\xec\x29\x3d\xde\x0f\x54\xb2\xf1\xd6\x37\x64\x7b\x06" + "\x70\xf1\xf6\xdc\x21\x3d\xde\x0f\x94\x90\x78\x7f\xb1\x87\xf6\x0b" + "\x42\x74\x5e\x90\x5a\x5a\x59\x3c\x63\x5a\x89\xb7\x08\xbf\x7b\x96" + "\x90\x78\xb3\x6b\x26\xf8\x8a\xac\x99\x30\x43\x7c\xcd\x04\xe1\x78" + "\xf7\xcc\x73\x1e\xef\x9e\xa9\xd2\xe3\xdd\x33\x9c\xc4\x3b\x08\xf8" + "\xdd\x33\x8b\x8b\xb7\x97\x8b\xeb\x0a\xd8\xc6\xbb\xe7\x30\x12\xef" + "\x2f\x73\x21\xde\xc0\xef\x20\x89\xfc\xee\x79\xc1\x79\xbc\x83\x45" + "\xf8\xed\x3d\x8c\x8d\x37\xcb\x6f\x91\xf5\x1a\x66\x88\xaf\xd7\x20" + "\x1c\x6f\xef\x2e\xce\xe3\xed\x75\x5d\x7a\xbc\xbd\x8e\xb1\xf1\x06" + "\x7e\x7b\x99\xb8\x78\x7b\x27\x4b\x8f\xb7\xd7\x7e\x12\xef\xd2\x4c" + "\xda\x2f\x18\xf8\x1d\x2c\x91\xdf\xde\x63\x5b\x89\xb7\x08\xbf\xd5" + "\xfb\x49\xbc\xd9\xb5\x22\x7c\x45\xd6\x8a\x98\x21\xbe\x56\x84\x70" + "\xbc\xd5\xcb\x9d\xc7\x5b\x3d\x5b\x7a\xbc\xd5\x3a\x12\xef\x60\xe0" + "\xb7\x3a\x9e\x8b\xb7\xba\x5a\x7a\xbc\xd5\xfe\x24\xde\xe7\x52\x20" + "\xde\xc0\xef\x60\x89\xfc\x56\x1f\x71\x1e\x6f\xad\x08\xbf\x7b\xf9" + "\xb3\xf1\x66\xf9\x2d\xb2\x4e\xc5\x0c\xf1\x75\x2a\x84\xe3\xed\xf3" + "\x83\xf3\x78\xfb\x9c\x93\x1e\x6f\x9f\x1d\x6c\xbc\x81\xdf\x3e\x97" + "\xb8\x78\xf7\x8a\x92\x1e\x6f\x9f\x4c\x12\xef\xb2\x44\xda\x4f\x0b" + "\xfc\xd6\x4a\xe4\x77\x2f\xad\x58\xbc\xbd\x21\xde\x67\x40\xc7\x80" + "\xee\xc8\xb4\xe4\x82\x4e\x31\xf3\xe3\x5e\x9e\x3c\x0c\x3d\x7e\x17" + "\xc7\xde\x57\x09\x7d\x75\x66\xbb\xad\x97\xa1\xe8\x7d\xdd\xed\x6f" + "\x87\x15\xbd\x3f\x16\xfd\x76\x58\xd1\x7b\xaf\xe4\x6f\x87\x15\xbd" + "\xe3\x39\x0d\xd4\xbb\x88\xc3\xd4\x97\x69\x3f\x24\x7d\x53\xac\xe8" + "\x3d\x4b\x70\x1d\x0d\x45\x6f\x4f\xfc\x4d\x31\xbd\xa9\x3c\xc6\x92" + "\x27\x47\x1b\xf9\xaa\x5b\xc7\x3a\x48\x65\xc9\x05\x8d\x24\x8a\xb5" + "\x9f\x01\xfa\xad\xf6\x5b\xb7\x43\xe1\xf7\xb5\xfb\x58\xfb\xed\x13" + "\xc7\xda\x6f\x8b\x74\xac\xfd\xa2\x38\xfd\xe5\x97\xcf\x61\xdd\x47" + "\xfa\xf7\xe3\x0a\xbf\x70\xc1\xf5\x3c\x14\xbe\x46\x82\x75\x45\x89" + "\x25\x4f\x8e\x2e\xf3\x33\xb9\x80\x35\xd4\xeb\x20\x27\xf5\xfa\x17" + "\x97\x00\xeb\xcc\x76\x5b\x3f\x44\xf1\x8b\x33\xee\x63\xfd\x8b\x6d" + "\xe2\x58\xff\x62\x95\x74\xac\x7f\x31\x96\xd3\x7e\xbf\xc8\xe4\xb0" + "\xf6\x0f\x90\x8e\xf5\x2f\xc2\x04\xd7\x15\x51\xf4\xa9\x22\x58\x7f" + "\x15\x02\x58\xcb\xd0\x84\xbf\xa8\x6e\x1d\xeb\x60\xa8\xd7\xc1\x4e" + "\xea\x75\xdf\x12\xe8\xaf\xdb\x6f\x1d\x13\x45\xdf\x0f\xdd\xc7\xba" + "\x6f\xaa\x38\xd6\x7d\x63\xa5\x63\xdd\x37\x94\xd3\x9d\x7d\x93\x38" + "\xac\x1f\x54\x49\xc7\xba\xaf\x46\x70\x7d\x13\x85\x7f\x05\xc1\xfa" + "\x9f\x39\x96\x3c\x39\x7a\xb4\xaf\xa8\xfe\xb7\xc1\x1a\xea\x75\xb0" + "\x93\x7a\xfd\xd0\x11\xc0\x3a\xb3\xdd\xd6\x53\x51\x3c\xb4\xcb\x7d" + "\xac\x1f\x5a\x28\x8e\xf5\x43\x93\xa5\x63\xfd\x50\x00\xa7\x79\x1f" + "\x8a\xe6\xb0\x7e\xa8\x5e\x3a\xd6\x0f\x79\x0a\xae\xb3\xa2\x78\xf0" + "\x38\xc1\xfa\x42\x3d\x60\x2d\x43\x0b\x3f\x54\xdc\x3a\xd6\x5a\xa8" + "\xd7\x5a\x27\xf5\xba\x1f\xf8\x7a\x6d\xfb\xad\xeb\xa2\xe8\xb7\xd1" + "\x7d\xac\xfb\x4d\x15\xc7\xba\xdf\x48\xe9\x58\xf7\x53\x71\x7a\xbb" + "\xdf\x04\x0e\xeb\x7e\x7a\xe9\x58\x07\x18\x05\xd7\x7b\x51\x04\xec" + "\x27\x58\xff\x2b\xca\x92\x27\x47\x87\xf7\x13\xdd\xff\xc0\x99\x0e" + "\x5f\xb6\x0b\xa9\xf8\x78\x3f\x9c\xd3\xbe\x5a\xfc\xe1\x55\xee\xe3" + "\xfd\xf0\x38\x71\xbc\x1f\x1e\x2c\x1d\xef\xfe\x46\x4e\x8b\x3f\x3c" + "\x82\xc3\xfb\xe1\x0a\xe9\x78\xf7\xaf\x16\xd6\xe2\xfd\x77\xb8\xa7" + "\xc5\x1f\xce\x97\xa3\xc5\x1d\xf1\x86\x7b\xb7\xab\x1e\x0f\x5c\xe8" + "\x3e\xde\x81\x4f\x89\xe3\x1d\xd8\x4f\x3a\xde\x9a\x6a\x4e\x8f\x07" + "\x86\x70\x78\x07\x16\x4b\xc7\x5b\x53\x29\xac\xc7\x35\x99\xee\xe9" + "\xf1\xc0\x2c\x39\x7a\xdc\x11\xef\xe0\xc4\xf6\xd5\xe4\xc1\xd3\xdd" + "\xc7\x3b\x78\x80\x38\xde\xc1\x3d\xa5\xe3\x1d\x54\xc9\x69\xf2\x60" + "\x9b\xf1\xef\xe0\x22\xe9\x78\x07\x95\x08\x6b\xf2\xa0\x64\xf7\x34" + "\x79\x70\x8a\x1c\x4d\xee\x88\xf7\x80\xe8\xf6\xd5\xe5\x03\xc6\xbb" + "\x8f\xf7\x00\x3f\x71\xbc\xb5\x66\xe9\x78\x6b\x4b\x38\x5d\x3e\xc0" + "\x93\xc3\x7b\xc0\x1e\xe9\x78\x6b\x8f\x09\xeb\x72\x6d\x9c\x7b\xba" + "\x7c\x40\xbc\x1c\x5d\xee\x88\xf7\x23\x91\xed\xab\xcd\x1f\x19\xee" + "\x3e\xde\x8f\x74\x11\xc7\x7b\xe0\x75\xe9\x78\x0f\x3c\xc6\x69\xf3" + "\x81\x36\xe3\xff\x8f\xe4\x48\xc7\x7b\xe0\x7e\x61\x6d\x3e\x30\xca" + "\x3d\x6d\xfe\xc8\x2c\x39\xda\xdc\x11\xef\x41\xa3\xda\x57\x9f\x0f" + "\x1a\xe4\x3e\xde\xba\x3b\xe2\x78\xeb\x2e\x4b\xc7\x5b\xb7\x9f\xd3" + "\xe7\xba\x5a\x0e\xef\x41\x19\xd2\xf1\xd6\xed\x10\xd6\xe7\xba\x70" + "\xf7\xf4\xf9\xa0\x09\xee\x8f\x93\x87\x04\x60\x6d\x2e\x75\xfd\xc7" + "\xf2\x24\xf6\x9b\x3b\xc5\xa3\xdc\xfa\x8f\x8a\x90\x9e\x48\x6c\x6d" + "\x19\xc5\x63\x0b\x3b\xf4\xfa\x8f\x8a\x47\x9d\xaf\xff\xa8\x78\x54" + "\xda\xfa\x8f\x8a\xc7\x26\x4b\x9e\x8f\xaf\x78\x2c\x80\xf3\x08\x8f" + "\xd9\xf8\xff\x10\xb2\x47\x71\x47\x5e\x17\x52\xf1\x18\x7f\x5d\x48" + "\xc5\xa3\xcc\xba\x90\xf4\xa6\x7f\x1f\x97\xe7\x45\x42\x74\xee\xbf" + "\x17\x78\xdc\x88\x7d\x88\xd4\x75\x28\x39\x6e\x87\xdc\xe1\xb8\xfd" + "\x78\x8d\x38\xb7\x1f\x1f\xd7\xa1\xd7\xa1\x54\x0c\x3e\xeb\x9c\xdb" + "\x83\xf7\x4b\x5a\x73\x44\xf1\xb8\xf4\x75\x6f\x14\x83\x8d\x9c\x1f" + "\x7a\xdc\xc6\xff\x0e\x19\xd6\x7e\xdc\x96\xb9\x3e\xa5\x62\xf0\x25" + "\x3e\xb7\x43\x6a\x09\xb7\xbf\x51\xcb\xf3\x5d\x43\x94\xee\xbf\x07" + "\x19\x7a\x01\x7b\x2e\xa9\xeb\x61\x72\xdc\x1e\x72\x9e\xe3\xf6\xd0" + "\x33\xe2\xdc\x1e\x1a\xd8\xa1\xd7\xc3\x54\x84\xee\x73\xce\xed\xd0" + "\x75\x92\xd6\x32\x51\x0c\xed\x2e\x9d\xdb\xa1\x17\x38\xef\x37\xd4" + "\x9f\xe3\xf6\x13\xbe\xed\xc8\x6d\x99\xed\x76\xe8\x31\x3e\xb7\x87" + "\x94\x10\x6e\x5f\x8a\x91\xe7\x31\x87\xea\xdd\x7f\xef\x13\x56\x84" + "\xfd\xa5\xd4\x75\x39\x39\x6e\x3f\x71\x88\xe3\x76\x98\xc3\xba\x50" + "\x1c\xb7\x9f\x34\x77\xe8\x75\x39\x15\x4f\xae\x71\xce\xed\x27\xa3" + "\x25\xad\x91\xa2\x78\xf2\x07\xe9\xdc\x7e\xb2\x88\xf3\xb9\x4f\xd6" + "\x73\xdc\x0e\x33\xb4\x1f\xb7\x65\xae\xd7\xa9\x78\x32\x97\xcf\xed" + "\x27\x0a\x09\xb7\xff\x7b\x4c\x9e\x9f\x0e\x3b\xee\xfe\x7b\xae\x5f" + "\x66\x61\x2f\x2d\x75\x7d\x50\x8e\xdb\x4f\x6d\xe4\xb8\xfd\xcb\x54" + "\x71\x6e\x3f\xfd\x75\x87\x5e\x1f\x54\xf1\xb4\xf3\xf5\x7f\x14\x4f" + "\x3b\x5b\xff\xc7\xf1\x5b\x61\xc5\xd3\xd2\xd7\xbd\x50\x3c\x9d\xc5" + "\x79\xfa\xa7\x2b\x38\x6e\xff\xb2\xb4\x1d\xb9\x2d\xb3\xdd\x7e\x3a" + "\x91\xcf\xed\xa7\x32\x08\xb7\xbf\xf3\x94\x37\x76\xf0\xcb\x1d\xee" + "\xbf\xd7\x7b\x26\x0e\x8f\x1b\x48\x5d\xa7\x94\xe3\xf6\xb0\x58\x8e" + "\xdb\xcf\x4c\x17\xe7\xf6\xf0\xa3\x1d\x7a\x9d\x52\xc5\xf0\xe1\xce" + "\xb9\x3d\xdc\x5f\xd2\x9a\x2e\x8a\xe1\xd2\xbf\x83\x57\x0c\x8f\xe3" + "\xc6\x2f\x86\xdb\xcc\x7f\x7f\x66\x7f\xfb\x71\x5b\xe6\xfa\xa5\x8a" + "\xe1\x13\xf8\xdc\x1e\x36\x8b\x70\xfb\xfb\x68\x79\xe3\x24\xcf\x24" + "\xb9\x3f\x4e\x32\x32\x89\x79\x87\x29\x71\xbd\x54\x8e\xdb\xcf\x8e" + "\x6e\x59\x9b\x48\x31\x32\xd6\x9e\xdb\x2d\x6b\x13\x29\x46\xa4\x76" + "\x98\xf5\x52\x15\x23\x3c\x9c\xf3\xf8\x59\xbd\xb4\x31\x91\x11\xb1" + "\xd2\x79\x3c\x22\x94\x1b\x13\x19\x61\x33\xff\x65\xa4\x75\x4f\xf2" + "\x7b\xbf\x66\x91\x62\x64\x77\xa7\x6b\x16\x29\x46\x54\xdf\xb3\x75" + "\x54\x15\x23\x7c\x79\x6b\x16\x29\x9e\x1d\x66\x61\xea\xc2\x0f\x47" + "\xe4\x8d\xab\x8c\xcc\x70\x7f\x5c\x65\x14\x79\xbf\x2b\x71\xdd\x56" + "\xae\x2e\xfc\x6a\x22\x57\x17\x46\x2d\x11\xaf\x0b\xcf\x6d\xec\x30" + "\xeb\xb6\x2a\x9e\xeb\xe9\xbc\x2e\xfc\xaa\x56\xda\x18\xca\x73\xd2" + "\xd7\x81\x51\x3c\x37\x82\x1b\x43\x79\x2e\x83\xab\x0b\xa3\x8a\xdb" + "\xaf\x2e\x8c\xf2\x73\x5e\x17\x9e\xab\xbf\x67\xeb\xb9\x2a\x9e\xd3" + "\xf0\xeb\xc2\xaf\xc6\x92\xba\x50\x3d\x4c\xde\x38\xcc\x28\x59\xef" + "\xbf\xf9\x75\xe1\xd7\x59\xcc\xbb\x6f\x89\xeb\xc7\x72\x75\x61\xf4" + "\x74\xae\x2e\xfc\xda\x41\xcf\x73\x75\x61\x4c\x5e\x87\x59\x3f\x56" + "\x31\xa6\xaf\xf3\xba\x30\xda\x28\x6d\xcc\x65\x4c\xaa\xf4\xba\x30" + "\xc6\xe6\xfb\xa7\x31\x36\xdf\x3f\xfd\xba\xb4\xfd\xea\xc2\xaf\x03" + "\x9d\xd7\x85\x5f\xa3\x7b\xb6\xae\xac\x62\x4c\x08\xbf\x2e\x8c\x8e" + "\x24\x75\xe1\xda\x71\x79\xe3\x36\xbf\x76\x41\xff\xb7\x36\x6e\xf3" + "\x9b\x1d\xcc\xbc\x00\x89\xeb\xd8\x72\x75\x61\x6c\x2c\x57\x17\x7e" + "\xb3\x51\xbc\x2e\x8c\xdb\xdb\x61\xd6\xb1\x55\x8c\x1b\xe0\xbc\x2e" + "\x8c\x53\x4a\x1b\xa3\x19\xb7\x51\x7a\x5d\x18\x37\x85\x1b\xa3\x19" + "\xb7\x83\xab\x0b\xbf\xa9\x6c\xbf\xba\xf0\x9b\xc1\xce\xeb\xc2\x6f" + "\x3c\xef\xd9\xfa\xb6\x8a\x71\xc3\xf8\x75\x61\xec\x2c\x52\x17\xae" + "\x8f\x92\x37\xce\xf3\x9b\x42\xf7\xc7\x79\xc6\x17\x32\x73\x26\x24" + "\xae\xa7\xcb\xd5\x85\xe7\x97\x70\x75\x61\x7c\x9e\x78\x5d\x08\x3f" + "\xd4\x61\xd6\xd3\x55\x84\x0f\x75\x5e\x17\xc2\xd5\xd2\xc6\x74\xc2" + "\xf3\xa4\xd7\x85\xf0\x68\x6e\x4c\x27\xbc\x90\xab\x0b\xe3\xab\xda" + "\xaf\x2e\x8c\x1f\xee\xbc\x2e\x8c\xf7\xbf\x67\xeb\xec\x2a\xc2\xc7" + "\xf2\xeb\xc2\xf3\x71\xa4\x2e\xdc\x3c\x2d\x6f\x5c\x68\x7c\x91\xfb" + "\xe3\x42\x13\x8a\x98\xf9\x24\x12\xd7\xf5\xe5\xea\xc2\x0b\xa9\x5c" + "\x5d\x98\x20\xbe\xcf\x83\xe2\xb7\x1f\x77\x98\x75\x7d\x15\xbf\x75" + "\xbe\xff\x91\xe2\xb7\x4e\xf6\x3f\x12\x1a\x03\xfa\xed\x5e\xe9\x75" + "\xe1\xb7\xf1\xdc\x18\xd0\x6f\x6d\xbe\xff\x9b\x60\x68\xbf\xba\x30" + "\xc1\xf9\xfe\x0f\x8a\x09\x2e\xec\xff\x20\x73\xbd\x5f\xc5\x6f\x23" + "\xf9\x75\xe1\x85\x24\x52\x17\xea\xc2\xe5\x8d\x23\x4d\x68\x75\xfc" + "\x1f\xfb\xfc\x66\x5f\xc7\x71\xa4\xd2\xaa\x61\xe8\xb1\x19\xb8\x2e" + "\x4c\x8a\x31\xe5\x05\x66\xe2\xf5\x85\xcd\x5a\x76\x0d\xca\x35\xec" + "\x1a\x2f\xf5\x26\xb2\x06\xa5\xc1\xdc\xb2\x06\x25\x59\xfb\x03\x51" + "\xf8\x5b\x60\xfc\x4d\xb0\x49\x4d\xd6\x9f\xa4\xf1\x9c\x28\x3c\x47" + "\xea\x4a\x09\xb3\xbe\x4a\x8a\x09\x9e\xfd\x6a\x2b\xeb\x4f\x46\xeb" + "\x51\x69\xf4\x6a\x64\xf2\x79\xdb\x40\xbe\x13\x9e\x58\xcf\xac\x3f" + "\x39\xc7\xff\xc1\xec\xff\x22\x5f\x6f\xbc\xfe\x64\x34\x6d\x49\xd7" + "\xd3\x86\x32\x23\x82\xb4\x10\xdf\xb9\xec\x1a\x94\x8a\x49\xb3\xf1" + "\xb3\x9b\xe6\xe8\x1e\xdc\xfd\x5f\x91\xf5\x85\x15\x93\xa4\xaf\x03" + "\xab\x98\xa4\xe6\xc6\x77\x26\x4d\xe1\x38\x3a\x89\xe9\x83\xf5\x8a" + "\x89\xb5\xa5\x51\xd0\xc6\x6c\xaa\x2f\x6d\x96\xb5\xf6\xc6\xa4\xc4" + "\xd6\x31\x63\xe6\x88\x38\xb4\x5f\x1c\x66\x91\xfe\xa6\xbc\x20\x66" + "\x9d\x63\xd7\x31\xeb\x52\x77\x6f\x30\x8b\xd8\xef\x3a\x66\x91\x3e" + "\x7c\xcc\x84\xc6\x21\x22\x1a\xa5\x63\x16\x71\x9a\x1b\x87\x88\x54" + "\x71\x98\x45\x46\x11\xcc\x22\xf6\x10\xcc\xee\x18\x9b\x65\xad\xdf" + "\x11\xd9\xea\xf7\xdf\xd8\x37\x35\xfb\x3a\xfa\x72\x0e\xb3\xc9\xa5" + "\x80\x59\x26\x5e\x6f\xd9\x75\xcc\x1e\xb8\x72\x6f\x30\x9b\x3c\xcb" + "\x75\xcc\x26\x9f\xb1\xc3\x4c\xc0\x2f\x4f\x96\xbe\x67\xa7\x62\x72" + "\x32\xe7\x97\x27\x1f\xe7\x30\x7b\xd1\x93\x60\x36\x79\x0a\xc1\xac" + "\x41\xdb\x2c\x6b\x0d\x90\xc9\x95\xad\x63\xc6\xbc\xd3\x77\x52\xcf" + "\x5e\xca\x30\xe5\x05\x33\xeb\x3e\xbb\x8e\x99\xcf\x57\xf7\x06\xb3" + "\x97\xd4\xae\x63\xf6\xd2\x2a\x3e\x66\x42\xbe\xee\xa5\xb9\xd2\x31" + "\x7b\x29\x84\xf3\x75\x2f\x25\x72\x98\xbd\x54\x4c\x30\x7b\x49\x45" + "\x30\x33\x46\x36\xcb\x5a\x47\xe4\xa5\x56\xc7\xbf\xb0\x0e\x6d\xf6" + "\x75\xf4\x39\x1c\x66\x53\xc3\x00\xb3\x4c\xbc\xfe\xb4\xeb\x98\x3d" + "\xbd\xe9\xde\x60\x36\xe5\xb4\xeb\x98\x4d\x1d\x6c\x87\x99\x80\xff" + "\x98\xea\x27\x1d\xb3\x29\x7a\xce\x7f\x4c\xd5\x72\x98\x4d\x4d\x22" + "\x98\x4d\x39\x4e\x30\x6b\x4c\x69\x96\xb5\x16\xc9\xd4\x51\xad\x63" + "\xc6\xbc\x83\x75\x52\xcf\xa6\x55\x9b\xf2\xb4\xcc\x3a\xd8\xae\x63" + "\x36\x73\xcc\xbd\xc1\x6c\x5a\xb2\xeb\x98\x4d\xfb\x8e\x8f\x99\x90" + "\x4e\x9e\x26\x7d\x1d\x6c\xc5\xb4\x5c\x4e\x27\x4f\xab\xe4\x30\xfb" + "\x9d\x8e\x60\x36\x2d\x91\x60\xd6\xb4\xbf\x59\xd6\x7a\x26\xd3\x44" + "\xd7\xff\x72\xa6\x1b\xad\xf3\xf2\x39\xdc\xa2\xf6\x74\x1c\xed\x18" + "\x15\xea\x3a\x6e\x51\x3b\x5b\xd7\x8e\x51\x6b\xa4\xe3\x16\x35\x81" + "\xd3\x8e\x51\x39\x1c\x6e\x51\x7a\x82\x5b\x94\xce\x3d\xed\x18\xd5" + "\xea\xf7\xaf\x42\xda\xd1\x11\xb7\x19\x51\x1d\x47\x3f\x4e\xaf\x76" + "\x1d\xb7\x19\x93\x5b\xd7\x8f\x33\x86\x4b\xc7\x6d\x86\x92\xd3\x8f" + "\x33\xc2\x39\xdc\x66\xec\x20\xb8\x4d\xd7\xbb\xa7\x1f\x67\x88\xae" + "\xff\xe6\x4c\x3f\x3a\xe2\x36\x4b\xdd\x71\x34\xe4\xcc\x3d\xae\xe3" + "\x36\xab\x7b\xeb\x1a\x72\xe6\x2d\xe9\xb8\xcd\x3c\xce\x69\xc8\x59" + "\x88\xc3\x6d\x56\x24\xc1\x6d\xe6\x0e\xf7\x34\xe4\xac\x00\x39\x1a" + "\xd2\x11\xb7\xd9\x25\x1d\x47\x47\xce\x8e\x72\x1d\xb7\xd9\xa7\x5a" + "\xd7\x91\xb3\xa5\xef\x59\xac\x98\x9d\xc4\xe9\xc8\xd9\xc7\x38\xdc" + "\x5e\x26\x7b\xb0\x28\x66\x47\xba\xa7\x23\x67\xb7\xba\xfe\x87\x90" + "\x8e\x74\xc4\x6d\x4e\x46\xc7\xd1\x92\x73\x24\xe8\xff\x39\xf6\xfa" + "\x5f\x40\x4b\xce\x91\xa1\xff\xe7\x84\x70\x5a\x72\x8e\x8d\xfe\x9f" + "\xc3\xea\xff\x39\x2a\xf7\xb4\xe4\x1c\x17\xf4\xbf\xa3\x96\x74\xc4" + "\x6d\xee\xb0\x8e\xa3\x27\xa3\x4b\x5c\xc7\x6d\xee\xd0\xd6\xf5\xe4" + "\x5c\xe9\xfb\x40\x29\xa2\xab\x38\x3d\x39\x57\xc7\xe1\x36\x37\x99" + "\xe0\x16\x5d\xec\x9e\x9e\x9c\x2b\xba\xfe\xa3\x15\x37\xb3\x6f\x60" + "\x26\x2d\x30\x0e\x79\x2e\x6e\x18\xbb\x36\x61\x8c\xca\xec\x17\x98" + "\x29\x75\x7f\x17\xeb\x9a\xd3\x67\xe3\x10\xba\xa2\x98\xbf\xd7\xbd" + "\x75\xa7\xe7\x4f\x76\x7f\xdd\xe9\xf9\xfd\xda\x6c\x7f\x17\xc5\xfc" + "\x2e\xd2\xd7\x9d\x9e\x57\xc1\x69\xd0\xf9\xbe\x1c\xd6\x31\xcc\xfc" + "\x04\x69\xeb\x51\xcf\xcb\x75\x6f\x3d\xea\xf9\x3b\x09\xbf\xe6\x4d" + "\x21\xeb\x51\xcf\xcf\x69\x97\x7d\x5f\x14\xf3\x10\x5e\x8f\x9a\xde" + "\xd4\x7c\x41\xde\xfa\xc8\x31\xbe\xad\xf3\x39\x48\x45\x0b\x8c\xd1" + "\x72\x7c\x5e\x50\x69\xf6\x0b\x92\xbc\xcf\x0c\x9f\xcf\x0b\x96\xb8" + "\xc7\xe7\x05\x81\xee\xf3\x39\xf6\x7a\xdb\xed\x33\x13\x7b\x51\x3a" + "\x9f\x63\xf7\x70\xda\x3c\xb6\x8a\xe3\xf3\xef\xfd\xa5\xf3\x39\x36" + "\xc6\x3d\x3e\x2f\x58\x48\xf8\x1c\xab\x25\x7c\x5e\x10\xdd\x2e\xfb" + "\xcf\x28\x62\x2a\x08\x9f\x2d\x01\xf2\xd6\x9f\x5e\x50\xe5\x02\x9f" + "\x33\x69\x81\xf1\x6b\x8e\xcf\x0b\xf7\x03\x9f\x33\xa5\xee\x77\xc3" + "\xe7\xf3\xc2\xd1\xee\xf1\x39\xee\x96\xfb\x7c\x8e\x3b\xd1\x76\xfb" + "\xdd\xc4\xed\x93\xce\xe7\xb8\x44\xce\xb3\xc4\x1d\xe1\xf8\xbc\xb0" + "\x5a\x3a\x9f\xe3\xc2\xdc\xe3\xf3\xc2\xe1\x84\xcf\xbf\xaf\x27\x7c" + "\x5e\x18\xda\x3e\xfb\xe0\xfc\x7e\x0f\xc3\xe7\x6c\x14\x23\x6f\x7d" + "\xef\x85\xa2\xeb\x1f\x73\x7c\x0e\x56\xd1\x02\x63\xfb\x1c\x9f\xe3" + "\x93\xcd\x7e\xc1\x92\xf7\xdd\xe1\xf3\x39\xde\xcd\x7d\x2e\x5e\x69" + "\x83\x7d\x2e\x5e\x71\x63\x9f\x0b\xfb\x7d\x77\x5e\x59\x2e\x9d\xcf" + "\xaf\x8c\xe2\xbc\xdc\x2b\xeb\x38\x3e\xc7\x1f\x93\xce\xe7\x57\x94" + "\xee\xf1\x39\x9e\xdd\xff\x62\xd1\x69\xc2\xe7\x78\xd4\x3e\xfb\xf1" + "\x2c\x4a\x24\x7c\xa6\x0e\xca\x5b\x3f\x3d\x7e\x9d\x0b\x7c\xce\xa4" + "\x05\xde\x7b\x70\x7c\x7e\x35\x1c\xf8\x9c\x29\x75\xff\x1f\x3e\x9f" + "\x13\xbe\x73\x8f\xcf\x09\xdb\xdc\xe7\x73\xc2\xec\xb6\xdb\xff\x27" + "\x61\x9c\x74\x3e\x27\xa8\x39\x8f\x9b\x60\xf3\xfe\xff\xd5\x4c\xe9" + "\x7c\x5e\xec\xe6\xbe\x40\x09\x5f\x13\x3e\x2f\x66\xf7\x05\x4a\xa8" + "\x68\x9f\x7d\x81\x16\x8f\x22\x7c\x56\xd6\xcb\x5b\x9f\xfe\xd5\x29" + "\xad\xf3\x59\xab\xa2\x05\xde\x09\x71\x7c\x5e\xea\x6f\xf6\xd3\x4a" + "\xde\x87\x88\xcf\xe7\x25\x1f\xba\xc7\xe7\x25\x73\xdd\xe7\xf3\x92" + "\xc1\x6d\xb7\x0f\xd1\x12\x3f\xe9\x7c\x4e\xb4\xbe\xff\x83\xf6\x79" + "\x89\xcd\xfb\xbf\xa5\x32\xf6\x27\x4a\x2c\x74\x8f\xcf\x4b\x0e\x10" + "\x3e\x27\xc6\x10\x3e\x2f\xd9\xd3\x3e\xfb\x13\x25\xaa\x09\x9f\xbb" + "\x8d\x90\xb7\xfe\xff\xd2\x56\xe7\x7f\x08\x8d\x6f\x58\xc7\xa5\x38" + "\x4e\x27\xd5\xba\x3f\xc6\x91\xb4\xde\x3d\x4e\x27\x3d\xe5\x3e\xa7" + "\x93\x3c\xda\x6e\x8c\x63\x99\x8c\xbd\xfe\x96\x1d\xe1\xc6\x38\x96" + "\x19\x39\x4e\x2f\x0f\x91\xce\xe9\x65\xc9\xee\x71\x3a\x29\x95\x70" + "\x7a\xd9\x30\xc2\xe9\xa4\xa4\xf6\x19\xe3\x58\x5a\xe5\xde\x18\x47" + "\x92\x51\xce\x18\x87\x23\xa7\x57\x16\xbb\x3f\xce\xb1\x72\xba\x7b" + "\x9c\x5e\xd9\xdd\x7d\x4e\xaf\xb8\xd8\x76\xe3\x1c\x2b\x4e\x48\xe7" + "\xf4\x8a\x4c\x6e\x9c\x63\x45\x29\xc7\x69\x3c\x44\x2b\x95\xd3\x2b" + "\x26\xb8\xc7\xe9\x95\x93\x09\xa7\x57\x78\x12\x4e\xaf\x0c\x6f\x9f" + "\x71\x8e\xe5\xc7\xdc\x1b\xe7\x58\x59\x2a\x67\x9c\xc3\x91\xd3\xab" + "\x73\xdd\x1f\xeb\x58\x3d\xd8\x3d\x4e\xaf\xba\xec\x3e\xa7\x57\x1d" + "\x68\xbb\xb1\x8e\x55\xdb\xa4\x73\x7a\xd5\x2c\x6e\xac\x63\xd5\x1e" + "\x8e\xd3\xab\x2f\x48\xe7\xf4\x2a\x8d\x7b\x9c\x5e\x3d\x80\x70\x3a" + "\x59\x4f\x38\xbd\x3a\xa0\x7d\xc6\x3a\x92\xb3\xdc\x1b\xeb\x58\xbd" + "\x47\xce\x58\x87\x23\xa7\x53\xe3\xdc\x1f\xef\x48\xf5\x70\x8f\xd3" + "\x29\x1f\xba\xcf\xe9\x94\xd4\xb6\x1b\xef\x48\x89\x95\xce\xe9\x14" + "\x9b\xfd\x2f\x52\x6c\xbe\xff\x4f\xdd\x2f\x9d\xd3\xaf\xd5\xbb\xc7" + "\xe9\x94\x46\xc2\xe9\xd7\x8e\x10\x4e\xa7\x18\xda\x67\xbc\xe3\xb5" + "\x68\xf7\xc6\x3b\x52\x5b\x5d\xff\x42\x68\xbc\xc3\x91\xd3\x19\x23" + "\xdc\x1f\xf3\x48\xbf\xe8\x1e\xa7\xd3\xd7\xbb\xcf\xe9\xf4\xc9\x6d" + "\x37\xe6\x91\x3e\x5c\x3a\xa7\xd3\x95\xdc\x98\x47\xba\xcd\xfc\xa7" + "\x8c\x14\xe9\x9c\x4e\x2b\x71\x8f\xd3\xe9\xe7\x08\xa7\xd3\x32\x09" + "\xa7\xd3\x4f\xb7\xcf\x98\x47\x5a\x98\x7b\x63\x1e\x19\xe1\x72\xc6" + "\x3c\x1c\x39\xfd\xba\xda\xfd\x71\x8f\xb5\x07\xdc\xe3\xf4\xda\xe9" + "\xee\x73\x7a\xed\x80\xb6\x1b\xf7\x58\xdb\x53\x3a\xa7\xd7\x54\x72" + "\xe3\x1e\x6b\x6d\xd6\xbf\x7f\x3d\x52\x3a\xa7\xd7\xe4\xbb\xc7\xe9" + "\xb5\x7b\x09\xa7\xd7\xcc\x22\x9c\x5e\xbb\xa3\x7d\xc6\x3d\xd6\xa8" + "\xdc\x1b\xf7\x78\xdd\x61\xfe\xdb\xb2\xd8\x84\x18\xcd\xab\x0b\x16" + "\x2c\x8b\x4d\xd2\x2c\x8b\x5f\x38\x3f\x76\xe4\x00\xeb\xff\x47\x86" + "\x26\x0f\x48\xee\x81\x62\x16\xcf\x9d\xb3\xe2\x09\xee\x64\x7c\x6c" + "\x02\xfc\xd3\x03\xc5\xcd\x5d\x16\xa7\x49\x5a\x95\x18\xab\xc1\xff" + "\x5b\x3c\x3f\x11\x92\xbc\x9a\xc4\x1d\x79\x31\x36\x7e\x6e\xf2\xc2" + "\x84\xdf\x6b\xe6\xc6\x2f\xfc\x7d\xc2\xe2\xd8\x84\x24\xcd\xd2\xd8" + "\x25\xcb\x17\x2e\x8d\xc5\x7f\x2f\xd3\x2c\x78\x75\x29\x1c\x98\x1f" + "\xbb\x70\x45\xac\x66\xde\xf2\x05\x0b\x62\x97\x2e\xeb\x81\x26\x2e" + "\x8f\x4f\x5a\x98\x18\x1f\xab\x19\x3b\x71\xf4\xe0\x29\xe3\x5e\x9a" + "\xf2\xdc\x73\x3d\x90\xcd\xde\xd3\x1a\x3a\x77\x6c\x06\x70\x48\x79" + "\x55\xb1\xb5\x6f\x99\x3f\x42\x5b\x80\x9b\x5b\x97\x22\xf5\xa6\xa5" + "\x48\xb9\xb1\x0e\xa9\xb6\xd4\x21\x4f\xcb\x9b\xd5\x2a\xcd\x22\x34" + "\x8a\xf6\x99\xad\xde\x5a\x87\x7c\x2d\xdb\xf2\xa2\xe9\x6d\x79\x1a" + "\x83\x4f\x9a\x1a\xa7\xa5\x7d\x52\xc3\xf1\x71\xc0\x42\x49\x6f\x7b" + "\xbb\xe2\x8a\x22\xbb\x12\xce\x19\xd2\x6b\x10\x45\x7b\xad\x4b\x39" + "\x6c\x31\x50\xa7\x70\x8f\x06\xb1\x42\x8a\xf5\xb9\xf0\xcb\x40\x8a" + "\x0d\xa1\xf0\x1b\x05\xbf\x2c\xf8\x1d\x81\xdf\x71\xa4\x78\x43\x07" + "\xbf\x78\xf8\xe5\xc3\x6f\x3f\xfc\xf0\xb1\x0a\xf8\x55\x22\x45\xe6" + "\x58\xf8\xc5\xc0\x2f\x09\x7e\x59\x24\x9f\x4c\xf8\x6d\xf4\x85\xdf" + "\x08\xf8\x4d\x41\x8a\x4d\x2a\xf8\x41\x1e\x9b\x20\xbf\x4d\x90\xf7" + "\xa6\x09\xf0\xc3\xc7\x13\xe1\x87\xd3\xef\x20\xe7\x36\x47\xc3\x0f" + "\xee\xb1\x19\xf2\xdf\x0c\x79\x67\x79\xc2\x4f\x03\xbf\x10\xf8\x85" + "\xc1\x2f\x0a\x7e\x90\x26\x0b\xee\xb5\x05\xce\x6d\x81\x7b\x6c\x19" + "\x06\xbf\x1c\xf8\xd5\x23\x45\x36\x94\x25\xbb\x92\xfd\x65\xd9\xfc" + "\x8d\x7f\x15\x76\xff\xb7\xff\x19\xbc\xd7\x3c\xac\x2f\x7e\xd4\x04" + "\xf5\x76\xfd\x2d\x7a\x2d\x52\xd0\xdb\xd2\x0c\x89\x8f\x22\x8f\x6b" + "\x8a\xf5\x27\xca\xd7\x21\x68\x6f\xf2\x34\xc5\xab\x9b\xf0\xf9\x13" + "\x38\x66\x0d\xd9\xeb\x8f\xeb\x51\xfc\x30\x5c\x3f\xa5\xf1\x73\xfd" + "\x71\xf6\x7a\x93\xde\xa3\x47\x34\xbe\x9e\x7e\x33\x28\x92\x4e\x8f" + "\x7a\x17\x7f\x87\x0b\xf9\xe7\xe2\xef\x74\xe9\x9c\xc0\x12\x5a\x1d" + "\x90\x84\xdb\x98\xe2\xd5\x4c\xb9\xf2\x48\x7d\x84\xf3\x50\x36\x83" + "\x4f\xb5\x0a\xea\x9f\x12\xff\x9f\x06\xcc\xe9\x3d\x11\x71\xa4\xdd" + "\xd9\xc0\xf8\x97\x26\xbf\x61\xc5\xf8\x5c\xe3\x3e\x9f\x68\xba\xb0" + "\xb7\xa1\x38\xa1\x09\x55\x29\xd6\x6f\x83\x67\xa3\xa0\x0d\xa4\xe8" + "\x81\x3e\xd1\x96\xed\xc3\x8a\x3f\x06\x1e\xe0\x74\x9f\xa4\x55\xe3" + "\x7f\x73\xf0\x79\x3a\x77\x78\x26\x1e\x07\x2a\x4e\x7b\x0f\xda\xe5" + "\xf5\x79\x4d\x7e\x11\x91\x9a\x17\xbd\xe9\x2b\x8a\x0d\x83\xa0\x6c" + "\x4c\x7a\x6b\x59\x9a\x7c\xaa\xd5\x38\x7f\x5a\x13\xa9\x86\x73\x4a" + "\x28\x9b\x1a\xca\xe1\x71\x03\xae\xa3\xa1\x8c\xc5\x2f\xe2\xfb\xbe" + "\x11\x08\x65\xa5\xd2\x27\x43\xde\xef\x45\xaa\x3f\x58\x6d\xa4\xf0" + "\x39\x4b\x4e\x35\xe6\xbb\x27\x9d\xfd\xfa\xac\x77\x7a\x21\x65\xc1" + "\x9b\x08\xed\x7e\x13\xa9\x1a\xb2\xdf\xf0\xd7\x2b\x55\x4a\xd2\xf6" + "\xad\xcf\xa5\x20\x8d\x5e\xb1\xa1\x1e\x9e\xd3\xc0\xdc\xcb\x37\x0c" + "\x39\xb9\x57\x6c\xcb\xbd\xb6\x87\x21\x7c\x2f\x12\xa3\x6a\x15\x1b" + "\x2b\x26\x0f\x4b\x61\x2f\x35\x8e\x1f\x8e\x9d\x35\x0f\xcb\x36\x6b" + "\x1e\x1b\xd6\xe3\xeb\xf5\x8a\x37\xa2\xe8\xf7\x7b\xa9\x2d\xdb\x9f" + "\x55\xc3\xfd\xc3\xf0\x79\xef\x35\xa8\x9e\x86\x7f\xf1\xfd\x59\x2c" + "\x20\x9f\x0c\x84\xf3\xa7\xd9\x63\xc0\x1d\x48\xff\xc6\x1e\xcb\x5a" + "\x0d\xf0\x26\x58\x4d\x70\x7d\xe3\xfa\xaa\x0a\xda\x02\x3f\xf3\x90" + "\x0a\xe4\x51\xfc\x22\xc6\x34\xd3\x53\x33\xa9\x1b\xc4\x35\xb3\x67" + "\x4b\x3c\x03\x23\x71\x4c\xd4\x05\xbd\x20\x2e\x1b\x94\x51\x4c\x1e" + "\xf0\x3c\xb6\xf1\xc1\xcf\xd0\x90\x9d\x39\xc2\x2e\x46\x6a\x38\x16" + "\xa9\xf7\x50\xe6\xe0\x63\x9a\x20\x86\x4b\x79\x34\x8b\x17\xe6\x33" + "\xc6\xce\x92\x37\x36\x03\xff\x7f\xea\x20\xa4\xf6\xae\x40\x94\x26" + "\x4d\x7b\x8c\x60\x3c\x3c\x13\xca\x1c\x83\xef\x05\xff\x1e\xa4\xb7" + "\x0f\xa8\x34\xaf\x85\x3e\xb4\x85\x57\x99\xa5\xe6\x6d\xc1\xaa\x26" + "\xbf\x67\x46\x35\xe6\x3d\x89\xe8\x9c\x60\x15\xfe\xae\x1c\xca\xce" + "\x7c\x6b\x47\xaf\x55\x21\x72\x9f\x60\xcf\xb4\x78\xda\x90\x76\x0b" + "\xe2\xdf\xe7\x99\x51\x9f\xac\x30\x00\x0e\x4f\x22\x8c\xf3\xc7\x77" + "\x8d\x14\x5e\xeb\x8f\xf6\x7a\x3d\x6d\x37\x3c\xcf\x2e\x78\x16\x78" + "\x4e\x84\xf3\x6d\xc8\xde\xe8\xc9\x3d\x4f\x66\x11\xc6\x1c\xee\xa1" + "\x21\xf7\x86\x7c\x29\xb8\x87\x4f\xb0\x06\xd2\x85\xe9\x3d\x3e\xa8" + "\xb0\x3e\x37\x73\x6f\x2e\x1d\x5b\x47\x36\xea\x0c\x90\xb6\x79\x05" + "\x5d\xb1\xf5\x1b\xc8\x7f\x2d\xa2\x9b\xee\xd2\xa5\x29\x91\xb4\x31" + "\x7b\x1a\x9e\xbf\x78\x09\xa5\xcf\x45\x01\x0f\xac\xa1\x0d\x11\x66" + "\xe4\xfd\xc0\x25\x6f\xfa\x5c\xe4\x25\x66\xcf\x83\x94\x0a\xba\xba" + "\x2c\xf1\x38\x4a\xf9\x01\x79\xa6\x2e\x44\xbe\xe9\x91\xf0\x2c\xa5" + "\xb4\xb1\x3c\xf9\x12\x2a\xab\x87\x5f\xe2\x39\x48\x77\x11\x7e\xc7" + "\x51\xfa\x2a\xa4\x9c\x04\xfd\x59\xda\x1d\xe4\x59\x96\x78\x07\x8e" + "\x5d\x47\x29\xd1\xb4\xe9\x5c\x29\x4e\x77\x06\x45\x98\x0c\xde\xa9" + "\xd7\x91\x72\xf7\x34\xfc\xad\xf6\x65\x54\x00\x65\x69\xf2\xc9\x8b" + "\x6c\xdc\xf6\x76\xe5\xed\x15\xb4\xa9\x21\x7b\x13\xd2\xa3\x67\x34" + "\xbc\x67\xc1\x65\x6e\x42\x98\xdf\x1e\x38\x8d\x25\x6f\xa8\x7e\x8e" + "\x09\xb7\x1b\x1b\xeb\x41\x4f\x20\xeb\x79\x7c\xce\xe0\x37\x54\xaf" + "\x57\x6c\xd2\x44\x98\xe8\x06\xc0\x99\x79\x6e\x88\x7f\x00\xfb\xfc" + "\x01\x8a\x44\xa4\x84\x7b\xc4\xe8\x3d\x3e\x3a\x88\xef\x01\x79\x76" + "\x05\x1e\x6b\x30\x37\xd8\x73\x19\x7a\x8f\xa2\x7a\x8e\x2f\x0c\xfe" + "\x5d\xad\x65\x81\xf3\x7b\xf4\x1e\x1f\x9a\x6c\xf8\x84\xdb\x87\x96" + "\xf3\x6c\x3f\x85\xdb\x1c\x9d\x05\xb7\x99\xea\x80\x70\xb3\xdf\xf0" + "\x1c\xa8\x0b\x7b\xe8\xdb\xfe\x9e\x34\x45\x1b\x27\x99\x68\xa3\x25" + "\x4f\xab\x87\xbe\xc8\xb3\xdc\x54\x8f\x48\xfa\xcd\xe3\xa0\x0e\xed" + "\x27\x73\x43\x37\x0f\xc6\x79\x82\x66\x09\xcd\xae\x43\xea\x88\x0a" + "\xda\x88\xeb\xa5\x65\xdb\x2d\x4d\xf6\x52\xe4\x4b\xe7\x0d\xcf\xb0" + "\xf8\x85\xe5\x34\xee\x8d\x88\xc6\x6d\x27\xed\x37\x36\x83\xce\x81" + "\x6b\xd9\x7c\xe0\xbe\x5d\xf4\x8a\xcd\x4a\x0b\x5c\x4f\xe7\x6a\xf5" + "\x2c\x0f\x98\x76\x8e\xb4\x8f\x9b\x95\xf4\x00\x38\x97\x13\x30\x01" + "\xce\x75\xb9\xa2\xd8\x9c\x03\xc7\x81\xbf\x01\xeb\x8a\xd3\xea\x70" + "\x1e\x79\x84\x43\x01\xe1\xbc\xff\x53\x38\x9e\x6f\x14\xe1\x7a\x4d" + "\xf4\xe5\xe6\xa3\x5c\xbd\xb5\xd6\x13\xa8\xaf\x7e\x5a\xa8\x8b\x9b" + "\x4b\xf4\x1e\x3d\x8f\x31\x6d\x39\x5c\x57\xcf\xb4\x35\x6f\x9c\x06" + "\x2d\x16\xf7\x39\x28\xb7\xcf\x4b\x11\x82\x34\xb5\x7a\x0f\xef\x52" + "\x2e\x96\x59\x5d\x70\x5a\xa6\x4e\x42\xdd\x24\xf7\x03\x9e\xc3\x35" + "\xf4\xf6\x67\x42\x71\xfb\x82\xdb\x19\xbd\x22\x0b\xe1\x36\x06\xea" + "\xe7\x0e\xb6\x3d\xaf\x66\xea\xe7\x9b\xd3\xc2\xa1\x5c\x19\x57\xd8" + "\xb2\xd8\x96\xcd\xda\x96\xd0\xdb\xa6\x95\x90\xb4\xc1\xba\x86\xec" + "\xac\x78\xbd\x87\xba\xd0\x96\x6b\xe4\xb9\xb2\xbe\x1b\x52\x0a\x7f" + "\x83\xde\xb0\xe6\x05\x75\x55\x05\x6d\xf2\x76\xcc\x41\xdc\xe6\xec" + "\x7c\x13\xe3\x31\xad\xa2\x71\xdb\xb4\x4a\xc8\xe7\x88\xb5\x9e\x5a" + "\x56\xd0\x95\x80\x2b\xb2\xdc\xa5\x2f\x6c\x05\x2c\x23\xcc\x0a\x7a" + "\x8e\x39\x04\x81\x1e\x35\x15\xc0\xf1\x82\x15\x58\xcf\x6d\x34\x40" + "\x5d\x56\x09\xa7\x55\x22\x9c\x8e\x49\xcf\xa6\x6d\xf2\x99\x56\xc1" + "\x94\x79\xad\xc2\x02\xe5\xf3\xb0\x96\xa9\xc9\x27\xd8\xb7\x21\x7b" + "\x4b\xa8\x1e\x59\xf4\xbc\xfa\xf2\xe6\x43\x71\x34\x1d\x85\x79\xa5" + "\xb8\xaa\xd8\x32\x15\xfe\xed\xc6\xf2\xf4\x81\xcf\x41\xaf\x8e\x9d" + "\x08\x75\x05\xf0\x7e\xa7\x0f\x0d\x38\x6d\x49\xd4\xa3\x97\x73\xf1" + "\xf5\x9b\xe0\xff\xf8\x38\x4e\x03\xc7\x33\xf5\x68\x0e\xab\xb5\xdf" + "\x28\xc2\xf8\xd9\xe5\x7b\x88\xe4\xcb\x94\xe5\x01\x9c\x27\xbe\x0e" + "\xe7\xb9\x6b\x3b\x5d\x8b\xf3\x81\x3c\x4a\xad\x79\x6f\x81\x63\xd6" + "\xfc\xc7\x2e\x6e\xb9\x47\x2d\xdc\xc3\xd3\xb6\xec\x3b\xb7\xd3\xf5" + "\xa4\x5c\xd9\x2a\x3d\x5a\x30\x0b\x9f\xdb\x08\xc7\xf0\xb5\x36\xf5" + "\x4d\xc1\x71\x28\x1b\x9e\x3f\xa6\xca\xb6\x7d\x07\x8c\x7a\x5a\x35" + "\x01\x9b\xd7\x14\x6b\x5e\xf6\xf9\xd0\x39\xbf\x2b\xb2\xa9\xaf\x9e" + "\x38\x5f\x48\xbf\x4e\x8f\xe6\xea\x48\xb9\x36\x84\xd5\x13\xbe\x43" + "\xdc\xb3\x0f\xe0\xb8\xe3\xbe\xc6\xb2\x96\xd5\x1d\x7b\x23\xe2\x58" + "\x6e\x14\x5a\xfb\x23\xc0\x05\xfa\x9d\xec\x12\xae\xed\xce\xce\xc7" + "\x78\x43\x1c\x8b\xe9\x3e\xc3\x8b\x70\xbb\xc4\xd6\xc9\x13\xb8\x0f" + "\xb2\x3e\x3b\xe4\xa3\xb4\x64\xbf\xfe\x17\xcc\x7b\xe8\xd3\x10\xed" + "\xf7\x44\x62\x43\xf6\x56\xb5\x5d\x9f\xa6\x64\xd3\xfd\x88\xd3\xbc" + "\xd5\x87\xae\x86\x34\x61\xd6\x34\xf8\x3c\xc4\xf8\x57\x70\x2c\x5c" + "\x8f\x16\xc5\xe3\x63\xd9\x90\x46\xaf\x58\x27\xfa\x0d\x4c\x5a\x20" + "\xa2\xca\xf3\xf5\xd8\x1f\xe2\x3a\x3e\xa2\x3c\xa0\x1e\x95\xe7\x5b" + "\x90\xe5\xfd\x5e\x39\xa3\xd2\xe8\x62\xd0\xdc\x67\xca\x8c\xd5\x48" + "\x9a\xa6\xdb\xca\xec\x5f\x44\x37\x81\x8f\x49\x79\x02\xe1\xfe\xfe" + "\x86\x22\xe7\x4e\xb9\xa1\x8e\x69\xef\xe0\x6f\xe6\x9b\xcb\xb7\xc0" + "\xf7\x60\xef\x03\xfe\x36\x2e\x87\x22\xfe\xc7\x02\x69\x77\xe3\xe3" + "\xd8\x1b\x81\x2f\x2b\xb0\x39\x47\xbf\xef\xa3\x26\xb1\xcb\x39\x84" + "\xe3\xc8\x94\xd7\xf4\x7c\x31\x2e\xb3\xa5\xd0\x47\x8d\x9f\x21\x3d" + "\x99\xb6\x94\x9b\x1a\x8a\xcb\xea\xcd\x48\xb3\x02\xfb\xb6\x9c\x8d" + "\x11\xbb\x10\x0d\xed\xa1\x44\xdf\x94\xc3\xcc\x7f\x00\x6f\x7b\xc3" + "\x30\xc0\x47\x9d\x6e\x46\xd4\xd6\xb4\x2e\xaa\x5f\xe7\xd3\xc5\xb7" + "\x07\xf6\xca\x69\xc8\xce\x39\x78\x2a\x19\x21\xe9\x7a\x37\xe7\xa0" + "\xf5\xd9\x77\xb3\xcf\x0e\xc7\x98\xef\xe5\x87\xec\xc8\x60\x9e\x17" + "\xfe\x2f\x3a\xd7\x93\x5e\xeb\x4d\x7f\x9e\x6f\x42\xcb\xf2\xe9\xa6" + "\x65\xbb\x10\x65\xde\x3e\x30\xfa\x83\xdd\x95\xb8\x6d\x1f\x65\x8d" + "\x27\x13\x3b\xf0\xf4\x89\x69\x48\x7d\x4d\xb1\x6d\x4b\x44\x4a\x06" + "\xb3\x0f\xd2\x49\x48\x27\xad\xac\xdb\x98\xf9\x05\x65\xe0\x95\x23" + "\x4c\xe9\x34\xe9\x9f\xb6\x1d\x9d\xc4\xe6\x87\xcf\x59\xf1\xdb\xcd" + "\x7a\x58\x19\xf7\x10\x5d\xff\xc4\xc9\xb3\xaa\x85\x9f\xf5\xcd\x55" + "\xf2\x9f\xf5\xcd\xb1\x8e\xcf\xfa\xe6\xde\xb6\x7d\xd6\x37\xf7\xcb" + "\x78\x56\x8d\xf0\xb3\xbe\x15\x2b\xff\x59\xdf\x0a\x75\x7c\xd6\xb7" + "\xb6\xb4\xed\xb3\xbe\x95\x2b\xe3\x59\x43\x85\x9f\x35\x77\xb2\xfc" + "\x67\xcd\x0d\x70\x7c\xd6\xdc\x55\x6d\xfb\xac\xb9\x19\xa2\xcf\x4a" + "\x79\xd3\xb8\x7d\x82\x76\xa9\x29\xad\x11\x74\xdd\xf6\x11\x9a\xd4" + "\xbd\x88\x2a\xad\x37\xa2\xb2\x80\x4a\xac\x99\xa9\xc7\x13\x19\xdd" + "\x33\x82\x7e\xb3\x5a\x53\x96\x5f\x0b\xc7\xaf\xa2\x73\xc9\x46\x34" + "\x6a\x29\x6e\x7f\xf3\xc6\x95\xc7\x48\x6d\x7f\xf3\xd4\x2d\xed\xaf" + "\xe9\x09\xb6\xcd\xdd\xbe\xa4\xac\xb6\x09\xe1\xe7\x87\xbf\x67\xb7" + "\xb4\xbf\x6b\x49\xbc\xed\xdb\x5f\x1c\x8f\x72\xa3\x91\xd7\xfe\x92" + "\x6f\xa1\xb6\x0f\xb2\x6f\x7b\xb3\xaf\x21\x24\xdc\xf6\x6e\xef\x82" + "\xdb\xde\xdd\x70\x5e\x62\xf9\x2b\xac\x6d\x6f\x0e\xdc\xd3\xb6\xed" + "\xfd\x3c\x06\xf7\xd1\xdb\x75\xf2\xda\xde\xed\x3a\xeb\x73\xef\x62" + "\x9f\x1b\xee\x95\xc5\x6f\x7b\xb7\x47\xbb\xc2\x5b\x7a\x7b\xe0\xa8" + "\x0f\xfa\x1b\xbb\x58\x0a\x7b\x47\xe2\xfe\xad\x01\x62\xf2\xd7\xdd" + "\x46\x25\x3c\xb3\x9e\x19\xb3\x6c\x88\xf1\xa0\x0b\x7d\x8c\x11\x49" + "\xf4\xb7\xf4\x80\xde\x91\x78\x3c\x12\xfb\xea\xab\x8a\xb7\xfd\x40" + "\xdb\x1b\x25\x96\x5b\x4f\xfa\x3f\x75\x4e\x1a\xd4\x97\x0f\x56\x18" + "\x29\xcb\x6b\x51\xde\x80\x83\x9a\xce\x1b\x90\x41\x6f\xe8\x1d\x70" + "\x3b\xef\x19\xc3\x19\xdd\x0f\x08\xa7\xa5\xd7\x28\x47\xc8\x2f\xff" + "\xdb\x7b\x5a\x29\xff\x45\xe9\xe5\x27\x79\xba\x56\xfe\xb7\xf7\xb8" + "\x54\xfe\x3e\x50\xfe\xa6\x61\x5d\xc0\x0b\x52\x27\x9b\x86\x29\xa5" + "\x95\x67\x47\xa8\x4b\x18\xbb\x77\x0f\x97\xdb\x3f\xba\xcf\x13\x19" + "\x1f\xec\x36\x50\xd0\x06\x30\x7d\x38\xae\x7b\xa4\xfd\xab\x86\x36" + "\xeb\x5b\x9a\xb4\x49\x06\x89\x6d\xd2\x4e\xd1\xef\x9f\x1c\xef\x3f" + "\x50\x7f\x0f\xee\x2f\xfe\xfc\xf6\x6d\xe2\x61\xdf\x44\xd1\x36\x71" + "\xfb\x00\xbd\x63\x9b\xf8\xce\x74\xe9\x6d\xe2\x3b\x5a\xc7\x36\xf1" + "\xdd\xf5\x5c\x9b\xf8\xee\x12\xf9\x6d\xe2\xbb\x23\x5d\x6f\x13\xdf" + "\xed\x2b\xaf\x4d\x7c\xa7\xca\x79\x9b\xf8\xee\x08\x79\x6d\xe2\xbb" + "\x23\x1c\xdb\xc4\x77\xf6\xf0\xdb\xc4\x77\x45\xdf\xf5\xd2\x39\x0f" + "\x84\x42\x1f\xed\x79\x4d\x91\x3f\xd6\xb4\x16\xfc\x6c\xce\xeb\xaa" + "\x08\x33\xdd\x40\x6f\x7b\x20\xd4\x42\x85\xe1\x76\x65\x54\x43\x43" + "\x9c\xca\xb2\x52\xe7\x49\xf7\x7a\xe8\x2e\xdd\xec\x8f\xc7\xef\xb4" + "\x50\x7e\x6f\xba\x41\xe7\x45\xaf\xd4\xf5\xca\xbf\x8b\x7c\xe1\xe7" + "\x9f\xcf\xf6\xc7\xf0\x77\x28\xbd\xd2\xbf\x47\xf6\x0a\x14\xe2\x5d" + "\x8f\x54\x50\x86\x28\xef\x35\x6a\x04\x6d\x90\x2f\xfe\x9b\x5e\x5b" + "\x50\x54\x70\x17\x29\xbd\x93\x01\x1b\x1f\xb8\x5f\xb2\x37\x4d\x2f" + "\xd3\xa1\x82\xa5\xe0\xab\x29\xe4\xbf\x9b\xa2\x8b\x4c\x0d\x3a\xca" + "\xec\x3b\x7c\x0f\xc1\x27\xdf\xc8\x78\xaf\xdc\xe1\xf1\x96\x3e\xc3" + "\xa7\x98\xd3\xe3\x14\xf4\x6b\x51\x0a\x5c\x56\x73\xee\xf0\x48\x7a" + "\x3b\xfc\xd2\xe3\xbc\xb0\x86\x06\xdf\x1d\x4a\x37\xf8\xf7\x00\x4f" + "\x1e\xb2\x7b\x05\xd2\xee\xba\x8b\x74\xf4\x6d\x1d\x05\xf8\x47\xe1" + "\xfd\x44\x21\x46\x51\x16\xaa\xa0\x08\xce\x29\x71\x9b\x48\xe3\xfb" + "\x9b\xe0\xfe\xcd\x70\xff\x26\xcc\x6d\xe4\x5f\x00\xf7\x37\xaf\xd4" + "\x49\xac\x2f\xf9\xcc\xfa\x67\xd6\x72\x59\x42\x02\x12\xe9\xc3\xf0" + "\xc3\xe5\x82\x18\x16\xe0\x98\x3c\x1e\x90\x84\xcb\xb6\xe5\x2e\x0a" + "\x81\x72\x6a\xa1\x0c\x3a\xb8\x2f\x5e\x8b\x25\xea\xe5\x25\x6a\xcc" + "\x51\x5e\xd9\xcc\xdb\xd8\xb2\xdd\x84\xb2\xdd\xe0\xca\x86\xef\x85" + "\xe3\x23\xf6\x9e\x33\x22\xb5\x3f\xae\x9b\xff\xf3\x4e\xee\x16\x8e" + "\xdf\x79\xde\x7e\x2d\x4e\x22\x57\x77\xe5\x88\xf1\x65\xeb\x61\x14" + "\x40\xab\x53\x87\x4d\x5a\xff\x2d\x1d\x61\x42\x68\xfd\x61\x14\x52" + "\x0e\xf5\xba\xcc\x78\x1d\xd1\x3e\xa9\xc3\xce\xe8\x6a\xa5\xde\xcb" + "\x24\x76\xaf\x4d\x6b\xe9\x0a\x8b\xef\xf0\x1c\xda\xf7\x99\xea\xad" + "\x6b\xe9\xe4\x66\xad\x4f\x68\x93\xb6\x17\x9a\x63\x52\x03\xaf\xe9" + "\x64\xcd\x52\xa4\xb9\xaa\x28\x1c\xfd\xc5\x05\xf0\xa5\x33\x90\xea" + "\x8a\xa2\x30\x39\xfd\x6b\xfc\x3e\x68\x77\x16\xff\x7d\xd0\xee\x22" + "\xa4\xd8\xa3\x41\x8a\xbd\xa1\x48\xf1\xde\x14\x04\xe9\xf8\xbf\x3f" + "\x24\x92\xbc\x0a\xcc\x11\x07\xfa\xa3\x34\x13\xfd\x3f\x3a\xa7\x26" + "\x2a\x9b\xa2\x8d\x11\x83\x3c\xf4\xc5\x2b\xf0\x7b\x92\x82\x3b\x10" + "\xd3\x1f\xa1\xaf\xf5\x86\xbf\x4f\x01\xa6\x28\x71\x29\xea\x7d\x4d" + "\x51\x50\x8c\xeb\x8d\x77\x7d\xb7\x70\x73\x7a\x14\x32\x69\x22\xa2" + "\x9b\x73\x87\x67\x98\x73\xb5\x7a\x8b\xfa\x75\x55\x7a\x0d\x0a\xc0" + "\xef\x37\xa1\x6e\x44\xcd\x31\xab\x70\x7d\x8c\x2a\x9e\xf7\x05\xba" + "\x9a\x84\xa8\xf4\x3b\xa8\x27\x70\xb3\xa5\x5e\x4d\xac\xf5\x36\xa6" + "\xd6\xd2\x16\x5c\xb7\xf0\xf8\x2a\x9c\xf3\x4a\xbb\x03\xfe\xde\x50" + "\x8d\xf2\x97\x22\x5f\xf3\xb2\xb8\x5e\x86\xdb\x71\xbd\xdf\xb5\x20" + "\x5f\xaf\x7a\xa4\xce\xaf\x03\x4e\x2d\x03\x3e\xd5\x41\x3d\x33\x90" + "\x7a\x86\xbf\xa7\xdf\x8d\xeb\xd8\xa6\xbf\xe7\x17\xd4\x91\x3a\xc6" + "\xf0\x08\xd7\xb1\x57\x81\x47\x09\xb8\xff\x00\x1e\xad\x85\x3a\x06" + "\xf5\x82\xce\xde\x95\x98\xbf\x96\x46\xa9\x0b\x11\x55\x70\xad\x1b" + "\x3e\xe7\xd1\x65\x10\xa5\xf9\x22\xd2\x88\xb8\xb1\x8e\xc2\x55\x4d" + "\x03\x7a\x21\xcd\x8b\xf4\xcd\x2b\x8a\x82\x5a\x38\xae\xd2\x4c\x7b" + "\x44\x0d\xf1\x5e\x45\xc6\xe6\x0a\x93\xf1\x78\xa7\x1e\x62\x81\xe3" + "\xa2\x79\x11\x3d\x72\x45\xb1\xfb\x14\x8e\xe3\xca\xfd\x48\x91\xf8" + "\x2b\xba\x0a\x62\x56\x42\xc6\x74\x77\x17\x33\xef\x49\xd7\x68\xd0" + "\x97\xcc\xfb\x29\x72\x8d\x19\xe2\x66\x52\x57\xef\x07\xbc\x8b\x8a" + "\x17\x35\x31\xed\x10\x8e\xe3\xd5\x78\x44\xcd\xa9\x85\x58\x99\x21" + "\x56\x0d\x3a\x4f\x68\x8f\x22\x71\x7b\x44\xe7\x3c\x64\x48\xd1\xd3" + "\x96\x88\x18\x05\x9d\xb6\x04\xa9\xca\x93\xcd\xe8\xe5\x44\x44\xa7" + "\x5e\x87\x78\xd5\x57\x22\x68\x97\xbc\xa0\xcd\xea\xb5\x6b\x05\xf2" + "\xc5\xf1\xea\x59\x0b\x5a\xe5\xcd\x74\x74\x38\xad\xa4\x8b\x19\xf8" + "\x8b\xdb\x27\xef\x35\x1e\xdd\xa1\x9e\x79\x65\xe1\xfa\x08\xf5\xd3" + "\x7b\x0d\xd3\x5e\x46\xe5\x43\x3d\x34\xad\xd4\x05\x35\xaf\xd4\x69" + "\xe0\xd7\xdf\xda\x86\x59\xdb\x0f\x88\x59\x25\x6e\xbf\xca\x93\xf5" + "\xc8\x04\xb1\xf5\xc2\x7d\xdd\x4a\x5d\x00\x13\xe3\xdf\xeb\xd0\x10" + "\x23\xf2\x80\x32\xa9\xa1\xbc\xa8\x60\x01\x52\x9d\x8b\xbb\x82\xcc" + "\x50\x37\xac\x71\x9f\xb8\x50\x83\x20\x5f\xea\x8c\xee\x22\x62\x63" + "\xe6\x21\xce\xbb\xf7\x26\x72\xbc\x7b\x6f\x22\x8e\x1d\xe1\xdd\x7b" + "\x13\x7e\x8e\xbc\xfb\x32\x8a\xe1\x9d\xa2\x79\x00\xc3\xa7\x92\x72" + "\xd3\x47\x10\xa3\xf7\x70\xec\x10\xe6\xcc\xd9\x3f\x61\xce\xfc\x21" + "\xba\xa3\x72\xa6\xb1\x41\xa7\x81\xdf\x3d\xe1\x0c\xe4\xcb\x70\x06" + "\xc7\xea\xcb\xa8\x26\x64\x8d\x11\x53\x57\x73\x52\x87\x69\xd2\xd1" + "\x73\x50\x57\x93\xbd\xd7\xf4\x47\xe7\x98\x38\x15\x26\x6b\xa6\xd1" + "\x96\x2b\x8a\x3f\xec\x4c\x3f\x8f\xd4\x4d\x6b\x69\xba\xdc\x74\x08" + "\x59\x7c\xc3\x72\x98\x77\x7e\x39\xb7\x34\xe0\x59\x55\x34\x7e\xd7" + "\xbe\x16\x30\x4b\xc4\x63\xf4\x69\x6a\x73\xde\xd8\x0c\xcb\xb6\xd4" + "\x70\xda\xe7\xed\x0a\x33\xd4\x6b\xcb\xb6\xd9\x6a\x8b\x4f\x9e\xa6" + "\x21\xfb\x0f\x7a\x3d\x3a\xe1\xcb\xbc\x17\xc8\x1d\x9e\x03\x6d\x03" + "\x6e\x7f\x99\xef\xfd\x0c\xcc\x3b\xbc\x42\x64\x7d\x87\x8c\xdb\x04" + "\xf6\x3d\x04\xfb\x9e\xa2\x10\x3f\x4b\x0f\xfc\x9e\x82\xb4\x29\x7f" + "\xb8\x65\x7d\x4f\x61\xfd\x3f\x3e\xaf\x57\xfc\xa1\x1e\x8f\xab\xda" + "\x5c\x97\xc8\xa6\x63\xaf\xdb\xbd\x1c\xb7\xf5\xdc\x75\xe4\xff\xd0" + "\xae\x24\x36\x53\x48\x25\xa8\x71\x7c\xc7\x66\x40\xfd\x01\x6f\xb4" + "\xef\x16\xfc\x4b\xc1\xbf\x3e\xf0\xaf\x02\xca\xce\x8c\x63\x4a\xeb" + "\xaf\x0a\x0f\x92\x77\x45\xcf\xfa\xb2\x6d\xe3\x21\xa6\x4e\x3e\x8a" + "\x7a\x5e\x63\xff\x6e\xc8\xde\xa7\xb2\xbe\x0b\x6f\x49\xcf\xe1\x53" + "\x88\xef\x0d\x18\x29\xc9\xfb\x79\xf2\x7f\x3c\xf7\x85\xcd\x8f\xf9" + "\xbf\x45\xdb\xdb\x50\x9c\x76\x05\xd5\x2a\xf6\x25\x95\x43\x1f\x6e" + "\xd9\xfe\xac\xef\xd6\xbb\x50\x07\x92\x5b\xda\xe4\x43\x50\x17\x55" + "\xc5\xab\x99\x34\x53\x19\x9d\x9b\x3b\xd4\x40\xbf\x59\xa3\xc1\x5e" + "\xb0\x81\x8e\xfb\x15\xfb\x2f\xd6\xb6\x0a\x32\x6e\xb2\xef\x14\x0d" + "\xd8\xe2\xfd\xd0\x5b\xe6\x03\xe1\x7d\xca\x33\x94\x01\xa7\x52\x48" + "\x5f\x69\x2d\x2f\xde\xcb\x1c\xcf\xb7\x79\x24\x03\x65\x34\x08\xec" + "\x65\xce\xcd\xcb\xd9\x77\xd0\x92\x37\x14\xb0\xdf\x07\xcf\xba\x7b" + "\x84\xed\x33\x0b\x61\xa1\x57\xbc\xef\x2f\x76\x4e\x1a\x0e\xef\x87" + "\x89\xe5\x33\x4e\x67\xa6\x25\xe6\x25\x3e\xfe\xa3\x55\xe7\x44\xec" + "\x37\x17\x5b\x9a\xa3\xbc\xcf\xa4\x5c\x97\xa8\x6d\xde\x17\x5d\xff" + "\xd4\x9c\x1b\x56\xd4\x3c\x50\x8d\xdf\x63\x78\x9a\x5f\x8d\x7a\xbe" + "\x6c\xbf\x09\x1d\x48\xa8\xa6\x70\x7b\x78\xf0\x5a\x11\x15\x31\x88" + "\xd5\x70\x55\x48\x8d\xc7\xbd\xb0\x96\xcb\xbe\x81\xb4\x4d\xe9\x51" + "\xde\x4d\xcd\x51\x68\xf3\x0d\x34\xc2\xf2\x7b\xff\x1e\x59\x0b\x90" + "\xb2\x11\xda\xc2\xc6\xff\xc5\x79\x7f\x79\xa9\x1a\x9d\x84\x6b\xcb" + "\xea\xf5\x68\x37\xa4\xa5\xff\x17\xe5\xf5\xdb\x68\xda\x58\x1a\xfd" + "\x11\x8a\xd0\x99\x8b\xd3\xbe\x43\x3d\xa1\x4d\x54\x97\x27\xef\x63" + "\xde\xed\x76\x59\x45\x69\xca\x4d\x3f\xa0\x2d\x0b\xa0\x2d\x85\xb6" + "\x33\x7d\x2a\xf4\x19\xc0\x89\x77\x6d\xfb\x8c\x45\xef\x70\x7d\xc6" + "\x4d\xe8\x33\xde\x84\x3e\x23\xdd\x1f\x95\x25\x16\x23\x68\xc3\xba" + "\x4d\x4a\xf4\x36\xa6\x25\x42\xdf\xb1\x0a\xfa\x8e\xe4\x1f\x10\xd3" + "\x6f\xd4\x56\x23\x68\xf3\xbd\x76\x25\x20\xdf\xa6\x9b\xd0\x77\xdc" + "\x84\xbe\x23\x8d\xf4\x1d\x3b\x6f\x40\xdf\xf1\x2a\x78\x83\x04\xe8" + "\x3b\x6a\x05\xfa\x8e\x1b\xc2\xbe\xc0\xda\x0e\x36\xde\xd4\x51\x3b" + "\xa1\xdf\x58\x7d\x11\x51\x3b\xa7\x75\x93\xc8\x99\xfd\x71\xa2\x38" + "\x6f\x7f\xe6\xb6\x85\x8e\x42\x38\xee\xab\x8d\xd0\x0f\x03\x2e\xe5" + "\x3a\x13\xf2\xbe\xd0\x2d\xbc\x11\x8e\x37\xf7\x09\x8c\xde\xff\x8d" + "\x81\xa2\x73\x07\x64\x34\x02\x6e\xab\x97\x23\xaa\x19\x30\x3c\xf8" + "\x62\x0e\x85\x7d\xa2\x25\x2f\xb0\x90\x78\xd2\x3f\xad\xc1\x63\x22" + "\xde\x7a\x82\x9b\x89\x8e\xf2\xa6\xe7\x47\xf5\xdc\x32\x0f\x29\xcd" + "\xdf\xfb\xf7\xb0\xcc\xf7\x57\xa5\x5d\x44\x6a\xc3\xfc\x38\x88\xd7" + "\x75\x74\xf2\xab\x1c\xaa\x60\x06\xd2\xe0\xb5\x0f\xe9\x0d\x27\x92" + "\x0b\x5e\x46\xc3\x0a\xfe\x8b\xc2\x76\xcf\x40\x21\xbb\xbe\xc1\x6b" + "\xa4\x03\x86\xd5\xb4\xf1\x5c\xdc\x27\xf8\x7d\xfb\x28\x7a\xbb\x36" + "\x9a\xf6\x0b\x2b\x82\xbf\x87\xe5\xcc\x00\xff\x00\xe7\x23\x74\x8d" + "\xc5\xe5\xc9\xe7\x50\xd6\x15\x84\xd2\x6a\x58\x8c\x5b\xf0\xbd\x8c" + "\x4c\x14\xb4\x1f\x58\x13\x4c\x24\xf8\xe2\xf7\x60\xd8\x73\xb4\x60" + "\xbc\xe0\x33\xbe\x2e\x60\x31\x3e\x57\x5b\x81\xa0\x0f\xec\xd6\xa2" + "\x0f\x18\x8c\x2f\x23\xab\x36\x00\x6c\xbc\x40\x0b\xf8\x36\xde\xb6" + "\xd3\x07\x4b\x65\xea\x03\xd6\xdf\x98\x96\xe9\xa8\x7c\x8a\x46\xe9" + "\xe7\x10\xb5\xc3\x22\x15\xe3\x3f\x31\xeb\x3f\xe2\xb1\x2f\x32\x0f" + "\xe6\x40\x17\x8c\x85\x5e\x71\x40\x39\x55\xe7\x81\x64\x62\xaf\x77" + "\x8e\x7d\x90\x96\x60\x7f\x30\x55\x26\xf6\x7a\xc0\xbe\x42\x1e\xf6" + "\x77\x24\x62\xcf\xac\x21\xf9\x33\xc5\xfe\x60\x38\x1f\xfb\x3f\x7b" + "\x10\xec\xff\x8c\xe4\x63\x1f\xd4\x4a\xbd\x0f\x62\xeb\xfd\xe1\x55" + "\xf2\xb0\x0f\x82\x7a\xff\xa9\x4e\x1e\xf6\xd7\x25\x62\xcf\xac\x43" + "\xf9\x33\xc5\xfe\xf0\x58\x3e\xf6\x07\xcd\x04\xfb\x83\x26\x37\xb0" + "\x6f\xa5\xde\x07\xb3\xf5\xbe\x68\xb9\x4c\xec\xa1\xde\x7f\x9a\x21" + "\x0f\xfb\xcb\x12\xb1\x67\xd6\xb2\xfc\x99\x62\x5f\x34\x8a\x8f\xfd" + "\xe1\x46\x82\xfd\x61\xa3\x7c\xec\x83\x5b\xa9\xf7\xc1\x6c\xbd\xff" + "\x68\x89\x3c\xec\x83\x71\xbd\xaf\x94\x87\xfd\x09\x89\xd8\x33\xeb" + "\x61\xfe\x4c\xb1\xff\x68\x04\x1f\xfb\xa2\x3b\x04\xfb\xa2\x7a\x37" + "\xb0\x6f\xa5\xde\x6b\xd9\x7a\x7f\x64\xb1\x4c\xec\xa1\xde\x9f\x0c" + "\x95\x87\x7d\xaa\x44\xec\x99\x35\x35\x7f\xa6\xd8\x1f\x19\xc6\xc7" + "\xfe\xa3\x5b\x04\xfb\x8f\x0c\xae\x60\xff\x9a\x2d\xf6\x97\xba\x85" + "\x83\xb7\x62\x74\xfe\x81\x19\x2c\xf6\xef\x03\xf6\xf0\xfc\x07\xa7" + "\xed\xb0\xd3\xf8\x7f\x99\xcb\xe0\x1e\x0d\xb8\x27\x03\xee\xe0\x0d" + "\xad\x98\x03\x46\x3d\x31\xee\x18\xf3\xb4\xcb\x48\x7d\x12\xae\xc5" + "\xf8\x60\x8c\x01\x47\x0d\x83\x73\xd7\x13\xc9\xb4\x87\xd2\x17\xe3" + "\x89\x75\x3f\xc6\xbc\x35\x6d\x8f\x39\xd1\x2a\xe6\x93\xef\x8d\xbe" + "\x6f\xb2\x1f\xff\x6b\x2b\xcc\xcf\x83\x87\x4b\x93\x8a\xf9\x5f\x42" + "\xf8\x98\x1f\xa9\xc1\x38\x00\x17\xaa\xe5\x63\x1e\xa4\x17\xc7\xdc" + "\xda\xc7\x1f\x9b\xea\x1e\xe6\x9f\x66\x70\x98\x07\xe9\x9d\x63\x7e" + "\x59\x06\xe6\x6d\xdb\xbf\x77\x2c\xcc\x8f\x69\xf8\x98\xff\xe5\x32" + "\xc1\xfc\x2f\x97\xc4\x30\xb7\x40\x7b\x8d\xc7\xd4\xf1\x37\x7e\xe6" + "\x86\xa8\xe7\x9b\x01\x57\xfc\xad\x1f\x1e\xeb\x3d\x94\x70\x8c\x6a" + "\x06\xdc\xb7\xae\x40\xda\xac\x15\x68\x84\x77\x35\x69\xbf\x9b\xa0" + "\xfd\xde\x78\x17\x29\x2d\xaf\xf8\xf7\xc8\xba\x86\x94\x4d\x10\xe3" + "\xa6\x57\xe2\xbc\x4b\xa3\x0d\xe8\xe4\x8d\x63\x14\x1e\xbb\xc5\xef" + "\xed\xe8\x1f\xa3\xbc\xc6\xc7\xd0\xc6\xd2\xaa\x37\xc9\xb8\xca\x0f" + "\xd6\x71\x95\x43\xbc\x71\x95\xcd\xd7\xd8\x71\x95\xe9\x04\xa3\x7c" + "\x5b\x7c\x5e\x7e\x4f\x64\x5c\xa5\xa4\xd5\x71\x15\x66\x3c\xe5\x06" + "\xf2\x6d\x7e\x35\xae\xd7\x4e\x76\x5c\xe5\x9d\x04\xf7\xc6\x55\x9a" + "\x5e\xd5\x51\xef\x00\x3e\xaf\x4d\x07\x7c\xbe\x91\x8a\xcf\xc7\xc5" + "\xae\x8e\xab\x58\xfb\x58\x6b\xbf\x8a\xeb\x1c\xee\x5b\x8d\xb9\x81" + "\x31\xf6\x63\x29\xb8\xbe\xdd\x50\xfc\xed\x3c\x6e\x93\xe5\x8d\xa7" + "\x9c\xcc\xec\x6c\xe3\x29\xb8\xce\x59\xfb\xd9\x8e\xd1\xc7\xfe\x2d" + "\x9f\x5f\xf7\x3e\x99\x4a\xfa\xd8\x4f\xa6\xb8\xaa\xaf\x9c\x60\x5e" + "\x65\x3f\x86\x42\x30\x3f\x71\x06\x8f\xb9\xc8\x1b\x47\x39\x79\xa9" + "\xb3\x8d\xa3\x74\x3c\xcc\x4f\xe4\xf0\x31\x3f\x3e\x9e\x60\x7e\x3c" + "\xdc\x7d\xcc\x83\x62\xec\xc7\x4e\x08\xe6\x27\x3f\xc6\x63\x2d\xf2" + "\xc6\x4f\x8a\x65\x6a\xe9\x9f\x6e\xfc\xa4\xe3\x61\x7e\x72\x1d\x1f" + "\xf3\x4f\x47\x12\xcc\x3f\x1d\xd1\x06\x98\x57\xd9\x8f\x99\x10\xcc" + "\x4f\x1d\xc2\xda\x4b\xde\xb8\x49\xf1\xba\xce\x36\x6e\xd2\xf1\x30" + "\x3f\x95\xcc\xc7\xbc\x78\x28\xc1\xbc\x38\xd4\x7d\xcc\x83\x63\xec" + "\xc7\x4a\x08\xe6\x9f\xef\xc5\x63\x2b\xf2\xc6\x4b\x8a\x3b\xdd\x78" + "\x49\xc7\xc3\xfc\xf3\x78\x3e\xe6\x9f\x0d\x20\x98\x7f\xa6\x6d\x03" + "\xcc\xab\xec\xc7\x48\x08\xe6\x67\xf2\xf0\x98\x8a\xbc\x71\x92\x53" + "\x21\x9d\x6d\x9c\xa4\xe3\x61\x7e\x26\x9a\x8f\xf9\xe9\xbe\x04\xf3" + "\xd3\xfe\xae\x7a\x66\xab\x57\xb6\xfa\x63\xc6\x2b\xfb\x82\x66\xb7" + "\x1b\x1b\x21\x78\xff\x63\x0d\xa3\xd9\x65\x7b\xe5\x93\x99\x9d\x65" + "\x7c\xc4\x8a\x35\xf6\xcb\x1d\xc3\x2b\xff\xc3\xee\xfd\xe7\xdf\xbb" + "\x13\xaf\xfc\x77\x95\x18\xd6\x42\x73\x11\xca\xc0\x6b\x5a\xe7\x22" + "\x6c\x5c\x01\x38\x02\x0f\xf0\x5c\x04\x3c\x27\x41\x68\x3e\x02\x9e" + "\x87\x60\x9d\x93\x60\x3b\x1f\x21\x5c\x4f\x1b\xf1\x9c\x04\xec\x93" + "\x4b\xa3\x37\x21\xeb\xdc\x04\x3c\x07\x21\xfd\x3b\xd4\x13\x63\x84" + "\xe7\x1f\x60\xbf\x7c\xaf\xe7\x20\xec\xb0\x74\x84\x39\x08\x25\xb5" + "\xad\x79\xe5\x89\x07\xfa\x23\xe0\x5b\xcb\x38\x55\xf3\xf6\xc0\x68" + "\x5c\xe7\x30\x46\xde\xb5\xa4\x1e\x1e\x9a\x56\x44\x95\x27\x1f\x43" + "\x1b\x57\x23\xb5\x75\xfc\x02\xd7\x41\x68\x97\xbd\x4d\x80\x67\xd6" + "\x22\x32\x8e\x61\xf9\x31\xaa\xa7\xe1\x95\x38\xfc\xdd\xbe\xfa\xe4" + "\xbf\x8a\x28\x3c\xf6\x58\xb0\x00\x85\xbd\x7b\x15\x0d\x2b\xab\xbf" + "\x8c\x98\x3a\x95\x17\xb8\x03\xae\xcd\x68\xce\x0b\x2b\xb2\xf8\x05" + "\xae\x33\xf8\x05\x66\x62\xdc\xb2\xae\x21\x84\xeb\x17\xc6\xad\x3c" + "\x79\x57\x0b\x5e\x0c\x56\x14\x3b\xb6\x21\x5a\xa7\xbe\x92\x8d\x59" + "\xfe\x0d\xc0\xec\x55\x3e\x66\xbb\xe4\x8e\x6f\x58\xe7\x73\xbf\xaa" + "\xa3\x76\x41\x9d\x5a\x3d\x19\x30\x7b\x51\x2a\x66\x5f\xec\x91\x81" + "\x99\xde\x35\xcc\x82\xb4\x2e\x60\x56\xe1\x88\x59\x90\x3f\x5c\x8b" + "\x08\x66\x41\x4a\x83\x5f\x90\x8a\xc3\xec\x8e\x8b\x98\xd9\x7b\xd8" + "\x9f\x13\x66\xa5\xa2\xeb\x9f\x8b\x63\x16\xe4\x62\x3d\x0b\x72\xa1" + "\x9e\x7d\xaa\x13\xc0\x0c\xea\x59\x10\x5b\xcf\x82\xa0\x9e\x05\xd9" + "\xd4\xb3\xeb\x2e\x62\x66\xef\x41\x7f\x4e\x98\x95\xa9\x64\x60\xe6" + "\x62\x3d\x0b\x76\xa1\x9e\x7d\x9a\xe1\x88\x59\x30\xd4\xb3\x60\xb6" + "\x9e\x05\x43\x3d\x0b\xb6\xa9\x67\x97\x5d\xc4\xcc\xde\x43\xfe\x9c" + "\x30\x2b\x17\xff\xfe\x5b\x14\xb3\x60\x17\xeb\x59\xb0\x2b\xf5\xac" + "\x52\x00\x33\xa8\x67\xc1\x6c\x3d\x0b\x86\x7a\x16\x6c\x53\xcf\x4e" + "\xb8\x88\x99\xbd\x07\xfc\x39\x61\x76\x3e\x51\x06\x66\x2e\xd6\x33" + "\xad\x0b\xf5\xec\x64\xa8\x23\x66\x5a\xa8\x67\x5a\xb6\x9e\x69\xa1" + "\x9e\x69\x6d\xea\x59\xaa\x8b\x98\xd9\x7b\xb8\x9f\x13\x66\xff\x14" + "\xdd\xff\x40\x0c\x33\x06\x2f\xd0\x8e\x82\x98\x35\xf1\x75\xa3\x09" + "\x74\x3c\x7e\xe7\x25\x88\xd7\x86\x13\xc9\xf4\x1a\xa5\x2f\xc6\x0a" + "\xeb\x41\x8c\x57\x79\xf2\x19\x24\xa4\x1b\xf1\x7b\x31\xc0\x1d\xe1" + "\x77\x63\xe9\x3f\x48\xd0\x8b\xf3\xc4\xb0\x6a\xfd\x7d\x58\x7e\x02" + "\x87\x95\xf5\x7d\x58\x9b\x62\xf5\x95\x54\xac\x2e\x54\xc8\xc3\x2a" + "\x48\xdf\x3a\x56\xc1\x5a\xe7\x58\x7d\x9a\xc1\x61\x75\xd9\x06\x2b" + "\xc7\x7e\xcc\x75\xac\xec\xfa\xaf\x9f\x15\x56\xff\x4a\x11\xc3\xca" + "\xe4\x1b\x56\x84\xbf\x79\x9f\x04\xde\x97\x9e\x1f\xf5\x7c\xf6\x15" + "\xa4\xdd\x74\x05\x8d\xc0\xdf\x37\x1f\x5a\x6d\xa4\xe0\x19\xff\xf7" + "\xc5\x85\x6a\xd4\xfc\xa3\x7f\x0f\xfc\xfd\x0c\xd3\x4e\xbe\xe2\xaf" + "\x2a\x8f\x36\x30\x6d\xe2\x16\xc0\xa8\xac\xfe\x18\xc4\xa4\x5b\x78" + "\x59\xfd\x47\xa8\x69\x59\x14\xfa\xf2\xd2\x35\xc0\x85\x6e\x2e\xaf" + "\x3d\x86\x0a\xe0\x7c\xf1\x8a\x8f\x90\xe5\x47\x5d\x8f\x39\xc9\x88" + "\xba\xa1\xf8\xf7\x28\xec\x9d\x87\x24\x23\xf5\x84\x5a\xda\x58\x56" + "\xfb\x05\x7a\x77\x1e\xd2\x9e\x49\x46\x08\xc7\x9a\xf1\xca\x8b\xb0" + "\x57\x3e\xc1\xc3\xe7\x1d\x1b\xaf\xcc\x7c\x2f\x9b\x08\xd8\xdc\xb2" + "\xc3\x06\xbc\x38\xc4\xba\xdb\xa4\x7a\xc0\xa6\xde\x8a\xcd\x75\x94" + "\xb6\x04\x63\xa3\xe7\xbc\x32\x8b\x4d\x3e\x6e\xf3\x12\x6d\xbc\xf2" + "\x0d\x1b\x6c\xd8\x6f\x55\x79\xd8\x58\xc7\x32\x56\xea\xf0\x3b\x72" + "\x07\xaf\x2c\x6f\x2c\xa3\x52\xf4\x5b\x11\xa6\x1e\x41\x1d\x99\x04" + "\xf5\x28\x25\x89\xa9\x47\x24\xfe\x7d\x02\x81\xef\x45\xc8\x5b\xdf" + "\x2d\x7c\x13\x60\xd0\x04\x75\x0d\xf7\x45\xe9\xf0\x9c\x18\x4b\x8c" + "\xdb\xa4\xfd\xcd\xcd\x2f\xd7\x23\x0a\xda\xac\x42\x8c\x9d\xf9\x47" + "\x7f\x55\x36\xf4\x55\xe5\xb3\xbe\x01\x7c\xea\x50\xb9\x81\xc5\x66" + "\xf5\x37\xe8\x86\xa2\xf2\x02\xfd\x8a\xae\xc7\xe3\xc0\x53\xe8\x7b" + "\xd4\x73\xf0\xb7\x2f\xd0\xe6\xbd\xbb\x00\x0d\x9b\x90\x48\x1b\x99" + "\xb9\x3c\x50\xc7\x70\x7f\x86\xdb\xc3\xb2\xc4\xcf\x90\x39\x2f\x70" + "\x5d\xb3\x5f\x58\xd1\x99\x24\x84\x70\x9b\x88\xb1\xe8\xb2\x9c\xc3" + "\x0e\x7f\xb7\x67\x3b\xd6\xe1\xd0\x16\x2e\xfa\x42\xb8\x7e\xcd\xd2" + "\x4b\x1a\xef\xc8\x67\xeb\x57\xbe\xdc\xf1\x0e\xeb\x78\x14\x60\x88" + "\xbf\xd5\x4b\xbf\x88\xa8\x77\x24\x63\xf8\xf5\x25\x19\x18\xea\x5b" + "\xc7\xb0\x81\xc5\x30\x48\xdb\x3a\x86\xdf\xec\x70\xc4\x30\x08\xd9" + "\x60\x58\xc1\x61\x18\xe4\x4f\x30\x0c\x52\x72\x18\x06\xa9\x5a\xc7" + "\xd0\xce\x4b\xff\xac\x30\xfc\x8f\xf3\xf1\x0f\x41\x0c\x83\x5c\xa8" + "\x87\x37\xad\x18\xba\x50\x0f\x2f\xcd\x12\xc0\xd0\xa6\x1e\x7e\xaa" + "\xb3\xc1\x90\xad\x87\x41\x36\xf5\x30\xc8\x85\x7a\x68\xe7\xad\x7f" + "\x56\x18\x5e\x8e\x91\x81\xa1\x0b\xf5\xf0\x5b\x16\xc3\x60\x17\xea" + "\xe1\x7f\x35\x8e\x18\x06\xdb\xd4\x43\xd0\x2e\x2d\x18\x06\xb3\xf5" + "\x30\xd8\xa6\x1e\x06\xbb\x50\x0f\xed\xb4\xca\xcf\x0a\xc3\x6f\x75" + "\xd2\x31\x0c\x76\xa1\x1e\x9e\xb4\x62\xe8\x42\x3d\xfc\xb6\x4a\x00" + "\x43\xdb\x7a\x58\x69\x83\x21\x5b\x0f\x83\x6d\xea\x61\xb0\x0b\xf5" + "\xd0\xce\x7b\xff\xac\x30\xd4\x3b\x1f\xff\x17\xc6\xd0\x85\x7a\x98" + "\xce\x62\xa8\x75\xa1\x1e\x7e\xb7\xdf\x11\x43\xad\x4d\x3d\x3c\x19" + "\xca\x61\xa8\x65\xeb\xa1\xd6\xa6\x1e\x6a\x5d\xa8\x87\x76\x5e\xfc" + "\x67\x85\xe1\x95\x22\x57\x30\x04\x9d\xed\xa8\x4b\xeb\x39\x0c\x6d" + "\xf1\xb3\xd7\xa2\x11\xa0\x51\x31\x76\xb3\x4c\x88\x72\xc4\xef\xfb" + "\x38\x8c\x5f\x08\x7e\x1f\x77\x87\xd3\xa4\x0c\x76\xec\xfb\x1c\x8c" + "\xd9\x19\x68\xf1\xb1\x3e\xb5\xea\x51\xfc\x4e\xb5\x45\x8f\xc6\xfe" + "\xff\xaa\x47\xab\xe2\xa5\x63\xc7\xf6\x83\xa2\xd8\xf1\xfb\xbe\x08" + "\xe8\x13\xc5\xb1\xfb\x41\xeb\x88\x5d\x30\xe2\xb0\x23\xfd\x1e\xc1" + "\xee\xd3\x0c\x6b\xff\x47\xb0\x63\xfb\x3f\xa7\xd8\xfd\x9c\xfb\xbf" + "\xab\xa2\xfd\x9f\x79\x2d\xa2\x76\xad\xb5\x14\xe5\x50\x96\x63\xf0" + "\x2b\x86\x5f\x09\x1c\xeb\x02\xc7\x98\xb1\x18\xf8\x3f\x73\xce\xd2" + "\x83\x59\x0b\xac\xd8\xdb\x23\x1a\xef\xdb\x81\xd3\x74\xb5\xa6\xf1" + "\x5e\x83\x46\x15\xb0\x79\xc0\xf1\x0c\x38\x5e\xec\xe5\x31\xaa\x2b" + "\xa4\x2f\xa1\xb3\xdf\x0f\x83\x63\xdd\x70\x5a\x7a\x8d\x92\xf1\xa5" + "\x34\x45\xe1\x3c\xec\xef\xa9\x62\xd3\x04\xd8\xde\xb7\xe7\x9a\x51" + "\x78\x1d\x10\x6b\x9a\xee\x16\xea\x9b\x28\x9c\xce\xe2\xa1\xd4\x58" + "\xd6\x22\x8d\x6d\x5a\x7a\x0c\xc2\xf9\x5a\xd3\xf6\x60\xf3\xd3\xda" + "\xa6\x31\xbf\x87\x90\x97\x87\x86\xc9\xd3\x2b\x91\xc2\xcf\x84\xd3" + "\x3e\x40\x7b\x15\x66\x31\xe9\x3d\x94\x3a\x5e\xfa\x0d\x88\x49\xcb" + "\xa6\xf3\xa4\xbb\x7e\x96\xc8\xa6\x63\xbe\xa7\x80\x63\x4a\xdb\xf8" + "\xb1\xe9\x7a\x5a\x63\x83\xd7\x1e\xb7\x7d\x56\xf3\x5a\x0a\xe7\x87" + "\xd3\x78\x59\xba\x9e\xca\x60\x9f\x25\xcc\xf6\x9e\x38\x1d\x5c\x37" + "\x94\x8d\xb3\x37\x3c\xc3\xb0\x96\xfc\x72\x6a\xa2\xac\xe9\xd2\xcd" + "\xa8\x6f\x01\x17\x1b\x35\xc4\xba\x04\xaf\x21\x68\x8f\x9d\x97\x87" + "\x87\x1e\x63\x57\x0e\x3d\x28\x4e\x4b\x7b\xbd\x9f\x02\xe9\x7d\xd8" + "\xe7\x18\x45\x9e\x83\x59\x6f\x85\x60\x4d\x99\x7a\xef\x66\xca\xea" + "\xa1\x61\xcb\xda\x0b\xd2\x8d\xb5\xe6\x6b\xa1\x98\x71\x0c\x36\xad" + "\x92\x49\x5b\x16\x8f\xd7\xd7\x6f\x49\xdf\x1b\xa7\x35\x67\x1f\xd9" + "\x61\x5e\xa3\x0c\xb7\xcf\xdf\xbc\x56\x85\xcf\xdb\xe6\xef\x4b\xd2" + "\xef\x2f\x82\xf4\x13\x1c\xd3\xab\xed\xd3\xfb\x91\xf4\x7f\x3a\x08" + "\xe9\x23\x1d\xd3\x9b\x7a\xd9\xa5\xef\x43\xd2\x1f\xdc\x0f\xe9\xa7" + "\x38\xa6\xd7\xd8\xa7\xff\x05\x49\xff\x97\x2c\x48\x1f\xe5\x98\x7e" + "\x94\x7d\x7a\x7f\x92\xfe\x70\x21\xa4\x9f\xe5\x98\x3e\xc3\x3e\x7d" + "\x5f\x92\xbe\x68\x0f\xa4\x8f\xb6\x4f\x5f\xc0\xa4\x45\x41\x6c\xda" + "\x07\x49\xda\x8f\xf2\x21\x6d\x8c\xc0\xb3\x2a\xd8\xbc\x43\xd9\xf4" + "\x0f\x91\xf4\x7f\xd4\x40\xfa\x38\xc7\xf4\x4a\xfb\xf4\x01\x24\xfd" + "\x99\x62\x48\x1f\x2f\x80\x95\x7d\xfa\x7e\x24\xfd\x27\x2a\x48\x9f" + "\x28\x80\x95\x7d\xfa\xfe\x24\xfd\xdf\x4c\x90\x3e\x49\x20\xf6\xf6" + "\xe9\x1f\x26\xe9\x4f\x18\x20\x7d\xb2\x40\xec\xf9\xe9\xb3\x4f\x56" + "\x41\xba\x94\xdd\x2c\x37\xed\xe2\x6e\x9f\x77\x20\xc9\xfb\x54\x25" + "\x5c\x93\xe1\x98\x1e\x79\x90\xf4\xe8\x09\x36\x7d\x10\x49\xff\x79" + "\x29\xa4\x5f\x27\x10\xfb\x60\x9c\xbe\x80\xa4\x0d\x26\x69\x8f\x65" + "\x40\xda\x4c\x81\xb8\xdb\xa6\xd5\x92\xb4\xff\x8c\x87\xb4\x59\x02" + "\x31\xb7\x4d\x3b\x80\xa4\x3d\x1b\x06\x69\x73\x04\xe2\x6d\x9b\x76" + "\x20\x49\xfb\x45\x35\xa4\xcd\x15\x28\x6f\x90\x4d\xda\x47\x48\xda" + "\x52\xcc\xab\x1d\x02\xb8\xd8\xa6\xd5\x91\xb4\x17\xfd\x21\x6d\xbe" + "\x00\x26\xb6\x69\x07\x91\xb4\x65\x91\x90\x76\x8f\x00\x26\xb6\x69" + "\x1f\xa5\xb3\x2b\x94\x6c\x3b\x5d\x68\x9f\x76\x37\xd7\xee\x3e\x66" + "\xf1\x3a\x7f\x8c\x6d\x2b\x99\xb5\xa4\xe9\xb5\x78\x2d\xbb\x96\xe7" + "\x7a\xd2\xda\x47\x58\x28\x14\x42\x67\xff\xe3\x20\x5c\x87\xf3\x3c" + "\xe8\xd8\xb6\x29\x9f\xdc\xcd\xf5\x11\x83\xe9\xec\x2b\x46\xf6\xfe" + "\x45\x8e\x69\x55\xb6\x69\x1f\xa7\xb3\x2b\xa3\xd9\xb4\x47\x1c\xd3" + "\xaa\x6d\xd3\x0e\xa1\xb3\xbf\xd1\xb2\x69\x8f\x09\xb4\xaf\x4f\xd8" + "\xa4\x0d\xa5\xb3\xff\x53\x0d\xe9\x8e\x0b\xb5\xaf\xf4\x5a\xcd\x13" + "\xb8\x3d\xb0\xb6\xdd\x90\x7e\x28\x89\x6f\xd5\x11\x88\x2f\xf3\xfd" + "\x90\x35\x2d\xe0\xf0\x84\x4d\x5f\xf9\x84\xc5\xeb\xf2\x41\x36\x66" + "\xa7\x1d\xcb\x90\x61\x5b\x86\x27\x49\x9e\xdf\x26\x42\x9e\x25\xf6" + "\x65\x60\xdb\x23\xac\x13\x70\x7c\xc3\xcc\xd9\xdf\x85\xe1\xf8\x42" + "\xda\x52\x9e\x46\xa0\x3c\x14\x38\x4f\x16\xdb\xa7\xe8\xec\x7f\x9d" + "\x66\x63\xc0\xeb\x8f\xa0\x3e\x32\xed\x21\xe0\x5b\x42\x6f\xe8\x15" + "\x0f\x69\x9f\x66\xd3\x5d\xb0\xef\x07\xd9\xf2\xfd\x12\xce\x55\xb6" + "\xf4\x81\x1e\xca\x4b\x42\x5a\x26\xf1\x51\xf4\xc0\x35\xc5\x4d\x32" + "\x1f\xbf\x65\xef\x2c\x83\x9e\x79\x9e\x42\x9f\xd0\x88\x7a\xda\x64" + "\x7b\x6c\x2b\x45\x57\x0c\xa9\x47\x4a\xbc\x06\x1f\xed\xf7\x4c\xb5" + "\x1e\x8e\x1b\x06\xf4\x42\x0d\xd9\x37\x73\xf4\x1e\xc7\x8b\xf0\x9a" + "\x4c\xf0\x77\xbe\x1e\x2d\x9c\x80\xff\xde\xba\x96\x36\xe2\x3d\x10" + "\xcc\x6f\xd6\x68\xca\x2d\xb5\x78\x2d\x45\x23\xe4\x61\xbc\x9a\x88" + "\x14\x78\xdf\x38\xbc\xae\x6b\x79\x72\x2d\xba\xaa\xb8\xf9\x1d\xfd" + "\x6a\xdc\x08\x28\x43\x34\xdc\x2f\xe6\x0a\xfc\x9f\xc4\x14\xb4\x6f" + "\x4e\xcd\x88\xe2\xa5\x78\x7d\x3a\xc3\x20\x83\xdf\xd8\x68\xfa\xf5" + "\x99\xd5\x89\x69\xe8\xe1\x6b\x0a\x83\xce\xba\x16\x15\xb3\xfe\xd4" + "\xcd\xb8\x5f\x91\xb5\xa7\x0c\x1f\x5a\x7c\x6a\x46\x38\xac\x3d\xb5" + "\x27\x92\xdd\x43\xc5\xc0\xe4\x0d\x65\xab\xa0\xb5\x3e\xfe\x96\xa6" + "\x75\x19\x78\x8f\xb7\xe2\xb4\x6b\xe8\x0a\x7b\x0e\xe7\xc9\xe6\xb5" + "\x06\xe7\x81\xf3\xb2\xe6\x83\xaf\x33\x04\x46\x22\xfc\xec\x10\x07" + "\x7f\xd7\xd7\xaf\x32\x24\xe2\xf5\xab\x24\xa4\xd7\xe1\xf4\xc2\xeb" + "\xf2\x82\xc6\xd9\x56\x13\xd5\x90\x7d\x0b\x6b\xd5\x38\x12\xf7\x5b" + "\xbe\x7a\x64\x51\xb2\x7f\x6b\xf4\x1e\x88\xc5\xe3\x56\x88\xde\xa3" + "\x48\xcd\xfe\x3d\xcc\xba\x5e\x98\x60\xbe\xea\x9a\x10\x88\xf7\x58" + "\xcb\xbb\x51\x2a\xac\xad\xc9\xba\xa5\x35\x21\x9a\xfe\x78\x3d\xe7" + "\x5b\xc7\xe1\x9e\x63\x49\x5c\x6e\xe5\xc1\xbf\xde\xec\xbf\x06\xf6" + "\x5f\x1a\xa7\x61\xb8\xe4\x3b\xc2\x9f\xce\x19\x38\x8a\xec\x0b\x73" + "\x8b\x59\xab\x8c\xc1\x0e\xf0\xa5\x7d\x06\x8e\x62\xf2\xcd\x1b\x1b" + "\x6d\x5b\x86\xd0\xa1\x4f\x3c\x19\xf6\xd4\xd3\xbf\x1c\x36\x7c\xee" + "\xbc\xf9\x31\xb1\x0b\x7e\x1f\xb7\x70\xd1\x2b\xf1\x8b\x13\x5e\x4d" + "\x5c\xb2\x74\x59\xd2\xf2\x15\x2b\x93\x57\xad\xc6\x0b\x87\xb5\x94" + "\xf5\xdd\xb1\x1e\xf5\x14\x02\xdc\xc6\xc0\x3d\xea\xfa\x31\xf7\x85" + "\x63\x04\xe3\x3a\x4f\xa5\x46\x58\xbf\x97\x83\xa2\xc6\x7b\x7b\xd4" + "\x2a\xea\x16\xe2\x7d\x46\x80\x63\x1e\xe5\xf9\xcf\x17\xe3\x3d\xca" + "\xaa\x14\x75\xb3\xca\x0c\xcf\x17\xe3\x3d\xf5\x3e\xf7\xaf\x46\xda" + "\x20\xbc\x8f\x59\x5d\x38\x3e\x5f\x30\x10\xa1\xd3\x70\xad\x50\x9e" + "\x41\x6a\xe4\xff\x56\x1f\xda\x90\xdb\x87\xae\xc5\xf9\xe7\x6e\xa7" + "\xab\x0d\xaf\xc5\xa1\x6c\xf8\x3f\xf0\x5c\x7d\x55\x71\xbb\xdf\xe7" + "\x01\xcc\xde\x44\x01\xbb\xb7\xd3\x55\xeb\xfa\xd0\x55\xaf\x6f\xa7" + "\x6b\x0b\xfa\xd0\x7a\x6d\x2e\xf2\x6c\xc8\xae\xab\xd0\x2b\xea\x98" + "\xbd\x44\xb6\xc2\x79\x8b\xd7\xad\x92\xad\x70\x6e\x88\x09\x29\x0a" + "\xe0\xff\x70\xac\xfe\x73\x0d\x29\xf7\x07\x75\xc6\x2e\xf0\x7c\x47" + "\xe8\xe6\x78\x8f\x6c\xb8\x0f\xc1\xe3\xf6\xe8\xd3\xd0\xf3\xc3\xfd" + "\x0c\xe5\xc6\x2b\xc0\xcd\xdb\x78\x1d\x58\x7c\x3f\xef\xf2\x1d\xb5" + "\x08\xe7\x77\x78\xa9\xb1\xcb\xb2\x07\x69\x13\xa4\xd5\x58\x5e\x8b" + "\xf7\x80\xfb\x99\x20\xef\x7a\xdb\xe7\xd1\x2d\x58\x9c\xa4\x49\x58" + "\x1e\x1f\x3f\xa8\x07\xd2\x31\xff\x22\xdb\xfd\xf5\x92\x20\x3f\xf4" + "\xd6\x76\xfa\x34\x3c\x67\x31\x3c\x6f\xc9\x39\x70\x0a\xc0\x0d\x04" + "\xcf\x94\x03\xf9\xe6\xc1\xf1\xe3\xf0\xf7\x71\x28\x7b\x09\xb3\x77" + "\x97\x52\x79\x8a\xce\xbe\x3d\x01\xca\x59\x82\xf7\x27\xc0\x6b\x29" + "\xde\x5e\x39\xc5\x03\x9e\x3b\x17\xd2\x95\x68\x1e\x44\x03\xae\x2a" + "\xea\xfb\x41\x39\x0a\xe1\x6f\x9c\xfe\x2c\xc6\x11\xd2\x9f\x66\x9e" + "\x4b\xa9\xfc\x10\xff\x1f\x62\x55\xbc\xab\x0f\x9d\xd5\x90\x7d\xdb" + "\x88\xd7\x5a\x65\xf6\x8a\x81\xff\x43\x5c\x4a\x20\x6d\xce\xed\xf4" + "\x29\x1e\x78\x2f\xca\x82\x96\x3c\x6f\x97\xe0\x32\xe1\x72\x60\xdf" + "\xfa\x25\xa8\x40\x4b\x73\x14\x1a\x6c\x44\x1e\x5f\x56\x21\x94\xbf" + "\x9d\xde\x03\xbf\x7c\xf8\xed\xf8\x02\xce\x9d\x85\x5f\x09\x1c\x2f" + "\x85\x7f\xbf\x80\x7f\xcf\x56\x31\xef\x41\xfd\x71\xb9\x97\xa5\xd0" + "\xd5\x43\x76\xa0\x60\x66\xaf\xcb\x34\xf4\xbb\x2b\x4a\xa5\x3f\x2e" + "\x3b\x5e\x57\x99\xf6\xfa\x7f\xec\xbd\x0b\x78\x94\x55\x96\x2e\xbc" + "\xea\x12\x08\x18\xc8\x45\xd4\x68\xd3\x6d\x61\x07\x3b\x2a\x84\x02" + "\xc1\x46\x1a\x24\xdc\x24\x48\x80\x28\x68\x47\x89\x40\x34\xb1\x83" + "\x72\x29\x93\x08\x01\x42\xaa\x28\x50\xd1\xe6\x52\xc4\x88\x51\x43" + "\x12\xdb\xd8\x1d\x5b\x7a\x64\xce\x30\x67\xd2\xcf\xd0\x6d\xba\x49" + "\x9f\xc9\x9c\x03\x29\xe6\xfc\xf8\x3f\x99\x3e\x74\x77\xc1\x89\xe9" + "\xc8\x04\x2c\x4d\x41\x15\xa4\x52\xfb\x7f\xd7\xde\xdf\x97\xba\x50" + "\x41\x3d\xe3\x99\xf3\x3c\xe7\x37\xfa\xf1\xd5\xb7\x2f\x6b\xaf\xbd" + "\xd6\xda\x6b\xaf\x7d\x5b\xdb\x17\xe3\xff\x15\x44\x47\x3c\xde\x63" + "\xe4\x3b\xf2\x31\x5d\x2e\xc0\x53\xa9\xfd\x6e\x23\xd3\xa5\x5e\xed" + "\x77\x27\x9e\xae\x2f\x7d\x62\xe1\x0d\xf5\x98\xfc\x79\x5f\x39\xed" + "\x57\x7b\xf6\x7c\xb5\x72\xaf\x24\x92\xa9\x7f\x0d\x9e\xda\xe8\xf0" + "\x7e\x9b\x0a\xa3\x99\x2a\x8c\x72\xb4\x77\x39\x99\x0d\xa0\x93\x01" + "\xf0\x0d\x47\x54\x98\xe1\x18\xde\x66\x3c\x29\x31\xe5\x33\xcc\x26" + "\xe6\x67\x3f\x74\x3d\xf3\xd2\x63\xf2\x15\x30\x8f\xf6\x2b\xd9\x32" + "\xf0\x5e\x07\x84\xe5\x43\xb6\xea\x06\xe5\xc7\x74\x79\x49\xb4\xfc" + "\x5c\x9e\x1e\x23\x3f\x2e\xd6\x45\x68\x2f\x4d\x0d\x4a\x5e\x8e\xf5" + "\x6d\x2b\xc2\xf7\xe5\x99\x80\x73\xcc\xb2\x4a\xc2\x90\x76\xce\xfe" + "\xf3\x44\xa3\x4a\xc8\xcc\xfa\xa5\xd7\x74\x79\x2f\xcb\x2c\x97\xad" + "\x95\xab\x70\x01\x7e\x08\x6b\x64\xfc\x36\x02\x2e\xbe\x19\x6e\xa3" + "\x9b\xbe\xd0\x71\x93\x79\x5e\x7d\x16\xf2\xa8\xe1\xcb\x30\x39\x9f" + "\x08\xd7\x2b\x9f\xf3\xa8\xb2\xfd\x73\x10\x6e\x85\x8e\x22\xfb\xe7" + "\x64\x72\x07\x3d\xc4\x32\xc9\x6f\x77\xd0\x8a\xb6\x94\x43\x21\xee" + "\xe7\xd2\xc9\x8a\xf6\x36\xe2\x9c\xc9\x9f\x91\x55\x49\x56\x86\xc7" + "\xfa\x1b\xf5\xe8\x69\xe0\xb6\xa8\x60\xdd\x4f\xd2\xef\xa2\x2f\xff" + "\xbf\xda\x48\x96\x53\xcf\xf8\x20\x3e\xa2\xdc\x1a\x37\x46\x40\xfb" + "\xb7\xaa\xba\xa2\xac\x26\xe4\x3f\xc2\x75\x67\x7a\x22\xbe\x05\x70" + "\x1c\x1c\xc7\x77\xab\x68\xf5\x69\xe2\x73\x19\x4c\x0f\x4e\xcf\x77" + "\x3e\x2a\x7f\xb2\x7d\xef\x49\xba\x21\x3f\xf3\x43\xa0\x0c\x86\x61" + "\x0f\x8a\xa0\x80\x3e\x7a\x77\x2b\xdf\x21\x10\xb8\x12\xcd\x1f\x7f" + "\x67\x24\x7f\x90\xef\x08\xf2\xb7\x71\xff\xcb\xfa\x04\x65\x26\xf3" + "\x5d\x68\x08\x73\x85\xf6\x01\xc6\xa6\x80\x9c\x03\x02\x9c\x4f\x81" + "\x8b\x8b\xe1\x00\x9f\x36\x05\x2b\x90\xc1\xbe\x26\x23\x79\xad\xc1" + "\x6b\x62\x9e\xcb\xf6\xbc\x55\xd6\x09\xba\x2b\xf0\xeb\x7a\x15\xd7" + "\x82\x34\x2d\xa2\x3f\x87\xc4\xb6\x7c\xcd\x5e\x90\x71\x47\xed\x57" + "\x24\x7f\xdb\xd4\x9d\x84\x81\x7f\x2d\xdb\x2e\x7a\xc2\x78\x07\x5c" + "\xba\x4f\x75\x0d\xef\xa3\x5c\x9e\xd8\x5c\x20\xfb\x50\x2e\x83\xf3" + "\x6b\xf0\xd6\x31\x3c\x9d\x56\x59\xc0\x43\xd1\xcb\xdf\x88\xf0\x26" + "\x96\x45\x49\x37\xe8\xd1\x3e\x3b\xcb\x62\xa0\x06\xf9\x8f\xed\xe3" + "\xef\xcd\xf2\x3b\x53\xea\xd8\xc1\x78\xff\x19\x8e\x77\xf7\x80\x6f" + "\xcf\x41\x96\x42\x44\xdf\x1f\x43\x56\x9f\x53\xd6\xed\xb0\x6f\xdb" + "\x7c\xc3\xf1\x20\x11\xe3\x09\x1a\xb5\xf8\xf7\x5d\x99\x09\xdd\x5f" + "\xc9\xb8\x42\x5f\x1f\x15\xef\xe6\x13\xe3\x0c\x7d\xa6\xe1\x77\xe5" + "\x57\x1a\xef\x8f\x72\x1d\x99\x9e\x59\x4a\xf7\x21\xae\xff\x61\xc6" + "\x3d\x5c\xef\x2b\xbb\x23\x69\x2c\xeb\x0d\x3e\x30\xbf\x98\x2f\x11" + "\x30\x59\xf6\x5d\x80\x75\x58\x7d\x2b\xd9\x60\x5a\xbb\x6e\x16\x27" + "\x38\x7d\x38\xed\xd5\xdf\x71\x5c\x15\xca\x9e\x64\xe3\x71\x0b\xfa" + "\xe7\xa0\xbf\x15\x70\x0f\xf3\x7d\x9e\x80\xd1\xc2\x34\x05\x2e\x37" + "\xb1\x3c\xe2\xfb\x84\x96\x6f\x0c\xfa\xf3\x09\x78\x66\x86\xdb\x7f" + "\x7f\x42\xb4\x7c\x5d\x8d\x6d\xff\xcc\x6f\x57\xc8\x9e\x43\xda\x5d" + "\xc6\x96\x8b\xa6\xab\xef\x68\x7d\x87\xc6\xeb\xab\x97\x8e\xa3\xbd" + "\x44\xc0\xa8\x8c\xe1\x75\x8b\x94\xc7\xcd\xb9\x06\xae\x33\xf2\xb6" + "\x68\x70\x64\x9d\xa5\x3c\x39\xa5\x0c\x9c\x10\x9b\x51\xcf\x41\x39" + "\xb8\xd2\xa9\xf1\xf9\x44\x0c\x4d\x74\xdd\x95\xc1\x77\x74\xb1\x4e" + "\x82\x7d\xfb\x80\xbf\x3f\xac\x97\x98\xf7\x21\xc9\xfb\xab\x8e\x06" + "\xd5\xdf\x6a\x7a\xeb\xaa\x8a\xbf\x39\x4a\x86\x19\x97\xbf\x97\xf2" + "\xcb\xb8\xd8\x0b\x18\x97\x16\x89\x87\xdd\x42\x17\x4d\xfd\x13\xb8" + "\x7c\xe4\x6d\xd1\xda\xab\x06\xeb\x0a\xcb\xcb\xb1\x9d\xd0\x55\x8c" + "\x13\xca\x4e\x97\xfa\xef\x41\x49\xd7\xbd\x1a\xee\xed\x01\x27\xe7" + "\xbd\xec\xb8\x62\x94\x79\xdb\x3d\xa6\x4b\xbe\x80\xba\xe3\x60\x24" + "\xf2\x37\x5b\x9e\xe2\xf4\xa2\x97\x75\xb4\xe5\x09\xf9\xfb\x63\xcb" + "\x63\x90\xd5\xf3\x64\x06\xbc\x44\x96\x51\x5d\x2e\x7a\x4d\xe2\x0f" + "\x3c\x5e\x00\xad\x0f\xc3\x46\x6a\x66\x7a\xb3\x2c\xc3\x46\x9a\xea" + "\xdf\xd7\xef\xd3\xe5\x16\xe5\xd4\x31\xed\x15\x7f\x82\xf7\x43\x8e" + "\x5b\xc2\xb2\x15\xbc\x5f\xa3\x23\xdf\x93\x98\x88\xf2\x7e\xad\xd5" + "\xab\x19\xe9\x61\x8b\x89\xf7\x35\xdc\x6b\xb5\xf4\x8f\xea\x7c\xd0" + "\xda\xea\x89\x7d\xac\x7f\x25\x0f\x82\xbd\x5a\xde\x26\xad\xac\x0b" + "\x7a\x5a\xb6\x11\xd5\x7d\x65\xc1\x0b\xac\x07\x27\x81\xf7\x52\xf7" + "\xc9\xbb\x6e\x55\x18\xb7\x1d\x55\x86\x90\x77\x23\xee\x84\xdd\x13" + "\x96\xa3\x60\x5b\x8c\x7e\x62\x5d\xec\xea\xd8\xa5\xee\x83\x60\x59" + "\x62\x9d\xca\xe3\x12\xc0\xab\xd3\xda\x8f\x86\xf3\xc0\xe4\x68\x59" + "\x11\x3b\x20\x2b\x13\xc3\xb0\x07\x2c\xf1\xfa\xb9\x06\xa5\x03\xeb" + "\x54\x9e\x81\xe7\xb5\xba\x1d\x56\x75\xd3\xbe\x99\x6e\x55\x92\x6e" + "\xd3\x22\xe8\x08\xba\x85\xde\xd1\xd2\xb7\xb0\x2e\x0f\xb7\xd7\x81" + "\x3f\xe9\x6d\xf9\x5a\x7d\x11\x3a\xc0\xed\x21\x02\xaf\x96\x18\x7d" + "\xd1\x12\x5f\x5f\x0c\xec\xd6\xea\xdb\x18\xd3\x36\x9a\x34\x7b\xf7" + "\x3d\x9d\x0f\x1d\x3e\xfd\x5e\x8e\xbe\xf7\x58\x7f\x72\xd9\x91\x7d" + "\x50\xbd\xa2\xab\xd6\x96\x43\xdb\xaf\xe5\x43\x28\x37\xb2\x3d\x33" + "\xaf\x59\x27\x30\x0c\xe6\xa9\xb4\x2b\x11\xa6\xf8\x1a\xca\x60\xdd" + "\x10\xa9\xa3\x91\xb6\x26\x24\xb8\xbd\x84\xf2\xa2\xdb\xe2\xc0\x31" + "\xad\x2d\x6a\x65\x8b\x71\xe0\x91\x35\xa2\xdc\xb6\x98\x72\x99\x37" + "\x6d\xd2\xef\xb2\xe2\xe9\x28\xbd\x4f\xe3\xf4\xc8\x5b\x81\x3c\x81" + "\x98\xfe\xd1\xc5\xf8\xa1\x2c\x9b\xd4\x59\x07\xa5\xae\xa8\xf0\x2b" + "\x7c\x82\x0d\x5a\x3f\x81\x30\xab\x16\xd6\xae\xf5\x25\xba\xdc\xac" + "\x8f\xc6\x49\xe4\xc7\xb7\x8f\x06\x6c\xba\x7d\x24\x61\x49\x5d\x24" + "\x0a\xb4\xfa\x71\xd8\x44\x15\x36\x90\xc1\x61\xfb\x14\x1d\x6a\x84" + "\xec\xaf\x82\xed\x5a\x7f\xc5\xed\xcb\x88\xef\xe9\xdc\xc6\xf8\x1b" + "\x30\x8e\x30\x7c\xb7\xe3\x2a\x8f\x21\x6a\x3d\xa6\xfe\xd3\xac\x0f" + "\x58\x5f\x58\x9e\x51\x7a\xc3\xb2\x54\xbe\x07\x58\xef\xb0\x1d\xc2" + "\xf1\x48\xd7\xc6\xba\xa8\xdb\x4c\xa9\x96\x87\x60\x17\xfc\x5b\x22" + "\xe0\x0a\x9f\xcc\x6b\xa6\xf1\xd2\x56\xf8\xb7\x1c\x93\x1e\xa6\xe7" + "\x83\xde\xfa\x98\xf3\x71\x7e\x5d\x7f\xb1\xee\x0a\xb2\x6e\xe2\xf2" + "\xcc\xb4\x56\x93\x71\x39\x6e\xd0\xed\xa2\x7e\x63\x44\x5a\xbe\xab" + "\xe0\x29\x99\xf6\xa8\xd4\x67\x66\x7a\x8f\xf3\x4a\xfe\x41\x57\x56" + "\x5d\x11\x67\x1b\x4a\xc9\x5c\xff\x05\xeb\xc5\xbe\x26\x85\xa7\x81" + "\x64\x3d\xcc\xf4\xcf\xb2\x1e\x4a\xa7\xba\x14\x2e\x7d\x4d\xf5\x57" + "\x65\xdc\x27\x5c\x17\x8e\xdb\x1f\x11\xc7\xf7\x85\x20\xbf\x41\xe2" + "\x15\x93\x2f\xd4\x5f\x72\x4d\xfa\x06\x75\x07\x6e\x62\xfd\x41\x4d" + "\xf7\x9a\x0d\x0e\x85\xa7\x61\x96\xae\x77\x41\x97\x13\xac\x7b\x65" + "\xdc\x33\x5a\x9a\xa5\xda\xfb\x41\xf9\x5e\xaf\xe8\x9a\x6e\xd4\xe8" + "\x7d\x5a\xab\xc7\x0e\x39\xce\xfe\xb7\x7c\x93\xc7\x6c\x28\xd2\x69" + "\x1b\xf9\x9b\xdb\x0f\xca\x4f\xe1\x6f\x29\xf7\x95\x72\x0c\x5b\xc7" + "\x69\x18\x27\xd9\x47\x98\xa9\x20\xd6\xa6\xee\x36\x9b\xae\x70\xbf" + "\x24\x6d\x55\xb3\xe9\x5f\xb5\xf9\x1f\x6a\x2d\xfd\x19\xf5\x9a\x8d" + "\x19\xba\x8e\x11\xfe\x1c\x62\x7f\xe5\xdd\x66\xe3\x78\x0e\x63\xff" + "\xf6\x91\x69\x58\x3f\x7d\x78\xd5\xa3\xc1\x34\x92\xae\x37\x58\x97" + "\x74\xf8\xce\x91\x16\x7e\xa4\x5e\xd3\x25\x17\xcd\xc6\xbf\x8d\xb2" + "\xc3\xf0\x1d\xa5\x33\xcc\xa6\x3f\xc4\xea\x0c\xd8\xcd\xbb\xfc\xd5" + "\xc6\x5d\x51\x76\x00\xc2\xae\xab\x3b\xcc\xc6\x7c\x6e\xa3\x7c\x5f" + "\x91\xd4\x4f\x3c\xa7\x65\x36\xdd\xaa\xe3\xcc\x7a\xb3\x6f\x9b\x36" + "\x7f\x61\x36\xfd\x3d\xdb\x6a\x31\xe5\xf9\xa2\x74\x27\x97\xa7\xc3" + "\x33\x13\xdf\x79\x03\x3a\x7c\xc1\xe5\xb4\x69\x7a\xbe\x31\x4a\x57" + "\x6a\x7d\x18\xeb\xc9\xe8\xbe\xaa\xef\xbd\xa8\xbe\xca\x6c\x7a\xe7" + "\x1a\x1d\x59\x6d\xb2\x7d\xe5\xbe\xca\x6c\xca\x61\xbd\xa5\xeb\xc8" + "\x28\x5d\x60\x36\x95\xd7\x47\xda\xb2\x66\x63\x50\xb7\x65\x07\xf5" + "\xa8\xd9\xb8\x87\x75\x14\xca\x6f\xd1\xca\xee\xf5\x98\x3e\xf7\xea" + "\x65\x23\x3e\xa3\xc3\x02\xd9\xdc\xd7\x97\x0f\x99\x3a\xa5\xd9\x80" + "\xb2\x6d\x5e\xe5\x7b\x3f\xcc\x86\x74\xc8\xdf\x48\x96\xb3\xd6\x0d" + "\x5f\x50\x57\xb8\xaf\x68\xeb\xdb\xa8\xd3\xd7\xbc\x3d\xd2\x2e\x3c" + "\x74\x50\xec\xf6\x57\x9b\x57\x44\xd6\x71\x2f\xc2\xf6\x6b\x73\x08" + "\x92\xb6\x0c\xcb\x6c\xce\x6c\x38\x18\x5d\x37\x55\x0f\x73\x01\xd7" + "\x83\xc7\x44\x28\x7f\x2c\xdb\x3d\x7c\x67\x19\xda\x4d\x63\x83\x2e" + "\xf3\xb0\x8b\xae\x38\x23\xed\xab\xbe\x20\xeb\x4a\x6d\xec\xd9\x0e" + "\x7b\xc7\x15\x39\x17\xb3\x64\x5e\x9e\xc5\x56\xba\x76\x43\xf9\x33" + "\x53\x2c\x6b\x37\xac\x2d\x5f\x5b\xb8\x6e\xed\xd6\xc2\xf2\xb5\x1b" + "\x37\x4c\x58\x5f\xf8\x93\xb5\x4f\x5b\x36\x17\x96\x59\xac\x15\xe3" + "\x2b\x46\x52\x38\xe9\x0c\x4b\x61\x59\xd9\x0b\xeb\x8b\x8b\x2c\x1b" + "\xd6\x3e\x3d\xb1\xb4\xb8\xac\xb8\xdc\x52\x58\xba\xf1\x85\x0d\x45" + "\x96\xf1\x45\x59\xe3\xad\xf7\x15\x8d\x8c\x9c\x43\xbb\x23\x85\x7a" + "\x43\x97\x3f\xed\xd9\x7f\x99\x12\x93\x0d\xb6\xd2\xe4\x8a\xb5\x1b" + "\xe4\x9c\x9d\x39\xe1\x0f\x93\x6a\xc8\xc6\x77\x8f\xf3\x5d\xb5\xa2" + "\xda\xdc\x89\xb7\x99\xd3\xa1\x9e\x96\x06\xbe\x7f\xfc\x66\x31\xd6" + "\x5f\x9d\xb0\xdb\x63\x1e\x61\x93\xf7\xc7\x22\x1c\x75\x1b\x2b\x2e" + "\xff\x73\x0f\x6c\x36\x1b\xef\xcd\x6e\xb8\x4c\x63\x5c\x9b\xc8\x8c" + "\x27\x09\x4f\x0a\xdf\x4d\x8e\x3c\xc7\x3c\xe6\x61\x9d\xd2\x7f\xbf" + "\x79\x58\x81\x37\x35\xc3\x22\x5c\x19\xea\x1e\x72\xf3\xb0\xc7\xf5" + "\x79\xe6\x65\x2f\xd2\x32\x96\xcf\x73\xe6\x61\x72\x3d\x71\x27\x64" + "\x99\xe7\x5e\xfb\x7e\x3b\x37\x1b\xf6\xe0\x99\xd6\xdb\x64\xdc\xe3" + "\x3e\x23\x25\x01\x2f\xf3\xf1\x4a\x2b\xbd\x86\xb2\xca\xd2\x85\xf0" + "\x57\x0f\xb3\xe8\xf3\x69\x7c\x27\x3c\xea\xd2\xa9\xea\x91\x60\x92" + "\xf5\x38\x28\x32\x6a\xd2\x80\x5f\x35\xe3\x33\x2c\x57\xaf\x03\xf0" + "\xee\xf4\x98\x13\xf8\x0e\xf5\x14\xc6\x2b\xde\x5c\x1f\xcf\x77\x01" + "\xcf\xd7\x43\x9b\x40\xb7\xef\xa9\x3b\x8f\xf6\xd7\xab\xf6\x87\xfa" + "\x9c\x68\xc0\xef\x7d\x5f\x50\xd2\x5e\xbe\x83\xdb\x79\xbb\x38\xe9" + "\x0b\x92\xbb\xa4\x93\x92\xb7\x08\xaf\xf8\xcf\x9f\xf6\x68\x75\x6a" + "\x65\xdd\xf0\x77\xcf\x76\x9a\xb9\x4e\xe8\x2b\x92\xf8\x3e\xe7\x21" + "\xe6\x16\xcd\xaf\xdd\x2c\x7c\xe2\xed\x08\x9b\xcb\x3c\xfc\x2e\xa6" + "\x09\xdb\x5b\x7d\xe8\xa7\xfc\xd5\xc3\x21\x77\xc3\x4a\x34\xdb\xd8" + "\x27\xfa\x0b\xc2\xb6\x94\x79\x18\xcb\x99\x6f\x08\xd8\x89\x3a\x6c" + "\xbe\xdb\x9b\xf3\x28\xfe\x0f\x7f\x1d\x79\xbc\x11\xf0\x6d\xb1\xf0" + "\x19\x26\x7e\x7b\xf5\x72\xe4\x38\xdc\x3c\x9c\x6d\x02\x2f\x64\x39" + "\xee\xbc\x35\xca\xcb\xa8\x3e\x28\x4e\xbb\x11\xbe\xff\x0a\x99\x91" + "\x16\xfd\xbd\x84\x7f\x0a\x74\x9f\xca\xf0\x77\xde\x4c\xb4\x0b\x69" + "\xfa\xaa\x87\x95\xf0\xfc\x2e\xe2\xd0\xfe\xfb\xae\x99\xb3\xd6\xe4" + "\x79\x46\x8c\x3c\x67\x57\xb3\x4d\x58\x03\xf8\x90\xa1\xfd\x97\xd0" + "\x0f\xe3\x3b\xab\x86\x32\xb9\x1c\xfc\x3e\xc5\xf3\x21\xfe\xea\xc4" + "\x6c\xbd\x3c\x01\xf9\xdf\x17\x52\x73\x30\x9a\x6c\x4d\x70\x57\xf4" + "\xf0\xda\x84\x38\x0e\xfd\xce\x38\xb2\x8c\x21\x4f\xb9\x2e\x53\x90" + "\xf5\xd3\x52\xae\xc6\x50\xa6\xa8\x1e\x1e\x68\x48\x43\x3a\xc8\x55" + "\x3d\xe4\x89\xe5\x0a\x69\x1b\x75\x99\x82\xac\x9d\xe2\x74\xc0\x61" + "\xe4\x91\xad\xd9\x66\xd6\x91\x5d\xe6\x11\x37\xb1\x8c\x89\x37\x16" + "\x77\x8a\x5b\x56\x76\x2a\x3e\x8d\xb8\xc9\x1d\x50\x3c\x08\xd3\x3d" + "\xb1\x27\x82\xee\xa7\x20\xc7\x23\x99\xce\x72\xae\x1a\xe9\x81\xdb" + "\x29\x69\x8b\x6f\x07\x0f\x64\x5f\x95\x78\x9a\xf3\x6b\x34\x3c\x11" + "\xa6\xe1\x08\x6b\x3c\x1a\xc6\xd0\x4e\xde\x19\x2d\xaa\x47\xcc\xe4" + "\xb6\x82\x3c\x45\xfa\x7d\xd1\xf1\x78\x89\x32\xcc\xe6\x1a\x4a\xe4" + "\x32\xda\xc6\xc8\xf4\x35\xf1\xca\x88\x95\xe3\xb6\x46\x22\x9e\x0b" + "\xe7\x7c\x19\x63\x98\xae\x23\x4e\xc4\xe5\xef\xd3\x51\xb8\xc9\x07" + "\xb8\x75\xbe\xa6\xdd\x9f\xed\xaf\x1e\x69\xbe\x1e\x7e\x19\x16\xd5" + "\x2f\xb6\xde\xc1\xf2\x3c\x72\x96\xbb\x96\x88\xc3\xb4\xef\x09\x7d" + "\xe8\x6b\x62\xe7\xf3\x87\x5c\x5f\x30\x8f\xdc\x1e\xb5\xbe\x60\x1e" + "\xb9\x6e\xa8\xf5\x85\x98\x72\x7f\xcd\xe5\x86\x1a\x56\x18\x22\xca" + "\x6e\x0a\xc5\x29\x5b\xcf\x9f\xd5\x18\x31\x7e\x31\xdf\x30\x82\x71" + "\xe8\x40\xbf\x24\xbe\xb3\xc2\x20\x00\xa7\x4d\xda\x12\x37\x24\x2a" + "\x7b\x85\xed\xa0\x91\x3d\x9c\x26\xb6\x1e\x83\x7f\x89\x63\x78\x3e" + "\x85\xae\xc8\x8f\x84\x07\x89\x6f\x7c\xa5\xef\xb5\xeb\xd1\xc6\xa8" + "\xc4\x24\xe2\x7c\x24\x11\xdd\x2e\xd3\x0b\xfc\xa9\x20\xed\xdb\x2b" + "\x3f\xcc\x83\xe9\x07\xe3\xff\x1d\x7f\x23\x14\xbe\x12\x5e\x80\x0c" + "\x5a\x79\x3d\x11\x29\xe6\x5f\x27\xb7\x20\x3d\x4b\xbc\x3f\x1e\xe1" + "\x3a\x56\x24\x10\x59\x12\x65\x62\x21\x82\x2a\x62\xf0\x5b\x44\x7e" + "\x73\x48\xf4\x37\xfe\x4c\x05\x11\x05\xdc\x6e\x2a\x92\x5b\xaa\xbe" + "\x9f\x3d\x18\x64\x6c\x4c\x89\x2c\x32\x85\x1c\x09\xf2\x47\x32\xff" + "\x13\x00\xbc\x4c\xc4\x5b\x32\x07\x13\xdc\xe8\xdb\x11\x91\xfc\xbf" + "\x29\xf4\xc7\x55\x5c\xa7\x8e\x5f\xf7\xef\x7b\x11\xbf\x6f\x57\xaf" + "\x71\xd3\xbf\x41\xf8\xd7\xff\xb3\x9c\x1a\xa1\xff\x0c\x8b\xc7\xb8" + "\xd6\x78\x49\xc3\xf4\xbf\xc3\xa2\x07\x45\x4a\x68\x38\x7e\x7c\x5d" + "\xf4\xf7\x0f\xf2\xa3\xbf\xef\x6a\xfe\x06\x30\x27\x89\xa4\xdd\x93" + "\x0a\x9e\x95\x0f\x06\x26\xc7\x34\x99\x64\x57\x4c\x13\x0a\xff\x69" + "\xd8\x98\x80\x4f\x30\x22\xd8\x1c\x3f\xf5\xff\x9e\xbf\xdb\x76\x68" + "\x0d\xe2\x76\x6f\xca\x35\x91\xb3\x63\xc2\xf8\x7b\x98\x45\x0b\x9b" + "\xfc\xbb\x6b\xd2\xcb\x30\x4b\xc4\xb7\x21\x1b\xff\x34\x42\xfe\x4f" + "\x7c\x13\xb8\x7e\xfb\xf7\xff\xc3\x3f\x03\xb7\x8f\x6f\xff\xfe\x37" + "\xfd\x09\xd5\x8b\x43\x13\xc9\x17\xff\x27\x06\x15\xa5\xd0\x22\x84" + "\x16\x20\xb4\x1f\xdf\x48\x3f\xfe\xed\xdf\xb7\x7f\xdf\xfe\x7d\xfb" + "\xf7\xed\xdf\xb7\x7f\xdf\xfe\xfd\x5f\xf0\x27\xd7\xa0\xa4\x6d\xa0" + "\xdb\x07\x61\x3b\x81\x87\x40\xcf\xd4\xc8\x30\xa3\x81\xc2\x29\x30" + "\xdc\x9e\x46\x86\x44\x1a\x66\xfe\xe6\xac\x3c\xcb\x20\x42\x5f\x31" + "\x83\x15\x0f\xaf\x97\xdf\x8b\xe7\x3b\x11\xe1\xdf\x8b\x9f\xfc\x3f" + "\xe0\xcf\x00\x82\x99\x30\x0e\x4c\xa0\x61\x34\x9c\x12\x69\x04\x8d" + "\xa4\x1b\x28\x89\x46\xd1\x68\x8c\x2f\x53\x28\x95\xd2\xe8\x46\x1a" + "\x43\x37\xd1\xcd\x74\x0b\xa5\xd3\xad\x74\x1b\x30\x1f\x4b\xdf\x8d" + "\x8f\xb3\x83\xb2\xd3\xf1\x0f\xfe\xcf\xa3\x6c\xf9\xbd\xe6\xdb\xf0" + "\xff\xd0\xf0\x56\x2d\xfc\x94\x16\xee\xf9\x36\xfc\x3f\x34\xdc\xf2" + "\x7f\xf8\x3d\xee\xff\xe8\xdb\x00\xd5\xac\xb4\xb3\x21\xae\x4e\x8c" + "\x0d\x35\x68\x7f\x83\xdf\xf4\x25\xf9\xaf\x81\x17\x9d\x3f\xf6\x2f" + "\x1b\xcf\x54\xf5\xd3\x4e\xa4\xe6\x73\x45\xe4\x5f\x70\xa8\x9c\xfa" + "\x5f\x95\x19\x4f\x0a\x9e\xb1\x78\x6e\xc7\x73\x0f\x9e\x69\x3a\x1c" + "\x95\x86\xa7\x64\x3f\x3d\x42\xf4\xc7\x7c\xa2\xff\xe1\xc2\xdb\x47" + "\x74\x66\x02\x9e\x56\x92\x72\xf1\xe7\x35\x44\x67\x1b\xc3\x30\x2f" + "\x4e\x0d\x63\xd7\x9b\xa1\x7e\x5b\xf0\x78\xf9\xcc\x02\x72\x04\xf5" + "\xb4\x2d\x0b\x56\xe4\x58\x26\x67\x4d\xcd\x9a\x3a\xfd\x29\xcb\xc4" + "\x89\x96\x29\x56\xeb\xfd\x93\x26\x4f\x99\x34\x79\xba\x65\xf2\xb4" + "\x19\x53\xee\x9b\x31\x6d\xba\x65\xfd\x96\xd2\xb5\x93\xad\x3f\x29" + "\xb6\x6c\x28\x5a\x5b\x66\x79\x66\x6d\xe9\xfa\xcd\x85\xa5\xc5\x5f" + "\x56\xad\xaf\xfb\xc7\xe8\x7d\x37\x44\x92\x03\xd1\xd4\xbe\x9d\xcc" + "\x37\xe6\x93\x39\x23\x93\xc2\x31\x99\xda\x13\xf7\x6f\xfd\x13\x8f" + "\xfd\x71\xfc\xca\xd1\xbf\x9f\xf3\x93\xf1\xb3\xe6\xbd\xbb\xff\x08" + "\x19\x27\x4c\x27\xe3\xf7\x03\x64\xbc\xb5\x97\x8c\xa3\x8b\xc8\x68" + "\x58\x43\xc6\x67\xd2\xc9\xf8\xe4\x31\x32\x2e\xaf\x21\xe3\x42\x2f" + "\x19\x67\x9c\xba\x36\xac\xbc\x5d\x85\xfd\xdc\x47\xc6\xba\x66\x32" + "\xba\xba\xc8\xb8\xd3\xa1\xc2\x8e\x21\xec\x3f\xb9\xbe\x69\x32\xfc" + "\x3b\xff\xbe\xaa\x9d\x30\xf4\x9f\x39\xa7\xf2\x1b\xc0\xe3\xdb\xbf" + "\x6f\xff\xbe\xfd\xfb\xf6\xef\xdb\xbf\x6f\xff\xbe\xfd\xfb\x0f\xfe" + "\xfb\xc2\x68\xa6\xdf\xc3\x32\xf1\x3b\x13\xd3\x3d\x86\xef\x14\xf1" + "\xbe\x11\xe2\xf3\x50\x94\x28\x7d\xac\x68\x4f\xe4\x9e\x93\xa4\x79" + "\x87\x88\xf8\x4c\xe7\x6b\x07\x85\x97\xcf\x6b\xce\x7f\x8f\xa8\x0d" + "\x96\x23\xef\x63\x01\x9c\x02\x0f\x3d\x9f\xab\xf6\x2c\x09\x1f\xc7" + "\xf3\xbe\x27\x84\x97\x23\xbc\xed\x3a\xfb\x60\xe4\x9e\x2b\x86\x39" + "\x7f\x9c\xc4\xa7\x29\x06\x0e\xc3\x68\xf1\x50\xe9\xcc\xeb\xc0\x48" + "\xd2\xf1\xf2\x19\xc9\xc0\xf0\xfa\x9c\x94\xee\x73\xb6\xde\x84\xbc" + "\x3e\xd4\x29\x53\xdb\x33\xd4\x2b\x9c\x64\x6a\xab\x08\xf2\xd9\x51" + "\x43\x37\x8d\x7c\x07\x6f\x23\xde\xfa\x79\x04\xce\x97\xc1\x30\x90" + "\xd7\xe0\x77\x8e\xb0\x0e\xe6\x05\x6c\x79\xf6\x9b\x46\xae\xf5\x19" + "\x5b\x8d\x2a\x6d\xca\x08\x2d\xad\x11\x69\x0b\xf4\xb4\x2a\xce\xb8" + "\x48\x8b\xbb\x01\x71\x15\xd1\x71\xe6\x6a\x2d\x2e\x09\x71\x35\x31" + "\xf8\x99\xdd\x57\x83\xd4\x4d\x23\x0e\x03\x17\x0b\x9f\x55\xe2\x3c" + "\x5a\xfa\x54\xa4\x6f\x8b\x86\x45\xa4\xc5\xa5\x21\xce\x13\x1d\xf7" + "\x5b\xab\x16\x77\x0b\xe2\x82\xd1\x71\x06\x3d\x5f\xba\xdf\x39\x32" + "\x3d\x4e\x3d\xb9\x7c\x83\x2a\x9b\xeb\x30\x72\x26\xd2\x38\x38\xcd" + "\x0a\x8b\x83\x98\x57\x1c\x77\xbc\x71\xb0\x7c\x4e\xb3\x46\x87\xe3" + "\x41\xfe\x08\x9a\x82\x96\x23\x2b\xf5\xfc\xf3\x2d\x0c\x83\x24\x0d" + "\x19\x8e\x87\x46\xe4\x30\x1c\xfe\xc6\xef\xb1\x5c\x6f\xed\xb7\x85" + "\xeb\x17\xbd\x97\x07\x43\x21\x4a\xc0\x60\x67\x18\x9e\xe1\x89\xba" + "\x0c\x94\xa5\x8b\x90\xfd\x56\xde\xaf\x95\xe5\x0a\x39\x05\xb9\x2b" + "\x02\x64\xb9\x8d\xec\xe7\xe8\x86\x74\xde\x0f\xb4\x6f\x2b\x25\xda" + "\x6d\x22\xc0\xe7\xeb\x3b\xbc\xbd\x64\xf7\x8a\x1e\x3e\xc3\x5e\x75" + "\x89\x12\xf9\xce\xa2\xaa\xe7\x29\xbd\xad\xf2\x93\xf8\x77\xda\xf2" + "\x9d\x40\x63\x39\x6f\x17\x75\xd4\x75\x91\xbd\x2e\x3a\xaf\xfd\xbb" + "\x94\x7e\x92\xcf\xc3\x3b\x29\x99\xf1\x68\xb3\x04\x29\x98\x96\xe5" + "\xaa\x7c\x93\xcc\xf6\x71\x64\x3c\x59\xd4\xaa\xe3\xe2\x61\x5c\x76" + "\x9d\xa7\xc4\x77\x9f\x81\x0c\x9d\x67\x7c\xef\x73\x7d\xb8\x35\x60" + "\x3c\x9e\x9e\x4b\xc7\xd3\xcf\x50\x5b\xfa\x2c\x6a\xab\x98\x4f\xfb" + "\xce\x53\xd2\xf1\xc0\x4c\x6a\x33\x3f\x88\x36\x36\x9f\xdc\xbd\xf8" + "\x6d\x19\x40\x1a\x9f\x3c\xdf\xd1\x4d\x37\x9c\xaa\x79\x96\x12\x3d" + "\x0a\x26\xe8\x7b\xc3\x19\xfd\xac\x02\x7f\xc7\xab\x47\xd9\xad\x94" + "\x0e\xfc\x7a\x80\xcb\xfd\xe7\x28\xe9\xa6\x8c\x74\xb2\x02\xe7\xe1" + "\xee\xda\x20\x99\x2b\x69\xc4\x10\x6d\x6b\x8c\x3c\xe7\x0c\xd9\xac" + "\x3f\x28\x7a\x58\x46\xfb\xb6\xe5\xa3\x9d\x26\xe5\xa2\xec\x5e\x6d" + "\xff\x5f\xaf\xfd\x1d\x32\xf7\x6d\xce\xe7\x7d\xcf\x5d\x88\x2b\xd1" + "\xe3\xf8\xfc\x36\x9f\xcb\x9e\x34\x86\xef\x86\xca\xa6\x8f\xae\xf6" + "\xf0\xde\xc2\x5e\xde\xef\xc9\xf0\x92\x2b\xc8\x84\xfa\x24\x00\x9f" + "\xfb\x1b\x10\xfe\x7d\xa4\x43\xfe\x66\x0f\x1d\x95\x72\x24\x6e\x59" + "\xe9\x0b\xdd\xb2\xf2\x52\xe8\x8d\x95\x7d\xe2\x8d\x95\x5f\x0c\xbc" + "\xb1\xf2\x73\xfb\x16\x4a\x1c\xb8\x65\xa5\xb7\xc3\x26\x79\x90\xd2" + "\x61\xbb\xc0\xfb\x04\x13\xd9\x17\xf7\xaa\xe7\xc1\xfb\xe0\x9f\xf8" + "\x0e\xa5\xf4\x50\xea\xb4\x1c\x77\xf0\x63\x5a\x55\x49\x02\xbf\xf3" + "\xe3\xd5\xaf\x2f\xed\xbe\x53\xaa\x0d\x25\xa2\x4e\xa3\x2c\x1e\xf3" + "\xc4\xdd\x5c\xae\x37\xf5\x81\x53\x78\x4e\xe3\xe9\xc4\x73\x46\xa4" + "\xdd\x77\x06\xb4\xb2\x8f\xde\x61\x20\x3e\x9f\x30\x29\x44\x86\xf3" + "\x34\x6a\x26\xf0\x4f\x19\x82\x6e\x63\x43\xd5\xdb\xd9\xaf\x41\x15" + "\xfb\x35\x60\xdd\xc4\x7a\x89\xf5\x14\xca\xd9\x8d\x72\xda\x65\x5b" + "\x3c\x28\x7c\x22\x6d\xbb\x03\xe1\x3d\xbe\x6d\x25\x06\xef\xb6\x12" + "\x63\x5f\xda\xf6\x9d\x48\x73\xd8\x63\xce\x22\x8d\x86\x3d\x0c\x0b" + "\x6d\xc2\x3b\x2a\x48\x26\xc0\xb4\xfd\xc3\xe5\x4e\xf3\xa1\x83\xe2" + "\x0c\xd2\x9d\x1e\x84\x05\xd8\x80\x03\xfa\x8f\xea\xd1\xc3\x40\xeb" + "\xae\xbd\x48\xc7\xf9\xdd\x81\x6c\xd6\xdf\x1e\xf7\xba\x1e\xde\x9f" + "\x3b\x52\xf4\xab\xf2\x90\x86\xcf\x6e\x7a\x47\x05\x68\x98\xdf\x49" + "\x79\x0c\x9b\xf3\xb1\x3f\x32\xe4\xdb\x29\xec\x25\xd0\x6f\xb4\xd4" + "\x2f\x4a\x0c\x7c\x56\xff\x38\xf2\xab\xb2\x47\xe7\xe9\x38\x72\x19" + "\xf2\xac\x3e\xe3\x09\x79\x38\xbe\x2e\x40\xa3\x6a\xc9\x84\x7c\xcb" + "\x19\x1e\xc3\x82\x1c\x78\x50\xd7\x9d\xc7\xd7\x79\x29\x24\xa2\x60" + "\x7a\x34\x78\x8d\x51\xf0\x10\x2e\x00\x8f\xe5\xaf\x0d\x79\x46\x35" + "\x4a\x78\x8f\xfc\x43\x88\xe1\x05\xc8\x6c\x91\xf8\x3e\xc6\x30\xa4" + "\xcf\x0b\xc0\x6c\xdd\x34\x97\x7a\x29\x39\xd1\x6b\x2f\x31\xc9\x7d" + "\x82\xc8\xff\x61\x55\x4f\x82\xe8\xcb\x37\x8d\x96\x7b\x04\xe7\x12" + "\xfb\xb7\xe8\xa5\xd1\x9f\x8a\xbe\x12\xd3\xa8\x5e\x32\x33\xce\x7c" + "\x4e\x88\xf1\x8c\xe4\xe5\x23\x0b\x1e\x9b\x45\x8f\xcd\x5f\x34\x7f" + "\x16\x2d\x99\x33\x6f\x16\x59\xef\x9f\x68\xbd\xf7\x87\xd3\xef\xa5" + "\xbc\x1f\x3f\x32\x8b\xf2\x96\xce\xa2\xe5\x78\xf2\x96\x2f\x78\x64" + "\xfe\x82\xe5\xb3\x28\xff\xc1\x45\xf8\x9a\x37\x6b\xb2\x75\xe1\xc4" + "\xbc\x79\x8b\x16\xd0\xc3\x2b\xa6\x58\xa7\x4c\xa1\x39\x0b\x72\x27" + "\x5b\xad\xda\x7b\xb2\x95\x93\x3c\x31\x7d\xc1\xf2\x89\x79\xa5\x1b" + "\xcb\x37\x4e\x5c\xba\x68\x1e\x2d\x58\x30\x2b\x2f\xba\xaf\xcd\x1c" + "\xb8\x3c\xc0\x34\xf6\x89\xcf\x72\xd8\x27\x03\xd5\x83\xf7\x78\x7a" + "\xe5\x59\x0f\x4a\xf9\xb8\x9e\x79\x26\x75\x6b\x32\xf7\x57\x66\xbf" + "\x33\xf9\x0c\x68\x97\xcd\xb4\x63\xbf\x08\xdd\x74\xf3\x78\xc4\xdd" + "\xa5\xf5\x1d\x09\x88\x0f\x46\xc7\xa7\x42\xee\x93\x27\xf1\xd9\x01" + "\x37\x1e\xd0\xdb\x07\x1d\x08\xba\x7a\xa9\xcf\x9e\x9f\x20\xcf\x6e" + "\x82\xd7\xbc\xa7\xd6\xef\x4c\x99\x1e\xd1\xd6\xbb\x78\xef\xad\x65" + "\x2b\x99\x2e\x52\x4a\x6a\x47\x79\x36\x9f\xaf\x21\x77\xb9\x06\xe3" + "\xd2\x20\x8c\x91\xda\xf9\x4f\x4f\x3d\xef\x6b\x56\x70\x1c\x11\x7a" + "\xc1\xc3\x70\xf6\x21\x4e\x83\xf5\x68\x07\xf4\x03\xf4\xf7\x5b\x21" + "\x7b\x26\x89\xb4\xac\xda\x50\x7f\xa6\xec\x13\x90\xaf\x45\x97\xe7" + "\x7d\xbc\x67\xd6\x86\x74\xef\xe6\x18\x78\xcf\xa9\xdc\x7f\x4a\xc9" + "\xec\x83\xc1\x17\xaa\x7e\xc0\x23\xcf\x46\xcb\xb0\x54\xb3\x48\xc3" + "\x77\xf5\x03\x67\x85\x5d\x9d\x97\x46\x58\x02\x87\x81\xd7\x26\xe9" + "\x6b\x64\x9b\x0c\x37\x21\x7c\x0b\xf0\xeb\x1c\xe0\xfc\x9f\xc9\xfc" + "\xc3\x11\xf6\x38\xd2\x9e\x0d\xa5\x3d\x70\x0e\xb2\xc3\x61\xb0\x13" + "\x6e\x9e\x0f\x78\xff\x93\xcf\xaa\x8b\x94\x63\x0e\xfc\xee\x6a\xdd" + "\xda\x2b\xfd\xbe\x7b\x10\x17\xb2\x03\x66\xff\x60\xf9\x99\x9c\x17" + "\x65\x99\xfd\xfd\x25\xe8\xe3\x52\x95\xbf\x37\xc6\xe7\xb3\xc1\x34" + "\xe9\x5c\x26\xb7\x6b\xf0\x62\x2a\xf8\x34\xc2\xef\x4c\x6d\x8a\xe1" + "\xd3\x31\xc0\x39\x0b\xba\x77\x02\xc6\x98\x50\x1f\xca\xc0\x37\xe0" + "\x1a\x35\xb8\x3a\x0c\x9f\x92\x83\xd4\xae\x18\x39\x18\x01\xd8\xb3" + "\xc2\xf1\x69\xe6\xe8\xf8\x9b\x2e\x20\x7e\xae\x16\x8f\xf6\x95\x96" + "\x11\x1d\x9f\x96\x8d\xf8\x07\x51\xbe\x0f\xed\xc7\xe4\xa1\x94\xe6" + "\x7a\xb6\xff\xc2\xe9\x57\xc4\xa4\xb7\x21\xfd\x43\xbc\x2f\x9e\x75" + "\x3b\xa7\x6f\xd0\x64\x15\xe9\x13\x91\x7e\x57\x4c\xf9\x27\x91\x7e" + "\x79\x04\x7e\x31\xf5\xbf\x71\x1d\xe2\xf3\x59\xb6\xf0\x2e\x42\x9a" + "\xe1\xdc\x66\x59\x5f\xf0\x8d\x9a\x48\x7f\x3a\xa6\x7c\x4e\xf7\x5c" + "\x48\xa7\x51\x1f\xd3\x28\xa5\x59\xb3\x45\xce\x28\x1c\x6e\x4c\x8c" + "\x29\x23\x13\x79\xca\x20\x3f\x67\x75\xd9\x88\x93\x67\x66\x4c\x9e" + "\x02\x29\x5b\xaa\x1c\x8d\xc7\x2a\x8f\xa6\x8b\x22\x61\x70\xdd\x60" + "\x1f\xdd\xe8\x88\xa9\x7b\x01\xca\xdd\xb6\x57\xb5\xf3\x1b\x20\x13" + "\x53\x10\xb6\x04\x30\x3f\x61\x39\x62\x59\x77\x7b\x03\xd0\x95\x39" + "\x49\xaa\xcf\xbf\xf1\x6c\x72\x25\xf1\xef\x89\xfc\x9b\x61\x8b\xfe" + "\x5c\xad\x0d\xdc\x78\x16\x6f\x0e\x97\xfe\x97\xb8\xed\x89\xfe\xc5" + "\x21\x05\x73\x4c\x02\xda\xa8\x11\xdf\x03\x5a\x19\x0b\xf8\x5c\x31" + "\xf0\x3f\x07\x3d\x4c\x7c\x36\x1a\xe1\x53\x11\x3e\x4b\x8b\x9f\xc6" + "\xe9\xf1\x7b\xb2\xf6\x9b\xe5\xf6\x9c\x26\xb7\x68\x07\x37\x4d\x94" + "\x65\xcb\xb6\xa0\xf2\x87\x94\xdc\xcf\x43\xdc\xad\x78\x2f\xc2\x3b" + "\x01\xef\x87\x51\xf6\x59\xf6\x05\x61\x1f\x80\xdd\xa1\xbe\x4f\xe2" + "\xfd\x08\xde\xbf\xc6\x7b\x39\xde\xef\x71\xbb\xf5\x6e\x2e\xa1\x18" + "\x99\xe9\x0d\xa9\xb6\x3a\x5c\xf1\x70\x4c\x8d\xd6\x7e\x54\xfb\xfd" + "\x2c\x1c\x26\x54\x98\x51\xd1\x5c\x0b\xeb\xcf\x61\xba\xe4\x01\xbe" + "\x8d\xcb\xd7\xda\x7d\x82\xe2\x93\x4a\x13\x52\xf9\xcc\x8a\xdf\x5a" + "\x98\x4a\x67\x88\x2c\x13\xef\xf9\x55\x3e\x21\xf0\xb6\x4a\x3f\x12" + "\x74\xd3\x54\xd0\xc4\x8c\x6f\x33\xd3\x49\xa6\x97\x70\x6f\x6c\x8c" + "\xe0\x37\xec\xf1\x9b\x6c\x31\xfc\x6e\x02\xbf\xf7\x4a\x7e\x83\x76" + "\x3a\xce\x8c\x3f\x64\x9a\xfb\xb6\x61\xba\xdc\x40\xbe\x7b\xc3\xba" + "\xfb\xa6\x96\x68\x38\x29\xcd\xa2\x7a\xf6\x0a\x94\xa7\xce\x0d\x02" + "\x9e\xa9\x92\x65\xf4\x26\xd8\xff\x27\xcf\x48\xbb\xa9\xfa\x81\x6e" + "\x86\xe3\xb3\x4b\xbf\x3b\x3e\x93\x8d\xdb\xd6\xcd\xa4\xc7\xcb\xb8" + "\xd4\x2a\xa9\xb3\x4d\xeb\x64\xdc\x58\x0f\x44\x4b\x8f\x23\x75\x9e" + "\xcb\x67\x2a\x97\x71\xd3\xc3\x70\xb3\x5a\x34\xb8\x26\xb6\x37\xd8" + "\x6e\x40\xff\xdd\x83\x34\x18\xff\x8c\xca\x1f\xd2\x97\x92\x2b\xab" + "\x19\x42\x63\xbc\xdb\x41\x09\xee\xe0\x69\x5a\x16\x14\x03\x13\x1d" + "\x34\xc2\x1d\x3c\x4c\x77\x11\xa5\xba\x83\x67\xe8\x6e\xa2\x71\xee" + "\x60\x0d\xfa\xe7\x26\x8e\xff\x28\x93\x0c\x06\xbc\xed\x77\x3a\x8c" + "\x06\x77\x70\x17\x65\x38\xcc\x78\xaf\xa3\x07\x13\x84\xdf\x1d\xcc" + "\x45\xba\x22\x5a\x36\x20\x3e\x9b\x9f\x20\xfe\xb2\x7a\x80\x52\x72" + "\x5f\x14\x76\x77\x10\xb6\x72\xf0\x04\xc2\x43\x62\xd9\xc0\x15\x3c" + "\x7e\x11\x72\x65\xb5\x2c\x1b\xf8\x4c\xcc\x7b\xf1\x23\x7c\xff\x45" + "\x08\x23\x09\x77\x70\x26\x75\xf8\x7c\x48\x67\x17\xe2\x40\x56\xf3" + "\xaa\x4b\x46\xea\x67\xff\x47\x07\xb2\x5a\x50\xc7\xf6\x7e\xd4\x0f" + "\x7d\xd0\x3f\xf5\x6f\xc3\xbb\x3a\xeb\xbf\xc8\x6f\x57\x56\xa7\x48" + "\xc9\x6a\xcf\xc2\xc0\x83\xeb\xe0\x0e\x76\xd1\x6a\x98\xce\xcb\xb6" + "\x78\x05\xe3\x3f\x7a\x07\x8f\x3b\x66\xb2\xef\x84\xe4\x65\x5b\xec" + "\x02\x71\x89\x22\x35\xab\xdd\x1d\xec\x25\x94\xd1\x09\x78\x1f\x4b" + "\x78\xae\xac\x00\xd2\x7a\x39\x5d\x24\x1c\x86\xc1\x69\x97\x0d\xb0" + "\x3f\xab\xac\x40\x7f\x6a\x56\x4f\x7f\xea\xa4\x44\x3c\xd3\x45\xda" + "\xa4\x87\x84\x73\xcc\xef\xf8\xfc\xab\x70\x4d\xca\xc7\x77\x89\x9f" + "\x7d\x35\x31\x2d\x07\x68\xb8\x38\x30\x29\x1f\xf2\x33\x1f\x72\x08" + "\x7c\x27\xed\x96\xf8\x56\x4f\x7a\xd9\x2f\xeb\x31\xe9\x25\x55\x8f" + "\x49\x2f\x72\x78\x1f\x64\x0a\xbf\x9b\xfb\x54\xdc\x2f\x90\x6f\x85" + "\xcc\xe7\x9a\xd4\x2c\x52\x26\xb5\x04\xd0\xbe\x40\x57\x07\xd3\x11" + "\x74\x75\x30\x2d\x01\xbf\xd9\x5d\xb1\x87\x44\xea\xa4\x16\xe0\xd3" + "\x8e\xfc\x7f\xec\x97\xfd\xf4\xa4\x1e\xbf\x82\xfd\x57\xc0\x29\x80" + "\xfc\x9a\x00\xa3\x07\xb0\x02\xfd\x4e\x0b\x2d\xdb\x22\x02\xcb\x82" + "\x3b\x82\xab\xb7\x90\x69\x02\x39\x0c\xec\x3b\xd7\x5d\x51\x84\x7a" + "\xb6\xe1\x3d\x1f\xf1\x74\x23\xca\xfa\x08\x70\x7b\xb8\x3c\x94\x13" + "\x00\xcc\x4b\x80\x55\xc4\x38\x5d\x61\xbf\xa4\x69\xd6\xc4\x2b\x12" + "\x3f\x6b\x66\xc8\x65\xcd\x09\xa5\x58\xa7\xeb\x32\xc4\xf2\xa3\xe8" + "\x56\x43\x4b\x7d\x22\xe8\x0e\x1e\x22\xc8\x58\x4a\x87\xef\x0c\xc7" + "\x63\x6c\x70\x18\x7c\x66\x99\xda\x85\x77\x13\xb1\xfc\x74\xd8\x5e" + "\xe0\xb4\x1f\xb1\x0c\x2d\xb5\xf9\x76\x4c\x24\x9b\x01\xdf\xf6\xd5" + "\xc1\x44\x5a\x65\x33\x3b\x06\x5c\xd6\xf4\x0e\x1b\xf3\xe5\x34\xf2" + "\x70\xbe\x75\x94\x6c\x80\x7d\x6c\x10\xc1\xe4\x0a\xaf\x79\x54\x89" + "\x5d\x74\xf8\x72\x91\xd6\x26\x7d\x01\xb3\x1c\x71\xfa\x25\xbd\xc2" + "\x33\x90\x62\x6d\xe7\xba\x89\xd1\x0e\x3a\xd9\x3b\x8d\x78\x8c\x72" + "\xb2\xb7\x89\xe5\x34\x24\x52\xac\xb5\x90\xd1\xfe\x25\xbd\x8e\x84" + "\x55\x97\xc8\x80\xb0\x81\x93\x25\x87\x11\xdf\x86\x74\x27\xa4\xdc" + "\x2e\xbd\x14\x4c\x0e\xa6\x58\x13\x83\x2e\x6b\xf3\xd2\x4b\xfd\xe2" + "\x64\x49\x0d\x3d\xd9\xeb\x00\xad\x0e\xd3\x92\x0b\x41\x53\x87\xad" + "\x08\x69\xfc\x08\x6f\x92\xf2\xbf\xe4\x42\x9f\x58\xfa\xbc\xf8\x6c" + "\xe9\xa5\xbf\x88\x25\x25\xe2\xa3\xd5\x15\x34\xfa\x86\x1d\x22\xc4" + "\xed\xe2\x44\xd7\x61\xba\xe1\x0c\xfb\xc6\x99\x4f\xb9\x85\x21\xb1" + "\xe4\xc2\x67\x62\xd5\xf3\x4c\x9b\x99\x74\xb2\x04\xed\xa7\xa2\x06" + "\xf4\xb6\x66\x9e\x2c\x39\x86\xf2\xe7\x03\xae\x5d\xf0\x5d\x5f\xb9" + "\x85\xad\xc9\x4f\x5e\x48\xa1\x13\x5d\x35\x14\x4c\xb5\x26\x0e\x1c" + "\xb0\x62\x2c\x65\x9d\x1e\x3a\x60\xcd\x11\xa9\xd6\xda\xe0\x01\x6b" + "\xf3\x40\xaa\x15\x32\x30\x39\x1d\x7c\x1a\xc1\x3c\xbf\x8a\x31\x3b" + "\xbe\x6f\xbe\xca\xfc\x77\x4d\xce\x14\x29\x93\x73\xa0\x1b\x85\x92" + "\xfd\xc9\x99\x3c\xee\x16\xa9\x93\x73\xfa\x53\x27\x4f\x47\xba\x1c" + "\xd5\xbe\x26\xe7\xb3\x5c\xca\xbe\xa9\x7a\xf2\x8f\xd1\x97\x98\x10" + "\x5f\x82\xa7\x02\xcf\x6e\x84\x75\x02\x7e\xaa\x5f\xc1\xec\x14\x0f" + "\xb8\x60\x67\x5e\x62\x99\xb4\x03\x56\x60\xd9\xc0\x74\x3b\xe8\x88" + "\xb6\x32\xb9\x33\x74\x60\x72\x8f\x48\x9b\x92\x1e\x90\xf2\x3f\xe5" + "\x16\x86\xdf\xbf\x2d\x93\xc7\xe4\x66\x71\x60\x4a\x26\xc2\xde\xf2" + "\xb3\xbc\xa6\x4c\xa9\x0d\xa5\x4c\x09\x08\xd7\x94\xe6\xc5\x2f\x0a" + "\xef\x80\x6b\x4a\x7b\xc8\x35\xa5\x25\x38\x0c\x36\x6c\xc5\x31\x62" + "\x1d\x15\xfc\xad\x10\x7c\x77\x53\x87\xad\x49\xca\x80\xbb\x02\xed" + "\x60\xcb\x6d\x8e\x93\xbd\x90\x07\xdb\xaf\xa4\x7e\xea\xf0\x9d\x96" + "\x74\x15\xa9\x53\x6a\x59\xae\x98\xc7\xab\x6c\xe4\x40\x59\xcd\xa1" + "\x03\x53\x5a\x06\x0e\x00\x6e\x2a\xca\x49\x9b\x36\x23\x20\xdb\xec" + "\x34\xc8\xec\x31\xe4\xf9\x03\x29\x39\x9f\x36\x7d\x28\x3d\xc9\xfa" + "\x8a\x75\xd4\xb2\x60\x80\xe5\xe6\xaf\xac\xdb\x94\xae\xa2\xd5\xba" + "\xae\x62\x3d\xc5\xe3\x02\xd6\x55\x21\x4d\x57\x85\x34\x5d\x25\xbf" + "\x53\xa0\x6f\x5c\x59\xed\xac\x93\x96\x55\x28\x5d\xb3\x6c\xc0\x2a" + "\x20\x1f\x49\x80\xd1\xae\xf8\x81\x34\xd5\x59\x1f\xcb\xf4\x92\x4e" + "\x59\x81\x10\x74\x4e\x08\x3a\x27\xa4\x74\x4e\x8e\xa6\x73\x8c\xba" + "\xce\x61\x1f\xa7\x68\x57\xa1\x78\x3a\x27\xa4\xe9\x9c\x01\xa1\x74" + "\x4e\x48\xd3\x39\x1c\x3e\xa0\xe9\x9c\x81\x38\x3a\x27\xe4\x9a\xc4" + "\xf5\x35\x69\xba\xc6\xc1\xba\x86\xeb\x1b\x3a\x30\xa9\x25\xa4\x74" + "\x4d\x27\xc6\x04\x46\xd6\x35\x03\xc8\x13\xd2\x75\x8d\x5f\xe6\x0f" + "\xb0\xbe\xe9\x7f\x89\xa0\x43\x2d\xc4\x7a\x46\xea\x94\xe0\xb8\x20" + "\xeb\x14\xd0\x6f\x76\xac\x4e\x11\xd5\x56\xf4\x95\x94\xa2\x74\x95" + "\x75\x7a\xf2\x0e\x11\x84\x4e\x49\x5f\x56\xe1\x23\xbe\x67\x3a\x39" + "\x08\xdd\x5d\x51\xee\x70\x57\x04\x09\xba\x20\x47\x74\x38\x08\x7a" + "\x07\x32\x3c\x00\x7d\x41\x84\xb6\x59\x8b\x36\xda\x0e\x7d\xd4\xdc" + "\x61\xfb\x98\xd0\xe6\x13\x97\xf4\xf6\xb9\x57\xf9\x32\x53\x96\x5c" + "\x10\x5e\xd0\xc7\xb3\xca\xe6\x80\x8e\xc9\xf4\x9e\xec\xfd\x0d\xe5" + "\x76\x89\x50\xee\x1a\x8f\x05\x6d\xad\x79\xc9\xda\xd6\x64\xbe\xc7" + "\x69\xe9\x25\xd1\x0a\xdd\xf8\xff\x2c\xb9\x90\x92\x5c\xd0\x45\xdf" + "\xcb\x2d\x14\x21\xb4\x29\xd0\x1d\x6d\x0d\x6d\x12\xed\x6c\x3a\xda" + "\x5d\x0e\xda\x5a\x6d\x30\xa6\xad\xa1\xdd\xdc\x8c\xdf\x16\x45\xbf" + "\xc9\x39\x68\x6b\x99\x21\xd9\xa7\x75\xc9\xb1\x18\xda\x43\x0e\xcf" + "\x55\xa1\x8d\x64\xa2\x5d\xc8\xf6\x16\x52\xf9\xf2\x43\x4c\x3f\xa3" + "\xd6\xde\xc0\x0b\xc4\x97\xe0\xa9\xc0\x13\xbf\xbd\xd9\x62\xda\xdb" + "\xf3\x5a\x7b\x4b\x55\xed\x0d\x7c\x35\x0d\x6c\x53\x6d\x8e\xcb\xe0" + "\x31\xdb\x60\x9b\x4b\x9b\x52\xcb\xbe\x7e\x94\xfc\xc8\x76\x87\xfe" + "\x65\x4a\x3b\xda\x5c\x0b\xda\x1c\xe0\x09\x2f\xeb\x4f\xc8\xe7\x9f" + "\xb9\xcf\x5b\x6a\x13\x7f\x5e\x3d\x70\x9b\x03\x6d\xaa\x1d\x3a\xed" + "\x2f\xd0\xa7\x7f\x5e\xe5\xa3\x46\xc0\xaa\x45\x5b\x6a\x46\x9b\x6a" + "\x41\xdb\xe2\x36\x35\x7d\x60\x1b\xc3\x9c\x36\x7d\x10\x86\xec\x33" + "\xa3\xdb\x94\x9a\xe9\x8e\x3f\x5f\xe8\x77\xde\x9e\xe4\xa1\x33\xf2" + "\xdc\x35\x7e\xa7\x7b\xe8\x4f\x87\xb5\xdf\x19\x1e\xfa\xad\x0c\xe7" + "\xb6\x68\xab\xa2\x9b\xce\xd3\xed\x9d\x90\x7b\xc2\xef\x24\xfc\x3e" + "\xb3\xec\xae\x8f\x60\x53\xbc\x0f\x9b\x42\xf8\xb9\x3d\x0a\xe7\x54" + "\x8c\x43\x28\x1b\xf2\x98\x28\xfc\x99\x49\x22\x6d\xce\x79\xd1\x9f" + "\xce\x73\x52\xc9\xf8\x1e\x0d\x1a\x64\xe0\x9d\x76\xe8\x32\x8d\xc1" + "\xc3\xbe\x9e\x1d\x6c\x5f\xe1\xb7\x55\x6c\x4e\x1f\xb9\x6f\x13\x4d" + "\x48\xf6\x29\x9f\xee\xc9\x3b\x52\x78\x6e\x66\x0c\xff\x16\xce\xdf" + "\x07\x1b\x2e\xeb\x7e\xdd\x51\x5e\x9c\x3b\xb1\x07\xfc\x4c\x87\xac" + "\x66\x1d\x17\xc6\x0d\x78\x7e\x17\x78\xf6\x3e\xba\x25\x9b\xf8\x0e" + "\xb3\x78\x7a\xc6\xef\xb4\x0c\xd6\x7f\x88\xf8\x09\x3a\x4d\x86\x88" + "\xcf\xd5\xe9\x34\xd4\xf9\x56\xee\xaf\x07\x36\x89\x5e\xf6\xc9\xc1" + "\xe7\x70\xed\x41\xf1\x3f\xd9\xbf\x7b\xd5\x00\x25\x2e\xab\x08\x08" + "\x77\xaf\x68\xe5\xbb\xd0\x1a\xd8\x4f\x48\xa5\x08\x85\x52\xe7\x9c" + "\x10\x07\xe6\xb4\xf7\x6d\x12\x41\x9e\xfb\x40\x19\x47\x3c\x34\xaf" + "\x59\xf1\xc2\x9a\x29\xc7\x80\x29\x73\xd8\xd7\x60\x2a\xc3\x3a\x89" + "\xfc\x03\x07\xe6\x9c\x42\x3a\x8c\x8d\xcf\xfb\x64\xba\x14\x6b\xa6" + "\x6d\x2b\x7d\xe7\x3c\x8d\x4b\x91\xe3\x00\xd7\x1c\x0f\xeb\x05\x84" + "\xa5\x20\x6c\x2c\xe0\x77\xf9\x9d\xe3\x12\x3d\xf4\xff\x06\x95\xad" + "\x3b\x6e\xac\x9e\xce\x43\x16\x3e\xc1\x19\x35\x77\xaa\xed\x96\x70" + "\x44\x9d\xf3\x32\x50\xf4\xa9\x35\x2e\x29\x3b\x7e\x74\x58\xaf\x5b" + "\x9b\xd9\xbf\xa6\x7d\x3b\x8d\x05\x7f\x18\xbf\x03\xf6\x0a\xd1\x2d" + "\x9c\xe3\x32\xdf\xdd\x1a\xc0\x18\x62\x5c\x9d\x87\xfe\xa6\x7c\x28" + "\x7a\x86\x2e\x8b\x2e\xc0\xc8\xd9\x8f\x71\x20\xd3\x87\xe9\x89\x76" + "\x13\x02\x1d\xce\xb2\x5e\x6a\xd8\xc4\x63\xe1\x71\x1e\x9d\x5e\x43" + "\xf3\x64\xce\x19\x35\x5e\xbc\x23\x5b\x38\x05\xb5\x7e\x8f\xd7\x1a" + "\xee\x98\xa3\x68\x30\x79\x7a\x1f\x74\x09\xcf\xa5\xb2\x2f\xcc\xb2" + "\x74\x11\xf0\x3b\xef\x98\xea\xa1\xbb\x4f\x69\x73\x36\x3e\x77\x70" + "\x01\xeb\x97\xb8\x7d\x97\x3c\x93\x3c\x08\xff\xfb\x6b\x3a\x40\x59" + "\xa5\x9f\xaa\xe6\x57\x29\xfe\x07\x18\x2e\x9f\xa9\xef\x42\x7c\x99" + "\x4f\xc0\x4e\xac\x9a\xce\xe3\x0c\x3e\xdf\x8b\xb0\x42\xc8\xb5\x68" + "\x2d\x65\x9c\xbe\x5f\xd8\xfa\xbd\xab\xd4\x8d\xf1\x20\x9f\xa1\x57" + "\xf3\x37\xdf\xcf\x3d\x5e\x4e\xda\x9c\xd0\x1d\x27\x3c\x34\x71\x9d" + "\x8e\x17\xdb\x1a\xa0\x6d\x22\xdb\x1e\x6c\x73\xf0\xfc\x7c\x59\xa5" + "\x08\xb0\xed\x81\xb4\x01\xbd\x0e\x5c\x3f\x55\xaf\xef\x27\x45\xd6" + "\x0b\x38\x78\x31\xb6\x96\x34\x28\xdb\x42\x89\xd2\x37\xdf\x00\xcf" + "\xef\x2f\x90\x75\xe1\x3a\xcb\xba\x48\x3d\x8b\x7e\x22\x38\x0d\x63" + "\x29\x19\x9e\x03\x58\xf9\x1e\xba\x47\xf9\x70\xa0\x3b\x4e\xc4\xca" + "\x50\xd8\x9f\xec\xa4\x80\xfd\x0a\x7d\xcf\x1e\x12\xe7\x00\xf3\x13" + "\xd0\xc9\xc4\xef\x10\xdb\xdb\x01\x96\xdd\x85\x6d\xdc\x2f\xbb\x2b" + "\x2f\xb1\x9d\xcd\x69\x6f\x44\xda\x2e\xa4\xf9\x58\x4b\xfb\xb1\x5a" + "\x9b\x91\xef\xe1\xfc\x46\xdf\x78\x09\x78\xf4\x7a\x65\x9f\x5f\x45" + "\xfa\xb7\xc0\x37\xde\x4d\xe2\xc0\xc2\xb6\xf8\xb8\x4c\x09\x70\x9f" + "\x36\x70\x59\xf4\xa2\x9c\x5b\x58\x8e\xec\x5b\xe8\x56\xc8\xe4\xd9" + "\xaa\xed\x74\x13\xcb\x98\x48\x9d\xd3\xa3\xe8\x9e\x31\x5d\x38\x61" + "\x83\x42\xa3\xda\x36\xd1\x77\xd0\x86\x3c\xe7\x29\x63\xc9\xea\x4a" + "\x0b\x70\x25\xda\x7f\x91\xd8\x4e\xf9\x0b\xd2\x77\xf1\x3d\x96\x0d" + "\x17\x59\x16\x33\xd6\xe9\xb2\x88\xdf\x15\xd7\xd3\x15\xa0\x6b\x85" + "\x9a\x57\xc8\xf8\x84\xe7\xe2\xcf\x51\xc6\x29\xae\x2f\x1e\x03\xc2" + "\x7e\x27\x2e\x8b\xb1\x42\xf5\x6b\x25\x1e\xca\x08\xe2\x5d\x21\x1f" + "\xe8\x12\xed\xbb\x04\xe9\x8e\x88\xcb\x03\x9c\x06\x65\x65\xb4\x0b" + "\xa7\x81\xdb\x49\x1d\xca\xf6\x79\xe8\xc1\x56\xc5\x9b\x8c\x56\x86" + "\x35\x04\x0e\x25\x42\x9e\x6f\xff\x02\xf5\x1d\xff\xa4\xa5\xca\x00" + "\x3c\xc6\x4b\xbf\x62\x0c\xab\xc1\xa8\x74\x76\x08\xb8\xd6\x3b\x43" + "\x25\xd0\xcf\x25\xa1\xea\x87\x76\xcb\xdf\x5a\x9c\xd0\xfa\xd2\xf8" + "\xf0\xab\xe6\xb3\x8f\x8e\x2e\x1a\xdf\xa2\xe0\x54\x4d\x6f\xbd\xed" + "\x3c\x7f\x4b\x7f\x6c\xbe\x94\xc5\xbb\xdd\xb5\xd9\xca\xef\x32\xd2" + "\xa8\x71\xfe\xf8\x5f\xf7\xa1\x0c\xbf\x73\x3c\xc6\xdc\x59\xcd\x6a" + "\x5d\x62\xf1\xee\x21\xda\x5e\x0a\xb7\x1d\x6e\x73\xaa\x4d\xff\x60" + "\xef\xc9\x46\xd9\xfe\xf2\x21\xf3\x15\x9a\xfe\xe5\x39\x98\xa4\x73" + "\xf4\x83\x3d\x27\xd3\xa5\x7c\x1b\x85\xf1\xce\xf4\x28\x9f\xad\x88" + "\xbb\xf6\xb9\x33\x17\x4f\x01\x9e\x12\xed\x1b\xa9\xef\xdc\x8d\xa7" + "\x13\xdf\x95\x92\x76\x6f\x17\x19\x3c\x88\xeb\x83\xed\xce\xdf\x1e" + "\xba\x73\x85\x78\x3b\xc3\xa8\xff\x6e\x78\x93\xe7\x11\xee\x04\xbf" + "\xc6\x27\x2a\x5e\xfc\x40\xfa\xad\x07\x6e\x4c\x77\x61\xaf\x15\x81" + "\xb6\x2a\x1f\xf0\xbe\xf3\x48\x5b\xad\x8f\x2c\x77\x72\xfd\xef\x3c" + "\xca\x75\xf2\x81\xfe\xfc\x2e\xab\x15\xde\xe3\x75\x41\xe2\x35\x2c" + "\xc0\x42\xfb\x7f\x79\x8f\x9a\x93\xa8\xb2\x31\x3c\x4d\x26\x84\x5e" + "\x7f\x45\xe7\xc5\xbb\x2d\x9b\x0c\xfc\x7d\x6b\xbd\x9c\x77\x99\xbd" + "\x22\x3c\x1f\xfc\x83\x54\xb4\xf3\xd9\xec\xbb\xf9\x22\xfd\xe0\x51" + "\x01\x5a\x1f\x2f\x91\xbe\x21\xbd\x3c\xff\x52\x2f\xe7\x35\x7e\x00" + "\xfd\x37\xbe\x44\xf3\x83\xe3\x95\xba\x06\x30\xf7\x21\x0e\xfd\x51" + "\xef\xc9\x92\x00\x0d\x70\x9d\x91\xf7\x37\x97\x03\x66\xf6\x5d\x5d" + "\xc5\x77\xca\x00\x0f\x01\x5e\x29\x5d\x76\x67\xcf\xf6\x0b\x22\xa0" + "\xd7\x99\xd7\x3a\x01\x77\x8f\x87\x5c\xb5\x43\xb6\x89\xc1\x7a\x64" + "\xbe\x7f\x3c\x43\xf1\x31\x04\x5a\x45\xf3\x31\xb3\x59\xf1\xf0\x07" + "\x67\xa2\x79\x98\xd9\x8c\x07\xb9\x32\x67\xe2\xc9\xd5\xbe\x23\x9f" + "\x94\x88\xdf\xe0\x6b\x66\x8d\xdf\x99\x39\x16\xed\x63\x97\xe2\x4d" + "\xa6\xf2\x91\xcf\x72\xf3\x39\xfa\x9e\x7e\xf6\xf7\x7d\x81\x38\x9c" + "\x65\x9c\xc3\x43\xb0\x6f\xf0\x6d\x45\x7c\x0a\xb7\x5f\xf6\xb3\x19" + "\x19\x3f\xe8\x4f\x89\x32\xa5\x8f\xac\xe4\x1d\xbb\x77\xb3\xec\x22" + "\xcd\xd4\xe4\xe0\x6e\xc8\x74\xe6\x1e\x9d\xae\x08\x2b\xe7\x78\x96" + "\x53\x84\x37\x81\x2e\x52\x57\xf8\x30\x16\x8c\x6f\x7b\x64\xb6\x0f" + "\xda\x68\x29\x93\x3b\x99\x97\xbd\x74\xd7\x69\xe8\x31\xe8\xef\x87" + "\x1c\xaa\xff\xb9\xeb\x63\xfe\x86\xfe\x3c\x8b\xdf\xa7\x4e\x42\x4f" + "\x5d\xad\x7e\xe0\x54\xbf\x91\x86\x5f\x35\x52\x76\xb0\xfa\xfd\x33" + "\xc1\xb4\xfb\xce\xb8\x7b\x8e\x52\x47\xf0\x3f\x11\xdf\xdf\x0a\x18" + "\xff\xcc\xfe\x5e\xed\x5b\xc4\xc0\x87\x57\x9b\xcd\xee\xe0\x67\xad" + "\xd2\xb7\xba\x3a\x3f\x6f\xf8\xe9\x39\x58\x01\xab\x24\x6c\x8d\x3e" + "\xef\xb7\xec\x7b\x46\x04\xf7\x75\xb3\x0f\x98\xf4\x91\x7b\xaf\xd2" + "\x84\xb7\xb6\x92\xb5\xee\x2a\x65\xd4\x5f\xa5\x4c\xf1\x57\xbe\x73" + "\x27\x7c\x4f\xcf\x68\x1b\x25\xd6\x6f\x85\x3d\x17\x24\xc3\xc0\x01" + "\xd8\x73\x41\xd8\x73\x9f\x65\xb2\xbe\x1c\xb4\xe7\xfa\xa5\xad\x3c" + "\x77\x85\xf4\x09\x7e\x60\xee\x8a\x51\x25\x64\x48\x5a\x43\x29\xc0" + "\xcf\x7e\x91\xee\x1a\x91\xd4\x05\x5b\x12\x75\xf6\x68\xf5\xc5\x7b" + "\x6c\x72\x09\x0d\x97\x75\x85\x0e\x17\x07\x1e\x72\x0c\xd9\x37\x1b" + "\x59\xa6\x7c\xdc\x96\x50\x87\xbb\xc7\xf1\x5a\xeb\xd1\xdb\x02\xe6" + "\xb2\x3a\x11\xe0\xf0\xf2\x71\x22\x80\xf0\x44\x2e\xfb\x08\xc2\xfd" + "\xce\xbb\xad\x1e\xf3\xdd\x43\xda\x80\x18\x37\x69\xba\xe6\xee\xbf" + "\x15\x46\x07\x64\x74\x4a\xfa\xf6\x20\xec\xf1\x8b\xdc\x8e\xef\x3e" + "\xb2\x6c\x9d\x08\x5a\x36\xf0\xba\xf7\xdd\x8d\xbc\x26\xcf\x6b\x71" + "\x7f\x03\x5b\xe7\xcb\xd6\xe1\xb9\x0f\xe1\xf1\x43\xf2\x3a\xc0\xac" + "\x9e\x92\x2e\x30\x6e\xff\xaa\x76\x3d\xef\x05\x79\x4d\xee\x3b\xb9" + "\xbb\xd7\x43\x8f\x65\x6b\x7e\x5d\x7b\x95\x3e\xbd\xe7\x84\x0f\x34" + "\x88\xd6\x01\xf7\x34\xb2\x7f\x92\x3e\xd7\xec\x82\xd6\xef\xb1\xee" + "\xbf\xe7\x4d\x65\x0b\xcd\xce\x57\x7d\xc1\x3d\x5b\xd4\x9c\xfe\x3d" + "\x33\x3d\x34\x43\xca\x9c\xed\x0e\x96\x89\x7b\xca\x45\xda\xec\x95" + "\x9c\x2e\xcb\x41\x8e\x8d\x41\x82\x2d\x30\x3b\x5f\xc8\xb6\x72\x91" + "\xc4\x1b\xcf\xf9\x79\x2f\x85\xef\x96\x95\x7e\xd8\x06\xb0\x6b\x67" + "\x17\x70\x19\x5e\xa4\x01\xdd\x47\xa8\x35\xfb\x7b\x5c\x1e\xba\x5f" + "\xd3\x87\xf7\x14\xa9\xb9\xe6\x7b\x8a\xfa\x90\x17\xb6\xe2\x8d\x88" + "\x87\xfd\xbb\x7c\x8c\xb6\xb6\x2b\xf7\xdc\x20\xac\xcd\x43\x2b\xe4" + "\x3c\x6b\xf9\x38\x4a\x2f\xb7\x88\x9e\x21\x6d\xbd\xa8\x7a\x4e\x5c" + "\x24\xf7\xc5\x18\xe9\x16\xbf\x73\x42\xa2\x0e\x17\xfd\xed\x2f\xfb" + "\x8c\x8f\x3e\x8a\xb0\xb1\x3a\x5c\xa4\xb9\x09\xdf\x13\x06\xd3\xa8" + "\x3c\x33\x23\xf2\x3c\xda\x67\xbc\xfb\x97\x08\xcb\x8b\xc9\xb3\x26" + "\x26\x8f\x2d\x22\x8f\x43\x2b\x67\x57\x4c\x9e\x9a\x98\x3c\x4d\x71" + "\x70\x6b\x89\xc9\xd3\x1e\x93\xa7\x33\x0e\x6e\xbd\x31\x79\x82\xd1" + "\x79\x26\x26\x45\xd0\x96\xf7\xa8\x58\x11\x66\x89\xce\x33\xd1\x1a" + "\x93\x27\x5b\xff\x86\xed\xb9\x46\xd9\x06\x90\x27\xf0\x14\x7c\x2d" + "\x40\x3c\xea\x3f\x6b\x48\x1b\x9e\x65\x13\x32\xb3\xc2\x7e\x48\xf9" + "\xc7\x67\xbd\xca\xf3\xe7\xac\xcf\x61\x17\xf7\xb2\x4c\xb0\xdd\xc9" + "\x65\x75\x53\xd6\x5e\x96\x21\xc0\x3c\x7a\x2d\x3d\x26\xb6\xc7\xe0" + "\xd9\x19\x83\x67\xcf\xb5\xf4\x98\x18\x8c\xce\x93\x95\x14\x9d\x27" + "\x6b\x6c\x44\x9e\x46\x55\x4e\x96\x35\x26\x4f\x76\x4c\x9e\xbc\x6b" + "\xe5\x33\xab\x28\x26\x4f\x79\x4c\x9e\x5d\x61\x1a\x66\xc9\xbb\x60" + "\xb8\x3d\x20\x1c\xe3\x9f\x1f\x5d\x6f\x9f\x58\x8a\x2e\xcf\xfa\x7e" + "\x31\x25\xd7\x93\xc6\xd5\xa8\x7d\x53\xd2\x37\x51\x17\x4d\x92\x7e" + "\x5a\xd9\x17\xd7\xbb\x57\x03\x09\xbc\xa6\x04\xda\xf6\x1c\xaf\x08" + "\xa0\xcf\x9d\x84\x3e\x6a\xda\x74\x7d\x4f\x05\xef\x43\x91\xbe\xec" + "\xe4\x78\x24\xcb\xa3\xda\xdf\xa4\xa9\xda\x1a\x0e\xd7\x07\xe3\x8c" + "\x49\x53\xff\x17\xf1\xfa\x98\xf1\x62\xdf\x4e\x80\x51\x31\x38\xd6" + "\x18\xc4\x95\xcb\x9c\x74\x56\xc7\xb5\x41\xed\x85\x61\x3f\x62\x5e" + "\xf6\xb3\x85\x3c\x87\x23\xc6\x27\x8c\xab\xef\xe8\xd6\x80\x39\x1a" + "\xe7\x49\x7b\x34\x9c\x3d\x4a\x47\x4d\xf2\xe8\xfa\x64\x48\xf9\x73" + "\x55\x65\x76\x80\xea\xbc\xee\x7f\xb2\x0e\xf6\x26\xc6\x58\x8c\xf7" + "\x39\xb2\x66\x4a\xfb\x77\xc3\x55\xe2\xdf\xee\xca\x19\x72\x5f\x80" + "\xaa\x8b\x75\x0d\xdf\xa7\xc0\xb6\x4f\x9b\xed\x0b\xea\x93\x63\x34" + "\xd6\x8d\xd6\xbd\xc7\x2b\xbd\xc0\xd5\x9a\xaf\xef\x9b\xf1\x90\x55" + "\xd9\x75\xae\x2a\x0b\xef\x59\xe0\x75\xbc\xe3\xbe\xe9\x9c\xa6\x12" + "\x78\x66\xeb\x34\xe0\xbb\x19\x90\x76\xea\x50\x63\xa5\x48\xba\x2a" + "\x1c\xa6\x5c\x51\xf2\x63\x6d\x8b\x6e\x0f\x09\x90\x53\x6b\x67\xb4" + "\xcc\x59\x7b\xa2\x65\xce\x1a\x88\x6e\x0f\x46\xb4\x87\xc9\x49\xd1" + "\x79\x26\x8f\x8d\xce\x33\x79\x42\x44\x1e\x97\x2a\x67\x72\x76\x4c" + "\x9e\xbc\x98\x3c\x91\xfa\x0f\x75\x9e\x6c\x1b\x1c\x77\x4a\x7d\x3f" + "\xd9\x11\xf1\x6d\xac\x91\xfd\xd4\xe4\x1a\x3d\x8c\xe7\xee\xd8\x46" + "\x65\xb9\xd1\xe0\x1d\x89\xd1\x51\x9c\xbe\x2d\x06\x87\xd3\x31\x38" + "\x74\xe9\xdf\xfb\xd5\xb8\xf9\xf7\xa0\xdd\x5d\x9a\x9c\xf9\x92\x77" + "\xd0\xc3\xc9\xc1\x47\x1e\x67\xdb\x8c\xfb\x27\xb9\x77\x6b\x3b\x6c" + "\xca\x4b\x94\xc2\x7b\xe6\xba\xcb\xc9\xc4\xfe\xde\x3c\x74\x6f\x81" + "\x48\x9d\x9b\x87\x34\xbd\xb0\xa7\x96\x75\xd3\x64\x2e\xbf\x16\x65" + "\x80\x76\x53\x72\xa2\x71\x98\x92\x1f\x8d\xc3\x94\x92\x88\xef\x14" + "\x7c\x57\x44\xd4\x3b\xc5\x94\x2e\xf7\x68\xc2\xb6\x9e\xe2\xd2\xc3" + "\x79\x0e\x00\x75\xec\xb1\x4b\x3b\x20\x9b\xf7\xcb\xa5\x9d\xa3\x29" + "\xdb\x79\xbe\x40\x83\x79\x2c\x92\xb6\x8a\x16\x53\x4e\xc5\xe0\xe1" + "\x89\xc1\xc3\x1b\xd6\x35\x93\x7d\xaa\x8d\xdc\x6b\xf6\xd0\x03\x56" + "\x0e\x03\x2d\x2c\xc9\x41\xcb\x8d\xad\x77\xb0\x9d\x7a\xef\xc3\x3e" + "\xd4\x57\xbc\x64\x4c\xd3\xbe\x1f\x15\x77\xb0\xdd\x3d\x37\x0f\xfa" + "\x99\xf7\x44\xde\x8e\xb0\x02\xc5\xd7\x7b\x51\xff\x1f\xe5\x28\xb8" + "\xf7\xca\x35\x58\x4e\x8b\xdf\x99\x22\xb5\x6a\xa8\xb9\x91\x94\xbe" + "\xb4\x2a\xab\xb6\x5f\xd3\x02\x18\x7b\xf4\xf6\x10\xaa\xae\xb2\x86" + "\x0e\x2c\x42\xff\x73\x6f\x23\xda\x44\xad\x1a\xd3\xe4\x54\x42\xf6" + "\x6b\xc1\x3f\x8c\x81\xa7\x6a\x63\x99\xaa\xf9\xbc\x67\x0e\x7a\x89" + "\x7d\x4a\x26\xa9\xfd\x12\xf7\x9e\x8e\x68\x57\x3e\xcb\xd6\xd9\xe2" + "\x1c\x4d\x7d\x93\x6d\x3b\xd6\x1b\xbc\xf7\xee\x78\xd0\x4b\x3c\xcf" + "\xe2\x0e\x9e\x97\x36\x39\xe2\x6b\x55\xde\xa9\x29\x11\x79\xbd\xda" + "\x3c\x08\xfb\x4f\x33\x4f\x0a\x92\xf9\xb8\xcf\xcb\xbe\xf3\xc7\x28" + "\x3b\x7e\xea\x9b\xc7\xa1\x2f\x90\x67\xbe\x9e\x87\xe7\x4c\x38\x0f" + "\xc6\x3c\xe6\xac\x4a\xbe\x67\xf3\x9c\x84\xad\xad\x49\xcb\xf1\x91" + "\xbb\xb2\x87\xdc\xbe\x4e\x9e\xd3\x34\xab\xbd\x4b\x53\x6b\x4d\x01" + "\x4a\xec\x3b\x50\x85\xbe\x76\x6a\xed\xc0\x81\xaa\x4c\xe0\x86\x76" + "\x75\xef\x31\xd6\x81\x91\xb4\x5b\xb0\x20\xef\x91\x65\x4b\x26\xfe" + "\xf8\x91\x45\x2b\x16\xcc\xb0\xac\x58\xbb\xbe\xb8\x68\xe2\xc6\x17" + "\xca\x2d\x9b\x4b\xd7\x96\xaf\xdd\xf0\x13\xe9\xee\xd3\x52\x58\xae" + "\xde\x99\xeb\x0a\xcb\xca\x67\xf1\xcf\x09\x16\x5b\x69\xf1\x26\xf9" + "\xf3\xae\x91\x14\x0d\x64\x6d\x79\x71\xa9\x65\x7c\xd1\x04\xcb\x83" + "\x85\x6b\xd7\xbd\x50\x5a\x1c\x17\xd6\x0c\x4b\x69\x71\x69\x71\x61" + "\x91\x65\x96\xc5\xca\x90\x23\xc1\x45\xf0\xd3\xaa\xeb\xa7\x32\xf4" + "\xe7\xb0\xa1\xe5\x5c\x09\xf7\xeb\xdd\xf4\xc3\xed\x6c\xc3\x49\xff" + "\x9c\x90\x43\xf4\x09\x1e\xbf\x73\x5a\xe5\xb5\xfd\xf8\x34\x57\xb4" + "\xfc\x4e\x6b\x8c\x96\xdf\x69\x47\xae\xed\xc7\xa7\xc5\xb4\xff\x69" + "\x31\xed\x7f\x5a\xd7\xb5\xfd\xf8\xb4\x40\x74\x9e\xfb\x12\xa3\xf3" + "\xdc\x97\x3e\xa8\x67\x80\xeb\x4e\xa9\x97\xee\x9b\x10\x93\x67\x66" + "\x4c\x9e\xdc\x98\xef\x82\x88\x6f\xd8\xae\xf7\xad\x8b\xb4\x0d\xf0" + "\x5d\xa9\xb7\xf5\xb0\x7e\xbb\xcf\xa5\xa7\xe1\xbe\xa7\x81\xef\x01" + "\x52\x69\x9b\x23\xd2\xf6\x68\x69\x07\xdb\x3f\xeb\x24\xde\xb3\xa8" + "\xec\xf3\x1f\x4e\xd4\x74\x1b\xdf\x0b\xa4\xf7\xa1\x5d\xe0\xc5\xed" + "\x17\xe9\xbe\x37\x1b\x54\x5a\x2f\xef\x63\x15\x6f\xac\xf4\x37\xa4" + "\x51\x22\xe7\x65\xff\x94\xc2\x39\xb5\x89\x7d\x27\x22\x2c\x09\x0f" + "\xf4\xd4\x0f\x2d\x1e\xf3\x3d\xd2\xa7\x3e\xef\x69\xf0\xd0\x0f\xa5" + "\x2c\x73\xbe\x5d\x72\xef\x9d\x2c\xef\x4d\xbe\xdf\x88\x7d\xbe\xb2" + "\xfe\xe4\x72\xd9\x6f\x2a\x97\x0d\x18\x66\x61\x9c\xfa\xa9\xe6\xff" + "\x32\x05\xcf\x18\xc0\x2c\xd7\x61\x02\x9e\x85\x94\x9f\x5d\xb9\x4f" + "\x5d\xd9\x3d\x3f\xac\xd1\xed\x0b\x1e\x2b\xc4\xd3\x1d\xf1\xf7\x24" + "\x53\xf2\x7e\x67\xa8\xb3\xb5\xaa\x8b\x71\x6a\x63\x3b\xd4\x9d\x1e" + "\xa4\x8e\xba\x20\xc6\xaf\x94\x22\xc7\x53\x15\x17\xc8\xdd\x18\x24" + "\x9e\x1f\x5e\x5d\x41\x8e\x06\x63\xa8\x53\x0c\xe6\xe3\x31\xda\x0f" + "\xe5\x9e\xff\x5d\x1c\x8e\xfc\x18\x4b\x78\x79\xef\xf2\x50\x77\x6c" + "\x71\xba\xd6\x3b\x78\xbc\x37\x7d\xaa\x66\xfb\xee\x6e\x00\xac\xb8" + "\xfb\x6a\x8d\xe4\xf6\x3b\xa7\xa3\xff\x5b\xdd\xa9\xeb\xec\xe3\xb5" + "\x52\xf7\x19\x11\xbe\x1b\xb4\x68\x19\xca\x4e\xd1\xf4\xbb\x8d\xf7" + "\x7a\x21\xed\xd1\xeb\xa5\x65\xbc\x8f\xa3\xde\x68\x8b\x6b\xde\xad" + "\xb2\x26\x68\xfa\x35\x11\xf9\x7a\xf5\x7c\x5f\xa5\x7e\xda\x19\x02" + "\x2f\xda\xaa\x4f\x8d\x15\x67\x14\xbe\x26\xf7\xea\xde\x0f\xfb\x6f" + "\xba\xde\x0e\x6e\xc0\x37\xf4\xdf\x74\x39\x9f\xc8\xfb\x6a\x78\x4c" + "\x5d\x66\x83\xcd\x96\xee\x83\x6e\xbc\x7f\x8d\x1e\x27\xe7\x89\x38" + "\xae\x52\x04\x8e\xa7\x77\x71\x5c\xe5\x60\x1c\xe7\x63\xbc\x2b\x82" + "\x1c\x5e\xa3\x87\xab\xbe\xe5\xfe\xa6\x98\xef\xa3\xfa\x37\x7e\xb7" + "\xe2\xf7\xe0\x3e\x7d\xe8\x5c\xde\xe3\x64\x38\x47\x33\xc6\xd5\xcb" + "\x76\x73\xbf\x47\x8f\x97\x73\x6a\xef\xf0\xda\x98\x8f\x42\x69\xb3" + "\xd7\x48\x9b\x0b\x79\xf8\xbe\x2c\x8c\x31\x0c\xa2\x5f\xee\xb7\xea" + "\x65\x38\xdc\x66\xe4\x9d\x35\xf8\x3e\x47\xf7\xb3\xcf\x79\x2f\xcb" + "\xc8\xe6\x20\x8d\xb5\x3d\xc0\xf3\xcf\x33\xa4\xdc\x72\x18\xc3\x65" + "\x78\xdc\x27\x32\x6c\x86\xc7\xf7\x7a\x89\xbe\x12\xe0\x3a\x83\xeb" + "\x5f\x33\x14\xaf\x10\xef\x88\xa0\x65\x02\xbe\x5d\xd1\x75\x9d\xd1" + "\x18\xf3\x7d\x44\xff\xe6\xb9\x5e\x25\x7b\x33\x9a\xb4\xb8\x13\xd7" + "\x2b\x8b\xc7\xbf\x48\xe3\x8d\x2e\xef\x47\x14\x0d\xff\x47\x29\x31" + "\xdf\x16\xfd\xbb\x46\xae\x31\xfc\xc8\xaa\x97\x21\x79\x06\x19\x6b" + "\xaa\xf2\x26\x5c\xcf\x9f\x2b\xf2\x14\x45\x94\x39\x0c\xdf\xe5\x61" + "\xfe\xfd\xc8\xa1\xc3\xc3\xef\x3d\x11\xe9\x60\x97\xfc\xa8\x4e\x4f" + "\xa7\xd6\x37\x7e\x74\x38\x22\x5f\xcb\x97\xd4\x35\x46\x76\x67\x25" + "\x28\xd9\xfd\x91\x37\x1a\x97\x99\x14\x86\x39\x33\x29\x8c\xcb\xcc" + "\xf4\x88\x74\x68\x9f\x33\x33\x63\x65\xb5\xac\x82\x65\x9c\xe5\x75" + "\xe6\xfc\x38\x71\x01\x2d\x6e\x4d\x7c\x19\x9f\x59\x11\x11\xae\x8d" + "\x8f\x66\xfe\x49\xb3\x13\x58\x3f\xfb\xf8\xce\x32\xcd\x6f\xba\x94" + "\x49\xf6\xa7\xac\xdd\xa3\x04\xb9\x9e\xd9\x12\x0b\x97\xef\xbe\x19" + "\x84\x11\x86\xb9\x5b\xd9\x78\x33\x7b\x22\xea\xe6\xf3\xd0\x0c\x7d" + "\x9d\xc8\xab\xe6\x06\x7f\xd4\x35\xd4\xb8\xc3\xef\x9c\x95\x11\x4d" + "\xb3\x59\x53\xc3\x34\x9b\x95\x1d\x86\x3b\x2b\x37\x22\xdd\x3f\xe1" + "\xbb\x20\x22\x5d\xc9\x97\xc9\xa6\x92\x95\x59\xae\x98\xb2\x1a\x23" + "\x60\x1c\x8e\x28\xab\x25\x22\x5d\x27\xbe\xdb\x87\xe6\xcf\xac\xae" + "\xa1\xf9\xf3\x00\xc5\xe7\xcf\x03\xe9\xe1\x72\x1f\xc8\xf8\xf2\x76" + "\xf5\x40\x4e\x04\x3e\x0d\xf8\xce\x8f\x6e\x47\x0f\x94\xc4\x7c\x0f" + "\xf2\x5f\x40\x77\x34\x6d\xcd\x4e\xe0\xf0\xf2\x71\x94\xa2\xda\xd9" + "\x03\xb5\x91\xf1\x1f\x5e\x55\xf1\x8c\xa3\x5c\x83\xe3\xf5\x4d\x95" + "\xae\x35\x36\x1d\xa7\x89\x88\xf7\xe8\xb8\xef\x1a\xc2\xc7\xb7\xde" + "\xff\xb9\x43\xdc\xff\x3d\x10\x54\xeb\x36\xd9\x35\xc2\xf9\x51\xfe" + "\x50\x7d\x99\xdf\x39\x7b\x3a\xc6\x0c\x5e\x45\x9f\xd9\x90\xff\xc7" + "\xa4\x6d\x22\x5c\xd9\x35\x90\xa7\xab\xdd\x34\xfb\x4f\x78\xf7\xe3" + "\xfd\xbb\xe8\xfe\x75\x76\x81\x70\x1a\x96\x37\x38\x63\xfb\xdd\xd9" + "\xe5\x18\x7b\x5c\x4d\x0e\x3a\xf2\xe3\xc4\xb9\x84\xd3\xf4\x48\x9c" + "\x70\xf6\xa1\x7f\xd5\x43\xb3\xcf\x30\xbe\x11\xe1\xad\xc2\x39\x7a" + "\x05\xa7\xf7\x70\x79\xc8\x33\x14\xdf\xf4\xf3\x3f\x4a\xf6\xb2\x93" + "\x62\xea\x71\xa5\x9b\xb2\x5f\x51\xf5\xc8\xfe\x24\xba\xec\xec\x8c" + "\xf8\xf5\xc8\x9e\x89\x7a\x5c\x89\x5f\x8f\x6c\xe9\xa7\x5e\x18\x51" + "\x97\x6b\xec\x8e\xec\x72\xd4\xe5\x8a\xa4\x7b\x74\xf8\x1e\x7d\x9c" + "\x6a\xbf\x82\xf1\xbf\x91\x64\xde\xe5\x95\x61\xbe\x69\xe9\x8e\x26" + "\xd7\x52\x5e\x9c\x32\x4f\x08\xe7\xf0\xe5\x1e\x9a\x63\xd6\xfb\x2b" + "\x2d\xbc\x4b\xe1\x02\x3a\x19\x99\x4e\xa8\x0f\xf2\x0d\xc5\x6f\xbd" + "\x7d\xaa\x75\xa6\x39\x68\xff\xb3\x7b\xf4\x3e\x1d\xfd\xb9\x57\xa7" + "\x23\xe2\xf2\x62\xe2\x02\x11\x71\xeb\xa2\xe2\xb6\x0f\x86\xef\xd2" + "\xc3\xbf\x1a\x9f\xe6\x1c\x8d\xe1\x13\xf8\x33\x77\x41\x74\xbd\xe7" + "\xb4\xa9\xfa\x81\x47\xd7\xd0\x7a\x8e\x07\x3c\xea\x8f\xcf\xa3\x39" + "\xc1\xf8\xb2\x36\x77\x8c\x84\x97\x46\x71\xe0\xcd\xe5\x33\x63\xfd" + "\x52\x06\x35\x3e\x5d\xcb\x9f\xb9\x2b\x74\xfe\x7c\xb5\x3a\xce\xad" + "\x8d\xa9\xe3\x40\x37\xcd\xbb\x49\xd5\x75\x5e\x71\x0c\xec\x23\xf1" + "\x65\x71\x6e\x3b\xea\x39\x10\xbf\x9e\x73\xbb\x86\x96\xc5\x79\xbc" + "\x1e\x32\x70\xad\x2c\xce\x4b\x57\x79\x28\x5e\x9e\xa9\xc2\x19\xaf" + "\x9c\x79\xb9\x6c\x17\x79\x68\xde\x2e\x5e\xa7\x8b\x08\x2f\x8a\x96" + "\x3f\xd4\x81\xf3\x31\xfd\x82\x6a\x1c\xc3\x7c\xe8\xb6\x90\xf1\xcb" + "\x64\xd2\xef\x9c\xd7\x16\x43\xab\xcf\xba\x69\xfe\x82\x3e\xa3\xf1" + "\x41\x45\xaf\x05\x23\x62\x70\xf2\xc4\xa7\xd7\xbc\x00\xe8\xf5\x59" + "\x7c\x7a\xcd\x1f\x33\x34\xbd\xe6\x33\xff\x3f\xbb\x96\x5e\xf3\x73" + "\x22\xe9\xc5\x77\xad\x72\xfd\xbe\x9f\x0e\xd9\xe8\x5f\x2d\x1a\x94" + "\x2e\x4f\x49\x86\xac\xa8\x3c\xbd\x9c\xa7\x32\x39\xa0\xe4\xc4\x72" + "\x1b\x25\x5e\xa4\xf9\x45\x7a\xfb\x1f\x5d\x4b\xc3\x45\xff\x4a\xde" + "\xab\xcd\x77\x37\xa4\xb8\x2b\x3e\x6b\xe5\x3b\x1e\x79\xbe\x31\xa6" + "\xdc\xd6\xf8\xba\x60\x3e\x6c\x7e\x53\x75\x9c\x70\xaf\x9a\x33\x5d" + "\x90\x19\xad\x23\x16\x24\x46\xf3\x08\x74\x33\x4a\x2f\xe5\x86\xaf" + "\xf2\x5c\x9f\x67\x0b\x2a\xae\xe5\xd9\x83\xb7\x6a\xfc\xba\x12\x8d" + "\xdf\x02\x57\x7c\x7e\x2d\x68\x1e\x9a\x5f\x0b\xda\x86\xe6\xd7\x02" + "\x0f\xf3\xcb\x43\x0f\xa6\x47\xf7\x1b\x0b\x02\xd1\xf5\x45\xb9\xc8" + "\x27\x8c\xc3\x6e\xe4\xef\xaf\x5a\x6f\xfd\x61\x1d\xc7\xbc\x6a\x80" + "\x7d\x05\xfc\xc7\x31\x8e\x5f\x17\xc6\x90\xb0\x41\x43\xd7\xd6\x21" + "\xef\x03\x49\xea\xc0\xb8\x92\xf7\xe7\xc9\x7b\x99\xe9\xc1\x0b\x21" + "\xa3\x61\x06\x7e\x1b\xbb\x29\xe7\xd7\x21\xa3\xc9\xc1\x7b\xc9\xe4" + "\xf9\x39\xb9\x3e\xb1\xd0\x1c\xc9\x0b\xde\x53\xc6\x73\xd1\xfb\xd4" + "\x3c\xe7\x5f\xba\x69\xe1\x5e\xc5\x97\x9c\x37\xa3\xe9\xb8\x30\x33" + "\x3e\x5f\x16\x66\x83\x2f\x7f\x89\xcf\x97\x85\x05\x43\xf3\x65\x21" + "\xef\x55\xf8\xcb\xb5\xed\x68\xa1\x4b\x6b\x47\x3b\x39\x8f\x65\x03" + "\xdb\xab\x39\xfc\x9d\x8c\xdf\x68\x23\x0b\x3f\xe5\xf8\x89\xbd\x7a" + "\x3b\x92\x79\x78\xfc\x2f\xcb\xd7\xd2\xb4\x6a\x30\x22\xe1\xf6\x24" + "\xf7\xc6\x6b\x27\x39\x72\xcf\x40\x96\x8d\x12\x41\xc3\xfc\x43\x0c" + "\xa3\x94\xe8\x22\xe5\x3c\xca\xe9\x38\x9c\xef\x56\x88\x48\x6f\xd5" + "\xd3\xc9\x79\x51\x95\x36\x93\xef\x02\xe7\x74\x31\xb0\xb5\xfa\x0f" + "\x97\xfd\x08\xa7\x97\x77\x8f\x47\xa7\x71\xa8\xf6\x98\xd3\x16\xdd" + "\x1e\x73\x6a\xa3\xe5\x73\x21\xaf\x4f\x24\x87\xa0\xe7\x20\xcb\xbd" + "\x03\x4e\xc3\x8c\x6f\xa6\x6d\x2e\x1a\x13\xd3\x36\x21\x03\x8b\xfe" + "\x5e\xc9\xc0\xa2\xd7\xa3\x71\x5d\x34\x21\xbe\x0c\x2c\x9a\x3f\xb4" + "\x0c\x2c\x5a\x33\xb4\x0c\x2c\xaa\x64\x19\xf0\xd0\xa2\xa3\xd1\x6d" + "\x73\x51\x4d\x74\xdd\x51\xae\x6c\x9b\x94\xfa\x75\xda\x26\x6c\xa1" + "\x1b\x87\x6a\x87\x9a\xfd\x6f\xe0\xfb\xd1\xbe\x06\xcd\xd4\x7d\x3f" + "\xf4\x50\x0e\xaf\x21\x41\xc7\x97\x30\x0d\xeb\xe5\x18\xed\xa1\x82" + "\x48\x3a\xee\x53\x63\x2d\x3b\xd2\x9e\xe5\x3d\x7b\x8a\x9e\x8b\xdf" + "\x8f\xae\xff\x43\x95\xf1\xe9\xf9\x50\x0d\xe8\x69\x8f\x4f\xcf\x87" + "\x8e\x0c\x4d\xcf\x87\x4e\xf0\x19\xed\x6b\xdb\xd4\x43\x5d\x7c\xf7" + "\xa5\xde\x37\x5d\xa4\xc5\xb3\xbe\x5a\xff\xb4\x78\x6c\x74\xff\xb4" + "\xd8\xfc\xf5\xfb\xa7\xc5\x6b\xe2\xf7\x4f\x8b\x2b\xe2\xf7\x4f\x8b" + "\x5d\xaa\x3d\x2c\x6e\x8f\x6e\x0f\x8b\x9b\xa3\x65\x02\xb4\xfb\xc6" + "\xfa\xa7\xdc\xf4\x98\x36\xb0\xbf\x9b\x72\xdf\x84\x4d\xf1\xa2\xe2" + "\xdb\x92\x27\xa3\x71\xcc\x9d\x1a\x9f\x6f\xb9\xb9\xe0\xdb\xfe\xf8" + "\x7c\xcb\x2d\x19\x9a\x6f\xb9\xbb\xc0\xb7\xfd\xd7\xf2\x2d\xb7\xee" + "\xeb\xdb\x14\xb9\xa7\xa2\x79\x96\xdb\xf2\xf5\x79\xb6\x64\x4c\x7c" + "\x9e\x2d\x99\x10\x9f\x67\x4b\xe6\x2b\x9e\x2d\xa9\x8c\xe6\xd9\x92" + "\x82\x68\x9e\x81\x6e\xdf\x18\xcf\x96\x9c\x88\xe1\xd9\xc6\x6e\x5a" + "\xba\x04\x3c\x3b\xa5\x78\xb6\x2c\x35\x06\xc7\x9e\xf8\x3c\x5b\x8a" + "\x01\x23\x6d\x8c\xcf\xb3\xa5\x63\x87\xe6\xd9\xd2\xe9\xe0\xd9\xc6" + "\x6b\x79\xb6\x34\xef\xeb\xf3\x6c\xe9\xae\x68\x9e\x2d\x5d\xf7\xf5" + "\x79\xb6\xb4\x3d\x3e\xcf\x96\x7a\xe2\xf3\x6c\x69\x40\xf1\x6c\x99" + "\x35\x9a\x67\xcb\x52\xa2\x79\x06\xba\xfd\x3b\x79\x06\xfe\xd4\xaa" + "\xfd\xba\xcb\x0e\xf4\xc9\x39\xed\x65\xbb\x3d\x94\x97\xa7\xd6\x04" + "\xf2\xa4\xec\x68\x3c\xfc\x10\x69\x2a\xaf\xed\xbb\x97\x35\x69\x61" + "\x3f\xbe\x96\x0f\xcb\x5a\xd1\xaf\xf6\xb6\x55\xca\x7d\x5d\x8a\x87" + "\x4c\x73\xa4\x53\x73\x64\xcb\x3c\x9c\x17\x3c\x16\xee\x40\x90\xb8" + "\x2f\x46\x7a\x1f\xc3\x61\x7f\x22\xd1\xb0\xf2\x92\xbe\x8e\x5d\x36" + "\xf4\x1e\xf3\xec\xda\xd6\xaa\x29\x80\xf7\xf0\x38\x25\xab\x79\xb1" + "\xf6\x6f\x03\xca\xba\xa4\xe4\xf4\x91\x98\x39\x93\xbc\x21\xec\xdf" + "\x3c\xb6\x7f\x1b\xe2\xcb\x69\xde\x75\xec\xdf\x3c\xb6\x7f\x1b\x22" + "\xc6\xab\x69\xab\x82\x9e\x98\xf1\xea\xc3\xe6\x64\x9f\x92\x1d\x69" + "\xc7\x1e\xc8\xae\xf5\x3b\x1f\x9e\x10\x83\x33\x78\xf3\xf0\xfb\x1a" + "\xce\xef\xc4\xe4\x9f\x1f\x1f\xe7\x87\x0b\x80\xf3\x87\xf1\x71\x7e" + "\xb8\x62\x68\x9c\x1f\xae\x01\xce\x1f\x5e\xdb\xb6\x1e\x3e\xac\xc9" + "\x41\x9c\x71\xf9\xc3\xed\xf1\xf9\xff\x70\x0c\xff\x29\xbf\xbc\x52" + "\x78\x65\xfe\xa8\x74\x8f\x24\x46\xa6\xe3\xbd\xfa\x9c\x96\x65\x24" + "\x4e\xda\xa9\xb1\x30\x87\x48\x57\x70\x8d\xec\xf1\xd9\x82\xb8\xb2" + "\xf7\xc8\x6e\xd5\x1e\x1f\xf1\x44\xb7\xc7\x47\x1a\xa3\xdb\x23\x68" + "\x1d\x9d\xaf\x35\x3a\x3e\xcf\xf5\xcd\xe9\xd8\xe5\xd6\x18\x19\xf8" + "\xa8\x9b\x96\xff\x4a\xc9\xc0\x8a\x84\x68\x3c\x96\xe7\xc4\x97\x81" + "\xe5\x6b\x50\xff\x8f\xe2\xcb\xc0\xf2\xca\xa1\x65\x60\x39\x9f\x9d" + "\xfa\x28\x52\x6e\x97\x57\x66\x0f\x8f\x49\x73\x2c\xbe\xce\x5b\x7e" + "\x3a\xfe\xbc\xce\xf2\x5e\x45\xe3\x15\x19\xd1\x34\x5e\x61\x8e\xa6" + "\xe1\xf2\x9c\x6f\x80\x86\x83\x7e\xbd\xfc\xce\x15\xb1\xed\xdf\x8d" + "\x32\xb5\xf6\xff\xe8\x85\x68\x1c\x57\x68\xe3\x9f\x78\x73\x59\x2b" + "\x0e\x83\x96\xee\xf8\xb4\x5c\xd1\x1e\xbf\xce\x2b\x3c\xe8\x83\xdc" + "\xa1\x6b\xda\xd2\x8a\x00\xc2\x97\xcb\x3b\x1b\xaf\x50\x4a\x3d\xc2" + "\x97\x07\x29\x51\xf6\x57\x83\xfd\xd2\xa3\x7c\xee\x40\xc8\x39\x66" + "\xc8\x6f\xf2\x58\xca\xe3\x3e\x88\xf1\x5a\x5d\x19\xbb\x26\xfa\xa8" + "\x9c\xff\xe0\x7d\x2c\x7c\xae\x26\xb9\x82\xf2\xdc\xbe\x20\xe9\xf2" + "\xce\xe9\x63\x60\x57\x70\xbb\xe0\xf4\x7a\x5a\x35\xd7\xe9\x88\xd1" + "\x4d\x8f\x36\xc6\xe7\xf1\xa3\x2d\x43\xcb\xce\xa3\xa7\x15\x9f\x1f" + "\x4b\x8c\xe6\xf3\xa3\xbd\x21\xe7\xe8\x15\x5c\x57\xc8\xc0\xd7\x6a" + "\x27\xbc\x76\x3a\xa4\xbe\xdf\xb9\xb2\xd3\x56\x45\xdf\x3b\x4f\x8f" + "\xd9\x64\x79\x46\x11\x48\xde\x61\xa0\x36\xa9\x03\x1e\x93\xf7\x05" + "\x73\x9a\xd5\x41\x32\x8a\x9d\xcf\x75\x72\x5c\x83\x53\x04\xe4\x9d" + "\x94\x4e\x71\x8a\xfd\xf1\x40\x16\x6e\x3c\x47\x8f\xbd\x12\x95\x1f" + "\x52\xe9\x56\x30\xda\xd4\xfc\xfe\x63\xad\xfa\x3c\xfc\x50\xf3\xfb" + "\x48\xd3\xa5\xef\xfb\x55\x6b\x61\x8f\x75\x0e\xd9\x2f\x03\x27\x3e" + "\x43\xce\x38\x5d\x5f\x0f\xfc\x78\xba\x2e\xbf\x6a\x6d\xee\xc7\x39" + "\xe1\xb3\x2d\x3f\x5e\x81\xb8\xe0\x75\xe6\x73\x23\xda\xc1\x8f\x1d" + "\x91\x70\x94\x6f\xbb\x1f\xd7\xe8\xe7\x53\xf0\xbb\xf1\x4b\x60\xe9" + "\xf8\xb4\xc7\xe0\x03\x7e\x2e\x0e\x6a\x30\xba\xbe\x04\xc6\x18\x77" + "\xd3\x0c\xca\x0a\x91\xe9\x3c\x3d\x31\xb9\x86\xf7\xe8\xd4\xf5\x50" + "\x52\x90\xcc\x6a\x6c\x97\x7f\x3f\x9f\x0d\xe1\xb1\xa1\x3b\x38\xbb" + "\x95\xd7\xe0\xe4\x1e\x82\xf4\xd9\xad\x27\x2b\x06\x34\xdf\x63\xf9" + "\x8b\x98\xa6\x27\x4b\x3e\x6b\xad\x3b\x28\x7a\x0e\x49\x9f\x53\xf9" + "\x51\xe3\xbf\x3d\xbc\xff\x87\xf7\x61\x54\xd1\x6c\xa4\x3f\xab\xda" + "\xfa\x13\x31\x36\x69\xfe\x10\xe3\xbf\x7c\x1e\xff\xcd\x8e\xdf\xce" + "\xf3\xaf\x33\xfe\xcb\xe7\xf1\xdf\xec\xc8\x7e\x53\xad\xf3\xe4\x77" + "\x45\xda\xa4\xec\x17\xca\xf2\x0c\xdb\x99\x8f\x3f\x7e\x4f\x0d\xa5" + "\x04\x79\x4d\x1b\x6d\xd3\xdd\xd3\xc6\xed\x35\xe5\xa4\xb7\x85\xfd" + "\x31\x24\xf2\x5d\xda\xaa\x2f\xe3\xf6\xfa\xb8\x9c\x2f\x4c\x0e\xaa" + "\xb6\x68\xaf\x10\xde\x09\x5d\x90\xa1\x8d\x25\x3a\xac\x31\xdb\x4b" + "\xd4\xb9\x8f\xd1\x5d\x34\xdc\xdd\x23\xfb\x45\x03\xdb\xab\xd2\x6e" + "\x0d\x5e\x22\x86\x7b\xbc\xf2\x24\x31\xdc\xd0\x60\x3f\x29\x61\xef" + "\xe2\x36\xce\x30\x19\x76\x07\xd2\x31\x5c\x4e\xa7\xd7\x43\x9d\x8d" + "\x79\xfc\x70\x64\xdd\xe5\xfc\x0b\xca\x46\xf8\xa7\x3c\xaf\xe2\xe6" + "\x7c\xf6\x95\x22\xab\x8b\xd7\xcc\x3e\x6b\x15\xf6\xe7\x44\x56\x29" + "\xcf\x89\x3d\x71\x3f\xe7\xfb\xf0\xcf\x9e\x84\xf2\x71\x94\xa8\xc2" + "\x1e\xf7\xb5\x59\x02\xe4\xa1\x27\xa6\x47\xeb\x88\x27\x62\xec\xdf" + "\x7c\x39\xce\xc4\x3b\x89\xf7\x27\x6a\xfb\x57\x59\x1f\x08\x77\xd0" + "\x2f\xe5\xe3\x7a\x7b\x2a\x78\x4d\x9a\xf7\x44\x29\xbf\x67\x4f\x38" + "\x62\xe6\xde\xbc\xfb\xe4\xbe\x9a\x3f\xa2\xdc\x95\xa3\x94\x8c\x14" + "\x8c\x8a\xe6\xe9\x13\x8d\xf6\x0b\xbc\x16\xa4\xfa\x83\x55\xc1\x58" + "\xfd\xf8\x44\xab\x6e\xbb\xc5\x84\x77\xea\xfd\x81\x65\x03\xc3\x5d" + "\x19\xd3\xcf\x3c\x21\xed\xff\x81\x6b\xfa\x85\x95\x7c\x8e\x2a\x4a" + "\x26\x3b\xa4\x0c\xad\xcc\x3c\xe9\x83\xdc\x94\xb2\xfc\xaf\x7c\x07" + "\x69\x76\xf0\x99\x43\x7c\x0f\xbf\x48\x2b\xf3\x07\x9c\x94\x78\xd2" + "\x2b\xcf\x54\xa5\x40\x46\xa4\xdc\x72\xbf\x31\x49\xed\x47\xf2\xc5" + "\x94\x51\xae\xd3\x9c\xd3\x74\x94\xfe\x91\xd4\x7e\x0a\x96\x85\x95" + "\x39\xbc\x37\x63\x74\x2f\x0d\x67\x58\xba\x0c\xb9\x83\x9d\xd4\x11" + "\x8c\x1d\xf3\xac\x3c\x16\xbf\xee\x2b\xb9\xff\xaf\xf6\x50\xc1\x84" + "\x68\xde\xae\x94\xfd\xbf\xbe\xae\x03\xde\x07\xa2\xf3\x15\x24\x45" + "\xf3\xfe\x89\x46\x8e\x1f\x72\x8f\x8f\x2b\xbb\x0e\xe3\x99\xd5\x3e" + "\xb9\xdf\xab\x00\xed\xff\x89\x82\xeb\xe9\x41\x91\x92\x5d\x17\x42" + "\x5a\x6d\x5f\x30\xf4\x56\x81\x2b\x6a\xce\xe8\x66\x39\x67\xb4\xba" + "\x9b\x9e\xd4\xd6\x7e\x9e\xfc\x38\x06\xbf\xc3\x43\xdb\x06\x05\xbc" + "\xfe\xb3\x3a\xbe\xce\x28\xe8\x8a\x6f\x1b\x14\x04\x35\xbd\xb0\x5a" + "\xa4\xc6\xca\xc1\x93\xe9\xe0\xb1\xcc\xa3\x8f\x61\x79\x2e\x74\xe8" + "\x31\xec\x93\x39\x83\x63\xd8\x52\xd6\x07\x4f\x5a\x07\xc7\xb0\xde" + "\x78\x63\x58\x4f\x1c\x7e\x3e\xb9\x27\x3e\x3f\x9f\x6c\x8a\x3f\x86" + "\x7d\xf2\x98\xea\xe7\x9f\xf4\x46\xf3\xf9\xc9\xd3\xe1\x35\xe1\x82" + "\xc3\xdf\x9c\x3d\xbc\x2a\xfb\x5a\x7b\x78\xd5\x6f\x14\xaf\x56\x0d" + "\x44\xe3\xb6\x2a\x3f\xbe\x6e\x5f\x65\x1b\xda\x1e\x5e\xb5\x67\x68" + "\xdd\xbe\xaa\xf9\x5a\x7b\xd8\x32\x2c\x26\xcd\x89\x41\x5b\x29\xca" + "\x36\x5b\xd5\xa5\xe8\xb4\x9a\xed\x39\x53\x44\xfa\x60\xb4\xbc\x03" + "\x67\xc0\x83\x6e\x3b\xcf\x3a\x4d\x97\x99\xa1\x68\xc2\xbe\x99\xbe" + "\x5f\x43\x23\xd0\x06\x3e\xf2\x3b\x57\x0f\xca\x3f\xef\xe3\xe3\x72" + "\x58\x47\x0e\xb9\x9f\xce\xa8\xe3\xc7\x78\xac\xde\x75\xbd\xf5\x52" + "\x53\x3a\xe5\xbd\x76\x0d\x3d\x56\x4b\xfb\x8f\x61\x5c\x9f\x67\xab" + "\x7d\x31\x6d\xcc\xa7\xf6\xe1\xae\xf9\x9d\xe2\xdb\x9a\x98\xb1\xec" + "\x9a\x14\x79\xa6\x6f\x48\x7d\xbb\xc6\x1a\x5f\x46\xd7\xe4\x0c\xea" + "\xdb\x52\x09\x77\x47\x4c\x7c\x89\xe2\xc1\x9a\xd6\x50\x6a\xe4\x5c" + "\xf7\x1a\x47\xb4\x4e\x5a\x53\x12\x93\x2f\x66\xfc\xb7\x86\x75\xe2" + "\x50\x7b\x1c\x62\xfa\x9b\x35\xde\xa1\xfb\x9b\xc2\xed\xaa\xfe\x4f" + "\xc5\xac\x2f\x17\xa6\x5c\xbf\xbf\x29\x1c\xa2\xfe\x85\x39\xd1\xfd" + "\xcd\x53\x31\x6b\xf4\x85\x25\xf1\xfb\x9b\x42\x87\xae\x67\x94\xde" + "\x28\xfc\xd7\xaf\xa6\x6f\x0a\x5b\xa2\xf5\x4d\x61\xe3\x97\xe9\x9b" + "\xe3\xd7\xe8\x9b\xc2\x60\x72\x5d\xbc\xba\x3c\x35\x26\xbe\xbe\x79" + "\x6a\x82\xe2\xe1\x53\xbb\xa2\xf5\xcd\x53\xf3\xa3\x79\x58\x18\xc3" + "\xc3\xa7\x62\xd6\xbf\x0b\x53\xfe\x57\x75\x92\xc9\x64\x32\x9a\x0c" + "\x46\x83\x89\xf8\xd2\x28\x03\x0d\x37\x99\x4d\x09\x78\x86\x69\xef" + "\xe1\x46\x93\xd1\x8c\x27\x41\x7b\x0f\x8b\xf9\x1e\xce\x79\xf1\x98" + "\xb5\x77\x42\xcc\xf7\xb0\x2f\x89\x1f\xae\x95\xab\x97\x6f\x8e\xf9" + "\x4e\xf8\x92\xf8\x61\xff\xce\xfc\x74\xcd\x77\xf4\x39\xc8\x45\x1b" + "\x36\x15\xae\x5b\x5b\x24\xf7\xb5\x17\x5b\x0a\x9f\x7e\xba\xb8\xac" + "\xcc\x52\xbe\xd1\x32\x77\xce\x23\x53\x66\x58\xd4\xf6\xf8\x75\xb3" + "\xc6\x17\x8d\xa4\x25\x9b\x4b\x39\x62\xc9\xf2\x45\xf9\x96\xbc\xb9" + "\x73\xa2\x23\x75\x30\x72\x1b\xfc\xf5\xa0\x44\xb4\xbd\xec\x57\x6e" + "\x26\xda\x73\xb3\xd4\x3b\x5d\x7c\xf6\x5c\x8d\x27\x4a\xfe\xe5\x44" + "\x13\xc6\x13\x57\xed\x82\xcf\x55\x9c\xa3\xa2\x17\xb9\x12\x13\x1b" + "\x1d\x64\x7b\x86\xfd\xa9\x14\xbd\x23\x7e\xeb\x25\xcb\x43\x64\x3c" + "\x47\xeb\xcf\xb6\x61\x14\xcd\xdf\xee\xae\x20\x59\xec\x6c\xdb\x96" + "\xec\x40\x9c\x41\x3c\x10\x42\x98\x4f\x3b\x9f\xff\x93\x03\x32\xec" + "\xb7\x0e\x3d\x5d\x72\x37\x15\x2f\x10\xbf\x15\xf2\x9b\xfd\xd6\xa8" + "\x74\xc5\xb7\x86\x9c\x4f\x77\xb2\x5e\xa8\xab\x26\x73\x7d\x35\xd1" + "\x9b\x69\x94\xf8\xe6\xcd\xec\x6b\xb6\x38\x49\xdf\x97\xfd\x0a\xbe" + "\x3d\xb4\xde\xc3\x65\x73\xda\x90\xb1\xc8\x28\xd3\xa7\x45\xa5\x9f" + "\x19\xde\xc7\x5d\x9c\x64\x44\xba\x65\x9f\x50\x72\x20\xed\xbe\x53" + "\xee\x4a\x07\x25\x0f\x88\xcf\xb3\x72\xc8\xd0\x81\x96\xb1\x25\x28" + "\x82\xad\xa5\xe7\xb9\xfc\x57\x92\xb7\x88\xcf\xdd\xb0\x1b\x97\xf4" + "\xda\xc5\xbe\x0b\x64\x46\x9b\x36\xb4\x96\xf2\x79\x8a\x62\x5b\xfd" + "\x15\x32\x83\x06\x63\xcf\xd3\x33\x8d\x95\x4b\xc4\x80\x7d\x09\x99" + "\xff\x6b\x05\x9f\x79\x9d\x73\x7e\xdf\x7f\x27\xf3\x07\x57\x1d\xc6" + "\xab\x22\x9d\x2a\xcb\x45\x8f\x60\x1f\xd4\x3e\x11\xe0\x3d\xb7\x27" + "\xd6\x0c\x70\x9a\x3f\xfa\xed\xe9\xd4\x51\xee\xa3\xed\x67\x44\x60" + "\xf7\x7f\x57\x3e\x2b\x4e\xf6\xfa\xf8\x0c\x6d\xe2\xf6\x25\x64\xea" + "\xce\x27\xe3\xc9\x92\x5a\x72\x17\xf8\xa8\xf2\x8c\xe8\x39\xb1\xe6" + "\x13\xea\x28\x39\x42\xab\x3b\xc9\x78\xa2\xeb\x4f\x24\xfd\x28\x57" + "\xbf\x7f\xaa\xea\x12\xa5\x6f\x5f\xcb\x61\x97\x68\xeb\x76\x1a\xb5" + "\xf5\x63\x1e\x0b\x75\xa2\x9c\x0b\xf4\xc4\x69\x32\x00\x9e\x71\xdb" + "\x9f\x28\x7d\xdb\xe3\x7c\xd6\x3c\x9b\xea\xaa\x88\xcf\xe4\x26\x5d" + "\xb5\x67\xa6\x5c\x15\x99\x69\x7e\x7b\xe6\x98\x0e\x1b\xd2\x77\xfd" + "\x86\x46\x77\xd2\x98\xdf\x9e\xef\x34\xd6\x7e\x41\x63\x2d\x4b\x99" + "\xff\xcf\xd4\xd5\x7d\x81\xf4\xd5\x76\x47\x08\x79\x23\xf3\x04\x53" + "\xed\xb5\xee\xfc\x00\x85\x00\xab\xf6\x2a\x8d\xad\xbb\x4a\xe9\xa1" + "\x03\x76\x07\xd3\xa2\xbf\xfa\x81\x53\xd0\x83\xc3\x3f\x7c\xaa\xc5" + "\xec\x3e\xd1\x4b\x27\x7d\x57\xa9\x83\xfe\x48\xee\x8a\xbf\xb6\x7e" + "\xf0\x54\x4b\x02\xec\x48\x43\xeb\x56\xde\xfb\xae\x64\xc6\x7e\x92" + "\xfd\xe7\x39\x68\x7f\x15\x25\xd9\xb6\xd2\xf0\xf3\x08\x97\x3a\xc7" + "\x35\xb9\xd3\x1d\xfc\x6b\xeb\x56\x79\x0e\x7c\xbd\xa7\xea\x24\x99" + "\x3a\x7c\xb5\x7c\xde\xd8\x38\x90\xf6\xfe\x29\xb7\xef\x14\xb9\x6d" + "\x7f\x69\x0d\xa5\xbc\xdf\xb2\x27\x44\x89\xbf\xba\x7c\xca\xe8\x36" + "\x5f\x26\x77\xbe\x8f\x3e\x42\xd9\xa2\xfa\xfd\x33\xd0\x55\xd9\x1d" + "\xbe\x00\xfb\xdd\xb1\x8a\xbe\xf4\x91\xfb\x4b\x69\x42\xfd\x17\x94" + "\x71\xe8\x0b\xca\x14\xfe\x4c\x23\x9f\xed\x66\x7f\x69\x87\xf0\x4e" + "\xc2\xd8\x0b\xf5\x95\x67\xbc\x45\xaa\x76\xc6\xbb\x3f\x93\x1a\xae" + "\x86\xcf\x78\x5f\xed\x0b\x9f\xf1\x86\x2c\xa5\xf0\x39\x6f\xb4\x8b" + "\x76\x96\xe7\xfd\x17\xc9\xbc\xf3\x22\x51\x96\xc3\x48\x96\xa7\xd8" + "\xd7\x47\xc9\x0b\xee\xa2\x0b\xf2\xf7\x39\x2a\x99\x80\x77\x12\x1e" + "\x8c\xdf\x4a\xc6\x71\xfd\xba\x34\xb9\x45\x98\x11\x61\x37\xe1\x6d" + "\xc2\x7b\x94\xbd\x4e\x78\x51\x06\xfb\x9c\x19\xc9\xf2\xab\x9d\x27" + "\x6f\xf6\x3b\x4b\xcc\x1e\x3a\x70\x4c\x97\x63\xa5\xcf\x8b\x53\x3e" + "\xea\xbe\xc0\x7e\xcd\xbd\x12\x9f\xfe\x12\x03\xfb\x38\xd7\xc2\x19" + "\x87\xf5\x5c\x2e\xca\xcf\xc3\x3b\x19\x0f\xda\xe5\x4f\xba\xf4\xbc" + "\x7d\xfd\x25\x5c\x66\x31\xc2\x85\x1e\x8e\xfa\x9a\x39\xee\xef\xba" + "\x2f\x18\x55\x9a\x4c\x23\x60\x06\x34\xf8\x68\xeb\x45\x47\xb9\x4d" + "\xf7\x19\x93\xc5\xf1\xa2\xa9\x54\x77\xb3\x38\x75\xe8\xa0\x68\x53" + "\x6d\xad\xa4\xd9\x43\xaf\xe9\x7e\xa0\xdb\xf6\x20\xee\xb8\x85\x88" + "\xe9\xd2\xb6\x86\xf7\x93\x96\xb4\x7b\xe8\x86\x8c\xc8\x3a\x08\xe7" + "\x53\x2d\xdc\x6f\xfe\x4d\x55\x6b\x82\x30\x3e\xdd\xd2\xe1\xe9\xa5" + "\x0f\xae\xf6\x24\xd8\xff\x99\x8c\xee\xe0\x39\x9a\x34\x86\xd2\x79" + "\x0e\xa6\xe1\xa0\xf0\xe0\xdd\x83\xa7\x17\x72\xf2\xdd\xf3\xb4\xf6" + "\xa6\x7b\xc6\xd0\x98\xff\x56\x41\x9a\x3e\x5a\x3b\x31\x42\x1f\xfd" + "\xfd\xc9\xae\x96\x08\x5d\xb4\xbe\xf8\x5a\x5d\xb4\xae\x50\xe9\x22" + "\x11\x54\xba\x67\xc0\xa3\x85\x2f\x89\x09\xd7\xce\xab\xac\x9b\x1c" + "\x13\x1e\xd0\xc2\xbf\x1b\x13\xee\x55\xe1\xcf\x3d\xa9\xeb\xba\x0e" + "\xc6\x63\x33\xeb\xba\xe7\xe6\xb0\xae\xeb\x28\xd2\x74\x9d\x3c\x8b" + "\xf9\xdc\x78\xf1\x33\x07\xb1\x1f\x9d\x6e\x7a\x76\x80\xf1\x17\xbf" + "\x25\x1d\xf7\x11\x08\xfb\x0d\x87\xb9\xfe\x48\x66\x3c\x52\xcf\x09" + "\x67\xd1\xed\xac\xe7\x58\xc7\xf1\x39\x98\xb7\x6f\x16\x9d\x6f\x1f" + "\x14\xa7\xeb\x0e\x8a\x13\x7e\xe7\xb3\x13\x74\x7d\xf7\x53\x84\xed" + "\x41\xd8\x4f\x11\xcf\x7a\x8f\x69\x72\x32\xbf\x85\xfd\x8a\x76\x09" + "\xd7\x9c\x9e\x64\x03\xd9\xf6\x41\xe6\xd9\xdf\xd5\x2e\xd0\xd7\x5d" + "\xee\x93\x67\x4e\xa4\x3f\x70\xa3\x15\x3a\xaa\x8b\xdb\xdb\xcd\x3b" + "\x43\x3c\x2f\xf1\x09\x55\xf9\xc4\x79\x3e\x9b\xc2\x38\xac\xde\xf2" + "\x10\xfb\xb7\x36\xb4\xc1\x3a\x62\x3f\x04\x7c\x76\x06\x7a\xd7\xec" + "\x02\x4e\xca\xbf\xef\xb3\x47\x61\xb9\x64\x2b\x5e\xaf\x97\xfe\xf3" + "\xcf\xd1\xda\x80\x70\x42\x17\xa2\x6e\xc9\x03\x0e\x62\x5f\x2c\x68" + "\xa3\x3c\xcf\x5a\xf2\x36\x1e\x97\xee\x8f\x85\xef\x52\x40\x1a\x77" + "\x67\x80\x18\x67\x0f\x3d\x3b\xff\x64\x65\x0b\xe7\xef\x61\xda\x08" + "\xa7\x5d\x87\x61\x90\xfe\x5c\x30\x86\x67\x7f\x2e\x48\xd7\xa9\xec" + "\x99\x07\x4e\x9d\x2c\xf0\x12\xeb\x79\x77\x0f\x60\x54\x9e\x53\x30" + "\x00\x4b\x40\xef\x47\xc5\x69\xf0\x47\x6d\x17\x9f\x03\xfe\x51\xe6" + "\x17\xfb\xe5\xe2\x7d\x49\xa0\x4b\x12\xfb\x66\x50\x76\xe7\xb3\xb3" + "\x1a\xfe\x48\xa4\xf9\x16\x83\xbc\x3d\x3b\x93\x7d\x77\xb1\x3f\x31" + "\xe9\x4b\xcc\x38\x95\xc4\xe6\xcc\xa4\x41\x7f\x62\xff\x01\xbe\xc4" + "\x40\xff\xf4\x7a\xa3\x38\x02\xfc\x67\xb2\x3f\x31\xe0\x5f\xc7\x72" + "\xa8\xd5\x29\xfb\xf5\x27\x24\xcd\x77\x71\xd8\x7e\xa7\x68\xd7\xf9" + "\xcf\xf5\xe5\xba\x20\xae\x44\xd9\x83\xe2\x94\x87\xd6\x65\x73\x3c" + "\xc2\x56\x70\xfa\x49\xd0\x63\xee\xa2\x01\xfa\xb0\x7b\xc0\xb8\x7f" + "\x2b\x99\x95\x4e\x5b\xff\x38\xe7\x57\x3a\x6d\x7d\x4a\x58\xa7\xad" + "\x4f\x50\x3a\x4d\xd1\x58\xe9\xb4\x75\x57\x94\x4e\x5b\xf7\xb9\xdc" + "\x3f\x04\x9d\xc6\x71\xac\xd7\x74\x9d\x76\xe8\x66\xd1\xce\xba\xc3" + "\xef\x5c\xe7\xd1\x75\xdb\x5e\x84\xb1\xee\x60\x1c\x95\x9e\x7a\x6e" + "\xba\xf8\x1f\x99\xa4\xf6\x67\xf2\xef\x12\xf6\x97\xd1\xa3\xfd\xe6" + "\x7e\xe4\x61\xa5\xe3\xd6\x4f\x0d\xeb\xb8\x75\x2d\xe1\xbc\xac\xe3" + "\xd6\x2f\x52\x3a\x4e\x85\x37\x3c\xc1\x3a\xee\xb9\xe9\x4c\x03\x0d" + "\xbe\x91\xd7\xcd\xb4\xf4\x4c\xc7\xec\x48\x1d\x17\xdd\xbe\xd6\xef" + "\xd1\x75\x1c\xeb\x36\x7c\xd7\x79\x68\xa4\xf4\x71\xce\xed\xac\x06" + "\x34\xd7\xdb\x1d\xf3\x80\xeb\xcc\x7e\xf2\x99\x6e\xf3\x2e\xd0\x70" + "\xcd\x4f\x8d\x56\xef\xf5\x9d\xfa\x99\x4c\xd0\xdf\x13\x6b\x33\xe3" + "\x7b\xd0\x4e\x03\xaf\x6f\x67\x1f\x8e\x6e\xc7\x39\x72\xd7\x0a\x47" + "\x47\xf0\x0c\x85\x76\x3e\x77\x96\xf9\x8a\xf1\xc5\x30\x7e\xb3\xde" + "\x39\x4f\x1b\x6e\x5d\xed\x93\xf3\xf5\x67\xf7\x1b\x11\x57\x41\x3f" + "\x8a\x88\x93\x67\xec\x23\xf2\x4d\x8c\x88\x7b\x98\xe3\x78\x8e\x11" + "\xbf\x69\xa8\x39\x85\xaf\x81\xc7\x3b\xd7\xc1\xe3\x37\xd7\xc1\xe3" + "\x5f\x25\x1e\xb0\xb7\x30\x3e\x4a\xbd\x48\x1b\xb4\xb3\x21\x78\xe2" + "\x96\xb3\x71\x84\x16\x6f\x8a\x88\x8f\x28\x6b\xe3\x5d\x71\xf2\x47" + "\x94\xb7\x71\xd1\x97\xc0\x5f\xfb\x25\xf0\x5f\xf9\x12\xf8\xef\xb3" + "\xee\xe3\x73\x7f\x03\xce\xe8\x74\x59\x41\xd9\xf6\xda\xd9\x77\x14" + "\xd2\xfd\x8b\xb6\xde\x72\xd6\x3e\x4e\x8e\xff\xa4\xbf\xa0\x7d\x88" + "\x97\x7e\x72\xa1\x97\xe7\x6f\x21\x52\x7b\xfa\xf4\x3c\xb6\x84\x58" + "\xdc\x46\x07\x75\xdc\x64\xfc\xf8\x58\xdc\x10\x3f\x31\x22\x7e\x41" + "\x98\xe7\x1b\x5b\xaf\x33\x8f\x94\xe4\xae\x25\x79\x77\xcc\x71\x0c" + "\x5b\xf8\xac\x4f\xcd\xe0\xda\x88\x0d\xf2\xbf\x5e\xae\xed\x68\xe7" + "\x8a\x7b\xa1\xd3\x6f\x67\x3f\xa0\x6c\xf3\x6a\x67\x41\x6e\x41\x3f" + "\x92\xc6\x7e\x62\x78\x3e\x7d\xf5\x40\x9e\xf1\x78\x25\xb7\x1d\x5b" + "\xa7\x9e\x77\xa8\xb9\x47\x2e\x57\x2b\x53\x9e\x93\xf2\x3b\x9f\x4f" + "\xd2\xf3\x30\x6c\x3e\x1b\x04\xfd\x7f\xbb\xf4\xbf\x16\xec\x65\x7d" + "\x7b\x0b\xec\xe3\x34\x55\xce\x1a\x52\xe5\x3c\x9f\xed\xa1\x0d\x15" + "\xd7\x3b\x87\x35\x74\xfd\x9e\xaf\xfc\xfa\xf5\x23\xad\x7e\xcf\xb7" + "\x7c\x49\xfd\xae\x57\xae\xef\xeb\x97\x9b\xa2\x95\x5b\x6a\xfd\xfa" + "\x74\x2d\x2d\xfa\xea\x74\xb5\x6a\x74\x2d\xad\xfd\x12\xba\xc6\x2b" + "\xe7\xc4\x57\x2f\xc7\xa2\x95\x53\x46\xf1\xca\x21\xf9\x37\xa4\x3f" + "\xa1\x44\xfd\xee\x16\xbe\xc7\x48\xdd\xd1\x50\x96\x13\x79\x47\x95" + "\xba\xdf\xa8\xac\x40\xbf\xa3\x2a\x7c\xce\xac\x6c\xcb\xea\x46\xb6" + "\x43\x44\xc8\x43\x65\x95\x3c\x17\x38\x7f\xbb\xf2\x5f\xa8\xe5\x71" + "\x7d\xc9\xdd\x58\x66\xf6\x0d\xcf\x65\x0b\x21\x7d\xc5\xf8\x94\x1f" + "\xc0\xb2\x7f\xe1\x33\x83\x6a\x4f\x91\x74\xfa\xc5\xb0\x30\x86\x2d" + "\x93\xfe\xdb\xd9\xb7\x7c\x9f\x5d\x4b\x7f\x1b\xf7\xa1\x7a\x9a\x72" + "\xd2\xd3\xc4\x9d\x93\xac\xae\xb2\x35\x55\x59\xa3\xce\x37\x2e\x28" + "\x2d\xdd\x58\x3a\xc3\x52\xb6\xfe\xa9\x89\x65\xe5\x85\xe5\x2f\x94" + "\xc9\x83\xf0\x23\x09\x01\x96\xf2\xb5\xeb\x8b\x37\xbe\x50\x9e\xb9" + "\xb9\x70\xad\x3a\x38\x7f\x17\x12\x46\x26\xa2\xa8\x3b\x4d\xd2\xa1" + "\x83\x4e\x09\xa3\xf4\x71\xd1\xcb\x75\x62\x5f\x27\xfa\xb9\xe0\xb6" + "\x74\x22\x1f\xc6\x47\xc0\xb1\xc9\x43\x3f\xf6\xea\x74\x64\xff\x8b" + "\xb0\x93\xd2\xcf\x53\xf9\xef\x98\xf7\xcb\x60\xf2\x36\x28\xbf\x15" + "\xd2\xf7\x80\xbb\x1c\x01\x1d\x94\xd8\xba\x89\xe7\x79\x5f\x98\x1e" + "\x72\x96\x67\x4a\x7f\x92\x5b\x79\xfc\xfd\xc2\x93\xba\x5d\xc2\xeb" + "\x56\x6a\x9d\xf9\xf6\xd9\xe7\xa8\x7c\x2f\x97\xcb\xed\xa6\x1e\xf6" + "\x2f\xc3\x12\xce\xf2\x6c\xb6\x81\xf1\x9d\xe8\x77\xbe\x90\xa9\xdb" + "\xbe\xc0\x37\x49\xa4\x56\xad\xf1\xd0\x0b\x05\xbf\x4f\xf1\x92\x76" + "\x96\x3c\xb1\x5e\x9d\x1b\x37\x23\xed\x8a\xc1\xb4\x4e\xf6\xad\x5c" + "\xb5\x86\xef\x3d\x8b\x4b\xdf\xb4\xc5\xcd\xa1\xfe\xfc\x84\xc8\x3a" + "\x63\xcc\x0e\xfe\x6c\x1a\x85\xba\x8f\x61\x5e\x6b\xfe\x4e\x86\x01" + "\xf7\x4b\xca\xbf\xf3\xe2\x66\x84\x0d\xc3\xbb\x95\x79\xca\x3e\x16" + "\x10\xc7\x7b\x7d\x0c\x1d\x95\x9f\xb5\x1e\x4f\x3f\x07\xb9\x7e\x81" + "\xe7\xae\x33\xd4\xb9\x38\xa4\x47\x19\x6e\xc7\x55\x6a\xb3\x88\x56" + "\x9e\x03\xf4\xd0\xa6\x8c\x36\x8b\x8f\x84\x69\xe5\x59\xce\x87\x76" + "\x91\x6e\xaf\x60\xdb\x07\xe1\xf2\xfc\xdf\xa6\x74\x9d\xe6\xe5\x16" + "\x71\x81\xd3\x0c\x35\x6f\xcd\x7d\xf0\x7e\xd9\x97\x7c\x41\xbc\xc7" + "\xab\x8b\x36\xcd\x8c\xd5\xf7\xe3\x8b\x66\x58\x8a\x0a\xcb\x2d\xeb" + "\xd6\x6e\x28\xb6\x14\xad\x2d\xb2\x6c\xd8\x58\x6e\xf9\xc9\x46\x9e" + "\x40\xe2\x29\xa3\x28\x99\x08\x71\xfd\x36\xe7\x27\xe8\x6b\xe4\x7d" + "\x9b\x4b\x86\xa1\xfe\xa0\xc9\xe6\xd7\xfb\xfc\x25\xc3\xa3\x69\xb2" + "\x59\xf3\xc5\xb5\x09\xe3\xbf\x17\xd6\xa9\xf3\x85\xa6\x1e\x7c\xa3" + "\xfe\x9b\xac\xd1\x6d\x6f\xf3\x1f\xb4\xb4\x3e\x3d\xad\x94\x8b\x3b" + "\xce\x0f\xc6\xed\xd7\xe4\xb1\x41\x9d\x83\x96\x7e\x75\x1a\xe4\x19" + "\x81\xcd\x99\x43\xe6\x61\x5f\x62\x5b\xe9\xe9\x8b\xb4\x39\x55\x38" + "\x37\x15\x68\x32\x94\x18\x72\x2d\x6e\xd1\xe4\x07\x32\xb1\xb9\xe4" + "\x5a\xf9\xd9\xdc\xc6\xf2\x23\xfc\xf9\x89\x72\x3f\x49\x30\x00\x3d" + "\x85\x6f\xf4\xa7\xc0\xfd\x04\xd7\xc3\xb7\x39\x3f\xd1\xfe\xa6\xec" + "\xaf\x3f\xe5\xb5\xd9\xe3\x01\xe9\x0b\x6a\x04\x64\x03\x3c\xda\x7c" + "\x4c\xe7\x91\x9e\x3e\x7e\x1b\x96\xf2\x12\x2d\x63\x92\x9e\x15\x37" + "\x49\x19\x83\x5d\x00\x9c\x8c\xba\x5d\xc0\x7d\x80\x87\x2a\x26\x94" + "\x6f\x17\xc2\xef\xac\xb0\x44\xc8\xc1\xc5\x78\x72\x00\xde\x3e\xbd" + "\x6e\xe3\xd3\xcf\xa1\xa1\x97\x16\x97\x3f\x5d\xc2\xbe\x33\x58\x0f" + "\x48\xc7\x1c\xe3\x8b\x2c\x2f\x94\x15\x3f\x3d\x92\xe2\xa5\x1a\x8c" + "\x8c\xe4\x7f\x4a\x08\xf2\xda\xd7\x97\x9f\xc0\x67\x38\xd4\x99\x8d" + "\x2d\x9f\xf4\x95\x61\xdc\x13\xc5\xf7\x2d\xff\xea\x4e\xb7\xc2\x4e" + "\xb4\x92\xb4\xf9\x41\x33\xb5\x0f\x61\xeb\x77\x99\x0e\x7d\x46\x03" + "\xfa\x83\x8a\x33\xba\x0c\xe0\x37\x64\x7b\xf3\xa9\xf0\x1e\x90\xad" + "\x63\xfb\x8c\x09\x67\x58\xff\xa8\xfd\x26\xe7\xa1\x07\x92\x1b\xce" + "\xd1\x96\x6c\xe6\x69\xbd\xec\x4f\xb6\x8c\xd5\xf3\xec\x1b\x3c\x47" + "\xbd\x65\x97\x2e\x27\x11\x79\x46\x71\x98\x1a\x3f\x57\x4c\x67\x9e" + "\x0b\xc5\x7b\xb3\x9e\x0e\x74\x15\x0d\x52\x8f\x6c\xb1\xc5\xea\x86" + "\xdf\xa7\xf0\x9a\xbb\xc2\x47\xca\x5f\xca\x62\x97\xf4\xcb\x02\x1b" + "\x0f\xb0\xb7\x6b\xfb\x5f\x4e\xc9\x3e\xbd\x02\xb0\x02\x0a\x16\xca" + "\x5a\xa5\x97\x25\x52\x17\xbb\x1a\xa4\x9c\x6d\x39\x15\x9e\x93\xdc" + "\x52\xc9\x63\x73\xd1\x97\x3f\x0c\xfc\x3c\x26\x65\x0b\xbf\xcb\x6f" + "\x55\x3e\xe2\x58\xde\xb8\x9e\x2c\x57\x61\x99\xda\x9a\xa2\xf3\x9b" + "\xeb\x8c\x7c\x6d\x16\xe9\x47\x78\x6b\xa6\x4e\xcb\xa1\x7c\xd9\xc8" + "\x76\x9b\x02\x5c\xfc\xaa\xed\xca\x71\xa5\xf2\x5f\xc4\xe7\x68\x4c" + "\xc0\xb1\xa5\x9b\xb6\xdd\xcf\x67\x03\x92\x03\x3c\x4e\x5b\xdc\xc2" + "\xbe\x19\xd4\x59\xf7\xad\xbb\x01\xbf\x32\x7c\xf6\x7d\x2b\xfa\xff" + "\x8a\x4a\xc5\xbb\xad\x4d\x11\x6d\xcf\xab\xed\x37\x18\xce\x34\x62" + "\x7d\xe6\xae\x58\x20\xdb\xab\x3a\x57\xbc\xf5\x94\x9e\x4f\xfa\x31" + "\x08\xaa\x3e\xf1\x22\x6d\xe5\x79\x1e\x2f\xe3\x07\x5a\xdb\xb8\x7c" + "\xae\x1f\xf7\xb9\x52\x6e\xd2\xf9\xae\x95\x6d\x49\xd1\x38\x6c\x1b" + "\xab\xc3\x52\xb0\xb7\x4d\xd0\xbf\xd9\xaf\x99\x87\x2a\x5b\xda\xc6" + "\xa2\x4d\xf9\x64\x1d\x6e\x68\x43\x97\xda\xe6\x93\xe9\x56\xe8\x34" + "\x44\xb8\x03\xdf\xb0\x7f\xca\x4b\xd4\x9a\x53\xd5\x1a\xa5\x8b\x2a" + "\x8f\xb2\xcf\x2c\xbb\x85\xfd\x1e\xce\x54\xfa\x46\xfa\xea\x91\x71" + "\xcf\x6b\x6d\x76\x04\x9f\x41\x92\xfb\x6e\x7c\x41\xa9\x1b\x94\x6f" + "\x07\xc4\xa3\x8d\xf8\xd5\x7d\x4f\x23\x34\xdc\xda\x07\xcb\x80\x4c" + "\xb4\xc9\x35\xce\x6d\x2d\xca\x57\xca\xf0\x53\x88\xef\xd1\xf9\xb7" + "\xeb\x20\xc2\x00\x13\xf9\x12\xdb\xa4\x2f\xb2\x4a\xb3\x8e\xaf\x16" + "\x67\x94\xf2\x20\x69\x50\x39\xd8\xfe\xfb\xd2\x64\x5a\xab\x5e\x8e" + "\x4c\x8b\x74\x9c\x9e\xef\xfc\x44\x5c\xee\x20\x1c\xe5\xa3\x25\x91" + "\xcb\x69\x6b\x94\x71\x25\x61\x5d\xb5\x4d\xae\x19\xc9\x7d\x71\xa8" + "\x87\x77\x5b\xc9\x08\xc9\x03\x0b\xf1\x3d\x24\x66\x86\xa7\x64\xb1" + "\xb2\x4e\xcf\x63\x32\x30\x1d\x2b\x0f\xeb\x65\xeb\x30\x18\xff\xeb" + "\xea\x3c\x55\x17\x33\xb7\x11\x4e\xcb\x70\xa5\x4c\xc8\x3b\xbe\xb6" + "\x4f\x93\x32\x28\xeb\xb9\x3d\x31\x92\xd7\xca\x16\xdb\x3e\x36\x42" + "\x1e\x80\xcf\xf6\x41\xfe\x7b\x68\x7b\x81\xea\x4b\xb6\x67\x47\xe0" + "\x98\x8d\xef\xbc\x30\x1f\x24\x8f\xf8\xde\xa7\xb8\xf7\x28\xca\xb6" + "\x82\x34\x21\x21\xf1\x64\x7e\x60\x2c\x36\x9d\xda\xa0\xf7\xb8\xad" + "\x80\x26\x8c\xe3\xc7\x2c\x57\x80\xdb\x1c\x2d\x9b\xdb\x5b\x22\xf0" + "\x35\xb0\x5e\x47\xd8\x09\x3d\x0d\xf0\x93\x7b\x59\x74\x7a\x22\xae" + "\x67\x90\x8f\x53\x64\xda\x80\x8e\xe7\x97\xf4\x19\x1a\xad\xaa\x26" + "\xab\x32\xaa\xac\x7a\x19\xf8\x3d\x13\x6d\xe0\x1a\x5b\xf5\xa9\x2d" + "\xe5\xc5\xca\x79\x12\x77\xf2\x85\x4f\x3f\x57\x5c\x34\xc1\x52\xf8" + "\x0c\xbb\x59\x2a\x5b\x57\x5c\x6c\x93\x8b\x44\xd1\x76\xe0\x18\x59" + "\x1e\xe8\xa0\x6c\x59\xfb\xaf\x5f\x53\xfb\x63\xb8\x5d\x70\x7b\xf7" + "\x72\x7b\x3f\x5e\xf9\x85\x1c\x9b\xb8\x1d\x53\xc8\x1d\x10\x0e\xb6" + "\xdf\xa5\xee\xe3\xfa\xa7\xfb\x54\x3f\x00\x7e\x72\x1f\x09\xdc\x3a" + "\xa3\xe9\x55\xd5\x13\xdd\x96\xab\x02\xf1\xf5\x44\xd5\x9b\x52\x4f" + "\xb8\x94\x5c\xb0\x7e\xe2\xb3\x05\x0c\xd7\xef\xb4\x4f\x88\x86\x69" + "\x9f\x19\xd6\x51\xf6\x1c\x5d\x47\xa9\x7e\xc2\xbe\x0e\x7d\x90\x4b" + "\x95\x65\x2f\x0a\xcb\x8d\xbd\x4b\xc9\x8d\xbd\xc2\x43\xd5\xa7\xf5" + "\xb1\x8a\xea\x3b\xaa\x72\xd8\x7e\x64\x9d\x8e\xf8\x5a\x1d\x5e\x4d" + "\x1a\xf7\x1b\xf6\xe6\x6b\xed\x07\xfb\x0a\xb6\x1f\x78\xdf\x23\xd3" + "\x02\xb8\x26\xaa\x76\x63\x3f\x1d\xa1\x7f\x52\xf0\xdd\x15\x8f\xd7" + "\x4f\x71\x77\x3c\x91\x97\xf3\x26\x3e\xbd\xa1\x7c\x16\xbb\xc0\x2a" + "\xae\xb0\x15\x3f\x5d\x5e\x5c\x14\xbb\x8e\x97\xa9\xdb\x62\xbc\x86" + "\x5e\x83\x76\xef\x4d\x65\x7a\x38\x50\x7f\x67\x91\x5e\x07\xa9\xa7" + "\x60\x3b\x6a\x3a\x2e\xa9\x9b\x9c\x93\x1b\xe4\x3e\x40\x47\x91\x2e" + "\x27\x9c\x6e\x5e\x85\x08\x21\x0c\xf5\xaf\xb2\x69\xe3\x25\x8c\x49" + "\x1d\xbb\xf5\xef\x70\x7e\xc7\x49\xd9\xf7\x1d\x94\x7b\x06\x41\xd3" + "\x1d\xb9\x11\xf6\x16\x7f\x67\x68\xdf\xd2\xcf\x13\xfb\x24\xeb\x25" + "\xc7\x59\x45\x5f\x07\xf8\xbf\x5d\xd3\x15\x4e\xb5\xef\xe6\x20\xd1" + "\xbb\x55\xde\x84\x06\xb9\x9e\xe0\x08\xe8\xe5\x21\xff\x99\xc8\x32" + "\xb9\xdf\x8a\x85\xe7\x21\x87\xf4\xe1\xbe\x53\xfa\xa8\xdb\x31\x35" + "\x0e\xae\x2d\x91\xe9\x90\x26\x1f\x69\xcc\x7a\x9d\x97\x57\xc8\xb0" + "\x75\xd7\xa9\x63\xaf\x56\x47\xd6\x9b\xb2\x7c\x96\x7f\x0d\x87\x13" + "\x9a\xdf\x13\x0f\xdf\x91\xc8\xf8\x4b\xff\x6b\xe9\xdc\xae\x77\xb4" + "\xa2\x3f\x9b\xaa\xd7\x83\xeb\x78\xb4\xca\x6b\xd6\xfd\x5e\xa9\xfc" + "\x3b\xde\x8b\xc1\xcd\x17\x91\xa7\xa7\xf5\x0e\x5e\x2b\xd8\xb1\x57" + "\x38\xed\x3c\x8e\x61\xbf\x57\x89\x35\x83\x72\xe8\xb4\x5c\x2b\x77" + "\x3b\xf6\xb0\xdc\x45\xca\xd2\xda\x29\x4f\x43\x92\xca\x8a\xcb\x67" + "\x48\xeb\x1e\x86\x1d\xbb\x55\x2b\x2c\x5f\xbb\x71\x43\xd9\x04\x4b" + "\x59\x51\xa1\xd6\xe8\xa3\xda\xbc\x53\x8e\xdd\x7d\x7a\x3b\x43\x59" + "\x7b\xc2\xba\xc5\x19\x96\x7f\xde\x03\x26\xef\x66\x76\x9e\x55\xed" + "\xc9\x79\x34\xa2\xed\xca\xfc\xdc\x46\x1b\xa4\xcd\xe6\x8c\xec\xff" + "\x79\x6c\x3c\xe2\x22\x39\xb7\x6b\x34\xf5\x29\x1a\xef\xbc\x4b\xd6" + "\x53\xfa\xfb\x72\xce\xe4\x7a\x4a\xff\x32\xd2\x3e\xdb\x99\xa2\xd7" + "\x37\x3c\x6e\xd8\x99\x29\xed\x28\xcd\x5e\xbb\xde\xb8\x3c\x6c\x9f" + "\xee\x6c\xd3\xe6\xdc\x3a\xf5\x31\x9e\x6e\x5f\x03\x97\x22\x65\xab" + "\xee\xdc\xbe\xac\x52\xf4\xaf\xae\x60\x3f\x78\xcc\x83\x9d\xef\xeb" + "\xb6\xa5\xdc\x1f\x78\x60\x71\x2d\xf0\x69\x8c\xd4\x13\xc2\xf4\x5c" + "\xa7\x66\x23\xd6\xaa\xb1\xeb\x0d\xff\x70\x0e\x65\x01\xb7\xc4\xeb" + "\xe0\xc6\xf5\x82\xfe\xab\x69\x62\x38\x6c\x5f\x8b\xbe\x74\xed\xbe" + "\xc9\x5d\x07\xa4\xbd\x0b\xd8\x5e\xf0\xd6\xef\xdc\x05\xfb\x6f\xa7" + "\x94\x8d\x10\x64\x94\xf7\x06\xf9\x74\x1b\x89\x76\xcd\xe2\xbe\x08" + "\xbf\x21\xb7\xbb\xb4\x33\x89\xbb\x5c\xde\xb2\x4c\xea\xeb\x4b\x37" + "\xf6\x95\xe5\x9b\x79\xbe\x80\x69\xe1\xae\x0b\x90\x92\x9f\x5d\x90" + "\x17\x47\x4a\x24\x3c\x0d\x16\xd3\xd4\xcc\x78\x88\xb2\x74\x23\xcb" + "\xb7\xbc\x9f\xb0\x2f\x13\xb6\xf0\xae\x4c\x51\x96\x69\x1c\xc2\xb7" + "\xd7\xf5\xea\x99\xc4\x77\x3c\xf2\xdd\x9c\xac\xaf\xd4\xfd\x01\x2f" + "\x5e\x78\x4d\xcd\x0d\xe8\xe5\x7e\x2e\x8c\xef\xc8\x7e\x65\x9f\xec" + "\x57\x04\x29\x7f\xec\x2f\x4a\x5f\xf9\xa3\x6d\xef\xc8\x7b\x55\xb5" + "\xf3\xdf\xde\x36\x5b\x50\xde\x95\x67\x2f\x67\x3b\x2d\xc8\xeb\x54" + "\xf2\x7c\xf3\xf1\xf2\x20\x2d\x0f\xb0\x4c\xbe\x98\xcd\xbe\xe8\x7d" + "\xd2\x5e\x78\x31\x57\xf7\x3f\xcf\xf7\x46\xf2\xbd\xa3\xa8\x97\x89" + "\xf9\x6e\xb1\xf3\xdd\x01\x2f\xf1\xbd\xac\xa4\xc6\xe3\xe9\xb4\x0f" + "\x36\xbd\xe2\xc1\x8b\xaf\xf3\x3d\xae\x6a\xac\x70\x0e\x7c\x31\xfd" + "\xf5\x1c\xbd\xf8\x2b\xb5\x56\xad\xeb\x89\x97\xc6\xf3\xde\x77\x8f" + "\x06\x03\x65\xa1\xff\xdf\xa9\x7c\x84\x72\xdf\xe9\xd7\xf9\xf9\xe2" + "\xeb\xd7\xce\x6f\x84\xe1\x79\xe8\xc5\x1a\xcd\x2e\x20\x35\x77\xf5" + "\x7b\xc0\x7a\xc9\xac\xcf\x5d\x85\x6d\x9f\x97\xd2\xf5\xb9\x2b\xe5" + "\xdb\x7a\xd7\x19\x2e\x7f\xa8\x39\x22\x61\x7f\x9c\xe5\x3e\x91\x6d" + "\xb8\x21\xed\x09\xf4\xef\x8c\xbb\x6e\x17\x2a\xfe\xbc\xf4\xb7\x6c" + "\x1f\xb6\x55\xaa\x71\x6d\x9f\xba\x63\x12\x36\xc0\x4b\xc7\x54\x5f" + "\xf6\x52\xa3\xde\x97\x21\xef\x51\x4d\x57\x68\xfd\xdc\x4b\x83\xe3" + "\xdf\xf8\xfb\xfe\x5f\x3a\xa3\xd3\x48\xa7\xb9\xa2\xd1\xcb\xd3\xfa" + "\xd2\xe6\x24\x85\x69\xfb\xb2\x5c\xbb\x88\x88\x5f\x1f\x41\x7b\xfe" + "\x5e\xa7\xf4\xe6\xcb\xe8\xff\x77\xd5\xa9\x3e\x45\x85\x89\xb4\xaa" + "\xa7\xf9\xce\x58\x45\x83\xb5\x72\x6e\xc6\x6b\xcf\x04\x6e\x2f\xe7" + "\x7b\x0c\x69\x79\x4a\x97\xbd\x8c\xfe\xef\xa5\x15\x5a\x3e\xc9\xff" + "\x48\x7c\x1f\xdd\xf0\xdc\x86\x8d\x9b\x37\xf0\x84\xda\x0b\x65\x96" + "\xa7\x37\x16\x15\x8f\x8c\x33\x1f\x92\xce\xf7\x45\xfb\x6a\x06\xfd" + "\x5a\xbd\x6a\xe3\x7d\xfa\xea\x4e\x84\x57\x9f\xb7\xdc\xc9\xf2\xf5" + "\xf2\xc7\x3c\x57\x20\xef\xa6\x60\x1f\xae\x6a\xde\xa0\x87\xf3\x2b" + "\x5a\xbf\xfa\x64\xdf\xe6\x12\xcd\xc6\x7a\xf5\x56\xa6\xa3\x36\xe6" + "\x10\xdd\xb4\xfb\x61\xbd\x1f\x62\xfc\xa4\x6d\xde\x9f\x29\xf5\x62" + "\xa8\xbf\xc4\x2c\xe9\xd5\x9f\x89\xfe\x66\xb7\xd5\x63\x48\x9d\xa0" + "\xea\xb5\x7b\xa6\x4e\x0f\xae\x3f\x6c\xdd\x44\xbf\x58\x0b\x19\x7d" + "\xd5\xa6\xc1\x62\xfd\xc9\xb0\xcd\xfa\x3e\x71\xf6\x55\xda\xba\x89" + "\xfd\x14\xbf\x32\x2b\x74\x80\xf5\xcd\x6e\x87\xae\x97\xb8\x2f\x0a" + "\x01\xce\x87\x97\xbd\x09\x68\x37\x73\x90\xf7\xe6\x73\xf4\xca\x09" + "\x75\x9f\xc1\xee\xc3\xd1\xf7\x19\xbc\xb2\x1b\xcf\x09\xed\xe9\x8d" + "\xf8\x7d\xbd\x47\xcf\xd3\x12\x11\x96\x18\x93\xa6\xd7\xef\x7c\x65" + "\xcc\xa0\xbd\xa2\xfc\xa5\x6a\xfe\x95\xf9\x6e\x8e\x57\x1e\x66\x9f" + "\xa4\x61\xd9\xd8\xfd\x82\x66\x83\xf4\x30\xed\xb8\xbf\x45\x1a\xb9" + "\x97\x1b\x34\x79\x9a\xe7\x68\xb9\x4e\xc2\xbf\x16\x32\xf1\xca\xba" + "\xb0\x1c\x28\x1a\x21\xcc\x11\xb6\x53\x5e\x59\xc1\x79\x22\xe9\x80" + "\x32\xe6\xa8\xb1\xe9\x2b\xcd\x7a\x9f\xcd\xfe\x58\xd5\xfd\x16\xaf" + "\x8c\x39\x5a\xd5\x83\x31\xff\x2b\x6d\x11\x30\xc6\x68\x73\x11\x66" + "\x61\x7c\xb9\xa2\x41\x8e\xd9\x5e\xe9\x0a\xcf\x09\xbc\x32\x86\xf5" + "\xae\x84\x91\x56\x65\x73\xfb\xe4\xbd\xcc\x06\xfd\xee\x75\xbf\xf3" + "\xd5\x14\xdd\x46\xd1\x61\xb5\xa9\x39\x27\xe9\x43\x13\x6d\xd0\x85" + "\x34\x53\x07\xe7\x63\x11\x36\x38\x06\xac\x40\x3b\x96\xb6\xf7\xab" + "\x2b\xc2\x63\xbd\x97\xa5\x8f\x5d\x39\x0e\x54\x70\x30\xce\x7a\x35" + "\x27\x76\xdc\x06\xfb\xc1\xb2\x76\xc3\x5a\x98\x0f\x3f\xb1\x6d\x9c" + "\x85\xa1\xc3\x4f\x6c\x6b\x67\xf1\x96\xb2\x25\xf3\x17\xc9\x37\x1a" + "\xc7\xac\x38\xf3\xc7\x83\x77\x2f\xf3\x9c\x11\xc6\xb9\x3c\x77\xea" + "\x57\x77\xaf\x0e\xd7\xde\x89\xda\x7b\x18\xfa\xbd\x56\xc8\xfd\x25" + "\xbe\x5b\xc7\x43\x3f\x4d\xd4\xee\xbb\xd5\xfb\x6c\xe8\xf2\x57\x2f" + "\xe8\xeb\x64\x72\x8f\x3d\xfb\x49\xe4\xbb\x95\x77\x3e\x77\xd6\xef" + "\xfc\xe9\xe0\xfc\x87\x9a\x5f\x54\xeb\x5e\x08\xcf\xd6\xc3\xf5\xf9" + "\x58\x84\xad\xd0\xe7\x5e\x55\xda\x9f\x16\x85\xf3\x46\xcd\x6d\x8f" + "\xd1\xd7\xd7\x90\x66\xb7\x4e\x33\x1d\x8e\xdd\x22\x2e\x6a\x76\x92" + "\x49\xda\xd5\xce\x57\x2b\xa5\x6f\x52\xb6\xc5\xe5\x3c\xf3\x4f\x8f" + "\xe9\xe5\xf0\x18\x81\xf1\xd6\xd6\x6e\x64\xbb\x67\x1f\xa4\xca\x87" + "\xe9\x4f\x07\xf9\x1f\xbd\xc6\x11\x7f\x7d\xa3\x7f\x93\x68\x0b\x5e" + "\x16\x2d\xfb\xfe\x88\x36\xfb\x0c\x51\x70\x93\x38\xd2\x7f\x59\x1c" + "\x65\x5a\xef\x7b\x8a\x68\xef\x9f\x89\x06\x4c\x2b\x3f\xbd\x0a\xba" + "\x2f\xbd\x14\xba\xc8\xf7\xeb\x35\x20\xdd\x52\xdf\x67\xa2\x1e\x79" + "\x96\xda\xc4\xc5\x7a\xa4\x5b\x72\xe1\xa2\x38\x84\xb4\x4b\x4a\x50" + "\xef\x4d\x22\x38\x60\x7a\xee\x53\xcb\x63\xac\x87\xf6\x54\x78\x0f" + "\x2c\x0c\x0a\xa7\x71\xbf\xd8\x79\xcf\xdd\x7e\xe7\x9e\x5d\x83\x77" + "\x7a\x01\x2e\xd3\x68\x59\x05\xff\x7e\xee\x53\xd4\xe9\xd3\xd5\xe8" + "\x43\xc1\x83\x4f\x91\x0e\xe3\xff\x32\xa9\x6f\xbc\xa6\xbb\xd3\xf0" + "\x64\xc6\xd3\xfb\xc0\xb5\x6d\x60\x93\x68\xd9\xbf\x0a\xf8\x9f\x07" + "\xfe\x97\xc5\x11\xd4\xe1\xe8\xbe\x6e\x22\xc6\x7f\x80\x61\x0e\x90" + "\x69\xf5\x16\x43\x6a\x03\xe2\x57\x57\xa4\x50\x03\xd2\xae\xf2\x51" + "\x6a\x3d\xd2\xac\x7a\x3e\x95\x24\xfe\xbd\xc0\x3b\x75\x61\x70\x00" + "\x65\x33\xfe\x7e\xe7\xde\x09\x3a\x9e\x7a\xf9\x8c\xaf\x2e\x83\xab" + "\x79\xbe\x2b\x6d\x4e\x2e\xe3\xad\xe6\xf0\xf7\x16\x7b\xcb\x4a\xc8" + "\x6b\xba\xe7\x6e\x0f\xed\x75\x70\x1b\xe2\xfa\x78\x21\x53\xda\xb9" + "\xb7\x4f\x75\x1a\xa8\xf1\xe4\xde\x3d\x7a\xfd\x22\xeb\x95\xb7\xb1" + "\x54\xce\xa3\x16\x3e\x5d\xbe\x76\x53\x21\x46\x67\x23\xc9\xc6\x41" + "\x72\xfc\x56\x5c\x64\xd9\xb8\xc1\xf2\x4c\xe1\xda\x75\x1b\x37\x15" + "\x97\x4e\x90\x43\xee\xb2\xe2\x0d\x45\x3c\xbd\x5a\x5a\x58\x6a\x1b" + "\x19\x63\x73\xbb\x16\x06\x79\x3f\x22\xeb\xb2\x6e\x72\xed\xd5\xe6" + "\x16\x03\xc2\x99\x2d\xc7\x6e\xaa\x1d\xec\x9b\x63\xd9\x9a\xcd\xf1" + "\x3b\x54\x5f\xe3\xda\x23\xaa\xe7\x2c\x11\x42\xde\x09\x6d\xb8\x48" + "\xae\x2d\xb2\x9e\x7d\x39\x3a\x1c\xb9\x47\x5f\xda\xac\x1c\xde\x9f" + "\x43\xe1\x3d\xe5\xae\xbd\xc2\x88\x3a\x82\x06\x9a\xdd\xda\xae\x9d" + "\xed\xfb\xa7\x73\xe4\x2a\x46\xbd\x79\xed\xe0\x94\xb4\x0b\xe5\x19" + "\x24\xd7\xa3\xb0\x7b\xdb\x85\x73\x58\x12\xd3\x65\x9f\x1a\x57\x1a" + "\x93\x0d\x7c\x4f\xec\x39\x3e\x0f\x69\xe5\x35\xc2\x06\x67\xc8\x1a" + "\xde\xd3\xb3\xb7\x96\x6d\x5c\x39\xd7\x2e\xdb\xc5\xbe\xd3\xba\xbc" + "\x1b\xf9\x8c\xc9\xce\xdb\x66\x28\x5d\xbd\x4f\xae\xff\x83\x6f\x33" + "\x14\xfe\xf2\x7e\x6a\xf4\x4f\xfb\x3f\x47\xfd\x96\x0a\x7b\x8e\xe6" + "\x57\x7e\xff\xe7\xa1\xb4\x63\x34\x50\x96\xae\xdd\xe9\x3e\xe7\x99" + "\x50\xf5\x9c\xc7\x06\xd0\xaf\x87\x60\xab\x8a\xea\x63\x3b\x07\xaa" + "\xe7\xe4\x85\x36\x67\x1a\x59\xbf\xdb\x2b\x40\xbf\x8d\x25\x23\xc5" + "\x67\x25\x37\x0c\x6c\xce\xe4\x7d\x98\xf9\x42\x20\x6f\xda\x9c\x12" + "\x79\x37\x6f\xf5\x9c\x27\xb4\xef\x67\xf9\x3b\x04\x5b\x0d\x61\x36" + "\x7c\x97\x86\x44\x44\xfa\xe8\xb4\xe5\xfc\x9d\x6c\x90\x7b\x08\xf9" + "\x8e\xe9\x99\x5c\x77\xbd\xce\x72\x8c\xc0\xf3\x14\x83\x75\xdb\xdf" + "\xab\x87\xb3\xed\xaa\xec\x48\x7a\x1a\x34\x26\xa5\xd3\x06\xd3\xfd" + "\x41\xa7\x81\xa4\x6d\xf5\x1c\xd8\xac\xae\x3d\xf2\x9e\xfa\x9d\xdf" + "\xb9\x5b\x18\xf7\x7e\xc0\x7d\xc7\xb2\x01\xb9\x96\x45\x6a\xed\xc3" + "\x95\xa1\xd3\x93\xf7\xca\x73\xff\x01\xbe\x65\xae\xf6\xd2\x48\xd5" + "\x7e\x5d\xf3\x23\xc6\x28\xbd\x42\xca\xfb\xfe\x33\xb2\x5c\x63\xe2" + "\x4e\xf5\xbd\xaf\x46\xf5\x77\x2e\x9b\x9e\x16\x61\x15\xca\x26\xdd" + "\x37\x9f\xc7\x6e\xbc\xb6\xc5\xbf\xeb\x87\x38\xc7\x59\x55\x27\x04" + "\xeb\x42\xd6\xcd\x96\xdb\x88\x3a\x7c\x6c\xb7\xbb\x4e\x1c\xaf\xf3" + "\x91\xe4\x5f\xda\x9c\x25\x7d\xa2\x84\x60\xaf\xc4\xb5\x53\x39\x4f" + "\x37\x1d\x48\x94\x36\x38\xe4\x39\x04\x79\x46\x9e\xa5\x2c\xaf\x55" + "\x97\x18\x8f\x03\x39\x6d\x95\x3d\xec\x67\x1e\x72\x78\x20\x87\x69" + "\xc3\x7d\xc3\x3e\xa7\x3c\xc3\x27\x75\x70\xeb\xa6\xa9\x0c\x63\xda" + "\xe8\x00\x99\x3b\xa0\x41\x41\xef\x80\xad\x8a\x52\xcf\x23\xbd\xb9" + "\x9c\x12\x79\x7c\xf4\x55\xd7\x91\x51\xde\x2e\x45\x93\x03\xbb\x74" + "\x1b\x08\xbf\x5d\xd1\x67\x55\x0f\x54\xc4\xae\xa5\x3d\xb5\x71\x63" + "\xf9\xea\xd2\x62\x7e\x65\x8e\x7f\xe1\xae\xd8\x3e\x31\x49\xdd\xeb" + "\x73\xa0\x99\xf9\xc7\xfd\x84\x3a\xf3\x71\xa0\x27\x62\x5c\xcb\x73" + "\x6b\xb3\xb9\x7f\xe3\x35\x71\xbf\xb3\xda\xfc\xbb\xca\xed\x52\x4e" + "\xce\x26\x92\x31\xb6\xbc\x67\x0a\xcb\x0b\xd7\xcd\x50\xcb\xb7\xd7" + "\x96\x53\x9d\x1e\x5d\x4e\x75\xde\x60\x39\x6a\x0c\xe2\x93\x6d\xf0" + "\xc0\x31\x9b\x48\x7d\x2f\x45\xe9\xb9\xea\x72\x7d\x4f\x56\x7c\xdf" + "\x18\x73\xda\x06\xaa\xed\xad\xcc\x2f\xfb\x76\x32\xfe\xdd\xd6\x4e" + "\x23\xdb\x5f\x55\xf8\xcd\x7b\x56\xe4\x3c\x9f\x76\xe7\xde\x6f\xbf" + "\xe8\x84\x9e\xad\x6e\x17\x07\xe6\xc0\x06\xaa\x1e\x72\x9f\x49\xe4" + "\xb9\x62\xb5\x46\x59\xed\x19\x2a\xad\x70\x2d\xd6\xc6\x65\xaf\x4d" + "\x93\x6b\x65\xb7\xd1\xcb\xe7\xe8\xb5\xc9\xe6\x74\x8c\xe3\x6e\xa3" + "\x5f\xe0\xb7\x1c\x2f\x70\x5c\x14\xaf\xbf\xdb\xdb\x68\x86\x74\x42" + "\x4a\x0d\x42\xfd\xc1\x08\x53\x7f\x26\x3c\x46\x61\x90\xbb\xf3\x4d" + "\xa0\xf0\xf0\x61\x66\x4a\x1e\x9d\x94\x78\xfb\xf7\xc6\xa6\xcf\x7e" + "\x60\xe6\x74\x7b\x55\x65\x85\x08\x05\x03\xc9\x22\xf2\x7e\xc8\xa6" + "\x96\x47\xef\x72\xa8\xbe\xe2\x40\x53\x4b\x3c\x5c\xf7\x3a\x85\x8d" + "\x6d\xeb\x50\xda\x3f\x7a\xec\x2f\x90\xf1\xc3\xab\x1e\x23\xdb\x72" + "\xdc\xff\xb8\x83\x7f\xc2\x98\xe0\xb5\xdf\x7d\x84\x30\xd4\xbf\x42" + "\xb8\xfe\xd1\xa3\xce\x5e\xd4\x18\x42\xd5\xff\xe8\x09\xc3\x37\x13" + "\xc3\xc7\x78\xc1\xd8\x54\xd5\x63\x74\x9b\x1f\x20\xb7\xc5\x47\x1f" + "\xe1\x77\x5c\x5a\xa2\x4c\x9e\x9b\x62\x18\xd0\xc3\xbb\xed\x57\xa0" + "\x9f\x2b\xe4\x3c\xb1\xf1\x22\xd5\xdc\x7f\x64\x88\x7c\x72\xad\x27" + "\x6d\xe1\xdf\xf8\x9d\x35\xe0\xff\x43\x13\x34\x7b\x08\xf6\x5a\xcd" + "\x2e\x5d\x27\x20\xfe\x57\x6a\xbe\xba\xa6\x56\x4f\x13\x97\x47\xaf" + "\xf2\x1e\x4f\xd1\xca\x7c\x15\x97\x7b\x7a\xd8\xc7\xdc\x10\x73\x02" + "\xf3\xd1\x3f\x7f\xc2\xed\x78\xd4\x8e\x94\x61\xa3\x77\x58\xd7\x9f" + "\x40\xab\x1b\xd5\x7b\x13\x8d\xf6\x3d\xc9\x38\x53\xdd\x41\xb9\xcf" + "\xb8\x87\xd7\xa9\x92\x0d\xd6\xb5\xc9\x3b\xac\x85\x03\xce\x99\xf7" + "\x72\x3f\x99\x5c\xb1\xc8\x90\x1c\x9c\x63\x08\x3a\xa7\xde\xdb\xa0" + "\xee\x64\xf1\xb9\x6e\x16\x9d\xc8\x73\x06\x79\x3c\x78\xba\x90\xef" + "\x44\x37\xbd\xfe\x38\xde\xed\xc9\x06\xd1\x90\x0c\x4e\x4e\x72\xc8" + "\x3b\x2a\x59\x47\x9f\x10\x69\xb0\x31\xfb\xe5\x5c\x40\x42\x78\x2e" + "\xe0\xf5\x4a\xf0\x6d\x58\xee\x8b\xe2\x23\xc0\x6a\x1f\xb8\x1c\x6a" + "\xaf\xbf\x48\xa4\xcd\x79\x9f\x46\x1b\x3d\x3d\xa1\x86\xd2\xb5\xbd" + "\xa2\xc6\x13\xc1\x76\xd6\xc5\x7c\xb6\xba\x0d\x65\x1e\xc3\xd3\x62" + "\xd9\x40\xa6\x8b\xf4\xfa\x49\xb6\x3f\xc2\x36\xec\x1b\x0b\xb4\xf1" + "\x48\x6b\x16\xf2\x6f\x5f\xcf\x32\xd1\x63\x0c\x02\x3e\x6c\xfe\x76" + "\x77\x49\xbb\xdc\x0b\xc3\x7b\xb1\x39\x0d\xca\xc8\x74\x07\xda\x29" + "\x24\xd2\x8d\xf8\x6e\xe1\xbd\x85\x02\x69\x3b\x2a\x3a\xa9\xc3\x16" + "\x80\x8e\x3d\x01\x1b\x38\x33\x03\xf8\x48\x78\x88\x3f\xfd\x21\xf8" + "\x6b\x81\xbd\x07\x78\xa7\x78\x6f\x0d\x9f\x51\x16\x65\x99\x77\x22" + "\x7f\x1b\xc6\xd0\x46\x86\x7f\x91\x0e\x7e\x2c\xfa\x32\x33\x27\xf5" + "\xaa\x3b\x1b\xcf\xd1\xc1\xc3\xc0\xb3\x3b\x02\xcf\x69\xc0\xdf\x0c" + "\xbd\xda\x0a\x98\xc7\xc4\x26\x94\xd9\x85\x32\x31\x1e\x81\xfc\x66" + "\x60\xbc\x6b\x66\x9c\x3b\x18\xdf\x8a\x01\xde\xff\x6a\xde\xff\x05" + "\x99\xd1\x16\x5a\x1b\xf0\x46\xfd\x8f\xc2\x26\x1b\xeb\x77\x1e\x6c" + "\xd5\xcf\xb9\xb3\x2d\x81\xef\x53\xba\x2c\xed\x45\x1a\xe0\xd8\x02" + "\xbc\x8e\x8d\xea\x25\x1e\xe3\x24\x40\x4e\x13\x50\xee\x70\xf0\xaa" + "\x05\xb4\xfb\x5b\xd0\xfa\x18\xd7\x29\x74\x39\xd4\x13\x02\xbc\xfd" + "\x97\x81\x53\x59\xba\x39\xa9\x8b\xef\xb4\xf6\x0b\xd0\xfb\xf4\xb2" + "\x0a\xbf\xe0\x7d\xb2\xa8\x33\xd3\x7b\x2f\xea\x6a\xf6\xd0\x1b\xeb" + "\x78\xbc\xd1\x4d\x07\xcb\xd5\x9d\x93\x07\x2b\xb4\x35\xad\xd3\x6a" + "\x9e\xe9\xf5\x93\x4c\x7b\xae\x57\xd2\x8e\x94\x97\xdc\x3d\x5e\x4a" + "\xea\xba\x09\xfd\xdb\xeb\xde\xba\x10\xdb\x28\x6f\x0c\xce\xff\x0f" + "\xd1\xc6\x02\x6e\xe8\x97\xd0\x65\xd1\xc3\xb6\xa7\xda\xef\xf2\xc6" + "\xe1\xd5\x15\xa6\x6c\xd8\x99\x46\xe0\xc9\x67\x35\x6e\x46\x3f\x3d" + "\x9b\xf7\x33\x01\x3f\x8c\x3b\xde\x38\x71\xbd\xbb\x5e\x41\x9f\x74" + "\xa4\xf1\x02\x77\x79\xa7\x1f\xdf\x85\xa9\xe6\x7a\x6a\xcd\xba\xbf" + "\x01\x71\x59\x54\xee\xaf\x92\xe5\x3a\x76\x6d\x92\x65\xf0\xfd\x9f" + "\x3d\xe5\x16\x71\xb6\xcd\xe2\x1d\xf2\x4c\x77\xc4\x3e\x1e\xaf\x76" + "\xa7\x98\x5c\xd3\x8c\xde\xc7\x53\xbb\x2e\x62\xdc\xc8\xeb\x9a\x0e" + "\x5e\xbb\x55\x7e\x61\x6a\xe5\x5e\xcc\x65\x15\xca\xff\x85\x3b\xd0" + "\xab\xd9\x96\xb5\xbf\x96\xf7\x0c\xb1\x5d\x23\xf7\xfe\x9c\xd7\xf6" + "\xeb\xd4\x3e\xcc\x65\xb4\xc5\xdc\x65\x5c\xbc\xa1\xf0\xa9\x75\xc5" + "\x6a\x2a\x65\xe2\xb3\xe5\x85\x3f\x89\xb6\x7f\xcd\x72\x5c\xec\xac" + "\x6d\x53\x73\x93\xb5\xc1\x08\x3b\xd1\x3c\x38\xb7\x64\xa4\xa3\x6a" + "\x7e\xe9\xcd\xb1\xf1\xe6\x97\x16\xfd\x64\xc3\xc6\x52\x59\x86\xdc" + "\xda\x54\xac\x4e\x3f\x8d\xa4\x47\xe7\x2f\x9a\x3f\xb1\xac\xb8\x5c" + "\x5e\x1e\xa2\x26\x73\x0a\x8b\x8a\x4a\xb5\x8d\x4f\x6b\x39\x17\xc7" + "\x3c\xb3\x59\x66\xb5\x3d\x57\xae\xb6\x4c\x95\xad\x2b\xdc\x54\xac" + "\x81\x88\xc4\x75\x2c\xeb\xcb\xb6\x3a\x39\x66\x1e\xa9\xd6\x69\xdf" + "\x3c\x1c\xb1\xae\x13\x39\x8e\xbc\x15\x71\xed\x7a\x9c\xed\x0e\x96" + "\x95\xb7\x26\x76\x34\x4a\x9f\x0d\xe6\xe3\x3f\x63\xfa\xbe\xc5\xeb" + "\xc4\x09\xdc\x67\x87\x8c\x6f\x66\xd6\x6b\x67\x99\xfc\xce\xb7\x28" + "\x3c\x37\x70\xe8\x98\xb6\xf7\xa1\x8b\xcb\xe3\xb2\x11\x6f\x89\xd8" + "\x0f\xd0\xe5\xa1\x37\x7b\x18\x06\xaf\x5b\xcb\xfb\x25\x60\x13\x69" + "\x67\xd9\x8d\x1d\x3f\xe3\xbe\xa5\x6e\x02\xeb\xd1\x90\x6b\x71\x8f" + "\x6a\x07\x6f\x17\x8a\xea\x85\x1f\x4e\xf2\xd1\x18\xa5\x07\xde\xfa" + "\x15\xc2\x6f\xbc\x48\x6f\xed\x46\xf8\x11\xe8\x92\x04\xb6\x47\xd4" + "\xfc\xf7\x5b\xbf\xd2\xe6\x0a\xb8\xce\x09\x11\x38\x34\x85\xe7\x13" + "\x0e\x1d\xf3\xa6\x2e\xee\xd9\xa5\xd6\xfb\xe5\xda\xa6\x5a\x5f\x7e" + "\x6b\xb0\xfe\xe8\xbf\x7b\xb4\xf5\xbc\x31\xdd\x48\x8f\xf1\x44\x8f" + "\xb6\xc6\xc6\x75\xcf\xe6\x7a\xab\x7d\x5a\x6f\x05\x23\xed\x5a\xe5" + "\xcf\x7f\xe1\x87\x6c\x0b\xab\x71\xc0\xdb\x77\x49\xdb\x85\xe7\x2e" + "\xae\x32\x0d\xdf\x9e\x85\x78\xf4\x5f\x6f\x4f\xf5\x50\x6d\x67\x24" + "\xcd\xca\x2b\xd0\xc1\x23\x1f\xf7\x67\xc0\x69\x38\xd2\xe4\x87\x71" + "\x7e\x5b\xfa\x89\xe0\xb1\x82\xb2\x2b\xde\xbe\x20\xef\x1f\xf3\xa1" + "\x7e\xda\x9e\x01\xa6\xb9\xba\x8f\xe0\x6d\x97\x9e\x2f\x94\xb6\xb8" + "\x93\xc7\x28\xfb\xd4\xfa\x17\x68\xf7\xf6\xbf\x98\x0c\x67\xe5\x1a" + "\xe8\xa4\x00\x35\x22\x6c\x18\xc2\xfe\xc0\xe9\x18\x0f\x39\x57\x01" + "\xfc\xb9\xbc\x10\xec\x60\x53\xfa\xb0\x59\x80\xe7\x81\x9e\xc9\x08" + "\xf3\xef\xed\xe6\xf0\xfc\xd0\x9b\xab\xd4\xfc\x50\x9d\x59\xa7\x03" + "\xdf\x23\xa4\xb5\x85\x04\x7d\xbd\x1c\xf1\x19\x91\xf4\x97\x7a\x4e" + "\xa3\xa7\x70\xbe\x59\x16\x1e\x77\xd5\xe5\x0e\xae\x15\x01\x8f\xb0" + "\xae\xaf\x7b\x9e\xe9\xc8\x78\xdb\xb6\xf2\x5c\xf2\xa1\x26\x59\x0f" + "\xb5\x1e\xf3\x7b\xf0\xe8\x75\x01\xbb\x80\xfb\x48\x1e\x03\x30\x7f" + "\x39\xad\xba\x63\xe8\xd0\x92\x7a\x35\xe7\x79\x10\xbf\x1f\x0e\x19" + "\xe3\xc9\x47\x5d\x5b\xe4\xfe\x40\x45\xe3\x43\x49\x21\x86\x09\xfa" + "\x31\x2c\xf4\x1b\x83\xfb\x9e\x15\xdc\xba\x01\xc0\x7c\xa3\x3b\x5c" + "\x1f\xaf\xa8\xd6\xe8\xc8\x7c\x94\x74\x39\x84\xf6\x5f\x2b\xe7\x6d" + "\xec\x8d\xe2\xc2\x46\xc0\x50\x77\x7f\x1e\x9a\x29\x98\x37\x5a\x7a" + "\x2f\x8f\x9d\x80\xbb\x3a\xbb\x05\x79\xc3\xf8\x83\xf1\x0c\x55\x2f" + "\xf6\x30\xee\xbc\x0e\x10\x1e\x0f\x1f\xe2\xbd\x1b\x9d\xde\x6d\x2a" + "\xcf\x7e\xb5\x4e\x01\xde\xd6\xbd\x2f\x36\x97\x90\x36\x3f\x0e\x7d" + "\x5c\x37\x86\x65\x9b\xe1\xf8\xe4\xb8\xe8\xd0\xee\x10\xe8\x02\x9e" + "\x32\x5e\x47\x75\x9e\x22\x9d\xed\x3a\x7b\xab\xc1\x93\x43\x1e\xdd" + "\xf7\x0b\xf7\x29\x68\xa7\x0e\x65\x03\xd6\xbf\x93\xbc\x63\xb6\x48" + "\x0e\xde\x7b\x2f\xdb\x34\x0d\x46\x39\x56\xd1\xf7\xbf\xdd\x0e\x3a" + "\x7d\xa6\xef\x05\x0e\xed\x5c\xd9\xc9\x7b\x07\xdd\x01\xb5\x77\x90" + "\xc3\x97\xfa\x44\xa8\xc3\x37\xc0\xfb\xf3\x3b\xfd\xce\xfa\xf9\xfa" + "\xf8\x85\xf5\x92\x69\x87\x01\x38\xd6\x43\xfe\x5f\x3b\xac\xe9\xa3" + "\xe1\xe7\xa9\x7e\x87\x06\x3f\x02\x87\x43\x41\x35\xfe\xab\x6f\x54" + "\xe3\xa0\xfa\x3d\xd0\x2f\xbb\xd4\x38\xa8\xbe\x56\xc7\x1b\xf1\x45" + "\xb1\x75\xcc\x9b\xb7\xa8\xd8\xb2\x8e\x55\xab\x75\x4a\x85\x25\x73" + "\x7c\xd1\x24\xb9\xd9\xd4\xf2\xe0\xbc\x19\x96\xbc\x59\xe3\x2b\x4a" + "\x26\x2c\x55\xaf\x79\x79\xb9\xfc\x8e\x59\x7b\xb4\x00\x7e\x20\x7a" + "\x9c\xd5\xa4\xe1\xd0\x90\xe2\x31\x4c\x90\xfb\x81\x45\xca\x5c\xe2" + "\xfb\xd5\xd1\x17\xf6\xb2\x7d\xbb\x6c\xe0\x2f\x42\x1c\xb0\xe6\x88" + "\xd4\xb9\x90\xd1\xa6\x16\x3c\x0e\x6f\xea\xc2\xd3\x7c\xff\x7a\xf2" + "\x0e\x11\x48\x0e\x0e\x57\xfa\x10\xdf\xb0\x25\x7a\x60\xaf\x30\x2f" + "\x69\xc1\x5d\x76\xb1\x6c\x40\xb8\x61\xb7\x80\x2e\x0d\x36\xbd\xff" + "\x95\x73\x47\xae\xb9\x3c\xd7\xd5\xcf\xb2\x83\x7e\x1d\xe3\x24\x94" + "\x69\xe2\xb9\xae\x06\xd4\xbf\xc6\xa2\x68\xd1\x00\xfd\x77\xa8\x5d" + "\xa3\x6f\x1e\xbe\xf9\xfe\x1b\xb5\x96\xe7\x4c\x97\x3a\x3e\xb4\xf3" + "\xee\x47\x60\xc3\x3b\x74\x98\x80\x95\xa4\x9d\x85\x91\xf0\xe8\x3a" + "\x67\xa9\x23\x9f\x50\xf5\xdc\x20\xcf\x39\xf0\xf9\xc5\xe4\x0a\x03" + "\xdf\x0f\x94\x3f\x38\xcf\x82\xb8\xd1\x3b\x52\x78\xee\x25\x7f\xb4" + "\xcf\xe0\xe0\x34\xe1\xf9\x88\x90\x67\xbf\x31\x14\x80\x1d\x90\xa2" + "\xee\x42\xef\xd5\xd6\x63\x1b\xd7\x0c\xce\xef\x47\xf1\xbe\x51\xca" + "\xc3\x17\x4e\x33\x64\xbb\xbe\xe7\x8e\x31\xca\xe6\x09\x39\x0d\xa4" + "\xce\xb2\x37\x3e\x2a\xdb\xa5\x26\x8f\xa0\xaf\x97\xd7\xde\x92\x83" + "\xc2\xcb\xfb\xd4\x43\x26\xc8\x24\x9d\x27\x77\xa5\xdf\xc1\x77\x90" + "\x0f\xca\xa5\x0d\x72\x69\x83\x5c\xf2\x3a\x29\xca\xf7\x9a\xee\x5e" + "\x83\x36\x6b\x38\x4f\x8d\x19\x8c\x3f\xd3\x06\x76\x77\x52\x08\xb4" + "\x92\xfb\xe1\x98\x3e\x69\xf3\x2b\xf9\x5c\x14\xd7\x35\x39\x88\x3a" + "\x47\xd6\xcb\x18\xf2\xec\x73\xa2\x5e\x46\xd4\xab\xe2\x82\x1c\xef" + "\xf3\x79\x35\xe8\x92\x9b\xc3\x77\x4c\xbc\x33\x3f\xb2\x8e\x21\xbe" + "\x97\x46\xd6\xe1\x9d\xe2\x78\x75\x14\x46\xae\x23\xd3\xe0\x9d\xfb" + "\xb5\x75\x12\x89\x27\xeb\xad\x5e\x6a\x0c\x8c\xde\xc1\xe7\xc4\xe6" + "\xb2\x1d\x3c\x8f\x79\x58\xef\x14\x2e\xc6\x33\x1e\xbf\x18\x9e\x82" + "\xf5\x33\x73\xf2\x0e\xc7\x1a\xe0\x72\x2a\x3e\xbd\xdf\xf9\xfc\xfa" + "\xf4\x7e\xe7\x0f\x9c\x9f\xf1\xe0\x73\x73\xc9\xec\x00\x09\xf2\x8d" + "\x31\xd6\xee\x78\xe5\x8e\xde\xd1\xc8\x78\xc5\x8d\x83\xec\xf7\xee" + "\x2f\x8d\x6e\x13\xa1\xfa\x00\x31\xfd\x1a\x10\xae\xe6\x52\x7f\x56" + "\x31\x38\xe7\xeb\x9a\x9b\x99\x6c\xb0\x98\xb8\x8d\x49\x5b\x16\xf5" + "\x8d\x07\x37\xd9\xe0\x62\x1f\x6a\xf3\xa0\xab\xe2\xc6\xa3\x1d\x58" + "\xc4\xce\x7b\xee\x10\xae\x39\xbd\xa3\x77\x18\x84\xd7\x74\xcf\xc8" + "\xd1\xbe\x60\x06\xd3\x15\xb8\x56\xa0\x8d\xef\x95\xfd\xb3\x9c\x83" + "\xf8\x19\xda\xff\x87\x6b\xe4\x5c\x6e\xea\x1c\x6d\xef\xe0\xbb\x49" + "\x1e\xfa\xcf\x9e\xf0\x1e\xa1\x77\xc7\x7a\x0c\x23\xda\x54\x5b\xfd" + "\xce\x5b\xe8\xd3\xf6\x84\x9c\xc9\xc2\xb2\x35\x59\x74\xd3\xbb\x7f" + "\x1f\x12\x99\x46\xf4\x5b\x7b\xc2\xb2\xa3\xce\xd5\xe9\xb2\x83\xfc" + "\x05\xf1\xe5\xe2\xdd\xed\xd7\x97\x8b\x77\x1f\xd6\xe6\xe8\xd6\xa8" + "\xbd\x7b\xef\x36\xe9\x63\x05\xb1\xf3\x3b\x6f\x59\xaa\x64\xf9\xd3" + "\x55\xd9\xa0\x49\x30\x9b\xf5\x4c\x2e\xe8\xe6\x40\xda\x53\xba\x6e" + "\x60\x19\x4a\x1e\xe0\x71\x0c\x49\x39\x47\x5c\x2f\x74\x8f\xba\x23" + "\xbb\x3a\xa7\x92\x6d\xcc\x90\xb3\xfe\x30\xfa\xaf\xb7\x79\xef\xba" + "\x2f\x75\xee\x3a\xbf\xb3\x29\xc5\x43\xdd\xbb\x34\xfd\x57\x04\x18" + "\x25\x72\x2f\x88\x3a\x0f\x9a\xc4\xed\x9c\xef\x31\xe3\xb6\x8e\xb0" + "\x31\xc0\x9b\xef\x34\x83\x6d\xdf\x94\xa3\xf7\xfd\x21\x67\x36\xd3" + "\x5b\xda\x19\x46\xb6\x63\x41\xbb\xd7\x8d\xa1\xe6\xcb\x93\xd2\x89" + "\xeb\x7c\x79\xe7\x6d\xcd\x2f\x67\x91\xf9\xbf\xa4\x3f\x45\xb6\x29" + "\x34\x66\xc7\x7d\x66\xfa\xb7\xe9\x64\x64\x3a\x78\xa8\x29\x5f\xd1" + "\xae\xa9\x56\xe7\x8f\x87\xde\x95\x7a\x94\xe7\xce\x97\x05\x45\x9f" + "\x5a\x0b\x68\x6a\xf1\xd0\x01\x6d\xcd\xab\xc1\x1c\xa7\x7f\x58\x60" + "\x59\x5b\x66\x29\xda\xb8\x79\xc3\xb8\x71\x23\xe3\x8c\x01\x9a\x4e" + "\xa8\x31\xc0\x7b\x14\x39\x06\xc0\x37\xea\x5f\xef\x89\xb5\xf9\x73" + "\x57\x6b\xee\x0f\x56\x5b\x29\xfc\x7b\x32\xe5\x4e\x8e\xf8\xbc\x97" + "\x72\xa7\xdc\xbb\xfa\x91\xe2\xc2\xa2\x2d\x11\xa1\xd3\x22\xe7\xe7" + "\xf6\xbf\x85\xb2\x4d\xb7\xcd\x85\xfe\x30\x2c\xdd\xc6\xfd\xce\x7b" + "\x97\xaa\x82\xe2\xaf\x90\xdd\xe9\xec\x73\xe8\x64\x79\x90\x4e\x42" + "\xbf\x89\xef\xb0\x5e\x1f\xae\xfc\x6e\x62\xfc\x0f\xd9\x4a\x46\xdd" + "\xbd\x18\x8b\x5d\x52\x7b\xb7\x7f\x7e\x6b\x47\x6d\x00\x7a\x62\xe1" + "\x19\x65\xef\xbc\x77\x1a\xe1\xa9\x78\x0f\xa8\xfd\x27\x3f\x37\x60" + "\x9c\x9b\x2d\x7d\x2c\x6c\x62\x1f\x0b\xef\xc9\x3e\x20\xcb\xe7\x20" + "\xe5\xeb\xeb\xbd\x3d\xec\x83\xdb\x43\x3f\x9f\xc9\xf6\x05\xa7\x45" + "\xd8\xc7\x96\x67\xc9\xca\x6f\xb6\x79\x3d\x80\x29\x0e\x2c\x3c\x23" + "\xde\xce\xe7\x35\xf9\x0c\xc0\xbc\x9f\xed\x36\x53\xfa\x70\xbf\xdf" + "\xf9\xf3\xe9\xba\x0d\xc2\xfb\x44\x87\xb2\x3f\xf4\x7e\x70\x34\xf4" + "\xf7\x68\x5f\xb2\x58\xcd\x3e\x4b\x0c\x94\xc1\xfd\x43\x72\x45\x9e" + "\x3c\x5b\xc4\xfd\x22\xeb\x84\x7a\xa9\x4b\x7f\xee\xd2\xf5\xc2\x3e" + "\x35\x8e\x1c\xc9\xf9\xd1\x7f\x7e\xa6\xfa\xcf\x9f\x1f\xd1\xdb\x02" + "\x7e\x1f\xd3\x65\x35\xea\x7c\xca\x86\xf2\xe2\xd2\xe2\x22\xcb\xf8" + "\xb2\x91\x14\x71\x43\x64\x49\xf1\x06\x4b\x69\xf1\xf3\x2f\x14\x97" + "\xc9\x01\x1a\xc7\x46\xaf\x8d\x40\x07\x85\xef\xeb\x95\x67\x64\x7e" + "\x31\x8e\xc7\xb0\xc9\x3b\xc6\xc9\x79\x70\xb5\x7e\xf1\x8f\x81\xd0" + "\xbe\x51\xd9\x6a\x1e\xf1\x3c\xe8\xda\xac\xfc\x51\xbb\x16\x9e\x60" + "\x3b\xae\x9b\x9a\xa7\xa9\xb5\xf6\x5f\xac\x57\xb4\x4a\xb4\xfb\x9d" + "\xbf\x28\x0a\xdb\x6b\xcd\x72\xff\x9f\xda\xf3\xf6\x8b\x4a\xd0\xb8" + "\x20\x6c\x83\x34\x7f\xc2\x7a\x50\xea\xc3\x2f\xd1\x85\x9a\xed\x8c" + "\x72\x9a\xef\x12\x9b\x44\xd7\xfe\xab\x24\xe7\xf1\xd8\x77\xbb\xd2" + "\xaf\xbf\xe8\xd4\xe9\x08\xfb\xa5\x8b\xe7\x0b\xf4\x31\xd0\xb2\xe0" + "\x15\x51\xb5\x85\x8c\x3c\x67\x00\x1d\xe2\xf9\x9b\x52\xaf\x51\x38" + "\x7f\xde\x0e\x5b\xe6\x04\xa7\xa9\xd7\xf6\x7e\x89\xd4\x85\xed\x7e" + "\x67\xb3\x25\x3c\x3e\x6c\xee\x92\x76\xfc\x55\x96\x9b\x5f\xb4\xad" + "\xe6\x3e\x42\xe9\xee\x1b\xbe\x0c\x5f\x31\x52\xcd\x95\x2b\xfd\xd6" + "\xbc\x46\xab\x43\x2f\xeb\x2c\x6d\xef\xa0\x51\xc9\x75\x73\x17\x64" + "\xee\x04\xf3\x02\x7a\x7e\xb7\x4e\x2f\xae\xaf\x1c\x77\x6e\x27\x23" + "\xf4\xb0\xe7\xc3\xad\x01\xa3\xba\x5b\xf1\xe7\xa7\xd5\x18\xa6\xb9" + "\x3d\x72\xcd\x47\x8d\xa5\x9a\xcf\x84\xfd\x1a\xfc\xe2\x9a\x33\x29" + "\x1b\x37\xf0\x71\x94\xe7\x56\x6f\x2e\x7c\xae\x78\xf5\x0b\xb6\x09" + "\x96\x17\x36\xc8\x25\x35\x39\x7c\x2f\x7f\xe1\xe9\xe7\x2c\xac\x45" + "\x56\xcf\xcf\xcd\x5d\x3d\xf7\xd1\xe5\x8f\x8f\xa4\xb9\x85\x08\x2b" + "\xdf\x68\xc9\xb5\x4e\x50\x51\x8f\x2c\x98\xf7\xd8\xea\x79\xcb\x1e" + "\x5d\xba\x22\xce\x9e\xd6\x24\xc8\x44\x3b\x78\x94\x70\x8e\x3e\x98" + "\xaa\xf6\x30\xbc\x6f\x8b\xde\xc3\xf0\x3e\xfa\xcf\xf7\x9b\xf0\xb4" + "\x12\x7d\x80\xd1\xcc\x07\x53\xf1\x64\x6a\x72\xd3\xef\x77\xbe\x5f" + "\x17\x96\x9b\x0f\xa4\x7f\x5d\x1e\xf3\xab\x39\xd3\xf7\xa1\xff\x7e" + "\xee\x8b\x8c\x0b\xeb\x82\x5f\xbe\x27\xf5\xa5\x26\x17\x2c\x0f\xab" + "\x83\x89\x52\x36\x94\xbd\xf2\xbe\x4f\x97\x0d\x79\x4e\x0e\xe1\x3c" + "\xd7\xc5\xf1\x90\xef\x2e\x9e\x17\x86\x2c\xb4\xf3\x7a\x26\x87\x8b" + "\xd4\x7f\xd4\xf6\x5f\xfe\x72\x02\xcf\x13\xb3\x3d\xab\xad\x7b\x8c" + "\x3e\x4f\xbf\x5c\x2b\x9c\xcd\x5e\x35\x16\x7c\x7f\x9c\x94\x9b\x9d" + "\xb7\xcd\x95\xeb\x47\xf2\x3c\xc2\x2f\xd7\x84\xe5\xe7\x83\xa9\xcc" + "\x1b\xd6\x0b\x4a\xf7\xfe\xb2\x32\x66\xfe\xc5\x84\x30\x97\xee\x07" + "\xbb\x7c\x1c\x19\xcd\xe3\x5c\x54\x63\x14\x0e\x0f\xfd\x32\x5b\xed" + "\x63\xfb\xe5\x11\xdd\x7e\xc6\x6f\xb4\xff\xff\x99\x1d\x3b\x6f\xb5" + "\x2f\x62\xde\xaa\xca\x26\xce\x76\xd8\xbc\x6c\x23\xb7\xba\xbd\xd2" + "\xff\xe2\xec\x0e\x9b\x8f\x7d\xf6\x8d\xec\xa6\x0f\x12\xec\x03\xe2" + "\x2a\x7e\xdf\x86\xba\xc9\x3e\x64\x92\x9a\x37\xc0\x78\xec\x83\x69" + "\x6a\x6c\xa2\xc2\x99\xee\x1e\x7a\xff\x30\x8f\xcd\x98\x3f\xf8\xed" + "\x32\xa5\x8f\x98\x11\x4f\xef\x8d\xde\x61\xd4\xfc\xdc\x7c\xf0\x0a" + "\x8f\x51\x99\x56\xaf\x19\x43\x25\xaf\x39\xf1\xe0\xcd\xba\x2f\x6c" + "\x5f\x8a\x80\xa2\xed\x07\xbb\xdb\xfe\x3f\xf2\xbe\x3f\x2e\xaa\x2a" + "\xef\xff\xcc\xf0\x43\x34\x74\x06\x16\x6d\x34\xca\x69\x57\x7b\x68" + "\xd7\x14\xcd\x5c\x77\xbf\xb6\x21\x59\x62\xab\x69\x3d\x56\xd4\x1a" + "\xa0\x61\x0b\xae\xe9\xa8\x88\xa8\xc8\x20\x1a\x4b\xad\xe2\x68\xe8" + "\x43\x89\x4a\x4f\xb4\x2f\x7a\x56\x8b\x76\x6d\x97\x8a\x6c\x5a\xb1" + "\xc5\x44\x86\x5a\xed\x21\x17\x6b\x22\x34\x62\xd1\x46\x41\x19\x61" + "\xe6\xde\xef\xfb\x73\xce\xbd\xf3\x03\x67\x54\xda\x9e\x6d\xbf\xdf" + "\xe7\x0f\xb8\x73\xcf\x3d\xf7\xdc\xf3\xf3\x7d\x3e\x9f\xcf\xf9\xfc" + "\xc8\xe9\xa0\x7d\xd3\x19\x54\xbf\x30\x5b\x6e\x56\xc7\x73\xb6\xdb" + "\x71\x17\x8d\x57\x77\xc1\xef\xac\xea\x58\x76\x8e\x9d\x1a\x1f\xb2" + "\x9e\x19\x0f\x96\x4d\xa0\x74\xac\xff\xdf\x25\x28\xfa\x93\x5d\x7d" + "\xdf\x05\x0e\x27\x88\xf7\xf7\x32\xf5\xfd\xbe\xfe\x53\xb9\x81\x1f" + "\x09\xa7\x7e\xca\x45\x58\x71\x4a\xb8\x5b\x3f\x5b\x1d\xb2\xc1\xac" + "\x15\x73\x52\x95\x9d\xe9\x45\x7b\xf6\x5e\x92\xb6\x81\xff\xde\xf6" + "\xb3\x16\x45\x0e\x80\xb5\xbd\x77\xd7\x58\xc6\x16\x77\xad\x4a\xf6" + "\xc8\x49\x48\xbe\x40\x3e\xd1\x50\x8f\x22\x1f\xd9\x96\x47\xc7\xcb" + "\xce\xf6\x3a\x49\xe7\x04\xe5\xb4\x52\x39\xb4\xae\x84\x6c\x66\x6f" + "\x35\xf9\xd0\x41\x79\x4b\xf8\xd9\x65\xc1\x5e\x3d\x9f\x7b\xe0\xb5" + "\x39\x9f\x9f\x2b\x7f\xa9\xe8\x40\x70\xda\x45\xd8\xf3\xec\xed\xf0" + "\xc8\x7b\xb8\x6d\xcb\xde\x0c\xd2\xeb\xec\x2e\xd8\x17\x1a\x48\xce" + "\x07\x7c\xc8\x98\xbf\x24\x7d\xe9\x93\x4f\x5e\x1d\x1a\x7c\x75\x2d" + "\x2d\x05\x52\x11\xca\x04\xff\x5b\x92\x2c\xe6\xe9\x3e\xe0\xff\xb3" + "\x82\xd6\x05\x0d\x83\x75\x73\x63\x3b\xdb\x67\x55\xe9\x77\xb1\x8e" + "\xf6\xd5\xcb\x05\xfb\xf4\xde\xb5\xb1\xaf\xf4\xf2\xb5\xb1\x6f\x6f" + "\xe0\xb5\xb1\xaf\x11\xfb\x6c\x33\x9e\xd7\xe3\x9b\xf5\x1c\xf3\x69" + "\xbc\x05\x0d\x6e\xd5\xb9\xee\xe2\x34\x78\xea\x6a\xa6\x21\xfa\x9b" + "\x64\xca\xb4\x1f\xb8\xc1\xd7\xba\x81\x11\xa9\x2e\xa6\xa7\xbd\x60" + "\xcb\x12\x92\x17\x8e\x94\x5d\x17\x65\x7b\xea\x6a\xe0\x05\xee\x8b" + "\xdb\xc5\x39\x6b\xca\x05\xf0\x21\xf8\xbd\xe5\x34\x61\x85\x44\xce" + "\xda\x99\xd8\xaf\x5f\x4d\x50\x69\x5c\xdd\x7a\x23\xf7\xe1\xcb\xf7" + "\x6d\xcc\x33\xda\xb7\x53\xdd\x3a\xab\xd8\xb7\x5f\xcd\xb8\xa2\x6c" + "\x3a\xaa\xa2\x3c\x50\x3a\xea\x58\x4b\xf5\x42\x3d\xab\x50\xaf\xfd" + "\x54\x9f\xe2\x27\xa9\x5d\x21\xb7\xeb\x5c\xf1\xfc\x6c\x80\xea\x99" + "\xd2\xc5\x6e\xa7\xfa\xa5\x2c\xbb\x9d\xed\x7e\x92\xce\x77\x85\x5e" + "\x8f\x32\x97\x42\x31\x67\x06\x9c\x66\xaf\xc5\x76\xf1\x98\x8a\xaf" + "\x62\xec\x23\x04\x5d\xaf\x9c\x9d\x50\x1e\x7a\x26\xe6\xe9\x6b\xb1" + "\x07\x73\xa8\xce\xaf\xc5\xaa\xf9\x7c\xeb\x76\xf7\x7c\x13\x08\xcb" + "\xcc\x27\x9f\x5c\xb8\x7c\x85\x1a\x1f\x3a\x6e\xe9\xe2\xf4\x3b\x15" + "\x7b\xd7\x25\x0b\x57\xa5\x66\xa6\x73\x7d\x7a\xa4\x8a\x9f\x7d\x68" + "\x8d\x31\xc4\x0b\x70\x1d\x55\x4e\x67\xfc\xe1\xd2\x6e\x85\xe6\x68" + "\x61\x55\x45\xe2\xfc\xb9\x6a\xaa\xd8\x07\xae\x5b\x86\x7a\x54\xa8" + "\xfb\x00\xc9\x23\x3a\xd9\xcd\x71\x74\x2e\x44\x36\xcc\x74\xfe\x44" + "\x32\x09\xe4\xa9\xb3\xb3\x57\xb3\xd4\xb9\xbd\x19\xe9\x64\x37\x61" + "\x5d\x42\xba\x76\xfb\x87\x4b\x5b\xa7\x36\xcb\xd1\x63\x2d\xc0\x80" + "\x48\xda\x1b\xe8\x3c\x44\xf8\xe3\xaf\x8a\x21\x6c\x23\xb9\x99\x75" + "\x09\xe9\xae\xbd\xd6\x8a\xbd\x1c\x34\xf0\xfe\x58\xf0\x45\xcd\x1b" + "\xd7\xb0\x08\xfa\x06\xf6\x0d\xbb\x90\xb3\x56\xc5\xbf\x97\xcb\x98" + "\xb2\x77\xd8\x37\x73\x99\xe2\x6b\xc2\x67\xa2\x65\xaa\x43\xc8\x1c" + "\xa6\x82\xb6\xa9\xc2\xfc\x1f\xcc\x44\x9d\xc7\x56\xf3\x73\x2f\x8e" + "\x0b\x55\xb9\xf2\xb6\x71\x49\x5c\xbf\x70\xdb\xd8\x6a\x49\xce\x08" + "\xa1\x7b\xe0\xf2\x20\x94\x53\x21\x9b\xe3\x98\xa2\x93\x18\x72\x9a" + "\xbd\x1e\x86\x6b\x28\xc6\xa3\x84\xfa\x02\xe5\xbb\x94\xf2\xb1\xa6" + "\xaa\xb0\xff\xdd\x60\x11\xeb\xab\xaa\x56\xfd\x16\xe6\xb6\x03\x7b" + "\x57\x2d\xed\x5f\xa8\xff\x31\xfc\x35\x09\xf9\x8c\x13\x7c\xd2\x48" + "\x8f\x7c\x46\xd0\x48\x55\x2e\x75\x4e\xd2\xb7\x95\x36\x10\x9f\x46" + "\xfe\xfd\x34\xca\xb7\x9c\x24\x2b\x50\xcb\x94\x51\xa6\x7c\xb1\xa3" + "\x1c\x7b\x4d\x04\xd6\x98\x63\xc8\x7a\xec\x29\xf4\x0d\xa2\x71\xbb" + "\x46\xca\xd8\x73\xdc\xa9\xee\x50\x61\x6f\xbe\x9a\x0d\xf6\xa5\x6f" + "\xbb\x0b\x5e\x5f\xec\xa5\xc9\x50\xc6\x45\x60\x59\x1e\xcb\x6f\x65" + "\xaf\x73\xff\x67\xa4\xcf\x41\xe3\xda\x83\x71\xc2\x58\x95\xe2\x3b" + "\x55\xa0\xcb\x07\xa3\x1f\x5e\xa1\xf1\x2a\x96\xb0\xe6\x7a\x38\xad" + "\xae\xa3\xd8\xe9\x2d\xec\xf5\xed\x34\x56\x54\x96\x6c\x19\x97\xe1" + "\xea\x4e\x9e\x4e\x7e\xa9\xa8\xaf\xd7\xe5\xca\x6d\x74\x46\x87\xb9" + "\x35\x9c\x68\x58\xd0\xf5\xfc\xb7\x39\x5d\x96\xf8\x58\x73\x3d\xc5" + "\x3f\x0c\x5f\xd7\x26\x4b\x97\x0a\x98\x5c\x07\x2c\xbd\xa4\x65\x2e" + "\x27\x78\x50\xd4\x5b\x6b\x3e\x43\xbe\xb3\xca\xb1\xbe\x8a\x18\xbe" + "\x1b\x51\xbc\x86\xe9\xc9\xd7\x98\xd9\x24\x3b\x1b\xba\xca\x58\x83" + "\xa9\x8c\x7d\xe0\x2a\x61\xd6\x6c\x92\x69\xfe\xc1\x7a\x24\xa7\x84" + "\xf4\xc2\x07\xe2\xf7\x7a\xe3\xc3\xf4\xad\xdf\x27\x1f\x39\xf6\x11" + "\x3b\x62\xfd\x88\x19\x1f\xe3\xf7\x19\xf5\xc9\x1f\xb0\xfa\x84\x0f" + "\x98\xb9\x55\x96\x88\x1e\xca\x7b\x8a\xbe\x51\x84\xb2\xca\xc9\x47" + "\x97\x5e\xea\x34\x0c\x42\xfb\x43\x67\xe7\x30\x7e\x0e\x68\x5d\xf2" + "\x16\xea\xf8\xfb\xaf\x76\x9f\x67\x11\xd6\x25\x7f\xe6\xbf\xb9\x7c" + "\x01\xed\xb5\xa5\x37\x71\x1d\x31\xf2\x49\x66\xcb\x69\x23\xfb\x4a" + "\x69\x0b\xd5\xd1\x2d\xea\x8d\xfe\x0a\x55\xdf\xdf\x93\xe7\x79\x9f" + "\xfb\x8a\xdd\x45\xfd\x81\x3a\x1d\x9d\x2b\xfa\xa4\xbe\x09\x7d\xfa" + "\xb0\xd2\x3f\xc9\xbe\xfd\xf3\xfb\x08\xea\x1f\xd2\xff\x94\xb2\x3b" + "\xca\x51\xb7\x04\xf4\x81\xa4\x7e\x83\xe6\x00\x9d\x57\x51\xf9\xc5" + "\xe7\x59\xa4\x75\x09\xe9\x87\xfe\xe1\x29\xdd\x9c\xd0\x08\xe9\xe2" + "\x99\xaa\x2d\x17\x58\x28\x8d\x1b\xed\xb3\x5b\xf8\x73\xde\xe7\x73" + "\x68\xcc\x1c\x51\x3f\x6b\xc4\x1f\xe6\xe7\xcf\x9a\x68\xee\xe1\xda" + "\x8c\xf1\x2a\x42\x3f\xb5\x61\xac\xca\xe9\x2a\xe6\x63\x7c\x04\xf9" + "\x6b\xa4\xbd\x0c\x73\xc5\x9b\xbe\x2d\x7e\x80\x0b\x6b\x47\xe2\x7c" + "\xda\xef\xdb\xa4\xad\x3f\x6f\x14\xba\x82\xaf\xc5\xed\x02\x5d\x5c" + "\xb6\x8d\xdb\xa3\x47\x82\x96\xe7\xfb\xe2\x0b\xdc\x6e\xe5\x0f\x9e" + "\xfd\xef\x59\x1e\xcb\xfc\x0f\x06\x2d\xd7\x09\x9b\xda\xa5\xcc\x75" + "\xe0\xf9\x7e\xac\xfd\x61\x0a\x5f\x5d\xc5\x6d\x5a\x08\x07\x82\xd1" + "\x24\xc0\xe5\x7a\xd2\xb1\x93\x6f\x48\x66\x91\x1a\xd9\x11\x99\xa6" + "\x93\x6d\xae\x5a\x9a\x43\x91\x7c\xee\x8b\x67\xa0\x23\x1d\x3a\x60" + "\x79\x23\xd2\x43\xd5\x74\xc2\x75\x09\xbc\x25\xf1\xb5\xb3\x57\xeb" + "\xe4\xbc\x0b\x2c\x96\xcb\x88\xd4\xf4\xd5\x0e\x5d\x83\x81\x91\xce" + "\xbd\x8b\xfc\x50\xd0\x3b\x48\x0f\xc1\x3e\x50\x83\xef\x5a\x91\x3f" + "\x46\xcd\x2f\x77\x26\x87\xda\x72\x6a\xf9\x3a\x23\xdf\x4a\xea\xbe" + "\x80\xf4\xb0\xd9\x39\x0e\x1d\x1f\x33\x35\x6d\x45\x32\xdf\xc7\xc8" + "\xe6\x1d\x74\xaa\xcc\xeb\x73\x9a\xa7\x6b\xc0\x67\xf2\x58\xe9\x3e" + "\x69\x5a\xf2\x2f\x40\x7e\xf1\x7c\xd2\x42\x50\x67\xe6\xb9\xc7\xb7" + "\xb7\x2c\xe2\xe7\xf4\x86\xd9\xab\xe9\x4c\x0c\xdf\x59\xa4\x7c\x7b" + "\xb5\xcc\x84\xbf\x4d\x91\x26\xf6\xcc\x37\xb2\x7c\x79\x5c\x3a\xa3" + "\xa0\x6f\x4b\x9d\xc9\x5a\x77\x67\x72\x08\x7d\x9f\xca\x22\xf9\x24" + "\x8f\xd9\xee\x6a\x63\xe4\xeb\x59\xde\x5a\x43\xf9\x42\xa9\x5c\x5e" + "\x9f\x1c\xf0\xff\x51\x35\xf9\x81\x75\x58\x5e\xa9\xb6\xe6\x3d\x86" + "\x39\xfd\xc7\x5c\xc2\x14\xb7\x3e\x11\x18\x40\x7a\x07\x6f\x5c\xa0" + "\x31\x75\x63\x9d\xbb\xa3\x12\x3b\xc6\xb5\x31\x4d\x1e\xd6\x8e\x38" + "\xab\xfb\xe3\x50\xa2\xa9\xcc\x92\x2c\xe3\x77\x04\xcd\x5d\x5d\x07" + "\xe9\x9e\x24\x3a\xb8\xbe\x47\xf4\xcb\x55\x36\x67\x1b\xab\xcf\x3f" + "\xc1\xea\x5d\xb6\xfc\x9a\xf3\x8e\x50\xa1\xf7\x11\x8a\x72\xff\x78" + "\x2b\x3d\x33\x63\xbd\xa4\xba\xcb\x83\xf3\x81\xe0\x2d\xd0\x77\x9f" + "\x89\xbd\xe0\x8f\xb9\x2a\x3f\x71\x95\x36\x1c\x23\xdf\x86\xa4\x17" + "\x27\x6d\xdb\x40\x31\x18\xcd\x72\x77\x1c\x1b\xb7\x86\xe4\xba\x7f" + "\xdc\x3b\xa4\x8b\x25\x28\xe5\x7e\xad\x94\x7b\xec\x4a\xe5\xd2\xbc" + "\xad\x2f\x15\xba\x16\x52\xf4\x86\x46\x37\xca\x76\x47\x6f\xd4\x63" + "\xaf\x31\x9b\x2f\x91\xec\xa4\x7a\x38\xbe\xd3\xd8\xe0\x6a\x64\xe4" + "\x23\x75\xb7\x84\xfd\xfa\x6b\x03\x53\x74\x5c\xcc\x67\xd9\x9f\xc2" + "\x24\x39\x4e\x0f\x3e\x87\x64\xa5\x66\xc2\x59\x92\x3d\xe7\xb9\x59" + "\xb8\x0d\x23\x4b\x3e\xfe\x50\xc6\xe0\x43\x24\x97\x06\x56\xb9\x65" + "\x83\xf6\x9d\x8b\x76\xb6\x05\xf8\xcd\x7d\xfe\x6d\xb8\xe1\x85\x21" + "\xeb\xd9\x5d\xb2\x56\xc7\x75\x98\xa4\xad\x2f\xb5\x61\x6c\x23\x84" + "\x4e\x4d\x62\xa8\x8f\x3e\x4d\x08\xbe\xf5\x0c\xe9\xd3\xc8\xfa\xa9" + "\x75\x65\xb4\x67\x62\xcc\xba\x0b\xfe\xb4\xdf\xce\xde\xe0\x74\xc9" + "\x26\x92\x03\x70\x9c\xaf\xbe\xd9\x11\x65\xa6\x18\xa2\x14\xf7\x50" + "\x23\x65\xbb\xaa\xb6\x9c\x03\xdd\xc3\xfb\xa3\x5a\xd3\xd0\xd1\x6d" + "\x95\x2d\xe6\x2a\x5a\x47\x4a\xd9\x3a\x94\xfd\xa1\xbc\xd5\x0c\x7e" + "\xaa\xda\x28\xc6\x86\x7e\xff\x89\x9f\x75\xb8\x7a\xc9\x0e\xe7\x4f" + "\x19\x65\x3d\x24\x93\xfb\x13\x70\x65\xa4\xb5\x53\x6f\xae\xfa\x77" + "\x43\x3e\x68\x80\xea\x89\x76\x6d\x9b\xd0\x79\x56\xfc\x17\x06\x3b" + "\x83\x92\x77\x1a\x06\xd9\x50\x08\x68\xdc\x98\x76\xf6\xd6\xcb\x3d" + "\xe0\xf3\x7b\xb1\xb7\xf6\x80\x4f\x90\x77\x26\x47\x16\x8f\x60\xf1" + "\x78\x36\xa2\x9d\x55\x3f\xe3\xd2\xb2\x18\xfc\xe9\x1d\x37\x64\x0c" + "\x44\xb9\x09\x24\xff\x3c\x7a\x9e\xce\x5d\xab\x39\xee\x6f\x79\x81" + "\x8d\x92\x50\x1e\xc9\x5d\xb7\x8c\x60\xa3\x48\xe6\x8a\xb4\xb8\x54" + "\xb7\x38\x93\x50\x79\xaa\x0d\x23\xd8\x18\xff\xef\x56\x9b\x04\x2f" + "\xf7\x16\xdf\xe3\x57\x39\xd8\x4d\xa6\x9f\xc9\x2d\xa7\xd9\x9b\xe9" + "\x72\x41\x88\x2c\xdf\x60\xd0\x0a\x9e\xe2\xcd\x59\xba\x52\x31\xef" + "\xb8\x0c\x1e\xf3\x8d\xce\x38\x14\xd9\xae\x86\xfb\x6d\x8c\x9e\x9e" + "\x4b\x76\x10\x3c\x4d\xa3\xa7\xbe\xd4\xf3\x7a\x28\x3e\xd7\xdc\x1b" + "\x7e\x48\xb1\xdd\xb8\xaf\xb5\xd4\xf9\x42\x2e\x4c\xfe\xd8\xd0\xc7" + "\xdc\x1e\x6c\xd3\x0b\x2c\xf2\x37\x2f\x30\xfd\xd1\x27\xa9\x5d\x6f" + "\xe6\x8a\xb5\x18\xca\xa8\xbe\x92\x85\xd6\x19\xe6\x04\xea\x4d\xdf" + "\xa3\xb9\xd1\xe0\xfa\xda\x6a\xce\x92\x25\xeb\x22\xf2\x05\xf0\xe6" + "\x3b\xd6\xe5\x7b\xd9\x6c\xf2\x5f\x47\x3e\x6c\xe6\x31\xc7\x1e\x94" + "\xb7\x67\x04\xd3\xa3\xac\xc3\xb6\xc5\x84\xb5\x86\xef\x5b\x97\xef" + "\xa7\xb2\x4f\xd2\x7e\xb4\x19\xfd\x23\xf6\xa5\xb7\x2c\x36\x67\x13" + "\x23\x7f\xf5\xf7\x9b\x64\x37\x95\x73\x9a\xbd\x35\x94\xb7\x77\xa7" + "\xc1\x98\x2a\x7c\xe6\xf1\xb6\x7a\xe4\xed\x4a\x3b\x6c\xe7\xa9\xbc" + "\xb7\xe2\x6c\x69\xa0\x39\x95\x36\xa9\x7d\x2d\xe6\xd7\x5b\x0b\xad" + "\xcb\x2b\x18\x8d\x0f\xe5\xc7\xfd\x5c\x5b\x07\xf2\x9e\xf1\x1f\x17" + "\xca\x83\x67\x4f\xa3\xdc\x1f\x7b\xcf\x91\xe8\x7c\xc3\x9b\xa7\x0c" + "\xed\x41\x5f\xd5\xed\x44\x1f\x09\xf9\xda\x9b\xe7\xa8\xae\x76\xf6" + "\xa6\xc3\x96\x75\x22\xb0\xfd\x11\xd6\x3e\xe6\xfd\xfa\x06\x2e\x5b" + "\x7a\xeb\xf3\xfb\x5d\x92\x2c\xf0\xec\xed\x12\xd0\x6e\xa0\x13\xdf" + "\x2e\x21\x2c\xe0\x78\x32\x96\xce\x7e\xdf\xde\xae\xd3\x88\xf1\xa5" + "\xb6\x10\xcd\x14\x68\x8c\x7d\xe4\xfa\x7a\xaa\xab\x3a\xc6\xb2\xfe" + "\x95\x6a\x89\xce\x6b\x46\xa0\xbf\x7b\x0d\x4c\xcc\x3f\xd9\x82\x72" + "\x9f\x16\xeb\x28\x31\x49\x39\x7b\x4b\xea\x8c\x4a\x74\xca\x6b\x0d" + "\x4c\xd5\xb5\xc3\xfa\xe5\x67\xd1\xf8\xa6\x81\x30\x6a\x8f\x56\xac" + "\x1d\xaa\xa3\xf2\xee\x34\x71\x8e\xfc\xf6\x5c\xbc\x3f\x2d\x60\x7b" + "\x43\x80\x3b\x05\x80\x69\xb4\x87\xdb\x05\x00\xab\xb0\x1f\x84\xdb" + "\xba\x7a\x98\x38\xdb\xae\x89\x02\x8d\x1f\x4e\x36\x61\x6a\xdd\xfa" + "\x27\x83\x7f\xbb\x59\xc8\xe0\x6b\x62\x55\x7e\x53\xd6\xa3\x8f\x0b" + "\x74\xdc\x77\x39\xe8\x2e\xa9\x2b\xea\x15\xab\x23\xea\x6d\xc5\x16" + "\xa9\x66\x9a\x1c\x25\xf0\x36\xd5\xc9\xf2\xa9\x5d\x0a\xdf\x15\x4e" + "\x6d\x46\x39\xe9\xea\x59\xb0\x5a\x76\xd0\x78\x00\x6a\xdb\xd0\x26" + "\x61\x4b\xfc\x4a\x35\x6f\x1b\xf9\xc3\x10\x6d\xe3\xf6\xb8\xfd\x6b" + "\x4f\x8d\x88\x11\x60\x79\xc5\x6a\x1d\x41\x65\x1c\x58\xcd\x75\xf1" + "\x31\x26\xc0\x87\xeb\xdb\xd9\x3b\x13\xe5\x41\xbf\x19\xd4\xbf\x32" + "\xdf\x61\xa2\xcc\xb7\x1d\xdb\x81\xc1\xc2\x3e\x88\x74\x58\x0e\xcc" + "\x97\xb7\xbe\x4d\x36\xeb\x5d\x9d\xf8\x1e\xe6\x87\x0f\x0e\xbd\xd3" + "\x4a\x63\x35\x76\x2f\x4b\x10\xf3\xf0\x9d\x4f\x48\x2e\x21\xe2\xb5" + "\xbc\x53\x84\x79\x3f\x53\xf0\x4b\xaa\x5e\xa6\x86\xeb\x65\xfa\x62" + "\x6c\x3f\xeb\x28\x78\x9a\xe8\x97\x2c\xf8\x9d\xc3\xf5\x74\x50\xdf" + "\x55\x2e\x15\xff\xde\xc9\x91\x49\x36\x9c\xa7\xc8\x08\x09\xcb\xf2" + "\x84\x3f\xad\xee\x82\x03\x06\x8f\x8c\x90\xec\x27\x0b\xe4\x3a\xca" + "\x87\xb1\xff\x9a\xf2\x08\x7f\x3f\xed\x8a\x6d\xe1\x81\xdb\x14\xbb" + "\xc1\x38\xd2\x47\xc2\xbb\x73\xed\xac\x65\x3f\x97\xe5\xa0\x0f\xe8" + "\xdb\xbc\xee\x5a\x92\x07\x1e\x30\x79\x65\xb2\xef\x70\x7b\x6e\x61" + "\xfb\x7b\xa0\x48\x9d\x23\x68\x6f\xb8\xf0\xd1\x5f\x73\xee\xe0\x18" + "\xc6\xe7\x40\xa7\x6c\x18\xf4\x83\x32\x9a\x93\x07\xaa\x7c\xfb\x69" + "\xb6\x4b\x32\x0b\x0c\x7a\xa7\x54\xe6\x6b\xfd\x9d\xd2\xab\xd3\x13" + "\xef\x86\xa9\xb4\x88\xe8\x67\x3d\xf0\xe5\xbd\x46\xde\xd7\x96\x71" + "\x95\xe4\x57\x73\x6d\x1e\xf9\x06\x7e\xf7\x10\xf9\x5d\x76\x59\xc6" + "\xd5\xb9\xcd\x06\x8a\xe9\xc2\x24\xcb\xb8\xa6\xd3\x26\xa6\x4d\x35" + "\x91\x1c\xda\x9c\x4f\x3c\x1e\x78\x56\xbd\x1c\x0d\xfa\x04\xeb\x7c" + "\x5d\x26\xd3\x3d\x9e\x81\xb2\xcd\x71\x31\xe4\x17\x99\x7c\x22\x93" + "\x5f\x73\xb7\x39\x2e\x1a\xbf\x87\x81\x9e\xd3\xcb\xfa\x71\xd5\x74" + "\x96\xed\x2e\x90\x81\xc7\xcd\xe4\x9b\x59\x6b\x73\x38\xd9\xba\x33" + "\x2c\x82\xfc\x2e\xbb\xb6\x9a\x4b\x1b\xba\x4e\x72\xfe\x66\x88\x89" + "\xc5\x80\xfe\x88\x45\x9f\x1b\xa4\x28\x33\xf8\x50\xf3\x46\xd1\xee" + "\xaf\x65\xd1\x6e\x51\x6f\xaa\xbf\xc0\xb8\xf1\x4d\x79\xbc\xee\xef" + "\x65\xba\x50\xbe\x64\x99\x74\xcc\x6d\x99\xd4\x28\xec\x57\xeb\x59" + "\x5e\x96\xdc\x66\xeb\xaa\x07\xcf\x75\x81\xc7\xa1\xa2\xb3\x72\x6a" + "\x23\xb5\x8f\xbe\x7d\xe4\xfc\x19\xee\x47\xda\x85\x7b\xf3\x62\xe5" + "\x9d\x0e\xbc\xd3\x51\xcf\x7a\x2c\x93\x78\xdb\x1b\xba\xc4\xbb\xa9" + "\xfc\x37\xbd\xef\xd3\x0f\x4a\x9b\x3d\xfd\x80\xb6\x53\xfb\xa8\xfd" + "\x2e\xea\x13\xf4\x81\xd2\x56\x43\xaf\xd2\x4e\x6a\xe3\x07\xd8\x75" + "\x5e\x40\x3b\xd1\x56\xde\xce\x5e\xb4\xb3\x2e\x83\x31\xe7\xb6\x57" + "\x1a\x2f\x45\x4f\x6a\x24\x1e\xd5\xfc\x21\x68\xf8\x5c\x0b\x03\x2f" + "\x1a\xba\x2f\xcf\xa2\x7d\x16\xb4\x49\x9e\x03\x3c\xa9\x43\x6e\x23" + "\x3d\x55\x9b\x09\x7f\xae\x32\x46\x34\x8e\x4a\xaf\xe3\xdb\x86\x23" + "\xd2\x29\x96\xd7\x26\xb7\x81\x36\x75\xda\x5c\xc8\x93\x81\xf6\x83" + "\x87\x3d\xad\xd4\x9f\xf2\xae\x3b\x27\xda\xa5\x5b\xcc\x62\xde\x7d" + "\xac\x48\x6b\x6b\x2a\x62\x6a\x5b\x52\x90\x0f\xed\x31\xa0\x2c\x1e" + "\x87\x46\x42\x3b\x77\xa2\x9e\x4e\x9f\x36\x1d\xed\x20\x5d\xd9\xe3" + "\x6c\xd0\x1c\xa6\x79\xe1\x2c\xda\x71\x96\x19\x2c\x79\xa0\xbf\x1e" + "\x24\x7a\xd1\xfa\xe2\x75\xc9\x6c\x94\x9d\xbd\x2b\xe2\xb5\x0a\x3f" + "\xaf\x43\xdb\xd9\x7b\x87\x55\x5f\xae\x12\xf9\xc2\x8e\x32\x97\xd1" + "\x3c\xe2\x7e\x5d\x69\xcf\xe8\xc6\x9c\xa1\x33\xed\x55\xf8\x46\x77" + "\xdc\x30\x5e\x9f\x02\xe1\x0b\x16\xf7\xe4\x2f\x9f\x6c\xc3\x34\x78" + "\xaf\x54\x46\x9f\x51\xf9\xa0\xe7\x36\xd2\x95\xfa\x30\xa0\x5e\xe9" + "\xab\x6c\xb2\x1c\x9d\x48\x7e\x79\xb5\x55\x79\x0e\xed\xd3\xaf\xb2" + "\x31\xfd\xc3\x94\xf7\x9c\xc1\xf0\x9b\x64\x99\x54\x1e\xda\x16\xdd" + "\xce\xfe\x7c\xd2\x7f\x8d\x19\x39\x96\x09\x1c\xfc\x73\x05\xc9\x0a" + "\xfb\xf7\xdd\x3f\x73\x1a\x8e\xf4\x11\xfa\xf9\x5e\xa5\x5a\x0f\xfc" + "\xbe\x4c\x8f\x48\xad\x7b\xff\xfb\xe1\x20\x0b\x56\xd6\xe6\x1d\x5c" + "\x67\xd0\x5c\xbc\x03\x78\x01\x5a\xe1\xa0\x81\xce\x1d\xb0\x77\x56" + "\x74\xb1\x15\xbb\x58\x84\xf9\x0c\xc9\x85\x66\xb1\x83\x65\xf1\x6c" + "\xf7\x79\xf2\xcf\x14\x17\xfd\xdc\x79\x8c\xa5\x82\x21\x44\x93\x92" + "\xcc\x55\x5e\x11\xa7\xdf\xb2\x43\xa5\xe1\x0f\x1e\xce\xbd\xc0\xb4" + "\x22\xf6\xf7\xc1\xba\x69\x46\xd9\x55\xa2\x95\x32\xca\xc8\xcf\x71" + "\x74\x05\xd1\x29\x19\xaa\xdf\x5f\x4e\xfb\xe4\x60\xcd\x75\x1a\x06" + "\x6d\x5e\xce\xc6\x90\x8f\x72\x9d\x43\xd0\x72\x62\xbf\x3e\x48\xba" + "\x9b\x7a\xc5\x17\xb0\x5e\xf1\x05\x9c\x40\x7a\xd5\xe2\x79\xed\xad" + "\x6e\xf0\x30\xbc\xdc\xe5\x6c\x54\xd9\x79\x16\x47\x74\x50\xea\x29" + "\x41\xb3\x11\x5f\x38\xab\x43\x27\xbb\xff\x1e\xc7\x76\xb5\x7b\x7d" + "\x98\x3b\x56\x90\xdf\x73\xd9\x10\x4c\x47\x78\xcb\x30\x7e\xf6\xce" + "\xfd\x52\x92\x4c\x1e\xf7\xac\x64\x1b\x0b\x3d\x48\x7a\x7c\xe5\xc2" + "\xde\xe8\xa0\x4b\xe8\xb4\x76\x17\xd4\x96\xaa\x3e\x9e\x83\x9e\x2d" + "\x5b\x04\xbf\x23\x85\x83\xff\x72\x74\x5b\x85\xbf\xbf\x5a\xbb\x6d" + "\xa3\xe4\xc3\xe3\xd4\xbe\x47\xcf\x28\x8d\x7c\x28\x25\xf0\xbe\x3c" + "\x14\x41\x7c\x8f\xc2\x33\xbe\x6b\xf4\xa4\x09\x1a\x86\xeb\x15\x1b" + "\xc4\x59\x19\xf6\xa6\x21\xdd\x05\x87\x46\xa9\xfb\x19\xed\xeb\x42" + "\x36\x7c\x68\xb2\x5d\xdb\x1e\xd4\x7f\x0e\x9d\x8d\x28\x7a\xd0\x74" + "\xce\x91\x80\xfc\x19\xea\xfe\xc6\xcf\x3b\x37\x8c\x48\x5c\xb1\x9a" + "\xc5\xfe\xfb\xf0\x08\x46\x67\x65\xc8\xdb\x26\xf6\xdd\x43\x16\xaf" + "\x3c\x3d\x81\xf7\x37\xd9\x03\x73\x1e\x83\xfc\xec\x09\x7f\xe5\x1d" + "\xaa\xbf\x3d\xb1\xff\x1e\xda\xe7\xf3\x9d\x46\xcf\x3e\x8a\x6f\x90" + "\x9e\x35\x95\x2f\x68\x93\x43\x1b\xb9\xcd\x18\xf2\x89\xfd\xf5\xd0" + "\xc6\x2b\xd0\x62\x71\xd4\xbf\x92\xc2\x4f\xda\x3a\xbe\x14\xfd\x9b" + "\xc3\x42\xc6\x95\x30\xc3\xbb\x79\xf6\xd0\x21\xc2\x8f\xae\xae\x85" + "\xbd\x7f\x33\x3d\xa7\xb9\x6e\x1d\x4b\xf2\xc0\xf7\xd7\xd9\x68\xdf" + "\xee\x4d\x8e\xbc\x9f\x78\x7d\x4e\x8b\xbf\xbf\xf8\x36\xbc\x87\xb4" + "\xe8\x03\x67\x9d\xa1\x5b\xd6\xb0\x31\xc2\x6f\xe1\xfb\x3c\x36\xb0" + "\xe3\xfa\x5f\x75\xff\x20\x86\x19\x7e\x50\xc2\xe2\xba\x0b\xde\x2f" + "\x01\x7f\x29\xf4\xdb\xe8\xfb\xdb\x6a\x8c\xe4\xab\xfd\xb5\x1e\x7b" + "\x98\x18\xab\xbf\x8c\xc7\x7d\x9c\xf7\xfe\xfd\xa3\xca\x59\x0a\xda" + "\xfe\x97\xf8\x3d\x67\x85\xbe\x38\x97\x2f\x59\x2a\xca\xbd\x67\xf5" + "\x7f\x19\x2f\xea\xf2\x97\xf1\x07\x81\x26\xbb\x76\xc8\xc7\x76\x0f" + "\x93\x1b\xbb\x0b\xfe\x12\x6a\x67\x87\xa6\x29\xf2\x98\x46\x3e\xaf" + "\x88\xde\x2d\x24\x1e\xec\x4b\xeb\x66\xe4\xa3\x7d\x02\xf4\x51\x82" + "\xa0\xe1\x2b\xaa\x25\xcc\x1f\x9f\xf6\xef\x22\x79\x63\x40\x4c\x7c" + "\x81\x31\xfe\xce\xd6\x97\x9c\x5c\xf7\x63\x6b\x4d\x0e\xae\x98\x6b" + "\x2f\x97\xe3\x1a\x89\x39\x57\x85\xab\x1e\xd7\x4a\x5c\x63\xf0\x3c" + "\x8d\xe6\x25\x78\x58\x03\xc5\x9b\xeb\x8c\x7a\xc9\x11\xcc\xf6\x87" + "\xfa\xc6\xb6\xf1\x61\x26\xf4\xdb\xea\x62\x28\xd6\xd8\xec\x5d\x8c" + "\xad\x70\xc9\x3d\xc6\x9b\xd8\x80\x16\xa4\x99\x77\xd1\xb9\xf3\x5f" + "\xda\xfc\xcf\x9d\xeb\x22\xf0\x97\x84\xbf\x32\xfc\xd5\xe3\x2f\xc6" + "\xfb\x77\x38\xa2\xbb\xa0\x2e\x06\xfd\x28\xfc\x41\xf4\x0b\x13\xeb" + "\xb8\xbd\xf8\x16\xe2\x8b\xa2\x36\x58\x45\x7b\xdf\x6e\xc4\x7d\x84" + "\x1c\x55\xa3\x57\xda\x6b\xc5\xbd\xde\x68\xc6\xbe\x16\x85\x3e\x19" + "\x81\x36\x47\xd5\xe4\x50\x7b\xa9\xbe\x9d\x51\x2f\x97\xfb\xda\x3d" + "\x51\x99\xd4\x7e\x47\x54\x05\x95\xc7\xe4\xb1\x53\xe3\xd5\xfe\x54" + "\xfa\x89\x6c\x42\xb4\x9d\x28\x43\xd0\x41\xc8\x8f\x32\xd4\xfc\x9e" + "\xbe\x1f\x41\x3e\xc0\x30\xa6\xc8\x07\x9e\x38\x42\xb5\xa9\xea\x2e" + "\x38\xcc\xde\x5b\x2c\xce\x33\xe8\xdd\x2e\x9f\x77\xc9\xcf\x47\xa0" + "\xf7\xf1\xcd\x08\xf1\xcd\x97\xcb\x4f\xb3\xba\xa1\xca\x77\xbb\x82" + "\xad\xa5\xbc\x9b\x41\xdf\x95\xd9\xc9\xfe\x87\xe8\xa1\x29\xb6\xd8" + "\x2e\x66\x2b\x93\xb0\xe7\x57\x34\x26\xe4\xc9\xd6\xd3\xec\xf0\x1b" + "\x0d\xce\xb6\x7e\xee\x87\x87\x05\x2f\xda\x93\xcf\x6c\xb9\x13\xb8" + "\xbe\xfa\x59\xf6\xc1\x29\x9b\x83\xdb\xd6\xd2\x6f\xee\xf3\x99\xce" + "\x9b\x69\x6f\x20\x1f\xf6\x2a\x8f\x2d\x21\xef\x6e\x4a\x47\x1a\xd9" + "\xff\xef\xf1\x79\x26\x6f\x7b\xa9\x49\xac\xa9\x0f\x76\x11\x6d\xc1" + "\xeb\xeb\x9a\x6e\xa5\x3a\x4b\x96\x97\x9a\xa8\x0d\x66\xf0\x7f\x14" + "\xe7\x8f\xd6\x84\x31\x9b\x64\x85\x1f\xac\xc6\xbc\x93\xa5\xad\x2f" + "\x35\xf5\xaf\x0d\x1f\x70\x3f\xec\x66\x97\x7c\xd6\x11\xf5\x52\x13" + "\xd1\x24\x5b\xf2\xc2\x22\xee\x2e\x93\xad\x9d\xd1\x15\x58\x97\x1f" + "\x94\xbd\x97\x23\xc6\xa6\x9f\xe5\x96\xa9\x6d\xdf\xad\xb4\x1d\xfd" + "\xc5\xcf\xa8\xc6\x95\x8a\xd8\x00\xc8\x73\x2c\xa8\xcc\x0a\xe3\x4c" + "\xf4\x00\xf6\x86\x4b\xa2\x2f\x8e\x8c\xf2\xec\x0d\xfd\xaa\xc7\x91" + "\x51\xd7\xf0\x8d\x5e\xe5\x1b\x45\xdf\xf0\x1b\x45\x57\xfa\x86\x38" + "\x6b\xae\x8f\xe9\x3f\xef\x78\xc4\xce\xe7\x8a\xa5\xc2\x2a\x30\xf3" + "\xe8\xd3\x6e\xf0\x6f\x2e\xfd\xdb\x8d\x44\xdb\x90\x5e\xa9\xcd\xee" + "\x62\x2e\xcb\x06\xeb\xd1\x9c\x1e\x66\xcd\xfe\x88\xb5\xb2\xfa\x59" + "\xf4\xce\xd1\x2c\xe2\xd9\x6a\xf4\xbd\xdb\x5e\x36\xf6\x6a\x8f\xa4" + "\x53\x7f\xef\xa2\x38\x0c\x3e\xf3\xac\xa1\xeb\x23\x66\x4b\x23\xf9" + "\x6a\x23\xc9\xb5\xf5\x72\xd4\xdb\x8d\x12\xb0\x01\x34\xba\x9b\xf7" + "\x07\xe8\x17\xc1\x6f\xbd\x52\xcd\xf9\x2d\x07\xf7\x4f\x3a\x18\x74" + "\x6f\xa4\x5c\xf0\x5c\x3a\xc9\xbe\xdd\xbd\xc9\xc6\xee\x02\x36\x87" + "\x62\x22\x90\xdc\x59\xd6\x4f\xb5\xcf\x76\x85\xc8\x9c\x9f\x02\xed" + "\x4f\xb1\x11\x6c\x5d\x76\xe6\x06\x1d\x5d\x76\x91\xc5\x94\x81\xf6" + "\x04\x66\xeb\x09\xd7\xf7\x28\xb1\x11\x36\x5f\xf4\xc6\x46\xd8\x4d" + "\xb2\x9e\x26\xfc\xbe\xc8\x42\xdd\x5b\x5f\xa9\xde\x79\x91\x8d\xda" + "\x95\xcd\xe2\x76\x92\x2c\xef\x2b\x41\xfb\x70\x3d\x70\x8a\x93\xb0" + "\x34\x8e\xce\x12\xbc\xb4\x0f\xd9\x82\x7b\x71\x2b\x94\xcb\x40\xfa" + "\xd5\xdf\x47\xf9\x3e\xe8\xb2\xbc\xe4\x74\xe9\x6b\x72\xd0\x77\xe5" + "\x76\x56\xbf\x11\xfd\x17\x50\xe6\xa5\xea\x93\x94\xf8\xc4\xb6\x78" + "\x6f\x94\xc0\x77\x94\x55\x17\x6c\x4e\xb8\x77\x26\xb3\x71\x1d\x2c" + "\x5e\xd8\x21\x0e\xc4\x9e\xd8\x30\x86\xf4\xff\xf2\x9e\x62\x06\xf7" + "\xce\x79\x1a\xf3\x8b\x2c\xc4\xe6\x4a\x60\xf4\x97\x77\x4e\x6e\x1b" + "\xb7\x98\xc5\xd3\xf9\x03\x9d\x95\x18\xd7\x52\xfe\xa3\xee\x51\xb9" + "\x2c\xde\xb7\xec\xa7\x56\x2f\xcf\x1c\x1f\xff\xcb\x85\xc6\x27\x33" + "\x97\x3f\xb5\x6a\xfe\xf2\x85\x2c\x49\xa8\x4d\x70\xd7\xcf\xab\x49" + "\x67\x62\x55\x66\x56\x86\xf1\x89\x95\xcb\x97\x2f\x5c\x92\x65\x9c" + "\x75\xf7\x9c\xcb\xfd\xff\xed\x34\x54\x70\x7f\xaf\x5c\x87\xce\x76" + "\x52\xfe\x8f\x1f\x5d\x2c\xce\x66\xa1\xba\xf5\xf7\xcc\xd5\xb9\x92" + "\x8c\x22\x3e\x12\xe6\xca\xb6\xa4\x5c\xd9\x9c\x5c\x2a\xe8\xd4\x46" + "\xe5\x4c\x21\x29\x5f\xd8\x56\x34\x0a\x99\x4c\x77\x52\xac\x58\x53" + "\xb6\xa8\x90\x2c\x46\xbf\x9f\xa2\xdf\xba\x2c\x56\x64\x1d\x41\xe7" + "\xe1\xb6\x28\x9e\x6f\xe7\x4c\x8d\x9a\x4f\xcd\x23\x9e\x37\xf0\xd8" + "\x89\xbb\xb9\x2f\xcc\x86\xc9\xe8\x9f\xe8\xee\x02\x5b\x9c\x3d\x74" + "\x6c\x82\x72\xbe\xde\x26\xf4\xf5\x1a\x19\xf9\xc3\x93\xff\xe3\x86" + "\x8b\x4a\x39\x69\xf8\xde\x75\xc8\x3b\x17\x63\xd0\xac\xe8\xf5\x8d" + "\x6c\x51\xea\x25\xf4\x4e\x1b\xee\x13\xfa\x1d\xb6\x1c\x1f\x7b\x6c" + "\x6e\x53\x4f\x7b\xa3\x42\x93\x76\x2b\xe5\x95\xa9\x98\x80\xfc\x14" + "\xff\xa6\xa8\xff\x58\x68\x13\xfc\x8f\x9f\x9f\x13\xa5\x9f\x76\x1a" + "\x7e\x0b\x7c\x88\x6d\x67\x0d\x96\xbe\xf3\xc5\x33\x82\x33\x96\x3c" + "\xb1\xf4\x29\xd3\xfc\xac\xcc\x05\x99\x8b\x33\xb3\x56\x73\x33\xf0" + "\x31\xfc\xdf\xbd\xa3\xd3\xe7\xf6\xf5\xdd\x3c\x86\x64\x2c\x8a\xcf" + "\xd7\x2e\xd2\x69\x10\x72\xae\xc6\xed\xae\x02\x36\xb2\x7f\xf5\x6e" + "\x4c\xe3\xf2\x60\xee\x7f\xa0\xb1\xc2\xae\xfd\x2a\x47\x39\xef\xe8" + "\x50\xfa\x9e\x3f\xef\xd4\xd7\x90\x1c\x76\x4a\x0b\x3b\x36\x8d\xce" + "\xb9\xd0\x7f\x55\xb4\x1f\x16\xaf\xa1\x7d\x0b\xa3\xe0\x9a\xa0\xc4" + "\x67\xfd\xf0\x75\xea\x03\xa2\x09\xd1\x07\x15\x2d\xec\xc3\xe1\xbc" + "\x0f\xbe\x36\x54\x70\xdf\x03\x5f\x1b\x7e\x4b\x73\x8b\xea\x2c\xc9" + "\xc9\x3b\x65\x39\xf9\x05\xe9\xeb\x8c\x9d\xf2\xd7\x19\x2f\x78\xfd" + "\xc6\x7d\xb8\x11\xef\xee\xc5\xbb\xcf\x50\x1c\x9a\xe2\xb3\x6c\x2f" + "\x9d\x7f\xd3\xbd\x2e\x4b\xcf\xdc\xfa\x8a\x4a\xaa\x8f\xad\x2d\x9e" + "\xd3\xdb\xad\xc8\x6f\xeb\x9a\xc0\x40\x4b\x56\x71\x9b\x46\x7e\x5e" + "\x07\x7a\x0f\xef\xd9\x50\x2f\x5b\x5b\x0f\xf1\xc4\x95\x12\x68\x3e" + "\xb4\x77\x3f\xf6\x4f\x07\x95\x4b\x6d\xe6\x76\xc5\xc3\x64\x7b\x77" + "\xc1\x87\xc0\x81\x06\x93\x42\x9b\x72\x7d\x0b\xea\x03\xff\xf1\xfc" + "\x90\xfb\x74\x40\x1f\x5f\x2f\x5b\xc6\x39\xc5\x98\x7e\xc8\x7d\x5d" + "\xcc\x6c\x95\xbf\xf6\xda\xb3\x7f\x78\x06\xf7\xbd\xf8\x93\x64\xcb" + "\x78\x83\xcf\xb9\x32\x9e\x7d\x34\x94\xd3\x6e\xc3\x64\x87\x69\x0d" + "\xc5\xed\xfe\xe8\x66\x31\x6f\xc6\x5f\xef\x30\x67\x84\xe0\x1d\x37" + "\xd9\x5f\x8a\xbe\xfc\x68\xaa\x6d\xe3\x59\x55\x4f\x03\xdf\xff\xe8" + "\x73\xeb\x93\x2e\xc6\xe3\x48\xb7\xba\xb8\xde\x9f\xe2\x63\x40\x23" + "\x15\x34\x92\x9f\x3d\x3d\x78\x3b\x3a\x8b\xe6\x3e\xd2\xbb\x0b\x3e" + "\xca\xf2\xd8\x89\xe9\x05\xbd\x47\x34\x17\xc5\xd8\xa2\xb9\x4f\xf4" + "\x1b\xd5\x89\xe6\x3e\xca\x2e\xa7\x33\x6a\xb1\x06\x3e\xda\xfb\xcd" + "\xd6\xc0\x47\x5c\xfe\x8b\xb2\x12\x64\xad\x59\x1e\xb7\x89\xa5\x71" + "\x1d\x02\x57\x17\xd9\xcd\x86\x62\xdf\x38\x26\xf0\xe4\xd8\x8d\x5c" + "\xcf\x24\xbb\xa3\x9c\x6c\x53\xf7\xf4\xb0\x48\xc9\x32\xb5\x89\xe8" + "\xec\xa3\xb9\x5c\xf7\x22\x02\xef\x55\x91\x6e\x06\xe9\xd2\x0d\xe1" + "\x71\xdb\x3e\x62\x7b\x2e\xb0\xd0\x56\xf6\xd7\x31\x74\x16\xe4\xed" + "\xeb\xbf\xae\xa7\xb3\x3f\x79\xdb\x58\x8b\x2e\x57\x5b\x44\x65\x48" + "\x17\xcf\x4c\x56\xdf\xa3\x18\xc1\xf4\x5e\x0b\xfb\xeb\x42\xfe\x1e" + "\xe5\x25\x1f\x4b\x79\xfa\x79\xa0\xb3\x9c\x94\xdf\x85\xfb\xdd\x92" + "\x7e\x8e\x8c\xfd\xc0\x9d\xed\xaa\xc2\xb3\xb9\x92\xe5\xe5\x72\xa4" + "\x25\xf3\x33\x88\x5e\x03\x9d\x4d\x62\x7e\x99\xab\x6c\xf6\x2f\xad" + "\xbc\x3e\x64\x4b\x9b\x85\xbd\x93\xf3\x25\x7f\x7d\x73\xf7\x57\x3c" + "\x9e\x1c\xc6\xf3\x98\xf0\x9d\x79\x96\x55\x8a\xfa\x1d\x9b\xd5\xb9" + "\x6d\x52\x63\x27\xe6\x66\x97\x36\x82\x1d\x34\x90\x2e\x79\x4d\xda" + "\x41\x43\x0f\xc6\xe7\x58\x0c\xb0\x4e\xa1\x89\xc5\x7b\xea\x9c\x0c" + "\x31\xe8\x93\xf0\x7c\xa2\xaa\x8f\xa4\xce\x47\x3b\xfb\x6b\x24\xf5" + "\x1b\xe6\x71\x53\xc3\x62\xd2\x2d\x93\xea\xf1\x2d\xe6\xce\x96\x9a" + "\xe9\x6c\x9c\xf4\xf6\x89\x9f\x99\x9d\x23\x77\x12\x7f\x46\xb6\x4e" + "\x74\x1e\x4e\x36\xdc\xbb\xc0\xdf\x52\xd9\x28\x77\x93\x6a\xcb\xbd" + "\x19\x69\x54\x36\xd9\x33\x15\x2f\xe2\x6b\x8d\x74\x38\x23\xf9\x99" + "\x40\xc8\xaf\xbe\xba\xbf\x4b\xee\x24\x7b\xf9\xfb\x4d\xb8\x2a\xe5" + "\x90\x9f\x1d\x94\xd1\xa8\x96\x21\x91\xfe\xeb\x72\xae\xe7\x66\x17" + "\xef\x0b\xfd\x9f\xfb\xbb\x24\x6e\x87\x42\xef\x0b\xbd\x9c\xe3\xa1" + "\x1e\x1d\x4a\x6e\x1b\x72\x3c\x46\xf5\xc3\x83\xdf\x46\x8f\x6d\x1b" + "\xfa\xaa\xd3\x52\x51\xd9\x85\x35\xde\x65\x79\x09\xbc\xfa\xf1\x29" + "\x40\x98\x8a\x2b\xca\x28\xc8\x7e\x7f\x25\xd3\x4a\xd1\x89\xa1\xe4" + "\x9b\x81\x6c\x3e\x85\xde\xf6\xf1\x5d\x8a\x9f\x86\x90\xb3\xec\xf8" + "\xa3\xde\xb3\x71\xb7\x22\xd7\x3d\x5e\x2b\xf8\x8a\xe3\xb5\x5c\xae" + "\xbb\xad\xc2\xf2\xd2\x1a\xa7\xb6\x6a\x8d\x5d\x2b\x74\x19\x8f\xe3" + "\xd9\xc9\x0e\xaf\x2e\xe3\xf1\x1c\x2a\x2b\x30\x1d\x38\x5d\xa1\xe9" + "\x3f\xe6\xf6\xb5\x5e\x3e\xfd\x63\xbe\xcf\xd1\x39\xb6\x44\x34\x5d" + "\xf4\x86\x46\xd2\x5b\xb2\x99\xce\x93\x7c\x37\x5c\xc8\x0c\x3e\x56" + "\xe2\x08\x73\x3d\xc5\xef\xb5\xfb\xdf\x47\xd3\xbd\xe8\xb3\x8f\x93" + "\xd4\xb3\xa2\x62\xad\x64\xd7\x69\x98\x6c\x2e\x07\xe6\x99\xba\xb8" + "\x7f\x00\x1b\x68\x44\x8a\x8d\x6d\x5a\x4e\xb6\x80\x1f\xaf\x23\xbf" + "\x01\x62\xcd\x7d\xcc\xed\x92\xa4\x82\xbb\x64\x33\xf1\x49\x0e\x8a" + "\xd5\x71\x9e\x21\x5f\x14\xf2\xbd\x52\x9b\xdb\x41\x7a\x5f\xf5\x14" + "\x27\xb2\x55\xf9\xb6\x23\x6a\x7a\xd3\x0f\x22\x59\x1a\xbe\x59\x63" + "\x67\xaf\x4c\xeb\x3f\x1e\x7c\x5c\x73\x25\x9a\x59\xd0\x70\x09\x2c" + "\x18\xdf\x4d\x72\x95\xb1\xf8\xfe\x2c\x99\xea\xff\xdf\xaf\xb8\xb4" + "\x4e\xd6\xab\x1d\x20\xff\x28\x3f\x87\xb9\x0a\x06\xc8\xee\x35\x18" + "\xaf\x4e\x03\xf8\xb2\x7a\xd6\x20\x74\x61\xe8\x3c\x5f\x97\xd7\x25" + "\x9f\xb7\xb9\xf6\x93\x5c\xdf\x81\xb1\x02\x1e\xfd\xf7\x8b\x36\xd7" + "\x3b\x8c\xf4\x93\x09\x47\x5a\xd8\x7f\x73\x7f\x4c\x63\x4d\xf9\xec" + "\xb6\xb3\xfc\xf9\x4c\x41\xcf\xfd\x77\xa5\x72\xcd\x21\xff\x98\xbe" + "\x75\xba\x77\xe5\x92\x27\xc8\xc9\xea\x6d\x33\x17\x66\x2f\x5c\x6c" + "\x7c\x90\x5c\xb0\xf6\xd1\x35\x8c\xf0\xc6\x15\x6b\xca\xa2\x3d\x92" + "\x68\x6a\x8a\x2f\xc6\x63\x8b\x15\x4c\xc4\x7a\x57\xe2\x8a\x11\x6d" + "\xfd\x4f\x88\x2d\xa6\xd2\xcc\x14\x57\xcc\x7b\x26\xf3\xc9\x44\xcf" + "\x1a\x90\xde\xed\xa6\x7b\xbe\x2f\x17\xfc\xf7\x7e\x5a\x47\x62\xdf" + "\x68\xda\xeb\xeb\xc3\x46\xd0\x4c\xe6\x2a\xa4\xd7\xaa\x36\x9b\x98" + "\x8b\x91\xb8\x3f\xe6\xb5\x11\x69\xb2\xa3\xdf\x8c\x62\xfd\xf2\xbc" + "\x0e\x55\x77\x41\x89\x19\xcd\x75\x2d\xa4\xc2\xeb\xf7\x0a\x79\x61" + "\xd3\x85\xdd\xd2\x80\x08\x71\x56\xf5\x49\xac\x6a\x83\x24\xd6\xe6" + "\xbb\xca\xda\xfc\x64\xe2\x95\xf4\x4b\xbc\x6b\xe3\x13\x93\x77\x5d" + "\x7f\xa6\xbe\x6b\xba\x9a\x6e\x8a\xc2\xb7\x0d\x6d\x67\x7f\x7b\x9a" + "\x64\x88\xc2\xe6\xf8\x6f\xdc\x27\xa5\xf0\x03\xf1\xb7\x19\xca\x6f" + "\x7c\xe3\x6f\xe3\x95\xdf\x37\xe0\xf7\x70\xe5\xf7\x08\xfc\xd6\x28" + "\xbf\xb1\x66\x4f\x7c\xa5\xfc\x8e\xc1\xef\x0f\x95\xdf\xd8\x13\x4e" + "\xbc\xa9\xfc\x1e\x86\xdf\x2f\x2a\xbf\x87\xe3\xf7\x33\xca\x6f\xac" + "\xc1\x13\xcb\x98\x38\xe7\x8f\x38\xcd\x4e\x3c\xde\x7f\x3e\xf2\x44" + "\x9c\x38\x4b\x3e\x01\x9e\xbb\x71\xb2\xd8\x53\x3c\x69\xb9\x18\x9b" + "\x7a\xb5\x7f\x91\x6e\xa4\xef\x20\xbd\xc4\xce\x6a\x2b\x7c\xd2\xf5" + "\x4a\x7e\xec\xff\xc7\x93\x7c\xd2\x43\x95\xf4\x5a\xf0\xab\x75\xde" + "\xf4\x4f\x9c\x4a\x7a\x33\xf2\x37\xfa\xa4\x77\x28\xe9\xc0\xcb\x03" + "\x4d\x3e\xe9\x76\x91\xfe\xb7\x48\x55\xaf\x46\x49\x3f\xa6\xa4\x8f" + "\xb2\xb3\x3f\x16\xf9\xa4\xd7\x29\xe9\xc0\xff\x4f\x12\x7c\xd2\x39" + "\xae\x08\x9f\xc4\x3a\xf9\x60\x2e\xad\xad\xbf\x81\xb6\xab\xc9\xf1" + "\xc9\x53\xa5\xbc\x9b\x63\x67\x6f\x97\xfb\xa4\x57\x28\xe9\x16\xbb" + "\x66\x50\x8c\x4f\x7a\x69\x30\xac\xd2\x94\xb2\xa0\x7e\x70\x89\x2f" + "\xe1\xfa\xc5\x9c\x56\x6e\x3e\x4a\x36\x4d\xba\x5d\x72\x8b\x31\x4f" + "\x96\x5b\x58\xf3\x7e\x45\x9f\x96\x7c\xc2\x74\x90\x7d\x58\x2b\x6b" + "\xde\xa5\xf8\x16\x70\x70\x9b\xb1\x35\x64\x33\xd6\xcc\x69\xc0\x71" + "\x39\xf9\xc2\x5f\xae\x1a\x7b\x81\x64\x4e\xca\x79\x3c\xf2\xcc\x20" + "\x19\x3c\x95\x43\x72\x69\x5b\x56\x8f\xf0\xa5\x0c\xde\x94\xd2\x48" + "\xf6\x42\xfd\xe1\x2b\x63\x12\xb8\xdf\x7c\x54\xea\x21\xbb\x4c\x21" + "\x9f\xa2\xb5\x48\xf9\x49\x87\xcc\x37\xaf\x9d\x35\x73\x9f\xd5\x21" + "\x86\xa8\xe7\xbb\x0b\x9a\xf7\x7a\xed\x61\x9a\x43\x95\xf4\x52\xa4" + "\xd7\x7a\xd3\xff\xe6\x08\x8e\xed\xc0\x3b\xfd\xd8\xa6\xde\x8b\x72" + "\x97\xeb\xa2\xec\x2c\xfe\x54\xe8\x92\x03\xeb\x6e\x72\x5b\xc6\xb6" + "\x91\xbd\x08\xc5\x64\x74\x65\xcb\x0e\xd2\x53\x44\xfa\x75\xf7\x77" + "\x39\x40\x63\x74\xcb\x9b\x17\x90\x4e\xea\x05\x46\xe7\xa5\xe6\x0e" + "\x8a\x97\xa5\x93\xc9\x0e\x79\xdd\x19\x16\x49\xf6\x24\xa4\x73\x4e" + "\x67\x99\xb3\x32\x1c\xec\x68\x86\x9b\xed\x46\xd9\xbb\x16\xa8\xf4" + "\xc5\xc9\x74\xaf\xad\xeb\x58\x3a\x5f\xbe\xc9\xcc\x63\xcf\x9e\xe4" + "\xbe\x7a\x75\xeb\xe9\x9c\xbf\xa6\x48\xfe\x33\xd1\xbc\x2f\xd9\x75" + "\xeb\x19\x68\x8e\x93\xe5\xf8\xdd\x28\xfe\xf0\x0c\xe9\xc1\xda\x24" + "\xd6\xf2\x49\xe1\x6f\xcd\x32\x2e\x59\xe0\xc5\xc9\x66\xf9\x3f\xc9" + "\x7e\xe2\xa4\x1d\x78\x53\x04\xfa\xba\x28\xd0\xfb\xeb\x76\x31\x6d" + "\xef\x36\xd0\x26\x67\xab\xb5\x02\x9f\x3e\xad\x97\xb4\x11\xeb\x49" + "\xfe\xcd\xe3\x4f\x6e\x4b\x8c\xd9\xbb\xc4\xa9\x3d\xba\xa6\x95\xad" + "\x1d\xce\x0c\xf3\x9c\x5a\xca\x33\x6b\x48\x16\xf9\xf4\xad\xb0\x80" + "\x4e\xd5\xfe\x01\xcf\x0f\x2c\xa9\xd6\xba\x38\xbd\xf2\x69\x3d\x97" + "\x99\x5a\xa6\xb6\xd1\x1e\x62\x6b\x72\x13\x8d\x1d\x09\x1a\xbb\x09" + "\xf8\x1f\xe1\x5e\x95\x11\xed\x5a\x91\x71\xdd\xae\xe5\x2c\xd2\xbd" + "\x22\x2e\xe6\xb9\x8b\x6c\xb2\xba\xff\xec\xca\xc6\x9e\xd2\x6d\x18" + "\xb4\x05\x7b\x0a\xc9\x62\x86\x68\xf4\xfc\x6c\x98\x7e\x4b\xda\xf7" + "\x5a\x77\x67\x5f\x39\x86\xae\x7b\x55\x1c\xf7\x97\x40\x75\x09\xd4" + "\xd6\x4d\x2f\xb0\x50\xb7\x62\x57\x99\x77\x8a\x0d\x03\x5d\xac\x1d" + "\x72\x41\xb6\xb6\x2f\x66\x5a\x8a\x3f\x9a\xb7\x90\xcb\x3b\xc3\x8e" + "\x66\xb8\x98\x2d\xe7\x04\xcb\x5b\x4e\x63\xf4\xd9\xcd\x44\xa7\x91" + "\x8e\x31\xf2\xeb\xdb\xd9\x67\xe3\x75\x4e\xec\x19\x4e\xd0\xda\x8b" + "\x88\xb7\xfd\xec\x1e\xe1\x9f\xe1\xb3\x22\xb2\x83\xb4\x2e\x4f\xa4" + "\xb4\xf9\xe6\x53\x5c\x97\xbc\x5e\xd8\x5e\x7e\x36\x85\xee\xcd\x64" + "\xe7\x19\x7d\xaf\xeb\xd5\x1e\x67\x98\x90\xa9\x7d\x76\xa7\xb2\x3f" + "\xe4\x0b\x9e\xed\xb3\xcb\x6c\xd4\x3c\xb2\x7e\xcb\x04\x3a\xb3\x1b" + "\x69\x2b\x23\xfa\x55\xb6\xf3\x73\x77\xb2\x79\xcf\xb9\xcb\x2a\x5f" + "\xb4\x28\x3e\x74\xec\x1a\x69\xeb\x04\xa7\xf0\x73\xf7\xd9\x25\x26" + "\x74\xe6\xb0\x47\xde\x1e\x21\xce\x1c\x6e\x37\x08\x19\xfc\xed\x71" + "\x1b\x46\x90\x8e\xbf\x9d\x75\x46\xdd\x3e\x19\x75\x3f\xd6\x19\xfd" + "\xf3\x80\xf1\xa9\xc4\x7e\x14\x1f\x67\xbc\x89\xc5\xd0\xd9\x4f\xaa" + "\x5b\xf8\x79\x14\x6b\xf8\x73\x94\xcd\x9f\x8d\x6c\x31\xb1\x10\xc1" + "\x1b\xda\x1f\x18\x57\xc6\x8c\xa8\xeb\x60\x59\x3f\xa1\x89\xeb\x22" + "\x5a\x26\xb4\xd9\x3a\x28\x4e\x8b\x9b\x89\x33\xba\xcf\xf5\x72\xd4" + "\x84\x26\x25\xff\x8b\x0d\x1d\x68\x83\x7e\x42\xa5\xcd\x79\x46\xa1" + "\x09\xed\x98\xfb\x13\x2a\x65\xcb\x84\x6a\x61\x2f\x6d\x3f\xa7\xe2" + "\xaa\x98\xa3\xf6\x53\xa2\xdf\xe2\xe3\x44\xbf\x7d\xae\x57\xf6\xab" + "\x91\xf4\x1b\x7b\x77\xbc\xd0\x29\xb1\x37\xab\x34\xb2\x5d\xc9\x43" + "\xef\xa0\xdd\x56\x81\xb5\x76\xa4\x7f\x56\x22\x9e\xdb\xcb\x29\x0d" + "\xed\xc3\x9e\x65\x9f\x4c\xed\x0a\x86\xad\xbc\x2f\x72\x59\x08\xea" + "\x5c\x47\xfa\xd7\x44\xa7\xd8\xba\xee\xb2\xda\xf8\x18\xb4\x3c\x4f" + "\xfa\xf6\xf4\x1d\xf2\x89\x43\xb8\x89\x32\x79\x3f\x79\xeb\xff\xf9" + "\x3a\xb5\x2e\xf4\x3d\x7a\x86\xb6\x56\x72\x7e\x19\x6d\xa6\x3c\x34" + "\xae\xa7\x4d\x24\x8b\xbb\x80\x3e\x23\xbd\xb6\x96\x4a\xea\x13\xd1" + "\x67\x2d\x1b\x15\x5e\x5d\x19\x87\x96\xd5\xfe\xfd\x21\xee\x25\x3d" + "\xb0\x61\x39\xe9\x37\xb5\x54\x2a\xfd\xa7\xc4\x18\x68\xe1\xbe\x15" + "\x94\x67\x83\x7d\xde\xbd\xd1\x93\x17\xf5\x26\xda\x88\x74\x05\xe8" + "\xec\x48\xcc\xd7\x96\xc9\x3e\xef\x4d\x4e\x3d\x47\x34\xf2\xd8\xca" + "\x0d\x3b\x78\xcc\xb6\xf8\xee\x82\x96\x99\xde\xfe\x16\xe5\x04\xf8" + "\xc6\x4d\xea\x37\x90\x27\x52\xad\x27\xc6\x47\xd9\x83\x5b\x2c\xde" + "\x31\xf9\xbc\x4a\x7d\x8f\xe4\x32\xb8\x9f\x47\xf1\x0f\x83\xf8\x85" + "\xd7\xd8\x62\x81\xc1\xae\xbb\xac\x7c\x3e\xb2\x2f\x22\x48\x77\x1c" + "\xfd\x5a\x27\xe6\x50\x8b\x22\x37\xfa\x22\x82\xca\xa4\xf3\x3f\x11" + "\x27\xe4\x0b\xac\x82\xcf\x63\xc5\xf7\xbe\x88\x11\x75\xf8\x02\xfc" + "\x9f\x3d\xb2\x2f\x5f\x97\x38\x3f\xdd\x38\x67\x3c\xb7\x19\xbd\x6d" + "\xa5\x89\xcc\x41\xd3\xbd\x37\xfe\x34\xb7\xde\xeb\x5b\xeb\x8b\x34" + "\x8f\x6f\x2d\xcb\x74\x97\xe8\xff\x2f\xf6\xca\x17\xe5\x12\xb2\xe7" + "\x90\xb3\xe5\xd2\x62\x8c\xa1\xf9\x02\xbb\x9e\xe2\xd0\xe6\x99\xe4" + "\x2f\xc9\xef\x9a\xac\x4f\x9c\x28\x5b\x12\x27\xe7\x5d\x60\x03\x48" + "\x57\x88\xf0\x87\xe4\x59\x72\x14\xd2\xb7\x26\x4e\xf6\xda\x91\x9d" + "\x26\x1d\x2e\x92\x89\x52\xfc\xf0\x99\x34\x1f\x48\x6f\xfc\x34\x3b" + "\x9d\x8c\x7c\x33\xf1\x2c\x6b\x33\x97\x11\x24\x5a\xdc\xfa\xe9\xc7" + "\xcc\x67\x58\x38\x8f\xf1\x95\xe3\x64\xc6\x45\x64\x6f\xd4\x3a\x18" + "\x65\x5a\x90\x3e\x84\xa7\x3b\x9d\xe4\x2b\xc0\x82\x67\x43\xf0\x6c" + "\x06\xae\x12\xca\xc8\x29\x46\xbd\xf3\xce\xb0\x9b\x50\x97\x36\x7c" + "\xc7\x82\x7a\x9e\x36\x3f\xc5\x86\x35\x98\xda\x88\xbf\x43\x79\x76" + "\xa6\xf8\xd3\xb0\xe0\xbd\x5d\x68\x57\x0e\xc9\x3a\x70\xcd\xdd\x8c" + "\x6b\x9e\x9b\x0d\xc9\x5b\x87\x7d\x6f\x1d\xbe\x4f\x76\x99\x28\x87" + "\x7c\x68\x88\xba\xa0\x6d\x24\x1b\x43\xb9\xeb\x3a\xe4\xd3\x28\xbb" + "\xed\x68\x07\xca\xcb\x69\xf2\x94\xa9\xd0\xd4\x58\xdf\xa7\x1f\x90" + "\xb7\xcd\x8c\x40\x9d\x4a\x49\x9f\x1a\x69\xc0\xe4\xd3\x33\xbd\xf4" + "\xf0\xe9\x59\xca\xef\x81\x9e\xbc\xe6\x64\x96\x77\x89\x19\xb8\x4e" + "\xc0\xaa\x10\xe0\xf1\xa9\x66\xf2\xd5\xe4\xf5\xdd\x79\xea\x38\xf2" + "\xe9\x51\xe6\x26\xa5\x4c\x4a\x6b\xf4\xd2\xcf\xa7\x54\x9a\x79\x90" + "\x27\xef\x65\x65\x9e\x5e\x4d\x65\x0a\xbf\x4a\x5f\x18\x85\x4d\xf2" + "\xa9\x79\x1e\x9f\x08\x17\xe5\x2a\xb2\xb9\x93\xb2\xe5\xfd\x24\x93" + "\x20\x59\x08\xf1\x2f\x64\x77\x97\xba\xba\x28\x9f\xcb\x23\x86\x09" + "\x99\xa9\xa0\x19\x4e\x95\x7a\x6c\x04\x76\xf0\x78\x04\xc2\xa6\x8e" + "\xec\xf4\x96\x73\x79\x4a\xf7\xec\xd5\xab\xcc\xf4\x3e\xbd\x8b\xfc" + "\x75\x5e\x5b\xa6\xd3\x39\x42\x76\x37\x93\x7c\x39\xe4\x38\xd4\x7a" + "\x15\x7c\x11\x2f\x64\xcf\xa7\xba\x3c\xf2\xb7\x6c\xb9\x96\xc6\x89" + "\xdb\x18\x92\x0e\xa0\x9b\x15\xa5\xba\x8a\x54\x5b\xe1\x8e\xee\x82" + "\xd3\x46\x1f\x5b\xe1\x0e\x5e\x87\x1e\x6e\x8f\xbf\x6a\xb6\x6b\x95" + "\x2c\x6c\x48\x4f\x4f\xf3\x7e\xbb\xd5\xa1\x7c\x3b\x82\x7e\x3b\x84" + "\x4f\x2c\xd2\x0d\x34\x0a\xbd\x8e\xd3\x26\x55\x97\x02\xeb\xad\x89" + "\xe6\x67\x60\xdf\xfd\xa7\x4b\xfd\xfd\xf3\x7c\x99\x41\xbe\xc3\x91" + "\xee\x63\xff\x7b\xfa\xaa\xf6\xbf\x66\x87\xfc\x39\xcd\x21\x13\x8f" + "\x43\xfb\x25\xb0\x76\xfa\x31\xe1\xff\xfe\x4b\x2e\x73\x69\x61\x5f" + "\xc6\xe1\x5e\x27\xce\x1d\xbe\x1c\xae\xe0\x4d\xd2\x6c\xb7\x4b\x67" + "\xc7\x37\xb9\xbf\x1f\xef\xbd\x9e\xfc\x17\x20\xdf\x0c\xe1\x37\xf8" + "\xcb\x88\x3e\xf9\xe9\x79\x7e\x9f\xfb\x84\x3e\xf7\xc6\x2e\xac\xc3" + "\x60\x3a\x23\x9b\x47\x70\x79\x64\xdb\x90\xf5\xcc\x64\xfe\x8a\x85" + "\x60\x7d\x9c\xa2\xba\x35\xb4\x71\x7b\x32\x9d\x5c\x10\xcf\x6c\x6d" + "\x2e\x41\x8b\x82\x06\x68\x19\x85\x3c\x5f\xb1\x61\x64\xcf\x40\xf1" + "\x01\x90\xbf\x5d\xc4\x04\x68\x3b\x37\x6f\xe5\x20\x26\xfd\x32\xf9" + "\x3a\x59\xbb\x80\xce\xc9\x23\xf6\xf5\xd8\xc9\xaf\xbe\x26\xef\x79" + "\x16\x4b\x6b\x0f\x6b\xb0\x55\xd6\x3e\x51\x8d\x77\x3a\x5e\xea\x69" + "\x0b\xb3\xb9\x4e\x30\x13\x30\xa1\x9d\xb5\xb5\x86\xe6\xb2\xd0\x2d" + "\xa7\x99\x1e\xf3\xcc\x75\xd0\x35\x99\xa9\xf6\xf7\x65\xd1\xc2\xae" + "\xbb\x0c\x73\x72\x85\x41\x76\x76\x17\xb4\x25\x80\x57\x9b\xab\xf2" + "\xe4\x9b\x84\xff\xad\x50\x7c\x7f\x1f\xf7\x15\x20\xf6\x3c\xf4\x6d" + "\xdb\x3a\x61\xcf\x18\x73\x3d\xde\xc9\xf2\xd2\xeb\x5f\x89\xb3\x08" + "\xcb\x74\xc5\x0e\xfa\x2b\x76\x30\x9d\xf1\x98\x46\x9d\xdc\x3f\x7a" + "\x5b\xb9\x47\xf7\x86\xcb\xb9\xbe\x02\x1e\x4c\x77\x0a\x5a\x7e\xba" + "\x33\xd5\x1d\xa1\xd0\x0c\x5f\xf1\xbd\x88\xde\xc5\x7b\x3a\x11\xbb" + "\xac\xad\xd9\x3b\xd7\xda\x2a\x68\x8f\x40\x9b\xc0\xe3\xb5\x19\xa8" + "\x5d\xd4\x27\x5d\xdc\xd7\x56\x5b\xec\xc1\x8a\x20\xb1\x2d\xf4\xe3" + "\x92\x5d\x5c\x66\x52\x51\x84\xf9\x74\x06\x63\xf0\x3d\xf2\x37\x64" + "\xc3\x77\x8e\xee\xee\x61\x47\x0d\x9d\xac\x01\xbf\x49\xc7\xde\xba" + "\xe8\x0b\xd6\x6a\x0c\xbc\x3f\x61\x8f\x6b\x42\x9d\xdb\xa8\x2c\xc2" + "\x37\xd2\x4b\xb4\xe5\x32\x7e\xd2\x64\x6b\x65\xbc\x8c\xa3\x52\x1b" + "\x3b\x9a\x43\x7c\x59\x4d\x51\xc3\xee\x13\xac\xc1\xf0\x57\xfe\x1d" + "\xa2\x21\xad\xcb\x3b\xaf\x54\x36\xfa\x63\x5c\x84\x52\x76\x07\xca" + "\x8e\x09\x5e\xf6\x4b\xf6\x7e\x96\xdd\x8f\x7a\xbf\xd4\xd8\x9f\xb2" + "\xcd\xa5\xb2\x1b\x7b\xc2\x60\xd0\xc9\x4d\xe4\xeb\x92\x6c\x29\xdd" + "\x17\xc9\x4f\xc8\x48\x59\xe8\x7a\xb7\x7f\x42\x78\xc3\xf5\x10\xb6" + "\x4e\x3d\xc6\xed\x2c\x49\x76\xac\xd8\x57\xda\x5c\xa7\x18\xc9\x92" + "\xbb\x0b\xda\x6b\xbd\xfc\x95\xe7\x0c\x16\xd8\xd7\xde\x26\x74\x7a" + "\xa7\x1e\x13\x73\xab\x9d\xeb\x34\x04\xe6\xa3\x12\x3b\x84\x6e\xf8" + "\xdf\x6f\x56\x65\x36\x9d\x51\x89\x1d\x4a\x59\xc6\xbe\xb2\x40\xc5" + "\xb9\x8b\x71\x61\x4e\x96\x71\xd5\xf2\xcc\xac\x85\xaa\x21\xf0\x20" + "\xf6\xe0\xc2\x27\x16\x66\x66\x2f\x4c\x37\xce\x5d\xb9\x7c\xc9\x6d" + "\x4b\x9f\x7c\xd2\x38\x6b\xe1\x8a\x15\xf3\x7f\xb9\x70\x10\x9b\xbb" + "\x7c\xfe\x92\x15\x99\x24\xaf\x33\x1a\xa7\xdd\x9e\x9a\xb1\x34\xeb" + "\xb6\x9f\x4d\x8b\xef\x23\xaf\x23\xbb\xe0\x66\xa2\xdb\xb1\x57\x0e" + "\xc3\xbe\x19\x45\xbe\x62\x74\xab\x65\xeb\x5a\xf0\x8c\x98\x83\xed" + "\xb4\xe7\x60\xed\x7e\x4e\xfc\x04\xf9\x8a\x25\xff\xb3\x3b\x77\xc8" + "\x8d\xa7\x99\xfb\x13\xd0\xa2\x4d\x48\x23\xbe\xbe\x19\x7c\xbc\x83" + "\xc6\x00\xe9\x6f\x20\x4f\xed\x6f\x90\xe6\x88\x9a\xee\xdc\xf2\x29" + "\x0b\x15\xfb\x66\xc7\x44\x59\x3b\x40\xde\x44\x7e\x5b\xbf\x30\x30" + "\xc5\x1f\xb4\xd6\x66\x77\x92\xae\x4a\xc4\x6c\x97\x59\x26\x4c\x15" + "\xeb\xab\x43\xc4\x48\x01\x1f\x22\x74\xe6\xdd\xdb\x89\xef\xd9\xc0" + "\x63\x69\x75\x00\xff\x3f\x6d\xf2\x62\xf5\x85\x5c\x85\xde\x24\xb9" + "\xf3\xaa\x16\xdc\x0b\xff\x17\x1d\x7d\xfc\x5f\x9c\x9d\xc3\xd8\xa5" + "\x6a\xf1\x47\xef\x5c\xaa\x15\x7f\xf4\xdb\xf7\xcf\x9d\x23\xfe\xfa" + "\xa6\xff\xa3\x7f\xea\xf7\xbf\xe9\xfb\x17\x27\x5e\xf9\xef\x5a\xbe" + "\xcf\xdb\xfd\x1d\xb6\xff\x1f\x79\xff\xe2\x94\x2b\xfd\xd1\x7c\xc3" + "\xdc\x6a\xfe\xcd\xa7\x2c\x02\xf3\xb3\x64\xf3\x02\xcc\xe9\x93\xcc" + "\x90\xeb\x92\x5b\xcd\x8f\xb3\xd8\xbc\xaf\x98\x96\xe8\xbf\xac\x1c" + "\xb9\x35\xef\x22\xf1\xda\x17\x07\x63\xfe\x56\x17\xb7\xb0\xc8\xcd" + "\x2d\x4c\xdf\x90\x25\x62\x30\xd0\x19\x0a\xd9\x13\xd9\x70\x5f\x9f" + "\xed\x64\x47\x1c\xe7\x48\x77\xcf\xda\x90\x06\xec\x69\x66\x8c\xe6" + "\x6f\x64\x1a\x8b\x29\x1b\x26\xd7\xc8\x05\xcf\xcd\x95\xb5\xcf\x4d" + "\x43\xda\xb1\xd7\xa4\x84\xb0\xd7\xd6\xd4\x85\x19\x17\xd0\x3e\x7f" + "\xf6\x82\x32\x37\xd7\x09\x7b\xb9\x0b\x9c\x07\x53\xfc\xf5\x62\x7f" + "\xba\x70\x49\xec\xe9\x17\x0e\x2b\x32\x2a\xfa\xcd\x65\xae\x68\x47" + "\xb5\x5c\xb0\xa0\x9a\xca\x7c\x55\xaa\x0e\xa3\x3d\xf3\xb5\x35\x09" + "\x61\xb9\xf3\x99\xb6\xc1\xde\xce\x0e\x02\x0b\xe9\xdc\x16\xeb\x6e" + "\x2f\xd6\x59\xd5\xae\x61\xb2\x05\xf5\xdb\x04\x7a\xae\x08\x75\xaa" + "\xec\x2e\xf8\x3a\x1d\xfb\xd6\x5c\x85\x96\xb3\x62\x5d\xec\xdd\x8c" + "\x3c\xb3\x57\xb2\x91\x9b\x91\x0f\xb4\x5d\x11\xd1\xdd\xa2\x7e\x9d" + "\x8f\xa3\x0f\xf6\xe3\x9b\x8d\xc6\x14\xba\x3f\xc7\x69\x0c\xfa\x36" + "\xda\x61\x6c\x61\x0e\xee\x0f\x87\xbe\xa1\x7e\x17\xe5\x03\xff\xda" + "\x23\x95\x73\x33\x8b\x28\xe7\x6b\x41\x87\x59\x12\xe7\x51\x5c\x38" + "\xc5\x1e\x69\xde\xe6\x35\xd8\xd7\x7b\x58\x04\xbe\x51\x82\x6f\x58" + "\x75\xeb\x99\xac\x23\x5b\xd6\x66\x17\x68\x75\x49\xd1\x13\x75\x1c" + "\x17\xef\x0a\x3a\x84\xd3\x1e\x6e\xa6\x13\x32\x07\xd0\x1f\x19\xc0" + "\x09\xd0\x1c\xdc\x0e\x00\xf4\x06\xa5\xe3\x1b\x25\x68\x57\x23\x78" + "\xc1\xfd\xd8\xbb\xab\x88\x56\x48\xb9\x70\x1f\xe3\x31\xb1\x41\x2f" + "\xac\xc8\x91\x9d\x22\x46\x96\xc3\xa4\xd2\x0b\x34\x3f\x88\x46\xd8" + "\x9c\xc2\x42\x7b\x31\xc6\x98\x23\x75\xa0\x3f\x40\x7b\x3b\xf6\x2a" + "\x63\x53\xc7\xe9\x02\x25\x36\xa8\xc0\x70\xc7\x9b\xd8\xdf\x23\xf1" + "\x0d\xd0\xbb\x6e\xd5\x97\x12\x30\xc8\x51\xa7\xee\xf5\x22\xbe\xb5" + "\x63\xaf\x0c\xac\x43\xbf\xed\x1f\x93\xa6\x01\x8f\xe7\xd0\x63\x2c" + "\xf6\x53\x5e\xf2\xf5\x80\xfc\x4e\xd0\x63\x39\xca\x98\x34\x6f\xce" + "\x26\x3a\xc0\x91\x4f\xf5\xc0\x3b\xf5\xe8\x6b\x1a\x0b\x25\x6e\xa0" + "\x7c\x4c\xd0\x30\x9d\xc3\xd5\xbe\xc7\x58\x6f\xf4\xf6\xff\xb9\x69" + "\xbe\xfd\x8f\xbe\xd8\x28\xc6\xe0\xfc\x21\x9f\xb1\x03\xaf\x75\xbe" + "\x8c\x64\xab\xf8\x5e\x8d\x90\x0b\x9d\x5b\x47\xfe\xb8\x30\x67\x6a" + "\xd0\x17\x35\xc8\x57\x4d\xd8\xbc\xe1\x53\x60\xee\x02\xa2\xa1\xce" + "\x3f\x2d\x68\xd4\xf3\xa3\x68\x0e\xe3\x9e\xf3\xd1\xad\xcc\xb1\x91" + "\xca\xc3\xdc\xb8\x80\x2b\x68\xd9\x73\x67\xcc\x65\x14\xb3\x32\xb1" + "\x92\xfc\x65\x29\x63\x8d\x79\x77\xce\xe3\xff\x88\xe6\x00\x8d\x3d" + "\xda\xb8\x51\xf0\xde\xe7\x9a\x49\x7e\xc6\xdf\xeb\xcd\xa0\x3a\x36" + "\xd3\xfa\x54\x9f\x23\xbd\x8d\xfc\x98\xfa\xf4\xcd\x46\x65\x4c\xaa" + "\x45\xfc\xb7\xf3\xeb\x94\xba\x25\xe3\x3e\x02\x75\xe0\x32\x95\xce" + "\xde\x8c\x90\x2d\xf4\x4e\x9e\xf7\x1d\x5a\x3f\x98\xcb\x3a\xbc\xb3" + "\x12\x57\x59\xcd\x4b\x3e\xc8\x51\x0f\xd7\x73\xdc\x9f\xd4\xf9\x98" + "\xce\xde\x38\x2d\xbe\xeb\xc4\x77\xb5\x34\x37\x68\x5e\xa8\x65\x6c" + "\x11\x7d\xb4\x17\xe3\xc7\xe7\xd7\x41\x57\x35\xfa\xfd\x3c\xe8\xff" + "\xbf\x59\x05\x7d\x77\xce\xa5\xd4\xcf\x2a\xe2\x12\xfc\x7d\xcc\x6e" + "\xe1\xfb\x85\xf2\x79\xe2\xdf\x78\xe9\xcc\x73\xdc\x4f\x14\xca\xaa" + "\x57\xe6\x84\xae\xbb\xa0\x33\xd2\x33\x87\xb8\x5d\xfd\xf9\x4d\x44" + "\x6b\x2a\xf5\xa7\xb9\xf7\xb4\xd2\x77\x63\x68\x0e\x80\x8e\x77\x8a" + "\x71\x76\x6c\x24\x5a\x55\xcc\xc3\xce\x39\x6a\x19\xc2\x36\xff\x5c" + "\xb3\x84\x32\xd4\xb9\xe2\x8b\x0d\xc8\x9b\x0b\x5c\xf0\xcc\x1b\x15" + "\x0b\x44\x99\x5d\x6f\x28\x74\x48\x11\xc6\x86\x7c\x5f\x5b\xb9\x6f" + "\x22\x3e\x2f\xbb\x8a\x0e\x76\xb9\xd8\x6f\x68\x5e\xa6\x10\x26\x74" + "\x9e\xea\x8c\x9e\x69\xf0\xce\xed\xce\x63\xea\xdc\xf6\x19\x57\x3e" + "\xb7\x37\x72\x3c\xea\x04\x1d\x3d\x4e\x3d\x3b\x6e\xa6\x75\x2e\x61" + "\x5d\x6f\xc9\xe6\x32\x6f\x1d\xc9\xb8\xf8\xba\x77\x76\x70\x1e\x83" + "\xc6\xb3\x21\xa7\x95\xfb\x1b\xdf\x20\xb1\x88\x86\xae\x53\xc4\xf3" + "\xb7\xd3\xfa\x57\xd7\x38\x8d\x0d\xbe\x65\x25\x9f\xf0\x1b\x81\x81" + "\xb4\x06\xbb\x50\x27\x8a\x83\x4e\x7e\xba\x6a\xe7\x25\xb0\x15\x18" + "\xdb\x83\x69\x34\x6e\x5d\x59\xaa\x6e\xff\x16\x81\x01\x91\xca\x7c" + "\xe1\x75\xec\xd3\xaf\x3a\xd1\xaf\x5d\x95\xfe\xeb\xfb\x7c\x12\xad" + "\x6f\xdf\x7e\xa5\x3e\xa5\xbe\x45\x5e\xb4\xff\xab\x2a\xb5\x5f\xbd" + "\x7d\x7a\xe1\x1e\x65\x3e\x2a\xd8\x7a\x21\x20\xb6\x6e\x11\xfe\xf7" + "\xab\x37\x50\x5b\xb0\xa7\xd0\xf7\x79\x7c\x19\x85\xf7\xa9\x75\xd0" + "\x9c\xba\x30\xd9\xce\xd2\x93\x54\x1c\x43\x7d\x2c\x34\x9f\x68\xac" + "\x54\xec\x20\xf9\x8f\xa8\xfb\x85\x74\x75\x3c\xa8\xde\xbe\x98\x80" + "\x3a\xbc\x4e\xf7\xde\x36\x5f\xd8\x8e\xf7\xa2\x09\xdb\xbc\xf4\xd5" + "\x85\x0a\xff\xb6\x5f\xd8\x44\x6d\xa7\x39\x61\xca\x26\x19\x90\xd8" + "\xcb\xec\xec\x6b\x83\x3f\x5e\x7d\x3d\x58\xe8\x1a\x08\x7a\x8c\xf0" + "\xde\x94\x22\xf2\xd3\xfe\x86\xfc\x5c\x26\xaa\xec\x87\xb9\xb4\xff" + "\x21\x2d\x54\xe9\x83\x66\xe4\xaf\x25\x7b\x61\xf2\x19\x73\x5d\xb3" + "\xe0\x05\x81\xd1\x35\x14\x87\xc0\xce\xce\xd6\x36\xa0\x54\x57\x38" + "\x63\x65\x0a\xbd\x49\x38\x21\xaf\x4a\xbe\x6e\x55\x1b\x1b\x68\xfa" + "\x99\xfc\x05\xf6\xf3\xf7\xb0\x8e\x9c\xe4\xc3\x10\x65\x1b\x4f\xb3" + "\x4b\x2f\xe2\xbb\x31\xca\xd5\x80\xeb\x33\xb8\x0e\xc7\x75\x19\xae" + "\x37\xe0\xfa\x28\xf2\x4b\x4a\xfe\x78\xdc\x4f\x45\xfa\xed\xca\x15" + "\x75\xbc\x58\x8d\xeb\x9c\xdf\x10\x5d\x99\xc2\xd3\x87\xd2\x3d\xae" + "\x61\x4a\xbb\xeb\xc5\xda\xbe\x78\x0a\xe5\xe4\x50\x3e\xda\xd7\x90" + "\x66\x3a\xcd\x9c\x87\xa9\x6c\xb2\xdf\xc7\xef\x75\x3e\xf4\x29\xca" + "\xe9\x7e\x05\xd7\x89\xb8\x3e\x85\x6b\x16\xae\xe3\xa9\x5c\xf4\x41" + "\xa3\x17\x2f\x1c\x1b\xd3\x73\xc4\x78\xda\x59\x27\xf1\x98\x31\x2a" + "\x1e\xd0\x7c\xf2\xcb\x37\x4f\xe4\x13\xfc\x6b\x77\x9a\x3a\x76\x2e" + "\x31\x6f\x63\x5c\x18\x3b\x94\x3f\x95\xde\xc7\xf5\x6e\xe5\x9a\xa0" + "\x5c\xef\x51\xae\xd3\x95\xeb\x34\xe5\x9a\x64\x67\xdd\xf1\x0a\x6d" + "\x82\x3e\xeb\x8e\xa7\x3e\x01\xe6\x2b\xfe\xb6\x9c\xe9\xc4\x5f\x03" + "\xff\xef\xe8\xa4\x98\x62\x05\xdd\x4d\xaa\x2c\x96\x64\x3f\xbd\x05" + "\x7f\x9f\xbe\x93\xcb\x7e\xba\x1d\x3e\x58\x58\x17\xa9\x49\x60\xa0" + "\x9d\xc2\xcb\xb4\xa0\x1b\x44\x39\x49\x5a\xe5\x0c\x9a\x62\x6b\x50" + "\xac\x34\xf2\x1d\xc7\xf9\xa8\xa8\xb7\x9d\xb4\x5e\xb9\x9c\x7a\x2b" + "\xf9\xc2\x99\x5e\x8f\xbf\x26\xf0\x14\x1e\xbc\x27\x7e\x49\xf1\x11" + "\x79\xa0\xbb\xc0\x39\xcf\xcb\xe7\x3b\x23\xc5\x79\xdd\xf5\x37\x23" + "\xdd\x87\xff\xef\xae\xa3\x3a\xa3\xaf\x9b\xd0\x9e\x89\x2d\xcc\x59" + "\x86\xeb\x84\x56\xd1\xe6\x78\xb5\xcd\xca\x58\x99\xd4\x3e\x6f\x65" + "\xdd\x93\x81\x87\xcb\x69\x7e\xb7\x78\x70\xb9\x9b\xcb\xa7\x95\xf9" + "\x83\x71\xbe\xf8\x15\x8d\xb7\x0f\x9e\xe4\x7a\x71\xda\xe9\xf4\x1f" + "\x17\x87\xd3\x25\xe8\x85\x26\xac\x4b\xcc\x81\x8b\xd6\x3e\xeb\x72" + "\x13\xad\x4b\xf1\xee\xa5\x89\xfe\x18\x7f\x61\x13\x61\xbc\x52\x47" + "\xcc\xdb\x8b\xe5\x34\x36\x76\x76\x29\x46\xd9\x93\x9a\xb0\x47\xde" + "\x81\xf4\x22\x51\x4f\x91\xae\x7c\x0b\xf3\xef\x62\x3e\xcd\x7f\x35" + "\x5d\x99\xdf\x54\x4e\x0e\x8d\xb5\x9a\xae\x94\x8f\x79\x7a\xd1\x44" + "\xeb\x47\x4d\x57\xe6\x64\x1d\xe1\x0d\xbd\xeb\xe2\x7a\x77\xe0\xbf" + "\x53\x6a\x51\xef\x4b\x24\x53\x2c\xa7\xf5\xbc\x61\x0d\x8b\x5c\x55" + "\xca\x06\x8b\xb5\xd9\x33\x54\x7d\x57\xc8\xa9\x7b\x22\x54\x8c\xda" + "\xc2\xf1\xac\x2b\xd7\x1f\x2b\x5d\x2f\xcb\x05\x3a\x97\x4b\x3f\xbd" + "\xf6\xa8\x6b\x22\xc7\x5c\xac\xfb\x32\xbc\x97\x60\x67\xcf\x31\x65" + "\x2f\xa9\x17\xe7\x04\x3d\x2b\x8f\x96\x0b\xec\x52\xca\xf6\xe0\x9f" + "\x0f\x1d\xc2\xb1\x9e\xbe\x45\x65\x61\x5f\xd1\x77\x99\x93\xaf\x13" + "\xf8\xdd\x53\x62\x67\xd7\x8d\x52\xb1\x95\xf6\x27\x9d\x86\x99\x8a" + "\x53\xc4\xfe\x24\x91\x0c\xcc\xd4\xc5\x7d\x7f\x35\x98\x3a\x18\xed" + "\x9b\xe4\x93\x39\x75\xf5\x20\xf2\x8d\x94\x8c\xba\x3e\x03\xfa\xac" + "\x42\x39\x6f\x00\x9f\xeb\xfa\x09\xf1\xb2\x4a\xbf\x62\x3d\xb9\x6e" + "\x54\xc6\xa5\x19\xf5\xa9\x20\x6c\xdf\x90\x2d\xe2\xd3\x90\x3c\x88" + "\xc7\x33\x22\x9a\xd5\x20\x3b\x85\x7f\xf9\xde\x51\x3e\x32\xae\x72" + "\xb1\x4e\x7a\x06\xf2\xd8\x00\x96\xe9\xb5\x42\x9e\xd8\xfb\xba\x48" + "\xef\x55\x7c\x55\x71\xdf\x8f\x74\x9f\x1f\x62\x18\xf6\x6b\x21\x17" + "\xfe\xfb\x02\x41\x8f\xf4\x66\xf9\xe8\xb1\xf0\xbe\x16\xbe\x67\x7b" + "\x37\x79\xd7\x45\x6f\x1a\xbd\x83\x77\x5f\x40\xba\xc7\xff\x97\xd8" + "\x6b\x1c\x39\x8a\xcc\xac\xee\xba\xf5\x09\x0c\xd8\x1c\xbe\xb3\x40" + "\x5d\xbf\xae\x50\xf1\x7d\xb1\x7e\xa9\x8d\x34\x1f\x68\x0d\xbb\xb8" + "\xff\xaa\xb7\x9d\xb4\x96\xf1\xbb\xde\xa5\xae\x5d\x41\xdf\xe5\xf2" + "\xb5\xcb\xd7\xad\x2b\xc6\xa7\x1e\xf5\xca\x5c\x6d\xee\x7c\xc2\x10" + "\x89\x67\x58\x93\xed\x8a\x7f\xa0\x1e\xc1\x63\x6c\x8d\x8f\x93\x2e" + "\xca\x4e\x92\x4d\x93\x3c\x81\x64\x36\x8a\x6e\x25\xc9\xff\xbb\xc8" + "\x27\x97\x05\xeb\xc1\xeb\x87\x4b\xcf\x54\x3f\x5c\x28\x2f\xdf\x2b" + "\x3b\xee\xb1\x2b\xed\xaa\xc5\xf7\xca\xac\x79\x7f\xa6\x7e\xfe\x50" + "\xac\xb1\x9e\x46\x9a\xc7\x36\xcc\x3d\xec\x3f\xa5\x14\xef\x1c\xef" + "\xd6\xa8\x73\x0f\x6b\x34\xfd\x34\x73\xcf\x2a\x19\x26\x97\x62\x4c" + "\x49\x3f\x7c\x31\xee\x7f\x82\x6b\xba\xb8\x6a\xf4\x74\x55\xe6\x7c" + "\x29\xde\xc5\xfa\x1f\x54\xa7\x8e\x41\x57\x54\x05\xe3\x73\x2c\x8f" + "\x74\xf6\xe2\xf9\xf9\x35\xcd\x31\x9a\x5f\xfc\x1c\x1b\x73\x4d\xb7" + "\xfe\x3e\x46\xf3\x8c\xfb\xe6\xc0\x3d\xd5\x97\xe6\x59\x77\x81\x7b" + "\x9a\xea\x87\xd6\xce\x5c\x6d\xe2\x0c\xc9\x9d\xac\xea\x2c\xd3\x3c" + "\xcc\xba\x99\x0d\x45\xf9\xc6\x5a\x63\x17\xc9\xce\x3f\xb3\xb9\xee" + "\x61\x94\x97\xfa\x4e\xe0\xe5\xf5\x59\x78\xc7\x67\xfc\x1d\x5c\x87" + "\xe5\xe0\x3c\x2e\xcf\xfc\x1e\x9e\x55\xfa\x63\x4e\xc7\x44\x4e\x57" + "\x62\x7f\xfe\x41\x0c\x33\x62\xde\x62\xaf\x71\xd7\xab\xf4\xf0\xb8" + "\x18\xd2\x21\xf8\x3b\x8f\x15\x4e\x34\x09\x7e\xd7\xd3\x3e\x1d\x44" + "\xee\x3c\x91\x64\x45\x84\x19\x24\x7b\x22\x39\x18\xfa\xfa\xd8\x69" + "\x8d\x66\xd6\x51\xf2\x93\xb3\xf4\x72\x5f\xc4\x79\x39\xf2\x05\xf2" + "\xdb\x64\x5c\xce\xbe\xd7\xa2\xd1\xc4\x93\xdc\xc9\x7c\x8e\x64\x3c" + "\xd2\x5c\x7f\x19\x8f\x54\xa1\xfc\x55\xa3\xa4\x58\x9f\xbf\xbd\xca" + "\x35\xee\x2a\x7f\xb5\x4a\xde\x46\xfc\x35\x2b\x7d\xb5\xbf\xbb\x40" + "\xaa\x56\xfb\x8a\x30\x85\x30\x96\x74\x47\x68\x9d\x6b\x5c\x8c\xfc" + "\xf2\x60\x9c\x50\xef\x0d\x3f\x7c\xd0\xba\x86\x78\x5a\x89\xeb\x40" + "\x91\x4f\xd9\xfe\xe9\x2f\x49\x7c\x3c\x85\xcf\x4f\x69\x2f\xbe\x5d" + "\xbb\xe5\x2c\x0b\x35\x2d\x67\x37\x92\x0c\x5d\xe7\x96\xad\xc4\x03" + "\xeb\x44\x7c\xf6\xc6\x76\x26\xef\xcb\x5a\xc7\xb4\x78\x3e\x12\xbf" + "\xcb\x54\x5a\x0a\xef\xe8\x43\x9c\x2c\x86\x68\xa8\xbb\xd7\xb1\x91" + "\xdd\x05\x72\x8e\x3a\x56\x44\x67\x90\x1c\xcf\x1b\x3b\x48\xe2\x7a" + "\x59\xe4\x5f\xdd\xce\xfb\x4d\xc1\xaa\xb3\x24\xbb\x96\xd3\x43\xba" + "\x98\x5e\xec\x43\x32\xe6\xff\xdf\x15\xdf\xaa\x72\x3e\xe6\xfe\x31" + "\x9f\x7a\x5e\xf4\xfe\x36\x4c\xa2\xf7\x75\x5d\x44\xc3\x05\xe9\x1f" + "\x0d\x1b\xa8\xf6\x0f\xe9\xc8\xeb\x40\xff\xf3\xf1\x76\xc9\x1d\xa8" + "\x5b\xbd\x69\x0d\x8b\x68\xd7\xb0\x4b\x68\x23\xd9\xa0\xd6\x71\x19" + "\xbf\x86\x9d\x51\xf9\x74\x5e\x6f\x0d\x7b\x53\xb7\x3e\x84\x91\x6c" + "\x9e\x7c\x13\x72\xfd\x42\x90\xa4\x44\xc3\xdb\x5c\x53\x98\x35\xef" + "\xa7\x94\xe7\x69\x65\x2f\x6b\xee\x34\x1b\xd8\x41\xc3\x14\xd6\x5d" + "\xc8\x36\x62\xad\xd8\xfb\xad\xc7\xa9\x61\xea\x39\x78\x3d\xd7\x7f" + "\xd0\xb0\x87\x68\x2f\x21\xd9\x00\xf6\x91\x5a\xda\xaf\x51\xb6\x5d" + "\x5d\x37\xd8\x27\x6a\xf1\xce\x5c\x81\x31\x63\x2b\xf1\x7b\x0e\xf9" + "\x47\xe1\xfc\x83\xc8\x1f\xc9\xcf\x0d\x0a\x35\x31\x1e\x7a\x1b\xf9" + "\xe8\x3d\xae\x17\xa7\x21\x5f\x43\x1a\x86\xf7\xe2\xa8\x6d\x62\x2e" + "\x1a\xa6\x20\xff\x34\xef\xba\x95\xf3\xf9\xba\xed\xf0\x59\x97\x85" + "\x9a\x74\x2f\x9f\x2a\x19\x6e\x2b\x61\xc6\x40\xeb\xd0\x34\x84\xe9" + "\xff\x1e\xc1\xfe\x7d\xcb\x16\xb9\xdc\xa2\x95\x12\x37\x14\xb3\x48" + "\xcd\x26\x74\x1b\xad\xb3\xec\xb4\xa1\x58\x8f\xa7\x74\x91\xd7\xcf" + "\xb9\x3b\x6b\x80\x9c\x67\x60\xda\xcd\xe7\x07\x44\xdc\xec\xbc\xbe" + "\x5c\x0e\xf9\xe1\x83\xb3\xb2\xe8\x3c\xd7\xc2\xbe\x5c\xcc\x42\xee" + "\x76\xe3\xdb\x91\xcc\x64\xd7\x84\x38\xc8\x9e\xfa\x20\x28\x2f\xfa" + "\x4d\x65\xe6\x96\xb1\x88\xdc\x56\xb9\x6d\xd3\x93\x61\x11\xd8\x7f" + "\xf5\xd8\x37\x8a\xae\x8b\xbc\xbe\xbc\x17\x65\xbc\x97\xc6\xdf\xab" + "\xea\x7f\xdd\x4c\xc3\x4e\x6b\xb4\xeb\xfb\x57\xb7\xb0\x78\x6f\xdd" + "\xc2\xe2\xbf\xe5\xba\xe9\xbd\x75\xcb\x40\xdd\x42\x6e\xec\x5f\xdd" + "\xc2\x4d\xde\xba\x85\x9b\xae\xb1\x6e\x7b\xfb\x5f\xb7\x9c\xeb\x51" + "\xb7\x37\xfb\x57\xb7\x01\x55\xde\xba\x0d\xa8\xfa\x47\xea\x96\x57" + "\x26\x9f\x6a\x00\x02\x93\x3c\x87\x70\xfe\xb4\x26\xf4\x9d\x75\xb1" + "\x5c\x37\x39\x1a\xbf\x97\x99\xcb\xe4\x2f\x38\x6d\xa3\x09\xe5\xb2" + "\xff\xee\xc2\xd0\x31\xe0\x4b\x45\x1c\x20\x4d\x58\x2c\xd7\xdd\x08" + "\x19\x51\x29\x17\xc8\xae\xb1\x5d\xa4\x07\xe7\x22\x1f\x22\x5a\x79" + "\x5b\x12\x7b\xed\xa2\x53\x2b\x47\x27\xe9\xf7\x9c\x0f\xc5\x6f\x87" + "\x16\xef\x66\xa8\x7e\x43\xd5\x77\x75\xa5\x57\xc2\xa3\xd0\x5d\x77" + "\x67\x30\x1d\xe1\x11\x5d\x29\x36\xe1\x96\xbc\x01\x11\x77\x9f\xc3" + "\xbe\x5f\x18\xba\x5f\xb5\x0b\x55\xcb\x9a\xdd\x36\x40\xd6\xe5\xb2" + "\x10\xb2\x4d\xe5\x3e\x06\x0d\x0e\x36\x2a\x97\x85\xcd\xce\x41\xf9" + "\x4e\x96\xa6\xcb\x41\xd9\xe8\x0f\x4e\xcb\x6b\x42\x2f\x85\x2c\x66" + "\x91\x25\x28\x9b\xae\x77\x1b\xcc\xf2\x86\xe7\x59\x28\xd9\xb0\x92" + "\x2d\xaa\xb0\x43\x0d\x8f\xe8\x2e\x0c\x8b\x55\xbf\x73\x95\xfe\x1b" + "\x22\xfa\x2f\xcc\xed\xed\xbf\xb0\xd7\xbd\xfd\x17\xb6\x52\xf4\x5f" + "\xd8\x62\x6f\xff\x85\xcf\xeb\x5f\xff\x85\x55\x7a\xfb\x4f\xbc\x7b" + "\xe5\xfe\x0b\x3b\x19\xbc\xff\xc2\xba\xbc\xfd\x27\xca\x0a\xd2\x7f" + "\xe1\x81\xfb\x2f\xfc\x27\xd7\xd6\x7f\xe1\xf3\xae\xb1\xff\x06\x8b" + "\xfe\x1b\x70\xa7\xb7\xff\xc2\xcf\x79\xfb\x2f\xfc\x0d\xd1\x7f\xe1" + "\x7b\xbd\xfd\x37\xa0\xac\x7f\xfd\x17\xde\xe6\xed\x3f\xf1\xee\x95" + "\xfb\x6f\xc0\x8d\xc1\xfb\x6f\xc0\x44\x6f\xff\x89\xb2\xfa\xd7\x7f" + "\x03\x56\xa3\xdf\xf4\x4a\xff\xe9\x83\xf7\xdf\x80\xb2\x6b\xec\x3f" + "\x9d\xe8\xbf\x88\x75\xde\xfe\x8b\x18\xef\xed\xbf\x01\x17\x44\xff" + "\x0d\xe8\xf0\xf6\x5f\x44\x73\xff\xfa\x2f\x22\xce\xdb\x7f\xe2\xdd" + "\x2b\xf7\x5f\xc4\xe3\xc1\xfb\x2f\x22\xcb\xdb\x7f\xa2\xac\x20\xfd" + "\x37\x20\x70\xff\x45\xbc\x79\x6d\xfd\x17\xd1\x7c\xa5\xfe\xeb\x1f" + "\xad\x11\x11\x54\xaf\xb8\x7f\xe5\x0c\x9c\x1c\xac\x1c\xea\x43\xd2" + "\xb9\x93\x0a\x07\x4e\xde\x2d\x85\x47\x08\xbb\x84\x08\xf2\xb1\x76" + "\x57\x8b\x66\xe0\xd3\xbb\xa5\xb0\x08\xb9\xe0\x2f\x55\x52\xc1\xe1" + "\x64\x79\x7d\x78\xa8\xb4\x7e\x40\x28\xd9\xcd\x07\x8d\x75\xac\x19" + "\x78\x2a\x64\x38\xbb\x89\x6c\xcb\x36\x80\x5e\xa3\xdf\xdd\x85\x03" + "\x1d\xa0\x45\x2e\xf3\xc3\x9d\x9e\xb9\x82\x07\x4e\x5c\xbe\x30\x7d" + "\xe5\x92\xf4\xf9\x4b\xb2\x8c\xf3\x9f\xf8\xd5\x0a\x7f\xbf\xe6\x3c" + "\xe6\xe0\x46\x1a\xbf\x41\x13\x3d\xbe\x4c\x40\xc7\x92\x4f\x38\xd3" + "\xf7\xd9\xc0\x76\xcd\xa0\x2c\xee\x6b\x3e\x3a\x29\x57\xee\x4d\x7e" + "\x21\xe1\x07\xf2\xbb\xdc\xd7\x5d\x6f\xc6\x0b\xb2\x25\x71\x0a\xf9" + "\x2f\x51\xce\x26\xa6\x9c\xd6\x44\x6e\x96\xa3\x66\x56\x93\x4e\x07" + "\xb7\x57\xd0\x0c\xe2\xfe\x11\xc9\xaf\x89\xac\x4f\x2c\x91\x2c\x33" + "\xab\xe5\xad\x33\xab\xa8\x0f\x1a\xc8\xcf\x58\x76\xc8\xc8\x16\xcd" + "\x90\x39\x72\x54\x62\x09\xca\x2a\x55\xca\x21\x5e\xaf\x2b\x61\x8d" + "\xfc\x19\x95\xa7\xd0\x82\x14\x4b\xc2\x2a\xe8\xc1\xeb\x06\xea\xd6" + "\x1b\x43\x28\x2f\xf9\xfb\x23\x3f\x78\x6a\xfc\x20\xaa\x37\xe5\x05" + "\x3d\x7e\x17\xde\xbf\x6b\x0f\xc5\x07\x52\xcb\x10\x75\xfa\x5e\xbb" + "\xe6\xba\x04\xde\x16\x4b\x62\x42\xe7\xda\xe4\x17\x78\x4c\x41\xde" + "\xaf\x43\xee\xc0\xb7\x13\xa8\x0c\xf2\xc3\x45\xef\x2a\xef\xdc\x88" + "\x77\x38\x9e\x92\x8f\x4f\x51\xc6\x90\x1b\xd5\x7a\x81\x86\x1e\x84" + "\xfb\x30\x9f\x6f\x5c\xd7\xae\x19\x7c\xc6\xe7\x79\x24\xee\x3f\x04" + "\x1d\x1a\xa5\x3c\x1f\x8c\xfb\x37\x88\x2e\xe5\xed\x2a\xce\x17\x7a" + "\xbe\x9a\xc1\xa5\x48\xd3\x2b\x79\xa2\x90\x67\x1d\xd1\xba\x4a\x19" + "\xd1\xb8\x9f\x4f\x3c\xa3\xf2\x3c\x06\xf7\xf7\xd0\xb9\x80\xf2\x7c" + "\x28\xee\x6f\xc5\xfd\xbf\x29\xcf\x41\xd7\x47\xa6\xf1\x3a\xeb\x13" + "\x37\x51\x9b\xd0\xf7\xa5\xd4\xef\xe8\xeb\x4d\x48\x9b\x02\x7e\xd5" + "\x4c\xe3\x48\xed\xb4\xae\x69\x67\x2d\x9a\xc8\x87\xc8\xd6\x4c\x8c" + "\xd5\xcc\x6a\xe1\x87\x46\x9b\x8c\xf4\xb9\x94\x4e\xfa\xd2\xd2\xd6" + "\x99\xa5\xf4\x1b\x7d\x7a\x86\xfa\x50\xf9\xd6\x48\x7c\x2b\x57\x19" + "\x67\xf4\x1d\xf9\x8a\x65\xf9\x7b\x94\xb1\x40\xdd\x06\xe0\xf9\x27" + "\xaa\xfe\xc5\x6c\x57\xaf\xb0\x99\xd1\x44\x56\x7c\x23\xdf\x08\x78" + "\x4f\xe0\x5e\x64\xab\x1a\x57\x0e\x69\x3c\x56\x3d\xcd\x4f\x92\xaf" + "\x38\xa2\x12\xe3\xb8\x2f\x10\xcc\x51\x75\xae\xd0\x3c\x91\xc3\x07" + "\xba\xb8\xac\xa6\x70\xb0\x37\xfe\x89\x26\x72\x9e\xe2\x8b\x9f\x09" + "\x3e\x61\xf0\x14\x8f\x7e\x91\xe6\x3a\x8e\x0f\x3e\xcf\x92\x7d\x9e" + "\xd9\xd5\x67\x5c\x07\xae\x70\x70\x96\xcf\xb3\xc6\x3e\xcf\x2c\x3e" + "\xcf\xac\x7d\xca\xdc\xeb\xf3\xac\xaa\xcf\x7b\x75\x3e\xcf\xca\xfa" + "\x3c\x6b\xf5\x79\xb6\x49\x79\x16\x82\x74\x97\xc7\x17\x9f\xe6\xba" + "\x5c\x25\x1d\x58\x3f\x24\xc6\x27\x7d\xb1\x92\x8e\xef\x0f\x01\xfd" + "\xf7\x56\x95\x92\xce\xe7\x39\xe6\xd1\x2d\xe2\x1b\x43\x92\x7c\xbe" + "\x31\x45\x39\x7b\x8e\x13\xe3\x37\x68\xbf\x4e\x63\x1c\x40\x73\x4a" + "\xb7\x3e\x9f\xe2\xba\x58\x84\xdf\x29\xb1\x0e\x79\x4c\x5f\xe2\x87" + "\x91\x2f\x18\x36\x06\xd4\x11\x2c\x1c\x52\xa3\xda\x66\xba\x2d\x89" + "\x63\x24\x4b\x45\x1d\xc5\x8a\x23\xff\x54\xe6\x0e\xf2\x51\xd2\xc5" + "\x6c\xac\x87\xd9\xb2\xba\xf3\x29\x5e\x5c\x83\x88\x13\x47\x36\x6d" + "\x1a\xb2\xd9\x20\x1f\x5b\x0d\xa6\x33\x3c\x56\xdc\xaa\x0e\x16\x6b" + "\xfa\x99\xdc\x7a\x5a\xa3\x33\xba\xb7\x26\x8e\x51\xfc\x0c\x3c\xcf" + "\x6d\xa1\x35\x3a\xb1\x3e\x88\x8f\xed\xe0\xb2\xe5\x08\xe4\xab\xe2" + "\x79\xe4\xe4\xe7\x45\x1b\x75\x7c\x3c\xf6\x28\xf6\x71\xdd\x85\xba" + "\x64\x4f\xfc\x42\x8d\x6e\xff\x85\x28\x73\x25\xd2\x16\xfb\xe9\x34" + "\x6a\x74\x4f\x53\x99\x54\x77\xe4\x89\xa3\xb2\x91\xc7\xe2\xd1\x69" + "\x44\xfa\x2a\x17\x1b\x81\x7a\x9d\x56\xcb\xc7\xf3\x2a\xbb\x66\x08" + "\xd7\x8f\xa6\x32\x2f\x6c\x7d\x99\xca\xad\xb5\x87\x46\x0b\x9d\xc8" + "\x42\x5d\xa3\x9d\xbd\x1f\x1a\x6c\xcf\xe3\x72\x48\xfd\xcc\x46\xd9" + "\x32\xb3\x09\xeb\xbc\x4e\xd8\xa4\xcf\x6c\x14\xfc\xbb\xfe\x46\xd2" + "\xb9\xa0\x18\xc8\x74\xd6\x28\xb0\x46\x3f\x9f\xaf\x57\xa4\x61\x8c" + "\x2a\x81\xc9\x4d\x7c\xdc\xfb\xb5\x0e\xf5\x63\x78\x19\xe7\x59\x44" + "\xb1\xa2\xe7\xda\x5d\xa8\xcf\xf1\x89\x23\x20\xf4\xd8\x35\xfa\x17" + "\x1b\x72\xf8\x79\x13\xaf\x63\xdf\x3a\x50\x7d\x51\x56\x6c\xd0\xfd" + "\x53\x3f\xb3\x8e\xcb\x3e\xb7\x25\x19\xb9\xfe\x98\x46\xff\x55\x88" + "\xe1\x86\x1d\xf8\x56\xab\x27\x7e\x02\xf2\x14\xf7\x90\x5f\xb6\x99" + "\x8d\x9e\x76\x2e\xa7\x6f\x44\xf1\xf3\x09\xbb\x26\xca\x08\xec\xaa" + "\xa3\x3a\x28\xe9\xc6\x06\x97\x93\x6c\xbf\x03\xfa\x77\xa2\x7d\x91" + "\xfb\x06\xda\x36\xb3\x8e\xec\x00\xc6\x39\xd5\x3a\x47\x1b\x49\xff" + "\x9c\xea\x2c\xfa\x36\x7a\xa8\xda\x8f\x9b\xcf\xa3\xec\xbc\x13\xac" + "\x55\x13\xb5\x8b\x74\x5a\xc8\x9e\x62\xcb\x1a\x45\xcf\x0a\x69\x3c" + "\x5f\x8f\x27\x0f\x97\xf5\x92\x8e\x2f\x61\xe8\x6e\xb2\x8b\x47\x99" + "\xc5\x18\x0b\xee\xf3\x42\x13\xc5\x6d\x21\x36\x2c\x67\xa2\xdd\xa4" + "\xc3\xa6\x89\x9e\x26\xe6\x4a\x54\xb3\x5d\x13\x3d\x47\xcc\x41\x91" + "\x46\x31\xb4\x49\xf7\xe0\xac\x26\xea\x1d\x8a\xe9\x89\xfe\x68\x22" + "\xbf\x68\x0d\x5d\x58\x27\x39\x3d\x34\x17\x9a\x28\x76\x1b\xfa\xa1" + "\x46\xec\x09\xd4\xe7\x51\xe5\xf4\x7d\xea\x5b\x8a\x67\x8a\x3e\xad" + "\xe8\x2e\x8c\xf6\xc4\xff\xa2\xd8\xa9\xc8\x33\x37\xd8\xb8\x50\x1f" + "\xb9\x51\x67\xf2\xef\x61\x1d\x71\x02\xf5\xfb\x9e\x46\x8a\x9e\x59" + "\x47\x3a\x93\xa8\xeb\xcb\x02\x2b\xc4\xd8\x89\xb5\x14\xfd\x09\xbe" + "\x61\xa3\xf3\x45\xd2\xc7\xe6\x71\xa0\x35\xd1\xf9\x4a\xff\xf1\x78" + "\x0a\x96\x6c\xd1\x0f\x22\xff\xf7\x26\x0a\x59\xcc\x0d\xc7\x51\xaf" + "\x46\x8f\x2c\x06\xe9\x5c\x8e\xa6\xe8\x55\xe3\x59\x87\x4f\x9d\xbb" + "\xb8\x3d\xdb\x79\xe2\xa3\xa3\x4b\xe8\x5b\x9b\xc9\x6f\x15\xcd\x8b" + "\x76\xdf\xf9\x1f\xbd\x92\xea\x49\xfa\x78\xee\xa8\x24\xa3\xbc\x35" + "\x69\x14\xf5\x33\xde\xd9\x8b\xb5\x10\x50\x9e\x4a\x58\x49\x31\x35" + "\xba\x0b\xbf\x37\xcf\x27\x06\x2a\xf6\xbe\xef\x6d\x56\xf7\x36\xda" + "\x97\xc9\x0f\x81\x27\x6d\x6b\x4d\x06\xd6\xbb\x49\xa1\x6b\x4c\x41" + "\x7d\xe8\x8d\x65\xf1\x64\x33\x4b\xba\xd9\x34\xdf\x64\x7d\x4d\x04" + "\xf9\xe5\x25\x1f\x83\xd6\x35\x13\x50\xdf\x98\x3b\x9f\x1b\xc6\xed" + "\xf4\xba\xac\x63\xcf\x93\x5e\x4e\xc7\xe9\x5c\xee\x3b\x27\x62\x76" + "\x8e\x4b\xde\x23\xe2\x1c\x3b\xe4\xa8\x1a\x8a\xc7\xdb\xc1\xfd\xd2" + "\x53\x99\xdf\xd4\xc7\xac\x26\x26\x42\xa1\x5f\x3a\x80\x95\xd7\xa3" + "\x3d\xfc\xbc\x00\xbf\x87\xb5\x6b\x86\x2e\x14\x71\xfb\x84\x9f\x74" + "\x45\xbf\x30\x5c\xd8\x99\x3b\x18\xb7\xfb\xd5\xc4\x7c\x62\xfc\x21" + "\x63\x1d\x9a\x98\x93\xdc\x67\xb1\x25\x31\x5f\xe9\x83\xfc\x2d\xa2" + "\x5e\xba\xd4\x1c\x2d\xaf\x23\xd5\xaf\x9f\x75\xab\x50\xf6\xae\xf0" + "\xee\xc2\x98\x36\xd5\x3e\x9d\xb7\x5f\xf1\x65\x6c\xfd\x3e\xf1\x2a" + "\x43\x1f\x52\xf6\xab\x8d\xca\xb7\x37\xfe\xe3\xdf\x1e\x6a\x54\xca" + "\xe4\x7e\xa5\x31\x17\xeb\x51\x6e\x72\x77\xe1\x50\x93\xba\x87\x2a" + "\x7a\xf1\x63\xc4\xde\x3e\xb4\xc8\xbb\x7f\x8a\x3e\xf4\xb3\x3d\x59" + "\xba\x34\xcb\x08\x22\xdd\x34\x3f\xeb\x89\x0c\xe3\xc2\xe5\xcb\x97" + "\x2e\x37\x92\xf3\x15\xdf\x35\xc6\xf5\x5e\x0a\x87\x96\x29\x31\xb8" + "\x2a\x3d\x31\xb8\x0a\x87\xb6\xfa\xc6\x46\x43\xdd\xda\xbe\x1d\x5e" + "\x66\xd8\x65\x71\x17\xd5\x72\x2c\x5a\x89\x64\x53\xd5\xf8\xb3\xe2" + "\x8f\xf6\x65\x96\xea\x64\x09\xd8\x1f\x39\xbd\xe3\xb5\xbb\x1e\x5a" + "\x43\x67\xdf\x2d\x9a\x61\xf3\x77\x4b\xa1\x8c\xfb\xdd\x28\x90\xb8" + "\x5f\xc7\x3d\x78\x1f\x7f\x56\xfc\xd5\xe1\x8f\xbf\x27\xfd\x99\xdb" + "\x8c\x56\xf9\x3e\xa3\xf3\x68\xb9\xa0\xa2\x95\xf2\xc8\xeb\x43\xf9" + "\xb9\x83\xb4\x4d\xe4\xeb\x53\x07\xad\x5c\xa8\x53\xf3\xf1\xba\x0f" + "\x59\xcf\x8c\x01\xf2\x85\xc8\x85\x83\x62\x95\x7c\x7c\x7e\xab\xed" + "\x21\xbf\xf0\xc8\xaf\xe6\x0b\x95\x0b\xbf\x57\xae\xe4\x13\xb6\x4c" + "\x05\xda\x40\xdf\x0d\x93\x0b\x3e\xd9\xa8\xe4\xd3\xfb\x96\xe7\x93" + "\x27\x5c\x2a\xe4\xf1\x76\x1b\xa5\xf5\xa1\xfc\x5c\x57\x2e\x1c\x16" + "\x8a\xfc\x01\xfd\x69\xf6\x6f\x9c\xae\xdf\xdb\x77\x9c\x4c\x4f\x64" + "\x2e\xfc\x69\xe6\x92\x6c\x8a\x52\x94\xb5\x74\x65\x16\x5d\x97\xcc" + "\xff\x15\xbf\x2c\x4d\x7d\xf2\x09\xf1\x23\x6b\x71\x3c\xfd\x58\x8c" + "\xf9\x46\xd7\xf4\x95\x26\xba\x3c\xb1\x94\x6e\x73\x32\xc6\xac\x7c" + "\x42\x0d\xad\xec\x3b\x0f\xe3\xba\x0b\x0d\x73\x31\x37\xa6\x09\x7a" + "\xc4\x90\x06\x9e\x97\x9f\x83\xe9\xd6\xdb\xd9\xa1\x38\x1e\x83\x8d" + "\x5d\x66\x77\xaf\x31\x3c\x45\x76\xf7\xba\xf5\xa6\x27\x74\xae\xcc" + "\x85\xc0\xd9\x7c\xbc\x5b\x66\x67\x9b\x94\x18\x42\x89\x16\xee\x93" + "\xb2\xf0\xfa\x0e\x55\xa7\x50\xb2\x24\x4e\x23\x5f\xeb\x5c\xc7\x68" + "\x1b\xf9\x6a\x49\x34\xe1\x7e\xd3\xee\x6d\x3c\xe6\x49\x0c\xee\x67" + "\xe2\xbe\x04\xf7\x06\xdc\xc7\x4a\x96\x09\x4d\x64\x67\x87\x7b\x23" + "\xee\x47\xa1\x7c\x4f\xfc\x77\xdf\xbe\x51\x82\x7e\xfd\x34\x20\x4f" + "\xec\xef\xef\x08\x6b\x6b\x78\x82\x1a\x53\x95\xc7\x4f\x2d\x1c\x3e" + "\x47\x3d\x0b\x14\x71\x82\xf4\xf3\xf8\xbe\xc6\xf7\xf6\xe1\x47\x43" + "\x0c\x37\x8e\x12\xb4\xf7\xf0\x1c\xd5\xb7\x80\xa0\xad\x87\x17\xf9" + "\xc4\x9e\xa5\xfb\x52\x4f\xec\x59\x41\x8b\xbe\x20\x68\xd1\xe1\x76" + "\xb9\x70\xb8\x37\x86\x5e\xe1\x70\xab\x6f\x9c\x30\x3b\x9e\x13\x4f" + "\x83\xf4\x26\xef\x3e\x38\x7c\x31\x7d\x33\x50\x9c\x5d\xf0\xe4\x39" + "\xa9\xab\x41\x7f\xe3\xca\x69\x71\xb7\x86\x71\x7e\x0c\xf7\x72\x41" + "\x02\xf9\x69\x31\xd2\x33\xa2\xfd\x02\xca\x19\x28\xce\x9d\x66\xc4" + "\x32\xf2\xe9\xea\x30\xa7\x6b\x7e\xb0\x9b\x69\xf8\xbd\xf0\x49\x28" + "\x9f\xd5\x8c\x98\x4a\x73\x4f\xf5\x57\xe6\x6b\xdb\x1d\xd0\xde\xe0" + "\x23\xf5\x9c\x78\xf1\x52\x9d\x6b\xfe\x42\x41\xc7\x8d\xf8\x50\x60" + "\x69\xd2\x34\xb1\xdf\x8f\xa8\x91\x1f\x14\xb1\x34\xec\x9a\x1b\x78" + "\x1c\x3b\x9d\x66\xf1\x52\x19\xef\xea\x72\xe6\x2f\xe4\x69\xc8\xb7" + "\x01\xb4\x96\x52\xbf\x17\x6d\xb1\x6d\x4c\xbe\xe8\x16\x36\xeb\x9a" + "\x11\xe5\x29\x37\xe6\xd3\x77\x22\x38\x1d\xf1\x11\x8b\xa4\x98\x6d" + "\x54\xb7\xdd\x3e\xfe\xd4\xb6\x20\x8d\xc7\x63\x7f\x90\x45\x92\xff" + "\x58\xa5\x2e\xe5\x3c\x0e\x56\xe1\x0d\x93\x55\xdf\x2f\x76\xa4\xf5" + "\x6d\xcf\x83\xff\xce\x57\xc8\xe8\x27\xc6\xcc\xb9\x07\xbf\xc6\x28" + "\xe1\x46\x7d\xe7\x4e\x6c\x67\xf4\x7d\xf9\x9d\xaf\x4e\xfd\x31\x8f" + "\xd7\x57\x78\x43\x11\xca\x19\xc3\xc7\x7b\xc3\x2f\xbe\x22\x6c\x51" + "\xe3\xd5\xdb\xa4\x2e\x7c\xf7\xa6\x85\xdc\x77\xab\x56\xd0\x8b\xdc" + "\x67\x5a\xe1\x0d\x33\xe5\xe8\xc4\x78\x11\xab\x73\x86\x01\xe3\xc7" + "\xf7\x7d\x5a\x1b\xdc\x0e\x50\x4f\x6d\xbf\xc1\x0e\x4c\xbd\x1b\x7f" + "\x8f\x88\xd8\x23\xbf\xf8\x4a\x2d\x97\xfc\x1b\x61\x6e\x91\x9f\x23" + "\x7d\x77\x61\x6c\x84\x47\x2f\x48\xb5\x2d\xd4\xc4\xde\x4a\xbe\x97" + "\xbc\xf4\xf9\x4d\x0f\x08\xba\x32\x76\xa2\x9d\xe9\x4a\xc4\xfa\x8e" + "\xc5\xfc\xdf\x37\x45\xf9\x3d\xd3\xce\x6e\xcf\xe8\x53\xc6\x76\x55" + "\xde\x21\xc6\x2e\xd6\x84\xb9\x78\x37\xfe\x1e\x41\xfe\x5c\x35\x56" + "\xf1\x06\x2d\xb7\x27\x3a\x1d\x62\x60\xf1\x48\x2f\x51\xd3\xc3\x34" + "\x09\xe8\x9b\xd8\x0a\x15\x4f\x3a\xa3\x93\xc6\xe0\x7e\x3f\xe8\xcd" + "\x31\xca\xfd\x64\xdc\xd7\xaa\xf7\xf8\xdd\xa8\xe2\x0d\xc9\x1d\x3a" + "\xd7\x26\x3f\x4f\xfc\xde\x13\x06\xd0\x64\x06\xe2\xaf\x62\x1d\x76" + "\xb6\x37\x4e\xc9\x0b\xfe\xf7\xd5\x4d\xe2\xf7\x8d\x68\x7f\x4c\xba" + "\xb7\xff\x43\x74\xa2\xfe\x37\x4d\x91\xa3\x2a\x28\x96\x58\x07\xf2" + "\x80\x4f\x1b\xce\xdf\x25\x5f\x47\x9b\x7a\xf4\x73\x6d\x1b\x41\x9f" + "\x3e\x49\xf3\xe2\x26\x7e\x7e\xba\x79\x8d\x7e\x0e\xd1\x77\x64\x3b" + "\xcf\x63\x6e\x91\xef\x42\x17\x0b\xe7\xfe\xe2\xb7\x56\x54\x73\x3f" + "\xe9\xab\xe2\x22\x55\xbf\x85\xb2\x65\xaa\x5d\xd6\x3e\x97\x4e\xbe" + "\x0c\xb9\xac\xac\x3b\x6e\x08\xf7\x5f\xa8\xf8\x2d\xdc\x95\xcd\x62" + "\xca\x24\xe1\xb7\x90\xdb\xd5\x5f\xc1\x77\xa1\x5c\x70\xc4\xe3\xbb" + "\x90\x62\xc2\xe3\x77\x9c\x7c\xd1\xe5\xc4\x75\x94\x8f\x7f\x96\xd0" + "\x80\x7e\x0c\xb5\xc0\x48\xad\xf0\x63\xd8\xbf\xbd\xe5\xa6\x08\x31" + "\x27\x6e\x4a\x52\xe3\x26\xfb\xa4\xcd\xc3\x9c\x56\x64\x27\xb1\x71" + "\x4a\x1a\xe8\x9f\xdf\x95\x78\xe8\x30\x60\x1b\xc9\x0c\xb1\x66\xf7" + "\xca\xe6\x8c\xe7\x7d\xd7\x10\x63\xb4\x45\x87\xa1\xac\x70\xfc\x0d" + "\xa0\xbf\x24\x0f\x4e\x5c\x94\x9b\x88\x17\xd0\x69\xb0\xaf\xe4\x84" + "\xc8\xb3\x5d\xae\x90\x54\x97\xe6\x18\xd1\x98\x64\x23\x3c\xdb\xed" + "\x22\x5b\xf5\xd0\xd9\xee\x4e\x8a\x67\x78\x8c\xec\xc4\xb6\x3c\x49" + "\x76\x8b\x23\x65\x8a\x75\x32\xdb\xfd\xb5\xbc\x47\xd8\x63\x36\x12" + "\x0f\xe0\xbe\x28\xd7\xbb\xb3\xe5\x3a\x8c\x41\x24\xf1\x17\xe4\x2f" + "\x6a\x88\xc6\xc9\x86\x98\x42\xde\xbd\xff\xc2\xbb\x32\xf9\x8a\xa2" + "\x38\x57\x52\xa1\x13\x98\x68\xd4\xa4\xba\x42\xf2\x6d\xae\x56\xee" + "\x6b\x7e\xb6\x7b\x80\x3c\x3b\xe7\x4e\x99\xc7\xa7\xca\x96\x6b\x81" + "\xa7\x21\x3c\x66\xf1\x6a\xb9\x13\xbf\x23\x66\xaf\xee\x94\x29\x9e" + "\x22\xca\xae\x9b\xed\x92\x7a\x66\xe7\x48\xe6\xd4\x1c\x0d\xde\xfb" + "\x02\xef\x7d\x81\xfa\xc4\xa3\x4c\x3d\xee\xef\x92\xf7\x3c\x49\xf6" + "\x4d\xf9\x9c\xc7\x41\x1b\xad\x8a\xcd\x68\x35\xea\xb7\x9f\x7c\x55" + "\xa7\xba\xac\xf9\x7b\x14\x1b\x50\x1e\xcb\x33\xa7\x57\x56\xbe\x33" + "\x79\xf6\x6a\x76\x57\xea\xea\x91\xdc\x96\x94\xec\xa4\x66\xbb\x8c" + "\xf8\x66\x3e\xf5\x47\x24\x8f\x9f\x4c\xb6\x52\x85\x23\x1d\x57\x8a" + "\xc3\x18\x90\xaf\x2e\x9e\x19\x27\x6f\xbf\x37\x54\x2e\x9e\x1d\x8a" + "\xeb\x46\xd9\x32\x23\x81\xf4\x4b\xe5\xe2\x07\xec\xf2\xf6\xe9\x48" + "\x9f\x5b\x83\xeb\x46\xb9\xf8\x91\x52\x79\x7b\x12\xee\x1f\xcb\xc2" + "\x15\xf7\x63\xd2\x90\x9f\xc9\xc5\xb7\x35\xe2\x9a\x2f\x17\x8f\x4b" + "\x40\x3e\xdc\xc7\x57\xe1\x8a\xfb\x09\x46\xe4\xc3\xfd\xed\x96\xd3" + "\x1a\xe3\x7e\xfc\x46\xda\xe3\x73\xc4\xb7\xd2\xe6\xf1\x6f\x15\x3f" + "\x91\x21\xbe\xf1\x64\x96\xf8\x46\x66\xbe\xf8\xc6\xe2\x4d\xe2\x1b" + "\x77\x30\xe4\x43\x1d\x27\x75\xe0\x5a\x24\x17\x4f\x6e\x42\x3e\xdc" + "\xff\xb4\x16\x57\xdc\x4f\xc1\xb7\x92\x70\xff\xb3\x32\x5c\x71\x9f" + "\x50\x84\x7c\x91\x72\x71\x62\x0e\xae\x9b\xe4\xe2\x69\x54\x3e\xee" + "\xef\x4d\xc6\x15\xf7\x49\x49\xc8\x87\xfb\xfb\x26\xe3\x8a\xfb\xa5" + "\x68\xd3\xbd\x7a\xb9\x78\xd9\x4c\x5c\x2d\x72\xf1\x0a\x7c\x6f\x3a" + "\xee\xb3\x50\xdf\xe9\xb8\xcf\xc6\xfb\x49\xb8\xcf\x89\xc5\x15\xf7" + "\xab\xa9\xad\x31\x72\xf1\x5a\xfa\x4e\x89\x5c\xbc\x8e\xda\x8c\xfb" + "\x3c\x27\xae\xb8\xcf\xa7\xfa\xe0\xbe\x80\xde\xc3\xfd\x46\xf4\xc1" + "\xbd\x06\xb9\xb8\xd0\x81\x6b\xa9\x5c\xfc\x8c\x15\xf9\x70\xbf\xc9" + "\x82\x2b\xee\xb7\xa0\x0f\x93\x70\xbf\x2d\x1e\x57\xdc\x6f\xa7\xf6" + "\xc6\xca\xc5\xff\x71\x0c\xd7\x32\xb9\xf8\x85\x4a\xe4\xc3\xfd\xae" + "\x5c\x5c\x71\x5f\x8e\xfe\x4b\xc2\xfd\x4b\xa3\x70\x2d\x0b\x3c\x9e" + "\xbf\x2d\x93\xd7\x87\xa3\xdf\x7f\xbf\x49\x5e\x3f\x00\xd7\xfd\x53" + "\xe4\xf5\x61\x71\x72\xf1\x9f\x3a\x90\x8e\xeb\x1b\x71\xb8\x1f\xa3" + "\xdc\xe3\xfa\xc7\x18\xdc\xc7\x2b\xf7\x74\x65\xb8\x9f\xa8\xdc\xe3" + "\x5a\x43\xf7\x93\xe5\xe2\x77\x70\x0d\xc7\xb5\x26\x1f\xf7\x53\x94" + "\x7b\x5c\x0f\xd4\xe3\xea\x92\x8b\xdf\xac\x46\x7a\x82\x5c\xfc\x56" + "\x0e\xee\x71\x7d\x7b\x32\xee\xa7\xe1\x4a\xf5\x99\xe6\x18\x7d\x47" + "\x15\xe9\x20\xc9\xc3\x22\xad\xd2\xb0\xfb\xf2\xcd\x17\x98\x96\x64" + "\xc9\x55\x79\x76\xf2\x3f\x30\xb2\x45\xf3\xfd\xad\x14\xb3\x80\xf2" + "\xb8\x77\xdc\xcb\xa4\x61\xf7\xe6\x23\x3d\x1c\xf9\x06\x9c\xd6\xfc" + "\xe0\x65\xda\x1b\x6d\xb9\x76\x1e\x2b\x4d\xf1\xad\x16\x8e\x77\xde" + "\x04\x2d\x30\x99\xe2\x4b\xa3\xbf\xa6\xc8\x05\x61\xe7\x71\xad\x91" + "\x0b\xae\x6b\x41\x7f\xe1\x3e\xea\x23\x5c\x71\x3f\xe9\x59\xf4\x17" + "\xee\x7f\x91\x88\x6b\x4d\x77\xe1\x0f\x0c\x76\x8d\x51\xcf\xb1\xfe" + "\xd5\xa9\xf1\x3a\x97\x0c\x8c\x41\xdd\x5e\xcc\xaa\xd2\xb9\xac\x18" + "\x83\xe4\x72\x1d\xf9\x08\x7b\x79\x52\x95\x3c\x6c\x68\x23\xaf\x77" + "\x01\xf8\xd7\xde\x51\x5a\xf1\xed\xeb\xe4\x16\xcd\x0f\xee\x21\x39" + "\xa7\x3c\xec\xb6\x60\xcf\x17\xf2\xe7\xdf\x5f\x19\x2f\x9e\xeb\x99" + "\xf7\xf9\x23\xf4\xfc\x69\x1d\xc9\xa6\x6f\x19\x1d\x6f\xd7\xfc\x60" + "\x2f\xe5\xb1\x6b\xbe\x5f\x27\x17\x84\x30\x5b\x57\x9b\xd2\xc6\x01" + "\x94\x6f\x1f\xbd\x17\x4c\xf6\x22\x95\xa4\xc4\x6d\x2e\x90\x1b\x89" + "\xcf\xc4\x7e\xa1\x35\xe6\x8d\xaa\x6e\xd1\x8c\xce\xdd\x45\xf2\x83" + "\x98\x15\x0e\xb2\xf9\x69\xd1\x8c\x9a\xda\xbb\x6d\x46\x96\x71\x8d" + "\x0e\xe5\x8d\x5e\x67\x76\xca\x5d\xd6\xbc\x44\xec\x6b\x3c\xbd\x8a" + "\xeb\x91\x8b\xdf\x65\x42\xf7\x87\xff\x2e\x12\xb2\xd0\xd1\xb9\xf4" + "\xae\x2f\x5d\xef\x2e\x3c\x55\x29\x0d\xcb\x62\xe2\xec\x6a\xd4\x3d" + "\xef\x48\x76\xad\x2e\x8b\x85\x19\xd7\xbc\x8b\xf2\x47\x6d\xf2\xe7" + "\x01\xd5\xbc\xfc\xd9\xb2\x03\xc8\xbb\x93\xcb\x6b\x46\x95\xa9\xf2" + "\x5d\x19\x6d\xf8\x8d\xa0\x7f\x12\x68\x0f\x13\x74\xdc\xe8\x58\xf2" + "\xcb\xe8\x8a\x79\x44\xef\x2a\x89\xac\x72\x97\xac\x70\xc8\x3b\xb2" + "\xd8\x10\x97\x86\x71\x1d\x7c\xcd\xe8\x07\xc6\x39\x49\x8e\xf6\x01" + "\xe5\x1d\x28\x85\x7f\xbd\x78\x6c\x0e\xd3\x5a\x97\x9f\xa0\xfb\x19" + "\x72\x61\x8f\xc9\xd6\xd1\xc4\xc8\xb7\x2c\xee\x93\xe4\x67\xa3\xd2" + "\xa5\x41\x61\x9b\x76\x13\xfd\x99\x43\xf2\x9f\x8f\xa8\x5f\x8e\xa2" + "\x9f\x41\xe7\x8f\x8e\x53\xeb\x42\xbe\xe5\x37\xa3\xef\x88\x36\x24" + "\x9b\xe9\x54\xb7\x9b\x7c\x16\x81\x7e\x1b\x9d\x2b\x64\x88\xa3\x23" + "\x09\xa3\x95\xef\xce\x97\xa2\x67\xa4\x35\xcc\xa3\xf3\x51\x3d\xf9" + "\x80\xe9\xe2\x36\x96\x2e\x8a\x07\x47\xfb\xa2\xc8\xeb\x3b\x76\x99" + "\x8a\x6d\x69\xe6\x92\xac\xe5\xcb\x8c\x2b\x32\xd7\x2c\xbc\x73\xf4" + "\xca\x31\xc6\xe5\x39\xc6\xe5\x3c\xfe\x30\x4f\x48\x1f\x63\x5c\xb1" + "\x78\x69\x96\x31\x6b\xb5\x69\xe1\xe5\xf1\x65\x0d\xb2\x7e\xc6\x14" + "\x41\xb3\xfd\x88\xfb\x15\x96\xcb\xb3\x2a\xb3\x72\x65\xc9\xf8\xfd" + "\x01\xa0\xc9\x6f\x89\xbd\x14\x3e\xba\x88\xec\xcd\xa5\x02\x23\x53" + "\x62\x24\x47\x3e\x1f\xcd\xc8\x96\x23\xa2\xbb\xf0\x96\x18\xef\x99" + "\xc7\x8f\xe6\x09\xf9\xc4\x2d\x71\x98\x83\xdc\x57\x57\x89\xea\x57" + "\x4a\x79\x26\xce\x0c\x6e\xc1\xfe\xbf\x49\xf8\xb9\x28\xcf\x8a\x10" + "\xb4\xde\x2d\x42\x4f\xd5\x98\x55\x29\x57\x4c\xaa\x02\xed\xa3\x21" + "\xb9\x0f\x8f\xc3\xca\xce\x73\x7b\x53\xac\x23\x23\xd9\x7a\xbb\x77" + "\xcc\x28\x97\x86\x25\x1b\xa5\xdf\xfe\xd8\x64\x7e\x91\x69\x5f\xc3" + "\x9a\x0f\x35\x62\x7e\x7f\x9f\x8d\x7c\x37\xaf\x4d\x8b\x3a\x3f\xf3" + "\x6e\x5e\x93\x56\x2e\xb9\x2f\xa7\x73\xd4\x64\x8b\x13\x34\x9d\xe8" + "\x7f\x27\xfb\xcb\x34\x46\x3c\x4b\x75\xd7\xd0\x34\xfc\xcd\x28\x72" + "\x6e\xcf\x34\x5a\xbf\x3f\x81\xdd\x73\xab\xfc\xf5\xfb\xb5\x24\x5b" + "\xfa\xd1\xb4\xf7\xa7\x91\x6c\x6f\xc6\x44\xa7\x7e\xc6\xe4\xae\x1d" + "\x8f\x94\x93\x5f\x96\x4b\x3b\x32\x4d\x3d\xc3\x66\xb2\x83\xc8\xf3" + "\x01\x28\xf8\x23\x46\xcc\xdf\x9b\x99\xf6\xd2\x2d\x93\xd8\x6b\x3d" + "\x16\x6d\x5d\xed\x14\x21\x8f\x4c\xc3\x9a\xe1\xf3\xe9\xdf\x6e\x7b" + "\x7f\x7f\x2d\xc3\xb7\xf1\x3c\x49\xfb\x97\xc9\x97\x3d\x9f\xf5\x7e" + "\x7c\x2d\xeb\x26\x5f\x9f\xe0\x9d\x0e\x9c\x28\x65\xf2\x8e\x14\xfb" + "\xbe\x35\x4e\xed\x3c\x3b\xd3\x1e\x6d\x2a\x65\xb9\xa7\xd8\x60\xd7" + "\xd7\x71\xa1\xbf\xc3\xfb\x97\xc8\xd7\xde\x11\x03\xf7\xb9\x95\x67" + "\xe5\x71\x45\x75\x0d\xa0\x27\xa4\xaf\xe3\xc2\x1b\xe6\x5a\x19\x9e" + "\x9f\x70\xfd\xdc\xc0\x8e\x66\x38\x98\x2d\xb9\x9c\x5d\xd2\x26\xb0" + "\x37\x1f\x2b\x67\x3b\x41\xb7\xef\x3c\xcb\x22\xc5\xd9\x6a\x5c\xb8" + "\xab\x37\x2e\xd4\xb5\x36\x8e\x7c\xa0\xc8\xf2\xd7\x71\x83\x88\x7e" + "\x74\x2d\x8d\x8b\x68\x70\x94\xb3\x71\x6d\x2c\xee\x92\x96\xe9\x2e" + "\xad\x8d\x1b\xd4\x60\x2a\x45\x59\x14\x0c\x99\x69\xc8\xff\x12\xf9" + "\x65\xa2\x7e\xba\x2e\x99\xcd\xed\xd0\xfc\x5b\xd8\xa0\x63\x6c\x28" + "\xf9\xff\x23\xff\x5d\xe4\x5b\x54\x8a\x49\xb1\xbb\x63\x1e\x29\xcf" + "\xbb\x80\x7a\x91\x4f\x92\x57\xa7\xea\x89\xa6\x4d\x01\xee\x50\x9b" + "\x25\x39\x6e\x50\x2a\x5d\xb7\x4d\x3d\x41\x74\xad\xd4\x6d\xa0\x78" + "\x39\x11\x54\x4f\xac\xd3\x88\x75\x9f\xa3\x2f\xcd\x71\xa1\xc8\x17" + "\x89\xf4\x21\xb6\x0e\x27\x73\xdf\x36\xd5\x38\xd6\xc4\xe3\xa2\xc6" + "\xec\xce\x63\x7a\x4b\x1e\x8b\x31\x4e\xe2\x73\x69\xb4\x7b\xdf\x54" + "\xbd\x5c\x38\xd9\x25\xaf\x0f\x8d\x15\x69\x3f\x0c\x33\xde\xcb\x98" + "\x71\x02\xfd\xbe\x75\x9f\xf1\xa7\x18\xc3\x98\x94\x04\x4e\x73\x73" + "\x5e\xec\xd6\x17\xc5\x1c\xbf\xf5\xf9\x4b\xe1\x1b\x12\xa4\xc2\x3f" + "\xce\x93\xd6\x87\x1a\x29\x7e\xf2\x59\xcd\xad\xeb\xe4\xe2\xc3\x53" + "\xe4\x92\x4c\x3e\x17\x71\xbf\xfa\x52\xf8\xc4\x0a\xa4\x95\xa3\xfc" + "\x84\x4b\x9a\xd0\x26\xfc\x35\x2b\xef\x9b\xa8\xdd\xee\x8a\x49\x45" + "\xd4\x6e\x1e\x63\x05\xed\x4a\xc5\x98\xc9\xc3\x1e\x77\x70\xbf\xe3" + "\xbd\xe8\x5f\x25\x06\x25\xf5\x07\xf5\x81\xd4\x1b\x37\x88\xb7\xb5" + "\x37\x2e\x12\xfd\x4b\xbe\x3e\x75\x79\xf3\xf1\xce\x8e\x94\x50\x3c" + "\x1b\x72\x29\x26\x65\x32\xc5\x3a\xb2\x99\x1c\xcc\xbd\x3d\x85\xfb" + "\xb2\x7a\x7e\x0d\xd6\xdc\xd0\xc7\xb1\xd7\xa7\x44\x2a\x6b\x8b\x51" + "\x3d\xa5\xe2\xc3\x1d\x97\x48\x6f\x1f\x75\x43\xfd\x9a\xf0\xd7\x6c" + "\xd7\xc4\x75\x5d\x1a\x3d\xa9\x14\xd7\x3a\xd4\xd5\x28\x17\x3e\x30" + "\x86\x7e\xe3\x99\x11\x75\x3e\x49\xfd\x40\xfd\xa1\xf4\xc5\x71\x6f" + "\x5f\xac\xcb\x40\xbe\x5a\xa9\xf0\x75\xec\x17\xb7\x56\xc8\x85\x3f" + "\xef\xf0\xc9\xe7\xf6\xe6\x7b\x26\x52\xe4\x7b\xbb\x4a\xe4\x7b\x38" + "\x1d\x7d\xfe\xbc\xe8\xef\x1f\x4e\xbd\xbc\xbf\x7f\xf8\x13\xef\xbb" + "\xcb\xf6\x8b\x77\x7f\x9b\x20\xde\x9d\x4a\xef\x2e\xf3\xaf\xd3\x0f" + "\x33\xbd\xf9\x7f\xd5\x26\xf2\x97\x3b\x44\xfe\x29\xf1\x3e\xf9\xb6" + "\x7a\xf3\xad\xca\x12\xf9\x7e\x57\x24\xf2\xdd\x0b\xda\xf0\x87\x47" + "\x03\xd4\xe5\x90\xf7\x9d\x12\xa7\x78\xe7\xfd\x0a\xf1\xce\x7c\xf4" + "\xcf\x0f\xdd\x7d\xea\x72\xc1\x9b\x7f\x8b\xd2\xee\xf7\x26\x8a\xfc" + "\xbf\xa8\xf7\xe6\xfb\xd1\x8d\x22\x1f\x3d\xaf\x47\xbe\x5b\x4b\x2f" + "\x85\xbf\xd0\x2c\xf2\x3d\xb9\x98\xe6\x23\xf2\xdc\x29\x15\xfe\x74" + "\xd3\xa5\xf0\x1f\xe7\xa0\x9c\x4d\x18\x9b\x58\xba\x62\xec\x62\x25" + "\xcb\x0c\x94\x19\x17\x4a\xe7\x0d\x84\xb9\xc0\xf7\x56\xe0\xae\x3b" + "\xf0\xf9\xe5\x8f\x72\x3d\xf2\x2d\x09\xb4\xc1\xf6\x7b\x1a\x03\xd2" + "\x6b\xdb\xa6\xce\x24\xbd\x03\xc2\x14\x7c\xfb\x0c\xf9\x38\x93\xcd" + "\x49\x8a\x4c\xe9\x47\xfc\x8c\x98\xfc\x31\x90\xdc\x51\x49\xe3\x7e" + "\x0b\x25\xcc\x4d\xf0\x85\xd5\xe4\x57\x8e\xe4\x8c\xd8\xa3\xea\xec" + "\x9a\x31\x44\x87\x84\x3d\xa7\x95\xaa\xf0\x57\x8d\x3f\xeb\x73\x24" + "\x7f\x2c\x60\xf7\xa8\xb2\xd9\xc0\x75\x1d\x83\xfd\x6f\x73\x93\x57" + "\x3e\x35\x66\x32\xe6\xaf\xa5\xff\x3a\xbb\x63\x82\xea\xbf\xf0\x78" + "\xc2\x44\x07\xed\xb8\xd7\x68\x91\x44\x8c\x72\xac\x45\xd0\x70\x63" + "\x36\x63\xcf\xcf\xe7\xbe\x4b\x4b\x92\xcb\xa5\x51\xd8\x4b\xce\xb0" + "\x10\x5b\x6e\x1b\xab\x92\xda\xb4\x96\x1e\x16\xda\x80\xfd\x94\xf2" + "\x57\x81\x76\x30\x2e\x09\x01\x1d\x31\xe6\x65\xcb\x45\xa5\xbc\xf2" + "\xac\x2a\xf3\x53\x22\x16\x33\xd1\x8f\xb4\x07\x01\x77\x22\x79\x7c" + "\xae\x25\x44\x3f\x8d\xf9\x04\xbf\x23\x28\xef\xa5\x5b\xee\x88\xbf" + "\xf4\x9f\x59\x55\x3d\x3b\x7e\xce\x7a\x6e\x99\xac\xef\x1d\x96\x5c" + "\xde\xbb\xe3\x11\xa3\xeb\x3f\xb3\x8c\xae\x5b\x26\x55\xb9\x87\xfd" + "\x3c\x1f\xdf\xc6\xfe\x54\xaa\x7d\x55\xaa\xd2\xbe\x9a\x67\xd5\x52" + "\xb9\xef\xe6\x55\x6a\x0f\xe4\x35\x6a\x0f\x48\xd5\xda\x77\xf3\x2c" + "\xb8\x96\x53\xac\x26\xd0\xac\xb7\xdd\x7a\x20\xaf\x0e\xfb\xe3\x6d" + "\x58\x93\x3f\xca\x50\xe5\xa0\x72\xa2\x8b\x35\x54\xba\xd8\xa1\xac" + "\x0b\xcc\x11\x35\x63\x0a\xfe\x12\x1c\x43\x53\xe2\x1c\x43\x33\x8d" + "\xbc\xce\xc3\x52\x79\x1b\xc9\xfe\xea\x80\x24\xea\xac\xf4\x07\x95" + "\xb9\x75\xb7\x44\x36\x5a\x8a\x5f\x57\xcd\xd8\x99\x97\xf9\x75\xd5" + "\x8a\x38\x61\x1e\xdf\xae\xff\x0c\xbf\xae\x8a\x0c\x81\xfc\xba\x82" + "\x77\x6d\x54\x78\x57\xab\xe2\xef\x28\x92\xf8\x55\xee\xef\x28\xc7" + "\xca\x7d\x16\x71\xbf\x1e\xdb\x1f\xce\x27\x3a\xb4\xbb\x70\x6c\x91" + "\xca\x97\x12\x6d\xe5\xde\x3a\x63\x26\xfe\x92\x90\x5e\x6e\xd7\x7c" + "\x14\xa1\xa6\xcb\x3b\x06\x5b\xa9\x4f\xdc\x72\xc6\xcf\xba\xc9\xb6" + "\x48\xce\xb8\xcb\xbd\x7d\x86\xc5\xbd\x3d\x93\x21\x6d\x0a\xfe\xee" + "\x74\x6f\x1f\x5c\x8b\xbf\x3a\xfc\xd5\xe3\xaf\x11\x7f\xc7\xf0\xd7" + "\x84\x3f\x3b\xfe\x5a\xf1\xd7\x86\xbf\x0e\xfc\x39\xf0\xd7\x25\x6d" + "\x1f\xdc\x4c\x7e\xea\xe4\x1d\x43\x68\x5e\x18\xd4\x72\xbd\xfd\x3d" + "\x2e\x0c\xed\x27\x7d\x9f\x46\x79\xc8\xe1\x64\x19\xeb\x5d\x7e\xf9" + "\x8e\x6a\x5e\x7f\xc2\xe5\x97\x27\x5b\x1c\x37\x67\x95\xe3\x2f\xc2" + "\x11\xb5\x2e\x03\x7f\x26\xfc\xe5\x38\xb6\xa7\x60\x4c\x33\x23\x30" + "\xae\x8d\xdd\x85\xe3\x30\xfe\x93\xe6\x0a\x59\xd3\x38\x60\xdc\xa4" + "\x2c\xe5\x77\xbe\x5d\x33\x81\xc7\x0a\x70\x0c\x4d\xb5\xe0\xde\x62" + "\xd7\x4c\xe4\xf9\x3a\x87\xa5\xcc\x51\x6c\x92\xf2\x91\x5e\x69\x0f" + "\xbd\xad\x48\xe4\x7b\x84\x7c\xdc\x81\x97\x1f\x57\xa3\xae\x41\xbf" + "\x78\x0c\x4f\x98\x52\x9f\x9a\x9f\x93\xba\x62\x71\xe6\x13\x0b\x57" + "\xfc\xd4\x38\x3a\xdd\x18\x97\xb9\x7c\x59\xea\xb2\x95\x0b\x57\x2e" + "\xe4\xe4\x23\x92\x6e\xf5\x3b\x3b\xa2\xb8\xbb\xcc\x05\x3e\x67\x48" + "\xab\x2c\xd3\xbe\x3d\xb3\x0b\xe3\xf3\xfd\xac\xaa\x9a\xb3\x0e\xad" + "\x1b\xf4\x5b\x64\x6b\x3e\xd6\x65\x72\x79\xcd\x59\xa7\x36\xb2\xd5" + "\xc8\x64\xac\x05\x7a\x66\x6b\x6d\x54\xe8\xb9\x8f\x58\x3d\xd1\x73" + "\xc8\xf3\xea\x12\xa7\xf6\x7e\x7a\xff\xb7\x93\xaa\x5e\xc3\x6f\xa4" + "\x19\xe9\x3d\x19\x34\x1e\xbf\x82\xc6\x13\xf7\x3f\x67\x07\xf8\xf5" + "\x11\xe3\x01\x9e\xef\xe7\xf9\xef\xd2\xf5\x62\xae\x5c\x8f\x72\x49" + "\xae\x26\xff\xf6\x8e\x78\x9e\xe7\xb7\x93\xf5\x3c\x0f\xd6\x61\x8b" + "\x66\xfc\x4c\xca\xc7\x79\x26\xd4\xf1\x35\xd4\xc3\xbc\x92\x85\xaa" + "\x6b\x9b\xf8\x22\xcf\xfa\xce\x26\x7a\x37\xfe\x0d\x5a\xdf\x54\x1f" + "\x19\xeb\x79\x1f\xde\x7d\x75\x89\xe0\x23\xc1\x3b\x86\x10\xcf\x48" + "\x18\x42\xd8\x61\xcb\x6d\xe4\xef\x57\x49\x8d\xe0\x39\x43\xe8\xdd" + "\x0b\xf4\xac\x0c\x34\x6a\x19\xe7\x49\xc6\xc7\xab\x7c\xc0\xa6\x61" + "\xc2\xdf\x51\x64\x1a\x23\xbb\xec\x91\xc8\x3b\x90\xfa\x8f\xfa\x8b" + "\xce\x6a\xe5\xc2\x71\x75\x65\xd1\x2c\x74\x57\x34\x8b\x70\x0d\x5d" + "\xe1\x14\xf2\xfa\xf1\x26\x95\xb6\xee\x8a\x59\xe1\xf4\x1d\x37\x31" + "\x5e\xc6\x85\x4b\xe8\xd4\x21\x9d\x1f\xef\xcd\x5f\xb1\x62\xe5\x53" + "\x0b\x8d\x0b\xe7\x3f\x91\x61\xe4\x8f\x8d\x2b\x57\x20\x4b\x66\xd6" + "\x0a\xe3\xd2\x55\x4b\x8c\x4f\xad\xc8\x24\x2e\x61\xe1\xf2\xe5\x2b" + "\x4d\x59\x83\x98\x78\xd3\xf8\xd4\xca\xc5\x59\x99\x26\xfc\x58\xb1" + "\x70\x49\xba\x91\x8f\xfa\x0a\x14\xb5\x78\xb1\x51\xf9\xc2\x8a\x8c" + "\xf9\xcb\x69\x22\x2c\xf9\x25\x32\xf9\xbc\xef\xcf\x43\x44\x92\x3f" + "\x29\xda\x77\xce\x6a\x26\x7c\x58\x1b\x8a\xbe\x2e\x59\xe1\x24\xfd" + "\x02\xdc\x37\x72\xbe\xb2\x70\x7c\x3e\x9d\xc5\x3c\x87\x36\x76\x8e" + "\x9e\x8c\xb9\x3b\x61\xa6\xda\x36\xf2\x49\xce\x7d\xf2\x91\xbf\x47" + "\xcd\x84\x77\xb8\xad\x1c\xd6\x03\xd7\x3f\x29\x1c\xff\x9c\xe8\x8b" + "\x09\xb9\xbe\xfe\x9c\xb9\x6f\x40\xcd\x84\xed\xe2\x1c\x63\x02\xf1" + "\xab\x4c\xf1\xa1\xae\xc1\x3b\xef\xd1\x3b\xd2\xf6\x4c\xec\x45\x13" + "\xf6\x7b\xf9\x93\x09\x9b\x28\x3f\xcf\x57\x38\xfe\x53\x79\x68\x0a" + "\xe8\x91\x09\x26\xaa\x57\x90\x3d\xc6\x78\x11\xe5\x1e\xa9\x62\xec" + "\x47\x31\x2c\xee\xe2\xb6\x99\x6d\xdd\xd1\x33\xe6\xf4\x14\xb0\x01" + "\x3d\xd8\xd7\x9c\x5a\x36\xf2\x12\xe6\xc5\xea\xf1\x2c\x64\xdd\x2c" + "\xa6\xad\x5a\x54\x45\x3e\x45\x59\x7d\x52\x29\xb3\xa5\xd9\x99\xcd" + "\xb9\x97\xd5\x5b\x5b\xd8\x51\xd7\x7f\x09\x3f\xfe\x6b\x88\xbf\x98" + "\x78\x07\xf9\x84\x32\xaf\x93\xdd\xaf\xbd\xe5\x08\x7b\xb5\xbd\x8a" + "\xfc\xef\x8f\xb4\xb9\x3e\xb3\xda\x72\x2b\x98\x2d\xc7\x66\x25\x5b" + "\xf9\xb3\x9a\xdb\x6f\x3e\x80\x67\x03\xeb\xf1\xde\xfd\x6c\x00\xee" + "\x87\xd2\x37\x8a\x76\xc8\x4d\xcf\x0c\x93\x9b\x9f\xd9\x21\xdb\x31" + "\xa7\xc8\x9f\x7e\xdb\xe6\x61\x72\xc7\x66\xc5\xef\x1b\xcd\x53\x53" + "\x36\x33\xb4\x6b\x6e\xdf\xcb\x65\x1c\xd3\xf8\xfd\x70\xdc\x73\x1d" + "\x0d\x5b\xce\x0e\xba\x1f\x81\xfb\x7a\x71\xbf\x9b\xee\x6f\xc0\x7d" + "\xb3\xb8\x7f\x9f\xee\x63\x71\xdf\x21\xee\x1b\x18\xb7\x1b\xd7\xdc" + "\xee\x12\xf7\x1f\xd3\x3d\xfa\x7e\x62\xa4\x35\x9b\xea\xfb\x29\xc6" + "\x6c\xe2\x70\xf3\x49\xf0\xa9\x39\xa7\xf9\x7a\x78\x37\x2f\x83\x64" + "\x30\x58\x0f\xb7\xef\xba\xae\x99\x78\xdc\x89\x53\xc2\xe3\xe9\x7a" + "\x7b\x82\xce\xc9\x06\x80\x66\xbc\x0e\xcf\x06\x53\xdf\x05\xa4\x61" + "\x5e\x9d\xfc\xd9\x6c\x97\x6c\x95\x5f\x9e\x54\x29\x6f\x7f\x14\x98" + "\xf9\x63\x8a\x43\x87\x7d\xee\x1e\x7b\xd5\x1a\x27\xf7\xeb\x0a\x3a" + "\x1d\x6b\x68\x22\xf7\x5d\xe9\x00\xdd\x1b\xc4\xcf\xa3\x5e\xde\x7e" + "\x9f\x11\xfc\x64\xe9\xac\x38\x17\xe9\x07\x82\xd6\xbf\x63\xf0\xa1" + "\x0c\xa2\x1b\x52\x9f\x93\x2a\x7e\xec\x90\xcc\xc9\x4c\x1e\x35\xa9" + "\x72\x56\x86\x6c\xc5\x1e\xa6\x11\xb2\x6e\x99\xbe\xff\x19\xff\xee" + "\xe8\x49\x95\xd2\xaa\x0c\x8a\x1f\xc4\xf1\x25\x8f\xf6\xf3\x6c\xe0" + "\xc9\xda\x64\x9d\x7b\x7b\xaa\xe5\x50\xc6\xa9\xfe\xc5\xe2\xd2\xdc" + "\x11\x19\x54\x27\x09\x75\x72\xcb\xc9\xcc\x85\xef\xb8\xd0\x56\xa2" + "\x1d\x5e\x95\xea\xb4\xa0\x61\x2a\xf7\x2d\x68\x0a\x93\x57\x25\xeb" + "\xd0\xa6\xf1\xb6\xb8\x0b\xac\xa1\x87\xd6\xca\x1d\xf5\x87\xc0\x35" + "\xdf\x93\xe3\xb2\xea\x1c\xdc\x1f\xad\xde\xb4\x88\xdd\x24\x0f\xbd" + "\xcf\xd8\xae\x99\x14\x7b\x7f\x2e\xda\x80\xb6\x1f\x68\x69\x0a\x95" + "\xd0\x8e\x71\xa2\xdf\xf0\xde\x24\x92\x45\x95\xaa\xfc\x4d\x3f\xeb" + "\xcf\xe7\x8d\xb4\x22\x99\x91\x0d\xdf\x6b\xa0\x57\xa4\xde\x64\x9d" + "\x84\xfd\x88\x9e\x1d\x8a\x3b\xc3\xe8\x9b\x4a\x5f\xf3\x58\x7b\xf2" + "\x28\xf4\x33\xbe\x4f\x7e\x70\xd5\x7e\xc5\x9e\x86\x3e\xcd\x08\x3c" + "\xfe\x3b\x52\xd3\x50\x3f\x8b\xbc\x7d\x70\x40\x1b\x1e\xec\xeb\x5b" + "\xc4\xfc\xb8\xa3\x0e\x7f\x4d\xf2\x8b\x59\x7a\xc7\xe8\x3b\xda\x78" + "\x7c\xc7\x1d\x0f\x5b\x54\x59\x11\xd6\x1b\xe6\xc8\xa4\x5d\x55\x79" + "\x6d\x81\xfd\x80\x5a\x5e\x6a\xe3\x71\xb5\xc2\x3e\x93\x75\x6e\x8a" + "\x17\x7b\x81\x7c\x2a\xb7\x1d\x8a\xeb\xea\xe7\x98\x4e\xb2\x07\x1b" + "\x53\x2a\xff\x9e\x5b\xe5\xde\xfe\x95\xf7\xe3\xf8\xa0\x73\xa4\x02" + "\xfd\x12\x33\xb8\xaa\x47\x9e\xa6\x11\x3c\xc8\xe4\xe3\xd4\x57\x2e" + "\xec\x23\x6b\x8e\x33\xad\x13\xfb\xe5\x7f\x3d\x5c\xa4\x1d\x93\x46" + "\xb1\xe2\x59\xfe\xe1\xc6\x5a\x36\x7b\x26\x33\x1f\xcd\x38\xcf\xd4" + "\x78\x59\xd8\xd7\x8c\xaf\x3c\xec\xd0\xd2\x79\x13\xc5\xc7\xe2\xfc" + "\xfa\x8e\xc7\xd3\x7e\xf7\x31\xf6\x4c\xd0\x11\xfb\x3e\x76\x68\x5d" + "\x9d\xc9\x46\xee\xd3\x19\x7c\x84\x39\x43\x96\x3c\x67\x50\xe4\xf7" + "\xdf\x32\xd5\x4e\xf1\x87\x8f\xcc\x69\xe4\x76\xd5\x47\x92\x6b\xd9" + "\x91\xe6\x52\x56\xdf\x7a\x92\x6c\x01\x5f\x3c\x92\x6c\x21\x7a\x72" + "\x88\x0b\x34\xe3\x4e\xd0\x8c\x58\xaf\x03\x25\xfd\x4b\x6d\xea\x39" + "\x14\x9d\x49\xa9\xf4\xa2\x0b\x6b\xb4\x4c\x89\x99\xe5\x2a\x9c\x54" + "\x5b\xa6\x9c\x49\x51\x2c\xad\x17\xb2\xd9\xa8\x17\xb4\x52\x72\xa0" + "\x33\xa8\x21\xcb\xb8\xdf\x15\x83\x14\xf5\x52\x9b\x1a\x53\xeb\xfe" + "\x65\x46\xf6\x36\xda\x7e\x28\xae\xbf\x6b\x72\x32\x3f\x93\x75\x61" + "\xde\xb9\x30\xe7\x5c\xe8\x4f\x8c\x81\x05\xe3\x16\x90\x17\x53\xc7" + "\xa0\xd7\xac\x8e\xc1\x4f\x17\xf2\x31\x00\x0f\xb7\xf6\x51\x65\x0c" + "\x4e\x60\x0c\x5a\x31\x06\x05\x2c\xff\x83\xb9\xf5\x6c\xf6\x1c\x8c" + "\x41\xc7\x79\xf2\x07\x2e\x62\x96\x65\x89\xbe\xe7\x63\x71\xc2\xa1" + "\x6d\xe8\x12\x63\xb0\xf7\x31\x31\x06\xaf\x3e\xe6\x00\x1d\x33\x89" + "\xbd\x82\x7b\xf7\xaa\x64\x23\xc5\x70\x91\x0b\xd2\x28\xbe\xb2\x18" + "\x8b\x5e\x8c\x45\xaf\x18\x8b\xbc\x65\x18\x8b\x63\x4d\xdc\xff\xca" + "\x91\xe6\x7a\x56\x9f\x56\xce\x8e\x02\x97\x30\x16\xf3\x69\x5c\x48" + "\xbe\xe0\x5e\x1b\x17\xfd\xfc\x1a\x16\x53\xb6\x86\x19\xd4\xf1\x90" + "\x7a\x31\x1e\x6b\x30\x1e\x3d\x18\x0f\xa7\x67\x3c\x62\xf8\x78\x9c" + "\x51\xc6\xa3\x87\x74\xd9\x30\x1e\x3d\x18\x8f\x1e\x8c\x47\x81\x18" + "\x0f\xc2\xf9\xfb\xbb\x74\xb2\xf4\xf7\x38\xb6\xbb\x3d\xc0\x78\xac" + "\x55\xc6\xe3\xc4\x37\x19\x8f\x9f\xc6\x5f\x3e\x1e\x3f\x89\xb9\xda" + "\x78\x78\xd7\xc4\x94\x81\x34\x1e\xbd\xe5\xca\x9a\xb8\x85\xd6\x44" + "\xbe\xf6\x47\xd8\x8b\xa8\x4f\x0f\x37\xd6\xf0\x35\x81\xb6\xe6\xbf" + "\xf2\xb0\x53\x5b\xdf\x8a\x71\x49\x97\x85\xac\x43\x19\x17\x31\x1e" + "\xc9\xc6\xca\x8f\x45\xff\x1b\xef\xa3\x3d\x83\xd6\x06\x8d\x0f\xc6" + "\x09\xeb\x27\x50\xbc\x39\xdf\xb3\x5a\x94\x29\xd1\x3a\xa1\x35\x42" + "\xeb\xe1\x68\xc6\x49\x1e\xbf\xfb\xc8\x9c\x3a\x46\x67\xb6\x47\x92" + "\x6b\x30\x56\xa5\xcc\xbd\x0a\x63\x93\x8d\x75\xa2\x61\x37\x53\xdc" + "\xb9\x23\xc9\x45\x44\x2f\xe8\x31\xe7\x07\xba\x31\x4e\xee\x6e\xc3" + "\xa0\x4d\xe0\xb1\xf6\x64\x7b\xd7\xcd\x6e\x25\xc6\xae\x1c\x3e\xa9" + "\x16\xe9\xa1\x2e\x8c\x11\xd6\x8e\xdf\x9a\xf1\xc4\xde\xfd\x22\x8e" + "\xed\x6a\x61\x11\x83\x33\xc5\x18\xb9\x7d\xd6\xcc\xac\x4c\x5a\x33" + "\xf9\x18\xa3\xe3\xfd\x1c\xa3\xff\xc3\xe5\x06\xe0\x3d\xd3\xe4\xa1" + "\x83\xab\xb0\x4f\x62\x8c\x7e\x5a\x11\x6c\x8c\xdc\x15\x77\xd4\xb9" + "\xf5\x33\xe8\x6c\x65\xa4\xb4\x74\xae\x46\x02\xff\xd4\x03\xbe\xf5" + "\x88\xc3\xc5\x72\x1f\x67\xda\x35\x27\x59\xb8\x6d\xee\x47\xcc\x66" + "\xaf\x66\xe4\xe3\x97\xe4\xde\xe4\xeb\xdf\xe6\xaa\x06\x5e\x65\xe6" + "\xd3\xfd\x2e\x7e\xef\x60\x6b\x1f\x67\x21\x3c\x1e\x65\x72\x39\xdb" + "\x84\xf9\xb9\xef\xb1\x72\xad\x54\x72\x5f\x8e\xac\xa7\x18\x25\xcc" + "\x4a\xb6\x49\xe6\xd5\x2c\xf2\x68\x46\x3d\xf9\x84\xfb\xcc\x9c\x23" + "\x7f\xde\xd0\x85\x32\x1d\x72\x8f\x1b\x7b\xc6\xee\x02\xb9\x9a\xfc" + "\xb6\x8f\xa3\x3d\x82\xfc\x55\x68\xa6\x9c\x22\x5a\x84\xe4\x7f\xd6" + "\xbc\x17\x40\x7b\x4d\xe1\xf6\xdf\x48\xd3\x1c\x5d\x44\xfa\x14\x09" + "\x8f\x52\xbd\x84\x2c\x5e\x5c\xc7\x51\xdc\xbe\x61\x99\x07\xdf\xc9" + "\x73\x84\x5a\xc0\x0f\x83\x46\x43\xbe\x3b\xef\xe0\x7c\xde\x8e\xc1" + "\x4e\xdb\x31\x27\x97\xc3\x3a\xcc\x19\xe1\x96\x35\xe4\x4f\x97\x7c" + "\xc0\xd3\x9e\x9d\x30\x90\x62\xea\xca\x15\xd8\xaf\x86\x3d\x6c\xa9" + "\x5a\xe0\xd0\x7a\xf7\xe5\x3b\xb1\xef\xdd\xd1\x76\x4f\x9c\x6c\x26" + "\x5f\xf9\x07\xd0\x2e\xe2\x83\xfe\xab\xc5\xc9\x31\xe5\x77\x0b\x8a" + "\xb4\x24\x27\x72\x02\x1f\xea\x3f\xfe\x3d\x8f\x11\x7a\x5a\xf3\xb3" + "\x65\x1f\x24\xbb\x18\x7d\xff\xa1\x5b\xe9\xac\xe5\xce\x8a\x4b\xda" + "\x3f\x77\x5d\x0a\xff\xb1\xd1\xdc\xea\x8d\x8f\xe8\x1b\x07\x91\x70" + "\x66\xdf\x02\x94\x49\x38\xd3\x92\xaf\x15\xd8\x92\x40\xb2\xca\x88" + "\xbe\xd8\x72\xb4\xe3\x0c\xcb\xc3\x3c\x3e\x9a\x51\xce\xe3\x19\x0c" + "\x01\xbe\x4b\x6b\x81\x27\xbd\x71\xd1\xbb\x80\x27\x84\x03\xbb\x81" + "\x1f\xd2\x5a\xc3\xa0\xe2\x1e\x36\x46\xc5\x11\xa2\xbd\xe8\xfa\x38" + "\xe6\xa8\xae\x0e\x69\x18\x27\x09\xb8\x0e\x3c\x89\xdb\xb9\x86\x8d" + "\xda\x89\x39\xba\x8b\x70\x04\x74\xf1\xfd\x26\xe0\xc8\x2a\xe0\x48" + "\x36\x8f\x53\x6b\xd8\xad\x15\xf8\xf1\x56\x4b\x91\xd6\xa2\xc6\xa9" + "\xe6\xfd\x7b\x57\x58\x03\xcd\x8f\xb4\x7c\x6e\x7b\xe6\xa6\xfd\x69" + "\x6d\x72\x48\x43\x17\xe6\xc8\x8e\x4c\x13\xa5\xf1\x75\xbb\x2a\x63" + "\x90\x24\xe6\x5a\x02\xf5\xc9\x9e\xb3\x2c\x9e\xc7\x72\xfc\xda\x30" + "\x68\xcb\x12\x36\x66\xf7\x59\x36\x6a\xf7\x12\x16\x87\xf5\xaa\xdd" + "\x8d\x3a\xa4\x2c\xd3\x33\x1e\x37\x20\xfc\xc7\x71\x48\x0f\x18\x37" + "\x00\x74\xb5\x61\x37\xad\x99\xa5\x71\x9e\x3a\xb9\x2c\xe6\x7c\x37" + "\xfa\x8e\xfb\x44\xd2\xdc\xf5\xb8\xd0\x81\x1e\xdf\x24\xe8\xfc\xbb" + "\x2c\x42\x0f\x69\x52\x33\x78\x95\x01\xed\x9a\xbb\xee\x91\xb7\xfd" + "\xac\xd1\xb4\x86\x69\xda\xd5\x67\xa0\x3d\x25\x8c\xd5\xd8\x7c\x96" + "\x2f\x45\xbd\xd2\x64\xcb\x01\xed\x44\x3e\x90\xfb\xb5\x0e\xef\xe2" + "\xb6\x15\x6e\x8b\x79\x23\xb5\x57\xda\x66\xde\xb4\xa7\x9d\xc5\xcb" + "\xbf\xc2\x78\x2c\x42\x5b\xdb\xd9\xa8\xb2\x76\xb4\x75\x95\x68\xab" + "\x1a\x97\x5b\x2a\xf8\xb3\x0b\xcf\xae\x18\x73\xc7\xf1\x2b\x8a\xb9" + "\x33\xb6\x12\x18\xf6\x3d\xf9\xfb\x8c\x1d\xed\xe0\xfe\x28\xba\x6d" + "\xae\x93\x8c\xbe\x4b\xb2\x23\xdb\x79\x3e\xa7\x7f\x42\x73\x59\x2a" + "\xcf\xd2\xa7\x36\x63\x6e\x77\x67\x90\x1c\x4d\x7f\xa0\xc5\x41\xfe" + "\x1f\x38\xcd\x67\xd7\xdc\x99\x41\x74\xda\xbb\x48\xa3\xb9\xef\x33" + "\xe7\x33\x68\xce\xd3\x73\x3e\xef\xf1\x9e\xad\xf9\x14\xa3\xf2\x7c" + "\xcb\xa1\xf1\x57\xcb\x3a\xad\x99\x7a\x23\x95\x45\x73\x81\x64\x3c" + "\xb4\xd6\xc4\xd8\x57\x93\x0e\xb8\x41\x1e\x36\x53\xb9\x77\x90\x5f" + "\x11\x3d\xcd\x01\x3e\x57\x80\xdf\xe4\xaf\x54\x96\x93\x43\x30\xcf" + "\xa8\x9e\x83\x30\xde\xf1\xea\xbc\x40\x5a\x4c\xdf\xb9\x31\x64\xbd" + "\x9e\x78\x9a\x18\xfa\x7d\xad\xf3\xa3\x7f\xe3\x37\x35\xa8\x8d\x82" + "\x34\xea\x0e\x92\xb5\x8e\x24\xdc\x74\x77\xfa\x60\x66\x87\xc0\x4c" + "\xc2\x24\x15\x37\x39\x36\x71\xbf\xef\xd5\x3c\xbe\x3b\xaf\x63\x3f" + "\x71\xf3\x68\x87\x17\x37\xef\x37\xf9\xe0\x66\x87\xdc\x23\x8d\x0e" + "\x84\x9b\x89\x37\xfa\xe3\x66\xe2\xcd\xfe\xb8\x79\xcf\xd3\x7d\x71" + "\xf3\x72\xcc\x4c\x9c\x1f\x08\x2f\xc1\xc7\x8c\x6c\xd7\xdc\x33\x31" + "\x38\x56\x26\x6e\xea\x3f\x56\xde\xbd\xcb\x1f\x2b\x13\x1b\xff\xff" + "\xc5\xca\x69\xe3\xfd\xb0\x52\x7f\x8d\x58\xd9\xce\xb1\x32\x46\xfe" + "\x3b\xd6\x84\x82\x1f\xbb\x17\x05\xc1\xca\x45\x57\x59\x0b\xbf\x0a" + "\x86\x95\xd3\x9e\xf1\xc7\xca\x69\x35\xfe\x58\x39\x6d\x99\x17\x2b" + "\x95\x67\xdf\x0a\x56\x4e\x2b\xfa\x6e\xb0\x72\x5a\x11\xc7\xca\xb3" + "\x84\x95\xf7\x2c\xbc\x3a\x56\x26\x96\x04\xc6\x4a\xa4\x73\xac\x4c" + "\x2c\xf1\x62\xe5\xc9\xab\x60\xe5\xbd\x33\xfa\x81\x95\x31\x1c\x2b" + "\xf5\x41\xb0\x72\x11\xfa\x4a\x99\x17\x7c\xee\xf5\x99\x1b\x0a\x56" + "\x1a\x3c\x58\x79\x0d\xf3\xa3\x7f\xe3\x77\x6f\xd2\x95\xb0\x52\xb2" + "\x08\xfa\x92\xb0\x52\x1e\xa6\x60\xe5\x62\x17\x5b\xf3\x09\x30\xf2" + "\x58\x3b\x8f\x0f\xc1\xf5\x76\xf1\x97\xfb\x28\x61\xd1\x23\xe5\xaf" + "\xa2\xbf\x6c\xf6\x2a\x8e\x4d\xdc\xf6\x6a\x26\x61\x55\x15\xf2\x96" + "\x7a\xe8\x4e\x8e\x9d\x9f\x28\xd8\x39\x4f\xc1\xce\x94\x7f\x00\x3b" + "\x1f\xa3\xb1\x9c\xfe\xe8\x25\xad\x8a\x9d\xdb\x80\x9d\xd3\x39\xfd" + "\x40\xe7\xba\x02\x3b\xef\x3b\xae\xd6\x8b\x64\x9a\xb6\xac\x17\x98" + "\xa8\xd7\xf9\xcb\x71\xf4\x3e\x5e\xde\x3e\xeb\xa2\x0e\xe6\xc1\xd2" + "\x79\x5e\x2c\x45\x59\x4f\x07\xc7\xd1\xe9\xc7\x3c\x38\x5a\x00\x1c" + "\xfd\xd4\x07\x47\xc1\x37\xfd\x8e\x30\x0f\x38\xda\xcd\x71\xf4\x2d" + "\x05\x47\x93\x4e\x7d\x30\x0f\x38\x7a\x9f\x8a\xa3\x49\x06\x67\xc1" + "\x9f\xbb\x9c\x85\x57\xc7\xd1\x6e\x8e\xa3\xa6\xff\x79\x1c\xad\xed" + "\x83\xa3\xe0\x5d\x29\x36\x77\x40\x1c\x55\xe7\x23\xc7\xd1\x7c\x2f" + "\x8e\xf2\x7e\x9d\xb1\xbe\x21\x0d\xfd\x9e\x66\xe2\xbc\x9b\x07\x47" + "\x4d\x55\x02\x47\x91\xc6\xe5\x27\x2b\x80\xa3\x98\x7f\xe6\xa3\xe4" + "\xd7\x8a\x25\xa0\x8e\x7a\xc2\xd7\x3d\x58\x33\xd4\x47\x1e\x3c\x5d" + "\x84\x35\x43\x18\xd3\x89\x35\x03\x1c\x4d\xb9\xa0\x67\x7c\xbd\x14" + "\x62\xbd\xb4\x07\x89\x59\xa5\xea\xdb\x06\xc5\xd3\x19\x9f\xf8\xe3" + "\xe9\x7d\x91\xfe\x78\x3a\xe3\x3d\x2f\x9e\x2a\xcf\x08\x4f\x31\x66" + "\xe8\x9f\x26\xc2\xd4\x6f\x86\xa7\x33\x9a\x3c\x78\xaa\x55\xf0\x74" + "\xd1\xd5\xf1\x94\x9f\x0b\x06\xc1\x53\x5f\x6c\x08\x8e\xa7\x33\x9a" + "\xbc\x78\x7a\xdf\x1b\x1e\x3c\x6d\x0a\x86\xa7\xd3\x9b\x03\xe3\x29" + "\xd2\x39\x9e\x4e\x6f\xf6\xe0\x69\x53\x00\x3c\xbd\xcf\x17\x4f\x7f" + "\xfe\xb2\xc0\xd3\x2a\xe1\xff\x02\x98\xda\xd0\x85\xf9\x41\x6b\x2e" + "\xab\x94\x63\xaa\x04\x4c\xa5\x38\x9e\x14\xe7\x86\xf4\xe5\x03\x61" + "\xaa\xc0\x5c\x3b\x23\x5c\xa5\xb5\x69\x9e\x05\x7e\x17\x7b\x11\xfa" + "\x84\xef\xbd\x6a\xff\xed\xf1\xc1\xd7\xd4\xd5\x7a\xa2\xed\xfc\xe6" + "\x8a\xa4\xce\x95\xce\x38\xd2\x03\xf6\x9b\x2b\xfd\x1b\xcb\x9f\x57" + "\x04\xc3\xd6\x60\xbc\xfb\x07\xc4\xbb\x3f\xc4\xb4\x6b\x1f\x02\xbe" + "\x26\x13\xef\x5e\xd9\x87\x77\xaf\xbc\x9c\x77\x3f\x7e\x65\x1c\xed" + "\x17\xef\xfe\x30\x8d\xe1\xcc\x17\xfd\x71\x74\xe6\xcb\xfe\x38\x3a" + "\xe7\x66\xaa\x97\xc0\xf1\xca\xc0\xbc\x3b\x5f\xe7\x33\xcf\x79\x78" + "\xf7\x26\x7f\xfc\xf4\xf2\xee\xb3\x3f\x0c\x8e\xa3\xb3\x62\xfd\xe8" + "\xd1\x14\x05\x47\x17\x28\x38\xba\xc0\x8b\xa3\x47\x3e\x52\xe9\xd1" + "\xfb\x7f\x72\xb8\xc9\x17\x47\x67\xa5\x79\x70\xb4\xf9\x72\x1c\x55" + "\x31\x94\xf0\x94\xca\x21\x59\xd6\x5e\xe0\xf4\x6b\x0b\x4c\x5a\x21" + "\xab\x4d\xa3\xbe\x8b\xe8\x2b\xab\x3d\xda\x71\x81\xe5\xcd\x23\x3c" + "\x2d\xe5\x78\xaa\xd3\xb0\xf9\xc0\xbe\x21\x64\x33\x50\x46\x67\xfa" + "\xd9\x22\x36\x11\xc9\x97\xa4\x55\x22\xa6\x9e\x2a\x67\x42\x7b\xf9" + "\x59\xfe\xe3\x27\x15\x4c\xa5\x18\xd8\x98\x73\x3b\x2f\x02\x53\xb3" + "\x03\xd0\xa6\x6b\x81\xa9\x6b\x7c\x68\x53\xac\xfd\xb7\x16\xf4\xc5" + "\xd4\xfb\x8f\x36\xd0\x5c\x21\x4c\xf5\xe3\xe3\x2b\xff\x05\xf8\xf8" + "\xd9\xa3\xfd\xb1\x74\x76\xb2\x3f\x96\xce\x1e\xec\xc5\x52\xe5\xd9" + "\xb7\x42\x9b\xce\x1e\xf5\xdd\xd0\xa6\xb3\x47\x79\xf9\xf8\x39\x1a" + "\x0f\x96\x1e\x0b\x86\xa5\xb3\x46\x05\xc6\x52\xa4\x73\x2c\x9d\x35" + "\xca\x83\xa5\xc7\x02\xf0\xf1\x7e\x58\x3a\xe7\x94\xc0\xd2\x4a\x41" + "\x9b\x36\xa9\xb4\x69\xe5\xff\x83\x7c\xfc\x9c\xd6\xfe\xf2\xf1\x1f" + "\x74\x08\xfc\x24\x7c\x52\x31\xd4\xcb\xc7\x57\x06\xe7\xe3\xaf\x82" + "\xa1\xfd\xa2\x45\x39\x86\x3e\x70\xca\x1f\x43\x1f\xf8\xca\x1f\x43" + "\x1f\x7a\xb4\x2f\x86\x5e\x8e\x9f\x0f\xde\x1a\x08\x3b\x05\x1f\xff" + "\x50\x44\x70\xdc\x7c\x70\x6e\xff\x71\xf3\xdf\x97\xf9\xe3\xe6\x83" + "\xa5\xff\x3b\x70\x73\x6e\x98\x1f\x6e\xea\xaf\x11\x37\xff\x29\x3c" + "\xfd\xdc\x3e\xf2\xcf\xb9\x7d\xe4\x9f\x73\x7d\xe4\x9f\x73\xbf\x45" + "\xf9\xe7\xdc\xef\x48\xfe\x39\x77\x9e\x97\x06\x7d\xe8\x27\x57\xc7" + "\xcd\x07\xe7\x05\xc6\x4d\xa4\x73\xdc\x7c\x70\x9e\x17\x37\xaf\x46" + "\x83\x3e\x7c\x63\x3f\x70\xf3\x5f\x9c\xa7\x7f\xf8\x8a\xf2\xcf\x40" + "\x3c\x3d\xe1\x26\xc7\xcb\xa6\x3e\x3c\xfd\x43\xbe\x3c\x7d\xa5\x97" + "\xa7\x4f\x12\xb8\x65\x73\x59\xfc\x79\xfa\x6f\x1d\x47\x1f\xb9\xcd" + "\xe9\x91\x87\x3e\x0b\x1c\x7d\x84\xc7\x5b\x77\x7a\xe4\xa1\x8f\xbd" + "\xa1\xd6\x4b\xf0\xf4\xdb\x98\xa8\x57\x00\x9e\x9e\xeb\x0e\x3f\xb2" + "\xde\xc3\xd3\x37\xf5\xe5\xe9\x1f\x5b\x18\x1c\x53\x1f\xa9\x0c\xc8" + "\xd3\x13\xff\xcd\x31\xd5\xc4\x31\xf5\xe2\x0e\x5f\x4c\x4d\x3e\xc4" + "\x31\xf5\x5e\x15\x53\x1f\xe9\x70\x62\x6d\x3a\xc3\xaf\x8e\xa9\x54" + "\x8e\x17\x53\x33\xfe\x39\x98\x6a\xbd\x76\x4c\xf5\xb5\x57\x7d\x0b" + "\x6d\xf7\x60\x2a\xef\xe3\x47\xe7\x37\xa4\x11\xa6\x66\xf4\xe1\xef" + "\x2b\x03\xf3\xf7\x87\x99\x96\xfa\x47\xe5\xef\x69\x0c\x38\xde\xfc" + "\x8f\xf2\xf7\x8f\xbe\xe9\x8f\xad\x8f\x76\xf8\x63\xeb\xa3\x2f\x7a" + "\xb1\x55\x79\xf6\xad\xf0\xf7\x8f\x56\x7f\x37\xfc\xfd\xa3\xd5\x5e" + "\x6c\x7d\x6c\xfb\xd5\xb1\xf5\x91\xaa\xc0\xd8\x8a\x74\x8e\xad\x8f" + "\x54\x5d\x11\x5b\xef\xf5\xc5\xd6\x5f\x3c\xad\x62\xab\x97\xbf\xc7" + "\xfc\xa0\xf5\x97\x65\xf9\xe6\xfc\xfd\x8c\xef\x9a\xbf\xff\xc5\xc6" + "\x7e\xf1\xf7\x3b\x80\xb3\xe0\xc5\xd7\x7e\x08\xfe\xfe\x01\x85\xbf" + "\x6f\x2e\xef\xc3\xdf\x97\x5f\xc6\xdf\xe7\x3e\xa0\x60\x2a\xd6\x14" + "\xc7\xd4\x05\x95\xdf\x9c\xbf\x7f\x90\xc6\x70\xde\x7a\x7f\x4c\x9d" + "\xf7\xb4\x3f\xa6\xa6\x0d\xa5\x7a\x09\x4c\x2f\x0f\xcc\xdf\xf3\x75" + "\x3e\xef\x43\x3f\xfe\x1e\xf5\xbb\x9c\xbf\x4f\x3d\xe4\x87\xa9\x29" + "\xbe\x98\x3a\xcf\xe5\x47\xa7\xa2\x5d\x84\xa9\xaf\x7c\x2a\x30\xf5" + "\xbf\x3e\xf5\xc1\xd4\xfb\xff\x4b\xc1\xd4\x94\xdb\x0e\xcf\xf5\xc5" + "\xd4\xc7\x13\x54\x4c\xe5\x78\x99\xe2\xd4\x9a\x93\x2f\xd7\x3b\xe1" + "\xfa\x3e\xa4\x0b\x84\xb2\xc9\x56\x8c\xca\xdc\xf7\x69\xc6\xd5\xf5" + "\x4d\x92\x03\xeb\x9b\xd8\xb2\xec\xac\xbe\xd5\xc2\xf5\x4c\xca\x48" + "\xcf\x64\x3d\xbb\xb9\xac\x47\xf8\x09\xe0\x3e\x0c\x83\xf8\x08\x78" + "\xfc\x51\x2f\xce\x92\x4e\xd6\x4e\xd2\xc9\xba\x28\x74\x80\x30\xde" + "\x97\xfb\x05\x50\xe9\x26\xe0\xc1\x9b\x9f\xf6\xc5\xd9\x94\xf7\x1a" + "\x68\xfe\xcc\xcb\xe8\xc3\xf3\x97\xff\x0b\xf0\xfc\xa9\xc3\xfd\xf1" + "\x35\x75\xa6\x3f\xbe\xa6\x6a\xbc\xf8\xaa\x3c\xfb\x56\x68\xd7\x54" + "\xc3\x77\x43\xbb\xa6\x1a\xbc\x3c\x7f\xea\x05\x0f\xbe\x36\xfa\xe0" + "\xeb\xa7\xbe\xf8\xfa\x78\x28\xc7\xd7\x4f\xfb\xe2\x2b\xd2\x39\xbe" + "\x3e\x1e\xea\xc1\xd7\xc6\x3e\x3c\xff\xa7\x7d\xf1\x35\xed\x13\x8e" + "\xaf\xcd\xe5\x7d\x68\xd7\xf2\xab\xf3\xfc\xcd\xff\x6a\x3c\x7f\x5a" + "\x53\xbf\x78\x7e\xc2\xd4\xc5\x02\x53\x09\xb3\x54\x5c\xf5\xf2\xfc" + "\xe5\x41\x79\xfe\xab\xe1\x6a\xbf\x68\x55\x8e\xab\xf3\x3f\xf1\xc7" + "\xd5\xf9\x27\xfd\x71\x75\xe1\xfc\xbe\xb8\x7a\x39\xa6\x2e\xb8\x31" + "\x10\x9e\x0a\x9e\x7f\xa1\x3e\x38\x96\x2e\x48\xea\x3f\x96\x3e\xb1" + "\xda\x1f\x4b\x17\x6c\xfa\xdf\x8b\xa5\xe9\x83\xfd\xb0\x54\x7f\x8d" + "\x58\xfa\x4f\x91\x03\xa4\x2f\xf4\xc7\xd2\xf4\x52\x7f\x2c\x4d\x9f" + "\xe5\xc5\x52\xe5\xd9\xb7\x82\xa5\xe9\xe9\xdf\x0d\x96\xa6\xa7\x7b" + "\x69\xd5\x85\x53\xaf\x8e\xa5\x0b\xe6\x04\xc6\x52\xa4\x73\x2c\x5d" + "\x30\xc7\x8b\xa5\x27\xaf\x82\xa5\x4f\x8e\xee\x07\x96\xfa\xcb\x01" + "\xfa\x62\xe9\x77\x2e\x07\x78\x72\x54\xbf\xe4\x00\x2a\x96\x3e\x70" + "\xb9\x1c\x80\xf0\x95\xcb\x01\xd0\x5f\x2a\x86\x71\x39\xc0\x34\x81" + "\x65\x36\x57\x91\x9f\x1c\xe0\xdb\xc7\xd6\x5f\xde\xe1\xf4\xc8\x53" + "\x0b\x80\xad\xbf\xe4\xb1\xa4\x9c\x1e\x79\xea\xa2\x0f\xd5\x7a\x09" + "\x39\xc0\xb3\x4c\xd4\x2b\x80\x1c\x20\x91\x97\xf7\x8c\x9f\x1c\xc0" + "\x07\x6b\x51\xd6\xfa\xe0\x38\xfb\xcb\x2a\x3f\x39\x40\x8b\x17\x67" + "\x2f\x92\x8e\x3a\x70\x90\xe3\xec\x30\x5f\x9c\xcd\xf8\x9c\xe3\x6c" + "\xa2\x8a\xb3\xbf\xec\xea\xc6\xda\xec\xee\x2f\xce\x92\x1d\xc1\xa7" + "\x69\xdf\x0d\xce\x56\xf7\x03\x67\x7d\x64\x03\x6f\xa2\x3f\x3c\x38" + "\xcb\xfb\x3d\x73\x5d\xc3\x3c\xc2\xd9\xb4\x3e\xb2\x81\xf2\xc0\xb2" + "\x81\x43\xdf\x85\x6c\x20\xf3\xb8\x3f\xde\x2e\x8a\xf0\xc7\xdb\xcc" + "\x77\xbc\x78\xab\x3c\xfb\x56\x64\x03\x99\xc7\xbe\x1b\xd9\x40\xe6" + "\x31\x2f\xde\x2e\x7a\xfd\xea\x78\xfb\xcb\xea\xc0\x78\x8b\x74\x8e" + "\xb7\xbf\xac\xbe\x22\xde\x26\xfa\xe2\xed\xaf\x5e\x54\xf1\xd6\x2b" + "\x1b\x28\x57\x64\x03\x45\x57\x97\x0d\x34\x07\x91\x0d\xdc\xf3\x5d" + "\xcb\x06\x7e\x55\xde\x1f\xd9\xc0\xa5\x1d\x42\x6f\x7f\x2d\xe9\xed" + "\x3f\x0e\xfc\x9d\xf3\x11\xfa\xe0\xea\x7a\xfb\xb9\xaa\xfe\x69\x5a" + "\xa9\x82\xb3\xa5\x01\x65\x03\x1f\xb4\x05\x97\x0d\x7c\x70\xcc\x57" + "\xff\x74\xf1\x2e\xff\x73\xab\xc5\x2f\xaa\xe7\x56\x1f\x7c\x4c\x38" + "\x6b\x7a\x85\xee\xa5\x92\x14\xc5\x67\xb9\xa9\x92\xea\x19\x48\x8f" + "\xff\x2d\xc9\xf7\x2c\x6b\xb1\xdb\x23\x2b\x68\x24\xbc\x2d\x65\x92" + "\x9c\x11\x4e\x7e\xbd\xb9\xac\xe0\x61\x9a\x7b\xa6\x47\x7d\x71\xf7" + "\xc0\x09\x5f\xdc\x7d\x2a\x4e\xc5\x5d\x37\x70\xf7\x9d\x96\x52\x21" + "\x7f\x7d\x4c\xe8\xa6\xee\x7d\xcc\x47\x37\xf5\xa3\x3f\x2b\xb8\xbb" + "\x64\xf4\x61\x3b\xda\x7f\x25\xfd\x29\xbc\xff\xea\x89\x6b\xd5\x41" + "\x2d\x0d\xa8\x3b\xa5\xe0\x53\x40\xfd\x29\xd4\x55\xbf\x4b\x59\xab" + "\x6e\xac\xd3\x5d\x3e\xfa\x53\x65\x6b\xb0\x9e\x15\xbb\x92\x2b\xea" + "\xa1\x3e\xe6\xd5\x43\x95\x4b\x52\x22\x69\x7f\x93\xb6\xa7\x34\xf6" + "\xc8\x19\x21\x72\x4c\x4a\x24\x7d\xbf\xb7\x17\xfb\xce\xdd\xc9\x21" + "\x82\xaf\x7b\xdc\x01\xec\x19\x22\xfa\x7d\x49\x9a\x1b\x7b\x8d\x1b" + "\x7b\x8d\x54\xf2\xb8\xc3\x45\xb4\xc9\x8e\xc7\xbb\xca\xc0\xe7\xb9" + "\x0a\x78\x6c\xc1\x41\xc5\xe0\xf5\xf6\x10\x9f\x77\x16\x6b\xc3\x1c" + "\xa7\xa5\xfa\xa8\x38\xaa\x6b\x43\x3b\xce\x5e\x99\x96\x73\x7d\xed" + "\xc5\x51\xeb\x7d\x1f\xe0\x9b\x4b\x1f\x6a\xa0\xb9\x9b\xec\xb5\x29" + "\xe0\x34\x73\x10\x5d\x59\xaa\x8b\xf0\xaf\x88\xb9\xf0\x2d\xc8\x24" + "\x7c\xeb\xe3\x8f\xeb\x4b\xf7\xf9\xe3\xfa\x52\xbb\x3f\xae\x2f\xdd" + "\xee\xc5\x75\xe5\x19\x70\x1d\xe3\xc6\xe9\x68\xec\x7d\xdf\x90\x8e" + "\x5e\xba\x57\xc5\x75\x49\xc1\xf5\xdd\xd7\x80\xeb\x57\xa4\xa3\x7d" + "\x70\x29\x38\xae\x2f\xdd\xeb\x95\x49\x98\x9e\x09\xa8\x23\x7b\xc2" + "\x17\xd7\x9f\x8a\xe7\xb8\x7e\xa2\x2f\xae\x23\x9d\xe3\xfa\x53\xf1" + "\x41\xed\x09\x4e\xf4\x3d\x4f\x5b\xf6\x14\xc7\xf5\x26\x45\x47\xb6" + "\xb1\x1f\xf6\x04\x4d\x02\xd3\x55\x2c\x27\x79\xd5\x77\x2b\x93\x58" + "\xb6\xb8\x3f\x32\x09\x8e\xe5\x1d\x02\xcb\x09\x1b\x55\x3c\xbf\x16" + "\x7b\x82\xab\xe1\xb9\x4a\x37\x13\x9e\x07\xa3\x9b\xfd\xf1\x7c\xf9" + "\x53\xfe\x78\xbe\x7c\x99\x3f\x9e\x67\x3f\xe5\x8f\xe7\xd9\x8b\xfb" + "\xe2\xf9\xe5\x58\xbe\xfc\xbd\x40\x38\x6e\x7a\x98\x64\x14\xd9\xb1" + "\xc1\x31\x7c\x79\x47\xff\x31\x7c\xc5\x57\xff\xeb\x30\x5c\xdf\x17" + "\xc3\xb3\x46\x11\x06\xb9\x0b\xfb\x60\xf8\x22\x05\xc3\x15\x1c\xd9" + "\xd3\xae\xd0\xc2\x7d\x31\xbc\x03\xed\xb8\x0a\x3f\xee\xfa\x7b\x5f" + "\x0c\x5f\x39\xdc\x0f\xc3\xf5\x57\xc1\xf0\x45\x42\x0e\xe2\xa7\x97" + "\x1b\x44\x16\x82\x76\xc4\xed\x0a\x42\x9b\xab\x7d\xe6\x5b\x1f\x7f" + "\x0c\x5f\xb9\xcc\x1f\xc3\x57\x56\xf8\x63\xf8\xca\x47\xbd\x18\xae" + "\x3c\xfb\x56\x68\xf3\x95\xa6\x6f\x9d\x36\x57\xe7\xc7\x15\x31\x7c" + "\xa5\xc9\x4b\x9b\x67\xcf\xba\x3a\x86\x2f\xef\x0a\x8c\xe1\x48\xe7" + "\x18\xbe\xbc\x2b\xa8\x9d\xc3\x65\x18\xbe\xea\xb6\x7e\x60\xb8\xbf" + "\x2c\x44\xc5\x70\x45\x16\xb2\xc7\x47\x16\xe2\x2e\x10\xb2\x90\x5d" + "\xed\x62\x6e\x0c\xd1\x88\x79\x8a\xf9\x63\xd8\xad\xbd\x32\xef\xb6" + "\xeb\x1b\xc9\x41\x56\x8d\xe9\x8f\x1c\x84\xe3\x37\xd9\x38\x3c\x0a" + "\xdc\x6e\xbc\x46\x1b\x87\x24\xd5\xc6\xc1\x12\xc4\xc6\x41\xc1\xf3" + "\x94\x7f\x00\xcf\xb9\x8d\x43\xce\x9d\xfe\x32\xe6\x9c\xa9\xaa\x8c" + "\x59\xe0\x79\xee\x03\xfe\x78\x9e\x3b\xc7\x63\xf3\x00\xcc\xb7\x99" + "\xb6\x5d\x66\xf3\xe0\xc1\x76\x2e\x07\xcd\x79\xd1\xfa\x70\x2b\xf3" + "\xe0\xfb\x3c\x2f\xbe\xa3\x2c\x8d\x1f\xb6\xb7\xf8\x62\x7b\x4e\x9d" + "\x1f\xb6\x7f\x5a\xea\xaf\x1f\xd1\x62\xf2\xc1\x76\xd5\xe6\x61\xf5" + "\xa1\xc3\xcd\x57\xc1\x76\xbc\x7f\xed\x36\x62\xdf\x2e\xb6\xab\xf6" + "\x0d\x01\xb1\xdd\xd7\xbe\xc1\x47\xff\x81\xb0\x9d\xc7\xc3\x18\xda" + "\x07\xdb\xd7\x66\x68\xdd\x07\xb1\x1e\x80\xeb\xb4\x46\xdc\x32\xb0" + "\x9d\xf7\xf7\x1a\xe6\x8b\xed\xbd\x05\x02\xdb\x77\xb6\xff\xe3\xd8" + "\xee\xa1\x87\x7d\xb1\xfd\x5e\xc2\xf6\x35\x6e\x61\x7f\x91\x7f\x6d" + "\xf6\x17\x7d\xf4\x33\x76\x5e\x83\xfc\xe5\x8a\x18\x1f\xa0\x5e\xfe" + "\x18\xbf\xf6\x21\x7f\x8c\x5f\x5b\xe4\x8f\xf1\x6b\xef\xf4\x62\xbc" + "\xf2\xec\x5b\xa1\xd3\xd7\xce\xfd\x6e\xe4\x2f\x6b\xe7\x7a\x31\x3e" + "\x77\xfc\xd5\x6d\x2f\x72\x1a\x03\xeb\x66\x20\x9d\x63\x7c\x4e\xe3" + "\x15\x6d\x2f\xfc\xe4\xdd\xeb\x6e\x0e\x68\x7b\xd1\xf8\xcf\xd3\xcd" + "\xf0\x9d\x2b\x7d\xe5\x2f\xdf\x5c\xf6\xbd\xce\xd8\x5f\xf9\x0b\xd9" + "\x5e\xac\x3d\xee\x63\x7b\xd1\x7c\x75\xdb\x8b\xdc\x87\xae\x51\xfe" + "\x72\x05\xdd\x8c\x0f\xe6\xf8\xea\xbb\xe5\xdd\xe8\x8f\xef\x79\x37" + "\x7b\xf0\xfd\x41\xc2\xf7\x82\x3b\xfc\xf1\xbd\x60\x22\xd5\x33\x90" + "\x2d\xc6\x5b\x7e\xe7\x8a\x79\xeb\xfc\x75\x35\xfa\xc8\x5f\x1e\xa4" + "\xb9\xb7\xfe\x94\x1f\xbe\x7f\xea\x8b\xef\x79\x95\x81\x68\x77\x92" + "\x7b\x73\x9d\xe2\x14\x1f\x9b\xb6\xfb\x55\xfd\x37\xf3\xeb\x87\x93" + "\xd1\x7e\x7b\x10\x5d\xb7\x14\xa1\xeb\xc6\x75\xdb\x48\x0e\x8e\xb2" + "\x5e\x4b\x31\x69\xf3\xd2\x64\x89\x74\xdd\xfa\xea\xb9\x91\xee\x1b" + "\xe9\xba\x1d\xcd\xb0\x04\xd5\x73\xa3\xb9\x19\x4c\xd7\x0d\xf5\x8e" + "\xe1\x58\xff\xb9\x82\xf5\x8a\xae\x5b\x59\xb6\x57\xd7\xcd\x0f\xeb" + "\x03\xe8\x0f\xbf\xf9\x69\x7e\x60\x3a\xde\xec\xc5\xfa\x1e\xa2\xe3" + "\xff\x4f\x1f\x59\x0c\x1f\x03\x73\xc7\x3f\x55\x16\xc3\xb1\x3e\xff" + "\xf3\x06\x9a\xc7\xf3\x4c\x01\x64\x31\x97\xeb\x38\xff\xf3\x64\x31" + "\xeb\x7f\xe2\x8f\xf1\xeb\x17\xfb\x63\xfc\xfa\x9b\xbd\x18\xaf\x3c" + "\xfb\x56\x30\x7e\xfd\xe4\xef\x46\x16\xb3\x7e\xb2\x57\x16\x53\x30" + "\x34\xa0\xfe\x9d\x9f\x8c\x3d\xaf\x2a\xb0\x8c\x3d\x4f\xd1\xbf\xcb" + "\xab\x0a\x6a\x13\x72\xd9\x99\x66\xc1\x25\x21\x63\xff\x06\x36\x21" + "\xcd\xff\x6a\xb2\x98\x02\x67\x7f\x65\x31\x5c\xb7\xf9\x38\xe9\x87" + "\xf4\xcf\x26\xe4\x6a\xd8\xee\xa1\xdd\xaf\x70\x86\xe9\x8f\xed\x1b" + "\x2e\xf9\x63\xfb\x06\xb7\x3f\xb6\x17\x85\xf9\x63\x7b\x51\x68\x5f" + "\x6c\xbf\x1c\xd7\x37\xce\x0a\x84\xe9\xa6\x07\x49\x16\xf3\xeb\xfd" + "\xc1\xf1\x7c\x63\x4e\xff\xf1\xfc\xe9\xf5\xff\xab\xf1\x5c\xdf\x17" + "\xcf\x9f\xae\xf9\xa7\xca\x65\x38\x9e\x17\xbe\xee\x87\xe7\xfa\xab" + "\xe0\xf9\x3f\x4d\x2e\xf3\xeb\x81\xfe\x78\xfe\xeb\x29\xfe\x78\x5e" + "\x78\xce\x8b\xe7\xca\xb3\x6f\x45\x2e\xf3\xeb\x88\xef\x46\x2e\xf3" + "\xeb\x08\x2f\xcd\xfe\xeb\x53\x57\xc7\xf3\x8d\xf9\x81\xf1\x1c\xe9" + "\x1c\xcf\x37\xe6\x07\xd5\xa7\xbe\x0c\xcf\x8b\x0e\xf5\x03\xcf\x03" + "\xea\xa8\xfc\x6b\xc8\x65\x8a\x6a\xfb\x2b\x97\x09\x66\xa7\x42\xf8" + "\xee\xd5\x4f\xf1\xb1\x53\x49\x50\xed\x54\xf2\xfd\xf5\x53\xbe\x75" + "\x6c\x7f\xe6\xb8\x3f\xb6\x3f\xf3\x89\x3f\xb6\x6f\xbe\xe0\x8f\xed" + "\x9b\xbb\xd4\x7a\x0a\xb9\x4c\xc1\x65\x76\x2b\xfe\x38\xff\xec\x4f" + "\xac\x0f\xb6\xb2\x40\x58\x8f\xb2\x5e\x0e\x8e\xf3\xcf\xa6\x05\xc3" + "\x79\xd2\x57\xf9\x5d\x4a\x46\x00\x9c\xff\x4d\xe6\xff\x0f\x38\x1f" + "\x4c\x0f\x85\xf3\x41\xc0\x78\xc2\x7b\x8e\xef\x0a\xd6\x13\xce\xbb" + "\xdf\x0e\x24\xa3\xf9\x4d\xc5\xff\x14\xce\x07\x97\xd1\x6c\x7a\xb1" + "\x61\x9e\x82\xf3\xd7\x62\x43\xf3\x9e\xbf\x8c\xa6\x6c\xd1\xff\xb4" + "\x8c\x66\xd3\x25\x7f\xbc\xdf\x3c\xc6\x1f\xef\x37\x7d\xee\xc5\x7b" + "\xe5\xd9\xb7\x42\xbf\x6f\x72\x7e\x37\x32\x9a\x4d\x4e\x2f\xde\x6f" + "\x3e\x7e\x75\xbc\x7f\x36\x23\x30\xde\x3f\xab\xf8\x66\x7b\x36\xe3" + "\xda\xf1\xbe\xd8\x83\xf7\x97\xdb\xcf\xe4\x7f\x73\x1d\x99\xa9\xdf" + "\xb5\x8c\xa6\x38\x28\xfe\x5f\xc9\x3f\xc6\x37\x97\xd1\x28\x36\x89" + "\x0b\x02\xfb\xc7\x38\x7c\x05\x1d\x99\xc3\xf5\xbe\x58\xbf\xe5\x3d" + "\x7f\x5d\xc4\x2d\x87\x54\x5d\xc4\xc3\x0d\x84\xf5\xcf\x9d\xf1\xc7" + "\xfa\xe7\x3a\x82\xc9\x68\xde\x94\x7c\x75\x12\x2d\x37\xfb\xcb\x68" + "\xca\xfd\x65\x34\xf7\xd3\xdc\x7b\x6e\x57\x70\xac\xb7\xcc\xf4\xd7" + "\x01\x17\x36\x8a\xaf\xa4\x28\x3a\xe0\x29\x3e\x3a\xe0\xf7\xfd\xa7" + "\x82\xf5\x5b\x33\xeb\x1a\x5d\xac\x3f\x7a\x88\xff\xb8\xae\x77\x51" + "\x40\x1d\x44\xbe\x07\x5c\x41\x0f\x31\xf5\x13\x3d\xe9\x34\xbb\x76" + "\x67\xfb\xe8\x21\x5e\xc1\x9f\xb1\x1f\xfe\xa7\x98\x82\xe2\xff\x25" + "\xd9\x8b\xff\xd2\x8f\xbd\x72\x1b\x89\xe8\x7c\x3e\x2e\x5b\x2b\xfe" + "\xa7\xe4\x36\x81\xe4\x24\xd6\x44\xc2\xff\x6d\xcf\x0b\x3a\x3f\xe3" + "\x5f\x4c\x6e\xb3\xed\x9c\x3f\xee\x3f\x37\xca\x1f\xf7\xb7\x7d\xe2" + "\xc5\x7d\xe5\xd9\xb7\xa2\x8b\xbe\xcd\xf1\xdd\xd0\xf9\xdb\x1c\x5e" + "\xb9\xcd\x73\x47\xaf\x8e\xfb\x96\xb9\x81\x71\xdf\x32\x57\xe0\xbe" + "\x65\xee\x15\xe5\x36\x7e\xba\x91\x25\xaf\xff\xc3\x72\x1b\x95\xce" + "\xff\xce\xed\x7a\x4a\xaa\xfa\x23\xb7\xf1\xd8\xa4\xff\x43\x72\x9b" + "\xc0\x78\xaf\xd2\xf6\x87\xaf\x70\xe6\xea\x8f\xf7\xdb\x5f\xf7\xc7" + "\xfb\xed\x6f\xf8\xe3\xfd\xf3\x1f\xfa\xe3\xfd\xf3\xff\x97\xbd\xaf" + "\x8f\x8b\xaa\xca\xff\x3f\x73\x07\x0a\x13\x64\xb0\xc1\xd0\xd5\x9a" + "\xfa\x62\x8d\xa9\xa5\x9b\xba\xd8\xea\xaa\xa5\x02\xe5\xe3\xa6\x2e" + "\x3e\xa3\x41\x41\xf9\x80\x84\x86\x0a\x88\x8f\xe1\x33\x16\x18\x1a" + "\x0a\x16\xb6\x50\xa2\xb8\xab\x2d\x96\xd6\xd8\x6a\xa1\xf1\x64\xab" + "\x1b\x16\xae\x23\x8b\x86\x2e\xda\xa8\x28\x4f\x33\x73\x7f\x9f\x73" + "\xcf\x1d\xee\xdc\x99\x7b\x87\xb9\x77\x10\xe1\xf5\xf3\x8f\x79\x29" + "\x77\xee\x3d\x73\xee\xe7\xf3\x3e\x9f\xf3\x7e\x7f\xee\xb9\x9f\x53" + "\x2a\x94\xb7\xe1\xc7\xfa\xed\xee\x42\x71\x3e\x6a\x1c\xce\xdb\xec" + "\x48\x14\x8f\xf1\xdb\xfb\x49\x8f\xf1\x1f\x8e\x7d\x10\xe3\x6d\x62" + "\xbc\xca\x36\xc6\x7f\x98\xd4\xaa\x1c\x9f\x89\xf1\x69\xf1\xbc\x18" + "\xdf\x82\xb9\x1c\x67\xde\x27\x11\xe7\xf6\x69\x36\xeb\xdf\x77\xd8" + "\xac\x7f\x4f\xb3\x5a\xff\xbe\xc3\xa3\xe5\x62\x7c\x5a\xcb\xaf\x7f" + "\x77\x2a\xc6\xa7\x59\xad\x7f\xdf\x71\xb0\xf9\x18\xbf\x3d\x40\x38" + "\xc6\xc3\x71\x26\xc6\x6f\x0f\x70\xc8\xed\x79\x31\x7e\x67\xea\xbd" + "\xc8\xe5\xdc\x9f\xf7\x8d\x76\xa6\x48\xc9\xe7\x38\xaa\x3b\x22\x9a" + "\xcf\x09\xb0\xe4\x73\xa2\x44\xf2\x39\x2d\x15\xf3\x3f\xda\xcb\x8f" + "\xf9\x1f\xe5\xf0\x63\x7e\xc6\x79\x7e\xcc\xcf\x28\xe3\xe7\x73\xa2" + "\xed\xf2\x39\xfc\xf8\x9f\xde\x41\x37\xce\x3a\x9f\x93\x69\x95\xcf" + "\xc9\x58\x2f\x1e\xff\xd3\x45\xe3\xff\x5d\x26\xfe\x87\x0a\xc4\xff" + "\x5d\xff\x9f\xc4\xff\x50\x17\xe2\xff\xae\xfb\x10\xff\x77\xaf\x25" + "\x39\x1e\x27\xeb\xa4\x1c\x91\x9e\xe3\x71\x6d\x1e\xd8\x7d\x81\x3f" + "\x0f\x64\xa8\xf8\xf3\xc0\xee\x93\xdc\x3c\xc0\x7e\xd7\x22\xf3\xc0" + "\xee\xf2\xfb\x33\x0f\xec\x2e\xe7\xe6\x81\x8c\x23\xcd\xcf\x03\xe9" + "\x22\xf3\x40\x3a\x3b\x0f\xa4\x4b\x98\x07\x32\x73\xc4\x73\x3c\x51" + "\xf2\x73\x3c\x83\xef\xf7\x7b\x50\x99\xd9\x92\x72\x3c\xdb\x67\xe7" + "\x15\xe2\x1a\x29\x97\x10\xb5\x7c\x8e\x25\xc7\xa3\xb3\xc9\xf1\xe8" + "\xec\x72\x3c\x4b\x2f\xb1\xf1\x7f\x0c\xfb\xbe\xe9\x38\x17\x6a\xa4" + "\x30\x7b\x49\xef\xd9\xcb\x5f\x37\xbf\x87\x89\xff\x5c\xfd\xbe\xbd" + "\x03\x71\xbf\xc8\xfc\xa3\x73\x50\x03\x75\xcf\x1d\x5e\x4e\x67\x8c" + "\x50\x8d\x94\x2c\xde\xba\x1b\xfe\xfb\xa6\x1f\x6b\x78\xf1\x7e\x1c" + "\x79\xdf\xf4\x33\xa1\xe7\xb4\x4d\x35\xf9\x3f\xe9\xcf\xd4\xe4\x6f" + "\xaa\xe5\xf7\x71\x98\x53\xb5\xa4\x67\xb1\xb5\xa4\xff\x73\x1f\x6a" + "\x49\x3b\x5b\x93\xff\x3f\xb6\xf5\xfb\x3e\x29\x2a\x29\xd4\xa1\x62" + "\x8c\x91\x19\xb6\xb5\x4f\x75\xc2\xef\xee\x53\xec\xbb\xfb\x0b\xee" + "\x4d\x1d\x14\xdc\x1f\x66\xce\xef\x9c\x53\x9a\x9b\x60\x60\xfa\x83" + "\xf7\xed\x06\x3f\x4f\x2c\x04\xac\x9a\x71\x3c\x8d\xc6\xf1\x34\x6b" + "\x0d\x73\xee\x25\xc0\x42\xe7\x41\xa5\x18\xc7\x5b\xcc\xc8\x33\x6a" + "\x09\x8e\xad\x59\xcc\xba\x2f\xa0\x11\x10\x5b\xc9\x79\xf1\x97\x68" + "\x93\xa9\xf3\x9f\x4a\xa1\xff\x0f\xef\x5f\x50\xea\x5e\xac\xaf\x81" + "\x71\x71\x8d\xd9\xc7\xb5\xc4\x58\xab\xc3\xbe\xf8\x7a\x41\xa9\x1b" + "\x0d\xf1\x37\xe3\x0d\xe4\x21\x6d\x9c\x66\x31\xfb\xd4\x33\xef\xae" + "\x77\xce\x29\xc7\x75\x40\x2c\xdc\xca\xfc\x1b\x97\xdf\xda\x05\xf6" + "\x31\xd3\x64\xee\x9b\x1d\x49\xe2\x06\xfc\x9e\x11\x6c\xc9\xac\xb1" + "\xc5\x71\x83\xd9\xc3\x0a\xe2\xc6\xee\x5b\xdc\x73\x6c\xdc\x3e\xb6" + "\x11\xc9\xa3\xec\xe5\xd6\xbf\xe8\xc5\x62\xeb\xc7\x5a\xe1\xd8\xfa" + "\xb1\x96\xc4\xd6\x8f\xb5\x4d\xb1\x55\x2f\x90\x47\xe1\xad\x63\xdf" + "\xcb\xae\x7f\xd1\xd9\x70\x6c\x5d\x3b\xac\x8f\xb2\x57\xd2\xfa\x17" + "\x26\x9e\xce\x23\xf1\x14\xc7\x2b\x4b\x4c\xe5\xf2\x28\x3a\xd1\x3c" + "\x4a\x73\x31\x55\xd2\x3b\xfc\x4c\x4c\xfd\xb4\x9e\x1f\x53\x3f\x35" + "\xf1\x63\xea\x67\xf1\xb6\x31\xd5\x3e\x9e\xfe\x75\xa8\x50\x2c\x25" + "\xf5\x51\x3e\xeb\x23\x1e\x47\xff\x1a\x21\x16\x47\x99\xf5\xe9\xb3" + "\xac\xd6\xa7\x37\xc5\xd1\xec\xa5\xfc\x38\xfa\xd7\x7d\xce\xc6\x51" + "\x66\x6f\x93\xff\xb4\xc2\xde\x26\xb2\xe3\x68\x94\x4d\x1c\xcd\xf1" + "\xe5\xe2\xa8\xed\xfe\x26\xcd\xc4\xd1\xb7\xee\x4d\x0d\x14\x5e\x1c" + "\x35\x1b\x98\xfe\x68\x16\x30\x7d\xdd\xc1\x8f\xa3\x39\x85\xe2\x71" + "\x34\x27\x92\x8b\xa3\xe4\xbc\x7b\x1b\x47\x73\xd2\x78\x71\xf4\x2d" + "\xab\x38\xfa\x3f\x4e\x43\xe0\x35\x16\x4d\x71\x74\xbe\x55\x1c\x7d" + "\xab\xb9\x38\x9a\x93\x86\x6d\x44\x38\xea\x67\x33\x9b\x8f\xa3\x7f" + "\x8d\x12\x8e\xa3\x70\x9c\x89\xa3\x7f\x8d\xe2\xe2\xa8\x00\x47\xe5" + "\xc5\xd1\xcf\x47\x48\x88\xa3\x6d\xbc\x36\xca\xe7\xc3\x25\xe5\x2a" + "\xb8\x77\x3a\xed\x6b\xa4\xce\xb4\x7e\x27\x28\xdf\x66\xdf\x93\x7c" + "\xbb\x7d\x4f\x96\x5a\xde\xf1\x0c\x62\xe3\xea\x2b\x2e\xc4\x55\xe6" + "\x1d\xcf\x7d\x13\xf9\x6b\x4f\xf6\x4d\xb6\xac\x3d\x21\x71\xf5\xc0" + "\x55\x4b\xbf\xb8\x7d\x4f\xf2\x1d\xd4\x48\xdd\xb7\x97\x57\x1b\x25" + "\xc8\xba\x36\xca\x81\x1d\xe2\x35\x52\xf7\x15\xf2\x6a\xa3\x9c\xce" + "\x6e\xda\xf7\xc4\xb6\x46\x2a\x17\x63\x73\x2f\x30\x31\xb6\xa9\x06" + "\x55\xae\xaa\xa9\x46\x6a\x33\xef\x05\xe1\x76\xf6\x57\x44\xdc\xfb" + "\x18\xab\x93\x10\x63\x79\xfb\x9e\xd8\xd6\x98\xda\xbf\xb2\xa4\x20" + "\x1f\x15\x87\xe6\x0b\xd4\x46\xcd\xbf\xaf\x7b\x9f\xe0\x7e\x09\xc7" + "\xda\x03\xee\xfc\x58\x7b\x20\x80\x39\xf7\x82\x50\xac\xdd\x7f\x8e" + "\x8b\xb5\xe4\xbc\xf8\x0b\x36\xb1\xb6\x5c\x24\xd6\xc2\xbc\x9a\x71" + "\x45\x6a\xac\x3d\xe0\xc6\xc4\xda\x55\x6c\xac\xbd\xd6\xd2\xb1\xf6" + "\x80\x1b\x17\x6b\x0f\x9c\x6a\x7e\x8f\xa9\x7d\x67\x85\xdf\xcb\xd9" + "\x77\x96\xc4\xda\x7d\x67\x1d\xee\x31\xc5\x5b\xf3\x91\x77\xc4\xb2" + "\xc7\x14\x97\x0f\xc8\x67\xf3\x01\xed\x79\x4f\x94\xbc\x7c\xa9\xf9" + "\x80\x1f\x40\xbb\xe3\xf7\x2e\x97\xe3\x3d\xa7\x66\xe0\x3d\x51\xf2" + "\x6c\xf2\x01\x79\xf6\xf9\x80\xa9\x8e\x63\xac\xa4\x7c\x00\xf3\xde" + "\xe5\xc1\xc3\xfc\x18\x7b\xf0\x08\x3f\xc6\x1e\x9e\x68\x79\xcf\x12" + "\xf7\x47\xbc\x66\xea\xdf\xdc\x9b\xf2\x01\xe5\xfc\xd8\xca\xe5\x03" + "\x0e\x2b\xc4\x63\xec\xdf\xf8\xf9\xdf\x57\xb2\x79\xef\x59\x7e\x56" + "\x61\x5d\x87\xda\x52\x7f\xea\xef\x63\x4f\x9d\xb5\x8e\xb1\x7f\x8b" + "\x69\x4f\x75\xa8\x9b\x6a\x4d\x35\xb3\x96\xdb\xbe\x0e\xf5\xdf\xaf" + "\x96\x14\xe4\x21\xfc\x6e\x1b\x13\x6f\x79\xb9\x81\xbc\xfb\x93\x1b" + "\x28\xc8\x13\xc9\x0d\x1c\x9a\xcf\x8f\xb3\x87\x32\x99\x73\xcf\x0b" + "\xc5\xd9\x43\x43\xb9\x38\x4b\xce\x8b\x3f\x6f\x13\x67\xcb\x5a\x92" + "\xd3\x1e\x9a\x77\x6f\x73\x03\x87\xe6\x71\xb9\x81\xc3\x4e\xbc\xff" + "\xf8\xb7\x00\xe1\x38\xfb\x37\x36\xef\xfa\x37\x2e\xef\x5a\x26\xb0" + "\x5f\x0a\x2f\xce\x7e\xe1\x6b\x79\xff\x91\xe1\xb4\xe5\x16\x4e\x9b" + "\xd7\x0e\xf7\x4b\xf9\x42\x2d\x35\x37\x80\xdf\x73\xc7\xb1\x15\xc7" + "\x2e\x4b\x7c\xe5\x72\x03\x79\xe2\xb9\x81\x66\xe2\xab\xf4\xbd\xfb" + "\xfe\xe1\xcb\x8f\xaf\xff\xe8\xca\x8f\xaf\x5f\xee\xb5\x8d\xaf\xf6" + "\xb1\xf5\x1f\x53\x85\xe2\x2a\xc9\x0d\x7c\x39\x49\x3c\xa6\xfe\x63" + "\x8d\x58\x4c\x65\x6a\xfa\x55\x70\x6b\xa4\xb9\x98\x9a\xbf\x87\x1f" + "\x53\xff\x51\xe0\x6c\x4c\xbd\x2f\xfb\xa5\xc8\x8e\xa9\x11\x36\x31" + "\xf5\xc8\x50\x2e\xa6\xda\xee\x99\xd2\x4c\x4c\xbd\x57\x79\x02\xeb" + "\x98\xca\xe3\xae\x47\x8e\xf3\x63\xea\x91\x1a\xf1\x98\x7a\x64\x1b" + "\x17\x53\xc9\x79\xf7\x36\xa6\x1e\xd1\xdd\xdb\x3c\xc1\x11\x1d\xc7" + "\x5d\xbf\x5c\xdb\x7c\x4c\xfd\xc7\x26\xe1\x98\xfa\x8f\x4d\x24\xa6" + "\xfe\x63\x93\xf3\xef\x94\x7f\x15\x29\x21\xa6\xb6\xf1\xbd\x54\xbe" + "\x8a\x90\x9c\x27\xc0\xf9\x56\x1c\x4b\xcb\x5d\xab\x1d\x12\x6b\xa9" + "\x1d\x32\x92\x8d\xb1\xa3\x5d\x8d\xb1\x47\x97\xf2\xd7\x34\x1c\x8d" + "\xb7\xac\x69\x20\x31\x56\xd7\x83\xbf\x3f\xaa\x7d\xad\x10\x7e\x0d" + "\xd5\xa3\x45\x4d\x79\x02\x1c\x73\x47\x5a\xe7\x09\xbe\x29\x12\x8f" + "\xb7\x47\x6b\x78\x79\x82\xef\x84\xe3\xed\x5d\x5e\xbc\xfd\xda\x87" + "\x89\xb7\x4d\x35\x54\x8f\x05\x58\x6a\xa8\x36\xcb\x61\x79\xf1\x36" + "\xb4\x75\xe2\x6d\xbe\xf3\xf1\x96\xbf\x97\x8a\x6d\xbd\xd4\xaf\x0f" + "\x97\x9c\x80\x78\xcb\xd4\xeb\xb0\xad\x99\xea\x5c\xbd\x8e\x7b\x55" + "\x33\x15\xf7\x4b\x38\xee\x7e\x33\x98\x1f\x77\xbf\x99\xc7\x9c\x2b" + "\x18\x77\xbf\xe9\xc0\xc5\x5d\x72\x9e\xd3\x71\x57\x56\xce\xe0\x9b" + "\x80\x7b\x9b\x33\xf8\x26\x80\x8b\xbb\xdf\x98\x9a\x8f\xbb\x47\x8d" + "\xc2\x71\xf7\xa8\x91\xc4\xdd\xa3\x46\x87\x71\x97\xb7\x86\x40\x77" + "\x5d\xb0\x96\x47\x79\x7b\xdf\x67\x45\x57\x2d\x27\x67\x00\x31\x98" + "\x8a\xc3\x35\x9c\x42\xf1\x1a\x82\xe6\x73\x06\xcd\xc5\x5b\xe9\x39" + "\x83\xe3\x57\xf9\xf1\xf6\xf8\x75\x7e\xbc\x3d\xb9\x03\xf7\xcb\x61" + "\xce\x80\x89\x01\xdf\x0e\x6e\xca\x19\xe8\xf9\x71\x96\xcb\x19\x9c" + "\x0c\x16\x7f\xf6\xf5\x6d\x18\x8f\xdf\x8e\xb6\xa9\x59\x3d\x8b\x8b" + "\xb7\xa7\x8b\x2d\x6b\xc6\xfe\x99\x7a\x6a\x82\x75\xbc\xfd\x36\xdb" + "\xae\x66\xf5\xa4\x16\xac\x59\x3d\xa9\x85\x6b\x56\x4f\xe6\xd7\xac" + "\xde\x79\x97\x5b\x47\x26\xbd\x66\xf5\x89\xfe\x4c\x0c\xc6\x18\xc2" + "\x75\xab\x9d\xc9\x23\xdc\xe3\xbd\x56\x78\xb1\x97\x97\x47\x38\x71" + "\x98\x1f\x7b\x4f\x54\x89\xc7\xde\x13\x6b\xb9\xd8\x4b\xce\xbb\xb7" + "\x9c\xf7\xc4\xa1\x7b\x9b\x47\x38\x71\x88\xcb\x23\x9c\x5c\x2a\x18" + "\x7b\x79\xcf\xc6\xbe\x9d\x27\xfc\x6c\x0c\x8e\x33\xb1\xf7\xdb\x79" + "\xa2\x79\x04\xbb\xf5\x5b\xdf\xcd\x24\xcf\xc6\x58\xce\xab\x97\x90" + "\x47\x68\x73\x6b\x0c\xbe\x9b\x21\x27\x8f\x80\xe3\x2d\x8e\x67\x96" + "\x98\xeb\x4c\x1e\xa1\xe5\x39\xee\xf7\x33\xf9\x31\xf7\xfb\x39\xfc" + "\x98\xfb\x83\xc2\x36\xe6\xda\xc7\xdb\xef\xf7\x08\xc5\x5a\x92\x47" + "\x38\x9d\x27\x1e\x67\xbf\x2f\x14\x8d\xb3\x36\x6b\x73\xb9\x38\x5b" + "\x60\xe2\xc7\xd9\x02\x95\xac\x38\xeb\xec\x1e\x2c\x6d\x2a\xce\x86" + "\xda\xc4\xd9\x53\x3b\xb8\x38\x6b\xbb\x0f\x4b\x33\x71\xf6\x1e\xed" + "\xc3\x22\xce\x71\x4f\xf7\xe0\xc7\xd9\xd3\x13\xc4\xe3\xec\xa9\xeb" + "\x5c\x9c\x25\xe7\xdd\xdb\x38\x7b\xba\xfb\xbd\xcd\x2d\x9c\xee\xce" + "\x71\xdc\xd3\x97\x9a\x8f\xb3\xdf\x9f\x15\x8e\xb3\xdf\xb3\xcf\xc5" + "\xbe\x3f\x2b\xca\x71\xed\xe2\xec\x0f\x27\x25\xc4\xd9\x36\xbe\x06" + "\xe1\x07\x49\xf5\x2f\xac\xf2\xb5\x0f\x95\xe8\x6d\xde\x97\x38\x6f" + "\xfd\xbe\x84\x55\x6e\x61\xa4\x25\xb7\xc0\xdf\x9f\x25\xd6\x92\xbf" + "\x1d\xce\xc6\xdd\x97\x5c\x8d\xbb\x85\xe7\x6a\x9b\xe2\x6e\x34\xc4" + "\xdd\x42\xe6\xfd\x88\xda\xa6\xb8\x5b\xba\xd9\xd2\x2f\x6e\x7f\x16" + "\x91\xdc\xc2\x8b\xb8\xbd\xa2\x5e\x4d\xb9\x05\x1c\x87\x87\x5b\xe7" + "\x16\x4a\x87\x8a\xc7\xe0\xa2\x09\xbc\xdc\xc2\xb7\xc2\x31\xb8\x86" + "\x17\x83\x8b\x57\x32\x31\xf8\x45\x4b\x0c\x2e\x4a\xb9\x0b\xda\xf2" + "\xee\x3a\x69\x31\xb8\x86\x89\xc1\x41\xf7\x27\x06\x1f\x6a\x81\x18" + "\xcc\xd8\xbd\xa4\x67\x89\x0e\x62\xf0\x0c\x1c\x83\x83\x9c\xcb\x37" + "\xb4\xd2\x1e\x2d\xb8\x5f\xc2\xb1\xb8\x24\x87\x1f\x8b\x4b\xca\x99" + "\x73\x05\x63\x71\xc9\x52\x2e\x16\x93\xf3\xee\x6d\xbe\xa1\x24\xfb" + "\xde\xe6\x1b\x4a\xb2\xb9\x58\x5c\x3a\xbf\xf9\x58\x5c\x14\x22\x1c" + "\x8b\xe1\x38\x13\x8b\x8b\x42\x1c\xc6\xe2\x17\xad\x63\xf1\x99\x26" + "\xce\xcb\xcb\x37\xe8\xdb\xfb\xde\x2d\x67\x44\xf9\xaf\xe6\x71\x94" + "\x58\xa1\x38\x73\xb8\x24\x1d\xa1\xdb\xab\x50\x62\x89\xf1\x45\x04" + "\xc7\xc0\x7e\x67\x2e\x94\xf8\x05\x20\xf3\xfb\xc1\x05\x38\x1e\x7f" + "\x80\x3f\xc0\x71\x93\x29\x76\x6c\x31\x36\x3e\xc3\xac\x77\xc5\xc7" + "\x71\xec\xcd\xb0\xfa\x5e\xe8\xb7\xe8\xe4\xe0\x20\x72\xdd\x8f\x01" + "\xe4\xbd\x9b\xe0\x31\x96\xbf\x31\x36\xf5\x8a\x1f\x87\xd0\xdb\x82" + "\x47\x1a\x7c\x82\x47\x0a\x5d\xff\x94\x0a\x79\x74\x5a\x49\xd3\xbb" + "\xb7\xd3\x35\xb7\x9f\x0e\xc8\xbc\xbd\x01\xa1\xe4\xed\xb4\xa1\x76" + "\xdd\x8f\x31\x70\x8f\xe9\x1f\xc2\x79\xb7\x3b\x1f\xcd\xbc\xbd\x6a" + "\x02\x82\x63\x49\x96\x63\x60\x37\x64\x5e\xa5\xa4\xcd\xf0\x1d\xbd" + "\xdd\x73\x53\x46\x02\xc4\xaa\x38\x84\x9e\xbb\x8b\xc7\xcc\x8f\x69" + "\x80\x19\xf5\x16\x68\x73\x2b\xb4\x45\x3f\xf6\xbb\x1a\xc0\xa3\x5b" + "\xf1\x1a\x84\xc7\x74\x12\xdc\x57\xe6\x16\x6c\x7b\xe5\xb3\x69\x34" + "\xe5\x86\xcc\x7b\xff\x50\x47\xfb\x86\xe6\x81\x3f\x50\x72\x34\x62" + "\xde\x15\xdd\x0a\xe7\xd1\xd4\x0a\xda\xdc\x73\x10\xd8\xaf\x86\x8c" + "\x69\xe8\xdf\xd7\xa0\x63\x69\xf8\xdd\xdd\xd1\x48\x05\x1f\x4f\x3a" + "\x35\x34\xaf\x76\xdd\xbf\x34\x70\x9f\x1e\xb8\x5f\x62\xf7\xb8\x75" + "\x27\xcc\x3b\xbf\xf3\xc3\x73\x07\xf3\xfb\xf8\xb7\x99\xdf\xa1\xcc" + "\x49\x26\x38\x4e\xaf\x5a\x41\x97\xc4\x1a\x91\x37\xd8\x22\x03\xfa" + "\x8d\xf1\x68\xfe\x34\x20\x73\x75\x37\x84\xf6\x2f\xab\xa2\x4a\xa0" + "\xef\xa6\x0f\x7f\x57\xa3\x4b\xf8\x3d\x82\xef\x0d\x58\xb3\x5c\x51" + "\x9c\xed\x31\xfe\x2a\x42\x38\x9e\xc0\xff\x7b\xd5\xc0\x3c\x36\x16" + "\xfe\xde\x0a\xf7\x61\xbe\xed\xe7\x86\xcf\xbd\xa2\xf8\xd7\x39\xdd" + "\x92\x9f\x91\x77\x14\xf2\xd8\x02\xf7\x46\xce\xfd\x57\x16\x3e\x57" + "\xaf\x38\xab\xc5\x7d\x80\xbf\xf3\xe1\x6f\x7c\x1d\x5e\x43\x86\xe8" + "\xac\x3f\xd4\x31\xd8\x4c\x09\xcd\x33\xf7\xfc\x43\x1d\x13\xfb\xe0" + "\x3e\xb7\xc2\x3d\xc3\x39\x9e\x70\x8e\x27\xf3\x6f\x02\x52\xa5\xc0" + "\x31\xdc\x0e\xfc\xeb\xa9\x5b\xd0\x80\xdb\x4e\xc1\x6d\x8b\xd8\xc1" + "\x8d\x56\x87\x82\x36\x71\x63\xe6\x54\x4d\x82\xe2\x4c\x85\xe2\x6c" + "\x81\xb7\x82\xa6\xe9\xac\x41\x89\xab\x13\x90\x67\xb2\x19\x21\x5d" + "\x37\xdc\xce\xd9\x3d\xd0\xbe\x1b\xb6\x45\xed\xba\xb3\x89\x7a\xc5" + "\xbf\xfa\x60\xfb\x82\x3f\x6b\x34\x4f\x31\xf7\x5b\x86\x7f\x07\x5f" + "\xc3\x9e\xcf\xd4\xbe\xc7\x7d\xd6\x24\x28\x69\xf8\xfb\xb8\x52\x71" + "\x09\x29\xfd\x3c\xd7\xc1\xf5\x3a\x3d\x7a\xdf\x1f\x5f\xaf\x27\xd7" + "\x01\x96\xce\x9e\x05\x9f\x05\xe1\x63\xf8\x6f\x91\xfe\x7a\x5a\xfc" + "\x56\xe4\x07\xd8\xb0\xf5\x9d\x05\x23\x80\x0b\x0b\x46\x70\x7f\x0f" + "\x24\xe8\x29\x66\x1e\x56\x9c\x63\x74\xdd\x16\xf0\xa1\xe9\x23\x3f" + "\xb7\xad\x60\x5b\x73\x23\xf6\x4b\x05\x7c\xf7\xef\xae\xd8\x2f\x5b" + "\x97\x81\x4f\xc8\xb9\x43\xb8\xfe\xe3\xbf\xff\xcd\xf8\xd3\x0c\xbe" + "\x20\xef\x6e\x9e\xbb\x8e\xef\x67\xeb\x5d\xf0\x63\x17\xba\xe6\x44" + "\x2c\xf4\x0b\xe3\x16\x30\xb2\x3f\xba\x8e\xc2\xeb\xfa\xf0\xf1\xaf" + "\x6f\xd5\x51\x5b\xaf\x21\xcc\x2b\xd1\x66\x88\xcb\xbb\x96\x80\xcd" + "\xa1\x4d\xda\x7f\x50\xe2\xf3\x16\x3f\x2e\x03\xdf\x2d\x01\xec\x82" + "\xcd\xb7\x82\xfd\x76\x43\xcc\xc3\xff\xdf\x0d\xf3\x8f\x19\xce\xd3" + "\x2b\xfe\xad\x85\xf6\x54\xbb\xba\xd0\x86\x8c\x2e\x74\x35\xd8\x70" + "\x67\xed\xba\x7f\xbb\x59\x6c\x88\xfb\xb4\x15\x8e\x6f\x86\xef\xf5" + "\x8a\x73\x89\x04\x43\xe7\x26\x58\xee\x59\xcc\x9e\x9b\xf6\xa3\x80" + "\xcd\xfb\x51\xf7\x0d\xfb\xd1\x90\xe5\x95\x30\x2e\x57\x0d\xa3\x7f" + "\x98\x61\x84\x39\xf1\x93\xaa\x86\x2e\xc1\x99\xf8\xd9\x93\x79\xf5" + "\xef\x32\xd7\xee\x47\x7d\xf0\xbb\xb1\xe3\xab\x11\xc2\x73\xf8\x78" + "\xf7\x8b\x74\x49\xd4\x1d\x64\xf6\xf9\xa4\xca\xb4\xfa\xd9\xce\xe3" + "\xee\x20\x74\x52\x5b\x83\x12\x62\x60\x2e\xbf\x55\x85\x12\x6a\x68" + "\x43\x71\xe2\x55\x04\xb1\x67\x08\xb1\xdd\x4f\x27\xc6\x87\x23\x84" + "\xdf\x19\x34\xff\x4f\x8b\xbc\x22\x90\x5b\xdc\x79\xe4\xb7\xa2\x92" + "\xae\x32\x6d\x9f\x92\x9c\x10\x8f\xa8\xfd\xb7\xca\x08\xf7\x54\xfc" + "\x94\x7a\x0c\xbf\x9f\x5a\x1b\x82\x66\x1b\xd9\xf9\x28\x25\x34\x7f" + "\x45\x24\xea\x8a\xef\xc7\x9b\xe1\x5e\x3f\xf5\x07\xbb\xe5\x4b\x8b" + "\xcf\xff\x36\x32\xfe\xdc\x1e\xa2\xd9\x3f\xb7\x0e\x78\xab\x57\xde" + "\x8a\x70\xba\x0a\xf3\x3a\x98\x5f\x18\x2e\x58\x52\x65\x04\x6e\x15" + "\x06\xf3\xb7\x1e\x7d\x53\x91\x49\x99\x53\xbd\xf2\xa4\xfd\xc6\x4f" + "\xa1\xcc\xbc\x8d\xe7\x52\xe8\xfb\x64\x2d\x4a\x64\xfa\x0f\x73\xa6" + "\x77\x0c\xe6\x53\xf4\x45\xdc\xff\xaf\xe1\x5e\xe9\x27\x63\x60\x9c" + "\xfe\xbb\x12\xcf\x9f\xe3\xcb\x75\xa8\xb0\xce\x84\x76\x5e\x63\x6c" + "\xf4\x10\xd8\xc8\x0d\xbe\xcb\x07\x3b\x79\x08\xf9\x0d\xfb\xcc\x9c" + "\xfc\x49\x95\x59\x49\x7c\xc3\xf8\xa5\x86\xf8\x65\xdc\x22\x04\xf3" + "\x28\xf8\x66\x1b\xf1\x8d\xd9\x77\x76\x26\xf6\x8d\xb4\xfb\x28\xd3" + "\x8a\xcd\x2f\xf8\xb7\x69\xc0\x07\xc6\x85\x59\x3d\x3b\x13\xff\x36" + "\xee\x03\x7e\x7e\x86\x71\x30\x7e\xed\x45\xba\x38\xaa\x0a\x95\xc0" + "\xfd\xd0\x3e\xd6\x7d\x30\x4a\xed\xc3\x3e\xb1\x3e\x6c\x7a\x0e\x70" + "\xfb\x1c\xe0\xf6\x39\xc0\xad\x9e\xe0\xf6\x74\x39\xc1\xad\x09\xfa" + "\x55\x0f\xdc\x7d\xf9\x64\x44\xe1\x7e\xed\xfb\x19\xd7\xe8\x83\x7e" + "\x56\x71\xd8\x1d\x0b\xca\xba\x09\xbf\xca\x67\x3b\x63\xfb\x14\xd7" + "\x94\xa1\x15\x18\xbf\x0d\x42\xf8\xfd\x79\xcd\x78\x88\x1c\xc6\x37" + "\x01\xbf\xbf\x6a\x91\x67\x25\x72\x8b\x9f\x0c\xf8\xad\x12\xc2\xef" + "\xcf\x93\x8f\xc2\x6f\xda\xe1\x37\xdc\x1a\xbf\xe7\x6f\x4a\xc7\xef" + "\xf9\xa3\x4d\xf8\x9d\xc6\xe2\x37\xd2\x06\xbf\x95\x56\xf8\xc5\xf7" + "\x2d\x19\xbf\x3f\x6b\xa4\xe1\xf7\x7c\x56\x13\x7e\x41\x97\xec\x7c" + "\x83\xb1\xd1\x43\x60\x23\xc0\xef\xf9\x58\xb0\x93\x20\x7e\x5b\xdf" + "\x7f\xe5\x23\x9d\xf7\x5f\xb9\x6f\xf3\xfe\xfb\xe5\xa0\x74\xff\xfd" + "\x12\x77\xef\xfd\xf7\x8b\x5e\x9a\xff\x7e\x09\x13\xf7\xdf\x2f\x01" + "\x6d\xc7\x7f\xff\x71\x73\xde\x7f\x17\xce\x35\xef\xbf\x0b\x8b\xa4" + "\xfb\xef\xc2\x90\x7b\xef\xbf\x0b\x99\xd2\xfc\x77\xc1\x5f\xdc\x7f" + "\xe5\x75\x62\xfe\x7b\xb9\xab\x99\x36\xe3\x75\x73\x5d\x46\x23\xcc" + "\x81\x08\x5f\xfb\xcf\x19\xac\x19\xe1\x6f\x37\xcb\xdf\x0c\xa7\x02" + "\x5d\x6d\xf3\xb7\xa7\xcd\xdf\x2a\x9b\xbf\xd5\x36\x7f\xfb\xd9\xfc" + "\xdd\xdd\xf2\x37\xf8\xcb\xfd\x86\xe2\x3f\x23\x40\xb3\x01\xc7\xf9" + "\x4f\x39\xfb\xbd\xff\x6c\x93\x06\xeb\x3e\x7f\xa1\xbe\x6f\x5d\x45" + "\xd7\x79\x29\x10\xdd\x48\xd1\x28\x2a\x01\xfd\xee\x9a\xe2\xe2\x84" + "\x86\x55\x20\x09\x95\xdd\xb4\x74\x43\x22\x02\xbf\x54\x8e\x03\xb5" + "\x5e\x62\x00\x9d\xb8\xc2\xef\x21\x68\xfb\x31\xb0\x9b\xa1\x38\xca" + "\x00\xbc\xfc\x1b\xba\x42\x71\x71\x28\xbe\xcf\xe7\xa2\x74\xc8\xac" + "\x7c\x56\x4b\x33\xb5\x9b\xbd\x2a\x0d\xca\x67\xbb\x81\x2e\xcd\xdc" + "\xbc\xca\xec\x51\x52\x7d\x16\x6d\xa1\xcc\x9a\xb8\x38\xe0\xf5\xd5" + "\x87\xd0\xf2\x6a\xba\x2a\xce\x48\xd7\x95\xcc\xd0\xe1\xe7\xb6\x55" + "\x25\xb1\x05\xa8\xd8\x70\x16\xe1\x39\x0f\x63\xb5\xc4\x70\x88\x3c" + "\x27\xc6\xe7\xc0\xb1\x62\xc3\x3e\x54\x04\x7f\xeb\x16\x5c\x86\xfb" + "\xbc\x78\xbd\xa4\x7a\x1f\x32\xa5\x78\xe9\xcd\x6a\xaf\x13\xb4\xda" + "\xab\xa0\xa8\x1a\xfa\x96\xe2\x55\x88\xfb\x5a\x0c\xfd\x60\xf6\xe8" + "\x4c\xf5\x2a\x64\xda\xad\x29\x65\x72\x08\xa6\x54\x38\xdf\x17\xce" + "\xf7\xf5\x2a\xc0\xfd\xc3\x7d\x13\xd4\x7b\x29\xa3\x07\x40\xdf\x5f" + "\x9c\xac\x75\x43\xf4\x4a\x37\x3f\x69\x78\xd3\xab\x44\x75\x64\xca" + "\xe8\x43\xa4\x5d\x0f\x39\xed\x8a\xae\x7f\xa2\x53\x02\xd9\xfe\xaa" + "\xe4\xb4\xab\x73\xd0\x2e\xdb\x5f\x8d\x8c\x76\x2f\xf9\x89\xb7\x1b" + "\xc4\xf6\x77\xb8\x9c\x76\xa3\x1c\xb4\xcb\xf6\x37\x51\x4e\xbb\x05" + "\x0e\xfc\x36\x40\x1e\x16\x2a\xba\x3b\xc2\x82\x3c\x1c\x54\x38\xb8" + "\xff\xc0\x01\xf2\x30\x50\x21\x9a\xff\xc6\x18\x90\xe7\xff\xff\x3a" + "\xf4\xbf\x3c\xdf\xff\x57\x74\xff\x47\xec\x7b\x79\x7e\xff\xaf\x28" + "\xfe\xb1\x36\xa6\x53\x46\x95\xd2\x5d\x62\x90\x79\xbb\x6f\xa9\xb9" + "\xcb\xa8\x1f\x57\x9b\x87\xa3\x97\xe3\x61\xce\x4b\x43\x3e\x2f\xef" + "\xba\x48\x0f\x67\x72\x4e\x95\x21\xf1\xe9\x88\x4a\xa6\xcc\x54\xee" + "\xb2\x32\xaa\xc4\x18\x80\xe3\x96\x29\x6b\x49\x9d\xe2\xff\xe0\xf8" + "\x71\x18\xb9\x35\xef\x68\x11\x69\xcb\xb7\x74\x4b\xc2\x70\x34\xde" + "\x84\x70\x8e\xa3\x66\xdc\xa2\x8b\xf4\x3f\x81\xc5\x8c\xbf\x09\xf1" + "\x35\xad\x0e\xcf\xa5\x3e\x70\xad\x11\x70\x0c\xed\xd4\xa1\x03\x66" + "\x83\x62\x9c\x81\x39\xd7\x00\x7a\xd4\x40\x6f\x1f\xf5\x23\x9e\x93" + "\xe9\x15\x5a\xb4\x06\xfe\x86\xdf\x3e\xa5\x34\x20\x6a\x37\x68\xd5" + "\xda\x75\x95\x27\xf4\x8a\xcb\x99\x58\xbf\x82\x4e\xae\x5e\x71\x13" + "\xe7\xf3\x63\xd0\x7e\xb3\x81\x5a\x0d\xba\x19\x9f\xff\x5c\x14\xa2" + "\xfe\x69\xc0\xb9\x81\x4a\xc3\xf1\x18\x84\x1c\xe4\x73\xdc\xcc\xea" + "\x59\x6a\x7c\x3d\x6e\x07\xe7\x49\xb7\x9a\xc1\xce\xea\xd0\x7c\xdc" + "\x6f\x3a\x25\x38\x49\xb7\x0c\xcf\x39\x97\x63\x47\xf5\xa2\x6b\xf1" + "\x1c\x02\x73\x47\xb7\x6b\xf0\x37\x93\x0f\x58\x45\x97\xd2\x6a\xcf" + "\x7c\x7a\x8b\xd7\xf0\xe2\x9a\x5b\x48\xb7\xa4\x01\x55\x28\x2e\x2f" + "\xc5\xbf\x7d\x5b\x3d\x4b\x55\xa3\x9e\xe5\x57\xbb\xee\x72\x8c\xa5" + "\xbf\xf8\xb7\x2c\xc7\x71\xfe\x83\xf4\xf1\x72\xca\xf1\x38\xf1\x3e" + "\xd2\xab\xbb\x75\x1e\xef\x47\x1b\xb0\x2d\x75\x09\xb7\xa0\x2f\xbf" + "\x76\xc0\xf6\xa6\x53\x66\xea\x6b\x56\x68\x1f\x27\xf9\xc0\x2b\xfd" + "\x70\x5e\x09\xe6\x86\xb3\x24\xc7\xe3\x75\x96\x59\xc3\x03\xb1\x9f" + "\xce\x1a\x94\x86\xb9\xd0\x0d\xc5\x65\x26\x1f\x38\x59\x4b\x49\xd4" + "\x53\x97\x19\xfd\xab\x7b\x1c\xdb\xe1\xca\x4d\xf8\xbd\x3f\x56\x28" + "\xae\x4c\x22\x39\x0e\xaf\x2a\xfc\x7b\x70\x8e\x1e\x7e\xb3\x8a\x4e" + "\xf1\xcc\xc3\xe7\xc1\xf7\x31\xec\xf7\x06\xab\xef\x0d\x74\xca\x2c" + "\x2d\xfb\x7d\x0a\xfb\x7d\x8d\xd5\xf7\x35\x51\x8f\xe3\x9c\xdf\x95" + "\xa3\xf8\x9e\x60\xbe\x2b\x85\xef\x2b\xf1\xf3\x04\xe6\x9e\x7c\xbd" + "\x4a\xd9\xf3\x2a\xab\x15\x57\xce\xdd\x06\x7c\xc1\xf7\xd5\x56\xd7" + "\x57\xff\x33\xb6\x1f\x7a\x79\x17\xb6\xe9\x95\x2a\xbd\x9b\xfa\x28" + "\xc9\x13\x5d\xae\x64\x6c\x01\xf3\xa7\x75\x7b\x7a\xc5\x95\x43\x78" + "\x8e\xac\x01\x1e\x09\xe7\x14\xe2\xdf\xb4\xb6\x7f\x78\x74\xf4\xc2" + "\x68\x4d\xcf\x30\x4d\xd8\xfc\x39\x9a\xd7\x17\x2e\x5e\x10\x33\xb4" + "\x67\xd8\x23\x08\x59\x61\x47\x45\xaf\xf2\xa6\xcd\x29\x53\x43\x4a" + "\xd2\x80\xbf\x51\x2a\x98\xcb\x1b\x50\x0a\xf8\xd5\xb8\x3d\xb2\x9f" + "\xa9\x4b\x84\xce\xb4\xfd\x95\x7e\x2b\xee\x20\x2a\xc1\x8f\xbe\xa4" + "\x5b\xf6\x12\xf8\xe0\xd7\x95\x98\x43\x94\x80\x5a\xda\x04\x58\xd5" + "\x2d\xfb\x16\x1f\xdb\xc1\x3c\x6f\x08\x25\xc7\xfe\x9e\x50\x40\x7d" + "\x93\x50\x46\x15\x86\xde\x42\xff\xf4\x33\xa0\x13\x9a\x5b\x28\x1d" + "\x1f\x37\x97\x32\xcf\x7d\xe0\xfc\xab\xf8\xb7\x70\xee\x0c\xff\x9f" + "\xe4\x01\x7f\x9d\x8f\x7f\x47\xd3\x0d\x3f\x8f\xf8\x75\x11\xfe\x3d" + "\xbd\xe2\xd7\x28\x65\x3a\x52\xc0\x38\xf2\xbc\xa1\xa8\xea\x6b\x4e" + "\x9d\x1a\xc2\x8c\xf5\x75\xbf\x6a\x8c\x94\xcf\x1b\xbb\xdf\x47\x1e" + "\x19\xef\x23\x94\xde\x19\xb9\xd5\xae\xab\xf2\xd3\xbb\xf5\x8e\xc3" + "\xf6\x82\xa6\x3d\x6f\x53\x68\x18\x1c\xeb\xa3\x47\xdb\x18\x1b\xc2" + "\x98\xaa\x11\x8b\x1d\xf8\x39\x5c\x5d\xd6\x40\x9d\x59\x3d\x35\x88" + "\x06\x5b\xd4\xf9\x0f\x34\x78\x47\x01\x5e\x60\xdc\xd0\xbe\x53\x83" + "\xaa\x15\xd7\xb4\xdf\xe5\x23\x94\x80\xc7\x29\xd8\xe3\xf3\xbb\x75" + "\xf8\xf9\x5b\xbf\x7d\x77\x0d\xf0\x77\x84\x2e\x67\x49\x1d\x75\x7a" + "\x64\x3e\xd2\xfc\x19\x73\xac\xaa\x3d\xaf\x86\xd1\xc6\x67\x27\x00" + "\x2f\xad\xfc\x1b\xfa\xa1\xbc\x00\x79\xce\x40\xca\xa6\xda\xf0\x31" + "\x88\x1a\xaf\x87\xbf\x17\x23\xaa\xb8\xce\xc4\x3c\x07\x48\x18\x81" + "\xf3\xf9\x45\x08\xe7\xf8\x69\xea\x83\xb0\xdc\x5b\x75\x10\x9f\xaa" + "\xdc\xf1\xbb\xe4\x66\x55\x4e\x3e\xbe\x66\x76\x0d\xfb\x6c\xec\x36" + "\xfb\x6c\xec\x36\xf3\x6c\xac\x12\x3f\x17\xc3\xcf\xc3\xe2\x42\x69" + "\xb3\xe9\x1d\x6d\xe7\xf1\xa1\x4a\x1a\xb7\x89\x9f\x95\x79\x81\xa6" + "\xa0\xdf\xd1\x76\xda\x11\x8d\xd4\xc5\x86\x2a\x54\x52\x55\x80\x3e" + "\x5a\x82\xd4\xf4\xed\x88\x0e\x85\x27\x4e\x23\xfa\xfd\xbd\x79\x07" + "\x12\x74\xee\x26\x9c\x4f\xb9\xed\xf7\x88\xf7\x4a\x05\x7e\x2e\xd0" + "\x69\x53\x34\xea\x93\x71\x0b\xf5\x9b\x7d\x39\x91\xa9\x13\x85\xf7" + "\xf4\x33\xde\xd6\x6a\x1a\x6f\x6b\x9f\x6a\x78\x47\xfb\xb8\xb7\x81" + "\x3c\x4b\x9b\x19\xa9\x42\xf8\x79\x19\xbd\xae\x2c\x2a\x03\xe7\xb4" + "\x6b\x0c\xc8\xe8\x93\x93\x8f\xf1\x09\xbf\xdb\x1d\x3f\x7f\x59\xb1" + "\x14\xa9\xcc\xff\xd5\xa2\xa2\xea\x5b\xe8\x79\xc0\x0d\x7e\xd6\xb0" + "\xbb\x82\x3c\x6b\x30\x6d\xfb\xa4\x0a\x3f\x6f\xa8\x7d\x47\x4b\x8d" + "\xbd\x0e\x73\xd7\xba\xaa\x91\x0d\x3d\x07\xea\x4e\x6a\x2f\xe0\xf9" + "\x61\x00\x37\xee\xaf\xde\x91\x37\xee\xaf\xd6\xe0\xeb\xf0\xf3\x37" + "\x1a\xf0\xbc\xef\x16\xf6\x1b\xf8\xef\x96\x81\x7a\xa5\x92\x36\x16" + "\x55\x7e\x06\xfe\x29\xe3\xf9\x87\xf1\x67\x74\x1d\x75\x25\x0c\xfc" + "\x72\x99\xf8\xaa\xb0\x06\xfc\x74\x1c\xb7\x31\x6b\x42\x2e\xf8\x1a" + "\xf4\x14\x55\x58\x77\x81\xa9\x73\x81\xfd\xb5\xaf\xa1\xc0\xbd\x41" + "\x3d\xaa\x14\x3f\xc7\xac\xf5\x1f\xa8\xaf\x4f\x99\xaa\x6d\x54\x4f" + "\x0d\x70\xf0\x4c\xb3\x12\xfb\x2b\x3e\x12\x79\x14\x56\x9e\x43\x8c" + "\xcf\x16\xb1\x3e\xc3\x6b\xdf\xde\xd5\x76\x32\xd6\x6a\x3b\xef\x00" + "\x5f\x15\xc7\xe8\xd1\xce\x5b\x48\x5d\x52\x55\x86\x9f\xf7\x74\x78" + "\x65\x22\x42\xaf\xe4\xd0\xe6\xa2\x13\x3f\x33\xfe\xdb\x0f\xfe\x33" + "\x82\xff\xf0\x73\xce\x26\xff\x2d\x01\xff\xdd\x05\xff\x5d\xe7\xfc" + "\x67\xaa\x05\xff\xd5\x82\xff\xde\x05\xff\xd5\xd8\xf9\xaf\x06\x3f" + "\x0b\xc5\xcf\x9c\xb0\xff\xf0\x7a\x6b\xf3\xbb\xda\xee\xcc\x33\xd0" + "\xd7\xb5\x28\x63\x2e\xf2\xe8\x5b\x87\x14\x2b\x8e\x23\x15\xf4\x53" + "\xf5\x0c\xd8\x17\xda\x03\x7c\x57\xa0\x92\x7c\x13\x5a\x3e\x15\x3d" + "\x8e\xfd\x69\x64\xfd\x59\x62\x3c\x8c\xee\xd6\x6a\x29\x68\x33\x60" + "\xc7\x5d\x34\x64\xcc\x65\x0d\x3a\x39\xa9\x08\x81\x3f\xf4\xe6\xd4" + "\x99\x7a\xf9\xe3\xf0\x7a\x9e\xf3\xe3\xb0\xba\xd7\x83\x71\x28\x77" + "\x1c\xfe\xaf\x50\x78\x1c\x5e\x8f\x97\x37\x0e\xaf\xc7\x3d\x18\x87" + "\x6d\x69\x1c\x5e\x8f\xb0\x1d\x87\x4d\x5c\x21\x3a\x7c\xfe\x9c\xc8" + "\x05\x91\x0b\xde\xd4\xcc\x5d\x1a\x13\xfe\x0e\x61\x0c\x3c\xce\xa0" + "\x35\x99\x87\x53\x1f\xc0\x7c\xfa\x83\x5f\x19\x3a\xd0\xad\x8c\x32" + "\x4f\xf7\x73\xa3\x93\x8f\x22\x73\xf2\xd1\xc4\x0f\x80\xff\xe2\xf1" + "\x9a\x02\xbc\xf6\x8a\xa2\x3e\xfd\x7b\x50\x56\xba\xe8\x6b\x08\xff" + "\x9f\x3c\x93\x8d\x8f\xc2\xef\x2d\xa6\x6d\xa7\xab\xf0\x7b\x8b\xa7" + "\x47\xe2\xb9\xdf\xe0\xd5\x31\x04\xe6\xf5\xe9\x7e\xa8\x7e\x7a\x08" + "\xb5\xe1\x67\xe4\xe1\x5d\x86\xc6\x98\xcd\x34\xad\x4b\xb8\x06\x5c" + "\xeb\x6e\xa5\x6e\xda\x35\xa4\x59\xe6\x01\xe7\xde\x19\xa5\x59\xb6" + "\x12\xff\xdb\x4b\xb3\x6c\xdd\xc5\x2b\x8a\x9a\xab\x4c\xee\xa4\x0b" + "\x5d\x45\x6f\x0f\xc9\x34\x7d\x1a\xa0\xc2\xcf\x2b\x33\xba\xd0\x95" + "\xfb\x81\xe3\xef\x6f\xa8\xa3\x56\xdf\x02\x7c\xac\x7a\x82\xc6\xcf" + "\x1d\xf1\x73\xcd\xd5\xd1\x60\x63\xe0\x9a\x84\x0f\xd6\x04\xe3\xf1" + "\xb2\x69\x3b\x5d\xf9\xf5\x95\x32\x0a\x3f\x77\xc5\x63\xa8\x46\xed" + "\x99\xb7\x06\xee\x05\xfa\xa9\xdf\xd9\x85\x2e\x37\xf8\x4e\x0d\x71" + "\xd3\x20\xaa\x76\x9d\x21\x11\x78\x49\x00\xe6\x14\x49\xf0\xdd\x06" + "\xf8\x8e\x3c\x03\xac\x71\xa3\x1f\xfa\x6d\x0c\x8e\x5b\x80\x5f\xc5" + "\x0d\x85\xa1\xa8\x1e\xee\x73\x13\xd1\x03\x55\x75\xa9\x53\x03\x8c" + "\x7b\x07\xea\x8d\x98\xc7\xf5\x1c\x68\x68\xf0\x9d\xaa\x35\xa6\x4e" + "\x0d\x9a\xdc\x8b\x79\xd6\x0d\xe7\xdf\x5a\x8f\xef\xa3\x51\xfd\x4a" + "\x3f\x38\xbf\xe6\xb6\x3a\xb2\xdf\xed\x94\x08\xdd\xe9\xd8\x3c\x36" + "\x9e\x19\xea\x5f\x49\x63\xe3\x59\x1a\x8c\x97\x10\x88\x67\x21\xf6" + "\xf1\x8c\xac\x0d\x30\x21\x12\xd7\x8a\x10\xb4\x55\x89\xc7\x0b\xe6" + "\x86\xb9\x60\x0b\x3c\x16\x30\xe6\x99\xf8\x06\xb1\xcd\x32\x2e\xf0" + "\x98\xc1\x31\x8c\x19\xa3\x36\x63\x04\x8f\x8b\x8e\x06\xa4\xc2\xe3" + "\x02\xc7\x38\x3c\x2e\xf0\x9a\x9b\x0f\xee\x92\x71\xe1\x5d\x8e\x54" + "\xcc\xd8\x30\x16\x30\x63\x03\xeb\x82\x42\xa3\x4d\x5c\xb3\x1a\x17" + "\x9b\x2d\xe3\xc2\x12\xd7\x00\xfb\x46\x3c\x2e\xde\xe5\x8f\x8b\xe9" + "\x17\x54\x88\x89\x79\xeb\x7e\xaa\x49\x87\x71\x81\xf3\x58\x26\x4b" + "\x5c\x83\x71\x81\xdf\x09\x62\xe2\xda\xdb\x6c\x5c\x33\xc0\x71\x18" + "\x0f\xbb\xdf\xe2\xc7\xb5\xfa\xda\xe6\xf8\xc5\xad\xc9\xf2\xe2\xda" + "\x2d\x46\x43\x60\x5f\x61\xbf\x61\x7f\x61\x1f\xb5\x27\xff\xe0\xb8" + "\x65\x52\x89\xc4\x2d\x01\xff\x00\x9e\xab\xe1\xff\x76\x3e\xa2\xd7" + "\xfd\x7b\x88\x75\xec\xc2\x31\x0b\xc7\x2f\x1c\xb7\x70\x0c\xc3\xe3" + "\x00\xc7\x2e\x26\x6e\x41\x4c\x87\xbf\xab\x8a\x22\x2a\x98\x98\xb6" + "\xe2\x32\x52\xad\x18\x85\x1e\xc7\x31\xac\xc4\x78\x07\xe1\x98\xc6" + "\xf8\xcf\x87\xf3\x1f\x8e\x61\x3b\x97\xa0\x21\x63\x23\x35\x08\xc7" + "\x2e\xb0\xfd\xf0\x93\xda\x73\x88\xd1\x03\xab\x1e\x1d\x96\xd1\x19" + "\xc6\xed\xfb\xc8\x2d\xa5\x33\xf2\xa8\x5d\x57\xe3\x6f\xaf\x05\x6a" + "\x02\x2c\x5a\x00\x8f\x59\x3c\x76\xf5\x0a\x03\xa3\xe1\x74\xdd\x5e" + "\xc4\x31\x68\x0c\xd1\x73\x53\x12\x49\xde\xbd\x61\x2c\xf3\x37\xe8" + "\x68\x4e\x43\xd7\xac\x25\xcf\xda\x41\x33\xfb\x06\x27\xd1\xa9\x9e" + "\xf9\xd8\x96\xf8\xde\x66\xf7\x02\xcc\xa5\xce\x52\x6d\xc5\xf6\x49" + "\x05\x3d\x9e\x3a\xcb\x8f\xc3\x57\xcd\xe1\x93\xa0\xb6\x27\xc7\x4a" + "\xc5\x57\x0d\xb3\xfe\x9f\xfe\x25\xe4\x51\x7a\x7a\x88\x9b\xf9\x97" + "\x10\x77\xc0\x82\xdf\x42\x53\x22\xba\x9b\x1c\x1f\xb1\xc2\x48\x57" + "\x69\x96\xa1\x67\x21\x16\xfa\x9e\x86\x19\xf6\x34\x28\xd6\x92\x09" + "\xf3\xc0\xaf\x71\x55\x07\xcc\x06\x37\xb8\x3f\xcf\x0c\xb0\x33\xc4" + "\x56\x37\xeb\xd8\x4a\xe2\xa8\xc1\x93\x59\xe7\x9d\x1c\x1f\x8b\xdb" + "\x1a\x5f\x80\xbc\x35\xa3\xf1\x5a\xbe\xbb\x87\x97\xc6\x23\xfc\x7e" + "\xaa\x3b\xfc\x7f\x65\xfd\xfb\x63\xf0\xf5\x9d\xe8\x5f\x26\x29\xa2" + "\x46\xc3\xfc\x32\x7d\x92\x02\xaf\x2d\xf8\x2c\x21\x8d\x32\xc3\x31" + "\xb2\x56\x29\x0d\xe1\xef\x37\x35\xb8\x31\x3c\xca\x0c\xe7\x14\xd7" + "\xa4\xa1\x4d\x4b\x3c\x10\x3e\x9f\xac\x7f\x4b\x43\xf8\xfc\xcd\xd1" + "\x2a\x66\x6d\x02\x73\x9d\x31\x0d\xe1\x6b\x4d\x70\x7c\xa3\xd9\x13" + "\x6d\x59\xa6\x46\xa7\x27\x14\x33\x6d\x9c\x9e\xf0\x1d\xc2\x6d\x00" + "\xe6\xe1\xff\x5f\xa3\xad\x4b\xfc\x60\x8c\xa7\xc1\xf7\xff\x46\x5b" + "\x6f\x74\x87\x7f\xaf\xc0\xe7\x2e\xba\xa6\xb8\xeb\x7f\x7a\x82\x19" + "\x79\xaf\x1c\x46\x03\x76\xe9\x12\xfc\xce\x63\x02\x7a\x08\xfa\xde" + "\xb7\xa4\x2c\x19\xe6\xba\x3b\x6a\xfc\x4e\x3c\xbd\x62\x7a\xb5\x99" + "\x9e\x7e\xdd\xbc\x62\xfa\x0d\xfc\xdb\x26\x7a\xfa\x6f\xf8\xb7\x37" + "\x2f\xd3\xb0\xeb\x5f\xd3\x98\xb5\x7b\x9b\xee\xfa\x23\xdc\x57\xfc" + "\xbb\xf8\xf7\xb6\x46\x6b\xd9\xdf\xec\xc3\xf4\x0d\xff\x26\x6e\xd3" + "\xfa\x37\xf1\x7e\xf3\x9a\x29\xcc\x6f\xee\x81\x7f\x7d\xc0\x1f\x7e" + "\xd8\x0f\xf8\xf7\xcd\x74\x88\x3b\xbd\x22\x44\xc9\x5c\x13\x5b\x25" + "\x74\xcd\x39\xf6\x1a\xa6\x16\x01\xbe\xa6\x81\x9c\xcf\xb4\x01\x73" + "\x1f\xb3\x7f\x48\xef\x10\x1d\xb2\xf7\x61\xed\x66\x32\x17\xd6\xce" + "\x24\x73\x21\xf1\x29\x83\x95\xe9\x21\xee\xe0\x37\x15\x9e\x37\x2b" + "\x14\xb5\x03\x9b\xda\xf8\x25\x44\x89\xfd\x8d\x71\x63\xc1\x12\xc6" + "\x91\x05\x43\x4c\x3f\xa3\x10\xb2\xc6\x0c\xfc\xdf\x83\x6d\x27\xde" + "\xd2\x0e\xf4\x01\x59\x70\xd4\x1b\xbe\xb7\xc7\x51\xfd\x64\x0e\x47" + "\x75\x77\xea\x12\x68\x1a\xe3\x48\x37\x6d\x15\x6e\xe7\x24\xd7\x9f" + "\x49\x0a\x8c\xb1\x76\x86\x2d\x7f\xec\xa7\xde\x71\x48\x4d\xee\xa7" + "\x2e\x95\xb9\x9f\x38\x9d\x1a\xf7\xd5\x72\x1f\xb8\x0f\x5b\xcc\x1a" + "\x64\xb9\x8f\xad\x0d\xfe\xd0\xee\x0d\xc4\x5e\x73\x0a\xb7\x6d\xb1" + "\x01\xf8\x0c\x59\xae\xb1\x9c\xbf\xc5\xac\x85\x7e\xf7\x61\xae\x21" + "\x98\xbb\x22\x80\x9f\x7a\x5f\x5b\xcc\x75\x8c\x43\x40\x64\x81\x3b" + "\x4d\xbb\x05\xbf\x53\xdf\x9f\xf4\xed\x1b\x53\x03\xfc\x06\xf8\x80" + "\x62\x8f\x07\x5b\x61\x82\x6d\xbf\x4e\xa8\xfd\xc5\xbc\xf6\x43\xa0" + "\xfd\x58\x68\x1f\x73\xb3\x69\x38\x0f\x56\xcf\xd4\x01\xe8\x1d\x4b" + "\xda\xb7\xe0\x96\x4e\x0e\x1e\x19\xb5\x0c\xaf\x1f\x6d\x08\x20\xf1" + "\xf4\x37\x66\x0f\x10\x66\xdd\x12\x65\xce\x34\xdb\xac\x5b\xb2\x5e" + "\xd7\x76\x20\xc1\xc0\xae\x59\x6a\x60\x6a\x5a\x40\x7c\xad\xc1\x1c" + "\x33\x17\xf8\x19\xb7\x6e\xe9\x67\xfc\xfd\x93\xba\x25\x15\x56\xeb" + "\x96\xea\x19\xbd\xaf\x57\x34\x8c\x01\x2d\x49\xc1\xf7\xec\xf1\xdf" + "\x0e\x59\x1f\xe7\xd6\x05\x92\xe3\x78\xcd\x35\x9b\x77\xad\xfe\x67" + "\x3e\xce\xbd\x35\x84\x59\xf2\x9d\x22\x5a\xd5\x79\x0e\x4c\xb9\xe5" + "\x37\x71\x60\xf8\xbf\x38\x07\x6e\xf4\x71\xc8\x81\x29\x0a\x35\x71" + "\x60\x0a\xcd\x61\xc6\x3d\x85\x46\x31\xe3\x9e\x42\xcc\x3e\xb8\x5b" + "\xa0\x3d\xe3\xc7\x31\x78\x0d\x76\x1e\xc6\xf9\x6e\xe0\xb4\x07\x96" + "\x14\x50\xb9\xa0\x93\x4d\xd4\x13\xf4\x6a\xb0\x1d\xae\xd7\xb6\x7a" + "\x19\xcc\xd3\xc6\xb3\xa8\xd8\x0d\x73\x60\xbc\xfe\x8b\x0e\x2f\x66" + "\x9e\xcb\x05\x27\x13\xbb\x34\xce\x07\x5f\x28\x4b\xea\xea\x10\x73" + "\x1e\x7c\x07\xf3\x5a\x25\xe6\xc0\x5f\x9b\x0b\xa8\xdd\x60\x53\xf8" + "\x00\x47\x7e\xc7\x60\xcd\x91\x6b\xd7\x35\xa6\x0b\x73\x63\x5a\x63" + "\x5c\x67\xcd\x8d\x1b\xaf\x62\x6e\x8c\xf3\xe4\x98\x07\x98\x09\x27" + "\xd6\x03\x3f\x36\x60\x9e\x8c\xb9\xb1\x99\xc7\x8d\x4d\x7b\x1d\x73" + "\x63\xa3\xef\x03\x6e\xec\x2a\x37\x16\xd3\xfc\xa6\x45\xf2\xb8\xb1" + "\x29\xea\x01\x37\xbe\x5f\xdc\xd8\x34\xc3\xc2\x8d\xcd\xab\x1e\x7d" + "\x36\xfd\x7d\x18\xaf\x4d\xdc\x98\x1e\x6e\xcf\x8d\xe9\x49\xf6\xdc" + "\xb8\x31\x8f\xe3\xc6\x8d\x13\x78\xdc\x98\x72\x8f\xb4\xe7\xc6\xf4" + "\x1e\x31\x6e\x0c\x71\xa9\x1a\x73\x63\x8c\x29\xcc\x93\x31\x3f\x36" + "\x03\x3f\x26\xf8\xa2\xcf\xc8\xe3\xc6\x74\xa9\x53\xdc\x98\x42\xfd" + "\x85\xb9\x71\xa3\x4a\x9c\x1b\x37\xaa\x04\xb9\x31\xa5\x38\xd3\xc4" + "\x69\x28\xc5\xae\x36\xcf\x8d\x29\xc5\x70\x41\xfe\x42\x29\x82\x19" + "\x6e\x4c\xa1\x7e\x2d\xce\x8d\xa1\x4d\x41\x6e\x4c\x29\x8e\x31\x3c" + "\x82\x42\x03\xec\xb8\x31\xbe\x46\x88\x1b\x53\x8a\x9b\xec\x35\xfd" + "\x78\xdc\x98\x6d\x03\xe6\x44\x2f\x51\x6e\x4c\x51\x39\x64\x8e\xa4" + "\x96\x12\x6e\x4c\x7c\x6a\xc7\x8d\x29\x6a\x62\xb3\xdc\x98\xc5\x10" + "\xd3\x4f\x31\x6e\x4c\x51\x3b\xec\xb9\x71\xa3\x4a\x90\x1b\x53\x6e" + "\x8b\x38\x1c\xb9\xf9\xf0\xb8\x31\x45\x5d\x6a\x17\xdc\x58\x1c\x5b" + "\xc3\x79\xdc\x98\x52\x1e\x94\xcc\x8d\x29\xe5\x65\x49\xdc\x98\xc1" + "\x9c\x00\x37\xa6\xdc\xfa\xdb\x62\x8e\xc7\x8d\x29\xb7\xb1\x82\xdc" + "\x98\x72\x0b\xe7\x71\x63\xa6\x7d\x01\x6e\x4c\xb9\x6d\xe3\xb5\x6f" + "\xcb\x8d\x29\xb7\x5c\x1e\x37\x66\xcf\x6b\xe2\xc6\x94\xfb\x24\x36" + "\xd7\x70\x44\x32\x37\xa6\xdc\x07\x3a\xe4\xc6\x94\xfb\x50\x1e\x37" + "\xa6\xdc\x19\xfc\xeb\x29\xf7\x08\x86\x1b\x53\xee\xfe\x2c\xc7\xce" + "\xb7\x3e\xce\x71\x63\x72\xdc\x8e\x1b\x6f\x70\x4f\x6c\x86\x1b\x0f" + "\x77\x9e\x1b\xab\x92\x0b\x9a\xb8\xb1\x2a\xd9\xc2\x8d\xf1\xfe\x41" + "\xe9\xc0\x37\xd3\x19\x7e\x7c\x1a\x9d\x0e\xc3\xfd\x7f\xa8\xbf\x63" + "\x7e\xec\xa5\xe3\xf8\xb1\xa7\x0f\x19\xfb\x1d\xef\x10\x7e\xdc\xf1" + "\x70\x53\x8e\x18\xb8\x31\xe6\xc8\x6c\x8e\xf8\xec\x26\xf8\x1c\x58" + "\x56\xc0\xf0\x63\xbc\x36\x1e\x73\x64\xcc\x8f\x31\x4f\xc6\xdc\xb7" + "\x68\x0d\x42\xc5\x86\x3a\xbc\xae\xa3\x54\xf7\x38\xb6\x6b\xc7\x3d" + "\xc0\xab\xf5\x30\xb7\x95\xc2\xb5\xfa\x03\xb7\xea\xf0\x7b\x16\xe5" + "\x5b\x2a\xe0\x1a\x3d\xb9\x06\xbe\x2f\xc3\xd7\xc0\x39\xe5\xc4\x17" + "\x8f\x98\xc8\xfc\xc9\xf2\x6b\xea\xa1\x22\x1e\xbf\x26\xe7\x9e\xb5" + "\xf0\xeb\x5d\xd0\x07\xf8\xb8\x61\x6e\x8d\x39\x36\x70\xeb\xc2\x5d" + "\xdb\xe9\x82\xdd\x5d\xe8\x13\xb5\x1b\x1e\x46\x16\x8e\xbd\x19\x8e" + "\x6d\x81\x63\xd0\x8f\xd2\x13\x99\x08\x1d\xbb\xa5\xc3\xdc\x41\xbf" + "\xeb\x0a\x72\x03\x9f\x95\xad\x86\xdf\xc7\xd7\xc3\x35\x03\x2c\xd7" + "\xc0\xfc\x5e\xc8\x70\x72\xea\x91\xa3\x66\xeb\x7c\x35\xf5\xf0\xca" + "\x26\x4e\x0e\x76\xc2\xf9\x70\xbc\x2f\x17\xc3\xcb\x7b\x0e\x34\x18" + "\x2d\xbc\xdc\xd7\x8a\x97\x53\x1d\x86\x5a\x78\x39\x7e\xbf\xa9\x89" + "\x97\xc7\xb0\xbc\x9c\x7a\x38\x57\x26\x2f\x3f\xdb\x56\x78\xb9\xa7" + "\x42\xe1\xe6\x19\x4a\x78\x79\xfa\x92\x96\xe1\xe5\x98\x93\x63\x1e" + "\x8e\x39\x39\xe6\xe8\x98\x97\x63\x8e\x6e\x66\x79\xf9\x6e\x2b\x5e" + "\x6e\xb6\xe2\xe5\x66\x6b\x5e\x4e\x75\xe8\x20\x8b\x97\x53\x1d\x3c" + "\x5a\x80\x97\xdf\x57\xff\xdc\x0f\x5e\xae\xb5\xe1\xe5\x98\x87\xc3" + "\xd8\xab\xc4\xfc\xbc\x44\x07\xb6\x59\x04\x1c\x1d\xf8\x79\xb3\xdc" + "\x9c\xf2\xa8\xb1\xe6\xe6\xbb\x3b\x5b\x71\xf3\x0d\x8f\x94\xdb\x71" + "\xf3\x0d\x8f\x18\xac\xb8\x79\xa1\x9e\x7a\x78\x24\x13\xf7\x61\x7c" + "\xeb\xe6\x36\xe0\x58\x92\xc7\xe7\xe6\x3e\x23\xec\xb8\x39\xd5\x71" + "\xa8\x20\x37\x27\xfa\x9b\xcf\xcd\x7d\x67\xa9\x8d\x16\x6e\x4e\x75" + "\x9c\x2f\x8b\x9b\x53\x1d\xe7\x35\x69\x07\xea\xa1\x38\x32\xbf\x74" + "\xf4\x14\xe3\xeb\xb5\x2a\x6b\xbe\xde\xf1\x12\xc7\xd7\x63\x38\xbe" + "\x4e\x3d\xd4\x4f\x94\xaf\xc3\x77\xcc\xda\x71\x55\x7c\x2c\x6e\x0b" + "\xf3\x2c\x88\x95\x95\x9a\x68\xcc\xb5\xbc\xb6\x61\xae\x05\xf1\xa9" + "\x12\xaf\xb9\x86\xbf\x67\x5a\x78\x3b\xa3\x2f\x31\x77\x5f\xd6\x16" + "\xf9\x95\xa7\x51\x98\x5f\x79\x75\xc0\x3c\x86\x79\x9f\x95\xea\xa8" + "\x07\x9b\x54\xb6\x2c\x7f\xef\xa8\x17\xe6\xef\x5e\xf1\x84\xeb\x74" + "\xac\xc4\x7e\xe1\xf3\x77\xb8\x46\x90\xbf\x7b\x1d\x64\xaf\xd1\xf3" + "\xf9\x3b\x69\x03\xe6\xec\x22\x71\xfe\xde\x29\x92\xcc\xe1\x9d\x06" + "\x93\x39\x9c\xf8\xd8\x9e\xbf\x77\xf2\xb1\xe6\xef\xd8\xff\xf6\xfc" + "\x9d\x60\x8a\xe9\xa7\x28\x7f\xef\x34\xd5\x8e\xbf\xc3\x6f\x62\xfe" + "\x6e\xb4\xc2\x55\x3a\xc6\xd5\x5c\x8c\x2b\x55\x30\xc6\x15\x9e\x27" + "\x35\x6f\x60\x5c\x79\x5f\xad\x33\x5b\x78\xfc\x06\xdc\x5e\x8e\x2d" + "\x8f\xc7\xf1\xc2\x11\xce\xa2\xa2\xd1\xe3\x18\x6b\x18\x67\x16\xbf" + "\xe1\xf3\x31\xde\xee\x2d\xd6\xbc\x23\x84\xb1\xe6\xbd\x98\xf1\x33" + "\x8b\x35\x9c\x4f\x24\xbc\x1e\xdf\x9f\xf7\x7a\x69\xbc\x9e\xb9\xe6" + "\x98\x34\x5e\x8f\xb1\x28\xc4\xeb\x55\x1d\x6c\xb1\xc8\xe7\xf5\xaa" + "\x9e\xc2\xbc\x5e\x35\x94\xcf\xeb\x71\xfb\x42\xbc\x5e\x15\xc9\x6b" + "\xdf\x8e\xd7\xab\xd6\xf2\x79\x3d\x39\x8f\xe3\xf5\x3e\x7d\xd8\x3c" + "\xc9\x39\xe9\xbc\xde\xc7\x8b\x8d\xef\x84\xd7\x57\xd8\xf2\x7a\x1f" + "\x5f\x3e\xaf\x57\x55\x91\xf8\xea\x33\xbc\x8e\xe1\xf5\x2a\x23\xcb" + "\xf7\xcf\x5a\x1f\x6f\xe2\xf5\xec\xf1\x3a\x6b\x5e\xaf\xc3\xbc\xde" + "\x27\xa4\x19\x5e\x3f\xc1\x79\x5e\xdf\xbd\x8c\xe3\xf5\xdd\xcb\x1c" + "\xf3\xfa\xce\x1d\x1c\xf3\xfa\x6e\x6a\x8e\xd7\xfb\x85\x93\x98\xe0" + "\x17\x4c\x62\x82\x1f\xc3\x81\x60\x5c\x71\x79\xef\x45\xcc\x1a\xeb" + "\x82\xfd\xb7\x0a\xa8\x03\xd1\x6c\xde\xfb\x2e\x70\xfa\x25\xc0\xcf" + "\x6b\x08\x3f\x87\x98\x79\x02\xf3\x7a\xcc\xbf\x09\xa7\x7f\xec\x0e" + "\x1c\xd3\x83\xcd\x4f\x40\x5b\xfa\x7d\xcb\x74\x14\x5e\x5b\x85\xcf" + "\x85\xf1\x5e\xb6\x09\xe6\x11\x38\x5e\x06\xe7\xe8\xf0\x35\x70\xec" + "\xac\x2e\x9a\xb9\xee\x12\xe6\xfe\x70\x9d\x0e\xbe\x2f\xb7\xb9\xae" + "\x14\x5f\x57\x1c\xcb\x70\xfb\x52\xe2\xbb\xc7\x46\xc0\xf1\x42\x4e" + "\x07\x74\x3e\xc7\xe8\x80\x1a\x56\x07\xc0\xb9\xd0\x56\x01\xa3\x03" + "\xe6\x82\x0e\x80\x7e\xc3\xc7\x5a\x07\x1c\x05\x1d\x90\x0f\xba\xe5" + "\x50\xed\x86\x47\x3d\xac\x74\x40\x3e\xe6\xfd\x58\x03\x60\xee\x0f" + "\xf3\xda\x21\xac\x0b\x8e\x35\xe8\xf1\x7a\xf2\xb3\xa0\x03\xca\xf0" + "\xf5\x56\xd7\x8e\xb4\xbe\x16\x9f\x0f\x7d\xd4\x31\x1a\x02\xf8\x1c" + "\xf4\xa1\x7c\x57\x05\xa3\x21\x0a\xe1\xda\x52\xa2\x21\x1e\x8d\xb5" + "\xd2\x10\x47\x89\x86\x78\x0c\xf1\xf2\xfa\xd4\xa3\x27\xa5\x6b\x08" + "\xdf\x95\x0e\x73\xfb\xd4\xa3\x37\xa5\x68\x08\xb8\xef\x02\x0b\x4f" + "\xb5\x5b\xc7\x87\xd7\x99\x03\x57\xc5\xbc\xd4\xe1\x7a\x30\x96\xb3" + "\x62\x8e\x8a\xf9\x29\xe6\xa9\x4e\x71\x54\xe8\x7f\x61\x5d\x0b\xe6" + "\xf6\x1f\x02\x0d\xb1\x44\x5c\x43\x58\xf4\x03\x93\xd3\x67\x35\x04" + "\x8c\x31\x46\x43\xa4\xaf\xb2\xd2\x10\x0f\x59\x69\x08\x85\xb5\x86" + "\xf0\x1d\x2b\x4f\x43\xf8\x8e\x69\x01\x0d\x51\xf0\x40\x43\xc8\xd5" + "\x10\xbe\x01\x4d\x1a\x82\x62\xf3\xfb\x9d\x2d\x1a\xe2\x31\x8d\xbd" + "\x86\x78\x6c\x80\x95\x86\x38\xaa\xa7\x1e\x4d\x62\xf8\x39\xa3\x1f" + "\x3a\xe7\xf3\xf5\x43\x8f\xf5\xf6\xfa\xe1\xb1\x78\x79\xfa\xe1\xb1" + "\x5c\x79\xfa\xe1\xb1\x7d\xa4\x7f\x15\xb8\x7f\x49\x64\x1e\x7b\x6c" + "\x0c\xa7\x29\x3a\x4f\xb0\x3e\xd6\xbc\xa6\xf0\x1b\x28\xac\x29\x3a" + "\x7b\x88\x6b\x8a\xce\x1e\xe2\x9a\xa2\xeb\x65\xcc\xfd\xb0\x7e\x80" + "\xf6\x81\xfb\x75\x3d\x68\xfd\x2c\x60\x53\x33\x3c\xcf\x56\x4f\x44" + "\xcd\x25\xfa\xe3\xde\xf3\xbc\xae\x13\x84\x79\x5e\xd7\x99\x98\x43" + "\x19\x19\x9e\xe7\x37\x20\xbd\xc5\x35\x85\xdf\x00\x61\x4d\xd1\xf5" + "\x0c\xe1\x59\x7e\x01\xf6\x9a\x02\xae\x11\xd4\x14\xdd\xdc\xd9\x6b" + "\x06\xf0\x35\x05\x69\x03\xf8\xc2\x93\xe2\x9a\xa2\xdb\x31\xc2\x1f" + "\xba\x6d\x26\xfc\x81\xf8\xd8\x5e\x53\x74\xb3\xce\xff\x8a\x68\x0a" + "\x82\x29\xa6\x9f\xa2\x9a\xa2\x5b\xae\xbd\xa6\xe8\xec\x81\x35\x85" + "\x30\xae\xba\x6f\xe3\xe3\xaa\x7b\x7f\xbe\xa6\xe8\x66\xb2\xd5\x14" + "\xed\x10\x6b\x13\xb8\xe7\x03\xf8\x9e\x7e\x77\x46\xba\x8e\xe8\xee" + "\x2e\x4d\x47\x60\xfc\x09\xe9\x88\xee\x13\x6d\xf1\xc7\xd7\x11\xdd" + "\xe7\x0b\xeb\x88\xee\x6b\xf9\x3a\x02\xb7\x2f\xa4\x23\xba\x1f\xe4" + "\xb5\x6f\xa7\x23\xba\x17\xf1\x75\x04\x39\x8f\xd3\x11\x3d\x62\xd8" + "\x9c\x4e\xae\x74\x1d\xd1\x63\xb2\x63\x1d\xd1\x63\x26\x5f\x47\xf4" + "\xe8\x47\x62\x6a\x8f\x24\xa2\x23\x7a\x8c\x64\xf5\xc8\x3e\xeb\xe3" + "\x9c\x8e\x20\xc7\xed\x75\x44\x8f\xcc\x66\x74\x84\xa7\x31\x6b\xa0" + "\xbe\xc1\x7f\xa0\xa1\x51\x1d\xa9\xea\x5d\x39\xcc\xd4\xb4\x1f\x41" + "\x28\x70\x85\x72\xe0\x0e\x73\x10\x85\xdf\xe9\x4f\x38\x03\x9c\x60" + "\x0e\x59\xef\x8f\x79\xc1\xfe\x25\x98\xc7\xe9\xdc\x71\xfd\xc4\x86" + "\x94\x51\xa5\xc6\x3e\x83\x11\xe6\x07\xf5\x59\x03\x75\x75\x29\x53" + "\xb5\xf5\x78\xad\xff\x3c\x44\xcd\xae\x16\xe6\x76\xcb\xcb\x69\x33" + "\x60\xde\x63\xfc\x0c\xc2\xeb\x8a\x22\x2e\x33\x38\xc6\x9c\x01\xbf" + "\x8f\x51\x52\x53\xc6\x70\x08\xcf\xd0\xe1\x28\x3d\x01\xa9\xbd\xaa" + "\x91\xca\x4b\xa1\x78\xe8\x15\x50\x71\x26\xe0\x0f\xa3\x7a\xd1\xe6" + "\xde\x61\xc3\x71\x0d\x9f\x4e\x84\x43\xe4\xbb\x1b\x59\x0e\xb1\xf1" + "\x2e\xea\xb3\x0b\xe7\x87\x8b\x38\xee\x50\x6f\xe1\x76\x56\xbc\x61" + "\xe6\x75\x15\xda\xb5\x8a\xbf\xd6\xbf\x71\x1b\xc7\x1b\x30\x67\xa0" + "\x67\x03\xb7\xab\x23\xeb\x35\x96\x4d\x24\x6b\xfd\xfb\x54\x22\x2a" + "\x63\x16\xf2\x28\x0c\xad\xc0\xb9\x1f\xbf\xc2\xca\xbd\x68\x69\x30" + "\x7a\xdc\x88\x79\x02\x70\xbd\xc2\xca\x54\x84\xeb\x13\xa6\x03\x57" + "\x48\xbb\x8b\x86\xe0\xf9\x78\xcc\x1c\xc2\x17\xc8\x5c\xfc\xc4\xe0" + "\x93\xda\x93\x48\x3a\xd7\x7b\x82\xa9\xa5\x26\xfa\xde\x6d\x16\xf0" + "\x7a\xff\x81\x3a\x13\xf8\x92\xd4\xa5\x9c\x35\xc1\xfc\xf1\xe2\x7e" + "\xfb\x01\x87\x9f\x57\x54\x29\x70\x8d\x6d\xbc\xdf\xa4\x79\xdf\x60" + "\xc4\xf3\x4d\x23\xeb\x9b\x46\xe2\x1b\xec\x97\x59\x51\x08\xd7\x33" + "\xec\x84\x7d\x52\x52\x57\x86\xcc\xcb\x2d\x7b\x4e\xf6\x43\xbb\xcd" + "\xc4\x1f\xa6\xc6\x88\x0e\x66\xb0\x3d\xae\xdb\x05\x78\x60\x38\xdc" + "\x26\xbc\x0f\xe5\x4a\x85\x17\xe6\x70\x80\xef\x47\x32\x1a\xc0\x0f" + "\x97\x88\x1f\xe8\x55\x2a\xe6\x5f\xe3\x72\xad\x06\xda\x7e\xaa\xb1" + "\x11\x7c\x51\x67\xe7\x8b\x28\xbc\x5f\x25\xae\xa9\x67\xdc\x46\xea" + "\x06\x32\xbe\x58\xae\xed\x8e\x6b\x6e\x30\xef\xcb\x34\x6a\x71\xbc" + "\x54\xed\xbe\x82\xdf\xf3\x21\x3e\x30\xb1\xb6\xc7\x7b\x57\x62\x7b" + "\x63\x7e\x56\x02\xbc\x8c\x79\x7f\x65\x43\x8f\x43\x8d\x7b\x07\xea" + "\xf0\x5a\x9a\x1b\x94\x46\xde\xfa\x5f\x4a\x73\xe8\xfe\xdb\x5e\xd3" + "\x0e\x6d\xff\x44\x22\x67\xfb\xa7\xfa\xcb\xb3\xfd\x53\xfd\xee\xbf" + "\xed\x55\xed\xd0\xf6\x1a\x23\x67\xfb\xff\x93\xc9\xff\xff\x4f\xb4" + "\xfe\x15\xb6\x3d\xce\x43\x59\x72\x50\x96\xfc\x13\x9e\xe3\x88\x56" + "\xe9\x1d\xc6\xad\xb7\xec\x1d\x66\xbd\xde\x12\x57\x0f\x6e\x5a\x6f" + "\x49\xf9\xaf\x74\x9c\x77\xd2\xee\xe3\xf2\x4e\xcf\x78\x11\xde\xf8" + "\xf4\x4d\xc2\x1b\x9f\x66\xd6\x34\xc4\x5f\x40\x94\xf1\xe9\x00\xd5" + "\xfe\x05\x3a\x0a\xbf\x7b\xb4\xff\x46\x1d\xb5\xe9\x16\xf0\x40\xea" + "\x09\x1a\xe7\x81\x36\x47\x83\xde\x80\xb9\x39\xea\x0d\xf4\xc4\x35" + "\xea\xe9\x5e\xb8\x4e\xd9\xd7\x37\x74\x54\x32\x3e\xe7\xa9\xc5\xfd" + "\xf6\x75\x33\x28\xf0\xdc\xb6\x7f\x41\x1d\x65\xc1\x8b\xe5\x1d\x43" + "\xb0\xa1\xc1\xe4\x1b\xa9\xba\xbd\x77\xa0\xde\xb2\x26\xd2\x98\x3b" + "\x18\x09\x62\x08\xbf\xbb\x08\x38\xc2\x98\xc1\xef\x1a\x5a\xf0\x84" + "\x71\x54\x5c\x57\x85\xf0\x3e\x3c\xde\x55\x48\x45\x03\x86\xa6\xe7" + "\x80\x7f\xad\x71\x94\x2c\x82\xa3\x1d\x7c\x1c\xdd\x66\x71\x04\x78" + "\xe2\x70\xd4\xf4\xde\xda\x4f\x35\x92\x70\x54\xcd\xe2\x68\x9b\x0d" + "\x8e\xae\x6b\xd0\x0f\xe5\x17\x58\x1c\x3d\x15\x6b\xec\x69\xc1\x51" + "\xcf\x3b\x27\x67\x00\x8e\x66\x48\xc5\x51\xcf\x1a\xbe\xb6\xed\xe3" + "\x63\xaf\x6d\x9f\x9e\x6a\xab\x6d\x2d\x5a\xf6\xb6\xef\x2c\xd5\xed" + "\xd4\x59\xea\x1a\x5f\x8b\x9e\x7d\x3a\x5e\x1e\x9e\x9f\x8e\x73\x6e" + "\xad\xda\xd3\x17\x6c\xd7\xaa\x7d\xce\xe8\x54\xff\x35\x18\x6b\xc2" + "\x3a\x95\x7c\x67\xbf\xc6\x48\x1b\xcf\xad\x31\xd2\x06\xb7\xfd\xb5" + "\x6a\xcf\x54\x0b\xeb\x85\x67\xee\x90\xb5\x6a\x4f\x97\xb7\xfc\x5a" + "\xb5\xa7\xcb\x85\x75\xa9\x96\xcd\xff\x3f\xad\xb7\x5f\xab\x06\xd7" + "\x08\xea\x52\xed\x2e\xf6\x9a\x72\xbe\x2e\x25\x6d\x40\x3c\x39\x22" + "\xae\x4b\x7b\x4d\x26\xf1\xa5\x57\x4f\x12\x5f\x88\x4f\xed\x75\xa9" + "\xd6\x64\xad\x4b\x85\xd7\xaa\x11\x0c\x31\xfd\x14\xd5\xa5\xbd\x46" + "\xd9\xeb\x52\xff\x44\xe1\xb5\x6a\xbd\x7b\x70\x38\x7a\xf6\x18\x7f" + "\xad\x5a\xaf\xcd\xed\x63\xad\x9a\x28\xb6\xaa\xf9\x6b\xd5\x9e\x9d" + "\x29\x7d\xad\xda\xb3\xdb\xa4\x69\x51\x8c\x39\x21\x2d\xfa\xec\x05" + "\x5b\xcc\xf1\xb5\xe8\xb3\xf5\xc2\x5a\xb4\xb7\x0f\x5f\x8b\xe2\xf6" + "\x85\xb4\x68\xef\xa1\xbc\xf6\xed\xb4\x68\xef\xa9\x7c\x2d\x4a\xce" + "\xe3\xb4\x68\x6f\x23\x89\xa1\xfe\xbd\xa4\x6b\xd1\xde\x17\xf0\x39" + "\xb9\x3b\xc9\x33\x23\xbe\x0e\xed\x7d\x99\xaf\x43\x7b\xb3\xeb\xd1" + "\xfa\xa8\xc8\x3a\xb5\xde\x85\xe4\xb8\xbf\xd6\xfa\x38\xa7\x43\xc9" + "\x71\xbc\x4e\x8d\xac\x4f\xeb\xa3\x91\xa6\x3f\x9f\x6f\x83\xfa\xb3" + "\x9f\x03\xfd\xd9\xaf\x9d\xea\xcf\xbe\x47\xe4\xe9\xcf\xbe\xa2\xfb" + "\x9f\x3f\xd0\x40\x8e\x78\x78\x9f\x01\x1c\x0f\x7f\x7e\xa0\x3c\xde" + "\xf2\xfc\x80\xfb\x6f\xfb\xf6\xa8\x81\x9e\x43\x9c\xed\xfb\x1d\x94" + "\x67\xfb\x7e\x79\xf2\x35\x50\x40\x04\xa7\x81\x02\x22\xc4\x35\x50" + "\xff\xb5\x8e\x35\xd0\xc0\x3c\x4e\x03\x0d\x60\xd7\xd4\xbe\xc0\xae" + "\xa9\x7d\xe1\xb0\x74\x0d\xf4\x42\xdf\x07\x1a\x48\x8a\x06\x7a\x3e" + "\x8e\xd3\x40\xbf\xaf\x97\xa7\x81\x7e\x5f\xc7\xd7\x40\x83\x7d\xed" + "\x35\xd0\x0b\x33\x9d\xd7\x40\x2f\xac\x94\x87\xe7\x17\x12\x9d\xd3" + "\x40\x2f\x5c\x12\xd6\x40\xfd\x93\xc4\x35\x10\xf9\xce\x9e\xbb\x0e" + "\x5c\xc9\x71\xd7\x81\x63\xdb\xbe\x06\x1a\x60\x10\xe6\xa9\x03\xea" + "\x89\x06\x7a\x41\xdf\xf2\x1a\xe8\x05\x91\xf5\x7e\x03\xe7\x13\xbe" + "\xf8\x42\xa5\xbd\x06\x7a\x41\x64\xbd\xdf\xc0\x3d\xec\x35\x36\xeb" + "\xfd\x48\x1b\x10\x4f\x8e\x89\x6b\xa0\x41\x53\x49\x7c\x19\x44\xea" + "\xba\xb0\x3e\xb5\xd7\x40\x83\x14\xcd\x6b\xa0\x17\xd8\xf5\x7e\x2f" + "\x38\x58\xef\x37\x28\xd8\x5e\x03\xf5\x5f\x23\xac\x81\x02\x9e\xe4" + "\x70\xf4\x87\xe3\x7c\x0d\x34\x68\x5b\xfb\xd0\x40\xa2\xd8\x32\xf0" + "\x35\xd0\x1f\xe6\x48\xd7\x40\x7f\x48\x95\xa6\x81\x5e\x10\x59\xd7" + "\xf7\x87\x4b\xb6\x98\xe3\x6b\xa0\x3f\x98\x84\x35\x50\x80\x2f\x5f" + "\x03\xbd\x20\xb2\xae\x2f\x60\x04\xaf\x7d\x3b\x0d\x14\x30\x93\xaf" + "\x81\xc8\x79\x9c\x06\x1a\x8c\x48\x0c\xed\xdf\x57\xba\x06\x0a\xb8" + "\x24\xae\x81\x02\xae\xf2\x35\x50\xc0\x51\xa2\x75\x06\xab\x89\x06" + "\x0a\x28\x25\xc7\xfb\xf7\xb1\x3e\xce\x69\x20\x72\x9c\xd3\x40\x83" + "\xfd\xa5\x69\xa0\x27\xda\xa0\x06\xd2\x38\xd0\x40\x9a\x76\xaa\x81" + "\x5e\x3c\x26\x4f\x03\xbd\x78\xf4\x01\x0f\x97\xc3\xc3\x07\x07\x70" + "\x3c\x7c\xc8\x60\x79\xbc\x65\x88\xc3\xe7\x9f\x8e\x79\xf8\xcb\x06" + "\x8e\x87\xbf\x6c\x10\xe7\xe1\x43\x1d\xd7\x3f\xa3\x46\x04\x70\x3c" + "\x7c\xd8\x0e\x32\x4f\x0e\x8b\x27\xf3\xe4\xb0\xa1\xd2\x79\xf8\x9f" + "\x0e\x3f\xe0\xe1\x52\x78\xf8\x1f\xdd\x38\x1e\xfe\xa7\x95\xf2\x78" + "\xf8\x9f\x12\xf9\x3c\x7c\xe4\x2e\x7b\x1e\xfe\xa7\xcb\xce\xf3\xf0" + "\x61\x1d\xe4\xe1\x79\x98\x87\x73\x3c\x7c\x58\xa4\x30\x0f\x1f\xaa" + "\x12\xe7\xe1\xe4\x3b\x7b\xfe\x34\xa2\x03\xc7\x9f\x86\x9f\x6b\xfb" + "\x3c\x7c\x78\xac\x30\x57\x1a\xbe\x92\xf0\xf0\x61\x11\x2d\xcf\xc3" + "\x87\x45\x08\xf3\xf0\xe1\x77\x08\x67\x19\x36\xcf\x9e\x87\xc3\x35" + "\x82\x3c\x7c\x44\x2f\xf6\x9a\x08\x3e\x0f\x27\x6d\x40\x3c\x19\x25" + "\xce\xc3\x47\x5c\x22\xf1\x65\xc4\x41\x12\x5f\x88\x4f\xed\x79\xf8" + "\x88\xf5\xcd\xf3\x70\x82\x21\xa6\x9f\xa2\x3c\x7c\xc4\x19\x7b\x1e" + "\x3e\x54\xb8\xa6\x14\xf5\x72\x0e\x87\xa3\x97\x83\xf9\x3c\xfc\xa5" + "\xae\xed\x83\x87\x8b\x62\x2b\x96\xcf\xc3\x5f\xba\x2a\x9d\x87\xbf" + "\xdc\x43\x1a\x0f\xc7\x98\x13\xe2\xe1\x2f\x47\xda\x62\x8e\xcf\xc3" + "\x5f\x5e\x2b\xcc\xc3\x5f\xde\xc5\xe7\xe1\xb8\x7d\x21\x1e\xfe\xf2" + "\x29\x5e\xfb\x76\x3c\xfc\xe5\xcb\x7c\x1e\x4e\xce\xe3\x78\xf8\xc8" + "\x24\x12\x43\x87\x48\xaf\x29\x45\x8d\x8c\x14\xe7\xe1\x23\x17\xf1" + "\x79\xf8\xc8\x91\x84\x6f\x8f\x4c\x27\x3c\x7c\x64\x08\x39\x3e\xe4" + "\x90\xf5\x71\x8e\x87\x0f\x39\xc4\xe7\xe1\x23\xf7\x49\xe3\xe1\xde" + "\x6d\x90\x87\xab\x1c\xf0\x70\x55\x3b\xe5\xe1\xa3\x47\xc9\xe3\xe1" + "\xa3\x47\xca\xe7\x82\x63\x8d\x1c\x17\x1c\x6b\x14\xe7\x82\x81\x5d" + "\x1d\x73\xc1\x57\x47\x72\x5c\x30\x78\x2f\x89\xd5\xc1\xeb\x49\xac" + "\x0e\x0e\x96\xce\x05\x83\x8e\x3f\xe0\x82\x52\xb8\xe0\x48\x1d\xc7" + "\x05\x83\x36\xcb\xe3\x82\x41\x9b\xf8\x5c\x70\x5c\x8e\x3d\x17\x0c" + "\xba\xe9\x3c\x17\x0c\xf6\x95\xc7\x05\x83\xd5\xce\x71\xc1\xe0\xc5" + "\xc2\x5c\x30\xb0\xbb\x38\x17\x24\xdf\xd9\xcf\xe1\xaf\xfa\x72\x73" + "\xf8\x2b\x97\xda\x3e\x17\x7c\x65\x8d\xf0\x7c\xfd\xca\x66\xc2\x05" + "\x83\x63\x5a\x9e\x0b\x06\xc7\x08\x73\xc1\x57\x15\x64\xde\x0c\x8e" + "\xb5\xe7\x82\x70\x8d\x20\x17\x7c\x75\x20\x7b\x4d\x0c\x9f\x0b\x92" + "\x36\x20\x9e\x4c\x14\xe7\x82\xaf\x5e\x27\xf1\xe5\xd5\x63\x24\xbe" + "\x10\x9f\xda\x73\xc1\x57\x53\x9b\xe7\x82\x04\x43\x4c\x3f\x45\xb9" + "\xe0\xab\x17\xec\xb9\x60\xa0\x9f\x30\x17\x1c\xcb\xd5\xa9\xa5\xc6" + "\x4e\xe6\x73\xc1\x31\x3d\xdb\x07\x17\x14\xc5\xd6\x1a\x3e\x17\x1c" + "\x73\x47\x3a\x17\x1c\xdb\x4b\x1a\x17\xc4\x98\x13\xe2\x82\x63\x17" + "\xdb\x62\x8e\xcf\x05\xc7\x6e\x13\xe6\x82\x63\x73\xf8\x5c\x10\xb7" + "\x2f\xc4\x05\xc7\x9e\xe3\xb5\x6f\xc7\x05\xc7\xde\xe4\x73\x41\x72" + "\x1e\xc7\x05\xc7\xa5\x90\x18\x3a\xfa\xb8\x74\x2e\x38\x6e\xb1\x38" + "\x17\x1c\x17\xcf\xe7\x82\xe3\xd8\x77\xce\xc6\x65\x13\x2e\x38\x2e" + "\x8c\x1c\x1f\xad\xb3\x3e\xce\x71\x41\x72\x9c\xe3\x82\xe3\xf2\x9b" + "\xe3\x82\x8e\xf9\xc3\x94\x49\x1c\x7f\x98\x32\xc9\x9a\x3f\x9c\xe2" + "\xf1\x87\xf1\x53\x1d\xf3\x87\xd7\xd2\x39\xfe\x30\xd1\x44\xc6\xf7" + "\xc4\x4b\x64\x7c\x4f\x64\x6a\xf8\xc5\x8f\x85\x79\x1e\xf8\x43\xee" + "\xb5\x3c\xc2\x1f\xae\xd5\x51\x1b\x6f\xb0\xfc\xa1\x1a\x79\x6c\x5a" + "\xc0\xf2\x87\x59\x98\x3f\x4c\xec\x8a\xf9\x83\x67\x3a\x70\xd5\x4a" + "\x96\xbb\x46\x01\x77\xad\x84\xbf\x61\xec\x7c\x0d\x6d\x14\x03\xbf" + "\x4c\xc6\xd7\xe3\x7d\x1b\xa0\x2d\xe6\x5d\x4e\xe6\x3d\x4f\xbd\x3b" + "\xde\x0f\x08\x73\x0b\xbc\xbf\x46\xb3\x7b\x6b\x54\xb2\x7b\x6b\x84" + "\xf1\xf7\xd6\xc0\x7b\x6a\xe0\xfd\x35\xd2\xa3\x91\xfa\x23\x96\x53" + "\x74\x5a\xa9\xe8\x84\xf7\xd7\xe8\x54\x43\xf8\x69\xae\xb9\x80\xf0" + "\xd3\x77\xfc\x1e\x01\x2e\xd4\x67\xf7\x2d\x8e\x4b\x7c\x80\x79\xc4" + "\x3b\x5a\x4d\xcd\x3b\xda\xc7\x6f\xdf\xd6\x3e\x65\xbf\xaf\xc6\xbf" + "\x87\xe0\x3d\x01\x4a\x62\xcb\x18\x1e\xc1\xec\xc7\xf0\xa6\x16\x65" + "\xbc\x81\x3c\x80\x17\x2b\x9e\x03\x7e\xfa\x4c\x77\xe8\x7b\x11\x52" + "\x99\x6e\x6b\xbb\x5b\xd7\x6b\x84\xbe\xab\xcc\xb7\xb5\xa8\x30\xf4" + "\x67\xe6\xbd\x4e\x23\xfb\x5e\xa7\xe1\x1d\x2d\xde\x6b\x20\x60\x67" + "\xb4\x15\x3f\xf5\xb5\xf0\xd3\x09\x97\xe5\xf1\xd3\x09\x95\x7c\x5e" + "\xf1\x17\x85\x3d\xaf\x98\x18\xec\x3c\xaf\x98\x28\xb3\xfe\xcb\xc4" + "\x79\xce\xf1\x8a\x89\x45\xb6\xbc\x22\x87\xe1\x15\xe3\x67\x60\x0c" + "\x0a\xf3\x0a\xf2\x9d\xfd\x7c\xf0\xda\x7c\x6e\x3e\x78\x6d\x70\xdb" + "\xe7\x15\x7f\x2e\x17\x8e\xfd\x7f\xbe\x4c\x78\xc5\xc4\xc2\x96\xe7" + "\x15\x13\x0b\x85\x79\xc5\x6b\x53\x49\x0c\x9e\x58\x6a\xcf\x2b\xe0" + "\x1a\x41\x5e\xf1\xda\x66\xf6\x9a\x42\x3e\xaf\x20\x6d\x40\x9c\xc9" + "\x11\xe7\x15\x93\xc8\x1e\x1e\xd4\x24\x5f\x12\x77\x88\x4f\xed\x79" + "\xc5\x6b\xd7\x9b\xe7\x15\x04\x43\x4c\x3f\x45\x79\xc5\xa4\x81\xf6" + "\xbc\x62\x7c\x88\x30\xaf\x98\xe2\xc5\xe1\x68\x72\x2e\x9f\x57\x4c" + "\x8a\x6f\x1f\xbc\x42\x14\x5b\xe5\x7c\x5e\x31\x79\xac\x74\x5e\x31" + "\x79\xa5\x34\x5e\x81\x31\x27\xc4\x2b\x26\x17\xd9\x62\x8e\xcf\x2b" + "\x26\x5f\x15\xe6\x15\x53\x14\x7c\x5e\x81\xdb\x17\xe2\x15\x53\xfa" + "\xf2\xda\xb7\xe3\x15\x53\x82\xf9\xbc\x82\x9c\xc7\xf1\x8a\x29\xd5" + "\x24\x86\x8e\x57\x48\xe7\x15\x53\x8a\xc4\x79\xc5\x94\x73\x7c\x5e" + "\x31\x25\x9b\xf0\x87\xbf\x20\xc2\x2b\xa6\x1c\x25\xc7\xc7\x23\xeb" + "\xe3\x1c\xaf\x20\xc7\x39\x5e\xf1\x17\xd5\x83\xf7\x2d\xdb\x62\x8e" + "\x29\x24\x47\xde\x1c\x1e\x92\x7d\xff\x9f\xf5\xb6\xc7\xf7\x2d\xff" + "\xe2\xcf\x3d\xeb\x9d\xd6\x53\x1e\x6f\x99\xe6\x7f\xff\x6d\xdf\x1e" + "\xd7\x1a\x87\x18\x38\xdb\x4f\xdf\x23\xcf\xf6\xd3\x33\xef\xbf\xed" + "\xdb\xe3\x1a\x87\x69\xf3\x38\xdb\xcf\xec\x21\xcf\xf6\x33\x45\xf7" + "\xbf\x6e\x5e\x97\x86\x59\xad\x71\x08\x33\x88\xeb\xd2\x99\x37\x1d" + "\xeb\xd2\xb9\x56\x6b\x1c\x42\xd9\x35\x0e\xa1\xec\x1a\x87\x50\x66" + "\x8d\x43\x02\xd6\xa5\x1f\xc7\x68\x0e\x44\xe7\x53\xb8\xd6\x57\x6e" + "\x74\x1d\x05\x3e\x71\x33\x62\x5d\x0a\xb6\xde\xdc\x80\x75\xe9\x09" + "\x36\xaf\x3d\xfb\x70\x71\x95\xd5\x9e\x16\xd4\xac\x11\x5c\xcd\xdd" + "\x13\x08\x7f\xf7\xf5\xad\x7c\x2a\xb9\xc1\x26\xe7\x0d\x6d\x6a\x16" + "\xf0\x73\xde\x38\xd7\x5d\x6f\xb5\x37\x85\x29\x35\x52\xd5\x5c\xce" + "\xdb\x36\xdf\xbd\xab\x01\xa9\xdb\x6f\xce\x7b\x7a\x15\x97\xf3\x9e" + "\x2d\x73\xfd\xc3\x6c\x9b\xf5\x0f\xe1\x02\xeb\x1f\x66\x4b\x58\xff" + "\x10\x2a\x73\xfd\x43\xa8\x93\xeb\x1f\x42\xed\xd6\x3f\x10\x6d\x3a" + "\xb3\x26\x41\x54\x9b\x92\xef\xec\x35\xc5\x5c\xab\xf5\x0f\x73\xda" + "\xc1\xfa\x87\x39\x22\xcf\xa8\xe7\xb0\xeb\x1f\x42\xef\xc1\xfa\x87" + "\x50\x91\xf5\x0f\x73\xd8\xf5\x0f\xa1\x02\xeb\x1f\x42\x45\xd6\x3f" + "\xcc\x65\xd7\x3f\x84\xda\xac\x7f\x08\x65\xd7\x3f\xcc\x75\xb0\xfe" + "\x61\x2e\xbb\xfe\x61\x2e\xbb\xfe\x81\xf8\xd4\x5e\x9b\xce\x75\x62" + "\xfd\x43\x28\xbb\xfe\x21\xd4\xc1\xfa\x87\xb9\x02\xeb\x1f\x66\x1a" + "\x84\xb5\x69\x98\xd5\xfa\x87\x30\x9b\xf5\x0f\xaf\xb7\x93\xf5\x0f" + "\xa2\xd8\xb2\x59\xff\xf0\xba\x8c\xf5\x0f\x61\x12\xd7\x3f\x84\x8a" + "\xac\x7f\x08\x8b\xb4\xc5\x1c\x5f\x9b\x86\x89\xac\x7f\x08\xb3\x59" + "\xff\x10\x2a\xb2\xfe\x21\xec\x14\xaf\x7d\x3b\x6d\x1a\x66\xb3\xfe" + "\x21\xd4\x66\xfd\x43\x38\xbb\xfe\x61\xe6\x0e\xe9\xda\x34\xdc\xc1" + "\xfa\x87\x70\x9b\xf5\x0f\xe1\xec\xfa\x87\x70\x76\xfd\x43\x38\xbb" + "\xfe\x61\x66\x9a\xf5\x71\x4e\x9b\x92\xe3\x9c\x36\x0d\x97\xb8\xfe" + "\xe1\xc1\xbb\x98\xad\xa3\x4d\xdf\x94\xb9\xfe\xe1\x4d\x87\xeb\x1f" + "\x1e\xe8\x23\x31\x8e\x1e\xae\xe3\x38\x7a\xc4\x71\x79\xbc\x25\x42" + "\x77\xff\x6d\xdf\x1e\xf5\xd1\x9b\x9b\x38\xdb\xbf\x35\x54\x9e\xed" + "\xdf\x1a\x22\x5f\x1f\x45\xab\x38\x7d\x14\xad\x12\xd7\x47\x6f\x37" + "\xb3\xff\xdf\xc2\x10\x4e\x1f\xcd\x3f\x42\x38\xca\xfc\x5d\x84\xa3" + "\xcc\x9f\x29\x5d\x1f\xcd\x3b\xc7\xd7\x47\x6f\xcf\x79\xa0\x8f\xe4" + "\xea\xa3\x48\x0f\x4e\x1f\xcd\xdb\x23\x4f\x1f\xcd\xcb\xe4\xeb\xa3" + "\xe8\x63\xf6\xfa\x68\xbe\xbb\xf3\xfa\x68\x7e\x2f\x79\x58\x9f\xaf" + "\x75\x4e\x1f\xcd\x5f\x2f\xac\x8f\xde\x56\x8b\xeb\x23\xf2\x9d\x3d" + "\xaf\x5d\xd8\x8b\xe3\xb5\x0b\xee\xb4\x7d\x7d\xb4\x20\x4d\x98\xc3" + "\x2e\xd8\x43\xf4\xd1\xfc\xa4\x96\xd7\x47\xf3\x93\x84\xf5\xd1\x42" + "\xb2\xff\x2b\x35\x7f\x93\xbd\x3e\x82\x6b\x04\xf5\xd1\xc2\x60\xf6" + "\x9a\x24\xbe\x3e\x22\x6d\x40\xac\x09\x17\xd7\x47\x51\x0a\x12\x7b" + "\x16\x9e\x21\xb1\x87\xf8\xd4\x5e\x1f\x2d\xcc\x69\x5e\x1f\x11\x0c" + "\x31\xfd\x14\xd5\x47\x0b\x6f\xda\xeb\xa3\xb7\x45\xf6\x55\x5b\x74" + "\x8a\xc3\xd1\xa2\x48\xbe\x3e\x8a\x1a\xdc\x3e\xf4\x91\x28\xb6\xd2" + "\xf8\xfa\x68\x51\x07\xe9\xfa\x68\xd1\x50\x69\xfa\x08\x63\x4e\x48" + "\x1f\x2d\x5a\x6f\x8b\x39\xbe\x3e\x5a\xb4\x57\x58\x1f\x2d\x3a\xc6" + "\xd7\x47\xb8\x7d\x21\x7d\xb4\xe8\x2a\xaf\x7d\x3b\x7d\x14\xed\xce" + "\xd7\x47\xe4\x3c\x4e\x1f\x45\x67\x93\x18\xfa\x96\x8c\x7d\xd5\xa2" + "\xd7\x8b\xeb\xa3\xe8\x6d\x7c\x7d\x14\x1d\x46\x74\x50\xf4\x51\xa2" + "\x8f\xa2\x63\xc9\xf1\xb7\xf2\xad\x8f\x73\xfa\xe8\xad\x7c\xbe\x3e" + "\x8a\x2e\x7c\xf0\x9e\x66\x5b\xd4\x47\x31\xe1\xf2\xf4\x51\x4c\xd8" + "\x03\x8e\x2e\x87\xa3\x47\xeb\x39\x8e\xbe\xf8\x92\x3c\xde\xb2\x58" + "\x2f\x9f\xa3\xc7\x1f\xe2\x38\x7a\xfc\x21\x71\x8e\xbe\xe4\xb0\x63" + "\x8e\xbe\xcc\xc8\x71\xf4\xa5\x33\xc9\x3c\xb9\x74\x04\x99\x27\x97" + "\x2a\xa4\x73\xf4\xd8\xa5\x7c\x8e\xfe\xae\xfb\x03\x8e\x2e\x97\xa3" + "\xc7\xec\xe3\x38\x7a\xec\x28\x79\x1c\x3d\x76\x24\x9f\xa3\x27\xcc" + "\xb1\xe7\xe8\xb1\x39\xce\x73\xf4\xd8\x22\x79\x58\x8f\x2d\x74\x8e" + "\xa3\x2f\xed\x2b\xcc\xd1\x97\xe4\x8b\x73\x74\xf2\x9d\x3d\xb7\x5a" + "\x56\xc4\x71\xab\x65\x3b\xda\x3e\x47\x5f\x36\x44\x98\x47\x2d\x1b" + "\x45\x38\xfa\xd2\x3e\x2d\xcf\xd1\x97\xf6\x11\xe6\xe8\xcb\x8e\x10" + "\x3e\xb3\xb4\x9f\x3d\x47\x87\x6b\x04\x39\xfa\xb2\xeb\xec\x35\x7d" + "\xf8\x1c\x9d\xb4\x51\x41\x2d\xef\x20\xce\xd1\x97\xb3\xef\x05\x2d" + "\x5f\x4c\x62\x0f\xf1\xa9\x3d\x47\x5f\x3e\xb6\x79\x8e\x4e\x30\xc4" + "\xf4\x53\x94\xa3\x2f\x4f\xb5\xe7\xe8\x4b\x0e\x09\x73\xf4\x78\xab" + "\x75\x9a\xf1\x5e\x7c\x8e\xbe\xfc\x42\xfb\xe0\xe8\xa2\xd8\x1a\xc2" + "\xe7\xe8\x71\xb9\xd2\x39\x7a\xdc\x25\x69\x1c\x1d\x63\x4e\x88\xa3" + "\xc7\xf7\xb5\xc5\x1c\x9f\xa3\xc7\x07\x0b\x73\xf4\xf8\x39\x7c\x8e" + "\x8e\xdb\x17\xe2\xe8\xf1\x9b\x79\xed\xdb\x71\xf4\xf8\x1c\x3e\x47" + "\x27\xe7\x71\x1c\x3d\x81\xe5\xc4\x4b\x66\x4a\xe7\xe8\x09\x7d\xc5" + "\x39\x7a\xc2\x40\x3e\x47\x4f\xf0\x20\x5c\x3c\x21\x94\x70\xf4\x84" + "\xee\xe4\xf8\x92\x19\xd6\xc7\x39\x8e\x4e\x8e\x73\x1c\x3d\x21\xea" + "\xc1\x3b\x9c\x6d\x91\xa3\x27\x76\x90\xc7\xd1\x13\x3d\xe4\xf3\xc4" + "\xf7\xca\x39\x9e\xf8\x5e\xb9\x38\x4f\x4c\xbc\xe0\x98\x27\xae\xf5" + "\xe7\x78\xe2\xea\xb5\x24\x56\xaf\x8e\x24\xb1\x7a\x75\x2f\xe9\x3c" + "\x71\xd5\x1e\x3e\x4f\x5c\xd9\xf7\x01\x4f\x94\xcb\x13\x13\xd6\x70" + "\x3c\x71\xd5\x7c\x79\x3c\x71\xd5\x3c\x3e\x4f\x4c\x12\xd8\x53\x6b" + "\xd5\x19\xe7\x79\xe2\xaa\x3b\xf2\x78\xe2\xaa\x1a\xe7\x78\xe2\xea" + "\xc9\xc2\x3c\x31\x51\x2f\xce\x13\xc9\x77\xf6\xf3\xfb\x9a\x3b\xdc" + "\xfc\xbe\xe6\x78\xdb\xe7\x89\x6b\xc2\x84\xe7\xf2\x35\xf3\x09\x4f" + "\x5c\x3d\xa9\xe5\x79\xe2\xea\x49\xc2\x3c\x71\x0d\x5b\xff\x6c\x75" + "\x88\x3d\x4f\x84\x6b\x04\x79\xe2\x5a\x36\xff\xbb\x7a\x12\x9f\x27" + "\x92\x36\x20\xd6\xf4\x17\xe7\x89\x6b\x8b\x48\xec\x59\xcb\x3e\x47" + "\x22\x3e\xb5\xe7\x89\x6b\x17\x37\xcf\x13\x09\x86\x98\x7e\x8a\xf2" + "\xc4\xb5\xc7\xec\x79\x62\x62\xb9\x30\x4f\x7c\x2f\x95\xc3\xd1\x7b" + "\x03\xf9\x3c\x71\x9d\x7b\xfb\xe0\x89\xa2\xd8\x0a\xe3\xf3\xc4\x75" + "\xe7\xa4\xf3\xc4\xf7\x3a\x48\xe3\x89\x18\x73\x42\x3c\xf1\xbd\xc9" + "\xb6\x98\xe3\xf3\xc4\xf7\x16\x09\xf3\xc4\xf7\xd6\xf3\x79\x22\x6e" + "\x5f\x88\x27\xbe\x77\x98\xd7\xbe\x1d\x4f\x7c\xef\x0c\x9f\x27\x92" + "\xf3\x38\x9e\x98\xc4\xee\x81\x95\xb8\x56\x3a\x4f\x4c\x9a\x2c\xce" + "\x13\x93\x6c\xf6\xbf\x4a\x62\xf7\xbf\x4a\x4a\x22\x3c\x31\x89\xdd" + "\xff\x2a\x71\x8d\xf5\x71\x8e\x27\x92\xe3\x1c\x4f\x4c\x4a\x73\xed" + "\xfd\xce\xe4\x09\x1c\xb7\x48\x9e\x20\xce\x2d\xd6\x0f\x76\xcc\x2d" + "\x36\xa7\x71\xdc\x62\x63\x3d\x19\xdf\x1b\x2f\x90\xf1\xbd\x91\x59" + "\x9f\x14\x5f\x04\xdc\xe2\xa9\x18\xcd\xfe\x1b\x79\x0c\xb7\x38\xb0" + "\xa0\x8e\x02\xbe\xe7\x66\xc6\xdc\x02\x78\xdd\xa6\x25\x98\x5b\x54" + "\xb2\xef\x77\x6e\xf4\x2d\x8a\xb5\xe6\x16\xeb\x37\x33\xef\x7a\x36" + "\xed\x5b\x5b\x89\xf0\xf7\x42\xef\x7e\x1e\x5b\xc0\xbe\xfb\x09\x6d" + "\x5b\xbf\xf3\xc9\xbc\x07\x7a\x03\xb8\xc7\x5c\xf0\x87\x15\xf7\x78" + "\xf0\xee\x27\x9e\xeb\x37\x5c\x92\xc7\x6b\x37\xe8\xf9\x9c\x23\xd9" + "\x64\xcf\x39\x36\x8e\x72\x9e\x73\x6c\x8c\x94\xc7\x39\x36\x46\x38" + "\xc7\x39\x36\x9e\x12\xe6\x1c\xeb\x87\x60\x7c\x0a\x73\x0e\xf2\x9d" + "\xfd\x5c\xb1\x39\x92\x9b\x2b\x36\x0f\x6c\xfb\x9c\x63\x53\x99\xf0" + "\xbc\xb0\xe9\x12\xe1\x1c\x1b\x0b\x5a\x9e\x73\x6c\x2c\x10\xe6\x1c" + "\x9b\xd9\xf8\xbf\xb1\xd0\x9e\x73\xc0\x35\x82\x9c\x63\x33\xfb\xfc" + "\x6f\x63\x01\x9f\x73\x90\x36\x20\x06\xed\x15\xe7\x1c\x5b\x46\x90" + "\x98\xb4\xc5\x87\xc4\x24\xe2\x53\x7b\xce\xb1\xf9\x6a\xf3\x9c\x83" + "\x60\x88\xe9\xa7\x28\xe7\xd8\xd2\xdf\x9e\x73\xac\x0f\x10\xe6\x1c" + "\xc9\x56\xeb\xb4\xb7\xe6\xf0\x39\xc7\x96\xa5\xed\x83\x73\x88\x62" + "\xab\x8c\xcf\x39\xb6\x06\x4b\xe7\x1c\x5b\xe3\xa5\x71\x0e\x8c\x39" + "\x21\xce\xb1\xf5\x94\x2d\xe6\xf8\x9c\x63\xeb\x65\x61\xce\xb1\xd5" + "\xc4\xe7\x1c\xb8\x7d\x21\xce\x91\xdc\x8b\xd7\xbe\x1d\xe7\x48\x1e" + "\xc5\xe7\x1c\xe4\x3c\x8e\x73\x24\x57\xb1\xba\xed\x92\x74\xce\x91" + "\x7c\x4a\x9c\x73\x24\x9f\xe1\x73\x8e\xe4\x2c\xc2\x2d\x92\x8d\x84" + "\x73\x24\xe7\xb3\x5c\x44\x6f\x7d\x9c\xe3\x1c\xe4\x38\xc7\x39\xb6" + "\x79\x4a\xc8\x4d\xa9\xa5\xbc\xfb\x99\x7b\x97\x9f\x9b\xb2\xe4\xa5" + "\x8c\x7d\x06\xbb\x35\xe5\xa6\x60\xae\x17\xdb\x47\x1d\xe7\xa6\xf0" + "\xdc\xcd\xe5\xa6\x2e\x30\xb1\x8a\xcb\x4d\xe9\x99\xdc\x14\xce\x4b" + "\x81\x66\x6f\xca\x4b\x99\xdf\xb5\x7f\xef\x33\xd7\x2c\x3d\x2f\x35" + "\x6b\x91\x0a\xed\x66\xe6\xef\x9f\x0f\x91\xbc\x54\x59\x53\x5e\x0a" + "\xcf\xdb\xa6\x5a\xfb\xbc\x14\x9e\xaf\xb9\xbc\xd4\xcf\x32\xf3\x52" + "\xef\xef\x91\x37\x7f\xbf\xdf\x06\xde\x7f\x6b\x8f\xef\x7d\x6e\xd3" + "\x70\xcf\x8e\x53\x64\xbe\xff\x96\xe2\xf0\xfd\xb7\x07\xeb\x9a\xc5" + "\x6c\xff\x7e\x15\x67\xfb\xd4\x1d\xf2\x6c\x9f\x9a\x76\xff\x6d\xdf" + "\x1e\xd7\x4c\xa4\x84\x71\xb6\xff\x50\x66\xfd\xb7\x0f\xd5\xf2\x73" + "\xe1\x19\x9e\x9c\x5e\xcd\xf0\xb4\xd6\xab\x05\x23\xad\xf5\xea\x87" + "\x57\x1d\xeb\xd5\xf4\x49\x9c\x5e\xdd\x79\x98\x70\xc3\x9d\x3b\x08" + "\x37\xdc\xc9\xec\x49\x16\x3f\x02\x31\x3a\xd5\x88\x35\xeb\x5b\x75" + "\xd4\xfe\x6b\x3a\xca\xb8\x8a\x68\xd5\x12\x63\x21\x2a\x32\xd4\xa1" + "\x8d\x4b\x90\xdb\xfa\x1b\xc8\xed\xb3\x5b\x75\x94\xf7\x3c\xe4\x01" + "\xf3\x04\x70\xa9\x42\xe0\x16\xbb\x50\x54\x02\xd6\xb1\x3b\xce\x94" + "\x44\x19\xac\x74\x6c\xda\x44\x4e\xc3\xc2\x79\x51\x75\xe8\x9b\xb7" + "\x74\x14\xd6\xaa\x8d\xa9\x91\xaa\xc6\xbe\x83\x49\xcd\x22\xeb\x7c" + "\x39\xfc\xb6\x66\x16\x3f\x5f\xde\x90\x1a\xa9\xae\xcf\x1d\xec\xc6" + "\xd4\x43\xec\xc9\xe5\xcd\x9d\xcd\x97\x7f\xd4\x80\xd4\x96\x7a\x88" + "\x78\x5e\x6c\x7f\xf9\xf2\x54\x3d\x97\x2f\xdf\xb1\x4b\x5e\xbe\x7c" + "\x47\x3a\x5f\xbb\x66\x1c\xb1\xd7\xae\x3b\x15\xce\x6b\xd7\x9d\x32" + "\xdf\xff\xdf\xe9\xef\x9c\x76\xdd\xb9\xd6\x56\xbb\x66\x27\x60\xed" + "\xfa\x61\x35\xc6\xaa\xb0\x76\x25\xdf\xd9\x6b\x8e\xf4\x9e\x9c\xe6" + "\xf8\xe8\x66\xdb\xd7\xae\x1f\xa5\x08\xeb\x8b\x8f\x76\x11\xed\xba" + "\x73\x4d\xcb\x6b\xd7\x9d\x6b\x84\xb5\x6b\xba\x0f\xe1\xf9\x3b\xd7" + "\x58\x74\x28\xa7\x5d\xe1\x1a\x41\xed\x9a\x3e\xca\xf6\x1a\xa2\x5d" + "\x77\x26\x11\xed\x9a\x3e\x47\x5c\xbb\xa6\xb3\xf5\xd2\xd2\x8b\x48" + "\x7c\x22\x3e\xb5\xd7\xae\xe9\x7b\x9b\xd7\xae\x04\x43\x4c\x3f\x45" + "\xb5\x6b\xfa\x75\x7b\xed\xfa\x61\x95\xb0\x76\xdd\x7d\x92\xc3\xd1" + "\xee\x70\xbe\x76\xdd\x35\xb0\x7d\x68\x57\x51\x6c\xa5\xf0\xb5\xeb" + "\x6e\x77\xe9\xda\x75\xf7\x60\x69\xda\x15\x63\x4e\x48\xbb\xee\x5e" + "\xcb\xe2\x27\x49\x58\xbb\xee\xde\x23\xac\x5d\x77\x1f\xe1\x6b\x57" + "\xdc\xbe\x90\x76\xdd\x7d\x99\xd7\xbe\x9d\x76\xcd\x50\xf0\xb5\x2b" + "\x39\x8f\xd3\xae\x19\x59\x24\x86\x7e\xb8\x4d\xba\x76\xcd\x58\x2b" + "\xae\x5d\x33\x36\xf3\xb5\x6b\x46\x28\xd1\xa8\x19\xf9\x44\xbb\x66" + "\xc4\x90\xe3\x1f\x26\x5b\x1f\xe7\xb4\x2b\x39\xce\x69\xd7\x8c\x02" + "\x09\xda\xd5\xaf\x85\xb4\xab\x47\xfb\xd2\xae\xe5\x31\xad\xab\x5d" + "\xf7\xcc\x94\xa7\x5d\xf7\xcc\x70\x92\xc3\xab\x9b\xe1\xf0\x6e\xff" + "\x7f\x71\xf8\x8c\x72\x8e\xc3\x7f\x7c\x5e\x1e\x67\xf9\xb8\xec\x7e" + "\xdb\xbe\xfd\xd9\x7d\x4f\x16\x67\xf7\xac\x89\xf2\xec\x9e\x35\xe1" + "\x81\x6e\x95\x63\xfb\x4f\xac\xf2\x35\x7b\x65\xae\x7f\xde\x5b\x28" + "\x5f\xb7\xe6\x56\x71\xba\x35\xb7\xca\x5a\xb7\x7e\xc7\x7b\xce\xfa" + "\xe9\x1e\xc7\xba\xf5\xf3\x7e\x9c\x6e\xcd\xd9\x46\x78\x61\x0e\xbb" + "\xde\x36\x87\xe1\x5b\x71\x87\x89\x6e\xbd\x8b\x75\xeb\x15\xd0\xad" + "\x6f\x84\x52\x46\xb6\x06\x3f\x5e\x97\x55\x04\xda\x13\x6b\xd5\x92" + "\x58\xf8\x7f\x8c\x01\x6d\x8c\x46\x6e\x1b\x40\x73\xe6\xc0\xfc\x95" + "\xb3\xc4\x40\x25\xbd\x05\xb1\xbf\x2c\x17\x79\x47\x80\x9e\xbd\x85" + "\xf5\xec\x09\xd0\xaa\x6b\x59\x3d\x9b\x9d\x5b\x12\x63\xad\x67\xff" + "\xfa\x24\xa3\x67\x0d\x64\xcd\x57\x49\x0c\xe8\x59\xf8\x3d\x5c\xd3" + "\xdf\x5a\xcf\xd6\x83\x5e\x6d\x00\xbd\x9a\x7c\xcd\x46\xdb\xbe\x61" + "\xaf\x6d\xeb\x7d\x23\xfd\xea\xfa\x0e\xf6\xc0\xda\xf6\xee\xde\xff" + "\x1f\xb5\x6d\x56\x1a\xa7\x6d\xb3\x97\xca\xd3\xb6\xd9\xb1\x7c\x6d" + "\xbb\x3f\xd5\x5e\xdb\x66\x5f\x70\x5e\xdb\xe6\x28\xe4\x8d\x19\xbc" + "\x1c\xd7\x19\x6d\x9b\x33\xc7\x56\xdb\x7e\xca\x3c\x97\xfd\x34\x0b" + "\xe3\x59\x58\xdb\x92\xef\xec\x35\xc9\xe7\x0a\x4e\x93\x7c\x56\xd4" + "\xf6\xb5\xed\x67\x51\xc2\xfa\xe3\xb3\xa5\x44\xdb\xe6\x84\xb6\xbc" + "\xb6\xcd\x09\x15\xd6\xb6\x9f\xb1\xeb\xff\x73\x42\xed\xb5\x2d\x5c" + "\x23\xa8\x6d\x3f\x7f\xd2\xf6\x1a\xa2\x6d\x73\xc2\x88\xb6\xfd\x7c" + "\xa8\xb8\xb6\xfd\xfc\x3c\x89\x61\x9f\xe7\x90\x18\x46\x7c\x6a\xaf" + "\x6d\x3f\x5f\xd9\xbc\xb6\x25\x18\x62\xfa\x29\xaa\x6d\x3f\x3f\x65" + "\xaf\x6d\x3f\xcd\x14\xd6\xb6\xb9\x7b\x38\x1c\xe5\x8e\xe0\x6b\xdb" + "\x7d\x3e\xed\x43\xdb\x8a\x62\x2b\x8a\xaf\x6d\xf7\x5d\x92\xae\x6d" + "\x73\x7d\xa5\x69\x5b\x8c\x39\x21\x6d\x9b\x3b\x87\xc5\x4f\x98\xb0" + "\xb6\xcd\x8d\x17\xd6\xb6\xb9\xa9\x7c\x6d\x8b\xdb\x17\xd2\xb6\xb9" + "\xc7\x79\xed\xdb\x69\xdb\xdc\x0b\x7c\x6d\x4b\xce\xe3\xb4\xed\x7e" + "\x36\x86\x7e\x1a\x2c\x5d\xdb\xee\x9f\x23\xae\x6d\xf7\x47\xf2\xb5" + "\xed\xfe\x21\x44\xc3\xee\x4f\x21\xda\x76\xff\x04\x72\xfc\xd3\x20" + "\xeb\xe3\x9c\xb6\x25\xc7\x39\x6d\xbb\x3f\x4b\xda\x73\x59\x97\xea" + "\x1e\xb9\xb5\xfe\x3b\x03\x2d\x55\xf7\xc8\xf2\x6c\xb6\xb5\xde\x19" + "\xc8\x1b\x2a\x4f\xdf\xe6\x39\xac\xff\xf2\x40\x63\x09\xf1\xfc\xfd" + "\xf9\x1c\xcf\x3f\x78\x58\x1e\x67\x39\x78\xe8\x81\xc6\x92\x63\xfb" + "\xbc\x35\x9c\xed\xff\xde\x5f\x9e\xed\xff\xde\x4f\xbe\xc6\xfa\x4a" + "\xcb\x69\xac\xaf\xb4\xe2\xcf\x06\x0f\xb9\x3b\xd6\x58\xf9\x51\x9c" + "\xc6\xfa\xe2\x0c\xe1\x27\x5f\x1c\x26\xfc\xe4\x8b\xc5\x2d\xf7\x6c" + "\xf0\xf0\x75\xfe\xb3\xc1\x43\xf3\x1f\x3c\x1b\x6c\x09\xfd\x74\xd0" + "\xc8\xe9\xa7\xc3\x47\xe4\xe9\xa7\xc3\xf9\x7c\xfd\xf4\xd5\x39\x7b" + "\xfd\xf4\x45\x0f\xe7\xf5\xd3\x17\x23\xe4\x8d\x87\x2f\x86\x3b\xa7" + "\x9f\xbe\xd8\x23\xfc\x6c\xf0\x90\x87\xf8\xb3\x41\xf2\x9d\x3d\xef" + "\xcd\x1f\xc1\xf1\xde\x7c\xaf\xb6\xaf\x9f\xfe\x91\x27\xcc\x71\xff" + "\x71\x84\xe8\xa7\x2f\x32\x5b\x5e\x3f\x7d\x91\x29\xac\x9f\xf2\xd9" + "\xf7\x5f\xbf\xc8\xb4\xd7\x4f\x70\x8d\xa0\x7e\xca\x9f\x63\x7b\x0d" + "\xd1\x4f\x5f\x64\x11\xfd\x94\x1f\x2f\xae\x9f\x8e\x74\x25\xf1\x29" + "\xff\x2a\x89\x4f\xc4\xa7\xf6\xfa\x29\xff\x78\xf3\xfa\x89\x60\x88" + "\xe9\xa7\xa8\x7e\x3a\xd2\xc1\x5e\x3f\x1d\x72\x13\xd6\x4f\x5f\x5e" + "\xe2\x70\xf4\xe5\x4a\xbe\x7e\x3a\x32\xb1\x7d\xe8\x27\x51\x6c\xe5" + "\xf1\xf5\xd3\x97\x4f\x4a\xd7\x4f\x5f\x4e\x96\xa6\x9f\x30\xe6\x84" + "\xf4\xd3\x97\x7b\x58\xfc\x64\x09\xeb\xa7\x2f\x8f\x09\xeb\xa7\x2f" + "\xcf\xf1\xf5\x13\x6e\x5f\x48\x3f\x7d\xa5\xe0\xb5\x6f\xa7\x9f\xbe" + "\xea\xc1\xd7\x4f\xe4\x3c\x4e\x3f\x7d\xa5\x23\x31\xf4\xef\xb9\xd2" + "\xf5\xd3\x57\x7b\xc4\xf5\xd3\x57\x39\x7c\xfd\xf4\x55\x1c\xd1\x49" + "\x5f\x9d\x25\xfa\xe9\xab\x64\x72\xfc\xef\xfb\xac\x8f\x73\xfa\x89" + "\x1c\xe7\xf4\xd3\x57\x95\xd2\xf4\x93\xf3\x75\x91\xee\xff\xba\x56" + "\x4d\x3b\x5d\xd7\x7a\x6c\xa9\x3c\xed\x74\x2c\xf6\x01\x87\x97\xc3" + "\xe1\xbf\xaa\xe3\x38\xfc\xd7\x32\xdf\xff\xfd\xba\x46\x3e\x87\xff" + "\xae\x9a\xe3\xf0\xdf\x55\x8b\x73\xf8\x6f\x4e\x39\xe6\xf0\x27\x06" + "\x70\x1c\xfe\xdb\x54\x32\x47\x7e\xbb\x94\xcc\x91\xdf\x0e\x6e\x39" + "\x0e\x7f\xfc\x20\x9f\xc3\xeb\xfa\x3f\xe0\xf0\x2d\xc1\xe1\x8f\x59" + "\xed\x77\x7c\x3c\x5e\x1e\x87\x3f\x1e\xc7\xe7\xf0\xdf\xef\xb0\xe7" + "\xf0\xc7\x2f\x39\xcf\xe1\xbf\x75\x97\x37\x1e\xbe\x75\x73\x8e\xc3" + "\x7f\x1b\x2e\xcc\xe1\xbf\x29\x14\xe7\xf0\xe4\x3b\x7b\xee\x75\xc2" + "\x9d\xe3\x5e\xff\x3c\xd3\xf6\x39\xfc\x3f\x63\x84\x79\xd6\x3f\xe3" + "\x09\x87\xff\x36\xac\xe5\x39\xfc\xb7\x61\xc2\x1c\xfe\x9f\x37\x09" + "\xdf\xf9\x36\xcc\x9e\xc3\xc3\x35\x82\x1c\xfe\x44\x4f\xdb\x6b\x08" + "\x87\xff\x36\x82\x70\xf8\x13\x23\xc4\x39\xfc\x89\x0b\x24\x3e\x9d" + "\xc8\x25\xf1\x89\xf8\xd4\x9e\xc3\x9f\x58\xdb\x3c\x87\x27\x18\x62" + "\xfa\x29\xca\xe1\x4f\x14\xd9\x73\xf8\x6f\x0a\x84\x39\xfc\x77\x7b" + "\x39\x1c\x7d\x37\x8a\xcf\xe1\x4f\xfa\xb6\x0f\x0e\x2f\x8a\xad\x18" + "\x3e\x87\x3f\x79\x59\x3a\x87\xff\xae\xab\x34\x0e\x8f\x31\x27\xc4" + "\xe1\xbf\x0b\x67\xf1\x13\x21\xcc\xe1\xbf\x5b\x29\xcc\xe1\xbf\xdb" + "\xc1\xe7\xf0\xb8\x7d\x21\x0e\xff\xdd\x49\x5e\xfb\x76\x1c\xfe\xbb" + "\x4b\x7c\x0e\x4f\xce\xe3\x38\xfc\xf7\x6b\x48\x0c\xfd\x66\x91\x74" + "\x0e\xff\x7d\xb8\x38\x87\xff\x7e\x3e\x9f\xc3\x7f\x3f\x9c\x70\xf5" + "\xef\xd3\x08\x87\xff\x7e\x12\x39\xfe\x4d\x94\xf5\x71\x8e\xc3\x93" + "\xe3\x1c\x87\xff\x3e\xfb\x41\xdd\xa4\xb6\x58\x37\xe9\xd4\x08\x79" + "\x3c\xfe\xd4\x70\xf9\x5c\xf2\x8c\x9a\xe3\x92\x67\xd4\xd6\x5c\x92" + "\x5f\xdb\xe0\xb4\xaf\x63\x2e\x59\x3c\x83\xe3\x92\x85\xc7\x48\xac" + "\x2e\xdc\x43\x62\x75\x21\xf3\x7c\x4f\x5a\xdd\xa4\x1f\xce\xf3\xeb" + "\x26\x9d\x0e\x7f\x50\x37\x49\x2e\x4f\xfc\xfe\x28\xc7\x13\x7f\xd8" + "\x2b\x8f\x27\xfe\x90\xc5\xe7\x89\x67\x8e\xdb\xf3\xc4\xc2\x0e\xce" + "\xf3\xc4\xc2\xbe\xf2\x78\x62\x61\x1f\xe7\x78\x62\xe1\x66\xe1\x1a" + "\x06\xa7\xfd\xc4\xeb\x26\x91\xef\xec\xe7\xf7\xe2\xbe\xdc\xfc\x5e" + "\x54\xdf\xf6\x79\x62\x51\xba\xf0\x5c\x5e\xb4\x97\xf0\xc4\xc2\x4d" + "\x2d\xcf\x13\x0b\x37\x09\xf3\xc4\xe2\xae\x64\x4e\x2d\x4c\xb6\xaf" + "\x61\x00\xd7\x08\xf2\xc4\xe2\xb1\xec\x35\x9b\xf8\x3c\x91\xb4\x01" + "\xb1\x26\x52\x9c\x27\x96\xb8\x93\xd8\x53\x7c\x8e\xc4\x1e\xe2\x53" + "\x7b\x9e\x58\x9c\xdb\x3c\x4f\x24\x18\x62\xfa\x29\xca\x13\x8b\xef" + "\xd8\xf3\xc4\xd3\x6a\x61\x9e\x58\x6a\x55\xa7\xb5\x74\x3e\x9f\x27" + "\x96\x0c\x6d\x1f\x3c\x51\x14\x5b\xe9\x7c\x9e\x58\xea\x25\x9d\x27" + "\x96\x8e\x90\xc6\x13\x31\xe6\x84\x78\x62\xe9\x66\x5b\xcc\xf1\x79" + "\x62\x69\x8e\x30\x4f\x2c\x3d\xce\xe7\x89\xb8\x7d\x21\x9e\x58\x7a" + "\x9d\xd7\xbe\x1d\x4f\x3c\xd3\x81\xcf\x13\xc9\x79\x1c\x4f\x3c\xb3" + "\x8f\xc4\xd0\x53\xc7\xa4\xf3\xc4\x33\x9b\xc5\x79\xe2\x99\x54\x3e" + "\x4f\x3c\x13\x41\xf8\xe0\x19\x1d\xe1\x89\x67\xe2\xc8\xf1\x53\x47" + "\xad\x8f\x73\x3c\x91\x1c\xe7\x78\xe2\x99\x52\x69\xef\x81\xb4\x48" + "\xae\xb7\x95\xde\x03\x69\xa9\x5c\x6f\x6b\xbf\x07\xf2\x2f\x99\xf5" + "\xef\xff\xe5\x6c\xfd\xfb\x07\xeb\x64\x9a\xf2\xbc\x67\x2a\xb9\x3c" + "\xef\xd9\x0b\xf2\xf8\xca\xd9\x72\xf9\xdc\xbc\xdc\x6a\xff\xde\x72" + "\xde\xfe\xbd\xfc\xf5\xf0\xe7\x0e\x3a\xe6\xe6\x3f\x5b\xed\xdf\x5b" + "\xc6\xee\xdf\x5b\xc6\xee\xdf\x5b\x36\x54\xce\x7a\xf8\x0d\xb7\x90" + "\xdb\x46\xdb\xf5\xf0\x67\x8f\x91\xf5\xf0\xd1\xb6\xeb\xe1\x7f\x3a" + "\xcc\x5f\x0f\xff\xef\xfe\x62\xeb\xe1\x71\xde\xb7\x31\x77\x30\xb3" + "\x16\x5e\x70\x1d\xfc\xb4\x96\x5d\x07\x8f\xb1\xf9\xd1\x32\xc2\xed" + "\x77\xb6\x4b\x6e\xff\x2f\xab\xda\xf9\x3f\xc9\xdc\xff\xf7\xa7\x44" + "\x3e\xb7\xbf\x20\xb0\xff\xef\x4f\x12\xf6\xff\x2d\x93\xb9\xff\x6f" + "\x99\x93\xfb\xff\x96\xd9\xed\xff\x4b\xd6\xc1\x9f\x3b\x24\xbe\x0e" + "\x9e\x7c\x67\xcf\xc9\x7e\xb6\xaa\x2b\x75\xbe\x1d\xec\xff\x7b\x5e" + "\x64\x8f\xd6\xf3\xec\xfe\xbf\x65\xf7\x60\xff\xdf\x32\x91\xfd\x7f" + "\xcf\xb3\xfb\xff\x96\x35\xed\xe5\xcb\x71\xfb\x32\x91\xfd\x7f\x7f" + "\xee\x65\x7b\x0d\xe1\xf6\x65\xec\xfe\xbf\x3f\x3b\xd8\xff\xf7\x67" + "\x76\xff\xdf\x9f\xd9\xfd\x7f\x89\x4f\xed\xb9\xfd\xcf\x4e\xec\xff" + "\x5b\xc6\xee\xff\x5b\xe6\x60\xff\xdf\x9f\x05\xf6\xff\x3d\x97\x27" + "\xcc\xed\xcb\xad\xf6\xff\x2d\xb7\xd9\xff\xf7\x97\x76\xb2\xff\xaf" + "\x28\xb6\x6c\xf6\xff\xfd\x45\xc6\xfe\xbf\xe5\x12\xf7\xff\x2d\x13" + "\xd9\xff\xb7\x9c\xdd\xff\xb7\x4c\x64\xff\xdf\x72\x91\xfd\x7f\xcb" + "\x6d\xf6\xff\x2d\x13\xd9\xff\xb7\xfc\x14\xaf\x7d\x3b\x6e\x5f\x6e" + "\xb3\xff\x6f\x99\xcd\xfe\xbf\x17\xd8\xfd\x7f\xcf\x4d\x95\xce\xed" + "\x2f\x38\xd8\xff\xf7\x82\xcd\xfe\xbf\x17\xd8\xfd\x7f\x2f\xb0\xfb" + "\xff\x5e\x60\xf7\xff\x3d\x17\x62\x7d\x9c\xe3\xf6\xe4\x38\xc7\xed" + "\x2f\x48\xd9\xff\x57\x2d\x25\x07\x7c\xff\xd7\x71\xa8\xda\xe9\x3a" + "\x8e\x8b\x32\xf3\xbf\x17\x5d\xc8\xff\xfe\xda\x8f\xe3\x98\xbf\xf6" + "\x13\x5f\x4b\xa0\x6f\x26\xff\x5b\x19\xcb\x71\xcc\x0a\xf6\x7d\xa5" + "\x8a\x63\x24\x4e\x57\xc4\x3b\xbb\x96\x60\xc3\x5d\x96\x57\x5a\xd6" + "\x12\x2c\x61\xd7\x12\x00\xb7\x24\x5c\xf2\xd2\x1d\xfe\x5a\x02\x7d" + "\xbc\xd8\x5a\x02\xc1\x35\x04\x36\xfc\xd1\xc2\x35\xe5\xae\x21\x68" + "\xff\xfc\xf1\x82\xd5\x1a\x82\x4b\xc7\xe5\xf1\xc7\x4b\x3a\x3e\x7f" + "\xfc\xf5\x82\x3d\x7f\xac\xe8\xe9\x3c\x7f\xac\x08\x96\xc7\x1f\x2b" + "\x82\x9c\xe3\x8f\x15\x39\xc2\x6b\x08\xf4\x7e\xe2\x6b\x08\xc8\x77" + "\xf6\xf3\x7e\x65\x30\x37\xef\x57\xfa\xb6\x7d\xfe\xf8\xdf\x7c\xe1" + "\x39\xfe\xbf\xc7\x09\x7f\xac\xc8\x6e\x79\xfe\x58\x91\x2d\xcc\x1f" + "\x2b\x07\x92\xb9\xb6\x22\xdb\x9e\x3f\xc2\x35\x82\xfc\xb1\x32\xd2" + "\xf6\x1a\xc2\x1f\x2b\xf6\x11\xfe\x58\xb9\x56\x9c\x3f\x5e\x7e\x92" + "\xc4\xa5\xca\x9b\x24\x2e\x11\x9f\xda\xf3\xc7\xca\x53\xcd\xf3\x47" + "\x82\x21\xa6\x9f\xa2\xfc\xf1\xb2\x8f\x3d\x7f\xd4\x8b\xe4\x86\xaf" + "\x5c\xe5\x70\x74\x65\x3d\x9f\x3f\x5e\x9e\xda\x3e\xf8\xa3\x28\xb6" + "\xf2\xf9\xfc\xf1\x4a\x2f\xe9\xfc\xf1\xca\x4c\x69\xfc\x11\x63\x4e" + "\x88\x3f\x5e\xc9\x61\xf1\xb3\x4f\x98\x3f\x5e\x39\x29\xcc\x1f\xaf" + "\x5c\xe0\xf3\x47\xdc\xbe\x10\x7f\xfc\xb5\x03\xaf\x7d\x3b\xfe\xf8" + "\x6b\x4f\x3e\x7f\x24\xe7\x71\xfc\xf1\xd7\x02\x12\x43\x2f\xca\xc8" + "\x0d\xff\x9a\x23\xce\x1f\x7f\x3d\xc8\xe7\x8f\xbf\xb2\xb5\xf3\x7f" + "\x2d\x27\xfc\xf1\xd7\x34\x72\xfc\xe2\x51\xeb\xe3\x1c\x7f\xbc\x68" + "\x93\x1b\xfe\xb5\xda\x11\x7f\xa4\x53\xbc\xea\x92\x29\x73\x1e\x7c" + "\xf2\xa1\x9f\x5d\x61\x1e\xd3\xc1\xff\x0b\x60\x3e\xf2\x81\xff\x97" + "\x8a\xf1\x15\x83\xaf\x57\x9d\x19\xb8\x87\x19\x7e\xa7\xc4\xf0\x9b" + "\x4e\xd7\xcd\x08\xbf\x5d\xc5\xee\xd9\xe2\x55\xe7\x6d\x7c\x38\xc8" + "\x4c\x47\x20\x5a\x0d\xff\x8f\x85\x63\x70\x7e\x27\x98\xf7\x34\x4b" + "\x50\xa7\x1b\x54\xd5\x26\xcb\x79\xd0\xe7\x4e\x15\x54\x55\x30\x6e" + "\xa3\x76\x43\x55\x1a\xdc\x4f\x9d\x68\x5f\xa1\xad\xf1\x39\x8f\xa3" + "\x78\x23\xfd\xab\x6e\xc1\x2d\x54\x49\x55\x5d\xf2\xae\x7e\x38\x08" + "\xe2\x10\xc2\x7c\x2f\xaf\x9b\xc1\x0d\xb7\xa9\x5b\xd0\x80\xbf\x3b" + "\x81\xbf\x33\x41\x1f\x13\xe6\x23\x6a\xcb\xad\x87\x3d\x80\x57\xb9" + "\xaf\xa8\xa1\xab\x16\x1a\xa1\xcf\xb1\x46\xf4\xcd\xe3\x65\x6e\x07" + "\x76\x96\x31\x73\x4f\x71\x8d\x89\x69\x43\xb3\x80\xe9\xcf\xe5\xdd" + "\x70\xbe\x50\x1f\xd6\xee\x47\x7d\xdc\x7b\xd1\x7a\x69\xf3\xdd\xd5" + "\x00\x31\x3b\x7a\xaf\x7c\x1c\xe9\x9e\x05\xdb\x69\x10\x25\xf4\xbd" + "\xc4\xdf\xc9\x74\xc0\x2f\x3d\x3e\xe8\x42\xd7\xac\xd8\x81\xa8\xad" + "\xe6\x87\x3d\xfe\x09\x31\x31\x63\x3b\x6d\xa8\xdd\x70\xcd\x53\xaf" + "\xf8\x4f\x1f\x6c\xf3\xd5\xf0\xfd\xd6\x2e\xb4\xe1\xf6\x2a\x8c\x9b" + "\x6b\xfe\xc7\x61\x6e\xb7\xf5\x45\x74\xd8\xfc\x39\x9a\x98\xc8\xf9" + "\xe1\x0b\x17\xc7\x68\x7a\x86\x3d\x82\x26\x2d\x5c\xa8\x99\x3f\x67" + "\xc1\x52\x8d\xf5\x37\x2f\x6a\xc2\x22\xdf\x99\x33\x77\x5e\x78\xdf" + "\xf9\xaf\x47\x3d\x02\x7d\x42\x56\xfd\x50\xe3\xbe\x98\x37\x5c\xeb" + "\xb7\xfb\x7d\x84\x3e\xe8\x8c\xdc\x70\xbf\xe0\xf7\x52\xf4\x6e\xbd" + "\xe3\xf0\xef\x6d\xd9\x4e\xd7\x50\x70\xce\x0a\x88\x69\x5b\x13\x1e" + "\x86\x73\xaf\x66\x66\x40\xbf\x76\x43\xbf\xa1\x8f\xb8\xcf\x3a\x4b" + "\x9f\x2d\x98\x58\x81\x31\x91\x70\x0b\x30\x78\xed\x92\x77\xdd\xc3" + "\x81\x34\x1d\x82\xef\xaf\x06\xc6\x8a\xe2\x0a\xf5\xbf\xa5\x8c\x06" + "\x48\xf5\xaa\x83\x6b\x8d\x16\x8c\x99\x53\xa6\x24\xd3\xdb\xbd\x74" + "\xc0\x1d\x15\xb5\x74\xc4\x9f\x00\x9b\x70\xfd\xff\x82\x9f\x47\x28" + "\x91\xae\x0d\x61\xf6\x1f\xa0\x6b\x01\xc3\x04\xa7\xf0\x5d\x75\xf7" + "\xdb\x14\x1a\x56\xbb\xe1\x7f\xc3\xf5\x68\xdb\x51\xdc\x86\x1e\x8e" + "\x61\x9b\x9b\x33\x63\x54\x93\xb5\x28\xf1\x99\x44\x94\x58\x8b\xaf" + "\xc9\x1a\x58\xe5\x1d\x83\x14\xe3\x63\xe9\x8b\x10\x77\x14\xf4\x93" + "\x31\x2a\x7a\xef\xc0\x2a\x3d\xf5\x3f\x7f\x73\xea\x94\x64\xb8\x9f" + "\x6a\x68\x27\x49\xaf\xf0\x1b\x82\xdb\xd9\xba\x9d\xb1\x7d\x35\xbe" + "\x77\xb0\x0f\x68\x19\x5a\x47\xaf\x62\xc7\x50\xf2\x73\xd9\xe6\xe4" + "\x15\x79\x25\x6e\x77\xd1\x78\x23\xdd\x48\x6f\x7b\x2e\xbb\xb8\xa6" + "\x06\x62\x5a\xd4\xeb\xf4\x23\xd7\x46\x78\x1b\x23\xc3\x33\x3a\xc3" + "\x58\xdc\xb6\x22\x8f\xde\x16\x94\x38\xb9\x17\x52\x41\xdb\x95\x16" + "\x7b\x82\x2d\xdd\xa4\xe1\xe8\x7f\x4c\x4d\x17\x8c\x07\xe8\x0f\x8b" + "\x87\xea\x01\xc7\x63\xec\xf1\xd0\x34\x36\xb7\x8f\x46\x46\x3a\x24" + "\xb0\x31\x65\x74\x00\xad\x1e\xed\x9f\x70\x19\x3d\x84\x6d\x5b\x0c" + "\x7c\x7f\xcb\x12\xe4\xb7\x79\x16\xd2\xcc\x5e\xaa\x42\x86\xd4\xd1" + "\x1a\xef\x95\x89\x0a\xb0\x09\x05\xf1\xa5\x1f\xc4\xcc\x7e\x8d\x5d" + "\xa6\x24\xc7\x85\x23\x2a\xb7\x22\x8f\xc2\x3c\x19\xaf\x0b\x01\x5b" + "\xdf\xd9\x0d\xd7\xd1\xbf\x85\x20\xec\x0f\xc6\x17\xbf\x45\xa0\xb1" + "\xa0\xbc\xf1\x33\x8e\x2b\xd4\xf5\x5e\xbb\xa0\x4d\x69\xf7\x55\xcd" + "\xf0\x5f\x13\xf8\xea\x79\xf0\x53\x49\xa5\x89\x69\x93\xf1\xd5\x3c" + "\xce\x57\xc7\xa0\x1f\x9c\xbf\xaa\xf3\xb0\x5f\x45\xee\x39\x91\xbd" + "\xe7\x7c\xb8\xe7\x2c\x07\xf7\x9c\x49\xee\xd9\xfd\x96\xe3\x7b\xbe" + "\x7e\xd5\xf1\x3d\xdf\xe8\x21\xfd\x9e\xaf\x1f\x92\x7e\xcf\xd7\xb3" + "\xc4\xef\x39\x90\xf5\x73\x20\xf8\x39\xd0\x81\x9f\x03\x59\x3f\x77" + "\xac\x70\x7c\xcf\x37\x2e\x38\xbe\xe7\xdf\x7c\xa4\xdf\xf3\x8d\x6c" + "\xe9\xf7\x7c\x23\xcd\xc1\x3d\xb3\x7e\x0e\x04\x3f\x07\x3a\xf0\x73" + "\x20\xeb\x67\x9f\x1f\x1d\xdf\xf3\x6f\x67\x1c\xdf\xb3\xc1\x5d\xfa" + "\x3d\xff\x96\x2e\xfd\x9e\x7f\xdb\x24\x7e\xcf\x41\xac\x9f\x83\xc0" + "\xcf\x41\x0e\xfc\x1c\xc4\xfa\x79\xd0\x06\xc7\xf7\x6c\x38\xd9\xcc" + "\x3d\xd7\x4b\xbf\x67\x43\xb2\xf4\x7b\x36\x24\x3a\xb8\x67\xd6\xcf" + "\x41\xe0\xe7\x20\x07\x7e\x0e\x62\xfd\x3c\xfd\x25\xc7\xf7\x7c\xf3" + "\x88\xe3\x7b\xbe\x79\x5d\xfa\x3d\xdf\x5c\x23\xfd\x9e\x6f\xc6\x88" + "\xdd\x73\x03\xc4\x6d\x4f\xb8\x97\xc6\x9f\x42\x02\x4d\xea\xd1\x7d" + "\x3c\x2b\x11\x95\xbe\xca\x1c\xe1\x5d\x85\x3a\xc0\xbd\x45\xd0\xdb" + "\xa7\x86\xe2\x7f\xcd\xea\xd1\xda\x06\xf5\xe8\x80\xfa\x2e\x5e\xba" + "\xe5\x33\xd1\x43\x98\x8f\xaf\x37\x23\x3f\x73\xca\x68\xff\x4d\x7f" + "\x46\x9a\x15\x06\xa4\x2a\x4e\xd0\xa3\x84\x28\xda\x50\x8c\x2e\x21" + "\xaf\x2a\xac\x3d\x7f\x46\x85\xd5\x05\x68\x41\x34\x4d\x5f\xa1\x6e" + "\x0f\xc6\xcf\x80\x81\x27\x27\x26\xff\x1b\x69\xe0\x37\xfa\xed\x86" + "\x0f\x6e\xc7\x7b\x0c\xcc\x9f\xdb\xa7\xce\xcd\x48\x40\x7e\x5f\xbf" + "\x55\x85\xf0\xf1\x5d\xf0\x31\x6d\x9f\x92\x9c\x30\x13\x51\xfb\x6f" + "\x95\x51\x64\x6e\xbe\xed\x6e\x3b\x37\x8f\x99\x03\xb6\x9c\xcb\x7c" + "\x37\x31\xfd\xcf\x52\x6d\x79\xab\xd4\x32\x77\x33\xb6\x2c\x37\x91" + "\xf9\xde\x66\xee\xfe\x1a\x7e\x9f\xb3\xe5\x2d\x1d\xb6\x25\x9d\x32" + "\x7a\x78\x49\x55\x03\xd6\x4d\xaa\x2b\xb1\x88\x82\xe3\x51\xc5\x51" + "\xb7\x90\x88\x8d\x13\xad\x6c\xbc\xcf\xb3\xd2\xfd\x96\x88\x8d\xb3" + "\xc1\xc6\xf9\x02\x36\xce\x72\xce\xc6\x35\xbb\x5c\xb7\x71\x4d\xa4" + "\xb8\x8d\x6b\x0e\x4b\xb7\x71\xcd\x00\xe9\x36\xae\xf1\x67\x6d\xac" + "\xe3\xdb\xf8\xf6\x59\x71\x1b\x07\x5a\xe1\x38\x10\x70\xdc\xb1\x42" + "\xd8\xc6\x81\x80\xe3\x40\x01\x1c\x07\x3a\x89\xe3\xbb\x0a\xd7\x6d" + "\x7c\xa7\x48\xdc\xc6\x77\xbb\x4a\xb7\xf1\x9d\x34\xe9\x36\xbe\x93" + "\x44\x6c\x1c\x68\x83\xe3\x3b\x01\x0e\x6c\x6c\x85\xe3\x40\xc0\xb1" + "\xcf\x8f\x22\x36\x06\x1c\x07\x0a\xe0\x38\xd0\x49\x1c\xd7\x86\xbb" + "\x6e\xe3\xda\xfe\xe2\x36\xae\x8d\x97\x6e\xe3\xbb\x46\xe9\x36\xbe" + "\x5b\xcd\xda\xd8\x06\xc7\x77\xd3\xc5\x6d\x1c\x64\x85\xe3\x20\xc0" + "\xf1\xa0\x0d\xc2\x36\x0e\x02\x1c\x07\x09\xe0\x38\xc8\x49\x1c\xd7" + "\x9d\x72\xdd\xc6\x75\xa9\xe2\x36\xae\xbb\x24\xdd\xc6\x75\xa1\xd2" + "\x6d\x5c\x37\x81\xd8\x38\xc8\x06\xc7\x75\xc8\x81\x8d\xad\x70\x1c" + "\x04\x38\x9e\xfe\x92\x88\x8d\x01\xc7\x41\x02\x38\x0e\x72\x12\xc7" + "\x0d\x7d\x5d\xb7\x71\x7d\xbd\xb8\x8d\x1b\x46\x49\xb7\x71\xfd\x09" + "\xe9\x36\xae\x3f\xc4\xda\xd8\x06\xc7\xf5\x61\x62\x36\x6e\x04\x0d" + "\xe8\x05\x36\xf6\xaa\x46\xd4\x2e\x6c\xdb\x32\x62\x5b\x53\x97\xa9" + "\xa1\xbb\x28\x73\x04\xb6\x09\x93\x03\xfa\x9f\x5f\x27\x53\xca\xe8" + "\x3e\x34\x05\xf7\x94\x80\xf3\xae\x0d\xb9\xc6\x55\xa8\x93\x26\x01" + "\xe7\x7f\x8d\xcc\xfa\x00\x4d\xc2\xba\x0b\xf0\x7b\x4a\x9c\xf7\x32" + "\xa6\x7a\x66\x9a\x7c\x5f\x89\xba\x42\x35\x5e\xa6\x7b\x06\x20\xd0" + "\x5e\xc3\xe9\xb7\xfd\xd4\x25\xd5\x79\x60\x9f\xd3\xa8\xb8\xec\x4b" + "\x64\xee\x32\x75\xee\xf3\x46\xa4\xa5\xff\xa7\x55\x17\xc6\xe8\x91" + "\xe9\x75\x3f\xcf\x92\xd8\x02\x54\x12\xfb\x37\x34\xbe\x8a\xbe\x4b" + "\xff\x57\xeb\xd9\xe8\x3b\x3b\xdb\xe4\x3b\x75\xb8\x29\x35\x52\x6b" + "\xf4\x9d\x9d\x96\xbb\x44\x4f\x79\xd6\x21\xed\xbc\x4a\x9a\xde\x32" + "\x17\xb9\x6d\xa9\x40\x1e\x5b\xe7\x22\xcf\xad\x15\x48\x55\x58\x59" + "\x86\x8a\xae\x15\xa0\xa2\x5b\xe7\x51\xd1\x5d\xf8\x34\xc0\xc7\x0c" + "\x9f\xc4\xf3\xe0\x6b\x84\xc6\x5e\x47\x78\xef\x46\x43\xef\x72\xa4" + "\x2e\x34\x96\x21\xfc\xfe\xeb\x0d\xaa\x71\xa5\x67\x28\x52\xd3\xff" + "\xf5\x43\xf4\xeb\x7e\x14\x7c\xe7\x86\x8f\x97\x18\x0d\xa8\xb0\xb2" + "\x0e\x7f\x1f\x0a\xdf\xbb\xad\xa8\x84\xf6\xcd\x05\x78\x6f\x46\x43" + "\x61\xe2\x29\x64\xdc\x76\x34\x99\xc6\x1a\xba\xcb\x68\x94\x0c\xa6" + "\x36\xd3\x7e\x4f\x11\x1c\x18\x77\xec\x36\x4b\xf5\x75\x63\x1e\x63" + "\xe3\xb7\xfd\x3a\x83\x9d\xbb\x99\xdf\x0e\x51\x8d\x3b\x7f\x91\x2e" + "\xae\x29\x43\x38\x97\x50\x5c\x73\x1a\x95\xac\x31\xa3\xf1\x4b\x11" + "\x1a\x63\x42\x08\xdb\xa2\x24\xb6\x0a\x8d\x8b\x42\xde\x38\xff\x6c" + "\xfe\x9f\xb6\x73\x49\xa5\x01\xc5\x1b\xa1\x8f\x37\xea\x9a\xfa\x58" + "\xbc\xa6\x18\xc1\x77\xdd\x8a\x23\xf4\xc8\x33\x0a\xa9\xb0\x7d\x8d" + "\x29\xa3\xb5\xe3\x60\xfc\x2c\xa8\xa1\x69\x6c\x5b\x6c\x53\x6c\x5f" + "\xdc\x9e\xc5\xe6\x25\x61\x06\xb4\xa2\x0e\xa9\x4a\x12\xe0\xdf\x58" + "\xda\x50\x82\x6e\x22\xe8\x63\x0a\xed\x73\x34\x19\x70\x11\x86\xb1" + "\xa0\xa7\x1a\xb2\xc0\xff\x9d\x45\x30\x95\x45\x30\xe5\x7e\xcb\x09" + "\x4c\xed\xe3\x30\x65\x52\x70\x98\x32\x5f\x10\xc7\x94\x79\x30\x8b" + "\x29\x5d\xdb\xc4\x94\xe9\x9c\x63\x4c\x99\x0e\x39\xc0\x54\x3e\x60" + "\x2a\x91\x8f\x29\xf3\x75\xe9\x98\x32\xbb\xb5\x22\xa6\xb2\xe5\x61" + "\xca\x54\xc5\xc7\x94\xb1\x4e\x1c\x53\x81\x6c\x9c\xea\x58\xd1\x3c" + "\xa6\x02\xad\xe2\x14\x3d\xb9\x09\x53\x4a\x45\x7f\x51\x4c\x29\xd1" + "\x66\x82\xa9\xc0\xb6\x19\xa7\x94\xa8\x97\x43\x4c\x29\x91\x87\x38" + "\xa6\x02\x21\x4e\x05\xf2\xe3\x94\x52\x31\x42\x32\xa6\x94\x28\xa4" + "\xf5\x30\x15\x28\x2f\x4e\x29\xd1\x10\x3e\xa6\xe8\x31\x0e\x30\xc5" + "\xc6\x29\x9f\x1f\x9d\xc0\x14\x17\xa7\x94\x8a\x1c\x0e\x53\xca\xb5" + "\xe2\x98\xa2\x2e\xb1\x98\x6a\x9b\x71\x4a\x49\xc5\x3b\xc6\x14\x35" + "\xc3\x01\xa6\x20\x4e\x05\xf2\xe3\x94\x52\x99\x2a\x1d\x53\xd4\xbe" + "\x56\xc4\x94\xbc\x38\xa5\xa4\x92\x79\x98\x52\x2a\x32\xc5\x31\x15" + "\xc4\xc6\xa9\x41\x1b\x9a\xc7\x54\x10\x17\xa7\x94\x4a\x13\x87\x29" + "\xf7\xf3\xe2\x98\x72\x1f\x48\x30\x15\xd4\x46\xe3\x94\xdb\x19\xc7" + "\x98\x72\xcb\x13\xc7\x54\x10\xc4\xa9\x20\x9b\x38\xe5\x7e\x55\x3a" + "\xa6\xf0\x96\x39\xad\x85\xa9\x20\x99\x71\xca\xad\x92\x8f\x29\x65" + "\x8d\x03\x4c\xb1\x71\x6a\xfa\x4b\x4e\x60\xca\x2a\x4e\x3d\x34\x91" + "\xc3\x94\x47\x5f\x71\x4c\x3d\xbc\x9e\xc5\x54\x1b\x8d\x53\x0f\xf7" + "\x74\x8c\xa9\x87\xdd\x1c\x60\x0a\xe2\x54\x90\x4d\x9c\xf2\x18\x2a" + "\x1d\x53\x0f\x4f\x6a\x45\x4c\xc9\x8c\x53\x0f\x07\xf0\x31\xf5\x50" + "\x90\x18\xa6\x1a\xb0\xee\x53\x00\xa6\x22\x40\xf7\x01\x86\xbc\x4b" + "\x09\xa6\x1a\x01\x53\x1f\x59\x63\xea\x17\x1b\xdd\xa7\xf4\xd8\x6b" + "\x6e\xc2\xd4\x23\x07\x6d\x31\x65\x06\x4c\x35\x32\x98\xea\x70\xca" + "\xa2\xfb\x4a\xaa\x33\xc1\x57\xd7\x50\xc9\x04\xc0\xd3\x76\x16\x4f" + "\xbf\x00\x9e\xe0\x7e\xcc\x70\xbf\x85\xe5\x65\x68\xbc\x81\xdc\x57" + "\x03\xdc\xaf\xd9\x1a\x4b\x0d\x55\x14\xc6\x10\xc6\x8e\x05\x47\x45" + "\x0b\x00\x3f\xd1\x67\x50\xd1\x12\xf8\x2c\x83\x4f\x02\x7c\xd0\x19" + "\x54\x58\x85\x98\x9c\x3d\x87\x9f\x52\x16\x3f\x1d\xc2\x1d\xe3\xa7" + "\xc3\x48\x49\x1a\x4f\xf9\xc8\x71\xe9\xf8\xe9\x90\xc2\xae\xa5\x53" + "\x8d\x9f\x78\x91\xc6\x6b\x60\x09\x46\xae\xa1\xf1\x46\xe4\x4d\x4f" + "\xd7\x76\xf6\x0c\x41\xaa\xe5\x26\x44\x6d\x9e\x8b\x54\x9b\x7f\x86" + "\xfb\xb5\x8c\x9d\x0a\xe4\x79\xba\xee\x4b\x54\x78\xab\x0c\x15\xde" + "\x3d\x85\x0a\xcd\xf0\xb9\x06\x1f\xe8\xe3\xf8\x70\xeb\xfb\x35\xb0" + "\xf7\xfb\xc8\x64\x68\xcb\x5f\xfc\x7e\x1f\x19\xc0\xdc\x6f\x18\xdc" + "\x6f\x03\x77\xbf\x25\x80\x45\xf0\x4b\x37\x33\xab\x13\xc7\x1b\x50" + "\x87\x85\x46\x9a\x6e\x60\x31\x88\xfd\x72\xfa\x6c\x1d\x1a\x1f\x05" + "\xbe\x7a\x1d\x30\x58\x99\x8d\x56\xc4\x01\x06\x1b\xea\xf0\x73\x7d" + "\x43\x49\x62\x3d\x60\xb0\x43\x2c\x0d\x76\x6b\xc4\x18\xfc\x05\x63" + "\xd0\x23\xdd\x2c\x8e\xc1\x2c\x82\x41\xd0\x89\xcd\x63\xd0\x2a\xae" + "\x75\xec\xc5\x61\xd0\x6b\xa0\x38\x06\x3d\xc7\x5a\x74\xe2\xfd\xc7" + "\x60\xc7\xab\x8e\x31\xd8\xb1\x40\x92\x26\x54\x7a\x8d\x92\x8e\x41" + "\x4f\xbf\xd6\xc3\xa0\xe7\x79\xc7\x18\xf4\xcc\x77\x02\x83\xd9\xf2" + "\x30\xd8\xd1\xc8\xc7\x60\x47\x8d\x38\x06\x03\xd9\x38\x08\xba\xb2" + "\x59\x0c\x5a\xe9\x4a\xa5\x57\x2e\x87\x41\xef\x23\xe2\x18\xec\x74" + "\xc6\xa2\x2b\xef\x3f\x06\x3b\xcd\x77\x8c\xc1\x4e\x63\xa4\x69\x48" + "\xef\x53\xd2\x31\xd8\x29\xbd\xf5\x30\xe8\x3d\xd3\x31\x06\xbd\x87" + "\x34\x8f\xc1\x40\x99\x71\xb0\x53\x22\x1f\x83\x5e\x59\x0e\x30\xc8" + "\xc6\x41\xd0\xa1\xcd\x63\xd0\x2a\x0e\xaa\xfa\x73\x18\xec\x3c\x54" + "\x1c\x83\x3e\x93\x2d\x3a\xf4\xfe\x63\x50\x75\xd3\x31\x06\x55\xa5" + "\xd2\x34\x67\xe7\xb1\xd2\x31\xe8\xa3\x69\x3d\x0c\xfa\x5c\x72\x8c" + "\x41\x1f\x9d\x13\x18\x94\x19\x07\x7d\xdc\xf8\x18\x54\x69\xc5\x31" + "\x18\xc4\xc6\x41\xd0\xad\xcd\x62\xd0\x5a\xb7\x76\x3e\xcc\x61\x50" + "\x7d\x5c\x1c\x83\x8f\x9e\xb7\xe8\xd6\xfb\x8f\xc1\x47\x17\x3b\xc6" + "\xe0\xa3\x93\xa4\x69\x54\xf5\x19\xe9\x18\x7c\x34\xab\xf5\x30\xa8" + "\x0e\x77\x8c\x41\xf5\xc8\xe6\x31\x18\x24\x33\x0e\x3e\x9a\xc4\xc7" + "\x60\xe7\x7d\x0e\x30\xc8\xc6\x41\xd0\xb9\xcd\x63\xd0\x2a\x0e\xfa" + "\x0e\xe6\x30\xf8\xd8\x28\x71\x0c\x76\x99\x69\xd1\xb9\xf7\x1f\x83" + "\xbe\xf5\x8e\x31\xe8\x5b\x26\x4d\xd3\x3e\x36\x59\x3a\x06\xbb\x68" + "\x5b\x0f\x83\x5d\xae\x3a\xc6\x60\x97\x02\x27\x30\x28\x33\x0e\x76" + "\xf1\xe4\x63\xd0\xb7\x9f\x18\x06\xcd\xa0\x8b\x1b\xb3\x02\x90\x39" + "\x65\x76\xb6\xb7\x42\x83\x8c\xea\x57\xa2\x4a\x62\x6a\xd0\xb8\x3b" + "\x60\x9f\xa8\x3b\x68\xd6\x1d\x15\x32\xa5\xcc\x4e\x03\x4e\xae\xb5" + "\xd2\xcf\xcc\xda\x32\x63\xf2\xd1\xe4\xad\x0b\x90\x1b\xe8\xef\xb9" + "\xf8\x58\xc9\x95\x3a\x84\x7f\x3f\x1e\xf7\xe7\x1a\xd7\x1f\x9c\x27" + "\xa0\x7f\xd3\xaa\x98\x67\xcc\x0d\x7a\x54\x39\x04\x29\x0b\x2b\xf5" + "\x60\x87\x65\x8c\x7f\xb1\x5d\xae\x28\xfd\xb4\x19\x37\x90\x9b\xf1" + "\xbf\x7e\xdd\xc0\xde\x6a\xaf\x77\x91\xa2\x7b\x25\x6d\xc6\x76\xc5" + "\xf6\xc2\x36\xd6\x2c\xa3\x69\x38\x6f\x69\x31\x60\xcc\xf8\x5f\x6d" + "\xb7\xdd\x70\x9e\xb0\x5e\xf5\x5b\x29\x1d\x1b\x7e\xe4\x7d\x58\xa5" + "\x9f\xa6\xb0\x1c\x09\x3e\x3b\x06\x5b\x65\x39\x69\xab\x6c\x2b\x9d" + "\x77\x0f\x6c\xd5\x75\x92\x73\xb6\xea\xba\xd7\xc6\x56\x02\xba\xaa" + "\x6b\xae\x74\x5b\x75\x25\x75\x22\x95\x5d\xc7\x88\xdb\x2a\xd0\x49" + "\x5c\x05\x6a\xad\xf4\xc8\x3d\xb0\x55\xb7\x44\xe7\x6c\xd5\xed\x0c" + "\xdf\x56\x42\xfc\xbf\xdb\x79\xe9\xb6\xea\x96\x4e\x6c\xd5\x2d\xd6" + "\x81\xad\x9c\xc4\x55\x60\xb6\x15\x6f\xbe\x07\xb6\xfa\xdd\x3e\xe7" + "\x6c\xf5\x3b\x93\x8d\xad\x04\x78\x6a\x77\x77\xe9\xb6\xfa\x5d\x01" + "\xb1\xd5\xef\xb2\xc4\x6d\x15\xe4\x24\xae\x82\xb4\x56\xfc\xee\x1e" + "\xd8\xaa\x7b\x99\x73\xb6\xea\xd1\x8b\x6f\x2b\x21\x3e\xd5\xa3\xbf" + "\x74\x5b\x75\xaf\x21\xb6\xea\x5e\xea\xc0\x56\x4e\xe2\x2a\x28\xdb" + "\x8a\x87\xdc\x03\x5b\x3d\xee\xe6\x9c\xad\x1e\x9f\x6c\x63\x2b\x81" + "\x79\xff\xf1\x99\xd2\x6d\xf5\xb8\x86\xd8\xaa\x87\x51\xcc\x56\xa6" + "\x94\xd1\xfe\xde\x60\x83\xfa\xed\xa3\x91\x77\x2c\xa2\x1a\xfc\xc1" + "\x6e\x6a\xb0\xdb\x4a\x0d\xf0\x27\xb0\x9b\xc1\x88\xc6\x2d\xba\x48" + "\x17\x57\x9b\x50\x03\xd8\xac\x5e\x3d\x5a\x5b\x62\xa8\xc2\x6b\x8e" + "\xfe\x58\xa1\xd4\x0c\x9d\xbe\x48\x85\xb0\xdd\xb0\x1d\xb0\xed\x68" + "\xb0\x1b\x63\x47\x75\xa4\xd6\xa4\x9e\x3a\x7c\xec\xf5\x8b\xf4\x42" + "\x3d\x4d\xe3\xfb\xa5\xd5\x9e\x99\xf8\xb9\xc0\xf8\x2a\xd4\x41\xf3" + "\x67\x7c\x4f\x4f\x5c\xc7\xc7\x4b\x0c\x65\xc0\x0f\x6e\x21\x86\x9b" + "\x5d\xd4\xaa\x4d\x7f\xd1\x7a\x9a\x4a\x42\x02\xe9\x2e\x5e\x3a\x63" + "\x97\x29\xc9\x2b\xae\xa3\x87\x30\x7f\xd8\x62\x46\x7e\xf1\xf3\x11" + "\xb5\xff\x2d\x1d\xc5\xbc\xbb\x16\xcd\xb4\x71\x04\xec\xe2\x47\xdf" + "\xb6\x5a\xd3\x7d\x3b\x02\x95\x5c\x49\x66\xfc\x66\xcb\x11\x18\xbf" + "\xfd\xa4\x55\x01\xcf\xec\x47\xab\x47\x07\x24\x17\x23\x0d\xdd\x08" + "\x36\xc6\xef\x13\x29\x35\x7b\x33\x1a\xa4\xda\xf8\x09\x66\xfd\xb7" + "\x59\xc3\xae\xdf\x02\x3b\xe1\xdf\x67\xd6\x6f\x45\x59\xad\xdf\x82" + "\x3e\x37\xad\xdf\x52\x3e\x11\x84\xd7\x6f\x99\x2f\xfa\x75\xb3\xdc" + "\xfb\xc2\x79\x34\x0d\xf7\xde\xb9\xb8\xc6\x80\xf0\xfd\x17\xd7\xe8" + "\xd0\x8a\x18\xa4\x2a\x6e\xa8\x42\x09\x35\xb4\xa1\x38\xf1\x2a\x1a" + "\x7f\x07\xf3\x60\x8c\x17\xcd\x40\xe2\xd7\x27\x3c\xcc\x17\xb5\xdd" + "\xf4\x4a\x4d\x9f\xe2\x52\x84\xac\xde\xe3\x89\x00\xce\xec\x01\x7e" + "\x88\x28\x49\xac\x40\xe0\x13\x5d\x89\xf1\x67\xec\xa7\x08\xf8\x7e" + "\x48\x13\xbf\xee\x32\xf5\x5b\x7c\x0c\xfb\x0c\x3f\x6f\xc2\xf5\x01" + "\x32\xac\xf8\x37\xc6\x85\x77\x6c\x22\x2a\x89\x6d\x40\xc5\x46\x04" + "\xfc\xea\xf1\x43\x3f\x84\x94\x89\xe1\x28\x8b\xc5\x51\xa2\x77\xac" + "\xfb\x2d\x27\x70\x94\xcd\xe1\xe8\xa9\xb5\xae\xe1\xe8\xa9\x81\xae" + "\xe3\xe8\x29\x85\x0b\x38\xca\xe7\xe3\xe8\xa9\xeb\xd2\x71\xf4\x64" + "\xa1\x74\x1c\x3d\x99\xec\x1a\x8e\x9e\x8a\x27\x38\x7a\x72\x02\xc1" + "\xd1\x53\x31\x1c\x8e\x98\x77\xa3\xee\x11\x8e\x34\x46\x71\x1c\x05" + "\xb2\xf1\x28\x10\xe2\x51\xc7\x8a\xe6\x71\x14\x68\x15\x8f\xfc\x8b" + "\x5c\xc3\x91\x7f\xbc\xeb\x38\xf2\x0f\x96\x8f\xa3\x40\x9b\x78\xd4" + "\x73\xa0\x74\x1c\xf9\xab\xa5\xe3\xe8\xff\xca\x5c\xc3\x91\xff\x49" + "\x82\xa3\xff\x4b\x23\x38\xf2\x3f\xca\xe1\x88\x79\xdf\xec\x1e\xe1" + "\xe8\xff\x46\x3a\xc0\x11\x1b\x8f\x02\x21\x1e\xf9\xfc\xe8\x04\x8e" + "\xac\xe2\xd1\x33\xbe\xae\xe1\xe8\xe9\x93\xae\xe3\xe8\xe9\x6d\x2e" + "\xe0\xc8\x26\x1e\x3d\x13\x2f\x1d\x47\x4f\xcf\x90\x8e\xa3\xa7\x35" + "\xae\xe1\xe8\x19\x2f\x82\xa3\x9e\x7a\x82\xa3\x67\xdc\x38\x1c\x31" + "\xef\xf0\xdd\x23\x1c\xf5\xdc\x24\x8e\xa3\x20\x36\x1e\x05\x41\x3c" + "\x1a\xb4\xa1\x79\x1c\x05\x59\xc5\xa3\x5e\x33\x5d\xc3\x51\x2f\x2f" + "\xd7\x71\xa4\x3d\x2f\x1f\x47\x41\x36\xf1\xa8\xd7\x49\xe9\x38\xd2" + "\x66\x49\xc7\x91\x36\xc2\x35\x1c\xf5\x9a\x4c\x70\xa4\xd5\x12\x1c" + "\xf5\x1a\xc3\xe1\x88\x79\x2f\xf2\x1e\xe1\xe8\x99\xb3\x0e\x70\xc4" + "\xc6\xa3\x20\x88\x47\xd3\x5f\x72\x02\x47\x56\xf1\xa8\xf7\x5e\xd7" + "\x70\xd4\x7b\xb2\xeb\x38\xea\xfd\xa4\x0b\x38\xb2\x89\x47\x7d\xbc" + "\xa4\xe3\xe8\xd9\x6a\xe9\x38\x7a\x36\xcf\x35\x1c\xf5\xde\x45\x70" + "\xf4\x6c\x14\xc1\x51\xef\x14\x0e\x47\xcc\xbb\xa6\xf7\x08\x47\xcf" + "\x76\x17\xc3\x11\xae\x45\xf0\x01\xa9\x0b\x51\xb3\x75\x19\x0a\xc8" + "\xc0\xff\x36\xa0\x7e\xb5\x5b\xfa\x8c\xc4\x3b\x52\x31\x35\x10\x94" + "\x7d\x98\x7c\xaf\xd0\xf5\x1d\x73\xc0\x2f\xea\xd1\x9a\xf1\x17\x48" + "\x8d\x06\x5c\x17\xe4\xf6\x8a\x08\xf4\x3c\xae\xcb\xa0\xec\x1b\x87" + "\xeb\x58\x35\xd5\x0e\x50\x8b\xd4\x0e\x98\x26\x5e\x3b\xa0\x61\xbb" + "\xe5\xbd\xdb\x6c\xee\xbd\x5b\x65\xdf\x60\x87\xef\xdd\x2a\xfb\xf6" + "\xdf\x35\x4d\x2a\x1e\xfa\x30\xef\x7f\xdd\xee\x32\x1a\xd5\x6e\xe9" + "\x3b\x1c\xfe\xf6\x23\xf7\xde\x97\xa9\xb7\xd2\xfc\xfb\xb8\xd9\x56" + "\x38\xe9\x53\x3d\x79\x06\x4a\xa4\x37\x54\x0f\xa7\x7d\x47\x6b\xe8" + "\xd4\xd1\xfd\xa4\xf5\xa5\x6f\x52\x33\xf6\xce\x14\xb6\xf7\x73\xd5" + "\xac\xbd\x13\x59\x7b\x0b\xd7\x2d\x98\x26\x5e\xb7\x40\xd8\xde\xcf" + "\x39\x7e\xcf\x59\xf9\xdc\x1e\xe9\xf6\x7e\x6e\x1e\x6b\xef\xc4\xda" + "\x2d\xcf\xe5\x71\xf6\x7e\xbe\x8f\x74\x7b\x3f\x37\x83\xd8\xfb\xfa" + "\x00\xb0\x77\x26\xd8\x3b\x4f\x62\x5f\xea\x1c\xdb\x3b\x50\x04\xdf" + "\xfd\x66\x10\x7b\xb3\x35\x13\xd4\x22\x35\x13\xa6\x89\xd7\x4c\x10" + "\xb6\x77\xbf\x5e\x8e\xed\xdd\xcf\x47\xba\xbd\x9f\x2f\x27\xf6\x0e" + "\x04\x7c\xf7\xd3\x70\xf6\xee\xe7\x64\x5d\x01\x6b\x7b\x3f\x5f\x48" + "\xec\x7d\x43\x4b\xfb\x06\x02\xbe\x03\x25\xe2\xbb\x5f\x44\x33\xf6" + "\x16\xc1\x77\xff\x42\xd6\xde\x2c\xbe\x45\xea\x35\x4c\x13\xaf\xd7" + "\x20\x6c\xef\xfe\x3b\x1c\xdb\xbb\xff\x4a\xe9\xf6\xee\x3f\x86\xb5" + "\x37\xe0\xbb\x7f\x32\x67\xef\xdf\x7b\x4a\xb7\x77\xff\x21\xc4\xde" + "\xbf\x75\x07\x7b\x03\xbe\x03\x25\xe2\xbb\x7f\x99\x63\x7b\x07\x89" + "\xe0\xfb\x85\x21\xc4\xde\x6c\xad\x08\xb5\x48\xad\x88\x69\xe2\xb5" + "\x22\x84\xed\xfd\x42\x07\xc7\xf6\xfe\xfd\x4d\xe9\xf6\xfe\xfd\x51" + "\x62\xef\x20\xc0\xf7\x0b\x88\xb3\xf7\x0b\x71\xd2\xed\xfd\xfb\x7d" + "\xc4\xde\x06\x15\xed\x1b\x04\xf8\x0e\x92\x88\xef\x17\x82\x9a\xb1" + "\xb7\x08\xbe\x07\xec\x63\xed\xcd\xe2\x5b\xa4\x4e\xc5\x34\xf1\x3a" + "\x15\xc2\xf6\x1e\xb0\xd4\xb1\xbd\x07\xcc\x91\x6e\xef\x01\x7d\x58" + "\x7b\x03\xbe\x07\x44\x71\xf6\x1e\x50\x2d\xdd\xde\x03\xba\x13\x7b" + "\xdf\x74\x03\x7b\x03\xbe\x83\x24\xe2\x7b\x40\xbe\x98\xbd\xbd\xc1" + "\xde\x27\x01\x01\x30\x0f\x6a\xcd\x29\xc0\x53\x4c\x7c\xbb\x97\xc4" + "\x06\xa0\xe7\xee\x62\xdb\x0f\x4a\x83\xb9\x43\xdb\x6a\xf5\x32\x94" + "\x83\x56\xba\xfc\xee\xb0\x72\xd0\x58\xd1\x77\x87\x95\x83\x06\x4a" + "\x7e\x77\x58\x39\x08\x71\x1c\x68\xd0\x48\xce\xa7\x83\x98\xf8\x21" + "\xe9\x9d\x62\xe5\x40\x83\x60\x1d\x0d\xe5\xc0\x4c\xfc\x4e\x31\xf8" + "\xba\xce\x9c\x2a\x87\x1b\x0d\xca\x72\xc2\xd7\xd9\xe0\x87\x4c\x71" + "\x5f\x07\xac\x01\x5f\x67\xb7\x5a\xdd\x0e\x65\xc0\x7c\xd7\x7d\x1d" + "\x30\x58\xdc\xd7\x01\x4f\x4a\xf7\xf5\x1f\xaa\x39\xfe\x15\xd0\x8f" + "\xf3\x75\x80\xf4\xf7\xc7\x95\x7f\x28\x17\xac\xe7\xa1\xfc\xc3\x26" + "\xe2\xeb\xdb\x33\xc0\xd7\x32\x78\x59\x40\x72\xf3\xbe\x0e\x84\x71" + "\x1d\xe8\x60\x5c\xbf\x18\x05\x73\xa6\xb6\xd5\xea\x87\x28\x5f\x9c" + "\xea\xba\xaf\x5f\xec\x29\xee\xeb\x17\xbd\xa4\xfb\x7a\x70\x19\xc7" + "\xfd\x5e\xec\xce\xf9\xfa\xc5\x3c\xe9\xbe\x1e\x5c\x20\x58\x57\x44" + "\x39\x38\x96\xf8\xba\x46\x67\x4e\x95\xc3\x09\x5f\x8c\x73\xc2\xd7" + "\x30\xae\x03\x1d\x8c\xeb\x21\x33\xc0\xd7\xd9\xad\x56\xc7\x44\x39" + "\x64\x94\xeb\xbe\x1e\xe2\x23\xee\xeb\x3f\xd6\x4b\xf7\xf5\x1f\x4f" + "\x70\xbc\x73\x88\x07\xe7\xeb\x21\xe9\xd2\x7d\xfd\xc7\x43\x82\xf5" + "\x4d\x94\x7f\x0c\x23\xbe\xbe\xeb\x0f\xbe\x96\xc1\x47\x87\x88\xf2" + "\x7f\xce\xd7\x41\x30\xae\x83\x1c\x8c\xeb\x3f\x05\x01\x57\xd0\xb6" + "\x5a\x3d\x15\xe5\x9f\xfa\xbb\xee\xeb\xa1\x26\x71\x5f\x0f\xbd\x2c" + "\xdd\xd7\x43\xf3\x38\xce\x3b\xb4\x86\xf3\xf5\x9f\x92\xa4\xfb\x7a" + "\x68\xa6\x60\x9d\x15\xe5\xd0\x09\xc4\xd7\xb5\x49\xe6\x54\x39\x5c" + "\xf8\x4f\x93\x9c\xf0\x35\x8c\xeb\x20\x07\xe3\x7a\x38\xe8\xfa\xa0" + "\xec\x56\xab\xeb\xa2\x1c\xde\xc3\x75\x5f\x0f\xbb\x2a\xee\xeb\x61" + "\x67\xa4\xfb\x7a\x58\x3a\xc7\xb7\x87\xe9\x39\x5f\x0f\x8f\x91\xee" + "\xeb\x61\x9b\x04\xeb\xbd\x28\x87\x0d\x21\xbe\xae\xab\x06\x5f\xcb" + "\xe0\xe1\xc3\x87\xcb\xe1\xe1\xef\xec\x42\x1e\x7c\x7f\xbf\xe4\xdf" + "\xba\x5c\xfc\x25\x2f\xd7\xfd\x3d\xe2\xbc\xb8\xbf\x47\x1c\x97\xee" + "\xef\x11\x9b\x38\x2e\x3e\xa2\x94\xf3\xf7\x4b\x61\xd2\xfd\x3d\x22" + "\x4e\x98\x8b\x8f\xe8\xe3\x1a\x17\x7f\xa9\x9f\x1c\x2e\x6e\xef\xef" + "\x91\xea\xd6\xe5\xe3\x2f\x9b\x5c\xf7\xf7\xcb\xa7\xc4\xfd\xfd\xf2" + "\x41\xe9\xfe\x7e\x39\x8e\xe3\xe3\x2f\xeb\x38\x7f\x8f\x9c\x24\xdd" + "\xdf\x2f\xcf\x13\xe6\xe3\x2f\x77\x77\x8d\x8f\x8f\xd4\xc8\xe1\xe3" + "\xf6\xfe\x1e\xed\xd6\xba\x9c\x7c\xd4\x75\xd7\xfd\x3d\xea\x88\xb8" + "\xbf\x47\xed\x91\xee\xef\x51\xf3\x38\x4e\x3e\xca\x2a\xff\x3d\x7a" + "\xa4\x74\x7f\x8f\x9a\x21\xcc\xc9\x47\x79\xba\xc6\xc9\x47\xab\xe4" + "\x70\x72\x7b\x7f\x07\xd6\xb4\x2e\x2f\x0f\xbc\xe0\xba\xbf\x03\x73" + "\xc4\xfd\x1d\xb8\x4d\xba\xbf\x03\x67\x70\xbc\x3c\x30\x93\xf3\x77" + "\x90\xf4\xfa\x99\xca\xc0\x31\xc2\xbc\x7c\xb4\xd1\x35\x5e\x1e\x84" + "\xe4\xf0\x72\x7b\x7f\x07\x57\xb6\x2e\x37\x0f\x2e\x72\xdd\xdf\xc1" + "\x3b\xc4\xfd\x1d\xbc\x52\xba\xbf\x83\xc7\x70\xdc\x3c\xd8\x2a\xff" + "\xff\x8a\xbf\x74\x7f\x07\x0f\x11\xe6\xe6\x41\xd5\xae\x71\xf3\x60" + "\x83\x1c\x6e\x6e\xef\xef\x57\xcf\xb6\x2e\x3f\x7f\xf5\x98\xeb\xfe" + "\x7e\x75\xbd\xb8\xbf\x5f\x5d\x24\xdd\xdf\xaf\x0e\xe1\xf8\xf9\xab" + "\x89\x9c\xbf\xc7\xa8\xa5\xfb\xfb\xd5\x3e\xc2\xfc\xfc\x95\x72\xd7" + "\xf8\xf9\xab\x7a\xd7\xf3\xe4\xe3\xf2\x30\x37\x97\x5a\xff\xb1\x24" + "\xc6\xf2\xce\xdd\x18\xae\xfe\xa3\x72\xdc\x1e\x24\x5a\x5b\x66\xac" + "\xa9\x4d\xd7\x7f\x54\x8e\x75\x5c\xff\x51\x39\x56\x5a\xfd\x47\xe5" + "\xd8\xcb\xd2\xd7\xe3\x8f\xcd\xe3\x34\xc2\x58\x2b\xfd\x3f\x8e\xec" + "\x51\xdc\x96\xeb\x42\x2a\xc7\xf2\xeb\x42\x2a\xc7\x30\x75\x21\xe9" + "\x0d\x0d\x13\xe4\x69\x91\x71\x47\x5d\x7f\x2e\x30\x71\x13\xd6\x21" + "\x52\xeb\x50\x72\xd8\x1e\xbf\x9e\xc3\xf6\xc4\x78\x71\x6c\x4f\x38" + "\xdf\xa6\xeb\x50\x2a\x27\xcc\x74\x8c\xed\x09\x43\xa4\xd5\x1c\x99" + "\x20\xa3\xee\xcd\x84\x4d\x9c\x1e\x9a\x60\xa5\x7f\x27\x16\xb6\x22" + "\xb6\x65\xd6\x53\x9a\x10\xc5\xc7\xf6\xf8\x44\x82\x6d\x63\x96\x3c" + "\xdd\x35\x31\xcd\xf5\xe7\x20\x93\x22\xb0\xe6\x92\x5a\x0f\x93\xc3" + "\xf6\x9f\xc3\x39\x6c\x4f\x9a\x2a\x8e\xed\xd7\x0e\xb7\xed\x7a\x98" + "\xaf\x0d\x76\x8c\xed\xd7\xfc\xa4\xd5\x32\x79\x6d\x97\x74\x6c\xbf" + "\x16\xc1\x69\xbf\xd7\xf6\x71\xd8\x9e\x94\xdd\x7a\xd8\x96\x5b\x27" + "\xf3\xb5\x31\x7c\x6c\xff\x79\x06\xc1\xb6\xb9\x4e\x9e\xc6\x9c\x14" + "\xe3\xfa\x73\x9f\xbf\x8c\xc4\xfa\x52\x6a\x5d\x4e\x0e\xdb\x93\x47" + "\x70\xd8\xfe\x8b\x5d\x5d\x28\x0e\xdb\x53\xb6\xb5\xed\xba\x9c\x53" + "\x7c\x1d\x63\x7b\x72\x8d\xb4\x1a\x29\x53\x96\x4a\xc7\xf6\x94\x91" + "\x9c\xce\x9d\x92\xc4\x61\xfb\x2f\x6b\x5a\x11\xdb\x32\xe3\xf6\x14" + "\x2d\x1f\xdb\x93\x03\x18\x6c\x6f\x51\x8c\x91\xa7\xa7\xff\x32\xc1" + "\xf5\xe7\x5c\xd3\x34\x58\x4b\x4b\xad\x0f\xca\x61\x3b\xa4\x07\x87" + "\xed\x69\x3e\xe2\xd8\x9e\x3a\xbf\x6d\xd7\x07\x0d\x69\xa6\xfe\x4f" + "\x88\x83\xfa\x3f\x42\xef\x0a\x4f\x95\x51\xf7\x62\xaa\x86\xd3\xf4" + "\x53\xc3\x38\x6c\x4f\x0b\x6d\x3d\x6c\xcb\xad\x1b\x3a\xd5\x8d\x8f" + "\xed\x10\x35\xc1\xb6\x32\x53\x5e\xee\x60\x5a\x1f\xd7\x9f\xeb\xcd" + "\x30\xe2\xbc\x81\xd4\x3a\xa5\x1c\xb6\xa7\xd5\x73\xd8\x9e\x71\x5d" + "\x1c\xdb\x33\x82\xdb\x76\x9d\xd2\xe9\x45\x8e\xb1\x3d\x7d\x9f\xb4" + "\x9a\x2e\x33\x64\xbc\x07\x3f\xdd\xc8\xe5\x2f\x66\x58\xad\x7f\x9f" + "\x39\xa4\x15\xb1\x2d\x33\x6e\x4f\xd7\xf3\xb1\x3d\xcd\x40\xb0\xed" + "\x5e\x23\x2f\x4f\x32\xd3\xc3\xf5\x3c\x49\xa8\x07\xf3\x0c\x53\x62" + "\xbd\x54\x0e\xdb\x33\xcf\x71\xb5\x89\x66\xd7\xdb\x62\x9b\xab\x4d" + "\x34\xdb\xa7\xed\xd4\x4b\x9d\x95\xea\x18\xc7\xb3\x62\xa4\xe5\x44" + "\x66\xd5\x4b\xc7\xf1\xac\x13\x5c\x4e\x64\xb6\xd5\xfa\x97\x50\xcb" + "\x9e\xe4\xad\x50\xb3\x68\xf6\x2e\xc7\x35\x8b\x66\xc7\xdd\xbb\x3a" + "\xaa\xb3\xb2\xf9\x35\x8b\x66\x16\x9a\x99\xb1\xe0\x11\x24\x2f\xaf" + "\x12\xaa\x76\x3d\xaf\xf2\x3a\x79\xbe\x2b\xb1\x6e\x2b\x37\x16\x42" + "\x2f\x71\x63\xe1\x75\x77\xf1\xb1\x30\xb7\x47\xdb\xa9\xdb\x3a\x67" + "\x8f\xe3\xb1\x30\x27\x51\x5a\x0e\x65\xae\x8c\x3a\x30\x73\x4a\xb9" + "\x1c\xca\x5c\x35\x37\x16\x5e\x9f\xd4\x7a\x63\x61\x6e\x8e\xe3\xb1" + "\x30\x37\xe9\xde\xd5\x73\x9d\x73\x88\x3f\x16\x42\xcb\xc8\x58\x78" + "\xa4\x50\x5e\x1e\xe6\x75\x59\xcf\xbf\xf9\x63\xe1\x0d\x0d\xf3\xec" + "\x5b\x62\xfd\x58\x6e\x2c\xbc\x7e\x9d\x1b\x0b\x6f\xd8\xf1\x79\x6e" + "\x2c\x84\xf7\x6a\x3b\xf5\x63\xc3\x72\x1d\x8f\x85\xb0\x4d\xd2\x72" + "\x2e\xe1\x3e\xd2\xc7\x42\x98\xd5\xfb\x4f\xe1\x56\xef\x3f\xbd\x11" + "\xda\x7a\x63\x21\xfc\xb0\xe3\xb1\x10\x9e\x72\xef\xea\xca\x86\xe9" + "\xf8\x63\xe1\xf5\x4a\x32\x16\xbc\x26\xc8\xcb\xdb\xbc\xe1\x04\xff" + "\x6f\x2e\x6f\x13\xd9\x87\x59\x17\x20\xb1\x8e\x2d\x37\x16\xde\xa8" + "\xe7\xc6\x42\x64\x0f\xf1\xb1\x10\x31\xb0\xed\xd4\xb1\x7d\xf3\x88" + "\xe3\xb1\xf0\x66\x9a\xb4\x1c\x4d\x44\x0f\xe9\x63\xe1\xcd\x2a\x2e" + "\x47\x13\xd1\x87\x1b\x0b\x91\xf3\x5a\x6f\x2c\x44\x1c\x77\x3c\x16" + "\x22\x32\xef\x5d\x7d\xdb\x37\x0b\xf9\x63\xe1\x0d\x03\x19\x0b\xde" + "\x67\xe5\xe5\x79\x22\x03\x5c\xcf\xf3\xcc\x0b\x60\xd6\x4c\x48\xac" + "\xa7\xcb\x8d\x85\xb7\xdc\xb9\xb1\x30\xaf\x97\xf8\x58\x78\x7b\x44" + "\xdb\xa9\xa7\xfb\xd6\x49\xc7\x63\xe1\xad\x2c\x69\x39\x9d\xb7\x7b" + "\x49\x1f\x0b\x6f\xd5\x70\x39\x9d\xb7\x03\xb8\xb1\x30\x2f\xb6\xf5" + "\xc6\xc2\xdb\x45\x8e\xc7\xc2\xdb\xfb\xee\x5d\x9d\xdd\xb7\xca\xf8" + "\x63\x21\xd2\x48\xc6\x42\xe7\x10\x79\x79\xa1\x79\x23\x5d\xcf\x0b" + "\x2d\x1c\xc9\xac\x27\x91\x58\xd7\x97\x1b\x0b\xf3\x7d\xb8\xb1\xb0" + "\xd0\xc1\x3e\x0f\x0b\xc6\xb6\x9d\xba\xbe\xf3\x9b\xd9\xff\x68\xbe" + "\xa3\xfd\x8f\x04\x72\x40\x0b\x06\x4a\x1f\x0b\x0b\x10\x97\x03\x5a" + "\x60\xf5\xfe\xdf\xc2\x35\xad\x37\x16\x16\x34\xb3\xff\xc3\x02\x27" + "\xf6\x7f\x90\x5b\xef\x77\x7e\x25\x7f\x2c\xcc\xf7\x20\x63\x41\x5d" + "\x2e\x2f\x8f\xb4\xb0\xd9\xfc\x3f\xd6\xf9\x8d\x6a\xfb\x3c\x52\x61" + "\x65\x00\xea\x3d\x0d\x8f\x85\xa8\x3a\x63\xea\x68\x2d\xae\x2f\x6c" + "\xf2\x67\x6b\x50\xae\x64\x6b\xbc\xd4\x18\x49\x0d\x4a\x83\xa9\xa9" + "\x06\x25\xa9\xfd\x81\x28\xfc\x2e\x30\x7e\x27\xd8\xa8\x22\xf5\x27" + "\x69\xbc\x26\x0a\xaf\x91\xaa\x28\x60\xea\xab\xc4\x19\xe1\xde\xaf" + "\x34\x53\x7f\x32\x54\x8f\x0a\x43\x97\x21\xa3\xcf\xd1\x64\xf2\x9e" + "\x70\x54\x12\x53\x7f\x72\xb6\x5f\xb7\x2d\xff\x41\x6a\x6f\x5c\x7f" + "\x32\x94\x36\xaf\xd0\xd3\x86\xe2\x3a\x04\xe7\x82\x7d\xe7\x58\x6a" + "\x50\x46\xdd\xc4\xf7\x6e\x9c\xad\xed\xb6\xfb\x3f\x62\xf5\x85\xa3" + "\x64\xd4\x81\x8d\xca\xe2\xf2\x3b\x51\x55\x1c\x46\x17\x31\x73\x30" + "\x7c\x9f\x58\x18\x02\x31\x66\xcb\x63\xa1\x8d\xb2\x6a\x6f\x2c\x72" + "\x73\xc2\x67\x78\x8d\x88\x5d\xfc\xe2\x7c\x16\xbd\x0f\x7c\x96\x8d" + "\xeb\x1c\x3b\xef\x33\xf7\x5b\xf7\xc6\x67\xd1\x43\x9c\xf7\x59\xf4" + "\x5e\x1b\x9f\x09\xe4\x21\xa2\x37\x4b\xf7\x59\x74\x08\x97\x87\x88" + "\x4e\xe7\x7c\x16\x5d\x4d\x7c\x16\x3d\x80\xf8\xcc\x6f\x53\xa3\xac" + "\xfa\x1d\xd1\xcd\xbe\xff\x8d\x75\x53\xa3\xda\x5e\x97\x73\x3e\x8b" + "\x09\x35\xa6\x82\x76\x07\x5d\xee\xbc\xcf\x3a\x56\xdc\x1b\x9f\xbd" + "\x63\x70\xde\x67\x31\x53\xf9\x3e\x13\xd2\xcb\x31\x32\xf6\xec\x8c" + "\xf1\xe4\xf4\x72\xcc\x04\xce\x67\x31\x99\xc4\x67\xef\x54\x11\x9f" + "\x75\xcd\x6f\x94\x55\x03\x24\x66\x9e\x13\x3e\xc3\xcf\xf4\x1d\x8c" + "\xb3\x25\x6a\xf0\x59\x36\xae\xfb\xec\xbc\xcf\x7c\x7e\xbc\x37\x3e" + "\x5b\x9c\xe5\xbc\xcf\x96\x78\xd9\xf8\x4c\x40\xd7\x2d\xbe\x23\xdd" + "\x67\x8b\x75\x9c\xae\x5b\xe2\xc6\xf9\x6c\xc9\x24\xe2\xb3\xc5\xe9" + "\xc4\x67\xdd\x2a\x1b\x65\xd5\x11\x59\xd2\x6c\xfe\x0b\xf3\xd0\x46" + "\xb5\xbd\xce\xe1\x7c\xf6\x6e\x81\x31\x15\xb4\x10\xe8\x1c\xe7\x7d" + "\x36\x68\xc3\xbd\xf1\xd9\xbb\x21\xce\xfb\xec\xdd\xe3\x7c\x9f\x09" + "\xe9\x8f\x77\x73\xa4\xfb\xec\xdd\x18\x4e\x7f\xbc\x9b\xcf\xf9\x2c" + "\xd6\x83\xf8\xec\xdd\x09\xc4\x67\xdd\x55\x8d\xb2\x6a\x91\xbc\x7b" + "\xd6\x09\x9f\xe1\x67\xb0\x0e\xc6\xd9\xd2\x38\xf0\x59\x36\xae\x83" + "\xed\xbc\xcf\xa6\xbf\x74\x6f\x7c\xb6\xd4\xd3\x79\x9f\x2d\x5d\x6c" + "\xe3\x33\x01\x9e\xbc\x54\x46\x1d\xec\xa5\x5a\x8e\x27\x2f\x9d\xc7" + "\xf9\x6c\xe9\x51\xe2\xb3\xa5\x6e\xc4\x67\x3d\x86\x34\xca\xaa\x67" + "\xb2\x54\xb4\xfe\x97\x23\xde\x68\x59\x97\xcf\xf9\x6d\xf9\x80\xb6" + "\xc3\x1d\x97\x9d\x70\xde\x6f\xcb\xfb\x36\xcf\x1d\x97\xfb\x4a\xf7" + "\xdb\x32\x3d\xc7\x1d\x97\xfb\x73\x7e\x5b\x1e\x43\xfc\xb6\xec\xa8" + "\x6b\xdc\x71\xf9\x70\x39\xdc\xd1\xde\x6f\x71\xd5\x6d\x87\x3f\xc6" + "\xc5\x39\xef\xb7\xb8\xcb\xcd\xf3\xc7\xb8\x22\xe9\x7e\x8b\x4b\xe3" + "\xf8\x63\x5c\x39\xe7\xb7\xf8\x3e\xc4\x6f\x71\x31\xae\xf1\xc7\x38" + "\xd1\xfa\x6f\x8e\xf8\xa3\xbd\xdf\x12\xb2\xda\x0e\x87\x4c\x18\xe0" + "\xbc\xdf\x12\x76\x35\xcf\x21\x13\xd6\x4a\xf7\x5b\xc2\x04\x8e\x43" + "\x26\xa4\x70\x7e\x4b\xa8\x24\x7e\x4b\xe8\xe3\x1a\x87\x4c\xc8\x93" + "\xc3\x21\xed\xfd\x96\x38\xa3\xed\xf0\xc8\x15\xd5\xce\xfb\x2d\x71" + "\x72\xf3\x3c\x32\x51\xc6\x9e\xc5\x89\x1e\x1c\x8f\x4c\x1c\xc3\xf9" + "\x2d\x91\xdd\x83\x65\x45\xa5\x6b\x3c\x32\xb1\xd9\xfa\x1f\x42\x3c" + "\xd2\xde\x6f\xab\xd4\x6d\x87\x4b\xae\x94\xc0\xff\x57\x79\x35\xcf" + "\x25\x57\xca\xe0\xff\x2b\x75\x1c\x97\x5c\x65\xc5\xff\x57\xb1\xfc" + "\x7f\x65\xba\x6b\x5c\x72\x95\x33\xfc\xdf\x8e\x4b\xda\xfb\x6d\x75" + "\x61\xdb\xe1\x93\xab\x67\x38\xef\xb7\xd5\x27\x9b\xe7\x93\xab\x65" + "\xec\x03\xb5\x3a\x96\xe3\x93\xab\x8f\x72\x7e\x5b\xe3\x49\xfc\xb6" + "\x7a\x92\x6b\x7c\x72\xb5\x68\xfd\x47\x8b\xdf\x4c\xea\xd1\x5a\x5a" + "\x20\x0f\x59\x14\x11\xc0\xd6\x26\x5c\x97\x6e\xf2\x1d\xad\x95\xba" + "\xbf\x8b\xa5\xe6\xf4\x29\x18\xf1\x15\xca\x75\x03\x5d\xab\x3b\xbd" + "\xf6\xb2\xeb\x75\xa7\xd7\x1e\x6c\xb9\xfd\x5d\xd6\xee\x90\x5e\x77" + "\x7a\x6d\x18\xc7\x41\xd7\x66\x73\xbe\x5e\xc7\xac\x4f\x90\x56\x8f" + "\x7a\xad\xd6\xb5\x7a\xd4\xeb\xfa\x12\x7c\xad\xa9\x22\xf5\xa8\xd7" + "\xf9\xb7\xce\xbe\x2f\x6b\x52\x70\x3d\x6a\x7a\xcb\xe3\x11\xf2\xea" + "\x23\xaf\xcb\x76\x02\xcf\xd9\xb4\x40\x8e\x96\xc3\xf3\xfa\x79\x80" + "\xe7\x6c\xa9\xfb\xcc\xf0\xf1\xbc\xde\xdd\x35\x3c\x27\x1d\x76\x1d" + "\xcf\x49\x2b\x5b\x6e\x9f\x99\xa4\x48\xe9\x78\x4e\x1a\xc0\x71\xf3" + "\xa4\x58\x0e\xcf\xeb\xf7\x49\xc7\xf3\x7b\x75\xae\xe1\x39\xc9\x44" + "\xf0\xfc\x5e\x3e\xc1\x73\x52\x4d\xeb\xec\x3f\xf3\x5e\x18\xc1\xb3" + "\x26\x4f\x5e\xfd\xe9\xf5\xb1\xcd\xe3\x39\x50\x4b\x0b\xe4\xaf\x39" + "\x3c\x6f\x1a\x62\xf2\x0d\xd4\x4a\xdd\xef\x86\x8f\xe7\x8d\xe7\x5c" + "\xc3\xf3\xc6\xb5\xae\xe3\x79\xe3\xc4\x96\xdb\xef\x66\xe3\x60\xe9" + "\x78\xde\xe8\xc6\x69\x96\x8d\x41\x1c\x9e\x37\xc5\x49\xc7\xf3\x86" + "\x02\xd7\xf0\xbc\xb1\x88\xe0\x79\x43\x12\xc1\xf3\xc6\x13\xad\xb3" + "\x0f\xce\x86\x01\x04\xcf\x4f\xd5\xc9\xab\xef\xbd\x49\xb4\xfe\xb1" + "\x15\x9e\xb3\x69\x81\xdc\x3e\x87\xe7\xad\x9e\x80\xe7\x6c\xa9\xfb" + "\xee\xf0\xf1\xbc\xc5\xc5\x7d\x2e\xb6\xb4\xc0\x3e\x17\x5b\x5c\xd8" + "\xe7\xc2\x76\xdf\x9d\x2d\x1d\xa4\xe3\x79\xf3\x59\x4e\xcb\x6d\xf1" + "\xe3\xf0\xbc\x75\x8c\x74\x3c\x6f\x4e\x73\x0d\xcf\x5b\xd8\xfd\x2f" + "\x36\x87\x10\x3c\x6f\x49\x69\x9d\xfd\x78\x36\xbb\x11\x3c\xf7\x1c" + "\x2e\xaf\x7e\xfa\x56\xbf\xe6\xf1\x1c\xa4\xa5\x05\x9e\x7b\x70\x78" + "\xde\x56\x6e\xf2\x0d\xd2\x4a\xdd\xff\x87\x8f\xe7\x6d\x8b\x5d\xc3" + "\xf3\xb6\x9e\xae\xe3\x39\xf9\x66\xcb\xed\xff\x93\x7c\x5e\x3a\x9e" + "\x93\xb3\x38\x8d\x9b\x6c\xf5\xfc\xff\xfd\xee\xd2\xf1\x9c\xec\xe2" + "\xbe\x40\xdb\xe6\x13\x3c\x27\xb3\xfb\x02\x6d\x0b\x6b\x9d\x7d\x81" + "\xb6\x9e\x25\x78\x7e\x26\x49\x5e\x7d\xfa\x6d\x55\x4e\xe0\x39\x9b" + "\x16\x78\x26\xc4\xe1\x39\x65\x1f\xe0\x39\x5b\xea\x3e\x44\x7c\x3c" + "\xa7\x8c\x72\x0d\xcf\x1f\xdc\x71\x1d\xcf\x1f\x1c\x6f\xb9\x7d\x88" + "\x3e\xc8\x91\x8e\xe7\x0f\x2c\xcf\xff\x20\x3e\x7f\x60\xf5\xfc\x2f" + "\x45\xc6\xfe\x44\x1f\x04\xb8\x86\xe7\x94\xa1\x04\xcf\xef\xd7\x11" + "\x3c\xa7\x0c\x68\x9d\xfd\x89\xde\xcf\x22\x78\xee\x55\x2a\xaf\xfe" + "\x7f\x4a\xb3\xeb\x3f\x84\xf2\x1b\x96\xbc\x14\x87\xe9\x0f\x13\x5d" + "\xcf\x71\x7c\xd8\xd5\x35\x4c\x6f\x3f\xe5\x3a\xa6\xb7\xa7\xb6\x5c" + "\x8e\x63\xbb\x8c\xbd\xfe\xb6\x07\x71\x39\x8e\xed\x9b\x38\x4c\x7f" + "\xa8\x93\x8e\xe9\xed\x9e\xae\x61\xfa\x43\x1f\x82\xe9\xd4\x42\x82" + "\xe9\x0f\x3d\x5a\x27\xc7\x91\x1a\xeb\x5a\x8e\xe3\xc3\x4d\x72\x72" + "\x1c\xf6\x98\xde\x39\xc9\xf5\x3c\xc7\x8e\xeb\xae\x61\x7a\xc7\x2e" + "\xd7\x31\xbd\x23\xb2\xe5\xf2\x1c\x3b\x26\x4a\xc7\xf4\x8e\xee\x5c" + "\x9e\x63\x47\x28\x87\xe9\x9d\x29\xd2\x31\x9d\xa6\x77\x0d\xd3\x3b" + "\x2e\x13\x4c\xa7\x65\x12\x4c\xef\x28\x6f\x9d\x3c\x47\xda\x18\xd7" + "\xf2\x1c\x3b\x43\xe5\xe4\x39\xec\x31\xbd\x4b\xeb\x7a\xae\x23\xfd" + "\xb8\x6b\x98\x4e\x5f\xe4\x3a\xa6\xd3\x87\xb6\x5c\xae\x23\xbd\xa7" + "\x74\x4c\x7f\x64\xe0\x72\x1d\xe9\x03\x38\x4c\xef\x8a\x90\x8e\xe9" + "\x8f\x0e\xb9\x86\xe9\xf4\x23\x04\xd3\x1f\xc5\x10\x4c\xa7\xe7\xb5" + "\x4e\xae\xe3\x23\x8d\x6b\xb9\x8e\x5d\x03\xe4\xe4\x3a\xec\x31\x9d" + "\x61\x74\x3d\xdf\x91\x91\xea\x1a\xa6\x33\x46\xb9\x8e\xe9\x0c\x9f" + "\x96\xcb\x77\xec\xae\x97\x8e\xe9\xdd\x56\xfb\x5f\x64\x58\xbd\xff" + "\x9f\x39\x44\x3a\xa6\x77\x27\xb9\x86\xe9\x8c\xcd\x04\xd3\xbb\x83" + "\x08\xa6\x33\xd6\xb4\x4e\xbe\x63\x57\x8d\x6b\xf9\x8e\xcc\x66\xeb" + "\x5f\x08\xe5\x3b\xec\x31\xfd\x71\xa9\xeb\x39\x8f\x8f\x23\x5d\xc3" + "\xf4\xc7\x5d\x5d\xc7\xf4\x9e\xcb\x2d\x97\xf3\xd8\x53\x24\x1d\xd3" + "\x7b\xd2\xb8\x9c\xc7\x1e\xab\xf5\x4f\x9f\xa8\xa4\x63\x7a\xcf\x0c" + "\xd7\x30\xfd\xf1\x1c\x82\xe9\x3d\xdd\x09\xa6\x3f\x0e\x69\x9d\x9c" + "\x47\x66\x81\x6b\x39\x8f\x8f\xcb\xe5\xe4\x3c\xec\x31\xbd\x37\xcb" + "\xf5\xbc\xc7\xde\xa1\xae\x61\x3a\xeb\xba\xeb\x98\xce\x3a\xd2\x72" + "\x79\x8f\xac\x3d\xd2\x31\x9d\x35\x8f\xcb\x7b\x64\x59\xd5\xbf\xdf" + "\x5b\x29\x1d\xd3\x59\xfd\x5c\xc3\xf4\xde\x81\x04\xd3\x9f\x18\x08" + "\xa6\xf7\xf6\x69\x9d\xbc\xc7\x27\xe9\xae\xe5\x3d\xf6\xda\xad\x7f" + "\x7b\x27\x7c\x41\x98\x66\xe1\x1b\x6f\xbc\x13\x1e\xa3\x79\x67\x5e" + "\xe4\xeb\xe1\x43\x7b\x5a\xfe\x1e\xda\x2f\xb6\x67\xec\x23\x28\x6c" + "\xfe\x9c\xd9\x4b\x7e\xcf\x7d\x39\x2f\x7c\x01\xfc\xf3\x08\x8a\x98" + "\xf3\x4e\x84\x26\x66\x69\x54\xb8\x06\xff\x35\xff\xf5\x28\x38\x65" + "\x61\x0c\x77\xe4\xcf\xe1\xf3\xe6\xc4\x46\x2e\x78\x53\x33\x67\x5e" + "\xe4\x9b\x0b\xe6\x87\x2f\x88\xd1\x44\x87\x2f\x5a\x1c\x19\x1d\x8e" + "\xff\xff\x8e\xe6\x8d\x85\xd1\x70\xe0\xf5\xf0\xc8\x25\xe1\x9a\xb9" + "\x8b\xdf\x78\x23\x3c\xfa\x9d\x47\xd0\xd8\xc5\xf3\x62\x22\xa3\xe6" + "\x85\x6b\x46\x8e\x1d\xd1\x77\xd2\xa8\xd7\x26\x0d\x1b\xf6\x08\xb2" + "\xda\x7b\x5a\x43\xa7\x44\x6a\x00\x43\x6e\x57\x94\x7f\x1b\x5a\xec" + "\x87\xd0\x66\xc0\xe6\xd6\x68\xa4\x5a\x1f\x8d\xdc\x92\x6e\x21\x8f" + "\xcd\xb7\x90\xa7\xe6\x2d\x34\x9c\xf6\x59\xad\xdb\x7a\x0b\xa9\xe9" + "\x2e\x9e\xd9\xf4\xb6\xaf\x4a\x69\x9f\xa3\x2a\x83\x4f\x16\x3e\xa6" + "\xa2\xb7\x7d\x52\x87\xbf\x03\x5f\xb8\xd1\xdb\x8e\xc6\x56\x28\x0f" + "\x1a\x0d\x3e\x7b\x33\x57\x5c\x45\x14\xdd\xe9\xaf\xaa\xfd\x66\x03" + "\x75\x1c\x67\xd9\xc0\x56\x48\x99\xad\x85\x8f\x1a\x3e\x27\xe0\x73" + "\x16\x29\x73\xba\xc3\x67\x24\x7c\xc6\xc0\x27\x1f\x29\x3f\x43\xf0" + "\xe9\x07\x1f\x38\xf6\x59\x08\x7c\xc2\xe0\x33\x0f\x3e\x65\xf0\xa9" + "\x43\xca\xcf\x3d\xe0\xa3\x21\xed\x7c\x8e\x3f\xd9\xf0\x31\x20\xe5" + "\x3e\x7f\xa4\xcc\x85\xe3\xb9\xd0\x4e\x2e\x9c\x97\x0b\xd7\xe4\x26" + "\xc1\x27\x19\x3e\x87\xe0\x03\xd7\x7f\xde\x87\x7c\xb7\x3f\x0b\x3e" + "\x7a\xa4\x3c\x00\xbf\x75\x00\x7e\xff\xc0\x04\xf8\xc0\xef\x1c\x88" + "\x82\x4f\x2c\x7c\xd2\xe1\x03\xe7\x1c\x80\xfe\xe4\xc1\x35\x79\x03" + "\xe0\x03\x7d\xc9\xcb\x43\xca\x83\xd0\xf7\x83\x11\xf0\x31\xb2\x9f" + "\x3c\xab\xff\xe3\x4f\x8d\xcd\xdf\x36\x9f\xbf\xa9\xbd\x57\x3e\xa1" + "\xd7\x3d\x6b\x84\x71\x9b\xbd\xd6\xb4\x0a\x29\x4d\xdb\xf6\x66\x46" + "\x3d\x8b\x14\xd7\x94\xd9\x13\x4b\xd6\x20\x44\xab\xbe\x2a\xd5\x2d" + "\x6b\xc0\xdf\x4f\xc4\x36\xab\xdd\x92\x3d\x41\x8f\x3e\x48\xc2\xe3" + "\x53\x1a\x3e\xb3\x27\xb0\xd7\x27\xeb\x15\x7d\x62\xf1\xf5\xf4\xfb" + "\x41\x71\xf4\x8a\x90\x8f\xf0\x7b\xb8\x57\xb0\x0d\xf1\xb8\x49\x0e" + "\x3c\x4b\xab\x5e\x9a\x87\x63\x8c\x6e\x19\xd3\xaf\x5e\x30\xde\x3a" + "\xc1\xf5\x5a\x1a\xfc\x68\xf0\x05\x9f\xaf\x42\x6e\xcc\xdf\xdb\xb2" + "\x74\x74\x66\x8c\x07\x89\x3b\xd9\x8c\x7e\xa9\xf7\x9d\x19\x8a\xbf" + "\xab\xdb\x3b\x08\xe2\x44\x40\xb2\x6e\x41\x03\xaa\x54\xe6\xf8\x42" + "\xfc\xa3\xe8\xa7\x07\x21\xf3\xf6\x99\xa1\xf9\x80\x01\x7c\xce\x91" + "\x84\x2a\xfc\xaf\x3f\xdc\x37\x45\xa7\xcc\xd2\xe2\x1c\x90\x2e\xe1" + "\x7d\x88\xc9\xd9\xbd\xea\x7d\xdf\x31\x68\x5e\xf1\xa6\x2b\xd8\x7e" + "\xc1\x79\x47\xa1\x1f\xcc\x75\xf5\xbe\x9e\x79\xb8\x6d\x53\x66\x4c" + "\x1e\x1c\x73\xa3\x01\x7b\xd0\x07\xc5\x0d\xb8\xce\x94\xea\x99\xad" + "\x7b\x85\xf9\xcd\x83\xd0\x4f\x6a\x45\x30\xb4\xfd\x71\x4c\xde\x81" + "\x65\x75\x14\x8d\xfb\xae\xf6\xcc\x06\xac\x7b\x9a\xb6\xec\x35\xec" + "\xe8\x8c\xdc\x76\xbd\x8f\x50\x46\x67\xe4\x51\xbb\x25\x27\x5b\xef" + "\xd6\x3b\x8e\xc4\xbd\x6c\x2d\x05\xe7\xe8\x95\x39\x6b\x68\xf0\x07" + "\xf3\x5b\x29\x21\x99\x0e\x7e\xab\xbe\xe9\xb7\xb6\x87\x64\xe2\xdf" + "\x62\xec\x43\x6c\x45\xfe\x6f\x69\x27\x6b\x90\xa3\x3e\xdf\xc1\x6d" + "\xc0\xef\x56\xd1\x9f\x0e\xca\x33\x6d\x9f\x9d\x87\xbf\xc3\xe7\x13" + "\xfb\x67\xe9\xbc\x57\xa2\x1a\x1a\x8e\x99\x58\x1f\x98\xb0\x0f\xa8" + "\x44\x88\x5f\xd9\x05\xf8\xf7\xf4\xca\xcf\x06\x98\x56\x69\x00\x37" + "\xc1\x43\x88\x5f\x3f\x5b\x19\x5b\x40\x9b\xe1\x63\x7a\xbe\x00\x29" + "\x74\xaf\x60\x9f\x7e\x96\xa9\x19\xfd\x30\xd8\xf6\xb3\x3d\xac\x6d" + "\xb5\xf5\x4f\xc6\x60\xbb\xa8\xc0\x16\x9e\xf4\xba\x9e\x49\x4c\x1b" + "\x60\x6f\x6c\xa3\x0c\xb0\x11\xd8\xc9\x03\xfb\xbf\x76\xcb\x67\xa5" + "\x36\x76\x52\xc1\xb1\x4a\xbd\xa2\xa7\x0e\x1f\xd3\x3c\x85\x08\x66" + "\xac\xee\x1b\xfb\xd7\x94\x1a\xa9\xc1\x7f\x4f\xee\x85\x54\xde\x05" + "\x88\xd2\x24\xf8\xe7\x13\x3f\xcf\xd2\x72\xbe\xfd\x2c\x88\xde\xfe" + "\x4a\x2c\x9c\xaf\xe5\x70\xf5\x79\xa8\x69\x5b\xf0\x00\x38\x4f\x5f" + "\x97\xfa\x97\x4c\x3a\x39\x78\x00\x7e\xaf\xbc\x42\xf9\x39\xf3\xae" + "\x1d\xbd\xca\x03\x91\xdf\x09\x0e\x48\x98\x47\x1b\x12\x6e\x82\x0f" + "\xba\xcc\xd2\x1f\x59\x62\x00\x5f\xfc\x25\x13\xfb\x3a\xff\x6e\x1d" + "\x85\x6b\xfd\xd1\x9d\x3e\xed\xbc\x9b\xf8\xdc\x03\xee\x13\xe1\x76" + "\x6b\xb7\x7c\x9e\xc9\xdd\xcf\xe7\x23\xb1\xdf\xe1\x37\xc6\xb0\x98" + "\xd6\x42\xbf\x14\xb4\x4f\xf0\x18\x38\xaf\x40\xaf\xf8\xd1\x83\x19" + "\x37\x4b\xe8\xb3\x5b\x1b\x10\xba\xbd\x84\x36\x8e\x37\x5e\x34\xc3" + "\x7c\x0b\x5c\xf0\xf3\x2a\x3d\x7a\x39\xdb\x62\x17\x32\x96\x9a\xda" + "\x61\x6a\x40\x18\x98\x76\xf6\xa9\x84\xda\x81\xdf\x2e\x9b\x6d\xd4" + "\x28\x1a\xee\xd2\xa5\x5b\xa7\x40\xdf\x56\x21\xba\x61\x09\x5d\x18" + "\x1f\x44\xd7\x6d\xf9\x11\x01\xe7\x29\x47\x10\x43\xbb\x77\x52\xd0" + "\x86\xf1\x4b\x91\x77\xa7\x28\x6f\xfa\x54\x41\x39\x5a\x1e\x44\x57" + "\x95\xc4\x9a\x50\x71\x4d\x25\x8a\x3b\x8f\x3c\x57\x14\x21\x75\x5c" + "\x10\x6d\x28\x0c\x2d\x47\xe4\x78\x11\x5a\x71\x09\xb9\x2d\x3f\x41" + "\xd7\x8d\x83\xf9\xf7\x87\x72\x7c\xbc\x12\x8e\x9b\xd0\x8a\x2a\xda" + "\x98\x30\x13\x79\xe2\xff\x17\x9d\xc0\xc7\x2f\x23\x18\xa7\x6e\xe3" + "\x63\x0d\xde\xbb\xe1\x37\xf1\xf5\x19\xd0\x17\xf3\x5d\xfa\xe8\xd6" + "\xbb\x08\x2d\x9f\x8a\xfc\xe2\xe6\x20\xd5\x78\xa0\x01\x25\xc6\xc3" + "\x68\xbc\x89\x86\xf9\xfd\xe4\xff\x6b\xef\x7b\x00\xa2\xaa\xb2\xff" + "\xcf\xbc\x79\xea\x64\x20\xa8\x40\x68\xa8\xa3\x82\x8e\x86\x8a\xae" + "\x9a\xed\x8f\x5a\x2a\x93\xa9\xb5\xa0\xfd\xba\x2e\xb5\xae\x62\x91" + "\x61\x99\x92\x92\x92\x7f\x00\xc9\xfa\x59\xab\x88\x84\x2c\x15\xff" + "\xda\xa8\x9f\xee\xcf\x3f\x58\x56\xb4\x6b\x39\x25\x6e\x58\x08\xd4" + "\xd2\xae\xb5\xba\x8d\x84\x46\x46\xc6\x2a\xc9\x00\xc3\xdc\xdf\x39" + "\xf7\xbe\xc7\xbc\x19\x06\x85\xc9\x76\xcb\x9f\x4f\x1f\xef\xbd\xfb" + "\xce\x3d\xf7\xdc\xfb\x39\x7f\xee\xbd\xef\xcd\xbb\xb0\x6e\x31\x18" + "\x62\xec\xf4\xbb\xf0\x4f\x70\x2f\x80\x22\xa4\xc5\xba\x59\xa8\x6e" + "\x6b\x8e\x63\x7f\xe7\x1b\x35\xcf\xdb\x4a\x9e\xe3\x40\x6d\xd6\x3a" + "\x70\x3f\xd8\xb6\xee\x4f\xc7\xba\x1f\xa3\x36\xc0\x72\x6a\x1c\x94" + "\xef\x3c\x8f\x3b\xd4\x06\xba\x05\x76\xb4\xd5\x6d\x73\xd3\x17\xa4" + "\x58\x38\x5f\xab\x7e\x57\x70\xd1\x72\x2e\x93\x0b\x6d\x8c\x9d\x9d" + "\x6b\x0a\x9c\x8b\xbc\x76\x45\xc5\xa4\xfc\x82\xa1\xfe\xe9\x50\x27" + "\xcc\x2d\x99\xbb\xd2\xd5\xf6\xb6\x76\xfa\x92\x5d\xc9\x88\x85\x59" + "\x9f\x04\x32\xde\x2f\xb6\xea\x6a\xeb\x35\xba\x4b\xfe\xa8\xaf\x4a" + "\xab\xd0\x94\x5b\x75\x7f\x0b\xd7\xd0\x90\xbe\x76\xd2\xe0\x7d\xd4" + "\xff\xda\xa9\xce\xfb\x3b\x6c\x4c\xc3\x43\x89\xab\x2a\x6f\x3d\xfa" + "\xd7\xa8\x8e\xc0\xf9\x11\x2c\xd0\x37\x8a\x9d\x0b\xf6\x61\x12\x62" + "\x63\x67\x36\xc7\xb6\xdb\xd3\x31\x76\xfa\x54\xdb\x9b\x41\xd0\xef" + "\x7e\x9a\x6d\xf3\x35\x8b\x77\x59\x77\x3f\x4a\x3c\xb1\x8f\x55\x83" + "\x71\xd8\x3f\xa6\x82\xd9\xc8\x2f\x74\x6c\x0b\xb4\x64\x2e\xc7\x58" + "\xbc\x6d\xbe\xd1\x11\x78\x4f\x84\xed\xc5\x64\xb2\x87\x58\x16\xb8" + "\x18\xe3\x39\xe6\x55\xf8\x60\xb9\x7d\xac\xfa\xdd\xe6\x0e\xcc\xcf" + "\x72\x6e\x4f\x17\xe9\xc2\x6f\x09\xff\xb2\xdb\xcc\xc2\xf0\x5e\xd6" + "\x2d\x33\xf1\x5e\x9f\x3a\xfd\xee\x5a\x4c\x07\xbc\x5e\x6b\x49\x3d" + "\x4b\x3c\x3e\x15\x3a\x7d\x4b\x94\xcb\xb5\x44\xed\xf9\xa7\xd9\xe4" + "\x7b\x8c\x77\xf0\xb2\x5a\x9d\x7e\x46\xeb\xb3\x6f\xcf\x6a\xc9\xdc" + "\xe3\x63\xd5\x4d\x6a\xe2\xba\x8f\xf9\x9a\xb9\xbf\x42\xbf\x35\x32" + "\xd9\x70\xd0\x0c\x70\xb0\x9c\xec\x68\x4f\x84\x55\x37\x45\x76\xb6" + "\xe5\x9e\xdb\x89\x96\xfb\x10\xf2\xa1\x92\xf0\x57\x94\x87\xe5\xce" + "\xaf\x21\x3f\x48\xfe\xd0\xaa\xdf\x33\x93\x7c\x21\xfa\x89\x19\x4a" + "\xfc\xd9\xc8\xfd\x49\xf6\xda\x06\x94\x2b\xbd\x4e\x91\x45\x2b\x9b" + "\xea\xfb\xd8\xd6\x75\x89\x82\xf6\xf6\x58\x2c\xbf\x14\xcb\x3f\xa6" + "\xd5\x17\x51\xaf\xd2\x40\xd4\xe9\xa3\x93\xca\xf1\x1a\xfb\x48\x75" + "\xfa\x1d\x91\x2c\xf3\x95\xf1\xe8\x5f\x0c\xa4\xa7\xe4\x23\xf3\xb2" + "\x41\xb6\x6d\x5d\x97\xd2\xb1\x75\x5d\x12\xf2\xb1\xa9\x7e\x85\xf2" + "\x91\x2d\xa0\x6f\x31\x70\x9f\xd1\x61\xd7\x73\x7b\xef\x80\xf0\x4e" + "\x3f\x82\x69\xad\x03\xd7\x25\x29\xe9\x32\x97\x27\x43\xef\xc0\xb2" + "\x75\xaa\xec\xad\x03\x6f\x8f\x6a\xc9\x2c\x8d\xb5\xea\x8c\xfe\x2e" + "\x7e\x26\xfb\x26\x1c\x9d\xc4\x91\xce\xe8\x51\xce\xc7\xf0\xd8\x4f" + "\xd1\xc1\xab\x0f\x56\x00\xcc\xbc\x0d\xcb\x40\x2c\x9f\x0b\x62\x4d" + "\x98\x3f\xcb\x0a\x8f\xce\xa6\xfc\x4f\xe3\x35\xa5\x13\x0d\xa6\x6f" + "\xb7\xc2\xf2\x48\xc1\xf7\x4f\xb3\x09\x1b\x37\xbe\x47\x04\x5f\x2e" + "\xcb\xd5\xc4\x93\xf2\x11\xcf\x82\x5c\xd6\x48\x7c\x90\x47\xa3\xca" + "\x7b\x33\xa6\xa9\xfc\x67\x3e\xa2\x96\xb1\xd7\x07\xef\x97\x6b\x65" + "\xcf\xcb\x65\xcd\x42\xae\xbd\x26\x2b\x3c\x15\x41\xf7\x36\x62\x1a" + "\xe5\x15\xf8\xef\xbd\x8d\x74\xc3\x2a\xea\xa3\x17\x3a\xb2\x77\x8e" + "\x15\x36\x94\x69\xe3\x0d\x62\xe0\x2b\xe2\xe1\xcb\xc5\x0a\xbf\x14" + "\x95\x9f\x93\x97\xe0\xc1\xb2\x52\xe3\x35\xf6\xe8\x43\xfc\x91\x1e" + "\xeb\x9f\xec\xa3\xd4\x7f\x46\xb3\xd0\x67\x6c\xfb\xbd\x47\xa8\xed" + "\x29\xf6\x11\xce\xbc\x8c\x17\x93\xa9\xbf\x6c\x40\xfc\x67\xa8\xf1" + "\x11\xb1\x89\x44\x1e\x8d\xce\x58\xb2\xd7\x42\x78\x23\xaf\x79\x18" + "\x8f\x62\xc9\x1f\x29\x65\xde\x4d\x31\x51\xad\x3f\xf2\x91\x3b\x32" + "\x5f\xb9\x83\xf4\x9a\xfa\x22\x2c\xf0\x37\x18\x4f\x5f\x9d\xea\x16" + "\x63\x65\x85\x2e\x8d\x68\x9e\x0d\x62\x0d\x48\x13\xa7\xd2\xd0\x7d" + "\x6c\xe7\x9b\x30\x6d\x89\x15\xb6\xee\xa7\xb4\x4c\xa4\xb1\xea\x5f" + "\xe9\xf6\x37\x39\xa9\x23\x41\xaa\xce\xb7\xd2\x78\x95\x6c\x38\xb2" + "\x3a\xa4\x19\xaa\xf3\x1d\xe0\x78\xe5\xfa\x88\xa8\x54\x66\xc1\x31" + "\xc0\x57\x55\xb6\x06\xe8\x5d\x1f\xf3\xd5\x7d\x5c\x1f\xdb\x70\x5c" + "\xb5\x76\x0a\x50\xff\xe3\x8c\x7e\xdf\x90\xea\xa6\xb3\xdc\x9f\xe1" + "\x39\xff\x5e\xe4\xb3\x38\x0e\xa3\xb1\x18\x8e\xb7\x13\xb3\x24\x31" + "\x1e\x73\x20\x6d\x21\xa5\xd3\x58\x0d\xe3\x54\x91\xe6\x1e\x7b\x65" + "\x5a\xa9\x68\xbb\xd7\x3e\xe2\x7e\x9d\xe4\xb5\x47\x5b\x48\x66\x47" + "\xc9\xb4\x52\xaa\x43\x5a\x0a\x73\x54\xdb\x5b\x2c\x14\xcb\x8c\x2b" + "\x69\x1c\xf9\xda\xae\x98\x02\x60\x8e\x97\xa7\xf5\x72\x1c\xf7\x1a" + "\x7f\xff\x13\xc7\xda\x67\x9a\xc2\xa6\x95\xa6\x75\x80\xb4\x25\xb5" + "\x8f\xe1\xd6\x7c\x66\x39\x37\xe6\xfa\x88\x96\xcc\xd7\x6a\xde\x45" + "\x8a\xde\xf7\xbf\x5f\xab\x51\xeb\x5e\xa8\xd4\x1d\xd3\xf8\x9a\x8d" + "\x93\xf2\xd2\x79\x7d\xad\xfa\x7d\xdd\xce\xf5\xb1\x0c\x3f\x76\x30" + "\xdf\x0e\x2b\xf2\x59\xdb\x8a\x02\xf4\x85\xb9\xbf\x84\x3d\x85\x47" + "\xc9\x77\x47\xa9\xed\xc9\xdb\xce\xde\x04\x49\xa9\xe0\x7f\x5a\xbf" + "\x6f\x6f\xcc\xda\x74\xbe\x2e\xd3\x01\xa4\xeb\x9d\xac\xfb\xf8\xfb" + "\x95\x55\x38\x76\x8f\xb1\xa7\x31\x11\x7f\xf6\x7d\x7a\x97\xc2\x8f" + "\xee\xa9\xf8\x15\x2a\x63\x6a\x2f\xca\xb0\x7a\x51\x57\x7f\xcf\x75" + "\x7d\xbd\xc0\xfb\xba\xbe\x9e\xd8\xb5\xae\xaf\x1f\xba\xb4\x75\x7d" + "\xbd\xd2\x8b\xba\x1a\x3d\xd7\xf5\x8d\xa7\xbd\xaf\xeb\x1b\x73\xba" + "\xd6\xf5\x8d\xbd\x97\xb6\xae\x6f\x74\xfb\xfe\xc7\x05\xea\x1a\xe1" + "\xb9\xae\x6f\x3e\xe6\x7d\x5d\xdf\x8c\xea\x5a\xd7\x37\x0b\x2e\x6d" + "\x5d\xdf\x2c\xe9\xb6\xae\x92\x1f\x23\xff\x84\x7e\xa9\x2d\xb5\x15" + "\xfb\x6d\xb9\xf1\x96\x75\x2f\x82\x54\xd9\x6c\x83\xaa\x90\xa3\x90" + "\xf6\x38\x48\x13\x93\xd0\xef\x65\x40\x24\xcb\xf5\xb1\x54\xe5\x37" + "\x62\xfa\x29\x38\x92\x62\x83\xa8\xe5\xe4\x7f\xcb\x16\x57\x27\xf4" + "\xd6\xff\x96\x4d\xed\xf4\xbf\xf6\x29\x8a\xcf\x7d\x6b\x5b\x55\x63" + "\x1b\x50\xfd\xf1\x7c\x7d\xa7\xff\xcd\x10\xed\xed\xee\x7f\xa9\x3d" + "\xaa\x6d\x36\x17\xff\x2b\x7e\x9b\xf5\xd6\x9d\xee\xbe\x37\xf3\x34" + "\x80\x67\xdf\xfb\xd6\x38\xf2\xbd\x85\x78\xbf\x97\xf2\x37\xab\xbe" + "\x37\x0b\xcb\xd4\xfa\xde\x83\x09\x14\xa3\xdf\x9a\xed\x9d\xef\x7d" + "\x6b\xb6\x5a\xef\x02\xa5\xde\x58\x56\xa9\xab\xef\x7d\x6b\x43\x4f" + "\xf4\x96\xe5\xde\x66\xdd\x33\xdc\xd6\xc7\x51\x72\x7d\x13\xc5\xb7" + "\x16\x6c\x93\x37\x0b\x6d\xf2\x29\xfd\x9f\xc5\xbb\xea\x2d\x09\x3a" + "\x56\x32\x3d\x2f\x26\x99\x7d\xce\xc2\xae\x6f\xa2\xf9\x51\x1a\xe7" + "\xe3\xfd\x1b\xd8\xcb\xd3\xf3\x7a\x27\xb7\xe0\x89\xf1\x2f\x22\x15" + "\xed\x65\xcf\x4a\x9b\xe4\x58\x13\xe7\x87\x38\xf8\xb3\x6d\x77\x18" + "\xd9\x53\xd3\xe6\x9c\xdb\xb6\x20\xeb\x90\xe9\x24\x10\x2d\x5b\x2f" + "\x47\x7d\x0f\xf9\xcb\x2f\x22\x7f\xab\x17\xf2\x97\xf7\x42\xfe\xf2" + "\x1e\xc9\x1f\x84\xf2\xb7\xcd\xe8\x83\xe3\x42\xe9\x40\xdb\x0c\xb9" + "\x77\xf2\xfc\xa5\xdb\xf5\xcf\x2f\x61\x19\x3d\xf6\x7f\x2c\xe8\x37" + "\xc6\x3d\x85\x4d\x12\xfa\x00\x1e\xc3\xc9\xf6\x84\xff\x6b\x40\x9f" + "\xf5\x39\x13\x3e\xa9\xa9\x97\x3e\x69\x7f\xb7\xdf\xbf\xec\x5a\xfe" + "\x2f\xd3\x7f\x80\xf2\xbb\xaf\xbf\xbb\x4f\xdc\x7d\x83\x7f\xf7\x3e" + "\xf1\x8e\xf4\xae\x3e\xf1\xed\x75\xbd\xf7\x89\x6f\x9b\xbb\xfa\xc4" + "\x77\x76\x38\x7d\xe2\x3b\xdb\xbc\xf7\x89\xef\x2c\xec\xb9\x4f\x7c" + "\xe7\x46\xef\x7c\xe2\x3b\x86\x0b\xfb\xc4\x77\xe2\xbd\xf3\x89\xef" + "\xc4\x77\xf5\x89\x6f\x97\xbb\xfa\xc4\x77\xba\x5d\xeb\x8c\x65\x4d" + "\xdc\x8e\x31\xda\xe7\xb4\xfe\x40\xa2\x3d\x03\xc0\x91\xb5\xa3\x2c" + "\xa6\x83\xb5\xb0\xad\x13\xb7\x3b\xa4\xa9\xe4\x57\xa2\x5a\x5a\x12" + "\x0d\x8e\x55\x26\x1f\x36\xe8\xe6\xd3\xac\x3d\x98\xe6\x13\x43\x51" + "\x7e\x3f\xd6\x62\x1a\xc0\x56\x99\x06\xe5\x9f\x87\x00\xdc\x83\xf3" + "\x95\x78\x8c\xe7\x11\x6c\x55\x70\xff\xcc\x95\x10\xee\xd7\x0c\x06" + "\x94\x21\xce\x6f\xbd\x3f\xa0\x0f\x0a\xa0\x73\x96\xf1\x9e\xbd\xe8" + "\x3c\xc8\x7e\x29\x88\xcd\x40\x2c\x2f\xc5\x8f\xb1\x15\x26\x28\x5a" + "\x0e\x06\x87\x04\xc1\x85\x12\x2b\xb5\xb7\x98\xa4\x8e\x80\xf9\x51" + "\x02\x1f\x4b\x08\x1f\x7b\xe5\xcc\xf7\x71\x04\xfd\xae\xb9\x23\x2d" + "\x51\xcf\xd6\xc4\xe9\x49\xd6\x8e\x9c\xdf\x35\xb1\x5c\xdc\xd3\x12" + "\x07\x50\x1f\xba\x68\x25\x96\xdd\x12\xdc\x7f\x0b\x96\x5d\xb8\x12" + "\x42\x0b\xce\x83\x89\x9d\x33\x49\x88\x7f\x1c\xad\x6f\x8a\x6d\x14" + "\xe7\x90\xde\xb3\xe3\x3d\x99\x7c\x22\xa3\xf2\xed\x58\x7e\xbb\x89" + "\xe6\xb2\x50\xb7\x21\xb8\x08\xcb\xef\x58\x65\xea\xa5\xbd\x1c\xe0" + "\xef\x7f\xab\x72\x39\xc2\x6f\xf6\x67\xbb\x71\x27\xb9\xb0\x0d\x8b" + "\xa8\x4d\x26\xde\x1c\x40\xb2\x6d\x3e\x0f\xe1\x28\x67\x28\xca\x60" + "\xc2\x72\xe9\xdb\x30\x71\xf3\x1f\xf5\x27\x1d\x75\x91\xad\x63\xab" + "\x22\xdb\xb7\x28\xdb\x19\xa7\x6c\x54\x16\xb5\x4f\x77\xcf\x5d\x63" + "\xd6\x0d\x27\xdb\xfc\xd2\x2f\xa5\x9f\x99\x9e\xc1\x9e\x5b\x93\xd8" + "\x4b\x5d\xb5\xec\xeb\x4e\x5f\xb6\xec\x86\x10\xe6\xff\x52\xc3\x5d" + "\x4f\x7e\xce\x68\xae\xf0\xc9\xdd\x10\x5e\x8d\x76\x5d\x65\xfb\x06" + "\xd8\xc0\x97\x1a\x0e\x99\x1a\x7b\x59\xd6\xbb\xc6\xee\xca\x7a\x26" + "\x83\xd5\x38\x02\xe6\x47\xb0\x80\x05\x1b\xb7\x64\xb0\x94\xf6\xd0" + "\x69\x35\x6d\xa1\xd3\x8b\x17\xd8\xfd\x51\xaf\x59\x8a\x71\x39\x18" + "\x4f\xe9\xdf\x7f\xe0\x83\x5a\x1c\x97\xde\x0b\x86\x3a\xfd\xfb\xf9" + "\x69\x9f\xd2\xf3\xa9\x77\x4b\x5d\x9f\x4f\xbd\x5b\x0b\xfa\x83\x33" + "\x41\x5f\x3e\x07\xf4\x87\x52\x00\xe9\x5c\xf7\xbf\xe6\x08\x5e\x07" + "\x47\xc6\xec\x18\x0e\xa9\x76\xf6\x25\xcb\xf1\xb5\x65\x4a\xcc\x16" + "\x33\x4e\x67\xb5\xac\xa4\xe7\x36\x07\x87\x60\x9b\x7e\x8d\xb1\xd6" + "\xef\x94\xfe\xbd\x93\x88\x29\x24\x2d\x87\xc1\xa7\xf5\xef\xd5\x93" + "\xdd\xf8\x35\xf7\x33\x77\xa4\xc5\x81\xdd\x98\x0c\xed\x39\xf3\x8d" + "\x1d\x39\xb7\xa7\x3b\xfc\x77\x94\xd1\x5c\x2f\x3d\x6f\x45\xdb\x88" + "\x5b\xd0\x61\x20\x7b\x8c\xb3\xdc\xf7\x01\x9c\x4a\x06\x29\xed\x3b" + "\xf0\x45\xdd\xec\xb4\xab\x3b\x1b\xfd\x6c\xeb\x1a\x99\x83\x6c\x8b" + "\xe6\x56\xf1\xde\x80\xd4\xef\x70\x7c\xdf\xd4\x00\xf9\xcb\x21\xa0" + "\x63\x45\xe2\xa0\xa6\x73\x89\x83\x5f\x70\x40\xc0\x80\x66\xf0\xcf" + "\x3f\x8b\x3a\xb5\x02\xf5\xe9\x2c\xda\x59\x93\xb0\x33\xfa\x7d\x7f" + "\x21\xd9\xd8\x33\x5f\x45\x14\x9d\x15\x36\xc6\xf5\x88\x6c\x6c\x19" + "\xea\xd1\x52\x8a\x1f\xa8\x47\x19\x68\x63\x68\x17\x2c\xd3\x92\x93" + "\x9f\xc1\x68\xee\x57\x2a\x3a\xdd\x8f\xee\xe9\xfa\x8c\x93\x8c\x1f" + "\xc4\xda\xc0\x39\xd7\xf1\x7e\x41\x5b\xd8\xf4\x62\xe3\xaf\xd8\xb7" + "\x75\xfa\x83\xfe\x98\x6e\x30\xce\x1d\xeb\x8f\xed\xad\xfc\xf6\xe8" + "\xfd\x7c\x9a\xcf\xb4\x62\x5b\x50\xbb\x18\x7f\x05\x63\xeb\xf4\xef" + "\x9e\xa4\x76\x5c\xb5\x1d\xf4\x49\x37\xb1\x7a\x6c\xb3\x46\xc6\xe7" + "\x5d\xde\xe5\xcf\xa2\xe9\x99\xfe\x87\xfc\x79\x99\xc8\xd3\x81\xed" + "\x66\x0f\xf0\x35\x23\xde\xb1\x96\x87\xda\xb8\x1f\xa2\x76\x3c\xb5" + "\x04\xa4\x05\x8d\xd8\x56\x1d\xd8\x56\x2d\x26\x1f\xf4\x47\xb1\xe4" + "\x8f\x58\xd6\xcd\xf5\x6b\xad\xcc\x11\x93\xa0\x67\xa9\x8f\x82\x81" + "\xe6\xb8\xe7\x27\x01\x5b\xf7\x0d\xb6\x57\xf3\x51\x40\xbf\x34\x00" + "\x7d\xd6\xa0\x82\x95\x10\x40\xed\xe5\xdb\x88\x7d\x95\xec\x97\x4b" + "\x77\xa7\x56\xf4\xe9\x40\xfd\x25\xff\xe4\xb7\x5e\x77\x15\xda\xd9" + "\x80\x4d\x64\x8f\x68\x9f\x7e\xeb\xb9\xbf\x8c\xcb\x47\x3b\xb4\xaf" + "\x32\x8d\x6a\x5f\x65\x32\xe2\x3e\x5c\xf5\x61\xaa\xff\xc0\x36\xe3" + "\xfe\xab\x3a\xc5\x0a\x76\x6c\xdb\x01\x14\xeb\x56\x99\x42\x78\x1b" + "\x3f\x68\x82\x49\x36\xd0\xa1\x4c\xfe\x28\x2f\x14\x2d\x02\xc3\x91" + "\xc4\x3a\xe8\x40\xdb\x50\xdb\xfd\xce\xc5\x46\x40\xbe\xd2\x21\xd3" + "\x27\xa0\xb4\x99\xae\x7b\xbd\x3b\xf4\xa8\x53\xef\x0e\x3d\x4a\x6d" + "\x27\xf4\xee\x50\xd2\xe5\xa8\x77\x1f\xc6\x71\xbd\xd3\xb7\x87\x71" + "\x7d\x6a\xac\xb6\xbf\x8a\x6d\x74\x68\x1e\xe9\x08\xe9\xcc\xe1\x3f" + "\x91\xce\xfc\x75\xc3\x8f\x55\x67\x5a\x5b\x4c\x46\xdc\x7f\x10\x9d" + "\x41\xbe\x5c\x67\xa8\xad\x3e\x8c\x6b\x03\xb5\x8d\xb8\xad\x66\xbd" + "\xd4\x60\x4c\x83\x5f\xa0\xad\xe6\xfb\xad\x1f\x0e\x47\x78\x3b\xbd" + "\x9f\x6f\x9c\xcb\x1c\x75\xfa\xbf\xbe\x9d\xf6\x11\xf8\xb7\x65\x30" + "\x56\x6d\xdf\x05\x8e\x80\x7b\x22\x68\xae\xdd\x91\x13\x68\xc1\x31" + "\x2b\xad\x6d\x43\x36\x2d\xfb\x25\xd1\xb3\xfe\x12\x0b\x3d\xe3\x73" + "\x6c\x7d\xc9\xc6\x06\xee\x4f\xa1\xe7\x0c\x8e\xad\x4f\x58\x1c\x03" + "\xff\x52\xd3\x92\xf9\xbe\x6c\x85\x2f\xa2\xf8\x5c\x78\xce\xfc\x08" + "\xf4\x0d\xe4\x7f\x27\x88\x67\x62\xf4\x4c\xf1\xfd\x50\xf5\x99\x36" + "\xf9\x04\xe5\x39\x83\xf2\x1c\xe2\x7d\xc2\xb0\x3f\x3d\x87\x50\x7c" + "\x4a\xa0\xfa\x1c\x42\xbd\xa6\xfb\x98\x2f\x98\x3f\x63\x75\xe6\xcb" + "\x51\xe8\x94\x7c\xef\x3e\x47\xbe\xde\x99\x4f\x5c\xa3\x5f\xc9\x69" + "\x97\xc0\xe0\xb1\x8f\x13\xb0\xd8\x88\xf6\x83\x63\xa3\xc3\x81\x78" + "\x94\x4e\xe9\x2b\xa6\xe1\x51\x8f\x47\x3e\x8f\xd9\xbb\x78\xf5\x7e" + "\x8d\x78\x16\xb4\x60\x9f\x22\xf7\x47\xdc\x26\xc7\x83\xef\x69\xe5" + "\xbc\x25\xb3\x22\x5c\x7d\x36\xdf\x49\xef\xc4\xa7\x82\xca\x46\x8c" + "\x64\xf1\xbe\x80\xb8\xa6\x77\x71\x14\x7e\xfc\xda\x11\x3a\x23\xcb" + "\x92\x5a\x07\x8d\xfa\x8a\xbc\x6a\x8c\xe1\x8e\xdc\x05\xfb\xe8\x19" + "\x19\xd9\x95\x5a\x2e\xda\xa2\xc1\xb2\x9a\xd3\x3c\xce\xfb\xb9\x39" + "\x73\xb3\x58\xae\xaf\x85\xc6\x82\x2d\x2c\xf1\x26\xe5\x78\x23\xd9" + "\x93\x98\x37\xa9\x38\xc9\x10\x5b\x5a\x9f\xbd\xf3\xfd\x24\x5a\x37" + "\x3d\x5d\x36\xbe\xbb\x56\xc4\x4a\x55\x5e\x5a\x5b\x9d\xde\xff\x19" + "\x9b\x0e\xe9\x2d\x1e\xd6\x56\x77\xbe\x27\x54\x51\xe3\xd8\x36\x37" + "\xab\x25\xf3\xb0\x11\x31\x88\xd7\xd6\xd9\x13\x16\x56\xfd\xe1\xc8" + "\xee\xee\xf5\x0e\x87\xc3\x71\xdd\xf1\xb9\xcd\xd4\xc1\x7a\xc9\xab" + "\xfb\xf9\x9f\xd0\x69\x11\x31\xdb\x3b\x2c\x8e\xf6\x38\xbf\x43\x6b" + "\xbf\xe9\x65\xdf\xe6\xb0\xbd\x3b\xbe\x1d\x39\xf7\xc4\xb6\x8f\x99" + "\x16\x81\xd8\xf8\x74\x2c\x8b\x8b\xae\xda\x6e\x87\x1d\x4b\x1b\x24" + "\xf2\x87\x3b\x4f\x97\x4a\x31\xe3\x94\x3e\x5c\x3d\xf8\xd3\xbc\x17" + "\xf5\xe5\x32\xcf\x40\x68\x5b\x5a\x9c\x5f\x5b\x7b\x1c\xfc\xfe\x0c" + "\x44\x3a\x1e\x0c\xee\xbf\x69\x11\xc8\xad\xe8\x0b\x5b\xbf\x4c\xf4" + "\xfb\xf0\x58\x03\x1c\xc0\xbc\x55\xcd\x56\x28\x44\x5a\xf6\x65\xdc" + "\x80\x5f\xc6\x33\x5b\x65\xfc\xab\x10\x63\xea\xb0\xa4\x9e\x00\x5f" + "\xf4\x89\xfe\xd5\x29\x2f\xe3\x18\xea\x1b\xe8\xf3\xb8\x64\xac\xb6" + "\x9f\x84\xcd\x8b\xd0\x97\xa2\xef\x4c\xfb\x35\xc6\x0c\xd4\x89\x17" + "\xb4\x31\xe3\xa1\xe7\x9d\x31\xe3\x5b\x8c\x19\xd9\x18\x33\xd2\x82" + "\xa1\x2a\xc9\x02\xe8\xc3\xfa\xdd\x95\xe4\x67\x4b\x4d\xc2\xd8\xf1" + "\x38\xc6\x8e\x94\x93\xc0\xe3\x46\x63\x03\xa0\xcf\x1f\x50\xb0\x14" + "\x02\xda\xbe\xc5\xd8\xf1\x2d\xc6\x8e\x54\x11\x3b\x9e\x3b\x83\xb1" + "\x63\x19\x8e\x0d\x96\x62\xec\x68\xf4\x10\x3b\xce\x78\x1e\x17\xa8" + "\x7e\xb0\xf5\x5b\x93\xf4\x1c\xc6\x8d\xd5\x9f\x80\xf4\xdc\xdc\x7e" + "\xbd\xd4\x99\x0f\xbb\xfd\xfd\x0f\xcb\x5d\xf0\xac\x83\xc5\x01\xb5" + "\xfb\x6a\x1b\xc6\x61\xc4\xa5\xda\x64\x07\xbf\xda\x7e\xe6\x56\x4c" + "\x6f\x0f\x9a\x05\xdb\x3f\x6b\x92\x58\xce\x1d\xc6\x56\xc4\x6d\xf5" + "\x63\x20\xb5\x23\x86\x3b\x7f\x95\x25\xd1\x38\xd1\xb1\x6d\xd6\x4c" + "\x31\x26\x3d\xf2\x32\xcd\x89\xf8\x59\x05\x6e\x76\x16\xe7\xc7\xee" + "\x8f\xf3\xdd\x7c\x1f\xc8\x1d\x5f\x04\xf7\x77\xdc\x1f\x6c\x48\xfd" + "\x04\xfc\x9b\xee\x4f\xc4\xf6\xfa\x06\x0e\x7c\x9c\x25\x15\xdd\x0b" + "\x46\xfa\x16\x23\x7b\xca\x0a\x45\xf3\x61\x46\xd1\xbf\x60\x6a\xe1" + "\xbd\x10\x5e\xf0\x19\x7d\xb3\x1d\x31\x6c\x60\xb6\x23\x89\x7f\x86" + "\xa2\xcf\x20\x8a\xe5\xde\x0e\x2c\xf0\x9e\x58\x3c\x9f\x91\x75\x2f" + "\x8e\x1f\xf0\x7e\x8c\xa9\xd5\x52\x9d\x72\x04\x36\xd5\x01\xa4\x7e" + "\xa5\x60\xdc\x89\xef\x71\xb0\x4b\xe8\x3f\xa8\x4f\x70\xa7\xc0\x97" + "\x9e\x83\xd1\x98\xa3\x13\xe3\x45\xef\xb9\xf6\x0b\x14\x8c\x8f\x34" + "\xd6\x00\xc6\xc0\x7e\x9d\xfd\x03\x8e\xf1\x71\x50\xfb\x06\x88\xcd" + "\x00\xec\x0b\x04\xb4\x9e\x73\xeb\x1f\x2c\xf7\xb2\x7f\xa0\x8c\x6f" + "\xec\x2b\x4c\x52\xbe\xc4\x20\xed\x08\x48\x79\x8e\xde\x62\x7c\x24" + "\x89\xfb\xdb\x92\xe9\x79\xe2\xbd\x9c\xca\x71\x84\x85\x55\x5f\x69" + "\xfa\xb5\x49\x07\x5e\x62\x9f\x7e\x11\xec\xcb\x05\xf6\xd5\x2f\x7a" + "\x89\x7d\x3a\x62\x1f\xe7\x1d\xf6\xdf\xf5\x12\x7b\xfe\x4d\xcb\xcb" + "\x14\xfb\xea\x25\xae\xd8\x57\x85\x09\xec\xab\x42\xbd\xc7\x3e\xfa" + "\x22\x76\x1f\xad\xd8\xfd\x47\x05\xde\x61\x1f\x4d\x76\x5f\xea\x1d" + "\xf6\xdf\xf4\x12\x7b\xfe\x5d\xcc\xcb\x14\xfb\x8f\x12\x5d\xb1\xaf" + "\x19\x29\xb0\xaf\x31\x7e\x0f\xec\x2f\x62\xf7\xd1\x8a\xdd\xff\xed" + "\x39\x2f\xb1\x47\xbb\x3f\x61\xf0\x0e\xfb\xe3\xbd\xc4\x9e\x7f\x5b" + "\xf3\x32\xc5\xfe\x6f\x09\xae\xd8\x7f\x3c\x4c\x60\xff\x71\x88\xf7" + "\xd8\x9b\x2f\x62\xf7\x66\xc5\xee\x3f\xd9\xe6\x1d\xf6\x66\xb4\xfb" + "\x13\xf1\xde\x61\xff\x76\x2f\xb1\xe7\xdf\xe7\xbc\x4c\xb1\xff\x24" + "\xde\x15\xfb\xda\x21\x02\xfb\xda\xe0\xef\x81\xfd\x45\xec\xde\xac" + "\xd8\xfd\x3f\xb6\x7a\x89\x3d\xd9\x7d\x99\x77\xd8\xaf\xeb\x25\xf6" + "\xfc\x1b\x9f\x97\x29\xf6\xff\x98\xe7\x8a\xfd\xdf\x03\x05\xf6\x7f" + "\x0f\xe8\x09\xf6\x6b\xb4\xd8\x1f\xeb\x67\xc6\xb1\x15\xef\xe7\xef" + "\xb8\x57\xc1\xfe\x15\xc4\x1e\xeb\xbf\x73\x6e\x9e\x5b\x1f\xff\xd3" + "\x27\x39\xee\xf1\x88\x7b\x0a\xe2\x8e\x63\x43\x15\x73\xc4\xc8\x97" + "\x70\x27\xcc\x53\x8f\x83\xff\x01\xcc\x4b\xf8\x10\xc6\x88\xa3\x91" + "\xe3\xdc\xd7\x0a\x4c\x27\x07\x13\x9e\xd4\xef\x27\xcc\x2f\xd6\xb7" + "\x27\x9d\xb8\x28\xe6\x77\xff\x30\xfd\xfb\x36\xf7\xf9\xbf\x4b\x85" + "\xf9\x47\x38\x86\x4b\xed\x2d\xe6\x9f\xc6\xba\x62\x7e\xd4\x97\x70" + "\xb0\xea\x8f\xfa\x78\x8f\x79\x74\x7a\xf7\x98\xab\x31\xfe\x9f\x8f" + "\x7f\x3f\xcc\x4f\x18\x9c\x98\x47\xa7\x5f\x18\xf3\xe3\x5e\x60\x7e" + "\x69\xe3\xfb\x8f\x0b\xf3\x7f\xce\x74\xc5\xfc\x33\x9d\xc0\xfc\x33" + "\xe8\x0e\x73\x07\xfa\x6b\x9a\x53\xa7\xdf\x1c\x76\xb4\xc4\x45\xb7" + "\x23\xae\xf4\xdb\x43\x9a\xeb\xdd\xb5\xb4\x4c\x6a\x47\xdc\xb7\xac" + "\x84\xd0\x4d\x2b\x21\xd2\xaf\x41\xf8\xef\x36\xf4\xdf\x4f\x9f\x07" + "\xd9\xf1\x70\x70\xff\x4d\xa7\x41\x6e\xc3\x36\x6e\x7b\x38\xd1\xaf" + "\x32\xbe\x09\x0e\x9c\x29\x93\x68\xee\x96\x9e\xdb\xb1\xaf\xe3\x06" + "\xdc\x9e\xc0\x6c\x95\xf5\xd9\x62\x5e\xe5\xa4\x3a\xaf\xb2\xcb\x65" + "\x5e\xe5\xf7\xa7\x95\x79\x95\x7b\x04\x46\xf9\x5a\x7c\xe6\xff\xb1" + "\x9b\x79\x95\x8a\x8b\xce\xab\xf0\xf9\x94\x33\x10\xd0\xbe\x2c\x71" + "\xd0\x73\xca\xbc\xca\xf3\x4b\xbf\xdf\xbc\x4a\xdb\x32\x93\xf4\x3c" + "\xe2\xb3\xe6\x1e\xc4\xe7\xb3\xde\xe2\x73\xac\xbe\xa7\xf3\x2a\x6a" + "\x8c\x55\xe3\x2a\xd9\x1c\xc5\x56\x5b\xce\x2c\xd9\x7d\x2e\x85\xec" + "\xed\x8c\xfe\x5f\xdf\x91\x4f\xf6\x6e\x3e\xa5\xce\xff\xa7\x36\x9f" + "\x42\x36\xa7\xc6\xd9\x1f\x47\x8c\xfd\x97\xc5\xd5\xf6\x8e\x3f\x2e" + "\x62\xec\xf1\x94\x9e\xf6\xaf\x2e\x80\xf9\x06\xf7\x39\x14\x81\xb9" + "\xf5\x2b\x9a\x73\xf1\x6e\x1e\xa5\x2e\xe1\xa7\x36\x8f\xf2\xe3\xc3" + "\xdc\xba\xcf\x15\xf3\xcf\x1f\x11\x98\x7f\xbe\xe4\xfb\x63\x1e\x2d" + "\xbb\xcf\x9d\x08\xcc\xeb\x8e\xd3\x5c\x8b\x77\xf3\x27\x75\x5e\xf6" + "\xa5\xff\x7b\xf3\x27\x3f\x3e\xcc\xeb\xb6\xbb\x62\x7e\x62\xa1\xc0" + "\xfc\x44\xfc\x25\xc0\x7c\x83\xfb\x9c\x89\xc0\xbc\xfe\x23\xea\x7b" + "\x79\x37\x6f\xf2\x85\xcf\x4f\x6d\xde\xe4\xc7\x87\x79\x7d\xbe\x2b" + "\xe6\x5f\xfc\x5a\x60\xfe\xc5\x9c\xef\x8f\xb9\x59\x76\x9f\x2b\x11" + "\x98\x9f\x3a\x44\x73\x2b\xde\xcd\x97\x7c\xf1\x93\x9b\x2f\xf9\xf1" + "\x61\x7e\x2a\xcb\x15\xf3\x93\xb7\x0b\xcc\x4f\x9a\x2f\x01\xe6\x1b" + "\xdc\xe7\x48\x04\xe6\x0d\x6f\xd1\x9c\x8a\x77\xf3\x24\x5f\xec\xfb" + "\xa9\xcd\x93\xfc\xf8\x30\x6f\xd8\xe0\x8a\xf9\x97\x37\x0a\xcc\xbf" + "\x8c\xec\xe9\x98\x59\x1d\x2b\xab\xe3\x63\x3e\x56\x0e\xc0\x3e\xbb" + "\xdb\xdc\x88\xc0\xfb\xf4\xcb\xbc\xcf\xee\xf5\x58\xb9\xce\xff\xa7" + "\x32\x3f\xa2\x62\x4d\xe3\xe5\x1f\xc7\x58\xf9\xb4\xdb\xf3\xcf\xaf" + "\x26\x88\xb1\xf2\x57\xe1\xdd\x61\xed\xe9\x5d\x84\x2a\x1c\x6b\xaa" + "\xef\x22\x3c\xbd\x12\x71\x44\x3d\xa0\x77\x11\xe8\x9d\x04\x4f\xef" + "\x23\xd0\x7b\x08\xea\x3b\x09\xda\xf7\x11\xcc\x56\x66\xa3\x77\x12" + "\x68\x9c\x5c\x19\xff\x0c\xa8\xef\x26\xd0\x3b\x08\x69\x27\xc0\x97" + "\x30\xa2\xf7\x0f\x68\xbc\xfc\x43\xbf\x83\x90\xe7\xf8\x31\xbc\x83" + "\xd0\xe8\x7f\xb1\xb1\xf2\x9d\x3b\x86\x03\xea\x5b\xe7\x3c\x55\x7b" + "\xee\x2c\x20\x9b\x23\x8c\xfc\x1a\x85\x1d\xee\x9a\x5b\x2a\x55\xa7" + "\x94\xc1\xd3\xab\xc1\x5f\x9d\xbf\x20\x1b\x44\xbf\xec\x67\x47\x3c" + "\x37\x3d\x24\xe6\x31\x1c\x5f\xc7\xf9\x36\x3d\x9c\xe8\x47\xbf\xdd" + "\x3f\xf0\xf7\x52\x89\xe6\x1e\x8b\x16\xc1\xd4\x17\x4e\xc1\x8c\xaa" + "\xe6\xe3\xc0\x6d\x6a\xdb\xac\x19\x98\xd7\xd8\xbe\xed\x9e\x58\x47" + "\xe0\xac\xd0\xa6\xc0\x59\x26\xc2\x6d\xd3\x69\x00\xb2\x2f\xc2\xad" + "\x3a\xa5\xa0\x13\x2f\x8e\x95\xa4\xcc\x6d\x74\x6b\x53\x1f\x7b\x8d" + "\x59\xfe\x19\xc4\x6c\x99\x2b\x66\x05\xde\xce\x6f\xa8\xef\x73\x2f" + "\x33\x49\x05\x68\x53\xab\xef\x46\xcc\x7e\xd5\x5b\xcc\xbe\x29\xf7" + "\x02\xb3\xf4\x1e\x62\x56\xde\x03\xcc\xe2\x3c\x60\x56\x86\x79\x8b" + "\x15\xcc\x4a\x10\xb3\xed\x4e\xcc\xbe\xeb\x21\x66\xee\x63\xd8\xcb" + "\x09\xb3\x6f\xbb\x5d\xff\xa5\x7b\xcc\xa2\x7b\x68\x67\xd1\x3d\xb1" + "\xb3\xd2\xae\x98\x45\xa3\x9d\x45\x2b\x76\x16\x8d\x76\x16\xad\xb1" + "\xb3\x6f\x7a\x88\x99\xfb\x18\xf4\x72\xc2\xec\xdf\xe1\x5e\x60\xd6" + "\x43\x3b\x8b\xee\x81\x9d\x9d\x30\x78\xc0\x0c\xed\x2c\x5a\xb1\xb3" + "\x68\xb4\xb3\x68\x8d\x9d\x1d\xef\x21\x66\xee\x63\xc8\xcb\x09\xb3" + "\xb3\xdd\xff\xfe\xbb\x5b\xcc\xcc\x3d\xb4\x33\x73\x0f\xec\xec\x44" + "\x7c\x57\xcc\xcc\x68\x67\x66\xc5\xce\xcc\x68\x67\x66\x8d\x9d\xbd" + "\xdd\x43\xcc\xdc\xc7\x80\x97\x13\x66\xcd\x39\x5e\x60\xd6\x43\x3b" + "\x33\xf7\xc4\xce\xca\x3c\x60\x86\x76\x66\x56\xec\xcc\x8c\x76\x66" + "\xd6\xd8\xd9\xba\x1e\x62\xe6\x3e\x86\xbb\x9c\x30\x3b\xdf\xed\xfa" + "\x4f\xdd\x61\xc6\xf1\xc2\xbe\xa3\x47\xcc\xda\x5c\xfb\x8d\x76\xec" + "\xc7\xd3\x33\x2f\x8f\x78\x3d\x65\x05\xb6\x5e\x0e\x26\xac\xa8\x3f" + "\x48\x78\x55\xa7\x1c\xf2\xd8\x6f\xa4\xe7\x62\x88\x3b\xd0\xb3\xb1" + "\xb4\x93\xbd\xe8\x2f\xde\xd7\x1d\x56\x17\x7f\x1e\x96\xbf\xd4\x89" + "\x95\xfa\x3c\xec\x92\x62\xf5\x71\x6f\xb1\x6a\x69\xf6\x0e\xab\xe8" + "\xf4\x8b\x63\x15\x5d\x7e\x61\xac\x4e\x18\x9c\x58\x1d\xd7\x60\xd5" + "\x35\x8e\xf5\x1c\x2b\xb7\xf8\x75\x59\x61\xd5\x5a\xdc\x1d\x56\xf6" + "\x80\x7b\x62\xe9\x37\xef\x77\xe1\xd8\x97\xdd\x1f\x17\x9d\x59\x07" + "\xa1\xcf\xd4\x41\x24\xfd\xbe\x79\xd7\x6a\x9b\x84\x75\xfc\xf2\x83" + "\xda\x06\x68\xff\x3a\xb8\x3f\xfd\x7e\x86\xfb\xc9\x87\x83\x0d\xd5" + "\xf1\x4d\xdc\x27\x6e\x46\x8c\xaa\x9a\xcb\xb0\x4d\xfa\x99\xab\x9a" + "\x5f\x85\xb6\x15\x71\xf0\xe1\xb1\xd3\x88\x0b\x6b\xaf\x6e\x2c\x83" + "\x22\xbc\x6f\x59\xf9\x2a\x38\xbe\x36\xf5\x5f\x90\x02\xd2\x19\x7d" + "\x5b\x02\x8d\x9d\x27\xa5\x80\xff\xec\x46\x66\xab\x6a\xfc\x00\x5e" + "\xb8\x0f\x42\x0f\x61\x4f\x96\xda\x9a\x8f\x95\x1f\xa2\xb1\xf2\xdb" + "\x2e\xf8\x3c\xaf\x19\x2b\xf3\xdf\xcb\x26\x21\x36\xff\x76\xc3\x06" + "\xc7\xe2\xd8\xd6\xfd\xee\x6a\x46\x6c\x9a\x55\x6c\xbe\x81\xd4\x47" + "\x09\x1b\xab\x73\xac\xac\x60\x93\x4f\x3e\x2f\x49\x33\x56\x3e\xa3" + "\xc1\x46\xf9\xad\xaa\x0b\x36\xea\x5c\xc6\x2a\x13\x3d\x23\xef\x32" + "\x56\xf6\x6e\x2e\xa3\xbd\xdb\xdf\x8a\x70\x3b\x42\x1b\xb9\x0b\xed" + "\x68\x6d\x32\xb7\x23\xd1\xfe\x41\xb3\x50\xdf\x4b\xc1\xcf\xda\xcf" + "\xfc\x0c\x62\xd0\x86\xb6\x46\xb1\x28\x0d\xeb\x49\x58\x12\x6e\x77" + "\x6d\x6f\x6f\x9f\xdf\x0c\x12\xfa\xac\x99\x84\x5d\xc7\xd7\xc1\x86" + "\x4c\x8c\x55\xd5\xf3\x3e\x43\x7c\xce\x42\x75\x93\x82\xcd\xea\xcf" + "\xe0\x8c\xbe\xdd\xc6\x1e\x36\xf5\x9f\x88\x7a\x8a\xb1\xc7\x7f\x01" + "\xfd\xf6\x05\x7d\xde\x0b\x8b\x60\xc6\xec\x24\x66\xe3\xef\xf2\xa0" + "\x8d\x51\x3c\x23\x7f\x58\x95\xf4\x1e\x74\x6c\x9b\x15\xda\x1e\x78" + "\x4f\xec\xa1\x64\x00\xf2\x89\x84\x45\x9f\xc7\x9c\xd8\xd1\xef\xf6" + "\xb4\x73\x1d\x5d\x7c\xe1\x43\x1f\x78\xb6\xaf\x79\xd6\x5e\xcd\x77" + "\xe4\x2b\xf6\x95\xef\xed\x7c\x87\x3a\x1f\x85\x18\xd2\x6f\xf5\xd2" + "\x3e\x01\xe9\xf9\x5e\x63\xd8\x01\x5e\x60\x98\x7e\x71\x0c\x5b\x54" + "\x0c\xcb\x2f\x8e\x61\xc7\x7e\x0f\x18\x16\x6b\x30\x8c\xd3\x60\x58" + "\xa6\x60\x58\xa2\xc1\x70\xfb\xc5\x31\x74\x1b\x4b\x5f\x56\x18\x3a" + "\x2e\x3c\xff\xe1\x11\xc3\xe8\x1e\xd8\xe1\xb7\x0a\x86\xd1\x3d\xb0" + "\x43\x96\xde\x15\xc3\x68\xad\x1d\x96\x3a\x31\x8c\x56\xec\x30\x5a" + "\x63\x87\xd1\x3d\xb0\x43\xb7\xb1\xf5\xe5\x84\xa1\x0c\x1b\xbd\xc0" + "\xb0\x07\x76\xf8\xb9\x8a\xe1\xc5\xed\x50\xd6\xcd\xf4\x80\xa1\xc6" + "\x0e\xb1\xef\xe2\xc4\x50\xb1\xc3\x68\x8d\x1d\x46\xf7\xc0\x0e\xdd" + "\xfa\x2a\x97\x15\x86\xd2\xec\xde\x63\x68\xee\x81\x1d\x1e\x50\x30" + "\x34\x5f\xdc\x0e\x65\xbd\xa1\x2b\x86\x66\x8d\x1d\x9e\x88\x77\x62" + "\x68\x56\xec\xd0\xac\xb1\x43\x73\x0f\xec\xd0\x6d\xec\x7d\x59\x61" + "\x28\x5f\x78\xfe\xdf\x33\x86\x3d\xb0\xc3\x34\x15\xc3\x1e\xd8\xa1" + "\x5c\xe9\x01\x43\xad\x1d\x96\x69\x30\x54\xec\xd0\xac\xb1\x43\x73" + "\x0f\xec\xd0\x6d\x2c\x7e\x59\x61\xd8\xa7\xb6\x27\x18\x62\x3f\xbb" + "\x6b\xbf\xb4\xd9\x89\xa1\x16\x3f\xf7\xbe\x68\x0c\xf6\x51\x09\xbb" + "\x79\x76\x90\xba\xe2\xd7\x77\x13\xe1\x17\x4e\xcf\xe3\xbe\x73\xf6" + "\x49\x39\x76\xca\xf3\x1c\xc2\xec\x50\x02\x00\xf5\x4f\xd5\xfe\x28" + "\x3d\x53\xed\xec\x8f\x3e\xf0\xff\x69\x7f\x54\xee\x97\xd5\x7b\xec" + "\x94\x38\xd8\x2d\x76\xae\xb1\x2f\x06\x63\x62\xf7\xd8\x19\xcc\x5d" + "\xb1\x8b\x2e\x76\x62\x27\xe2\x9e\xc0\xee\x84\x41\x8d\x7f\x02\x3b" + "\x25\xfe\x5d\x10\xbb\xcb\x39\xfe\x5d\xd5\x6d\xfc\xcb\x92\x1c\xa5" + "\xb8\x97\xe1\x6e\xc1\xbd\xa2\x43\x82\xdb\x0a\x24\x87\xf8\xf6\x82" + "\xd0\x67\xf7\xfb\x7d\xd9\x53\xe1\x21\x44\xc3\xd6\xcb\x01\x44\xa7" + "\xf2\xe8\xe8\x0f\x80\xe9\x16\x3f\x5d\x3c\xad\x35\x42\xb4\xfd\x54" + "\x5e\x7e\xeb\x21\x0a\xeb\x2c\xe8\x24\x48\x17\x74\x51\x7d\x89\x8e" + "\x65\x1e\x8e\xc3\x34\x83\xc2\x93\xaf\x6d\xd8\x21\x49\xc4\xcb\xbd" + "\xec\xab\x14\x1a\x63\x47\x06\x18\xb5\x65\x23\x2f\x2a\x53\xa5\xeb" + "\x4f\x74\x1d\x7d\x75\xe9\x1d\x3a\x39\x54\x4b\xc7\x6e\x01\x2d\xdd" + "\xd5\x0a\x3f\x93\x4b\x3d\x46\x01\xf8\xe9\x8c\xa2\x2e\x29\x92\x5a" + "\x17\x1f\xce\x73\xc0\xfb\xa5\xc8\x33\xdc\x85\x67\x5f\x00\x5f\xa4" + "\x27\xbe\xbe\x89\x5c\x6e\xa2\xf7\x65\x7d\x4f\xca\x9c\xbf\x4e\x8e" + "\x70\x48\x10\x21\xea\x05\x72\x41\xa7\xcc\x46\xc8\x72\x2d\x63\x80" + "\xda\x5e\x5a\x3a\xa2\x61\x52\x27\x8d\x9f\xa8\x5b\xbd\x01\xe5\x98" + "\xa1\x95\x43\xd0\xc1\x64\x85\xce\x1f\xeb\x15\xd9\x89\x65\x8e\xaf" + "\x4d\xa5\x4b\xeb\x80\x21\x88\x85\xa5\x3a\x11\x40\x69\x87\x81\x88" + "\x41\xa3\xd2\x16\x51\x5a\x9e\xbe\x3a\x9d\xb5\x40\x69\x2f\x47\xe6" + "\xe1\x62\xa4\x1d\xe4\x58\x2f\xcf\xec\xe4\x9b\x41\xdf\x94\x52\xda" + "\x21\xc3\x3e\x98\xf3\x6d\x40\xdb\x92\x74\x46\xa5\x1d\x06\x13\x2d" + "\xe6\x31\x8b\x7a\xf9\x77\xe2\xda\x21\xc9\x74\xcf\xa2\xa1\x0d\x10" + "\x6d\xfc\x8f\xfd\x58\xb7\xd9\x5d\xe9\x0d\xee\xf4\x81\x82\xfe\xc3" + "\x5a\xa4\x8f\xed\x4a\xef\xef\x4e\x1f\x24\xe8\x8f\xd4\x20\xfd\x9c" + "\xae\xf4\xf6\x41\x6e\xf4\xd7\x08\xfa\xea\x4a\xa4\x8f\xeb\x4a\x6f" + "\x74\xa7\x0f\x16\xf4\x9f\x92\x8e\xcc\xeb\x4a\x1f\xe5\x4e\x3f\x44" + "\xd0\x7f\x54\x81\xf4\xf1\x5d\xe9\xd3\xdd\xe9\x87\x0a\xfa\xbf\x95" + "\x23\x7d\x82\x3b\x7d\x11\xa7\x85\x51\x0a\xed\xb5\x82\xf6\x13\x0b" + "\xd2\x26\x7a\xa8\xab\x5e\xe1\x1d\xa1\xd0\x87\x08\xfa\x0f\x66\x22" + "\xfd\x12\x0f\x58\xb9\xd3\x0f\x13\xf4\x0d\xf5\x48\x9f\xe4\x01\x2b" + "\x77\xfa\xe1\x82\xfe\x78\x38\xd2\x27\x7b\xc0\xca\x9d\x7e\x84\xa0" + "\xff\xdc\x88\xf4\x29\x1e\xda\xde\x95\x7e\xc0\x89\x00\xa4\x5b\x5b" + "\x90\xa1\xda\x8f\x4b\xbb\xbb\xf3\x1e\x29\x78\x7f\x41\x36\x94\xee" + "\xa1\xdd\xdd\xe9\x47\x09\xfa\x7a\x3b\xd2\x6f\xe8\x4a\x0f\x3a\x41" + "\x0f\x53\x14\xfa\xd1\x82\xfe\x54\x13\xd2\x6f\xf4\xd0\xf6\x74\xdf" + "\xa2\xd8\x69\xa8\xa0\xfd\x67\x09\xd2\x6e\xf2\xd0\xee\x5a\xda\x30" + "\x41\x7b\x3e\x0b\x69\xb3\x3c\xb4\xb9\x96\x76\x8c\xa0\x6d\x8c\x43" + "\xda\x1c\x0f\xed\xad\xa5\x1d\x2b\x68\xcf\xf8\x20\x6d\x9e\x07\x79" + "\x47\x69\x68\x4d\x82\xf6\x5b\xd2\xab\x7c\x0f\xb8\x68\x69\xc7\x09" + "\x5a\x5b\x24\xd2\x16\x7b\xc0\x45\x4b\x3b\x5e\xd0\xfe\x3b\x19\x69" + "\x4b\x3c\x60\xa2\xa5\xbd\x8e\x0d\x38\x67\x52\x7c\xeb\x76\x77\x5a" + "\xd4\x01\x0b\xfa\xa1\x0a\xf4\x85\xe1\x2c\xb3\xf9\x58\x91\xf0\x6b" + "\x3b\x89\x4e\xa5\x61\x92\xfd\x67\x9a\x38\x30\x81\x65\x9e\xae\x51" + "\xfc\x5f\xa9\x3b\x3f\x26\xc9\x5a\xda\x89\x2c\xbb\xaf\x1a\xff\xf6" + "\x75\xa5\x35\x68\x69\x27\xb1\xcc\xf6\x0d\x0a\x6d\x59\x57\x5a\xff" + "\x4e\x5a\x96\xd9\x61\x46\x9a\xfd\x85\x8a\x5f\xd5\xc8\x39\x45\xc3" + "\x6f\x32\xcb\x64\x3e\x0a\x3f\x4b\x57\x7e\x46\x2d\xed\x14\x96\xdd" + "\xef\xa8\x42\x5b\xde\x95\x36\x4a\x4b\xfb\x33\x96\x0d\x6a\xfd\x2b" + "\xba\xd2\xa6\x6b\x69\xa7\xb2\x6c\x29\x47\xa1\xad\x74\xa7\x2d\x14" + "\x31\x48\x52\x70\x9a\xc6\xb2\xe5\x38\x85\xb6\xc6\x25\xc6\x4a\x3a" + "\x6e\x63\x85\x82\x6e\x3a\x1b\xd0\xda\xa0\xe0\x59\xeb\x12\x5b\x33" + "\x74\x83\x28\xa6\x14\x10\x9e\x4f\x4d\x2d\x41\xda\xeb\x15\x7e\x47" + "\xdd\x63\x9f\x22\xdf\x0c\xbc\x77\x4c\x8d\x4f\x18\x77\xac\x9e\xfa" + "\x3d\x49\xe3\xe1\xea\xd3\xf2\xa0\x5a\x11\x1b\x95\x75\xbf\xe4\x00" + "\xee\xe3\x1d\x25\xd3\x6a\x62\x9a\x99\x5d\x9b\xb6\x45\x62\x35\x93" + "\x9a\x41\xa6\xef\xf5\xb1\xc0\x05\x1b\xad\x98\xde\x14\x36\xbd\xb8" + "\x25\x7b\x90\xd5\xaa\xfb\x57\x03\x7d\xbf\x09\xcf\x1b\xad\xb0\xf9" + "\x28\x9d\x6f\xc9\xa0\xf5\x49\xa2\x74\x1d\xb9\xbe\x16\x5a\xcf\xa4" + "\x08\xaf\x33\x71\xe7\x6b\x87\x24\x61\x1f\xf8\x29\x88\xb2\xac\xb4" + "\xc3\xa9\x14\x90\xf8\x1a\x78\xf2\xe0\x1b\xd8\xb2\xc4\x48\x94\x85" + "\xbe\xd1\x9a\x50\x87\xd7\x5c\x16\x5a\x7b\x21\xc7\xf7\x98\x65\x79" + "\x1b\xd1\x6c\x6e\x0a\x5c\x0c\xec\x89\xdf\x7e\x95\x94\x0a\x23\x4e" + "\xcb\x83\x37\xa9\xdf\xaf\xe2\xdf\xac\xfa\x36\xf1\x26\xfe\xbd\x2a" + "\x39\x60\x9c\x23\xd0\xf7\x98\xfb\xf7\xaa\x44\x39\x01\x01\xe7\x68" + "\x4d\x9f\xe2\xe4\x62\xfe\x3d\x2c\x39\x80\xaf\x23\x84\xf2\xd6\xb0" + "\xd0\x69\x65\x8e\xb6\x0d\xe9\xb4\x66\x9d\x25\xf5\x34\xd4\x29\xf7" + "\x88\xbf\xe0\x3b\xf8\x24\xf1\x23\xbe\x2a\x4f\xca\xd7\x34\x32\xb9" + "\x98\xda\x03\xdb\xa6\xac\xc7\xdf\xbf\x92\x07\xd7\xf2\xef\x5f\x65" + "\x07\x18\xad\xba\xeb\xb2\xf8\xf7\xaf\xd4\xfa\xf4\x9c\x47\x3a\xf1" + "\xf0\xfc\xad\x5f\xf0\x63\xdb\x7c\x6d\xc8\x3f\x1d\xfb\xbf\x9b\x04" + "\x3e\x01\x9b\xac\xba\xe1\x25\xca\x79\x9e\x55\x37\xd2\xaa\x9c\x97" + "\x58\x75\x1f\x9b\x95\xf3\x52\xf5\x1b\x64\x9e\xbf\x89\xe6\x5b\x89" + "\x78\xd4\x3b\x5e\x88\x33\x50\x7f\x9d\xcb\x13\xe8\x5b\x69\x1c\x0e" + "\xba\x53\x72\x20\x8e\xfb\x7d\xeb\x45\x5b\x05\xfa\xe2\xd1\x4f\x39" + "\x36\x29\x47\x46\x34\x5c\xe7\x02\xe2\xcb\x58\xd6\x6c\x2b\xd7\x07" + "\x39\x30\x8c\xd2\x38\xb6\x88\x3f\x1b\x38\xdb\xca\xf9\x6e\x5b\xec" + "\xf2\xde\x69\xc4\xe4\x29\x3f\x9b\x3a\x6d\xfa\xf5\x33\x6e\x58\x78" + "\xdf\xfd\x09\x0f\x2c\x7a\x30\x71\xf1\x43\x0f\x2f\x79\x64\xe9\xb2" + "\xa4\x47\x97\xaf\x48\x7e\x6c\xe5\xaa\x94\xc7\x57\xd3\x43\x83\x4e" + "\x59\x5f\x98\xa9\x6b\x96\x00\xb1\xbc\x85\xca\xe0\xdf\xf9\xa5\x34" + "\x81\x7b\xe0\x06\xd9\xe8\x79\x4c\x50\x1d\x0c\x40\xeb\x85\x34\xca" + "\x81\x27\x68\xfd\x12\xd4\x41\x5d\x75\x7e\xb4\x85\xd6\x61\xab\x97" + "\x03\x6b\xab\x9a\xa2\x2d\xb4\x6e\xe0\xc1\xe0\x06\x08\x1d\x05\xba" + "\xd3\x72\xa0\x85\xee\x17\x8d\x01\x28\xc7\xbc\x9e\x78\x8e\xf2\x87" + "\xe0\x67\x83\x58\x53\x4e\x10\x6b\x24\xfe\x39\xb9\xac\xa1\x69\x4d" + "\x22\x64\xe2\x35\xea\xa5\xff\x29\x39\x68\xdb\x41\xec\xf9\x3b\x32" + "\x20\xa4\x30\x97\xd5\x6f\x08\x62\xf5\x4f\xe4\xb2\xc6\xa2\x20\x66" + "\x0d\xcd\x01\x9f\x96\xec\x20\xb3\x55\x0e\x2c\xe6\xb6\x85\xf7\x1d" + "\x83\x02\xa3\xb6\xe0\xbd\x49\x76\xd0\x17\xe1\x35\xa6\x35\x1f\x34" + "\x0a\xb9\xf7\x9c\xb5\xf5\x41\x7e\xe1\xac\x7d\x89\x2e\x13\xcb\x11" + "\x78\x04\xbd\x55\x8e\xbd\x08\x2c\xaf\xa9\xda\x56\x07\x56\x39\xa8" + "\x8c\xd6\x53\xc2\xf2\xfc\xaa\xf3\x1a\x81\xf8\xed\x5e\x6e\xeb\xb3" + "\x62\x28\xb3\x23\x6d\x9e\x63\xcd\x12\x1d\xd2\x24\x23\xef\x66\x6d" + "\x7d\x4c\x8b\x1e\x49\x36\x2e\x7d\x6c\xc9\x92\x71\xfd\xc1\xc4\x8f" + "\xa0\x5d\x43\x30\x19\xf9\xc1\xb3\xb9\xac\x1c\xeb\x69\xc1\xfa\x56" + "\x1c\xc1\xd1\x07\xea\x06\x60\x9d\xb2\x4e\xc9\xd7\xf8\x62\xfa\x7e" + "\x3c\xdf\x8f\xb2\x57\xf0\xf5\xc9\x64\xd3\x0d\x2c\x3b\xa8\x1c\xe5" + "\xa4\x78\x65\xa4\xef\x33\x9e\x5b\x35\x47\x87\xf5\xce\x41\xba\x0a" + "\xe3\x50\x08\xc3\x7c\xdb\x50\x8e\x12\x3c\x27\xfa\x9b\x09\x47\xa4" + "\x2f\x17\xf5\x32\xf1\xb5\xb5\xb0\xad\x2c\x05\x41\x6c\x53\x4b\xf6" + "\x35\x49\xf4\xfd\x56\xbe\x06\x0d\x5e\x63\xbb\x54\x20\x6d\xd6\xb9" + "\xb4\x39\x3a\x5a\x6f\xb3\xc8\xc9\x33\x8a\x64\x22\x39\x68\x2c\xfc" + "\x21\xf6\x26\x1d\xed\x71\x30\xc1\x06\xba\x0f\xeb\x01\xf2\x73\x59" + "\x31\xee\xf9\xb8\xe7\x7d\x80\xf7\x0e\xe3\x5e\x81\xe9\x95\x78\xfc" + "\x00\x8f\x87\xeb\xf9\xb3\xd5\x60\x92\x7b\xc5\x5a\xd6\x30\x29\x0f" + "\x46\xf3\xf5\x3c\x53\xe1\x37\x75\xf2\xd8\x2c\x92\x9d\xbe\xd5\xcc" + "\x06\x05\xcb\x2e\xdf\x94\x95\x87\xa4\x00\xde\xc7\xe3\x26\x71\xd4" + "\xee\x43\x6a\x71\x6f\x16\xe7\x43\x23\xf1\x3c\x41\x39\x8f\xc5\x7d" + "\xde\xc5\x77\x77\x7e\xdd\xed\x43\x2b\x7a\x4e\xdb\x93\xdd\x24\xf7" + "\x8c\x2e\x24\x1d\xe4\xe1\x47\x41\x1e\xe1\xef\x9a\x3e\xbc\x41\xa4" + "\x8d\xde\x27\xae\x47\x5b\x94\x63\x23\xc8\xa1\xd8\x4e\x61\xc8\x3f" + "\xcc\x24\xd2\xc2\xa6\xe2\x71\x2d\xee\x1b\x5d\xcb\x37\x61\x7e\x53" + "\x08\xe1\xd9\x8e\xb1\x80\xb0\xb4\xca\xd7\xd4\x12\x46\x5b\x84\x6e" + "\xe9\xe8\xfd\x09\x4c\xab\x41\xdd\xca\x77\xea\xcf\x90\x43\xae\xfa" + "\x33\xa4\xd4\x4d\x7f\xb2\xc8\x17\x61\xbe\x90\x22\xa1\x2f\xfb\xcf" + "\xad\x49\xc0\xeb\x21\xfb\x90\xcf\x7e\xe3\x7c\xe2\x31\x94\x8f\x9f" + "\xb7\x9c\xc6\x71\x70\x22\xc8\xe4\x5f\x1a\xe5\xa1\x7d\x48\x67\xa9" + "\x6c\xa5\x5c\x21\x0b\xca\x87\x69\xc5\x24\xdf\x32\xe4\x8b\xd7\x25" + "\x48\x57\x5c\x0d\x67\x55\xd9\x78\x9e\x67\x1e\x42\x7d\x54\xe4\x25" + "\x9e\x94\x8f\x39\xeb\x55\x43\x79\x94\xb2\xdf\xc2\x74\x1a\x5f\x43" + "\xda\xbf\x41\x5f\x6d\xb7\x02\xe9\x24\x1d\xab\xed\x11\x68\x4b\x66" + "\x70\x50\x1c\x0c\x86\x08\xb4\xb7\xab\xea\xe4\xa1\xf9\x13\xd7\x42" + "\x04\xf1\x23\xff\x6d\x95\x87\xc6\x17\x91\x2d\x0a\x5e\x7b\xa9\x1e" + "\xc4\xff\x03\x1c\xd1\xd0\xb1\x90\xe4\xc1\xfb\x9a\x72\x73\x68\xdc" + "\xbc\x65\xb5\xa8\x2b\x96\x55\x82\xf9\x4b\xa9\xee\xd4\x9e\x78\xbf" + "\x0c\xf9\xd8\xe8\x1e\xad\xd7\xa2\xd4\xa7\x84\x7e\xeb\x41\xed\x41" + "\xf4\xb4\xae\x25\xff\x46\xad\x7c\xcd\x30\xde\x6e\x98\x9f\xf0\x60" + "\x58\x06\xf1\x48\xb3\x33\x3b\x43\x7f\xf4\xd2\x6a\x1b\xf6\x3f\x42" + "\x1e\x75\xc5\xe7\xda\x58\x2d\x3e\x98\xaf\x14\xf3\x97\x53\x4c\x26" + "\x7f\x82\x65\xfa\x51\x7f\x03\xd3\xb2\x1c\xd9\xc8\x63\xa5\x8d\xcf" + "\x2b\x21\x9f\x85\x28\x4b\x16\xf1\x41\x79\xca\x15\x5e\xf9\xf4\xfd" + "\x4a\x2d\xd6\x0a\xbf\x12\xc2\x9c\xdb\xf3\x6a\x5e\x27\xf4\x5d\x21" + "\x93\x0b\xc5\xbd\x32\xa4\x29\x63\xed\x66\x60\x6b\xe2\xc4\x3a\x6d" + "\xe2\xde\xbe\xb4\x56\x8e\x6f\xb9\xf0\x6b\x21\x77\xaf\x58\xc7\x1a" + "\x9c\x72\x87\x18\xd4\xef\xb4\x2b\x72\xef\xa3\xf2\xd8\xaa\x79\x3c" + "\x86\x52\x19\x94\x5f\xf0\xbb\xb6\x9e\xf8\xa9\x6d\x35\x11\xe5\x10" + "\xed\x75\x6d\x30\xa6\x97\x90\x2e\xf2\x76\x43\x3f\x7a\x2e\x8d\x74" + "\x31\xc4\x07\xf3\xef\xcf\xa4\xeb\x55\x74\x7d\x6d\x31\xf7\xb1\x9d" + "\xf7\xaf\x9d\x43\xf7\x69\x5e\x62\xcb\xc3\xa8\x4b\x0e\x80\xd1\x01" + "\x10\xd1\x9c\xc1\xeb\xb6\xb3\x79\xcd\x4c\xdd\x41\x3b\x00\xc9\x89" + "\x6d\x54\x86\xb2\xee\xc3\x58\xd3\x4c\xb2\xa2\xbf\xde\xc7\x5e\x8a" + "\x03\x92\x19\xfd\x99\x22\xdf\xb0\x30\x05\xfb\x7d\x54\x47\x6a\xcf" + "\x89\xc2\xf7\xe1\xbd\xe1\x87\x49\x76\x67\xbd\x87\x81\xb6\x8d\x79" + "\xbd\x11\x07\xc2\x8b\x70\x71\xf2\x0c\x21\xdd\xcf\x42\x5e\x3b\xc5" + "\xb5\xd0\x0d\x6a\xeb\xac\x20\x56\x49\xf4\x4e\xda\xe1\xbc\x6f\x98" + "\x8a\x65\x4f\x4a\xa2\x39\x18\x8c\xcf\xf6\x16\x0b\xf2\xdd\x49\x6b" + "\x96\x22\x8f\x32\x6a\x53\xa4\xdb\x4c\xfa\x88\xd7\x95\x8a\xdc\x9b" + "\x30\x9e\x87\xe3\x1e\xe9\xb4\xff\xe1\xeb\x5c\xf5\x6b\x98\xbb\xfd" + "\x13\xde\x59\x8e\x34\x33\x28\xeb\x35\x1b\xcf\xc8\xc3\x87\x28\xb1" + "\x43\xc1\x7a\xf8\x23\x07\xd1\x5e\x34\x3c\x9a\xdd\xb0\x2e\xe3\xfa" + "\xb8\x6a\xb6\x8e\xea\x8c\x79\xcb\x04\x9f\x61\xbc\xce\x5c\x9f\x32" + "\xb8\x0e\x54\xb2\x55\x58\xcf\x4e\x3d\x18\x16\xab\xe0\x5c\xe9\xd6" + "\x26\xaa\xef\xca\xa7\x75\xbf\xc8\x27\x61\xff\xf7\xa6\x96\x76\xa7" + "\x5f\x22\xec\x1d\x1c\xfb\x61\xb6\x22\x11\x6f\x15\xbf\x35\x4c\xdc" + "\x0f\x72\xd1\x61\xaa\xd3\x04\xae\xbf\x24\x4b\xda\x3c\x92\xa5\x8c" + "\xcb\x91\x66\x04\xbc\x57\x42\xe5\x5b\xe5\xe1\x11\x8a\xbd\xaa\xbc" + "\x64\xe2\xf5\x04\xfa\x2a\x92\x09\xcb\xce\xe2\xfe\x6f\x16\xc9\x36" + "\xa2\x8f\x22\x7b\x85\x2d\x83\xf2\x0e\xb1\xb5\x4a\x3c\x6f\x05\x9e" + "\x2f\xb1\x89\x75\x13\xfa\x63\xfe\xed\xc6\xfb\x88\x7e\x74\x02\xf9" + "\x68\xe3\xbd\xfc\xfc\x4e\xe3\x5c\xd4\xd5\xd3\x20\x23\x3f\x03\xe9" + "\xa8\xaa\x17\x8d\xf2\xe8\x1b\xb1\x8f\x41\x78\xed\xc4\x3e\xd2\x76" + "\x6a\x6f\xd2\x65\xec\x23\x4d\x6d\xc9\x1e\xb1\x44\xd5\x5b\x2c\x27" + "\x9f\xda\x5e\xe0\x33\x62\x2f\xea\x71\x99\x53\xb7\x46\xec\x55\xda" + "\x71\x3b\xb6\xa3\x01\xcb\x9b\xac\xd4\x6b\x3b\xd2\x63\x5f\x6c\xf4" + "\x48\x45\xf6\x3c\x85\xfe\x88\x8a\x83\x62\xab\x95\x99\xe4\x7f\x39" + "\x06\xc6\x04\x25\x6f\x89\x28\xcb\xf8\x80\x4a\x4b\x7d\x44\xbe\x06" + "\x1a\xa6\x91\x1f\x9c\x84\xd8\x73\xdf\x47\xeb\xf9\x2a\x69\x64\x3b" + "\xa2\x8c\xd1\xbe\x5c\x0f\xb1\xdf\xe3\xd4\x23\x63\xa4\x9b\x7f\x22" + "\x5f\x9c\x55\xb5\x41\xac\x31\x41\xba\x44\x3e\x95\xc6\x2a\xc8\x2f" + "\x40\xb1\x1f\x45\x66\xe3\x0e\x57\x5d\x19\xd5\x8a\xba\x32\x41\xc3" + "\x3b\xcf\x53\x9c\x2b\x12\x3e\x30\x5f\xa9\xdb\x57\x4a\xdd\x76\x2a" + "\x75\xfb\x4a\xa9\xdb\x76\x2c\x03\xdb\x6d\xd4\x2e\x4d\x3b\x62\xbb" + "\x8d\x1a\xa2\xd0\x97\x91\x2f\x77\xda\xeb\xc8\x5f\xab\xb6\xdc\xd5" + "\x5f\x8c\xba\x8a\xec\xc1\x29\xd7\xc8\x08\x37\x7f\x51\xe6\xd9\x5f" + "\x8c\x04\xa5\xbe\xc5\x6e\xb6\x51\x22\x64\x57\x62\x0b\xe2\x50\xd5" + "\xac\xac\xf5\x81\x69\xe4\x3f\xa9\x6c\x6d\x0c\x2a\x14\xed\xaa\xd8" + "\xf2\xc8\xef\xba\xe2\x30\xb2\x5c\x6b\xcf\x84\x35\xf9\x04\xe2\x41" + "\x98\xf2\x7e\x25\xa6\x09\x5c\x47\xe6\x93\x6f\xd0\xfa\x68\xa4\xcd" + "\x71\x30\xb2\x97\x91\x15\xae\xb6\x38\x72\xaa\x62\x8b\x4a\xd9\xa3" + "\x9e\x43\x8c\x22\x9c\xe5\x8e\x8a\x74\x2b\x97\xb0\x29\xe7\xdf\x72" + "\x16\x98\x3e\xa9\xc6\x34\xa2\xc7\xbc\x29\x98\x27\xc9\x2d\x3e\x66" + "\x91\x7c\x56\xd9\xd8\xc0\x7d\x56\x2e\xf7\x15\x29\x2d\x5c\x9e\x51" + "\xc9\x45\x4a\x9c\xc0\xb4\x08\x25\x2d\x4a\x89\x25\xaa\xde\x9c\x74" + "\x93\xa9\xc6\x73\xff\xc8\xd8\xa0\xf6\x8f\x38\x2f\xee\x8b\x46\xd5" + "\x2a\xf5\xa3\xb4\x09\x22\xcd\x98\x4f\x69\x99\xa2\x1d\x72\x18\x8f" + "\x57\xc6\x28\x25\x5e\x91\x7d\x49\x56\x79\x44\x29\xd9\x18\x5d\x5b" + "\xe5\xd1\xb4\x2e\xb4\xae\x3a\xbd\x8d\xc6\x10\x79\x78\x6f\x36\xf9" + "\x03\xf2\x17\xc6\x45\xc2\x6f\x18\xef\xe2\xc7\xc7\xc8\xef\x50\x3f" + "\x84\xee\x23\x5d\x24\xf9\x22\x4c\x7f\x9a\xd6\xef\x64\x5f\x1b\x90" + "\xef\xe8\x25\x4a\xde\x02\xde\x57\xf8\xda\xac\x57\xd3\xd4\x7c\x68" + "\xeb\x77\x52\x3e\xca\xaf\xfa\x2f\xf2\x5d\x76\xf2\x4d\xa2\xbc\x13" + "\x8a\x8e\xf3\x71\x83\xda\x2f\x6a\x97\x34\xb4\xb4\xfe\x01\xf7\x69" + "\xa1\xe1\xc2\x9f\x85\x0e\xa3\xbc\x1c\x3f\xf4\x95\xa9\xad\xec\x44" + "\xd1\x72\x90\x0b\xcf\xf2\x3e\x56\x88\x90\x33\x34\x45\xd4\x23\xf4" + "\x66\x5e\x0f\xe1\x53\xb3\x84\x2c\xd7\x84\x14\xb6\xf1\x7b\xbf\xa3" + "\xba\xd0\xbd\x2d\x9a\x7b\xb4\x06\x09\xde\xe3\xdf\xf2\x76\xcf\xe7" + "\x68\x4f\xec\x42\x4f\x6b\xef\xa2\x0f\x35\x14\xe6\xaa\xbe\x37\xd4" + "\xa6\xc8\xf9\xba\xea\x77\xb1\x5d\x66\x92\xef\xe5\xf7\x16\x29\x34" + "\x77\x29\x47\xee\xdf\x43\x4f\x8a\x76\x0d\x96\x94\xf6\x9e\xad\xd4" + "\xa3\x95\x8f\xb3\xbf\x8e\xc3\xb6\x0d\x3d\xa6\xb6\xad\xf6\x9c\xec" + "\x07\xcb\xf7\xa7\x6b\xae\xf7\x6b\xf9\x18\x36\x9f\x68\x48\x26\x11" + "\x23\x46\xd7\xba\xf7\xa9\x4f\xc9\x63\x1f\xa5\xb8\x24\xfa\xaa\x63" + "\xef\x56\xe6\x87\xc0\xb2\xfc\x8f\x18\x17\xc2\xf2\x55\x1f\xc3\x5a" + "\xcc\x40\xdf\x40\x3f\x25\x87\xf1\x75\x26\xe8\x9b\xf9\x5a\x1a\xf2" + "\x4f\x7b\xda\xac\x0a\xcf\xb0\x14\xd5\x6f\x90\x2f\xa9\x6a\xae\x53" + "\xfa\x74\x63\x4c\x85\x8a\x2f\x39\x23\x8f\x19\xe7\xda\x0f\x1b\x33" + "\xce\xd5\x67\x8c\xbd\xd1\xdd\x67\x60\xbf\x79\x43\x4b\x76\x98\xdd" + "\xa5\x1f\x80\x69\x17\xf6\x1d\x61\x35\x64\xa3\xb4\x06\x12\xf7\x4f" + "\x7c\xce\x6b\xcc\x56\x55\x66\xf2\x9b\xe7\xd6\xa8\xf3\x17\x63\x27" + "\x50\x5f\xcd\xb5\xbc\x31\x4b\x5c\x7c\x27\x95\xa7\xf2\x93\x81\xd6" + "\xd1\xc1\x76\xa0\xf9\x96\x31\x91\x8a\x9f\x2f\x76\xf1\x95\x4a\x0c" + "\x23\x3f\xe9\x1a\xab\xae\x19\xe6\x1a\xab\xc6\x0e\xe9\xea\x23\xc7" + "\x34\xf4\x3c\x56\x8d\xb1\x90\xdf\x52\x7d\xa4\xab\x2f\x18\xd3\x58" + "\xe8\xd2\x97\x1d\x93\xac\xf6\x65\x9d\x7e\x74\x8c\x4c\x3e\x0a\xcb" + "\x2f\x13\x65\x8f\x4d\xc0\xb8\x9f\xa8\x96\x6d\x45\x9c\xab\x8c\xa8" + "\x9b\xd9\x41\x35\x78\x6e\x56\xfa\x80\xdc\x36\xdb\x68\x2d\x11\x39" + "\x34\x0b\xf5\xaf\x3f\xe9\x99\x65\xe9\x59\xa8\x77\xc6\x8a\xf2\x73" + "\xcb\x3a\xdb\xf7\x3b\x6d\xbf\xb0\x20\x97\x6d\xc4\x72\x2a\xb5\x75" + "\xdc\x8c\x69\x5b\x94\x39\x04\xde\xb6\x9c\xd7\xd8\xe2\xa2\x5c\xd7" + "\xba\x89\x7a\x8c\xad\xa5\x7a\xd0\x98\x08\xcb\xcf\xa1\x7e\x0f\xad" + "\x83\x86\x76\x13\x5c\xd4\xa9\xf3\x43\x96\xb4\x66\x68\xfb\x57\xd7" + "\x24\x93\xaf\x54\xc6\x9e\x15\xd8\xdf\x71\x99\xeb\xbb\xf3\xd6\x58" + "\x63\xd2\xf2\xc5\x4b\x93\x17\x4d\x31\x2e\x5e\xba\x38\x79\xf1\xc2" + "\x25\x8b\x57\x2f\x4c\x5e\xbc\x6c\x69\xf8\x23\x0b\x1f\x5c\x7c\xbf" + "\x71\xd5\xc2\x15\xc6\x88\x94\xb0\x94\xfe\xe0\x24\xfd\xb9\x71\xe1" + "\x8a\x15\x8f\x3d\xf2\x40\x82\x71\xe9\xe2\xfb\x27\x2c\x7f\x60\xc5" + "\x03\xc9\xc6\x85\xcb\x97\x3d\xb6\x34\xc1\x18\x96\x30\x31\x2c\x62" + "\x7a\x42\x7f\xed\x1c\xda\x28\x7f\x68\x74\x9c\x6f\x68\xd8\x72\x1e" + "\x0c\x7e\xba\xa4\xe5\x7e\x29\x8b\x97\x8a\x39\xbb\x71\x37\x4e\xca" + "\x81\x24\x5a\x5f\x9d\xd6\xbf\x65\xd9\xa6\x58\x3c\xca\x44\x87\xf5" + "\x34\x16\xd1\x1a\xeb\x41\x2c\xa4\x25\x7b\x1c\xda\x7e\x38\x9f\x1f" + "\xc6\xb6\x30\x62\xdd\x42\xd8\xf9\x8a\x06\xec\xb3\x25\xd1\xfb\xde" + "\x45\xe7\x21\x20\x6b\x25\xc8\xb8\xfb\xe0\xee\x4f\xeb\xaf\x63\x9e" + "\xa9\x56\x79\x7c\xac\x98\x13\x1d\x57\xdb\x34\xf0\x8e\xb5\x2c\xeb" + "\x0e\xb1\x8e\x83\x3c\xee\x23\x75\x3e\x3a\xe6\x49\x88\x21\xfd\xac" + "\x93\xc7\xf1\xb9\xee\x27\x50\x97\x69\x3e\xf6\xdc\x3b\xb7\x44\x61" + "\x7f\xf0\x98\x65\x28\xbf\xf7\x51\xb3\x04\x3e\x28\x97\x7c\x70\x6d" + "\x04\x3c\x8b\x65\xad\x08\x66\x0c\xcb\xc8\x53\xe7\xd3\x68\xdd\x7b" + "\xac\xcb\x51\xa5\x1e\x6b\x78\x3d\x72\x59\x68\xce\x20\x94\x2f\x9b" + "\xcb\x53\xae\xd6\x01\xe5\x3e\x8a\x32\xf1\x75\xef\x49\x2e\x4f\x73" + "\x7d\x34\xdf\x75\x4a\x1e\xef\xeb\x58\x89\xed\x36\x5c\xac\xa3\xb4" + "\xa5\x50\xd8\x1f\xd6\x6b\x66\x11\x9e\x67\x9e\x05\x9f\xcd\xb4\x6e" + "\x77\xc6\x08\x76\xa4\xd9\x0e\xd5\x89\x47\xc1\xef\x71\xd6\xc4\xde" + "\x68\x68\x10\x75\x1a\x3f\x83\x7c\xc3\x6b\x0f\x1d\x95\xa9\x4e\x18" + "\x2b\x7c\x8a\xce\x76\x3b\xb7\x28\x3f\x1b\xc4\x9a\xd9\x0b\xda\x3e" + "\xd7\xf8\x17\xa9\x4d\xa8\xbf\x75\x0e\xe3\x54\x4b\xf6\xf8\x8d\x28" + "\xb7\x55\xe9\x1b\x37\xb3\xf6\x79\x9a\xbe\xd4\x78\xd2\xb3\xe6\x6e" + "\x78\x1b\x54\xde\xb4\x1e\x38\xe5\x11\xf8\x5f\xe7\x8b\x79\x9a\x34" + "\xfc\x1b\xdc\xf9\x13\x4f\x3c\x6f\x52\xcb\x11\xe3\xf0\xf1\xd4\x27" + "\x68\x42\x5d\x6e\xea\xa6\xbc\xd0\xec\x5c\x56\x5b\x8d\xe9\x5b\x5a" + "\x81\xc6\x17\xb5\x45\xb9\xc4\xff\x3a\xb3\x55\x36\xed\x24\xfe\x4f" + "\x04\x01\x6c\x40\x9a\x73\xd9\xe3\xac\x34\xbf\x8b\xf7\xd0\xfe\x83" + "\x8e\xba\xcf\x59\x2b\xfa\xfc\x73\x37\x7d\x8e\xca\xa6\x3e\x61\x0e" + "\xf2\x47\x1d\xda\xf2\x1d\xc6\x61\xbc\x9e\x98\x03\x26\x2a\x07\xcf" + "\x69\x4c\x56\x81\x3c\xcb\xd4\xf2\x18\xea\x7f\xa6\x43\xcc\xc1\x28" + "\xba\x15\x5e\x9d\xd2\x40\xeb\x2c\xb0\x83\xe8\xdf\x49\x46\xd2\x31" + "\xcc\xd3\xa8\xea\x14\xea\x7a\x2d\xd7\xab\x00\x30\xb1\xec\xeb\x92" + "\x8a\x06\x21\x1d\xea\x55\x21\xea\x13\xe9\x55\x4b\x76\x78\xb0\xaa" + "\x53\xa8\x6b\x35\x44\x87\x32\xf4\x2f\x5d\x1d\x25\x93\x8f\xac\x97" + "\xc3\x37\x93\x8e\xb1\x3f\xfc\xf2\x28\xbb\xe6\xb7\x47\x05\x4e\xe1" + "\x9b\xab\x6d\x02\x03\x67\xbb\x87\xc7\x6b\xda\xbd\x06\xf5\xb8\x3f" + "\xb5\xb3\x98\xab\x0e\xdf\x8c\xb2\xd5\xf0\xbe\xf8\x3a\xc4\x80\xc7" + "\xaa\xf0\xd9\x94\x5f\x69\xc3\x4a\x67\x1b\x86\x6f\xf7\xd4\x86\x6e" + "\x6d\xc7\xd7\xa1\x66\xd9\xe1\xfb\xc8\x56\x30\xcf\x31\x75\x0d\x6a" + "\x4f\x58\x62\x19\xb2\x9c\x03\x06\x2a\xa3\x3c\x80\xe8\x27\xf8\x78" + "\x2a\xc3\x5d\x8f\xcb\x8b\x01\x68\x2e\x9c\xf2\x85\x06\x50\xbb\x4e" + "\x98\xe9\x11\xdf\xfb\x5d\x64\x13\x6b\x72\x67\x4f\x88\x7d\x56\x59" + "\x93\x1b\xf3\xad\xbd\x90\x7c\xa1\x46\x11\x17\x2d\xa3\x48\x9f\x27" + "\xbc\x5e\x9d\x07\x40\x69\xca\x75\xc9\x39\x8c\x35\xee\xf3\xf9\xdd" + "\x3f\x5f\x98\xf0\x9d\xeb\xf3\x85\x09\xf5\xdd\x3d\x5f\x70\x2d\x77" + "\xe2\x64\x2a\xd7\x51\x34\x47\xe7\x2c\x7b\x62\x88\xc3\x43\xd9\x6a" + "\xfe\x89\xc5\xda\xf1\xcb\xc4\xf5\x24\x43\x15\xc6\x25\x76\xed\x1c" + "\x1d\x43\x3e\xe5\x3c\x66\x4f\x4c\x17\xfd\x15\xea\x07\x4d\x8c\x27" + "\x1a\xf7\x7a\x74\x6e\x86\x80\x77\xe9\xd0\xca\x2f\xfa\xcc\x02\x7a" + "\xd3\x14\x86\x77\xd2\x48\x2e\xc4\xc0\x3c\x5c\xf8\x00\x8c\xe0\xf4" + "\x0c\x37\x91\xa4\x5c\x37\xf1\x0b\xb9\x93\xbe\xf3\xfe\xf7\xd8\xae" + "\x12\xf2\x72\x7e\x36\xd0\x89\x33\x63\xb0\x86\x62\xe6\x05\x72\x33" + "\x50\xb3\x78\xda\x68\xb6\x31\x7d\x4e\x1f\xe4\x37\x83\x13\x33\x66" + "\x57\xf8\xab\xd7\x4c\x7b\x4d\x29\xae\xd7\xb8\xe9\xe7\x69\x0a\x18" + "\xa1\x4f\xe0\xaf\x6a\x8d\x5e\xd2\x99\x24\x15\xfb\x6b\x8b\xf4\x87" + "\xf4\x3e\xfc\xc4\x8f\xfe\xd8\x90\x9f\x09\xef\x1b\xe3\x3a\x09\x06" + "\x37\xaf\xd7\x90\x7f\x28\xc4\x1f\xb9\xfd\x02\x75\xec\xed\x36\x5c" + "\x73\x3e\x42\x1c\x46\x26\x5e\x42\xfe\x17\xde\x8c\x35\x57\xa9\xa7" + "\x4e\xf5\x18\xd9\xe8\x89\xd4\xd9\xfe\xa3\x66\xab\x49\x5a\x0d\x75" + "\xde\x0f\xab\x70\xbd\x1e\x9b\xe7\x7a\x3d\xae\xe1\x52\x88\x6e\xa1" + "\x3f\x69\xd6\x81\x88\xd9\xbe\xce\x44\x3f\x37\x93\xf1\xcb\x72\x33" + "\x21\xe7\xa6\x48\xa3\x07\x18\x1f\xa9\x49\x96\x3d\x53\xff\x30\xdb" + "\xd0\xf5\x8a\x41\x8c\x68\xf2\xef\x72\xf3\x17\x6e\x69\x74\xdd\xd7" + "\xa8\xa4\x4d\x7e\xb7\x0b\x3d\x4f\x33\x6a\xae\x75\x51\xf8\xa7\x18" + "\xf5\xdf\xd6\x95\xf6\xca\x76\x65\xeb\xc1\xa6\x23\xfb\xb8\xb2\xfd" + "\x40\x1b\x13\x51\x1c\x3d\x11\x3f\xd0\x3f\xd6\xe9\x28\x99\x72\x83" + "\x29\x09\x4c\x39\xb9\x24\x71\xfc\xca\x76\x65\xbb\xb2\x5d\xd9\xae" + "\x6c\x57\xb6\x2b\xdb\x65\xb0\xe9\xb4\x03\x6b\x03\xee\xfd\x94\xa3" + "\x76\xfc\xa3\x53\x76\x6d\x9a\xf4\x7d\xf2\x31\x65\x83\xf4\x28\x8b" + "\xb1\x38\xde\xea\x9f\x15\x5b\x13\x51\x9a\xd4\x64\xd8\x68\xae\x30" + "\x6d\x4f\x6c\x08\xce\x8b\x3b\x3a\xa3\x2c\xc5\x26\x6f\x98\x59\x1e" + "\x5a\x92\x50\x1f\x90\x33\xa7\x76\xea\xbe\xe4\x66\x9f\x4d\xb3\x2b" + "\xc3\x77\x2e\x69\x0c\xc9\x9f\x77\x2c\x72\xff\x5a\xbb\x94\x71\xcb" + "\x7b\xa3\xfe\x78\x5f\xdd\xa0\xec\x5f\x7d\x3c\xe5\xd5\xe5\x67\xfb" + "\x3f\x73\xc7\x07\xe3\xff\xf4\xd0\xe9\xa1\xcf\xdf\xfb\xd9\xcf\xff" + "\xbc\xba\xad\xef\x53\xb3\xfe\x3a\xe6\x95\x45\xa7\x82\x72\xe7\xfe" + "\x7d\xfa\x1b\x2b\xcf\x0f\xc8\xbc\xab\x6a\xe2\xee\xa5\x67\x86\x17" + "\xce\xff\xd7\x4d\xef\xa4\x3a\x74\xeb\x6f\x7e\x77\xe4\x8b\x0b\x4f" + "\x0c\xdc\x7a\xf7\x47\x93\xf7\x3e\xfa\xef\xab\x9e\xbe\xfd\xf0\xb8" + "\x1d\x8b\xbf\x1a\xf2\xdc\x3d\x9f\xde\xf0\xd6\xe3\xad\x7d\x9e\xbc" + "\xed\x50\xd8\xcb\x0f\x9c\x0c\xdc\xf6\xeb\x4f\xa6\xbd\xfe\xd8\x77" + "\xbe\x9b\xef\x3c\x32\x61\xd7\x23\xdf\x0c\x2b\xf8\xdd\xf1\x1b\xdf" + "\x5e\xd7\xa1\x7f\xe2\xd6\x83\xa3\x5f\xba\xff\x8b\xc1\xcf\xfe\xcf" + "\xdf\x7e\xf6\xda\x8a\x73\x57\xff\xfe\x97\x1f\x5e\xf7\x7f\x1f\xfe" + "\xfa\xda\x17\x7e\xfb\xcf\xff\xf5\x97\x35\xed\xfd\xfe\x77\xf4\xfb" + "\x63\xff\xcf\x83\x5f\x5e\xf3\x87\xdf\xfc\xe3\xfa\x37\x57\xb5\xf8" + "\x6d\x89\xa9\x9e\xb4\x67\xd9\xb7\x23\x8a\x16\x7c\xfe\x8b\x03\x69" + "\xec\xfb\xb4\x1f\xc8\xa9\xff\xf3\x9f\xc6\x4d\x1c\x9e\xaa\xf0\x26" + "\x3f\x93\x74\x0a\xee\x22\x21\x7d\x1a\xe8\x0c\xd0\x57\xf6\x62\xa4" + "\xe0\x6d\x7d\xbb\xd9\x8c\xda\xfc\x3d\xd9\xe8\x9d\x1a\x7a\xff\xe4" + "\x67\xb8\x5f\xcb\x53\x9c\xa3\xff\xe1\x1e\x73\xfc\x27\x36\x1d\xd6" + "\x55\x8f\x92\xf4\x81\xbe\xd8\x3a\x06\xb8\x0a\xfa\xc3\xd5\xe0\x03" + "\xbe\x30\x00\xfc\xc0\x1f\x06\xc2\x20\x18\x0c\x01\x10\x08\x41\x70" + "\x0d\x04\xc3\x10\x18\x8a\xd2\x87\xc0\x30\xcf\x32\xa7\x43\x54\x30" + "\xfe\xc1\xff\xb1\x10\xc5\xaf\xe3\xaf\xa4\xff\x47\xd3\x2d\x4a\x7a" + "\x8d\x92\x6e\xbd\x92\xfe\x1f\x4d\x37\xfe\x97\x8f\x23\xff\xab\x47" + "\x1d\x76\x0d\x44\xef\xc0\xa5\x8f\xd0\xb9\xb9\xa7\xea\x94\xad\xf3" + "\x1a\x2e\x92\xbf\x0b\x3f\xd7\xfc\xee\x5b\x14\xee\x53\xc5\x69\x1a" + "\x80\x78\x9e\xc0\xb4\x9b\x3d\x57\xf7\x9e\x3c\x30\x9d\x1e\x8d\x18" + "\x20\x80\xff\xbd\xf8\xf6\x72\x08\xee\x26\xdc\x91\xf5\xcb\xd7\xe3" + "\x7e\x2b\xee\x77\xaa\xbc\x51\xa8\x74\xd0\x49\x65\xb8\x87\x80\x4e" + "\x3f\x07\xf7\x06\xd0\xf5\x4d\x04\x5d\x1f\x13\xe8\xfa\x39\xe7\xf3" + "\x75\xfe\x65\x9d\x52\xea\x06\x28\xe9\x46\x3c\x1f\x1c\xa5\x29\xac" + "\xb7\x71\xab\xec\xb6\x39\x66\xe3\xe4\x89\x53\x27\x4e\x9d\x71\x9f" + "\x71\xc2\x04\xe3\x94\x88\x88\x1b\x26\x4d\x9e\x32\x69\xf2\x0c\xe3" + "\xe4\x69\x3f\x9f\x32\xfd\xe7\xd3\x66\x18\x1f\x79\x7c\xf9\xe2\xc9" + "\x11\x0f\x3e\x60\x5c\x9a\xb0\x78\x85\x71\xd1\xe2\xe5\x8f\xac\x5a" + "\xb8\xfc\x81\x1e\xd4\xbc\x57\x1b\x56\x05\x86\x75\x08\x31\xb5\x08" + "\xe9\x60\x04\xc8\xd3\x6b\x40\xbe\x23\x1d\x9c\x77\x4c\xca\xde\x65" + "\x7b\xe4\xde\xb9\x9f\x85\xfd\x76\xc0\x7b\x37\x3f\x18\x76\xe3\xad" + "\x2f\x6d\x29\x05\xe9\xae\x4a\x90\x66\x6d\x02\x29\x32\x1d\xa4\x08" + "\x1b\x48\xa3\x9b\x41\xda\xb8\x13\xa4\xf4\x58\x90\x56\x9a\x40\x7a" + "\x68\x03\x48\xbf\x4b\xe8\x9a\xf6\x87\x79\x22\xed\xf0\x46\x90\x0e" + "\x44\x82\xf4\x5a\x0a\x48\xaf\x04\x88\xb4\xcf\x31\xed\x93\xd0\x4b" + "\xdd\x04\x97\x60\xeb\x2d\xfe\xba\xff\x07\x54\x7c\xdd\x22" ; diff --git a/sys/dev/mxge/rss_ethp_z8e.h b/sys/dev/mxge/rss_ethp_z8e.h index 5f35d4b95a04..fde34bd740bb 100644 --- a/sys/dev/mxge/rss_ethp_z8e.h +++ b/sys/dev/mxge/rss_ethp_z8e.h @@ -28,9465 +28,9718 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int rss_ethp_z8e_uncompressed_length = 555148 ; -static unsigned int rss_ethp_z8e_length = 151319 ; -static unsigned char rss_ethp_z8e[151319 + 1] = - "\x78\x9c\xec\xbd\x7f\x78\x54\xd5\xb5\x37\xbe\x32\x19\x60\xa4\x91" - "\x99\x84\x80\x23\xa2\x0e\x1a\xda\x88\x01\xa2\x62\x45\x0b\x1a\x25" - "\x5a\xf0\xf2\x4b\x05\x9b\x2a\x9a\x44\x13\x0c\x1a\x21\x92\x08\x03" - "\x86\x4c\x18\x7e\x88\x0a\x64\x12\x53\x8d\x12\x92\xd8\x62\x8b\x2d" - "\x2a\x6d\x69\x6f\x6e\x2f\xd6\x58\xe2\xfb\xd0\xdb\x24\x13\xfb\xa5" - "\xef\x9b\xeb\x17\x6f\x07\x6e\xa4\x91\x37\xc0\x48\x06\x66\x4c\x66" - "\x66\xbf\x9f\xb5\xf7\x39\xc9\xcc\x30\x41\xb9\xbd\xcf\xfb\xfe\xd3" - "\x3c\xcf\xe4\x9c\xb3\xcf\xde\x6b\xaf\xbd\xf6\xda\x6b\xaf\xb5\xf7" - "\xda\xeb\x10\xfd\x1d\x7f\xc6\x29\x9d\x7f\x4f\xf1\x7f\xfc\xfd\xe3" - "\xef\x1f\x7f\xff\xf8\xfb\xc7\xdf\x3f\xfe\xfe\xf1\xf7\xff\xe6\xef" - "\xac\xc1\x48\x7f\x70\x11\xf9\x9d\x26\xab\x87\xce\x94\xbf\xfe\xaa" - "\x08\x22\x39\xc1\x43\x26\x2b\x5f\xb5\x1f\xd5\x20\xdd\xe0\x22\xd3" - "\x75\x16\x4a\x9a\xb3\x9b\xa8\x76\xbc\xe8\x7d\xf5\x35\xe1\xdd\xf4" - "\x9a\xe8\xcd\x7e\x9b\xa8\x35\x8d\xe8\xd5\xf1\xc2\x07\x38\xcb\x3c" - "\xf4\xc3\x6e\x86\xb3\x09\xcf\xfc\x7e\xf3\x78\xe1\x45\x7a\x99\x87" - "\x1e\x59\xc6\xe9\x1b\xc7\x03\x56\x2a\x91\xf3\x35\x11\x88\x80\x6b" - "\xe2\xf2\x0c\x33\x7b\x92\xc4\x67\x4f\x0c\x1c\x86\xd1\x0c\x18\x47" - "\x2e\x02\x23\x49\xc7\xcb\x67\xa0\x04\x86\xd7\xe7\x24\xab\xcf\xd9" - "\x32\x0e\x65\x7d\x68\x53\x3a\x97\xad\x42\x1e\xe1\xa4\xc4\x56\x7b" - "\x90\x6c\xd7\x51\xc2\x09\xba\xec\x0b\x5c\x0d\xb8\x7e\xc6\xed\xdd" - "\xa4\xca\xa5\x31\x0c\x94\x4d\xf0\x3b\x2f\xcb\x1c\x2c\x0b\xd8\xb6" - "\x0a\x32\x22\xef\x2f\x7d\x86\x16\x83\xca\x6b\xb9\x4c\xcb\x6b\x40" - "\xde\x65\x7a\x5e\xf5\xce\x30\x4f\x7b\xf7\x2d\xbc\xb3\x47\xbf\x33" - "\xd6\x68\xef\x92\xf0\xae\x36\x06\x3f\xa3\xbb\x3f\x48\xa8\x87\x71" - "\xb1\x79\x70\x3d\x84\x9e\xd1\x70\x63\x9c\x5a\x91\xbf\x92\xf3\x67" - "\xdb\x44\x70\x89\x8d\x24\x2e\x4c\x3b\xe4\x9d\x7b\xa8\x49\xe5\xc5" - "\xfd\x44\x2e\xaf\xdd\xdb\x70\x2f\xd3\xb5\x7a\x93\xfd\xce\xd1\x49" - "\xd1\x38\x11\x69\xef\x52\xf0\x2e\x3d\xfa\xdd\xef\x33\xb5\x77\x57" - "\xe0\x5d\x76\xf4\xbb\x04\xbd\x9c\x15\xef\xf2\xf4\x77\x91\xfd\xa4" - "\x38\xce\x88\xdf\x08\x13\xd1\x48\xfc\x46\x99\xf4\xbe\x2b\xb5\x8a" - "\xb0\xe3\x4a\x32\x8a\x9a\xb1\x4d\x61\xa7\x20\xb7\x3d\x40\xb6\x09" - "\xe4\x38\x4e\xa3\x3b\x01\x97\x76\xae\x27\x93\xa3\x44\x04\xdc\xf6" - "\x5e\xea\xf0\xf6\x92\xc3\x2b\x7a\xdc\xc1\x73\x54\x71\x8e\x4c\xee" - "\xe0\x29\xaa\x78\x8e\xac\xad\xe5\x9f\x53\x3c\xbe\x08\x1b\x04\x39" - "\x26\x72\xd9\x6e\xea\xa8\xef\x26\x47\x7d\x74\x59\xc7\xd5\x64\x6d" - "\xc7\x33\x68\x6e\x66\x3c\x5a\x6d\x41\x0a\xa6\x8c\x6d\x2a\x7f\x83" - "\x8c\x8e\x49\x64\x68\x2f\x68\xd1\x70\xf9\x56\x1d\xe3\xb2\xf9\x24" - "\x99\x7e\xb2\x1c\x7d\x7f\x92\xf1\xbd\xaa\xe9\xfd\xf5\x01\xc3\x21" - "\xeb\x7c\x3a\x64\x3d\x4a\xad\xd6\xd9\xd4\x6a\xcf\xa6\x9d\x27\x29" - "\xe9\x50\x60\x16\xb5\x1a\xef\xc3\xd8\xc8\x26\x77\x2f\xee\x6d\x21" - "\xe4\xf1\x91\x6d\x0d\xa1\x5f\xbf\xb5\xad\xf6\x69\x32\x79\x14\x4c" - "\xf4\xe7\xb7\x6a\x3f\x2a\x23\x62\x9a\xf1\x73\xbc\x76\x94\x5e\x49" - "\x56\xe0\xd7\x03\x5c\x6e\x07\x2e\xed\x69\x56\xca\x04\xce\xa3\xdc" - "\x75\x41\x32\x96\xd3\x65\xc3\x8c\x89\xd4\xb0\x53\x8e\xcd\xde\x86" - "\xd7\x44\x0f\xf3\x56\xdf\x0b\x39\x18\x5f\x49\x46\xd4\xbd\x87\xeb" - "\xdb\x89\x31\xea\x78\x8b\x8c\x7d\x6b\x73\x12\x1a\x5f\x13\xdd\x78" - "\x67\xd3\xdf\x81\xdf\xbb\xf1\xbe\x67\x7a\x2a\x59\xdc\xc1\x2c\xfa" - "\xb0\xbf\xc7\xc8\x30\xc6\xf8\x28\x81\xe1\x99\xed\x94\x88\xf6\x8c" - "\x00\x3e\x5f\x36\x22\xfd\x7a\xe4\x43\x79\xf4\xff\xcb\x7b\xb9\xbc" - "\xb8\xe2\x51\x5f\xf8\x8a\x47\xcf\x85\x5f\x7f\xb4\x4f\xbc\xfe\xe8" - "\xd9\xd0\xeb\x8f\x7e\xe9\x58\x47\xa6\xd0\x15\x8f\x7a\x3b\x4a\x64" - "\x1f\x58\x3a\x4a\xd0\x07\x21\x32\x6d\x38\x45\x96\xc7\x9f\x43\xdf" - "\x07\x3f\xa3\x0d\x2b\xc8\x1a\x4e\x9e\x90\xe3\x0e\xfe\x85\x1e\x2f" - "\x27\x81\xfb\xa2\x78\xed\xeb\x4b\xb9\xca\xa3\x78\xd6\xc4\x6d\xea" - "\xf2\x18\x53\xea\xb8\x5e\x6f\xf2\xf5\x1e\xfc\xba\xf1\xeb\xc1\xaf" - "\x57\xa4\x5c\xc5\x63\xca\x31\x66\x63\x02\x35\xf4\x13\x4d\x0f\x53" - "\x02\xba\xc8\x07\xfc\x2d\xc3\xd0\x6d\x62\xb8\x26\xb7\xe4\x3b\x95" - "\x54\xe1\xf7\x17\x11\xcb\x14\x96\x27\x2c\x5f\xfc\xce\xcb\xb3\x50" - "\x4f\x97\xe4\xfd\xd7\x84\x4f\xa4\xe4\x96\x20\xbd\xc7\xf7\x42\x51" - "\x82\xf7\x85\x22\x43\x5f\x4a\x6e\x29\xf2\x14\x78\x8c\x63\x2d\x1a" - "\x0d\x7b\x18\x16\xc6\x89\xf7\xf2\x20\x25\x02\x66\xc9\x3f\x9f\xef" - "\x32\xee\x7e\x4d\x1c\x45\xbe\xed\x83\xb0\x00\x1b\x70\x40\xff\xcb" - "\x9b\xf4\x34\xd0\xba\x7b\x07\xf2\x71\x79\x77\x20\x8b\xe5\xae\xc7" - "\x5d\xdc\x43\xe6\x20\x8d\x16\x03\xaa\x3e\xe4\xe9\x61\xf9\x78\x79" - "\x80\x46\xfa\x9d\xb4\x98\x61\x73\x39\x77\x6f\x0f\xa1\x5c\xa9\x70" - "\x14\x41\x2e\xd1\x42\xbf\x28\x4a\x80\x2c\xee\x3e\x84\xf2\xaa\xee" - "\x31\x26\x1d\x47\xae\x83\xfb\x5a\xe2\x09\x7e\x38\x54\x1c\xa0\xcb" - "\xeb\x28\x11\xe5\x1e\x62\x78\x0c\x0b\x7c\xe0\x41\x5b\x4b\x0f\x15" - "\x7b\x29\x2c\xa2\x60\x7a\x34\x78\x39\x51\xf0\x90\x2e\x00\x8f\xf9" - "\xaf\x15\x65\x2e\x6f\x92\xf0\x1e\xfc\xe7\x30\xc3\x0b\x90\xd1\x26" - "\xf1\x7d\x98\x61\xf8\x59\xa6\x01\x66\xcb\x9a\x7b\xa8\x97\xc6\xb4" - "\x78\x1d\x45\x89\x1d\xe5\x44\x5c\xfe\xfd\x8a\x9e\x11\xa2\x2f\x27" - "\x91\x79\x8e\xdf\xbb\x83\x67\x39\xcf\x5b\xa2\xaf\x28\xf1\xf2\x5e" - "\x32\x32\xce\x28\x6f\x67\x3c\x23\xfb\xf2\xc1\x7b\x1f\x9e\x4d\x0f" - "\x67\xcf\xcb\x9e\x4d\x0b\xee\x9e\x33\x9b\x32\x6f\x9f\x9a\x79\xcb" - "\x6d\x33\x6f\xa1\xc5\x3f\x78\x70\x36\x2d\x5e\x38\x9b\x1e\xc2\x2f" - "\xe7\xbe\x79\x78\x98\x33\xfb\xa6\xcc\xef\x4f\x5d\x3c\x67\xde\xbd" - "\xf4\xc0\x92\x9b\x33\x6f\xbe\x99\xee\xbe\x77\xfe\x4d\x99\x99\xda" - "\xf5\xa6\x4c\xce\xf2\xc8\xcc\x7b\x1f\x9a\xba\x78\xf5\xaa\xb2\x55" - "\x53\x17\xce\x9b\x13\x39\x27\xa6\x87\xce\x87\x99\xa6\x3e\x71\x66" - "\x2e\x85\x21\x23\x1a\xd0\xd7\xf8\xf5\xb6\x54\x1c\xc7\x58\xb7\x6c" - "\x68\xe0\x3e\x92\x72\x72\xcc\x51\x8c\x6f\xa3\xdf\x69\xde\x0c\x5a" - "\x2d\x66\x5a\x61\xee\x41\x9e\x71\xf9\x78\x77\x4c\x93\xcd\x23\xf0" - "\x7e\x4f\xf4\xfb\x64\x3b\xde\xff\xad\xc3\x46\xe4\xc6\x0f\xf4\xf5" - "\x41\xe6\x81\x8e\x5e\xea\x73\xe4\x8c\x00\x1f\x27\xa0\x8e\x6e\x8c" - "\xc1\x4e\x94\xf5\x44\x8c\xed\x6e\xf4\x43\xa7\x6d\x3d\x25\x9e\x26" - "\xf3\xbf\x74\x94\x65\x11\xf7\x87\xbb\x4c\x83\x71\x6e\x10\xc6\x68" - "\x09\x03\x7d\x0c\x38\x47\x14\x1c\x4b\x7a\x84\x1c\xf0\x30\x9c\x9d" - "\x78\xa7\xc1\x0a\x75\x40\x1e\x40\x5e\xff\x3c\xec\x48\x27\x91\x32" - "\x76\x6f\x78\x20\x5d\xce\x2d\x28\x97\xa7\xf3\x2f\xf2\xfb\x5a\x4b" - "\x90\xef\x27\x73\x13\xd0\xdf\x09\x98\x3b\xd1\x16\x73\x31\xf8\xd8" - "\x17\xae\xb9\xde\x2b\xfc\x39\xa4\xd2\x2c\xfb\x44\x0a\x9e\x6b\xae" - "\xff\x52\x38\x90\xb6\x5e\xa6\xbd\xcb\x69\xe8\xdb\x44\x1e\x83\xe2" - "\x05\x99\x9e\x08\x5a\x4c\x02\x7e\x5d\x21\x2e\x7f\x46\x96\x1f\x85" - "\xb4\x04\xe4\xfd\x32\x9c\x72\xfd\x59\xf0\x0a\xa7\x61\x3e\x1f\x57" - "\x09\x78\x7d\x61\x91\x43\xc2\xd2\x54\x87\x7b\x5f\xcb\xfa\x5e\x3a" - "\x51\x42\x06\x0f\xde\x85\x1d\x80\x39\x30\x58\x7f\x27\x97\x45\x5d" - "\x46\xff\x40\x11\xe6\x50\xcb\x11\xd6\x05\x42\x8c\xcf\x99\xc1\x3c" - "\x2d\x5c\x27\x8f\x63\xf4\x45\x2f\xfa\xe9\x32\xbf\x33\x79\x7e\x4c" - "\x3f\x15\x00\xce\x97\xa0\x7b\x17\x60\x1c\x0c\xf7\xa1\x0e\x3c\x03" - "\xae\x41\x83\xab\xc3\xf0\x29\x3e\x48\xde\x1e\xc3\x07\xf7\x02\xf6" - "\xb9\x88\xf7\xfb\x62\xde\xdf\x80\xf7\xfd\xda\x7b\x8c\xa7\xe4\xb6" - "\x98\xfa\x7b\xf0\x3e\x8c\xfa\x7d\x18\x2f\x89\xa8\x6f\x71\x03\xeb" - "\x69\x43\xf9\x83\xd1\xf9\x53\xac\x7d\x4e\x33\xcb\x10\x96\x85\x32" - "\x7f\xa3\xc6\xab\xaa\xfe\x94\x8c\x98\xfc\xe0\x61\xf3\x28\xf0\x03" - "\x5f\xc7\x22\xcf\x28\xc8\x22\x23\xe6\x8d\xa3\x87\xca\x59\x6f\x4b" - "\x59\x16\x93\xbf\x1c\xf9\x26\x30\x1d\x25\x0d\xce\x48\x1a\x2c\xd6" - "\xf4\x2c\x1e\x0b\x26\x94\x71\xc5\x94\xd9\x8f\x32\xd7\x85\x15\xdd" - "\x12\xfd\x7d\x71\xcb\xb4\xc6\x94\xe9\x96\xfd\xaf\xea\x31\x32\xbf" - "\xe8\x65\xa4\x6c\x19\x88\x82\xc1\x6d\x83\x3e\x36\xd6\x14\x0d\x23" - "\xb5\x1b\xf5\x4e\xd9\xa1\xc6\xf1\xb7\xd0\xe7\x37\x23\xed\x2f\x80" - "\x7b\x8e\xf9\x84\x79\xd9\xed\x0d\x40\xf6\xcd\x4d\x52\x73\xf8\xd8" - "\x15\xe6\x72\xe2\xfb\xa9\x7c\xcf\xb0\xc5\xc0\x7c\x8d\xc7\xc7\xae" - "\xc0\x95\xd3\x65\x9d\x3c\xb6\xc4\xc0\x3f\x85\x15\xcc\xb1\x3b\x30" - "\x06\x0d\x78\x0e\x69\x75\xb4\xe3\x39\x01\xfc\x79\x16\x72\x15\x3c" - "\x39\x97\xf9\x6d\x06\xd2\x3f\xd6\xde\x7f\xc0\xf9\x71\x7f\x93\x76" - "\xcf\x7c\x79\x56\xe3\x4b\xf0\x79\xea\x6f\x64\xdd\x92\xd7\x55\xf9" - "\xb0\xe2\xeb\x39\x78\xf7\x16\xae\xf3\x70\xdd\x81\xeb\x03\xb8\xae" - "\x70\x9c\x23\xab\x23\x04\x3d\x42\x3d\x2f\xc5\xf5\x41\x5c\xef\xc6" - "\xf5\x21\x5c\xa7\xf2\xb8\xf4\xae\x2d\xa2\x18\x9e\xe8\x0d\xab\xb1" - "\x38\x4a\xf5\x47\xea\x44\x6d\x7c\xa8\xf1\x79\x66\x28\x4d\xa8\x34" - "\x03\xe4\xf9\x50\xda\xc0\x5c\xa6\xcb\x62\xb4\x3d\xc0\xf5\x6b\xe3" - "\x7a\x84\xea\x17\x95\x27\xac\xca\x69\x7d\xa7\xa5\xa9\x7c\x09\x91" - "\x75\x7a\x68\x6c\x5b\x85\x4f\x08\x5c\x9b\x99\xae\x48\x3f\x08\x9a" - "\x40\x9f\x19\xbb\x9d\xe9\x34\xd4\xdf\x63\xd3\x23\xfa\x1b\xfa\x6c" - "\x6a\x20\xba\xbf\x2d\x8b\x99\x66\xdc\xdf\x3a\xbe\x8c\x3b\xe6\x14" - "\x9e\xa7\x46\x2a\xfc\x2d\x8b\x21\xd7\x7b\xb9\xef\x13\x4b\x78\x3c" - "\x8c\x9b\xe5\xa1\x3d\x52\x26\xf2\x3b\x5f\x72\xae\x97\xcb\x27\x16" - "\xcb\x77\x39\x90\x97\x5d\xfa\x3b\xae\x9b\xc7\x61\x62\x99\x7c\x57" - "\xa6\x97\x83\xcc\x3c\x2c\xcb\x62\x8e\xe3\x39\x9f\xe7\x6e\xcc\xa1" - "\x3d\xc8\x53\xe7\xa1\xcb\x2d\xc3\xd9\x37\xc2\x35\xb6\x79\x6a\x25" - "\x19\xae\xaf\xa4\x11\xee\xe0\x51\x5a\x14\x14\xa1\xa9\x44\x97\xb9" - "\x83\xb3\xe8\x06\xa2\x64\x77\xf0\x08\xa1\xc1\x93\xdc\xc1\x5a\xcc" - "\x91\x9b\xf9\xfd\x87\x53\x28\x21\x01\x57\xc7\x8d\x64\x48\x70\x07" - "\xf7\x20\xfd\x00\x5d\x4f\xc6\x84\xef\x8f\x10\x7e\x77\x70\x06\x9e" - "\xcb\xe8\xbe\x11\xe2\xaf\xb9\x21\xb2\xcc\xdf\x22\x1c\xee\x60\x01" - "\xdd\xb7\x25\x2c\xdc\xc1\x36\xbc\x2b\xa6\x45\xa1\xaf\xc4\xa2\x90" - "\x5f\x08\xcb\xd8\xc3\x8b\x42\x67\x70\xff\x57\x01\x5a\xe2\xfa\x21" - "\x7e\x0e\xe1\x86\xae\x2b\xaa\xc7\x36\xe7\xae\x33\xd0\x00\xe6\x15" - "\x91\x3c\xf6\x30\xda\xd7\x35\x20\x8a\x12\x31\x27\xfc\xaf\x81\x01" - "\x5c\x6b\xc6\xfe\x4f\xf9\xec\x1a\xdb\x03\x38\x5d\xd3\xa0\xf8\x33" - "\xfe\xee\x60\x37\xe5\x42\x76\x2c\x5a\xe7\x15\x8c\xfb\x98\x8d\x82" - "\x16\xad\xfb\x50\x40\x6e\x99\x17\xad\x73\x08\xbc\x33\x01\x5e\x97" - "\x3b\xd8\xcb\x75\xf4\x00\xde\xe7\x12\x9e\x2b\xd5\x84\xbc\x5e\xce" - "\x17\x09\x87\x61\x70\xde\x45\x21\x32\x8b\xea\x54\xd3\x40\xf5\xd8" - "\xc0\x40\x75\xaa\x15\xbf\xb9\x22\x25\xf5\x91\xb0\x33\xf5\x23\x9e" - "\xa3\x50\xbe\x08\xcf\xf6\xaf\xc0\x27\x92\x8e\x21\x1a\x85\xfc\x45" - "\xe8\xf3\x6c\xbf\xc4\x37\xb5\x4e\xe2\x5b\x93\xfa\xfa\x57\xb2\x1d" - "\xa9\xaf\xa9\x76\xa4\xfe\x88\xd3\x7d\xe0\x5b\xdc\x37\xfb\xd4\xbb" - "\x7f\x46\xb9\x25\x7e\x85\x57\xb3\xb0\xa4\x1e\x06\x0f\x26\x2e\x0a" - "\x89\x4a\xa6\x21\xe8\x5a\xc9\x74\x64\xbb\x05\x75\x34\x8b\xe4\xd4" - "\xc3\xc0\xa7\x0b\xe5\x4f\x0e\x08\x9e\x37\x53\x03\x5f\x29\xd8\x7e" - "\xc0\x59\xe6\x67\x98\x96\xd4\x80\x70\x8d\x33\x05\x0d\x36\xd0\x43" - "\x04\x16\x05\x37\x06\x73\xd7\x51\xa2\x3b\xf8\x31\xa5\x57\x56\x26" - "\xb8\xed\x65\x68\xe7\x76\xc0\x2c\xc0\x7b\x1a\x8b\xba\x3e\x04\xdc" - "\x00\xd7\x27\xaa\xc7\x99\x44\xca\x38\xe8\x0f\x54\xc0\x38\xf5\x3b" - "\xc9\x82\x67\x6b\xbf\xc4\x6f\xdc\xcc\xb0\x6b\x5c\x4e\xd8\x32\x6e" - "\xae\xce\x3f\xcc\x3b\x8a\x6e\xcc\x33\xef\x72\x9a\x45\xe7\x93\x90" - "\x6b\x5c\xfa\x8d\x44\x96\x85\x3e\x11\x64\x5e\x99\x4e\x25\x09\x1d" - "\xbe\x23\xa0\xb5\x89\x3a\x4a\x0e\xd0\x14\x62\xfb\xc9\x47\x1d\xbe" - "\x5a\x3c\xef\x26\xc6\xaf\xc3\xb7\x99\xda\x7b\xf7\xd0\xc2\x12\xdf" - "\xc6\x90\x65\xdc\xde\xf6\xde\x05\x84\xf2\x1f\x02\xc7\xf0\xe3\x25" - "\xc6\xca\x8e\x12\x1f\x3f\x3b\xda\x7b\xc1\x9f\x21\x11\x0a\xba\xc6" - "\x59\x83\x96\x71\xcd\x0b\xcf\x09\xef\x82\xde\xca\x11\x48\x1b\x30" - "\x27\x88\xa0\xd9\xee\x10\xed\xbd\xdb\xe9\xf1\x73\x94\xd0\x5e\x74" - "\x40\xf2\xe9\xe3\x25\x25\x24\xcb\x9f\x0b\x9a\x1f\xeb\xad\xa4\xc7" - "\x8a\x68\x0c\xf2\x9f\x61\x9e\x15\x63\x2a\xa9\xad\xbb\x98\x16\x9c" - "\x0a\x26\x2e\x3c\x37\x20\xda\xf2\x6a\xa9\xbd\xa8\x96\xe9\x31\x93" - "\xed\x8c\x05\xa7\xfa\xc4\xc2\x73\x7e\xd1\x5e\xf4\x2e\xb5\xe5\x1d" - "\xa0\xf9\x9f\xb7\x98\x43\xd5\xe3\xd2\xc3\xc9\xe3\xe6\x86\xab\xc7" - "\xe5\x84\x92\xc7\xed\x0d\x56\x03\x97\xe4\x71\xcd\xa2\x66\x7c\x3a" - "\xe8\x77\x99\xec\x8b\x94\xf1\xdf\xc6\xbd\x4d\xf6\xaf\x65\xfc\x4c" - "\xe1\x1a\x9f\x33\x50\x3d\x7e\xae\xe4\xfb\xe4\xf1\x33\xdd\x41\xe6" - "\xff\xf1\x39\xc8\x97\xa3\x78\x64\x7c\x91\xe2\xfd\xf1\x4f\x71\xbf" - "\x22\xaf\x1d\xbf\x6d\xf8\x41\xff\x18\x8f\x31\x4e\xc9\x0c\x37\xec" - "\x1a\x1f\x08\x5b\xc6\x63\x3c\x5c\x61\x82\x5d\x62\xe8\xf0\xed\xa1" - "\x10\x64\x6b\x87\x2f\x44\x0b\x9f\x0b\xa0\x6f\xd1\x07\xf6\x10\xe8" - "\x79\x94\x1e\x7f\x8e\x1c\x6e\xfb\x51\x12\xbf\x77\x31\x3d\xcc\x0b" - "\x9f\xfb\x50\x84\xab\xc7\x07\xf8\xfd\xc2\xe7\x1c\xb0\x8d\x00\x27" - "\xf9\x0a\x53\xb8\xe6\x8a\x74\x4d\x57\x02\x1e\x57\x7c\x87\xf1\x18" - "\xf0\x83\xc7\x30\x8f\xe3\xfd\x4c\xa4\xfd\x9c\xe7\x8e\x30\xf3\x9d" - "\xeb\x8a\xbd\xc2\x62\x35\x2d\x18\x21\xbc\xa1\xad\x24\x79\x20\x7c" - "\xa7\x10\x6c\x7b\xe5\xda\xa9\x49\x8e\xa9\xd0\x84\x4a\x91\x6c\x35" - "\x89\xea\x2b\xf6\x86\x6b\x26\xdc\x0f\x38\x89\x62\x2d\x97\x9d\x30" - "\x57\xf1\xcc\x67\x72\xec\x89\xea\x09\x73\xbf\xa9\x9d\xef\x77\x4e" - "\x28\xf7\xd0\x7b\x39\x2c\xe3\x70\xbf\xcd\x43\xef\x67\x68\xf7\xb5" - "\x1e\xaa\x3d\x2a\xe5\x23\xe4\x5c\x49\x05\x8d\x3b\x49\x57\xcd\x05" - "\x4d\x08\xf7\x49\xb8\x9f\xbf\xe8\x06\xb4\xdb\xf5\x0a\xe4\x90\xf0" - "\xb3\xcc\x11\xce\x19\xd0\x37\x28\x0b\xed\x35\x09\x7f\x7a\x92\x48" - "\x49\xab\x10\x03\x56\xb6\x25\xcd\x78\x1e\x03\xba\xa6\xe1\x9a\xb2" - "\xfb\x3c\xa5\xe2\x67\xdd\xed\x0c\x57\xb2\x4c\xc6\x7d\xa6\x58\x6b" - "\x1d\xbd\x73\x0d\x65\x98\x7d\x64\x6a\x74\x86\x73\xcc\x1b\x2d\x6c" - "\x53\xa5\xf2\xbd\x70\xbe\x41\x8d\xe7\xc9\xc8\x73\x4b\x38\x19\xf5" - "\xd9\xcd\x42\x94\xa6\x53\xe3\x6a\xe2\xbe\xb2\x36\x3a\xc5\xfe\x90" - "\x3f\xdd\xc0\x78\xea\xb8\x30\x6e\xc0\xf3\x6a\xe0\xb9\x6c\xe9\xba" - "\x2c\xfa\xd8\x4e\x71\xd7\x22\xfc\xce\xab\x06\xdb\x3f\xcc\xfb\x7a" - "\x9d\x26\xc3\xbc\x3f\xa8\xd3\x69\x38\x7b\x9f\xc7\x79\xe8\xbc\xf0" - "\x56\xad\x24\xa6\x85\xd5\x11\x14\xff\x09\x9b\xa4\xb2\x22\x44\x57" - "\x2f\x5a\x77\xad\x70\x7b\x45\x8b\xdb\x7e\x4a\xae\xd7\x35\x22\x4f" - "\x45\x50\x84\xd9\xbe\x65\xdb\xb6\x96\x6d\xd5\xea\xb4\x3c\x51\x9d" - "\xb6\xac\x6f\x8d\x08\x36\x48\x7b\x74\x62\xa6\x87\x6e\x2d\x51\x7d" - "\x33\x6e\x26\xe6\xc2\xee\x3e\x4b\xda\x32\xc0\x4e\x66\xd8\x1d\x25" - "\xa2\x25\x9c\x9c\x56\x80\x7c\x98\xff\x7e\xe7\x8a\x5c\xb3\xc3\xbc" - "\xd6\xbb\xf9\x35\x9e\xdb\x26\x62\xfe\xbb\x76\xc9\x05\x6b\x42\x72" - "\x75\x91\xd0\x2f\xb6\xa1\x45\xc9\x04\x8d\x7d\xf4\x3f\x0b\x7e\x59" - "\xf1\x5f\x0f\xcd\x8d\xe3\x9a\xfb\x60\x77\x39\x36\xd0\x44\xf4\xc3" - "\x55\x27\x69\xe2\x17\x0e\xbb\x38\x21\x9c\x13\x2b\x7f\xb2\x3e\x00" - "\x9d\x60\xa2\xcf\x43\x1b\x8b\x86\x9f\x5b\x21\x17\xcf\x8b\x9e\xaa" - "\x35\x83\x34\x3b\xb6\x68\x5d\x58\xf0\x3d\x8f\xb3\x46\xa4\x33\x3d" - "\xfc\xce\xab\x67\xe9\xb4\x18\x86\xfe\x46\xe1\x4a\x2b\x51\x3a\xe0" - "\xd5\xf5\xc2\x29\xa8\xe5\x1a\x5e\xc7\xbb\x7a\xb7\xd4\x83\x5c\xe3" - "\xe7\xf6\x41\x8e\xf0\x7a\x07\x74\x66\x5f\xa9\x55\x04\x00\xd3\xe5" - "\xa1\xc9\x1e\xcd\xce\xf2\xb9\x83\xf7\xb2\x4c\x99\x3b\xdc\x3a\xe9" - "\x10\xfc\x6b\x0e\x76\x40\x23\x62\x99\x24\x2c\x79\x33\x2a\x14\xde" - "\x01\x86\xdb\x52\x71\x96\xba\xf1\xbe\xd4\x27\x7a\x84\x2b\x2f\x9d" - "\xf5\x90\x96\x35\xfd\x9c\xf6\x01\x78\x58\xb4\xac\x66\x9c\xae\xf9" - "\xa0\xe5\x9a\x7e\x3a\x01\x1d\x0f\xfa\x9d\x57\xd9\x5c\xd7\xec\x3d" - "\x54\x46\x9a\x1d\x77\x0d\xec\xbf\xef\xec\xd5\xf1\x82\xec\x10\xa0" - "\x2f\xea\x67\xb9\xd7\x4b\xbc\x86\x56\x5a\x2e\x02\xc0\x75\x26\xf2" - "\x2e\xd1\xdb\xc0\xed\x53\xed\xba\xa6\x28\xb2\x5d\xc0\xc1\x0b\x7d" - "\x59\xd2\xa0\x74\x1d\x99\x6c\x8a\xd6\x26\x6e\x2f\xb7\x85\xdb\x2c" - "\xdb\x02\xfd\x82\xe7\x15\x77\xf0\x56\xe8\x5f\x32\x3d\x07\xb0\x0e" - "\x78\xe8\xdb\xd9\x4a\xb7\xba\x46\xea\x75\x71\xfb\xd1\x32\xce\xe4" - "\xf8\x8a\xae\x71\x84\xc5\xf1\x13\x74\x2d\xeb\xb4\x89\x7c\x95\x73" - "\x72\x00\xfc\x6b\x99\x32\x8b\xe7\x62\x77\xf9\x39\xc8\x6f\x99\x77" - "\x2c\xf2\x76\x23\xcf\x4d\x5a\xde\x9b\xd4\xfa\xae\xbc\x8e\xe2\xab" - "\xa8\x19\x37\x02\xbc\x3b\x97\xd7\x24\x84\x25\xd7\xab\x3f\x0b\x3c" - "\xe3\x8a\xbe\x9a\x32\x2b\x3e\x2e\x56\x53\x58\x8d\xc5\x5e\xd4\x73" - "\x05\xf3\x94\x63\x1d\x5d\x09\xbe\x3c\x56\xb1\x81\xc6\x32\x3f\x89" - "\xe4\xb4\x72\x45\xf7\x6b\x6b\x85\xb3\x92\xdc\x90\x9e\x25\x6b\xe8" - "\x2a\x8c\xbf\xb2\x93\x74\xed\x3b\xb9\xe5\x36\xe0\x4a\x54\x75\x9a" - "\x48\xca\x9a\xe4\x34\xbb\x3b\xf8\x39\x35\x9e\x66\x5b\xeb\xda\xc3" - "\x3a\x2f\xe2\xfe\xc8\xc5\xe4\x02\xe8\xba\x4d\xd9\x0a\xb6\xbb\x79" - "\xbd\xec\x38\xd9\x32\xb8\xbd\xf8\x25\x20\xed\x6a\x71\x5e\x2c\x13" - "\xac\xbf\x61\xbe\xf2\x90\x2d\x07\xd7\x6d\xf2\xe7\xa4\x3c\xed\xd9" - "\x8e\x7c\x49\xe2\x7c\x98\xf3\x40\x6e\xdb\xd2\x84\x33\x81\xc7\xc4" - "\x41\xbf\xd3\xb6\xd8\x43\x33\xb7\xa9\xbe\xb1\x4d\x64\x58\xc3\xe0" - "\x60\x47\xdf\x12\xf3\x26\x60\xfd\x8b\xad\x22\x81\xf1\xd8\x21\xc7" - "\x05\x60\x35\x1a\x94\x7c\xc6\xdc\xb8\xad\xc1\x19\x2e\x82\x2c\x2e" - "\x0a\xd7\x64\x34\xcb\x7b\xed\x1d\xe3\x81\xb9\x6f\x5b\x7c\xf8\x79" - "\x33\x5a\x26\x30\x8f\x4f\x4a\x55\x70\xf2\xd2\x5b\x26\x9c\xe4\xe7" - "\x71\xfc\xec\xb3\x4c\x6d\x76\xd7\x65\xa1\xfe\x93\xa8\x77\x52\xaa" - "\xb2\x01\x26\x8d\xeb\x43\x1d\x7e\xe7\xa4\x54\x0f\xa5\x1f\x50\x6b" - "\x87\x53\x9b\x87\x19\x7b\x16\x1e\x3b\xed\xf5\xa4\x8d\xe9\xeb\xfe" - "\x85\xd7\x31\xd0\xae\xa2\x90\x65\xfc\x36\x4d\x6e\xb0\x5d\xf5\xad" - "\xe3\x74\x5d\x73\x47\x91\xe4\x6f\x83\x30\x4c\x2a\x7b\x2f\xec\x35" - "\xf0\xfa\xae\x12\x5f\xd7\x35\x5f\xf8\x9b\xb4\x07\xbf\x03\xf8\xb5" - "\x68\xcf\x6d\xf8\x79\x70\x9f\x29\xe9\xd6\x57\x00\x3b\xe7\xba\x66" - "\xcc\xf5\xdb\xf8\xd9\x43\x93\xf6\x89\xbe\x34\x43\x58\xbb\x6f\xf8" - "\x92\x6d\x8c\x49\x5d\xa0\x7f\x81\xea\x07\x86\x41\x09\x18\x8b\x4c" - "\x73\xe1\xa8\x13\x81\xd6\x0a\x1f\xe3\x6c\x6a\xad\xf3\x91\xed\xdb" - "\xdc\xf6\xeb\x92\x4a\xeb\x84\xd7\x07\xda\xf3\x95\xdb\x76\xa8\x3e" - "\x48\xbc\xc6\xec\x77\x5e\x97\xe6\xa1\x27\x6a\xa5\xcc\x4f\xc9\x5b" - "\xcc\xf0\x44\xb2\xe4\x07\xa1\xb7\x5d\xc9\xb3\xa9\xcd\xdc\x8f\x78" - "\xfe\x21\xda\x6d\x3e\x4d\xd7\xc9\xfe\x3c\x84\xb6\xef\x86\x4c\x61" - "\xdb\xa9\x51\xca\xff\xeb\x20\xff\x6d\xad\xfa\x7a\xe8\x0e\xbc\x83" - "\xdd\xd4\xdb\x5e\x14\x20\x86\x11\x02\xec\x2a\xb9\x26\x94\xd1\xbc" - "\xa1\x57\x04\x3e\xac\xe8\x31\x62\x3e\x46\x7f\x4f\x6d\xe6\x3a\x1d" - "\xd0\x83\x5b\x56\xca\x7a\xb3\x20\xab\x7c\x71\xfb\x7f\x10\xb7\xeb" - "\x3f\x38\x94\x26\xe5\x62\x11\x74\x2c\x7b\x74\xbf\x5c\x7f\x50\xf5" - "\xc9\xf5\xa6\xe8\x3e\xb9\xfe\x20\x7e\xf3\xf1\x2b\xc0\xaf\x4c\x7b" - "\x8e\xfc\xcd\x8c\xb8\xdf\xec\x77\x5e\x9f\x8d\xb1\xef\x51\xb4\xe6" - "\x34\xe0\xca\x3c\xf0\x25\x99\xd8\xf6\xe6\x7d\x05\x4e\x67\x7e\xe5" - "\xf4\x30\xf4\x12\x3c\xe7\xe0\xbd\x85\xc7\x62\x55\x98\xa2\xde\xbb" - "\x37\x83\xa7\xd6\xf7\x33\xee\xef\xc8\xf5\x82\x8d\xdb\xb6\x31\x1f" - "\x22\xcf\x32\x73\x70\xdb\x36\xd4\x77\x40\xa7\x1f\xd2\xea\xf9\x7d" - "\x7c\xfd\xe0\xfa\xa3\x83\x7a\x14\xf4\x4b\x96\x2d\xbd\x94\xd6\x03" - "\xf9\x83\xbe\xca\xd8\xaf\xe6\x8d\xb4\x2f\xf8\x19\x72\xef\x18\xee" - "\xbb\xdb\x21\x5f\xfa\x6b\xae\xf7\x0c\x18\x68\x54\xbf\x81\xb2\x82" - "\x35\xaf\xf4\x06\x53\xae\xea\x75\xf7\x1c\xa0\x8e\xe0\xaf\xc8\xf6" - "\xb4\x84\xf1\x99\x9b\xf9\x79\x9d\x08\xbd\xdf\xbf\x17\xb6\xd6\x99" - "\x16\xcc\xb3\xd7\x9e\xa4\x34\xd9\xf6\x57\x8e\x63\x06\x7f\x5c\xc2" - "\xd6\x68\xf1\xca\xe1\x9d\xcb\x45\x70\xe7\x09\x8c\x8f\x01\xeb\xe8" - "\x1d\xfd\x94\xf1\xe6\x7a\xca\xac\xef\xa7\xb4\x86\x7e\x4a\x17\x7f" - "\x4b\x37\xd4\x43\xd7\x7a\xfc\x9c\x85\x30\xbe\x73\xc6\x94\x90\xa9" - "\x61\x3d\xc9\x3e\x0f\x55\x43\xe7\x0a\x42\xe7\x3a\x93\xce\x72\x6e" - "\x50\xe7\x1a\x18\x60\x9d\x2b\xcd\xa3\xf8\x22\xcd\x73\x79\x11\x25" - "\x24\xe5\x91\x05\xf8\x39\x4e\x53\xda\xd5\x49\xdd\xd0\xf7\xd0\x66" - "\x8f\xd6\x5e\x5c\x33\xcd\x45\x34\x4a\xb6\x15\xb2\x57\x54\x67\xec" - "\x1f\x76\x4e\x35\x30\xef\xf8\x78\x0f\x08\x6d\x98\x7c\x2b\xef\x63" - "\x1c\x98\x10\x30\x96\xd6\x83\xef\x90\x5e\x36\x49\x04\x90\x3e\x91" - "\xeb\xde\x8f\x74\xbf\x73\x72\xb6\xc7\x68\x3e\x38\x9c\xbc\x35\x6f" - "\xd4\xe7\xfd\xc9\x1f\x0b\x43\x25\xeb\xdb\xe9\x1b\x82\xc2\xeb\x3e" - "\xcd\x63\x70\x72\xeb\xa2\x62\x11\xb4\xad\xe4\x3d\xa5\xc9\x07\x78" - "\xbf\x8b\xd7\xb9\xdf\x83\x9e\xf2\x75\x7b\x5c\x2c\xfb\xa1\x8f\xcf" - "\x34\x17\x03\x26\xf4\x7d\xe1\x48\xa7\x68\xdd\x3b\xbe\xde\xcd\x7b" - "\xa3\xaf\xca\x7d\xd8\xc9\xe0\x9f\xfb\xa4\x1e\xc6\xfa\x1e\xcb\x40" - "\xe8\x4d\x63\x4f\xd0\xb7\x67\xb2\x5d\xef\x77\x7e\x7b\xa2\x87\xe6" - "\xe8\xfb\x7a\x72\x7f\x17\x69\xd0\xff\xb2\x8b\x39\xad\x6c\x12\x59" - "\xcb\x6c\xa2\x67\x38\xdd\x47\xee\xb9\x1a\xe8\x0a\x94\x29\xd0\xe1" - "\x60\xbe\xf9\x79\x9f\x61\xe9\x52\xa4\xd9\x75\x38\xc8\x33\x0e\xcf" - "\xdb\x06\xf3\xa8\x32\x75\x11\x65\x96\xf6\x19\xa6\xfc\x1c\x69\xfb" - "\x62\xca\x1c\x8c\x29\xd3\x16\x51\xa6\x52\xab\xc7\x13\x53\xc6\x1b" - "\x5d\xe6\x3b\x74\x21\x6e\xdf\x49\x8d\x2e\xf3\x9d\xb4\x98\x32\x33" - "\x2e\xc4\xed\x3b\x73\x63\xca\xe4\xc4\x94\x29\x8a\xa0\x25\xef\xad" - "\x66\x22\xad\x3c\xa6\xcc\xf6\x98\x32\xf5\xfa\xf3\x70\x7b\xdc\xa5" - "\xbb\xc9\x0a\xbe\xec\xe1\xfe\x84\xde\xde\xdb\xf7\xfa\x33\x7e\xad" - "\x6c\x57\x9c\x76\xf5\xc6\xd4\x17\x8c\xae\x2f\x3d\xe9\xc2\x76\xa5" - "\xdb\xa2\xcb\xa4\x67\xc6\x94\xc9\x8a\x28\xd3\xa4\xea\x49\x5f\x12" - "\x53\xa6\x20\xa6\x4c\xd9\x85\x7c\x95\xbe\x2d\xa6\x4c\x5d\x4c\x99" - "\xbd\x5f\x43\x0b\x9e\x8f\x95\x2f\xc2\x78\xd6\x79\xef\xc1\x5c\x7f" - "\x43\x32\xdb\x32\x98\x4b\xbc\x3f\xe9\x0f\x8c\xe0\x39\x85\xe7\x9f" - "\x43\xf6\x00\xf4\xa5\xf4\x80\x87\xa6\x95\xe8\x73\x10\xef\x63\xf2" - "\x78\x56\xba\x72\x7a\xd7\x70\x3a\x25\xd7\xa3\xfb\x26\x70\x5d\x87" - "\x26\xb2\xee\x75\x43\xf6\xa0\x6e\xab\xf6\xeb\x49\xc1\xb9\xe1\x0d" - "\x86\xc3\xf5\x37\xaa\xfd\xd1\x04\xd6\xad\x0f\xd9\x65\x19\x7b\x84" - "\x3e\xcc\xf5\xfb\x0e\xac\x0f\x18\xa3\xf1\xb8\x21\xe7\x22\x78\x24" - "\x41\xc7\xb1\x76\x40\xff\xe0\x7d\xa0\xf6\x7a\xe8\x32\xd0\xdf\x19" - "\xb7\xe3\x74\x83\x47\xea\x56\x2b\xfb\x89\xef\xdd\xe5\x77\xc8\x7d" - "\x22\xa5\x5b\x4e\xb1\xb6\xa2\x7e\xd6\xc1\x5b\x4b\xce\x52\x9f\xd4" - "\xff\x59\x07\x9b\x72\xef\xa1\x72\x2f\xf0\x9a\x62\xd1\xf7\x4d\x3d" - "\x34\x25\x5b\xea\x0d\xae\x3c\x0b\xef\x61\xf1\xba\xef\x21\xdf\x4c" - "\xce\x03\xfe\xbf\x61\xa2\xde\x5e\xd8\x80\x18\x53\x37\xf4\x5e\x8c" - "\x66\xaa\x0f\xa7\x14\x47\xf3\xe4\x08\xf0\xca\x94\xca\xe8\x7e\x9f" - "\xe2\x8a\xee\xf7\x29\x4d\xd1\x3c\x69\x00\x4f\x4e\x39\x10\x53\xa6" - "\x35\xa6\xcc\x91\x88\x32\x2e\xad\x9e\x9e\x98\x32\x81\xe8\x32\x37" - "\x9a\x22\x9e\xd1\xc6\x1b\xad\x83\x36\x8c\xdc\x93\xbf\x31\x3d\xe2" - "\xd9\x50\x2b\xe5\xe7\x8d\xb3\xf4\x34\xde\x47\x6b\x78\x4d\xed\x09" - "\x6b\xf0\x72\x62\xc6\x3b\xe7\x2f\x8e\xc6\xe1\xc6\xf2\x18\x1c\x06" - "\xc7\x7f\x95\xb2\xc1\xfe\x70\x82\x32\x0a\x24\x0f\x61\x8c\x60\xbe" - "\x5e\xc4\xcf\x80\x55\x87\xfc\xa0\xc3\x8d\x07\x63\xe0\xb5\xc5\xc0" - "\x3b\x1a\xf1\x6c\xc1\x73\x6f\x44\x1b\x2c\x89\x56\xe9\x17\x03\x7d" - "\x2c\xc3\xa8\xa7\xb3\x6d\x08\x7c\x7b\x1c\x72\x9e\xc9\x62\x5f\x87" - "\x94\xe3\x74\xe3\x97\x6c\x47\x2a\x98\x19\x91\xe3\x9f\x54\xbb\x32" - "\xb2\xa3\xf1\xc8\x58\x12\x8d\x47\x46\x41\x44\xbb\x7c\xe6\x8d\xf4" - "\x80\x39\xf8\xe0\x0f\x59\xc7\x61\x1f\x1a\xe9\x73\xb0\x01\x7a\xd9" - "\x39\xb2\xb0\xaf\xc7\x89\x32\x4a\x74\xdb\x7b\x60\x93\xa5\x1d\x1d" - "\x96\x9f\x52\xf2\x6c\x9a\x7f\x8a\x0d\xf0\x5b\x75\x7e\x0c\xd7\xe4" - "\xd9\xc2\xd5\x37\x42\x27\xcb\x80\xfc\x9b\xb2\x58\xad\xb1\x4f\xe9" - "\x14\x8e\x9c\x3a\xd0\x13\xf6\xcd\xd4\x8f\x35\x7b\x60\x06\xfb\x2c" - "\x40\xf6\xf4\x60\x7e\x4f\x52\xfb\x5b\x53\x93\x22\xf8\xda\x67\x5b" - "\x7f\x97\x38\x4e\x53\x3f\xe1\xf9\x9f\xc7\x28\xfb\x3e\x1c\x0a\x7a" - "\x89\x6d\x68\x77\xf0\xa4\xd4\xd1\xf0\xbe\x53\x2b\x3b\x37\xa2\xac" - "\x57\xb3\x71\x7b\xf8\xdd\xf4\x20\x19\x0f\xf9\xbc\x04\x38\xa9\x4a" - "\xaf\x9b\xfa\xc9\x21\x8c\x57\x94\x29\xd7\xcb\xb0\x3d\xcc\x65\xcc" - "\x65\x64\x9c\x56\x4e\xc6\x96\xf5\xc7\x25\x6c\xad\xef\x7b\x58\x3f" - "\x76\x97\xf7\x90\xdb\xd7\xc5\x6b\x53\x46\xb5\x97\x3c\xb5\x33\x31" - "\x40\xa6\xbe\xea\x3c\x8b\x07\xf7\xa1\xea\x3c\x2b\x70\x43\xff\x64" - "\x48\x39\x17\x49\xbb\x7b\xef\x5d\xfc\xe0\xa2\x05\x53\x7f\xf0\xe0" - "\xbc\x25\xf7\xde\x61\x5b\xb2\xe2\xd9\xc2\x82\xa9\xab\x9e\x2f\xb3" - "\xad\x5d\xbd\xa2\x6c\xc5\xca\xa7\x6c\x99\xf6\xc9\x76\x5b\x7e\x99" - "\xba\xa6\x17\xe7\x97\x96\xcd\xe6\xdb\x0c\x5b\xc9\xea\xc2\x35\xf2" - "\xf6\x86\xd1\x14\x0d\x64\x45\x59\xe1\x6a\xdb\xe4\x82\x0c\xdb\x7d" - "\xf9\x2b\x8a\x9f\x5f\x5d\x18\x17\xd6\x1d\xb6\xd5\x85\xab\x0b\xf3" - "\x0b\x6c\xb3\x6d\x99\x0c\x39\x12\x5c\x44\x7f\x66\xea\xf3\x18\xcf" - "\x5f\x55\x4e\xd1\xa9\xcd\x67\x1e\xc5\x3f\xd3\xf6\x5c\x38\x97\x4d" - "\x6b\x8e\xe6\xb9\x69\x87\xa3\x79\x6e\x5a\xd7\x85\x73\xd9\xb4\x98" - "\xf9\x6f\x5a\xcc\xfc\x37\x3d\xe9\xc2\xb9\x6c\x7a\xcc\xfc\x37\x3d" - "\x66\xfe\x9b\x3e\x38\xff\x81\x97\x3c\x9b\xa4\x5c\x98\x1e\x33\xff" - "\x4d\x8f\x99\xff\xa6\x97\xc5\x3c\x6f\x8e\x78\x1e\x8b\xe7\xda\xc8" - "\xf9\x11\xcf\x7b\xf4\xf1\x39\x24\x5f\xa6\x37\xeb\x79\x58\xd6\x43" - "\x36\x77\x6b\x79\x3b\x23\xf2\xf6\x68\x79\xbb\x07\xc7\x1f\xf8\x88" - "\x7d\x44\x94\xdd\x9d\x39\x8f\x65\x3a\xfb\x87\xf0\xdc\x84\xf1\x71" - "\xed\x69\x9a\xfe\x11\xc3\x62\x1e\x96\xeb\x87\xaf\x3f\xea\x6f\x4c" - "\x21\x13\x97\x69\xac\x21\xa3\x70\x4e\x3d\x8a\x2b\x21\x2d\x09\x3f" - "\xc8\x94\xcc\x2c\x8f\xd1\xb2\x5d\xcd\x17\x99\x2e\xa9\xef\xa3\x8c" - "\x06\xbf\x9a\x9f\x01\xc7\x8a\x32\xa6\x2a\x35\x17\x77\xe3\x3e\x89" - "\x79\x1a\xe5\x8d\xc2\x30\x6d\x12\xae\x84\x34\x0b\x7e\xa9\x80\xe7" - "\xd2\xe1\xf1\x3e\x58\xbc\xf1\x1f\xbb\xbe\x3c\x68\xf3\x19\xc8\x5c" - "\xe5\x0c\x77\xb9\xc3\xac\x57\x67\xb6\xaa\x35\x82\x34\xe8\xf1\x1f" - "\xe6\x34\x22\x3d\xbe\x8d\x74\x13\xf4\xbf\xcc\x66\xb5\x6e\x72\x13" - "\xfa\xff\xbe\x6e\xb5\xb6\x99\xc6\x7b\xa6\xfd\x27\xe8\xa6\xb7\x71" - "\x1d\xc0\xf5\x25\x1d\x7e\x8b\xb4\x9d\x6f\xe2\x35\x8f\x87\x18\x6e" - "\x4c\xfa\x2c\xc8\xb7\x7e\x73\xb0\x32\x27\xce\xbb\x1c\xe1\x4c\x7c" - "\x30\x4e\x7a\x09\x74\x86\x7e\x0f\xdd\xb4\x87\xf1\x8d\x48\x87\x8d" - "\x3d\x66\x09\xe7\xf7\x70\x7d\x28\x33\x9c\xae\xad\xfb\x83\x29\xbf" - "\xcb\x9b\x8e\xc4\xb4\xe3\xab\x13\x74\xf3\x03\xaa\x1d\x37\xbf\x1b" - "\x53\x77\x6f\xfc\x76\xdc\x6c\x44\x3b\xbe\x8a\xdf\x8e\x9b\x6d\x92" - "\xb6\x06\xb4\xc5\x70\xc1\xbb\x59\x68\xcb\x57\x92\xee\xd1\xe9\x4b" - "\x34\x5d\xc8\x07\x1b\xcc\x82\x77\xb2\xec\x43\xe5\x43\xfd\xa6\xe5" - "\x2b\x37\xd7\xd1\xe2\x38\x75\xd6\x0a\xe7\xa8\x87\x3c\x74\x73\x9b" - "\x84\x33\x94\xbe\x4f\xe1\x02\x3a\x19\x24\x9d\x7a\xb9\xdc\x70\xfd" - "\xad\xdb\x25\x6a\x5d\xe3\x66\xf0\xec\x4d\xfb\xf5\x35\xc9\xd2\x72" - "\xe1\xd5\xe9\xe8\x77\xde\x62\x8d\x79\x17\x88\x78\x37\x23\xea\xdd" - "\x86\xc1\xf4\xf9\x7a\xfa\x37\xeb\xa7\x5b\xca\x63\xfa\x09\xfd\x33" - "\xe3\xf2\xe8\x76\xdf\xb2\x5d\xb5\x0f\x7d\x74\x01\xad\x6f\xd9\x8b" - "\x3e\x1a\x88\xdf\x47\xb7\xb4\xc6\xe7\xb5\x5b\x8e\x4a\x78\x29\x14" - "\x0f\x5e\x00\x7d\x37\x20\x79\x50\xeb\xa7\x0b\xfb\x67\xc6\x44\xbd" - "\x7f\xbe\x59\x1b\x67\xe4\xc5\xb4\x31\x04\x18\x9f\xa9\xb6\xde\x3a" - "\x35\x06\xb6\x3d\x3e\x2f\xce\x70\xa1\x9d\xa1\xf8\xed\x9c\xb1\x6f" - "\x78\x5e\x9c\x71\x18\xed\x09\x5d\xc8\x8b\xe8\x3e\x59\x86\xe2\x95" - "\x09\x0a\x67\xbc\x7a\x6e\x4d\x75\x04\x59\xcf\xbd\x75\x3e\xaf\x21" - "\x45\xa4\x67\x44\xf3\xdf\x0c\xbb\x2c\xc7\xf4\x0b\x2a\x39\xcb\xfd" - "\x70\xc2\x46\x86\xaf\xe3\x49\xbf\xf3\xd6\xed\x31\xb4\x3a\x73\x82" - "\xbe\x7b\x79\x9f\x21\x61\x8f\xa2\xd7\x77\x3f\x89\xc1\x69\x6f\x7c" - "\x7a\xdd\xda\x02\x7a\x9d\x89\x4f\xaf\x5b\x8f\x0e\x4f\xaf\x5b\xb9" - "\xff\xcf\x5c\x48\xaf\xef\x5a\x22\xe9\x05\x5d\x57\xb6\xef\x7a\x2b" - "\x78\x63\x20\x57\xf0\x1a\x1c\x68\x62\x31\x83\x57\x54\x99\x5e\x2e" - "\x93\x6d\x0e\x28\x3e\x81\x0e\x69\x3a\x4d\xdf\xcd\xd0\xc7\xff\x98" - "\x3a\x1a\x25\x06\x1e\x15\x80\x97\xc0\xe5\xdc\xf6\x33\x2d\xee\x60" - "\x26\xb1\xfd\x11\x53\xef\xb6\xf8\xb2\xe0\xbb\x4d\xa0\x69\x4d\x9c" - "\xf4\x66\xe5\x13\xf2\x5d\x6f\xb4\x8c\xf8\x6e\x67\x74\x1f\x81\x6e" - "\x28\x47\x43\x3e\xed\x17\xfd\x5d\xbc\xcf\x6e\xcb\xba\xb0\xcf\x6e" - "\x3b\xa6\xfa\xeb\xb6\x8f\xa2\xf1\xbb\x2d\x27\x7e\x7f\xdd\x56\x32" - "\x7c\x7f\xdd\xb6\x7d\xf8\xfe\xba\x6d\x2f\xf7\x97\x87\x6e\xf3\x44" - "\xcf\x1b\xb7\xb5\x44\xb7\xf7\x36\xde\x47\x31\x0b\xc3\xc8\xb1\xfc" - "\xfc\x4d\xdb\xad\xff\x58\xc6\x71\x5f\x35\x56\x10\x78\x39\x61\x12" - "\xe3\x78\xa9\x30\x86\x85\x0d\x1a\xba\xd6\xc7\xdf\x1f\x65\x1b\xb7" - "\xa3\x8e\x78\x2f\x9c\x6c\xd7\xb0\xee\x3e\xf3\x37\x61\x03\x75\xe1" - "\xde\x70\x82\xee\xd8\x18\x36\x18\xca\xd9\xcf\x52\xfa\x57\xca\x35" - "\x84\x99\x6d\x91\x7d\xc1\xbe\x38\x6c\x9b\xee\x54\xb6\xd3\x5f\x4f" - "\xd0\xed\x4b\x55\xbf\xdc\x91\x1f\x4d\xc7\x99\xde\xf8\xfd\x72\xbb" - "\x09\xfd\xf2\xd7\xf8\xfd\x72\x7b\xda\xf0\xfd\x72\x7b\x16\xfa\xe5" - "\xaf\x17\x8e\xa3\xdb\x73\xb4\x71\xb4\x89\xcb\xd8\x56\xb2\x3d\x7e" - "\xfb\x1f\x39\x0f\xee\x31\x46\x6e\xff\x25\xbf\x9f\xda\xab\x8f\x23" - "\x59\x66\x3b\x60\xc9\xfa\xb5\x3c\xdb\x34\x18\x91\x70\xf7\x9b\x7b" - "\xe3\x8d\x93\xdb\x0f\x73\xde\x69\x25\x64\x02\x0d\x73\x76\x33\x8c" - "\xd5\x44\xa7\xe9\x8e\xab\x39\x1f\xa7\x4f\xf3\x45\x8e\x93\xdb\x03" - "\x7a\x3e\x96\x75\x2a\xef\xed\x5e\xe1\x2f\x22\xce\x17\x0d\xfb\x0e" - "\xad\xfd\xa3\xe4\x3c\xc2\xf9\x39\x5f\x4c\x9e\xb9\x6a\x3c\xde\xb1" - "\x3d\x7a\x3c\xde\x91\x17\xcd\x9f\xa0\x3f\xca\x85\x21\xe7\x70\x7f" - "\x00\x38\x7c\x63\xfe\xba\xf8\xd8\xbc\xe3\x68\xcc\xd8\x04\x0f\x7c" - "\x6f\x83\xe2\x81\xef\x3d\x16\x83\xab\x2f\x3e\x0f\x7c\x2f\x69\x78" - "\x1e\xf8\x5e\xfa\xf0\x3c\xf0\xbd\x6c\xe6\x01\x0f\x7d\xaf\x3c\x7a" - "\x6c\x7e\x6f\x59\x74\xdb\xef\xf0\xa9\xb1\x49\xc9\x97\x32\x36\xa1" - "\x0b\x8d\x1d\x6e\x1c\xf2\x98\x42\xdd\x09\x8d\xfd\xfa\x7e\xc6\x37" - "\xa2\x99\x09\xe3\x0a\xf8\xcd\xb2\xf0\x9a\x12\x64\xfc\x4c\xa6\x61" - "\x83\x3c\x6b\x33\x2b\x2d\x92\x8e\x3b\xd5\xb9\x17\x07\xf2\xbe\xc3" - "\xfb\xc3\x8a\x9e\xb3\x9f\x8b\x6e\xff\xac\xec\xf8\xf4\x9c\xb5\x0c" - "\xf4\x74\xc4\xa7\xe7\x2c\xfb\xf0\xf4\x9c\x55\xcb\x3e\xfb\x17\x8e" - "\xa9\x59\xfb\x6c\x6b\xa4\x8e\x22\xcb\x9c\xa6\xd9\x23\xbe\xd9\xfc" - "\x34\xab\x3b\x7a\x7e\x9a\xd5\x76\xe9\xf3\xd3\xec\xf4\xf8\xf3\xd3" - "\xec\xac\xf8\xf3\xd3\xec\x1c\x35\x1e\x66\xbb\xa2\xc7\xc3\xec\x92" - "\x68\x9e\x00\xed\xfe\xdb\xe6\xa7\xd9\x9e\x98\x31\x50\x75\x82\xee" - "\xcc\x87\x4e\x51\xa9\xfa\xed\xae\xc9\x31\x38\x06\xe3\xf7\xdb\x9d" - "\xa9\xe8\xb7\xaa\xf8\xfd\x76\x67\xe6\xf0\xfd\x76\xe7\x7c\xf4\x5b" - "\xd5\x85\xfd\x76\x67\xc1\xa5\xeb\x14\x77\xd6\x45\xf7\xd9\x9d\x95" - "\x97\xde\x67\x77\x1e\x8d\xdf\x67\x77\xfa\xe2\xf7\xd9\x5d\x49\xaa" - "\xcf\xee\xca\x8e\xee\xb3\xbb\xd2\xa2\xfb\x6c\x76\xf0\xef\xed\x33" - "\xf4\x8f\x51\xf9\x19\xdc\xf5\x36\xec\xf6\x51\x7e\xe7\x5d\xf5\x1e" - "\xca\xd2\xf6\x70\xb3\xd4\xdc\xa1\xfa\xf0\x7d\xe4\x71\x5d\x38\x0f" - "\xdc\xd5\xac\xa5\xfd\xe0\xc2\x7e\xb8\xeb\x08\x64\x74\x6f\x6b\xb9" - "\xdc\xd7\x52\x7d\xc8\x34\x47\xbe\x96\xf5\xbc\x37\x75\x97\x8f\xcb" - "\xa2\x8f\x85\x3b\x10\x24\x96\xeb\xc8\xef\x63\x38\x7c\x56\x29\x1a" - "\x56\x96\xed\x52\xe6\xf8\x8b\xf8\xc6\x18\x5b\x2a\x6e\x06\xbc\xbb" - "\x6f\x55\xbc\x9a\x15\xab\xff\x36\xe2\xdd\x65\x8a\x4f\xef\xf9\x4b" - "\x0c\x0e\x7b\xe2\xf3\x69\xd6\x41\xb4\xa1\x31\x3e\x9f\x66\x75\x0d" - "\xcf\xa7\x59\x2c\x33\x1b\x23\x6c\x9f\x94\xc7\x83\x9e\x18\xdb\xe7" - "\x6e\xab\xd9\xa7\x78\x47\xea\x44\xd5\x69\x46\xbf\xf3\xee\x58\xfd" - "\x0f\x7d\x73\xf7\x07\x1a\xce\xbf\x89\x29\x3f\x8c\xfe\x77\x37\xeb" - "\x7f\xef\xc7\xc7\xf9\xee\x8b\xe8\x7f\x77\xb3\xfe\xf7\xfe\x85\x63" - "\xeb\x6e\x4d\xff\x8b\x67\xe3\xdd\x7d\x34\x7e\xff\xdf\x1d\xd3\xff" - "\x94\x53\x06\x7b\x58\x96\x8f\xca\x77\xcf\xc4\xc8\x7c\xec\x63\xc4" - "\x79\x99\x47\xe2\xe4\x9d\x1b\x0b\x73\x98\x7c\x25\x17\xf0\x1e\xfb" - "\x44\xc5\xe5\xbd\x7b\xea\xd5\x78\xbc\xc7\x17\x3d\x1e\xef\x39\x10" - "\x3d\x1e\xef\xce\x89\x29\x77\x24\xfa\x3d\xf8\xe7\xbf\x4d\xc6\xce" - "\xc9\x8e\xe1\x81\x0f\x4f\xd0\x9c\x8f\x14\x0f\x64\x5f\x19\x8d\xc7" - "\x9c\x65\xf1\x79\x60\x4e\x19\xda\xff\x61\x7c\x1e\x98\xe3\x1a\x9e" - "\x07\xe6\xec\x03\x2d\x3f\x8c\xe4\xdb\x87\xca\xb3\x46\xc5\xe4\xe9" - "\x8c\x2f\xf3\xe6\xf4\xc4\x5f\x23\xc8\x26\x45\xe3\xec\x99\xd1\x34" - "\xce\xb6\x46\xd3\x10\x6d\xf9\xfb\x69\x38\x78\xd6\xd7\xef\xcc\x8e" - "\x1d\xff\xee\x13\x74\xaf\x36\xfe\xef\x8b\x91\x75\xd9\x7b\x14\x2e" - "\xf1\xd6\x45\xb2\xd9\xfe\x75\xc7\xa7\x65\xf6\xd1\x61\xda\xcc\x3e" - "\x6d\xee\xf0\x05\x63\xe9\xde\x24\xa4\x3f\xc4\xeb\xa1\xbc\x1e\xd2" - "\x80\xf4\x87\x82\x64\x92\xf3\xd5\xe0\xbc\x74\x2f\x9f\xbd\x14\x4c" - "\x7f\xe6\x5f\xf3\x44\x5a\xcc\x73\x10\xe3\x95\x5b\x2e\x7d\x16\xcc" - "\x9b\x99\xd7\xaf\x63\x5e\xbf\x57\xea\x7f\xbc\xcf\xc2\xfe\x80\x66" - "\x3b\x2d\x76\xfb\x82\xa4\xf3\x3b\xe7\x8f\x81\xbd\x9d\xc7\x05\xe7" - "\xd7\xf3\xaa\x75\xb3\xca\x18\xd9\x74\xef\x81\xf8\x7d\x7c\x6f\xdb" - "\xf0\xbc\x73\x6f\x8f\xea\xe7\xfb\x26\x46\xf7\xf3\x7d\xd0\xff\xc6" - "\x2c\xe1\xb6\x82\x07\x2e\x69\x9c\x94\xd9\x84\x77\x58\x79\xbf\xe9" - "\xd1\xae\x92\x0a\xba\xe6\x24\xdd\xb7\x59\xd6\x67\x10\x01\xf3\xc6" - "\x04\x6a\x95\x32\xe0\xbe\x7f\x97\x78\x22\x4f\x6e\x90\x0c\x62\xd3" - "\x33\x5d\xfc\xae\xd1\x29\x02\xc8\xd7\xc9\x7b\x02\x7c\xd6\x0f\xbc" - "\x30\xf6\x38\xdd\xb7\x3b\xaa\xbc\x91\xc8\xad\x60\x74\x35\xca\xf1" - "\x78\xdf\x11\x7d\x4d\x77\xf3\x30\xfe\x41\xc8\x13\xd0\x7d\x1f\x94" - "\xef\xd7\x7d\xc3\xee\x5f\x32\x4e\xec\x1f\xcf\x38\x5d\x5c\x0e\x7c" - "\x7f\xbe\xce\xbf\xca\x67\xf2\xfb\xcb\x86\x7c\xf2\xbe\x5f\xe4\xa1" - "\xef\x0f\x7b\x9e\x23\x7a\x1c\x7c\xbf\x36\x12\x8e\x3a\xef\xfe\xfd" - "\xbd\xba\x5f\x1d\xee\x0f\x7c\x0d\x2c\x1d\x9f\xa3\x31\xf8\xf4\x42" - "\x4f\x69\xd5\x60\x04\x2e\x06\x83\xfb\x5c\xf1\x2c\xf3\xc3\x5c\xcb" - "\xc5\xd6\xfc\x12\xad\xb4\xf8\xd5\x0b\x78\x6b\xae\xd4\x97\x18\xc6" - "\xc5\x71\x9c\x5b\x19\x65\x5b\xc8\xbd\x7b\xde\xdb\x9a\xb7\x40\x8d" - "\xfb\x79\x31\x6b\x84\x73\xeb\xa5\xdf\x94\x36\xee\x1f\x0f\xc6\x8e" - "\x83\xb9\x07\xf5\x39\x3a\x26\xfd\x88\x3e\xee\x61\xd7\x32\xdc\x98" - "\x75\xd6\xb9\x3e\x35\x16\xe6\xcd\x0f\x27\x47\xda\x6b\xf3\xa4\xfe" - "\xa7\xaf\x97\x7a\x90\x2f\xba\xdc\xbc\x98\xf5\xbf\xb9\xf5\x62\xf8" - "\x75\xfa\x24\xf4\xaf\x8f\xf7\xb6\xd4\xd9\xe1\x79\xe5\x31\xeb\x15" - "\xde\x9d\xf2\x9c\xe8\xa7\x80\x7b\xbf\x26\xf7\xee\xff\x32\xa6\xbe" - "\x7a\xc7\xa9\x8b\xb5\x7f\xde\x30\xed\x9f\x37\xd4\xfe\x95\x12\x6e" - "\xcc\x5a\xe2\x3c\xd9\xfe\xd0\x05\xf2\xef\xfe\x24\xc8\x2f\x9d\x6e" - "\xd0\xb9\xef\x2f\xd4\x75\x75\x5e\x3f\x18\x5e\x57\xbf\x7f\x68\xfd" - "\x4f\x95\x1b\x5a\xff\xf3\xc6\xd3\xd5\x3d\x24\xf7\x56\xa3\xeb\xde" - "\x66\xae\x8f\xd7\x96\xfb\x87\x59\xff\xbb\x5f\x5b\xff\xfb\x27\x4b" - "\xb4\x3c\xbb\xbf\x33\xba\x0f\xe7\xc5\xf4\xe1\xfd\xde\xe8\x3e\x9c" - "\x57\xff\x5f\x9d\xd7\x78\xe2\x4c\x4c\x4c\x34\x24\x26\x18\x12\x12" - "\xf1\x1a\x4d\xa4\x51\x89\xc6\xc4\x11\xf8\x8d\xd4\xae\xa3\x0c\x89" - "\x06\x23\x7e\x23\xb4\xeb\xc8\x98\xe7\x51\x5c\x16\x3f\xa3\x76\x1d" - "\x11\xf3\x3c\xf2\x6b\xde\x8f\xd2\xea\xd5\xeb\x37\xc6\x3c\x8f\xf8" - "\x9a\xf7\x23\xff\xce\xf2\x74\xc1\x73\xb4\x1f\xda\xbc\x95\x6b\xf2" - "\x8b\x57\x14\xc8\xfd\xe2\x42\x5b\xfe\x93\x4f\x16\x96\x96\xda\xca" - "\x56\xd9\xee\xb9\xfb\xc1\x9b\xef\xb0\xa9\x6d\xe7\xe2\xd9\x93\x0b" - "\x46\xd3\x82\xb5\xab\xf9\xc5\x82\x87\xe6\xe5\xd8\x16\xdf\x73\x77" - "\xf4\x4b\x1d\x8c\xdc\x5e\xbe\x18\x94\x88\xf1\x97\xf5\xd2\x78\xa2" - "\xed\xe3\xa5\xec\xe9\x6e\x6f\x22\x52\x6b\x1e\x0f\xe4\xb7\x41\x9b" - "\x10\xfd\x0e\xd1\x72\x1d\xef\xe9\x2f\x90\x3e\xc2\x53\x9b\x2a\xa9" - "\x64\x39\x9f\x37\x59\x70\x93\xf8\xbd\x97\x6c\xf7\x93\xe1\x38\x3d" - "\xfc\x5c\x2b\xb4\x5a\x7e\x76\x77\x07\xc9\xe6\x20\x13\xca\x27\xe3" - "\x5d\x82\xb8\x33\x8c\x34\x9f\xe6\xd3\xbc\x78\x92\x4c\xfb\x7d\xa5" - "\x9e\xcf\x7c\x82\x16\xfc\x45\xfc\x5e\xc8\x67\x71\xa7\x4b\xcb\xb7" - "\xe0\x9d\xb0\x73\x7e\x11\xcb\x86\xfa\x1a\x32\x36\xd4\x10\xbd\x91" - "\x42\xa6\x37\xc6\xf3\x19\xfa\x05\xf5\xfa\x5e\xe8\x4b\x78\xf6\xd0" - "\xc3\x25\x5c\x37\xe7\x0d\x1b\xe6\xd7\xc8\xfc\x29\x51\xf9\xdb\x86" - "\xf6\x62\x17\xd4\x1b\x90\x6f\xd1\xe7\x64\x0e\xa4\x5c\xe5\x71\x97" - "\x57\x92\x39\x24\xbe\x9c\x36\x97\x12\x3a\x30\xfb\xae\x0b\x8a\x60" - "\xcb\xea\x93\xa8\x7f\xe1\x95\xe6\x75\xe2\x4b\x37\x46\xff\x82\x5e" - "\x87\xd8\x79\x8a\x8c\x18\xd7\x09\x2d\xab\xd9\x4f\x61\x21\x35\x7c" - "\x45\x46\xd0\x60\xe2\x49\x5a\x94\x59\xbe\x40\x84\x1c\x0b\xc8\xf8" - "\x6f\x76\xf6\x37\x4c\xab\xd8\xf9\x67\x32\xfe\xa2\xbf\xd2\xd0\x2f" - "\xac\x54\x5e\x26\x7a\x04\xc7\xd6\xf0\x89\x00\xfb\xeb\xb7\xe5\x85" - "\x38\xcf\x4a\xbf\xc3\x4a\x1d\x65\x3e\xda\x70\x54\x04\xb6\xfd\x59" - "\xf9\xf9\xb7\xf7\xfa\xd8\x7f\xd1\xb4\x61\x01\x25\x9e\xc8\x21\x43" - "\x7b\x51\x1d\xb9\x97\xf9\xa8\xfc\xa8\xe8\x69\xcb\xfb\x9c\x3a\x8a" - "\xf6\x53\x6e\x17\x19\xda\xba\x3f\x23\x19\x1f\xa2\xe6\x15\x4f\xc5" - "\x39\xb2\x6e\x58\xc1\x69\xe7\x68\xfd\x06\xba\x7c\xfd\x5f\xc8\xec" - "\xee\xe9\x42\x3d\xa7\xe8\x91\x23\x94\x00\x78\x86\x17\x3e\x23\xeb" - "\x0b\x3f\x64\x7f\xde\x2c\xaa\xaf\x20\xab\x70\xa4\x27\xf5\x3b\xd2" - "\x2d\xfd\x22\x3d\xc5\xef\x48\x4f\xed\x28\x41\xfe\xee\x0f\x68\x4c" - "\x17\xa5\xfe\xfe\x64\x97\xa1\xee\x2c\x4d\xb4\x2d\xe4\xfe\x5f\x94" - "\x51\x7f\x16\xf9\x6b\xf2\xf3\xc2\x28\x1b\x59\x26\x98\x9c\x6f\x77" - "\xe7\x04\x28\x0c\x58\x75\xfd\x34\xb1\xbe\x9f\xac\xe1\xea\xfc\x3c" - "\xa6\xc5\x40\xcd\xf5\x1e\xc8\xc2\x51\xef\x3f\xd1\x6c\x74\xb7\xf5" - "\x52\xbb\xaf\x9f\x3a\xe8\x53\x72\xdb\xff\xd6\xf2\x8b\x27\x9a\x47" - "\x84\xc1\xfc\x2d\xeb\xbb\x01\x5f\xf1\x8c\xa3\x9d\xcf\x25\x56\x52" - "\x55\x05\x25\x95\xac\xa7\x51\x27\x91\xae\x6c\xfa\xf1\x3d\xee\xe0" - "\xdf\x5a\xd6\x4b\x1f\xdc\x87\x4b\x2a\xda\x29\xb1\xc3\x57\xc7\xbe" - "\x9e\x86\x50\xca\x2b\x1e\xb7\xaf\x93\xdc\x25\x7f\x6d\x09\x5b\x5e" - "\x39\xbc\x3d\x4c\xa6\x77\xcf\x77\x1a\xdc\xc6\xf3\xe4\xce\xf1\xd1" - "\x87\xa8\x5b\xd4\xbc\xc2\x7b\x9e\x59\x1d\xbe\x00\x9f\x4b\xca\x14" - "\x7d\xd6\xd1\x55\xab\x29\xa3\xe1\x2c\xa5\xed\x3e\x4b\xe9\xc2\x9f" - "\x6e\x60\xbf\xda\xc7\x4e\x59\x68\x37\xae\x49\xdd\x64\x42\x7b\x95" - "\x4f\x75\xb2\xe6\x5f\x3b\x90\x4e\x8d\xfd\x43\xfe\xb5\xfd\x7d\x43" - "\xfe\xb5\xe0\xa5\x26\xf6\xb1\xc5\xb8\xc8\x61\x7e\xae\x3a\x4d\xc6" - "\x4d\xa7\x89\xa6\x55\x1a\xc8\xf6\x04\x9f\x8f\x78\x60\x84\xbb\xe0" - "\x94\xbc\x3f\x4e\x8b\x0f\xe2\x9a\x84\x5f\x02\xc6\x80\x5c\xcf\xee" - "\xd6\xf8\x16\x69\x06\xa4\xbd\x8d\x6b\x22\xae\xbb\x1d\xf5\xc2\x2b" - "\x5c\x93\x67\xf4\x19\x68\x34\xf3\xaf\xf2\xe5\x9d\x3c\xc3\xef\x5c" - "\x0c\xfd\xa7\x30\x55\xe7\x63\x25\xd3\x17\x34\x7d\x78\xe2\x14\xc7" - "\x6b\xf1\x4a\x7c\x06\x8a\x12\x38\x76\x8b\x96\x0e\x1c\x16\x87\xb8" - "\x5e\xd4\xef\xc1\xd5\x8c\x1f\xc6\xe5\xe2\x32\xbd\x6c\xdf\x40\x11" - "\xd7\x79\x0e\xe9\x42\x4f\x47\x7b\x8d\xfc\xee\xd7\x27\x4e\x19\x54" - "\x9e\x74\x03\x60\x06\x34\xf8\x18\xeb\x0b\xb2\x79\x4c\xf7\x19\xcc" - "\xe2\x50\xc1\x0c\xaa\x1f\x2f\x3a\x77\xbf\x26\x5a\xd5\x58\x7b\x60" - "\xa6\x87\x96\xdb\x18\x47\xcc\xdb\xad\xdb\xf1\xee\x90\x8d\x88\xe9" - "\xd2\x9a\xc7\xfe\x63\x0f\xe4\x78\x68\xf4\xd1\xc8\x36\x08\xe7\x3f" - "\xcd\xe5\xb9\xf3\xbd\x8a\x96\x11\xc2\x30\x7f\x6e\x87\xa7\x97\x7e" - "\xd1\xdf\x33\xc2\xf1\x47\x32\xb8\x83\xc7\x69\x7a\x2a\x59\x59\xff" - "\x6b\x7c\x4d\x78\x70\xed\x61\x7f\x4e\xf0\xc9\xd5\x27\xe9\x81\xb7" - "\x6f\x4c\xa5\xd4\x3f\xd9\x49\x93\x47\x0f\x7c\x10\x21\x8f\xee\x6d" - "\xef\x6e\x8e\x90\x45\x4b\xcf\x5d\x28\x8b\x96\x7c\xa9\x64\x91\x08" - "\x2a\xd9\x13\xf2\x68\xe9\x9f\xc5\xa4\x6b\x7e\x21\x4b\x3e\x8a\x49" - "\x0f\x68\xe9\xef\xc6\xa4\x7b\x55\xfa\x43\xa7\x74\x59\xd7\xc1\x78" - "\xac\x65\x59\xf7\xd0\x27\x2c\xeb\x3a\x0a\x34\x59\x27\x7d\x0c\x1f" - "\xfa\x8d\xf8\x71\x25\xf1\xd9\x23\xdc\xef\x60\xfc\xc5\xef\x49\xc7" - "\xfd\x32\xa4\x2d\xe0\x34\xd7\xa7\x64\xc4\x4f\xca\x39\xe1\x9c\xff" - "\x3e\xcb\x39\x96\x71\xec\x77\xb2\x6b\xbc\xe8\xda\xf5\x9a\x38\x52" - "\xff\x9a\x68\xf3\x3b\x1f\x3c\xa8\xcb\xbb\x57\x90\xb6\x1d\x69\xaf" - "\xe0\x3d\xcb\x3d\xa6\x49\x7b\x4e\x33\xeb\x93\xdd\xe0\xe3\x72\x73" - "\x02\x95\xec\x04\xcf\xf3\x79\xc0\xcd\xa0\xaf\x1b\x32\x89\xcf\x72" - "\xc9\x38\x27\x86\x4c\xc8\xa8\x6e\x1e\x6f\xe3\x37\x61\x7c\xb9\xed" - "\x9f\x53\x85\x4f\x9c\xe4\x73\x71\x8c\x43\xee\xba\xfb\x39\x8e\x47" - "\x42\x6b\x11\x11\xfb\x80\xb3\xbf\x0a\xe4\xae\xd1\x05\x9c\x0e\x15" - "\x73\x5f\x3f\x04\xfb\xff\x0d\xed\x3c\xd2\xc3\x25\x1c\x17\xe8\x38" - "\x3d\xb8\x0d\xf6\x5d\x80\xdb\x66\x0e\x55\x12\x9f\x5f\xc1\x18\x65" - "\x1b\xaf\x68\x17\x7e\x2e\xfd\x0c\x0b\xc7\x76\x42\x1e\x77\x57\x80" - "\x18\x67\x0f\x3d\x78\xa4\xbd\xbc\x99\xcb\xdb\x99\x36\xc2\xe9\xd0" - "\x61\x24\xc8\x33\x30\x4e\x32\xf1\x19\x18\x0f\x3d\x54\xa4\x74\x9a" - "\xeb\x3d\xed\xcb\xbc\xc4\x72\xde\xdd\x03\x18\xe5\xc7\x15\x0c\xc0" - "\x12\x90\xfb\x51\xef\x34\xf8\x97\x6f\x10\x5f\x02\x7e\x36\xf7\x17" - "\x9f\x5b\xe4\xfd\x35\xd0\x25\x89\xfd\xe2\x95\xee\xf9\x60\x7b\xe3" - "\xa7\x44\xda\xd9\x4b\xf0\xdb\x83\x6d\x7c\xde\x88\xcf\x5b\xca\xb3" - "\x96\x86\x19\x24\xd6\xa6\x27\x0d\x9e\xb7\xfc\xbf\x70\xd6\x12\xf4" - "\xb7\x36\x18\xc4\x7e\xe0\xdf\xc6\xe7\x2d\x81\x7f\x06\xf3\xa1\xd6" - "\xa6\xce\x1f\x3d\x22\x69\x9e\xca\x69\xb0\x15\x0f\xeb\xfd\xcf\xed" - "\xe5\xb6\x1c\xa7\x07\x02\x4a\x27\x14\x9d\x1e\x5a\xd2\xc9\xef\x91" - "\xd6\xcd\xf9\xa7\x43\x8e\xb9\x0b\x42\xf4\xfe\x89\x90\xa1\x6a\x3d" - "\x19\x95\x4c\x5b\xfa\x05\x97\x57\x32\x6d\x69\xd3\x90\x4c\x5b\xfa" - "\x23\x25\xd3\x14\x8d\x95\x4c\x5b\xfa\x92\x92\x69\x4b\x37\xca\x7d" - "\x30\xc8\x34\x7e\xc7\x72\x4d\x97\x69\xbb\xc7\x8b\xc3\x2c\x3b\xfc" - "\xce\xa5\x25\xba\x6c\xdb\x81\x34\x96\x1d\x8c\xa3\x92\x53\x0f\x1d" - "\x16\xff\x7f\x3a\x29\x3f\x03\xbe\x2f\xe2\xb3\x0a\x3d\xda\x3d\xfa" - "\x65\xe9\x31\x25\xe3\x96\xb6\x0e\xc9\xb8\xa5\x73\x87\xca\xb2\x8c" - "\x5b\xfa\xef\x4a\xc6\xa9\xf4\xc6\x47\x58\xc6\x3d\x74\x98\x69\xa0" - "\xc1\x37\xf0\x9a\x9d\x96\x1f\x74\x7c\xa0\x33\x52\xc6\x45\x8f\xaf" - "\x87\x27\xea\x32\x8e\x65\x1b\x9e\x33\x20\xd3\x64\x9c\x31\x1e\x67" - "\xb5\xa0\xb9\x3e\xee\xb8\x0f\xb8\xcd\x1c\xff\x87\xe9\x36\xe7\x14" - "\x8d\xd2\xce\xfd\x68\xed\x7e\xb8\x48\xf7\x75\xf4\xd0\xd2\x92\x78" - "\x7a\xb3\xae\xa7\x81\x1f\xaf\x0d\x61\xbc\xb9\x2b\x31\x97\xd6\x89" - "\xca\x8e\xe0\x11\x7a\xbc\x8c\x0c\xe1\xc4\x67\x8e\x71\xdf\xc2\xce" - "\x18\xc9\x57\x96\x3d\x98\x43\xdf\xcd\xf5\xd1\x48\xd8\xe6\xc7\xaa" - "\x0c\x78\x67\xa7\xef\x45\xbc\xfb\x23\xd7\x13\x51\x6e\x6a\xc4\xbb" - "\xcf\xa5\x8e\x77\x9a\x63\x3f\x3d\xec\x1a\xce\xf6\xbf\x34\x5c\x7e" - "\x70\xfb\xf0\xb8\xfc\x60\xe9\xf0\xb8\xfc\x40\xea\x01\x53\x7b\x29" - "\x01\xb6\x59\xf2\x69\xfa\x81\x5c\x8f\x91\xb1\x2b\x36\xc5\xad\xe7" - "\x2d\xed\xfd\x88\x88\xf7\x91\x75\x7d\x14\xa7\x7c\x64\x7d\xc7\x2e" - "\x0e\x3f\x27\xe1\xe2\xf0\x73\x26\x5d\x1c\x7e\xce\xdd\x2c\x03\x41" - "\x3b\x73\xd8\x10\x9d\x6f\x5a\x50\x8e\xc1\xc3\x7c\xee\x0e\xf9\x56" - "\x68\x6b\x3e\xc7\x1c\x93\xa4\x2d\x28\xcf\x66\xed\xc4\x7b\x3e\x4b" - "\xce\xf2\x39\x7b\x1d\x91\xda\xa3\x1e\x2c\xb3\x3b\x16\xb7\x31\x41" - "\x1d\x37\xf9\xfe\x83\x58\xdc\xf0\x7e\x6a\xc4\xfb\xcf\x86\xfa\x3d" - "\xe7\xa2\xfe\xf5\xee\x3a\x22\x8e\xa1\x77\x08\xe6\x0b\xe6\x64\x8e" - "\xc7\xa5\xad\xcf\xfc\x70\x06\xe4\x7c\x65\x84\xdf\x2e\xeb\x5f\xd7" - "\x76\xf8\xf8\x9c\xaa\x4f\xad\xc3\x86\xe8\x0a\xcc\x27\x29\x7c\x56" - "\x87\xcf\xed\xe4\x86\x16\x1b\x54\x4c\x9c\x1f\x96\xe8\x65\x87\x5b" - "\x07\xe2\x7a\xb5\x3a\xd9\x07\xd6\x87\x32\x7b\xf4\x32\x0c\x9b\xfd" - "\x28\x31\x0f\x5c\x2b\xcf\xae\x06\x7b\x59\xee\x5e\x01\x3d\x39\x45" - "\xd5\x93\x47\x5a\x3d\xb0\x63\x7f\x90\x74\xb1\xb3\x23\xc3\xb7\xef" - "\x91\xd4\x4b\x6f\x1f\x69\xed\x7b\x64\xf1\xd7\xb4\xef\x62\xf5\x6e" - "\xbf\xf4\x7a\x2d\x7a\xbd\x87\x2f\x9d\xae\x8f\x04\xbf\x39\x5d\x33" - "\x35\xba\x3e\x9a\xf9\x35\x74\x8d\x53\xcf\xa3\x05\xdf\xbc\x1e\x9b" - "\x5e\x4f\x5d\xbc\x7a\x48\xfe\x0d\x7b\xae\xcb\xa4\xc7\xa6\xe3\xb8" - "\x90\x2a\x26\xd5\xa3\x9e\xc8\xd8\x99\x2a\x5e\xe4\xa3\x3e\x3d\x76" - "\xa6\x16\xc3\x12\x73\xcb\xb2\xe4\xdc\x26\xd6\x47\x44\xd8\x43\xcb" - "\x52\x39\xee\x61\xf6\x86\xc8\x18\x93\xcb\xd2\x2f\x16\xb3\x93\x63" - "\xe5\x08\x91\x43\x87\xea\xa4\x3f\x00\xe6\xa1\x65\xf9\x7c\x3e\x40" - "\xed\x67\x2e\x2b\x56\x63\x72\x59\xb1\x87\x1e\x6d\x1e\x1e\x46\xde" - "\xe2\x3d\x15\x99\x23\x86\xf3\xf9\x47\xf9\x7d\x1e\x7a\x4a\xae\x5f" - "\x86\x6a\xa6\x1e\x16\x67\xac\x5a\x2c\xae\xdc\xcb\x22\x62\x85\x61" - "\xee\x7e\xfc\x76\xed\x6c\x02\x68\x50\x09\x5a\x2e\xeb\xd6\x69\xa0" - "\xa7\x23\x2d\xa0\xd3\x00\xfa\x4a\x92\xbb\x29\xc8\x67\x87\x7c\xea" - "\xbc\xf7\x63\x57\x8b\xea\xbc\x2c\x05\xfb\x31\xb5\xcf\x90\x32\xf5" - "\xb0\xef\x05\xab\x41\x2f\x9f\x66\x73\x7c\xc5\x3c\xec\x4d\xce\xcb" - "\xf2\x3b\x1f\xcb\xd6\xe1\x0b\xc6\x4b\x0c\xe5\x6b\x94\x7e\x49\x8f" - "\xa1\xff\x1f\x9d\x25\xf9\x1a\x75\x48\xdc\x0d\x94\x18\x06\xfe\x68" - "\x83\xc1\x5d\xe2\x63\x3d\xb5\x37\x84\xf6\xb3\xac\x3b\xb0\xd2\x63" - "\xe4\x3c\x52\x77\x38\x93\x6e\x50\x71\xce\x1e\xfb\x20\x7c\x86\xe3" - "\x6d\x48\xbc\x92\xd0\x66\x13\xe3\xe4\xc1\xd5\xfb\x42\x3a\x2d\x3a" - "\x47\x1a\x2d\x1e\x7b\x3b\x8c\xf4\x70\xe9\x10\x0e\x0d\xf2\x8c\xc7" - "\x63\x3d\x3a\x0e\x61\xae\xdf\x6f\x35\x40\x17\xe3\x7a\x7b\xe4\x39" - "\x4b\xd4\x3d\x9d\xe3\x52\x71\x2c\x8b\xb5\xe9\xc4\x38\xf8\x9d\x8f" - "\x4f\xd4\xe9\xad\x95\xd1\xeb\x68\x0b\xcb\xba\x15\x6d\x14\x9d\x0f" - "\x41\x1f\x7c\x7c\xfe\x85\x74\x7e\x3c\x2f\x82\xce\x89\xcc\x57\xbc" - "\xc6\x82\x3e\x0a\x31\xbd\x79\x5f\xc3\xb6\x86\xf5\xaa\xc7\xab\x0f" - "\xf9\xa4\xdf\x49\x12\xc3\x0d\x83\xfe\x0c\x03\x70\xbf\xa5\x68\xfc" - "\xf8\xde\x41\x1a\xa3\x6e\x81\xbe\xd8\xa4\xce\xa4\xb0\xef\x3b\x64" - "\xc7\xe3\x87\x07\xeb\x61\x5c\x1d\x56\x43\x58\x58\xe5\x9a\x2a\xe3" - "\x5a\x66\x13\x01\xd6\x2b\xa5\x1f\x13\xda\x7a\xa0\xa2\xcb\x08\xdd" - "\xd2\x20\xeb\xea\x4b\x67\xfd\xde\x24\xef\x51\xd7\x30\xfc\xfd\x25" - "\xc7\x8e\xd3\xdb\x85\xb6\x98\x98\xb7\x80\x3b\xf4\xbf\xbc\xcb\x25" - "\xbf\xac\xe1\x7e\xca\xfd\x92\xd3\xf4\x7c\x78\xfe\x98\xf3\xe9\xcf" - "\x78\x07\xfe\xca\xdd\x82\x76\x8d\x66\x3c\xbd\x1c\x2f\x4f\xb6\x39" - "\x2f\x9d\x61\xf8\x9d\xb9\xae\xa8\x76\x0e\xe4\x18\x75\xbe\xe3\x3d" - "\xa2\x56\x5b\x40\xca\x4e\x45\xdb\xdc\x83\xfa\x98\xe4\xf2\x6a\x8c" - "\xe5\x76\x46\xf2\xa2\xcf\x31\xc4\x07\x65\x93\xc8\x64\xb4\x71\xbc" - "\xbb\xdc\xfd\x2a\xae\x6e\x6e\x30\xb6\xbf\xf8\x1d\xc7\x86\xd3\x68" - "\xc8\xe3\xc9\x72\x9c\x72\xbd\xdc\x36\xbc\xcb\xbe\xd8\x7c\xc9\x31" - "\xda\x38\xde\xde\xab\x6a\x1c\x81\x2e\xf9\x2b\x5e\x55\xe7\x7b\x7c" - "\x2a\x46\x5a\xde\xb3\xc2\xf0\x96\xec\x2f\xf6\xcb\x93\xf1\x30\x64" - "\xec\x89\x3c\xf6\x71\x13\x63\x4a\xde\x92\xb1\x12\x35\x9f\x3d\x6f" - "\x6b\x49\x50\xee\x07\x38\xca\xf8\x1c\x6c\x90\x6d\x32\xe9\x93\x76" - "\xa8\x2c\x48\x0f\x05\x98\xb6\x79\x07\xf9\xbc\xba\x4f\xd2\x22\xef" - "\xb0\x7e\x46\x9d\xe3\xbe\x71\x2c\xc1\xe9\x41\x4a\x64\x9d\xc2\xe6" - "\xe0\xd8\x02\xf9\x4d\xac\x93\x28\x9a\x82\xef\x0d\xa2\x53\xf1\x72" - "\x7e\x32\xc7\x66\x54\xfb\x4b\xc7\xc1\xdf\x89\x7f\x43\xde\x1b\xd4" - "\xba\x8c\x3e\xd6\xf2\xdf\xe2\x3d\x26\x8f\x06\xc3\xef\xcc\xc7\xfc" - "\xbf\xac\xf6\xc2\x71\x91\x9f\xac\xdb\x18\x7c\x2e\x4e\xed\x57\x0d" - "\xc1\x43\x79\xb9\x2e\x3d\x24\x9b\xfe\xc0\xb0\x2a\x2f\x1c\x33\xf9" - "\xb5\x3a\x2f\x97\x5c\xc7\xe7\xaa\xf3\x72\xb8\xfe\xe1\x64\xa6\x70" - "\xfc\x90\xfb\xc9\x74\xc2\x46\x89\x5f\x77\x5e\x62\x68\xff\x2b\x3f" - "\xa0\xb7\x41\xa7\x89\x6a\xc3\x13\x0f\xf4\xa5\xa4\x99\x86\xda\xfe" - "\xc4\x03\x92\x16\x43\xef\x5f\x8a\xa0\x0d\x3f\x6f\x53\x7c\xf7\xc4" - "\x5c\xf0\x87\xb6\x66\xa3\xd2\x44\x4a\xde\x1c\x8e\xd3\xa8\x70\x5c" - "\x41\x3a\xbf\x23\x6f\x99\x87\x4e\xa4\xab\x7d\xa8\x27\xd0\xfe\xfc" - "\x4e\xad\xdc\x44\xc6\x25\x6e\x3b\xa3\x70\x7c\x92\x78\x8e\x55\x71" - "\x0b\x9e\x4c\x60\x7c\x6d\xdf\xe6\x3e\x7e\xa2\x9d\xeb\x65\x9e\x10" - "\x03\x45\x23\x7c\x03\xe9\xd4\x37\x50\x84\xf1\x93\x6e\x40\x3d\x90" - "\x7f\x9f\x1b\xb5\x3a\x7d\x3a\xae\x8c\x1b\x74\x45\x93\x5f\xac\x88" - "\x4f\x5f\xae\x97\xc7\xfb\x40\xd1\x28\xfc\x4c\xf8\x8d\xfc\xa6\xf3" - "\x31\xf4\xda\x1e\x6f\xf5\x94\xb2\xf0\x1a\x71\x78\x51\x50\x84\x61" - "\x17\xf4\x54\x81\x7f\xc7\x6c\x6c\xa1\x31\xbe\xc7\x0c\xb9\xeb\x28" - "\x0b\xb6\x2d\x89\xf3\x62\x66\x43\x18\xd7\x35\x62\x06\xc7\xa3\xc5" - "\x73\xa6\xf6\x9c\xc1\xcf\x7d\x6b\xc4\x32\xbf\xf3\xc9\xbd\xfa\xde" - "\x9d\x8a\x3d\xf3\x64\xf3\x60\x1c\x9e\xc4\x47\xf9\x9c\x0f\x2d\xb2" - "\xa3\x8e\xc4\x67\x7a\xb8\xde\x5c\x9e\x3b\x50\x1f\xf2\x61\xfe\x5f" - "\x36\x83\xf3\x79\x13\xa7\xa4\xe0\x97\x3e\xcc\x1e\x67\x0f\xe3\xd5" - "\x97\x3c\xa5\x4c\xc7\x75\x8c\x2f\xcb\xf0\xcd\x70\x2b\xc8\xd6\x71" - "\x43\xfa\xe1\x2a\x95\x1e\xe4\x58\x64\xec\x83\x88\xf7\x05\x3a\xae" - "\x3a\x0e\x5c\x1f\x9f\xab\x14\x29\x69\x56\x8e\xed\xc2\xf5\x79\x5f" - "\x28\xe2\xbc\x2e\x1d\xdf\xaf\x3f\xfb\x13\x9f\xee\x1e\x2a\x38\xaa" - "\x78\xb2\xe0\xa8\x3e\x7f\xe1\xbe\x27\x7a\xbf\xb7\xa0\x33\x56\x96" - "\x3d\xb1\x6a\x55\x59\xee\xea\x42\xbe\xa4\x4f\x7e\xfe\x86\xd1\x91" - "\x36\x29\xcb\x37\x15\x1b\xa0\x90\xcf\x3e\xd1\xab\x29\xfa\xfe\x65" - "\xe1\xe0\xf9\x27\xcd\x4f\xfa\x2e\xd6\x55\x59\xa7\xc3\xbb\x65\x1f" - "\x95\x6f\x60\x30\x09\xc7\x4c\x64\x18\x4e\x76\xb2\xbc\xe8\x4b\x7e" - "\xd1\x22\xe9\x51\xdd\x50\x89\x72\x83\xeb\x9f\xc3\xf8\x89\xe5\x84" - "\x6a\xf2\x9b\x6c\x13\x64\x8c\x23\xc3\xaf\xd7\x77\x19\x78\x0e\xaf" - "\xc0\x3d\xdb\x4e\x52\x6f\xd0\xe2\xe6\xfc\xfe\x6c\x17\xe4\x70\x61" - "\x8f\xa8\x4e\xcb\x01\x4c\xcf\xb0\x38\x44\xec\xb1\xb3\x4f\x56\x37" - "\x2d\xa7\x61\xf7\xc3\x5d\x53\xbb\xd4\x38\x5c\xbe\xb4\xd5\x4a\x7c" - "\x46\xf4\xc5\xe3\xb4\xfc\x01\xa3\x15\xb2\x76\x02\xfd\x0c\xf7\xd2" - "\xd6\xe5\x77\x51\xfd\x75\xf5\xa9\x26\x63\xa2\x30\x08\x21\x12\x84" - "\xfa\x23\xa3\x76\x93\x88\x9f\x41\x24\xc8\xdd\xa2\x44\x50\x6a\xd4" - "\x48\x23\x99\xc7\x24\x99\xae\xbd\x66\xa2\xf5\xae\x3b\x67\xcd\x74" - "\x54\x94\x83\xbb\x83\x01\xb3\x88\x8c\xf3\xb4\x75\xff\xd2\x1b\x2a" - "\x49\xfa\x0b\x54\x6f\x8d\x1b\xcf\x61\x87\x53\xc8\x98\xc3\xe1\x94" - "\xdd\x5e\xc7\xf3\x64\x78\xbf\xdf\x63\xe0\xd8\xc1\x3c\x47\x73\xcc" - "\x32\xe0\x7a\xec\x43\xa4\xa1\xfd\x76\xe1\xda\xed\x55\xfb\x81\x4f" - "\x4d\x0a\xd7\xec\xf6\x0e\xc1\x37\x12\xc3\x77\xbc\x41\x86\x3d\x15" - "\x3d\x06\xb7\xf1\x4e\x72\xdb\x7c\xf4\x21\xee\x87\xe9\xcf\x12\xd0" - "\x9f\x18\x46\xa3\x33\xbc\xcd\xf1\x15\x19\xb4\xf3\x75\x86\xd3\xf4" - "\xd4\x0f\xf7\x0f\x53\x8e\xcf\xb3\xf6\xa5\x4c\xb9\xc3\xef\x7c\x0a" - "\xfd\xff\x3d\x9f\x36\x27\x40\x76\x3d\x05\xfb\xaf\x50\x3d\xa7\x4c" - "\xb9\xbd\x4f\xc6\xb5\x7c\xaa\x59\xcf\x13\xb7\x8f\x5e\xe6\x35\x47" - "\xd1\xc2\xfd\x2a\xce\x7f\xd1\xc3\xbe\xfb\xc3\xec\xf3\x8f\x72\xdb" - "\x6f\xe6\x7d\x96\x11\x63\x02\x94\xe4\x38\x27\x06\x60\xb7\xa7\x82" - "\x6d\x0d\x21\xd8\x5e\xc1\xf3\x22\xa7\xbd\xf7\x2c\x71\xac\x3f\xde" - "\xaf\x7d\x6f\xf9\x1f\x0c\xee\xc0\x99\x16\xf7\xe6\x30\x75\x60\x7e" - "\x76\xd7\x9f\x69\x69\xef\x3d\x82\xfb\x10\xb5\xd3\xa7\xd4\x6e\xff" - "\x5f\x95\x72\xad\xa4\x5e\x54\x32\x9d\x07\xce\x8b\x25\x6e\xe3\xff" - "\x24\x8e\x57\xcf\xb2\x02\x74\xb7\x9d\xa6\xa2\x8d\xbf\x07\x9c\xf7" - "\xff\x03\xb0\x64\x6c\xa7\xd9\xf4\x21\xee\xfd\xce\xa2\xed\xba\x1c" - "\x89\x1b\x47\x23\xa1\x65\x87\xd9\xfe\x98\x21\x0c\x99\xc4\x31\xb8" - "\x20\x8b\x66\x70\xbb\xf0\x9c\xc9\xcf\xb8\x66\xf0\xd5\xbc\xb1\x65" - "\xb7\x39\xf8\x18\xcb\xa8\x1c\x96\x3f\x48\x5f\xd2\x78\x5e\xca\xac" - "\xc5\xda\xf3\x7c\xed\x79\xae\xf6\x9c\xad\x3d\x67\x69\xcf\xb3\xf8" - "\x59\xc9\xb6\x15\xb6\x41\xb9\x6b\x18\xd5\x89\xe7\x4c\xbd\x2f\x80" - "\xcf\xe5\x66\xfb\x06\x29\x23\x35\x3c\x66\x68\x78\x65\x6a\xcf\x3a" - "\x3e\x57\x9b\x83\x1b\xfe\xbb\xf0\xd9\x1f\x83\x4f\x4b\x04\x3e\x64" - "\xb6\x67\x7d\x13\x7c\x2c\x66\x8e\xd7\xfc\x77\xe0\xc3\xb8\x70\x9a" - "\xdf\xf9\x74\x56\x34\x3e\x4f\x2f\xd6\xf1\x89\xcb\x6f\x6b\x44\x0f" - "\xcf\x0f\xa5\x57\xca\x58\x95\xa3\x58\xf6\x37\xf6\xeb\xf1\xd4\x9e" - "\xde\x7e\xb1\x78\x6a\x18\x0b\x56\xe4\x41\xfb\x9f\x5e\xa6\xcd\x83" - "\x07\x95\xbe\xf4\x74\xab\xee\x1b\x83\xb6\xee\xad\x52\x6d\xdd\xb7" - "\x99\x63\x8a\xad\xa3\xab\x1c\x76\xd1\x03\xfd\xff\x3f\x5b\x6d\xde" - "\xa8\x31\x50\x5c\x56\x5a\xfa\xec\x1d\xb6\xe2\xfc\x95\x85\xb6\xc9" - "\x05\xb6\xd2\xa2\x15\xcb\xcb\x0a\xa3\xf7\x8b\x2d\x5a\xbc\x7c\xe9" - "\x07\xcf\x3a\x29\x8f\x01\xe6\x7f\xb6\xe3\x95\xef\xe2\x33\x5b\x84" - "\xf3\x69\x3e\x2b\x6b\x6a\xa8\x21\x23\xef\x51\xf8\x9d\xcf\x2c\xd1" - "\xe7\x04\x15\x1f\x9a\x12\x0c\x16\xd6\xb9\x9e\x81\xfd\xfb\x54\x6f" - "\x44\x3a\xe7\xad\xd4\xd3\x18\xbe\x26\x9b\x46\x1d\xa7\x67\x26\x71" - "\x9d\x71\x69\x78\x5e\x34\xc1\xd6\x4d\x80\x3d\xc2\xb6\xa1\xe0\xf8" - "\x41\x7c\xbe\x0c\xe5\x04\xf0\xf9\x84\x65\x2f\x7f\x03\x42\xe9\xbe" - "\x82\x71\xfc\x1c\x65\xf6\x20\xcd\xb8\x13\x79\xa1\x4f\x73\x2c\x20" - "\xce\x1b\xe2\x73\xfe\x48\x37\x69\x31\x91\x90\x56\x9c\xcc\xe7\xf0" - "\x91\x66\x89\x48\x9b\xcc\x71\x7a\x91\x66\x53\xf0\x8a\x6f\x65\x3a" - "\xe3\x39\x4b\xb3\xb9\x39\xcf\x3c\xad\xde\xca\x48\x9c\x39\x8a\xfa" - "\xcd\xd3\x32\x6d\x4b\x1e\xfa\xee\xec\x3b\x9f\x5c\xb5\x72\xf9\x68" - "\x92\x64\x4f\xcf\xb4\x4f\xce\xbc\xd9\x7e\xc3\x1d\xb6\x92\xc2\xc2" - "\xd5\xb6\xb5\x85\x2b\xcb\x6c\xf9\x6b\xf3\xd7\x8d\xa6\xe5\xab\x56" - "\x3f\xc9\xa7\xc8\xb9\x5b\x4a\x73\x9f\x5c\xfe\x14\x6f\xea\xab\xdc" - "\xa3\xa3\xe6\xe3\x25\x2c\xdb\xb4\xb8\x0b\x87\x21\x73\x03\x22\x79" - "\x5a\x1d\xee\x39\x16\x91\x15\xd7\x56\xfc\x0e\xe2\xd7\x8c\xdf\x11" - "\xfc\x3a\x4f\xd2\xea\x54\x5c\x0f\xf8\x9d\xc5\x3e\x5d\x2f\x18\xe2" - "\xa1\x67\x4d\x3a\x0f\x61\x1e\x3f\xa0\xe6\xb7\x67\x67\x76\x04\xe5" - "\xf8\x19\xe4\xa9\xaa\xf3\x43\x3c\x25\xe3\x1d\xb2\xcf\xca\x1a\xbc" - "\x07\x0f\xb3\x1d\x0b\x9a\x5f\xc6\x74\x3b\x41\x25\x53\x61\xfb\xb7" - "\x71\x2c\x10\x5c\x5b\xc1\x2f\x6d\x2a\xfe\xc6\xb3\x07\x90\x6f\x12" - "\xea\x38\xa8\xd5\xa1\x9e\xc7\x8b\xc3\x6c\xe7\x1f\xd7\x9e\x95\x4d" - "\xbc\xea\x63\xbe\xe7\xab\xb6\x57\x64\x66\xff\x3f\x65\x5b\xe9\xef" - "\x56\x3e\xa6\xd5\xd1\x02\x5a\x54\x36\x38\xc5\xe0\x3e\x07\xaf\x31" - "\x99\x13\xee\x12\xc0\xe7\x4c\x38\xf1\x51\x19\x3b\xd7\x5d\xd9\x0f" - "\x19\x71\xcb\x2d\x6e\xbb\xcc\x9f\xc0\x6b\x50\x0b\x4b\x44\x98\xe3" - "\xa2\x86\x13\x9f\xe9\xe2\x72\xc2\x32\xad\x2e\xbc\xf3\xf2\x2c\xa5" - "\x0b\x70\x7c\xb4\x95\x9a\x1f\xa8\x08\x30\x6d\x4f\x52\xf1\x17\xca" - "\x9e\x59\x9d\xaa\xf4\xac\x95\xd9\xba\x2f\x19\xc6\x68\x3a\x9e\x97" - "\xe8\x32\xc0\x43\x2b\x6d\x9a\xdf\x4f\x8b\x6a\xff\xca\xed\xda\x73" - "\xb3\x86\x63\x02\xc7\x7a\x00\xfe\x9d\xdc\x77\xb0\x0d\x9b\x71\x7f" - "\x04\xf4\x69\x53\xf4\x59\x29\xd7\x18\xa0\xd7\xf0\xfb\x23\x1c\x77" - "\x1e\xef\x8e\xa8\x38\x0a\xcf\xb6\x72\x9b\x87\x7c\x03\xeb\xb3\x40" - "\xbf\x8f\x79\x4f\x0d\x63\xa9\xd9\x7d\x9e\xc7\xe7\xb3\x2d\x80\xb7" - "\x5f\x97\x3b\x2c\x67\x72\x43\x18\xa7\x52\x2f\x5d\x19\xd4\xe5\xcd" - "\x10\x1f\xac\xb2\xc4\x93\x25\xf1\xfa\x5d\xeb\x9b\x75\xc2\x59\xbc" - "\x04\x38\xed\x97\x7d\xc0\x71\x23\xcf\x0f\xea\xbf\x03\x4a\x46\xae" - "\x1a\xd4\x7f\x75\x3c\x38\xde\xad\x87\x71\xeb\x97\xfb\x9c\x9a\xdc" - "\x58\xb5\x5d\x97\x1b\x3a\x1c\x73\x82\x08\x9b\xed\xf8\xe7\x4a\xf3" - "\xf1\x1a\x2b\xcf\x97\x52\x1f\x01\x9c\x31\xe7\xd4\x19\x9f\x70\x75" - "\x1a\xf8\x79\x55\x36\x64\x8c\x51\xea\xa8\xce\xe2\xa7\x86\x64\xd1" - "\x2a\x4f\x24\x4c\x61\x49\xf3\x31\x5c\x96\x47\xac\x93\xe4\x86\x8c" - "\x1c\x67\xc3\xa7\xcd\x2f\x90\xc1\x25\x16\x1d\x57\xd0\xf0\xb0\x8e" - "\xaf\xf6\x8d\x0f\xd8\xd8\xab\x4a\x16\x85\x06\xd8\xd7\xb5\x55\xf5" - "\xe7\x73\x52\xde\xe0\xdd\x3e\x94\x9d\xef\xa1\x67\x9a\xb4\x31\xd4" - "\x86\xf2\xfb\x0e\x55\x64\x23\x4f\x49\x91\xe6\xaf\xd9\x89\xfe\x3d" - "\x12\xc1\xfb\x8f\x45\xd8\xcb\x47\x54\x1f\xde\x59\x79\x9c\x4a\xf6" - "\x46\xa4\x6b\x7d\x7b\x68\xf1\x71\x7a\xee\x31\x65\x7b\xa6\x69\xe3" - "\xb3\x44\xfa\x6c\xea\x38\xb2\x2c\xe0\xf3\x48\x3c\xc6\x25\xed\x65" - "\x1f\x97\x78\xf4\xf9\x02\xb0\x0e\x48\x9a\x8f\x17\x07\x99\x4e\x2a" - "\x9e\x41\xf1\x56\x45\xa7\xe7\x4c\x51\xb4\xe7\x79\x13\xf5\x30\x9d" - "\xc6\x6c\x14\xe1\x31\xbe\x04\x91\xbb\xce\x28\x63\x37\xf3\x18\xe7" - "\xbd\x09\xf0\x87\xd4\xab\x14\xdd\x9e\x9b\xab\xd3\x4d\xef\x3b\xa6" - "\x93\x87\x4a\x9a\x99\xb6\xd1\x6d\x1c\xd5\x79\x5c\x6f\x3b\x68\xca" - "\xeb\xa5\x78\x5e\xa6\x8d\x8b\xb6\x96\x09\xbc\x57\xfe\x6c\xfe\x21" - "\xe3\x77\xe9\x90\x7d\x06\x29\xda\x3e\x07\xfb\xef\x19\x93\x6c\x87" - "\x82\x75\x98\xe9\xcb\x63\x05\x78\x7a\xb5\xd8\x42\x87\x95\xbf\xc6" - "\xb3\xcb\xa0\xef\x7b\xe5\x58\x5e\x23\x63\x40\x70\x7c\xd1\x4e\xa6" - "\x11\xcb\x45\x1e\x4b\x3c\x06\x78\x3c\x29\x1a\xad\x36\x46\xd0\xa8" - "\x95\xe9\xa3\xd1\xe9\x40\x8c\x2c\x2f\xb4\x15\xcf\x56\xb2\xd8\x96" - "\x3e\xb9\x60\xba\x0c\xe4\x61\xbb\x6f\xce\x1d\xb6\xc5\xb3\x27\xdb" - "\x8b\x32\x16\xaa\xcb\x9c\xc5\xf3\xf9\x3a\x3a\xda\x7e\xb2\xa1\x9e" - "\xe2\x68\x1b\x6c\x6d\xaf\x92\x1f\xab\x37\x7b\x12\x12\xa4\x6d\x0e" - "\x5b\xb9\xb7\xea\x2c\x51\x88\x69\xb8\x12\x7d\xea\x4a\x73\x2d\x82" - "\x0c\x5e\xb4\x4e\x7c\xd5\x88\x74\x8e\x51\xcb\xbc\x08\x9e\x77\xb1" - "\xcd\xeb\x4d\xde\xba\x1f\xbf\x12\x6f\xf2\x94\xf9\xf7\xde\xe0\x10" - "\x80\xd5\xa9\xb7\x85\xed\x62\xc1\xe5\xed\x22\xc4\x74\xc9\xb5\xa3" - "\xbf\x51\x8e\x6d\x64\xe4\x0b\x60\x0e\xc8\x52\xb6\x61\x29\xda\x5f" - "\xbc\x47\x93\x5f\x8b\xf1\x9c\xea\xa1\x4c\xc9\xc7\x61\xa7\x95\xd7" - "\xe7\x8c\xe1\x4d\x53\x1e\x84\x0d\x50\xa2\xc3\x04\xac\x91\x5a\xec" - "\x39\x09\xef\x9b\xfa\x0a\x86\x6b\x26\x6f\x33\x27\xa8\x38\x77\x18" - "\xd7\x95\x8d\x86\x70\xce\xa0\x2f\x00\xde\x8d\xd9\x68\x61\x5f\x81" - "\x1c\xf0\x5b\x25\xe7\xd1\xdf\x55\x39\xc3\x9e\x2a\x43\x38\x80\xbe" - "\xb3\x28\x9d\xb9\x97\x65\x26\xec\xcf\xd2\x16\x7d\x2e\x93\x73\xa0" - "\x81\x2a\x95\x0d\x53\x2a\xf7\xf8\xce\x3a\x8d\x04\x39\xbd\xec\xba" - "\x54\x69\x97\x04\xc2\xce\x04\x52\xfe\x99\xa5\xbf\xd1\xe5\x2a\xef" - "\xb1\x98\x37\x0a\x2f\xaf\xaf\x99\x83\xc2\xcb\xfb\x2d\x72\xbe\xa0" - "\x93\xe4\x2e\xf7\x57\x72\x1c\x52\xa9\xf7\xa0\x5e\x35\x57\x84\xd4" - "\x5c\x81\xfa\x61\xcb\xe7\x61\x4e\x48\x38\x49\xa5\x9b\x19\x7f\xa6" - "\x0d\xaf\xe1\x86\x41\x2b\x37\xcf\x8d\x4c\x9f\x94\xef\x98\x78\x9f" - "\x9f\xdb\x6a\x0e\xa2\xcd\x91\xed\x32\x84\x3d\x3b\x9d\x68\x97\x01" - "\xed\xb2\x9f\xe2\x71\x12\x60\xff\x0b\x8c\xb1\xf1\x32\xd6\xae\xb4" - "\xb1\xcb\xf6\x44\xb6\x91\x65\xbe\x6a\x43\xd9\xc7\xf1\xda\x28\x0c" - "\xdc\x46\xa6\x41\xd9\x1b\xda\x18\x93\x78\xb2\xcc\xe8\xa5\xb2\x9c" - "\x31\x1b\xd9\xef\x21\xcd\x05\x3e\x9a\xc3\x7d\x88\x39\xd3\xc5\x78" - "\xc6\xeb\x2f\x86\xa7\x60\x3d\x5f\x60\xde\x58\x99\xe7\x77\x3e\x9f" - "\x19\x9f\xde\xcf\x3f\x70\x71\x7a\x3f\x3f\x99\xcb\x33\x1e\xec\x07" - "\x62\x0e\xc2\x40\x07\xdf\xc2\x46\xdb\x16\xaf\xde\x31\x1b\x9b\x18" - "\xaf\xb8\xef\x20\x77\x7a\xab\x34\xb9\x03\x3e\x14\x8b\xf0\x63\x39" - "\x04\xdc\xda\x74\x19\x64\x4e\xb0\x25\x4a\x99\x60\x10\x71\xdb\x65" - "\xde\xe8\x62\xbf\x8b\x39\xa8\x3f\xee\x7b\xd0\xd8\x06\x1a\x55\x86" - "\x37\xdd\x78\x9d\x39\x81\xee\xf2\x26\xde\x38\xda\x6c\x0f\xa6\x31" - "\x0d\x01\xd3\x8e\xb1\xfb\xef\x6c\x9b\xaa\xd8\x58\x6b\x30\xff\x6f" - "\x95\xeb\x79\xde\xe4\xb4\x4a\x15\x3f\x6b\x4d\x8e\x87\xb6\x1f\xd5" - "\xd7\x35\xf1\x5c\xe4\xa1\x4f\xb5\xf5\xaa\xab\xde\x14\x35\x53\xac" - "\x61\xa7\x59\xd8\xd6\x9b\xa1\x3b\xae\xe5\x38\xe4\x06\x91\x32\xc5" - "\x3a\xc4\x27\xca\x27\x44\xe7\x13\x94\xdf\x1b\x9f\x07\xd6\xfc\xf1" - "\xe2\x3c\xb0\x46\xee\x17\x33\xdd\x95\x7d\xb2\xc6\xab\xeb\x26\x62" - "\xd3\x55\x6f\xda\x2a\xb8\xfe\x35\x9b\x55\xdd\x4c\x93\x2c\x5e\xab" - "\x9f\x0f\xba\x54\xfa\x9d\x6b\x27\xea\x72\x80\xf9\xc5\x1c\xa2\x04" - "\x96\x45\xcc\x2b\x78\x37\x13\x72\xa6\x4e\xad\x21\x4e\xe9\x94\xdf" - "\x88\x72\xae\xb6\x79\x1d\x45\xbb\xd8\x87\xd3\x97\x9c\x16\x40\x9e" - "\x65\x1e\xfa\x6d\x9a\xcc\x63\x49\xf3\x02\x86\xaf\x36\x05\xf3\xb2" - "\xf2\x65\x4a\xe2\x31\xcd\x71\x6f\x78\x5c\x23\x2d\x15\x78\x73\x0c" - "\x1c\xd8\x38\x6b\x6b\x07\xe7\x22\x67\x16\x64\x85\x90\xf3\x21\xe6" - "\xa2\x89\x7d\xa0\xdd\x8f\x0c\xe1\xbd\xe7\xa7\x5b\x89\xdb\x7c\x7e" - "\xd3\x84\xbd\x2f\x4e\x23\xe3\xff\xb0\x3e\x41\x25\x37\x53\xea\xc6" - "\xef\x1a\xe9\x7f\xcf\x24\x03\xd3\xc1\x43\x6b\xf7\x28\xda\xad\xed" - "\xd6\xfb\xc7\x43\x6b\xe6\x73\x7f\xf0\xfa\xdb\xa2\xa0\xf8\x4a\xad" - "\x11\xda\x21\xff\x0a\x5a\xd4\xfb\xd5\xf6\xd8\x75\x1f\xd6\xe1\x6d" - "\x2b\x4a\x6d\x05\xab\xd6\xae\x9c\x34\x29\xca\x3e\x32\xca\x73\x1d" - "\x4e\xbb\x55\xcd\xa1\xf6\xf9\x3a\xde\xac\x8b\xe0\x19\xed\x5f\x7d" - "\x41\x9c\xef\xf9\xb9\x9a\xeb\x6e\x6e\x26\x0d\xdd\xdf\x44\xf3\x6f" - "\x8a\x78\xbc\x85\xe6\xdf\x7c\x4b\xee\x83\x85\xf9\x05\xeb\x22\x52" - "\x6f\x8d\x5c\x93\xab\x7a\x13\x75\x27\x4e\xb8\x07\xb2\x22\x61\xe1" - "\x0b\x3c\x9f\xac\xbb\xbb\x22\x28\xfe\x06\x79\x3d\x13\x63\x2c\xb7" - "\xbd\x2c\x48\xed\x90\x65\xe2\x2a\x96\xe1\xa3\xd4\x79\x35\xe8\x50" - "\xe0\x2d\x33\xda\xee\x85\x2e\x77\x8e\xd7\x64\x50\xae\xb0\xa3\x8e" - "\x63\xcf\x4e\x59\xa2\xf4\x8a\x75\x36\xa4\x27\xe3\x3a\x0f\xd7\x91" - "\xb8\x2e\xb0\xad\x84\xad\xc3\xfe\xc1\x6b\xd8\x3f\x78\x1d\xe3\x91" - "\x30\xcd\x57\x49\xd3\x56\xb3\x9e\x6e\xef\x62\xbd\xc3\x43\xeb\xb6" - "\xf1\xfe\x00\xe7\x45\x99\x49\xb6\xa7\x29\x93\xaf\x42\xee\xab\xac" - "\xb3\x89\xea\x29\x4b\xc4\xae\x1c\xfe\x76\x4b\x1a\xd2\xb7\x24\x26" - "\x1c\xa3\x44\xeb\xa8\xef\xfb\x9d\xeb\x36\x83\x27\xe5\xd8\x18\xee" - "\x7b\x6f\xac\x6b\xf0\x98\x1f\xd2\x45\xa0\x0b\x42\x17\xc9\xb5\xbf" - "\x4c\xb8\x37\x0e\xe9\x21\xeb\x3a\x07\x75\x5a\x03\x8d\xc6\xb3\x47" - "\xe7\x77\xdc\xf7\xea\xfc\x18\x15\x1b\x6c\x65\x59\xe1\xea\xc2\x02" - "\xdb\xe4\xd2\xd1\x14\x11\x19\xac\xa8\x70\xa5\x6d\x75\xe1\x73\xcf" - "\x17\x96\xca\xa8\x5e\xfc\x36\x6a\x3e\x4f\x15\x29\xe9\xdb\xf4\x33" - "\x2b\xb6\x09\x4c\xc7\xf5\x0f\x70\x3c\x29\x51\x73\x03\xeb\x1b\xbd" - "\xca\x96\x68\x30\x45\xdb\x12\x2f\x74\x2b\x1d\x6e\x4a\xb6\xb2\x63" - "\x5e\x58\xc7\xcf\xc7\x69\x7d\x70\x28\x06\xf5\xfa\x77\xf9\x3b\x08" - "\x1a\x7d\xba\xfc\xce\xf5\x7b\x74\xfa\x78\xa8\x5c\x3f\x47\xd0\x2b" - "\xe5\x04\xe6\x52\xc8\xb9\xa8\x79\x54\x7d\xcf\x6d\xfd\x3e\xde\x63" - "\x95\x6b\xb2\xc9\x53\xe6\x72\x5d\x0c\xf3\x04\xca\xa3\x1f\xb2\x21" - "\x1f\x59\x8e\x6d\xd3\xe1\xa1\xce\x5a\xae\x4f\xb3\x71\xae\x38\x49" - "\x2f\xc8\x3d\xeb\xb0\x6b\xca\x5c\x96\x1d\xd3\xa4\xce\x01\x38\x72" - "\x1f\xab\x3c\x83\xf5\x47\x19\x07\x1d\xb0\x78\x0d\x16\x32\x20\x87" - "\xbf\xfd\xc7\x69\x2a\xae\xd5\x3a\xe9\x27\x88\xba\xb2\xfc\xce\x17" - "\x0a\x86\xfc\xb2\xcb\x33\x58\xa7\x64\xb8\x1e\x7a\x21\x9d\xe1\xa9" - "\xb8\x5d\x2f\x00\x17\xfb\xde\x21\xdd\xe8\x85\xb6\x08\x9b\x0b\xf8" - "\x28\x3c\x7d\xc0\x45\xc6\x88\x54\x7e\x73\xb2\xdd\x2c\x27\x6b\xb5" - "\xb6\xeb\xed\x01\xbc\x2e\xf0\x5c\xad\xbe\xef\xea\xd1\xda\xcd\xf8" - "\x31\xee\x91\x38\x2b\x7c\xd7\xb3\x5c\xc2\x18\x2e\xb7\x44\x8c\x61" - "\x5e\x73\x19\x81\xb4\xb4\x21\x7f\xdc\xf5\xc5\xb1\xf2\xe1\x9e\xfc" - "\x27\x9f\x61\x23\x7d\x7e\x66\x86\x8d\x65\x45\xee\x83\xf7\xce\x79" - "\x38\x77\xce\xa2\xa5\x0b\x97\x48\xff\xfb\xc1\xf7\xd9\x2b\xe3\x67" - "\x88\xe6\x2b\x0b\x78\x83\xf7\x96\x46\x1c\xa7\x0a\x8f\x8a\xcf\x5c" - "\xbe\x37\x3a\x3e\x73\x79\x0b\x7e\x47\xf1\x83\x66\xb2\xc1\x83\x1f" - "\xf4\xc8\x8a\x23\x1a\xbf\xf4\x02\xdf\x23\x43\xfc\x52\x21\xd7\xbc" - "\xd9\x2f\x41\xad\xa5\x96\x43\xfe\xaf\x4f\x8b\x7c\x37\x64\xfb\x6d" - "\x48\x1a\xb4\xfd\x06\x65\xc1\x86\x99\xba\x1d\x88\xb4\xf9\xb0\x01" - "\x2f\x63\x1b\x50\xad\xfd\x54\x48\x1d\x2b\xd6\x56\x1b\xb2\xd3\x4c" - "\xa4\xdb\x80\x1c\x1b\x92\xf7\x3d\xd5\x18\xdd\x50\x16\x61\x63\xf9" - "\x64\xbc\xc0\xf3\xca\x26\xe4\x72\x72\xad\xcd\xb2\xdb\xc7\xeb\xcf" - "\xd0\x6b\xb3\x30\xc7\x63\xde\xf1\x0b\x91\xbc\xdb\xa7\xe1\x74\x80" - "\xd7\xa3\x59\xdf\x55\xf6\x5e\xf9\x4c\x96\xbf\x62\xd3\x84\x7b\x16" - "\x85\x64\x2c\x35\xc8\xde\x0d\x5d\x43\x3c\x57\xe1\xe1\xbe\x64\x1a" - "\x80\x0f\xba\x41\x07\xe3\x50\x9b\x2b\x68\xb0\xcd\xda\x3a\x86\xbe" - "\x86\xa1\xea\xaa\x38\x36\x5c\xfb\xe2\xb7\xad\x62\xf1\xd7\xb6\x8d" - "\xbf\x99\x83\x71\xa1\xb7\xf1\xc2\xf6\x55\xd4\xc6\xb4\x2f\xe7\xc2" - "\xf6\x55\x34\x0f\xee\xbb\x0c\xae\x4b\x54\x1c\xe3\x76\x32\x1f\xa0" - "\x9d\x87\x13\xad\xa6\x6f\x47\xdc\x67\xc4\x93\xab\x63\x36\x1a\xb4" - "\x33\x20\x8e\x5b\x5b\x27\x4a\x3b\x2d\xf0\xaa\x21\x5c\xf4\xaa\x13" - "\x3f\x5c\x59\xcf\x1e\xd2\x55\x45\x40\xe1\xe7\x98\xd1\x0a\xd9\xcb" - "\x6b\x2d\xc3\x9d\x6d\x03\xcd\x8e\xea\xeb\x00\xb8\xef\x62\x7b\x72" - "\x51\xe8\x2e\xc1\xe9\x4c\x03\xd8\x24\x5e\xf0\x55\x97\xd2\xdb\x1c" - "\x9b\x07\x65\xf6\xb4\x5b\xf3\x12\x37\x92\xed\x50\xfd\xcd\x9c\x5e" - "\x8f\xbe\x93\x6b\x83\xf2\x1b\x79\xc3\xc0\xcc\x0d\x65\xd1\x30\x70" - "\x8f\xea\x70\x87\x3b\x07\x19\x99\xb6\x6a\xa5\xad\x28\x7f\x65\xc1" - "\xaa\xe5\xcb\x33\x6c\xcf\xaf\x7c\xa2\x78\xd5\x93\xcf\xb0\xe0\x2f" - "\x2d\x7b\x1e\xe3\x57\x8e\xdb\xec\xf9\xf3\x73\xef\x59\xfa\xd0\x0f" - "\xa3\x74\x00\x93\xcb\x19\xde\x26\xbf\x91\xb5\xe9\xe9\xf5\x7e\x67" - "\x25\xfa\xff\x29\xbb\x9a\x6f\x2a\x31\xff\x3f\x99\xa4\x74\xad\x47" - "\x7b\xd4\xd9\xcf\xca\xe6\x08\xb9\x36\x06\xcf\xad\xfc\xad\x83\xa1" - "\x35\x90\x4a\x57\xa4\x0e\xd1\x27\xbf\x53\x57\xb9\x47\x8f\x83\x50" - "\x36\x89\x0c\xc6\x49\x2e\xaa\x35\x88\x4a\x0f\x55\x1e\x86\xbd\x78" - "\x14\xef\x5b\x3d\x54\x54\xa7\xd9\x8f\x47\x79\x8f\x95\xed\xc7\x10" - "\x6c\xc9\x45\xeb\x5a\xee\xca\x5d\x97\xc0\x3e\xc4\xf2\xbb\x09\xc1" - "\xf3\xa2\x9b\xf7\x39\x79\xcf\x88\xbf\x9b\x50\xf5\xb4\xb4\x27\x13" - "\x65\x1e\xdc\x57\x9d\x20\x69\x5b\xe1\xbd\xad\xf1\x84\xfc\x76\x23" - "\xec\x8f\x8d\x69\xba\xee\x69\xde\x68\x93\x67\x52\x77\xaa\xfe\xe8" - "\xe2\xbe\xe0\xfa\x72\xd7\xb5\xa8\x3a\xd0\x07\x28\x6b\x56\xeb\x3e" - "\x1b\x97\x5d\x74\x3d\x3b\x79\x6b\xdd\xb0\x31\xc8\x9d\x95\xa3\x5e" - "\x55\xf1\x8a\xd9\x0f\xce\xab\xfb\x61\xb1\x4f\x16\xe0\x1e\x88\xf5" - "\xe9\x52\x7e\x09\x1b\xdb\x74\x7f\x10\xdc\x77\x0d\xea\xcb\xfc\xad" - "\x0d\xd8\x39\xb6\x8a\x8d\x23\x4f\xd3\xc6\x37\x1a\x87\x59\x57\xd6" - "\xcf\xa0\x6a\x7e\x53\xa3\xfc\x4e\xe7\xc4\x41\x5f\x12\x3c\xf3\x18" - "\x1f\xf2\x07\x73\xce\xd4\xfd\x89\xa4\x0f\x19\xe6\x2c\xfe\x9e\xc7" - "\x09\x72\xfe\x50\x7e\x3f\xe4\x3a\x5e\x13\x76\xda\x5b\xa5\x2f\x9b" - "\xb3\x20\x12\x17\x85\x87\x73\x32\xaf\x5b\xf2\xfb\x48\x5c\xec\xf9" - "\xcf\xaf\x98\x6e\x5f\xbe\xc2\xf6\x64\xd1\x8a\x92\xdc\x15\x32\x6e" - "\xa8\x0c\x49\x5a\xb6\xae\x84\x57\xe9\x6f\x18\x1d\x33\x57\x68\x7e" - "\x67\x83\xfe\x35\xd2\xf7\xcc\xf9\x19\xe8\x61\x50\xbe\x67\x9b\x3a" - "\xd5\x7c\xe8\xec\xb9\xd0\xcf\xc2\x19\xd4\xfd\x2c\xc0\x57\x96\x5a" - "\x15\xaf\x5c\xf3\xcd\x60\xbe\xdb\x34\xf1\xc2\x32\x9b\x32\x07\xfd" - "\x8c\xd8\xdf\x65\x20\x47\x9e\x11\x90\xb1\xa5\x6b\xb8\xdf\x9c\x9b" - "\xdd\xf6\x7b\x79\x8f\x58\xe3\xe7\x4d\x79\x3a\x3f\xeb\x3e\x6a\x0c" - "\x8b\xcf\x28\x4c\x0f\x44\xfa\xa7\x6c\xfa\x18\x73\x8b\x75\xb0\x1d" - "\x2f\x18\x88\x71\xf7\x19\x5a\x18\x8f\x3d\xb1\x78\x00\xbf\x49\x48" - "\x8f\xf0\xff\xd1\xdb\xb9\x09\xfa\xdf\xe6\x0b\x74\xbc\xbb\xef\x9d" - "\x0f\x65\xae\xb4\xb0\x6c\x34\xcd\xc9\x2f\x2e\xe6\x71\x9d\x5f\x58" - "\xfc\xfc\xea\x55\xa5\xb9\x2b\x56\xae\x40\xea\xdd\xcb\x39\x9c\xab" - "\xcc\x72\x87\xf6\xc6\xb6\xb2\xb0\xb0\x40\x25\x69\xdd\x10\xbd\x37" - "\xa2\xf6\xbf\x37\x67\x79\x68\x63\x60\x48\x6f\xd9\x5c\x27\x0c\x9b" - "\x8e\xe2\xf7\x37\x39\xa6\xa5\x4e\xb1\xb9\x20\xda\x2e\xd8\x5c\xa6" - "\xf3\x83\xec\x3f\x07\xfb\x88\x5c\xff\x65\x9f\x90\x7b\x09\xe8\xb3" - "\x2d\x7f\xe4\xef\x9e\x7a\x68\xcb\x61\xd6\x87\x23\xe0\xec\x1b\xa4" - "\xe5\xa6\x47\xbb\x98\x17\x19\x1e\x7f\xef\x8d\xcf\x66\xe3\x3d\xf8" - "\x7f\x63\xa5\xe2\xff\xcd\x83\xfc\xdf\x67\x48\x84\x8d\xb3\xb9\x47" - "\xd7\x83\xa3\xc7\xcc\x16\xba\x70\x2c\xb1\xcf\xe0\x16\xab\x4e\x5b" - "\xbd\x9f\x15\x6f\x6d\xf9\x8d\xbe\x36\xd9\xa8\xc5\x16\xe7\x7b\x2e" - "\xcb\x3a\xae\x18\x73\xf9\x5d\xec\x03\x7d\x9c\xb6\x6c\x56\xfc\xb2" - "\x25\x2f\xc2\x97\xc7\x72\x92\xb6\x68\xf6\xec\x16\xbb\x8e\x1f\xda" - "\x39\x83\xd3\x18\x86\x1a\xfb\x9b\x42\x8a\x77\xb6\xd4\xeb\xb4\x65" - "\xbb\x11\xcf\xfb\x86\xe6\xf4\xcd\xf3\x79\xae\xd3\xce\xa6\x0f\x70" - "\xfb\x01\x27\x43\x87\x83\xbc\x78\x36\xb5\xea\xb4\xd2\xf3\x44\xf2" - "\xc4\x9c\xfc\x12\x18\x75\x2b\x96\x2f\x2f\x5c\x5d\xaa\xc7\xeb\x4d" - "\x5f\x55\x5c\xa0\xe2\xf3\xde\x81\xee\x5f\x8b\x11\x38\x9b\x43\xfc" - "\x22\x55\xdd\xc6\xd8\x00\x19\x6c\x87\x4b\x7f\x2f\xa9\xff\xbf\x7c" - "\x6b\x83\x66\x0b\x1c\xa7\x17\x67\xe0\x0a\x79\xb0\xf5\x9c\xd2\xcb" - "\x2e\x3b\xe3\x77\x6e\x2d\xd6\xf5\xb2\xbe\x91\x33\x61\x5f\x6f\x2d" - "\xd7\xbf\xc3\xa4\xeb\x0a\x7c\x16\xa5\x65\x25\xc7\x3e\x7f\xf9\x8d" - "\x70\x75\x5a\x89\x48\x19\xdb\x04\x9d\x24\x89\xf9\xfe\xf2\x5e\x8e" - "\x8b\xce\xf1\x62\xb6\x1e\x66\x5d\x86\x65\x09\xc7\x38\xef\xa6\xad" - "\x75\xfc\xed\x66\x0f\xbd\x5c\xef\x4d\x4e\x2b\xd9\xbc\x9e\x4c\xbb" - "\x5f\x93\xdf\xbf\xf5\xb4\x36\x31\x1d\xb7\x76\x7f\x54\xae\xbe\xa7" - "\xcd\xdf\x21\xde\x81\x77\xb0\x87\xf7\x6b\x6b\xc9\x9b\xb5\x75\xbc" - "\xcd\x7e\xe7\x8b\xd0\xff\x92\x9a\x15\x5f\x8e\xbb\xe2\x3b\x95\x64" - "\xe7\xef\xb3\xa9\x58\x2f\x53\xbb\x84\x6b\x9c\x15\x7a\x8c\x17\xfa" - "\x0f\xf4\xec\xad\xc5\xa2\x7a\x9c\x55\xc5\x89\x66\xbe\xd8\xba\x8c" - "\xdb\x09\x78\xdb\x79\x7d\x87\xd7\x76\x34\xb8\xec\xdb\x96\x00\x3d" - "\x6e\x16\xeb\x72\x78\x2e\x0a\x9f\x3f\xd5\x84\xb9\xdb\x84\xb9\xca" - "\xab\x7d\xf7\xa7\x98\xd7\x3c\xc7\x6c\xf4\x60\x2e\xba\x56\xe4\x06" - "\x2d\xbc\xd7\x70\xb9\xfe\x5d\x25\x5e\xf7\x04\x6e\x7b\x87\xf6\x10" - "\x4e\x49\x9a\x80\x1f\x2b\xbb\xe9\x45\xe9\xeb\xcf\xbc\xc8\xb4\xeb" - "\x07\xbd\xf8\xfb\xbb\xe2\xfc\xa9\xfd\xb0\x43\x2f\x3f\x41\x2f\x7e" - "\xce\x74\xe3\x7d\x3f\xf6\xd7\x41\x9a\x99\xe3\x47\xa3\x7f\x3e\x61" - "\x9a\x31\x2e\xc2\x95\x6a\x0f\xfa\x73\xbe\xcf\x67\x08\x59\x1e\x6d" - "\x28\x87\xee\xb7\x9c\xc7\xf2\x4b\x4b\xd9\x9e\xe3\x6f\x7e\xf0\xbd" - "\xa3\x40\x84\x25\xcd\xd7\x33\xcd\x5f\x5a\xba\xa1\x47\x84\xbf\x72" - "\x92\x38\xec\x23\xfa\xca\x40\xc1\x80\x21\x81\xf1\x36\x38\x4e\xf1" - "\x39\xc7\x26\x72\xdb\xb7\x11\xea\x35\xed\x5c\x4f\x16\x3e\x17\xca" - "\xdf\xb3\xe8\xf0\xd5\x53\x47\x49\x3d\xfd\x5b\xb0\x96\x5a\xd6\xf0" - "\x39\xff\x97\x82\x7f\xb2\xd7\xf2\x5e\xca\x65\xb8\xff\xc0\xf6\x30" - "\xd7\xb5\xad\xf6\x4f\x47\xfe\x4c\x7f\x6a\xf9\x33\xd9\x1e\x91\xcf" - "\x7b\xda\x72\xfe\x8d\xda\xb2\xfe\x8d\x1c\xdd\x22\xcc\x36\x41\xc5" - "\xb3\x5c\xc7\x36\xc0\x6a\xe2\xf3\x94\x96\x70\x9f\x75\x34\xda\x6f" - "\x5c\x64\x27\xea\xf0\x79\xc1\x43\xbf\x63\x1c\x27\x37\x9c\x25\x53" - "\xcb\xca\x3f\xc8\x7b\xa5\xab\x9f\x6a\x72\x17\x74\xb1\x9e\x14\xe4" - "\xf3\xa3\xbc\xf7\x04\x5d\x37\x5c\xc5\x38\x86\x14\xde\xfc\x1d\x69" - "\xbd\x3c\xf4\x28\xad\xfc\x36\xb9\xc6\xbb\x9b\xe9\x01\x9c\xda\x97" - "\x28\x9a\xb4\x75\x81\xa6\x0f\x6b\xf4\xc9\x89\xa4\xcf\xb6\x6c\xa6" - "\x0f\xc7\x1e\x0c\xa3\xbf\x80\x5b\x16\x68\x10\xd6\xeb\x00\xce\x26" - "\x6d\xdd\xce\xb4\xf3\x2c\x25\xb5\xac\xe4\x6f\x13\xbd\xf4\x8e\x79" - "\xb1\xd1\x14\x3e\x7f\x7a\x7f\xd5\x39\x32\x72\xbf\xf1\xfa\x7c\x95" - "\x7c\x2f\x69\xbe\x9d\xfb\x2c\xf2\x7b\xe6\xcc\x87\xfc\x4d\x73\xf4" - "\xd7\x36\xe0\x90\x86\xbe\x6a\xe2\xab\xe2\xed\x71\x56\x3e\x5f\xaf" - "\xe9\xf2\x43\xe9\xe0\xed\x20\x7f\x77\x50\xae\x4b\xbc\x94\x16\x06" - "\x6f\xb3\x3d\xdf\x50\x43\x49\x61\xe7\x16\xef\x6e\xc8\x9a\x7a\xcc" - "\x65\x0d\x29\x64\xe1\xb5\xac\x37\xa5\xff\xf0\xcb\xe9\xba\xec\x79" - "\x79\x3c\x9f\x49\x7a\x69\x89\x41\x7e\x5f\x2e\x6d\x9b\xc6\xe7\xd0" - "\x01\x5f\x9e\xef\xa1\x71\x7b\x94\xfc\x7d\x39\x47\x1f\x4b\xd0\x93" - "\xbc\x3a\xff\x63\x7c\x16\x79\x99\xdf\xa5\x1f\x82\x07\x36\xac\x59" - "\xb0\x6f\xe7\xd0\x37\xd5\x5e\x76\xe9\x7c\x8e\xb6\x95\xb0\x9c\xe0" - "\x31\x3d\x9c\x9e\x0d\x1d\xaf\x4d\xec\xca\xa1\x9d\x27\x89\x92\x36" - "\x0a\x6f\x52\xb7\x59\x74\xf8\xda\xe4\x79\x36\xfe\x7e\x62\x03\xd2" - "\xf1\x3e\x61\xa1\xcf\x6b\x86\x4e\xd8\xc9\xf4\xd7\xd3\x79\x7f\x81" - "\xd7\x63\x16\xfa\x84\x77\xd1\x3a\x33\x7f\xdf\x6d\xa2\x5c\x73\xd6" - "\xd2\x3b\xac\xbc\xef\xe0\x35\x83\x7e\xc1\x41\x58\x7d\x39\x89\x8c" - "\x27\xf2\xa6\x0e\xe6\xed\xcb\x31\xba\xed\xaa\xce\x88\xb4\x11\x8b" - "\xec\x28\xcb\xfd\xad\xa5\x29\x5d\xf2\x95\x92\x41\xfb\x88\xe3\xf4" - "\xf5\x61\xee\x2b\xcd\x49\x08\xf7\xe5\x18\x42\x80\x8d\xf1\x63\x91" - "\xdf\x99\x0b\x7a\xb5\x6f\xbd\xf4\x40\x06\x74\x91\xa8\x6e\xb0\x20" - "\x9f\x91\xe1\xf2\x99\x68\x8e\x93\x2f\x92\x9b\xe2\xea\x8f\xc2\xf5" - "\xca\xe1\x96\x8a\x47\xc0\x93\xdb\xed\x2c\x13\x42\x16\x28\x50\x4f" - "\xb3\x8e\xf1\xca\x97\xdc\xff\x21\x8c\xd3\x50\xf2\x64\xfb\xf4\x1e" - "\x4a\xe0\xef\xfd\xa9\x35\x8d\xed\xc9\x7c\x06\xdc\x11\x16\xd0\xdb" - "\xb6\x4b\xde\x33\xf7\xb2\x5f\xd5\xe4\x72\xe9\xcb\x94\xf2\x62\x8b" - "\x3b\xd0\x43\x6d\x95\x9f\x52\x5b\xd0\x5d\x79\xf0\xac\xd7\xa8\x7c" - "\x9a\x8c\x80\xbb\x7d\x32\xbf\x73\x80\xdf\x73\x43\x4d\x34\xdc\x9a" - "\x32\xdb\x7a\x98\x87\xfe\xaa\x6c\xa8\xed\x76\xdd\xc6\xfb\x9a\x36" - "\x74\xf2\x39\x72\x21\xac\x14\xae\x29\x6c\x01\x2e\x0e\xe1\x4f\xa7" - "\xe9\xeb\x79\x8d\x67\xfb\x5e\xe8\xee\x59\x1a\xdc\x33\x1a\xdc\xce" - "\x8b\xc1\x65\x9e\x69\xab\x93\xfb\x19\x68\x53\xe1\xfe\x10\x60\x87" - "\x52\x0a\xf9\x5b\x0b\x0e\xc7\x57\xbc\xd6\xb7\xf3\x6a\xd4\xb3\xbf" - "\x23\xd8\x49\x1c\x93\xa2\x21\x8c\x39\xee\x8c\x95\x34\xff\x2d\xc7" - "\x69\xda\xc1\x6b\xd5\x16\xd8\xa2\xbc\x8e\xef\x60\x39\xc9\x76\x6d" - "\x45\x88\x46\xba\xa1\xd5\xf0\x79\x6a\xc0\x48\xfe\x98\xf7\x4c\x20" - "\x6b\x42\xc2\x6a\xf8\xe0\xbc\x87\xd8\x47\x43\x9e\xaf\xde\x74\xd5" - "\x9b\x63\x36\xd2\x5d\xc2\x60\x96\xfe\x79\xe1\xea\x2d\x87\xd1\xb7" - "\x56\xe5\x2f\x96\x56\x1b\xe1\x2b\x96\x88\xba\xb6\xb0\xaf\x98\xb0" - "\xa4\x2d\xab\xe7\x3d\x8c\xe4\x17\x9b\xbc\xc9\x5b\x5d\x02\x7d\xe7" - "\x77\xee\x68\xf6\xd0\x2b\x72\xcd\x76\x3b\xfb\x57\x4b\x79\xbd\x73" - "\xb2\x37\x39\xbf\x4e\xa8\xb3\x57\x09\xe1\x35\xa1\xfd\x55\x5f\x92" - "\x51\xd1\x65\xe7\x88\x8e\x5e\x7f\x8b\x70\xe5\xd7\xf1\xd9\x19\xad" - "\x0e\x33\xea\xf8\x8b\xa8\xce\xaf\xf3\xd0\x4e\x4d\x66\xf0\xfd\x0e" - "\xb9\x9f\x18\x1c\x48\x87\x6e\xb4\xa3\xa0\xbe\x9f\xd7\x92\x77\x58" - "\x84\xf3\xda\x96\x3e\x4b\x7e\xdd\x43\x56\xd6\x8f\x76\xce\xf4\x18" - "\x3e\x9a\xa8\xad\x2f\xc9\x33\xe3\xb1\xeb\x42\x83\x7d\xb9\xcb\x3a" - "\xda\x0d\x20\xb0\xf7\x52\x4f\x92\xeb\x9d\x7e\x27\x19\x06\xa0\xd7" - "\xf5\x1b\xa0\xbf\xef\xca\x49\xda\x39\x81\x32\xf1\x6e\xc2\x49\xda" - "\xb9\x23\x68\xa0\x54\xfc\x2c\xde\xab\x8a\x2e\x03\xdc\x2c\x5e\x7b" - "\x6b\x3f\xcb\x6b\x2d\x3b\x4f\x49\xbd\xeb\x4d\x4a\x0b\x03\x1e\xef" - "\x17\x54\x4d\xa0\x34\x5e\xff\x42\x5a\x7a\x6e\x48\xed\x9b\xe9\xb6" - "\xfa\xa6\x09\x94\x11\x5d\xef\x4e\xed\x2c\xb8\x4b\xae\xa5\xaf\xf5" - "\xd2\x35\x25\x77\xf2\x77\x01\xab\x8a\x84\x33\x51\x88\xab\xac\x06" - "\xb5\x9f\x5d\xf5\x80\xb9\x4e\xf1\x9f\xdc\x27\x02\xdf\xf1\x3e\x9c" - "\xb6\x27\x91\x20\xcf\xca\xa7\x4c\x31\x89\x81\x74\x43\xc4\xfa\xa3" - "\x45\xe2\xa1\x9d\x73\x0d\x6d\x9a\x92\xc7\x30\x18\x9f\xdc\x7c\xb5" - "\x9f\xc1\x67\x60\x41\x63\x19\x8f\x75\xfb\x9b\x94\xf4\xca\x9b\x64" - "\x69\x5f\xce\xed\xaa\x52\x65\x0c\x46\x62\x7c\xc3\x2e\x1e\x6f\xe0" - "\x0d\xe0\xcd\xf5\xc9\x6f\xea\x06\xcf\xb4\x38\xca\x44\xb8\xe5\x69" - "\xd6\x2b\xab\x3e\x6a\x59\xbd\x8f\x16\xf1\x99\x61\x3e\x2f\xb4\x8c" - "\xbc\x8d\x80\xd7\x38\x81\x2c\x80\xd5\xee\x2e\x26\x5e\xef\xbe\xae" - "\x65\xf5\x01\x86\x7d\x8c\xe7\x95\x1d\xa0\x8f\x9a\x5f\x5c\xb5\xee" - "\x40\x17\xb5\x63\x9c\x2f\x2c\x11\x21\x86\x73\x82\x5c\x57\xca\xf6" - "\xee\xb2\xda\x72\xd5\x39\x65\xd9\xd6\xc1\x7d\x22\xad\x1d\xee\xb3" - "\x0c\xcf\x95\xe1\xce\x83\x7d\xab\xb5\x49\xa7\xb5\xe2\x2f\xd7\x8a" - "\x96\xd5\x7b\x88\xfb\x87\xf3\xe3\x39\xc7\xdd\x8b\xbc\xa7\xa2\xfb" - "\x85\xf3\xe0\xdd\x4b\x80\x7b\xdb\xd0\x5e\x27\xef\xc1\x0d\xe5\xa9" - "\x7f\x93\xcf\x43\xec\x6c\xdb\x05\x1a\xa9\x35\xe3\xaa\x73\x8c\x2b" - "\x46\x91\xcf\x5d\xf6\x69\x7c\x3f\x46\xc8\x00\xf0\xfd\xc6\x0e\xb9" - "\xe7\xe3\xfa\x7c\x61\x30\x2c\x94\x5c\xab\xae\x0b\x43\x1e\x78\x70" - "\x65\x99\x20\xe5\xca\x34\xf6\x1d\xa9\x7e\xc3\x9c\xa0\xfa\x97\xdb" - "\xc2\xba\x4f\xbc\x3e\x8e\xd8\x8f\xb2\x30\xae\x7a\x1f\xf3\x37\xcd" - "\xc2\xbc\xa7\x38\x01\xf4\x1e\xb0\x92\xe2\x3f\xe1\x02\x5c\xcd\x3f" - "\x3e\xed\x88\x36\x2f\x1e\xe9\x4b\x9e\xbc\x59\xbc\x60\x25\xdd\x9f" - "\x14\xe3\xb7\x32\x57\xf9\xe8\x5a\x59\x56\x35\x1a\xd4\xd8\x61\x1c" - "\xb5\xb2\x9d\x6a\x1f\xbf\x3a\x07\xe5\x3b\xe3\xb6\x37\x11\xf2\xc7" - "\x09\x71\x8d\xf6\xf0\xfc\x29\x20\xb3\x30\x2f\x8c\x74\xfb\xfa\xb5" - "\x6f\xc7\xd5\x8c\x83\xce\x3c\x92\xcf\x26\xe8\xb8\x5d\xda\xde\x51" - "\xb5\x47\xd9\x29\x35\x36\x7d\xed\x45\x58\x40\x63\xa7\x59\xf0\x19" - "\x1e\xf6\x35\xf7\x25\xbf\xd2\xe9\x4d\x6e\xd0\xbe\x2b\x54\x33\x17" - "\x3a\xaf\x94\xbb\xb9\x01\xaa\xe4\x76\xf1\xde\x20\x6c\xa0\x91\xdc" - "\x66\xc0\x29\xf2\xd0\xf2\x36\x35\xaf\x2b\xd8\xc3\xae\x7d\xe8\x6d" - "\x43\x9b\x64\xdb\xd0\x46\xd9\x36\xed\x9b\x2b\xa8\x4b\x9e\xdd\xbd" - "\xb4\xf6\xd4\x68\xfa\xfe\x2b\x9d\xfc\x5d\xc8\x13\x54\xbb\x41\xfa" - "\x5b\xa3\x4f\xd4\xfa\xfa\xab\x33\xc5\xe8\x57\x46\x5f\x1a\xcc\x57" - "\x8d\x0a\x66\x03\xfd\x88\xe3\xb3\x69\xdf\x6d\x02\xec\x42\xc8\x74" - "\x79\x5e\xb1\x0f\xf5\xf1\x37\xef\x86\xe4\xd0\xab\x3d\xdc\x57\xd3" - "\xf6\x51\x96\xe2\xc3\x57\x3f\x6b\x50\xdf\xdc\x81\x6e\xf0\xea\x76" - "\xf0\xbd\xfa\x66\xcd\xa0\xef\x71\x82\xf4\x3d\x8e\x94\xb1\x97\x88" - "\xa3\x94\x77\x22\x65\x0b\xf4\x8e\x57\xcb\x79\x3f\x9d\xf1\x5d\x1b" - "\xd4\xe5\xdf\xab\xe5\xfa\xde\x92\xdc\x4f\x5e\x07\x5e\xa9\x50\x67" - "\x17\xfd\xce\xda\x89\xba\xae\x22\xbf\xd3\xe3\x14\x87\x39\xdf\xa2" - "\x75\x67\xe4\x7e\x73\x95\x3c\xa7\x7b\x52\x3b\xe3\x52\x7b\x93\xb6" - "\x36\x91\xce\x7e\xdf\x28\x0b\xfd\xef\x80\xf4\xe3\x67\x1a\x70\xdd" - "\x12\x77\xf9\xad\x9c\xda\xb2\xa1\xfd\x84\x57\x17\xcb\x74\xe9\x0b" - "\x59\xbb\x5d\xe7\x11\xb4\x77\xa4\x8a\x97\x57\x73\xee\x50\x06\x49" - "\x1e\xe8\x13\xd6\xd1\xd7\xd7\x33\x4f\xd6\x1e\x88\xa4\xd3\xa2\x60" - "\xd8\xa1\x64\xd0\xab\xf5\x42\x8e\xf5\x57\xeb\xbf\x5e\xaf\xf8\xd1" - "\x65\xba\x4e\xa2\xe8\x6c\x81\x7c\x79\xfd\x88\xa4\xb5\x2b\xb5\x99" - "\x63\x19\xbc\x50\xc1\xf1\x58\x7e\xf4\x47\x8e\x75\x13\x74\xa5\x76" - "\x85\xf8\x3c\xd4\x72\xf6\x49\x49\xed\x39\x51\x42\x86\xdc\x12\xde" - "\x43\xc9\xcf\x63\x5b\x4d\x38\xa0\x13\xa4\x40\x4f\xc1\x38\xdf\xb0" - "\x82\xcc\x8f\x15\x01\xb6\x23\x3d\x95\x63\xd1\x70\x1c\x1a\x8e\x27" - "\x15\x72\xa4\xa7\xe0\x7e\x3c\xf4\x3a\x0b\x7f\x1b\x9e\xfd\x2d\x42" - "\x4e\x01\x79\x7c\x94\xe3\xe1\x18\xdc\xde\x00\x6d\x38\x45\x26\x8e" - "\x75\x13\xac\xce\xb7\x77\xf8\x3e\x93\x76\xca\x98\x12\xe8\xe6\x61" - "\x9a\x08\x9a\x5b\xc3\xc9\xf9\x79\x98\xe3\x0b\x54\xbb\xcf\x08\xd5" - "\x6e\x85\x37\xe3\xaf\x64\xdc\xf8\x9e\x0a\x89\xfb\xeb\xcf\x06\x01" - "\x3f\xec\xba\xaa\x3b\xe4\xba\xca\xa3\xce\x51\xb5\x51\x45\x99\xe8" - "\x71\x43\x47\x66\x9f\x3f\x3e\x53\xc6\xfe\x1c\xdc\x46\x6e\x1f\xd7" - "\xfd\xa7\xb3\xa7\x64\xec\x9e\x20\x9e\x1d\xc5\x5a\x99\x5e\x94\xe9" - "\x6d\xa3\x7e\xd7\x55\xb2\xed\x1d\x3e\x55\x36\x57\xde\x73\xf9\x08" - "\x3a\x68\x6d\x1e\xa4\x03\xda\xce\xed\xe3\xf6\x07\x99\x26\xa0\x81" - "\xd6\x56\xeb\x80\xd6\x4e\x6e\xe3\xbf\x61\xd6\x79\x13\xed\x44\x5b" - "\x65\x3b\x07\xd0\xce\xc3\x45\x44\x81\x9a\x57\x3c\x5f\xa5\x5c\xe5" - "\x61\x5b\xd3\xf1\x09\xf4\xe9\x72\x17\xc1\xa6\x34\xbe\x5b\xe1\x32" - "\xbc\x0c\xdd\xa4\xc2\x0b\xdb\xd2\x2b\x7a\x58\xef\x77\x97\xe0\x17" - "\xac\x97\xdf\xdc\x94\x7a\x32\x7f\x33\xf1\x39\xb4\x29\xfc\x39\x55" - "\xf4\x88\x1e\xe8\xa8\x01\x77\x10\x79\x8a\xd0\x7e\xd8\xa2\x27\x34" - "\xfc\x39\xef\x86\x2f\x55\xbb\xcc\xc5\x94\xfa\xe1\x23\xdb\x0c\xee" - "\xae\x6d\xa4\xb7\xe5\x71\xe4\x43\x7b\xac\x80\x25\xe3\xc6\x85\xd1" - "\xce\x5d\xc0\x33\x10\xd1\xa6\xf6\xde\x00\x60\xfe\x85\x46\x2f\xa6" - "\x84\x37\x4f\xa3\x1d\xa7\xc9\xea\xaa\x80\xfe\xf5\x20\xeb\x8d\xaf" - "\xbd\xfd\xad\x1c\x4a\xf3\xd0\x8f\xd4\xf7\x2a\x06\xbf\x6b\xfe\x7a" - "\xbb\x1e\x3f\x23\xcc\xf1\x87\x92\xf3\xcb\x99\x8f\x64\x2c\x0d\x9e" - "\x33\xfc\xe0\x19\xf6\xc5\x58\x8b\x3a\xfc\xe9\xe3\x25\x3e\x4e\x15" - "\x7f\x03\xcf\xfc\x1d\x95\x54\x5e\x5f\x40\x39\xbb\x00\xcd\x18\x3e" - "\xf4\xb9\x02\xbe\x32\x0d\xe3\x9e\x4f\x78\x8f\x66\xa2\x8e\x5a\xb6" - "\xa3\xf7\x57\x78\x0d\x5b\xde\xa3\x8c\x4b\x93\x29\xaf\x07\x87\x93" - "\xdf\xbc\xae\xcf\xf0\xd0\xb6\x94\x93\x54\x77\x2c\x7a\x8c\xd9\xa4" - "\x2c\x53\x72\xb0\x6e\x2f\xaf\xa5\x5f\x5a\xbd\x75\x2a\x6e\x8f\x53" - "\x6c\xbb\xc4\x72\xfb\x74\x3c\x70\x5f\x34\x1c\xee\x97\x4e\x87\x37" - "\x8c\xc3\xc1\xda\xf1\x9a\x8c\xa5\xe4\xd8\xf9\x1a\xe4\x05\x74\x85" - "\x43\x56\x8e\x6b\x8b\xb9\x73\x8f\x8f\x4a\x77\x93\xc9\x71\x8a\xd7" - "\x77\x16\xd0\xa1\xfa\x4c\x6a\x80\x7d\x2f\xfa\xd2\x53\x5e\x3d\xcb" - "\x7b\xea\x4a\x86\xb0\x4e\xda\xe1\x43\x99\xd2\x74\x4b\xd5\x6b\xba" - "\x0e\xff\x46\x7b\xf9\x39\x32\xa8\xef\x06\xbc\xd1\x96\x6d\x13\xc1" - "\x5a\x43\xb8\xa8\x9e\x63\xcb\xa4\x6c\xe1\x58\xbd\x45\x7a\xac\x15" - "\xa9\xfb\xd8\x31\xe6\xfa\xac\xa3\x77\xac\xa6\x0c\x8e\x0b\x65\xf6" - "\x2a\x5d\x4e\xcd\xd7\x6f\xb0\x8c\xb5\x68\xfb\xc8\x16\x15\x7f\xa5" - "\x2e\xbb\xf1\x2c\xea\x92\xef\xdf\x9c\x1a\x82\x2d\x23\xe1\xae\xa6" - "\xb4\xfa\xb3\x94\xce\x7a\x50\xee\xe7\x4a\x67\x63\xfb\x70\x41\xaf" - "\x59\x84\xfe\x77\x3a\xed\x3e\x39\x14\x37\xca\x5b\xca\xb1\xa6\x84" - "\x75\xb8\x33\xa2\x55\xe3\xa5\xcf\x88\x8c\x01\xa0\xbe\x2b\x45\x54" - "\x5b\x43\x46\xfe\x8e\x22\xaf\xd5\xf1\x3a\x2f\x9f\x15\x51\x73\xc8" - "\x9b\xf5\x7a\x5c\x9d\xf8\xb2\xfc\xc5\xa6\xe9\x52\xc7\x7a\xb1\xe9" - "\xd2\xfa\xed\xcd\x83\xc3\xda\x2a\x80\xc9\x7c\xf0\x5f\x83\xbb\x2b" - "\xf5\x22\x7a\x8d\x31\xec\x52\xb6\x59\x78\x24\x6c\x46\xaf\xbf\xa5" - "\x65\x0d\xcf\x6f\xbb\x5c\x7c\x96\x66\xc8\x1e\xdb\xf5\x1c\xbf\xe3" - "\x34\xf6\xf5\xce\x92\xfd\xbe\xab\x99\x6d\x34\xcd\xce\xfd\xd0\x36" - "\x98\xa6\xf4\x2d\x9e\x77\x99\x5e\x8d\x6a\xfd\x7a\x8c\xdf\xb9\xeb" - "\x88\x3e\xf7\xb2\x0e\xa2\xbe\x37\xb9\xab\xc7\x63\x38\x74\x81\x2f" - "\x4e\xec\x7a\xbe\xf4\xe9\xe2\xb8\x3e\xce\x7a\xab\x3e\x17\xcb\xef" - "\x09\x6c\x9a\x70\x4f\xe9\x3a\x9a\xf8\xd0\x95\xbc\xa7\x2d\xcf\x44" - "\xf4\x28\x1d\xa1\x3e\x6b\x68\x6f\x2c\x4b\xf2\x86\xfc\x56\x18\xdb" - "\x43\x06\xe8\x0b\x2a\x9e\x55\xaf\xd2\x15\xf4\xf3\xb0\xf5\x8f\x45" - "\xd4\x53\x39\x38\xe7\xa3\x0e\xf6\x6d\x60\xf8\x4a\x8f\xaa\x9f\xc1" - "\x75\xb0\x1d\xa8\x74\x81\xfa\x19\x17\xa1\x6f\x3a\xd3\x37\xac\xd9" - "\xbe\xee\xde\xbf\x29\xfa\xda\x29\x71\x7a\x2d\x59\x3f\xac\xf0\x18" - "\x31\xc7\x24\xd8\x56\x93\x19\xf5\x7f\xc2\xef\x79\x5c\xb6\x4c\xe3" - "\x35\xc8\xdd\x53\xdd\xac\x63\x0c\xe4\x24\x2d\xe4\xf5\x09\x69\x37" - "\xec\x9e\x38\x15\xe5\x90\x96\xf2\xfb\xd3\x01\x63\xd5\x7a\xca\xe0" - "\x6f\xf2\x21\x5d\xfa\x20\x78\xaf\x78\xc6\x7f\x7d\x2a\x59\xaf\xaf" - "\x65\x7f\xf7\xdd\xd9\xb0\x85\x5d\x72\xad\x8b\xeb\xaf\x69\xc8\xe4" - "\x58\x5e\xef\xf7\x7b\x46\xa8\xbe\xda\x7d\x0c\xcf\xe9\x11\xcf\x1b" - "\xf4\x3d\x04\x0f\xed\xf6\xc8\x7d\x48\xf6\xe9\x95\xfe\xae\x5b\xeb" - "\x86\x7c\x65\x76\x1f\xd3\x70\x39\x76\xa8\x84\x68\x37\x9f\x63\x18" - "\x2f\x3a\x51\x1f\xf4\x9f\x5d\x3e\x6d\x0d\xa9\x53\xf2\x15\xeb\xe6" - "\x5b\xd9\x5e\xfc\x5b\xcb\x0e\xe4\xe3\x39\x2d\xd7\x4e\x59\xca\xde" - "\xd8\xba\x3f\x0c\xfe\x19\x6a\xff\xee\x05\xbc\xc6\x19\x57\x7e\xbf" - "\x49\x24\xcb\x54\x6f\xe9\x92\xfe\x55\xd5\x4d\x2e\x5c\x4d\x18\x0b" - "\x7b\x71\x4d\x02\xcf\xf1\xd5\x82\x6b\x13\xae\xa9\xd0\x73\x4b\x98" - "\x2f\x61\x6f\x5b\x61\xd3\x98\xfa\x92\xb7\x74\x0e\x77\x16\x8f\x69" - "\xe3\xde\xfc\x30\x29\x7f\xd1\x86\xd6\x76\x2f\x74\x49\x90\xb3\x34" - "\x28\xfa\x6d\xd7\xf0\x99\x97\x86\x56\xc7\x6e\xf6\xf7\x68\xa8\x8b" - "\xf6\xf7\x68\x68\xc6\x2f\x00\x0e\x9f\x8f\x1f\xf4\xc8\x86\xd6\xa1" - "\x5f\x63\xb3\xdf\xd9\xd0\x0a\x3a\x06\xa5\xae\x79\x49\xe3\xb5\x41" - "\x7e\x23\xae\x8a\x6d\xb8\xe4\xc2\x26\xd5\xde\xdd\x1e\x3c\x9b\x44" - "\x72\x83\x4d\x6b\x6f\x33\x9e\x2d\x36\x07\xe6\xe0\x64\xd0\x64\x02" - "\xda\x9c\xdc\xe4\xe2\xf6\x32\xbe\x7d\xc9\x2f\xee\x8d\x3c\x87\xc8" - "\x30\xb9\xfd\xde\x64\x94\x03\x2d\xc5\xb4\x5b\xf3\x74\x7a\x6a\x74" - "\xe2\xfd\x2a\x43\x1f\x60\x28\x9d\x0d\xf9\x01\x43\xcf\x3f\x48\xfb" - "\x09\x1c\x1f\x1f\x7d\x8a\x7c\xb0\xdf\x4d\xfa\x19\x47\xbf\xb3\x71" - "\xff\x47\xc5\x6a\x2f\x83\xcb\xfa\x22\xca\xf2\xd9\xf8\xa8\xf2\xc9" - "\x11\x7d\x37\x01\x6d\x49\xce\x77\xa9\xbe\xdb\xe2\xd1\x70\x49\x55" - "\xb8\x6c\x85\xdd\xda\xf0\xb1\xc2\xa7\x71\xcf\x70\x63\xac\x62\x12" - "\x74\x54\x48\xe4\xe9\xca\x76\x9d\xe5\x9e\xe8\x23\x77\x7d\x18\x7a" - "\xcb\xd6\xce\xac\x0a\xd1\x72\x82\x9a\x36\x74\x04\x7a\x2e\x71\x4e" - "\x6f\x92\x71\xaa\x44\x7f\x25\xb9\xcb\x6f\x96\xb6\xe4\x69\x7a\xeb" - "\x5d\xb7\x57\xc6\x7a\xe6\x7b\xe9\xc3\xcb\xbe\x18\x3c\xbf\x71\xec" - "\x33\x7d\x9d\x20\x8c\xbc\x0d\x9c\x8e\x34\xb7\xcf\x2b\x63\xac\x0d" - "\xf9\x52\x6f\x69\x56\x63\xed\xad\x42\x79\x7e\x9b\xf1\x0d\x7e\xbf" - "\x85\x71\x0e\xbb\xb6\x34\x73\x1b\x1c\xb0\x61\xdd\x41\x7f\x0b\x8f" - "\x15\xdb\x1a\x5e\xf7\x7c\xeb\x6e\xf0\xa3\x08\x57\x6f\x69\xbe\xb4" - "\x36\xbc\x25\x63\x04\x3b\x82\xe2\xb4\x37\x79\x0b\xdb\x0e\x86\xaa" - "\x8a\x11\xa6\x39\xf5\xa2\xa5\x2f\x65\x2b\xc6\xeb\x5b\x05\x1f\xd9" - "\x55\x9f\x5d\x22\xdc\x02\xbd\xed\x0d\x5a\xdb\x41\x2f\xc9\xb3\xd3" - "\xeb\x54\x4c\x39\xe4\xa9\x1f\x7e\x2e\xdb\xba\x9f\xe7\x32\xf6\xf3" - "\xd4\x68\xd1\x3b\x38\x67\x5c\x1a\x1e\xc3\xc7\xc6\x1e\xaa\x63\x40" - "\xd5\xf1\xe3\xc5\xff\xb5\x3a\x7e\xbc\xf8\x62\x75\x40\x66\x5c\x7d" - "\x92\x7e\x7c\xf4\xd2\xed\xdf\x1f\x4b\xfb\x17\x72\xb5\x59\xc9\xd2" - "\x3d\x0b\x42\xb0\x41\x83\x96\xdd\x1e\xf9\x3d\x19\x03\x55\xba\x3d" - "\x41\x0a\xba\x0a\x9b\xda\xed\xfd\xd4\xb2\xe6\xcf\xd4\x4d\x3f\x91" - "\xf1\x5f\xdb\xcb\xd8\xee\x6c\xb0\x0d\xd4\xbc\x68\x1b\x30\xfc\x38" - "\x83\xe9\xbd\x9b\xe3\xf7\x45\xf0\x59\x87\xef\xcf\xe4\xce\xe3\xb5" - "\xe2\x4e\x5e\xa3\x87\x8c\xd8\xed\x09\x43\x66\xc0\xce\x08\x49\x7a" - "\x40\x07\x53\x36\xe3\x2b\x87\xa5\xcd\xe8\x95\xe7\xf2\x2e\x87\xee" - "\x9e\x24\x9c\xcb\x37\xf3\x3a\x7e\x68\x20\xc7\xe6\x77\xd2\x62\x8e" - "\xa5\xc7\x6b\xe8\xc2\x92\x56\xb6\x28\x98\x28\xa4\x4d\x08\xfb\x85" - "\x63\xea\xb9\x7d\x1e\x0a\xc1\x16\xa8\x3f\x4f\xa9\xf5\xd0\x9f\x21" - "\xcb\x2d\x2c\xef\x1b\xb5\x98\x7a\x3b\xce\x0f\xc5\xd4\x6b\xe0\xf5" - "\xaa\x2e\xdc\x9f\x27\x63\xa8\xfa\x95\xc3\xbb\xce\x53\xda\xee\x35" - "\x94\xbe\x8b\xd7\x23\xbf\x50\xfa\x1b\xeb\x1b\x32\xbe\xde\xaa\x74" - "\xde\x9b\x18\xd2\xdf\xd6\x72\xdc\xcf\x41\x79\x66\x94\xeb\x38\x97" - "\x44\xef\x3d\xf2\x1b\x01\x41\xd7\x96\xae\xa0\xa5\xc9\x05\xda\xed" - "\xf5\xd0\x4f\xe6\x0f\x18\xde\x8a\x1b\xd7\x41\xf7\xb5\xaa\x8d\x88" - "\x89\xf8\x51\x9a\x92\xfb\x80\x35\x7c\x5c\xb6\x5d\x39\x34\xbd\x97" - "\x32\x95\xff\xc4\x65\x98\x2b\xf7\xf8\x78\x3f\xbf\xe2\x59\xb2\x86" - "\x76\x2d\x4b\x70\xbc\x45\x89\xfc\xfd\x62\xfe\x55\x7c\x29\x7a\xa6" - "\x17\x53\x26\xef\xa5\xb0\x8f\x85\xed\x05\x99\xff\xe3\xb4\x72\xca" - "\x8c\x84\x3d\x57\x39\x3f\xdd\x61\x9b\xb7\xf2\xc9\x55\xcf\x96\xe4" - "\x97\xad\x78\x62\x45\xf1\x8a\xb2\x75\x77\xc8\x60\xc2\xf2\xdf\x7d" - "\x93\x0b\x96\xc8\x4d\xf0\x08\xbd\x23\x6d\x68\x4d\xf1\xed\x0d\x21" - "\x5e\x03\xb9\x24\x7a\xbd\x3d\x57\xdb\x57\xf4\xee\x96\xfb\x6c\x6f" - "\xbb\x3c\x86\x3f\xa8\xf5\x36\xe8\xa2\x3b\x54\x3c\x94\x9e\x96\xeb" - "\x42\x0c\x7f\xae\xe2\xe5\x86\x12\xf0\xf2\xac\xe3\xb4\x77\x19\xef" - "\xef\xa0\xbf\xf6\xba\xcb\x4f\x12\x74\x94\x59\xbc\x6f\xd4\xce\x6b" - "\x32\x52\x87\xff\xa9\x3a\xc3\x70\x5a\xc6\x06\xda\x73\x1c\xcf\xec" - "\xab\x1e\x16\x39\xbb\x42\xab\xac\x7b\xc2\xab\xac\x3f\x15\x22\xe7" - "\xcd\xf0\x99\xa2\x5d\xe2\x4c\xd1\x9b\x43\xe7\xfa\x7f\x3a\x2e\xe8" - "\xa4\x44\xfc\xc0\x0b\xe3\xd3\x23\xf6\x10\xf9\xdd\xed\x0c\xb3\x64" - "\x35\xfb\x72\xfd\x94\xfd\xa3\x61\xfb\x8f\xff\x8e\xd7\x51\x94\x38" - "\xbf\x1b\x3c\xaf\xea\x2d\x74\x6f\x3e\x41\x6a\xdf\xf8\xa7\x05\x2d" - "\x72\x9d\xfb\xa7\x21\x2e\xc7\xfb\x8c\xac\xf7\xcb\xf8\xa1\x86\xb7" - "\xa5\x2f\x1f\xeb\xfc\xbb\x53\xc8\xe2\x4a\xa1\x24\xbf\xf3\xa7\x83" - "\xfe\x5f\xc2\xa2\xe6\x56\x9e\xdf\x38\xde\x2d\x64\x8c\x9f\xe7\x4a" - "\xc6\x83\xf9\x12\x30\x0f\xf2\x1e\xa4\x3a\xf7\xf3\xd3\xc3\xd0\x23" - "\xf7\x5e\xba\x8c\xfd\xa9\x5c\x93\x17\x06\x87\x98\xbe\x9d\xf2\xe4" - "\xfe\xb0\xf2\x53\x34\x62\x1c\x16\xa9\xf6\xec\xbd\x55\xee\xed\xaf" - "\x39\xd5\x84\x71\x52\xd9\xd8\x4f\x49\x61\x57\x5a\x31\xeb\x33\xed" - "\xe5\x72\x5f\xdd\x84\x72\xfb\x79\xdf\x5d\x9e\x95\x93\xf1\x93\xff" - "\x4c\x8d\xe7\xc8\xd8\x4d\x3f\xcb\xe6\xfd\x81\x21\xda\xfe\xec\x0d" - "\xde\x17\x12\x35\x63\x9b\xcc\xe5\x86\x6d\x0c\x23\x7c\xfe\xf4\x4c" - "\xbd\x1c\xe6\xf0\x51\x5c\xee\x38\xfd\x6c\x83\x2c\xc7\x79\xe5\xb7" - "\xf7\x2c\xcb\x30\x6f\x75\x71\xfe\x20\x9e\x1b\xc2\x96\xc5\x02\xe3" - "\x2b\xb4\x26\xb4\x1f\xef\x96\x84\x5d\x2f\xee\x45\x5a\x8e\x5c\x97" - "\x1e\xb0\x92\x8c\xd1\x61\xc9\xaf\x73\x7b\xfe\xd6\x22\xf1\x61\x7f" - "\xd5\x32\xc8\x22\xa9\xff\xfd\xec\x93\x86\x2f\x64\x5c\x67\xf4\xe1" - "\xde\x02\x8d\x47\xf6\x2a\xfc\xf6\x16\xf6\xd5\x5c\xe5\xe9\xb3\x6c" - "\xdd\xeb\x33\x98\xe8\x90\x95\xfd\xe2\x1b\x4a\x0e\x59\xfb\x61\x43" - "\xec\xcd\xf0\x18\xc7\x5a\x94\xee\xa1\xca\xf1\xbe\x14\xf4\xd2\xde" - "\x44\xeb\x98\x01\xbc\x9f\xaf\xfb\x77\xf0\xf7\xaa\x79\x5f\xca\x43" - "\x3f\x4b\x63\xba\x81\xcf\xdb\xe4\xde\xc4\xa6\x47\x7b\xd0\x9e\x91" - "\xec\x83\xc7\x74\xe6\xf3\x07\x66\xdc\x8b\x35\x62\xa6\x39\x98\x65" - "\x68\x94\x67\x0d\xe5\x19\xf6\x19\x5a\x9c\x91\x4c\x2d\xee\x48\x06" - "\x3f\xab\x33\xf0\x7b\x0f\xe8\x67\xce\x39\xb6\x8a\x76\x5e\x4c\xfa" - "\xf5\xc9\x98\x23\x67\xd5\xde\x2e\xfb\xf5\xf1\x9a\x26\xfb\xc9\xf3" - "\xfe\x2b\xca\xf5\x46\xf8\xc6\x27\xe0\x39\xa8\xc7\x1a\xf1\x3b\xdf" - "\x31\x0d\xfa\x0b\xa1\xed\x7d\xae\xad\x4d\x3e\x4b\x43\x89\xcf\xb5" - "\x05\xf3\xf7\x3b\x69\x90\x45\xc5\x17\xb1\x9d\x8c\x7c\xf6\x90\xe3" - "\x4b\x84\x53\xd2\x6a\x39\xc6\x04\xc7\xb2\x52\xfe\xed\xef\x6c\xd1" - "\xce\x74\x27\x9e\xa6\x77\xee\x1e\xda\x07\x0d\x69\x6b\x77\xef\xec" - "\x53\x7a\xd7\x3b\xfb\xe4\xda\x5d\xcd\xd6\xca\x9f\xac\x0f\x18\xf6" - "\xaf\xf7\x18\x1a\xe4\xf9\xae\x77\x40\xbb\xf7\x8b\x75\x1f\x19\xe4" - "\xcb\x63\x58\xf1\xe7\xc9\x29\x8b\x15\xcc\x9f\xcb\x18\xa5\x43\xf6" - "\xcd\xcf\xd5\x77\x8f\x36\x4d\xc8\x0b\xf3\x9c\x97\x52\xb8\x5f\xfa" - "\x96\x94\x9c\xe5\x35\xbc\x91\xca\xd6\x52\x79\x34\xbf\xcc\xb1\x27" - "\xa3\x9f\x53\xf8\x59\xd1\xec\xe7\x99\xfa\x7e\xc0\x4e\x43\xd8\x63" - "\x4e\x20\xe1\x68\x12\x3e\x8e\x61\x06\x7d\xca\xeb\xc6\x1c\x8a\x3a" - "\x04\xe4\xc3\x28\x94\x29\x64\xda\xab\x31\xf4\x73\xf9\x7d\x8f\xb0" - "\xf3\x2e\xe1\x60\x3d\xd2\xcb\xbe\x2d\x67\x09\xf9\x92\x91\xaf\xba" - "\xb5\xbc\x97\x7d\x67\xf2\x38\x36\x58\xb7\x56\xb7\x37\x79\xca\xe2" - "\xeb\x93\x28\x0f\x75\xee\xf1\x50\x79\xf9\xa5\x8f\xed\x9f\x0f\xab" - "\xcb\x0e\xb5\xeb\x17\xa9\x43\x7d\xf2\x57\xad\x4f\x7e\x91\xfa\x75" - "\x7b\xc8\x9a\x4e\x32\xee\x24\xbd\x3b\x82\xed\x66\xdc\x5f\x7b\x92" - "\xf6\xc9\x3d\x4a\xe5\x8b\xbc\xef\x8f\xda\x3d\xea\xd8\xf7\x4b\xed" - "\xfe\x2a\xdc\xbf\xa1\xdd\x4f\xc0\xfd\x46\xed\x1e\xf4\xde\xb7\x42" - "\xbb\x4f\xc5\xfd\x03\xda\x3d\xc6\xe7\xbe\xdb\xb5\xfb\xf1\xb8\x9f" - "\xa4\xdd\x5f\x89\xfb\xcb\xb4\xbd\x37\x13\xf0\x3d\x77\xe9\x7a\xd1" - "\x2f\x5a\xd4\xfe\x0e\xef\xab\xbd\x9d\xa1\xc6\xf4\x60\x5a\x2a\xec" - "\xcb\x25\xfa\xfa\x3a\xd2\x59\x97\x36\x21\x3d\x03\xfc\x97\x19\x91" - "\xbe\x57\xcb\x9f\x0d\x3d\xcb\x15\x91\x5e\xaf\xa5\x2f\x43\xfe\xe6" - "\x88\x74\x97\x96\x5e\xe6\xa1\xda\xa3\x11\xe9\x9b\xb5\xf4\xed\xfa" - "\x9e\xb6\x96\x6e\xd7\xd2\xd1\xff\xdb\x37\x47\xa4\x6b\xf1\x04\xf7" - "\x1d\x44\x1f\x77\x47\xa4\xe7\x49\x9e\x95\x71\xe1\xcc\xe2\x50\xf9" - "\x0c\x8c\xf9\x7d\x1e\x0f\xd5\x94\x47\xe4\x59\xa2\x95\x0d\x78\xa8" - "\x7a\x4f\x44\xfa\x5c\x95\xfe\xae\xc5\x43\x9f\xee\x8d\x48\x9f\x35" - "\x1c\x0f\x25\xd4\x51\xdc\xf5\x55\x5e\xdf\xe2\xef\x7b\x48\xbf\x38" - "\xe9\x13\xf9\xde\x02\x3e\x23\x63\xde\x2d\x8e\xdb\x2a\x84\x38\x4e" - "\xef\xcd\xd0\x7c\xc5\x96\xb1\x7f\x10\x9f\x29\xea\xa6\xf7\xae\x96" - "\xe7\x4f\x38\x2e\x1a\x9f\x33\x5a\xcf\xe7\x8c\xde\x95\x71\x5e\xa7" - "\xdb\x2b\x55\xcc\x34\xe5\x6f\xd8\x2b\x6d\x25\x6d\x2f\x0c\x79\xf8" - "\xfb\xa1\xfc\x4d\xc6\x5e\x5e\x67\x71\x97\xf5\x4b\xbf\x38\xd6\x55" - "\x39\x8d\x6d\x06\x79\x26\x25\x42\x67\x55\xe3\xf1\xbd\x05\x61\x3e" - "\x0f\xec\x54\x76\x55\x95\x8a\xc5\xd7\xcb\x7e\x1c\x91\x79\x3d\xf4" - "\xde\x7c\xbe\x26\x5a\xcd\xc7\xfc\xce\xf7\x32\x86\xce\x55\xbc\xbb" - "\x59\x4b\xf7\x20\x3d\x3b\x22\xfd\x82\xd8\xbe\x43\xf2\x69\x6c\xb3" - "\xb0\x8c\xed\x19\x38\x2f\x7c\xc1\xf3\x22\xb0\xf3\x3f\x80\xf7\x72" - "\x79\xde\xe0\x9a\x90\x6b\x6c\x40\x3b\x5b\x7f\x2c\xb8\x46\x78\xa1" - "\xa7\x71\xac\xee\x6f\x2d\x84\x5d\xb7\xb0\xc4\x2f\x76\x3c\xc1\x7e" - "\x5d\xe7\x64\x9c\x19\x47\x2f\xc7\x05\x65\x3f\x1f\x1f\xef\x21\x24" - "\x75\x40\xf6\x34\x2c\xe7\xf7\x9f\xd1\x82\x22\xe8\x3f\x45\x21\x6a" - "\x00\xec\xdd\x4f\xe8\x3e\x45\xef\x75\x0f\xfa\xce\x01\x07\xae\xcf" - "\x21\x63\xed\xbf\x2f\xf5\x7c\xfe\x86\x90\xa8\x6e\x6a\x12\x7f\x60" - "\xbd\x62\x0b\x7f\x3b\xca\x06\x99\x6b\xc3\xfd\x7e\xf5\xc3\x3b\xa4" - "\x0f\xd7\x26\x35\x4e\xdf\x57\xdf\xf5\x74\xa5\x16\x29\x59\xf0\xfe" - "\x32\xf1\x63\x3e\x6f\xf1\x7e\x1e\x64\x89\x1d\x3a\x8c\x3d\x5e\xf9" - "\x0d\xbb\xc9\x30\x50\x83\x39\xe3\x74\xb3\x41\xc9\x9e\xfd\xf3\xc3" - "\x06\xd3\x46\x5e\xcf\x91\xf1\xb6\x6b\xd2\xf6\xec\x5b\x19\x30\xb4" - "\xaf\xef\xa6\x17\xae\x24\xeb\xb2\x00\xfb\x05\xbf\xdf\x3e\xa6\x8c" - "\x63\xbf\x6d\xad\x84\x3e\x60\xf8\x35\xde\xff\x7e\x65\xb3\x21\x28" - "\xe7\x91\xfd\xf3\xe5\x1a\x80\x2b\xad\x9c\xf7\x10\xdc\x5d\x21\xd6" - "\x65\x92\xa0\xcb\x14\x8b\xd2\x74\x53\x68\x6d\x51\x4a\xb0\xb4\xe8" - "\x5b\xbb\x57\x53\x52\xa8\x34\x3d\xf5\xd5\xf3\x34\x53\x8f\xe3\x0d" - "\x1b\x21\x53\xf8\xad\xa3\xab\xd6\x50\x06\xdb\x10\x63\x12\x2c\x72" - "\x5f\x86\xef\xc3\x86\xd7\x7b\x1a\xd6\x5c\xfc\x9b\x01\x21\xd8\x0e" - "\x1c\xef\x97\x71\x89\xd7\xd6\xed\x6f\xc2\x1e\xd1\xce\xe2\x55\x7c" - "\x4e\xe3\xa1\x7f\x18\xc6\x9c\x13\x2d\x27\x8b\xc9\xc0\xf1\xd6\x2b" - "\x0a\xa5\x9d\x3e\xa2\xbd\x28\x48\x6e\xfb\xa7\x54\xb1\x9a\xfb\x68" - "\xff\x5b\x3c\x7f\xb2\x9f\x1e\xf2\x5b\x4e\xd2\xfe\x5f\x9a\x03\x64" - "\xc0\x2f\xa1\xe5\x69\xd6\xb9\xf7\x7f\xcc\x7a\xbf\x87\x7e\x69\x62" - "\x5f\xe1\x96\xd5\xf7\x70\xda\x31\xc7\xe7\x72\x1f\x3d\x4f\x9d\xd7" - "\xdb\x7f\x90\x9f\x1d\x7c\x36\x30\xe5\x86\x6d\xef\xf5\x07\x46\x28" - "\x5b\x70\xff\x07\x9a\xec\x2f\x41\x9f\x4d\x04\xec\x61\xd7\x85\xc3" - "\x2e\x2b\xb7\xf3\x5a\x77\x7d\x90\x16\xfa\x84\x47\xee\x79\xf1\x99" - "\x68\xfb\x5d\x2d\xe2\xbc\x8b\xd4\x79\xa0\x5f\x6e\x0c\x57\x5b\x4d" - "\xec\x13\x80\x7b\x79\xae\x4d\xad\x29\x59\xad\x6a\x1d\xc6\x9a\xae" - "\xd6\x94\xac\x33\x37\x4d\x60\x7f\xd5\x5f\x56\xf6\x25\x5b\xe7\xe2" - "\xba\xa4\x2f\x65\xaa\x67\xf8\xb9\x66\xdc\x4c\xdb\x35\x94\xca\x6b" - "\x99\xec\x7b\xda\xa8\x7c\x4e\x51\xc7\xaf\x36\x8b\x6a\xf9\xee\xda" - "\xe3\x25\x94\xc8\xeb\x3f\xa8\xf7\x93\xe9\xf5\x64\x03\xae\x97\x0b" - "\xcb\x15\x3d\xd2\x0f\xc8\x75\x45\xc0\xdd\x2b\x5a\xd8\x0f\x4d\xad" - "\x39\xff\xca\x25\x92\xaf\xe8\x51\xf9\x7f\x35\xa9\xa3\x17\x6d\xb0" - "\x5c\xd1\xec\x0e\x9c\xd2\xe6\xea\x5f\x81\xf7\xaf\x68\x16\xae\x2b" - "\x0e\xab\x33\xb6\xbf\x7a\x4e\x97\xab\x8a\x47\x7f\x55\xa8\xe8\x36" - "\x6e\xa6\xa2\xdb\xaf\x5c\xda\xbc\x74\x2d\xdf\x43\x4f\xc8\x54\xfb" - "\xb9\xbf\x5a\xa6\xeb\x2e\x1e\x2d\x0f\x97\xc1\x7d\x96\x92\xb5\xbf" - "\x2a\x47\xdb\xb5\x7d\xe0\x5f\xd9\x38\x0d\xed\xc3\xdc\xf4\xcb\x66" - "\x6e\xd7\x70\xb2\x55\xd2\xa2\x9c\x12\x81\x33\x7f\x37\x94\x7d\x5f" - "\x7d\x6e\xdf\x5d\x2d\xea\x1b\x60\x07\xae\x94\x67\x10\x51\x0f\xfa" - "\xc7\xc0\x72\x93\x63\x1d\x30\xbc\x08\xfc\x43\x3a\x2e\x5c\x1f\xbf" - "\x43\x5b\x9b\xb9\x3f\x41\x2b\x8e\xc7\x40\xdc\xaf\xb0\xd7\x13\xd9" - "\xfe\x6e\x59\xc3\x3e\x25\x07\xd2\x99\x26\x8a\x66\x07\xe4\xbe\x4f" - "\xd5\x60\x3f\xfc\xfa\xab\x68\x7a\xa8\xe7\xb0\x05\xb2\x61\x35\xfb" - "\x16\x1c\x48\xd7\xe8\xd7\xab\xea\xff\xf5\x5f\x34\x1b\x0a\xef\x7e" - "\xbd\x23\xa2\xec\xd5\x83\x79\xd5\xf7\xe6\x0c\xbc\x4f\xc7\x6b\xa1" - "\x8a\x5f\x7f\xdd\x1c\x51\xae\x39\xf7\xcb\x2c\xe2\x78\xfc\xfc\x7d" - "\x30\xa6\xb9\xdf\xf9\xeb\xb6\x21\x7a\x2b\x38\x71\xea\xb8\x46\xaf" - "\xc3\x43\xbf\xde\xae\xe3\x89\xfb\x3c\xd5\x27\x07\x2c\x43\x7d\xf2" - "\xeb\x4c\xbd\x1c\xfb\x75\xa3\x8f\x8e\xf2\xd9\xaf\xb8\x72\x90\xd7" - "\xdc\x27\x42\x06\x07\xef\x6a\x91\xfc\x48\x07\xb6\xb1\xff\x24\xe8" - "\xaa\x7d\x0f\xea\x40\xb1\x9a\x0b\x0f\xc8\x33\xed\xbc\x9e\x7d\x28" - "\xc0\x3c\x72\xa0\x12\x70\xeb\x35\x9c\x6b\x35\x1c\x6a\x81\xc3\xf6" - "\x61\xcf\xcd\x0c\x9e\x5d\x3b\x70\x30\xe2\xbc\x5e\x99\xa2\xed\x6f" - "\xf8\xac\xec\x81\x9d\xca\x76\x68\xde\x89\xfe\x71\x9c\xa3\x09\x1c" - "\x53\xbf\xa2\x44\x9c\xec\x28\x81\x3d\x63\x49\x6b\x81\x6c\x68\xad" - "\x38\x47\xa3\x79\x0f\x9e\x65\x0b\xfb\xfa\x89\x64\xa4\x57\xa7\xb5" - "\x0e\x9d\x55\xfa\xad\x95\xcf\xfe\xed\xe0\x98\x49\xa7\x68\x82\xda" - "\x53\xff\xcd\xbd\x6c\x43\x0b\x07\xec\x66\x57\xda\x61\x3e\xbb\xd6" - "\x01\xad\x5c\x38\x8a\xde\x0c\x57\xa7\x1d\x06\xdc\x2e\xc7\xb3\x94" - "\xc2\x73\x19\xdb\xe2\x8a\x3f\x7e\x13\x00\xdc\x2e\x8e\xdb\x04\xdb" - "\x3b\x41\x58\x26\x4f\x0c\x5b\xa6\xcc\x67\xb8\x5c\x37\x78\xca\x70" - "\x9c\x7e\xf3\x23\x91\x3c\x79\x22\x7f\xdb\x8b\x6d\x6d\x77\x00\x78" - "\x56\x4f\x9e\x88\x77\x63\xf0\xee\x23\x5c\xc3\x1c\xc3\x89\x63\xd0" - "\x02\xbe\x95\xe1\x0b\xd7\xe4\x89\x0a\x77\xaf\xcc\x7b\x9c\x7e\x7b" - "\x25\xe7\xd1\x63\x43\x85\x1d\x39\x89\xfc\x9e\xdb\x10\x42\x39\xb7" - "\x1d\x78\xca\x32\x5d\xb2\x8c\x87\xdb\x87\x72\x9a\xdf\x86\x4d\xed" - "\xb9\xfd\xd6\xa2\xef\x1d\x79\xe8\x37\x05\x8c\x73\xfc\xf8\xa1\xbf" - "\x9d\x19\x1d\xcb\xe3\x9f\xf9\xac\x28\xa7\x2f\xd6\xe3\x6f\xe0\x1e" - "\xe3\xff\x80\x3a\x3f\x1f\x11\x4b\x67\x67\x44\x5c\x2e\x87\x57\xfc" - "\x27\xe3\x02\x3e\x4d\x04\xbd\xf7\x8a\xea\x29\xf3\xd5\x39\x8b\xdf" - "\xca\x31\x84\x36\xf1\x78\x34\xab\x73\xc1\xbf\xfd\x17\x8d\x1f\x73" - "\x16\x85\x82\x66\x0f\xea\xc4\xd8\xcd\x19\x7a\xfe\xed\x7e\xf0\xa7" - "\x05\xf9\xbe\x50\x71\xab\x7e\xbb\x37\x3a\xbf\x7c\x5f\x19\xf3\x9c" - "\x15\xf3\x6c\xf3\xa1\x6f\x86\xdb\x23\xdb\x31\x41\xae\x0b\x94\x8f" - "\xd9\x48\x25\x8e\x2f\x28\x11\x7d\xf5\x39\xe3\xd6\xd1\xd3\xcb\x6d" - "\x32\x0b\x67\x26\xb9\x7b\x82\x4a\x57\xc1\x1c\x71\x3c\x0d\x79\xbe" - "\xa0\xf1\xec\x73\xca\xb1\xc0\x91\xff\xa4\x8a\x5b\xda\x5c\xbd\xec" - "\xf9\xd1\x14\x7e\x2a\xe7\x5b\xc2\xf0\x4f\x73\x31\x1f\x98\xde\xed" - "\xf7\x8c\xe0\x75\xe9\x8a\x37\x68\x22\xc7\xbf\x00\x6f\x76\xf3\x77" - "\x62\xf8\xbb\xbd\x3f\xe9\xef\x19\xe1\x0e\x7e\x4a\x25\x4f\x93\xe1" - "\x24\x35\x6f\x36\x96\x93\xb1\xea\x04\x59\x16\x05\x45\xf0\x50\x70" - "\x26\xe9\xe7\x7a\xeb\x53\xd4\xf9\x48\xd8\xe5\xde\x52\xab\x08\xf8" - "\x9d\xff\x0c\xfd\xf7\xcd\x1c\xcd\x87\xc7\xb7\x5d\xc5\xfb\x36\xa2" - "\xfe\x05\x06\xed\x0c\xb3\xa2\x6d\xf3\xd5\xea\x9c\x46\xca\xb7\xfd" - "\xce\xe6\xd4\x21\x7d\xae\xb9\x49\xd1\x70\x4a\x89\x1a\x5f\xcd\x4d" - "\x87\x60\xf9\x6f\x56\x7b\x8d\xa9\xc8\x9b\x35\xb8\xd7\x28\xed\xd3" - "\x66\xe8\x4a\x53\x4a\x94\xae\x37\xa5\x24\x37\x64\xd2\xc6\x00\xa7" - "\x8f\x6d\xe6\xb2\x28\x67\xf6\x49\x5b\xb2\xb9\x7c\x88\xd7\x9a\xf9" - "\x7b\xe9\x09\x68\x53\x12\xfa\xb5\x99\xdb\xc5\x34\x41\x3e\x23\x9e" - "\x0f\x1e\xda\x33\x4c\xfc\x42\x4b\x6a\x51\xd0\x29\xf7\xcd\xec\xe0" - "\xa7\x53\xe8\x83\xb1\x1c\xaf\xc4\x8d\x7a\xda\x1b\xfa\xa9\xdd\xda" - "\x47\x1d\x05\x7c\xa6\x04\xfa\xf2\xd3\xff\x49\xdd\xb6\xf8\xf2\x0b" - "\x32\x10\xe3\x69\x6c\x80\x61\x41\x4e\xf4\xb0\xcf\x88\xbb\x1c\xf2" - "\xcc\xcb\xdf\xa7\x21\x09\xa3\x3d\xdc\x43\xed\x76\xd6\xdb\x9b\x9a" - "\x3a\x1a\x3e\xa5\x0e\xeb\xff\x27\xeb\x61\x1d\xa3\x65\x75\xdf\x45" - "\x60\xa7\x42\x4f\x4c\xb5\x6a\xb0\x7b\x01\x3b\x75\x78\xd8\x5b\x5a" - "\x2e\x0d\xf6\xa5\xe0\xbd\x65\xff\xa5\xc0\x86\x2c\x2b\x76\x5b\xd5" - "\xb9\x94\x8a\x2b\xe9\xf2\xd0\x79\x8e\x4f\x77\xad\x50\x3e\x78\xbf" - "\x7b\x5e\x9e\x5d\x71\x4a\x1f\xc7\x22\x79\x86\xe5\x34\x49\x3f\x2a" - "\x75\x6e\xe5\x73\xe2\x7d\x4d\xbf\xf3\x77\x79\x43\xba\xf7\xe0\xba" - "\x32\x64\xcc\xef\x36\x2b\x5f\xab\xb4\x22\xc5\x57\xbf\xbb\x9d\x61" - "\xc5\xc7\x63\xb2\x5d\xf9\xec\xfd\x4e\xd7\xd7\xf6\xf7\x25\x4f\xb6" - "\x6b\xb0\x6c\xb1\xfb\x8d\xfa\x87\xe1\x0a\xed\x65\xfa\x37\xe6\xca" - "\xb4\xe3\x6b\x0f\x16\x3e\x59\xb8\x62\x4d\x61\x81\x6d\xc9\xf3\xab" - "\x57\x4e\x5d\xb5\x7c\xb9\x6d\x41\x61\x69\x69\xfe\x53\x85\xa3\x69" - "\xc9\xea\xfc\x95\xa5\x2b\xca\x56\xac\x5a\x69\xb3\x65\xdf\x92\x5b" - "\xb4\xaa\x6c\xea\x9d\xd9\x99\x31\xe7\x9d\xf8\xac\xd3\x51\xd6\xe9" - "\x1c\x1b\x30\x3e\x43\x94\xcc\xb1\x27\xcc\xeb\x44\xcb\x0b\xb0\x27" - "\xc0\x7f\x27\x79\x5d\x1d\xe3\xf6\x18\xeb\x9a\x1c\xeb\x0a\xf3\x66" - "\xdb\xae\xd7\x44\xe7\x09\x6a\x3b\x07\x3d\x85\xbf\x4f\xca\x71\x9b" - "\x8e\xc2\xc6\xf3\xaa\xef\x20\xb5\x7d\xc2\x31\x99\x5e\x41\x9a\x37" - "\x79\x4a\x49\xd5\x7f\x90\x11\x73\x0f\xf4\xdc\x7f\xed\x14\x86\x51" - "\x62\xfb\x78\xd1\x2a\xfe\xd3\x4a\x5a\x4c\x59\x83\xdb\x13\xe0\xfd" - "\x37\xd3\xa2\xa0\x43\xb0\x3c\x55\x63\xeb\x5f\x3f\x51\x74\xb1\x9a" - "\x94\x2f\x63\xdb\x2f\x59\x27\xde\x24\xbf\x53\xf5\xaf\x18\xff\xfb" - "\x73\x86\xe4\x74\x6b\x50\xd3\x45\x78\x3d\x72\xed\x71\x3c\xab\x33" - "\xf6\x07\x93\xa2\xf7\x5c\x3f\xe8\x25\xfa\xa3\x4d\xfd\xb8\xcc\x1f" - "\xb3\xd4\x8f\xef\x23\x7f\x6d\xb5\xea\x17\x9b\xfe\xf7\xfe\xf4\xfa" - "\xff\xab\xe5\x3f\x3e\x70\xf1\xdf\x37\xa9\x5f\xb6\xfb\xff\x61\xfb" - "\xff\x9e\xf2\x1f\x1f\xbc\xd8\x8f\xf9\x0d\xbc\x75\xf4\x95\xff\x20" - "\x13\xf8\xb3\x16\xf6\xb5\xd1\xf1\x19\x59\xcb\x83\xa2\xdb\xf1\x18" - "\x4d\xac\xf8\x82\xf8\x3b\x41\x3d\x65\x76\xd1\x5d\x71\x9e\xf5\x9e" - "\x8f\x77\x80\x7f\x9b\x77\x1e\xa7\xa4\x1d\xc7\xc9\xd2\x51\xc6\xdf" - "\x0b\xe4\xf8\x34\x90\x33\xc0\xd4\x8d\xe7\xb6\x35\x01\xfa\x93\xf7" - "\xff\xb0\xf7\xf5\x71\x51\x55\xeb\xfe\x6b\x86\x11\xc9\x50\x06\x43" - "\x42\xa3\x1a\x0b\x3b\xa3\xa2\xd1\x3d\xd5\xcf\x3a\x7a\x0e\xbe\x75" - "\xad\xe3\x5b\x1d\xed\x4c\xe5\x0b\x96\x16\x7a\x7c\x19\x11\x09\x11" - "\x01\xd1\xb8\x76\x52\x44\x43\x2f\x16\x22\x9e\x8b\x5d\x2c\x5f\x38" - "\xf7\xd8\xbd\x58\x66\x63\x62\x07\x15\x18\xea\x60\x8d\x86\x39\x12" - "\x10\x11\xda\xf0\xa2\x0c\x30\xb3\xf7\xef\x79\xd6\xda\x7b\xf6\xec" - "\x61\x06\x18\xd2\xac\x7b\xcf\x1f\xf3\xd9\xb3\xd7\x5e\x7b\xed\xb5" - "\xd7\xb3\xd6\x77\x7d\x9f\x67\xaf\xf5\x3c\x8d\xb8\x4e\xc1\x50\x06" - "\x6c\xb2\xb4\x12\x63\x2d\xf2\x45\xfe\x51\x24\x28\x3b\x98\x3f\xc6" - "\xa7\xbe\x1c\xcb\x2b\x5f\x5e\x08\x69\x15\x87\xb9\xc8\x3e\x87\x13" - "\x8a\xfb\x60\x4c\xa5\x2a\x72\x7c\x9b\xd0\x37\xed\x6c\x1f\x43\x11" - "\xe5\xe7\x30\x4e\x2a\x98\x1f\xc4\x53\x6b\xd8\x7c\x7e\xea\x49\xc1" - "\x7e\x01\xff\x8b\xa8\xad\x0d\xde\xa3\x10\xe3\xaa\x61\x99\x87\xb8" - "\x42\x1a\x57\xed\x70\x42\x64\x9f\xc4\x05\x44\x59\x66\xae\x27\x27" - "\x01\x07\x31\x46\x17\x8c\xbb\x03\x30\xce\x0a\x76\x07\xf3\x19\x50" - "\xbf\xcd\x39\xc1\xfc\x26\xa8\x53\x7e\x6b\xea\xc7\xc0\x83\x0a\x5b" - "\x04\xfb\xaa\x01\xc6\xc5\x81\x2d\x90\x67\xc6\x6a\x72\xef\x16\xc8" - "\x97\x0e\xf9\x90\x8b\xb1\xfa\x7d\x72\x0a\xda\xe0\x08\x3c\xb3\x5c" - "\x33\x0f\xcf\x0d\xd4\x0e\x85\xcf\x86\xf7\xd0\x54\x11\xc3\x4c\x98" - "\xdb\x54\xf8\x0c\xf1\xb9\x50\x3e\xe0\xdf\xd1\x03\xd4\x26\x0e\xe9" - "\xac\x9c\x8f\x59\x4c\xf7\x8c\xb0\xba\xad\x8e\xb8\x77\x61\x75\x5b" - "\x12\x60\x4e\x6f\xa7\xbe\xda\x32\x51\x7f\x47\x8e\x41\x79\x05\xe8" - "\xf1\x4c\xdf\x04\x6e\x11\x0d\x38\x00\x7c\x82\xae\xbf\x04\x2e\x01" - "\x75\xc9\xc4\xd8\x73\x78\x1d\xf4\x80\x23\x30\x2f\x17\x20\x0f\x98" - "\x77\xed\x29\x82\x7b\xb7\x80\x0f\xa8\x56\xcd\xe1\xad\xcc\x47\xfe" - "\xc7\x0d\x22\x17\x40\x0c\xc2\xf9\x7f\x0b\xe8\xf4\x1d\x20\x43\xe8" - "\x03\xc5\xc0\x2d\x02\x61\x96\xd4\x0a\x6d\x5f\x4c\xe7\xfc\x38\xea" - "\x5b\xd4\x87\x61\xb4\xe1\x11\x78\x3f\x7f\x78\x46\xb1\x99\x94\x52" - "\x9c\x60\x18\x63\x98\x24\xce\xe3\xa8\x43\x99\xa1\x0c\x1e\xb0\x4c" - "\xb8\x06\xef\xff\x3f\x21\xe2\x33\xcd\xe4\xe3\x16\xa1\xcd\x4a\xa0" - "\xcd\xb0\x4c\xba\x9f\x16\x38\x97\x9e\xb5\x8d\x01\xf9\x41\x90\x70" - "\x6f\xb6\x58\x2e\xea\x79\x1c\xf0\x0a\x6c\x2f\x6c\x27\x78\x06\x11" - "\x70\xac\x82\xf1\x97\x4f\x0e\x0a\xdf\xd1\x32\x40\xd6\x1b\xa5\xf6" - "\x37\x98\x9d\xdb\x1f\xee\xdf\x28\xc8\xf2\x39\x27\xd9\x01\xff\xfe" - "\x24\x02\xed\x6e\x50\xc7\x63\xcc\x66\x70\x62\x30\xfa\xf7\x41\x1f" - "\xa2\xd0\xc6\xc7\x36\xa3\xbf\x4a\xc0\xe6\x0d\x5f\x13\x21\xe6\xe1" - "\x27\x83\x19\x3f\x3d\x51\xc8\xe2\x82\x9d\xa0\xb6\xba\x6a\xa8\x17" - "\x8b\x09\x76\x42\x88\x09\x76\x62\xbd\x73\x9c\x43\x29\xc6\xe1\x89" - "\x78\x69\x0d\xb4\x21\x8f\xe9\x63\x86\x3c\xb4\xa9\xd0\xfc\x1d\xd1" - "\x58\xb7\x4a\x1c\x97\xe2\xbb\x62\xbc\x43\x48\x47\x5b\x5f\x25\xca" - "\x4d\x4c\x47\x5f\x97\x20\x27\x7f\xa8\x53\xa0\x50\xa7\x06\x38\xf7" - "\x83\x67\x53\x9b\x14\xc6\x3e\xdc\x8a\xf7\x24\x49\xf7\xe0\xb8\x81" - "\x3e\x1c\x00\xf7\xdc\x06\x47\x5e\xcc\xcb\x62\x22\x9e\xc8\x78\xb3" - "\x1d\x6d\x2a\x27\xf2\xc5\x98\x88\x18\x0f\x11\x31\x63\xcb\x3c\x59" - "\xdb\x63\xdb\x1c\x00\x59\xd1\x7e\x77\xd2\x56\x08\xed\xfd\x09\xf0" - "\xff\x83\x91\xec\xbd\x4e\x64\x08\xf5\x33\x30\xdf\xe9\x1f\x14\xe7" - "\x6c\x17\xf7\x72\x7f\x12\xef\xf8\xce\xe7\xe0\x96\x27\x32\xb0\x4f" - "\x42\x59\x25\x28\x7f\xe4\x89\x90\x2f\xd7\xd1\xb7\xe8\x7e\xc5\x4f" - "\xd0\x8f\x92\x5e\xa8\x3f\xf6\x17\x85\xd0\x76\xc5\xce\xe3\xce\x79" - "\x9c\x43\x19\xd5\x30\xc6\x1d\x7d\x40\x1c\xd7\x02\xe6\x0c\x16\x38" - "\x45\x3c\xfa\x9a\x84\x72\x0d\xc8\xc1\xd9\xbc\x7a\xb2\xe1\x64\xa5" - "\x0d\x6d\xb2\x15\x70\x0e\xe3\xfb\x64\x71\xf3\xc0\x51\xd6\x8d\x14" - "\x37\x4e\x82\xfe\x33\x9c\xda\x8f\xb1\x5d\xc4\xf1\xba\x15\xda\x07" - "\xe3\x09\xd2\x31\x1b\x5f\x4d\xca\xac\x0d\x44\x58\x5f\x0c\x63\xb6" - "\x06\xbf\x91\xd4\x43\x1f\xf2\xc3\xf1\x0b\xf2\x3d\x80\x7e\x51\xa1" - "\x1d\xcb\x37\xee\xa4\xe3\xd6\x1f\xc7\x6d\x07\xee\x41\x87\xe7\x14" - "\x45\x45\x92\x93\xf1\x06\x3a\x8e\xd1\xb7\xc0\xdb\xd0\x76\x18\x7f" - "\x10\x9e\x7d\x44\x5c\x17\x89\x7d\x04\x7d\x09\xb0\x7e\xf2\xb1\x0d" - "\xc7\xb2\xd0\x76\x2a\xc8\x57\x29\x8e\x3d\x49\xfe\x2c\x8f\xcb\x78" - "\x0b\x60\xe3\xad\xc8\x5f\x6c\x6b\x1b\x1d\xc7\x27\xf2\x6d\x30\x8e" - "\x9d\xdb\x14\xdb\x13\xdb\x15\xf2\xc2\xfb\x1f\x9d\x29\xb6\xa9\x53" - "\x7b\xee\x17\x64\x5e\xce\x6c\x16\x45\x4b\x05\x7b\x86\xa3\x0d\x85" - "\xfe\x57\x81\x63\x6a\x03\xbe\x3b\xcc\x0d\xf8\x7c\xec\x23\x6f\x0b" - "\x98\x55\x64\xc1\x3e\x52\x04\xe3\x7f\xaa\x49\xc2\x8e\x13\x07\xa8" - "\xce\x02\x72\x62\xf2\x29\x3a\x47\xf7\xeb\xbb\xc1\x0e\xe8\x27\x99" - "\x12\x3e\x15\x55\x8b\xed\x20\xf6\x49\x71\xdc\xc3\x9c\xf2\x90\x1c" - "\x7f\x4e\x0d\x82\x32\x06\x22\xbe\x49\x1c\xea\x54\x98\x1c\xdf\x4e" - "\xf9\x23\xbe\x61\xbf\xd6\xc7\xa1\xcd\x86\xcd\x57\x66\x72\xfc\x88" - "\x1c\x93\x8e\xef\x67\xdf\x00\x19\xe7\xc2\xbe\xa5\x9f\xc7\xf2\xe3" - "\x1c\x06\xf9\xe9\xba\x64\x61\xce\x43\xff\x57\x98\x96\x2b\xb4\x57" - "\x25\xe4\x2f\xc2\xbd\x5a\xb8\xd7\xfb\xf6\x4a\xa6\xeb\x01\x4e\x1f" - "\x43\x3f\xb3\x90\x2f\xaa\x0c\x78\x7e\x47\x1a\xc3\x6e\x11\x2b\xf8" - "\x97\x74\xb7\xbf\x5a\x47\x6e\xd3\xff\x96\xff\xa6\x96\x7c\x3a\x1e" - "\xc6\x8c\x15\xfd\x9e\x41\xd9\x9a\x5a\x72\xfa\x36\x78\x6e\x90\x70" - "\x0c\xa9\x25\xc5\x8d\x70\x1c\x0c\xc7\xf3\x70\xbc\x0b\x8e\x27\x20" - "\x3f\x27\xe4\x8f\x80\xf3\xfd\x90\xfe\x6b\xe1\x08\x75\xfc\x74\x0c" - "\x1c\x67\x0a\xdc\x11\xd3\xd7\xe1\x39\x1c\x97\x09\x32\x2f\x61\x32" - "\xff\x14\xd7\x5c\xc5\x43\xfd\x4d\xc6\x4a\x5a\x96\x1e\xf2\x8c\xc2" - "\xb2\x71\x0f\x65\x2d\xf9\xfb\x65\x27\x0e\x0a\xe5\xfc\xbd\x3f\x1c" - "\x1f\x86\xfb\x3e\x83\x63\x2c\x1c\xf7\x09\x6d\x50\x8e\xd8\xb0\x30" - "\x1e\xdb\xb6\xc8\xa0\x61\x7c\x77\xa6\x38\xe6\x71\x1e\x96\xb0\xc3" - "\x40\x16\xce\x61\xf2\x86\xbc\xb4\x1f\x40\xde\xf1\x98\x17\x8e\x13" - "\x85\x63\xa4\x70\x9c\x2c\x1c\xff\x55\x38\x4e\x12\x8e\x53\xcc\xe4" - "\xd3\x7c\x81\x63\x40\xbb\x7c\x9a\x4f\xd7\x37\x64\x84\xe5\xb2\x67" - "\xfc\xbd\x18\x75\x64\xc0\x71\x9c\x07\x7d\x5a\x53\xff\x3e\x56\xb4" - "\xb7\xa1\x9d\xb6\x23\xf5\x83\x6f\xde\xa6\x7e\x1b\xfe\x3e\xcb\x09" - "\xdb\x22\xfd\x15\x91\x04\x38\xd0\xa0\x6c\x25\xcc\xff\xac\x1c\xec" - "\xc7\xf4\x1b\xa2\xe0\xc3\xda\x07\x7d\x45\x51\x7d\x28\x30\x07\x75" - "\xf2\x4a\x6a\x8b\x44\x1f\x49\x81\x23\x26\xc1\x6f\x26\xe8\x06\xb3" - "\x44\xfc\x46\xbd\x47\xf0\x75\x15\x0c\xcf\x32\x48\xba\xfa\xdf\xf5" - "\xec\x9b\xcc\x20\x18\xfb\x7f\x37\x39\xa5\x87\x63\x9d\xa1\x3d\x4d" - "\xf0\x3e\x0f\x57\x91\x62\x6c\xc7\x7f\xa9\x66\xef\x1c\x21\xbe\xb3" - "\x20\x0f\xbd\xd8\xbe\xd5\xe4\xd3\x02\xc0\xc2\x18\xec\xc3\x55\x0e" - "\x9c\xfd\x94\xee\x41\x12\xfa\x08\xc8\xf2\xd3\xc5\x28\x53\x69\xfc" - "\xc8\x30\x28\xa8\x35\xb5\x38\x4a\x8e\x29\x86\x28\xc4\x14\xec\x1b" - "\x80\xdf\x28\xeb\x48\x97\xf1\xe7\x8f\xe3\x8f\x8d\xbb\xe2\x6c\xf9" - "\xbd\xa7\xfc\x6d\x6c\xdc\x99\xa0\x9f\x41\xff\xfc\x14\xfd\xf4\xc1" - "\x3c\x55\x9c\x28\x8c\x69\x13\x8c\xe9\x47\x20\xdd\x8f\xd5\x95\xa5" - "\x0b\xcf\x82\x7e\xf6\x29\xbe\xf7\x5d\x62\xba\xf0\xbe\x50\xce\x29" - "\x2b\xca\x5b\x4c\x17\xca\x87\xfe\x78\x0a\xf7\x05\x87\x88\xe9\xc2" - "\x3b\x01\x8f\x3a\xfd\xb0\x88\x27\x9b\x69\x7f\x3b\x79\x4c\xbc\x0f" - "\xe5\x86\x7e\x6d\x98\xcd\xf8\xb4\x06\xc6\x6a\x2e\xce\x0f\x1b\xe6" - "\x11\xff\x57\xb3\x48\x7f\x36\x2e\x4f\x6b\xe4\x18\x79\xf6\x28\x9f" - "\x1a\x60\xe3\xd5\x23\xc6\x96\xda\x1e\x16\xf9\x6a\x36\x3c\x27\x5b" - "\x8c\xbf\x29\xf9\xc3\x3e\xfd\x19\xc6\x2d\x77\xaa\x8b\x41\xac\x8b" - "\x34\x3f\x33\x19\x60\xdd\xb0\xac\x0d\xc0\xd7\x5b\x00\x17\x18\x6e" - "\x9f\xb6\x88\x71\x89\xd3\x85\x79\x8b\xc6\xc6\x8d\x63\xb1\x71\x71" - "\x6e\xc4\x6f\xf9\x1c\xda\xb1\xe2\xed\xa4\x4c\x0f\xba\x7c\x7c\x0d" - "\x99\xbf\xa6\x1f\xfa\x8e\xd0\x41\x5d\x77\x43\xdd\xf2\x84\x36\x82" - "\x71\x73\x76\xbd\xd0\x96\x88\x57\x79\x88\xe1\x1b\x92\x58\x2c\x0b" - "\xb4\xdd\xe0\x78\x78\x13\xe7\xad\x10\xde\x5a\x94\x8d\x63\xe3\x8c" - "\x5e\xe4\xa0\x50\xbf\x5c\xc6\x01\x4f\x5e\xa4\xbe\x4c\x32\x46\x8c" - "\x65\xb6\xbf\xb3\x81\xec\x5d\xcf\x58\xd9\x77\xd2\x11\x42\xac\xa1" - "\x33\xd5\x3e\x21\x41\x31\x6c\xbd\xc5\x07\x5c\x0e\x1d\x6b\x67\x0c" - "\x2e\xfe\xa2\x94\x90\x56\x21\xfa\xbb\x94\xf8\x22\x6b\x13\xb8\x66" - "\x91\xc6\xc5\x99\x03\x58\x16\x94\xb9\xae\x35\xf5\xac\x9f\x94\x7e" - "\xb2\x52\xb0\x79\x45\x0e\x58\x1f\x89\xeb\x48\x06\xa1\x8f\x58\x56" - "\x87\xb3\xd1\xb4\x4e\xd4\xee\x31\x22\x52\x1c\xc3\xd8\xd6\x38\x6f" - "\xd3\x71\x0c\x63\x18\xc7\x72\xc7\xb6\x11\x93\xe0\xc7\xc6\x2e\x9b" - "\x9f\xad\x74\xec\xd2\x71\x7b\x36\x5e\x7a\xde\xd9\x08\x6a\xfb\x42" - "\x99\xae\x0d\xf1\x87\x6b\x99\x66\xf2\x81\x9f\x50\xc7\xb1\x42\x5d" - "\xc6\xc2\xf5\x6c\xb6\x56\xe3\xcc\x28\xc6\x85\xce\x84\x63\xff\x32" - "\x42\x9f\x81\x63\x16\x8b\x1b\x78\xb6\x5c\xec\x33\x30\x9e\x16\xd6" - "\x92\x92\x05\x99\xc1\x7c\x16\xc8\x26\x0b\xc6\xc0\x52\x38\x9f\x06" - "\xc7\x85\xec\xa8\x50\xe3\x51\xe8\xdb\x59\xad\xa9\x25\xfe\x62\x7c" - "\x57\x7c\x9f\x96\xc0\xd7\xd0\x67\x69\x62\x3a\xd4\x1d\xfb\x08\xfd" - "\x9e\xa8\x67\x71\x93\xb1\x7f\x60\xdf\x08\x58\xff\x14\xed\x1f\x74" - "\xaf\x32\xa4\xd3\x3a\x41\xff\x80\xb2\x74\xa2\xaf\x49\x78\x3f\x1b" - "\xb3\xeb\x97\x2c\x75\x5e\xdb\x06\x65\x6a\x8a\x34\xa0\xd7\x64\x0c" - "\x1a\x13\x3b\x94\x0c\x2a\xd2\x50\x9f\x72\x97\x8c\xb6\xc9\x04\xef" - "\xc1\xef\x32\x0c\xe7\x06\xfd\x11\xee\xcd\x97\xda\xcb\x40\xbf\x55" - "\x9c\x9c\x43\x6d\x89\x77\xc0\xb5\x22\x67\x3d\xc1\x4c\x3e\x2c\x47" - "\x5d\x01\xd7\xe0\xdc\x1f\x44\x34\xd0\x0f\x01\x87\x4a\xea\x44\x5e" - "\xfa\x60\x10\x7e\xdf\xfd\x10\xf7\x42\xa2\x0e\x0c\xed\xf5\x61\x34" - "\xe8\x82\x6e\xd7\x27\x42\xff\x78\x18\x6d\x35\x42\x1c\x88\x4a\xb4" - "\x43\xa1\xdf\xec\x5a\x52\xbe\xa6\x14\xfd\x08\xac\xe8\xec\x5b\x34" - "\x29\x9e\xbf\x86\xfe\x45\x35\x31\xe4\x8e\x2a\x52\x3e\x07\xed\x3e" - "\xc9\x8d\x68\x63\x29\xd5\xcb\x6d\x2c\xa5\x06\xe1\x57\x41\x48\xd9" - "\x18\xa7\x5f\xb1\x70\x9c\xd4\xcd\xcf\x2c\xe4\x05\x0d\xbc\xcc\x2a" - "\xb4\xd5\xbf\xb7\xa6\x96\x3a\xfc\x1f\x62\x9f\xc2\xb1\x8a\xdf\xf5" - "\xd1\x66\xa4\xb0\x11\xf4\x5b\x00\xf2\x82\x7a\x6f\x18\xf1\x8c\x21" - "\x01\xfb\x53\x59\x1f\xca\xfd\x95\xde\xee\xab\x2a\xa3\xdf\xc1\x98" - "\x8f\xbd\xd2\x62\x78\xf6\x7f\x62\x6c\x78\x7d\x0c\xb9\x1b\xed\xd7" - "\x01\x76\xde\x80\x3a\x2a\xf6\x8d\x3d\x34\xfe\x42\xd9\xe9\xd8\x75" - "\x44\x09\xd7\xef\x85\xff\x85\x22\xcf\x81\x7b\xd4\x3e\x56\x12\x84" - "\xfc\x66\xe2\x3a\x72\x6f\x6b\x6a\x59\xa6\x28\x2b\xe4\x00\x68\x47" - "\x13\x6c\x01\x50\xd7\x52\xfa\xed\x0c\x7d\x23\x9b\x69\xbb\x51\x1c" - "\xc5\x32\xa0\xef\x96\xa5\xf8\xb4\x10\x35\x9b\x3b\xca\x60\xfe\xfb" - "\x50\xe0\x7c\x65\xd9\x30\x06\x2a\x9c\xea\x79\x5e\xfa\x1f\x3c\x18" - "\xef\x0f\x68\x41\x7e\xe5\xa9\x7d\x8c\xc3\xc4\xf6\xc1\x75\x65\x01" - "\xc0\xf3\xa9\xbc\x6d\x7c\x03\xd4\xad\x44\x9f\x40\xfc\xea\x49\xf9" - "\xb0\x3d\x3b\xe9\x7e\x97\x62\x66\x5f\x2f\x1f\x2c\xea\xd1\xac\xde" - "\xc6\x9a\x80\xf5\x3e\x34\xa6\x36\xc6\xf8\xa4\x71\xb4\x7f\x08\xa1" - "\xdc\xdb\x68\x1b\x4b\x0c\x49\x8f\x63\x9e\x73\x22\x96\x36\x27\x87" - "\x90\x93\x21\x63\x61\x3c\x1b\x73\x61\xcc\x94\x78\xbf\xf6\xc9\x28" - "\xd8\xed\xd9\x1e\x29\x3c\xc7\xfd\x4c\xd4\xbf\x3c\xfd\x4e\x6a\x5c" - "\x89\x73\xc3\x46\x21\x3e\x33\xce\xb9\xad\xa9\xe5\x0e\xfe\xcf\xe2" - "\x52\x1b\xf5\xac\x0c\xfc\x3e\x68\x5c\x8a\xfb\xc8\xa9\x1e\xc0\xf2" - "\xfb\x33\x1b\x7e\xb9\xc3\xfe\x8f\xf9\xf0\x3e\xb6\x3e\xc9\x38\x69" - "\xbe\x5d\x01\x6d\x6c\x9c\x84\xef\xca\xfa\x66\x30\xc8\xb6\x5c\x2f" - "\x8d\xe3\x32\xba\x4e\xe8\x64\x83\xf3\x38\x2d\xcf\x90\xf4\xc7\xd2" - "\x87\x47\x65\x12\x8d\xbb\x71\xa9\x1f\x40\xd4\xdf\xfb\x91\x3f\x6c" - "\xdd\xca\xe7\x66\x28\xb9\x09\x1b\xd2\x89\xbf\x62\x33\x34\x23\x8e" - "\xbb\xb8\xa8\x41\xb5\xe4\xb3\xc0\x00\xff\x3b\x67\x4e\x8c\xed\xcb" - "\x27\x85\x10\xe5\x96\xa6\xbe\x7e\x43\xad\x77\xe6\xf2\x3e\x23\x9e" - "\x99\x16\x6b\x25\x9a\x25\x19\xe4\xdb\xa5\xc4\x67\x22\x30\xf7\xfb" - "\xfd\x09\xd4\xe9\x1f\xa1\xb8\xef\xec\xa4\x3f\xf2\x89\x7f\x84\x62" - "\x99\x89\xd9\xc4\x2f\xb1\x9a\xaf\xdb\xfc\x72\x1f\x3f\xc0\x76\xf5" - "\xdb\xd0\xe7\x6e\xf7\xbf\x33\xb7\x03\xca\x38\x11\x45\xef\x73\xbb" - "\xcf\xa5\xeb\xba\xe9\x83\xa1\x6e\x07\xbd\xab\x5b\xc5\x31\xa9\x6e" - "\x15\xc7\x6e\x70\xdd\xd4\x52\xdd\xa2\xa1\x6e\x9f\x3f\xe9\x5d\xdd" - "\xbe\x98\x23\xd5\xed\x8b\x39\x3d\xac\xdb\x01\xef\xeb\x16\x7f\x27" - "\xd4\xad\xc6\xbb\xba\x7d\x69\x93\xea\xf6\xa5\xed\xc7\xd4\x0d\x75" - "\xf3\xa4\x50\xbe\x86\xfa\x3a\x8e\x21\xfe\xb8\xb6\xab\x96\x54\x4c" - "\x4e\xca\xa6\xe7\x03\xe1\xbf\x42\x18\xef\x96\xe4\x16\xfe\x1b\xc6" - "\x63\xfe\xb1\x6c\xb4\x1e\xd7\x34\xff\x63\x21\xf4\x65\x7f\xd6\xa7" - "\x2b\x28\xd7\x4e\xb6\xf0\xc2\x5a\xc3\x7f\x6c\xc9\xa1\xeb\x15\x46" - "\x0b\x3a\xc6\x3f\xca\x9b\x07\x8e\x88\xc7\xb5\x02\x1c\x8c\x6f\x7e" - "\xe0\x88\x8d\x18\xd7\xed\x70\x8c\x45\xc9\xa7\xa2\x1f\x22\xf4\x95" - "\xa4\x22\xfc\xf6\x11\x99\x87\x63\xac\x4a\xf4\x1b\xb0\x81\xee\xc3" - "\xfb\x47\xb1\xb8\xc7\x44\x7c\x86\x25\x70\x74\x2e\xa4\x9b\xcd\x42" - "\xac\x45\x5e\x89\xdc\x64\x44\x22\x96\x0f\xe9\x56\x31\x1e\x22\xf4" - "\x77\x31\x26\x4b\x4b\x80\xb5\x2b\x1c\xac\x18\x25\xe2\xe0\xc4\x58" - "\x12\x80\xf1\xd0\xb6\x26\xf5\x45\x7d\x05\x38\xd5\x3f\x8e\x61\xbb" - "\xcf\x68\xe9\xcb\x07\x24\x12\x1f\xdc\x5b\x83\x6b\xb8\x8c\x21\x16" - "\x12\x96\x48\xfa\xcc\x88\x87\x32\xad\x24\x2a\x20\x1e\xca\x83\xb6" - "\x66\x5c\xbf\x82\xee\x83\xcb\x84\xf2\x70\x6d\xab\x4f\x2c\xf1\x9f" - "\x18\x92\xcc\x6f\xd8\x45\x54\xb8\x0f\x07\xf7\xd3\xb0\xbd\x34\xbe" - "\x7e\xad\xa9\x15\xf9\xe2\xfb\xf5\x40\x3e\x03\x98\x7c\xce\xd5\x48" - "\xf2\x39\xb7\xb7\xb3\x7c\xce\xf5\x67\xf2\x39\xa7\x92\xe4\xf3\xc5" - "\x14\xb9\x7c\xce\x8d\x92\xcb\xe7\x9c\xbe\x77\xf2\x39\x17\x2d\xc9" - "\x87\x3d\x83\xc9\xe7\x5c\x8a\x7b\xf9\x9c\xcb\x92\xe4\x73\x2e\xbc" - "\x67\xf2\x39\x57\xea\x59\x3e\xe7\xe6\x74\x21\x1f\x5f\xf7\xf2\xf9" - "\xe2\xee\x9e\xcb\xe7\x8b\x29\x5e\xc8\xa7\x3f\x93\xcf\x97\xaf\x49" - "\xf2\xf9\x72\x7c\x67\xf9\x7c\x71\x90\xc9\xe7\x8b\x3c\x49\x3e\x5f" - "\xd6\xc9\xe5\xf3\x45\xa9\x5c\x3e\x5f\xaa\x7b\x27\x9f\x2f\xfd\x24" - "\xf9\xb0\x67\x30\xf9\x7c\xa9\x71\x2f\x9f\x2f\xc7\x48\xf2\xf9\xa2" - "\xa4\x67\xf2\xf9\x72\x99\x67\xf9\x7c\x61\xf3\x5e\x3e\x5f\x7e\xe4" - "\x22\x1f\xb5\x67\xf9\x7c\x59\xe7\x85\x7c\x02\x98\x7c\xce\x0f\x93" - "\xe4\x63\xba\xdc\x59\x3e\xa6\x69\x4c\x3e\xa6\x49\x92\x7c\xce\x6f" - "\x92\xcb\xc7\xb4\x4c\x2e\x1f\x53\x41\xef\xe4\x63\xca\x97\xe4\xc3" - "\x9e\xc1\xe4\x63\x32\xb8\x97\x8f\xc9\x24\xc9\xc7\xb4\xb4\x67\xf2" - "\x39\xdf\xdf\xb3\x7c\x4c\xd9\x5d\xc8\xa7\xaf\x7b\xf9\x9c\x9f\xdb" - "\x73\xf9\x9c\xdf\xd4\x95\x7c\xbc\xe3\x7e\xe7\x29\xaf\xba\x01\xe5" - "\x54\x7b\x2a\x07\xdb\x0e\xd7\xa7\x71\xa9\xe7\xab\x73\x38\x5f\x1a" - "\x4b\x0a\xfe\x67\x6b\x12\xc8\xef\xaa\xc8\x85\x87\x72\xb8\x3e\x7e" - "\x7c\x6a\x4e\x14\x97\x9a\xab\xe1\xd7\xfb\xaa\xb8\xf5\x7d\x55\xb8" - "\x37\xd2\x5d\x59\x6c\xbd\xe4\x85\x6d\x3e\x83\xc9\x3d\xb8\xdf\x65" - "\x03\xf0\x67\xfc\xdf\x9a\x7a\x21\x1b\xb8\xa0\xb6\xab\x7d\x17\xb8" - "\x76\xe9\xe4\x46\xd4\x7b\x2f\x14\x3b\xf6\xab\xa7\xf2\xf1\xe8\xa3" - "\x48\x7f\x1f\xae\xb1\xbf\x60\xc9\xa4\x3e\x6f\x86\x69\x22\xef\xe3" - "\x2f\xa1\x2e\x52\x4b\xbe\xba\xc2\x6f\x1b\xa6\xc1\xfe\x00\xdc\xfd" - "\x8e\x7a\xf2\xd5\x18\xc7\x9a\x2e\x5e\xf7\x96\x60\xf3\x2b\x61\x79" - "\x2f\xce\xe5\xb7\x85\x95\x60\xfc\xbb\x55\x49\x18\xd7\xed\xe2\x64" - "\xe0\xbe\x0f\xe0\x33\xd0\xff\xca\x1e\x38\xe2\xba\x17\xb6\x76\xef" - "\x2b\xea\x37\x0b\x7d\xbc\xb1\x35\xfd\x17\x47\x89\xfd\x0e\x9e\xd3" - "\x0f\xce\x07\x09\xfc\x1e\xf3\xdf\x5e\x4f\x2a\xed\x4e\xd7\xfd\xe1" - "\xfc\x32\x94\x1d\x28\x5c\xef\x0f\xe7\xa7\x90\x67\xd3\xfd\xf7\xe9" - "\x29\xc2\x1a\xd3\xca\x7c\x48\x53\x0b\x79\x02\x21\xcf\x16\xe4\xee" - "\x42\x19\x03\xe1\x7c\x25\xea\xc4\xc2\xf5\x20\x38\x9f\x8d\xdf\x02" - "\x84\xeb\x83\xe0\x1c\xe3\x87\xfe\x8a\xed\x77\xe8\x10\xc6\x68\xa5" - "\xaa\x77\x7b\x36\x2b\xa9\xfe\xc7\xe2\xb4\xa3\x2e\x50\x39\x55\x5a" - "\xcf\xf3\x55\x83\xcb\xb5\x68\xa7\x6b\x95\xe2\x35\xb6\xe6\xac\x72" - "\xa3\xd3\xb5\x12\x97\x6b\xb9\x4e\xd7\x8e\xb9\x94\x79\xcc\xe9\xda" - "\x01\x97\xfb\x4c\x4e\xd7\xb2\x5c\xae\xb5\x38\x5d\xdb\x24\x5c\xf3" - "\x69\x4d\xbd\xe8\x2f\x7d\x93\xfb\x2a\x5e\x48\x57\x42\xba\x53\xfc" - "\x83\xaf\xa2\x85\x74\x78\xfe\xc5\xb1\x66\x92\x71\x44\x48\xa7\xb2" - "\x67\xe5\x5f\x9c\xe5\x54\xfe\x18\x66\xfb\xb8\x18\xed\x58\x0b\x37" - "\x70\x44\x39\xd7\xa1\x7b\x0b\xae\x69\xb0\x5f\x39\xf7\xed\xe5\x71" - "\x9a\x17\x57\xbf\xa2\x89\x59\x14\x8b\xcb\x51\x96\x2d\x8e\xd5\x2c" - "\x5b\xb1\x70\x91\xcc\xef\x72\x10\xfa\x2d\xc3\xb8\x3e\xe8\x53\x41" - "\xf0\x11\x5e\xe7\xf0\x8d\x0f\xb8\x0a\xcf\x02\xfd\xff\x77\xd4\x07" - "\x7b\x26\xf3\x4f\x5c\x8c\x3e\x19\x98\xff\x05\xf2\x54\x15\xb9\x78" - "\x5e\xf0\xbf\x60\x68\x4d\xfd\x9a\x78\xf6\xbf\x70\xa9\x92\xfa\x48" - "\x83\x7c\xcc\xff\xc2\x25\x33\x8c\xf3\x89\x7c\x3f\xe6\x27\x9f\xc5" - "\xd7\xf9\x5a\xe4\x26\x96\xf9\x6d\xd4\xcf\x58\x0a\xb3\x6d\xb8\xfa" - "\x7e\x1c\x46\xf0\x3e\xe1\xfb\xa7\xf3\xfd\x4b\xd9\x75\x71\x7e\x10" - "\x9e\x99\x31\x0c\x7d\x9e\xf4\xab\x82\x73\x6a\x8f\xa7\xd7\xbe\x66" - "\x7e\x5c\xb6\x0d\xc3\xfd\x3b\xc5\xf8\xde\xf2\x77\x53\xfe\xb1\x8a" - "\x7c\xfd\xbe\xd3\xbb\x55\x3a\xf9\x93\x12\xdf\x81\xf9\xec\xea\xfc" - "\xae\x74\xbf\x0e\xaf\x1e\x86\xeb\x8d\xa8\x6f\x4b\xb6\xd6\x1d\xce" - "\xb7\x0d\x53\x89\xf5\x71\xaa\x9f\x1f\xea\xf9\x50\xbf\xcb\xb4\x4d" - "\x40\xa6\x3c\xc8\x54\x78\x87\xbd\x7c\xea\xc5\x8d\x74\xed\x36\xee" - "\xdd\xc3\xd8\x05\x74\xae\xba\xb4\x54\xb4\x55\xe2\x1c\xc5\x7c\x61" - "\x5f\x92\xf8\x1f\xfa\xf9\xd9\x26\xce\x5f\x97\x9c\xf8\x1f\x7b\x26" - "\xa4\x1d\x70\xee\x43\x4e\xcf\x3b\x8f\xcf\x83\x7c\xb3\xd8\x7a\xf1" - "\x61\x74\xbc\xc3\x39\xf5\x23\x8a\xf7\x62\x1d\x3d\xc5\x82\xf2\xe4" - "\x87\x4d\x6a\x47\x73\x98\xd8\x8e\x99\x34\x56\x89\xf9\x61\xd1\x8e" - "\x47\xf7\xab\x40\x1e\x1c\x5b\x88\x4f\xbc\xfa\xdf\x72\x8b\x34\xd7" - "\xa0\x4e\xe6\x68\x86\xbb\x39\xf1\x0f\xfa\x93\x28\xd6\xc6\xe6\x95" - "\x88\xf5\x38\x76\x18\xe6\x9b\xcb\x05\xd9\xc7\xb3\xf7\x30\xef\xc2" - "\x74\x69\x9d\xb6\xd9\x22\xe6\x13\xf1\x99\x7d\x87\x32\x9f\xa6\xf9" - "\x58\xac\xca\x14\x26\xfb\x5f\xa9\xab\x88\xb9\x52\xc8\x4f\xd7\x8e" - "\x32\xff\x1a\x66\x2b\xbf\x6d\x74\x0a\xd4\xb9\xce\x4c\x2e\x0a\xeb" - "\x8c\xd9\x73\xe1\x58\x89\x75\xc1\xb6\xc2\xbd\x9f\xfc\xb6\x9c\x78" - "\x90\x93\xdb\x7d\x1a\xc2\x9a\xe0\x7b\xeb\x49\x15\xf5\x41\x84\xb1" - "\x20\xd0\x06\xcb\x30\xb9\x6a\x35\x7f\x9d\x2f\x44\x1f\x9f\x90\xc7" - "\x5f\xcc\xc3\x30\x9c\x5e\xa3\xeb\x91\xf5\x71\x68\x27\x12\xae\xc5" - "\xe1\xfe\x38\xc7\x7f\x5f\xa7\xff\x7d\xf0\x3f\x1f\xc7\x17\x6c\x4d" - "\xa0\x73\xac\x4a\xda\x7b\x5b\x15\x0b\xe7\xfe\x2e\xe7\x41\xb2\xf3" - "\x35\x24\x94\xae\xab\x6d\xe1\xab\xe9\xfa\x63\x21\x5d\x28\xfb\x36" - "\x5a\x9f\x38\x7e\x0c\xf4\x91\x20\xdc\x4b\x29\x8c\xc7\x20\xdc\x83" - "\x19\x60\x9b\x4b\xf7\x5f\x62\xac\x77\xe1\x18\x21\x1c\xc3\x59\x9c" - "\xc0\xaa\x70\x29\xd6\x2f\xda\x6a\xaa\xc6\x7a\x8a\x3d\x2c\xc6\x66" - "\x16\x63\x0f\xe3\xfe\x4d\x21\x46\xd1\x1c\xb8\x2f\xb6\xab\x38\xcf" - "\x70\x3d\x53\xdc\x8b\x69\xcf\x08\x2b\xe4\x32\xd2\xd0\xef\xeb\xbd" - "\xe8\x73\x28\xb9\x01\x7d\x36\xb4\x10\x23\x69\x27\xc6\xd8\xd6\x14" - "\x8c\x53\x57\xc6\xe2\xd3\x0d\x40\x79\xe0\x5e\x20\xe4\x90\x65\xfa" - "\x2b\x34\x46\xdd\xab\x0d\x24\x54\xff\x5b\xbe\x1a\xda\xc0\x6a\xdf" - "\x16\x56\x28\xf4\xa3\x5d\x30\x17\xde\x53\x4f\xbe\xa1\xd8\x4c\xe3" - "\xaa\x36\xd0\xef\x59\x7e\xb5\xe4\x9b\x4d\x34\x0f\xaf\xdb\xc5\xda" - "\xee\x1b\x3a\x3f\xec\x49\x15\xe3\x90\x7d\x13\x21\xc6\x3a\x35\x93" - "\x6f\x36\x5f\x0b\x5c\xb0\x09\xd2\x26\xc9\xd7\x42\x7f\x83\x31\x59" - "\x03\xb0\xee\x90\x87\x60\xd9\x90\x47\xc2\x7f\x48\x7f\xd5\x46\x86" - "\x40\xbd\x6a\xc5\xf2\xe1\xfa\x26\x33\xb9\x4c\xe7\x18\x2c\xf3\xda" - "\xb6\x7f\x2b\x80\xb4\x6c\xb3\x4f\xab\x10\xa3\xf0\x9b\x7c\x33\xc9" - "\x3e\xd2\x15\x17\x82\xb1\x50\x00\x63\x09\xda\x6b\x74\x3e\xf3\x0f" - "\x3c\xba\x80\xd9\x1e\xbf\xb9\x86\xeb\xb5\xb6\x5e\x27\x2a\xb4\x05" - "\xb2\x3e\x5b\x4d\xf7\x15\x62\x1a\x60\x76\x3e\x8c\x11\x6a\x8f\xf5" - "\x6e\xfe\xaf\x66\xfb\x20\x9a\x88\x5f\x7a\x8c\xe8\xdf\xb8\x7a\xa6" - "\x93\xaf\x75\x61\x7f\x44\xf5\x9a\xb2\x78\xfa\x1d\x9b\xd6\xd1\xb5" - "\x0e\x58\x5f\x68\xa7\x16\x8f\x5c\x53\x3d\x3a\x9f\x7e\x73\xd9\x3e" - "\x22\x8f\xad\x3d\xad\x3e\xe1\x13\x32\x78\x2d\x3c\xeb\x98\x68\x4b" - "\xc4\x3c\xe9\x18\x03\x14\xca\x77\xbc\x67\x0c\x7d\x46\x35\x1b\xeb" - "\xd5\x56\x6e\xdb\x68\xdc\x9f\xad\x12\xd2\xad\x65\x36\x2b\xee\xdd" - "\x76\xeb\x07\x87\xc6\x77\xc2\xb5\xde\xdb\x47\xe7\xe3\xfe\x92\x07" - "\xad\x62\x9d\x6b\xac\xb8\xaf\x01\xeb\xcc\xda\xb6\xe6\x8a\xd8\x8e" - "\x5b\x9a\xa0\xec\xa4\x0b\xa4\x9a\xd4\xac\xc6\xf5\x70\xb8\x4f\x07" - "\xc7\x30\x6b\x83\x9a\xd5\x34\x5f\xbb\x23\x0f\xf5\x77\x41\x63\x86" - "\x40\xf9\x39\x34\xbe\x10\xbc\x03\xc8\xc2\x90\x84\x7b\x76\x6b\xa8" - "\x6e\xb7\x21\x86\xb0\xf7\xa6\xeb\x5f\x6b\x43\x59\x5f\xa9\x39\x22" - "\xce\x19\x66\x21\x6d\x2b\x3e\x3b\xae\x9d\x5c\x25\x35\x3b\x30\xc6" - "\x2f\xb4\x47\x21\xfa\x8f\x2a\x6b\x81\x71\x12\xdf\x8e\x7d\xa1\x10" - "\xe3\xc8\xc1\x9c\x92\xc9\xe6\x39\x6c\xf3\x9a\x78\x7c\x3e\xb6\x2d" - "\xc8\xce\x02\x6d\xfa\x7a\x6b\x6a\xad\x5a\x6c\xd3\xf4\x60\xd4\x7b" - "\x6a\xc2\xbb\x9a\x23\xec\x50\xe7\x32\x60\x57\x86\x21\x17\xb0\x7e" - "\xe7\xb9\x81\xa3\xf3\x71\xad\x35\xfc\x5f\x27\x60\x3b\x95\x1d\x1b" - "\x4b\xb5\x7f\x85\x67\x1c\xc1\x75\x0b\x88\x95\xe8\xe3\x08\xd2\x74" - "\x42\xfb\x51\x3f\xf7\x19\x71\xac\x1d\x58\xfe\x6f\xfd\x99\xdd\x78" - "\xf0\x07\x50\x2f\xa7\xef\x3f\xdf\x52\x7f\x2b\x39\x42\x5c\x6e\xb8" - "\x56\xe4\x54\xe7\x16\xba\x4f\xb2\x09\x6d\x7e\xb5\x4b\xf1\x59\x5b" - "\xd0\xbf\x0f\xf6\x8b\x7a\xe7\xfe\x5f\x3b\x0d\xeb\x89\x6b\x79\xed" - "\x81\x23\xf2\x60\xde\xcd\xc7\x76\x86\x7b\x36\xc2\x58\xc8\xef\x62" - "\x4e\xa4\xb1\xa4\x5a\x53\xbf\x1d\x23\xce\x89\xa0\x67\xc0\xbc\x50" - "\xf7\x10\xd5\x3f\x81\x57\x1b\x39\xe4\x35\x75\x11\xd8\x6f\x60\xac" - "\xdb\x84\xf5\x7d\x30\x86\xbf\x5d\x2a\x7e\x13\xb3\xe3\x7e\x88\xab" - "\xf4\x3b\x6e\x8b\x18\x6f\x89\xf9\xd3\xfa\x36\x43\xda\x3f\xf1\x6d" - "\x76\xa7\xfd\x13\xb8\x6f\x64\x27\x8d\xf1\x73\x00\xe7\x94\xd2\x86" - "\x6a\x9c\x23\xe8\xfd\xb8\xa7\x22\x09\x74\x73\xb6\xf7\xa4\x1a\xed" - "\xf4\x34\x3e\x02\xd6\x85\xf9\xc4\xaf\xa2\xff\xa1\xdf\xaa\xf0\xc8" - "\xfa\x52\x1d\x71\xc4\xec\x05\x79\xe3\x37\xb8\x93\xaa\x27\x88\xe1" - "\x3e\x9c\xaf\xeb\x1e\xc2\xf8\xb3\x90\x27\x4c\x8c\x3d\x4b\x63\xcd" - "\xb2\xf7\xf1\x14\x43\xc6\x7f\xeb\x68\x12\x81\x3e\x31\x70\x1f\x16" - "\x6d\x03\x75\x4e\x08\xfa\x8d\x45\x1f\x78\x86\x04\x8c\xdf\x50\x77" - "\xf9\xcd\x60\xba\x97\xb5\xc5\x30\xba\x09\xd7\x57\x35\xd4\x26\x52" - "\xbf\x28\x7e\x33\xe2\x6d\x3c\xde\x47\x79\x45\x60\x0e\xc6\x57\x68" - "\xa0\xfe\xd3\xb1\xcc\x5e\xfb\x40\xad\x3b\x20\x70\xd4\x06\xc0\xfd" - "\x3b\x41\x56\xf4\xbb\x06\xfc\x0f\xae\x27\xf5\xb7\xb1\x78\x88\xcc" - "\x9f\xb7\xb0\xce\xda\x97\xed\x91\x87\x36\xa3\xbe\x42\xbf\x5b\xa7" - "\x19\x81\xb1\x43\xbf\x5b\x4f\x7d\xea\x66\x0c\xf3\x17\xe6\x4d\xf6" - "\xae\x80\xf5\xf3\xe3\x95\xb4\x8e\x58\x3f\xef\xea\xf6\xdd\x14\x41" - "\x9f\xf0\x6d\x4d\xfd\x6e\xb3\xb8\xb7\x9e\xf1\x2a\xe6\x6b\x97\xc9" - "\xe2\x3b\x61\x8f\xd9\x30\xb5\xf0\x6c\xf5\x0d\x78\x76\x11\x2b\x33" - "\xac\x9a\xf9\x1b\xae\xd3\x83\x5c\xab\x5b\x53\xeb\x83\x44\xbd\x46" - "\xd8\x1b\x14\xce\xf4\xad\xfa\x70\x49\xaf\xa9\xeb\xb4\xcf\x77\xc2" - "\x8a\x15\xb1\x9a\x85\x8b\x57\xe9\x17\xc4\xbe\x14\xad\x59\x14\x13" - "\xb3\x22\x46\x83\xce\x52\x9c\xc7\x0f\x8b\x6f\x52\x1f\x29\xc4\xf3" - "\xca\x97\xe2\x79\xd5\x6f\x72\x8e\x3b\x67\x26\xf5\x9b\x6f\x8c\x0d" - "\xa3\x3e\xdf\x53\x39\x19\x4a\xae\x00\x7e\x85\xf0\x33\xc0\xaf\x18" - "\x6d\x1a\xf3\xad\x24\x12\xe6\x7a\xca\x0f\x45\x5f\xec\x5c\x6a\x7d" - "\x14\xae\x1d\xaa\x22\xdf\xf7\xc9\xe1\x54\x84\xfa\x00\x49\xe5\xd0" - "\xdf\x34\xfa\x86\x2e\x84\x9f\x01\x7e\xc5\xf0\xa3\xf7\x71\x9f\xd0" - "\x7d\xd5\x05\xce\xd7\xd8\xba\x90\xf8\x08\xcc\xc3\xaf\x57\xd1\xef" - "\xbf\xdc\x76\x96\xcf\xa5\x0e\x4a\x3e\xf5\x9b\x63\x42\x3e\x3a\xbf" - "\x0e\x58\x4f\x34\x6e\xf2\xf9\xf0\xa9\x17\x0a\x84\x7c\x74\xbd\x8b" - "\xf8\x3e\xe8\xb7\x1c\xf2\x8b\xf9\x54\x7c\x6a\xdd\x24\x21\x1f\xc5" - "\x4d\x2e\x55\xe9\xee\xb9\x7d\xf8\xd4\xf7\xb4\x42\x3e\xb5\x73\x79" - "\x4e\x79\x7c\xb9\xd4\xf2\x03\x98\x87\x5b\xaf\x62\x7e\x13\x52\xeb" - "\xf3\x21\xbf\x5b\x7f\x8f\xde\xc9\xa9\xa1\x93\xff\x27\xfd\x4b\x8b" - "\x17\x3d\xbe\x78\x79\x1c\x46\xa0\x89\x5d\xb1\x3a\x16\x8f\xcb\x17" - "\xfc\x89\x1e\x56\xcc\x7f\xf9\x25\xf6\x27\x76\x69\x04\xfe\x59\x0a" - "\xfd\x0d\x8f\x0b\x57\xeb\xf1\xf0\xd2\x0a\x3c\x8d\x8f\x0e\x5f\xfd" - "\x92\x18\x8a\xda\xb9\x1f\x6a\x5b\x53\x1b\xac\xd0\x37\xea\x18\xce" - "\x5e\x51\x99\xc9\x05\x8a\xcb\x18\x93\xe2\x94\xd6\x46\x44\xfb\x16" - "\x93\x7f\xc3\x4c\xe6\x9b\xf1\x4a\x60\x0e\xd7\xd7\x2f\x60\xbd\xfe" - "\xa5\x00\xdb\xe2\x45\x30\x67\x54\xc0\xbd\x91\x66\xf2\xd2\x14\x86" - "\x8d\xc3\x42\xa9\x1f\xc2\xd4\x86\x0c\x61\xcd\xa6\x8a\xcb\x08\x2b" - "\x47\x5f\xe0\x70\x4e\x63\xbe\xc2\x39\xe6\x0b\x81\x73\x8c\xf5\x1a" - "\x04\xe7\x26\xb4\x4d\xc1\x39\xc6\x50\x0d\xe5\x32\xee\xac\xc3\xbd" - "\xa8\x70\xae\x81\xf3\x30\x28\x3f\x57\x1c\x17\xee\xb9\xf2\x15\x83" - "\x18\x87\x96\xc5\x9c\xbd\x52\xee\x88\x39\x8b\x71\x66\x92\xd4\x34" - "\x2e\x0d\xe3\x20\x57\x5a\x7c\x42\xee\xea\x07\x79\x5a\x1c\x71\x78" - "\xa8\xdd\xe3\xaa\x4a\x5c\x2f\xc3\xec\x1a\x57\x83\x9c\x62\xf7\xe2" - "\x79\x98\x18\xbb\x17\xed\x5e\x34\x36\x1a\x1c\xf9\x54\xf4\xf7\xc8" - "\xbb\x9d\x2b\x59\x4c\xbd\xab\xaf\xa3\x9f\x4f\x4b\xf2\x42\xc5\xfd" - "\x39\x68\x4b\x83\x73\xe6\xe3\x8d\xbf\x4a\xae\xd2\xf5\xd7\xa2\xff" - "\x27\x67\x9f\x03\x6e\xf7\x39\x7d\x0e\x9c\x81\xc6\x0c\x59\xba\x22" - "\xc0\xb6\x60\x11\xe3\x81\x57\xbf\x63\xf8\x35\xa2\x98\xf1\x85\xab" - "\x15\xfc\x33\x2c\xce\x82\x99\xfc\xa0\x43\x9d\x25\x40\xb1\x74\x05" - "\x0f\xf7\x06\xc4\x2f\x58\x44\xd3\x20\xdf\x06\xe0\x6a\x42\xfd\x8e" - "\x1a\x43\x71\x7f\x24\x27\xf8\x52\xb8\x5a\x38\xef\xee\x14\x7c\x8e" - "\x1f\xe5\x21\x9f\x13\x7f\x8c\x6d\x87\x75\xcb\x71\xf2\x4f\xb5\x15" - "\xd2\x70\x6d\x68\xf3\x33\xc4\x1f\xfd\x74\x0a\x75\x29\x64\xb1\x86" - "\x7e\x98\x29\xfa\x8a\x31\x43\x9a\xeb\xfb\x3c\xf3\x07\xda\x2b\x87" - "\xbd\x14\x3e\x73\x32\xfc\x0b\x17\xc2\xaa\x3a\xf7\xcd\xd0\xe6\x81" - "\xe1\x05\xcd\x87\x1e\x79\x85\xc5\x00\xfc\x21\x17\xca\xa1\x6b\x7d" - "\x39\xd4\x4b\x5a\x75\x59\x6c\x6d\xe9\x0f\xe7\xd1\x2f\x26\x97\x8a" - "\x7c\x12\xf7\xd7\xfe\x40\xf1\x8b\x57\x8f\x28\xd9\xb3\x0e\xfd\xc5" - "\x2a\xa0\x8d\x7f\xf8\x08\xaf\x09\x3e\x77\x94\xd4\x47\x8d\x9d\x84" - "\xd0\xfd\xa5\xc0\x51\xd0\xbf\x4c\x2d\x69\x7a\x1f\x79\x07\xda\x95" - "\xb8\xd4\x1f\x16\x62\xbf\x05\x19\xa3\xaf\x89\x16\x7e\x60\xd8\x31" - "\x3e\x70\xe4\x52\xec\xc7\xc8\x75\x8d\x6a\x6c\x33\x0b\xce\x39\x13" - "\xe1\xf7\x47\x16\xcf\xe2\x85\x3a\xb1\x4c\xf4\x8b\x04\x1c\x0a\x63" - "\xca\xab\x5b\x53\x2d\x3a\xa7\x58\x5d\xc2\x7e\x5a\xcb\x1a\xf4\xd7" - "\x84\x65\x33\xee\xdc\xb4\x97\x71\x10\xcb\x46\x33\x09\x18\xcb\xc6" - "\xa2\x05\xf8\x4f\x4a\xb8\xf0\x1f\xf8\x4f\x78\xae\x4b\x19\x35\xa2" - "\xcd\x94\xf5\x69\x0b\xda\x1e\x26\xc2\xef\x8f\x90\xbf\x44\x8c\xd7" - "\xbc\x41\x49\xf7\x3f\xd6\xfa\x84\xe0\xbe\x68\x4b\xb5\x98\xde\x47" - "\x11\x09\x6d\x6a\x69\x11\xc7\x7e\xf3\xc0\x11\xa0\x67\x35\xaa\x44" - "\x5b\x0b\xb3\xbd\x34\x06\x39\x9d\x1f\x83\xf3\x30\xf1\x1c\xfe\x47" - "\x88\x58\x01\xff\x41\xff\x4d\x6e\x10\xfe\x4f\x31\x93\xd4\x7c\xe1" - "\xff\x2c\xb3\x4f\x5b\xac\x58\x6f\x2e\xd5\x27\x80\xd5\xbd\x69\x33" - "\xb7\x2d\xcd\x80\x31\xb2\x21\x4f\xbc\x99\x5c\xa1\x6b\xd2\xd1\x3f" - "\xd2\xe6\x76\xf5\x2c\xe3\x46\xe0\xc4\x2f\x63\x5f\x6a\xa2\x63\x63" - "\x4b\x82\x7a\x26\xf2\x49\xf4\x03\x41\x7d\x69\xa1\xff\x38\x1b\xf1" - "\xa5\x7e\xc7\xb7\xa5\x15\x50\x7f\xdb\xaf\x6a\xfd\x45\xdf\x71\x80" - "\x33\xb8\xbf\x66\x23\xfa\x93\xa3\xf1\x05\x5a\xb5\x03\xa8\x0f\x39" - "\xc1\x77\xdc\xee\x38\x12\x94\xcd\x31\xdf\x71\xd4\x47\x84\x2f\xe8" - "\x1f\x71\xee\xfd\xc7\xf1\xa9\x7b\xcb\x45\xff\x71\xfc\x75\xbb\x15" - "\xfe\x87\x81\xcc\x55\x70\xd4\xd2\x73\xf4\x21\xc7\x7c\x07\xab\xdc" - "\xfa\x93\x53\x02\x9e\x29\x99\x3f\x39\xef\xe6\x81\x26\x1d\xeb\x13" - "\x4d\x59\x62\xec\x68\xa7\xb4\x03\x30\x16\x32\x59\x9a\x45\xf0\x0d" - "\xd3\x04\xf8\x97\x1c\x29\xac\x91\xb4\xa0\x5d\x2c\x93\xda\xbe\x7e" - "\xb0\xf1\x1d\xd1\xbb\xdc\x61\x49\xd3\xc0\xdc\x8c\x26\xba\x16\xb0" - "\x19\xb8\x6f\x33\xe5\x5b\x4c\x47\x6c\x26\xae\xe3\xf5\xc5\x97\x56" - "\x2c\x5c\x34\x7f\xc9\x32\xbd\xe6\x99\x59\x13\x69\x60\xb4\x70\xcd" - "\xe2\xd8\x45\x74\xaa\xd1\x3c\x33\x79\xc2\x8c\x19\xb3\xe6\xff\x61" - "\xd6\xf8\x59\xb3\xff\x30\x8e\xed\x30\x9c\x15\xb3\x06\x83\xeb\xc5" - "\xae\xd0\xe0\x4d\x2f\x0a\xa1\x6f\x13\x16\xc5\xac\x70\x1d\xe7\x41" - "\xd4\x7e\xa5\xa4\x36\xdb\x16\xfc\xcf\x6c\x64\xcd\xd9\xa2\xed\x8a" - "\x61\x5a\xf3\x16\x6c\x5b\x1a\xeb\x30\xb5\x39\x08\x79\x93\x10\x63" - "\x18\xe7\x13\x15\x8e\x55\x9c\x57\xe0\x5d\x8a\x1d\xf1\x50\x1d\xf6" - "\xb3\xe6\x06\x25\xde\x27\x8c\x51\x96\xd6\xa2\xe0\x87\x0c\x49\x66" - "\x7e\xf8\x9b\x6d\xa2\x5d\x1b\xd3\xc4\x3a\x54\x61\x9e\xd4\xe6\xc9" - "\x52\x4c\xce\x96\x30\x29\xee\x1c\xe9\xd4\x46\x84\x20\x4d\xe9\x03" - "\x1c\xc4\x17\x7e\x7d\xf1\x37\xc5\x81\xdb\x71\xbc\x09\x75\xb1\x00" - "\x05\xcc\xad\xf1\x3e\x2c\xe6\x4d\x5a\x05\xf5\xcf\x3e\xc3\x6e\xf3" - "\x99\x6f\x57\xc2\xd1\x87\x9f\x6f\x57\x51\xfd\x8f\x8f\xe3\x2b\xd0" - "\x17\x1a\xdc\x57\x8e\xb1\x9d\xa0\x1f\x6f\x9a\x61\x4b\xda\x34\xc3" - "\xce\xdb\xe6\x03\x2f\x87\xe3\xb7\xb8\xc7\x7b\x86\xfd\x5b\x9e\xc6" - "\xb5\x80\xbc\xe9\xcc\xff\x57\x31\xee\x47\x9d\x07\x7d\x38\xa7\x89" - "\xc5\xf5\x9c\xb1\xe6\x87\x4b\xf3\xd7\x98\x59\x5c\xcf\xab\x2c\x7e" - "\x2d\x8b\xcb\x4b\x92\xa0\x9c\xd3\xf3\xed\x3e\x9a\x19\xf6\x0e\x9e" - "\xed\x53\xbd\xe6\xd7\x55\xac\x4e\xc4\xce\x55\x83\x89\x12\xed\x28" - "\xf6\x77\x42\x0d\xe8\xeb\x2b\xd9\xc2\x5b\xd1\x37\xc9\xc7\xed\x26" - "\xa5\x26\x0e\xe3\x20\x5d\x1b\x55\xa6\x8f\x70\xbf\x4f\x39\x7d\x58" - "\x10\xbf\x63\x44\x18\x9f\xfe\x2b\x0b\x1c\xf3\xf8\x8c\x91\xd9\x88" - "\xe3\x7c\xfa\x88\x12\x7e\xc7\x48\x48\x1f\x95\x0f\xc7\x3c\x3e\x3d" - "\x62\x23\xbf\x23\x1c\xce\x7f\x1d\x05\x47\x38\xef\x33\x15\xf2\x6b" - "\xf8\x74\xdf\x63\x70\xcc\xe5\xd3\xfd\xc2\x21\x1f\x9c\xdf\x96\x0d" - "\x47\x38\xbf\xdd\x1f\xf2\xc1\xb9\x7f\x62\x2d\xb9\x66\x85\xff\x90" - "\xf6\xe8\x58\xf6\xac\xc7\xa6\xd0\x67\xa5\x8f\x9d\xc5\x9e\xf1\xbb" - "\x28\xf6\x8c\x09\x4b\xd9\x33\x26\xc7\xb3\x67\xf4\x6f\x80\x7c\x5a" - "\x3e\x3d\xc0\x04\xc7\x7c\x3e\x3d\xb0\x08\xf2\xc1\xf9\x1d\x05\x70" - "\x84\xf3\x41\xf0\xac\x70\x38\xbf\x73\x13\x1c\xe1\x7c\x70\x2c\xe4" - "\x0b\xe7\xd3\xef\x5a\x08\xc7\x03\x7c\xfa\xdd\x58\x3e\x9c\xdf\x3b" - "\x09\x8e\x70\x3e\xf4\x61\xc8\x07\xe7\xf7\x87\xc1\x11\xce\xa7\xc0" - "\x3b\x8d\x88\xe0\xd3\x9f\x1a\x03\xc7\x02\x3e\xfd\xf7\xf0\xbc\x91" - "\x70\x3e\x2d\x17\x8e\x70\x3e\x03\xee\x0f\x87\xf3\xa7\xfd\xe0\x08" - "\xe7\xcf\xe0\xbb\x3e\xcc\xa7\xcf\xc2\xe7\x1c\xe1\xd3\x9f\xc5\x77" - "\x86\xf3\x3f\x56\xc3\x11\xce\x9f\xc3\xfa\xc0\xf9\x0b\x78\x1f\x9c" - "\xcf\x85\x36\x18\x31\x86\x4f\x9f\x5f\x09\xc7\x42\x3e\xfd\xc5\x03" - "\x90\x0f\xce\x17\x25\xc2\x11\xce\xa3\xa1\x0d\xc3\xe1\xfc\x4f\xa1" - "\x70\x84\xf3\x65\xf8\xbe\x63\xf9\x74\xbd\x01\x8e\xc7\xf8\xf4\x55" - "\x99\x90\x0f\xce\xe3\xa2\xe1\x08\xe7\x6b\xa0\xfd\xc2\xe1\x3c\x51" - "\x0d\xc7\x63\xee\xe5\x99\xbc\x89\x5f\xef\x4b\xf8\xf4\x37\x54\xfc" - "\xfa\xbe\x70\xdc\x7c\x84\x5f\xdf\x07\xda\x28\x63\x21\xa4\xc3\x71" - "\x4b\x2e\x9c\x87\x0b\xe7\x70\x4c\xdf\x0c\xe7\x11\xc2\x39\x1c\xb7" - "\xc6\xc3\xf9\xc3\xc2\x39\x1c\x33\xf1\x1c\xea\xb8\x03\x8e\xbe\x70" - "\xcc\xb4\xc2\xf9\x58\xe1\x1c\x8e\xff\x3e\x09\x8e\x36\x3e\x7d\x7b" - "\x04\xa4\x47\xc2\xd1\x02\xe7\x70\x7c\xb3\x00\xce\x27\x41\xfe\x20" - "\x38\x9f\x64\x19\x36\xd8\x8c\x7d\x95\x1b\x68\x31\xf3\xc1\xa3\x73" - "\x93\xaf\x11\x25\xf6\x51\xf4\xf3\x0f\x73\xee\xbd\x55\xa4\xf5\x5c" - "\x41\x92\x99\x72\x01\xfb\xce\x11\x1a\x2e\x78\x44\x2e\xa4\xfb\x42" - "\xbe\xbe\xb5\xa4\x0d\x63\x1b\x10\x63\xa2\x99\xc6\x1c\x13\xfc\xd6" - "\xf9\xc2\x3d\x76\xe0\x4d\x63\x30\x7e\x3a\xb4\xd7\x1c\x3e\xb5\x4f" - "\x13\x1c\x2b\xf9\xd4\xdb\xab\xa0\xbd\xe0\x3c\xf0\x73\x38\xc2\xf9" - "\xa3\x7f\x86\xf6\x82\xf3\x17\x26\xc0\xb1\xb2\x35\xd5\x3a\xc7\x4c" - "\xae\x31\x3f\x62\x69\x3c\x8f\xbe\x90\x71\x2f\x25\x1d\x87\x89\x2d" - "\x84\x4f\x8b\x24\xfc\x50\x9d\x99\xda\x2a\x07\x8d\x35\x04\xc4\xc3" - "\xf9\xb0\x21\x66\x7e\x60\x1b\x5d\x6f\x8b\x31\x40\xf8\x8e\x30\x25" - "\xab\xc7\xed\x7c\x15\xb1\xee\x40\x5f\xf5\x7c\x70\xa0\xa7\xeb\xef" - "\xd3\xeb\xf7\x3d\x17\xc5\xae\xfb\x11\xe9\xfa\x0b\x78\xfd\x5c\x00" - "\xfa\x51\x7e\x20\x90\x5e\x37\xb6\xd4\x09\xef\xe8\x83\xd7\x1a\x31" - "\xaf\x99\xb4\x05\xb1\xb9\xc0\xea\xcf\xa7\xfa\x90\x66\xf5\xc8\x4d" - "\xad\xa9\x6d\x30\xff\x5f\x0b\x12\xec\x1f\xe5\xbc\x3a\xac\x82\xf9" - "\xdc\x18\xed\x36\x36\x0f\xea\xb8\x5c\xe6\x84\x29\x5b\x00\x4f\x51" - "\x6f\x86\x79\x55\xa9\x49\x0a\x2b\xac\x22\xed\x96\xdd\xc8\xab\x82" - "\x74\x1a\x86\xb3\x6d\xef\x77\x6c\x1f\x59\xa1\x49\x08\x80\xe7\xb7" - "\x37\x26\x5b\xf9\x6b\x86\x24\xf4\x5f\x84\xe9\xe1\x6a\xb6\x77\x88" - "\xe6\xb1\xb1\x35\xa5\xf4\x7f\x1d\xb3\x53\xb7\x5b\xf0\x5e\x67\x3d" - "\xc5\x9e\x76\x74\x13\x17\xac\x8b\x60\xdf\xe0\xdb\x8e\x7e\xc4\x99" - "\x95\x01\xb1\xa4\x8f\x26\xe1\x63\x2c\x9f\xc8\x74\x5a\x47\x5e\xbc" - "\xd6\x56\x73\x1c\xf2\xbe\x4d\xed\x4f\xed\x6a\x47\x6c\x56\x78\x87" - "\x37\x70\x4e\x55\x92\x48\x9c\xe7\x19\x47\x6e\xcf\x40\x9f\x97\xb6" - "\xa0\xdf\x44\xd8\x32\x2c\xe5\xf6\x4c\x9d\x86\xdf\xa9\x8b\x18\x60" - "\x53\x10\xb6\x96\xbf\xfd\xd4\x83\x56\xe4\xa4\x67\x30\xef\x3a\xce" - "\xf7\xa4\x69\x74\x3c\x51\x1a\x62\x2e\xe0\xf9\x47\x7c\x9a\x51\x65" - "\x6c\x30\x11\x43\x0c\x2d\xeb\x18\x9f\x56\x63\xe3\x7c\x2f\x8c\xcd" - "\x41\x6e\x1f\x8f\xb6\xb9\xcf\x31\x7d\x3c\xc8\x05\xe6\xa7\xf6\x6c" - "\x47\xdc\x60\x68\xcb\x2d\xd0\x76\xc8\xbb\xd1\x0f\xc6\x7c\xbb\x1d" - "\xfd\x94\x6d\x32\x43\x3b\x30\x79\xb5\xa7\x60\xcc\x65\xe1\xb9\xe7" - "\xb8\x81\x23\x0d\x65\x73\xf0\x7b\xa3\x1f\xfa\x7d\xba\x46\xf7\xce" - "\xdb\x30\x0e\x1b\xce\x61\x2c\xaf\xb3\xec\x16\x0b\x3e\x03\x16\x2f" - "\x8f\x8d\x59\xa9\x59\xb5\x38\x61\xd1\xb8\x61\xab\xc3\x35\x31\xf1" - "\x9a\x18\x1a\x03\x9b\x26\xc0\x94\xbf\x6a\xe9\x8a\x58\x0d\xc6\x22" - "\xee\x1c\x0b\x35\x84\x57\x8f\xcc\xa2\x9c\x54\x41\x98\x5d\x25\x57" - "\x67\x8a\x4d\xe4\x39\xcd\x7d\x7d\x81\x8b\x77\x64\xb4\x29\xdb\x71" - "\x9f\x90\x9a\x4b\xd5\x88\x7e\x4f\xfd\x77\x0d\x24\xb8\xbf\x0f\xf4" - "\xb8\x0e\x87\xfd\xc3\xac\x20\xe5\xcc\xde\xd2\x01\xef\xdf\x16\x29" - "\x7c\x77\x63\xbe\xe4\x84\x6b\xec\xbb\x74\xc7\x31\xd0\x3d\xe9\xf7" - "\x17\x78\xd6\x18\x36\xbf\x77\xd0\xef\xee\xbc\x46\x67\xe2\xf3\x86" - "\x98\x81\x23\x2a\xe8\x37\x40\xdb\xbd\xbc\x91\x34\x31\x9f\x9b\x3b" - "\xc6\x46\xa2\xff\x0e\xfb\xce\x51\x06\x2e\x78\x6c\x24\xf7\xce\x5d" - "\xb9\xc9\x7b\x89\xf2\x30\xe0\x82\x4a\x03\xe3\xe1\x3e\x72\xef\xc7" - "\x49\x75\x4a\xa8\xb3\xfd\xe3\x24\x93\x92\xcf\x1c\x9d\xd5\x1c\x16" - "\x5e\x6c\x15\x62\xe6\x1a\x6d\x56\xf2\xf7\x49\x04\x75\xbf\xc2\x96" - "\x41\x93\xea\x5a\x06\x8d\xca\xb7\xee\x98\x36\xd3\x70\xdf\xbf\x90" - "\xc9\xc3\xf9\x1f\x3e\x85\xb7\x6f\x50\x90\xc2\x4f\x27\xa1\x3e\x32" - "\x32\xc3\xaa\x1e\x99\xd9\xb2\xf3\x37\x06\xf4\xc5\xd4\xb6\x73\x5a" - "\x6e\x7b\x70\x84\xe6\x24\xe4\x39\x03\xfa\xd2\x59\x0d\xf4\xdf\xa1" - "\x44\xd9\xf6\xc0\x90\x88\xc3\xed\x19\xca\xe2\xa2\xb1\xcc\x56\x1c" - "\x05\x63\x86\xf6\x27\xdb\xde\x4f\x8f\x14\x11\x78\x36\x39\xdc\x3e" - "\x45\xf9\xf7\x31\x9d\xae\x9f\xf8\x34\xa2\x88\xb4\xa2\x1f\x55\xd0" - "\x47\x8f\x5f\xc8\x22\xfc\xce\x89\xe4\x60\x82\x55\x09\xe0\xa3\x2c" - "\x35\x65\x91\xc4\x1a\xd2\xdf\xf6\x83\x56\xf5\x1e\xdc\xdf\x86\xb1" - "\x56\xce\x86\x50\x3f\x7b\x49\x06\x1a\x8f\x33\xa0\x0c\xb8\x08\xf7" - "\x83\xd6\xb7\x6c\x96\x81\xc0\xf5\xe5\xb6\xdf\x87\x90\xd2\x68\x0b" - "\x31\xea\x72\x49\x9b\x32\x92\x1c\x7d\x3e\x97\xbc\x0d\xba\xcd\xdb" - "\x57\x89\x3f\xe5\xd5\x1d\x5a\x5f\x5b\x87\x56\x65\x5b\xab\x45\xbf" - "\x47\x3c\xff\x83\xb6\x1f\xf2\x6c\xdb\x0a\xad\x5f\x99\x25\x97\x3c" - "\x58\x47\xb4\x6d\x4a\x12\xd0\xb6\x56\xdb\xaf\x4c\x9f\x05\x65\x01" - "\x71\x86\x76\x45\x9f\x6b\xe8\x8b\x0d\xdb\xe9\x76\x1d\x99\xd5\x40" - "\x6c\x6b\xfa\x55\x90\x41\x18\xff\x05\xb9\x2b\xfa\x6d\xe5\x82\x26" - "\x12\x7b\xd0\x6f\x0c\x49\xd7\xa0\x5e\xe8\xab\xe8\xd0\x23\x91\xc8" - "\xfd\x81\xd7\x28\xf0\x9d\x39\x5e\xdb\x6f\x3e\x1e\xb7\x87\x2d\x47" - "\xfe\xcf\xb5\x86\x60\x7c\x1a\x3f\xac\x27\xc6\x9d\x5d\x77\x19\xda" - "\x32\x59\xab\x82\x7c\xfe\x90\x3e\xc0\xd8\x60\x25\xf6\x51\x8f\xcc" - "\x1c\xad\xa7\xf1\x44\x83\x72\x92\x88\x3a\x23\x89\x04\x69\x1e\xa5" - "\x7d\x69\x97\xfd\xe0\x23\x91\x7c\x5a\xff\x78\xb4\xe1\xd0\x34\xc2" - "\xaf\xd1\x3c\x41\x88\xe6\x5f\xe8\xff\xa1\x9a\xc7\x41\x86\x41\x13" - "\xa2\xa8\x6e\x42\xf5\x5c\x7e\x10\xd3\xbb\xf8\xfe\x6d\xbe\x7f\x3c" - "\xc0\xa5\xfd\xb9\x98\x5b\xaf\x0a\xc5\x58\xbf\x57\x09\xd7\xc8\xa7" - "\xef\x6d\xe0\x33\xa7\x8d\x61\xbe\xdb\xb9\x2b\x6d\xbe\xb7\xc1\x5c" - "\xf8\x97\x99\x50\xfe\xd8\x36\x85\xaa\x02\x7e\x26\x76\x3f\x57\x8d" - "\xef\x6d\xcf\x1b\x52\x88\xef\x4d\x63\x9a\xc0\x7b\xcd\x07\x99\xf1" - "\xc1\x13\xd4\xd4\x47\x76\x07\xb4\xaf\x10\xfb\x11\xdb\x03\xdb\x80" - "\xeb\xd0\xf6\xa3\xef\xda\xa1\xf5\x87\xf6\x45\xbf\xab\x01\x49\x0b" - "\xe0\x9e\x9d\x13\xc2\xe0\xda\x80\xb6\xa0\x09\x3a\x8c\x2d\x64\xd4" - "\x5b\x88\x7d\xc7\x04\x0d\xfa\xaf\xdb\x95\x00\x63\x6e\xd0\x04\x98" - "\xcb\x27\x84\x0b\x63\x8b\x60\x3d\xb9\xf4\xbf\x64\xb7\xe1\x3e\x3b" - "\xa8\x1b\xd4\xaf\x02\x7e\x26\x33\xe1\xa2\xdb\x86\x0d\x29\x86\x23" - "\xd6\x37\x94\x4f\x1b\x96\x85\xff\xe1\x5a\x28\xbc\xf3\xd3\xd8\x0e" - "\xd8\x1e\x42\x5b\x3c\x29\xb5\xc5\xd3\x15\x90\x6f\x0c\x97\xf6\xda" - "\x52\x33\xe1\x43\xf8\x34\x8d\xce\x29\xdf\x4a\x29\xdf\xdc\x78\x96" - "\x2f\x23\x94\xe5\x1b\x51\x0e\x72\xe8\x2f\xb4\xf7\xfb\x6e\xda\xfb" - "\xa0\x74\xef\x13\x1a\x76\x6f\xc2\x01\x76\xef\xa0\x72\x48\xaf\x71" - "\xa9\xd3\x45\x29\x7f\xe4\x2c\x96\x7f\xf5\x1c\x96\x5f\x9d\xed\xc8" - "\xa7\xc0\x79\x41\xcc\xf7\x7b\x33\xcb\x97\xdc\xc2\xf2\x0d\xb1\xc1" - "\xf5\xf1\x9d\xea\xa2\x20\x8f\x49\xf7\x2c\x5e\xc8\xee\x79\x5b\xcd" - "\xee\x79\x64\x33\x5c\x5f\x29\xab\x8b\x82\x2c\x96\xf2\xbf\x24\xbc" - "\xf7\x8e\x5c\x96\x3f\x62\x8c\x53\xbe\x6d\x42\x9f\x80\xeb\xb9\xe8" - "\xa5\xca\xbf\xcd\x77\xc5\x14\x96\xef\x71\x13\xf6\x47\xc8\xf3\x57" - "\x2e\x2d\x80\xb4\xf9\xde\x0e\xf8\xcd\x11\x90\x4d\x08\x1e\x41\x76" - "\x21\x5c\xc6\xc8\x0c\xd0\x70\xe3\xf1\x5b\x10\x62\xae\x99\x74\xe8" - "\x00\x77\xed\x6e\xed\x65\x69\xc4\xe2\xb0\xd7\x71\xc0\x1f\x76\x0c" - "\xf7\xf4\x1d\x43\x45\x7d\x6b\xef\x1c\x11\x99\xc1\xb1\xd8\xd3\xd0" - "\x47\x7d\xab\x14\x8a\xc1\x30\x17\xa6\xe0\x35\x2e\x73\xac\x81\x0b" - "\x03\x8c\xbd\x42\x7c\x8c\x89\x75\xa4\x80\xab\x53\x66\xb4\x13\x55" - "\x19\xd4\x10\xf3\x17\xc0\x9c\xaa\x59\x0e\xdc\x42\xa1\x78\x28\xe3" - "\xba\x50\x5e\xae\xce\x9c\xbc\x8c\xc5\xf6\x45\x4e\x86\xd8\x0c\xe3" - "\xd1\x9f\xc6\x89\x5a\x1e\x80\x79\x17\xc1\x7f\x3f\x1a\xcb\xf9\x81" - "\xc1\x51\x6d\x7f\xd1\x99\xdb\x77\x3e\xa8\xe9\x78\x20\x34\xb2\x2d" - "\x78\xac\xc1\xb6\xf3\x37\x91\xb6\xfb\x74\x33\x3b\xde\x19\x62\xb6" - "\x07\x3f\x98\x0b\xcf\x06\xdc\xce\x52\x1e\xe2\x32\x94\x87\x92\x0a" - "\x95\x58\xee\xc7\x49\xf9\xca\xe3\x49\xe5\xca\xe3\x5c\xb1\xf2\xe3" - "\xa4\x5c\x38\x16\x60\xcc\xa0\x7b\xa1\xec\xf7\x8f\x27\x19\x94\xad" - "\x69\x8a\x16\x18\x07\x95\xa2\xbd\x93\x9f\x60\x23\x65\xf9\x36\x72" - "\x2a\xf6\x1a\xb1\x04\x8e\xcc\x82\x5f\xb6\x65\xd0\x84\x29\x96\x41" - "\xd3\x66\xd2\x3a\x07\x4f\xa4\xef\x88\xfb\x54\x8f\x73\xac\xce\x42" - "\x7b\x40\x99\xca\xbb\x73\x38\x5c\x73\x42\xfd\x60\xfa\xd7\x2b\x94" - "\x26\xda\x36\x19\x6f\x14\x83\x8e\xd5\x4a\xf7\xb9\x28\x59\xbc\x2a" - "\xd1\xcf\xa4\x18\xef\x8a\xc6\xb8\x6a\xd5\xe2\x77\xfb\x30\x8c\x73" - "\xb5\xfb\x3a\x09\x82\x5f\x88\x18\xc3\x68\xb7\xe0\xdb\x3e\x3d\x4e" - "\xb2\x4d\x08\x36\x87\x20\x16\xaf\x68\x17\xf5\xd3\x4d\xf9\x0c\xfa" - "\xa4\x44\xfb\xc3\x2a\x2d\xd9\x13\x23\xd9\x1f\xec\xad\x5a\x25\xe8" - "\x94\xe5\x54\xa7\x84\xf9\x8b\xc6\xb8\xb3\x01\x3f\xdb\xf1\x78\x2e" - "\xea\x8e\xc8\xc7\x5a\xd3\x7c\x54\xa2\xee\x87\x1c\xc3\xbe\x6d\x64" - "\x3e\xfc\xf2\x20\x3d\xd4\xac\x78\x27\x56\x4c\xe7\xb7\x37\x9a\xd1" - "\xee\x6e\xe7\xa3\x7f\xdb\x8a\x7b\x2f\xf9\xe8\xdf\xd9\x77\x8c\x2a" - "\xb0\xef\x98\x16\x01\x69\x63\xe1\x37\xce\xbe\xad\xb1\x1a\x7e\x75" - "\xf0\x6b\x80\x9f\x05\x7e\x50\x5e\xa3\xd5\xbe\xad\x89\xc0\x4f\x05" - "\x3f\x3f\xf8\xf9\xc3\x4f\x0d\xbf\x20\x3e\xb0\xd1\x86\x3e\x1a\xf9" - "\xed\x4d\x1a\x90\x7b\x88\x58\xae\xd4\xbe\x3e\xeb\xe1\x7d\x23\x91" - "\xff\x00\x5e\xf9\xf1\x0c\xaf\x42\xf8\x7d\x83\xeb\x10\x77\xf9\x61" - "\xe1\xc5\x96\xa1\xba\x72\xcb\xa0\x89\xe5\x70\x1c\x63\x09\x9c\xaf" - "\x83\x5f\x14\xfc\xa2\x2d\x3b\x26\x44\x81\x0c\xc7\x80\x2c\x2d\xf0" - "\x2e\x75\x66\x45\x3f\xba\x97\x1e\xfe\x83\xfc\xfb\x59\xd9\x7f\x15" - "\x31\x2b\xfa\x46\xe1\x7f\x28\xa3\x00\xce\xd5\x66\x85\x1f\xcd\xd7" - "\x1c\x3c\x41\x2f\xec\xe3\x4c\x81\x74\xad\x59\x35\x30\x8b\xe5\xfb" - "\x8d\xcc\x6f\xfe\xb2\x97\xf4\xf3\x97\x2d\x88\x9f\xbf\x6a\xe9\xe2" - "\x97\x16\xad\x7a\x5c\x33\x6c\xa1\x46\xbb\x38\x66\xe5\xfc\x95\xab" - "\x17\xad\x5e\x44\xa9\x13\x24\x0d\x97\xaf\x61\xc3\xbd\x98\xb6\x43" - "\x8f\x44\x71\xa0\x17\x94\x55\xd7\x91\xdb\x41\x27\x58\x37\x97\x28" - "\x4b\x5a\x8e\x10\xfe\x3e\x9d\x99\xf3\x8d\xfc\x5d\x19\x20\xcc\xb1" - "\x7a\x8b\xd2\x06\x5c\x66\xaa\xc5\x00\x63\x71\xac\xa1\x7f\xf5\x7c" - "\xfe\x58\xbd\x55\x39\xb5\xc1\x40\x92\x2f\x03\xb7\x59\x68\x25\x1d" - "\x0f\x0c\x31\x1f\xab\x2f\x00\x5e\x0b\x1c\x27\xa5\x9d\x94\x58\x6d" - "\xd0\x67\xc7\x46\xe2\xbd\x3c\x70\x1c\xcc\x8f\x3a\x07\xfa\x8b\xed" - "\x78\xe0\xae\x5c\x1e\xc6\x13\xe6\x3f\x0e\xe9\xd3\xf5\x06\x32\x0d" - "\xca\xea\x08\xfe\x4d\x24\x0f\xe3\x89\xbf\xbe\x8e\x2f\xa9\x36\x90" - "\xe3\x4b\x0a\x94\x1f\xc1\xfd\x68\x8f\xe3\xdf\x19\x1c\x85\xe3\x0f" - "\xea\x35\x13\xef\xc1\x6b\x55\x8a\x3e\xe5\x78\x1d\xf5\x88\x0e\xa8" - "\xef\x61\x28\x2f\x79\x35\x51\x89\xba\x96\x6c\x5c\xc7\x05\xf0\x57" - "\x15\x7d\xc6\xe1\xb8\xe6\xa1\xae\xf8\x1e\x07\xe1\xde\x43\x4b\xac" - "\xcc\x26\x7b\x0d\xf1\xc3\x4c\x10\x3b\x10\x33\x8c\x89\x4c\xf7\x2a" - "\xe0\xd0\xae\xe0\x83\xf7\xae\xc1\x6b\xc0\xcf\x5b\xd0\xaf\x5b\x6b" - "\x5a\x9f\x23\x22\x2f\x7e\x43\xf0\xe9\x76\x7b\x25\xf4\x97\x79\xe4" - "\xde\xab\x0a\xd5\x1a\x6c\x53\x6c\x33\xfc\x16\xdb\xe1\xab\x1a\x83" - "\x7e\x23\xb2\x07\x12\xbf\x8e\x1d\x3a\xed\xdb\xe8\x7b\x23\xad\x4f" - "\x8b\xc8\x35\x5b\x82\x74\x5a\x67\x59\x32\x19\x6a\x16\x2d\x5f\xf0" - "\xe2\xd2\x45\x0b\xe9\xe7\xbb\x05\xab\x56\xad\x5e\xb6\x48\xb3\x68" - "\xc1\x4b\xd1\x1a\x7a\x59\xb3\x7a\x15\x64\x59\x1c\xbb\x4a\xb3\xe2" - "\xd5\xe5\x9a\x65\xab\x16\x23\x6b\x5e\x14\x13\xb3\x5a\x1f\xdb\x8f" - "\xb0\x3b\x35\xcb\x56\x2f\x8d\x5d\xac\x87\x3f\xab\x16\x2d\x5f\xa8" - "\xa1\x3d\x61\x15\x14\xb5\x74\xa9\x46\x78\xc2\xaa\xe8\x05\x31\xd8" - "\x39\x96\xbf\x02\x99\x9c\xee\x97\x73\x6a\x7f\xf4\x99\x87\x6b\xba" - "\xae\x2a\xfa\xce\x2e\x52\x01\x16\x65\xea\xb4\xb8\x16\x02\xce\x67" - "\x51\x3d\x2b\xcd\x57\x85\x36\xeb\x37\x07\x12\x55\x33\x8c\x85\xd6" - "\x34\xdf\x72\xf1\xdd\xa8\x0d\x1b\xfd\x52\xa2\xcf\x53\x45\xdf\xf1" - "\x74\x8f\x31\x8c\x09\xba\x56\x26\xcd\xf7\x4e\x6a\xdb\x4a\xeb\x4b" - "\x9c\xed\x66\xd4\x4e\xab\xe8\x3b\x18\xd7\xe6\xc1\xb8\x98\x85\x5c" - "\x41\xf0\xef\xae\x80\x7b\x26\xe3\x3d\xdc\x8e\x69\x63\xe0\xbe\x31" - "\x12\x5f\xef\xab\xc6\xfc\x34\x5f\x9a\xef\x8b\xfc\xa0\x09\x51\x66" - "\x85\x6f\x0b\xd6\xcb\xc3\xdc\xa2\xb9\x0e\xe5\x9e\x2d\x20\x64\x64" - "\x10\xd1\x5e\xdf\x3e\xda\xd4\x3a\x70\x64\x41\x7b\x2a\xe9\xdb\x0e" - "\xe3\xdb\xaa\x24\xf7\xb6\x41\xbf\x58\xf3\x10\xf1\x59\x37\x8d\x28" - "\x0b\xa0\xbf\xa1\xdf\xff\x92\x29\x59\xc4\x18\x05\xba\xb9\xf5\x00" - "\x29\x31\x54\x91\x52\xdb\xbb\x2c\x66\x40\x02\xf2\x6d\xbf\xa3\xe8" - "\xf7\x2e\x79\x1d\x6f\x3f\xfc\x81\xa5\xcf\x21\xe8\x8f\x9a\x18\x72" - "\xaf\xd1\x76\xc9\x60\x4c\xcc\x23\xc6\x78\xa3\x01\x7d\x8e\x40\xbb" - "\xed\x3b\x0e\xd7\x6e\x2b\x81\xfb\xa6\x93\xbe\x70\xbe\x0b\x9f\xb1" - "\x69\x27\x6f\x7a\x3d\x98\xaf\x7c\x7d\x27\x6f\xde\x1c\xcc\x57\x43" - "\x9f\xaa\xdb\x12\xcc\x37\xe0\x5a\x03\x5c\x53\x81\xfd\x54\x1f\x47" - "\x42\xea\x15\x7e\x11\xd4\x46\x30\x89\x9e\x0f\x86\xf3\x48\xc4\x6a" - "\x63\xfc\x4e\x3c\x1f\x02\xe7\x33\xd9\x79\x0e\x9e\xdf\x05\xe7\x51" - "\xec\xfc\x53\x3c\x0f\x85\x73\x3d\x3b\x2f\x23\xd4\x77\x86\xc2\x2f" - "\x85\x9d\x7f\x81\xe7\xd0\xf6\x7e\x19\x86\x38\xac\xef\xd7\x20\x33" - "\xbf\xdd\xc9\x17\x41\x6f\x8b\xaf\xa5\xe3\xe1\xe3\xa4\x68\xb4\x61" - "\xc0\x78\xf0\x1b\x8a\xfd\x1d\x70\xca\xe0\x1b\x81\xc7\xbe\x45\x01" - "\x56\xd2\x17\x38\xd4\xed\xf0\x3e\xdb\xb0\xed\xdc\xda\x6c\x0e\x8d" - "\x0a\x98\x61\xe3\x0d\xfc\xbe\x21\x26\x7e\xc7\xb8\x48\x7e\x5f\x28" - "\xfa\xc9\x05\xac\x18\x41\x0a\x12\xac\xd4\xb7\x31\xf0\x56\x18\x43" - "\x7e\x74\x5d\xb6\x05\x78\xa0\x07\x5f\xa7\xc0\x25\x47\x47\x82\x7e" - "\x55\x3c\x4d\x6b\xc3\x35\xd4\x8a\xab\x8a\xdb\xb6\x9d\x8a\x46\xbe" - "\x30\xf1\x6f\x5c\x5e\xa8\x86\x4b\xd6\x11\x3e\x6c\x88\x69\x5a\x34" - "\x6f\x80\xb9\x4b\xc1\xec\xe3\xfc\x25\x8c\x7f\x4e\x9f\x3b\x6c\x88" - "\x89\x7b\x35\x1a\x63\xbf\x50\x7c\x49\xc2\x79\x3c\x0e\xf0\x60\xad" - "\x2e\xc0\xbe\x63\x62\xc1\xa9\xe8\x1a\xef\xe2\x88\x28\x6e\xf3\x18" - "\x2b\x05\xeb\x84\xfe\x3f\x6d\xf0\x1c\x1b\xbc\x2b\x72\x86\x43\xc0" - "\x0d\x80\xbb\x98\x0e\xbe\x68\xea\xc3\xbf\xaa\x0b\x80\x77\x7a\xc8" - "\xa8\xbd\x46\xca\xda\x71\xac\xf4\x9b\x79\x2a\x9e\x90\xc9\xf1\x36" - "\x43\x80\x85\xfa\x64\x56\xeb\x97\x90\x7b\xf8\x41\xa3\x23\xeb\x15" - "\xfd\x72\xa7\x27\xc2\x3b\xc0\xbb\x1f\xaf\x32\xa9\x38\x78\x8f\x07" - "\x59\xbb\xe1\x7d\x1b\xa1\x6d\x8b\x45\xbe\xef\x5d\xfd\xfb\xd1\x7e" - "\xc3\xad\xd2\x11\xdc\x2b\x7d\x38\x09\xea\xd7\xa1\x0b\xe0\x60\x4e" - "\xc2\x6b\xa7\xb4\x57\x08\x3e\x93\xb5\x75\x3f\xea\x1f\x9f\x0f\x83" - "\x76\x86\xe7\xa3\x2f\x68\xb1\x5d\x21\xef\x46\x7b\x47\xb4\x7b\xf9" - "\xef\x9c\x98\x02\xf5\x33\xf0\xdb\x1a\xdd\xc7\x54\xde\xde\x78\x98" - "\xf5\x8f\xc1\x56\xc8\xe7\xc7\xef\xd5\x45\x42\x1f\x60\xb1\xd9\x77" - "\x3e\x5e\xe0\x14\x9b\x1d\xfa\xc8\xed\x43\x31\x36\xbb\x7b\x7f\x85" - "\xaf\x15\xd3\x98\x48\x7d\x2e\xf1\x01\x76\x8c\x57\x7a\x0d\xfd\x8a" - "\x17\x9f\xd2\xb6\x78\x29\xd3\xdb\x17\x7a\x92\x29\x96\x0f\xba\x76" - "\x87\x97\xe5\x1d\xf1\xd8\x47\xf2\xa0\x5d\xd4\x8d\xe5\xed\xfc\x24" - "\x05\xe3\xe4\xfd\x9f\xc6\xb6\xea\x00\x3e\x9d\x70\x8e\x28\xdb\x61" - "\xde\x7c\xef\xd9\x5c\x65\x38\x8c\x3b\xe0\x2b\x29\x25\xa6\x12\x32" - "\x63\x21\x49\x2e\x6d\x68\x42\x7f\xec\x34\xd6\x11\x1f\x3c\x3e\xe5" - "\xc0\xb3\x16\x25\xc6\x19\xc1\xd8\x46\x65\x2d\xa0\xbf\xee\x9c\xa0" - "\x3f\xfc\xac\x55\x69\x7f\x55\xa7\xc1\x78\x14\xf8\xcd\x38\xa9\x81" - "\xe7\xe8\x37\xab\x66\xe0\x82\xcd\xa0\xa7\x66\x84\xc5\x96\x44\x15" - "\xd3\x18\xac\xe8\x2b\xa9\x34\xfa\x1a\x39\xbb\xf1\x38\x29\x31\x99" - "\x70\xaf\xf5\xde\x92\xea\x63\x84\x6b\xd6\x0e\xb0\xaf\xd2\x0e\xcc" - "\x8e\x21\x41\x30\x4e\x6f\xe3\xa0\x8d\xf9\x55\x42\x6c\xcb\x26\x29" - "\xb6\x25\xc6\x8e\xcf\xc6\x38\x95\x57\xd4\xc4\xe6\x7b\xfb\x14\xc8" - "\xaf\xc2\x38\x96\xbb\x9b\x88\xf6\xed\x18\x12\xf6\x36\x5c\x93\x7d" - "\xaf\xfa\x93\x16\xbf\x0f\xf8\x0d\xb8\xc6\xe2\xd8\x73\x20\x27\x31" - "\x8e\xe5\xf4\x6b\x1a\x72\xec\x8b\x5c\x25\xf6\x3d\xef\xda\xb9\x3f" - "\x5d\x93\x67\x0b\x9e\x98\x62\x0b\x6c\x2c\xb7\x0d\x1b\x62\x30\x2b" - "\xfc\x83\x40\x5e\x6e\x75\x12\xb1\xed\x3b\x92\xc5\xb6\x1f\x70\x5e" - "\x6c\xfb\xb5\xcf\x81\x3e\xff\xce\x5d\xb9\xef\x5e\xc8\x92\xda\xbe" - "\xa2\x73\xdb\xbb\xb6\xf9\xa1\xe7\xad\x4a\x2a\x8f\xe7\x81\x03\xbd" - "\x33\x24\xe2\xdd\xe7\x99\x0c\x78\x2a\x83\x28\x49\x06\x1d\xd1\x18" - "\xe7\xdc\x21\x83\xa4\x95\xa2\x0c\x6a\x98\x0c\x2a\xa8\x0c\x16\x50" - "\x19\x80\x7e\x6d\x5f\xab\x1d\xf8\x56\x02\x09\xca\x4e\x20\x21\x54" - "\x0e\xea\xd7\x30\xde\x4c\xbf\x2d\x09\x04\xd7\x08\x47\xc0\x58\x14" - "\xe5\x10\x24\x93\x43\x82\x20\x87\x76\xa2\x7d\xab\x9d\x84\xbd\x95" - "\xca\xe4\x80\xb8\x3e\xbd\x25\x80\xe7\xbe\xd7\x92\x9c\x7a\x90\xc3" - "\x4a\x41\x0e\x81\x82\x1c\xd6\x82\x1c\x56\x82\x1c\xe0\xfd\x4f\x69" - "\xbd\xc5\xc4\x01\x79\x9d\xe5\xd0\x3f\xa3\x3b\x39\xb4\x3b\xe4\xa0" - "\x5e\x4d\xe5\x00\x5c\x2a\xe1\x69\xb4\x51\xdd\x95\xbb\xff\xf3\x0c" - "\x65\xb8\x0e\xb0\x07\xda\xb4\x64\x6a\x11\x99\x11\x45\x92\x6d\x20" - "\x93\x77\x3f\xb7\x2a\x4b\xaa\x41\x1e\x0b\x85\x18\x48\x4e\xf2\xa0" - "\xed\xbe\x73\x7c\xca\x7b\x90\x47\xf3\x2c\x8e\x93\x09\xfa\x83\x9f" - "\x03\x77\x74\x13\x13\xcc\xf9\x5b\x2e\x94\xc5\x61\x3c\x68\x5c\xff" - "\x06\xfa\xd3\x80\xb7\x40\x3f\x2a\x8d\xbe\x48\xc4\x6f\xba\x67\x2b" - "\x0d\x50\xb6\x76\xe0\x59\xd5\x7f\x93\x33\x25\xc5\x24\x40\x41\x86" - "\xbe\xcd\x91\xa0\x33\x15\x47\x90\x17\xa8\xa1\x8f\xdf\x66\x07\xf9" - "\xd8\x5b\x43\xfa\x6d\x06\x1d\x0a\xbf\xf5\x3a\x7f\xe3\xc5\x58\xae" - "\x3c\xc8\x06\xd2\x55\x36\x90\x4d\xf6\x75\xa2\xdd\x75\x9d\x84\xed" - "\x12\x64\xe3\x88\xf1\xfa\x8d\x96\xec\xae\x22\x7e\xfd\x17\x33\xd9" - "\xd8\x45\xd9\xbc\xaa\x55\x4e\x5b\xac\x21\x1f\x40\x9b\x9c\xd2\x9e" - "\xf3\x52\x36\x6a\xca\x1b\x40\xb7\x4c\x01\x1d\xa8\x9c\xa7\xb2\x09" - "\x08\xf1\x24\x1b\x7b\xde\x60\xab\x5d\x3d\x32\x13\x7d\xf0\x73\x2b" - "\x66\x29\x38\xd0\x97\xda\x41\x2f\x3d\x6b\xb1\x91\x44\xd0\x1b\x12" - "\x2e\x12\x5f\xe3\xac\xcf\x89\xd1\x5c\x48\x7d\x6a\xa3\xbd\x17\xe3" - "\x5a\x18\x6d\x85\xd0\xde\xd3\x0a\xf0\x7c\x37\x3d\xb7\x90\xb5\x73" - "\x89\x0f\x8d\x19\xa8\xcb\x25\x9b\x81\x57\x1f\x7c\x3e\x57\xc9\x65" - "\x8e\xce\xe2\xd5\xa0\xab\xa6\x12\x43\x99\xde\x86\x58\xe4\x5f\x1a" - "\x5d\x82\x3e\x2e\x2f\x25\xc7\xf3\x97\xcb\x5a\xa0\x4c\x0b\xdf\x6e" - "\x87\xb9\x21\x27\x95\x2f\xc4\x18\x05\x0f\xc6\x53\xce\x0d\xfd\x24" - "\xf0\x69\xe4\x1c\x68\xf7\x32\x24\xbd\x05\x1c\x2b\x70\x36\xbe\x1b" - "\xa4\x29\x4a\x97\xb4\xc0\xf5\xa0\x53\x58\x2f\x66\x83\x66\xc7\x07" - "\x31\xb6\x5a\xf0\xb4\xe6\x8f\x92\x2c\xaa\x0c\xd0\x77\x81\x8b\x61" - "\x39\x7b\x79\xa6\x0b\x86\x18\x2b\xac\xd4\xfe\x68\x49\x8e\xf6\xcd" - "\x48\xc0\x35\x5c\x18\xef\x00\xe7\xe6\xa0\xd5\xb8\xee\x03\xfa\x6a" - "\x08\x1f\xfc\x78\x41\xc1\x8b\x16\xa5\x34\xff\x06\x96\x40\x7f\x0d" - "\x99\xac\xe5\x93\x31\x2e\xc4\x71\x78\x2f\xd4\x7f\xde\xad\xb2\x2a" - "\xad\x80\x21\xef\xbd\xb8\x49\x89\xf6\x11\x2b\xf4\xbf\x92\x2f\xfe" - "\x8b\xc6\x71\xac\x55\x0c\xbc\x78\x46\x67\x23\xf8\xfc\xd9\xc3\x89" - "\x0a\xce\xd5\x6d\xca\x2c\x6b\x9b\xef\xed\x79\xc9\xd5\x52\x0c\x3b" - "\xe7\x58\x75\xd8\x97\x0f\xbe\x08\x65\x42\x39\x87\xaa\x52\x94\xbc" - "\x88\xeb\xd7\xd0\x8e\x2d\xc7\x94\xd2\x86\x2b\x24\x09\xfa\x71\x69" - "\x74\x2e\x8d\xdd\x31\x00\xf0\x9c\x5b\x0b\x38\xd2\x01\xfa\x3e\xe0" - "\x08\x8e\xff\x1c\xc0\x0d\x6e\x2d\xe8\xf9\xed\xa0\xe7\x0b\xf8\x81" - "\x1c\x0b\x8f\x73\xa1\x8f\x06\x14\x43\x1a\xc8\x89\xdb\x06\x7d\x14" - "\xf0\xe3\xed\x04\x86\xe3\xbb\x11\x3f\x80\xff\x4e\xd7\x03\x7e\xbc" - "\x0a\xf8\x11\x47\x63\x8c\x86\xe4\x28\x19\x6e\x7c\x50\xb5\x49\x99" - "\x21\xc6\x43\xa6\xed\x7b\xc7\xca\x32\xec\x1f\x51\x29\x58\x57\xa5" - "\x1d\xe3\x6b\xac\xd5\xf9\x94\xb5\x40\x1f\xd9\x39\x2d\x17\xd3\x28" - "\x7e\xbe\x1a\xdd\x8f\x63\x7d\x2d\x12\xdb\x64\xcf\x55\x12\x41\xe3" - "\xed\xfd\x10\xd2\x6f\xeb\x72\x12\x9e\x73\x95\x84\xe5\x2c\x27\x5a" - "\x18\xaf\xca\x1c\xa8\xc3\xbc\x95\x6a\x42\x63\x64\xf8\xde\x7e\x00" - "\xd2\xdd\xc6\xc8\x00\xfe\x1c\x92\x83\x63\x66\x85\xd6\x51\x27\x5b" - "\xc6\x82\x28\x3b\xb4\x1d\xf5\xff\xa6\xb8\x43\xd8\x7f\x14\x5c\xc7" - "\xf8\xfc\x1d\x36\xb6\xb6\xe9\xae\x06\xd0\x49\xfa\xd6\x2b\xee\xf8" - "\x2b\xbf\xfd\x7e\xb3\x3e\x81\x28\xea\xc5\x6b\xc0\x31\x39\x90\xd5" - "\xe8\x14\x92\xc2\x05\xbe\x51\x67\x8c\xbf\x82\x7e\xe8\xbd\x1c\x87" - "\x77\x50\x7f\x7c\xf6\x8c\x05\x0b\xe9\x7a\xa2\xed\x0b\x96\xee\xa9" - "\x27\x11\xfc\x9f\x40\x1e\x4b\xe0\x5d\xeb\x49\x58\x76\x3d\xbc\xeb" - "\xab\xec\x5d\xc5\xf8\xcf\x5c\xea\x2e\xc4\x6b\xf7\xb6\x17\x31\x96" - "\xe0\x9f\x30\x96\xe0\x1d\x85\x80\x61\x77\xf0\xf7\xe1\x5a\x65\xea" - "\xdf\xa7\xd5\x68\xbb\x48\xf0\xb9\x68\x1b\x32\x36\xd1\x3e\xbd\x0f" - "\xfb\x32\x97\xab\x8b\x9c\x5f\x09\x7d\xbb\x35\x1a\xed\x64\x91\xc7" - "\xab\x2c\xe8\x4f\x87\x72\x3b\xb3\x22\xb0\x02\xf9\xd8\xc7\x90\x86" - "\x7d\xdf\xa9\xcf\x57\x60\x9f\xc7\xeb\xb4\xdf\xc3\x7d\xc6\xca\x1a" - "\x82\xe5\x39\x97\x83\xf2\x17\xcb\xaa\x55\x0c\x7a\x1d\xcb\xc2\xbe" - "\x80\x36\x1d\x1c\x6b\x4c\xf6\x85\xb8\x2e\x1d\xc6\x55\x84\x86\x9d" - "\x5b\xd0\xbe\xa4\xc6\x3e\x40\xfb\x0a\xcc\xab\xe8\x7f\x99\xe7\x75" - "\x3e\xd0\xcf\xb0\x9e\xfd\x40\xde\x11\x62\xbf\x80\xb4\x20\xd7\xbe" - "\x31\x60\xbd\x1a\x75\x97\x20\xfc\xdf\xd3\xfe\xe1\x9d\xfc\x06\x6d" - "\xf2\xb8\x66\x2e\x6c\x30\xee\x51\xba\x17\x71\xd3\xde\xec\x84\x99" - "\x0d\x0c\x33\x11\x93\x44\xdc\xa4\xd8\x44\x63\x09\x14\xe2\x9a\xd6" - "\x68\x5a\x47\x2f\x71\xb3\xb4\x41\xc2\xcd\xe9\x7a\x27\xdc\x6c\xe0" - "\xdb\xb9\x61\xee\x70\x33\xf8\x75\x39\x6e\x06\x6f\x91\xe3\xe6\xe0" - "\x46\x57\xdc\xec\x8c\x99\xc1\xa5\xee\xf0\x12\xf4\x95\x7b\xeb\x15" - "\x83\x73\x3d\x63\x65\xb0\xd5\x7b\xac\x0c\xb9\x4d\x8e\x95\x77\x8e" - "\xfd\xdf\x8b\x95\x21\xbb\x65\x58\xa9\xee\x21\x56\xd6\x53\xac\x0c" - "\xe2\xbf\x87\x31\x21\xe0\x47\xce\x12\x0f\x58\xb9\xa4\x9b\xb1\xf0" - "\x27\x4f\x58\x19\x72\x4d\x8e\x95\x83\xb5\x72\xac\x0c\xb9\x28\x61" - "\xa5\x70\xed\x86\x60\x65\x48\xcb\xad\xc1\xca\x90\x16\x8a\x95\x57" - "\x11\x2b\x07\x7f\xd6\x3d\x56\xde\x49\xdc\x63\x25\xa4\x53\xac\xbc" - "\x93\x48\x58\x79\xb1\x1b\xac\x1c\xf2\xbe\x17\x58\x19\x44\xb1\x52" - "\xed\x01\x2b\x97\x40\x5b\x09\xfd\x82\xf6\x3d\x97\xbe\x21\x60\x65" - "\x88\x03\x2b\x7b\xd0\x3f\xbc\x93\xdf\x10\x8f\xfa\x2f\x62\x25\x97" - "\xc1\xf8\x25\x62\x25\x3f\x50\xc0\xca\xa5\x36\x92\x70\x1e\x30\xb2" - "\xa2\x9e\xc6\x4c\xa1\x6b\x81\xe1\x97\xf8\x1c\x62\xd1\x6f\x0c\x87" - "\xa0\xbd\x8c\xe6\x02\x8a\x4d\x74\x4d\xeb\x54\xc4\xaa\x02\xc8\x9b" - "\xe5\xe0\x9d\x14\x3b\xcf\x0b\xd8\x39\x47\xc0\xce\x79\x3f\x02\x3b" - "\x9f\x47\x59\xde\x75\xaa\x4d\x29\x62\xe7\x76\xc0\xce\xbb\x28\x7f" - "\xc0\xef\x99\x0c\x3b\xef\x1d\x2f\xd6\x0b\x6d\x97\xc6\xd8\xb7\x08" - "\xab\x57\x53\x67\x1c\x7d\x0a\xcb\x0b\x1d\x6c\x58\xd2\x40\x1c\x58" - "\x3a\x47\xc2\xd2\x5a\xc5\x3d\x8d\x9e\x71\x34\x34\xd2\x81\xa3\xa9" - "\x80\xa3\x5f\x3b\xe1\x28\xda\x0c\x10\xf3\x00\x47\x5b\x29\x8e\x7e" - "\x20\xe0\xe8\xdd\x4f\x9f\x99\x03\x38\xfa\x94\x88\xa3\xa1\x1b\xad" - "\xa9\x59\x56\x6b\x5a\xf7\x38\xda\x4a\x71\x54\x7f\xf3\x71\xb4\xc8" - "\x05\x47\x41\x67\xc5\xf8\xc9\x6e\x71\x54\xec\x8f\x14\x47\x53\x24" - "\x1c\xa5\xed\x7a\xf7\x95\xb2\x28\x68\xf7\x28\x3d\xd5\xdb\x1c\x38" - "\xaa\x2f\x60\x38\x0a\x69\xf4\x3b\xff\x2a\xc0\x51\xe8\x7f\xc9\xa5" - "\xe8\x27\x90\x44\x42\x1d\xd5\x88\xaf\x7b\x60\xcc\x60\x1b\x39\xf0" - "\x74\x09\x8c\x19\xc4\x98\x66\x18\x33\x80\xa3\xf3\xae\xa9\x09\x1d" - "\x2f\x69\x30\x5e\xea\x3d\xc4\x67\x13\xd7\xe2\x7a\xc4\xd3\x7b\x26" - "\xcb\xf1\xf4\x9e\x78\x39\x9e\xde\x33\x4a\xc2\x53\xe1\x1a\xe2\x29" - "\xc8\x0c\xda\xa7\x0e\x31\xb5\x77\x78\x7a\xcf\x24\x07\x9e\x2a\x05" - "\x3c\x5d\xd2\x3d\x9e\xd2\xef\x7e\x1e\xf0\xd4\x19\x1b\x3c\xe3\xe9" - "\x3d\x93\x24\x3c\xbd\x77\xa8\x03\x4f\x4d\x9e\xf0\x34\x74\x8a\x7b" - "\x3c\x85\x74\x8a\xa7\xa1\x53\x1c\x78\x6a\x72\x83\xa7\x4f\x39\xe3" - "\xa9\x26\x90\xe1\x69\x01\xc5\x51\xc4\xd4\xb2\x16\xe8\x1f\x38\xe6" - "\x62\xb3\x28\xa6\x72\x80\xa9\x80\x05\x4a\x8c\xd7\x84\x6b\xe9\xdd" - "\x61\x2a\xc3\x5c\x33\x41\x5c\xc5\xb1\x99\x3c\x0d\xf4\x5d\x98\x8b" - "\xa0\x4d\xe8\xdc\x2b\xb6\xdf\x1e\x27\x7c\x9d\xbf\x46\x8d\xdc\x4e" - "\xd6\x57\x38\xb1\xaf\x34\x6b\x71\xfd\xad\xac\xaf\x78\x27\x4b\x8d" - "\xda\x13\xb6\x7a\xd2\xdd\xcf\xa0\xee\x3e\x9b\x28\xd7\xce\x06\x7c" - "\xd5\xa1\xee\x9e\xef\xa2\xbb\xe7\x77\xd6\xdd\xcf\x75\x8d\xa3\x5e" - "\xe9\xee\xcf\xa2\x0c\x87\xf6\x97\xe3\xe8\xd0\x40\x39\x8e\x86\x6d" - "\xc1\x7a\x31\x1c\xcf\x77\xaf\xbb\xd3\x71\x3e\x74\xae\x43\x77\x37" - "\xc9\xf1\x53\xd2\xdd\xc3\xc6\x79\xc6\xd1\xa1\x9b\x64\x7c\x74\x9e" - "\x80\xa3\x2f\x0a\x38\xfa\xa2\x84\xa3\x67\x3f\x17\xf9\xe8\x7d\xfb" - "\x4e\x9b\x9c\x71\x74\x68\x89\x03\x47\x2b\x3b\xe3\xa8\x88\xa1\x34" - "\xde\x3c\x94\x83\x36\xac\x03\x80\xd3\x87\x5f\xd4\x53\x5b\x14\xda" - "\x05\xd1\x06\xeb\xb0\x41\xb5\x8a\x78\x7a\x8d\x24\xcd\x41\x3c\xcd" - "\xa2\x78\x1a\xa0\x20\x0b\x00\xfb\x06\x88\xf1\xe8\x77\xc7\x91\x10" - "\x1c\x8b\x68\x5f\xe2\x5e\x65\xf1\x23\x45\x3b\x13\xbc\x2f\xfd\x56" - "\x3f\xf7\xa2\x80\xa9\x18\x57\x3b\x90\xc6\xa4\xd7\xbe\x1d\xe7\x86" - "\x9b\xae\x05\x4c\x4d\x70\xe2\xa6\x30\xf6\x3f\x78\xd1\x15\x53\xef" - "\x7f\xac\x0c\xfb\x0a\x62\xaa\x4c\x8f\xcf\xff\x19\xe8\xf1\xf7\x6f" - "\x93\x63\xe9\xfd\x45\x72\x2c\xbd\x7f\x8d\x84\xa5\xc2\xb5\x1b\xc2" - "\x4d\xef\xcf\xb8\x35\xdc\xf4\xfe\x0c\x49\x8f\x0f\x5b\xe6\xc0\xd2" - "\x0a\x4f\x58\x3a\x34\xc3\x3d\x96\x42\x3a\xc5\xd2\xa1\x19\x0e\x2c" - "\xad\x70\xa3\xc7\xcb\xb0\x74\xd8\xd3\x0c\x4b\xf3\x19\x37\x35\x89" - "\xdc\x34\xff\x17\xa8\xc7\x0f\xeb\xb4\xff\xb1\x3b\x3d\xfe\x4c\x03" - "\xc3\x4f\xc4\x27\x11\x43\x25\x3d\x3e\xdf\xb3\x1e\xdf\x0d\x86\x7a" - "\xc5\x45\x29\x86\x3e\xf0\xb4\x1c\x43\x1f\x98\x2d\xc7\xd0\xe1\xa7" - "\x5c\x31\xb4\x33\x7e\x3e\xb0\xc3\x1d\x76\x32\x3d\x7e\x78\xac\x67" - "\xdc\x7c\xc0\xe0\x3d\x6e\xfe\xea\xa2\x1c\x37\x7f\xa5\xfa\xbf\x81" - "\x9b\xda\x95\x32\xdc\x54\xf7\x10\x37\x7f\x12\x9d\x5e\xeb\x62\xff" - "\xd4\xba\xd8\x3f\xb5\x4e\xf6\x4f\xed\x0d\xb4\x7f\x6a\x6f\x91\xfd" - "\x53\x5b\x2c\x71\xd0\xe1\xfb\xba\xc7\xcd\x07\x8a\xdd\xe3\x26\xa4" - "\x53\xdc\x7c\xa0\x58\xc2\xcd\xee\x38\xe8\x88\xd7\xbd\xc0\xcd\x9f" - "\xb9\x4e\x3f\xa2\x4b\xfb\xa7\x3b\x9d\x1e\x71\x93\xe2\xa5\xc9\x45" - "\xa7\x9f\xed\xac\xd3\xe7\x4b\x3a\xfd\x14\x86\x5b\x46\x5b\x86\x5c" - "\xa7\xbf\xe1\x38\x3a\x72\x97\xd5\x61\x0f\xfd\x33\xe0\xe8\xc8\xdd" - "\xf8\x6e\x56\x87\x3d\xf4\xc1\xa1\x62\xbd\x98\x4e\xbf\x9d\xb0\x7a" - "\xb9\xd1\xe9\xe9\x9a\xd9\x91\x57\x1c\x3a\xbd\xc9\x55\xa7\x1f\xfd" - "\x99\x67\x4c\x0d\x0f\x72\xab\xd3\xa3\xfe\x4d\x31\x55\x4f\x31\xf5" - "\xfa\x4e\x67\x4c\x1d\xf5\x10\xc5\xd4\x27\x44\x4c\x0d\xd7\x59\x61" - "\x6c\x5a\x7d\xbb\xc7\x54\x2c\x47\xc2\xd4\xe8\x9f\x06\x53\x0d\x3d" - "\xc7\x54\xe7\xbd\xac\x1f\xc0\xbb\x3b\x30\x95\xb6\xf1\xa8\xd2\xb2" - "\x28\xc4\xd4\x68\x17\xfd\x3e\xdf\xbd\x7e\x7f\x9a\x28\xb1\x7d\x44" - "\xfd\x1e\x65\x40\xf1\xe6\xa6\xea\xf7\xa3\x87\xc9\xb1\x75\xb4\x4e" - "\x8e\xad\xa3\xfb\x4b\xd8\x2a\x5c\xbb\x21\xfa\xfd\xe8\xb0\x5b\xa3" - "\xdf\x8f\x0e\x93\xb0\xf5\x41\x45\xf7\xd8\x1a\x1e\xea\x1e\x5b\x21" - "\x9d\x62\x6b\x78\x68\x97\xd8\xfa\x84\x33\xb6\x3e\xd8\x28\x62\xab" - "\xa4\xdf\x43\xff\xc0\xf1\x17\x9b\xd1\x7b\xfd\xfe\xc9\x5b\xad\xdf" - "\x3f\x68\xf1\x4a\xbf\xdf\x09\x38\x0b\xba\xf8\xda\xcf\x40\xbf\x7f" - "\x5a\xd0\xef\x2b\x73\x5d\xf4\xfb\xdc\x4e\xfa\x7d\xe2\xd3\x02\xa6" - "\xc2\x98\xa2\x98\xfa\x62\x7e\xef\xf5\xfb\x67\x50\x86\x11\x57\xe4" - "\x98\x1a\xd1\x28\xc7\xd4\x87\xd7\x63\xbd\x18\xa6\xe7\xba\xd7\xef" - "\xe9\x38\x7f\x68\x9c\x4c\xbf\x87\xfa\x75\xd6\xef\x1f\x7e\x48\x86" - "\xa9\xf3\x9c\x31\xf5\xa1\x68\x19\x4f\x85\xf7\x42\x4c\xdd\xff\x35" - "\xc3\xd4\x77\xbf\x76\xc2\xd4\xe9\xef\x0a\x98\xfa\x2f\xbb\x4e\xcf" - "\x72\xc6\xd4\x87\x0e\x88\x98\x4a\xf1\x72\x9e\x55\x99\xac\xf3\xbc" - "\xde\xe4\x00\x94\x8d\x7b\xa4\xb0\xcc\x83\x5f\x47\x77\xbf\xde\x44" - "\x27\x5f\x6f\xe2\x58\x6b\x12\x6b\x26\x25\xd5\x19\x74\xad\x49\x76" - "\x1c\x09\x0a\x58\x4f\x86\x66\xb7\x33\x3f\x02\x34\xb6\xc7\x75\xf7" - "\x3e\x04\xe6\x3e\x27\xe1\x2c\xfa\x11\x00\x8c\xd5\xbe\x75\x9d\xad" - "\xfd\x01\x79\x77\xf6\x19\x20\xf2\x26\xc0\x83\xa3\x5f\xbb\xe2\xec" - "\xaf\x47\x95\x61\xff\x99\x13\xed\xa2\xf3\xe7\xfe\x0c\x74\xfe\x5f" - "\xbf\x26\xc7\xd7\x5f\x17\xca\xf1\xf5\xd7\xcb\x24\x7c\x15\xae\xdd" - "\x10\xee\xfa\xeb\x8d\xb7\x86\xbb\xfe\x7a\xa3\xa4\xf3\x3f\xbc\xc0" - "\x81\xaf\xe5\x4e\xf8\xfa\xb5\x33\xbe\x3e\xa4\xa7\xf8\xfa\xb5\x2b" - "\xbe\x42\x3a\xc5\xd7\x87\xf4\x0e\x7c\x2d\x77\xd1\xf9\xbf\x76\xc5" - "\xd7\x47\x26\x53\x7c\x85\xbe\x20\xe7\xae\xb9\xdd\xeb\xfc\x95\x3f" - "\x37\x9d\xff\x91\x49\x5e\xe9\xfc\x88\xa9\x4b\x19\xa6\x22\x66\x89" - "\xb8\x2a\xe9\xfc\xb9\x1e\x75\xfe\xee\x70\xd5\x2b\xae\x4a\x71\xf5" - "\xd1\xc9\x72\x5c\x7d\xf4\x49\x39\xae\x3e\x56\xea\x8a\xab\x9d\x31" - "\xf5\xd1\xd7\xdd\xe1\x29\xd3\xf9\x1f\x4b\xf4\x8c\xa5\x8f\x1e\xf1" - "\x1e\x4b\xff\x5f\x8d\x1c\x4b\x1f\xb5\xfe\xdf\xc5\xd2\x31\x6b\x64" - "\x58\xaa\xee\x21\x96\xfe\x24\x76\x80\x31\x9f\xc9\xb1\xf4\x31\x95" - "\x1c\x4b\xc7\x1c\x95\xb0\x54\xb8\x76\x43\xb0\x74\x4c\xf9\xad\xc1" - "\xd2\x31\xe5\x12\x57\x7d\xec\x60\xf7\x58\xfa\xe8\x31\xf7\x58\x0a" - "\xe9\x14\x4b\x1f\x3d\x26\x61\xe9\xc5\x6e\xb0\xf4\xf1\x6d\x5e\x60" - "\xa9\xdc\x0e\xe0\x8a\xa5\xb7\xdc\x0e\xf0\xb8\xc7\xfd\x0f\x6e\xed" - "\x00\x22\x96\x3e\xdd\xd9\x0e\x80\xf8\x4a\xed\x00\xd0\x5e\x22\x86" - "\x51\x3b\xc0\x24\x86\x65\x46\xdb\x26\x99\x1d\xe0\xc6\x63\xeb\x6f" - "\xf6\x5a\x1d\xf6\xd4\x54\xc0\xd6\xdf\xd0\x78\xa8\x56\x87\x3d\xf5" - "\x77\xe3\xc4\x7a\x31\x3b\xc0\x9f\x09\xab\x97\x1b\x3b\xc0\x04\x5a" - "\xde\x35\x99\x1d\xc0\x09\x6b\x6b\x15\xbf\xbd\xe2\x19\x67\xc7\x86" - "\xca\xec\x00\x55\x12\xce\x5e\xc7\x35\xe9\x80\x83\x14\x67\x83\x9d" - "\x71\x76\xdc\x34\x8a\xb3\x13\x44\x9c\x1d\x1b\xd5\x0a\x63\xb3\xd5" - "\x5b\x9c\xc5\x35\xd2\x5f\x47\xdd\x1a\x9c\x2d\xf4\x02\x67\x9d\x6c" - "\x03\x47\xa1\x3d\x1c\x38\x4b\xdb\x7d\xdc\x77\x65\x73\x10\x67\xa3" - "\x5c\x6c\x03\xb9\xee\x6d\x03\xa7\x6e\x85\x6d\xe0\xb7\xe3\xe5\x78" - "\xfb\xdb\x58\x39\xde\xfe\x76\xb8\x84\xb7\xc2\xb5\x1b\x62\x1b\xf8" - "\x6d\xe4\xad\xb1\x0d\xfc\x36\x52\xc2\xdb\xdf\xdd\xdd\x3d\xde\x8e" - "\x0d\x73\x8f\xb7\x90\x4e\xf1\x76\x6c\x58\x97\x78\x3b\xc1\x19\x6f" - "\x23\xfb\x8b\x78\x2b\xd9\x06\x72\x05\xdb\xc0\xa6\xee\x6d\x03\x95" - "\x1e\x6c\x03\x93\x6f\xb5\x6d\x20\xd2\xdf\x1b\xdb\x40\xdb\x4e\xb6" - "\x6e\x7f\x2d\xae\xdb\x9f\x0b\xf8\x3b\xf3\x73\x68\x83\xee\xd7\xed" - "\x27\x8a\xeb\x4f\xa3\xb2\x04\x9c\xcd\x72\x6b\x1b\x38\x53\xe7\xd9" - "\x36\x70\xa6\xc2\x79\xfd\xe9\xf8\xdb\xe4\xdf\xad\xc6\xf7\x17\xbf" - "\x5b\x9d\xf9\x02\x71\x76\x32\x8d\xd7\xc2\x65\x4e\xb0\x50\xfc\x57" - "\x4c\x0e\xc2\x7a\xba\x5b\xc7\xff\x01\xe7\xfc\x2d\x6b\xfc\x62\x87" - "\xad\xa0\x1c\xf1\x36\x8b\x70\x7c\xb4\x2f\xfa\x1a\xa7\xb6\x82\x67" - "\xb1\xef\x4d\x3a\xe5\x8c\xbb\xc7\x2f\x38\xe3\xee\xf8\x4c\x11\x77" - "\xed\x80\xbb\x1f\x55\x65\x31\xfb\xeb\xf3\x6c\x6d\xea\x81\xe7\x9d" - "\xd6\xa6\x7e\xfe\x89\x80\xbb\x13\xb6\x9d\x36\xc3\xfb\x77\xb5\x7e" - "\x0a\xee\x3f\x74\xa1\xa7\x6b\x50\xb3\xdc\xae\x9d\x12\xf0\xc9\xed" - "\xfa\x29\xa8\xab\x7a\xb7\x30\x56\xed\x30\x4e\x77\x3b\xad\x9f\xca" - "\x4e\x80\xf1\x2c\xec\xbd\xea\x72\x1d\xea\xf3\xd2\x3a\x54\x3e\x73" - "\x42\x38\xce\x6f\xdc\x8e\x09\x96\x76\x3e\xda\x87\x0f\x9a\x10\x8e" - "\xcf\xef\xe8\x80\x79\x67\xa2\xce\x47\xd0\xeb\xd4\x80\x3d\x03\x58" - "\xbb\x4f\x28\xb1\xc3\x5c\x63\x87\xb9\x06\x64\xa6\xb6\x21\x37\xd9" - "\x39\x21\x28\x1b\xf4\x3c\x5b\x2a\x8d\xd5\xda\x2f\x1d\x74\xbd\x3d" - "\xa8\xe7\x5d\x85\xb1\x91\xac\x55\x62\x7d\x44\x1c\x0d\xa8\x83\xf7" - "\xb8\xda\x35\x97\xb3\xfd\x20\xe1\xa8\xe1\xa9\x33\xf0\xcc\x89\x27" - "\xca\xb0\xef\xea\xa4\x3d\x05\x94\x33\x7b\x58\x2b\x8b\x75\x61\xfe" - "\x17\xa1\x2f\xdc\x00\x9b\x84\x73\x7d\xe4\xb8\x3e\x69\xb0\x1c\xd7" - "\x27\x4d\x95\xe3\xfa\x24\x85\x84\xeb\xc2\x35\xc0\x75\x7b\x2a\xe3" - "\xd1\x30\xf7\xf5\x92\x47\x4f\x0a\x11\x71\x9d\x13\x70\x3d\xa7\x07" - "\xb8\xde\x25\x8f\x76\xc2\x25\xcf\xb8\x3e\x29\x44\xb2\x49\x4c\xba" - "\xe6\x76\x8d\xec\x05\x67\x5c\x1f\x9f\x4d\x71\xfd\x82\x2b\xae\x43" - "\x3a\xc5\xf5\xf1\xd9\x1e\xf7\x13\x5c\x70\xfd\x9e\x36\xf9\x3c\xc5" - "\x75\x93\xb0\x46\xb6\xdc\x8b\xfd\x04\x26\x86\xe9\x22\x96\xa3\xbd" - "\xea\xd6\xda\x24\x26\x9b\xbc\xb1\x49\x50\x2c\x6f\x60\x58\x8e\xd8" - "\x28\xe2\x79\x4f\xf6\x13\x74\x87\xe7\x22\x6f\x46\x3c\xf7\xc4\x9b" - "\xe5\x78\xfe\xc4\x79\x39\x9e\x3f\x71\x51\x8e\xe7\x4f\x9d\x97\xe3" - "\xf9\x53\x26\x57\x3c\xef\x8c\xe5\xff\x3a\xca\x1d\x8e\xeb\x9f\x45" - "\x1b\xc5\x53\x9b\x3c\x63\xf8\xbf\xea\xbc\xc7\xf0\x29\xb3\xff\xcf" - "\x61\xb8\xda\x15\xc3\xa7\x64\x20\x06\xd9\xd3\x5c\x30\x7c\x89\x80" - "\xe1\x02\x8e\xec\xa9\x17\xb8\xb0\x2b\x86\x37\xc0\x7b\x74\xa3\x8f" - "\xdb\xbe\x77\xc5\xf0\x27\x5f\x93\x61\xb8\xba\x1b\x0c\x5f\xc2\xec" - "\x20\xb2\x75\xb9\x1e\x6c\x21\xf0\x1e\x07\x76\x7b\xe0\xe6\x62\x9b" - "\x39\xd7\x47\x8e\xe1\x4f\x5e\x94\x63\xf8\x53\x6a\x39\x86\x3f\x79" - "\x4a\xc2\x70\xe1\xda\x0d\xe1\xe6\x4f\x56\xde\x70\x6e\x2e\xf6\x8f" - "\x2e\x31\xfc\xc9\x4a\x89\x9b\x3f\x75\xb4\x7b\x0c\xff\xd7\x28\xf7" - "\x18\x0e\xe9\x14\xc3\xff\x35\xca\xe3\x3e\x87\x4e\x18\xfe\xfb\x5d" - "\x5e\x60\xb8\xdc\x16\x22\x62\xb8\x60\x0b\xd9\xe3\x64\x0b\xb1\xa7" - "\x32\x5b\xc8\xee\x7a\xd6\x37\x06\x28\x58\x3f\x85\xfe\x13\x92\xa3" - "\xec\x5a\x77\xdb\xdd\x2b\x3b\xc8\xef\xb3\xbc\xb1\x83\x50\xfc\xc6" - "\x3d\x0e\xcf\x01\x6e\x97\xf7\x70\x8f\xc3\x14\x71\x8f\x43\x86\x87" - "\x3d\x0e\x02\x9e\xcf\xfb\x11\x78\x4e\xf7\x38\x4c\xdd\x2f\xb7\x31" - "\x4f\x3d\x28\xda\x98\x19\x9e\xcf\xfc\x48\x8e\xe7\x33\x8f\x39\xf6" - "\x3c\x00\xe6\x1b\xf5\xdb\x3b\xed\x79\x70\x60\x3b\xb5\x83\x4e\xeb" - "\x6f\x78\xb6\x9a\x38\xf0\x7d\x8e\x84\xef\x50\xd6\x32\x19\xb6\x57" - "\x39\x63\xfb\xb4\x87\x65\xd8\xfe\x75\x96\x7c\x7d\x44\x95\xde\x09" - "\xdb\xc5\x3d\x0f\xd3\x1f\x3a\x5d\xd9\x0d\xb6\xc3\xfd\x3d\xdf\x23" - "\x76\x63\xb1\x5d\xdc\xdf\xe0\x16\xdb\x9d\xf7\x37\x38\xad\x7f\x40" - "\x6c\xa7\x71\x2d\x06\xb9\x60\xfb\xda\x68\xa5\xfd\x24\x8c\x07\xc0" - "\x75\x1c\x23\x76\x1e\xb0\x9d\xb6\xf7\xf4\xa5\xce\xd8\xde\x91\xca" - "\xb0\xfd\xed\xfa\x1f\x8f\xed\x0e\x3e\xec\x8c\xed\x4f\x20\xb6\xcf" - "\x58\xcc\xf6\x5f\xa4\xf4\x6c\xff\x85\xcb\xfa\x8c\xb7\x7b\x60\x7f" - "\xe9\x12\xe3\xdd\xd4\x4b\x8e\xf1\x33\x4e\xc8\x31\x7e\x46\x8b\x1c" - "\xe3\x67\xec\x97\x30\x5e\xb8\x76\x43\x78\xfa\x0c\xc3\xad\xb1\xbf" - "\xcc\x30\x48\x18\x3f\x73\x77\xf7\x7b\x2f\xa6\x8d\x75\xbf\x36\x03" - "\xd2\x29\xc6\x4f\x1b\xdb\xe5\xde\x0b\x99\xbd\xfb\xe9\x2d\x6e\xf7" - "\x5e\x94\xff\x74\x6b\x33\x9c\xfb\x8a\xab\xfd\xa5\xf7\xb6\xef\xa7" - "\x3d\xc6\xca\xf1\x64\x7f\xc1\xbd\x17\x6b\xcf\x39\xed\xbd\xa8\xec" - "\x7e\xef\x45\xe2\xec\x1e\xda\x5f\xba\x58\x9b\x71\x66\xa6\xf3\x7a" - "\xb7\x67\x5e\x97\xe3\xfb\x33\x5b\x1c\xf8\xfe\x0c\xe2\xfb\xb3\x7b" - "\xe5\xf8\xfe\x6c\x2e\xd6\xd3\xdd\x5e\x8c\x0f\x64\xdf\x15\x9f\xf9" - "\x4e\xbe\x56\xc3\xc5\xfe\xf2\x0c\xf6\xbd\x67\x9f\x96\xe1\xfb\xd7" - "\xce\xf8\xfe\x87\x20\x77\xdc\x1d\xed\xde\x74\x4d\xf1\x3c\xa7\x3d" - "\x6d\xd3\xc5\xf5\x6f\xb3\xee\x3e\xad\x83\xf7\x37\x7b\x58\xeb\x36" - "\x8f\xad\x75\xa3\x6b\xdb\xd0\x0e\x0e\x65\x1d\x9e\xa7\x57\x26\x45" - "\xf1\x1c\xae\x75\x73\x5d\xe7\x86\x6b\xdf\x70\xad\x5b\x69\x74\x86" - "\xc7\x75\x6e\xd8\x37\x3d\xad\x75\x83\x7a\x07\x51\xac\xbf\x2c\x60" - "\xbd\xb0\xd6\x2d\x3b\x4e\x5a\xeb\x26\xc3\x7a\x37\xeb\x87\x8f\x7e" - "\x9d\xe2\x9e\xc7\x27\x4b\x58\xdf\x8e\x3c\xfe\x37\x2e\xb6\x18\x2a" - "\x83\x59\xba\x9f\xd4\x16\x43\xb1\x7e\xf6\xb4\x32\xec\xc7\x73\xf4" - "\x6e\x6c\x31\x9d\xd7\x38\xff\x74\xb6\x98\xd9\xfb\xe4\x18\x3f\xdb" - "\x24\xc7\xf8\xd9\x5b\x24\x8c\x17\xae\xdd\x10\x8c\x9f\x9d\x77\x6b" - "\x6c\x31\xb3\xf3\x24\x5b\xcc\xb3\xeb\xdd\xae\xbf\x93\xd9\xd8\xff" - "\x10\xea\xde\xc6\xfe\x07\x61\xfd\xdd\x1f\x42\x3d\xee\x09\xe9\xf4" - "\x4d\xf3\x8f\x8b\x98\x8d\xbd\x17\x7b\x42\x2a\x7f\x6e\xb6\x98\x3f" - "\x7a\xf4\xff\xe5\xc9\x16\x43\xd7\x36\x9f\xc3\xf5\x21\xde\xed\x09" - "\xe9\x0e\xdb\x1d\xdc\xbd\x8b\x6f\x98\x72\x6c\xd7\x2d\x92\x63\xbb" - "\x6e\xb1\x1c\xdb\xe7\xac\x94\x63\xfb\x1c\xbd\x2b\xb6\x77\xc6\x75" - "\xdd\x51\x77\x98\xae\x7f\x06\x6d\x31\x73\x34\x9e\xf1\x5c\x57\xed" - "\x3d\x9e\x3f\x77\xe5\xff\x34\x9e\xab\x5d\xf1\xfc\x79\xed\x4f\x6a" - "\x97\xa1\x78\xfe\xc2\xdd\x32\x3c\x57\x77\x83\xe7\x3f\x99\x5d\xe6" - "\x85\xd5\x72\x3c\x7f\x21\x5f\x8e\xe7\x2f\xcc\x95\xf0\x5c\xb8\x76" - "\x43\xec\x32\x2f\xc4\xde\x1a\xbb\xcc\x0b\xb1\x12\x67\x9f\xf3\x74" - "\xf7\x78\xae\x6b\x70\x8f\xe7\x90\x4e\xf1\x5c\xd7\xe0\x71\x3d\x75" - "\x27\x3c\x9f\xfb\x90\x17\x78\xee\x76\x8d\xca\xcf\xc3\x2e\x33\x37" - "\xc2\x5b\xbb\x8c\xa7\x7d\x2a\x88\xef\xd2\xfa\x14\xa7\x7d\x2a\x91" - "\xe2\x3e\x95\x14\xf9\xfa\x94\x1b\x8e\xed\xf3\xc6\xcb\xb1\x7d\xde" - "\x64\x39\xb6\xbf\xb8\x40\x8e\xed\x2f\x46\x89\xf5\x64\x76\x99\xd4" - "\x4e\xfb\x56\xe4\x38\x3f\x6f\x9f\xe1\x99\x6a\xe2\x0e\xeb\xa1\xac" - "\x40\xcf\x38\x3f\xaf\xc4\x13\xce\xe3\x7a\x95\xf7\xe6\x45\xbb\xc1" - "\xf9\xf9\xe7\xfe\x37\xe0\xbc\xa7\x75\x28\x54\x0f\x02\x8c\x47\xbc" - "\xa7\xf8\x2e\x60\x3d\xe2\xbc\xfd\x43\x77\x36\x9a\x28\xf5\xcd\xc2" - "\x79\xcf\x36\x9a\x05\xfd\xcb\xe6\x08\x38\xdf\x93\x3d\x34\x27\xe4" - "\x36\x9a\xec\x25\x37\xdb\x46\xb3\x60\x91\x1c\xef\x17\x64\xc9\xf1" - "\x7e\xc1\x34\x09\xef\x85\x6b\x37\x84\xbf\x2f\x58\x78\x6b\x6c\x34" - "\xf0\x3c\x07\xde\xbf\x38\xbe\x7b\xbc\x9f\x57\xe1\x1e\xef\xe7\x09" - "\xbe\xd9\xe6\x55\xf4\x1c\xef\x5f\x72\xe0\x7d\xe7\xfd\x33\x29\xbd" - "\x5f\x23\x33\xfe\x56\xdb\x68\x5e\xf2\x88\xff\x5d\xf9\xc7\xe8\xbd" - "\x8d\x46\xd8\x93\xf8\xa2\x7b\xff\x18\xa7\xbb\x58\x23\x73\xba\xc4" - "\x19\xeb\x17\x8e\x92\xaf\x45\x5c\xf8\x90\xb8\x16\xf1\x74\x19\x62" - "\x7d\xf4\x73\x72\xac\x8f\xd6\x79\xb2\xd1\x1c\xe5\x9c\xd7\x24\x2e" - "\xdc\x22\xb7\xd1\xe4\xca\x6d\x34\xd3\xb1\xef\x45\xdf\xe6\x19\xeb" - "\x17\x16\xca\xd7\x80\xb3\x3d\x8a\xfb\xe7\x09\x6b\xc0\xe7\x39\xad" - "\x01\x7f\xea\x2f\x02\xd6\x2f\x3a\x57\x5c\x6e\x23\xde\xac\x43\xfc" - "\xf1\x6b\xbd\x37\xb9\x5d\x83\x48\xe7\x80\x2e\xd6\x21\xce\x3f\xaf" - "\x26\x9c\x72\x17\xda\xdf\xa5\x75\x88\x80\xff\x6f\x29\x5d\xfc\x17" - "\xbb\x5b\x87\x38\x4f\xef\x11\xff\xdb\x78\x09\xff\xb9\xff\x27\xd9" - "\x6d\x38\xe4\xf9\x54\x2e\x2f\xab\x6f\x96\xdd\xc6\x9d\x9d\xc4\x30" - "\x01\xf1\xff\x95\x3e\x8c\xe7\x47\xff\xcc\xec\x36\xaf\xcc\x95\xe3" - "\xfe\x2b\x19\x72\xdc\x7f\x65\xb2\x84\xfb\xc2\xb5\x1b\xb2\x16\xfd" - "\x95\x39\xb7\x86\xe7\xbf\x32\x47\xb2\xdb\x44\x3f\xd6\x3d\xee\x2f" - "\x34\xb8\xc7\xfd\x85\x06\x86\xfb\x0b\x0d\x5d\xda\x6d\x64\x6b\x23" - "\x17\xdf\xfd\xa3\xed\x36\x22\xcf\xbf\xe5\xfb\x7a\x16\x87\x7a\x63" - "\xb7\x71\xec\x49\xff\x51\x76\x1b\xf7\x78\x2f\x72\xfb\xd3\x5d\x7c" - "\x73\x95\xe3\xfd\x92\xbb\xe5\x78\xbf\x64\xa8\x1c\xef\x97\x8f\x93" - "\xe3\xfd\xf2\xb1\xee\xec\x36\x72\xac\x5f\xb2\xd2\x1d\xce\xeb\xa7" - "\xa3\xdd\x66\x59\x83\x67\x8c\x5f\x92\xed\x3d\xc6\xff\xe9\xe8\x3f" - "\x31\xde\x05\xe3\xd5\xae\x18\xff\xa7\x96\x9f\x94\xe3\x53\x8c\x5f" - "\xfa\x9d\x0c\xe3\x6f\xa0\x2d\xa7\x27\xfb\x49\x3c\x73\xfb\x65\x2e" - "\xeb\xdf\x97\xb9\xac\x7f\x5f\xe6\xb4\xfe\x7d\x59\xec\x8d\xc3\xf8" - "\x65\x91\xb7\x06\xe3\x97\x39\xad\x7f\x5f\x7e\x77\xf7\x18\xbf\x24" - "\xcf\x3d\xc6\x43\x3a\xc5\xf8\x25\x79\x5d\x72\x7b\x19\xc6\xaf\x50" - "\xdc\x0c\x5b\xce\xad\xd9\x6f\xb4\x82\x78\x63\xcf\xe9\xca\xef\x88" - "\x47\x7b\xce\x18\xd1\x9e\xa3\xf7\x60\xcf\xb9\x51\x98\xaf\x0f\x94" - "\x63\xbe\x7e\x90\x1c\xf3\x63\x27\xcb\x31\x3f\x76\x92\xdc\x9e\x13" - "\xd3\xc9\x9e\x23\xc7\x7f\xfd\x6a\xc3\x74\x67\x7b\x4e\xae\x93\x3d" - "\x67\xd5\x35\xcf\xf8\xaf\xf7\x88\xff\xd7\x29\xfe\x47\xb9\xc1\xff" - "\x95\xff\x47\xf0\x3f\xea\x47\xe0\xff\xca\x5b\x80\xff\x31\x8d\xcc" - "\xc6\xd3\x43\x3f\x29\x47\xbd\xb7\xf1\xfc\xb8\x79\x60\xd5\x93\xf2" - "\x79\x60\x55\xa2\x7c\x1e\x58\xf5\x90\x34\x0f\x08\xd7\x6e\xc8\x3c" - "\xb0\x6a\xca\xad\x99\x07\x56\x4d\x91\xe6\x81\xd8\x61\xdd\xcf\x03" - "\x7a\x0f\xf3\x80\x5e\x98\x07\xf4\x5e\xcc\x03\xab\x07\x79\xb6\xf1" - "\xe8\x7b\x6f\xe3\x79\xec\x56\xef\x83\x5a\x1d\xe4\x95\x8d\x67\xe7" - "\x44\x73\x09\xfa\x48\xb9\x4c\x94\x6b\x17\x88\x36\x1e\x83\x8b\x8d" - "\xc7\xd0\xc9\xc6\xb3\xe6\xb2\x80\xff\x53\x85\xfd\xa6\xd3\x7f\x84" - "\x8f\x14\x8c\xa1\xac\x88\x0b\x94\xaf\x9b\x8f\xa3\xf8\x2f\xf9\xef" - "\x5b\xb3\x17\xeb\xc5\xe6\x1f\x43\x17\x3e\x50\xe3\x16\xc8\x6c\x3a" - "\x53\xdd\xf9\x48\x59\x23\x5b\x77\x23\xdf\x6f\x1a\xb7\x59\x86\xf7" - "\xd3\xd9\x7e\xd3\x77\xdd\x7d\xa7\x75\xf8\xe4\x7f\x75\x37\xf5\xc9" - "\xef\xf0\xe5\x17\x57\xde\x23\x5f\xd2\xf3\x04\x5f\xd2\x5f\xdf\x02" - "\x5f\xd2\x3d\xf5\xc9\xff\xb5\xab\xff\xbe\xf8\xc7\x8c\x25\x06\x52" - "\x86\x7d\x64\x8e\xab\xef\x53\x83\xfb\xbd\xfb\x4a\x61\xef\xfe\xf2" - "\x9b\xe3\x07\x05\xeb\x43\xe7\xfc\x81\x6f\x98\x0f\x26\x59\x68\x7d" - "\x30\x5e\x35\xd4\xf5\xa3\x12\xe8\xab\x1c\xe2\x69\x0c\xe2\x69\xbc" - "\x85\xe6\xbd\x0c\x7d\x61\xe0\x5d\x66\xec\xc7\xe9\x1c\xf1\xd7\xc7" - "\x21\xb6\xc6\xd3\x75\x5f\x40\x23\x00\x5b\x59\xbe\x75\x97\x79\xbb" - "\x7d\xe0\xfd\x18\x6f\xb5\xef\xa1\xe5\xe5\x7d\xca\xcc\x2d\x30\x2e" - "\xea\x71\x4f\xac\xc2\x68\x6b\x35\xa0\x2c\x8e\x2f\x2f\x57\xf1\x80" - "\xbf\x7b\x5e\x26\x7e\xde\x8d\xd3\xf8\x63\x94\xcf\xe0\xbc\x37\xf0" - "\x8d\x06\xf4\x03\x22\x72\x2b\xee\x07\xc9\xbe\xb5\x1b\xda\x87\xe3" - "\xd9\xdc\x37\x7f\x31\xc3\x0d\x1e\xe6\x6b\x68\x4b\xba\xc6\x16\x71" - "\x83\xc6\xae\x02\xdc\xc8\x69\x92\xbe\x63\x63\xf9\xd8\x46\xcc\x8e" - "\xb2\x46\x5a\xff\x62\xf6\x84\xad\x71\x99\xee\xb1\x35\x2e\x93\x61" - "\x6b\x5c\xa6\x03\x5b\xcd\x6e\xec\x28\xb2\x75\xec\x09\xc2\xfa\x17" - "\x83\x0b\xc7\x36\xfc\x02\xfd\xa3\x24\x78\xb5\xfe\x85\xe2\xe9\x52" - "\x86\xa7\x88\x57\x22\xa6\x4a\x76\x14\x83\x47\x3b\x4a\x77\x98\xea" - "\xd5\x1e\x7e\x8a\xa9\x6b\x17\xc9\x31\x75\xed\x62\x39\xa6\x26\x7d" - "\xe7\x8a\xa9\x9d\xf1\x74\xed\x7e\x77\x58\xca\xfc\xa3\x24\x65\x79" - "\xc6\xd1\xb5\x15\x9e\x70\x94\xae\x4f\x9f\xe7\xb4\x3e\xdd\x81\xa3" - "\x89\x35\x72\x1c\x4d\x0c\xe9\x29\x8e\xd2\xd8\x26\x5f\xff\x04\xb1" - "\x4d\x7a\x8d\xa3\x7a\x17\x1c\x5d\xb7\x5e\xc2\x51\xd7\xf8\x26\xdd" - "\xe0\xe8\x92\x9b\xe3\x03\x45\x86\xa3\x9c\x85\xd6\x47\xb3\x1c\xeb" - "\x9a\xd4\x47\x8e\xa3\x49\x63\x3c\xe3\xe8\xba\x73\x12\x8e\xb2\x7c" - "\x37\x17\x47\x93\x54\x32\x1c\x5d\xe2\x84\xa3\xdf\x4b\x3a\x04\xae" - "\xb1\x70\xe0\xe8\x32\x27\x1c\x5d\xd2\x1d\x8e\x26\xa9\xb0\x8d\x18" - "\x47\x4d\x3a\xdd\x3d\x8e\xae\xad\x74\x8f\xa3\x90\x4e\x71\x74\x6d" - "\xa5\x84\xa3\x6e\x38\xaa\x0c\x47\x93\x0f\x7a\x81\xa3\x3f\x73\xdf" - "\x28\xc9\x07\xbc\xb2\x55\x48\x7b\x3a\x3b\xfb\x48\x9d\xeb\xbc\x27" - "\xa8\xd0\x25\xee\x49\x61\xa7\xb8\x27\x6b\xc4\x3d\x9e\x53\x04\x5c" - "\x7d\xea\x47\xe0\x2a\xdd\xe3\x99\xf2\x91\x7c\xed\x49\xca\x09\x71" - "\xed\x09\xc3\xd5\x8d\xb3\xc5\x7a\x49\x71\x4f\x0a\xbb\xf0\x91\xba" - "\x3e\x50\xe6\x1b\x65\x8a\xb3\x6f\x94\x8d\x7d\x3c\xfb\x48\x5d\x3f" - "\x46\xe6\x1b\xe5\x4c\xbe\x23\xee\x89\xab\x8f\x54\x09\x63\x53\x9f" - "\xa4\x18\xeb\xf0\x41\xb5\x3e\xd1\xe1\x23\xb5\x9b\x7d\x41\x58\xce" - "\xa1\xaa\xe8\x9b\x8f\xb1\x06\x2f\x30\x56\x16\xf7\xc4\xd5\xc7\x54" - "\xea\x15\x63\x71\x21\x29\x8b\x2a\x74\xe3\x1b\xb5\xf0\x96\xc6\x3e" - "\xc1\x7a\xb9\xc7\xda\x0d\x2b\xe5\x58\xbb\x21\x8f\xe6\xbd\xe8\x0e" - "\x6b\x37\x8c\x97\xb0\x96\xe5\x5b\x77\xd1\x05\x6b\x2b\x3d\x60\x2d" - "\xcc\xab\x7b\x6a\xbd\xc5\xda\x0d\x34\x6e\x36\x97\x2a\x60\x6d\xfd" - "\x8d\xc6\xda\x0d\x7a\x09\x6b\x37\x3e\xd2\x7d\x8c\xa9\xf5\x91\xee" - "\xf7\xe5\xac\x8f\x64\x58\xbb\x3e\xb2\xcb\x18\x53\xb2\x35\x1f\xaf" - "\x0d\x13\x63\x4c\x49\xf6\x80\x42\xc1\x1e\xf0\x4b\x8e\x89\xf2\x5a" - "\x98\xb7\xf6\x80\xb3\xa0\xbb\xe3\xbe\xcb\xb5\x18\x73\x6a\x0e\xc6" - "\x44\x29\x70\xb1\x07\x14\x74\xb6\x07\x3c\xd7\x35\xc6\x7a\x65\x0f" - "\xa0\xfb\x2e\xd3\x86\xca\x31\x36\x6d\x98\x1c\x63\x5f\xff\x48\xdc" - "\x67\x89\xf5\xf1\xec\x33\x35\x6d\xa5\xc3\x1e\x50\x29\xc7\x56\xc9" - "\x1e\xf0\xfa\x32\xcf\x18\x9b\x26\xb7\xff\x3e\x95\x2f\xdb\x67\xf9" - "\x6e\x95\xb3\x1f\x6a\xd1\xff\xd4\xbf\x1d\x3d\x5d\xe1\x8c\xb1\x69" - "\xe6\x5f\x92\x1f\x6a\x87\xaf\xa9\x6e\xd6\x72\x77\xf6\x43\xbd\x69" - "\xb6\xb1\xb8\x80\xe0\xde\x36\x8a\xb7\x32\xdb\x40\xc1\xad\xb1\x0d" - "\x14\x17\x78\xb0\x0d\x6c\x3a\x2f\xc7\xd9\xd7\xfd\x69\xde\xf3\xee" - "\x70\x76\xd3\x7e\x09\x67\x59\xbe\x75\xe7\x5d\x70\xd6\x74\x23\x39" - "\xed\x26\xd3\xcd\xb5\x0d\x6c\x32\x49\xb6\x81\xd7\x7b\xb0\xff\x31" - "\x2d\xcf\x3d\xce\xa6\x09\x76\xd7\x34\xc9\xee\x6a\x72\x13\x2f\x45" - "\x86\xb3\x7f\x5e\x2f\xee\x7f\xa4\x9c\xb6\x52\xe4\xb4\x05\xbf\xc0" - "\x78\x29\x7f\x4e\xf1\xd6\x36\x80\xfb\xdc\x11\x5b\x11\xbb\x44\x7c" - "\x95\x6c\x03\x05\x9e\x6d\x03\xdd\xe0\xab\xf7\xb1\xfb\xde\x58\x2f" - "\xc7\xd7\x37\x5e\x93\xe3\xeb\xd6\x40\x57\x7c\xed\x8c\xad\x6f\x9c" - "\x72\x87\xab\xcc\x36\x90\x6e\xf0\x8c\xa9\x6f\x58\x3c\x61\x2a\xf5" - "\xe9\x57\x25\xad\x91\x96\x30\x75\x4b\x7f\x39\xa6\x6e\x7e\xb8\xa7" - "\x98\x7a\x4b\xe2\xa5\xf4\x1a\x53\xa3\x5d\x30\x75\xcb\x7e\x09\x53" - "\x5d\x63\xa6\x74\x83\xa9\x37\xcb\x4e\xe0\x8c\xa9\x32\xee\x9a\x3e" - "\x4a\x8e\xa9\xe9\x51\x9e\x31\x75\x8b\x5d\xc2\x54\x96\xef\xe6\x62" - "\x6a\x7a\xf8\xcd\xb5\x13\xa4\x87\x4b\xdc\x35\xbd\xb1\x7b\x4c\x7d" - "\xc3\xea\x1e\x53\xdf\xb0\x32\x4c\x7d\xc3\xda\xf3\x3d\xe5\x5b\xcf" - "\x79\x81\xa9\x3f\xf3\x58\x2a\x5b\x2b\xbc\xb6\x13\xa0\xbd\x15\xb1" - "\xb4\xf2\xc7\xf9\x0e\x89\x17\x7d\x87\x4c\x12\x30\xf6\x89\x1f\x8b" - "\xb1\x19\x35\xf2\x35\x0d\x19\xdf\x89\x6b\x1a\x18\xc6\x66\xbe\x2e" - "\x8f\x8f\xda\xd9\x57\x88\xdc\x87\xea\xb6\xc7\x1c\x76\x02\xc4\xdc" - "\x49\xce\x76\x82\xcc\xc7\x3c\xe3\xed\xb6\x28\x99\x9d\xe0\x53\xf7" - "\x78\x7b\x5d\x86\xb7\xdb\xd7\x51\xbc\x75\xf8\x50\xdd\x96\x27\xfa" - "\x50\xed\x96\xc3\xca\xf0\x36\xea\xa7\xc1\xdb\xc2\x9e\xe3\xad\x3c" - "\x96\x8a\xab\xbf\xd4\x37\x87\x1a\x8b\x00\x6f\xa9\xbf\x0e\x57\x9f" - "\xa9\x3d\xf3\xd7\x71\xb3\x7c\xa6\x62\xbd\xdc\xe3\xee\x9b\xfb\xe4" - "\xb8\xfb\xa6\x89\xe6\x75\x8b\xbb\x6f\xae\x96\x70\x97\xe5\xeb\x31" - "\xee\xf6\xca\x66\xf0\x66\xde\xcd\xb5\x19\xbc\x99\x27\xe1\x6e\xe6" - "\xe2\xee\x71\x77\x5b\xb4\x7b\xdc\xdd\x16\xcd\x70\x77\x5b\x74\x97" - "\xb8\x2b\x5b\x43\xb0\xe3\x39\xb7\xbe\x3c\x2a\x7f\xe9\x71\x56\x76" - "\xe8\x7a\x63\x33\x00\x0c\x56\x26\xa2\x0f\xa7\x28\x5c\x43\xd0\xbd" - "\xcd\xa0\x3b\xbc\xf5\xde\x66\xb0\x73\xb6\x1c\x6f\x77\x3e\x27\xc7" - "\xdb\xb7\xfa\x60\xbd\xba\xb4\x19\x50\x0c\xd8\xb9\xcf\x61\x33\x30" - "\xcb\x71\x56\xb2\x19\xec\x7a\xdf\xf3\xb7\xaf\x9d\xe5\x32\x7e\xfb" - "\x84\x8b\xcf\xea\x79\x12\xde\x9e\x29\x13\xd7\x8c\x65\x29\x4e\xcf" - "\x74\xc6\xdb\x7f\x0f\xea\xe4\xb3\x7a\xd6\x0d\xf4\x59\x3d\xeb\x06" - "\xfb\xac\x9e\x2d\xf7\x59\xfd\xd6\x75\x69\x1d\x99\xf7\x3e\xab\xb3" - "\x76\x53\x0c\xc6\x3e\x84\x7e\xab\x7b\x62\x47\xb8\xc9\xb1\x56\x64" - "\xd8\x2b\xb3\x23\xec\x1a\x2a\xc7\xde\x5d\xb3\x3c\x63\x6f\x56\xa3" - "\x84\xbd\x2c\xdf\xcd\xe5\xbc\xbb\x34\x37\xd7\x8e\xb0\x4b\x23\xd9" - "\x11\x76\xd5\xb8\xc5\x5e\xd9\xb7\xb1\x9d\x26\xf7\xdf\xc6\x20\x9d" - "\x62\xef\x4e\x93\x47\x3b\x42\xa7\xf5\x5b\x6f\x9d\x66\xdf\xc6\x04" - "\xce\x6b\xf6\xc2\x8e\xf0\xb3\x5b\x63\xf0\x56\x71\x6f\xec\x08\x88" - "\xb7\x88\x67\x22\xe6\xf6\xc4\x8e\x70\xe3\x39\xee\xdb\xa7\xe5\x98" - "\xfb\x76\xa9\x1c\x73\xf7\x2c\x73\xc5\xdc\xce\x78\x9b\xdd\xdf\x1d" - "\xd6\x32\x3b\xc2\x9e\x50\xcf\x38\x9b\x3d\xc6\x23\xce\xba\xac\xcd" - "\x95\x70\x76\xf7\x62\x39\xce\x66\x27\xf6\x0a\x67\x7b\x1a\x83\xe5" - "\x67\x85\xb3\x51\x2e\x38\x9b\xd3\x47\xc2\x59\xd7\x38\x2c\xdd\xe0" - "\xec\x4d\x8a\xc3\xe2\x99\xe3\xe6\xbc\x2e\xc7\xd9\x9c\x63\x9e\x71" - "\x36\xe7\x39\x09\x67\x59\xbe\x9b\x8b\xb3\x39\x9b\x6e\xae\x6d\x21" - "\x67\x93\xc4\x71\xf7\x4c\xeb\x1e\x67\xb3\x23\xdd\xe3\x6c\xb6\xf0" - "\x5d\x2c\x3b\xd2\x23\xc7\xed\x84\xb3\xb9\x0f\x79\x81\xb3\x3f\xf3" - "\x35\x08\xb9\x5e\xf9\xbf\x70\xb2\xd7\xfa\x1a\xcd\x2e\xfb\x25\xce" - "\x3b\xef\x97\x70\xb2\x2d\x4c\x12\x6d\x0b\xf2\xf8\x2c\xf1\xa2\xfd" - "\x36\x52\xc0\xdd\x09\x3f\x16\x77\xf7\x8e\x6f\x75\xe0\x6e\x0c\xe0" - "\xee\x5e\xba\x3f\xa2\xd5\x81\xbb\x79\x6d\x62\xbd\xa4\xf8\x2c\x1e" - "\x6c\x0b\x8f\xd3\xf2\x76\x38\x6c\x0b\x88\xc3\x91\xce\xb6\x85\xbc" - "\xfd\x9e\x31\x78\xef\x31\x99\x6d\xe1\x13\xf7\x18\xdc\x22\xc3\xe0" - "\xbf\x5c\xa1\x18\xfc\xb8\x88\xc1\x7f\x21\xd7\x41\xb7\xbc\x9e\xe6" - "\x1d\x06\xb7\x50\x0c\x9e\x72\x6b\x30\xf8\xc8\x0d\xc0\x60\xda\xee" - "\xff\xb1\xcd\x68\x00\x0c\x9e\x83\x18\x3c\xa5\x67\xf6\x86\x9f\x28" - "\x46\x0b\xd6\xcb\x3d\x16\xe7\x0d\x92\x63\x71\xde\x14\x9a\xd7\x2d" - "\x16\xff\x47\x8d\x84\xc5\x2c\xdf\xcd\xb5\x37\xe4\x05\xdd\x5c\x7b" - "\x43\x5e\x90\x84\xc5\x79\xe7\xbb\xc7\xe2\xbd\x45\xee\xb1\x18\xd2" - "\x29\x16\xef\x2d\xea\x12\x8b\x1f\x77\xc6\xe2\x7d\x0e\xce\x2b\xb3" - "\x37\x98\x7f\xe9\xb1\x5b\xf6\x79\xe4\xbf\x9a\x7b\x48\x4a\x95\xe2" - "\x9d\xa1\xc6\x6c\x42\x9a\x53\x49\x8a\xd1\xf6\x38\x81\x34\x68\xbf" - "\x77\x9e\x34\x86\x8c\x21\xdc\xf6\x70\x2d\xe2\xf1\x9b\xf8\x03\x8e" - "\x9b\xa1\x14\xc6\x16\x6d\xe3\x77\xe8\x7a\x57\x4c\x47\xec\xdd\xe3" - "\x74\xdd\xdd\xb3\xf8\x8c\x91\x79\xc2\x7d\x79\x6c\xdf\xcd\xc8\x7c" - "\xf1\x1c\xfb\xa6\x59\xf1\x4e\x3e\xbf\x6d\x64\xae\x25\x70\x64\xae" - "\xbb\xfb\xef\x53\x13\xbf\x01\xeb\x79\x3e\x67\x27\xdf\xd2\xfc\x40" - "\x78\x79\xf3\x9f\x09\xc9\xd8\xc9\x5b\x5a\xd3\xde\x31\xc3\xbd\x7e" - "\xff\x0e\xf9\x9a\x07\xe6\x1a\x9a\x53\x67\x12\x48\x6b\x11\xd3\xa0" - "\xdd\x08\x97\xea\xc3\x73\x70\x8d\xdf\x6e\x39\xb0\x27\x09\xb0\x2a" - "\x91\x90\xd1\xd7\x71\xcc\xfc\xa7\x0a\xfa\x4c\x50\x3a\x94\xb9\x15" - "\xca\xe2\xef\xbc\xab\x05\xfa\xa3\xaa\x6c\x23\xc1\x31\xbd\x09\xde" - "\x2b\x37\x1d\xdb\xde\x67\x44\x16\xaf\x54\x11\x6e\x5f\xa8\x96\x1f" - "\x34\xc9\x0c\xf2\x20\x19\x31\xc4\x0f\xdf\x63\x2b\xe4\xe3\x95\xc9" - "\x3c\x37\x6c\x48\x81\xd1\xd6\xc2\xc6\x34\xd4\xef\x38\xe8\xb1\x3c" - "\x3c\x37\x27\x86\xa8\xe1\xe7\xcf\xef\x98\x64\x6e\x4d\xfb\xcf\xcd" - "\x50\xaf\x58\xac\x97\xa7\x77\xdc\xfa\x16\xcc\x3b\x77\x85\xe0\xdc" - "\x41\x9f\x8f\xcf\xa6\xcf\x51\x72\x9b\xec\x90\xce\xa7\x26\xf3\xc6" - "\x78\x1b\x09\x80\xb6\xd8\x03\xf5\xc6\xfe\xc8\xbd\x13\x5e\xbe\x61" - "\x08\x21\x87\x12\xea\x94\x46\xa8\xbb\xfd\xdf\xef\x6a\x31\x24\xfd" - "\x0b\x81\xeb\x16\xd4\x59\x6a\x15\xf9\xaf\xcf\xf8\x8e\x10\xc4\x13" - "\xf8\xbf\xa3\x05\xe6\xb1\x69\x70\xbe\x15\xde\x83\x6b\x0e\x51\x61" - "\x5e\x48\x1f\x6f\x88\xbb\x40\x02\xf4\xc4\x2f\x1d\xde\x4d\xc8\xab" - "\xc6\xbc\x66\x45\x7e\x26\xd6\x01\xce\xc3\xe0\x1c\xef\xc3\x35\x64" - "\x84\xcf\x0b\xd5\xd2\xbe\x99\x39\xc9\xcc\x0d\x0b\xd5\x52\xec\x83" - "\xf7\xdc\x0a\xef\x0c\x79\xfc\x21\x8f\x3f\x3d\x26\x11\x75\x26\xa4" - "\x61\x39\x70\xf4\x37\x2c\x6f\xc7\xb2\x09\x96\xed\xa1\x1d\x54\x7c" - "\xd0\x24\x33\x0f\x7d\x1b\xe7\x54\x4d\x92\xe2\xb3\x2a\xc5\xfe\x87" - "\x03\x14\x3c\x0f\xe3\xbc\x60\x43\x12\xf1\xcf\xe0\x08\x31\x0c\xc1" - "\x72\xf6\xf7\x87\xf2\x55\xd8\x16\xad\x69\xf9\x0d\x66\xc5\x7f\x66" - "\x61\xfb\x82\x3c\x5b\x34\xf7\xe1\x3b\xec\x9f\x84\xcf\xc1\x7b\x58" - "\xfe\x7c\xea\xfb\x1e\xeb\xac\x49\xf2\xe1\xe1\xfa\x28\x1f\xc5\x65" - "\xe2\x13\xe2\xff\x7c\x6b\xda\xfe\x70\x33\x59\xa4\xc7\xfb\xcd\xec" - "\x3e\xe8\x4b\xfb\x23\x41\x66\x47\x30\x0d\xcf\x3d\xd4\xd7\x5f\x94" - "\x5b\x69\x08\xf4\x0d\x57\xd9\x89\x7d\x04\xfa\x85\xd8\x47\xb0\xbe" - "\x87\x93\xcc\x4a\x3a\x0f\x2b\xf6\x53\xbd\x2e\x1d\x64\x68\x7f\x3b" - "\x44\xb5\x15\xda\x96\xeb\x40\xb9\x54\xc1\xb5\x77\x5f\x43\xb9\x6c" - "\x4d\x00\x99\xb0\xbc\xf9\x52\xfd\xf1\xfc\x5d\x2a\x4f\x0e\x64\xc1" - "\xf6\x6e\xbe\xfb\x1c\xbe\xcf\xd6\xeb\x20\xc7\x60\xbe\xa5\x28\x1e" - "\xea\x85\xfd\x16\xfa\xc8\xa1\x18\xab\x12\xd7\xf5\x61\xfa\xf1\x26" - "\xab\x72\x6b\x3d\x41\x5e\x49\xb6\x00\x2e\xef\x8e\x83\x36\x87\x32" - "\xf9\xb0\x21\x05\x0f\x8a\x72\x4c\x00\xd9\xc5\x41\xdf\x85\x36\xdf" - "\x0a\xed\x97\x03\x98\x87\xff\x73\x60\xfe\xe1\x20\x9f\x59\xf1\x6e" - "\x26\x94\xa7\xde\x1d\xcc\x5b\xf6\x04\xf3\x0d\xd0\x86\xcb\x5b\xd3" - "\xde\xd5\x8b\x6d\x88\x75\xda\x0a\xe9\x5b\xe0\x3a\xb4\x67\x03\xeb" - "\x43\xfb\x8f\x89\xef\xec\xa9\x3d\x37\x1f\x22\x63\xb6\x1c\x22\xa1" - "\x7f\x3e\x44\xc6\x26\x2e\x84\x71\x99\xfa\x3b\xfe\x6c\x94\x0d\xe6" - "\xc4\xd7\x8a\xdb\x83\x47\x19\x90\x1f\x72\x1b\xee\xca\x7d\xed\x10" - "\x09\x3f\x38\x2f\x57\x39\x03\x4a\xc6\x39\x7c\x46\x9f\x4b\xbc\x51" - "\x7f\x8d\x70\x81\xaf\x15\xdb\x37\x8c\x18\x38\xfd\x1a\x21\xa7\xb4" - "\x2d\x24\x29\x16\xe6\xf2\xa6\x3a\x92\xd4\xc2\x5b\xca\x52\xbe\x23" - "\x80\x3d\x59\xac\xed\x0e\x84\xcd\x58\x44\x08\xee\x19\xe4\xbe\xd7" - "\x92\xfe\xd1\x44\x95\x78\x9e\x84\x24\x57\xf3\x75\xf6\x9d\x8f\x17" - "\x24\xad\x23\xca\x43\x4d\x26\xc6\x3d\x15\xef\x5d\xfb\x08\x9e\xc5" - "\xb7\xea\xc8\x7c\x9b\x30\x1f\x65\x4e\xaa\x4b\x5e\x4c\x06\xe3\xfb" - "\x04\x50\xee\xf5\xde\x6e\x68\xb7\x3a\xef\xf0\xf9\xbd\x68\x86\x87" - "\x8d\xe5\xc9\x8b\xf8\x3a\x98\x53\x94\x7c\xf2\x42\x05\xaf\xd1\x99" - "\xf8\x6d\x8d\xe5\x46\xd5\x75\x62\x8c\x6e\x21\x1f\xc3\xb3\xbd\x2c" - "\xd7\x40\xe7\x6a\x9c\x3f\xa1\xbe\xb3\xb5\x24\x85\xd6\x19\xe6\xc9" - "\x80\x58\xe4\x50\xfc\x25\xac\xf3\x71\x78\x3f\x7e\xa8\x0e\xfa\xf8" - "\x7b\x33\x71\xce\x9c\x61\x36\x90\x12\xab\x9d\xbc\x55\x4f\xdb\xc5" - "\x17\xda\x45\x05\xd7\xc2\xa0\x6d\xfc\xdc\xc9\x0a\xe5\xc4\x65\xbc" - "\x56\xcc\xf9\x30\x79\x50\x59\xb4\x30\x59\x4c\x5f\x49\x60\xee\x04" - "\x79\x6c\x63\xf2\xe0\x06\x4d\x34\xa0\x3c\xbc\x7b\x8f\x03\x9b\x3c" - "\xcd\x29\xf8\x6c\x1e\xfa\x04\xf6\x05\x2e\x68\xa2\x01\x9f\x8d\x75" - "\xc0\x6f\x66\x28\xfb\x19\xaf\x5d\xe2\xcb\xf4\x75\xc4\x08\xef\xc3" - "\x07\x3a\xd7\xc1\xe6\x65\x1d\x0e\x7a\x8c\x7f\xb6\x79\x34\xf4\xd5" - "\xd1\xd0\x57\x47\x93\xb1\x6b\xcd\xac\xaf\x9e\xa9\x64\x7d\xd5\x0e" - "\xf5\x6a\x03\xbe\xbe\x76\x36\x51\x62\xbd\x0e\x5c\x40\xbf\x7c\x50" - "\xcf\x3a\xa9\xbf\x4e\xbb\x02\x6d\x24\xf6\x59\x9f\x11\x03\xb1\x7d" - "\xca\x5a\x4c\x24\x19\xfb\x6c\xbb\xbb\x3e\x7b\xc8\x34\x63\x01\xc8" - "\xe6\x15\xe8\xb3\xdf\x6a\x89\x7f\x35\x51\xad\x9b\x0d\x7d\xb6\xce" - "\x5d\x9f\x3d\xb4\xff\x18\x3c\xb3\x53\x9f\x5d\xe4\xdc\x67\x0f\x3d" - "\xed\x7d\x9f\x3d\x14\xea\xe8\xb3\x8b\x3d\xf4\xd9\x85\xd0\x67\x9f" - "\xcf\xf2\xb2\xcf\x1e\x8a\xf5\xae\xcf\x1e\x52\xd1\x3e\x5b\x09\x7d" - "\x16\xf4\x8f\xb7\x5e\xa6\xed\xe2\x0b\xed\x02\x7d\xf6\xa0\x09\xda" - "\xc6\x6d\x9f\xfd\xe9\x65\x56\xb0\xb9\xe7\x32\x2b\x98\xdb\xbd\xcc" - "\x0a\xfa\x78\x2f\xb3\xc3\xe5\x37\x47\x66\x05\x5a\xef\x64\x76\xb8" - "\xd0\xb3\xcc\x0e\x6f\xfe\xf9\xc8\xec\xbf\x22\x7b\x2e\xb3\xff\x0a" - "\xec\x5e\x66\x7f\x3d\xea\xbd\xcc\xfe\xba\xf1\xe6\xc8\xec\xaf\x95" - "\xde\xc9\xec\xaf\x4b\x3d\xcb\xec\xaf\x91\x9e\x64\x36\x71\x30\xc7" - "\x73\xb8\x0e\x2e\x78\x84\x06\x39\x0d\xe3\x5f\x7f\xeb\x8f\x3a\x20" - "\x9c\xab\xc4\x73\xca\x91\x40\x4f\x76\x39\xf7\x77\x39\x57\xbb\x9c" - "\x07\xb9\x9c\x87\xb8\x9c\x87\x8a\xe7\x20\xa3\x3e\x57\x15\xff\xb5" - "\x0e\x74\xb0\x14\xb3\xe2\x6f\x21\xc2\xf5\xb0\xf9\x76\x0d\xea\x71" - "\x61\xee\xea\xbe\x35\x95\xb7\xea\x93\xc8\x5d\xf5\x8a\xbf\x31\x19" - "\x6c\x18\xa2\xe5\x13\x52\x08\x97\xd1\xa4\x9a\xbe\x0e\xfb\x92\x85" - "\xf0\x1d\x21\xbe\xd0\x4e\x77\x82\xfe\x68\xc1\x7e\xa6\x89\xf9\x98" - "\xaf\x52\xfc\x6d\x25\xbe\xdf\x68\xbd\x81\x70\x3e\x23\xb4\xa8\xdb" - "\x70\xdb\x9a\x54\x16\x9f\x11\x43\x40\xbf\x2c\x4f\x57\x72\x7e\xe9" - "\xa9\x9c\x66\x9d\x85\xb7\x4c\x6d\x84\x39\x0a\xe6\x29\x63\x83\x15" - "\xfa\x21\x6f\x31\xc4\x5c\xc1\xfa\x9e\x2f\x4d\x84\xb2\xe1\x39\xf0" - "\x2c\xc2\xab\x1b\xab\x8d\xb6\x72\xc2\x43\x19\x65\x2d\xc5\xa0\xcb" - "\x9b\x88\x50\x26\xcc\x69\x8d\xd5\x58\xa6\x5b\x7d\x2b\x73\xc4\x2c" - "\x78\xe6\xe3\xb3\xb5\x2a\xc2\xaf\x57\x05\x79\xd7\x3f\xfe\x66\xf3" - "\xa8\xc7\x65\x8e\xa8\x60\xe5\xfa\xf5\xa2\xdc\x23\xb3\x3c\x97\x3b" - "\x52\xa8\xaf\xba\x37\xe5\x7a\xdc\xff\x04\xe5\x0a\xf5\xd5\xf4\xa2" - "\xdc\xf7\x55\x9e\xcb\x0d\x17\xea\x1b\xd9\x9b\x72\xe7\x74\x51\xae" - "\x50\xdf\x94\xde\x94\x7b\xa4\x0b\xb9\xcd\xea\x5d\x5f\xf8\x6f\xbf" - "\xae\xfa\x42\xef\xfa\xc1\x7f\x77\xf1\xfe\x23\x67\xf5\xae\x0f\xfc" - "\x77\x41\x57\x7d\xa0\x77\xf2\xff\x9f\x2e\xe5\xdf\x3b\xd9\xff\x8f" - "\xc7\xf5\x1f\x28\xfb\xde\xc9\xfd\x7f\x3c\xf6\x7f\xd4\x4d\xf9\xcc" - "\xe1\x16\x3e\x58\x17\xc1\x6d\x6f\xb3\x70\xc1\xc3\x9b\x36\x70\x91" - "\x64\x22\x60\x58\x40\x16\x09\x8c\xa4\xf6\x9e\xc2\xc8\x75\xd9\x44" - "\x99\xa1\xe4\x94\x07\x13\x4c\x4a\xa3\x6d\x0c\x49\xb6\xf1\xf6\xbc" - "\x38\xab\xe2\x7e\x48\x3f\x01\x1a\x4a\xcb\x2a\x2d\xa1\xe5\x0c\x6c" - "\xb3\xa4\x27\x45\x92\x19\x76\x82\xf6\x85\x96\x93\x89\x80\x61\x80" - "\x63\xc6\x2c\x2b\xce\x73\x81\x70\x9f\x0d\xfa\x2f\x94\x61\x25\x87" - "\x39\x8b\x22\x32\x86\xe6\xb3\x80\x1e\x68\xe1\x77\x0e\x6f\xe2\x93" - "\xb5\x64\x23\xfc\x87\x67\xee\xf7\xb1\x10\x65\x0e\xe8\x87\xad\x69" - "\x85\x79\x66\xc5\xd1\x14\xd4\x19\x41\x37\x6d\x48\x6e\x44\x1b\xba" - "\x2e\x62\x03\xe8\xa9\x98\xf7\x10\x67\x51\x8e\xd6\x13\xe5\x49\x0b" - "\xea\xe3\x85\xe5\x27\x80\x25\x76\x61\x43\x51\x71\x41\x13\x1e\xc6" - "\xfb\xb1\x1c\xb4\x4d\x6e\xe5\xa0\x6d\x83\x26\xd5\x61\x7d\xf9\xcc" - "\x51\xf9\x86\x04\x9c\x17\x8e\xea\x26\x0f\xe7\x5b\x05\x9c\x1f\x52" - "\x0f\xe7\x54\x07\x4f\xe5\xcb\x79\xb5\xc5\xc4\xa7\xf7\x8f\x2c\x6b" - "\x69\x22\x86\xb8\x76\x52\xa5\x38\xfa\x1c\x3e\xbb\x39\x68\x42\x44" - "\x4b\xd0\x84\x31\xad\x69\x47\x67\x89\xf5\xc5\x67\x89\xe9\x68\x73" - "\x60\x75\x3c\x1a\x7b\x22\xd1\x73\x1d\x61\x2e\x19\x38\x23\x84\xb7" - "\x60\x1b\x1a\x92\x9a\xa0\x2e\x1f\x7c\x87\xed\xcc\x67\x4e\x20\x2d" - "\xc9\xda\x7b\x98\x0d\xee\x03\x35\xda\x72\x60\xee\x6f\xa1\x76\x95" - "\x6d\x8d\x2d\x74\xdd\x0c\xe0\x3d\xcc\xd3\xc5\xc8\x51\xae\x2a\x8e" - "\xd2\xf8\x81\xb3\xb5\x4a\x2f\xf5\x99\xa3\x74\xfe\x37\xdc\x83\xed" - "\xf0\xc1\x67\xf0\xbc\xdf\x54\x29\x3e\x78\x98\x71\x8d\x26\x3f\x7c" - "\x1e\xe4\x31\xc0\x9c\xe3\xc7\x67\x58\xca\x31\x1f\x5c\x9f\x25\x5c" - "\x57\x3b\x5d\x57\x43\x9d\xa7\x08\xd7\x05\xbf\x6a\x4d\x41\x4e\xd7" - "\x83\xf4\xf7\xa0\x9d\xed\x83\x6c\x7c\x27\x98\xcb\x2c\x38\xaf\xa1" - "\x0d\x9f\xd9\xc9\x1b\x2d\x42\x3e\x55\x83\xe2\x83\xf7\x9b\xa1\x5f" - "\xc1\x75\x7f\xa7\xfb\xfd\x4f\xc6\x47\x90\x89\xbb\xb1\x4d\x3f\x28" - "\x36\xfb\xb4\x95\x30\xdb\xcc\xd1\x22\xda\x16\xea\xc6\x3a\xe7\xf2" - "\xcc\x8a\x0f\x32\xa1\xcc\xba\x16\xe0\x77\x90\xe7\x00\x3e\xd3\xb9" - "\xfd\x17\xc5\xc4\xac\x88\xd1\x0c\x5b\xa8\x59\xb8\x6c\x81\xe6\xa5" - "\x15\xab\x97\xc7\x8e\x1b\xb6\xb0\x1f\x21\x4e\x7d\x47\xcd\xa7\x06" - "\xf0\x5c\xe6\xb8\x78\x63\x96\x8d\xf0\x4a\x35\xcc\xb7\xed\x24\x13" - "\xe4\x6a\x0f\x9e\x16\x65\xdf\x39\x15\xc6\xcf\xe8\x99\x86\x84\x09" - "\xd0\xf6\x1f\xd2\xef\xa0\x46\x0d\x21\x9b\xe1\xba\x21\xe1\x0c\xa6" - "\x2d\xa3\x69\x0b\x09\xa1\xf6\xa7\x04\x3f\x52\xa4\x69\xa2\x36\x2c" - "\xb8\xb6\x8f\xda\xeb\xae\x11\xa5\x2d\xd5\x8f\xfc\x2d\xa9\x5c\x79" - "\x8c\x33\x2b\xff\xc6\x99\x94\xc8\x17\x4e\x86\x14\x93\x07\xe3\xfd" - "\x08\x5e\xff\x38\x09\xd2\xe1\x3a\x5e\xa3\xe5\x50\x59\x7f\x78\x0d" - "\xf3\xa1\x4d\x0b\xff\x27\x67\xf1\x97\x4f\x86\x58\x08\xe3\xaa\x1f" - "\x3e\x89\x75\xd5\x0c\xc1\xef\x05\x1f\x4e\xc3\xfa\x99\x15\x1f\x4e" - "\xf5\xc9\x86\xfc\x71\xc4\xff\xaa\xe2\xd8\x63\xdc\x8e\x71\xf1\x88" - "\x05\xb6\xb4\x0f\x81\x3f\x04\x3e\x9a\xb3\x9d\xf8\x65\x6f\x87\xb1" - "\xb9\x9d\xa8\x5a\xd3\x8e\x85\x99\x55\xea\xcd\xd8\xb6\x50\x8c\x7f" - "\xb3\x92\xfc\x0e\xd2\xc6\x98\xc9\xa2\x20\x4c\x83\x31\xd8\xe2\x09" - "\x5b\xae\x03\xbf\xb3\x86\x0d\xb6\x70\x41\xe3\xa2\x79\x68\xb7\xd6" - "\xb0\x21\x9a\x00\x3d\xf4\x2d\x18\x63\xfc\xa0\x71\xd1\x0d\x8a\xe3" - "\x53\x3f\x85\x9e\x95\x84\x63\x7a\xe7\xe8\x99\xef\x5e\xb7\xe2\xf7" - "\xb1\xa8\x03\xd7\x2d\x70\x3e\xd5\x92\x0f\xe7\xa7\x0d\xf9\x44\x33" - "\x1d\xb9\xd3\xb1\x83\xbf\x5f\xc8\xdb\x86\x97\x00\xcf\xac\xfe\x2f" - "\x72\xb6\xa2\x98\xf8\xcf\x21\x3e\x0e\xdf\xed\xb1\x44\x39\xc3\x0c" - "\xe7\xab\x89\xb2\x0c\x74\x7a\xb4\xb5\x27\x3d\x86\xf6\xf6\x52\x82" - "\x36\x78\x5e\xf9\xf2\xc6\x83\x4d\x56\xc0\xb0\xba\x3e\xb8\x86\x9b" - "\x53\xbf\x51\x8c\xf7\xcc\x6f\x11\xbe\x5d\x35\x0b\xdf\xae\x9a\xe9" - "\xb7\xab\xf8\xc4\x28\xf6\xed\x0a\xbf\x59\xcd\x88\xf2\xe1\xb1\x3c" - "\xfc\x8e\xd5\xbf\x05\xfa\xc1\x2a\xed\x00\xfb\x2a\xed\xc0\xac\x26" - "\x12\x54\x66\xa9\x03\x8e\x56\x4c\xde\x8e\x23\x41\x7c\x73\xf4\x6d" - "\x25\x86\x33\x84\xdf\xfe\x6f\x86\xc3\x49\x86\x3e\x76\xb4\x3f\x34" - "\x87\xf4\x0b\x58\xaf\x40\xbb\xfd\x80\xcd\x31\x24\x7c\x4f\x13\x89" - "\x98\x5f\x93\x42\xfd\x38\x61\xcc\x3d\x5b\xb3\x56\xd3\xd1\xac\xbd" - "\xaf\xad\x59\x7b\x4f\x80\x85\x7d\xeb\x9a\x7b\x45\x4d\x70\xfd\x2c" - "\x9f\x76\xa0\x7c\x0f\xda\x9c\x5b\x2c\xc4\x16\xf8\x46\x31\xf6\x65" - "\x78\x76\x28\x7e\x1f\x49\x5e\x43\xd4\xdc\x37\x5a\x52\x1a\xdd\x44" - "\x1e\x04\xd9\xe3\xb7\x80\x9c\x2a\xf6\x2d\xc0\x0e\x7a\x0c\x7e\x0f" - "\xb8\xde\xac\x55\xf2\x41\x13\xcb\xa7\x2d\xd6\x90\xb6\x7d\x83\x2d" - "\xc6\xf8\x77\x49\x72\x1b\x7f\xd9\xb8\x91\x23\x68\x27\xe6\xd3\x8e" - "\xcd\xe4\x07\x4d\x2c\x3f\xa5\x3d\x87\xf3\x4a\x84\x84\x1d\xc7\x07" - "\xf7\x0e\x3b\x8e\x53\xfe\x8c\xdf\xcd\xf8\x9d\x20\xc7\x26\x94\x27" - "\xc8\xb5\xc9\xa2\x7c\x0a\x64\x57\x5a\xfd\x17\x90\x9b\x49\x26\x37" - "\x2a\x67\xc8\x57\xbb\x10\xe4\x55\xc3\x64\x58\xd2\x02\xf2\x3b\x8a" - "\x65\x4c\xd0\x1f\x8c\xb3\x2a\x41\x57\x52\x96\x58\x2f\xd2\x3d\x28" - "\x28\xc7\x03\xed\xc5\x7d\xda\x60\xbe\xc1\xef\x8f\xd7\xf3\x86\xa8" - "\xdb\x82\xc6\x4d\xe9\x08\x1a\xa7\xeb\xe2\x5b\x24\x93\xe7\x62\xe2" - "\x57\x52\x7d\x8e\xc9\x73\xa5\x20\x4f\x5c\xb3\xf6\xaa\x76\x80\xad" - "\x15\xe4\x79\x1d\xe4\x19\x6b\x26\x6f\xc5\x90\x20\x63\x9d\x09\xbf" - "\xd3\xdc\xf6\x64\x29\x21\x4f\x0d\xe7\xb9\x52\xc3\x05\x2a\xd7\x43" - "\x20\x57\x5b\xc6\x6b\xc5\xf8\x7d\xd2\x21\xd7\x38\x90\xeb\x75\x90" - "\xeb\x15\x49\xae\xf6\x56\x90\x6b\x2b\xc8\xb5\x15\xe4\x2a\x7c\xc3" - "\x9c\xbb\x18\xe4\x8a\xdf\xbb\xd2\x0e\xce\xc2\x6f\x98\xf8\xad\x08" - "\xe5\x8a\xeb\xa4\xb9\x57\xb5\xa1\xf4\xdb\xe5\x4b\x5a\xb2\xe7\x45" - "\xe2\x37\xca\x4a\x14\xc9\x47\x89\x1a\xea\xa9\x7e\xe0\x08\x51\x42" - "\x79\xd0\xef\xab\x08\xca\xd7\x78\xc4\x4e\xd6\x3e\x47\xee\xb1\x6d" - "\x63\x72\x36\xda\xde\x47\x5b\xed\x98\xeb\xaf\x6a\x95\xbb\xe2\xc8" - "\x58\x94\xf9\xd4\x1a\x0d\x39\x35\xb3\x94\xb8\xca\x9c\xdb\x81\xe3" - "\xff\xb8\x0a\xe5\xde\xfb\x71\xfb\x89\xaa\xe7\xe3\xd6\xb0\xe8\x9f" - "\xe3\xf6\x46\x8f\x5b\x83\x9f\xfb\x71\x7b\xe2\xb3\xde\x8d\xdb\x13" - "\xe5\xff\x1c\xb7\xbf\x84\x71\x7b\xe2\x98\xeb\xb8\x75\xf0\x96\x98" - "\x45\xcb\x16\x2c\x5e\xbe\x78\xf9\x2b\x9a\x17\xd7\xc4\x2e\x5a\xc5" - "\xd8\x8b\x8c\xbf\x68\xed\x5c\xa4\xf2\x4d\x98\xaf\xcf\x86\x98\xc8" - "\xe1\x21\x26\x25\xf7\x42\x88\x8a\xcf\xc8\x51\x73\x19\xb9\x59\x6f" - "\x02\x0f\xc7\xf1\x9d\x09\x1c\xbb\x56\x51\x16\xf1\xf7\x50\xe0\x9f" - "\x31\xf5\x04\xff\x33\xee\x36\x3f\x0a\xf7\x2d\x66\xed\xe4\xeb\x70" - "\xdf\xe2\xe9\x22\xe4\x16\x45\x6b\x6e\xd7\x81\x0e\xf1\x42\x08\x69" - "\x7b\x41\xa7\xfc\xf3\x05\xe2\x17\x60\x22\x53\x39\x8e\xe7\x0d\x49" - "\xf5\xc0\xfb\xce\xc6\x1a\x9e\xaf\x27\xc8\x75\x6a\x15\xa7\x3f\xd3" - "\x24\xac\xc7\xe3\xfb\x9a\x84\xb4\x4b\x70\xa4\xfb\x21\xb6\x40\x79" - "\xdc\x03\xa1\x91\xf8\x5d\x15\xc6\xad\x72\xf7\x4e\xbe\xfa\xf0\x72" - "\xb3\x72\x43\x3b\x21\x1b\x12\x88\x0a\xfd\x54\x18\xee\xc1\x7a\x14" - "\x9f\x9b\x61\xbb\xc4\x03\x9f\xaa\xfe\xb8\xd6\xac\xcc\x81\xeb\xe8" - "\x43\xb4\x45\x6d\x29\xdf\x08\x75\x87\x7a\x99\x77\xed\xe4\x2b\x2d" - "\x83\xc6\xc5\xab\x34\x44\xd9\x9a\x56\x54\x09\x3c\x27\x04\x39\xca" - "\x26\xb8\xf6\x3a\x5c\x63\xdf\xfc\x8a\x33\xec\x69\x27\x0b\x11\xd7" - "\xa0\x1f\x2b\xae\x2a\x4e\x0d\x47\x5f\x4d\x50\xae\x05\xeb\x82\x31" - "\x6d\x6d\xfb\x86\xa8\xed\xfb\x86\x68\xac\x3b\xc6\xe9\xda\x76\x8c" - "\x9b\x82\x98\x37\x7b\x38\xfd\xb6\x0d\xf9\x3f\xa5\xfb\xe7\xda\x32" - "\x47\xcf\x44\xfe\xd5\x1c\x34\x2d\xaa\x39\x73\xaa\xe5\x4c\x62\x16" - "\xd1\x3c\x83\x78\x77\x6a\xf6\x53\x59\xbc\x6d\xc4\x4c\xc0\xbb\xac" - "\x77\xc9\xd9\xa9\x80\x77\xba\xce\x78\xc7\xd6\x02\xd8\x09\xc3\xbd" - "\x52\x02\x3a\x50\x35\x8e\x1b\xe4\xa5\x07\xdb\x61\x5c\xc1\x98\xc0" - "\xbe\x4f\xf1\x0f\xb0\x4f\x1c\x1f\x38\x76\x10\xdf\xe8\x58\x75\x19" - "\x2b\x38\x3e\x6e\xb7\x10\x35\x8e\x0f\xc4\x3f\x1c\x1f\xb8\xc6\xe6" - "\x4d\x61\x7c\x04\x54\x12\xf5\x5b\x80\x7d\x46\x5b\x31\x1d\x23\x58" - "\xff\x12\x9b\x13\xee\xe1\xb7\x1a\xa7\xf1\xb1\x45\x1c\x1f\x22\xee" - "\xc1\x18\xb0\xe1\xf8\x78\x55\x7b\x5f\xfb\xab\xd2\xf8\x78\xe1\xa2" - "\x9a\x50\x4c\x4c\x3b\x30\x2b\x1b\xc6\x47\x99\xde\x42\xec\x22\xee" - "\xc1\xf8\xc0\x3d\x40\x14\xf7\xfe\x04\xb8\xd7\x00\xb8\x67\x81\x74" - "\x18\x17\x39\x4b\x04\xdc\x13\xc6\x43\xdb\xab\x02\xee\x5d\xd1\x90" - "\xf6\x61\x88\x7b\x6f\x79\xe0\x2b\x17\x5d\x70\xef\xd3\xd3\xbd\xc3" - "\xbd\x4f\xe9\xfa\x07\x94\x61\x3b\xc8\x13\xe5\xf8\x54\x08\x6f\x2b" - "\xc9\x02\xbc\x9b\xf5\x33\x93\x5b\x8c\x7b\xb9\x1d\x12\xe6\xab\xfe" - "\x20\xb3\xfe\x0d\x64\x00\xe2\x1b\xe2\xda\x6e\x0f\x72\x83\x7b\x1b" - "\xf8\x56\x77\xb2\x7b\x37\x3f\xdb\x09\xdb\x10\xd3\x10\xdf\x10\xd7" - "\x10\xe3\x70\x0d\x04\x8c\x91\x3a\xc4\xb7\x5f\x25\x32\x5c\x43\xbc" - "\x4b\xae\x61\x58\x57\x1a\x5d\x45\x92\x27\x93\x7b\x8c\x85\x76\x82" - "\xf1\xb5\x70\x2e\x33\xda\xae\x11\x8c\x97\x85\x18\x87\xb2\xdd\x75" - "\x9d\x61\x1c\xce\x6b\x88\x67\x9d\xe6\x35\x90\x2d\xc8\xe4\x08\xce" - "\x6b\xd4\x36\xa1\xbc\xc3\x77\x37\xea\x21\x03\x89\x2a\x73\x20\xf1" - "\x6b\x4d\x2b\x2e\xe8\xac\x8b\x14\x17\x89\xba\x08\x8e\x71\x1c\xeb" - "\x66\x45\x91\x85\xea\xb0\x43\x1e\x47\x8c\x12\xbe\x89\x3f\x9e\xcb" - "\xf4\xa1\xb2\xcb\xf4\x1c\x74\x7e\x49\xdf\x3f\x1d\xc8\xbe\xc5\x83" - "\x7e\x3f\x68\x54\x3e\xbf\xcd\x62\xc2\x36\x16\x30\xa1\x81\xdf\x31" - "\x81\xf6\xb5\xf9\xc3\x89\x9f\x6d\xc7\x84\x87\xed\x3b\x26\x8c\x61" - "\xfd\xee\xf4\xf8\x53\xf1\x84\xcc\x8e\xf7\xb6\xdf\x9d\x8e\xa4\x75" - "\xf8\x4a\x77\x07\xff\x82\x4e\xc5\x7d\xa5\xeb\x03\x7d\x24\x64\x85" - "\x3d\x85\x5c\xcf\x98\xaf\x4b\xb6\xf1\xe8\x87\x76\x04\xd4\x6b\xef" - "\x69\x1b\x21\xa7\x5b\x08\x31\x4e\x5d\x0a\xf2\x9e\x67\x3a\xcc\x59" - "\x54\xf0\x7e\xf1\xa0\x2f\xd6\x01\xf6\xaa\x9c\xb1\x97\xe1\x2c\x7e" - "\xd5\x27\x0a\x6b\xc6\xfc\x68\x2c\x6b\x46\x31\x09\x80\xf9\x57\x55" - "\xab\x38\x3b\x79\xcd\x3a\x82\xfb\x57\xfb\xc0\xff\xc0\xf6\x81\xa3" - "\x4d\x70\xff\x00\xfe\xab\x59\x0a\xfd\x13\xe4\x1e\xfe\x85\x59\x0a" - "\x5c\x7b\xb0\x9f\xcb\x55\x72\x90\xc6\xd6\x32\xe5\x12\xbc\xbe\xb9" - "\x5d\x45\x79\x19\x07\x79\xca\x5a\x72\xc9\xe6\x38\x3f\x82\xf9\xd9" - "\xfa\xb8\x5c\x82\xf9\xb7\xc4\xa8\xe9\xda\x05\x7a\x9f\x2d\x97\xe0" - "\xbd\x76\x48\x7f\x83\xf3\x27\xe9\x09\x41\xe4\x74\x49\x19\x2d\xe3" - "\x74\xc9\xa7\x04\xcb\x40\xac\x3f\x5d\x72\x9c\x6c\x8d\x0b\x01\x4c" - "\xc8\x85\xeb\x5f\x90\xad\x57\x43\xe1\x58\x0b\xbf\xeb\xa4\x5e\x71" - "\xa6\xe0\x74\x09\x47\x02\xd6\xff\x8e\x07\x2c\xe2\x8d\xb8\x27\x32" - "\x89\xf8\xd6\x2a\xce\x1c\xc5\xf7\x83\x36\xcc\xc5\x3d\xf3\x46\x53" - "\x06\xe1\x93\x5f\x68\xe0\xf8\x17\xae\x70\xc9\x2f\x5c\xc5\xe7\xdb" - "\xf9\x17\x7e\xc0\xe7\x6f\x49\xd0\x08\x6b\x66\x73\xe9\xfa\xbe\xcd" - "\xd7\xc3\x08\xd6\x17\x9f\x8d\xcf\xdc\x1a\xa3\x15\x9e\x1b\x4e\xeb" - "\x87\xcf\xc5\x72\x9d\x9f\x8b\x31\xe9\x35\xcf\xe2\x73\xcf\x3e\x04" - "\xc7\x40\x90\x49\x1e\xca\x02\x9f\xcb\xf1\xba\x3e\x7c\xb2\xce\x87" - "\xde\x63\xad\x73\x77\xcf\x22\xe1\x9e\x5c\xaa\xfb\xc3\x3d\x6d\x3c" - "\xcd\x4f\xcb\x80\xf9\x71\x3d\xa6\x8f\xd4\x19\x48\x67\x39\x96\xdc" - "\xcd\xe6\xcb\xb3\x57\xd8\x7c\xc9\xe4\x4a\xfb\xcb\x0b\xba\x3e\x20" - "\x3b\x35\xce\xad\x50\xc6\x29\x47\x19\x5f\xe9\x7c\x50\xe6\xd8\x77" - "\xc4\xfe\x84\x7d\x49\xec\x47\xb4\x9e\x30\x32\x9c\xfb\x0d\xfc\xf7" - "\x63\xe5\x94\xf4\x17\xcb\x81\x3a\x10\xb1\x2f\x8d\x84\xeb\x9d\xfb" - "\x52\xe9\x77\x52\x5f\x2a\x7d\xdd\x9a\xc4\xf3\xd8\x97\x0c\xcf\xa7" - "\x62\x39\xb3\xa5\xfa\xcc\x52\x60\x3f\xfb\x85\xf5\xaf\x02\x51\x56" - "\x23\x13\x49\x10\x7b\xa7\xd2\xe1\xf4\x9d\x12\x0d\x41\x58\x5f\xf1" - "\x5d\xb0\x1e\xe9\x9c\x86\x88\xef\xb2\xb5\x3d\x0c\xca\xbe\x4a\x84" - "\x7b\xe6\x62\xf9\x62\x3b\x80\xdc\x88\x78\x8f\x98\x3f\x9d\xd3\x42" - "\xdd\xc3\xe9\x3d\xac\xdf\xd5\xba\xe9\x43\xa5\xfb\x5d\xfb\xdd\xed" - "\x89\x04\x88\x30\x70\xac\xe7\x9b\xf0\x39\x4c\xfe\x89\x1f\xdb\xdb" - "\xbe\xd2\xa1\x6c\x95\x42\xfa\x45\xa7\x7e\x21\x94\x6f\x75\x53\x7e" - "\xd9\x6d\xb2\xf2\x75\x50\x7e\x3c\x94\x8f\x1c\xee\x79\xb4\xdd\x95" - "\x51\xff\x3f\x23\xe3\x59\xf9\x62\xdf\xe5\x33\x46\xe6\xea\x13\x70" - "\x9d\x69\x59\x09\xc3\xd5\x22\x1a\x2b\x84\xae\x6f\x52\x72\xb9\x9c" - "\xcb\xfa\x26\xe7\xf5\x6f\x87\x93\x2c\xc2\xda\xa6\xb2\x83\x98\x07" - "\x6d\x64\xc8\x45\x0f\xd6\x9a\x94\xd2\xfa\xa6\x0b\x78\xfd\x7d\x43" - "\x5c\x95\xd3\xfa\xa6\xb2\x4d\x6c\xec\x97\x99\x5b\x95\x44\x09\xe7" - "\xd9\x2c\xbd\x48\xe3\x9c\x2e\xad\x1f\x64\xe9\xb8\x36\x5b\xb0\x17" - "\x37\x9c\x2c\x44\x7b\x61\x99\x55\xb4\xd1\x7a\xd0\x81\xbd\xe0\xca" - "\xe7\xa3\x25\xae\x7c\x3e\xda\x33\x57\x36\xee\xeb\x9a\x2b\x7f\x51" - "\x20\x71\xe5\x73\x81\x6c\xec\x57\x5c\x63\x63\xbf\xe2\x7d\xda\x96" - "\xc1\x7c\x9d\xfd\x2f\xba\x99\x65\x2a\x42\xfb\xd0\x1e\xe0\x1e\x87" - "\x13\x4c\x2e\x5c\x19\xd7\x85\x55\x0c\x9a\x0e\x5c\x19\xe6\xb7\x02" - "\xd6\x0e\xc6\x2b\xd0\xf6\x3e\x46\xab\x95\x60\x3a\xcc\x6d\xd5\xc8" - "\x93\x8f\x73\x26\x65\x0e\xb4\x1f\xfc\x54\x2d\x41\x3a\x8d\x33\x8f" - "\x6e\x4d\x2b\x0f\x75\xcf\x9f\xff\x51\x6e\x93\xf1\xe7\xf2\xc5\x22" - "\x7f\xc6\xfa\x21\x67\x46\xfe\x6c\x43\x1b\xec\xb0\x21\x1a\xe4\xcf" - "\xb6\x1d\xce\xfc\xf9\xf3\x71\x0e\xfe\x1c\xec\xc4\x9f\xe3\x45\xfe" - "\x5c\xbe\xe3\x9f\xfc\xf9\x66\xf1\x67\xd1\x6e\xe0\xca\x9f\x3f\xbf" - "\xad\x77\xfc\xf9\x73\xbf\xff\x2d\xfc\xd9\xad\x5d\xc0\x8d\xdc\xa0" - "\x9f\x37\xd8\xdc\xf0\x67\x1e\xf8\xf3\x9e\x2e\xf8\x33\x8e\x0f\xe4" - "\xce\xc8\x95\x7f\xb5\x10\xb8\x08\x60\x03\x72\x66\x91\x43\x8b\xdc" - "\x19\x39\x33\x72\x6b\x67\x7b\x90\x77\xfc\xf9\xb3\x16\x89\x3f\x0f" - "\x6c\xcc\x96\xf1\xe7\x7f\x58\x3a\xf3\xe7\x0a\x55\x67\xfe\x5c\x1e" - "\x21\xf1\x67\x63\x85\x9c\x3f\x5f\x18\xdc\x99\x3f\x57\x3c\xed\x89" - "\x3f\x23\x67\x46\xfe\x8c\x7a\x07\x72\x67\xf8\x3f\x46\xea\x77\x15" - "\xeb\x7b\xc7\x9f\x2b\x52\x7a\xc6\x9f\x2b\x2e\xbb\xe7\xcf\xc6\x3c" - "\xcf\xfc\xd9\x98\xe7\x9e\x3f\x7f\xb1\x5e\xe2\x3c\x5f\x4c\xfb\xf9" - "\xf3\xe7\x73\x16\xf7\xfc\xe6\x5c\x1b\x72\x08\x68\x43\x33\xf2\xe7" - "\x1b\xcb\x9d\x2b\xcc\xee\xb9\xf3\x17\xcb\x18\xc7\xa8\xa8\xee\xcc" - "\x9d\xe1\x1e\xb7\xdc\xf9\x8b\xbd\xc2\x3d\x66\x39\x77\x66\x65\xc0" - "\x7c\xf9\x91\x67\xee\xfc\xe5\x73\x6c\xfe\xfc\x72\x38\x9b\x3f\x99" - "\x4c\x3b\x73\xe7\x2f\x15\xdd\x73\x67\xd6\x87\x68\x3d\x3d\x72\xe7" - "\x2f\x9f\xec\xcc\x9d\x8d\x79\xee\xb9\xf3\xf9\xa1\x52\x3f\x32\x9d" - "\x90\x73\xe7\x2f\xb7\xfd\x32\xb8\xb3\xc7\xbe\x65\x91\xf3\x66\xd3" - "\x02\xef\x79\xb3\x69\x87\x77\xbc\x19\xfb\x9c\x3b\xde\x6c\xba\xec" - "\xda\xe7\xe4\xbc\xd9\x64\x77\xcf\x9b\xcf\x0f\x92\xf3\x66\x2c\xdf" - "\x1d\x6f\x3e\x3f\x5e\x56\x7e\x27\xde\x7c\x7e\xae\x9c\x37\xb3\x7c" - "\x12\x6f\xbe\xa0\x12\xb8\xd9\x34\xef\x79\xf3\xf9\x9a\xae\x79\xf3" - "\xf9\x2b\x72\xde\x7c\xde\xc0\xf8\xf1\x85\x10\xc6\x9b\xcf\x57\xb0" - "\x74\xe3\x54\xe7\x74\x89\x37\xb3\xf4\xce\xbc\xf9\x42\x44\x37\xbc" - "\x79\x4c\xcf\x79\x73\x8d\xb6\xd8\xc1\x9b\x6b\xb4\x22\x6f\xe6\x80" - "\x4b\xe6\x00\x27\x80\x5f\x1d\xee\x71\xc0\x31\x07\x73\xce\xe5\xae" - "\xb9\x73\xd5\x42\x89\x3b\x9b\xdf\x67\x63\xdf\xbc\x8b\x8d\x7d\xf3" - "\x73\x0e\xee\x7c\x9f\x6e\x66\xe9\x46\x07\x77\x36\x1d\x4e\x28\x77" - "\xe1\xce\xd8\x76\xe6\xc9\x94\x23\x5f\xa7\x6b\x53\xcc\x38\xcf\x4f" - "\x4f\xbc\xc4\x6f\x86\xb9\x1d\xe6\x30\x33\x6b\xdf\x4b\xfb\xb2\x61" - "\xae\x94\xf8\xf5\x57\xd3\x1c\xfc\x3a\x91\xda\xa8\x4d\x94\x5f\xbf" - "\x5c\xae\xdc\x0d\xe5\xc3\x4f\x85\xdc\x1a\x39\x36\x70\xeb\x8a\xdd" - "\x3b\xf9\xf2\x9c\x9d\x7c\x49\x6b\xda\x57\x29\x22\xc7\xde\x02\x69" - "\xe9\x90\x56\x94\x4b\x30\xee\x37\x8d\xfd\x0d\x6d\x5f\xb9\x01\x9e" - "\x89\xf7\x41\xde\x03\x62\x5e\x98\xa7\x2b\x18\x17\xbf\xb4\x90\xf3" - "\x75\xe6\xe2\x5f\xb5\x89\x5c\x3c\x1d\xde\x17\xb9\x95\xc8\xc5\x39" - "\xe0\xe2\xfc\x20\x66\xcf\x96\xf3\xf1\x8b\xa5\x22\x1f\x4f\x77\xe6" - "\xe3\x7a\x91\x8f\x57\x0e\xeb\x25\x1f\x37\xfd\x6f\xe6\xe3\xc8\xc5" - "\x91\x7f\x23\x17\x47\x6e\x8e\x7c\x1c\xb9\x39\x27\xf0\xf1\x9c\x9e" - "\xf0\x71\xe0\x6b\xbc\xaf\xc1\x8f\xf2\x71\x85\x33\x1f\xbf\xb8\xab" - "\x77\x7c\xfc\x62\x96\x33\x1f\x07\x79\x9a\xbc\xe5\xe3\x28\xfb\x4e" - "\xdf\x5d\x71\xcd\x11\xc8\x0f\x65\xd5\xe5\x77\x3a\x41\x8e\x28\x37" - "\x94\x19\xca\xae\x47\x7c\x1c\xfa\x5d\x89\xf5\xd6\xf1\x71\xad\x0b" - "\x1f\x47\xfe\x0d\x6d\x57\x8d\xbc\xdc\x68\x80\xb6\x59\x09\xdc\x1c" - "\x78\x79\xef\x39\xf9\xc5\x8d\xce\x9c\x3c\x67\xa0\x33\x27\xbf\xb4" - "\xb1\x33\x27\xbf\x94\xe5\xc4\xc9\x2b\xcc\x8a\xaf\x68\xcc\x1a\xc3" - "\xcb\xc8\xb5\xbf\x7a\x58\xce\xc7\x6b\xce\x77\xe6\xe3\x97\x2e\x7b" - "\xe2\xe3\xb8\x86\xce\xd5\x9e\xcd\x0d\x12\xed\xd9\xe6\xc0\xde\xf1" - "\x71\xb3\x5a\xd2\x17\xbe\x52\xb3\x39\xe5\x52\x81\x27\x8e\xde\xaa" - "\x76\xe6\xe8\xe6\xd7\x24\x8e\x1e\xeb\xc4\xd1\x2f\x98\x3d\x73\xf4" - "\x0b\x94\x13\xf2\xea\xf9\xd1\x58\x16\x72\x2b\xb4\x85\x68\xe8\x9e" - "\xf9\xaa\x47\x90\x5f\xa1\x8d\x03\xde\x09\x38\x56\x95\xc2\x99\xab" - "\xe3\xf7\xc3\xae\xf8\x94\xfe\x65\x72\x0f\x72\x2a\xe4\x53\x22\xff" - "\xc5\xfc\xc8\xab\x6e\x2e\xa7\xba\x9c\xeb\x9e\x53\x5d\x3e\x48\xf9" - "\x32\xdd\x6b\x69\xde\x88\x73\xe3\x8d\xe5\xec\xe6\x8d\xee\x39\x7b" - "\xd5\x50\xc6\x6f\xcc\x9b\x50\x2e\x72\xce\x0e\xf7\xb8\xe5\xec\x55" - "\xb3\x85\x7b\x36\xca\x39\x3b\x2b\x03\xe6\xe9\x95\x9e\x39\xfb\x37" - "\xfd\xd9\xbc\x5d\x75\x91\xcd\xdb\x82\x8c\x3b\x71\xf6\xaa\xf7\x9d" - "\x39\x3b\xca\xbf\x33\x67\x67\x7d\x8a\xd6\xd3\x23\x67\xaf\xb2\x77" - "\xe6\xec\x17\xcc\xc8\xd9\xdd\xf7\xab\xea\xcb\xf2\x7e\x55\xbd\xde" - "\xca\x89\xdc\xfd\xcf\x50\xde\x37\xd3\x5c\xb9\xfb\x2f\xb0\xaf\xe5" - "\x4a\xfc\x1d\xdf\xa9\x7a\xa8\x77\xfc\x9d\xde\x33\xdb\x3b\xfe\x8e" - "\xfd\xcf\x1d\x7f\xaf\xde\xeb\xda\xff\xe4\xfc\xbd\xfa\x23\xf7\xfc" - "\xbd\xfa\x9c\x9c\xbf\x63\xf9\xee\xf8\x7b\x8d\x42\x56\x7e\x27\xfe" - "\x5e\x73\xb7\x9c\xbf\xb3\x7c\x12\x7f\xaf\x29\x12\xec\x21\xaf\x79" - "\xcf\xdf\x6b\xf6\x75\xcd\xdf\x6b\x0e\xca\xf9\x7b\x4d\x0a\xc3\xd4" - "\x1a\x93\x95\xf2\xf7\x9a\x4c\x96\x7e\x61\xa3\x73\xba\xc4\xdf\x59" - "\xba\xd5\x99\xbf\x1b\x90\xbf\xd7\x58\xba\xe1\xef\x93\x7a\xce\xdf" - "\x1b\xa3\x24\xfe\xde\x18\xd5\x35\x7f\xaf\xdd\xdb\x35\x7f\xbf\x9a" - "\x2d\xf1\xf7\x86\x2b\x0c\x07\x1a\x3e\x63\x38\xd0\xb0\xcd\x03\x7f" - "\x2f\x71\xcf\xdf\x1b\xd6\x39\xf1\xf7\x4a\xe4\xed\x30\xe7\x55\x22" - "\x3f\xc0\xf5\x23\xc0\xdb\x4d\x86\x18\x9a\x6f\x31\xf2\x7b\xe4\xf4" - "\x70\xdd\xbc\x19\xff\x73\xf4\x9e\x0a\x5c\xcf\x45\x79\x7c\x2d\xe5" - "\xfc\x15\x4c\x26\xdf\x9f\x86\x7b\xcb\x25\xce\xff\xed\x78\x17\xce" - "\x5f\xd2\x05\xe7\x2f\x06\xce\x5f\x04\x9c\xdf\xd0\x9a\xf6\x6d\xac" - "\x13\xe7\x2f\x02\xce\x6f\x70\xe1\xfc\x26\xe0\xfc\x95\x78\x1f\xde" - "\x03\xf9\xf3\x64\xf9\xa1\xae\x34\x7f\x13\xfd\x61\xfe\x72\xc8\x5f" - "\xc1\x74\x84\x6f\xcb\x9d\x74\x84\x62\xa6\x23\x7c\xbf\x89\x97\xe9" - "\x08\x75\x77\x7b\xaf\x23\x7c\xd7\xd8\xb5\x8e\x50\xf7\x64\x2f\x75" - "\x84\x92\x7f\xea\x08\xbd\xd5\x11\xbe\xfb\xa8\x77\x3a\xc2\x77\xc7" - "\x5c\x74\x84\x92\x7f\xea\x08\x3f\x07\x1d\xe1\xbb\x7c\x87\x8e\x90" - "\x3a\xb0\x71\xcf\x40\xb6\xfe\x9e\xe9\x08\xdf\xe7\x77\xd6\x11\xbe" - "\x3f\xe6\xa4\x23\x14\x9b\x15\xdf\x9a\x25\x1d\xe1\x5b\xad\x5c\x47" - "\x68\x0a\xec\xac\x23\x34\xf4\xe9\x9d\x8e\xd0\xf0\x48\xef\x74\x84" - "\x86\x87\x59\xfd\xf0\xfb\x64\xad\x95\xcd\x5b\xdf\x57\x48\x7a\x43" - "\x6d\xb9\x73\x5a\xf7\x7a\x43\xc3\x47\xee\xf5\x86\xda\x5c\xcf\x7a" - "\x43\x6d\xae\x67\xbd\xe1\xea\x32\x39\xbf\xbb\xfa\xd8\x2f\x43\x6f" - "\xb8\x62\x72\xcf\xe5\xae\xd4\x48\x7a\x43\xc3\xb1\x1b\xaf\x37\x34" - "\x1c\x73\xaf\x37\x5c\x7d\x8e\xf1\xaa\x06\x43\x67\xbd\x01\xee\x71" - "\xab\x37\x5c\xdd\x22\xdc\x73\x4c\xae\x37\xb0\x32\x80\x1f\xec\xf7" - "\xac\x37\xfc\x30\x99\xf1\x85\x1f\x06\x31\xbe\x20\xc8\xb8\x93\xde" - "\x70\xf5\x4a\xf7\x7a\x03\xeb\x53\xb4\x9e\x1e\xf5\x86\x1f\x1e\xe9" - "\xac\x37\xd4\xe6\x7a\xd6\x1b\x1a\x07\xcb\xfb\x95\xe5\xa8\x5c\x6f" - "\xf8\xe1\xb5\x5f\x8e\xde\xe0\xb1\xaf\x99\xe4\x7a\x83\xe5\x39\xef" - "\xf5\x06\xcb\x16\xef\xf4\x06\xec\x7f\xee\xf4\x06\xcb\x79\xd7\xfe" - "\x27\xd7\x1b\x2c\xd7\xdc\xeb\x0d\x8d\xfd\x89\x4c\x6f\xc0\xf2\xdd" - "\xe9\x0d\x8d\x8f\xc9\xca\xef\xa4\x37\x34\xce\x96\xeb\x0d\x2c\x9f" - "\xa4\x37\x34\xda\x18\x26\xd7\x4e\xf6\x5e\x6f\x68\xbc\xd8\xb5\xde" - "\xd0\x58\x23\xd7\x1b\x1a\x0b\x19\xa6\x36\xa9\x99\xde\xd0\x58\xc2" - "\xd2\x6b\x27\x39\xa7\x4b\x7a\x03\x4b\xef\xac\x37\x34\x69\xbb\xd1" - "\x1b\xfc\x6d\x79\x43\xd4\xed\x61\x43\x34\xed\x99\xd3\x22\x47\x56" - "\xdf\x6b\x77\xc4\x2a\x88\x82\xb9\xbe\x12\x38\xc5\x02\xa2\x44\xff" - "\x00\x49\x9f\x01\xc7\x5b\xc0\xf6\x08\x20\x7f\x38\x14\x87\xfc\xc1" - "\xd0\x07\xda\x94\x74\x04\x0d\xb7\xd8\xc2\x47\x45\x20\x87\x68\xcb" - "\x1b\x6c\xb1\x66\x8e\x9b\xd2\x86\xfb\x03\x96\x12\xe5\xfc\x06\xf7" - "\x9c\x62\x6d\x25\xcf\x41\x9f\xf7\x9b\x31\x87\xf1\x89\xd2\xe8\x1a" - "\xda\x8f\x91\x4b\xbc\x05\x5c\xc2\xd8\x62\xa2\xdc\xc2\x3f\x4a\x43" - "\xb2\x93\x48\x50\xff\x06\xa2\xee\xaf\x50\xf8\xfe\x1e\x7a\xa8\x1d" - "\x78\xc5\xe4\xe1\x3c\x37\xa2\x5a\x83\xfe\x7d\x06\x30\x6e\x51\xd8" - "\xc7\x26\x70\x8b\x37\xae\x93\xf0\xdd\x71\xc0\x29\x4a\x19\xa7\xc0" - "\xb8\x06\x6d\x8c\x53\xdc\xd3\xde\xaa\xbd\xcf\xb1\x3f\xc0\xb1\xef" - "\x43\xda\x1f\xd0\xb1\x4d\xe2\x13\xc8\x25\xf8\xf9\x5a\xf2\xa0\x95" - "\xad\xdb\x48\x78\x9a\xad\x99\x0d\xaf\x06\x3d\x66\x1e\xf1\x2b\x89" - "\xaa\xc2\x7d\xfb\x21\x25\xd5\xfb\xc8\x9a\x27\xc9\x3d\x36\xe4\x0f" - "\xa9\x7c\x41\x49\xf5\x0e\x82\xbe\x0b\x81\x5f\x8e\xc9\x12\x38\xc4" - "\xd4\x05\x1e\x38\x04\xcc\xd5\xc8\x23\xd8\x1c\xdd\x7c\xfe\x94\xf6" - "\x14\xf1\x9e\x1b\x36\xd3\xf8\x57\x1e\xf7\x0a\xe7\x0d\xd1\xd8\xc2" - "\x06\x5b\xec\x41\xd3\x22\x99\x2f\xcb\x09\x7a\xee\x2f\xcf\x45\xa1" - "\x8f\xc2\xf7\xaa\xea\x14\xe8\x97\x1b\x63\x54\x72\x07\x46\x45\xc8" - "\xf6\x74\x74\x08\x32\xeb\x60\x32\x43\x0e\x38\xb7\x81\xf0\xf3\x6d" - "\x4a\xf2\xff\xd9\xfb\xfa\xb8\xa8\xaa\xfc\xff\xc3\xbd\xa3\xa2\x22" - "\x0f\x06\x2e\xba\x64\x63\x61\x21\x8c\x86\xa5\x2d\x16\x6e\xa8\x58" - "\xf8\x4b\x04\x5b\xdd\xd0\x4c\xd1\x40\xb1\x50\x51\x51\xc9\x07\x9e" - "\x52\x53\x43\x1c\x0a\x5c\x54\x14\xec\x8b\xad\xf6\x55\xc3\xd2\x5d" - "\xdc\x74\x9b\x36\xdc\x45\x43\xc0\x56\x77\xb1\xd5\x6d\x72\xd1\xd0" - "\xd0\x46\x45\x79\x9a\x99\xfb\xfb\x9c\x7b\xee\x78\xe7\xce\xdc\x3b" - "\xcc\x9d\x01\x16\xfd\xfa\xc7\xbc\x60\xee\x3d\xf7\xdc\x73\x3e\x9f" - "\xf7\xf9\x9c\xf7\xfb\xcc\x79\x80\x7b\xee\xec\x9a\x8e\x26\x2d\xe2" - "\xcf\xaa\xf4\x45\xbb\x8c\x64\x3f\x48\xe3\xaa\x84\x9e\x46\xf0\x0b" - "\x93\x49\xa1\x03\x77\x9b\x58\xde\x97\x85\xcf\xaf\xcc\x70\xe9\x83" - "\x79\x1f\x60\xbf\x57\x61\x0b\xf8\xe8\x07\xe2\x23\x26\xd3\x95\xfd" - "\xab\x5f\x15\xa0\x84\xbc\x1f\x6f\x6d\x05\xde\xc7\x9d\x75\x69\xda" - "\x1b\x97\x5d\x9f\xd3\x82\xd7\xe7\xd4\x20\x7d\x0e\xd9\x6f\x10\x70" - "\xe1\x82\xf7\xf2\x80\x32\xf8\xb1\xeb\x72\x5a\x03\x30\x8e\x3c\x77" - "\x5d\xc1\x6b\x89\xbe\x63\xfd\x63\xe0\xfc\x82\xcf\xbc\x34\xf1\xb9" - "\xca\xbd\xe7\xc8\xda\x4c\x0b\x5f\xb4\xee\xe9\xaf\x33\xf9\x83\x59" - "\x7f\x2b\x14\xcf\xb7\xb9\xe1\x72\x67\xf1\x89\x64\xe0\x4e\xc9\x72" - "\xfd\x72\x27\xa9\x6b\xf8\xc5\xf3\x01\xf3\x4b\x83\x92\xf8\xa5\xb1" - "\xa7\x63\x7e\x69\x94\xdc\xff\xa0\x73\xfd\xe2\xfa\x80\xf9\xe5\x4e" - "\x29\xf1\x4b\xd3\x6e\xc7\xfc\xd2\x54\x64\xcb\x2f\x78\x8c\xcb\x34" - "\xbe\x65\x1a\xdb\xc2\xfd\x29\xab\x8b\x28\x94\x78\x6f\x3e\x27\xfc" - "\x6f\x3e\x9f\xb3\xa2\x0c\xaf\xc9\xdf\x84\x4e\x85\xe3\xbe\xb2\x79" - "\x99\xed\x31\x2d\x83\xd9\x7c\x4e\x3d\x37\xb6\xdd\x7a\x93\x70\xd4" - "\xd6\x43\x38\x5f\xbc\xee\x09\xaf\x9d\xfb\x74\xb9\x96\xda\x0c\x5c" - "\x71\x33\xf4\xe5\xd8\xf6\x64\xff\xf5\xd6\x21\x78\xbc\xea\xcb\xbb" - "\x5a\x4a\x0d\xb6\x67\xfb\xcb\xc7\xa7\xc5\xee\x1f\xa0\x73\xc1\x7d" - "\x26\xde\x0f\x96\x31\x5b\x0b\x69\xc8\x8b\x0c\xbb\x8d\xc7\x71\xb8" - "\x75\x4b\x2d\x3e\xa3\x23\x0c\x43\x87\x06\x8b\xe1\x89\x5d\x63\x09" - "\x7d\xe6\xce\x16\xe8\x0f\x1b\x90\xe7\xcc\x24\x1e\x5b\xc6\x55\x01" - "\x7d\x2b\x81\xa3\xef\xc4\xfb\xf2\x42\x5f\xc9\xb4\x26\xf4\x7c\x7d" - "\x1f\x94\x95\xc3\x14\xbc\x5b\x1a\x53\xdb\x84\x98\xba\xcd\x61\x0a" - "\xb0\x75\x0f\x53\x66\x6b\x24\xa7\x10\x4c\x69\xef\x61\x8a\xed\x2b" - "\x57\x05\xf8\x61\x5c\x99\x30\x85\xfb\x49\x82\xa9\x4b\x92\x98\xfa" - "\xe6\x82\x38\xa6\xf4\x83\xcd\x31\xd5\x18\x4d\x30\xd5\x72\xe7\xc4" - "\x0c\xc0\xd4\x0c\xb9\x98\x6a\x69\x10\x68\x6a\xca\x45\x64\x1e\x5c" - "\xeb\x34\x4b\x4d\x6d\xd2\xd0\xb7\x7d\xc6\x06\xdf\x06\x1d\xdd\x70" - "\x4f\x47\xb7\xae\x71\x4c\x47\xb7\xae\xb6\x6f\xee\x5b\xeb\xc5\x53" - "\x90\xf2\x14\xb4\x9f\xaa\x68\x32\xf7\x6d\x3f\xab\x8f\x9b\x53\x30" - "\xee\xc4\xf5\x31\xb9\x67\x3d\x67\xc9\x60\x36\xf7\xcd\x10\xd9\xfc" - "\x81\xf8\xdc\xb7\x4f\x52\xf3\xcd\xb4\x4a\xbe\xc8\xfc\xa4\x7c\x8b" - "\xf9\x49\xf9\x22\x3a\x25\x1f\xe1\x67\xcd\x75\xca\xa9\x68\xa2\x53" - "\x4e\x45\x63\x9d\x92\xcf\xf2\xbb\x53\xd1\x26\x9d\x92\x0f\xf7\x89" - "\x4e\x39\x15\x7d\x05\x3e\x58\xa7\xe8\xeb\x4f\x45\x8b\xe9\x14\xfd" - "\x1d\xc2\x7b\x5b\x2f\xd8\x5e\x3b\x92\x6f\xa6\x89\xf3\xcd\x34\x71" - "\x3e\xa7\x89\xf3\x59\x4d\x4c\xde\xab\x62\xcb\x87\xdf\x8b\xf3\x35" - "\x7f\x2f\xaf\x19\x0c\xdc\xfc\xb7\x56\x2d\xf6\x85\x50\x13\xc3\x33" - "\x29\x62\x9a\xd8\xc0\xfd\xfe\xd1\x7a\xc1\xa4\x89\x5b\x48\x7a\x36" - "\x0f\x88\x2f\x36\xe6\xbf\x19\xb9\xf9\x6f\x46\x6e\xfe\x1b\xf1\xab" - "\xb5\x26\x36\xda\x31\xff\x8d\xe0\x88\x2d\x67\x92\x94\x26\x36\x8a" - "\xcc\x7f\x6b\x4e\x16\x9d\xff\x46\xa1\xc1\x3c\x96\x98\x13\xc2\xf9" - "\x6f\x46\xc1\xfc\x37\x8c\xb3\xfb\x0c\x5f\xf5\x26\x5f\xf1\x73\xe0" - "\x98\x78\x71\x2d\x9c\x6f\xa6\x85\xf3\x59\x2d\x7c\x2a\xda\x34\x07" - "\x8e\xd9\x86\xf3\xb7\xd6\xc2\xf9\xf7\xd2\x9b\xb4\x30\x7e\x86\xe0" - "\x4e\x4c\x0b\x33\x97\x2d\x71\x27\xd0\xc2\xa0\xf3\x4c\x5a\xb8\xe5" - "\x75\x33\x2d\x4c\xa1\xfe\x42\x2d\x8c\xf3\x17\xd1\xc2\x14\x1a\x2f" - "\xc8\xdf\x52\x0b\x53\x68\xb6\x49\x0b\xe3\xfc\x4d\xd8\xbd\xa7\x85" - "\x29\x17\x6e\x0e\x5c\xf3\xa3\xb2\xb5\x30\x85\xd8\x39\x70\x07\xb6" - "\x93\xdf\xa8\x04\x3a\x98\x42\xc2\xf9\x6f\x14\x22\xf3\xdf\x28\x17" - "\x32\xff\x8d\x42\xdc\xfc\xb7\x66\x3f\xf3\xeb\xbc\x0e\x26\xd7\xf1" - "\xfc\x37\x76\xde\xdb\x26\x17\x99\xfa\xf7\x17\x5d\x50\xff\xfa\xda" - "\xd0\xbf\xbe\x0f\x96\xfe\xa5\x28\xc7\xf4\x2f\x45\x75\x11\xfd\xfb" - "\x80\xe9\xac\x4d\x2e\x44\xff\x52\x0a\xc7\xf4\x2f\xa5\xe8\x22\xfa" - "\xf7\x01\xd3\x59\x9b\x68\xa2\x7f\xa9\xee\x8e\xe9\x5f\xaa\xbb\x4d" - "\xfd\x6b\x5b\x67\xf5\x39\xcb\xeb\xac\x3e\x67\x25\x75\x16\xd5\xfd" - "\xa2\x4d\x9d\x45\xf5\xf6\xbd\xa7\xb3\xa8\x9e\xcb\x58\xde\x43\xf5" - "\x9c\xc6\xf2\x1e\xaa\x67\xff\x36\x75\x16\xe5\x9a\xf3\x50\x67\xb5" - "\xa3\xce\xda\xa4\x20\xda\x9d\x72\x7d\xc3\x21\x9d\x45\xb9\xce\x10" - "\xea\x2c\xf7\x0c\x2b\x9d\x45\xb9\x7e\x65\xb7\xce\xa2\x5c\x2f\x3b" - "\xa4\xb3\x28\xd7\x5a\xbb\x74\x16\xd5\x73\xbc\xa8\xce\xa2\xba\x6b" - "\x25\x75\x16\x77\xcf\x9a\x1b\xf7\xe2\xd7\x55\x53\xbd\x8e\x74\x79" - "\x9d\x45\xf5\x9a\x22\xca\x83\xa9\x5e\x6f\x10\x5e\xd5\x33\xbc\x43" - "\x74\x16\xe4\x2b\xaa\xb3\xa8\x5e\xe7\x58\x3e\x4a\xf5\x8c\xb0\xd2" - "\x59\xf8\x19\x31\x9d\x45\xf5\xee\xc9\x3d\x13\x2e\xd0\x59\x5c\x1e" - "\x10\x5f\x06\x4b\xea\x2c\xaa\xf7\x57\x24\xde\xf4\xce\x21\xf1\x86" - "\xf8\xd5\x4a\x67\x51\xbd\xe7\xb7\xa9\xb3\x38\x1c\xb1\xe5\x94\xd2" - "\x59\x54\xef\x43\x56\x3a\x8b\xea\x7e\x41\x5c\x67\xf5\xd9\xcc\x63" - "\xa9\xcf\x50\x81\xce\xa2\x7a\x37\xdf\x17\x3a\x4b\x1a\x5f\x53\xac" - "\x74\x16\xe5\x76\x5a\xb6\xce\xa2\xfa\xb8\xc8\xd2\x59\x2c\xee\x44" - "\x74\x16\xd5\x27\xd2\x12\x77\x42\x9d\xd5\x67\xbe\xb8\xce\xea\x93" - "\x21\xd0\x59\x6c\xfe\x62\x3a\xab\xcf\x01\x41\xfe\x56\x3a\xab\xcf" - "\x49\x81\xce\xe2\xd2\xf1\x3a\xcb\x3d\x91\xc4\xd2\xee\xf2\xe7\x2a" - "\x52\xee\x91\xd2\x3a\xcb\x7d\xaa\x50\x67\xb9\x07\x90\x76\xef\x9e" - "\x4e\x74\x96\x7b\x28\xb9\xde\x7d\xad\xf9\xf5\x7b\x3a\x8b\xbb\xce" - "\xeb\x2c\x77\xb5\x3c\x9d\xe5\xd1\x05\x75\x96\xa7\x0d\x9d\xe5\xf9" - "\x80\xe9\x2c\xcf\x31\x8e\xe9\x2c\xcf\xb0\x87\x7c\xbe\x23\xf8\xbc" - "\x7b\x31\xe1\x5e\x5e\xe7\x1d\xe3\xf3\x5e\x36\xf5\xaf\x6d\x3e\xdf" - "\xbf\x98\xe7\xf3\xfd\x8b\xa5\xf9\x7c\xdf\x03\xb6\xf9\x7c\xbf\x3a" - "\x9e\xcf\xfb\x90\xb9\x3d\x94\x0f\x19\xc7\xa4\xbc\xaf\xb6\xcd\xe7" - "\xbd\x67\x3f\xe4\xf3\xed\xc9\xe7\x3d\x37\x10\x4c\x79\x0f\x75\x8c" - "\xcf\x7b\xab\x84\x7c\x7e\xc0\x64\x6b\x3e\xef\x9d\x63\x3f\x9f\xf7" - "\x3e\xe2\x18\x9f\xf7\x3e\x6c\x1f\x9f\xf7\xf1\x11\xe7\xf3\x7d\x4b" - "\xa4\xf9\x3c\xb9\x67\xcd\xc1\xfa\x1d\xe5\x39\x58\xbf\x75\x5d\x9f" - "\xcf\xf7\xf3\x17\xe7\x5b\xfd\x86\x92\xfe\xdb\xc7\xbb\x63\xf8\xbc" - "\x8f\xb7\x38\x9f\xef\xb7\x87\xf0\x1e\x1f\x5f\x6b\x3e\x0f\xcf\x88" - "\xf2\xf9\x7e\xe7\xb9\x67\xbc\x85\x7c\x9e\xe4\x01\xf1\xe5\x8e\x34" - "\x9f\xff\x45\x0e\x89\x37\xbf\x98\x4d\xe2\x0d\xf1\xab\x35\x9f\xff" - "\xc5\xa8\xb6\xf9\x3c\xc1\x11\x5b\x4e\x49\x3e\xff\x8b\x0c\x6b\x3e" - "\xdf\x77\xbf\x38\x9f\xef\xff\x06\x8f\x25\x5f\x83\x90\xcf\xff\xe2" - "\xe4\xfd\xc1\xe7\x25\xf1\xe5\x6f\xcd\xe7\x7d\x77\xca\xe7\xf3\xbe" - "\x67\xe4\xf1\x79\x8c\x3b\x31\x3e\xdf\xff\x51\x4b\xdc\x09\xf9\x7c" - "\xff\x51\xe2\x7c\xbe\xff\x64\x21\x9f\xc7\xf9\x8b\xf1\xf9\xfe\x6b" - "\x04\xf9\x5b\xf1\xf9\xfe\xdb\x84\x7c\x9e\xa4\xe3\xf9\xfc\x80\x50" - "\x12\x4b\xfb\x4e\x95\xcf\xe7\x07\x3c\x2a\xcd\xe7\x07\x0c\x16\xf2" - "\xf9\xfe\x64\x9e\x36\x35\x20\x9a\xf0\xf9\x01\x6e\xe4\x7a\xdf\x29" - "\xe6\xd7\x79\x3e\x4f\xae\xf3\x7c\x7e\x40\xac\x3c\x3e\xdf\xa3\x0b" - "\xf2\x79\x57\x1b\x7c\xde\xf5\x01\xe3\xf3\x7e\x5e\x8e\xf1\x79\x3f" - "\x4f\xc7\x79\xe3\x13\x17\x78\xde\xf8\xc4\x05\x69\xde\xe8\x77\xd9" - "\x36\x6f\x1c\xa4\xe4\x79\xe3\x63\x6b\x48\x1c\x7f\x8c\x8b\xe3\x8f" - "\x0d\x6a\x9b\x37\x0e\xdc\xf6\x90\x37\xb6\x27\x6f\x1c\x90\x4c\x78" - "\xe3\xc0\x78\xc7\x78\xe3\xc0\x38\x21\x6f\xf4\xdf\x68\xcd\x1b\x07" - "\x9e\xb4\x9f\x37\x0e\xbc\xee\x18\x6f\x1c\x58\x6f\x1f\x6f\x7c\x2c" - "\x52\x9c\x37\xfa\xd5\x49\xf3\x46\x72\xcf\xba\xaf\x57\xde\xe4\xfb" - "\x7a\xe5\xf1\xae\xcf\x1b\x95\x33\xc4\xfb\x75\x65\x3c\xe9\x27\x1e" - "\x9b\xd8\x31\xbc\xf1\xb1\x89\xe2\xbc\x51\x79\x91\xf4\xaf\x8f\x45" - "\x5b\xf3\x46\x78\x46\x94\x37\x0e\xf2\xe2\x9e\x99\x28\xe4\x8d\x24" - "\x0f\x88\x2f\x43\xa5\x79\xe3\xa0\x93\x24\xde\x0c\x22\x7b\xce\x70" - "\x7e\xb5\xe6\x8d\x83\x16\xb7\xcd\x1b\x09\x8e\xd8\x72\x4a\xf2\xc6" - "\x41\x47\xad\x79\xa3\x5f\xad\x38\x6f\x7c\x22\x8f\xc7\xd2\x13\x23" - "\x85\xbc\xf1\x71\x97\xfb\x83\x37\x4a\xe2\x6b\x86\x35\x6f\x7c\xfc" - "\x9c\x7c\xde\xf8\x44\x4f\x79\xbc\x11\xe3\x4e\x8c\x37\x3e\x31\xd5" - "\x12\x77\x42\xde\xf8\xc4\x62\x71\xde\xf8\xc4\x46\x21\x6f\xc4\xf9" - "\x8b\xf1\xc6\x27\x8e\x08\xf2\xb7\xe2\x8d\x4f\x9c\x11\xf2\x46\x92" - "\x8e\xe7\x8d\xfe\xc9\x24\x96\xfa\x6d\x96\xcf\x1b\xfd\xa7\x4a\xf3" - "\x46\xff\x37\x84\xbc\xd1\x3f\x98\xb4\x7b\xff\x0d\x84\x37\xfa\x87" - "\x93\xeb\x7e\x59\xe6\xd7\x79\xde\x48\xae\xf3\xbc\xd1\x3f\xbf\x2d" - "\xde\x68\x9b\x53\xa8\x42\x79\x4e\xa1\x0a\x35\xe7\x14\x27\x05\x9c" - "\x62\xf0\x28\xdb\x9c\x62\xc8\x5a\x9e\x53\x3c\x75\x99\xb4\xf1\xa7" - "\x4e\x92\x36\xfe\x14\xeb\xb3\xd6\x8f\xfd\xc2\xd6\x9c\x46\xd4\xc1" - "\x1b\xa5\xd4\xfb\xcb\x91\x22\x6b\x39\x70\x0a\xe0\x77\x49\xd3\x31" - "\xa7\x78\xca\x25\x72\xf5\xf7\x8c\x5b\x01\xf0\xd8\x5a\x8e\xd7\x26" - "\x01\xaf\xad\x85\xef\xd0\x5e\x8e\x2f\x2c\xa5\x2a\x81\x7b\xaa\x81" - "\xfb\xb1\x6b\x9b\xd9\x75\xcf\xda\x6e\xec\xf9\x19\x37\x80\x73\xcc" - "\x69\xfb\xbc\x13\xd3\x59\x27\xab\x6b\x19\x23\x3e\xdb\x24\x2a\xce" - "\xec\xcc\x13\x7c\x7e\xa9\xae\x0e\xe1\x73\x4f\x0a\x96\x20\x6f\x7c" - "\xd6\x89\x47\x1d\xf2\x74\xcf\x70\x71\xc7\x67\x9e\xb8\x37\x10\xee" - "\x7a\xc0\x58\x4e\xb8\xeb\x52\xdf\x5e\x59\xb7\x90\x6a\xd7\x2d\x9e" - "\x5b\x7c\x88\x79\xc5\xd2\x00\x65\xc3\xd2\x80\x81\xb7\x6f\x03\x77" - "\xd5\x59\x9e\x89\xf1\xc9\x5e\x7c\xd6\x09\x3e\x7b\x52\xcf\x71\x57" - "\x66\x5e\x00\x2a\x9c\x8b\x5c\xf1\x58\xe7\x30\x7c\x1e\xc6\x69\xe4" - "\xf9\x94\x1f\xc4\xfa\xdb\x01\x7e\xe6\xfb\x5c\xe2\x71\x4f\xe3\xed" - "\x00\x54\x11\xfb\x1d\xbb\x6e\x56\x6f\x5a\x37\x7b\x0b\x85\xe8\x96" - "\x06\x50\xdb\x97\x98\x71\x57\x1f\xcc\x5d\x9f\xb7\xc1\x5d\x9f\x3c" - "\xed\x18\x77\x7d\xb2\x42\xc8\x33\x54\x57\xad\x79\xc6\x53\xc3\xed" - "\xe7\x19\x4f\x4d\x75\x8c\x67\x3c\x35\xc5\x3e\x9e\xf1\xd4\x11\x4b" - "\x9e\xb1\x8f\xe5\x19\x83\x43\x31\x16\xc5\x79\x06\xb9\x67\xdd\x37" - "\x0c\x99\xca\xf7\x0d\x43\x06\x75\x7d\x9e\x11\x50\x26\xde\x0f\x04" - "\x9c\x66\xf7\xb4\xa4\x9e\x3a\x2c\xbd\xa7\xa5\xa3\x1c\xe3\xa9\xc3" - "\xe2\x1c\x63\x08\xd9\xff\x0f\xee\x9b\xfa\x20\x9e\x63\xc0\x33\xa2" - "\x1c\x63\xc8\x32\xcb\x67\x08\xc7\x78\xaa\x94\x70\x8c\x21\x39\xd2" - "\x1c\x23\x70\x28\x89\x3f\x43\x0c\x24\xfe\x10\x9f\x5a\x73\x8c\x21" - "\xe7\xda\xe6\x18\x04\x43\x6c\x39\x25\x39\x46\xe0\xa3\xd6\x1c\x63" - "\x70\x88\x38\xc7\x08\xba\xc3\xe3\x28\x28\x4f\xc8\x31\x02\xe3\xef" - "\x0f\x8e\x21\x89\xad\x32\x21\xbf\x08\x1a\x29\x9f\x5f\x04\xcd\x97" - "\xc7\x2f\x30\xe6\xc4\xf8\x45\x10\xd7\xff\x13\xbc\x58\xf3\x8b\xa0" - "\x33\xe2\xfc\x22\xe8\xaa\x90\x5f\xe0\xfc\xc5\xf8\x85\xca\x47\x90" - "\xbf\x15\xbf\x50\x0d\x17\xf2\x0b\x92\x8e\xe7\x17\xaa\xb3\x9c\x56" - "\xfb\x41\x3e\xbf\x50\x1d\x91\xe6\x17\xaa\xe3\x42\x7e\xa1\x52\x13" - "\x1e\xa1\xaa\x23\xfc\x42\x55\xcc\xf1\x0e\xad\xf9\x75\x9e\x5f\x90" - "\xeb\x3c\xbf\x50\xb5\xb5\xff\xfb\xc3\xf5\xac\x5d\x6a\x5c\x6a\xd8" - "\x3e\xc7\xfa\xf6\x61\x7b\xbb\xc6\xef\xcc\x0f\xd8\x7a\xd6\x4d\x43" - "\xdd\xc8\xd8\x4e\xf0\x18\xc7\x7e\x67\x0e\xee\x22\xbf\xff\x3f\x68" - "\xf3\xac\x87\xe9\x88\x5f\x86\x3b\xf8\xfb\xff\xf0\x2e\x32\xff\xfd" - "\x41\x9b\x97\x11\xcc\xfd\x86\xfe\xac\x83\xf3\xdf\x9f\xb5\x39\xff" - "\xdd\xb6\x16\x7e\x61\x22\xaf\x85\x5f\x98\x28\x3d\xbe\x3e\x62\xbc" - "\x6d\x2d\x1c\x92\xcb\x6b\xe1\xe7\xee\x10\x2e\xfa\xdc\x79\xc2\x45" - "\x9f\x63\x7f\xaf\xd2\x3f\x1e\x13\x4d\xc6\xd7\x35\x22\xe3\xeb\xcf" - "\x79\xe1\x7d\xd2\xee\xed\x9f\x46\x8d\xc8\x30\xdf\x3f\xed\xcf\xf0" - "\xcc\xc3\x71\xf7\xf6\x18\x77\x7f\x86\x9b\xd3\x3f\xf2\xa2\x63\xe3" - "\xee\x23\x2f\x08\xf5\xf0\x0b\xcd\xd6\x7a\xf8\xb9\x31\xf6\xeb\xe1" - "\xe7\xe2\x1d\xd3\xc3\xcf\xc5\xd9\xa7\x87\x9f\x3b\x21\x3e\xee\x3e" - "\x22\x02\xe3\x51\x5c\x0f\x93\x7b\xd6\x3a\x26\x24\x9e\xd7\x31\x21" - "\xc3\xbb\xbe\x1e\xfe\xd5\x59\x71\xcd\xf2\xab\x8b\x44\x0f\x3f\x57" - "\xd6\xfe\x7a\xf8\xb9\x32\x71\x3d\x1c\x32\x99\x68\x87\xe7\xca\xad" - "\xc7\xdc\xe1\x19\x51\x3d\x1c\xb2\x8e\x7b\xa6\x4c\xa8\x87\x49\x1e" - "\x10\x73\x76\x4b\xeb\xe1\x51\xa3\x49\x0c\x1a\xd5\x87\xc4\x20\xe2" - "\x53\x6b\x3d\x1c\x72\xb9\x6d\x3d\x4c\x30\xc4\x96\x53\x52\x0f\x8f" - "\x1a\x6a\xad\x87\x47\x84\x8b\xeb\xe1\x17\xba\xf1\x38\x7a\x7e\x8f" - "\x50\x0f\x8f\x5a\x76\x7f\xe8\x61\x49\x6c\x9d\x15\xea\xe1\xe7\xc7" - "\xcb\xd7\xc3\xcf\xbf\x23\x4f\x0f\x63\xcc\x89\xe9\xe1\xe7\x4f\x58" - "\x62\x4e\xa8\x87\x9f\xff\x41\x5c\x0f\x3f\xdf\x2c\xd4\xc3\x38\x7f" - "\x31\x3d\xfc\xc2\x60\x41\xfe\x56\x7a\xf8\x85\x31\x42\x3d\x4c\xd2" - "\xf1\x7a\xf8\x85\x5a\x12\x43\x9f\xbd\x2e\x5f\x0f\xbf\x70\x42\x5a" - "\x0f\xbf\x70\x5a\xa8\x87\x5f\x28\x22\xba\xf7\x85\x26\xa2\x87\x5f" - "\x38\x4c\xae\x3f\x5b\x6f\x7e\x9d\xd7\xc3\xe4\x3a\xaf\x87\x43\x5d" - "\x1f\xae\x6f\xbd\x9f\xf4\xf0\xe8\xa3\x8e\xe9\xe1\xd1\xa5\x5d\x83" - "\xdf\x3f\x68\xba\x2b\xd4\x8f\x70\xae\x17\x27\x3b\xc6\xef\x5f\x8c" - "\xee\x1a\x7e\x79\xd0\x74\xd7\xaf\x11\xf1\x4b\xd8\x55\xc7\xfc\x12" - "\x56\xe7\xb8\xee\x8a\x28\xe3\x75\x57\x44\x99\xb4\xee\x1a\x73\xdc" - "\xb6\xee\x7a\xc9\x8d\xd7\x5d\xe1\x0b\x08\xe7\x09\x9f\x4c\x38\x4f" - "\xb8\x57\xdb\xba\x6b\xdc\x46\xa1\xee\x1a\xd3\xfc\x50\x77\x75\x84" - "\xee\x7a\x31\x9f\x60\x6d\xdc\x54\xc7\x74\xd7\xb8\x29\x42\xdd\x35" - "\x61\xb1\xb5\xee\x1a\x77\xd4\x7e\xdd\x35\xee\xa2\x63\xba\x6b\xdc" - "\x05\xfb\x74\x57\xf8\x68\x71\xdd\x35\x46\x23\xad\xbb\xc8\x3d\x6b" - "\xbe\x3c\xfe\x22\xcf\x97\xc7\xef\xeb\xfa\xba\x6b\xfc\x44\x71\x6e" - "\x3c\x7e\x2a\xd1\x5d\xe1\xa1\xed\xaf\xbb\xc2\x43\xc5\x75\xd7\xf8" - "\x93\x84\xa3\x86\x87\x59\xeb\x2e\x78\x46\x54\x77\x8d\x37\x70\xcf" - "\x84\x0a\x75\x17\xc9\x03\x62\x4e\x7f\x69\xdd\xf5\x12\x39\x5f\x8b" - "\x7a\x69\x1d\x89\x41\xc4\xa7\xd6\xba\xeb\xa5\x37\xda\xd6\x5d\x04" - "\x43\x6c\x39\x25\x75\xd7\x4b\x7b\xac\x75\xd7\x98\x63\xe2\xba\x2b" - "\x62\x0d\x8f\xa3\x88\x47\x85\xba\xeb\xa5\xeb\xf7\x87\xee\x92\xc4" - "\xd6\x44\xa1\xee\x7a\xf9\xb8\x7c\xdd\xf5\xf2\x4d\x79\xba\x0b\x63" - "\x4e\x4c\x77\x45\x8c\xb6\xc4\x9c\x50\x77\x45\x4c\x13\xd7\x5d\x11" - "\x8b\x85\xba\x0b\xe7\x2f\xa6\xbb\x22\x76\x0a\xf2\xb7\xd2\x5d\x11" - "\x47\x85\xba\x8b\xa4\xe3\x75\xd7\x84\x19\x5c\x5f\x17\x2f\x5f\x77" - "\x4d\x18\x2d\xad\xbb\x26\x8c\x17\xea\xae\x09\xbe\x44\x5f\x4d\x48" - "\x22\xba\x6b\x82\x8a\x5c\x1f\x13\x67\x7e\x9d\xd7\x5d\xe4\x3a\xaf" - "\xbb\x26\xa4\x3f\x5c\xef\x7a\x3f\xe9\xae\x57\x86\x3b\xa6\xbb\x5e" - "\x09\x7e\xc8\xef\x3b\x82\xdf\x4f\xc8\x25\x9c\x6b\xe2\x49\xc7\xf8" - "\xfd\xc4\x72\xc7\xf9\xfd\x14\xb3\xf5\xae\x53\x6c\xac\x77\x8d\xdc" - "\x69\x9b\xdf\x4f\xae\xe7\xf9\x7d\x74\x24\xe9\x5b\xa3\x87\x93\xbe" - "\x35\xea\x66\xdb\xfc\x3e\x6a\xbe\x90\xdf\x47\x9e\x7f\xc8\xef\x3b" - "\x82\xdf\xbf\x92\x42\xb0\x16\x35\xd2\x31\x7e\x1f\x25\x3c\xb7\x8f" - "\x9a\x2a\xb2\x0e\x36\x6a\x9b\xfd\xfc\x3e\xea\xb8\x63\xfc\x3e\xea" - "\x98\x7d\xfc\x3e\xfa\x51\x71\x7e\x1f\x59\x24\xcd\xef\xc9\x3d\x6b" - "\x5e\x36\xf9\x38\xcf\xcb\x26\x6f\xec\xfa\xfc\x7e\xb2\x4a\x9c\x83" - "\x4d\x1e\x49\xf8\x7d\xb4\x5f\xfb\xf3\xfb\x68\x3f\x71\x7e\x3f\x79" - "\x1f\xe1\x42\xd1\x4a\x6b\x7e\x0f\xcf\x88\xf2\xfb\xc9\xdc\xfa\x87" - "\x68\x3f\x21\xbf\x27\x79\x40\xcc\x69\x96\xe6\xf7\xaf\xe6\x91\x18" - "\xf4\x6a\x3c\x89\x41\xc4\xa7\xd6\xfc\xfe\xd5\xd1\x6d\xf3\x7b\x82" - "\x21\xb6\x9c\x92\xfc\xfe\xd5\x75\xd6\xfc\x3e\xb2\x40\x9c\xdf\x4f" - "\x31\x5b\x03\xfb\x1b\x8b\x35\xb0\xaf\x9e\xbe\x3f\xf8\xbd\x24\xb6" - "\x54\x42\x7e\xff\x1b\x07\xd6\xbf\xfe\x46\xe6\xfa\x57\x8c\x39\x31" - "\x7e\x3f\xe5\x51\x4b\xcc\x09\xf9\xfd\x14\x89\xf5\xaf\x53\x2c\xd6" - "\xbf\xe2\xfc\xc5\xf8\xfd\x94\x35\x82\xfc\xad\xf8\xfd\x14\x8b\xf5" - "\xaf\x24\x1d\xcf\xef\xa7\x72\xeb\x5f\x23\xe5\x9f\xa1\x41\x4d\xb5" - "\xb1\xfe\x75\xaa\xc5\xfa\xd7\x29\xdc\xfa\xd7\xa9\xdc\xfa\xd7\xa9" - "\xdc\xfa\xd7\xc8\x70\xf3\xeb\x3c\xbf\x27\xd7\x79\x7e\x3f\xf5\xe1" - "\xfa\xd7\xfb\x8a\xdf\xbf\xe6\xe0\xfa\xd7\xd7\x9c\x58\xff\x3a\xb3" - "\x9e\xe7\x91\x33\xeb\xa5\x79\xe4\x6b\x6d\xac\x7f\x9d\x31\x82\xe7" - "\x91\xd3\xb9\x18\x3e\xfd\x1d\x12\xc3\xa7\x8f\x6a\x9b\x47\x4e\x3b" - "\x24\xe4\x91\x31\x83\x1e\xf2\xc8\x8e\xe0\x91\x53\xb9\x75\xb1\xd3" - "\xd6\x38\xc6\x23\xa7\xad\x16\xf2\xc8\x59\xdb\xac\x79\xe4\x34\xab" - "\xf3\x9f\xa5\x79\xe4\xf4\x6e\x8e\xf1\xc8\xe9\x0a\xfb\x78\xe4\xf4" - "\x78\x71\x1e\xf9\x5a\x9d\x34\x8f\x24\xf7\xac\xfb\xff\x19\x66\xf3" - "\x2a\x5e\x3f\xd3\xf5\x79\xe4\xeb\xc9\xe2\x7d\xfd\xeb\x6b\x08\x8f" - "\x9c\x1e\xd7\xfe\x3c\x72\x7a\x9c\x38\x8f\x7c\xfd\x26\xe9\x73\xa7" - "\x27\x58\xf3\x48\x78\x46\x94\x47\xce\xe0\xe6\x3f\x4c\x8f\x13\xf2" - "\x48\x92\x07\xc4\x9c\x31\xd2\x3c\x72\xc6\x45\x12\x83\x66\x1c\x20" - "\x31\x88\xf8\xd4\x9a\x47\xce\x58\xd7\x36\x8f\x24\x18\x62\xcb\x29" - "\xc9\x23\x67\x9c\xb6\xe6\x91\xaf\x49\xac\x89\x9d\xb9\x87\xc7\xd1" - "\xcc\xf1\x42\x1e\xf9\x86\xcf\xfd\xc1\x23\x25\xb1\x95\x2c\xe4\x91" - "\x6f\x5c\x96\xcf\x23\x67\xf6\x97\xc7\x23\x31\xe6\xc4\x78\xe4\xcc" - "\x78\x4b\xcc\x09\x79\xe4\xcc\x0c\x71\x1e\x39\x73\x9b\x90\x47\xe2" - "\xfc\xc5\x78\xe4\xcc\x13\x82\xfc\xad\x78\xe4\xcc\x1f\x84\x3c\x92" - "\xa4\xe3\x79\xe4\xac\xb5\x24\x86\xbe\xe6\xc0\x7a\xd8\x59\xf1\xd2" - "\x3c\x72\xd6\x02\x21\x8f\x9c\x15\x46\xf8\xe2\xac\x7c\xc2\x23\x67" - "\x4d\x21\xd7\x5f\xcb\x32\xbf\xce\xf3\xc8\xd7\x2c\xd6\xc3\xce\xda" - "\xeb\xdc\x7a\xd8\x79\x71\x3c\xc7\x98\x17\x27\xbd\x1e\x36\x76\x82" - "\x6d\x8e\x11\xb7\x9f\xe7\x18\x6f\x92\x33\x6d\xa8\x39\xe4\x4c\x1b" - "\x6a\x0e\xbb\x37\x69\x2b\xb4\x71\xb2\x1e\xb6\x84\x02\x1e\xc8\xaf" - "\x87\x9d\x89\x39\xc6\x9c\x21\x91\x02\x8e\x11\xbb\x91\x5d\x1b\x8b" - "\x79\x46\x43\x13\xc2\xf7\xc4\xd7\xc9\x96\x74\xee\x3a\xd9\xbb\x0f" - "\xf2\x3a\xd9\xd9\x77\x1c\xe3\xb8\xb3\x2d\xce\xbf\x49\xb0\x3e\x53" - "\x96\x9a\x63\xff\xf9\x37\xd4\x1c\xc7\xce\xbf\xa1\xe6\xd8\x77\xfe" - "\x0d\x35\xc7\xea\xfc\x1b\xb2\x4e\x36\x76\x62\xab\x24\xef\x88\x8d" - "\xc0\x79\x5b\xf7\x17\x71\x66\xbf\x2b\xc6\x4d\xe8\xfa\xbc\xe3\x4d" - "\xf1\xf3\x49\xa8\x37\xef\x10\xde\x31\xe7\x42\xfb\xf3\x8e\x39\xe2" - "\x67\xdf\x50\x71\xf3\x49\x8c\x9e\x73\xef\x1c\x1b\x9e\x77\xcc\x11" - "\x3f\xfb\x86\x8a\xdb\x69\xf9\x0c\xe1\x1d\x73\xc8\xd9\x37\x54\xdc" - "\x51\x69\xde\x11\x3f\x95\xc4\xa5\xf8\xc1\x24\x2e\x11\x9f\x5a\xf3" - "\x8e\x38\x43\xdb\xbc\x83\x60\x88\x2d\xa7\x24\xef\x88\x1f\x6f\xcd" - "\x3b\x62\x23\xc4\x79\xc7\xbc\x47\x79\x1c\xcd\x3d\x2e\xe4\x1d\xf1" - "\x9b\xef\x0f\xde\x21\x89\xad\x7a\x21\xef\x98\xfb\x86\x7c\xde\x31" - "\x37\x47\x1e\xef\x98\x23\x7e\xee\x0d\x35\x97\x1b\xff\x9c\x23\x71" - "\xee\xcd\xdc\x66\x71\xde\x31\xcf\x4b\xc8\x3b\xe6\x48\x9c\x7b\x33" - "\x6f\xb4\x20\x7f\x2b\xde\x31\x6f\x9a\x90\x77\xcc\xb1\x38\xf7\x66" - "\x9e\x9e\xd3\x6e\x37\xe5\xf3\x8e\x79\x17\xa5\x79\xc7\x3c\xe1\xf9" - "\xaf\xd4\x3c\x72\xfe\x2b\x95\xe0\x49\x78\xc7\xbc\x0a\x8e\x8f\xe8" - "\xcc\xaf\xf3\xbc\x83\x5c\xe7\x79\x47\x82\x52\xc6\xf8\x55\xb8\x9c" - "\x75\xb2\x07\xee\x0a\xc7\xaf\x4c\x63\x57\x7a\xd5\xd0\x11\xf7\xc6" - "\xaf\xcc\x7f\xeb\x14\x19\xbf\xc2\x7d\x3a\x3f\x7e\x75\x91\x8d\x55" - "\xfc\xf8\x95\x96\x1d\xbf\xc2\x63\x57\xf8\xf7\x4e\xd3\xd8\x95\x71" - "\x85\xf5\x1a\xd9\x03\x46\xf9\x63\x57\xfc\x6f\x9e\x9f\xba\x92\xb1" - "\xab\x9a\x7b\x63\x57\xb8\x3f\x37\x34\x5a\x8f\x5d\xe1\x7e\x9c\x1f" - "\xbb\xfa\xae\x9d\xc7\xae\xe6\x3b\xb8\xff\xc5\xfc\x8a\xae\xf1\xdb" - "\xf4\x83\xb6\x46\x36\x61\x04\x19\xe7\x79\x3b\xde\xb1\xdf\xa6\xdf" - "\x8e\xeb\x1a\x7e\x79\xd0\xe6\x6a\xbf\xe5\x4d\xfc\x92\x68\x70\xcc" - "\x2f\x89\xfa\xae\xe1\x97\x07\x6d\x2e\xc7\xdb\xfb\x89\x5f\x16\xe6" - "\x39\xe6\x97\x85\xb9\x8e\x8f\xc1\x2f\x57\xf3\xfa\x78\xb9\x5a\x5a" - "\x1f\x2f\x9a\x6f\x5b\x1f\x2f\xad\xe1\xf5\xf1\x92\x51\x84\x87\x2e" - "\x79\x94\xf0\xd0\xc5\x17\x4d\x63\xf0\x44\x1f\x6b\x28\xdc\x97\xe0" - "\xb1\xf5\x2c\xe8\x3f\xde\x07\x6d\xb8\x19\xb4\xf2\xfb\x4b\x40\x2f" - "\x27\x21\xd7\xaa\xda\xe3\x28\x29\x15\x6b\xe6\xc5\x53\xa3\x52\xcc" - "\x35\xf3\xa2\xa3\x26\xbd\x1c\x05\xcf\x7e\xb9\x50\x43\x61\x5d\x6c" - "\xf0\x89\x0c\xd3\x1f\x18\x1a\xac\x86\x7c\x4c\xe3\xf3\xb8\xaf\x3d" - "\xb8\x10\xf4\xf1\x5b\xc2\x31\xfa\xd6\x03\x43\x47\xb4\xfa\x44\x86" - "\xe3\x71\xfa\x66\xb3\x71\x7a\x5b\x63\xf4\x62\xe3\xf3\x18\x87\x78" - "\x8c\xbe\xe0\xee\x83\x36\x46\xbf\x20\x9c\x60\x71\xf1\x20\xc7\xc6" - "\xe8\x17\x2b\x85\x5a\x79\xc5\x68\x6b\xad\xbc\x78\x9d\xfd\x5a\x79" - "\xf1\x3e\xc7\xb4\xf2\xe2\xbd\xf6\x69\xe5\x25\x3d\xc5\xb5\xf2\xa2" - "\x44\xe9\x31\x7a\x72\xcf\x5a\xe3\x2c\xdd\xc7\x6b\x9c\xa5\xcb\xba" - "\xbe\x56\x5e\xea\x2b\xae\x67\x96\x0e\x22\x5a\x79\x89\x6b\xfb\x6b" - "\xe5\x25\xae\xe2\x5a\x79\x69\x1e\xd1\x15\x4b\x5c\xad\xb5\x32\x3c" - "\x23\xaa\x95\x97\x9e\xb4\x7c\x86\x68\xe5\x25\x6e\x44\x2b\x2f\xbd" - "\x2c\xad\x95\x93\x33\x48\x8c\x4a\xe6\xd6\x93\x10\x9f\x5a\x6b\xe5" - "\xe4\x21\x6d\x6b\x65\x82\x21\xb6\x9c\x92\x5a\x39\x79\xb1\xb5\x56" - "\x5e\x94\x20\xae\x95\x97\x4f\xe0\x71\xb4\xec\xaa\x50\x2b\x27\x1f" - "\xbd\x3f\xb4\xb2\x24\xb6\x7c\x85\x5a\x79\xd9\x46\xf9\x5a\x79\xd9" - "\x71\x79\x5a\x19\x63\x4e\x4c\x2b\x2f\xe7\xce\xbf\x22\x78\xb1\xd6" - "\xca\xcb\x07\x8b\x6b\xe5\xe5\xa3\x85\x5a\x19\xe7\x2f\xa6\x95\x97" - "\xcf\x17\xe4\x6f\xa5\x95\x97\xaf\x13\x6a\x65\x92\x8e\xd7\xca\x2b" - "\x02\xb8\x7e\xcf\x4b\xbe\x56\x5e\xd1\x53\x5a\x2b\xaf\xf0\x12\x6a" - "\xe5\xe5\xb5\x44\x13\xaf\x08\x25\x5a\x79\x79\x13\xb9\xbe\xc8\xd3" - "\xfc\x3a\xaf\x95\xc9\x75\x5e\x2b\xaf\x98\x28\x43\x2b\x47\xb4\x93" - "\x56\x0e\xb9\xbf\xb4\x72\xc9\xb1\xae\xa1\x95\x53\x9a\x1d\xd3\xca" - "\x29\x4d\x76\x72\xff\xf0\x36\xb8\xff\x88\x87\xdc\xdf\x9c\x6f\xad" - "\x88\x25\x7c\x6b\x65\x8e\x63\xdc\x7f\xa5\xba\x2b\xf8\xe5\xc1\xf2" - "\xc9\x3b\x61\xc4\x27\xab\x07\x3b\xe6\x93\xd5\xfe\x0f\x75\x72\x47" - "\xf8\x65\x65\x0d\xf1\xcb\x9a\xe3\x8e\xf9\x65\xcd\x31\xc7\x75\xf2" - "\xba\x1a\x5e\x27\xaf\xab\x31\xd7\xc9\xe5\xe1\xe6\x3a\x39\x35\xc7" - "\xb6\x4e\x7e\xd7\xec\xac\x86\x0c\x8e\x83\x66\x70\xf3\x8d\x33\x58" - "\xbe\xd1\x8c\x75\xf2\x18\xd0\xc9\xd7\xd4\xf7\x74\x32\xd6\xc5\x91" - "\x4d\xdf\x33\xf8\x77\x65\xd0\xc9\x8a\x8d\x37\x90\x02\xb4\x33\xaa" - "\xba\x70\x04\x65\x81\x6e\xde\x74\x03\xb4\x73\x22\x68\x67\xfd\x4e" - "\x4e\x3b\xa7\xef\x14\x6a\xe7\xd4\x3b\x02\xed\xfc\x96\x9a\xd5\xce" - "\xa0\x87\x83\xf5\x79\x91\x61\x58\x3b\xeb\x41\x17\xb7\x0e\x1d\x3a" - "\x42\x7d\xc3\x42\x47\xbf\x05\x3a\x7a\xae\x50\x47\xb7\xe4\x45\x46" - "\x34\x1f\x18\x1a\x82\x75\x74\xd3\x60\xc7\x75\x74\x41\x0b\xd1\xd1" - "\x3b\x1e\x38\x1d\xbd\x3a\x91\x60\x35\x7d\xbe\x63\x3a\x3a\x3d\x41" - "\xa8\xa3\xd7\xaf\xb3\xd6\xd1\xe9\xa7\xed\xd7\xd1\xe9\x37\x1d\xd3" - "\xd1\xe9\x3a\xfb\x74\x74\xc6\x64\x4b\x1d\xbd\x37\x15\xeb\xe8\xd4" - "\xdc\x66\x49\x1d\x9d\xaa\x16\xff\xcd\x39\xd3\xec\x0c\x88\xcc\xfb" - "\xe0\x0c\x88\xcc\x58\x71\xad\x93\x39\x9f\xe8\xe8\x8c\xe8\xf6\xd7" - "\xd1\x19\xd1\xe2\x3a\x3a\x93\xfb\xfd\x2f\x23\xda\x5a\x47\xc3\x33" - "\xa2\x3a\xfa\x5d\x2f\xcb\x67\x88\x8e\xce\x98\x42\x74\xf4\xbb\x36" - "\xce\x7f\x78\x97\x3b\xff\xe1\x5d\xee\xfc\x07\xe2\x53\x6b\x1d\xfd" - "\xae\x1d\xe7\x3f\x10\x0c\xb1\xe5\x94\xd4\xd1\xef\x8a\x9c\xff\x90" - "\xaa\x16\xd7\xd1\xeb\x72\x78\x1c\xad\x1b\x2e\xd4\xd1\x6b\xef\x93" - "\xf3\x1f\x24\xb1\x15\x2b\xd4\xd1\x6b\xcf\xc8\xd7\xd1\xeb\xba\xc9" - "\xd3\xd1\x18\x73\x62\x3a\x7a\x1d\xb7\xff\x19\xc1\x8b\xb5\x8e\x5e" - "\xb7\x40\x5c\x47\xaf\x5b\x27\xd4\xd1\x38\x7f\x31\x1d\xbd\xee\x90" - "\x20\x7f\x2b\x1d\xbd\xee\xb4\x50\x47\x93\x74\xbc\x8e\x5e\x9f\xc4" - "\xf5\x81\xa3\xe4\xeb\xe8\xf5\x93\xa5\x75\xf4\xfa\x69\x42\x1d\xbd" - "\x5e\x45\xf4\xf2\xfa\xb5\x44\x47\xaf\x0f\x23\xd7\x53\x43\xcc\xaf" - "\xf3\x3a\x9a\x5c\xe7\x75\xf4\xfa\x5c\x79\xbf\x39\x3b\xb5\x17\xd5" - "\x88\xce\x5f\x33\xd1\x5e\x7b\x51\x99\x7e\x77\xfe\x6f\xaf\x99\xd8" - "\x30\xde\x31\x2d\xbd\x21\xfc\xa1\x66\x6b\x6f\x6d\xb0\x7e\x2f\xe1" - "\x5b\x1b\x1d\xdc\xff\x77\xe3\xc3\xfd\x7f\x3b\xc4\x2f\x1b\xb2\x88" - "\x5f\xde\x77\x70\xff\xdf\xf7\x9d\xd8\xff\xf7\xc3\x44\x5e\xb3\x7d" - "\x98\x28\xfd\xdb\x66\x56\x1b\xfb\xff\xaa\x0f\xf3\x9a\x6d\x8b\x0f" - "\xe1\x3b\xd9\xcd\x84\xef\x64\x1f\x75\xec\xb7\xcd\xec\xe1\x42\x7d" - "\x96\x95\xf7\xf0\xb7\xcd\x8e\xd6\x64\x9b\xb8\xfd\x81\x37\x1b\x1c" - "\xd3\x64\x9b\xf5\x42\x4d\x96\xdb\xdf\x5a\x93\x65\xcf\xb6\x5f\x93" - "\x65\xaf\x73\x4c\x93\x65\xaf\xb5\x4f\x93\x65\x5f\x16\xff\x6d\x33" - "\xcb\xc6\xfe\xc0\x59\x12\xfb\x03\xab\xd7\xf1\x5c\x5a\x3d\xb9\xeb" - "\x6b\xb2\x2d\x0d\xe2\xbc\x79\x8b\x81\x68\xb2\xec\xda\xf6\xd7\x64" - "\xd9\xb5\xe2\x9a\x4c\xbd\x98\xf0\xd7\xec\x5a\x6b\x4d\x06\xcf\x88" - "\x6a\x32\xf5\x1e\xcb\x67\x88\x26\xcb\xae\x23\x9a\x4c\xfd\x95\xb4" - "\x26\xcb\x79\x83\xc4\xa8\x9c\xa1\x24\x46\x65\x49\xec\x0f\x9c\xd3" - "\xad\x6d\x4d\x46\x30\xc4\x96\x53\x52\x93\xe5\x44\x5a\x6b\xb2\x2c" - "\x89\xfd\x81\x3f\x1c\xcc\xe3\xe8\x83\x13\x42\x4d\x96\x93\x77\x7f" - "\x68\x32\x49\x6c\x35\x08\x35\xd9\x07\xf1\xf2\x35\xd9\x07\xdb\xe4" - "\x69\x32\x8c\x39\x31\x4d\xf6\xc1\x65\x0e\x3f\x75\xe2\x9a\xec\x43" - "\x17\x71\x4d\xf6\x61\x7f\xa1\x26\xc3\xf9\x8b\x69\xb2\x0f\xc7\x0b" - "\xf2\xb7\xd2\x64\x1f\xce\x16\x6a\x32\x92\x8e\xd7\x64\xb9\x0a\x12" - "\x43\xdf\x77\x60\x7f\xe0\x0f\x2f\x4b\x6b\xb2\x0f\xaf\x0b\x35\xd9" - "\x87\x1a\xa2\xbd\x72\x7d\x89\x26\xfb\xf0\x2c\xb9\xfe\x7e\xbd\xf9" - "\x75\x5e\x93\xbd\x6f\xb1\x3f\x70\x6e\x80\x3c\x4d\x66\xff\x3e\x55" - "\xff\xfd\x79\xc0\x9e\x0f\xd8\x3c\xe0\xbc\x73\x8e\xe9\xb1\xbc\xb3" - "\x0f\xb9\x7f\x47\x70\xff\xdc\x50\xc2\xb7\x7e\xb7\xc0\x31\xee\xff" - "\xbb\x44\xc7\xb9\x7f\x61\x02\xcf\xfd\x0b\x13\xa4\xb9\x7f\xfe\x18" - "\xdb\xdc\xbf\xa0\x84\xe7\xfe\x3b\xbc\x48\xbf\xba\xfd\x0e\xe9\x57" - "\xb7\x1f\x71\x8c\xfb\x6f\x1f\x2a\xe4\xfe\xf9\x39\x0f\xb9\x7f\x47" - "\x73\xff\xad\xdc\x3e\xd5\xdb\x9a\x1d\xe3\xfe\xdb\x9a\x84\xdc\xbf" - "\xc8\xc7\x9a\xfb\x6f\x7f\xc3\x7e\xee\xbf\x3d\xc3\x31\xee\xbf\x3d" - "\xdd\x3e\xee\xbf\xfd\x07\x71\xee\x9f\x1f\x2e\xcd\xfd\xc9\x3d\x6b" - "\xce\x56\x90\xc1\x73\xb6\x82\xc8\xae\xcf\xfd\x77\xe8\xc4\xf9\xd9" - "\x8e\x66\xc2\xfd\xb7\x6b\xdb\x9f\xfb\x6f\xd7\x8a\x73\xff\x82\x05" - "\x84\x27\x6d\xd7\x5a\x73\x7f\x78\x46\x94\xfb\x17\xec\xb6\x7c\x86" - "\x70\xff\xed\xb5\x84\xfb\x17\x1c\x97\xe6\xfe\x3b\xa7\x91\x18\xb5" - "\x73\x08\x89\x51\xc4\xa7\xd6\xdc\x7f\xa7\x4b\xdb\xdc\x9f\x60\x88" - "\x2d\xa7\x24\xf7\xdf\x39\xc1\x9a\xfb\xe7\x87\x89\x73\xff\xc2\x41" - "\x3c\x8e\x76\x7d\x25\xe4\xfe\x3b\x73\xee\x0f\xee\x2f\x89\x2d\x9d" - "\x90\xfb\xef\x9a\x2d\x9f\xfb\xef\xca\x93\xc7\xfd\x31\xe6\xc4\xb8" - "\xff\xae\x1f\x38\xfc\xd4\x8a\x73\xff\x5d\x06\x71\xee\x5f\xe8\x23" - "\xe4\xfe\x38\x7f\x31\xee\x5f\x38\x46\x90\xbf\x15\xf7\x2f\x7c\x43" - "\xc8\xfd\x49\x3a\x9e\xfb\x17\x21\x12\x43\x7f\x77\x55\x3e\xf7\x2f" - "\xfc\x41\x9a\xfb\x17\x5e\x15\x72\xff\xc2\x63\x84\xe3\x17\x79\x13" - "\xee\x5f\x58\x4d\xae\xff\xae\xce\xfc\x3a\xcf\xfd\xc9\x75\x9e\xfb" - "\x17\xf9\x3f\xdc\xc3\xea\x7e\xda\xc3\x6a\xb7\x83\xfc\x7f\xb7\x4d" - "\xfe\x6f\x9b\x67\xee\x2b\xe1\x79\xe6\xbe\x12\x73\x9e\x29\xdc\xc3" - "\xea\xa3\x7d\xb6\x79\xe6\xc7\x4d\x3c\xcf\xdc\xc3\xc5\xf0\x3d\xa3" - "\x49\x0c\x2f\x36\x98\x78\xa6\xf4\x1e\x56\xc5\xcb\x84\x7b\x58\x7d" - "\x74\xf9\xe1\x1e\x56\x1d\xc1\x23\x8b\x42\x08\x8f\x2c\x1e\xe3\x18" - "\x8f\x2c\x0e\x13\xf2\xc8\x4f\xde\xb0\xe6\x91\xc5\x7b\xec\xe7\x91" - "\xc5\x27\x1d\xe3\x91\xc5\xe5\xf6\xf1\xc8\x3d\x43\xc4\xf7\xb0\xfa" - "\x68\xbf\x34\x8f\x24\xf7\xac\xfb\xff\x8f\x4f\xf2\xfd\xff\xc7\x79" - "\x5d\x9f\x47\x7e\x1c\x22\xde\xd7\x7f\x3c\x86\xf0\xc8\x3d\x01\xed" - "\xcf\x23\xf7\x04\x88\xf3\xc8\x8f\xb9\xf3\xaf\xf7\xa8\xac\xf7\xb0" - "\x82\x67\x44\x79\xe4\xc7\x57\xb9\x67\x02\x84\x3c\x92\xe4\x71\x89" - "\xfa\x7d\x37\x69\x1e\xf9\xfb\xdd\x24\x06\xfd\x7e\x31\x89\x41\xc4" - "\xa7\xd6\x3c\xf2\xf7\x13\xda\xe6\x91\x04\x43\x6c\x39\x25\x79\xe4" - "\xef\x73\xac\x79\xe4\x47\x7b\xc5\x79\xe4\xbe\xf9\x3c\x8e\xf6\xf5" - "\x14\xf2\xc8\xdf\x9f\xbf\x3f\x78\xa4\x24\xb6\x42\x84\x3c\x72\xef" - "\x3e\xf9\x3c\x72\xef\x45\x79\x3c\x12\x63\x4e\x8c\x47\xee\x1b\x62" - "\x89\x39\x21\x8f\xdc\x37\x5e\x9c\x47\xee\x7b\x43\xc8\x23\x71\xfe" - "\x62\x3c\x72\xdf\x46\x41\xfe\x56\x3c\x72\xdf\x1e\x21\x8f\x24\xe9" - "\x78\x1e\xf9\x49\x04\xd7\xd7\x4d\x96\xcf\x23\x3f\x19\x22\xcd\x23" - "\x3f\x19\x2e\xe4\x91\x9f\x28\x08\x5f\xfc\x64\x06\xe1\x91\x9f\xf8" - "\x92\xeb\x1f\x45\x9b\x5f\xe7\x79\x24\xb9\xce\xf3\xc8\x4f\x12\xe5" - "\xad\x8f\x69\x97\x31\xe4\x4e\x5a\x1f\xd3\x5e\x63\xc8\x5d\x65\x7d" - "\xcc\xfe\xfe\x8e\x71\xc8\xfd\xbe\x0f\xe7\xf4\xb4\xf7\xf8\xf1\x27" - "\xe9\x84\x6b\x1d\x38\xe0\xd8\xf8\xf1\x81\xfd\x8e\xf3\xfa\x23\x1a" - "\x9e\xd7\x1f\xd1\x48\xcf\xf7\x3f\x98\x61\x9b\xd7\x7f\xee\xca\xf3" - "\xfa\x43\xf3\x49\x9f\x7a\x28\x92\xf4\xa9\x87\xfa\xb4\x39\xdf\x7f" - "\x39\x52\x64\x71\xf3\xfd\xdf\xc7\xf3\xfd\x6b\x4e\xa0\xac\x5b\x62" - "\xf3\xfd\x4b\xd6\x09\xc7\x94\x0f\x5e\x16\x9b\xef\xcf\xce\xf3\xcf" - "\x8b\x0c\xd7\x4b\xcd\xf3\x9f\xd9\xfe\xf3\xfc\x77\x80\x3e\x30\xe9" - "\x81\x1d\x0f\x9c\x1e\xd8\xcf\xad\xdf\x2a\x99\xec\x98\x1e\x28\x89" - "\x16\xea\x81\x3f\x2c\xb0\xd6\x03\x25\x47\xec\xd7\x03\x25\xe7\x1d" - "\xd3\x03\x25\x35\xf6\xe9\x81\x43\xa3\xc4\xe7\xf9\x1f\x5c\x2b\x3d" - "\xcf\xff\x60\xba\xf8\x3c\xff\xcf\xce\xf3\x3c\xee\xb3\x3d\x5d\x5f" - "\x0f\x7c\x16\x21\xce\xd9\x3e\x9b\x4c\xf4\xc0\xa1\x90\xf6\xd7\x03" - "\x87\x42\xc4\xf5\xc0\x67\xdc\xfe\x9f\x87\x42\xac\xc7\x95\xe1\x19" - "\x51\x3d\xf0\x59\xb3\xe5\x33\x44\x0f\x1c\x0a\x25\x7a\xe0\x73\x1f" - "\x69\x3d\xf0\xf9\x21\x12\xbb\x3e\xcf\x20\xb1\x8b\xf8\xd4\x5a\x0f" - "\x7c\x3e\xad\x6d\x3d\x40\x30\xc4\x96\x53\x52\x0f\x7c\xbe\xdb\x5a" - "\x0f\x1c\x4c\x17\xd7\x03\x47\xde\xe1\x71\x74\xa4\xbf\x50\x0f\x7c" - "\x7e\xf5\xfe\xd0\x03\x92\xd8\x8a\x10\xea\x81\xc3\x47\xe5\xeb\x81" - "\xc3\xd7\xe5\xe9\x01\x8c\x39\x31\x3d\x70\x64\x14\x87\x9f\x50\x71" - "\x3d\x70\x64\xaa\xb8\x1e\x38\xb2\x40\xa8\x07\x70\xfe\x62\x7a\xe0" - "\xc8\x36\x41\xfe\x56\x7a\xe0\xc8\x11\xa1\x1e\x20\xe9\x78\x3d\xf0" - "\x87\x18\xae\xef\x1b\x22\x5f\x0f\xfc\x61\x94\xb4\x1e\xf8\xc3\x18" - "\xa1\x1e\xf8\x83\x37\xe1\xfd\x7f\x48\x24\x7a\xe0\x0f\x01\xe4\xfa" - "\xc1\x00\xf3\xeb\xbc\x1e\x20\xd7\x79\x3d\xf0\x87\xd5\xf2\xe6\x94" - "\xd8\x3f\xae\xfc\xdf\x9f\x53\xe2\xfa\x80\xcd\x29\x29\x1d\xe2\x98" - "\x1e\x28\x0d\x70\x9c\x7b\x6a\xfc\x78\xee\xa9\xf1\x93\x9e\xbb\x50" - "\x6a\xb0\xcd\x3d\x8f\xc7\xf1\xdc\xf3\x8b\x13\x24\x7e\x7f\xb1\x8f" - "\xc4\xef\x2f\xe6\x4b\xcd\x5d\xc0\x6b\x4c\x37\x2f\x21\xeb\x4b\xef" - "\xcd\x5d\x00\x2e\x44\x78\xe6\x9f\x7e\x10\xf2\xcc\xa3\x91\x62\x73" - "\x17\x44\xe7\x2c\x58\xac\x21\xc5\xf3\x15\x0c\xc0\x43\x9d\x9d\xb3" - "\xf0\xe0\xae\x21\xfd\x83\x9a\x70\xcb\x3f\x1d\x70\x8c\x5b\xfe\x69" - "\xbf\x90\x5b\x6a\x4e\x5a\x73\xcb\x2f\xbc\xec\xe7\x96\x5f\x8c\x74" - "\x8c\x5b\x7e\x31\xc2\x3e\x6e\xf9\x45\x9e\xf8\x9c\x85\xa3\x48\x7a" - "\xac\x99\xdc\xb3\xe6\x04\xc7\x47\xf2\x9c\xe0\xb8\x4b\xd7\xe7\x96" - "\xc7\x8a\xc5\xfb\xff\x63\x07\x08\xb7\xfc\x22\xb7\xfd\xb9\xe5\x17" - "\xb9\xe2\xdc\xf2\xf8\x20\xd2\x0f\x7f\x91\x6b\xcd\x2d\xe1\x19\x51" - "\x6e\x79\x7c\xaa\xe5\x33\x84\x5b\x7e\x91\x4f\xb8\xe5\xf1\xc5\xd2" - "\xdc\xf2\xcf\xdc\x7e\xea\xc7\x2f\x92\xd8\x44\x7c\x6a\xcd\x2d\x8f" - "\x1f\x69\x9b\x5b\x12\x0c\xb1\xe5\x94\xe4\x96\xc7\x0d\xd6\xdc\xb2" - "\x54\x2f\xce\x2d\xbf\x3c\xc7\xe3\xe8\xcb\x65\x42\x6e\xf9\xe7\xf1" - "\xf7\x07\xb7\x94\xc4\x56\xb1\x90\x5b\x7e\xe9\x23\x9f\x5b\x7e\x39" - "\x41\x1e\xb7\xc4\x98\x13\xe3\x96\x5f\x72\xfb\x7f\x11\xbc\x58\x73" - "\xcb\x2f\x0f\x89\x73\xcb\x2f\x4f\x0a\xb9\x25\xce\x5f\x8c\x5b\x7e" - "\x79\x47\x90\xbf\x15\xb7\xd4\x78\x09\xb9\x25\x49\xc7\x73\x4b\xcd" - "\x61\x12\x43\x4b\xf7\xc8\xe7\x96\x9a\x3c\x69\x6e\xa9\xd9\x29\xe4" - "\x96\x9a\x24\xc2\x21\x35\xe5\x84\x5b\x6a\xd6\x92\xeb\xa5\xc5\xe6" - "\xd7\x79\x6e\x49\xae\xf3\xdc\x52\x53\x63\x8b\x5b\x32\xea\x5b\xbe" - "\x6a\xca\x58\x02\x9f\x52\x28\x67\x7f\xe8\xdf\x34\xf0\x7f\x39\xf4" - "\x53\x9e\xf0\x7f\xb5\x14\x67\xd1\x79\xdd\xf2\x35\x02\xff\x30\xc2" - "\x7b\xaa\x74\x3f\x6b\x34\x03\xf4\xf0\xee\xaf\x62\x08\x37\xb9\xe5" - "\xeb\xa1\xef\x11\x61\x64\x12\xa0\x7f\x87\xff\x53\xe0\x1a\xa4\x77" - "\x87\xfe\x50\xb9\x1c\xb9\xdf\xa0\xbe\x4a\x31\xa5\x83\x32\xbb\x5f" - "\xa2\xbe\x1a\x89\xf3\x68\xdc\xf4\xd5\x5a\xa8\x4f\xad\x64\x59\x21" - "\xaf\xa8\x7d\x03\xd1\x1a\x3d\xf3\xa3\x66\xe1\x2d\x54\x4b\x7d\x75" - "\xda\xa3\xbe\x47\x04\xc4\x21\x84\xb9\x60\xc9\x00\x9d\x02\xe7\xa9" - "\x59\xd8\x82\xef\x95\xe0\x7b\x06\x28\x63\xea\x02\x44\x65\xdf\xea" - "\xe1\x0a\xdc\xaa\x5b\x5a\x03\x53\xb7\x48\x0f\x65\x86\xfe\xf5\xcb" - "\x81\x35\x8a\x4f\xb7\xd7\xb0\x7d\x4f\x65\x83\x81\xcd\x43\xb9\x90" - "\x2d\xcf\x99\x5d\x90\x5e\xac\x0c\xeb\x0e\x22\x55\xb7\x21\x8c\x56" - "\x5e\x7f\xf7\x17\xc9\xfd\x5f\x3c\x32\x06\x22\x4d\x20\xd8\x4e\x89" - "\x28\xb1\xfb\x32\xdf\x93\x65\x83\x63\xba\x7e\xd8\x8f\x69\x48\xdb" - "\x86\xa8\x2d\xc6\x1e\xae\x5f\x43\x4c\x2c\xdc\xca\xe8\x1a\x37\xfd" - "\xa5\x49\xeb\xf2\x59\x02\xb6\xf9\xbb\x70\x7f\x4b\x3f\x46\x77\x3b" - "\x13\xe3\xe6\x6b\x4f\xec\x25\x4b\x5f\x2c\x89\x5b\x30\x5b\x99\x3c" - "\x7f\x41\xfc\xa2\x65\xc9\xca\xc1\x71\xbd\xd0\x94\x45\x8b\x94\x0b" - "\x66\x2f\x7c\x47\x69\x7e\xe7\x79\x65\xdc\xfc\xa5\xb3\xe7\x24\xc6" - "\x0f\x5d\xf0\x66\x52\x2f\x28\x13\x32\x2b\x87\x37\x2e\x8b\x71\xd3" - "\xd7\x7e\xbb\x3e\x40\xe8\xc3\xbe\x48\x81\xcb\x05\xef\x4b\xd7\x2a" - "\x3c\xb3\xf0\xfb\xb2\xb7\x32\x0d\x14\xa4\x49\x83\x98\xb6\x25\xb5" - "\x07\xa4\xfd\x4b\x56\x21\x94\x6b\x17\x94\x1b\xca\x08\x65\xfe\x7a" - "\xbf\xa9\xcc\x26\x4c\xa4\x61\x4c\xa4\xde\x02\x0c\x7e\x7d\xda\xa3" - "\xa9\xc7\xcb\x0c\x13\x83\xeb\xd7\x00\x6d\xc5\xe5\x0a\x55\x16\xcf" - "\xea\x83\x9c\x5b\xbe\xf0\x6c\x9d\x09\x63\xc6\xdc\xe7\x4b\x98\x0f" - "\x6e\x6a\x81\x57\xba\x34\x32\x09\xbf\x06\x6c\xc2\xf3\x65\x23\x9f" - "\x46\x28\x9d\x69\x8c\x61\xcf\x9b\x60\x1a\x01\xc3\x04\xa7\x70\xef" - "\x84\xeb\x6d\x0a\xbd\xd8\xb8\xa9\x4c\xa5\x45\xf1\xde\x38\x0f\x2d" - "\x5c\xc3\x36\x37\x16\xc5\x84\x4d\x0d\x40\xe9\x4f\xa5\xa3\xf4\x46" - "\xfc\x4c\xf1\x00\x5f\x8f\x64\xe4\x12\x95\xc2\x7c\x0f\x71\xc7\x85" - "\x19\x14\x13\xc6\xec\x19\xe0\xab\xa5\xca\x3c\x8d\x79\xcf\x97\x40" - "\x7d\xea\x21\x9f\x64\x2d\xaa\xd7\xe2\x7c\xb6\x6c\x65\x6d\x5f\x8f" - "\xeb\x0e\xf6\x01\x9d\xc3\x00\x57\xe5\xda\x90\xfa\x91\x52\xa3\x7a" - "\x76\x7e\x95\xe2\x2e\x8a\xd2\x33\xad\x4c\xce\x23\xa5\x95\x0d\x0d" - "\x10\xd3\x92\xde\x64\x7a\x7d\x3d\xd4\x43\x3f\x3f\xbe\xb0\x2f\xb4" - "\xc5\x9c\xd9\xf9\x4c\x4e\xe0\xd9\xa9\x43\x90\x27\xe4\x5d\x6d\xb2" - "\x27\xd8\x52\x21\x0f\x47\x65\xec\xfc\x17\x8c\x07\x28\x0f\x87\x87" - "\x13\xca\xaf\x92\xad\xf1\x70\xaf\x6d\x6e\x0d\x54\xea\x99\x98\x97" - "\x5b\x73\x03\x63\x18\xef\xc0\xf0\xd4\xcb\xa8\x3b\xb6\x6d\x25\xe8" - "\x80\xec\xe5\xc8\x77\xf3\x4c\xa4\x9c\xf5\x8e\x27\xd2\xe5\x05\x86" - "\x79\x64\xa4\xbb\x80\x4d\x28\x88\x2f\xc1\x10\x33\x83\x5b\xfb\x3d" - "\x5f\xb2\x3a\x1e\x51\x07\x2e\x95\x50\x98\x3f\xe3\x39\x28\x60\xeb" - "\x1f\x76\xc1\x73\xcc\xcf\x31\x08\xfb\x83\xf5\xc5\xcf\x09\x28\x12" - "\x54\x0a\xfe\x6d\xe4\x0a\xf5\x57\x9f\x9d\x90\xa7\xbc\x7a\x9d\x60" - "\xf9\xaf\x01\x7c\xf5\x34\xf8\xa9\xaa\xd6\xc0\xe6\xc9\xfa\x2a\x91" - "\xf7\xd5\x71\x28\x07\xef\xaf\x13\x05\xd8\xaf\x12\x75\x2e\xe2\xea" - "\x5c\x03\x75\x2e\xb3\x51\x67\x0d\xa9\x73\xb7\x5b\xb6\xeb\xfc\xd7" - "\x73\xb6\xeb\xfc\xb7\x9e\xf2\xeb\xfc\xd7\x22\xf9\x75\xfe\xab\x5a" - "\xba\xce\x41\x9c\x9f\x83\xc0\xcf\x41\x36\xfc\x1c\xc4\xf9\xb9\xf7" - "\x25\xdb\x75\xfe\xdb\xc9\x36\xea\x6c\x90\x5f\xe7\xbf\xe5\xca\xaf" - "\xf3\xdf\xd6\xda\xa8\x33\xe7\xe7\x20\xf0\x73\x90\x0d\x3f\x07\x71" - "\x7e\xf6\xfa\xd6\x76\x9d\xcb\x8f\xdb\xae\x73\xf9\x4d\xf9\x75\x2e" - "\xdf\x20\xbf\xce\xe5\x29\xd2\x75\x56\x71\x7e\x56\x81\x9f\x55\x36" - "\xfc\xac\xe2\xfc\xfc\xdc\x26\xdb\x75\x3e\x79\xc8\x76\x9d\x4f\x5e" - "\x96\x5f\xe7\x93\xab\xe5\xd7\xf9\x64\xa2\x8d\x3a\x73\x7e\x56\x81" - "\x9f\x55\x36\xfc\xac\xe2\xfc\xfc\xfa\x58\xdb\x75\x3e\xb5\xc7\x76" - "\x9d\x4f\x9d\x97\x5f\xe7\x53\x49\xf2\xeb\x7c\x2a\x56\xaa\xce\x2d" - "\x10\xb7\xdd\xa0\x2e\xad\xff\x8c\x79\xd9\xe0\x1d\x38\xd1\xad\x16" - "\x51\x05\x99\xc6\x04\x8f\x3a\xd4\x13\xea\x96\xc0\x6c\x1d\x9d\x8e" - "\xff\x1a\xbd\x03\x23\x5a\xbc\x03\x63\x9a\xfb\xde\xd4\xae\x7a\x03" - "\x75\xc7\x7c\x7c\xa3\x11\xf9\x1a\x73\x03\xc3\xb3\x5e\x45\xca\x34" - "\x1d\xf2\xac\x4c\xd5\xa2\xd4\x24\x46\x57\x89\x7e\x40\x7d\xea\xb0" - "\xf6\xfc\x0e\x55\xd4\x97\xa3\x85\x4b\x18\xe6\x0a\x55\x31\x18\x8f" - "\x9b\x00\x4f\x4e\x57\xff\x03\x29\xe1\x1d\xc1\xbb\xe0\x83\xf3\xf1" - "\x98\x08\xfd\xe7\xd6\xd1\x99\x85\xa9\xc8\xf7\xcf\x6f\xd5\x21\x7c" - "\x7d\x27\x7c\x0c\x5b\x9f\x2f\x49\x7d\x03\x51\x07\x6f\xd5\x50\xa4" - "\x6f\xfe\xe6\xa6\x65\xdf\x3c\x71\x36\xd8\x72\x0e\xbe\x57\x31\xba" - "\xe0\x55\xb9\xb6\xfc\xe6\x98\xa9\xef\x66\x6d\x79\xc1\x40\xfa\x7b" - "\x8b\xbe\xfb\xcf\xf0\x7e\xde\x96\xdf\xec\xc7\xb6\x64\x72\x03\x63" - "\xab\xea\x5a\xb0\x6e\xf2\xbc\x92\x82\x28\xb8\x3e\xa3\x32\xe9\x16" - "\x92\xb0\x71\x91\x99\x8d\x2b\xdc\x6a\xbb\xdd\x92\xb0\x71\x39\xd8" - "\xb8\x46\xc4\xc6\x65\xf6\xd9\xf8\xf4\x46\xe7\x6d\x7c\x7a\xaa\xb4" - "\x8d\x4f\xef\x96\x6f\xe3\xd3\x4a\xf9\x36\x3e\xed\xc9\xd9\x58\x2b" - "\xb4\x71\x85\x46\xda\xc6\x41\x66\x38\x0e\x02\x1c\xf7\xbe\x24\x6e" - "\xe3\x20\xc0\x71\x90\x08\x8e\x83\xec\xc4\x71\xe5\x75\xe7\x6d\x5c" - "\x79\x54\xda\xc6\x55\xdd\xe4\xdb\xb8\x72\xad\x7c\x1b\x57\x26\x13" - "\x1b\x07\x59\xe0\xb8\xd2\xdf\x86\x8d\xcd\x70\x1c\x04\x38\xf6\xfa" - "\x56\xc2\xc6\x80\xe3\x20\x11\x1c\x07\xd9\x89\xe3\xea\xc9\xce\xdb" - "\xb8\xfa\x51\x69\x1b\x57\xcf\x97\x6f\xe3\xaa\x3a\xf9\x36\xae\xaa" - "\xe1\x6c\x6c\x81\xe3\xaa\x0d\xd2\x36\x56\x99\xe1\x58\x05\x38\x7e" - "\x6e\x93\xb8\x8d\x55\x80\x63\x95\x08\x8e\x55\x76\xe2\xf8\xcc\x11" - "\xe7\x6d\x7c\x26\x43\xda\xc6\x67\x4e\xcb\xb7\xf1\x99\x89\xf2\x6d" - "\x7c\x26\x94\xd8\x58\x65\x81\xe3\xea\x7a\x1b\x36\x36\xc3\xb1\x0a" - "\x70\xfc\xfa\x58\x09\x1b\x03\x8e\x55\x22\x38\x56\xd9\x89\xe3\xbf" - "\xf7\x77\xde\xc6\xdf\x5e\x96\xb6\xf1\xdf\x87\xcb\xb7\xf1\xb7\x25" - "\xf2\x6d\xfc\x6d\x11\x67\x63\x0b\x1c\x7f\x1b\x2d\x65\xe3\x56\xd0" - "\x80\x7d\xc0\xc6\x7d\xea\x11\xb5\x13\xdb\xb6\x86\xd8\xd6\xd0\x6f" - "\x74\xfa\x4e\xca\x98\x80\x6d\xc2\x8e\x01\xfd\xe4\xeb\x6e\xc8\x0d" - "\x9c\xc8\x50\x50\xa7\x54\x3c\xee\xfa\xf7\x6d\xfa\x4c\xe4\xae\x4c" - "\xc5\xe3\xbf\xe7\x96\xe1\x34\xca\xd4\xf5\x17\xe1\x7d\x34\x1e\xf7" - "\xd2\xe7\xe8\x34\x06\x9f\x61\xea\x2b\xd4\xd9\x33\xcc\x60\xbf\x60" - "\xd0\x5e\xb1\xcc\xdb\xbe\xde\x55\xf5\x25\x60\x9f\x53\xa8\xb2\xe6" - "\x4f\xc8\xd8\x6f\x74\xe6\xd3\x7a\x14\xc0\xfc\x14\xe0\x5d\x01\x0a" - "\xdb\xf0\xa6\xaf\x5b\x55\x4a\x39\xaa\x4a\xf9\x0c\x45\xd5\x31\x77" - "\x99\xff\x04\xb8\xb5\xfa\x8c\x2b\x37\xf8\x8c\x8e\x35\xe4\x45\xc6" - "\xe8\x7d\xc6\x95\x1e\x58\xae\xa5\xdc\x9a\x50\x40\x62\x2d\xc3\x64" - "\xcf\x41\x8a\xec\x4b\xc8\x75\xcb\x1c\xe4\xb6\xe5\x12\xf2\xac\xa8" - "\xad\x41\xa7\xaf\x95\xa3\xd3\xb7\xce\xa3\xd3\x77\xe1\xd3\x02\x1f" - "\x23\x7c\xd2\xcf\x83\xaf\x11\x8a\xbc\x8e\x50\x5a\x2d\xa3\x0b\xba" - "\x80\xbc\x2b\xf4\x35\x08\xcf\x99\xba\x41\x9d\x5d\xe0\x16\x8b\xbc" - "\x99\xff\xf8\x22\xe6\x4d\x5f\x0a\xee\x29\xf0\xf5\x2a\xbd\x0e\x55" - "\xd4\x36\xe1\xfb\x13\xe1\xbe\x22\xad\x16\xf2\x37\x96\xe3\xb3\x38" - "\x75\x15\xe9\x27\xa1\x7e\x45\x25\x0c\xd6\xd0\xfd\x02\x95\x6a\x30" - "\xb5\x91\xf1\x7d\x9c\xe0\xe0\xdc\xba\x5d\x46\xb9\xbe\x3e\x5b\xc0" - "\xda\xf8\x6d\xdf\xbe\x60\xe7\x01\xc6\xb7\x63\x3c\x27\x9d\xff\x9e" - "\xc1\xf3\xf5\xf0\x58\x42\x65\xc3\x29\x84\x7f\x6b\x8a\x7a\x07\xa1" - "\x89\x06\x84\xb0\x2d\xaa\x52\xea\xd0\xa4\x24\xe4\x81\xc7\x9f\x8d" - "\x3f\x05\xf4\xad\xaa\xd5\xa1\x35\x7a\x28\xe3\x8d\xa6\x7b\x65\xac" - "\x5c\x5b\x89\xe0\xde\x80\xca\x04\x2d\x72\x4b\x42\x9e\xd8\xbe\xfa" - "\xdc\xc0\x88\x49\xd0\x7e\x16\x36\x30\x0c\xb6\x2d\xb6\x29\xb6\x2f" - "\xce\xcf\x64\xf3\xaa\x38\x1d\x4a\x6b\x42\x9e\x55\xa9\xf0\x37\x85" - "\xd1\x55\xa1\x9b\x08\xca\x98\xce\x78\x15\x95\x00\x2e\xd6\x62\x2c" - "\x68\xa9\xbf\xab\xc1\xff\x7d\x25\x30\x55\x46\x30\xd5\xed\x96\x1d" - "\x98\xaa\xe0\x31\x75\xee\x3a\x8f\xa9\x7f\x9e\x94\xc6\xd4\x3f\x07" - "\x73\x98\xd2\x76\x4d\x4c\xfd\xe3\x2b\xdb\x98\xfa\x47\x91\x0d\x4c" - "\xd5\x00\xa6\x8a\x84\x98\xfa\xe7\x79\xf9\x98\xfa\x87\xae\x13\x31" - "\x55\xee\x18\xa6\xfe\x71\x56\x88\xa9\x73\xb5\xd2\x98\x0a\xe2\xe2" - "\x54\xef\x4b\x6d\x63\x2a\xc8\x2c\x4e\xd5\x8c\xe1\x31\xf5\xdd\xa3" - "\xd2\x98\x3a\xff\x0e\xc1\x54\x50\x17\x8d\x53\xe7\x7d\x6c\x63\xaa" - "\xa6\x41\x1a\x53\x41\x10\xa7\x82\x2c\xe2\xd4\x77\x43\xe5\x63\xea" - "\x7c\x78\xe7\x61\x2a\xc8\xc1\x38\x75\x3e\x40\x88\xa9\x9a\x10\x1b" - "\x98\xe2\xe2\x94\xd7\xb7\x76\x60\xca\x2c\x4e\x7d\x97\xc7\x63\xea" - "\xc2\x62\x69\x4c\xfd\xeb\x34\x87\xa9\x2e\x1a\xa7\xfe\x35\xdf\x36" - "\xa6\xfe\x15\x61\x03\x53\x10\xa7\x82\x2c\xe2\xd4\x85\x0c\xf9\x98" - "\xfa\x57\x7e\x27\x62\xca\xc1\x38\xf5\xaf\xd5\x42\x4c\x7d\x97\x25" - "\x8d\x29\x15\x17\xa7\x9e\xdb\xd4\x36\xa6\x54\x66\x71\xea\xc2\x55" - "\x1e\x53\xff\x3e\x21\x8d\xa9\x7f\x0f\x22\x98\x52\x75\xd1\x38\x75" - "\xf1\xb8\x6d\x4c\x5d\x2c\x90\xc6\x94\x0a\xe2\x94\xca\x22\x4e\xfd" - "\xfb\x9c\x7c\x4c\x5d\xac\xef\x3c\x4c\xa9\x1c\x8c\x53\x17\xab\x85" - "\x98\xba\xa0\xb5\x81\x29\x2e\x4e\xbd\x3e\xd6\x0e\x4c\x99\xc5\xa9" - "\xef\x47\xf3\x98\xfa\xa1\xbf\x34\xa6\xb4\xcb\x38\x4c\x75\xd1\x38" - "\xa5\xf5\xb2\x8d\xa9\xef\x75\x36\x30\x05\x71\x4a\x65\x11\xa7\x7e" - "\x18\x22\x1f\x53\xda\xb0\x4e\xc4\x94\x83\x71\x4a\xeb\x2f\xc4\xd4" - "\xf7\x23\xa4\x30\xd5\x82\x75\x9f\x0b\x60\x2a\x01\x74\x1f\x60\xc8" - "\xa3\x9a\x60\xaa\x15\x30\xb5\xc3\x1c\x53\xff\xb2\xd4\x7d\x3f\xe4" - "\x18\xef\x61\xea\x3f\x3b\x2d\x31\x65\x04\x4c\xb5\xb2\x98\xba\x74" - "\xc4\xa4\xfb\xaa\xea\x8b\xc0\x57\xd7\x50\x55\x34\xe0\x69\x2b\x87" - "\xa7\x7f\x01\x9e\xa0\x3e\x46\xa8\x6f\xc5\x85\x1a\x14\xa5\x23\xf5" - "\x6a\x81\xfa\x1a\xcd\xb1\xd4\x52\x47\x61\x0c\x61\xec\x98\x70\x74" - "\x7a\x21\xe0\x67\xc9\x19\x74\x7a\x39\x7c\x56\xc2\x27\x15\x3e\xe8" - "\x0c\xaa\xa8\x43\xec\x98\x3d\x8f\x9f\x6a\x0e\x3f\x97\x26\xdb\xc6" - "\xcf\xa5\x60\x79\x1a\xef\x3f\x07\xe4\xe3\xe7\x12\x67\xcf\x18\xcf" - "\xa8\xc9\xdf\x33\x78\x7e\x2c\xc1\xc8\x35\x14\xa5\x47\x1e\xcc\xeb" - "\x01\x7d\xdd\x62\x90\xe7\x2a\x03\xa2\x36\xcf\x41\x9e\x9b\xbf\x83" - "\xfa\x9a\xda\xce\x25\xe4\x76\xaa\xe9\x4f\xa8\xe2\x56\x0d\xaa\xb8" - "\x7b\x12\x55\x18\xe1\x73\x0d\x3e\x50\xc6\xa8\x78\xf3\xfa\xea\xb8" - "\xfa\xfe\x67\x0c\xe4\xe5\x2f\x5d\xdf\xff\x28\xd9\xfa\xc6\x41\x7d" - "\x5b\xf8\xfa\x56\x01\x16\xc1\x2f\x03\x8c\x9c\x4e\x8c\xd2\xa1\x9e" - "\x8b\xf4\x0c\xd3\xc2\x61\x10\xfb\xe5\xd4\xd9\x26\x14\x95\x04\xbe" - "\x7a\x13\x30\x58\xbb\x17\xa5\xad\x06\x0c\xb6\x34\xe1\xdf\xf5\x75" - "\x55\xe9\xcd\x80\xc1\x4b\x71\x0c\xd8\xad\x15\x63\xf0\x5f\x18\x83" - "\x3f\x6c\x30\x4a\x63\xb0\x8c\x60\x10\x74\x62\xdb\x18\x34\x8b\x6b" - "\xb5\x3e\x3c\x06\xaf\x0c\x92\xc6\xe0\xe5\x51\x26\x9d\xf8\xdf\xc7" - "\x60\xed\x39\xdb\x18\xac\x3d\x2c\x4f\x13\x5e\x19\x2e\x1f\x83\x97" - "\x15\x9d\x87\xc1\xcb\x27\x6c\x63\xf0\x72\xb1\x1d\x18\x2c\x77\x0c" - "\x83\xb5\x75\x42\x0c\xd6\xba\x49\x63\x30\x88\x8b\x83\xa0\x2b\xdb" - "\xc4\xa0\xb9\xae\xbc\xb2\x8d\xc7\x60\xdd\x1e\x69\x0c\xfe\x78\xdc" - "\xa4\x2b\xff\xfb\x18\xfc\x71\x9a\x6d\x0c\xfe\x18\x22\x4f\x43\xd6" - "\x1d\x91\x8f\xc1\x1f\x37\x74\x1e\x06\xeb\x26\xd8\xc6\x60\x5d\x40" - "\xdb\x18\x0c\x72\x30\x0e\xfe\x98\x28\xc4\xe0\x15\xb5\x0d\x0c\x72" - "\x71\x10\x74\x68\xdb\x18\x34\x8b\x83\x57\x1f\xe5\x31\xf8\xd3\x10" - "\x69\x0c\x5e\x1b\x63\xd2\xa1\xff\x7d\x0c\x5e\xbd\x68\x1b\x83\x57" - "\x8f\xc9\xd3\x9c\x3f\x8d\x92\x8f\xc1\x6b\x6e\x9d\x87\xc1\x6b\xa7" - "\x6d\x63\xf0\xda\x7e\x3b\x30\xe8\x60\x1c\xbc\xaa\x13\x62\xf0\xaa" - "\xb7\x34\x06\x55\x5c\x1c\x04\xdd\xda\x26\x06\xcd\x75\xeb\x4f\xbb" - "\x79\x0c\x5e\x3f\x20\x8d\xc1\xfa\x13\x26\xdd\xfa\xdf\xc7\x60\xfd" - "\x6c\xdb\x18\xac\x0f\x93\xa7\x51\xaf\x1f\x97\x8f\xc1\x7a\x75\xe7" - "\x61\xf0\xfa\x64\xdb\x18\xbc\x1e\xdc\x36\x06\x55\x0e\xc6\xc1\xfa" - "\x64\x21\x06\x7f\xca\xb7\x81\x41\x2e\x0e\x82\xce\x6d\x1b\x83\x66" - "\x71\xf0\xc6\x60\x1e\x83\xba\xe1\xd2\x18\xfc\x79\x82\x49\xe7\xfe" - "\xf7\x31\x78\xe3\xb2\x6d\x0c\xde\x28\x93\xa7\x69\x75\x63\xe4\x63" - "\xf0\x67\xef\xce\xc3\xe0\xcf\xe7\x6c\x63\xf0\xe7\xc3\x76\x60\xd0" - "\xc1\x38\x78\xa3\x49\x88\xc1\x1b\x7e\x52\x18\x34\x82\x2e\x6e\x2d" - "\xf6\x0b\x36\xe6\x8e\x2b\xf7\x70\x51\x22\xbd\xf7\x30\x75\x55\x72" - "\x03\x9a\x74\x07\xec\x93\x74\x07\xcd\xbc\xe3\x89\x0c\xb9\xe3\x4a" - "\x81\x93\x47\x98\xe9\x67\x76\x6e\x99\x5e\x5d\x54\xb2\x65\x21\x52" - "\x80\xfe\xce\xc4\xd7\xaa\xae\x34\x21\xfc\xfe\x35\xb8\x3c\xd7\xf8" - "\xf2\xe0\x71\x02\xe6\xe7\x00\x4f\xf6\x37\xe6\x16\x2d\xaa\x0d\x45" - "\x74\x45\xad\x16\xec\xb0\x92\xf5\x2f\xb6\xcb\x15\xea\xa6\x77\xe1" - "\x0d\xa4\xd0\xff\xc7\x77\x00\xd8\xdb\xbb\xcf\x0a\xe4\xe2\x57\xcb" - "\x18\xb1\x5d\xb1\xbd\xb0\x8d\x95\x2b\xf1\x6f\xd7\x37\xe3\x2b\x01" - "\x63\xfa\xff\x04\x0c\xd8\x05\xe9\xc4\xf5\xea\xcd\x05\xf2\xb1\x71" - "\x33\x98\xac\x5b\xb8\x09\x6d\x01\x89\xfe\x76\x0c\xb6\x2a\xb3\xd3" - "\x56\xe5\x66\x3a\xaf\x03\x6c\x75\x2b\xcc\x3e\x5b\xdd\xca\xb1\xb0" - "\x95\x88\xae\xba\xb5\x4d\xbe\xad\x6e\xcd\x20\xb6\xba\x15\x22\x6d" - "\xab\x20\x3b\x71\x15\x14\x61\xa6\x47\x3a\xc0\x56\xb7\x13\xed\xb3" - "\xd5\xed\xe3\x42\x5b\x89\xf1\xff\xdb\x27\xe4\xdb\xea\xf6\x06\x62" - "\xab\xdb\x71\x36\x6c\x65\x27\xae\x82\xca\xcd\x78\x73\x07\xd8\xaa" - "\x21\xdf\x3e\x5b\x35\x5c\xb5\xb0\x95\x08\x4f\x6d\xb8\x29\xdf\x56" - "\x0d\x87\x89\xad\x1a\xd4\xd2\xb6\x52\xd9\x89\x2b\x55\x84\x19\xbf" - "\xeb\x00\x5b\xdd\x29\xb3\xcf\x56\x77\x7d\x84\xb6\x12\xe3\x53\x77" - "\x1f\x95\x6f\xab\x3b\x5a\x62\xab\x3b\xc7\x6c\xd8\xca\x4e\x5c\xa9" - "\xca\xcd\x78\x48\x07\xd8\xea\xae\xce\x3e\x5b\x35\x8e\xb1\xb0\x95" - "\x48\xbf\xdf\x38\x41\xbe\xad\x1a\xdd\x88\xad\xee\xd6\x49\xd9\xca" - "\x90\x1b\x18\xee\x01\x36\x68\xde\x1a\xa8\xf4\x48\x41\x54\x8b\x3f" - "\xd8\xcd\x1b\xec\x96\xa1\x44\xad\xb9\x60\x37\x9d\x1e\x4d\x5a\xfc" - "\x3d\x53\x59\x6f\x40\x2d\x60\xb3\x66\xef\xc0\x88\x2a\x5d\x1d\x9e" - "\x73\xf4\xc2\x25\xaa\x79\xc8\xeb\x8b\x3d\x11\xb6\x1b\xb6\x03\xb6" - "\x1d\x03\x76\x63\xed\xe8\x1d\x19\x63\xf0\x1e\x1d\x1b\x79\xfd\x7b" - "\x66\x91\x96\x61\x70\x7d\x19\x4f\x9d\x06\xff\x2e\x10\x55\x87\x7a" - "\x2a\x5f\xc5\x75\x6a\x3a\x8f\xaf\x57\xe9\x6a\x80\x1f\xdc\x42\x2c" - "\x37\xfb\x3e\xc0\xdb\xf0\x5a\x80\x9b\xa1\x2a\xe6\x65\xa6\xef\x4d" - "\xad\xbe\xdf\xf3\x25\x69\xd7\x51\x77\xcc\x1f\xb2\x8d\xc8\x77\xcd" - "\x02\x44\x1d\x7c\x4b\x43\xb1\x6b\xd7\x96\xb0\x79\xec\x01\xbb\xf8" - "\x32\xb7\xcd\xe6\x74\xdf\x4e\x40\x55\x57\xd4\xac\xdf\x2c\x39\x02" - "\xeb\xb7\x7f\x06\x78\x02\xcf\x0c\x66\xbc\x03\x63\xd4\x95\x48\xc9" - "\xb4\x82\x8d\xd9\xf5\x44\xcd\x39\x85\x2d\x72\x6d\xdc\xc4\xce\xff" - "\x36\x2a\xb9\xf9\x5b\x60\x27\xfc\x7e\x76\xfe\x56\x92\xd9\xfc\x2d" - "\x28\x33\x3f\x7f\xab\x69\x04\x9e\xbf\x65\xfc\xde\x77\x80\xa9\xee" - "\x8b\x12\x19\x06\xea\xde\xb7\xb2\x41\x87\x70\xfd\x2b\x1b\x34\x28" - "\x2d\x19\x79\x56\xb6\xd4\xa1\xd4\x06\x46\x57\x99\x7e\x15\x45\xdd" - "\xc1\x3c\x18\xe3\xa5\x79\x10\xf1\x6b\x63\x83\xf1\xfb\x80\x01\x5a" - "\xaa\xd9\xb7\xb2\x1a\x21\xb3\x75\x3c\x09\xc0\x99\x5d\xc1\x0f\x09" - "\x55\xe9\x97\x10\xf8\x44\x5b\xa5\xff\x0e\xfb\x29\x01\xee\x87\xde" - "\xe3\xd7\xfd\x46\x5f\xc2\xd7\xb0\xcf\xf0\xef\x4d\x55\x49\x3a\x36" - "\x8d\xe9\x3e\xc6\x85\x47\x4a\x3a\xaa\x4a\x69\x41\x95\x7a\xbc\x66" - "\xb7\xb1\xe8\x9b\x98\x1a\x29\x1c\x95\x71\x38\x2a\xf2\x48\xe9\x76" - "\xcb\x0e\x1c\x95\xf3\x38\x6a\x5d\xec\x1c\x8e\x5a\x07\x39\x8f\xa3" - "\x96\xeb\x4e\xe0\xa8\x46\x88\xa3\xd6\xf3\xf2\x71\xd4\x52\x2a\x1f" - "\x47\x2d\xab\x9d\xc3\x51\xeb\x7c\x82\xa3\x96\x50\x82\xa3\xd6\x58" - "\x1e\x47\xec\xda\xa8\x0e\xc2\x51\x73\x9d\x34\x8e\x82\xb8\x78\x14" - "\x04\xf1\xa8\xf7\xa5\xb6\x71\x14\x64\x16\x8f\x0c\x47\x9d\xc3\x91" - "\x61\xbe\xf3\x38\x32\x8c\x74\x1c\x47\x41\x16\xf1\xc8\x38\x48\x3e" - "\x8e\xf0\xd2\x79\xb9\x38\xd2\x97\x39\x87\x23\xc3\x21\x82\x23\xfd" - "\x5a\x82\x23\xc3\x5e\x1e\x47\xec\x7a\xb3\x0e\xc2\x91\x3e\xd8\x06" - "\x8e\xb8\x78\x14\x04\xf1\xc8\xeb\x5b\x3b\x70\xc4\xc7\x23\x1a\xb9" - "\x38\x87\x23\xe6\x90\xf3\x38\x62\xd6\x38\x81\x23\x61\x3c\xa2\xd1" - "\x7c\xf9\x38\x62\x22\xe4\xe3\x88\x71\x73\x0e\x47\x4c\x33\xc1\x91" - "\xb1\x82\xe0\x08\xee\xdf\xc3\x11\xbb\x86\xaf\x83\x70\x64\x4c\x91" - "\xc6\x91\x8a\x8b\x47\x2a\x88\x47\xcf\x6d\x6a\x1b\x47\x2a\x3e\x1e" - "\xd1\xd4\x04\xa7\x70\x44\xbb\x34\x3b\x8d\x23\xda\xe5\x84\xe3\x38" - "\x52\x09\xe3\x11\x4d\x1d\x92\x8d\x23\xda\x45\x2d\x1b\x47\xb4\xcb" - "\x14\xa7\x70\x44\x53\x63\x58\x1c\xd1\x2e\xde\x2c\x8e\x68\x2a\x84" - "\xc7\x11\xbb\x2e\xb2\x63\x70\x44\x23\x8d\x0d\x1c\x71\xf1\x48\x05" - "\xf1\xe8\xf5\xb1\x76\xe0\xc8\x2c\x1e\x29\x72\x9c\xc3\x91\x62\x8c" - "\xf3\x38\x52\xf4\x71\x02\x47\x16\xf1\x48\xd1\x2c\x1f\x47\x74\x8d" - "\x7c\x1c\xd1\x05\xce\xe1\x48\xb1\x91\xe0\x88\x9e\x41\x70\xa4\x48" - "\xe7\x71\xc4\xae\x35\xed\x20\x1c\xd1\xae\x52\x38\xc2\x7b\x11\x7c" - "\x48\xf6\x85\x68\xd8\xb2\x12\x85\x14\xe2\xbf\x2d\x28\xb8\x31\xbb" - "\x5b\xf0\x57\xab\xc9\x7e\x00\x5a\xba\x1b\x3b\xde\x2b\xf6\x7c\xef" - "\x7d\xe0\x17\xef\xc0\xb0\xa8\x8b\x64\x8f\x06\xbc\x2f\xc8\xed\xb4" - "\x04\xf4\x34\xde\x97\x81\xee\x9e\x80\xf7\xb1\xba\xb7\x77\x80\xb7" - "\xc4\xde\x01\xd3\xa5\xf7\x0e\x68\xd9\x6a\x5a\x77\xbb\x97\x5f\x77" - "\x4b\x77\x1f\x69\x73\xdd\x2d\xdd\xfd\xd1\x9d\xd3\xe5\xe2\xa1\x1b" - "\xbb\xfe\xeb\x76\xbf\x40\x65\x63\x76\x77\x15\x7c\x57\x90\xba\x77" - "\xdf\x8b\xec\x5a\x8f\xbb\xd7\x0c\x27\xdd\x6a\xa6\xce\x40\xe9\xcc" - "\xa6\x13\x2a\xc6\x27\x30\x8c\xc9\x0b\x8c\x96\x57\x96\xee\xc9\x6d" - "\xd8\x5b\x23\x6e\xef\x1e\x35\x9c\xbd\x8b\x38\x7b\x8b\xef\x5b\x30" - "\x5d\x7a\xdf\x02\x71\x7b\xf7\xb0\xbd\xce\x99\xee\xb1\x59\xbe\xbd" - "\x7b\xc4\x70\xf6\x2e\x6a\xcc\xee\x51\xc0\xdb\xdb\xd5\x57\xbe\xbd" - "\x7b\x44\x10\x7b\xff\x55\x09\xf6\xd6\x80\xbd\xab\x65\x96\xa5\xd6" - "\xb6\xbd\x83\x24\xf0\xdd\x33\x82\xd8\x9b\xdb\x33\xc1\x5b\x62\xcf" - "\x84\xe9\xd2\x7b\x26\x88\xdb\xbb\xa7\x8f\x6d\x7b\xbb\x1a\xe4\xdb" - "\xdb\xb5\x9c\xd8\x3b\x08\xf0\xdd\xd3\x8d\xb7\x77\x4f\x3b\xf7\x15" - "\x30\xb7\xb7\x6b\x29\xb1\xf7\xdf\xbc\x19\x9f\x20\xc0\x77\x90\x4c" - "\x7c\xf7\x9c\xd2\x86\xbd\x25\xf0\xdd\xab\x94\xb3\x37\x87\x6f\x89" - "\xfd\x1a\xa6\x4b\xef\xd7\x20\x6e\xef\x5e\xeb\x6c\xdb\xbb\xd7\x02" - "\xf9\xf6\xee\x15\xc2\xd9\x1b\xf0\xdd\x6b\x35\x6f\xef\x5e\x4d\xf2" - "\xed\xdd\x2b\x80\xd8\xbb\xdc\x15\xec\x0d\xf8\x0e\x92\x89\xef\x5e" - "\x65\xb6\xed\xad\x92\xc0\xb7\x5b\x00\xb1\x37\xb7\x57\x84\xb7\xc4" - "\x5e\x11\xd3\xa5\xf7\x8a\x10\xb7\x77\xef\x3b\xb6\xed\xdd\xfb\xa2" - "\x7c\x7b\xf7\xde\x4b\xec\xad\x02\x7c\xf7\xae\xe7\xed\xed\x96\x20" - "\xdf\xde\xbd\xf3\x39\x7b\xeb\x19\x1f\x15\xe0\x5b\x25\x13\xdf\x6e" - "\x23\xda\xb0\xb7\x04\xbe\xfb\xe4\x73\xf6\xe6\xf0\x2d\xb1\x4f\xc5" - "\x74\xe9\x7d\x2a\xc4\xed\xdd\x27\xde\xb6\xbd\xfb\x44\xca\xb7\x77" - "\x1f\x5f\xce\xde\x80\xef\x3e\x33\x78\x7b\xf7\xa9\x91\x6f\xef\x3e" - "\xae\xc4\xde\x27\x75\x60\x6f\xc0\xb7\x4a\x26\xbe\xfb\x14\x4b\xd9" - "\xdb\x03\xec\x7d\x02\x78\x0c\xf4\x83\x11\xc6\x5c\xe0\x29\x06\xa1" - "\xdd\xab\x52\x42\xd0\xb0\xbb\xd8\xf6\x1e\x6b\xa1\xef\x88\xe8\xb4" - "\xfd\x32\x68\x8f\x05\x4e\xaf\x1d\xa6\x3d\x46\x49\xae\x1d\xa6\x3d" - "\x06\xc9\x5e\x3b\x4c\xbb\xd7\xf3\x1c\xc8\x23\x98\xf7\xa9\x07\x1b" - "\x3f\x64\xad\x29\xa6\xdd\x2f\x88\xee\xa3\x41\xbb\x67\xe1\x35\xc5" - "\xcc\xa6\x53\xb5\xc6\x3c\x47\xb8\x91\x87\xda\x0e\x5f\x97\x83\x1f" - "\x34\xd2\xbe\xf6\x4a\x02\x5f\x97\x77\xda\xbe\x1d\xb4\xd7\x34\xe7" - "\x7d\xed\x35\x58\xda\xd7\x5e\x7d\xe4\xfb\xda\xb3\x86\xe7\x5f\x5e" - "\x7e\xbc\xaf\xbd\xe4\xaf\x1f\xa7\x3d\xcb\x45\xf7\xf3\xa0\x3d\x53" - "\x88\xaf\x2b\x22\xc0\xd7\x0e\xf0\x32\xaf\xd5\x6d\xfb\x3a\x08\xda" - "\x75\x90\x8d\x76\xfd\xc8\x0c\xe8\x33\x23\x3a\x6d\xff\x10\xfa\x91" - "\xf1\xce\xfb\xfa\x11\x2f\x69\x5f\xf7\x6d\x96\xef\xeb\xbe\x65\x3c" - "\xf7\x7b\xc4\x95\xf7\xf5\x23\x05\xf2\x7d\xdd\xf7\xb0\xe8\xbe\x22" - "\x74\xdf\x38\xe2\xeb\xd3\xfb\x8d\x79\x8e\x70\xc2\x47\x12\xec\xf0" - "\x35\xb4\xeb\x20\x1b\xed\xda\x27\x02\x7c\x5d\xde\x69\xfb\x98\xd0" - "\x3e\xc3\x9d\xf7\xb5\xb7\x41\xda\xd7\xde\x97\xe5\xfb\xda\xbb\x84" - "\xe7\x9d\xde\x0d\xbc\xaf\x7d\x36\xc8\xf7\xb5\x77\x91\xe8\xfe\x26" - "\xb4\x77\x34\xf1\x75\x95\x27\xf8\xda\x01\x3e\xea\x23\xc9\xff\x79" - "\x5f\xab\xa0\x5d\xab\x6c\xb4\xeb\x5f\x8c\x00\xae\x10\xd1\x69\xfb" - "\xa9\xd0\xbf\x78\xd4\x79\x5f\xf7\xbb\x2a\xed\xeb\x7e\x67\xe4\xfb" - "\xba\x5f\x01\xcf\x79\xfb\x69\x79\x5f\xff\x22\x59\xbe\xaf\xfb\x65" - "\x89\xee\xb3\x42\xf7\x0b\x25\xbe\xae\x4e\x36\xe6\x39\xc2\x85\x7f" - "\x11\x66\x87\xaf\xa1\x5d\xab\x6c\xb4\xeb\xfe\xa0\xeb\x55\xe5\x9d" - "\xb6\xaf\x0b\xdd\xbf\xa7\xf3\xbe\xf6\x3d\x27\xed\x6b\xdf\xe3\xf2" - "\x7d\xed\xbb\x81\xe7\xdb\xbe\x15\xbc\xaf\xfb\xc7\xca\xf7\xb5\x6f" - "\x8a\xe8\x7e\x2f\xb4\x6f\x00\xf1\xf5\x99\x1a\xf0\xb5\x03\x3c\xbc" - "\xbf\xca\x11\x1e\xbe\x74\x27\x72\x15\xfa\xfb\x97\x9e\x9d\xcb\xc5" - "\x07\x34\x3b\xef\xef\x01\x27\xa4\xfd\x3d\xe0\x80\x7c\x7f\x0f\x48" - "\xe1\xb9\xf8\x80\x63\xbc\xbf\x7f\x19\x2d\xdf\xdf\x03\x12\xc4\xb9" - "\xf8\x00\x5f\xe7\xb8\xf8\x2f\xfd\x1c\xe1\xe2\xd6\xfe\x7e\x14\x75" - "\x2e\x1f\xf7\xbb\xea\xbc\xbf\xfd\x8e\x48\xfb\xdb\x6f\xa7\x7c\x7f" - "\xfb\x25\xf0\x7c\xdc\x6f\x3f\xef\xef\x47\xc3\xe4\xfb\xdb\x2f\x46" - "\x9c\x8f\xfb\xb9\x3a\xc7\xc7\x1f\x75\x73\x84\x8f\x5b\xfb\x7b\xa0" - "\xae\x73\x39\xf9\xc0\xf3\xce\xfb\x7b\xe0\x1e\x69\x7f\x0f\xdc\x2c" - "\xdf\xdf\x03\x63\x78\x4e\x3e\xd0\x6c\xfc\xfb\xb1\x60\xf9\xfe\x1e" - "\x18\x21\xce\xc9\x1f\x6d\x72\x8e\x93\x0f\xd4\x3b\xc2\xc9\xad\xfd" - "\xad\xd4\x76\x2e\x2f\x57\x9e\x74\xde\xdf\xca\x3c\x69\x7f\x2b\xd7" - "\xc8\xf7\xb7\x32\x82\xe7\xe5\xca\x2c\xde\xdf\x83\x94\xf2\xfd\xad" - "\x0c\x11\xe7\xe5\x8f\xd5\x39\xc7\xcb\x95\xf5\x8e\xf0\x72\x6b\x7f" - "\x3f\x5e\xdd\xb9\xdc\xfc\xf1\xa3\xce\xfb\xfb\xf1\x75\xd2\xfe\x7e" - "\x7c\x81\x7c\x7f\x3f\x1e\xc2\x73\xf3\xc7\xcd\xc6\xff\x9f\xf0\x94" - "\xef\xef\xc7\x03\xc4\xb9\xf9\xa0\x1a\xe7\xb8\xf9\xe3\x17\x1c\xe1" - "\xe6\xd6\xfe\xf6\xd7\x74\x2e\x3f\xf7\xdf\xe7\xbc\xbf\xfd\x97\x49" - "\xfb\xdb\xff\x0d\xf9\xfe\xf6\x0f\xe0\xf9\xb9\x7f\x22\xef\xef\xc1" - "\x48\xbe\xbf\xfd\x7d\xc5\xf9\xf9\x13\xe5\xce\xf1\x73\xff\x0a\xe7" - "\xc7\xc9\x9f\x2a\xc0\xdc\x5c\xee\xfe\x8f\x55\xc9\xdc\x9a\x3b\x7a" - "\x30\xbf\xff\x23\xfd\xd4\x66\x24\xb5\xb7\x0c\xfd\xe4\xd5\x2e\xbd" - "\xff\x23\xfd\xa4\xed\xfd\x1f\xe9\x27\xe5\xed\xff\x48\x3f\x79\x46" - "\xf6\x7c\x7c\xfa\xc9\x02\x5e\x23\x3c\x69\xa6\xff\x9f\x62\xdb\x75" - "\x97\xde\x17\x92\x7e\x52\xb8\x2f\x24\x3d\x98\xdd\x17\x92\xd9\xf4" - "\xf7\x50\xc7\xb4\xc8\x53\x7b\x9d\xff\x5d\x20\x30\x05\xeb\x10\xb9" - "\xfb\x50\xf2\xd8\x0e\x58\xc6\x63\x3b\x70\xbe\x34\xb6\x87\x9c\xe8" - "\xd2\xfb\x50\xd2\x43\x26\xd8\xc6\xf6\x90\x00\x59\x7b\x8e\xd0\x43" - "\xe4\xef\x7b\x43\x0f\x49\xe1\xf5\xd0\x10\x33\xfd\x1b\x58\xda\x89" - "\xd8\x76\x6c\x3f\x25\x7a\xc8\x0c\x21\xb6\x03\x12\x09\xb6\xcf\xa9" - "\x1d\xd3\x5d\x81\x6b\x9d\xff\x1d\x64\xe8\x14\xac\xb9\xe4\xee\x87" - "\xc9\x63\x3b\x68\x32\x8f\xed\xa1\xe3\xa5\xb1\xad\xda\xdd\xa5\xf7" - "\xc3\xa4\x55\x83\x6d\x63\x5b\xa5\x90\xb5\x97\x09\xad\xda\x28\x1f" - "\xdb\xaa\x29\xbc\xf6\x53\xe5\xf3\xd8\x1e\x9a\xdb\x79\xd8\x76\x70" - "\x9f\x4c\x5a\x15\x22\xc4\x76\x50\x04\xc1\xf6\x3f\x6b\x1d\xd3\x98" - "\x43\x63\x9d\xff\xdd\x27\x38\x18\xeb\x4b\xb9\xfb\x72\xf2\xd8\x1e" - "\x36\x94\xc7\x76\xb0\xd5\xbe\x50\x3c\xb6\x9f\x5e\xd3\xa5\xf7\xe5" - "\xa4\x9f\x76\xb1\x8d\xed\x61\x5a\x59\x7b\xa4\xd0\x4f\xc7\xcb\xc7" - "\xf6\xd3\xc1\xbc\xce\x7d\x3a\x99\xc7\x76\x70\x52\x27\x62\xdb\xc1" - "\xb8\xfd\xb4\xb7\x10\xdb\xc3\xfc\x09\xb6\xbf\x0b\x71\x4c\x4f\x07" - "\x87\x3a\xff\x3b\xd7\xb3\x6e\x58\x4b\xcb\xdd\x1f\x94\xc7\xf6\xf0" - "\x9e\x3c\xb6\x9f\x31\x48\x63\xfb\x99\x69\x5d\x7a\x7f\x50\x7a\xb8" - "\xed\xfd\x7f\xe8\xe1\x36\xf6\xff\x11\x59\x2b\x4c\x3f\x23\x7f\xdf" - "\x0b\xfa\x19\x37\x5e\xd3\x3f\x13\xcd\x63\xfb\xd9\x89\x9d\x87\x6d" - "\x07\xf7\x0d\xa5\x87\xeb\x84\xd8\x1e\x8e\x08\xb6\x2f\x64\x39\x36" - "\x76\xf0\xac\xaf\xf3\xbf\xeb\x8d\xac\xc3\xe3\x06\x72\xf7\x29\xe5" - "\xb1\xfd\xec\x65\x1e\xdb\x23\xcf\x4b\x63\x7b\xe4\xc8\x2e\xbd\x4f" - "\x29\x3d\xe2\xa8\x6d\x6c\x8f\xc8\x97\xb5\xa7\x0b\x3d\x52\xfe\x3a" - "\x78\x7a\x44\x1d\x3f\x7e\x31\xd2\x6c\xfe\xfb\x73\x01\x9d\x88\x6d" - "\x07\xe3\xf6\x88\x0a\x21\xb6\x9f\xbd\x40\xb0\xfd\x6f\xad\x63\xe3" - "\x24\x23\x1b\x9c\x1f\x27\x09\x69\x60\x7f\xc3\x94\xb9\x5f\x2a\x8f" - "\xed\xe7\xbe\xba\xb7\x37\x11\x1d\x72\xd9\x12\xdb\xf7\xf6\x26\xa2" - "\x7f\x65\xe8\x32\xfb\xa5\xd2\xbf\xca\xb0\x8d\xe3\x5f\xc5\xca\x1b" - "\x13\xf9\xd5\x65\xf9\x38\xfe\x55\x09\x3f\x26\xf2\x2b\xb3\xf9\x2f" - "\xa3\x4c\x67\x92\x77\xfc\x9e\x45\x74\xc8\x46\x9b\x7b\x16\xd1\x21" - "\x09\x1d\xb6\x8f\x2a\xfd\xab\x5c\xc1\x9e\x45\xf4\x73\xa5\x46\xb6" - "\x2d\xfc\x30\xc2\xb1\x71\x95\x51\xc8\xf9\x71\x95\x50\xf2\xfb\xae" - "\xcc\x7d\x5b\xf9\xb6\x30\xea\x34\xdf\x16\x5e\xb8\x29\xdd\x16\x5e" - "\xe8\xd9\x65\xf6\x6d\xa5\x9f\xdf\x6c\xbb\x2d\x3c\x9f\x28\x6f\x0c" - "\xe5\x79\xf9\xfb\xc0\xd0\xcf\x1f\xe3\xc7\x50\x5e\x40\x7c\x5b\x08" - "\x0d\xeb\xbc\xb6\xf0\x42\x9e\xed\xb6\xf0\x42\x72\x87\xed\xe7\x4a" - "\x3f\x5f\x24\x6c\x0b\xa3\xca\x48\x5b\xf8\x4f\xa9\x63\xe3\x30\xa1" - "\x0e\xfd\xfe\x2d\x6c\x0b\x2f\xba\xb1\xbf\x7d\xcb\xdc\x3f\x96\x6f" - "\x0b\xa1\xe7\xf9\xb6\xf0\x6b\x2b\x3e\xcf\xb7\x85\x5f\xfb\x74\x99" - "\xfd\x63\xe9\xd1\xdb\x6c\xb7\x85\xd1\x29\xf2\xc6\x5c\x46\x1b\xe4" - "\xb7\x85\xd1\x66\xeb\x9f\x7e\x6d\xb6\xfe\xe9\xc5\x89\x9d\xd7\x16" - "\x7e\xbd\xdb\x76\x5b\xf8\x75\x7a\x87\xed\x2b\x4b\x8f\xde\x2f\x6c" - "\x0b\xa1\xd5\xa4\x2d\x5c\x09\x75\x6c\xdc\xe6\x45\x3b\xf8\x7f\x5b" - "\xe3\x36\x63\x7d\xd9\x79\x01\x32\xf7\xb1\xe5\xdb\xc2\x8b\x97\xf9" - "\xb6\x30\xb6\xa7\x74\x5b\x18\x33\xa8\xcb\xec\x63\x4b\x87\xed\xb1" - "\xdd\x16\xc2\xd6\xca\x1b\xa3\x19\xd3\x53\x7e\x5b\x08\x3b\xcb\x8f" - "\xd1\x8c\xf1\xe5\xdb\xc2\xd8\x98\xce\x6b\x0b\x63\x0e\xd8\x6e\x0b" - "\x63\xb2\x3a\x6c\x7f\x5b\x3a\xac\x54\xd8\x16\x5e\xbc\x40\xda\x42" - "\x9d\xc6\xb1\x71\x9e\xb1\xfe\xce\x8f\xf3\x8c\xf7\x67\xe7\x4c\xc8" - "\xdc\x4f\x97\x6f\x0b\x63\x6f\xf2\x6d\x61\xbc\x8f\x74\x5b\x08\x1f" - "\xda\x65\xf6\xd3\xa5\xc7\x1d\xb2\xdd\x16\xc6\xa9\xe5\x8d\xe9\x84" - "\xfb\xc8\x6f\x0b\xe3\xb4\xfc\x98\x4e\xb8\x3f\xdf\x16\xc6\xc7\x75" - "\x5e\x5b\x08\x3f\x6a\xbb\x2d\x84\xe7\x77\xd8\x3e\xbb\xf4\xb8\x32" - "\x61\x5b\x18\x5b\x47\xda\xc2\x4f\xe1\x8e\x8d\x0b\x8d\x0f\x76\x7e" - "\x5c\x28\x22\x98\x9d\x4f\x22\x73\x5f\x5f\xbe\x2d\x8c\x37\xf0\x6d" - "\x21\x42\xfa\x9c\x07\xfa\xe5\x51\x5d\x66\x5f\x5f\xfa\x25\xdb\xe7" - "\x1f\xd1\x2f\xd9\x3a\xff\x48\x64\x0c\xe8\xe5\x41\xf2\xdb\xc2\x4b" - "\xf5\xfc\x18\xd0\xcb\x66\xeb\xff\x22\x92\x3a\xaf\x2d\xbc\x6c\xfb" - "\xfc\x07\xfa\x65\x3b\xce\x7f\x70\x70\xbf\x5f\xfa\xa5\x6a\x61\x5b" - "\x18\xdf\x40\xda\xc2\xf5\x72\xc7\xc6\x91\x22\xda\x1c\xff\xc7\x3a" - "\xbf\xd5\xdb\x7a\x1c\xa9\xa2\x36\x04\x05\x4d\xc7\x6d\x61\x42\xad" - "\x3e\x2f\x30\x02\xef\x2f\x6c\xf0\xe7\xf6\xa0\xcc\xe0\xf6\x78\x69" - "\xd0\x93\x3d\x28\x75\x86\x7b\x7b\x50\x92\xbd\x3f\x10\x85\xd7\x02" - "\xe3\x35\xc1\x7a\x4f\xb2\xff\x24\x83\xe7\x44\xe1\x39\x52\x97\xca" - "\xd9\xfd\x55\x56\xeb\xa1\xee\x57\xda\xd8\x7f\x32\x56\x8b\x2a\x62" - "\x57\x22\xbd\x57\x51\x09\x59\x27\x3c\x21\x99\xdd\x7f\x72\x96\xef" - "\x80\xec\x7f\x23\x6f\x0f\xbc\xff\x64\x2c\x63\x4c\xd3\x32\xba\xca" - "\x26\x04\x69\xc1\xbe\xb3\xb9\x3d\x28\xe9\x09\x17\x71\xdd\xf5\xb3" - "\x02\x06\xec\xfa\xb7\xc4\xfe\xc2\xf4\x04\xf9\xfb\xc0\xd2\x13\xd4" - "\xfc\xf8\xce\x84\xb3\x3c\x46\xff\x1f\xdb\x07\xc3\xfd\xc4\x0a\x60" - "\x31\xcc\x26\xdd\xc4\x56\x87\xf6\xde\x98\xa0\xb3\xc3\x67\x78\x8e" - "\x88\x55\xfc\xe2\x7d\xf6\x4a\x3e\xf8\xac\x1c\xef\x73\x6c\xbf\xcf" - "\xba\xdd\xea\x18\x9f\xbd\x12\x60\xbf\xcf\x5e\xc9\xb1\xf0\x99\xc8" - "\x38\xc4\x2b\xef\xc8\xf7\xd9\x2b\xe1\xfc\x38\xc4\x2b\x1b\x78\x9f" - "\xbd\x52\x43\x7c\xf6\x8a\x92\xf8\xec\x66\x4a\xab\x43\xfb\x77\xbc" - "\xd2\xe6\xfa\x6f\xac\x9b\x5a\xbd\xad\x75\x39\xef\xb3\xc8\x89\xfa" - "\x3c\xd0\xee\xa0\xcb\xed\xf7\x59\xef\x4b\x1d\xe3\xb3\x89\x17\xec" - "\xf7\x59\xe4\x78\xa1\xcf\xc4\xf4\x72\xa4\xfc\x33\x3b\xe9\x89\x4d" - "\xbc\x5e\x8e\x0c\xe5\x7d\x16\x99\x45\x7c\x36\xf1\x2c\xf1\xd9\xad" - "\xe2\x56\x87\xf6\x00\x89\x8c\xb1\xc3\x67\xf8\x37\x7d\x1b\xed\x2c" - "\x0a\x81\xcf\xca\xf1\xbe\xcf\xf6\xfb\xcc\xeb\xdb\x8e\xf1\xd9\x24" - "\xb5\xfd\x3e\x9b\xd4\x6c\xe1\x33\x11\x5d\x37\xe9\x07\xf9\x3e\x9b" - "\xb4\x9f\xd7\x75\x93\x74\xbc\xcf\xa2\xc2\x88\xcf\x26\x6d\x20\x3e" - "\xbb\x5d\xdd\xea\xd0\x3e\x22\x51\x6d\x8e\x7f\x61\x1e\xda\xea\x6d" - "\xad\x73\x78\x9f\x45\x1f\xd6\xe7\x81\x16\x02\x9d\x63\xbf\xcf\x9e" - "\xdb\xd4\x31\x3e\x8b\x0e\xb7\xdf\x67\xd1\x07\x84\x3e\x13\xd3\x1f" - "\xd1\x79\xf2\x7d\x16\x1d\xcb\xeb\x8f\xe8\x62\xde\x67\xd1\x0d\xc4" - "\x67\xd1\xa1\xc4\x67\x0d\xfa\x56\x87\xf6\x22\x89\xd6\xd8\xe1\x33" - "\xfc\x1b\xac\x8d\x76\xf6\x6a\x02\xf8\xac\x1c\xef\x83\x6d\xbf\xcf" - "\x5e\x1f\xdb\x31\x3e\x9b\xdc\x64\xbf\xcf\x5e\x9d\x6d\xe1\x33\x11" - "\x9e\xfc\xaa\xfc\x7d\xb0\xe9\x57\xbd\x79\x9e\xfc\x6a\x0c\xef\xb3" - "\x57\xf7\x12\x9f\x4d\xd6\x11\x9f\xdd\x0d\x68\x75\x68\x3f\x93\x57" - "\x25\xf7\xff\xb2\xc5\x1b\x4d\xf3\xf2\x79\xbf\x4d\x51\x76\x1d\xee" - "\xf8\x9b\x12\xfb\xfd\x36\xa5\x7f\xdb\xdc\x71\x8a\x8b\x7c\xbf\xfd" - "\xa6\x82\xe7\x8e\x53\x3c\x79\xbf\x4d\x89\x25\x7e\xfb\xcd\x5e\xe7" - "\xb8\xe3\x94\x36\xd7\xbf\x8a\x71\x47\x6b\xbf\x4d\xad\xe9\x3a\xfc" - "\x71\x6a\x82\xfd\x7e\x9b\x7a\xa6\x6d\xfe\x38\xf5\xa8\x7c\xbf\x4d" - "\x5d\xcb\xf3\xc7\xa9\xe5\xbc\xdf\x7e\xeb\x4b\xfc\x36\x35\xd6\x39" - "\xfe\x38\x55\x72\xff\x37\x5b\xfc\xd1\xda\x6f\xaf\xa9\xbb\x0e\x87" - "\x7c\x4d\x69\xbf\xdf\x5e\xdb\xd8\x36\x87\x7c\x6d\xb1\x7c\xbf\xbd" - "\x16\xca\x73\xc8\xd7\xd2\x79\xbf\xbd\x56\x4d\xfc\xf6\x9a\xaf\x73" - "\x1c\xf2\xb5\x02\x47\x38\xa4\xb5\xdf\xa6\x45\x74\x1d\x1e\x19\x53" - "\x63\xbf\xdf\xa6\x8d\x69\x9b\x47\x4e\x93\x7f\x66\x31\x1d\xd3\xc0" - "\xf3\xc8\x69\x21\xbc\xdf\xa6\x91\x33\x58\xe8\x98\x6a\xe7\x78\xe4" - "\xb4\x36\xf7\xff\x10\xe3\x91\xd6\x7e\x7b\x1d\x75\x1d\x2e\x39\x5d" - "\x06\xff\x9f\x6e\xc1\xff\xc5\xb8\xe4\x74\x07\xf8\xff\xf4\xfd\x3c" - "\x97\x9c\x6e\xc6\xff\x5f\xe7\xf8\xff\xf4\x0d\xce\x71\xc9\xd7\xed" - "\xe1\xff\x56\x5c\xd2\xda\x6f\x33\x4a\xbb\x0e\x9f\x9c\x11\x61\xbf" - "\xdf\x66\x1c\x6a\x9b\x4f\xce\x90\x7f\x0e\x14\x3d\x23\x8e\xe7\x93" - "\x33\xf6\xf2\x7e\x9b\xd1\x44\xfc\x36\x23\xcc\x39\x3e\x39\x43\x72" - "\xff\x47\x93\xdf\x0c\xde\x81\x11\x8c\xc8\x38\xe4\xe9\x84\x10\x6e" - "\x6f\xc2\x59\x1b\x0c\x3e\x81\x11\x72\xcf\x77\x31\xed\x39\x7d\x32" - "\x01\xa1\x4b\xf4\xac\x41\xce\xed\x3b\x3d\xf3\x8c\xf3\xfb\x4e\xcf" - "\xdc\xd9\x6e\xe7\xbb\xd0\x33\xd7\xc9\xdf\x77\x7a\x66\x34\xcf\x41" - "\x67\xe6\xf2\xbe\x9e\xc5\xce\x4f\x90\xb7\x1f\xf5\x4c\x6f\xe7\xf6" - "\xa3\x9e\xd5\x9f\xe0\xeb\x8d\xb3\x64\x3f\xea\x59\x9e\x9d\x72\xee" - "\x0b\xfd\x46\x3a\xde\x8f\x9a\xd9\xd4\x38\xc5\xb1\xfd\x91\x67\xe5" - "\xda\x81\xe7\x72\x46\x64\x8c\x96\xc7\xf3\x9c\x18\xc0\x73\xb9\xdc" - "\x73\x66\x84\x78\x9e\x7d\xd3\x39\x3c\xcf\xde\xed\x3c\x9e\x67\x2f" - "\x68\xb7\x73\x66\xe8\xd9\x53\xe5\xe3\x79\xb6\x92\xe7\xe6\xb3\xe3" - "\x78\x3c\xcf\xc9\x97\x8f\xe7\xd8\x5a\xe7\xf0\x3c\xfb\x2a\xc1\x73" - "\x6c\x31\xc1\xf3\x6c\x6d\xa7\x9c\x3f\x43\xc7\x46\x13\x3c\x37\x17" - "\x38\xb6\xff\xf4\x9c\xb8\xb6\xf1\x1c\x14\xc1\x88\x8c\x5f\xf3\x78" - "\x8e\x0f\x30\xf8\x04\x45\xc8\x3d\xef\x46\x88\xe7\xb8\xaf\x9c\xc3" - "\x73\xdc\x62\xe7\xf1\x1c\x37\xba\xdd\xce\xbb\xa1\xe3\x06\xcb\xc7" - "\xf3\x9b\x3a\x5e\xb3\xc4\x8d\xe0\xf1\x1c\x9f\x20\x1f\xcf\x6f\x1e" - "\x76\x0e\xcf\x71\x47\x09\x9e\xdf\x4c\x26\x78\x8e\x2b\xe9\x94\x73" - "\x70\xe8\x37\x95\x04\xcf\xad\xb5\x8e\xed\xef\x1d\x2f\xb9\xff\xb1" - "\x19\x9e\xcb\x19\x91\xb1\x7d\x1e\xcf\xf3\x9a\x00\xcf\xe5\x72\xcf" - "\xdd\x11\xe2\x79\x9e\x93\xe7\x5c\xcc\x6b\x87\x73\x2e\xe6\x39\x71" - "\xce\x85\xe5\xb9\x3b\x73\xef\xc8\xc7\xf3\x5c\x0d\xaf\xe5\xe6\x29" - "\x78\x3c\x27\x84\xc8\xc7\xf3\xdc\xb5\xce\xe1\x79\x1e\x77\xfe\xc5" - "\xdc\x70\x82\xe7\x79\xe9\x9d\x72\x1e\x0f\x1d\xaf\x23\x78\x36\xaa" - "\x1c\xdb\x3f\x3d\x41\xd1\x36\x9e\x55\x11\x8c\xc8\xef\x1e\x3c\x9e" - "\xdf\x2a\x37\xf8\xa8\x22\xe4\x9e\xff\x23\xc4\xf3\x5b\xb3\x9d\xc3" - "\xf3\x5b\x5e\xce\xe3\x79\xfe\xc5\xf6\x3b\xff\x67\xfe\x09\xf9\x78" - "\x9e\xaf\xe6\x35\xee\x7c\xb3\xdf\xff\xdf\x76\x95\x8f\xe7\xf9\x4e" - "\x9e\x0b\xf4\xd6\x34\x82\xe7\xf9\xdc\xb9\x40\x6f\x45\x77\xce\xb9" - "\x40\x09\xec\xb9\x40\x4c\x36\x4a\x76\x6c\x7f\xfa\xb7\xce\xda\x81" - "\xe7\x72\x46\xe4\x37\x21\x1e\xcf\x0b\xf2\x01\xcf\xe5\x72\xcf\x21" - "\x12\xe2\x79\xc1\x70\xe7\xf0\x9c\xf8\x83\xf3\x78\x4e\x3c\xd0\x7e" - "\xe7\x10\x25\xe6\xc9\xc7\x73\xa2\xe9\xf7\x3f\x88\xcf\x89\x66\xbf" - "\xff\x2d\x70\xe0\x7c\xa2\x44\x7f\xe7\xf0\xbc\x60\x08\xc1\xf3\xdb" - "\xb5\x04\xcf\x0b\x94\x9d\x73\x3e\xd1\xdb\x6a\x82\x67\xea\x98\x63" - "\xfb\xff\x2f\x68\x73\xfe\x87\xd8\xf8\x86\x69\x5c\x8a\xc7\x74\x52" - "\xa2\xf3\x63\x1c\x49\xdd\x9c\xc3\xf4\xa2\x23\xce\x63\x7a\x51\x46" - "\xfb\x8d\x71\x2c\x92\x7f\xd6\x1f\xbd\x68\x04\x3f\xc6\xb1\x28\x85" - "\xc7\x74\xd2\x7e\xf9\x98\x5e\xd8\xe4\x1c\xa6\x17\x19\x08\xa6\x17" - "\x96\x12\x4c\x2f\x6a\xe8\x9c\x31\x8e\x85\x71\xce\x8d\x71\x24\xa5" - "\x38\x32\xc6\x61\x8d\xe9\xa5\x61\xce\x8f\x73\x2c\x39\xef\x1c\xa6" - "\x97\x6c\x74\x1e\xd3\x4b\xa6\xb6\xdf\x38\xc7\x92\xd1\xf2\x31\xbd" - "\xc4\x95\x1f\xe7\x58\x32\x91\xc7\xf4\xd2\x74\xf9\x98\x5e\x5c\xe1" - "\x1c\xa6\x97\x9c\x21\x98\x5e\x9c\x45\x30\xbd\xa4\xbc\x73\xc6\x39" - "\x16\x87\x38\x37\xce\xb1\x74\xa2\x23\xe3\x1c\xd6\x98\x5e\xee\xed" - "\xfc\x58\xc7\xb2\x03\xce\x61\x7a\xd9\x1b\xce\x63\x7a\xd9\x90\xf6" - "\x1b\xeb\x58\xe6\x25\x1f\xd3\xc9\x17\xf8\xb1\x8e\x65\x4a\x1e\xd3" - "\xcb\xa7\xc8\xc7\x74\x72\x91\x73\x98\x5e\xb6\x87\x60\x3a\x39\x96" - "\x60\x7a\x59\x41\xe7\x8c\x75\x24\xbb\x39\x37\xd6\xb1\x5c\xe9\xc8" - "\x58\x87\x35\xa6\x53\xea\x9c\x1f\xef\x48\xc9\x70\x0e\xd3\x29\xc3" - "\x9d\xc7\xf4\x0a\x43\xfb\x8d\x77\xac\xb8\x2c\x1f\xd3\x2b\xcc\xce" - "\xbf\x58\x61\xb6\xfe\xff\x9d\x00\xf9\x98\x5e\x91\xec\x1c\xa6\x53" - "\xde\x21\x98\x5e\x31\x82\x60\x3a\x25\xa9\x73\xc6\x3b\x96\x6b\x9d" - "\x1b\xef\x48\x69\x73\xff\x0b\xb1\xf1\x0e\x6b\x4c\xaf\x3a\xe6\xfc" - "\x98\xc7\xaa\xa9\xce\x61\x7a\x55\x37\xe7\x31\xbd\xf2\x4c\xfb\x8d" - "\x79\xac\x3c\x2a\x1f\xd3\x2b\xd7\xf2\x63\x1e\x2b\xcd\xe6\x3f\xad" - "\xd2\xcb\xc7\xf4\xca\x08\xe7\x30\xbd\x2a\x92\x60\x7a\xa5\x2b\xc1" - "\xf4\xaa\xf0\xce\x19\xf3\x78\xe7\xb0\x73\x63\x1e\xab\xca\x1d\x19" - "\xf3\xb0\xc6\x74\xaa\xda\xf9\x71\x8f\xd4\x21\xce\x61\x7a\xcd\x79" - "\xe7\x31\xbd\x66\x4f\xfb\x8d\x7b\xac\xd9\x2c\x1f\xd3\x6b\x62\xf8" - "\x71\x8f\x35\x66\xfb\xdf\xa7\x56\xcb\xc7\xf4\x1a\x3f\xe7\x30\x9d" - "\x3a\x88\x60\x7a\xf5\x05\x82\xe9\x54\xdf\xce\x19\xf7\x58\xbd\xc1" - "\xb9\x71\x8f\x54\xab\xf9\x6f\x4b\xe3\x17\xc6\x29\x17\xcd\x9d\xbb" - "\x34\x3e\x59\xb9\x34\x71\xfe\x9b\xf1\xa3\x07\x9b\xbe\x8f\x0e\x4e" - "\x19\x9c\xd2\x0b\xc5\x2d\x98\x3d\x6b\xf9\x33\xfc\xcd\xc4\xf8\x85" - "\xf0\xa7\x17\x4a\x98\xbd\x34\x41\x99\xfc\x4e\x52\xbc\x12\x7f\x5b" - "\xf0\x66\x12\x24\x59\x94\xcc\x5f\x79\x35\x3e\x71\x76\xca\xfc\x85" - "\xf3\x94\xb3\x13\xe7\xcf\x5b\xb8\x20\x7e\x61\xb2\x72\x49\xfc\xe2" - "\x65\xf3\x97\xc4\xe3\xff\x97\x2a\xe7\x2e\x5a\x02\x17\xde\x8c\x9f" - "\xbf\x3c\x5e\x39\x67\xd9\xdc\xb9\xf1\x4b\x96\xf6\x42\x91\xcb\x12" - "\x93\xe7\x27\x25\xc6\x2b\xc3\x23\xc7\x0c\x9d\x32\xfe\x37\x53\x5e" - "\x7c\xb1\x17\x32\x3b\x7b\x5a\xc9\xe4\x46\x46\x03\x86\x14\x57\xe8" - "\x4d\x47\x2a\x7d\x11\xda\x0c\xd8\xdc\xb2\x04\x79\x6e\x5a\x82\x14" - "\x1b\x6f\x21\xd7\xcd\xb7\x90\x9b\xf1\x03\x5d\xb9\xf2\x2d\x14\xc6" - "\x78\xc5\x17\x6d\xb9\x85\xbc\x8d\x39\xbb\x94\x4c\xce\x4e\xad\xce" - "\x6b\x7d\x29\x4e\xcb\x78\xad\xab\xc1\xd7\xc1\x17\x0a\x26\xa7\x48" - "\x7d\x89\xde\x94\xac\xf3\x7a\x6f\x6f\xda\x55\x44\x31\xee\x69\xfa" - "\x83\x46\x1d\xf5\x15\x9e\x51\x0d\xb6\x42\x74\x86\x37\x7c\x10\x7c" - "\x4a\xe0\xa3\x41\x74\xa6\x1b\x7c\x46\xc0\x27\x14\x3e\x7b\xe1\x53" - "\x8f\xe8\x77\xfd\xe0\x13\x00\x1f\xb8\xf6\x6e\x34\x7c\x62\xe0\x53" - "\x06\x9f\x5a\xf8\x34\x20\x7a\xad\x1b\xc9\x67\x2d\xfe\xe4\xc2\xe7" - "\x18\x7c\xce\x22\x7a\xdd\x06\xf8\x40\x1e\xeb\x21\xbf\x75\x90\xf7" - "\xba\x0a\xf8\xe0\xeb\x3a\xb8\x86\xd3\xfa\x92\x7b\xeb\xb5\x88\x7e" - "\x0f\xde\xf1\x1e\xe4\xff\x1e\xe4\xfd\x5e\x16\x7c\x8a\xe0\xb3\x1f" - "\x3e\x87\xe1\x53\x03\x1f\x9c\x06\xde\xb5\x01\xee\x6d\x80\x77\x6c" - "\x28\x45\xf4\x46\x4f\xf8\x24\xc3\x07\xca\xb2\x29\x99\xfb\x40\x59" - "\x36\x45\x9b\x7d\x4f\x34\xfb\x5f\xec\x93\xe5\x91\xf1\x98\x56\x13" - "\xa8\x87\x76\x9b\xb1\x98\xc9\x44\x34\x93\xf3\xde\xde\xa4\x40\xe4" - "\x72\x8d\xce\x18\x5d\x05\x3d\x0d\xe3\xb9\x53\xab\x59\xd9\x82\xef" - "\x8f\xc6\x36\x6b\xcc\xce\x08\xd5\xa2\xb9\x7b\x71\xfb\x94\x87\xcf" - "\x8c\x50\xee\xf9\xd5\x5a\x17\x17\xb6\x7d\x33\x1f\x04\x56\x33\x69" - "\x31\x3b\xf0\x3a\x5c\xc8\xdf\x1b\xaf\xd3\x65\xd4\x81\x13\x19\x4f" - "\xff\x26\x1c\x63\x34\x2b\xd9\x72\xf9\x90\xf6\x08\xf7\xa1\x6c\x3a" - "\x2f\x5d\x39\xb4\x3f\x05\xfe\xce\x80\xcf\x99\xa2\x98\x10\x12\x77" - "\x32\x58\xfd\xd2\xe2\x33\x26\x1d\xdf\x6b\xde\x33\x20\x98\x29\x56" - "\x95\x6b\x16\xb6\xa0\x5a\x3a\xc3\x0b\xea\x46\x41\x0c\xa4\x98\x27" - "\x07\x04\x1b\xb7\x8e\x49\x3f\x0a\x38\xc0\xe9\xfe\x94\x5a\x87\xff" - "\x7a\xe2\xfb\x4c\xee\xd8\x08\x3c\x0e\xa4\x49\xfd\x08\xe2\x72\x86" - "\x4f\x8b\x4f\x8c\x52\xf9\xaa\x07\x03\xff\xef\x83\xb2\xb1\xe9\x4d" - "\x65\x69\xf1\xd2\x55\xe3\xfc\x19\x65\x8c\x16\xee\x29\x8c\x39\xeb" - "\x4b\xa1\x1c\x2e\x37\xe0\x39\x06\xca\xa8\x79\x15\xbf\x37\x73\x37" - "\x94\x95\x4a\x9b\x0c\x79\x7f\x14\xa3\xfd\x74\x65\x13\x85\xef\x19" - "\xd5\xba\x72\xc0\xbb\x1b\x93\x9d\x7a\x61\x7b\x5f\xa4\x28\xfc\x00" - "\xa1\x5d\x1f\x20\xd7\xc6\xec\xcc\x7c\xad\xc2\x33\x8b\xc4\xbe\x0c" - "\x6f\x0a\xd2\x68\xe9\xcc\x64\x06\xf0\xcb\xbe\xcb\x3b\x54\x63\xe3" - "\x5d\x97\xef\xbd\x6b\x6b\xa8\x06\xbf\x8b\xd8\x48\x57\x4e\xfe\x92" - "\x3c\x8c\xc5\x03\xb4\xd8\x7e\xd8\x76\xa6\x3c\x8c\x39\xf7\xf2\xe8" - "\x86\x9f\x87\x77\xd6\x30\x1f\x0f\xd0\x1a\xb7\x8e\xd3\xc2\xb3\x87" - "\xf1\x7d\x8f\x0c\xd4\xc0\xc0\x5f\xfc\x7e\xe2\x0b\xb0\x7d\x77\xc0" - "\x07\xf6\x07\x77\x8d\x81\x6b\x5a\xfa\x5d\xa5\x31\x53\x09\xb8\x09" - "\xca\x27\x7e\x7d\x77\xc1\x3b\xd5\x8c\x11\x3e\x86\xa7\xab\x91\x8b" - "\xe6\x55\xec\xd3\x77\xb3\x94\x93\x7a\x80\x5d\xdf\xdd\x7c\xcf\x9e" - "\x83\x62\x6a\xc0\x26\x9e\x85\x7d\xc1\x2e\x99\x2d\x7a\x36\x0f\xa8" - "\x8f\xb9\x7d\x70\x1d\x1a\xb3\xdf\x3d\x66\x61\x23\x4f\xb8\x56\xad" - "\x45\xad\x23\xf0\x35\xe5\xe3\x2c\x16\x7c\x18\xce\x5f\x18\xcf\xd8" - "\x77\xc6\xbc\xc8\x68\xfc\x7d\xea\x10\xe4\xe9\x51\x8d\x28\x65\xaa" - "\x7f\x29\xf1\xf1\xd8\x08\xa8\x6f\x2d\x7e\x17\x94\x5d\xc5\x6c\x1d" - "\x96\x6f\xc8\x84\x3e\xf4\x1e\xae\xd6\x4e\x34\xe4\x04\xa9\x5b\x7c" - "\xc6\xa1\xe6\xbc\x17\x34\x8c\x3a\x48\x8d\xd7\x95\x5f\xa2\xd7\xb2" - "\x6b\xed\x98\x4c\x57\x44\xde\x13\x94\x9b\x9a\xc8\xe8\x52\x6f\x82" - "\xfd\xfb\x8d\x43\x7f\x5a\xae\x03\x3f\xbc\xa0\xc1\x7e\x3e\x7a\xb7" - "\x89\xc2\x7b\xfd\x31\xee\xa9\xc6\x5d\x50\x9f\x9d\x50\x17\xa8\x27" - "\xc2\xf9\x36\x66\xaf\xcd\xe2\xeb\xb3\x36\x18\xfb\x1c\xde\xb1\x97" - "\xc3\xb4\x37\x94\xcb\x85\xf1\x0a\x82\x7a\xaf\x3d\xac\x75\xf9\x38" - "\xd9\x54\x6f\xf6\xdd\x7c\x3a\xae\x8d\xac\x85\xf6\x11\xb4\xb7\x75" - "\x39\x53\xbd\xe5\x3b\xc8\x3f\x13\x31\x2d\x77\x99\x8a\xd5\xd1\x4c" - "\x53\xf6\x6f\xf1\xfc\xc5\x0b\x28\x6d\x36\xf2\xeb\x9d\xc1\xe8\xa2" - "\x0c\xc8\xa3\xf7\x05\x0f\xe6\x74\xf4\x05\xf6\xcc\x83\xd5\xd5\x4c" - "\x5d\x65\xd2\x31\xb4\xfa\x32\x72\x5b\x33\x1f\x79\xa7\x45\x43\x5d" - "\x2a\x98\xa6\xaa\x94\x0b\xa8\xb2\x01\x3e\x49\xa7\x21\xdd\x39\xf8" - "\x1c\x43\x69\xef\x20\xc5\x24\xe8\xcf\x52\xef\x20\xb7\xca\xa4\x3b" - "\x70\xed\x3a\x5a\x1d\xcb\xe8\x4f\x57\xe0\x74\x27\x50\x94\x5e\xe7" - "\xb1\xe6\x3a\x52\xec\xfa\x2d\x5e\xab\x7d\x11\x15\x42\x59\x5a\xbc" - "\x76\x79\x36\xe7\x14\xe5\xdf\x5e\xce\xe8\x1b\xb3\xd7\xa5\x6b\xd1" - "\xc8\x24\x41\x5d\x70\x99\x5b\x10\x02\x5f\xb9\xe0\x34\xc6\xbc\xe7" - "\x8b\x66\xe9\x71\xdc\x58\x97\x0c\x7c\x02\x99\xee\xe3\x7b\x3a\x9f" - "\xe7\x8b\xe0\x7a\x51\x94\x9e\x69\x04\x3f\xb3\xf5\x06\xfb\x17\x73" - "\xf5\x2f\xa6\x93\x90\x02\xde\x51\xab\x75\xd9\x17\x8d\xdf\x01\x79" - "\x76\x87\xf7\x14\x61\x6c\x90\x7b\xeb\x91\xd6\xe5\xf7\xf9\x3c\x5e" - "\x58\xff\x77\x37\x95\x05\xee\x2b\xb5\x2e\x7b\x8b\xcc\xf0\x84\xe3" - "\xc3\xbd\xfb\x5c\x3f\x85\xaf\x63\x6c\xd1\x10\xaf\x2a\x0c\x3e\x63" - "\xa3\x19\xaf\x9b\xb1\xcc\x6d\x5f\x37\x86\x62\x9a\x26\xe9\x99\x26" - "\x63\xde\x50\xdc\x47\xb9\x55\xe9\x1b\x10\x49\xbf\xfe\x04\x93\x73" - "\x33\x81\xcc\x0d\x5d\x7f\x00\xe7\x09\x9c\x05\x65\xdf\x42\x9e\x51" - "\xd5\x4c\x13\x6e\x97\xc6\x9c\x66\x6d\xf6\x12\xe4\xcd\xe4\x8d\x0d" - "\x33\xfa\x8c\x8e\x6e\xde\x1d\x13\x8c\x63\x27\xe3\x13\x19\xcd\xa8" - "\xe1\x59\x2e\x1f\x78\x6f\x37\x2d\xbd\x7e\xad\x11\x9e\x67\x72\x87" - "\x16\x71\xe5\x61\xe3\x1c\x89\x8f\xeb\xd7\x32\x83\xe1\x9e\xda\xbf" - "\x1a\xee\x75\xbb\x44\xbf\xe7\x09\xd7\xe1\xfb\x60\x57\x4d\xea\x2d" - "\x48\xfb\x9e\x0f\xc1\x90\x7f\x85\xe0\x3b\x85\xed\xf9\x6e\x30\x6e" - "\xd7\x84\x5f\xbe\x37\x92\x6f\xb7\xa6\x76\x02\xed\xd5\x67\x68\x49" - "\x63\xf6\x7b\x11\x5a\x17\x45\x2c\x1b\xcb\xe1\xb9\x06\x36\xd6\xbc" - "\x1b\x0e\x5c\x2c\xe4\xeb\x68\x84\xbe\xae\x40\x08\xd2\x24\x6a\x5d" - "\xba\x6f\xe0\x6d\xf9\xde\x3a\x9c\x96\x6d\x93\xd0\x36\xc9\xfb\x00" - "\xe7\xf0\x0c\xb3\x75\xac\x0e\xc7\x17\x1c\x67\xb4\xf4\x7b\xe9\x38" - "\xc6\x40\xfb\x8c\xe1\xe2\x79\x29\xdb\x3e\x3f\x98\x59\x03\xe5\x4a" - "\xbf\xc4\x95\xc5\xbc\x6c\xa6\x58\xc2\xe4\xcc\x8a\x21\x69\x83\x70" - "\x19\xeb\xb5\x2e\x3d\x62\xcd\xb1\x46\xea\xb5\x61\xf6\xd3\x15\xf0" - "\x3f\xf0\x0d\x53\x5e\xd0\x56\x5d\x99\xec\xb4\x7e\x18\x83\x38\xe6" - "\x6c\xfb\x00\xfb\x63\x56\x6c\x73\xce\xac\x84\xc6\xec\x0d\x23\x4c" - "\xed\xd4\xb8\x9c\xc1\x1c\x03\x19\xef\x32\x67\xb7\x80\x2f\xa3\x0c" - "\x34\x33\xcb\xa0\x42\xc0\x47\xf5\x85\x70\xbd\x70\x39\xe6\x73\xeb" - "\x92\xa0\x2d\xbb\x8a\xa7\x55\x20\x9c\x8e\x4d\xcf\xa5\x6d\xf1\x9a" - "\x15\xcb\x96\x39\x93\x36\x42\xf9\x5c\x4c\x65\x6a\xf1\x0a\x2a\x80" - "\x77\x97\x68\xd1\x9d\x29\x82\xf6\xf2\xc1\x13\x3a\x86\x89\xc1\xb8" - "\xa2\xa1\x2e\xe7\xe0\x6f\x0f\x0e\xa7\xbd\xbf\x06\xbe\x1a\x0e\xca" - "\xec\x36\xf8\x7b\x7b\x3f\x46\x07\xcf\xeb\xb4\x68\x5a\x2d\x7e\x7e" - "\x13\x7c\xc7\xd7\x71\x9a\xc6\xec\x8d\xae\x5a\x34\xfd\x2c\xc9\xf7" - "\xdd\x60\xec\x3f\x61\xbe\x1b\x87\x92\x7c\xd9\xb2\xf4\xc6\x79\xe2" - "\xe7\x70\x9e\x3b\xb7\x32\xf5\x38\x1f\xc8\x63\xa2\x29\xef\xcd\x70" - "\xcd\x94\x7f\xf8\x82\x7b\xef\x48\x84\x77\xcc\x30\x2f\xfb\xb6\xad" - "\x4c\x03\x29\xd7\xc6\x0d\x5a\x34\x7b\x3f\xbe\xb7\x11\xae\xe1\x67" - "\xcd\xda\x1b\xcd\x63\x68\x23\xd4\x3f\x56\x10\xdf\xc1\x47\x7d\x4c" - "\x9c\x80\xcb\xeb\xac\x29\x2f\xcb\x7c\x18\x75\x6c\x98\x59\x7b\x75" - "\xc3\xf9\x36\x66\x6f\x52\x68\xd1\x8c\x14\xae\x5c\x87\x1b\x08\xde" - "\xc1\xee\x9b\x86\x60\xbb\xe3\xbe\xc6\x98\xc9\xf1\x8e\xdd\x31\x21" - "\x1c\x36\xfc\x4d\xfd\x11\xf8\x25\x1f\xf2\x88\xe0\x63\xf7\x26\x3f" - "\xec\x6f\xb8\xbe\x81\xcb\x3f\x0e\x7c\xe6\x6d\x5e\x6f\xb0\x71\x18" - "\xd3\x6f\x6c\x12\x8e\x59\x5c\x79\x46\xe3\xfe\xc9\x74\x1f\xde\xa1" - "\x30\x66\xa7\x3d\x87\xdb\x04\xf4\x77\x88\xf1\x79\x21\x18\xf2\xd9" - "\x6f\xd1\xdf\x29\xb8\x74\x6f\xe3\x34\x1f\xf6\x63\xea\x20\x4d\xb5" - "\x29\x0d\xbe\x0f\xf6\xff\x35\x5c\xab\xd5\xa2\x78\xf6\xfd\xd9\x90" - "\x46\x4b\xa7\x49\xae\x8f\x01\xc5\x43\x55\x15\x68\xb1\x76\xc4\xed" - "\x3f\xb4\xca\xaf\x01\x55\x15\x18\x91\xf1\xe3\x5f\xc6\x86\xa5\x32" - "\x9a\x2b\xf4\xfb\xb3\x2b\x9b\xea\x90\x3c\xbe\xf7\x3e\xbb\xfe\x8d" - "\x69\x01\x8d\xb3\xfa\x19\x84\xb9\xc0\x0d\x3a\x2b\xa7\x4a\x77\x8b" - "\x8d\x85\xf0\xff\x1a\x7c\xff\x43\xd0\x44\x58\x17\x81\xf6\x4d\x50" - "\x53\x44\x1b\x19\x21\xed\x2e\x7c\x1d\xeb\x26\xd0\x6c\x85\x66\xf7" - "\x98\x8f\xfb\x6b\x89\xed\xb2\x26\x60\x3b\xb2\xe5\xd5\xbf\xac\xc1" - "\x65\x36\x16\xf7\xd7\xe2\x3a\xa4\xa5\x30\xc6\x2a\x7d\xa3\xa6\xb2" - "\xc1\x80\x94\xcb\xb1\xa6\xcb\x1a\x1c\xb5\x13\x31\xc6\x3d\xfd\xb5" - "\x32\xeb\xc0\xce\xff\x03\xdd\x7b\x43\x37\xb8\xbf\x36\xcd\x80\xa8" - "\x2d\xa9\xdd\x5c\xc7\x15\x30\x9a\xdb\x4f\xfe\x32\xb6\x31\x3b\x2b" - "\xe2\xab\x14\x84\xe4\x73\xe1\xac\x08\x53\xdd\x77\x71\x75\x87\x77" - "\xb1\xeb\x45\x9f\xce\x4f\x67\xeb\x0b\x69\xd2\xa5\xfc\xc5\x64\x7a" - "\x30\x5f\x17\xe8\xd1\xd2\x02\xa6\x65\xe9\x4e\x44\x19\xb6\x3e\xad" - "\xfc\x74\x57\x0d\x8e\xfb\x61\x26\x7b\xb2\xb6\x03\xbd\x9f\x94\x8a" - "\x3c\xae\xd1\x9b\x87\x44\xad\x46\xec\x19\x49\x5f\x42\x3a\x99\x65" - "\x65\xc7\xff\x2a\x41\x47\x47\x19\x18\x23\xe9\xbb\x36\x4f\x9e\xc4" - "\xe5\x87\xef\x99\xfc\xb7\x8b\xd3\xb7\xf2\xdf\xb1\x59\x72\xfd\xbf" - "\x8d\xba\x7a\x8a\xd7\x35\xdb\xc7\xf1\xba\x6e\xd6\x5a\xd7\x35\x7b" - "\x74\xfb\xd6\x35\x3b\xdc\x81\xba\x2a\xc5\xeb\xba\xc5\xc5\xf1\xba" - "\x66\x57\x58\xd7\x75\xcb\x90\xf6\xad\xeb\x16\xc9\xfd\x9f\x6c\xd4" - "\x35\x58\xa2\xae\xd7\x1d\xaf\xeb\x96\x52\xeb\xba\xaa\x7d\xda\xb7" - "\xae\x6a\xc9\xf3\x4f\x19\xca\x83\xc1\xf1\x09\xe2\x52\x4b\x6a\x33" - "\x70\xbe\xad\xe1\xba\x35\xbb\x11\x55\xd1\xd0\x84\x2a\xfd\x6a\x30" - "\x9f\xa6\x86\x25\xb1\x9c\x28\x94\xf9\x40\xa7\xad\x2c\xa8\x87\xeb" - "\x57\xd0\xe9\x94\x26\x14\xb6\x04\xc7\x5f\xf5\x0f\x55\x71\x72\xe3" - "\xaf\x7a\xff\xbd\xf8\xab\x7f\x86\x8b\xb9\x1f\xf4\xa9\xac\x6f\x41" - "\xb8\xfe\x37\xe8\x9c\xe6\x7b\xf1\x37\x93\xd8\xdb\x32\xfe\x62\x7b" - "\x54\x35\x35\x09\xe2\x2f\x59\x27\x95\x73\xc2\x32\xf6\x66\x5f\x43" - "\x48\x3c\xf6\xe6\xec\xc6\xb1\x77\x17\xdc\x97\x57\xfe\x9c\x44\x53" - "\xec\x55\xc3\x3b\xcd\x63\xef\xd7\x71\xb8\x7f\xcd\x29\x73\x2c\xf6" - "\xe6\x94\x99\xea\xbd\x93\xab\x37\x5c\x0b\x10\xc6\xde\x1c\xc9\xb3" - "\x2e\xcd\x71\xcb\x6c\x0d\x44\x9f\x0e\x6c\xea\x66\x2c\xf6\x53\xe2" - "\xfe\xad\x11\x6c\xf2\xc7\x5d\x4d\x8a\x2b\xf4\x07\xab\xd9\xf1\xcc" - "\xc6\x38\x17\xa6\x78\x40\x79\x54\x32\xf3\x3d\x33\xd8\x4f\x89\xc7" - "\x2a\xb1\xe6\x86\xfb\x87\x80\xf7\x97\xcb\x2b\x37\xc9\x13\xfa\xbf" - "\xd8\x54\x68\x2f\x9f\x2e\x6f\xa2\x8c\xab\x62\x3c\xc0\x0f\x9e\x4c" - "\xde\xb0\x30\x66\x7d\xcf\x9a\xdb\x79\xe3\x4a\x4e\x04\x5c\x46\x38" - "\x2d\x93\xa1\x08\x75\xbc\xfc\x1f\x86\xda\x2e\xff\x87\x8b\xe5\x97" - "\x9f\xe4\x69\x5f\xf9\x3f\x0c\xb5\xab\xfc\xfd\xa0\xfc\x2d\x21\xdd" - "\x40\x27\x52\x5f\xb6\x84\x28\x64\x96\x47\xf2\xfc\xbb\xf6\x7b\x47" - "\xae\xdd\xf1\x8f\xe9\xf7\x42\xd8\xa7\xbb\x74\x14\xc4\x00\xb6\x0f" - "\xc7\x6d\x8f\xc4\xbf\x3a\xd0\xd3\xdf\x33\x24\x26\xe9\x64\xc6\xa4" - "\xdc\x12\xfb\xdf\xff\x74\x51\xfb\xbf\x3f\x4f\xba\xfe\x96\x31\xf1" - "\xe0\xd0\x30\xc9\x98\xb8\x75\x58\x91\x75\x4c\xcc\xbb\x23\x3f\x26" - "\xe6\x69\xac\x63\xe2\xef\x06\xf1\x31\xf1\x77\x7d\x1c\x8f\x89\x5b" - "\xcf\xdb\x1f\x13\xb7\x1e\x71\x2c\x26\x6e\x4d\xb7\x1d\x13\xb7\xd6" - "\x38\x16\x13\xb7\xd6\x58\xc7\xc4\xad\xa1\xc2\x98\xf8\x3b\x4f\x49" - "\x5f\xaa\x1f\x29\x85\x3e\xda\xed\x1a\xfd\x3b\xad\x3e\x13\xb4\xae" - "\xfa\xfd\x72\xe8\x67\x1b\x99\x9c\x47\x4a\x8d\xd4\x08\x1c\x57\xc2" - "\x1a\x1b\x13\x5c\x8d\x2b\x02\xdc\x98\xbe\xfe\xa9\x4c\xab\x2f\x1e" - "\xdb\xf3\x87\xf2\x7b\x30\x8d\x01\xee\xcc\x8a\x80\xbe\x05\x77\x91" - "\x37\x7c\x7c\x0b\xb8\xfe\x18\xfe\x0f\x66\x56\xf8\xf6\xca\x5e\x8e" - "\x54\x1e\x0d\xc8\x15\xca\x10\xe3\x91\xe1\x89\x20\x06\x79\xe3\xff" - "\x99\xcc\x6d\xa8\xf0\x2e\x52\x78\xa4\x80\x6f\xbc\xe0\x7d\x29\x1e" - "\x0c\xb3\x34\x00\x15\x2e\x01\xcd\x4d\x21\xdf\x5d\x14\x53\xa2\x6f" - "\x0c\xa0\x0c\xde\x63\x63\x89\x7f\xf2\x73\x59\xed\x95\x3b\x56\x65" - "\xec\x37\xd6\xdb\x90\x96\x40\x33\xab\x62\x68\x5c\x56\x43\xee\x58" - "\x4f\x66\x2b\x7c\xd2\x12\xdc\x31\x87\x06\x4d\x1e\xcc\x34\xfa\xf6" - "\x02\xbd\xae\xda\xb5\x1c\xf9\xef\xbc\x8b\x02\x98\xdb\x01\x14\xf8" - "\x3f\x06\x9f\x35\x0a\x36\x8a\x31\x52\xdb\x10\xdc\x53\xe0\x98\xc8" - "\xe0\xf7\xeb\xe1\xfd\xad\xf0\xfe\x16\x8c\x6d\xe4\x5b\x08\xef\x37" - "\xac\x08\x90\xd9\x5e\xf2\x63\x59\x7c\x72\xe5\x32\xaa\x46\x86\x31" - "\x07\xe1\x83\xcb\x05\x36\x2c\xc4\x36\x19\x36\x32\x1c\x97\x6d\xf3" - "\x5d\xa4\x82\x72\xfa\x43\x19\x02\xe0\xbd\x78\x9f\x96\x98\x99\x8b" - "\x3d\x31\x46\x05\x65\x33\xe4\x70\x65\xfb\x19\xca\x76\x83\x2f\x1b" - "\x7e\x17\xb6\x8f\xd4\x6f\xa0\x51\x6b\x06\xe2\xb6\xf9\xa3\x47\x4a" - "\x8f\x08\xfc\x7b\xe8\xed\x55\x09\x32\xb1\xba\x4d\x72\xff\x93\x2d" - "\x07\x91\x1f\xe3\xb9\xae\x7c\xd2\xba\xef\x99\x28\xe8\x69\xd7\x1d" - "\x44\xaa\x2a\x68\xd7\x95\x4d\xd7\x11\xe3\xb5\xae\xfc\x44\x40\xbd" - "\xdc\x77\xe5\x4b\xbd\x6b\x53\x26\x53\xdd\xea\x8f\xc7\xc8\xc6\xed" - "\xdd\x42\x31\x29\x2d\xfe\x03\xaa\x4f\x9d\x6d\x41\xb3\x52\xf0\x6f" - "\xae\x4c\x8a\x72\x3a\x72\xbd\x44\x17\x4d\x4c\x3b\x8f\x7f\x1f\xda" - "\xee\x27\xfc\x7d\x68\x7b\x18\xa2\x77\xd4\x22\x7a\xa7\x37\xa2\x77" - "\x15\x20\x48\x27\xfc\x14\x9e\x8d\xda\x37\x10\xa5\xea\x99\x1f\x19" - "\xf5\x2d\xdf\x6c\x8a\x69\x8a\x1a\xe2\xa2\xd5\x2c\xc7\xbf\x97\xec" - "\xb8\x08\xf6\xfb\x09\xfa\x55\x0f\xfc\x3f\xce\x2f\x69\x09\x7a\xe4" - "\x1a\xbd\xe3\x82\x47\x43\x8f\x08\xbd\xf7\xb8\x6a\x3d\x13\x83\x5a" - "\x95\x31\xc1\xcd\xb9\x63\xc3\x5a\xf1\x18\xde\x1c\x1c\x83\xb6\x9f" - "\xf3\x70\x49\x47\x0c\xf8\x9f\x61\x7c\xf1\x6f\x86\x31\x05\xf0\xc1" - "\xbe\x64\xfd\xd8\x37\xd0\x15\xfb\x1b\xb7\x85\x42\x72\xdd\x13\xb7" - "\x87\x2d\x5c\xbb\xd1\xd1\x81\xb1\x06\x0a\x21\x03\x3c\x9f\x76\x19" - "\xf9\xe1\x33\x66\x77\x42\xba\x59\x06\x57\xdc\x8e\x63\x34\xd3\xbf" - "\x45\x57\x92\x10\x95\x76\x13\xf5\x01\x4c\xb0\xed\xd1\x08\xed\x31" - "\xea\x82\x47\x13\xc4\x15\x63\xea\x1d\xe4\x81\xe3\x14\x3e\xaf\xa5" - "\xaa\x5e\x8b\x8c\x3f\x07\xb8\xef\x58\x88\xbc\xf5\x3f\x27\xf4\xd5" - "\xfd\x9c\xf0\xc8\x36\x23\xf2\x76\x4f\x42\x9e\x3b\x17\x02\x16\x17" - "\x41\xfb\xbc\x01\xed\xb3\x9e\xb4\x4f\x13\xfe\x98\x4d\x7f\xf1\xc3" - "\xeb\xe8\xd9\xb6\x99\xc3\xb5\xcd\x15\x01\x78\x5c\xec\x1e\xfe\xf4" - "\x8b\x02\xa8\x9d\x14\x83\xa0\x8c\x60\xf7\x6d\x6e\x85\xa9\x3d\x5c" - "\xf1\x38\x26\xf3\xa4\x1f\xfe\x8d\x03\xea\xca\xe8\x3f\x05\x5f\x74" - "\x1b\x42\x29\x99\xbc\x71\xd5\xa7\xa2\xeb\x10\x3f\x6e\x52\x14\xd9" - "\x32\x78\x40\xb5\xf2\x55\xe6\xe7\x4b\xf4\x8e\xb3\x70\xdd\x55\xf9" - "\xdb\xa7\x3c\xc1\x8f\xdc\x7c\x84\xa2\x89\x78\x5c\x55\x4b\xef\xc0" - "\x63\x38\x08\xff\x0e\xff\x0d\xfb\x1b\xd7\x4e\x37\x48\x8b\x0c\x60" - "\x73\xbd\xe7\xcd\x04\xa3\xf7\xd8\x24\xcd\x5b\x2d\x6c\xbc\x6a\x05" - "\x1f\x5c\x49\x44\xd4\xac\x7a\xb0\x8d\x01\x6c\xd3\x18\xe0\x06\x71" - "\x2b\x1a\xc7\x2d\x46\xed\x9f\xb2\x5a\xcb\x18\xa3\xe2\x68\x06\xec" - "\xe2\x5a\x95\x62\x40\x33\x93\x10\xb3\xe6\x3a\xd8\xa8\xa1\x06\x41" - "\xdd\xdc\x21\xb6\xf5\xdd\xb9\x1c\x79\xef\x00\xfb\xf4\xa9\x07\x4e" - "\xf3\xc1\x7b\x9a\x83\xa9\xe5\xdd\x0c\x80\x73\x1c\xc7\x3c\x32\x5c" - "\x7a\x82\xaf\xdc\xb3\x70\xbb\x85\x76\xec\x91\xc1\xc6\x55\xd6\xb7" - "\xfa\x15\x01\x8f\xb7\xae\x08\x50\xc2\x67\xa0\x29\xd6\x99\xe2\x0c" - "\x93\xbd\x2d\x19\xc7\xb9\xaa\x14\x2d\xd2\x83\x2d\xdd\x71\x9f\xb8" - "\x22\xc0\x8f\xb5\xe9\x3c\xb0\xe9\x5c\xe4\xfa\x74\x13\x72\x81\x72" - "\x79\x42\x99\xd1\xe9\x84\x4b\x38\xb6\xfa\x1a\xa0\x1d\x61\x3b\x43" - "\x9e\x14\x03\x58\x33\xaa\x6f\x26\x44\xce\x57\xa2\x13\x01\xe7\x10" - "\xde\xab\x35\xad\x99\xf9\x01\xff\xc6\x56\x95\xa2\x47\x8c\xcf\xb8" - "\x6a\x32\x8e\xbe\x63\xff\xa9\xe8\x26\x24\x8d\xe9\x5d\x79\x3c\xa6" - "\x77\xe5\xf1\x98\xde\xc5\xae\xc1\x36\xc7\x75\x73\x11\xe0\xda\xdb" - "\x1c\xd7\x3b\x0f\x74\x28\xae\x27\xc9\xc7\xf5\xb6\x1b\x66\xb8\x4e" - "\xfd\xef\xe0\xfa\x9b\x18\x16\xd7\x74\xeb\x60\x16\xaf\x25\x55\xfa" - "\xcf\xe0\xef\xae\x74\x13\x6e\x4f\x7e\x82\x71\x5b\x58\xd6\x55\x71" - "\xdb\xdc\x18\xa0\x84\x4f\xbb\xe3\x16\xf2\xb4\x1b\xb7\xdf\xc4\xb4" - "\x20\x93\xfd\x30\x7e\x19\xf5\xba\x72\x65\x1a\x7a\x11\xe2\xc4\x44" - "\x8f\x8c\x81\xe8\x34\x6b\xc3\xa2\x89\xca\xdf\x32\xc6\x4b\x74\x21" - "\xbb\x06\xa0\x25\x93\x61\x8c\xde\xa3\xa3\xd3\xce\x20\x4f\xa3\xba" - "\x59\x5b\xa5\x3f\x80\x3c\x92\xc8\x6f\x0f\x8c\x57\x91\x1a\x74\x78" - "\x39\xf9\x3d\x66\x5d\x8d\x21\xe7\xbd\xbd\x06\x88\x27\x86\xbc\xc8" - "\x68\x63\x4e\x7c\x91\xd1\x6b\xa7\x96\xc1\xf3\x0e\xbc\xd6\x97\x36" - "\x66\x17\x4d\x34\xfd\x1e\x2e\xca\x8d\xbc\x23\xa3\xa1\xbd\x80\xa6" - "\xda\x7d\x02\xfe\x52\x50\x8e\xcb\xf0\x97\x86\xbf\x47\x58\x8d\x25" - "\xab\x9f\x2b\x22\x63\xa0\xb9\xe3\x6a\xb9\x38\x98\xc1\xb6\xc1\x40" - "\xd4\xe7\x1a\xf7\x3f\x94\xe7\x82\xe9\xf7\xf5\x7b\xe9\x79\x7b\xa4" - "\xe0\x77\x83\x4d\x14\xe4\x37\x7f\xf2\x1d\xcf\xa7\xe1\xf2\x63\xbf" - "\x1b\xfd\x55\xe5\x9a\xd4\x4b\xa8\x9e\xde\x1d\x51\x05\x7d\xbf\x71" - "\xeb\xb8\xda\x2d\x77\x01\x8f\x29\xf7\xe2\x6f\x86\x3b\xf8\x5b\xb3" - "\x92\x4d\xc3\xae\x13\x32\xe6\x3e\x5f\xc2\x7c\x70\x53\x8b\x35\x64" - "\x23\x93\xf0\x6b\xee\xef\x68\x8c\x6d\x32\xde\xb2\x3b\x8f\x01\xfb" - "\xe1\x33\xd6\xef\xcd\x31\xc2\x67\x9f\xa7\x2b\xfc\xbe\x5a\x4d\xfa" - "\x5b\x53\x79\xf1\xf9\xe8\x78\x0e\xcf\x53\xe9\x28\xbd\x51\xe4\x7c" - "\x74\x7e\xae\xcf\xee\x74\x63\xde\xf3\x25\x8d\xd9\xbb\xab\x81\x03" - "\xd4\x98\xd7\x59\xcc\x17\x90\xbe\x5e\xea\x9e\x3c\x3f\x7c\xe4\x2a" - "\x95\xcf\xf8\x00\x03\x23\x33\x2f\xc9\xfd\x8f\x18\xff\xfe\xb1\x51" - "\x7b\x0d\x1a\x63\x6b\x8c\xc7\x89\xd5\xd7\x65\x72\xa2\x8f\xf6\x4b" - "\xe5\x6b\xc8\x1d\x9d\xa4\x7f\x12\xf2\x1e\x32\x10\x19\x16\xc5\xbc" - "\x0c\x3e\x72\xc3\x5c\x6f\xcd\x7c\x32\x2f\xac\x62\xaf\x1e\x61\xde" - "\xb7\x6f\x61\x39\xd5\xd2\x1a\x83\xdc\x75\xc8\x73\xd2\x1d\xc6\xb8" - "\xe5\x06\xf2\x67\x56\xc4\x78\x64\xdd\x40\xa1\xad\xb7\x7d\x7b\xbd" - "\xbf\x04\x29\x5a\x20\x26\xb7\x2c\x4d\xf0\xc0\x73\xd0\xfe\x7c\x4d" - "\x43\x55\xe9\x4b\x31\xcf\xf4\xc7\xfd\x00\x2e\xbb\xe1\x76\x8c\xfb" - "\xc6\x5b\x88\xfd\x8d\x59\x33\xe7\x23\xe8\x07\xfe\xe7\x68\xb7\x35" - "\x10\xfb\x20\x76\xb1\xfd\x81\x03\x7d\x41\x0b\xf4\x05\x91\x31\x4c" - "\x53\x65\xcd\xb7\x28\xed\x3a\xf2\x4c\x5b\x86\xfa\xe0\xfc\xab\xf4" - "\xc7\x49\xff\x30\x15\xfa\x07\xf8\x0e\x5a\xe2\x5e\xff\xa0\x9c\x84" - "\xac\xfa\x07\xac\x43\x2a\x2f\xd4\x21\xc0\x72\x8f\x49\x0d\x1e\x4d" - "\xa9\x0d\x8c\x11\x6b\x12\xfc\x7b\x36\xa4\x71\x37\xf5\x15\xb8\x9f" - "\x68\xe1\xfa\x89\x9d\x5c\x3f\xb1\xbd\x1d\xfa\x89\xed\xb8\x9f\x38" - "\x87\xa8\x6d\xb8\x8f\x80\xfe\xe1\x7f\xff\xad\xa3\x5a\xa1\x4f\x90" - "\xe7\xe7\x62\xc9\xfd\x4f\x98\xad\xe3\x3e\x37\x42\x5f\x8c\xfd\xbc" - "\x0a\xfc\x8b\xfd\x5c\x15\x00\xbe\xad\xe9\x11\xd1\x0c\xd7\xf5\x5b" - "\x03\x95\x7b\xaf\xe8\x28\x26\x77\x58\x58\x33\xe0\x61\xe5\x1d\x44" - "\xe9\xbd\x47\x27\x1d\xf8\xad\x9a\xc2\xba\xd5\x98\x17\x18\x47\x34" - "\xf2\xef\x7b\xe2\x31\x1a\x8f\x3a\xe4\x89\xc7\x4f\x0d\x4c\x8c\x87" - "\xf1\xa7\x98\x3e\xc6\xb7\x7d\x5d\x5b\x7f\xf2\xed\xb5\xe9\x2d\xa4" - "\xd0\xbd\x9d\xe0\x91\x36\x0d\x79\x7e\xf9\x0f\x35\x55\xd9\x00\x6d" - "\xbb\xfb\xe7\xf5\x0c\xe4\x5f\x78\x09\x85\x14\xce\x41\x23\x76\x5d" - "\x41\xca\x5d\x73\x91\x6a\xc7\x15\xc0\xd0\xdb\x31\xee\xad\x2c\x3e" - "\x9a\x35\xec\xfc\x80\xb9\x28\x8c\xe9\x37\x54\x09\x7f\x43\xd4\x73" - "\x41\xcf\xf4\x0b\x54\x32\x3e\xa3\x93\x8c\x90\x2e\x0b\xb4\x1b\x70" - "\x74\x28\xc3\x9e\x9b\x62\xb8\xd9\x21\x93\x43\x40\x04\x6a\xaa\xac" - "\x06\xdc\xdc\x14\xe2\x06\xeb\x56\x16\x3b\x91\x04\x3b\xf8\x37\xc0" - "\x42\x73\x7e\x31\xe7\x94\xc3\xf8\x29\x00\xfe\xdc\x6c\x81\x9f\x82" - "\x1b\xce\xe1\xa7\x15\xf0\x53\x90\x09\xf8\x39\x8d\xa8\x7c\xa3\x33" - "\xf8\xf9\x98\x5d\xff\x8b\xc7\xf9\xc8\x7c\xa0\x3d\xc3\xb1\x9f\xb5" - "\xf4\x9e\xe0\xa9\x01\x2e\xc8\x41\x5c\x15\xb5\x81\xab\x5a\x82\xab" - "\x7d\xb3\xe5\xe3\xea\x70\x38\xe0\xaa\xc8\x36\xae\xee\x48\xe1\xaa" - "\xc8\x1a\x57\x7b\x27\x74\x2e\xae\xd8\xbd\x39\xff\x0f\xe0\x6a\x9f" - "\x4a\x88\xab\xdf\x6f\x24\xb8\xfa\xfd\x06\xc7\x71\x15\xd4\x46\xbc" - "\x0a\xe2\xe2\xd5\xff\x1e\x75\x00\x57\x05\x0c\xe4\x6f\x1b\x57\xd7" - "\x25\x70\x15\x24\x12\xaf\x3e\xd9\xdd\xb9\xb8\x62\xf7\x0e\xfd\x3f" - "\x80\xab\xff\x5d\x2b\xc4\xd5\xbe\x1f\x08\xae\xf6\x69\x9d\xc0\x55" - "\x1b\xf1\x2a\x88\x8b\x57\x07\xbd\x1c\xc0\x55\x03\xe0\xaa\x8d\x78" - "\x75\x51\x0a\x57\x22\xf1\x6a\x7f\x73\xe7\xe2\x8a\xdd\xdb\xf4\xff" - "\x00\xae\x0e\x5c\x10\xe2\x6a\xff\x28\x82\xab\xfd\x21\x8e\xe3\x4a" - "\xd5\x46\xbc\x52\x71\xf1\xaa\x64\xbe\x7c\x5c\x1d\x99\xc8\x40\xfe" - "\xb6\x71\x75\x5c\x02\x57\x2a\x91\x78\xf5\xe9\xe4\xce\xc5\x15\xbb" - "\xf7\xea\xff\x01\x5c\x95\x8c\x10\xe2\xea\x60\x0e\xc1\xd5\x41\xb5" - "\x13\xb8\x6a\x23\x5e\xa9\xb8\x78\xf5\xd9\x57\x0e\xe0\xaa\x18\x70" - "\xd5\x46\xbc\x5a\x23\x85\x2b\x91\x78\x75\x68\x5f\xe7\xe2\x8a\xdd" - "\x1b\xf6\xff\x00\xae\x3e\xcb\x12\xe2\xaa\xe4\x2a\xc1\x55\x49\x9d" - "\x5d\xb8\x6a\x32\xc3\xd5\x85\x1e\x11\x2d\x69\x44\x0f\xee\x9b\xcb" - "\xe1\xea\xe3\xfe\xb1\xab\x96\x21\xea\xc0\xf4\x7c\x0b\x2d\x78\xa4" - "\x8f\x25\xa6\x00\x17\x2c\xa6\xf4\x6f\x03\xa6\xae\x11\x4c\xa5\x5e" - "\x04\x4c\x7d\x97\x4f\x55\xa5\x5c\xc7\x38\x61\x31\x54\x30\x17\x30" - "\x84\x75\xa1\x8b\xc2\x5b\x8e\x06\x7c\xff\x9a\x09\x4b\x9f\xdf\x69" - "\x17\x2c\x4d\x01\x2c\x9d\xb5\xc4\xd2\x09\x1e\x4b\x93\x25\x34\xe0" - "\x4c\x09\x2c\x69\xdb\xc6\xd2\x0e\x3c\x86\xb0\xa8\x83\xb0\x74\x86" - "\x1f\x43\xd8\x3f\x47\x47\xe9\x7d\xe4\x62\xe9\x70\x8d\x10\x4b\x9f" - "\x8f\x26\x58\xfa\x3c\xd4\x71\x2c\x05\x15\x49\x63\xc9\xc4\xa7\xfe" - "\x38\xcd\x39\x2c\x01\xb7\x12\x60\xa9\x6d\x1e\xc5\x63\xe9\x0f\x63" - "\x3a\x17\x4b\x16\x3c\xea\x81\xc5\xd2\x1f\xfd\x85\x58\x3a\xc2\xe9" - "\xbe\x23\x92\xba\xcf\x08\x7d\x17\xfe\xcd\x09\xaf\xb3\x35\xdc\x8e" - "\x79\xd9\x00\x7d\x1a\x5e\x6f\x8b\x7f\xa7\xf8\x74\x61\x35\x85\xf1" - "\x94\x7d\x0b\xf9\x67\x2d\x41\xa1\x1e\x4d\x04\x2b\x7a\xc0\xca\x86" - "\x5b\x48\xd1\xda\x0a\x38\x69\x41\x8a\x66\xb0\x77\x73\x6b\x82\x47" - "\x45\x6c\x1d\xfa\xf2\x46\x35\xf4\x65\xa5\x68\x17\x3c\xd3\xca\x8d" - "\x43\x1a\x57\xc5\xb8\x6f\x5c\x89\xc7\x21\x4f\x23\xcd\xf4\xed\xe0" - "\xff\x52\xa7\xfd\xdf\xfc\xae\x94\xff\x8f\x0b\x7c\x5f\x60\xe6\x77" - "\xe5\xff\x73\x7c\x1c\x92\xfd\x9d\x6a\x21\xf1\xbd\xc9\xef\xdb\xda" - "\xc1\xef\xdb\x38\xbf\x3b\xd7\x1f\x1d\x95\x9e\xff\x68\x16\x2b\xd8" - "\x39\x05\x4d\x24\x46\x98\xe2\x02\x8e\x11\x98\xbf\x34\x7b\x07\xfa" - "\x5b\xf6\x37\x38\x3e\xdc\xa0\xbf\xd8\x88\xfb\x26\x49\x1e\xc3\xc5" - "\x89\xb4\x77\x48\x9c\xe0\x78\x8c\xbe\x7d\xc7\x1f\xff\xb4\xb8\xe3" - "\xe2\xc5\xf1\xb6\xfb\x1e\x27\x78\x0c\xc6\x4d\x81\x05\x6e\x3a\x22" - "\x5e\x38\x86\x9b\x2f\xa6\x08\xe3\xc5\xd1\x43\x24\x5e\x1c\x2d\xb1" - "\xa7\xef\x69\x03\x4f\xc5\x66\x78\xaa\xe5\xf1\x74\xfc\x3c\x1e\xa3" - "\x94\x87\xa7\x3f\x44\xb7\xef\xb8\xe3\xb1\xaf\x3a\x17\x4f\xed\x37" - "\xee\xd8\xb5\xf1\x74\xbc\x58\x88\xa7\x63\x2e\x04\x4f\xc7\x90\xf3" - "\x78\x0a\x32\x8b\x4f\x41\x66\xf1\x49\x33\x04\x8f\x4d\xca\xc4\x53" - "\x71\xfb\x8e\x37\x7e\xe9\xd5\xb9\x78\x6a\xbf\xf1\xc6\xae\x8d\xa7" - "\x2f\x1b\x84\x78\xfa\xf3\x64\x82\xa7\x3f\x47\xb7\x03\x9e\x8a\x2d" - "\x39\x31\xc1\xd3\x5f\xde\xc1\xfc\x59\x26\x9e\x9a\xda\x77\x9c\xf1" - "\xab\xd9\x9d\x8b\xa7\xf6\x1b\x67\xec\xda\x78\xfa\x4b\xb8\x10\x4f" - "\x9a\xdd\x04\x4f\x9a\x22\xe7\xf1\xa4\x32\x8b\x4f\x2a\xb3\xf8\x54" - "\x76\x12\x8f\x45\xca\xc3\xd3\x1f\xdb\x79\x7c\xf1\xeb\x43\x9d\x8b" - "\xa7\xf6\x1b\x5f\xec\xda\x78\x2a\xcb\x15\xe2\xe9\x2f\x37\x09\x9e" - "\xfe\xa2\x6b\x07\x3c\x99\xc5\x27\x95\x59\x7c\xfa\x5b\x7f\x3c\x06" - "\x29\x13\x4f\x45\xed\x3b\xae\xf8\x57\x97\xce\xc5\x53\xfb\x8d\x2b" - "\x76\x6d\x3c\xfd\xb5\x56\x88\xa7\x13\x63\x08\x9e\x4e\x84\xd9\x3b" - "\x16\x64\x1a\x03\x32\xc7\x93\xb4\xb6\x3b\xf9\x86\xa5\xb6\x93\x37" - "\x06\x04\x3a\xcf\xe1\xf1\xc4\xf2\xf1\xf7\xeb\x78\x22\xc6\x90\x69" - "\x1c\xa8\xeb\x8d\x01\x9d\x0c\x10\x62\xe8\x6f\x9b\x09\x86\xfe\x96" - "\x25\x85\x21\xbd\xf9\x9c\xb4\x1f\xcd\xe6\xa4\x5d\x47\xd4\x81\x85" - "\x1a\xaa\x92\x9b\x93\x86\xe7\xa3\x55\xd6\xd6\xa1\x8d\x77\x91\xa7" - "\x7b\x02\xf2\x9c\xb4\x98\x31\x6e\xc1\x31\x64\x69\x8c\xc7\xfb\x57" - "\x50\x68\x2b\x60\x26\xfb\x1a\x37\x2f\x0d\x70\xf3\xcd\x85\x26\xf4" - "\xe7\x85\x78\x5e\x5a\x09\x2a\x84\x74\xfa\x5c\x32\x1e\x84\xe3\x08" - "\x3b\x27\x6d\x2e\x9e\x93\x76\x2a\x52\x74\x4e\x5a\xa6\xcc\x39\x69" - "\xc9\x80\x83\x06\xc0\xc1\x1d\x8c\x81\x23\x82\xb9\x68\x3b\x32\xcd" - "\xc6\x80\xe6\x48\x8c\x01\xd5\xd8\xf7\x9b\x44\xbb\xcf\x45\xfb\xd9" - "\x6c\x2e\x9a\x69\x0c\x68\x3a\xc4\x0e\xd9\x7e\xff\x46\x69\x6b\x0c" - "\xc8\x00\x31\x61\x12\x9e\x5b\xde\xc0\x8f\x17\xaf\x9e\x8f\xd7\xfe" - "\x06\x2a\xf5\x10\x2b\xf0\xfc\xf1\x83\x73\xca\xd9\xf1\xbe\xaa\x94" - "\x1a\xb4\xb1\x05\x79\x7a\xe8\xb8\xb8\xe0\x13\x18\xd7\x0a\xb1\xc1" - "\x00\xfd\x12\xf8\xba\x4f\xeb\x52\x88\x0d\xb7\x20\x36\x2c\x85\xd8" - "\x70\x07\x62\xc3\xa5\x72\x36\x36\x30\xeb\x3f\xaf\xc7\x7b\x6c\x17" - "\x5e\x43\x23\x76\x5e\x43\x21\x38\x06\x18\xf2\x46\x27\xb5\xfa\x04" - "\x86\xeb\x7c\x02\x23\xe0\x5e\x0c\xc1\x40\xb3\x26\x6b\x09\x62\x63" - "\x3d\xf6\xbd\x72\x2e\x8e\x07\x15\x53\x5b\x33\x11\x72\x06\x07\xad" - "\xe6\x63\x82\xe6\x38\x90\x88\x01\x4e\x63\xc1\x62\x1c\x78\x87\x93" - "\x31\x00\x63\x61\x87\x29\x06\x38\x85\x85\xd3\x92\xeb\x7f\xda\xc0" - "\x42\x91\x1d\x58\xa8\xb5\x0f\x0b\x87\xc3\xf1\xde\xd4\x22\x58\x28" - "\x03\x2c\x94\xc3\xbd\x1a\x82\x85\x3b\x22\x58\xa8\x9c\xdd\xf1\x58" - "\x10\x8e\xc9\x3c\xb8\x58\xa8\x0a\x71\x0c\x0b\x41\x76\xc4\x85\x20" - "\x3b\xe3\xc2\xe1\x02\xbc\xa7\xb3\x35\x16\x82\x20\x2e\x04\x41\x5c" - "\x08\xe2\xe2\xc2\x75\x11\x2c\x54\x2f\xe8\x78\x2c\x08\xc7\x53\x1e" - "\x5c\x2c\x9c\x91\xde\xff\xc2\x36\x16\xec\x88\x0b\x41\xf6\xc6\x85" - "\x06\xbc\x17\xb2\x08\x16\x20\x2e\x04\x41\x5c\x08\xe2\xe2\xc2\x45" - "\x11\x2c\x7c\xfb\x4e\xc7\x63\x41\x38\x16\xf2\xe0\x62\xe1\xef\xd1" - "\x8e\x61\x41\x65\x47\x5c\x50\xd9\x19\x17\x8e\x4c\xc4\x7b\x08\x5b" - "\x63\x41\x05\x71\x41\x05\x71\x41\xc5\xc5\x85\xe3\x22\x58\x38\xbb" - "\xae\xe3\xb1\x20\x1c\xc7\x78\x70\xb1\x70\x6e\x86\x83\x58\xb0\x23" - "\x2e\xa8\xec\x8c\x0b\x47\x8a\xf1\xde\xbb\x22\x58\x80\xb8\xa0\x82" - "\xb8\xa0\xe2\xe2\xc2\x1a\x11\x2c\xfc\x23\xa7\xe3\xb1\x20\x1c\x83" - "\x78\x70\xb1\xf0\xcf\x04\x9b\x58\x60\xac\xb1\x80\xc7\x10\xb0\x7e" - "\xc4\x7b\x5b\xb3\x58\x78\x4b\x43\xb5\x30\x18\x0b\xe5\x68\xd3\x4a" - "\x33\x2c\xe4\x11\x1d\x61\xc2\xc1\x66\x73\x1c\xe0\xf5\x4b\x18\x07" - "\xa0\x1f\xf4\xe0\x77\x66\xeb\x50\x25\x3b\x5f\x29\x2f\x30\x06\xeb" - "\x07\x3c\xce\x80\x35\x84\xb4\x7e\xa8\xc9\x6b\x17\x0c\x24\x02\x06" - "\xea\xc5\x75\x64\xbb\xeb\x87\x9f\x3b\x08\x03\xa0\x25\xb7\xa7\x3a" - "\x83\x81\xf3\x89\xf2\x31\x00\x1c\xc1\x2e\x0c\x10\x9e\x60\x1b\x03" - "\x41\x1a\x1e\x03\xc0\x17\xf2\x82\x6a\x30\x3f\x20\x18\x08\x2a\x97" - "\xe6\x07\xdf\x6d\xeb\x78\x0c\xb4\x33\x3f\xe8\xb2\x18\xf8\x57\x92" - "\xe4\x1a\x46\x1c\xcb\x21\xee\x4f\x1a\x32\x10\x31\x6f\xc7\xbc\x9c" - "\x7d\x0d\xf9\xbf\xff\x16\x0a\xc5\xfb\xc6\x1c\x68\x69\xa2\x52\x93" - "\x98\x1f\xf1\xda\x6a\x3d\xd4\x03\xef\x4f\xcc\xe2\xe3\x67\x5f\xd7" - "\xaa\x04\x1d\xda\x08\x58\x78\x1f\xea\x80\xf7\x81\x77\x4f\xea\x11" - "\x51\xd9\x70\x0a\xb5\xdc\x8e\x41\x15\xb1\xd7\x50\x54\x00\xd3\x5a" - "\x75\x41\x83\xd7\x30\x2a\x34\xcb\x4f\xe1\x75\xe2\xbd\x66\xa5\x20" - "\xea\x06\x7d\x61\x04\x1e\x53\x7a\x3a\x05\x79\x16\x5c\x23\xe3\x48" - "\x1b\x6f\x20\x74\x22\x05\x21\xe2\xf7\x0b\x39\xdd\xde\x69\x87\x31" - "\xa4\x19\xe0\xf7\x0b\x26\xbf\x9f\x10\x8e\x21\x51\x76\xac\x67\xb4" - "\x63\xec\xb0\x43\xd6\x33\xfe\x6c\xbd\x9e\xd1\xb1\xb1\xc3\x8b\x92" - "\xe7\x5f\xb3\xe3\xcc\x1c\x0f\x58\x95\xcc\xb6\x7b\xd6\xaf\xad\x10" - "\xfb\xab\x52\x4a\xd9\xf9\xd1\xb8\x9d\xe3\x36\x8f\xf1\x91\x06\xf5" - "\xc5\x18\xc1\x78\x98\xb4\xb7\xb5\x75\x66\x03\xa2\x8c\x3e\x81\x71" - "\x18\x13\xc6\x45\xbe\xae\x59\x50\xa7\xaa\xd8\x4b\xe0\xf7\x5b\xa8" - "\xaa\x96\xf3\xf9\xca\x4b\xe0\xcb\x7f\x2b\x99\x45\x01\xbd\x86\x35" - "\x20\xcf\xb4\xf3\xc8\x73\x16\x5e\x73\x0c\xfd\xc0\x0e\xe0\x04\x85" - "\x6f\xa1\x11\xd0\x1f\x84\xb5\x72\xb1\xc1\x68\x1a\x57\xc2\x7d\x04" - "\x60\xe2\xfd\x85\x80\x89\x64\xc0\xc4\x4c\x8c\x89\x7f\xef\xe9\xb6" - "\x4c\x64\x7c\x59\x06\x26\xd8\xf1\xe5\x38\xc0\x44\x2d\x8f\x89\x7b" - "\xe3\xca\x12\x7d\x82\x66\xba\x13\x73\x0b\x45\xe2\x81\xd3\xe3\xca" - "\x3f\x73\xe3\xca\x66\xf1\xc0\x31\x6c\x7c\x2f\xb9\xb6\xdb\x06\x36" - "\x8a\xda\xc6\x46\xa3\x09\x1b\xb5\x6d\x63\x43\x1b\x6a\x8d\x8d\xc3" - "\xe1\x66\xd8\xd0\x98\x61\x83\x8c\x33\xe5\x05\xd6\x58\x63\x43\xfb" - "\x55\xe7\x60\xc3\x62\xde\xcf\x03\x8b\x8d\x1f\x24\xf7\xb7\x95\xc6" - "\x46\x90\x1d\x71\xe3\x67\x0e\x1b\x41\x76\xc4\x8d\x4b\x31\x22\xd8" - "\x28\xe0\xb1\x11\x64\x16\x37\xb8\x71\xa7\xbc\x20\x91\xb8\x71\xe9" - "\x62\xe7\x60\xc3\x62\x0e\xcf\x03\x8b\x8d\xff\x94\x3a\x80\x0d\x3b" - "\xe2\xc6\xf7\x26\x6c\xd8\x11\x37\x6a\x93\x45\xb0\xd1\x60\x86\x0d" - "\xb3\xb8\xc1\x8d\x43\x61\xce\x69\x85\x8d\xda\xe6\xce\xc1\x86\xc5" - "\x7c\x9c\x07\x16\x1b\x97\x25\xcf\xbf\x96\xc6\x86\xca\x8e\xb8\xf1" - "\x25\x87\x0d\x95\x1d\x71\xe3\x8a\xda\x1a\x1b\x47\x26\xf2\xd8\x50" - "\x99\xc5\x0d\x6e\x5c\x2a\x4f\x25\x12\x37\x7e\xf4\xe9\x1c\x6c\x58" - "\xcc\xad\x79\x60\xb1\xf1\xa3\xce\x01\x6c\xd8\x11\x37\xd2\x4c\xd8" - "\xb0\x23\x6e\xd4\xed\x17\xc1\x46\xb1\x19\x36\xcc\xe2\x06\x37\x4e" - "\x95\xa7\x12\x89\x1b\x57\x87\x77\x0e\x36\x2c\xe6\xc9\x3c\xb0\xd8" - "\xb8\xe6\x66\x0f\x36\x56\x37\x88\xe8\x94\x5a\x82\x8d\x56\x48\x63" - "\x8e\x0b\x73\x6d\x02\xf5\x53\x44\x81\x66\xc1\x98\x78\x63\x35\xa2" - "\x58\x5c\x34\x98\xe3\xe2\x5a\x19\xc6\xc5\xd0\x04\xc0\xc5\x65\x0e" - "\x17\x26\x5d\xc2\xee\xbd\x42\xb4\x89\x69\xcc\xca\xa4\x4f\x36\x61" - "\xcd\x9a\x60\xc2\xc4\x4f\xe3\xbb\xcd\x6f\x07\x4c\x08\xe6\x3d\x98" - "\x61\x62\x9a\x84\x3e\xf9\xad\xe3\x98\xd8\x0e\xda\xb5\xb5\xbd\xd7" - "\x3e\x99\x30\x71\xde\x59\x4c\xd4\xdb\x9c\xff\x20\x8e\x09\x8e\x67" - "\x48\x62\x82\xe7\x16\x04\x13\xdf\xdb\xc0\x44\x7d\x8d\x35\x26\x38" - "\x5e\xc1\xee\x43\x40\xb8\x85\x69\x0c\xcb\xc4\x2f\x84\x98\xb8\x3e" - "\xad\x73\x30\x61\xc1\x2f\x1e\x58\x4c\xdc\x18\x21\x39\x86\x95\x89" - "\xa8\x9d\x99\xc6\x12\x35\x65\x2c\x85\x8f\x06\x3e\xe5\x70\xad\x1b" - "\x5c\x63\xcf\x3d\x84\xef\xec\x3d\x63\x2f\x76\xef\x61\x8d\x87\x4b" - "\x2c\xb6\x37\x4e\xd3\xdd\x94\xc6\x23\x03\x85\x15\x72\x79\xc0\xf5" - "\x74\xb8\xae\x71\x77\x09\xeb\x0e\xe9\xcb\x99\xec\x8f\xf0\x3b\x7a" - "\xe0\xb4\x4c\x86\xc2\x97\x9d\x93\x45\x51\x38\x0f\xcb\x77\xba\x72" - "\x69\xfc\xcc\xdf\xdb\x27\x23\x0c\xef\xe5\x67\x4a\xd3\xd3\x48\x55" - "\xef\xc7\xe9\x8c\x2e\x0a\xa5\x31\x13\x29\xcd\xd3\x32\x63\x11\xce" - "\xd7\x94\xb6\x17\x97\x9f\xbf\x79\x1a\xc3\x47\x08\xb9\xbb\x28\xd9" - "\x3c\xdd\x93\x28\x5c\x27\x9c\xb6\x37\xe3\x5e\x14\xcb\xa6\x77\x51" - "\x04\x08\xd2\xaf\x47\x6c\x5a\x2e\x9d\x1b\xd3\xbd\xb4\x96\x4b\xc7" - "\xce\x2d\x81\x6b\x0a\x73\xfb\x71\xe9\xfa\x98\x6c\x83\xf7\xef\x33" - "\xaf\xab\x21\x93\xc2\xf9\xe1\x34\xee\xc6\xee\x7f\x6c\xe0\xea\x32" - "\xc2\xfc\x9d\x38\x1d\x3c\x37\x9c\xb3\xb3\x07\xd4\x21\xe4\x5e\x7e" - "\xea\x5b\xbe\xa6\x74\x80\xc3\xfe\x85\xbc\x6d\x3c\xc1\xd6\x05\x78" - "\xcf\x72\x4b\xdf\xb9\xbb\xb8\x68\xb1\xef\xaa\xea\x11\xc2\x69\x19" - "\xf7\x8f\xa2\x21\xbd\x17\x57\x8f\x30\x52\x0f\x76\xcf\x44\xe2\x6b" - "\x4a\xff\xc8\x2e\xb6\xac\x2e\x4a\xae\xac\x7d\x21\x5d\xb8\x29\x5f" - "\x23\xc5\x62\x98\x4b\xab\x60\xd3\x56\x26\xe2\xb3\xbe\xee\xa5\x7f" - "\x04\xa7\x35\x64\x7f\x56\x6f\xc8\x50\x44\x58\xe6\x6f\xc8\x74\xc5" - "\xf7\xcd\xf3\xf7\x26\xe9\x8b\x2f\x40\xfa\x89\xd6\xe9\x3d\x2d\xd3" - "\xfb\x90\xf4\xbf\x1f\x01\xe9\xa3\xad\xd3\xeb\xfb\x5a\xa4\xef\x47" - "\xd2\xef\xcb\x82\xf4\x53\xac\xd3\x2b\x2d\xd3\xff\x82\xa4\x3f\x12" - "\x02\xe9\x63\xac\xd3\x87\x59\xa6\xf7\x25\xe9\xff\xb7\x16\xd2\xcf" - "\xb0\x4e\x9f\x6e\x99\xbe\x3f\x49\x7f\x30\x14\xd2\xc7\x5a\xa6\x2f" - "\x64\xd3\xa2\xc7\xb9\xb4\x03\x48\xda\x92\x5c\x48\x1b\x27\x52\x57" - "\x9a\xcb\x3b\x98\x4b\xff\x4b\x92\xfe\xa3\x06\x48\x9f\x60\x9d\x5e" - "\x61\x99\xde\x8f\xa4\xff\x5b\x38\xa4\x4f\x14\xf1\x95\x65\xfa\x47" - "\x49\xfa\xa3\x71\x90\x3e\x49\xc4\x57\x96\xe9\x07\x92\xf4\x5f\x1c" - "\x86\xf4\xc9\x22\xb6\xb7\x4c\xff\x18\x49\xff\x67\x05\xa4\x4f\x11" - "\xb1\xbd\x30\x7d\xb6\x66\x0a\xa4\x5b\xbd\x8b\xc3\xa6\x85\xdd\x2d" - "\xf3\x1e\x44\xf2\xfe\x4b\x31\x3c\x93\x6e\x9d\x1e\xb9\x90\xf4\xe8" - "\x19\x2e\xfd\xe3\x24\x7d\x19\xb6\xe5\x5a\x11\xdb\x3f\x81\xd3\x17" - "\x92\xb4\x4f\x90\xb4\x7f\x5c\x0b\x69\x37\x88\xd8\xdd\x3c\xad\x3f" - "\x49\xfb\xcf\x12\x48\x9b\x25\x62\x73\xf3\xb4\x83\x49\xda\x6f\x12" - "\x20\xad\x5a\xc4\xde\xe6\x69\x9f\x24\x69\x4f\x27\x43\xda\x5c\x91" - "\xf2\x3e\x6e\x96\xf6\x29\x92\xb6\x2a\x1d\xd2\xe6\x8b\xf8\xc5\x3c" - "\x6d\x00\x49\x7b\x1e\xfb\xb0\x40\xc4\x27\xe6\x69\x87\x90\xb4\x67" - "\x70\x5b\x2b\x12\xf1\x89\x79\xda\x40\x26\xfb\xef\xf9\x5c\x9c\x2e" - "\xb6\x4c\xbb\x8b\x8f\xbb\x41\x46\xf7\x73\xc5\x5c\xac\x64\xcf\x28" - "\x62\x20\x1d\xdf\xe7\xe8\x9f\x35\xf5\x11\x46\x0a\xa9\x98\xec\x93" - "\x1b\xe0\x39\x9c\xe7\x7e\xeb\xd8\xa6\x78\x76\x17\xdf\x47\x0c\x65" - "\xb2\xaf\x4d\xe1\xde\x5f\x62\x9d\xd6\xd5\x3c\xed\x30\x26\xfb\xe2" - "\x7e\x2e\xed\x61\xeb\xb4\x9e\xe6\x69\x9f\x66\xb2\xbf\x2f\xe7\xd2" - "\x96\x8a\xc4\xd7\x67\xcc\xd2\x06\x33\xd9\x3f\xd4\x42\xba\x63\x62" - "\xf1\x95\xc9\x54\x3e\x83\xe3\x81\x29\x76\x43\xfa\xe1\xc4\xbe\xf5" - "\x18\x0f\x1a\x9c\xde\x94\x16\xfc\xf0\x8c\x59\x5f\xf9\x8c\xd1\xbd" - "\x16\x71\x36\x2b\xb3\x2e\x43\xba\x79\x19\x9e\x25\x79\x5e\xf1\x83" - "\x3c\xcb\x2d\xcb\xc0\xc5\x23\xcc\x13\xb0\x7d\x47\x18\xb2\xeb\x42" - "\xb0\x7d\x21\x6d\x85\x80\x23\x50\x2e\x34\xce\x93\xf3\xed\x48\x26" - "\xfb\x5f\xa5\x9c\x0d\x04\xfd\x11\xb4\x47\x36\x1e\x82\x7f\xcb\x99" - "\xf5\x3d\x03\x20\xed\x73\x5c\xba\xb3\x96\xfd\x20\x57\xbe\x5f\xc1" - "\xbd\x9a\x7b\x7d\xa0\x8b\xe2\x82\x18\x97\x49\x0a\x44\xbd\xaf\xd1" - "\x8d\x6c\x1b\xe1\xcf\xf1\x6d\x66\x63\xa0\xb1\x78\x00\x8a\x6a\x60" - "\xf4\xe6\xd7\xb6\x50\x4c\xf5\xd3\x0d\x48\x81\xf7\xe9\x66\x7c\xc6" - "\xed\xd5\xc2\x75\xdd\xe0\x01\xd5\x8d\xd9\x8d\x05\x5a\x97\xcf\xfd" - "\xf1\x5e\xae\xf0\xff\x5e\x2d\x8a\x2b\xc0\xff\x6f\xc9\x64\x9a\xf0" - "\xfe\xc9\x86\x0f\x6e\x6a\xab\x8c\xf5\x80\x3f\xa6\x09\xf2\x68\x02" - "\xce\x48\xe3\x33\xac\xf1\x39\x12\x55\x29\xf5\xe8\x0a\xdd\x78\x9d" - "\x59\x94\x10\x0a\x65\x08\x86\xf7\xc5\x5d\x82\xef\xc4\xa6\xc0\xa9" - "\xd5\x37\xf5\x9a\x25\x78\x1f\xeb\xa6\x91\x3a\x9f\xc8\x60\xe6\xdd" - "\xd7\xeb\x92\x52\xd1\x63\xd7\xe8\x26\x96\x03\xe0\x3d\x6c\x8d\x5e" - "\x37\xf5\xec\xde\xb5\x3f\x27\xfc\x9a\xec\x5b\xdb\x3c\x0a\xef\x57" - "\x8b\xf7\xad\xbd\xb7\x67\x6d\x51\x4c\x35\xd9\x07\xb7\x69\x23\x5b" - "\x97\x4c\xa6\x9a\xf1\xef\x5f\x67\x6c\x59\x9b\x8e\xcf\x9b\xd6\xa4" - "\x5e\x43\x97\xb8\x7b\x38\x4f\x2e\x9f\x9e\x96\xf9\xe0\xe7\x74\x83" - "\x62\xaa\x99\x3d\xfd\xeb\x0c\x6a\xff\xb3\x46\x4f\xff\x6a\x46\x3d" - "\xac\xba\x2a\x51\x8b\xc8\x99\x8c\xcd\xf3\x19\xf7\x69\x55\x46\xb5" - "\x7f\x29\x5c\xd7\x54\x35\xb4\xb0\xd7\x21\xef\xb3\x98\xf7\xde\xf6" - "\x0c\xda\xc0\xa8\x83\xb2\x34\x03\xf0\xd9\xad\x4d\x5a\xfc\x3e\x7c" - "\x9d\xc9\x19\x56\x8d\xed\x69\xcc\x19\xa6\xa1\x7d\x91\xe2\xb6\x57" - "\xd0\x86\xc6\xec\xa6\x06\xd3\x79\x74\xa6\x77\xe1\x7c\xb5\x5c\x5e" - "\xf6\xef\xb9\xdb\xb4\x1a\xef\xb9\x2b\x23\xfd\x08\x9c\x5e\xfc\x0c" - "\x12\xe0\x57\x39\xb7\x7c\x1b\xb3\x9b\xd5\xc0\x93\x93\x89\xcf\x9b" - "\x0b\xb4\xa8\x61\x22\xf7\x3f\xf8\xbf\x91\xc3\x42\x33\x3e\xff\xf4" - "\x30\xf7\xbf\xc6\xb4\xc7\xb1\x68\xbe\x9e\x37\xeb\x81\xab\x29\x8c" - "\x3b\x62\x5c\x31\xc7\x27\x67\x34\xdc\xac\x57\x0e\xc4\x67\xd7\xb4" - "\x84\xc3\x3b\x15\xc4\x27\x2d\x8f\xc2\x5f\x0f\xee\xaf\x8e\xfb\xcb" - "\xe0\x34\x2c\x8e\xbd\xc3\xeb\xc0\xee\xe5\xc4\x17\x2d\x23\x59\x6d" - "\x83\x71\x03\xd8\x62\xbc\x86\x95\xb3\xf9\xe6\x45\x06\x9b\x97\x21" - "\x78\xf8\x33\xcf\x8e\x18\xf9\xdc\xaf\x42\x46\xcd\x9e\xf3\x66\x5c" - "\xfc\xdc\x79\x09\xf3\xdf\x7a\x3b\x71\xc1\xc2\x45\x49\x8b\x97\x2c" - "\x4d\x5e\xb6\x7c\x45\xca\x3b\x2b\x21\x9f\x7b\xe7\x5e\x33\x3b\xc2" - "\x5d\x1a\x28\x04\x7e\x1d\x8b\xdf\xb1\x87\x7d\x2f\x5c\x23\xf8\x6a" - "\xc9\x55\x28\xc5\xb5\x43\x15\xb0\x79\x7c\xc6\x61\x3d\xdd\x72\x13" - "\x9f\xb7\x08\xf8\x76\xa9\x2a\x78\x59\x83\xcf\x6a\xae\xa5\x5b\x6a" - "\x2b\x75\x2f\x6b\xf0\xd9\xe2\x5f\xfb\xd6\x21\xff\xc7\xf1\x79\xce" - "\x2d\xd5\xf8\x7e\xe1\x93\x08\x95\xc1\xb3\x62\x79\x3e\xee\x89\x7c" - "\x3f\xec\xc7\xe8\x72\xfb\x31\xf5\x38\xff\xdc\xad\x4c\x9d\x6e\x55" - "\x02\xca\x86\xef\xd0\xc6\x3c\xaf\xd0\xad\x7b\xbe\xf6\x63\xcf\x68" - "\xf5\xdb\xb5\x95\xa9\x5d\xdb\x8f\xa9\x7d\x77\x2b\x53\x5f\xd8\x8f" - "\xd1\xfa\xe7\x22\xb7\xc6\xec\xd6\x18\x2d\xdd\x52\xc2\xb6\x57\xb8" - "\x6f\x74\x6f\x89\xde\x02\xf7\x9e\xd6\x23\xba\x10\xbe\xc3\xb5\x86" - "\xaf\x95\xa4\xdc\x9f\xde\x6a\xea\x06\xf9\x85\x32\xad\x89\x2e\xd9" - "\xf0\x1e\xe2\x8f\xd6\x93\x65\xc0\x3a\xe0\x7d\xba\xaa\xa6\x4b\x48" - "\x4b\xb7\x96\x17\xde\x65\xdf\xe7\x51\x95\x5f\x8f\x70\x7e\x07\x97" - "\x34\x75\x5b\x3a\x80\xd1\x43\xda\xbd\xc6\x55\x89\x2e\x90\x66\x2d" - "\xe4\xdd\x60\x5e\x9f\x80\xb9\x0b\x92\x95\x0b\x97\x25\x26\x0e\xe9" - "\x85\x02\xd8\xbf\xc8\xfc\x9c\xf1\x64\xbc\xb7\xfa\x87\x5b\x99\x32" - "\xa8\xa7\x06\xea\x5b\x7e\x1a\x54\x0a\x60\x03\x41\x9d\xd4\x57\x68" - "\xfd\xa3\x70\xfd\x18\xfc\x7f\x0c\xca\x5e\xce\x9e\x61\xac\xe8\x33" - "\x81\xc9\x6e\x3d\x0b\xe5\xc4\x7b\x82\x2b\xf1\x5e\xec\xb7\x57\x4c" - "\x71\x81\x7a\xe7\x42\xba\x72\xe5\x00\x34\x18\x9e\xdb\x03\xe5\x28" - "\x86\xff\x71\xfa\xc9\xd8\x8f\x90\xbe\x8c\xad\x97\xa2\xcf\x28\xfc" - "\x1d\x6c\xa5\xd9\xd9\x8f\xc9\x6a\xcc\xd6\xa7\xe3\x33\x26\xd8\x33" - "\x33\xe1\x3b\xd8\xa5\x1c\xd2\xaa\x6f\xa7\x4d\x71\x01\xad\xeb\x52" - "\xc8\xe7\x19\x8d\xcb\x84\xcb\x81\xf5\xf3\x37\xc0\x40\x8d\xad\x31" - "\x68\x68\x13\x72\xf9\xa6\x16\xa1\x82\xad\x4c\x11\x7c\x0a\xe0\x93" - "\x7f\x0a\xee\x9d\x84\x4f\x39\x5c\xaf\x80\xbf\xa7\xe0\xef\x49\xf8" - "\x80\xfe\xf6\xc5\xe5\x5e\xba\x9a\xa9\x7b\x3a\x1f\x3d\x81\xf3\x07" - "\x6c\xbd\x76\x49\xe1\x56\x84\xcb\x8e\xcf\x90\x61\xdc\x0d\xde\xc2" - "\x73\x2f\x8c\x1b\x10\xdc\x87\xbf\x05\xec\x5f\xf3\x0f\x6d\xac\x45" - "\x34\xa3\x20\xff\x33\x13\xe1\x7b\x32\xf7\x7f\x2c\x7c\x12\xdb\xfc" - "\x58\xe6\x27\xf5\xa1\x99\x1a\xbb\xd3\xda\xf5\xe9\xe3\x6d\x5f\x3a" - "\x17\x35\x52\xd0\x75\x48\x01\x2d\x4f\x70\x9d\x6e\x22\xd7\x5c\xcb" - "\xc8\x77\xd7\x6a\xee\xaf\x1e\x29\x7a\x82\x9d\x7a\x41\xfe\xbd\x42" - "\xc8\xb5\x5e\xe1\xf0\x37\x0b\x3e\xf9\xc2\xf7\xf7\x81\xe7\xfb\xa8" - "\xb0\x3f\x5b\xa1\x8f\xc1\xbe\xd4\xd2\xfa\x5a\xec\xa3\x2d\x04\x5b" - "\x2e\x78\x1d\x1d\x5c\xd3\x02\xb6\x0a\xee\xe1\x87\x36\x9e\x13\xe2" - "\xc7\xa8\xb1\xc0\x8f\x1a\xc7\x22\x78\x4e\x55\x48\xf0\x72\xec\xf6" - "\xaa\x38\xf8\x6e\x2c\x83\x7c\x8e\xe1\x71\x9d\x2b\x34\xc3\xce\xc1" - "\xdf\x72\x0d\xa1\x3e\x09\x48\x81\xe3\x4b\x3d\xcd\xf8\x60\xcc\xe2" - "\x77\x73\xef\x25\x65\x81\xf2\xc1\xb5\x22\x5c\xbe\x45\x90\x2f\x7c" - "\x2f\x86\x74\x45\x55\xe8\x96\xa9\x6c\xec\x33\x9b\xde\x02\x3c\x72" - "\xe5\xc5\x79\xe2\xe7\x18\xbe\x5e\x5a\xfc\x0c\xf7\xee\x93\x70\x3d" - "\x18\x62\x14\x5e\x23\x47\x57\xe9\xb5\x08\x63\x12\xff\xad\xd2\x07" - "\x43\x5b\x8a\x40\x46\xbc\x2f\xbc\x2f\x0a\x86\xf6\xd6\xf3\x12\xcd" - "\xec\x1f\xb6\x1a\x05\xe3\xfc\x70\xfc\xd6\xd2\x4c\x52\x21\x6e\x8b" - "\x24\xaf\xaf\x70\x3d\x70\xfe\xa7\x92\x10\xfb\x9e\x5d\xb8\x3c\x70" - "\xdf\xec\xbd\xb9\x55\xc0\x32\xb6\xac\x24\x75\x85\x77\x15\xc3\xf3" - "\x25\xb8\xee\xd8\x9e\x70\xbf\xf4\x8a\x02\xb9\xe2\x7b\xf8\x1c\x49" - "\xae\x3e\xc5\x78\x6d\x22\xb6\x07\x4e\x5f\x05\x8a\x83\x9c\x79\xa1" - "\x1f\xca\xda\x0d\x9e\xc7\xfe\x60\xe0\x1d\x38\x8f\x34\x3d\xa3\x67" - "\x20\x1e\xfd\xcf\xca\x26\xc5\x15\x85\x4b\x86\xc0\x3f\x1f\xa0\x58" - "\x73\xff\xc0\x73\x25\xf0\x7c\x19\xee\xfb\x71\x3c\x81\x77\x7a\xe0" - "\x33\xa1\xe1\x9a\xda\x98\x0d\x79\x2c\x6f\x62\xc7\xa2\x20\x9f\xc5" - "\x50\x16\x35\xce\x07\xca\x53\xc6\xe5\xb5\x1f\xef\x8f\x6f\xee\x6b" - "\x2e\xbf\x62\xec\x73\xb6\x3d\xaf\x64\xeb\xa4\x86\xe7\xc7\xec\x22" - "\xf7\x4a\x21\x4d\x29\xd3\x1a\x81\x98\x55\x31\xe4\xec\x69\x72\xef" - "\x70\x5a\x33\xeb\xdf\x32\x12\xd7\x5c\x66\x2f\x5d\xc3\xd4\xf1\xe5" - "\x76\xf1\x35\x9d\x1f\xc5\x95\xfb\x30\x7e\x1f\xb3\x62\x06\xdb\x87" - "\xe2\x77\xe0\xe7\x49\x7e\xa8\x01\xe7\x67\xb2\xd5\x30\x28\x07\x6b" - "\x2f\x05\x0a\x80\xeb\xc5\x18\x8b\xac\xdd\x20\x8e\xde\x4e\x03\x2c" - "\x2a\x5c\xfc\xe0\xf9\x63\xd9\xf8\xfb\x0a\xfc\x1d\x95\xb0\x31\xf6" - "\xde\x7d\x14\x87\xef\x57\xd5\x81\xdf\xde\x06\x2c\x19\x11\x7a\xc2" - "\x1b\x05\x37\x64\xb2\x75\xdb\xdf\xb0\x2a\xdc\xe5\x6b\x3d\x42\xb8" - "\x9c\x60\xa3\x52\x28\x6b\x19\xc4\x7e\x96\x03\x40\xbc\x3e\xcc\xfc" - "\x4f\x0c\xc2\x65\x86\x78\xc6\x95\x8f\x1a\xc9\xf9\xfe\x30\xae\x23" - "\xb6\xe7\x30\x12\xfb\xe0\x1e\x7d\x1e\x97\x9d\xaf\x37\xe5\x69\x6e" - "\x63\xb6\xde\xe0\x07\xec\x2f\xec\x17\x3e\x4f\x17\x8c\x7d\x35\xe4" - "\xb5\x9f\xf4\xcf\x04\x1b\xd8\xd6\xea\x7e\x4c\x05\x4e\xcf\xa7\xa5" - "\x27\xe0\x7b\xa9\xf0\xee\xa7\x93\xb0\x66\x82\xfe\x59\xdf\xa8\x81" - "\x7c\xf7\x6b\x56\xea\x11\xe4\x51\x8a\x6d\x0a\xe9\x76\x62\x3c\xc2" - "\xf7\x0a\xae\xdc\x05\xd0\x9f\xab\xe0\x13\xca\xf7\x1f\xf4\x66\x21" - "\xbe\x28\xcb\xf6\x8f\xfd\xad\x36\xa6\x45\x20\x16\x0f\x4b\x90\xf2" - "\x86\x82\x1e\xc2\xf5\x1d\x9c\xaf\xe9\x35\x5f\x43\x7b\xe1\xf3\xa0" - "\x15\x16\xbe\x2e\x65\xf1\xb8\x62\xa2\x0b\xae\x33\x3c\x5b\x4a\xf2" - "\xa1\xd8\x3a\xb3\x78\xca\x64\x31\x50\xc1\xac\x80\x7a\xde\xc3\x01" - "\x15\xcb\xf9\xb9\xc2\xc2\x26\xa6\xd8\xb5\x1f\x9f\x47\x8c\x63\x12" - "\xf0\xea\x5f\x37\xb6\xf2\x71\x09\xfb\xde\xc8\xfa\x9e\x76\x2d\x24" - "\xfd\x2d\x89\x5b\x0a\x8a\xdc\xef\x27\xc0\x30\xae\xd3\x68\x16\xbf" - "\xb8\x2c\x69\x33\x70\x59\x4a\xd9\x72\xa4\x29\x11\xdc\x3b\x8c\xdf" - "\x0f\x79\x85\x71\xed\xd5\x94\x97\x37\xce\xeb\x5d\x88\x55\xb8\x4c" - "\xf0\xee\x22\x36\xfe\xbd\x84\xcb\xae\xf0\xe1\xca\x5e\xde\x94\x89" - "\x63\x09\xe3\xda\x4c\xb1\xcf\x96\x43\xba\xd5\x4d\xe4\x3c\xb7\x5e" - "\xf0\xfc\x5e\x76\x8e\xa5\xc2\x35\x19\xc7\x68\xbc\x76\x18\xfe\x7f" - "\x43\xf9\x5b\xc0\xea\x35\x88\xe8\x09\x08\x97\x7f\xbf\x09\x17\xf5" - "\x8a\xff\xcf\xde\xdb\x80\x37\x59\x65\x8b\xc2\x2b\x69\x4a\x03\x16" - "\x92\x96\xaa\x19\x04\x0d\x5a\x3d\x45\x0b\x84\x1f\xb5\x32\xa0\x81" - "\x16\x6d\xb5\xa5\x15\xaa\x56\x41\x5b\xa4\xd5\x56\xb1\x84\xb6\x40" - "\xc0\xd2\x84\x50\xe7\xe0\x88\x34\xad\x15\xab\x96\xb6\x8e\x38\xc3" - "\x0c\x38\xd6\x73\x38\xe7\x70\xef\x83\x63\x1c\x3a\xf7\x32\xe7\xb4" - "\x4d\xe7\x5c\xce\xb9\x3d\x7e\x78\x27\xf2\x75\x98\xca\x29\x10\x69" - "\xa0\xa1\x4d\xb2\xef\x5a\x7b\xbf\x6f\xf3\xd3\x04\xf5\x1e\xef\x9c" - "\xe7\xf9\x3e\xab\xe1\x7d\xdf\xfd\xb3\xf6\xda\x6b\xaf\xbd\xd6\xda" - "\x7f\x6b\xab\xf3\x68\xac\x82\xb4\x3e\x82\x36\xd2\x21\xa2\x37\xf1" - "\x32\xda\x48\x8b\x47\x9a\x54\xb5\x32\xdf\x62\x39\xad\x44\x7b\xd1" - "\x3e\xaa\xcf\x90\x8f\x8f\x8d\xf3\x16\x7e\x4b\x74\x3c\x84\x74\x54" - "\x63\x79\xcb\xa5\x7a\x1d\xc2\xf4\x5a\xfc\x5e\x20\xe1\xde\x22\xa5" - "\xff\x42\x6e\x07\xa9\xaf\x76\xef\x23\xf9\xcb\xf9\x27\xbe\x46\xca" - "\x7b\x50\x94\x15\xbf\x45\x4e\x4b\x36\x22\xbf\x9b\x19\xc3\x48\x0e" - "\xce\xc7\xb6\xe7\xb2\x6f\xc7\x28\x4f\x27\xc9\xc6\x2e\x51\x86\x7a" - "\x16\xe7\x43\xb4\x7b\x82\x7c\x14\x9f\x1b\x21\x9f\x48\x16\xdb\x7b" - "\xeb\xc5\xdd\x77\xc4\x4b\x24\x53\x69\x4c\x84\xf0\x52\xa5\xfe\x23" - "\xe1\x1c\xff\x5f\xc2\xed\x24\xf5\x64\xe4\x95\xb9\x21\xb0\x0f\x45" - "\xd3\x73\xed\x42\x06\xb6\x4a\x75\xbb\x2a\xd5\xed\x88\x54\xb7\xab" - "\x52\xdd\x0e\x61\x19\x48\xb7\x84\x4f\x42\xe8\x88\x74\x4b\x98\x23" - "\xa5\x3f\x46\xb2\x3c\xd8\x5f\x27\x95\xc9\x7d\x79\xa2\xbc\x48\xf8" - "\x11\xf5\x87\x20\x5e\x93\x8c\x11\xf2\xe2\x58\x74\x79\x31\x49\x2b" - "\xd5\xb7\x23\xa2\x6f\x1c\x14\x7d\x43\xd2\x2d\xd8\x0e\xbd\x1e\xf9" - "\x0e\x42\xdf\x5c\x92\x9f\x54\x76\xa8\x0e\x6a\x13\x74\x95\xfa\x72" - "\x42\xfc\xc4\x76\x98\x74\x2a\xb4\x3f\x53\x5b\x93\x4c\x20\x18\xd4" - "\xa6\xdc\xae\xc4\x30\xd1\xae\x93\x8e\x90\x6c\x08\x95\xd1\x98\xb6" - "\x39\xc0\xa8\xbf\x4c\xea\x0f\xef\x8b\x93\xb2\xa4\xbe\x28\x97\xfd" - "\x4b\x6c\x23\x43\xb0\xdc\x84\xdc\x88\x72\xa9\x6d\xba\xf8\x5d\x31" - "\xbc\x7d\x12\xde\x94\x75\x1a\xa5\xc7\xbc\x66\xcc\x63\x8d\xd0\x8f" - "\x76\xc2\xcf\xa5\x8a\xf7\x72\x99\xb5\x9f\xcb\x0a\xf3\x08\xc7\x27" - "\xa1\xbe\x5d\xd2\x13\x18\x66\x90\xc2\x0a\x24\x5d\x22\xf1\x4d\xc2" - "\xe5\x08\x9c\x5c\x51\xed\x23\x84\x2f\xdb\x47\x1c\xd6\x18\x87\x35" - "\x20\xd5\x8f\xc2\xe6\x8a\xb0\xf8\x23\x14\xb6\x4f\xd0\xa1\x99\x71" - "\x7d\x15\x5f\x20\xe9\x2b\xea\x5f\x4a\x97\x4a\xe5\xa0\x3e\x46\xdf" - "\x2e\x95\x3a\x83\xe0\x3b\xad\xa3\x34\x86\x68\xc1\xb8\x75\x24\x0f" - "\x48\x5e\xd0\xde\x60\xfe\x5c\xc5\x9f\xaf\x90\xdc\x21\x3b\x84\xe2" - "\x31\x5d\x2e\xc9\x22\x0c\x7f\x9b\xfc\x02\xb2\x7f\x57\x23\x5c\x75" - "\xad\x94\xf7\x43\x6e\x2b\xfc\x7b\x76\x9c\x1c\x26\xe7\xc3\xbe\xfe" - "\x34\xe5\xa3\xfc\xb2\xfc\x22\xd9\xe5\x23\xd9\x24\xca\xfb\x5a\xe2" - "\x71\x3e\x6e\x90\xed\xa2\x31\x65\x48\x5a\xba\x4b\x8d\xcb\xb4\xc9" - "\x4b\x85\x3c\x9b\x3c\x97\xf2\xf2\xf6\x43\x59\x59\x77\x95\x7d\xd9" - "\x5e\x05\xaa\xb6\x4b\xdc\xc6\x4a\x17\x78\x4e\xde\x23\xea\x31\xf9" - "\x51\x5e\x0f\x21\x53\xed\x1c\x17\x4c\xd3\x36\xca\xe3\x5e\xa2\xba" - "\x50\x5c\x43\x48\x1c\xdd\x8d\x88\x71\x62\xbe\x24\x22\x5f\x60\xac" - "\x7c\x42\xfa\xf6\x51\x3e\xee\x53\xb7\xed\x97\x65\xef\x14\xb5\x84" - "\xe7\xef\x64\xb9\x8b\x74\x29\x24\xd9\xcb\xe3\x9e\x93\xd2\xac\x92" - "\x9e\x5c\xbe\x4f\xbe\x2c\xe8\xaa\x53\x4a\xf4\x5e\x27\xea\x31\x65" - "\x32\x1f\x67\xff\x7b\x11\xd2\x76\xf2\x90\x4c\xdb\xd0\x77\xea\x3f" - "\x58\xbe\x96\xbe\x39\xdf\xd7\xf2\x31\x6c\x2b\xa5\x21\x9c\xb8\x8e" - "\x50\xa9\x07\x22\x6d\xea\xb3\xaa\xc4\x5d\xa4\x97\xb8\xad\xaa\x4a" - "\x5c\x2f\xcd\x3d\x81\xa3\xea\x67\xa8\x17\xa6\x1c\x91\x65\x0c\x1b" - "\xc9\x06\xba\x63\x09\x71\xf9\x90\xc2\xe8\x7e\xac\xd0\x34\x24\x9f" - "\x3e\x1a\x75\x49\x30\xa7\xec\x91\xe5\x06\xc9\x92\x5e\xcf\x19\xc9" - "\xa6\xbb\x2e\xa3\x4d\x92\x25\x17\x54\xd7\xdd\x17\x6e\x87\x5d\x77" - "\x5f\xb8\xcc\x48\xcc\x8b\x94\x19\x68\x37\xd7\x8f\x34\x5d\x97\x18" - "\x66\x07\x60\xd8\xb5\x65\xc7\x14\x17\xf5\x51\xba\x9b\x95\xcb\xa7" - "\x2a\x5e\xd6\x7b\x32\xce\x24\x37\x87\x5f\x96\xe6\x2f\x54\x89\xcb" - "\xc8\x56\x8b\x28\xaf\x36\x4c\x76\x52\x79\x32\x3c\x15\xd0\xfd\x9e" - "\x48\x87\x4b\x04\x33\x57\x92\xf3\x1d\x61\xb2\x52\xd2\x61\x24\x27" - "\xc3\x74\x15\x7e\x87\xeb\xaa\xc4\x39\x13\x65\xe4\x75\xde\x6f\xaf" - "\xab\xae\xeb\x23\xb9\x25\xcb\xc8\x70\x59\x70\x9d\xaf\x2d\xcc\x96" - "\xbd\xae\x5e\xb6\x65\x83\x72\xf4\xba\x14\x92\x51\x58\xfe\x31\x51" - "\x76\x62\x8d\x2b\x6e\xd4\x2c\x97\xed\xc2\x76\xee\xd5\x23\x6f\xee" - "\x1b\x73\xe1\x7b\x91\x64\x03\xf2\xbe\x39\x4a\x77\xf1\xa9\x26\x77" - "\x20\xff\x4d\x21\x3e\x73\x54\x5e\x82\x81\xa0\xae\xe8\x1a\xde\x24" - "\xd3\x77\x6a\x7c\xa8\x5d\x78\x60\x3f\xdb\x83\xe5\x9c\x0e\xad\xe3" - "\xeb\x18\xd6\x20\xcd\x21\x70\xda\x12\x2c\x55\x62\x67\xfb\xfe\xf0" - "\xba\x89\x7a\x24\x0e\x50\x3d\x68\x4c\x84\xe5\xd3\x98\xe9\x10\xdd" - "\xcf\x8c\xfd\x26\xad\x5d\xe6\x79\xb4\x8b\xae\xda\x42\xec\xab\x38" - "\x5f\x3d\xc9\x4a\x69\xec\x79\x12\xed\x1d\x7b\xe8\x5c\x4c\x5e\x66" - "\x81\xde\x54\x55\x51\x59\xf3\xdc\x42\x7d\x45\x65\x45\x4d\xc5\xfa" - "\x8d\x15\x3b\xd6\xd7\x54\x6c\xaa\x4c\x7f\x69\xfd\xf3\x15\x1b\xf4" - "\xdb\xd6\x57\xeb\x0d\xe6\xdb\xcd\x53\x20\x98\x74\x89\x7e\x7d\x75" - "\xf5\x96\x97\xca\x4a\xf5\x95\x15\x1b\xe6\x56\x95\x55\x97\xd5\xe8" - "\xd7\x57\x6d\xda\x52\x59\xaa\xbf\xbd\x74\xde\xed\x86\x7b\x4a\xa7" - "\x84\xce\xa1\xdd\xaa\x85\xa1\xc0\x95\xaf\x06\x1b\xae\x80\x5a\xa3" - "\x30\x55\x69\xcc\x15\x95\x7c\xce\x4e\x35\x2d\x6f\x7e\x33\x98\x30" - "\x3e\xb1\xbd\x09\x69\xdd\x34\xb5\x04\x9f\x2a\x4a\x87\xf5\xd4\xe3" - "\xbb\x1a\x71\x9f\x39\xd2\x34\x0d\xeb\x98\xe4\x25\x9a\x21\x2d\xf4" - "\x58\xb7\x99\xec\xca\xef\x07\xd1\x66\x33\xd1\x9e\x80\xf6\x2b\x90" - "\x62\xdf\x0a\x2a\xfc\x25\xe2\x4f\xab\x44\x78\x98\x27\xcb\xa5\xd2" - "\x94\xf0\x3b\xc7\x54\xd3\x06\xdc\x49\xe9\x87\x98\x3d\xfd\x90\x68" - "\x97\x69\x5f\xca\x73\xdc\xf9\xaf\x40\x3e\xf1\xe7\x19\xd5\x34\x3e" - "\x3f\xbb\x1b\x79\x99\xe6\x7d\x87\x7f\xb3\xc2\x88\xf6\xe0\x69\x9a" - "\xbb\xc5\xb8\x2f\x3d\x4a\x48\x44\xbc\x54\x27\x6a\x0d\xf0\x06\x96" - "\x55\xad\x63\x0c\xcb\x38\x24\xcf\xa7\x61\x1d\xb4\x58\x97\x7e\xa9" - "\x1e\xaf\xf1\x7a\xec\x67\xa9\xcd\xc9\x88\x5f\x13\xc7\xe7\x94\x5c" - "\x07\xc4\xbb\x1f\x71\xca\x40\x3c\xb5\x84\x57\xb4\xb9\x3e\x9a\xef" - "\x3a\xab\xd2\xcc\x0a\x6c\x45\xba\xdd\x2c\xee\x77\x6d\x68\x13\xfd" - "\x0f\xeb\x55\xd8\x8e\xef\xfb\x2e\x41\xe2\xeb\x55\x90\xc2\x6c\xb7" - "\xb0\x1e\x8f\x0f\x9c\xe5\xfd\xa0\xd9\xce\xdc\xec\xef\xbf\x1a\x14" - "\x75\xd2\x64\x93\x6c\xf8\xdb\x17\xfa\x55\x54\x27\xd4\x15\x89\xed" - "\x97\x62\xce\x2d\xaa\xde\xb8\x81\x79\xd8\xbb\xa1\x36\x97\xe6\x63" - "\xa2\x09\xd9\x5b\xc3\xa8\xa7\x46\x9a\x34\xa8\x3b\xa7\xb9\x25\xdb" - "\xd8\xc3\xc6\xd6\x85\xd8\x52\x1a\xe2\x33\x4f\x0c\xd8\x6a\x19\x36" - "\x53\xf2\x7b\x91\x75\xa2\xfd\xb5\xb3\x30\x8f\x3b\x04\xbe\x37\x12" - "\x3e\xc1\xc4\x77\xb7\x5c\x8e\x18\x87\x6b\xc8\x26\x70\x23\x2f\xbb" - "\x63\x94\x97\xda\xb4\x9f\x9d\x72\x62\x78\xc3\x55\x50\x61\xda\x53" - "\xed\xfb\x09\xbe\xb6\xc8\xa5\x9a\x7a\x9c\xe0\xef\xbe\x01\xa0\x1e" - "\xd3\x0c\x37\x4d\x73\xd3\xfc\x2e\xc6\x61\xff\x1f\x1b\x8c\x9c\xb3" - "\x96\xf8\x79\x49\x04\x3f\x1b\x9b\xc8\x26\x6c\x46\xf8\xc8\x43\x0d" - "\x97\x51\x0f\xe3\xf7\xbc\x66\x48\xa3\x72\xf0\x9d\x64\xd3\x49\x84" - "\x79\x52\x2e\x8f\x21\xff\xef\x0b\x88\x39\x18\x89\xb7\xd2\x9d\xe6" - "\x41\x5a\x17\x61\x27\x50\xbe\x13\x8e\xc4\x63\x98\xc7\x27\xf3\x14" - "\xf2\xfa\x29\xce\x57\x29\x90\xc6\x9a\xb4\xd6\xf6\x64\x4c\x87\x7c" - "\xd5\x86\xfc\x44\x7c\x35\xd2\x94\x94\x26\xf3\x14\xf2\x5a\x1f\xa5" - "\x43\x1c\xa6\x74\xee\x30\xaa\x48\x46\x0e\xa8\x92\x0e\x10\x8f\xb1" - "\xb7\x1e\xe9\x67\x37\xae\xed\x17\xed\x94\x74\xc0\xe9\x15\x6d\x10" - "\xa4\x7b\x92\x29\x84\xee\x7d\xc8\xc7\x53\x88\xce\x7c\xae\x1a\xd3" - "\x23\x6e\x7d\xdc\x16\xdf\x89\x6d\xc0\x75\x55\xd2\x3a\xca\x2f\xd1" - "\xb0\x3b\x48\xc3\xa4\x63\xd1\x68\x18\x41\x3b\x15\xfd\x58\x53\x52" - "\x17\xf5\x15\xcc\x33\xe4\x52\x69\xf7\xc6\x5a\x2b\xc0\x32\x54\xaa" - "\x66\x50\x53\x19\x5d\x29\x94\x3e\x79\x66\xb4\x32\x22\xf9\xb8\xab" - "\x03\x80\xe6\xc2\x29\x5f\x6a\x0a\xd1\x35\xb9\x30\x6a\xfb\x6e\x08" - "\xc3\x8d\xff\x58\x53\x72\xc9\x1b\xc9\xc8\x37\x1c\xbf\xe4\xbd\xd7" - "\xc2\x2f\x55\x2f\xf4\xa2\xe3\x56\xe2\xe7\xe4\xdf\x39\x5b\x00\x28" - "\x4c\xfa\x3e\x3a\x8c\xba\x26\x72\x3e\x3f\xe6\xfa\x82\x6a\x7a\x7c" - "\xd8\xfa\x82\x2a\xd9\x13\x6b\x7d\x21\xbc\xdc\xe9\xcb\xa9\xdc\x40" - "\x7b\xa1\x22\x58\xf6\xf4\xf4\x40\x94\xb2\xe5\xfc\xf3\x3a\x42\xc6" - "\x2f\xaa\xe9\x8d\x84\x43\x2f\xea\x25\x76\x53\xa1\x82\x21\x9c\x2e" - "\x6e\x4b\x4c\xb7\x0b\x7b\x85\xec\xa0\xe9\x26\x4a\x13\x59\x8f\xf1" - "\x3f\x75\x0a\x8d\x87\xe1\x2a\xff\x88\x7f\x10\xe8\x36\x72\x98\x51" - "\x2e\x47\x2b\xc3\x12\x03\x8b\xf2\x91\x08\x70\x13\x4f\xcf\xf0\x4f" - "\x04\x49\xdf\x6e\xfe\xa1\x1a\x4f\x3f\x1e\xff\x1f\xf8\x9b\x2c\xf0" - "\xe5\xf0\xbc\xa0\x90\xca\xdb\x13\x92\x22\xeb\x1a\xb9\x19\xc8\x59" - "\xa2\xfd\x6d\xc6\x9f\xb5\x10\xdb\xf2\xa6\x43\x3c\x31\x63\x3e\x09" - "\xbe\xfc\xcd\x42\xbf\x29\x24\xfc\x1b\xff\xe2\xd6\x85\x14\x70\x4b" - "\x5c\x29\xdf\xce\x75\xf3\xc9\xf1\x20\x65\x87\x36\xbc\x50\x6b\x3c" - "\x7f\x68\xe8\x1f\x33\xc2\x4b\xc3\xf8\x9b\x82\xe9\xe3\x3c\xbb\x42" - "\x12\xff\x93\x40\x7f\x56\xec\x3a\x7c\xf7\xbf\x9b\x43\xde\x6f\x11" - "\x8f\x99\x8e\xef\xb3\x80\x6b\xfe\xe9\xfb\x26\xcb\xaf\x41\xf6\x98" - "\x95\x1d\x2d\x69\x90\xfe\xb3\x64\x7a\x87\xb5\x67\x30\x7e\x76\x6a" - "\xf8\xf7\xad\x5d\xe1\xdf\xa9\xbe\xef\x03\x75\x07\xfd\x63\x71\x25" - "\x01\xdc\x16\x6c\x2f\x4d\x44\x97\xd1\xd8\x23\xba\x50\xf0\x4f\xc2" - "\x26\x0e\xe0\xf6\x82\x90\x60\x55\xf4\xd4\xff\x77\xfe\x66\xec\x92" - "\x08\x78\x8b\x5b\x3b\x21\x32\x32\x8c\xbe\x27\xe9\xa5\xb0\x05\x9f" - "\x4d\x48\xcf\xc3\xf4\x21\xdf\x0a\x23\xfe\xd3\x81\x19\x0b\xbf\x0f" - "\x5c\x7f\xf8\xfb\xff\xe1\x9f\x82\xfa\xc7\x0f\x7f\xff\x97\xfe\x98" - "\xd0\xe2\x28\x89\xf8\x83\xfe\x63\xe3\x82\x92\x49\x11\x4c\x0a\x60" - "\xd2\xcb\xf7\xa2\xc7\x7f\xf8\xfb\xe1\xef\x87\xbf\x1f\xfe\x7e\xf8" - "\xfb\xe1\xef\x87\xbf\xff\x0f\xfc\x29\xf8\x38\x82\x49\x7f\xf2\xbb" - "\x88\xa3\x21\xd0\xfa\x01\x1e\x06\xc1\x78\x1c\xfb\xde\x0d\x0a\x35" - "\x4c\x52\x7d\x9f\x36\x9e\x7e\x1c\xa1\x6f\x91\xd8\x80\x3f\x5a\xef" - "\x5f\x84\xbf\x9b\x42\xc2\x6f\x8e\x9e\xfc\x2f\xf0\xa7\x40\x62\xc5" - "\xe1\x18\x30\x1e\x26\x41\x02\xa8\x61\x32\x4c\x81\xeb\x20\x11\xa6" - "\xc2\x34\x1c\x5b\x6a\x21\x09\x92\x61\x3a\xa4\xc0\xf5\x70\x03\xdc" - "\x08\x3a\xf8\x11\xcc\x40\xcc\x67\xc2\xac\xe8\x38\x5b\xc1\xa8\xc3" - "\x7f\xf0\xff\x02\x30\xf2\xef\x92\x1f\xc2\xff\xa2\xe1\x0e\x29\xbc" - "\x4f\x0a\x77\xfd\x10\xfe\x17\x0d\xd7\xff\x27\x3f\x67\xff\xa7\x3e" - "\x15\x28\x96\x85\x64\x56\x44\x95\x87\x91\xa1\x0a\xe9\x6f\xfc\x1b" - "\xbe\x21\xff\x04\x78\xe1\xf9\x23\xff\x8c\xf8\x5b\x2c\x5e\x2d\x00" - "\x62\x2e\x97\x85\xfe\x7d\xe3\xcc\x9c\xb9\x1c\x7f\x35\xf8\xb3\xe2" - "\x6f\x37\xfe\x1a\xf0\xf7\xb6\x0c\x47\xa4\x51\x03\xed\x3a\x00\xe8" - "\x3b\x02\xf0\x87\x01\xfc\x65\x03\xfc\x33\xa6\xff\x1f\x29\x00\xff" - "\x5a\x08\x70\xea\x28\xc0\xff\xf4\x04\x61\x0e\xd8\x83\xd8\x9d\xb1" - "\x8a\x77\x3d\xfe\xfe\x4c\x67\x7b\x91\x93\x2e\x0d\xe2\xe3\xd8\xca" - "\xc2\x6c\xfd\x82\x79\x8b\xe7\x2d\x5e\xa4\x9f\x5b\x30\x57\xbf\xd0" - "\x60\xb8\x6f\xbe\xe1\xee\xf9\x0b\xef\xd1\x2f\x5c\xb4\xe4\xee\x7b" - "\x96\x2c\xcc\xd0\xbf\xb4\xbd\xaa\x62\x81\xe1\xf9\x32\x7d\x65\x69" - "\x45\xb5\xfe\xb9\x8a\xaa\x97\xb6\xad\xaf\x2a\xfb\xa6\x2a\x7d\xd7" - "\x3f\x42\x6d\x56\x00\x38\xf5\xc3\x29\xad\x01\xd5\x4d\x2e\x50\xa5" - "\x77\xc2\x78\x8c\xc2\x2e\xcd\xe2\xa7\x49\xbf\xa8\x7f\x2f\x3d\xf5" - "\xf8\xe7\xb7\xaf\x9d\xf6\xdb\xe5\xcf\xdf\xbe\x2c\xf3\xfd\x86\x4e" - "\x50\xa6\x1e\x01\xe5\xcc\x22\x50\x26\xeb\x41\x39\xa9\x00\x14\xde" - "\x41\x50\x16\x1f\x07\xe5\x13\x18\x96\xa7\x05\xe5\x72\x03\x28\x17" - "\x1d\x9b\x18\x56\x79\x5a\x84\xfd\x6c\x26\x28\xdf\x3a\x0a\xca\xd7" - "\x30\x4d\x9d\x4a\x84\x1d\x33\x81\xf2\x43\x4f\x2c\x1c\xfe\x93\xfe" - "\xbe\x8d\x9d\x70\xed\x3f\x55\x4e\xf7\xf7\x80\xc7\x0f\x7f\x3f\xfc" - "\xfd\xf0\xf7\xc3\xdf\x0f\x7f\x3f\xfc\xfd\xf0\xf7\x17\xfe\xbb\xa4" - "\x54\xc1\x6f\xd1\x52\x1a\xb1\xa9\x75\x2e\xc5\x94\x23\xb4\x6f\x04" - "\xe8\x3c\x14\xa8\xb9\x7f\x17\xe9\x17\xba\xe7\x24\x31\xf3\x00\x00" - "\x9d\xe9\x7c\x63\x3f\x73\xd3\x79\xcd\xac\x0f\x00\xba\x52\x01\x68" - "\x1f\x0b\xc2\x59\xe7\x82\x8d\x2a\xb1\x67\x89\x79\x28\x9e\xf6\x3d" - "\x61\x78\x0d\x86\xd7\x5e\x63\x1f\x0c\xdf\x73\x45\x30\xb3\x66\x73" - "\x7c\x0e\x46\xc0\x21\x18\xc7\x30\xcc\x73\x0d\x18\x89\x32\x5e\x1e" - "\x25\x28\x08\xde\xb0\x0d\x74\x1e\x9b\xe3\x7a\xcc\xeb\xc1\x3a\xa5" - "\x49\x7b\x86\x86\x98\x0d\xe2\xba\xcc\x3e\x3a\x3b\xaa\x38\x0b\x93" - "\xbf\xc2\xa7\x12\x9f\xfc\xcc\xc3\x6e\x91\x2f\x95\x60\x60\x5e\xc5" - "\x88\x6d\xb2\x61\x3c\x2f\xc2\xe6\xe7\xce\x61\xf2\xc7\x1e\xa5\x43" - "\x29\xd2\x6a\x27\x4b\x69\x95\x98\x76\x9d\x9c\x56\xc4\x29\x73\xa4" - "\xb8\xeb\x30\xce\x1c\x1e\xa7\x6a\x92\xe2\x12\x31\xae\x39\x02\x3f" - "\x95\x73\xd4\x07\x58\x0e\xe1\xa2\x77\xe1\x93\xce\x2b\x49\xb8\x11" - "\x4e\x5d\x98\xde\x4a\xe9\xb3\xf4\xcc\x57\x88\xd6\x2a\xc5\x11\xed" - "\x30\x6d\xf6\x89\x0e\x91\x16\xdf\x67\x52\x7e\xe9\x5d\x4f\xfb\xa7" - "\xe8\x5d\x2a\x37\x69\xc4\x36\x25\x31\x1c\x27\x00\x29\x2e\x19\xe3" - "\xd2\xc2\xe3\x7e\x63\x90\xe2\x6e\xc4\xb8\xac\xf0\x38\x85\x9c\x4f" - "\x87\x71\x25\x72\xdc\xc4\xfd\x37\x38\x3c\x81\x78\x1c\xa8\x4c\xc2" - "\x5f\x82\x5a\x6e\xbb\x6a\x1d\x0b\x58\x7e\x44\xfb\xac\xe6\x7b\x03" - "\x36\x06\x4e\xb3\x17\xf4\x33\xc0\x72\x06\xa6\xf4\xd1\x3e\x9e\x7d" - "\x3b\x40\x6d\x31\x31\x2f\x9d\xc9\xef\x75\x0f\x81\xc5\xcd\x06\xe9" - "\xdc\x7b\xdd\x65\x50\x93\xff\xa6\xba\xcd\xa0\xeb\xaa\xfd\x53\xd4" - "\xbd\x43\x01\xf2\x23\x3d\x93\xf2\x0e\x40\x6f\xeb\x00\x58\x5a\xc3" - "\xf3\x5a\x66\x81\xae\x87\xce\xd0\xdb\x40\x43\x78\x74\xe9\x7d\xe0" - "\x4b\x9e\xef\xad\x7d\x1b\x54\x96\xd9\xa0\xec\x29\x75\x48\xb8\x5c" - "\xd7\x42\xb8\xd4\x9f\x03\xf5\xfb\xcf\x61\xdb\x9f\x23\x7c\xef\xf5" - "\x7e\xb4\xc3\xab\x3c\xa1\xcb\x85\x13\xba\xd3\xd0\xa5\x5b\x06\x5d" - "\xe6\x2c\xd8\x77\x0e\x12\x4f\x78\x97\x42\x97\xea\x41\xec\x1b\x59" - "\xe0\x1c\xc2\x77\xbd\x1f\xd3\x78\xf8\xb9\x8c\xb3\x70\xdd\x9e\xe6" - "\x17\x40\xed\x12\x30\xb1\x3d\xaf\x6b\x96\xcf\x18\xd0\x77\xb4\x7a" - "\x54\xff\x08\x74\x88\xdf\x20\xe2\x72\x1f\xe2\xd2\x93\xaa\x03\x03" - "\xe2\x9c\xe0\x6c\xf1\x81\xaa\x16\x26\xc7\xe8\x13\x29\xfc\x7c\x32" - "\xf2\x54\xdb\x7e\x36\x48\xbc\x35\xfc\x72\x11\xf6\xaf\x44\x15\x96" - "\x7d\x50\xda\xb7\x37\x64\x79\x0f\x54\xc3\xdb\x8a\x68\xbf\xf2\x00" - "\xc6\xe9\xe5\x38\x3a\x77\x4d\xe7\xa9\xe7\xa7\x80\xd6\xe9\x33\xc2" - "\xa7\xa3\x83\xb4\x27\x70\x88\xf6\x69\x12\x3c\x8d\x19\xe2\xb0\x3e" - "\xf1\x88\xcf\xd7\xed\x18\x7e\x1b\xa6\xc3\xfc\xd8\xfe\xbf\xe0\x67" - "\xee\xd9\x8d\x6b\x3d\x81\x1b\xd7\x5e\x0e\xbc\xb5\x76\x98\xbd\xb5" - "\xf6\x92\xff\xad\xb5\x5f\x5b\xb6\x83\xda\x7f\xe3\x5a\x77\xaf\x89" - "\xb7\x81\xb6\xd7\x74\x9e\xf6\xf7\xa9\x77\x9e\x07\xed\x33\x9b\xb1" - "\xed\x7d\x5f\xc0\xce\x0a\xd0\x05\x92\xee\xe9\x74\xfa\xfe\x05\x9e" - "\xa9\x05\x86\xef\x8e\x68\xf5\x1b\x4e\xce\xc8\x10\x3c\xab\xa6\x3a" - "\xf5\xbb\x54\xf3\xf8\xbe\x40\x77\x92\x31\x03\x7f\x4b\xf1\x67\xc4" - "\x5f\x16\x4b\xce\xc8\x42\x5a\x59\xa6\xed\x52\x00\x9d\x2b\x98\x1f" - "\x00\x05\x36\x91\x07\xf1\xd7\xc6\xa0\xdb\xcc\x40\x53\x9d\xe3\xaf" - "\xac\x50\x47\xfe\x08\x48\xa6\x90\x3c\x21\xf9\x32\x62\x9b\x6a\x74" - "\xa9\xe6\x1b\x38\xef\xef\x67\x1e\x96\x5c\xe7\xc0\xf0\x41\xcf\xcb" - "\xe5\x0a\xf7\xcb\xe5\xca\xe1\xe4\xba\x13\x98\xa6\x14\xd3\x94\x4b" - "\x34\x1c\x24\x58\xd8\x4f\xdc\x53\x7d\x10\x87\x30\x4d\xff\x70\xa5" - "\x5f\x75\x60\x3f\x3b\x8d\xe9\xf6\x8e\xc3\x42\xd8\x08\x07\xe9\x3f" - "\xb5\x43\x0e\x43\x5a\x0f\xbc\x8e\xe9\x28\xbf\xd3\x6b\x24\xb9\xeb" - "\x72\x6e\x1c\xa4\x7d\xb5\x53\xd8\x98\x28\x0f\xd3\xd0\x99\x4b\xf7" - "\x54\x2f\x4c\x1a\xb1\x41\x01\xc1\xa6\x7c\xce\xa1\x41\xc0\x7c\x27" - "\x98\xa5\x1c\xe5\x12\xac\x1a\x61\xe5\x0a\x3a\x63\x7f\x02\xf3\x8b" - "\xb2\xa7\xa9\x65\x1c\xa9\x0c\x7e\xc6\x9e\xf0\x44\x7e\x38\xb1\xd1" - "\x0b\x53\x5b\x20\x0e\xf3\xad\x21\x78\x04\x0b\xf9\xc0\x85\x75\x3d" - "\x71\x62\xa3\x1b\x02\x2c\x0c\xa6\x4b\x82\x57\x14\x06\x0f\xc3\x19" - "\xc2\x23\xfe\xeb\xc2\x3c\x53\x3b\x38\xbc\xd5\xff\x10\x20\x78\x5e" - "\x50\xe9\x39\xbe\x8f\x13\x0c\xee\x23\x03\x61\x3a\xb6\xae\x80\x21" - "\x98\xe6\x70\x5b\xca\xe3\xf8\xfe\x3e\xcc\xff\x51\xdd\x60\x3c\x1b" - "\x2e\x8a\x9b\xc6\xf7\xf6\xad\x00\xf2\x89\x81\x69\xde\x63\xc3\xe5" - "\x71\x53\x87\x40\x45\x38\xd3\xf9\x1e\xc2\x33\xb4\x2d\x57\xaf\x7c" - "\x7c\x19\x3c\x9e\x95\x93\xb5\x0c\xf2\x96\x67\x2e\x03\xc3\x7d\x73" - "\x0d\x8b\xee\xcd\x58\x04\x05\x4f\xac\x5e\x06\x05\xab\x96\xc1\x1a" - "\xfc\x15\x3d\x98\x83\x1f\x99\xcb\x16\x18\x1e\x9a\x5b\x90\x99\xb3" - "\x12\x1e\x2d\x5c\x68\x58\xb8\x10\x96\xaf\xcc\x5d\x60\x30\x48\xcf" - "\x05\x06\x4a\xf2\x54\xc6\xca\x35\x73\x0b\xaa\x36\xd5\x6c\x9a\xbb" - "\x2a\x27\x13\x56\xae\x5c\x56\x10\xa1\x1b\xd3\xfc\x57\xfc\x44\x5b" - "\x0f\xbb\x98\x4d\x3e\x14\xa0\x0d\xdb\x1c\x7f\x43\xfc\x6c\x06\x68" - "\x5f\x69\xa3\xb6\xe2\xf2\x72\xda\x69\xec\xe7\xaa\x11\x9b\x86\xda" - "\xff\x10\xd1\x8c\xfc\x18\x9c\x85\xeb\x0f\x60\xdc\x97\x92\x8c\x8e" - "\xc7\xf8\x23\xe1\xf1\x49\x56\x8c\xff\x33\xed\xf5\x77\xe2\x0f\xe9" - "\xec\x41\xd9\x87\xf4\x74\xc3\xb0\xa5\x28\x9e\x9f\xb5\xc4\x36\xa6" - "\x3d\xb0\x98\x77\x30\xa4\x8f\x0f\xd0\x5e\x59\xfd\x0e\x88\xbb\x00" - "\x9a\xcf\x7a\x6b\x8c\x74\x1e\x06\x9c\x35\x12\x8c\xcb\xe3\x30\xa6" - "\x48\xe7\x35\xe9\x1c\xf4\x29\x01\x47\x6b\x08\x91\x07\x2e\x82\xb3" - "\x0f\xe3\x04\x2c\x6d\x7c\x2f\xca\x05\xd6\x64\x50\x06\x2c\x69\xc0" - "\x92\x0d\x10\x18\x4b\xe3\x3a\x06\xf3\x95\xcb\x7c\xbc\x8f\xf6\xb8" - "\x9a\x30\xdd\xfb\xd9\x0a\xda\x23\xca\xf7\x8b\x82\xa6\x06\xf9\xd9" - "\x13\x68\x32\x66\xf3\xb3\xcc\x3c\x4c\x7b\x94\x25\xe3\x77\x93\x31" - "\x87\x59\xc4\xf9\x66\x0c\xfb\x3b\x0a\xc3\x36\x8e\xe3\xbe\x41\x5e" - "\xe6\xe1\x71\x48\x8b\x39\x88\x5f\xbf\x9f\xf2\x5f\xe4\xf9\x13\x30" - "\x6c\x32\xa6\xcd\x09\x24\x1b\x1f\x46\x9e\xa1\x30\xd4\xeb\xd7\x1f" - "\x47\x78\x8f\xd0\xd9\x72\xa6\xfd\xc4\x8d\xef\xb9\x8e\x1d\x43\xdc" - "\x3f\xa0\x0b\xe3\x02\x16\x84\x39\x36\x5e\x7e\x3f\xe5\xc5\xb2\x54" - "\x23\x63\xe5\xa8\x4b\xb5\xa7\xc9\x26\xf0\x13\x3e\x17\xc7\xd3\x9c" - "\xa4\x32\xa9\x3f\x63\x5b\x0c\x61\x3b\x4d\x1e\xb1\x25\x15\x46\xb4" - "\xd3\x46\x84\x93\x83\x74\xef\x47\x18\x5d\x81\x61\x2c\x03\xbf\x11" - "\xae\x52\x82\x2b\xc3\xf0\x08\x3e\x48\x6a\x8e\xe0\x83\x5d\x08\xfb" - "\x72\x48\xfc\xd1\x88\xf8\x32\x8c\x1f\x95\xe2\xb1\x5f\x25\x9d\x8a" - "\x28\x9f\x70\x0b\x60\xf9\x1e\xec\x37\x71\x58\x5e\x51\x1b\xd9\x6b" - "\xe3\xe9\x93\x55\xe1\xe9\x93\xd1\x36\xd0\x90\x2c\x21\x99\xc8\xd3" - "\xb7\x4b\xbc\x2a\xca\x4f\x5e\x1c\x91\xde\x87\xe9\x13\xc8\x07\x07" - "\x3e\xa7\x63\x9a\x04\x94\x49\x2a\xd4\x1f\xa7\x4f\xd4\x92\xfd\x96" - "\x5c\x1a\x91\xbe\x1e\xd3\xcd\x20\x3a\x72\x1a\x5c\xe4\x34\x28\x92" - "\xec\x2d\xea\x0b\x6a\xcc\xd3\x12\x91\xe7\x18\xe6\xb9\x35\x20\xe8" - "\x16\x37\x32\x1c\x35\x4f\x77\x44\x9e\x21\xde\xfe\xa2\x1c\x15\xf1" - "\x8b\x9c\x87\xcb\x98\xb1\x30\x18\x54\x37\xb4\xcb\xa6\x6b\xc3\x61" - "\xa4\x0c\x61\xb9\x77\xbe\x2e\xfa\xf1\x75\xd8\xe6\x0b\x31\xec\x0b" - "\x84\x9b\x47\x7c\x42\xbc\xec\x74\x7b\x51\x06\x66\x27\x0a\x5d\x3e" - "\x7d\xb3\xa6\x16\xe8\x7d\x2e\xbd\x13\x6c\x36\x96\x2b\xf1\xf8\xf4" - "\xcd\xf8\xa4\x70\x5e\x26\xf5\x2d\x36\xf6\x48\x40\xc0\x9c\xfe\x26" - "\xf6\x41\x25\x7e\xfb\xa5\x32\xfe\x85\xce\xf9\x22\x7f\x3e\x8c\xf2" - "\x15\xe8\xac\x32\x86\x2f\xc6\xf0\x1e\x29\xfe\x77\x94\x1e\xdf\x17" - "\x48\xef\xc4\x97\x0f\x4b\x7c\x89\x7c\x9e\xc2\xcf\xa6\x0a\x5e\x17" - "\xf9\x03\x82\xaf\x33\x31\xee\x97\xf8\xcc\xc1\xe7\x9b\xf8\x7c\x14" - "\x9f\x9b\xc9\x37\x83\xc5\x8f\xf6\x84\xf8\x7e\x1a\x9f\xab\xf1\x99" - "\x83\xcf\x35\xf8\xbc\x9b\xfa\xa5\x7b\x5b\x39\x44\xf0\xc4\x50\x40" - "\xf4\xc5\x04\xd1\x1e\x29\xa9\x52\xff\x10\xfd\xf3\x62\x30\x8c\x89" - "\x30\x25\xca\xf5\x60\xd8\x58\x36\xd1\xa5\x00\xe1\x73\x5f\x22\x52" - "\xbf\x8e\x17\xed\x22\xd2\x04\x44\x3e\xa9\xed\xa4\x30\x91\x4e\x11" - "\x5a\xa6\x0b\xa6\x9f\xaa\xf3\x30\x86\x4f\x07\xf7\xeb\x00\x29\x5d" - "\x48\x13\xb4\x6b\xa6\x37\x13\x9d\x82\xed\x3d\xdd\x10\xd2\xde\x68" - "\xd7\x5e\x0f\x11\x7d\x69\x31\xb6\xf7\x52\xde\xde\x48\x3b\x19\x67" - "\xc2\x1f\xf5\x0b\xe9\xac\x49\xa2\x0e\xda\x22\x94\xed\x43\x41\xd9" - "\x7c\x7d\x76\x38\x1c\x6d\x11\xe6\x39\x2e\xe9\xb2\x71\x3e\x23\x7e" - "\x89\x33\x51\x1f\xba\x1e\xed\xff\xcf\xba\xf9\x19\x1f\x8c\xf3\x24" - "\x59\x8c\x54\x66\xdc\x46\x1e\x87\xf6\xff\x75\xfd\x72\x1c\x88\x73" - "\x54\x9e\xb8\x1a\x1e\xd7\x29\xe7\x43\x39\xab\xe7\x79\x51\x3f\x92" - "\xbd\x40\x7a\x1f\xf5\xef\x20\xa6\x39\xe5\x82\xa9\xda\x98\x3e\x8c" - "\xec\x06\xed\x5c\x2b\x28\x6f\xb3\x42\xbc\xd3\x77\x1a\xf2\x7d\xcc" - "\x3f\x17\x60\xb2\xd3\xb7\x14\xe6\x00\x24\x39\x7d\xa7\x68\x92\x7c" - "\xb6\xd3\xd7\x8c\xfa\xb5\x9e\xe2\x3f\xbd\x13\x14\x0a\x7c\x5a\xee" - "\x02\xa5\xc2\xe9\x3b\x88\xe1\x47\xe1\x36\x50\x29\x1e\x8a\x67\x23" - "\x4e\xdf\x62\xfc\xae\x81\x07\xe3\xd9\x1f\x8b\xfd\xa0\xcd\x7d\x85" - "\x59\x9c\xbe\x52\x78\xf0\x95\x00\x73\xfa\xba\x31\x6e\x23\xe4\xfb" - "\xaf\xb2\x7c\xff\x08\x63\x5a\x83\x3e\xdf\x7f\x11\xdf\xff\xc8\x90" - "\x6e\xf8\xfc\x14\x7f\x16\xe6\x44\x3b\x99\x35\x1a\xb4\xc5\xdb\x95" - "\xc0\xef\x38\x4a\x32\xe8\xb1\x7e\x86\x31\x56\x1e\x87\x7a\x64\xfe" - "\xd8\x18\x3e\x9b\x0c\xf3\xf8\xb7\xdd\x60\x44\x38\x86\x79\x38\x68" - "\x20\xfc\x9d\xbe\x01\x28\x46\x79\x93\xbf\xdd\xcd\x08\xf7\x69\xbb" - "\x18\xe4\x6f\xff\x94\xa1\xac\xd3\xe4\x6f\xb7\x30\x8c\x53\x23\x3c" - "\x83\xd3\x37\x44\x65\x18\x11\xde\x32\x0e\xcf\x6e\x28\xc1\xb4\x6e" - "\x4a\x17\x0a\x87\x60\x50\xda\x7c\x3f\xf9\x90\x32\x94\x8c\x35\x1a" - "\x0a\xf0\x67\xc2\x5f\x07\xe6\xfd\x9b\x80\x2d\xe5\x33\xd2\x6b\x98" - "\xdf\x81\xdf\x7d\x57\xb9\xff\x85\xd3\x94\x3e\x01\xd3\x93\xfd\x91" - "\x35\x22\xf0\x75\x73\x7c\x9b\x0c\x17\xaf\x8a\x7a\x5c\x90\xea\x71" - "\x9e\xc2\x3d\xc8\xeb\xac\x69\x81\xd6\xc3\xe3\x16\x68\x30\x5f\x21" - "\xcf\x67\x5f\xa0\x65\xda\x05\xe4\x07\x35\x2e\xdf\xcf\xac\x44\x43" - "\xa4\xab\x95\xe8\x48\x63\x1e\xd6\x88\xf1\x49\x0b\xf4\x63\x8d\x0b" - "\x0c\x98\x7f\xc5\x18\x23\x5d\xbb\xa0\xe0\x2a\x87\xbd\x20\x1f\xe1" - "\xac\x1b\x21\x98\xda\x05\x05\x08\xab\xc4\xa7\xd4\x23\x3d\x98\x37" - "\xdf\xb7\xcb\x57\xbc\x9d\x7c\xa4\xfc\x0e\xd2\xac\x56\x85\xd3\x5c" - "\x83\xf5\xdc\x8b\x30\x4b\x31\x1e\xa6\x63\x59\x9f\x22\xdc\x02\x2a" - "\x0f\xcb\x28\x41\x98\x4f\x23\xac\x52\xc2\x69\x94\xfc\x90\x26\x2f" - "\x30\x8d\x0a\xfc\xec\x01\xfb\x82\xce\x80\x76\x41\x87\xcc\x3f\xc4" - "\x3b\x82\x6e\xc4\x33\x1f\x52\x98\x56\xe6\x13\xbf\x7d\x81\xf5\x2e" - "\x00\xed\x2a\x0f\xf3\x11\xaf\xcc\x07\x93\xa2\xd7\x73\x0a\x69\xad" - "\x86\x5e\xd3\x51\xb8\x13\x68\xec\xe5\x81\x5e\x4f\x33\x7e\x1f\xe0" - "\xf7\x9b\xf7\x7a\xea\xa1\x67\xe8\x20\xac\x32\x79\x76\xf9\xb5\x0b" - "\xf1\x3d\x0f\x30\xff\xa7\x74\xc7\xd6\x33\x26\x95\xb5\xd7\xe4\xa1" - "\x6f\x4b\xcf\x10\xf2\xa7\x9f\xf9\x7d\xf6\x05\x26\x9f\x76\xa1\x76" - "\xd5\x65\xe6\xce\x1b\xb2\xc6\x63\xd8\x98\x46\xc1\x7c\x1a\xb3\x85" - "\xf5\x0c\xed\x85\x67\x2e\x83\xa2\xa7\xfc\x28\xe7\xd3\x67\x4c\x26" - "\xe0\xf9\x2f\xfb\x34\x4f\x0f\x59\xe1\xe9\x72\x98\x86\xe9\x2f\x12" - "\xcf\xb2\x69\x56\xe8\x1e\xd8\x08\x79\xe7\x7d\x71\xab\x2e\x8f\xb1" - "\xee\x92\x66\xe8\x29\x6f\x26\x7a\xd8\x69\x8c\x92\x77\x7e\x98\xad" - "\xba\x3c\xc2\x7a\xca\x3f\x84\xee\x92\xa3\x90\xfb\x27\x87\xc6\xdf" - "\xb8\xc0\x1a\x48\x5a\xd0\x11\x68\x5c\xd0\xe9\x4f\x5a\x08\xbe\x46" - "\xc4\x25\x69\xa1\x96\x35\x2d\xb4\x22\xfd\x26\xf3\xb6\x48\x5e\x58" - "\x87\xef\x7a\xde\xbe\xda\x85\x76\x66\x5f\xd8\x39\xd6\xb8\xb0\x83" - "\xf3\x7d\xd2\x42\xbb\xd3\x47\xfc\xbf\xb0\x13\xd3\x75\x0a\x1e\x59" - "\xe8\x10\xbc\xbf\xf0\x53\x6a\x57\x4c\xdb\x87\x3f\x17\xfe\xd0\x66" - "\x59\x64\x44\x58\x49\x04\x37\x60\x5f\x54\x10\xd0\x2e\xc2\xfe\xb0" - "\xa8\x04\xc7\x34\xca\x5e\xcf\x41\x20\xbf\xbc\xbd\x1e\x3f\xac\xda" - "\xec\xc5\xb6\xc5\x36\x30\xfb\x91\x9e\xa7\xe1\x99\xcd\x60\x71\x9a" - "\x4f\x03\xfb\x8d\x9d\xe8\xa1\x59\xb5\xf9\x53\x16\x68\x5c\x54\x40" - "\xf1\xab\x36\x5b\x70\x5c\x85\x70\x92\x16\x95\x04\x9a\x16\x59\x25" - "\xfb\x0a\xf1\x58\x64\x21\x3c\xc6\x46\xd2\xe8\xfc\x9b\x0a\xe3\xed" - "\xac\x69\xb1\x92\xf4\x4d\x80\xf8\xce\xbe\x18\xed\xa8\xc5\x25\x79" - "\xf1\xcc\x4d\x3e\x75\x89\x07\x02\xf7\x33\x46\xe3\xb6\x62\x33\x74" - "\xf0\x3e\xe5\x9f\x61\x65\x49\x8b\x4b\x58\xe3\x62\x1c\x83\xdc\xf3" - "\x33\x84\x13\x47\x3e\x91\x99\xfd\x9e\x0e\xc1\x33\x5f\xf0\xbe\xc7" - "\x1a\xef\xe9\x08\x9f\x23\x88\x3e\x3f\x30\x62\x9b\x71\xd4\x05\xbd" - "\x7c\x6c\x81\xef\x0e\x17\x38\x97\x4a\xef\xdd\x2e\xf8\x1b\x3e\x4f" - "\x44\x32\xce\x54\x07\xd7\x9f\x83\x9b\xac\x48\x0f\xc0\xf7\x44\x7c" - "\xaf\xcf\x9f\x83\x75\xb6\x1f\x4e\xc3\xf6\x1e\x21\x79\xc3\x6c\x8b" - "\xd1\x3e\x01\x23\xd6\x55\xcd\x46\xc8\x37\x74\xe6\x6a\xf2\x0d\x4d" - "\xbe\xa0\xf1\x7b\x1a\xd2\x34\x15\x9f\xc9\x07\xae\x40\x0a\xfe\xc8" - "\x1f\xac\x95\xe4\x31\xbe\x1b\xd8\x36\xdd\x94\x7d\x5b\x21\x5d\xe3" - "\x11\x3e\xa0\xc9\x67\x35\xda\x3d\x29\xf4\xce\x6c\x7f\x9f\xd6\x7e" - "\x45\xf2\x03\x9d\x84\xe5\x91\x1f\xe8\xea\x34\x68\xaf\xe2\xbe\xe9" - "\x74\xed\x36\xd6\xe9\x1f\x49\x53\x12\x9e\x32\x2e\x84\x1b\xe2\x39" - "\x0b\xf1\x6c\x7e\x6c\xbb\x91\xdf\xff\x15\x4d\x7e\x8f\xd8\x6e\x1a" - "\xaf\x7f\x8c\xf8\x53\x32\x4d\x62\xc4\x7b\x64\x3a\xc5\x9a\x27\xa0" - "\x3e\xee\xbf\xc2\x86\x1a\x2a\xc5\x79\x3b\x8b\x8f\xfd\xbf\x38\x86" - "\xb1\xd6\xe1\xd8\x3c\xdf\xec\x65\x4e\x37\x73\xd0\x5d\x76\x34\x0e" - "\x6e\xc7\x34\x75\x3e\x16\xa0\x71\x31\x8d\x89\xc9\xb7\x5b\xa0\x31" - "\x73\x31\x6b\xcc\x34\x0c\x6f\x65\xbe\x36\x3e\x8e\x9d\x59\xee\x82" - "\xfb\x4b\x44\xdb\x2c\xb0\xa3\x1e\x1c\x18\xd6\x66\x1a\x10\x76\x12" - "\xc1\xee\x35\x31\x47\x20\x29\x33\x03\xd3\xd9\x5d\xf0\xf9\xc1\xd0" - "\xb9\x3e\xd4\x69\x43\xf5\xfb\x49\xaf\xcd\x3c\xe2\x82\x5b\xf6\x4c" - "\x98\x4b\x12\xab\x97\xd6\xb0\x73\x17\x0a\x08\x3f\x45\x42\x27\x36" - "\x8c\xd1\xa3\x83\x7a\x71\xa1\x96\xfc\xdd\x59\x76\xc2\x4c\x6c\x87" - "\x9b\xce\xc1\xac\xd9\x16\x33\x3b\xcb\x6c\x33\x8f\xbd\xbf\xc3\x8b" - "\x36\xc4\xac\x74\x17\xbc\xd7\x1f\x8b\x6e\x81\x2b\x6c\x00\xeb\xd6" - "\xd9\x80\x76\x20\xd5\x9b\xe8\x96\x6f\x66\x01\xac\xdf\x97\xd4\xc7" - "\xda\xb7\x92\x2d\x3c\xcb\x24\xd3\x21\xd6\x19\x40\x66\xcf\xcc\x12" - "\xf6\xe2\xac\x3e\x66\x63\xe0\xb8\x99\xe6\xfe\x66\xfd\x81\xdb\x4c" - "\xf6\x85\x1d\xc3\x28\x3f\x68\x8e\x84\x7c\xd3\x55\xeb\x98\x17\x61" - "\x76\xb9\xe0\x0e\x83\x34\x26\xf3\x38\x7d\x2b\x49\x96\x74\xc4\x9a" - "\x5b\x0d\xc2\xbf\xd9\xdd\x3b\x93\xee\x13\x44\xb9\xa3\xb5\xd4\xd7" - "\x89\x76\x26\x3f\x16\x1e\x3a\xe3\x3a\x80\xf1\xd5\x1e\x36\xc8\xec" - "\x16\x33\xd9\x1f\x74\xde\x0e\xc3\xbe\x46\xfe\x65\x8e\x2a\xc2\xe9" - "\xe6\xaf\x1d\x37\x8f\xc2\x59\xb4\x07\xe9\x4c\xab\x18\x9f\xdd\x7c" - "\xfa\x44\x0d\x48\x63\xbe\x9b\xd7\xb9\x20\xad\x5b\xc6\x0b\x65\x06" - "\x43\xda\x12\x9d\xed\xa4\x5f\x69\xde\xad\xba\x96\x79\x11\x57\x3b" - "\xa6\xdd\x23\xd7\x81\xea\x27\xea\x75\x73\x6b\x68\xbd\x10\x07\x37" - "\xda\xd6\x9c\x06\xd5\xdb\x41\xcd\x7d\x65\xf9\x49\x77\xac\xe4\x75" - "\xa1\x3a\xf3\xba\xa0\x5d\x41\xfa\xc4\xe9\xbb\x1b\xed\x2e\x1e\xde" - "\x89\xb0\x70\xfc\xfb\x57\x19\xc2\xa6\xba\x39\xf6\x7d\xb0\xda\x05" - "\x25\x96\xab\x70\xb3\x25\xc0\xce\x9c\x85\x5b\xb6\x20\x9d\xe2\xe8" - "\xc9\x75\xb1\x17\x79\x57\x9b\x93\x42\x3a\xd8\x59\x7b\x19\xe5\x36" - "\x4f\x3b\x1d\xd3\x0e\x60\x9a\x32\x29\x6d\x99\x98\x13\xe6\xcf\x04" - "\x7a\xa2\x4e\x7e\x1a\xf9\xb6\x96\xe6\x31\x90\xce\x46\xf9\x9b\xe1" - "\x37\x3e\xb1\x9f\xe4\xa4\x44\xc7\x65\x71\x49\x40\xea\x87\x58\xce" - "\x8d\xc4\x47\x96\xed\xf0\x23\xe4\xc9\x2f\xeb\x76\xc2\xf5\xc4\x63" - "\x2c\x29\xb3\x40\xd0\xfd\x96\x93\xcc\x66\x05\x3a\x1f\x6b\xda\x0a" - "\x37\x61\xdf\xcb\x3e\x07\xb7\x7c\x51\x5c\xab\x47\x5c\x01\x1a\x2e" - "\x00\xe9\xc9\x3f\x62\xfa\x5c\xa7\xef\x4f\xe4\xd7\x1f\x79\xf1\x16" - "\x9f\xcc\x8b\x23\x36\xbd\xfa\x5a\x32\x01\xe9\xea\x12\xe3\x0a\xfd" - "\x16\x9a\x63\x3b\x03\xfa\x12\xaa\x2f\xfe\x14\x18\xf6\x28\xbb\xc2" - "\x66\x92\xef\x42\xa4\x75\x9f\x0b\xf4\x7b\xf1\xe9\xe2\x3f\x1b\x58" - "\xa5\xef\x3e\x4c\x67\x64\x57\xfc\x94\xc6\x85\x61\x28\x23\x15\xd4" - "\x4f\x5a\xb1\xec\x7a\x17\x2c\x37\x8b\xb6\xd1\x17\x10\xac\x18\x38" - "\xf4\x31\x7e\xde\xf4\x12\xd6\x57\x7f\x5e\x5f\xa7\x20\x3c\xb8\x2f" - "\x23\x82\xd5\xae\x14\xb2\x39\x80\xb8\xb6\xd9\x02\xe5\x28\x87\xcb" - "\x03\x4d\x8f\x88\x77\x29\x8e\xf0\x08\x60\xf9\xd1\xe1\x5b\xea\xb9" - "\xbf\x53\x98\x9d\x2d\xe0\x58\xcc\x8e\x19\xe7\xe8\x9b\xfb\xdb\xf2" - "\x68\x73\x5d\xce\x16\xa3\xf0\xc1\x8a\x69\x84\x9d\x3f\x3b\x67\x18" - "\xcb\x18\xb1\xcd\xce\x76\xc1\x9d\x6a\x31\xdf\x98\x1b\x15\x3e\x9d" - "\x87\xa6\xbe\xd3\xd3\x0a\x52\x9f\xbe\x2d\x9e\xe6\x3c\xb0\x5e\x0e" - "\xb4\x71\x5c\x92\x9c\xa5\x31\xd8\x75\x67\xe0\x36\x55\x6f\x39\xe7" - "\x6f\x25\x53\xce\x3e\x14\xe6\x43\x11\xe3\x26\xfe\x66\xf7\xe3\x6f" - "\x10\x7f\x1e\xf1\x8d\xc8\xc1\xad\x88\xc1\xad\xa5\x9c\x6e\xc3\xa5" - "\x38\x26\xba\x4d\x15\x48\xc2\x36\xb1\x53\x1b\xcd\x76\xb1\xe1\x54" - "\x25\xda\x22\xfc\xbd\x7d\x33\x8d\x2d\x6e\x4d\x44\xfa\xb7\x88\x76" - "\x20\x18\xa0\xc0\xbe\x48\x34\x67\x96\x16\xe6\xed\xaa\xf3\x20\xce" - "\xb7\x2e\xed\x6a\xf1\x80\xfe\x0e\xaa\xfb\xad\x46\xaa\x8f\x07\x69" - "\x4f\xcf\xea\x16\xe6\x3e\xd1\xea\x03\x9a\x97\x46\x58\x45\x2e\xb0" - "\x65\x89\x71\x8a\xa5\x93\xe0\x49\xfc\xc0\xe4\xba\x0b\x1a\xe7\xba" - "\xf4\x5b\x15\x04\xeb\x03\x9a\x93\xa0\x31\x53\x70\xae\xe7\xd6\x03" - "\xd8\xc7\x1f\x20\x3f\xaa\x17\xe0\x56\xee\xa7\xf0\x44\x39\xf7\xd3" - "\x36\x74\x80\xeb\x83\x5b\x8f\x23\xbe\x5e\xc9\x1f\xc5\x10\x9d\xb5" - "\x27\x78\x38\x8e\x1a\xec\x29\x77\x03\xda\x62\x2e\x7e\x16\x1f\xdb" - "\x67\xe7\x10\xf3\x7e\xba\xd5\xab\xe2\xe5\x57\x72\x1f\x69\x1e\xf2" - "\x29\xcb\xb0\xad\x70\xdc\xeb\xc5\xb2\x6a\x22\x7d\x7d\x86\xf8\x92" - "\x95\x70\x4e\x9d\x7c\x22\x95\xcb\x4b\x47\x00\xe9\x12\xde\x5e\xa9" - "\x6a\xd1\x56\xb7\x15\x86\xb7\x55\x2a\xda\x2e\xb7\xb5\xe0\xaf\x13" - "\x7f\x0e\xf1\x1d\xfa\xbb\xad\x3e\xe4\xbd\x6f\xc4\x76\x1b\xea\x3f" - "\x7d\x8a\x68\x03\x0a\x43\x1c\x89\x37\xbe\x46\xfd\x32\x46\xfe\x7d" - "\xcf\x03\x85\x13\x1f\x53\x78\x00\x6d\x15\xa4\xed\x41\x8c\xd7\x52" - "\x1f\x25\xdf\x76\xa1\xf1\xe3\x3e\x4c\xe0\xb6\xcb\x7c\xce\x61\xd7" - "\x9e\x3d\xc4\x9f\x98\xe7\x90\xc6\xb7\x67\xcf\x88\x2d\x15\x64\x1a" - "\x62\xd8\x20\xc5\x47\xb7\x19\x52\xd3\xc6\x6d\x2b\xb4\x37\xa9\x7d" - "\x86\xe0\xf6\xc5\x28\x97\x50\x1e\x3f\x22\xce\xe7\xc3\xed\x77\xd3" - "\x37\xca\xc3\x2f\xf1\xdd\xd0\x83\x72\x67\xb4\xc9\x98\x31\xa6\x84" - "\x84\x51\x25\x18\x7d\x4d\x87\x73\x7d\xc9\x19\x59\xce\xc1\xa3\xd0" - "\xeb\xfb\x1b\xd0\xbf\xc0\x61\xcc\x21\x7f\x8a\x96\xed\xcc\xff\xd1" - "\xe8\x21\x1c\x7b\x5d\x74\x70\xbf\xc9\x70\x3b\xaf\xfb\x6b\x67\xc4" - "\xdd\x21\x67\xa5\x6f\xa6\x3d\x9c\xb6\xef\x39\xe6\xdb\x77\x96\x7c" - "\x2c\xe8\xa6\xbc\x3e\x0a\xe9\xef\xec\x00\x43\xeb\x28\xa4\xb6\x8d" - "\x42\x1a\xfb\x33\xdd\xad\x11\x28\x7a\xe6\xb2\x16\xb0\xdf\x17\x4d" - "\x33\x81\xba\x6d\x07\xda\x61\x3e\x50\xf8\x1b\xd1\x0e\xa3\x3b\x46" - "\x2e\xa6\x91\xfc\x1b\xb7\xc3\xc6\xc6\xc8\x0e\xcb\xe4\x3e\xf3\x50" - "\x6e\x1e\x9b\x5a\x0e\x8a\xc4\x12\xd0\x22\x7e\x96\x0b\x90\x5a\x91" - "\x38\x80\x36\x20\xd6\xd9\x25\xd5\x17\xe9\x5b\xab\x29\x87\x04\x5e" - "\x57\x94\xc9\xac\xf1\x91\xfe\x98\xba\x56\x49\xbc\xe3\xa1\xfe\x41" - "\x75\xd8\x45\x6b\x22\x47\x67\x78\x55\xd5\xad\xcc\x4b\xe1\x35\xb3" - "\x89\xf7\x6e\x2f\xa7\xb2\x3b\x31\x7c\xc4\x76\xbb\xdd\xa5\x4a\x4f" - "\x89\x25\x87\x35\xbb\x64\x7b\xe0\x8e\x24\xa6\xb4\x22\x2f\x2e\xb2" - "\xee\xf4\x31\xb7\xf3\x02\xf5\xcd\x3b\xb4\xf9\x1b\x99\x4f\x5f\x49" - "\xeb\x53\x77\x00\xad\x9d\xd1\x9c\xf9\xaf\xd1\x76\xf9\xa6\xf5\x32" - "\xd2\x09\xac\x71\x91\x5d\xb3\x11\x61\xa2\xfd\xcf\x2c\x69\x51\xce" - "\xcb\x47\xb7\xc7\x69\xad\xf5\x0d\xbe\xae\x7b\x47\xae\x0b\x0a\xbc" - "\x92\xdf\xc4\x21\x21\x1f\xff\x2a\x9d\xc6\xf9\xe1\xfd\xfa\xaf\x80" - "\xce\xff\x0f\xdb\x8d\x5d\x8e\x9b\x49\x96\xdf\x71\x55\xd8\x36\x46" - "\x87\x90\xed\x77\xfc\x9b\x98\xa3\xbb\x03\xf5\xff\x3d\x89\x04\xcf" - "\x74\x2b\xf1\xc4\x1d\xa7\x58\xb2\xf1\x04\xa5\x9b\x67\x05\xeb\x26" - "\x1f\xe0\x98\xc2\xe8\x60\xbc\x5f\x5c\x00\xf6\xd6\x8b\x23\xb4\x26" - "\xeb\xb9\x71\xed\x08\xea\xfa\x74\x8c\xeb\xa2\x32\xdc\x98\x06\xe9" - "\x3e\x59\xac\xad\xdd\xe1\x76\xc1\xe2\xa5\x82\xdf\xef\xe8\x12\x73" - "\x47\x77\x74\x0d\x63\x5e\xb4\xfd\xa6\x8f\xd8\xfe\x4a\xeb\x82\xbc" - "\x6e\xc9\xfe\xe4\x6b\xda\x18\x96\xea\x82\x7c\x3e\x9f\x52\x33\x1b" - "\x74\x35\x7a\x36\x18\xd3\x76\x0b\xab\x67\xda\x2f\xf9\xba\xb3\x12" - "\x6e\x44\x18\xe5\x32\x5c\xd4\x9f\xbf\x1a\x56\x3e\xf6\x18\x86\xd5" - "\xca\x70\x31\xcd\xf5\xf8\xbd\x77\x3c\x8d\xc8\xd3\x1a\x92\xe7\xb1" - "\x61\xe5\x9d\xbf\xc2\xb0\xce\x88\x3c\x8e\x88\x3c\x7d\x21\x79\xac" - "\x52\x39\x03\x11\x79\x3c\xe1\x79\xd2\x54\x13\x71\x4b\xd3\x85\xe7" - "\x49\x4b\x8b\xc8\x93\x31\x11\xb7\xb4\xdc\x88\x3c\xeb\x22\xf2\x6c" - "\x0c\xa1\x2d\xad\x2f\x1b\x30\xcc\x1a\x91\xc7\x1e\x91\xa7\x43\xfe" - "\x46\x5b\xd2\x21\x74\x3d\xf2\x13\xb6\x29\xb6\x6b\x17\xc6\x63\xfd" - "\x33\xd2\xaf\xb5\x0f\x00\x79\xe6\xb8\xe5\x80\xf0\x3f\x4d\x32\x94" - "\xc6\x14\x24\xb7\x51\xde\xd3\x7c\x3d\xf7\x25\x47\x65\x9d\x85\x39" - "\xe7\x89\x87\x46\x6c\x73\x52\x26\xd2\x63\x4e\x5a\x38\x9e\x73\x32" - "\xc2\xf1\x9c\x93\x3d\x91\x1e\x73\xd6\x45\xe4\xd9\x18\x91\xa7\x36" - "\x24\x4f\x87\x54\x8e\x3d\x22\x4f\x47\x44\x9e\xce\x89\xfc\x39\xa7" - "\x2b\x22\xcf\xa9\x88\x3c\x03\x41\x1a\xce\xe1\x7b\x3a\xa8\x3f\x60" - "\x38\x7e\xdf\x73\xad\x7d\x18\x5a\x99\x9f\xe5\xfd\x18\x82\xaf\xef" - "\xdc\xd5\x2c\xf6\x25\x70\xdf\x1f\x03\x70\xe7\x9b\x20\xfc\x67\xb9" - "\xdf\x1f\xf5\xc6\x93\xce\x45\xda\x0e\x9e\x30\x7b\xd1\xc6\xbc\xb3" - "\xc4\x05\x86\x8d\xf2\xda\x27\xad\x17\x73\x5f\x51\x7c\x7c\x71\xa7" - "\x51\xf4\xbf\x3b\x9b\xa5\x39\x59\xaa\x0f\x8e\x1b\xee\x6c\xfe\x3f" - "\xc3\xeb\xae\xbb\x09\x2f\xf2\x9d\x82\x30\xfa\xc7\xc7\x0e\xe3\xb8" - "\x52\x99\x77\xc9\xbe\x2e\xdd\xed\x62\xcd\x9a\xfc\xf4\xb8\xc9\x8f" - "\xcd\x88\xed\xae\xc4\x90\xf1\x06\xe1\xea\x39\xba\xc3\xab\x8a\xc0" - "\x79\x48\xe0\x7c\x97\x51\xc8\xa8\xbb\x8c\xb2\x3c\x89\xc9\x7f\x76" - "\x4b\x79\x2f\xda\x7c\xb4\x4e\xd7\xd3\x8a\xf6\x23\x8e\x99\x08\xef" - "\x33\x70\xd7\x1e\x6e\xcf\x56\x8e\x02\xbd\x3b\x6b\x97\xf0\x75\x3c" - "\xa9\x2e\x0e\xf2\x57\x4e\x76\x4a\x97\xe9\x12\x0c\xf3\x31\x17\xc9" - "\xc6\xbb\xce\x9f\xa8\x75\x13\xae\xc7\xe4\xf5\x6d\xc4\x85\xe3\x34" - "\x6c\xb7\x94\xd0\x1a\x23\xcd\xcb\x9f\xf0\x64\x50\x9a\xd3\x48\xdb" - "\x0e\x99\x06\xe4\xfb\x1c\xd3\x36\xc7\x1a\xfb\x84\xd2\x55\xe0\x30" - "\xef\x49\xc1\x3f\xe9\xa9\xe1\xfd\x21\x1e\xf9\x34\x3d\x23\x9c\xe7" - "\xd2\xb3\xc3\x79\x2e\xbd\x28\xbc\x3f\x28\xb1\x3f\xa4\x6f\x8c\xc8" - "\x53\x1b\x91\x67\x6f\x48\x1e\xbb\x54\x4e\x47\x44\x9e\xce\x88\x3c" - "\xa1\xf2\x0f\xeb\x9c\xde\x37\x3e\x8e\xe4\xf2\x3e\xdd\x15\xf2\xad" - "\x6c\xe6\x7a\x2a\xdd\x23\x87\xd1\xba\x27\xda\x9d\x7c\x2d\x5f\xc0" - "\x9b\xab\x8d\x90\x51\x98\x7e\x6e\x6a\x38\x0e\x73\x17\x87\xe3\x30" - "\x37\x4b\xfe\x6e\x10\xe3\xe0\xdf\x9e\x85\xb9\xaf\x4a\x7c\xe6\xd1" - "\xec\x82\x47\x35\xbe\xd5\x4f\x92\x1d\x46\xfa\x89\xef\xb1\xd8\x89" - "\xb6\xe3\x65\xd0\xd2\xde\x96\xb3\x35\x10\x47\xfe\x94\x5c\x30\xcf" - "\x8e\xe3\x33\xf2\x8b\x3c\x84\xf6\x54\x3e\xc2\x28\xc4\xf2\x5b\xb0" - "\x0c\xa4\xdd\xdc\x43\x11\x38\x1c\x8b\xc0\xe1\x64\xc8\xb7\x16\xbf" - "\xfb\x43\xea\xad\x8d\xd3\xf1\x3d\x50\x68\x33\xcf\x75\xcb\xe1\x34" - "\xa6\xc7\x3a\x0e\x5a\xb8\x1d\x60\xa4\x7d\x2d\xc9\x67\x60\xee\x17" - "\x64\x07\x0b\x98\xf3\x66\x86\xd2\x56\xd0\x62\x9e\x21\x1c\x8f\x79" - "\xc6\x70\x3c\xe6\x15\x04\x65\xcd\xdc\x42\xd1\x47\xe6\x95\xa2\x8c" - "\xe6\xfe\x8b\x90\x16\x7a\x8d\x4f\x3f\xdd\x71\x2b\xd9\xa4\xf3\x5e" - "\xf5\x60\x7d\xd9\x4f\x94\xc9\xd2\xb7\xb8\xe3\xe3\x56\x9a\xff\xb7" - "\x98\x63\xf1\xe8\x70\xb2\xc5\x24\xed\x4d\xd2\x23\x6c\x87\xcc\xe3" - "\x81\x26\x8b\x29\xd0\xf8\xb0\x15\xc3\x50\xfe\xdd\xe5\x15\x63\x8f" - "\x9c\x6e\xe4\xe7\x16\x6c\x13\x1c\xa7\xce\xff\x4c\x1a\xd7\x91\x4f" - "\x3d\xda\x27\x41\x7e\xd8\x12\xc5\x9a\xe6\x7c\x75\x48\x5f\xf1\xe8" - "\x77\x3c\xc0\xce\xc0\xfc\x1e\xb2\xd7\x48\x16\xd0\xbe\x97\x13\x3e" - "\x37\xd0\x5c\x88\xd3\x77\x8e\xdb\xd4\x18\xdf\x2d\xe5\xcd\x0a\xc9" - "\xeb\x96\xe6\x2a\x06\x29\x6e\xbe\x0f\x54\x27\x3c\x6e\xf2\x37\x9d" - "\x22\xec\xf0\xf9\x3d\x27\x50\x06\x60\x1e\xb3\x9c\x87\xe6\x35\xa4" - "\xf1\x88\x6a\x5e\xad\xb8\x6f\x8f\x60\x83\xf0\xc9\x37\x88\xe3\x99" - "\x21\x67\xed\x20\x38\x3d\xfd\x34\xbf\xa8\x12\xfb\x07\xe6\x77\xc7" - "\x79\x41\x3d\xdc\x68\x41\xf9\x3a\xbf\xdb\xdf\x68\x29\x47\xdc\x50" - "\x97\xce\xe3\x72\x2d\x94\x76\x2b\x57\x16\xac\xce\xcf\x9b\xfb\xc4" - "\xea\x9c\xc2\x95\x4b\xf4\x85\x15\x2f\x95\x95\xce\xdd\xb4\xa5\x46" - "\xbf\xad\xaa\xa2\xa6\xa2\xf2\x79\xee\x22\x4f\xbf\xbe\x46\x3c\xd3" - "\x36\xae\xaf\xae\x59\x46\xaf\xe9\x7a\x53\x55\xd9\x56\xfe\x3a\x67" - "\x0a\x84\x03\xa9\xa8\x29\xab\xd2\xdf\x5e\x9a\xae\x7f\x70\x7d\xc5" - "\xc6\x2d\x55\x65\x51\x61\x2d\xd1\x57\x95\x55\x95\xad\x2f\xd5\x2f" - "\xd3\x1b\x08\x72\x28\xb8\x90\xf6\x34\xc8\x32\xa7\x1a\x75\x34\xda" - "\xc5\x83\x24\x7b\x48\x57\x9f\x85\x85\x1f\x93\x5d\xc6\x7d\xda\x21" - "\x6f\xa1\x9c\xc7\x71\xb6\xa1\x73\xa2\x6e\x36\x44\xe8\x3f\x43\x84" - "\xfe\x33\x0c\x4c\xd4\xcd\x06\x6f\x78\x9e\x05\xea\xf0\x3c\x0b\x74" - "\x13\x75\xf3\x82\xf4\x88\x3c\x4b\x23\xf2\xe4\x8e\xcb\x0e\xc4\x75" - "\x37\x97\x35\x0b\x4a\x22\xf2\x98\x22\xf2\x58\x23\xbe\x43\xed\x1f" - "\xb4\x47\x17\x74\x84\xea\x7b\xfc\xee\x94\xfb\x6f\x50\x66\x2d\xe8" - "\x92\xd3\x90\x3e\x69\xa7\xbb\x33\x44\xda\xd3\x21\x69\x07\xa5\xb4" - "\xee\x71\x59\xb5\x9f\x8f\x99\x07\x85\xcd\xbd\x70\xbd\x24\xaf\xe8" - "\x2e\x0d\x59\x2f\x0e\x60\x5b\xdc\x72\x01\x16\xf4\xb4\x8b\xb4\x6e" - "\x3e\x37\xfc\xd6\xda\x91\xf6\x64\x50\x53\x5e\xf2\xe9\xc6\x6c\xf3" - "\xb9\xef\x40\x0c\x4b\xc4\x1f\xca\x9e\x85\x85\x38\x86\x19\xa0\x32" - "\x68\x3d\xd2\x05\x0b\x39\x2f\x53\xbe\x7a\xbe\xff\x85\x97\xd7\x43" - "\x77\x82\x90\x9f\x44\x92\x89\x54\x2e\xf9\x1a\xa4\xb2\x11\x86\x8a" - "\x29\x0d\xb3\x24\x9f\x71\x5a\xfc\xa5\x20\xcc\x43\x32\x4c\x84\xc7" - "\xe5\xca\x6e\x69\x6f\xa7\xb0\x65\x16\x9e\x94\x6d\x06\xb2\xff\xa3" - "\xc9\x8e\xe8\xfb\x01\x41\xd3\x60\x0b\xf4\x3b\xea\x06\x08\x27\x2f" - "\xd9\x96\x4e\x9d\x0f\x7a\x5b\x7d\x38\x26\x05\x2d\x1f\x23\x99\xcf" - "\x83\xb3\xc3\xc7\xd7\x51\x8a\xcd\x60\x6d\x57\x06\xfa\xd9\x78\x3e" - "\x1a\x77\x2d\xe2\x6b\xca\xf5\x14\x8e\xf9\x71\x7c\xe0\xa6\x7d\x83" - "\xb1\xee\xa5\xa1\x74\x8e\x5b\x69\x0c\xb7\xa8\x5c\xb2\x67\xf7\xb4" - "\x23\xac\xa8\x7b\xda\x94\xe0\x1c\xb1\x2d\x3a\xe8\x82\xa7\xec\xb2" - "\x1c\x3e\xd1\xc2\x65\x9f\x12\xc3\x8f\x23\x2d\x86\x62\xd9\x1e\x92" - "\xcc\x26\xdf\x67\x09\x98\x76\xf0\x5a\x69\x09\xef\x13\x58\x6f\xec" - "\x8b\x27\xdf\xaf\x33\xc4\x4b\xf2\x15\xc7\xfd\x8b\xf5\x72\xbe\x6f" - "\x53\x3f\x69\xdf\xad\x1b\xfb\xaa\x47\x8c\xff\xee\x7e\xf3\x0d\xbe" - "\x4f\x6e\x31\x8e\x7f\x16\xed\x95\xea\x70\x1d\x7e\xa3\xfc\x5b\xc4" - "\xf7\xef\xd2\x9a\x38\x8d\x93\xab\x4d\x68\x87\xe9\x3c\x28\x1b\x17" - "\x37\xcb\x71\x7c\xde\x98\xe2\x6a\x99\xf7\x84\x6e\x80\xe2\x3a\xc7" - "\xe3\x28\x1f\xe1\x6d\xf6\x51\xf8\x49\x39\x5c\xd8\x01\x8b\xfb\x23" - "\xbe\x07\xe5\x6f\x7c\x47\xfd\xbf\x68\x9d\x04\xdf\x8d\x32\x97\xf6" - "\x21\x28\xce\xc0\xdd\x8f\xb5\xf1\x7e\x73\x77\x8a\x1c\xcf\xe7\xbe" - "\xde\xc3\xf1\xb5\xcf\x03\x81\x64\xe3\x49\x6e\x47\x61\x1e\xba\x63" - "\x06\xc7\x0d\x0a\x36\xc6\xf7\x44\x0c\x11\x1c\xea\x33\xfc\x9e\x07" - "\xfc\x46\x58\x34\x3f\xef\x26\x1e\xd9\xe6\x83\x99\xa6\xfb\x69\x8e" - "\xf8\x6e\xce\xb7\x14\x46\x70\x09\x9e\xc5\x27\x60\x13\x3c\xba\x0b" - "\x87\x0d\x97\x23\xae\x77\x53\xfd\x4f\xc6\x6a\x2b\x8c\x3f\x1a\x42" - "\xcb\x78\xfc\xee\x0a\xaf\xeb\xdd\xa7\x22\xbe\x07\xe4\x6f\x9a\x8f" - "\x15\xbc\x77\x77\xbf\x88\xbb\x07\xae\x55\x16\x8d\x69\x31\x4d\x6a" - "\x78\x79\xf7\x2c\x0e\x87\x7f\x4f\x56\xc4\x77\xa1\xfc\xdd\xcc\xd7" - "\x01\xee\x29\x95\xcb\x10\xf3\x71\xc6\x93\x07\xeb\xdc\xf1\xdf\x8e" - "\x7f\xee\xfd\x44\xf0\xcf\x3d\x87\x42\x70\x98\x84\xdf\xc7\x82\xed" - "\x79\x4f\x97\x0c\x1f\xdf\xfb\x42\xd2\x61\x1f\xb9\xc7\x15\xc9\x2f" - "\xd5\x66\xe2\x33\xe2\x99\x7b\x7c\x51\xe2\xbc\x22\xee\x5e\x5d\x74" - "\x3e\xbb\xd7\x10\x12\x2e\x8d\x3b\xee\x7d\x53\xd2\xd5\x24\x23\x3d" - "\x74\xd7\x8e\xe4\xef\x97\xf3\x05\xf9\x01\x95\xee\xff\x40\xde\xba" - "\xd7\x14\x09\x97\xee\x6c\x18\x87\x11\x84\x29\x8d\x2f\xee\xed\x08" - "\xd6\xed\xde\x23\x2e\xb8\xbb\x43\xe6\x5b\x31\xe7\x76\x4f\x6b\x2c" - "\x7b\x1e\xd3\x9f\x0e\xa7\xd9\xbd\x43\x41\x9a\xdd\xeb\x0d\xc2\xcd" - "\x50\x85\xa4\xfb\xef\xf8\x9d\x12\x4c\x97\xa1\xff\x26\xfe\x10\x7b" - "\xfd\x33\xb2\xc3\xcb\xca\x28\x0a\x81\x51\x1a\x52\x96\x29\x24\x5d" - "\x3f\x7e\x5b\x63\xb7\x4f\x46\x6b\xec\xf6\xc9\x38\x16\xbd\x7d\x32" - "\xfa\x42\xca\x3d\xfd\xcd\xbc\x7d\x1f\x84\xe0\xd3\x8e\xdf\xda\x70" - "\x5e\xbe\x4f\x1f\xf1\x3d\xde\xfe\x0c\xfb\xef\xc1\x1d\xc6\x78\x0a" - "\xaf\x99\x0d\x5a\xc1\xeb\xf7\x15\x84\xc6\x7f\x34\x2a\xe2\x09\x47" - "\xbe\x56\x45\xeb\x80\x22\x9d\x39\x32\x1d\xa5\x09\x89\x6f\x91\x71" - "\xaf\x8f\xe1\x9b\x56\xd6\x41\xce\x00\xe9\xa0\xfb\x8e\x8a\xf5\x8d" - "\xe5\xd8\xc7\x3f\x2d\x8a\xa5\x4f\x10\x2e\xea\xff\xfb\x0e\x09\xfa" - "\xdc\x87\xfc\xff\x28\x5f\x4f\x65\xf6\xe5\x74\x87\xde\xe8\x59\x58" - "\x42\x7b\xc2\xc6\xf0\xb9\x3d\x5c\xc7\x2d\x49\x61\x36\xc5\x9a\x76" - "\x5b\xa4\xee\x5b\x92\x8e\x36\xfd\xa8\xc6\x67\x2d\x8a\x12\x97\xcd" - "\x6c\x71\xab\xa3\x84\xd3\x5e\x85\x51\x17\x2c\x69\x26\x7c\x43\xc2" - "\xcd\xcc\x36\xad\x90\xd2\xbb\xa8\x3c\xcc\x13\xab\xdd\xe4\xfd\xef" - "\x82\xf7\x96\x74\x45\xd4\xe3\xea\x59\xf8\xf1\x72\x51\x8f\x1f\x1f" - "\x88\x28\xfb\x74\x8c\x7a\xd0\x38\xed\x6a\xf4\x7a\xfc\x58\xcb\x69" - "\xab\xc4\xba\x4c\xd0\xfd\x3f\x4e\xc7\xba\x5c\xe5\x74\x0f\x0f\xcf" - "\x92\xc7\x7f\x96\xab\x38\xae\x56\x02\xcf\xbb\xa6\x36\xd8\x6e\x52" - "\xba\x8d\x9a\x16\x28\x88\x52\x66\x3d\xb3\x25\xac\x71\xc1\x8f\x8f" - "\xcb\x3a\x43\x0a\x6f\x15\xb8\x20\x9d\x94\x9c\x4e\xa7\x29\x5f\xac" - "\xf6\x96\xfb\xa7\x58\x93\xf9\x31\xf6\xff\x25\xb2\xfc\xf0\xa0\x4e" - "\x75\xcb\x74\x1c\xb1\x2d\x55\x47\xc4\x79\x43\xe2\x52\xc3\xe2\x76" - "\x8e\x87\x2f\x95\xc3\xbf\x5d\x3b\x2d\xdd\x18\xd1\x4e\xd8\x3e\x4b" - "\xfd\xe1\xf5\x5e\x5a\x2b\xea\x87\x6d\x34\x81\xd6\x4b\x5b\xb0\x8d" - "\xc6\xa2\xb7\xd1\xd2\xa3\xd1\x79\x6d\xa9\xb0\x3d\x93\x21\x1a\xbc" - "\x41\x6c\xbb\x31\xce\x83\x52\x3b\x4d\x6c\x9f\x65\x89\x72\xfb\x7c" - "\xbb\x3a\x2e\x2b\x88\xa8\xa3\x1f\x61\xf4\x88\xba\xde\x3f\x2b\x02" - "\x76\x79\x74\x5e\x5c\x66\xc5\x7a\xfa\xa3\xd7\x73\x59\x6b\x6c\x5e" - "\x5c\x46\xf7\xe8\xf8\x27\xf2\xe2\x32\xf9\xce\xea\x68\x79\x86\x98" - "\x2d\x5a\x39\xf7\xab\xc8\x36\x71\xc1\xfd\x4b\x69\x9d\x2b\x24\x7c" - "\x66\x38\xff\x61\x1d\x28\x1f\xd1\xcf\x27\xc6\x12\xd4\x0e\x67\xf5" - "\xa0\xfc\x26\x9e\x1c\xb1\xdd\x5f\x1b\x41\xab\x8b\x08\xdf\x3f\xac" - "\x54\x3e\x28\xe8\xf5\xc0\x67\x11\x38\xb5\x44\xa7\xd7\xfd\x9d\x48" - "\xaf\x8b\xd1\xe9\x75\x7f\x77\x6c\x7a\xdd\x4f\xed\x7f\x71\x22\xbd" - "\x1e\x80\x50\x7a\xd1\x1d\x81\x54\xbf\xdb\x74\xc8\x1b\x63\xc5\xac" - "\x5d\xc8\x72\xad\x06\x79\x45\xe4\x19\xa2\x3c\x8b\x35\x5e\xc1\x27" - "\xfa\x19\xa0\xbe\x00\x0f\xcc\x94\xfb\xff\xb4\x16\x48\x60\x63\x6b" - "\x19\xdd\xef\x43\xf9\x9c\xe6\x8b\x0e\xba\x9b\x8c\xe6\xf1\x22\xca" - "\x35\x47\x97\x05\x0f\xd8\x91\xa6\x4d\x51\xc2\x0f\x89\xb9\xc8\x07" - "\x5c\xe1\x32\xe2\x01\x47\x78\x1b\x21\xdd\x94\xdc\xbb\xae\xe2\xdb" - "\xfc\xae\xdd\x66\x46\xc3\xc4\x36\x33\xfe\x41\xb4\x97\xf1\xe3\x70" - "\xfc\x8c\xd9\xd1\xdb\xcb\x58\x12\xbb\xbd\x8c\xb5\xb1\xdb\xcb\xd8" - "\x42\xed\xe5\x02\x63\x5f\xb8\xde\x30\x76\x86\xd7\x17\xcb\xc5\x7c" - "\x4c\x39\x69\x3a\x7d\x7f\xdb\x7a\xcb\x3f\x92\x71\xd4\x56\xed\x68" - "\x5f\x21\xfe\xb3\x09\xc7\xef\x0a\x23\x26\x6c\xa4\xa1\x7d\x47\x4c" - "\x3f\xf6\x89\xbd\x2d\x74\xdf\x3a\xbf\x33\x52\x71\x16\x96\x7f\x10" - "\x50\x2a\x96\xe0\xbb\xf2\x2c\x64\x6e\x0e\x28\xe3\xac\x74\x9e\x84" - "\x9f\x23\xe1\xf3\xfe\xcb\x8f\x87\xb6\x05\xed\x1f\xa6\x39\xde\x7d" - "\x62\xfe\xf0\x8f\x67\x61\xc5\x4a\xd1\x2e\x99\x8f\x86\xd3\x71\xb9" - "\x2b\x7a\xbb\x2c\xf7\x62\xbb\xfc\x31\x7a\xbb\xac\x48\x89\xdd\x2e" - "\x2b\xe8\xec\xd9\x1f\x27\xf6\xa3\x15\xd9\x52\x3f\xda\x4d\x79\xf4" - "\x95\x64\xaf\xae\xf8\x2f\x94\x06\xdf\xb1\x8f\xac\xe0\x77\x7b\xcc" - "\x1d\x92\xfb\x11\xcf\x53\x8b\xb0\x78\xf9\x52\x1a\xb3\x04\x23\x14" - "\x6e\x87\x66\x28\x5a\x3f\x59\xc1\xef\x64\x9e\x67\x02\x35\xd2\xb0" - "\xe8\x00\xc1\xa8\x02\xb8\x00\x99\x53\x29\x1d\x85\x93\x4f\xf0\x90" - "\xf4\x83\x72\x3a\x92\x75\x22\xed\x0a\x17\xdd\x9f\x4b\xe9\xc2\x61" - "\x67\x4a\xf5\x4f\xe0\x7a\x84\xd2\xf3\xfb\x7a\xc3\xd3\x64\x88\xfe" - "\x98\x59\x1b\xde\x1f\x33\x0b\xc2\xf9\x13\xe9\x8f\xf9\x02\x28\xe7" - "\xf0\xfd\xa0\xdf\xa6\x58\xf2\xfd\xf4\xcd\xcc\xee\x88\xbe\x89\x3c" - "\x90\xf5\x92\xe0\x81\xac\xbc\x08\x5c\x07\xa2\xf3\x40\xa6\x2f\x36" - "\x0f\x64\xe9\x62\xf3\x40\xd6\x62\xe2\x01\x17\x64\x6d\x0c\xef\x9b" - "\x59\xb9\xe1\x75\xc7\x72\x79\xdf\x84\xa4\xef\xd2\x37\xd1\x16\x9a" - "\x1e\xab\x1f\x4a\xf6\xbf\x82\xee\xf5\xf9\x0e\x34\x13\xf7\x54\xc0" - "\x4a\xa0\xb5\x19\x94\xf1\xe5\x44\xc3\x36\x3e\x46\x5b\x99\x12\x4a" - "\xc7\x7d\x62\xac\x65\xc1\xb4\x6f\xd3\xde\x36\x41\xcf\x07\xd7\x87" - "\xd7\x7f\xe5\xe2\xe8\xf4\x5c\x99\x8b\xf4\xb4\x44\xa7\xe7\xca\xf2" - "\xd8\xf4\x5c\x59\x4f\x67\x14\x27\xf6\xa9\x95\x74\x37\x99\x5a\xd6" - "\x4d\x17\x60\xe5\xe5\x6f\xa7\x9f\x56\x9e\x0a\xd7\x4f\x2b\x8f\x7f" - "\x77\xfd\xf4\xa0\x2e\xba\x7e\x7a\xd0\x10\x5d\x3f\x3d\x98\x2d\xfa" - "\xc3\x83\xd6\xf0\xfe\xf0\x60\x49\x38\x4f\x20\xed\xbe\x37\xfd\xf4" - "\x60\x5f\x44\x1f\x68\x38\x0b\x0f\x3d\x8a\x36\xc5\x2b\xa2\xdd\xb2" - "\xaf\x8f\xc0\x71\x28\x7a\xbb\x3d\xa4\xc2\x76\x6b\x88\xde\x6e\x0f" - "\xe9\x63\xb7\xdb\x43\x4b\xb1\xdd\x1a\x26\xb6\xdb\x43\x85\xdf\xdd" - "\xa6\x78\x68\x4f\x78\x9b\x3d\x64\xfa\xee\x6d\xf6\x50\x77\xf4\x36" - "\x7b\x68\x20\x7a\x9b\x3d\x24\x9d\xf9\xcf\x5e\x1c\xde\x66\xd9\x29" - "\xe1\x6d\x86\x74\xfb\xde\xda\x2c\xbb\x3e\xa2\xcd\x36\x9d\x85\x1c" - "\x1c\x37\x2b\xfb\x44\x9b\xe5\xfc\x3e\x1c\xc7\xec\x8e\xe8\x6d\x96" - "\x7d\x0c\xdb\x6c\x53\xf4\x36\xcb\x3e\x15\xbb\xcd\xb2\xdd\xd8\x66" - "\x9b\x26\xb6\x59\x8e\xfa\xbb\xb7\x59\xce\xd2\xf0\x36\xcb\x49\xfd" - "\xee\x6d\x96\x63\x8d\xde\x66\x39\x2d\xd1\xdb\x2c\xa7\x53\xb4\x59" - "\xce\x60\x78\x9b\xe5\x9c\x0c\x6f\x33\xa4\xdb\x7f\xb0\xcd\x98\x7d" - "\x85\x74\xb6\xf2\xe1\x9c\x61\x3e\xaf\xfc\xb0\xd1\x05\x8f\xa8\xc5" - "\xbc\xfc\xc3\x9c\x77\xa4\x36\xfc\x08\xd3\x2c\x9e\xa8\xbb\x1f\x5e" - "\x27\x85\x3d\x31\xb1\x1d\x1e\x36\xa3\x5e\x1d\xea\xaa\xe5\xfb\xa5" - "\x44\x1b\x12\xcd\x31\x9d\x98\x23\x7b\xb8\x85\xf2\x62\x1b\x33\xa7" - "\xd7\x07\xa4\x8b\x31\xbd\x87\xe0\xd0\x79\xfa\x08\x58\x5d\xdf\xc5" - "\x2e\x8b\xbd\x17\x7b\x05\x38\xea\x16\x22\xbc\x47\xfe\x4d\xf0\xea" - "\x23\x91\xf6\x6f\x3b\xc6\x7d\x28\xf8\x34\x2f\x62\xce\xe4\x91\x18" - "\xf6\xef\x23\x64\xff\xb6\x47\xe7\xd3\x47\xae\x61\xff\x3e\x42\xf6" - "\x6f\x7b\xc8\x78\x35\xf9\x19\x9f\x2b\x62\xbc\xfa\xc8\x71\x8d\x47" - "\xf0\x0e\xb7\x63\x1b\x57\x00\xe2\x3c\x10\x81\x33\xb6\x4d\xee\x7a" - "\x09\xe7\x27\x23\xf2\xfb\xa2\xe3\x9c\x9b\x82\x38\x7f\x14\x1d\xe7" - "\x5c\x43\x6c\x9c\x73\x73\x11\xe7\x8f\x26\xf6\xad\xdc\x52\x89\x0f" - "\xa2\x8c\xcb\x73\xad\xd1\xdb\x3f\x37\xa2\xfd\xa1\xa8\xa6\x96\xb9" - "\x79\xfe\xf0\x74\x8e\xd0\x74\xb4\xa7\x9d\xd2\x12\x8f\x44\x49\x3b" - "\x14\x09\x33\x7a\xba\xbc\x94\x09\xbc\x47\x7b\xf0\xa3\xf2\x5e\x9e" - "\x51\xf4\xc7\xbc\x96\xf0\xfe\x98\x57\x14\xde\x1f\x1f\x89\xa0\x49" - "\x9e\x39\x22\x3e\xfb\xfb\x93\xb1\x79\x83\x11\x3c\xf0\xe9\x59\x58" - "\x55\x26\x78\x60\xd5\x27\xe1\x78\xac\x82\xe8\x3c\xb0\x4a\x87\xf5" - "\xff\x34\x3a\x0f\xac\x5a\x1c\x9b\x07\x56\x15\x20\x2d\x3f\x0d\xe5" - "\xdb\x35\xb5\xc6\x84\x88\x34\x35\xd1\x65\xde\xaa\xbd\xd1\xe7\x75" - "\x56\x1d\x14\x34\x5e\x75\x3a\x9c\xc6\xab\x8e\x87\xd3\x70\x15\x7c" - "\x0f\x34\x1c\xf7\x47\x33\x62\xcb\x8f\xec\xff\xce\xb3\x90\x2f\xf5" - "\xff\x82\x0f\xc2\x71\xcc\x97\xc6\x3f\xd1\xe6\xb2\xf2\x4b\x91\x96" - "\xce\xe8\xb4\xcc\xb7\x46\xaf\x73\x7e\x0b\xea\x20\x67\x60\x42\x5f" - "\xca\xef\xc4\xf0\x35\xfc\xae\xb1\xab\xa0\x6d\xc3\xf0\x35\x3e\x50" - "\x73\x7d\x35\xae\x97\xf2\x4f\xd1\x1c\x39\x9f\x63\x46\xfe\xd5\xcc" - "\x84\x02\xd2\x41\x84\x57\x71\x6d\xe4\xba\x24\x77\x65\xc0\xcf\x9c" - "\xd2\xf9\x13\x8d\x19\x0a\x9c\x1e\x1f\xc8\xfc\x4e\xe9\xc3\x61\x17" - "\x18\xa8\x5f\x50\x7a\x39\xad\x98\xeb\xb4\x46\xc8\xa6\x82\xa2\xe8" - "\x6d\x5c\x60\x8a\xcd\x3b\x05\x7b\x45\x3b\x17\x38\xc2\xdb\xb9\xe0" - "\x60\xc0\x36\xad\x90\xea\xea\x42\x3a\x7f\x97\x36\xa6\xf5\xcb\x98" - "\xf2\x7e\xf7\xda\x7e\x53\x1d\xdc\x7c\x0e\x1e\x4d\xe3\xe5\x29\x19" - "\x8e\x89\x15\xd0\xc5\x65\xc0\xa3\x3b\x39\x9e\x98\xa6\xd8\x07\x4a" - "\xb6\xfb\xc5\x7e\x8a\x6b\xb7\x31\x2f\xbf\x4b\xcd\xc6\xfa\xc8\x1f" - "\x05\xf2\xc2\xf4\x33\xf0\xe8\xf2\xb0\xfc\x2a\x00\xa7\x80\x51\x2b" - "\xe6\xf7\x1f\x35\xcb\xf3\xf0\xb1\xe6\xf7\x31\x4d\xab\xbc\x9f\x56" - "\xac\x85\x3d\x6a\x8f\xa9\x97\x11\x27\x3a\x87\x49\x38\x5d\x5b\x0e" - "\x3c\xea\x96\xf9\x57\x9c\xd1\x59\x0d\xc1\x33\x20\xab\x13\x31\xee" - "\xe8\x35\xe6\x73\x43\xfa\xc1\xea\x8c\x50\x38\xc2\x27\xd3\xea\x5c" - "\xf9\x1c\x07\xbe\x17\x7d\x03\x2c\x09\x9f\xd5\xd6\x08\x7c\xec\x68" - "\x5b\x1e\x95\x60\xb4\x7e\x03\x8c\x14\xe7\xc1\x25\x30\x2f\x00\x71" - "\xe7\xa0\xf0\xab\x66\xda\x27\xd3\x3a\x08\x89\x3e\x50\x89\xb1\xdd" - "\xea\xaf\x7b\x74\x34\x87\x43\xe7\x73\x1f\x70\xd0\x1a\x1c\x5f\xc7" - "\xd7\x3d\xe0\xe8\x31\xfb\x25\xdf\x3b\x6b\x38\x4f\xf4\x94\x5f\x74" - "\xb4\xee\x67\x83\x07\xf8\x59\xb5\x35\x61\xe3\xbf\xbd\xb4\x07\x87" - "\xf6\x42\xd4\xc1\x03\x98\xfe\x6d\xd1\xd7\x0b\x23\x6c\xd2\x35\x31" - "\xc6\x7f\x6b\x68\xfc\xf7\x40\xf4\x7e\xbe\xe6\x1a\xe3\xbf\x35\x34" - "\xfe\x7b\x20\x54\x6f\x8a\x75\x9e\x35\xad\xa1\x36\x29\xf9\x45\xd1" - "\x3f\x47\x76\x66\x61\xd2\x5d\xcd\xa0\xf5\xd1\xba\x32\xf6\x4d\xe7" - "\x60\x17\xf5\x57\x6d\x8f\xfb\x18\x9d\x69\x56\xd3\x1d\xb0\x42\x97" - "\x51\x7f\x5d\xe3\xe2\xba\xcc\x27\xfa\xa2\xc5\xcc\xdc\xe9\x03\xc8" - "\x43\x9b\xca\x25\x58\x6b\xba\x77\x96\x33\xbe\x17\x62\xda\x00\x24" - "\x38\x07\xb9\x5e\x54\x90\xbd\xca\xed\x56\xdf\x65\x20\xb8\x27\x6a" - "\x7b\x80\xe0\x06\xc6\xf5\x24\xc1\x2e\x5c\x4a\x7d\x9c\x60\x12\xec" - "\x5e\x4c\x47\x70\x29\x9d\x5c\x0f\x71\x8e\xa4\xb0\x34\xb4\xee\x7c" - "\xfe\x05\xcb\xc6\xf0\xf7\x68\x5e\xc5\x49\xf9\x2c\x6b\xd9\xbc\x01" - "\x5a\x33\xbb\xe8\x60\x96\x17\xd9\xbc\x2a\x9a\x13\x2b\xe4\xf7\x0f" - "\x7f\xf4\xbf\x5c\xf1\x35\xb3\x41\x2d\x85\x1d\xe9\xd2\x7b\x91\x8f" - "\x0b\xdd\xe1\x32\xa2\x30\xc2\xfe\x5d\xc3\xc7\x99\x2e\x58\x4d\xbe" - "\x01\x40\xda\x17\x4a\xf2\x80\x39\x7d\x23\x9c\x3f\xae\xb5\xaf\x81" - "\xd6\xa4\x69\x5f\x92\xf0\xfb\xf3\x58\x46\xc4\xdc\x9b\x7b\x1f\xdf" - "\xdb\xf2\x39\x96\xfb\xd8\xef\x04\x8f\x3c\xfe\xbb\xf0\x36\x7d\xac" - "\xc8\x72\x9e\xd6\x82\x84\x3e\x78\xc6\x17\x29\x1f\x1f\x33\xcb\xb6" - "\x5b\x44\xb8\x5d\xd6\x07\xfa\x4a\x0e\x37\x42\xcf\x3c\xc6\xed\x7f" - "\xff\x04\xbd\xf0\xd8\x49\xac\x5f\x18\x4f\xf6\x72\x1e\x7a\xcc\xd5" - "\xe3\x41\xbe\xa9\x22\xfe\x7f\xfc\x49\x4c\xb3\x8b\xce\xe6\xe1\x77" - "\xc2\x05\x78\x5c\xeb\xb7\x81\xba\xc7\xcd\xcf\x1e\x69\x91\x47\x38" - "\xdf\x92\xde\x98\x2f\xf6\x04\x79\xc2\xcb\x78\x3c\x5d\xa6\x39\xa5" - "\xe9\xad\xfa\x1c\xc4\x9e\x06\xe2\x85\xc7\x81\xf6\x47\x4c\x1b\x82" - "\x04\x82\x25\xf3\x90\xd3\xd7\x0f\xbd\xbe\xc8\x31\xcf\xe3\x35\xd1" - "\xeb\xfe\x38\xe9\xff\x26\x17\x3c\x3e\x10\xde\xb6\x8f\x73\xfd\x2f" - "\xaf\xeb\xb8\x90\x06\x11\xf9\xba\xc2\xdb\xfe\xb1\x22\x8a\x8f\xb9" - "\xcf\xc6\xbe\x42\x85\xe3\x99\x62\x0f\xdf\x73\xf5\x04\xf6\xff\xc7" - "\x62\x9e\xc1\xe0\xe7\x3a\xb4\x2b\x54\x01\x4c\x2b\xed\xb7\x45\xb9" - "\xf5\x44\x76\xd8\x9c\xd1\x0d\x7c\xce\xa8\xf8\x2c\x3c\x21\xad\xfd" - "\x14\xbd\x1e\x8e\xdf\x13\xa5\xb1\x6d\x83\x27\x68\xfd\xa7\x38\xba" - "\xcc\x78\xa2\x35\xba\x6d\xf0\xc4\x51\x49\x2e\x14\xb3\xa4\x48\x3e" - "\x78\xa2\x0f\xdb\x98\xe7\x91\xc7\xb0\x34\x17\x1a\x7b\x0c\x5b\x04" - "\xe3\x63\xd8\x2a\x92\x07\x4f\x0c\x8e\x8f\x61\xdd\xd1\xc6\xb0\xae" - "\x28\xed\x59\x94\x15\xbd\x3d\x8b\xd6\x45\x1f\xc3\x16\xd5\x08\x3d" - "\x5f\x74\x28\xbc\x9d\x8b\xf6\x06\xd7\x84\x9f\x28\xfd\xfe\xec\xe1" - "\x22\xef\x44\x7b\xf8\xc9\x2d\xa2\xad\x9e\xfc\xbb\x70\xdc\x9e\xd4" - "\x46\x97\xed\x4f\xa6\xc5\xb6\x87\x9f\xcc\x8a\x2d\xdb\x9f\x2c\x99" - "\x68\x0f\xeb\x27\x45\xa4\xa9\x1f\xb7\x95\xc2\x6c\xb3\x27\x5b\x05" - "\x9d\x9e\x24\x7b\x2e\x2e\x24\xfd\xd1\x70\x7e\x7f\x92\xfa\x9b\x06" - "\x65\xdb\x39\x92\x69\x32\xcf\xc4\xa2\x09\xf9\x30\xb9\xad\x19\x26" - "\x63\x1f\xf8\x74\xc4\xf6\xd4\x38\xff\xd3\x5e\x3a\x2a\x87\x64\x64" - "\xcc\x3d\x6d\x4a\x19\x3f\xc2\xe3\xa9\xa5\xd7\x5a\x2f\x8d\xd3\x41" - "\xc1\x1b\x13\xe8\xf1\x14\xb7\xff\x08\xc6\xb5\xdb\xec\xa9\x23\x11" - "\x7d\xcc\x23\xf6\xc2\xae\xdd\x2e\xda\x6d\x6d\xc4\x58\xf6\xa9\x93" - "\xfc\x5c\x5c\x4c\x79\xfb\xd4\x60\x74\x1e\x5d\x3b\x4e\x2f\xe4\x7f" - "\x82\x7b\x5f\x44\xbc\x5e\xb4\xc1\x5a\x73\x20\x29\x74\xae\x7b\x6d" - "\x46\xb8\x4c\x5a\xab\x8f\xc8\x17\x31\xfe\x7b\xea\x24\xc5\x7f\x3b" - "\x7d\xb3\xf6\x50\x6c\x7d\xb3\xee\x6e\x51\xff\xa7\x23\xd6\x97\xd7" - "\x9e\xbc\xb6\xbe\x59\x1b\xa3\xfe\xeb\x20\x5c\xdf\xac\x8b\x58\xa3" - "\x5f\xa7\x8f\xae\x6f\xd6\x65\xc8\x72\x46\xc8\x8d\x75\x8d\xdf\x4e" - "\xde\xac\x33\x85\xcb\x9b\x75\x45\xdf\x24\x6f\x4e\x4c\x90\x37\xeb" - "\x8e\x6a\x5a\xa3\xd6\xa5\x3b\xba\xbc\x59\x37\x20\xda\xf0\xe9\xa5" - "\xe1\xf2\x66\x9d\x2f\xbc\x0d\xd7\x45\xb4\xe1\xd3\x11\xeb\xdf\x6b" - "\x4f\xfe\x9f\xca\xa4\xb8\xb8\x38\x65\x9c\x42\xa9\x88\x03\xba\xf0" - "\x44\x01\x09\x71\xaa\xb8\x78\xfc\x4d\x92\x9e\x09\xca\x38\xa5\x0a" - "\x7f\xf1\xd2\x73\x52\xc4\x77\x02\xe5\xc5\x9f\x4a\x7a\xc6\x47\x7c" - "\x4f\xfa\x86\xf8\x04\xa9\x5c\xb9\x7c\x55\xc4\x77\xfc\x37\xc4\x4f" - "\xfa\x0f\xe6\x87\x09\xdf\xe1\xe7\x0b\x73\x2a\xb7\xae\xdf\x58\x51" - "\xca\xf7\x96\x97\xe9\xd7\x6f\xd8\x50\x56\x5d\xad\xaf\xd9\xa4\x5f" - "\xb1\x7c\xf5\xc2\x25\x7a\xb1\x45\x7d\xe3\xb2\xdb\x4b\xa7\x40\xde" - "\xb6\x2a\x8a\xc8\x5b\x93\x53\xa4\x2f\x58\xb1\x3c\x3c\x52\x06\xc3" - "\xb7\xa2\x5f\x0b\x4a\xe8\x1d\xd9\xaf\xde\x00\xb0\xf7\x06\x2e\x77" - "\x06\x7a\x3a\x00\xc4\x78\x62\xc3\xab\xdd\x68\x75\xb0\x51\x0b\xa3" - "\xf3\x0a\x67\xa0\x78\x19\x55\x62\x6e\x87\x15\x4c\xcf\x91\x7f\x91" - "\xe2\x27\xd9\x6f\xdc\xa0\x7f\x18\x94\x67\xa0\xfc\xed\x2e\x1c\xfd" - "\xd3\xb7\x73\xc0\x07\x7a\x0b\xd9\xb6\x1b\xee\xc3\x38\x05\xbb\x3f" - "\x80\x61\x1e\xe9\x1c\xfb\xb3\x39\x3c\xec\x37\x56\x39\x9d\xe6\x2c" - "\x14\xfb\xd9\x6f\x18\xff\x66\xf7\xdb\xa5\x74\xc5\x7f\x08\xd8\x9e" - "\xb1\x93\x5c\x68\x15\xf7\x68\xc3\xdb\xc9\xa0\x7e\xfb\x06\xf2\xb5" - "\x58\xdc\x25\xef\x8d\x7e\x15\xbf\x5d\x50\xde\x42\x65\x53\xda\x80" - "\xf2\x99\xff\xca\xd3\x27\x87\xa5\xf7\x04\xf7\x52\x17\x77\xd1\x9d" - "\xf3\xf9\x7f\x42\x95\x9f\x9c\x91\xe1\xac\xb5\x82\xc6\xcf\xbe\x9e" - "\x97\x0d\x8a\xde\x7a\x80\xed\x3e\xe6\x73\x54\x9d\xc3\xf2\x4b\x96" - "\x6b\xb6\xb3\xaf\x9d\x68\x37\xe6\x0d\x59\xd8\xbe\xf3\xa0\xc2\x3e" - "\xad\x70\x54\xd1\x99\x86\x92\xb4\xb6\xab\xa0\x42\x1a\xcc\x3c\x07" - "\xeb\x8b\x6a\xf3\x98\xdf\x92\x07\xaa\x7f\x34\xd3\x59\xd2\xcc\xd5" - "\xfb\xfe\x19\x54\x87\x47\xad\xca\x51\xa6\x83\xda\x1a\x36\xc8\xc8" - "\x07\xab\x87\x79\x69\xdf\x6b\x77\x89\x9f\xd2\xac\x18\xb1\xe8\xa0" - "\xb7\xc6\x03\x3b\x4f\x33\xef\x9e\x7f\x16\xbe\x1d\x7a\x86\x3c\x74" - "\x36\x55\xbd\x33\x0f\xe2\xce\x16\x81\xb2\xa7\xbc\x05\x9c\xeb\x3c" - "\x50\x7b\x9a\x0d\x76\x97\xfc\x09\x7a\xcb\x3b\xa1\xb8\x1f\x94\xdd" - "\x03\x5f\x00\xf7\x23\xda\x74\xd8\x58\x77\x19\x74\x3b\x2b\x28\xec" - "\x32\xec\xd8\x09\x53\x77\xfc\x0b\x8d\x85\xfa\xb1\x9c\xf3\xf0\xd4" - "\x29\x50\x20\x3c\xe5\xcb\x5f\x80\xee\xe5\x27\xe9\xac\xb6\x11\x5a" - "\xeb\x40\xc7\x2c\x69\x89\xa3\x96\x34\xed\x28\x4b\x4b\x1e\xb1\xa4" - "\xa5\xf4\x9a\x30\xfd\xc0\x27\x30\xad\x1f\x52\x7e\x73\xae\x5f\xd9" - "\x72\x09\x66\xea\x57\x51\xfb\xaf\x2f\x6c\xbd\x84\xe9\x9b\xac\x8e" - "\x00\xe6\x0d\xcd\xe3\x4b\xb2\xf6\x3b\x8b\xbc\x10\x40\x58\x2d\xa3" - "\x30\xb3\x75\x14\x74\x81\x46\xab\x83\x68\x31\xd6\x64\xcc\x40\x39" - "\x98\xf0\xd1\xb3\xc7\x54\xce\xee\x21\xe8\xf1\x8c\x42\x2f\x7c\x0e" - "\x4e\xf3\x9f\x1d\x87\x9f\x3d\x16\x8f\x76\xa4\xc2\xb1\x83\xf6\x9f" - "\x0b\x9e\xb1\xf4\x90\x0f\x2a\x2b\x34\xd4\x41\xa2\x69\x07\x24\x9c" - "\xc3\x70\x2e\x73\xec\x8b\x8c\x4e\xdf\x9f\x1d\x3b\xf8\xf9\xea\xf2" - "\x96\xba\x1e\x88\xeb\xf5\xb4\xd0\x39\x5e\xa5\x3f\xf9\xb0\xd1\xe9" - "\xe9\x03\xa7\xe9\x8f\x8e\x80\xf6\x70\xda\xde\x00\xa8\x3f\xbc\xd2" - "\xa7\x74\xaa\xae\x80\xb3\xc8\x03\x9f\x62\xd9\xac\xe9\x70\x2e\xca" - "\x2a\x63\xaf\xc7\x4b\x7e\x68\x0c\x6c\x58\x37\xa5\xa1\x0a\xd2\xdb" - "\x2e\x41\xea\x81\x4b\x90\xc6\x46\xd2\x94\x74\x66\xfa\xe9\xf3\x5a" - "\x38\x80\xcf\x44\x1c\x7b\x61\x7d\xf9\xd9\x69\x96\x24\x9d\x9d\x1e" - "\x4b\x83\xf6\xd1\xe0\xd9\xe9\xd1\xe1\xe0\xd9\x69\xe4\xa5\x93\x74" - "\x7e\x1a\xfb\x85\x95\xf8\xb9\xe1\x02\xa8\x76\x5f\x00\x98\x67\x55" - "\x82\xfe\x59\xf2\x89\xb1\x61\xae\xb3\xf4\x3c\x7f\x3f\x03\xcf\x0e" - "\xe0\x33\x11\x7f\x38\x7e\x7b\x96\x9f\xf7\x1d\x90\xf8\x16\xc3\x94" - "\x18\xd6\x83\xcf\x38\x7c\xfe\xce\xd2\xca\xdc\xcc\x9e\x95\x88\xb6" - "\xc9\x14\xe2\x5f\x71\x4e\x3b\x2b\x71\xc4\xf6\xec\x71\x17\xbc\xb6" - "\x57\xe6\x63\x21\xcf\x8b\x4f\x7e\x7a\xf6\x3c\xf9\xf5\x75\x73\x7c" - "\xc6\xca\x15\xe4\xe3\x57\x0a\x27\x1c\x6e\xa7\x72\xcf\xc0\x06\x35" - "\x3e\x35\xf8\xc3\x7e\xf9\x6c\xab\x9c\x77\x78\xac\x1c\xcb\xdc\x30" - "\x0b\xc3\x99\x1c\x8e\xf5\x55\x51\xdc\xdf\x9e\x3d\xaf\x14\x69\xd2" - "\x94\x08\xd3\x2b\xc1\xc7\xbe\x5e\xbc\x91\xfa\xf4\xb0\x52\xc3\x4e" - "\x94\x2e\x86\xd6\x1b\x58\xdf\x81\xfd\xac\x4b\xf4\xb5\x0d\x25\x2e" - "\xd8\xcb\x7d\x2a\xa0\xce\xee\xda\x8b\x71\x27\x50\x7b\x12\x5d\xba" - "\x4a\x68\x3f\xe9\x06\xab\x0b\xa6\x9c\x0e\xad\x03\xb3\x3d\x6d\x22" - "\xbd\xf9\xeb\x3a\x47\x3c\x53\x3e\x63\xea\x75\x0d\xc1\xe1\xd1\xc1" - "\x78\xcb\xef\x41\xe9\xf4\x9d\x81\xf9\x29\xa0\xa3\x39\x98\xf6\xfd" - "\xcc\x85\xcf\x41\xfc\x0d\x21\x9f\xcc\x3a\x07\x1b\x7a\xee\x4a\x81" - "\x94\x7f\x32\x83\x24\x8f\x36\xfc\x29\x44\x1e\xbd\xd4\x33\x70\x2c" - "\x44\x16\x95\xcf\x9a\x28\x8b\x9e\xff\x91\x90\x45\xcc\x27\x64\x8f" - "\xdf\x25\x85\xc7\x47\x84\x4b\x67\x46\x9e\xfb\x2a\x22\xdc\x2b\x85" - "\xff\x4b\x44\xb8\x5b\x0a\xbf\x5e\x96\x75\xbd\x84\xc7\x36\x92\x75" - "\x65\x57\x49\xd6\xf5\x96\x4a\xb2\x8e\x9f\x71\x2c\xfb\x82\xfd\xcc" - "\x2a\xee\x77\x87\xb2\xbf\x23\xfc\xd9\x6f\x40\xc6\x7d\x32\x86\x6d" - "\xa1\x30\xfb\xe7\xa0\xc2\x1f\x97\x73\xcc\xf6\xcc\xff\x24\x39\x47" - "\x32\x8e\xce\xa2\xbc\x7b\x03\xeb\x7f\x77\x3f\x3b\xd5\xba\x9f\x75" - "\x8f\xd8\x4a\x07\x64\x79\xf7\x1a\x86\xed\xc5\xb0\xd7\x30\x9e\xe4" - "\x1e\xd1\xa4\xa7\xe8\x18\xf9\x71\x1c\x40\x3e\x2e\xd0\x28\xc0\xb4" - "\x0f\x79\x9e\xfc\x3f\xd5\x23\x7d\x9d\x28\x93\x68\x4f\x2e\xf7\x87" - "\xab\x34\xa0\x8c\x1a\xa0\xfe\x76\xc3\xee\x00\xcd\x4b\xfc\x09\xea" - "\x3c\xec\x1c\x9d\x0f\x21\x1c\x8a\xb7\x3f\x4c\x7e\x5e\x15\x5d\xe5" - "\x00\x74\xbe\x9f\xce\xaf\xa0\xdc\x55\xd9\x11\xa7\x13\x1b\xa9\xad" - "\xcb\x36\xba\xe0\xef\x37\x8a\xb6\x2e\xe7\xfe\xa3\xcf\x40\x69\x27" - "\xb3\xa1\x2c\xc4\xba\x69\xfc\x56\x20\x9f\x25\xd8\x47\x69\x9e\xb5" - "\xfc\x5d\xfc\xd9\x65\xbf\x25\xe4\x03\x1c\xd3\x38\xfb\xbd\x40\x38" - "\xbb\xa0\xd4\xd7\x53\x7b\x8c\xf2\x77\x10\x6d\x98\xcd\x22\xc3\x50" - "\x70\xbf\x27\x38\x86\x27\xbf\x27\x2e\x28\x13\x67\xea\x92\x8d\x19" - "\x3d\xeb\xdc\x40\x72\xde\x39\x88\x30\x6a\xcf\x08\x18\x08\x8b\xa1" - "\xdc\x0f\x8b\x93\xe0\x4f\xdd\xc9\xbe\x46\xf8\x1b\xa9\xbd\xc8\x4f" - "\x15\xed\x4b\x42\xba\x24\x92\xcf\x03\x61\x77\x96\x5e\x6e\xff\x1c" - "\x40\xf2\xb5\x85\xfc\x56\xea\x21\x5f\x56\xe4\x5f\x8b\xfb\xd6\x52" - "\x2e\x06\xb6\x2d\x2d\x71\xdc\xbf\xd6\x5f\xc0\xb7\x16\xd2\x5f\xd7" - "\xa6\x64\x9d\x88\xbf\x87\xfc\x6b\x21\xfe\x85\xc4\x87\x52\x9d\xbc" - "\x6f\x3e\xc5\x69\xbe\x94\xc2\x1a\x6c\xec\xa4\xdc\xfe\x54\x5f\xaa" - "\x0b\xc6\xe9\x85\x3d\xc8\xfa\x5c\xf0\x9c\x97\xe2\x31\x2c\x91\xd2" - "\xcf\x47\x39\xe6\x2c\xf5\xc3\x47\x67\xfd\xca\x86\x1d\xa0\x12\x32" - "\xad\x3c\x89\xf2\x0b\x99\xf6\xfc\xc9\xa0\x4c\x7b\xfe\x13\x21\xd3" - "\x04\x8d\x85\x4c\x7b\xfe\x63\x21\xd3\x9e\xff\x25\xdf\x3f\x84\x32" - "\x8d\xe2\x48\xae\xc9\x32\xed\xc0\x0d\xec\x24\xc9\x8e\x11\xdb\xf3" - "\x2d\xb2\x6c\x7b\x1d\xc3\x48\x76\x10\x8e\x42\x4e\x95\xb9\xd9\xff" - "\x93\x06\x62\x7f\x26\xbd\x97\x93\x1f\x8a\x41\xe9\x9d\xf4\xc8\x64" - "\x21\xe3\x9e\x1f\x0a\xca\xb8\xe7\x4d\xc1\xbc\x24\xe3\xca\x15\x42" - "\xc6\x89\xf0\xf6\xa7\x48\xc6\x95\xb9\x89\x06\x12\x7c\x25\xad\x9b" - "\x49\xe9\x91\x8e\x1b\xbc\xa1\x32\x2e\xbc\x7f\x95\x67\xc9\x32\x8e" - "\x64\x1b\x7e\x17\xa2\x4c\xe3\xfe\xe8\xa9\x9f\x35\x23\xcd\xe5\x7e" - "\x47\x6d\x40\x75\x26\x3f\xd1\x44\xb7\xcc\xf3\x90\x20\xf9\x74\x91" - "\xea\x5d\x6e\x97\xcf\x45\xba\xe0\xf9\x96\x48\x9b\x99\x16\x26\x42" - "\xce\x6e\xdd\xe2\xa7\xb9\x5d\xeb\x19\x70\xb6\x30\x6b\xaf\xef\x34" - "\x04\x76\xbf\xf8\x25\xb5\x2b\x8e\x2f\x26\xd1\x93\xe4\x0e\xea\xcf" - "\x3f\x14\x7b\xf8\x7c\xfd\x97\x0d\x4a\x8c\x33\xc3\x8f\x43\xe2\xce" - "\x53\x19\x21\xf9\xe6\x06\xe3\x2a\x26\x53\x1c\xcd\x31\x62\xba\x63" - "\xb1\xe6\x14\xbe\x3d\x1e\x15\x4f\xc6\xc6\xa3\x62\xcb\x35\xf0\x68" - "\xe4\x78\xa0\xbd\x85\xe3\xa3\xa4\x0b\x50\x61\xa4\x6f\xee\x5b\x34" - "\x7a\x39\x9f\x49\xf1\x71\x21\xf1\xa1\x65\x7d\x19\x25\x7f\x48\x79" - "\x2f\x28\xae\x0d\xff\x85\xd9\xd7\x86\xff\xc2\xf2\x6f\x80\xbf\x9e" - "\x64\x1f\x9d\xbd\xf3\xdb\xc2\xd3\xcd\xf3\xf1\xbe\x77\x92\x7c\x2c" - "\x61\xba\x57\xa5\xf5\x96\x2f\x2d\xb3\xf9\xf8\x8f\xfb\xdb\xd9\x87" - "\xf1\xdc\x5f\x27\xca\xe5\xac\xed\x00\x62\x4f\xdf\x78\x9e\x4f\x22" - "\x71\x9b\xe6\x93\x71\xe3\xf1\x5f\x44\xe2\x86\xf1\x73\x43\xe2\xfd" - "\xc1\x36\x7f\xc1\x7c\x8d\x79\xa4\x44\x27\x72\x27\xdd\xb1\x70\x02" - "\x87\x2d\x74\xd6\xa7\x79\x7c\x6d\xe4\x45\xe4\xff\x72\xbe\xb6\x23" - "\x9d\xed\xa5\xbd\x32\xb7\xf4\x7a\xc8\x27\x99\x47\x3e\x0b\x72\x23" - "\xea\x91\x64\xf2\xbf\x42\xf3\xe9\xc5\xfe\x02\xa5\xf0\x95\xfc\xa2" - "\x5d\xce\x1b\x6b\xee\x91\xca\x95\xca\xe4\xe7\xa4\x30\x4f\x97\x9c" - "\x87\x60\xd3\xd9\x20\x94\xff\xb7\x70\x3f\x65\xbe\x21\x92\xb7\x37" - "\xa2\x7d\x9c\x2c\xca\x29\x01\xa9\x1c\xec\xdb\x15\x86\x6b\x94\x73" - "\x8d\xfa\x6d\x5c\xfc\xdd\xeb\x07\x52\xfd\x36\x9a\xbe\xa1\x7e\xd7" - "\x2a\xf7\xc8\x77\x2f\x57\x2b\x97\x3b\xf8\xdd\xe9\xfa\xd2\xcc\x6f" - "\x4f\x57\x83\x44\xd7\x97\x0a\xbe\x81\xae\xd1\xca\xa9\xff\xf6\xe5" - "\xe8\xe5\x72\x8e\x45\x2b\x07\xf8\x5f\x4c\x3f\x3d\x6a\xf9\xee\x02" - "\xba\x37\x44\xf8\x2a\xaf\x84\xd0\xbb\x55\xc4\x7d\x22\x95\x29\xf2" - "\xdd\x2a\xc1\x73\x66\x95\x0b\x8a\x3b\xc8\x0e\x61\x01\x17\x54\x2e" - "\xa6\xb9\xc0\xac\x9d\xa1\x77\x90\x54\x66\x7f\xc3\x9d\x2e\xe4\x1b" - "\x27\x9b\xca\x66\x8c\xfb\x60\xf1\x08\x7f\x79\x95\xaf\x92\x9f\x06" - "\xb1\xa7\xa8\xf2\x98\xe8\x9b\x95\xcd\x2e\x78\x89\xfb\x59\x24\x1f" - "\xcc\xc3\x16\x29\xfd\x0c\xd2\xa1\xe3\x69\x8e\xc9\x69\xa2\xce\x49" - "\x36\x59\x3a\x0f\xd6\x19\xc2\xce\x18\xae\xac\xaa\xda\x54\xb5\x44" - "\x5f\xfd\xd2\xb3\x73\xab\x6b\xd6\xd7\x6c\xa9\xe6\x87\xd1\xa7\x00" - "\x06\xe8\x6b\x2a\x5e\x2a\xdb\xb4\xa5\x26\x6d\xdb\xfa\x0a\x71\x78" - "\x7d\x0e\x26\x0c\x4d\x04\x61\xbe\xfd\x75\x28\x83\xb8\x2f\x3a\xda" - "\x87\xcd\x7d\x60\x92\xff\x77\xe9\x6c\x6e\x97\x0e\xc0\x83\xe3\xa3" - "\x11\xdb\xa6\x75\x2e\x58\x7d\x48\xa6\x23\xf9\x29\x44\x3b\x49\x77" - "\x0e\x36\x6d\xa7\xb6\xcf\x47\x93\xb7\x5d\xf8\x83\xe0\xe7\xff\x9d" - "\x35\x18\xd0\x0b\x6a\xc7\x56\x9a\xe7\xdd\x84\x3c\x50\xe9\xe2\x7e" - "\x17\x77\xd0\xf8\xdb\x74\xbd\x6c\x97\xd0\xba\x95\x58\x67\xbe\xe5" - "\x81\x33\xb0\x69\x25\x95\x4b\xfd\xa6\x0d\xed\x5f\x82\xc5\x6c\x95" - "\x5e\xb2\x81\xf1\x5b\x8d\x38\xb8\x64\xdb\x17\xf1\x4d\x64\x49\x96" - "\x0e\x17\x98\x52\x7e\xab\x75\x83\x74\x9e\x5b\xdd\x26\xce\x6e\xab" - "\x46\x6c\xa6\xc4\xf1\xb4\x36\x4c\xdb\x68\xe9\xa0\xfb\x7a\xa2\xd2" - "\x37\x39\x8f\xfc\x89\xc7\x87\xd6\x19\xc7\xec\xd8\x3e\xa6\xdf\x61" - "\xdd\x53\xa8\xad\x25\x3f\x22\x93\x30\xec\x43\xba\xff\x80\x35\xe5" - "\x01\x86\x4d\xc2\xa7\x8e\xda\x94\xfc\x1c\x60\x1c\xed\xf5\x51\xf4" - "\xd6\x5e\x74\x9c\xd0\x9d\x41\xbe\x36\xa1\xfc\x2b\x3a\x2d\xce\xc5" - "\xe5\x91\x2f\xfe\x78\xa7\x75\x14\xba\xf4\xcc\x41\x73\x80\x88\xfb" - "\xe9\x2e\xbd\x07\x58\xdc\xda\x2f\x29\x1f\xf6\x0b\x9d\xc5\x4c\xb6" - "\x0f\x86\xf3\xf3\x7f\xa6\x3e\x99\xe6\x35\x7a\x76\x9e\xd2\xc4\x9a" - "\xb7\x26\x1d\xdc\xc0\x75\xc9\x25\xbe\xc7\x6b\x00\x4c\x9e\x48\x79" - "\x7f\x7b\xe9\x12\x7d\xe9\xfa\x1a\xfd\xc6\x8a\xca\x32\x7d\x69\x45" - "\xa9\xbe\x72\x53\x8d\xfe\xf9\x4d\x34\x81\x44\x53\x46\x61\x3c\x11" - "\xa0\xfa\x6d\x2b\x8a\x97\xd7\xc8\x87\xb7\x95\x4f\xc2\xfa\x23\x4d" - "\xaa\xf2\x86\x47\xca\x13\xc2\x69\x52\xb5\x40\xf0\xf1\x66\x1c\xff" - "\x99\x52\xc5\xf9\xc2\xb8\x41\xfc\xc6\xfa\x9b\x06\xc3\xfb\x5e\xd5" - "\x4e\x29\xed\x11\x39\x2d\xe7\x8b\x5b\xcf\x8d\xc7\x35\x48\xfc\xd8" - "\x2e\xce\x22\x73\x7f\x35\xed\xfc\x8c\xc0\x66\x57\xcc\x3c\xe4\xa3" - "\x6b\x07\x6c\xb8\x00\x9b\x7f\xcf\x6c\x9b\x53\x24\x1e\x52\x07\xec" - "\x79\x5a\x89\x7f\x90\x27\xaa\xf4\x13\xf9\xa7\xaa\x96\xf8\x87\x8d" - "\x14\xa9\xf9\x7e\x12\x9f\x17\xe5\x14\x7e\xa3\x3e\x75\xc1\xe6\x7a" - "\xaa\x87\x67\x5b\x91\xda\xf2\x36\xd7\xd7\x5f\xd1\xda\xec\x09\x2f" - "\xf7\xb1\x34\x19\x79\x03\xdb\xa8\xaa\x46\x6e\x23\x39\x7d\xf4\x3e" - "\xcc\xf9\x25\x9c\xc7\x04\x3d\x7b\x38\x8f\xa1\x5d\x80\x38\x29\x65" - "\xbb\x80\x74\x00\xe2\x36\x50\xb3\x93\x31\x2c\xa3\x3f\x84\x0f\x2e" - "\x44\xe3\x03\x6c\xdb\x0d\x1b\x37\x6d\x78\x11\x3b\x7a\x55\x59\xcd" - "\x86\x72\xf2\x5f\x41\x72\x80\x3b\xc7\xb8\xbd\x54\xbf\xa5\xba\x6c" - "\xc3\x14\x88\x96\x6a\x3c\x32\xb4\xfd\xb5\x01\xe4\xd7\xe1\xe1\xa2" - "\x78\x3a\xc3\x21\xce\x6c\xd4\x1c\x18\xae\xc6\x71\x4f\x58\xbb\xd7" - "\x34\x3a\x75\x06\xb4\x13\x0d\xc0\x6d\x7e\xa4\x99\xd8\x87\x50\xf3" - "\x2f\x44\x87\x61\xa5\x02\xf5\x41\x75\xb3\xcc\x03\xf8\x4e\xf4\xde" - "\x13\xdc\x03\x52\x73\x6a\x58\x19\x7f\x9a\xe4\x8f\xd8\x6f\x72\x0e" - "\xe5\x80\xa6\xfd\x0c\x54\x93\xec\xa7\xbb\x3a\x28\xff\x29\x39\xcf" - "\xbe\xf1\x73\xd4\x35\x4b\x65\x3e\x09\xc9\xf3\x3b\x0a\x13\xe3\xe7" - "\x2a\x37\xb5\x39\x13\x6d\xaf\x92\xd3\x21\x5d\x59\x3b\x97\x23\x35" - "\x69\x91\xb2\xe1\xb7\x5a\x5a\x73\x17\xf8\x70\xfe\xd3\xe6\x0e\x72" - "\xdf\x28\x68\xe3\x9d\x81\x9a\xbb\xa5\xfd\x2f\x7d\x5c\xa7\x9b\x11" - "\x96\x57\xc0\x62\xb6\xea\x1b\xe4\xb2\x58\x52\x2e\xf7\x21\x81\xf0" - "\xf7\x04\xe7\x24\x6b\x16\xd3\xd8\x9c\x0d\x17\x4d\x72\x41\x75\x0d" - "\xe7\x2d\x7c\xaf\xf9\x91\xf0\xbd\x46\xfc\x46\xf5\x24\xbe\x0a\xf2" - "\x54\xcd\x49\xb9\xbd\xa9\xce\x98\xaf\x56\xcf\xfd\xed\xd6\xb8\x64" - "\x5a\xc6\xf2\x27\xc3\xfb\xad\x16\x71\x19\x11\x7d\x97\x8f\x2b\x85" - "\x5f\x20\x3a\x47\x13\xc7\x92\xf2\xb4\x67\x61\xcb\xd7\x74\x36\x40" - "\xe3\xa5\x71\x5a\x9e\x96\xfc\x23\x08\xff\x42\x5b\x8c\xc8\xc3\x8b" - "\xa5\xf3\xc1\xf4\x8d\xfa\xbf\x7a\xb1\x68\xbb\x2d\xeb\x42\xfa\x9e" - "\x5b\xda\x6f\x90\x40\x34\x22\x79\xe6\x34\xaf\xe4\xfd\x55\x9c\x2b" - "\xde\xb2\x47\xce\xc7\x7d\x09\xf8\x84\x4e\xbc\x00\x5b\x0e\x91\x8e" - "\x20\xfc\x5c\xb0\x25\x8d\xca\xa7\xfa\x91\xce\xe5\x7c\xa3\xa3\x3b" - "\x09\xb6\x74\x45\xe0\x70\x4a\x86\x25\xc1\x1e\x90\xbf\xc9\x5f\x98" - "\x0b\xb6\x99\xba\x66\x62\x9f\xf2\xf0\x3a\x5c\xd7\x55\x83\x7d\xcb" - "\x43\xe9\xb6\x26\xca\x34\xc4\x70\x2b\x7e\xa3\xfd\xb3\x49\x2f\xd6" - "\x9c\x2c\x1d\x42\x16\x6d\xdb\x48\xbe\xa8\x2c\x7a\xf2\x27\xb8\x54" - "\xc8\x1b\xee\x2f\x87\xc7\xcd\x91\xfa\xec\x64\x3a\x83\xc4\xf7\xdd" - "\x78\x7c\x5c\x36\x08\xff\x0a\x18\x8f\x7d\x64\x44\xdc\x7b\x32\x59" - "\xe0\xb6\xd5\x3a\x5e\x06\xf2\x44\x17\x5f\xe3\xdc\x6a\x12\xfe\x4a" - "\x12\xfa\x30\xbe\x43\x6e\x3f\xf2\x01\x4d\xf5\xc6\x7c\xea\x2e\xee" - "\xe3\x6b\xeb\x71\x19\x5f\x29\x4e\xc9\xf9\x81\xd3\x60\xeb\x78\xff" - "\x1f\x4e\xe6\x69\x07\xe5\x72\x78\x5a\x4c\x47\xe9\xe9\xae\xba\x11" - "\xdb\x36\xd5\x38\x1c\xe1\x27\x45\x4d\xe5\x74\x75\xf0\x38\x7d\x50" - "\x56\x6d\xe1\x6b\x46\x7c\x5f\x1c\xd6\xc3\xfd\x32\x8e\xb3\xa9\x0d" - "\xf4\x10\x87\x79\x54\x04\x4f\xf0\xe2\xb6\x42\x39\x4f\x9c\x82\xe8" - "\xb8\xad\x54\x2e\x5b\x86\x41\xf8\x5f\x53\xe6\x89\xba\xa8\xa8\x8f" - "\x50\x5a\x82\xcb\x79\x82\xdf\x75\xb3\xed\x3c\xe7\x41\x5e\xcf\x6d" - "\x8e\xd0\xb6\x16\xb6\xd8\xb6\x53\x21\xfc\x40\xf8\x8c\xb7\xbf\x0b" - "\xcc\x29\x42\x97\x6c\xf3\x86\xe0\x68\x1c\xb1\x99\xd5\xc1\x76\xe0" - "\x6d\x44\xf7\x56\x44\xbd\x47\x8c\xf7\x15\x4c\x13\x60\x1c\x4f\x6a" - "\x0f\x1c\x8b\x65\x40\x57\x0b\xf9\x6d\xca\xd3\x22\x4d\x10\x47\xf3" - "\xeb\xc4\x57\x08\xb7\x24\x9c\x37\xcd\xa6\x10\x7c\x15\x24\xd7\x31" - "\xac\x5e\x4e\x83\xf8\xf1\xbd\x2c\x32\x3d\x31\xae\x63\xbc\x1d\x17" - "\xf2\xb4\x9d\x32\x9e\xdf\xa0\x33\x24\x5a\x99\xbf\x92\xca\x18\x94" - "\xcb\xc0\x77\x94\x0f\xdb\x26\xd8\xaa\xcf\x6e\xaf\x29\x13\x0e\x8c" - "\x48\xc9\xaf\xdf\xf0\x62\x59\x69\xba\x7e\xfd\x73\xe4\xea\xa8\x7a" - "\x63\x59\x99\x89\x2f\x12\x85\xdb\x81\x29\xbc\x3c\xa4\x83\xb0\x65" - "\x77\x6c\x7e\x43\xec\x8f\xa1\x7e\x41\xfd\x9d\xce\x15\x24\x9c\xa8" - "\xbd\xc4\xc7\x26\x4e\xeb\x42\x70\x7a\x99\x95\xec\x77\x2e\xfb\xa8" - "\xfe\x3a\x8f\xd0\x03\xd8\x9e\xa4\x23\x47\x6c\xdb\xed\xe1\xf4\xda" - "\xde\x11\xde\x97\xb7\x77\x46\x97\x13\xdb\x1f\xe5\x72\xc2\x2e\xf8" - "\x82\xe4\x13\x9d\x2d\x20\xb8\x98\x67\x20\x02\xa6\x27\x28\xa3\x76" - "\x80\x2c\xa3\x84\x9e\xd8\x91\x8a\x3a\xc8\x2e\xca\xda\x31\x33\xc8" - "\x37\x3b\x5a\x05\xdf\xec\x30\xb8\x60\xef\x46\x79\xac\x22\x74\xc7" - "\x76\x6e\x3f\x92\x4c\xc7\xf8\x02\x19\x5e\x73\x32\xe9\x8d\x1d\x25" - "\x13\xed\x87\x1d\x89\x64\x3f\xd0\xbe\x47\xa2\x05\xe2\xaa\x16\xfd" - "\x66\xc7\xde\x10\xf9\x83\x78\xef\x68\x8d\xd6\xd6\xcf\x92\x3a\x9e" - "\x4b\xcb\x79\x73\x37\x54\xd6\x2c\x23\x37\x54\x65\x66\x53\xd9\x86" - "\x9a\xb2\xd2\xc8\x75\xbc\x34\xd9\x16\x93\xfd\xd2\xbb\x93\x88\x1e" - "\x3b\xb0\xfe\x3b\x67\xca\x75\xe0\x72\x0a\x6d\x47\x49\xc6\x25\x9e" - "\x85\xda\xaf\xda\xf9\x3e\xc0\x97\x67\xca\x7c\x42\xe9\x32\xcd\x2c" - "\x80\x61\x58\xff\xed\xf2\x5d\x87\x38\x26\x7d\xd9\x28\x7f\x07\xf3" - "\xbf\xfc\x0a\xd7\x7d\xfb\xf9\x9e\x41\xa4\x69\xad\x2a\xc4\xde\xc2" - "\xef\x97\x4f\x4b\xdf\xdc\xd7\x12\xf9\x05\x1b\x82\x97\xdf\x16\xf4" - "\x7d\x19\xdb\xdf\x2c\xc9\x8a\x5a\xb1\xef\x66\x3f\xc0\xfb\x75\xee" - "\xf8\x76\xbe\x9e\xf0\x72\xa7\x5c\x1e\xe6\x3f\x1d\x5a\x26\xe9\xad" - "\x48\x78\x2e\x78\xb9\x9e\x9e\xbb\xb9\xef\xb7\x97\x87\xa2\xe0\x6a" - "\x0a\x4d\x37\x62\xab\x45\x3d\x63\x3e\x2e\xd7\x79\x8d\x99\x87\xa5" - "\x5e\xa3\x8e\x43\x52\x1d\x3b\x88\xb7\xa8\x7c\xe2\x7f\x09\x87\x7a" - "\xc9\xef\x89\x8b\xee\x0a\x23\xfc\xb9\x0f\x34\x1d\xf5\xeb\x5a\x33" - "\xea\xf9\x21\xb9\x1e\x54\xc7\xa3\x75\x6e\x95\xec\x7b\x4a\xe4\xaf" - "\x7d\x3a\x02\xb7\x23\x21\x79\x06\x1d\xb7\xd2\x5a\x41\xed\x4a\x66" - "\xdb\x71\x88\xf8\x90\x7c\x52\x35\x8f\xf3\x61\x6d\xff\x44\xbe\xab" - "\xcd\x22\xbe\x0b\xe5\xa5\x8a\x85\x1b\x90\x93\xaa\xcb\x6a\x96\x70" - "\xeb\x1e\x0d\x3b\x72\x6d\xb6\xbe\xa6\x62\x53\x65\x75\xba\xbe\xba" - "\x74\xbd\xd4\xe9\xc3\xfa\xbc\x8d\x8f\xdd\x3d\x72\x3f\x1b\xb1\xed" - "\xcc\x0a\xca\x96\x9d\x41\xfe\xa7\x3d\x60\xfc\x4e\xd1\x9d\x6f\x8b" - "\xfe\xb4\x73\x63\x48\xdf\xe5\xf9\xa9\x8f\xb6\x73\x9b\x6d\x67\xa8" - "\xfe\xa7\xb1\xf1\xe4\x0b\xb0\xf3\x6e\x89\xa6\x1e\x41\xe3\x9d\x5f" - "\xf2\x7a\x72\x9f\x5b\xb5\x1e\xaa\x27\xf7\x2f\xc3\xed\xb3\x9d\x27" - "\xe5\xfa\x06\xc7\x0d\x3b\x5d\xdc\x8e\x92\xec\xb5\x6b\x8d\xcb\x83" - "\xf6\x69\x5d\xad\x34\xe7\xd6\x2f\x8f\xf1\x64\xfb\x1a\x71\x29\x15" - "\xb6\x6a\xdd\xdd\xf9\xb5\x6c\xac\xd8\x4c\xbe\xe8\xa8\x0d\xea\xd6" - "\xcb\xb6\x25\xdf\x1f\xd8\x98\x8b\xfd\xa2\xae\x28\x54\x4e\xb0\xb8" - "\x17\xfb\x25\x1b\xd1\x2d\xc6\xae\xd7\xfd\xc3\x19\x2c\x0b\x71\x53" - "\x5f\x03\x37\xac\x57\x1d\xb6\xdb\x3e\xee\x5f\x93\xec\x6b\x36\xac" - "\x93\xee\x5d\xb3\x70\x9f\xec\x6d\x08\xdb\x8d\x6d\x8b\xe9\xd0\xfe" - "\xdb\xc9\x79\x23\x80\x3c\x4a\x7b\x83\x3c\xb2\x8d\x04\x75\x97\x49" - "\x17\xe1\x3b\xf2\xad\x45\x3a\x93\x68\xc9\x76\x57\xa7\xa1\xbd\xae" - "\x53\x0e\x57\x17\xa9\x68\xbe\x80\x68\xe1\x6c\xf5\x82\xe0\x1f\x8b" - "\x0e\xe5\xd4\xc9\x50\x78\x12\x2c\xa2\xa9\x8a\xf0\x60\xd5\x3a\x25" - "\xf1\x37\xbf\xc7\x6b\x38\x0d\xe5\x68\x9d\x8b\x55\xa7\x29\x63\xf8" - "\xd7\xba\x56\x3d\x13\xe9\x5e\x33\xba\xa3\x8e\xe4\x95\xf0\xb3\x6f" - "\xfd\xe0\x0d\x31\x37\x20\x95\x6b\xf9\x25\x53\xbe\xc7\xf5\xca\x3e" - "\xae\x57\x18\x88\x3b\x18\x2c\x27\xf9\x3e\x5d\xd3\x7b\xfc\x7e\x41" - "\xe9\xfc\xb7\xbb\xcb\xe4\xe3\x77\x93\x59\x6a\xc8\x4e\xf3\xd1\x3a" - "\x15\x3f\xdf\x7c\xa2\xc6\x07\x6b\xbc\xc4\x93\x16\x2f\xf9\x6d\xf7" - "\x70\x7b\xc1\xaa\x92\x7d\xb5\xd3\x5d\x69\x74\xff\x1e\xd6\x2b\x8e" - "\xda\x5d\x6f\x21\x1f\xfb\x56\xba\x5f\x0d\xc4\x78\x5c\x07\xfb\xd0" - "\xa6\x17\x6d\x60\xcd\xa3\xfb\x0c\xc5\x58\xe1\x0c\xb6\x4b\xdc\x9f" - "\x31\x6d\x99\x58\xab\x96\xe5\x84\xf5\x0b\xda\xfb\xee\x92\x60\x60" - "\x59\xa8\xff\xeb\xf6\x88\xb2\x10\xde\x88\xdc\x9e\xd6\xbc\x89\xf3" - "\x1b\x41\x78\x98\x3f\x57\xb2\x0b\x40\xcc\x5d\xfd\x96\x60\x1d\x97" - "\xe7\xae\x82\xb6\x8f\xb5\x4f\x9e\xbb\x12\x3e\xa3\x2d\xcd\x54\x7e" - "\xac\x39\x22\x66\x79\x92\xf8\x5e\x4d\x36\x5c\x4c\x7b\x02\xf5\x3b" - "\xe1\x2e\xdb\x85\xa2\x7d\x76\x55\x90\x7d\xd8\x55\x2b\xc6\xb5\xc3" - "\xe2\x2e\x36\xb4\x01\x76\xd5\x08\x5d\xb6\xab\x48\xd6\x65\x98\xf7" - "\xa8\x24\x2b\x24\x3d\xb7\x6b\x7c\xfc\x1b\x7d\xdf\xff\xae\x66\x99" - "\x46\x32\xcd\x05\x8d\x76\x9d\x1f\x4e\x5e\x51\x13\xa4\xed\x2e\xbe" - "\x76\x11\x8c\xb7\xdd\x1e\x42\x7b\xfa\x4e\x15\x72\x73\x17\xea\x7f" - "\x4b\xa1\xd0\x29\x22\x8c\x25\x5b\xde\xa7\xbb\x13\x05\x0d\x2a\xf8" - "\xdc\x8c\xdb\x92\x86\xb8\xd9\xb4\x2e\x85\xe2\xa0\x90\x65\x36\xd4" - "\x7f\xbb\x12\x45\xbe\x5d\xc7\x08\x97\x50\x7c\x1f\xab\x7c\xb1\x72" - "\xd3\xb6\x4a\x9a\x50\xdb\x52\xad\xdf\xb0\xa9\xb4\x6c\x4a\x94\xf9" - "\x10\x1d\xdd\x97\xea\x69\x1e\xf7\x6b\xf5\x4a\x1a\xed\xd3\x17\xf7" - "\x07\xbc\x32\x47\x7f\x07\xf1\x97\xed\x75\x9a\x2b\xe0\x77\x38\x90" - "\x6f\x54\x31\x6f\x30\x48\xf9\x05\xad\x5f\xb9\x7e\x78\x5b\xb9\x64" - "\x63\xd5\xff\x81\xe8\x28\x8d\x39\xd8\x59\xd8\x3d\x59\xd6\x43\x84" - "\x1f\xb7\xcd\xc7\xd2\xb8\x5c\x0c\x8c\x95\xab\x38\xbd\xc6\xd2\x50" - "\xdf\xd8\x06\x5d\x68\x8b\x4b\xf5\xf2\xc8\xf4\xa0\xfa\xa3\xad\xab" - "\x1e\x61\x15\xc8\xa3\xaf\xa4\x49\xb0\x48\x7e\x22\x6c\xdb\x71\x79" - "\x9f\x38\xf9\x0b\x75\x6c\x25\xff\xbf\xbb\x2f\x07\x1a\x49\xde\xec" - "\xce\x90\xe5\x12\xe9\xa2\x00\xc2\xf9\xe8\x8a\x3b\x1e\xfb\x0d\xf9" - "\x1d\xba\xe1\x0c\xd4\xd7\x8b\xfb\x00\x76\x97\x86\xdf\x07\x50\x6f" - "\xc4\x5f\xbd\xf4\x3b\x18\xf2\x7e\xad\x9f\x9c\xc7\x14\x0c\xdb\xed" - "\x88\x48\x73\x10\x71\xea\x1e\xb7\x57\x84\xcf\x52\xc9\x6f\x31\xdd" - "\x61\x51\x3f\x99\xfc\x82\x06\x79\x63\xf7\x5c\xc9\x06\x19\x24\xda" - "\x91\xbe\xc5\x34\x7c\x2f\x37\xd2\xe4\x7d\x9a\xa3\xa5\x3a\xb1\x91" - "\x0a\xe4\x89\xfa\xd4\x20\x1f\x08\x1a\x61\x58\x46\xd0\x4e\xa9\x4f" - "\xa4\x3c\xa1\x74\xc0\x32\x96\x8b\xb1\x69\x7d\x89\xac\xb3\xc9\x27" - "\xaa\xb8\x0b\x62\x77\xf7\xd1\xba\x41\x1c\xf3\xd7\xd7\x06\x61\xec" - "\xee\x96\xe6\x22\x54\x4c\x69\x33\xb4\xf3\x31\x5b\x7d\x6b\x70\x4e" - "\x60\x77\x37\xc9\x5d\x0e\x23\xd9\xd2\xe9\xf4\xf0\xfb\x49\x15\xf2" - "\xdd\xc3\x98\xf6\xa4\x6c\xa3\xc8\xb0\xba\xc4\x9c\x13\xf7\x63\x89" - "\x7d\xd0\x8e\x69\x86\xc6\xe7\x63\xe9\xfe\x21\x79\x0c\x68\xc6\x7e" - "\xcc\x6d\xef\x57\x12\x83\x63\x3d\xdb\x11\x2e\x6f\x6c\xe3\x70\x70" - "\x7c\xf4\x0a\x44\x8e\xdb\xd0\x7e\xd0\x57\x54\x56\xa0\xf9\xf0\xbc" - "\x69\xd3\x32\x1c\x3a\x3c\x6f\xaa\x58\x46\x5b\xca\xf2\xb2\x72\xf8" - "\x13\x3b\xc7\xb2\x28\xf3\xc7\xe3\x77\x90\xd2\x9c\x11\x8e\x73\x69" - "\xee\x74\x44\xdc\x51\x98\x20\x3d\xd5\xd2\x73\x12\xea\x3d\x1d\xf6" - "\x81\x0f\xe9\x0e\x1a\xc4\xc1\x21\xdd\x0b\x29\xeb\x6c\x94\xe5\xaf" - "\x7c\x20\xaf\x93\xf1\x3d\xf6\xe4\xab\x90\xee\x18\xdd\xfd\xe2\x97" - "\x58\xa7\xf1\xf9\x0f\x31\xbf\x28\xd6\xbd\x30\xdc\x2b\x87\xcb\xf3" - "\xb1\x23\xb6\x9f\x24\xca\x73\xaf\x22\xed\x4f\x66\x06\xf3\x86\xcd" - "\x6d\xa7\xc8\xeb\x6b\x98\xc6\x28\xd3\x4c\x86\x63\xd1\xb3\x0b\x92" - "\x9d\x14\xc7\xed\x6a\xdb\x2b\x8b\xb9\x7f\x50\xb2\xc5\xf9\x3c\xf3" - "\x4f\x6a\xe4\x72\x68\x8c\x40\x78\x4b\x6b\x37\xbc\xdf\x93\x1f\x50" - "\xe1\x47\xf4\x27\xe3\xed\xff\x6d\xee\x05\x1b\xdb\xca\xba\x7c\x57" - "\xd8\xb1\x7d\x9f\x63\x9f\x7d\x0e\xc0\xb7\x95\x75\x8e\x5d\x61\x47" - "\x89\xd6\xfb\x9e\x05\x78\xfd\x7f\x01\xf8\xe3\xd6\x7e\x35\x8a\x74" - "\x5f\x75\x39\x70\x81\xee\xc2\x6b\xc7\x74\xab\x3c\x17\x59\x1b\xe6" - "\x59\x65\x62\x17\xda\x30\x5d\xde\xf9\x0b\xec\x00\xa6\xcd\x2b\xc7" - "\x7a\x6f\x65\x3e\x7f\xdc\x8b\x5f\xe9\x1f\x27\x39\xf4\xd7\x06\x77" - "\x63\x4e\x2e\xb3\x29\x1b\xd8\xee\xbb\xee\x1c\xb1\xfd\xf5\xd2\xf1" - "\x3b\xad\x10\x2e\xd1\x28\xdf\x4c\xef\x2f\x7e\x85\x75\xfa\xaa\x18" - "\x75\x28\xb6\xc1\x57\x98\x0e\xc7\xff\x95\x5c\xde\xb8\xe3\xee\x4c" - "\xc6\x5f\x5a\x34\xb9\x8f\xb8\x76\xf9\xb7\xb2\x63\x0d\xcf\x20\xfe" - "\xe7\x10\xff\x2b\xac\x13\xeb\x70\x74\xdf\x59\x00\xc2\xdf\x4f\x30" - "\xfd\x10\x57\xbc\x5d\x91\xd4\x8e\xf1\xc5\x66\x2d\xb4\x63\xda\x67" - "\x3c\x90\xd4\x86\x69\x9e\xd9\x9c\x04\x1c\xff\x21\xc4\x3b\x29\x27" - "\xd7\x8f\x65\x13\xfe\x58\xfe\x80\x8c\xa7\x5c\x3e\xe1\x2b\xf3\x60" - "\x31\xcd\x77\x25\xaf\x38\x4a\x78\x8b\x39\xfc\x3d\xb3\xdc\xd5\xe5" - "\xe0\x8e\xbb\xeb\x4e\x17\xec\xc9\xa0\x3e\x44\xf5\x71\x23\x4f\x49" - "\xe7\xde\xbe\x92\x69\x20\xc6\x93\x7b\xb2\xe4\xfa\x85\xd6\xab\x60" - "\x53\x15\x9f\x47\x5d\xbf\xa1\xa6\x62\xeb\x7a\x1c\x9d\x4d\x01\x13" - "\x05\xf1\xf1\x5b\x59\xa9\x7e\x53\xa5\xfe\xb9\xf5\x15\x1b\x37\x6d" - "\x2d\xab\x4a\xe7\x43\xee\xea\xb2\xca\x52\x9a\x5e\xad\x5a\x5f\x65" - "\x9a\x12\x61\x73\xdb\x73\x72\x69\x3f\x22\xc9\xb2\xb3\xf0\xda\x2c" - "\x69\x6e\xd1\xcb\x6c\x46\x3e\x76\x13\xfd\x60\xcf\x57\xfa\x1d\x46" - "\x8a\x4f\x12\xba\xe6\xb5\x99\xbc\x5e\xc3\xd9\x72\x3e\xbe\x77\x97" - "\xdb\xa8\x14\x3e\x96\x0d\xc1\x3d\xe4\xaf\xcd\x62\x4a\xac\x13\xd6" - "\x59\xd8\xa9\x79\x7a\xe9\x2c\xdf\x7f\x3f\x03\x3f\xf5\x63\x3d\x69" - "\xad\xa0\x8f\xdb\x81\xfc\xcc\xd1\x4f\x69\x0e\x46\xcf\x6c\x93\x12" - "\x89\x0e\xfb\xc4\x38\x52\xa9\x51\x58\x15\x64\x0b\xb5\x2b\x03\x06" - "\x5a\x13\x6c\xb7\x05\x0c\xc1\x3d\x3c\x7b\x0a\xc8\xa6\xe5\x73\xeb" - "\xbc\x1f\xbc\x5a\x2b\xf3\xb7\x92\xce\x94\xec\x9e\xb1\x44\xc8\xe6" - "\x57\x77\x51\x7a\x6c\xa7\x25\x02\x7f\x7e\x6f\x2b\xea\xa3\x9f\xbe" - "\x1a\x48\xfe\xc4\xe4\xaf\xd6\x49\x77\x17\xaf\xe8\x0e\x34\xad\x38" - "\xee\x47\xbd\x1d\x40\x5b\x94\x35\x7d\x32\xec\x6f\x5a\xf1\xf7\x81" - "\x6d\x69\x4a\x92\xdf\x16\x33\xd2\x67\x53\xf9\x14\x76\xb1\xfc\x3a" - "\x3f\xdd\xb7\xd7\xb4\xe2\x37\x8c\x61\xde\xe4\x15\xbd\xa4\x23\xf1" - "\xdb\x21\x7d\xf7\xd1\x77\x00\x6d\x31\x0c\xfb\x57\xfc\xee\xe7\x77" - "\xfb\xc9\xe9\xc3\xd3\x7e\x4e\xdf\x1a\x05\xdf\x23\x68\x40\xdb\x77" - "\x29\xd5\x55\xae\x23\x1f\x03\xd0\x3c\xc4\x78\x5d\x7e\x5a\x2f\x87" - "\x93\x6d\x2a\xec\x44\xd8\x80\x34\x6d\x11\x32\x6b\x3c\xdd\xd3\x72" - "\x9d\x39\x2d\x9b\x56\x1c\x75\x51\xfb\xd1\x7d\xcc\xbb\x6f\xba\x93" - "\x29\xf7\x6c\x20\xdd\x90\xef\xe7\x6b\x55\x20\xd6\x36\x7e\x7a\x5c" - "\xa6\x1f\xed\x85\x27\xfd\x80\xed\x94\x56\xec\x86\x29\xa2\x7f\xfe" - "\xf4\x74\xc8\x18\x64\x88\x71\x7e\xfe\x29\x3f\x67\xc2\x94\xea\xdd" - "\xe2\xfb\xd5\xa5\x42\x9f\xbd\xa6\x96\xd3\x62\x18\xdf\x03\x44\x6b" - "\x56\xc8\xff\x43\x6d\x11\xe7\x33\x63\xc9\x1f\xc4\x57\xf2\x77\xfe" - "\x5a\xa1\x6c\x1b\xe0\x7b\x49\xf8\x19\xce\xd7\xb2\x23\xd7\x98\x9e" - "\xdd\xb4\xa9\xa6\xb8\xaa\x8c\x1e\x69\xb7\x6f\x99\x13\xa9\x2b\x12" - "\xc5\x3d\x32\xaf\x99\xa9\xde\x24\x3f\xc5\x59\x88\xd7\x8e\x85\x8c" - "\xf7\x68\xce\xe9\x01\x92\xfb\xb4\x56\x8c\x71\xa7\x3e\xab\xdd\xc9" - "\xed\x8d\x2f\xd5\xa0\x8c\xb5\x87\x81\xfb\xd5\x4e\xfa\xb9\x89\xf7" - "\xef\xc6\x4f\x5c\x23\xb6\xbd\x89\xf2\x9e\xa3\xe8\xbe\x1f\x32\xd3" - "\xfd\x4d\xbb\xc8\x4f\x3c\xdd\x91\xa7\xfc\xdb\x1d\xfd\x4a\xb2\x2f" - "\xea\xf0\x9d\xf6\x64\xf0\x79\x2c\xe9\xee\xb5\xdf\x5c\xea\x47\x39" - "\xb2\xb7\x84\x35\x66\xa6\x23\x5d\x8b\x62\xe2\x10\x72\x6e\x56\xac" - "\xc1\xed\x8d\xb9\xe7\x82\xd9\xf3\xd2\x04\xaf\xec\xed\xe1\x6b\x41" - "\x33\xe0\xaf\xcf\xc0\xde\xdf\xab\x74\x38\x4e\x99\x01\xbf\xc0\xf7" - "\x1e\xae\xf7\x75\xe1\x3a\x1a\x66\x0d\x75\xa8\xe2\x18\xf6\x09\xa6" - "\x60\xe2\x0f\x8d\x0c\xf1\x17\x87\x3f\x25\x53\xf0\xdd\xe7\x71\x48" - "\xa9\x84\x49\x2a\xd0\x4c\x4b\x54\xdf\x72\xf3\x4c\xdd\x03\xf7\x2f" - "\xcd\xb0\xd4\xd5\x9a\x59\xc0\xe7\xd5\xb0\xd0\x7b\x02\x7f\xae\x7d" - "\x6c\x8e\x55\xc8\xc2\xc6\x9f\x6b\xa3\xe1\xfa\xba\x8d\xd1\x1e\x4e" - "\xc0\xfe\x5a\x60\xd9\x02\xca\x8f\x46\x5d\x4a\xb2\x55\x48\xbe\xd2" - "\x7d\x97\x67\xe0\xf5\x27\x3f\xc5\x30\xac\xbf\x99\xd9\x3f\x29\x10" - "\x67\x0b\x5e\x7f\x3b\xd0\xf4\x49\x41\x10\xbe\x0a\x08\x3e\xda\xc3" - "\xca\x83\x75\x83\x4a\xa7\xea\x7e\x70\xea\x3d\xf0\x29\xbe\xc7\x68" - "\x4f\x13\xcd\xbd\x10\x0c\x94\x3b\x7b\x2c\x57\x51\x1e\x99\xf9\x3c" - "\xa8\xf2\x02\xbc\xfe\x87\xce\x18\xf9\xf8\x5a\x46\x72\x4e\xf2\x88" - "\x6d\x1f\xb6\x7f\xd6\x80\xa4\xef\xd1\x1e\xd9\x37\x53\xee\x13\x18" - "\x9f\x24\xe6\x63\xf7\x19\xe4\x34\x51\xdb\xe8\xa7\xb4\x87\x91\x39" - "\xa8\x5d\xd9\x95\xc1\x41\xf2\xa1\x16\x63\xcc\x6b\x44\xfd\x93\x47" - "\x36\x4c\x0f\x4a\x88\x69\xbb\xb4\xb4\x56\x8a\x72\xc5\xf0\x92\x66" - "\x97\xa1\x62\x9a\xe7\x7a\xd0\x98\x9f\x56\x68\x7c\x39\x8a\x03\xfb" - "\x59\x1f\xd9\x78\xb4\xd6\x40\xb2\x65\xea\x2e\xc3\x7a\xa6\x5c\xba" - "\x88\xee\xb6\x9a\x3a\xb4\x5c\x11\xb0\x2d\x5e\x44\x7e\xd1\xec\x37" - "\xb0\x7e\x4c\x77\x1a\xd3\xd1\x5c\xd3\x00\xa6\xed\x3e\x0b\xfb\xbe" - "\xc6\xe7\xc9\xa9\xbb\x58\xfb\xd4\x21\x16\x98\x67\x85\x38\x09\x5e" - "\x37\xbf\x5b\x7e\x8c\x8f\x75\xe3\x83\x63\xdd\x86\x14\xbf\x0d\x26" - "\xe5\xc7\xb3\x4f\x11\xc6\x49\x76\x25\x70\xf2\x40\x80\xfb\x87\xa2" - "\xf5\xa0\x53\x28\x47\x4e\xcd\x6f\xc6\xb1\x0d\xdd\x13\xb9\x1d\xdb" - "\xd2\xeb\x25\xbb\xc6\x81\x65\x74\xa1\x9c\x38\xbe\x73\x33\x28\xfd" - "\x98\x07\x75\x44\xdc\x05\x68\x78\xa9\x77\xb0\x9f\x7c\x6a\x3f\x12" - "\xb4\xd5\xec\x7c\x5e\xee\xf5\xfd\xcc\x41\xfb\x78\x3f\xba\xe0\xa6" - "\x7b\xd6\x4f\x52\x9f\xa1\x3d\x8d\x14\x8e\xdf\xc7\xe7\x35\x43\x9a" - "\x73\x68\x10\x7a\xd1\x4a\x63\x16\x9d\x12\xc3\x8f\xa7\xbb\xd1\x9e" - "\x40\xd8\xb4\x7f\x1b\xfb\x7c\xf7\xd4\x21\x88\xc7\xba\x1c\xe7\x36" - "\xd6\xb6\xb4\x54\xcc\xe7\x98\x8b\xb8\xa1\xce\x9f\xf9\xd1\x68\xbf" - "\x92\x9f\xf9\xbd\x81\xf5\x4d\xf5\x40\x2a\x97\x0d\xdc\x67\x59\xda" - "\x1d\x98\xb7\x0b\xed\xe8\x53\x04\x97\xe6\x16\xf0\xbb\x8f\x60\x5c" - "\x00\xfb\xa3\x6c\x53\x9a\x8a\xca\x40\x9b\xc0\xa1\x7f\x8e\xd6\x6c" - "\xec\xe9\xbd\x83\x5e\xa0\xf0\x06\xc4\x0f\x79\xde\x41\x78\x62\x5d" - "\x8f\x8d\xd8\xec\x4b\xe5\xb3\xda\xa4\x1f\xf1\x3b\x57\xe6\x17\x94" - "\xc7\xc7\xc4\x79\xd2\x86\x1c\xa2\x09\xe2\x7f\x2a\x70\x25\x30\x18" - "\x40\xdc\x08\x0e\xab\xd6\xa9\x10\x7f\x45\xbe\x6f\x84\x61\x1d\x4e" - "\xe5\x9b\x47\x18\xc1\xd5\x57\x72\xba\xdd\xce\xaa\xe9\x4e\x22\xfb" - "\x51\xb2\x8d\x89\xe6\x42\x9f\x37\xbc\x34\x75\x97\xf6\x27\x53\x87" - "\xae\x47\xb9\xdc\x50\x7f\xe0\x0a\xe9\x50\xbb\x43\x2e\x33\x46\x9f" - "\xf0\x3a\x51\x1e\x04\xae\xb0\x41\xb2\x85\xc4\xfe\x0b\xbb\xa7\xd8" - "\x1c\x67\xc4\x3a\x2a\x11\x17\x6a\xc7\x1b\x50\xaf\x3c\x40\xfb\x6b" - "\x10\x07\xb4\x83\x1b\x53\xae\x75\x47\x27\xd6\x55\x87\x69\x70\xfc" - "\x63\x17\x7e\xfa\xb7\xb2\x56\x31\xf7\xd0\x38\x7e\xfe\x9d\x5d\x61" - "\xb5\x0d\x75\xbc\x5c\x6b\xfd\x56\x5e\x06\xdd\xdb\x38\x58\xa3\x67" - "\x5f\x76\xe9\xdd\xb1\xfa\x04\xd6\xa7\xd1\x2e\x9f\x79\x27\xdc\xb1" - "\x3f\x5b\x85\x6c\x68\x9a\x3c\x6d\xd7\x03\x6c\x9a\x67\xd1\x22\x5a" - "\xfb\x6c\x57\xf2\xbd\x3e\x42\xaf\x0a\xf9\x7f\x0b\xb6\xef\x45\x6a" - "\x67\xb4\xed\xfa\x69\xcf\x84\xd3\xc3\xf8\x58\x81\xdf\x65\x8d\x52" - "\x8c\xf6\xcb\xd1\x3c\x1c\x96\xe1\x19\x1f\xbb\x86\x95\xd1\x78\x24" - "\x52\xf6\x16\x64\xe6\x94\xe9\x37\xd2\x1e\x18\xc3\x42\xb3\x3e\xed" - "\xf6\xd2\xf9\x7c\x73\x8c\xfe\xc1\xcc\x25\xfa\x02\x1c\xd8\x94\xa7" - "\xaf\x12\x8f\xcc\x82\x5c\x7a\x46\xcc\x95\xea\x47\x6c\x4d\x11\xfa" - "\xef\x2d\x9f\xd0\x91\x4d\x66\x97\x62\x66\xa2\x98\x53\xce\x2c\x45" - "\x3a\x0d\xb9\x93\x7e\xae\x95\xee\x60\x2b\x75\x27\x7d\xd0\xe7\x4e" - "\xca\x49\xa5\xbb\x54\x35\xbb\x98\x57\xe3\x4b\x60\xc4\xa3\x74\x87" - "\x2a\xf2\xd0\x60\xc3\x25\x3e\x26\x83\x95\x73\x2c\x2c\xdf\xcf\x9c" - "\xed\x97\xa8\xdd\x9a\xba\xe5\x36\xe1\xf6\x2d\xc2\xc5\x7a\x8f\x11" - "\x4c\x6c\x6b\x35\xc1\x25\x1b\x17\xd3\x61\xfd\x5f\x3f\x26\xf4\xf3" - "\x1b\xc8\x4b\x8d\x66\x89\x87\x0b\xf0\x5b\xeb\x82\x85\x7c\x5f\x51" - "\xc0\xa6\x23\xdf\x01\xaa\xc0\xee\x3b\x57\xb3\xc6\x0f\xfa\x64\x98" - "\x08\x2b\x51\xc6\x93\xe0\xc1\xb7\x3c\xfb\x15\x68\xca\x2a\x21\xbb" - "\x89\xce\x58\x68\xcc\x0a\xba\x47\xa0\x68\xdc\x36\xc4\x38\x94\x81" - "\x64\x2f\x16\x4d\xf3\x28\xac\x94\x26\x68\x53\x05\x5c\x0d\xca\x80" - "\x17\x75\xac\x56\xdc\x6b\x3a\x24\xcd\x19\xbf\x71\x3c\x7a\x3b\xbe" - "\xc1\xf7\x38\x5e\xb2\xa9\xb0\x6e\x4d\x05\xb7\xa6\x88\x7e\x10\xb0" - "\x29\x40\x9c\xb7\x7b\xe3\x63\xbe\x8e\x29\xf6\x8c\xdc\x82\xf4\x75" - "\xd3\xfc\xa0\x06\xe5\x03\xed\xa5\x0b\x10\xff\xc0\x39\x70\xd6\x8e" - "\x58\xe9\x3e\x51\x79\x4c\x89\xe3\xa3\x40\xaf\xc9\x8f\xf1\x2f\x72" - "\xdf\x42\x68\xab\x95\x60\x7f\x52\x9c\x83\x37\xac\x84\x3f\x6f\x47" - "\x1b\x24\x06\x90\x56\x7c\xcd\x9e\xe8\x93\xbc\xd2\x45\x7b\xb7\xa9" - "\xae\x1a\x1f\xd6\x39\xb4\x5e\xca\x80\x6b\x9f\x0d\xeb\xa5\xc4\x7a" - "\x99\xcf\x03\xef\xab\xe6\x3f\x91\x0d\x73\x43\xd0\x0f\x76\x73\x47" - "\x68\x1d\x03\xe4\xbf\x9e\xd7\xa1\xf9\xb3\x68\x75\x64\x4a\xaa\x23" - "\xd1\xa0\x59\xf6\xc9\xce\xf1\x24\xbb\x61\x08\x9a\x0b\xa7\xed\xa2" - "\xbd\xec\x99\xa5\xa8\x8b\x33\xa9\x0d\xdb\x6c\xcc\x4e\x78\x46\x6b" - "\x2f\x82\x27\x60\xbd\x59\xa2\xd9\x65\x2d\x19\xb1\xbd\x99\x1e\x9d" - "\xde\x6f\xe6\x5d\x9b\xde\x6f\xce\xa6\xfc\x84\x07\xed\xed\xd7\x90" - "\x93\x06\xe4\x6f\xd4\x93\x7b\xa2\x95\x3b\x6d\x57\x07\xe1\x15\x35" - "\x0e\x79\x7f\xa8\xa1\x2a\xbc\x4f\x04\xda\xe8\x9e\xef\xf3\xb4\xff" - "\x1d\xc4\x78\xef\xcd\x53\xc1\xbb\x96\x33\xf7\x6a\x14\xfa\x38\xb2" - "\x03\xb8\x7c\xc3\xfa\x46\x83\xab\x51\xd8\xc9\xcf\x4b\x26\xca\x95" - "\xa8\xf1\xd8\x0f\xf4\x68\x53\xdf\x8a\xf0\x90\x86\xc0\x70\x6c\x38" - "\x65\x9a\xc7\x97\x4a\x74\x45\x5c\xcd\xd8\xaf\x69\xfc\xab\x14\xe3" - "\xc1\xfd\x68\xff\xfe\xac\x8b\x8f\x37\x93\x32\x0b\xc5\xda\xc7\xfe" - "\x72\x17\xfc\x6a\x7c\xae\x16\xbf\xcd\x2e\xb8\xba\x54\xf4\xd5\x9b" - "\xde\x61\x4d\xd9\xee\x80\x4d\xc3\xf4\x3b\x34\x38\xce\x79\x2b\x09" - "\xc7\x1f\x4a\x96\x9c\xed\x0e\xf2\x8e\xd8\xfb\x2f\xf3\x0e\xe6\x3f" - "\x16\x9d\x2f\xf6\xff\xdb\xb5\xf9\x62\xff\x87\xd2\x38\xa3\x44\xec" - "\x2f\x78\x0b\x64\xfd\x81\xe3\x8c\x77\xf4\x75\x54\xfe\xfe\x66\x51" - "\x36\xd2\xc4\x67\x24\x39\x93\x8b\x74\xb3\x62\xda\x74\x59\x36\x10" - "\x0f\x69\xfc\xa4\xbf\x80\xf3\x39\xc6\x65\xa3\x1c\x91\xd6\xcf\x73" - "\xba\x51\xf6\xcd\x0c\xd8\x9a\x52\xdc\x96\xf2\x77\x69\x7f\x9d\x27" - "\x29\x93\xca\xda\xe8\x82\x7f\xe5\x77\x10\x33\x6d\xe6\x49\x84\xd1" - "\xcd\xd7\xab\xc4\x99\x95\x44\xea\xe7\x74\xdf\x09\xf5\x75\x0c\x4b" - "\x41\xbc\x69\x2f\x0e\xea\x9a\xb7\x0e\xca\xb6\x7e\xc0\x66\x24\x7a" - "\xf3\x33\xf2\x38\xde\x99\x39\x8c\xb4\x7b\x53\x19\x38\x74\x65\xbe" - "\x0e\xa8\xce\x57\x76\xcf\x38\xf4\xd7\xf3\x40\xf5\xdf\x74\xcf\x82" - "\x69\x21\xa4\xec\xba\x47\x05\xff\x9e\x01\x4a\xa2\x83\x0b\xde\x3a" - "\x2a\x68\xf7\x96\x47\x6e\x1f\x17\xec\x5f\x47\xed\x41\xe3\xfb\x7c" - "\x1f\x1b\x16\xf3\x15\x2d\xa8\xff\x5e\x93\xee\x4a\x6e\xda\x18\x45" - "\x27\xac\xd4\x57\x54\xeb\x4b\x37\x6d\xab\x9c\x3d\x3b\x6c\xce\x57" - "\xc5\xe7\xef\x6c\x2d\x69\x62\x0d\xa5\x65\x5d\xc8\xf8\x16\x75\x5b" - "\x0b\xd6\xbf\x29\x3b\x52\xaf\xe6\x16\x4b\x47\x34\x8b\x0d\x10\x7c" - "\x5f\x00\xb9\x0b\x42\x3e\x17\x41\xee\xc2\x45\xc5\xab\xcb\xd6\x97" - "\x6e\x0f\x09\xbd\x3b\x74\xac\xd4\xf0\x0e\x96\x1d\x37\x63\x05\xca" - "\x0f\xc5\xaa\x97\x49\xd7\xbc\xfd\x68\x9d\x8f\xfd\x19\x79\x37\x83" - "\xfc\x22\xf4\xd4\xf8\xa0\x07\xe5\x1b\xbb\x89\xe4\x7a\x82\xf0\x0d" - "\xe6\x07\x1a\xc3\x68\xb0\xee\x6e\xd4\xcf\x97\xc5\xfe\xb2\xb7\xb7" - "\xf4\xb6\xa0\xcd\x63\xcf\x49\x17\xe3\x8d\xb7\x0d\x18\x9e\x84\xcf" - "\x27\xc5\x1a\xd9\xdb\x4f\xa3\x9d\x62\xe4\xe7\x40\xb7\xd2\x39\xd0" - "\xb7\x57\x12\x8d\xe6\x79\xac\x20\xfc\x91\xb4\x0c\x92\x9f\x50\x17" - "\xbc\xcd\xcf\xf8\x50\x5a\xcc\xb3\x40\xff\x02\x18\xe8\x49\xeb\xcd" - "\x18\x67\x60\x8d\x39\xe9\xec\xdd\x22\x5a\x37\x48\xc5\xf0\x37\xe3" - "\x14\x5f\x42\x9c\x2e\xe1\xa1\x11\xdb\xdb\xcd\x48\xff\x41\x69\xed" - "\x20\xfa\x99\x03\x49\x07\x4e\x43\xd9\x3d\xcd\xa3\x61\xc5\x74\xa6" - "\x5a\x41\x76\xde\x10\xf6\xe3\x02\xbe\xf7\x99\x74\xa2\x90\x07\x6f" - "\x8f\xcf\xff\xd0\x59\x13\xfc\xf6\xc8\x3c\x3f\x62\x7b\x07\x64\x9e" - "\x0c\xdb\x2b\x5b\x59\x53\x56\x55\x56\xaa\xbf\xbd\x7a\x0a\x84\xdc" - "\x18\x55\x5e\x56\xa9\xaf\x2a\xdb\xbc\xa5\xac\x9a\xdf\xf6\x44\xb1" - "\x11\xf3\x34\xc9\x0f\x95\x8c\xdf\xc9\xc7\xf7\xeb\xbe\x53\x46\x76" - "\x3b\x6b\x7a\xc8\xc5\xef\xc3\xe0\x73\x2b\x9f\x94\x07\xf6\x4d\x35" - "\x8a\x31\x1f\xdd\xa5\xfc\xae\x57\xac\x5b\xe4\xcc\x14\xf3\xfd\xef" - "\xbe\x4e\xdf\x18\xae\x0d\xde\x31\xfd\xce\x67\x34\xbf\x22\xd1\x08" - "\x6d\x98\x77\x8e\xc9\x34\x72\x41\xab\x51\x9a\xcb\x1e\xe2\xb2\x02" - "\x75\xac\x46\xdc\xd3\x33\x2e\x2f\xe6\x07\x48\x4f\xbd\x43\x7b\x48" - "\xe3\xf8\x78\x39\x29\x47\x4f\x65\x11\xcc\xb3\x98\x1f\xdb\x62\x26" - "\xca\x49\x94\x35\x6c\x8f\x0c\x0f\xcb\x3c\x44\xe5\x91\xfc\x40\x3d" - "\x77\xe3\x39\x78\x97\xc3\x0a\xd8\x73\xf4\x24\x3f\xe8\xdc\x41\xa0" - "\x11\xe1\xf0\xf5\xb9\x56\x23\x8d\xd3\xf9\x7d\x35\x08\x8b\xc6\xc7" - "\x28\x07\x0c\x1f\xed\xf0\x2a\x29\x4c\xdc\x69\xf4\x0e\xcd\x6b\xa2" - "\xbc\xc8\xc1\x3e\xfd\xae\x39\x38\xb7\xdd\x6a\xa4\xf9\x1f\x82\xeb" - "\x82\x77\x97\x12\x3c\xb1\xb7\xe0\xdd\x56\x17\xb4\x1c\x0b\xda\x4e" - "\xef\xba\x64\xbd\x24\xf0\x11\x78\x7a\x10\x17\x7e\x47\xa1\x38\x23" - "\xc5\xeb\x4d\xb2\xb2\x59\xaa\xbb\x5c\x1f\x84\x37\x84\x7c\xc7\xd7" - "\x76\x18\x9f\x4b\x16\xf5\x26\xfc\x08\xf7\x50\x9c\x25\x7c\x75\x62" - "\x1e\xbe\x35\x35\x74\x9e\x4a\xdc\x01\xd3\x9a\x11\x3c\x7b\xf9\x8e" - "\x35\x52\x46\xac\x58\xbf\xe1\x45\xda\x24\x9b\x6b\x48\xd7\x93\xbc" - "\x28\x5e\xbd\x32\xf3\xf1\xe2\xcc\xfc\xc7\x56\x15\xf2\x15\xf5\xf1" - "\xf8\xac\xca\xe8\x09\xc2\xf9\x4a\x8b\xbc\xa1\xc3\xf6\x8a\x3f\x03" - "\x6d\x1e\xb1\xae\xd2\x7a\x3c\x7c\x5d\xa5\xf5\x14\xfe\xdc\x00\x07" - "\x12\xf1\xe7\x41\xad\x84\xc1\x6d\x83\x12\xbf\x0c\x21\xbe\x83\x41" - "\x7e\x69\xe3\xfb\x7c\x69\x3e\x5b\x8c\x73\x0f\xe0\x58\xe3\x9d\x8c" - "\xd0\xb8\xa0\x4d\x7f\x40\x3f\x6e\xd3\x8f\xcb\x83\x03\xb9\xb2\x7d" - "\x8f\x61\xa9\x68\xdb\x27\x90\x6d\x2f\xfc\x04\xb6\xf1\x7b\x96\x69" - "\xbc\x41\x63\x0b\x8d\x82\xee\x05\x12\xfd\x93\x6c\xa8\x62\xd4\x27" - "\x74\x0f\x3b\x8d\x33\xb8\x1d\x4f\xfb\xc6\x79\x1f\x3d\xb0\x47\xee" - "\xa3\x64\xcf\xf3\x7b\xe4\xae\xf0\x3b\xdb\x2f\x4a\x63\x43\x9a\xf3" - "\x2b\xa4\xb9\x01\xb4\x8b\x75\x34\x67\x4b\x63\x27\x96\xf4\x49\xa1" - "\x84\xd3\x49\x9a\x2b\x20\x7b\x98\xcf\x17\xd9\x5a\x73\xf9\x1e\xcb" - "\xdd\x33\x56\xf0\x39\x33\xbe\xc7\xf2\xc0\x50\x90\xe7\xda\x3c\xd4" - "\x96\x44\x03\xe4\x03\x2f\xdf\x6f\x35\x5e\xe7\xb6\x94\xf1\x3a\x6f" - "\xc5\x7a\x8e\xf2\x73\x7f\x09\xd2\x5d\xd7\xbc\x8e\xb1\xea\x17\xbd" - "\x6e\x6d\xa5\xdf\x58\x37\x1b\xc4\x53\xbf\x90\xeb\x38\xb1\x7e\x6d" - "\x87\x22\xea\xb7\x71\x62\xfd\xda\xba\xc7\xe7\xc4\x44\x1f\xc1\xb1" - "\x5e\xdb\x65\xaa\x27\xf1\x01\xd6\xf3\x74\x9c\x4e\x7d\x47\xc8\x7b" - "\x7a\x34\xd9\x3a\x6d\x97\x52\x3a\xef\xdf\x9e\x43\xeb\x3d\x04\xeb" - "\x0d\x65\xa0\xfc\x0d\x1b\xfe\xf0\x49\x32\x36\x68\xc3\x32\xaf\xc0" - "\xaf\x3d\xbb\xcb\x3c\x44\xba\xd9\x1b\x73\x9f\xc5\x56\x76\x9a\x68" - "\x49\x34\xc9\xf7\xbb\x1f\x20\x7f\xd5\x23\xb6\x76\xeb\xb8\x6c\x9e" - "\xb7\xba\x33\x6e\x17\xe8\x4f\xb4\x2e\xa4\xf0\x16\x17\xb4\x83\xb4" - "\x8f\xc4\x13\x99\x17\xe9\x6d\x94\xf2\x3b\xe4\xfc\x91\x7e\xe4\xf8" - "\x41\x87\x8d\xeb\xb7\x96\x2d\xe1\x67\x18\xd2\xa4\xab\xf7\xc2\xfb" - "\x55\x93\xf1\x61\x9a\x9b\xc0\x76\x4f\xa0\xb5\x69\xa1\xff\x3a\xca" - "\xe9\x3e\x54\x8c\xcb\x65\x7c\x9f\xfe\xc3\xfc\x8e\x4a\x6c\xa3\x87" - "\xf9\xde\xd5\x5a\x90\xc6\x1f\x1d\x4b\x43\xce\x37\xf0\xbd\x60\xce" - "\x5a\xbe\x7f\x02\xdb\xa7\xbd\x2f\xb8\x27\xac\xa3\x34\x44\x7e\x24" - "\x86\xe2\xb8\xa9\x52\x5f\xbe\xbe\xb2\x74\xd3\x73\xcf\xa5\xeb\xb7" - "\x54\xf2\x95\x01\x52\x2c\xd5\x35\x5b\x50\x3e\x70\xb9\x90\x95\x9b" - "\x5b\xbc\xe2\xb1\x35\x4f\x86\xd9\x19\x6a\xbb\x2d\xb0\x07\xe1\xe2" - "\xf8\xe7\x75\xb7\xd0\x63\x1d\x27\x5d\xf0\x8a\xb0\x79\xd1\x96\xc1" - "\xb6\x9f\x75\x0e\xde\x4b\x0d\x91\x97\xd3\xf0\xdb\xc0\x6c\x1d\x35" - "\xd4\x16\x12\x5e\xbe\x50\xfb\x04\xfb\x40\xdc\x88\xed\x3d\xad\xec" - "\xcf\xb6\x66\x36\x28\x55\xb3\xed\xd0\xac\x64\xd8\x46\xef\x2d\x46" - "\x9d\x7b\x1a\xe3\x0d\x68\x77\x96\x72\x5b\x8c\xda\x44\xd8\xe2\x0e" - "\x8d\xef\x01\x6e\x8b\x17\x6f\x07\x05\xd9\xe1\x72\xff\xf0\xe3\xb8" - "\xd6\xbf\x95\x0d\x14\xfb\x40\x4b\x7c\xde\x50\x49\xbc\x7e\x0b\xf3" - "\x5d\x61\xae\xe2\xed\x6a\x68\xc7\xef\x7d\xe7\x00\x7a\x3d\x3e\x78" - "\xe6\x32\x8e\x47\xf0\xbd\xe1\x2c\xf6\x0d\x5f\x80\x1c\xcb\xd2\x9e" - "\x0e\xa4\xf3\x7b\x07\x65\x5b\x57\xb3\x4b\xcf\xfd\x0d\xd2\x1c\x39" - "\xf1\x02\xd9\x00\xc5\x7e\x8d\x43\x8c\x7f\xdf\xeb\xbe\xe6\xbc\x45" - "\xd2\x07\x51\x79\x13\x71\xec\x22\xbc\x10\xcf\x4e\xc4\xeb\x28\xe1" - "\xb3\xef\x39\xaa\x57\xdc\x22\x8d\xcf\xc0\xcf\xd9\x11\x9e\xcf\x78" - "\x60\x11\xe1\xf7\xcc\xe6\x45\xd0\xf6\x1c\xe7\x0f\xbe\x06\x29\xed" - "\x6d\x50\x21\xef\x24\x9c\x85\x9f\x59\x3d\xfc\xfe\xa7\x9f\x15\xb9" - "\x40\xdd\x25\xec\x61\x31\xff\x45\x69\x28\x4e\xf0\xd8\xcf\xac\xe2" - "\xce\xdd\x9f\x59\xe5\x74\xa1\xb8\x65\xae\x37\xa1\x81\x59\xf1\xdc" - "\x73\x65\x55\xd5\xf2\x7d\x92\x69\x9b\x36\x96\x2e\x93\xce\xe6\x54" - "\x96\x6d\x2b\xae\x28\xe5\x7b\xff\x30\x54\xbc\x46\xd8\x22\xe9\x34" - "\x26\xe0\xfb\x69\xb8\x1d\xf2\xf3\x7f\x6b\x93\x6c\x92\x33\xf0\x3e" - "\xf9\x66\x46\xfd\xfe\x7e\xa3\xd0\x0f\x93\x2f\x8e\xd8\xde\x57\xcb" - "\xfa\x61\x78\x52\x06\xda\xfa\xef\xeb\xb0\xcd\xfb\x43\x65\x16\x9d" - "\x7f\x76\x54\xd2\x1e\x80\x5f\x2c\x0b\x34\x66\x66\xb1\xe4\xf9\x5e" - "\xec\x93\xe4\x97\x00\x68\x2e\x4b\xf8\x09\x7e\xbf\x94\x64\x2a\xed" - "\x21\xa0\x7b\x7d\x07\xe0\xfd\xc5\x68\x8b\x20\x4f\xfd\xc2\x88\x63" - "\xa1\xac\xfa\x1d\xa0\x3e\xb0\x9f\x0d\xd0\x1c\xa5\xd8\x5f\xfc\xbe" - "\xf5\x33\xec\x4f\xd2\x1a\x85\xeb\x75\x8c\x73\xc1\xfb\xc2\x67\xbe" - "\x3d\xb3\x48\x9a\x67\x28\xc2\x74\x87\x5c\x90\x78\x4c\xe8\x21\x83" - "\x9e\xcf\x57\x72\xb9\xf3\x7e\x37\x6b\x32\x74\xf2\x39\xa0\x26\x83" - "\x3e\xc0\xca\xe3\xe8\x1b\xed\x9c\x29\x08\x47\x4d\xf7\xb8\x4b\x7b" - "\x25\xe2\x90\xe6\x5e\xaa\x2f\xc2\x2d\xa1\xf3\xe1\x34\xae\x97\xe0" - "\x97\xd0\x98\x1d\xf5\x4a\x0a\xe9\x16\x96\x94\xb9\x94\x5d\x19\xea" - "\x40\xfd\x46\x76\xa6\x7b\xda\x2e\x1f\x8e\x57\x33\x8d\xdc\xde\xf4" - "\xdc\xc2\x50\xd7\xf9\xf9\xb9\xb4\xed\x30\x35\xdc\xce\x3c\x98\x2b" - "\xf3\x5f\x80\xf2\x5f\x81\x44\xc4\xd1\x3a\x00\x07\xf9\x1e\x1e\x9a" - "\xbb\x25\x1a\x8e\x22\xdd\x58\xb2\x01\xb0\x8c\x4e\xb4\x8d\xa7\x9e" - "\x85\x83\xaf\x12\xfd\xf6\x05\x90\xdf\x47\xb9\xbd\xac\xa1\x7b\x4e" - "\xcf\xc0\xc1\x2d\x44\x3b\x82\x85\x75\xee\xf3\x8d\x14\x3d\x44\xfe" - "\x2b\xa8\xee\x3b\x6b\x51\x17\x3d\x47\xf5\xff\xe0\x2a\xd9\x97\x68" - "\x5b\xf3\x77\x4b\x29\x0b\x70\xda\xf3\xfd\x0c\x1f\x5c\xdd\x39\xc8" - "\x02\x57\x6d\xc0\x4e\xa2\x56\xbf\xaa\x04\x9f\x17\xc7\x81\x34\x6f" - "\x6b\x39\x4f\x3e\x36\x3a\x90\xb7\xf7\x00\x96\xab\xde\xb7\x03\xb4" - "\xe4\x93\xc4\x62\x62\xde\x5e\x4f\x2b\xf4\x9a\x5a\xe1\x1f\x7d\xcd" - "\xe0\xd8\x4a\x6b\x83\x3f\xef\xf8\x27\x73\x33\xed\x1f\x9b\x8c\xef" - "\xeb\xf5\x8f\xf3\xb2\x32\xfe\xe9\xd4\x3f\xc3\x3f\x39\xfe\x19\xf4" - "\x4f\xf1\xef\xec\xee\xa2\x7f\x84\x6e\xe3\x3f\x82\x65\x80\x05\xc8" - "\x46\xa9\x7b\x89\xca\xd8\x83\xb0\x3a\xc8\x97\x87\x36\x30\xac\x9b" - "\x82\xf5\x57\xe5\x9b\xa9\xbf\xbb\x91\x97\xfe\x2b\xe1\xf8\xfb\xb6" - "\x4b\xa0\x76\x54\xfe\x96\xbf\x0b\xdb\x61\xa8\xc3\x59\xda\xcf\xd7" - "\x92\xc9\x77\x09\xdd\x0d\x8c\xba\x37\xd0\x40\x38\xfa\x05\xde\x48" - "\x2f\x95\x9c\xbf\xbd\x6e\x3c\x3f\xf7\x95\x7a\x80\xe8\x81\x38\xf5" - "\x14\x0a\x9a\x74\xf7\x23\x4d\x1f\x97\xe8\x53\x14\x4a\x9f\x83\x83" - "\x44\x1f\xda\x27\x12\xd8\x3a\xd4\x81\xb8\x19\x91\x06\x01\xb9\x0c" - "\x6a\x7f\xc4\x95\x11\xfc\x7d\x97\x20\xd1\x51\x49\xfb\x48\x7e\x9e" - "\xa7\x29\x50\xa9\x03\x57\xce\x77\x36\x5c\x06\x3e\x87\x4b\x7a\xa8" - "\x81\xc7\x13\xcc\x9f\xd3\x9a\x20\xda\x28\xc6\x0c\xfc\x2d\xc5\x9f" - "\x91\xf8\x10\x9f\x59\xd8\x5e\x7b\x10\x87\x93\xd8\x56\x1d\xf4\x14" - "\x3c\xbe\xc0\x44\x7e\x9d\x24\xdb\x22\x18\xde\xb4\x60\x93\x0f\x79" - "\x39\xc0\xc7\x4a\x1f\x9c\x0c\x34\xe6\xa5\x89\x3d\x05\x3f\xdb\x7b" - "\x00\xf5\x4a\x6b\x13\x3f\xb7\x96\xd8\x96\xcc\xef\x07\x85\x77\xf8" - "\xfe\xd6\x9f\x8f\xeb\xff\x9f\xf2\x7b\x47\x3f\xf0\x2a\xf9\xda\x71" - "\xe6\x3a\x89\xcf\xd7\x61\x1a\xb7\x0b\xae\x77\x09\x9d\xf1\x73\x9f" - "\xdc\xa7\x50\x5e\xbb\x65\xfe\xc7\x7e\x8a\x78\x23\xbf\xf3\xb9\x47" - "\x1c\x1c\xfa\x6e\x19\x9f\x7b\x14\x7c\xfe\x8b\xc5\x32\x9f\x63\xdd" - "\x12\x49\x5e\x50\xdf\x8e\xa5\xf7\x51\xae\x76\xd3\x7a\x3e\xbb\xa9" - "\x08\x12\xd1\x5e\x4a\x2c\xd1\x30\xa7\xaf\x8b\xf8\x30\x91\xf7\x1f" - "\x11\x87\xf6\x8e\x5b\x83\xb2\xb8\x0f\xc3\x55\x72\x38\xc9\xe5\x00" - "\x8e\x11\x69\x7c\x9a\xbf\x5d\xc3\xea\x2e\xc3\x4c\x3e\xd7\x23\x87" - "\x6f\x77\x6b\x7a\x75\x40\xfb\xfb\x7c\x74\xe6\x95\xf2\x60\x78\x1c" - "\xca\xf1\xe3\x58\xae\x03\xd3\xa7\xc8\xe9\xd9\x70\x91\xca\x69\xee" - "\xe2\x75\x20\x3f\x0e\xb2\x5c\xc7\xf0\xf8\x7c\xb3\x5b\xc3\xdb\x5d" - "\x0e\xab\x2e\xe2\x7a\x88\xce\xd7\xa1\x7d\xc5\x38\x3e\x67\x79\xb8" - "\x02\xed\x36\x7e\x37\x6a\x48\x98\x92\xce\x32\x92\x0f\x9e\x90\xb0" - "\x38\xc4\x19\xc6\xbf\xb1\xec\x86\x17\xb8\x1d\xa9\xcb\xdf\x8e\xf0" - "\xa8\x9c\x17\xa4\xb2\xb7\x33\x10\xbe\xbd\x44\x98\xd0\x79\x87\x5a" - "\xc6\x6d\x46\xb2\x7f\x86\x8b\x78\xd9\x81\xe1\x22\xa5\x7f\xb8\x28" - "\x8e\xca\x27\x58\x34\xcf\xc8\xef\x68\xf5\x0d\x02\xf9\x95\x64\x8d" - "\x9f\x98\x18\xed\xe7\x44\xb8\x1c\x1f\x33\x8e\xe3\x93\x3e\x89\x7e" - "\x86\xd1\x7e\x38\xcd\x51\xf7\x14\xf6\x8b\x5f\x12\xef\x83\x5f\x9b" - "\x55\xa0\x7f\x81\xd6\x80\x7e\xf9\x23\xe2\x41\x3f\xca\x0a\x7f\x52" - "\x56\xc1\xfc\x41\x50\xd4\x61\xff\x13\xe3\xbc\x5f\xde\x47\x3e\x90" - "\x2c\x01\xc6\xf0\x3d\x9d\xf8\x5f\x33\x44\xeb\x80\x59\x85\x7c\xed" - "\x2d\xf9\x17\x7a\xa7\x77\x10\xba\xad\x9f\x43\xb7\xcf\x69\x3d\x7e" - "\xc9\xad\x12\x6b\x70\x2a\x82\x9b\x47\x71\x16\xec\x73\xc5\xfe\x8e" - "\x98\x73\x71\x64\xff\x22\xed\xfe\x28\xe4\xfb\x2f\x3b\x64\xbb\xf7" - "\x1b\xea\xe0\x25\x3f\x4a\xb4\x46\x1f\x68\x7a\x85\x7c\x96\x59\xd8" - "\x48\x1a\xcc\xdf\x41\xe3\xde\x5f\xf6\x4d\xf3\x80\x51\x82\x7b\x51" - "\x82\xeb\xbd\x16\x5c\xe2\xdb\xee\x16\x3e\xf7\x8b\x75\x7a\x45\xeb" - "\x47\xd8\xfe\xe4\x57\x0a\x50\x8f\x58\x2c\x57\x69\x0e\xe4\xf0\x4a" - "\x2c\x47\xdb\xeb\xeb\x03\xf2\xc7\xd6\x16\x40\x7d\x7b\x51\x07\xd2" - "\x7a\xa3\xe5\x02\xfc\x6a\x4e\x80\xa5\x69\xd1\x3e\xa7\x39\x4f\x0b" - "\xc9\x6a\xb2\xf5\xeb\xfc\x30\xc9\x59\xe3\x02\xf2\x27\x84\x30\xee" - "\xfb\x1d\xcd\x2f\xa3\xbc\xf3\x33\x9d\xf2\x93\x2b\x2e\x68\x40\x1d" - "\xc0\xfd\x0b\xed\xbe\xe9\x9d\x69\xbb\xe0\x01\xa6\xd4\xf0\xf5\x64" - "\xd4\x4f\x69\xd8\xb6\x66\xb1\xbe\x99\x59\x1e\xb2\xb6\x19\x87\x65" - "\x7d\x48\x6b\x9b\x4c\x9b\x69\x68\xa5\xf9\xde\xa4\x5f\x80\x3b\xe9" - "\x03\x37\xc3\xb6\x1b\xb1\xfd\xca\xe5\x82\x43\x5c\xaf\xef\xa5\xbd" - "\xb4\x5c\x67\x1c\xce\x73\x27\x59\x69\xfe\x96\xee\x5a\x52\x04\xb6" - "\xfa\x3a\x1b\xbe\x46\xfb\x85\xd3\xe5\xf0\xdc\xde\xa1\x11\x07\xb3" - "\x5b\xbd\xd4\x9f\xa4\x32\x34\x58\x86\x9f\x35\x5a\xbd\x2e\x38\x2c" - "\xe9\x66\xfe\xae\xa3\x78\xdf\x18\xed\xfd\xfd\xd5\xde\xd6\x51\x9a" - "\x63\xfb\x55\x06\xda\x77\x8e\x61\xad\xd5\xbb\x46\x67\x45\xfd\x7e" - "\xb8\xc4\xa5\x3c\x6d\x97\xc6\xdc\xdc\x67\x52\xcc\xf5\xed\x77\x75" - "\x53\x9c\x08\x04\x6d\xd5\x94\x73\xf0\xe1\x1f\x46\x6d\xa0\x1c\x43" - "\x1d\x3d\xaa\x44\x3b\xfd\xdd\xa2\xc4\x7d\x33\xc0\x80\x71\x33\xce" - "\xc1\xe1\xbf\xf3\x29\x21\x05\x7f\x5a\xf7\x4d\xe5\x93\x11\xae\x91" - "\xe6\x23\x7a\x2e\xd1\xf8\xf3\x88\x38\x27\xfc\x0e\xa4\x06\x10\x1e" - "\xcd\xa3\x36\xcc\x80\x54\x9a\x13\xc0\xb0\xb4\x62\xbf\x58\x63\x90" - "\xc7\x2f\xbb\x67\x40\x7a\x78\xb9\x87\x25\x5f\x48\x1f\xf2\x3b\xe3" - "\xb6\xb9\xe1\x66\xd3\xfd\xec\x0c\xc2\x25\x1f\xb4\x8c\xdd\xa4\x53" - "\x8a\xb5\xb8\x23\xdb\x35\x2d\x82\xff\xf8\x9c\x3a\xf2\x1d\xad\x59" - "\x48\x73\xb5\x0a\xee\x2b\x2a\x39\xdb\x45\x7b\x2f\x43\xe6\x64\xb4" - "\x1c\x0f\xc9\xcf\x8b\x7f\xf7\x9d\x25\x04\x83\xf0\x29\x5e\x2f\xe6" - "\x79\xc9\x07\x0c\xd2\x95\xfb\xf1\xdd\xfb\x0e\x24\xbe\xf6\x0e\x68" - "\x7b\x9e\xe3\xf5\x3a\x24\xfa\xa4\x0a\x08\xdf\x80\x9d\xfa\x1b\xf2" - "\x06\xe2\x4d\xe5\x11\x8f\xf4\xfa\x2e\x3a\x2c\x35\x2c\xe0\x78\x81" - "\xce\x1f\x1e\xf9\xca\x51\x75\x04\xf2\xc9\x67\x0e\x9d\x9b\x5f\x07" - "\xee\x76\x84\xd7\x3e\x03\xb4\x08\xeb\xb2\x73\x23\xc9\x5c\xdd\xad" - "\x8e\xaa\xa3\x08\xfb\xc3\xc9\xa4\xdb\x5e\x47\xfa\x08\x1d\xf7\xe1" - "\x71\xa7\xb7\x1f\xc8\x47\xee\x2a\x13\xf3\x13\x1c\x4c\xb3\x9c\xd7" - "\xf7\x5d\x9d\xbe\x58\xf8\xe9\xe1\x75\x1d\x9f\x3f\x97\xea\xe1\xbc" - "\xc4\xe1\x15\x3a\x4b\xd0\x2e\x97\xea\x24\xd3\x5a\xf0\xd7\x87\x8d" - "\x8e\xaa\x83\x40\xed\x43\xe9\xf1\xdb\xea\x1c\xc2\xb4\xe7\xc3\xdb" - "\x85\xd2\x60\xdc\xc7\x08\xf7\xde\xe0\xba\x10\xad\x57\x04\xd3\xb4" - "\x62\x7d\x90\x56\x9e\x77\x91\x46\x62\x1e\xed\xc3\x59\x84\x2b\xb6" - "\xdd\x4c\x67\xcd\xe7\xd1\xf7\x3c\xa3\x0c\x40\xbe\xdf\xd5\xcb\xe7" - "\xc2\x7f\x3d\x75\x95\x2f\xc0\x84\x5c\xfb\xb5\x23\x80\xf2\xc0\x85" - "\x4f\x92\x09\x5c\xae\xcc\x23\xff\x4b\xbf\xfe\x4c\xa3\x10\xed\x4b" - "\x75\x21\xfb\x2b\x5a\x1b\x87\xcc\xd3\x6b\x09\x57\xb9\x8d\x99\xf6" - "\x70\x5a\x80\xd6\x5f\x66\x00\xdf\xc7\x2c\xf8\x8f\xd9\x11\xee\xc7" - "\x92\x8d\x7b\x44\xd2\xcd\x47\x86\x93\xb2\xd6\xb1\x97\x75\x20\xef" - "\x7f\xc0\xfe\x5b\x54\x2c\xf6\x94\xe8\x48\x56\xb5\x2b\x99\x74\xcf" - "\xc9\xaf\x1d\x52\xde\x43\xc2\xef\xd8\xaf\xad\x98\xff\x50\xd4\xfa" - "\xc6\xcd\x20\x5f\xab\x16\xf2\x49\xc4\xd7\xc9\x51\x66\xa1\x5e\x98" - "\xe4\xf4\x8c\xf2\x33\x2a\x67\xe1\xa3\x65\x74\x5f\x2d\xed\x43\x97" - "\x71\xfb\x6e\x73\xea\x1f\xa9\xc5\xdc\xda\x47\xd9\xf2\xb8\x91\x69" - "\x91\xc6\x36\x0d\xf7\x97\x4a\xeb\xae\x9e\xa4\xc3\x06\x77\xd2\x27" - "\x25\xa2\xdf\x7c\x64\x62\x49\x42\xee\x16\x7b\xc1\x4a\xf5\x92\xc6" - "\x4f\x93\xa8\xce\x08\xc7\x8e\x63\xda\x2c\x61\x5b\x08\xd8\x31\x7d" - "\x10\xcb\x75\xc3\x3a\x89\xf3\x4b\x87\xd3\x78\xdd\xe8\x0c\x2e\xaf" - "\x5b\xe7\x54\x3e\x97\xf5\xdd\xea\xd3\x2f\x68\x7b\xd8\xe0\x98\x41" - "\x30\x3e\xfe\x80\xef\x0f\xc2\x36\x11\x73\x8e\x9d\x25\x6c\xca\x6b" - "\x53\xbe\x1b\xcc\x4e\xb1\xaf\xd8\xfe\x49\xc9\x9b\x74\x47\x00\xdf" - "\x93\x4c\xe7\x46\x3e\x7e\x1d\x65\x7a\x09\xbf\x33\x19\xcb\x43\xfe" - "\x08\x91\x43\x1f\x6b\xa9\xad\xe6\x1d\x01\xa3\xe0\xc3\x8f\xe3\x69" - "\x4e\x49\xf8\x88\xef\x3c\x8a\x7c\x2f\xcd\xc9\xc9\x7b\x65\x14\x7c" - "\xaf\x4c\xa8\x8c\xfd\x8e\x38\x8a\x3b\x32\x93\x0f\xf6\xe1\xfb\x41" - "\xbe\x47\x10\xf1\xdd\xe6\x93\xe5\x5f\xe7\x41\x76\x85\x0d\xd0\x9c" - "\x1f\xd9\x4f\xc5\x24\xcb\xea\x84\x0f\x8f\x11\xdb\xc7\x59\xb2\xad" - "\x42\xb6\x35\xed\x85\xa2\x74\xd8\xf6\x17\x29\x8d\xf0\x31\x70\x4e" - "\x3a\xcf\xf0\xf1\x93\xd2\x59\x85\x34\xda\xa7\x84\x79\x51\xde\x9d" - "\xe2\xed\x4d\x34\xa0\xb2\x39\xee\x4a\x9a\xcf\xfa\xb8\x35\x38\xc7" - "\xda\xc9\xf7\x45\x89\xf3\x46\x1f\xff\x6f\xf6\xbe\x3f\x20\xaa\x2a" - "\xed\xff\xcc\x80\x4a\x8a\xce\x40\xc8\x8e\x65\x39\x95\xf6\x4e\xbb" - "\x58\xd8\xd2\x86\xbd\x6e\x51\xd8\xa6\xe6\xaf\x5a\x6b\xb1\x35\x41" - "\xd3\x16\x4d\x6d\x44\x44\x54\x04\x44\xe3\x4b\xa5\x38\x1a\xba\xa8" - "\x88\xf4\xbe\x6a\x56\x66\xb4\xaf\x15\x96\x3f\xc6\xc4\x56\x0d\x18" - "\x72\xa9\x97\x5c\xb2\x91\x90\x90\x50\x27\x19\x60\x84\x99\x7b\xbe" - "\xcf\x73\xce\xbd\x73\xe7\xe2\x0c\x38\xa5\xd9\x7e\xf7\xfb\x07\xdc" - "\xb9\xe7\x9e\x7b\xee\x39\xcf\x39\xe7\x73\x9e\xe7\x39\xcf\x79\x9e" - "\x3d\xd2\x18\x81\xf6\xf6\xe4\x7e\x81\x8b\x6f\x39\x1c\x41\xd8\x18" - "\x68\xa6\xba\xde\x77\x14\xe0\x98\x7c\xaf\xc6\x93\x4e\x13\x9c\x42" - "\x06\xc7\xa0\xe2\x52\xca\xe6\x7a\x71\x69\xf7\x7c\xc5\xdf\x86\x49" - "\x3c\x09\xa7\xb3\x16\xf0\x65\x8f\x93\xd1\xda\x34\x0c\x79\x30\xcd" - "\xd2\x74\xf4\x47\xf8\xb7\x1f\xd0\xd7\xa3\xd3\x34\x2c\xd2\x95\xa1" - "\x43\x3f\xf2\x44\x30\x0d\x8b\xa9\x37\x12\x75\xbc\x11\xf5\xca\x99" - "\x66\x94\x17\x41\x1e\xd5\xd2\x50\xe0\x53\x60\x9e\x2f\x9b\x45\x34" - "\xcf\x26\x42\xd9\x19\x86\x30\xf4\xc5\x88\x7e\x18\xd1\x97\xaa\x2b" - "\xc3\x10\x0a\xbf\xc3\x81\xaf\xd3\x52\xed\x30\x3d\xee\x4d\xbb\xb2" - "\x28\xe0\x71\x0d\xfa\x83\x54\x5b\x6c\x0e\xb2\xec\x1c\x09\x42\x5f" - "\x8f\xce\xb5\x99\xd5\x15\xf6\xaf\x99\xac\xd4\xcf\x48\xc2\x80\x0f" - "\x19\x08\x34\xd7\x09\x21\x99\x66\x58\xe3\x4b\x79\xbb\x2f\x50\xde" - "\x6e\x5e\x6f\xac\x3f\xc7\xb8\xdf\xc6\xa4\xb3\xba\xef\x59\xef\x84" - "\xf2\x05\x53\xf4\x08\x97\x29\x3a\x9a\x9f\x99\x29\x23\xe9\xc9\xb4" - "\xc1\x62\x2f\x03\xf9\xad\x85\xc5\xbe\xc0\xbd\x6f\x6c\x23\xb6\x0f" - "\xbf\xfd\xd9\xc5\x73\xcc\x77\xa5\x13\xee\x33\xe6\x88\xef\x34\xc1" - "\x3b\x4d\x65\xa4\xdd\x14\xcd\xda\x5e\x61\xe7\xef\xc6\xb3\xdf\xf8" - "\xbe\x07\x1d\xc4\x36\xbb\xe9\x00\x6d\xc7\xf6\x61\xfb\x9d\x48\x13" - "\xa0\x81\xd8\x56\x5d\x87\xd8\x4e\x6c\xe3\x71\x58\x75\x36\x41\x3b" - "\xa1\xad\xac\x9d\x1d\xd0\xce\xa3\x89\x84\x38\xd6\xbd\x1d\x73\x29" - "\x34\x3a\x1a\xe5\xdd\x8c\xcf\x81\x97\x4f\x33\x11\x90\x6b\x03\xdf" - "\x49\x37\xa9\x5f\x01\xde\x24\xdd\x06\xf2\xad\x8d\x36\x54\x40\x9b" - "\x2c\x46\xf8\x73\x16\x10\xe4\x71\x24\xbe\x1d\xbe\xad\xfb\x4c\x38" - "\x43\xd2\x1b\x68\x03\xf0\xa8\xc0\xff\x40\x9e\x44\x68\x3f\xc8\xc3" - "\xf5\x62\xfd\x31\xef\xb2\x1f\x78\xbb\x34\x73\x48\xd8\xc1\x67\x72" - "\xd4\x96\xea\x1c\x22\xb5\x65\x2a\xe4\x83\xf6\xe8\xa0\x2c\x16\x73" - "\x51\x80\x76\x6e\x86\x7a\x3a\x3c\xda\x54\xde\xe4\x80\x32\xbf\x20" - "\xbd\x27\x12\xd5\xa6\xf3\xd0\x8e\xf3\x44\x67\x4a\x07\xfe\xeb\x49" - "\xe4\x1b\xff\xa7\xbc\x4f\x1c\x19\x6c\x25\x7f\xe3\xf1\xba\xb8\x6f" - "\xb9\xfe\x8d\x64\x4f\x8b\xe4\x3f\x4e\x40\xff\x9b\x21\x99\x35\x38" - "\x8e\x98\x2f\x39\x5c\x33\xda\x60\xcc\xe0\x1e\xf5\x22\xf8\x46\x9b" - "\x21\x9c\xd5\x27\x8b\xfb\x9f\x83\x7b\x5c\xf3\xd0\x1e\x5d\x05\xef" - "\x55\x53\xa0\x19\x96\x0f\xfc\x5c\x29\x5e\x91\x86\x5e\x6d\x87\x76" - "\x93\x68\xf8\x46\x22\xca\xf2\xc5\xe9\x36\xf5\x4b\xbb\x49\x84\x7f" - "\x98\xf2\xfe\x60\x5f\xf8\x8d\x3a\x49\x2c\x0f\xda\x16\xda\x48\x3e" - "\xb8\x41\x39\xc7\xf4\x0c\xcb\x38\x0e\xbe\x5f\x89\x3a\x3f\x3f\xbf" - "\xcb\xfd\x56\x66\xd1\x1c\x3f\xdf\xab\x92\xea\x01\xbf\x7d\xc6\x1a" - "\xf1\x9f\x0e\x1f\x44\xf8\x2a\x6b\xf5\x06\x76\x36\x2e\x23\x77\x03" - "\xe0\x05\xf0\x0a\x18\xdb\x1d\xf9\xba\xd2\x6d\x76\xb2\x60\x0b\x09" - "\xca\x38\x87\x3a\xa6\x71\xe4\x70\x41\x24\x29\xbc\x88\x3e\x21\x0c" - "\xa1\xaf\x5d\xc4\x7d\x46\x8e\x21\xc8\x93\xa2\xee\x94\x2e\x30\x68" - "\xd7\x6c\x90\x78\xf8\x0f\x5a\xd2\x5a\x88\x9a\xc7\x1b\xfd\xc0\x3e" - "\x52\x4f\x9d\x79\x6a\x21\xb1\x00\x7d\x2b\x86\x6e\x9f\x88\xbe\x15" - "\x25\x5f\x83\x8c\xf7\x49\x85\x39\xd7\xac\xeb\xbd\x3a\x89\x44\xa0" - "\x5f\x54\x8d\x8d\xf3\x72\x7c\xbd\xfe\x70\x30\xd4\x4f\x2b\xee\xad" - "\x69\xb9\xff\xc1\xf7\xe7\x6c\xbd\xc8\xf4\x9d\xf8\xfc\x29\x17\xc8" - "\x32\xac\xdc\x24\x32\xb8\xe0\x22\x31\x20\x1f\x14\x7f\x86\xf3\x6c" - "\x28\x1f\x8e\x6b\xd2\x50\xd7\xf7\x06\xb2\xa5\x51\xf6\x9b\x6a\x5b" - "\x80\xbe\x56\xa9\xce\xd7\x79\xc0\x35\xe1\x6c\x2f\x9d\xf9\xc2\x42" - "\xfb\x00\xb8\x27\x79\xeb\x48\xe0\xe1\x81\x84\xa0\xde\x10\xf7\xe5" - "\x0e\x3b\xf9\x79\x8c\xb6\xac\x0f\x4b\x25\xbf\x92\xde\xb1\xfc\x0d" - "\xb4\x71\x04\x1e\xeb\x0d\x3f\xc7\xd1\x87\x75\x3e\x65\x15\x28\x13" - "\xc7\xc1\x8f\x2b\xb7\x64\x44\x17\x7c\x4d\xa0\x60\xe2\xb2\x99\xd0" - "\x13\x64\x46\x5b\x9b\x99\xfb\x43\x2a\x29\xb1\xac\x14\x3c\xe4\xb1" - "\x92\x8d\xf8\x0c\xd3\xd0\xc7\x44\x0c\xeb\xf7\x12\x2b\xca\x68\xa2" - "\x9c\x7b\x50\xef\x4e\xe3\xfc\x16\xae\xbb\x48\xaf\xad\xdc\x67\x55" - "\xbf\xb6\xac\x12\xa7\xb4\xf6\x22\x0f\xc2\xf5\xd1\x7b\xb5\x56\xf5" - "\xa9\xa3\xbe\x68\x89\x7b\x26\xcc\x7f\x16\xda\xba\xa0\x5f\xcb\xac" - "\xbd\x31\xd2\x5a\xcc\xce\xb9\xae\xb8\xe9\x91\x05\x8b\xc9\xc0\x3f" - "\x0e\x08\x22\xb8\x2f\x05\x79\x1b\x38\x8f\xb0\x37\x51\xd6\xe1\xc7" - "\xb0\xb1\x81\xe7\xa5\x98\x3c\x84\x7e\x88\xb8\x3f\xd7\x26\xc9\x1f" - "\x11\xe7\x15\xf6\xbe\xe4\xf1\x9d\x9d\xee\x35\x1f\xbe\x81\xfb\xbd" - "\x58\x3e\xe7\xa3\xf6\x4e\x61\x36\xf7\x90\x8f\xf3\x02\x7b\xa7\x74" - "\x41\x5f\x03\xd2\x57\x10\x65\x5f\x4b\xd3\x77\x9c\xbe\xa9\x24\x00" - "\xed\x5a\x0f\xa6\x5b\x03\xfb\x71\x3f\x83\x1a\xf8\xfe\x25\x7c\x8e" - "\xf3\xd2\x7c\x37\xea\x41\x3f\x7a\xca\x82\x3c\x46\x47\x5c\xf0\x78" - "\xd4\x4f\x30\xb9\xe1\xa3\x91\x68\x73\x0a\x69\xa1\x07\xce\x3b\x02" - "\xd7\x2c\x21\x11\xdc\xaf\xd3\x47\xec\x9c\x98\xed\x57\x2f\xb4\xdd" - "\x11\x46\x74\x77\xe4\x11\x43\x5b\xd6\x47\x73\xac\xea\xaf\x99\x0d" - "\x10\xfb\xfe\xba\xfd\x26\x66\x03\xdb\x6e\xed\xc1\xfb\xea\xe3\x1b" - "\xe0\xde\x20\xdf\x7f\xb4\x5d\xdc\xbf\x01\x9e\xec\xe3\xa0\xad\xe7" - "\x19\x2f\x55\xc9\x74\x62\xa6\xed\x0e\xd9\x7e\xe0\x63\xee\x87\x03" - "\xae\x87\x8d\x84\xa0\x3d\x69\x61\x38\xad\x84\xef\x01\xff\xb3\x77" - "\xa0\xa8\x43\xaa\x64\xe3\x0a\x79\xf3\x6c\x94\x17\xbf\x33\xa3\x4d" - "\x2a\xae\x69\xc0\xcb\xc5\x70\x79\x63\x87\x56\x80\xf1\x23\xb7\xff" - "\xa3\x85\xa8\x67\xf5\x8a\xdf\x9b\x08\x61\xef\xac\xdd\x1e\xcd\xec" - "\x4e\xd6\xee\x6f\x80\x6b\x10\xcc\x05\x7c\x16\x0c\x63\x0e\xaf\x5a" - "\xb8\xa2\xac\x17\x06\xcf\x2b\x71\x5c\x82\xbc\xad\xc3\x78\x3c\xcd" - "\x21\xdb\x23\x7d\xd9\x8e\x23\x6d\x2c\x2b\x9f\x26\xdc\xb6\xee\xe3" - "\x26\x8c\xc5\x32\x61\x0b\x21\x0b\x9c\xb4\x5d\x7f\x2b\xe9\x05\xed" - "\x6d\xca\xd8\x82\x7b\xe0\x1f\x9b\x95\x7b\xe0\x1f\x5b\x09\xd9\xa7" - "\x87\x3f\x48\xd9\x07\x7c\xe4\xc7\x4d\xf2\xdf\x3e\x6b\x5b\xd6\xc7" - "\x4d\x40\x47\xee\x6b\xca\xaf\xf9\xfa\x31\x8b\x91\xb7\x06\x65\xb8" - "\x90\x97\x88\xd8\xde\x18\xb8\x0f\xa2\x21\xfb\x33\xc5\xf6\xea\xe0" - "\x5e\xab\xcf\x80\x35\x38\x04\x68\x72\x13\xb4\x39\x64\x7f\x03\xb6" - "\x17\xeb\xdb\x1c\xf2\x86\xc2\x6e\x1e\xcb\xc4\xf6\xdb\x42\xe0\x3d" - "\xa0\x25\xbd\xfb\xc9\x62\x89\x9e\x22\x9d\xd0\xd6\x58\xdd\x0c\x65" - "\x70\x9e\x0d\xf2\x43\x19\x52\x7e\x37\xed\x6f\x42\x1f\x29\xd0\xa7" - "\x90\x0f\xe4\xf7\x20\xc9\x26\xbf\x2d\x6b\x5f\xf5\xa1\x39\x7c\x5f" - "\x05\xdf\xb5\x7b\xbc\x8b\xe7\xa0\x15\xef\x87\x78\xf4\xdd\x4d\xe8" - "\x2b\x20\xd3\xc6\xfb\x6e\x7b\x8c\x58\x97\x30\x5e\x97\xed\x36\x18" - "\x63\xe7\x78\x7d\xf6\x95\xf9\x9a\x63\xe9\xb7\x01\x8f\x0a\x9c\xfb" - "\x3d\x5c\x76\x1d\x61\x19\x68\x27\x96\x02\x01\xf8\x96\x1d\x91\x31" - "\xe9\xd4\x5c\x4f\xf6\x6f\xaf\x70\x34\xf8\x89\x99\xfb\x79\x8c\xb4" - "\xf6\x4c\x62\x49\xbb\x17\xf7\x69\xc9\x79\x72\xe0\x0b\x8b\x8d\x9d" - "\x51\xc2\xdf\xcc\x1e\x12\xf7\xa7\x71\x7d\x43\xdf\xbf\x92\x9e\x40" - "\x80\xbc\x85\x98\x0e\x69\x78\x6e\x72\xab\xc7\x33\xba\x6e\xbb\xb8" - "\x8f\x74\x60\x35\xf2\x47\xac\xbe\xce\xc7\xcc\x58\x67\x98\x63\x3a" - "\x6c\x43\x06\xda\x0e\x3b\xdb\xcc\x38\x57\xf4\x29\xa8\xf7\x3c\x30" - "\x0b\xc6\x23\x15\xd6\x6e\xd7\xf9\xd7\x86\x03\x51\xf8\xcd\x0c\x27" - "\x3d\x6f\x0b\xd9\xae\x43\xbe\x6a\x4d\x7a\x8f\xa0\xd8\x02\x6a\x6e" - "\x0e\xdd\x11\xd9\x96\x75\x60\xd5\xa1\x54\xde\x67\x7e\x96\xbb\x4a" - "\x6a\x7b\xa1\xd8\x76\xa0\x17\x1b\xb3\xf7\xe4\x73\x9f\xca\x90\xa7" - "\xd4\xf7\x5a\xb6\x43\x8b\x6b\x19\xac\x19\x97\x38\x2d\x0e\x86\xb9" - "\xd7\x0c\xbf\xea\x71\x30\xec\x0a\xbe\xd1\x21\x7e\x23\xf5\x47\x7e" - "\xa3\x8b\xf3\x31\x8c\x67\xbc\x05\xa4\xff\x40\xff\xe5\xdf\x83\x95" - "\xdc\xb6\x69\x87\x8e\x63\xe9\xa1\x85\x2e\x90\x41\x9d\xda\xfd\x31" - "\x2c\x0e\xb5\x9a\x64\x5a\xac\x4e\xe2\x34\xbd\x44\xca\x53\xdb\x89" - "\x39\xe5\x04\xa9\x23\x66\x16\xff\xa0\x3c\x19\xe5\xce\xfd\x99\x1d" - "\xeb\x76\x64\x76\xa8\x0f\x62\xac\x9e\xc4\x2d\xe8\xbf\xda\x63\x9c" - "\x55\xd8\x4f\x10\x4b\x02\xea\x8a\x2b\x51\x47\x9f\x09\x73\x2e\x46" - "\x00\xcc\x00\x39\xc3\xc5\xe8\x01\x3c\x18\x97\x19\xdf\x36\x30\x99" - "\xd1\xc6\xfc\xba\xf5\x05\xde\x3d\x98\x66\xad\x72\xa2\x1e\xdf\xd5" - "\x11\xa7\x6f\xcb\x22\x13\xd1\x97\x34\xea\xd0\xa9\x36\x76\xd4\x04" - "\x67\x00\x65\x32\x21\xc8\x2f\xe8\x53\xda\x62\xb7\x12\x17\xc8\x02" - "\x05\xad\x24\xac\x00\xf8\x67\xc0\x72\x86\xf7\x5b\x45\x9f\xd2\xab" - "\x5b\x65\x9f\xd2\x85\xa8\xaf\xaa\x86\xdf\xad\x24\xd0\xb5\xf6\x6d" - "\xc3\xe6\x56\x32\x78\x4b\x0a\x31\x6c\x46\x7d\xe4\x59\xce\xbf\x21" - "\xbf\xc1\xfc\x4b\xbf\x68\xc0\x7d\x11\x99\x7f\xc3\x33\x76\x32\x9e" - "\x05\x32\x3d\x8e\x5f\xf4\x3e\xc4\x6c\xb2\x9c\xa6\xed\xd1\x40\xe3" - "\x86\x8e\x75\x6f\x40\x9a\x39\xb9\x43\x7d\xc0\xeb\x5e\x85\x64\x7f" - "\x92\xe7\xe1\x13\xfc\xd0\x60\x8e\xfb\x50\x96\x4f\xdf\xc4\xae\xcd" - "\x71\xe4\x9e\x26\x12\xc9\xcf\xb7\xdc\x00\x6b\xe5\x27\x03\xd1\x26" - "\x31\x7d\x2e\xd1\xb9\x36\x4f\x51\x65\xbc\x4e\x02\x2c\xce\x18\x82" - "\x7f\xe9\x3f\xd0\x86\x7b\xe6\x90\x48\xdc\x4b\xc1\x7d\x1f\xfd\x52" - "\xcc\x7f\xe8\xdc\xe0\x34\x12\xe9\x59\xf6\xdc\xc5\x49\xb3\x86\x45" - "\xfe\x65\xa6\xfe\xf9\x59\x49\x73\x17\x4d\x4b\x9a\x49\x46\x71\x13" - "\x0e\xe6\x32\x73\x31\xda\x6f\x2c\x9a\x95\x9c\xa8\x7f\x6e\x61\x52" - "\xd2\xcc\x79\xc9\xfa\x71\xb1\x13\x2f\xf7\x9b\xb4\x59\xb7\x8d\xf9" - "\xc9\x63\xb6\x7d\x87\xcb\xe9\x5f\x7f\xd3\x9a\x9b\x42\x02\x35\xcb" - "\x1f\x9d\xa4\x71\x8e\xd2\xf3\xb8\x12\x87\x6d\x68\x4b\x4b\x33\xe2" - "\xf2\x39\xaf\x7d\xf8\x07\x2e\x9f\x8c\xae\xe4\x67\x36\x0f\x33\x3d" - "\x31\x6d\x1b\x35\x90\xcf\xa9\xc3\xaa\x80\x64\x82\xbf\xe7\xe2\x6f" - "\x4d\x32\xc9\x31\xdf\x84\xfb\xf5\x87\xf9\xbe\xca\xe6\xb1\x2a\x29" - "\x9f\x94\x87\x3f\xff\xc4\x8a\xcf\x0b\x99\x0f\xb1\x4f\x0c\x40\x9f" - "\xd0\xb6\xac\xc3\x3a\x6b\xe0\x3d\x92\x3f\xb9\x06\x6e\x7f\x77\x98" - "\xf9\x11\xa2\x7f\xbd\xb9\x55\x2c\x67\x22\x7c\xaf\x0f\xe4\x1d\x09" - "\x7d\x50\x26\xda\xe9\x0d\xaa\x15\xeb\xc5\x6d\x61\x3f\x79\x80\xdb" - "\x9a\x1c\x4e\xf4\x38\xaf\xc7\xce\x2a\xe2\x9a\x29\xf2\xaa\x6d\x62" - "\x79\xab\x24\x4c\x80\xfc\xf9\xc0\xef\xe9\xfd\xc7\xc2\xc3\xfc\x5c" - "\xa5\xe2\x7c\xb8\x48\xa7\xcd\xba\x1d\x80\x0f\x03\x1b\xc9\x27\x99" - "\x9d\xc7\x8b\xbb\x07\x47\xcf\x7b\xee\xc5\xb9\xc6\x69\xc9\xb3\xa6" - "\xcf\x9a\x33\x2b\x79\xf1\x03\x2c\x40\x0a\xfb\xf7\x87\x21\x33\x26" - "\x75\xf6\x79\x19\x81\x7a\x22\x3c\x1b\x85\xb2\x3e\xea\xe7\xd0\xc6" - "\x82\xeb\xeb\x4a\x5f\x66\xbe\xed\xfc\xaa\x7b\xa9\x78\x7e\xb2\x34" - "\x0f\xf8\x44\xd1\xce\xfa\x0d\x62\xbe\xdd\x85\xe5\xb1\x67\xcd\xda" - "\xfd\x95\xfa\x9b\xc8\x88\x5a\x72\x74\x04\xee\xd9\x01\xfd\x82\x70" - "\x3d\xcc\x5d\x82\xeb\x96\x95\x94\x3b\xef\x15\xe3\xda\x1d\xd9\x88" - "\x34\x40\x5e\x11\x68\xb0\xad\x96\x1c\xe1\x32\xf6\x05\xdd\x36\xb4" - "\x5d\x12\x2e\xe8\x76\xe0\xd8\xc2\xfa\x0a\x34\x6e\x33\xa5\x71\x9b" - "\x84\x0b\x89\x9b\xe9\x85\xc4\x4d\xb2\xbf\x9d\x23\xc9\xf0\xee\x2e" - "\x78\x77\x31\xfa\xef\xcf\x3d\x4f\x76\xa1\x3d\x00\xde\x6b\x92\xb5" - "\xc4\xa5\xdd\x41\xb0\x3e\x96\x86\x48\xc6\x87\xd7\x41\x7e\x8b\xfd" - "\x5e\x02\x3c\x66\x10\xda\x63\xf0\xbd\x47\xe0\x03\xe1\x3d\x0b\xd4" - "\xcb\xd2\xd0\x8e\x72\x3d\x11\x80\x17\x84\xb6\x6e\x83\xf5\x33\x12" - "\xcb\x45\x7b\x10\xe0\x57\x81\x3f\x3b\xb2\xca\x4a\x3e\x91\xf6\x3c" - "\x99\x2d\x88\xb2\x1f\x8f\xbc\x03\x74\xee\x25\xf9\xf8\xc4\xb5\x04" - "\x65\x06\xf9\x5c\xe4\x91\x2f\xb0\x8d\xb8\x9f\x3f\xde\x4e\x85\x42" - "\xf6\xec\xde\x4c\x8f\xfd\x75\xcc\xc3\xfc\x5b\xa3\x3d\x8b\x71\x09" - "\xc6\x39\xfd\x34\x84\x8f\x97\x7b\x33\x6c\x19\x89\x01\x62\xb9\x2e" - "\x2c\x17\xfd\xc8\x70\x5a\x7e\x3a\xcc\xb2\xf2\xbc\x64\x47\x02\xf5" - "\xf8\xf4\x0b\xb1\x8c\x26\x9c\xcb\x42\xd6\x61\x27\xda\x52\x33\xbf" - "\x91\xfc\x2c\x92\x0a\xe4\x53\xf4\x53\xa4\x2d\x0c\xe5\xfe\x65\xdb" - "\xb2\x3e\x75\x8f\x7f\xaa\xe5\xbc\x20\xf2\x63\x18\x9f\x04\xc7\x3f" - "\xf2\x76\x58\x3f\x1c\xff\x50\x7e\x1e\xee\xdb\xf3\x79\xf0\x69\xd1" - "\x8f\x9b\x07\x9f\x16\x49\xb4\xe0\xf2\xe3\xa7\x91\x54\x9d\x41\xef" - "\x59\x45\x12\x98\x7d\x85\x78\xde\x0e\xd6\x90\x11\x1c\x5b\x8e\xde" - "\xc2\x6c\x63\x52\x9a\x8a\x00\xe3\x33\xb7\xb6\x93\x60\xc1\x14\x1b" - "\x83\xbc\x78\x79\x1a\xb3\x4b\x09\x82\xf7\x8a\xd1\x6e\x05\xed\xf0" - "\xfa\xb1\xd8\x37\x27\xc8\xd6\x16\x12\x58\x47\xfe\x6e\xc0\xbd\x2d" - "\xb9\x1f\xfe\xbe\x0c\xf7\x34\xe9\xba\x7b\x1c\x9a\x34\x75\x0e\x96" - "\x21\xb4\x9e\x8b\x96\xde\xc3\x73\x71\xf8\x5e\x2d\xf9\xfb\x34\xf6" - "\x1e\xe6\x45\x9a\xa5\x6b\xa7\x00\xcf\x15\x8d\xf9\x9d\xc0\x8b\x15" - "\x0a\xda\x89\x14\xd6\x06\x57\x8a\xb3\x18\x9e\x4d\x12\x4c\x6f\x04" - "\x41\x5a\x1c\xdb\x53\xe9\xd0\xe1\x9e\x2b\x8c\xb5\x4c\x87\xa5\xee" - "\x3b\x33\xab\x0f\xda\x9f\x26\xc3\x3a\xca\x64\x97\xbf\xbf\x5f\x78" - "\x16\xfa\x23\x9c\xc5\x06\x81\x7e\x3e\xca\xe2\xd1\xc1\x58\xdc\xc9" - "\xeb\x78\xf4\xd1\xe6\x75\xd1\xd1\xcd\x30\x56\xed\xea\x20\x72\x58" - "\x87\xf6\xee\xfb\x2b\x0f\xeb\xda\xa1\xaf\x8e\x86\x01\xf6\x25\x72" - "\xde\x99\xbf\x87\x63\x34\x40\xd7\xaf\x03\x9e\x45\x4a\x76\x52\xdc" - "\x56\xe9\xef\x41\x48\x33\x18\xcf\x47\x2b\xe6\xa0\xbd\x9b\x50\x06" - "\xdf\x20\xae\x14\xa1\x06\xf7\xfb\xf1\x4c\x01\xca\x3b\x13\x52\x69" - "\x33\xca\x6f\x78\x0e\x0b\xf7\xf8\xf1\x8c\xe2\x16\x90\x7f\xb1\x5c" - "\x28\x73\xa5\x74\x8e\x70\x35\xa4\xb1\x71\x1f\xf0\xe7\xb3\xb9\xb3" - "\xd9\x9c\x43\xdb\xd0\x60\xb6\xbf\x11\xf0\xc2\x59\x18\xd7\xcd\x85" - "\xe7\xd9\xbe\x5c\x73\xa1\x58\x0e\xfa\x29\x80\x32\x8e\x4a\x65\x08" - "\x29\xb4\x0e\xed\xf2\x5c\xad\xd4\xca\xdf\xe7\xf6\x1b\xe3\xed\x02" - "\x3b\x23\x83\xef\x73\x3b\x8e\xa3\x4e\x0f\xbb\x78\xc0\x9d\x63\xc1" - "\x92\x1f\x03\xf8\xad\x93\xe4\x75\xa4\x51\xb3\x69\x07\xb1\xc3\x5c" - "\xb7\x9b\xb6\x03\x9f\x7a\x2c\x0a\xf0\x3e\xaf\x0b\x1d\x41\x20\x62" - "\x22\x9e\xfb\x15\x42\x63\x13\xf1\xec\x2f\xfa\xda\xe4\xb6\xed\xc7" - "\xd6\x8b\xe7\x80\x03\xce\x93\x63\x4f\xc8\xfb\xfd\x2e\x51\x47\x7d" - "\x6c\x1f\x97\x2f\x8e\xed\x63\x3a\xea\x75\xdb\xad\xff\xbd\xc4\xa1" - "\x2e\x5e\x62\x55\x73\xdf\xae\xc7\x8a\xad\x20\x01\x48\x76\x69\x90" - "\xcf\x88\x65\x79\xe7\x07\x47\x8b\xe3\xf1\x38\x93\xa3\x65\x39\xfe" - "\x38\xf3\x2b\x87\x7b\xf3\x02\xf2\x76\xa1\x2f\x69\xd1\x9e\xcb\x62" - "\xbc\x88\xba\xea\x9e\x5c\xa7\xc0\xf3\x88\xb6\x93\x37\x36\x2a\xef" - "\x43\xf1\x9e\xd3\xec\x78\x8c\xb4\xef\x95\xab\x16\xac\x1a\x15\xa1" - "\x19\x45\x80\x7d\x46\x3b\xfa\x1f\xb0\x59\x80\x57\xc4\xd8\xa2\xc6" - "\x24\x8c\x63\x74\x7c\x21\xfa\x34\xe7\xf3\xed\x38\x3b\x37\x27\x64" - "\x3d\x44\x33\x50\x5e\xb2\xa1\xaf\xf3\x8b\x04\xf2\x85\x40\xbe\xd7" - "\x4b\xd3\x9a\xd0\x4e\x2d\x0a\xe3\x6c\xd5\x89\xdf\xb6\x85\x8c\x36" - "\xdc\x11\x4c\x12\xe0\x9b\x7b\xac\xa4\xc0\xe4\x3f\x26\x1c\xdf\xd3" - "\x95\x3e\x96\xb7\xeb\xb3\xc1\x72\x9f\x7c\x23\xf6\xc9\x67\x83\xbb" - "\xb3\x95\x10\x79\xef\xfe\x8d\xa4\xbc\x3f\xea\x87\xe0\xf7\xa0\x46" - "\x52\xc6\xb0\x96\xdb\x21\x97\x7d\x25\xfe\x86\x6f\x94\x1d\x12\x7f" - "\xdf\x0c\xbf\xdf\x14\x7f\xdf\x04\xbf\xd7\x8a\xbf\x81\xde\x65\x8b" - "\xc5\xdf\x61\xf0\x7b\x9a\xf8\x1b\xe6\x71\xd9\x68\xf1\x77\x38\xfc" - "\x1e\x26\xfe\x1e\x00\xbf\x07\x88\x7b\xcc\x41\xf5\xa4\xac\x87\xff" - "\xfc\xff\x67\x95\x7c\xed\x2d\x83\xb1\x57\x2a\xfa\xd1\x71\xa7\x0d" - "\xb6\x92\x92\x34\x69\x1f\x09\xd2\x8f\xe2\x77\x20\x7d\x04\x8c\xbf" - "\x18\x8f\x74\xd1\x37\x7b\xd9\x24\x90\x27\x4a\x3c\xd2\x77\x89\xe9" - "\x73\x20\xff\x51\x8f\xf4\x22\x31\x1d\xe6\xff\xdf\x02\x3d\xd2\xf3" - "\xc4\xf4\x02\xc9\x76\x43\x4c\xcf\x11\xd3\xa1\xff\xdf\xdc\xe5\x91" - "\x9e\x26\xa6\x97\x41\x1f\xdb\x3d\xd2\x99\xcc\xcc\x7d\xed\x69\xe8" - "\xe1\xb4\x28\xc0\xb6\x32\x9b\x95\xbc\xbb\xcd\x23\xcf\x0c\xfe\x6e" - "\x39\xd0\x60\x77\x99\x47\x7a\x9c\x98\xae\xb7\x92\x4b\xab\x3c\xd2" - "\xc7\xfa\x1a\x43\xaa\x7c\x92\xe0\x4b\x9f\x8b\x7c\x23\xb3\x45\x65" - "\x7c\x64\xc5\xb3\x78\x3e\x46\xb3\x85\xd6\xea\xd3\x29\xad\x25\x15" - "\x23\x45\xbb\xcc\x48\xbe\x5e\xe1\x98\xaf\x18\xca\xce\x9e\xa0\xaf" - "\x37\x3c\x67\xb4\x04\xcf\x19\x95\xb3\x3d\xf3\x7b\x52\x33\xb9\x1f" - "\x38\xc9\xa7\x30\xea\x04\xc4\x3d\x5f\xc8\xf3\x15\xea\x4e\xb1\x1c" - "\x5c\xc3\x2d\xc9\xed\xdc\x47\x20\xc8\x0e\x98\x86\xb2\x31\x3b\x8f" - "\xe2\x21\x9b\xf1\xf9\x58\xf1\xac\xd0\x8e\x67\xf9\xb8\xfe\x00\xd7" - "\x7a\xcc\x8f\xf6\x4a\x9e\x79\xad\xa4\x82\xe9\x16\x03\x74\x9a\xd3" - "\x6d\x59\x15\x23\xe4\x33\x15\xe5\x79\x62\x3a\xf0\x31\x15\x93\x3c" - "\xd2\x2f\xe3\x35\x65\x7c\x8a\xd4\x52\x6d\x64\x4c\x47\x2b\xb5\x3b" - "\x5b\xa9\x23\xf7\x14\xb7\x3b\x06\x0c\xba\xd5\x65\x8a\xc4\x18\xd2" - "\x0d\x18\x6b\xc8\x99\x42\x6d\x68\x13\x07\xe9\x7d\xc6\xdb\x6d\x80" - "\xfd\x6d\x74\xf5\x74\xb4\xa1\x6c\x21\xb8\x27\x97\xd1\x84\x71\x20" - "\x34\x14\xcf\xae\x2e\x3b\x47\x82\x2b\x00\x7b\xd0\x3e\x19\xf7\xcb" - "\xc6\x25\xda\x48\x79\xa2\x8b\x14\x42\xd9\x5b\xa6\x4b\xb8\x5f\x61" - "\x97\xcf\x47\x46\xe2\x1e\xe6\xad\x19\x2c\xa6\x9a\x85\xf9\x4f\xc3" - "\x78\xed\x20\xa3\x3a\xe8\x27\xc8\x8f\x6c\xd7\x6b\x96\x13\x18\x03" - "\x96\x48\xf8\xad\xe5\x7f\xf0\x0c\xd2\x7d\xb5\x89\xcf\x53\xcb\x1c" - "\x71\xff\xca\xcc\xb1\xc0\x32\x87\xfe\x17\x9e\xb5\xb0\x18\xe1\xdd" - "\x6a\x5b\xc8\x76\xaf\xb1\x4e\x97\x6d\x21\xea\x8e\x75\xb0\x66\x9c" - "\x2f\x51\x73\xec\xa9\x9c\x22\xa8\x83\x96\xa3\xde\x92\xc5\x55\x5a" - "\x17\x9b\xba\x6b\x9e\x43\x5d\xbe\xa4\x8e\x2c\x1d\x40\x74\x53\x1c" - "\x6a\xc8\x63\xf9\xba\x5f\x32\xfa\xaa\xdb\x6e\x05\xde\x41\xfd\x3f" - "\xf0\xfc\xc0\xbc\x12\xb5\x93\xad\x23\x95\x53\x98\xae\xcb\x14\x3b" - "\x11\xf7\xca\x2c\xd5\x2e\xe4\x7b\x82\x81\xef\x89\xa1\x0b\x0c\x41" - "\xae\x45\x89\xa1\xce\x05\x89\x7d\xb6\x24\x91\x60\xd7\x02\x43\xd8" - "\x6b\xad\x24\x5a\x8a\xd7\x04\xb2\x70\x24\x6d\xd3\xf5\x5e\x93\x42" - "\x22\x50\x56\xee\xa7\xd2\xb2\xfd\x47\xfc\x2d\xa8\xdf\xd7\x16\xa6" - "\x74\x1d\x1b\xce\x05\x32\x32\xc6\xc3\xc2\xba\x78\x6b\xeb\xaa\x4d" - "\x20\x77\x8b\x67\xf1\xd2\xcf\x90\x70\xe3\xf3\x44\xdd\xaf\x85\x9a" - "\x1b\xe7\x10\x35\xc6\xd5\x4a\x9f\xc9\xf4\x51\x3d\xca\x13\x9d\xc4" - "\x92\x7a\x92\xa4\x27\x61\x1f\x55\xbe\x87\xeb\x27\xda\xc4\x42\x7e" - "\x6d\x23\xa9\x3c\xa4\x71\x10\x35\xfa\xc5\x36\xcf\x46\xb9\xa3\xf2" - "\x0b\x3b\xf3\xdb\xf2\xb9\x0e\xcf\xce\x99\x93\x1e\xc1\xb4\x1f\x32" - "\xce\x30\x7b\x91\x28\x7e\x5e\xaf\xb2\x0c\xef\x33\xf0\x6c\x60\xe8" - "\xa8\x84\xdd\xed\x8e\x1e\x5c\xe7\x51\x59\xce\xfb\x6c\x7b\x25\x97" - "\x93\x2a\x7d\xea\xf8\x04\x53\x14\xda\x5e\x0c\xb2\x14\x20\x5f\x41" - "\xad\x6c\x6f\x97\xc5\xb7\x7e\xc8\x4c\x5b\x4d\x84\x9f\x05\xfa\x7c" - "\xad\xb0\x36\x8a\xd9\xbe\xc0\x6f\x16\xcb\x86\xeb\x4e\xa3\x8c\x5c" - "\xdf\x18\x25\xea\x4e\xa3\x4c\x2b\x6e\x42\x1b\xf1\xcf\x4d\xcd\x21" - "\x51\xc0\x4b\x7d\x3e\xa3\x39\x74\x5c\xa4\xef\xb5\x66\x98\x49\x7f" - "\x2b\x09\x43\x9d\x7d\xbc\x8b\xfb\x33\xe2\x73\xf8\x44\x1e\x5d\xcb" - "\x9e\x0d\xaa\x35\x92\x00\xce\xbb\x7f\x7e\xfa\x9e\x02\xa2\x87\xba" - "\xf6\xa5\xda\xa8\x18\x66\xef\x66\x8a\x9a\x68\x69\x42\xff\xe3\x2e" - "\xc2\x79\xe3\x13\x45\x34\x24\x2a\x86\xe7\x3f\x31\xac\xa2\x09\xda" - "\xa0\x8d\xd2\x5a\x1c\xe7\xc4\xb5\xfa\x04\x8c\xfd\x28\xe0\x6f\xa3" - "\xf4\xfc\x8c\xed\x89\xe5\x12\xae\xf2\x31\x7a\x62\x21\xa7\xdb\x30" - "\x13\xa7\xdb\x89\x22\x71\x5d\x1a\x84\xbf\x81\x4f\x88\xe4\x76\x0b" - "\x27\xe6\x48\xbc\x8b\x55\xcc\x83\xef\xc0\xef\x89\x1c\x6b\x4f\x80" - "\xfc\xf3\xf9\x60\xf1\x79\x24\xa6\x41\xfb\x00\x97\x3f\x3f\x8a\xed" - "\xf2\x85\xad\x8c\x16\x69\x24\x00\xea\x1c\x89\xf6\xc2\x28\xdf\x59" - "\xec\x0f\x99\x2d\xac\x0f\xaa\xee\x62\xe7\x0f\xe1\x3b\x18\x2b\x00" - "\x71\x13\xca\x0c\xc4\xf2\xe4\xfa\xff\xa3\xaf\x54\x17\xfc\x1e\x3e" - "\x83\xb6\x32\xff\xcc\x40\x2b\x3c\x27\x48\xb0\x5f\xeb\x8d\xa8\x2b" - "\x69\x01\x9a\xa1\xed\x54\x55\x34\xd2\x84\xd3\xac\x2a\x4c\x94\x87" - "\xc4\x7e\xa8\xba\x41\x49\x0f\x7e\x2f\x68\x01\x1b\x92\xd0\x86\xa6" - "\x2a\x5a\xa4\x9f\xe8\x3b\xf7\x1f\x67\x18\xbd\xd8\xb3\x7f\x6c\xf1" - "\x78\xf7\x16\x77\x5e\xa8\x37\xda\x3c\xe2\x7e\x34\xea\xfc\xf9\x78" - "\xfd\xc7\x51\x8f\xf7\x8e\xc6\xff\x10\x43\x30\xee\xda\x8a\x0d\x2c" - "\x16\x09\xf0\xa9\xff\xa8\x91\xe9\xcd\xcb\xf1\xf2\x8d\x5b\xa5\x6f" - "\x58\xc9\x3f\x0a\xa4\x7a\xc2\x6f\x23\xef\x93\x2a\xbd\xdc\x27\xff" - "\x88\x91\xde\x43\xb9\x19\xfa\xa8\x09\xe3\xfa\xf8\xf0\x77\xaa\xb2" - "\x0c\x04\x0c\x76\x3e\x64\x66\xe3\x91\x54\xe5\xa3\x9d\x32\xd0\x35" - "\x92\x8f\xa1\xaa\x34\xbe\x16\x56\x31\x7d\x05\xee\xdb\x70\xff\xd7" - "\x55\x38\x1e\x76\x89\x75\xde\x26\xd6\x61\x1b\xd4\xa1\xc0\xe7\xb9" - "\x16\xf7\xb9\xb5\xaa\x32\x8f\xb3\x7a\x63\x39\x6d\xbf\xd0\xd1\x56" - "\x9a\x87\x67\x0b\x68\x0a\xcd\xcf\x85\xfe\xc9\x68\x21\xbf\x42\x5f" - "\x28\xe9\x46\xfa\x5d\x85\x11\xe4\x1e\x6d\x6c\x3e\x60\x43\x41\x7a" - "\x0b\xe9\x85\xb6\x26\x88\x2d\xa8\x4b\xa0\x21\x90\xbe\x36\xb6\x40" - "\x3e\x4f\xf4\x65\x04\x9e\xfb\x03\x79\x1c\x63\x5e\x16\x63\x5f\xa3" - "\xfd\x71\x3d\xf9\x12\xe6\x70\x6c\x31\x3c\x4b\x5e\xcd\x64\xb2\x58" - "\xbb\x4b\x3b\x7a\x70\xc6\x39\xd2\x93\xc5\xa5\x48\x75\x10\xfd\x6c" - "\x3c\x77\xf2\xc5\x62\x28\xd3\x0e\xe9\xfd\x58\xba\xc3\x81\x67\xc7" - "\xed\xf0\xac\x1f\x3c\x7b\x1f\xae\x02\x94\x91\x9a\x0b\xf5\x4e\x3f" - "\x47\x6e\x85\xba\x34\xc0\x77\xec\x50\xcf\xfa\x8c\xb9\x24\xbc\xc2" - "\xd8\x80\x3c\x35\x94\x67\x25\xa2\x7f\x05\x7b\x2d\xf9\x72\x28\xb4" - "\x2b\x15\x65\x4b\x3c\xab\xb7\x1a\xae\xe9\x2e\xd2\x2f\x7d\x19\xac" - "\x69\xcb\xe0\xfb\x90\x1f\xcb\x41\x9f\x0a\xbc\x2e\xd0\x36\xd4\x4b" - "\x40\xb9\xcb\x9a\x68\x3d\x94\xdd\x50\xde\x04\xe5\xa5\x56\xb3\x32" - "\xad\xd8\x46\x28\x57\xb4\x51\xd2\xf3\xfd\xe5\x2f\x07\x4b\xfb\xa4" - "\x56\xf2\xc5\x48\x6c\xa7\x77\xbf\xa5\x5f\x8e\x55\xfa\xfa\xf8\xdf" - "\x81\xe8\x37\x11\xd2\x67\x48\x7e\x39\xe0\xb7\x11\xca\x2a\x66\x7d" - "\xe4\xe1\x23\x25\xd7\xc3\x47\x4a\x86\x8d\x9e\xc6\xba\x18\x59\x0c" - "\xae\x2f\x41\x1e\x1a\x3d\x98\xfb\xfe\xfc\x5f\x36\x4f\xa1\xcd\x35" - "\x70\xaf\xe1\xba\xc3\x2f\x45\xcc\x1e\x56\x3c\xc1\xe5\xd4\x58\xe1" - "\x9b\x30\x7f\x8b\xe5\xfb\x2f\x4b\xf1\x6c\x22\xe4\x73\x71\x1f\x6a" - "\x5f\xee\x53\xe6\x67\xcf\x33\x3b\xdd\xc7\x74\xba\xd7\xdb\xa1\x3f" - "\x7d\xed\x07\xaf\xbe\x89\xe9\x11\x26\xf6\x5b\x4e\x8c\x19\x67\x49" - "\x00\xd0\xf9\x0c\xd6\xad\xa2\x81\x9d\x91\xd1\xd0\xac\x48\x62\x69" - "\x70\x72\x7e\x05\xd6\x89\xda\xc1\x90\xe7\x2c\x09\x47\xfb\x6a\xf4" - "\x8d\x0a\xf9\x1b\xb9\x3f\xd4\xea\xed\x53\x16\xf6\x26\xc2\x5f\xe2" - "\xfa\x50\xf5\xb3\x46\x58\x13\x82\xde\x69\xb7\xa2\x4f\x51\x55\xfa" - "\x46\x32\x10\xfb\x10\xfa\xb2\x0e\x63\x82\xc2\x3b\x4d\xff\xdd\xde" - "\xd0\xc3\xe2\x3c\x49\x8c\x30\xb6\x1a\x49\x75\x7e\x60\x1a\xc8\xfb" - "\xf5\x04\xf5\x89\xce\xc3\xce\x68\x22\x9d\xeb\x2d\x08\xe5\xe7\x23" - "\x0b\x60\xce\x2e\xd0\x51\x47\x5b\xd6\xff\x02\xff\xf3\x61\xa6\x74" - "\x6e\x6f\x15\xf7\x77\x1a\x08\xdf\x9f\xa6\x16\xcf\x30\x73\xda\x56" - "\x0f\xe3\xe7\xa3\x42\xef\x6c\xcb\xaa\x36\xc8\x3c\x5d\xf5\x1e\x51" - "\x0f\x3b\x8a\xcf\xb1\xea\x3d\x87\x81\x8b\x5e\xc9\xf7\xd5\xc3\x20" - "\xef\x24\xf7\xbe\x3a\x93\x51\xab\xf7\x40\x1f\x8e\xe2\xfc\xde\xe8" - "\x51\xf1\xae\x20\x71\x5d\xc1\xf4\x48\x2d\xbe\x0b\xef\x69\x78\xdc" - "\x86\x6a\x93\x3c\xd6\xaa\xe3\x10\x47\xa0\x4d\x20\x97\xff\x6f\x19" - "\xb6\x0b\x69\x02\xf9\x02\xe1\xbe\xf2\xf0\x36\x1f\x7e\x7d\xb5\x91" - "\x66\x67\x16\xdb\x23\xae\x86\xf1\x74\x0e\xfa\xe0\x46\xf4\x63\x62" - "\x81\xef\x94\x17\xb6\x93\x72\x5d\x33\xa9\x98\x81\x67\xb9\x80\x67" - "\x9e\xfd\x2d\xa9\xd3\x7b\xc7\x30\xc0\x41\x18\x07\x91\x13\xb1\x2c" - "\x9c\x27\x68\x1f\x65\x01\x49\xa3\xc2\x86\xb1\x48\x09\x2b\xa3\x5c" - "\x68\x20\xe5\xa9\xc8\xbb\xef\x77\x54\x14\x9e\x24\x15\xba\x7f\xb0" - "\xef\x20\x9f\x61\x4e\x6a\xee\xaa\xec\x04\x28\xdb\x28\x96\xdd\x04" - "\x65\x87\xf9\x2e\x7b\xbb\xde\xcf\xb2\xfd\xa8\xf7\x76\xad\x3f\x65" - "\x67\xe4\x53\x17\x60\x4b\x5f\xc0\x8f\x18\xf4\xab\x84\x67\xc3\x5c" - "\xad\xe8\x83\x60\x10\xe5\x36\xa7\x27\x5f\x46\x1e\x9b\xed\x25\xae" - "\x8d\x1d\xc1\xce\x8d\x9d\x27\xcc\x67\x8d\xc5\x79\x86\xa0\x0e\xa8" - "\x2d\xeb\x64\xb2\xcc\x7f\xbb\xf7\x50\x60\xcd\x39\x99\xcf\xed\x0a" - "\x63\x47\xf0\x71\x75\xf2\x09\x2c\xc7\x3b\x9f\x3d\x72\x22\xb7\x4f" - "\x3d\xf9\xb9\x24\xaf\x37\x87\x8c\x9c\x28\x96\xa5\xef\xbc\xb7\x2e" - "\x05\x01\x9f\x99\x9a\x2c\xc5\x13\xe7\x87\x0a\x7b\x93\x27\x67\x3e" - "\x37\x73\x56\xca\xcc\x19\xfa\x49\x0b\x93\xe6\x0d\x7d\xf1\xf9\xe7" - "\xf5\xe3\x66\x2e\x58\x30\xed\x2f\x33\x7b\x93\x49\x49\xd3\xe6\x2d" - "\x98\x85\xce\xe0\xf5\xfa\x91\xbf\x8d\x4f\x7c\x31\x79\xe8\x83\x23" - "\x23\x3b\x9d\x33\xc4\x33\x86\x35\xc8\xd7\x01\xde\x86\x03\xf6\x86" - "\xa0\xff\x09\xcd\x62\x6a\x5e\x0a\x32\x05\x8c\xbf\x46\xdc\x43\x82" - "\x79\x7b\x1a\xf9\x4d\xe0\x3f\xaa\xd0\xf7\xd8\xe6\x0d\xb4\xb2\x9e" - "\x9c\x7b\x18\x78\x95\x6a\xf4\x33\x06\xb2\x56\x0d\xc8\x79\x36\x1e" - "\xf3\xf6\xdc\x2d\x90\xa7\xf4\x55\x48\xb3\x85\x8c\x1e\xb5\xe6\x14" - "\x09\x84\xf5\x07\x78\xdd\x7f\xc2\xdc\xef\x45\x57\x85\xd3\x52\xfa" - "\xad\x8e\x88\xfe\xfe\xd4\x16\xab\x03\xf7\x9a\x83\x26\x38\x33\x28" - "\xe2\x29\x9f\x5b\xff\x3c\xc3\xe9\x12\x95\xc0\xed\x76\x9b\x5c\xc8" - "\x17\xaf\x60\x31\x04\xfe\x09\x73\xb2\x32\x51\xc6\xe9\x33\x11\x22" - "\x3f\x52\x0d\x74\x5f\x54\x0b\xf7\xfc\x8c\x7d\x8d\x5e\x69\x5f\x00" - "\x42\x14\x39\x9b\xc8\xff\xf0\x9d\xb3\xc9\xfc\x0f\x7f\x7b\xfe\xc1" - "\x82\xc2\xfe\x3a\xa7\xff\xd4\x3f\xe9\xfb\x3f\xba\x8c\xba\x6e\xfe" - "\xae\xe0\xfb\xac\xdd\xd7\xb1\xfd\x3f\xa9\x8c\xa6\xae\xfe\x70\xbc" - "\xc1\xd8\xaa\x79\xf5\x14\x09\x82\xf1\x99\x07\x32\x76\x60\xc6\xd7" - "\x44\x97\xe6\xa4\x75\x19\xcf\x92\x81\xe9\x67\x09\xc6\x84\x6d\x48" - "\x4e\xa5\x75\xe9\xad\x28\x8b\x9d\xd9\x0f\xe3\xb7\x24\xb7\x96\x04" - "\xaf\xae\x25\xda\x8a\x64\xee\x7b\x16\x75\x9f\x78\xa6\xc1\x02\xf7" - "\x65\x29\x0e\xf2\x99\xed\x07\xdc\xe3\x30\x57\x24\x00\xee\xd4\x10" - "\x82\xe3\x37\x38\x81\x84\x15\x84\xd3\x7d\x34\x6b\x15\xc8\xee\xab" - "\xf0\xbb\x55\xef\x0a\x31\x3d\xde\x5d\x72\xb4\x07\xc6\xcf\xad\x25" - "\xa7\xb6\x8b\x63\x73\x28\x3f\xb3\x73\x66\xa8\xa8\xcf\xaf\x02\xde" - "\x17\xd6\xa6\x33\x6f\xf2\xf5\xfc\xcc\x62\x51\x87\x81\xbf\x99\x5f" - "\x58\x68\x47\x09\xc6\xd0\xc6\x32\x77\x0b\x25\x2c\x86\xf6\xbb\x4b" - "\x62\x7a\xa4\x4d\x23\xea\x0a\x6b\x23\xdb\x0d\xc3\x7d\x17\x98\x77" - "\xbb\x60\x9e\x15\x6f\x09\xa7\x26\xa8\xdf\xaa\xc2\x70\x9a\x03\x75" - "\xda\xd9\x96\xf5\x4d\x98\x95\x7c\x15\x24\xea\x58\xcd\x30\x2f\x76" - "\xad\x86\x3c\x13\x16\x92\x41\xab\x21\x5f\x2e\xe4\x43\xde\x8d\xd7" - "\xef\xdb\xbe\x40\x83\x3d\xf0\xcd\x4a\xfd\x54\xbc\xb7\x32\x1d\x18" - "\x7e\x1b\xda\xa1\xaf\x25\x56\xa6\x17\xc1\x6f\x48\xdf\x85\xf2\x01" - "\xff\xbe\x32\x8b\xfa\x6e\x13\x2f\xe7\x1b\x51\x1e\x8a\x45\xff\x7f" - "\x62\x8c\xf3\x58\xf3\xea\x25\xb0\xa6\x83\x4c\x0d\xdf\xc8\x83\x6f" - "\x98\x35\xcb\x09\xd5\xe0\xb9\xba\x1a\x27\xf0\x7b\x82\x68\xff\x65" - "\x7d\x49\x7c\x97\xf1\x20\x8c\xef\x00\x59\x9f\xcb\xa4\xc0\x7b\x24" - "\x02\x4e\x00\xbf\xc1\x6c\x91\x81\xd7\xc0\x74\xf8\x46\x1e\xfa\xfd" - "\x03\x59\x61\x0f\xac\xdb\x18\xfb\x20\x68\x6a\xcb\x18\xc2\x62\x01" - "\x02\xaf\xb0\x20\x95\x3a\x78\x6c\x00\xab\x5e\xe2\x15\x70\x7c\x20" - "\x7f\xb0\x7a\x2a\x09\xec\x80\x3e\x86\x31\x72\x14\x78\x8f\x90\x46" - "\x62\x9d\x22\xf6\xcd\x51\xc6\x13\x88\x31\x91\x38\x86\x5b\x67\xc1" - "\xda\x1e\x0c\xdf\x38\x6a\x25\xe7\x98\xee\x8c\x63\x90\x35\x55\x5a" - "\xe7\x79\x5c\x3f\xeb\x14\x0a\x58\x07\x74\xdb\x13\x91\xa0\x02\x3e" - "\xf4\x1b\x33\xf4\xc5\x1e\xcc\x8b\xe7\xc6\x21\xff\x4e\x58\xf3\x23" - "\xc4\x3e\xa9\x59\x9d\x82\x3c\x80\x35\x12\xeb\x01\xef\x94\x01\xad" - "\xe1\x5b\xb5\x56\x11\xc7\xaa\x38\xff\x52\x7b\x4c\xa2\x3d\xf4\xf5" - "\x4a\x99\xfe\x56\xbb\x27\xfd\x81\x16\x2b\x79\x1f\xd4\x2e\xf4\xe8" - "\x3b\xe0\xd7\x6b\xc7\xa2\xee\x0d\xbe\xb7\x8f\xeb\x0d\x4e\x0f\x45" - "\x1f\x3f\x30\x66\xf6\x01\x2d\xf6\x41\xbe\x12\xc4\xe6\x15\xa7\x88" - "\x18\xdf\xbe\xf6\x3e\xce\x9f\x9e\xae\xe2\x31\xa0\x4f\x8b\x31\xa0" - "\xad\x51\x3c\xfe\xf3\xe9\xed\x3c\xfe\xf3\xe9\x2d\x9e\x31\xed\xe5" - "\x78\xf6\xa7\x57\x49\xf6\xfe\x38\x06\xb0\xef\xa1\x8d\x51\x5c\x36" - "\x3b\xbd\x0a\xf5\x2b\xec\xbd\x8e\x44\xac\x63\x0d\xce\x4f\xe9\x39" - "\xc6\xb8\x87\x74\xe2\x41\x9b\x28\xb1\x4f\x4a\x78\xdc\x8b\xda\xa1" - "\xbc\x6e\xb5\x41\x70\x1f\x04\x75\x60\xf2\x1d\xc6\xbb\x5f\x83\xef" - "\xa4\xcb\xef\xe0\xfc\x81\xb1\xac\x81\x77\x86\xc0\x95\x4a\x79\xb7" - "\xb6\x63\x9e\xd3\xbb\x5e\x6b\x47\xfd\xca\xe9\xd2\xe6\x0e\x83\x1a" - "\xbe\xeb\x80\xef\xaa\x71\x6c\xe0\xb8\x90\xca\x58\xc3\x69\xb4\x0b" - "\xfa\x8f\x8d\xaf\xc3\xce\x12\xa0\x7b\x2d\xc8\xff\xe5\x13\x39\x6f" - "\x77\x7a\x97\x58\x3f\x33\xf7\x6f\x7b\xb2\x06\xe3\x0d\x72\x7f\x33" - "\xb5\x79\xee\xbd\x42\x37\x8f\x79\x7a\x17\x8e\x3d\x28\xab\x4c\x1c" - "\x13\x1a\xc8\xb7\xcf\x3d\x86\xd8\x39\xe1\xda\x11\xc8\x67\x8a\xf5" - "\xc7\xb1\x77\x1f\xa7\x9d\xb5\x06\xc7\x00\xf0\xf0\xa3\x78\x3f\x5b" - "\xa3\x90\x4f\xe5\xe3\xf0\x5b\x22\x95\xc1\xcf\x1a\x9f\x5e\x25\x40" - "\x19\xd2\x58\xf1\xc4\x06\xc8\x1b\x01\x3c\xa9\x7b\xdc\x48\x58\xc0" - "\xcb\xac\x13\xe3\x5e\x6c\xaf\x86\xbe\x41\x9f\x8c\x66\xe4\xdb\xf9" - "\xb8\xac\x8b\x3e\x6c\x77\xb2\x18\xd8\x50\x2f\xc0\x84\x6f\xd7\x37" - "\x87\x8e\x1b\x25\x8f\xed\x6f\x57\x4a\x63\xdb\xa3\x5f\xd9\xd8\x5e" - "\xc9\xf0\xe8\x5b\x90\x7f\x7f\x33\x56\x1a\xfb\x38\xcf\x31\x16\xfd" - "\x9a\x14\x1e\xa7\x1e\x75\x20\x6c\xde\x3b\x9a\x98\x7c\x81\xfd\x59" - "\x91\x5a\xc7\xfc\x5a\x62\x9c\xfa\x0a\xfb\x19\x94\x1b\x1b\x71\xfe" - "\x4b\x73\x1c\xfb\x06\xbe\x65\x86\xf2\x2a\x57\x02\x06\xe2\x1c\xb4" - "\x43\x9d\x30\xfe\x23\xfa\xed\x28\x9d\x12\xc3\x62\xd8\x1f\x4e\xc0" - "\x7e\xab\x1b\x2c\xd9\x17\xaf\xe1\x18\x10\x2c\x8e\x17\x56\xc7\x4e" - "\x74\xd5\x70\xba\xd6\xc5\x29\xe7\xf7\x69\x07\xce\x6f\x4f\xba\x22" - "\x4d\x91\xb6\x90\x17\xda\xff\xd5\x0c\x89\xae\x1e\x34\x6d\x11\xc7" - "\xa3\x88\xad\x75\x5e\xb1\x15\xfd\x83\x42\xbd\x4a\x56\x60\x5b\x60" - "\x4d\xc1\xef\x33\x3f\xdb\xa2\xdc\x53\x6a\xc3\x31\x55\xd7\x60\x25" - "\xf1\x44\xc2\x31\x18\x2b\xcc\xe7\x12\xf6\x95\x84\x1d\xa8\x43\xe0" - "\x75\x3f\x13\x26\xf5\x07\xd6\xdb\x13\x13\x60\x8d\x61\x7b\x31\x72" - "\x9b\xcf\x3c\x0a\xef\x85\x22\xb6\xc9\xfc\xd5\x99\x49\xca\xb6\x9f" - "\x19\x81\x6d\xc7\x31\x61\x4c\x41\x3d\x02\x5f\xcb\xac\xe4\xd4\x51" - "\x25\x5e\x9d\xda\xcf\xf7\x08\x39\x3f\x86\x78\x6f\x9c\xca\xf3\xe3" - "\xfa\x06\xf9\xcd\x6c\xad\xe3\xeb\x21\xfa\x22\xc2\xb4\x3d\x22\x0d" - "\x6a\x20\x7f\x29\x9e\x59\x44\x9f\x14\x7d\x6a\xb8\x1c\x08\x18\xbd" - "\x0f\xd6\x0e\x33\xe4\x4b\xae\x00\x19\xc0\xd9\x93\x90\x02\x91\xdf" - "\x44\x9c\xa0\x8b\xe2\xfa\x2c\x6a\x20\x37\x18\x1f\xa4\xdf\xd6\x93" - "\xfa\xf9\x30\x8f\x1c\xb8\x97\x0f\x65\xeb\xeb\xc9\xd9\x27\xe0\xbb" - "\x61\xe2\x55\x07\xd7\xe1\x70\x1d\x00\xd7\xdb\xe0\x7a\x33\x5c\xf1" - "\xec\xa9\x20\xe6\x8f\xac\x27\x0d\x3f\x40\xfa\x6f\xc5\x2b\xd4\xb1" - "\x3e\x11\xae\x13\x5f\x45\xbe\x72\x2a\x4b\x3f\x82\xf7\x70\x7d\x5f" - "\x6c\x77\x19\x9f\xdb\xf5\xeb\xa1\x9c\x54\xcc\x87\xeb\x1a\xa4\x19" - "\x21\xcf\x62\x2c\x1b\xcf\x12\xc3\xef\xa1\x1e\xfc\x29\x94\xf3\xdd" - "\x64\xb8\x46\xc1\xf5\x16\xb8\x26\xc3\xfb\xa7\xb1\x5c\xf4\x75\x2b" - "\xe3\x85\x35\x6a\x46\x2a\xef\x4f\xe8\xeb\x62\x9c\xef\x12\x1e\xe0" - "\x78\x52\xe4\x9b\xc2\xf3\x71\xd9\xf5\x3b\xad\xd4\x77\x4e\x3e\x6e" - "\x4b\x9d\xd0\x77\x50\xfe\xc3\xf8\x3e\x5c\x63\xc5\x6b\x8c\x78\x7d" - "\x54\xbc\x3e\x26\x5e\x47\x8a\xd7\x51\x56\x52\x6f\x15\x79\x13\xa0" - "\x59\xbd\x15\x69\x02\x73\x37\x99\x7f\xb7\x21\x0c\x65\x6b\xc0\xff" - "\xfb\x9a\x31\x96\x42\xd6\x77\x39\x92\xae\x0e\x75\xbc\x1d\x59\x27" - "\xdb\x36\x33\xbb\x89\xef\x8a\x3c\xb0\x50\x17\xac\x8a\x21\xc0\x3b" - "\xf5\x2c\x50\x03\xdf\xc0\xca\xf9\xce\xa1\x16\xf7\x1f\xd1\xe7\x32" - "\xc6\x88\x88\x77\x06\xf1\xb3\x70\x21\xfb\x71\xaf\xa7\x86\xe9\x31" - "\xd1\xb7\x52\xc8\xe8\x81\xf0\x67\x00\x99\x22\x42\xc2\x7b\x94\x97" - "\x44\x1f\x59\xe1\x6d\x59\x0d\xc1\xb2\x8c\xff\xdd\x3e\xbe\x9f\xd3" - "\x1f\xf0\xa9\x61\xb0\x47\x7a\x2a\xd6\x19\x68\x5d\x0d\xed\x89\xaa" - "\x25\x0d\x63\xe1\x7a\x6f\x1d\x6f\x73\xa4\xd4\x66\xb1\xaf\x8c\x12" - "\xcd\xeb\x48\x7d\x03\xe0\x61\x12\x8e\xef\x5a\x37\x2e\xd7\xb3\x7d" - "\x5d\x71\xfc\x40\x3f\xd7\x6f\xc4\xfe\xf6\xc0\x93\x08\x19\xa7\x1b" - "\x76\x2a\xfb\xc5\xba\xd3\xc9\xf9\x85\x6a\x98\x97\x38\x06\x8c\x9d" - "\xe6\xe5\x08\x9c\x97\xe2\xbb\x75\x4a\x8c\x3f\x33\x02\x31\x5e\xac" - "\x23\x8c\xdb\x7a\x3c\xd7\x0e\xeb\x40\x43\xa9\xb8\x26\x55\xc3\x1a" - "\x79\x1f\xa4\x8b\x7a\x51\x9e\x2e\x7e\x0b\xc6\x5f\x3d\xfa\x03\xbc" - "\x59\x4a\x17\xc7\x37\x96\x63\xc0\xbe\x96\xd2\xc5\xf2\x61\x9c\xd6" - "\xeb\x71\xfe\x48\xe9\x7c\x4c\x7e\x9b\x8a\x78\x83\xef\x62\x7b\x90" - "\x67\x36\x4f\x2d\x85\x7a\x9f\xdd\x06\xfc\x45\x11\xce\xe7\x15\x4b" - "\x48\xf0\xa2\x7c\xd2\x97\xcf\xcd\xb3\x47\xa4\x77\xb9\xae\xf3\x6c" - "\x89\x84\x51\x6b\x18\x9e\xd5\x45\x28\xb1\xb2\xa9\x07\xcd\xd2\x38" - "\x9d\xda\xd1\x61\xe5\xce\x28\x86\xb9\x30\xef\x0b\xe0\x3d\x9b\x95" - "\xac\xca\x17\xd7\x92\x32\xae\x47\x6e\x1c\x52\x5e\xc4\xb1\x8b\x97" - "\xdd\xe8\xc6\x3f\x0f\x3e\x84\x61\x3d\x7e\x0b\xcb\x82\x75\x45\x6b" - "\xcf\x88\xeb\xc3\xf1\xbb\x71\xa4\x95\xf4\xae\x91\xb0\x15\xd7\x27" - "\x8d\x8a\x18\x73\xa7\xf2\xf5\x49\x40\xfd\x97\xd1\xce\xfc\x08\x55" - "\x18\x9b\x08\xae\x9b\xe8\xe7\x35\x7e\x71\x6f\xf4\xf5\x12\x57\x4f" - "\xbe\xc7\x78\x7b\xdb\x44\x3a\xc2\xfc\xf9\xbe\x5c\xec\x87\x1a\xf8" - "\xfe\x36\xc4\xf2\x15\x29\xdc\x4f\x39\xea\x7e\x98\x1f\x7c\xe4\x51" - "\x75\xd4\x51\x5a\x80\x73\xa4\xb1\xd4\x43\x9f\x25\xc6\xb7\x39\xbb" - "\x97\xc5\x54\x30\x8d\x0e\xe3\xba\xc3\xef\xa7\xf1\xf4\xef\xc5\xbd" - "\xd6\xd1\xa2\xdd\xf3\xf7\x91\x01\xba\xb0\x24\x1e\x77\xe6\x9f\xa1" - "\x9c\xff\xf8\x3e\xac\x93\x5f\x28\x35\xa4\x19\x64\x9f\x99\x67\xc5" - "\x7d\xee\xef\x3d\xf6\x3f\xbf\xc7\x18\xdc\x81\x50\xd6\x32\x48\x77" - "\xef\x7f\xf2\xb5\xc6\x6a\x10\xf5\x65\xba\x3e\xcb\x63\x08\x60\x73" - "\xcf\xcd\x59\xd2\xfc\xfd\x7e\x0f\xaf\x0f\x9f\xbf\xd8\x66\x1c\x0f" - "\x38\x87\x9d\xcc\x17\xcf\xfe\x44\x9c\xcb\xf0\x7b\xa0\x53\x9a\xbb" - "\x9c\xbf\x8b\x60\x73\x97\xcd\xdb\xef\x4b\x3d\xea\x91\x26\x8e\xd5" - "\x9a\xe6\xe7\x74\xc0\x53\x7e\x6f\xb5\x92\x93\x03\xf9\xb3\x46\x93" - "\x58\x8f\x30\x78\x5e\x60\x4e\xff\x04\xfb\x7e\x39\x9f\x13\x8d\x99" - "\x38\xee\x2c\x30\x56\x60\xbd\xc8\xe7\x31\xe6\x9b\x06\x4a\x63\x05" - "\xe6\xd4\x0c\x18\x53\xef\xe4\x85\xd3\x7c\xe8\x13\xb4\xc7\x9c\x03" - "\xf7\x38\x5f\x67\xf0\xab\x4a\x8b\x57\x71\x8c\xe6\xc3\xbb\xb0\xfe" - "\xf7\x96\xfa\xa4\xc6\x1e\xb2\x9d\x8f\x89\x74\xb4\x8d\x89\x64\xfb" - "\x91\x38\x26\x70\x3c\xb0\x7d\x49\x18\x1b\x9a\xe5\x63\x08\x8e\x0b" - "\x76\x9e\x1f\xee\xb1\x4e\x38\x2e\xa0\xac\x6d\x92\x8f\x4a\x2b\x69" - "\x1a\xc5\x69\xdf\x54\xe2\x69\x23\x08\x65\xeb\x4b\xf5\x20\xef\x98" - "\x86\x99\x92\x6f\x23\xfd\x31\x46\x38\xfa\xa2\xc3\x98\xeb\xf8\x0e" - "\xee\xe9\x70\x9c\xeb\xff\x27\x78\xd7\x2e\xd3\xcb\xca\xfc\x0a\x1c" - "\x9e\xc2\x74\x90\x37\xb6\x65\x9d\xd3\x2a\xb1\xe2\x9f\x75\x8c\x1f" - "\x84\x75\xf5\x8e\x30\xa2\x87\xf1\x07\x6b\xc4\xb9\x28\x89\x8f\xbd" - "\x27\x0c\xf7\x86\xff\x89\xf2\x05\xca\xb0\x95\xf0\x3b\x0d\xd7\x57" - "\x1f\xba\xe2\x28\xd4\xf1\xe0\x5c\x47\x9d\x11\xea\xaf\xd0\xa7\x7c" - "\x3d\xb1\x1d\x29\x47\x5f\x1b\x2f\x5e\xee\x97\x34\x3d\x95\xb6\xa0" - "\xef\x17\x7d\x12\xb9\xb1\x96\xd8\x30\x16\x70\x75\xc6\x0f\xa8\x9b" - "\x39\xd7\xc9\xff\xe1\xf9\x60\xf1\x4f\x0f\x7f\x2b\xe5\xbf\x0b\x61" - "\xe2\x6f\x53\xd7\x7f\x17\x22\x78\xde\x0b\x80\x79\x17\x46\x8a\xb4" - "\xfa\x6b\x5b\xd6\x79\xbd\x44\x2b\xc4\x02\xc4\x46\xb4\x09\x40\x5d" - "\x93\xca\x49\xd0\xb7\x07\xf4\x17\xd4\x7b\xc5\xaf\x9f\x34\x2f\x41" - "\x59\xf4\x3c\xb3\x69\x42\x3f\x9a\xfe\xd9\x9f\x9c\x67\x7b\x80\xdc" - "\x37\xdf\xf9\x30\xf8\xf6\x1b\x6b\xce\x93\x40\x63\x12\xb9\x05\xf5" - "\xde\x1a\x17\x35\xa3\xec\x2a\xc6\x35\xaf\x6c\x24\x17\xfa\x27\x2f" - "\x23\x6a\x78\x3e\x08\x7e\x4b\xf1\x35\x6b\xe0\x1d\x6d\x80\x83\x84" - "\x21\xef\x13\xbb\x8c\x0c\x82\xfa\x5b\xa5\xbe\x42\xfe\x00\xf5\x6f" - "\xa2\x0e\x01\xeb\x7a\x1b\xbe\x87\xbe\x96\xad\x8c\x6e\x22\xe6\x9c" - "\x47\x7d\xf3\xf9\xb2\x00\x3b\xd1\xf2\xf5\xe3\x02\xac\x7f\xff\x14" - "\xf9\xc1\xf3\x0d\x30\x07\xaa\x3c\xea\xf9\x95\xfc\x3b\x7c\x00\xbe" - "\xaf\xb1\x23\xef\xe5\x8b\x3e\x17\xe6\x4b\xf4\x41\xdb\x54\x90\xe7" - "\x8d\xac\xbf\x9d\xb4\x09\xea\x56\x66\x5c\x42\x82\x1a\x89\x6d\x3e" - "\xc6\x2c\x80\x79\x73\x94\xeb\xe5\x6d\x33\x25\xf9\x9a\xd7\xdb\x36" - "\x4c\xb3\x3c\x80\xa0\x3e\x3d\xde\xa5\x67\x7b\x7e\xf4\x82\x8e\xe9" - "\xd0\x2d\xce\x11\xc4\x9c\xfe\x00\xe6\xb9\x4d\x5c\x83\x6a\x9a\x33" - "\x74\xe4\xb0\x6e\x04\xcc\xe7\x0b\x4d\x56\xf5\xa9\x18\xff\xed\xa6" - "\x2e\x34\x71\xdc\xe0\xe7\x08\xf1\x1e\xcf\xfc\x01\x3d\xcb\xf8\x3e" - "\xf7\x85\xfd\xb8\x26\xa0\x8c\x0f\xeb\x41\x29\xae\xbb\x6d\x59\x36" - "\x37\xff\x0f\x78\x0f\xf8\x74\x41\xdc\x77\xc1\xbd\xc5\x0b\x25\xe8" - "\x6b\x41\xb4\x7d\xc5\xfc\xc1\x5c\xf7\x6f\x5b\xe5\xe6\x9b\x21\x1f" - "\xbe\xc7\x6d\x9b\x2e\x98\xe2\x5d\xa8\x13\xb8\x60\xc2\xb6\xf2\xb1" - "\x19\x0e\x7d\x6b\xdb\x27\xcf\xe3\xf3\x8c\x97\x38\xdc\xe4\x39\x4f" - "\x6d\x35\xb2\xbc\x79\x2e\x73\x68\x1e\xf1\x6a\xb3\x61\xec\x47\xb4" - "\xdf\x07\x91\x3f\xae\x59\x43\x8b\x4c\x6a\xe1\x91\x15\xb9\x24\x58" - "\xb5\x0a\xc8\x88\xf3\x2e\x25\xa1\x7f\x3d\xf9\xe1\x59\x4d\xf0\xaf" - "\x26\xc6\x26\xf7\xa2\xe9\x3a\xa2\x5e\x7d\xb1\x57\xd0\x6d\x8e\x5f" - "\x15\xd1\x80\x5f\x3f\x39\x2e\x19\xf7\xf6\x4c\xe4\xbb\x39\x24\x20" - "\xd6\x05\xdf\x0e\x26\x46\x2b\x69\x4e\xc4\xb3\x99\x87\x83\x91\xa7" - "\x68\x46\xdb\x99\x47\xd2\x0a\x48\x50\x5a\x1d\x6d\x58\xf5\x7c\x8f" - "\x20\x58\x47\xb5\x80\xff\x39\x7d\x82\x7f\x55\xd4\x01\x65\x1c\x4a" - "\x60\xef\x15\xfb\x5f\x37\x63\x38\xd4\xed\x92\x7f\x75\xb3\xef\x94" - "\xeb\x66\xdf\x79\x95\xeb\xa6\x95\xeb\x96\x08\x75\xbb\xb8\xde\xbf" - "\xba\xb5\x34\xc8\x75\x6b\x69\xb8\xc2\xba\xed\xf2\xbf\x6e\xa9\xbf" - "\xaa\x27\xcd\xc3\xfc\xab\x5b\x9b\x41\xae\x5b\x9b\xe1\xa7\xd4\x2d" - "\xbd\x80\x9e\xa9\x18\xc8\xe3\x91\x22\xee\xd7\x13\xfb\x7d\xcb\x06" - "\x62\xbd\x48\x28\xd4\xeb\x6c\x46\x01\xfd\x96\xf3\x2c\xcd\xef\xf0" - "\xb5\xae\x19\xd6\xbf\x73\x71\x7c\x1c\xdb\x99\xcc\x2b\x04\xdc\xb4" - "\x93\x66\x51\xe7\xdd\x76\xb4\x77\x72\xa2\x3f\x02\xf4\xdd\x3b\xf1" - "\xdd\x56\x87\x9a\x86\x8e\x4e\xd8\x7a\x31\x90\xbc\xdb\x6a\x03\xbe" - "\xa5\xd9\x2a\xf9\x17\x94\xde\xd5\xe4\x77\x85\x4f\xf6\xfe\xb1\x89" - "\x44\x83\xf8\x84\x57\x8c\x3d\xb3\x26\xbd\x57\x50\xec\x0f\xc8\x0f" - "\xd8\x23\xa4\xf3\x59\x52\x59\x13\x1a\x7a\x51\x4d\x1a\x09\xc0\x33" - "\x62\xcc\x6f\x99\xce\x46\x06\xa7\x91\x1e\x13\x52\xa1\x7c\x07\x49" - "\xd0\xa4\x42\xd9\x40\x0f\xce\x93\xdb\xe7\x07\xcc\x21\xc1\x79\x50" - "\x36\x5e\x63\x75\x19\x74\xc5\x46\x12\x88\x67\xc9\xf0\x4c\x18\x3f" - "\x0f\xd6\x33\x08\xbe\x93\x27\x7d\xa7\x1b\xfa\xf5\xe3\xf4\x6b\x59" - "\x28\xd3\xaf\xe5\x2e\x99\x7e\xf6\x73\x9c\x7e\xf6\x3a\x99\x7e\x2d" - "\x55\xfe\xd1\xaf\x45\x2f\xd3\x8f\xbf\xdb\x35\xfd\x5a\x9e\xf2\x4d" - "\xbf\x96\x39\x32\xfd\x78\x59\x3e\xe8\xd7\xd3\x3b\xfd\x5a\xde\xbb" - "\x32\xfa\xb5\x54\x5d\x21\xfd\xfa\x72\xfa\xb5\xbe\x2f\xd3\xaf\x75" - "\x96\x4c\xbf\xd6\xa1\x9c\x7e\xad\x83\x65\xfa\xb5\x85\xf9\x47\xbf" - "\xd6\x04\x99\x7e\xfc\xdd\xae\xe9\xd7\xba\xde\x37\xfd\x5a\x77\xc9" - "\xf4\xe3\x65\xf9\x47\xbf\xd6\x1f\x80\x6e\x5a\x91\x7e\x5a\xdf\xf4" - "\x6b\x0b\xbb\x42\xfa\x69\x38\xfd\xda\x5a\x64\xfa\xb5\xbd\x29\xd3" - "\xaf\x6d\x2e\xa7\x5f\xdb\x0c\x99\x7e\x8e\x49\xfe\xd1\xaf\xad\x48" - "\xa6\x1f\x7f\xb7\x6b\xfa\xb5\x7d\xe1\x9b\x7e\x6d\x4d\x32\xfd\x78" - "\x59\x3e\xe8\xd7\xcb\x3b\xfd\x1c\xc3\xae\x8c\x7e\x8e\x49\x5d\xd1" - "\xcf\x3f\xde\xc3\x91\x48\x7c\xd8\xe0\xf9\x59\x8e\x6f\xbf\x6b\x18" - "\xcb\xe9\x12\x51\x0b\x59\x8e\xe2\x42\xa1\x67\x10\xee\xd7\xc2\x6f" - "\xd4\x5d\x3d\x54\x4b\x1c\xae\x42\xa1\x47\x10\xcd\xfa\x38\x47\xc8" - "\xda\x3f\x8a\x2e\xef\x19\x28\x2c\xef\x15\x88\xe7\x57\xbd\x95\xc5" - "\x6d\xfd\x2e\x3d\x1b\x30\x80\xdc\x8a\xe7\x3a\x56\x00\xff\x86\xbf" - "\xdb\xb2\x2e\x25\x02\x2f\x72\x99\x9f\xfd\x19\xb3\x16\x4c\x9b\x3e" - "\x67\xa6\x3e\x69\xe6\x8c\x85\xf3\x66\x4c\x9b\x97\xac\x9f\xf6\xdc" - "\x0b\x0b\x94\xbe\x8e\x59\xec\xcd\x95\xd8\x7f\x97\x76\xb9\x7d\x0d" - "\x64\xd1\x54\xf4\x2f\x65\xbc\x9d\xdc\xd0\x48\x2e\x35\x31\x1f\xd1" - "\xa1\xa3\xcb\x68\x47\xdc\xa6\x98\x3b\xe8\x41\xe6\x37\xab\x23\x71" - "\x13\xc8\x59\x45\xe8\x5f\x40\xdc\x4f\x2a\xaa\x27\x1d\x2d\x34\x64" - "\x1c\xc6\x7c\xb5\x73\x9b\xf3\x76\xe6\x8b\x01\xfd\x0e\x50\x6d\xac" - "\x43\x30\x8d\x6b\xa0\x6b\xc7\x59\x91\x06\x15\xe8\xb3\x28\x25\x60" - "\x50\x2d\x71\x6d\xa3\x21\xb1\x0e\x28\xcb\x29\x96\xc3\x7c\x1d\xc4" - "\x2c\xa1\xdf\x60\x79\x22\xef\x8d\xf1\x0f\xcd\x9c\x1f\x6c\x5f\xae" - "\x59\xae\x0f\xc0\xbc\xe8\x3b\x0c\x7d\x6a\x49\xb1\x45\xb0\xde\x98" - "\x17\xf8\xf3\x87\xe0\xfd\x87\xb6\xb2\xd8\x21\x62\x19\xbc\x4e\x37" - "\x42\x9d\x4a\x58\x5b\x4c\xb1\xdb\x9a\x97\xc6\x6d\xc2\x72\x38\x5d" - "\x5d\x2f\xc3\xb7\xb7\x61\x19\xe8\xd3\x07\xdf\x15\xdf\xb9\x05\xde" - "\xe1\xbe\x4b\x56\xdc\xbc\x89\x97\xe1\x9a\x2f\xd5\x0b\x78\xea\xde" - "\x70\x3f\xd9\xe3\x1b\x7d\xe0\xfe\x61\x8f\xe7\xc1\x70\x3f\x04\xf8" - "\xd0\x10\xf1\x79\x5f\xb8\xc7\xd8\xb0\xc1\xac\x5d\xb9\x99\xa2\x3d" - "\xa7\xb3\x09\xd2\xb4\x62\x9e\x90\x46\xe2\xc4\x58\xc4\xa1\x62\x19" - "\xa1\x70\xff\x3e\xca\x90\xe2\xf3\x30\xb8\xdf\x88\xfa\x7d\xf1\x79" - "\x7f\xb8\x5f\x06\xf7\xff\x21\x3e\x07\x3e\xbf\x83\xfb\xda\xd2\xc6" - "\xda\xb0\x4d\x40\xfb\xa3\x2c\x96\x78\x48\xac\x0d\xd2\x8a\x40\x7e" - "\xcd\xc0\x7e\xc4\x76\x9a\x97\xa0\x9f\x83\x8e\x72\x3c\xeb\xc1\xfb" - "\x6a\x5c\x03\xf7\x13\xa1\x8e\x83\x74\xd4\xe3\x04\xf4\x63\xf1\x08" - "\xc6\xa1\x8c\x00\xd8\xe3\x7c\x18\x69\x28\x7e\x0b\x64\xa4\x0e\xbb" - "\xd8\xcf\x40\x3b\xf4\x3f\x49\x32\xb1\x5c\x7e\xce\xa1\x43\x3c\xe7" - "\xe0\x0c\xfe\x71\x67\x92\x9d\xc1\xac\x1d\x30\xf6\x50\x07\x62\x0b" - "\x89\x5d\xc5\xce\xe1\xc3\xf8\x93\xc6\x01\x8e\x01\xaa\xbe\x94\xcc" - "\xf5\x2b\xce\x64\xd9\x0f\x7d\x47\x95\xa8\x63\x21\x5c\x06\x70\x7a" - "\xd8\xff\x74\xb0\xb9\xef\xf1\x6c\x97\xc7\xb3\x38\xe9\x19\xb7\x51" - "\x73\x1e\xf5\x78\x36\xaa\xd3\xb3\x3a\x8f\x67\xd1\xca\x32\x5d\xc4" - "\xe3\x99\x41\xf9\x9e\x6b\xa0\xc7\xb3\xb0\x4e\xcf\xa2\x3d\x9e\x05" - "\x8a\xcf\x02\x20\x7d\xa2\xec\xb3\xab\xdd\x2e\xa6\x03\x8e\xbb\x12" - "\x3d\xd2\xeb\xc4\x74\xfc\x7e\xa6\x95\xbc\x53\x23\xa6\xb3\x31\x0c" - "\x63\xe4\x4e\xf1\x1b\x05\xf2\x37\xda\x45\x9b\xab\xd8\x55\xbc\xaf" - "\xda\x23\x34\x2a\x7d\x2f\x1c\x2f\x9a\xe5\x99\x18\xb7\xc2\xc4\xfd" - "\xd3\xf0\x39\xc6\xe2\xb4\xc1\x15\xde\x8b\xf0\x85\x7b\xde\x6d\xf8" - "\x04\xad\x74\xee\xc9\x65\x8a\x35\x09\xa6\x1d\xe8\x4b\x74\x10\xfa" - "\xb1\xc9\x68\x42\x3f\x00\x76\x62\x21\xed\xc4\x92\xdc\x96\x89\x71" - "\xa2\x2a\x78\x7c\xa8\x7e\xb8\xff\x86\x76\xf7\xe8\x8b\xa7\xc2\x78" - "\x8e\xc5\x88\x5a\xd4\x44\x06\x1a\x1f\xa4\x75\xf5\x44\x48\x76\xad" - "\x8d\x35\x89\x67\x79\x37\xf2\xf3\x68\x02\x6f\x0f\xca\xac\x4d\x4c" - "\xff\x1b\x54\x4f\x68\x20\xcb\x43\xe3\x36\xf2\x36\x52\x46\xd7\xad" - "\x59\x52\xcc\x1f\x61\x97\x14\x1b\xcd\x4a\x68\x50\x4b\x48\x66\x03" - "\xa4\x99\x95\x36\x87\xc2\x57\x58\x26\xd6\xdd\x4a\x84\x34\x2c\x1b" - "\xf2\xd4\xb9\x6d\x0e\x21\x7d\x91\x93\xdc\x04\xf5\xaa\x97\xca\x6f" - "\xcb\xa2\x81\x56\xe2\x62\x72\x24\x96\xd9\xb2\xf6\x0d\x2d\xa4\xe9" - "\xac\x81\x37\x1a\xb9\xcd\x22\x05\xfe\x67\x6f\x4d\x57\xe7\xbd\xa8" - "\x76\x3c\xc8\xe3\xe3\x83\x60\x0e\x3b\xf8\xb9\xcf\xf1\x84\xcb\xea" - "\x74\x3e\xda\x45\x60\xcc\x3b\x94\x9d\x39\x8e\x50\xbe\xff\x01\x69" - "\xd0\x47\x3b\xe9\xda\xf1\xcc\xcf\x9f\x7f\x73\x8e\x32\x9a\xac\xb9" - "\x48\x82\x72\x93\x24\x9f\xb9\xb4\xcc\xc3\x97\xb8\x68\x8b\x4c\x5b" - "\x2a\x52\xd9\x9e\x10\xab\x63\xe7\x3a\x60\x7d\xa1\x2c\xa3\xcf\xb5" - "\x51\x3b\x8e\xfb\x0c\x5f\x37\xda\xc8\xec\xbb\x54\xe4\xf7\x01\xba" - "\x01\x4b\xdb\xb2\x49\xb4\x24\x7b\x63\x9e\xdc\x76\xf4\xdf\x34\x5e" - "\x6e\x67\x92\x13\xf3\x26\x30\xfd\xb9\x8a\x24\x03\x2e\xa1\xaf\xf4" - "\x40\x31\x3d\xb9\xc2\xe9\xc0\x33\x95\x5e\x7d\xab\xb0\x38\x2a\x68" - "\x53\xb9\x6e\x9c\x03\x6d\xb9\xef\x71\x88\x75\x56\xa9\x92\xd1\x86" - "\x18\xeb\xcc\x68\xab\x52\xcd\x92\xe8\xb8\xfa\x22\x94\x9d\x7e\x92" - "\xd4\xa9\xc8\x0f\x68\x77\x82\x36\xf1\x6b\x96\x88\xb6\x50\x90\xc6" - "\xf2\xb5\xbb\xf3\x30\xbb\x7e\x3c\x0b\x88\xf8\x58\xc8\xe2\x78\x8c" - "\xc3\xf8\x6a\x3b\xd9\xb9\x72\x95\x6a\x38\xd3\x63\x26\x11\xde\x6e" - "\xb4\x33\x53\xa9\x98\x9d\x72\x5b\xb6\x2a\xd2\xaa\x52\xb1\xf3\x43" - "\x56\x31\x6d\x0d\x7e\x3b\xa5\x9d\x9c\x57\xa9\x42\x30\xee\x1e\xd0" - "\x39\x08\x7d\x12\x55\xd8\x61\x9e\xa4\xb6\xe3\x58\x08\xc2\x98\x4d" - "\x90\x5f\xcb\xf1\x1e\x68\xae\x22\x76\xfc\x3e\xd2\x16\xfa\xce\x06" - "\x34\x7d\x19\xca\x5e\x25\xd1\x14\x63\xe5\x42\x9e\x9d\xbe\xfa\x05" - "\x69\xe4\x82\x3a\xe3\x19\x7a\xf3\x4d\x27\xa1\x7e\xea\xa7\x84\xd0" - "\x71\x0e\xb4\x69\x84\xba\x5e\xe2\x58\xc1\xfb\x8e\xcd\x25\x95\x7a" - "\x28\x7c\x63\x0f\xee\x01\xa2\x8f\x5d\x16\x0f\x59\xa5\xaa\x12\xe9" - "\xc7\x7c\xb8\x9b\x52\x38\x1d\xc4\xfc\x39\x5c\xcf\x32\xe0\xa3\xb6" - "\x6c\xb5\xbc\xff\x03\xe9\x4c\x67\x16\xce\xcf\x7a\xc3\xb3\x18\x8f" - "\x3a\xdb\xd9\x99\x24\x28\x0b\xda\xda\x80\xdf\x5a\x8d\x3e\x63\x70" - "\x5c\x34\x7a\x8c\x7f\x95\xea\x18\xd6\x13\x6d\xe6\x5c\x21\xa3\x8d" - "\x74\xed\xe8\x64\xa4\x33\x94\x4d\x80\xf7\xf0\x1a\xa3\x00\xb1\x12" - "\x4f\xb6\xc3\xf7\x8a\x25\x1e\x08\x78\x9f\x41\x8d\x2a\xf5\x69\xde" - "\x56\xee\x2f\x0d\xcf\xf7\xba\xd3\xd6\xee\xaf\x86\xf9\x5e\x25\xf2" - "\x2c\x55\x3e\x7d\x6d\xdd\x4d\x22\xf1\x1c\xbb\x18\x5f\xd4\x4e\xb5" - "\xfb\x53\xd1\x7f\x27\xfa\x22\x33\x2f\xb9\x17\xea\x1b\xb0\xf6\xb5" - "\x70\x76\xd6\xca\x6e\xbe\xfb\x22\xea\xbd\x9a\xea\xd3\x98\x7f\x8a" - "\xa0\x09\xa9\x4e\xca\xce\x63\xe3\x39\xad\x90\xfd\xc8\xdb\x34\x31" - "\x3f\xd6\x58\xe6\x8f\xf5\x45\xa9\x0a\x98\x22\xf2\x26\x78\x76\xf7" - "\x57\x8d\xaa\x00\xa6\x9b\x84\xdf\xe1\x8d\xaa\xc0\xbd\x3c\x5e\x17" - "\xf7\xab\x2c\xda\x00\xf6\xe4\x67\x38\x6d\x84\xf9\x6c\x54\x05\x0e" - "\xd5\xff\x9a\x90\x26\x55\xe0\x30\xe6\xdb\xd4\x14\x5b\x27\xd2\xa0" - "\x6e\x0d\xaf\x97\x26\x3e\x55\xcd\xea\x88\xf5\xf3\xb3\x6e\x0e\x71" - "\xed\xea\xd9\x96\x1d\x38\x42\x3a\xfb\xc9\xda\x2f\xfa\x3c\x35\xdf" - "\x7e\x11\xeb\xf0\xa6\xb8\x5e\x35\x88\xdf\x6e\xf8\xe9\xdf\x0e\x4c" - "\x16\xcb\xdc\xc7\xfc\xbe\x02\x5d\xa0\xdc\x7d\x50\x8f\x52\x69\x0d" - "\x15\xed\xd6\x23\xd8\xda\x9e\x1d\x58\xe3\x5e\x3f\x45\x1a\x2a\x62" - "\x14\xbd\xf8\x62\xb2\x1e\x18\x70\xe3\xb4\xe4\xe7\x12\xf5\x33\x93" - "\x92\x5e\x4c\xd2\xa3\x83\x03\xcf\x39\xc6\x6c\x53\xb2\x03\x6d\x62" - "\xac\x99\x9d\xee\x58\x33\xd9\x3d\xa2\x3d\x63\x22\x59\x55\x3d\x7c" - "\xfa\x34\xf3\xaf\x8d\x3d\x7c\xc6\x4a\x36\xa9\x85\x62\xf8\x2b\x81" - "\x3f\x33\xfc\x1d\x45\xb9\x25\xde\x41\x62\x60\x7d\x64\xe7\x34\x25" - "\x9f\xd8\x42\x76\x0f\x2d\xee\x4f\xd7\xaa\x7a\xbc\x5f\x28\x04\x12" - "\x76\x9e\x3d\x4b\x40\x1b\x0f\xf4\xd1\x5b\x02\x7f\x66\xf8\x3b\x0a" - "\x7f\xdc\xe7\xcb\x27\xec\xdc\x5f\xb1\xe7\x33\xdc\x33\xa6\x59\xf9" - "\xe8\xeb\xb7\x92\x2e\x0f\x64\x7b\x0c\xc2\x3a\x9e\xaf\x53\x1d\xd4" - "\x20\xc7\x46\x8b\xf9\xd8\x7a\xda\x6f\x39\xd1\x7b\xc9\x17\x40\xb3" - "\x2e\xe5\x89\xf9\xd8\x7a\x27\xb5\x07\xfd\x47\x43\x7e\x29\x5f\x20" - "\xcd\x56\xdb\xc5\x7c\x8c\xaf\x14\xb2\xd4\xde\xbe\xdb\x83\x66\x7d" - "\x26\x7d\x57\xeb\x59\x9e\x47\x9e\x9e\x42\x96\xcd\x81\x79\x84\xe5" - "\x81\x8c\x7f\xa3\xd9\x3d\xe2\x20\xbf\x57\xd9\xcd\xbf\x7e\xea\x45" - "\x3a\xf7\x93\xf1\xb9\x59\x33\x1f\x98\x35\x2f\x05\xa3\x92\x24\xbf" - "\xb8\x30\x19\xaf\xf3\xa6\xbd\xc0\x2e\x2f\xc6\x3f\xff\x1c\xff\x91" - "\x3c\x27\x12\x7f\xcc\x81\xf1\x86\xd7\x19\x0b\x8d\x78\x79\xee\x45" - "\xbc\x4d\x4d\x8c\x58\xf8\x9c\x14\x46\xd5\x73\x1c\x1a\xda\xb2\x7b" - "\xc1\xfa\xd1\x83\xed\xc5\xc1\xef\x3d\x20\xcf\xb2\xb8\x37\x9a\xe5" - "\x56\x72\xc4\xe0\x24\x92\x0c\xcb\xfb\xbf\x17\x61\x3e\xf2\x54\xbd" - "\x0e\x15\x0a\xbd\x82\x34\xcb\x8d\xcf\x69\x9c\xb3\x66\x02\xce\x56" - "\xc2\xbb\x36\x2b\xc9\x16\xcf\xe6\xc6\xda\x99\x3f\xb8\xec\x5e\x31" - "\x92\xdd\x9f\x60\x8a\xdd\x89\x3e\x99\x99\x1d\xd0\x3a\xe6\x03\xa1" - "\x0a\xee\x6d\x70\x8f\x71\x16\xc2\xe0\xbe\x18\xee\x1d\x70\xaf\x83" - "\xfb\x81\x82\x29\x2a\x06\xcf\x4a\xc1\xbd\x1e\xee\x07\xb7\x65\x07" - "\x4d\x94\xe6\x85\x27\x6d\xc4\x20\x3f\x0f\x78\x95\x77\x95\x3e\x45" - "\x60\x6e\x05\xe5\x49\xb1\x14\x59\xdc\xc4\xec\x20\xf7\xfe\x1f\x8f" - "\x4b\xa2\x9d\xc2\xd6\x35\xb6\xb6\xdf\x70\x5b\x80\xee\xe6\xde\x8c" - "\xf7\xce\x0e\x2a\x93\xf6\x68\x19\x6f\x9d\x1d\x54\xe3\x11\x73\x12" - "\xef\x9b\xdc\x31\x27\x39\x2f\xba\x89\xf1\xa2\xaa\x1b\xa2\x68\x76" - "\xd0\x14\x77\x5c\xa0\xec\x1b\x14\xfb\xbf\x56\x78\x8e\x32\x0d\xa4" - "\x47\xc8\xeb\x60\x90\x19\xbf\xe9\x2d\xbe\x26\xc6\xf4\x8e\x5f\x0c" - "\xfc\x37\x5c\x45\x5e\x5c\xcf\x64\xad\x2c\xf4\xfb\x47\xbd\xfa\xa9" - "\x66\xf1\xa6\x54\x37\xec\x45\x7f\x8f\xb6\x8c\x19\xaa\x3b\x0a\x89" - "\x8a\xdd\x73\x5f\x5f\xf4\xbc\xea\x06\x76\x7e\x50\xf2\x03\xe4\x79" - "\x26\xd7\xeb\x19\x80\x13\x84\xf0\xf8\x15\x73\x5e\xd4\x38\xa7\xcd" - "\xe4\xbc\x5b\xef\x01\xe2\xfe\x6f\x1e\x5f\xe3\x7b\x07\xd2\x27\xb9" - "\xbf\x7d\xab\xaa\x77\x0e\xc6\xf1\xd0\xa8\xe6\xbc\x48\xe1\x5d\x4d" - "\xea\xb4\x99\x2c\x0d\xf2\xad\xc0\xb8\xcc\xbc\x7e\x67\x2d\x03\x1b" - "\x08\x6d\x75\xf1\xb3\xc6\xaa\x1b\x1a\xa6\xde\x92\x89\xdf\x09\x62" - "\xbc\xc3\x09\x12\x8c\x71\x99\xb0\x6e\x85\x1e\x7e\x8a\xd6\x40\x1a" - "\xda\x46\x35\x3f\x49\x82\xd1\x5f\x23\xaf\xcb\x0d\x0d\x2c\xfe\x4d" - "\x76\xef\x4c\xc9\x97\x02\xd0\xb9\xa1\x73\x7b\x9e\xfc\x23\x9b\x15" - "\x43\x9e\x8b\x98\xf8\x28\xfc\x8a\x10\x43\x0e\x7a\x8e\x97\x81\xcd" - "\xa1\x8f\x57\x37\xef\x7e\xf2\x43\x16\x37\x2b\xbb\x77\x25\x94\x93" - "\xcc\xfa\x78\xc5\x9f\xcf\x22\x9e\x30\x5f\x0c\x2e\xa2\x63\xe7\x9f" - "\x04\x3b\x8b\x4d\x56\xaf\xea\xbb\x11\x7d\x26\x32\x5f\x44\xd9\xbd" - "\xf3\xb0\xdf\xa1\xaf\xd8\x1a\x2f\xac\x8b\xc5\x7b\xe6\xdf\x53\x58" - "\x3b\x26\xd1\xa2\xc5\xb6\xf7\x31\x00\x8e\xc6\xc2\xdf\x9f\x78\x7c" - "\x82\x3f\x9f\x95\xca\x44\x5f\x21\x30\x9e\x2a\xe1\xaa\x6d\xcb\xee" - "\xe3\x1e\xff\xee\x73\x63\xaa\x3e\xf3\xd1\x9f\x09\xfa\x6b\xe0\x7c" - "\x6b\xdf\x97\x38\x2f\xd9\x27\xcd\x4a\x34\x23\xf9\x9c\xee\x93\x63" - "\x25\x45\x45\xe2\x6f\x18\xff\x77\x17\x74\x2a\xe3\x6b\x49\x5f\xc1" - "\xc7\x7d\x9f\x12\x18\x7f\xb1\xf0\xf7\x27\xc8\x5f\x2a\xc5\x25\x5d" - "\xa1\x66\x67\x7c\xea\x03\x74\x24\x12\xd2\x6b\xa4\xf4\x1e\xaa\x18" - "\xa0\x4d\x9f\x26\x09\x43\x9a\x43\x47\xa7\xc1\x3d\xd0\x9c\x64\x8a" - "\xf7\x39\x6d\xd9\xc1\xc1\xd2\x3d\xfc\xd6\x49\x18\x03\xbf\x81\xff" - "\xdb\xda\x20\xfe\x8e\xb4\x92\xd7\xa5\xf4\x11\xd6\xc0\xfe\x65\x52" - "\x3d\x85\xac\x00\x0d\xaf\x6b\x5f\xa3\xb0\x76\x87\x1e\x63\xbf\x42" - "\x9e\x04\x98\x2b\xdc\x77\x40\x4a\x53\xd1\xaa\x76\xed\x24\x8c\xdb" - "\x6e\x7e\x1e\xc7\x40\x5f\xe6\x3f\x6c\xf5\x12\x2d\x8b\x79\x8f\xe7" - "\x9b\x59\x1c\x1f\xf4\xff\xe5\x24\x3d\x99\xdf\xe8\xb5\x3b\xb4\xcc" - "\x5f\xf2\x22\x43\xb0\xe4\xfb\x0b\xe6\xdc\x28\xaa\x5e\xe5\x44\x7f" - "\x60\x4c\xcf\xd5\x66\xe8\xc7\x7c\x80\x89\xbe\xbf\xb6\xa4\x90\xb0" - "\x02\x81\xfb\xfe\x62\x67\x9f\x7b\x02\xaf\x9f\xe2\xdd\xff\x17\xcd" - "\x3a\xe0\x90\xfc\x7f\x61\xac\x67\xf8\x6d\xa0\xad\x4e\x4c\x63\xfe" - "\xf9\x45\xbf\xaf\x81\x5e\x7d\x81\xa9\x01\x03\xd5\xdc\x17\x98\x7f" - "\x6b\x47\xdf\x11\xbc\xff\xfb\xa6\x49\xf1\x50\x3d\xd2\x4c\x30\x7e" - "\xb9\x9d\x89\xaa\x8f\x51\x4c\x03\xfc\xdb\x3a\xc9\xcd\x67\x01\x76" - "\xa1\xbe\x0f\xe6\xa7\x9d\x66\x24\x6e\xf4\x9c\x2f\xcc\x1a\x80\xe0" - "\x32\xdc\x03\xd6\xd8\x9e\xf0\xd7\x0b\xff\x46\xb9\x71\xa1\x95\x56" - "\x8b\x71\xfb\x9c\x9a\xd4\x00\x3a\xc1\xe9\x0c\x88\x77\xaa\xaa\x58" - "\x6c\x42\x17\x51\x4f\x70\x39\xf1\x4c\x71\xa0\xb3\x95\x56\x4d\x70" - "\x35\xd3\x35\xcf\x63\x7c\x31\xf4\x65\x3a\x88\xc6\xbb\x4c\x2c\x56" - "\x9f\x90\x42\x2b\x91\xc7\x77\xb5\xd2\x32\x57\x0a\x3d\x0a\x7d\x10" - "\x8c\xf2\x03\xfa\x5a\xe9\xa7\x72\x90\x7e\xc6\x80\x83\xe3\x5b\x0e" - "\x52\xf4\xb3\x82\x71\x6f\x84\x6c\x07\xfa\x7d\x51\xc5\x3b\x03\x32" - "\x2d\xce\x3a\xe6\x73\x7a\x42\xea\x43\x74\x82\xab\x17\x05\x9c\x0c" - "\x60\x31\x6b\x52\x68\xe9\x84\xc5\xb4\x99\xc5\x33\x5b\x0c\x7c\xf5" - "\xe2\x66\x8a\xf1\xd1\xa0\xec\xa3\xf1\xa9\xb7\x63\x3c\xb4\xf6\x09" - "\xa9\x42\x46\x7c\xaa\x0a\xea\xf2\x2d\x9d\x90\xfa\x2d\xd4\x27\x12" - "\xca\xd5\xc2\xfd\x43\x74\x2b\xab\x67\x26\x93\x63\xa0\x8d\xe6\x35" - "\xbc\x9e\x25\x50\xc7\x3d\xe8\x0b\x36\xde\x69\xce\x64\xf1\xd7\xc4" - "\x18\xc9\x13\x52\x3b\x28\x7e\x0f\xbe\x15\x3d\x61\x31\x79\x28\x7e" - "\xf1\xa0\x4c\x26\x0f\x9e\x47\x9f\x35\x7a\xf8\x6e\x26\xd2\x23\x18" - "\x63\x14\xb2\x33\x4b\xd9\x1a\x43\x57\xb1\xd5\x10\x63\x16\x0c\x20" - "\x6a\x94\xf5\x5d\x3b\x1e\xd0\xa2\xef\x97\x0c\x1b\x75\xa0\x4e\xee" - "\x60\x7b\xb5\x5a\x9f\x12\x08\x78\xa9\x19\x57\x61\x8c\xf4\x7e\x66" - "\x2d\x37\x26\x87\xae\x7f\x2c\x99\xe6\xc6\xce\x80\xab\x9d\x9a\xc6" - "\xe4\xa3\x4d\x28\xcd\xfd\x43\x0c\x5d\x3f\x0a\xd2\x47\x0f\x84\xab" - "\x9d\xe6\x3e\xee\xa0\xeb\x41\x5e\xca\x1d\x5f\x05\x57\xb8\xd7\x9b" - "\x21\xbf\x91\xe6\xde\x1e\x09\x57\x1b\xcd\xbd\xa3\x08\xf2\xc1\xfd" - "\x10\x2d\x5c\xe1\xfe\xce\x4c\xc8\x07\xf7\xff\x61\xab\x57\x69\x75" - "\xf0\x1b\xd2\x9e\x28\xe6\xdf\x9a\xb4\x8f\x7d\x2b\xf7\x4f\x47\xf9" - "\x37\x9e\xa9\xe2\xdf\x78\xd6\xca\xbf\x91\xd0\xc4\xbf\x71\x57\x02" - "\xe4\x4b\xa5\xb9\xbf\x19\x0b\x57\x07\xcd\x1d\x1a\x0d\xf9\xe0\xfe" - "\x9e\xc1\x70\x85\xfb\x61\xf0\xad\xd1\x70\x7f\xaf\x13\xae\x70\x1f" - "\xd5\x00\xf9\xd2\x68\xee\xef\xaa\xe1\xea\xa4\xb9\xd1\x58\x3e\xdc" - "\x3f\x50\x02\x57\xb8\x1f\xb1\x13\xf2\xc1\xfd\x83\xf9\x70\x85\xfb" - "\xe7\xa0\x4d\x8f\x65\xd2\xdc\x99\xbb\xe0\x39\xa1\xb9\x7f\x81\xef" - "\x8d\x82\xfb\x59\x61\xf0\x1c\xee\x67\xc3\xfb\xa3\xe1\x7e\x4e\x1a" - "\x5d\x3f\x06\xee\xe7\x61\x5b\x57\xd2\xdc\x17\xe1\x3b\xa3\x02\x69" - "\xee\x7c\x6c\x33\xdc\x2f\x88\x83\x7c\x70\xbf\x10\xeb\x03\xf7\x29" - "\xf0\xde\x18\xb8\x4f\x05\x1a\x3c\x96\x43\x73\x97\x4e\x84\x7c\x40" - "\xeb\x74\x3d\x5c\xe1\x3e\xd3\x06\xf9\xe0\x7e\x05\xd0\x70\x34\xdc" - "\x67\x9b\x20\x3f\xdc\xbf\x8c\xed\x5d\x45\x73\x57\x45\x41\xbe\x60" - "\x9a\xbb\x26\x08\xae\x70\xbf\xb6\x06\xf2\xc1\x7d\x1e\xd0\x6f\x34" - "\xdc\xff\x75\x25\xe4\x0f\xf6\xde\x9f\x9b\x9c\x74\x79\x4f\xa8\xeb" - "\x1b\x41\x74\x79\x2f\xb8\xee\x2c\xa1\xcb\x7b\x18\x68\xee\xae\x44" - "\x48\x87\xeb\x9b\xdb\xe0\x3e\x42\xbc\x87\xeb\x5b\x26\xb8\x8f\x14" - "\xef\xe1\xfa\x76\x1a\xdc\x47\x89\xf7\x70\x2d\xc6\xfb\x68\x9a\xfb" - "\x1e\x5c\x7b\xc2\xb5\x18\xca\xef\x31\x42\xbc\x87\xeb\xff\xe0\xde" - "\x04\xd0\x72\x77\x14\xa4\xc7\xc0\xd5\x0e\xf7\x70\x7d\x77\x0f\xdc" - "\x8f\x84\xfc\x3a\xb8\x1f\x69\x1b\x72\x3f\x9e\x91\x27\x42\x78\xbf" - "\x48\x1a\xfe\xb8\x2d\xa3\x85\xa8\x71\x8c\xa2\x7f\x73\x58\x9b\x06" - "\xd5\xaa\x42\x5a\x8a\xd3\xad\x6a\xcc\xe3\xda\xf0\x98\x51\x08\x7f" - "\x0c\xf7\xb5\x7a\x42\xbe\x5e\xf5\xaa\x1b\x87\x22\x9f\x69\x49\xb3" - "\xb2\x58\x4b\xa2\x1f\xa3\x9e\xb5\xaa\xd0\x5b\x80\x4f\x88\xc6\x58" - "\xba\x40\xb7\x5d\x34\xab\xc7\x45\xa0\x57\x04\xcd\xea\x53\x0b\x57" - "\xb8\x0f\x39\x01\xf4\x82\xfb\xdf\xbd\x02\x57\xb8\xff\xf3\x23\x40" - "\xb7\x88\xb6\xec\xd0\x34\xab\x4a\xc3\xd7\xea\x6c\x4a\xd1\x07\x2c" - "\x9e\xab\x01\x6c\x12\x2c\x69\x76\x42\xb3\x63\x08\xbd\x2d\x25\x92" - "\xe9\xd3\xfa\x3f\xa3\xd5\xa4\xc2\xfd\x90\x68\xa8\xf7\xaf\x62\x98" - "\xcf\xb9\x2c\x90\x6d\x3b\x06\xab\x79\x3d\xfa\x50\xa8\xc7\xfb\xa8" - "\x03\xa5\xe1\xf7\xf8\x7a\xfe\x05\x7b\x7e\x7b\x4a\x31\x7f\x1e\x44" - "\xe4\xe7\x7f\xc6\xe7\x2d\x1a\xd4\x5b\xdf\x79\x37\x7b\x6e\xb1\x37" - "\x88\x6d\x0c\x80\x67\x37\x86\x60\x5e\xab\xea\x46\x7e\x1e\x43\x15" - "\x0a\xed\x09\x20\xcd\xda\x31\x2b\xdb\xb2\x6f\x1c\x09\xed\x88\x12" - "\x79\xea\x9d\x54\x1b\xbb\x8b\x9f\xcf\x1e\xef\xd5\xde\x04\x65\x4a" - "\x21\x2f\x3e\x7f\x75\x16\xad\x44\x39\x15\xd6\x23\xb5\x3e\x7d\x70" - "\x49\xad\xaa\xbf\x76\x0b\xea\x1f\xc2\x16\x1a\xf1\x5c\x0f\x7c\xf3" - "\x8b\x8e\x75\x63\xca\x30\x26\x3a\x3c\x0b\xc9\x70\xd0\x16\x73\xfa" - "\x23\xb0\x6e\x62\xfa\xe3\x41\xcc\x56\x9c\xe7\xb1\x33\x3b\x21\xfe" - "\xdb\xca\x74\xa9\x50\x16\xbe\xeb\x29\x17\xb8\xb2\xab\x9c\x42\xf8" - "\xc2\x4c\xb6\xaf\xa5\xba\xf1\xab\xfd\x82\x55\xad\x49\x26\x3d\xf4" - "\x4b\x0e\x42\xf9\x61\x7a\xa5\x0c\x29\xe5\x65\xcf\x7a\x1c\x80\xbc" - "\x9b\x99\xbe\x27\x2c\x52\xd2\x0f\x53\x68\xc3\xab\xe8\x77\x5a\x4d" - "\x62\x70\x8d\xe4\x3c\x61\x58\x31\xfa\x4b\x73\x86\xc5\x65\x3a\xf3" - "\xfa\xe9\x5d\x79\x0b\x8d\x74\xc3\xc2\xcc\x7e\x4e\x15\x61\x76\xf6" - "\xaa\xb0\x33\xf7\x38\x50\x0f\x77\x1c\xf3\x6e\x11\x7a\x7e\x33\xf6" - "\xee\x54\xa2\x36\x27\x9d\xc4\xfb\xaf\x69\x76\x63\xaa\xa5\xa9\x9a" - "\xa0\xff\x47\xb8\xaf\xa1\xaf\xa8\x8c\x42\xcf\x96\xe2\x42\xe4\x65" - "\x53\x51\x7f\x74\x02\xd3\xa7\x41\xbf\x80\x9c\x10\xb6\xcf\x23\x06" - "\x7c\xe5\x6a\xa0\x1d\xf2\x99\x78\x26\x3a\xde\xe5\x42\xbf\x35\x39" - "\x56\xa0\x03\xef\xaf\xb0\x22\xc4\x7f\xf1\xbb\x2d\x42\xe8\x98\x12" - "\xf4\x64\xa3\x71\x06\xa1\x1f\x90\x16\x76\x8e\xd2\x89\xf1\xa7\x70" - "\xdd\xe5\x79\x3d\xfb\x6e\x96\x78\x7e\x74\xd6\xbc\xe4\xa4\xf9\xfa" - "\x05\xb3\x96\xcc\xfc\xfd\x90\x85\x11\xfa\xa4\x54\x7d\x12\x8b\x57" - "\xca\x12\x66\x44\xe8\x17\xcc\x79\x31\x59\x9f\xbc\xd8\x38\xf3\xf2" - "\x78\x94\x3a\xaa\x1d\x93\xc7\x79\xb7\x9b\x98\xfe\x9f\x16\xa5\x18" - "\x92\xd3\xa8\xa0\xbf\xbd\x17\xf0\xf7\xfd\x8b\x2f\xf5\xec\x3f\x10" - "\xcf\x93\x0b\x59\x7a\x26\x8b\xa1\x0f\xbd\x8d\xa1\x04\xcf\x6b\x04" - "\xb5\x65\xf7\xdf\xe9\xde\x33\x51\xdd\x64\xe3\xfa\x8d\xfe\xfb\x60" - "\x3c\xb2\x35\x29\x4f\xf2\x2d\x24\x3e\x63\x7b\x0e\xd9\xfd\x81\xff" - "\xfb\x3f\xdc\x1f\x42\xd1\xc2\x1c\xce\xf3\x87\xf3\xbd\x1a\x7d\x8a" - "\x81\x6e\x8b\x8e\x04\xde\x4a\x85\x63\x95\xc5\xb8\x23\x17\xd9\x99" - "\x52\xba\x7e\xb2\x09\xcf\x72\xbb\x36\x3c\xae\x15\xc2\x27\x9b\x84" - "\x1d\xd1\xb6\x8c\xd7\x89\xfa\x5d\xc0\x85\x40\x3d\xcc\x87\xdb\xc9" - "\xa0\x83\xe9\x0d\xea\xf3\xaa\xf0\x5b\x0e\xa6\x57\xab\x69\xde\xe3" - "\x0d\xcd\x83\xc7\xe8\x1c\x59\x44\xc5\xe9\xef\x20\x7f\x1f\x49\x50" - "\xd6\x29\xb1\xf7\x9f\x1e\x6d\xef\x3f\xc6\xe1\x58\x3f\xbb\xc8\x7c" - "\xfb\xbd\xe4\xd1\xbb\xe8\x85\x4f\x4b\x51\x37\x75\x53\xf5\xa7\x23" - "\x51\x37\x38\x66\x95\x43\x3b\xc6\x64\xdf\x30\x59\x8b\xbe\x39\x2e" - "\x6d\x98\x6d\x6b\x0f\x1f\x67\x3c\x0c\x79\x8e\x83\x7c\xf0\x19\x8c" - "\x4a\xf4\x0f\x76\xe9\xce\xfb\x33\xdf\x6d\x37\xa9\x8f\x96\x8e\xe0" - "\xfa\xcc\x04\x98\x33\x6c\x3c\x85\x1f\xfa\x74\x4f\x29\x81\x6f\x93" - "\x77\xdb\x47\xa9\xff\x1e\x7d\xd9\xf3\xd3\x9f\x46\x96\x92\x36\xf4" - "\xc1\x07\xf2\xd7\x81\x93\xf9\x84\x6e\x48\x98\xf8\xce\x12\x87\x7a" - "\x8a\x95\xa8\xcb\xab\xf3\x49\xda\x19\xd2\xd7\x79\xc1\x10\xf8\x36" - "\xbc\x7f\x09\x63\x4c\x7c\xa6\x63\x7e\x97\xd2\xcd\x2c\x16\xa2\xa6" - "\x02\xf8\x15\xe1\x82\xa1\x67\xc5\x24\x33\x81\xe7\x8f\x38\x1f\xd7" - "\x91\xf2\x44\x1b\xb1\xc4\x15\x91\x4b\xea\x18\xb2\xf7\x99\x22\xb2" - "\x19\x64\x80\xcd\xe7\x49\x30\xdf\x77\x35\xf4\x74\x76\x18\x02\x9d" - "\x4b\x0d\xe8\x07\x83\xd2\x0b\x86\xde\xc8\x9f\x3a\x5f\x34\x04\x55" - "\xd8\x8a\xc8\x3d\x0d\xc4\x70\x49\x4d\x34\x97\x96\x1a\x7a\x57\x18" - "\xf3\xa1\x2c\x0c\x9e\x4a\x54\xe8\x83\x07\x7d\xf3\x20\x9d\xfa\xc4" - "\x91\x49\x4d\xaa\xf0\x8d\xbd\xab\x48\x7f\x8c\x7b\x81\x3e\x9c\xd0" - "\xe7\x9f\x10\x96\x30\xd1\x15\x36\x59\x9b\xde\x02\xf5\x42\xdf\x15" - "\xbb\x9f\x34\x21\xcf\x3c\x15\x70\x0a\xdb\x2c\x50\x43\xef\x78\xbc" - "\xae\x8b\x7d\x04\xf9\x66\xa1\x4d\x87\x71\x39\x82\xb0\x9e\x30\x4f" - "\x83\x96\x9d\x06\x5a\x66\x18\x02\x21\x5f\x30\xa4\xf7\xb3\x34\x39" - "\x88\x6b\xe8\x93\x45\x77\x1b\x59\x2c\xc7\xb0\xc2\x74\xa2\x35\xa5" - "\x93\x30\xfd\xef\xd8\x58\xda\xeb\x7a\xe7\x49\x13\xcd\x36\x14\xd1" - "\xe5\x81\x03\x79\xda\x80\x8d\xfa\x3f\x10\xa2\xbf\x97\xfd\x7e\x58" - "\xff\x00\xf4\x61\x58\x7c\x31\xe3\xe9\x99\x5c\x37\xe0\x3e\x3e\xc6" - "\x07\x0c\xbd\xd4\x33\xa9\x4a\xc8\xde\x6e\x13\x96\x07\xea\x31\xde" - "\xea\x79\xd5\x80\x10\x9a\xbb\xdf\x46\xf3\x66\xb3\xb1\x08\xf7\x7d" - "\x2f\xf5\x1c\x3c\x91\xe6\x1e\x98\x04\xe5\xc7\x5c\x52\x05\x56\xc3" - "\x5f\x8d\xf8\x7e\x20\xb6\xdb\xb5\x2d\x3a\x08\xdb\xcd\x62\x39\x40" - "\xbb\xe2\xa1\xcf\x68\x78\x7c\x02\xf3\x0d\xdc\x01\xf4\x15\x63\xde" - "\x21\x3d\x90\x06\x42\x87\xa1\x37\x6b\x6b\x87\x21\x18\xe8\x8b\xb2" - "\x9f\x26\x7d\x1a\xbc\xb3\x21\x3e\x19\x9e\xf5\xbb\x14\x16\xbf\x13" - "\x63\xaa\x58\x8c\x36\xe2\x5a\x1f\x6f\x44\x7f\x46\x1b\x97\xc0\x9c" - "\xeb\x1f\x0f\x6b\x7e\x7c\x9a\x38\xb7\x08\xd6\x53\xc8\x3d\x50\x74" - "\x09\x6d\xf3\xa1\x6e\x50\xbf\x6a\xf8\xab\xb1\xaa\x74\x39\x97\x86" - "\x44\xeb\xe0\x3a\x05\xea\xaa\x87\x35\xca\x8c\xbf\xe1\x99\x1e\xea" - "\x3c\x1f\xe9\x80\xf4\x10\x69\x31\x4b\xa6\xc5\x1c\x98\xb7\xba\x38" - "\x21\xbb\x28\xcf\xaa\x1a\x10\x4d\xb3\xff\x33\xd3\x23\xdf\x5a\x39" - "\x5f\x6a\x11\xcf\xf7\xf6\x48\x9e\xef\x51\x07\xf4\xc3\x50\x91\xde" - "\x5f\x78\xa1\x77\xb9\xfc\xee\xb4\x51\xfc\xdd\xf5\x55\xfc\xdd\x48" - "\x7c\xb7\x47\xa7\x3a\xb9\xe4\xfc\x7f\x4e\xe3\xf9\x4d\x2b\x79\xfe" - "\xdf\x94\xca\xf9\x6e\x1a\x22\xe7\xfb\x4b\x10\xcf\xb7\x79\x20\xcf" - "\xf7\xbb\xc1\xf0\x7c\xda\xe5\x75\xb9\x69\xb2\xfc\xce\xca\x55\xfc" - "\x9d\x0f\xa2\xf9\x3b\x13\xf7\xc0\xf3\xb5\xca\xba\xdc\xf4\xb2\x9c" - "\x3f\x5d\x6c\x77\xf1\x51\x9e\xff\xf1\x04\x8f\x7c\xef\xf1\x7c\xf8" - "\xfc\x63\xc8\x37\x20\xe2\x52\xcf\x57\x8c\x3c\xdf\xd3\x04\xc7\x23" - "\xe4\xf9\x5c\xc8\xfe\xb5\xe1\x52\xcf\xff\x18\x0c\xe5\xe8\xa1\x6f" - "\x06\xe2\x15\xfa\x6e\xa0\x60\x1a\x03\x75\xf9\x55\x3e\xee\x57\x20" - "\xe6\xc2\x9a\x90\x0a\xb8\xeb\xf2\xba\xff\x99\x7d\xb3\xd6\xad\x1f" - "\x13\x80\x7f\x58\xff\x58\x8c\x57\xfe\x6e\xdd\x23\x7b\xd0\x26\x01" - "\x31\xa5\x5e\x75\xf3\x72\xf4\x73\x45\x33\x46\x89\x3a\xa9\x9b\x99" - "\x6d\x0d\xfa\x5b\x40\xbd\xa5\x98\xc6\xf6\xb2\x05\x18\x9b\x20\x77" - "\x96\xa0\x6f\x31\xd4\x53\xc2\x1a\x05\xed\xbd\x39\x0f\xe3\x9f\xbf" - "\xa6\x16\x8a\xe1\xaf\x04\xfe\xcc\xaf\xa1\xfe\x32\x8b\x3c\x2a\xe9" - "\x76\x7d\xd4\x15\xd6\xbf\x1c\x93\xac\xdf\xba\xb9\x0c\xca\xf2\xdf" - "\xbf\xbf\xea\x66\x9f\x7e\xae\x58\xfc\x52\xe4\x95\x36\x3c\x66\x32" - "\x09\x3c\xce\x31\xcc\x45\xe0\xf9\x06\xde\x06\x6b\x7e\x26\x3e\x13" - "\xf2\x9e\xd1\x0a\x83\x61\x2d\x39\x47\x02\x2c\x69\x0d\xa4\x58\x68" - "\x50\x9b\xda\x49\x60\x05\xac\xa7\x98\xbf\x18\x78\x07\xfd\x3c\xe4" - "\xa1\x06\x0e\x37\xb5\x8a\xe5\x15\xa5\x44\x66\xcc\xe5\xf1\x63\x91" - "\xf7\xc4\x35\x08\x70\x27\x98\xc5\x01\x9a\x87\xfc\xce\xc0\xb9\xf0" - "\x3b\x88\xc5\x0b\xde\xf1\xbb\xe2\x4b\xff\x95\x12\xd9\x11\x3e\xd6" - "\xd8\x7e\xe7\x70\xd3\xa5\xf0\x67\xb4\xce\x0d\x71\x26\xe7\xed\x0b" - "\x8b\x3a\x76\x44\x47\xba\xc2\xc7\xda\xe0\xdb\xb0\x3e\xe5\xab\x77" - "\x0b\x26\xf5\xee\xf4\x12\x35\x96\x7b\x30\xbd\x58\x7d\x20\xbd\x52" - "\x7d\x40\x38\xaa\x3e\x98\xbe\x13\xae\x45\x18\x13\x06\x78\xdc\x81" - "\xfb\x0f\xa4\x9b\x61\x7d\x1c\x88\x6b\xa9\x53\xd2\xa3\xd2\x47\x9c" - "\xa4\x62\xa7\x93\x1c\x49\x6e\x21\xb6\x90\x31\x79\xf0\x97\x6f\xeb" - "\x1f\x0f\x7f\xb3\x59\x7c\x50\x1a\x3e\x8d\xb5\x11\xcf\x58\x1d\x10" - "\x78\x9d\x45\x7a\x40\x99\xb7\x0c\x29\x14\xf0\x1c\x16\xf3\xff\x16" - "\xdc\xa8\xba\xc5\xca\x68\x63\x7a\xdb\x00\x32\x64\x1b\xb3\xd1\x56" - "\xf3\x78\x44\x92\x7f\x35\x29\x9e\x11\x8b\x61\xd4\x66\xc0\x3d\xf4" - "\xc1\x18\xc7\x68\x4b\x2b\x09\x83\x3f\x9d\x14\xa3\x66\x8b\xe8\xbb" - "\x3c\x37\x45\xd6\x5d\x88\x7a\x89\x30\x1e\x8f\xe6\x03\x03\xea\x30" - "\x18\xdf\x86\xbe\xd8\x50\x47\xb1\xc0\x80\xbe\x4e\xdd\x3a\x0a\x57" - "\x9b\x41\x0d\x72\x71\xa5\x28\x17\x9b\x51\x0e\x46\xb9\x1d\x65\x61" - "\xe4\x75\xe2\x53\xcd\xcc\x37\x2a\xf3\xdb\xb1\xfe\x4f\x36\xe4\x43" - "\xdb\xb2\x6f\x1d\x28\xc9\xbc\xc8\x5b\xb9\xd6\x8e\xd9\x06\x7f\x45" - "\x90\x1e\x65\x55\x1d\x2a\x90\xd2\xe9\x06\x0d\xca\x14\x01\x2e\x9a" - "\xf8\x60\x1b\x9e\x1f\xa2\x89\x0f\xb9\xd6\x3f\x0e\xf8\x3a\x3b\x13" - "\xd2\x46\xc0\xdf\xef\x5d\xeb\x35\x51\xf0\x17\x0d\x7f\x23\xe0\x2f" - "\x06\xfe\x46\xc2\xdf\x28\xf8\x9b\x08\x7f\x93\xe0\x2f\x0e\xfe\xa6" - "\xc0\x5f\x02\xfc\xcd\x10\xd6\x6b\xc6\xa2\xaf\x32\x28\xdb\x08\xe3" - "\x40\x27\x95\x2b\xd3\xfb\xd6\x8d\xd0\xfe\x18\xe4\xfb\x68\xbf\x03" - "\xc1\x14\xe6\x3b\xdd\x7e\x7f\x34\xab\x3f\xe2\xf2\xf6\x31\x3a\xdb" - "\x6d\x29\x7a\x5b\xff\x69\x7a\xdb\x6d\x0b\x73\x6c\x21\xe9\x3b\xe1" - "\xaf\x18\xfe\x4a\x6c\xeb\xe3\x8b\xa1\x4f\x73\x6c\xfd\x13\x62\xda" - "\xb2\x07\x11\xab\xea\x4e\xc2\xf5\x59\x83\x82\xe1\xb7\x5e\xfc\x0d" - "\x18\x7f\x7b\x0e\xfe\x86\x32\x40\xfe\x1f\x04\xb8\x31\x98\xc7\x26" - "\x08\x8f\x37\x8b\x67\x91\x32\x21\x3d\xc6\x1a\x78\xb7\x8d\xe7\x8b" - "\xcb\xc4\xfd\x27\x48\x9b\x24\xcd\x43\x85\xdf\xf4\xe7\x8c\xf1\x73" - "\xa7\xa5\xc6\x2f\x98\x33\xeb\xb9\x99\x0b\x1e\xd0\x0f\x99\xa1\x37" - "\xcc\x4a\x9a\x1f\x3f\x7f\xe1\xcc\x85\x33\x19\x0b\x09\x49\x77\x29" - "\xf6\x9f\xc2\xf0\xcc\x95\x73\xf7\x93\xc5\x02\xc8\x47\x15\x75\x0d" - "\xa4\x0f\xc8\x46\xcb\x9e\x25\xea\x32\xfb\x1e\x02\x72\x4c\xa4\xd0" - "\x33\xe6\xa1\x8a\x19\x56\xb2\xaf\xd1\xa6\x76\x02\x4f\x37\xd6\x66" - "\x86\xb9\xfa\x8c\xb6\x6f\x5d\x3c\xdd\xd7\xe8\x50\x8f\x6d\x32\x93" - "\x8c\xd3\xc0\xe3\xcd\x70\x90\x8e\x3b\xa3\x23\xf7\x35\x16\x03\x7f" - "\x0f\xbc\x5e\x66\x3b\x29\x73\x38\x61\x4c\x4f\x36\xe1\xbb\x14\x78" - "\x3d\xcc\x8f\xb2\x17\xfa\x51\x84\xbc\x36\xba\x61\xac\x11\xf3\x1f" - "\x80\xf4\xf1\x46\x33\x19\x07\x65\x75\x84\xc7\x99\x28\xcc\x37\xda" - "\x9a\x46\xcb\xea\xcc\xe4\xc0\xec\x62\xf5\x7e\x78\x1f\xf5\x79\x14" - "\xe6\x69\x07\xcc\x4f\x0a\xf3\x12\xdf\xc1\x67\xb5\x2a\xbd\x03\x9f" - "\xa3\x3c\xd5\x01\xf5\x7d\x17\xca\xcb\x58\x48\x02\x25\x99\x53\x31" - "\xef\x53\x34\xc0\x07\xeb\x67\xe2\xbc\xa7\x50\x57\x6c\xc7\x3b\xf0" - "\xee\xee\xd9\x0e\xf6\x3e\xc8\xa0\x01\x28\x7b\x22\xb6\x20\xa6\x58" - "\xd2\xb8\x0c\x5a\x2c\xa0\x7e\x25\x00\xdf\x7d\x1d\x9f\x81\x9c\x62" - "\x2f\x60\xb2\x8a\xbe\x46\x92\x0f\x5e\x15\xfd\x1c\xf5\xa9\x81\xf1" - "\x33\x95\x0c\x3a\xaf\x1a\xf4\x3a\xd2\x14\x69\x86\x7b\xc0\x1d\x3d" - "\x07\x25\x6c\x46\x1f\x49\xa1\x24\xa8\x63\xfd\xc2\xd4\xcd\x68\xa7" - "\x94\x7d\xdb\x40\x89\xe7\xb6\x87\x2d\x4c\xf5\xec\x4b\xde\x87\xfa" - "\x99\xf3\x70\x37\x63\x06\xdb\x36\x9c\xb6\x60\xc1\xc2\xb9\x33\xf5" - "\x33\xa7\x3d\x97\xa8\x67\x8f\xf5\x0b\x17\x40\x96\x59\xc9\x0b\xf4" - "\x2f\x2e\x9a\xa7\x9f\xbb\x60\x16\x4a\x0f\x33\x93\x92\x16\x1a\x93" - "\x7b\x13\xfe\xa6\x7e\xee\xc2\x39\xc9\xb3\x8c\xf0\x63\xc1\xcc\x79" - "\x33\xf4\x6c\x24\x2c\x80\xa2\xe6\xcc\xd1\x8b\x5f\x58\x90\x38\x2d" - "\x09\x07\xc7\xbc\xbf\x40\x26\x8f\xf7\x95\xb2\x45\x30\xfa\x91\xc2" - "\xf5\xe8\xbc\xea\xf6\x65\xa5\x81\x30\x8f\xf3\x16\xa6\xa2\xdd\x02" - "\xdc\xa7\x31\x79\x33\xfb\xb6\x08\xdc\xe3\x79\x2d\x94\x04\x36\x0f" - "\x19\xa3\x83\xb6\x39\xa4\xb6\xb1\xd8\xf1\xe8\xaf\x0d\x7d\x01\xaa" - "\x6e\x9f\xc5\xce\xcd\xc1\x1c\x61\x76\x2d\xd9\xb7\x3d\xc4\xf7\x44" - "\x6e\x37\x78\xf8\xaf\xb7\x33\xbf\x71\xaa\xdb\x1f\xe6\xfb\x23\xb7" - "\xa7\x21\xcf\x24\xfa\x3d\x56\xc1\x3b\x73\xf1\x1d\x61\xfd\xec\x1c" - "\x78\x2f\x41\x96\x5b\x6e\x8f\xc6\xfc\x2c\x5f\xf6\x6d\xaf\xd0\xfe" - "\xf1\xc5\x90\x36\x10\xeb\xe5\x63\xed\xd1\xb7\x42\xb9\x9f\x15\x13" - "\xf2\x9b\x30\x62\x68\x5d\x37\xde\xd0\x16\x3a\x66\x67\x7b\x16\xe9" - "\xd5\x0e\xeb\x9d\x43\x4d\x06\x5d\x82\x71\xb1\x78\x18\x09\x58\x36" - "\x8e\xa8\x8b\x61\xbc\xa1\xef\xec\xb2\x51\xf9\xc4\x92\x60\x25\x16" - "\xc7\x2e\x52\x66\xae\x25\xe5\xce\xb7\xb8\xdf\xed\x25\x28\x77\xdc" - "\x71\x1a\x7d\x41\x65\x2c\xa3\xae\x77\x3f\xb2\xf5\xd8\x0d\xe3\x51" - "\x9f\x44\x06\x59\x9c\xdf\x98\x2d\x69\xdb\x88\x25\xd5\x62\xc6\x73" - "\xf2\x40\xb7\xf2\x03\xf0\xec\x86\x32\x78\x6f\x3c\xe9\x05\xf7\x87" - "\xf0\x1b\x39\x1b\x68\xf5\xcb\xe1\xb4\xe6\xe5\x0d\xd4\xba\x2a\x9c" - "\xd6\xc1\x98\x6a\x58\x1d\x4e\x9b\x56\x63\xdc\x47\xdc\x3b\x80\xfa" - "\x18\x53\x88\xae\x51\x75\x47\x1c\xd3\x95\x8c\x64\xf7\x03\xe0\x9e" - "\xad\xff\x96\xd4\x0d\x78\x7f\x13\xdc\xa7\xf2\xfb\x42\xbc\xbf\x19" - "\xee\x73\xf8\xfd\xa7\x78\x3f\x10\xee\xf3\xf9\x7d\x05\x61\x67\xc6" - "\x55\x77\xec\xe4\xf7\x5f\xe2\x3d\xd0\xfe\x8e\x12\x73\x0a\xd6\xf7" - "\x14\xf4\xd9\x1d\x47\x32\xbe\x06\xf9\x35\xb5\x9e\xcd\x87\x83\xe9" - "\x89\xa8\xcb\x81\xf9\x70\xc7\x68\x1c\xef\x56\xd5\x1d\x0d\x3d\x23" - "\xf1\x7a\x7b\x93\xc6\x41\x7a\x01\x2f\xd9\x07\xda\xb3\x17\x69\xe7" - "\x95\xb7\xd9\x3d\x26\x7e\x82\x93\x9a\xe9\xf6\x68\x03\x5d\xff\x8c" - "\x89\x6e\x1f\x6e\xa4\x6c\xfd\x7b\x6c\x62\xf1\x12\x07\xf3\xf9\x09" - "\xfc\x3b\xcc\xa1\xc1\xcc\x5f\xaa\x0d\xf8\x61\x1f\x3e\x00\xb5\x74" - "\xfd\xe3\x26\x90\x33\x75\xe3\x0c\x4e\xb4\x31\x04\x19\x60\xf0\xde" - "\x23\x89\xc8\x4f\x4c\x0b\x10\xb6\x0d\x37\x0a\x19\x71\x84\x0e\x8e" - "\x36\x8c\x4b\xa4\x66\x58\xdb\x54\x5c\xc7\x4e\xbf\xc1\xf8\xd7\xec" - "\xbb\x43\xa2\x0d\xc2\xa2\x44\x8c\xfd\xc1\xf0\x25\x1d\xd7\xf9\x14" - "\xc0\x83\xa5\x71\x1a\xd7\xfa\x69\xe4\x48\xe2\x19\xff\xe2\xe8\xa8" - "\x06\xfb\x8c\x95\x81\x75\x72\xd1\x38\xe2\x84\xef\x38\xa1\xad\xc8" - "\x53\xec\x06\xde\x01\x78\x1b\xc3\x3b\xd3\xab\x7b\xd0\x45\x71\x1a" - "\x68\xd3\x30\x8b\xa1\x85\x54\xb4\xe3\x5c\x19\x92\x7a\x04\x7a\xf1" - "\xd1\x54\xa7\x59\x63\x63\xbe\x4a\xb5\xc6\xd9\xe4\x56\xda\xff\x71" - "\x53\xa3\x6a\xc8\xd1\xf1\x69\xd0\x06\x68\xfb\x81\xda\xea\x40\x01" - "\xda\x71\x0f\xa7\x1b\xbe\xb7\x0b\x68\xab\x93\xe4\x1e\xff\xea\x3f" - "\x84\x8d\x1b\x61\x41\x1c\xc1\x73\x80\xef\xa6\x43\xfd\x3a\xe2\x34" - "\x02\xac\x51\xf8\xec\x88\xe1\x1c\xc1\x6f\x72\x5a\x0f\x61\xbe\x71" - "\xe8\x60\xa0\x33\x7c\x1f\x7d\xa4\x4a\x74\x85\xbc\xbb\x5c\x1d\x89" - "\xde\xfb\x7f\x43\x42\x25\xd4\x0f\xfa\x4e\xe3\xdd\xc7\xed\x86\x7e" - "\x94\x8f\x8f\xfb\x47\xc1\x5f\x1c\x7d\x7d\xa1\xc9\x36\xe4\xfe\x44" - "\x16\xb3\x6d\x43\x1c\xf1\x88\xcd\x0d\x63\xe4\xce\xd1\x18\x9b\xdb" - "\xbb\x0f\xaf\xed\x06\x16\x13\xa7\xc7\x37\x54\x83\xb1\xe7\xd3\x5a" - "\xd0\xdf\xae\xe1\x88\xc1\xee\x67\x9f\xde\xb9\xca\x57\x9f\x62\xf9" - "\x8f\xde\x45\x3b\xfc\x2c\xaf\xc6\xe7\x18\xd9\x06\x74\x09\xd3\xe8" - "\xdb\xe9\x48\x15\x97\x4d\x0c\x8b\x91\x56\x1d\x20\x57\x2c\xf9\x82" - "\xa8\xdb\x61\xdd\x7c\xfb\xe9\x22\x75\x04\xcc\x3b\xe0\x5f\x32\xcb" - "\xaa\xcb\xc8\x84\x19\x24\xa3\xbc\xe9\x22\xfa\x29\x66\xb1\x6e\x68" - "\xf8\xd4\xca\x5d\x4f\xdb\xd4\xe8\xab\x1f\x63\xdb\x54\xd8\x41\x8e" - "\xdf\x10\x6f\x7e\xf7\x69\x87\xda\xb5\x28\x4e\x8f\x7e\xda\x71\xaf" - "\x38\xbd\x89\x0a\x6c\xcf\xab\x19\x78\xc5\x66\x90\xd7\x4d\xb1\xa3" - "\xca\x12\x8e\xb2\x18\x9c\xe8\xe7\xa3\x3c\xb1\x85\x7c\xb6\xf2\x00" - "\x29\xab\xae\xc6\x73\x84\xaf\x97\xd5\xed\x23\x42\xb3\xa1\x9f\x6b" - "\x81\x21\xb4\x20\x89\x84\xc1\x3c\xbd\x41\x00\x1a\xd3\x05\x62\x6c" - "\xc3\x8b\x72\x6c\x43\x8c\x1d\x5e\x80\x71\x0a\xcf\x69\x89\xb3\xe7" - "\x9d\x46\xc8\x1f\x88\x71\x0c\xb7\x5c\x24\x86\xcd\x49\x64\xf0\x66" - "\x78\xa6\xd8\xf3\x7a\x01\xf8\xc9\xd9\x24\xa8\x5f\x0b\x8f\x63\x8e" - "\xf1\xd8\xa5\x38\x86\xe3\x5b\xf4\x64\xdf\x97\x45\x6a\x1c\x7b\xfe" - "\xd1\xd9\xc0\x62\x0b\x38\xc3\x13\x2a\x9d\xfd\x35\x7a\xe7\x90\x68" - "\xad\x55\xf5\x1f\x23\xa0\xbf\xbc\xca\x66\x12\xed\x3b\x32\x24\xda" - "\xff\x5a\x25\xd1\x7e\xe9\x64\xa2\xbe\xb4\x23\xda\xf6\xd6\xc9\x7c" - "\x99\xf6\x55\x97\xd3\xbe\x33\xcd\x77\x3f\xe3\x50\xb3\xfe\x78\x06" - "\x78\xa0\x1d\xf7\x67\xbe\xf5\x0c\xef\x03\xca\xfa\x20\x41\xee\x83" - "\x0e\xe8\x83\x0e\xb9\x0f\xd2\xe7\x4b\x7d\x70\x86\xf7\x41\x15\xeb" - "\x83\x69\xac\x0f\x3a\xa0\x0f\x96\x1a\x42\x37\x2d\x21\x61\x05\x4b" - "\x88\x8e\xf5\x83\x76\x3b\xc6\x6c\xe8\xbd\x7a\x09\xf4\x43\x3b\xf4" - "\x83\xc3\xdd\x0f\x61\x8a\x7e\x58\x22\xf6\x43\x3b\x31\x6c\x6a\x27" - "\x83\x37\x65\xf1\x7e\x40\x5c\x1f\x6f\xd7\x50\xe1\x7b\x03\x29\x6c" - "\x84\x7e\x98\x2f\xf6\x43\x88\xd8\x0f\x4b\xa1\x1f\xe6\x43\x3f\x40" - "\xfb\x8f\x18\xfc\xc5\xc4\xbb\xca\x2e\xef\x07\x43\x49\x77\xfd\xd0" - "\xee\xee\x87\xdf\x6c\x61\xfd\x00\xbc\xd4\x92\x27\x50\x57\x17\x6d" - "\x7b\xf3\x84\x49\x1d\x11\x07\xd8\x03\x34\x2d\x1b\x5b\x4a\x26\x24" - "\x90\x0c\x27\xf4\xc9\x5b\x27\x1c\xea\xb2\x3a\xe8\x8f\x19\x94\xeb" - "\x21\x3c\xfa\x83\xd1\x7d\xc3\xd4\xca\xb7\x21\x8f\xfe\x69\x9c\x27" - "\xf1\xe6\x77\x4e\x00\xef\xe8\x25\x26\x94\xe7\x5e\x30\x94\x25\x60" - "\x3c\x60\xb4\xbb\x03\xf9\xaa\xdf\x26\x90\x9f\xca\x13\xbf\x26\xd2" - "\x9e\xf0\x67\x35\x66\x28\xdb\x10\xfa\x59\xe0\x07\xe4\x78\xd9\x51" - "\x3c\x2b\x7e\xdb\x66\x81\x84\x1d\xaf\xda\x83\x7c\x81\x16\xc6\xf8" - "\x0d\x2e\xe8\x1f\x57\x9b\xae\xf7\x2a\x90\xb1\x70\xaf\xd8\x73\x8f" - "\x18\x63\x79\x52\xe8\x1b\x48\x0f\x74\x42\xdf\x14\xb4\x12\xc3\xc6" - "\x56\x32\x78\xa3\xd8\x37\xee\x18\x9f\xdf\x1a\xc8\x96\x5a\x12\xd4" - "\x77\x16\xef\x1b\x97\xd4\x37\x8b\x0c\xea\x71\xb3\xf4\xe4\x23\xa0" - "\xc9\x11\xc3\x17\x7e\xf6\xcd\x6f\x18\xdf\x40\xa1\x6f\x28\xf4\x0d" - "\x65\x7d\xf3\xeb\x18\x5f\x7d\xe3\xda\x76\xff\x28\x97\x76\x8c\x09" - "\x7d\x53\x0b\x2f\x4e\x52\x09\x20\x3f\xb5\x83\xdc\xfa\x99\xcd\x49" - "\xd2\x40\x6e\x58\xf2\x35\xe9\x69\x99\x74\x82\x58\xac\x25\x04\x7d" - "\xc1\xa2\xde\x1b\xfd\xbd\x5b\x9c\x25\x40\xef\x17\xd8\xfd\x16\x76" - "\x6f\x23\x4b\x9f\x25\x01\x2c\x66\x5c\x5c\x11\x59\x05\x7c\xf5\x3b" - "\xcf\x14\xa9\x85\xbc\xc7\x1b\xa8\x36\x12\xe3\x6c\x9b\xf1\xdc\x12" - "\x60\x51\x70\x79\x62\x19\xfa\x7d\xfb\x26\x23\x95\x9e\xae\xb0\x43" - "\x99\x36\xda\xee\x82\xb5\xa1\x30\x8b\x96\xa0\xef\xee\x7b\x52\x19" - "\xcf\x0d\xe3\x24\x62\x31\xf2\x1c\xa8\xff\x33\xa7\x6f\x02\x1e\x2b" - "\x62\x19\xb6\x0d\xd2\x54\xe5\xb3\xed\xf0\xfc\x9e\x73\x58\x2f\xae" - "\x8b\xe7\xd7\x7b\x30\xb6\x56\xf8\x0b\xb1\xfb\xd3\x6d\x81\x26\x90" - "\x87\x81\x17\xc3\x72\x8e\x51\x2e\x1b\x26\x5a\xaa\x1c\x4c\x0f\x6b" - "\xcb\x48\xec\x69\x5a\x82\xf1\x96\xd0\x0f\x38\xae\xcd\xf7\x6c\xc1" - "\x78\x98\x74\x1b\xac\x4b\xe1\x71\xa4\x78\xba\x4d\x2d\xaf\xbf\x11" - "\x76\x58\xb7\x12\x1f\x35\xd0\x0c\xf4\x97\x7e\x00\xda\x85\xf2\xcf" - "\x5b\xb5\x0e\xb5\x03\x30\xe4\xed\xe9\x39\x6a\xd4\x13\x39\x60\xfc" - "\x95\x7d\xf9\x37\x66\x33\x5d\xaf\xba\xbb\xc7\xf1\x38\x27\xc1\xef" - "\x3f\x75\x17\xee\xb5\x0c\x8d\xbe\xa4\xfe\x40\x7f\xa9\xe7\x9d\x65" - "\x19\x75\x72\x0c\x33\xcf\x58\x65\x38\x96\xdf\x99\x0e\x65\x42\x39" - "\xbb\x6b\x33\xd5\x54\xc2\xf5\x16\xb4\xb3\x57\x62\x4a\x79\xd3\x39" - "\x92\x0e\xe3\xb8\x3c\xb1\x88\xf9\xb4\xef\x07\x78\x2e\x2c\x05\x1c" - "\xe9\x30\x84\x6e\x01\x1c\xc1\xf9\x5f\x08\xb8\x21\x2c\xd5\xf5\xce" - "\x6d\x27\x11\x12\x7e\x20\x8f\x85\xd7\x67\x61\x8c\x6a\x8e\x42\x1a" - "\xf4\x93\xb0\x16\xc6\x28\xe0\xc7\xe6\x25\x1c\xc7\xb7\x20\x7e\x00" - "\xff\x3b\xde\x08\xf8\xb1\x08\xf0\x23\x85\xc5\x98\xd4\x15\xaa\x39" - "\x6e\x7c\x54\x9b\xa3\x36\x49\xf1\x70\x19\x7d\xef\xde\x58\x81\xe3" - "\x23\x21\x93\x9d\x4b\x73\xa1\xdf\xf9\xa5\x71\x01\x15\x76\x18\x23" - "\x1b\x66\xdb\x30\x8d\xe1\xe7\xa2\xc4\xde\x02\x1f\x6b\x31\x48\x93" - "\xad\xe7\x49\x24\x8b\xb7\x76\x41\xd7\x7b\xcd\x3c\x12\x51\x78\x9e" - "\x0c\x2e\x9c\x47\x0c\x30\x5f\xd5\x85\x50\x87\xa9\xf3\xb5\x84\xf9" - "\x8e\xef\x79\x67\x15\xa4\x7b\xf5\x1d\x0f\xfc\xb3\xae\x10\xe7\xcc" - "\x8b\x06\x77\x9d\x9c\xa6\x4c\xb3\x0b\x68\xc7\xfc\x1e\xa9\xee\xe6" - "\x31\xc0\xb4\xbf\x8d\xe1\xfc\xfc\x3d\x62\xbc\x8e\xe8\x91\x20\x93" - "\xf4\x6a\x54\xdd\xfd\x15\x5d\x17\x13\x6d\x5c\x42\x54\x8d\xd2\x33" - "\xe0\x31\x05\xe8\xab\xbb\x33\x49\xa6\x10\xf2\xf6\x28\x4b\x2a\xf0" - "\x48\x19\x89\x7e\xce\xc3\xbb\x59\x0c\x2d\x97\x29\xb3\x14\xdb\x2b" - "\xac\xcb\x2c\xdb\xda\x48\x22\xe9\x0b\xd0\x1f\xb3\xa1\xad\x8d\x64" - "\x70\x41\x23\xb4\x75\x11\x6f\xab\x14\xff\x57\xc8\xfa\xc0\x00\xcf" - "\xbc\xeb\x66\xa4\x58\x72\x2f\x60\x2c\xb9\x48\x2d\x60\xd8\x8d\xf4" - "\x76\x42\xca\x9b\x98\xef\x8a\x36\x8b\xf3\x6b\x82\xdf\x45\xdd\x91" - "\xe5\x22\x1b\xd3\xe5\x38\x96\x85\xa2\x85\xa6\xf8\x1a\x18\xdb\x6d" - "\x89\x84\xc2\xef\x03\xb5\x36\xf4\x15\xc1\x78\x3b\xab\x2a\xc2\x89" - "\xfc\xd8\x41\x48\xc3\xb1\xef\x31\xe6\x9d\x38\xe6\xf1\x39\x1b\xf7" - "\xf0\x9e\xa5\xe6\x0c\xc1\xf2\x3c\xcb\xc1\xfe\x97\xca\xaa\x57\x45" - "\xbe\x87\x65\xe1\x58\x40\x1d\x0f\xce\x35\xde\xf7\x25\x68\x43\xae" - "\xa3\xe1\xe3\x8c\xfc\xde\x86\x76\x21\x5a\x1c\x03\x6c\xac\xc0\xba" - "\x8a\x3e\x49\x29\x8d\x0b\x80\x71\x86\xf5\xec\x0d\xfd\x1d\x29\x8d" - "\x0b\x48\x0b\xeb\x3c\x36\xfa\x2d\xd7\xa2\xec\x12\x86\xbf\xaf\x74" - "\x7c\xf8\xd7\x7f\x91\x3e\xcf\xff\x09\x83\x81\x8f\x05\xbc\x44\xdc" - "\x74\x35\x7b\x60\x66\x13\xc7\x4c\xc4\x24\x09\x37\x19\x36\x31\xff" - "\xe0\x25\x68\x4b\x9b\xc8\xea\xe8\x27\x6e\x96\x37\xc9\xb8\x39\xde" - "\xe8\x81\x9b\x4d\xb4\x5d\x18\xe2\x0d\x37\x87\xbd\xa7\xc4\xcd\x61" - "\xef\x2b\x71\xf3\xbe\x01\x9d\x71\xf3\x72\xcc\x1c\xd6\xe2\x0d\x2f" - "\x41\x5e\x19\xd4\xa8\x8a\x3a\xea\x1b\x2b\xef\xd5\xfb\x8f\x95\xbf" - "\x1d\xa6\xc4\xca\x7b\x67\xfc\xbf\x8b\x95\xbf\x3d\xa2\xc0\x4a\xed" - "\x15\x62\x65\x23\xc3\xca\x30\xfa\x3d\xcc\x09\x11\x3f\x0a\x67\xfb" - "\xc0\xca\xd9\xdd\xcc\x85\x17\x7c\x61\x65\xd4\x2d\x4a\xac\x8c\x9a" - "\xa8\xc4\xca\xa8\x1e\x32\x56\x8a\xcf\xae\x0a\x56\x46\x0d\xbc\x3e" - "\x58\x19\x35\x90\x61\xe5\x79\xc4\xca\xa8\x4b\xdd\x63\xe5\xbd\x06" - "\xef\x58\x09\xe9\x0c\x2b\xef\x35\xc8\x58\xf9\x75\x37\x58\x79\xdf" - "\xd7\x7e\x60\x65\x18\xc3\x4a\xad\x0f\xac\x9c\x0d\xb4\x12\xc7\x05" - "\x1b\x7b\x9d\xc6\x86\x88\x95\x3a\x37\x56\x5e\xc1\xf8\xf0\xaf\xff" - "\xee\xf3\x29\xff\x22\x56\x0a\x26\xce\x5f\x22\x56\xd2\x70\x11\x2b" - "\xe7\x38\xc9\x92\xaf\x00\x23\xab\x1a\x59\x1c\x01\x66\x03\x0c\x7f" - "\x69\x93\x11\x8b\x26\x6b\x77\x03\xbd\x2c\xd6\x62\x86\x4d\xcc\x06" - "\x76\x2c\x62\x55\x31\xe4\xcd\x77\xf3\x9d\x0c\x3b\xbf\x12\xb1\x73" - "\x8a\x88\x9d\x53\x7f\x02\x76\x3e\x83\x7d\xf9\xbb\x73\x97\xd4\x12" - "\x76\xae\x03\xec\xfc\x1d\xe3\x1f\x70\x5f\x97\x63\xe7\x03\xb3\xa4" - "\x7a\xa1\xee\xd2\x92\xbc\x89\xf0\x7a\x5d\xbc\x1c\x47\xc7\x60\x79" - "\xf7\x3f\x6c\x9e\xdd\x44\xdc\x58\x3a\x45\xc6\x52\x28\x6b\x80\x6f" - "\x1c\x85\x34\x09\x47\xb3\x00\x47\x4f\x79\xe0\x28\xea\x0c\x10\xf3" - "\x00\x47\xdb\x18\x8e\x7e\x24\xe2\x68\xf4\xe2\xe3\x53\x00\x47\xc7" - "\x48\x38\x7a\xff\x2e\x47\xd6\x07\x7a\x47\x76\xf7\x38\xda\xc6\x70" - "\xd4\x78\xed\x71\xb4\xb4\x13\x8e\x82\xcc\x8a\xf1\x73\xbd\xe2\xa8" - "\x34\x1e\x19\x8e\x66\xca\x38\xca\xe8\x3a\xbc\x7f\x45\x02\xd0\x3d" - "\xc1\xc8\xe4\x36\x37\x8e\x1a\x8b\x39\x8e\x42\x1a\xb3\x77\x58\x00" - "\x38\x0a\xe3\x2f\xa3\x1c\x7d\x60\x91\x18\xa8\xa3\x16\xf1\x75\x2b" - "\xcc\x19\xa4\x91\x1b\x4f\x67\xc3\x9c\x41\x8c\x69\x86\x39\x03\x38" - "\x3a\xb5\x45\x4b\xd8\x7c\xc9\x86\xf9\xd2\xe8\x23\x6e\x91\x64\xcf" - "\xeb\x13\x4f\x87\xcf\x55\xe2\xe9\xf0\x22\x25\x9e\x0e\x7f\x4a\xc6" - "\x53\xf1\x19\xe2\x29\xf4\x19\xd0\x67\x14\x62\xea\x8f\xc3\xd3\xe1" - "\x73\xdc\x78\xaa\x16\xf1\x74\x76\xf7\x78\xca\xf6\x05\x7d\xe0\xa9" - "\x27\x36\xf8\xc6\xd3\xe1\x73\x64\x3c\x7d\x60\xb4\x1b\x4f\xab\x7d" - "\xe1\xe9\xfd\x46\xef\x78\x0a\xe9\x0c\x4f\xef\x37\xba\xf1\xb4\xda" - "\x0b\x9e\x8e\xf1\xc4\xd3\xff\x1c\xce\xf1\xb4\x98\xfb\xc6\x00\x4c" - "\xad\xb0\xc3\xf8\xc0\x39\x97\x9c\xcf\x30\x55\x00\x4c\x05\x2c\x50" - "\x63\x3c\x14\xb4\xbd\xf7\x86\xa9\x1c\x73\xad\xf8\x9d\xde\x38\x37" - "\x33\xc6\x81\xbc\x0b\x6b\x11\xd0\x84\xad\xbd\x12\xfd\xb6\x7a\xe0" - "\x6b\xfc\x62\x2d\xf2\x76\x8a\xb1\x22\x48\x63\xa5\xd9\x80\x36\xc6" - "\x8a\xb1\xe2\x5f\x5f\xfe\x67\xb4\x2f\x6c\xf5\x25\xbb\x1f\x47\xd9" - "\xfd\x29\xa2\x5e\xfa\x14\xe0\x6b\x1c\xca\xee\x3b\x3b\xc9\xee\x3b" - "\x2f\x97\xdd\xbf\xe8\x1a\x47\xfd\x92\xdd\x9f\xc6\x3e\x1c\x71\x9f" - "\x12\x47\x47\x0c\x57\xe2\xe8\x43\xef\x63\xbd\x38\x8e\xef\xf4\x2e" - "\xbb\xb3\x79\x3e\xe2\x25\xb7\xec\x5e\xad\xc4\x4f\x59\x76\x7f\x68" - "\xa6\x6f\x1c\x1d\x51\xac\xe0\x47\xa7\x8a\x38\x3a\x5d\xc4\xd1\xe9" - "\x32\x8e\x7e\x76\x42\xe2\x47\x7f\x5f\x7e\xac\xda\x13\x47\x47\xd8" - "\xdd\x38\x5a\x73\x39\x8e\x4a\x18\xca\xe2\x8d\x43\x39\xa8\xc3\xda" - "\x05\x38\xfd\xee\x74\x23\xd3\x45\xa1\x5e\x10\x75\xb0\x6e\x1d\x54" - "\x9b\x84\xa7\x2d\x24\x7d\x0a\xe2\x69\x3e\xc3\x53\x8d\x8a\x4c\x03" - "\xec\xeb\x27\xc5\x23\xdf\x92\x42\x74\x38\x17\x51\xbf\x24\x2c\xe2" - "\x71\xd5\x24\x3d\x13\xb4\x97\xed\xe5\x3f\xfb\xb5\x88\xa9\x18\x9b" - "\x36\x84\xc5\x24\x37\x6c\x4e\xf1\xc2\x9b\x2e\x05\x4c\x5d\xe2\xc1" - "\x9b\xc2\xdc\xff\x68\x7a\x67\x4c\x7d\x70\x5a\x05\x8e\x15\xc4\x54" - "\x85\x1c\xbf\xf3\x17\x20\xc7\x3f\xb8\x57\x89\xa5\x0f\x36\x29\xb1" - "\xf4\xc1\xd7\x65\x2c\x15\x9f\x5d\x15\xde\xf4\xc1\x92\xeb\xc3\x9b" - "\x3e\x58\x22\xcb\xf1\x0f\xad\x77\x63\x69\x95\x2f\x2c\x1d\x51\xe2" - "\x1d\x4b\x21\x9d\x61\xe9\x88\x12\x37\x96\x56\x79\x91\xe3\x15\x58" - "\x1a\xb3\x98\x63\xe9\x4e\xce\x9b\x56\x4b\xbc\xe9\xce\x7f\x41\x39" - "\x3e\x26\xd5\x5f\x39\xfe\x78\x13\xc7\x4f\xc4\x27\x09\x43\x65\x39" - "\x7e\xa7\x6f\x39\xbe\x1b\x0c\xf5\x8b\x17\x65\x18\xfa\xf0\x62\x25" - "\x86\x3e\xbc\x4c\x89\xa1\x23\xcf\x75\xc6\xd0\xcb\xf1\xf3\xe1\xfd" - "\xde\xb0\x93\xcb\xf1\x23\x0b\x7c\xe3\xe6\xc3\x0d\xfe\xe3\x66\x6c" - "\x0f\x25\x6e\x3e\x12\xf1\xef\x81\x9b\xb1\x1b\x15\xb8\xa9\xbd\x42" - "\xdc\xfc\x59\x64\xfa\xd8\x4e\xfa\xcf\x91\x9d\xf4\x9f\xb1\x1e\xfa" - "\xcf\x91\x57\x51\xff\x19\x7b\x9d\xf4\x9f\xb1\x36\x99\x07\x1d\x59" - "\xde\x3d\x6e\x3e\x6c\xf3\x8e\x9b\x90\xce\x70\xf3\x61\x9b\x8c\x9b" - "\xdd\xf1\xa0\x8f\xbe\xe7\x07\x6e\xfe\xc2\x65\xfa\x47\xbb\xd4\x7f" - "\x7a\x93\xe9\x11\x37\x19\x5e\x56\x77\x92\xe9\x9f\xf2\x94\xe9\x77" - "\xca\x32\xfd\x28\x8e\x5b\x16\xa7\x49\x29\xd3\x5f\x75\x1c\xfd\xc3" - "\x21\x87\x5b\x1f\xfa\x0a\xe0\xe8\x1f\x98\x6f\x74\x87\x5b\x1f\x3a" - "\x66\xb4\x54\x2f\x2e\xd3\xaf\x23\xbc\x5e\x5e\x64\x7a\x66\x3b\xfc" - "\x58\x7f\xb7\x4c\x5f\xdd\x59\xa6\x1f\x7d\xc9\x37\xa6\x3e\x36\xc2" - "\xab\x4c\x8f\xf2\x37\xc3\x54\x23\xc3\xd4\xd6\x0d\x9e\x98\x3a\x6a" - "\x32\xc3\xd4\x3f\x48\x98\xfa\x58\xa6\x03\xe6\xa6\xa3\x67\xf7\x98" - "\x8a\xe5\xc8\x98\x9a\xf8\xf3\x60\xaa\xf9\xca\x31\xd5\xf3\x3c\xec" - "\x47\xd0\x76\x37\xa6\x32\x1a\x8f\x6a\xa9\x48\x40\x4c\x4d\xec\x24" - "\xdf\xef\xf4\x2e\xdf\x1f\x23\x6a\xa4\x8f\x24\xdf\x63\x1f\x30\xbc" - "\xb9\xa6\xf2\xfd\xe8\x71\x4a\x6c\x1d\x9d\xa9\xc4\xd6\xd1\xf7\xc9" - "\xd8\x2a\x3e\xbb\x2a\xf2\xfd\xe8\xb1\xd7\x47\xbe\x1f\x3d\x56\xc6" - "\xd6\x31\x77\x75\x8f\xad\x8f\x8d\xf4\x8e\xad\x90\xce\xb0\xf5\xb1" - "\x91\x5d\x62\xeb\x1f\x3c\xb1\xf5\xf1\x01\x12\xb6\xca\xf2\x3d\x8c" - "\x0f\x9c\x7f\xc9\xa6\x1f\x2f\xdf\x8f\xbe\xde\xf2\xfd\xe3\x3a\xbf" - "\xe4\xfb\x0d\x80\xb3\x20\x8b\x2f\xfd\x1c\xe4\xfb\x27\x44\xf9\xbe" - "\xa6\xa8\x93\x7c\x5f\x74\x99\x7c\x9f\xf6\x84\x88\xa9\x30\xa7\x18" - "\xa6\x4e\xdf\xf9\xe3\xe5\xfb\x27\xb1\x0f\xc7\xf6\x57\x62\xea\xd8" - "\x01\x4a\x4c\x9d\xf0\x26\xd6\x8b\x63\x7a\x91\x77\xf9\x9e\xcd\xf3" - "\xb1\x33\x15\xf2\x3d\xd4\xef\x72\xf9\x7e\xc2\x64\x05\xa6\x4e\xf5" - "\xc4\xd4\xb1\x26\x05\x9f\x0a\xed\x42\x4c\x7d\xf3\x14\xc7\xd4\xb7" - "\x4e\x79\x60\xea\xf8\xb7\x44\x4c\x1d\x77\xe8\xd8\x24\x4f\x4c\x1d" - "\x5b\x25\x61\x2a\xc3\xcb\xa9\x0e\x75\x46\x9c\x6f\x7b\x93\x5d\x50" - "\x36\x9e\x15\xc3\x32\xdf\x39\x95\xd8\xbd\xbd\x49\x9c\xd2\xde\xc4" - "\x6d\x6b\x92\x6c\x25\x65\x75\x26\x66\x6b\x52\x90\x42\xc2\x34\xcb" - "\xc9\x6d\x05\xed\xdc\x0f\x01\xf3\x81\xd8\xea\xdd\x07\xc1\xb3\x93" - "\x65\x9c\x45\x3f\x04\x80\xb1\x86\x4d\xad\xdc\xf6\x07\xfa\xfb\x72" - "\xbf\x03\x12\xdf\x04\x78\xb0\xf7\x54\x67\x9c\x1d\xff\x54\x05\x8e" - "\x9f\x29\x89\x9d\x64\xfe\xa2\x5f\x80\xcc\x3f\xfe\x1d\x25\xbe\x8e" - "\xb7\x2a\xf1\x75\xfc\x7a\x19\x5f\xc5\x67\x57\x85\x77\x1d\xbf\xeb" - "\xfa\xf0\xae\xe3\x77\xc9\x32\xff\x84\x97\xdd\xf8\x5a\xe9\x81\xaf" - "\xa7\x3c\xf1\x75\x6c\x3e\xc3\xd7\x53\x9d\xf1\x15\xd2\x19\xbe\x8e" - "\xcd\x77\xe3\x6b\x65\x27\x99\xff\x54\x67\x7c\x9d\x38\x97\xe1\x6b" - "\x4d\x51\x27\xde\xb5\xa8\x7b\x99\xbf\xe6\x97\x26\xf3\x4f\x9c\xe3" - "\x97\xcc\x8f\x98\x3a\x87\x63\x2a\x62\x96\x84\xab\xb2\xcc\x5f\xe4" - "\x53\xe6\xef\x0e\x57\xfd\xe2\x55\x19\xae\x3e\x31\x57\x89\xab\x4f" - "\xcc\x57\xe2\xea\xa4\x96\xce\xb8\x7a\x39\xa6\x3e\xf1\x9e\x37\x3c" - "\xe5\x32\xff\xa4\x6d\xbe\xb1\xf4\x89\x1a\xff\xb1\xf4\x8f\x7d\x95" - "\x58\xfa\xa4\xfe\xdf\x17\x4b\xff\xf8\xba\x02\x4b\xb5\x57\x88\xa5" - "\x3f\x8b\x1e\xe0\x8f\x97\x94\x58\x3a\x29\x42\x89\xa5\x7f\x3c\x2d" - "\x63\xa9\xf8\xec\xaa\x60\xe9\x1f\x1d\xd7\x07\x4b\xff\xe8\x90\x79" - "\xd5\x49\x5f\x74\x8f\xa5\x4f\xd4\x79\xc7\x52\x48\x67\x58\xfa\x44" - "\x9d\x8c\xa5\x5f\x77\x83\xa5\x4f\xed\xf5\x03\x4b\x95\x7a\x80\xce" - "\x58\x7a\xdd\xf5\x00\x4f\xf9\x3c\xff\xe0\x55\x0f\x20\x61\xe9\x13" - "\x97\xeb\x01\x10\x5f\x99\x1e\x00\xe8\x25\x61\x18\xd3\x03\x8c\xe4" - "\x58\x66\x71\xe6\x28\xf4\x00\x57\x1f\x5b\x9f\x3e\xe6\x70\xeb\x53" - "\xb3\x00\x5b\x9f\x66\x71\xc3\x1c\x6e\x7d\xea\x33\x33\xa5\x7a\x71" - "\x3d\xc0\x2b\x84\xd7\xcb\x8b\x1e\xe0\x11\x2c\xef\x4f\xb7\x28\xf4" - "\x00\x1e\x58\x0b\x65\xf5\xf7\x8d\xb3\x7f\x1a\xa9\xd0\x03\xd4\xca" - "\x38\xdb\x8a\x36\xe9\x80\x83\x0c\x67\xc3\x3d\x71\x36\x6e\x21\xc3" - "\xd9\x47\x24\x9c\xfd\x53\x4e\x1b\xcc\xcd\x36\x7f\x71\x16\x6d\xa4" - "\x4f\x25\x5c\x1f\x9c\x2d\xf1\x03\x67\x3d\x74\x03\x7b\x81\x1e\x6e" - "\x9c\x65\x74\x9f\x1c\x52\x31\x05\x71\x36\xa1\x93\x6e\xa0\xc8\xbb" - "\x6e\xe0\xc8\xf5\xd0\x0d\x4c\x9e\xa5\xc4\xdb\xc9\x05\x4a\xbc\x9d" - "\xfc\x84\x8c\xb7\xe2\xb3\xab\xa2\x1b\x98\x9c\x78\x7d\x74\x03\x93" - "\x13\x65\xbc\x7d\xe6\xd1\xee\xf1\xf6\x4f\x63\xbd\xe3\x2d\xa4\x33" - "\xbc\xfd\xd3\xd8\x2e\xf1\xf6\x11\x4f\xbc\xfd\xf3\x7d\x12\xde\xca" - "\xba\x81\x22\x51\x37\x90\xd3\xbd\x6e\xa0\xc6\x87\x6e\xe0\xd1\xeb" - "\xad\x1b\xf8\x73\x94\x3f\xba\x81\x4b\x1b\xb8\xdd\xfe\x52\xb4\xdb" - "\x7f\x16\xf0\x77\xe2\x09\xa0\x41\xf7\x76\xfb\x69\x92\xfd\x69\x42" - "\xbe\x88\xb3\xf9\x5e\x75\x03\xc7\x1b\x7c\xeb\x06\x8e\x57\x79\xda" - "\x9f\x4e\x19\xa6\xdc\xb7\x9a\x72\x9f\xb4\x6f\x75\xfc\x4b\xc4\xd9" - "\x04\xe6\xc7\x4f\xc8\x4b\x88\xe1\xfe\x0d\x13\x46\x60\x3d\xbd\xd9" - "\xf1\x7f\x24\x78\xee\x65\x4d\x59\xeb\xd6\x15\x54\x22\xde\xe6\x13" - "\x81\x26\xf6\x44\xbf\xe0\x4c\x57\xf0\x34\x8e\xbd\xf8\x73\x9e\xb8" - "\x7b\xe0\xa4\x27\xee\x4e\xd9\x27\xe1\xae\x0b\x70\x77\x7f\x6d\x3e" - "\xd7\xbf\x3e\xc3\x6d\x53\x77\x3d\xe3\x61\x9b\x7a\xe2\x13\x11\x77" - "\x9f\xdd\x7b\xcc\x0a\xed\xef\xca\x7e\x0a\xde\xdf\x7d\xf2\x4a\x6d" - "\x50\xf3\xbd\xda\x4e\x89\xf8\xe4\xd5\x7e\x0a\xea\xaa\xdd\x22\xce" - "\x55\x17\xcc\xd3\x2d\x1e\xf6\x53\x05\x4b\x60\x3e\x8b\x67\xaf\xba" - "\xb4\x43\x7d\x46\xb6\x43\xa5\x79\xf1\x69\xb8\xbe\x09\xeb\x13\x62" - "\xda\x69\x62\x00\x0d\x8b\x4f\xc3\xef\x77\x74\xc0\xba\x13\x1b\x17" - "\x20\xca\x75\x09\x80\x3d\xfd\x38\xdd\x9f\xb5\xbb\x60\xad\x71\xc1" - "\x5a\x23\xe4\xc5\x27\x38\x91\x37\xd9\x10\x3f\xa3\x00\xe4\x3c\x67" - "\x16\x8b\x43\xd8\x3b\x17\x64\xbd\xad\x28\xe7\x9d\x87\xb9\x91\x61" - "\x50\x63\x7d\x24\x1c\xd5\x34\x40\x3b\xce\x77\xcd\xcb\x39\x2f\xc8" - "\x38\x6a\x1e\x73\x1c\xbe\x39\xf5\x6c\x05\x8e\xdd\x38\xf9\x4c\x01" - "\xe3\x99\x7d\xd8\xca\x62\x5d\xb8\xff\x46\x18\x0b\x57\x41\x27\xe1" - "\x59\x1f\x25\xae\xc7\x3f\xac\xc4\xf5\xf8\x64\x25\xae\xc7\xdf\x25" - "\xe3\xba\xf8\x0c\x70\x1d\xfa\x8d\xf1\xd1\xb0\xf6\xfd\x48\x3e\x3a" - "\x3e\x46\xc2\x75\x41\xc4\xf5\xc2\x2b\xc0\xf5\x2e\xf9\x68\x0f\x5c" - "\xf2\x8d\xeb\xf1\x31\xb2\x4e\x22\xe1\x16\xaf\x36\xb2\x27\x3d\x71" - "\x7d\x4a\x29\xc3\xf5\x93\x9d\x71\x1d\xd2\x19\xae\x4f\x29\xf5\x79" - "\x9e\xe0\x64\xe7\xfd\xb4\x69\x2a\x86\xeb\xd5\xa2\x8d\x6c\xa5\x1f" - "\xe7\x09\xaa\x39\xa6\x4b\x58\x8e\xfa\xaa\xeb\xab\x93\xc0\x30\xe0" - "\x57\xae\x93\x60\x58\xde\xc4\xb1\x1c\xb1\x51\xc2\xf3\x2b\x39\x4f" - "\xd0\x1d\x9e\x4b\x7c\x33\xe2\xb9\x2f\xbe\x59\x89\xe7\xd3\x55\x4a" - "\x3c\x9f\xde\x43\x89\xe7\xcf\xab\x94\x78\xfe\x3c\xe9\x8c\xe7\x97" - "\x63\xf9\xf4\xa7\xbc\xe1\xb8\xf1\x69\xd4\x51\xcc\x2c\xf6\x8d\xe1" - "\xd3\x33\xfd\xc7\xf0\xe7\x96\xfd\xdb\x61\xb8\xb6\x33\x86\x3f\x57" - "\x82\x18\xe4\xca\xee\x84\xe1\xb3\x45\x0c\x17\x71\x64\x6b\xa3\xc8" - "\x0b\x77\xc6\xf0\x26\x68\x47\x37\xf2\xb8\xf3\xfb\xce\x18\x3e\xe3" - "\x1d\x05\x86\x6b\xbb\xc1\xf0\xd9\x5c\x0f\xa2\xb0\xcb\xf5\xa1\x0b" - "\x81\x76\x54\x6d\xf1\xc1\x9b\x4b\x34\xf3\xac\x8f\x12\xc3\x67\xf6" - "\x50\x62\xf8\xcc\x68\x25\x86\xcf\x38\x27\x63\xb8\xf8\xec\xaa\xf0" - "\xe6\x33\x03\xaf\x3a\x6f\x2e\x8d\x8f\x2e\x31\x7c\x66\xa0\xcc\x9b" - "\xcf\x3c\xdd\x3d\x86\x4f\xcf\xf1\x8e\xe1\x90\xce\x30\x7c\x7a\x8e" - "\xcf\x73\x0e\x97\x61\xf8\xf3\x87\xfc\xc0\x70\xa5\x2e\x44\xc2\x70" - "\x51\x17\xb2\xd5\x43\x17\xe2\xca\xe2\xba\x90\x2d\x8d\x7c\x6c\xf4" - "\x53\xf1\x71\x0a\xe3\x47\x57\xa8\xee\x5a\x76\xdb\xf2\xa3\xf4\x20" - "\xcf\x9b\xfd\xd1\x83\x30\xfc\xc6\x33\x0e\x93\x01\xb7\x2b\xaf\xf0" - "\x8c\xc3\x28\xe9\x8c\x83\xc9\xc7\x19\x07\x11\xcf\xa7\xfe\x04\x3c" - "\x67\x67\x1c\xfe\xf2\xb9\x52\xc7\xfc\x97\x2f\x24\x1d\x33\xc7\xf3" - "\x17\xce\x28\xf1\xfc\x85\x3a\xf7\x99\x07\xc0\x7c\x8b\x71\xdd\x65" - "\x67\x1e\xdc\xd8\xce\xf4\xa0\x89\xf7\x99\x9f\xae\x23\x6e\x7c\x9f" - "\x22\xe3\x3b\x94\xb5\x5e\x81\xed\xb5\x9e\xd8\x9e\x38\x45\x81\xed" - "\xa7\xf2\x95\xf6\x11\xb5\x46\x0f\x6c\x97\xce\x3c\xcc\x9a\x7c\xac" - "\xa6\x1b\x6c\x87\xf7\xaf\xfc\x8c\xd8\xd5\xc5\x76\xe9\x7c\x83\x57" - "\x6c\xf7\x3c\xdf\xe0\x61\xff\x80\xd8\xce\xe2\x69\xf4\xef\x84\xed" - "\x4b\x13\xd5\xae\xc3\x30\x1f\x00\xd7\x71\x8e\xb8\x28\x60\x3b\xa3" - "\xf7\xac\x3c\x4f\x6c\xef\xc8\xe2\xd8\xbe\xb9\xf1\xa7\x63\xbb\x9b" - "\x1f\xf6\xc4\xf6\x3f\x20\xb6\xcf\x5e\xcb\xcf\x5f\x64\x5e\xd9\xf9" - "\x8b\x4e\xf6\x19\x9b\xaf\x40\xff\xd2\x25\xc6\x7b\xa9\x97\x12\xe3" - "\x67\x9f\x55\x62\xfc\x0b\x03\x95\x18\x3f\xfb\x73\x19\xe3\xc5\x67" - "\x57\x85\x4f\x9f\xdd\x70\x7d\xf4\x2f\xb3\x1b\x64\x8c\x7f\xe1\x48" - "\xf7\x67\x2f\x12\x67\x78\xb7\xcd\x80\x74\x86\xf1\x89\x33\xba\x3c" - "\x7b\xa1\xd0\x77\xcf\x79\xdf\xeb\xd9\x8b\xca\x9f\xcf\x36\xc3\x73" - "\xac\x74\xd6\xbf\xfc\x78\xdd\xf7\x9c\x3d\xfe\xea\x5f\xf0\xec\xc5" - "\xd2\x2f\x3c\xce\x5e\xd4\x74\x7f\xf6\x22\xed\xa9\x2b\xd4\xbf\x74" - "\x61\x9b\x71\x7c\xa2\xa7\xbd\xdb\xdc\xf7\x94\xf8\x3e\xf7\x7d\x37" - "\xbe\x3f\x89\xf8\x3e\xff\x98\x12\xdf\xe7\x1f\xc5\x7a\x7a\x3b\x8b" - "\xf1\x91\x62\x5f\x71\x5e\x88\xd2\x56\xa3\x93\xfe\xe5\x49\x1c\x7b" - "\xf3\x17\x2b\xf0\xfd\x94\x27\xbe\xcf\x1b\xe1\x8d\x77\x47\xbd\x37" - "\xb3\x29\x9e\xea\x71\xa6\x6d\xbc\x64\xff\xf6\xe2\xa3\xc7\xe2\xa0" - "\xfd\x56\x1f\xb6\x6e\x53\xb9\xad\x1b\xb3\x6d\x43\x3d\x38\x94\xf5" - "\xee\x54\xa3\x3a\x3d\x81\x0a\x68\xeb\xd6\xd9\xce\x0d\x6d\xdf\xd0" - "\xd6\xad\x3c\xd1\xe4\xd3\xce\x0d\xc7\xa6\x2f\x5b\x37\xa8\x77\x18" - "\xc3\xfa\xd3\x22\xd6\x8b\xb6\x6e\x05\x29\xb2\xad\x9b\x02\xeb\xbd" - "\xd8\x0f\xef\x3d\x95\xe9\x9d\x8f\xcf\x90\xb1\xbe\x1d\xf9\xf8\xff" - "\xec\xa4\x8b\x61\x7d\xf0\x62\xe6\xcf\xaa\x8b\x61\x58\x6f\x5c\x58" - "\x81\xe3\x78\x8a\xd1\x8b\x2e\xe6\x72\x1b\xe7\x9f\x4f\x17\x63\x2c" - "\x57\x62\xfc\x7c\xa2\xc4\x78\xe3\xfb\x32\xc6\x8b\xcf\xae\x0a\xc6" - "\x1b\xcb\xae\x8f\x2e\xc6\x58\x26\xeb\x62\xe6\xbf\xe9\xd5\xfe\x4e" - "\xa1\x63\x9f\x37\xd2\xbb\x8e\x7d\x9e\x68\x7f\x37\x6f\xa4\xcf\x33" - "\x21\x97\xed\x69\x26\xad\xe6\x3a\xf6\x1f\x71\x26\xa4\xe6\x97\xa6" - "\x8b\x49\xf2\xe9\xff\xcb\x97\x2e\x86\xd9\x36\x7f\x81\xf6\x21\xfe" - "\x9d\x09\xe9\x0e\xdb\xdd\xbc\x7b\x17\x7b\x98\x4a\x6c\x5f\xb0\x5a" - "\x89\xed\x0b\xd6\x2a\xb1\x7d\xd1\x46\x25\xb6\x2f\xca\xef\x8c\xed" - "\x97\xe3\xfa\x82\xd3\xde\x30\xdd\xf8\x24\xea\x62\x16\x8d\xf2\x8d" - "\xe7\xc9\xc1\xfe\xe3\xf9\xc2\xfe\xff\xd6\x78\xae\xed\x8c\xe7\x0b" - "\x27\xfe\xac\x7a\x19\x86\xe7\x29\x8f\x2a\xf0\x5c\xdb\x0d\x9e\xff" - "\x6c\x7a\x99\x94\x2d\x4a\x3c\x4f\xa9\x54\xe2\x79\xca\x4b\x32\x9e" - "\x8b\xcf\xae\x8a\x5e\x26\xa5\xe0\xfa\xe8\x65\x52\x0a\x64\x9e\x7d" - "\xd1\xe2\xee\xf1\x3c\x39\xcc\x3b\x9e\x43\x3a\xc3\xf3\xe4\x30\x9f" - "\xf6\xd4\x97\xe1\x79\xea\x64\x3f\xf0\xdc\xab\x8d\xca\x2f\x43\x2f" - "\x93\xea\x33\xfe\xa5\x2f\xbd\x8c\xaf\x73\x2a\x88\xef\xb2\x7d\x8a" - "\xc7\x39\x95\x18\xe9\x9c\x4a\xa6\xd2\x3e\xe5\xaa\x63\xfb\xe2\x59" - "\x4a\x6c\x5f\x3c\x57\x89\xed\xcb\x5e\x56\x62\xfb\xb2\x1c\xa9\x9e" - "\x5c\x2f\x93\x75\xd9\xb9\x15\x25\xce\x2f\x2e\x37\x3f\x59\x47\xbc" - "\x61\x3d\x94\x35\xdc\x37\xce\x2f\xb6\xfb\xc2\x79\xb4\x57\x79\x7b" - "\x6a\xa2\x17\x9c\x5f\xe2\xfa\x7f\x01\xe7\x7d\xd9\xa1\x30\x39\x08" - "\x30\x1e\xf1\x9e\xe1\xbb\x88\xf5\x88\xf3\xae\x8f\xbd\xe9\x68\x96" - "\x46\x5f\x2b\x9c\xf7\xad\xa3\x49\xbb\xaf\x62\x8a\x88\xf3\x57\x72" - "\x86\xe6\x90\x52\x47\x53\x30\xfb\x5a\xeb\x68\xd2\x56\x2b\xf1\x3e" - "\xcd\xac\xc4\xfb\xb4\x85\x32\xde\x8b\xcf\xae\x0a\xff\x9e\xb6\xea" - "\xfa\xe8\x68\xd2\x56\xc9\x78\xbf\x6c\x56\xf7\x78\xbf\xd8\xe9\x1d" - "\xef\x17\x8b\xbe\xd9\x16\x3b\xaf\x1c\xef\xd3\xdd\x78\x7f\xf9\xf9" - "\x99\xcc\x1f\x6f\x23\xf3\xf0\xf5\xd6\xd1\xa4\xfb\xc4\xff\xae\xfc" - "\x63\xfc\x78\x1d\x8d\x78\x26\x71\xba\x77\xff\x18\xc7\xba\xb0\x91" - "\x39\x56\xe6\x89\xf5\x19\x4f\x29\x6d\x11\x33\x26\x4b\xb6\x88\xc7" - "\x2a\x10\xeb\x57\x2c\x57\x62\xfd\x8a\x4c\x5f\x3a\x9a\xbd\x82\xa7" - "\x4d\x62\xc6\xfb\x4a\x1d\x4d\x91\x52\x47\x33\x1e\xc7\xde\x8a\x61" - "\xbe\xb1\x1e\x10\x5b\x61\x03\xce\xcf\x28\xbe\x39\x55\xb4\x01\x9f" - "\xea\x61\x03\x3e\xe6\xbf\x44\xac\xcf\x74\x1d\xad\x74\x12\x7f\xec" - "\x10\x7f\xba\xad\x77\x8e\x57\x1b\x44\xb6\x06\x74\x61\x87\x18\xff" - "\x95\x16\x6d\x9a\x0d\x85\x29\x1e\x76\x88\x80\xff\x9b\xd4\x9d\xfc" - "\x17\x7b\xb3\x43\x9c\x6a\xf4\x89\xff\x97\xa8\x8c\xff\xc2\xfd\xb2" - "\xde\x46\x40\x3e\x9f\xf5\xcb\xf2\xe8\x6b\xa5\xb7\xf1\xa6\x27\x31" - "\x3f\x82\xf8\x9f\x35\x94\xf3\xf9\x89\xbf\x30\xbd\x4d\xd6\x4b\x4a" - "\xdc\xcf\x2a\x51\xe2\x7e\xd6\x5c\x19\xf7\xc5\x67\x57\xc5\x16\x3d" - "\x6b\xe5\xf5\xe1\xf3\xb3\x56\xca\x7a\x9b\x15\xd3\xba\xc7\xfd\x8c" - "\x06\xef\xb8\x9f\xd1\xc0\x71\x3f\xa3\xa1\x4b\xbd\x8d\xc2\x36\x72" - "\xe5\xa3\x3f\x59\x6f\x23\xf1\xf9\xd7\xfd\x5c\xcf\xca\x91\xfe\xe8" - "\x6d\xdc\x67\xd2\x7f\x92\xde\xc6\x3b\xde\x4b\xbc\xfd\xb1\x2e\xf6" - "\x5c\x95\x78\xff\xd2\xa3\x4a\xbc\x7f\x69\xb4\x12\xef\x5f\x9e\xa9" - "\xc4\xfb\x97\x67\x78\xd3\xdb\x28\xb1\xfe\xa5\x8d\xde\x70\xde\x38" - "\x1e\xf5\x36\x2f\x87\xf9\xc6\xf8\x97\x4a\xfd\xc7\xf8\xec\xd3\xff" - "\x1f\xe3\x3b\x61\xbc\xb6\x33\xc6\xff\x9f\x81\x3f\x2b\x8f\xcf\x30" - "\x3e\x27\x44\x81\xf1\x57\x51\x97\x73\x25\xe7\x49\x7c\xf3\xf6\x39" - "\x9d\xec\xdf\x73\x3a\xd9\xbf\xe7\x78\xd8\xbf\xe7\x14\x5c\x3d\x8c" - "\xcf\xb9\xfa\xf6\xef\x57\x84\xf1\x39\x1e\xf6\xef\x2f\x3f\xda\x3d" - "\xc6\xbf\x54\xe6\x1d\xe3\x21\x9d\x61\xfc\x4b\x65\x5d\xf2\xf6\x0a" - "\x8c\x7f\xe5\xae\x6b\xa1\xcb\xb9\x3e\xe7\x8d\x5e\x31\xf8\xa3\xcf" - "\xe9\xca\xef\x88\x4f\x7d\x4e\xb4\xa4\xcf\x31\xfa\xd0\xe7\x5c\x2d" - "\xcc\x7f\x75\xb8\x12\xf3\x5f\xfd\xbd\x12\xf3\xd7\xcc\x55\x62\xfe" - "\x9a\x39\x4a\x7d\x4e\xd2\x65\xfa\x1c\x25\xfe\xbf\xba\xc5\x3c\xde" - "\x53\x9f\x53\xe4\xa1\xcf\x59\x73\x8b\x6f\xfc\x7f\xd5\x27\xfe\xb7" - "\x32\xfc\x4f\xf0\x82\xff\xab\xfe\x4d\xf0\x3f\xe1\x27\xe0\xff\xea" - "\xeb\x80\xff\xb9\x03\xb8\x8e\xe7\x0a\xfd\xa4\xec\xf5\x5f\xc7\xf3" - "\xd3\xd6\x81\xdc\xf9\xca\x75\x20\x77\x9b\x72\x1d\xc8\x9d\x2c\xaf" - "\x03\xe2\xb3\xab\xb2\x0e\xe4\x1a\xaf\xcf\x3a\x90\x6b\x94\xd7\x81" - "\x35\xe3\xba\x5f\x07\x5e\xf5\xb1\x0e\xbc\x2a\xae\x03\xaf\xfa\xb1" - "\x0e\x98\x7e\xef\x5b\xc7\x63\xfc\xf1\x3a\x9e\xe1\xd7\xfb\x1c\x94" - "\x69\x84\x5f\x3a\x9e\x0d\xd3\x22\xcb\xd0\x47\xca\x69\xa2\x5e\x3a" - "\x4d\xd2\xf1\x98\x3b\xe9\x78\xcc\x97\xe9\x78\x16\x9f\x16\xf1\x7f" - "\xac\x78\xde\x74\xfc\x4f\xf0\x91\xc2\x62\x49\xaf\x1d\xae\xb4\x9b" - "\x5f\xcb\xf0\x5f\xf6\xdf\x97\x77\x0c\xeb\xc5\xd7\x1f\x73\x17\x3e" - "\x50\xd7\xbe\xac\xd0\xe9\x8c\xf5\xe6\x23\x25\x4f\x61\x77\xa3\x3c" - "\x6f\xba\x76\x8f\x02\xef\xc7\xf3\xf3\xa6\x6f\x79\xdb\xa7\x75\xfb" - "\xe4\x5f\x77\x84\xf9\xe4\x77\xfb\xf2\x5b\xeb\xb8\x22\x5f\xd2\x53" - "\x45\x5f\xd2\xa7\xae\x83\x2f\xe9\x2b\xf5\xc9\x7f\xaa\xb3\xff\xbe" - "\xd7\xa6\x59\xca\xcc\xa4\x02\xc7\xc8\x94\xce\xbe\x4f\xcd\xde\xcf" - "\xee\xab\xc5\xb3\xfb\xf3\xae\x8d\x1f\x14\xac\x0f\x5b\xf3\x43\xdf" - "\x8e\x79\x27\xdd\xc6\xea\x83\x71\xbb\xa1\xae\x67\xca\x60\xac\x0a" - "\x88\xa7\x49\x88\xa7\x79\x3a\x96\xf7\x34\x8c\x85\xd0\xe8\x68\x1c" - "\xc7\xb9\x02\x09\x36\xa6\x20\xb6\xbe\xc6\xec\xbe\x80\x8d\x00\x6c" - "\xe5\xf9\x96\x9d\xa6\x2e\x57\x68\x4c\x34\xd4\xbf\xd7\xee\x79\x95" - "\x3d\x2a\xac\x76\x98\x17\x8d\x2c\x8e\xab\xc5\xd9\x66\xc6\xbe\x38" - "\x30\xaf\x32\x90\x02\xfe\x6e\x7d\x9e\x04\xf9\x37\x4f\x5f\x63\x71" - "\xea\xd9\xd9\xf5\xd0\xb7\xc7\xa2\x1f\x10\x89\xb7\x12\x2e\xc8\xfa" - "\xad\x2d\x40\x1f\x81\xf2\xb5\x2f\x7e\x16\xc7\x0d\xf8\x9e\x01\x68" - "\xc9\x6c\x6c\x11\x37\x58\xec\x2a\xc0\x8d\xc2\x8b\xf2\x3e\x36\x96" - "\x8f\x34\xe2\x7a\x94\x3c\xd9\xfe\xc5\xea\x0b\x5b\xd7\xee\xf3\x8e" - "\xad\x6b\xf7\x71\x6c\x5d\xbb\xcf\x8d\xad\x56\x2f\x7a\x14\x85\x1d" - "\xfb\x7a\xd1\xfe\xc5\xdc\x89\xc7\x36\xff\x0b\xfa\x47\x59\xef\x97" - "\xfd\x0b\xc3\xd3\x39\x1c\x4f\x11\xaf\x24\x4c\x95\xf5\x28\x66\x9f" - "\x7a\x94\xee\x30\xd5\xaf\x33\xfc\x0c\x53\x37\xac\x56\x62\xea\x86" - "\xb5\x4a\x4c\xdd\x14\xd2\x19\x53\x2f\xc7\xd3\x0d\x9f\x7b\xc3\x52" - "\xee\x1f\x65\xa3\xd9\x37\x8e\x6e\x70\xfa\xc2\x51\x66\x9f\x3e\xd5" - "\xc3\x3e\xdd\x8d\xa3\xf9\x7d\x95\x38\xfa\xd7\x98\x2b\xc5\x51\x16" - "\xdb\xe4\xd4\xcf\x10\xdb\xe4\x47\xe3\xa8\xb1\x13\x8e\xe6\xbf\x29" - "\xe3\x68\xe7\xf8\x26\xdd\xe0\xe8\xec\x6b\xe3\x03\x45\x81\xa3\x82" - "\x8d\xd5\x47\x3f\x0f\xeb\xba\x71\xa8\x12\x47\x37\x26\xf8\xc6\xd1" - "\x7c\x97\x8c\xa3\x3c\xdf\xb5\xc5\xd1\x8d\x11\x0a\x1c\x9d\xed\x81" - "\xa3\xdf\xcb\x32\x04\xda\x58\xb8\x71\x74\xae\x07\x8e\xce\xee\x0e" - "\x47\x37\x46\x20\x8d\x38\x8f\xba\xf1\x87\xee\x71\xf4\xaf\x81\xde" - "\x71\x14\xd2\x19\x8e\xfe\x35\x50\xc6\x51\x2f\x3c\xaa\x02\x47\x37" - "\x7d\xe1\x07\x8e\xfe\xc2\x7d\xa3\x6c\xaa\xf2\x4b\x57\x21\x9f\xe9" - "\xbc\xdc\x47\xea\xb3\x9e\x67\x82\x4a\x3a\xc5\x3d\x29\xb9\x2c\xee" - "\xc9\x62\xe9\x8c\xe7\x28\x11\x57\xc7\xfc\x04\x5c\x65\x67\x3c\x37" - "\x9f\x51\xda\x9e\x6c\x3e\x2b\xd9\x9e\x70\x5c\xdd\xba\x4c\xaa\x97" - "\x1c\xf7\xa4\xa4\x0b\x1f\xa9\x05\xc3\x15\xbe\x51\x46\x79\xfa\x46" - "\xd9\x3a\xd4\xb7\x8f\xd4\x82\x04\x85\x6f\x94\xe3\x3b\xdd\x71\x4f" - "\x3a\xfb\x48\x95\x31\x76\xcb\x7c\x86\xb1\x6e\x1f\x54\x05\xdb\xdc" - "\x3e\x52\xbb\x39\x17\x84\xe5\xec\xae\x4d\xbc\xf6\x18\x6b\xf6\x03" - "\x63\x15\x71\x4f\x3a\xfb\x98\x2a\xec\x6f\x39\x5a\x42\x2a\x12\x4a" - "\xbc\xf8\x46\x2d\xb9\xae\xb1\x4f\xb0\x5e\xde\xb1\xb6\x70\xa3\x12" - "\x6b\x0b\xcb\x58\xde\xaf\xbd\x61\x6d\xe1\x2c\x19\x6b\x79\xbe\x65" - "\x5f\x77\xc2\xda\x1a\x1f\x58\x0b\xeb\xea\xd6\x7a\x7f\xb1\xb6\x90" - "\xc5\xcd\x16\xb2\x44\xac\x6d\xbc\xda\x58\x5b\x98\x2f\x63\xed\xd6" - "\x67\xbb\x8f\x31\x55\x90\xe8\xfd\x5c\x4e\x41\x22\xc7\xda\x82\xc4" - "\x2e\x63\x4c\x29\x6c\x3e\x8a\xc6\x49\x31\xa6\x64\x7d\x40\x89\xa8" - "\x0f\xf8\x57\x8e\x89\x52\x34\xd6\x5f\x7d\xc0\x67\x20\xbb\xe3\xb9" - "\xcb\xa5\x18\x73\x6a\x0a\xc6\x44\x29\xee\xa4\x0f\x28\xbe\x5c\x1f" - "\x30\xb9\x6b\x8c\xf5\x4b\x1f\xc0\xce\x5d\xbe\x3e\x5a\x89\xb1\xaf" - "\x8f\x53\x62\xec\xb6\x33\xd2\x39\x4b\xac\x8f\x6f\x9f\xa9\xaf\x6f" - "\x74\xeb\x03\x6a\x94\xd8\x2a\xeb\x03\xb6\xad\xf7\x8d\xb1\xaf\x2b" - "\xf5\xbf\x63\x76\x2a\xce\x59\xbe\x55\xeb\xe9\x87\x5a\xf2\x3f\xf5" - "\x5f\xa7\x8f\x55\x79\x62\xec\x7f\x05\xfd\x2b\xf9\xa1\x76\xfb\x9a" - "\xea\xc6\x96\xfb\x72\x3f\xd4\xff\xbd\xcc\x72\xb4\x98\xe0\xd9\x36" - "\x86\xb7\x0a\xdd\x40\xf1\xf5\xd1\x0d\x1c\x2d\xf6\xa1\x1b\xd8\xa6" - "\x52\xe2\xec\xb6\x28\x96\xf7\x2b\x6f\x38\xfb\xdf\x9f\xcb\x38\xcb" - "\xf3\x2d\xfb\xaa\x13\xce\x56\x5f\x4d\x9e\x16\x55\xbb\xd7\x52\x37" - "\xb0\x8d\xc8\xba\x81\x6d\x57\x70\xfe\xf1\xf5\x32\xef\x38\xfb\xba" - "\xa8\x77\x7d\x5d\xd6\xbb\x56\x7b\x89\x97\xa2\xc0\xd9\xed\x6f\x4a" - "\xe7\x1f\x19\x4f\x5b\x23\xf1\xb4\xc5\xff\x82\xf1\x52\xb6\xef\xf4" - "\x57\x37\x80\xe7\xdc\x11\x5b\x11\xbb\x24\x7c\x95\x75\x03\xc5\xbe" - "\x75\x03\xdd\xe0\xab\xff\xb1\xfb\x76\xbc\xa9\xc4\xd7\x1d\xef\x28" - "\xf1\xf5\xad\xe1\x9d\xf1\xf5\x72\x6c\xdd\x71\xce\x1b\xae\x72\xdd" - "\xc0\x9b\x0d\xbe\x31\xf5\x0d\x9d\x2f\x4c\x65\x3e\xfd\x6a\x65\x1b" - "\x69\x19\x53\x77\xde\xa7\xc4\xd4\x37\xa6\x5c\x29\xa6\x5e\x97\x78" - "\x29\x3f\x1a\x53\x13\x3b\x61\xea\xce\xcf\x65\x4c\xed\x1c\x33\xa5" - "\x1b\x4c\xbd\x56\x7a\x02\x4f\x4c\x55\xf0\xae\x6f\x3e\xa5\xc4\xd4" - "\x37\x73\x7c\x63\xea\x9b\x43\x64\x4c\xe5\xf9\xae\x2d\xa6\xbe\x39" - "\xe9\xda\xea\x09\xde\x9c\x24\xf3\xae\x6f\x0d\xe8\x1e\x53\xdf\xd0" - "\x7b\xc7\xd4\x37\xf4\x1c\x53\xdf\xd0\x5f\xf9\x99\xf2\xb7\x5c\x7e" - "\x60\xea\x2f\x3c\x96\xca\x5b\x4e\xbf\xf5\x04\xa8\x6f\x45\x2c\xad" - "\xf9\x69\xbe\x43\x52\x25\xdf\x21\x23\x45\x8c\xfd\xc3\x4f\xc5\xd8" - "\x5d\x7d\x95\x36\x0d\xbb\x42\x24\x9b\x06\x8e\xb1\xef\xbe\xa7\x8c" - "\x8f\x7a\xb9\xaf\x10\xa5\x0f\xd5\x5d\xd3\xdc\x7a\x02\xc4\xdc\x91" - "\x9e\x7a\x82\x77\xa7\xf9\xc6\xdb\x5d\x39\x0a\x3d\xc1\xa7\xde\xf1" - "\xb6\x55\x81\xb7\xef\x6c\x67\x78\xeb\xf6\xa1\xba\xab\x4c\xf2\xa1" - "\xda\x2d\x0f\xab\xc0\xdb\x84\x9f\x07\x6f\x4b\xae\x1c\x6f\x95\xb1" - "\x54\x3a\xfb\x4b\xdd\x3d\xda\x52\x0a\x78\xcb\xfc\x75\x74\xf6\x99" - "\x7a\x65\xfe\x3a\xae\x95\xcf\x54\xac\x97\x77\xdc\xdd\x5d\xae\xc4" - "\xdd\x77\x09\xcb\xeb\x15\x77\x77\x6f\x91\x71\x97\xe7\xbb\x62\xdc" - "\xfd\x51\x3a\x83\xdd\x65\xd7\x56\x67\xb0\xbb\x4c\xc6\xdd\x77\xd7" - "\x76\x8f\xbb\xbb\x4c\xde\x71\x77\x97\x89\xe3\xee\x2e\x53\x97\xb8" - "\xab\xb0\x21\x28\x5e\xee\xd5\x97\x47\xcd\xbf\x7a\x9c\x95\xe2\xcc" - "\x1f\xa3\x33\x00\x0c\x56\xa7\xa1\x0f\xa7\x04\xb4\x21\xe8\x5e\x67" - "\xd0\x1d\xde\xfa\xaf\x33\x78\x6f\x99\x12\x6f\xdf\x5b\xae\xc4\xdb" - "\xf7\x87\x62\xbd\xba\xd4\x19\x30\x0c\x78\xaf\xdc\xad\x33\xb0\x2a" - "\x71\x56\xd6\x19\xec\xf9\xda\xf7\xde\xd7\x7b\x0e\x05\x7f\xfb\x87" - "\x4e\x3e\xab\xa7\xca\x78\x7b\xbc\x42\xb2\x19\xfb\x9f\xbb\x8e\x4d" - "\xf4\xc4\xdb\xbf\x8d\xb8\xcc\x67\xf5\xa4\xab\xe8\xb3\x7a\xd2\x55" - "\xf6\x59\xfd\x94\xd2\x67\xf5\xa6\x56\xd9\x8e\xcc\x7f\x9f\xd5\xff" - "\x73\x84\x61\x30\x8e\x21\xf4\x5b\x7d\x25\x7a\x84\x6b\x1c\x6b\x45" - "\x81\xbd\x0a\x3d\xc2\x9e\xd1\x4a\xec\xdd\x93\xe6\x1b\x7b\xf7\x0c" - "\x90\xb1\x97\xe7\xbb\xb6\x3c\xef\x9e\x51\xd7\x56\x8f\xb0\x67\x94" - "\xac\x47\x78\xbf\xaf\x57\xec\x55\xec\x8d\xfd\x8d\x78\xdf\x1b\x83" - "\x74\x86\xbd\x7f\x23\x3e\xf5\x08\x97\xd9\x6f\xbd\xff\x03\xdf\x1b" - "\x13\x79\x5e\xab\x1f\x7a\x84\x5f\x9c\x8d\xc1\xfb\xb6\x1f\xa3\x47" - "\x40\xbc\x45\x3c\x93\x30\xf7\x4a\xf4\x08\x57\x9f\xc7\xfd\xe0\x07" - "\x25\xe6\x7e\xd0\xa2\xc4\xdc\x8f\xd6\x77\xc6\xdc\xcb\xf1\xf6\xc3" - "\xfb\xbc\x61\x2d\xd7\x23\x7c\x34\xd2\x37\xce\x7e\x98\xe0\x13\x67" - "\x3b\xd9\xe6\xca\x38\x5b\xb2\x56\x89\xb3\x1f\x6e\xfb\x51\x38\x7b" - "\xa5\x31\x58\x7e\x51\x38\x9b\xd0\x09\x67\xf7\x0e\x95\x71\xb6\x73" - "\x1c\x96\x6e\x70\xf6\x1a\xc5\x61\xf1\xcd\xe3\xee\x7d\x4f\x89\xb3" - "\x7b\xeb\x7c\xe3\xec\xde\xe5\x32\xce\xf2\x7c\xd7\x16\x67\xf7\x16" - "\x5f\x5b\xdd\xc2\xde\x62\x99\xc7\xfd\x68\x61\xf7\x38\xfb\x61\xa2" - "\x77\x9c\xfd\x50\xdc\x17\xfb\x30\xd1\x27\x8f\x7b\x19\xce\x7e\x3c" - "\xd9\x0f\x9c\xfd\x85\xdb\x20\x7c\xec\x97\xff\x0b\x0f\x7d\x6d\x4f" - "\x8b\xb5\xd3\x79\x89\xaf\x3c\xcf\x4b\x78\xe8\x16\x46\x4a\xba\x05" - "\x65\x7c\x96\x54\x49\x7f\x1b\x23\xe2\xee\x23\x3f\x15\x77\xf7\xcd" - "\x6a\x73\xe3\x6e\x12\xe0\xee\x3e\x76\x3e\xa2\xcd\x8d\xbb\xe6\xdb" - "\xa4\x7a\xc9\xf1\x59\x7c\xe8\x16\x1e\x60\xe5\xed\x77\xeb\x16\x10" - "\x87\x63\x3c\x75\x0b\x07\x3f\xf7\x8d\xc1\xfb\xea\x14\xba\x85\x4f" - "\xbc\x63\xb0\x5d\x81\xc1\x07\xfa\x33\x0c\x7e\x40\xc2\xe0\xfd\x86" - "\x56\x90\x2d\x5b\xb3\xfd\xc3\x60\x3b\xc3\xe0\x51\xd7\x07\x83\xf7" - "\x5c\x05\x0c\x66\x74\x3f\xb0\xd7\x62\x06\x0c\x9e\x82\x18\x3c\xea" - "\xca\xf4\x0d\x3f\x53\x8c\x16\xac\x97\x77\x2c\x3e\xf8\x7b\x25\x16" - "\x1f\x34\xb2\xbc\x5e\xb1\xf8\x60\x5f\x19\x8b\x79\xbe\x6b\xab\x6f" - "\x38\x38\xe2\xda\xea\x1b\x0e\x8e\x90\xb1\xd8\xac\xea\x1e\x8b\xf7" - "\x35\x79\xc7\x62\x48\x67\x58\xbc\xaf\xa9\x4b\x2c\x7e\xc0\x13\x8b" - "\xcd\x6e\x9e\x57\xa1\x6f\xb0\xfe\xab\xc7\x6e\x31\xfb\xe4\x7f\xf5" - "\xb7\x92\xcc\x5a\xd5\xa1\xd1\x96\x02\x42\x9a\xb3\x48\xa6\xc5\xf9" - "\x00\x81\x34\xa0\xdf\xa1\xf9\x16\x5d\x34\x11\xd6\x3d\xae\x47\x3c" - "\x7e\x0d\xff\x80\xc7\x35\xa9\xc5\xb9\xc5\x68\x7c\x88\xd9\xbb\x62" - "\x3a\x62\xef\x56\x8f\xe7\xde\xbe\x45\x4d\x63\x8a\xc4\xf7\xca\xf8" - "\xb9\x9b\x31\xdb\xa4\x7b\x1c\x9b\x56\xd5\xa1\x4a\xba\x76\x4c\x81" - "\x2d\x64\x4c\x81\xb7\xf7\x6f\xd7\x92\xa0\x7e\xcb\x29\x2d\xdc\x40" - "\xed\xcd\x77\x8e\xd1\x37\xbf\x42\x88\x69\x03\xb5\xb5\x65\x7f\x02" - "\x6d\x3c\x14\xf9\x57\xc8\xd7\x1c\x7a\x40\xdb\x9c\x35\x91\x40\xda" - "\x40\x29\x0d\xe8\x46\x84\xac\x00\x2a\xc0\x33\xba\xa1\xaf\x73\x6b" - "\x3a\x60\x55\x1a\x21\x77\xb7\xe2\x9c\xf9\x24\x02\xc6\x4c\x58\x2e" - "\x94\xb9\x06\xca\xa2\xbf\xba\xd9\x0e\xe3\x31\xb0\x62\x25\xc1\x39" - "\x9d\x03\xed\x2a\xca\x45\xda\x07\xfc\x3a\x9f\xaa\x03\x89\xb0\x7d" - "\x78\x2a\xed\x3f\x3d\x12\xfa\x83\x98\x92\x48\x10\xb6\x63\x0d\xe4" - "\xa3\xea\x0c\x2a\x0c\x89\x06\xfc\xb7\xf3\x39\x0d\xf5\x3b\x00\x72" - "\x2c\x85\xef\x16\x26\x11\x2d\xfc\x05\xd3\xf5\xd3\x23\xa1\x5e\x7b" - "\xa0\x5e\x05\x58\x2f\x5f\x6d\x5c\xb3\x09\xd6\x9d\x9b\x75\xb8\x76" - "\xb0\xef\xe3\xb7\xd9\x77\xd4\x42\x8e\x0b\xd2\x69\x56\x06\xb5\xa4" - "\x3a\x89\x06\x68\xb1\x15\xea\x8d\xe3\x51\xd8\x31\x46\xbf\xe2\x26" - "\x42\x76\x2f\x69\x50\x5b\xa0\xee\xae\xbf\xde\x6c\x37\xa7\xdf\x4b" - "\xe0\xb9\x0d\x65\x96\x7a\xd5\xe1\xf7\x26\x9c\x25\x04\xf1\x04\x7e" - "\xef\xb7\xc3\x3a\x36\x0e\xee\xd7\x40\x3b\x84\x66\x5d\x20\xe6\x85" - "\xf4\x59\xe6\x94\x93\x44\x63\x24\x41\xb9\xd0\x36\x31\x6f\x34\xe6" - "\xb5\xaa\x0e\xef\xc3\x3a\xc0\xfd\x58\xb8\xc7\xf7\xd0\x86\x8c\xd0" - "\x6d\xc3\x53\xd9\xd8\xcc\x9b\x1e\x29\x0c\x19\x9e\xca\xb0\x0f\xda" - "\xb9\x06\xda\x0c\x79\x82\x21\x4f\x30\xbb\xa6\x13\x6d\x1e\xa4\x61" - "\x39\x70\x0d\x36\xcf\x6b\xc7\xb2\x0d\x58\xb6\x0f\x3a\x04\xd2\xb0" - "\xe9\x91\x14\xc6\x36\xae\xa9\xfa\x74\xd5\xe7\xb5\xaa\xd2\x29\x1a" - "\x15\xa5\x74\x5b\x34\x59\x91\x4e\x82\x4d\x02\x21\xe6\x9b\xb0\x9c" - "\xd2\xfb\xa0\xfc\x40\xa4\x45\x5b\x76\x69\x98\x55\xf5\x89\x19\xe9" - "\x0b\xfd\x69\xd7\xdf\x8e\x6d\x28\x9d\x83\xdf\xc1\x77\xc4\xfc\xcc" - "\xf7\x3d\xd6\x59\x9f\x1e\x40\xe1\xfe\xa9\x00\xd5\x69\x12\xa0\x0b" - "\x7e\x06\xde\x9f\x64\x25\xaf\x36\xe0\xfb\x56\xfe\x1e\x8c\xa5\x52" - "\xc0\x91\x43\x35\x98\x86\xf7\x3e\xea\x1b\x2c\xf5\x5b\xb9\x0e\xc6" - "\x46\xe7\xbe\x93\xc6\x08\x8c\x0b\x69\x8c\x60\x7d\xdf\x4d\xb7\xaa" - "\xd9\x3a\xac\x2a\x65\x72\x5d\x2e\xf4\xa1\x6b\xb3\x2e\x70\x0d\xd0" - "\x56\xe8\xc0\x7e\xa9\x85\x67\x47\xde\xc1\x7e\x59\xb3\x04\xfa\x84" - "\xe7\xad\x94\xeb\x8f\xf7\x47\x58\x7f\x0a\xd0\x17\xfc\xec\xe6\x91" - "\xe5\xd8\x9e\x35\xad\xd0\x8f\xe1\xd4\x5e\x9a\x0a\xf5\xc2\x71\x0b" - "\x63\x64\x77\x92\x43\x8d\x76\x7d\x98\x7e\xe0\xa2\x43\xbd\xa6\x91" - "\x20\x5f\x49\x56\x03\x2e\x6f\x49\x01\x9a\x43\x99\x74\x70\x34\xe3" - "\x23\x58\x3f\x2e\x81\xbe\x4b\x81\xb1\x0b\x34\x5f\x03\xf4\x2b\x04" - "\xcc\xc3\xdf\x85\xb0\xfe\x08\x90\xcf\xaa\x3a\xb2\x0f\xca\xd3\x6e" - "\x09\xa7\xb6\xad\xe1\xb4\x09\x68\x38\xaf\x2d\xfb\x48\xbe\x44\x43" - "\xac\xd3\x1a\x48\x5f\x0d\xcf\x21\x6f\x18\x1f\x43\xa5\x75\x52\x9b" - "\x7d\xd1\x73\xd5\x6e\x12\xbd\x7a\x37\x19\xf8\xca\x6e\x32\x22\x6d" - "\x06\xcc\xcb\xac\x87\xe8\x67\x09\x4e\x58\x13\xb7\x1b\xda\xc3\x1f" - "\xd7\x22\x7f\x28\xac\xb8\xb9\xe8\xa5\xdd\x24\xe2\x9d\xa9\x45\xea" - "\x09\x4d\x84\xe0\x1a\x3e\xa1\xc7\x37\xd4\x62\x6c\x21\x42\xc8\x76" - "\x83\x6b\xc5\xaf\x43\xc7\x03\x55\x8f\x18\xec\x24\x3d\x19\xd6\xf2" - "\x8b\x0d\x24\xdd\x4e\x6d\x15\x99\x67\x09\x60\x4f\x1e\xa7\xdd\xdf" - "\xc7\x4e\x98\x49\x08\x9e\x19\x14\xbe\x37\x90\xbe\x89\x24\x30\xed" - "\x2b\xa2\xcb\xa8\xa3\x0d\xae\x0d\x71\x24\x7d\x19\x51\xef\xbe\x58" - "\xcd\x79\x4f\xd5\xdf\x6f\xd9\x0f\xdf\xa2\x6d\x71\x24\xde\x29\xae" - "\x47\x79\xd3\xa3\x33\x66\x91\x01\xd8\x1e\x0d\xe3\xbd\x3e\x3d\x02" - "\x74\x8b\xf6\x0f\x9f\x3f\x35\xf1\xfe\xd4\xe8\x33\x66\xd2\x06\x58" - "\x53\xd4\x34\x63\x86\x8a\xea\x53\x0c\x74\xbd\x46\x6f\x09\x6c\x25" - "\x96\x44\x3b\x39\x08\xdf\xf6\xb3\x5c\xe6\xff\x9b\xad\x9f\x50\xdf" - "\xa7\x0c\x24\x93\xd5\x19\xd6\x49\x4d\x32\xf2\x50\xf4\x1b\xac\xf3" - "\x01\x68\x1f\xbd\x6d\xa1\x09\xf2\xa7\xe2\x9a\x39\xc1\x6a\x26\x65" - "\x0e\x17\xd9\xd4\xc8\xe8\xd2\x13\xe8\x12\x08\xcf\xc6\x02\x6d\x82" - "\xbc\xf5\x15\xf6\x93\x60\xda\x6e\x10\x02\x78\x7f\xb0\xbe\xb0\xf3" - "\xbe\x18\x3f\x9f\xc0\xda\x09\xfd\xb1\x96\xf7\x87\xd0\x7f\x9a\x16" - "\xfb\xc3\xbf\x76\xfc\xbd\xd8\xd7\x9a\x82\xdf\xa6\x30\x26\x70\x2c" - "\x08\x61\xd3\xb4\xf8\x6d\xac\x03\xee\x99\x61\xdf\x4f\x78\xe9\x1b" - "\x5a\x61\x6c\x20\x16\x68\x0f\x0d\xf1\xac\x83\xd3\xcf\x3a\x1c\xf5" - "\x19\xff\x6c\xd5\xdd\x30\x56\xef\x86\xb1\x7a\x37\x19\xb1\xd4\xca" - "\xc7\xea\xf1\x1a\x3e\x56\x5d\x50\xaf\x4b\xc0\xaf\x2f\x7d\x8a\xa8" - "\xb1\x5e\xbb\x4e\xa2\x5f\x3e\xa8\x67\x83\x3c\x5e\xc7\x9d\x03\x1a" - "\x49\x63\x36\xe0\xd7\xa1\x48\x9f\x0a\xfb\xff\x65\xef\xeb\xe3\xa2" - "\xa8\xf6\xff\xcf\xce\x42\xa2\x21\xac\xde\xc5\x56\x23\x5b\xbb\x58" - "\x4b\x69\x61\x5f\x4d\xec\x6a\x62\xe9\xe5\x21\x0d\x2c\x2d\x7c\x0a" - "\x28\xec\xa2\xf9\x80\x0a\x88\x8a\x80\xa6\x7d\xd5\x00\xc1\xc0\x8b" - "\x05\x88\xa5\xa5\xe5\x03\xde\xab\xa5\x5d\x2d\xbc\xe9\xef\x82\xf1" - "\xa0\x7d\xad\xb0\xf4\xba\x7a\xd1\xd0\xd0\x56\x45\x58\x60\x77\xe7" - "\xf7\x39\x73\x66\x9d\x1d\x76\x66\xd9\x99\x55\x2e\xfa\xf2\x8f\x79" - "\xc1\x9e\x99\x39\x73\xe6\xf3\x79\x9f\xcf\x79\xbf\xcf\x9c\x87\x1a" - "\x94\x86\x31\xdb\x22\x84\xd9\xa3\x28\x3c\x06\x7c\xf3\x17\xc0\xec" - "\xaf\x3a\xe4\x59\x8b\xdc\x96\x4e\x04\xcc\xd6\x09\x61\xb6\xfc\xf8" - "\x01\x78\xa6\x1d\x66\xa7\xdb\x62\xb6\x7c\x91\x74\xcc\x96\x8f\xbe" - "\x89\xd9\x19\x22\x98\x8d\x05\xcc\x4e\xce\x97\x88\xd9\xf2\x02\x69" - "\x98\x2d\x1f\xc0\x60\xf6\x14\x60\x16\xf4\xc7\x07\x6f\x31\x76\xb9" - "\x0f\xec\x02\x98\x2d\xc7\xb6\x11\xc4\x6c\xc7\xfb\xec\xbb\x3d\xce" - "\xfb\xec\xbb\x95\xed\xfb\xec\xbb\x81\xd2\x7d\x76\xd4\x78\x7b\x7c" - "\xf6\x5d\x84\x34\x9f\x1d\xd5\x8b\xfb\xec\xe8\x9e\xce\xe3\xb3\xca" - "\x38\xe7\x7d\x56\x39\xac\x7d\x9f\x55\x9c\x95\xee\xb3\x8a\xed\xb7" - "\xc7\x67\x95\x6e\xd2\x7c\x56\x91\x2b\xee\xb3\x8a\x38\x31\x9f\xbd" - "\xd0\xdb\x42\x5b\xf0\x38\xb8\x5e\xc1\xf1\x98\xd3\x10\xfe\x55\x35" - "\x04\x6b\x40\xf8\xed\x66\xfd\xcd\x70\x24\xd0\xc9\x6d\x7e\x7b\xb6" - "\xf9\xad\x6a\xf3\x5b\xdd\xe6\xb7\xa6\xcd\x6f\x5f\xeb\x6f\xf0\x91" - "\xfb\x15\x45\xe5\x16\xd0\x60\xe9\x7a\x45\x55\x10\x7b\xde\x2f\xca" - "\xac\xc5\x3a\xce\x4f\xa8\xec\x6b\x97\xd3\xc6\xee\x0a\x44\xb7\x52" - "\x34\x8a\x4f\x45\x0f\x5e\x52\x54\xed\x69\x59\x0e\x12\x4f\xd9\x47" - "\x47\xb7\xa4\x23\x4b\xae\xf7\x84\x97\x16\x01\xa6\x0c\xa0\xfb\xd2" - "\x34\xf7\x41\xde\x0f\x80\xdd\x0c\x55\xf1\x06\xe0\xd9\xdf\xd0\xe7" - "\x14\x55\x9b\xf0\x7b\x3e\x19\x5f\x8a\x2c\xca\xc7\x75\x34\xb3\x16" - "\xb3\xf7\x04\x83\xf2\xf1\x3e\xf4\xa6\x24\x6d\xe6\x72\x8b\x47\x75" - "\xfd\x09\x94\x45\x59\xb4\x29\x29\xc0\xd3\xeb\xf7\xa0\x25\xf5\x74" - "\x5d\x8a\x89\x36\x56\x4f\x2d\xc5\xdf\x61\xeb\xaa\x93\xcb\x50\x95" - "\xe1\x04\xc2\xed\x19\xc6\x67\xb5\x61\x0f\xf9\xee\x8b\xaf\x81\xb4" - "\x2a\xc3\x76\x54\x09\xbf\x4b\xe7\x9c\x87\xf7\xac\x1e\x5f\x5d\xbf" - "\x1d\x99\x73\xbd\x23\x2c\x6a\xef\xc1\xb4\xda\x3b\xb0\xb2\x1e\xca" - "\x96\xeb\x3d\x1c\x97\xb5\x0a\xca\xc1\xec\xb9\x99\xe7\x3d\x9c\xc9" - "\xb7\xe1\x18\xd3\x27\x60\xce\x83\xeb\x7d\xe0\x7a\x1f\xef\x40\x5c" - "\x3e\x5c\x36\x41\xfd\x96\x1b\xbc\x19\xca\xfe\xec\x44\x9d\x1b\xa2" - "\x97\xb9\x69\xa4\xe1\xad\x3a\x41\x54\x17\xe6\x86\xf8\x91\x7c\x3d" - "\xe4\xe4\x5b\xe1\x20\x5f\xb6\xbc\x2a\x19\xf9\x1e\xf3\x13\xcf\x37" - "\x94\x2d\xaf\x56\x4e\xbe\x29\x0e\xf2\x65\xcb\x1b\x24\x27\x5f\xd1" - "\xf9\x5f\x74\x6e\x18\x5b\xde\x74\x19\xf9\x1e\x1f\x20\x9e\x6f\xf0" - "\x66\x79\x58\x38\x2e\xde\x47\x00\x58\x90\x87\x83\xe3\x0e\xde\x3f" - "\x64\xb3\x3c\x0c\x7c\x2f\xba\xfe\x0f\xc6\x80\x3c\xff\x7f\xef\xd0" - "\xff\xf2\x7c\xff\xfd\x31\x47\xbe\x97\xe7\xf7\xff\x13\xc5\x3f\xd6" - "\xba\xe0\xfb\x20\xba\x57\x62\xba\x65\xfd\x03\x41\x96\x5e\xc1\xcf" - "\xbf\x63\x09\x42\x2f\x2c\x85\x76\x2e\x1f\xf5\x78\xa1\x10\xa1\xa5" - "\x05\x88\xca\xa6\x2c\xd4\x8e\xc5\x35\x54\xb5\x29\x10\xc7\x2b\xf3" - "\xe6\x24\xa3\xe2\x8f\x90\x7e\x28\x0e\xa1\x86\x05\x3a\x44\xf2\x78" - "\x20\x28\x2b\x35\x08\x85\x9b\x11\xee\xab\x68\xf8\x16\xac\x13\x7e" - "\x15\x62\x6a\xbe\x11\xb7\x99\x3d\xe0\x3e\x13\x60\x17\xf2\x30\xa2" - "\x5d\x16\x83\x22\x68\x3e\x73\x9d\x01\x34\xa5\x81\x5e\x1f\xfc\x3c" - "\x9d\xa6\x43\x2b\xe0\xff\x0b\x8a\x13\x0f\x29\x0d\x88\x2a\x02\xad" - "\xd9\xf4\xee\x09\x8d\x5e\x71\xa2\x01\xeb\x4f\xd0\xb9\xf5\x69\x57" - "\x71\x7f\x7c\x62\xfa\x3b\xa0\x79\xf1\xb5\x3b\x2d\x06\xea\xc9\x78" - "\x44\x7d\x6b\xc0\xda\xfe\xc4\xe8\x43\x10\x99\x1c\xf4\xc7\xb8\x59" - "\xd4\x51\x2b\xf0\xfd\x38\x1f\xdc\xcf\xb9\xd6\x02\x76\x55\xbf\x11" - "\x88\xcb\x0b\xf6\x35\x96\x2e\xc6\x6d\xcc\x89\x8a\x31\xfe\x74\x13" - "\x6e\x33\xa0\xad\xe8\x73\x09\x7e\x33\x7a\x7e\x39\x7d\x8c\x56\x7b" - "\xe9\xe8\xac\xee\x41\x55\x0d\xd7\x50\x69\x52\x0b\x3a\xa7\x38\x51" - "\x89\x9f\x7d\x5d\x1d\x95\xde\xa0\x8e\x5a\x05\x65\x28\xb3\x96\x17" - "\x3f\xcb\x9a\x8e\xfb\x2f\xd8\x32\xd6\x1d\x4a\x11\x2f\x23\xfd\x4e" - "\x9f\x9e\xe1\x1a\xda\x80\x6d\x58\x9a\x7a\x0d\xca\xf2\xe3\x34\x6c" - "\x67\x3a\x37\x2a\xa2\x21\x4d\xd7\x97\xf4\xe7\xfd\xb0\x02\xf7\x0b" - "\x41\x5b\x30\x9a\xf4\xd1\x78\x8f\x66\xc6\xe0\x40\xac\x07\x3d\xaf" - "\xc1\x7c\xe7\x8a\xe2\x87\xf1\xb8\xcc\x13\x75\x94\x44\x6d\xf4\x03" - "\xc3\xff\x4a\xfb\x62\x3b\xfc\x38\x06\x9e\xf7\xa7\x73\x8a\x1f\xb6" - "\xb2\xbc\x25\x12\x3f\x0f\xae\x19\x0c\xcf\x8c\xa4\x73\xbd\xb4\xf8" - "\x3a\x38\x5f\xc6\x9e\x8f\xb6\x39\x1f\x0d\x65\xce\x67\xcf\xd7\xb1" - "\xe7\x63\x6d\xce\xc7\xc6\xf7\xc5\x7d\x76\x3f\xaa\xf0\x3b\x41\xfb" - "\x16\x04\xe7\x27\xe0\xef\x01\xcc\x3b\xf9\x78\x07\xb1\xd7\x4d\xa8" - "\x57\xfc\xe8\x7f\x1d\x70\x05\xe7\xa7\xda\xdc\x3f\xf5\xdb\xe4\x00" - "\x84\xf1\xd9\xf4\xee\x8f\xc3\xf5\x6e\xbd\xfc\x48\x3f\xcf\x0f\x81" - "\x8c\x2d\xa0\xbd\xb4\xcd\x4f\xaf\xf8\xd1\x03\xb7\x89\x0d\xc0\x15" - "\xe1\x1a\x2d\x7e\xa6\xad\xfd\xa7\xcf\x9f\x3f\x77\xbe\xb6\x7f\xac" - "\x36\x76\x76\x8c\xf6\xcd\xb9\x89\x73\x12\x46\xf4\x8f\xed\x86\x90" - "\x0d\x76\x54\xf4\x72\x6f\xda\x92\x3b\xb9\xac\x3a\xdf\x84\x68\x4a" - "\x05\x6d\x77\x0b\xca\x05\xbf\x9a\x7b\xcd\x2c\x31\xaf\x9f\x09\x75" - "\xe7\xc5\xe2\xd2\xc5\xcf\x83\xed\x7f\x64\xf6\x8f\xa9\xd6\x22\x94" - "\x01\xe7\x4b\x17\x1f\xc5\x69\x67\x99\xb4\x58\x84\x98\xbe\xac\xc5" - "\x1e\xe8\xb0\xf6\x1a\xd3\x1f\x76\x45\xf1\x53\x6f\xa6\xef\xef\x06" - "\xa2\x4c\xcb\x3d\xd0\xdf\x53\x8f\x51\x07\x2c\x7a\xea\xef\x96\x1a" - "\x0a\x73\x8e\x6f\x35\x65\xe8\xa9\x64\x0f\x84\xcf\x7f\x93\x0a\xe9" - "\x70\x1e\x9f\x63\xf2\x61\x7c\xfd\xd3\x0c\x7c\x1d\xee\x1f\xc3\xff" - "\xa7\xe5\xd3\x67\xbf\xd5\x00\x6f\x61\x78\xef\x8f\x07\x71\x59\xb5" - "\x7d\xf0\xb7\x87\x1f\x0f\xe1\xf2\x81\x2d\x4a\x95\x05\x70\x7d\x12" - "\xf2\x84\xeb\x77\x58\xf2\x26\x97\xe1\x38\x60\x7a\xf7\xc7\x04\x7a" - "\x79\x8f\x67\x8a\xd6\x21\x8f\x82\x75\x50\x37\xd7\x21\xb7\xa6\x77" - "\x7f\xca\xd7\xbb\x0d\xa8\xc5\xb6\x85\x6c\x3c\xaf\x53\x68\x24\xa4" - "\x6d\xd7\xa3\xf7\x32\x70\x1a\xd4\xc1\x06\xb1\xb8\xd2\x08\x5c\xd1" - "\xe8\x37\x34\xc8\xa2\x9e\xbc\x8f\x06\xbb\x35\xf9\x0d\x8d\xf7\x8e" - "\x07\x6c\x41\x1d\xa3\x7d\x26\xef\xab\x57\x9c\x2c\xfd\x7f\xa0\xc4" - "\x53\x71\x9d\x5e\xff\x62\xf1\x67\x8d\x46\xa8\xdb\x33\x4b\xb6\x37" - "\x1a\xe0\xf7\xcc\xa0\xad\xf0\xbb\xbc\x74\x2b\xd2\xbe\x84\xf9\x57" - "\x4d\xbf\x17\x63\x69\x93\x7f\x05\x70\xd6\xda\xbf\xa1\xef\x4e\x94" - "\x21\xcf\xa9\x48\x79\x73\x1d\xf8\x04\x44\x85\xeb\xe1\x77\x22\xa2" - "\xaa\x8c\x66\xa6\xcf\x3f\x75\x18\xee\xbb\xaf\x44\xb8\x3f\x9f\xa6" - "\x32\x4c\x3b\xae\x19\x21\x86\xd5\xb9\xe3\xf1\xe0\x16\xd5\xe7\x3a" - "\x7c\x4f\x54\x03\xfb\x1d\xec\x3a\xfb\x1d\xec\x3a\xf3\x1d\x6c\x6c" - "\x4a\x34\xf9\x0e\x86\xbf\x7f\x85\x47\x2b\x69\x9c\x1f\xfe\x26\xd6" - "\xbd\x01\x70\xb0\x40\xe7\x65\x5e\xa0\xeb\x99\x7f\x0d\xa9\xab\x0c" - "\x75\xa8\xba\xbe\x0c\x7d\x98\x84\xd4\xf4\xf5\xb8\xae\x15\xa5\x47" - "\x11\xbd\xee\x53\xed\xae\xd4\x52\x77\x33\xee\xcb\xb8\xae\xe9\xe6" - "\xbd\x4c\x81\xbf\x01\x78\x65\xcc\x47\x03\x36\x5e\x43\x01\x51\xe7" - "\xd3\x99\x35\xa1\xf0\xfe\x7d\xa6\xeb\x3a\x6d\xeb\x75\xdd\x23\xcd" - "\xd7\x75\x7d\xbd\x0d\xe4\xbb\xd9\xb4\xcb\x2a\x84\xc7\xe2\xd2\xef" - "\xfe\xcb\xb8\x11\xf7\x5f\x37\x18\x90\xa9\xc7\xe7\x3a\x8c\x65\x78" - "\xb6\x2f\xfe\xd6\x92\xb6\x08\xa9\x2c\xff\xd1\xa1\xca\xb8\x6b\xe8" - "\x29\xf0\x3d\xfe\xae\x50\x74\x8e\x7c\x57\x30\x83\x26\xc2\xdf\x16" - "\x1a\xaf\xeb\x28\x5a\x1d\xa3\x1d\x37\x43\x8b\x9a\xb7\x0c\x0d\xaa" - "\x4e\xfe\x0c\xa5\x35\xd3\x67\xab\x57\x58\x10\xee\x73\xa6\xdf\xfd" - "\xe9\x30\xed\x13\xa3\x3d\xa2\xfb\x01\xb7\x29\x83\xb9\xd8\x71\x32" - "\x53\x5e\xec\x38\xc9\xac\xff\x81\xbf\xc1\x81\xff\x4a\xb6\x5f\xc3" - "\xfe\x04\xbf\x5e\x33\x50\x61\xe0\xbb\xca\xda\x8f\xc0\x6f\x35\x3c" - "\xbf\x31\x7e\x86\xeb\x2e\xc4\x82\xbf\xce\x13\x1f\x56\x34\x80\xff" - "\xf6\xe3\x3c\xa2\x4a\x77\x24\x19\x29\xd0\x5d\x54\x85\xf1\x34\x33" - "\x9f\x05\xfb\x71\x7b\x4b\x99\x7b\x33\xb4\x37\xf8\x5b\x66\xe3\xe6" - "\xa1\xd1\xcd\xea\xc9\xf9\xad\xea\xc9\x5b\x1d\x7c\xd7\x24\xfe\x9c" - "\x81\x3c\x2a\x6a\x7f\x20\xfe\x9c\xc7\xfa\x13\x8f\x7f\x5b\xa8\xf3" - "\x32\x35\x81\x3f\x1b\xc1\x9f\x09\x7a\xf4\xc1\x7c\xa4\xae\xae\xab" - "\xc1\xdf\x7c\xba\x86\x42\x4d\x0e\xf3\xa7\x2d\x95\xa5\x3f\x33\x7e" - "\xdd\x09\x7e\x35\x65\x6f\xd1\xe1\x6f\x9d\x37\xfd\x9a\x04\x7e\x6d" - "\x04\xbf\x5e\xe6\xfc\x6a\x6e\x02\xbf\x36\x81\x5f\x9b\xc0\xaf\xec" - "\xf7\xd0\x69\x33\xc0\xaf\xf8\xdb\xd9\xbb\x65\x29\xf8\x7b\x28\xfe" - "\xee\x84\xfd\x8a\xc7\x5c\x5b\x16\xea\x7c\x99\xef\xa0\x6f\xea\xd0" - "\xc6\x37\x90\xc7\x40\x23\x52\xa4\xed\x47\x2a\x28\xa7\xea\xd1\x3d" - "\x88\x82\xfc\x00\xf7\xe7\x10\xf6\x6f\xf5\x1e\x33\x5a\x32\x09\xf5" - "\x35\xe5\x10\x3f\x57\x9b\xf6\xe2\x7e\xdf\xc0\xc6\x85\x3a\x6a\x43" - "\x12\x1a\x8e\x7d\x3e\xf6\xbc\x16\x1d\x89\xa8\x44\x6d\x7d\x6e\xc9" - "\x8b\x8a\x00\x3f\x25\x63\xbf\xcb\xaf\xb7\xa7\x93\x9d\xaf\xb7\xbf" - "\x9c\xbc\x57\x6f\x6f\x75\xbd\xfd\x25\x45\xb8\xde\x9e\x1e\x23\xaf" - "\xde\x9e\x1e\x7d\xaf\xde\xde\x09\xf5\xf6\x74\x40\xdb\x7a\x7b\x93" - "\xb7\xcc\x9f\x3e\x3b\x66\xc6\x9c\x19\x73\xfe\xa2\x7d\x63\x51\xc2" - "\xf4\x05\x84\xbd\xf0\xf8\x8b\xce\x6c\x09\xa2\xde\x87\xf6\xfa\x3b" - "\x4d\x0d\xda\xd5\xa7\x86\xb2\x4c\xd1\xb8\xd1\xd9\x07\xe3\x2d\xd9" - "\x07\x0d\xef\x03\x0f\xc7\xf5\x3b\x17\x38\xf6\x05\xc5\xc5\xcd\xff" - "\xf2\x05\xfe\x39\xff\x12\xc2\xff\x93\xef\xbb\xa9\x25\x78\x0e\x64" - "\xfe\x7a\xba\x0e\xcf\x81\x2c\x3f\x8c\xb9\xc5\x99\xcb\xf7\x47\x82" - "\x7e\x98\xa2\x41\xcd\x53\x22\xa9\x35\x3f\x23\x0f\xef\x1a\x34\xd6" - "\x62\xa1\xe9\xd2\xd4\x4b\xc0\xfb\x2e\xd4\x95\x4e\xbe\x84\x30\xd7" - "\xb9\xa0\x38\x3f\x46\xbb\x78\x19\xfe\xeb\xaf\x5d\xfc\xee\x99\x0b" - "\x8a\x5a\x66\x1d\x90\x4c\xc8\xcf\xf2\xe8\xb0\x6c\xfc\x8d\x16\xea" - "\x2d\x55\xb8\x9e\xae\xdd\x35\x47\x4f\xbd\xd3\x82\xd0\x3b\x8b\x91" - "\x1b\x5e\xf3\xa2\xb4\x2f\x2e\x47\x6d\x68\xb8\xe9\x0c\x0d\x7c\xaa" - "\xf6\x9b\x0b\x7a\xaa\x08\xce\xe3\xf5\x48\x1b\xd4\x5e\xda\x15\x50" - "\x76\x28\x97\x7e\xc3\x7a\xfa\x94\xc1\x67\x72\x99\x9b\x16\x51\x4d" - "\xef\xea\xc1\x5e\x3f\x32\x1c\x65\x15\x9c\x5b\x0d\xe7\xc8\xf7\xc3" - "\x5a\x37\xf3\xbb\x67\x06\xe0\xb8\x06\x38\x56\x5c\x51\xe8\x0b\xf1" - "\xba\x4f\x90\xaf\x01\x97\x05\xef\x8f\x6b\xda\x32\x34\xda\xbc\x65" - "\x68\xbc\x31\x6f\xf2\xd6\xe6\xbc\xc9\xf9\x38\xe6\x4d\xf4\x67\xbe" - "\x93\xc3\xf5\xe7\x98\x75\x27\x9b\x73\x5f\x2c\xc6\xfc\xeb\xba\x7a" - "\x66\xc9\xf5\xdc\x99\x41\x47\x53\xf2\x91\xf6\x65\x1c\xef\xf4\xe5" - "\x61\xf9\xb4\xe9\xf1\x08\x88\x77\xf9\x9f\xa1\xef\xc6\x42\xbc\x8b" - "\xb4\x8f\x77\x64\x5c\x81\x19\x91\xb8\x57\x89\x40\x03\xd5\xe2\x7a" - "\x83\x79\xe9\x8e\x16\xa8\x57\x50\x27\x30\xf6\x99\xf8\x07\xb1\xcf" - "\x5a\x3f\x70\xdd\xc1\xf1\x8d\xa9\xab\x6d\xea\x0a\xae\x1f\xf7\x1b" - "\x90\x0a\xd7\x0f\x1c\xff\x70\xfd\xc0\xe3\x75\xde\x67\xeb\x87\xf7" - "\x29\xa4\xfa\x00\x62\x5f\xb5\xa9\x8c\xa9\x23\xb8\xfc\x15\x26\x9b" - "\xb8\x87\xbf\xfb\xd8\xd4\x8f\x4c\x6b\xfd\xb0\xc6\x3d\xa8\x03\x26" - "\x5c\x3f\x16\xea\x1e\x69\x59\xc8\xd5\x8f\x29\xa7\x55\x88\x89\x89" - "\xef\xfe\x2b\xa5\x00\xea\x07\xee\x33\x33\x5b\xe3\x1e\xd4\x0f\x3c" - "\x9f\x88\x89\x7b\x6f\x43\xdc\xab\x87\xb8\x67\x80\x74\xa8\x17\x45" - "\x33\xd9\xb8\xc7\xd6\x87\xe6\x85\x6c\xdc\xbb\xac\x45\x2d\xfd\x71" - "\xdc\xfb\x40\x84\xaf\x9c\x6e\x13\xf7\xce\x8d\x90\x17\xf7\xce\x31" - "\xe3\x5f\xb0\x0f\x5b\xc0\x9f\xd8\x8f\x61\x1a\xda\x54\x91\x0f\xf1" - "\x6e\x42\x27\xf3\xdb\x7c\x61\xbf\xed\x64\xdb\xab\xee\xe0\xb3\xee" - "\xf5\xc8\x0b\xc7\x37\x1c\xd7\x0a\x45\xfc\x06\xf7\xd6\xd3\x4d\x42" - "\xbe\x3b\x72\xac\xc0\x26\xb6\xe1\x98\x86\xe3\x1b\x8e\x6b\x38\xc6" - "\xe1\xf1\x14\x50\x47\xea\x70\x7c\x7b\x2c\x85\xc4\x35\x1c\xef\xd2" - "\xce\x93\x58\x57\x19\x77\x0e\xa5\x8d\x41\x7d\xab\xf7\x99\x11\xde" - "\xab\x0b\xb7\x65\xd5\xa6\x1b\x08\xef\xbd\x85\x63\x1c\xf6\xed\x86" - "\x46\x12\xe3\x70\xbb\x86\xe3\x99\x5d\xbb\x06\xbe\x05\x9f\xe8\x70" - "\xbb\xc6\xf4\x4b\x50\x7f\xb8\xaf\x10\xeb\x90\x9e\xc8\x2d\xb7\x27" - "\xf2\x68\x7a\xb7\xd6\xcf\x5e\x8b\xd4\x06\x5a\xb5\x08\xae\xe3\xb8" - "\xae\xeb\x15\xfa\x58\x46\xc3\xf6\x79\x16\xea\xbb\x9e\xec\xc1\x9c" - "\xfb\x9a\x81\xe8\xa1\x4b\x13\x99\xdf\xa0\xf9\x39\xbd\x5f\xbb\x92" - "\x7c\xd7\x07\x7d\xef\x13\x66\xa4\xf3\xbc\x74\xd8\xc6\x6c\x4c\xa8" - "\xa7\xf3\xa2\xd2\x31\xd6\xa2\xfc\x91\x87\x29\x2f\x6a\x85\x39\x2f" - "\x6a\x15\xc1\x5d\xed\xde\x23\xc9\x08\x4d\x4c\x96\x8a\xbb\x5a\x66" - "\xff\x5f\xfa\x97\xc8\x3f\xd0\x53\x22\xdd\x2c\xbf\x44\xba\x03\x46" - "\x34\x73\xcd\xe9\xa8\x31\x3b\x75\x6b\x9a\x89\xae\xd3\x2e\x46\x8f" - "\x43\xac\xf4\x29\x37\x21\x54\xde\x80\x50\xf5\xd8\x59\xe0\xef\x54" - "\xdd\x2e\x8b\xc1\x4d\xaf\x38\x53\x0f\x7a\xb1\x0e\x62\xaf\x9b\x6d" - "\xec\x25\x71\xf6\x4c\x3d\x33\xa6\x3c\x3b\x75\x1f\xce\x2b\xbc\x0c" - "\x79\x43\xfb\xeb\x76\x41\x71\x61\xff\xa2\xa5\x08\xcf\x85\x75\x87" - "\xff\x57\xb6\xf4\x7c\x49\x07\xf7\x7b\xd1\xbf\x4c\x50\xc4\xff\x19" - "\xf5\xa5\xa7\x4c\x50\xe0\x71\x0c\xdb\x2c\xc5\x94\x05\xd2\xc8\xb8" - "\xa8\x62\x84\xcf\x67\xb4\xb8\x31\xbc\xcc\x02\xd7\x54\x35\x14\xa3" - "\x8c\x24\x0f\x84\xaf\x27\x63\xed\x8a\x11\xbe\x3e\x73\xbe\x8a\x19" - "\x07\xc1\xdc\x67\x2a\x46\xf8\x5e\x33\xa4\xbf\x67\xf1\x44\x59\x8b" - "\xd5\xa8\xbc\xa2\x8a\xc9\xa3\xbc\xe2\xff\x21\x9c\x07\x8e\xf5\xe5" - "\x15\x5f\xa3\xb5\x49\x1a\x88\x09\xc5\x70\xfe\x47\xb4\xf6\x8a\x2f" - "\xfc\xbd\x00\x47\x23\xba\xa4\xb8\xe0\x57\x5e\x61\x41\xde\xcb\x46" - "\xd2\x10\x8b\xe8\x6a\x3c\xbf\x32\x15\xdd\x07\x65\x1f\x88\xdf\x4f" - "\xaf\x38\xaf\xc6\xf3\xef\xab\x6b\xb2\x11\x9d\x36\xa5\xde\x42\x4f" - "\xb9\x6c\x49\x9b\x72\x05\x3f\xdf\x4c\x4f\xf9\x1d\x3f\x3f\x73\xb1" - "\x96\x1d\x7f\x5b\xcc\x8c\x15\xcc\x68\xf4\x43\xb8\xbc\xf8\xd9\xf8" - "\x99\x6b\xe7\xeb\xd8\xe7\x0e\x60\xca\x87\x9f\x8b\xf3\xb5\x7d\x2e" - "\xde\xdf\x5e\xfb\x2a\xf3\xdc\x2d\xf0\xb7\x07\xf8\x44\x83\x7d\x81" - "\x9f\x6b\xa1\x23\xdd\xe9\xb4\x48\x25\x73\x8f\xb1\x4e\xe8\x9e\x93" - "\xec\x3d\xcc\x58\x09\x7c\x4f\x33\xcd\x5c\xcf\xe4\x01\xed\x23\x33" - "\x4e\xe4\x89\xc8\x52\x64\xef\xc7\x5f\x73\x48\x7b\xf9\x6b\x0c\x69" - "\x2f\x89\x5f\x19\xbc\x4c\x89\x74\x07\xdf\xa9\x70\xdb\x7a\x4e\xf1" - "\xeb\xb0\x9b\x79\xfc\x12\xa9\xc4\x3e\xc7\xd8\xb1\xe2\x09\x63\xc9" - "\x8a\x23\xa6\x9c\x06\x84\x6c\x71\x03\xff\x7b\xb0\xf9\x2c\xb3\xe6" - "\x03\x65\x40\x56\x2c\x3d\x01\xe7\xed\xb1\x74\x71\x1a\x87\xa5\x3a" - "\xb3\x31\x95\xa6\x31\x96\x4a\x27\x2f\xc7\xf9\x94\x73\xe5\x99\xa0" - "\xc0\x38\xbb\xc3\xf0\xe5\x67\xf5\xd5\x13\x29\x48\x4d\xde\xa9\x8e" - "\x99\x07\xfa\x44\x4a\xa9\x1a\x97\xd7\xfa\x2e\xb8\x1c\x59\x16\x2d" - "\xb2\xbe\xcb\xda\x16\x3f\xc8\xfb\x0a\x62\xef\x39\x8e\xf3\xb7\xda" - "\x01\xfc\x86\xac\xf7\x58\xaf\xcf\xb2\xe8\xa0\xec\x03\x98\x7b\x08" - "\xee\x2e\x08\x60\xe8\xe2\x43\x6d\x71\x77\x7f\x0a\x02\x22\x0c\x1c" - "\x6b\xf2\x35\x78\xce\x45\xe2\xff\x94\x6f\xcc\xcd\xbf\x44\x62\xdf" - "\x52\x6c\xfa\x78\x1b\x5c\xb0\xf9\x1b\x85\xf2\x5f\xca\xcb\x3f\x12" - "\xf2\x4f\x86\xfc\x31\x87\x9b\x8c\xfb\xee\x2e\x32\xfb\xbe\x3e\x91" - "\x4c\xf2\xb7\x62\x97\xce\x0e\x2b\x88\x5f\x8c\xc7\xac\x5e\x0a\x22" - "\x71\xf5\x4c\x1e\xbe\x8e\x19\x2b\x45\x59\x8a\x2d\x6d\xc6\x4a\xd9" - "\x8e\xa5\xdb\x95\x6a\x60\xc7\x49\x5d\xea\x87\xaf\xc1\x7d\x64\x98" - "\x8b\xee\xb8\x50\x43\x71\x63\xa5\x7e\xc6\xe7\xfd\x4b\x93\xce\xd9" - "\x8c\x95\xba\x68\x22\x75\xff\xd2\x84\x26\x0a\x51\x70\x5e\x45\xd2" - "\xcf\xe4\xda\xa6\x73\x63\x11\x49\x3a\x1e\xe7\xcd\xf6\x17\xd7\x7f" - "\xbb\x0f\xf7\x17\x5e\x9a\x65\xed\xa3\x15\xd1\xc0\x12\xb8\x72\xc3" - "\x29\x8e\x2b\x37\x9c\x12\xe7\xca\xbf\xf5\x76\xcc\x95\xaf\xf9\x71" - "\x5c\xd9\xb0\x92\xd4\x7d\xc3\x0c\x52\xf7\x0d\xfe\x8c\x2d\x7b\xd1" - "\x75\xe6\x8f\x12\x8b\xab\xdc\x10\x83\xa1\x8d\xc0\x3d\x76\x2d\xae" - "\x69\xc3\x95\xf1\x18\xb3\xdf\x57\xbf\x04\x5c\x99\xce\x7d\x91\xed" - "\x03\xfc\x2d\x06\x6c\xaf\xac\x36\x1a\x11\x4e\x87\xb6\xad\x16\xf3" - "\xe4\xaf\x2d\x35\x54\x11\xd8\x0f\x0e\xe0\xd1\x89\xf1\xb6\x3c\xba" - "\xe9\xdd\xdf\xb2\x85\xf9\xf3\xef\xa3\x4d\x3c\xfe\xfc\xdb\x69\x2b" - "\x7f\xc6\xe5\xc3\x9c\x19\xf3\x67\x13\xee\x83\xed\x3f\x34\x1e\xf3" - "\x67\x53\x9e\x2d\x7f\xbe\xbc\xfb\x26\x7f\xee\x65\xc3\x9f\x93\xad" - "\xfc\xb9\xbe\xeb\x3d\xfe\x7c\xbb\xf8\xb3\xb5\xdf\xa0\x2d\x7f\xbe" - "\xbc\x54\x1e\x7f\xbe\x9c\x72\xb7\xf0\x67\xc1\x7e\x01\x01\xbf\x01" - "\xce\xeb\x4d\x02\xfc\x99\x06\xfe\xbc\xd1\x01\x7f\xc6\xf5\x03\x73" - "\x67\xcc\x95\x1f\x8b\x05\x2e\x02\xb1\x01\x73\x66\x2b\x87\xb6\x72" - "\x67\xcc\x99\x31\xb7\xb6\xed\x0f\x92\xc6\x9f\x2f\xc7\x71\xfc\xb9" - "\xe7\xd5\x02\x1e\x7f\xfe\x3d\xd6\x9e\x3f\xff\x9e\x6c\xcf\x9f\x7f" - "\xdb\xcc\xf1\xe7\xdf\x42\xf8\xfc\xf9\x46\xa6\x3d\x7f\xfe\xfd\x88" - "\x18\x7f\xc6\x9c\x19\xf3\x67\xac\x3b\x30\x77\x86\xff\x57\x71\xb8" - "\xfb\xfd\x86\x3c\xfe\xfc\x7b\x83\x73\xfc\xd9\x30\x51\x98\x3f\xff" - "\xa6\x11\xe7\xcf\xbf\x69\x84\xf9\xf3\xd5\x1b\x1c\xe7\xb9\x7a\xa8" - "\xf3\xf3\xe7\xab\xb1\xc2\xfc\xe6\xea\x6c\xcc\x21\xf4\x0a\xc3\x04" - "\xcc\x9f\x6f\x2d\x77\x36\x4c\x10\xe6\xce\x57\xcf\x12\x8e\x61\x88" - "\xb4\xe7\xce\x70\x8f\x20\x77\xbe\xe6\xc3\xde\x33\x81\xcf\x9d\x49" - "\x1e\xd0\x5e\x0e\x12\xe7\xce\xd7\x2a\x49\xfb\x79\xad\x90\xb4\x9f" - "\xc4\xa7\xf6\xdc\xf9\x5a\x62\xfb\xdc\x99\x60\x88\x29\xa7\x28\x77" - "\xbe\x76\xd0\x9e\x3b\xff\xa6\x11\xe6\xce\x0d\x79\x1c\x8e\x1a\x86" - "\xf0\xb9\xf3\x75\xf7\x3b\x83\x3b\x8b\x62\x2b\x96\xcf\x9b\xaf\xff" - "\x20\x9d\x37\x37\x74\x95\xc6\x9b\x31\xe6\x84\x78\x73\xc3\xc4\xb6" - "\x98\xe3\xf3\xe6\x86\x79\xc2\xbc\xb9\x61\x35\x9f\x37\xe3\xfc\x85" - "\x78\x73\xc3\x5e\x5e\xfe\x76\xbc\xb9\xe1\x38\x9f\x37\x93\xeb\x38" - "\xde\x7c\x23\x99\xed\x8f\x38\x24\x9d\x37\xdf\x98\xe4\x98\x37\xdf" - "\x88\xe1\xf3\xe6\x1b\x83\x09\x3f\xbe\x91\x41\x78\xf3\x8d\x10\x96" - "\x7f\x97\xda\xa6\x73\xbc\x99\xa4\xdb\xf3\xe6\x1b\x9b\xdb\xe1\xcd" - "\x81\x4e\xf3\x66\x0a\x15\x94\x59\x79\x33\xfc\x6f\xe5\xcd\x16\xe0" - "\x92\x45\xc0\x09\xe0\xa8\xc3\xf3\x25\x70\x9d\xbb\xa0\x68\x9c\xe8" - "\x98\x3b\x9b\x6b\x38\xee\x6c\xf2\x27\x75\xdf\xd4\x9d\xd4\xfd\xd6" - "\xca\x9b\xdc\xf9\x91\xc4\xe2\xca\x15\x37\xb9\x73\xcd\xae\xc5\xc7" - "\xda\x70\x67\x6c\xbb\xd6\xfd\x0c\x47\x6e\x64\xc6\xa6\xe8\x71\x3b" - "\xff\x52\xca\x19\x3a\x03\xda\x76\x68\xc3\xf4\xc4\xbe\xad\xbd\x0b" - "\xa0\xad\xe4\xf8\x75\xe3\xa1\x9b\xfc\x3a\x85\xe9\xa3\xae\x61\xf8" - "\xf5\x5b\xc7\xa8\x42\xc8\x1f\x0e\x37\xcc\xad\x31\xc7\x06\x6e\x7d" - "\xa2\x70\x3d\x7d\xac\x68\x3d\x5d\xd1\xf4\x6e\x63\x83\x95\x63\x67" - "\x42\x5a\x16\xa4\x1d\x2e\x86\xeb\x1b\x99\xc3\x0d\x6c\x7f\xea\x1d" - "\x78\x26\xbe\xaf\xe9\xdd\x26\xad\xf5\x5a\x68\xa7\x4f\x10\x2e\xde" - "\x52\x63\xb9\xcf\x96\x8b\x37\xcd\xb6\x72\xf1\x2c\x78\x5f\xcc\xad" - "\xac\x5c\xdc\x02\x5c\x9c\xf6\x21\xfd\xd9\x7c\x3e\xde\x3c\xca\xca" - "\xc7\xb3\x6c\xf9\x78\xbc\x95\x8f\x37\x6d\x90\xc9\xc7\x6b\xee\x66" - "\x3e\x8e\xb9\x38\xe6\xdf\x98\x8b\x63\x6e\x8e\xf9\x38\xe6\xe6\x16" - "\x96\x8f\x17\x39\xc3\xc7\x81\xaf\xd1\xf7\xfd\x92\xc2\xf0\x71\x85" - "\x2d\x1f\x6f\xee\x2e\x8f\x8f\x37\x7b\xda\xf2\x71\xf0\x67\x8d\x54" - "\x3e\x8e\x7d\x6f\xf7\xdd\x15\x8f\x39\x02\xff\x61\x5f\x39\xfc\x4e" - "\xc7\xfa\x11\xfb\x0d\xfb\x0c\xfb\xce\x29\x3e\x0e\xb8\xab\x30\xfe" - "\xf7\xf8\xb8\xae\x0d\x1f\xc7\xfc\x1b\x6c\x57\x8b\x79\x79\x75\x29" - "\xd8\x66\x1e\x70\x73\xe0\xe5\xf2\x39\xb9\xd1\x68\xcb\xc9\x8b\x7a" - "\xda\x72\xf2\x16\xa3\x3d\x27\x6f\xf5\xb4\xe1\xe4\x27\xf4\x8a\xa6" - "\x00\x86\x8f\xbf\x85\xb9\x76\xe3\x56\x1e\x1f\xa7\x14\xe3\xec\xf9" - "\x78\xeb\x44\x31\x3e\x8e\xc7\xd0\xb5\xed\xcf\xb6\xf8\x58\xfb\xb3" - "\x5b\x57\xca\xe3\xe3\xad\x2b\x38\xbd\xd0\xb8\x82\xb4\x29\xad\x7e" - "\x62\x1c\xbd\x49\x65\xcb\xd1\x5b\x9b\x39\x8e\x9e\x60\xc3\xd1\x1b" - "\x27\x88\x73\xf4\x46\x86\x13\xd2\xaa\xd4\x7d\x38\x2f\xcc\xad\x70" - "\x5f\x88\x96\x99\x7f\x6f\xde\x86\xf9\x15\xee\xe3\x80\x77\x02\x8e" - "\x65\x4e\xb4\xe5\xea\xf8\xfb\xa1\x23\x3e\x15\xff\x16\xea\x8b\x39" - "\x15\xe6\x53\x56\xfe\x8b\xaf\xc7\xbc\xea\xf6\x72\x2a\xb3\x5a\x98" - "\x53\x99\xfb\x31\x7c\x99\x99\xb7\xd9\x6a\xc4\x6d\xe3\xad\xe5\xec" - "\xad\x46\x61\xce\x6e\xce\x23\xfc\xa6\xd5\x84\xfd\xc2\xe7\xec\x70" - "\x8f\x20\x67\x37\x97\xb3\xf7\x18\xf9\x9c\x9d\xe4\x01\xed\xf4\x79" - "\x71\xce\x6e\x59\x46\xda\x6d\xcb\x78\xd2\x6e\xb3\x3e\xb6\xe3\xec" - "\x16\x7f\x5b\xce\x8e\xfd\x6f\xcf\xd9\x09\xa6\x98\x72\x8a\x72\x76" - "\xcb\x3c\x7b\xce\xde\x38\x01\x73\x76\x41\x5c\x51\x68\x22\x1f\x57" - "\xf4\x0d\xa3\xc5\xca\xdd\xd7\xe0\xfc\x0e\xb5\xe5\xee\x77\x20\xd6" - "\xd4\x1c\x7f\xc7\xef\x44\xe7\x49\xe3\xef\xcc\x3d\xe5\xd2\xf8\x3b" - "\xc6\x9f\x00\x7f\xa7\x90\x4f\x5b\xfc\xf1\xf8\x3b\x85\x06\x09\xf2" - "\x77\x0a\x85\xf2\xf9\x3b\xce\x5f\x80\xbf\x53\x28\x91\x97\x7f\x5b" - "\xfe\x4e\xa1\x1c\x3e\x7f\x27\xd7\xdd\xe4\xef\x94\x22\x90\xed\x0f" - "\x69\x96\xcc\xdf\x29\x45\x6f\x87\xfc\x9d\x52\xf4\xe3\xf1\x77\x0a" - "\x31\xfd\x1d\x7a\x4a\x31\xd6\x88\xf9\x3b\xa5\xb0\xf2\x7a\xa3\x6d" - "\x3a\xc7\xdf\x49\xba\xd1\x96\xbf\x03\xa3\x6f\x5a\xa3\x88\x6d\x87" - "\xbf\x8f\x76\x9e\xbf\x7b\x9e\xe0\xf8\xbb\xe7\x09\x87\xfc\x9d\xa2" - "\x7c\x1c\xf2\x77\xaa\x9b\xea\x26\x7f\xa7\x3c\x62\x98\x38\x40\x79" - "\x8c\x61\xe2\x00\xe5\xe1\x2e\xc2\xdf\x2b\x04\xf9\x3b\xd5\xe5\xaa" - "\x0d\x7f\x3f\x85\x79\x3b\xb4\x79\xa7\x30\x3f\xc0\xe3\x47\x80\xb7" - "\xd7\x94\xce\x67\xae\x3b\x8d\xf9\x3d\xe6\xf4\x70\x5e\x9f\x81\xff" - "\xb7\x30\xf7\x9c\xc0\xe3\xb9\x18\x1e\x7f\x81\xe1\xfc\x27\x88\x4f" - "\xba\x8c\x80\x7b\x8f\xdd\xe4\xfc\x14\xb5\xb7\x0d\xe7\xaf\x70\xc0" - "\xf9\xcb\x80\xf3\x1f\x06\xce\x5f\xda\xb4\x86\xaa\xb3\xe1\xfc\x87" - "\x81\xf3\x97\xb6\xe1\xfc\x35\xc0\xf9\x4f\xe1\xfb\xf0\x3d\x4d\x6b" - "\x94\x1a\xde\xf5\x50\x56\xe6\xfa\x6b\xcc\x81\xaf\x3f\x06\xd7\x9f" - "\x60\x34\xc2\x1a\xe5\x68\x1b\x8d\x50\xc6\x68\x04\xea\x3e\x13\x6d" - "\xab\x11\x28\x65\x8e\x64\x8d\x40\xb9\x4f\x77\xa8\x11\x28\xe5\x41" - "\x99\x1a\xa1\xe2\x9e\x46\x90\xa9\x11\x28\xf7\x41\xb2\x34\x02\xe5" - "\x1e\xd0\x46\x23\x54\xdc\xd3\x08\x9d\x40\x23\x50\xee\xbe\x37\x35" - "\xc2\xf2\x9e\x57\x37\xf6\x24\xe3\xef\x19\x8d\xb0\xa6\x8b\xaf\x9d" - "\x46\x58\xd3\x25\xc0\x46\x23\x94\xe9\x29\xe5\x84\x9b\x1a\x81\xa2" - "\x0a\xf8\x1a\xa1\xfb\x4a\x3b\x8d\x40\x75\x59\x24\x4b\x23\x50\x5d" - "\xb6\xc9\xd2\x08\x54\x97\xad\xa4\x7c\xe7\x70\xf9\x66\x91\x76\xab" - "\x4b\xc8\x4d\xdd\x40\x51\xa3\x6d\xd3\xda\xd5\x0d\x94\xc7\x20\x41" - "\xdd\x40\x51\x6a\x51\xdd\x40\x51\x6a\x51\xdd\x40\x75\x3d\xcb\xe3" - "\x77\x54\xd7\x1d\x77\x84\x6e\xa0\xba\x8e\x15\xe4\x72\x54\xd7\x49" - "\x37\x75\x03\xe5\x11\x70\xcb\x75\x03\xe4\x29\xa8\x1b\xa8\xae\x95" - "\x0c\xaf\xa2\x3c\x06\xdb\xe9\x06\x7c\x8f\x90\x6e\xa0\xba\x29\xd8" - "\x7b\x02\x78\xba\x81\xcd\x03\xf8\xc1\x43\xa2\xba\x81\xea\xb6\x9f" - "\xf0\x85\x6e\xab\x09\x5f\x60\x7d\xdc\x56\x37\x50\xdd\x62\xda\xd5" - "\x0d\x2c\xa6\x98\x72\x8a\xe9\x06\xaa\xdb\x36\x3b\xdd\x00\xcf\x14" - "\xd7\x0d\x9e\x99\x7c\x5c\x79\x0e\xe4\xe9\x06\xaa\x5b\xf3\x1d\xa3" - "\x1b\xc4\xb1\x36\x96\xa7\x1b\xa8\xfb\x2b\x25\xeb\x06\xca\x53\x21" - "\x49\x37\x30\xf8\x13\xd2\x0d\x9e\xe3\xda\xe2\x8f\xaf\x1b\x3c\x67" - "\x08\xeb\x06\xcf\x65\xc8\x56\x37\x30\xf9\x0b\xe9\x06\xcf\x1d\xbc" - "\xfc\xed\x74\x83\x67\x39\x4f\x37\xb0\xd7\x71\xba\xa1\x7b\x3c\xdb" - "\x6f\xb3\x5f\xba\x6e\xe8\x3e\xde\xb1\x6e\xe8\x3e\x89\xaf\x1b\xba" - "\x0f\x20\x31\xb5\xfb\x0a\xa2\x1b\xba\x07\xb1\xfa\x63\x9f\x6d\xfa" - "\x4d\xdd\xc0\xa6\xdb\xeb\x86\xee\x05\xed\xe8\x06\x4f\xd3\xe6\xa1" - "\xd1\x2d\x7e\x43\xe3\x5b\x72\x67\x66\x3f\x51\xfb\xb0\xf9\xe6\xbe" - "\x07\xd1\xd0\xd6\x9f\x02\x4e\x11\x83\x28\xbc\xd6\x40\xea\x71\xe0" - "\x78\x31\x64\x8e\x00\xe6\x0f\x3b\x93\x30\x7f\x28\x75\x07\x9b\xa2" - "\x56\x75\x70\x90\x69\x40\x58\x3a\xe6\x10\xcd\x9b\x87\x06\x19\x73" - "\x27\xe7\x37\xe3\xf9\x01\xb3\x10\x15\x55\x2f\xcc\x29\x96\x9c\xa2" - "\x2d\x80\x79\x8f\xf0\xa9\x84\x4f\x54\xc6\x9d\x67\x70\x8c\xb9\xc4" - "\x07\xc0\x25\xaa\x1b\x6a\x18\x6e\xe1\x19\xad\x45\x05\xa9\x48\xdd" - "\xbd\x1e\xa9\xba\x2b\x14\xf7\xbd\x38\x09\x21\x33\xf0\x8a\x31\xfe" - "\xb4\xe5\xf1\x5a\x2d\x5e\x2b\xc8\x8b\x70\x8b\x7d\xee\x26\x96\x5b" - "\xbc\xd7\x88\x06\x14\x26\x01\xa7\xa8\x24\x9c\x02\xef\x91\xd0\x4c" - "\x38\x45\xdf\x96\x26\xdd\x23\x37\xe7\x07\xdc\x9c\xf7\xc1\xcd\x0f" - "\x68\xcd\xe1\xf8\x04\xe6\x12\x74\x94\x0e\x3d\x65\x24\xe3\x36\x16" - "\x8f\x27\x63\x66\x07\xd4\x82\x8e\x79\x1d\x79\x54\x44\x9f\xc3\x73" - "\xf7\x35\x15\xb5\x5b\xd0\xa2\x50\xd4\xd7\x84\xf9\xc3\x72\xba\xa4" - "\xa2\x36\x0f\xe1\x75\x10\x81\x5f\x06\xe6\xb3\x1c\x62\x6c\x8c\x08" - "\x87\x80\xb6\x1a\xf3\x08\xd2\x46\x7b\x8f\x3b\xa2\x3b\x82\xa4\x73" - "\x43\x6f\xd1\xfd\xef\x18\x5e\xb2\x79\x68\xbc\xc9\x6f\x68\x90\x59" - "\x3d\x33\x9b\xac\x8b\x19\x55\x6a\xf9\x28\xa9\x04\xaf\x77\xf8\xf9" - "\xb9\x3a\x05\x5e\xe3\x1b\xef\x77\x69\xd9\x1e\x96\xce\x9b\xd3\xd1" - "\xca\xfa\xac\x95\xf8\x0c\x73\xc0\x69\xf5\x88\x8e\x32\x51\x08\xce" - "\x79\x31\x73\x3a\x8c\x7a\xc4\xed\x7b\xa9\xc1\x6b\x52\x31\x6b\x4b" - "\x5a\x96\xc4\x75\xb5\x80\x5f\xe8\xe5\x14\xda\xd1\x68\x64\x78\x5f" - "\x06\xde\x0b\x73\x99\xa2\x3b\xe6\x7d\x80\xfd\x6e\x1b\x5b\xc0\x47" - "\x67\x89\x8f\xe8\xe5\x1e\xcc\x5f\xd3\x12\x9d\x16\xf2\x7e\xa4\xb5" - "\x15\x78\x1f\xbb\x6f\xa6\x75\x9d\x5d\x66\x7e\x4e\x0b\x9e\x9f\x53" - "\x83\x4c\x39\x64\xed\x42\xc0\x85\x02\xaf\x0b\x02\x65\xf0\x65\xe6" - "\xe5\xb4\xea\x30\x8e\x54\x45\x17\xf0\x5c\xa2\x9f\x19\xff\x98\x59" - "\xbf\xe0\xfd\x33\xad\x7c\xae\x6a\xeb\x0f\x64\x6e\x66\x1b\x5f\xb4" - "\x6e\x19\x1a\x64\xf5\x07\xbd\xa6\x7b\x09\x1e\x6f\x73\x85\x52\x9d" - "\x3f\x92\x00\xdc\x29\x41\xaa\x5f\x54\xb5\x9d\xc3\x2f\xaa\xbb\xcc" - "\x2f\xde\xb9\xc4\x2f\x3d\x97\xca\xf3\x4b\x4f\xd1\xf9\xff\x1d\xeb" - "\x17\x8f\xbb\xcc\x2f\x3d\x06\x10\xbf\xa8\x7d\xe4\xf9\x45\xad\x76" - "\xe4\x17\xdc\xc7\x65\xed\xdf\xb2\xf6\x6d\xe1\xf6\x94\xe8\xa2\x07" - "\xf5\x37\xc7\x73\xc2\xff\xb6\xe3\x39\x2b\x0e\xe3\x39\xf9\x6b\xd0" - "\xd1\xd1\xb8\xad\x54\x5f\x74\xdc\xa7\xd5\x9b\x1b\xcf\x49\x3d\x40" - "\xfa\xb6\xa9\x07\xa6\x13\x8e\xfa\x00\xb3\x9f\x17\x9e\xf7\x84\xe7" - "\xce\xed\x4a\xd2\x53\x99\xc0\x15\x33\xa1\x2d\xc7\xb6\x67\xd6\x72" - "\xa7\x7a\x15\xe2\xfe\xaa\x6f\x1a\xf5\x54\x36\xd8\x9e\x69\x2f\x1f" - "\x49\x2a\xd9\xde\xc7\xa0\xc0\x6d\x26\x5e\x5b\x96\xb6\x99\x0b\x69" - "\xce\x9b\x99\x7d\x1d\xf7\xe3\xb0\xf3\x96\x5a\x7c\x26\xe7\x9b\x07" - "\x86\xa5\x0b\xe1\x89\x99\x63\x09\x6d\x66\x61\x0b\xb4\x87\x0d\x48" - "\xf5\x7a\x3c\x87\x2d\xcb\x12\x5d\xcf\x2a\xe0\xe8\x85\x78\x8d\x5f" - "\x68\x2b\xe9\xd6\xb8\xae\x53\xb6\x41\x59\x59\x4c\xc1\xb3\xc5\x31" - "\xb5\x81\x8f\xa9\xeb\x2c\xa6\x00\x5b\x37\x31\x65\x33\x47\x32\x85" - "\x60\x4a\x7f\x13\x53\x4c\x5b\xb9\x44\xe7\x8b\x71\x65\xc5\x14\x6e" - "\x27\x09\xa6\xce\x89\x62\xea\xbb\x53\xc2\x98\x32\xf5\xb7\xc5\x54" - "\xcf\xc3\x04\x53\xbd\x66\x1c\x99\x0a\x98\x9a\x2a\x15\x53\xbd\xe2" - "\xf8\x9a\xda\xd7\x7e\x1c\x1c\xd5\xab\xb2\xad\xa6\xb6\x6a\xe8\xeb" - "\x3e\x51\xe9\xd7\x41\x47\x37\xdc\xd4\xd1\xbd\xae\xca\xd3\xd1\xbd" - "\x0c\x4e\x8d\x7d\xa3\x1e\x18\x7f\x14\xa2\xd3\x51\xa8\x3f\xd5\x11" - "\x64\xec\xdb\x76\x46\x1f\xab\xeb\x31\xee\x84\xf5\x31\x39\x67\x37" - "\x66\x89\xd2\x70\x63\xdf\x28\xcd\xa1\xe6\x75\xc2\x63\xdf\x3e\x4b" - "\xcd\xb7\xd1\x2a\xf9\x02\xe3\x93\xf2\xdb\x8c\x4f\xca\x17\xd0\x29" - "\xf9\x08\xdf\x6b\xab\x53\x8e\x46\x10\x9d\x72\x34\x02\xeb\x94\x7c" - "\x86\xdf\x1d\x8d\xb0\xea\x94\x7c\x38\x4f\x74\xca\xd1\x88\x0b\x70" - "\x60\x9d\xa2\x89\x3e\x1a\x21\xa4\x53\x34\x33\x08\xef\x7d\x20\xc2" - "\xf1\xdc\x91\x7c\x1b\x4d\x9c\x6f\xa3\x89\xf3\x59\x4d\x9c\xcf\x68" - "\x62\xf2\xdc\x01\x4c\xf9\xf0\x73\x71\xbe\xb6\xcf\xe5\x34\x83\x86" - "\x8c\x7f\xa3\x1e\x98\x80\x7d\xc1\xd7\xc4\x70\x4f\xb2\x90\x26\xee" - "\xed\xc3\xde\x13\x61\xd5\xc4\x2d\xe4\x7a\x26\x0f\x88\x2f\xe2\xe3" - "\xdf\xa8\xde\x64\xfc\x1b\xd5\x9b\x8c\x7f\x63\xfd\x6a\xaf\x89\x7b" - "\xb7\x3f\xfe\x8d\xc5\x11\x53\xce\x78\x31\x4d\xdc\xdb\x7e\xfc\x1b" - "\xa5\xae\x13\x1c\xff\x46\x3d\xb8\x81\xc3\xd2\x83\xc3\x78\xe3\xdf" - "\xa8\x3e\xbc\xf1\x6f\x18\x67\x77\x18\xbe\xa2\xed\xe6\x8e\x50\x7d" - "\x4e\x0a\x6b\xe1\x7c\x1b\x2d\x9c\xcf\x68\xe1\xa3\x11\xec\x18\x38" - "\xea\xc1\xee\x38\x7f\x7b\x2d\x9c\x7f\xf3\x7a\xab\x16\xc6\xf7\x10" - "\xdc\x09\x69\xe1\x07\x27\xb5\xc5\x1d\x5f\x0b\x3f\x98\x68\xd5\xc2" - "\x2d\x53\x6c\xb5\xf0\x83\x99\x7c\x2d\x8c\xf3\x17\xd2\xc2\x0f\xee" - "\xe7\xe5\x6f\xa7\x85\x1f\xfc\xc1\xaa\x85\x71\xfe\x56\xec\x72\x5a" - "\xd8\x97\x8c\x81\xa3\xd4\x39\xd2\xb5\xb0\x2f\x33\x06\x6e\xc7\x07" - "\xe4\x1b\x15\x5f\x07\xfb\xf2\xc7\xbf\x51\xbe\x64\xfc\x1b\xe5\x4b" - "\xc6\xbf\x51\xbe\x64\xfc\x1b\xa5\xce\xb6\x4d\xe7\x74\x30\x49\xc7" - "\xe3\xdf\x98\x71\x6f\x6b\x7c\x25\xea\xdf\x07\x3a\xa1\xfe\xd5\x38" - "\xd0\xbf\x9a\xbb\x4c\xff\xf6\x95\xa9\x7f\xfb\x76\x12\xfd\x7b\xb7" - "\xe9\x2c\x5f\x56\xff\x3e\x2c\x53\xff\x3e\xdc\x49\xf4\xef\xdd\xa6" - "\xb3\xfa\xb2\xfa\xb7\x9f\x4c\xfd\xdb\xcf\xa1\xfe\x75\xac\xb3\xfc" - "\x43\x38\x9d\xe5\x1f\x22\xae\xb3\x1e\x19\xef\x58\x67\x3d\x9a\xc1" - "\xe9\x2c\xbf\x8b\x84\xf7\xf8\x55\x12\xde\xe3\x97\xd9\xbe\xce\xf2" - "\x73\xbf\xa7\xb3\x6e\xa5\xce\xd2\xb2\xda\xfd\x8f\xc7\xe5\xe9\xac" - "\x3f\x1e\xe3\xeb\x2c\xff\x1b\xf6\x3a\xcb\x6f\x88\xf3\x3a\xcb\x6f" - "\x92\x3c\x9d\xe5\x17\xe9\x9c\xce\xf2\xdb\x2f\xac\xb3\x1e\x99\x20" - "\xae\xb3\xc8\x39\x7b\x6e\xfc\x28\x37\xaf\x9a\x7a\xd4\xbf\xf3\xeb" - "\xac\xfe\x65\xc2\x3c\xb8\xff\x71\xc2\xab\xfc\xf6\xdd\x1e\x9d\xe5" - "\xb7\x4f\x58\x67\x3d\x1a\x4a\xf8\xa8\xdf\x01\x7b\x9d\x05\xf7\x08" - "\xea\xac\x47\x97\xb2\xf7\xec\xe3\xeb\x2c\x92\x07\xc4\x97\x0d\xe2" - "\x3a\xeb\xb1\x21\x24\xde\x3c\xe6\x4e\xe2\x0d\xf1\xab\xbd\xce\x7a" - "\xf4\x74\xfb\x3a\x8b\xe0\x88\x29\xa7\xa8\xce\x7a\xac\xbf\xbd\xce" - "\x7a\x24\x42\x58\x67\xf9\x2b\x38\x2c\xe9\x36\xf1\x75\xd6\x63\xb3" - "\xef\x0c\x9d\x25\x8a\xaf\x32\x7b\x9d\xa5\x1b\x25\x5d\x67\xe9\x12" - "\xa5\xe9\x2c\x8c\x3b\x21\x9d\xa5\x3b\xd4\x16\x77\x7c\x9d\xa5\x3b" - "\x2d\xac\xb3\x74\x37\xf8\x3a\x0b\xe7\x2f\xa4\xb3\xfc\xfb\xf1\xf2" - "\xb7\xd3\x59\xfe\x23\xf8\x3a\x8b\x5c\xc7\xe9\x2c\x7f\x3d\x89\xa5" - "\xfd\x64\x8c\x55\xf4\x3f\x24\xae\xb3\xfc\xcb\xf9\x3a\xcb\xbf\x80" - "\xd4\x7b\xff\x06\xa2\xb3\xfc\x4b\x48\x7a\x3f\xa3\x6d\x3a\xa7\xb3" - "\x48\x3a\xa7\xb3\x1e\x77\x93\xa6\xb3\xbc\x3b\xa1\xce\x52\x39\xd0" - "\x59\xaa\xbb\x4c\x67\x3d\xb1\x57\x9e\xce\x7a\x62\xcf\x3d\x3e\x7f" - "\x3b\xf8\xfc\xe3\x1a\xc2\xbd\x06\x8e\x93\xc7\xe7\x07\x3a\xd4\xbf" - "\x8e\xf9\xfc\x10\x0d\xc7\xe7\x87\x68\xc4\xf9\xfc\x93\xfd\x1c\xf3" - "\xf9\xa7\xa7\x72\x7c\x3e\x80\x1d\xdb\x13\xc0\xf6\x63\x06\x4c\x6b" - "\x9f\xcf\x3f\xf5\xc3\x3d\x3e\x7f\x2b\xf9\xfc\x13\x26\x82\xa9\xa7" - "\x36\xc9\xe3\xf3\x4f\x15\xf3\xf9\xfc\x90\x23\xf6\x7c\x3e\xc0\xdd" - "\x79\x3e\x1f\xe0\x2f\x8f\xcf\x07\xe8\x9c\xe3\xf3\x01\xab\x85\xf9" - "\xfc\x93\x7e\xe2\x7c\x9e\x9c\xb3\xe7\x60\x4f\x0f\xe4\x38\xd8\xa0" - "\xe6\xce\xcf\xe7\x07\xe5\x0b\xf3\xad\x41\x9b\x48\xfb\x1d\xb0\xea" - "\xf6\xf0\xf9\x80\x55\xc2\x7c\xfe\xe9\xde\x84\xf7\x04\x64\xd8\xf3" - "\x79\xb8\x47\x90\xcf\x3f\xcd\x8e\xff\x0a\x58\xc5\xe7\xf3\x24\x0f" - "\x88\x2f\x33\xc4\xf9\xfc\xff\xb8\x93\x78\xf3\xf4\x0f\x24\xde\x10" - "\xbf\xda\xf3\xf9\xa7\x77\xb4\xcf\xe7\x09\x8e\x98\x72\x8a\xf2\xf9" - "\xa7\x6f\xd8\xf3\xf9\x27\xb5\xc2\x7c\x7e\xf0\x71\x0e\x4b\x83\xe7" - "\xf1\xf9\xfc\xff\x8c\xb8\x33\xf8\xbc\x28\xbe\xf2\xed\xf9\xfc\xe0" - "\x1e\xd2\xf9\xfc\xe0\x31\xd2\xf8\x3c\xc6\x9d\x10\x9f\x1f\x9c\xd3" - "\x16\x77\x7c\x3e\x3f\x78\x87\x30\x9f\x1f\x7c\x84\xcf\xe7\x71\xfe" - "\x42\x7c\x7e\xf0\x55\x5e\xfe\x76\x7c\x7e\x48\x77\x3e\x9f\x27\xd7" - "\x71\x7c\x7e\x48\x09\x89\xa5\x03\xcb\xa5\xf3\xf9\x21\x39\xe2\x7c" - "\x7e\xc8\x06\x3e\x9f\x1f\xc2\x8e\xd3\x1e\x72\x98\xf0\xf9\x21\xe9" - "\x24\x7d\x60\x99\x6d\x3a\xc7\xe7\x49\x3a\xc7\xe7\x87\x9c\x90\xc6" - "\xe7\xbb\x74\x42\x3e\xef\xe1\x80\xcf\x7b\xdc\x65\x7c\x7e\xe8\x4a" - "\x79\x7c\x7e\xe8\x0a\xf9\xbc\x71\x64\x04\xc7\x1b\x47\x46\x88\xf3" - "\xc6\xc0\x49\x8e\x79\xe3\xf0\x5c\x8e\x37\x3e\x7b\x95\xc4\xf1\x67" - "\xd9\x38\xfe\x6c\x5e\xfb\xbc\xf1\xd9\xee\xf7\x78\xe3\xad\xe4\x8d" - "\x43\xea\x08\x6f\x1c\x76\x52\x1e\x6f\x1c\x56\xc3\xe7\x8d\x23\xcd" - "\xf6\xbc\xf1\xd9\x11\xce\xf3\xc6\x67\x63\xe4\xf1\xc6\x67\xa3\x9d" - "\xe3\x8d\xcf\x1e\x12\xe6\x8d\x81\x53\xc5\x79\x23\x39\x67\xdf\xd6" - "\x0f\x9f\xce\xb5\xf5\xc3\x07\x75\x7e\xde\xf8\xa7\x63\xc2\xed\xfa" - "\x9f\x4e\x92\x76\xe2\xd9\xd2\xdb\xc3\x1b\x9f\x2d\x15\xe6\x8d\xc3" - "\xc7\x93\xf6\xf5\xd9\xc3\xf6\xbc\x11\xee\x11\xe4\x8d\xc3\x57\xb2" - "\xf7\x94\xf2\x79\x23\xc9\x03\xe2\xcb\x26\x71\xde\x38\x62\x04\x89" - "\x37\x23\xc8\x9a\x33\xac\x5f\xed\x79\xe3\xf0\xf3\xed\xf3\x46\x82" - "\x23\xa6\x9c\xa2\xbc\x71\xc4\x40\x7b\xde\x18\x18\x29\xcc\x1b\x47" - "\x76\xe5\xb0\xf4\xdc\x36\x3e\x6f\x1c\x91\x78\x67\xf0\x46\x51\x7c" - "\x1d\xb3\xe7\x8d\xcf\x85\x4a\xe7\x8d\xcf\x2d\x95\xc6\x1b\x31\xee" - "\x84\x78\xe3\x73\xe5\x6d\x71\xc7\xe7\x8d\xcf\x9d\x17\xe6\x8d\xcf" - "\x99\xf9\xbc\x11\xe7\x2f\xc4\x1b\x47\xfa\xf3\xf2\xb7\xe3\x8d\x23" - "\xc7\xf0\x79\x23\xb9\x8e\xe3\x8d\x23\xeb\x48\x2c\x0d\x54\x48\xe7" - "\x8d\x23\xcb\xc5\x79\xe3\xc8\xe3\x7c\xde\x38\x72\x33\xa9\xf7\x23" - "\x4d\x84\x37\x8e\xdc\x47\xd2\x03\x91\x6d\x3a\xc7\x1b\x49\x3a\xc7" - "\x1b\x83\x3c\xdb\xe3\x8d\x8e\x39\x45\x70\x09\xc7\x29\x82\x4b\x6c" - "\x39\x45\x39\x8f\x53\x04\xed\x70\xcc\x29\x46\x1b\x39\x4e\xf1\xc2" - "\x24\x52\xc7\x5f\x18\x41\xea\xf8\xf3\x8c\xcf\x5a\x3f\x19\x96\xbd" - "\xb4\x12\x51\x3b\xaf\xec\xa3\xde\x4b\x42\x6e\x19\x49\xc0\x29\x80" - "\xdf\xc5\x4f\xc6\x9c\xe2\xf9\xc4\x71\x29\x67\x68\xcf\x02\xe0\xb1" - "\xb5\x2c\xaf\x8d\x07\x5e\x5b\x0b\xbf\xa1\xbe\x1c\x9c\xb3\x8f\xaa" - "\x02\xee\x99\x0d\xdc\x8f\x99\xdb\xcc\xcc\x7b\xd6\xbb\x33\xfb\x67" - "\x5c\x01\xce\xf1\x46\xfb\xfb\x9d\x58\xf7\x3a\x49\xa9\xa5\x2d\x78" - "\x6f\x93\xf0\x58\x9b\x3d\x4f\xf0\x5e\xa8\x86\x3a\x84\xf7\x3d\x29" - "\x98\x8f\xd4\x78\xaf\x13\xef\x3a\xa4\xf2\x5a\xa6\xf0\xc2\x7b\x9e" - "\x78\x35\x10\xee\xba\xc3\x52\x46\xb8\xeb\x02\x4d\xb7\x8c\x6b\x68" - "\x40\xd1\x35\x8e\x5b\xbc\x8f\x79\xc5\x02\x9d\xb6\x61\x81\xae\xef" - "\xf5\xeb\xc0\x5d\x0d\x6d\xf7\xc4\x38\x72\x0c\xef\x75\x52\x9d\x4c" - "\xfa\x38\x99\xbd\x30\xfe\xa2\x43\x1b\xdf\x42\x1e\xb8\xaf\xf3\x49" - "\xbc\x1f\x46\x25\x52\x3d\xe6\x0b\xb1\xfe\xba\xce\xd7\x76\x9d\x4b" - "\xdc\xef\x69\xb9\xae\x43\x15\xd1\x3f\x33\xf3\x66\x4d\xd6\x79\xb3" - "\xd7\x50\xa0\x61\x81\x8e\xfa\x60\xbe\x0d\x77\xf5\xc1\xdc\xf5\x59" - "\x07\xdc\xf5\xf9\x51\xf2\xb8\xeb\xf3\x41\x7c\x9e\x11\x32\xcd\x9e" - "\x67\x3c\xbf\xc5\x79\x9e\xf1\x7c\xb9\x3c\x9e\xf1\x7c\x99\x73\x3c" - "\xe3\x05\xff\xb6\x3c\x63\x1b\xc3\x33\x82\x4a\x30\x16\x85\x79\x06" - "\x39\x67\xdf\x36\x8c\x2e\xe7\xda\x86\xd1\x79\x9d\x9f\x67\x8c\x0e" - "\x14\x6e\x07\x46\x8f\x62\xd6\xb4\xa4\x5e\xd0\x89\xaf\x69\x29\x97" - "\x63\xbc\xa0\x13\xe6\x18\xa3\xc9\xfa\x7f\x70\xde\xda\x06\x71\x1c" - "\x03\xee\x11\xe4\x18\xa3\x2f\xb6\xbd\x87\x70\x8c\x17\x06\x10\x8e" - "\x31\xc6\x5d\x9c\x63\x8c\xd9\x44\xe2\xcf\x98\x79\x24\xfe\x10\x9f" - "\xda\x73\x8c\x31\xa1\xed\x73\x0c\x82\x21\xa6\x9c\xa2\x1c\x63\x4c" - "\x8e\x3d\xc7\x08\xda\x2e\xcc\x31\x82\x67\x70\x38\x0a\xee\xca\xe7" - "\x18\x63\x4e\xde\x19\x1c\x43\x14\x5b\x81\x7c\x7e\xf1\xe7\x6d\xd2" - "\xf9\xc5\x9f\x4f\x4b\xe3\x17\x18\x73\x42\xfc\x22\x98\x6d\xff\x09" - "\x5e\xec\xf9\x45\xf0\x18\x61\x7e\x11\x3c\x8d\xcf\x2f\x70\xfe\x42" - "\xfc\x22\x78\x35\x2f\x7f\x3b\x7e\x11\xbc\x85\xcf\x2f\xc8\x75\x1c" - "\xbf\x08\x09\x21\x31\x34\x68\xa2\x74\x7e\x11\xe2\x2f\xce\x2f\x42" - "\x06\xf1\xf9\x45\x88\x1b\xe1\x11\x21\x53\x09\xbf\x08\xd1\x90\xf4" - "\xa0\x09\xb6\xe9\x1c\xbf\x20\xe9\x1c\xbf\x08\x69\x6f\xfd\xf7\x7b" - "\xf3\x59\x3b\x55\xbf\x54\xd8\x43\xf2\xda\xf6\x30\xdf\xce\xf1\x9d" - "\xf9\x6e\x9b\xcf\x1a\x92\x4e\xfa\x76\x5e\xdc\x2b\xef\x3b\xf3\x8b" - "\x9d\xe4\xfb\xff\xdd\x36\xce\x3a\x2c\x96\xf8\x65\x9c\xcc\xef\xff" - "\xe3\x3a\xc9\xf8\xf7\xbb\x6d\x5c\xc6\x8b\xec\x37\xf4\x97\x64\x8e" - "\x7f\x7f\xc9\xe1\xf8\x77\xc7\x5a\xf8\xd5\x52\x4e\x0b\xbf\x5a\x2a" - "\xde\xbf\x1e\xbe\xdf\xb1\x16\x9e\xe0\xc1\x69\xe1\x97\x67\x10\x2e" - "\xfa\xf2\x38\xc2\x45\x5f\x66\xbe\x57\x99\x1e\x49\x2c\x26\xfd\xeb" - "\xa5\x02\xfd\xeb\xe3\x57\xe2\x75\xd2\xb8\xf5\xd3\xc2\x6f\xd8\xae" - "\x9f\xf6\x35\xdc\x73\xaf\xdf\xfd\x56\xf4\xbb\x8f\x63\xc7\xf4\x8f" - "\x1f\x2f\xaf\xdf\x7d\x7c\x04\x5f\x0f\xbf\x36\xdb\x5e\x0f\x8f\xdf" - "\xeb\xbc\x1e\x1e\x7f\x52\x9e\x1e\x1e\x5f\xe3\x9c\x1e\x7e\x79\x98" - "\x70\xbf\x7b\xf8\x01\x8c\x47\x61\x3d\x4c\xce\xd9\xeb\x98\x57\x4e" - "\x72\x3a\xe6\x95\x2d\x9d\x5f\x0f\xbf\x12\x22\xac\x59\x5e\x19\x4f" - "\xf4\xf0\xcb\x81\xb7\x5e\x0f\xbf\x1c\x28\xac\x87\x5f\x39\x42\xb4" - "\xc3\xcb\xc3\xed\xfb\xdc\xe1\x1e\x41\x3d\xfc\x4a\x33\x7b\x4f\x20" - "\x5f\x0f\x93\x3c\x20\xe6\xf8\x88\xeb\xe1\x09\xbb\x49\x0c\x9a\xb0" - "\x8c\xc4\x20\xe2\x53\x7b\x3d\x3c\x61\x52\xfb\x7a\x98\x60\x88\x29" - "\xa7\xa8\x1e\x9e\xb0\xc9\x5e\x0f\x87\xef\x13\xd6\xc3\xaf\x2e\xe2" - "\x70\xf4\x6a\x6f\xbe\x1e\x9e\x70\xf1\xce\xd0\xc3\xa2\xd8\x0a\xe1" - "\xeb\xe1\x89\xfb\xa5\xeb\xe1\x89\x97\xa5\xe9\x61\x8c\x39\x21\x3d" - "\xfc\xea\xb0\xb6\x98\xe3\xeb\xe1\x57\x27\x0a\xeb\xe1\x57\x67\xf3" - "\xf5\x30\xce\x5f\x48\x0f\xbf\xba\x81\x97\xbf\x9d\x1e\x7e\x75\x2f" - "\x5f\x0f\x93\xeb\x38\x3d\xfc\x5a\x24\xdb\xd6\xc5\x48\xd7\xc3\xaf" - "\x0d\x13\xd7\xc3\xaf\x8d\xe2\xeb\xe1\xd7\xd4\x44\xf7\xbe\x36\x8b" - "\xe8\xe1\xd7\x74\x24\x3d\x3c\xda\x36\x9d\xd3\xc3\x24\x9d\xd3\xc3" - "\xaf\xa5\xdc\x9b\xdf\x7a\x27\xe9\xe1\x49\x03\xe5\xe9\xe1\x49\x03" - "\x3a\x07\xbf\xbf\xdb\x74\xd7\x6b\xd9\x84\x73\x4d\x3e\x22\x8f\xdf" - "\x4f\x3e\xdc\x39\xfc\x72\xb7\xe9\xae\x49\x09\xc4\x2f\x53\xa7\xc9" - "\xf3\xcb\xd4\xa9\xf2\x75\x57\x6c\x20\xa7\xbb\x62\x03\xc5\x75\xd7" - "\xb4\x41\x8e\x75\x57\x4c\x3a\xa7\xbb\xa2\xce\x12\xce\x13\x75\x84" - "\x70\x9e\xa8\x95\xed\xeb\xae\xd7\xcd\x7c\xdd\x35\x6d\xf6\x3d\xdd" - "\x75\x3b\x74\xd7\x14\x4f\x82\xb5\xd7\xcb\xe5\xe9\xae\xd7\xcb\xf8" - "\xba\x2b\xf6\xbc\xbd\xee\x8a\x1a\xe8\xbc\xee\x8a\x1a\x2f\x4f\x77" - "\x45\x45\x38\xa7\xbb\xa2\x76\x0b\xeb\xae\x69\x83\xc5\x75\x17\x39" - "\x67\xcf\x97\x63\xc6\x73\x7c\x39\xe6\xa1\xce\xaf\xbb\xa2\x4b\x85" - "\xb9\x71\x74\x39\xd1\x5d\x51\x25\xb7\x5e\x77\x45\x95\x08\xeb\xae" - "\x98\x11\x84\xa3\x46\xed\xb1\xd7\x5d\x70\x8f\xa0\xee\x8a\x99\xc7" - "\xde\x53\xc2\xd7\x5d\x24\x0f\x88\x39\x99\xe2\xba\xeb\x0d\xb2\xbf" - "\x16\x15\xd3\x4c\x62\x10\xf1\xa9\xbd\xee\x8a\x39\xde\xbe\xee\x22" - "\x18\x62\xca\x29\xaa\xbb\xde\xe8\x6d\xaf\xbb\xa6\x05\x08\xeb\xae" - "\x37\xaf\x72\x38\x7a\x33\x87\xaf\xbb\xde\x88\xb9\x33\x74\x97\x28" - "\xb6\x4a\xf9\xba\xeb\xcd\x41\xd2\x75\xd7\x9b\xd3\xa5\xe9\x2e\x8c" - "\x39\x21\xdd\xf5\xe6\xee\xb6\x98\xe3\xeb\xae\x37\x2b\x85\x75\xd7" - "\x9b\xe7\xf9\xba\x0b\xe7\x2f\xa4\xbb\x62\x7b\xf0\xf2\xb7\xd3\x5d" - "\xb1\x03\xf9\xba\x8b\x5c\xc7\xe9\xae\xd8\x63\x24\x86\x4e\x3d\x29" - "\x5d\x77\xc5\xee\x16\xd7\x5d\xb1\xfb\xf9\xba\x2b\x36\x83\xe8\xab" - "\xd8\x5a\xa2\xbb\x62\x8b\x49\xfa\xd4\x1a\xdb\x74\x4e\x77\x91\x74" - "\x4e\x77\xc5\x36\xdc\x9b\xef\x7a\x27\xe9\xae\xb7\xb6\xc8\xd3\x5d" - "\x6f\x6d\xbe\xc7\xef\x6f\x07\xbf\x9f\xee\x41\x38\x57\xdc\x08\x79" - "\xfc\x3e\x6e\xb8\x7c\x7e\x1f\x6f\x33\xdf\x35\xde\xc1\x7c\xd7\x19" - "\x3d\x1c\xf3\xfb\xd9\xd1\x1c\xbf\x7f\xfb\x10\x69\x5b\xdf\xde\x42" - "\xda\xd6\xb7\xa7\xb7\xcf\xef\x67\x9e\xe6\xf3\xfb\x19\xe3\xee\xf1" - "\xfb\xdb\xc1\xef\xdf\xaa\x27\x58\x9b\xb9\x4d\x1e\xbf\x9f\xd9\x66" - "\xdf\xbe\x78\x81\x79\xb0\x6f\x77\x77\x9e\xdf\xbf\x3d\x48\x1e\xbf" - "\x7f\x3b\xc0\x39\x7e\xff\x76\x8e\x30\xbf\x9f\xa1\x16\xe7\xf7\xe4" - "\x9c\x3d\x2f\x9b\x3d\x88\xe3\x65\xb3\xcc\x9d\x9f\xdf\xcf\x2a\x16" - "\xe6\x60\xb3\xb6\x11\x7e\xff\x76\xf6\xad\xe7\xf7\x6f\x67\x0b\xf3" - "\xfb\xd9\x0f\x11\x2e\xf4\x76\xae\x3d\xbf\x87\x7b\x04\xf9\xfd\x6c" - "\x76\xfe\xc3\xdb\xd9\x7c\x7e\x4f\xf2\x80\x98\x33\x5b\x9c\xdf\xcf" - "\xe9\x4a\x62\xd0\xec\x93\x24\x06\x11\x9f\xda\xf3\xfb\xd9\xbb\xdb" - "\xe7\xf7\x04\x43\x4c\x39\x45\xf9\xfd\xec\x66\x7b\x7e\x3f\x43\x25" - "\xcc\xef\xe7\xda\xcc\x81\x9d\xdb\x66\x0e\xec\x9c\x51\x77\x06\xbf" - "\x17\xc5\x56\x31\x9f\xdf\xcf\x95\x31\xff\x75\xae\xc4\xf9\xaf\x18" - "\x73\x42\xfc\x7e\x6e\x4e\x5b\xcc\xf1\xf9\xfd\x5c\x91\xf9\xaf\x73" - "\xdb\xcc\x7f\xc5\xf9\x0b\xf1\xfb\xb9\x57\x79\xf9\xdb\xf1\xfb\xf8" - "\x36\xf3\x5f\xc9\x75\x1c\xbf\x8f\x67\xe7\xbf\xc6\xc9\xd8\x43\x23" - "\xde\xc1\xfc\xd7\xf8\x36\xf3\x5f\xe3\xd9\xf9\xaf\xf1\xec\xfc\xd7" - "\x78\x76\xfe\x6b\xdc\x3e\xdb\x74\x8e\xdf\x93\x74\x8e\xdf\xc7\xdf" - "\x9b\xff\x7a\x47\xf1\xfb\xf9\x32\xe7\xbf\xce\x77\x61\xfe\xeb\xe2" - "\x68\x8e\x47\x2e\x8e\x16\xe7\x91\x0b\xda\x99\xff\xba\x70\x2b\xc7" - "\x23\x93\xd8\x18\x9e\x78\x99\xc4\xf0\xc4\x1d\xed\xf3\xc8\xc4\xfe" - "\x7c\x1e\xb9\x20\xef\x1e\x8f\xbc\x1d\x3c\x32\x9e\x9d\x17\x9b\x70" - "\x55\x1e\x8f\x4c\x30\xf0\x79\xe4\x92\xee\xf6\x3c\x32\xd1\x6e\xff" - "\x67\x71\x1e\x99\xb8\x48\x1e\x8f\x4c\x4c\x76\x8e\x47\x26\x9e\x14" - "\xe6\x91\x0b\xa6\x8a\xf3\x48\x72\xce\xbe\xfd\x5f\x68\x33\xae\x62" - "\xe1\x98\xce\xcf\x23\x93\xea\x84\xdb\xfa\xa4\xab\x84\x47\x26\xd6" - "\xdc\x7a\x1e\x99\x58\x23\xcc\x23\x17\x4e\x27\x6d\x6e\xe2\x29\x7b" - "\x1e\x09\xf7\x08\xf2\xc8\x85\xec\xf8\x87\xc4\x1a\x3e\x8f\x24\x79" - "\x40\xcc\xd9\x2b\xce\x23\x93\xc7\x93\x18\x94\xdc\x8f\xc4\x20\xe2" - "\x53\x7b\x1e\xb9\xb0\xb9\x7d\x1e\x49\x30\xc4\x94\x53\x94\x47\x26" - "\x8f\xb2\xe7\x91\x0b\x44\xe6\xc4\x2e\xee\xcd\xe1\x68\xd1\x7e\x3e" - "\x8f\x4c\x5e\x7d\x67\xf0\x48\x51\x6c\xd5\xf1\x79\xe4\xa2\x49\xd2" - "\x79\xe4\xa2\x4c\x69\x3c\x12\x63\x4e\x88\x47\x2e\x3a\xd9\x16\x73" - "\x7c\x1e\xb9\xe8\x86\x30\x8f\x5c\xdc\x9d\xcf\x23\x71\xfe\x42\x3c" - "\x72\xf1\x30\x5e\xfe\x76\x3c\x72\xf1\x44\x3e\x8f\x24\xd7\x71\x3c" - "\x72\xb1\x91\x6d\xeb\x64\xcc\x87\x5d\x7c\x52\x9c\x47\x2e\x3e\xcb" - "\xe7\x91\x8b\xf7\x10\xbe\xb8\xc4\x93\xf0\xc8\xc5\x65\x24\x7d\x01" - "\xb2\x4d\xe7\x78\x24\x49\xe7\x78\xe4\x12\x5f\xd7\xe6\xc3\x2e\xaf" - "\xe1\x38\xc6\xf2\x1a\x5b\x8e\xc1\x9f\x0f\xbb\xe4\xa0\x63\x8e\x91" - "\xae\xe5\x38\x46\x2a\xbb\xa7\x4d\x2a\xbb\xa7\x4d\x2a\xb3\x36\x69" - "\x2b\xd4\x71\x32\x1f\xb6\x84\x02\x1e\xc8\xcd\x87\x7d\x1d\x73\x8c" - "\xa5\x85\xe3\x78\x1c\x63\x89\x99\x99\x1b\x8b\x79\x46\x83\x11\xe1" - "\x73\xc2\xf3\x64\x4b\x3a\x76\x9e\x6c\xe3\xdd\x3c\x4f\x76\xe9\x0c" - "\x79\x1c\x77\x69\x9b\xfd\x6f\xde\x11\xd8\x53\x76\xa9\x84\xfd\x6f" - "\x96\xca\xdc\xff\x66\xa9\x93\xfb\xdf\xa4\xda\xed\x7f\x43\xe6\xc9" - "\x2e\x29\x6d\x15\xe5\x1d\x4b\x0e\xe0\xbc\xed\xdb\x8b\x34\x9b\xef" - "\x8a\x69\x07\x3b\x3f\xef\x48\x13\xd9\x9f\x24\x6d\x06\xe1\x1d\xa9" - "\x11\xb7\x9e\x77\xa4\x8a\xec\x7d\x93\x76\x9a\xc4\xe8\xd4\x9b\xfb" - "\xd8\x70\xbc\x23\x55\x64\xef\x9b\xf4\x1e\x6d\xef\x21\xbc\x23\x95" - "\xdd\xfb\x26\x7d\xa0\x38\xef\x48\x2f\x27\x71\x29\x7d\x03\x89\x4b" - "\xc4\xa7\xf6\xbc\x23\x7d\x5e\xfb\xbc\x23\x95\xdd\xfb\x26\xd5\xc1" - "\xde\x37\xe9\xfb\xed\x79\xc7\x92\x03\xc2\xbc\x63\x79\x0e\x87\xa3" - "\xe5\x83\xf8\xbc\x63\x99\xe2\xce\xe0\x1d\xa2\xd8\x8a\xe6\xf3\x8e" - "\x65\xc7\xa5\xf3\x8e\xe5\xee\xd2\x78\x47\xaa\xc8\xbe\x37\xcb\xd9" - "\xfe\xcf\x54\x91\x7d\x6f\x96\xcf\x16\xe6\x1d\xcb\x57\xf2\x79\x47" - "\xaa\xc8\xbe\x37\xcb\x77\xf3\xf2\xb7\xe3\x1d\xcb\x2b\xf9\xbc\x23" - "\xb5\xcd\xbe\x37\xef\xb0\x7b\xc0\x2e\x99\x2e\x9d\x77\xbc\x33\x5e" - "\x9c\x77\xbc\xd3\x66\xff\xd7\x77\xd8\xfd\x5f\xdf\x59\x41\x78\xc7" - "\x3b\xec\xfe\xaf\x4b\x62\x6d\xd3\x39\xde\x41\xd2\x39\xde\xf1\x4e" - "\xae\x84\xfe\xab\x5c\x29\xf3\x64\x77\x34\xf2\xfb\xaf\xac\x7d\x57" - "\xa6\x01\x61\x2b\x6e\xf6\x5f\xd9\x7e\xeb\x14\xe8\xbf\xc2\x6d\x3a" - "\xd7\x7f\x75\x9a\x89\x55\x5c\xff\x95\x9e\xe9\xbf\xc2\x7d\x57\xf8" - "\x7b\xa7\xb5\xef\xca\xb2\xd0\x7e\x8e\xec\x0e\x8b\xf4\xbe\x2b\xee" - "\x9b\xe7\xd1\x00\xd2\x77\x55\x73\xb3\xef\x0a\xb7\xe7\xe6\x26\xfb" - "\xbe\x2b\xdc\x8e\x73\x7d\x57\x3f\xdf\xe2\xbe\xab\x95\x32\xd7\xbf" - "\x58\x19\xd4\x39\xbe\x4d\xdf\x6d\x73\x64\xdf\xd9\x4a\xfa\x79\xde" - "\x3d\x29\xef\xdb\xf4\xbb\x35\x9d\xc3\x2f\x77\xdb\x58\xed\x95\xab" - "\x88\x5f\x56\xcd\x93\xe7\x97\x55\xf1\x9d\xc3\x2f\x77\xdb\x58\x8e" - "\xff\xd5\x12\xbf\xac\xe9\x2a\xcf\x2f\x6b\x3c\xe4\xf7\xc1\xaf\x73" - "\xe3\xf4\xf1\x3a\x37\x71\x7d\xbc\xe6\xb4\x63\x7d\xbc\x76\x2c\xa7" - "\x8f\x33\x77\x10\x1e\x9a\x99\x43\x78\x68\xe6\x78\x6b\x1f\x3c\xd1" - "\xc7\xa5\x14\x6e\x4b\x70\xdf\x7a\x06\xb4\x1f\xef\x81\x36\xcc\x04" - "\xad\xfc\xde\x7c\xd0\xcb\xf1\xc8\xa3\xba\xf6\x20\x8a\x4f\xc5\x9a" - "\x39\xa3\x3c\x3c\xd9\x56\x33\xbf\x37\xd0\xaa\x97\xc3\xe1\xde\x6f" - "\xe6\x94\x52\x58\x17\x9b\x7d\x66\x66\x9b\x76\x84\xa5\x67\x43\x3e" - "\xd6\xfe\x79\xdc\xd6\xee\x9c\x03\xfa\x78\x26\xbf\x8f\xbe\x75\x47" - "\xd8\x8a\x56\x9f\x99\xb9\xb8\x9f\xbe\xd9\xa6\x9f\xde\x51\x1f\xbd" - "\x50\xff\x3c\xc6\x21\xee\xa3\x2f\x68\xbc\xdb\xfa\xe8\x57\xed\x23" - "\x58\xcc\xc8\x93\xd7\x47\x9f\x91\xcb\xd7\xca\xeb\x76\xdb\x6b\xe5" - "\x8c\x66\xe7\xb5\x72\xe6\x43\xf2\xb4\x72\xa6\xaf\x73\x5a\x39\x73" - "\xa9\xb0\x56\x5e\xa3\x17\xef\xa3\x27\xe7\xec\x35\xce\xda\x87\x38" - "\x8d\x93\x75\xb1\xf3\x6b\xe5\xac\x0c\x61\x3d\x93\x95\x47\xb4\x72" - "\x66\xca\xad\xd7\xca\x99\x29\xc2\x5a\x79\x6d\x57\xa2\x2b\x32\x53" - "\xec\xb5\x32\xdc\x23\xa8\x95\xd7\x8e\x68\x7b\x0f\xd1\xca\x99\xe9" - "\x44\x2b\xaf\x9d\x24\xae\x95\xd7\xde\x20\x31\x6a\x2d\x3b\x9f\x84" - "\xf8\xd4\x5e\x2b\xaf\x2d\x6c\x5f\x2b\x13\x0c\x31\xe5\x14\xd5\xca" - "\x6b\xcf\xdb\x6b\xe5\x35\xa7\x84\xb5\x72\xce\x41\x0e\x47\x39\xd3" - "\xf8\x5a\x39\x7b\xe0\x9d\xa1\x95\x45\xb1\x95\xc1\xd7\xca\xd9\x66" - "\xe9\x5a\x39\x67\x90\x34\xad\x8c\x31\x27\xa4\x95\x73\xd8\xfd\xaf" - "\x08\x5e\xec\xb5\x72\xce\x06\x61\xad\x9c\xb3\x9b\xaf\x95\x71\xfe" - "\x42\x5a\x39\xe7\x34\x2f\x7f\x3b\xad\x9c\xd3\xcc\xd7\xca\xe4\x3a" - "\x4e\x2b\xaf\x2b\x20\x31\x74\xcd\x4a\xe9\x5a\x79\xdd\x52\x71\xad" - "\xbc\x6e\x25\x5f\x2b\xaf\x8b\x24\x9a\x78\x5d\x09\xd1\xca\xeb\x66" - "\x91\xf4\x35\x2b\x6c\xd3\x39\xad\x4c\xd2\x39\xad\xbc\xae\x54\x82" - "\x56\xce\xbf\x45\x5a\x79\xd5\x9d\xa5\x95\xbf\xab\xed\x1c\x5a\x39" - "\x77\xb6\x3c\xad\x9c\x3b\xcb\x49\xee\x9f\xdb\x0e\xf7\x5f\x71\x8f" - "\xfb\xdb\xf2\xad\x75\x27\x08\xdf\x5a\xef\x2e\x8f\xfb\xaf\x77\xeb" - "\x0c\x7e\xb9\xbb\x7c\x92\xbb\x87\xf8\xe4\xaf\x1b\xe4\xf9\xe4\xaf" - "\xf9\xf7\x74\xf2\xed\xf0\xcb\xfa\xb1\xc4\x2f\x1b\x06\xc9\xf3\xcb" - "\x86\x00\xf9\x3a\x79\xd3\x58\x4e\x27\x6f\x1a\x6b\xab\x93\xcb\x46" - "\xdb\xea\xe4\x0f\xdc\x1d\xeb\xe4\x22\x9b\xbd\x1a\x0a\x58\x0e\x5a" - "\xc0\x8e\x37\x2e\x60\xf8\x46\x33\xd6\xc9\xa3\x40\x27\x5f\xca\xbe" - "\xa9\x93\xb1\x2e\x1e\x67\x3c\x43\xe3\xef\xca\xa0\x93\xdd\x56\x5f" - "\x41\x6e\xa0\x9d\x51\xf5\xa9\xbd\x28\x03\x74\xf3\x9a\x2b\xa0\x9d" - "\x67\x81\x76\x36\x15\xb2\xda\xb9\xa0\x07\x5f\x3b\x7f\x30\x83\xa7" - "\x9d\x67\x66\x33\xda\x19\xf4\x70\xba\x29\x6f\x66\x36\xd6\xce\x26" - "\xd0\xc5\xad\x03\xc3\x56\x64\x5f\x69\xa3\xa3\x67\x82\x8e\x7e\x8b" - "\xaf\xa3\x5b\xf2\x66\xe6\x37\xef\x08\x5b\x85\x75\xb4\xb1\xbf\x7c" - "\x1d\x5d\xd0\x42\x74\xf4\x87\x77\x9d\x8e\xfe\xab\x9e\x60\xf5\xc3" - "\xd3\xf2\x74\xf4\x87\xa7\xf8\x3a\x7a\x53\xb3\xbd\x8e\x2e\x18\xe5" - "\xbc\x8e\x2e\x98\x2e\x4f\x47\x17\xc4\x3a\xa7\xa3\x0b\x8e\xb4\xd5" - "\xd1\x5b\x53\xb1\x8e\xfe\xc0\xa3\x59\x54\x47\x7f\xe0\x26\xfc\xcd" - "\xb9\xc8\x66\x0f\x88\xa2\x3b\x60\x0f\x88\xc2\x13\xc2\x5a\xa7\xf0" - "\x34\xd1\xd1\x05\x87\x6f\xbd\x8e\x2e\x38\x2c\xac\xa3\x8b\xd8\xef" - "\x7f\x05\x87\xed\x75\x34\xdc\x23\xa8\xa3\x8b\x56\xb6\xbd\x87\xe8" - "\xe8\x82\x32\xa2\xa3\x8b\x1c\xec\xff\xb0\x91\xdd\xff\x61\x23\xbb" - "\xff\x03\xf1\xa9\xbd\x8e\x2e\x72\x62\xff\x07\x82\x21\xa6\x9c\xa2" - "\x3a\x7a\xa3\xc0\xfe\x0f\x1f\xb8\x09\xeb\xe8\x4d\xee\x1c\x8e\x8a" - "\xb7\xf0\x75\xf4\xc6\x3b\x64\xff\x07\x51\x6c\x9d\xe0\xeb\xe8\xe2" - "\x31\xd2\x75\x74\xf1\x22\x69\x3a\x1a\x63\x4e\x48\x47\x17\xb3\xeb" - "\x9f\x11\xbc\xd8\xeb\xe8\xe2\xb3\xc2\x3a\xba\xb8\x99\xaf\xa3\x71" - "\xfe\x42\x3a\x7a\x53\x7f\x5e\xfe\x76\x3a\x7a\xd3\x28\xbe\x8e\x26" - "\xd7\x71\x3a\x7a\x53\x2d\x89\xa1\x1b\x76\x48\xd7\xd1\x9b\x8e\x88" - "\xeb\xe8\x4d\x95\x7c\x1d\xbd\xa9\x98\xe8\xe5\x4d\x46\xa2\xa3\x37" - "\xed\x21\xe9\x1b\xb6\xdb\xa6\x73\x3a\x9a\xa4\x73\x3a\xfa\x23\x0f" - "\x69\xdf\x9c\x5d\x5a\x8b\x6a\x45\xc7\xcf\x99\xb8\x55\x6b\x51\x59" - "\xbf\x3b\xff\xb7\xe7\x4c\x7c\xbc\x5f\x9e\x96\xfe\x78\xdf\x3d\xcd" - "\x76\xab\xb5\xc1\x47\xbe\x84\x6f\x6d\x91\xb9\xfe\xef\x96\x7b\xeb" - "\xff\xde\x16\xbf\x6c\x46\xc4\x2f\x9f\xc8\x5c\xff\xf7\x13\x17\xd6" - "\xff\xdd\xa9\xe7\x34\xdb\x4e\xbd\xf8\xb7\xcd\x4f\xdb\x59\xff\x77" - "\xbb\x8e\xd3\x6c\x9f\xad\x26\x7c\xe7\xb3\xd9\x84\xef\x7c\x36\x50" - "\xde\xb7\xcd\x6d\x5b\xf8\xfa\x6c\x6b\xd7\x7b\xdf\x36\x6f\xb7\x26" - "\xdb\xc2\xae\x0f\xbc\x6d\x9e\x3c\x4d\xb6\x2d\x9e\xaf\xc9\x76\x65" - "\xda\x6b\xb2\x6d\x3f\x38\xaf\xc9\xb6\x35\xcb\xd3\x64\xdb\x8c\xce" - "\x69\xb2\xcf\x26\x09\x7f\xdb\xfc\xd4\xc1\xfa\xc0\x9f\x8a\xac\x0f" - "\xfc\x79\x33\xc7\xa5\x3f\x3f\xd2\xf9\x35\xd9\xe7\x71\xc2\xbc\xf9" - "\xf3\x79\x44\x93\x7d\x16\x79\xeb\x35\xd9\x67\x91\xc2\x9a\xec\xf3" - "\xf3\x84\xbf\x7e\x16\x69\xaf\xc9\xe0\x1e\x41\x4d\xb6\xbd\x77\xdb" - "\x7b\x88\x26\xfb\x6c\x2a\xd1\x64\xdb\x87\x88\x6b\xb2\xed\xc7\x49" - "\x8c\xda\xbe\x89\xc4\xa8\x4f\x45\xd6\x07\xde\xbe\xa8\x7d\x4d\x46" - "\x30\xc4\x94\x53\x54\x93\x6d\x3f\x64\xaf\xc9\x3e\x15\x59\x1f\x78" - "\xe7\x06\x0e\x47\x3b\x87\xf1\x35\xd9\x8e\xae\x77\x86\x26\x13\xc5" - "\x56\x1c\x5f\x93\xed\x38\x29\x5d\x93\xed\xec\x2e\x4d\x93\x61\xcc" - "\x09\x69\xb2\x9d\x93\x58\xfc\x4c\x15\xd6\x64\x3b\x13\x85\x35\xd9" - "\xce\x4c\xbe\x26\xc3\xf9\x0b\x69\xb2\x9d\xfb\x79\xf9\xdb\x69\xb2" - "\x9d\x3f\xf0\x35\x19\xb9\x8e\xd3\x64\xbb\x92\x49\x0c\xfd\x54\xc6" - "\xfa\xc0\xbb\x26\x89\x6b\xb2\x5d\x31\x7c\x4d\xb6\x6b\x30\xd1\x5e" - "\xbb\x32\x88\x26\xdb\x15\x42\xd2\x3f\x8d\xb6\x4d\xe7\x34\x19\x49" - "\xe7\x34\xd9\xae\x02\x69\x9a\xcc\xf9\x75\xaa\xfe\xfb\xe3\x80\x55" - "\x77\xd9\x38\xe0\xdd\xa1\xf2\xf4\xd8\xee\x90\x7b\xdc\xff\x76\x70" - "\xff\x5d\x25\x84\x6f\xfd\xed\xac\x3c\xee\xff\x37\xbd\x7c\xee\xff" - "\xd5\x29\x8e\xfb\x7f\x75\x4a\x9c\xfb\xff\x7d\xaf\x63\xee\xbf\xcf" - "\x8f\xe3\xfe\x5f\xac\x24\xed\xea\x17\x33\x48\xbb\xfa\x85\xbf\x3c" - "\xee\xbf\x77\x13\x9f\xfb\xef\x71\xbf\xc7\xfd\x6f\x37\xf7\xdf\xcd" - "\xae\x53\xbd\x77\xb6\x3c\xee\xbf\x77\x16\x9f\xfb\xff\x63\xb5\x3d" - "\xf7\xdf\x7b\xdc\x79\xee\xbf\xf7\x86\x3c\xee\xbf\xb7\xc1\x39\xee" - "\xff\xc5\x44\x61\xee\xff\xf7\x7d\xe2\xdc\x9f\x9c\xb3\xe7\x6c\x5f" - "\xde\xe0\x38\xdb\x97\x87\x3a\x3f\xf7\xff\x32\x56\x98\x9f\x7d\x39" - "\x9b\x70\xff\x2f\x26\xdc\x7a\xee\xff\xc5\x04\x61\xee\xff\xe5\x59" - "\xc2\x93\xbe\x98\x60\xcf\xfd\xe1\x1e\x41\xee\xbf\xcf\xa7\xed\x3d" - "\x84\xfb\x7f\x11\x49\xb8\xff\xbe\x41\xe2\xdc\x7f\x5f\x25\x89\x51" - "\xfb\x0a\x49\x8c\x22\x3e\xb5\xe7\xfe\xfb\x12\xdb\xe7\xfe\x04\x43" - "\x4c\x39\x45\xb9\xff\xbe\x83\xf6\xdc\xff\xef\x7b\x84\xb9\xff\x57" - "\x79\x1c\x8e\xbe\x1a\xc2\xe7\xfe\xfb\xdd\xef\x0c\xee\x2f\x8a\xad" - "\x58\x3e\xf7\xdf\xff\x83\x74\xee\xff\x55\x57\x69\xdc\x1f\x63\x4e" - "\x88\xfb\x7f\x35\x91\xc5\x4f\xa4\x30\xf7\xff\x6a\x9e\x30\xf7\xff" - "\x6a\x35\x9f\xfb\xe3\xfc\x85\xb8\xff\x57\x7b\x79\xf9\xdb\x71\xff" - "\xaf\x8e\xf3\xb9\x3f\xb9\x8e\xe3\xfe\xff\x48\x20\x31\xf4\xef\xd3" - "\xa4\x73\xff\x7f\x4c\x14\xe7\xfe\xff\x98\xc6\xe7\xfe\xff\x08\x20" - "\x1c\xff\x1f\xab\x08\xf7\xff\xc7\x68\x92\xfe\xf7\xa9\xb6\xe9\x1c" - "\xf7\x27\xe9\x1c\xf7\xff\x47\xfe\xbd\x35\xac\xee\xa4\x35\xac\x0e" - "\xca\xe4\xff\x07\x1d\xf2\x7f\xc7\x3c\xf3\x88\x1f\xc7\x33\x8f\xf8" - "\xd9\xf2\x4c\xfe\x1a\x56\x5f\x3f\xe4\x98\x67\xfe\x73\x16\xc7\x33" - "\x4b\xd9\x18\x5e\xba\x9b\xc4\xf0\xd2\x79\x56\x9e\x29\xbe\x86\xd5" - "\x37\x17\xf9\x6b\x58\x7d\x3d\xe9\xde\x1a\x56\xb7\x83\x47\xfe\x63" - "\x3b\xe1\x91\xdf\xec\x95\xc7\x23\xbf\xd9\xc3\xe7\x91\x47\x8e\xdb" - "\xf3\xc8\xd2\xde\xce\xf3\xc8\xd2\x11\xf2\x78\x64\xe9\x70\xe7\x78" - "\x64\x69\xa1\xf0\x1a\x56\x5f\x6b\xc5\x79\x24\x39\x67\xdf\xfe\xff" - "\x73\x04\xd7\xfe\xff\xb3\x6b\xe7\xe7\x91\x87\xb6\x0b\xb7\xf5\x87" - "\xf6\x12\x1e\x59\x5a\x70\xeb\x79\x64\x69\x81\x30\x8f\xfc\x27\xbb" - "\xff\x75\x69\xb1\xfd\x1a\x56\x70\x8f\x20\x8f\xfc\xe7\x34\xf6\x9e" - "\x02\x3e\x8f\x24\x79\x40\xcc\x59\x24\xce\x23\xbf\xf5\x21\x31\xe8" - "\x9f\xe7\x49\x0c\x22\x3e\xb5\xe7\x91\xff\x3c\xd8\x3e\x8f\x24\x18" - "\x62\xca\x29\xca\x23\xbf\x75\xb7\xe7\x91\x5f\xfb\x0a\xf3\xc8\xc3" - "\xa7\x39\x1c\x1d\x5e\xca\xe7\x91\xdf\x8e\xbb\x33\x78\xa4\x28\xb6" - "\xb6\xf3\x79\xe4\xe1\x87\xa4\xf3\xc8\xc3\xe3\xa5\xf1\x48\x8c\x39" - "\x21\x1e\x79\xb8\xb0\x2d\xe6\xf8\x3c\xf2\xf0\x7e\x61\x1e\x79\xf8" - "\x38\x9f\x47\xe2\xfc\x85\x78\xe4\x61\x33\x2f\x7f\x3b\x1e\x79\xa4" - "\x37\x9f\x47\x92\xeb\x38\x1e\x79\xe4\x00\x89\xa1\x07\x8f\x48\xe7" - "\x91\x47\x0a\xc5\x79\xe4\x91\x2d\x7c\x1e\x79\x24\x99\xf0\xc5\x23" - "\xc7\x08\x8f\x3c\x92\x41\xd2\x0f\x1e\xb6\x4d\xe7\x78\x24\x49\xe7" - "\x78\xe4\x11\xbd\xb4\xf9\x31\xb7\xa4\x0f\xb9\x83\xe6\xc7\xdc\xaa" - "\x3e\xe4\xce\x32\x3f\xe6\x5f\x99\xf2\x38\xe4\xbf\x32\xee\x8d\xe9" - "\xb9\xd5\xfd\xc7\x47\x1a\x08\xd7\x2a\xef\x27\xaf\xff\xb8\x5c\x2b" - "\x9f\xd7\x1f\x1f\xcc\xf1\xfa\xe3\x83\xc5\xc7\xfb\x97\xdf\x70\xcc" - "\xeb\xab\x52\x38\x5e\x5f\x71\x9a\xb4\xa9\x15\x87\x48\x9b\x5a\xb1" - "\xac\xdd\xf1\xfe\x49\xc8\x2d\x83\x1d\xef\xff\x1e\x1e\xef\x5f\x73" - "\x04\x65\x5c\x13\x1a\xef\xff\x5d\x33\xbf\x4f\xf9\xe8\x24\xa1\xf1" - "\xfe\xcc\x38\xff\xbc\x99\xb9\x26\xb1\x71\xfe\xaf\xdf\xfa\x71\xfe" - "\x1f\x82\x3e\xb0\xea\x81\x0f\xef\x3a\x3d\xf0\x2f\x76\xfe\xd6\x77" - "\x47\xe4\xe9\x81\xef\x0e\xf3\xf5\xc0\xf1\xb3\xf6\x7a\xa0\xc2\xdf" - "\x79\x3d\x50\x31\x4e\x9e\x1e\xa8\x18\xeb\x9c\x1e\xa8\xd8\x21\x3c" - "\xce\xbf\xdc\x28\x3e\xce\xbf\xbc\x41\x78\x9c\x7f\xd5\x38\x8e\xc7" - "\x55\xf5\xee\xfc\x7a\xa0\xf2\x80\x30\x67\xab\x3c\x42\xf4\x40\xc5" - "\xf6\x5b\xaf\x07\x2a\xb6\x0b\xeb\x81\x2a\x76\xfd\xcf\x8a\xed\xf6" - "\xfd\xca\x70\x8f\xa0\x1e\xa8\x9a\xdd\xf6\x1e\xa2\x07\x2a\x4a\x88" - "\x1e\xa8\x5a\x2d\xae\x07\xaa\xfb\x93\xd8\x55\x75\x83\xc4\x2e\xe2" - "\x53\x7b\x3d\x50\x55\xd9\xbe\x1e\x20\x18\x62\xca\x29\xaa\x07\xaa" - "\x7d\xec\xf5\x40\x79\x83\xb0\x1e\x38\x76\x99\xc3\xd1\xb1\x4c\xbe" - "\x1e\xa8\x9e\x76\x67\xe8\x01\x51\x6c\x1d\xe0\xeb\x81\x63\x03\xa5" - "\xeb\x81\x63\x31\xd2\xf4\x00\xc6\x9c\x90\x1e\x38\xb6\x83\xc5\x4f" - "\x89\xb0\x1e\x38\x56\x2e\xac\x07\x8e\x9d\xe5\xeb\x01\x9c\xbf\x90" - "\x1e\x38\xde\x9d\x97\xbf\x9d\x1e\x38\xee\xcf\xd7\x03\xe4\x3a\x4e" - "\x0f\x1c\xaf\x20\x31\xb4\xbc\x50\xba\x1e\x38\xbe\x43\x5c\x0f\x1c" - "\xdf\xcb\xd7\x03\xc7\x57\x11\xde\x7f\x5c\x4f\xf4\xc0\xf1\x02\x92" - "\x5e\x5e\x60\x9b\xce\xe9\x01\x92\xce\xe9\x81\xe3\x06\x69\x63\x4a" - "\x9c\xef\x57\xfe\xef\x8f\x29\xf1\xb8\xcb\xc6\x94\xfc\x5f\xa1\x3c" - "\x3d\xf0\x7f\x05\xf2\xb9\xe7\x2f\xd9\x1c\xf7\xfc\x25\x5b\x7c\xec" - "\xc2\x89\x79\x8e\xb9\x67\x4d\x0d\xc7\x3d\x7f\x1a\x46\xe2\xf7\x4f" - "\x0f\x91\xf8\xfd\xe3\x69\xb1\xb1\x0b\x78\x8e\x69\xe6\x7c\x32\xbf" - "\xf4\xe6\xd8\x05\xe0\x42\x84\x67\xfe\x38\x91\xcf\x33\x4f\x1c\x12" - "\x1a\xbb\x20\x38\x66\xa1\xcd\x1c\x52\x3c\x5e\xc1\x0c\x3c\xd4\xd5" - "\x31\x0b\x77\xef\x1c\xd2\xef\xdd\x08\xb7\xfc\xb1\x9f\x3c\x6e\xf9" - "\xa3\x96\xcf\x2d\x4f\x8d\xb0\xe7\x96\x3f\xae\x74\x9e\x5b\xfe\xb8" - "\x4d\x1e\xb7\xfc\x71\xab\x73\xdc\xf2\xa7\xae\xc2\x63\x16\x4e\x24" - "\x88\xf7\x35\x93\x73\xf6\x9c\xa0\x66\x1b\xc7\x09\x6a\x12\x3b\x3f" - "\xb7\xac\xd1\x08\xb7\xff\x35\xfd\x08\xb7\xfc\xc9\xe3\xd6\x73\xcb" - "\x9f\x3c\x84\xb9\x65\x4d\x1e\x69\x87\x7f\xf2\xb0\xe7\x96\x70\x8f" - "\x20\xb7\xac\x29\x6f\x7b\x0f\xe1\x96\x3f\x79\x12\x6e\x59\x73\x5e" - "\x9c\x5b\x9e\x64\xd7\x53\x3f\x39\x9e\xc4\x26\xe2\x53\x7b\x6e\x79" - "\xd2\xbf\x7d\x6e\x49\x30\xc4\x94\x53\x94\x5b\x9e\x9c\x67\xcf\x2d" - "\x4f\xc4\x0b\x73\xcb\x5f\x42\x39\x1c\xfd\x7c\x91\xcf\x2d\x4f\xee" - "\xbf\x33\xb8\xa5\x28\xb6\x34\x7c\x6e\xf9\xf3\x6a\xe9\xdc\xf2\xe7" - "\x83\xd2\xb8\x25\xc6\x9c\x10\xb7\xfc\x85\x5d\xff\x8b\xe0\xc5\x9e" - "\x5b\xfe\xd2\x5f\x98\x5b\xfe\x32\x82\xcf\x2d\x71\xfe\x42\xdc\xf2" - "\x97\x19\xbc\xfc\xed\xb8\xe5\x2f\x2b\xf9\xdc\x92\x5c\xc7\x71\xcb" - "\x53\x3a\xb6\xbd\xeb\x2d\x9d\x5b\x9e\xea\x2a\xce\x2d\x4f\xf5\xe0" - "\x73\xcb\x5f\x6a\x09\x87\x3c\x35\x9c\x70\xcb\x5f\x8c\x24\xfd\x84" - "\xc6\x36\x9d\xe3\x96\x24\x9d\xe3\x96\xa7\xc6\x3a\xe2\x96\x74\xae" - "\x77\x5c\x36\x65\x29\x81\x63\x1f\x94\xb3\x37\xb4\x6f\xa5\xf0\x7f" - "\x19\xb4\x53\x3d\xe0\xff\x63\x62\x9c\xc5\xe0\xe3\x1d\x67\x01\xfe" - "\x61\x81\xe7\x54\x1b\x7e\x2f\x2d\xed\x63\xc2\x65\xaf\x20\xed\x8b" - "\x77\x9c\xb7\xa9\x4b\x88\x85\x8e\x43\xb4\x1a\xfe\x4f\x86\x34\xb8" - "\xde\x0b\xda\x43\x6d\x12\xf2\xba\x42\x9d\xaa\xb7\x5e\x07\x65\xf6" - "\x3a\x47\x9d\xda\x86\xf3\x80\xb2\x1a\xe1\x7d\x22\x45\xcb\x0a\x79" - "\x85\x6f\xeb\x8b\x96\x9a\xe8\x5f\x4b\xe7\x5c\x43\xb5\xd4\xe9\x51" - "\xde\xf5\x5d\x42\x20\x0e\x21\xcc\x05\x4b\xfa\x18\xdc\x70\x9e\xa5" - "\x73\x5a\xf0\x39\x3f\x7c\xce\x0c\x65\x4c\x9d\x8d\xa8\xac\x6b\x5d" - "\x3c\x80\x5b\xb9\xa7\x35\xd0\x75\x73\x4d\x50\x66\x68\x5f\xbf\xe9" - "\x5b\xe3\xb6\xeb\x83\x1a\xa6\xed\xa9\x6a\x30\x33\x79\x68\xe7\xe0" - "\xf2\x9c\x1e\x53\x04\xd7\x0b\x95\x61\xe5\x4e\x34\xc0\xdd\x9f\xd6" - "\x4b\x6b\xef\x4e\x8b\xae\xff\xe2\xbd\xac\x2f\x2a\x7d\x1c\x6c\xa7" - "\x45\x94\xd0\x79\x69\xcf\xf9\x37\x72\xc0\x31\x3d\xde\xef\x45\x37" - "\xa4\x6d\x40\xd4\x5a\x4b\x17\x8f\x6f\x21\x26\x6e\x5c\x4f\x1b\x9a" - "\xd6\xfc\x7b\x96\x5e\x51\x99\x8d\x6d\xfe\x0e\x9c\x5f\xdb\x8b\x36" - "\x5c\x5f\x8e\x71\xf3\xef\x15\x87\xa0\x6d\x6f\xeb\x8b\xf9\xb1\xb3" - "\x63\xb4\x09\x33\x66\x4f\x9f\x9b\x98\xa0\xed\x1f\xdb\x0d\x4d\x98" - "\x3b\x57\x3b\x3b\x66\xce\x22\xad\xed\x99\x67\xb5\xb1\x33\x16\xc4" - "\xbc\x31\x6b\xfa\xc0\xd9\x6f\xc6\x77\xc3\x85\xb2\x29\x87\x1a\x97" - "\xc5\xb2\xe6\xdf\xd9\x45\xeb\x10\x7a\xbf\x27\x72\xc3\xe5\x82\xe7" - "\x35\xe8\xdd\x06\xd4\xe2\xe7\x65\xad\xa7\x1b\x28\xb8\x26\x0d\x62" - "\xda\xda\xd4\x2e\xf8\x5a\xb4\x11\xca\x55\x04\xe5\x86\x32\x42\x99" - "\xcf\x68\xad\x65\xb6\x62\x22\x0d\x63\x22\xf5\x1a\x60\xf0\xcc\x28" - "\x6f\x63\x97\x60\x9a\x8e\xc4\xef\xd7\x00\x75\x45\x01\x69\x27\x19" - "\x7d\x90\xe7\x1d\x07\xf7\x4e\xb5\x62\xcc\x92\x1b\x89\xe8\xf5\xde" - "\x01\xc0\x2b\x15\x4d\x74\xdc\x73\x80\x4d\x7c\xff\xb6\xa7\x10\x4a" - "\xa7\x9b\x22\x99\xfd\x26\xe8\x26\xc0\x30\xc1\x29\x9c\xd3\xa7\x5c" - "\xa7\xd0\x48\xc8\xa3\x58\x8f\xde\xcb\xc0\x79\xe8\x21\x0d\xdb\xdc" - "\x52\x9c\x98\x3d\x51\x87\xd2\x1f\x4b\x47\xe9\x4d\xf8\x9e\xcd\x43" - "\xe3\xbc\x13\x90\x22\x3c\x99\x3e\x03\x71\x47\x41\xf7\x4b\xcc\xa6" - "\xb7\x0c\x8d\xd3\x53\x67\x56\x58\xf2\x22\xf1\xfb\xd4\x43\x3e\x75" - "\x7a\x45\x17\xe6\x3d\xd6\xae\x67\x6c\x5f\x8f\xdf\x1d\xec\x03\x3a" - "\x87\x2e\xa5\x97\xb3\x75\x28\x3b\x40\x65\xc9\x4e\x37\x56\xbb\x35" - "\xa2\x70\x13\xdd\x4a\xe7\x04\xa8\xaa\x1a\x1a\x20\xa6\xc5\xbf\x49" - "\x77\xfb\xf7\x26\x6f\xd3\x8c\xe9\x1b\x7b\x42\x5d\xcc\x49\x37\xd2" - "\x39\xa1\xc7\x26\xfa\x23\x55\xd3\x1a\xfd\x68\xab\x3d\xc1\x96\x6e" - "\xd2\x70\xa4\x67\xc6\xbf\x60\x3c\x40\x79\x58\x3c\xe8\x73\x0f\x25" - "\xd8\xe3\xe1\x66\xdd\x5c\x1f\x1c\x6f\xa2\x23\x83\x5b\x73\x83\xb7" - "\xd2\xea\xe0\xdc\xd4\xf3\xe8\x3e\x6c\xdb\x2a\xd0\x01\x59\x49\x48" - "\x93\xf9\x3a\xd2\x46\x2d\x52\x21\x43\x5e\x70\xb6\xf7\xb2\x74\x05" - "\xd8\x84\x82\xf8\x12\x00\x31\x33\xa0\xb5\x57\x24\x4a\x99\x8e\xa8" - "\x1d\xe7\x4a\x28\xcc\x9f\xf1\x18\x94\x0b\xd4\xd9\x89\x45\x70\x1f" - "\xfd\x7b\x24\xc2\xfe\x60\x7c\xf1\x7b\x1c\x1a\x37\x03\xda\xe7\x99" - "\xcc\xf9\xd5\x85\x90\xa7\xb4\xf7\x3a\xcb\xf0\x5f\x33\xf8\xea\x29" - "\xf0\x53\x75\xad\x99\xc9\x93\xf1\xd5\x2c\xce\x57\x07\xa1\x1c\x9c" - "\xbf\xce\xaa\xb0\x5f\x45\xde\xd9\x40\xde\x39\x44\x47\xab\x43\xd4" - "\xe2\xef\x1c\xa2\x22\xef\xec\x7e\xcd\xf1\x3b\x9f\x0b\x75\xfc\xce" - "\xe7\x96\x4a\x7f\xe7\x73\x6a\xe9\xef\x7c\xce\x4d\xfc\x9d\x43\x58" - "\x3f\x87\x80\x9f\x43\x1c\xf8\x39\x84\xf5\xf3\xfd\xe7\x1c\xbf\xf3" - "\x7f\x46\x38\x7e\xe7\xff\xcc\x93\xfe\xce\xff\xf1\x90\xf1\xce\x46" - "\x07\xef\xcc\xfa\x39\x14\xfc\x1c\xea\xc0\xcf\xa1\xac\x9f\x7b\x7c" - "\xef\xf8\x9d\x6b\x07\x39\x7e\xe7\xda\xe9\x32\xde\xd9\x24\xfd\x9d" - "\xff\x53\x2f\xfe\xce\xa1\xac\x9f\x43\xc1\xcf\xa1\x0e\xfc\x1c\xca" - "\xfa\xf9\x99\x35\x8e\xdf\xf9\x7c\x7f\xc7\xef\x7c\x7e\x92\xf4\x77" - "\xae\x35\x48\x7f\xe7\x5a\xbd\x83\x77\x66\xfd\x1c\x06\x7e\x0e\x73" - "\xe0\xe7\x30\xd6\xcf\x53\x9e\x77\xfc\xce\x17\x7a\x3b\x7e\xe7\x0b" - "\xe3\xa4\xbf\xf3\xf9\x5a\xe9\xef\x7c\xfe\x84\xd8\x3b\xb7\x40\xdc" - "\xf6\x84\x77\x69\xfd\x29\x32\xd8\xac\x0e\x2e\xf0\xac\x45\x54\xc1" - "\x72\x4b\x9c\x77\x1d\xea\x0a\xef\x16\x47\xaf\x9f\x7c\x0c\xff\xb5" - "\xa8\x83\xf3\x5b\xd4\xc1\x5b\x9b\x7b\x79\x07\x2c\x99\x86\xee\xc3" - "\x7c\x7c\xb5\x05\x69\x2c\xb9\xc1\xb9\x19\x2f\x23\x6d\x9a\x01\xa9" - "\xaa\x52\xf5\x28\x35\x9e\x36\x54\xa1\xb3\xa8\x7b\x1d\xd6\x9e\x3f" - "\xa3\x8a\xfa\x32\x34\x67\x3e\x4d\x5f\xa0\x7e\xdd\x80\xfb\x4d\x80" - "\x27\xa7\x67\xff\x88\xb4\xf0\x8c\x80\x22\x38\x70\x3e\xde\x63\xa1" - "\xfd\x5c\x3f\xf9\xfb\x8d\xa9\x48\xf3\xf5\xcc\x3a\x84\xd3\x0b\xe1" - "\x30\xaf\x8f\x44\xa9\xd3\x10\xb5\xf3\x5a\x0d\x45\xda\xe6\x5f\xa7" - "\xb7\x6d\x9b\xc7\xc6\x80\x2d\xdf\x60\xce\xed\x2e\x78\x59\xaa\x2d" - "\x7f\x0d\xb0\xb6\xdd\x8c\x2d\x4f\x99\x49\x7b\xdf\xa6\xed\xfe\x1a" - "\x9e\xcf\xd9\xf2\x57\x2d\xb6\x25\x9d\x1b\x5c\x52\x5d\xd7\x82\x75" - "\x93\xea\x42\x32\xa2\xf4\xd4\x85\x63\x55\xf1\xd7\x90\x88\x8d\x0d" - "\x9c\x8d\x43\x7c\x3d\x6b\xdd\xaf\x09\xdb\x38\x44\xd3\xa2\x0e\xd1" - "\xd9\xdb\x38\x44\xed\x9c\x8d\xeb\xcc\xae\xdb\xb8\xae\x5c\xdc\xc6" - "\x17\x7d\xa4\xdb\xb8\x2e\x57\xba\x8d\xeb\x56\x10\x1b\x87\x04\xf0" - "\x6d\x5c\x37\x58\xdc\xc6\x21\x36\x38\x0e\x01\x1c\xdf\x7f\x4e\xc4" - "\xc6\x80\xe3\x10\x01\x1c\x87\x38\x89\xe3\x4b\x31\xae\xdb\xf8\xd2" - "\x40\x71\x1b\x5f\x5a\x24\xdd\xc6\x17\x8d\xd2\x6d\x7c\xb1\x8e\xb5" - "\x71\x1b\x1c\x5f\xcc\x77\x60\x63\x1b\x1c\x87\x02\x8e\x7b\x7c\x2f" - "\x6c\xe3\x50\xc0\x71\xa8\x00\x8e\x43\x9d\xc4\xf1\x6f\x47\x5c\xb7" - "\xf1\x6f\x39\xe2\x36\xfe\xed\xb4\x74\x1b\xff\x36\x55\xba\x8d\x7f" - "\x1b\x4b\x6c\x1c\xda\x06\xc7\x97\x4c\xe2\x36\x0e\xb5\xc1\x71\x28" - "\xe0\xf8\x99\x35\x22\x36\x06\x1c\x87\x0a\xe0\x38\xd4\x49\x1c\x5f" - "\xf6\x77\xdd\xc6\xf5\x37\xc4\x6d\x7c\x79\x94\x74\x1b\xd7\x97\x4a" - "\xb7\x71\x7d\x09\x6b\xe3\x36\x38\xae\x8f\x76\x60\x63\x1b\x1c\x87" - "\x01\x8e\xa7\x3c\x2f\x6c\xe3\x30\xc0\x71\x98\x00\x8e\xc3\x9c\xc4" - "\xf1\x95\x4c\xd7\x6d\x7c\x65\x92\xb8\x8d\xaf\x6c\x91\x6e\xe3\x2b" - "\x7e\xd2\x6d\x7c\x45\x4d\x6c\x1c\xd6\x06\xc7\x97\x0f\x8b\xd9\xb8" - "\x15\x34\x60\x77\xb0\x71\xf7\x7a\x44\x15\x62\xdb\xd6\x10\xdb\x9a" - "\x7b\x4d\x3e\x56\x48\x59\xe2\xb0\x4d\x98\x3e\xa0\xdf\x34\x5e\xe6" - "\xdc\xe0\x02\x9a\x82\x77\x4a\xc5\xfd\xae\xbf\x77\x37\x2d\x47\x5e" - "\xda\x54\xdc\xff\x6b\xb8\x88\xaf\xd1\xa6\xbe\x7b\x1a\x9e\xa7\xc4" - "\xfd\x5e\xa6\x3c\x2f\x95\xd9\xe7\x45\x3d\x9c\x1b\x43\xf7\x1f\x96" - "\x0e\x7a\xb3\x84\x7e\x5b\xa3\xae\xae\x2f\x01\xfb\x1c\x45\x55\x35" - "\x5f\x21\x4b\xaf\xc9\xdf\x3f\x65\x42\x3a\xfa\x37\x9d\xba\x22\x41" - "\x8f\xcc\x6f\x6a\x3c\xab\x93\xcb\x50\x75\xf2\xdf\x50\x78\x1d\xdd" - "\x48\xff\x47\xe7\xd9\xea\x13\xa3\x31\xfb\x4c\x2e\x31\xe7\xcd\xdc" - "\x6a\xf2\x89\xf1\xd8\x91\xa4\xa7\x3c\x8d\x48\x37\xab\x96\xa6\xb3" - "\xde\x40\x6e\x59\xe7\x90\xc7\xda\x37\x90\xe7\xda\x73\x48\x55\x51" - "\x5b\x83\x2a\x2f\x95\xa1\xca\x6b\x27\x51\x65\x23\x1c\x2d\x70\x58" - "\xe0\x48\x3f\x09\xbe\x46\x68\xdc\x65\x84\xd2\x6a\x69\xc3\x13\xa7" - "\x90\xba\xc2\x54\x83\xf0\x98\xa9\x2b\xd4\xef\x67\x3d\xa3\x91\x9a" - "\xfe\x8f\x06\xd1\x6f\x6a\x28\x38\xe7\x86\xd3\xab\x4d\x06\x54\x51" - "\x6b\xc4\xe7\x4b\xe1\xbc\x5b\x5a\x2d\xe4\x6f\x29\xc3\x7b\x71\x1a" - "\x2a\xd2\xcb\x91\x29\xe7\x6b\x44\x63\x0d\xdd\x2b\x38\x3e\x1b\x4c" - "\x6d\xa1\x35\x8f\x10\x1c\x18\x9a\x8b\x2c\x52\x7d\x6d\x50\x31\x36" - "\x7e\x5b\xd3\x13\xec\xdc\xc7\xf2\x76\xa4\xea\xa5\x93\x67\x68\x3c" - "\x5e\x0f\xf7\x25\x54\x35\x1c\x45\xf8\x5b\x53\xf8\x22\x84\xc6\x9a" - "\x11\xc2\xb6\xa8\x4e\xae\x43\x2f\xc5\x23\x6f\xdc\xff\x6c\xf9\x4d" - "\xd7\xb3\x1a\x28\xf6\x52\x13\x94\xf1\x8a\xf1\x66\x19\xab\x56\x54" - "\x21\x38\xd7\xa7\x2a\x4e\x8f\x3c\xe3\x91\x0a\xdb\xd7\x94\x1b\x9c" - "\xff\x12\xd4\x9f\x39\x0d\x34\x8d\x6d\x8b\x6d\x8a\xed\x8b\xf3\xb3" - "\xda\xbc\x3a\xd6\x80\xd2\x8c\x48\x55\x9d\x0a\x7f\x93\x69\x43\x35" - "\xba\x8a\xf4\xd4\xef\x0d\x74\x8f\xaf\x11\xe0\xe2\x04\xc6\x02\xfc" - "\x76\x03\xff\xf7\x14\xc6\x54\x88\x9a\x60\xca\xfd\x5a\xfb\x98\x0a" - "\xf1\xe5\x30\x75\x35\x86\xc3\xd4\xf5\x11\xe2\x98\xba\xb6\x81\x60" - "\x2a\x24\xa0\x73\x62\xea\xda\x10\xc7\x98\xba\xa6\x16\xc7\x54\x88" - "\x0e\x30\x65\xe0\x63\xea\xfa\x38\xe9\x98\xba\x16\xdb\x71\x98\x0a" - "\xd1\xc8\xc3\xd4\xb5\x10\x3e\xa6\xae\x46\x3a\xc0\x14\x1b\xa7\xee" - "\x3f\xe7\x04\xa6\x6c\xe2\xd4\xf5\xbd\x1c\xa6\x6e\xe4\x88\x63\xaa" - "\xe1\x32\x8b\xa9\x4e\x1a\xa7\x1a\x56\x3b\xc6\x54\x43\x9c\x03\x4c" - "\x41\x9c\x0a\x69\x13\xa7\x6e\x6c\x92\x8e\xa9\x86\x7d\x1d\x88\x29" - "\x99\x71\xaa\xa1\x80\x8f\xa9\xeb\xdb\xc5\x31\x15\xca\xc6\xa9\x1e" - "\xdf\xb7\x8f\xa9\x50\x9b\x38\xd5\xd8\x95\xc3\x54\xd3\x79\x71\x4c" - "\x35\x8d\x22\x98\x0a\xed\xa4\x71\xaa\xf1\xb4\x63\x4c\x35\x1e\x10" - "\xc7\x54\x28\xc4\xa9\x90\x36\x71\xaa\xe9\x86\x74\x4c\x35\x79\x76" - "\x1c\xa6\x42\x65\xc6\xa9\x46\x03\x1f\x53\x8d\xc8\x01\xa6\xd8\x38" - "\xf5\xcc\x1a\x27\x30\x65\x13\xa7\x8c\xd3\x38\x4c\xb5\x0c\x13\xc7" - "\x54\x73\x1e\x8b\xa9\x4e\x1a\xa7\x9a\x07\x39\xc6\x54\xb3\xca\x01" - "\xa6\x20\x4e\x85\xb6\x89\x53\x2d\xa1\xd2\x31\xd5\x1c\xdd\x81\x98" - "\x92\x19\xa7\x9a\x47\xf3\x31\x65\x9c\x20\x8e\xa9\x30\x36\x4e\x4d" - "\x79\xbe\x7d\x4c\x85\xd9\xc4\xa9\x96\xdd\x1c\xa6\x4c\x99\xe2\x98" - "\x6a\xbd\x48\x30\x15\xd6\x49\xe3\x54\xeb\x4a\xc7\x98\x6a\x8d\x15" - "\xc7\x54\x18\xc4\xa9\xd0\x36\x71\xca\x54\x28\x1d\x53\xad\x7b\x3a" - "\x0e\x53\x61\x32\xe3\x54\x6b\x3e\x1f\x53\x2d\x5b\xc5\x30\xd5\x82" - "\x75\x9f\x02\x30\x15\x07\xba\x0f\x30\xe4\x7d\x8c\x60\xaa\x15\x30" - "\xf5\xa1\x2d\xa6\x7e\x69\xab\xfb\xcc\xee\x96\x9b\x98\xa2\x7b\xb4" - "\xc5\x94\x05\x30\xd5\xca\x60\xca\xe2\x6f\xd5\x7d\xd5\xf5\xc5\xe0" - "\xab\x4b\xa8\x3a\x02\xf0\xb4\x9e\xc5\xd3\x2f\x80\x27\x78\x1f\x0b" - "\xbc\x6f\xc5\xa9\x1a\x14\x6e\x20\xef\xd5\x02\xef\x6b\xb1\xc5\x52" - "\x4b\x1d\x85\x31\x84\xb1\x63\xc5\x51\xe5\x1c\xc0\xcf\xfc\xe3\xa8" - "\x32\x09\x8e\xc5\x70\xa4\xc2\x81\x8e\xa3\x8a\x3a\xc4\xf4\xd9\x73" - "\xf8\x39\xc6\xe2\xc7\x7c\xc4\x31\x7e\xcc\x9b\xa5\x69\x3c\xba\x9f" - "\x74\xfc\x98\xad\xeb\xff\xa8\xc2\xc7\x9f\xa1\xf1\xf8\x58\x82\x91" - "\x4b\x28\xdc\x84\xbc\xe9\x29\xba\x9e\x9e\x91\x48\xb5\xc4\x8c\xa8" - "\xcc\x37\x90\x2a\xf3\x67\x78\x5f\x6b\xdd\x39\x87\x3c\x8f\x1a\xbf" - "\x42\x15\xd7\x6a\x50\x45\x63\x39\xaa\xb0\xc0\x71\x09\x0e\x28\x63" - "\xf8\x74\xdb\xf7\x35\xb0\xef\x6b\xd9\x0b\x79\xf9\x89\xbf\xaf\x25" - "\x97\x79\xdf\x58\x78\xdf\x16\xee\x7d\xab\x01\x8b\xe0\x97\x3e\x16" - "\x56\x27\x86\x1b\x50\xd7\xb9\x26\x9a\x6e\x61\x31\x88\xfd\x72\xf4" - "\x84\x11\x85\xc7\x83\xaf\xde\x04\x0c\xd6\x6e\x45\x69\x29\x80\xc1" - "\x16\x23\xfe\xae\x6f\xa8\x4e\x6f\x06\x0c\x9a\x6b\x68\xb0\x5b\x2b" - "\xc6\xe0\x2f\x18\x83\x26\x93\x45\x14\x83\xa0\x13\x19\x0c\x82\x4e" - "\x6c\x17\x83\xb6\x3a\x91\x5e\x7d\x13\x83\x4a\x45\x9e\x28\x06\x95" - "\x68\x87\x55\x27\xfe\xd7\x31\xa8\x44\xa1\x0e\x31\xa8\x44\x3a\x49" - "\x9a\x50\xa9\xd8\x22\x19\x83\x4a\x94\xdc\x61\x18\x54\x2a\x86\x39" - "\xc4\xa0\x52\xa1\x69\x1f\x83\x21\x1a\x59\x18\x54\xa2\xa9\x7c\x0c" - "\xd2\xe9\x0e\x30\xc8\xc6\x41\xd0\x95\xed\x63\x90\x8b\x83\x4a\xaa" - "\x3b\x87\x41\xb7\xde\xe2\x18\x54\x0e\xb2\xea\xca\xff\x3e\x06\xa9" - "\x4a\xc7\x18\xa4\xb6\x4b\xd2\x90\x4a\x37\x7f\xe9\x18\xa4\x4c\x1d" - "\x87\x41\xe5\x41\xc7\x18\x54\x16\x38\x81\x41\x79\x71\x50\x49\xe9" - "\x79\x18\x54\x52\x6e\xe2\x18\x0c\x65\xe3\x20\xe8\xd0\x76\x31\x68" - "\xa3\x43\x95\x6e\x39\x1c\x06\xef\x2b\x14\xc7\xa0\xfb\x5e\xab\x0e" - "\xfd\xef\x63\xd0\x7d\xbc\x63\x0c\xba\x07\x48\xd2\x9c\xca\xfb\x76" - "\x48\xc7\xa0\x7b\x7a\xc7\x61\xf0\xbe\x51\x8e\x31\x78\x9f\xb6\x7d" - "\x0c\x86\xca\x8c\x83\xee\xb1\x7c\x0c\xba\xad\x72\x80\x41\x36\x0e" - "\x82\x6e\x6d\x1f\x83\x36\x71\xb0\x8b\x0f\x87\xc1\xae\xfd\xc4\x31" - "\xe8\x31\xcc\xaa\x5b\xff\xfb\x18\xec\xf2\x83\x63\x0c\x76\xd9\x23" - "\x49\xa3\x2a\xbb\x0e\x92\x8e\x41\x0f\xb7\x8e\xc3\xa0\xc7\x11\xc7" - "\x18\xf4\xd8\xec\x04\x06\x65\xc6\xc1\x2e\x75\x7c\x0c\x76\xf1\x14" - "\xc7\x60\x18\x1b\x07\x41\xe7\xb6\x8b\x41\x1b\x9d\xab\xec\xba\x81" - "\xc3\xe0\xfd\x5b\xc4\x31\xd8\xed\xa0\x55\xe7\xfe\xf7\x31\xd8\x6d" - "\x92\x63\x0c\x76\x0b\x94\xa4\x69\x95\xf7\xef\x95\x8e\xc1\x6e\xab" - "\x3a\x0e\x83\xf7\x87\x3a\xc6\xe0\xfd\xba\xf6\x31\x18\x26\x33\x0e" - "\x76\x9b\xc5\xc7\x60\xd7\x6c\x31\x0c\x5a\x40\x17\xb7\x6e\x1e\x96" - "\x6e\xc9\x8d\xd1\x78\x2b\xb4\xc8\xa4\x7e\x51\x5f\x9d\xd0\x80\x5e" - "\xba\x01\xf6\x89\xbf\x81\x5e\xbf\xa1\x42\xe6\xdc\x18\x0f\xd0\x85" - "\xf9\x36\xfa\x99\x19\x5b\x66\xca\xfe\x1a\xad\x9d\x83\xdc\x40\x7f" - "\xe3\x76\x3c\xa0\xfa\x82\x11\xe1\xe7\x2f\xc5\xe5\xb9\xc4\x95\x07" - "\xf7\x13\xd0\xbf\xeb\x54\xcc\x37\xe6\x16\x3d\xaa\x1d\x8e\x94\x15" - "\xb5\x7a\xb0\xc3\x62\xc6\xbf\xd8\x2e\x17\x94\x9e\xab\x36\x5e\x41" - "\x6e\xa6\xff\x68\xfa\x80\xbd\xd5\xdd\x17\x22\x85\x6f\x2d\x6d\xc1" - "\x76\xc5\xf6\xc2\x36\xd6\x2e\xa6\x69\xb8\xee\x64\x15\x60\xcc\xf4" - "\x1f\x5d\x9f\x22\xb8\x4e\x50\xaf\x2a\x3d\xcf\x4a\xc7\x86\xe7\x66" - "\x66\xde\x82\xd2\x33\xbd\xe2\x14\x12\xfc\x76\x6c\x01\xfd\xe6\x9c" - "\xad\x42\x34\x36\x3a\xef\x36\xd8\xaa\xfb\x1e\xe7\x6c\xe5\xe5\xce" - "\xb7\x95\x90\xae\xf2\xea\x2e\xdd\x56\xdd\x8f\x11\x5b\x75\xdf\xee" - "\xc0\x56\x4e\xe2\x2a\x24\xdf\x46\x8f\xdc\x06\x5b\x79\xe9\x9d\xb3" - "\x95\xf7\xa0\x36\xb6\x12\xe0\xff\xde\xc3\xa4\xdb\xca\xcb\x44\x6c" - "\xe5\x55\x23\x6e\xab\x50\x27\x71\x15\xaa\xb1\xe1\xcd\xb7\xc1\x56" - "\x2a\x4f\xe7\x6c\xa5\x9a\xc6\xb7\x95\x10\x4f\x55\x4d\x97\x6e\x2b" - "\x95\x8e\xd8\x4a\xe5\xe6\xc0\x56\x4e\xe2\x2a\x34\xdf\x86\xdf\xdd" - "\x06\x5b\xf5\x08\x74\xce\x56\x3d\x56\xb7\xb1\x95\x00\x9f\xea\x91" - "\x23\xdd\x56\x3d\x26\x10\x5b\xf5\x08\x10\xb7\x55\x98\x93\xb8\x0a" - "\xd3\xd8\xf0\x90\xdb\x60\xab\x9e\xb1\xce\xd9\xaa\xe7\x5e\xbe\xad" - "\x84\xda\xfd\x9e\x07\xa5\xdb\xaa\x67\x3a\xb1\x55\xcf\xa9\x62\xb6" - "\x32\xe7\x06\xe7\x7a\x83\x0d\x9a\xd7\x07\xc7\x7b\x27\x23\xaa\xc5" - "\x0f\xec\xa6\x06\xbb\x2d\xd3\xa2\xd6\x5c\xb0\x9b\xc1\x84\x5e\x9a" - "\x77\x86\xae\xaa\x37\xa3\x16\xb0\x59\xb3\x3a\x38\xbf\xda\x50\x87" - "\xc7\x1c\xfd\xe9\x9c\x52\x5d\x38\x65\x9e\x0a\x61\xbb\x61\x3b\x60" - "\xdb\xd1\x60\x37\xc6\x8e\xea\x99\x5b\xcd\xea\xc9\x25\xe3\x2e\x9f" - "\xa1\xe7\xea\x69\x1a\xbf\x2f\xad\xf6\x62\xbe\x0b\x84\xd7\xa1\xae" - "\xda\x97\xf1\x3b\xa9\xc7\xe1\xf4\x6a\x43\x0d\xf0\x83\x6b\x88\xe1" - "\x66\x67\x74\x6a\xf3\x6b\x3a\x4f\x73\x75\x64\x30\xdd\xcb\x3b\xc0" - "\xd4\x2b\x12\xa5\x5d\x46\xf7\x61\xfe\x90\x65\x41\x9a\xa5\xb3\x11" - "\xb5\x73\x66\x29\xc5\xcc\x5d\x9b\xcf\xe4\xd1\x1b\xec\xa2\xa1\xaf" - "\xdb\x8c\xe9\xbe\x1e\x87\xaa\x2f\x64\x33\x7e\x6b\xcb\x11\x18\xbf" - "\xfd\xa4\x53\x01\xcf\x0c\xa0\xd5\xc1\x5b\xb3\xab\x90\x96\x6e\x05" - "\x1b\xe3\xf9\x44\x4a\x1f\xf7\x8d\x2d\x52\x6d\xfc\x07\x66\xfc\xb7" - "\x45\xcb\x8e\xdf\x02\x3b\xe1\xe7\x33\xe3\xb7\xe2\x6d\xc6\x6f\x41" - "\x99\x6f\x8e\xdf\x52\xfe\x61\x2b\x1e\xbf\x65\x39\xa3\xe9\x63\x7d" - "\xf7\xb9\xb3\x68\x1a\xde\xbd\x67\x55\x83\x01\xe1\xf7\xaf\x6a\x28" - "\x45\x69\x09\x48\x55\xd5\x52\x87\x52\x1b\x68\x43\x55\xfa\x45\x14" - "\x7e\x03\xf3\x60\x8c\x17\x75\x1e\xf1\xeb\x1f\xe2\x2c\x67\x74\x7d" - "\xf4\x4a\x75\x46\x15\xb4\x4c\x36\xf3\x78\xe2\x80\x33\x7b\x80\x1f" - "\xe2\xaa\xd3\xcf\x81\x4f\xa6\x04\x54\x9b\x7e\xc6\x7e\x8a\x83\xf3" - "\xc3\x6f\xf2\xeb\x5e\x53\x9e\xc6\x69\xd8\x67\xf8\x7b\x53\x75\xbc" - "\x81\xb9\xc6\x7a\x1e\xe3\xc2\x3b\x39\x1d\x55\x27\xb7\xa0\x2a\x88" - "\xe6\xf0\x3c\xf5\x77\x91\x35\x22\x38\x0a\x51\xb3\x38\x32\x78\x27" - "\xbb\x5f\x6b\x1f\x47\x21\x1a\x0e\x47\xbd\xce\xbb\x86\xa3\x5e\x79" - "\xae\xe3\xa8\x57\x8c\x7c\x1c\x85\xe8\xf8\x38\x7a\x60\x9c\x74\x1c" - "\xf5\x1a\x20\x1d\x47\x3e\x06\xd7\x70\xd4\xeb\x34\xc1\x91\x4f\x09" - "\xc1\x51\xaf\x13\x1c\x8e\x98\xb9\x51\xb7\x09\x47\x3e\x53\x1d\xe0" - "\x88\x8d\x47\x21\x10\x8f\xee\x3f\xe7\x04\x8e\x6c\xe2\x51\xef\x81" - "\xae\xe1\x48\x73\xda\x75\x1c\x69\xb6\xb9\x80\xa3\x36\xf1\xa8\x77" - "\x9e\x74\x1c\x69\x12\xa4\xe3\x48\x13\xe8\x1a\x8e\x7a\xf7\x27\x38" - "\x7a\xc0\x48\x70\xd4\xdb\x97\xc3\x11\x33\xdf\xec\x36\xe1\xe8\x81" - "\xcd\xe2\x38\x0a\x65\xe3\x51\x08\xc4\xa3\x1e\xdf\xb7\x8f\xa3\x50" - "\x9b\x78\xf4\x60\xa2\x6b\x38\x7a\xb0\xbf\xeb\x38\xea\x73\x55\x3e" - "\x8e\x42\xdb\xc4\xa3\x07\x4f\x4b\xc7\x51\x9f\x03\xd2\x71\xd4\x27" - "\xdd\x35\x1c\x3d\x38\x9b\xe0\xa8\x4f\x10\xc1\xd1\x83\xb1\x1c\x8e" - "\x98\x39\x7c\xb7\x09\x47\xbd\xeb\x1d\xe0\x88\x8d\x47\xa1\x10\x8f" - "\x9e\x59\xe3\x04\x8e\x6c\xe2\xd1\x43\x07\x5d\xc3\xd1\x43\xb3\x5d" - "\xc7\xd1\x43\xc3\x5c\xc0\x51\x9b\x78\xd4\xb7\xbf\x74\x1c\x3d\xe4" - "\x26\x1d\x47\xbe\x65\xae\xe1\xe8\xa1\xbd\x04\x47\xbe\xab\x08\x8e" - "\x1e\xda\xce\xe1\x88\x99\x17\x79\x9b\x70\xe4\x3b\x58\x1c\x47\x61" - "\x6c\x3c\x0a\x85\x78\x34\xe5\xf9\xf6\x71\x14\x66\x13\x8f\xb4\xee" - "\xae\xe1\xe8\xe1\xbd\xae\xe3\xe8\xe1\x65\xf2\x71\x14\xd6\x26\x1e" - "\x69\x67\x4b\xc7\xd1\xc3\x63\xa5\xe3\xe8\x61\x95\x6b\x38\x7a\xd8" - "\x4c\x70\xd4\xf7\x18\xc1\xd1\xc3\x0d\x1c\x8e\x98\xb9\xa6\xb7\x09" - "\x47\x7d\x53\xc4\x70\x84\xd7\x22\x78\x9f\xac\x0b\xd1\xb0\x76\x31" - "\x0a\xdc\x88\xff\xb6\xa0\x80\xa6\x2c\xed\xe6\x43\x29\x64\x3d\x00" - "\xbd\x52\xcb\xf4\xf7\x0a\xdd\x7f\xff\x36\xf0\x8b\x3a\x38\x3b\xfc" - "\x34\x59\xa3\x01\xaf\x0b\x72\x3d\x2d\x0e\x3d\x85\xd7\x65\x50\xf6" - "\x3b\x85\xd7\xb1\xba\xb9\x76\x80\x5a\x64\xed\x80\xc9\xe2\x6b\x07" - "\xb4\xac\xb7\xce\xbb\xdd\xca\xcd\xbb\x55\xf6\xdb\xe6\x70\xde\xad" - "\xb2\x5f\x4e\xe1\x64\xa9\x78\xe8\xc7\xcc\xff\xba\xde\x2b\x38\xbe" - "\x29\xab\x5f\x31\xbc\x73\x32\x79\xf7\x47\x7c\x91\x53\xf3\x71\xb7" - "\xda\xe0\xa4\xdf\xd8\x89\x53\x51\x3a\xbd\x46\x5f\x4c\xfb\x04\x67" - "\xd3\x79\xc1\xc5\x12\xcb\x52\xe7\xd8\xde\x21\x2a\x61\x7b\xff\x71" - "\x2c\x6b\x6f\x32\xcf\x59\x2d\xb2\x6e\xc1\x64\xf1\x75\x0b\x84\xed" - "\xfd\x47\xc7\xf3\x9c\x95\x7f\x54\x48\xb7\xf7\x23\x15\xac\xbd\x0d" - "\x4d\x59\x7f\x54\x71\xf6\xfe\x63\x86\x74\x7b\x3f\x72\x80\xd8\xfb" - "\x6c\x2e\xed\x13\xa2\xa2\xf3\x42\x24\x96\xe5\x8f\x91\xed\xd8\x5b" - "\x04\xdf\x7e\x07\x88\xbd\xd9\x35\x13\xd4\x22\x6b\x26\x4c\x16\x5f" - "\x33\x41\xd8\xde\x7e\xab\x1d\xdb\xdb\x6f\x9e\x74\x7b\xfb\x0d\x27" - "\xf6\x0e\x01\x7c\xfb\xa5\x73\xf6\xf6\x73\x72\x5d\x01\x5b\x7b\xfb" - "\x0d\x20\xf6\x3e\xb7\x0a\xec\x0d\xf8\x0e\x91\x88\x6f\xbf\x32\xc7" - "\xf6\x0e\x15\xc1\xf7\xa3\x03\x58\x7b\xb3\xf8\x16\x59\xaf\x61\xb2" - "\xf8\x7a\x0d\xc2\xf6\xee\xdf\xec\xd8\xde\xfd\xcf\x4a\xb7\x77\xff" - "\xed\xac\xbd\x01\xdf\xfd\x0d\x9c\xbd\x1f\x9d\x25\xdd\xde\xfd\x0b" - "\x88\xbd\xff\x93\x42\xfb\x84\x02\xbe\x43\x25\x96\xe5\xd1\xc0\x76" - "\xec\x2d\x82\xef\xc7\x0a\x88\xbd\xd9\xb5\x22\xd4\x22\x6b\x45\x4c" - "\x16\x5f\x2b\x42\xd8\xde\x8f\xcd\x70\x6c\xef\xc7\xc6\x4b\xb7\xf7" - "\x63\xbe\xc4\xde\xa1\x80\xef\xc7\xa2\x39\x7b\x3f\x76\x4a\xba\xbd" - "\x1f\xf3\x24\xf6\xae\x8d\x07\x7b\x03\xbe\x43\x25\xe2\xfb\xb1\xad" - "\x8e\xed\x1d\x26\x82\x6f\x7f\x4f\xd6\xde\x2c\xbe\x45\xd6\xa9\x98" - "\x2c\xbe\x4e\x85\xb0\xbd\x75\x27\x1d\xdb\x5b\x77\x48\xba\xbd\x75" - "\x19\xac\xbd\x01\xdf\xba\x63\x9c\xbd\xfd\xc7\x4a\xb7\xb7\x2e\x85" - "\xd8\xfb\x7c\x2c\xed\x13\x06\xf8\x0e\x93\x58\x16\x7f\x8d\x98\xbd" - "\xbd\xc1\xde\x47\x80\xc7\x00\xef\xc8\xb7\xe4\x02\x4f\x31\xf3\xed" - "\x5e\x9d\x1c\x88\x9e\x6c\xc4\xb6\x7f\xdc\x08\x6d\x75\x7e\x87\xad" - "\x97\xa1\x7c\xfc\xac\xcb\x73\x87\x95\x8f\xef\x10\x9d\x3b\xac\x7c" - "\x3c\x4f\xf2\xdc\x61\xe5\xe3\xd1\x1c\x07\x7a\x7c\x33\xe7\xd3\x27" - "\x98\xf8\x21\x69\x4e\xb1\xf2\xf1\x08\xc1\x75\x34\x94\x8f\x23\x3c" - "\xa7\x98\x5e\x73\x21\xd2\x92\x27\x87\x1b\x3d\xe1\xd6\xbe\xaf\x43" - "\xf0\x7a\x0f\x2a\x71\x5f\x0f\xa8\x85\x76\x4b\xd3\x61\xeb\x76\x28" - "\x07\x54\xba\xee\xeb\x01\x1b\xc4\x7d\x3d\x60\x99\x74\x5f\x0f\x18" - "\xcb\xf1\xaf\x01\xd9\x9c\xaf\x07\x4a\x9f\x3f\xae\x1c\x30\x5c\x70" - "\x3d\x0f\xe5\x13\xf5\xc4\xd7\xbf\x1e\xb0\xe4\xc9\xe1\x65\x03\x0c" - "\x4e\xf8\x1a\xea\x75\x88\x83\x7a\xfd\xe4\x31\xf0\x75\x7e\x87\xad" - "\x1f\xa2\x7c\x72\xbf\xeb\xbe\x7e\x72\xa5\xb8\xaf\x9f\x9c\x2d\xdd" - "\xd7\x4f\x06\x72\xdc\xef\xc9\x14\xce\xd7\x4f\xa9\xa4\xfb\xfa\x49" - "\x9d\xe0\xba\x22\xca\x81\x35\xc4\xd7\x17\xb5\xe0\x6b\x19\x9c\xf0" - "\xc9\x53\xed\xfb\x3a\x14\xaf\x7f\xe1\xa0\x5e\x07\x1c\x80\xf6\x5a" - "\xd3\x61\xeb\x98\x28\x03\xb6\xb8\xee\xeb\x80\x79\xe2\xbe\x0e\x98" - "\x24\xdd\xd7\x01\x7e\x1c\xef\x0c\x88\xe3\x7c\x1d\x60\x92\xee\xeb" - "\x00\xb5\xe0\xfa\x26\xca\xa7\x0e\x13\x5f\x5f\x5a\x61\xc9\x93\xc3" - "\x47\x03\x44\xf9\xbf\x8d\xaf\xa1\x5e\x87\x3a\xa8\xd7\x4f\x6f\x05" - "\x5f\xe7\x77\xd8\x7a\x2a\xca\xa7\x73\x5c\xf7\xf5\xd3\xd3\xc4\x7d" - "\xfd\xf4\x18\xe9\xbe\x7e\x5a\xc5\x71\xde\xa7\x27\x70\xbe\x7e\xba" - "\x4e\xba\xaf\x9f\x46\x82\xeb\xac\x28\x07\x95\x10\x5f\xff\x56\x07" - "\xbe\x96\xc1\x85\x9f\xde\xd3\xbe\xaf\xc3\xf0\x9a\x2b\x0e\xea\xf5" - "\x60\xd0\xf5\x61\x9a\x0e\x5b\xd7\x45\x39\x78\xa9\xeb\xbe\x1e\x1c" - "\x2a\xee\xeb\xc1\x83\xa4\xfb\xfa\x7f\x4c\x1c\xdf\x1e\x1c\xc4\xf9" - "\x7a\xf0\x09\xe9\xbe\xfe\x9f\x7a\xc1\xf5\x5e\x94\xff\x53\x40\x7c" - "\x7d\x79\xac\x25\x4f\x0e\x0f\x1f\x5c\x2c\x87\x87\x2f\x28\x44\x1e" - "\x7c\x7f\x3f\xb3\xa2\x63\xb9\xf8\x33\xb3\x5d\xf7\xf7\x33\xc3\xc4" - "\xfd\xfd\x4c\x3f\xe9\xfe\x1e\x52\xcf\x71\xf1\x67\x02\x38\x7f\x3f" - "\x73\x58\xba\xbf\x87\x9c\x12\xe6\xe2\x43\x32\x5c\xe3\xe2\xcf\x64" - "\xcb\xe1\xe2\xf6\xfe\x0e\x4c\xe8\x58\x3e\x1e\x38\xcd\x75\x7f\x07" - "\xfa\x8b\xfb\x3b\xb0\x87\x74\x7f\x0f\x3d\xc5\xf1\xf1\x40\x2d\xe7" - "\xef\xc0\x3d\xd2\xfd\x3d\xb4\x42\x98\x8f\x0f\x4d\x71\x8d\x8f\x07" - "\xa6\xcb\xe1\xe3\xf6\xfe\x7e\x36\xb6\x63\x39\xf9\xb3\xe3\x5c\xf7" - "\xf7\xb3\xbd\xc5\xfd\xfd\xac\x42\xba\xbf\x87\x55\x70\x9c\xfc\x59" - "\x9b\xfe\xef\x67\x37\x4b\xf7\xf7\xb0\x03\xc2\x9c\x7c\xd8\x2c\xd7" - "\x38\xf9\xb3\xf1\x72\x38\xb9\xbd\xbf\x87\x4f\xe8\x58\x5e\x3e\x7c" - "\x84\xeb\xfe\x1e\xde\x55\xdc\xdf\x7f\xba\x2a\xdd\xdf\x7f\x3a\xc0" - "\xf1\xf2\xe1\x88\xf3\xf7\x70\xe9\xeb\x67\x2a\xff\xb4\x5d\x98\x97" - "\xff\x69\xaa\x6b\xbc\x7c\x78\xb4\x1c\x5e\x6e\xef\xef\xe7\x46\x77" - "\x2c\x37\x7f\x6e\xa0\xeb\xfe\x1e\xd1\x2c\xee\xef\x11\x67\xa5\xfb" - "\x7b\xc4\x76\x8e\x9b\x8f\xb0\xe9\xff\x7f\x6e\x85\x74\x7f\x8f\x28" - "\x10\xe6\xe6\x23\xc6\xba\xc6\xcd\x9f\x8b\x90\xc3\xcd\xed\xfd\x1d" - "\x34\xb8\x63\xf9\x79\xd0\x43\xae\xfb\x7b\xe4\x45\x71\x7f\x8f\x3c" - "\x2e\xdd\xdf\x23\x0b\x38\x7e\x3e\x52\xcf\xf9\x3b\x28\x41\xba\xbf" - "\x47\x66\x08\xf3\xf3\x91\xc3\x5d\xe3\xe7\x41\x41\xae\xf7\x93\xbf" - "\xa0\xc2\xdc\x5c\xea\xfa\x8f\xd5\x09\xd6\x39\x77\xa3\xb8\xf5\x1f" - "\x95\x2f\x28\x90\xd8\xda\x32\xca\xe7\xa7\x75\xea\xf5\x1f\x95\xa3" - "\x1c\xaf\xff\xa8\x1c\x25\x6d\xfd\x47\xe5\xf3\x63\xa4\x8f\xc7\x7f" - "\x5e\xc5\x69\x84\xe7\x6d\xf4\xff\x0b\x4c\xbd\xee\xd4\xeb\x42\x2a" - "\x47\xf1\xd7\x85\x54\x8e\x62\xd6\x85\xa4\xd7\x5c\x29\x91\xa7\x45" - "\x5e\xf0\x75\xfd\xbb\xc0\x98\x7a\xac\x43\xa4\xae\x43\xc9\x61\xfb" - "\x85\x8b\x1c\xb6\xc7\x9c\x16\xc7\xf6\x98\x61\x9d\x7a\x1d\x4a\xe5" - "\xe8\x83\x8e\xb1\x3d\xba\x40\xda\x9a\x23\x63\xa4\xaf\x7b\xa3\x1c" - "\x5d\xcf\xe9\xa1\x31\x36\xfa\xf7\xcf\x03\x3a\x0e\xdb\x32\xd7\xa7" - "\x54\x8e\x3e\xc6\xc7\xf6\x0b\x7a\x82\xed\xab\x6e\xf2\x74\xd7\x18" - "\xa3\xeb\xdf\x41\x42\xca\xb0\xe6\x92\xba\x1e\x26\x87\xed\x3f\x1f" - "\xe1\xb0\x1d\xb2\x5f\x1c\xdb\x21\x3e\x9d\x7a\x3d\x4c\x65\xf0\x06" - "\xc7\xd8\x0e\x4e\x96\xb6\x96\x49\xb0\x59\x3a\xb6\x83\xcb\x38\xed" - "\x17\xe2\xc9\x61\x3b\xd4\xa3\x03\xb1\x2d\x33\x6e\x07\x6f\xe7\x63" - "\xfb\xcf\x07\x08\xb6\xaf\x47\xca\xd3\x98\x21\x27\x5c\xff\xee\xf3" - "\xe2\x66\xac\x2f\xa5\xae\xcb\xc9\x61\x3b\x74\x13\x87\xed\x17\xed" - "\xd6\x85\xe2\xb0\x1d\x76\xb5\x53\xaf\xcb\xa9\x0c\x4b\x74\x8c\xed" - "\xb0\x09\xd2\xd6\x48\x09\x3b\x29\x1d\xdb\x61\x9b\x39\x9d\x1b\x56" - "\xc7\x61\xfb\xc5\xda\x8e\xc3\xb6\xcc\xf5\x3a\x95\x61\xab\xf8\xd8" - "\x0e\xcd\x27\xd8\xbe\xb1\x5d\x9e\x9e\x7e\xb1\xc4\xf5\xef\x5c\x2f" - "\xa5\x63\x2d\x2d\x75\x7d\x50\x0e\xdb\x63\x97\x72\xd8\x7e\x69\x9e" - "\x38\xb6\xc7\x55\x76\xea\xf5\x41\x95\xe3\xda\x59\xff\x67\x9c\xa3" - "\xf5\x7f\x04\xe6\x0a\x8f\x93\xb1\xee\xc5\xb8\x74\x4e\xd3\x8f\x3b" - "\xcc\x61\xfb\xa5\xd2\x0e\xc4\xb6\xcc\xb8\x3d\x2e\x96\x8f\xed\xb1" - "\x09\x04\xdb\x46\x24\xaf\xef\xe0\xa5\x0c\xd7\xbf\xeb\x8d\x9f\x8a" - "\xfb\x0d\xa4\xae\x53\xca\x61\x3b\x7c\x12\x87\xed\xf1\xe3\xc4\xb1" - "\x1d\xb1\xad\x53\xaf\x53\xaa\x8c\x18\xe8\x18\xdb\x11\x9e\xd2\xd6" - "\x74\x89\x90\x31\x0f\x3e\x62\x2a\xd7\x7f\x11\x61\x33\xfe\x7d\x7c" - "\x41\xc7\x61\x5b\xe6\xfa\xa5\xca\x88\x20\x3e\xb6\xc3\x23\x08\xb6" - "\x5b\x26\xc8\xeb\x27\x19\x1f\xe7\x7a\x3f\xc9\x84\x38\xe6\x1b\xa6" - "\xc4\xf5\x52\x39\x6c\xbf\x3c\x84\x5b\x9b\x68\xc2\xa4\xb6\xd8\xe6" - "\xd6\x26\x7a\x65\x5e\xa7\x59\x2f\x55\xf9\xf2\x0d\xc7\x38\x7e\xf9" - "\x84\xb4\x3e\x91\x57\x26\x49\xc7\xf1\x2b\x7e\x5c\x9f\xc8\x2b\x36" - "\xe3\x5f\x26\x58\xf7\x24\xef\x80\x35\x8b\x5e\x31\x3b\x5e\xb3\xe8" - "\x95\x53\xb7\x6d\x1d\x55\xe5\x2b\x1e\xfc\x35\x8b\x5e\x1e\x60\x61" - "\xea\x82\x69\xab\xbc\x7e\x95\x09\x09\xae\xf7\xab\xbc\x46\xbe\xef" - "\x4a\x5c\xb7\x95\xab\x0b\x13\x47\x71\x75\xe1\xb5\xe9\xe2\x75\xe1" - "\xd5\xa5\x9d\x67\xdd\xd6\x57\x15\x8e\xeb\xc2\x44\xbd\xb4\x3e\x94" - "\x57\x65\xac\x03\xf3\x6a\x00\xd7\x87\xf2\x6a\x02\x57\x17\x5e\xdb" - "\xd3\x71\x75\xe1\xb5\xae\x8e\xeb\xc2\xab\x75\xb7\x6f\x3d\xd7\x57" - "\xd5\xfc\xba\x30\x31\x90\xd4\x05\x7a\x80\xbc\x7e\x98\xd7\x64\x7d" - "\xff\xe6\xd7\x85\xc9\xe9\xcc\xb7\x6f\x89\xeb\xc7\x72\x75\x21\x72" - "\x1c\x57\x17\x26\xdb\xf1\x79\xae\x2e\x4c\x5a\xdd\x79\xd6\x8f\x9d" - "\xd4\xdd\x71\x5d\x88\xac\x97\xd6\xe7\x32\x69\x9e\xf4\xba\x30\xc9" - "\x66\xfe\xd3\x24\x9b\xf9\x4f\x93\x4b\x3b\xae\x2e\x4c\xf6\x71\x5c" - "\x17\x26\x35\xdc\xbe\x75\x65\x27\x69\xf9\x75\x21\x72\x34\x53\x17" - "\xb2\x14\x25\xf2\xfa\x6d\x26\x3b\xc1\xff\xdb\xeb\xb7\x99\x96\xc1" - "\x8c\x0b\x90\xb8\x8e\x2d\x57\x17\xa6\x4c\xe2\xea\xc2\xb4\xa5\xe2" - "\x75\x61\x6a\x5e\xe7\x59\xc7\x76\x6a\x6f\xc7\x75\x61\x8a\x51\x5a" - "\x1f\xcd\xd4\xa5\xd2\xeb\xc2\xd4\x10\xae\x8f\x66\x6a\x06\x57\x17" - "\xa6\x55\x74\x5c\x5d\x98\xd6\xcf\x71\x5d\x98\x86\x6e\xdf\xfa\xb6" - "\x53\x07\xf0\xeb\xc2\x94\x08\x52\x17\xdc\x06\xcb\xeb\xe7\x99\x96" - "\xef\x7a\x3f\x4f\x74\x3e\x33\x66\x42\xe2\x7a\xba\x5c\x5d\x78\x7d" - "\x3a\x57\x17\xa2\x57\x8b\xd7\x85\xa8\x4d\x9d\x67\x3d\xdd\xa8\xfe" - "\x8e\xeb\x42\x94\x9b\xb4\x3e\x9d\xa8\xd5\xd2\xeb\x42\xd4\x04\xae" - "\x4f\x27\x2a\x9f\xab\x0b\xd1\x35\x1d\x57\x17\xa2\x07\x3a\xae\x0b" - "\xd1\x9e\xb7\x6f\x9d\xdd\xa8\x40\x7e\x5d\x78\x7d\x2a\xa9\x0b\xf7" - "\xed\x93\xd7\x2f\x14\xbd\xd9\xf5\x7e\xa1\x37\x37\x33\xe3\x49\x24" - "\xae\xeb\xcb\xd5\x85\x98\x79\x5c\x5d\x78\xd3\xc1\x3e\x0f\x6f\xec" - "\xe8\x3c\xeb\xfa\xbe\xe1\x78\xff\x23\xe5\x1b\x0e\xf6\x3f\x12\xea" - "\x03\x7a\x23\x4f\x7a\x5d\x78\x23\x9a\xeb\x03\x7a\xc3\x66\xfe\xdf" - "\x9b\xb5\x1d\x57\x17\xde\x6c\x67\xff\x87\x37\x9d\xd8\xff\x41\xee" - "\x7a\xbf\x6f\x8c\xe6\xd7\x85\x98\x38\x52\x17\xba\x0e\x97\xd7\x8f" - "\xf4\x66\xbb\xfd\xff\x58\xe7\xb7\xaa\xed\xfb\x91\x2a\x6a\x03\xd1" - "\x13\x93\x71\x5d\x98\x1e\x69\xca\x0b\xce\xc7\xeb\x0b\x9b\xfd\xd8" - "\x35\x28\x97\xb1\x6b\xbc\x34\x98\xc8\x1a\x94\x06\xf3\xcd\x35\x28" - "\xc9\xda\x1f\x88\xc2\x73\x81\xf1\x9c\x60\x93\x8a\xac\x3f\x49\xe3" - "\x31\x51\x78\x8c\xd4\xb9\x32\x66\x7d\x95\x14\x13\xbc\xfb\x85\x76" - "\xd6\x9f\x8c\xd6\xa3\x8a\xe8\xc5\xc8\xd4\xe3\x6b\x76\x9e\x70\x6c" - "\x1d\xb3\xfe\x64\x94\xa6\x4f\xd6\xbf\x91\xda\x1b\xaf\x3f\x19\x4d" - "\x5b\xd2\xf4\xb4\xa1\xca\x88\xe0\x5a\xb0\x6f\x8c\x75\x0d\xca\xe9" - "\xe3\xf1\xbb\x9b\xa2\x74\x7d\x8a\xfe\x2d\xb6\xbe\xf0\x74\x19\xeb" - "\xc0\x4e\x77\xe3\xfa\x77\xa6\x87\x70\x18\x9d\xce\xb4\xc1\x7a\x65" - "\xac\xbe\x22\x12\x62\x4c\xd6\xfd\xa5\xad\xb2\xd6\xde\x98\x1e\xdb" - "\xbe\xcf\x98\x31\x22\x76\xf1\x8b\xf3\xd9\x5f\x3c\x4d\x79\x21\x1a" - "\xbc\xce\xb1\xf3\x3e\x73\xbf\x76\x7b\x7c\xf6\x56\x81\xf3\x3e\xfb" - "\x8b\x3b\xdf\x67\x42\xfd\x10\x6f\x5d\x96\xee\xb3\xb7\xf6\x71\xfd" - "\x10\x6f\x99\x38\x9f\xfd\x65\x2c\xf1\xd9\x5b\xb9\xc4\x67\x9e\xf5" - "\xad\xb2\xd6\xef\xf8\x4b\xbb\xf3\xbf\xb1\x6e\x6a\x55\xdb\xeb\x72" - "\xce\x67\x71\xa5\xe0\xb3\x7c\xbc\xde\xb2\xf3\x3e\xbb\xff\xdc\xed" - "\xf1\x59\x5c\x84\xf3\x3e\x8b\xdb\xdf\xc6\x67\x02\x7a\x39\x4e\xfa" - "\x9e\x9d\xca\xb8\x59\x9c\x5e\x8e\x2b\xe1\x7c\x06\x8d\x17\xe3\xb3" - "\xb8\x10\xe2\x33\x2f\x4d\xab\xac\x35\x40\xe2\x2a\xda\xf7\x19\xf3" - "\x4d\xdf\x41\x3d\x9b\x99\x60\xca\x03\x8d\x09\xfa\xd1\x79\x9f\xf5" - "\xf8\xfe\xf6\xf8\x6c\xa6\x9b\xf3\x3e\x9b\x39\x9b\xef\x33\x21\x5d" - "\x37\x73\xa2\x74\x9f\xcd\xd4\x72\xba\x6e\x66\x2c\xe7\xb3\x99\x7b" - "\x88\xcf\x66\x98\x88\xcf\xbc\x47\xb7\xca\x5a\x47\x64\x66\xbb\xfd" - "\x5f\x98\x87\xb6\xaa\xed\x75\x0e\xe7\xb3\x59\x3a\xf0\x59\x3e\x5e" - "\x7f\xda\x79\x9f\x3d\xb3\xe6\xf6\xf8\xec\xed\x7d\xce\xfb\x6c\x56" - "\xbf\x36\x3e\x13\xd0\x1f\xb3\xba\x4a\xf7\xd9\xdb\x27\x38\xfd\x31" - "\x4b\xc3\xf9\x6c\x56\x1c\xf1\xd9\xdb\x25\xc4\x67\xaa\xf8\x56\x59" - "\x6b\x91\xcc\x1a\xdc\xbe\xcf\x98\x6f\xb0\x0e\xea\xd9\xec\x53\xa6" - "\x3c\xe0\xec\xc0\xc7\x9d\xf7\xd9\x94\xe7\x6f\x8f\xcf\x66\xcf\x72" - "\xde\x67\xb3\x7f\xe0\xfb\x4c\x88\x27\xcf\x96\xb1\x0e\xf6\xec\x55" - "\x1c\x4f\x9e\x5d\xc1\xf9\x6c\x8e\x2f\xf1\xd9\xec\x58\xe2\xb3\x1e" - "\x05\xad\xb2\xd6\x33\x99\x2d\xba\xfe\x97\x23\xde\x68\x1d\x97\xcf" - "\xf9\x6d\x6e\x6e\xe7\xe1\x8e\x73\xfd\x9c\xf7\xdb\xdc\xcc\xf6\xb9" - "\xe3\xdc\x44\xe9\x7e\x9b\x1b\xc4\x71\xc7\xb9\x2b\x38\xbf\xcd\x3d" - "\x41\xfc\x36\xd7\xd7\x35\xee\x38\xb7\x58\x0e\x77\xb4\xf7\xdb\xbc" - "\xb1\x9d\x87\x3f\xc6\x9f\x72\xde\x6f\xf3\xc6\xb4\xcf\x1f\xe7\x0d" - "\x94\xee\xb7\x78\x23\xc7\x1f\xe7\x0d\xe7\xfc\x36\x2f\x83\xf8\x2d" - "\xfe\x84\x6b\xfc\x71\x9e\xe8\xfa\x6f\x8e\xf8\xa3\xbd\xdf\x16\xb8" - "\x75\x1e\x0e\x39\x3f\xd7\x79\xbf\xcd\x37\xb7\xcf\x21\xe7\x9f\x97" - "\xee\xb7\xf9\x25\x1c\x87\x9c\xdf\xc0\xf9\x6d\xc1\x68\xe2\xb7\xf9" - "\x19\xae\x71\xc8\x05\x2a\x39\x1c\xd2\xde\x6f\x09\x07\x3a\x0f\x8f" - "\x4c\x18\xeb\xbc\xdf\x12\xf6\xb6\xcf\x23\x13\xa4\xef\x59\xac\x4c" - "\x88\xe3\x78\x64\xc2\x76\xce\x6f\x09\xec\x1e\x2c\x09\xa3\x5d\xe3" - "\x91\x09\xed\xae\xff\x21\xc4\x23\xed\xfd\x96\x94\xd0\x79\xb8\x64" - "\x92\x04\xfe\x9f\xd4\x96\xff\x0b\x70\xc9\x24\x19\xfc\x3f\x49\xcb" - "\x71\xc9\x24\x1b\xfe\x9f\xc4\xf2\xff\x44\x93\x6b\x5c\x32\xc9\x09" - "\xfe\x6f\xcf\x25\xed\xfd\x96\x3c\xa0\xf3\xf0\xc9\x85\x07\x9c\xf7" - "\x5b\x72\xff\xf6\xf9\x64\xb2\x8c\x7d\xa0\x16\xd6\x70\x7c\x32\xd9" - "\x97\xf3\x5b\xf2\x2c\xe2\xb7\x85\x7b\x5c\xe3\x93\xc9\xa2\xeb\x3f" - "\x5a\xfd\x66\x56\x07\xe7\xd3\x02\xfd\x90\x95\x71\x81\xec\xda\x84" - "\x8b\x4d\x66\x9f\xe0\x7c\xa9\xfb\xbb\x58\xd7\x9c\x2e\x87\x88\x72" - "\x4e\xb9\x38\xcf\xb5\x75\xa7\x17\x8f\x71\x7d\xdd\xe9\xc5\x3d\x6e" - "\xdd\xfe\x2e\x8b\x9a\xa5\xaf\x3b\xbd\xe8\x30\xc7\x41\x17\x7b\x70" - "\xbe\x5e\xc2\x8c\x4f\x90\xb6\x1e\xf5\xa2\x55\xae\xad\x47\xbd\x38" - "\x93\xe0\x6b\x51\x08\x59\x8f\x7a\xf1\x8a\x8e\xd9\xf7\x25\xb9\x01" - "\xaf\x47\x4d\x67\xf5\x2c\x93\xb7\x3e\xf2\x12\x8f\xf6\xf1\x1c\xa2" - "\xa1\x05\xfa\x68\x39\x3c\x2f\xad\x30\xfb\x84\x68\xa4\xee\x33\xc3" - "\xc7\xf3\xd2\xe9\xae\xe1\x79\xa9\x8f\xeb\x78\x4e\x39\x7b\xeb\xf6" - "\x99\x49\x29\x97\x8e\xe7\x94\x5c\x8e\x9b\xa7\xd4\x70\x78\x4e\xf5" - "\x94\x8e\xe7\x94\x48\xd7\xf0\xbc\x74\x1a\xc1\x73\x8a\x86\xe0\x79" - "\xe9\x84\x8e\xd9\x7f\x66\xc9\x61\x82\x67\x1f\x95\xbc\xf5\xa7\x97" - "\xd6\x38\x81\xe7\x7c\x5a\xa0\xff\x9a\xc3\x73\x7a\x01\xe0\x39\x5f" - "\xea\x7e\x37\x7c\x3c\xa7\x0f\x71\x0d\xcf\x69\xe7\x5d\xc7\x73\xda" - "\xee\x5b\xb7\xdf\x4d\xda\x06\xe9\x78\x4e\x8b\xe5\x34\x4b\xda\x56" - "\x0e\xcf\xe9\xa7\xa4\xe3\x39\x4d\xe7\x1a\x9e\xd3\x07\x12\x3c\xa7" - "\xd6\x11\x3c\xa7\xfb\x75\xcc\x3e\x38\xa9\xb9\x04\xcf\x0f\x44\xca" - "\x5b\xdf\x3b\x5d\x74\xfd\x63\x0e\xcf\xa1\x1a\x5a\xa0\x6f\x9f\xc3" - "\xf3\x3b\xb3\xcc\x3e\xa1\x1a\xa9\xfb\xee\xf0\xf1\xfc\x8e\x8b\xfb" - "\x5c\x2c\xbf\x05\xfb\x5c\x2c\x77\x61\x9f\x8b\xb6\xfb\xee\x2c\x9f" - "\x21\x1d\xcf\xcb\x07\x73\x5a\x6e\x79\x32\x87\xe7\x77\xb6\x4b\xc7" - "\xf3\x32\xa3\x6b\x78\x5e\xce\xee\x7f\xb1\x6c\x1f\xc1\xf3\xf2\x86" - "\x8e\xd9\x8f\x67\x59\x2c\xc1\x73\xef\x62\x79\xeb\xa7\xbf\x93\xec" - "\x04\x9e\xf3\x69\x81\xef\x1e\x1c\x9e\xdf\x1d\x0e\x78\xce\x97\xba" - "\xff\x0f\x1f\xcf\x2b\x7f\x70\x0d\xcf\x2b\x57\xba\x8e\xe7\x95\xe3" - "\x6f\xdd\xfe\x3f\x2b\x87\x49\xc7\xf3\x4a\x37\x4e\xe3\xae\xb4\xf9" - "\xfe\xff\x6e\x8a\x74\x3c\xaf\x70\x71\x5f\xa0\x95\x95\x04\xcf\x2b" - "\xd8\x7d\x81\x56\x1e\xee\x98\x7d\x81\x56\x0c\x26\x78\x7e\xb0\x4e" - "\xde\xfa\xf4\xef\x86\xb4\x8f\xe7\x30\x0d\x2d\xf0\x4d\x88\xc3\xf3" - "\x6a\x4f\xb3\x4f\x98\x46\xea\x3e\x44\x7c\x3c\xaf\xda\xe2\x1a\x9e" - "\x57\x4d\x74\x1d\xcf\xab\xfa\xdd\xba\x7d\x88\x56\x75\x95\x8e\xe7" - "\xff\xb5\x7e\xff\x83\xf8\xbc\xca\xe6\xfb\xdf\x6a\x19\xfb\x13\xfd" - "\x6f\xbe\x6b\x78\x5e\x55\x48\xf0\xfc\xbf\x91\x04\xcf\xab\x72\x3b" - "\x66\x7f\xa2\xff\x75\x23\x78\xee\x1b\x20\x6f\xfd\xff\xd5\xed\x8e" - "\xff\x10\xea\xdf\xb0\xf6\x4b\x71\x98\x7e\x4f\xef\x7a\x1f\xc7\x7b" - "\x8b\x5c\xc3\xf4\x7b\xfe\xae\x63\x7a\xcd\x8d\x5b\xd7\xc7\xb1\x46" - "\xc6\x5e\x7f\x6b\xb6\x72\x7d\x1c\x6b\xea\x39\x4c\x67\x68\xa5\x63" - "\x7a\xcd\x2c\xd7\x30\xfd\xde\x3c\x82\xe9\x35\x03\x08\xa6\xdf\x8b" - "\xeb\x98\x3e\x8e\xd5\x35\xae\xf5\x71\xbc\x57\x2f\xa7\x8f\xc3\x1e" - "\xd3\x59\x7b\x5c\xef\xe7\xc8\x1a\xe7\x1a\xa6\x33\xcd\xae\x63\x3a" - "\xb3\xfc\xd6\xf5\x73\x64\xee\x96\x8e\xe9\xcc\x14\xae\x9f\x23\xb3" - "\x94\xc3\x74\x56\x83\x74\x4c\x67\x06\xb9\x86\xe9\xac\x31\x04\xd3" - "\x99\x88\x60\x3a\x6b\x78\xc7\xf4\x73\x64\x6c\x77\xad\x9f\x23\xab" - "\x54\x4e\x3f\x87\x3d\xa6\x73\x56\xb9\xde\xd7\x91\xd3\xcf\x35\x4c" - "\x67\x1f\x77\x1d\xd3\xd9\x85\xb7\xae\xaf\x23\x7b\xa5\x74\x4c\x67" - "\x47\x70\x7d\x1d\xd9\xb9\x1c\xa6\x73\xca\xa4\x63\x3a\x5b\xed\x1a" - "\xa6\x73\x7a\x13\x4c\xaf\x3d\x41\x30\x9d\xa3\xea\x98\xbe\x8e\xb5" - "\xe9\xae\xf5\x75\xe4\xe4\xca\xe9\xeb\xb0\xc7\x74\xee\x54\xd7\xfb" - "\x3b\xde\xbf\xe1\x1a\xa6\xdf\xdf\xe2\x3a\xa6\xdf\x9f\x77\xeb\xfa" - "\x3b\xde\x9f\x24\x1d\xd3\xef\xdb\xec\x7f\xf1\xbe\xcd\xfc\xff\xdc" - "\x02\xe9\x98\x5e\x57\xe7\x1a\xa6\xdf\xbf\x4c\x30\xbd\x6e\x2b\xc1" - "\xf4\xfb\xb5\x1d\xd3\xdf\xb1\x6e\x82\x6b\xfd\x1d\xb9\xed\xae\x7f" - "\x21\xd4\xdf\x61\x8f\xe9\xbf\x06\xb8\xde\xe7\xb1\xbe\xdc\x35\x4c" - "\xaf\x5f\xe4\x3a\xa6\xd7\x8f\xb9\x75\x7d\x1e\xeb\x07\x4a\xc7\x74" - "\x9e\x91\xeb\xf3\x58\x6f\x33\xfe\xe9\xaf\xf1\xd2\x31\x9d\x77\xc0" - "\x35\x4c\xaf\x3f\x44\x30\x9d\x97\x42\x30\xbd\x7e\x5f\xc7\xf4\x79" - "\xe4\xe9\x5c\xeb\xf3\xf8\xeb\x70\x39\x7d\x1e\xf6\x98\xfe\xc0\xcd" - "\xf5\x7e\x8f\x0d\x85\xae\x61\x7a\xc3\x38\xd7\x31\xbd\xa1\xf7\xad" - "\xeb\xf7\xd8\xa0\x90\x8e\xe9\xfc\x0a\xae\xdf\x63\x83\xcd\xfa\xf7" - "\x1f\x8c\x96\x8e\xe9\xfc\x6c\xd7\x30\xbd\x21\x8f\x60\x3a\x3f\x82" - "\x60\x7a\x43\x46\xc7\xf4\x7b\xfc\xd5\xe4\x5a\xbf\xc7\x07\x76\xe3" - "\xdf\x16\x4c\x9f\x13\xab\x9d\xfb\xd6\x5b\x0b\xa6\x27\x68\x17\xcc" - "\x9a\xf1\xe6\xf4\x11\xfd\xad\xbf\x47\x04\x24\xf7\x4f\xee\x86\x62" - "\x67\xc7\x44\x25\x3d\xcd\x9d\x9c\x35\x7d\x0e\xfc\xe9\x86\xe2\x62" - "\x16\xc4\x69\x13\x16\xc5\x4f\xd7\xe2\x5f\xb3\xdf\x8c\x87\x4b\xe6" - "\x26\x70\x29\x2f\x4f\x9f\x15\x93\x3c\x63\xce\x5f\xb4\x31\xb3\x66" - "\xfc\x65\xce\xec\xe9\x73\x12\xb4\xf3\xa7\xcf\x4b\x9c\x31\x7f\x3a" - "\xfe\x7f\x81\xf6\xad\xb9\xf3\x21\xe1\xcd\xe9\x33\x92\xa6\x6b\xdf" - "\x48\x7c\xeb\xad\xe9\xf3\x17\x74\x43\xe3\x12\x67\x25\xcc\x88\x9f" - "\x35\x5d\x3b\x7a\xdc\xa8\x81\x13\xc6\xbc\x32\x61\xe4\xc8\x6e\xc8" - "\x66\xef\x69\x2d\x9d\x3b\xb3\x18\x30\xe4\x76\x41\xf9\xc9\xfe\x2a" - "\x0d\x42\x99\x80\xcd\xb5\xf3\x91\x6a\xf5\x7c\xe4\xb6\xea\x1a\xf2" - "\xc8\xbc\x86\x3c\xb5\x33\x51\x10\xdd\x63\x25\x5a\x7b\x0d\xa9\xe9" - "\x5e\x5e\x1a\x3a\xe7\x20\xfc\x3e\x98\x6e\xe8\xf1\x89\x06\xd2\x54" - "\x74\xce\x96\x40\x7c\x0e\x7c\xe1\x06\xe7\xea\xce\x29\x3f\x49\x36" - "\xf4\xf8\xd4\x23\xed\x22\xa2\x68\xaf\x0f\xe3\x77\x5a\x0c\xd4\x21" - "\xbc\x8a\x0d\xd8\x0a\x29\x0b\x56\xc1\x91\x80\x94\x85\x7e\x70\x0c" - "\x86\x23\x05\x8e\xcd\x70\x6c\x47\xca\x22\x0d\x1c\xd1\x70\x64\xc3" - "\x01\x69\x45\xfb\xe0\x38\x0c\x47\x05\x52\x6e\x0c\x84\x23\x12\x8e" - "\x38\x38\xd2\x49\x3e\x1b\xe1\x28\xf6\x80\x23\x02\x8e\x15\x48\xb9" - "\x09\xd2\x37\x41\x3e\x1f\xc1\x75\x9b\xe0\x9e\x4d\x75\x70\x18\xe0" - "\xb7\x1a\x0e\x7c\x7f\x06\x39\xf7\xb1\x1b\x1c\x41\x70\xc0\xb3\x3e" - "\x86\xe7\x7f\x5c\x02\x07\x3c\xe7\xe3\x63\x70\xd4\xc0\x61\x42\xca" - "\xcd\x70\xcd\x66\x28\xcf\x66\xb8\x67\x73\x2e\x1c\x50\x96\x2d\x2a" - "\x38\xa0\xec\x5b\xca\x10\xbc\x23\x7b\x40\xda\x27\x13\x6c\x7e\xc7" - "\xdb\xfc\x2f\x74\x64\x7b\x2f\x7b\x58\x5f\xfa\xb8\x09\xea\x6d\xc1" - "\x79\xf3\x72\xa4\x34\xe7\x7c\xea\x11\xff\x38\x52\x5c\x52\x16\xec" - "\xae\x5e\x81\x10\xad\x3a\x18\x54\xba\xb8\x05\x9f\xdf\x8d\x6d\xd6" - "\x94\x55\x50\xa2\x47\x99\x5a\x5c\x3f\xa5\xe1\xb3\xa0\x84\xbd\xdf" - "\xa0\x57\xf8\x7a\xe2\xfb\xe9\x75\xa1\x15\x74\x5a\xe4\x87\x78\x1e" - "\xee\x05\x6c\x43\x5c\x6f\xb2\x43\xfd\x68\xd5\x0b\xc7\x70\x8c\x29" - "\x5d\xcc\x94\x6b\x35\xd4\x37\x2f\xb8\x7f\x15\x0d\x7e\x34\xf8\x80" - "\xcf\x97\x23\x37\xe6\x77\xce\x27\x1a\xba\x38\x71\x15\x89\x3b\x85" - "\x8c\x7e\x69\xf6\x79\xfd\x18\x3e\x67\xdc\x32\x34\x9d\xde\x1c\xa6" - "\x29\x9d\xd3\x82\x6a\x95\x85\x89\x10\xff\x28\xfa\xd1\xa1\xe9\x96" - "\xf5\xaf\x1f\xdb\x07\x18\xc0\xd7\xec\x4f\xad\xc3\x7f\x57\xc0\x7b" - "\x53\x74\x6e\x54\x3e\xee\x03\x2a\x4d\x5d\x07\x31\xb9\x60\x75\xb3" - "\x4f\x62\xbc\x36\xcc\x9b\x3e\xc7\x96\x4b\xaf\x2c\xf4\x85\x72\x30" - "\xf7\x35\xfb\x78\x69\x71\xde\xe6\xe2\xa4\x00\x48\x73\xa3\x01\x7b" - "\x50\x06\xc5\x15\xb8\xcf\x9c\xe7\xa5\x29\x0d\xc3\xcf\x2c\xea\x01" - "\xe5\xa4\xd2\x42\x21\xef\x8f\x92\x02\x76\x2d\x36\x52\x34\x2e\xbb" - "\xda\x4b\x03\x58\xf7\x34\x67\x7d\x10\xb1\xa1\x27\x72\x2b\x5c\x87" - "\xd0\xc6\x9e\xc8\xa3\x29\xab\xc8\x43\xef\x36\xa0\x96\xc4\xbd\x82" - "\x55\x14\x5c\x03\xcf\xac\xa5\xc1\x1f\xcc\xb3\x72\x27\xab\x1c\x3c" - "\x6b\xd2\xcd\x67\xad\x9f\xac\xc2\xcf\x62\xec\x43\x6c\x45\xfe\xb7" - "\xe6\xb3\x39\xd0\x51\x99\x27\xe2\x3c\xf4\xca\xa2\x10\xfa\x93\xc0" - "\x00\xf3\xfa\x98\x00\x7c\x0e\x5f\x4f\xec\xff\x09\xb4\x69\xa8\x81" - "\x86\x34\x33\xeb\x03\x33\xf6\xc1\x7d\x38\x7e\x15\xea\xf0\xf3\xe0" - "\xde\x5c\xf3\x72\x2d\xe0\x26\x2c\x97\xf8\xb5\xe8\x6c\x72\x19\x6d" - "\x81\xc3\xfc\x54\x19\x52\x94\x86\x61\x9f\x6e\x44\xda\x3f\x77\x01" - "\xdb\x6e\x54\x10\xdb\x82\x4d\xfb\x25\xe9\xc0\x2e\x2a\xb0\x85\x27" - "\xfd\xae\x8f\x2f\x93\x07\xd8\x1b\xdb\x68\x23\xd8\x08\xec\xe4\x81" - "\xfd\xdf\x94\xb5\x31\xa0\x8d\x9d\x54\x90\x36\x5a\xaf\xf0\x99\x80" - "\xd3\xb4\x8f\x20\x82\x19\x9b\xf7\xc6\xfe\x35\xe7\xcd\x2c\xc6\xbf" - "\x27\xfa\x23\x95\x77\x19\xa2\xb4\xa9\x7e\xfb\x88\x9f\xf1\x3c\x7f" - "\xab\x6f\x8b\xb6\xd2\xeb\x5f\xac\x83\xeb\x75\x1c\xae\x36\x96\x9a" - "\x73\xc2\x32\x9a\x7d\xa2\x23\x8c\x79\x93\x54\x74\x76\x58\x06\x9e" - "\x57\x0e\x65\x67\xe6\xda\xd1\xcb\x3d\x10\x79\x4e\x58\x76\xea\x2c" - "\xda\x90\x7a\x15\x7c\xd0\x2b\x3a\x62\x7f\x92\x01\x7c\x31\x49\x85" - "\x7d\xbd\xaf\xd1\x48\xe1\xb5\xfe\x68\xaf\x0f\xe6\x17\x11\x9f\x7b" - "\xc0\x7b\x22\x9c\x6f\x53\x56\x31\xe2\xde\x67\xe3\x66\xec\x77\x78" - "\xc6\x66\xf2\x6c\xc8\x97\x82\x67\xf4\x08\xdb\x0c\xd7\xe9\xf4\x8a" - "\x43\x05\x4c\xbd\x49\xa2\x4f\xac\x6d\x41\xe8\x7a\x12\x6d\x0a\x37" - "\x9d\xb1\x40\x7b\x8b\xe0\x7c\x88\x1e\x3d\x17\x6d\xb5\x0b\xa9\x4b" - "\x37\xf3\x61\xd6\x80\x30\x90\x7c\xe2\x85\xf2\xd1\x2b\x8b\x03\xa3" - "\x4c\x5a\x45\x4b\x23\x7d\x6c\xed\xab\x50\xb6\xe5\x88\x6e\x49\xa2" - "\x2b\x96\x86\xd0\xc6\xac\xef\x11\x70\x9e\x53\x08\x62\xa8\xaf\x97" - "\x82\x36\x84\x2f\x42\xde\x5e\xf1\xde\x74\x79\xd9\x29\xb4\x24\x84" - "\xae\xab\x4e\x36\xa3\xaa\x86\x5a\x94\x72\x12\x79\xa6\x55\x22\x75" - "\x4a\x08\x6d\xa8\x88\x3e\x85\x48\x7a\x25\x4a\x3b\x8b\xdc\x96\x1c" - "\xa6\x8d\x2f\x41\xfb\xfb\xdd\x29\x9c\x5e\x0b\xe9\x66\x94\x56\x47" - "\x9b\x52\xa7\x21\x4f\xfc\x7f\xe5\x61\x9c\x7e\x1e\xf3\x14\xb7\xf0" - "\x64\x83\x77\x11\x3c\x13\xdf\xbf\x11\xca\x62\x69\xa4\x0f\xac\x6d" - "\x44\x68\xc9\x24\xa4\x49\x89\x41\xc0\xc9\x10\x5d\x6d\xda\x8b\xc2" - "\xcd\x34\xb4\xef\x47\xd0\xd2\x19\xc8\x23\xdc\x84\xe7\x85\xff\x00" - "\x47\x21\xda\x08\xd7\xc2\xbb\x95\xe2\x77\x5b\x72\x1a\xf8\xce\x65" - "\xeb\x3d\x07\xd9\x7b\x4e\x23\x6c\xb3\xe6\x1e\x07\xe3\x8d\x39\x07" - "\x0d\xf0\xee\xc3\xb1\x0d\xe0\x39\xc7\x2c\xf8\xbe\x46\xa6\xdd\xc1" - "\x36\x50\x44\x99\xa0\xae\xe6\xbd\x66\x88\x4a\x2e\x65\xf2\xd5\x2b" - "\x37\x25\x6f\x9c\xcf\x94\x89\x77\x6d\xb8\x89\xbe\x6e\xf0\x79\x0d" - "\xf2\xda\x54\x1c\x9e\x3c\x92\x06\xfc\x29\x00\x13\xc5\x4d\x59\x9b" - "\xf4\x56\x7b\xeb\x6f\xc6\x92\x4d\x27\xc0\x17\xc5\xca\x78\xe4\xd6" - "\x94\xf5\x11\xd2\x2b\x0e\x27\xdb\x60\x17\xc7\xa3\xfb\xac\xd7\xb2" - "\xd7\xf8\xe9\x15\xff\x2c\xe5\xae\x61\xf0\x7a\xf3\x1a\x38\x0f\xf8" - "\xff\xb6\x8c\x3b\x5f\x14\x49\xdb\xe4\xc1\xb6\xab\xd6\xbc\x95\x10" - "\x5f\x37\x9b\x7d\xa2\x40\x0f\x7a\x95\xd0\xd7\x35\x9e\x34\x05\xbe" - "\x31\xd1\x46\x4b\x5e\x98\x01\xda\x4e\xcf\x6a\x53\x03\x22\xd7\x7f" - "\x74\x11\xea\xfa\x3e\x32\x96\xf5\xa3\xe3\x38\x4f\xe0\x58\x11\xd0" - "\x0e\xab\xc2\xcb\x68\x23\x8e\x0b\xe6\xbc\x07\x02\xb2\xe6\x43\x5b" - "\x9c\x17\x95\x6d\xf1\x99\x5c\x6c\xdc\x94\x98\x8e\x63\x3d\xed\x33" - "\xb3\x98\xce\x85\x7b\xd9\x7c\xe0\xb9\xee\x7a\xe5\x47\x5b\xcd\x70" - "\x3f\x9d\x1b\x66\x20\xe9\x24\x6e\x91\xf8\xf2\xd1\x56\xba\x3f\x9c" - "\xcb\x7e\x61\x2b\x9c\x73\x3f\xa7\xfc\x78\x30\xa4\x23\xf8\xad\x2f" - "\x4d\xbd\x06\xd7\x7e\x3c\x8c\x60\xfa\x85\xcd\xbc\xdf\x14\xb6\x67" - "\xd1\x76\x1c\x7b\xb4\x61\x38\xcf\x8f\x27\x71\x71\xc6\x36\x66\xbf" - "\x08\x75\xe4\xe3\x59\x7a\xc5\xc3\xab\x18\xec\xc3\x7d\x0d\x4c\xbc" - "\x82\xb8\xd5\x2f\x71\xd5\xb7\x21\x08\x7d\x7b\x18\xd7\xa3\x8f\xb3" - "\xf5\x8a\x7e\x25\x9c\x2d\x3f\xde\x86\xaf\x65\x62\x08\x8e\xa1\x14" - "\x89\x57\xf8\x1e\x7a\x7d\x74\x10\x8e\x83\x38\x1e\xea\x95\x1f\x6f" - "\xc6\xb1\x10\xe2\xc9\x56\xd2\xfe\x04\x7a\x30\xf1\x64\x5d\xaa\x0e" - "\xca\x95\x7e\x8e\x2d\x8b\x6d\xd9\xac\xb1\x8f\xce\x49\xdd\x4a\xae" - "\x0d\xdb\xda\x94\xb5\x59\xa5\x57\x3c\xb2\xca\x16\x2f\xe4\xbd\x36" - "\x27\x02\xa6\x6b\x9e\x3a\x0c\xbf\x81\x23\x41\x7e\x05\x74\xd6\x07" - "\x6b\x20\xbe\xe0\xf8\xa6\xc0\x31\x32\x7f\x1d\x72\x33\xe6\xa4\xee" - "\x33\xe7\xa4\x96\x40\x3e\x91\xd6\xb8\x82\xef\xc3\x75\x01\x62\x8b" - "\x07\x13\x33\xcc\x26\x25\x53\xdf\xcd\x68\xc0\xcd\x38\x02\x69\xcd" - "\x3d\x52\x4b\xd8\x74\x37\xa6\x3c\xcb\x95\x16\x78\xb6\xc2\x5a\xf6" - "\xe6\x1e\x61\xf9\x90\x6f\x89\x5e\xe1\x9d\xc0\x8b\x33\xeb\x82\x42" - "\x68\x3a\x12\x63\x46\x09\xe5\xfc\x01\xfe\x76\x61\x31\x78\xff\xb7" - "\x65\x08\x8d\x1e\x03\xcf\x00\x5f\x6e\xe8\x45\x03\xbf\xdf\x6c\xd0" - "\xa3\x59\x6e\xf8\xfe\xd5\xf0\x1b\xa7\xe3\x6b\x9a\xb2\xb6\x78\x40" - "\x7a\x03\xc9\xb7\x68\x3b\xf6\x0d\x3f\xdf\x2d\x03\x49\xbe\x4c\x59" - "\xee\xc7\x79\xe2\xfb\x70\x9e\x85\xeb\xe9\x7a\x9c\x0f\xe4\x31\xd6" - "\x9a\x77\x26\xa4\x59\xf3\x1f\x3d\xfb\xe6\x33\x66\xc1\xf9\x14\xdb" - "\xb2\xe7\xaf\xa7\x1b\x48\xb9\xb6\xac\xd2\xa3\xf4\x3a\x7c\x6e\x15" - "\xa4\xe1\x7b\x89\xff\xb7\x6c\xc1\xd8\xd0\x93\xf7\x51\x12\x8c\x6c" - "\xd9\xa3\x47\x69\xf1\xb6\xed\x0d\xf8\xa0\x3b\x69\x0f\x3f\xf5\x60" - "\xf3\xab\xb1\xe6\xc7\xe5\x45\xf2\xa0\xb3\xd3\x6c\xeb\xa3\x27\xce" - "\xbf\x29\xeb\x13\x78\xff\x39\x87\xd9\xf7\xcf\x6f\x20\x78\x06\xdb" - "\x7f\x32\x10\xdb\x1e\xb7\x7d\xd8\xcf\xcc\x33\x36\x25\xae\xc2\x7e" - "\x07\xff\xe7\x5b\xdb\x47\xf0\x4d\x2e\xe4\x31\x96\x6b\x4b\x3e\xd1" - "\x62\x7f\x43\xfa\x0a\x36\xff\x38\xf0\xdb\x60\x7e\x1c\x2a\x3a\x40" - "\xf7\x8a\x2a\xc5\xb1\x8a\x2d\xcf\x6e\xdc\x5e\x5a\xcf\xc3\x33\xdc" - "\x80\xa7\x7c\x86\x31\x8f\x79\x0a\xed\x13\x99\x0e\xf9\x94\xb4\x69" - "\x7f\xdd\xd8\xeb\xce\xe0\x6b\xde\xef\x45\xd7\xc1\x35\x27\xac\xd7" - "\xe0\xf3\xe0\x83\xe7\x20\xad\x4e\x8f\xde\xcb\xc0\x69\x59\x70\x8d" - "\x5e\xf9\xa1\xe8\x7c\x9d\xd4\x7e\x88\xaa\x2e\xd0\x63\x2d\x8b\xeb" - "\xf7\xf0\x6a\xdf\x06\x54\x5d\x60\x41\x96\x4f\x02\x4b\x82\x52\xe9" - "\xd2\x0b\xca\x4f\xa7\x57\x19\xeb\x90\x34\xfe\xf9\x29\xb3\xfe\x21" - "\xdd\x02\x9a\x2b\xe5\x69\x84\xb9\xc9\x15\xe5\xd6\xbc\x6a\xc3\x35" - "\x26\xd6\xc1\xff\xcb\xf0\xf9\xf7\x41\xa3\x61\x9d\x06\x5a\x3c\x2e" - "\x9b\x22\x5a\xcd\x02\xd7\x16\xe1\x74\xac\xe3\xa0\x0d\xdb\x68\x73" - "\x8e\xfe\x64\x68\x00\xb1\xdd\xd6\x71\x4c\xcc\xc7\xe5\x35\x05\x97" - "\xe2\x32\x5b\x36\x0f\x0d\xc0\xef\x90\x96\x4c\x5b\xaa\x4d\x4d\xa5" - "\xb8\x9d\xd3\x26\x61\x8d\xb9\xd5\x3f\xbc\x10\xd1\x96\x2d\x43\x03" - "\x24\xbe\x03\xf3\x7d\x09\x74\xf8\x15\x43\xff\xa1\x01\x69\x66\x44" - "\xad\x4d\x75\xf7\x78\xa1\x80\x2e\xbd\xfe\x68\x20\xd4\xf9\xad\x63" - "\x0f\x25\x23\x24\x9d\x9b\x6f\x1d\x6b\x7d\xf7\x22\xf6\xdd\xe1\x59" - "\xcc\x98\xb0\xa7\xf2\xd3\x99\xf7\x85\x6b\x56\x88\xf9\x8b\x5e\xee" - "\x4d\x7f\x5b\x60\x42\x0b\x0a\xe8\x96\x05\x85\x10\x27\xd7\x8f\x8d" - "\xdf\x55\x54\x83\xe3\x7a\x90\xd5\x9e\x8c\xed\x4c\x06\x14\x9f\x8a" - "\xbc\x2f\x29\xb7\x0d\x0c\x4f\x41\xcc\x9e\x4d\xdf\xc0\x75\x12\xcb" - "\xca\xf4\x7f\x55\x81\xae\x87\xb6\xdc\x42\xda\xa6\x6d\x13\x5f\x62" - "\xf3\xc3\xe7\xac\xfe\x2b\x62\xf5\xb6\xf4\x67\x6c\x9b\x2a\xe3\x5d" - "\x55\xc2\xef\xfa\x59\x6f\xf9\xef\xba\xad\xd6\xfe\x5d\x3f\x1b\x75" - "\x6b\xdf\xf5\x33\xd1\xf1\x3f\x0e\xde\x55\x2b\xfc\xae\x9f\xbb\xcb" - "\x7f\xd7\xcf\x8e\xd9\xbf\xeb\xe7\x03\x6f\xed\xbb\x7e\x2e\x3a\xff" - "\xdd\xc1\xbb\x06\x88\xbc\xeb\x55\xf9\xef\xfa\xf9\x01\xfb\x77\xdd" - "\xde\xfb\xd6\xbe\xeb\x76\xad\xe8\xbb\x52\xde\x34\x8e\x4f\x10\x97" - "\x5a\x52\x9b\x81\xd3\xad\x7f\x23\x68\xe9\x26\x44\x55\x34\x18\x51" - "\x95\x6f\x0d\x4a\x5b\x84\xa8\x27\xe3\x21\xee\x2d\x47\xc3\xe9\xf5" - "\x5e\x01\x55\x05\xf5\x90\x7e\x01\x55\x26\x1b\x51\xd0\x7c\x1c\x7f" - "\xb7\x9f\xaf\x8e\x95\x1a\x7f\xb7\x97\xdc\x8c\xbf\xa6\xa7\xd9\x98" - "\xbb\xb3\x47\x55\x7d\x0b\xc2\xef\x7f\x45\xb9\xc3\x7c\x33\xfe\x2e" - "\x27\xf6\x6e\x1b\x7f\xb1\x3d\xaa\x8d\x46\x5e\xfc\x25\xf3\xb6\x76" - "\x94\xb7\x8d\xbd\x59\x97\x10\x12\x8e\xbd\x3b\xb6\xe0\xd8\x5b\x04" - "\xe7\xa5\x95\x7f\x47\xbc\x35\xf6\x66\xc3\x33\x6d\x63\xef\xb7\xb1" - "\xb8\x7d\xdd\x51\x26\x2f\xf6\xee\x28\xb3\xbe\x77\x21\xfb\xde\x90" - "\x36\x80\x1f\x7b\x77\x22\x67\x70\x4b\xaf\x0f\x8e\xd8\xd5\xd7\xe8" - "\x6e\xd9\x3c\x2c\x1e\xb7\x6f\x4d\x60\x93\x2f\x8b\x8c\x6e\x17\x94" - "\x3b\x19\x5b\x5d\x6f\x8a\x55\xd0\x9b\x03\x35\xe1\x09\xf4\x19\xba" - "\xff\xb0\x78\xdc\x77\x8a\xfb\x00\xe0\xfc\x5e\x7a\x4b\xa0\x46\x5a" - "\xb9\x77\xb2\xed\xdf\x33\x25\xa9\x50\x5f\x76\x25\x19\x29\xcb\x92" - "\x48\x6f\xf0\x83\x8a\xce\x7b\x31\x9b\x7e\xb7\x3f\xba\x9e\x17\x83" - "\x8e\xe8\xce\x23\x7c\x2d\xbd\xcc\x2d\x48\x7e\xf9\x77\x05\x39\x2e" - "\xff\xae\x44\xe9\xe5\x27\x79\x3a\x57\xfe\x5d\x41\x4e\x95\xbf\x17" - "\x94\xbf\x25\xd0\x1d\x34\x23\xf5\x4d\x4b\xa0\x9b\xc4\xf2\x1c\x73" - "\xca\xc7\x2e\x3d\xa3\xc4\xe9\xf8\x47\xf7\x8a\xcc\xde\x55\x64\xa0" - "\x20\x06\x30\x6d\x38\xae\x7b\x24\xfe\xd5\x81\xd6\x3d\x43\x93\x98" - "\x64\x90\x18\x93\x4a\x44\xf7\x7f\xb7\x7f\xfe\x58\xc3\xad\x7f\xfe" - "\x6e\xf1\xf7\x6f\x1b\x13\x77\x86\x65\x8b\xc7\xc4\x17\x0d\xf6\x31" - "\x71\x77\xb3\xf4\x98\xb8\xfb\xb0\x7d\x4c\xfc\x7b\x7f\x2e\x26\xfe" - "\xbd\x87\xfc\x98\xf8\xb7\xd3\xce\xc7\xc4\xbf\xed\x97\x17\x13\xff" - "\xb6\xc2\x71\x4c\xfc\xdb\x29\x79\x31\xf1\x6f\xa7\xec\x63\xe2\xdf" - "\x82\xf8\x31\xf1\xef\x6a\x51\x5f\x66\x07\xa8\xa0\x8d\xf6\xbc\xa4" - "\xfc\x7b\xad\x69\x39\x42\x96\xec\xcf\x75\xd0\xce\x36\xd1\x39\x01" - "\x2a\x0b\x35\x18\xc7\x95\xa0\xa6\xa6\x38\x0f\xcb\x42\x9d\x27\xdd" - "\xf3\x85\x97\xe9\x56\x0d\xee\x6b\xf4\x83\xf2\x7b\xd3\x4d\x3a\x2f" - "\x7a\xa1\xae\x67\x41\x23\x52\xc3\xa1\x29\x60\xdb\x63\xf8\x3f\x80" - "\x5e\xa8\xe9\x96\x95\x84\x06\x78\x37\x20\x0f\x28\x43\xa4\xf7\x32" - "\x15\x82\x18\xa4\xc6\xff\xd3\xcb\xbf\xd0\x6d\x6c\x44\x6e\xde\xc9" - "\xe0\x9b\x1e\xf0\xbc\x64\x6f\x9a\x5e\xa0\x43\x1b\xe7\x23\x0f\x0b" - "\x85\x34\x45\x14\x5d\x62\x6a\xd2\x51\x66\x75\x54\x09\xf1\xcf\x9e" - "\x7c\x46\x7b\xe5\x46\xa5\x58\x7a\x45\xc5\x9a\xd3\xe2\x94\xf4\x92" - "\x48\x25\x2e\xab\x39\x37\x2a\x9a\x5e\x0f\x47\x5a\x9c\x17\xe6\xd0" - "\x1b\x93\xe0\xd9\x4d\x9a\x6e\x6b\xe1\xd9\x45\x49\xc8\xaf\xb0\x11" - "\xe9\xe8\xeb\x3a\x0a\xfc\x1f\x89\xf7\x3e\x05\x1b\x45\x5a\xa8\x2f" - "\x74\x70\xce\x0d\xc7\x44\x1a\x3f\xdf\x04\xcf\x6f\xd5\xe1\x7e\x2e" - "\xdc\x67\xa1\xd9\x08\xcf\x37\x2f\xd4\x49\xac\x2f\x7b\x98\xf9\x4f" - "\xd6\x72\x59\x06\xbc\x9c\x4d\xef\x84\x03\x97\x0b\x6c\xb8\x11\xdb" - "\xe4\xc9\x97\x73\x71\xd9\x32\x1b\xd1\x00\x28\xa7\x1f\x94\x41\x07" - "\xcf\xc5\xeb\xc6\x44\xbe\x3e\x4f\x85\x31\xca\x2b\x9b\x39\x87\x2d" - "\xdb\xef\x50\xb6\x2b\x5c\xd9\xf0\xb3\xb0\x7d\xc4\xbe\xc9\x86\x2f" - "\xed\x8b\xeb\xe6\xaf\xde\xc9\x5d\x42\xf0\xf7\xd9\xeb\x4b\xe2\x24" - "\x62\x75\x6f\x80\x18\x5e\xd6\xee\x44\xbe\xb4\x6a\x8b\xee\xa5\x95" - "\x67\x68\xdc\x8f\xb8\x72\x27\x1a\x50\x0d\xf5\xba\xca\x78\x19\xd1" - "\x3d\xb6\xe8\x8e\xe8\xea\xa5\x3e\xab\x40\xec\x59\x6b\x96\xd3\xc7" - "\x5a\xfd\x70\x1f\x58\xb4\x71\x2d\x45\x27\xb7\xf8\x05\x6a\x8f\x9e" - "\x68\x41\x51\xc9\xf8\x1b\x30\x9d\xac\x9d\x8c\x3c\xce\x29\x0f\x44" - "\xa4\x9d\xc4\xdf\xab\xbe\xd0\xf2\xbf\x57\x7d\x31\x1a\x29\xbf\xac" - "\x43\xca\xfd\x1a\xa4\xfc\xaa\x18\xc1\x75\xfc\xe3\x1f\x35\xe1\xdb" - "\xfa\xa2\x54\x13\xfd\x2b\x9d\xeb\x1d\x97\x45\xd1\xc6\x70\x7f\x85" - "\xbe\x34\x09\x7f\xbf\xf9\xf2\x2c\xd8\xef\x37\x68\x57\xbd\xf1\xff" - "\x38\xbf\xf8\xf9\xe8\x0f\x97\x94\x5f\xea\xbd\x1b\xba\x84\x98\xd4" - "\x31\x5a\x13\x1d\x89\x5a\xb5\x89\xe9\xcd\xb9\x51\xd9\xad\xb8\x8f" - "\xee\x0d\x1c\x83\xbe\x38\xe9\xad\x48\x47\x34\xf8\x9f\xa6\x35\xf8" - "\x1b\x66\x64\x01\x1c\xd8\x97\x8c\x1f\x7b\x86\xe8\xb1\xbf\x71\x5d" - "\xd8\x48\xd2\x55\xb8\x3e\xac\x65\xeb\x8d\x41\xf9\x78\xb4\x99\x42" - "\xc8\x0c\xf7\xa7\x9d\x47\xbe\x78\xcf\xdb\x42\xb8\x2e\xca\xec\x81" - "\xeb\x71\x64\xe9\xe4\xef\xd1\x85\x78\x44\xa5\x5d\x45\xdd\x01\x13" - "\x4c\x7d\xb4\x40\x7d\x0c\x3f\xe5\x6d\x84\xb8\x62\x49\xbd\x81\xbc" - "\x71\x9c\xc2\xfb\xc7\x54\xd7\xeb\x91\xe5\x77\x9d\xd7\x87\x73\x90" - "\xda\xf4\x7b\x5c\x4f\xc3\xef\x71\x7f\xd8\x60\x41\x6a\xaf\x78\xa4" - "\x2a\x9c\x03\x58\x9c\x0b\xf5\xf3\x0a\xd4\xcf\x7a\x52\x3f\xad\xf8" - "\xa3\xd7\x9c\xce\xc6\xf3\xfa\x99\xba\x99\xc3\xd6\xcd\x85\x80\xbf" - "\x24\x0e\x7f\xa6\xb9\x3a\xaa\x90\xa2\x11\x94\x11\xec\xbe\x57\xb5" - "\x31\xb5\x8b\x07\xee\xa7\xa4\x1f\x7d\x56\x05\x31\x1f\xde\x95\x36" - "\xed\x02\x5f\xb8\xfb\x53\x5a\x3a\x2f\x46\x7b\x34\xa2\x0e\x71\xfd" - "\x26\x07\xc6\xb7\xf4\x0f\xd4\x6a\x5f\xa6\x7f\x3f\xa7\xfc\xb2\x06" - "\xd2\x3d\xb4\xaf\x3e\xa6\x02\x3f\x8e\x27\xfd\x2c\x07\x22\x70\xbf" - "\xa9\x5e\xf9\xe5\x76\xc8\x0b\xe1\x71\x01\xdf\x31\xdf\xdc\xf6\xab" - "\xe0\x5a\x64\x06\x9b\x9b\xd4\x5e\xfb\x2c\xea\xa8\xd2\xd2\x99\x2d" - "\x4c\xbc\x6a\x05\x1f\x5c\x98\x85\xa8\xa8\x7a\xb0\x8d\x19\x6c\xd3" - "\xa4\xf3\x84\xb8\x15\x81\xe3\x16\x9d\xfd\xc2\xd8\x14\x3d\x6d\x09" - "\x8f\x55\xd2\x60\x17\x0f\xdc\x4f\xfe\x7a\x3c\xa2\x97\x5e\x06\x1b" - "\x35\xd4\x20\x78\x37\x2f\x88\x6d\x3d\x0b\x93\x90\xfa\x43\xb0\x4f" - "\xf7\x7a\xe0\x34\xeb\x3e\xd5\xee\x4c\x2d\x73\x37\x03\xce\x71\x1c" - "\xf3\x5e\xa6\xe8\x0a\xbe\xf2\xca\xc0\xf5\x16\xea\xb1\xf7\x32\x26" - "\xae\x32\xbe\x35\x2d\xd4\x3d\xd2\xba\x50\xa7\x85\xa3\xaf\x35\xd6" - "\x59\xe3\x0c\x9d\xb5\x37\x19\xc7\xb9\xea\x64\x3d\x32\x81\x2d\xbd" - "\x70\x9b\xb8\x50\xe7\xcb\xd8\xf4\x2f\x60\xd3\xb7\x90\xc7\x53\x46" - "\xa4\x80\x72\xa9\xa0\xcc\xa8\x32\xee\x1c\x8e\xad\x1a\x33\xd4\x23" - "\x6c\x67\xc8\x93\xa2\x01\x6b\x96\x5c\xaf\x7d\xe3\x66\x68\x81\x5f" - "\xfd\x80\xf0\xda\xb1\x69\xcd\xf4\x59\xfc\xcd\xaf\x3a\xd9\x84\x68" - "\x9f\x18\x2d\xcd\xf4\x75\x7d\x59\x72\x34\xc2\x88\xc4\x31\xfd\xd5" - "\x06\x0e\xd3\x5f\x6d\xe0\x30\xfd\x15\xb3\xfe\xa7\x2d\xae\x9b\x8b" - "\x01\xd7\x6a\x5b\x5c\xef\xdf\x7d\x5b\x71\xfd\x92\x74\x5c\x6f\xb8" - "\x62\x83\xeb\xd4\xff\x0e\xae\xbf\x8b\x64\x70\xad\x6c\xed\xcf\xe0" - "\x75\x4f\xb5\xe9\x6f\xc0\x7f\xbf\x5a\x61\xc5\x6d\xf9\x67\x18\xb7" - "\xff\x28\xeb\xac\xb8\x6d\x6e\xd2\x69\xe1\xb8\xe5\xb8\x85\x3c\x9d" - "\xc6\xed\x77\x91\x2d\xc8\x6a\x3f\x8c\x5f\x3a\x7b\x8b\x4e\x9b\x86" - "\x46\x42\x9c\x88\xf0\x5e\xd6\x17\x55\x32\x36\x3c\x10\xa1\x7d\x95" - "\xb6\x40\x8c\x60\xbe\x81\xb6\x2c\xa7\x69\xcb\xff\x6f\xef\x6b\x00" - "\xa2\xba\xce\xb4\xcf\x0c\x57\x43\x2c\x32\xa3\x01\x1c\x15\x75\x44" - "\x50\x8c\xa0\x68\x34\x21\xf9\x68\x3f\xda\x98\x3a\x18\x35\x76\x97" - "\x64\x89\x35\xad\x1a\x35\x68\x50\x09\xfe\x11\xff\x40\x42\xf2\x69" - "\x62\x60\x24\xe0\x62\x44\xa0\x2d\xd9\x92\xad\x69\xdd\xad\xd9\x8f" - "\x7e\x9f\x9a\xb1\xe2\x96\x18\x74\xb0\x31\x2d\x49\x49\x3a\x31\xc4" - "\x10\xe2\xcf\x44\x86\xf0\x33\xc3\x9c\x7d\xdf\x73\xce\x65\xee\x0c" - "\x33\xf2\x2b\x9b\x35\x5e\xbd\xdc\xb9\xe7\xbe\xf7\x3d\x7f\xcf\x79" - "\xce\x7b\xde\x7b\xef\x39\x41\x4b\x4a\x33\x2e\x10\xad\x33\x7f\x54" - "\x8c\xd9\xf1\x16\xd1\xa4\xf2\x67\x0b\x74\xc4\x89\x06\x18\x87\xb3" - "\xe7\xb0\xce\xfd\x6f\xc4\xa2\x8f\x19\x9f\xa3\xe0\x33\x4d\xe7\xfe" - "\x17\x89\x73\xc4\x89\x78\xba\xff\x44\x26\x3e\x9f\x6d\xc9\x39\xbe" - "\x58\x7e\x3e\xef\xd5\x36\x0a\x5a\x5b\x0a\xed\x05\xc6\x54\x27\xde" - "\x85\xa3\x1a\xd2\xf1\x25\x1c\xfd\xe0\xc8\x9e\x67\xf6\xae\x9f\x3b" - "\x9e\xcd\x9f\x2f\x2d\x9f\x2d\x78\xf0\x45\xd6\x06\xef\x25\xc3\x1b" - "\xc5\x6f\x48\x8f\x45\x7e\xde\xdf\x29\xef\x2a\x8f\x1d\x18\x37\x94" - "\x89\xc4\xdf\x41\xe0\xe7\xf8\x7e\x8f\xd0\xc7\xce\x9d\xe1\xf3\x75" - "\xa6\x5d\x97\xc8\x15\xbf\x13\x0b\xcc\xd0\xf7\x3b\x0f\x2c\x9f\x8d" - "\xcf\xdd\x10\xf7\x72\xbc\x81\x50\xdf\xa6\x6d\x4c\x86\x7d\x27\xed" - "\xcc\x4f\x22\xf4\x80\x26\x06\xc7\x90\x2d\x34\xf9\x07\xe2\xf8\x7d" - "\xc4\x36\xf7\xb7\x9c\x38\x48\xa1\xfc\x70\xcd\xf7\xce\x77\x9e\x70" - "\x2d\xf6\x4c\x49\x7f\x6a\x07\xef\x6f\xe5\xf4\xe2\x7a\xed\xf8\x4e" - "\xd1\x94\x4c\x92\xd9\xe2\x65\xbd\x76\xd7\xbb\x47\x27\xb2\x9d\x05" - "\x49\x60\xf7\x9e\xb8\x08\x36\x40\x9d\x32\xcf\xde\xea\x02\xe4\xad" - "\xbe\xae\xf5\xae\x1e\x4e\x06\xf8\xd2\xf3\x48\x64\x07\xed\xa5\x2e" - "\x9f\xf3\x9f\xd1\xf0\xfb\x8f\x3e\x56\xde\x61\x72\xda\x93\x34\x67" - "\x76\x5c\xed\xa5\x4d\x74\xd2\xe7\xfc\xd7\x1d\xf9\x4b\x4c\x8e\xc9" - "\xa0\x7b\xea\x78\xd2\xb1\x21\x69\x1e\xd4\x51\x00\xda\x7a\x3b\xd7" - "\xf0\xf7\xd4\xaa\xcb\x1d\x04\xed\xbe\x37\xd7\x57\xa9\xdb\xed\x49" - "\x24\xd0\x4a\xb4\x8b\x9a\xa9\x33\xf7\x1a\x09\xa7\x5b\x93\x34\xfb" - "\xae\x91\x38\x7b\x93\x6e\xd8\x2b\x69\x44\x6a\x07\x4e\x6e\xdf\x98" - "\xac\xc1\x77\xe2\x4e\x36\x9a\xd4\x66\x47\x05\xda\x99\xe1\xd8\x0f" - "\x60\xda\x3b\x9a\x92\x02\xf7\xde\xc0\x67\xc5\xcd\xc4\xb4\xe2\x97" - "\xd0\x0f\xbc\x73\x62\xc8\x4e\xe0\x3e\xe0\x2e\xd6\x1f\xf4\xa1\x2f" - "\x68\x87\xbe\x60\x61\x12\x6d\x3d\x5f\xfb\x67\x7c\x7e\xad\xcd\xd8" - "\x4c\x86\xa3\x7e\x7c\xde\xcc\xfa\x87\xc7\xa1\x7f\x80\x73\x18\x4b" - "\x74\xf6\x0f\xfa\x45\xa4\x4b\xff\x80\xe3\x90\xf3\x75\x0d\x04\xb0" - "\x7c\xd7\x22\x9b\xa6\x75\x97\x8d\x3a\x71\x4c\x62\x76\x5c\xc5\xb9" - "\x8b\x02\xe5\xbe\x02\xfb\x89\x76\xd1\x4f\x1c\x16\xfd\xc4\xeb\x03" - "\xd0\x4f\xbc\x8e\xfd\xc4\x07\x44\x7d\x10\xfb\x08\xe8\x1f\x7e\xf3" - "\x89\x55\x6d\x87\x3e\xa1\x77\xf5\x6c\xf2\xb9\xfe\x05\x3d\xb0\xdc" - "\xcf\x09\x7d\x31\xd6\xf3\x76\xa8\x5f\xac\x67\x73\x24\xd4\x6d\xed" - "\x5d\x86\x36\x08\x77\x1c\x98\x97\x5a\x7e\xd9\xaa\xa6\xf9\x8f\x1a" - "\xdb\x00\x0f\xdb\x9a\x89\xda\x11\xb4\xc4\xf4\xd6\x13\x46\x35\x8e" - "\x5b\x9d\x05\xf3\x8e\xf1\x31\xf2\xe9\xe1\xe8\xa3\xd1\x34\xe0\x73" - "\x7d\xea\xec\xa0\x49\x1a\xe7\x57\x49\xc3\x9d\xcf\xea\xfc\xed\x5f" - "\xe9\x86\xbd\xbc\x96\x48\xd6\x67\x93\x35\x19\x4f\x12\xed\x3b\x7f" - "\x31\xaa\xcf\xdb\xa0\x6d\x0f\x35\xaf\xa4\xa0\xbf\xe4\x12\x89\x2d" - "\x59\x41\x66\x17\x5f\x26\xfa\xe2\xd5\x24\xea\xd0\x65\xc0\xd0\xb3" - "\x49\x81\x76\x86\x8f\x36\x13\x7b\x37\x60\x35\x89\xa7\x21\xf3\x53" - "\xe1\x18\x6b\x5c\x4d\x70\xde\xc2\x54\x1a\xbc\xc4\xe4\x04\xb9\x7d" - "\x30\x76\x03\x1b\x1d\xd2\x70\xaa\xd9\x1b\x6e\x0e\xf5\xd2\x86\x58" - "\xb8\x18\x70\x53\x03\xb8\xf9\xda\x1d\x37\x38\x6e\x65\xd8\x59\xc8" - "\xb1\x83\xcf\x00\x4b\x94\xf6\xc5\x8a\xb3\x7d\xc6\x4f\x11\xd8\xcf" - "\x6d\x1e\xf8\x29\xba\xd6\x3f\xfc\xd8\x01\x3f\x45\x59\x80\x9f\x73" - "\x44\x5d\xe8\xec\x0f\x7e\xfe\xc8\xd7\xda\x28\x8b\x15\xef\x27\x9d" - "\x9a\x83\xf5\x6c\xf1\x3b\x35\xfb\xf1\x48\x15\xe9\x23\xae\xac\x37" - "\xc7\x95\x61\x36\xc7\xd5\x99\x55\x7d\xc0\xd5\x71\xc0\x95\xf5\xe6" - "\xb8\x6a\xf6\x85\x2b\x6b\x57\x5c\x55\x2e\x1c\x5c\x5c\xb1\xb9\x42" - "\xbf\x03\xb8\x3a\x13\xe3\x8e\xab\xd3\xaf\x72\x5c\x9d\xde\xd7\x77" - "\x5c\x19\xba\xe1\x2b\x83\xe0\xab\x3f\x9d\xe8\x3d\xae\x6a\x82\x28" - "\xe8\xbf\x39\xae\xae\xfa\xc0\x95\xc1\x0b\x5f\xfd\xe7\x1b\x83\x8b" - "\x2b\x36\x97\xe9\x77\x00\x57\x7f\xda\xe3\x8e\xab\x33\x9f\x73\x5c" - "\x9d\xa9\xef\x07\xae\xba\xe1\xab\x04\xc1\x57\x67\x83\xfb\x80\xab" - "\x14\xc0\x55\x37\x7c\xf5\xb1\x2f\x5c\x79\xe1\xab\xaa\x8e\xc1\xc5" - "\x15\x9b\x6b\xf5\x3b\x80\xab\x77\x2d\xee\xb8\xaa\xfa\x3e\xc7\x55" - "\x55\x5c\xdf\x71\x95\xd0\x0d\x5f\x25\x08\xbe\xaa\x5e\xd7\x07\x5c" - "\x55\x52\xd0\x7f\x73\x5c\x9d\xf0\x81\xab\x04\x2f\x7c\xf5\xde\xe3" - "\x83\x8b\x2b\x36\x17\xec\x77\x00\x57\xd5\xb1\xee\xb8\x3a\x5b\xc0" - "\x71\x75\x36\xbf\x1f\xb8\xea\x86\xaf\xe6\x0b\xbe\x3a\x7f\xa6\xf7" - "\xb8\xba\x10\x0a\xb8\xea\x86\xaf\x76\xfa\xc2\x95\x17\xbe\x3a\xf7" - "\xd6\xe0\xe2\x8a\xcd\x55\xfb\x1d\xc0\xd5\x79\xa3\x3b\xae\xaa\xaf" - "\x72\x5c\x55\x5f\xe9\x11\xae\x5a\x15\xb8\xaa\xbb\xcb\xd0\x9e\xc1" - "\xc7\x83\x6f\xae\x16\xb8\xfa\x97\xfb\x8f\x6e\xdf\x4c\xd4\x6f\x2d" - "\x29\xf4\x18\x0b\x5e\x18\xe1\x89\x29\xc0\x05\xc3\x94\xe3\x59\xc0" - "\x54\x23\xc7\xd4\xae\x8f\x01\x53\x1f\x15\xaa\xcd\xe9\x57\x11\x27" - "\x0c\x43\x45\xab\x01\x43\x38\x2e\x54\x49\xba\xde\x8c\x01\x5f\x69" - "\x94\xb1\x64\x6e\x1b\x10\x2c\x25\x02\x96\x2e\x7a\x62\xe9\x8c\x0b" - "\x4b\x3f\xf1\x31\x06\xfc\x99\x0f\x2c\x59\xba\xc7\xd2\x21\xf4\x21" - "\x6c\xb8\x45\x58\xba\xe0\xf2\x21\x1c\x59\x61\x55\x3b\x82\x7b\x8b" - "\xa5\x9a\x3a\x77\x2c\x99\x7f\xc8\xb1\x64\x8e\xef\x3b\x96\x0c\x56" - "\xdf\x58\x92\xed\xa9\xf7\x9f\xea\x1f\x96\xc0\xb6\x72\xc3\x52\xf7" - "\x76\x94\x0b\x4b\x7f\x7e\x64\x70\xb1\xe4\x61\x47\xdd\xb6\x58\x7a" - "\x3f\xd2\x1d\x4b\x17\xc4\xb8\xef\x82\xcf\x71\x9f\x13\xfa\x2e\x7c" - "\xe6\x84\xdf\xfd\x76\x34\x25\xcd\xeb\x80\x3e\x0d\xbf\xff\xc5\xe7" - "\x14\xbf\x5b\x5f\xa3\x46\x3c\xe5\xdc\x20\xe1\xfb\xd2\x48\x9c\xa6" - "\x95\x63\xc5\x01\x58\xd9\x73\x83\x48\x76\x3b\xe0\xa4\x9d\x48\x6d" - "\x50\xde\x6d\xf6\x64\x4d\xf5\xb2\x06\xf2\xce\xb5\x1a\xe8\xcb\x2a" - "\x48\x31\xdc\x63\x17\x7e\x48\xe7\xf6\xa4\xc0\xbd\xdb\xd0\x0f\x79" - "\x8e\x98\x96\xbc\x0e\xf5\x7f\xb1\xdf\xf5\xdf\xf6\x82\xaf\xfa\x3f" - "\xe1\x56\xf7\x45\x8a\x7a\x67\xdf\x16\xf4\xb1\x3f\x62\xcf\xa9\xd6" - "\xf3\xba\x97\xeb\xfd\xe0\x00\xd4\xfb\x41\x51\xef\xfd\xeb\x8f\x3e" - "\xf0\xfd\xfe\xa3\x82\x2b\xd8\x3b\x05\xad\x9c\x23\x64\x5e\x40\x8e" - "\x40\xfb\xa5\x2d\x68\xde\x26\xcf\xfe\x06\xf9\xe1\x9a\xdf\x5f\x5f" - "\xc5\xbe\xc9\xa7\x1d\x23\x78\x22\xe3\x79\xce\x13\xc2\x8e\xd9\x34" - "\xb0\xfe\xc7\xbf\x6c\xbe\x75\x7c\x71\xa2\xfb\xbe\xa7\x1f\x76\x0c" - "\xe2\xa6\xc8\x03\x37\xb7\x82\x2f\xfa\x86\x9b\xbf\x26\xb9\xf3\xc5" - "\x07\x6f\x73\xbe\xf8\xe0\x58\x4f\xfa\x9e\x6e\xf0\x64\x73\xe1\x89" - "\xfb\x1c\x39\x9e\x3e\xfc\x18\x7d\x94\xbd\xc4\x53\xd5\xc0\xfa\x1d" - "\x6b\xcf\x0c\x2e\x9e\x06\xce\xef\xf8\xed\xc6\xd3\x87\xe5\xee\x78" - "\xaa\x1d\xc2\xf1\x54\x2b\xf5\x1f\x4f\x06\x05\x3f\x19\x14\xfc\x54" - "\x17\x8d\xbe\xc9\xde\xe1\xe9\xcf\xa1\x03\xeb\x6f\xfc\x5b\xf0\xe0" - "\xe2\x69\xe0\xfc\x8d\xdf\x6e\x3c\xfd\xad\xd5\x1d\x4f\x1f\x3d\xce" - "\xf1\xf4\x51\xe2\x00\xe0\xc9\xe6\x69\x13\x73\x3c\x7d\xb2\x13\xed" - "\xe7\x5e\xe2\x29\x75\x60\xfd\x8c\x1f\xaf\x1a\x5c\x3c\x0d\x9c\x9f" - "\xf1\xdb\x8d\xa7\x4f\x0c\xee\x78\xaa\x7b\x83\xe3\xa9\xae\xac\xff" - "\x78\x4a\x50\xf0\x53\x82\x82\x9f\x2c\xe7\xd0\x17\xd9\x4b\x3c\x0d" - "\xb0\x7f\xf1\xef\x6f\x0f\x2e\x9e\x06\xce\xbf\xf8\xed\xc6\x93\xa5" - "\xd0\x1d\x4f\x9f\x34\x73\x3c\x7d\x62\x1b\x00\x3c\x29\xf8\x69\xbe" - "\x82\x9f\x3e\x1b\x87\x3e\xc8\xde\xe1\xe9\x7d\xdd\xc0\xfa\x15\x2f" - "\x0d\x19\x5c\x3c\x0d\x9c\x5f\xf1\xdb\x8d\xa7\x4b\x0d\xee\x78\xfa" - "\xf4\x11\x8e\xa7\x4f\xe7\xf6\xd4\x17\x24\xfb\x80\x94\x78\xf2\x3d" - "\xb6\xfb\x7c\xb9\xe7\xd8\xae\x77\x3e\x20\x18\xe7\xf5\xd9\x9f\x58" - "\x9f\xf0\x3f\xd5\x9f\x88\x18\x92\xfd\x40\xdf\x3e\x1f\xd0\xe7\x51" - "\xee\x18\xfa\x6c\x3f\xc7\xd0\x67\x46\x5f\x18\x72\x28\xdf\x49\xfb" - "\x42\xf1\x4e\xda\x55\xa2\x7e\x6b\xbd\x49\x7d\x5e\xbc\x93\x86\xef" - "\xa3\x9d\xaf\x6f\x20\x7b\xbf\x21\xda\xc0\x64\xa2\x5d\xf4\x1c\x75" - "\xe6\x22\x87\x6c\x4c\xd2\xbc\x72\x99\xc4\xd9\x01\x33\x39\x8d\xe2" - "\xbd\x34\xc0\xcd\x7b\x75\xad\xe4\xe4\x7a\x7c\x2f\xed\x28\x29\x01" - "\x39\x47\x3e\xf7\x07\x21\x8f\xb0\x77\xd2\x56\xe3\x3b\x69\x97\x7f" - "\xe2\xf5\x9d\xb4\xac\x5e\xbe\x93\xb6\x09\x70\x60\x03\x1c\x34\x23" - "\x06\xde\x76\x7b\x17\xed\x50\x96\xc2\x07\xb4\xc2\x87\x0f\xa8\xb6" - "\x67\xcf\x24\x06\xfc\x5d\xb4\xeb\x8a\x77\xd1\x64\x1f\xd0\x12\xe0" - "\x8e\x5e\xd7\xfb\x17\xe1\x37\xf3\x01\x75\x00\x27\x2c\xc2\x77\xcb" - "\x6d\x2e\x7f\xf1\x8e\x35\xf8\xed\xef\xbc\x54\x07\x70\x05\xbe\x3f" - "\xfe\xdb\x15\x55\xcc\xdf\x67\x4e\xaf\x25\x7b\xdb\x89\x56\x63\x15" - "\xbc\x10\x3c\xef\x98\x1d\xb8\xa1\x03\xfa\x25\xa8\xeb\xe1\xf6\x8d" - "\xc0\x0d\x37\x80\x1b\x36\x02\x37\x34\x03\x37\x5c\xaa\x62\xdc\x40" - "\x5f\x32\xaf\xc4\x39\xbf\x4b\x1a\xc9\xec\xc3\x8d\x24\x16\x39\xa0" - "\xa3\x60\x09\xae\x29\x9c\x6f\x0d\x9e\x57\x08\xd7\xca\x39\x06\xda" - "\x4c\xfb\xd2\x08\xe3\x7a\xac\x7b\xfd\x6a\xe4\x83\x86\x27\xed\x59" - "\x84\xf4\x07\x07\x76\xa5\x4f\x50\x89\x03\x1f\x1c\xd0\x6f\x2c\x78" - "\xf8\x81\x0f\xf5\x93\x03\x10\x0b\x87\x64\x0e\xe8\x17\x16\xbe\xf4" - "\xf9\xfd\x4f\x37\x58\xb0\x76\x8f\x05\xc3\xec\x1e\x62\xe1\x38\xce" - "\x95\xdd\x15\x0b\x86\x20\x6b\xb0\x41\x07\xd7\x22\x39\x16\x9a\xbd" - "\x60\xa1\x71\xd5\xad\xc7\x82\xbb\x4f\xe6\xf6\xc5\xc2\x57\x3e\xe7" - "\xff\xbc\x39\x16\x0c\x3d\xe0\x05\x43\x0f\x79\xa1\x26\x08\xe7\x98" - "\xf6\x82\x05\xe0\x05\x03\xf0\x82\x41\xf0\xc2\x55\x2f\x58\xb8\xf2" - "\xdc\xad\xc7\x82\xbb\x3f\xe5\xf6\xc5\xc2\x55\xdf\xf3\x5f\xdc\x1c" - "\x0b\x3d\xe0\x85\x84\x1e\xf2\x42\x4d\x0a\xce\xcd\xdc\x15\x0b\x09" - "\xc0\x0b\x09\xc0\x0b\x09\x82\x17\x3e\xf6\x82\x85\x6b\x3b\x6f\x3d" - "\x16\xdc\x7d\x21\xb7\x2f\x16\xae\x27\xf6\x0d\x0b\x09\x3d\xe0\x85" - "\x84\x9e\xf2\x42\x25\xce\x69\xec\x05\x0b\xc0\x0b\x09\xc0\x0b\x09" - "\x82\x17\x4e\x78\xc1\x82\x75\xef\xad\xc7\x82\xbb\x1f\xe3\xf6\xc5" - "\xc2\xd7\xcb\xfa\x88\x85\x1e\xf0\xc2\xfc\x1e\xf2\xc2\x85\x50\x9c" - "\x0b\xb8\x2b\x16\xe6\x03\x2f\xcc\x07\x5e\x98\x2f\x78\x61\xa7\x17" - "\x2c\xdc\x28\xb8\xf5\x58\x70\xf7\x41\xdc\xbe\x58\x68\x4a\xb9\x29" - "\x16\x68\x57\x2c\xa0\x0f\x01\xc7\x8f\x38\xd7\x36\xc3\xc2\x5a\x93" - "\xba\x9d\x22\x16\xaa\xc8\xcb\xdb\x14\x58\x28\xe0\xe3\x08\x19\x07" - "\xaf\x2a\x71\x80\xdf\x2f\x21\x0e\x60\xfc\xe0\x80\x7a\xa7\x07\xe6" - "\xa7\xb2\xf7\x95\x0a\xe6\x95\xe3\xf8\x01\xfd\x0c\x38\x86\xf0\x3d" - "\x7e\xb0\x1d\x1c\x10\x0c\xa4\x00\x06\xae\x78\x1f\x47\x0e\xf8\xf8" - "\xe1\xfa\x2d\xc2\x00\x8c\x25\x5f\xdf\xd5\x1f\x0c\x34\xa7\xf6\x1e" - "\x03\x60\x23\xf4\x08\x03\xdc\x4e\xb8\x39\x06\x12\xb4\x2e\x0c\x80" - "\xbd\x50\x90\x10\x89\xf6\x01\xc7\x40\x82\xce\xb7\x7d\xf0\xcd\xe1" - "\x5b\x8f\x81\x01\xb6\x0f\xbe\xb5\x18\x68\xd9\xe4\xf3\x1b\x46\xe4" - "\x72\xe0\xfd\x45\x53\xc7\x13\xfa\x6c\xd2\xbc\x9c\x46\x12\xfe\xca" - "\x5a\x12\x87\xf3\xc6\xbc\xd5\xde\xaa\xde\x95\x4a\xbf\xc0\x6f\xab" - "\x1d\x90\x0f\x9c\xbf\x9a\xe1\xe3\xba\xce\xdf\x9c\x6c\x25\x7b\x01" - "\x0b\xaf\x40\x1e\x70\x5e\xfa\xc0\xd4\xbb\x0c\xe7\x6d\x67\x49\x7b" - "\x53\x12\xa9\x5e\xd6\x48\x1e\x8b\xa4\x76\x73\x9d\x09\xbf\x61\x94" - "\x4c\x5b\xce\xe2\x77\xe2\xc3\x7e\x9e\x4e\xd4\xd7\xfc\x5a\x63\xd1" - "\xa7\x34\x23\x9d\x68\x8b\x1a\xb9\x1f\x69\xef\x35\x42\xce\xa4\x13" - "\xc2\xeb\xbd\xb5\x60\xc8\xf3\x03\xe0\x43\x5a\x0a\xf5\x5e\x27\xd7" - "\xfb\x19\x77\x1f\x92\xba\x07\xdf\x33\xf6\xc0\x77\x78\x4b\xbe\x67" - "\xbc\xde\xf5\x7b\xc6\xbe\xf9\x0e\xdb\x7c\xae\x7f\xc2\xfc\xcc\xc2" - "\x0e\xd8\xbe\x89\xb5\x7b\x56\xaf\x76\xe0\x7e\x73\x7a\x05\x7b\x3f" - "\x1a\xdb\x39\xb6\x79\xc4\x47\x06\xe4\x17\x31\x82\x78\x58\x54\x6e" - "\xb7\xff\xcc\x46\xd4\xce\xe0\x79\xc7\x10\x13\xce\x0d\x3a\xff\x7d" - "\x90\x27\xf3\xb2\x4b\x50\xef\x37\x88\xb9\x5e\xd4\xf9\xb6\x4b\x50" - "\x97\xed\xe1\x74\x43\xe4\xb0\xe9\x36\xa2\xcd\xf8\x90\x68\x7f\x8e" - "\xdf\x1c\x43\x3f\x70\x08\x6c\x82\x92\xb5\x64\x36\xf4\x07\x46\xbb" - "\xe0\x06\xa7\xec\x57\xc2\x3e\x02\x30\xf1\xca\x7a\xc0\x04\xa0\x56" - "\xff\x33\xc4\x44\xfb\x9b\x43\x36\x7b\xf1\x2f\xf7\x02\x13\xcc\xbf" - "\xbc\x12\x30\x51\xef\xc2\x44\xa7\x5f\xd9\x47\x9f\x60\x5a\xd2\x8f" - "\x77\x0b\xbd\xf0\x41\xbf\xfd\xca\xd7\x85\x5f\x59\xc1\x07\x7d\xc3" - "\x86\xdd\xf7\x9c\x98\xbe\xb1\x61\xed\x1e\x1b\x2d\x02\x1b\x86\xd9" - "\xdd\x63\xc3\x11\xef\x05\x1b\xc7\x5d\xd8\x30\x68\x5d\xd8\x10\x7e" - "\xa6\x02\x43\x64\x57\x6c\x38\xce\x0c\x0e\x36\x3c\xde\xfb\xb9\x6d" - "\xb1\xd1\x51\xda\x7b\x6c\x18\x7a\xc0\x1b\xd7\x65\x6c\xf4\x80\x37" - "\x9c\x4b\xbb\x62\xa3\x26\x48\x81\x0d\x05\x6f\x08\xbf\x53\x81\xc1" - "\x0b\x6f\x38\x3f\x1d\x1c\x6c\x78\xbc\xc3\x73\xdb\x62\x83\x1e\xef" - "\x03\x36\x7a\xc0\x1b\x7f\x17\xd8\x48\xe8\x9e\x37\x24\x92\xee\x05" - "\x1b\x29\x2e\x6c\x24\x28\x78\x43\xf8\xa1\xd0\xe6\xf4\xc4\x86\x44" - "\x3a\x06\x07\x1b\x1e\xef\xe3\xdc\xae\xd8\x90\x54\xb5\xbd\xc7\x46" - "\x42\x0f\x78\xe3\x1d\x19\x1b\xdd\xf3\x86\xa4\xce\xf7\x82\x8d\x4a" - "\x05\x36\x14\xbc\x21\xfc\x52\x05\x09\x5d\x79\x43\xf2\x1b\x3d\x38" - "\xd8\xf0\x78\xb7\xe6\xb6\xc5\x86\x9f\xad\x0f\xd8\xe8\x01\x6f\x64" - "\x08\x6c\xcc\xef\x01\x6f\x48\x47\xbb\x62\xe3\x42\xa8\x0b\x1b\xf3" - "\x15\xbc\x21\xfc\x54\x05\xf3\xbd\xf0\xc6\x90\x39\x83\x83\x0d\x8f" - "\xf7\x64\x6e\x5b\x6c\x0c\xf5\x39\x9f\xbe\x12\x1b\x3b\x6c\x5e\xc6" - "\x29\xf5\x1c\x1b\x76\x90\x51\xe2\x42\x39\x36\x81\xfc\x49\x8f\xc1" - "\x98\x05\x31\xf1\xd4\x0e\xa2\x66\xb8\xb0\x29\x71\x31\xb4\x0a\x71" - "\x11\x9d\x0c\xb8\xf8\x5c\xe0\x42\x1e\x97\xb0\xb9\x57\xf8\xd8\x44" - "\xf6\x59\xc9\xe3\x93\x97\x71\xcc\x9a\x2c\x63\xe2\xae\x84\x21\x6b" - "\x06\x00\x13\x6e\xef\x3d\x28\x30\xf1\xa4\x8f\xf1\xc9\x13\x7d\xc7" - "\xc4\xeb\x30\x76\xb5\x0f\xf4\xb7\x4f\x32\x26\x3e\xec\x2f\x26\xfc" - "\x6f\xfa\xfe\x83\x77\x4c\x08\x3b\xc3\x27\x26\x5c\xb6\x05\xc7\xc4" - "\xdf\x6f\x82\x09\xff\xba\xae\x98\x10\x76\x05\x9b\x87\x80\xdb\x16" - "\xb2\x0f\x4b\xb6\x2f\xdc\x31\x71\xf7\x53\x83\x83\x09\x0f\xfb\xe2" - "\xb6\xc5\xc4\xb0\x58\x5f\x98\x30\xaa\x9d\x47\x61\xaf\x80\xdd\x04" - "\x7b\x55\x87\x9a\x3c\x72\x58\xed\x64\xf3\x52\x8b\x36\xe3\x79\x7d" - "\x28\x7d\x69\xec\x51\x94\xa1\xbb\x25\x36\x1f\xaf\xac\xa3\x63\x18" - "\xc1\xf9\x10\x4d\x1a\xd5\x32\xac\x13\x94\xbd\x4b\xd6\xa5\xd9\x4d" - "\xe2\x21\xff\x5c\x4e\x4d\x32\xb9\x5c\xfc\x50\x94\xa3\x39\x27\x03" - "\x20\xcc\x5f\xe8\x64\x6b\xe4\x74\xa8\xd5\xa8\xcb\x33\xee\xbb\x85" - "\x8c\xbe\x23\x8b\xe8\x95\x71\x83\x2e\x8c\x53\x96\x1b\x86\x72\x1d" - "\x6a\x6b\x6b\x87\x4a\x0a\x57\xca\xd1\x1f\x11\xa5\xdc\xf7\x84\xbe" - "\x48\xb7\x7c\x84\x11\xa2\x51\xe9\x79\x5e\xd2\xd5\x72\x5e\x02\x98" - "\xce\xc0\xe3\x2b\x41\x67\x94\x9b\xce\xa1\x84\x0c\x07\x79\xd4\x3b" - "\x3c\x99\xa5\x1b\xe5\x87\xd3\xa1\x17\x93\x98\x7e\x95\x14\xe3\x54" - "\x93\x18\x9e\x2f\x22\x1d\xee\x4c\xb3\x9e\x18\xdd\xe3\x08\x94\xcb" - "\x4b\x29\x87\x32\x54\xdd\x29\xa3\x61\xe9\x18\xfa\x7e\x0a\xa4\x23" - "\x56\x99\x0e\x2e\x47\x66\x0a\x39\x2d\xe4\x2b\xae\xb3\x2e\xf3\x35" - "\xc9\xb2\x1c\xe0\x77\x34\xd4\x85\xc9\x0c\xed\x4d\x94\xc3\x08\xa8" - "\x83\x52\x51\x16\xf1\x4a\x9d\xc3\x55\x2a\xcb\x61\x51\x5e\xce\x9c" - "\x93\x89\x20\x3b\xd2\xb9\x5b\x9a\xdb\xa9\x37\x4b\x4b\xe4\x7a\xa5" - "\x59\x8e\x7b\x98\xde\x06\x68\x67\x6a\x95\x5e\x94\xc3\x3d\x28\x0b" - "\xf7\x18\x78\xbe\xb4\x9d\xf5\xda\xa1\x96\xf0\x9a\x49\x21\x1b\xc4" - "\xcb\xf8\xbc\x15\xf2\xb6\xa0\xab\xbc\xbf\xa7\x7c\x30\x97\x37\x59" - "\x40\x7e\x71\x57\x79\xad\xa7\x7c\x08\x97\x3f\x1d\x0b\xf2\x89\x5d" - "\xe5\x1d\x23\x3d\xe4\x47\x71\xf9\x33\x46\x90\x4f\xea\x2a\xaf\xf7" - "\x94\xd7\x71\xf9\x0b\x71\x20\xbf\xb4\xab\x7c\xbc\xa7\xfc\x68\x2e" - "\xff\xa7\x06\x90\x5f\xd6\x55\x3e\xd3\x53\x7e\x0c\x97\x3f\x1b\x0f" - "\xf2\x2b\x3d\xe5\x4b\x98\x2c\x09\x13\xb2\x63\xb9\x6c\x75\x21\xc8" - "\x26\x7b\xc9\xab\x9f\xd0\x1d\x23\xe4\x43\xb9\xfc\x49\x6c\x33\x29" - "\x5e\xea\xca\x53\x7e\x1c\x97\xff\xcc\x00\xf2\xa9\x5e\xea\xca\x53" - "\x7e\x3c\x97\xff\x20\x19\xe4\x37\x79\xa9\x2b\x4f\xf9\x09\x5c\xfe" - "\xaf\x15\x20\x9f\xee\xa5\xec\xdd\xe5\x03\x3f\xf2\x07\xb9\x1d\x87" - "\xb3\xe4\xf6\xe3\x56\xee\x9e\xba\x27\x72\xdd\x75\x49\x70\x4f\xa6" - "\x97\x72\xf7\x94\x0f\xe3\xf2\x9f\x94\x83\x7c\x76\x57\x79\xa2\xe2" - "\xf2\x64\x96\x90\x9f\xc4\xe5\x2d\x58\x96\x7b\xbc\x94\x3d\x5e\x37" - "\x89\x76\x1a\xce\x65\xdf\xdf\x03\xb2\xfb\xbc\x94\xbb\x52\x36\x82" - "\xcb\x36\x1d\x03\x59\xa3\x97\x32\x57\xca\x4e\xe6\xb2\x5f\x20\x4f" - "\xe4\x7b\x29\x6f\xa5\xec\x14\x2e\xfb\x65\x3a\xc8\x16\x7a\x49\x6f" - "\x98\x42\x36\x92\xcb\x7e\x95\x0d\xb2\x45\x5e\xea\x45\x29\x3b\x95" - "\xcb\x36\x63\x1d\x96\x7a\xa9\x17\xa5\xec\xbd\x5c\xf6\x2a\xb6\xb5" - "\x32\x2f\x75\xa2\x94\x9d\x46\x03\xaf\x17\x09\x6e\x2d\xf7\x94\x05" - "\x0c\x98\x80\x87\xaa\x80\x0b\xa3\x68\xce\xd7\xe5\x25\x9c\xd7\xd8" - "\xda\x46\xb2\x0c\x55\x3b\xee\x53\xf4\x03\xd1\x34\xe7\xf3\x7d\x82" - "\xff\x8e\x7a\xea\xa3\x6a\x49\x29\x3b\x9d\xe6\x0d\x4d\x12\xb2\xc7" - "\xba\xca\xfa\x2b\x65\x67\xd0\x9c\x36\xb9\xaf\xac\xe8\x2a\xab\xed" - "\x94\xa5\x39\xf6\x6a\x90\x39\x5e\x2c\x78\x55\x91\xce\x59\x0a\x7d" - "\x33\x69\x4e\x47\x83\xd0\x67\xea\xaa\x4f\xaf\x94\x9d\x45\xf3\xfc" - "\x53\x84\x6c\x65\x57\xd9\x78\xa5\xec\x7d\x34\x8f\xf5\x37\x28\x5b" - "\xd5\x55\x36\x53\x29\x3b\x9b\xe6\xa9\xf5\x42\xb6\xda\x53\xb6\x98" - "\xf7\x41\x6a\x51\x4f\x73\x68\x1e\xef\x83\x40\xb6\xc6\xad\x8f\x55" - "\xab\x58\x1b\x2b\xe6\x72\xf7\xd3\xc0\x96\xe3\xa2\x3e\x2f\xba\xf5" - "\xad\x59\xaa\x91\xd8\xa7\x1c\xc6\xfa\x7c\x29\x7c\x31\xc8\x3e\x20" - "\xf4\xd5\x7a\xf6\x7d\x22\x7d\xb1\x70\xad\x4e\xee\x9f\xa0\xdf\xb1" - "\x78\xb3\x7b\x52\xef\x25\xdf\x6b\x94\xee\x31\xf1\xbe\x51\xac\x41" - "\x2c\x05\xb3\x73\x67\xd9\x03\x8b\x1f\xb3\x51\x87\x32\x2c\x57\x4d" - "\x6b\x66\xd8\x88\x84\x73\x7a\xd3\xe0\x65\xad\x16\x08\xb7\x46\xc4" - "\xea\x5b\xf2\xee\xa9\xb6\xa8\xce\x2f\xc0\x79\x5f\xe1\x77\xad\x85" - "\xec\x31\xe2\xef\xdc\x2c\x5c\x2b\x31\x5e\xd5\x71\x40\x13\x83\x6b" - "\x2b\x96\xc0\x79\x0e\xec\x6c\x1d\x43\xb0\x31\xe9\x4b\x24\xde\xb4" - "\xc5\x41\x2e\xa7\x13\x35\x5b\x8f\x5b\x0a\x8a\xa0\x1b\x92\xe3\x20" - "\x2d\x99\x10\xef\xca\x4b\x70\xce\xd2\x82\xeb\xc0\xe5\x6b\x16\x98" - "\xd2\xda\x51\xe6\x79\x6b\xf0\xda\x4c\xfa\xc2\x4f\xbf\x4c\xdd\x45" - "\x26\x34\x4a\x41\x8c\x17\x71\xde\x5b\x67\xb0\x66\x01\x9b\xef\xf6" - "\x7a\xf2\x0f\xd8\x5c\xb7\x52\xf0\x7e\x9c\xe3\x16\xe7\xba\x95\xe7" - "\xb9\xe5\xf1\x04\xef\x68\xc2\xf5\x45\x4b\xb7\xe8\xd9\x3c\xba\x52" - "\xd0\x39\x96\xbf\x2c\x5a\x43\xc3\x1f\x88\x75\xb6\x67\x67\xe2\xfa" - "\xd9\xa6\x5d\x8d\xe4\x92\xb8\x86\xfa\x85\xce\x85\x9e\x3a\xf1\x3e" - "\xeb\xc4\x2d\x7a\x28\x97\xd8\x0e\xe3\xc3\x47\x9c\xda\x87\xcb\xa9" - "\x71\x91\xde\x9c\x62\x21\x2c\xaf\x52\xf0\x29\x1a\xf8\xa4\xd9\x69" - "\x7c\xd8\x08\xe1\x5a\xb3\xad\x9d\x85\x5f\x92\x82\x75\x68\x37\x37" - "\x69\xe7\x67\x53\xe3\xfc\x3d\xa6\x31\xed\xa4\x5e\x0a\x66\xb6\x1a" - "\x86\xd3\xfd\x8b\xf4\x58\xc6\xce\xfd\x8b\xb4\x7e\x3a\x22\x35\x8d" - "\x98\x9f\xdd\x92\x17\x1c\x2b\xaf\x67\x27\xc7\x85\x7a\x2d\x42\x57" - "\x8f\xe7\xec\x95\x82\x4c\x6c\xce\xde\xbc\xe0\x3d\x16\xd5\xd8\x70" - "\x36\x67\xaf\x5c\x96\x3d\xd7\x91\x82\x3a\xbc\xaf\x6b\x42\x34\xb4" - "\x40\x93\x0c\xfa\x1b\xc0\xf6\x4e\xe7\xd8\x08\xb6\x59\x54\xc3\xeb" - "\xf8\xef\x10\x62\x51\x8d\x98\x2b\x7e\x07\x58\x54\xa7\xe4\x70\x9d" - "\x3c\x6f\xb2\xf7\x79\x9c\x35\x80\x0f\x4d\xa2\xf3\x50\x92\x3f\x8e" - "\x1b\x58\x7a\x82\x35\x71\xfa\xf1\x44\x75\x59\x0a\x29\x82\x38\x13" - "\x79\x3d\x85\x6c\x86\xa3\x46\x1c\xad\xe2\x48\x51\x86\xe1\x3d\x68" - "\x45\x2c\xd4\x85\x8e\xd7\x4f\xc8\xab\x6c\xbc\x84\xb8\x02\xec\xd1" - "\x11\x8b\x74\x4c\x6f\xc1\xda\x4c\x65\x1a\x62\x66\xce\xba\x6f\xf6" - "\x9c\xfb\x1f\x88\x7d\x70\xf9\x8a\xa7\x57\xae\x5a\xfd\x4c\xf2\x9a" - "\xb5\xcf\xa6\xac\x5b\xbf\x21\xf5\xb9\xb4\x8d\x9b\x36\x6f\xd9\x9a" - "\xfe\xfc\x36\xd0\xd3\xb9\xb6\x37\x3d\x34\x57\x65\x53\x13\xa8\xeb" - "\x1f\x61\x1c\x6c\x9d\x27\x0c\xe3\x98\x0b\xb9\x22\xe9\xbd\x8f\x47" - "\xcc\x3a\x18\x03\x82\xfd\x7d\x45\x1a\x95\x80\xeb\x38\x02\xfe\x55" - "\xe6\xa2\x79\x26\x5c\x8f\xba\x5e\x1a\x15\x77\xde\x3a\xcf\x84\xeb" - "\xa7\x9f\xd6\x35\x90\xf0\x30\xa2\x6a\x94\x46\x45\xe2\xf5\x92\xc9" - "\x84\x54\xc2\xbd\xde\x74\x86\x69\x89\xee\xb5\x10\x6a\xcd\x0f\xa1" - "\x57\x50\x7f\xfe\x01\xda\x60\xdd\x9e\x4c\x72\xe0\x1c\xda\x84\xf6" - "\xb2\x34\xaa\xe3\x34\x8c\x3a\x9c\x59\x24\xb4\xf8\x00\xad\xcf\x0e" - "\xa1\xf5\x2f\x1c\xa0\x57\x4a\x42\xa8\x25\x3c\x9f\x04\xb4\xe4\x8d" - "\x3a\x6a\x91\x46\xf9\xb3\x76\x0d\xd7\x9d\x23\x43\xca\x73\xe1\xda" - "\x0c\x07\xf1\x2b\x81\x73\x08\xb3\x9d\xd6\xf3\x74\xff\xee\x46\xeb" - "\x10\xd0\x97\x4f\xed\x29\xaa\x1c\x88\x87\xd7\x87\x6e\x62\x25\xa0" - "\x0b\xe2\xb3\x9a\x5b\x2f\x11\x8b\xa4\xd3\xe3\xba\xb2\x10\x9f\xc6" - "\x5c\x78\x85\xa0\xbe\xdf\xa6\xb5\x0e\xd9\x38\x86\x3a\x40\x96\x38" - "\xb7\xa7\xa8\x20\xbe\x3a\xd0\x6d\x53\xe6\x27\x72\xf5\xba\x4d\xfa" - "\xf5\x9b\x53\x52\xa6\x0e\x23\x91\xec\x48\x94\x6b\xa9\x6f\xc2\xf9" - "\xda\x5f\x3b\x40\x2b\x21\x9f\x26\xc8\x6f\xd5\x39\x68\x4d\x80\x0d" - "\x02\x79\x32\x82\xde\xcd\x10\x7e\x1c\x7e\x1f\x87\xb4\x57\xb1\x75" - "\x9a\xa5\xa9\xbf\xa0\x79\xba\x28\x48\x27\xf6\x95\x38\x8f\x39\x69" - "\xda\x9a\xa8\x82\x7c\xe7\x83\x5c\x95\x7e\x0c\x89\x80\xfb\x3a\x20" - "\x1d\x65\xf0\x1b\xe5\xdf\xc4\x7a\x04\xf9\x4a\x9e\xaf\xa9\xfb\xf1" - "\x1c\xca\xca\x74\x38\x84\xee\x6b\xc9\xd3\xd5\xe2\xba\x15\x6c\x2d" - "\x4e\x38\x87\x72\xa9\x02\x59\x63\x53\x46\xa2\x0a\xc6\xcf\xaa\x12" - "\x97\xce\x72\x4c\x13\xa6\x03\xc7\xe4\xef\x81\x25\xeb\xb4\x27\x91" - "\xe8\x56\xa2\x7a\xaf\x9e\x90\xa2\x03\xb4\x14\xf6\x22\xd8\x0b\xcf" - "\xc2\xb5\x77\x61\xaf\x82\xf0\x6a\x38\x9e\x85\xe3\xbb\xb0\xc3\x98" - "\x5e\x87\xe9\xde\xb8\x83\x36\xcc\x28\x24\x93\x50\x3f\x60\xeb\x9f" - "\x2e\x49\x91\xad\x98\x76\x5c\x97\x86\x8e\x1c\x9d\xe2\xb6\x96\x86" - "\x34\xc6\x42\xe0\x3a\x1c\x6d\xfc\xa8\xdc\xc7\xc6\xc1\xbe\x54\xfc" - "\x2e\x03\x99\x6a\xf1\xbb\x02\xf6\xca\xee\x77\x4f\x7d\xbe\xf6\xd0" - "\x98\x9e\xcb\xf6\x64\x9f\x9a\xd2\x33\xb9\x71\x0d\x44\xd2\xc7\xc3" - "\x9e\xee\x1e\xae\x5f\xcc\xc3\x22\x42\xf9\x79\x44\xa4\x38\x26\xc2" - "\x0e\xe5\x34\x19\xf4\x4f\x36\xf2\xb0\xc9\x45\x70\xac\x87\xdd\xea" - "\x1e\xff\x54\xb8\x7f\x6a\x36\xd6\xa7\x1d\xfa\x20\xac\x4b\x8b\x34" - "\x3a\x0e\xeb\x28\x97\x63\x4b\x85\xdf\xe6\x41\x58\x2c\x60\xab\xc8" - "\x85\x9f\xb1\xd1\xee\xf8\x19\xab\xf3\xc0\x8f\x11\xb9\x08\xda\x4b" - "\x76\x09\xc7\xcb\xf1\xa6\xed\x2b\xe1\x7c\x6c\x28\xe8\x39\x8e\xbe" - "\x22\xd0\xc1\xec\xe0\xdc\x46\x18\x83\x27\x43\x4e\x76\x21\x77\x8c" - "\x5d\x87\x98\xc5\xb8\x45\xbc\x3c\x2d\x90\x3e\x08\x2b\xc5\xf4\x6d" - "\x00\xbd\x70\x5e\x06\x72\xa5\x66\x72\x43\x4e\x1b\xbb\xe7\xe5\xb5" - "\x80\x47\x91\x5e\xd4\x89\xf7\x51\x57\xbe\x62\xf1\x1e\x1e\x77\xe8" - "\x44\x08\xc7\xb1\x3d\x7e\x77\xe7\x67\x76\x58\x08\x62\x12\x8f\x66" - "\x47\x0c\xb4\x25\x03\x71\xe2\x5c\xf3\x3a\x12\x03\xed\xed\xee\x4b" - "\x52\xa8\x34\x7d\x07\x89\x41\x7d\xc8\xdf\x90\x8f\xaa\x12\x6c\x8b" - "\x5c\xd7\x68\xcc\x07\xea\x3f\x0b\xa3\x29\x3c\x16\x63\x7a\xe0\xba" - "\x22\xde\x7c\x1c\xb3\xe7\x6e\xe3\x79\x85\xb8\xca\xe0\xfe\xa3\x98" - "\x77\x2c\x4f\xb8\x5e\x01\x7a\x96\xe1\x35\x5c\x9b\x52\xe4\xa7\x0c" - "\xbf\x77\xc4\xf2\x40\x79\x33\x8c\x5e\xd8\x3a\x1a\x92\x8e\xcd\xd5" - "\x0f\xfa\x8f\x62\x7d\x50\x3b\xef\xe3\x33\x1c\xd4\x41\x81\x8f\x7e" - "\xb5\xad\x15\x6c\x9f\x71\x1f\xba\xd7\x4f\x68\x85\xb2\x7e\xe0\xbe" - "\xa3\x70\x7f\x25\xda\x03\xc8\x27\x10\xa7\x06\x6d\x1d\x08\x33\x3a" - "\xf3\x40\xc7\x96\x56\xe6\xdf\x02\x3d\xef\x42\x5a\x8c\xa8\x07\xd2" - "\x53\xc9\x75\x8d\x93\x70\xce\x7d\x65\x5d\x0b\x7d\x65\x58\xe7\xac" - "\x3d\x6f\x63\x79\x02\xee\x1a\x77\xb0\x98\x5f\xab\x00\x99\x0a\x6a" - "\x37\x10\xba\x3d\x89\xaf\x57\xcd\xaf\x1d\xcb\x68\x63\xf5\x5b\xc9" - "\x79\x6d\xdc\x1f\x36\xee\xa4\x0d\xae\x74\x8f\x4b\x95\xd7\xa4\x12" - "\xe9\x3e\x86\xf1\xd1\xad\x4b\x59\x1f\x8a\x71\xe0\xfd\x42\xdf\x02" - "\xd4\x27\x97\xd5\x74\x48\x07\x2f\xaf\xd0\x4c\x08\x2f\x43\x2c\xb2" - "\x72\x03\x1e\x6d\xca\x40\x2c\x8e\xdb\x04\xf7\x1f\xcf\xc1\xf3\xad" - "\xec\xdc\x9f\x71\x6c\xe7\xf5\xd0\xe3\x78\x1d\x7d\x22\xb9\xcf\x02" - "\x96\x9c\x84\x4c\x0a\x22\x31\xb6\x2c\x96\xb7\x23\xb6\xed\x73\x55" - "\xa7\x1d\x84\x60\x3a\xa1\x8c\x2a\x5a\xf2\xc6\x87\x02\xf7\x2f\xc5" - "\xb4\x02\x5f\x1f\xa3\xbf\x4a\x22\x98\x66\xe0\x33\x91\xbe\xf1\xaf" - "\x8a\xba\x3f\x86\x79\xc4\xf2\x9c\xce\xb9\x0f\xae\xe9\x67\x62\xda" - "\x5d\xf9\x1e\x9f\xac\x2c\x63\x96\x6f\xa8\x07\xac\x2f\xac\x17\x85" - "\x4e\xc4\xbe\x11\x74\x1d\xe1\xe7\x1c\x1b\x58\xd6\xc6\x10\x5a\x8d" - "\xf2\x2e\xd9\x09\xbf\xc0\x6b\xbb\x20\xee\x19\xa9\xe8\xff\x81\xfe" - "\xd9\xd1\x62\x02\xbd\x47\x4c\xdb\x1c\x04\x74\x54\x60\x99\x82\x5c" - "\x33\xe2\x11\xce\xab\x45\x1c\x36\xe8\xcf\xa3\x60\x8f\x73\xb5\xff" - "\x09\x9f\xbb\xe3\x6b\x82\x67\xfb\xc7\xfa\x36\x3a\x33\x0c\x84\xe1" - "\x21\x8d\xe8\xaf\x49\x13\x76\x8b\xbe\x43\xd4\xf5\x84\x0f\x4e\x43" - "\x7b\x51\xe8\x58\xea\x51\xd7\x15\x0c\x8f\x5b\x17\xa8\x30\xcf\x70" - "\x6f\x85\xd0\xc3\xf2\xcc\xf0\x94\xc5\x30\x50\x4d\xb7\x42\x3e\x3b" - "\x71\x30\xbe\x42\xd4\x73\xb5\x47\x99\xc8\xdc\xc5\xd6\x38\x46\x4e" - "\x02\xbb\xfb\x07\x2d\x76\x17\x2f\x61\xdd\x3b\x59\xdd\x4f\x58\x56" - "\xc2\xfb\x5b\xc1\x5b\x13\xf8\xf5\x10\x37\x0c\x63\x5a\x0a\x18\x7e" - "\x31\x2d\x19\x4b\x31\x2d\x15\x2c\x1d\x19\x7a\x72\x4d\xd2\x07\x60" - "\xfc\x70\x6f\xa1\x68\xaf\x42\xd7\xf8\x14\xd4\xf5\x02\x70\x15\xa6" - "\xc9\x22\x8d\x69\x65\xfc\xf7\x63\x86\x83\x75\x22\xed\x55\xad\x59" - "\x78\xef\xd8\x65\x6d\x6a\x76\x6f\x15\xc8\x5d\x6c\xe5\x6b\xc4\x0d" - "\x83\xfb\xcb\xd9\x7b\x9b\x52\x78\x35\x72\x34\x7e\x8f\x0c\xbf\xdf" - "\xd6\x3f\x01\x58\x6d\x24\x12\xe8\xf3\x47\x8c\xca\xb8\xb8\x22\x85" - "\xbf\x81\xeb\xc7\x40\x59\x1f\x01\x1b\xa9\x1c\xcb\x1b\xb1\x0c\x36" - "\xd2\xec\x96\x3c\xfd\x45\x19\xb7\x10\x4f\x11\x96\x3d\xaf\x9f\x89" - "\xa3\x01\xc7\x15\x2e\x6c\x4d\x1c\x2d\xca\xb1\x1c\xca\xd1\x1f\xe2" - "\x3b\x28\xf2\x55\x0e\xf2\x60\x8b\x85\xef\x15\x69\x2f\x14\xf2\x73" - "\xe4\x7a\x10\x6d\xb5\x3a\x07\xf9\x97\xd5\xc1\xc4\x6a\x71\x6f\x99" - "\x88\xeb\x9c\x2c\x8b\x36\x22\x5b\xef\x19\xc2\x90\x07\x67\x40\xdd" - "\x33\xee\xdb\xd6\xce\xe4\x04\x37\x56\xf2\x38\xc2\x37\x33\x1c\x82" - "\xdd\xe3\xc2\xd1\xc4\x32\x0f\x7e\x42\x2e\x36\x9e\xcf\xe6\xeb\xe9" - "\x21\x96\x90\x53\x71\x9c\x04\xfa\x76\x88\xf6\x23\xd2\x1c\x36\xc2" - "\x1d\x2b\xe1\xcb\x01\x2b\xd1\x2e\xdd\x61\xc4\x5b\x3f\x57\xc2\x39" - "\xb0\x88\xdf\x13\xf6\x13\x91\xb7\x23\x3c\x6f\xe2\x1c\xcb\x6d\x17" - "\x2b\xb7\x60\x45\x39\x42\xb9\x4d\xda\x2d\xe4\x2b\x90\xcb\x5d\xed" - "\x35\xec\x84\xdc\x96\xbb\xf2\xc5\xa4\xe7\xb0\x3d\x28\xd2\x55\xe8" - "\xc1\x17\x15\xde\xf9\x22\x2c\x59\xe4\xb7\xd4\xa3\x6d\x94\x09\x7b" - "\xf7\x45\xb9\x1e\xce\xdb\xc4\xba\x86\x10\x86\xfc\x89\x71\x2b\xfb" - "\xa0\x62\x5e\xae\xa2\x2d\x4f\x7a\xaa\x6b\x3d\x4c\x8a\x52\xb6\x67" - "\xac\x6b\xe4\x04\xd4\x81\x75\xca\xec\x4a\x08\xe3\xf5\x3a\x49\x42" - "\x6e\x50\x72\x34\xc8\xe6\x3b\x29\xb6\x97\x49\x31\xee\x6d\x31\xac" - "\x48\xb4\x45\x11\x77\xb8\x0a\xea\x28\x46\x11\x6f\x99\x47\xbc\x58" - "\x37\x95\x6c\xfd\x19\x96\xc7\x49\x57\xe5\x3e\x0d\xe5\xe1\xde\x74" - "\xb8\xa7\xd6\xa3\x7f\x34\x62\xfa\x20\xae\xc5\x8c\xb3\x0e\x30\xae" - "\x48\x6f\xe1\xe9\xa9\x2b\x11\xfd\x04\x84\xc5\x88\xb0\x72\xd1\x97" - "\xc8\xb8\x59\xe8\x9e\xa6\xf0\x58\xef\xf6\x51\xd8\x62\xd9\x3e\x62" - "\xba\x18\x17\x85\xc7\x89\xfc\x61\x58\x34\x0f\x0b\x93\x30\x2c\x87" - "\x97\x43\x3e\x65\xfd\xd5\xc4\x72\xd1\x5f\x61\xfb\x52\xc3\xb9\x0e" - "\xdb\x18\x9e\x83\x0e\xa6\xdf\x9c\xd9\x8e\x63\x88\x42\x8b\xa4\x3f" - "\x86\x7c\x80\x7c\x81\xef\x1b\xb3\xe3\x22\x76\xfc\x18\x79\x07\xed" - "\x10\xbc\x0e\x72\x65\xc8\x45\x10\xfe\x35\xce\x35\x48\xbf\xf2\x07" - "\xbd\xe1\x17\xf9\xbd\x11\x43\x98\xad\xf0\x95\xc1\x4f\x0e\x93\xef" - "\x03\xde\x7a\x1b\xef\xc3\xfb\x65\xfe\x42\xee\x72\x20\x37\xb1\xf8" - "\x22\x12\x04\xc6\xd9\xb8\x41\xb6\x8b\xec\x6a\x85\x2c\xae\xcf\xc6" - "\x38\x2d\x22\x9f\xf3\x59\xc4\x8b\x78\x2f\xab\x3f\xe0\xca\x5d\x6d" - "\xf4\xd3\x92\x34\x22\x15\xdf\x40\x5e\xd4\x65\xf3\x74\x46\x58\x78" - "\x3e\x22\xde\x64\xf9\xe0\x9c\x6a\xe4\x69\xd1\x65\x17\xb7\xb3\x6b" - "\x67\x30\x2f\x78\x2d\x57\x71\x0d\xd7\x5b\x84\x6b\x6c\x6d\x3d\xcf" - "\xfb\x9c\xf6\xe4\x2e\xf2\x25\xed\x6c\xdc\x87\x36\x82\xe0\xde\xc9" - "\xcb\x78\x3a\x27\x8f\x93\x79\x17\xca\xe5\x08\x72\x2f\xbb\xb6\x5a" - "\xc8\x2c\x12\x47\xc6\xef\x93\x17\xf2\x72\xd5\xa9\x45\x79\x1f\xe3" - "\xf9\x98\xbc\x9c\x8d\xb3\xbf\x4a\x82\xb2\x9d\x3c\x57\x2e\x5b\xe5" - "\x6f\x6c\x3f\x10\xbf\x16\xcf\x19\xee\x77\xb0\x31\x6c\x11\xca\x60" - "\x9a\x78\x1f\x11\x11\xe7\x69\x53\x5f\x96\x22\x3f\xc4\x7e\x89\xdb" - "\xaa\x91\x7f\x10\xbe\x29\x62\x4a\xfb\x25\xf4\x0b\x53\x24\x99\x63" - "\x68\x8b\x81\xe0\xba\x4d\x97\xa5\x29\x43\x30\x0c\xd7\xdc\x52\xca" - "\x20\x3f\xfd\xae\xdd\x22\x74\x4e\xb6\xc8\xbc\x81\x5c\x72\xde\x76" - "\x49\xd8\x74\x53\x8c\xc5\x82\x4b\xae\x49\x53\xf6\xbb\xdb\x61\x53" - "\xf6\xbb\x73\x46\xe4\x1b\x9e\x9c\x01\x76\x73\x76\x4b\xde\x94\x95" - "\x6e\x76\x00\x84\xdd\x9c\x3b\xa6\xc4\x62\x1b\xc5\xf5\x5e\x19\x3f" - "\x31\x7f\xdb\x94\x36\x39\xcd\xc8\x9b\x4d\xdb\x65\xff\x45\x64\x01" - "\xda\x6a\x1e\xf1\x5d\x74\xe3\x4e\x8c\x4f\xd6\x07\x39\xc7\x76\x64" - "\x4a\x43\x7f\xcb\x94\x32\xc1\xf3\xa5\x6e\x5c\x29\xfa\x30\xe4\x49" - "\xf7\xbe\x4a\xf7\xa2\x7b\x5f\x15\xb9\xbb\x2b\x47\x46\x2e\xee\x79" - "\x5f\x15\x19\x89\xbc\x25\x73\xa4\x3b\x17\x44\x26\x16\xbb\xd9\xb2" - "\x53\xea\x64\x5b\xd6\xc5\xa3\x53\x52\x90\xa3\x20\xfe\x0a\x11\x37" - "\xf0\x44\x48\x8d\x1c\x37\x5c\x97\xce\xeb\x01\x9b\x79\xba\x58\xc0" - "\xd4\x51\x61\x03\xb2\xb6\xd9\x8e\xeb\xfb\x49\x11\xad\x80\xbf\x61" - "\x88\x33\xd3\xfa\x1b\xa4\xde\xd5\x57\x54\x36\x6d\x90\xcb\x77\xea" - "\x53\x4a\xbb\xf0\xf0\x01\xba\xa7\x25\x6f\xea\x6c\x65\x1e\x5f\x85" - "\xb0\x5c\xe1\x43\x60\x65\xcb\x74\x4d\x45\x7b\xc5\x2d\x6f\x3c\x1f" - "\x53\xe3\x30\x1f\x38\x26\x82\xf8\x1d\x68\xf7\xe0\x9a\xcf\x80\xc2" - "\xcc\x92\x4e\xcc\x8f\xb9\xd8\x96\xa5\xb4\xaf\x74\x75\xc8\x95\x62" - "\xec\x59\x05\xf6\x8e\x51\xe9\x8b\x59\xf8\xf0\x62\x7d\x6a\xda\x9a" - "\xf5\x9b\x56\xcf\xd2\xaf\x59\xbf\x66\xd3\x9a\xe5\x29\x6b\xb6\x2d" - "\xdf\xb4\x66\xc3\xfa\xa8\x75\xcb\x9f\x59\xf3\xb4\x7e\xeb\xf2\x8d" - "\xfa\x98\xf4\x88\xf4\x61\xc4\x25\xfa\x90\x7e\xf9\xc6\x8d\x9b\xd7" - "\xad\x5a\xa9\x5f\xbf\xe6\xe9\xe8\xb4\x55\x1b\x57\x6d\xd2\x2f\x4f" - "\xdb\xb0\x79\xfd\x4a\x7d\xc4\xca\xe9\x11\x31\xf7\xaf\x1c\xa6\xf4" - "\xa1\x85\x69\xc9\x15\xe7\x37\x0d\x0d\xb9\xdf\x10\x7f\x8d\x2a\x35" - "\x4d\x93\xbe\x66\x3d\xf7\xd9\xdd\xfb\xc6\x8c\x7c\x92\x0a\xd7\x03" - "\x4a\xf2\xb0\xac\xa7\x56\xc0\x51\x42\x39\xc8\xa7\x1e\x7e\xfb\x43" - "\xda\x43\x5b\xf2\xee\x4d\xb6\x48\xd3\x17\x63\x99\x41\x59\xe8\x21" - "\x6f\xa1\xf4\x9b\xaa\x06\xb0\xd9\x52\xf1\x3d\x83\x92\x6f\x48\x90" - "\x71\x0b\x91\x60\x0f\x80\x5d\xab\xd6\xa2\xaf\xeb\x5e\xe0\x82\x69" - "\x15\xdc\x27\x3a\x2d\xce\x3a\xe2\xd1\x8b\xd4\xf8\xe8\x45\x5e\x2f" - "\xd3\x1e\x94\x7d\xe1\x8f\xbd\x48\x1e\x43\x7c\x5e\x92\xa6\xb1\x67" - "\xd0\x2f\x00\x96\xd1\x17\xdc\x74\xf2\x47\xf1\x60\x0f\xd6\xa1\x3f" - "\x17\xae\x3d\x68\x53\x93\x00\x48\x97\x74\x7a\x47\x0c\x79\x0d\xe2" - "\xda\xa8\xa3\xb4\x25\x6f\x1a\x91\xfd\x69\x90\x07\x2d\xe4\xa5\x56" - "\xe4\xe3\x33\x96\x8f\x03\x34\x3c\x7f\x24\xa4\x2f\x0f\xd3\x33\x2d" - "\x4a\xce\x03\xa4\xbb\xd6\x22\xdd\x6b\x84\x74\x6a\x31\x5d\xde\x7c" - "\x7d\xe8\xef\x82\x74\x6e\x76\x6e\x81\x72\x1b\xcf\xd7\x8c\xcd\x2d" - "\xe6\xed\x0f\xf2\x73\xa4\x04\x7e\xe7\xdc\x20\x01\xaf\xa6\x91\x20" - "\x9a\x35\x81\x9e\xb3\x39\x88\x39\xb9\x96\x68\x9e\xa7\x56\xfa\x1f" - "\x0d\x0d\x22\x4f\xa5\xc8\x0d\xbf\x5f\x5b\x2b\x61\x9e\xa0\xaf\x08" - "\x28\xb9\xe1\xd3\xb7\x28\xbd\x16\x42\x6d\xf4\x90\xd2\xe6\x8a\xba" - "\x1b\xcb\x04\xed\xad\x26\xe8\xa7\x20\x0f\x56\x88\xdb\x20\x6c\x63" - "\x1b\xb5\x2f\x55\xd8\x52\xd3\x10\x67\x36\x1f\xba\xfd\x65\xdd\x54" - "\xcd\xd6\x5a\x16\x3e\xdb\xa8\xcd\x70\x8f\xd5\xa5\x3f\x6a\xb1\xa7" - "\x7e\xd4\x09\xbf\xad\x72\x3c\x7c\x1c\x1e\x85\x36\x81\x15\xb0\x6c" - "\xf5\x11\x5f\x78\xde\x01\x7a\xd1\x0c\xe1\xb9\x6d\x04\x6d\x05\xe8" - "\x9f\x99\xfe\xa3\x50\xee\x41\xa8\xff\x85\x10\x42\xb2\x41\xa6\x29" - "\x6f\x9a\x01\xfd\xbb\x70\x0d\xda\xbf\x2e\xde\xd3\x67\x2d\xf0\xfc" - "\x90\x07\x9e\xe3\xf3\xd0\x26\xcc\x07\xfd\x80\xa1\xdc\x66\x82\xf6" - "\x5a\xf5\xf4\x7c\x12\x89\xf1\xc0\xef\x1a\xf4\x87\xb4\xe4\x45\xeb" - "\xe5\xf8\x28\xe0\x3f\xc7\xc9\x7d\x30\x02\x5b\x51\xe6\xf4\x06\x9c" - "\x33\x8c\x9e\x06\x7e\xc7\x34\x22\xc6\xe0\x9e\x44\x19\x53\x80\xf5" - "\x8b\x0c\x57\x41\x24\x92\xe6\x45\xd5\x96\x8c\x04\x39\xc0\x55\x31" - "\xe0\x09\x71\x05\xb2\x99\x32\xa6\x00\x6b\x35\x28\x07\x69\x18\x76" - "\x74\x5b\xbc\x84\x1c\x59\x2f\x45\x37\x23\xc6\xe8\x3f\x3f\x5a\x4b" - "\x47\xfd\xb4\x96\xd7\x53\x74\xb3\xb9\x95\xd7\x81\xab\xdc\xa3\xab" - "\x14\xe5\x5e\x03\x38\x1e\x86\xe5\xcc\x7d\xd5\xd1\xcd\x90\xb6\x1a" - "\x66\x8b\xef\x84\x3a\x60\x7d\x55\xf4\x31\xbc\x5f\x94\x61\xb5\xab" - "\x0c\xa7\x6b\xbd\x95\xa1\x47\xd9\x49\xb8\xd3\xbc\xe9\xa1\xd8\x56" - "\xe0\x9e\xb9\x16\x29\xaa\xde\xd7\xb3\x02\x88\x43\x92\xf2\x89\x3f" - "\xc6\x51\x19\xc4\xe4\x37\x79\x8b\xc3\x13\xc7\x95\xa5\x84\xa0\x2f" - "\x1c\xef\x0b\x0f\xc2\x72\x9d\x7e\xc4\x6b\xfd\x3e\xed\x96\x36\xb6" - "\x43\xda\x2a\x5e\x1b\x09\xb8\xe1\xe9\xab\xbf\x59\xfa\xc2\xf5\xbc" - "\x5f\x34\x85\x21\x9e\x67\x8c\x33\xc3\xe8\x16\xc3\xc4\x79\x40\x13" - "\xf4\x35\x9e\xfe\x7c\xdf\xcf\x17\x66\x3c\xe5\xfe\x7c\x61\xc6\x02" - "\x5f\xcf\x17\x3c\xe2\x3d\x88\xf1\x3a\x4b\x12\x55\x8a\xb8\xb3\x9d" - "\x5e\xe2\x96\xef\x9f\x5e\xaa\x1c\xbf\xcc\xf8\x12\xd3\x70\x1e\xfa" - "\x25\x3a\x36\x51\x45\x41\x4f\x25\xeb\xb3\x67\x34\x70\x7b\x05\xed" - "\xa0\x19\x55\x28\xe3\x99\x8f\xce\xcd\x3f\xe8\x14\x1e\xda\xd8\xc9" - "\x90\x1f\x13\x7c\xa3\x93\x8c\x29\x95\x2f\xab\xdd\x84\x09\xf5\x72" - "\x12\x40\xc8\x58\x26\x4f\x61\xe3\x41\xe2\xdc\xca\x4e\xa4\x4e\xf9" - "\xce\xeb\xfd\xd8\xee\xe6\xe9\x65\xfa\x5a\x89\x4a\xc4\x67\x52\x48" - "\xcc\xbd\xc9\xdd\x94\xc8\xb7\x78\xdb\x9e\x83\x3d\x33\x11\xec\xc6" - "\xb1\x16\x26\x4c\xa9\x43\xe8\x97\xcf\xa9\xf2\x1c\x43\xdc\xcf\x61" - "\xf3\x5b\xaa\x88\x60\x82\xdf\x4a\xf6\x9a\xd8\x78\x47\x67\x90\xba" - "\x54\xeb\x1e\x69\xe6\x10\x76\xd0\xe0\x9f\x74\xd0\x17\x09\xd7\x43" - "\x5d\x97\xfd\x6c\xbb\x15\xc2\xef\xf1\xe4\x8f\x8b\xf5\x9d\x89\x5e" - "\x6f\xe3\x15\xbf\x27\xf0\x43\x68\xab\x57\xc9\x5b\xb1\xe9\x6b\xee" - "\x96\x7f\xba\xe0\x31\x6e\x87\x37\x51\x57\xf9\x8f\xab\x93\x83\x94" - "\xf5\xe9\xba\x3e\x31\xc9\xfd\x7c\x92\xd6\xfd\x3c\xc2\x30\x10\x49" - "\x37\xe1\x9f\x0c\xcb\x08\x60\x8e\xa0\xce\x40\x8d\x47\x93\xd1\x18" - "\x3d\x9a\x90\x6b\x13\xa9\xf1\x83\xf4\x14\x29\x82\x25\xef\xd2\xb7" - "\x66\x1b\xb3\x5b\x14\xe0\x04\xab\xb6\xcb\x45\xcf\x30\x3c\x1f\xaa" - "\x17\x61\x33\x4f\x75\x91\x67\x61\x7a\xc5\xb9\x2a\x1e\xfe\x94\xc2" - "\x8d\x7b\x06\x22\xad\x77\xb6\xef\xe0\xa6\xc2\xf6\x71\x67\xbb\x45" - "\x1b\xe5\xbd\x38\x30\x11\x3b\xe0\x3f\xda\x49\x94\x54\x5c\xa0\x22" - "\x80\x8a\x1f\x03\xd2\x8f\xdf\xd9\xee\x6c\x77\xb6\x3b\xdb\x9d\xed" - "\xce\x76\x67\xbb\x0d\x36\x95\x72\x60\xed\x0f\xfb\x5d\xe2\xa8\x1c" - "\xff\xa8\xc4\xae\x0c\x53\xf7\xe7\x3e\x2a\x36\x92\x19\x6f\xd2\x97" - "\x2e\xb3\x68\x8d\x8b\x6b\x62\x8e\xa6\x5a\xfd\xf7\x18\xaa\x22\xcb" - "\x93\x1b\x74\x85\x49\xb5\xb1\x15\xe9\xad\x52\xf6\xdc\xca\xf0\xb2" - "\x95\xf5\x41\xf9\x89\x17\x67\x1f\xdb\x64\x0b\xd8\xb7\xa0\x3a\xea" - "\x48\xca\x95\xd0\xa2\xa5\x75\x71\xc7\x77\x38\xd4\x59\x3f\xfa\x63" - "\xd8\x2f\x57\x5c\x1a\x99\xf7\x0f\x7f\x9e\xf5\xef\x69\x37\x86\xbd" - "\x3c\xff\xec\xbd\xff\xba\xb6\x71\xcc\xeb\x4b\x3e\x7a\xe8\xff\x6d" - "\x6b\x1f\xfa\xd2\x8f\xff\x73\xf2\xbf\xac\xbe\x1c\x72\xe0\x89\xbf" - "\xdc\xff\x1f\x5b\xbe\x09\xcc\x59\x74\x7e\xfa\x6f\xd7\x5f\x1b\x5f" - "\xfc\xb3\x4f\x7e\x70\x72\x97\x53\xb5\xfb\x87\xa7\x26\xfe\x62\xf9" - "\xa7\x23\xf6\xff\xe4\xc2\xcc\x7f\x7b\xee\xeb\xbb\xf7\x26\xbc\x3b" - "\xf5\xcd\x35\x5f\x8e\x3e\xf8\xe4\x87\x0f\xfe\xe1\xf9\xb6\x21\x2f" - "\x3e\x72\x26\xe2\x8d\x55\x9f\x07\x17\x3c\xfe\xc1\x9c\xb7\x37\x37" - "\x0f\x7f\x75\xe1\xb9\xe8\xb7\xd6\x5d\x1d\x77\xf8\xa9\x8f\xbf\x7f" - "\x62\x67\x87\xdf\x0b\x0f\x9f\x9e\xf4\xab\xa7\x3f\xbb\xe7\xb5\x7f" - "\x7c\xff\xbe\xdf\x6f\x6c\xfa\xde\x2b\x8f\xbe\x37\xed\x37\xcf\x7e" - "\x35\xf6\xd0\x4f\xff\xf6\xbf\xfe\xff\x76\xfb\x5d\xff\x67\xde\x9f" - "\xa6\xfc\xfa\x99\x2f\x46\xfd\xf3\x3f\xfd\xf5\x81\xff\xbb\xb5\x45" - "\x93\xfb\x98\x79\xc6\xef\x36\x5c\x9f\x50\xf2\xf3\xbf\xff\xef\x77" - "\x32\x68\x7f\xca\x8f\x48\x19\xaf\x0d\x76\xbd\xf1\xc3\xee\xcc\xbe" - "\xdc\x4f\x45\xad\xf3\xd3\xcc\x39\x44\xe5\x4f\x86\x4a\x7d\x1a\x27" - "\xf4\x35\xbf\x3e\x36\xbd\xf2\xfe\xee\x36\xfc\x1e\x6f\x26\xec\xf7" - "\xc1\x3e\x96\x85\xb8\x46\xfe\xe3\xbd\xde\x31\x18\x9b\x0a\xf2\xe9" - "\x07\x29\x19\x42\x86\x42\xc9\xf8\x93\xbb\xc9\x30\xf2\x3d\x12\x40" - "\x86\x93\x40\xa2\x21\x5a\x32\x82\x8c\x24\xf7\x90\x20\x12\x4c\x42" - "\xc8\x28\xa2\x23\xa3\xc9\x18\x48\x7d\x28\x19\xe7\x3d\xcd\x99\x24" - "\x5e\x07\x7f\xe0\xff\x62\x12\xcf\xce\x97\xdd\x09\x1f\xd4\x70\x93" - "\x08\xaf\x11\xe1\x96\x3b\xe1\x83\x1a\xae\xff\x6f\x3e\x4e\xfc\x6f" - "\x3d\xaa\xc0\x2c\xe0\x96\x81\x9b\x7d\xd0\xb9\x79\x86\xaa\xc4\xd6" - "\x79\x4e\xba\xb9\xbf\x8b\x3e\xf7\xfb\x3d\xb7\x78\xd8\x67\xf3\x9f" - "\x19\x84\xf0\x67\x09\x54\xb9\x39\x7c\xdd\x29\x6f\x85\xe9\xb0\x67" - "\xc3\x6e\x84\x1d\xfa\xcd\xc2\x12\xd8\xdf\x94\xf5\x10\x62\x6d\x25" - "\xe4\x06\x70\xfb\xd7\xf9\x70\xac\x26\xa4\x69\x19\x21\xcd\x16\x42" - "\x6c\xa5\x84\xb4\xe8\x15\x09\x0f\x70\xa5\xa8\x43\xc4\x0a\x97\x55" - "\xea\x7c\x45\x64\xbd\xed\x9f\x2a\x1e\x49\x34\xe8\x67\x4e\x9f\x3d" - "\x7d\xf6\x7d\xfa\xe8\xc5\xd1\xfa\x59\x31\x31\x0f\xce\x88\x99\x33" - "\x63\xd6\xfd\xfa\x59\xf7\x3d\x34\xe7\xfe\x87\x66\xc5\xea\xd7\x3d" - "\x9f\xb6\x66\x66\xcc\x33\xab\xf4\xeb\x57\xae\xd9\xa8\x5f\xbd\x26" - "\x6d\xdd\xd6\xe5\x69\xab\xba\xcb\x76\x6f\x37\xc8\x0a\x19\xd7\xc1" - "\x93\xa9\xac\x0d\x15\xf4\x22\x52\x6c\x2c\x91\x1e\xad\x25\x9d\x57" - "\x54\x46\x91\x95\x48\xb1\x77\xd9\xd6\x2d\x79\xe2\xa3\x88\x9f\x06" - "\xfe\xf1\x87\xcf\x44\x7c\xff\xe1\x5f\xe5\x1e\x25\xea\x78\x3d\x51" - "\x3f\x50\x4d\xd4\xd1\xf9\x44\x3d\xb1\x92\xa8\x83\x96\x12\xf5\xf6" - "\x18\xa2\x4e\x83\xb0\xe4\x6c\xa2\x5e\x5a\x46\xd4\x8f\x45\x75\x0d" - "\x7b\x79\x31\x0f\x3b\x61\x24\xea\xdf\x47\x12\xf5\xaf\x41\xe6\x60" - "\x3a\x0f\x7b\xbf\x9e\xa8\xdf\x4d\x1e\xe8\xa2\x18\x80\xad\xb7\x38" - "\x50\xfd\x17\x1e\xf8\x64\x82" +static unsigned int rss_ethp_z8e_uncompressed_length = 563036 ; +static unsigned int rss_ethp_z8e_length = 155375 ; +static unsigned char rss_ethp_z8e[155375 + 1] = + "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xb5\x37\xbc\x32\x19\x20\x62\x64" + "\x26\x31\xd2\x29\x52\x39\xfc\x50\xa3\x97\x1f\x83\x22\x05\x0b\x1a" + "\x04\x2c\xb6\x01\xa2\xa0\x8d\x8a\x06\x14\x68\x90\x80\x01\x02\x04" + "\x08\x99\x61\xc0\x2b\x2a\x3f\x26\x01\x25\x42\x20\xb1\xd2\xa7\x68" + "\x51\x63\x8b\x2d\x78\x51\xc7\x92\xbe\x1f\x7a\x2f\xc9\xe4\xf6\xc5" + "\xf7\xe5\xf6\xc5\xeb\xc8\x13\x69\xca\x13\x60\x24\x03\x19\xc9\xcc" + "\xd9\xcf\x77\xed\x7d\x4e\x32\x33\x4c\x50\x6e\xef\xe7\x79\xff\x29" + "\x9f\x4f\x98\x73\xf6\x8f\xb5\xd7\x5e\x7b\xad\xb5\xd7\xde\x7b\xed" + "\x75\x88\xfe\x8e\x7f\xd6\xd1\xb5\x7f\x4f\xf5\x7f\xfc\xfb\xc7\xbf" + "\x7f\xfc\xfb\xc7\xbf\x7f\xfc\xfb\xc7\xbf\x7f\xfc\xfb\xff\xe7\xdf" + "\x05\x8b\x95\xfe\xe0\x25\x6a\xf7\xa4\x39\x02\xf4\x8d\xb6\x63\x9b" + "\x88\x20\x39\x25\x40\x69\x0e\xfe\x35\xfe\xa8\x12\xe9\x16\x2f\xa5" + "\x0d\xb2\x53\xfa\xc4\xdd\x44\xdb\xfb\x8a\xd6\x6d\xaf\x89\xe0\xfa" + "\xd7\x44\xeb\xa4\x5f\x12\xd5\x0f\x21\xda\xd6\x57\x84\x00\x67\x56" + "\x80\x9e\xde\xce\x70\xd6\xe3\x9d\xf3\x37\xf4\x15\x41\xa4\x97\x04" + "\xa8\x20\x9d\xd3\xd7\xf5\x05\xac\x2c\x22\xcf\x6b\x22\x1c\x03\x37" + "\x8d\xeb\x33\xcc\x49\x03\x25\x3e\x7b\x13\xe0\x30\x8c\x83\x80\xb1" + "\xe1\x2a\x30\xd2\x4d\xbc\x42\x16\x4a\x61\x78\x6d\x1e\x72\x84\x3c" + "\xbe\x9b\x50\x37\x84\x3e\x65\x73\xdd\xad\x28\x23\x3c\x94\x5a\x5f" + "\x1a\x21\x6d\x10\xa5\x9c\xa6\xde\x6f\xe0\xd7\x82\xdf\x57\xb9\xbf" + "\xeb\x55\xbd\x21\x0c\x03\x75\x53\xda\x3d\xd7\x39\x3b\xeb\x02\xb6" + "\x56\x4e\x56\x94\x5d\x10\xb2\xf8\x2c\xaa\xac\xfd\x3a\xa3\xac\x05" + "\x65\x67\x99\x65\x55\x9e\xe5\x21\x23\xef\x7a\xe4\x95\xc6\xe7\x59" + "\x2b\x8d\xbc\x74\xe4\x6d\x4f\xc0\xcf\xea\xbf\x1c\xa1\xd3\x74\xdd" + "\x7e\xe0\xa2\x1d\xc1\xa8\x70\x1d\xa3\x7c\x06\xca\xd7\xc7\xc3\x22" + "\x32\xf2\x32\x91\x17\x88\xcf\xfb\xd8\x69\xe4\x7d\x0f\x79\x91\xf8" + "\xbc\x14\xb3\x9e\xa3\xdd\xd3\xdb\x91\xa4\x9f\xdc\x7e\x8a\x6a\x9b" + "\xfb\xd0\x7b\x1c\xca\xb8\xb9\xcc\x4c\xcd\x4d\x3c\x56\x9c\x77\xa4" + "\xb6\xb3\x7d\x2e\x33\xdb\x84\x13\x40\xfd\x18\x9a\x82\x96\xbd\xcb" + "\xcc\xfa\x93\x34\x86\x41\x92\x86\x0c\x27\x40\xd7\x4d\x61\x38\xfc" + "\x8e\xe7\xfe\xdc\x6f\xe3\x59\xe3\xfe\xc5\x8e\x39\x8c\x4f\x80\xed" + "\x91\x46\xd4\x13\x7f\xbd\xd2\x4c\x1e\x58\xe6\x10\xba\xeb\xfb\x64" + "\x15\x95\x03\x0a\x75\x8f\x20\x7f\x69\x98\xb4\x7e\xe4\x3a\x45\xd7" + "\x3b\x80\x1f\x6d\x59\x4d\x69\xae\x62\x11\xf6\x97\xb6\x52\x63\xb0" + "\x95\x5c\x41\xd1\xe2\x8f\x5c\xa4\xf2\x8b\x94\xe6\x8f\x9c\xa5\xf2" + "\x25\xe4\xa8\x2f\xfb\x8a\x92\xf1\x97\x6e\x11\xe4\xea\xcf\x75\x9b" + "\xa9\xb1\xba\x99\x5c\xd5\xf1\x75\x5d\x3f\x20\x47\x03\xde\x31\x76" + "\x36\xc6\xa3\x5e\x8b\x50\x24\x73\x40\x61\xd9\xeb\x64\x75\x0d\x24" + "\x4b\xc3\x5c\x9f\x89\x4b\x80\x71\xd9\x70\x86\xd2\xde\x9c\x0f\x1e" + "\x3a\xc3\xf8\xde\x5e\xf8\xde\xea\xb0\xe5\x88\x23\x97\x8e\x38\x4e" + "\x52\xbd\x63\x3c\xd5\x97\x4e\xa2\x2d\x67\x28\xfd\x48\x78\x1c\xd5" + "\x5b\x1f\x84\x8c\x4d\x22\x7f\x2b\x9e\xb5\x28\xca\x84\x48\x5b\x41" + "\xe0\x8f\xeb\x9b\xb6\x3f\x47\x69\x01\x05\x13\xf4\xbd\xfe\xe4\xa7" + "\x25\x44\x4c\x5f\x7e\x4f\xd6\x8f\x65\xdf\x27\x07\xf0\x6b\x01\x2e" + "\x63\x4f\x51\xfa\x4d\x43\x1c\xe4\x04\xce\xbd\xfc\x55\x11\xb2\x96" + "\xd1\x75\xdd\xc8\x56\x96\xee\x91\x32\xde\xba\xe7\x35\xd1\xc2\x3c" + "\xda\xb6\x26\x1f\x72\x9a\x9e\x8b\xb6\x5b\xb9\xbd\x2d\x90\x75\xd7" + "\x1b\x64\x6d\x5b\x99\x9f\x52\xf3\x9a\x68\x46\x5e\xa1\x99\x07\x7e" + "\x6a\x46\x7e\xcb\x88\x2c\xb2\xfb\x23\x39\xf4\xc9\xe5\x16\x2b\xc3" + "\xe8\x13\xa2\x14\x86\x67\x2b\xa5\x54\xf4\xa7\x07\xf0\x19\x5b\x83" + "\xf4\xc1\x28\x87\xfa\xfb\x02\x54\x31\x9b\xeb\x8b\xef\x3d\x19\xd2" + "\xbf\xf7\xe4\x45\x7d\xc7\x93\x6d\x62\xc7\x93\x17\xa2\x3b\x9e\xfc" + "\xda\xb5\x8a\xd2\xa2\xdf\x7b\x32\xd8\x58\x2c\xc7\xc0\xde\x58\x8c" + "\x31\x88\x52\xda\xda\xb3\x64\x7f\x7a\x09\xc6\x3e\xf2\x39\xad\x5d" + "\x40\x0e\x3d\xe3\x36\xcd\x1f\xf9\x8c\x9e\x2e\x23\x81\x67\x67\xb2" + "\xfe\xb5\x65\xde\xbe\x4f\xc9\x50\x1a\xfa\x74\x83\x16\xb0\xde\x22" + "\xdb\x0d\x66\x8c\xd8\x87\xbf\xfd\xf8\xab\xc3\xdf\x01\x91\x79\xfb" + "\x01\xd0\xca\xd5\x67\x5d\x0a\xed\xb9\x4c\x34\x42\xa7\x94\x33\x74" + "\xc3\x38\xe0\x6f\xef\x86\x6e\xfd\xf5\xca\x85\x79\xb7\xbb\xa9\xbc" + "\xbd\xbd\x90\x58\x37\xb1\x5e\x62\x3d\x85\x76\x36\xa2\x9d\x5a\x29" + "\x8b\xaf\x89\x90\xc8\x5c\x98\x87\xf4\x96\xd0\x9a\xc2\x94\xe0\x9a" + "\x42\x4b\x5b\xe6\xc2\x19\x28\xb3\x1f\x65\x4e\x18\x34\x6c\x61\x58" + "\x90\x89\xe0\x0d\x11\x4a\x05\xcc\xe2\xdf\x5f\x3a\x61\xdd\xfd\x9a" + "\x38\x89\x72\xc7\x3b\x61\x01\x36\xe0\x80\xfe\x37\xb4\x98\x69\xa0" + "\x75\xf3\x66\x94\xe3\xfa\xfe\x70\x0e\xeb\xef\x80\xbf\xa8\x85\x6c" + "\x11\xea\x2d\x3a\x54\x7b\x28\xd3\xc2\x7a\xf6\x86\x30\xf5\x6c\xf7" + "\x50\x1e\xc3\xe6\x7a\xfe\xd6\x16\x42\xbd\x19\xc2\x55\x08\xfd\x46" + "\xd3\xda\x45\x61\x0a\x74\x7a\xf3\x11\xd4\x57\x6d\xf7\xc9\x33\x71" + "\xe4\x36\x78\xac\x25\x9e\xe0\x87\x23\x45\x61\xba\xa1\x8a\x52\x51" + "\x6f\x06\xc3\x63\x58\xe0\x83\x00\xfa\x3a\xe3\x48\x51\x90\x74\x11" + "\x07\x33\x60\xc0\xab\x8d\x83\x87\x74\x01\x78\xcc\x7f\xf5\xa8\x73" + "\x43\xad\x84\xf7\xc8\xef\x75\x86\x17\x26\xab\x26\xf1\x7d\x8c\x61" + "\xb4\xb3\x8e\x01\x4c\xdf\x8a\x07\xa8\x95\x6c\x69\x41\x57\x61\x6a" + "\x63\x19\x11\xd7\x7f\xaf\xbc\xa5\x87\x68\xcb\x4f\x65\x9e\xe3\x7c" + "\x7f\xe4\x02\xca\xf4\xf9\x9b\x68\x2b\x4c\xbd\xa1\x95\xac\x8c\x33" + "\xea\x97\x32\x9e\xb1\x63\xf9\xc8\xe4\xc7\xc6\xd3\x63\x93\x1e\x9a" + "\x34\x9e\xa6\x4e\x98\x38\x9e\x9c\x63\x87\x39\xef\xfe\xe1\x98\xbb" + "\x29\xef\x67\x8f\x8c\xa7\xbc\x69\xe3\x69\x06\xfe\xf2\x66\x4c\x7e" + "\x64\xd2\xe4\x19\xe3\x29\xff\xc1\x87\xf0\x36\x71\xfc\x48\xe7\x8f" + "\x87\xe5\x4d\x7c\x68\x32\x3d\x3c\xf3\x2e\xe7\x5d\x77\xd1\x84\xc9" + "\xb9\x23\x9d\x4e\xe3\x77\xa4\x93\x8b\x3c\x31\x66\xf2\x8c\x61\x79" + "\x4b\x9f\x2f\x79\x7e\xd8\xb4\x87\x26\x26\xcc\xb3\xd9\xd1\x4b\x3a" + "\xd3\x37\x24\xce\x4f\x21\x1d\xfa\x62\x0f\xc6\x1d\x7f\xad\xbe\xf2" + "\x53\x90\x7b\xfb\xbf\xef\xe1\xf1\x92\x7a\xd5\xc6\x73\x95\xb5\xdd" + "\x63\x3b\x11\xb0\x0e\x70\x30\xdd\x30\x9f\xa1\xcc\x4d\x17\x91\x77" + "\x87\x31\x6f\xf4\x40\x7e\x38\x3e\x3f\xe3\x18\xf2\x47\x34\x6a\x44" + "\x7e\xfc\x81\xd6\x21\xe8\x3f\xd0\x34\x48\x6d\xae\xfc\x1e\xe0\xe9" + "\x14\xb4\xd1\x0c\x79\x6c\x6a\xf7\xd8\x47\xc5\xc8\x79\x33\xc6\xa4" + "\x49\x5b\x4d\xa9\xe7\xc8\x7e\x43\x63\x49\x0e\xf1\xd8\xf8\x4b\x0c" + "\x18\x17\x3b\x61\xf4\x96\x30\x30\xde\x80\x73\xdc\x80\x53\x16\xa3" + "\x13\x02\x0c\x67\x0b\xf2\x0c\x58\x0f\x37\x42\x37\x40\x77\x2f\xd5" + "\x5d\xd9\x24\x32\x07\x14\xeb\x1d\xd9\x72\x3e\x40\xbd\x03\x26\x2f" + "\xa3\x7c\xa8\xbe\x18\xe5\xde\x9c\x92\x82\xb1\x4f\xc1\x3c\x85\xbe" + "\xd8\x7c\xe0\xe9\x90\x5e\x39\xe2\xa0\x68\xcf\x27\x95\x96\x01\x18" + "\x78\xaf\x1c\x71\x48\xb8\x90\xb6\x5a\xa6\xa5\x70\x1a\xc6\x39\x95" + "\xe5\x51\xac\x91\xe9\xa9\x48\x5f\x0e\xfc\x4e\x44\xb9\xfe\x79\x59" + "\xbf\x17\xd2\x1e\x45\xd9\x43\x7a\xe6\x88\x0f\xc1\x37\x9c\x06\x1b" + "\xa1\x6f\x16\xe0\xfd\x8b\x2e\xf2\x49\xd8\xf7\x4f\xc1\xf3\x61\xdf" + "\xea\x56\x3a\x5d\x4c\x96\x00\xf2\x74\x17\x60\x76\x74\xb6\x3f\x84" + "\xeb\xa2\x2d\x6b\x7b\x47\x21\xe6\xb7\x8c\x6c\x9e\x0b\xa3\x8c\xcf" + "\xf9\xce\x32\x59\xdc\x26\xcb\x34\xc6\x62\x14\xc6\xe9\xba\x76\x4f" + "\x46\x6d\xc2\x38\x1d\x04\x9c\x43\xa0\xfb\x09\xc0\xb0\xeb\x6d\x85" + "\xdc\xaf\x43\x80\x6b\x31\xe0\x9a\x30\x42\x8a\x0f\x32\x02\x09\x7c" + "\xf0\x1f\x80\x3d\xbe\x2b\x3f\x93\x12\xf2\x3f\x42\xfe\x03\x46\x3e" + "\x64\x2b\x53\x8b\xcf\xcf\x1c\x87\xfc\x07\xd1\x7e\x08\xb2\x93\x1a" + "\x20\xfb\xde\x3d\x6c\xfb\x75\x95\xcf\x4b\x28\x5f\x84\xf2\x3f\xc1" + "\xd8\x86\x58\xaf\x73\xf9\x1a\x83\x57\x51\x3e\x0d\xe5\xdd\x09\xed" + "\xef\x46\xf9\x19\x31\xf8\x25\xf4\xff\xc6\x42\xe4\xe7\x33\x6f\xe1" + "\x77\x2e\xca\xf4\x62\x79\x65\x5d\x71\xa4\x88\x6d\xc5\xcc\xa6\x84" + "\xf6\x99\x96\x0b\x75\x93\x46\x6d\x4c\x23\xfb\x5e\xc3\x0e\x39\xa9" + "\x70\xb8\xd1\x9a\xd0\xc6\x10\xd4\x59\x06\xfe\x39\x64\xf2\x46\x92" + "\x3a\x63\x12\xea\xe4\x4b\xde\x52\xed\x18\x63\xac\xea\x18\x7a\x28" + "\x16\x06\xf7\x0d\xb6\xd1\x8d\x65\x09\x7d\xcf\x47\xbb\x6b\x36\x2b" + "\x39\xbf\x1e\x3c\x71\x17\xd2\x1e\x02\xcc\x8f\x98\x8f\x98\xd7\xfd" + "\xc1\x30\xf4\xe4\x94\x74\x35\xdf\xdf\xf8\xb9\xad\x8c\xf8\x79\x18" + "\x3f\x33\x6c\xd1\x91\x6b\xc8\xc0\x8d\x9f\xe3\x97\xd3\xeb\x39\x9d" + "\x65\x4f\x74\xfc\x54\x57\x30\xb3\x52\x20\xa3\x16\xbc\x47\x8d\x36" + "\x26\xe0\x3d\x05\xf8\x7f\x08\x1d\x0c\x9e\x9d\xc2\xfc\x38\x0a\xe9" + "\x63\x8d\xfc\x91\x5c\x1e\xcf\x23\x8d\x67\xe6\xdb\x0f\x0d\xbe\x85" + "\x1c\xdc\x74\x87\x6c\x5b\xca\x82\xaa\xaf\x2b\xbe\x9f\x88\xbc\x9b" + "\xf0\xfb\x10\x7e\x19\xaf\x87\xd1\xf6\xe7\xae\x8b\xe4\x70\x45\x61" + "\x73\xa8\xf7\x3f\xe1\xf7\x11\xfc\x7e\x80\xdf\x19\xf8\x7d\x83\xe5" + "\x36\xb8\xb2\x90\x12\x78\xa6\x55\x57\xb2\xda\x4b\x8d\x61\x96\xd7" + "\x90\x1f\x25\xbf\xe7\xbb\xd2\x84\x4a\xb3\x28\x9a\x1b\x69\x1d\x53" + "\xb8\xfd\x3c\xc0\x2f\xe2\xf6\x0d\xb9\xef\xa1\xc6\x49\x95\xd1\x55" + "\x3d\xab\x1a\x6f\x23\x4d\x95\x4b\x89\x6d\x13\xbf\x39\xe5\x21\x21" + "\xf0\x3b\x94\xe9\x1a\xa0\x9b\x9c\xa0\x89\x15\xef\xac\xfb\x2c\xb2" + "\xbc\x84\x7b\x63\x75\xcc\x78\xc3\x16\xbf\xa9\x28\x7e\xbc\xed\x7b" + "\x99\x66\x3c\xde\x26\xbe\x8c\x3b\xf8\x99\xe7\xb4\x9e\x26\xcf\x80" + "\xb7\x5b\xa1\x1f\x43\xa9\x65\xcc\x77\x37\xd5\x05\xe8\x6d\xaf\xb4" + "\x83\x2a\x47\x7c\xcc\xf9\x21\xe8\x19\xe6\x8d\xd4\x62\x96\x97\x9b" + "\x9a\xcc\x7c\x99\x97\xb1\xb0\x89\xe1\xa7\x16\xc9\xbc\xd6\x00\xd8" + "\xc5\xcc\x63\xdc\x58\x8e\x53\x4b\x38\xaf\x6f\x5a\x17\xdc\x01\x5e" + "\x03\x6e\x2a\xdb\x0f\x6c\x07\x60\x3e\x6e\x41\x99\xa1\x01\xba\x21" + "\xbf\xbb\x35\x97\xf0\x0e\x70\x0f\x23\xb2\xdc\xe9\xa6\x1e\xfe\xc8" + "\x71\x9a\x1e\x11\xd1\x61\x6e\xba\xce\x1f\xd9\x4f\x60\x90\x0c\x7f" + "\xe4\x24\xdd\x49\x34\xd0\x1f\xd9\x8e\xf9\x76\x2f\xe7\x7f\x92\x4d" + "\x29\x29\xf8\x75\xdd\xe6\xb6\xa4\xf8\x23\x1b\x68\x88\xdb\x8a\xdf" + "\x22\x7a\xb0\x87\x68\xf7\x47\x72\x51\x6e\x2e\x4d\x8f\x8a\xf3\x93" + "\x7a\x88\x2f\x0a\xa2\x64\xcf\x7d\x41\xb8\xfc\x11\xd8\xbe\x91\x63" + "\x48\xd7\xc5\xf4\xe8\x37\xf8\x6b\x17\xba\x77\x80\x77\x7a\xf4\xbc" + "\x98\xf8\xc2\x27\x78\xff\x42\x08\x0b\x09\x7f\x64\x1c\x35\x86\x42" + "\x28\xe7\x12\xa2\x62\x80\xfb\xe9\x8b\x16\xea\xc0\xdc\xa9\x57\x0c" + "\xf0\xa2\x8f\xb5\x1d\xe8\x1f\xe6\x95\x9a\x8e\x35\xf8\xad\x1c\xb0" + "\x47\xbe\x7b\x07\xd4\x09\xfb\x80\xda\xe1\x58\x48\x70\x1f\xfc\x91" + "\x66\x2a\x80\x29\x3c\x7d\x55\x50\x30\xfe\x7d\xd6\xf1\x3a\x62\x1c" + "\x41\xf7\xd9\xa6\xaf\x72\x09\xe4\xa5\x89\x8c\x01\xb5\xfe\x48\x2b" + "\xa1\x8d\x3a\xc0\x7b\x47\xc2\xf3\x0e\x68\x42\xd9\x20\x97\x8b\x85" + "\xc3\x30\xb8\xec\xf4\x28\xd9\x50\xbe\xa9\x23\x63\x80\x0f\x7f\x81" + "\x8e\x0c\xcd\x2e\x32\xb5\x41\xc2\x93\xf5\xa9\xc0\x3c\x27\xbc\x9a" + "\x13\xef\x39\xed\xb0\xdb\x25\x2d\xa3\xd4\x4b\x54\x68\x4e\xf0\xc5" + "\x24\xf0\x16\xf0\xd5\x66\x4b\x7c\x2b\xb5\x82\x76\xd9\x0f\xed\x69" + "\xd5\x0f\xed\x29\x4e\x6f\xc3\x1c\x8f\x67\x77\x9b\xca\x73\xa1\xde" + "\x4c\x59\xcf\xab\xb9\x85\x5d\xf3\x86\x21\x33\xa0\xab\x9b\xe9\x08" + "\xba\xba\x99\x96\x80\xef\xf6\x97\x6e\x22\x91\xa1\x79\x81\x4f\x2d" + "\xea\xff\xa6\x43\xce\xbd\x9a\xaf\x5d\xc1\xfe\x04\x70\x66\x81\x2f" + "\x53\x01\xc3\x07\x58\x4d\x1d\x1e\x8d\xa6\xaf\x12\xe1\xe9\x91\x75" + "\x91\x82\x55\x94\x3a\x94\xdc\xc0\xf7\x23\xd0\x68\x2e\xfa\x59\x8f" + "\xdf\x49\xc8\xa7\x1b\xd1\xd6\x27\x80\xeb\xe3\xf6\xd0\x4e\x13\x60" + "\x36\x00\xd6\x5c\xc6\xe9\x1b\x0f\x71\xdf\x03\xdf\x48\xfc\x06\x92" + "\xee\x1d\xa8\xe9\xf6\x81\x76\x93\x87\x98\x7f\x14\xdd\xb6\xd3\xb4" + "\x90\x88\xf8\x23\xbb\x09\x3c\x66\x6f\x0c\x9d\xe4\x7c\xd8\xfa\xfb" + "\x31\xce\xcc\x53\x1b\xf0\xbb\x97\x98\x7f\x1a\x8b\x97\x73\xd9\x4f" + "\x98\x87\xa6\x15\x87\xd6\x0d\xa3\xe2\x14\xbc\xbb\x0a\x22\x69\xf4" + "\x74\xb1\xd5\x1d\xf5\x6a\x58\x2b\xf0\xb8\x1c\x47\x1d\xae\x57\x44" + "\xb6\x14\xd8\xbb\x29\x22\x62\x2b\x0d\x5a\x6f\x28\x74\x89\xc6\x50" + "\x2e\xca\x16\x13\xf7\x87\xf9\x88\xcb\x4f\x6d\x15\x81\xa8\x7d\x60" + "\x2d\xf7\x4d\xf4\x71\x53\x43\xeb\x3d\xc4\x6b\x8e\x86\xd6\xbd\xcc" + "\xa7\xba\xb0\x0f\x2c\x06\x8f\x76\x4c\x6d\x75\xf7\x78\xfa\x22\xa5" + "\x20\x2d\xda\x50\xb8\x1f\xf9\xf5\x28\x77\x4c\xf2\xed\xb4\x8b\x11" + "\x5b\xc4\xae\x05\x22\xde\x81\xee\x69\x17\x3b\x44\x43\xe1\x76\x7a" + "\xaa\xd5\x0d\x5a\xed\xa7\xa9\x67\x23\xa9\x8d\xc5\x73\x51\xa6\x1d" + "\xe9\x7b\x25\xff\x4f\x3d\xdb\x26\xa6\x2d\x11\xe7\xa7\x5d\xfc\x42" + "\x4c\x2d\x14\x9f\x14\x94\x52\x9f\xeb\xd7\x09\x9d\xe5\xe2\x58\xf3" + "\x7e\xba\xfe\x64\x80\x58\x26\x72\xe7\xe8\x62\xea\xd9\xf3\xe2\xe9" + "\x25\x4c\x9b\x71\xd4\x50\x08\xf9\x29\xdd\x0e\x7a\x0f\xc4\xf3\x61" + "\xb4\x3f\x09\x70\x5d\xc2\x5f\xba\x1b\x65\x7d\xb6\xa7\xce\xda\xe9" + "\x58\xf3\x76\x8a\x64\x68\x81\x68\x85\x16\xd4\x33\x06\xda\xf5\x8a" + "\x81\x9a\xc8\x18\x58\x1c\xa9\x18\xe8\x8e\x66\x0c\x04\x0f\x0c\x0c" + "\x62\x9c\xae\xe3\x31\xbf\x8c\x35\x38\xde\xcf\x5d\xe6\xf1\xf7\x0e" + "\x82\xcd\x33\x48\x83\xbe\x13\x8a\xf7\x07\x11\xaf\xa3\x45\xc6\x20" + "\xad\x23\x63\x90\x5d\x54\xe2\x57\xf2\xde\x20\x27\xf3\xa5\x9c\x6f" + "\x2a\x07\x8d\xc0\xfc\x90\x8a\xfc\x1c\xfc\xe5\xe1\x6f\x36\xd2\xea" + "\x00\x3f\xa3\x5d\xc1\xac\x13\xf7\x79\x61\x3b\x5e\x64\x9e\x74\x01" + "\x56\xd3\xf4\xe8\x18\x17\xe8\x08\x59\x19\x54\xa7\x57\x0c\xf2\x01" + "\x5e\x30\x2c\xf9\x7f\xd0\x79\x86\xdf\xb1\x26\x9b\xd7\xd8\x56\x51" + "\x31\x18\xba\x73\xf0\xd2\x76\xe6\x57\xfb\xe0\x62\xdd\x3e\xb8\x49" + "\x78\x07\xbb\x7f\xfa\x82\x08\x46\xbd\x83\x6b\x75\xef\x60\x6f\xa4" + "\x27\xec\xd2\xd2\xc3\xc4\x3a\x2a\xf2\xb1\x00\x1d\xfe\x08\x9a\xec" + "\x95\x3c\xe0\x2f\x85\x1c\xac\xea\xe7\x6e\x68\x05\x3f\x14\xbf\x23" + "\xf5\x53\x63\xe8\xb8\xa4\xab\xc8\x18\x5c\xcc\x7c\xc5\x63\xfc\x74" + "\x31\xb9\xd1\x96\x5b\xaf\x18\xec\x8d\x56\x00\x6e\x06\xda\xc9\xbc" + "\x2d\x33\x2c\x65\xf6\x36\xf0\xec\x61\xd4\xf9\x23\x29\x3e\xbf\x2d" + "\xe9\x3a\x90\xf5\x24\xeb\x2b\xd6\x51\xd3\x23\x61\xe6\x9b\xbf\xb2" + "\x6e\x53\xba\x8a\x0a\x4c\x5d\xc5\x7a\x8a\x6d\x7d\xd6\x55\xba\xa1" + "\xab\x74\x43\x57\xc9\x77\x3b\xf4\x8d\x77\x40\x2d\xeb\xa4\xe9\xa5" + "\x4a\xd7\x4c\x8f\x3a\x05\xf8\x23\x1d\x30\x6a\xd5\x78\xa0\x4c\xe5" + "\x80\x77\x64\x79\x49\xa7\x01\x4d\x3a\x74\x0e\xfe\x02\xba\xd2\x39" + "\x9a\xa1\x73\x2c\xa6\xce\x89\x62\xfe\x82\x5c\xe9\xc9\x74\x8e\x6e" + "\xe8\x9c\xa8\x50\x3a\x47\x37\x74\x0e\xa7\x47\x0d\x9d\x13\x4d\xa2" + "\x73\x74\xaf\xc6\xfd\x4d\x35\x74\x8d\x9b\x75\x0d\xf7\x57\xaf\xd0" + "\xbc\xba\xd2\x35\x75\xb0\xf3\x2d\xac\x6b\xa2\xa8\xa3\x9b\xba\xa6" + "\x5d\xd6\x6f\x62\x7d\xd3\xf1\xcf\x04\x1d\xaa\x11\xeb\x19\xa9\x53" + "\x22\x03\x23\xac\x53\x40\xbf\xfb\x13\x75\x0a\xe0\x05\xf0\x6c\x57" + "\xba\x6a\xa0\xdd\xb6\x4e\x44\x74\xbb\x16\x9c\x5e\x1a\xc2\x58\x7f" + "\x8e\xb5\x2e\x74\x77\x69\x09\xf4\x5d\x84\xa2\xd0\x37\xa2\xd1\xcd" + "\x7a\x07\x79\x51\xe8\x0b\x22\xc8\x66\x71\x04\x72\x0e\x7d\xe4\x6e" + "\x2c\xfe\x8c\xa2\x90\xd7\xa9\xad\x6d\xfe\xa7\x43\xd9\xf6\xa9\x67" + "\x45\x10\xf4\x09\x3c\x5d\xec\x86\x8e\xc9\x0e\x36\xb4\x7e\x44\xb9" + "\xcd\x42\xcf\x9d\x1d\xd0\x20\x6b\xee\xa9\x0b\x7c\xb6\xa7\x97\xd8" + "\x21\x6b\xc2\x07\xdd\xf8\x7f\x4f\x3d\x6b\xb7\xcd\x6a\xa6\x5b\x72" + "\xe7\x08\x3d\x0a\x59\x43\x7f\x83\x90\x33\x8c\xcd\x40\x7b\x14\xf2" + "\x06\x59\x2b\x8e\x24\xc8\x9a\xc8\x1c\x78\x0e\xcf\x9a\xa2\xdf\x20" + "\x0d\xb2\xc6\xeb\x3e\xc1\xf3\x08\xaf\xaf\x20\x0f\x1a\xef\x3d\x41" + "\x46\x40\x43\x25\x6f\xba\x50\xf2\xa6\x33\xfd\x2c\x86\xbc\x61\x2c" + "\x90\x9f\x83\xbf\x3c\xfc\x25\x97\xb7\xe2\x04\x79\x5b\x62\xc8\x5b" + "\x86\x92\x37\x8c\x6b\x6a\x74\x8d\x92\x39\x6e\x83\xd7\x61\x9d\x32" + "\x97\x39\xb8\x58\xb0\xed\x28\xf9\x47\xca\x1d\xe6\x97\xc1\xb5\x90" + "\x39\x2f\x64\x0e\xf0\x44\x90\xf5\x27\xf8\xf3\x3f\x79\xce\x9b\x56" + "\x2c\xfe\xb3\x20\xda\xcf\x0d\x99\xaa\x85\x4e\xfb\x02\xfa\xf4\x3f" + "\x9f\x0e\x51\x2d\x60\x15\x43\x96\xdc\x90\x29\x2f\x64\x8b\x65\xca" + "\x1e\x5d\xc3\x30\x6f\xb3\x77\xc2\x90\x73\x66\xbc\x4c\xa9\x9d\xeb" + "\xe4\xfb\x7f\xed\x9e\x5b\xa0\x19\x7f\x77\x98\xed\x15\x3c\xb7\x04" + "\xe8\xf7\x5e\xe3\x39\x14\xa0\x5d\x9b\xa4\xad\x03\x59\x2c\x2e\xa7" + "\x9b\xce\xd0\x80\x7d\xe0\x7b\xc2\x73\x3a\x9e\xf7\x4f\xbf\xe3\x13" + "\xd8\x14\x3b\x4a\xd1\x76\x3b\xcb\xa3\xf0\x8c\xc2\xda\x82\x72\xc0" + "\x8f\x69\xa2\x3d\x3b\x5d\x64\x3a\x1f\x14\x1d\x0e\xde\x63\xb2\xe1" + "\xbd\x0f\x68\x30\x04\xbf\x99\xbb\x2f\x51\x16\xfe\x1c\xbb\x3d\xba" + "\x9b\xed\x2b\x3c\x3b\xc5\x4a\x47\xef\x2d\x2b\x68\xa8\x2d\x44\x69" + "\x35\x1e\x3d\xdf\xb6\xce\xce\x7b\x2d\x59\xfc\x2c\x3c\x35\x75\x35" + "\x97\xc8\xca\x76\xa4\x9e\x81\xf6\x4a\x6d\x42\x2c\xcb\xa6\x9a\xa5" + "\xd0\x13\x1e\x72\xd4\x78\x44\x5d\xb4\x9d\xe9\x30\xc0\x6d\xe2\xc2" + "\xb8\x01\xcf\x1f\x00\xcf\xc3\x8f\xae\xca\xa1\x3f\x96\x52\xd2\x3d" + "\xca\x76\xcf\x80\xce\xfe\x77\x93\x1f\x31\x69\x92\x3c\x5f\xeb\x6f" + "\xd2\xa9\x9b\xfd\x2c\x2b\xcf\xd7\xd1\x15\x22\xb8\xf5\x39\x62\x5a" + "\x38\x5c\x11\xf1\x3f\x41\x47\x77\x79\x94\x7e\x30\x7d\xd5\x00\xe1" + "\x6f\x15\x3e\x7f\xe9\x59\xaa\x41\x7e\x79\x99\xd0\xf5\x0c\x67\xb6" + "\xa8\x70\x0e\x69\x5b\x21\x22\xbb\xa5\xdd\xab\xb9\x03\x74\xaf\xa6" + "\xc6\x62\xa0\xdc\x33\x68\xb3\x3b\x87\x00\x56\x06\xc3\x6a\x40\xfd" + "\x68\x85\x73\x28\xca\xed\x0b\x50\xbd\x3c\x33\x80\x3c\x53\xf1\x6a" + "\xba\xf9\x0c\x69\x01\x69\xdb\x7b\x9d\xe3\x58\x2f\x20\xcd\x8e\xb4" + "\x56\xc0\xcf\x41\x79\xac\x8f\xeb\x02\xca\xd6\xd5\x5a\xcd\x72\x78" + "\xf6\xf1\x73\x1c\x0f\xc9\x53\x0d\xc2\x78\x69\x5d\x87\x21\x29\x06" + "\x5b\x99\xff\xec\xf8\xcb\x49\x9e\xdd\xa5\xd7\x07\xba\x61\x77\x91" + "\x6b\x2d\xf5\xc7\xf8\x00\xbf\x81\x73\x5c\xa5\xe2\xb4\xf0\x68\xe1" + "\x37\x57\x87\xb1\x2e\x18\x58\x14\xa0\x17\x9b\xbb\xb7\x9f\x61\xf7" + "\x5c\x12\x2d\x5b\x57\x74\xd2\xf2\xcb\xe9\xab\x74\xc1\xcf\xac\x97" + "\x6a\x90\xce\x74\x03\x9c\x03\x26\xcd\xba\x1f\x17\xe7\x18\xb5\x0e" + "\x1c\x94\x25\x3c\x82\x7c\xb7\xf0\xf9\xc1\xa0\x9b\x14\x1d\x06\xd9" + "\xdb\xa0\x4f\x78\x7f\xb4\x06\xf4\x5e\xe6\x10\xe1\x76\xcf\x20\xd8" + "\xff\x77\x7a\x8d\xbd\x98\x90\x3f\x32\x99\x75\x4c\x77\xfb\x98\x69" + "\x5d\xf0\x07\x8f\x6a\xec\x0f\x7d\x24\x75\x54\x51\x56\xb9\xc2\x3b" + "\xcc\x70\x7d\xe5\x17\xa8\x19\xf9\xcb\x42\xa2\x45\x78\x8b\xd2\x78" + "\xad\xe1\x5b\x71\x99\xd3\xee\x01\x6f\x0b\xdf\x52\xc6\x69\xf0\x3d" + "\xbe\x5b\x2e\xd3\x69\xac\xf3\xb0\xc6\x0b\xaa\x7d\x99\xc1\xda\x91" + "\x12\x32\xf6\x7a\x06\xd5\x06\x68\x68\xbe\x89\x17\xdb\x1b\xa0\x6f" + "\x1a\xdb\x1f\x6c\x77\xf0\x9e\xfb\xb2\x32\x11\x66\xfb\x03\x65\x8f" + "\x99\x7d\xe0\xfe\x19\xfd\x0a\xc4\xf6\x0b\x38\x04\xb1\x66\x96\x34" + "\x58\xb6\x8a\xd2\x34\x45\xeb\x34\xee\x2f\xf7\x85\xfb\x2c\xfb\x22" + "\x75\x2d\xe6\x8a\xc8\x3d\x58\x83\xc9\x74\xad\xdd\x33\x18\xeb\x9f" + "\x3b\x43\x8a\xa7\x06\xd5\x26\xf2\x51\xe7\x38\xda\xb5\x26\xd7\x37" + "\x74\x8b\x4b\x17\xa7\x00\xf3\x10\xe8\x94\xca\xbf\x3a\xdb\xdc\x61" + "\xe6\xdf\xd1\x69\x3c\x37\xfb\xcb\x2e\xb2\xad\xcd\x65\x6f\x44\xd9" + "\x66\x94\x79\xcb\x28\xfb\x96\x3a\x6f\x91\xbf\xbd\xf8\x17\xf3\x59" + "\x03\xf0\xf0\x05\xe5\xbc\xbf\xb0\xc9\x7c\x17\x78\xc7\x6f\xa9\xa8" + "\x18\x9d\x96\x1c\x97\xc1\x4d\x3c\xaf\x45\x2f\x89\x56\xb4\xf3\x3d" + "\xe6\x29\xd7\x2a\xfa\x3e\xf8\xf2\xcb\xf2\xb5\x74\x23\xf3\x93\xc8" + "\x70\x4e\x52\x74\x1f\x92\x2e\x3c\xb0\x43\xa1\x55\x8b\x57\xd0\xcd" + "\x90\xa3\x71\x67\x68\xc8\xc0\x82\x32\x0d\xb8\x12\x6d\x3d\x47\x24" + "\x75\x50\x86\x33\xc7\x1f\xf9\x8a\x6a\xce\xf1\x7e\xcb\x90\x1c\x93" + "\x17\xf1\x9c\x7b\x35\x7d\x01\xba\xe6\xa9\xfd\x82\x21\x87\x78\x7f" + "\xfd\x14\x0d\xd9\xcb\xfd\xc5\x5f\x0a\xd2\x5e\x15\x97\xc4\x2c\xa1" + "\xe6\x36\xc0\x1c\xd2\x84\xdf\x3c\xf9\xe7\xa1\xd9\xc6\x7b\x0e\xca" + "\x6d\x10\x97\x74\x2e\x93\x87\xb4\x6a\xe1\x49\x61\x99\x38\x8c\xb6" + "\x8f\x06\x68\xfc\x18\x35\x36\x43\xb6\x33\xac\x6e\x70\xc8\xc1\xd8" + "\x12\xf3\xe6\x69\xba\x75\xa4\x56\x9e\x02\x3c\x6e\xed\x21\xe5\x02" + "\xb0\x6a\x2c\x4a\x6f\xeb\xc0\x75\x8f\x47\x2f\x84\x8e\x2e\xd4\x2b" + "\xc7\x6c\x94\xcf\x46\x9e\x30\xe6\xd3\xe4\xf0\x8b\xb2\x7c\xfd\x98" + "\xc7\x6f\xdd\xa4\xe0\x14\xa5\xf9\xfa\x9d\xe1\xf7\xcd\xfc\x1e\xb2" + "\x8f\xdd\xe8\xaf\xca\x41\xfb\x67\xb8\xdd\x4d\x6a\x1f\xe0\xd6\xcd" + "\x6d\x68\xa3\xdd\x73\xeb\xa6\x00\x0d\x9b\xab\xce\x1a\xc6\x6e\xec" + "\x46\xf6\xec\x2c\x3b\x2c\x73\x4a\xa6\x6f\x9f\xda\x50\x2b\xe5\xcf" + "\x09\x9e\xcf\x33\xf4\x06\xef\xad\xa4\x9f\xa2\xdb\x73\x1b\x1c\x92" + "\xbf\x2d\xc2\x72\x6b\xeb\xbb\x7a\xd0\xc2\xe7\x41\x4a\x7d\xdd\x9e" + "\x7b\xe5\xdf\x6d\x50\x80\xb7\x39\xf1\x37\xce\x78\x9f\x82\xbf\x59" + "\xf8\xdb\x8f\xf7\x71\x92\x76\xbb\xe6\xa6\x04\x90\xd7\x06\xfb\x9d" + "\xdf\x03\x74\x5b\xb6\xd8\x35\xc4\x02\xfb\x44\x3e\xd7\x7c\x9f\xf7" + "\x12\x6e\x9b\x89\x31\x38\xa9\xc6\x82\xe1\x50\x0a\x70\x63\xba\x0b" + "\x57\x95\x08\xd7\x97\x87\x80\xf7\x6d\x1b\xea\xab\x42\xa4\xdd\xc6" + "\xfd\xbf\x6d\x23\xf7\x29\x04\xfa\xf3\xef\xb2\x2a\x11\x3c\x52\x1d" + "\x61\xf9\x6d\x01\x2c\xc8\xff\xcf\x27\xa9\x7d\x89\x22\x27\xc3\x33" + "\x78\x42\x98\xfd\x57\x3a\x6d\xec\x46\x1e\x4b\xc0\xfa\x0c\x7d\xb7" + "\x9d\xa3\xdb\x6f\x12\x99\x63\x36\x1e\x29\x24\xda\x0d\x3d\x82\xb9" + "\x46\xee\x97\x43\x2f\x31\x4c\xcc\xff\xb7\x8e\x33\xcf\x51\x36\x23" + "\x7f\x0b\xf2\x30\xf7\x04\x1b\x0a\xc3\xc4\xb0\xa2\xdc\x3f\xd4\xff" + "\x48\x0f\x5a\x31\x57\x63\xcc\xc7\x6e\x2c\x2f\x86\x9e\xe9\xd4\x5b" + "\xb7\x1d\x5e\x7b\x56\x84\xcd\xfe\xf1\x59\x65\xbb\xe7\x76\xf0\xff" + "\x82\xd9\xdd\xf2\x7f\x27\xce\xd9\x0b\x8e\x0c\x51\x63\xa6\x83\x2e" + "\xf1\x63\x96\x5d\xa8\xc6\xeb\xf6\xea\xf8\xf1\xca\x46\x4f\x6e\x6f" + "\xc6\x5f\x04\xcf\xe9\xea\x3d\xf6\xef\xf6\xa6\x98\x77\x70\x47\xf6" + "\x4c\xe0\x83\xf9\x7f\x48\xbe\x1a\x07\x4e\x47\x3f\x98\x47\xbe\xa6" + "\x34\xde\x9f\xe3\x73\x4a\x4e\x67\x7e\xe6\x74\x1d\xf6\x0c\xfa\x13" + "\x44\x3e\xeb\xc0\xbc\xad\x3a\xc5\xe5\xfb\x37\x80\xe7\x56\x5f\x66" + "\xfc\x27\xc8\x3d\xc5\x75\x1b\x37\x32\x9f\xa2\x4e\xc8\x16\xd9\x08" + "\xfe\xcd\xce\x35\xe9\x8a\x7a\xa3\x38\x9f\x79\x12\xe9\x73\x41\x17" + "\xb9\x5f\x1f\xc2\xda\x2f\xb9\xad\x91\xbd\xb1\xd3\x26\xb3\x0f\xaa" + "\x63\x7d\xd4\x4a\x77\x6c\x87\xce\xc2\xd8\x8e\x71\xab\xb9\xe6\x8e" + "\x57\xf9\x1d\xba\xf2\x4b\x3c\x7b\x1b\xa0\x93\x2e\x57\x8e\xd8\xd7" + "\x61\xa1\x5e\x97\x2d\x94\x13\xa9\xdc\x51\x1d\xc9\xbc\xfd\x80\xbf" + "\xe5\x00\x35\x46\x7e\x43\xda\x73\x12\xc6\x4b\x7e\xf4\xdc\xb5\x4a" + "\x44\xdf\xbb\xbc\xcf\xea\x8f\x9c\xf7\x61\x6e\x1e\x70\x86\xee\x90" + "\xf4\x78\xe5\x14\x66\xfd\xa7\x25\x6c\x83\x3e\x3b\x4a\xb7\xcc\x17" + "\x91\x2d\xa7\x45\x08\xf6\x5d\xef\xcd\x97\x69\xe8\xce\xd5\xe4\xac" + "\xbe\x4c\x43\xf6\x5c\xa6\x6c\xf1\xd7\x6c\x4b\x35\xec\xb6\xa7\x2f" + "\xda\x09\x3a\x21\xbf\x4f\x31\xa5\xed\x59\x4d\x92\x47\xa2\x15\xb0" + "\xdf\x22\xb0\xdf\xce\x67\xb3\x6e\xec\xb4\xdf\x3a\xa4\x6d\xec\xdc" + "\xaf\xf8\xc8\xb9\xff\x86\x42\x4a\x49\x9f\x4d\x76\xe0\xe7\x3a\x47" + "\xd9\x7f\x4a\x6f\x86\xed\x88\x3e\x07\x8c\xfe\x82\x76\x27\x6d\x85" + "\xd4\x4b\xf6\x15\xfa\x5a\x54\x8c\x71\x77\x3b\x0f\x5b\x98\xa7\x42" + "\x2c\x37\xdc\x87\x2f\xf9\xac\xf4\x40\xbf\xb0\x75\x59\xb5\x08\x73" + "\x7a\xc9\x40\x11\x46\xfa\x51\x6e\xbb\x0e\xe9\xed\x9e\x3b\x82\x01" + "\xeb\xcd\xdd\xfa\x4d\x60\x9d\x64\xe8\x95\x3b\x97\x08\x8b\x9b\x79" + "\x34\xb8\x36\x02\xfb\xfb\x1c\xcb\xec\x9d\xc5\xd3\x8b\x44\x44\x5b" + "\xcc\xe7\xd6\x77\xce\xe6\x33\x75\x3e\x4b\x7b\x17\xb6\xcd\xb7\x9d" + "\xa3\xf3\x7c\xc1\xeb\x05\x5b\x11\x60\x56\x0e\x0a\x0a\xac\xd3\xbf" + "\xab\x1d\xcf\xbe\x1c\xdb\xa4\xdf\xc8\x9d\xfb\x03\xf4\x53\x2b\xe3" + "\xce\x67\xa6\xac\x3b\x61\x6f\xdd\x08\xbc\x5a\x42\xa0\x03\xf2\x31" + "\xff\xff\xf8\x84\x71\xee\x29\xfd\x51\x90\x86\xf9\xff\xa1\xfe\x9c" + "\x56\x32\x90\x1c\x25\x9a\x68\xe9\xce\x66\x92\x3e\x22\x16\xfa\x5e" + "\xbb\xe7\x9f\xb2\x4c\x38\x98\xa7\xde\x6e\xb3\x3c\xfa\x28\xd2\xb2" + "\x4d\x38\x28\x73\x13\xde\xc7\x74\x96\x51\x75\xa6\xc4\xd4\x79\xb4" + "\xcd\x72\xe7\xdb\x48\x9b\x95\x50\xa7\x28\xa1\x4e\x59\x4c\x1d\xb7" + "\xd1\x8e\x37\xa1\x4e\x6d\x42\x9d\xba\x24\xb8\xd5\x27\xd4\x39\x9e" + "\x50\xa7\x39\x09\x6e\xe1\xf8\x3a\x43\xd3\xe2\xeb\x0c\x75\xc4\xd0" + "\x92\xfd\x35\x9c\x48\x1b\x9a\x50\x67\x5c\x42\x9d\x5c\xf3\xbd\x3b" + "\x9f\x9c\x65\xbb\xc9\x01\xde\x6c\xe1\xf1\xdc\x86\xf1\x69\xdb\xb1" + "\xb0\xdd\xa8\xbb\xf1\xca\x7e\x0d\xad\x4e\x68\x6f\x7f\x42\x7b\x87" + "\xaf\xec\xd7\xd0\xa6\x84\x3a\x81\x84\x3a\xc1\x98\x3a\xb5\xaa\x9d" + "\x61\xd6\xf8\x3a\xc3\xb2\xe2\xeb\x0c\x1b\x72\x25\x5f\x0d\x1b\x93" + "\x50\x67\x4a\x42\x9d\xfc\x6f\xa1\x05\xcf\xe3\xca\x77\xaa\x2f\xdb" + "\xca\x0f\xc0\x46\x18\xf6\x29\xfb\x04\x6c\x45\x1b\x6f\x5e\x0e\xf7" + "\xe0\xf3\x0f\x9e\xaf\x8e\x94\x86\x31\xb7\x0c\xc3\xfa\xe7\x6e\xcd" + "\x9c\xb3\xd8\x5f\x82\x65\x5a\xd9\xd8\xc3\x36\x76\x67\x8b\x72\x3b" + "\xa6\x2f\x15\xb7\x75\xa4\x3f\xcf\x53\xc3\x42\x9d\x36\xb1\xf2\x2f" + "\x22\x05\x67\xf8\x43\x0c\x87\xdb\xaf\x51\x7e\x18\x29\x6c\x93\x1f" + "\x29\xe5\x3a\xc3\xb3\x63\xec\x68\x6e\x3f\x74\x60\x75\xd8\x1a\x8f" + "\xc7\xf0\xb4\xab\xe0\x91\x2e\xbc\x0b\xc3\x8d\xd5\x44\x7c\xc6\xdc" + "\x50\x0d\x1b\x08\x76\x3f\xe3\x76\x8a\x86\x7b\xa5\x4d\xb6\xf8\x32" + "\xf1\xb3\xbf\xec\x5e\x79\x06\xad\x6c\xd2\xe1\x47\xeb\xd1\x3e\xdb" + "\xee\xf5\xc5\x17\xa8\x4d\xce\xbf\x6c\xbb\x0d\xbf\x78\xa4\x2c\xc8" + "\x78\xf9\x4c\xff\x8c\x00\x0d\x0f\x49\x5b\xc3\xbb\x90\xe7\xfa\x20" + "\x9f\x19\x1d\x09\x8d\xe1\x32\xe0\xff\x61\xc7\xcc\xfe\x62\xae\x07" + "\x0f\x0c\xaf\xbe\x1a\xcd\xd4\x18\x8e\xe8\x1f\xcf\x93\x3d\xc0\x2b" + "\x23\x9c\xf1\xe3\x3e\x22\x27\x7e\xdc\x47\xe4\xc5\xf3\xa4\x05\x3c" + "\x39\x62\x6e\x42\x9d\x92\x84\x3a\x1b\x62\xea\x78\x8d\x76\xaa\x12" + "\xea\xec\x4b\xa8\x73\x30\xe6\x1d\x7d\x1c\x71\xb4\x73\xed\x23\x7d" + "\x7f\x46\x9c\x88\x79\xb7\x6c\x97\xfa\x73\x44\xab\x99\xc6\x7b\x48" + "\x7b\x5e\x53\xbe\x27\x0a\x9e\x33\x2d\x41\xde\x51\xde\xd9\x3f\x1e" + "\x07\xe7\xd0\x78\x1c\x9c\x9d\xf2\xbf\x55\xad\xdd\xfe\x70\x9a\x46" + "\x66\x49\x1e\x82\x8c\x60\xce\x9e\xce\xef\x80\x55\x85\xf2\xa0\x83" + "\xb3\x28\x01\x5e\x59\x02\xbc\x4d\x31\xef\x76\xbc\x57\xc7\xf4\xc1" + "\x9e\xea\x90\x7e\x7c\xb0\xdf\x9c\x07\xcc\x74\x5e\x53\x02\xdf\x16" + "\x97\x9c\x6b\x72\xd8\xa7\x2a\xf3\x14\x39\xdf\xe0\xf5\xa7\x01\x33" + "\x56\xfe\xc9\xe8\x57\x28\x1e\x8f\x91\xd6\x78\x3c\x46\x66\xc5\xf4" + "\x2b\x64\x5b\x47\x0f\xdb\x22\x8f\x3c\xce\xb6\x0f\xfb\xc2\x49\xdf" + "\xa6\xb5\xb0\xd9\x2e\x92\x9d\x7d\xca\x4e\x97\x50\xaa\xbf\xb4\x05" + "\x6b\x39\xe7\xbe\x6e\xf9\x29\xb3\x88\x0c\xbf\x3c\xac\x23\x47\x96" + "\x98\xfc\xa8\x57\x16\x91\x5e\xf1\x43\xd8\x6a\x23\xa1\xff\x46\x90" + "\xb2\x73\x47\xd7\x0a\x57\x7e\x15\xe8\x89\x75\xd1\x5d\xcb\x8d\x75" + "\x44\x16\xfb\x46\x41\xf7\xb4\x60\x8e\x4f\x57\x67\xe3\x23\x0f\xc7" + "\xf0\x75\x48\x5b\x7d\xbf\x38\x45\x77\xad\x63\x1b\x80\x65\x94\x7d" + "\xac\x8e\x44\x82\xc4\x6b\x6f\x7f\xe4\x8c\xb4\xdd\x90\xef\x36\xea" + "\x86\x63\xea\x06\x8d\xb5\x31\xcf\xa3\xd6\x11\x11\xb2\x1e\x09\x05" + "\x09\x70\xb2\x94\xbd\x77\xd7\xba\x23\x90\xd7\x76\xcf\x5d\x43\xcd" + "\x3a\xbc\x8e\xe6\x3a\xb6\x12\xb2\x0e\x2f\x23\xab\x6f\xf5\x29\x09" + "\xdb\x18\xfb\x16\xd8\xd2\xad\xfe\xb2\x16\xf2\x87\x4e\xf0\x5e\x97" + "\x55\xf9\xa9\xdc\xe5\x4e\x0d\x53\x5a\x5b\xc5\x42\xc8\xdf\x5d\xee" + "\x68\xc5\xc2\x30\x70\xb3\x07\x68\xe4\x5e\xd6\x37\xb1\xb4\x9b\x3c" + "\x39\xef\x91\xe9\x53\x87\xfd\xec\x91\x87\x66\x4e\xbe\x57\x9b\xb9" + "\x60\xd1\xbc\xb9\xc3\x9e\x5f\x5e\xa2\xad\x5c\xba\xa0\x64\xc1\xe2" + "\x9f\x6b\xce\xd2\x5b\x4b\xb5\x39\x25\xea\x37\xbb\x68\xce\xb2\x92" + "\xf1\xfc\x38\x54\x2b\x5e\x3a\x6f\x85\x7c\xbc\xa3\x37\xc5\x03\x59" + "\x50\x32\x6f\xa9\x76\xeb\xdc\xa1\xda\x83\x73\x16\x14\x2d\x5f\x3a" + "\x2f\x29\xac\x7b\xb5\xa5\xf3\x96\xce\x9b\x33\x57\x1b\xaf\x39\x19" + "\x72\x2c\xb8\x98\xf1\x74\x9a\xf3\x18\xcf\x5f\x5b\x3d\xa2\xc9\x98" + "\xcf\x02\x8a\x7f\xee\x9e\x79\xe5\x5c\x76\x77\x61\x3c\xcf\xdd\x5d" + "\x1a\xcf\x73\x77\x6f\xbc\x72\x2e\xbb\x3b\x61\xfe\xbb\x3b\x61\xfe" + "\xbb\xfb\xf0\x95\x73\xd9\xdd\x09\xf3\xdf\xdd\x09\xf3\xdf\xdd\x9d" + "\xf3\x1f\x78\x29\xb0\x5e\xea\x85\x51\x09\xf3\xdf\xa8\x84\xf9\x6f" + "\xd4\x90\x84\xf7\x51\x31\xef\x37\xe2\x7d\x52\xec\xfc\x88\xf7\x99" + "\xa6\x7c\x76\xe9\x97\x51\x85\x66\x19\xd6\xf5\xd0\xcd\xcd\x46\x59" + "\x77\x4c\xd9\x16\xa3\xec\xf6\x4e\xf9\xe3\xb3\x6f\xa4\xab\xf5\xfa" + "\xa8\x6f\x58\xa7\xb3\x1f\x1a\xcf\x4d\x90\x8f\x01\xe7\x68\xd4\x12" + "\x86\xc5\x3c\xcc\x7e\x89\x62\xc7\x93\xed\x35\x99\x94\xc6\x75\x6a" + "\x2a\xc9\x2a\x3c\x77\x6d\xc2\x2f\x21\x2d\x1d\x7f\xd0\x29\xa3\x60" + "\xff\xf6\x9f\xa9\xe6\x8b\x7b\x72\xa4\xcd\x8f\x3a\x0a\xfe\x3d\x72" + "\x5d\x03\x38\x0e\xd4\x49\xdb\xaa\xe6\xe2\x66\x3c\xa7\x33\x4f\xa3" + "\xbe\x55\x58\xee\xfa\x77\xfc\x12\xd2\xec\xf8\xcb\x6a\xf7\xdc\x93" + "\x63\xc2\xe3\x33\xf2\x64\xf2\x9f\x68\xe7\x76\xae\x07\x2d\x64\xdb" + "\xea\xd1\x4f\xf8\x75\xb6\xad\xef\x29\x51\x7b\x0b\x23\x8e\x0a\xcf" + "\x27\xf9\x35\x48\x4f\xbe\x4e\xba\x07\xf6\xdf\x3d\x85\x6a\xbf\xe5" + "\x1e\x8c\xff\x4f\xb7\xab\xbd\xd3\x11\x47\xa1\x6f\x2f\x9f\xa6\xd1" + "\x8f\xe2\xb7\x03\xbf\x63\x4d\xf8\x3e\xb9\xde\xbe\xe7\xb8\xf0\xa4" + "\xcc\x60\xb8\x09\xe9\xad\xd0\x6f\x97\x6d\x11\x77\xfe\x95\x79\xa3" + "\xb1\x86\x49\x7d\x24\x49\xba\x06\x9b\xe1\x72\x80\x46\xcf\x64\x7c" + "\x63\xd2\xc7\x08\x4f\x9f\x99\x5c\x3e\xc0\xed\xa1\x4e\x77\xb6\xb6" + "\xe9\x77\xaa\xfc\xc4\x47\x6f\x48\xe8\xc7\x37\xa7\xe9\x87\x29\xaa" + "\x1f\x3f\x7c\x2a\xa1\xed\xea\xe4\xfd\x18\x7d\x00\xfd\xf8\xa6\x9b" + "\x7e\x34\x49\xda\x5a\xd0\x17\xcb\x15\x79\x6c\xff\x7c\x23\xe9\x1e" + "\x97\xfe\x43\xab\x61\x0b\x85\xb0\x0e\xb3\x23\x4f\xd6\x9d\x51\xd6" + "\x35\x6e\x46\xb9\xa1\xb6\x2a\xca\xbb\xb2\xcd\x1f\x4e\x12\x9e\x5e" + "\x33\x02\xf4\xc3\x32\x09\xa7\x2b\x7d\x96\xc2\x05\x74\xb2\x30\x9d" + "\xd0\x1f\xd4\xeb\x6e\xbc\xcd\x75\x89\xda\x0b\xf9\x21\xe4\x7f\xf4" + "\x6c\x73\x2f\x73\x59\x99\x08\x9a\x74\x44\xde\xd1\x84\xbc\x70\x4c" + "\x5e\x73\x5c\xde\xda\xce\xf4\x88\x99\xfe\xdd\xc6\x69\xcc\xd0\x84" + "\x71\xc2\xf8\x8c\xf9\x28\xbe\xdf\x63\xc6\xa9\xfe\x61\x8c\xae\xa0" + "\xf5\x98\x7c\x8c\x51\x47\xf2\x31\x1a\x53\x92\x9c\xd7\xc6\xc8\x7d" + "\x34\x91\x49\xc9\xe0\xed\xc3\xd8\x75\x48\x1e\x34\xc6\xe9\xca\xf1" + "\x19\x73\xcc\x1c\x9f\xef\xd6\xc7\xb1\xf6\x84\x3e\x46\x4f\xd3\xd8" + "\xcd\xaa\xaf\x63\x3f\x8f\x87\x3d\x36\x3b\x39\x2f\x8e\xcd\x41\x3f" + "\xa3\xc9\xfb\x39\x76\x56\xf7\xbc\x38\xb6\x14\xfd\x89\x5e\xc9\x8b" + "\x63\x95\x0f\x93\xc1\x83\x09\x79\xfb\x85\x27\x69\x3b\xf5\xae\x08" + "\xdb\xb9\x63\x23\xbc\xbf\x14\x93\x7e\x32\x9e\xff\xd0\x07\xae\xc7" + "\xf4\x8b\x28\x3d\xcb\xe3\x70\x5a\x23\xcb\xb7\xf1\x64\xbb\xe7\xde" + "\x71\x09\xb4\x3a\x7f\x9a\xee\xfd\xa8\xcd\x92\xb2\x57\xd1\xeb\x47" + "\xeb\xe2\x71\xba\x37\x3f\x39\xbd\xee\x2d\x06\xbd\xce\x27\xa7\xd7" + "\xbd\x9b\xba\xa7\xd7\xbd\x3c\xfe\xe7\xaf\xa4\xd7\xbd\xbe\x58\x7a" + "\xc1\xd6\x95\xfd\x1b\xec\x00\x6f\x74\x14\x88\x1a\xee\x6b\x94\xec" + "\x36\xf0\x8a\xaa\xd3\xca\x75\x42\xb6\xb0\xe2\x13\xd8\x90\x69\xe7" + "\xe8\xde\x93\xa6\xfc\xf7\xa9\xa2\x5e\xa2\xe3\x49\xf6\x29\x4a\xe1" + "\x7a\xfe\xd2\xf3\x3e\x7f\xc4\x49\xbc\xfe\x88\x6f\xf7\x47\x63\x92" + "\xeb\x82\x1f\xe5\x81\xa6\x95\x49\xd2\x0b\x95\x3f\xd9\x8f\x6a\xe3" + "\x75\xc4\x8f\xdc\xf1\x63\x04\xba\xa1\x1e\x75\xdd\xc1\xb9\xea\xdf" + "\xd5\xc7\xec\x47\xc1\x2b\xc7\x6c\x5c\x85\x1a\xaf\x71\x4b\xe2\xf1" + "\x1b\x97\x96\x7c\xbc\xc6\x69\xdd\x8f\xd7\xb8\x71\xdd\x8f\xd7\xb8" + "\x7c\x1e\xaf\x00\x8d\xf3\xc6\xcf\x1b\xe3\x8a\xe3\xfb\x3b\x4e\xca" + "\xb0\xb0\xf4\xbc\x91\xdf\xbf\x6b\xbf\xcd\x3f\xd6\x71\x3c\x56\x35" + "\xe5\x04\x5e\x4e\x19\xc8\x38\x5e\x2b\x8c\x6e\x61\x83\x86\xde\xd5" + "\xc9\xcf\x5b\x79\x8d\xdb\x58\x45\xc4\xe7\xc8\xda\x2d\x6c\xbb\x8f" + "\x9f\xa7\x5b\xe8\x04\x9e\x2d\xa7\xe9\xfe\x91\xba\xc5\x52\xc6\x67" + "\x9e\xd2\x77\x5b\xee\x21\x8c\x2f\x8b\x1d\x0b\x3e\xfb\xe4\xb5\xe9" + "\x16\xb5\x76\xfa\xe2\x34\xdd\xd7\x43\x8d\xcb\xfd\x19\xf1\x74\x1c" + "\x5f\x9b\x7c\x5c\xc6\x1f\xc4\xb8\x7c\x91\x7c\x5c\xc6\x1f\xef\x7e" + "\x5c\xc6\x07\x31\x2e\x5f\x5c\x29\x47\xf7\xa5\x19\x72\xb4\x9e\xeb" + "\x68\x8b\x79\x3d\x7e\xdf\x2a\x2e\x83\x67\xc8\xc8\x7d\x73\x38\x7f" + "\x58\xab\x29\x47\xb2\xce\x38\xc0\x92\xed\x1b\x65\xc6\x18\x30\x62" + "\xe1\xce\xb6\xb5\x26\x93\x93\xfb\x4a\xb9\xec\xf0\x62\x4a\x03\x0d" + "\xf3\x77\x33\x8c\xa5\x44\x80\xd1\xc0\xe5\x38\x1d\x2b\xfc\x18\x39" + "\xb9\x6f\x9f\x59\x8e\x75\x9d\x51\xb6\x56\xb4\x17\xf2\x4e\x40\x62" + "\x9b\x46\xff\x7b\xc9\x79\x84\xcb\x73\xb9\x84\x32\x61\x25\x8f\xf7" + "\x8f\x8b\x97\xc7\xfb\xed\xf1\xfc\x09\xfa\xa3\x9e\x0e\x3d\x87\xe7" + "\xb9\xc0\xe1\x3b\xf3\xd7\xd5\x65\xf3\xfe\x4d\x09\xb2\x09\x1e\xc8" + "\x19\xa6\x78\x20\xe7\x86\x78\x5c\xef\xdf\x9b\x9c\x07\xee\x3f\xdc" + "\x3d\x0f\xdc\x7f\xa2\x7b\x1e\xb8\x3f\xc4\x3c\x10\xa0\x9c\xa1\xf1" + "\xb2\x99\x93\x1e\xdf\x77\xb4\x2b\x65\x93\x32\xae\x45\x36\x61\x0b" + "\xdd\xd8\x9d\x1c\xb2\x4c\xb1\x0f\x49\xcd\x65\xf3\xac\xe3\x3b\xd1" + "\x2c\x0d\x72\xc5\xf8\xf9\x78\x4f\x09\x3a\x7e\x0c\xd3\x70\x8f\xbc" + "\x1b\x98\x73\x3c\x96\x8e\x5b\xd4\xfd\x35\xd7\x69\x9a\xf0\x38\x9f" + "\x2b\x2b\x7a\x3e\x30\x30\xbe\xff\x39\xa1\xe4\xf4\x9c\x90\x0e\x7a" + "\xba\x92\xd3\x73\x42\x76\xf7\xf4\x9c\x30\x89\xef\x06\x5d\x29\x53" + "\x13\x66\x69\x2b\xa4\x8d\x22\xeb\x9c\xa3\x09\x1f\x7c\xb7\xf9\x69" + "\xc2\xf6\xf8\xf9\x69\x42\xd9\xb5\xcf\x4f\x13\x4e\x24\x9f\x9f\x26" + "\x04\x93\xcf\x4f\x0f\xa4\x29\x79\x78\x20\x27\x5e\x1e\x1e\xd0\xe2" + "\x79\x22\x27\xf4\xdf\x37\x3f\x3d\xe0\x4d\x90\x81\xad\xa7\x69\x62" + "\x06\x6c\x0a\xb7\x1a\xb7\x89\x9f\x25\xe0\xb8\x3f\xf9\xb8\x3d\x50" + "\x8f\x71\xdb\x9a\x7c\xdc\x1e\x08\x74\x3f\x6e\x0f\x44\x30\x6e\x5b" + "\xaf\x1c\xb7\x89\x59\xd7\x6e\x53\x4c\x9c\x12\x3f\x66\x13\x9d\xd7" + "\x3e\x66\x13\x37\x25\x1f\xb3\x89\x7b\x93\x8f\xd9\xc4\xc3\x6a\xcc" + "\x26\x86\xe2\xc7\x6c\xe2\xf1\xf8\x31\x03\xdd\xfe\xce\x31\xc3\xf8" + "\x1c\x53\xfe\x09\x93\x1e\xc5\xba\xbd\x57\xbb\x67\x52\x6e\x80\x26" + "\x67\xa9\xb5\xf5\x64\x35\x77\xa8\x31\x7c\x0f\x65\x72\xae\x9c\x07" + "\x26\x15\x1a\x69\x3f\xbb\x72\x1c\x26\x6d\x80\x8e\x6e\xad\x2f\x93" + "\x67\x5b\x6a\x0c\x99\xe6\x28\xe7\x5b\xcd\xe7\x53\x93\xa4\xff\x3a" + "\xc6\x58\xf8\xc3\x11\x62\xbd\x8e\xf2\x21\x86\xc3\x77\x22\x13\x60" + "\x35\x5d\xcb\x1c\xdf\xbd\x4f\xcd\x88\x63\xbe\xf2\xbb\x00\x6f\xf2" + "\x57\x8a\x57\x27\x27\xda\xbf\x35\xc8\x3b\xa4\xf8\xf4\xc7\x2f\xc4" + "\xe3\x30\x79\x66\x72\x3e\x9d\x5c\x84\x3e\xd4\x24\xe7\xd3\xc9\x1b" + "\xbb\xe7\xd3\xc9\x18\x7f\xaa\x89\x59\xfb\x64\x3e\x1d\x09\x24\xac" + "\x7d\x26\x1f\xb5\x85\x14\xef\x48\x9b\xa8\x62\xc4\x31\xe0\x9c\x68" + "\xff\x61\x6c\x1e\x5c\x64\xe0\x3c\x2f\xbe\xfe\x83\xdd\xd8\x7f\x0f" + "\xb2\xfd\xf7\x5e\x72\x9c\x1f\xbc\x8a\xfd\xf7\x20\xdb\x7f\xef\x5d" + "\x29\x5b\x0f\x1a\xf6\x5f\xb2\x35\xde\x83\x9b\x92\x8f\xff\x83\x09" + "\xe3\x4f\xf9\x25\x58\x0f\xcb\xfa\xf1\xe5\x8e\xc5\x96\x63\xdf\x24" + "\x2e\xcb\x3c\x92\xa4\x6c\x38\x11\x66\xf2\x72\x3f\xd6\xae\xe0\x3d" + "\xf6\xa5\x4a\xca\x7b\x3f\xce\x55\xf2\xf8\xe3\xbd\xf1\xf2\xf8\xe3" + "\xb9\xf1\xf2\xf8\x60\xc2\xd8\xfd\x78\x43\x7c\x3e\xf8\xe7\xbf\x4d" + "\xc7\xfe\x38\x94\xc0\x03\x9f\x9c\xa6\x29\x4b\x14\x0f\x4c\xf9\x53" + "\x3c\x1e\x53\xd2\x93\xf3\xc0\x94\x21\xe8\xff\x27\xc9\x79\x60\x4a" + "\x4e\xf7\x3c\x30\x85\x7d\x7c\x3e\x89\xe5\xdb\x19\x65\x39\xbd\x12" + "\xca\xb8\x93\xeb\xbc\x29\x55\xc9\xf7\x08\xa6\xd4\x29\x1a\x4f\x69" + "\x89\xa7\xf1\x94\xa3\xf1\x34\x44\x5f\xfe\x7e\x1a\x76\xc6\x26\x68" + "\xf7\x3c\x94\x28\xff\xfe\xd3\xf4\x90\x21\xff\x3f\x79\x3f\x1e\xc7" + "\x87\x66\x2a\x5c\x92\xed\x8b\x3c\xc4\xeb\x5f\x7f\x72\x5a\x3e\xb4" + "\x29\x79\x9f\x1f\xda\x8b\x39\xc8\xaf\x5f\x21\x4b\x0f\x1d\x46\xfa" + "\x0c\xde\x0f\xe5\xfd\x90\x3d\x48\x9f\x11\xa1\x34\x39\x5f\x75\xce" + "\x4b\x0f\x05\xd8\x17\x85\xe9\xcf\xfc\x6b\xeb\x4f\xec\x37\x64\x67" + "\xbc\x0a\xca\xa4\xdf\x82\x6d\x03\xf3\xfa\x20\xe6\xf5\x9f\x48\xfb" + "\x8f\xcf\x59\xd8\x8f\xd0\x56\x4a\x79\xfe\x50\x84\x4c\x7e\xe7\xf2" + "\xf1\xb0\x7f\x32\x8e\xe5\x82\xcb\x9b\x65\xd5\xbe\x99\x3b\x81\xbf" + "\x7f\x32\x37\xf9\x18\xff\xa4\xac\x7b\xde\xf9\x49\x95\x1a\xe7\x9f" + "\x1c\x8b\x1f\xe7\x9f\xd4\xe9\x9e\x3e\x33\xb9\xaf\x01\xd0\xf9\x5a" + "\xc6\xb8\x44\x13\xc1\x6e\xf5\xfd\xfa\x27\x4f\x14\x97\xd3\x2d\x67" + "\xe8\xa7\xa3\x64\x7b\x16\x11\xb6\xad\x4b\xa1\x7a\xa9\x03\x7e\xfa" + "\x92\xc4\x13\x65\x0a\x22\x64\x11\xeb\x17\x9e\xe0\xbc\x1a\x8f\x08" + "\xa3\x5c\x13\x9f\x09\xf0\x9d\x62\xf0\xc2\x8d\xa7\xe8\xa7\x53\xe3" + "\xea\x5b\x89\xfc\x0a\xc6\xc6\x1a\x29\x8f\x3f\xdd\x60\xee\xe9\x6e" + "\xc0\x7b\xf2\x7d\xdf\x9f\xee\x33\x7d\x1f\x94\xcf\xd8\x4f\xbb\x3d" + "\xbf\x64\x9c\xf8\xde\x0c\xe3\x74\x75\x3d\xf0\xd3\x88\xc9\xbf\xca" + "\xd7\x32\x37\xbd\xcb\x97\x2f\xd7\x81\x3c\xdf\x55\xf6\x06\x63\xe4" + "\x20\x77\x52\x2c\x1c\x15\x9f\x23\x37\xdf\xf4\xc7\xc3\xf3\xdc\x6f" + "\x81\x65\xe0\x93\xbb\x29\x01\x9f\x6a\xd8\x29\x25\x06\x8c\x7d\x57" + "\x83\xc1\x63\xae\x78\x96\xf9\x21\xd7\x77\xb5\x3d\xbf\x54\x07\xe5" + "\x6d\xbb\x82\xb7\x72\xa5\xbd\xc4\x30\xae\x8e\xe3\x54\x67\xdc\xda" + "\x42\x9e\xdd\xf3\xd9\xd6\xd4\xa8\x92\xfb\xa9\x09\x7b\x84\x53\x73" + "\xa5\x3f\x95\x21\xf7\x4f\x47\x12\xe5\x60\x6a\x91\x39\x47\x27\xa4" + "\x6f\x30\xe5\x1e\xeb\x5a\x86\x9b\xb0\xcf\x3a\x75\xaf\x92\x85\xa9" + "\x11\x3d\x23\x76\xbd\x36\x55\xda\x7f\xe6\x7e\x29\xf2\xf7\x26\xd4" + "\x4b\xd8\xff\x9b\x9a\x2b\xba\xdf\xa7\x4f\xc7\xf8\x86\xf8\x6c\x4b" + "\xc5\x28\x98\x36\x34\x61\xbf\x22\xb8\x45\xde\x41\xff\x0b\xe0\x4e" + "\x33\xf4\xde\xf4\x37\xe2\xdb\x9b\x96\xeb\x3a\x7b\xb5\xfe\x4f\xeb" + "\xa6\xff\xd3\xba\xfa\xbf\x58\xc2\x4d\xd8\x4b\x9c\x26\xfb\x1f\xbd" + "\x42\xff\x4d\x3b\x0c\xfd\x65\xd2\x0d\x36\xf7\xf4\x9b\x4c\x5b\x9d" + "\xf7\x0f\xba\xb7\xd5\xa7\x75\xed\xff\xc9\x7a\xd3\xba\xf6\xff\x82" + "\xc9\x6c\xf5\x00\xc9\xb3\xd5\xb8\xb6\xa7\x8f\xb1\x55\x27\xeb\xcb" + "\xf4\x6e\xf6\xff\xa6\x1b\xfb\x7f\xd3\x7d\xf1\xfa\x6c\xba\x3b\x7e" + "\x0c\xa7\x25\x8c\xe1\xf4\xda\xf8\x31\x9c\x96\xfb\x5f\x9d\xd7\xf0" + "\x4e\xa9\xa9\xa9\x96\xd4\x14\x4b\x4a\x2a\xb2\xd1\x45\xea\x95\x6a" + "\x4d\xed\x81\xbf\x9e\xc6\x6f\x2f\x4b\xaa\xc5\x8a\xbf\x1e\xc6\x6f" + "\xcf\x84\xf7\x5e\x5c\x17\x7f\x56\xe3\xb7\x47\xc2\x7b\xcf\x6f\xc9" + "\xef\x65\xb4\x6b\xb6\x6f\x4d\x78\xef\xf1\x2d\xf9\x3d\xff\xce\xfa" + "\x74\xc5\x7b\xbc\x1f\xda\x43\x8b\x57\xcc\x29\x5a\x30\x57\x9e\x17" + "\xcf\xd3\xe6\x3c\xfb\xec\xbc\x65\xcb\xb4\x92\xe7\xb5\x07\x26\x3c" + "\x72\xd7\xbd\x9a\x3a\x76\x2e\x1a\x7f\xeb\xdc\xde\x34\x75\xe5\x52" + "\xce\x98\x3a\xe3\xa1\x7c\x2d\xef\x81\x09\xf1\x99\x26\x18\x79\xbc" + "\x7c\x35\x28\x31\xf2\x97\xf3\x52\x5f\xa2\x4d\x7d\xa5\xee\x69\x66" + "\x3f\x5f\xb5\xe7\xf1\x58\xc6\x31\x70\xbf\xb8\xec\x12\xbe\x41\x7c" + "\xa6\xff\xf0\x1f\xb9\x13\xc3\x6a\xdd\x54\x3c\x9f\xef\xaf\x3c\xfc" + "\xa5\xf8\x38\x48\xda\x4f\xc8\x72\x8a\x9e\x1c\x58\x3f\x05\x65\xf1" + "\xee\x6f\x8e\x90\xe6\xa2\xb4\xd3\xf4\xe8\xa7\xc8\x4b\x11\xf7\xe9" + "\x48\x0b\x19\xbe\xd0\x33\xff\x5d\xa6\x7d\xec\x36\xcb\xd9\x4e\xd3" + "\x23\x2f\x88\x8f\x85\x7c\xe7\x7b\x42\xaa\xdc\x23\x8f\xeb\x9e\x87" + "\x1d\xac\x1b\xaa\x2b\xc9\xba\xa7\x92\xe8\xf5\x4c\x4a\x7b\xbd\x2f" + "\xc7\xea\x78\x24\xd7\x3c\x0b\x7d\x09\xef\x01\x7a\x52\xe3\xb6\xb9" + "\xac\x6e\x79\xf8\x01\x59\x3e\x33\xae\x7c\x59\xd7\x59\xec\x23\xb9" + "\x16\x94\x9b\xfe\x15\xd9\xc2\x99\xb7\xef\xf3\x97\xb9\xc9\x16\x15" + "\x5f\x0f\x9f\x42\x29\x8d\xb0\x84\x57\x45\x44\xc4\xb7\xf4\x0c\xb7" + "\xff\x27\xdb\x2a\xf1\xb5\x1f\xda\x7a\x6a\xab\x4b\x6c\x39\x4b\x56" + "\xc8\x75\x8a\x6f\x29\xfb\x29\x3c\x52\xb7\xe7\x1b\xb2\x82\x06\xfd" + "\xcf\xd0\x8c\x40\xd9\x54\x11\x75\x4d\x25\xeb\xbf\x96\xb2\xcf\xa1" + "\xf3\xc1\x2d\x7f\x26\xeb\xaf\x2f\xbb\x2d\x97\x85\x83\xca\x4a\x44" + "\x8b\xe0\x18\x3e\x21\x11\x66\x3f\xff\x63\xb3\xa3\x5c\x66\x74\xbb" + "\xcb\x41\x8d\x25\x21\x5a\x7b\x52\x84\x37\xfe\x59\xdd\x0f\x68\x68" + "\x0d\xb1\x0f\x63\xda\xda\xa9\x94\x7a\x3a\x9f\x2c\x0d\x85\x55\xe4" + "\x9f\x15\xa2\xb2\x93\xa2\xe5\xd8\xec\xaf\xa8\xb1\xb0\x8e\x0a\x4e" + "\x90\xe5\x58\xf3\xe7\x24\xe3\xd0\x54\xee\xf0\x96\x5f\x24\xc7\xda" + "\x05\x9c\x76\x91\x56\xaf\xa5\x1b\x56\x7f\x46\x36\x7f\xcb\x09\xb4" + "\x73\x96\x9e\x38\x4e\x29\x80\x67\x59\xf3\x39\x39\xd6\x3c\xce\xbe" + "\xbe\x39\x54\x5d\x4e\x0e\xe1\xca\x4e\xbf\xec\xca\xb6\x5f\x16\xd9" + "\x99\xed\xae\xec\xac\xc6\x62\x94\x6f\xfe\x88\xfa\x9c\xa0\xac\x8f" + "\xcf\x9c\xb0\x54\x5d\xa0\xfe\xda\x34\x1e\xff\x19\x27\xab\x2f\xa0" + "\x7c\xe5\xa2\x1c\x1d\x75\x63\xeb\x44\x32\x16\xe5\xfb\xf3\xc3\xa4" + "\x03\x56\xd5\x65\xea\x5f\x7d\x99\x1c\x7a\xc5\xa2\x1c\xa6\x45\x47" + "\xe5\x88\x7d\xd0\x85\xbd\xde\x7b\xe6\xa0\xd5\x7f\xac\x95\x1a\x42" + "\x97\xa9\x91\xfe\x42\xfe\xd2\xbf\xfa\x7e\xfd\xcc\xc1\x1e\x3a\x98" + "\xdf\xb7\xba\x19\xf0\x15\xcf\xb8\x1a\xf8\xbe\xb2\x9b\xb6\x96\x53" + "\x7a\xf1\x6a\xea\x75\x06\xe9\x6a\x4d\x3f\xa8\xce\x1f\xf9\xab\x6f" + "\xb5\xf4\xc3\x7d\x52\x2b\x6f\xa0\xd4\xc6\x50\x15\xfb\x7b\x5a\xa2" + "\x99\x3b\xbc\xfe\x50\x13\xf9\x8b\xbf\xf0\xe9\xf6\x1d\xa5\x9b\x74" + "\x4a\x7b\xe7\x52\x93\xc5\x6f\xbd\x44\xfe\xfc\x10\x7d\x82\xb6\x45" + "\xe5\x0e\x3e\xf3\xcc\x69\x0c\x85\xf9\x9e\x93\x53\xb4\x39\x7a\x6f" + "\x5d\x4a\x43\xf7\x5c\xa0\x21\xbb\x2f\x50\xb6\x68\xcf\xb6\xb0\x6f" + "\x2d\xdf\x4f\xdd\x8d\xdf\xf4\x66\x4a\x43\x7f\x95\x1f\x76\x86\xe1" + "\x63\xdb\x91\x4d\x35\x97\xbb\x7c\x6c\x2f\xb7\x75\xf9\xd8\x82\x97" + "\xf2\xd8\xcf\xf6\x14\x3d\x92\xc6\xfc\xbc\xf5\x1c\x59\xd7\x9f\x23" + "\x1a\xee\xb6\x90\xf6\x0c\xdf\xab\x78\xf4\x03\xff\xdc\xb3\xf2\xf9" + "\x14\x3d\x5a\x84\xdf\x74\xfc\xa5\x20\x5d\xee\x67\x37\x1b\x7c\x8b" + "\x34\x0b\xd2\x1e\xc5\x6f\x2a\x7e\xa7\xba\xaa\x45\x50\x78\x47\xb2" + "\xcf\x69\x6f\xe6\x5f\xe5\xcf\x3b\x92\xda\x3d\x8f\xc2\xfe\x79\xae" + "\xc8\xe4\x63\xa5\xd3\x1f\xc9\xfb\xe4\xf4\x59\x8e\x0b\x15\x94\xf8" + "\x74\x14\xa6\x70\x8c\x28\x23\x9d\x71\x78\x87\xdb\x45\xfb\x5e\xfc" + "\xda\xf0\xc7\x72\x39\xc4\xac\xdb\xd6\x51\xc8\x6d\xfe\x12\xe9\xc2" + "\x4c\x47\x7f\xad\x9c\xf7\xdb\xd3\x67\x2d\xaa\x4c\xb6\x05\x30\xc3" + "\x06\x7c\xc8\xfa\xc3\x21\x96\xe9\x36\x8b\x4d\x1c\x99\x3b\x8a\xaa" + "\xfb\x8a\xa6\xdd\xaf\x89\x7a\x25\x6b\x8f\xa2\xed\x85\x75\x8c\x23" + "\xe6\xed\xfa\x4d\xc8\x3b\x82\x55\x2c\xd3\xa5\x7e\x36\xfb\x8f\x3d" + "\xc6\x71\xa3\x86\xc4\xf6\x41\x78\xa6\x87\x79\xee\x7c\xb7\xdc\xd7" + "\x43\x58\xf2\xc2\x8d\x81\x56\xfa\xf5\xe5\x96\x1e\xae\x3f\x91\xc5" + "\x1f\x39\x45\x23\xb2\xc8\xc1\xf6\x5f\xcd\x6b\x22\x80\xdf\x16\xf6" + "\xe7\x04\x9f\xfc\xe0\x0c\x3d\xf6\xe8\x3f\x65\x51\xd6\xbf\x95\x92" + "\xa1\x8f\x1e\x5b\xd4\xa5\x8f\x9e\xb8\xd8\xd0\x7c\x30\x46\x17\x3d" + "\xf1\xcb\x2b\x75\xd1\xe3\x6f\x28\x5d\x24\x22\x4a\xf7\x44\x03\x46" + "\xfa\xe6\x84\x74\xc3\x2f\xe4\xf1\x25\x09\xe9\x61\x23\xfd\xa9\x84" + "\xf4\xa0\x4a\xcf\xdf\x6d\xea\xba\x46\xc6\x63\x25\xeb\xba\xfc\x75" + "\xac\xeb\x1a\xe7\x1a\xba\x4e\xfa\x18\xe6\xcf\x13\xbf\x70\x13\xdf" + "\x59\xc2\xf3\x78\xc6\x5f\x7c\x4c\x26\xee\xd7\x9d\xa6\x9f\x45\x39" + "\xcd\xfb\x17\xb2\xe2\x4f\xea\x39\xe1\x79\xb8\x80\xf5\x1c\xeb\x38" + "\xf6\x3b\xd9\xd5\x57\x9c\xd8\xf5\x9a\x38\x5e\xfd\x9a\x38\xd6\xee" + "\xf9\x59\x91\xa9\xef\x5e\x41\xda\x26\xa4\xbd\x82\x7c\xd6\x7b\x4c" + "\x93\x86\xfc\x83\x1c\xc7\xa1\x19\x7c\x3c\xc9\x96\x42\xc5\x5b\xc0" + "\xf3\x7c\xbf\x70\x03\xe8\xeb\x2f\x09\xc9\xbb\xa9\x32\x9e\x92\xc5" + "\x09\x1d\xd5\xcc\xf2\xd6\x77\x3d\xe4\xcb\x5f\xfa\x15\x95\x87\xc4" + "\x19\xbe\x67\xc7\x38\x14\xac\xfa\x09\xdf\x15\x4d\xa9\x87\x75\xc1" + "\x7e\xe0\xec\xaf\x02\xbd\x6b\xf5\x02\x27\x15\x23\xe5\x67\x58\xff" + "\xd7\x18\xf7\x98\x9e\xd4\x38\xfe\xd8\x29\xfa\xd9\x18\xac\xef\xc2" + "\xdc\x37\x5b\xd4\x4d\x7c\xef\x05\x32\xca\x6b\xbc\xc2\x5d\xf8\xf3" + "\x9a\x77\x5f\x38\x16\x1d\xca\xf8\x4f\x84\x89\x71\x0e\xd0\xcf\x36" + "\x34\x94\x1d\xe4\xfa\xd9\x4c\x1b\xe1\x71\x99\x30\x52\xe4\xdd\x19" + "\x0f\xa5\xf1\xdd\x99\x00\xe5\x3b\x94\x4d\x33\x62\x5f\xc3\xac\x20" + "\xb1\x9e\xf7\xb7\x00\x46\xd9\x29\x05\x03\xb0\x04\xf4\x7e\x5c\x9e" + "\x01\xff\x86\xb5\xe2\xeb\x53\xf4\x58\x88\xc7\x8b\xef\x41\xf2\xf9" + "\x1a\xe8\x92\xce\xbe\xf1\xca\xf6\xfc\xd9\xda\x9a\xbf\x10\x19\x77" + "\x39\xc1\x6f\x3f\x2b\xe3\x7b\x4a\x7c\x7f\x53\xde\xdd\xb4\x8c\x22" + "\xb1\x32\x3b\xbd\xf3\xfe\xe6\xff\x81\xbb\x9b\xa0\xbf\x63\x8f\x45" + "\xd4\x01\xff\x32\xbe\xbf\x09\xfc\x4f\x32\x1f\x1a\x7d\x72\xbf\xfa" + "\x04\xd3\xfc\xb1\x7a\x4e\xc3\x5a\xf1\xa8\x39\xfe\xdc\x5f\xee\x0b" + "\xf2\xf6\x29\x9b\x50\x34\x05\xe8\x71\x37\xe7\x23\x6d\x3b\x97\x1f" + "\x01\x3d\xe6\x9f\x1b\xa5\xf7\x4e\x47\x2d\x5b\x57\x93\x55\xe9\xb4" + "\x27\x5e\xe7\xfa\x4a\xa7\x3d\x91\xd7\xa5\xd3\x9e\x98\xac\x74\x9a" + "\xa2\xb1\xd2\x69\x4f\x8c\x55\x3a\xed\x89\x91\xf2\x1c\x0c\x3a\x8d" + "\xf3\x58\xaf\x99\x3a\x6d\x77\x5f\x71\x94\x75\x47\xbb\xe7\x09\xcd" + "\xd4\x6d\x9b\x91\xc6\xba\x83\x71\x54\x7a\x2a\xbf\x54\xfc\x7f\xd9" + "\xa4\xfc\x0c\xf8\xb9\x90\xef\x2b\xb4\x18\xcf\x18\x97\x27\x2a\x94" + "\x8e\x7b\xa2\xa4\x4b\xc7\x3d\x1e\xee\xaa\xcb\x3a\xee\x89\x97\x94" + "\x8e\x53\xe9\x35\x4f\xb0\x8e\xcb\x2f\x65\x1a\x18\xf0\x2d\xbc\x67" + "\x67\x94\x67\x3a\xba\x63\x75\x5c\xbc\x7c\x3d\x71\xcc\xd4\x71\xac" + "\xdb\xf0\x0e\x1b\xa4\xf7\x51\x29\x6f\x28\xb7\x1d\x34\x37\xe5\x8e" + "\xc7\x80\xfb\xcc\x71\xc6\x98\x6e\x13\xcf\x52\x2f\xe3\xae\x90\xd1" + "\xef\x27\x1d\xa6\xaf\x63\x80\x9e\xd0\x92\xd9\xcd\xa6\x9d\x06\x7e" + "\x1c\x10\xe5\x38\x1d\x6e\xcc\xa5\x55\xc2\xdd\x18\x39\x4e\x4f\x97" + "\x90\x45\x4f\x5d\xf8\x25\x8f\x2d\xd6\x19\x3d\xf9\x97\x75\x0f\xe6" + "\xd0\xa7\x0a\x42\xd4\x13\x6b\xf3\x2f\xb7\x5a\x90\x57\x4a\x3f\x8a" + "\xc9\x5b\xc5\xed\xc4\xd4\x1b\x16\x93\x27\xe3\x51\x0e\x3b\xc7\x31" + "\xe6\x9e\xcc\xe9\x6e\xed\x7f\x8d\xb8\xfc\xad\x7b\x5c\x66\xf5\xe8" + "\x1e\x97\x59\xd2\x0e\x18\xd6\x4a\x29\x58\x9b\x65\x9c\xa3\x27\xe5" + "\x7e\x8c\x8c\x7b\xb3\x3e\x59\x3b\xb3\x1e\x36\xf2\x7b\xc4\xe4\xc7" + "\xb6\xb5\x24\x49\xfd\xd8\xf6\x2a\xbe\x05\xfe\xfb\xdf\x02\xff\xdf" + "\xbf\x05\xfe\xd7\xac\x03\x41\x3b\x9b\x6e\x89\x2f\x37\x3c\x22\x65" + "\xf0\x28\xdf\xd7\x3b\x43\x4f\x7d\xdf\xd8\xf3\xf9\xd2\x35\x50\xae" + "\x05\xe5\xbd\xad\x2d\xc8\xe7\x7b\xf9\xac\x9f\x27\x61\x04\xd5\x19" + "\x75\x67\x9d\xa9\x89\xb8\xf5\x89\x98\xb8\xc9\xfc\x45\x89\xb8\x21" + "\x7f\x58\x4c\xfe\xe6\xae\x71\x7f\xea\xaa\xfe\xf5\xfe\x2a\x92\x31" + "\x38\x8f\x60\xf9\x82\x39\x99\xe3\xfe\x19\xfb\x33\x4f\x35\x43\xcf" + "\x3b\x63\xfc\x76\x5b\xa1\xdb\x07\x70\xfc\x05\xb6\x7d\xb7\xaa\xf5" + "\xf0\xf7\x30\x9f\x64\xf2\x7d\x1d\xbe\xbb\x53\x10\xcd\xb3\x1c\x29" + "\x63\x19\x7a\x5a\x33\xeb\x76\xb7\x0f\xc4\xed\x1a\x6d\xb2\x0f\x6c" + "\x08\x75\x66\x9a\x75\x18\x36\xfb\x51\x62\x1e\x18\x20\xef\xbc\x46" + "\x5a\x59\xef\x7e\x0f\x76\x72\xa6\x6a\x67\x36\x19\xed\x6c\x44\x9d" + "\x6e\xef\xaa\x5f\xbd\x7f\x4f\xd7\x5f\x7b\xff\xc8\xe8\x5f\x01\x7d" + "\x4b\xff\xae\xd2\x6e\xc1\xb8\x6b\x6f\xd7\x6e\xb6\x5b\x7a\xed\x74" + "\x2d\xd8\xff\xdd\xe9\xea\x34\xe8\x5a\x10\xf8\x16\xba\x26\x69\x67" + "\x76\xd6\x77\x6f\x47\x33\xda\x99\x3d\x25\x59\x3b\x24\xff\x75\x7b" + "\xaf\x2b\xcd\x8c\x81\xc9\xf1\x60\x55\xbc\xbb\xd9\xde\xd8\x58\xbf" + "\x2a\x4e\xec\xec\xbd\x66\xac\x5f\x23\x16\x2d\xe6\x96\xd9\x9f\x16" + "\xd4\xb2\x3d\x22\xf4\x00\xcd\xae\xe7\xf8\xaa\x93\xd6\xaa\x3b\xe3" + "\x46\x9d\x13\x57\x8b\x31\xcc\x71\xb6\x84\xc8\xa7\x23\x55\xd2\x1f" + "\x00\xf3\xd0\x9c\x0c\xbe\x1f\xa0\xce\x33\xe7\xf4\x57\x32\x39\xa7" + "\x3f\x60\x17\x76\x0f\xa3\xc8\xb9\xb7\xdc\xd9\xa3\x3b\x9f\x7f\xd4" + "\x9f\x15\xa0\x45\xd2\xde\x8b\x56\x8e\xad\x12\xe7\x1d\x46\x9c\xbf" + "\x67\x0f\xc5\xc4\x21\xc4\xdc\xfd\xcc\xdf\x8c\xbb\x09\xa0\x81\x1b" + "\xb4\x9c\xb3\xdd\xa4\x81\x99\x8e\xb4\x7d\x26\x0d\x60\xaf\xa4\xfb" + "\x6b\x23\x7c\x77\x28\xa4\xee\x89\xcf\x69\x10\x15\x45\x9a\x82\xfd" + "\x8c\x3a\x67\xc8\x1c\x5b\x15\x5a\xe3\xb0\x98\xf5\x87\x68\xae\x6f" + "\x98\x87\x83\x19\x45\x1a\x60\x85\x4c\xf8\x82\xf1\x12\x5d\xe5\x6a" + "\xa4\x5f\xd2\x33\x18\xff\x02\x15\xdf\x11\x6d\x48\xdc\x2d\x94\xaa" + "\x03\x7f\xf4\xc1\xe2\x2f\x0e\xb1\x9d\xda\x1a\x45\xff\x59\xd7\x1d" + "\x58\x1c\xb0\x72\x19\x69\x3b\x9c\xcf\xb6\xa8\x18\x8a\xcf\x2c\xd2" + "\xcf\x73\x4c\x1c\x89\x57\x3a\xfa\x7c\x90\x71\x0a\xe0\x37\xb8\x26" + "\x9b\xa6\x5f\x24\x83\x16\xcf\x3c\xaa\x23\x5d\x5f\xd6\x85\xc3\x1e" + "\x79\xc7\xe3\x99\x2a\x13\x07\x9d\xdb\x6f\x77\x58\x60\x8b\x71\xbb" + "\x2d\xf2\xae\x25\xda\x1e\xc1\x31\xed\x38\x36\xc6\xca\x6c\x62\x1c" + "\x50\xe7\x98\x49\x6f\xa3\x8e\xd9\x46\x99\x2e\xdb\x56\xb4\x51\x74" + "\x3e\x02\x7b\xf0\x99\xc8\x95\x74\x7e\xd6\x1e\x43\xe7\x54\xe6\x2b" + "\xde\x63\x01\xfe\xef\x30\xbd\xf9\x5c\x43\x5b\xc1\x76\xd5\xb3\x13" + "\x8e\x84\xa4\xdf\x49\x3a\xc3\xd5\x41\x7f\x86\x01\xb8\xd7\x2b\x1a" + "\x3f\x9b\xdf\x49\x63\xb4\x2d\x30\x16\xeb\xd5\x9d\x14\xf6\x7d\x87" + "\xee\x78\xb6\xb4\xb3\x1d\xc6\xd5\xe5\xb0\xe8\xc2\xc1\xf1\x2f\x82" + "\x8c\x6b\x89\x26\xc2\x6c\x57\x4a\x3f\x26\xf4\xf5\x40\xf9\x09\x2b" + "\x6c\x4b\x8b\x6c\xab\x2d\x9b\xed\xfb\x34\xf9\x8c\xb6\xba\xe1\xef" + "\x43\x1c\x97\xd2\xec\x17\xfa\x92\xc6\xbc\x05\xdc\x61\xff\xcd\xfd" + "\x48\xf2\xcb\x0a\x1e\xa7\xb9\x6f\x70\x9a\x59\x0e\xef\xcb\xb9\x9c" + "\xf9\x8e\x3c\xf0\xd7\xdc\x7b\xd0\xaf\xde\x8c\x67\xd0\x25\x63\xbf" + "\xa0\xcf\x73\x4f\x30\x8c\x76\xcf\xdc\x9c\xb8\x7e\x76\xe4\x5b\x4d" + "\xbe\xe3\x33\xa2\x7a\x2d\x2c\x75\xa7\xa2\xed\xdc\x22\x53\x26\xb9" + "\xbe\x92\xb1\xb9\xee\x58\x5e\x0c\xb9\xba\xf8\xa0\x64\x20\xa5\x59" + "\x35\x8e\xa5\x39\x77\xb6\x8a\x03\x3e\x77\x7f\xe2\x78\x71\x1e\xc7" + "\x9d\x34\x68\xc8\xf2\x64\x3f\x45\x73\x6b\xb9\x6f\xe0\xb5\xd0\xd5" + "\xe6\x4b\x8e\x09\xc9\xb1\x3c\xb7\x29\x39\x02\x5d\xe6\x7f\x7f\x9b" + "\xba\xdf\x13\x52\xf1\x15\xe7\xfd\x40\x58\xde\x90\xe3\xc5\x7e\x79" + "\x32\x8e\x86\xbc\xfb\x3d\x8f\x7d\xdc\x44\x9f\xe2\x37\x64\x1c\x56" + "\xc3\x67\x2f\x58\x5f\x1c\x91\x71\xf8\x5c\x25\x7c\x17\x36\xc2\x6b" + "\x32\xe9\x93\x76\xa4\x24\x42\x33\xc2\x4c\xdb\x79\x45\x7c\xc7\x3d" + "\x24\x69\x31\xaf\xd4\xbc\xd7\xce\x71\x26\x39\x4e\xe9\x88\x08\xa5" + "\xb2\x4d\xa1\xb9\x38\x26\xc1\xfc\x3c\xb6\x49\x14\x4d\xc1\xf7\x16" + "\xd1\xa4\x78\x79\xde\xa7\x7c\x8f\x5d\x9d\x2f\x9d\x02\x7f\xa7\xfe" + "\xf5\x14\xcd\xfb\x0f\xb5\x2f\x63\xca\xda\xfc\x87\xf9\x8c\x29\x60" + "\xc0\x40\x5b\x98\xff\xe7\x4c\xba\x52\x2e\xe6\x7d\x6a\xae\x31\xf8" + "\x5e\x9c\x3a\xaf\xea\x82\x17\xa0\x79\x72\x5f\xba\x4b\x37\xfd\x01" + "\xb0\xe6\x3b\xaf\x94\x99\xf9\x93\x4c\x5e\x2e\x1e\xc4\x77\xab\xe7" + "\xa5\x71\xfb\xdd\xe9\x4c\xe1\x7a\x9c\xc7\x29\xed\xb4\x46\xa9\xdf" + "\x76\x5f\xa2\xeb\xfc\x6b\xfe\x3e\xb3\x0f\x26\x4d\x54\x1f\x7e\x9e" + "\xd2\x96\x39\xa2\xa9\xab\xef\x3f\x57\xfe\x66\x5d\xf9\x63\x63\x68" + "\xc3\xef\x63\x14\xdf\xcd\xc7\x9a\xe2\xd9\x7a\xc5\x8b\x2a\x4d\x64" + "\x16\x0d\xe6\x18\xb0\x0a\xc7\x05\x64\xf2\x7b\xbb\xe7\xe7\x43\x02" + "\x74\xfe\x98\x3a\x87\xfa\x39\xfa\x3f\xdf\xad\xea\xcd\x3f\xc6\xb8" + "\x24\xed\x67\x3c\x8e\x75\x3c\xc7\xaa\x58\x07\x3f\x7f\x9f\xf1\xd5" + "\x6e\xe3\x31\xfe\xf9\x5a\x6e\x57\xc6\x3d\xe8\x28\xec\x11\xea\xc8" + "\xa6\xb6\x8e\x42\xc8\x4f\xb6\x05\xed\x40\x5f\x9d\xdb\x67\xb4\xb9" + "\xd7\xc4\x95\x71\x83\xad\x98\xd6\x2e\x16\x24\xa7\x2f\xb7\x2b\xe3" + "\x31\x15\xf6\xc2\x5f\x1a\xfe\x7a\x7e\xd7\xf9\x18\x76\x6d\x4b\xb0" + "\x62\x74\x8e\xbe\x42\x1c\xe5\xf8\x5f\x58\x17\xb4\x6c\x05\xff\xf6" + "\x59\xe7\xa3\x3e\xa1\xa7\x2c\x05\xab\x28\x07\x6b\x5b\x12\x97\xc4" + "\x98\x3d\x3a\x7e\x57\x88\x51\x1c\xf7\x1a\xef\x4e\xe3\x7d\x28\xbf" + "\xb7\xad\x10\xb3\xda\x3d\x85\xf9\xe6\xd9\x9d\x8a\x59\x53\x58\xd8" + "\x19\xe7\x27\xf5\x49\xbe\xe7\xc3\x31\xa1\x74\x91\xba\xb0\x85\xdb" + "\x2d\xe0\xb9\x03\xed\xa1\x1c\xe6\xff\xd9\x32\x46\x4e\x30\xf5\xce" + "\x4c\xfc\x65\x77\x73\xc6\xd9\xc2\x78\xb5\x65\x8c\xce\x31\x71\xed" + "\x13\xca\xb1\x7c\x47\xdc\x42\x26\x6e\x48\x3f\xba\x55\xa5\x47\x38" + "\x46\x21\xfb\x20\xb6\x7b\x16\x64\x99\xb8\x9a\x38\x70\x7b\x7c\xaf" + "\x52\x64\x8e\x08\x70\x4c\x18\x6e\x2f\xb8\xa6\x90\xcb\xe6\x98\xf8" + "\x7e\x57\x5e\x2e\xaf\x16\x82\xe7\x16\x3e\x4f\xd2\xfa\x11\x35\x86" + "\x58\xa7\x2c\xd8\x7e\xa4\x3a\xc4\xf1\x3f\x4f\xa1\x8d\x2f\xdb\x44" + "\x21\xe9\x1d\x85\x49\xc7\x98\xeb\xa0\x7c\x93\xd4\x0f\x95\x23\xbe" + "\xd4\xc5\x14\x8e\x01\x7c\x8a\xe3\xae\xc2\xd6\x84\xdc\x2e\x88\xd4" + "\x97\xb5\xf0\x5d\x48\xe8\x9c\x05\x1c\x27\x34\xc0\xb6\x06\xd6\x29" + "\x1c\xbf\x22\x95\x75\x93\x6f\xc5\x28\x86\x11\xb5\x96\x92\xb5\xbe" + "\xf4\xbb\xc5\xd3\x0f\xd0\x73\xa3\x94\xec\x3c\x37\xca\x9c\x67\xf1" + "\x9c\x13\x7f\x2e\xfd\x5c\x76\xa2\xce\x7d\xe6\xf9\xe7\x4b\x0a\x96" + "\xce\xe3\x9f\xec\x5b\x97\xdf\xd1\x3b\x76\xed\xcc\x7a\x58\xc5\x31" + "\x78\x2e\x9f\xf7\xa9\xb6\x65\x9a\xe7\xac\xcf\x55\x99\x7b\x65\x86" + "\x3f\xf7\xfd\x6c\x53\xb3\xed\x89\xbc\x03\x9f\x96\xb1\xe8\x50\xca" + "\x97\x69\x64\x49\x6c\x6f\xfe\x9c\x92\x39\x45\xf7\xf2\x89\x4a\xef" + "\x64\xed\x1c\x8d\x6f\x67\x21\x75\xb6\xa3\xf4\x60\xc8\xc2\xe5\x2a" + "\xde\x76\x8a\x8c\xca\x26\x75\x97\x76\xe1\x10\x73\x0f\x24\xb9\x1f" + "\x9c\x53\x8b\x56\x2e\x72\xf3\xb8\xb8\xd6\x92\xe5\xb7\xab\x4f\x58" + "\xd8\x46\x29\xc7\x33\xaf\x0d\xa5\x5d\x64\xc4\x13\xfa\xf8\xc2\x09" + "\xcc\x33\x0b\x4b\x45\x85\x13\xeb\xaa\x85\xc5\xdd\xcd\x4f\xb1\x3e" + "\x04\xec\x73\xd6\x4c\x0b\xbd\xdd\x9e\xf7\x7b\xc7\xee\x53\x7a\x66" + "\xe1\x57\xf5\x0e\xe2\x71\x7f\xf1\x14\x2d\xfc\xd2\xea\xc0\x5c\xd2" + "\x8f\x7e\x85\xe7\xaf\xb8\x2e\xe7\xc5\x8d\xf3\x0f\xce\xd6\x5a\xc1" + "\x85\xe0\xc6\x14\xa1\xfe\x91\xd5\x78\x48\xc5\x9f\x45\xa4\xc8\xd3" + "\xb0\x54\x50\xb8\x57\x4f\x2b\xd9\xfa\xa4\xa7\x0d\xb8\xa5\xbf\xe3" + "\xfe\xfb\xc6\x8d\x71\x95\x97\x41\x7a\x23\x61\x9b\x88\x8d\x7f\x55" + "\x59\xfa\xe8\x1d\x6e\x92\xfe\x10\x15\x95\xa5\xc9\x70\xdd\xec\x11" + "\xc5\x7c\xf7\x58\xcf\x7c\xab\xd6\xb5\x9c\x2c\xef\x5d\x0e\x58\x38" + "\x06\x3b\xdb\x20\x1c\xa3\xff\x14\x15\x2d\xf9\x04\x69\xe8\x7f\xa9" + "\xf0\xbe\x55\xab\xce\x3b\x8b\xde\xd7\x2b\xdf\xaa\xed\x82\x6f\x25" + "\x86\xef\x7a\x9d\x2c\x7b\xcb\x5b\x2c\x7e\xeb\x7d\xe4\xd7\x42\xf4" + "\x09\x9e\x93\xd2\x12\x6d\x0a\x8e\xfb\x0a\x18\x35\x1e\x7d\xa3\xeb" + "\x1b\xb2\x18\xf7\x07\x2d\xe7\xa8\xe8\x6f\x75\xdd\xd4\xe3\xfb\xba" + "\x6d\x99\xa3\x7b\xb6\x7b\x16\x61\xfc\x73\xf6\x1a\x73\x1e\x74\xf3" + "\x22\xf0\xff\x42\x39\xdf\x21\xbf\x47\x9b\x8c\xf9\xbb\x68\x8a\x59" + "\x26\xe9\x18\xbd\xcc\x7b\xaa\xc2\xc7\xe3\x2a\x2e\xfd\xad\x85\xef" + "\x26\x74\xe3\xc7\xd0\xcb\x5f\x7a\x17\x9f\x23\xf5\xe8\x13\xa6\x74" + "\xd7\x45\xd1\x11\xf5\x50\x16\xd8\xdd\x12\xc5\xda\x32\x72\x49\xe4" + "\x37\xb4\x5e\x90\xb1\x29\x59\x7f\xbc\x3b\xff\x0f\x16\x7f\xf8\xbc" + "\xcf\xbf\x41\xa7\x46\xd8\x1f\xfe\xea\xf3\x3e\x15\xc3\x32\x4a\x0d" + "\xf4\x17\x6a\x28\xfd\x7f\xdd\x72\x2f\xa8\x5a\xb8\x99\xce\x1d\x97" + "\xc4\x4c\xbf\xf5\xff\x21\xfe\x86\x08\xeb\x42\xd0\x5d\x3b\x47\x8b" + "\x33\x3e\x06\x9c\xf7\xfe\x13\xb0\x64\xcc\xab\xf1\xf4\x09\x9e\xdb" + "\x3d\x8b\xfb\x9b\x7a\x32\x69\xac\x90\x14\xdf\x66\x5b\xe9\x53\x16" + "\x1d\x3a\x97\x63\x93\x41\xd7\x8e\xe2\x7e\xe1\xdd\xc9\xef\xf8\x1d" + "\xca\xbf\xb6\x75\xbe\xdd\xb6\xc8\x53\xac\x83\xf3\x59\xbf\x22\x7d" + "\x66\xcd\x25\xa9\x93\xf3\x8c\xf7\x5c\xe3\x7d\x8a\xf1\x3e\xc9\x78" + "\xcf\x31\xde\xc7\xf1\xbb\xd2\xdd\x8b\xeb\x3a\xe7\x15\x4b\xaf\x26" + "\xbc\xfb\xcc\xb1\x00\x3e\x37\xd8\x4a\xd7\xca\x39\xc0\xc0\x63\x94" + "\x81\x97\xd3\x78\x37\xf1\xf9\x81\x2d\xb2\xf6\xbf\x09\x9f\xe7\x73" + "\xe2\xf1\x79\x3e\x2f\x06\x1f\xb2\x95\xe6\x7c\x17\x7c\xec\x36\x8e" + "\x75\xff\x77\xe0\xc3\xb8\x70\x1a\xda\x6f\x4a\xc0\x27\x60\xe2\x93" + "\x94\xdf\x56\x88\x16\x9e\xff\x96\x7d\x5f\xc6\xe8\xed\xc5\x73\x5b" + "\xcd\x65\x33\xce\x5c\x71\xff\xab\xc5\x99\x83\x2c\x38\x50\x06\xfd" + "\x7f\xbe\xd5\x98\xe7\x0f\x2b\x7b\xb0\x78\xa6\xe9\xfb\x83\xbe\xee" + "\xdb\xaa\xfa\xba\x7f\x03\xc7\x5a\x5b\x45\x37\xbb\x4a\x45\x0b\xd6" + "\x37\xff\xb3\x5e\x0b\xc6\xc9\x40\x51\xc9\xb2\x65\x8b\xee\xd5\x8a" + "\xe6\x2c\x9e\xa7\xdd\x3a\x57\x5b\x56\xb8\x60\x7e\xc9\xbc\xf8\xf3" + "\x70\xbb\xf1\xdd\x11\xe9\xe7\xcf\x36\x37\xcb\x00\xf3\x3f\xeb\x6d" + "\xe5\x9b\xb9\xe4\x26\xe1\x29\x76\xb3\xae\xdf\x53\x49\x56\x3e\x83" + "\x01\x3e\xcd\xa6\x8e\x57\xb1\xf5\x29\x85\x75\x3c\xd2\x61\xc3\x2d" + "\x2a\x8b\x49\x47\xd9\x25\x76\x33\x8d\xe1\x1b\xba\xa9\xd7\x29\x2a" + "\x7e\x9f\xdb\x4c\x4a\xc3\x4b\x82\xef\xeb\xa7\x60\xbd\xc5\x6b\x5f" + "\xc1\x71\x93\xf8\xfe\x1c\xea\x09\xe0\x23\xcf\x14\xf9\xdb\x36\xca" + "\xb6\x17\x8c\xe3\x72\xd4\xd9\x8b\x34\xeb\x16\x94\xc5\x7a\xa1\x85" + "\xeb\x21\x7d\x33\xc7\x31\x40\x7a\x9a\x11\x0f\x8a\xd3\xde\xe0\x38" + "\x03\x48\xb3\xc7\xa4\x7d\xc0\x31\xcc\x91\xa6\x19\xf0\xfe\xc8\x74" + "\xc6\x7b\x8e\xb1\xa7\xc0\x65\xfe\xc3\x68\x37\x2e\x76\x10\x7f\x84" + "\xe2\xae\xe1\x4e\x6d\xe6\x8c\xd1\xe3\xef\x7b\xf6\xf9\xc5\xf3\x7b" + "\x93\x24\x7b\x36\xa6\x4b\xe7\x5d\xa5\x77\xdc\xab\x15\xcf\x9b\xb7" + "\x54\x5b\x39\x6f\x71\x89\x36\x67\xe5\x9c\x55\xbd\x69\xfe\xf3\x4b" + "\x9f\xe5\x5b\xf2\x3c\x2c\xcb\x0a\x9e\x9d\xff\x73\x76\x5a\x50\xa5" + "\x7b\xc7\xcd\xe3\x33\x59\xb7\x19\x71\x25\x8e\x6e\x65\x5b\x23\xe3" + "\xde\x62\x3c\x73\xbc\x25\x07\x7e\xeb\xf1\x77\x18\x7f\x07\xf1\x77" + "\x1c\x7f\x4d\x67\x68\x25\x7f\x3b\xe0\x40\xbb\x67\xe9\x06\xd3\x9e" + "\xe8\xe2\xa1\xa5\x55\x26\x0f\x61\xfe\x3f\xa0\xe6\xb7\xa5\x47\x1b" + "\x23\x52\x7e\x3a\x79\x6a\xeb\xa5\x2e\x9e\xe2\x78\x91\x8d\xec\x93" + "\xb3\x02\xf9\xe0\x61\x5e\xa7\x83\xe6\xd7\x31\xdd\x4e\xd3\xf2\x8f" + "\x6a\x5e\x13\xc7\x38\xd6\x09\x7e\xeb\xc1\x2f\xc7\x54\x7c\x91\x65" + "\x93\x50\x6e\x20\xda\x38\xac\xda\x30\xde\xfb\x8a\xa3\xbc\x8f\x71" + "\xca\x78\x57\x6b\xfe\xe5\x8f\xf2\x33\xff\x1a\x67\x61\x36\xf6\x6f" + "\x54\x6b\x47\x33\x6f\xd9\x59\xa3\x0d\x1f\x68\xe1\xde\xe3\x91\x36" + "\xb7\x5c\x63\xf1\x1e\x9a\x2d\xe5\x7e\x01\x7c\xce\xeb\xa9\x4f\x9e" + "\x90\xf1\x0b\xdd\x97\xa1\x23\xee\xbe\xdb\x5f\x2a\xcb\xa7\xf0\x1e" + "\xdb\xb4\x62\xa1\x73\x4c\x69\x3d\x75\xe1\x09\xae\x27\xec\xf7\x16" + "\xeb\x5b\x6e\xc8\x51\xb6\x00\xc7\x8d\x5b\x76\xd4\x80\x19\x66\xda" + "\x9e\xa1\xa5\xab\xd4\x7a\x6d\xa5\xf1\xbd\x81\x65\xc7\x4d\x5f\x39" + "\xc8\x68\x36\xde\x9b\x4d\x1d\x10\xa0\x65\x75\x86\x5f\x93\x4f\xf5" + "\xbf\xa4\xbf\xf1\x7e\xd0\xc0\x31\x85\x63\x59\x00\xff\x26\x1e\x3b" + "\xac\x7d\x0f\xe2\xf9\x38\xe8\x73\x4c\xd1\xa7\x44\xda\x80\xb0\x6b" + "\x38\xff\x38\x7f\xb3\x03\x79\xc7\x55\x9c\x88\x65\x33\xb9\xcf\x5d" + "\xbe\x8f\xd5\x39\xc0\xf5\x51\x3e\x33\x84\x2c\x1d\xf4\x5f\x62\xf9" + "\x5c\x96\x07\x78\x75\xa6\xde\x61\x3d\x53\x10\x85\x9c\x4a\xbb\xbb" + "\x64\x93\xa9\x6f\xba\xf8\xa0\xa4\x36\x99\x2e\x49\x36\xee\xc6\xd8" + "\x5c\x27\x3c\x4b\x9a\x81\x53\x9d\x1c\x03\x8e\xa7\x79\xa9\xd3\xbe" + "\xef\x50\x3a\xb2\x24\xd4\xb9\x16\x31\xf0\xe0\x38\xdd\x01\xc6\xed" + "\xb2\x3c\xc7\x35\xf4\xc6\xf2\xfe\xa6\xde\x30\xe1\xd8\x52\x84\x6e" + "\x2b\xc5\x7f\x5e\xa7\x8f\xf7\x90\x79\xbe\x94\xf6\x08\xe0\xf4\xb9" + "\xa8\xee\x30\xe9\x15\x4e\xcc\x49\x25\xc7\xa1\x63\xac\xd2\xe6\xf4" + "\x2c\x69\xef\xd2\x45\xcb\x8b\x63\x61\x0a\xbb\xd3\xc7\x70\x59\x1f" + "\xb1\x4d\x52\x10\xb5\x72\x1c\x11\x9f\x31\xbf\x40\x07\x2f\xaf\x35" + "\x71\x05\x0d\x8f\x9a\xf8\x1a\xdf\x4a\x3a\x1a\xa0\xe5\xc0\xbd\x83" + "\x7d\x79\xeb\xd5\x78\xae\x94\xfa\x06\x79\xfb\x51\xf7\x64\x80\x96" + "\x38\x0d\x19\x3a\x86\xfa\xfb\x8f\x94\x4f\x42\x99\xe5\x61\xc3\x1f" + "\xb5\x09\xe3\x7b\xbc\x8b\xf7\x97\x9e\x8d\xd9\x0f\x38\xae\xc6\xf0" + "\x3e\xf7\x29\x5a\x31\x26\x26\xdd\x18\xdb\x23\x79\x48\x3f\xab\xd6" + "\xd6\x4e\x23\x3e\xdb\x0a\xe5\xbb\x6b\xe0\xc8\xba\x80\xef\x5b\xb1" + "\x8c\x4b\xda\xcb\x31\x5e\x51\x6c\xce\x17\x80\x75\x40\xd2\xbc\xaf" + "\x38\xcc\x74\x52\xf1\x1a\x96\xf6\x55\x74\x5a\x51\x15\x47\x7b\x9e" + "\x37\xd1\x0e\xd3\xa9\xcf\x3a\xa1\xf7\x09\xa5\x88\x82\x55\x56\x19" + "\x73\x9c\x65\x9c\xcf\x5e\xc0\x1f\xd2\xae\x52\x74\x5b\x71\xc2\xa4" + "\x9b\x39\x76\x4c\xa7\x00\xad\x98\xc2\xb4\x8d\xef\x63\xaf\xa6\x53" + "\x66\xdf\x41\x53\xde\x0f\xc6\x7b\xab\x21\x17\xc7\x7c\xfd\xd8\x17" + "\x60\xe9\xd7\x47\xac\xa3\xe9\x48\xe9\x28\x52\xb4\x5d\x39\x26\x40" + "\xc5\x55\x31\xeb\x06\xbe\x67\xb6\x9f\x65\x05\x78\x1e\x36\x62\x27" + "\x1d\x55\xfe\x28\x4b\x39\x26\xed\x61\x29\xcb\x2b\x64\x8c\x0b\x8e" + "\xbb\xda\xc4\x34\x62\xbd\xc8\xb2\xc4\x32\xc0\xf2\xa4\x68\xb4\x72" + "\x7b\x0c\x8d\xea\x99\x3e\x06\x9d\x0e\x24\xe8\xf2\x79\x5a\xd1\x78" + "\xa5\x8b\xb5\xec\x5b\xe7\x8e\x90\x81\x4a\xb4\x07\x27\xde\xab\xe5" + "\x8d\xbf\xb5\xb4\x70\xe8\x34\xf5\x33\x31\x2f\x97\x7f\x7b\xc7\xaf" + "\xbb\x34\xb4\x13\x89\x5f\xbb\xad\xdd\xa8\xf4\x47\x69\x56\x20\xa5" + "\xb7\x3c\x47\xe5\xb8\xa1\x5b\x17\x13\xc7\xf8\x6d\xd9\x72\x06\x63" + "\x6a\x77\xce\xe2\x38\xb5\xd3\xb1\x66\x9c\x76\x51\x7c\x53\x83\xbc" + "\x3d\x48\xef\x53\xcc\xb1\xee\xbf\x10\x7a\x86\x73\x16\xaf\xed\x45" + "\xc5\x40\x2d\x98\x51\x59\x8a\xbf\x9c\x60\xc6\x68\xc7\xe4\x3b\x5c" + "\x02\x70\x8b\xcc\x7e\xf1\x1e\x00\xe8\x34\x6b\x7a\xa9\x88\x32\x8d" + "\x0a\x4a\x39\x9e\x34\x60\xa7\xf2\x1e\x40\x29\xfa\x5f\xd4\xa4\xd6" + "\x97\xa5\xe0\xff\xa5\xa3\x0c\x5d\x96\x87\x77\x8e\x7f\x91\x27\xc7" + "\xd5\xe3\x90\x71\xa8\xf5\xf5\x77\x3e\x82\xf5\x40\x8e\x09\x13\xb0" + "\x7a\x1a\xb1\xf6\x24\xbc\xef\xea\x17\xa9\x57\x8e\x9c\x69\x4b\x51" + "\x71\xfd\x20\xe3\xee\x1a\x8b\x9e\xdf\xe9\xf7\x80\xbc\x3e\xeb\xec" + "\xec\x17\x91\x0f\xde\x73\x73\x19\x33\x6f\xab\x47\x0f\x6c\xb5\xe8" + "\x61\x8c\xa3\x5d\xd9\xcf\xad\xac\x3f\xb1\xb6\x5c\xd5\xb9\xff\x2f" + "\xe7\x43\x0b\xb9\xd5\x7a\x66\x95\xdc\xf7\xb9\xe0\xb1\x12\x74\x76" + "\xeb\xa0\x2c\xb9\x46\x09\xeb\x9e\x14\x52\xbe\xa8\xab\x1e\x36\x75" + "\x2c\x9f\x27\xd9\xd6\x89\x20\xef\x25\xda\x22\x22\x28\x63\xa6\xf3" + "\xdc\x41\x67\xc8\x5f\xd6\xee\xe6\x58\xad\xd2\x06\x42\xbb\x6a\xde" + "\x88\xaa\x79\x03\xed\x07\x53\xef\x9c\x8d\xf9\x21\xe5\x0c\xad\xd2" + "\x18\x7f\xa6\x0d\xef\x57\xeb\xa0\x95\x9f\xe7\x49\xa6\x4f\xe6\x5d" + "\xc7\xd9\xa7\x81\xfb\x6a\x8b\xa0\xcf\xb1\xfd\xb2\xe8\x81\x2d\x1e" + "\xf4\xcb\x82\x7e\x95\x9e\x65\x99\x09\xb3\xaf\x09\xe4\xad\xaf\x8c" + "\x47\x2c\xd7\xcf\xab\x73\x62\xfb\xc8\xfa\x5f\xf5\x61\xf5\x9c\x64" + "\x7d\x14\x16\xee\x23\xd3\x60\xf5\x3d\x86\xbc\x49\x3c\x59\x7f\xb4" + "\xd2\xaa\x50\x9f\x75\xec\xe3\xe1\x9c\x05\xfd\x36\x91\xc7\x10\xf3" + "\xa7\x97\xf1\x4c\x36\x5e\x0c\x4f\xc1\x5a\x03\x1b\xda\x3d\x1b\xb8" + "\x1c\x4b\x4e\xef\xd5\x67\xaf\x4e\xef\xd5\x9f\x72\x7d\xc6\x83\x7d" + "\x5e\x6c\x11\x2c\xd6\xc1\xb7\x58\xaf\x6d\x4c\xd6\x6e\x9f\x75\xb5" + "\x8c\x57\xd2\x3c\xc1\xf2\x62\xe8\x20\xf0\xa1\x80\x9c\x08\xd6\x49" + "\xed\x9e\x35\x9d\xfb\x5f\xb6\x14\x2d\x55\xea\x07\x8b\xf0\x26\x83" + "\x61\x5b\xe7\x65\x1f\x93\x89\x68\x3f\x69\xbe\xce\xdf\x61\xf0\x3a" + "\xa7\xe8\xeb\xff\x69\x90\x2d\x85\xee\x0f\xa6\xfe\x53\x6f\x5b\x69" + "\x64\x08\xd3\x10\x30\x4b\x21\xc7\xcb\x79\x9d\xaa\xf6\x2e\xd6\xc0" + "\xfe\xdf\x24\xd7\xa5\xc1\x0c\xe7\x14\x15\x2b\x6c\x0d\xe6\xbf\x6d" + "\x9d\x7b\xb8\xed\x9e\x32\x6b\x80\x9a\xfb\x2b\xb9\xbc\x79\xa7\xa8" + "\xbc\xa7\x59\xf7\xd8\x84\xb6\xda\x06\x3b\xb2\x6c\xb7\x2e\x38\x2e" + "\xff\x3d\xcd\x5d\x7c\xa2\xfc\x5f\x4c\x3e\x41\xfd\x49\xc9\x79\xa0" + "\x6c\xde\xd5\x79\xa0\x4c\xee\xcd\x32\xdd\xd5\x5a\xa5\x6c\x93\x69" + "\xa7\x88\xf5\x37\xef\xd4\xca\x65\xfb\x9a\x6a\x9b\x69\x92\xc3\xe7" + "\x12\xb9\xa0\x8b\x1b\x65\x0f\x9a\x7a\x80\xf9\xc5\x16\xe5\x6f\x16" + "\x90\xe4\x69\xe4\xc1\xfe\x29\xce\x56\xfb\xa5\xa3\x6b\xe5\x77\xf7" + "\x3c\x2b\xeb\x82\xae\xc2\x5d\xec\xaf\x1a\xca\x70\xd6\xa3\x4c\x38" + "\x40\x9f\xc8\x98\xa4\x98\x83\x0f\x03\x86\x6f\x7b\x26\xe6\x68\xe5" + "\xb7\x95\xce\x32\xcd\x31\x7e\x58\xae\x91\x96\x05\xbc\x39\xde\x0f" + "\xd6\x3b\x6b\x9d\x9d\xf3\x92\x27\x07\xba\x42\x48\x3f\x1d\xcc\x4b" + "\xfd\xdb\x40\xbb\x57\x2d\xfa\xbe\x4b\x23\x1c\xc4\x7d\xbe\xb4\xbe" + "\xdf\xbe\x17\x87\x93\xf5\xff\x72\x3c\x43\xc5\x77\x51\xd6\xba\xd1" + "\x56\xfa\x5f\x63\xc8\xc2\x74\x08\xd0\xda\x1c\x45\xbb\xb5\x6e\x73" + "\x7c\x02\xb4\x46\xee\x8b\xf2\x5e\xe3\xf4\x88\xf8\x46\xed\x87\xae" + "\x85\xfe\x7b\xce\xa1\xf2\x4b\xaf\x38\xff\x67\x7b\x5e\x5b\xb0\x4c" + "\x9b\xfb\xfc\xca\xc5\x03\x07\xc6\xad\x95\xac\xf2\x0e\x8b\x67\xed" + "\x01\x35\x9f\xae\x6d\x31\xf1\x66\xbb\x04\xef\xe8\xff\xca\x2b\xf6" + "\x2d\x73\x0b\x0c\x37\xe5\x02\x27\x75\x3d\x8f\xa4\xdc\x91\x31\xaf" + "\x77\x53\xee\x5d\x77\x17\x3c\x32\x6f\xce\xdc\x55\x31\xa9\xf7\xc4" + "\xee\xeb\x6d\xdd\x89\xb6\x53\xfb\x3d\x00\x5d\x91\x32\x6d\x0d\xcf" + "\x2d\xe5\x9f\x97\x47\xc4\x5f\xa1\xaf\xc7\x40\xc6\x0a\x1a\x4a\x22" + "\xd4\x00\x5d\x26\x6e\x66\x1d\xde\x4b\xdd\xcd\x83\x3d\x05\xde\xb2" + "\xa1\xef\x41\xd8\x75\x17\x79\x7f\xe6\x34\xb9\x52\x1a\xab\x38\x26" + "\xef\x68\x63\xff\xbe\xfc\x30\xd2\x33\xf0\xfb\x15\x7e\x7b\xe2\xf7" + "\x6f\xda\x62\xac\x7b\xd8\x17\x7a\x05\xfb\x42\x97\x4b\x5f\x8f\xe1" + "\x21\x37\x0d\x5f\xca\x36\x7b\x79\x09\xdb\x20\x01\x72\xf1\x77\xf1" + "\x88\xcb\x22\xed\x23\xed\x39\x72\xf2\xaf\x90\x67\x48\xe5\x87\x45" + "\xc5\x68\x4d\xec\xca\xe7\x6f\x5c\x0d\x41\x9b\x03\x53\x53\xbe\xa4" + "\x54\x47\xaf\xf6\x76\x8f\x8b\xfd\x9f\x8e\x33\x9d\xba\xfb\x86\x26" + "\xd3\x39\xd1\x3e\xec\xb2\x0d\x5f\x26\x69\xdf\x1a\xf6\xdc\x1e\x39" + "\x2f\xb8\x4a\x62\x6c\x3a\x3e\x13\xec\xad\xec\x13\x11\x55\xf6\xa9" + "\x6b\xbb\x29\x07\x78\xae\x35\xf9\x34\x2e\x3e\xda\xe2\x92\x79\x4b" + "\xe7\xcd\xd5\x6e\x5d\xd6\x9b\x62\xa2\xa3\x15\xce\x5b\xac\x2d\x9d" + "\xb7\x64\xf9\xbc\x65\x32\xb2\x19\xe7\xc6\xcd\xf9\x59\x22\x73\xd4" + "\x4c\xf3\xde\x8e\xd6\x8f\xe9\xeb\xee\xc1\x31\xb5\x44\xe5\xa8\xe3" + "\x7c\xf6\xab\xd6\x1b\x6f\x1d\x8c\x5f\x6f\xac\xab\x52\x76\xde\x68" + "\xbb\x5a\xeb\xac\x1b\xc6\xef\xa7\xc8\x5d\xd7\x15\xbf\xdb\x3d\x07" + "\xb4\xb4\x28\xba\xa5\x05\xda\x3d\xee\x7c\x93\x6e\x01\x5a\x17\x30" + "\x6c\xa9\x56\xa9\x3f\x30\xc7\x42\xff\xc5\xcd\xaf\xea\xdb\x99\x6e" + "\xd6\xbf\xa9\x72\xbf\x37\x63\x74\x16\xb7\xc5\x30\xd1\x5e\x00\xe3" + "\x63\x87\xde\x64\xfd\xb6\xd1\x84\x87\x36\xa7\x70\x7b\xc6\x3a\xe8" + "\x7b\x67\x68\x9d\x26\xf5\xa3\x77\x74\x16\xeb\x14\x3e\x3b\xd5\x2b" + "\x00\x47\x9e\xe5\xad\x0b\xb0\x8d\x29\x63\xc8\x03\x16\xef\xd3\x42" + "\x37\x0c\xe1\xef\xac\x72\x9a\x8a\xed\xe5\xda\xcf\x7b\xc3\x68\x2b" + "\xbd\xdd\xb3\xce\xd1\xe5\x9b\xbe\x2e\xc0\x76\x27\xc3\x0d\x90\xfb" + "\x24\xc3\x53\xb1\xcb\xd6\x8d\x03\xef\x4c\xea\xb2\x9f\xd6\xb9\x63" + "\xd6\x65\x8c\x8f\xc4\x33\x04\x5c\x64\x9c\x4c\xe5\x3b\x28\xfb\xcd" + "\xfa\x73\xbb\xd1\x77\xb3\x3f\x80\x07\xfd\xe7\x72\x9a\x67\xcf\x01" + "\xa3\xdf\x8c\x1f\xe3\x1e\x8b\xb3\x81\xef\x41\xc6\x17\xf5\xea\x63" + "\x64\x9b\xf7\x65\x7a\x20\xed\x44\x97\x4f\xb2\x5b\x4b\xd4\x1b\xcf" + "\x2f\xd6\x8a\x16\x2c\x5e\x58\xb0\x72\xce\xc2\x79\x05\xcb\x8b\x87" + "\x6a\xcb\x17\x3f\x53\xf4\xfc\xb3\x0b\x99\x6b\x96\x95\x2c\x7f\x76" + "\xa1\xc6\x9a\xa5\x60\x52\x6e\x6e\xc1\x03\x8f\xce\x78\xbc\x37\x3d" + "\x30\x07\x69\x58\xf9\xe7\x3a\x87\xaa\xac\x47\x26\x4f\x7c\xac\x60" + "\xe2\xf4\x47\xa7\xcd\x94\x97\x16\x3a\xf3\x27\x2d\x4e\x5e\x20\x8e" + "\x0f\xed\xe0\xa5\x74\x8c\x6f\x8f\x53\xf4\xc2\x2c\x15\xef\xda\xb3" + "\x29\x3e\xde\xb5\x07\x6b\x59\x8f\x0f\x7f\x27\x89\x36\xd8\xf1\x87" + "\x75\xea\x0b\x79\x8a\xbf\xae\x7b\xa8\xdd\xe3\x39\xd8\xc5\x5f\x2f" + "\x48\xfb\x80\x7d\x39\xd4\xfe\xac\x07\xfa\xdf\x75\x22\x36\xaf\x6b" + "\x3d\xe9\x09\x76\xae\x27\x3b\x75\xca\xfa\xfe\xe6\xda\x12\x69\x0e" + "\xac\x2b\xaf\xe3\x75\xa5\xda\x4f\x7a\xe1\x29\xc9\x53\xdd\xca\x77" + "\x1a\x99\xeb\x4a\x96\x6d\x3e\x2b\x56\xeb\x8f\xf5\xf9\xb1\x32\x2e" + "\x63\x2c\x1a\x32\xce\xf5\xe4\xfe\x9d\xfd\xad\xbd\xbc\xa7\x0d\xfb" + "\x38\x1d\xb6\x02\xe6\xaf\x76\x21\x32\xde\xda\x6b\xe0\x54\xc5\x7b" + "\xdc\x6c\x37\x1b\xfc\xd4\xe7\x0c\xad\xff\x4c\x78\xd6\xb5\xaa\x35" + "\xa5\xe7\x07\xac\xd7\xc5\xfa\x7e\x0f\x4c\x8f\xca\x78\x74\xd0\xe9" + "\xeb\x8f\x75\xf1\xec\x0b\xb3\x98\x17\xba\xd6\xb2\xeb\xe3\xf4\x7f" + "\x9b\xfc\x56\xe3\xfa\x88\x79\x5f\xbf\x64\x20\x59\xac\x03\xbd\xb4" + "\xdd\x22\x30\x1f\xad\xdf\xcf\x6d\x30\x3d\x03\xe4\x39\x8a\xb2\xd6" + "\x2e\xfa\x6d\x70\x76\xd2\xcf\xd8\x67\x31\xf7\x58\x14\xde\x2f\x3c" + "\xd5\x1d\xad\x92\xd3\x69\x83\xfb\x5b\xe9\xe4\xa1\x1e\x2c\x93\x26" + "\xbd\xae\xa4\xd5\x86\xfa\x2b\x69\xf5\xc2\x4d\x31\xb4\x1a\x7f\x25" + "\xad\x36\x84\x63\xce\x7d\x8c\x7d\x94\x17\x9e\x62\x9a\x31\x8f\xa1" + "\xdf\xfb\xc1\x67\xeb\xbb\xe8\xf7\x42\xf6\x95\xf4\x7b\x61\x5c\x72" + "\xfa\x6d\x38\x31\x28\x1e\xce\x4b\xc9\xe6\x8d\x3e\xeb\x2c\xc6\x7d" + "\x9e\x17\xde\xaf\xef\x2f\xd7\xa4\xe1\x6d\x16\xbd\x70\x9b\x07\x7f" + "\xf8\xe5\x75\x44\x97\x2d\x2e\xc2\x06\x7d\xeb\xea\xb1\xe6\xe5\x7d" + "\xa5\xab\xcc\x45\x27\xcd\x3d\x0f\x3c\x9f\xe0\xb5\xf3\xf4\xe8\xfd" + "\x82\xd3\x99\x9e\xfc\xad\x28\xf0\xfb\x09\x65\x97\xfe\x33\x75\xee" + "\xb9\x0c\x9f\x60\x4f\x5d\x47\xda\x91\xea\xbb\x38\xdd\x01\x1e\x92" + "\xbe\x4f\xf2\x5b\xaa\xdd\xc0\x2c\x88\xe6\x50\x37\x70\x3b\xf9\xbf" + "\xbb\x3b\xad\x09\xfa\xa8\x70\xce\xe2\xb9\xcf\xcf\x9f\xff\xed\xaa" + "\x28\xd6\x7f\xcc\xeb\xd1\x37\xb6\xf3\xb7\x12\xd7\x3f\xb7\x1a\x6d" + "\xb2\xfd\x9f\xa6\xe6\xcd\x7f\x86\xfe\xfb\xf9\x61\x65\x4b\x3e\xd9" + "\xa2\xee\xf1\xbe\x38\x2a\x46\x3f\x83\x47\x5e\xcc\x11\x9e\x7f\x2e" + "\xeb\x1a\xe3\x17\xd3\xaf\x1c\xe3\x17\xb5\xe4\x63\xfc\xe2\x24\x7d" + "\x05\xdf\xab\x78\x11\xeb\x9f\xc5\xd2\xd6\xe4\x77\x3e\x2f\xc7\x9a" + "\xb9\x05\xeb\xe5\xd6\xe9\xab\x7c\xf7\x17\xac\x4a\x61\x7f\x70\xf9" + "\xed\x8c\xc8\x25\xd1\xcc\x67\xd6\x7c\x3e\xc6\xdf\xce\xe0\x6f\xe6" + "\xf0\x37\x54\x65\x19\x3c\x6f\x3d\x4d\x72\xed\x88\x7c\xad\xe6\xb4" + "\xfc\xc6\x2f\x6c\x85\x17\x6b\x4d\xdb\xda\x86\xe9\x8d\xef\x17\x6f" + "\x51\xe3\x71\x82\xc7\x82\xdb\x2b\x58\xe5\x53\x6d\x5c\xe2\xef\x63" + "\x91\x4d\xd9\x10\x2f\x9e\xb8\xea\xde\x7d\x46\xe5\xec\x6e\x63\xca" + "\x7b\xdc\xbd\xb6\xa9\xd8\xd3\xec\xd3\x18\x34\x7d\xea\xd8\xbf\xae" + "\xdd\xb3\xd1\x99\xe8\x9f\xa7\x7c\x4c\x36\x4e\x31\x7d\x7b\xf0\x3c" + "\xb3\x73\x3d\xc0\xdf\x5b\xc1\x3a\x4e\x2b\x5f\xd7\xf3\x1c\x6d\xbc" + "\xa9\xa6\x9b\x3d\x74\xf3\x3e\xb1\xe1\x03\xd7\x0b\x30\xaa\x3a\xfd" + "\x82\xf0\xce\xfa\xa2\xcb\xb7\x6f\xe3\x01\xd3\x37\x4c\xfa\x03\x62" + "\xee\xe5\x6f\xba\x9c\xa6\x8d\x9f\xc9\x6f\xc8\x0c\xe2\xfd\xef\x8d" + "\xa1\x7a\xe9\x97\xb8\x31\x10\x8b\x8b\x81\xc7\x1b\xbc\x47\xcb\xf9" + "\xb1\xb8\x94\xce\x59\xbe\x60\x44\xe9\xfc\x05\xda\xb3\x85\x0b\x8a" + "\x0b\x16\xc8\x18\xb0\x32\xbc\x6c\xc9\xaa\x62\x3e\x91\xb8\xa3\x77" + "\xc2\x1c\x66\xf8\x10\x76\xfa\x4a\x49\x3f\xc2\x97\x1e\x07\x3d\x2c" + "\xca\x8f\xf0\xe5\x5c\x35\xaf\xbf\x34\xf7\x4a\x9f\x99\x97\x3a\xfd" + "\xbf\xc0\x57\xf6\xed\x2a\xf6\xbc\xe1\x67\xc3\x7c\xf7\x52\x55\x92" + "\x3a\xfb\x3b\x7d\xc6\xd8\x77\xa9\x23\x5f\xde\xf7\x90\x71\xc2\x2b" + "\x79\xdc\x5e\x22\x7f\xe9\x64\x8e\x75\x6a\xf0\xf3\x4b\x27\x4d\x7e" + "\x36\xfd\x0d\x19\x16\xdf\x37\x19\x11\x8e\xf5\x35\x7a\x79\x02\xe6" + "\x3c\x47\x67\x3f\xd6\x58\x88\x71\x0f\x59\x7c\xc0\xe3\x65\x2d\x11" + "\x0f\xe0\x37\x10\xe9\x63\xba\x7c\xb9\xcc\x7e\xbe\x9c\x8b\xe7\x2b" + "\x6c\xd5\x09\x93\x73\x61\x94\x2e\x9b\x57\xd2\x9b\x26\xce\x29\x2a" + "\x62\xb9\x9e\x33\xaf\x68\xf9\xd2\xe7\x97\x15\x2c\x58\xbc\x00\xa9" + "\x13\xe6\x73\x68\x5e\x59\xe4\x5e\x23\x47\x5b\x3c\x6f\xde\x5c\x95" + "\x64\x0c\x43\xfc\x39\x90\x3a\xbb\x7f\xf9\x70\x80\x36\x96\x74\xd9" + "\x5f\xaf\x64\x09\xcb\xcb\xf9\xf8\x7b\x56\xca\xb4\xb4\x8d\x5e\x0e" + "\xc4\xaf\x7b\x5e\x0e\x9a\xfc\x20\xc7\xcf\xc5\xfe\x3e\x23\x0e\xb5" + "\x09\x79\x6e\x82\x31\xdb\x34\x99\xbf\x8f\x8d\x35\xd9\x24\xb6\xf7" + "\xbb\xe0\xbc\xd2\xa9\xff\xf9\x7e\xfd\x7a\xe5\x27\x60\xe5\x6f\x7a" + "\xf2\x3d\x7b\xe4\x83\xff\x5f\x8c\x28\xfe\x7f\xa5\x93\xff\xdb\x2c" + "\xa9\x58\xc3\xbd\x32\xd7\xb4\xe7\xe3\x65\xe6\x95\xb2\x2b\x65\x89" + "\xfd\x3f\x5f\xd9\x6e\xd2\xd6\x1c\x67\xc5\x5b\x9b\x46\x9a\xfb\xb0" + "\x35\x46\x9c\x78\x7e\xe6\xba\x6c\xab\x8b\x3e\x37\xdc\xcf\xfe\xec" + "\xa7\x68\x93\xc1\x2f\xaf\x9c\x8c\xf1\xcb\xb2\x9f\xa1\x57\x22\x6a" + "\x9c\x5e\x09\x99\xf8\x05\xe8\x15\x79\x1e\xc0\x30\x94\xec\xbf\xbc" + "\x4a\xf1\xce\x26\x87\x49\x5b\x5e\x17\xe3\x3d\xbb\xcb\xb6\x78\xf9" + "\xa8\xf4\x91\x50\x71\x06\x3a\xb8\xff\x80\xb3\xcf\x84\x83\xb2\xe8" + "\x7f\x5a\xbd\x49\x2b\xb3\x4c\x2c\x4f\x4c\x9c\x53\x8c\x45\xeb\x82" + "\xf9\xf3\xe7\x2d\x5d\x66\xc6\x5e\xce\x7e\xbe\x68\xae\x8a\xb5\x7c" + "\x2f\x86\x7f\x25\x24\x70\x3c\x87\x6b\x46\xaa\x7a\x4c\xb0\x21\x87" + "\xf2\x3e\x83\xf4\xdd\x93\xeb\x98\x8a\x91\x7b\x8c\x35\xcd\x29\xda" + "\x5c\xaf\x7c\x5f\x36\xbf\xa0\xec\xc5\xeb\x97\x00\xa7\x16\xd3\x5e" + "\xe4\xfd\xcb\x36\xd2\xc2\x7c\x8f\x88\xfd\x97\x77\xbf\x26\x9a\x79" + "\xbf\xb2\xdd\xb3\x39\xdd\xfc\x3e\x17\xdb\x22\x9b\xd5\xb7\xcd\x83" + "\xbe\xc5\x1c\xdb\xbe\xe2\x61\xbd\xc2\x39\x46\x64\x0e\x28\x84\xcd" + "\x93\xce\xb2\x70\x43\x2b\xc7\xbd\xe7\x78\x40\x9b\xf3\xd9\x56\x62" + "\xfd\xc2\x31\xec\x9b\x69\x73\x36\xd6\x37\xf6\x00\x55\xcc\x0c\x66" + "\x38\xc7\x6c\x58\x4d\x69\xdc\x06\x74\x53\xa0\xbe\x96\x69\xbb\xb9" + "\xe4\x53\xe8\x1e\x63\x7f\x37\xc0\xed\x04\x68\x73\x8e\xb1\x97\x9e" + "\x6b\xec\x5d\xe6\xa2\x5c\x75\x80\x6e\x30\x62\x82\x6b\x5f\xdc\xee" + "\xa6\x52\xfe\x6e\x9f\x8a\xe5\x33\x76\x9f\xf0\x6a\x01\xfe\x36\x1e" + "\xec\x2b\xac\x21\x36\xb5\x88\x0a\x2d\xa0\xe2\x80\x33\xaf\x6c\x99" + "\xa0\x7c\x8b\x37\x9d\x60\x1a\x00\x6e\xbe\x01\x37\x1f\x70\x31\xfe" + "\x37\xcf\x56\xbc\xba\x85\xcc\x36\x30\xa7\x04\x61\x8b\xa6\xb1\x3d" + "\x0a\xbc\x9d\xf8\x1b\xb5\x55\x9e\x4f\x07\xb0\x6e\xb1\x09\xf6\x1b" + "\xea\xfa\x06\xd9\x96\x31\xe6\xfc\xc2\x6d\x1b\xb8\x73\xec\x8d\x34" + "\xde\x3b\x33\xda\x9a\xc9\xeb\x6b\x13\x26\xde\x9d\xfa\xa5\xb3\xb5" + "\x80\x99\x86\xb9\x32\x68\x7c\x7b\x6a\xd4\xd6\x0b\xec\x63\x16\xc0" + "\x5c\x38\x40\x14\x44\xec\x7c\xae\x73\x83\xf9\x6d\xaf\x9a\x0b\x4c" + "\xaf\x2d\x7b\xbb\xce\x6b\x50\x1f\xf4\x87\x3c\xb8\x9b\x69\xcb\x47" + "\xdc\x2e\xcb\x02\x8f\xe5\x65\x8c\x0d\x7f\x27\x5e\x5c\x3a\x5b\x87" + "\x75\xfe\x0d\xa0\xc1\x97\x3c\x46\x7c\xc6\xca\xbe\x5f\x48\xb3\x71" + "\x2c\xf2\x53\xb4\xa5\x81\xc7\x87\x71\x01\x0d\x73\x22\xed\xf9\x3f" + "\xe6\xfb\xa8\xac\x0f\xd7\x96\xc1\x8e\x9d\xcf\xba\xc4\xfb\x30\xaf" + "\x8b\xf9\x1b\x32\xfc\xec\x9a\x2b\x74\x39\xbe\xab\x79\x7c\xbd\x0f" + "\xaf\x6d\x11\xfa\x37\x1e\x12\x47\x43\x44\xdf\x58\x28\x12\xb6\xa4" + "\x30\xde\x16\xd7\x59\xbe\x33\x5b\x0b\x3d\xbc\x91\xd0\x6e\xda\x96" + "\xd5\x64\xe7\x3b\xc6\xfc\x7d\x94\xc6\x50\x35\x35\x16\x57\xd3\xbf" + "\x46\xb6\x93\x6f\x05\xc7\x8c\xf0\x86\xff\xad\x74\x3b\x9f\x5b\x5d" + "\x87\xe7\x43\xda\x63\xdc\xd6\x56\xef\xbf\x1d\xff\x33\xfd\x9b\xef" + "\xcf\xa4\x3d\x21\xdf\x6b\x8f\xe5\xff\x2b\x1d\xcb\xf9\x57\x72\x35" + "\x0b\x9d\xd7\x4a\xe5\x8b\xb8\x8d\x8d\x80\x55\xcb\x77\x73\xed\x7a" + "\x9b\xa3\x37\xfa\x6f\xe5\x3d\xf9\xc6\x50\x90\x7c\x8b\x3f\x64\x1c" + "\x07\xee\xb9\x40\x69\xbe\xc5\x7f\x90\xcf\x6a\x0d\x73\xb6\xd6\x3f" + "\xf7\x04\xdb\x69\x11\xbe\x8b\xcc\xe7\x7c\xb0\xdb\xf5\xad\x8c\x63" + "\x54\xe1\xcd\xdf\x52\x37\xeb\xc3\x8e\x33\xea\x6f\x6d\xe6\xfa\xbb" + "\x99\x1e\xc0\xa9\x61\xa6\xa2\xc9\xb1\x13\xa0\xe9\x63\x06\x7d\xf2" + "\x63\xe9\xb3\x35\x87\xe9\xc3\x71\x2c\x75\x8c\x17\x70\xcb\x01\x0d" + "\x74\xb3\x0d\xe0\x9c\x66\xec\x8b\xa6\x6d\xb9\x40\xe9\xbe\xc5\xfc" + "\x7d\x2c\xef\x2f\x6d\x79\xd6\x34\xfd\xd2\xb9\xba\xad\x17\xc9\xca" + "\xe3\xc6\x67\x21\x5b\x65\xbe\xa4\xf9\x46\x1e\xb3\x60\xc6\x88\x7d" + "\xf8\xdb\x8f\xbf\x3a\xe6\x3b\xfc\x1e\xc0\x78\x6d\x04\x0e\x1a\xc6" + "\xaa\x96\x7f\x15\x2f\x6a\x01\x8e\xd5\x60\xac\x4b\xba\xd2\x21\x47" + "\x11\x21\xbf\x47\x0b\x99\xf1\x6a\x3a\xe4\x88\xf7\x45\xf6\x54\x52" + "\xba\xee\xd9\x54\xb4\x1b\xba\xae\x1a\x73\xe9\x9e\x4c\xb2\xf3\x5e" + "\xe1\x4e\xe9\x8b\x5e\x31\xc4\xd4\x7d\x2f\xf7\xe5\xfb\x6d\xde\x3c" + "\x0b\xef\xa5\x78\x9d\x79\x06\x9f\xe7\xa1\x0c\xf4\x7f\x5f\xe3\xfb" + "\x63\x9b\xa5\xdf\x31\xcb\x7e\x77\x36\x3a\xec\xc3\x63\x62\x57\x3e" + "\xf1\x99\x4a\xfa\x3a\x11\x4c\x6f\xb6\x89\xc6\xd0\x31\x79\xaf\xb1" + "\x31\x14\x95\x67\x2a\xc8\x4f\x99\x16\x0a\xda\x60\x4f\x36\x31\xed" + "\xcc\x74\x3e\x8f\xe1\xbd\xaa\x69\x21\x11\x9c\xbe\xca\xc6\xdf\x07" + "\xec\x2f\xf7\xe3\x8d\xf4\x46\x07\x6c\xf1\x55\x41\x1b\xfa\x1e\xe9" + "\x84\xd5\x96\x9f\xca\xf2\x86\xb2\x59\x9d\x65\xdb\xf2\xad\xfc\xdd" + "\x5b\x6e\x33\x26\xad\xc7\xf4\x52\xd4\xe5\xb1\x32\xd2\x94\x1d\x5a" + "\x99\xdd\xb9\x4e\xe3\x78\x8d\x6d\x98\x37\x97\xe5\xa7\xe8\x6d\xf9" + "\x96\x28\x60\x83\xf7\xed\xf2\x3b\x85\x91\xa0\xf1\xdd\x9f\x16\xc8" + "\xef\x09\x12\x15\x6f\xf9\x50\xce\xca\x70\xf9\x6e\x3c\x7f\x2f\x41" + "\x64\xec\x9f\x92\xdc\x8f\x6d\x47\xa9\xaf\xfc\x09\xf0\xd3\x36\x27" + "\xcb\x73\xd4\x3e\x72\x92\xf6\x1c\xdb\x27\x95\x6f\x31\x3d\xa3\x90" + "\xb1\x68\xc6\xc8\x49\x23\x5a\x28\xa5\x1c\x7c\xab\xf6\x75\x2a\xff" + "\xc4\xb1\x00\x5c\xba\x80\xcd\x57\x79\x98\xf9\xc6\xd6\xca\xfe\x67" + "\x23\xa7\x48\x9f\xaf\xcc\x6d\xc5\xfe\x70\x0b\x1d\x73\xff\x85\x8e" + "\x45\xfc\xee\xc3\x17\x82\x56\xe5\xfb\x65\x65\xb8\x9f\x73\x9e\x0b" + "\xbc\x5a\x10\xad\xa5\xee\xf6\xdb\x79\xcd\x89\x39\xec\x0b\xb5\xfe" + "\xda\xe6\x34\xd7\x9a\xdf\xd2\x87\x8d\x1c\x4f\x40\x08\x07\xe9\x95" + "\x4b\x38\x5e\xa8\x4b\xb4\x67\xd3\x88\xd5\xbc\xcf\xb5\x6d\x36\xec" + "\xfe\x1c\x03\xee\x79\x03\xee\xc6\xab\xc1\x65\x9e\x39\x56\x25\xcf" + "\x7a\xd0\xa7\x25\xde\x28\x60\x47\x33\x97\x34\x41\xc7\xbb\x5c\xdf" + "\xf0\x3e\xe8\xf6\x06\xb4\xe3\x6d\x8c\x34\x11\xc7\x26\xd9\xa3\x63" + "\x7e\x3c\xef\x20\xc3\xcf\xcd\x75\x8e\xb6\x1d\xd2\x45\xb6\x1d\x6b" + "\x60\xde\x63\x73\xb1\x8e\xe3\xf5\x75\x79\x94\x7a\xfa\x4b\x02\xc4" + "\xf7\xea\x01\xe3\xd3\x3f\xf2\x79\x12\xf4\x44\x54\x38\x2c\x1f\x5d" + "\x0a\x10\xfb\xb2\xc8\x7b\xf6\xeb\x6f\xde\xd9\x67\x1d\xdd\x2f\x2c" + "\x36\xe9\xc7\xa8\x57\x54\xec\xc3\xd8\x1e\x55\x7e\x75\xce\xd9\x31" + "\x3e\x75\xa9\xe7\x68\xfb\x78\xf6\xa9\x13\x76\xe7\x90\x6a\xb9\x97" + "\x37\x72\x52\xbb\x67\x7b\x61\x80\x2a\x4b\x99\x7f\x36\xb1\x7f\xbd" + "\xd4\xb1\xdb\x3f\x0b\x66\x2c\x92\xbe\x79\xfc\xcd\x61\x7d\x45\xb4" + "\x6e\xeb\xd7\x64\x55\xf4\xd8\xfe\x41\x63\x6b\xbb\x4f\x78\x17\x15" + "\xf3\xdd\x29\x03\xb6\x0d\xb0\x5f\x10\x15\x8b\x8a\x03\xb4\x5d\xc5" + "\x33\xf4\xca\xe7\x5a\xce\x8f\x74\x64\x63\x2e\xdb\xce\x31\x0f\xd2" + "\x02\xb4\xed\xa8\xf0\x0c\xf0\xb5\xd9\x17\x15\xcf\x70\xb0\x4d\xb5" + "\xbd\x25\x60\x39\x16\x30\xf6\xd6\x64\xcc\x80\xc4\x3d\xb1\xce\x31" + "\xdc\xe5\xe8\xed\x07\x10\xac\x11\xb3\xce\xd0\x8e\xc7\x2f\x7b\xc8" + "\xd2\x01\x5b\xf0\xb2\x05\x36\xff\xae\xfc\xf4\x2d\xfd\xc8\x89\xbc" + "\x7e\x67\xe8\xd5\xf1\x11\x0b\x65\xe1\xcf\x1e\xbc\xb9\xf0\x3a\xc0" + "\xcd\xe1\x7d\xc7\x86\x0b\xbc\x6f\xf4\xea\x6e\x69\xab\xed\xa4\x21" + "\x3a\xe0\xf1\x19\xca\xd6\x7e\x34\x84\xf7\xfe\x90\x96\x5d\x10\x55" + "\x67\x89\xe6\xfa\x7e\x7d\x3f\x1a\x1a\xdf\xee\xab\x46\x2c\x80\x1d" + "\xf9\xfc\xbb\x32\x48\xb7\x14\xdf\xc7\xdf\x93\x7c\xcd\x21\x3c\xa9" + "\x42\xdc\xec\xb0\xa8\xf3\xfe\xd7\x52\x6c\x55\x8a\xef\xe4\xd9\x19" + "\xf8\x8d\xcf\x26\x8d\x73\x9a\x14\x19\x2b\x21\xf3\x9e\xe3\xfc\x7d" + "\xde\x98\xbd\x57\xbb\xc4\xc3\xb8\xe7\x1c\x5d\x7f\xe7\x6c\x86\xc1" + "\xf8\x14\xcc\x51\x67\x3c\x7c\x07\x3a\x40\xaf\xca\x78\xbc\x9b\x76" + "\x52\xfa\x2b\x3b\xc9\xde\x30\x9f\xfb\xf5\x9a\x53\xc9\xa2\x95\x18" + "\x5f\xdd\xcb\x72\x06\x9e\x00\xde\xdc\x1e\xf3\x46\x63\xe4\xbc\xcf" + "\x55\x22\x74\xdf\x73\x6c\x8b\xbe\xb6\xc4\xb7\x74\x3f\x4d\xe7\x3b" + "\xe3\x7c\x5f\x6c\x16\x05\x6b\x00\xaf\xa6\x1f\xd9\x01\x6b\xad\xbf" + "\x88\xf8\x0c\x60\x90\x6f\xe9\x01\x86\x5d\xc1\x73\xc1\x66\xd0\x47" + "\xcd\x09\x3b\x26\xf9\xc3\x27\xa8\x01\xf2\x3d\xad\x58\x44\x19\x0e" + "\xca\xfc\x49\xf6\x77\x97\x43\x2b\x50\xf7\xd4\x65\x5f\x3b\xcf\xce" + "\x8c\x7e\xf8\x2f\x48\x78\x27\xfd\xb3\x61\xe3\x19\x7d\x32\x69\xad" + "\xf8\x6b\xc7\xf7\x7d\x4b\xf7\x12\x8f\x0f\x97\xc7\x7b\x9a\xbf\x15" + "\x65\xcf\xc6\x8f\x0b\x97\x41\xde\x58\xc0\xfd\x61\xd7\xf9\x2f\x9f" + "\x4b\x76\x95\xa9\xde\xc9\xf7\x61\x5e\x2d\xdb\x05\x1a\xa9\xfd\xf2" + "\xd7\x7e\xc9\xb8\x06\xe8\xb5\xbd\xfe\x92\xbf\x24\xf7\xf3\x84\xec" + "\x83\xef\xd7\x35\xca\x73\xb0\x1d\xaf\x4e\x8b\xe8\x42\xe9\xb3\xaa" + "\x29\x3a\xf4\x40\x00\xbf\xac\x0b\xa4\x3e\x19\xce\xbe\x35\x55\x0f" + "\xd9\x52\xd4\xf8\x72\x5f\xd8\x5e\x49\x36\xc6\x31\x67\x74\x76\xc6" + "\xd5\x1c\x63\xfe\xae\x9d\xce\xe7\xac\xfd\x40\xef\x0e\x07\x29\xfe" + "\x13\x5e\xc0\x35\xee\x47\x38\x6b\x8d\xb9\xac\xb6\x2d\x63\x64\x9e" + "\x58\xe3\x20\xd3\xdf\x16\xf2\x9b\x5b\xa0\x7c\x98\x1d\xac\xa3\x6a" + "\x2c\xc2\x88\xb7\x57\x35\xc5\xa8\x5b\xad\xfc\x1c\xaa\xd2\x50\xbf" + "\x3a\x69\x7f\x53\xa1\x77\x3c\x50\xd3\xe8\x0f\xdb\x91\x02\xba\x0a" + "\xf3\x41\x4f\x7f\xe8\xb2\xf1\x4d\xc1\xaa\x3f\xc2\xa6\xee\xc9\x77" + "\x53\x4c\xdc\xae\xed\x3c\xad\xca\xab\xd6\x36\x55\x4d\xe6\x7e\x8d" + "\xb0\x83\xc6\x1e\x9b\xe0\x3b\x5c\x7c\xd7\x20\x94\xb1\xc3\x1d\xcc" + "\x78\xab\x4e\xc9\x4d\x55\x18\x76\xaa\xd4\xb7\x05\x61\xfe\xa6\x7b" + "\x65\x29\x9f\x97\x62\xdd\xd4\x93\xfb\xdc\xee\x79\x1d\xeb\x9f\xa2" + "\x59\x6a\x3e\xaf\xea\xd6\xf7\x5a\xae\x99\xcc\xbe\xa1\x4f\xb2\x6f" + "\xe8\xa3\xec\x9b\xf1\xcd\x9d\xd3\xf4\xba\xbc\xbb\x7d\x6d\xfd\x79" + "\x7d\xb6\xa2\xed\x0e\x37\x7f\x4f\xf4\x34\xed\x1a\x26\xef\x1f\x60" + "\x4c\xd4\xd9\xc2\xeb\x2d\xa2\xf7\x2b\xbd\xaf\x11\xe6\x01\x05\xf3" + "\xad\xba\x57\x39\x3e\x9f\xf1\xdd\x2e\xc0\xbe\x09\xba\xbc\x8e\xd7" + "\x0e\x6d\x68\x8f\xbf\x7b\xd8\xa5\x87\x76\x56\xf1\x58\x0d\xdf\x4f" + "\x39\x8a\x0f\x77\x6e\xe6\xfd\x5b\xb5\xce\xdb\x39\x0e\x7c\xaf\xd6" + "\x27\x9d\xbe\xd9\x29\xd2\x37\x3b\x56\xc7\x5e\x1b\x8e\x3b\xa5\x2c" + "\x8b\xcc\x8a\x3c\x3c\x0f\x65\x1f\x03\xc6\x77\x65\xc4\xd4\x7f\x3b" + "\x87\xb2\x9f\x4f\xe7\x19\xfb\x2a\xf0\x4a\xb9\xba\xbb\x0a\x7c\x8e" + "\x99\x36\x8a\xfc\x4e\x93\x47\x1c\xe5\x72\xd3\x57\x9d\x97\x67\xf0" + "\x5b\xe5\x3d\xed\x33\xc6\x1d\xa7\x9d\x5f\x1a\xfb\x19\xd9\xec\x17" + "\xdf\xee\xd9\x85\xb6\x0f\x4b\x7f\x1e\xa6\x01\xb7\x2d\x71\x97\xdf" + "\x4a\xda\x35\xa4\xeb\x2c\x65\xa7\x3c\x9f\x50\xbe\xa2\xbb\xc6\x99" + "\x3c\x82\xfe\xf6\x54\xf1\x12\x5f\xff\xe5\x91\xa1\x24\x79\xa0\x4d" + "\x38\x7a\x0f\xae\x66\x9e\xdc\x35\x37\x96\x4e\xd3\x23\xba\x4b\xe9" + "\xa0\x9d\xb9\x42\xca\xfa\xce\xdc\x6f\xb7\x27\x76\x1d\x32\x6d\x11" + "\x45\x67\x3b\xf4\xcb\x9e\x0d\x92\xd6\x5e\xcd\xcd\xb1\x2c\xd6\x94" + "\x73\x3c\x9e\xea\x55\x1c\xeb\x28\xe2\xd5\x6a\xa3\x7c\x1f\x0e\xf3" + "\xac\xee\xd5\xea\x4e\x17\x93\xa5\xa0\x98\xcf\x8f\x16\xe5\xf0\xfa" + "\x4a\xb8\x60\x0b\x64\xc2\x3e\x81\x9c\xaf\x5d\x40\xb6\xa7\x0a\x01" + "\xdb\x95\x9d\xc5\xb1\x88\x38\x0e\x11\xc7\x13\x8b\xba\xb2\x33\xf1" + "\xdc\x17\xf6\x9c\x5d\xd8\x35\x2f\xfb\xa0\x44\x3d\x02\xfa\xf8\x24" + "\xc7\x43\xb2\xf8\x83\x61\x5a\x7b\x96\xd2\x38\xd6\x51\xa4\x62\x51" + "\x7e\x63\xe8\x73\xb9\xb6\xe8\x53\x0c\x7b\x5a\xa7\xfe\xa0\xb9\x43" + "\xcf\x58\x94\x83\x39\x7e\x92\xea\xf7\x79\xa1\xfa\xad\xf0\x66\xfc" + "\x95\x8e\x1b\x54\x57\x2e\x71\xdf\xf3\x83\x08\xe0\xeb\xde\xdb\xf7" + "\x47\xbd\xb7\xef\x53\xf7\xe8\x8e\x51\x79\x89\x68\xf1\xc3\x36\x66" + "\x9f\x48\xbe\x53\xc8\x3e\x2e\xdc\x47\xee\x1f\xb7\xfd\x6f\x17\xce" + "\xca\xd8\x4d\x11\xbc\xbb\x8a\x8c\x3a\xad\xa8\xd3\x7a\x8c\x2e\x7b" + "\x6f\x97\x7d\x6f\x0c\xa9\xba\x05\xf2\x99\xeb\xc7\xd0\xc1\xe8\x73" + "\x27\x1d\xd0\x77\xee\x1f\xf7\x3f\xc2\x34\x01\x0d\x8c\xbe\x3a\x3a" + "\x8c\x7e\x72\x1f\xff\x15\x9c\xba\x13\xfd\x44\x5f\x65\x3f\x3b\xd0" + "\xcf\xa3\x85\x44\xe1\xca\x1d\xde\x6f\x32\x6f\xdf\xc7\xeb\x43\xd7" + "\xbf\xc3\x8e\x2e\xf3\x12\xd6\x81\xd6\x77\xca\xbd\x96\x97\x61\x9b" + "\x94\x07\xb1\x1e\x0c\x8a\x16\xb6\xf7\xfd\xc5\xf8\x8b\x54\xcb\x6f" + "\xb1\x4a\xfb\x98\xbf\x9b\xb9\x04\x7d\xd2\xbf\xa2\xf2\x16\xd1\x02" + "\xdb\x34\xec\x8f\xa0\x4c\x21\xfa\x8f\xf5\xe3\x69\x03\x7f\x2e\xbb" + "\xf6\x6b\xd5\x2f\x5b\x11\x65\x7d\xf2\xc4\x46\x8b\xff\xc4\x46\x32" + "\xfb\xf2\x34\xca\xa1\x3f\x0e\xc0\x92\x71\xe3\x75\xf4\x73\x17\xf0" + "\x0c\xc7\xf4\xa9\xa1\x35\x0c\x98\x9f\x51\xef\x3c\x4a\xd9\x79\x0e" + "\xfd\x38\x47\x0e\x6f\x39\xec\xaf\x47\xd8\x5e\xdc\xfd\xe8\xf5\xf9" + "\x04\xbe\xaf\x56\xdf\x2b\x51\xb1\x55\x6e\x3a\x43\x7b\xd6\x9a\xf1" + "\x53\x74\x8e\x3f\x95\xb1\x68\x16\xf3\x91\x8c\xa5\xc2\x73\x46\x3b" + "\x78\x86\xfd\x53\x56\xa2\x8d\xf6\xec\xbe\x12\x1f\x8f\x8a\xbf\x82" + "\x77\xfe\x8e\x4e\x16\xef\x09\xa0\x5e\xbe\x00\xcd\x18\x3e\xec\xb9" + "\x49\xfc\xcb\x34\x4c\x7a\x7f\xe3\x5d\x1a\x83\x36\x66\xf3\xda\xb7" + "\xae\x3c\x68\x79\xe1\x5d\x1a\x7a\x6d\x3a\x65\xcf\xfe\xee\xf4\x37" + "\x9f\x05\x30\x3c\xf4\x2d\xf3\x0c\xd5\x54\xc4\xcb\x98\x26\x75\x99" + "\xd2\x83\x35\xf9\xbc\xff\x7e\x6d\xed\xd6\xa8\xb8\x4d\x1e\xb1\xf1" + "\x1a\xeb\xcd\x32\xf1\xc0\xb3\xa3\x3b\xdc\xaf\x9d\x0e\x35\x07\xba" + "\x83\xb5\xf9\x35\x19\x4b\xcb\xb5\xe5\x35\xf6\xf1\xdb\x51\x7a\xc4" + "\xc1\x71\x8d\x31\x77\xee\x0d\xd1\xb2\xdd\x94\xe6\x3a\xcb\x7b\x32" + "\x53\xe9\x48\xb5\x93\xf6\x60\x4d\x2e\xda\xb2\x33\xb7\x5d\x60\x7f" + "\x02\xa5\x43\xd8\x26\xe5\x7b\x6c\x62\x59\xb6\x7d\xeb\x6b\xa6\x0d" + "\x5f\xbb\xb6\xec\x22\x59\xd4\x77\x23\x6a\xcb\x26\x69\x22\xb2\xdd" + "\xa2\x17\x56\x73\x6c\xa1\xcc\x0a\x1f\xc7\x16\x32\x63\xed\x48\xdb" + "\xa7\x14\x32\xd7\xe6\xe8\xbd\x79\x29\x0d\xe5\xb8\x60\xb6\xa0\xb2" + "\xe5\xd4\x7c\x5d\xbb\x1f\xf8\xd9\x8d\x33\x74\xbb\x8a\xbf\xb3\x27" + "\x54\x73\x01\x6d\xa9\xfc\xcf\xa3\x58\xc3\x48\xb8\x4b\x69\x48\xf5" + "\x05\xca\x66\x3b\xa8\xe0\x2b\x65\xb3\xf1\xba\x70\x6a\xab\x4d\x44" + "\xff\x57\x36\xed\x3e\xd3\x15\x37\x2c\xb8\x8c\x63\x8d\x09\x47\x77" + "\x77\x84\xb7\xf6\x95\x7e\x34\x32\x06\x84\xfa\xae\x18\xd1\xf6\x4a" + "\xb2\xf2\x77\x34\x79\x2f\x8f\xf7\x86\xf9\x2e\x8d\x9a\x43\xde\xc8" + "\x35\xe3\x2a\x75\x7b\x36\xe7\x55\xeb\x1d\xbd\x27\xd6\x5f\xc1\x76" + "\x9f\x6f\x05\xcf\x19\x6f\x6c\xe7\xfb\x3b\x5d\x6b\x9c\x37\x96\x73" + "\x1e\xa7\xb1\x7f\x79\x8e\xa4\xe5\x1b\x87\x79\xdd\x63\xac\x19\x3f" + "\xd1\x3a\xd3\x94\x0d\xc3\x73\x19\xe3\x50\xa3\xf6\x91\xfb\x00\x97" + "\x13\xe6\x7c\xc6\xf3\xba\xfa\x86\xe7\x1b\xad\x01\x8b\xdf\x71\x15" + "\xfc\xec\xc6\x37\x70\x2d\x6d\x1c\x2b\xc9\xf3\x8b\xfe\xe6\xfc\x26" + "\xbf\xd1\xb0\xbe\xdf\x03\xcb\x56\x51\xff\x19\xdf\xe7\x33\x6f\x79" + "\x0f\xa3\x45\xcd\xbb\xbf\x98\xd4\x75\x46\x95\x23\xe9\x2d\xbf\xbf" + "\xc6\x6b\x0c\x0b\xe6\x60\x15\x23\xac\x55\xcd\xbf\xe6\x1d\xe3\x5f" + "\xcc\x89\x69\x67\x43\xe7\x3c\x8a\x36\xd8\x57\x82\xe1\x2b\xdb\xe4" + "\x17\x63\xb8\x0d\x5e\x5b\xa9\xf9\xf5\x17\x63\xae\x62\x8b\x65\x33" + "\x7d\x75\x63\x3d\xe9\x6f\xfd\xab\xa2\x6f\x29\xa5\x8e\xd8\x4e\x8e" + "\x4f\xca\x03\x56\xf6\x53\xd5\x96\x92\x0d\xed\x7f\xc6\xf9\xcc\xeb" + "\xbe\xe1\xbc\x17\xf7\xe6\x48\x3f\xcf\xdb\x1d\xf9\xe9\xd3\x78\xad" + "\x2f\x6d\xf1\x37\xb5\x61\xa8\x87\xb4\xcc\x8f\xcf\x85\xad\x5b\x57" + "\xd3\x50\xfe\xce\x21\xd2\xe5\xb7\xc1\x82\xdf\x5b\xd8\x3e\x38\x8b" + "\x1c\x83\xb7\xb3\x8f\xfd\x9b\x53\x02\x96\x06\xe5\x17\xc6\xed\x57" + "\xbe\x15\xe0\xf8\x68\xef\x5d\x0e\xf4\x50\x63\xf5\xe6\x57\x78\xcf" + "\x8e\x79\x5f\x67\xee\xe5\x07\xe8\xcd\x66\x79\x1e\xc8\x7e\xc4\x8b" + "\x79\xbe\xae\x9c\xdd\xe5\x7b\xf3\xe6\x57\x06\x2e\x5f\x1d\x29\x26" + "\xde\xab\x3e\xbe\xa7\xaf\x68\x42\x7b\x07\x03\xf4\x46\xd8\xd8\x8f" + "\x69\x92\x7c\xc5\xf6\xee\x3f\xf3\x1a\xec\xaf\xbe\xcd\x28\xc7\xf3" + "\x44\x41\x29\xe5\x28\x1b\xbe\xb2\x54\x07\xff\x74\xf5\xff\xcd\x87" + "\x79\xaf\x2f\xa9\x4e\x84\x89\x23\xeb\x54\x54\x1c\x94\x7e\x5c\x15" + "\xfb\x73\xf0\x0b\xdb\x7e\xdb\x6c\xfc\xa6\x83\xe7\x8a\xf1\x6b\xc7" + "\x6f\x21\x7e\xb3\x44\xc5\xdb\x1a\xf3\x25\xd6\xb0\x0e\xac\x13\xd2" + "\xda\x32\x2a\xea\xba\xbb\xff\xc7\xb4\xf1\x6f\x78\x8c\x94\x5f\xea" + "\xde\xa3\x0d\x41\xd8\x67\x58\x29\x2f\x8b\x88\xcb\xda\x2d\x7c\xcf" + "\x66\xef\x51\xd7\x6e\xf6\x07\xd9\x9b\xf0\xfd\xf3\xbd\x87\xf1\x07" + "\x49\xfb\x65\x1e\xfe\xa0\x33\xf6\x1e\xed\xfa\xfb\xe5\xe1\x76\xcf" + "\xde\xa3\x01\xda\x2b\x6d\xac\x6b\xd3\x89\x7b\xd5\x5d\x0a\x5e\x17" + "\x65\x2c\x71\xab\xfe\xbe\xe5\xc5\x7b\x9a\xc8\x78\xab\xc9\xe8\xaf" + "\x1b\xef\x76\xcd\x85\x79\x2d\x03\x34\xe9\x87\x3e\x67\xec\xcf\xe1" + "\xfe\x32\xbe\x6d\x19\xdb\x66\xc7\xde\x7d\x64\x98\xdc\xff\x60\x46" + "\x25\xc3\x23\x31\x7c\x82\xdd\xa4\xa7\x41\x27\x3e\x37\xb2\xb4\x01" + "\x86\xb2\x83\x50\x1e\x30\xcc\xf2\x9d\xb4\xef\xc7\xdf\x1c\xc0\x98" + "\xa2\x1c\xd6\xc4\x69\xe6\xbd\xca\x76\xcf\x2f\x0f\x7c\x5a\xa4\xce" + "\x0f\xb8\x6e\x28\xa6\x2e\xc7\x1b\x48\x56\x1f\x6d\xa6\xa9\x36\xb7" + "\xcd\x3e\x4d\x7b\xff\xa4\xda\xfd\xe5\xbe\xee\x64\xa9\x7c\x20\xec" + "\xbb\xea\x00\xc7\x24\x60\x7b\x68\x9c\xbf\x7f\x88\xfc\xd5\x3a\xe6" + "\xfc\x4a\x6f\x4e\xb9\xf0\x9d\xa6\xff\xb1\xa0\x31\xdc\x72\x8d\xf3" + "\xe1\xff\x90\xe7\xef\xe2\xb2\x9b\xfc\x65\x77\xc9\xef\xfb\x9e\xa3" + "\x5f\xbd\xee\x0f\xca\x38\xd9\xfc\xfc\x02\xe7\xb3\xef\x03\xcf\x0d" + "\x1c\x37\xce\x5c\x63\xeb\x28\xbb\x87\xd3\x91\xe6\x0f\x05\x65\x7c" + "\xba\x2e\xdf\xec\x8a\x2a\x25\x53\xbf\x7a\x58\xde\x7d\x67\x7c\x23" + "\x3f\xf6\x31\xce\xba\xb7\xa2\x8a\xfb\xe0\xc2\xfa\xcf\x1f\x69\xf7" + "\xb1\x4c\x68\x2b\x78\xaf\xf0\x57\xc3\xc0\x77\x42\xaf\xa8\xa8\xba" + "\xc6\x3e\xc8\xbb\x13\xae\x88\x38\x17\xcc\xa8\xa8\x62\x9b\x64\x6b" + "\x79\x8f\xb4\x89\xd5\xc2\xd7\x96\x59\xe9\x6d\xf7\xfc\x2a\xef\xd3" + "\x52\xfa\x2f\xf0\xe1\xaf\xf2\xcc\xbe\xef\x31\xfa\x8e\xb6\xe4\xfa" + "\x69\x44\x95\x8a\xc7\x87\x32\xdd\x7e\xe7\x99\xc7\x99\xed\x01\xf6" + "\x1b\x35\x68\x71\xa2\x73\x6e\xb8\x36\x3c\x4e\x7c\x87\x36\x3a\x54" + "\x1b\xfb\xc6\xfd\xd7\xda\xd8\x37\xee\x6a\x6d\x40\x37\xfc\xe0\x0c" + "\xed\x3b\x7a\xed\x6b\xc7\x7d\xdb\x25\xaf\x78\x2b\xdd\x4a\x67\xbe" + "\x3d\x36\x8a\xf5\x5b\xc4\xfe\x96\x57\x7e\x8b\xc7\x42\x6e\x7f\x20" + "\x42\x11\xef\x12\x77\x43\xe9\x65\xf2\xad\xf8\x33\x35\xd3\x5b\x72" + "\xdf\xa8\xa1\x84\xd7\x6c\x6f\x35\x75\x54\x56\x06\x3a\x2c\xfb\x1c" + "\x4c\xef\xdd\x1c\xfb\x30\x86\xcf\x1a\x43\x7f\x26\xff\x6c\xde\x5f" + "\x6d\xe2\x7d\xed\x26\xe8\x07\xaf\x0e\xdd\x00\x1b\x3d\x2a\xe9\x01" + "\xfb\x45\xad\xb7\x76\x94\xca\xf5\x56\x50\xde\xf9\xbb\x01\x76\x6f" + "\xba\xf0\x14\x65\xf1\xde\x77\xb4\x23\x5f\x6b\xf7\x50\x1e\xc7\x21" + "\xe4\x7d\x67\x61\x77\x8e\x9b\x1e\x49\x15\x72\x3d\x05\xdb\x9f\xe3" + "\x11\xfa\x43\x01\x8a\xc2\x8e\xae\xbe\x44\x59\xd5\xb0\x3d\xa1\xb3" + "\xed\xac\xd7\x6b\x8c\x78\x84\x9b\x2f\x75\xc5\x23\xdc\xc3\x7b\x3d" + "\x27\xf0\x7c\x89\xac\xd1\x8a\x1d\xa5\xbb\x2e\xd1\x90\xdd\x2b\x28" + "\x7b\x17\xef\xe5\xfd\x4d\xd9\x3e\x6c\x57\xc8\xd8\x84\xcf\x67\xf3" + "\x7e\x7e\x97\xed\xb3\x92\x63\xa6\x76\xea\x2d\xab\xdc\x03\xb9\x26" + "\x7a\xbf\x2d\xe7\xc1\x88\xb7\xe2\x60\xc4\xbe\x3f\xa7\xa3\x72\xdb" + "\xec\x00\xbd\x35\xa6\xc3\xf2\xab\x03\xc9\xc6\xd6\xf4\x6d\xda\x1e" + "\x13\x4f\xf2\xd3\x21\x4a\xbf\x03\x56\x59\x77\x3c\x11\xdd\x95\x4f" + "\x23\x5a\xc9\xa9\xfc\x15\xae\xc3\x9c\xf8\x76\x80\xcf\xcf\xcb\x17" + "\x91\x23\xba\x6b\x56\x8a\xeb\x0d\x4a\xe5\x6f\x3f\xf3\x5f\xf9\xd7" + "\xa2\x65\x44\x11\x39\xf9\xfc\x81\x7d\x1a\xb4\x35\xb2\xfc\xfb\x43" + "\xca\xc8\x19\x0b\x7b\x8a\x72\x36\xba\x57\x7b\x68\xf1\xb3\xcf\x2f" + "\x2a\x9e\x53\xb2\xe0\x99\x05\x45\x0b\x4a\x56\xc9\xb0\x01\x43\xe5" + "\x7f\x0f\xde\x3a\x77\xa6\x3c\x74\x8e\xb1\x2f\x86\x74\xed\xc7\xfd" + "\x7a\x41\x94\xf7\x0f\xae\x89\x5e\xbf\x1e\x65\x9c\xa3\x05\x77\xcb" + "\x73\xa5\x5f\x97\x05\x2c\x8d\xd2\x77\x68\xb3\x8a\x23\xd3\xa2\xfc" + "\x18\x54\x39\xdd\xfb\x36\xc7\xe8\x19\x77\x8a\xde\xcd\xe7\xf3\x10" + "\x8c\x55\xb1\xbf\xec\x0c\xc1\x0e\x19\xc7\xe7\x2c\x0d\xbc\x97\x21" + "\x6d\xdf\x5f\xff\x4d\xce\x61\xe7\x64\x4c\xa5\xbd\xa7\xf0\xce\x7e" + "\xef\xba\xc8\xdf\x15\x7d\xde\xb1\x57\x7f\xde\xf1\x3f\x84\xc8\xdf" + "\xa9\x9f\x2f\xdc\x25\xce\x17\xee\x14\x5e\xad\x09\x32\xd6\xff\x0c" + "\xfd\x3a\x1a\xf1\xd0\xf7\xf0\xd7\xab\x2b\x86\xc0\xfe\x8c\xdc\x66" + "\xd1\x81\x3f\x5d\x78\x07\x06\x63\xce\xd0\x38\x4f\xde\xd9\x28\x5e" + "\xca\xbe\x54\xfb\x27\x73\xdb\xa2\x72\xe0\xf9\xa0\xab\x30\x15\xe5" + "\xa3\x0a\x97\xfd\x73\xfc\x1b\x4e\x93\x3a\x37\xdd\x3f\xdb\x27\xf7" + "\x8c\xf7\x7f\xc3\xf5\xf8\x9c\x8d\x6d\x68\x19\x8b\xd5\xf2\x76\x2b" + "\xfb\xe1\xb1\xfd\xbc\x3b\x93\xec\xde\x4c\x4a\x6f\xf7\xec\xdf\xd4" + "\xe9\x63\x61\x57\x73\x2a\xcf\x6b\x1c\x3b\x18\x3a\xa7\x9d\xe7\x48" + "\xc6\x83\xf9\x14\x30\x0f\xf2\x19\x9c\xba\x57\xb4\xbf\x1e\xf6\xe3" + "\x98\x6b\xd7\xb9\xfb\xeb\xe5\xfc\x61\x71\x89\x11\x9b\x68\xb6\x3c" + "\x1f\x55\x3e\x87\x56\xc8\xa5\x53\xf5\xe7\xdd\x91\xf2\xfc\x7c\xc5" + "\xd9\x5a\xc8\x8d\xbb\xe6\x32\xa5\xeb\x5e\xe7\x28\xb6\x63\x1a\xca" + "\xe4\xb9\x72\x1a\xea\xd5\xf1\xb9\xb3\xbc\x97\x27\x63\x51\xff\x99" + "\x6a\x2e\x92\xb5\x99\xde\xc9\xe1\xbd\xf6\x2e\xda\xbe\xf3\x2a\x9f" + "\xad\x88\xca\x01\x85\xb6\x32\xcb\x46\x86\xa1\x5f\x3a\x37\xc6\xac" + "\x87\xb9\xbb\x17\xd7\x3b\x45\xef\xac\x92\xf5\xb8\xac\xfc\x8e\xa1" + "\x7d\x16\xe6\xb1\x83\x5c\x3e\x82\xf7\x3d\xba\x3d\x4f\x40\xde\xa2" + "\x2b\xa2\x75\xc8\x9b\xa9\x7b\xb7\xcd\x46\x5a\xbe\xdc\xe3\xc5\xba" + "\x5c\xc6\x3b\xb1\x2f\x2a\xf6\x07\xfe\xea\x93\xf8\xb0\x1f\x6b\x09" + "\x74\x93\xb4\xfb\xde\x69\xd8\xf3\x37\x19\x23\x1b\x63\xf8\xee\x6c" + "\x83\x6f\x0c\xfc\xde\x9d\xd3\x56\x79\xfb\xbe\x36\x7b\x65\x71\xc8" + "\x92\x46\x47\x1c\xec\x77\xff\xb6\x76\xc4\x71\x19\x6b\x87\x77\xb3" + "\x03\xd6\x5b\x0c\x9f\x5a\x55\x8f\xcf\x76\x60\x8f\xb6\xa6\x3a\xec" + "\x53\x90\x3f\xc5\xf4\xaf\xe0\x6f\x7f\xf3\x19\x4f\x80\xde\xd1\x98" + "\x6e\xe0\xfb\x03\x72\x9f\x7f\xfd\x93\x2d\xe8\x4f\x4f\xf6\x81\x63" + "\x3a\xf3\xfd\x06\x1b\x9e\xc5\x0a\x31\xc6\x16\xc9\xb1\xd4\xc8\x7b" + "\x8d\xf2\xbe\xfc\x28\x23\x66\x8b\xd3\x88\xe1\x32\x94\xdf\xd5\x7d" + "\xfb\x77\x3b\xef\xff\x73\x9c\x1a\xf6\x1d\x88\x1a\x7e\x75\x32\x7e" + "\xcb\x05\x75\x3e\xca\x7e\x75\xbc\x3f\xc8\xf7\x03\xf9\x0c\x13\xf5" + "\x5a\x3a\xfd\x1c\xe5\xbd\x98\x77\xc3\x66\xdc\x96\x76\xcf\x7b\xd6" + "\x4e\x7f\x1d\xf4\xbd\xcd\x5b\x59\x18\xb2\xbf\xad\x85\xbc\x15\x75" + "\xc8\xd3\xa0\x9b\xf2\xaf\xba\xa6\xe3\x78\xb4\xcb\xc9\xa2\x67\x3a" + "\x67\x73\x3c\x0b\x8e\x0b\xa6\xfc\xe4\xdf\x5b\x67\xdc\x1f\x4f\x3d" + "\x47\xef\x8d\xef\x3a\x4b\x8c\x1a\xfb\x60\xef\xed\x53\x76\xd8\x7b" + "\xfb\xe4\x3e\x58\x65\x65\xde\x9b\xab\xc3\x96\xba\xd5\x01\x8b\xba" + "\x27\xf0\x1e\x2c\xb0\xdf\x37\x99\xfe\x28\x28\xc7\xf1\x1a\x92\xc6" + "\x4c\x12\xde\xd1\xfd\x15\xcc\x3a\xb9\x87\xd1\xb5\xae\xa9\x53\xe7" + "\x64\xeb\xfb\xcd\xd6\x79\x0e\xcc\x5c\xe2\x95\xbe\x15\xc5\x17\x78" + "\x3f\xac\xa7\x5a\x63\xa9\x32\x86\x5f\xe4\x8d\x67\xe2\xdf\x33\xf9" + "\x5d\xd1\xac\x6e\xa8\xb9\xb7\xbe\xc5\xa2\x07\x6c\x29\x24\x5c\xb5" + "\x22\xc4\xf1\xe0\x60\x5f\x05\xfd\x98\x53\xd1\x86\x80\x7e\xe8\x85" + "\x3a\x73\x98\xf6\x4a\x86\xea\x3e\x93\x38\x79\xee\x17\x2e\xb6\x2b" + "\x83\xec\xdb\x71\x81\x50\x2e\x03\xe5\x36\xd7\x97\xb5\xb2\x7f\x4a" + "\x36\xc7\x59\x6b\x36\xda\x0e\x66\x8c\xee\x3f\x38\x9d\x66\xa3\x4d" + "\xf0\x8f\x67\xf6\xb5\xcb\x76\x5d\xed\xd5\x6c\x0c\x35\xe7\xe5\x50" + "\x77\xeb\x14\x5e\x87\x0e\x47\xfb\x53\x05\xe3\xff\xfe\xe6\x88\x25" + "\x4c\x1d\x96\x5e\xe2\x9f\xdc\xa5\x14\xf1\xf4\x12\xd1\xd5\x18\xaf" + "\x36\x07\xec\xd8\x63\xd4\x18\xa9\x97\xbe\x1f\x90\x59\x5b\x79\x48" + "\x5c\xf0\x47\x0e\x48\x5f\x58\x75\x67\xfc\xfd\x17\xfc\x91\x8f\xa8" + "\xb1\x38\x48\xac\x17\x4e\xd1\xfb\x32\xd6\xe9\xf0\x62\x37\x71\x4c" + "\x4f\xe4\x3b\xd5\xfc\xf7\xfe\x26\xe3\x77\x96\x68\xcb\x8e\x3b\x33" + "\x7a\x70\xf9\xe2\x67\x4b\x16\x3c\xbf\x78\x58\xee\xbc\x15\xf3\x8a" + "\xb4\x47\x94\x2b\x5d\xdc\xbc\x94\xd6\x15\xfb\xf8\x37\x72\xae\x60" + "\x1b\x84\x63\x20\xcb\xf8\xc7\x9e\x51\xd4\x19\xfb\x98\x6d\x91\xff" + "\x03\xf1\x8f\x4d\x1b\x83\x63\x1f\x77\xed\x61\xff\xd6\xd1\x29\x03" + "\xfa\x27\xed\xfc\xce\xf7\x24\x75\xcf\xfb\x55\x2c\x47\x7b\xa4\xdf" + "\xd9\x6f\xbc\xb1\x71\x7f\xd8\xc7\x8e\xf7\x3d\x90\xbe\xcf\xbc\x93" + "\x0a\x5e\xc4\x5c\xf1\x9b\x83\x5d\x77\x64\x7e\x03\xfd\xff\xbe\x55" + "\xc9\xaf\x2c\x7b\xdc\x3c\xeb\x35\xbe\x31\x25\xcf\xa6\x75\xcf\xc5" + "\x90\xda\x5f\xf9\xcd\x7f\xec\xd1\x7b\xa5\xa9\xbd\xfd\xdf\x92\x79" + "\xff\x4a\xc9\xe6\x27\x86\x6c\xfe\xd6\x71\xb5\xf3\xf8\x2e\xd9\xf8" + "\xed\xcc\x2e\xb9\xfe\xc2\xac\x3b\xf3\xdb\xce\xf2\x0d\x3b\xf7\xa6" + "\x33\xf4\xc1\x02\xde\x73\xc1\xf3\x00\x3c\xcb\x7b\x9f\xca\x17\xfd" + "\x83\x61\xc6\x33\xda\xf8\xe0\x26\xe3\xf9\xe6\x33\x74\x20\x6a\x3c" + "\xf7\xc3\xf3\x57\xc6\x33\x64\xf6\x40\x83\xf1\x9c\x85\xe7\x0f\x8c" + "\x67\xe8\xf8\x03\xbb\x8d\xe7\xbe\x78\x7e\xc1\x78\xfe\x3e\x9e\x17" + "\x19\xcf\x90\xc1\x03\x8f\x1a\xe7\xa2\x69\xa7\xe9\xc0\x84\x6b\xb7" + "\xbb\x0f\xa4\xab\xb3\xb7\x03\xb9\xd0\xf5\xc6\x5d\xb5\xce\x34\xd8" + "\x84\xef\xd7\x99\xf4\x45\x3a\xef\x0d\xa6\x21\x1d\xcf\x6f\xe4\x77" + "\xa5\xff\x36\x64\x94\xf7\x42\xcf\x0d\x8d\x49\x6f\x31\xd2\xf7\xc1" + "\xbe\x2f\x8b\x49\x3f\x69\xa4\xfb\x50\xfe\x40\x4c\x7a\x93\x91\x7e" + "\x22\x40\xbb\x36\xc5\xa4\xd7\x1b\xe9\x41\xd3\x0f\xc1\x48\x3f\xa8" + "\xd2\x3f\x60\x9f\x81\x71\x31\xe9\xfb\x8d\x74\xe8\xff\xdf\x0e\x89" + "\x49\x97\x7a\x65\xab\xbc\xb7\x65\x13\x47\xca\x58\xb6\x3e\x98\x14" + "\xa0\xd7\x63\x71\xde\x6e\xd4\x9d\x15\xa0\xaa\x99\x31\xe9\xc6\xfd" + "\xea\x0f\x4a\x02\xd4\x1c\x9b\xde\xad\xed\x9b\x52\x45\xdd\xf9\x69" + "\xa7\xf3\x37\x79\xa4\xff\xa3\xb4\x19\x7f\xf7\x3e\xdf\xe9\xb2\xed" + "\x16\xa7\xb4\x72\x21\x4e\xd1\xef\xaa\x0c\xbf\xbf\x21\xec\x87\xc5" + "\x77\xe3\x9a\xe9\x77\xeb\xe4\x7d\x29\x8e\x65\xc8\xf7\xe5\x56\xf3" + "\x7d\xb9\xdf\xc9\x38\xcf\x23\x4a\xdd\x2a\xce\xa1\xf2\x2b\x6d\x95" + "\x6b\x74\xe3\xfc\x12\x65\x86\xf1\x9e\x25\xc3\xe1\x7d\x3c\x7f\xc9" + "\x65\xe9\xeb\xc8\x6b\x24\x4e\xe3\xb5\xaa\xbc\x43\x15\xb3\x56\x52" + "\x7a\xff\x77\xef\xeb\x7c\xc7\xdd\xa3\xd6\xf3\x5b\x55\xfc\xcc\x56" + "\xf6\xb9\x89\x2d\x1b\xa0\xdf\xc9\x75\x6e\xaa\x23\xe3\xf5\x76\xcf" + "\xef\xbc\x5d\xf7\x7a\x3e\x68\x31\xd2\xab\x90\xbe\x2f\x26\xfd\x78" + "\xf7\xba\x1d\xfa\xce\x3e\xa0\xae\xe3\x92\x08\x45\x2e\x89\xf0\x96" + "\xff\x04\xde\xf3\xe5\x1d\x95\x5b\xa2\xde\x01\x3e\x23\x5e\xc4\x97" + "\x91\x15\x22\x08\x9d\xcd\xf1\xf5\xaf\x9f\x16\x0a\xd2\xb4\xe2\x76" + "\xb1\xf9\x19\xf6\x9f\xbb\x28\x63\x27\xb9\x5a\x39\x96\x2f\xfb\x64" + "\x85\xf8\xdc\x27\xbd\x11\x73\xdc\x9e\xf9\x9c\xff\x39\x4d\x2d\x84" + "\xed\x5d\x18\xa5\x3d\x80\xbd\xfb\x19\xd3\x1f\xf2\xf7\x53\x3a\x7d" + "\x14\x81\x03\xb7\xe7\x92\xdf\xc7\xf8\xbd\x8c\xcd\xc1\xdf\xfd\x12" + "\x15\xfb\xf3\xc4\x1f\xd8\x7e\xad\xa8\xb5\xad\x23\xf0\xd5\xef\x37" + "\xe0\xd9\xab\xfe\x90\x87\xf4\xee\xfa\xa4\x64\xf9\xf7\x3e\xa5\x6b" + "\x34\xa7\xd2\x17\xbf\xf7\x89\x5f\xf0\x1d\x9d\xdf\xf3\xfd\x97\x29" + "\xb0\x95\x93\xfa\x55\xad\xdd\x4d\x96\x8e\x4a\xd8\x26\xe7\x0e\x5a" + "\x94\x7e\x3a\x58\xa7\x5b\xd2\xd6\xf1\x7e\xa1\x8c\x91\x5f\xe9\x2c" + "\xde\xbf\x38\x6c\x69\x58\xdd\x4c\x6b\xbe\x4f\x8e\x59\x61\xf6\xff" + "\x3e\x38\xb2\x4f\x09\xc7\x6b\xac\xcc\x83\xdd\x69\xf9\x2d\xf2\x3f" + "\x5e\x7c\xd0\x12\x91\xf6\xca\xc1\x3a\xb9\xc7\xe4\x75\x4e\xe2\x39" + "\xc4\x7f\x22\xca\x36\x73\x3a\x6c\xe6\x51\xd0\xff\x69\xd1\x95\x85" + "\x99\x91\x65\x85\xd7\xef\x5e\x4a\xe9\xd1\x65\xd9\x59\xdb\x2e\xd1" + "\x18\x73\xfe\xc1\xda\xd4\x29\xda\x1d\xbd\xb7\x62\x4e\xe1\xb5\x6b" + "\x9f\x14\xbb\x3c\x4b\xe3\x67\xdd\xb2\xa7\x6a\xcf\x8a\xab\x7f\xe7" + "\x23\x8a\x35\x2b\xc7\xe8\x66\x5c\x92\xf5\x75\xd3\x4e\xac\x83\x8d" + "\x3b\xa5\xe5\x5f\x51\x5f\xd8\xb9\x96\x3e\x17\x85\xef\x4c\x11\x59" + "\xf8\x1b\x09\xe5\xf3\xe4\xfe\x50\x8f\x86\xc2\x08\xf9\x4b\xff\x42" + "\xe5\x4b\x79\x8c\x0e\xf5\x60\x3b\x8d\xfd\x21\x51\xde\x7e\x86\x0e" + "\xdd\x64\x0b\x63\xce\x08\xc3\x76\x7e\x8e\xd7\x7a\x87\xee\xe0\xf5" + "\x66\x80\x0e\x15\xb1\x4f\xb8\x6f\xe9\x03\x9c\x36\xd9\xf5\x95\xf4" + "\x7d\xc8\x56\xf7\x4e\x0f\x69\xfc\xee\xe2\x3b\xae\x99\xf7\xcc\x7c" + "\xf7\x72\xb8\x87\xda\x83\x38\x64\x7c\x33\xa5\x32\x47\xad\xb9\x0e" + "\x69\xdd\xf1\xae\xee\x1d\xdc\x24\x38\xce\x72\x75\x84\xa6\x85\x44" + "\x40\x9e\x53\xf2\xdd\xfe\xd2\xfb\x7d\xe2\x92\x97\xd4\x7d\xb4\x43" + "\x5f\xe9\x15\x83\x9b\x54\x0c\xc0\x43\x9f\x93\xf2\x31\xc2\x1c\x39" + "\x38\xa0\xf6\x68\x07\x07\xd5\x9e\xe5\x10\x5a\xdf\x8f\x7d\x90\x0f" + "\x35\xb7\x65\x0c\xe1\xdf\x83\x6d\x99\x63\xeb\xba\x9f\x8f\x06\xf2" + "\x5d\xa4\x2c\xde\x2b\x67\x7f\xe2\x1a\xe5\x47\x8c\x36\x3e\x6c\x11" + "\x15\x32\x6f\xc0\xa9\x62\x4a\xe5\xfd\x45\xa4\xdd\x33\xa2\x9a\x34" + "\xe0\x7a\x83\xb0\x0f\xae\x93\xbe\x5b\xde\xc1\x3e\x7f\xab\xf0\xb1" + "\xcf\xa0\x3a\xd3\xf8\x30\x24\x32\x06\xd7\x19\xe5\x5f\x68\x6c\x45" + "\x1f\xec\x83\xdd\xfe\xf0\x59\xc3\x26\xfc\x10\xbc\x3f\xd8\x2d\xbc" + "\x83\xbd\xea\xae\xf8\x87\x9f\x99\x7a\x55\xf1\xe8\x87\x7f\x52\x74" + "\x1b\x48\x8a\x6e\x1f\x86\x8c\xf9\x6a\x00\x3f\x63\xee\x76\xaa\x33" + "\xf8\x0f\x7d\xa6\x8d\x1c\x30\xca\x70\x1d\x3c\x1b\xb1\x70\x3e\x0c" + "\xa0\xef\xa5\x46\xbe\xfc\x6e\x01\xfa\x07\x5d\xff\x61\x7f\xee\x57" + "\x77\xba\x55\xd2\xa2\x8c\x52\x81\x73\xad\xae\xe2\x22\x87\xfc\xa1" + "\xfb\x7d\xea\xbb\x7d\x87\xd7\xca\x3b\xb3\x68\x07\xe3\x63\x61\xbd" + "\xc9\x77\x7c\x19\x5e\x17\xfe\xff\x32\xc7\xc4\x85\xdb\xe3\x3c\xf4" + "\xd5\xcd\xe3\x09\x5a\x79\xb9\x0c\x8f\xeb\xe9\x62\xde\xbb\xb8\x08" + "\x9a\xb1\x1f\xd0\xe1\x4d\x4c\x13\x45\xb3\xc3\xf2\xdb\x60\x5b\x3b" + "\xc7\xe1\xf0\x53\xf1\xf4\x50\xef\xba\x1d\xba\x61\x29\xfb\x83\x1c" + "\xde\x64\xd0\xaf\x55\xb5\x7f\x78\xac\xb1\x56\x47\xde\xbf\x7c\x1d" + "\x53\xf7\x07\x9d\x65\xd5\x37\x22\x2d\x7c\xb6\xca\x7b\xed\x8a\x5f" + "\x0f\xf7\xef\xaa\x77\xb8\x7f\xc1\xd7\x6c\x23\x0f\x70\xf3\x37\xfd" + "\x98\xe6\xed\x9e\xc3\xce\x2e\x7a\x2b\x38\x49\xda\xb8\xc5\x6c\x23" + "\x40\xff\x12\x34\xf1\xc4\xb3\x31\x07\x1f\x2e\xe9\x1a\x93\x7f\xd9" + "\x6e\xd6\x63\xff\x7d\xbc\xe7\xf0\x7d\xc1\xa4\x7a\x90\xcf\x74\x80" + "\x5d\x63\xe4\x7e\x9f\xe4\x47\x3a\xdc\xca\xbe\xae\xa0\x6b\xad\xe2" + "\xa1\xc3\x4d\x6a\x2e\x3c\x2c\x63\xb7\xf0\x79\xc9\x91\x30\xf3\xc8" + "\xe1\x66\xc0\x35\xf6\xcb\x0f\x87\x0d\x1c\xb0\xfe\x3b\x14\x4c\x5c" + "\xd7\x3d\x30\x67\xae\xbc\x18\x3b\x6c\x79\x71\x62\x9c\xca\xb4\xae" + "\x3b\x90\x1f\x8d\x8a\xb9\x43\x9a\xa3\xe8\xfd\x91\x1b\xeb\xd4\x03" + "\x5b\xd4\xba\xf5\xe0\x16\x8c\x99\xeb\x22\xf5\xe3\x6f\x63\x94\x17" + "\x8b\x33\x8d\xff\x9b\xbd\xef\x81\x8b\xaa\x4a\xfb\x3f\x33\x80\x91" + "\x91\x8c\x86\x36\x95\xd6\xd4\x4a\x51\x59\x51\xeb\xff\xb5\x5d\x2a" + "\x2d\x6b\x45\xa8\xc5\x5e\x2c\x52\x54\x28\x34\xff\x8c\x88\x88\x88" + "\x80\x68\x2c\xb5\x82\x83\xa1\x61\xa2\x52\x6b\xfb\x52\xeb\x1f\xda" + "\xb5\xf7\xc5\x5d\xff\x4c\x89\x2d\x2a\x30\x54\xd8\xa2\x8b\x3a\x22" + "\xba\xc4\xa2\x8d\x82\x32\xe0\xcc\x3d\xbf\xe7\x39\xe7\xde\xb9\x73" + "\x87\x19\x70\x4c\xb3\xfd\xed\xcb\xe7\x33\x9f\xcb\xb9\xf7\xdc\x73" + "\xcf\x3d\xcf\x73\xbe\xe7\x79\x9e\xfb\x9c\xe7\xd1\x83\x2e\xad\x09" + "\x5d\x09\x78\x81\xb9\xa1\x7a\xa3\x2f\x05\xe2\x0d\xfa\x6a\xd2\xbe" + "\x70\x3e\x3f\xd4\x20\xef\x53\xdb\x5b\x00\xba\x6d\x49\x2e\xe8\xb2" + "\x19\x67\xc9\x9d\xdc\x37\x62\xf7\x6e\xb4\xe9\xd0\x8c\xe8\xf7\x05" + "\x43\x68\x01\xee\x81\xac\x06\x8d\x90\x66\x24\xbc\x2f\xe4\x87\x16" + "\x40\xbb\x9b\x33\xe6\x90\x7e\xb8\xbe\xa1\x6d\x88\xf3\xcc\xde\x24" + "\x68\x77\x33\xc6\x27\x13\x68\xb4\x0a\x9e\xdf\x24\x68\x86\x6b\x73" + "\x05\xc2\x7c\xbf\x81\xcf\xd4\x0d\x64\xcf\xad\xf0\xfc\x26\xcc\xd1" + "\x87\x76\x1e\x93\xd5\x8a\x31\x14\x9a\xe0\x5a\x1f\xb8\x36\x0a\x8e" + "\x02\xc6\x2a\xc3\x58\xd2\xd0\xbe\x16\xdb\x87\x67\x35\xf1\xbe\xb3" + "\x18\x22\x4d\x50\x6f\x0e\xd6\x91\x62\xa0\x09\x19\xd1\x3e\x78\x1d" + "\xf7\xd4\xda\xe1\x3e\x13\xac\x18\xfc\x9e\x3a\xc7\x3d\xa2\xfc\x0c" + "\x73\x79\xef\x1c\xba\x7a\x54\x05\xd4\x2d\x43\x5f\x53\x2e\xcb\xee" + "\x4d\x10\xe7\x3a\xc8\xc7\x7b\x67\x8a\xff\x07\x38\xea\x66\x44\x93" + "\xf4\x0e\xa2\x65\xdf\x4b\x17\xf9\x00\xf6\xee\x5d\x03\xe3\x80\xf6" + "\x85\x3a\xa6\x8f\xab\x77\x3b\xf6\xe5\x6c\x64\x7b\x77\xf6\x38\xe2" + "\xbf\x01\x6d\xca\x57\xf1\x98\x79\x15\x02\xfe\x9f\xcc\xf6\xcc\xf5" + "\x46\x3d\x03\x6d\x07\x53\x17\x17\x3b\xf6\x38\x70\x1d\x7c\xaf\xce" + "\x29\x56\x14\xbb\x17\x75\x71\xbc\x37\xc2\x46\x2f\xae\x12\xeb\xe2" + "\xbd\x11\x8b\xa7\x52\xbc\x17\xee\x89\x72\xdc\xa3\xd8\x23\xb3\x97" + "\xf3\x3a\xbc\x03\xfe\x6f\x81\x3e\x8b\x3e\x48\x3a\xfe\xfd\x78\xef" + "\x4a\xe9\x9b\xad\x99\xec\xae\x47\xba\xb9\x8f\x85\xbc\x77\x87\x32" + "\x6e\x8f\x71\x05\xc6\x14\x82\xf3\x95\x52\x7c\x1d\xf8\x1f\x9e\xb7" + "\x9b\xfb\xc1\x39\xc5\xcd\xca\x73\x8a\xc1\x97\x61\xa1\xa7\x90\x1e" + "\x30\x7f\x7d\x40\xd2\x1b\x4c\xf3\x87\x6b\xf9\x3e\x23\xe3\x42\xec" + "\x67\x03\x31\x8e\x85\x72\x20\xdf\xdf\x6f\x1c\x26\xce\x53\x5d\x84" + "\xdd\x16\x68\x86\x67\xe2\x9e\x19\xa7\xf2\x10\x98\xb7\x1a\xa8\x17" + "\xcf\x63\xd4\x19\x07\xbb\xd4\xc7\xeb\x99\x2e\xe5\x30\x97\xb2\xae" + "\x0d\xf8\xd3\xd3\xb7\xe9\xdc\x3b\x99\x5d\x6e\x6c\x9f\x65\x44\x9f" + "\xf1\x1d\xf1\x01\x7e\x3d\x8d\x7d\xab\x6e\x6a\xc1\x77\x0a\xa4\x59" + "\xa1\xc4\xd4\x64\xe3\x32\x1c\xac\x9d\x0d\x83\xa1\xce\x77\x64\x00" + "\xfa\x4d\x63\x5e\x03\xa8\xdf\xcc\x63\x30\x7f\x71\x6b\xcc\xc2\xde" + "\x44\x78\x23\xfa\x16\xaa\x8e\xb0\xe2\xb7\xb1\xad\x9d\x66\x3f\xfc" + "\x4e\x94\xbe\x8e\x0c\xc4\xf8\x36\x30\x3f\x1b\x31\xe7\x15\xe6\x20" + "\xff\x7d\x67\x93\x9f\xc9\x76\x94\xe8\x67\x11\x75\x33\xf9\x82\xf8" + "\xa6\x11\xdf\x55\x67\x88\x06\xe8\x6a\xdb\x67\x1b\x49\xa4\xfd\xf9" + "\x45\xfd\xf8\xde\xe2\x22\xc0\xb1\x05\x5a\x6a\x6d\xcf\xfa\x1c\xe4" + "\xff\x0f\xfc\x25\x5d\x76\x25\xcf\x5d\xe0\x7b\x86\x7c\x7e\x40\x2d" + "\xc6\x22\xe0\x63\xfb\xf9\x3a\xbe\x4f\x29\xe8\x76\xb8\xc7\x49\xfe" + "\xfd\x62\x20\x1f\xc3\xe1\x63\x38\xc6\x7c\x31\x70\x5f\x1c\xc1\x9c" + "\x35\xf8\x8d\x3f\x08\xea\xee\x72\x7c\xe3\x67\xf6\xa1\x2f\x60\x4d" + "\x1b\x3e\x86\xcb\xc0\xc3\xc7\x4c\xb5\xfb\x8b\x38\x80\xe7\xef\xc9" + "\xc4\x7b\xe1\xbe\xc0\x36\x66\xcb\xf9\xdc\x2a\xf3\xda\xe7\x46\xc4" + "\x56\x78\xa7\x00\xf8\x7f\x28\xbe\x17\x8e\x09\xd4\xf3\x85\xf2\xc8" + "\x7d\x9b\x3d\xc4\x2a\xd5\xe8\x42\x6d\xcc\xd6\xb0\x7a\x3c\xf0\xd3" + "\x59\xa0\xc1\x6d\x18\x8f\xc8\x04\xcf\xa9\xda\xd8\x49\xaa\xb4\xad" + "\xa4\x1a\xfe\x47\x5f\x5e\xe3\xac\x53\xa4\x51\xe7\x1e\xd7\x61\x6d" + "\x28\x85\x3e\x1b\xb1\x2d\xc0\xca\x26\xf4\x7f\x32\x81\x46\x54\x6d" + "\xc1\x5c\x5b\x84\xb5\x51\x25\x34\x91\xaa\x14\xd4\x67\xb6\x44\x56" + "\x6f\x3c\x4a\xaa\xb5\xdf\xb0\xe7\xa0\xec\x65\x4c\x6c\xed\xae\xed" + "\x1a\x68\xdb\x2c\xb6\xdd\x02\x6d\x07\x79\x6e\x3b\xbf\xd8\xcb\xb6" + "\xbd\xe8\x77\xbe\xc1\x9b\xb6\x01\x2f\x87\x9a\xb4\x7c\x5f\x54\xfa" + "\x1d\xe4\x56\xfb\x25\x8c\x45\x79\x0f\xe5\xfe\xa4\xfb\xce\xb3\xbd" + "\x53\x59\xcc\x5f\x37\x94\xed\xa1\x3a\x47\x98\x4f\x20\xdf\x37\x75" + "\x9a\xa0\x3f\x41\x7b\xd6\xbe\x7a\x59\x27\x71\x7c\xe7\x01\x59\xb0" + "\x9c\xfb\x68\x1a\x42\x43\x39\x5f\xed\xfb\x0c\xdb\x72\xdf\x8f\xc7" + "\xc7\x72\xff\xd3\xf2\x51\x92\x9d\xa3\xb5\xef\xe3\x63\xc5\xb6\x74" + "\xae\xf6\x33\x29\xc9\x65\x7c\x4a\x92\x94\x2f\x33\x49\xdc\xbe\xf9" + "\x52\xfc\x8c\xf8\x99\xc9\xf1\x71\xba\xa8\x85\x89\x73\x1f\x99\xf7" + "\xfa\xeb\xba\xf0\xf8\x05\x0b\xa6\xbd\x11\xdf\x9b\x44\x25\x4e\x9b" + "\xbb\x60\x26\xda\xb8\x74\xba\xb1\x3f\x9f\x9a\x30\x2f\xe9\x91\x5f" + "\x8e\x0d\x75\xb1\x71\xe1\x5e\xbf\x7a\x94\x75\x33\x96\xc2\xfc\xb4" + "\x93\xbe\x18\x5b\x26\x70\x31\x35\x2e\x01\x3d\x0b\xf8\xaf\x19\xd7" + "\x03\x98\xb7\x27\x51\x06\xc7\xb8\x76\x80\xdf\x95\xeb\xd7\xd2\x9a" + "\x33\xe4\xdb\x4f\x41\x7e\xab\xdb\xc4\x63\xb4\xd5\x83\xee\x6b\xe1" + "\x39\xdd\xbe\x45\x5f\xd6\xf2\xdf\xc1\x39\x4b\xdf\xe1\x63\x56\x1d" + "\x27\xbe\xb0\xce\x80\xfc\xbf\x7f\x02\x55\xdf\x44\x57\x0e\xa0\xe5" + "\xf4\x94\x96\x88\x71\xa7\xd5\x26\xb3\x15\xbf\x87\xfb\x47\xd8\x32" + "\x28\xe2\x29\x9f\x5b\xfb\xc3\xf9\xb8\xfc\xac\x86\xfb\xe5\x7e\x3b" + "\x07\x75\x85\xe5\x2c\xe7\xde\x7e\x98\xff\x65\xbb\x64\x9c\xae\x4e" + "\x11\x65\xb4\x3a\x18\xf7\x45\x0d\x50\xe6\xb1\x2f\xf6\xe7\x28\x7d" + "\x1d\xfe\x06\xeb\xdf\xd7\x45\xfc\x87\xf7\x7c\xbd\x8b\xff\xf0\x7f" + "\xe7\xdf\xb7\x91\xfc\xe7\x7a\xfe\x87\xfe\xa4\xe7\x5f\xed\xfd\xa6" + "\xd0\xee\x7f\x57\xf2\x7c\xf6\xde\x37\xf0\xfd\x7f\xc8\xfd\xa6\x91" + "\xdd\xfd\x90\xdf\x80\xb7\xea\x7f\x77\x9c\xf8\x03\x7f\x16\xe4\x4e" + "\x07\x9e\x3e\x46\xb4\x69\x36\xda\x98\xf1\x1a\x19\x98\xfe\x1d\xc1" + "\x9c\x67\x4d\x49\x29\xb4\x31\xfd\x12\xca\x7e\xa6\x9b\x81\x7f\xcb" + "\xf2\x1a\x48\x40\x6e\x03\xd1\x54\x27\x61\xee\x53\x8c\x3f\x05\xad" + "\x81\xa4\x6b\x82\x72\x65\xb2\x95\x1c\xb2\x9c\x47\xff\x20\x63\x75" + "\x2c\xe0\x4e\x3d\xe6\x8d\xa5\xe5\x01\xb1\x24\xa8\x68\x00\xdd\x45" + "\xb3\x66\xfb\x52\xf5\x9b\x6d\x70\xae\x76\xbb\x10\xe6\xb7\x3d\xb5" + "\xc2\x0f\xf3\xc3\x35\x90\x8a\x5b\x45\xde\x5c\xcc\xf7\xe4\x54\x33" + "\x7b\x05\xcc\x93\x5a\x6e\xbf\xae\xbe\xc8\xd7\xf3\xea\xfd\xa2\x5d" + "\x07\xff\x67\x32\x19\xbc\x47\x19\xe6\x88\xc4\x36\xb7\x09\x65\x2c" + "\x47\xe4\xf6\xd4\x30\xbf\xb4\x69\x44\x5d\x6d\x6e\x26\xfb\x00\x07" + "\x31\xdf\x20\xcc\xbb\x2d\x30\xcf\x4a\x37\x0c\xa0\x06\xe8\xdf\xca" + "\x8d\x03\x68\x0e\xf4\xa9\xa4\x3d\xab\x22\x0d\xd6\x2c\xbd\xf8\x7d" + "\xc3\x08\xf3\x62\x4b\x2e\xd4\x89\x58\x48\xee\xc9\x85\x7a\x79\x50" + "\x0f\xe5\x51\xde\xbf\xca\xa7\x60\x0c\x76\xc0\x33\x6b\x74\x53\xb0" + "\x7c\x80\xd9\x86\xf0\xd9\xf0\x1e\xba\x06\x72\xa0\x12\xd6\x36\x5f" + "\x7c\x86\xf4\x5c\x68\x1f\xf0\x6f\x9f\xf4\x7d\xd5\xc0\xdb\x39\xe0" + "\xcf\xe7\x6b\xe8\x8e\x55\x8e\x1c\x9e\xa1\x3b\x72\x53\x61\x4d\xef" + "\x64\x71\x19\x51\x96\x66\x32\x06\x93\x2b\xec\x24\x90\xeb\xe1\x20" + "\x5b\x24\x00\x0e\x80\x3c\xc1\x7c\x89\x41\x96\x80\xbe\x14\x60\x1e" + "\x4d\xbc\x0e\xfa\xd1\x0e\x58\x97\x4b\x51\x0e\x98\x72\xf1\x05\x82" + "\xb6\x6c\x90\x07\x7c\x17\xc4\x50\x2b\xcf\xf7\x71\x20\x41\x92\x05" + "\x10\x83\x70\xfd\xcf\x4d\x26\xbe\x97\x81\x86\xc0\x03\x15\x20\x5b" + "\xf4\x6d\x26\x07\x36\x8b\x63\x5f\xc1\xd6\xfc\x64\x16\x47\xd8\x87" + "\x63\xf4\x81\x4f\xe1\xfd\x02\xe0\x19\x20\x3b\x7e\xcb\x72\x7c\x73" + "\x8c\x39\x60\x94\xd6\x71\xd4\x2d\xcd\xd0\x06\x05\x2c\x13\xaf\xc1" + "\xfb\x1b\x0b\xa4\x67\xc2\x35\xbd\x38\x66\x95\x30\x66\xd0\xe6\x41" + "\xb6\x9f\x1c\x64\xae\x31\xe2\xd8\xa4\xa1\x5c\xc1\xef\x3d\xa8\x95" + "\xda\x45\xfd\x57\x00\xb9\x02\xc7\x0b\xc7\x09\xda\x49\x13\x71\xac" + "\x96\xcb\x2f\x95\x0f\x8a\xdf\xb5\x0d\x40\xeb\x15\xf2\xf8\x1f\x8c" + "\x71\x1e\x7f\xb8\x7f\x05\x7f\xce\xa1\xc3\x4e\xb4\x03\x1d\xe4\xd0" + "\x16\xb4\x47\x42\x1f\x77\x71\x5b\xca\xc1\x35\x18\xbf\x0b\xe3\x05" + "\xc3\x18\xef\x5a\x89\xb1\x69\x01\x9b\x97\x1f\x27\x62\xfe\xd6\x43" + "\x6b\xb8\x7c\x7a\x68\x28\xcf\x71\x78\x68\x10\x96\x1b\xa1\x5f\x3c" + "\xbf\xe1\x21\x3f\x9e\xdf\xf0\xa0\xdd\x39\x67\xab\x9c\xaf\xf5\x60" + "\x9b\xec\xcf\x7f\x50\xc7\xf5\xd4\x83\x3a\xb4\x35\xb1\xfa\x97\x13" + "\xb0\x6f\xf5\x38\x2f\xa5\x77\xc5\xdc\xad\x70\x1e\x65\xff\x7a\xa4" + "\x9b\x74\x1e\xe3\xda\x02\x9d\x02\xe0\x99\xb9\x62\x9f\x12\xa0\xec" + "\x0f\xcf\x66\x7e\x34\x98\xc7\x75\x15\xde\x93\x2e\xdf\x83\xf3\x06" + "\x78\x38\x10\xee\x79\x0b\x8e\x54\xaa\xcb\xf3\xbb\x1e\x0a\x78\xb7" + "\x13\x6d\x4d\x87\x06\x4b\xf9\x5d\x31\xb7\x2b\x62\x46\xee\x14\xc5" + "\xd8\xe3\xd8\x6c\x01\x5a\x31\xbe\xdb\x67\x2b\x83\xf7\x3a\x04\xf2" + "\xff\x67\x62\x2c\xb9\x43\x01\x62\xff\x8c\x3c\xef\x41\xf9\xd8\x8d" + "\xab\xa5\x58\x06\x87\xda\x1c\xfa\x90\x43\xb6\x3c\x14\x80\x3c\x09" + "\x6d\x55\x22\xfd\x51\x4e\x6c\xcf\xaa\x1c\xe8\xe0\x2d\xb6\x5f\xf6" + "\x50\x11\xca\x97\x62\xff\x91\x5f\x96\x8a\x63\x37\xd6\x79\xde\x39" + "\xcf\x73\x68\x23\x16\xe6\xb8\x83\x07\xa4\x79\xcd\xf9\xa0\x6a\x8d" + "\x28\x53\x8c\xc7\xb8\xb2\xd0\xae\x11\x65\x70\xbe\xae\x56\x25\xec" + "\xab\xb7\xa1\xad\xba\x16\xca\x30\xbf\xab\xc6\xb6\xf6\x1b\x55\xb3" + "\x82\xe1\x46\x25\xe8\x3f\x8f\x4a\x79\x54\xeb\xa5\xf9\xba\x6a\x0a" + "\xea\x7e\xa1\x7c\xce\xa6\x34\x92\x6a\x6b\x0b\x11\x7d\xe5\x61\xce" + "\x9e\xc6\x6f\x94\xcd\xc0\x43\xfe\x38\x7f\x81\xbe\x5b\x30\x06\x32" + "\x8c\x63\xcd\x8a\xb5\x6c\xde\x06\xe0\xbc\xbd\x8c\x31\x18\xe0\x39" + "\xe5\xb1\x61\x64\x5f\x8a\x91\xcd\x63\x8c\xad\xb1\x1e\xc6\x0e\x73" + "\xa9\xb6\x67\x55\x85\x4a\x3e\xbe\xc8\x23\x18\x4b\x43\xe4\x93\x14" + "\x9c\xcb\xe2\xd8\xf9\x42\xbd\x68\x69\xee\x39\xd1\x9f\xd5\x71\x99" + "\x6f\x81\x7c\xbe\x55\xe5\x48\x63\x6d\x63\xf3\xf8\xd0\x60\x1b\xcc" + "\x63\xe7\x31\xc5\xf1\xc4\x71\x85\xba\xf0\xfe\x5f\x54\x4a\x63\x2a" + "\x8f\x67\x75\xb0\x48\xf3\x1a\x6e\xcb\xa9\x6a\x12\xed\x3c\x8e\x31" + "\x14\xf9\xaf\x16\xe7\xd4\x72\x7c\x77\x58\x1b\xf0\xf9\xc8\x23\xeb" + "\x45\xcc\x2a\xb7\x20\x8f\x54\xc3\xfc\x7f\x31\x47\xc6\x8e\x43\x21" + "\x4c\x67\x01\x3a\x71\xfa\x54\xbf\xc8\xe2\x55\xb8\xc1\x0e\x33\xa9" + "\xd4\xc8\xf8\x54\x1d\x2b\x8d\x83\xc4\x93\xd2\xbc\x87\x36\xb6\x2a" + "\xf1\xa7\x3a\x1f\xda\xe8\x87\xf8\x26\xcb\x50\xd5\xc5\x4a\x7c\xab" + "\xce\x41\x7c\x43\xbe\xd6\x27\xa3\x2d\xab\x5a\x8c\x7d\x5d\x11\xaa" + "\xc4\xa4\x8a\x60\xfe\x0d\x9e\xcb\x5c\xc8\x5b\xfa\x29\xbc\x3e\xae" + "\x61\x50\x9f\xe5\x29\x11\xd7\xbc\x14\x5c\xe3\xe0\x9c\x14\x0b\xbb" + "\x1e\xea\x97\xe3\xbe\x43\x8c\x35\x70\x4b\x3d\xd7\xf5\x00\xa7\x77" + "\x61\x4c\x69\x33\xf9\x5b\x7d\x35\xcc\xc2\xcb\xd9\x1c\xbb\x25\xac" + "\xa0\x33\xa2\x6f\x59\xd4\x44\x6e\xd6\xff\x92\x9e\x82\x35\x1b\x63" + "\x0b\x5a\x31\xae\x21\xb4\xad\x3b\x43\xbe\x7e\x0b\x9e\x1b\x24\x1e" + "\xb5\x70\x9c\x03\xc7\x3b\xe0\x38\x09\x8e\x77\xc1\xf1\x49\xa8\x2f" + "\x88\xf5\x43\xa1\x1c\x0c\xe7\x7f\x2e\x1e\xa1\x8f\xa6\x1d\x70\x8c" + "\x14\x65\x47\x38\xff\x55\x07\x96\xe1\xf8\x9d\x48\xf3\x4a\x4e\x73" + "\xd3\x49\x68\x27\x05\xfa\x5f\x67\xaa\x67\x6d\xe9\xa1\xce\xc7\xd8" + "\x36\xee\x03\x86\xff\x5f\x73\x92\x41\xa1\x9d\x9a\xb7\xe1\x38\x14" + "\x8e\xe1\x70\x4c\x82\xe3\xbd\xe2\x18\xd4\x20\x36\xc4\xa5\xb0\x31" + "\x67\x18\xc1\x9f\xc7\xe7\x3c\xae\xc3\x32\x76\x1c\x48\x8b\x8b\xe1" + "\xf4\x36\x93\x2a\xc6\x07\x50\xf7\x29\xac\x0b\xc7\x67\xc4\x63\x98" + "\x78\x1c\x27\x1e\x9f\x13\x8f\x63\xc5\xe3\x78\x33\xa9\x19\x2c\xca" + "\x18\x30\x2e\x35\x83\x99\x7f\x91\x21\x74\x36\x7f\xc6\x57\x63\x51" + "\x47\x06\x1c\x1f\x06\xed\xfb\xb4\x67\xd5\x94\x49\x76\x48\xb4\xf9" + "\x5c\xce\x2a\x9f\xba\x9e\x7d\x3f\xae\xa9\x71\xc2\xb6\x80\x00\x55" + "\x18\x01\x19\xa8\x7f\x91\x9a\x1a\xc4\x76\x42\xd4\xe2\xf7\x57\x31" + "\x5e\xbd\x0f\xc6\x70\x63\xfa\x50\xdf\x8f\xcb\x70\xae\x32\x1b\x2d" + "\xc6\x1b\xeb\x3b\x5c\x03\xbf\x81\xa0\x1b\xe8\x24\xfc\x46\xbd\x47" + "\x8c\x0d\xb9\xa7\x3d\xeb\xab\x31\xb2\xae\x5e\xd3\xc2\xbf\x55\xdd" + "\x7e\x2f\x9c\x8f\x72\x3a\x5f\x82\x7d\x86\xf1\xac\x83\xf7\x19\xda" + "\x40\xbe\x4a\x83\xe3\x13\x8d\xfc\x9d\x43\xa5\x77\x16\xe9\xa1\x97" + "\xc6\xb7\x91\xd4\x0c\x01\x2c\x4c\x44\x1e\x6e\x70\xe0\x6c\x0d\xdb" + "\x93\x26\xf2\x08\xd0\xd2\x84\x31\x30\x33\x9c\xe6\xa0\x33\x06\x05" + "\x41\x3f\xea\x95\x98\x72\xa0\x1e\x31\x05\x79\x03\xf0\x1b\x68\x6d" + "\xda\xe5\x32\xff\x72\x70\xfe\xf1\x79\xf7\xb5\x56\x79\x6f\x75\x8e" + "\x8d\xcf\xbb\x3a\xe0\x33\xe0\x4f\x53\x11\xd2\xc7\x4c\xbe\xb2\x8a" + "\x73\xba\x0e\xe6\xf4\x30\x38\x2f\xe6\x06\xe6\xe7\xc5\x67\x01\x9f" + "\x99\xf0\xbd\xef\x92\xce\x8b\xef\x8b\xed\x24\x21\xbd\xa5\xf3\x62" + "\xfb\xc0\x8f\xa6\xd9\x38\x4f\xa4\xf3\xe2\x3b\x81\x1c\xf5\x75\xa9" + "\x84\x27\x2b\x39\xbf\x8d\x94\xee\x43\xba\x61\x5c\x27\x6e\x4b\xff" + "\xba\x08\xe6\x6a\x31\xae\x0f\xcb\xa7\x90\x80\x45\x85\xe4\x56\x3e" + "\x2f\x51\xa7\x70\xc6\xc8\xc3\x4b\x69\x56\xa0\x8d\x6a\x86\xfb\x57" + "\xd9\x86\x4a\xf2\x6a\x51\x7b\xd6\x37\x5a\x29\x97\xb0\x1c\xfb\xfe" + "\x9b\xf0\xaa\x62\xc7\xf8\x42\x5f\xbe\x19\x23\xf5\xc5\x69\x7d\x66" + "\x34\xc0\xbe\x61\x5b\xcb\x41\x5e\x6f\x03\x5c\xe0\xb8\xfd\xcd\x6c" + "\x29\xc7\x7a\x9e\xb8\x6e\xb1\x3c\xdf\xc9\x3c\xcf\x37\xae\x8d\xe8" + "\x4b\x23\xa0\x1d\x2b\xc5\x4e\xaa\xf5\xa0\xcb\xa7\x9c\x26\x53\x17" + "\xf7\xc6\xd8\x25\xd1\xd0\xd7\x69\xd0\xb7\xcd\x76\xb4\xb1\xcf\x45" + "\x3d\xf5\x70\x7f\x7b\x32\xb5\x8a\x63\x06\xf3\xa8\xb6\x43\x1c\x5b" + "\xc4\xaf\xcd\x88\xe9\xcb\xd3\x79\x1e\x1b\xb4\xe5\xe0\xfc\x78\x17" + "\xd7\x31\x2d\xb5\x96\x17\xe1\x5c\xf9\xc6\x26\xc9\xa4\xd0\xdf\x62" + "\x2e\x13\x56\x4d\x66\xb1\x7d\x0c\xc3\xfd\xb9\x2d\xb0\xf6\x6d\xfe" + "\xee\xb5\x7a\xfe\x3d\x99\xc5\x6d\xc4\x72\x8c\x8f\x76\xc0\x6f\xb9" + "\xff\x53\x79\x2a\xf7\xdd\xa8\x9d\xe0\xf0\xdd\x90\x65\xc5\x24\x1e" + "\x77\xa9\x36\x41\x9e\x13\xb5\x23\xf1\x3e\xb8\xff\x7d\x38\x9f\x29" + "\x9f\xaf\x8a\x16\xed\x5d\x01\x7d\x96\x85\xa1\x0f\x57\x7f\x8c\xff" + "\x2c\x3e\xcf\xcc\x9e\xcf\x6c\x1e\x30\x37\xc5\xf9\x8b\xe3\x8c\x6b" + "\x36\x9b\xc3\x30\x7f\x71\x1e\x5f\xce\x1f\xae\x81\x1f\x9f\xb7\x7c" + "\x6d\x4e\x62\xf3\x96\xcd\xd9\x5a\x8b\x53\x3f\x4a\x98\xdd\x0b\xe9" + "\xb9\x44\x1b\xd0\x9e\x75\x38\x00\xe4\x55\x31\x4f\xc2\x37\xcc\xff" + "\x18\xe3\x73\xd8\x2e\x51\x0b\x7e\x43\xc6\x6f\x8a\xb8\xc7\x29\x10" + "\xb8\x1b\x63\x6a\x48\xdf\x84\xc3\x5b\x32\xa8\x1d\xbf\xef\x5c\xa2" + "\x6d\x06\x47\xfc\xf9\xc3\xd1\x72\x7c\x9c\x6f\xca\xc4\xf7\xc2\xf5" + "\xb3\x88\xfb\x5c\x7d\xf3\x31\x97\xa9\xbe\x29\x41\x3e\x35\x01\xef" + "\xc1\xb1\x90\xe7\x52\x3d\x5c\x20\xf1\x1e\xcc\xcb\xb8\x33\xe4\xdb" + "\xe0\x82\x01\xb4\x10\x68\x5a\x08\x73\x69\x36\x94\xfb\xc2\x31\x8e" + "\x1f\x55\x1a\x3c\x8a\x73\xa4\x10\xee\xad\x91\x72\x5e\xe3\xd8\xb4" + "\xf5\xcd\x37\x22\x9f\xe5\xc1\x38\x20\xaf\xb1\xef\xb5\x7a\x9e\x4b" + "\x1e\xf9\x0c\x79\x2c\x70\xd9\x0b\x8c\xcf\xd8\xfe\x7d\x38\x8f\xfd" + "\x45\x3e\x6b\xcf\xfa\x76\xa0\x14\x7b\xd6\x4c\x0e\x1b\xf9\x77\x93" + "\x6f\x43\x25\x9f\x55\xfc\x66\x93\x74\x2f\xe9\x0f\xed\xea\xca\x75" + "\x2c\xbe\xe3\x09\x93\x6d\x1c\xc1\xba\xf8\xbd\x8b\xe3\xe4\xed\x49" + "\x70\x4f\x9c\x3c\xe6\x07\x98\xdf\xc6\xbe\x18\x66\x8b\xbc\x0d\xae" + "\x65\x3a\xeb\x19\x66\xb2\x7f\x02\xea\x1a\xe8\x43\xf7\xb3\x20\x82" + "\xb9\xe9\x01\xc7\xbe\xdd\x2c\xc9\xb5\x8f\x05\xe1\x77\xf3\x72\x2b" + "\xf4\x0f\x75\x68\x78\xd7\xf2\x46\xd0\x25\x2b\x3c\xd8\x8c\x87\xa2" + "\xad\x47\xcc\x19\x53\x8f\x76\x2c\x8c\xb1\x7f\x86\x1c\x0d\xae\x2a" + "\x04\x7a\xce\xeb\x1a\x7b\x38\x3d\x85\x5e\xc4\xf8\xc3\xba\x44\x72" + "\x5b\x03\x39\x8a\xfa\x60\x5d\xc6\x79\xb4\xd1\xfc\x7d\x88\xd2\x46" + "\xf3\xf7\x34\xf1\x67\x80\x5f\x9b\xfc\xab\x5b\x21\x1e\x49\x0f\xbf" + "\x22\x5e\xb7\xae\x04\x7e\x3b\xc4\xb1\xda\xd1\x9e\xf5\x77\x87\xfd" + "\x17\xf9\x12\xe7\x36\xfa\x4b\xa0\xcd\x49\x65\x23\x18\xbb\x03\xe8" + "\x04\xfd\x5e\xfe\xd0\x4b\xc6\x54\xe4\xa3\xbf\xb3\x1c\x8e\x18\x17" + "\xd7\x3b\x9f\x9d\xbf\x33\x7a\xf2\x18\x95\x7f\x5f\x01\xcf\x2e\x5f" + "\x75\x8e\xf8\xea\x13\xc9\x20\xb4\x7f\x07\xda\xa9\x11\x75\x5c\xe4" + "\x89\x4d\x2c\x57\x4b\xdd\x5b\x49\x4b\x89\x1a\xae\xdf\x03\xff\x27" + "\x49\x72\x12\xdc\xa3\xf1\xb1\x92\x20\x94\x8f\x9e\x59\x4a\xee\x69" + "\xcf\xaa\x8b\x94\x68\x85\x32\x04\xda\xe1\x44\x5b\x02\xf6\x95\xf9" + "\x26\x62\xec\x74\x33\x1b\x37\x86\xc3\xd8\x06\xcc\xbb\xba\x31\x3e" + "\x6d\x44\xc3\xd7\x9e\x3a\xe0\xff\x72\x51\x66\xac\x8b\x06\xde\xaf" + "\x75\xea\xe7\x25\xf9\x7f\xed\x70\xbc\x3f\xb0\x0d\xe5\x33\x4f\xe3" + "\x53\x77\x52\x1a\x1f\xf4\x0b\x0d\x04\x3d\x81\xd1\xdb\x46\x5b\xa0" + "\x6f\x95\xfa\x54\xe2\xdf\x4c\x8e\x7c\xb5\x69\x2d\xdb\xa7\x56\xc1" + "\xed\xf3\x47\xf6\x4b\x7a\x38\xef\xf7\x91\xfc\xc0\x65\x3e\x04\xed" + "\xea\x18\x2f\x8c\xf9\xd4\x7d\xaf\x65\xb6\x74\x93\x6d\x0c\x31\xa6" + "\x8f\xc6\x3a\x92\x5c\x55\xdf\x9a\xa1\x25\xfb\xb4\x63\x60\x1e\x1f" + "\x89\x81\xb9\x62\xf0\xde\x77\xf1\x48\x8c\x38\xbe\x95\xfc\x9b\xff" + "\x91\x47\x70\x2d\x59\x21\xe6\xa6\xc7\x35\x1a\xda\x2e\x93\xe6\x0d" + "\xac\x1b\xe5\x70\xcf\x10\x8e\x31\xf8\x9d\xf5\x08\x8b\x2f\xc2\xf4" + "\x06\x5e\x3f\x80\xdb\xfc\x8f\xb4\x38\x64\x69\xa8\x87\xf7\x71\x5f" + "\xb0\x23\x64\xaa\x5d\x05\x63\x7a\x84\xbd\x1b\xe7\x45\xed\x98\xf6" + "\xac\xa3\x03\xe5\x79\x5b\xc7\xb0\x79\x5f\x8b\xf3\xbc\x3c\x3a\x46" + "\xd6\x37\xbf\xb5\x3c\x52\x40\xdc\xe6\xa2\xd5\xf7\x21\x9a\x7f\xf9" + "\x93\xdf\xac\x5a\x45\x8b\x0d\x6a\xe1\xe9\xe5\x79\x24\x40\xb5\x12" + "\x86\x0d\xe7\x59\x72\x6c\x7f\x98\x8f\xbb\x03\x03\x6e\x8f\x7c\x26" + "\xe9\x26\x9a\xae\x25\xea\xdc\x0b\x37\xf9\xdf\x6b\xbd\xbd\x98\xfa" + "\x3c\xf4\x52\x78\x92\x95\xe8\x66\x19\xc8\x3f\x67\x13\x9f\x67\xec" + "\xf0\xec\x00\xa2\x37\x93\xfa\x0a\xdc\x73\xb9\x2f\x00\xe5\x8f\xfa" + "\x0a\x6c\x33\xad\x88\xf8\xa7\x35\xd2\xa6\x95\xaf\xfb\xf9\xc3\x7a" + "\xa0\x59\x0f\x3c\x76\x4b\xc0\xed\xc5\x97\xa1\x8d\xcf\x63\xd9\x7d" + "\x6e\x7d\x1f\xba\xef\x9b\x7e\xc0\x19\xf2\x8f\xc9\xde\xf5\xed\x78" + "\x82\xdc\xb7\xe3\x09\xd7\xb8\x6f\x1a\xb9\x6f\x09\xd8\xb7\x8b\xde" + "\xf5\xcd\xec\x2f\xf7\xcd\xec\x7f\x85\x7d\xdb\xe2\x7d\xdf\x52\x6e" + "\x3f\x43\xea\xf3\xbd\xeb\xdb\xc9\x12\xb9\x6f\x27\x4b\x7e\x48\xdf" + "\x50\x97\x4f\x1f\x48\x4f\xb3\x18\xe7\x89\x24\x00\x7d\xe4\xce\x90" + "\x63\xe7\xd3\x8b\x58\xb9\x1f\xfc\xbf\x55\x9c\xdf\x96\x8c\x36\x7a" + "\x8a\xcb\x39\xc7\xee\x78\x54\x8f\x7e\xa5\xc7\x34\xc0\xcb\x15\x9c" + "\xa7\x8f\x33\xdf\xce\x0c\x0b\x15\xfd\x3a\x8f\x8d\xda\xc8\xfc\x3e" + "\x46\xa7\x88\xe5\xb4\xd6\x7e\xc3\xc7\xa2\xcf\x85\x00\xf3\x99\xf6" + "\x1b\x1e\x89\x39\x1f\xb7\x27\x5a\xd4\x34\x0b\x63\x6f\x61\xbc\x3c" + "\x5f\x42\x57\x0f\x8f\xdd\x9e\x68\x55\x63\xcc\x8c\xe5\x6c\xbf\xec" + "\xb1\x24\x69\x8f\x98\xf4\x0c\x4b\xdf\xd1\x29\x70\x7e\xa5\x94\x67" + "\x96\xaa\x51\x9e\x19\x3e\x1e\xdb\x87\xf3\x9b\xa5\x5c\xb0\x66\x72" + "\x6c\xa4\x88\x0d\x6d\x81\xd6\xee\x70\xef\xd8\x11\x09\xf7\x9e\x49" + "\x22\x81\x98\x2b\x71\x55\xfa\x4d\xf8\xcd\x11\xe4\x9f\x63\x09\x38" + "\xee\x11\x6d\x37\xd1\xc0\x34\xe2\x83\x7b\xe3\xd0\x17\xce\xa4\xb5" + "\x90\xc1\x69\xc4\x2f\x22\x05\xda\xb4\x92\xd8\xc0\x14\x68\x0f\xc6" + "\x9a\xeb\x06\xc7\x99\x8d\xaf\x00\xda\xc3\xef\xdf\x3e\x49\x24\xe0" + "\x19\x6d\x06\x5d\xbe\x8e\xf8\xe2\x3e\x3a\xdc\x0f\xc7\xf7\xc2\xf5" + "\xf2\x6f\xcf\x3a\x1e\x25\xbd\xdf\x15\xd0\xa7\x0f\xa7\xcf\x89\x7c" + "\x99\x3e\x27\xc2\xbb\xd2\xe7\xf8\x4e\x4e\x9f\xe3\xa5\x32\x7d\x4e" + "\xb4\x29\xe9\x73\xfc\x88\x92\x3e\x27\x06\x5e\x1d\x7d\x4e\x04\xc9" + "\xf4\x39\xd1\x26\xd3\xe7\xc4\x10\xf7\xf4\x39\x31\x56\xa6\xcf\xf1" + "\xba\x2b\xa3\xcf\x89\xc5\x9e\xe9\x73\xc2\xbf\x1b\xfa\xf4\x72\x4f" + "\x9f\x13\x07\xae\x9c\x3e\x27\xda\xbc\xa0\xcf\xad\x9c\x3e\x27\x1f" + "\x97\xe9\x63\x3e\xdb\x95\x3e\xe6\xc9\x9c\x3e\xe6\x48\x99\x3e\x27" + "\x0b\x94\xf4\x31\x2f\x56\xd2\xc7\xbc\xeb\xea\xe8\x63\xde\x21\xd3" + "\x87\x3f\x83\xd3\xc7\x5c\xe9\x9e\x3e\xe6\x46\x99\x3e\xe6\x94\x2b" + "\xa3\xcf\xc9\x3b\x3c\xd3\xc7\x5c\xe2\x3d\x7d\x4e\xce\x74\xa1\x8f" + "\xc6\x33\x7d\x4e\x16\x78\x41\x9f\x40\x4e\x9f\x86\xaf\x64\xfa\x34" + "\xe4\x76\xa5\xcf\xc9\x0e\x4e\x9f\x93\x16\x99\x3e\xa7\x86\x2a\xe9" + "\xd3\x70\x87\x92\x3e\x0d\x31\x57\x47\x9f\x86\x28\x99\x3e\xfc\x19" + "\x9c\x3e\x0d\xb3\xdd\xd3\xa7\x61\x85\x4c\x9f\x06\xed\x95\xd1\xa7" + "\x61\xa7\x67\xfa\x34\x8c\xef\x86\x3e\x37\xb9\xa7\xcf\xa9\x9b\xaf" + "\x9c\x3e\xa7\x86\x76\x47\x1f\xef\x64\xbd\x53\x2c\x86\xd6\x35\x68" + "\xc7\x73\x7e\x60\x18\x3b\xf4\xf3\x13\xb2\x4e\x19\x36\x0a\xbd\xfc" + "\xf9\x5e\x88\x53\xe3\x75\xa9\xe4\x57\x0d\xe4\xd4\xb1\x8d\x82\x9f" + "\x3f\xcd\xda\x1c\x27\x64\xfd\x21\x80\x2e\xeb\xe5\x2b\x2c\xbb\xc9" + "\x17\xf7\x36\x7b\xce\x3d\xdd\xf8\xa4\xcf\x1d\xe4\x6e\xdc\x9f\xb6" + "\x1c\xe4\x65\xfc\xbf\x3d\xab\x71\x3c\xc8\x82\x2b\xbb\xdb\x27\x85" + "\xbe\x4e\xfb\x56\xa0\x7e\xdb\x98\xe4\x88\x2b\x91\x45\x53\x30\x3e" + "\x97\xfe\x3e\xdc\xcf\xd0\x58\x54\xc0\xe2\x3d\x85\xb6\x84\xdd\x47" + "\x4f\xa0\xee\x71\x86\x9c\x5e\x47\xf3\x43\x5b\x90\x1f\x40\x56\xbf" + "\x0d\xea\x34\x3a\xfc\xe0\x68\xf4\xfb\xa2\x8d\xb0\x90\xd7\xfd\xe7" + "\xcd\x50\xb7\x10\x73\x63\x2e\x48\xc7\x9c\x8f\x67\xce\x83\xec\x7b" + "\x3f\x3e\x03\x63\x0f\x6d\x82\x23\xfa\xc9\x70\x1f\xc8\xd3\x6c\xef" + "\x2a\xc6\x35\xe4\x3e\x67\x67\x8e\x48\x7c\x07\xcf\xe9\x0d\xe5\xcf" + "\x45\x79\x1e\xeb\xdf\x02\xe5\x8f\x9d\xae\x07\x40\x39\x17\xda\xee" + "\x2b\x5e\xbf\x15\xca\xf3\x51\xce\x66\x71\x32\xf2\x32\x45\x5f\xdd" + "\x33\x51\x70\x4e\x23\xd6\xe9\x0b\x75\x46\xa1\xec\x2e\xb6\xd1\x0f" + "\xca\x83\x50\x07\x16\xaf\x07\x41\x19\xe3\x4a\xf9\x8a\xd7\xfb\x43" + "\x1f\x4f\x43\xf9\x01\xbe\xb7\xe4\xb2\x38\x47\x4f\x97\x5e\xdd\x9e" + "\xeb\xd3\x3c\x16\x97\x9a\xd9\x82\x40\x17\x38\xed\xe4\xff\x73\xba" + "\x50\x79\xed\x4c\x90\xd3\xb5\x1c\xe9\x1a\xf7\x51\x3b\x13\xea\x74" + "\x2d\xc5\xe5\xda\x04\xa7\x6b\x09\x2e\x6d\x26\x38\x5d\x8b\x76\xb9" + "\x6f\x85\xd3\xb5\xb1\x2e\xd7\x8a\x9d\xae\x0d\x15\xaf\xf9\xc0\xf9" + "\x32\xf9\x1b\xde\xe9\xc1\xe2\x79\x35\x9c\xaf\x71\x3a\x1f\x24\x9e" + "\xc7\xe7\x37\x99\xc9\x7b\x71\xe2\x79\x46\x7b\xde\xfe\x3f\x89\xdc" + "\x7e\x63\x23\xb7\x71\xfc\x33\xc8\xe1\x3b\xd7\x6f\x78\xb1\x70\x39" + "\xfa\x7d\xb8\x56\x89\x7c\xe5\xcc\xdb\x73\x93\x75\xd3\x17\xbe\xa1" + "\x4b\x8c\x4f\x42\xf7\x95\x39\x33\x93\x74\x73\xe6\xc5\xc5\x2b\xe2" + "\x94\x07\x61\xcc\x3e\xcc\xf3\x85\xb1\x4f\xc4\x98\xfa\x4d\x8e\x3c" + "\x14\x80\xab\xf0\x2c\xd0\xd7\xc6\x32\x7b\x4a\x01\x8f\xe7\x5d\x81" + "\xb1\x53\x78\x9c\x14\xf2\x42\x03\xf9\xe7\x5b\x62\x9c\x14\x23\xd4" + "\xdd\xe2\x39\x4e\xca\x77\x39\x2c\x3e\x20\xd4\xe3\x71\x52\xbe\x5b" + "\x09\xf3\xfc\x19\xda\x9b\xe7\x95\xe0\xf9\xb6\xfe\x29\xc9\x26\x96" + "\xa9\x1d\x2c\xc6\x5e\x26\xb7\x65\xb8\xc6\x3b\x0d\xad\xc4\xfb\xc4" + "\x6f\xe3\x95\xf2\xfd\x4d\x5a\x7e\x5d\x5a\x1f\xc4\x67\x1a\x42\x6b" + "\xa0\xdc\xbb\x01\xca\xcc\x7e\xcf\xae\x35\x71\x5b\x5e\x7e\x68\x2d" + "\xbe\x13\xbe\xb7\xf2\xdd\xd4\xff\xd5\x40\x9a\xa6\xc9\xef\xd6\x94" + "\xe3\x14\x4b\x4d\x7c\x87\xa6\x52\x3e\x47\xbb\xbc\x2b\xf3\x4f\xa4" + "\x9a\x50\xcc\xb5\x58\x83\x78\xc6\xf7\x0c\x40\x39\x3f\xb4\x46\xea" + "\x8f\x53\xff\xf0\x9b\x90\x2f\xf4\x2f\x97\x8d\x09\xd0\x94\x02\x4d" + "\xc5\x77\x08\xa7\x59\xff\x0c\x65\x3e\xf0\xb8\xd7\x16\xf3\x84\xb0" + "\xb5\xea\x3b\x47\xfe\x1f\x5c\xa3\xb8\x0d\xf3\x3b\x59\xfe\xc3\x18" + "\x57\xf9\xd2\xfa\xf5\x9d\x93\xfc\xc7\x9f\x09\xe7\xa2\x9d\x79\xc8" + "\xe9\x79\x6f\xe1\xf3\xa0\x1e\xe1\x7e\xf7\xa1\x2c\xe7\xbc\x99\x34" + "\x95\xa3\x2f\x26\xde\x8b\x7d\xf4\x94\x1b\xce\x53\x0c\x42\x79\x1c" + "\xbf\xab\x91\xc6\xb1\x80\xe5\x28\xfa\xce\x2c\xd9\xeb\xd8\xbe\x1f" + "\xa8\x53\xe0\xc8\x95\xdc\xcc\xe2\x98\x53\xc3\x27\x21\x8f\x05\x90" + "\x58\x3e\xb6\xcd\xfd\x11\xe3\x71\xce\x70\xac\x6f\x4e\x12\x69\x1e" + "\xc9\xfb\xdf\xfc\x24\x9e\x97\xfd\xdc\x9b\x0b\xa4\x7a\x12\x2e\xf3" + "\xef\x55\xcd\x73\x58\x3d\x9e\xbf\x36\x9a\xd3\xfc\x01\x4d\x03\x69" + "\xce\x14\xeb\xf3\xf8\xa8\x2c\xfe\x4d\x73\x11\xcd\x1f\x1d\xdd\x9e" + "\xd5\x0c\xfa\xcf\x3f\xc7\xf3\x71\xe4\xcf\x85\x63\x26\xf6\x05\xc7" + "\x08\xf7\x68\xd3\xfc\x4f\x42\x80\x3e\x91\xee\xf7\x6c\x32\xff\xe9" + "\x7b\x9a\x49\x0b\x97\x21\xd4\xd4\x8a\x36\x56\xfe\xae\x2d\x77\x38" + "\xf9\x18\x07\x48\x75\x38\x76\xb3\x6b\xcc\x77\x5b\x9f\x8c\xf6\x20" + "\xf1\x5a\x32\xee\x63\x75\xfc\xdf\xcb\xe9\x7f\x3f\xfc\x9f\x26\xd3" + "\xd2\x55\xa9\x6c\x6d\xf5\x95\xf7\xc8\xb7\x68\xa1\x1c\xe0\x52\x0e" + "\x52\x94\x17\x93\x81\xcc\xff\xb6\x8d\x36\x32\x5f\x6d\xf1\xbc\xd8" + "\xf6\xcd\xac\x3f\xc9\x74\x24\xf0\x86\x19\xf7\x3c\x8b\xf3\xd0\x8c" + "\x7b\xa5\x03\x6d\xaf\xb1\x7d\xd2\x70\x7d\xa8\x78\x0c\x15\x8f\x43" + "\x78\xee\xd0\x7f\x39\xe5\xff\x46\x1b\xcd\xbf\xcc\x9e\xf2\x91\x4b" + "\xf9\xda\xa5\x7c\xe4\xb8\xcf\x5a\xcc\x9f\x1a\xd3\x9e\xd5\xa2\xed" + "\x2e\xf7\x3b\x5c\x1f\x29\xed\x99\xb6\x1b\x42\x57\x08\x86\xd5\x39" + "\x98\xab\x12\xe3\x6c\x65\xb4\x60\xac\x95\x36\x62\x22\x9d\xc4\x94" + "\xd4\x9e\x89\xf9\x2a\xab\xad\x2c\x76\x31\xee\x35\x55\xa1\xdd\x1c" + "\x65\xc7\x6a\xfd\x59\x96\xab\x72\x51\x0b\x19\xa8\xff\x25\x6d\x84" + "\x31\x28\xb2\xe7\x87\xae\x10\xf9\x68\x1d\xac\x81\x77\xc3\x58\x30" + "\x7b\x31\xcb\xb5\xdc\xc2\xbe\x7b\xf9\x9f\x21\x67\x87\xb0\x3a\x34" + "\x7a\x1d\x1f\xbb\xb3\xcc\xf6\xb5\x29\x4b\xca\x47\xd8\xe2\xc8\x7f" + "\x6c\x26\x67\x43\x2f\xf6\x9d\x93\x00\xe7\x9a\x94\x3e\xd3\x67\x59" + "\x9b\xd8\x77\x33\x69\xd9\x8c\x6d\xb7\x67\x9d\x0d\x70\xcc\x59\x38" + "\xbf\xc8\x46\xee\x84\x7e\x9d\x91\xda\x87\xeb\x30\xff\x9b\xcb\xf0" + "\x3a\xb6\x79\x31\xff\x5d\x68\xf7\x6c\x98\xd9\xd7\xc7\x97\xfb\x5c" + "\x9f\x85\xf5\xef\xc3\xb2\xee\x64\x20\x98\x0b\x39\x30\x97\x0c\x82" + "\x61\x74\x26\x8f\x85\x3d\x3a\x87\xdb\x18\xcf\xae\x43\xbf\xae\x55" + "\x97\x88\x2f\xfa\x40\x70\x9e\x3d\xcb\xf7\xf7\xc0\x39\xc0\xea\x12" + "\x98\x23\x0c\x13\xbc\x5b\xf7\xcf\xb2\x18\x3f\xab\x2e\x10\xff\xbc" + "\x44\x29\x96\xf7\xd9\x36\xa7\xfc\x03\xe2\xfe\x92\x73\x83\xf0\x4b" + "\xf9\xaa\x4e\xde\x47\xd7\x3e\x60\x7f\xa1\xad\x42\x8f\x32\xa6\x66" + "\x34\xb3\x1b\x02\x5d\xf4\xdc\x47\xf5\x5c\xbc\x8f\xf6\xae\xb5\xed" + "\x59\xe7\x62\x1d\x79\x17\xa0\x4e\x1e\xfa\xde\x43\xfb\x8e\xf7\x4c" + "\xc4\x67\x9c\xcb\xe1\x73\xfd\x5c\x91\x90\x3f\x3a\x13\xfb\x20\x9e" + "\x2f\xaa\xb6\x59\x31\xc6\x82\xdb\x38\x55\x2c\x9f\x1b\xfa\x84\xaf" + "\x1e\x9d\x89\xfb\x73\x1e\xb3\x4a\x7d\xfe\xbe\x08\xf7\x85\x60\x9f" + "\xf9\xd8\x7e\x9f\x2f\x8d\x63\xee\x05\x68\x3b\xfd\x28\x69\x24\xdf" + "\xdf\x81\x7e\x73\xb8\xcf\x09\xe7\x30\x1f\x83\xef\x99\xce\xc7\x9e" + "\xcf\xea\x9c\x63\xba\x3f\xcb\xad\x03\xed\x6f\x64\xf9\xc1\xe0\x1d" + "\x80\x16\xc6\x74\xdc\x5b\xff\x3d\xdb\xe3\xb3\x3c\x91\xf0\xf7\x66" + "\x7e\xb2\xdf\x8b\xdf\x49\xbe\x8f\x96\xd6\x0a\xb3\x78\x6e\x15\x3e" + "\x3b\xb9\x93\x9c\x23\xdf\x8f\xc2\xbc\xdf\x30\x1e\x06\x8c\xef\x56" + "\xdd\x06\xf3\x24\xa5\x13\x79\xc1\x80\xf9\x24\xa1\xfe\x48\xbe\xbe" + "\xe1\x98\x7f\x3f\x10\x9f\x8f\x63\x0b\xb4\xb3\xc0\x98\x6e\x86\xb6" + "\x77\x48\x63\x9a\x37\x00\xf5\x9d\x73\x35\xdd\xad\x0d\x76\xe8\x73" + "\x35\x50\xce\x78\xe7\x51\xe8\x9f\x65\xa9\xd0\x6f\x74\x26\xfa\x64" + "\xc3\xff\xe2\xde\x34\x4e\x3b\x3e\x97\x2c\x93\xe0\x19\x26\xf4\x6f" + "\x40\xac\xc4\x18\x64\xf0\x4e\x36\x71\xfc\x58\x3e\x06\x43\x32\x1f" + "\x07\xb1\x7e\x29\xb7\x17\xdf\x75\xb8\x3d\xcb\x32\x41\xb6\x17\x5b" + "\xd8\xda\x8d\xfc\xb6\x91\xe9\x84\x96\x04\xa7\x3e\xb7\xb1\x7d\xa6" + "\x17\xd0\xd6\x67\xd1\xe0\xb3\x72\x31\xfe\x16\xf2\x45\xb3\x33\xff" + "\x7f\x7f\x1e\xfb\x89\x3e\xbf\xf6\xbe\xc3\xf5\xb0\xde\xe2\x1a\xa3" + "\x87\x7b\x42\x60\x2e\x64\x76\xb3\x16\xb2\x5c\x70\xf0\xcc\x7a\x69" + "\x2d\x04\xfd\x02\xd6\x85\xf3\x87\x99\xde\x09\xf2\xb4\x49\x40\x79" + "\xe6\x3c\xe6\x3c\x44\x7d\xa3\x42\xc4\xd8\x8a\xf6\xac\xf3\x1a\xe9" + "\x9b\x97\x1d\xf7\x4d\x9c\x63\xdf\x7b\xdb\xa4\x1c\x67\x3c\xde\xdd" + "\xf9\xa1\xf2\x3e\x8b\xf3\x61\x5d\xf6\x59\xe0\x1e\x9b\xb5\x2c\x17" + "\xd6\x16\x5c\x53\xaa\x5a\x1a\x71\x8d\x60\xf7\xe3\xde\x8b\x74\xd0" + "\xc9\xf9\x3e\x9d\x46\xb4\xcf\xb3\x9c\x21\xd8\x17\x9e\xbb\xa1\x81" + "\xfd\x0f\x7c\xeb\x8b\x47\xce\x4b\xe7\x37\x3b\xf2\x78\x03\xbd\xf1" + "\x5b\xdb\x3e\xdf\x67\x89\xf1\x3e\x5c\xaf\xcf\x1f\xc6\x9c\xd4\x50" + "\xa7\x42\xca\x47\xcd\xf2\x4f\xf3\xf7\xd9\xe5\x31\xae\xe1\xa3\x24" + "\x14\xf7\xe5\xe3\x3e\x36\x36\x06\x9a\x8f\x2b\x30\x56\x32\xc6\x7d" + "\x34\xa6\x62\x4e\x93\x0b\x6f\xbd\x3b\x80\xed\x05\x6e\x33\x3e\x7a" + "\x01\xfd\xb0\x5a\xce\xa4\xb1\x78\x46\xfe\x11\x29\x36\x8a\xf7\x31" + "\x79\xa2\xef\xc7\x28\xd3\xb5\xb0\x5c\x01\xd8\xe6\x55\xc7\xfd\xbd" + "\x10\x29\xca\xa6\x2d\x80\xfb\xb7\x37\x93\x0b\x4c\x76\x87\xff\x07" + "\x34\x93\xd6\xad\x3c\x2f\x2a\x8f\x5d\x2f\xfa\x63\xf7\xe2\xb1\x2c" + "\x60\xcc\x58\x6c\x81\xd6\x7b\x75\x0f\x61\x0e\xe1\xd6\x60\x16\x47" + "\xda\x10\x5a\x27\x8e\x41\xdd\x2a\xde\xaf\xc0\xa9\x29\x6a\xd6\x47" + "\xec\x9f\x97\x7d\x6b\x11\xf5\x88\x5e\xed\x59\xad\xa1\x52\x0c\x0c" + "\x2e\x4f\xf1\xf8\xd2\x9c\x16\xad\x1b\x44\xf9\x59\xf2\x2b\xad\xff" + "\xe1\xcf\x6e\x4d\x10\xdb\x2c\xe5\x31\xb6\x2f\x04\x41\xbb\xa5\xd0" + "\x8f\x32\x49\x9f\x11\xf7\x10\x0d\xe1\x7a\x56\x6b\x8d\xac\xcf\xf0" + "\x31\x54\xec\x6f\x9b\x37\x2f\x49\x17\x37\x73\x81\x7e\x5a\xd2\x8c" + "\x04\x5d\x7c\x62\xe2\xbc\x44\x1d\x06\x39\x72\x9e\x3f\x3c\x0f\x50" + "\x6b\xa3\x98\x33\xaf\x44\xce\x99\xd7\x36\xc4\x39\xcf\xa4\x99\xb4" + "\x85\x5e\x1b\xdb\x45\xdb\x04\x4f\xed\x18\xd4\x42\x29\xfc\xca\xe0" + "\x67\x84\x1f\xcb\x37\x30\xd5\x4a\xc2\x60\xad\x67\x98\x27\xc7\x76" + "\x68\xc3\x38\xa0\x61\x0d\xa4\xed\xe3\x8d\x82\x2f\x61\xb1\x7a\xb2" + "\x84\x52\xac\xbf\x09\xee\x87\x1f\xc6\x1b\xad\x80\x1f\xbb\x4f\xf8" + "\x82\xed\x4b\x2f\x75\xbe\xc6\xfd\x47\x96\x56\x62\x1d\xba\x0c\x55" + "\x44\xcc\x09\xce\xeb\xb9\xf4\x41\x4d\xb3\xce\xc6\x8a\xf5\x98\x2e" + "\xd9\x67\x19\xd1\xb9\xa9\xe7\x43\xb3\x1a\x63\xc4\x7a\xcc\xef\x58" + "\x7a\x1f\x8c\xd5\x0f\xf5\xa5\x7a\xbe\x34\xeb\x7c\x93\x58\x8f\xf9" + "\xc8\x09\x59\x6a\x77\xcf\xf5\xa3\x59\x7f\x4e\x10\xeb\x69\x9c\xdb" + "\x73\xaa\xd3\x4b\xc8\x3a\x8a\x31\xf1\x6b\x84\x65\xbe\x41\x5c\x76" + "\x6a\x9b\x00\xf5\xdd\xee\xab\xf2\x8e\x4e\x17\xdb\x5c\xe9\xa4\x9f" + "\x31\x33\x7e\xf4\xcc\xb9\xc9\x98\xa9\x29\x69\xde\xc2\x24\x3c\xce" + "\x9d\xf6\x26\x3b\xcc\x9b\xfa\xfa\x0c\xfe\x4f\xd2\xec\x50\xfc\x67" + "\x36\xf0\x1b\x1e\xe3\x16\xea\xf1\x30\x63\x1e\x16\x53\x12\x86\x2c" + "\x9c\x21\xa5\xa7\x77\xe6\xc3\x90\xf6\xac\x4b\x45\xc0\x1b\x2b\x39" + "\xce\x5e\x82\x75\xf1\x14\xf3\xf7\xc2\x7c\x44\xfb\x43\x6c\x44\xb2" + "\x6b\x29\x63\x7b\x5c\xfa\x0c\x63\x7b\x04\x2e\xd3\xcf\x08\xb4\xcd" + "\x8c\x87\x35\x03\xd6\xcb\x4b\x8d\x66\xf2\x86\x55\xc4\xc6\x26\x16" + "\x27\x34\xeb\xd2\x50\xd1\xb7\xd3\x57\x30\x84\x16\x61\xfc\x7b\x28" + "\xb3\xdc\xcf\x50\xae\x80\x72\x23\x94\x31\xe7\x73\x10\x94\x37\xa3" + "\x4d\x0a\xca\x5a\x28\x0f\x14\x0c\x3f\x2b\xc5\xbd\xbc\x50\xd6\x41" + "\x79\x70\x7b\x56\xfb\x58\x69\x5e\xb8\x97\x95\xdb\xe3\xa4\x7c\xd4" + "\x3c\xf7\x74\x7b\x92\x23\xf7\x34\xe6\x43\x4a\xd7\xc4\xb0\xf5\x97" + "\xc9\x20\xed\x85\x3e\xda\x41\xd8\x66\xa1\xb4\x5e\x72\x7b\x47\x7b" + "\x89\x14\xa7\x84\xdb\x33\xda\xcb\x9c\x72\x78\x63\xb9\x42\xca\xe1" + "\x8d\xf6\x2e\x96\x43\x10\x8e\x34\x0b\xe3\xb1\xd2\x12\xb7\xb6\x3c" + "\x96\x7b\xd2\xfa\x08\xc6\xb6\xb5\x64\xc4\xa9\x7e\xb6\x11\x6d\x68" + "\x50\xe6\xb1\x19\xe9\x39\xd2\xce\x62\x8d\x48\x71\xdb\x9c\x63\x36" + "\xb8\xdd\x0f\xf5\x35\xc8\x0c\x2c\x5f\xd4\xec\x79\x81\xb6\x69\xf1" + "\x5c\x0e\xb4\xe6\x72\xfc\x1a\x5e\xc0\xe5\x05\x6b\x0a\x7d\x89\xe7" + "\x14\x31\x13\xab\x0d\x75\x96\x40\xd5\xec\x79\x14\xee\x0d\x4c\x99" + "\x16\xcf\xce\x41\xbd\xe5\x20\xab\x89\xfd\x7b\xcd\x34\x10\xf7\x92" + "\x0a\x62\x2c\x0a\x6b\xcc\x94\x41\x99\xf8\x1c\x7f\x26\x87\x7c\x4d" + "\x02\x30\x07\x24\xf6\x6d\xa3\x53\x5c\xb9\x55\x70\x0e\x7d\x48\x5b" + "\x5f\x22\x01\x18\x47\x57\xec\x4b\x0c\xcf\xbf\x65\x6d\x93\x62\x3a" + "\xc1\xf3\x62\x5c\xdf\xe7\xa5\xdf\x30\xae\x0c\x9e\x31\x24\x72\x1c" + "\xfc\x37\x44\x4c\xa3\xec\xcc\x9b\x03\x5b\xfb\x8d\xcc\x6c\xdd\xf6" + "\xd4\xed\x3c\x57\x66\x07\xe8\xff\xed\x4d\xcc\x87\x05\xf5\x92\xf6" + "\xe8\x42\xee\x83\xda\xb1\x14\xe3\xd6\x0a\x59\x28\x4f\xe2\xfe\xe4" + "\x8e\xd9\xc8\xb3\x54\x33\xbc\x70\xd3\x52\x8c\x91\xac\x82\x31\xee" + "\x98\x86\xd7\xc4\xd8\x58\x6a\x16\x4b\xca\x4e\xb4\x6c\x2f\x2e\xc8" + "\x28\xb8\x07\xf5\x0c\xb1\xcd\x41\xb9\x03\xed\x49\x42\x56\x87\x3f" + "\xf2\x2d\xd0\x18\x63\x75\xb4\xd1\x7e\xa1\x39\xb4\xef\x88\x31\xc8" + "\xc7\x28\xeb\x9a\x34\x38\x66\x1d\xb5\xf0\xdc\x67\xe0\xf7\x5f\x3c" + "\x77\xcb\xab\x4d\x52\x9b\x18\xbf\x0c\x64\xa8\xcd\x70\xd4\x40\xbf" + "\x6d\x4e\x39\xed\xc4\xbd\xc7\x9d\x83\x30\xae\x1a\xb6\xcd\x65\x67" + "\xdb\x64\x2e\x83\x74\x86\x98\x49\xa0\x81\xcf\xc5\x4e\x90\x7f\xb2" + "\x4b\xc4\xff\x41\xfe\x79\x3c\xd2\xa5\x8d\xb7\x25\x5b\x29\xe7\xe9" + "\xce\x38\xe0\xd1\x67\xe0\xf7\x5f\x50\x5f\x2f\xe5\x6d\x5f\xae\x66" + "\xfb\x24\xcf\xf8\x68\x71\x5f\x79\x67\x8e\x74\xde\x4f\x15\x06\x63" + "\xda\x59\x28\xcd\xfd\xd6\x7e\xc3\xd3\xa0\x5c\x22\xd9\x58\xb8\xcd" + "\xa5\xb3\xcc\xa9\x9c\x03\xe5\x0a\xa9\x0c\xff\xd7\x4a\x58\x81\x7a" + "\x62\x2b\xe8\x92\xa8\x77\xce\xd0\x82\x5c\xa8\x45\x3d\xaf\x13\xe8" + "\x9f\x9d\xc0\xeb\x5e\x06\x19\xf4\xed\xc1\xe2\xff\x01\x66\x5f\xbf" + "\x91\xd2\xbb\x08\x59\x3e\x81\xfc\x7d\x6c\x63\x85\xfc\xd5\x39\x96" + "\xbe\xa1\xe3\xa1\x0e\xac\xff\xed\xfc\x7d\x93\xcf\x16\xaf\xec\xd4" + "\x44\xa1\xc7\xa3\xf1\x75\xe4\x2f\x1b\xf3\xc3\xca\x4d\xd5\x44\xa2" + "\x8c\x89\xb1\x35\x58\x1c\x3c\x8c\x05\x69\x23\xbd\x58\xfc\xfd\xfc" + "\xd5\x29\x2c\xee\xfc\xa2\x90\x00\x29\x0e\x24\x60\xcb\x18\xaa\x9e" + "\x1d\x84\xb1\x21\x59\x9e\x8d\xf6\x90\x3e\x2c\x1e\xa4\x18\x07\x72" + "\x43\x32\x09\x2a\x12\x78\x1c\x48\x16\x77\xa3\x17\xe8\x24\xc9\xee" + "\x63\x41\xd2\xac\xff\xde\x25\xc5\x82\xa4\x97\xec\x56\xf8\x7f\x30" + "\xbc\x3b\xe6\x1f\x0f\x61\x65\x39\x86\x93\xaf\xdb\xd8\x90\x6a\xc0" + "\x38\x35\x8f\x0d\xe9\xdd\xda\x60\xd3\x70\x3e\xb1\x45\x4a\x79\xe5" + "\x9d\xce\x01\xfe\x59\xc5\xdc\x58\x9d\x03\xc5\x73\x29\x66\xf2\xd6" + "\x2e\xd1\xbf\xd2\x82\x36\xb2\x02\x66\x07\xeb\x28\xa6\x97\x13\xd6" + "\xb9\xc3\x97\x0b\xfd\xb6\x84\x5d\x60\x31\x1f\x6c\x40\x7b\x3b\xc3" + "\x3a\xae\x37\xda\xca\x5c\xe7\xf0\xf4\x19\xf3\xe2\xe2\xa7\xce\x9a" + "\xa3\xd7\xbd\x14\xf5\x0c\x4b\x2a\x38\x44\x37\x33\x29\x9e\x2d\x3f" + "\xba\x97\xc6\x3d\x1d\x11\x11\x35\xf5\x37\x51\x4f\x45\x4d\xfa\xcd" + "\x93\x7c\x77\x62\x54\xe2\x62\x4c\x4c\x99\x34\x4f\x87\x37\x4d\x17" + "\xb3\x59\xa7\xc6\x27\xce\x73\x9d\xfb\x41\xcc\xa6\xa5\x66\xf6\xdb" + "\x36\xfc\x9f\xdb\xcd\xec\x51\x92\x3d\x8b\xe3\x9c\x7d\x1c\x8e\x2d" + "\xcb\x13\x9a\x65\xab\x44\x59\x4a\xcc\x33\x8e\x6b\x8c\x2f\xce\x5f" + "\x5c\x6b\xda\xb3\xec\x99\xce\xf1\xae\xc4\x7b\x37\xab\xf1\x3e\x71" + "\xde\x8a\xe7\x76\xd2\x3b\xef\xcc\xe0\x31\xab\xec\x3b\x24\x1b\x37" + "\x9e\x93\xfa\xd0\x80\x75\xb2\x6c\x76\x39\x9f\xad\xbd\x5e\xce\xd9" + "\xc8\xfe\x14\x63\x44\x08\x8a\x2e\x7e\x20\x97\xf4\x82\xdf\x4d\xf8" + "\x1b\xef\xc0\xf2\x64\x5a\x87\xfa\x59\xa0\x0a\xd6\xdb\x14\x1f\x9e" + "\xf3\x29\xbb\x96\xe5\x29\x88\xb0\xdb\x7c\xa6\xda\xd5\x70\xf4\xa1" + "\x53\xed\xbe\x4c\x27\xa4\xc9\xb4\x96\xed\xab\x4f\xa6\x35\x98\xdb" + "\x0c\xf8\x38\x27\xc2\x96\x9e\x13\x61\xa7\xb6\xa9\x20\xab\xc3\xf1" + "\x9f\xb8\x3f\x3c\xc2\xfe\x4f\xca\xf2\xbb\xe0\x3e\x7a\x1e\xbb\xaf" + "\x02\xfd\x25\xa7\x00\x0f\x6f\xbc\xc0\x73\xe2\x46\x2c\xfe\xfe\xc4" + "\xd4\xc5\x66\x9e\x13\xf7\x1c\xcf\x23\xcd\x73\x6d\x93\x74\x68\xe7" + "\xc0\x54\xbb\x8f\x2e\xc2\x7e\x99\xf2\x3d\xae\x82\xb1\xbb\x3c\xb7" + "\x88\xa7\x0b\xee\x20\x6a\xb4\xad\xd8\xff\x10\xa2\xc7\x38\x7d\x19" + "\x16\x6a\xc5\x78\x2f\x7b\x3b\xeb\xd4\xba\x64\xcc\x03\x26\x9c\xae" + "\xd6\x87\xba\xdf\xe3\x9c\x17\x5a\x47\xd7\x0c\xab\xa5\x79\x3f\xdf" + "\x41\xd7\x0c\x8f\xa2\x86\x11\xe8\x8f\xae\xa2\x79\xc3\x0d\x50\x86" + "\xf3\xa3\x66\xd3\x35\x23\xa2\x68\xde\x98\xf1\x70\x84\xf2\xaf\x06" + "\xd3\x35\x23\xa1\xdc\x57\x03\xf7\xd5\xd0\xbc\x7e\x99\x50\x2f\x92" + "\xe6\xdd\x66\x81\x23\x94\xfb\xc7\x42\x3d\x28\x0f\xa8\x81\x23\x94" + "\xb5\x61\x67\x08\x2d\x85\x7b\xe0\xdc\xd3\x84\x3f\x6b\x5c\x00\x7b" + "\x56\xde\x78\x2d\x7f\xc6\xaf\x07\xf3\x67\x4c\x0c\xe5\xcf\x78\x71" + "\x0c\x7f\xc6\x1d\x70\xdf\xb0\x3a\x9a\x77\x57\x11\xd4\x8b\xa6\x79" + "\x83\x72\xe0\x08\xe5\x7b\x92\xa0\x1e\x94\xef\xc5\x67\x41\xf9\x67" + "\x13\xa0\x3e\x94\x83\x47\x42\xfd\x7a\x9a\xf7\x40\x08\xd4\x8b\xa1" + "\x79\x0f\x62\xfb\x50\x7e\xd8\x1f\xea\x41\x79\x88\x15\x8e\x50\x7e" + "\xb4\x09\xea\x43\x39\x0a\xde\x69\x98\x99\xe6\x4d\xb2\x41\xbd\x58" + "\x9a\xf7\x5f\xf0\xbc\xe1\x50\x9e\x1c\x07\xf5\xa0\xfc\x2a\xdc\x3f" + "\x02\xca\x31\x95\x50\x1f\xca\x53\xe0\x5d\x87\x35\xd2\xbc\x58\x78" + "\xce\xf0\x38\x9a\x37\x0d\xdf\x19\xca\x33\x4a\xa0\x1e\x94\xe3\xb1" + "\x3f\x50\x7e\x03\xee\x1b\x09\xe5\x04\x18\x83\x61\x4d\x34\xef\xcd" + "\x62\xa8\x97\x40\xf3\xe6\xea\xe1\x08\xe5\xf9\x61\x50\x0f\xca\x49" + "\x30\x86\x23\xa0\x9c\x6c\x86\xfa\x50\x5e\x8c\xef\xdb\x42\xf3\xd2" + "\x56\x40\xbd\xd9\x34\x2f\x23\x1a\x8e\x50\xce\x1a\x02\xf5\xa0\xfc" + "\x16\x8c\xdf\x08\x28\xff\xb6\x16\xea\xcf\x76\x4f\xcf\xdf\x81\x2c" + "\xdc\x8b\xd0\xbc\xb5\x15\x74\xd9\x4d\x70\x2c\x4c\xa1\xcb\xfc\x42" + "\x68\x5e\x51\x08\x9c\x87\xe3\xba\x38\x28\x0f\x11\xcb\x70\x7c\x3f" + "\x12\xca\xa1\x62\x19\x8e\xeb\xc7\x40\x79\xa8\x58\x86\x63\x31\x96" + "\x47\xd2\xbc\x0f\xe0\xd8\x0b\x8e\xc5\xbb\xa0\x3c\x46\x2c\xc3\xf1" + "\xf7\xfe\x70\xb4\xd1\xbc\x0d\x6d\x70\x3e\x8c\xe6\x6d\xdc\x01\x65" + "\x38\x6e\x4a\x82\xf2\x58\x38\xd6\x41\x79\xac\x25\x38\xd8\x80\xbc" + "\x2a\xf4\xb3\x19\xe8\x80\xd1\x91\x19\x17\x89\x1a\x79\x14\xf3\x5d" + "\xc0\x3a\x7c\x4f\x83\x4a\x95\x5b\x9a\x6e\x66\xf2\x81\x7d\xed\xb0" + "\x1a\x61\xc0\xf0\x48\x38\xdf\x0b\xea\xdd\x74\x46\xa5\xde\x89\x78" + "\x64\x4a\x33\xb3\x9c\x7b\x62\xcc\xc9\x5e\x70\xcf\x67\x20\x4b\x8d" + "\x04\xfc\x57\xc3\x38\x05\xd0\x2c\xbf\x0b\x70\x5c\x49\xb3\x6e\x69" + "\x80\x71\x82\x72\xdf\xaf\xe1\x08\xe5\xe1\xef\xc0\x78\x41\xf9\xd5" + "\xa7\xe1\xb8\xb2\x3d\x5b\x1d\x64\x26\x94\xe7\x9f\xdd\xf6\x94\x26" + "\xd0\x46\x69\x04\x20\x2d\xfd\x20\xce\x10\x68\x33\xc2\x18\x8f\xd7" + "\x07\x62\xec\xc4\x8f\xee\x87\xbe\xfa\x61\x7c\x1c\xd4\xb7\x7a\xd1" + "\xcb\x83\xd5\xfc\xd9\xb7\xd0\x06\x95\xfa\x29\xcc\xd3\x40\x07\x0c" + "\xf2\x74\x7d\x1a\xbb\x7e\x5f\xbc\x86\x5f\xf7\x27\xf2\xf5\x57\xf1" + "\xfa\xb2\x40\x8c\x77\x7e\xff\x20\x76\xdd\xd4\xd6\x24\xbe\x97\x0f" + "\x5e\xdb\x80\x75\xcd\x2a\x35\xb3\xab\x99\x55\xaa\x72\x9a\xe5\x43" + "\x5a\x35\x23\xa2\xa1\xef\xa0\xff\x0a\x95\xa2\xac\x5f\x44\x35\xa1" + "\xc5\x3c\xe6\xc8\x68\xb7\x32\x30\xea\xba\x42\x41\xb8\x35\x17\x30" + "\x14\xf5\x67\x58\x4b\xd5\xba\xf4\xc1\x65\x0d\x2a\xdf\xa2\x0d\x28" + "\x5f\x05\xcd\xe0\xd8\xaa\xf2\x99\x76\x79\xf5\x88\xcd\xba\xd4\x40" + "\x78\xbe\xef\x86\x0c\x2b\xbd\x68\x4c\x7f\x9a\x9c\xe1\xe7\xcd\x6c" + "\xaf\x11\xff\xbf\x92\xf9\x90\xf2\xff\xcb\x98\xbd\x1a\xda\xc2\x7b" + "\x9d\xf5\x15\x7b\xf6\xbe\x04\x61\xc0\x0c\x33\xfb\x06\xaf\xf2\x89" + "\xdf\x2d\x98\xd5\x81\x49\xc4\x4f\x97\xba\x17\xda\xf7\xd9\xa2\xd0" + "\x6d\x1d\x75\xd9\xb5\xfc\x3d\x50\x77\x3d\xda\xa1\xb2\x7d\x76\x39" + "\x72\x19\xc3\x3b\xfc\x0e\xd7\x51\x35\xc1\xdc\xab\xbe\x4c\x56\x56" + "\xf9\x8e\xc1\x18\xb5\xb6\xa0\x67\xcd\x36\x83\x2d\xd3\x5e\x30\xa3" + "\x86\xae\x9d\x61\xee\x63\x53\x11\xe6\xeb\xaf\xf2\x9d\xff\x98\x15" + "\x65\xd3\x83\x58\xf7\x41\xa1\x57\x55\xd9\xa3\x29\x44\x6d\x4c\x3c" + "\x8a\xe5\x99\x34\xbb\xae\xc5\xd4\x52\x47\x8c\x89\xac\xad\x04\x9a" + "\x6d\x09\x13\x7a\x35\x8e\xdc\x88\x32\x7e\x0a\xda\xe8\xbe\xc6\x71" + "\x39\x0b\x74\xf1\x6d\xcf\xf6\x1d\xef\xc8\xb3\x0d\x63\x99\x0b\x63" + "\x87\xf2\x37\xc6\xcd\x98\x6a\xb7\x63\xbc\xb7\x1c\x33\x8c\x03\xa7" + "\x97\xef\x10\xcc\x51\x2e\x3e\x77\x99\xd0\x6f\x84\xa1\x3a\x06\xbf" + "\x37\xfa\x63\xfc\xac\x8b\x6c\xaf\xbd\x0d\x73\x0f\xc2\xba\x25\xd6" + "\x75\xa6\xdd\x4c\x31\xc6\xc0\xcc\xb9\x49\x89\xf3\x75\x0b\x66\xa6" + "\xc6\x3f\x19\xbc\x70\x88\x2e\x31\x45\x97\xc8\x72\xc6\xb3\x13\xb0" + "\xcc\x2f\x98\x3d\x2f\x49\x87\xb9\xbb\xbb\xe6\x0e\xd6\x52\xcd\x88" + "\x04\x26\x9b\xaa\x7a\xb3\x3d\xb1\xb4\x38\x2e\x27\x29\x8d\x0a\xba" + "\xfb\x6e\xa2\xe7\x54\x7e\x63\x3a\x7a\xf9\x62\x5e\x50\xe0\x3d\x1d" + "\x11\xe3\x14\x07\xac\xeb\x47\x70\x3f\xa0\x7f\x7b\xb6\xdf\x50\xc7" + "\xba\xaa\xea\x9d\xc6\xec\x2e\xd9\x7e\xe3\x81\x1f\x5b\xc4\xef\x6e" + "\x3c\x26\x9f\x78\x8d\x7d\x97\xce\xf6\x4b\x30\x93\x04\x1e\x67\xb2" + "\x78\x06\xff\x16\xa4\xf2\x63\xf6\x74\xaa\x8b\xcb\xa1\x9b\xef\xc7" + "\x7c\x68\x2a\xf6\x0d\xd0\x76\x0f\x35\x91\x0b\x3c\x46\xee\x9a\xe7" + "\x2c\x18\xef\xc3\xbe\x76\x94\x5e\x18\xf0\x9c\x45\xf8\xc3\x03\x91" + "\x19\x1f\x10\xf5\x76\xc0\x02\x5f\x1d\xcc\x87\xfb\xc8\x3d\x7b\xd3" + "\x9b\xd4\xd0\xe7\x8f\xf7\xa6\xd7\xa9\x69\xc1\xe8\xf1\xad\x83\x47" + "\xa6\x58\xc5\x1c\xd3\x26\x9b\x95\xfc\x6d\x2c\x41\x1d\xb0\xac\xad" + "\x7f\x64\x61\x5b\xff\x51\xd1\xd6\x35\x93\x89\xf1\xbe\x27\xc8\xb8" + "\x07\xe9\xf7\x5f\x96\x13\xd2\xa2\xea\x1d\xf7\xe5\x58\xd4\x4b\x46" + "\xc4\x5a\x35\x23\xe2\xda\xd6\x3e\xa7\xc7\x98\x56\x1d\x6b\x27\x47" + "\x76\x0e\xf8\x45\xcd\x3e\xa8\x73\x10\xf4\xa6\x43\x3a\xe0\xdf\x7b" + "\x89\xba\xe3\xfe\x60\xf3\xf6\x4e\x83\xba\xa2\x7c\x0c\xb7\x19\xc7" + "\xc2\x9c\x61\xfc\xd4\x2b\xfc\xcb\x1d\xe5\x04\x9e\x4d\xb6\x77\x8e" + "\x57\xff\x6d\x64\x97\xeb\x73\xbe\x0c\x2d\x27\xed\x18\xf7\x18\xf4" + "\xd2\x3d\x47\x0b\x09\x5d\x3b\xb1\x74\x6b\xaa\x55\x1d\x63\x26\xea" + "\xaa\xba\x42\x92\x76\x9a\xdc\x6a\xfb\x3e\xc4\xf7\x8f\x70\x7f\x07" + "\xc6\x29\x3d\xa4\x65\xf1\x0a\xd3\x8d\x2c\x7f\x6c\x60\x35\xc8\x1f" + "\xc2\xf7\x21\xbd\xaa\xa3\x8c\x04\xae\x0f\xb7\xfd\x5a\x4b\xaa\x12" + "\x2c\xc4\x14\x5d\x4c\x3a\xd4\x61\x64\xe7\x2b\xc5\x64\x3d\xe8\x38" + "\xeb\xcf\x91\x00\x26\x4b\x5f\x0e\xe9\x65\xbb\x1c\xe2\x6b\x5b\x12" + "\x82\xf1\xa3\x28\xfd\x3e\xa4\x37\xca\xd6\xb6\x79\x21\xfe\xd5\x96" + "\x62\xf2\x58\x13\x09\xe9\x50\x93\xc0\x8e\x25\x21\xbd\xab\xf5\x85" + "\xd0\x16\x08\xcb\x30\xae\x18\xbb\x0e\x63\xda\xe1\x38\xdd\x12\x4d" + "\xa2\x5a\x54\xbd\x82\x7b\xd7\x92\xfe\x18\x3b\x15\xe5\x55\x8c\xb3" + "\x2c\x04\x4d\x2c\xb5\x07\x3d\xa7\x4f\xbf\x08\xfd\xc2\xf8\x4e\xdb" + "\xc2\x2c\x28\xef\x83\x2c\xa3\xc2\x77\x16\x68\x48\xef\xa9\x78\x5c" + "\x1d\x3a\x1c\x65\x7e\xa1\x5d\x8b\xb9\x99\xfc\xb1\x9f\x98\x27\x79" + "\xe9\x49\x18\xcb\x8c\x10\x5f\xa8\x17\x00\xe7\xfb\x98\x5a\xac\xc4" + "\xfe\xc8\x53\xe4\x51\x3d\xcb\x7f\x1b\xb4\x31\x9d\x68\x0c\xe9\x24" + "\x48\x37\x9c\xf1\xd2\x38\xfb\xd6\x30\x0b\xcd\xbe\x5d\x8b\xb6\x1c" + "\x7e\xee\xe6\x60\xdd\xb3\x84\xe8\x9e\xc0\xff\xfd\xab\x74\xa3\x81" + "\x86\x41\x13\x35\x4c\x1f\x41\x7d\x57\xe5\xff\x39\xe7\x71\xff\x9d" + "\x1d\xbd\xa6\xc5\x08\xd9\x05\x29\xc2\x32\xdf\x81\x98\x1b\xfb\x9c" + "\xca\x7f\x03\xcd\xdb\x5a\x4a\x0b\xa2\x19\x2f\x42\x79\x5d\x47\xaf" + "\x7e\x46\x9a\xb7\x2d\x08\xda\x1f\xd3\xa1\xf2\xad\x85\x5f\x9d\x78" + "\xbf\x01\xdf\xdb\xbe\xf9\xfe\x04\x7c\x6f\x96\xcf\x07\xde\x6b\x2a" + "\xd0\x8c\x0e\x08\x37\xb2\x18\xf7\x97\x61\x7c\xc5\x7c\xa7\x38\x1e" + "\x38\x06\xc2\xe5\x90\xde\xec\x5d\x2f\x87\x04\xc0\xf8\x62\x9c\xe4" + "\xc0\xf4\x69\x70\xcf\xda\xf0\x5a\xb8\xd6\xa7\x23\x68\xa2\x3f\xe6" + "\xd5\x32\xe9\x2d\xc4\xbe\x26\xbc\x06\xe3\x00\xae\x4b\x85\x39\xd7" + "\x3f\xdc\x48\xd7\x84\xd7\x8b\x73\x8b\x60\x3f\x85\xbc\x6d\xb1\x1d" + "\xb8\x2f\x0f\xfa\x06\xfd\xab\x85\x5f\x9d\x59\xe5\x1f\xd4\x11\x7c" + "\x7f\x8a\x59\x75\x53\x13\xf4\x75\x20\xcd\x7e\x6c\x3c\xfe\x0f\xd7" + "\x06\x42\x9f\xed\x38\x0e\x38\x1e\xe2\x58\x5c\x94\xc7\xe2\xd5\x15" + "\x50\xaf\x51\xc8\x5e\x35\x10\xda\x28\xa7\xd9\x0f\xf9\xcb\xf5\x6e" + "\x1e\x24\xd7\x7b\x23\x84\xd7\x5b\x57\xc9\xeb\x0d\xcd\x84\xeb\x3b" + "\xf9\x78\xdf\x3c\xad\xeb\x78\xdf\x3c\x59\xbe\x37\xa2\x86\xdf\xbb" + "\x22\x86\xdf\x7b\x0f\xde\x9b\xaf\xec\xd3\xcd\x6f\xcb\xf5\x5f\xf0" + "\xe5\xf5\x33\x02\x78\xfd\x3b\x27\x38\xd5\xfb\x54\xae\x37\xc9\xc0" + "\xeb\xbd\xbd\x99\xd7\x1b\xbc\x05\xae\x9f\x75\xd3\x97\xd3\xf2\x3d" + "\x0b\x82\xf8\x3d\x9b\x8d\xfc\x9e\x5f\x8d\x01\x7e\x1a\xa4\xec\x4b" + "\xef\xfe\x72\xfd\x39\xe2\x7b\x6f\x8a\xe4\xf5\x47\x35\x39\xd5\x7b" + "\x92\xd7\xc3\xeb\x9f\x40\x3d\xff\xb2\x8e\x5e\x29\x56\x5e\x6f\x6c" + "\x0e\xf2\x23\xd4\x79\x4d\xc8\xd6\x96\x74\xf4\xea\x5f\x00\xed\x6c" + "\x01\xda\x68\xf1\x08\xb4\xd3\x0a\x86\x11\xb1\xf0\xff\x60\xfc\x26" + "\x84\x98\x6b\x56\xf9\xf9\x02\xee\xda\xdd\xda\xcd\xb2\x7b\x17\x39" + "\xec\x76\x02\xc8\x0f\x6b\x86\xb9\x8d\x87\xc5\xf2\x29\xa3\x0c\xb1" + "\x76\x98\xc5\x20\xf0\xbc\xec\xc0\xa3\x20\xff\xf4\xde\x0f\x6b\x61" + "\x26\x8b\x87\x5c\x30\x5e\x2f\x0c\x06\x8c\x3d\x4b\x7c\x4c\x69\x4d" + "\xa4\x54\x68\x52\x1b\x3a\x89\x6f\x35\xac\x33\x58\xbf\x14\xd6\x54" + "\xdd\x5c\x94\x2d\x7a\x1f\x33\x5c\x12\xdb\x2b\x8e\x33\x64\xcc\xe1" + "\xb9\xa8\x51\x0e\x43\x6c\x86\xf9\x18\xc0\x72\xa4\xcd\xbd\x09\xea" + "\xde\xd2\x17\xfe\xf7\xc7\xba\x80\x89\x9a\x8e\x0f\xe3\x0c\x9d\x03" + "\x46\xd7\x74\xfe\xe1\x01\xcb\xe5\x01\xe3\xf5\x97\xd7\x3e\x6b\xb1" + "\x7d\x18\x47\x6c\xf7\xdf\x6f\xb0\x0f\xf8\x45\x24\x3c\x1b\x70\xbb" + "\x50\xbd\x4d\x28\x55\x6f\x4b\x37\xaa\xb1\xdd\xbd\xe9\xc5\xea\x3d" + "\xe9\x35\xea\x3d\x42\x99\x7a\x6f\xba\x01\x8e\x25\x98\x2f\x0b\xe4" + "\xbd\x5b\xa6\xed\x49\xaf\x80\x75\xe3\x96\x62\x98\x07\x39\x92\xdd" + "\x93\x3e\x6d\x23\xd5\x25\x36\xb2\x3f\xe9\x22\xb1\xf4\x1d\x91\x00" + "\xbf\xd9\x96\xfe\xe1\x56\x4b\xff\xc9\x84\xf5\x79\x40\x04\x7b\x47" + "\xdc\xd7\xba\x47\xe0\x7d\x16\xc7\x03\xdb\x3c\xb0\x51\x40\x9f\x13" + "\x31\x56\xb4\x2a\x60\x45\x97\x58\xd1\x6a\x9e\xab\xcd\x11\x2f\xfa" + "\xc7\x88\x15\x2d\xda\x1c\x58\xac\x68\xd0\x1f\x99\x1e\x09\xeb\x17" + "\xcb\xef\x68\x03\xf9\x6c\xcd\xb3\x91\xa8\x2f\xa2\x3c\xd6\x9e\x1d" + "\x50\x2a\xe9\x7b\x28\x63\xd8\xf3\x47\xa4\xc0\x2f\x09\xce\x57\x98" + "\x55\xa5\x83\xa5\xf3\x74\xb5\xdd\x80\xf6\x77\x3b\x4d\xf8\x65\x3b" + "\xee\xd5\xa4\x09\xbf\xb2\xaf\x19\x15\x6b\x5f\x13\x6d\x86\x73\x63" + "\xe0\xf7\xa4\x3d\xdf\x5e\x00\xbf\x42\xf8\x15\xc1\xaf\x18\x7e\x9b" + "\xe1\x57\x02\xbf\x52\xf8\xed\x80\x5f\x19\xfc\x76\xc1\xcf\x08\xbf" + "\x72\xda\xd7\xbe\x05\x63\x5d\x42\xdb\x35\x40\x77\xad\xd4\xae\x3c" + "\xbe\xb7\x3e\x02\xef\x1b\x86\xf2\x8f\x90\xb7\xb5\x92\x72\xbc\xd2" + "\xd2\x8f\x82\x0b\x11\x77\x69\xf0\xc8\x14\xcb\xbd\x71\x99\x96\xfe" + "\x11\x99\x96\x7b\x67\x34\x59\xfa\xbe\x19\x0a\xbf\x91\xf0\x0b\xb3" + "\xac\x99\xa8\xb1\xf4\x8f\x6e\xb2\xf4\x9f\x58\xdc\x9e\x7d\x2b\xcc" + "\x9b\x20\x16\x17\x05\xfe\x07\xfa\x07\x19\xc4\xff\xb7\x98\x55\x1a" + "\x36\x1f\xa0\x8d\x58\x28\xef\x32\xab\xfa\xb1\x7a\xad\x03\x26\xea" + "\xc4\x7d\x9e\x99\x70\xbe\xd6\xec\x7b\x77\x2c\xaf\xf7\xac\xd9\x79" + "\xce\xcc\x99\xa1\x9f\x3a\x67\x5a\xca\xd4\x05\xb3\x67\xce\x88\x5f" + "\x30\x5a\x17\x1c\xa7\x0b\x99\x99\x38\x7f\xea\xfc\x85\xf1\x0b\xe3" + "\x99\xe8\x04\xa7\x1e\x54\xfa\xb0\xd9\x30\xef\x00\xe8\x01\x7d\x1a" + "\x29\xc5\x35\x6b\x42\x1b\xf0\xd9\x7d\x71\x86\x5d\xe7\x2c\x6a\x3b" + "\xc8\x2e\x01\x8d\x99\x30\xf7\xc6\xeb\x77\x9d\xb3\xaa\x03\x1a\x75" + "\x84\x02\xbf\xe3\x35\x53\x63\x8d\x28\xcb\x7c\x4d\x2a\x51\x96\x81" + "\x3a\xdb\xe6\x5a\xd5\x13\xf1\xfe\x3f\xdc\x6f\xd8\x0e\xff\xd3\xb5" + "\xcf\x59\xf0\x3e\x0a\xf2\x0d\x3b\x82\x7c\xc3\xcb\xa3\x6b\xf6\xb0" + "\xe3\xb3\x96\x3d\xac\xde\x2f\x22\xf7\xe2\xf1\xd2\x52\x5a\x09\xed" + "\xa2\xbd\x8d\xfe\x21\x58\xb3\x87\xdf\xc3\xeb\xc0\x5c\x6b\x50\x05" + "\x26\x60\x3d\xa6\x53\x40\x1f\xb7\x43\x3f\x40\xe7\xf7\x95\xe6\x2f" + "\xea\x10\x8e\x39\x9c\x8c\xb2\x5e\x9f\xaf\x70\x0e\x63\x7f\x28\xcc" + "\xd9\xad\x70\xef\xb6\xb9\x16\x6e\x87\xbd\x88\x58\x61\x26\x88\x13" + "\x88\x0f\xa6\xb4\x1a\x76\x7f\xa9\x50\xa3\x46\x3d\xe4\x9c\x2a\xb0" + "\x2f\x5e\x2b\x02\xf9\xac\x88\xc9\xe3\x81\x13\x24\x19\x78\xe5\x00" + "\x1e\xef\x2d\x20\x16\x78\x63\x3a\xb9\x07\x9e\x13\x8c\xe3\x87\xe3" + "\x85\xdf\x5f\x69\xf6\xad\x8d\x18\x6b\x61\x43\x3f\xe2\x6f\xeb\x3f" + "\xa3\x8e\xd9\x6b\xb2\x03\x1d\xf9\x2f\xda\x82\x66\xd4\x39\xd3\x8d" + "\xd3\x4b\x17\x3f\x77\xda\xf4\xd9\xf1\x71\xec\x93\xdd\xb4\x05\x0b" + "\x16\xce\x89\xd7\xc5\x4f\x9b\x91\xa0\x63\x97\x75\x0b\x17\x40\x95" + "\x99\x49\x0b\x74\xf3\x16\xcd\xd5\xcd\x59\x30\x13\x25\xe4\xf8\xc4" + "\xc4\x85\xfa\xa4\xde\x84\xdf\xa9\x9b\xb3\x70\x76\xd2\x4c\x3d\xfc" + "\xb3\x20\x7e\x6e\x9c\x8e\x51\x7d\x01\x34\x35\x7b\xb6\x4e\x7c\xc2" + "\x82\x84\x69\x89\xc8\x08\x73\xdf\x80\x4a\x4e\xf7\x2b\xe5\xe7\x00" + "\x8c\xa7\x87\x7e\x5c\xe7\x54\x9a\xb3\xe5\xbe\x30\xd6\x05\x33\xea" + "\xd0\xff\x01\xca\x2d\x4c\xa7\xca\x0e\x2c\x42\x3b\xf5\xbb\xf0\x8e" + "\xad\xc0\xf7\xed\xd9\x9a\x04\xe9\xdd\x98\xdd\x1a\x63\x79\x62\x9c" + "\x58\x95\xe6\x08\xdb\x6f\x0c\xfc\xcf\xfc\x63\xb2\x03\xb7\xf3\xb1" + "\xd0\x14\x3a\xdb\xc5\x98\x1d\x56\xa5\xf9\x14\xfd\xf0\x60\x0e\xb4" + "\xa0\x5c\x20\xe6\x5e\x50\xc1\x3d\xc7\xf0\x1e\x61\x4d\x74\x13\xdc" + "\x57\x23\xcb\xe6\x9a\x12\xac\xcf\xea\x65\x07\x76\xd2\xfe\x13\x35" + "\x70\x6e\x25\xf6\xcb\xc3\x3a\xa2\xbb\x04\xed\x1e\x2a\x25\xe4\xe1" + "\x20\x12\x72\x69\xf5\xe8\xd2\xf6\x7e\x23\x32\x3b\xb3\xc8\x4d\x9d" + "\x30\x97\xad\x6a\x72\x4f\x07\xf0\xc5\xe2\xc7\x89\xcf\xd2\x70\xa2" + "\x2e\x9d\x55\x8a\xb1\x88\x49\xe5\xf8\x42\x62\x8a\x05\xdd\xdb\xba" + "\x85\x54\x1a\x1b\x48\x95\xed\x13\x9e\xcf\x23\x15\x65\xeb\x7e\x2f" + "\x62\x4c\xbc\x8c\xa5\xd4\xbe\xfd\x2f\x16\xbf\x6d\xcd\xa5\x98\x87" + "\xe3\x1e\x93\xed\x84\xd1\x94\xb6\x99\x98\x52\x4c\x46\x8c\x47\x72" + "\x4e\xd5\xf7\xc9\x3d\x70\xed\xe6\x4a\xb8\x6f\x22\xb9\x09\xca\x8f" + "\xe3\x33\x72\xd6\xd2\xba\xb7\x07\xd0\xfa\xb7\xd7\x52\x33\xf0\x54" + "\x23\xf0\x54\x53\xee\x00\xda\x82\xfe\x05\xe8\x47\x81\x7c\xaa\x4f" + "\x26\xda\x66\x55\x5f\xf6\x6d\xd4\x34\x96\x95\xef\x80\x32\xf3\xf5" + "\x34\xa5\xac\xc5\xf2\x9d\x50\x6e\xe2\xe5\x8d\x58\xbe\x0b\xca\x56" + "\x5e\xfe\x12\xcb\x03\x9b\x55\xfd\xfc\x79\xb9\x9a\xb0\xb8\x1a\xaa" + "\x7e\x5a\x5e\xfe\x16\xcb\x30\xf6\xfd\x42\x8c\xc9\xd8\xdf\xe3\x40" + "\xb3\x7e\xc3\x32\x8e\x81\x8e\x96\x72\x86\xcd\x87\xbd\xe9\x09\x68" + "\xa3\x80\xf9\xd0\x77\xe7\x2d\xf5\xa8\xdf\xf5\x8b\xee\x15\x8a\xc7" + "\xbe\x31\x81\x56\x72\x13\xc8\x4b\xb7\xc0\xb5\x07\x71\xec\xdc\xda" + "\x64\xb6\x8d\xdc\x1b\x61\xa3\x46\xfa\xd1\xfd\x39\x74\xcd\x78\x0b" + "\xfd\xe8\x01\x8c\x83\x0c\x6b\xd9\xb0\xd2\xd2\x54\x2b\x8b\x07\x0d" + "\x32\x2a\xcc\xa1\x7e\x2c\x5e\x8c\x05\x64\x3e\x0f\xf1\x61\x35\x74" + "\xcd\x28\x0b\xe8\x52\x29\xe1\x21\x36\xf4\x97\x06\x39\xf7\xb6\x07" + "\xf7\x27\xa0\x6c\x10\x31\x43\xd8\xfc\x40\x8d\x90\x11\x4d\xe8\xe0" + "\xfb\x73\xc2\x13\xa8\x11\xd6\x29\x15\xb7\x7f\xd3\x13\xf0\xfc\x13" + "\xec\xb9\xc1\xf7\xe7\x08\x8b\x12\x30\x4f\x13\xc3\x97\x74\x5c\xb3" + "\x93\x01\x4f\x96\x44\x07\xda\xd7\x44\xc4\xee\x4f\x38\xed\x5d\xce" + "\x1f\xd5\x6d\x21\x1e\x7d\xa6\xa0\x4f\x18\x1f\xd5\x06\xcf\xb1\xc1" + "\xbb\xa2\x7c\xb0\x4d\xa8\x50\x83\x9c\x92\xb3\x75\x7a\x9d\x1f\x5d" + "\x14\x1d\x08\xef\xf4\xb8\x29\xe4\x22\xa9\xee\xc4\xb9\x72\x5b\xd3" + "\xfe\x14\x42\xc6\xa5\xd8\x8c\x81\x16\x16\xc7\x5a\xa3\x9f\x45\xee" + "\xa6\xfd\x47\x59\x9a\x55\x41\x23\x27\xa6\xc1\x3b\xc0\xbb\xef\x69" + "\xa8\xf3\x15\xe0\x3d\x1e\xe3\xe3\x06\xf7\x05\x0d\x84\xb1\x4d\x91" + "\x64\x7b\x2f\xfb\xcf\xf8\x46\x58\x10\x4d\x70\x1f\xf4\x76\x90\x49" + "\x84\xcb\xd1\x81\x02\xac\x3f\x78\x6d\x7f\xc8\x59\x82\xcf\x14\xc7" + "\x9a\xc5\x22\xa1\x83\x61\x9c\xe1\xf9\x18\x3f\x5b\x1a\x57\x58\xc3" + "\x06\xda\x2f\x27\xb8\xa7\xff\xda\x88\x50\xe8\x9f\x9e\xe6\xdb\xdd" + "\xfa\xf4\xc0\x7a\x3b\x95\xf3\x47\x70\x09\xfc\xca\xe8\x07\x33\x2c" + "\x96\xe0\x60\xc6\xef\xc2\xda\x67\x63\x25\x3b\x09\xcc\x37\xe0\x91" + "\xa0\x9d\xa5\xa0\x0f\xbb\x8f\x65\x98\x5f\xc2\xf2\x97\xf9\x9d\xa0" + "\x81\x76\xcc\xcb\x7b\x11\x63\xb1\x97\xec\x0f\x69\xf3\x92\xa6\x41" + "\x36\x4f\x34\xc5\xf6\x41\xaf\xbe\xec\x5d\x7b\xfd\x3d\xfa\x3f\xc0" + "\xd8\xea\xa9\xc6\x9e\xd9\x49\xc7\xaa\xb8\xfc\x3d\xe0\x3c\x8e\x95" + "\x0d\xd6\x91\xd4\xc3\x44\x6d\x85\xf5\xf2\x93\x97\x73\xd4\x43\x60" + "\x9d\xb1\xc3\xda\x7f\xa0\xa6\x9c\x44\x4c\x20\x19\x55\x09\x17\x88" + "\x94\x97\x8c\x0e\x78\xce\xf2\xf1\xcb\x16\x35\x7e\x87\xc2\x3c\x64" + "\x4c\x57\x5d\x1b\x1e\xfa\xc7\x6f\x61\xcd\x04\xb9\x61\xeb\xb7\x16" + "\xb5\xad\x35\x5a\xc7\x62\xc1\x83\x5e\x9e\x91\x40\x05\xc7\xb7\x29" + "\xcc\x17\x62\x08\x1d\x83\x79\x9e\x0f\x45\xd6\xb0\xb8\x01\x87\xa2" + "\xcb\xc9\xa1\xfa\x42\x52\xd9\x78\x0c\xf7\x53\x7f\x70\x28\xda\x80" + "\x32\x63\x1f\x1b\xc8\x85\xeb\x41\x2e\x84\xf9\x7a\xb3\xa0\xc9\x2f" + "\x91\xbe\x4f\x61\xde\x32\x49\x26\xb4\xc1\x1c\x2d\x12\x73\x93\xd9" + "\xb2\x83\xcc\x45\xe2\xb7\x2a\xcc\x59\xf6\x7e\x32\x19\xfc\xbe\x5a" + "\x88\x76\xf7\x5d\xaa\xcf\x7c\xe6\x73\xad\x15\xfa\xe6\x97\x48\xb9" + "\xcb\x26\xce\xd7\x91\xbf\xc2\xbb\xef\x0f\xf1\x76\x4e\x0e\x60\x71" + "\x4f\x6c\xc0\x77\x36\xe0\x39\x1b\x8c\x27\xd0\x60\x0b\xd0\xcd\xad" + "\x1e\x22\xd1\xe0\x72\x86\x44\x03\xed\x32\x46\x03\xd0\x5f\x96\x4c" + "\x16\x69\x70\x14\x68\xd0\x08\x34\xc8\x22\x99\x07\xa3\x2a\x49\x44" + "\x24\xd0\xa0\xe5\x02\xe6\x11\xe0\xb9\xe1\x92\xf8\xd8\x33\x5a\x1c" + "\xb5\xa8\xab\xdb\x38\x0d\xb6\xbc\xc2\x69\xb0\xed\x15\x0b\xc8\x31" + "\xc1\xe6\x8f\xa1\x6c\x5f\x14\xad\xc3\x5c\x4e\x34\x2b\x16\xf3\x58" + "\x73\x5a\x5c\x06\x5a\x5c\xe6\xb4\x48\x9f\x0f\xb4\xa8\xad\x63\xb1" + "\xad\x0e\xd5\x57\x92\xca\xd8\x62\x52\x05\xb8\x04\xb4\x98\x86\x74" + "\x41\xdd\xda\xbe\x24\xa4\x1f\xe8\xd2\x41\x45\xa9\x44\x2b\xd1\x03" + "\x74\xf7\xde\xb9\xa9\x04\xfd\x84\x43\x61\x6e\x4a\xf4\x08\x62\xf4" + "\x38\x2b\xd2\xa3\x13\x7d\xed\x80\x1e\x9d\x40\x8f\x4e\xa0\x47\x16" + "\xa7\x07\xe2\xfc\xc4\xb6\x40\x2a\xfc\x2b\x04\x63\x5f\x74\xa5\xc7" + "\x12\x91\x1e\x47\xaf\x86\x1e\xda\x09\x5d\xe9\x71\x7b\x68\x4f\xf4" + "\x90\xe7\xc4\x9d\xc1\x48\x8f\xcb\xc5\xe2\x9c\xb8\x1f\xe7\x44\xa6" + "\xfa\x61\x58\x8b\x70\x4c\x0f\xd4\xec\x62\x73\x02\xde\x35\xf3\xe3" + "\x97\xad\xea\xca\x46\xa0\x4b\x9c\x98\xaf\x4c\xa4\x0b\xa7\xc7\x73" + "\x96\x92\x6f\xf9\xf8\xeb\x5e\xc0\x35\x03\xe7\x06\xd2\x07\xe8\x04" + "\xf3\xc7\x5d\x5e\x3f\xe7\x6f\xb8\xd0\xa6\x80\xf3\x04\xe7\x08\xce" + "\x87\xaa\x84\x63\x2c\x4f\xfa\xa1\xc8\x0a\x82\xdf\x72\x0f\x45\xef" + "\x02\x5a\x15\x12\xfb\x22\xa0\x4d\x32\xee\x0d\x21\xf7\x62\x7e\xbf" + "\x43\xd1\x39\x28\x2f\x68\x80\xe7\x6f\xb6\x03\x9d\xec\xed\xda\xde" + "\x2b\x41\x8f\xc2\x6f\xbc\xce\xdf\x76\x31\x97\x31\xed\x15\x64\x86" + "\xf3\xbe\x36\xa0\x11\xcc\x1d\xc5\x9c\x71\xe4\x38\x3e\x15\x42\x36" + "\x34\x10\xff\x5b\x67\x72\x1a\xd9\x9d\xe6\x4c\xf8\x4c\x9c\x33\x99" + "\x40\xa3\xc3\x5e\xd2\xe8\x0e\x16\xc7\x1d\xf4\xcb\x50\xd0\x83\x32" + "\x61\x9d\x04\x1a\x69\x8d\x9e\x68\x64\xdf\x1c\x5c\x62\xd7\x8c\x88" + "\xc3\x7c\x06\xc2\xbc\x28\x95\x00\x3a\x53\x27\xe8\xa6\x87\x2c\x36" + "\x92\xf6\x1a\x51\xa7\x1e\x23\xbd\x4c\x51\x5f\x13\x93\xb9\x8c\xc5" + "\x22\x47\x9b\x2f\xe6\x08\x31\xd9\xca\x00\xaf\x26\xb3\x5c\xdf\x1b" + "\x58\xd9\x42\x96\xbc\x46\x7c\x58\xde\xcf\xe8\x62\xb2\x12\xf8\x73" + "\xeb\x2b\xc5\x6a\xa1\x60\xf4\x78\xaa\xc1\xdc\x46\xc4\x58\xad\xb7" + "\x61\x8c\xb7\x80\xaa\x84\x4a\x8c\x8b\x79\x22\x23\x85\x9e\xac\x6e" + "\x83\x36\x2d\xb4\xd3\x0e\x6b\xc6\xc6\x2c\x5a\x86\xf9\x1e\x1e\xc3" + "\x35\x02\xe3\xd6\xa9\xee\x52\xa1\x2c\x82\xb6\x2f\x63\xfa\xfb\x20" + "\x7b\xdd\xc5\x72\xa0\xc0\x39\x55\xd5\xac\x36\xb8\x7e\xf7\x42\xec" + "\x17\xb7\x43\xf3\xe3\x63\x18\x4f\x7c\xc0\xe4\xdf\xef\x4e\xb7\xf8" + "\x1a\x40\xe7\x05\x19\x0d\xdb\xe1\xf9\x46\x57\xdb\x2b\x4c\xb5\x56" + "\x66\x83\xb4\x64\x24\xf4\x32\xa4\xa2\x3f\x17\xe6\x8e\xc0\x35\xfb" + "\xee\x60\xf4\x01\xa1\x9b\x61\xbd\x1a\xf0\x6c\x6c\xe9\x74\x8b\x5a" + "\x5e\x97\xef\x4a\x83\xf5\xac\x62\x5c\x08\xcd\xc0\x1c\x1b\x7b\xe0" + "\xbd\x50\x0f\xfa\xa4\xc1\xca\x30\xe5\x8f\xd3\x73\xd4\x68\x23\xb1" + "\x02\x3e\x54\x7e\xfb\x27\x96\x8b\xf5\x8c\x6a\x60\xee\xc1\x68\x1b" + "\xc1\xe7\x4f\x7a\x10\xbf\x33\xdc\x65\xec\x50\x6f\x42\x5b\xcb\x98" + "\x8c\x46\x39\x0f\xa5\x73\xbe\x49\xc4\x99\xad\xd3\xa1\x4d\xc4\x99" + "\x86\x4c\x35\xc7\x96\x30\xb4\xd3\xf9\xbb\x62\x4b\x55\xcb\x59\x92" + "\x0e\x7c\x5c\x95\x50\xcc\xf2\xa0\xf4\x01\x7c\x17\x96\x00\x9e\x5c" + "\x06\x9d\x1f\xf0\x04\x71\x60\x23\xe0\x87\xb0\x04\x74\xfd\x4e\xd0" + "\xf5\x45\x1c\x41\xd9\x0b\x8f\xaf\x01\x8f\x06\x56\xc0\x39\xa0\x93" + "\x00\xb8\x0e\x78\x12\xb2\x3e\x95\x0c\x5e\x0f\x3c\xba\x01\x71\x04" + "\xe4\xe2\x89\x7a\xc0\x91\x45\x80\x23\xc9\x2c\x1f\xb0\x76\xa3\x9a" + "\xe3\xc7\x5f\x1a\x72\xd4\x06\x29\x1f\x38\x1b\xdf\x41\xf7\x56\x23" + "\x7f\xc4\x66\x62\x5f\xd5\x76\x5c\x9f\x96\x44\xfb\x54\xb7\x01\x8f" + "\xac\x9d\x1c\x89\xe7\xd8\xbc\x5d\x94\xd0\x5b\xe0\xbc\x16\x86\x63" + "\xb2\xe9\x1c\x09\x65\x39\x33\xbf\xd7\xf6\x5e\x35\x97\x0c\xd9\x78" + "\x8e\x0c\xde\x38\x97\x84\xc0\x7c\x55\x6f\x84\x3e\x4c\x99\xaf\x21" + "\x2c\xdf\x48\xaf\xfe\x63\xe1\xbc\xdb\x7c\x23\x20\x57\x6b\x37\xe2" + "\x9c\x99\x17\xe2\xe8\x93\xcd\x30\x27\xcc\x0e\x63\xc7\x62\xc6\xa9" + "\x06\x2d\xe6\x3e\xda\xf7\x95\x72\x39\x7f\xd0\x16\xee\xe7\xf4\xc0" + "\x0e\xd0\x55\x6e\x6a\x56\x0d\x9a\x46\x57\x3f\x56\xa2\x4f\x25\xaa" + "\x66\xe9\x1a\xc8\x9e\x02\xd0\xea\xd1\x4c\x92\x29\xf4\x7d\xaf\xd0" + "\x94\x72\x16\xe3\xf7\x7b\x39\x0f\x07\xb1\x3d\x77\x76\xc3\x9c\xb1" + "\xcc\xb7\x68\xf5\x9c\x09\x9b\x9a\x49\x28\x7d\x13\xe8\x31\x0b\xde" + "\xb5\x99\x0c\x2e\x6a\x86\x77\x5d\xc4\xdf\x55\xca\x7f\x2e\x64\x6d" + "\x2a\x85\x6b\xdd\xe6\xea\xb2\xbc\x89\xb9\xba\xee\xc9\x04\x0c\xbb" + "\x8d\xde\x87\x7e\xcb\x2c\xa6\x4f\xbb\xc9\x76\x8c\xe0\x73\xd1\x3e" + "\x64\xba\xc0\x78\x7a\x12\xf2\xb2\x50\x3c\xc3\x32\xb5\x1e\x78\xbb" + "\x3d\x81\x50\xf8\x7f\x4f\x83\x05\x63\xe8\x30\x99\xcf\xac\xba\x6b" + "\x05\xca\x69\x7b\xe1\x1c\xf2\xbe\x13\xcf\xaf\x40\x9e\xc7\xeb\x8c" + "\xef\xe1\x3e\x53\xfd\x69\x82\xed\x39\xb7\x83\xf4\x97\xda\x3a\xa3" + "\xba\x67\x14\xb6\x85\xbc\x80\x76\x1d\x9c\x6b\x9c\xf6\x65\xe8\xa3" + "\xae\xa5\x03\x7e\x51\xc3\xcb\x16\xcc\x43\xa3\x41\x1e\x60\xbc\x02" + "\xf8\x8d\x31\x9b\x29\x8d\xf6\x01\x3e\xc3\x7e\xf6\x06\x7a\x87\x4a" + "\x7c\x01\xe7\x82\x5c\x79\xa3\xcf\x32\x0d\xea\x34\x41\xf8\xff\x95" + "\xf2\x87\x77\xf4\xbb\x67\xa4\x47\xff\xb9\xc1\xc1\x18\x8f\xea\x1e" + "\xc4\x4d\x7b\xab\x13\x66\xb6\x70\xcc\x44\x4c\x92\x70\x93\x61\x13" + "\xcb\xc1\x50\x86\xfe\xad\x09\xac\x8f\x5e\xe2\x66\x55\x8b\x8c\x9b" + "\x13\xf5\x4e\xb8\xd9\x42\x3b\x85\x60\x77\xb8\xa9\x1b\xa5\xc4\x4d" + "\xdd\x93\x4a\xdc\xfc\xd9\x07\xae\xb8\xd9\x15\x33\x75\x4b\xdd\xe1" + "\x25\xe8\x31\xf7\x34\xab\x7e\x16\xe9\x19\x2b\x75\x25\xde\x63\xe5" + "\xbd\x3b\x95\x58\xa9\x6b\xf9\xff\x17\x2b\xef\x0b\x57\x60\xa5\xe6" + "\x0a\xb1\xb2\x99\x61\x65\x10\xfd\x17\xcc\x09\x11\x3f\x36\xce\xf2" + "\x80\x95\xb3\x7a\x98\x0b\x6f\x7a\xc2\xca\xfb\x3e\x52\x62\xe5\x7d" + "\x75\x4a\xac\xbc\x2f\x57\xc6\x4a\xf1\xda\x35\xc1\xca\xfb\x36\xdf" + "\x18\xac\xbc\x6f\x33\xc3\xca\x73\x88\x95\x3f\x5b\xd6\x33\x56\xea" + "\x4a\xdd\x63\x25\x9c\x67\x58\xa9\x2b\x95\xb1\xf2\x58\x0f\x58\x39" + "\x38\xde\x0b\xac\x0c\x62\x58\xa9\xf1\x80\x95\xb3\x60\xac\x44\xbe" + "\x60\xbc\xe7\xc2\x1b\x22\x56\x6a\x1d\x58\x79\x05\xfc\xe1\x1d\xfd" + "\x06\xc7\x75\x87\x95\x82\x81\xcb\x97\x88\x95\xb4\x9f\x88\x95\xb3" + "\x6d\x24\xf5\x08\x60\x64\x6d\x33\xcb\x35\xc3\xfc\x82\xe1\x97\x36" + "\x19\xb1\xe8\x39\xfd\x36\x18\x2f\x93\xb9\x94\x61\x13\xf3\x6f\x9d" + "\x80\x58\x55\x0a\x75\x0b\x1d\x72\x27\xc3\xce\x23\x22\x76\xc6\x88" + "\xd8\x39\xe5\x07\x60\xe7\x2b\x48\xcb\xe0\x85\x1d\x6a\x09\x3b\x57" + "\x03\x76\x06\x33\xf9\x01\xbf\x69\x72\xec\x0c\x39\x2f\xf5\x0b\x6d" + "\x9a\xa6\xa4\xf7\x09\xef\xd7\x85\xae\x38\xfa\x02\x6b\xef\x80\x71" + "\x56\x0b\x71\x60\x69\x8c\x8c\xa5\xd0\xd6\x07\x9e\x71\x34\xd8\xe2" + "\xc0\xd1\x2c\xc0\xd1\xe3\x4e\x38\x0a\x7a\xd3\x1f\x11\xf3\x00\x47" + "\xdb\x19\x8e\xfe\x45\xc4\xd1\x07\x54\x07\x63\x00\x47\x5f\x90\x70" + "\xf4\xfe\xa1\xd6\xac\x4d\x25\xd6\xec\x9e\x71\xb4\x9d\xe1\xa8\xfe" + "\xfa\xe3\x68\xb9\x0b\x8e\x82\xee\x8a\x39\xd0\xdd\xe2\xa8\xc4\x8f" + "\x0c\x47\x33\x65\x1c\x65\xe3\xfa\xc0\x86\xea\x58\x18\xf7\x58\x3d" + "\xd3\xdd\x1c\x38\xaa\x2f\xe5\x38\x0a\xe7\x98\xfd\x64\x01\xe0\x28" + "\xf0\x5f\x46\x15\xc6\x06\x24\x61\xd0\x47\x0d\xe2\xeb\x26\x98\x33" + "\x38\x46\x0e\x3c\x9d\x05\x73\x06\x31\xa6\x15\xe6\x0c\xe0\xe8\x94" + "\x8b\x1a\xc2\xe6\x4b\x36\xcc\x97\x66\x0f\xb9\xee\x24\x1f\x5c\x8f" + "\x78\xfa\xc0\x45\x25\x9e\x86\x84\x28\xf1\xf4\x81\x63\x32\x9e\x8a" + "\xd7\x10\x4f\x81\x66\x30\x3e\x85\x88\xa9\x57\x87\xa7\x0f\xb4\x39" + "\xf0\x54\x2d\xe2\xe9\xac\x9e\xf1\x94\x7d\xfb\xf3\x80\xa7\xce\xd8" + "\xe0\x19\x4f\x1f\x68\x93\xf1\x34\xe4\x2b\x07\x9e\xd6\x79\xc2\xd3" + "\x60\xab\x7b\x3c\x85\xf3\x0c\x4f\x83\xad\x0e\x3c\xad\x73\x83\xa7" + "\x2f\x38\xe3\xe9\x83\x9f\x73\x3c\x2d\x65\x38\x8a\x98\x5a\xdd\x06" + "\xfc\x81\x73\x2e\xa9\x90\x61\xaa\x00\x98\x8a\xf9\x7f\x31\xcf\x15" + "\xfa\xd5\xbb\xc3\x54\x8e\xb9\x66\x82\xb8\x8a\x73\x33\x23\x1c\xf4" + "\x5d\x58\x8b\x60\x4c\xd8\xda\x2b\x8d\xdf\x26\x27\x7c\x9d\xba\x58" + "\x83\xb2\x9d\x82\x57\x04\x89\x57\x5a\x43\xd0\xef\x56\xc1\x2b\xde" + "\xd1\xf2\x41\xa3\x27\x6c\xf5\xa4\xbb\x1f\x44\xdd\x7d\x12\x51\x2f" + "\x99\x04\xf8\x1a\x8d\xba\x7b\x89\x8b\xee\x5e\xd2\x55\x77\x3f\xdc" + "\x3d\x8e\x7a\xa5\xbb\xbf\x8c\x34\x7c\x68\xb7\x12\x47\x1f\xfa\x5c" + "\x89\xa3\x8f\x3e\x89\xfd\xe2\x38\x5e\xe2\x5e\x77\x67\xf3\xfc\xe1" + "\x5b\x1d\xba\x7b\x9d\x12\x3f\x65\xdd\xfd\x91\xb3\x9e\x71\xf4\xe1" + "\x91\x0a\x79\x74\x8a\x88\xa3\xd3\x45\x1c\x9d\x2e\xe3\xe8\xa1\xaf" + "\x25\x79\x74\xc8\xa4\x03\x75\xce\x38\xfa\x70\x9a\x03\x47\xeb\xbb" + "\xe2\xa8\x84\xa1\x88\xa7\xd8\x0e\xda\xb2\xb6\x00\x4e\x6f\x9f\xae" + "\x57\x73\x5b\x6d\x2c\x8e\x9d\xbf\xab\xad\xb6\xaa\xe5\x22\x49\x8f" + "\x41\x3c\x2d\x64\x78\x1a\xa8\x22\xd3\x00\xfb\xfa\xe0\x5e\x82\x22" + "\xfc\x6e\x9f\xcc\x73\xa7\xa1\x7d\x49\x58\xc4\x73\x71\x4a\x76\x26" + "\x78\x5f\xf6\xbd\xfe\xb5\x63\x22\xa6\x5e\x82\xf1\x00\x9e\x5b\x7f" + "\x09\x30\x35\xd9\x8d\x6c\xba\x04\x30\x35\xd5\x49\x36\x85\xb9\xff" + "\x97\xe9\xae\x98\x3a\xe4\xbb\x6a\xe4\x15\xc4\x54\x85\x1e\x5f\xf2" + "\x13\xd0\xe3\x1f\x79\x4a\x89\xa5\x8f\x24\x29\xb1\xf4\x91\x07\x65" + "\x2c\x15\xaf\x5d\x13\xd9\xf4\x91\xb0\x1b\x23\x9b\x3e\x12\x26\xeb" + "\xf1\x8f\x0e\x72\x60\x69\xad\x27\x2c\x7d\x38\xcc\x3d\x96\xc2\x79" + "\x86\xa5\x0f\x87\x39\xb0\xb4\xd6\x8d\x1e\xaf\xc0\xd2\xc7\x54\x1c" + "\x4b\x4b\xb8\x6c\x5a\x27\xc9\xa6\x25\xff\x86\x7a\xfc\x63\x5d\xf6" + "\x53\xf4\xa4\xc7\x1f\x6c\xe1\xf8\x89\xf8\x24\x61\xa8\xac\xc7\x97" + "\x78\xd6\xe3\x7b\xc0\x50\xaf\x64\x51\x86\xa1\xa1\x2a\x25\x86\x86" + "\xfa\x29\x31\xf4\xe7\x0b\x5d\x31\xb4\x2b\x7e\x86\x8e\x73\x87\x9d" + "\x5c\x8f\xff\xf9\x60\xcf\xb8\x19\xaa\xf7\x1e\x37\x1f\xcf\x55\xe2" + "\x66\xe8\x8e\xff\x0c\xdc\x7c\xe2\x5e\x05\x6e\x6a\xae\x10\x37\x7f" + "\x14\x9d\xfe\x09\x17\xfb\xe7\x13\x2e\xf6\xcf\x27\x9c\xec\x9f\x4f" + "\x5c\x43\xfb\xe7\x13\x37\xc8\xfe\xf9\x44\x8a\x2c\x83\xfe\x7c\x52" + "\xcf\xb8\x19\x9a\xe2\x1e\x37\xe1\x3c\xc3\xcd\xd0\x14\x19\x37\x7b" + "\x92\x41\x87\x8e\xf2\x02\x37\x7f\xe2\x3a\xfd\xd0\x6e\xed\x9f\xee" + "\x74\x7a\xc4\x4d\x86\x97\x75\x2e\x3a\xfd\x24\x67\x9d\xbe\x44\xd6" + "\xe9\xc7\x73\xdc\x32\xd9\x0c\x4a\x9d\xfe\x9a\xe3\xe8\xb0\xe7\xad" + "\x0e\x7b\xe8\x3b\x80\xa3\xc3\x58\xdc\x5a\xab\xc3\x1e\x3a\xf2\x2b" + "\xa9\x5f\x5c\xa7\x5f\x4d\x78\xbf\xdc\xe8\xf4\xcc\x6f\x76\xd8\x06" + "\x87\x4e\x5f\xe7\xaa\xd3\x8f\x5c\xe6\x19\x53\x87\x95\xbb\xd5\xe9" + "\x51\xff\x66\x98\xaa\x67\x98\x7a\x69\xad\x33\xa6\x0e\x3f\xc9\x30" + "\xf5\x59\x09\x53\x87\xfb\x5b\x61\x6e\x5a\x7b\xf5\x8c\xa9\xd8\x8e" + "\x8c\xa9\x09\x3f\x0e\xa6\x1a\xaf\x1c\x53\x9d\xf7\xb0\xfe\x05\xde" + "\xdd\x81\xa9\x6c\x8c\x47\x2c\xad\x8e\x45\x4c\x4d\x70\xd1\xef\x4b" + "\xdc\xeb\xf7\x07\x88\x1a\xc7\x47\xd2\xef\x91\x06\x0c\x6f\xae\xab" + "\x7e\x3f\xe2\xb0\x12\x5b\x47\xfa\x2b\xb1\x75\xc4\x6e\x19\x5b\xc5" + "\x6b\xd7\x44\xbf\x1f\x51\x7b\x63\xf4\xfb\x11\xb5\x32\xb6\x8e\xfc" + "\xb4\x67\x6c\x1d\x56\xe9\x1e\x5b\xe1\x3c\xc3\xd6\x61\x95\xdd\x62" + "\xeb\xb3\xce\xd8\x3a\xea\x03\x09\x5b\x65\xfd\x1e\xf8\x03\xe7\x5f" + "\x92\xe1\xea\xf5\xfb\xe7\x6f\xb4\x7e\x3f\xaa\xd8\x2b\xfd\x7e\x2d" + "\xe0\x2c\xe8\xe2\x4b\xbe\x02\xfd\xfe\x45\x51\xbf\xaf\x2f\x76\xd1" + "\xef\x8b\xbb\xe8\xf7\x69\x2f\x8a\x98\x0a\x73\x8a\x61\xea\xf4\x92" + "\xab\xd7\xef\x5f\x42\x1a\x8e\xde\xa0\xc4\xd4\xd1\x1f\x28\x31\xf5" + "\x97\x8f\x63\xbf\x38\xa6\x17\xbb\xd7\xef\xd9\x3c\x1f\x7d\x56\xa1" + "\xdf\x43\xff\xba\xea\xf7\x4f\x9e\x54\x60\xea\x14\x67\x4c\xfd\x85" + "\x56\x21\xa7\xc2\x7b\x21\xa6\x7e\x7c\x9c\x63\xea\x27\xc7\x9d\x30" + "\x75\xe2\x27\x22\xa6\x8e\x79\xfe\x40\x94\x33\xa6\xfe\x22\x46\xc2" + "\x54\x86\x97\x53\xac\xea\x8c\xe8\xae\x7e\x27\xcc\xdf\x07\x7d\x81" + "\xa0\x6d\xdc\x27\x85\x6d\x6e\x3d\x9e\xd0\xb3\xbf\x49\xb4\x7b\x7f" + "\x13\x53\x92\x99\x54\x36\x1a\x98\x9f\x49\x11\xfa\x99\x2c\x23\xf7" + "\x16\x75\xf2\xf8\x01\x2c\x9f\xc7\x25\xf7\xb1\x03\x5e\x9b\x2c\xe3" + "\x2c\xfa\x64\xad\x47\x9f\xac\x4b\xdc\x07\x08\xe8\xdd\x35\x56\x80" + "\x24\x37\x01\x1e\xec\x3c\xee\x8a\xb3\x63\x8e\x55\x23\xff\xc4\x24" + "\xb8\xe8\xfc\xc5\x3f\x01\x9d\xff\xc9\x61\x4a\x7c\x7d\x32\x41\x89" + "\xaf\x4f\x0e\x92\xf1\x55\xbc\x76\x4d\x64\xd7\x27\x87\xde\x18\xd9" + "\xf5\xc9\xa1\xb2\xce\xff\xcb\xbe\x0e\x7c\xad\x71\xc2\xd7\xe3\xce" + "\xf8\xfa\x0b\x1d\xc3\xd7\xe3\xae\xf8\x0a\xe7\x19\xbe\xfe\x42\xe7" + "\xc0\xd7\x1a\x17\x9d\xff\xb8\x2b\xbe\xfe\xf2\x22\xc3\x57\xe0\x05" + "\xa5\xec\x5a\xdc\xb3\xce\x5f\xff\x53\xd3\xf9\x7f\xd9\x25\xfe\x51" + "\xb7\x3a\x3f\x62\xea\x6c\x8e\xa9\x88\x59\x12\xae\xca\x3a\x7f\xb1" + "\x47\x9d\xbf\x27\x5c\xf5\x4a\x56\x65\xb8\xfa\xab\x8b\x4a\x5c\xfd" + "\x55\x87\x12\x57\x9f\x59\xea\x8a\xab\x5d\x31\x35\x6c\x94\x3b\x3c" + "\xe5\x3a\xff\x33\x43\x3c\x63\x69\x58\x9c\xf7\x58\xfa\xd4\x1a\x25" + "\x96\x86\x95\xfc\xe7\x62\xe9\xd3\x0f\x2a\xb0\x54\x73\x85\x58\xfa" + "\xa3\xd8\x01\x9e\x5e\xa6\xc4\xd2\xa7\x77\x28\xb1\xf4\xe9\x99\x32" + "\x96\x8a\xd7\xae\x09\x96\x3e\x9d\x79\x63\xb0\xf4\xe9\x4c\x59\x56" + "\x7d\xe6\xb5\x9e\xb1\x34\x6c\xb6\x7b\x2c\x85\xf3\x0c\x4b\xc3\x66" + "\xcb\x58\x7a\xac\x07\x2c\x1d\xfb\x94\x17\x58\xaa\xb4\x03\xb8\x62" + "\xe9\x0d\xb7\x03\x8c\x0d\xf3\xca\x0e\x20\x61\xe9\x8b\x5d\xed\x00" + "\x88\xaf\xcc\x0e\x00\xe3\x25\x61\x18\xb3\x03\x8c\xe5\x58\x66\xb2" + "\xe5\x28\xec\x00\xd7\x1e\x5b\xc7\xbd\x68\x75\xd8\x53\xb3\x00\x5b" + "\xc7\x4d\x62\xd8\xea\xb0\xa7\x8e\x3f\x2b\xf5\x8b\xdb\x01\xde\x21" + "\xbc\x5f\x6e\xec\x00\x4f\xb3\xf6\x3e\x52\xd8\x01\x9c\xb0\x16\xda" + "\xda\xe0\x19\x67\xc7\x55\x2a\xec\x00\x0d\x32\xce\x5e\x42\x1f\x75" + "\xc0\x41\x86\xb3\x03\x9c\x71\xf6\x59\x3b\xc3\xd9\xa7\x25\x9c\x7d" + "\x56\xd3\x0e\x73\xb3\xdd\x5b\x9c\xc5\x7d\x04\xc7\x63\x6f\x0c\xce" + "\x96\x79\x81\xb3\x4e\xb6\x81\x9d\x30\x1e\x0e\x9c\x65\xe3\xfe\xdc" + "\xba\xea\x18\xc4\xd9\x58\x17\xdb\x40\xb1\x7b\xdb\xc0\xfe\x1b\x61" + "\x1b\x78\xee\xbc\x12\x6f\xc7\x0f\x56\xe2\xed\x73\x47\x64\xbc\x15" + "\xaf\x5d\x13\xdb\xc0\x73\x96\x1b\x63\x1b\x78\xce\x22\xe3\xed\xf8" + "\xaa\x9e\xf1\x76\x5c\xad\x7b\xbc\x85\xf3\x0c\x6f\xc7\xd5\x76\x8b" + "\xb7\x4f\x3b\xe3\xed\xf3\xbb\x25\xbc\x95\x6d\x03\xc5\xa2\x6d\x20" + "\xa7\x67\xdb\x40\xbd\x07\xdb\xc0\xb8\x1b\x6d\x1b\x78\x7e\x97\x37" + "\xb6\x81\x8e\xb5\xdc\x6f\x7f\x09\xfa\xed\xbf\x06\xf8\x1b\xf9\x35" + "\x8c\x41\xcf\x7e\xfb\x69\x92\xff\x69\x6c\xa1\x88\xb3\x85\x6e\x6d" + "\x03\x07\x9b\x3c\xdb\x06\x0e\xd6\x3a\xfb\x9f\xbe\xb0\x53\xf9\xdd" + "\xea\x85\xdd\xd2\x77\xab\x83\xdf\x22\xce\x4e\x64\x79\x1b\x85\x82" + "\x89\xc5\x0c\xff\x55\x13\xcb\xb1\x9f\xee\xfc\xf8\xff\x22\x38\x7f" + "\xcb\xfa\xf5\x1d\x0e\x5b\x41\x0d\xe2\x6d\x21\x11\x68\x42\x2f\x8c" + "\x3b\xce\x6c\x05\x2f\x23\xef\x4d\x5c\xe8\x8c\xbb\x7b\x8e\x3a\xe3" + "\xee\xaf\xc7\x4a\xb8\x6b\x07\xdc\xdd\xdd\x50\xc8\xed\xaf\xaf\x70" + "\xdf\xd4\x2d\xaf\x38\xf9\xa6\x7e\xfd\x85\x88\xbb\x13\x9e\x3a\x60" + "\x86\xf7\xef\xce\x7f\x0a\xee\xdf\x76\xf4\x4a\x7d\x50\x0b\xdd\xfa" + "\x4e\x89\xf8\xe4\xd6\x7f\x0a\xfa\xaa\xd9\x20\xce\x55\x3b\xcc\xd3" + "\x0d\x4e\xfe\x53\x45\xa9\x30\x9f\xc5\x7d\x25\xdd\xfa\xa1\xbe\x22" + "\xfb\xa1\xd2\x82\xf0\x7a\x5c\xdf\x84\x35\x13\x8b\x3b\x69\x82\x0f" + "\x0d\x0a\xaf\xc7\xe7\x5f\xbe\x0c\xeb\xce\x33\xd1\x3e\x5c\xaf\x0b" + "\x37\x02\xf6\xf4\xe1\xe3\x3e\x21\xcd\x0e\x6b\x8d\x1d\xd6\x1a\xa1" + "\x20\xdc\x68\x43\xd9\x64\x6d\x78\x79\x11\xe8\x79\xb6\x2c\x96\x9f" + "\xb5\x77\x1e\xe8\x7a\x9b\x50\xcf\x3b\x07\x73\x23\x23\x44\x8d\xfd" + "\x91\x70\x34\xb0\x09\xde\xe3\x5c\xf7\xb2\x9c\xed\x7b\x19\x47\x8d" + "\x2f\x1c\x84\x67\x86\xcf\xaf\x46\xde\x8d\x96\xf7\x14\x30\x99\xd9" + "\x83\xaf\x2c\xf6\x85\xc7\x5d\x04\x5e\xb8\x06\x36\x09\xe7\xfe\x28" + "\x71\x3d\xfc\x80\x12\xd7\xc3\x6d\x4a\x5c\x0f\xff\x54\xc6\x75\xf1" + "\x1a\xe0\x3a\xd0\x8d\xc9\xd1\xb0\xf6\x5d\xa5\x1c\x1d\x5e\x21\xe1" + "\xba\x20\xe2\xfa\xc6\x2b\xc0\xf5\x6e\xe5\x68\x27\x5c\xf2\x8c\xeb" + "\xe1\x15\xb2\x4d\x62\xe2\x47\x6e\x7d\x64\x8f\x3a\xe3\xfa\xaf\x27" + "\x30\x5c\x3f\xea\x8a\xeb\x70\x9e\xe1\xfa\xaf\x27\x78\xdc\x4f\x70" + "\xd4\xf5\x7b\x5a\xc4\xdb\x0c\xd7\xeb\x44\x1f\xd9\x1a\x2f\xf6\x13" + "\xd4\x71\x4c\x97\xb0\x1c\xed\x55\x37\xd6\x26\x11\x91\xe3\x8d\x4d" + "\x82\x61\x79\x0b\xc7\x72\xc4\x46\x09\xcf\xaf\x64\x3f\x41\x4f\x78" + "\x2e\xc9\xcd\x88\xe7\x9e\xe4\x66\x25\x9e\x47\xbe\xad\xc4\xf3\xc8" + "\x5c\x25\x9e\x47\xbd\xad\xc4\xf3\xa8\x1c\x57\x3c\xef\x8a\xe5\x91" + "\xc7\xdc\xe1\xb8\xfe\x65\xb4\x51\x44\x8d\xf4\x8c\xe1\x2f\xfa\x7b" + "\x8f\xe1\x2f\xf9\xfd\xc7\x61\xb8\xc6\x15\xc3\x5f\x0a\x43\x0c\xb2" + "\x67\xbb\x60\xf8\x2c\x11\xc3\x45\x1c\xd9\xd4\x2c\xca\xc2\xae\x18" + "\xde\x02\xef\xd1\x83\x3e\x6e\xfb\x97\x2b\x86\xff\x66\x98\x02\xc3" + "\x35\x3d\x60\xf8\x2c\x6e\x07\x51\xf8\xe5\x7a\xb0\x85\xc0\x7b\x8c" + "\xdd\xe0\x41\x36\x97\xc6\xcc\xb9\x3f\x4a\x0c\xff\x4d\xae\x12\xc3" + "\x7f\x63\x54\x62\xf8\x6f\x16\xca\x18\x2e\x5e\xbb\x26\xb2\xf9\x6f" + "\x56\x5e\x73\xd9\x5c\xe2\x8f\x6e\x31\xfc\x37\x2b\x65\xd9\x3c\x6a" + "\x66\xcf\x18\xfe\xa2\xc6\x3d\x86\xc3\x79\x86\xe1\x2f\x6a\x3c\xee" + "\x73\xe8\x82\xe1\x93\x9e\xf7\x02\xc3\x95\xb6\x10\x09\xc3\x45\x5b" + "\xc8\x26\x27\x5b\x88\x3d\x8b\xdb\x42\x36\x34\x73\xde\xe8\xa3\xe2" + "\x7c\x0a\xfc\xa3\xdd\xa8\xee\x5e\x77\xdb\x70\x55\x76\x90\x49\x1e" + "\xf3\x3f\xba\xb3\x83\x30\xfc\xc6\x3d\x0e\x93\x01\xb7\x6b\xae\x70" + "\x8f\xc3\x78\x69\x8f\x83\xc1\xc3\x1e\x07\x11\xcf\xa7\xfc\x00\x3c" + "\x67\x7b\x1c\x5e\x9e\xac\xb4\x31\xbf\xfc\x9a\x64\x63\xe6\x78\xfe" + "\xca\x1c\x25\x9e\xbf\x32\xdb\xb1\xe7\x01\x30\xdf\xa4\x5f\xdd\x65" + "\xcf\x83\x03\xdb\x99\x1d\xf4\xe5\xdd\xc6\x97\x1b\x89\x03\xdf\x63" + "\x64\x7c\x87\xb6\x06\x29\xb0\xbd\xc1\x19\xdb\x5f\x6e\x54\x60\xfb" + "\xf1\x42\xa5\x7f\x44\x83\xde\x09\xdb\xa5\x3d\x0f\xff\x75\xf2\x40" + "\x7d\x0f\xd8\x0e\xf7\x5f\xf9\x1e\xb1\x6b\x8b\xed\xd2\xfe\x06\xb7" + "\xd8\xee\xbc\xbf\xc1\xc9\xff\x01\xb1\x9d\xe5\xb8\xe8\xef\x82\xed" + "\x4b\x12\xd4\xf6\x7d\x30\x1f\x00\xd7\x71\x8e\xd8\x29\x60\x3b\x1b" + "\xef\xe8\x81\xce\xd8\x7e\x39\x8b\x63\xfb\xfa\xe6\x1f\x8e\xed\x0e" + "\x79\xd8\x19\xdb\x9f\x45\x6c\x9f\x7c\x07\xdf\x7f\x91\x79\x65\xfb" + "\x2f\x5c\xfc\x33\xd6\x5f\x81\xfd\xa5\x5b\x8c\x77\xd3\x2f\x25\xc6" + "\x4f\x9e\xaf\xc4\xf8\xc9\x9b\x95\x18\x3f\x79\xb2\x8c\xf1\xe2\xb5" + "\x6b\x22\xa7\x4f\xd6\xdf\x18\xfb\xcb\x64\xbd\x8c\xf1\xaf\x84\xf7" + "\xbc\xf7\xe2\xe5\x16\xf7\xbe\x19\x70\x9e\x61\xfc\xcb\x2d\xdd\xee" + "\xbd\x50\xd8\xbb\x5f\x7d\xd2\xed\xde\x8b\x9a\x1f\xcf\x37\xc3\x99" + "\x57\x5c\xed\x2f\x57\x6f\xfb\x7e\x75\x8c\xb7\xf6\x17\xdc\x7b\xb1" + "\xe4\xb0\xd3\xde\x8b\xfa\x9e\xf7\x5e\xa4\x4d\xba\x42\xfb\x4b\x37" + "\xbe\x19\x07\x23\x9d\xfd\xdd\x62\x46\x29\xf1\x3d\xe6\x49\x07\xbe" + "\xbf\x84\xf8\x1e\xfb\xa2\x12\xdf\x63\x23\xb1\x9f\xee\xf6\x62\xfc" + "\x45\xf1\x5d\x31\x66\x9d\xd2\x57\xc3\xc5\xfe\xf2\x12\xf2\x5e\xac" + "\x4a\x81\xef\xc7\x9d\xf1\x3d\xa6\xdc\x9d\xec\x8e\x76\x6f\xe6\x53" + "\x3c\xc5\x69\x4f\xdb\x44\xc9\xff\xed\xb5\xaa\x03\xd1\xf0\xfe\x66" + "\x0f\xbe\x6e\x53\xb8\xaf\x1b\xf3\x6d\x43\x3b\x38\xb4\xb5\x7d\x8a" + "\x5e\x9d\x1e\x4b\x05\xf4\x75\x73\xf5\x73\x43\xdf\x37\xf4\x75\xab" + "\x4a\x30\x78\xf4\x73\x43\xde\xf4\xe4\xeb\x06\xfd\x0e\x62\x58\x7f" + "\x52\xc4\x7a\xd1\xd7\xad\x28\x59\xf6\x75\x53\x60\xbd\x1b\xff\xe1" + "\x9d\xc7\x33\xdd\xcb\xf1\x19\x32\xd6\x77\xa2\x1c\xff\x0b\x17\x5b" + "\x0c\xa3\xc1\x14\xff\x1f\xd5\x16\xc3\xb0\x7e\x8a\xbd\x1a\xf9\x38" + "\x46\xef\xc6\x16\xd3\xd5\xc7\xf9\xc7\xb3\xc5\x4c\x9d\xa4\xc4\xf8" + "\xa9\x39\x4a\x8c\x9f\xfa\xa4\x8c\xf1\xe2\xb5\x6b\x82\xf1\x53\xa3" + "\x6e\x8c\x2d\x66\x6a\x94\x6c\x8b\x89\x7d\xdc\xad\xff\x9d\xc2\xc6" + "\x1e\x53\xe9\xde\xc6\x1e\x23\xfa\xdf\xc5\x54\x7a\xdc\x13\xd2\xe5" + "\x9b\xe6\xb4\xfe\xdc\xc6\x7e\x15\x7b\x42\xea\x7f\x6a\xb6\x98\x69" + "\x5d\xf2\xad\xf5\x64\x8b\x61\xbe\xcd\x87\xd1\x3f\xc4\xbb\x3d\x21" + "\x3d\x61\xbb\x43\x76\xef\xe6\x1b\xa6\x12\xdb\xa7\xf7\x57\x62\xfb" + "\xf4\x3b\x94\xd8\xfe\xfa\xbd\x4a\x6c\x7f\x5d\xe7\x8a\xed\x5d\x71" + "\x7d\xfa\x4c\x77\x98\xae\x7f\x09\x6d\x31\xf1\x35\x9e\xf1\x7c\x7a" + "\x81\xf7\x78\x3e\x63\xc3\x7f\x34\x9e\x6b\x5c\xf1\x7c\x46\xdd\x8f" + "\x6a\x97\x61\x78\x1e\x57\xa5\xc0\x73\x4d\x0f\x78\xfe\xa3\xd9\x65" + "\xe2\x83\x95\x78\x1e\x1f\xad\xc4\xf3\xf8\x5b\x65\x3c\x17\xaf\x5d" + "\x13\xbb\x4c\xfc\xe0\x1b\x63\x97\x89\x1f\x2c\xcb\xec\xaf\xab\x7a" + "\xc6\xf3\xe9\x45\xee\xf1\x1c\xce\x33\x3c\x9f\x5e\xe4\xd1\x9f\xba" + "\x0b\x9e\xbf\x7e\xd2\x0b\x3c\x77\xeb\xa3\xf2\xd3\xb0\xcb\xbc\x6e" + "\xf6\xd6\x2e\xe3\x69\x9f\x0a\xe2\xbb\xec\x9f\xe2\xb4\x4f\x25\x4c" + "\xda\xa7\x92\xa9\xf4\x4f\xb9\xe6\xd8\xfe\xc6\x79\x25\xb6\xbf\x71" + "\x51\x89\xed\xb3\xfb\x2a\xb1\x7d\xb6\x46\xea\x27\xb7\xcb\x64\x75" + "\xd9\xb7\xa2\xc4\xf9\x84\x49\xc6\x97\x1a\x89\x3b\xac\x3f\xa3\x7a" + "\xf3\x73\xcf\x38\x9f\x90\xe6\x09\xe7\xd1\x5f\xe5\x8f\x53\x12\xdc" + "\xe0\xfc\xcc\xb7\xfe\x7f\xc0\x79\x4f\x7e\x28\x4c\x0f\x02\x8c\x47" + "\xbc\x67\xf8\x2e\x62\x3d\xe2\xbc\xfd\xaf\xee\x6c\x34\x33\x8d\xd7" + "\x0b\xe7\x3d\xdb\x68\x66\xed\xae\x8e\x11\x71\xfe\x4a\xf6\xd0\x7c" + "\xae\xb4\xd1\x14\xcd\xba\xde\x36\x9a\x37\xfb\x2b\xf1\xfe\xcd\xf1" + "\x4a\xbc\x9f\x65\x97\xf1\x5e\xbc\x76\x4d\xe4\xf7\x37\x83\x6e\x8c" + "\x8d\xe6\xcd\x20\x19\xef\xdf\x3c\xdf\x33\xde\x27\xac\x70\x8f\xf7" + "\x09\x62\x6c\xb6\x84\x15\x57\x8e\xf7\xb3\x1d\x78\xdf\x75\xff\x4c" + "\xe6\xd5\xfb\xc8\x3c\x75\xa3\x6d\x34\xb3\x3d\xe2\x7f\x77\xf1\x31" + "\xae\xde\x46\x23\xee\x49\x9c\xee\x3e\x3e\xc6\x81\x6e\x7c\x64\x0e" + "\x54\x3a\x63\xfd\x9c\x63\x4a\x5f\xc4\x39\x27\x25\x5f\xc4\x03\xd5" + "\x88\xf5\x89\x37\x2b\xb1\x3e\xd1\xdf\x93\x8d\x66\xa7\xe0\xec\x93" + "\x38\xf7\x49\xa5\x8d\xa6\x58\x69\xa3\x99\x88\xbc\x37\x7f\xa7\x67" + "\xac\x9f\x9b\xa0\xf4\x01\xe7\x7b\x14\x3f\x9e\x22\xfa\x80\x4f\x71" + "\xf2\x01\x7f\xe1\x43\x11\xeb\xe7\xbd\x55\x51\x63\x23\xde\xf8\x21" + "\xfe\x70\x5f\xef\x1c\xb7\x3e\x88\x6c\x0d\xe8\xc6\x0f\x71\xea\x11" + "\x0d\xfa\x34\x97\x6e\x4c\x76\xf2\x43\xec\x26\x9e\xb1\x02\xff\xa7" + "\xe8\x3d\xe2\x7f\x07\x95\xf1\x5f\x18\x21\xdb\x6d\x04\x94\xf3\x19" + "\x5d\xe6\x19\xaf\x97\xdd\xc6\x9d\x9d\xc4\xf8\x34\xe2\xbf\xfe\x33" + "\x2e\xe7\x27\xfc\xc4\xec\x36\xf3\x6f\x55\xe2\xfe\xfc\x30\x25\xee" + "\xeb\x2f\xca\xb8\x2f\x5e\xbb\x26\xbe\xe8\xf3\x03\x6e\x8c\x9c\x3f" + "\x3f\x40\xb6\xdb\xcc\xff\xae\x67\xdc\x9f\xab\x77\x8f\xfb\x73\xf5" + "\x1c\xf7\xe7\xea\xbb\xb5\xdb\x28\x7c\x23\x13\xab\x7e\xb0\xdd\x46" + "\x92\xf3\x6f\xf8\xbe\x9e\xc4\x4a\x6f\xec\x36\x8e\x3d\xe9\x3f\xc8" + "\x6e\xe3\x1e\xef\x25\xd9\xfe\x40\x37\xdf\x5c\x95\x78\xbf\xa0\x4a" + "\x89\xf7\x0b\xbe\x52\xe2\xfd\xa2\xb3\x4a\xbc\x5f\xd4\xe2\xce\x6e" + "\xa3\xc4\xfa\xa4\x7b\xdd\xe1\xbc\x7e\x22\xda\x6d\x16\x15\x79\xc6" + "\xf8\xa4\x09\xde\x63\xfc\xc2\x99\xff\x87\xf1\x2e\x18\xaf\x71\xc5" + "\xf8\x85\x9b\x7f\x54\x19\x9f\x61\x7c\xf2\x3a\x05\xc6\x5f\x43\x5b" + "\xce\x95\xec\x27\xf1\x2c\xdb\x27\xbb\xf8\xbf\x2f\x72\xf1\x7f\x4f" + "\x76\xf2\x7f\x5f\x34\xf8\xda\x61\x7c\xf2\xb5\xf7\x7f\xbf\x22\x8c" + "\x4f\x76\xf2\x7f\x5f\x54\xd5\x33\xc6\x27\x45\xb9\xc7\x78\x38\xcf" + "\x30\x3e\x29\xaa\x5b\xd9\x5e\x81\xf1\x29\x9f\x5e\x0f\x5b\xce\x8d" + "\xd9\x6f\x94\x52\xea\x8d\x3d\xa7\xbb\xb8\x23\x1e\xed\x39\x23\x25" + "\x7b\x8e\xde\x83\x3d\xe7\x5a\x61\xfe\xe2\xcf\x95\x98\xbf\x78\xbf" + "\x12\xf3\x97\x5e\x54\x62\xfe\xd2\x36\xa5\x3d\x27\xb1\x8b\x3d\x47" + "\x89\xff\xa9\xc1\xc6\x89\xce\xf6\x9c\x62\x27\x7b\xce\xd2\x8f\x3c" + "\xe3\x7f\xaa\x47\xfc\xbf\xc4\xf0\x3f\xd6\x0d\xfe\x2f\xf9\x0f\xc1" + "\xff\xd8\x1f\x80\xff\x4b\x6e\x00\xfe\xa7\x7d\xc0\x6d\x3c\x57\x18" + "\x27\x65\xa7\xf7\x36\x9e\x1f\xb6\x0e\xa4\x75\x28\xd7\x81\xa5\x43" + "\x94\xeb\x40\xda\x49\x79\x1d\x10\xaf\x5d\x93\x75\x20\xcd\x7a\x63" + "\xd6\x81\x34\xab\xbc\x0e\x2c\x3d\xdc\xf3\x3a\x90\xea\x61\x1d\x48" + "\x15\xd7\x81\x54\x2f\xd6\x81\xf4\xfd\x9e\x6d\x3c\xfa\xab\xb7\xf1" + "\x8c\xba\xd1\xfb\xa0\xd2\xcb\xbd\xb2\xf1\xac\x8d\x30\x54\x62\x8c" + "\x94\x93\x44\xbd\x64\x9a\x64\xe3\x31\xba\xd8\x78\x8c\x5d\x6c\x3c" + "\x8b\x4f\x8a\xf8\x3f\x41\xdc\x6f\x3a\xf1\x07\xc4\x48\x61\x79\x94" + "\x33\x3e\x57\xfa\xcd\x67\x30\xfc\x97\xe3\xf7\x2d\x7f\x11\xfb\xc5" + "\xd7\x1f\x63\x37\x31\x50\x33\xfb\x2a\x6c\x3a\x13\xdc\xc5\x48\x59" + "\xae\xf0\xbb\x51\xee\x37\xcd\x1c\xa3\xc0\xfb\x89\x7c\xbf\xe9\x27" + "\xee\xbe\xd3\x3a\x62\xf2\x2f\x0b\x67\x31\xf9\x1d\xb1\xfc\x32\x33" + "\xaf\x28\x96\xf4\x14\x31\x96\xf4\xf1\x1b\x10\x4b\xfa\x4a\x63\xf2" + "\x1f\x77\x8d\xdf\xb7\xec\x3b\x53\xa5\x91\x54\x23\x8f\xc4\xb8\xc6" + "\x3e\x35\xba\xdf\xbb\xaf\x16\xf7\xee\xcf\xbd\x3e\x71\x50\xb0\x3f" + "\x6c\xcd\xef\xf7\x9e\x61\x6b\xba\x85\xf5\x07\x73\x56\x9f\x51\x65" + "\xcd\xa9\x04\x5e\x15\x10\x4f\x13\x11\x4f\xb3\x8a\x59\xdd\x93\xc0" + "\x0b\xfd\x1e\x28\x41\x3e\xce\x13\x48\x80\x3e\x19\xb1\x35\x8b\xf9" + "\x7d\x81\x18\x01\xd8\xca\xeb\x2d\x3d\x49\xed\xf6\x7e\x8f\x95\x40" + "\xff\x6f\xda\x36\xb7\xc6\xaf\xda\xdc\x06\xf3\xa2\x19\xf7\xc4\xaa" + "\x4c\xb6\x76\x23\xd2\x62\xcf\xdc\x1a\x5f\x0a\xf8\xbb\xe9\x75\xe2" + "\xef\xdd\x3c\xcd\x9a\xcd\xe4\x19\x5c\xf7\xfa\xbd\x57\x84\x71\x40" + "\x24\xd9\x4a\xf8\x5e\xb6\x6f\x6d\x80\xf1\x11\x28\x5f\xfb\xa6\xce" + "\xe4\xb8\x01\xcf\x2b\x85\xb1\x64\x3e\xb6\x88\x1b\x2c\x87\x15\xe0" + "\xc6\xc6\x0b\xf2\x77\x6c\x6c\x1f\xc7\x88\xdb\x51\x96\xcb\xfe\x2f" + "\x66\x4f\xd8\x9a\x39\xd6\x3d\xb6\x66\x8e\xe5\xd8\x9a\x39\xd6\x81" + "\xad\x66\x37\x76\x14\x85\x1f\xfb\x0a\xd1\xff\xc5\xe8\x22\x63\x1b" + "\xff\x0d\xe3\xa3\xac\xf0\xca\xff\x85\xe1\xe9\x6c\x8e\xa7\x88\x57" + "\x12\xa6\xca\x76\x14\xa3\x47\x3b\x4a\x4f\x98\xea\xd5\x1e\x7e\x86" + "\xa9\x6f\xf5\x57\x62\xea\x5b\x77\x28\x31\x35\x67\x9d\x2b\xa6\x76" + "\xc5\xd3\xb7\x26\xbb\xc3\x52\x1e\x1f\x25\x67\xbc\x67\x1c\x7d\x6b" + "\x85\x27\x1c\x65\xfe\xe9\x53\x9c\xfc\xd3\x1d\x38\x9a\xbd\x46\x89" + "\xa3\x6f\x55\x5c\x29\x8e\xb2\xdc\x26\xc7\x7f\x84\xdc\x26\x57\x8d" + "\xa3\x7a\x17\x1c\xfd\xed\xe3\x32\x8e\xba\xe6\x37\xe9\x01\x47\x67" + "\x5d\x9f\x18\x28\x0a\x1c\x15\x2c\xac\x3f\xba\xb9\xac\xaf\x9f\x29" + "\x71\xf4\xb7\x4d\x9e\x71\xf4\xb7\x6f\xc9\x38\xca\xeb\x5d\x5f\x1c" + "\xfd\xed\x0e\x05\x8e\xce\x72\xc2\xd1\x7f\xc9\x3a\x04\xfa\x58\x38" + "\x70\x74\x8e\x13\x8e\xce\xea\x09\x47\x7f\xbb\x03\xc7\x88\xcb\xa8" + "\x39\x8b\x7b\xc6\xd1\xb7\x56\xba\xc7\x51\x38\xcf\x70\xf4\xad\x95" + "\x32\x8e\xba\x91\x51\x15\x38\xfa\xf6\x6b\x5e\xe0\xe8\x4f\x3c\x36" + "\xca\xdb\x31\x5e\xd9\x2a\xe4\x3d\x9d\x5d\x63\xa4\xbe\xe6\xbc\x27" + "\xa8\xcc\x25\xef\x49\x59\x97\xbc\x27\x8b\xa5\x3d\x9e\xe3\x45\x5c" + "\x7d\xe1\x07\xe0\x2a\xdb\xe3\xf9\xce\x1c\xa5\xef\xc9\x3b\xf3\x25" + "\xdf\x13\x8e\xab\x79\x7e\x52\xbf\xe4\xbc\x27\x65\xdd\xc4\x48\x7d" + "\xe7\x73\x45\x6c\x94\xf1\xce\xb1\x51\x72\x3f\xf3\x1c\x23\xf5\x9d" + "\x26\x45\x6c\x94\x83\x25\x8e\xbc\x27\xae\x31\x52\x65\x8c\xfd\x5d" + "\x07\xc3\x58\x47\x0c\xaa\xdf\x0d\x71\xc4\x48\xed\x61\x5f\x10\xb6" + "\xb3\xad\x21\xe1\xfa\x63\xac\xd1\x0b\x8c\x55\xe4\x3d\x71\x8d\x31" + "\xb5\x72\x83\xa9\xa2\x8c\x54\xc7\x96\xb9\x89\x8d\x5a\x76\x43\x73" + "\x9f\x60\xbf\xdc\x63\x6d\xee\xbd\x4a\xac\xcd\x8d\x62\x75\x8f\xb9" + "\xc3\xda\x95\xe7\x65\xac\xe5\xf5\x96\x1e\x73\xc1\xda\x7a\x0f\x58" + "\x0b\xeb\xea\xa6\x33\xde\x62\x6d\xae\x8e\x61\x6d\x96\x88\xb5\xcd" + "\xd7\x1a\x6b\x73\x75\x32\xd6\xe6\x9e\xee\x39\xc7\xd4\x3b\x16\xf7" + "\xfb\x72\xde\xb1\x70\xac\x7d\xc7\xd2\x6d\x8e\x29\x85\xcf\x47\xde" + "\x61\x29\xc7\x94\x6c\x0f\x28\x13\xed\x01\xff\xce\x39\x51\xf2\x6a" + "\xbd\xb5\x07\x1c\x02\xdd\x1d\xf7\x5d\x2e\xc1\x9c\x53\x31\x98\x13" + "\xa5\xd4\xc5\x1e\x50\xda\xd5\x1e\x30\xb9\x7b\x8c\xf5\xca\x1e\xc0" + "\xf6\x5d\xae\xfa\x4a\x89\xb1\xab\x0e\x2b\x31\xf6\xdd\x39\xd2\x3e" + "\x4b\xec\x8f\xe7\x98\xa9\x86\x7b\x1d\xf6\x80\x7a\x25\xb6\xca\xf6" + "\x80\x77\x07\x79\xc6\x58\x83\xd2\xfe\xfb\x42\x89\x62\x9f\xe5\x27" + "\x0d\xce\x71\xa8\xa5\xf8\x53\xf9\x33\x0f\xd4\x3a\x63\xac\xc1\xf0" + "\xef\x14\x87\xda\x11\x6b\xaa\x07\x5f\xee\xae\x71\xa8\x57\xfb\x99" + "\x2a\x4a\x09\xee\x6d\x63\x78\xab\xb0\x0d\x94\xde\x18\xdb\x40\x45" + "\xa9\x07\xdb\xc0\xea\xb7\x95\x38\xbb\x7a\x17\xab\x7b\xc4\x1d\xce" + "\xae\x9e\x2c\xe3\x2c\xaf\xb7\xf4\x88\x0b\xce\xd6\x5d\x4b\x99\x76" + "\x75\xce\xf5\xb5\x0d\xac\xce\x91\x6d\x03\xef\x5e\xc1\xfe\x47\x43" + "\x94\x7b\x9c\x35\x88\x76\x57\x83\x6c\x77\xad\x73\x93\x2f\x45\x81" + "\xb3\x05\x8f\x4b\xfb\x1f\x99\x4c\x5b\x2f\xc9\xb4\xa5\xff\x86\xf9" + "\x52\x0a\x42\xbd\xb5\x0d\xe0\x3e\x77\xc4\x56\xc4\x2e\x09\x5f\x65" + "\xdb\x40\xa9\x67\xdb\x40\x0f\xf8\xea\x7d\xee\xbe\x35\x8f\x2b\xf1" + "\x75\xcd\x30\x25\xbe\x16\x7e\xee\x8a\xaf\x5d\xb1\x75\xcd\x42\x77" + "\xb8\xca\x6d\x03\x85\x7a\xcf\x98\xba\xa6\xd8\x13\xa6\xb2\x98\x7e" + "\x0d\xb2\x8f\xb4\x8c\xa9\x6b\x77\x2b\x31\x75\x4d\xe3\x95\x62\xea" + "\x0d\xc9\x97\x72\xd5\x98\x9a\xe0\x82\xa9\xef\x4d\x96\x31\xd5\x35" + "\x67\x4a\x0f\x98\x7a\xbd\xec\x04\xce\x98\xaa\x90\x5d\xdf\x3b\xa6" + "\xc4\xd4\x42\x8d\x67\x4c\x7d\x6f\xab\x8c\xa9\xbc\xde\xf5\xc5\xd4" + "\xf7\xea\xaf\xaf\x9d\xe0\xbd\x7a\x59\x76\x2d\xfc\xa0\x67\x4c\x5d" + "\x53\xe2\x1e\x53\xd7\x94\x70\x4c\x5d\x53\x72\xe5\x7b\xca\xd7\xbd" + "\xe5\x05\xa6\xfe\xc4\x73\xa9\xac\x5b\xe1\xb5\x9d\x00\xed\xad\x88" + "\xa5\xf5\x3f\x2c\x76\x48\x8a\x14\x3b\x64\xac\x88\xb1\xcf\xfe\x50" + "\x8c\x7d\x7f\x8d\xd2\xa7\xe1\xfd\x75\x92\x4f\x03\xc7\xd8\x8d\xa3" + "\x94\xf9\x51\xbb\xc6\x0a\x51\xc6\x50\x7d\xff\x3b\x87\x9d\x00\x31" + "\x77\xac\xb3\x9d\x60\xc3\x77\x9e\xf1\x76\xbd\x46\x61\x27\xf8\xd2" + "\x3d\xde\x5e\x52\xe0\x6d\xd1\x23\x0c\x6f\x1d\x31\x54\xd7\x47\x49" + "\x31\x54\x7b\x94\x61\x15\x78\x1b\xfb\xe3\xe0\x6d\xd9\x95\xe3\xad" + "\x32\x97\x8a\x6b\xbc\xd4\xa2\xaf\x4c\xe5\x80\xb7\x2c\x5e\x87\x6b" + "\xcc\xd4\x2b\x8b\xd7\x71\xbd\x62\xa6\x62\xbf\xdc\xe3\xee\x86\x49" + "\x4a\xdc\xdd\x90\xc3\xea\xba\xc5\xdd\x0d\xc1\x32\xee\xf2\x7a\x57" + "\x8c\xbb\x57\x65\x33\xd8\x10\x75\x7d\x6d\x06\x1b\xa2\x64\xdc\xdd" + "\x78\x47\xcf\xb8\xbb\x5e\xeb\x1e\x77\xd7\x6b\x39\xee\xae\xd7\x76" + "\x8b\xbb\x0a\x1f\x82\x4d\x37\xbb\x8d\xe5\x51\xff\xef\x9e\x67\x65" + "\x93\xff\xd5\xd8\x0c\x00\x83\xd5\x69\x18\xc3\x29\x16\x7d\x08\x7a" + "\xb6\x19\xf4\x84\xb7\xde\xdb\x0c\x8a\xfd\x94\x78\x5b\x7c\xb3\x12" + "\x6f\x7f\xff\x19\xf6\xab\x5b\x9b\x01\xc3\x80\xe2\x49\x0e\x9b\x81" + "\x59\x89\xb3\xb2\xcd\xe0\xf7\xf1\x9e\xbf\x7d\x15\x67\x2a\xe4\xdb" + "\x67\x5d\x62\x56\x4f\x91\xf1\xf6\x60\xb5\xe4\x33\xf6\xc1\xa7\x07" + "\x22\x9d\xf1\xb6\xb8\xbc\x4b\xcc\xea\xa8\x6b\x18\xb3\x3a\xea\x1a" + "\xc7\xac\x9e\xa4\x8c\x59\xfd\xfe\x25\xd9\x8f\xcc\xfb\x98\xd5\x1f" + "\x86\x33\x0c\x46\x1e\xc2\xb8\xd5\x57\x62\x47\xb8\xce\xb9\x56\x14" + "\xd8\xab\xb0\x23\x7c\xf8\x95\x12\x7b\x7f\xef\xeb\x19\x7b\x3f\xfc" + "\x40\xc6\x5e\x5e\xef\xfa\xca\xbc\x1f\xd6\x5c\x5f\x3b\xc2\x87\x35" + "\xb2\x1d\xe1\xf7\x6b\xdc\x62\xaf\xe2\xdb\x58\x71\x8e\xfb\x6f\x63" + "\x70\x9e\x61\x6f\x71\x8e\x47\x3b\x42\x17\xff\xad\xcd\x8b\xf9\xb7" + "\x31\x51\xe6\x35\x7b\x61\x47\xf8\xc9\xf9\x18\x6c\x4e\xb9\x1a\x3b" + "\x02\xe2\x2d\xe2\x99\x84\xb9\x57\x62\x47\xb8\xf6\x32\xee\x47\x8b" + "\x95\x98\xfb\xd1\x52\x25\xe6\x7e\x3c\xc8\x15\x73\xbb\xe2\xed\x47" + "\xbb\xdd\x61\x2d\xb7\x23\x94\x54\x7a\xc6\xd9\x8f\x9a\x3c\xe2\xac" + "\x8b\x6f\xae\x8c\xb3\xff\x7d\x87\x12\x67\xff\x30\xe4\xaa\x70\xf6" + "\x4a\x73\xb0\xfc\xa4\x70\x36\xd6\x05\x67\xff\xfb\x33\x19\x67\x5d" + "\xf3\xb0\xf4\x80\xb3\xd7\x29\x0f\x8b\x67\x19\xb7\x64\x94\x12\x67" + "\x4b\x66\x7b\xc6\xd9\x92\x9b\x65\x9c\xe5\xf5\xae\x2f\xce\x96\x8c" + "\xbc\xbe\xb6\x85\x92\x91\xb2\x8c\x5b\x62\xef\x19\x67\x3f\xb2\xb8" + "\xc7\xd9\x8f\xc4\xef\x62\x1f\x59\x3c\xca\xb8\x5d\x70\xf6\xe3\x93" + "\x5e\xe0\xec\x4f\xdc\x07\xe1\x63\xf3\xd5\xd8\x16\x18\xbe\x9a\x5d" + "\xf6\x4b\x1c\x71\xde\x2f\xe1\x64\x5b\x18\x2b\xd9\x16\x94\xf9\x59" + "\x52\x24\xfb\x6d\x98\x88\xbb\x4f\xff\x50\xdc\xfd\xe4\x7c\xbb\x03" + "\x77\x13\x01\x77\x3f\x61\xfb\x23\xda\x1d\xb8\xbb\xed\x63\xa9\x5f" + "\x72\x7e\x16\x0f\xb6\x85\xd1\xd8\xde\x1f\xc7\x39\x6c\x0b\x88\xc3" + "\x61\xce\xb6\x85\x6d\x93\x3d\x63\xf0\x1f\x67\x2b\x6c\x0b\x5f\xb8" + "\xc7\xe0\x36\x05\x06\x6f\xd9\xc0\x30\x78\xb4\x84\xc1\x7f\x2c\xbd" + "\x04\xba\xe5\xa5\x6c\xef\x30\xb8\x8d\x61\xf0\xf8\x1b\x83\xc1\x3b" + "\xae\x01\x06\xb3\x71\xdf\xfa\x94\xc9\x08\x18\x1c\x83\x18\x3c\xfe" + "\xca\xec\x0d\x3f\x52\x8e\x16\xec\x97\x7b\x2c\xde\xba\x5f\x89\xc5" + "\x5b\xad\xac\xae\x5b\x2c\xde\xba\x46\xc6\x62\x5e\xef\xfa\xda\x1b" + "\xb6\x96\x5f\x5f\x7b\xc3\xd6\x72\x19\x8b\xb7\xbd\xdd\x33\x16\xff" + "\x31\xc9\x3d\x16\xc3\x79\x86\xc5\x7f\x4c\xea\x16\x8b\x47\x3b\x63" + "\xf1\x76\x87\xcc\xab\xb0\x37\x98\xff\xdd\x73\xb7\x6c\xf7\x28\xff" + "\xea\xee\x26\x99\x0d\xaa\xed\x5f\x99\x8a\x08\x69\xcd\x22\x99\x26" + "\xdb\x68\x02\xe7\x60\xfc\xb6\x77\x98\xb4\x23\x89\xb0\x7a\x84\x15" + "\xf1\xf8\x5d\xfc\x81\x8c\x6b\x50\x8b\x73\x8b\x8d\x71\x29\xf3\x77" + "\xc5\xf3\x88\xbd\x9b\x9c\xae\xbb\x7b\x16\x35\x8c\x48\x12\xef\x8b" + "\xe2\xfb\x6e\x46\xa4\x48\x65\xe4\x4d\xb3\xaa\x34\x9a\xe6\x8f\xd0" + "\x5b\xfa\x8e\xd0\xbb\xbb\xff\x3e\x0d\xf1\xef\xb3\x8c\xd2\x8d\x6b" + "\x69\x5b\xeb\xfd\x23\x33\x5b\xdf\x21\xc4\xb0\x96\x5a\xda\xb3\x4b" + "\x0d\xf0\x8e\x65\xef\x41\xbd\xd6\x7e\x5b\xf4\xad\x59\x91\x04\xce" + "\x6d\x96\xce\xc1\xb8\x11\x21\xcb\x87\x0a\x70\x8d\xae\xb6\xc5\x6c" + "\x4a\x07\xac\x4a\x23\xe4\xd1\x4b\x38\x67\x4a\x77\x00\xcf\x04\xe5" + "\x41\x9b\xab\xa0\x2d\x7a\xfb\x5d\x6d\xc0\x8f\xbe\xd5\x2b\x08\xce" + "\xe9\x1c\x78\xaf\xe2\x3c\x1c\x7b\x9f\x87\x0a\xa9\xda\x97\x08\x1f" + "\x3d\x50\x47\xfb\x47\x1a\x80\x1e\xc4\x90\x48\x98\x1d\x67\x15\xd4" + "\xa3\xea\x0c\x2a\x04\xdf\x1f\x6b\xb2\xb5\xf1\x39\x0d\xfd\xdb\x03" + "\x7a\x2c\x85\xe7\x6e\x4c\x24\x1a\xf8\x05\xd0\x35\x91\x86\xf6\xec" + "\x4f\xc7\xc0\x7b\x0e\xc6\x7e\x79\x7a\xc7\x55\xef\xc3\xba\x73\x97" + "\x16\xd7\x0e\xf6\x7c\x7c\x36\x7b\x8e\x5a\xc8\xb1\xc3\x79\x9a\x95" + "\x41\x4d\x29\x36\x12\x08\x63\xb1\x09\xfa\x8d\xfc\x28\xfc\x61\x64" + "\xe6\xf2\x3b\x09\xd9\x96\xda\xa4\x36\x41\xdf\xed\xef\xdd\xd5\x66" + "\x4c\x7f\x82\xc0\x75\x0b\xea\x2c\x67\x54\x7f\x1a\x15\xf1\x1d\x21" + "\x88\x27\xf0\xff\xb8\x36\x58\xc7\xc2\xa1\xbc\x0a\xde\x43\x68\xd5" + "\xfa\x62\xdd\x33\xaa\x4f\xcf\x1b\x93\x8f\x92\x40\x3d\xf1\xcf\x83" + "\x77\xe3\x75\x3f\x35\x62\x5d\xb3\xea\x4f\x63\xb1\x0f\x50\xae\x85" + "\x32\xde\x87\x3e\x64\x84\x6e\x7e\xa0\x8e\xf1\x66\x41\xa4\x41\x08" + "\x7e\xa0\x8e\x61\x1f\xbc\xe7\x2a\x78\x67\xa8\x13\x00\x75\x02\xd8" + "\x31\x9d\x68\x0a\xe0\x1c\xb6\x03\xc7\x00\xe3\xdc\x4e\x6c\xbb\x14" + "\xdb\xf6\x30\x0e\xbe\x34\x28\xd2\x40\x81\xb7\x71\x4d\xd5\xa5\xab" + "\xbe\x6a\x50\xfd\xa9\x31\x50\x45\x29\xdd\x7c\x7f\xec\xf2\x74\x12" + "\x60\x10\x08\x31\xde\x89\xed\xfc\x69\x37\xb4\xef\x8b\x63\xd1\x9e" + "\xfd\xa7\x22\xb3\xea\xd3\xf1\x38\xbe\x40\xcf\x36\xdd\x7d\xec\x7d" + "\xdb\xf0\x39\x78\x8f\x58\x9f\xc5\xbe\xc7\x3e\xeb\xd2\x7d\x28\x94" + "\x8f\xf9\xa8\x4e\x12\x1f\x6d\x40\x36\xdc\x5f\x6f\x26\xb3\x6a\xf1" + "\x7e\x33\xbf\x0f\x78\xe9\x4f\x16\xa0\x59\x1c\x9e\xc3\xb2\x87\xfe" + "\x06\x48\x74\xab\xd2\x02\x6f\xb8\xd2\x4e\xe2\x11\xe0\x0b\x89\x47" + "\xb0\xbf\xdb\xd3\xcd\x6a\xb6\x0e\xab\xfe\xcc\xf4\xba\x3c\xa0\xa1" + "\x7d\xbd\xd6\x77\x15\x8c\xad\x70\x19\xe9\xd2\x00\xd7\x76\x0c\x43" + "\xba\xac\x4a\x05\x9a\xf0\xba\xd1\x72\xff\xb1\xbc\x83\xd1\x53\x00" + "\x5a\xf0\xbd\x9b\x3b\x6e\xc6\xf7\x59\x75\x09\xe8\x38\x80\xb6\x95" + "\xc3\xec\xa7\xc8\xb7\xc0\x23\xdb\x12\xad\x6a\xf4\xeb\xc3\xf3\x7b" + "\x2e\x58\xd5\xab\x9a\x09\xca\x95\x24\x17\x70\x79\x43\x32\x8c\x39" + "\xb4\x49\x07\xdf\x1f\xfb\x98\x44\xc7\x54\xa0\x5d\x32\xf0\x2e\x8c" + "\xf9\x2a\x18\xbf\x8d\x80\x79\xf8\xff\x46\x58\x7f\x04\xa8\x67\x56" + "\xed\x18\x0b\xed\x69\x36\x0c\xa0\x96\x4d\x03\x68\x0b\x8c\xe1\xfb" + "\xed\xd9\x3b\x74\xd2\x18\x62\x9f\x56\xc1\xf9\x5c\xb8\x6e\x56\xfd" + "\xb9\x88\xf3\xd0\x9f\x67\x4b\xef\xec\x69\x3c\x57\x6e\x23\x23\x73" + "\xb7\x91\x81\xef\x6c\x23\x63\x96\x34\xc2\xbc\xcc\xfa\x15\x3d\x14" + "\x63\x83\x35\x31\xbf\xa4\x73\xc0\x28\x3d\x7e\x7b\x12\x96\xdf\x55" + "\xfc\xd6\x36\x32\x04\xf7\xc6\x46\xb4\x10\x82\x6b\x78\x84\xdf\x09" + "\x6a\xd2\x5f\x24\x42\xdf\xfc\x12\xfb\xf2\x87\xfa\x4d\x04\xa9\x6d" + "\x7f\x48\x1b\x49\x4f\x82\xb5\xfc\x42\x13\x49\x6f\xa3\x96\xea\xcc" + "\xef\x08\x60\x4f\x02\x1f\xbb\xcf\xcc\x11\xf1\x84\xe0\x9e\x41\xe1" + "\x5f\x21\xe4\xd6\x04\xe2\x9b\x76\x84\x68\x33\x1a\x69\x93\x7d\xed" + "\xb3\xb1\xe9\x4b\x89\x7a\xdb\x85\x3a\x2e\x7b\xaa\x3e\xfb\x74\x37" + "\xee\x4f\x6d\x8f\x26\x53\x6d\xe2\x7a\x54\x10\x59\x98\x31\x93\xdc" + "\x81\xef\x13\xc8\x64\xaf\xcf\xc2\x61\xdc\x0a\xbd\xc3\xe7\xcf\xb4" + "\x8c\x9e\x6b\x9f\xb3\x6c\x9b\x6e\x05\x79\xcb\x9e\x99\x11\x4f\x9b" + "\x50\xae\x83\xf5\x85\xc9\x82\xa6\x26\x1b\xc8\x56\x71\xb0\x7e\x9b" + "\xc9\xde\x86\x62\xb5\x90\x6f\xcf\xf4\xf2\x19\x69\x6c\xdd\xc6\xb5" + "\x14\xfa\x3e\x29\x84\x64\xb2\xfe\xc3\x9a\x19\x98\x84\xf2\x14\x3d" + "\x81\xfd\xdf\x03\xef\x4a\xef\x9d\x01\xb4\xfa\x8c\xe0\xfa\x19\x51" + "\x6f\x24\x95\x56\x3b\x79\xbf\x99\x8d\x51\x2f\x18\x23\x5f\xa0\x79" + "\x2d\x8c\x93\xbf\x3b\xba\x21\xcd\x04\x43\x7e\x89\xe0\xc3\x69\xc3" + "\xe8\xd2\xc6\xe9\x32\x71\x3e\x81\x75\x14\x68\x93\xcf\x69\x23\xf4" + "\x8f\xd0\x23\x6d\xbc\x7b\x8f\xff\x19\xeb\x69\x7d\xc1\x67\x53\xe0" + "\x0f\xe4\x0b\x21\x28\x42\x8f\xcf\xc6\x3e\xe0\xf7\x33\xe4\x83\x88" + "\xb7\x4e\xd0\x6a\x7d\x13\x31\xc1\xfb\xd0\xbe\xce\x7d\xb0\x79\xdb" + "\x87\x0a\x4f\x7d\x58\xf9\x28\xf0\xed\xa3\xc0\xb7\x8f\x02\xdf\x9a" + "\x39\xdf\x1e\xac\xe7\x7c\x6b\x87\x7e\x75\x80\xec\xbe\x64\x12\x51" + "\x63\xbf\xb6\x1c\xc5\x18\x7d\xd0\xcf\x26\x99\x77\xc3\xcf\xc2\x18" + "\x49\xfc\xeb\xf3\x50\x3f\x1c\x9f\xea\xb6\x3a\x92\x81\xfc\xdb\xe9" + "\x8e\x7f\xcb\x8a\x23\xa6\x01\x6d\xde\x00\xfe\xfd\x67\x08\x09\x68" + "\x24\xbe\x4b\x27\x01\xff\x36\xb9\xe3\xdf\xb2\xf9\xbb\xe0\x99\x5d" + "\xf8\x37\xde\x99\x7f\xcb\x6e\xf5\x9e\x7f\xff\xb7\xce\xc1\xbf\xaf" + "\x88\xfc\x3b\xd3\x85\x7f\x1b\x9d\xf8\x17\xdf\xdb\x6b\xfe\x2d\x1b" + "\xe3\x1d\xff\xfe\xaf\xd1\xc1\xbf\xa0\x97\xbc\xff\x3a\x1b\xa3\x5e" + "\x30\x46\xc0\xbf\xff\x5b\x00\xe3\xe4\x96\x7f\x7f\x7c\xfa\xfd\x25" + "\xf6\xca\xe9\xf7\x97\xc7\x7b\xa6\xdf\xce\x2a\xef\xe9\xb7\xb3\xf0" + "\xfa\xd3\x6f\xa7\xcd\x3b\xfa\xed\xcc\xf4\x4c\xbf\x9d\x51\x3f\x1d" + "\xfa\xed\xd2\x5d\x39\xfd\xfe\x7a\xbe\x67\xfa\xfd\x35\xd7\x7b\xfa" + "\xfd\x35\xfa\xfa\xd3\xef\xaf\xbb\xbc\xa3\xdf\x5f\xc3\x3c\xd3\xef" + "\xaf\x41\x9e\xe8\xf7\xcc\x1d\x02\x15\xd0\x6f\x6e\xc0\xb0\x1a\x94" + "\x81\xb8\xbc\xb6\xeb\x2c\xea\x8c\x50\xf6\x95\xca\x4c\xa6\x02\xbd" + "\xda\xa5\x1c\xe0\x52\xd6\xb8\x94\x83\x5c\xca\x5a\x97\xf2\x40\xa9" + "\x0c\xf4\xf2\x3b\xa7\xda\xf5\x1a\xe8\x6c\x99\x66\xd5\x2e\xab\x78" + "\x7d\xf0\x54\xbb\x0e\xf5\xbe\xc1\xee\xfa\xbe\x2a\x8b\x5a\xf5\xe9" + "\xe4\xae\x66\xd5\xee\x38\x46\x8f\xe5\x77\x86\xd0\xd4\x4c\x02\xf4" + "\xd8\x31\x71\x29\xf2\x95\x85\xd0\xcb\xda\x5e\x30\x4e\xb7\x83\xbe" + "\x69\x41\x9e\xd3\x25\xee\xa5\x0d\xaa\xdd\x2f\xe2\xfb\x3d\xaa\x37" + "\x12\xc1\xe7\xa1\x10\xd4\x85\x80\x3e\x3b\x2c\x3e\x0f\xdd\x49\x3f" + "\x88\xcb\xcc\x53\x0b\xfe\x79\x59\x82\x6e\xa9\x85\x5a\x26\x9c\x87" + "\x75\x0c\xd6\x32\x53\x8b\x15\x78\x92\x5a\x8c\x89\x67\xa1\xbf\xbb" + "\x77\x56\xa5\x41\xdb\xf0\x1c\x78\x56\x29\xd5\xd8\x0b\x4c\xb6\x1a" + "\x42\xa1\x8d\xea\xb6\x0a\xd0\xfd\xeb\x88\xd8\x66\x29\xed\x6b\x2f" + "\xc0\x36\xdd\xea\x67\x05\xc3\x7d\xe1\x99\xa3\x27\x85\xf8\x12\xba" + "\xcc\x37\xc8\x3b\xfe\xd8\x5d\xef\x51\xef\x2b\x18\xbe\x82\xb7\xeb" + "\x7f\x15\xed\xee\x19\xea\xb9\xdd\x11\x62\x7f\x35\x57\xd3\xee\xca" + "\x6e\xda\x15\xfb\xab\xbb\x9a\x76\x1b\x3d\xb7\x3b\x52\xec\x6f\xd8" + "\x55\xb4\xbb\xd7\x63\xfe\x0f\x68\x57\xec\x6f\xe6\xd5\xb4\x5b\xd0" + "\x0d\xdd\x7c\xaf\x8e\x17\xf6\x36\x75\xc7\x0b\x57\xc7\x07\xc6\x6e" + "\xde\x7f\x84\xef\xd5\xf1\x80\xd1\xd0\x1d\x0f\x5c\x1d\xfd\x8d\xdd" + "\xd2\xff\xea\x68\xff\xf9\xc8\xee\x68\x7f\x75\x74\xff\xdc\x23\xff" + "\xa3\x2e\x4b\x0b\x86\x15\xd3\x01\x33\xcc\xc2\x5a\xbf\x62\x61\xc0" + "\xb0\x0f\x97\x0b\x61\xe4\x19\xc0\xb0\xc0\x42\xd2\x37\x8c\xd9\x87" + "\xbe\xd0\x2d\x2d\x22\x6a\x83\x5a\x50\x6f\x4d\xad\x53\x9b\x6c\x23" + "\x49\x86\x8d\xda\x37\x27\x5b\x55\x3f\x83\xf3\x9f\x27\x10\xd2\xb6" + "\x20\x84\xf0\x76\xfc\x8a\xf3\xd2\xc3\x48\x84\x9d\xa0\x3d\xa2\x6d" + "\x1f\x68\x22\x11\x80\x63\xa6\x42\x2b\xae\x79\x7d\xe1\x3e\x1b\xf0" + "\x2f\xb4\x61\x25\xdb\x05\x8b\x2a\x2c\x91\xd5\xb3\x80\xde\x68\xa1" + "\x6b\x87\x7d\x48\x33\x42\xc8\x0a\xf8\x1f\x9e\xf9\xb6\x8f\x85\xa8" + "\x37\x82\x3e\xd9\x9e\xfd\xc5\x0a\xb3\x6a\x5f\x2c\xea\x98\xa0\xcb" + "\xb6\x64\x9c\x47\x9b\xfb\x0c\xf3\x72\xd0\x6b\xb1\xee\x36\xc1\xa2" + "\x7e\x54\x4f\xd4\xfb\x2c\xa8\xbf\x7f\x51\xfa\x79\x12\x21\xdd\xd8" + "\x5c\x7c\x85\xa0\xf0\x46\xbc\x1f\xdb\x41\x5b\xe6\x2a\x01\xc6\x36" + "\x28\xb2\x10\xfb\x4b\x0b\x46\x45\x1b\x53\x71\x5d\xd8\x37\x72\xdc" + "\x83\xb4\x5d\xc4\xf9\x3b\x9b\xa1\xcc\x74\xf6\x2c\x5a\x43\x35\xb6" + "\x1c\x9a\x77\x6b\x58\x75\xdb\x05\x62\x4c\xee\x24\x0d\xaa\x7d\xa3" + "\xf0\xd9\xad\x41\xe1\xe6\xb6\xa0\xf0\xa6\xf6\xec\x7d\x43\xa5\xfe" + "\xe2\xb3\xa4\xf3\x68\xa3\xe0\x7d\xdc\x17\xf5\x79\x9a\xe7\x3e\xc2" + "\x5a\xd2\x2f\x42\x4b\x2d\x38\x86\xc6\xf4\x0b\xd0\x97\xf2\x03\x38" + "\xce\xb4\x20\xbc\xb4\x2d\x23\xe4\x6e\x6e\xb3\xdb\x67\x41\xdb\x0f" + "\xac\x03\x9b\x99\x1d\x26\xdf\xbe\x99\xf9\xd9\x00\xde\x83\xce\xce" + "\x6c\x6d\xe7\x54\xfb\x58\xfe\xe3\x49\x21\x6a\x2f\x75\x9e\x7d\x6c" + "\xfd\x37\xde\x8d\xe3\x50\xfe\x29\x3c\xef\x17\x0d\xaa\xf2\x20\x6e" + "\xc7\xb3\x97\xe1\xf3\xa0\x4e\x31\x3c\xb3\x8c\x1a\x6c\x99\x58\x0f" + "\xae\x0f\x15\xaf\x1b\x9d\xae\x1b\xa1\xcf\x56\xf1\xba\x68\x07\xb4" + "\x97\x3b\x5d\x2f\xd7\xdf\x8d\x76\xb9\xf2\x34\x7c\x27\x58\xcb\x8a" + "\x71\x5d\x43\x9b\x3f\xb7\xab\xdb\x8b\xc5\x7a\x3b\x5a\x54\xe5\x6b" + "\x5a\x81\xaf\xe0\xfa\x2e\xa7\xfb\x77\xed\x4b\x09\x25\xcf\x6c\xc0" + "\x31\x2d\x2f\x31\xfb\xfa\x19\xb8\x2d\x67\x1f\x1f\x0b\x8d\xbd\xd0" + "\xb9\x3d\xb3\xaa\x3c\x09\xda\x2c\x6c\x03\x59\x0f\xea\xac\xc4\x67" + "\x3a\x8f\x7f\x7c\x62\xe2\xbc\x44\x5d\x70\x9c\x2e\x6e\xce\x34\xdd" + "\x8c\x79\x0b\xe7\x26\x3d\x19\x1c\xd7\x9b\x10\x27\xde\xd1\xd0\xac" + "\x40\x2a\x14\x3c\x1f\x62\x2a\x04\x19\x4b\xad\x81\xf5\xb6\x93\x14" + "\x00\x5d\xed\x03\x26\x6b\xec\x6b\xa3\x61\xfe\x8c\x26\xc6\xd4\xa7" + "\x61\xec\xf7\x8f\x62\x76\x7f\x1d\x21\x2b\xe1\xba\x31\xf5\x20\x9e" + "\x0b\x67\xe7\x40\x62\x60\xf6\xaa\x54\x7f\x52\xae\xbb\xc0\x6c\x5e" + "\x70\xed\x2d\x66\xdf\xbb\x48\xd4\xb6\x2c\x7f\xf2\xe7\xf4\x1a\xf5" + "\x2e\xc1\xac\xfe\xb3\x50\xa7\x46\x79\x61\x9f\xb6\x82\x3c\x96\xe2" + "\x4f\xf0\xfa\xde\x74\x38\x0f\xd7\xf1\x1a\x6b\x87\xd1\x7a\xff\x61" + "\xac\x87\x36\x30\xfc\x3f\xa3\x90\x9e\xdc\xa7\xb5\x10\x2e\xb7\xee" + "\x7f\x10\xfb\xaa\xbb\x13\xbf\x2f\xec\x7f\x04\xfb\x67\x56\xed\x1f" + "\xe2\x53\x04\xf5\x93\x49\xc0\x39\xd5\x97\x77\x08\x6b\x9e\x0f\x41" + "\x2c\xb0\x65\x97\x9b\x69\x56\xdf\xd7\x37\xae\x26\xfe\x45\xab\x61" + "\x6e\xae\x26\xbe\xed\xd9\x5f\xfa\x9a\x7d\x07\x46\xe1\xd8\x42\x33" + "\x01\xad\x6a\xf2\x2b\x38\xa7\x35\x93\x59\xb3\xf1\x1c\xcc\xc1\x36" + "\x4f\xd8\x72\x09\xe4\x3b\xeb\xe0\x60\xd0\xd1\x9f\xd7\x52\x18\xb7" + "\xf6\xc1\xc1\x35\x81\x7a\xe0\x2d\x98\x63\xb4\xff\xf3\xda\x16\x55" + "\xc5\x90\x2f\x81\x73\xd2\x71\x4e\xaf\x1d\x4d\x3e\xb9\x64\xc5\xef" + "\x69\x9a\x2d\x97\x2c\x50\x8e\x2e\x2e\x81\xf2\x01\x63\x09\xd1\x4d" + "\x44\xd9\xe9\xcb\xdc\x5f\xc7\x51\xdb\x83\x95\x20\x67\x36\xfe\x89" + "\x1c\xaa\xad\x20\x01\x31\xc4\xc7\x11\xeb\x3d\x89\xa8\x23\xcc\x50" + "\x5e\x48\xd4\xd5\xa0\xf7\xa3\x6d\x3e\x7d\x14\xda\xe7\xab\x08\xda" + "\xec\xa9\x7a\x76\xd0\xd6\x0b\x56\xc0\xb0\x26\x3f\xf4\xf9\x16\x34" + "\xef\xa5\xe0\x3d\x53\xdb\xc4\x6f\x5d\xad\xe2\xb7\xae\x56\xf6\xad" + "\x2b\x2c\x2d\x96\x7f\xeb\xc2\x6f\x5c\x11\xb1\x3e\x14\xdb\xc3\xef" + "\x5e\xb7\xb6\x01\x1f\x2c\x08\xe9\x63\x5f\x10\xd2\xaf\xf0\x02\x09" + "\xaa\xb6\x34\x81\x8c\x56\x41\xd6\x27\x93\x20\xda\x9a\x70\x73\xa5" + "\xf1\x20\xa1\xab\xdf\xd5\x6f\x4f\x37\xfa\xd9\xd1\x46\xd1\xaa\xed" + "\x1d\xb8\x4c\x85\x76\xfe\x3e\x2b\x13\xc9\x90\x4d\x17\x48\xe8\xd4" + "\xd3\x99\x2c\xee\x13\xe6\xe8\xb3\xb5\x86\xe8\x2e\xb7\x86\xdc\xd7" + "\xd1\x1a\x72\x77\xa0\x85\x7f\x1b\x7b\xed\xac\x86\xa0\xbf\x2d\xcd" + "\xfe\x9f\x95\x9b\xd0\x46\xdd\x66\x21\xb6\xbe\xef\xa5\x20\x2f\xc3" + "\xb3\x07\xe2\xf7\x94\x8c\xc5\x44\x23\x9c\x0a\x21\x55\x09\x17\xc8" + "\x63\x40\x7b\xfc\x76\xb0\xb1\x81\x7f\x3b\xb0\x83\x4e\x83\xdf\x0f" + "\x2e\xb5\x86\xa8\x69\x50\x44\x66\xf8\x4c\x1d\xe9\xf8\x28\xb8\xd8" + "\x94\xf2\x09\xc9\xe8\xa0\x27\x4d\x2b\x04\x82\x76\x65\x9a\xfd\x65" + "\x28\xed\x1f\x91\xb9\x3f\xe4\x30\xae\x2b\xa1\x32\x76\xfc\xad\xe3" + "\xea\xb0\xe3\x6f\x4c\x7e\xc6\xef\x6c\x74\x2d\xd0\xf1\x02\xd2\x13" + "\xe8\x7a\xc1\xa2\x7e\x01\x68\x57\xd5\xf8\x21\xd0\xad\x4e\x41\x37" + "\x46\x67\xa8\x77\x26\x0e\xe8\x75\x9a\xd3\xb0\xb2\x0d\xe8\xb7\x13" + "\xdb\x98\xa8\xdb\x9a\x6c\x55\x83\xde\xa4\xae\xb4\x1e\x63\x7b\x56" + "\x90\x8e\x5b\x3a\x2b\xfc\x3a\x60\xbd\xc1\xef\x95\x97\x36\x07\x1b" + "\x3b\x82\xc6\x5b\x2f\x07\x3d\xef\xdf\xcd\xb7\x4b\x4e\xcf\x99\xc4" + "\xbf\xb2\xf1\x30\xa7\xe7\x7c\x91\x9e\xe8\xe3\xb6\x28\xa4\x8f\xad" + "\x1d\xe8\x79\x09\xe8\x99\x64\x26\xef\x27\x92\x20\x53\x53\x1d\x7e" + "\xd7\xb9\xf9\xf9\x2a\x42\x5e\x78\x90\x0a\x55\xc6\xa3\x8c\xae\xdb" + "\x80\xae\x36\x43\x7e\x09\x7e\xcf\x74\xd0\x35\x19\xe8\x7a\x09\xe8" + "\x7a\x56\xa6\xab\xbd\x1d\xe8\xda\x0e\x74\x6d\x07\xba\x8a\xdf\x3c" + "\x5f\x9b\x09\x74\xc5\xef\x63\xd9\xff\xab\xc1\x6f\x9e\xf8\x6d\x09" + "\xe9\x8a\x7e\xd5\xc2\xa2\x90\x81\xec\x5b\xe7\x8c\x10\xb2\x69\x3a" + "\xf1\x7f\xc4\x4a\x54\x19\x3b\x89\x06\xfa\xa9\xb9\x7f\x07\x51\x43" + "\x7b\xc0\xf7\x0d\x04\xe9\x6b\xda\x61\x27\x4b\x26\x93\xbb\x6d\xf9" + "\x9c\xce\x26\xdb\x67\x68\xdb\x1d\x79\x69\x51\x88\x7a\x5d\x32\x19" + "\x83\x34\x9f\x70\x5a\x47\xf6\x47\x56\x11\x57\x9a\x0b\x6b\xc2\x4b" + "\x81\x4e\x8d\x48\xf7\xab\x9f\xb7\x87\x1a\xaf\x7c\xde\x1e\x1c\xf7" + "\x7f\xf3\xf6\x5a\xcf\xdb\x03\x4d\xee\xe7\xed\xa1\x4f\xaf\x6e\xde" + "\x1e\x2a\xfd\xbf\x79\xfb\xef\x30\x6f\x0f\x15\xb9\xce\x5b\x87\xdc" + "\x92\x18\x3f\x67\xda\xcc\xb9\x33\xe7\xbe\xa1\x9b\xbe\x38\x29\x7e" + "\x01\x97\x5e\x14\xf2\x4b\x88\x5d\x08\x53\xbf\x0b\xeb\xf5\x21\x6d" + "\x1d\xd9\x7e\x67\x9d\x5a\x78\x55\xeb\x4b\x0d\x1f\x1b\x05\xc3\x96" + "\xf1\xef\x82\x1c\x8e\xf3\xbb\x00\x64\xec\x33\xaa\x3a\xed\xdf\x06" + "\x82\xfc\x99\xd8\x4c\xf0\x7f\x2e\xbb\xbd\x39\x12\xf7\x39\x16\xae" + "\xa5\x6c\x9f\xe3\x81\x72\x94\x2d\xaa\x27\xdf\x12\x0d\x3a\xc4\xab" + "\x5a\xd2\xf1\x6a\xb4\xfa\x9d\xa3\xc4\x3f\xb0\x8e\x4c\x10\x04\x4a" + "\x8d\xe9\xcd\x20\xf7\x1d\x8e\x35\xbe\xd2\x4c\x50\xd6\x39\xa3\xfa" + "\xe6\x73\x5d\xea\x32\x3c\x7e\xa4\x4b\xcd\x3e\x01\xc7\x78\x66\x6b" + "\x19\x40\x9b\xe8\xda\xf1\x7a\xfb\x1f\x1e\xb0\xe0\xf7\xcd\x4d\x03" + "\x68\xe3\x36\xd0\x33\xb6\x75\x5a\xd5\xcb\x2f\x00\xdf\x64\xdd\x43" + "\xf1\x3b\x25\x8e\xc1\xf2\x44\x18\x7b\x90\x7b\xb9\x6c\xfa\xf5\x7e" + "\x9c\x5f\x20\x5f\x35\xee\x39\x53\xa7\xc6\xef\xb4\x38\xe7\xda\x34" + "\xb6\xcc\x15\xf0\x2e\xd0\x4f\xf3\xba\xb5\xb4\xde\xd2\xff\xf9\x10" + "\x5f\x1d\x51\xb7\x67\x57\x57\x82\x0c\x68\x45\x99\x25\x07\xae\xbd" + "\x0d\xd7\xf8\x37\xc3\xaf\x33\x69\xaf\xaa\x42\xc4\x39\xe0\x6b\xd5" + "\x39\x95\xe9\x0e\x8c\xf5\xb4\x92\xeb\x25\x4d\xd6\x35\xcf\xfb\xdb" + "\x3e\x0a\x36\xda\x50\xa6\x0c\x0e\xae\xe9\x58\x33\xde\x6a\x5b\xf3" + "\x3c\xe6\x7d\x51\xf1\xfa\x35\xcc\xa6\xd4\x51\x30\x9a\x40\xfd\xb6" + "\xd6\xa0\xc9\x9a\xd6\x82\xe8\xe2\x83\x29\x85\x44\xf7\x12\xe2\x9f" + "\x69\xdc\x0b\x85\xd4\xf6\x50\x24\xe0\x5f\xe1\x27\xe4\xd0\x04\xc0" + "\xbf\xe8\xae\xf8\xc7\x7d\x09\xec\x84\xe3\x60\x15\xb6\xd5\x88\xf3" + "\x08\xe5\xd4\xad\x30\x16\x38\x47\x70\x2e\x30\x3c\x04\x2c\x94\xe6" + "\x0b\xce\x25\xc4\x3b\x36\x77\x5d\xe6\x0e\xce\x97\x5b\x2c\x44\x83" + "\xf3\x05\xf1\x10\xe7\x0b\xfa\xe8\xbc\x2b\xce\x97\xc0\x7a\xa2\x79" + "\x1f\xb0\xd0\x64\xab\x60\x73\x06\xe5\xc9\x4a\x9b\x13\x0e\xe2\xf7" + "\x1d\xa7\xf9\x92\x2b\xcd\x17\x09\x07\x61\x4e\xd8\x70\xbe\x2c\x0a" + "\xb9\xaf\x73\x91\x3c\x5f\x5e\x3d\xa6\x21\x0c\x23\xb3\xff\x47\x53" + "\x04\xf3\xa5\x5a\x6f\x21\x76\x09\x07\x61\xbe\xe0\x1e\x22\x86\x83" + "\x6f\x02\x0e\xb6\x00\x0e\x5a\xe0\x3c\xcc\x93\x8d\xb3\x44\x1c\x14" + "\xe7\x47\xc7\x22\x11\x07\xcf\xea\x48\x67\x30\xe2\xe0\xfb\x1e\xe4" + "\x97\x63\x2e\x38\x58\xb3\xf3\xea\x70\xb0\xa6\x0c\xef\x43\x1a\x76" + "\x02\x3d\x91\x8e\x2f\x68\xa9\xad\xb2\x10\xf0\x2f\xea\x27\x46\xb7" + "\x44\xf7\x74\xdb\x26\xae\x5f\x6e\x71\xce\x0d\xdd\x80\xcf\x5b\x6c" + "\xed\x5d\x69\x47\xb3\x77\x44\x3b\x63\x1d\x62\x1c\xe2\x1d\xe2\x1c" + "\x62\x1e\xce\x0f\xc4\x3a\xc4\xb9\x07\x60\x0d\x80\x72\x53\x55\x42" + "\x03\xc3\xc0\x8c\xd3\x44\x93\x31\x8e\xdc\x6d\x2a\xb3\x83\x7e\x73" + "\x91\x20\x06\x3a\xaf\x6f\x88\x79\x48\xdb\x75\x97\x38\xe6\xe1\x3a" + "\x87\xf8\xd6\x65\x9d\x03\xda\x02\x4d\x36\xe3\x3a\xc7\x6c\x15\x59" + "\xb7\xfd\x6a\x53\x3f\xae\x97\x14\xf4\x23\xfe\xed\xd9\x5f\x17\x77" + "\xd5\x4d\xbe\xde\x21\xe9\x26\x38\xc7\x71\xae\x9b\x55\xd5\xcc\x5f" + "\xd1\x78\xe7\x68\xc4\x2c\xfe\x0d\xa4\xe0\xd9\x48\xae\x1f\xd5\x1d" + "\x60\xe5\xa0\xc8\x42\x59\xff\xff\x46\xc5\xbf\xe5\x83\xbe\xdf\x7f" + "\x54\x34\xcd\xb7\xe5\xe0\x18\xe3\x3b\x4f\x7d\x10\x78\x74\x4d\xb8" + "\x79\x15\x8e\xdb\x9a\xf0\x46\xf8\xbf\x49\xe6\xbb\x6f\x1e\xdf\x9f" + "\x42\xc8\xa4\x14\x6f\xf9\xee\x1b\xb6\xff\x9d\xfe\x23\xfa\x36\xfa" + "\x6a\xb4\xaf\xf0\x8f\x68\x3f\xe0\x11\xed\x3c\x7b\x26\xb9\x64\x78" + "\x33\x34\xc3\x46\x9b\x74\xa9\xe4\x21\xe8\x57\xfe\x01\x1b\x21\x07" + "\xda\x08\x31\x4d\x98\x0d\xf4\x9e\x55\xba\x5d\xb0\xf8\xc2\xfb\x45" + "\x83\xfe\xd8\x04\x58\xec\xeb\x8c\xc5\x1c\x77\xab\xd9\x37\x03\xab" + "\xe1\xcd\x30\x6c\x2b\xa2\x82\x04\xc2\x7a\xec\x7b\x46\x75\xf8\xf1" + "\xc5\x4b\x09\xee\x7f\xf5\x3b\xa3\xaa\xb5\x77\xf6\x1b\x5d\x0a\xf7" + "\xf7\xa1\xff\x88\x52\xe9\x9f\x25\x77\xd3\x57\xa3\x54\xe8\xbb\xf0" + "\xb1\x50\xac\x16\xe0\x1c\xf7\x85\x2a\x26\x78\x7d\x65\xa7\x2f\x93" + "\xd3\x04\xa8\x53\xdd\x56\x4c\x56\x26\xfb\x13\xac\xcf\xfd\xeb\x8a" + "\x09\xd6\xcf\x4d\xd4\x30\xdf\x07\x76\x9f\xad\x98\xe0\xbd\x76\x38" + "\xff\x3b\x21\x80\xe4\xa5\x06\x91\x03\x95\xd5\xac\x8d\x03\x95\x5f" + "\x12\x6c\x03\xe6\x02\xfc\xbf\x87\xac\x4a\xd6\x02\x26\x14\xc3\xf5" + "\x6f\xc9\xaa\x73\x03\xe1\x78\x06\x7e\x97\x48\xb3\xaa\xb6\xf8\x40" + "\xa5\x40\x02\x97\xfd\x8a\x02\x4f\x53\x13\xee\xa9\x4c\x27\xbd\xa0" + "\xef\x1f\x9b\xea\x0c\xa0\xd3\x7e\x63\xc0\x3d\xf7\x34\xe3\xd5\x16" + "\x81\xbe\x7a\x56\xc8\x78\xf5\x1c\x3e\xdb\x4e\x5f\xfd\x1e\x9f\x9d" + "\x9b\xaa\x13\xfd\x6d\x8b\x99\x6f\xe0\xca\x4b\x83\x09\xf6\x15\x9f" + "\x8b\xcf\x5b\x95\x18\x22\x3e\x73\x08\xeb\x1b\x3e\x13\xdb\x74\x7e" + "\x26\xe6\xb3\xd7\xbd\x8c\xcf\x3c\x3c\x08\x8e\x7d\x81\x1e\x05\x48" + "\x07\x7c\xbe\x40\xa3\xfd\x68\x46\xb4\x0f\xbb\xc7\xda\xe4\xee\x9e" + "\x17\xc5\x7b\x98\x2d\x12\xef\xe9\xa0\xac\x3e\x6b\x03\xd6\xca\x39" + "\x78\xfe\xe1\x68\x23\xe9\x4a\xc3\x6f\x6f\xe6\x6b\xe7\xe1\x23\x7c" + "\xed\xe4\x34\x65\xbc\xf2\x6a\xb4\x1f\xd0\x4d\x83\xeb\x2c\xb4\xf1" + "\xa9\xa3\x8d\x7f\x44\xfb\x20\xbd\x91\x6f\x24\x5e\x42\x3e\x92\x78" + "\x88\xf5\xd3\x42\x88\x33\xcf\xc0\xff\xfe\x62\x3b\x1d\x52\x3b\xd0" + "\x07\x22\xf1\xd1\xc3\x70\xbd\x2b\x1f\xfd\xfd\x2b\x99\x8f\xfe\x3e" + "\xdf\x9a\x4e\x29\xf2\x91\xf1\x95\x2c\x68\xe7\xdb\xa7\xe4\xfe\x44" + "\xa9\x90\xc7\xfe\xcd\x78\xab\x18\xe9\xf4\x70\x1a\x09\xe2\xef\xf3" + "\x77\x96\x0b\xef\xe1\x34\x63\x10\xf6\x55\x7a\x0f\xec\x43\x9e\xa0" + "\x23\xd2\x7b\xac\xea\x1c\x0c\xed\x9e\x23\xe2\x3d\xe3\xb0\x6d\x69" + "\x0c\x80\x66\x44\xba\x47\xaa\x9f\x27\x84\x40\xbf\x87\xb0\x7b\x38" + "\xcf\x9d\x71\xc3\x3f\x7f\xcf\x77\xe5\xb9\x5b\xd2\x08\x08\xc4\x20" + "\x6b\xbd\x72\x01\x9f\xb3\x95\xf7\x6d\xaf\xbd\xe3\x1f\xd1\x48\x57" + "\xb5\x78\x7e\xbf\x13\x4f\x88\xed\x5b\xdd\xb5\x7f\x5e\xd1\x7e\x34" + "\xb4\x9f\x02\xed\xa3\x2c\xf7\x0a\xda\xf0\xea\x58\xfe\x9c\x87\x53" + "\x78\xfb\x12\xdf\x52\xc3\x08\xbd\x3e\x15\xfd\x53\xeb\x76\x70\x3c" + "\xad\x66\xd8\xc9\xfc\xa2\xd4\x42\xb1\xe0\xe2\x17\xe5\xec\x37\xb7" + "\x3d\xdd\x22\xfa\x44\xd5\x31\xdf\x56\xb4\x95\xa1\x4c\xba\x15\xe4" + "\x39\xd9\x2f\xea\x28\x5e\xdf\x60\x4c\x6e\x70\xf2\x8b\xaa\x63\xf9" + "\xee\xcd\xaa\xba\x8a\x76\x35\x51\x43\x79\x05\x3f\x5f\x4d\x9c\xcf" + "\xcb\x7e\x87\xfc\x3c\xfa\x74\x8b\x76\xe3\x96\x7d\x65\x68\x37\xac" + "\x33\x4b\xb6\x5a\x0f\xba\xb0\x17\x32\xf3\xa9\x38\x59\x66\x3e\x15" + "\xe7\x59\x66\x3e\x92\xdb\xbd\xcc\x6c\xde\x22\xcb\xcc\x27\x6e\xe5" + "\xf3\xfe\xf8\x79\x3e\xef\x8f\xb3\xf9\x9d\x07\xed\xd9\x3e\x8c\x23" + "\xf4\x0f\xf7\x1b\x90\xcf\x37\x82\x0c\xbc\x3d\xb9\x42\xbd\x15\xf4" + "\x6e\xbb\xfa\x1e\xba\x1c\xc6\x0e\xe3\xc1\x2d\x4f\x85\xf5\xdb\x56" + "\x4b\xaa\x7d\x51\x66\x46\xff\xb2\xe3\x7d\xab\x5b\xac\x04\xd6\xb9" + "\x58\x3e\x2e\x47\xbe\x03\x5a\xf8\x98\xac\x56\xc2\xea\xc1\x35\x58" + "\xd7\x1a\x51\x66\xde\x23\x54\xa8\x37\xc2\x98\xc2\xcf\xb7\x2d\x68" + "\x46\x8d\xb3\x4c\xdd\x9e\x7d\x54\xeb\x5e\x96\x3e\x56\x69\xcb\x76" + "\x96\xa5\x8f\xc6\xa3\x2c\x8d\xf6\x7d\x94\x0f\x04\x2e\x43\x1b\x41" + "\x9e\xae\x41\xb9\x1a\x65\x69\x41\x21\x4b\xd7\x8f\xea\x5e\x96\x3e" + "\x9a\xff\x7f\xb2\xf4\xf5\x92\xa5\x25\x9b\x82\xab\x2c\x5d\xef\x77" + "\x75\xb2\x74\xbd\xef\xff\xc9\xd2\x3f\x35\x59\xfa\x1f\x16\x49\x96" + "\x16\xb2\x6e\x7b\x08\x6d\xfc\x1b\x1d\xb2\xf4\xb1\x96\xae\xb2\xf4" + "\x71\xd2\x55\x96\x3e\x3a\x44\x96\xa5\x8f\x54\x2a\x65\xe9\xc6\xfe" + "\x5d\x65\xe9\xe3\xe1\x9e\x64\x69\xc0\xb1\x16\x94\xa5\x91\xd7\x50" + "\xae\x46\x79\x1a\xfa\xde\xc4\xf9\xee\xf8\xd2\xab\x93\xa5\x8f\xa7" + "\x5d\x99\x2c\x7d\xfc\x98\x7b\x59\xfa\xc8\x4a\xcf\xb2\xf4\x91\x95" + "\xee\x65\x69\xf3\x52\x59\x06\x32\x3f\xff\xd3\x97\xa5\x4f\xb4\xb8" + "\x97\x77\x4e\x5c\xe4\xb2\xf4\xf1\xfa\x6b\x2f\x4b\x1f\xaf\x77\x2f" + "\x4b\x9b\x67\x72\xb9\xe3\xb8\xb9\xab\x2c\x0d\xf7\xb8\x95\xa5\xcd" + "\x1b\xc4\x7b\xea\x95\xb2\x34\x6f\x03\xd6\xd0\x9d\x9e\x65\xe9\x93" + "\x93\xf8\x9a\x7a\x32\x98\xaf\xa9\x9c\xa6\x5d\x65\x69\xb3\xbd\x67" + "\x59\x9a\xf3\x10\xeb\xa7\x47\x59\xfa\xe4\xb8\xae\xb2\xf4\x91\x95" + "\xee\x65\xe9\x53\x83\x64\x3e\x6a\xd8\xad\x94\xa5\x4f\xe6\xfe\x7b" + "\xc8\xd2\x1e\x79\xab\x45\x29\x4b\x37\xbc\xe6\xbd\x2c\xdd\x90\xef" + "\x9d\x2c\x8d\x3c\xe7\x4e\x96\x6e\x38\xe6\xca\x73\x4a\x59\xba\xa1" + "\xc3\xbd\x2c\x7d\xaa\xaf\x52\x96\xc6\xf6\xdd\xc9\xd2\xa7\x9e\x54" + "\xb4\xdf\x45\x96\x3e\x35\x59\x29\x4b\xf3\x7a\xb2\x2c\xdd\x28\x7e" + "\xbb\x3d\x32\xcc\x7b\x59\xfa\xd4\xc9\xee\x65\xe9\x53\xdf\x29\x65" + "\xe9\x53\xbb\xb8\xcc\xdc\x18\xc4\x65\xe9\x53\x35\xfc\xfc\x91\xa1" + "\xce\xe7\x65\x59\x9a\x9f\xef\x2a\x4b\x37\x0e\xe9\x41\x96\x0e\xbb" + "\x72\x59\xfa\xfb\xd9\x15\x0e\x59\xfa\xfb\xd9\x92\x2c\x8d\xf9\x8c" + "\x8a\x40\x3e\x2d\x62\xf2\xf4\x41\x72\xa0\x91\xad\x39\xc7\xba\x97" + "\xa7\x5b\x8a\x64\x79\xba\xf9\x2c\x9f\xfb\xcd\x5f\xf1\xb9\xdf\x9c" + "\xef\xb0\x41\x83\x2c\x8d\x32\xb5\x68\x83\xae\x5d\x09\xbf\xed\xa9" + "\x15\x4c\x9e\x46\x5f\x7d\x94\xa9\x51\x9e\x46\xb9\x1a\x65\xe5\xaa" + "\x15\x84\x54\x5b\xac\xe8\xbf\x52\x63\xbc\x1b\xc7\xb5\x79\x29\xc8" + "\xe1\x68\x17\xaa\x81\x7b\xcd\xdb\x2f\x58\x71\xdf\x47\x7d\x5e\x03" + "\xdc\x63\xe6\xf7\xc0\xf5\x3a\xbc\x07\xea\xd4\x73\x5a\x7c\x77\x84" + "\xaf\x9f\x92\x3c\x7e\x7a\xb1\x42\x1e\xe7\x75\x6b\x25\x79\x7c\x03" + "\xf4\x01\x7e\xbe\x28\x8b\xa3\x4c\x0e\xb2\x78\xe5\x86\xb5\xb4\x62" + "\xe3\x00\x5a\xde\x9e\x7d\x7a\x8b\x24\x93\xe7\xc2\xb9\x3c\x38\x07" + "\xfd\xa8\x29\x2f\x26\x64\xf7\x05\x23\xca\x14\xe6\x0d\x67\x88\x2f" + "\xd0\xac\x6e\x39\x3c\x1f\xef\x87\x7b\xcc\xd2\x3d\xb0\xbe\x57\x72" + "\x19\xfe\xbb\x42\x41\x61\x0f\x3f\xf3\x88\x43\x86\x87\x71\x42\x7b" + "\x3b\xe6\x09\x63\x72\x7c\x70\x70\x8d\x4d\x92\xe3\xfb\xff\x3f\xf6" + "\xbe\x3f\x2e\x8a\xe3\xfc\x7f\xd8\x03\x45\x45\x39\x0c\x18\x4c\x8d" + "\x9e\x09\x18\x4c\x50\xd1\x0a\x9c\xa9\x49\xb1\x51\xa3\xad\x08\x26" + "\xda\xa2\xc1\x88\x0a\x06\x8c\x3f\x50\xd1\x9c\x06\xf9\x61\x35\x55" + "\x83\x08\x06\xac\x3f\x40\x4c\xaa\xa9\x26\x6a\x48\xaa\xdf\x6a\x3e" + "\x9a\x60\xab\x0d\x1a\x7e\x99\x6a\x8b\xa9\x36\x17\x8b\x06\x0d\xea" + "\xa9\x28\x07\xdc\xdd\x7e\x9f\xd9\xd9\x73\x77\xef\x76\x8f\xdb\x3d" + "\xa0\x68\xfd\xe3\x5e\xe8\xee\xec\xec\xce\xf3\xbc\xe7\x99\xf7\x7b" + "\x76\xe6\x59\x3e\x8f\xaf\x75\xb3\xf2\x78\xbc\xdf\xea\x3e\x8f\x4f" + "\xb1\xf2\xf8\x2b\x53\x15\xf2\xf8\xb3\x1d\x85\xc7\x7b\xb9\xb9\xb9" + "\x7b\xc5\x11\x1e\x5f\xb0\xac\x75\x78\x3c\xe6\xf0\x98\xb7\x63\x0e" + "\x8f\x39\x3d\xe6\xf1\x98\xd3\x5b\x58\x1e\xbf\xc3\x86\xc7\x5b\x80" + "\xb3\xdb\xf2\x78\xcc\xed\xad\x3c\xde\x22\xe0\xf1\x3f\x94\x2b\xe3" + "\xf1\x3f\x94\xb5\x02\x8f\x6f\x1f\xbf\x75\x20\x1e\x1f\x64\xc3\xe3" + "\x31\x6f\x87\x3e\x59\x83\xf9\x7c\x65\x09\xd8\x66\x11\x70\x7a\xe0" + "\xf3\xca\xb9\xfc\x0f\x87\xf9\x5c\x7e\x47\x4f\x3e\x97\xbf\x7a\xd8" + "\x9e\xcb\x5f\x2d\xe3\x71\xf9\x32\xbd\xdb\x65\xe6\x9b\x95\xd0\xa7" + "\xab\x4b\x66\x61\x9e\x7e\x39\x56\xc8\xe5\x0d\x4f\xda\x73\xf9\x6b" + "\xbd\x45\xb9\x3c\xd1\xf7\x42\x2e\xef\x17\x59\x63\xba\xcf\xe5\xaf" + "\x8d\x57\xc6\xe5\xaf\x8d\xe3\xb4\xc6\xe5\x20\x32\x1e\x5d\xad\x95" + "\xe2\xf7\x0d\x6a\x3e\xbf\xbf\x76\x8c\xe3\xf7\x29\x3c\x7e\x5f\x73" + "\x41\x9a\xdf\xd7\x90\xdc\x96\xea\x37\x23\x70\x5d\x98\x97\x41\x6c" + "\xad\xd1\x2c\xc6\xdc\xac\x6e\x3e\xe6\x66\x10\xcf\x6a\xf0\x9a\x71" + "\xf8\xff\x08\x2b\xcf\x67\x74\x2a\xe6\xfa\x2b\x3a\x22\x1f\xfb\xb1" + "\x5a\x9c\x8f\xfd\x78\x19\xf3\x1e\xb2\x1f\xf7\xda\x51\xb0\x49\x4d" + "\xeb\xf2\xfd\x6b\x47\xc5\xf9\x7e\xdd\x54\xc2\x8d\xae\x95\x60\xbf" + "\x08\xf9\x3e\x5c\x23\xca\xf7\xeb\x36\xb0\xd7\x1c\x15\xf2\x7d\x52" + "\x07\x8c\xf1\x7b\xa5\xf9\xfe\xf5\x31\x64\xcc\xbf\xee\x47\xc6\x7c" + "\xe2\x63\x7b\xbe\x5f\x77\x9d\xcf\xf7\xb1\xff\xed\xf9\x3e\xc1\x14" + "\xf3\x9c\x92\x7c\xff\x7a\xa8\x3d\xdf\xaf\xb9\x80\xf9\xbe\x89\x87" + "\xab\x02\x8c\xab\x59\x18\x57\x37\x03\x31\xae\xf0\xb8\xaa\x99\x83" + "\x71\x75\xe3\xa4\xd1\x62\xe5\xfd\xeb\x71\x7d\x6b\x6c\x79\x3f\x8e" + "\x23\x8e\x70\x96\xbc\x18\xf5\xc5\x58\xc3\x38\xb3\xfa\x0d\x97\xc7" + "\x78\x6b\x5b\xac\xdd\x18\x2d\x8e\xb5\x1b\x93\x18\x3f\xb3\x58\xc3" + "\xf3\x95\x44\x07\xe0\xf6\xdd\x48\x90\xa7\x03\x98\x6b\xb6\xca\xd3" + "\x01\x18\x8b\x62\x3a\xe0\xc6\x65\x5b\x2c\x0a\x75\xc0\x4d\x37\x71" + "\x1d\x70\xb3\xb7\x50\x07\xe0\xfa\xc5\x74\xc0\xcd\x31\x82\xfa\xed" + "\x74\xc0\xcd\x99\x42\x1d\x40\xca\x71\x3a\xc0\xe0\xc9\xce\xab\x64" + "\xca\xd7\x01\x37\xaf\xb2\xf1\x9d\xe8\x80\x4b\xb6\x3a\xe0\xe6\x2d" + "\xa1\x0e\xb8\x79\x82\xc4\x57\x43\x1f\x23\xa3\x03\x6e\x56\x93\xe3" + "\x35\x19\xfc\xe3\x9c\x0e\x20\xc7\x8d\x7c\x1d\x50\x82\x75\x80\x61" + "\x78\x0b\x3a\x20\xda\x79\x1d\xd0\x5c\xc3\xe9\x80\xe6\x1a\xc7\x3a" + "\xc0\x70\xd9\xb1\x0e\x68\xd4\x70\x3a\xa0\x61\x11\x89\x09\x0d\x53" + "\x48\x4c\x68\x60\xe6\xad\xa0\x5f\x71\xf3\xea\x8b\x98\xf5\xe7\xa5" + "\x07\x6e\x97\x52\x9f\x2c\x66\xe7\xd5\xef\x81\x06\x58\x06\x7c\xbe" + "\x9e\xf0\x79\x88\x99\x27\xb0\x0e\xc0\x7c\x9d\x68\x80\x06\x37\x38" + "\xa6\x07\x9b\x9f\x80\xba\xf4\xfb\x56\x94\x50\x78\x6d\x18\x2e\x0b" + "\xfd\xbd\x3a\x0b\xc6\x11\x38\x5e\x0d\x65\x4a\xf0\x35\x70\xec\x6c" + "\xc9\x62\x7c\xdd\xbd\xeb\x58\x2b\xc0\x75\x25\x70\xfe\x82\xcd\x75" + "\x55\xf8\xba\x0a\x1d\xa3\x05\xaa\x88\xef\xee\x45\xc2\xf1\x32\x4e" + "\x37\xdc\xfa\x94\xd1\x0d\xf5\xac\x6e\x80\xb2\x50\x57\x29\xa3\x1b" + "\x66\x81\x6e\x80\xe7\x86\x1f\x5f\x37\x1c\x05\xdd\x70\x18\x74\xce" + "\xc1\x86\x77\x6e\xd5\xf0\x74\xc3\x61\xac\x13\xb0\x66\xc0\x5a\x01" + "\xc6\xb5\x83\x58\x47\x1c\x6b\xd2\x53\xe0\xe3\xb3\xa0\x1b\xaa\xf1" + "\xf5\xdc\xb5\xb7\x35\xfc\x6b\x71\x79\x78\xc6\x12\x46\x73\x00\xcf" + "\x83\x67\xb8\x50\x78\x89\xd1\x1c\x65\x70\x6d\x15\xd1\x1c\xb7\x27" + "\xf3\x34\xc7\x51\xa2\x39\xee\x79\x09\xdf\x1b\xdc\x7e\x5f\xbe\xe6" + "\xa8\x5f\xea\xf8\xdd\xc1\xed\x72\x39\x9a\x03\xda\x5d\x6a\xe5\xaf" + "\x76\xeb\x10\xf1\x1a\x7c\xe0\xb0\x98\xaf\x3a\x5c\xb7\xc6\x72\x59" + "\xcc\x5d\x31\x6f\xc5\xfc\xd5\x29\xcd\x01\xcf\x5f\x66\x6c\xc5\x77" + "\x07\x9d\x40\x73\x2c\x93\xd6\x1c\x7c\xbd\x81\xf5\x07\xd6\x1c\xd0" + "\xc7\x18\xcd\x51\xb0\xca\x46\x73\x74\x6a\x41\x73\xb8\xf1\x35\x47" + "\xfd\x28\x65\x9a\xa3\x3e\xa2\x15\x34\x47\xe9\x23\xcd\xd1\xda\x9a" + "\xa3\x3e\xf8\xbe\xe6\xa0\xd8\xf7\x07\x3d\xad\x9a\xe3\x5e\xb0\xbd" + "\xe6\xb8\x17\xc1\xd3\x1c\x47\xf5\x6e\xb7\x99\xf7\xa2\x44\x6f\xdc" + "\xca\x13\xea\x0d\x53\xbe\xbd\xde\xb8\xb7\x4e\x99\xde\xb8\x77\x44" + "\x99\xde\xb8\x77\x98\x3c\x1f\x7e\x57\x7a\x2b\x9e\x8c\x7b\xf7\x62" + "\x38\x0d\x72\x2b\x98\x7f\xac\x65\x0d\xd2\x30\x4a\x5c\x83\x18\x6a" + "\xa4\x35\x88\xa1\x46\x5a\x83\x18\x6f\x61\xae\x88\xf5\x06\xd4\x0f" + "\x5c\xd1\x78\x8c\xff\xae\x21\xab\x05\x5e\x68\xab\x3f\x92\x67\x11" + "\xbd\xd2\xf6\xbc\xd0\x18\x2b\xce\x0b\x8d\x49\x98\x73\x99\x18\x5e" + "\xd8\x10\x51\xd0\xea\x1a\xa4\x21\x42\x5c\x83\x18\xd9\xf9\xdf\x86" + "\xd1\xf6\x1a\x04\xae\x11\xd5\x20\x8d\x3e\xec\x35\x11\x42\x0d\x42" + "\xea\x00\x7e\x31\x48\x5a\x83\x34\x9e\x22\x7c\xa3\x71\x2b\xe1\x1b" + "\xc4\xc7\xf6\x1a\xa4\x71\x51\xcb\x1a\x84\x60\x8a\x79\x4e\x49\x0d" + "\xd2\x78\xff\xfd\x07\xa7\x41\x0c\x35\x58\x83\x88\xe3\xaa\xb9\x50" + "\x88\xab\xe6\x17\x84\x1a\xa4\xa9\x8b\xad\x06\x79\x00\xb1\x16\xcb" + "\xbd\x7f\x60\xda\x74\x51\xbe\xee\x68\xf6\x91\xa7\x3b\x30\xfe\xc4" + "\x74\x47\xf3\x74\x5b\xfc\x09\x75\x47\xf3\x72\x71\xdd\xd1\x9c\x2b" + "\xd4\x1d\xb8\x7e\x31\xdd\xd1\x7c\x4c\x50\xbf\x9d\xee\x68\x3e\x2f" + "\xd4\x1d\xa4\x1c\xa7\x3b\x4c\x19\xec\x1c\xd0\x3a\xf9\xba\xc3\x34" + "\xd3\xb1\xee\x30\x25\x09\x75\x87\x69\x24\x89\xa9\xa6\x3c\xa2\x3b" + "\x4c\xd1\xe4\xb8\x61\x2d\xff\x38\xa7\x3b\xc8\x71\x7b\xdd\x61\xda" + "\xd7\x82\xee\xf0\x32\xed\x0a\x2c\x69\x0a\x08\xac\x6a\xca\x8b\x31" + "\x3c\x57\xd3\xcf\x7c\xff\xfb\x0b\x71\xc0\x21\x2e\x00\xa7\x98\x89" + "\x28\x9c\xc3\x20\xed\x0c\x70\x85\x99\x64\x1f\x03\xe6\x0b\x07\x96" + "\x61\xde\x57\xe2\x01\x36\x45\xcd\xbe\xa1\x3b\x4d\xc1\x5a\x3d\xe6" + "\x0d\x8d\xbb\x02\x77\x1a\xf3\xc6\x19\x1b\xf1\x1e\x86\x79\x88\x9a" + "\x51\x27\xce\x05\xdf\xbe\x40\x5b\x00\xf3\x9e\x51\xb1\x84\x07\x96" + "\x27\x5e\x66\x70\x8c\xb9\xc4\x36\xe0\x12\x95\xf5\xd5\x0c\xb7\xf0" + "\x8a\xd3\xa0\x82\x34\xe4\xdb\xbd\x0e\xa9\xbb\xbb\xb9\x75\xfa\xd5" + "\x54\x84\xcc\xc0\x2b\xc6\x0c\xa4\x2d\xcf\xd6\x68\x70\xce\xa2\x1e" + "\x84\x5b\x1c\xf6\x30\xb1\xdc\xe2\xdd\x7b\x28\xb8\x10\xcf\x3f\x97" + "\x13\x4e\x81\xbf\xd5\xd0\x48\x38\x45\xdf\xa6\x86\xa0\xa7\xee\xef" + "\x61\xb8\xbf\x37\x85\xdb\xc3\xd0\x9c\xcb\xf1\x09\xcc\x25\xe8\x19" + "\xc0\x05\x8d\x64\xfd\xc8\x8a\x49\x64\x0f\x43\x70\x0d\xa2\x8a\x5e" + "\x47\x9e\x65\x71\x97\xf0\x5c\x91\x7f\x59\xcd\x6e\xb4\x7c\x3c\xea" + "\x6b\xc2\xfc\x01\xb8\x61\x59\x4d\x3e\xc2\xf9\x18\x0b\x80\x47\x6c" + "\x61\x39\xc4\x84\x99\x12\x1c\x02\xc6\x6a\xcc\x23\xc8\x18\x6d\x99" + "\x7e\x32\xe8\x24\x92\xcf\x0d\x2d\x92\xdf\x3f\x65\xd6\x08\xef\x02" + "\x7d\x10\x10\xb8\xd3\xec\x1b\x63\x20\xf9\x39\x27\x6a\x2c\x1f\x24" + "\xa8\x71\xde\xc5\x8f\x2f\xd5\xba\xe1\x5c\xe3\xf8\xbb\x9b\x96\x7d" + "\x5a\xbd\x60\xdf\x49\x33\xeb\xb3\x66\xe2\x33\xcc\x09\xa7\xd7\x21" + "\x7a\x86\x89\x42\x70\xae\x07\xb3\xef\xc4\xa8\x47\xdc\xf7\x37\xfd" + "\xd1\x0e\x0b\xc9\x71\x69\x79\x3b\xb1\x8b\x05\xfc\x42\xaf\xa2\xd0" + "\xfe\x7b\x46\x86\xf7\x65\xe1\x6f\x72\x66\xba\x75\xc7\xbc\x0f\xb0" + "\xdf\xb5\xa8\x09\x7c\xf4\x3d\xf1\x11\xbd\xca\x93\xf9\x6b\x7a\x3b" + "\x48\x03\x75\x3f\xd5\xdc\x0c\xbc\x8f\xfd\x7e\xa7\x35\xdf\x2f\xb3" + "\x87\xa8\x09\xef\x21\xaa\x46\xa6\x5c\x92\x43\x11\x70\xe1\x86\x73" + "\x8f\xc0\x33\xf4\x61\xf6\x0e\x35\x07\x61\x1c\xa9\x77\x5c\xc1\xfb" + "\x9d\xbe\x65\xfc\x63\x66\xfd\x82\xbf\xe3\x69\xe5\x73\x15\x7b\xce" + "\x91\xfd\xa3\x36\xbe\x68\xde\x4d\x78\x3b\xb3\x9f\xe7\x1d\x53\x09" + "\x5e\xf7\x73\xc3\x8d\xbe\x7b\x32\x05\xb8\x53\x8a\x5c\xbf\xd0\xf5" + "\x1d\xc3\x2f\xea\x87\xcc\x2f\x96\x5d\x8c\x5f\x28\xb7\x0d\x8a\xfc" + "\x42\xb9\x39\xde\xff\xdf\x6e\x7e\xf1\x7c\xb8\xfc\xb2\x1e\x62\x1d" + "\xe3\x17\x55\xa0\x32\xbf\xa8\x02\x1c\xf9\x05\xcf\x91\x59\xe7\xc7" + "\xac\x73\x63\x78\x3c\x65\x74\x11\xd5\xd5\x78\x7f\xad\x29\xfc\x9b" + "\xbf\xd6\xf4\xeb\x13\x38\x6f\xc0\x7a\x74\x7a\x34\x8c\x6b\x94\xaa" + "\xd1\xe1\x9c\x18\xe5\x19\x71\x7f\x4e\x8c\xea\xf4\x3e\xc3\x51\xa9" + "\x4e\x6b\x18\x8e\x4a\x75\x62\xd6\xad\xac\xbc\x88\x28\xd3\x80\x67" + "\x0c\x07\x16\x94\x50\x78\x9f\xd6\x81\x1b\x46\x2a\xeb\x36\x70\x4e" + "\xaa\x1f\x8d\xe7\xa8\x36\x2c\x06\x6d\x03\x3c\x20\x79\x0e\xea\x77" + "\x8d\xf2\x38\x86\x73\xc0\x7d\x71\xa3\x84\xca\xc1\x65\x9e\x4a\x50" + "\xef\x7b\xc2\xe0\x86\xc7\xd1\x03\x0b\x8c\x94\x15\x4b\xd6\xfd\x9b" + "\x60\xcf\xaa\x3b\xbb\x03\x4b\xf0\x5a\xd0\x26\xbf\x71\x46\xb3\x5f" + "\x8c\xc1\xb4\x5f\xab\x17\xc3\x17\xb3\x2f\x14\xc6\x50\xbc\x8f\xf3" + "\xf5\x64\x0e\x67\x96\xb7\x09\xbe\x2a\x80\xb3\xe3\xef\x1c\x79\xc3" + "\xd8\x49\x37\x27\x76\x79\x6d\x2f\xf8\x9e\xc5\x18\x8c\xdf\xd2\x18" + "\xdb\x2a\xc4\xd8\x1d\x16\x63\x80\xb5\xfb\x18\xe3\xed\xeb\x54\x13" + "\x8c\xe9\xef\x63\x8c\x19\x3b\xdf\x0e\xea\x83\x71\x66\xc5\x18\x1e" + "\x37\x09\xc6\x2e\x49\x62\xec\xeb\x0b\xe2\x18\x33\x05\xf2\x31\xe6" + "\x76\x96\x60\xcc\x63\xdd\x49\x18\xf5\xa6\xc4\xca\xc5\x98\xc7\x5a" + "\x81\xc6\xa6\xba\xed\xb6\xd3\xd8\x94\xc7\x75\x5b\x8d\x6d\xd5\xd4" + "\x77\xfc\x22\xf5\x77\xf2\x23\x6b\xea\xfd\x58\x5d\x4d\x75\xf2\x51" + "\xa4\xab\xa9\x4e\x6a\xa7\xd6\xe4\x51\x9d\x16\x9d\x4e\x45\xe8\x34" + "\xf4\xa7\xca\x68\xb2\x26\xef\x63\xac\x97\x29\x95\x09\xe3\x50\x54" + "\x2f\xb3\xe7\xec\xd6\x52\x51\x9e\x3e\xf7\xd7\x52\x51\x9d\x2f\x36" + "\x6e\x12\x5f\x93\xf7\x51\xda\x16\x9e\x76\xd9\x22\xa2\x5d\xb6\xd8" + "\xbc\xa7\xdb\x22\xa2\x5b\xb6\x20\x7c\x2d\x5f\xb7\x9c\x8e\x26\xba" + "\xe5\x74\x34\xd6\x2d\x5b\x18\xbe\x77\x3a\xda\xaa\x5b\xb6\xc0\x79" + "\xa2\x5b\x4e\x47\x5f\x81\x1f\xe8\x16\xaa\x73\xc6\xe9\x68\x11\xdd" + "\x42\x75\x5e\xc7\xac\xc9\xa3\x3a\x25\x4b\xaf\xc9\xdb\xc2\xd3\xc7" + "\x5b\x78\xfa\x78\x0b\xab\x8f\xb7\x30\xfa\x98\xdc\x33\x98\x79\x36" + "\x7c\x4f\x5c\x27\xff\x9e\xf7\xf5\x03\xd5\xd9\xcc\xe8\x07\xaa\x53" + "\x0a\xf6\x83\x40\x1f\xe3\x6b\x74\x22\xfa\x98\xf2\x1c\xca\x5e\x93" + "\x6c\xd5\xc7\x4d\xa4\x3c\x53\x07\xc4\x9a\x48\x49\x7d\x4c\x79\x5e" + "\x25\xb1\xc7\xf3\x08\x89\x3d\xc4\xa7\x76\xfa\x98\xf2\xe4\xeb\x1f" + "\xf1\x35\x79\x2c\x86\x98\xe7\x4c\x96\xd0\xc7\x94\xe7\x79\x3b\x7d" + "\x4c\xa9\x8c\xa2\x6b\xf2\xa8\xae\x9f\x72\x38\xea\x3a\x49\xb0\x26" + "\x8f\xea\xd2\x9f\xaf\x8b\x31\xc6\x1e\x30\x6c\x65\x08\xd6\xe4\x51" + "\x5d\x6e\x89\x6b\xe2\x2d\x3c\x4d\xbc\x85\xd1\xc4\xa7\xa3\xd9\x35" + "\x79\x54\xd7\x40\x5c\xb7\xbd\x26\xde\x72\xbf\xbc\x55\x13\xe3\x6b" + "\x08\xe6\x44\x34\x31\xd5\x75\x91\x2d\xe6\x04\x9a\x98\xea\xba\xc1" + "\xaa\x89\x9b\x5e\xe3\x69\x62\xaa\xeb\x6e\x81\x26\x66\xea\x17\xd1" + "\xc4\x54\xd7\x33\x82\xfa\x6d\x35\x31\xd5\xf5\xba\x55\x13\xe3\xfa" + "\xad\xb8\xbd\xaf\x89\xa9\x6e\x24\x07\x2f\xa5\x7a\x5f\xb6\x26\xa6" + "\xba\x31\xf3\x3a\xfb\xb7\x91\x77\x5d\x02\x3d\x4c\x75\x5b\x2e\xd0" + "\xc3\x54\xb7\x09\x8c\xee\xa5\xba\xed\x62\xd6\xe3\x51\xdd\xe2\xc8" + "\x71\xd5\x4e\xfe\xf1\xfb\x7a\x98\x3d\x8e\xd7\xe3\x31\xeb\xf0\xd6" + "\x77\x3b\x28\x4f\x07\x3f\xde\x01\x75\xb0\xbf\x03\x1d\xec\xff\x70" + "\xe9\x60\xaa\x7b\x82\x22\x1d\x4c\x75\x8f\xef\x18\xbc\xfe\x21\xd3" + "\x5b\xeb\xbb\x95\x12\xce\xd5\xc3\xac\x8c\xd7\xf7\x30\x75\x0c\xbf" + "\x3c\x6c\x7a\xab\xfb\x3e\xe2\x17\x75\xbe\x32\xbf\xa8\x25\xf3\x1f" + "\xb6\xac\xb7\xfc\x13\x39\xbd\xe5\x9f\x28\xad\xb7\x7c\x92\x1c\xeb" + "\x2d\xbf\x62\x4e\x6f\xf9\xfa\x10\xce\xf3\xd8\x5d\xc2\x79\x1e\x3b" + "\x24\x5f\x6f\x3d\x36\xe8\x91\xde\x6a\x4d\xbd\xe5\x3d\x9a\x60\xac" + "\x67\xa3\x32\xbd\xd5\xd3\x28\xd4\x5b\xbd\xed\xf7\x43\x51\x8f\x4d" + "\x77\x5e\x6f\x3d\x96\xa9\x4c\x6f\x3d\x96\xe1\x9c\xde\x7a\xec\x7b" + "\x71\xbd\xe5\x33\x4f\x5a\x6f\x91\x73\xf6\x3c\xd9\x2f\x93\xe3\xc9" + "\x7e\x91\x1d\x5f\x6f\xf9\x1a\xc4\x39\xb1\x6f\x23\xd1\x5b\x8f\xe9" + "\x5b\x5f\x6f\x3d\xa6\x17\xd7\x5b\x7e\xf3\x09\x37\x7d\xac\xc6\x5e" + "\x6f\xc1\x35\xa2\x7a\xcb\xef\x7d\xf6\x1a\xbd\x50\x6f\x91\x3a\x20" + "\xd6\x1c\x93\xd6\x5b\xbd\xa6\x92\xd8\xd3\x6b\x20\x89\x3d\xc4\xa7" + "\xf6\x7a\xab\x97\x5b\xcb\x7a\x8b\x60\x88\x79\x4e\x49\xbd\xd5\x6b" + "\xbc\xbd\xde\xf2\x49\x14\xd7\x5b\xfe\xfd\x39\x1c\x3d\x7e\x5c\xa8" + "\xb7\x7a\xe5\x3e\x18\x7a\x4b\x12\x5b\x06\xa1\xde\x7a\x7c\xa6\x7c" + "\xbd\xf5\x78\xbe\x3c\xbd\x85\x31\x27\xa6\xb7\x1e\xff\xde\x16\x73" + "\x42\xbd\xf5\xb8\x59\x5c\x6f\xf9\xfb\x09\xf5\x16\xae\x5f\x4c\x6f" + "\xf9\x8f\x12\xd4\x6f\xa7\xb7\xfc\xa7\x0b\xf5\x16\x29\xc7\xe9\xad" + "\xde\x64\x0f\x14\xe5\xe3\x23\x5f\x6f\xf9\x7f\x2f\xad\xb7\xfc\x85" + "\xfb\x9f\x28\x7f\xb2\xff\x89\xea\x4d\xf6\x3f\x51\xfe\x64\xff\x13" + "\xe5\xa3\xe6\x1f\xe7\xf4\x16\x39\xce\xe9\xad\xde\x01\xf2\xf4\x96" + "\x77\x07\xd4\x5b\x6a\x07\x7a\x4b\xfd\x90\xe9\xad\x27\xce\x29\xd3" + "\x5b\x4f\x9c\x7d\xc4\xeb\xdb\x82\xd7\xf7\xd6\x12\xce\xd5\x67\xbe" + "\x32\x5e\xdf\x67\x9e\x72\x5e\x1f\x10\xc1\xf1\xfa\x80\x08\x69\x5e" + "\xff\xe4\x28\xc7\xbc\xbe\xff\x5a\x8e\xd7\xf7\x63\xe7\x32\xfb\x95" + "\x93\xb1\xb5\xdf\x06\xf9\xbc\xbe\x9f\xc7\x23\x5e\xdf\x9a\xbc\xfe" + "\x27\x7d\x08\xc6\xfa\x9e\x51\xc6\xeb\xfb\x56\x09\x79\x7d\xc0\x75" + "\x7b\x5e\xdf\x2f\xd4\x79\x5e\xdf\x6f\xaa\x32\x5e\xdf\x4f\x72\xdd" + "\xa1\x90\xd7\xf7\x3b\x22\xce\xeb\x9f\x1c\x2d\xcd\xeb\xc9\x39\x7b" + "\x3e\xd6\x7f\x2a\xc7\xc7\xfa\x07\x76\x7c\x5e\xaf\x29\x15\xe7\x5e" + "\x9a\x33\x84\xd7\xf7\x3b\xdc\xfa\xbc\xbe\xdf\x61\x71\x5e\xdf\x9f" + "\xec\xff\xa0\xfa\x1d\xb5\xe7\xf5\x70\x8d\x28\xaf\xef\xbf\x9c\xbd" + "\xe6\xb0\x90\xd7\x93\x3a\x20\xd6\xe4\x4b\xf3\xfa\xa7\x86\x92\xd8" + "\xf3\x94\x1b\x89\x3d\xc4\xa7\xf6\xbc\xbe\xff\xf9\x96\x79\x3d\xc1" + "\x10\xf3\x9c\x92\xbc\xfe\xa9\xfe\xf6\xbc\xfe\xc9\x08\x71\x5e\xff" + "\x74\x23\x87\xa3\xa7\xb7\x0a\x79\xfd\x53\x49\x0f\x06\xaf\x97\xc4" + "\x56\xa9\x90\xd7\x3f\x3d\x42\x3e\xaf\x7f\x7a\xbe\x3c\x5e\x8f\x31" + "\x27\xc6\xeb\x9f\x3e\x62\x8b\x39\x21\xaf\x7f\xfa\x9c\x38\xaf\x7f" + "\xfa\xba\x90\xd7\xe3\xfa\xc5\x78\x7d\x40\x6f\x41\xfd\x76\xbc\x3e" + "\x20\x54\xc8\xeb\x49\x39\x8e\xd7\x07\x54\x93\x18\xda\xe7\xaa\x7c" + "\x5e\x1f\x70\x44\x9a\xd7\x07\x1c\x17\xf2\xfa\x80\x3c\xc2\xdf\x03" + "\xea\x08\xaf\x0f\xd8\x43\x8e\xf7\xa9\xe5\x1f\xe7\x78\x3d\x39\xce" + "\xf1\xfa\x00\x93\x3c\x5e\xdf\xb9\x03\xf2\x7a\x4f\x07\xbc\xde\xf3" + "\x21\xe3\xf5\x03\xf6\x2b\xe3\xf5\x03\xf6\x29\xe7\x8f\x83\x33\x38" + "\xfe\x38\x38\x43\x9a\x3f\x3e\x93\xe9\x98\x3f\x3e\x57\xca\xf1\xc7" + "\x67\x07\x92\x18\xfe\x6c\x77\x12\xc3\x07\x96\xcb\xe7\x8f\x03\xc7" + "\x3c\xe2\x8f\xad\xc9\x1f\x03\xd5\x84\x3f\x0e\xf4\x51\xc6\x1f\x07" + "\xaa\x85\xfc\x71\xc8\x20\x7b\xfe\x38\x70\xa9\xf3\xfc\x71\xe0\x56" + "\x65\xfc\x71\xe0\x16\xe7\xf8\xe3\xc0\x46\x71\xfe\xf8\xcc\x6a\x69" + "\xfe\x48\xce\xd9\x8f\xfb\xcf\x6d\xe5\xc6\xfd\xe7\x12\x3a\x3e\x7f" + "\x7c\xce\x53\x7c\x8c\x7f\xce\x87\xf0\xc7\x81\xc6\xd6\xe7\x8f\x03" + "\x8d\xe2\xfc\xf1\xb9\x35\x64\xac\x1d\x68\xb2\xe7\x8f\x70\x8d\x28" + "\x7f\x7c\x8e\x1d\xff\x07\x1a\x85\xfc\x91\xd4\x01\xb1\xe6\x9c\x34" + "\x7f\x0c\x26\xfb\x62\xa9\xe0\x51\x24\xf6\x10\x9f\xda\xf3\xc7\xe0" + "\xde\x2d\xf3\x47\x82\x21\xe6\x39\x25\xf9\x63\xf0\x4c\x7b\xfe\xf8" + "\x4c\x86\x38\x7f\x1c\x3c\x82\xc3\xd1\xa0\xf3\x42\xfe\x18\xbc\xf7" + "\xc1\xe0\x8f\x92\xd8\xf2\x14\xf2\xc7\x41\xcb\xe5\xf3\xc7\x41\xfb" + "\xe5\xf1\x47\x8c\x39\x31\xfe\x38\xa8\xd1\x16\x73\x42\xfe\x38\xd8" + "\x4f\x9c\x3f\x0e\x1e\x24\xe4\x8f\xb8\x7e\x31\xfe\x38\x78\xaa\xa0" + "\x7e\x3b\xfe\x38\x78\xa9\x90\x3f\x92\x72\x1c\x7f\x1c\xe2\x4f\x62" + "\xe8\x33\x03\xe5\xf3\xc7\xc1\x8d\xd2\xfc\x71\x88\x9b\x90\x3f\x0e" + "\x3e\x4b\x78\xe2\x90\x60\xc2\x1f\x07\xd7\x92\xe3\xcf\x04\xf1\x8f" + "\x73\xfc\x91\x1c\xe7\xf8\xe3\x90\x91\x2d\xf1\x47\xc7\xdc\x22\xcc" + "\xc0\x71\x8b\x30\x03\x9f\x5b\x9c\x12\x70\x8b\x21\x8e\xf3\x5f\x51" + "\xc3\xb5\x1c\xb7\x18\xb6\x95\xf4\xef\x61\x2b\x49\xff\x1e\xf6\x02" + "\xc3\x2d\x22\x81\x03\x00\xb7\xd8\x7f\xad\x98\x70\x8b\x6b\x46\xea" + "\xdd\x1b\x2c\xb7\xa8\x43\x9e\x59\x0b\x58\x6e\xf1\x3a\xe6\x16\x43" + "\x0f\x61\x6e\xe1\x55\x00\xfc\xb6\x86\xe5\xbb\xc9\xc0\x77\x6b\xe0" + "\xff\xd0\x77\xbe\x80\x3a\x2a\x80\x93\xe6\xe0\xeb\xf1\x77\x40\xa0" + "\x2e\x66\x6f\x2d\xb3\xef\x56\xef\xa1\x99\x45\xf6\xec\xe2\xef\xb8" + "\x48\x7d\xc3\xc5\xfa\xfd\x96\xd4\x1a\xda\x82\xbf\xd7\x12\x15\xcf" + "\xfb\x8e\x0b\xfe\x3e\xab\xa1\x16\xe1\x6f\xb9\x14\x2c\x46\xbe\xdb" + "\x31\xd7\xa8\x45\xea\x1e\x99\x6e\x3d\xf0\x77\x5c\x7a\xd4\x13\x4e" + "\xbb\xdf\x52\x4a\x38\xed\x12\xff\xae\xc0\x93\x82\x77\xdc\xe6\x38" + "\xc6\x7b\x98\x5f\x2c\x09\xd2\xd4\x2f\x09\xea\x7b\xe7\x0e\x70\x5a" + "\x83\xed\x77\x3e\x0e\xc6\xe0\x6f\x49\xe0\xef\x69\x9a\x58\x4e\x4b" + "\xbf\x11\x84\x8a\xe6\x00\xef\xa9\x43\x6e\x83\xf1\x37\x3e\xca\x91" + "\xfa\x99\x3e\x10\xf7\xef\x04\xf5\xe1\xe7\xe7\xc4\xf3\xa2\x96\x3b" + "\x41\xa8\x2c\xee\x5b\x66\x9f\xad\xc9\xba\xcf\xf6\x36\xd2\x1a\x96" + "\x04\x51\xdb\x16\xf3\x38\xad\x1f\xe6\xb4\xcf\x3b\xe0\xb4\x43\x33" + "\x95\x71\xda\xa1\x19\x42\xbe\x11\x5e\x68\xcf\x37\x86\x5e\x76\x9e" + "\x6f\x0c\xeb\xa2\x8c\x6f\x0c\xf3\x74\x8e\x6f\x0c\x4b\xb2\xe5\x1b" + "\x7b\x19\xbe\x31\x44\x8f\xb1\x29\xce\x37\xc8\x39\xfb\x71\x62\x78" + "\x17\x6e\x9c\xf8\xe9\xb9\x8e\xcf\x37\x7e\xaa\x13\x1f\x13\x7e\x9a" + "\x49\xf8\xc6\xb0\xc4\xd6\xe7\x1b\xc3\x12\xc5\xf9\xc6\x4f\xef\x92" + "\xd8\x3c\x6c\x9e\x3d\xdf\x80\x6b\x44\xf9\xc6\xf0\x81\xec\x35\x89" + "\x42\xbe\x41\xea\x80\xf8\x33\x46\x9a\x6f\x0c\xff\x9e\xc4\xa3\xe1" + "\x9f\x92\x78\x44\x7c\x6a\xcf\x37\x86\xaf\x6b\x99\x6f\x10\x0c\x31" + "\xcf\x29\xc9\x37\x86\x9f\xb1\xe7\x1b\x43\x2e\x88\xf3\x8d\xb0\xbd" + "\x1c\x8e\xc2\xc6\x0b\xf9\x46\x68\xef\x07\x83\x6f\x48\x62\x4b\x27" + "\xe4\x1b\xa1\x57\xe5\xf3\x8d\xb0\x27\xe5\xf1\x0d\x8c\x39\x31\xbe" + "\x11\x96\x64\x8b\x39\x21\xdf\x08\x5b\x23\xce\x37\xc2\x0a\x85\x7c" + "\x03\xd7\x2f\xc6\x37\xc2\x4e\x09\xea\xb7\xe3\x1b\x61\x97\x85\x7c" + "\x83\x94\xe3\xf8\x46\xf8\x5a\x56\xb3\xad\x91\xcf\x37\xc2\x93\xa4" + "\xf9\x46\xf8\x22\x21\xdf\x08\x1f\x4d\x78\x45\x78\x01\xe1\x1b\xe1" + "\x31\xe4\xf8\x90\xd5\xfc\xe3\x1c\xdf\x20\xc7\x39\xbe\x11\xfe\x68" + "\xff\xeb\x03\x35\x5f\x35\x42\xd9\xfe\x57\x6a\xc4\xa3\xfd\xaf\x6d" + "\xf2\x1e\x3a\x9c\xec\x7f\xa5\x9e\x57\xb6\xff\x95\x7a\xfe\xd1\xfe" + "\xd7\x36\xf1\xcb\x08\x76\xff\xeb\x48\x85\xfb\x5f\x47\x3e\xda\xff" + "\xda\x26\x7e\xf9\x19\xbb\xff\xf5\x45\x85\xfb\x5f\x5f\x74\x61\xff" + "\xeb\x58\x5f\x4e\x1b\x8f\xf5\x95\xd6\xc6\x2f\xb6\xb0\xff\xf5\xa5" + "\x58\x4e\x1b\x8f\x3a\x46\xb8\xe8\xa8\xf7\x09\x17\x1d\xc5\xcc\x4d" + "\xa5\x61\x6d\xfc\x41\x3c\xfa\x64\xf1\x61\x0a\xe7\x85\xc3\xdf\xc6" + "\xdc\xb0\x02\xb9\x9b\xb0\x36\x06\x1f\x6c\x68\xc2\xda\xf8\x04\x4a" + "\x9e\x8b\xb5\x71\xc4\xf9\x8a\x1a\xde\xf7\x55\xa8\x9f\x8f\xe7\xf2" + "\x39\x9f\x40\xf8\xdc\x17\xb7\x0f\x53\x39\x4d\x36\x73\xf2\x8b\x8d" + "\x94\x66\x81\x70\x4e\xde\x9c\x1f\x63\xc0\x73\xf2\x8d\xec\xb7\x52" + "\x98\x79\xf9\x41\x8e\xe7\xe4\x0b\x9b\x60\xec\x14\x99\x97\xc7\x73" + "\xf2\x30\x46\x3e\x64\x73\xf2\x23\xd9\xbd\xb1\x11\xbb\x95\xcd\xc9" + "\x47\xec\x12\x6a\xe4\xb1\xc7\xed\x35\xf2\xa8\x2e\xce\x6b\xe4\x51" + "\x83\x94\x69\xe4\x51\xc1\xce\x69\xe4\x51\x1b\xc4\x35\xf2\x8b\xa6" + "\x34\x49\x8d\x4c\xce\xd9\x6b\x9b\x97\x06\x71\xda\xe6\x17\x8d\x1d" + "\x5f\x23\xff\xa2\x40\x5c\xc7\xfc\x62\x37\xd1\xc8\xa3\xb2\x5a\x5f" + "\x23\x8f\xca\x12\xd7\xc8\x2f\xb1\xef\xbf\x47\xe5\xd8\x6b\x64\xb8" + "\x46\x54\x23\xbf\x14\xc9\x5e\x93\x25\xd4\xc8\xa4\x0e\x88\x43\x49" + "\xd2\x1a\x79\xb4\x07\x89\x4b\x2f\x9d\x23\x71\x89\xf8\xd4\x5e\x23" + "\xbf\xb4\xbf\x65\x8d\x4c\x30\xc4\x3c\xa7\xa4\x46\x7e\xe9\xae\xbd" + "\x46\x7e\x51\x62\x6f\xec\x98\x72\x0e\x47\x63\xe6\x0b\x35\xf2\xe8" + "\x17\x1e\x0c\x8d\x2c\x89\xad\x02\xa1\x46\x1e\xd3\x5d\xbe\x46\x1e" + "\x33\x4a\x9e\x46\xc6\x98\x13\xd3\xc8\x63\x36\xd8\x62\x4e\xa8\x91" + "\xc7\xec\x15\xd7\xc8\x63\x8e\x0b\x35\x32\xae\x5f\x4c\x23\x8f\xb9" + "\x2e\xa8\xdf\x4e\x23\x8f\xed\x22\xd4\xc8\xa4\x1c\xa7\x91\xc7\xee" + "\x23\x31\xf4\x45\x05\x7b\x63\xc7\x6e\x90\xd6\xc8\x63\xf3\x85\x1a" + "\x79\x6c\x22\xd1\xc2\x63\x4b\x88\x46\x1e\x9b\x4a\x8e\xbf\xb8\x93" + "\x7f\x9c\xd3\xc8\xe4\x38\xa7\x91\xc7\x56\x3d\xda\x1b\xfb\x20\x69" + "\xe4\x71\x0a\xe7\xbf\xc7\x65\x74\x0c\xce\xff\xb0\x69\xb1\xb1\x35" + "\x84\x73\xfd\xb2\xb7\x32\xce\xff\x4b\xff\x8e\xe1\x97\x87\x4d\x8b" + "\x8d\x63\xf7\x2c\xff\xea\x53\x65\x7e\xf9\x55\xb1\x72\x2d\xf6\xea" + "\x4e\x4e\x8b\xbd\xba\x53\x5a\x8b\x4d\x58\xe3\x58\x8b\x45\xd7\x72" + "\x5a\x2c\x6a\x3c\xe1\x3c\x51\x83\x08\xe7\x99\x78\x5d\xbe\x16\x9b" + "\x98\x20\xd4\x62\x13\xce\x3d\xd2\x62\x6d\xa5\xc5\x7e\x19\x47\xf0" + "\x37\x71\xa8\x32\x2d\x36\x31\x44\xa8\xc5\x26\x47\xda\x6b\xb1\x89" + "\xf9\xce\x6b\xb1\x89\xca\xf2\xff\x52\x13\x0f\x3b\xa7\xc5\xa2\x7a" + "\x8b\x6b\xb1\x09\x6b\xa5\xb5\x18\x39\x67\xcf\xa1\xa3\x8f\x70\x1c" + "\x3a\x7a\x4d\xc7\xd7\x62\xd1\x41\xe2\x7c\x39\x7a\x28\xd1\x62\x51" + "\xfe\xad\xaf\xc5\xa2\xfc\xc5\xb5\x58\xf4\x6e\xc2\x5b\xa3\xfa\xd8" + "\x6b\x31\xb8\x46\x54\x8b\x45\x9f\x67\xaf\xf1\x17\x6a\x31\x52\x07" + "\xc4\xa1\xbb\xd2\x5a\x6c\x52\x2e\x89\x4b\x93\x66\x92\xb8\x44\x7c" + "\x6a\xaf\xc5\x26\x8d\x68\x59\x8b\x11\x0c\x31\xcf\x29\xa9\xc5\x26" + "\x65\xda\x6b\xb1\x09\xab\xc5\xb5\xd8\xab\xbc\x7d\x1a\xaf\x34\x0a" + "\xb5\xd8\xa4\x53\x0f\x86\x16\x93\xc4\x56\x90\x50\x8b\xbd\xb2\x55" + "\xbe\x16\x7b\xa5\x5c\x9e\x16\xc3\x98\x13\xd3\x62\xaf\xf6\xb6\xc5" + "\x9c\x50\x8b\xbd\x1a\x2a\xae\xc5\x5e\x8d\x14\x6a\x31\x5c\xbf\x98" + "\x16\x7b\x75\xb9\xa0\x7e\x3b\x2d\xf6\x6a\xbe\x50\x8b\x91\x72\x9c" + "\x16\x9b\xac\x65\xc7\xbb\x41\xf2\xb5\xd8\xe4\xde\xd2\x5a\x6c\x72" + "\x7f\xa1\x16\x7b\xb5\x9e\x68\xae\xc9\x13\x88\x16\x9b\xcc\x1e\x9f" + "\x10\xcc\x3f\xce\x69\x31\x72\x9c\xd3\x62\x93\x63\x1f\xed\x9b\x7d" + "\x90\xb4\xd8\xaf\xbb\x2b\xd3\x62\xbf\xf6\x7a\xc4\xf9\xdb\x82\xf3" + "\x4f\x4e\x26\x9c\xeb\x37\xbb\x95\x71\xfe\xdf\xec\x52\xce\xf9\x67" + "\xe4\x71\x9c\x7f\x46\x9e\x34\xe7\x8f\x59\xee\x98\xf3\xc7\x5e\xe0" + "\x38\xff\x6b\x2f\x90\xb1\xf5\xb5\xfe\x64\x6c\x9d\xf6\xbd\x7c\xce" + "\x3f\x6d\xaa\x90\xf3\xc7\x9c\x7a\xc4\xf9\xdb\x8a\xf3\xff\x7a\x32" + "\xc1\xdf\xb4\x40\x65\x9c\x7f\x5a\x80\x90\xf3\xc7\x8d\xb2\xe7\xfc" + "\xd3\xec\xbe\xff\x21\xcd\xf9\xa7\xed\x57\xc6\xf9\xa7\xed\x73\x8e" + "\xf3\xbf\xd6\x5d\x9c\xf3\xc7\xa4\x4a\x73\x7e\x72\xce\x9e\xab\xc5" + "\xee\xe7\xb8\x5a\xec\xf2\x8e\xcf\xf9\x63\xfb\x88\xf3\xb2\xd8\x40" + "\xc2\xf9\x5f\xf3\x6a\x7d\xce\xff\x9a\x97\x38\xe7\x8f\xdd\x4a\xf8" + "\xd1\x6b\x6a\x7b\xce\x0f\xd7\x88\x72\xfe\xd8\x72\xf6\x1a\x2f\x21" + "\xe7\x27\x75\x40\x1c\xba\x2a\xcd\xf9\xa7\xaf\x21\x71\x69\x3a\xf9" + "\x56\x18\xeb\x53\x7b\xce\x3f\x7d\x50\xcb\x9c\x9f\x60\x88\x79\x4e" + "\x49\xce\x3f\x7d\xa9\x3d\xe7\x8f\xd1\x89\x73\xfe\x19\x91\x1c\x8e" + "\x5e\xbf\x2e\xe4\xfc\xd3\x8f\x3d\x18\x9c\x5f\x12\x5b\x7d\x84\x9c" + "\xff\xf5\x0d\xf2\x39\xff\xeb\xc7\xe5\x71\x7e\x8c\x39\x31\xce\x3f" + "\xa3\xbb\x2d\xe6\x84\x9c\x7f\xc6\x40\x71\xce\x3f\x63\x94\x90\xf3" + "\xe3\xfa\xc5\x38\xff\x8c\xf9\x82\xfa\xed\x38\xff\x8c\x75\x42\xce" + "\x4f\xca\x71\x9c\x3f\x2e\x98\x1d\xef\xfa\xcb\xe7\xfc\x71\xdd\xa5" + "\x39\x7f\x9c\x9f\x90\xf3\xcf\x60\xf7\xce\xc6\x45\x10\xce\x3f\xc3" + "\x44\x8e\xc7\x68\xf8\xc7\x39\xce\x4f\x8e\x73\x9c\x3f\x2e\xfa\xd1" + "\x9e\xda\x07\x89\xf3\xcf\x72\x53\xc6\xf9\x67\x21\xe5\xdc\x32\x89" + "\xb7\xef\x25\xc9\xc1\xbe\x97\x59\xe7\x1c\x73\xcb\x37\x78\xfb\x5e" + "\x12\xd8\x7d\x2f\x09\xec\xbe\x97\x84\x17\xe4\x73\xcb\xf8\x43\x42" + "\x6e\x39\x3b\xf0\x11\xb7\x6c\x2b\x6e\x19\x17\x4f\xb8\x65\x7c\xa6" + "\x32\x6e\x19\x6f\xb3\xff\x65\xae\xc8\xfe\x97\x78\x19\xfb\x5f\x12" + "\x14\xee\x7f\x49\x70\x72\xff\x4b\x82\xc4\xfe\x97\x59\xd5\xd2\xdc" + "\x92\x9c\xb3\xe7\x04\x6f\xf0\xf6\xbf\xcc\x79\x00\xf6\xbf\xcc\x91" + "\xd8\xa3\x30\x87\xdd\xff\x92\xd0\x06\xfb\x5f\x12\x24\xf6\xbf\xcc" + "\x61\xf7\xbf\x24\x88\xec\x7f\x49\x90\xd8\xff\xf2\x06\xbb\xff\x25" + "\xc1\x66\xff\x4b\x02\xbb\xff\xe5\x0d\x07\xfb\x5f\xde\x60\xf7\xbf" + "\xbc\xc1\xee\x7f\x21\x3e\xb5\xe7\x96\x6f\x38\xb1\xff\x25\x81\xdd" + "\xff\x92\xe0\x60\xff\xcb\x1b\x22\xfb\x5f\x66\x9d\x15\xe7\x96\x49" + "\xbc\xfd\x2f\x49\x36\xfb\x5f\x12\x1f\x90\xfd\x2f\x92\xd8\xb2\xd9" + "\xff\x92\xa8\x60\xff\x4b\x92\xcc\xfd\x2f\x09\x12\xfb\x5f\x92\x92" + "\x6c\x31\x27\xe4\x96\x49\x12\xfb\x5f\x92\x6c\xf6\xbf\x24\x48\xec" + "\x7f\x49\x3a\x25\xa8\xdf\x8e\x5b\x26\xd9\xec\x7f\x49\xb0\xd9\xff" + "\x32\x97\xdd\xff\x32\x6b\xa5\x7c\x6e\x39\xd7\xc1\xfe\x97\xb9\x36" + "\xfb\x5f\xe6\xb2\xfb\x5f\xe6\xb2\xfb\x5f\xe6\xb2\xfb\x5f\x66\xa5" + "\xf2\x8f\x73\xdc\x92\x1c\xe7\xb8\xe5\xdc\x16\xf7\xbf\x38\xe6\x1d" + "\x8b\x53\x39\xde\xb1\x38\x55\x9a\x77\xbc\x19\xe9\x98\x77\x2c\x3c" + "\xc1\xf1\x8e\x05\x81\xa4\x7f\x2f\xe8\x42\xfa\xf7\x7c\xe6\x3d\xcc" + "\xca\x72\xe0\x1d\x4f\xc5\xa3\x03\x37\x8a\x19\xde\xf1\xc9\x02\x23" + "\x05\x1c\xd1\xdd\x82\x79\x07\x70\xc1\xac\x65\x98\x77\xd4\xb0\xfb" + "\x6d\xe7\x8f\x2a\xd7\xf1\x79\xc7\x9b\xef\x33\x7b\x6f\xef\x7f\xef" + "\xb9\x06\xe1\xf3\x62\x7b\x71\x8f\x2d\x60\xf7\xe2\x42\xdd\xfc\x3d" + "\xb8\xcc\xbe\xdc\x1b\xc0\x4b\x80\xa6\x59\x78\xbc\xe4\xd1\x5e\x5c" + "\x47\x7b\x71\xe7\x2b\x9c\xff\x9e\xef\x25\xe4\x22\x4b\x06\xda\x73" + "\x91\xf9\x8b\x9c\xe7\x22\xf3\xf3\x95\x71\x91\xf9\x79\xce\x71\x91" + "\xf9\x77\xc5\xb9\xc8\x9b\xd1\x18\xb7\xe2\x5c\x84\x9c\xb3\x1f\x43" + "\x16\xe6\x73\x63\xc8\xc2\x99\x1d\x9f\x8b\x2c\x74\x17\x1f\x2f\x16" + "\x76\x27\x5c\x64\x7e\x7d\xeb\x73\x91\xf9\xf5\xe2\x5c\x64\x61\x26" + "\x89\xdb\xf3\x8d\xf6\x5c\x04\xae\x11\xe5\x22\x0b\x0f\xb1\xd7\xd4" + "\x0b\xb9\x08\xa9\x03\x62\xd3\x19\x69\x2e\x92\x3c\x9f\xc4\xaa\xe4" + "\x17\x48\xac\x22\x3e\xb5\xe7\x22\xc9\x7e\x2d\x73\x11\x82\x21\xe6" + "\x39\x25\xb9\x48\xf2\x74\x7b\x2e\xf2\xe6\x04\x71\x2e\xb2\x38\x94" + "\xc3\xd1\xa2\x73\x42\x2e\x92\xbc\xfb\xc1\xe0\x22\x92\xd8\x72\x17" + "\x72\x91\x45\x4b\xe5\x73\x91\x45\x7b\xe5\x71\x11\x8c\x39\x31\x2e" + "\xb2\xe8\xae\x2d\xe6\x84\x5c\x64\xb1\x8f\x38\x17\x59\x3c\x50\xc8" + "\x45\x70\xfd\x62\x5c\x64\xf1\x14\x41\xfd\x76\x5c\x64\xf1\x22\x21" + "\x17\x21\xe5\x38\x2e\xb2\xc4\x97\xd5\x73\x77\xe5\x73\x91\xc5\x77" + "\xa5\xb9\xc8\x62\xb3\x90\x8b\x2c\xae\x22\x9c\x63\x49\x10\xe1\x22" + "\x8b\x6b\x58\x8e\x52\xcf\x3f\xce\x71\x11\x72\x9c\xe3\x22\x4b\xb4" + "\x32\xe6\xb9\xea\xe5\xec\xc5\xdd\x7f\x4f\x38\xcf\x65\x9d\xe3\x32" + "\x05\x6b\x6b\xee\xcf\x73\xf1\xdf\x93\x8a\xcc\x73\xe1\x31\x9d\x9b" + "\xe7\xba\xc8\xc4\x2a\x6e\x9e\x4b\xcf\xcc\x73\xe1\x39\x2e\xfc\xae" + "\xd4\x3a\xc7\x65\x79\xcb\x7e\x1f\xee\x7e\x8b\xfc\x39\x2e\xee\x7d" + "\xe9\xe1\x2a\x32\xc7\x55\x7d\x7f\x8e\x0b\x8f\xe7\xe6\x06\xfb\x39" + "\x2e\x3c\x8e\x73\x73\x5c\xdf\xb6\xf2\x1c\x57\xca\x65\x65\xe3\x7a" + "\x4a\x4d\xc7\x78\xaf\xfd\xb0\xed\xc3\x5d\x32\x81\xcc\xfd\x2c\x5b" + "\xa9\xec\xbd\xf6\xb2\xd4\x8e\xe1\x97\x87\x6d\xed\xf7\xd2\x60\xe2" + "\x17\x9d\x9f\x32\xbf\xe8\x7c\x3b\x86\x5f\x1e\xb6\x75\x20\xcb\x4e" + "\x10\xbf\x2c\xdf\xaf\xcc\x2f\xcb\x5d\xc8\x7f\x99\x59\xc2\x69\xe6" + "\xcc\x12\xbe\x66\x2e\x1d\xcd\xd7\xcc\x2b\x5a\xc8\x7f\x99\xee\xc9" + "\x69\xe6\x95\x49\x84\x87\xae\x8c\x24\x3c\x74\x25\xf3\x7e\x6a\xe5" + "\x28\xc4\x68\x65\x13\xd6\xcd\x73\x8d\xd4\x81\x6b\x25\x94\x69\x15" + "\xd1\xcb\x95\xa6\x32\x54\x6e\x30\xa2\x77\x97\x21\xf7\x75\x37\x90" + "\xfb\x47\xb7\x8d\x94\xf7\x3c\xe4\x09\x63\x12\xd8\xac\x0c\x78\x4c" + "\x21\x4a\x4e\xc3\x5a\x3a\x75\x4d\x65\xb2\x81\xa7\xa5\x57\x5c\xe5" + "\x74\x34\x94\x4b\x36\xa2\x2f\xe7\x96\x50\x58\x2f\x37\xe7\xc7\x18" + "\x9a\x07\x69\xf5\x4c\x1e\x2b\xfe\x7c\x3e\xdc\x5b\xf3\xba\x70\x3e" + "\xbf\x29\x3f\xa6\xbe\x71\xbf\xb6\x86\xc9\xa1\x19\xc8\xcd\xe9\xcb" + "\xc9\x9f\xb9\xbd\x09\xf9\x5a\xe7\xf3\xb7\x3f\x74\xf3\xf9\xba\x58" + "\x82\xd1\xd4\x49\xca\xe6\xf3\x53\xa3\x85\x1a\x7a\xd5\x7c\x7b\x0d" + "\x9d\x7a\xc8\x79\x0d\x9d\x7a\x5e\x99\x86\x4e\xad\x76\x4e\x43\xaf" + "\x1c\x61\xab\xa1\xf7\xa4\x61\x0d\xbd\x62\x35\xc6\xb1\xb8\x86\x26" + "\xe7\xec\xb5\x4f\xda\x79\x4e\xfb\xa4\xed\xee\xf8\x1a\x3a\x6d\x9c" + "\xb8\xce\x49\x9b\x44\x34\xf4\x4a\x6d\xeb\x6b\xe8\x95\x5a\x71\x0d" + "\x9d\x76\x92\xe8\x8d\x95\x5a\xab\x1e\xe6\x34\x34\x5c\x23\xaa\xa1" + "\xd3\x1a\x6d\xaf\x21\x1a\x7a\xe5\x48\xa2\xa1\xd3\xfd\xa4\x35\x74" + "\xfa\xa7\x24\x76\xa5\x67\x92\xd8\x45\x7c\x6a\xaf\xa1\xd3\xa7\xb6" + "\xac\xa1\x09\x86\x98\xe7\x94\xd4\xd0\xe9\xef\xdb\x6b\xe8\x15\x12" + "\xf9\x33\x33\x97\x73\x38\xca\xec\x2d\xd4\xd0\xe9\x57\x1f\x0c\x0d" + "\x2d\x89\xad\x71\x42\x0d\x9d\x71\x44\xbe\x86\xce\xb8\x2e\x4f\x43" + "\x63\xcc\x89\x69\xe8\xcc\x11\x2c\x7e\x46\x8a\x6b\xe8\xcc\x29\xe2" + "\x1a\x3a\x73\xbe\x50\x43\xe3\xfa\xc5\x34\x74\xe6\x56\x41\xfd\x76" + "\x1a\x3a\xf3\x90\x50\x43\x93\x72\x9c\x86\x5e\x15\xc3\x8e\x7d\x0a" + "\xf2\x67\xae\x1a\x21\xad\xa1\x57\x8d\x12\x6a\xe8\x55\xbe\x44\x2b" + "\xaf\x9a\x47\x34\xf4\xaa\x20\x72\x7c\x45\x10\xff\x38\xa7\xa1\x57" + "\xd8\xe4\xcf\x5c\x95\x2a\x43\x43\x1b\x5b\x49\x43\xd7\x3e\x58\x1a" + "\xfa\xf3\x9c\x8e\xa1\xa1\x57\x0f\x54\xa6\xa1\x57\x07\x39\xa9\x09" + "\xea\x5b\xd0\x04\x35\x8f\x34\x01\x9f\x6f\xad\xca\x21\x7c\x6b\xcd" + "\x71\x65\x9a\x60\x4d\x49\x47\xf0\xcb\xc3\xe5\x93\xd5\xec\x7a\xfd" + "\xdf\x4d\x51\xe6\x93\xdf\x4d\x7e\xa4\x9f\xdb\xc2\x2f\xef\x78\x12" + "\xbf\xac\xbd\xae\xcc\x2f\x6b\xeb\x94\xeb\xe7\xdc\x00\x4e\x3f\xe7" + "\x06\xf0\xf5\xf3\xdf\x04\xef\x9c\xd7\x1d\x77\xac\x9f\xb3\xe7\x71" + "\xfa\x39\xab\x9c\x70\xd0\x2c\x76\x4d\x49\x16\x33\xa7\x0e\xea\x88" + "\xd1\xcf\xf7\xb0\x7e\xbe\x02\xfa\x79\x4e\x1c\x65\x62\xbf\x1d\x81" + "\xd7\xaf\x95\x83\x06\xc6\x9a\xb9\x52\x07\xff\x4e\x31\xa0\x77\x17" + "\x23\xf7\xf5\xa0\x7d\xf7\xc2\x58\xb9\x77\x99\x81\x5a\x3b\x17\xc6" + "\x99\xea\xfd\xc8\x3b\x11\x74\xf5\x6d\xac\xab\x4f\x80\x66\x5e\xc3" + "\xea\xea\x77\xaf\x56\xa6\xf0\x75\xf5\xfa\x51\x8c\xae\x36\x90\xb5" + "\x71\x95\x29\xa0\xab\xe1\x7e\xf8\x5b\x14\x7c\x5d\xdd\x08\xba\xb9" + "\x09\x74\x73\xce\x35\x1b\x8d\x3d\xc7\x5e\x63\x37\xfa\xc5\x18\x8d" + "\x83\xb4\xb5\x58\x63\xdf\xdb\xfd\x48\x63\xdb\x6b\xec\xdf\x15\x10" + "\x1c\xbf\x7b\x48\x99\xc6\x7e\xf7\xa0\x50\x63\xe7\x9e\xb1\xd7\xd8" + "\x59\xbd\x9d\xd7\xd8\x59\x2f\x28\xd3\xd8\x59\x23\x9d\xd3\xd8\x59" + "\x85\xb6\x1a\xfb\x43\xe6\x3d\xf5\xba\x13\x18\xeb\xe2\x1a\x9b\x9c" + "\xb3\xd7\x46\xd9\x2f\x70\xda\x28\xbb\x4b\xc7\xd7\xd8\x1b\xf6\x89" + "\xeb\xa0\x0d\x87\x88\xc6\xce\x2a\x68\x7d\x8d\x9d\x55\x20\xae\xb1" + "\xb3\xd9\xf5\x6f\x59\x05\xf6\x1a\x1b\xae\x11\xd5\xd8\xd9\xd3\x6d" + "\xaf\x21\x1a\x3b\x6b\x27\xd1\xd8\xd9\xcb\xa5\x35\xf6\x46\x3f\x12" + "\xdf\xb2\x2f\x93\xf8\x46\x7c\x6a\xaf\xb1\xb3\x8f\xb5\xac\xb1\x09" + "\x86\x98\xe7\x94\xd4\xd8\x1b\x3d\xec\x35\xf6\xba\x12\x71\x8d\x9d" + "\x73\x91\xc3\x51\xce\x4a\xa1\xc6\xde\x18\xf9\x60\x68\x6c\x49\x6c" + "\xed\x13\x6a\xec\x9c\x27\xe5\x6b\xec\x9c\x49\xf2\x34\x36\xc6\x9c" + "\x98\xc6\xce\x29\x64\xf1\xb3\x53\x5c\x63\xe7\x1c\x11\xd7\xd8\x39" + "\x67\x84\x1a\x1b\xd7\x2f\xa6\xb1\x73\xcc\x82\xfa\xed\x34\x76\x6e" + "\x6f\xa1\xc6\x26\xe5\x38\x8d\x9d\x7b\x94\xc4\xd0\x75\x49\xf2\x35" + "\x76\x6e\xa1\xb4\xc6\xce\xdd\x2d\xd4\xd8\xb9\x3a\xa2\xa5\x73\xab" + "\x88\xc6\xce\xcd\x22\xc7\xd7\x25\xf2\x8f\x73\x1a\x9b\x1c\xe7\x34" + "\x76\xae\x5e\xde\x7b\x6a\x97\xf2\x61\xd5\xb4\xff\x7e\x8c\xd6\xca" + "\x87\x65\x7d\x57\xfd\xdf\xde\x8f\xf1\x5e\xae\x32\x9d\xfd\x5e\xce" + "\x23\x3d\xd7\xda\xba\x21\xb7\x9e\xf0\xad\x7c\x85\xf9\x6f\xf3\x1d" + "\xe6\xbf\x7d\xa4\xe7\x94\xfa\xe5\xbd\x6a\xe2\x97\xcd\xc7\x94\xf9" + "\x65\xf3\x51\xe5\x7a\x6e\x47\x15\xa7\xe7\x76\x54\x49\xbf\x0f\xfd" + "\x7d\xae\x63\x3d\x57\xe0\xcf\xe9\xb9\x6d\xcb\x09\xdf\xd9\x36\x9d" + "\xf0\x9d\x6d\x4f\xb6\xde\xfb\xd0\xad\xf9\xc2\xf7\xa1\xbf\x6f\x7c" + "\xf4\x3e\xb4\x3d\xb4\x5a\xfe\x3c\x82\xd1\xad\x33\x95\x69\xb5\xad" + "\x71\x42\xad\x56\xb4\xd2\x5e\xab\x6d\x3d\xe9\xbc\x56\xdb\x7a\x55" + "\x99\x56\xdb\x5a\xeb\x9c\x56\xdb\x36\x5e\xfc\x7d\xe8\xef\xf3\xa4" + "\xdf\x87\x92\x73\xf6\x1c\x7b\xfb\x55\x8e\x63\x6f\x3f\xd4\xf1\xb5" + "\xda\xf6\x18\x71\x3e\xbd\x7d\x26\xd1\x6a\xdb\xc6\xb5\xbe\x56\xdb" + "\x36\x4e\x5c\xab\x6d\x3f\x47\x78\xed\xb6\x71\xf6\x5a\x0d\xae\x11" + "\xd5\x6a\x05\x5d\x6c\xaf\x21\x5a\x6d\xdb\x04\xa2\xd5\x0a\x02\xa5" + "\xb5\x5a\xc1\x71\x12\xbb\x0a\x72\x49\xec\x22\x3e\xb5\xd7\x6a\x05" + "\x49\x2d\x6b\x35\x82\x21\xe6\x39\x25\xb5\x5a\xc1\xa7\xf6\x5a\xed" + "\xf7\x39\xe2\x5a\x6d\xc7\x3a\x0e\x47\x3b\x06\x0a\xb5\x5a\x41\xe3" + "\x83\xa1\xd5\x24\xb1\x15\x23\xd4\x6a\x85\xa7\xe4\x6b\xb5\x42\xb3" + "\x3c\xad\x86\x31\x27\xa6\xd5\x76\x8c\x67\xf1\x33\x41\x5c\xab\xed" + "\x48\x10\xd7\x6a\x3b\x56\x0a\xb5\x1a\xae\x5f\x4c\xab\xed\xd8\x2b" + "\xa8\xdf\x4e\xab\xed\x38\x29\xd4\x6a\xa4\x1c\xa7\xd5\x8a\x12\xd9" + "\xb1\x6f\x84\x7c\xad\x56\x34\x5e\x5a\xab\x15\x4d\x12\x6a\xb5\xa2" + "\x00\xa2\xc9\x8a\x52\x89\x56\x2b\xd2\x92\xe3\xbf\xd7\xf2\x8f\x73" + "\x5a\x8d\x1c\xe7\xb4\x5a\x51\x96\x3c\xad\xe6\x7c\xbe\xac\xff\xfe" + "\x9a\x62\xf5\x43\xb6\xa6\xf8\xfd\x11\xca\x74\xda\xfb\xda\x47\x9a" + "\xa0\x2d\x34\x41\xd1\x4e\xc2\xb7\x3e\x38\xa3\x4c\x13\x7c\x50\xa5" + "\x5c\x13\x7c\x54\xc3\x69\x82\x8f\x6a\xa4\x35\xc1\x1f\x76\x3b\xd6" + "\x04\x7b\x82\x39\x4d\xf0\xe1\x06\x32\xae\x7e\xb8\x88\x8c\xab\x1f" + "\x0e\x6d\x3d\x4d\xb0\x7b\xaf\x50\x13\xec\xea\xfe\x48\x13\xb4\x87" + "\x26\x78\x3f\x83\x60\x74\xf7\x52\x65\x9a\x60\x77\x8a\x50\x13\x7c" + "\x9c\x6b\xaf\x09\x76\x9f\x77\x5e\x13\xec\x36\x2b\xd3\x04\xbb\x4d" + "\xce\x69\x82\x0f\xa7\x8b\x6b\x82\x3f\xec\x91\xd6\x04\xe4\x9c\x3d" + "\x97\xfb\xa3\x99\xe3\x72\x7f\x3c\xd5\xf1\x35\xc1\x1f\xe7\x89\xf3" + "\xb6\x3f\x2e\x25\x9a\xe0\xc3\xd8\xd6\xd7\x04\x1f\xc6\x8a\x6b\x82" + "\x3f\x5e\x25\xfc\xe9\xc3\x58\x7b\x4d\x00\xd7\x88\x6a\x82\x3d\x4f" + "\xda\x5e\x43\x34\xc1\x87\x71\x44\x13\xec\x19\x21\xad\x09\xf6\x9c" + "\x23\xb1\x6b\xcf\x6e\x12\xbb\x88\x4f\xed\x35\xc1\x9e\x95\x2d\x6b" + "\x02\x82\x21\xe6\x39\x25\x35\xc1\x9e\x93\xf6\x9a\xe0\x0f\xbb\xc4" + "\x35\xc1\x47\x85\x1c\x8e\x3e\x7a\x41\xa8\x09\xf6\x76\x7f\x30\x34" + "\x81\x24\xb6\xe6\x09\x35\xc1\xde\x8b\xf2\x35\xc1\x47\x3e\xf2\x34" + "\x01\xc6\x9c\x98\x26\xf8\x88\x7d\xff\x47\xf0\x62\xaf\x09\x3e\x5a" + "\x2e\xae\x09\x3e\xca\x15\x6a\x02\x5c\xbf\x98\x26\xf8\xe8\x98\xa0" + "\x7e\x3b\x4d\xf0\xd1\x79\xa1\x26\x20\xe5\x38\x4d\xf0\x71\x2a\x89" + "\xa1\x7f\x88\x94\xaf\x09\x3e\x9e\x2e\xad\x09\x3e\x4e\x10\x6a\x82" + "\x8f\x59\xee\xff\x71\x0e\xd1\x04\x1f\x4f\x20\xc7\xff\x30\x81\x7f" + "\x9c\xd3\x04\xe4\x38\xa7\x09\x3e\xde\xf9\x28\x9f\xd6\x83\x94\x4f" + "\x6b\xff\x24\x65\xba\x60\x7f\xb4\x72\xfe\x79\x28\x82\xe3\x9f\x87" + "\x22\xf8\xfc\x53\x98\xd7\xe2\x40\xa0\x63\xfe\xf9\xd9\x5a\x8e\x7f" + "\x16\x5f\x25\x31\xbc\xb8\x9c\xc4\xf0\x62\x26\x37\x9f\xbc\x7c\x5a" + "\xc5\x1e\xc2\x7c\x5a\x07\x96\x3e\xca\xa7\xd5\x56\xdc\xf2\xe3\x83" + "\x84\x5b\x7e\x72\x46\x19\xb7\xfc\xa4\x4a\xc8\x2d\x0f\x5d\xb7\xe7" + "\x96\xc5\xa1\xce\x73\xcb\xe2\xa9\xca\xb8\x65\x71\x8c\x73\xdc\xb2" + "\xf8\x88\x78\x0e\x8b\x03\x41\xd2\xf9\xb4\xc8\x39\x7b\x4e\xf0\x19" + "\x2f\xaf\xfe\x67\x81\x1d\x9f\x5b\x7e\x5a\x2a\x3e\xfe\x7f\x7a\x86" + "\x70\xcb\xe2\xc3\xad\xcf\x2d\x8b\x0f\x8b\x73\xcb\xcf\xc6\x90\x71" + "\xb8\xf8\xa8\x7d\x0e\x0b\xb8\x46\x94\x5b\x7e\xc6\xe6\xbf\x2f\x3e" + "\x2c\xe4\x96\xa4\x0e\x88\x43\xf9\xd2\xdc\xf2\x4f\x43\x49\x5c\xfa" + "\x93\x1b\x89\x4b\xc4\xa7\xf6\xdc\xf2\xb3\xf3\x2d\x73\x4b\x82\x21" + "\xe6\x39\x25\xb9\xe5\x9f\xfa\xdb\x73\xcb\x03\x01\xe2\xdc\xf2\x60" + "\x23\x87\xa3\x83\x5b\x85\xdc\xf2\x4f\x49\x0f\x06\xb7\x94\xc4\x56" + "\xa9\x90\x5b\x1e\x1c\x21\x9f\x5b\x1e\x9c\x2f\x8f\x5b\x62\xcc\x89" + "\x71\xcb\x83\x47\x6c\x31\x27\xe4\x96\x07\xcf\x89\x73\xcb\x83\xd7" + "\x85\xdc\x12\xd7\x2f\xc6\x2d\x0f\xf5\x16\xd4\x6f\xc7\x2d\x0f\x85" + "\x0a\xb9\x25\x29\xc7\x71\xcb\x43\xd5\x24\x86\xee\x2f\x97\xcf\x2d" + "\x0f\x1d\x91\xe6\x96\x87\x8e\x0b\xb9\xe5\xa1\x3c\xc2\x21\x0f\xd5" + "\x11\x6e\x79\x68\x0f\x39\xbe\xbf\x8c\x7f\x9c\xe3\x96\xe4\x38\xc7" + "\x2d\x0f\x99\xe4\xed\xbf\x69\x95\xf9\xe6\x76\xda\x7f\xd3\x5a\xf3" + "\xcd\x1d\x65\xff\xcd\x9f\xf7\x2a\xe3\x95\x7f\xde\xf3\x68\x5d\x50" + "\x6b\xcf\x35\xff\x3f\x35\xe1\x5a\x47\x5e\x50\x36\xd7\x7c\x64\xa4" + "\x72\xae\x7f\x7c\x1e\xc7\xf5\x8f\xcf\x93\xde\x4f\xf0\xb9\x8f\x63" + "\xae\xff\xc5\x41\x8e\xeb\x1f\x63\xd7\xdb\x1e\x6d\x24\x63\xea\xd1" + "\x23\x4a\xf6\x13\xac\xbf\x8d\xdc\xdf\xb5\xdd\x4f\x70\xf6\x18\xd9" + "\x4f\xb0\xd8\x76\x3f\xc1\xd1\xa1\xc2\xfd\x04\x9f\xe7\x4a\xed\x27" + "\xc0\x73\xcf\xcd\xfb\xb5\x35\x78\x2f\x81\xe8\x3e\x82\x69\xad\xbf" + "\x8f\x00\xeb\x84\xed\x80\x5b\xac\x15\x70\xbc\x79\xb8\xb4\xc2\x9f" + "\x0d\x04\xbf\xff\x67\x56\xa6\x15\xfe\xcf\x24\xd4\x0a\x7f\xe9\x6d" + "\xaf\x15\x8e\xce\x74\x5e\x2b\x1c\x5d\xa3\x4c\x2b\x1c\x5d\xed\x9c" + "\x56\x38\x7a\x59\x7c\x1f\xc1\xe7\xbe\xd2\xfb\x08\xc8\x39\x7b\x8e" + "\xf7\xc5\x1a\x8e\xe3\x7d\x31\xa9\xe3\x6b\x85\x63\xf5\xe2\x7c\xee" + "\x98\x99\x68\x85\xa3\x35\xad\xaf\x15\x8e\xd6\x88\x6b\x85\x2f\x16" + "\x11\x5e\x75\xb4\xc6\x7e\x1e\x1a\xae\x11\xd5\x0a\x5f\xec\xb6\xbd" + "\x86\x68\x85\xa3\xb5\x44\x2b\x7c\x71\x5c\x5a\x2b\x7c\x39\x9d\xc4" + "\xb5\x2f\xd9\x6f\x4c\x12\x9f\xda\x6b\x85\x2f\x3d\x5a\xd6\x0a\x04" + "\x43\xcc\x73\x4a\x6a\x85\x2f\x23\xed\xb5\xc2\xe7\x6a\x71\xad\x70" + "\x3c\x90\xc3\x51\xc9\x49\xa1\x56\xf8\x32\xff\xc1\xd0\x0a\x92\xd8" + "\xaa\x17\x6a\x85\x92\x04\xf9\x5a\xa1\x64\xab\x3c\xad\x80\x31\x27" + "\xa6\x15\x4a\x2e\xb3\xf8\xa9\x15\xd7\x0a\xc7\xdd\xc4\xb5\xc2\xf1" + "\xde\x42\xad\x80\xeb\x17\xd3\x0a\xc7\xc7\x08\xea\xb7\xd3\x0a\xc7" + "\x67\x0a\xb5\x02\x29\xc7\x69\x85\xbf\xb8\x93\x18\x7a\xe4\x88\x7c" + "\xad\x70\xfc\xb2\xb4\x56\x38\x7e\x5d\xa8\x15\x8e\x97\x10\x4d\xf0" + "\x17\x7f\xa2\x15\x8e\x9f\x25\xc7\x8f\x1c\xe6\x1f\xe7\xb4\x02\x39" + "\xce\x69\x85\xbf\x04\xc9\x5b\x9b\xe2\xfc\x3c\xf4\x7f\x7f\x6d\x8a" + "\xe7\x43\xb6\x36\xe5\xaf\xe7\x94\x69\x85\xbf\x9e\x55\xce\x4b\xbf" + "\xd6\x73\xbc\xf4\x6b\xbd\xf4\x1a\x88\x13\x7b\x1d\xf3\xd2\x53\x41" + "\x1c\x2f\xfd\x6a\x1d\x89\xdf\x5f\xcd\x27\xf1\xfb\xab\x41\xce\xae" + "\x81\x58\x7f\x8f\xe5\xa2\xd6\x35\x10\xcb\xd8\x35\x10\xc0\x47\x09" + "\xff\xfc\xdb\x6e\xe1\x1a\x88\x93\x3e\x52\x6b\x20\x44\xd7\x3e\xd8" + "\x70\x4e\x2b\x3f\x75\x65\xed\xc3\xc3\xcd\x39\xff\x32\x92\x70\xce" + "\xbf\x2d\x52\xc6\x39\xff\x96\x2c\xe4\x9c\x65\x1b\xec\x39\xe7\xdf" + "\xce\x39\xcf\x39\xff\xd6\xa8\x8c\x73\xfe\xcd\xe8\x1c\xe7\xfc\x6a" + "\xaa\xf8\xda\x87\x13\xfb\xa4\xd7\x3e\x90\x73\xf6\x5c\xa1\x94\x37" + "\xaf\x58\x7a\xb2\xe3\x73\xce\xd2\x44\x71\x5e\x50\xba\x88\x70\xce" + "\xaf\x62\x5a\x9f\x73\x7e\x15\x23\xce\x39\x4b\xd9\xf1\xff\xab\x18" + "\x7b\xce\x09\xd7\x88\x72\xce\x53\xbd\x6d\xaf\x21\x9c\xf3\xab\x58" + "\xc2\x39\x4f\x85\x4a\x73\xce\x53\x67\x48\xcc\x3a\xf5\x3e\x89\x59" + "\xc4\xa7\xf6\x9c\xf3\xd4\xf2\x96\x39\x27\xc1\x10\xf3\x9c\x92\x9c" + "\xf3\xd4\x71\x7b\xce\x79\x62\x8f\x38\xe7\xfc\x7a\x2b\x87\xa3\xaf" + "\x47\x08\x39\xe7\xe9\x2e\x0f\x06\xe7\x94\xc4\x56\xa2\x90\x73\x9e" + "\x3e\x2f\x9f\x73\x7e\xdd\x5d\x1e\xe7\xc4\x98\x13\xe3\x9c\x5f\x4f" + "\x65\xf1\x13\x2b\xce\x39\xbf\x5e\x2a\xce\x39\xbf\xde\x20\xe4\x9c" + "\xb8\x7e\x31\xce\xf9\xf5\x11\x41\xfd\x76\x9c\xf3\xeb\x73\x42\xce" + "\x49\xca\x71\x9c\xb3\x8c\xe5\x78\x27\x26\xc9\xe7\x9c\x65\x53\xa5" + "\x39\x67\xd9\x4c\x21\xe7\x2c\x1b\x4e\xb8\x65\x59\x16\xe1\x9c\x65" + "\xe3\xc8\xf1\x13\xd1\xfc\xe3\x1c\xe7\x24\xc7\x39\xce\x59\x56\xe0" + "\x88\x73\xd2\x39\xe6\xd2\x1c\xca\x52\x0c\xbf\xc3\xf0\x9c\xbd\x61" + "\x7c\x2b\x81\x7f\x97\xc2\x38\xa5\x86\x7f\x4b\xae\xe7\x34\xf8\x98" + "\x4b\x2d\xc0\x4b\x2c\x70\x9f\x4a\xc3\xcd\x92\x92\x27\x4c\x70\xef" + "\xf2\x3e\x84\xb3\x98\x4b\xbd\x4d\x9d\xc7\x59\xe8\x44\x18\xdf\xe1" + "\xdf\x3a\x38\x06\xe5\x7b\xc0\x78\xa8\x59\x86\x7a\xdc\xa0\xca\x47" + "\x5a\xcb\xc1\x33\xf7\xb8\x44\x95\x35\xe2\x3a\x1a\xd6\x97\x8f\x83" + "\xf6\xec\x91\x7c\x56\xa8\x2b\x6a\x6f\x5f\xb4\xd2\x44\xff\x50\xb2" + "\xe0\x36\xaa\xa1\xca\x73\xbd\xeb\x3a\x8f\x83\x38\x84\x30\x47\x2c" + "\x7e\xc2\xe0\x8e\xeb\x2c\x59\xd0\x84\xcf\xa5\xe0\x73\x66\x78\xc6" + "\xb4\xf9\x88\xca\xbe\xdd\xd9\x13\x38\x97\x47\x7a\x3d\x5d\xbb\xd0" + "\x04\xcf\x0c\xe3\xeb\x97\x7d\xab\xdd\x3f\xd9\x56\xcd\x8c\x3d\x15" + "\xf5\x66\xa6\x0e\xcd\x02\xfc\x3c\xe5\xf9\x3b\xa0\xbc\xd8\x33\xac" + "\x39\x80\x82\x3d\x06\xd2\x7a\x79\xe3\x5d\x79\xad\x94\x1d\xbd\x33" + "\xfb\xa2\x92\x67\xc1\x76\x1a\x44\x89\x9d\x97\x77\x9f\x0a\x47\xeb" + "\x1f\x3c\xdf\xeb\x45\xd7\xa7\x6f\x45\xd4\x46\x4b\x67\xcf\xbf\x42" + "\x4c\x2c\xda\x4c\x1b\x1a\xd6\x57\x1c\xd5\xbb\x1d\x1d\x87\x6d\xfe" + "\x5b\x38\xbf\xb1\x17\x6d\xb8\xb3\x0a\xe3\xa6\xe2\xec\x71\x18\xdb" + "\x6d\x7d\xb1\x38\x7e\xfe\x4c\x4d\x4a\xd2\xfc\x84\x85\x4b\x53\x34" + "\x81\xf1\x5d\xd1\xe4\x85\x0b\x35\xf3\x67\x2e\x58\xae\xe1\x9f\x79" + "\x5e\x13\x9f\xb4\x64\xe6\xac\x79\x09\x83\xe6\xcf\x4e\xee\x0a\xcf" + "\x84\x78\xcf\xe1\x8b\x9f\xc5\xb2\xbe\x42\xbf\x63\x13\x42\xef\xf5" + "\x44\xee\xf8\xb9\x1a\xd6\x57\x8e\xd6\xbb\xf7\x99\x8c\xef\x97\xbd" + "\x99\xae\xa7\xa0\x4c\x3a\xc4\xb4\x8d\x69\x9d\x71\xd9\xe8\x22\x78" + "\xae\x1d\xf0\xdc\xf0\x8c\xf0\xcc\x95\xc9\xd6\x67\xb6\x62\x22\x1d" + "\x63\x22\xed\x36\x60\xb0\x32\xd7\xdb\xd8\xf9\x65\x9a\x8e\xc1\xed" + "\xab\x87\xbe\xe2\x76\x85\xaa\x1a\xc8\xe8\x86\x5c\x73\x29\x5c\xbb" + "\xcf\x8a\x31\x4b\xde\xd8\x38\x7a\x93\x39\x07\x78\xa5\x5b\x03\x9d" + "\xf8\x22\x60\x13\x5f\xdf\x38\x04\xa1\x0c\xba\x21\x86\xf9\x36\x06" + "\xdd\x00\x18\x26\x38\x85\x73\x55\x65\x77\x28\xf4\x73\xa8\xc3\xa0" + "\x47\x73\xe7\xe1\x3a\xf4\x70\x0c\xdb\xdc\xb2\x73\xb6\x61\x4a\x10" + "\xca\x78\x26\x03\x65\x34\xe0\x6b\x76\x05\x96\x7a\xa7\x20\xb7\x28" + "\x1d\xfd\x1d\xc4\x1d\x37\xba\xff\x6c\x03\xbd\x3b\xb0\x54\x4f\x55" + "\x9e\xb5\xe4\x8f\x8d\x83\xf6\xd4\x35\xac\xaf\xd2\xea\xd1\xbd\xd5" + "\xb8\x9e\x8d\x9b\x19\xdb\xd7\xe1\xb6\x83\x7d\x40\xff\xd0\x25\xf4" + "\x2a\xb6\x0f\xe5\xf4\xcb\xb0\xe4\xcc\x4f\xae\x74\xbf\x87\xa2\x4c" + "\x74\x33\x9d\xdb\x2f\xa3\xa2\xbe\x1e\x62\x5a\xf2\x6c\xba\x6b\xc5" + "\x2d\x6f\x53\x52\x42\x51\x4f\xe8\x8b\xb9\xf3\x93\xe9\xdc\xb0\x5d" + "\x53\x06\x22\x35\xd4\x9d\x67\xb5\x27\xd8\xd2\x5d\x1e\x8e\xaa\x98" + "\x18\x86\xf1\x00\xcf\xc3\xe2\xa1\xaa\xe6\x78\x8a\x3d\x1e\xee\xf7" + "\xcd\xcd\xa1\x55\x26\x3a\xe6\xe5\xe6\xbc\x30\x4f\xda\x37\xb4\x3e" + "\xed\x32\xea\x84\x6d\x5b\x01\x5a\x20\x7b\x19\xf2\xdf\xf0\x3a\xd2" + "\xcc\x58\xae\x46\x86\xfc\x50\x83\x77\x66\x86\x1b\xd8\x84\x82\xf8" + "\x12\x02\x31\x33\xa4\xb9\xd7\xd8\xb8\xd4\x04\x44\xed\xbf\x54\x4c" + "\x61\xfe\x8c\xd7\xad\x5c\xa1\xce\xec\xde\x01\xd7\xd1\x37\x63\x10" + "\xf6\x07\xe3\x8b\x9b\x89\x28\x32\x09\xc6\xe7\xb9\xcc\xf9\xf3\x85" + "\x50\xa7\xbc\x76\x9d\x61\xf8\xaf\x19\x7c\x35\x04\xfc\x54\x59\x63" + "\x66\xea\x64\x7c\x35\x8f\xf3\xd5\x31\x78\x0e\xce\x5f\x67\xe2\xb0" + "\x5f\xc5\xdb\x1c\x16\xcd\xb6\x79\x2d\xed\x1b\x96\x22\xdd\xe6\xb0" + "\x64\xd2\x66\x8f\xdb\x8e\xdb\xfc\xcd\x56\xc7\x6d\xfe\xa6\x5c\x7e" + "\x9b\xbf\x89\x97\xdf\xe6\x6f\x26\x3b\x68\x33\xeb\xe7\x70\xf0\x73" + "\x98\x03\x3f\x87\xb1\x7e\xee\x76\xc9\x71\x9b\xff\xbe\xc1\x71\x9b" + "\xff\x7e\x5c\x7e\x9b\xff\x1e\x23\xbf\xcd\x7f\x1f\x27\xdd\xe6\x70" + "\xd6\xcf\xe1\xe0\xe7\x70\x07\x7e\x0e\x67\xfd\xec\xf3\x8d\xe3\x36" + "\x9f\xcd\x74\xdc\xe6\xb3\x87\xe4\xb7\xf9\xec\x04\xf9\x6d\x3e\x3b" + "\xd2\x41\x9b\x59\x3f\x6b\xc1\xcf\xe1\x0e\xfc\x1c\xce\xfa\x39\x6c" + "\xbd\xe3\x36\x9f\x5b\xea\xb8\xcd\xe7\xf6\xca\x6f\xf3\xb9\x08\xf9" + "\x6d\x3e\x17\x22\xdd\x66\x2d\xeb\x67\x2d\xf8\x59\xeb\xc0\xcf\x5a" + "\xd6\xcf\xaf\xfd\xc2\x71\x9b\xff\x91\xe4\xb8\xcd\xff\x28\x94\xdf" + "\xe6\x7f\x0c\x97\xdf\xe6\x7f\x04\x48\xb5\xb9\x09\xe2\xb6\x17\xb4" + "\xa5\xf9\x9f\x31\x2f\x9b\x7d\x43\x4d\x5e\x35\x88\x2a\x58\x65\x49" + "\xf4\xae\x45\x5d\xa0\x6d\x89\xf4\xe6\xf1\x21\xf8\xaf\xc5\x37\xd4" + "\xd8\xe4\x1b\xe6\xd9\xd8\xd3\x9c\xf3\xf6\x74\xd4\x09\xf3\xf1\x75" + "\x16\xe4\x6f\xc9\x0b\xad\xcf\x7a\x05\x69\xd2\x0d\x48\x5d\x91\xa6" + "\x47\x69\xc9\xb4\xa1\x02\x7d\x8f\xba\xd7\x62\xed\xf9\x2d\x2a\xab" + "\x2b\x45\x0b\x16\xd3\xf4\x15\xea\x9f\x57\xf1\xbc\x09\xf0\xe4\x8c" + "\x9c\x7f\x20\x0d\xdc\x23\x64\x07\xfc\x70\x3d\xde\x13\x60\xfc\xdc" + "\x3c\x7e\x58\x51\x1a\xf2\xff\x62\x6e\x2d\xc2\xc7\x0b\xe1\x67\xde" + "\x3c\x36\x2e\x6d\x3a\xa2\x0e\xdc\xae\xa6\xc8\xd8\xfc\xcf\x43\xb6" + "\x63\xf3\x84\x99\x60\xcb\x59\xf8\x5c\xb5\x5b\xc1\x2b\x72\x6d\xf9" + "\xcf\x0c\xeb\xd8\xcd\xd8\xf2\x82\x99\x8c\xf7\x36\x63\xf7\x17\x70" + "\x7f\xce\x96\xff\x4c\xc6\xb6\xa4\xf3\xc2\xd4\x95\xb5\x4d\x58\x37" + "\xa9\xaf\xe8\x10\x05\xc7\x35\x15\xc9\xb7\x91\xb8\x8d\xc3\xa2\x39" + "\x1b\x87\xa5\x7a\xd5\x78\xdc\x16\xb7\x71\x98\x0e\x6c\xbc\xd6\xde" + "\xc6\x61\x29\xce\xd9\xf8\x7c\xa4\xeb\x36\x3e\xdf\x5b\xda\xc6\xe7" + "\x13\xe4\xdb\xb8\xba\x46\xbe\x8d\xab\xcf\xb2\x36\xce\x11\xda\xb8" + "\x7a\xb5\x03\x1b\xf3\x70\x1c\x06\x38\xee\x76\x49\xc2\xc6\x80\xe3" + "\x70\x11\x1c\x87\x39\x89\xe3\x6f\x3f\x75\xdd\xc6\xdf\xae\x94\xb6" + "\xf1\xb7\xa7\xe4\xdb\xf8\xdb\x71\xf2\x6d\xfc\xad\x96\xd8\x38\xdc" + "\x06\xc7\xe7\x6b\xa5\x6d\x1c\xce\xc3\x71\x38\xe0\xd8\xe7\x1b\x71" + "\x1b\x87\x03\x8e\xc3\x45\x70\x1c\xee\x24\x8e\x2f\xf8\xb9\x6e\xe3" + "\x7f\x7d\x2f\x6d\xe3\x0b\x83\xe4\xdb\xf8\x5f\xfb\xe4\xdb\xf8\x5f" + "\x05\xac\x8d\x6d\x70\xfc\xaf\x09\x0e\x6c\xcc\xc3\x71\x38\xe0\x38" + "\x6c\xbd\x84\x8d\x01\xc7\x5a\x11\x1c\x87\x3b\x89\xe3\x8b\xcb\x5d" + "\xb7\xf1\xc5\x31\xd2\x36\xbe\x98\x2b\xdf\xc6\x17\xd5\xf2\x6d\x7c" + "\x11\x11\x1b\x6b\x6d\x70\x7c\xa1\x58\xda\xc6\x5a\x1e\x8e\xb5\x80" + "\xe3\xd7\x7e\x21\x6e\x63\x2d\xe0\x58\x2b\x82\x63\xad\x93\x38\xfe" + "\xf7\x45\xd7\x6d\xfc\xef\xbd\xd2\x36\xfe\xf7\x5d\xf9\x36\xfe\x77" + "\x8a\x7c\x1b\xff\x3b\x9e\xb5\xb1\x0d\x8e\xff\xed\x2b\x65\xe3\x66" + "\xd0\x80\xdd\xc1\xc6\xdd\xeb\x10\x55\x88\x6d\x5b\x4d\x6c\x6b\xee" + "\x35\x3e\xa4\x90\xb2\x24\x62\x9b\x30\x73\x40\x3f\xfa\xf7\x30\xe7" + "\x85\x9a\x68\x0a\xda\x94\x86\xe7\x5d\xbf\x9b\x6e\x5a\x85\x7a\x68" + "\xd2\xf0\xfc\xef\xf7\xcc\xfa\x58\x4d\xda\x3b\x17\xe1\x7e\x2a\x3c" + "\xef\x65\xca\x35\x25\x9b\xfd\x9e\x8f\xb8\x42\xe9\xf3\xe9\xc0\x67" + "\xf4\xa0\xbd\xd4\xf4\x9b\xfe\xbe\x95\x75\xc5\x60\x9f\xd3\xa8\xa2" + "\xfa\x73\x64\xe9\x35\x7e\xd8\x10\x13\x0a\xa2\x7f\x0c\xf2\x2d\x4b" + "\xd1\x23\xf3\x6c\x7f\xaf\x4a\x5d\x29\xaa\xd4\x7d\x86\xa2\x6a\xe9" + "\x7b\xf4\x7f\x82\xbc\x9a\xfd\xa2\x74\x66\xbf\xf1\x6a\x73\xfe\x54" + "\x4f\x93\x5f\x54\xe2\xfe\x65\x7a\xca\xcb\x88\x82\xe6\xd5\xd0\x74" + "\xf6\x2c\xe4\x9e\x7d\x09\x79\x6e\x9c\x85\xbc\x36\x5e\x42\xea\xb2" + "\x9a\x6a\x54\x7e\xad\x14\x95\xdf\x3e\x8f\xca\xef\xc1\xaf\x09\x7e" + "\x16\xf8\x65\x9c\x07\x5f\x23\x14\x79\x1d\xe1\xef\x8a\x1a\x9e\xbb" + "\x80\x7c\xcb\x4c\xd5\x08\xef\xe9\xbd\x41\xe9\x87\x7a\xc5\x21\x5f" + "\xfa\x3f\xfe\x88\x9e\xed\x4f\xc1\x39\x77\x7c\xbc\xd2\x64\x40\x65" + "\x35\x46\x7c\x5e\x0d\xe7\xdd\xd3\x6b\xa0\x7e\x4b\x29\xfe\x6e\xa8" + "\xa1\x2c\xe3\x14\xb4\x6f\x5f\x1c\x8d\x35\x74\xaf\xd0\xaa\x1c\x30" + "\xb5\x85\xf6\x7f\x8a\xe0\xe0\xfb\xf1\x3b\x2c\x72\x7d\xad\x8f\x63" + "\x6c\xfc\xa6\x7f\x4f\xb0\xf3\x13\x96\x37\x63\xd4\x13\xcf\x7f\x47" + "\xe3\x35\x7e\x78\x2e\xa1\xa2\xfe\x34\xc2\xef\x9a\xa2\x96\x23\x34" + "\xc1\x8c\x10\xb6\x45\xa5\xae\x16\x4d\x4c\x46\xde\x78\xfe\xd9\xf2" + "\x63\x50\xcf\xca\x1a\x03\x5a\x69\x82\x67\xbc\x61\xbc\xff\x8c\x15" + "\xab\x2b\x10\x9c\x7b\xa2\x22\x51\x8f\xbc\x92\x91\x1a\xdb\xd7\x94" + "\x17\x6a\x9c\x08\xfd\x67\x41\x3d\x4d\x63\xdb\x62\x9b\x62\xfb\xe2" + "\xfa\xac\x36\xaf\x8c\x37\xa0\x74\x23\x52\x57\xa6\xc1\x5f\x1d\x6d" + "\xa8\x44\xb7\x10\x3c\xe3\x68\xda\x67\x5f\x1c\xe0\x62\x38\xc6\x82" + "\x9e\xfa\x6e\x32\xf8\xbf\xa7\x38\xa6\xc2\x52\x08\xa6\x3c\x6e\xb7" + "\x8c\xa9\xb0\x54\x0e\x53\xdf\x7f\xca\x61\xea\x3f\x1b\xa4\x31\x75" + "\xe9\x2a\x8b\xa9\x9c\x8e\x89\xa9\x4b\x6b\x1c\x63\xea\x52\xbc\x03" + "\x4c\xad\xa5\x7b\x85\x45\x0b\x31\xf5\x9f\x42\xf9\x98\xba\x74\xb0" + "\xfd\x30\x15\xa6\x53\x86\xa9\x4b\x5b\x84\x98\xfa\x7e\x8f\x03\x4c" + "\xb1\x71\xaa\xdb\x25\x27\x30\xc5\x8b\x53\x35\x1e\x1c\xa6\x2e\x7f" + "\x2f\x8d\xa9\xcb\x2f\x10\x4c\x85\x77\xd0\x38\x55\x73\xde\x31\xa6" + "\x6a\x0e\x4b\x63\x2a\x1c\xe2\x54\x98\x4d\x9c\xba\x7c\x4b\x3e\xa6" + "\x2e\x7b\xb6\x23\xa6\x14\xc6\xa9\x9a\x3a\x21\xa6\xfe\x63\x92\xc6" + "\x54\x38\x1b\xa7\x7c\xbe\x69\x19\x53\xe1\xbc\x38\x75\x65\x2a\x87" + "\xa9\xda\x50\x69\x4c\xfd\x90\xcb\x62\xaa\x83\xc6\xa9\x1f\x06\x39" + "\xc6\xd4\x0f\x5e\x0e\x30\x05\x71\x2a\xdc\x26\x4e\xd5\x8e\x91\x8f" + "\xa9\x1f\x62\xdb\x0f\x53\xe1\x0a\xe3\xd4\x0f\x11\x42\x4c\x5d\x89" + "\x76\x80\x29\x36\x4e\x85\xad\x77\x02\x53\xbc\x38\x55\xbb\x9f\xc3" + "\xd4\xb5\x75\xd2\x98\xba\x7a\x99\x60\x4a\xdb\x41\xe3\xd4\xd5\x4c" + "\xc7\x98\xba\x1a\x27\x8d\x29\x2d\xc4\xa9\x70\x9b\x38\x75\x6d\xab" + "\x7c\x4c\x5d\x2d\x6e\x47\x4c\x29\x8c\x53\x57\xf3\x84\x98\xaa\xdd" + "\x25\x8d\x29\x2d\x1b\xa7\x5e\xfb\x45\xcb\x98\xd2\xf2\xe2\xd4\x8f" + "\x6e\x1c\xa6\xea\x2e\x4a\x63\xaa\x6e\x04\x8b\xa9\x0e\x1a\xa7\x7e" + "\x3c\xe7\x18\x53\x3f\x1e\x74\x80\x29\x88\x53\x5a\x9b\x38\x55\x77" + "\x5d\x3e\xa6\xea\xdc\xdb\x0f\x53\x5a\x85\x71\xea\xc7\x5a\x21\xa6" + "\xae\x19\xa5\x30\xd5\x84\x75\x9f\x1b\x60\x2a\x11\x74\x1f\x60\xc8" + "\xbb\x8a\x60\xaa\x19\x30\xb5\x9d\x8f\xa9\x7f\xd9\xea\xbe\xeb\x53" + "\x2c\xf7\x31\x75\x73\xa6\x2d\xa6\x2c\x80\xa9\x66\x06\x53\x37\x96" + "\x5b\x75\x5f\x65\xdd\x4e\xf0\xd5\x35\x54\x19\x0d\x78\xda\xcc\xe2" + "\xe9\x5f\x80\x27\x68\x8f\x05\xda\x5b\x76\xa1\x1a\x45\x19\x48\xbb" + "\x9a\xa0\xbd\x16\x3e\x96\x9a\x6a\x29\x8c\x21\x8c\x1d\x2b\x8e\xca" + "\x17\x00\x7e\x16\x9f\x41\xe5\xcb\xe0\xb7\x02\x7e\x69\xf0\x43\x67" + "\x50\x59\x2d\x62\xe6\xec\x39\xfc\x54\xb1\xf8\xb9\xe1\xe7\x18\x3f" + "\xd7\xeb\xe5\x69\xbc\x9b\x8b\xe4\xe3\xe7\xc6\x68\x76\x2d\x9d\x3a" + "\x6a\xd2\x77\x34\x5e\x37\x4b\x30\x72\x0d\x45\x99\x90\x37\xfd\x5a" + "\x50\x4f\xaf\x18\xa4\x7e\xdb\x8c\xa8\x0d\xb3\x90\x7a\xc3\xb7\xd0" + "\x5e\x6b\xdf\xb9\x84\xbc\x4e\x1b\x3f\x47\x65\xb7\xab\x51\xd9\xbd" + "\x53\xa8\xcc\x02\xbf\x6b\xf0\x83\x67\x8c\x4a\xe0\xb7\xd7\xc0\xb6" + "\xf7\xa6\x07\xd4\x15\x20\xdd\xde\x1b\x35\x4c\x7b\xe3\xa1\xbd\x4d" + "\x5c\x7b\x2b\x01\x8b\xe0\x97\x27\x2c\xac\x4e\x8c\x32\xa0\x2e\x0b" + "\x4d\x34\xdd\xc4\x62\x10\xfb\xe5\xf4\x59\x23\x8a\x4a\x06\x5f\xcd" + "\x06\x0c\xd6\xec\x41\xe9\xa9\x80\xc1\x26\x23\x7e\xaf\x6f\xa8\xcc" + "\x68\x04\x0c\xde\x08\xa2\xc1\x6e\xcd\x18\x83\xff\xc2\x18\xbc\x3e" + "\xc1\x22\x89\x41\xd0\x89\x0c\x06\x41\x27\xb6\x88\x41\xbe\x4e\xbc" + "\x79\x9e\xc3\xe0\xad\xcb\xd2\x18\x34\x98\xad\x3a\xf1\xbf\x8f\x41" + "\xc3\x56\xc7\x18\x34\xe8\xe4\x69\xc2\x5b\x77\xe5\x63\xd0\x50\xda" + "\x7e\x18\xbc\xb5\xce\x31\x06\x6f\x25\xb6\x8c\xc1\x30\x9d\x32\x0c" + "\x1a\xf6\x09\x31\x78\xb3\xca\x01\x06\xd9\x38\x08\xba\xb2\x65\x0c" + "\xf2\xe2\xe0\xed\xe9\x1c\x06\xeb\x93\xa4\x31\x78\x27\xd3\xaa\x2b" + "\xff\xfb\x18\xbc\xf3\xa4\x63\x0c\xde\x36\xc9\xd3\x90\xf5\xcb\xe5" + "\x63\xf0\xce\x84\xf6\xc3\x60\x7d\x77\xc7\x18\xbc\x53\xe7\x04\x06" + "\x15\xc6\xc1\x3b\x21\x42\x0c\xde\x9e\x2c\x8d\xc1\x70\x36\x0e\x82" + "\x0e\x6d\x11\x83\x7c\x1d\x5a\xff\x3d\x87\xc1\x7b\xd7\xa5\x31\x78" + "\xcf\xc3\xaa\x43\xff\xfb\x18\xbc\xfb\xbe\x63\x0c\xde\xcd\x90\xa7" + "\x39\xef\x99\xe5\x63\xf0\x6e\x55\xfb\x61\xf0\x5e\xae\x63\x0c\xde" + "\x4b\x6e\x19\x83\xe1\x0a\xe3\xe0\xdd\x83\x42\x0c\xd6\x57\x3b\xc0" + "\x20\x1b\x07\x41\xb7\xb6\x8c\x41\x5e\x1c\x6c\x48\xe0\x30\xd8\xb8" + "\x48\x1a\x83\xc6\x75\x56\xdd\xfa\xdf\xc7\xa0\x31\xd0\x31\x06\x8d" + "\xee\xf2\x34\x6a\x63\xa6\x7c\x0c\x1a\x27\xb7\x1f\x06\x1b\xfd\x1c" + "\x63\xd0\x58\xef\x04\x06\x15\xc6\x41\xa3\x56\x88\xc1\x86\x58\x69" + "\x0c\x6a\xd9\x38\x08\x3a\xb7\x45\x0c\xf2\x75\x6e\xe3\x55\x0e\x83" + "\xcd\x77\xa5\x31\xd8\xdc\xdd\xaa\x73\xff\xfb\x18\x6c\xda\xeb\x18" + "\x83\x4d\x6b\xe5\x69\x5a\x93\x87\x7c\x0c\x36\x55\xb7\x1f\x06\x9b" + "\xb7\x3a\xc6\x60\xb3\xae\x65\x0c\x6a\x15\xc6\xc1\xa6\xa3\x42\x0c" + "\x36\xea\xa5\x30\x68\x01\x5d\xdc\xbc\xeb\x19\xbd\x25\x2f\x4a\xe7" + "\xed\xa6\x41\x26\xdf\xe7\x23\x2a\x53\xea\xd1\xc4\xbb\x60\x9f\xe4" + "\xbb\xe8\xf5\xbb\x6a\x64\xce\x8b\x4a\xa4\x41\x1f\xf1\xf4\x33\xb3" + "\xb6\xcc\x94\xb3\x2f\x6e\xe3\x02\xe4\x0e\xfa\x7b\x18\x3e\x56\x79" + "\xc5\x88\xf0\xfd\x57\xe2\xe7\xb9\xc6\x3d\x0f\x9e\x27\xa0\x6f\x06" + "\xa9\x99\x77\xcc\x4d\x7a\x54\x33\x12\xa9\xca\x6a\xf4\x60\x87\x15" + "\x8c\x7f\xb1\x5d\xc0\x9f\xd5\x45\x37\x90\xbb\xe9\x3f\xfe\x4f\x80" + "\xbd\x7d\xbb\xbf\x85\xdc\xfa\xd4\xd0\x16\x6c\x57\x6c\x2f\x6c\x63" + "\xcd\x0a\xfc\xee\xda\x3c\xb0\x02\x30\x66\xfa\x4f\xd0\x13\x3b\xa0" + "\x9c\xb8\x5e\x35\x0f\x95\x8f\x0d\x53\x3d\xd9\xb7\x60\xaa\x2a\xbb" + "\x80\x44\xdf\x1d\x5b\x40\xbf\x39\x67\xab\x30\x1d\x4f\xe7\xb5\x81" + "\xad\x2c\xee\xce\xd9\xca\x32\xc5\xc6\x56\x22\xba\xca\x32\x5d\xbe" + "\xad\x2c\x1a\x62\x2b\xb3\xc9\x81\xad\x9c\xc4\x55\x98\x91\xa7\x47" + "\xda\xc0\x56\x74\x88\x73\xb6\xa2\x33\x85\xb6\x12\xe3\xff\xf4\x3a" + "\xf9\xb6\xa2\xd9\x5c\xa0\x74\x90\xb4\xad\xc2\x9d\xc4\x55\xb8\x8e" + "\xc7\x9b\x5b\xdf\x56\x2a\x14\xeb\x94\xad\x54\x68\xbf\x8d\xad\xec" + "\x79\xaa\x0a\x1d\x92\x6d\x2b\x15\x22\xdf\xc3\x53\xa1\xc9\x0e\x6c" + "\xe5\x24\xae\xc2\x8d\x3c\x7e\xd7\x06\xb6\x72\x5b\xeb\x9c\xad\xdc" + "\xce\x0b\x6d\x25\xc2\xa7\x54\x6e\xdf\xcb\xb7\x95\xdb\x2e\x62\x2b" + "\xb7\x0c\x69\x5b\x69\x9d\xc4\x95\x56\xc7\xe3\x21\x6d\x60\x2b\xea" + "\xa0\x73\xb6\x52\x79\xd8\xd8\xca\x7e\xdc\x57\xa9\xba\xcb\xb7\x15" + "\x55\x45\x6c\x45\xed\x93\xb2\x95\x39\x2f\xb4\xde\x1b\x6c\xd0\xb8" + "\x39\xb4\xca\x5b\x87\xa8\xa6\x00\xb0\x9b\x2f\xd8\x2d\x53\x83\x9a" + "\xf3\xc0\x6e\x06\x13\x9a\xb8\xe8\x3b\xba\xa2\xce\x8c\x9a\xc0\x66" + "\x8d\xbe\xa1\xc6\x4a\x43\x2d\x5e\x73\xf4\xb3\x4b\x2a\xf7\xeb\xaf" + "\x2d\x52\x23\x6c\x37\x6c\x07\x6c\x3b\x1a\xec\xc6\xd8\xd1\x77\xaa" + "\xa7\xd9\x77\xbc\x3a\xf2\xfa\x77\xf4\x42\x3d\x4d\xe3\xf6\xd2\x6a" + "\x53\x32\x7e\x2f\x10\x55\x8b\xba\x68\x5e\xc1\x6d\x72\x2f\xc4\xc7" + "\x2b\x0d\xd5\xc0\x0f\x6e\x23\x86\x9b\x7d\x17\xe4\x6b\xfe\x4d\x90" + "\x97\xb9\x32\xe6\x65\xba\xa7\x39\xc7\xd4\x6b\x6c\x5c\xfa\x75\xd4" + "\x09\xf3\x87\x6c\x0b\xf2\x5f\x39\x1f\x51\x07\xe6\x96\x50\xcc\xde" + "\xb5\xc5\x4c\x1d\x49\x60\x17\x7f\xfa\x0e\x6f\x4d\xf7\x9d\x44\x54" + "\x79\x25\x87\xf1\x9b\x2d\x47\x60\xfc\xf6\xcf\x20\x35\xf0\xcc\x10" + "\xda\x37\xcc\x33\xa7\x02\x69\xe8\x66\xb0\x31\xde\x4f\xa4\xf2\x98" + "\x52\xd4\x24\xd7\xc6\xee\xcc\xfa\x6f\x8b\x86\x5d\xbf\x05\x76\xc2" + "\xf7\x67\xd6\x6f\x25\xf3\xd6\x6f\xc1\x33\xdf\x5f\xbf\xa5\x52\x19" + "\xf1\xfa\x2d\xcb\x77\xfe\x4f\x58\xdb\xbe\x70\x1e\x4d\x43\xdb\x7b" + "\x56\xd4\x1b\x10\x6e\x7f\x45\x7d\x09\x4a\x4f\x41\xea\x8a\xa6\x5a" + "\x94\x56\x4f\x1b\x2a\x32\xae\xa2\xa8\xbb\x98\x07\x63\xbc\xb8\x5f" + "\x26\x7e\x55\x1d\xb6\x7c\x17\xf4\x04\x3c\xc3\x85\x0a\xf0\x34\x6f" + "\x1f\x4f\x22\x70\x66\x4f\xf0\x43\x62\x65\xc6\x25\x04\x3e\xc9\xa9" + "\x34\x7d\x8b\xfd\x94\x08\xe7\x47\xde\xe7\xd7\xbd\xc6\x6f\xc2\xc7" + "\xb0\xcf\xf0\xfb\x26\x9c\x3b\xa0\x88\xc7\xbf\x31\x2e\xbc\x75\x19" + "\xa8\x52\xd7\x84\x2a\x4c\x08\xc1\xfd\xe2\xbf\x8e\xa9\x96\xc0\x51" + "\x58\x0a\xc1\x51\x58\xb4\xb7\xce\xe3\x76\xcb\x38\x0a\xd3\x71\x38" + "\xea\x1c\xea\x1a\x8e\x3a\x5d\x76\x1d\x47\x9d\x3e\x75\x01\x47\x6b" + "\x85\x38\xea\x5c\x28\x1f\x47\x9d\x52\xe5\xe3\xa8\x53\x84\x6b\x38" + "\xea\x3c\x88\xe0\xa8\x13\x22\x38\xea\x1c\xc0\xe1\x88\xd9\x1b\xd5" + "\x46\x38\xf2\xd8\xe7\x00\x47\x6c\x3c\x0a\x83\x78\xd4\xed\x92\x13" + "\x38\xe2\xc5\xa3\x2e\x2b\x5d\xc3\x51\x97\x41\xae\xe3\xc8\xb3\x51" + "\x39\x8e\xc2\x6d\xe2\x51\x97\xcb\xf2\x71\xe4\x79\x42\x3e\x8e\x3c" + "\xd7\xba\x86\xa3\x2e\x4b\x09\x8e\x3c\xc7\x11\x1c\x75\x99\xc7\xe1" + "\x88\xd9\x6f\xd6\x46\x38\xea\x5c\x2f\x8d\xa3\x70\x36\x1e\x85\x43" + "\x3c\xf2\xf9\xa6\x65\x1c\x85\xf3\xe2\x51\xb7\x93\xae\xe1\xa8\xdb" + "\x52\xd7\x71\xd4\x6d\x94\x0b\x38\xb2\x89\x47\x5e\x83\xe4\xe3\xa8" + "\x9b\x97\x7c\x1c\x75\xad\x72\x0d\x47\xdd\x8e\x11\x1c\x75\xcd\x21" + "\x38\xea\x76\x90\xc3\x11\xb3\x87\xaf\x8d\x70\xd4\x75\xa4\x03\x1c" + "\xb1\xf1\x28\x1c\xe2\x51\xd8\x7a\x27\x70\xc4\x8b\x47\x3d\xba\xbb" + "\x86\xa3\xee\xc7\x5c\xc7\x51\xf7\x75\xca\x71\xa4\xb5\x89\x47\x3d" + "\x96\xca\xc7\x51\xf7\xc9\xf2\x71\xd4\xdd\xdf\x35\x1c\xf5\xf0\x20" + "\x38\xf2\xaa\x26\x38\xea\x6e\xe2\x70\xc4\xec\x8b\x6c\x23\x1c\x79" + "\xad\x96\xc6\x91\x96\x8d\x47\x5a\x88\x47\xaf\xfd\xa2\x65\x1c\x69" + "\x79\xf1\x48\x3d\xc5\x35\x1c\xa9\x3d\x5c\xc7\x91\xf7\x19\x17\x70" + "\x64\x13\x8f\xd4\xc7\xe4\xe3\xc8\xbb\x40\x3e\x8e\xbc\xe3\x5c\xc3" + "\x91\x3a\x92\xe0\xc8\x5b\x43\x70\xa4\x1e\xcd\xe1\x88\xd9\x6b\xda" + "\x46\x38\xea\x51\x26\x85\x23\x9c\x8b\xe0\x3d\x92\x17\xa2\x7e\xe3" + "\x0a\xa4\x2d\xc2\x7f\x9b\x50\x48\x43\xb6\xba\xfe\x78\x2a\xc9\x07" + "\x00\xcf\xc9\xcc\xf7\x8a\x5d\xdf\x6d\x2f\xf8\xc5\x37\xd4\x10\x75" + "\x91\xe4\x68\xc0\x79\x41\xee\xa4\x27\xa2\x21\x38\x2f\x83\xaa\x67" + "\x30\xce\x63\x75\x3f\x77\x80\xaf\x44\xee\x80\x69\xd2\xb9\x03\x9a" + "\x36\x5b\xf7\xdd\xee\xe1\xf6\xdd\xaa\x7c\x1a\x1d\xee\xbb\x55\xf9" + "\x7c\x5f\x38\x4d\x2e\x1e\x7c\x98\xfd\x5f\x77\x7a\x85\x56\x35\x64" + "\xfb\x18\xa0\xcd\xa5\xa4\xed\x3d\x99\xfc\xc1\x2d\xef\xc7\xdd\xc3" + "\xc3\x89\x4f\xc1\x94\x58\x94\x41\xaf\xaf\x32\xd0\x7e\xa1\x06\x3a" + "\x3f\x4c\x5e\xfe\x2c\x55\x4f\xc9\xef\x1f\x12\x7b\x87\x25\x8b\xdb" + "\xfb\xb1\x02\x62\x6f\x36\x6f\x81\xaf\x44\xde\x82\x69\xd2\x79\x0b" + "\xc4\xed\xfd\x98\xe3\x7d\xce\xaa\xc7\x26\xc9\xb7\xf7\x63\x7d\x88" + "\xbd\xc3\xa2\x1b\xb2\x1f\x8b\xe3\xec\xfd\xd8\x05\xf9\xf6\x7e\xcc" + "\x8b\xd8\xfb\x4c\x0d\xed\x17\x96\x0c\xf6\xce\x90\xf9\x2c\x92\xf9" + "\xbf\x59\x7b\x4b\xe0\xdb\xcf\x8b\xb5\x37\x8b\x6f\x89\x9c\x09\xd3" + "\xa4\x73\x26\x88\xdb\xdb\xf7\xbc\x63\x7b\xfb\x1e\x97\x6f\x6f\xdf" + "\x2c\xd6\xde\x80\x6f\xdf\x2a\xce\xde\x7e\x4e\xe6\x15\xe0\xdb\xdb" + "\x37\x95\xd8\xfb\x9b\x6a\xb0\x37\xe0\x3b\x5c\x26\xbe\xfd\xfc\x1d" + "\xdb\x3b\x5c\x02\xdf\xbd\x52\x89\xbd\xd9\x7c\x0d\xbe\x12\xf9\x1a" + "\xa6\x49\xe7\x6b\x10\xb7\x77\xaf\xf1\x8e\xed\xdd\x6b\xa8\x7c\x7b" + "\xfb\x99\x88\xbd\xc3\x01\xdf\xbd\x22\x38\x7b\xf7\x3a\x2a\xdf\xde" + "\x7e\x75\xc4\xde\x7f\x2f\xa3\xfd\xc2\x01\xdf\xe1\x32\xf1\xdd\x6b" + "\x6d\x0b\xf6\x96\xc0\xf7\xe3\x75\xac\xbd\x59\x7c\x4b\xe4\x8a\x98" + "\x26\x9d\x2b\x42\xdc\xde\x8f\x1f\x71\x6c\xef\xc7\xdf\x97\x6f\xef" + "\xc7\xe7\xb1\xf6\x06\x7c\x3f\x5e\xcc\xd9\xdb\x3f\x58\xbe\xbd\x1f" + "\x8f\x25\xf6\x3e\x5b\x02\xf6\x06\x7c\x6b\x65\xe2\xfb\x71\xa3\x63" + "\x7b\x6b\x25\xf0\xdd\x3b\x96\xd8\x9b\xcd\x53\xe1\x2b\x91\xa7\x62" + "\x9a\x74\x9e\x0a\x71\x7b\xf7\x1e\xe8\xd8\xde\xbd\x7d\xe4\xdb\xdb" + "\xff\x02\xb1\xb7\x16\xf0\xdd\x5b\xc3\xd9\xbb\x77\x81\x7c\x7b\xfb" + "\x97\x11\x7b\x9f\x3b\x48\xfb\x69\x01\xdf\x5a\x99\xf8\xee\x9d\x28" + "\x65\x6f\x6f\xb0\xf7\x49\xe0\x31\xc0\x3b\x8c\x96\x3c\xe0\x29\x66" + "\xa1\xdd\x2b\x75\x5a\x34\xf8\x1e\xb6\xfd\x4f\xc6\xc1\x58\x6d\x6c" + "\xb7\x7c\x19\xaa\x9f\x0c\x75\x79\xef\xb0\xea\x09\xb3\xe4\xde\x61" + "\xd5\x13\x97\x65\xef\x1d\x56\x3d\x51\xcc\x71\xa0\x27\xea\x39\x9f" + "\xfe\x84\x89\x1f\xb2\xf6\x14\xab\x9e\xd8\x29\x9a\x47\x43\xf5\x44" + "\x34\xde\x53\x4c\xaf\xff\xc7\x1e\x4b\xbe\x12\x6e\xf4\x93\xc9\x2d" + "\xfb\x3a\x4c\x67\xc9\x03\x8e\x24\xe9\xeb\x27\x87\xc3\xb8\xa5\x6b" + "\xb7\xbc\x1d\xaa\x27\x9f\x74\xdd\xd7\x7d\xae\x4a\xfb\xba\xcf\x19" + "\xf9\xbe\xee\x53\xc0\xf1\xaf\x3e\x7a\xce\xd7\x4f\xca\xdf\x3f\xae" + "\xea\x93\x25\x9a\xcf\x43\xd5\x67\x24\xf1\x75\xb5\x97\x25\x5f\x09" + "\x2f\x7b\x32\xc2\x09\x5f\x43\xbf\x0e\x73\xd0\xaf\xfb\x69\xc0\xd7" + "\xc6\x76\xcb\x1f\xa2\xea\xd7\xc5\x75\x5f\xf7\x3d\x27\xed\xeb\xbe" + "\xc7\xe4\xfb\xba\xef\x5a\x8e\xfb\xf5\x2d\xe3\x7c\xdd\x2f\x4e\xbe" + "\xaf\xfb\xea\x44\xf3\x8a\xa8\xfa\x06\x11\x5f\x9f\x4f\x06\x5f\x2b" + "\xe0\x84\xfd\x82\x5b\xf6\x75\x38\xf4\xeb\x70\x07\xfd\xba\xbf\x17" + "\x8c\xd7\xba\x76\xcb\x63\xa2\xd2\xdc\x75\xdd\xd7\x9a\xe3\xd2\xbe" + "\xd6\xec\x95\xef\x6b\x4d\x0a\xc7\x3b\x35\x87\x39\x5f\xf7\x9f\x20" + "\xdf\xd7\x9a\x78\xd1\xfc\x26\x2a\x8d\x2f\xf1\xf5\xb7\x67\x2d\xf9" + "\x4a\xf8\x68\x7f\x49\xfe\xcf\xf3\x35\xf4\xeb\x70\x07\xfd\xfa\x29" + "\x23\xf8\xda\xd8\x6e\xf9\x54\x54\x4f\x7d\xef\xba\xaf\x9f\xda\x2f" + "\xed\xeb\xa7\xf2\xe5\xfb\xfa\xa9\x38\x8e\xf3\x3e\xb5\x8b\xf3\xf5" + "\xd3\x5a\xf9\xbe\x7e\x2a\x5a\x34\xcf\x8a\xea\x29\x44\x7c\x7d\x41" + "\x0b\xbe\x56\xc0\x85\x9f\x76\x6f\xd9\xd7\x5a\xe8\xd7\x5a\x07\xfd" + "\x3a\x00\x74\xbd\x56\xd7\x6e\x79\x5d\x54\x01\xe5\xae\xfb\x3a\x60" + "\xab\xb4\xaf\x03\x32\xe5\xfb\x3a\x60\x02\xc7\xb7\x03\x72\x38\x5f" + "\x07\x06\xc8\xf7\x75\xc0\x48\xd1\x7c\x2f\xaa\xa7\xeb\x88\xaf\x2f" + "\x16\x58\xf2\x95\xf0\xf0\x00\x83\x12\x1e\xbe\xa4\x10\x79\x0a\xfd" + "\x3d\xe0\x6c\xfb\x72\xf1\x01\xc7\x5c\xf7\xf7\x80\x75\xd2\xfe\x1e" + "\xb0\x48\xbe\xbf\x07\x8c\xe4\xb8\xf8\x80\x0c\xce\xdf\xcf\xf8\xca" + "\xf7\xf7\x80\x60\x71\x2e\x1e\x78\xc1\x35\x2e\x3e\x40\xaf\x84\x8b" + "\xdb\xfb\x3b\xe8\x44\xfb\xf2\xf1\xa0\xfd\xae\xfb\x3b\x68\xb9\xb4" + "\xbf\x83\x66\xca\xf7\x77\x50\x30\xc7\xc7\x83\x92\x39\x7f\x0f\x74" + "\x97\xef\xef\xa0\x3e\xe2\x7c\xfc\x99\x32\xd7\xf8\x78\x90\x64\xbe" + "\x70\x47\x7c\xdc\xde\xdf\xcf\x1e\x6c\x5f\x4e\xfe\x6c\xa1\xeb\xfe" + "\x7e\x36\x49\xda\xdf\xcf\x4e\x92\xef\xef\x67\xfb\x70\x9c\xfc\x59" + "\xde\xfc\xf7\xb3\xf5\xf2\xfd\xfd\xac\x97\x38\x27\x1f\x78\xd4\x35" + "\x4e\xfe\x6c\x89\x12\x4e\x6e\xef\xef\xe0\x5d\xed\xcb\xcb\x83\x37" + "\xb8\xee\xef\xe0\xa9\xd2\xfe\x0e\x1e\x25\xdf\xdf\xc1\x5e\x1c\x2f" + "\x0f\x8e\xe6\xfc\x1d\x2c\x3f\x7f\xa6\xea\x39\x93\x38\x2f\x7f\x6e" + "\x9f\x6b\xbc\x3c\xb8\x58\x09\x2f\xb7\xf7\xf7\xe0\xbc\xf6\xe5\xe6" + "\x83\x57\xba\xee\xef\xc1\xe3\xa5\xfd\x3d\x78\xa8\x7c\x7f\x0f\x32" + "\x71\xdc\x7c\x30\x6f\xfe\x7f\xf0\x59\xf9\xfe\x1e\x54\x27\xce\xcd" + "\x07\x15\xb8\xc6\xcd\x07\xef\x54\xc2\xcd\xed\xfd\x1d\xb2\xba\x7d" + "\xf9\x79\xc8\x7c\xd7\xfd\x1d\x32\x42\xda\xdf\x21\xfd\xe5\xfb\x7b" + "\x48\x1d\xc7\xcf\x43\x42\x38\x7f\x87\x9c\x90\xef\xef\x21\x17\xc4" + "\xf9\xf9\x90\x2c\xd7\xf8\x79\x48\x8e\xeb\xf3\xe4\x3f\x8d\xc3\xdc" + "\x5c\x6e\xfe\xc7\xca\x14\x76\xcf\x9d\x6a\x28\x97\xff\x51\xf5\x53" + "\xe6\xdb\x2a\xa2\xb9\x65\x54\xc3\xf6\x77\xe8\xfc\x8f\xaa\x61\x8e" + "\xf3\x3f\xaa\x86\xc9\xcb\xff\xa8\x1a\x96\x2f\x7f\x3d\xfe\xb0\x38" + "\x4e\x23\x0c\xe3\xe9\xff\x9f\x32\xfd\xba\x43\xe7\x85\x54\x0d\x13" + "\xe6\x85\x54\x0d\x65\xf2\x42\xd2\xeb\xbf\x43\xca\xb4\xc8\x4f\xe7" + "\xb9\xfe\x5e\x20\x6c\x24\xd6\x21\x72\xf3\x50\x72\xd8\x1e\x3e\x82" + "\xc3\x76\xd8\x20\x69\x6c\x87\xae\xeb\xd0\x79\x28\x55\xa1\xdd\x1d" + "\x63\x7b\x78\x9d\xac\x9c\x23\xaa\x50\xf9\x79\x6f\x54\xa1\x23\x39" + "\x3d\x14\xca\xd3\xbf\x61\xa9\xed\x87\x6d\x85\xf9\x29\x55\xa1\x1a" + "\x21\xb6\x87\x87\x10\x6c\x7f\x3f\x59\x99\xee\x0a\x1b\xe7\xfa\x7b" + "\x90\x11\xfe\x58\x73\xc9\xcd\x87\xc9\x61\x3b\xdc\x8f\xc3\xf6\x88" + "\x2e\xd2\xd8\xd6\x26\x74\xe8\x7c\x98\xaa\xf0\xab\x8e\xb1\x1d\x5e" + "\x2a\x2b\x97\x89\x4a\x1b\x29\x1f\xdb\x5a\x7f\x4e\xfb\x69\x63\x39" + "\x6c\x8f\x88\x69\x47\x6c\x2b\x8c\xdb\xe1\x26\x21\xb6\xc3\xbd\x08" + "\xb6\xff\xb3\x47\x99\xc6\x1c\x11\xe0\xfa\x7b\x9f\x9f\xd5\x63\x7d" + "\x29\x37\x2f\x27\x87\xed\x11\xb7\x38\x6c\xff\xcc\x2e\x2f\x14\x87" + "\xed\x9f\x8d\xea\xd0\x79\x39\x55\xcf\x9f\x74\x8c\xed\xe7\x77\xc9" + "\xca\x91\xa2\xfa\xd9\x40\xf9\xd8\x7e\xbe\x9e\xd3\xb9\x3f\xd3\x72" + "\xd8\x1e\x39\xbc\xfd\xb0\xad\x30\x5f\xa7\xea\xf9\x6a\x21\xb6\x47" + "\xd4\x12\x6c\x5f\x36\x29\xd3\xd3\x78\x08\x73\xf5\x3d\xd7\x8b\x55" + "\x58\x4b\xcb\xcd\x0f\xca\x61\x7b\x64\x39\x87\xed\x17\x8f\x4b\x63" + "\xfb\xc5\x27\x3b\x74\x7e\x50\xd5\x0b\x8e\xf3\xff\xa8\x5e\x70\x90" + "\xff\x47\x6c\xaf\xf0\x8b\xf2\xf3\x5e\xa8\x5e\xa8\xe2\x34\xfd\x8b" + "\xbe\x1c\xb6\x7f\xae\x6e\x47\x6c\x2b\x8c\xdb\x2f\x1c\x14\x62\x7b" + "\xe4\x09\x82\xed\xda\x68\x65\x73\x07\x2f\x5e\x70\xfd\xbd\xde\xa8" + "\x7d\x78\xde\x40\x6e\x9e\x52\x0e\xdb\x3f\xdf\xcb\x61\x7b\x54\xa1" + "\x34\xb6\x23\x1a\x3b\x74\x9e\x52\x55\xc4\x4a\xc7\xd8\x8e\x88\x95" + "\x95\xd3\x45\x15\xa1\x60\x1f\x7c\xc4\x3e\x6e\xfe\x22\x82\xb7\xfe" + "\x7d\x54\x5d\xfb\x61\x5b\x61\xfe\x52\x55\x44\x8e\x10\xdb\x3f\xdf" + "\x49\xb0\x7d\x6d\x97\xb2\x79\x92\x51\x87\x5d\x9f\x27\x19\x7d\x98" + "\x79\x87\x29\x33\x5f\x2a\x87\xed\x5f\xac\xb9\x9f\x9b\x48\x35\x7a" + "\xaf\x2d\xb6\xef\xe7\x26\x52\xbd\x74\xbc\xc3\xe4\x4b\x55\xbd\x34" + "\xc6\x31\x8e\x5f\x0a\x90\x37\x27\xf2\xd2\x5e\xf9\x38\x7e\x29\x85" + "\x9b\x13\x79\x89\xb7\xfe\x65\xb4\xf5\x9b\xe4\x6d\x9f\xb3\x48\x35" + "\x3a\xd2\x61\xce\x22\xd5\xe8\xe0\x36\xcb\xa3\xaa\x7a\x29\x46\x90" + "\xb3\x48\xf5\x8b\x54\x0b\xd3\x17\xea\x8c\xca\xe6\x55\x46\x9f\x70" + "\x7d\x5e\xe5\x65\xf2\x7e\x57\x66\xde\x56\xae\x2f\x8c\xc9\xe5\xfa" + "\xc2\xcb\x87\xa4\xfb\xc2\xd8\xf2\x0e\x93\xb7\x55\x35\x76\x92\xe3" + "\xbe\x30\x36\x44\xde\x1c\xca\x58\x05\x79\x60\xc6\x66\x70\x73\x28" + "\x63\x4f\x70\x7d\x61\x9c\x7b\xfb\xf5\x85\x97\xa7\x3a\xee\x0b\x2f" + "\x6b\xdb\x2c\x9f\xab\x6a\x6c\xbc\xb0\x2f\x8c\x59\x4b\xfa\xc2\xcd" + "\x54\x65\xf3\x30\x2f\x2b\x7a\xff\x2d\xec\x0b\xbf\xac\x62\xde\x7d" + "\xcb\xcc\x1f\xcb\xf5\x85\x71\x85\x5c\x5f\xf8\xa5\x1d\x9f\xe7\xfa" + "\xc2\xf8\xf3\x1d\x26\x7f\xac\x6a\xfc\x74\xc7\x7d\x61\xfc\x48\x79" + "\x73\x2e\xe3\x8f\xcb\xef\x0b\xe3\x79\xfb\x9f\xc6\xf3\xf6\x3f\xfd" + "\x4a\xdd\x7e\x7d\xe1\x97\x09\x8e\xfb\xc2\x2f\x47\xb7\x59\x5e\x59" + "\xd5\xf8\x64\x61\x5f\x18\x97\x47\xfa\xc2\x6d\xa4\x6c\xde\xe6\x97" + "\x4e\xf0\xff\x96\xe6\x6d\x22\x2f\x30\xeb\x02\x64\xe6\xb1\xe5\xfa" + "\xc2\xaf\xf6\x72\x7d\x21\xb2\x5c\xba\x2f\x4c\xb8\xdc\x61\xf2\xd8" + "\xaa\x26\x24\x39\xee\x0b\x13\xc6\xc9\x9b\xa3\x99\x50\x2e\xbf\x2f" + "\x4c\xd8\xc2\xcd\xd1\x4c\xb8\xc0\xf5\x85\x89\x7d\xda\xaf\x2f\x44" + "\x2e\x72\xdc\x17\x22\xa3\xdb\x2c\xbf\xad\x6a\x42\xaa\xb0\x2f\xfc" + "\x6a\x27\xe9\x0b\xf5\xab\x95\xcd\xf3\x44\xd6\xba\x3e\xcf\x13\x5d" + "\xcb\xac\x99\x90\x99\x4f\x97\xeb\x0b\x13\x0f\x71\x7d\x21\xfa\xbc" + "\x74\x5f\x88\xba\xd5\x61\xf2\xe9\xaa\xa2\x96\x3a\xee\x0b\x51\x93" + "\xe5\xcd\xe9\x44\x9d\x97\xdf\x17\xa2\x76\x71\x73\x3a\x51\xb5\x5c" + "\x5f\x98\x14\xd4\x7e\x7d\x21\x7a\xa5\xe3\xbe\x10\x1d\xdb\x66\x79" + "\x76\x55\x51\x6b\x85\x7d\x61\xe2\x3e\xd2\x17\x1a\x3c\x95\xcd\x0b" + "\x45\xd7\xbb\x3e\x2f\xf4\x6a\x3d\xb3\x9e\x44\x66\x5e\x5f\xae\x2f" + "\x4c\x3a\xce\xf5\x85\x57\xa5\xbf\xf3\xa0\x7a\xc5\xdc\x61\xf2\xfa" + "\xaa\x5e\x71\xfc\xfd\x23\xd5\x2b\x8e\xbe\x7f\x24\x32\x07\xf4\xca" + "\x65\xf9\x7d\xe1\x95\x62\x6e\x0e\xe8\x15\xde\xfe\xbf\xc9\xc3\xdb" + "\xaf\x2f\xbc\xea\xf8\xfb\x0f\xaa\x57\x9d\xf8\xfe\x83\xc2\x7c\xbf" + "\xaa\x57\xf2\x84\x7d\x61\xd2\x61\xd2\x17\x1a\xb3\x94\xcd\x23\x4d" + "\x6e\x71\xfe\x1f\xeb\xfc\x66\x5f\xfb\x79\xa4\xb2\x1a\x2d\x7a\x6e" + "\x1a\xee\x0b\x53\xf6\x98\xf2\x43\x8d\x38\xbf\xb0\x39\x80\xcd\x41" + "\x99\xc9\xe6\x78\xa9\x37\x91\x1c\x94\x06\xf3\xfd\x1c\x94\x24\xf7" + "\x07\xa2\xf0\x5e\x60\xbc\x27\xd8\xa4\x26\xf9\x27\x69\xbc\x26\x0a" + "\xaf\x91\xba\x54\xca\xe4\x57\x49\x35\x41\xdb\xaf\xb4\x90\x7f\x32" + "\x4e\x8f\xca\xe2\x56\x20\x93\xcf\xbe\x38\xb2\x4f\x78\x8a\x96\xc9" + "\x3f\x39\xc3\xff\x89\xec\x7f\x23\x5f\x6f\x9c\x7f\x32\x8e\xb6\xa4" + "\xeb\x69\x43\x85\x11\x41\x59\xb0\xef\x4c\x6b\x0e\xca\x29\xef\xe3" + "\xb6\x9b\x66\x04\x3d\xb1\xe3\xdf\x12\xf9\x85\x55\x53\xe4\xe7\x81" + "\x55\x4d\x99\xcc\xcd\xef\x4c\xd9\xc2\x61\x74\x0a\x33\x06\xc3\xdf" + "\x90\xb2\x18\x88\x31\xeb\x4d\xea\x66\x45\xb9\x37\xa6\x1c\x6c\xd9" + "\x67\xcc\x1a\x11\xbb\xf8\xc5\xf9\xec\x37\xb1\xa6\xfc\x30\x1d\xce" + "\x73\xec\xbc\xcf\x3c\x6e\xb7\x8d\xcf\x7e\x5d\xe7\xbc\xcf\x7e\x33" + "\xc5\xc6\x67\x22\xf3\x10\xbf\x79\x41\xbe\xcf\x7e\xe3\xc9\xcd\x43" + "\xfc\x66\x02\xe7\xb3\xdf\x14\x10\x9f\xfd\xba\x86\xf8\xcc\x3c\xb2" + "\x59\x51\xfe\x8e\xdf\xb4\xb8\xff\x1b\xeb\xa6\x66\x5f\x7b\x5d\xce" + "\xf9\x6c\xaa\x1a\x7c\x66\xc4\xf9\x96\x9d\xf7\x59\xb7\x4b\x6d\xe3" + "\xb3\x98\x9d\xce\xfb\x6c\x6a\x17\xa1\xcf\xc4\xf4\x72\x8c\xfc\x6f" + "\x76\xaa\x62\x8e\x72\x7a\x79\x2a\xe2\x7c\x36\x35\x9a\xf8\x2c\x66" + "\x0b\xf1\x19\x8c\xc7\x8a\x72\x80\x4c\xed\xd3\xb2\xcf\x98\x77\xfa" + "\x0e\xfa\xd9\xb4\x13\xa6\x7c\xd0\x98\xa0\x1f\x9d\xf7\x99\xcf\x37" + "\x6d\xe3\xb3\x69\x93\x9d\xf7\xd9\xb4\x63\x36\x3e\x13\xd1\x75\xd3" + "\x76\xcb\xf7\xd9\xb4\x64\x4e\xd7\x4d\x3b\xc8\xf9\xec\x35\x77\xe2" + "\xb3\x69\x13\x88\xcf\xe8\xbc\x66\x45\x79\x44\xa6\xb5\x38\xff\x85" + "\x79\x68\xb3\xaf\xbd\xce\xe1\x7c\x16\xab\x03\x9f\x19\x71\xfe\x69" + "\xe7\x7d\x16\xb6\xbe\x6d\x7c\x16\xeb\xe9\xbc\xcf\x62\x17\x09\x7d" + "\x26\xa6\x3f\x62\xa7\xca\xf7\x59\x6c\x00\xa7\x3f\x62\x13\x39\x9f" + "\xc5\x1e\x26\x3e\x8b\x45\x8c\xcf\xb2\x51\x49\xb3\xa2\x5c\x24\xb1" + "\xab\x5b\xf6\x19\xf3\x0e\xd6\x41\x3f\x7b\x3d\xd8\x94\x0f\x9c\x1d" + "\xf8\xb8\xf3\x3e\x7b\xed\x17\x6d\xe3\xb3\xe9\x47\x9d\xf7\xd9\xeb" + "\x81\x36\x3e\x13\xe1\xc9\xaf\x2b\xc8\x83\x3d\xbd\x9a\xe3\xc9\xaf" + "\xf7\xe1\x7c\xf6\xfa\x3c\xe2\xb3\xe9\x07\x89\xcf\xdc\xea\x9a\x15" + "\xe5\x33\x79\x5d\x32\xff\x97\x23\xde\x68\x5d\x97\xcf\xf9\x6d\x46" + "\x4d\xc7\xe1\x8e\x33\x52\x9c\xf7\xdb\x8c\x8b\x2d\x73\xc7\x19\x27" + "\xe5\xfb\x6d\x46\x0e\xc7\x1d\x67\x9c\xe5\xfc\x16\x17\x40\xfc\x36" + "\x63\x9e\x6b\xdc\x71\x46\x8b\xfb\x5f\xc5\xb8\xa3\xbd\xdf\x66\x16" + "\x74\x1c\xfe\x38\x33\xd8\x79\xbf\xcd\xcc\x6f\x99\x3f\xce\x5c\x29" + "\xdf\x6f\x33\xc7\x71\xfc\x71\x66\x16\xe7\xb7\x99\x17\x88\xdf\x66" + "\x06\xb8\xc6\x1f\x67\x4a\xe6\x7f\x73\xc4\x1f\xed\xfd\x36\x7b\x72" + "\xc7\xe1\x90\xb3\x6a\x9c\xf7\xdb\xec\xc8\x96\x39\xe4\xec\x50\xf9" + "\x7e\x9b\x8d\x38\x0e\x39\x7b\x34\xe7\xb7\xd9\x79\xc4\x6f\xb3\x2e" + "\xb8\xc6\x21\x67\xc7\x29\xe1\x90\xf6\x7e\x4b\xf0\xea\x38\x3c\x32" + "\xbe\xc0\x79\xbf\x25\x78\xb4\xcc\x23\xe3\xe5\x7f\xb3\x58\x15\x7f" + "\x98\xe3\x91\xf1\x26\xce\x6f\x09\xe4\x1b\x2c\xaa\xf8\x3c\xd7\x78" + "\x64\x42\x8b\xf9\x3f\xc4\x78\xa4\xbd\xdf\xe6\x9c\xe8\x38\x5c\x72" + "\x8e\x0c\xfe\x3f\xc7\x86\xff\x8b\x71\xc9\x39\x0a\xf8\xff\x1c\x2b" + "\xff\x87\xfe\x36\x87\xc7\xff\xdf\x60\xf9\xff\x9c\x09\xae\x71\xc9" + "\x39\x4e\xf0\x7f\x7b\x2e\x69\xef\xb7\xc4\xd4\x8e\xc3\x27\x13\xbd" + "\x9c\xf7\x5b\xe2\xd2\x96\xf9\x64\xa2\xfc\xef\x40\xa9\x12\x83\x38" + "\x3e\x99\x38\x8f\xf3\x5b\xe2\x51\xe2\xb7\x44\x77\xd7\xf8\x64\xa2" + "\x64\xfe\x47\xab\xdf\xcc\xbe\xa1\x46\x5a\x64\x1e\xb2\x3c\x51\xcb" + "\xe6\x26\x7c\x73\x82\xd9\x2f\xd4\x28\xf7\xfb\x2e\xd6\x9c\xd3\xa7" + "\x12\x11\xba\xa4\x9a\x7b\xd9\xb5\xbc\xd3\x73\xf3\x5d\xcf\x3b\x3d" + "\x77\x66\xeb\x7d\xdf\x65\xee\x78\xf9\x79\xa7\xe7\xfa\x72\x1c\x74" + "\x6e\x0c\xe7\xeb\x37\x99\xf5\x09\xf2\xf2\x51\x27\x55\xbb\x96\x8f" + "\x7a\xee\x45\x82\xaf\xa4\x2d\x24\x1f\xf5\xdc\xb3\xed\xf3\xdd\x97" + "\xa4\xd1\x38\x1f\x35\x9d\xad\xf2\x57\x96\x1f\xf9\xcd\x98\x96\xf1" + "\x1c\xa6\xa3\x45\xe6\x68\x39\x3c\x2f\xe8\x63\xf6\x0b\xd3\xc9\xfd" + "\xce\x8c\x10\xcf\xf3\x0f\xb9\x86\xe7\xf9\x09\xae\xe3\x79\xfe\xd0" + "\xd6\xfb\xce\xcc\xfc\xde\xf2\xf1\x3c\xaf\x86\xe3\xe6\xf3\x83\x38" + "\x3c\x2f\x88\x95\x8f\xe7\x79\x7b\x5c\xc3\xf3\xfc\xfd\x04\xcf\xf3" + "\x12\x09\x9e\xe7\xef\x6a\x9f\xef\xcf\xcc\xf3\x25\x78\xf6\x88\x53" + "\x96\x7f\x7a\x41\x90\x13\x78\x36\xd2\x22\xf3\xd7\x1c\x9e\x93\xeb" + "\x00\xcf\x46\xb9\xdf\xbb\x11\xe2\x39\x79\x8d\x6b\x78\x4e\x0e\x75" + "\x1d\xcf\xc9\x6e\xad\xf7\xbd\x9b\x85\x57\xe5\xe3\x79\xe1\x41\x4e" + "\xb3\x2c\x34\x72\x78\x5e\x14\x2c\x1f\xcf\x0b\x75\xae\xe1\x39\x79" + "\x25\xc1\xf3\x42\x2d\xc1\x73\x72\x4a\xfb\x7c\x07\x67\x41\x0d\xc1" + "\x73\xe7\x3d\xca\xf2\x7b\x27\x4b\xe6\x3f\xe6\xf0\x1c\xae\xa3\x45" + "\xe6\xf6\x39\x3c\x2f\x39\x6a\xf6\x0b\xd7\xc9\xfd\xee\x8e\x10\xcf" + "\x4b\x5c\xfc\xce\xc5\x92\x56\xf8\xce\xc5\x62\x17\xbe\x73\x61\xfb" + "\xdd\x9d\xc5\x47\xe4\xe3\x79\xf1\x6a\x4e\xcb\x2d\x2e\xe5\xf0\xbc" + "\xc4\x24\x1f\xcf\x8b\xc7\xb9\x86\xe7\x25\xec\xf7\x2f\x16\x7b\x12" + "\x3c\x2f\x19\xdd\x3e\xdf\xe3\x59\x74\x90\xe0\xb9\x8b\x41\x59\xfe" + "\xf4\x25\xa5\x4e\xe0\xd9\x48\x8b\xbc\xf7\xe0\xf0\xbc\x2c\x0b\xf0" + "\x6c\x94\xfb\xfd\x1f\x21\x9e\x97\x05\xba\x86\xe7\xa5\xe7\x5c\xc7" + "\xf3\xd2\xf7\x5b\xef\xfb\x3f\x4b\xd7\xc9\xc7\xf3\xd2\xc9\x9c\xc6" + "\x5d\xca\x7b\xff\xbf\xac\x4c\x3e\x9e\x97\xba\xf8\x5d\xa0\x65\x4f" + "\x12\x3c\xa7\xb0\xdf\x05\x5a\xe6\xdb\x3e\xdf\x05\x4a\x59\x4d\xf0" + "\xec\xa5\x55\x96\x9f\x7e\xd9\x96\x96\xf1\xac\xd5\xd1\x22\xef\x84" + "\x38\x3c\x2f\x8f\x35\xfb\x69\x75\x72\xbf\x43\x24\xc4\xb3\xee\xae" + "\x6b\x78\xd6\xed\x76\x1d\xcf\xba\x45\xad\xf7\x1d\x22\xdd\x54\xf9" + "\x78\xd6\x05\x70\xda\x5f\xc7\x7b\xff\xb7\x5c\xc1\xf7\x89\xde\xaa" + "\x75\x0d\xcf\xba\xeb\x04\xcf\x6f\xed\x21\x78\xd6\xd5\xb4\xcf\xf7" + "\x89\xde\x9a\x4c\xf0\xdc\x23\x43\x59\xfe\xff\xe5\x2d\xae\xff\x10" + "\x9b\xdf\xb0\xce\x4b\x71\x98\x4e\x0d\x71\x7d\x8e\xe3\xed\x53\xae" + "\x61\xfa\xed\xe5\xae\x63\xfa\xed\x31\xad\x37\xc7\xf1\xb6\x82\x6f" + "\xfd\xad\x30\x72\x73\x1c\x6f\x8f\xe4\x30\x9d\x9a\x2c\x1f\xd3\x2b" + "\x8e\xba\x86\xe9\xb7\x8f\x13\x4c\xaf\x48\x25\x98\x7e\xfb\x70\xfb" + "\xcc\x71\xac\x08\x72\x6d\x8e\x23\x75\xa4\x92\x39\x0e\x7b\x4c\xa7" + "\xbb\xbb\x3e\xcf\x91\x56\xe8\x1a\xa6\xd3\x22\x5d\xc7\x74\x5a\xef" + "\xd6\x9b\xe7\x48\x73\x93\x8f\xe9\x95\x65\xdc\x3c\x47\x9a\x9a\xc3" + "\x74\xfa\x68\xf9\x98\x5e\x99\xe3\x1a\xa6\xd3\xf2\x09\xa6\x57\x46" + "\x13\x4c\xa7\x65\xb5\xcf\x3c\x47\xaa\xc9\xb5\x79\x8e\x74\xb5\x92" + "\x79\x0e\x7b\x4c\x67\x56\xbb\x3e\xd7\x91\xb9\xc8\x35\x4c\x67\xf6" + "\x77\x1d\xd3\x19\xd7\x5b\x6f\xae\x23\xe3\x9c\x7c\x4c\x67\xec\xe4" + "\xe6\x3a\x32\x6a\x38\x4c\xaf\xf2\x97\x8f\xe9\x8c\x78\xd7\x30\x9d" + "\x99\x44\x30\x9d\x11\x40\x30\x9d\x19\xd7\x3e\x73\x1d\xe9\x55\xae" + "\xcd\x75\x64\xd6\x28\x99\xeb\xb0\xc7\xf4\xea\x7d\xae\xcf\x77\xac" + "\x1e\xe3\x1a\xa6\x7f\x7b\xd7\x75\x4c\xff\xf6\x78\xeb\xcd\x77\xfc" + "\x76\xaf\x7c\x4c\xff\x96\xf7\xfd\x8b\xdf\xf2\xf6\xff\xaf\xae\x93" + "\x8f\xe9\xdf\x6a\x5d\xc3\xf4\xea\x17\x08\xa6\x57\x19\x09\xa6\x57" + "\x0f\x6f\x9f\xf9\x8e\x55\xbb\x5c\x9b\xef\x58\xdd\x62\xfe\x0b\xb1" + "\xf9\x0e\x7b\x4c\xff\x2e\xc3\xf5\x39\x8f\xdf\xf5\x76\x0d\xd3\xef" + "\x9c\x72\x1d\xd3\xef\xe4\xb7\xde\x9c\xc7\x3b\x2b\xe5\x63\xfa\x9d" + "\x71\xdc\x9c\xc7\x3b\xbc\xf5\x4f\xbf\x2b\x91\x8f\xe9\x77\xbc\x5c" + "\xc3\xf4\xef\x7c\x08\xa6\xd7\x94\x11\x4c\xff\xce\xb3\x7d\xe6\x3c" + "\xd6\xe8\x5c\x9b\xf3\xf8\x5d\x96\x92\x39\x0f\x7b\x4c\xaf\x9f\xec" + "\xfa\xbc\xc7\xba\xeb\xae\x61\x7a\x5d\xa1\xeb\x98\x5e\x97\xd4\x7a" + "\xf3\x1e\xeb\x26\xc9\xc7\xf4\xba\x3e\xdc\xbc\xc7\x3a\x5e\xfe\xfb" + "\xf5\x79\xf2\x31\xbd\x56\xef\x1a\xa6\xd7\x5d\x26\x98\x5e\xbb\x93" + "\x60\x7a\xdd\x85\xf6\x99\xf7\x58\x3b\xc1\xb5\x79\x8f\xf5\x71\xb6" + "\x98\x5e\x92\xb0\x20\x5e\xb3\x70\xce\x9c\x25\x09\x29\x9a\x25\xf3" + "\x92\x66\x27\xbc\x10\x68\xfd\xff\x0b\x21\xba\x40\x5d\x57\x14\x3f" + "\x7f\xe6\x8c\x65\xc3\xb8\x93\xf3\x12\x16\xc0\x9f\xae\x28\x71\xe6" + "\x92\x44\x4d\xca\xf2\xe4\x04\x0d\xfe\xdf\xfc\xd9\xc9\x50\x64\x61" + "\x0a\x77\xe4\x95\x84\x79\x33\x75\x49\x0b\xde\xd0\xcc\x9c\x97\xf4" + "\xc6\x82\xf9\x09\x0b\x52\x34\x8b\x13\x16\x2d\x4d\x5a\x9c\x80\xff" + "\xbd\x44\x33\x67\xe1\x62\x38\x30\x3b\x21\x69\x59\x82\x66\xd6\xd2" + "\x39\x73\x12\x16\x2f\xe9\x8a\x22\x97\xce\x4b\x49\x4a\x9e\x97\xa0" + "\x19\x1d\x39\x6a\xd0\xe4\x31\xaf\x4e\xfe\xf9\xcf\xbb\x22\xde\xb7" + "\xa7\x35\x74\xde\x54\xdc\x2f\xdc\xaf\xa8\x36\x2f\xaf\x00\xd6\xb9" + "\x01\xb0\xb9\x71\x31\x52\xaf\x5f\x8c\xdc\xd7\xdd\x46\x9e\x1b\x6e" + "\x23\x2f\xcb\x26\x93\x4e\x33\x17\x45\xd0\x3e\x8b\x32\x36\xde\x46" + "\xbe\x96\xdc\xbd\x55\x74\xee\xde\x1c\x83\xcf\xa6\x0c\x5c\x96\xf6" + "\xc9\x3d\x8c\x8f\x83\x2f\xdc\xe9\xdc\x7d\x11\x97\x54\x9b\xb5\x06" + "\x9f\xf7\xe2\xd2\xaf\x22\x8a\xee\xf1\x6e\xc9\x01\x8b\x81\x3a\x8e" + "\x59\x01\xd8\x0a\xa9\xb2\xaa\xe1\x77\x02\xa9\x36\xa4\xc0\x6f\x35" + "\xfc\xaa\xe0\x67\x44\xaa\x6c\x04\xbf\x79\xf0\x2b\x86\x9f\x1e\x7e" + "\x75\x48\xb5\x11\x8e\x6d\xf4\x85\x5f\x1f\xf8\xad\x85\xdf\x1e\xf8" + "\x1d\x86\x5f\x15\xa9\x67\x23\xfc\x72\x62\xe0\x97\x01\xbf\x2d\x48" + "\x95\x3b\x01\x7e\x50\x47\x2e\xd4\x97\x0b\x75\xe7\xe6\xc0\x0f\x1f" + "\x3f\x08\x3f\x5c\xfe\x02\x39\xb7\x69\x17\xfc\xe0\x1e\xef\x41\xfd" + "\xef\x41\xdd\xef\x45\xc3\x2f\x1e\x7e\xc9\xf0\xd3\xc1\xaf\x00\x7e" + "\x50\xe6\x3d\xb8\x57\x1e\x9c\xcb\x83\x7b\xe4\xa5\xc2\xef\x2c\x52" + "\x41\xe0\x53\xe5\xc3\xb3\x6c\xd6\x92\x5f\x3e\x3c\xcb\x66\x5f\xee" + "\xff\x9b\x43\x78\xff\x16\xfb\x45\x7b\x67\xf6\xd3\x97\x3c\x6b\x82" + "\x7e\xbb\x21\x94\x5e\x85\x54\x74\xee\x7b\x71\xc9\xcf\x22\xb7\x6b" + "\xaa\x0d\x6e\x95\xab\x11\xc4\x9b\xbd\x39\x25\x2b\x9a\xf0\x79\x37" + "\x6c\xb3\x86\xec\x0d\x48\x8f\xe6\x69\x71\xff\x94\x87\xcf\x0d\x88" + "\xbd\x3e\x42\xef\xd6\xb5\x18\x5f\x4f\x6f\x0a\xdb\x49\xa7\xc7\x6c" + "\xc7\xfb\x70\xaf\x80\x0d\xf1\x3e\x5d\x3a\x27\xcc\x9f\x56\x87\x9c" + "\xc0\x31\xa6\x64\x05\x7e\xae\xac\xf3\xa4\x3f\xc2\x79\x78\x36\x83" + "\x8f\x49\x07\xfd\xcf\x1d\xff\x9f\x06\x9f\xd3\x3b\x67\xd7\x92\xb8" + "\xb3\x81\xd1\x2f\x4d\x7e\x91\x21\xf8\x5c\xe3\xee\x40\x3d\xbd\x4b" + "\xab\x2b\x59\xd0\x84\x6a\x54\x59\xe7\xa0\x6d\x14\xc4\x40\x8a\x1e" + "\x10\xa8\xb7\x6c\x8e\x0c\x39\x02\x38\xc0\xe5\x3e\x4f\xab\xc5\x7f" + "\xcf\xe2\xf3\x74\x5e\xa4\x11\xcf\x03\x95\xa4\x7d\x00\x71\x39\xeb" + "\x7c\x93\xdf\xec\x2a\xcd\x2b\xde\xf4\x25\xd5\x86\xf9\xf0\x6c\x4c" + "\x79\xeb\xb3\x34\xf9\x98\x32\x70\xfd\xb4\x26\x3e\x07\xce\xb9\x5b" + "\x72\x37\x65\xc0\x73\xb8\xdd\x80\xeb\x68\x78\xc6\x92\x57\xf0\x7d" + "\xb3\x13\xe0\x59\xa9\xf4\x49\x50\xf7\x07\xf1\x39\x9f\xac\x30\x52" + "\xf8\x9c\x25\xc7\xa4\x03\xbc\x7b\xd1\xd9\xeb\x77\x6e\xeb\x89\xdc" + "\x8b\x36\x21\xb4\x63\x13\xf2\x6c\xc8\xce\x8e\xd5\xbb\xf7\x99\x4c" + "\x62\x5f\x56\x35\x05\x65\xf4\xaa\x6c\x2d\x0d\xf8\x65\xee\xe5\x3b" + "\x2e\xd9\xc1\xbd\xf6\xde\xbf\xd7\xe6\x71\xc9\xf8\x5e\xc4\x46\x26" + "\x1d\xf9\x4b\xea\xb0\xec\x1a\x90\x83\xed\x87\x6d\x67\xad\xc3\x92" + "\x6b\xad\x63\xc3\x29\x7c\x3d\xdc\xb3\x80\xfe\x70\x40\x8e\x65\x73" + "\x54\x0e\xf8\x4d\x87\xcf\x7b\x67\xa2\x7a\x1a\xfe\xe2\xfb\x13\x5f" + "\x80\xed\xa9\x0c\x84\xeb\xa7\xd9\x63\x34\x1c\x83\x6b\x6b\x2c\xab" + "\x34\x80\x9b\xf0\x44\xe2\xd7\x8d\x43\x97\x57\xd1\x16\xf8\x99\x87" + "\x54\x21\xb7\x92\x57\xb0\x4f\x37\x46\x6b\x26\x76\x06\xbb\x6e\x9c" + "\x74\xdf\x9e\xfd\xe3\xd7\x82\x4d\xd4\x45\x3d\xc1\x2e\xef\xb8\xef" + "\x61\xea\x80\xf6\xf0\xed\x83\xdb\xd0\x90\xbd\x31\xc3\xc6\x46\x6a" + "\x38\x96\xa7\x77\x73\xd7\xe3\x63\x9a\xa7\x18\x2c\x9d\xa7\x59\x7f" + "\x61\x3c\x63\xdf\x59\xf2\xf1\xbe\xb5\xac\xea\x29\x03\x91\xda\xbb" + "\x0a\x51\x9a\xb4\x80\xc3\xc4\xc7\x91\x46\x78\xe6\x3d\xf8\x5e\xf0" + "\xd7\x40\x6f\x7e\x7e\x9c\x79\x15\x8c\xa1\xf7\x71\x95\xa3\x36\xe7" + "\x86\xc7\x35\xf9\x4d\x2c\x6e\xcc\x7f\x39\x99\xce\x09\x8f\xc3\xfb" + "\xca\x2f\xa9\x72\x98\xbd\x76\xf4\x2a\x4f\x44\xee\x13\x1e\x9f\x36" + "\x8f\x36\xa4\xdd\x02\xfb\xf7\x9a\x58\xfc\xf9\x32\x03\xf8\xe1\xe5" + "\x64\xec\xe7\x23\xf7\x8c\x14\xce\xf5\x47\xf7\x58\xff\x97\x1d\xd0" + "\x9e\x42\x68\x0b\xb4\x13\xe1\x7a\x1b\xb2\x73\xa2\xb9\xf6\x6c\xac" + "\xc7\x3e\x87\x7b\xe8\xc8\xbd\xa1\x5e\x0a\xee\xe1\x13\xae\x83\x72" + "\x3a\xbd\x5b\x71\x80\xb5\xdd\xcc\xbd\xb9\x72\x6c\x1f\xc9\x99\x67" + "\x80\xb2\xcd\xcb\xe8\xaa\x8d\xdf\x42\xfd\xab\x10\xdd\x74\x8f\x2e" + "\x4b\x8d\xa6\x8d\xd9\xbf\xc6\xeb\x17\x2f\xa0\xf4\x99\xa8\x4f\xb7" + "\x4c\x1a\xb8\x3a\xf2\xee\x76\xc1\x9b\x2e\x8f\xbe\xc0\x7c\xf3\x20" + "\xb5\x8a\xae\xad\x48\x3e\x8a\x52\x2f\x23\xaf\x95\x49\xc8\x37\x3d" + "\x1a\xda\x52\x46\x1b\x2b\x75\x17\x50\x45\x3d\xfc\x92\xcb\xa1\xdc" + "\x39\xf8\x1d\x45\xe9\xcb\x91\xfb\x44\x18\xcf\xd2\xee\x22\xaf\x8a" + "\xe4\xbb\x70\xec\x3a\x4a\x8d\xa3\x4d\xe5\x65\xb8\xdc\x49\x14\x65" + "\x32\x78\xaf\xbc\x8e\xdc\x77\xfc\x1a\xef\xd5\xbe\x88\x8a\xe0\x59" + "\x9a\x7c\xf6\x96\x34\xe6\xee\x1b\x77\x67\x19\x6d\x6a\xc8\xce\x1d" + "\xad\x47\xcf\x6b\x04\x6d\xc1\xcf\xdc\x84\x10\xf8\xca\x0d\x97\xb1" + "\xe4\x8f\x8d\x9e\x61\xc2\x71\x23\x57\x0b\x7c\x02\x59\xcf\xe3\x73" + "\x06\xbf\xb1\xd1\x70\x3c\x3e\xca\x44\x37\x80\x9f\x99\x76\x83\xfd" + "\x53\xd8\xf6\xa7\xa8\x92\x91\x3b\xdc\x63\x8f\xde\xed\x4f\x08\xdf" + "\x03\xea\xec\x04\x38\x8e\xc7\xd8\x60\xcf\x9d\xd0\xbb\x7d\x3a\x8e" + "\xc3\x0b\xe3\xff\x4e\xd6\x67\x81\xf3\x35\x7a\xb7\xcf\xa2\x79\x78" + "\xc2\xf1\xe1\xfe\x79\x76\x9c\xc2\x31\x67\x9e\x05\xc7\x4c\x75\xc8" + "\x16\xb3\xdf\x44\xe8\x0b\x66\x35\x7d\xc7\xdf\x8b\xa6\x68\xe3\x44" + "\x13\x6d\xb4\xe4\x8f\x88\x86\xb1\xc8\xab\xd2\x54\xcf\x96\xdf\xb4" + "\x8e\xce\x35\xfb\x93\xb5\xa1\x9b\x16\xe1\x3a\x81\xb3\x14\x67\xdf" + "\x46\xea\xa8\x2a\xda\x88\xfb\xa5\x25\xdf\x23\x27\x7b\x31\xf2\xa5" + "\xf3\x23\x0d\x16\xbf\xf1\xa8\xf1\xfd\xd9\x7a\x1c\x3b\x69\xbf\xa9" + "\x88\xce\x81\x6b\xd9\x7a\xe0\xbe\x1e\x7a\xd5\xa6\x71\x16\xb8\x9e" + "\xce\x1b\x11\xcd\xe2\x80\x89\x73\x24\x3e\x6e\x1a\x47\x07\xc2\xb9" + "\x9c\x90\x02\x38\xe7\x71\x49\xb5\xe9\x2c\x1c\x87\x3a\x42\xce\x96" + "\xa4\xdd\xc6\x75\x9c\x27\x18\x0a\xd9\x22\xf8\x3f\x85\xed\x99\x5d" + "\x8f\xfb\x35\xe1\x97\x9b\x1a\xb9\x7e\x6b\xed\x27\xd0\x5f\xfd\x46" + "\x00\x76\xdf\xf3\xd2\xbb\xf5\xf0\x62\x62\x39\x5c\x57\xcf\xc4\x9a" + "\x8d\x9e\xc0\xc5\x6a\xff\x1a\x8d\xd0\x5f\xcb\x10\x82\x32\x21\x7a" + "\x37\xb5\x86\xb3\xe5\x7b\xe3\x71\x59\xa6\x4f\x42\xdf\x24\xf7\x03" + "\x9c\xc3\x35\xf4\xe6\x89\x38\xf7\x8a\x3b\x8e\x33\x7a\xd5\x7b\xa3" + "\x71\x8c\x81\x7e\xe7\x49\xe2\xf9\x80\x44\xa6\x7f\x6e\x9a\x5b\x0c" + "\xcf\x95\x71\x89\x7d\x16\xfe\xb3\x59\x63\x09\x9d\xfb\x66\x08\x29" + "\x1b\x9e\x01\xf7\x2f\x86\xfb\x1b\xf9\x58\x23\xed\xca\x0b\x1c\x52" + "\x06\xff\x06\xbe\x61\xad\x0b\xfa\xaa\x27\xc4\xe4\x6f\x31\x06\x71" + "\xcc\xd9\xba\x09\xc7\xda\x37\xb5\x8d\xb9\x6f\x46\x40\x3d\x46\x6b" + "\x3f\xb5\x2c\xa3\xab\xc1\xaf\xc8\x72\x8f\x3e\xbb\x11\x7c\x19\x65" + "\x56\xd1\x33\xcc\xc1\x08\xf8\xa8\xa9\x08\x8e\x17\x2d\xc3\x7c\x2e" + "\x77\x38\xf4\x65\x4f\xf1\xb2\xee\x08\x97\x63\xca\xb3\x65\x9b\x7c" + "\xde\xd4\x32\xcf\xbc\x4a\x65\x81\xe7\x73\xb3\x3e\x53\x93\x4f\xf8" + "\xbc\x86\xec\xbc\x14\x3d\xa2\xbd\x04\xfd\x65\xd3\x90\xc3\x34\x1d" + "\x83\x71\xa5\x82\xb6\x6c\x85\xbf\x9d\x59\x9c\x76\xfb\x2b\xf0\xd5" + "\xd1\x91\xd0\x57\xc0\xdf\xdb\x7a\xd1\x06\xb8\xfe\xa0\x1e\xbd\x9e" + "\x87\xaf\x5f\x0f\xff\xc7\xc7\x71\x19\x38\x5e\xa6\x47\x33\x56\x93" + "\x7a\xb3\xeb\xb1\xff\x6c\xea\xbd\x45\xea\x65\x9e\xa5\x1b\xae\x13" + "\x5f\x87\xeb\x2c\xdc\x4c\xd7\xe1\x7a\x1a\xb2\xf3\xd5\xd6\xba\x37" + "\xc0\x31\x6b\xfd\xa3\xe7\x5b\xef\x91\x1f\x02\xf7\x10\x3c\xfb\xd6" + "\xcd\x74\x3d\x79\xae\xfc\x09\x7a\x34\x27\x16\x9f\x5b\x07\xc7\xf0" + "\xb5\xbc\xfe\xa6\xe2\x30\x94\x0f\xed\x8f\xaf\xe1\xc7\x77\xf0\x51" + "\x77\x2b\x27\x60\xeb\xda\x62\xad\xcb\xb6\x1e\x3a\x67\x9e\x86\xd7" + "\x5f\xbd\x70\xbd\x50\xbe\x54\x8f\x66\x06\x91\xe7\xda\xa0\xab\x27" + "\x78\x07\xbb\xe7\x5f\xc7\x76\xc7\x63\x8d\x65\x15\xcb\x3b\xde\x9f" + "\x5d\xcb\x62\xa3\xd6\x3a\x1e\x81\x5f\x12\x1b\xb2\x37\x7b\x71\xb1" + "\x3b\x5f\x8f\xfd\x0d\xc7\x63\x48\xfd\x9b\x83\xf4\xc8\x52\xc6\x6f" + "\x37\xf4\x0d\x77\x18\x1b\x34\x38\x66\xb1\xcf\xe3\x86\xc7\x27\xeb" + "\x79\xb8\x87\xbb\x25\x7b\x7d\x13\xee\x13\x30\xde\x41\x9f\x1f\xab" + "\x87\x7a\x92\x6d\xc6\x3b\x77\x52\xee\xdd\x21\xb8\xcc\x7b\xbd\xe8" + "\x5a\x28\x93\x67\x2d\x83\xcf\x83\xfd\x5f\x84\x63\x7b\xf4\x68\xee" + "\x3c\x7c\x2c\x1b\xca\xe8\x55\xef\xda\xe9\x03\x2b\xf7\x4e\xeb\x8f" + "\xa8\xca\x02\x3d\xd6\x8e\xb8\xff\x8f\xac\xec\x53\x8f\x2a\x0b\x2c" + "\xc8\xf2\xe1\x33\xea\x88\x34\xba\xe4\x8a\xea\xf7\x81\x15\xc6\x5a" + "\x99\x1a\x7b\x33\xb3\xff\x8d\x6e\x02\x8d\x93\x3a\x0c\x61\x2e\x70" + "\x43\xb5\x65\x4a\xa5\xe1\x36\x13\x0b\xe1\xdf\xa3\xf0\xf9\xf7\x40" + "\x13\x61\x5d\x04\xda\x37\x31\x87\x22\xda\xc8\x02\x65\x77\xe0\xe3" + "\x58\x37\x81\x66\x2b\xe2\x9d\xa3\x3f\x0c\xcc\x21\xb6\xdb\xd2\x1d" + "\xdb\x91\x79\x5e\xd3\xcb\x25\xf8\x99\x2d\xbb\x02\x73\x70\x1b\xd2" + "\x75\xb4\xa5\xd2\xd4\x50\x52\x51\x6f\x46\x9a\x65\x58\xd3\xfd\xfe" + "\x6a\x54\x21\xa2\x21\x56\xe6\xc8\x6b\xc3\xef\x99\xf5\x7f\xa0\x7b" + "\x6f\x18\x02\x03\x73\xd2\xcd\x88\xda\x98\xe6\xe1\xf9\x52\x01\x5d" + "\x72\x67\xc0\x33\xc0\x3b\xb6\x78\x1d\xd7\x21\x24\x9f\x0b\x6f\xf1" + "\xb2\xb6\x7d\x07\xdb\x76\xb8\x17\xb3\x5f\x74\xc8\x96\x0c\xa6\xbd" + "\x50\x66\xb4\x94\xbf\xe8\x55\xde\xf4\x5f\x0b\x4c\x68\x49\x01\xdd" + "\xb4\xa4\x10\x51\xe6\xcd\xcf\x57\x7d\xb2\xa3\x1a\xc7\xfd\x08\xab" + "\x3d\x19\xdb\x81\xde\x4f\x4e\x43\xea\x6b\xaa\x2d\xd7\xa3\x52\x33" + "\x98\x6f\x24\x7d\x09\xe5\x64\x3e\x2b\x33\xff\x57\x01\x3a\x3a\xca" + "\x94\x4e\x93\xb1\x6b\xab\xdf\x44\xb6\x3e\x7c\xce\xea\xbf\x1d\xac" + "\xbe\x95\x7f\x8f\xad\x92\xfb\xff\x1d\xb4\x55\x2d\xde\xd6\xad\xe7" + "\x95\xb7\x75\xeb\x2e\xfb\xb6\x6e\x73\x6b\xdd\xb6\x6e\xf3\x54\xd0" + "\x56\x8d\x78\x5b\xb7\x9d\x54\xde\xd6\x6d\x39\x22\x6d\xbd\xde\xca" + "\x6d\x95\xcc\xff\xe4\xa0\xad\x21\xe2\x6d\xdd\xfe\xa9\xf2\xb6\x6e" + "\x4f\xb5\x6f\xeb\xf6\xf3\xad\xdb\xd6\xed\x7a\xc9\xb6\x52\xde\x34" + "\x8e\x4f\x10\x97\x9a\xd2\x1a\x81\xf3\x6d\x8e\xde\xb9\xf2\x7d\x44" + "\x95\xd5\x1b\x51\x45\x9f\x6a\xcc\xa7\xa9\xc1\xc9\x0c\x27\x1a\x49" + "\x6f\x32\xe5\x54\x14\xd4\xc1\xf1\x2b\xa8\x5c\x67\x44\x11\x8b\x71" + "\xfc\x2d\xd8\x5d\x19\x2f\x37\xfe\x16\x24\xdf\x8f\xbf\xa6\x61\x6c" + "\xcc\x2d\x3c\x53\x51\xd7\x84\x70\xfb\xe1\xdf\xc7\xee\xc7\xdf\x55" + "\xc4\xde\xb6\xf1\x17\xdb\xa3\xd2\x68\x14\xc4\x5f\xb2\x4f\xaa\x70" + "\x9d\x6d\xec\xcd\xbe\x86\x90\x78\xec\x2d\x4c\xc0\xb1\x77\x07\x9c" + "\x97\xf7\xfc\x85\x21\xd6\xd8\x9b\x03\xf7\xe4\xc7\xde\xbf\xc6\xe3" + "\xf1\xb5\x70\xad\xb2\xd8\x5b\xb8\xd6\xda\xee\x42\xb6\xdd\x60\xab" + "\x3a\x61\xec\x2d\x2c\x71\x06\xb7\xf4\xe6\xd0\xe2\x4f\xfa\x1a\x3d" + "\x2c\xbb\x9e\xa9\xc2\xe3\x5b\x03\xd8\xe4\xcf\x3b\x8c\xee\x57\x54" + "\x3b\x22\x98\xf9\xcc\x86\x78\x37\x7a\xd7\x00\x5d\x54\x0a\xfd\x1d" + "\x1d\xf8\x4c\x15\x9e\xab\xc4\x9a\x1b\xce\x2f\xa5\x77\x0f\xd0\xc9" + "\x7b\x6e\x52\x27\x8c\x7f\xea\x34\xe8\x2f\x9f\x2c\x33\x52\x96\xb7" + "\x63\xbc\xc1\x0f\x6a\x3a\x7f\x84\x81\x7e\xe7\xb1\xe4\x3b\xf9\x51" + "\x71\x27\x83\x2e\x23\x5c\x96\xce\x74\x1f\xa9\xfc\xf9\x8b\x90\xe3" + "\xe7\x2f\x0a\x95\xff\xfc\xa4\x4e\xe7\x9e\xbf\x08\x39\xf5\xfc\xbd" + "\xe0\xf9\x9b\xb4\x1e\xa0\x13\xa9\x2f\x9b\xb4\xee\x32\x9f\x47\xf2" + "\xfb\x77\xad\x78\x0f\xa7\xe3\x1f\xdd\x6b\xac\xe1\x93\x1d\x06\x0a" + "\x62\x00\x33\x86\xe3\xbe\x47\xe2\x5f\x2d\xc4\xac\xef\x68\x12\x93" + "\x0c\x32\x63\xd2\xce\x14\xe7\xef\xff\xb3\xe8\x36\xb8\xbf\x74\xfb" + "\x6d\x63\xe2\x01\xad\x41\x32\x26\x6e\x7e\x3e\xda\x3e\x26\xbe\x7f" + "\x44\x7e\x4c\x7c\x7f\xb5\x7d\x4c\xfc\xe0\x32\x17\x13\x3f\x38\xa3" + "\x3c\x26\x7e\x50\xe8\x7c\x4c\xfc\x60\xb9\xb2\x98\xf8\xc1\x68\xc7" + "\x31\xf1\x83\x02\x65\x31\xf1\x83\x02\xfb\x98\xf8\x01\x12\xc6\xc4" + "\x0f\xce\x4a\xfa\x32\xa7\x5f\x06\x8c\xd1\x5e\xd7\x54\x7f\xd8\x65" + "\x5a\x05\x5a\x37\xe7\xf7\xba\x28\x33\xdd\x40\xe7\xf6\xcb\xb0\x50" + "\xc3\x71\x5c\x89\x68\x68\x48\xf4\xb4\xbc\x15\xe4\x45\xf7\x0c\x19" + "\x4b\x37\xfb\xe3\xb9\xbd\x00\x78\x7e\x6f\xba\x21\xa8\x07\xfd\x56" + "\x50\xcf\x82\x7b\xc8\x17\x7e\xfe\x05\xec\x78\x0c\xff\x0e\xa1\xdf" + "\xf2\xef\x9a\xbd\x0c\x05\x7b\xd7\x23\x4f\x78\x86\x18\xef\x4c\x35" + "\x82\x18\xe4\x8b\xff\x4d\xaf\x2a\x2a\x2e\xba\x87\xdc\xbd\x75\xe0" + "\x1b\x1f\xb8\x9f\xce\x9b\xa6\x97\x04\xa1\xa2\xc5\xa0\xb9\x29\xe4" + "\xbf\x83\xa2\x8b\x4d\x0d\x41\x94\xd9\x77\xa2\x9a\xf8\x67\x57\x0c" + "\xa3\xbd\xf2\x22\x2f\x58\x7a\x45\x9e\x30\xa7\x27\xaa\xe8\xb7\x63" + "\x54\xf8\x59\xcd\x79\x91\x25\xf4\x66\xf8\xa5\x27\xf6\xc0\x1c\x1a" + "\x34\x79\x08\xdd\xe0\xdf\x15\xf4\x7a\xf0\x8e\x65\x28\xa0\xf0\x1e" + "\x0a\xa2\xef\x04\x51\xe0\xff\x18\xfc\xad\x51\xb0\x51\x8c\x85\x2a" + "\x2a\x86\x73\xee\x38\x26\xd2\xf8\xfe\x26\xb8\x7f\x33\xdc\xbf\x09" + "\x63\x1b\xf9\x17\xc1\xfd\xcd\x6f\x05\xc9\xec\x2f\xbb\x98\xf5\xbf" + "\xd6\xe7\xb2\x04\x47\x18\xe8\x03\xf0\xc3\xcf\x05\x36\x2c\xc2\x36" + "\x19\x1c\x51\x8f\x9f\x6d\xc3\x3d\x14\x0c\xcf\x19\x00\xcf\x10\x04" + "\xf7\xc5\x79\x5a\x62\x5e\x5f\xa4\xc6\x18\x15\x3c\x9b\x39\x97\x7d" + "\xb6\x9b\xf0\x6c\x37\xb8\x67\xc3\xf7\xc2\xf6\x91\x7a\x07\x1a\xb5" + "\xb2\x2f\xee\x9b\x3f\x78\xeb\x3a\x8f\xc3\xef\x43\xef\xbc\x9d\x28" + "\x13\xab\xbb\x24\xf3\x9f\x6c\x3c\x80\xfa\xd0\xea\xdc\x3d\x13\xd7" + "\x7c\x47\x47\x99\x10\x5a\x73\x00\x05\x57\x42\xbf\xae\x30\x5e\x47" + "\xb4\x4f\xee\x9e\x93\x41\x75\x32\xef\xb5\x3b\x56\xea\x5e\xeb\x57" + "\xd1\x55\xcd\x01\x78\x8e\x2c\x2a\x66\x23\x45\xeb\x9a\x02\x06\x64" + "\x9c\x3e\xdb\x84\x66\xe8\xf0\x3b\x57\x5a\xa7\x99\x86\x3c\x2f\xa9" + "\xf6\xa9\xd3\xcf\xe3\xf7\x43\xbb\xf5\xc2\xf7\x43\x1f\xba\x23\xd5" + "\x1f\xf7\x20\xd5\x9e\x6a\xa4\xfa\x28\x0e\x41\x39\xe1\xef\xe3\x2d" + "\x51\x7b\xfb\xa2\x34\x13\xfd\x03\x9d\x63\x2e\xcd\xa6\x68\x63\xd4" + "\x40\x37\x7d\xc9\x32\xfc\xbe\xe4\x8f\xef\x83\xfd\x7e\x84\x71\xd5" + "\x1b\xff\x1b\xd7\x97\xbc\x18\x3d\x76\x4d\xf5\xc7\x9d\xde\xf5\x9d" + "\xc7\x99\x7c\xa3\x32\x4c\x74\x0c\x6a\xd6\xcc\xd6\x37\xe6\x45\x1a" + "\x9a\xf1\x1c\xde\x2c\x1c\x83\x3e\xdc\xea\xed\x96\x81\x68\xf0\x3f" + "\x4d\xfb\xe3\x77\x86\x31\x05\xf0\xc3\xbe\x64\xfc\xd8\x33\xf4\x2c" + "\xf6\x37\xee\x0b\x45\xe4\xb8\x1a\xf7\x87\x8d\x6c\xbf\x31\xa8\x9e" + "\x8d\x33\x53\x08\x99\xe1\xfa\xf4\xcb\xa8\x0f\xfe\xc6\x6c\x21\x94" + "\x9b\x61\xf6\xc4\xfd\x38\xa6\x64\xda\x37\xe8\x4a\x32\xa2\xd2\x6f" + "\xa1\xee\x80\x09\xa6\x3f\x5a\xa0\x3f\x46\x5d\xf0\x36\x42\x5c\xb1" + "\xa4\xdd\x45\xde\x38\x4e\xe1\xef\xb5\x54\xd6\xe9\x91\xe5\x66\x50" + "\x8f\xed\x0b\x90\xaf\xe9\x66\x62\x4f\xc3\xcd\xc4\xc7\xb6\x5a\x90" + "\x6f\x8f\x64\xa4\x2e\x5c\x00\x58\x5c\x08\xfd\xf3\x06\xf4\xcf\x3a" + "\xd2\x3f\xad\xf8\xa3\xd7\x97\xeb\xf1\x3e\x7a\xa6\x6f\xe6\xb2\x7d" + "\xf3\xad\x20\x3c\x2f\x76\x1f\x7f\xa6\x85\x41\x54\x21\x45\x23\x78" + "\x46\xb0\xfb\xae\xaa\xa2\xb4\xce\x9e\x78\x1e\x93\x1e\x10\x84\xdf" + "\x71\x40\x5b\x69\xd3\x27\xe0\x0b\x8f\x81\x94\x86\xce\x8f\xca\x38" + "\x1d\x5d\x8b\xb8\x79\x93\x7d\x3e\x4d\x81\x03\x32\x34\xaf\xd0\x37" + "\x2f\xa9\xfe\xb8\x05\x8e\x7b\x6a\x7e\xfd\x8c\x1a\xfc\xc8\xae\x47" + "\xd8\xa7\xc6\xf3\xaa\x7a\xd5\x1f\xf1\x7c\x0f\xc2\xef\xe1\xbf\x66" + "\xde\x71\xed\xa9\x82\xb2\xc8\x0c\x36\x37\xa9\xcd\xfe\x16\xdf\x89" + "\x9a\x92\xb9\x4d\x4c\xbc\x6a\x06\x1f\x5c\x99\x87\xa8\x19\x75\x60" + "\x1b\x33\xd8\xa6\x21\xc8\x0b\xe2\x56\x34\x8e\x5b\x74\x4e\x48\x44" + "\xaa\x9e\xb6\x44\xc5\xab\x68\xb0\x8b\x67\xa5\xce\x8c\x5e\x4f\x46" + "\xf4\xca\xeb\x60\xa3\xfa\x6a\x04\x6d\xeb\x01\xb1\xad\x67\xe1\x32" + "\xe4\xbb\x1d\xec\xd3\xbd\x0e\x38\xcd\xa6\xf7\x92\x0f\xa4\x95\x7a" + "\x98\x01\xe7\x38\x8e\x79\x67\xba\x75\x01\x5f\xf5\xc8\xc2\xfd\x16" + "\xfa\xb1\x77\x26\x13\x57\x19\xdf\x9a\xde\x0a\x7a\xaa\xf9\xad\x20" + "\x0d\xfc\xfa\x5a\x63\x9d\x35\xce\xd0\xd9\xbb\xb5\x38\xce\x55\xea" + "\xf4\xc8\x04\xb6\xec\x81\xc7\xc4\xb7\x82\xfa\x30\x36\x7d\x03\x6c" + "\x3a\x07\x79\x0e\x31\x22\x37\x78\x2e\x35\x3c\x33\x2a\x4f\xbc\x84" + "\x63\xab\xbf\x19\xfa\x11\xb6\x33\xd4\x49\xd1\x80\x35\x4b\x8e\xd9" + "\x3f\x32\x49\x83\x4e\x06\x9d\x43\x38\x57\x6b\x7a\x23\xfd\x3d\x7e" + "\xc7\x56\xa9\x33\x21\xda\x2f\x2a\x83\xcc\xa3\xff\x31\xf9\x74\xb4" + "\x11\x49\x63\xfa\xa3\xa9\x1c\xa6\x3f\x9a\xca\x61\xfa\x23\x66\x0f" + "\x36\x1f\xd7\x8d\x3b\x01\xd7\xbe\x7c\x5c\xef\x5d\xd4\xa6\xb8\x9e" + "\x28\x1f\xd7\x5b\x6f\xf0\x70\x9d\xf6\xdf\xc1\xf5\xd7\x31\x0c\xae" + "\x55\xcd\x81\x0c\x5e\x53\x2a\x4d\x9f\x01\xff\xfd\x68\xb4\x15\xb7" + "\xa7\x3e\xc2\xb8\xfd\x78\x6d\x47\xc5\x6d\x63\x43\x90\x06\x7e\xad" + "\x8e\x5b\xa8\xd3\x69\xdc\x7e\x1d\xd3\x84\xac\xf6\xc3\xf8\xa5\x73" + "\x72\xf7\x68\xd2\xd1\xcf\x21\x4e\xa8\xbd\x33\xfb\xa2\x72\xc6\x86" + "\xfb\xd4\x9a\x5f\xd3\x96\x4b\xaa\x8f\x99\x3d\x00\x4d\xab\x68\xda" + "\xe2\x3b\x1e\xa5\x9f\x41\x6a\x4b\x9e\x47\x4e\xa5\x69\x3f\xf2\x4e" + "\x26\xef\x1e\x68\x9f\x7d\x11\xa0\xc3\x99\xf7\xcc\x96\xdc\xdc\xc3" + "\xe6\xdc\xf7\xe2\xcc\x10\x4f\xcc\xf9\x53\x91\x25\x77\x51\x86\xc5" + "\x67\x6f\x0e\x8d\xd7\x1d\xf8\x6c\xca\x68\xc8\xde\xa7\xb6\xbe\x0f" + "\x17\xe5\x46\xbe\x53\xf1\xdc\x27\x68\xaa\xfd\xeb\xe0\x2f\x05\xcf" + "\xb1\x17\xfe\xaa\xe0\xef\x72\x46\x63\xc9\x1a\xe7\xf6\x8d\x26\xef" + "\x9f\xa2\xf2\xd8\x38\x38\x86\xe9\x83\xcf\xa2\xee\xd7\xd8\x7f\xc3" + "\xf3\xec\xb4\xbe\x5f\xbf\x5f\x9e\xb3\xc7\x48\x7c\x6f\xb0\x89\x3b" + "\x79\xe7\x4f\xfe\x8f\xd7\xd3\xb0\xf5\x31\xff\xb7\x04\x68\x75\x25" + "\x69\x97\x50\x9d\x6a\xbf\x57\x25\x8c\xfd\x96\xcd\x51\x79\x1b\xef" + "\x01\x1e\x75\xf7\xe3\xef\x98\x1e\xe0\xef\x92\x15\xb8\xcc\x3e\x66" + "\x9f\x90\x25\x6f\x6c\x1c\xbd\xc9\x9c\x83\x35\x64\x03\x9d\xf8\x22" + "\xfb\xf7\x05\x8c\x6d\x32\xdf\xb2\x7f\x2a\x0d\xf6\xc3\xdf\x58\xbf" + "\xbf\xc6\x08\x7f\xfb\x3c\xc3\xbd\xcf\xf1\x54\x32\xde\x5a\x9f\x17" + "\x7f\x1f\x1d\xaf\xe1\x79\x26\x03\x65\x34\x88\x7c\x1f\x9d\x5b\xeb" + "\xb3\x7f\xb4\x25\x7f\x6c\x5c\x43\xf6\xfe\x3c\xe0\x00\x05\xfc\x36" + "\x8b\xf9\x02\xca\x17\x4b\x9d\x93\xe7\x87\xfd\x65\x52\xf5\x8c\x09" + "\x32\xd3\xf2\xea\x3a\x20\x99\xff\x88\x0e\x08\x54\x47\xed\x31\x97" + "\x58\x9a\x63\xbc\x4f\xa6\x5e\x97\xc9\x89\x0e\x24\x4b\xd5\x6b\xce" + "\x1b\xaf\x31\x0d\x80\xba\x07\xf6\x45\xe6\x85\x31\x2f\x83\x8f\xbc" + "\x30\xd7\x5b\x99\x44\xd6\x85\x95\xed\x31\x21\xcc\xfb\xf6\x2e\x28" + "\xa5\x9a\x9a\x63\x50\x0f\x03\x52\x4f\xac\x4f\xa7\x37\xde\x40\x01" + "\xf4\x5b\x31\xde\x59\x37\xd0\xc8\xe6\x3b\xfe\x5d\xdf\x5d\x8c\xdc" + "\x9b\x20\x26\x37\x2d\x49\xf4\xc6\x6b\xd0\xbe\xb8\x56\x42\x55\x9a" + "\x0e\x63\x9e\x19\x80\xc7\x01\xfc\xec\xe6\x3b\x31\x3d\xd6\xdd\x46" + "\xcc\x3b\xe6\x92\x59\x1f\xc0\x38\xf0\xc9\x4a\x8f\x95\x10\xfb\x20" + "\x76\x31\xe3\x81\x82\xb1\xa0\x09\xc6\x82\xc8\x18\xda\x58\x51\xfd" + "\x0d\x4a\xbf\x8e\xd4\xe9\x4b\x51\x77\x5c\x7f\xa5\xe9\x18\x19\x1f" + "\xa6\xc0\xf8\x00\xff\x07\x2d\x71\x7f\x7c\xd0\x4c\x44\x76\xe3\x03" + "\xd6\x21\x15\x17\x6a\x11\x60\xb9\xf3\xc4\x7a\x6f\x63\x5a\x3d\x6d" + "\xc1\x9a\x04\xbf\xcf\x86\x32\x3d\xac\x63\x05\x1e\x27\x9a\xd8\x71" + "\xa2\x90\x1d\x27\xb6\xb5\xc2\x38\xb1\x0d\x8f\x13\xe7\x10\xb5\x15" + "\x8f\x11\x30\x3e\x7c\xfc\x6f\x03\xd5\x0c\x63\x82\x3c\x3f\x17\x4b" + "\xe6\x3f\xa1\x37\x47\xcd\xb6\xc0\x58\x8c\xfd\xfc\x36\xf8\x17\xfb" + "\xb9\x32\x08\x7c\x5b\xdd\x79\x5c\x23\x1c\x37\x6d\x0e\xad\xda\x73" + "\xc5\x40\xc1\xf8\x64\x68\x04\x3c\xac\xb8\x8b\x28\x93\xef\x78\xcd" + "\xfe\x5f\xe7\x50\x58\xb7\x5a\xf2\xc3\x7c\x89\x46\xfe\xac\x1c\xcf" + "\xd1\x78\xd7\x22\x35\x9e\x3f\x35\xd3\x31\xde\x96\x1f\x63\xba\x5b" + "\xde\xf4\xf7\x6c\xfe\xd1\xbf\xeb\xfa\xb9\xc8\xdd\xf0\x66\xa2\x77" + "\xfa\x54\xa4\xfe\xf2\x1f\x39\x54\x45\x3d\xf4\xed\x4e\xc7\xca\x68" + "\xa8\xbf\xe8\x12\xd2\x16\xcd\x42\xc3\x77\x5c\x41\x9a\x1d\x73\x50" + "\xf0\xf6\x2b\x80\xa1\x37\x63\x7a\x34\x33\xf8\x68\x2c\x61\xd6\x07" + "\xcc\x41\x11\x74\x2f\x6d\x15\xfc\xd5\xe6\xcc\x01\x3d\xd3\x2b\xb4" + "\x8a\xf6\x1b\xaf\xb1\x40\xb9\x2c\xd0\x6e\xc0\xd1\xe1\x19\x3e\x3d" + "\x24\x86\x9b\xed\x32\x39\x44\x64\x34\xe0\xa6\x0a\x70\x73\x4b\x88" + "\x1b\xac\x5b\x19\xec\x44\x12\xec\xe0\x77\x80\x45\x7c\x7e\x31\xeb" + "\xb4\x62\xfc\x14\x00\x7f\x6e\xb4\xc1\x4f\xc1\x0d\xd7\xf0\xd3\x0c" + "\xf8\x29\x58\x05\xf8\x29\x47\xd4\x16\x8b\x2b\xf8\xf9\x8c\xd9\xff" + "\x8b\xe7\xf9\xc8\x7a\xa0\xe2\xbb\xd8\xcf\x80\xab\xfa\x29\x41\x6e" + "\x48\x19\xae\xc2\xa2\x5b\xc0\x55\x1e\xc1\xd5\xa1\x40\xf9\xb8\xfa" + "\x22\x80\x86\xfa\x1d\xe3\xea\xae\x04\xae\xc2\xa2\xed\x71\x75\xb0" + "\x7b\xfb\xe2\x8a\xc9\xcd\xf9\x3f\x80\xab\x83\x06\x21\xae\xfe\x14" + "\x49\x70\xf5\xa7\x09\x2e\xe0\xaa\x85\x78\x15\xce\xc6\xab\x3f\xaf" + "\x54\x80\xab\x54\xc0\x55\x0b\xf1\xea\xba\x14\xae\x44\xe2\xd5\xff" + "\x4b\x68\x5f\x5c\x31\xb9\x43\xff\x07\x70\xf5\xe7\x71\x42\x5c\x1d" + "\xda\x4d\x70\x75\x68\x97\x72\x5c\x85\xb7\x10\xaf\xc2\xd9\x78\x75" + "\xe4\x9c\x02\x5c\x9d\xa5\xa1\x7e\xc7\xb8\xba\x28\x81\xab\x70\x91" + "\x78\x75\xf8\x58\xfb\xe2\x8a\xc9\x6d\xfa\x3f\x80\xab\x23\x3b\x85" + "\xb8\xfa\xb3\x99\xe0\xea\xcf\x26\x17\x70\xd5\x42\xbc\xd2\xb2\xf1" + "\xea\xe8\x20\xf9\xb8\xfa\x32\x18\x70\xd5\x42\xbc\x3a\x26\x85\x2b" + "\x91\x78\xf5\x7f\x7e\xed\x8b\x2b\x26\xf7\xea\xff\x00\xae\xfe\xcf" + "\x28\xc4\xd5\xe7\x53\x08\xae\x3e\x9f\xac\x1c\x57\xda\x16\xe2\x95" + "\x96\x8d\x57\x5f\xac\x51\x80\xab\xd5\x34\xd4\xef\x18\x57\x2b\x25" + "\x70\xa5\x15\x89\x57\xc7\xe6\xb7\x2f\xae\x98\xdc\xb0\xff\x03\xb8" + "\xfa\x22\x5a\x88\xab\xa3\xfb\x09\xae\x8e\xee\x73\x0a\x57\x46\x1e" + "\xae\x2e\x74\x1e\xd7\x94\x4e\xf4\xe0\xde\x39\x2c\xae\x3e\x0c\x54" + "\xbf\xbd\x14\x51\xfb\xa7\x6d\xb1\xd1\x82\x25\x67\x6c\x31\x05\xb8" + "\x60\x30\x65\x7a\x13\x30\x75\x8d\x60\x2a\xed\x22\x60\xea\xdb\x2d" + "\x54\xa5\xee\x3a\xc6\x09\x83\xa1\x82\x39\x80\x21\xac\x0b\xdd\xdc" + "\x7d\xe5\x68\xc0\x77\xaf\x59\xb1\xf4\xe5\x91\x56\xc1\xd2\x64\xc0" + "\xd2\x59\x5b\x2c\x9d\xe4\xb0\x34\x49\x42\x03\xbe\x2e\x81\x25\x7d" + "\xcb\x58\xda\x8e\xe7\x10\x16\xb6\x11\x96\xce\x70\x73\x08\xfb\x66" + "\x19\x28\x93\x9f\x5c\x2c\x95\x14\x08\xb1\xf4\xa5\x1b\xc1\xd2\x97" + "\x48\x39\x96\xc2\xa3\xa5\xb1\x64\xe5\x53\x7f\x7d\xd2\x35\x2c\x01" + "\xb7\x12\x60\xa9\x65\x1e\xc5\x61\xe9\x2f\x1e\xed\x8b\x25\x1b\x1e" + "\xf5\xd0\x62\xe9\x2f\xb5\x42\x2c\x1d\x67\x75\xdf\x71\x49\xdd\x67" + "\x81\xb1\x0b\xbf\x73\xc2\xfb\x6c\xcd\x77\x62\x5e\x36\xc3\x98\x86" + "\xf7\xdb\xe2\xf7\x14\x9f\x2c\xa8\xa2\x30\x9e\xb2\x6f\xa3\x80\xac" + "\xc5\x68\xa4\xb7\x91\x60\xc5\x04\x58\x59\x7b\x1b\xb9\x37\x37\x03" + "\x4e\x9a\x90\x7b\x23\xd8\xbb\xb1\x39\xd1\xbb\x2c\xae\x16\x7d\x79" + "\xa3\x0a\xc6\xb2\xc3\x68\x07\x5c\xd3\xcc\xce\x43\x5a\xde\x8e\xe9" + "\xb1\x6e\x05\x9e\x87\x2c\x47\x25\xd3\xb6\x81\xff\x4f\xb8\xec\xff" + "\xc6\xdf\x4a\xf9\xff\x98\xc0\xf7\x05\x3c\xbf\x6b\x7e\xa9\x7c\x1e" + "\x92\x79\x4f\xb5\x80\xf8\xde\xea\xf7\xad\xad\xe0\xf7\xad\xac\xdf" + "\x5d\x1b\x8f\x4e\x48\xaf\x7f\xe4\xc5\x0a\x66\x4d\x81\x91\xc4\x08" + "\x6b\x5c\xc0\x31\x02\xf3\x97\x46\xdf\xd0\xb3\xb6\xe3\x0d\x8e\x0f" + "\x37\x54\x5f\x45\xe2\xb1\x49\x92\xc7\xb0\x71\x22\x7d\x39\x89\x13" + "\x2c\x8f\xb9\xd0\xba\xf3\x8f\x7f\x0b\x6d\xbb\x78\x71\xac\xe5\xb1" + "\xc7\x05\x1e\x83\x71\x53\x60\x83\x9b\xb6\x88\x17\xca\x70\xf3\x95" + "\xbf\x30\x5e\x9c\x5c\x4a\xe2\xc5\xc9\x14\x67\xc6\x1e\xc7\x78\x0a" + "\x9b\xcc\xc3\x53\x1e\x87\xa7\x53\x85\x78\x8e\x52\x1e\x9e\x4a\x42" + "\x5a\x77\xde\xb1\x74\x4d\xfb\xe2\xa9\xf5\xe6\x1d\x3b\x36\x9e\x4e" + "\x25\x0a\xf1\xf4\xd5\x49\x82\xa7\xaf\x4e\xb4\x02\x9e\x78\xf1\x29" + "\x9c\x17\x9f\xbe\xbe\x8e\xe7\x26\x65\xe2\x69\x75\xeb\xce\x37\x9e" + "\x3e\xd7\xbe\x78\x6a\xbd\xf9\xc6\x8e\x8d\xa7\xaf\x0f\x0b\xf1\x74" + "\xda\x8f\xe0\xe9\xb4\xaf\xeb\x78\x0a\x9f\x6c\xcb\x89\x09\x9e\x2a" + "\x5e\xc0\xfc\x59\x26\x9e\xaa\x5b\x77\x9e\xb1\x3c\xb0\x7d\xf1\xd4" + "\x7a\xf3\x8c\x1d\x1b\x4f\x15\x9e\x42\x3c\x95\x25\x10\x3c\x95\xc5" + "\xb7\x02\x9e\x78\xf1\x49\xcb\x8b\x4f\x55\x1b\xf0\x5c\xa4\x3c\x3c" + "\x1d\x6f\xe5\xf9\xc5\xca\xa5\xed\x8b\xa7\xd6\x9b\x5f\xec\xd8\x78" + "\xaa\x8a\x11\xe2\xa9\xe2\x10\xc1\x53\xc5\x41\xd7\xf1\xa4\xe5\xc5" + "\x27\x2d\x2f\x3e\x7d\x73\x11\xcf\x41\xca\xc4\x53\x46\xeb\xce\x2b" + "\x9e\x39\xd9\xbe\x78\x6a\xbd\x79\xc5\x8e\x8d\xa7\x6f\xf6\x08\xf1" + "\x74\xc6\x83\xe0\xe9\x8c\xbb\xb3\x73\x41\xd6\x39\x20\x3e\x9e\xa4" + "\xb5\xdd\xb9\xfe\xb6\xda\x4e\xde\x1c\x10\xe8\x3c\xc5\xf3\x89\x67" + "\xbb\x3c\xa8\xf3\x89\x18\x43\xd6\x79\xa0\x8e\x37\x07\x74\xb6\x4e" + "\x88\xa1\xbf\x4f\x22\x18\xfa\x7b\xb4\x14\x86\x4c\xfc\x35\x69\x3f" + "\xf0\xd6\xa4\x5d\x47\xd4\xfe\x05\x25\x54\x05\xbb\x26\x0d\xaf\x47" + "\xab\xa8\xa9\x45\xeb\xee\x21\x75\x8f\x44\xa4\x9e\x98\x9c\x4e\x6f" + "\xc4\x31\x64\x49\x8c\xf7\xbb\x57\xd0\xc8\x66\xc0\x4c\xf6\x35\x76" + "\x5d\x1a\xe0\xe6\xeb\x0b\x46\xf4\xc5\x02\xbc\x2e\xad\x18\x15\x41" + "\x39\x53\x1e\x99\x0f\xc2\x71\x84\x59\x93\x36\x07\xaf\x49\xfb\x87" + "\x8f\xe8\x9a\xb4\x55\x32\xd7\xa4\xa5\x00\x0e\xea\x01\x07\x77\x31" + "\x06\x0e\x09\xd6\xa2\x6d\x5f\xc5\x9b\x03\x9a\x25\x31\x07\x54\xed" + "\xdc\x3b\x89\x56\x5f\x8b\x76\x93\xb7\x16\xcd\x3a\x07\x34\x0d\x62" + "\x87\x6c\xbf\xff\x43\x32\xff\x29\x8e\x11\x66\x88\x09\x13\xf1\xda" + "\xf2\x7a\x6e\xbe\x38\x35\x09\xef\xfd\x0d\xad\x32\x41\xac\xc0\xeb" + "\xc7\x0f\xcc\x2a\x65\xe6\xfb\x2a\x75\xd5\x68\x5d\x13\x52\x7b\x1b" + "\xd8\xb8\xe0\x17\xe6\xdb\x0c\xb1\xc1\x0c\xe3\x12\xf8\xba\x7b\xf3" + "\x12\x88\x0d\xb7\x21\x36\x2c\x81\xd8\x70\x17\x62\xc3\xa5\x52\x26" + "\x36\xd0\xef\x1c\x2b\xc3\x39\xb6\x8b\xae\xa1\xe1\x85\xd7\x90\x16" + "\xc7\x00\x73\xfe\x78\x4d\xb3\x5f\x68\xbd\xc1\x2f\xd4\x48\xfb\x85" + "\x79\x12\x0c\x34\x96\x64\x2d\x46\x4c\xac\xc7\xbe\xd7\xcc\xc1\xf1" + "\xa0\xba\x77\xf3\x2a\x84\x5c\xc1\x41\x33\x7f\x4e\x90\x8f\x03\x89" + "\x18\xe0\x32\x16\x6c\xe6\x81\xb7\xbb\x18\x03\x30\x16\xb6\x5b\x63" + "\x80\x4b\x58\xa8\x96\xdc\xff\xe3\x18\x0b\x61\xd1\x4e\x60\x21\xcf" + "\x39\x2c\x7c\x11\x80\x73\x53\xdb\x63\x21\x2c\xc5\xe0\x17\xa6\x83" + "\x73\x6b\x09\x16\xee\x8a\x60\xe1\xdb\xc0\xb6\xc7\x82\x70\x4e\xe6" + "\xe1\xc5\xc2\xb7\x26\x85\x58\x70\x22\x2e\x84\x3b\x19\x17\xbe\x48" + "\xc5\x39\x9d\x45\xb0\x00\x71\x21\x0c\xe2\x42\x38\x1b\x17\xae\x8b" + "\x60\xe1\xc2\xd0\xb6\xc7\x82\x70\x3e\xe5\xe1\xc5\xc2\x45\xe9\xfc" + "\x17\x0e\xb1\x10\xee\x44\x5c\x08\x77\x36\x2e\x9c\xc5\xb9\x90\xed" + "\xb1\x10\x0e\x71\x21\x1c\xe2\x42\x38\x1b\x17\x2e\x8a\x60\xe1\xdf" + "\x2f\xb4\x3d\x16\x84\x73\x21\x0f\x2f\x16\xbe\xf3\x55\x88\x05\x27" + "\xe2\x82\xd6\xc9\xb8\xf0\x65\x30\xce\x21\x2c\x82\x05\x88\x0b\xe1" + "\x10\x17\xb4\x6c\x5c\x38\x26\x82\x05\xfd\xf8\xb6\xc7\x82\x70\x1e" + "\xe3\xe1\xc5\xc2\xf7\x1a\x65\x58\xd0\x3a\x11\x17\xb4\x4e\xc6\x85" + "\x2f\x57\xe3\xdc\xbb\xf6\x58\xd0\x42\x5c\xd0\x42\x5c\xd0\xb2\x71" + "\x61\xa5\x08\x16\x2e\x4d\x69\x7b\x2c\x08\xe7\x20\x1e\x5e\x2c\xfc" + "\x27\xd8\x21\x16\x68\x7b\x2c\xe0\x39\x04\xac\x1f\x71\x6e\x6b\x06" + "\x0b\x73\x4b\xa8\x26\x1a\x63\xa1\x14\xad\x5f\xc1\xc3\x42\x3e\xd1" + "\x11\x56\x1c\x6c\xe0\xe3\x00\xef\x5f\xc2\x38\x00\xfd\x60\x02\xbf" + "\xd3\x9b\xb5\x55\xcc\x7a\xa5\xfc\x30\x4f\xac\x1f\xf0\x3c\x03\xd6" + "\x10\xd2\xfa\xa1\x66\x6a\xab\x60\x60\x1e\x60\xa0\x4e\x5c\x47\xb6" + "\xba\x7e\xb8\xd9\x46\x18\x00\x2d\xb9\x2d\xcd\x15\x0c\x5c\x0e\x91" + "\x8f\x01\xe0\x08\x4e\x61\x80\xf0\x04\xc7\x18\x08\x4f\xe6\x30\x00" + "\x7c\x21\x3f\x7c\x2d\xe6\x07\x04\x03\xe1\x3a\x69\x7e\x70\x65\x7a" + "\xdb\x63\xa0\x95\xf9\x41\x87\xc5\xc0\x0f\xc3\x25\xf7\x30\xe2\x58" + "\x0e\x71\x7f\xe2\xc0\xbe\x88\x7e\x33\xe6\xe5\xec\x6b\x28\xe0\xdd" + "\xb9\x68\x24\xce\x1b\xb3\xbf\xc9\x48\xa5\x25\xd3\x3f\xe0\xbd\xd5" + "\x26\x68\x07\xce\x4f\xcc\xe0\xe3\xa6\xbf\x67\x65\xa2\x01\xad\x03" + "\x2c\xbc\x0b\x6d\xc0\x79\xe0\x7b\x24\x77\x1e\x57\x51\x7f\x1a\x35" + "\xdd\x89\x41\x65\x71\xd7\x50\x54\x10\xdd\x5c\x79\xa1\x04\xef\x61" + "\x74\x2f\x59\x76\x1a\xef\x13\xef\x3a\x43\x87\xa8\x1b\xaa\x1f\x8c" + "\x78\x4e\x69\x88\x0e\xa9\x0b\xae\x91\x79\xa4\x75\x37\x10\x3a\xa9" + "\x43\x88\xf8\xbd\x76\x8a\xc7\xf2\x56\x98\x43\x8a\x05\xbf\x5f\xb0" + "\xfa\xfd\xa4\x70\x0e\x89\x72\x62\x3f\xa3\x13\x73\x87\x6d\xb2\x9f" + "\xf1\xa6\xfd\x7e\x46\x65\x73\x87\x57\x25\xbf\x7f\xcd\xcc\x33\xb3" + "\x3c\xe0\xed\x14\xa6\xdf\x33\x7e\x6d\x86\xd8\x5f\xa9\x3b\xcc\xac" + "\x8f\xc6\xfd\x1c\xf7\x79\x8c\x8f\x74\x68\x2f\xc6\x08\xc6\xc3\xc4" + "\x3d\xcd\xcd\xaf\xd7\x23\xca\xe2\x17\xe6\x8b\x31\x61\x59\xe8\xef" + "\x99\x05\x6d\xaa\x8c\xbb\x04\x7e\xbf\x8d\x2a\x6b\x58\x9f\xaf\xb8" + "\x04\xbe\xbc\x5a\x43\x2f\x0c\xea\x3a\xb8\x1e\xe1\xbc\x20\xea\x19" + "\x78\xcf\x31\x8c\x03\xdb\x81\x13\x14\xcd\x45\xc3\xe9\xfc\x50\x43" + "\x33\x1b\x1b\x2c\xd6\x79\x25\x3c\x46\x00\x26\xde\x5d\x00\x98\x48" + "\x01\x4c\xbc\x8e\x31\x71\x2d\xc9\x63\xa9\xc8\xfc\xb2\x0c\x4c\x30" + "\xf3\xcb\xf1\x80\x89\x1a\x0e\x13\xf7\xe7\x95\x25\xc6\x84\x92\x69" + "\x2e\xac\x2d\x14\x89\x07\x2e\xcf\x2b\xdf\x64\xe7\x95\x79\xf1\x40" + "\x19\x36\x7e\x94\xce\x89\x29\x89\x8d\xb0\xe8\x96\xb1\xd1\x60\xc5" + "\x46\x5e\xcb\xd8\xa8\x43\xf6\xd8\xf8\x22\x80\xc3\x46\x58\x32\x87" + "\x0d\x76\x9e\x29\x3f\x6c\xad\x3d\x36\xea\xd6\xb4\x0f\x36\x6c\xd6" + "\xfd\x3c\xb4\xd8\xb8\x1e\xa7\x00\x1b\x4e\xc4\x8d\x9b\x2c\x36\xc2" + "\x9d\x88\x1b\x37\xfa\x88\x60\x23\x95\x87\x0d\x5e\xdc\x60\xe7\x9d" + "\xf2\xc3\x45\xe2\xc6\x8d\xf7\xdb\x07\x1b\x36\x6b\x78\x1e\x5a\x6c" + "\xdc\x4c\x95\x8f\x8d\x70\x27\xe2\xc6\x77\x56\x6c\x38\x11\x37\x0c" + "\x5a\x11\x6c\x9c\xe5\xb0\x11\xce\x8b\x1b\xec\x3c\x14\xe6\x9c\x76" + "\xd8\x30\x1c\x6b\x1f\x6c\xd8\xac\xc7\x79\x68\xb1\x71\x4b\xf2\xfb" + "\xd7\x0e\xb0\xe1\x44\xdc\xf8\x92\xc5\x86\xd6\x89\xb8\x71\x7b\xb2" + "\x3d\x36\xbe\x0c\xe6\x61\x83\x17\x37\xd8\x79\xa9\x7c\xad\x48\xdc" + "\xb8\x7d\xbe\x7d\xb0\x61\xb3\xb6\xe6\xa1\xc5\xc6\x9d\x83\xf2\xb1" + "\xa1\x75\x22\x6e\xa4\x5b\xb1\xe1\x44\xdc\xa8\x4f\x16\xc1\xc6\x6a" + "\x0e\x1b\x5a\x5e\xdc\x60\xe7\xa9\xf2\xb5\x22\x71\xa3\xfe\x6e\xfb" + "\x60\xc3\x66\x9d\xcc\x43\x8b\x8d\xbb\x55\xce\x60\x23\xb5\x5e\x44" + "\xa7\xd4\x10\x6c\x34\x43\x19\x3e\x2e\xf8\xda\x04\xda\xe7\x1e\x05" + "\x9a\x05\x63\x62\x7a\x2a\xa2\x18\x5c\xd4\xf3\x71\x71\x6f\x2d\xc6" + "\xc5\xa0\x44\xc0\xc5\x65\x16\x17\x56\x5d\xc2\xe4\x5e\x21\xda\xc4" + "\x3a\x67\x65\xd5\x27\xeb\xb1\x66\x4d\xb4\x62\xa2\xa1\x8b\x47\x52" + "\x2b\x60\x42\xb0\xee\x81\x87\x89\xa9\x12\xfa\xe4\xd7\xca\x31\xb1" + "\x0d\xb4\x6b\x73\x6b\xef\x7d\xb2\x62\xe2\xbc\xab\x98\x68\x70\xb8" + "\xfe\x41\x1c\x13\x2c\xcf\x90\xc4\x04\xc7\x2d\x08\x26\xbe\x73\x80" + "\x09\x63\x81\x3d\x26\x58\x5e\xc1\xe4\x21\x20\xdc\xc2\x3a\x87\x65" + "\xe5\x17\x42\x4c\x34\x3e\xd9\x3e\x98\xb0\xe1\x17\x0f\x2d\x26\x1a" + "\x8d\x92\x73\x58\xab\x10\x55\xb8\xca\x52\x9c\x43\x59\x0e\xc3\xaf" + "\x04\x7e\xa5\x70\xcc\x03\x8e\x31\xb1\x05\xfe\xcf\x9c\xb3\x74\x65" + "\x72\x0f\x97\x78\xbb\xc5\x61\x7b\xe3\x32\x9d\xac\x65\xbc\x33\x51" + "\x44\x11\x5b\x07\x1c\xcf\x80\xe3\x25\x3d\xdc\x22\x3a\x41\xf9\x52" + "\x3a\x7b\x7f\x19\x1c\xeb\x8c\xcb\xd2\x99\xee\x64\x9f\x0d\x45\xe1" + "\x3a\x6c\xef\xe9\xc9\x96\xe9\xc3\xbf\x6f\xf7\xcc\x08\x9c\xcb\xcf" + "\x5a\xa6\x8b\x85\xfa\x36\x06\x97\xb3\xb8\xb9\x6b\x2c\xab\x90\x86" + "\x5f\x96\xfe\x05\xc2\xf5\x5a\xcb\x76\x65\xeb\x0b\xe0\x97\x31\x7f" + "\x80\x50\x0f\x37\x0d\x53\x67\x8f\x64\x0a\xb7\x09\x97\xed\x46\xf7" + "\xd8\x17\xc0\x94\x77\x73\x0f\x12\x94\x7f\x07\x31\x65\xd9\x72\x5e" + "\x74\xa7\xbf\x9c\x60\xcb\x31\xef\x07\xe0\x98\x3b\xdf\x7e\x6c\xb9" + "\xee\x56\xdb\xe0\xfc\x7d\xfc\xb6\x9a\x57\x51\xb8\x3e\x5c\xa6\x87" + "\xa5\xd3\xf1\xb3\x6c\x5b\x86\xf3\xef\x89\xcb\xc1\x75\x43\x59\x3b" + "\x7b\x43\x1b\xb4\xf7\xeb\xcb\x31\x97\x5a\xcb\x01\x0e\x7b\x17\x71" + "\xb6\x51\xd3\xd9\x07\xe2\x70\xce\x72\x5b\xdf\xf5\x70\x73\xd3\x63" + "\xdf\x55\xd6\x21\x84\xcb\xd2\x3d\x0e\xf8\x42\x79\x1f\xb6\x1d\x11" + "\xa4\x1d\x4c\xce\x44\xe2\x6b\xca\xf4\xd8\x0e\xe6\x59\xdd\x34\xec" + "\xb3\xf6\x84\x72\xa3\xad\xf5\x5a\x28\x06\xc3\x6c\x59\x77\xa6\x6c" + "\xc5\x3c\xfc\xad\xaf\xfb\xe5\x1f\xc3\x65\xcd\xd9\x5f\x14\x9b\x33" + "\xdd\xc7\xd9\xd6\x6f\x5e\xe5\x89\xcf\xf3\xeb\xf7\x25\xe5\x8b\x77" + "\x42\xf9\x09\xf6\xe5\xd5\xb6\xe5\xfd\x48\xf9\xcf\x8c\x50\x3e\xda" + "\xbe\xbc\xa9\xa7\x4d\xf9\x5e\xa4\xfc\xa1\x68\x28\x3f\xd9\xbe\xbc" + "\xc6\xb6\xfc\xe3\xa4\x7c\x89\x09\xca\xc7\xd8\x97\x8f\xb0\x2d\xef" + "\x4f\xca\xff\x79\x0f\x94\x8f\xb5\x2f\x9f\x61\x5b\xbe\x37\x29\xff" + "\x39\x82\xf2\x71\xb6\xe5\x8b\x98\xb2\xe8\x29\xb6\xec\x13\xa4\xec" + "\xd1\x18\x28\x1b\x2f\xd2\x56\x15\x5b\x77\x08\x5b\xfe\x27\xa4\xfc" + "\x81\xc3\x50\x3e\xd1\xbe\xbc\xbb\x6d\xf9\x3e\xa4\xfc\xdf\x3d\xa1" + "\xfc\x3c\x11\x5f\xd9\x96\x7f\x92\x94\x3f\x19\x04\xe5\x93\x45\x7c" + "\x65\x5b\xbe\x2f\x29\xff\x95\x0e\xca\xa7\x88\xd8\xde\xb6\x7c\x3f" + "\x52\xfe\x54\x29\x94\xd7\x89\xd8\x5e\x58\x3e\xbb\xcc\x1f\xca\xa5" + "\xee\x60\xb1\x69\x63\x77\xdb\xba\xfb\x93\xba\x2b\x12\xe1\x9a\x0c" + "\xfb\xf2\xc8\x8d\x94\x47\xc3\xd8\xf2\x4f\x91\xf2\x55\xd8\x96\xab" + "\x45\x6c\xff\x34\x2e\x5f\x44\xca\x3e\x4d\xca\xfe\x75\x1c\x94\x5d" + "\x2b\x62\x77\x7e\xd9\x00\x52\xf6\x3f\x29\x50\x36\x4b\xc4\xe6\xfc" + "\xb2\x81\xa4\xec\x3f\x83\xa1\x6c\x8e\x88\xbd\xf9\x65\x07\x90\xb2" + "\xe7\xb5\x50\x36\x4f\xe4\x79\x9f\xe2\x95\x7d\x86\x94\xfd\xd7\x68" + "\x28\xbb\x45\xc4\x2f\xfc\xb2\x41\xa4\xec\x65\xec\xc3\x02\x11\x9f" + "\xf0\xcb\x0e\x24\x65\x2f\xe2\xbe\xb6\x53\xc4\x27\xfc\xb2\xcf\xd2" + "\xd9\xdf\xc5\xb2\x71\x7a\x97\x6d\xd9\x1d\x5c\xdc\x7d\xce\xd2\xe3" + "\xfb\x44\x36\x56\x92\xb5\xe1\x50\x8e\x1b\x73\x4c\x3f\xb5\x8e\x11" + "\x16\x0a\x05\xd3\xd9\xe7\x26\xc0\x75\xb8\xce\x7d\xf6\xb1\xcd\xfd" + "\xa7\x3b\xb8\x31\x62\x10\x9d\x7d\xcf\x9f\xbd\x7f\xb1\x7d\x59\x4f" + "\x7e\xd9\xc1\x74\xf6\xd5\x64\xb6\xec\x41\xfb\xb2\x6a\x7e\xd9\x21" + "\x74\xf6\x8f\x59\x6c\xd9\xc3\x22\xf1\x75\x18\xaf\x6c\x08\x9d\x7d" + "\x7d\x0f\x94\x3b\x2a\x16\x5f\xe9\x55\x9a\x61\x38\x1e\x58\x63\x37" + "\x94\x1f\x4a\xec\x6b\xc4\x78\x28\xc1\xe5\xad\x65\xc1\x0f\xc3\x78" + "\x63\xe5\x30\x4b\x8f\x9b\x27\x58\x9b\x9d\xb0\x7f\x86\x0c\xfe\x33" + "\xfc\x94\xd4\x79\x4b\x0f\x75\x96\xda\x3e\x03\x1b\x8f\x30\x4f\xc0" + "\xf6\x1d\x6e\xce\xbe\x63\xc2\xf6\x85\xb2\x65\x02\x8e\x40\xb9\xa9" + "\x70\x9d\xac\x6f\x43\xe9\xec\x1f\x52\x59\x1b\x08\xc6\x23\xe8\x8f" + "\x4c\x3c\x04\xff\x96\xd2\xef\xf4\xc4\x75\x87\xb1\xe5\xce\xda\x8e" + "\x83\xec\xf3\x85\xc3\xb9\xea\xfb\x63\xa0\x9b\xfb\x05\x31\x2e\x93" + "\xfc\x2c\xea\x76\xcd\x5d\xc5\xc4\xf7\xfb\xdf\xf1\x75\xf7\x60\xc6" + "\x69\xcb\xae\xc0\xe2\xa8\x7a\xda\xc4\x3f\xb6\x91\xa2\xab\x86\xd4" + "\x23\x77\x9c\xa7\x9b\xf6\x8b\x8a\xd1\xc3\x71\x43\xe0\x80\x8c\x86" + "\x4d\xaa\x38\xbd\xdb\x31\x77\x9c\xcb\x15\xfe\x3d\x4f\x8f\x92\x26" + "\xe0\x7f\x6f\x5c\x45\x1b\x71\xfe\x64\xf3\x26\x73\x4e\xa5\xa5\x0e" + "\xf0\x47\x1b\xa1\x0e\x23\x70\x46\x15\xfe\x86\x35\xfe\x8e\x44\xa5" + "\xae\x0e\x5d\x71\x57\x7d\x4a\x2f\x4c\x1c\x49\xe7\xc5\xe8\xe1\x7e" + "\xf1\x97\xe0\xff\xc4\xa6\xc0\xa9\x73\xcc\xfb\x4a\x16\x37\xe1\x32" + "\x8d\x06\xbf\x18\x3d\xfd\xdb\xd7\x6a\x93\xd3\x50\x3f\x78\x6e\x86" + "\xa3\xe1\x1c\xb6\x16\x1f\xf3\x3e\x26\x77\xed\xcd\xc4\x17\x99\xbc" + "\xb5\xee\xee\x66\x9c\xaf\x16\xe7\xad\xbd\x9f\xb3\x76\x67\x7c\x06" + "\x93\x07\xd7\xdd\x3d\x92\x69\xcb\x2a\xba\x8a\x0e\x08\xdc\x62\x69" + "\x5a\x9d\x81\xbf\x37\x5d\x92\x76\x0d\x5d\x62\xcf\xe1\x3a\xd9\x7a" + "\xca\x6d\xeb\xc1\xd7\x19\xfa\xc7\x67\x80\x0d\xb6\x98\x73\x42\x76" + "\x5a\xd4\x21\x05\x74\xce\xf3\x7b\x2a\xa1\xd5\xcc\x37\x19\xdd\x3d" + "\x06\xd1\x3d\xa6\x56\x5a\x72\x42\x56\xc3\xf1\x2d\x95\xf5\x4d\xcc" + "\x71\xa8\x7b\x0b\xe6\xbd\x77\xd4\xe1\x31\x74\x4e\x78\x6c\xc9\x13" + "\x4d\xa8\xc6\x9d\xf4\x61\x7c\x9c\xce\x7d\x7e\x0f\xb6\xa7\x25\xf7" + "\xf9\x2d\x2a\x7f\xe4\x7e\xc7\x27\x3c\xa6\x61\x93\xfb\x61\xeb\xf7" + "\xe8\xac\xf7\xc2\xf5\xea\xd9\xba\x9c\xce\xb9\xeb\xee\x1e\x81\x73" + "\xee\x3a\x5f\x5e\x65\xc4\xe5\xc5\xbf\x41\x02\xfc\x2a\xd7\x5c\xda" + "\xb0\xc9\x63\xb2\x5e\xd5\xa4\x25\x3e\xf7\xf8\xff\xec\xbd\x0b\x7c" + "\x94\x55\x96\x2f\xba\xaa\x52\x81\x02\x03\xa9\x84\x00\x25\xa2\x16" + "\x36\xd8\xa5\xf2\x08\x08\x36\xd2\xa0\x51\x12\x0c\x1a\x20\xca\xc3" + "\x28\x11\x12\x4d\x34\x68\x80\x98\x44\x28\x20\x50\xa1\x40\x1b\x6d" + "\x1e\x49\x8c\x18\x35\x24\xb1\x4d\xf7\xa1\x67\xe8\x91\xb9\xc3\xcc" + "\xc4\xfb\xa3\x35\xdd\xa4\xef\x61\x66\x20\xc5\x9c\xc1\x73\x73\xfa" + "\xd0\xdd\x05\x37\x66\x22\x13\xb0\x34\x05\x29\x49\xa5\xf6\xf9\xaf" + "\xbd\xbf\x2f\xf5\xa0\x82\x7a\xa6\xcf\x9c\xdf\xbd\xd7\xe8\xc7\x57" + "\xdf\x7e\xac\xbd\xf6\x5a\x6b\xaf\xbd\xf6\x6b\xed\x3c\x60\xa3\xf1" + "\x3f\xbe\xd8\x63\xa0\x73\xda\x6f\xbe\xff\xb4\x40\xfb\xbd\x5b\xf7" + "\x71\x1c\x13\xae\x65\x00\x74\x1c\x38\x16\x7c\x2f\xc7\xcc\x36\xbe" + "\xba\xa3\x61\xa0\xde\x76\x1b\x19\xba\x4c\xc3\xcc\x28\xf3\x98\xe2" + "\x49\xfc\x79\xbc\x13\xb5\xb7\x57\x7b\x0b\x4e\x23\xe5\x38\x25\xbb" + "\x0e\x74\x6f\xd2\x78\xf1\xb5\x1c\xdb\xb0\xdc\x40\xb6\x44\xd2\xbc" + "\x26\x09\xf7\xad\x1c\x4f\x38\x0e\x48\x43\xa9\x33\x67\xdd\x3b\x7b" + "\xce\x7d\x3f\x9a\x7b\x7f\xfe\xb3\xcf\x15\x14\x3e\xff\x42\xd1\xba" + "\x17\x5f\x2a\x5e\xbf\x61\x63\xc9\xcb\xa5\x65\xe5\xaf\x6c\xda\xec" + "\xd8\xb2\x95\xd3\x0d\xe2\xfb\x5e\xba\xc1\x67\x24\xf0\xf6\x61\x94" + "\x33\x6c\xbd\x2c\x1b\x61\x4a\xc6\x86\xe5\x9a\x6c\xb1\xc7\x0f\x6e" + "\x58\xf4\x7c\xcf\x61\x8f\x69\xd8\x47\x7c\xe7\x22\x64\xdc\xe0\xae" + "\x7f\xa4\x95\xef\x6b\xee\x34\x0d\x3b\xd2\xee\x7d\xa4\x95\xef\x17" + "\x3f\x61\xed\xa6\xc9\x77\x90\xe1\xa2\x69\x58\x1d\xc7\x37\xde\x49" + "\xd4\x86\xbc\xb1\x60\xde\x61\x21\xeb\x9b\xe3\x84\xb7\x76\x9c\xe8" + "\x61\xf8\xb5\x07\x45\xb7\x77\x5b\x11\xed\xc7\x37\xda\x99\xa5\xcb" + "\x34\x7c\xfd\x89\x89\xf2\x9e\xd6\x89\x0d\x07\x45\xe7\xee\x71\xa2" + "\x73\xd7\x41\xd1\xd3\x38\x4e\x78\x26\xd7\x52\x42\x5f\xcd\x70\x9b" + "\xc7\x34\xcc\x21\xdb\x2c\xe2\x83\xc9\xc3\xac\x07\x10\x37\x23\x40" + "\x71\x8d\xf8\x46\x98\xef\x84\x4d\xe1\xfd\xe1\x57\xfe\x78\xc0\x33" + "\x89\xfe\x62\xc3\x7e\x94\xa3\x78\x32\xbc\xba\x0d\x96\x07\xca\xf3" + "\xba\xfd\x17\xc8\x63\x1a\x5e\xd5\x78\x55\x96\x97\xe8\xae\xeb\x21" + "\x86\xf7\x57\xa5\xfe\xf8\xb2\x09\x22\x80\xb4\x25\xc1\x6d\xc5\x06" + "\xa4\xc9\x02\x6c\x5f\x78\x7d\xec\xcf\xaf\x2f\xb7\x6d\x78\xa5\xb8" + "\xf8\xae\x91\x64\x97\x6f\x0a\xbf\x6b\xbc\x9c\xfd\xab\xbf\x79\x50" + "\xb4\xa1\x9e\xad\xa8\xef\xc9\xd3\x18\xa9\x40\x3e\x08\x75\xaa\x02" + "\xdc\xcf\x10\x7e\x1c\xbf\x8f\x03\xf7\x93\xf2\x1e\x63\xd3\xcd\x49" + "\xa2\x66\x78\x3d\xf0\x3c\xc9\xf7\xb1\xb1\x3f\xf6\xde\xcd\x2b\x0c" + "\xa8\x77\x2d\xd2\x9d\xb4\x4d\xa0\x29\x5d\x26\xf3\x7a\xe0\xd1\x8c" + "\xdf\x9c\xfe\x66\xe6\x23\xd2\xb7\xa9\x7a\xdd\x2c\xef\xcf\x06\xad" + "\x5a\x0f\x8d\x13\x7b\xfb\x6a\xcc\x99\x7c\xcf\x84\xbc\x37\x13\xdf" + "\xa0\xcb\x49\xa4\xad\xea\x75\xae\x30\x60\xbc\x6b\x68\x0c\xc1\xb4" + "\x32\x4e\x8c\x07\x8f\xa1\xff\x09\x56\x68\xb0\x3f\x87\xa6\xf9\xc9" + "\xf0\x4f\x9d\x44\xf5\x07\x45\x13\x9e\x7a\x3c\x75\xff\x88\xb8\x7f" + "\xc0\x73\x12\xe1\xa7\xf0\xfe\x47\xbc\xff\x01\x0f\xc6\xe0\x56\xc6" + "\xbb\xac\x42\x74\xcf\xa8\xa3\x1f\x30\x7c\xc8\xd6\x93\x17\x4c\xd6" + "\x22\xc6\x9d\xef\x91\x11\xc9\xe6\x73\x11\x77\x5f\x98\x46\x66\x13" + "\xe2\xf1\x2e\x50\xef\xf0\x67\xe4\x11\x3c\xa7\xd4\xef\x9b\x52\xf0" + "\x7b\xbe\xf6\xdb\x8e\x67\xf6\x37\x3f\xd1\xf0\x86\x7a\x6e\x6a\xfa" + "\xf6\x69\xbf\xd5\x73\xee\xdb\xa5\x1b\x95\x43\xa6\xc4\xa3\x78\xba" + "\x23\xc3\x13\x5b\x55\x58\xca\x5e\xf5\x9d\x52\xa7\xbd\xdb\xc8\x34" + "\x16\x74\x1a\x0b\xf8\xe3\x48\x85\x8d\x4b\xc0\x7b\x05\x9e\xbc\xa8" + "\xf2\x19\xa6\x8f\xf9\xd9\x8f\x7e\x86\x79\xe9\x31\x99\x8f\x30\x8f" + "\x0e\x28\xd9\x32\xf0\x59\x3a\x84\x1d\x86\x6c\xd5\x87\xe4\x67\xe4" + "\xa1\x48\xf9\x19\xb9\x27\x4a\x7e\xaa\x58\x1f\xa1\x2d\xf8\x1a\x95" + "\xbc\x1c\xef\xdd\x56\x80\xef\x91\x7b\x01\xe7\x38\xcf\xed\x74\x99" + "\x6e\x92\xbc\x3d\x70\x91\x68\x14\xb0\x61\xfd\xd2\x63\x1a\xf9\x07" + "\x96\x59\x2e\x5b\x2b\x57\xe1\x02\xfc\x10\xd6\xc4\xf8\x6d\x04\x5c" + "\x7c\x37\x23\x5d\x93\x9b\xbe\xd2\x71\x93\x79\xde\x78\x11\xf2\xa8" + "\xe1\xcb\x30\x39\x9f\x08\xd5\xeb\x30\xe7\xd1\xca\xae\x46\x78\x2a" + "\x74\x14\x9f\x93\x8b\x73\x07\x3c\xc4\x32\xc9\x6f\x77\x20\x15\x6d" + "\x29\x93\x82\xec\x1b\xde\x4a\xa9\x68\x6f\x23\x2e\x98\x6e\x2a\x9f" + "\x5e\x41\xa9\x0c\x8f\x75\xb8\xc7\x74\xd3\xdc\x46\x6e\x8b\x0a\xd6" + "\xeb\x5c\x0f\x86\xff\x8f\x18\x05\xf1\xbb\x81\xf1\x41\x7c\x58\xb9" + "\xb5\x6e\x8c\xc0\x0e\x6c\x55\x75\x45\x59\xcd\xc8\x7f\x94\xeb\xce" + "\xf4\x44\x7c\x0b\xe0\x9c\xe1\x38\xbe\x4b\x52\xab\x4f\x33\x9f\x4f" + "\x64\x7a\x70\x7a\x37\x46\x1d\xf2\xde\x0b\xd3\xf0\x2b\x92\x6e\xc8" + "\xcf\xfc\x10\x28\x83\x61\x38\x03\x22\x20\xa0\x8f\x3e\xd8\xea\x87" + "\x5d\x33\x6a\x71\x24\x7f\x12\xec\xe1\xfc\x41\xbe\xa3\xc8\xdf\xc6" + "\xfd\x3f\xeb\x13\x94\x99\xc8\xf7\x42\x23\xac\x2a\x58\x03\x18\x9b" + "\xfc\x72\x3e\x0a\x70\xee\x07\x2e\x55\x0c\x07\xf8\xb4\x69\xb0\xca" + "\xd9\x47\x7e\x38\xaf\x35\x78\xcd\xcc\x73\xd9\x9e\xb7\xca\x3a\x41" + "\x77\x8d\x1a\xd1\xa0\xe2\x5a\x90\xa6\x45\xf4\x67\x92\xd8\x96\xa3" + "\xee\x9f\x56\x71\xc7\x9c\x5f\x4b\xfe\xb6\x29\xbd\x36\xea\xae\xb2" + "\xed\xa2\x3b\x0c\x6f\x8f\x7e\x87\x94\x86\xf7\x31\x2e\x4f\x6c\xce" + "\x95\xfd\x28\x97\xc1\xf9\x15\xbc\x04\xd6\x91\xc7\x74\x5a\x4d\x07" + "\x1e\x8a\x5e\x37\x79\x11\xde\xcc\xb2\x28\xe9\x06\x3d\xda\xeb\x64" + "\x59\x4c\xe8\x44\xfe\xe3\xfb\xf9\x7b\xb3\xfc\x76\x48\x1d\x1b\x8a" + "\x9f\xca\xf1\xee\x6e\xf0\xed\x25\xc8\x52\x90\xe8\x07\x29\x94\xea" + "\x73\xc9\xba\x1d\xf1\x6d\x4b\x37\x9c\x08\x10\x31\x9e\xa0\x51\x4b" + "\x5f\xcd\xa8\xbd\xe8\x6b\xa4\x4d\x03\x7d\x7d\x4c\x7c\x90\x43\x8c" + "\x33\xf4\x99\x86\xdf\xa8\x01\x8d\xf7\xc7\xb8\x8e\x4c\xcf\xe9\x4a" + "\xf7\x21\x2e\xf1\x7d\xc6\x3d\x54\xef\x51\x1d\xe1\x34\x96\xf5\x06" + "\x1f\x98\x5f\xcc\x97\x30\x98\x2c\xfb\x55\x80\x75\x44\x7d\x2b\xd9" + "\x60\x5a\x57\x8d\x13\xa7\x38\x7d\x28\x6d\xa2\xbc\x8f\x66\x07\xca" + "\x9e\x51\xc2\xe3\x26\xf4\xcf\x81\xbe\x56\xc0\x3d\xd2\xba\x35\x40" + "\x80\xd1\xc2\x34\x45\xba\x42\x96\x47\x7c\x9f\x52\xf9\x46\x17\xa0" + "\x3f\x9f\x8a\x67\x7e\xa8\xfd\x27\xae\x8c\x94\xaf\xd1\xd1\xed\x9f" + "\xf9\x5d\x15\x74\x66\x92\x94\x87\x52\xb2\x5d\x36\x8d\xfe\x52\xeb" + "\x3b\x34\x5e\x27\x66\x9c\x40\x7b\x09\x83\x71\x2a\x8a\xd7\x2d\x52" + "\x1e\x37\x67\x19\xb8\xce\xc8\xdb\xa2\xc1\x91\x75\x96\xf2\xe4\x92" + "\x32\x70\x4a\x6c\x46\x3d\x07\xe5\x60\xb4\x5d\xe3\xf3\xa9\x28\x9a" + "\xe8\xba\xab\x9c\xef\x24\x66\x9d\x04\xdb\xfa\x81\xbe\xfe\x90\x5e" + "\x62\xde\x07\x25\xef\x47\x9f\x69\x54\xfd\xad\xa6\xb7\x46\xab\xf8" + "\x71\x11\x32\x0c\x5c\x12\xe3\xa5\xfc\x32\x2e\xce\x5c\xc6\xa5\x45" + "\xe2\xe1\xb4\x11\xe2\x2a\xb8\x7c\x8f\x29\xd1\xac\xb5\x57\x0d\xd6" + "\xa8\x73\x0c\x6b\x17\x74\x15\xe3\x84\xb2\x8b\xa4\xfe\x5b\x24\x69" + "\xf2\x07\x0d\xf7\x93\x7e\x17\xe7\x1d\x79\xe6\x6b\xa3\xcc\x0b\xdb" + "\x75\x64\xba\x5f\xdd\xe9\x36\x12\xf9\x0f\xcb\x7d\x96\xa6\x94\xf9" + "\xac\xa3\xf9\xfc\x30\x7e\x4f\xb1\xad\x82\xac\x5e\x44\x8f\x51\x44" + "\x66\x96\x51\x5d\x2e\x7a\x4c\x29\x63\x79\xbc\x02\x5a\x1f\x81\x8d" + "\x74\x98\xe9\xcd\xb2\x0c\x1b\x69\x76\x5f\x8d\x25\x5d\x97\x5b\x94" + "\x53\xcf\xb4\x57\xfc\xb1\xbc\x0e\x39\x6e\x09\xc9\x96\xe5\x75\x8d" + "\x8e\x87\x41\x47\x33\xca\x1b\xa1\xd5\xeb\x30\xd2\xc3\x16\x1b\xf3" + "\xb5\x86\x7b\x9d\x96\xfe\xe7\x3a\x1f\xb4\xb6\x7a\x6a\x3f\xeb\x5f" + "\xc9\x83\xa4\xf9\x5a\xde\x66\x55\x56\xd2\x02\x3d\x2d\xdb\x88\xf2" + "\x7e\x66\x84\xb1\x1e\x9c\x01\xde\x4b\xdd\xb7\xf5\x9a\x4c\xa7\xe9" + "\xc6\x36\x55\xc6\x98\xcf\xa4\x1c\xc2\xee\x09\xc9\x51\x52\x4a\x94" + "\x7e\x62\x5d\x5c\xd5\xbe\x5b\xdd\x7f\xc7\xb2\xc4\x3a\x95\xc7\x45" + "\xc0\xb1\x47\x6b\x3f\x1a\xce\x49\x3b\x23\x65\x65\xcc\x3f\x43\x56" + "\xa6\x85\xc1\x2e\x89\xd5\xcf\x35\x2a\x1d\x58\xaf\xd5\xed\x37\x5a" + "\xdd\x8e\x68\x75\xfb\x8d\x56\xb7\xc3\x28\x03\x74\x1b\xf3\x6a\x18" + "\x1d\x41\xb7\xe4\x2f\xb5\xf4\x2d\xac\xcb\x43\xed\x35\x79\x9a\xde" + "\x96\xaf\xd7\x17\xc9\xe7\xb9\x3d\x84\xf0\x4a\x36\x47\xe9\x8b\x96" + "\xd8\xfa\x22\xa9\x43\xab\x6f\x53\x54\xdb\x68\xd6\xec\xdd\x2b\x3a" + "\x1f\xda\x7d\xda\x3d\x84\x08\x63\xfd\xc9\x65\x87\xf7\x41\x0d\x8a" + "\xae\x5a\x5b\x4e\x3e\x7d\x3d\x1f\x92\xeb\xc3\xdb\x33\xf3\x9a\x75" + "\x02\xc3\x60\x9e\x4a\xbb\x12\x61\x8a\xaf\xc9\xe5\xac\x1b\xc2\x75" + "\x34\xd2\xd6\x06\x05\xb7\x97\xe4\xa6\xc8\xb6\x98\x9c\xa0\xb5\x45" + "\xad\xec\x31\x2f\x83\x47\xa9\xa1\x72\xc7\xa4\x44\x95\xcb\xbc\x69" + "\x93\xf7\xc5\x28\x9e\x3e\xa3\xf7\x69\x9c\x1e\x79\x1d\xc8\x93\x19" + "\xd5\x3f\x56\x31\x7e\x1e\x53\x52\xab\xd4\x59\x07\xa5\xae\x70\xf4" + "\x49\x7c\xc6\x64\x35\x6a\xfd\x04\xc2\x52\xb5\x30\xab\xd6\x97\xe8" + "\x72\xf3\xeb\x28\x9c\x0e\xc7\xb6\x8f\x92\x5a\x75\xfb\x48\xc2\x92" + "\xba\x68\xcc\x11\xad\x7e\x1c\x36\x4d\x85\x25\x95\x73\xd8\x7e\x45" + "\x87\x5a\x21\xfb\xab\x24\xab\xd6\x5f\x71\xfb\x32\x7a\x4c\x96\x3d" + "\xdc\xc6\xf8\xdb\x63\x4a\xe1\xbb\x09\x0d\xee\xca\x6b\x3c\x86\xa8" + "\x43\xdc\x64\xd6\x07\xac\x2f\x78\x7f\xb0\x7c\x2f\x95\xef\x25\xac" + "\x77\xd8\x0e\xe1\x78\xa4\x4b\x61\x5d\x84\xf0\x7c\xf6\x0d\x28\xfe" + "\xcd\x0c\xb8\x29\xe9\x5a\xde\x57\xa4\xad\xf0\x6f\x99\x71\x7a\x98" + "\x9e\x0f\xed\x68\x0a\xe7\xe3\xfc\xba\xfe\x62\xdd\x15\x60\xdd\xa4" + "\xca\xfb\x48\x93\x71\x39\x6e\xd0\xed\xa2\x7e\x63\x58\x5a\xbe\x4f" + "\x4d\xea\xb4\xb1\x26\x4d\x9f\x5d\xe1\xbc\x92\x7f\xd0\x95\x3b\xbe" + "\x16\xe7\x1b\x4b\xc9\xd4\xf0\x15\xeb\xc5\xe1\x3e\x85\xe7\xd8\x6c" + "\x55\x8f\xb1\x37\xcb\x7a\x28\x9d\x5a\xa5\x70\x19\xee\x6b\xb8\x26" + "\xe3\xe6\x70\x5d\x38\xee\x40\x58\x1c\xdf\x8f\x88\xb8\xc7\x25\x5e" + "\x51\xf9\x82\xfd\x45\xd7\xa5\x6f\xbc\x26\xc7\x7d\xe6\x86\x83\xba" + "\xee\x1d\x7b\x46\xe1\x39\x76\x9f\xae\x77\x41\x97\x89\xac\x7b\x65" + "\xdc\xf3\x5a\x9a\xa5\xda\x5b\xea\xf7\xb1\xbf\x56\x74\xb5\x1a\x35" + "\x7a\x4f\xd6\xea\x21\xef\xfa\x14\xff\x96\x03\xda\x8e\x3d\xa6\xd3" + "\x36\xfc\x37\xb7\x1f\x94\x6f\xe1\x6f\x29\xf7\x15\x72\x0c\x5b\xcf" + "\x69\x18\x27\xd5\x47\xa4\x1c\x89\xb6\xa9\xbb\x4c\xd6\xc5\xdc\x2f" + "\x29\x5b\xd5\x7a\x97\x36\xff\x44\xad\xa5\x3f\x43\xbf\x30\xae\x5c" + "\xd7\x31\xa2\x2f\x93\xf8\x9e\xa5\x2e\xd3\xb8\x57\x38\x8c\xef\xc8" + "\x0a\x4f\xc3\xfa\xe9\xc3\x6b\x1e\x0d\xe6\xb8\x6c\x5d\x6f\xb0\x2e" + "\x69\xf7\x5d\xd0\x6c\xba\xf1\x2c\x6f\xcd\x4a\x6f\x8c\x37\x44\xda" + "\x61\xe3\x0d\x91\x3a\xc3\x3a\x36\x5a\x67\xc0\x6e\xde\xdd\x57\x33" + "\xee\x6c\x84\x1d\x80\xb0\x1b\xeb\x8e\x71\x87\xb9\x8d\xf2\xfd\xac" + "\x52\x3f\xc9\x39\xb5\xf1\xeb\x74\x9c\x59\x6f\xf6\x6e\xd3\xe7\x2f" + "\xac\xf1\x6c\xab\x45\x96\x37\x3e\x3d\x42\x77\x72\x79\x3a\x3c\x13" + "\xc9\x76\xd4\x5a\xca\x73\x2e\xe3\x53\x34\x3d\xdf\x14\xa1\x2b\xb5" + "\x3e\x8c\xf5\x64\x64\x5f\x35\xfc\x4a\x64\x5f\x35\xfe\xcb\xeb\x75" + "\xe4\xf8\xd6\x6f\xdf\x57\x8d\xaf\x63\xbd\xa5\xeb\xc8\x48\x5d\x30" + "\xbe\xad\x21\xc2\x96\x1d\x9f\xa5\xdb\xb2\x21\x3d\x3a\xee\x1c\xeb" + "\x28\x94\xdf\xa2\xca\xb6\xce\x47\xbf\x9f\xa6\x97\x8d\xf8\xf2\x76" + "\x1b\x64\xb3\x66\xf8\x61\xfc\xb6\x69\x36\xa0\x6c\x9b\xd7\xf8\x3e" + "\x3e\xd3\xd8\x22\xc8\xdf\x48\x96\xb3\xd6\x0d\x5f\x51\x67\xa8\xaf" + "\x68\xeb\xdd\x38\x48\xdf\xd3\xe1\x76\xe1\xa1\x83\x62\x0f\xca\x69" + "\x0e\xaf\xe3\x3e\x84\x1d\xd0\xe6\x10\x24\x6d\x25\x2c\xab\xa3\xf1" + "\x60\x64\xdd\x54\x3d\xac\x47\xb8\x1e\x3c\x26\x42\xf9\xc5\x6c\xf7" + "\xf0\x1d\xcd\xb0\xa9\xbc\x8d\x83\x32\x3f\x32\xfd\x6b\x57\xb8\x7d" + "\x65\xce\x62\x5d\xa9\x8d\x3d\x4f\xc2\xde\xa9\x0a\x9f\x8b\x59\xb2" + "\x30\xdb\x56\x52\xba\x6e\x43\xf9\xf3\xb3\x6c\xeb\x36\xac\x2b\x5f" + "\x97\x5f\xbc\x6e\x6b\x7e\xf9\xba\x8d\x1b\xa6\xae\xcf\x7f\x61\xdd" + "\x73\xb6\xcd\xf9\x65\xb6\x54\xc7\x14\xc7\x48\x0a\x25\x9d\x67\xcb" + "\x2f\x2b\x7b\x65\x7d\x61\x81\x6d\xc3\xba\xe7\xa6\x95\x16\x96\x15" + "\x96\xdb\xf2\x4b\x37\xbe\xb2\xa1\xc0\x36\xa5\x60\xfa\x94\xd4\xfb" + "\x0a\x46\x86\xcf\xa1\xdd\x61\xa1\x9e\xe0\xd5\xcf\xbb\x0f\x5c\x25" + "\x73\xa2\xa1\xa4\x34\xd1\xb1\x6e\x83\x9a\xb7\x9b\x30\x76\x46\x2d" + "\x95\x20\x3e\xa1\xb1\x86\x69\x7d\xb3\x1d\x6f\x13\xa7\x43\x3d\x6d" + "\xf8\x6d\x06\xee\x13\xfb\x6a\x6e\xee\xf0\x98\x6e\x6d\x65\x9a\x81" + "\x16\x36\xd4\x6d\xa2\xb8\xfa\x0f\xdd\xb0\xd9\x4a\x78\x5f\x40\xe3" + "\x55\x4a\xa9\xda\x44\x26\x3c\x09\x78\x2c\x46\x0b\xcf\x75\x4d\x48" + "\xf0\x98\x6e\xb1\xcb\x7b\xc7\x4c\x13\x8e\x78\x93\xe6\x3a\x44\xd5" + "\x5c\x87\xe2\xcb\x84\x5f\xea\xf3\xdc\xcb\x5e\xa5\x65\x2c\x9f\x17" + "\x4c\x13\xe4\xfa\xc9\x2e\xc8\x32\xcf\xfd\xf6\x7e\xfc\x70\x1a\xec" + "\xc1\x73\x3c\x7f\x8b\xb8\x5f\xfa\x8c\x94\x00\xbc\x4c\x27\x2a\x52" + "\xe9\x4d\x94\x55\x66\x15\x02\x65\x94\xe8\xf3\x69\xa8\x83\x05\x75" + "\xe9\xd0\xea\xb1\x5c\xd6\xe3\xa0\x98\x5c\x9b\x0c\xfc\x6a\x24\x3e" + "\xf5\x7a\x1d\x80\x37\xea\x33\x81\x80\xa7\x85\xf1\x8a\x35\xd7\xc7" + "\xf3\x5d\xc0\xf3\xb3\xe0\x26\xd0\xed\x36\x75\xc7\xeb\x81\x06\xd5" + "\xfe\x50\xaf\x89\x8d\xf8\xbd\xff\x2b\x4a\xd8\x57\x4a\x29\xc2\x75" + "\xbb\x38\xed\x0b\x90\xbb\xa8\x83\x12\xb7\x08\xaf\xf8\xbb\xcf\xbb" + "\x55\x9d\x6e\xb1\xb0\x6e\xf8\x9b\x17\x3b\x4c\x5c\x27\xf4\x15\x09" + "\x8d\x5f\x0d\x39\xb7\x68\x7a\x73\x9c\xf0\x89\xf7\xc2\x6d\xae\x5b" + "\xe4\x3d\x78\x6c\x6f\xf5\xa2\x9f\xea\xab\xb9\x25\x0f\x78\xb7\x68" + "\xb6\x31\xfa\x8c\xdc\x30\x5b\xea\x16\x96\x33\xdf\x10\xb0\xcd\x3a" + "\x6c\x61\x94\x77\x23\x5b\x15\xff\x6f\xf9\x0c\x79\xbc\x61\xf0\x5b" + "\xa3\xe1\x33\x4c\xfc\xf6\xea\xe5\xa8\x71\xf8\x2d\x6c\x13\x78\x21" + "\xcb\xde\x21\xca\x9b\x5c\x73\x50\x9c\x75\x23\xfc\xc0\xd7\x64\x42" + "\xda\xb3\x8d\x07\x19\xfe\x44\x9b\xc7\x74\xf3\x6e\x86\xbf\x6b\x1c" + "\xd1\x6e\xa4\xe9\xad\x99\xd0\xc2\xf3\xbb\x88\x43\xfb\x1f\x7e\xdd" + "\xbc\xb5\x26\xcf\xf3\xa2\xe4\x39\xad\x86\x6d\xc2\x5a\xc0\x87\x0c" + "\x1d\xb8\x82\x7e\x18\xdf\xd3\x6b\xc9\xce\xe5\xe0\xf7\x19\x9e\x0f" + "\x01\xcc\x2a\xbd\x3c\x01\xf9\xdf\x1f\x54\x73\x30\x9a\x6c\x4d\x75" + "\x3b\xba\x79\x6d\x44\x9c\x80\x7e\x67\x1c\x59\xc6\x90\xa7\x4d\x97" + "\x29\xc8\xfa\x59\x29\x57\x29\x64\x17\x35\x13\x33\x1b\x93\x91\x0e" + "\x72\xd5\x00\x79\x62\xb9\x42\x5a\xaf\x2e\x53\x90\xb5\x33\x9c\x0e" + "\x38\x8c\x3c\xba\x35\xcd\xc4\x3a\xb2\xd3\x74\x6b\x21\xcb\x98\x78" + "\xfb\xb1\x0e\x31\x7e\x75\x87\xe2\xd3\xad\x85\x6e\xbf\xe2\x41\x88" + "\xee\xb7\xce\x0d\xa3\xfb\x19\xc8\xf1\x48\xa6\xb3\x9a\xab\xbe\xb5" + "\x10\xb8\x9d\x91\xb6\xf8\x76\xf0\x40\xf6\x55\xb7\xf2\xfd\xd0\x56" + "\x8d\x86\xa7\x42\x34\xbc\xb5\x32\x16\x0d\xa3\x68\x67\xe2\x47\xd4" + "\xdc\xba\x97\xdb\x0a\xf2\x1c\xf3\x98\x26\xae\x18\x6a\xbd\x00\x65" + "\x98\x4c\xb5\x64\xe6\x32\xda\x52\x64\xfa\xce\x58\x65\x44\xcb\x71" + "\x5b\x13\x11\xcf\x85\x73\xbe\xc9\x29\x4c\xd7\xdb\x26\xc6\xe4\xef" + "\x73\x11\xb8\xc9\x47\xd4\xdc\x66\x7f\x33\x19\x72\x23\xf1\xbb\x6d" + "\xc5\x8d\xf0\x9b\x6c\x53\xfd\x62\xeb\x1d\x2c\xcf\xb7\xed\x73\xd7" + "\x11\x71\x98\xf6\x5d\xd1\x8b\xbe\x26\x7a\x3e\x7f\xe8\xf5\x85\xdb" + "\x4e\x47\xae\x2f\xdc\x76\x7c\xa8\xf5\x85\xc8\x72\x6f\x1f\xc1\xe5" + "\x06\x1b\x57\x18\xc2\xca\xf6\x05\x63\x94\xad\xe7\x9f\xde\x14\x3e" + "\x7e\xb9\xfd\x29\xc6\xa1\x1d\xfd\x92\xb8\x65\x85\x41\x00\x4e\x9b" + "\xec\xb3\x6f\xcf\x51\xf6\x0a\xdb\x41\xb7\xcf\xe5\x34\xd1\xf5\x18" + "\xfc\x33\xa7\xf0\xb8\x8e\xbe\x96\x1f\xf1\x8b\xc8\xc2\xef\xdb\x4e" + "\xea\xd1\xc6\x88\xc4\x24\x62\x7c\x24\x10\xdd\x2e\xd3\x0b\xfc\xa9" + "\x20\xed\xdb\x2b\x3f\x4c\x83\xe9\x07\xe3\xff\x1d\x7f\x23\x14\xbe" + "\x12\x9e\x9f\x0c\x5a\x79\xdd\x61\x29\xd2\x6f\x90\x5b\x90\x9e\x25" + "\xd6\xdf\xcb\x78\x2a\x57\xc4\x13\xd9\xcc\x32\xb1\x10\x01\x15\x31" + "\xf8\x2d\xc2\xbf\x39\x24\xf2\x1b\x7f\x71\xb9\x61\x05\xdc\x1e\x57" + "\x20\xb7\x74\xfd\x20\x6d\x30\xc8\xd8\x64\x09\x2f\xd2\x42\x95\xf1" + "\xf2\x47\x22\xff\xe3\x07\x3c\x3b\xe2\x6d\xf6\xc1\x04\x63\x7c\x3b" + "\xc3\x92\xff\x93\x42\x7f\x92\xe3\x06\x75\xfc\xae\x7f\xb7\x85\xfd" + "\xbe\x5d\xbd\x26\xcd\xfd\x33\xc2\xbf\xf1\x9f\xed\xcc\x08\xfd\x67" + "\x48\x3c\x26\xb5\xc6\x4a\x1a\xa2\xff\x1d\x36\x3d\x28\x5c\x42\x43" + "\xf1\x53\xea\x23\xbf\x7f\x98\x13\xf9\x7d\xd7\xe1\x3f\x03\xe6\x24" + "\x91\x74\x7a\x92\xc0\xb3\xf2\xc1\xc0\xc4\xa8\x26\x93\x58\x15\xd5" + "\x84\x42\x7f\x1a\x36\x71\xc0\x27\x10\x16\x6c\x8a\x9d\xfa\x7f\xcd" + "\xdf\x84\x9d\x5a\x83\xb8\xdd\x6b\xb9\x2e\xf2\xc1\xa8\x30\xfe\x1e" + "\x66\xd3\xc2\x66\xfe\xe6\xba\xf4\x32\xcc\x16\xf6\x6d\x48\xc3\x3f" + "\x4d\x90\xff\x53\x7f\x0e\x5c\xbf\xff\xfb\xff\xe1\x9f\x81\xdb\xc7" + "\xf7\x7f\xff\x8b\xfe\x84\xea\xc5\xa1\x89\xe4\x8b\xff\x13\x83\x8a" + "\x52\x68\x11\x42\x0b\x10\xda\x8f\x3f\x4b\x3f\xfe\xfd\xdf\xf7\x7f" + "\xdf\xff\x7d\xff\xf7\xfd\xdf\xf7\x7f\xdf\xff\xfd\x7f\xe0\xcf\x20" + "\xc7\x11\x42\xfb\xd3\x7f\xab\x38\x1e\x02\x3d\x5f\x2b\xc3\x8c\x06" + "\x0a\xa5\xc0\x70\x7b\x0e\x19\xcc\x34\xcc\xf4\xe7\xb3\xf2\x6c\x83" + "\x08\x7d\xcb\x0c\xec\x13\x6b\x26\x9e\x7b\xf1\xdc\x12\x16\x7e\x5b" + "\xec\xe4\xff\x01\x7f\x06\x10\x2c\x0e\xe3\xc0\x78\x1a\x46\xc3\xc9" + "\x4c\x23\x68\x24\xdd\x44\x09\x34\x8a\x46\x63\x7c\x69\xa1\x24\x4a" + "\xa6\x31\x94\x42\x63\x69\x1c\x8d\x27\x2b\xdd\x4c\x13\x80\xf9\x44" + "\xba\x35\x36\xce\x95\x94\x66\xc5\x3f\xf8\x3f\x9b\xd2\xe4\x77\xde" + "\xf7\xe1\xff\xa1\xe1\xad\x5a\xf8\x19\x2d\xdc\xf3\x7d\xf8\x7f\x68" + "\xb8\xed\x7f\xf3\x7b\xd2\xff\xd6\xb7\x01\xaa\x59\x69\x67\x43\x4c" + "\x9d\x18\x1d\x6a\xd0\xfe\x06\xbf\xe9\x1b\xf2\x5f\x07\x2f\x32\x7f" + "\xf4\x5f\x1a\x9e\xd9\xea\xa7\x93\x48\xcd\xe7\x8a\xf0\xbf\xc0\x50" + "\x39\xf5\xbf\x1d\x26\x3c\x16\x3c\x13\xf1\xdc\x8e\xe7\x1e\x3c\x73" + "\x74\x38\x2a\x0d\x4f\xc9\x7e\x7e\x94\xe8\xf7\x39\x44\xff\xbd\x0a" + "\x6f\x1f\xd1\xb9\xa9\x78\x5a\x49\xca\xc5\x1f\xf3\x88\xce\x37\x85" + "\x60\x5e\x9e\x1d\xc2\xae\x67\xb2\xfa\x6d\xc3\xe3\x3d\xce\xbf\x3c" + "\x14\xd0\xd3\xb6\x64\xac\xc8\xb4\xcd\x9c\x3e\x7b\xfa\xec\xb9\xcf" + "\xda\xa6\x65\x4f\xb3\xcd\x4a\x4d\xbd\x7f\xc6\xcc\x59\x33\x66\xce" + "\xb5\xcd\x9c\x33\x6f\xd6\x7d\xf3\xe6\xcc\xb5\xad\xdf\x52\xba\x6e" + "\x66\xea\x0b\x85\xb6\x0d\x05\xeb\xca\x6c\xcf\xaf\x2b\x5d\xbf\x39" + "\xbf\xb4\xf0\x9b\xea\xf5\x1d\xff\x18\xbd\x5b\x83\x24\x39\x10\x49" + "\xed\xdb\xc9\xf4\xc3\xc3\x64\x9a\x5b\x49\x83\x31\x86\x2a\x6d\xae" + "\xd4\xae\x3d\x31\xff\xd6\x3f\xbd\xea\xf7\x53\x56\x8f\xfe\xed\x43" + "\x2f\x4c\x59\xb0\xf0\x83\x03\x47\xc9\x38\x23\x9b\x8c\x77\xfa\xc8" + "\x38\xf1\x18\x19\x2d\xe7\xc8\x18\x57\x4c\xc6\x17\x5b\xc9\xf8\x6c" + "\x26\x19\x9f\xec\x21\xe3\x63\x7e\x32\x3e\x10\x23\x6c\x8b\x4f\x85" + "\xfd\xaa\x8e\x8c\x1f\x58\xc9\xf8\xb6\x89\x8c\xaf\xcf\x56\x61\x6d" + "\x13\xc9\xf8\xd1\xee\x3f\x33\x35\xfe\xbd\x7f\xdf\xd6\x5e\x18\xfa" + "\xcf\x94\xfb\xfd\x3c\xe7\xf7\x7f\xdf\xff\x7d\xff\xf7\xfd\xdf\xf7" + "\x7f\xdf\xff\xfd\xbf\xf0\xef\x2b\xa3\x89\x7e\x0b\x4b\xa9\xcf\x65" + "\xb6\x7a\x0c\xb7\xc8\xb3\xb1\xc4\xe7\xa2\xc8\x2c\x7d\xbd\x68\x4f" + "\xf8\xde\x93\x84\x85\x87\x88\xf8\x6c\xe7\x9b\x07\x85\x97\xcf\x6d" + "\xa6\xff\x9c\xa8\x0d\x16\x24\xef\x67\x01\x9c\x5c\x0f\xbd\x9c\xa5" + "\xf6\x2e\x09\x1f\xc7\xf3\xfe\x27\x84\x97\x23\xbc\xed\x06\xfb\x61" + "\xe4\xde\x2b\x86\x99\x3e\x49\xe2\xd3\x1c\x05\x87\x61\xb4\x78\xa8" + "\x74\xfe\x0d\x60\x24\xe8\x78\xf9\x8c\x64\x60\x78\xbd\x2e\xb2\xfa" + "\x5c\xad\x63\x91\xd7\x87\x3a\xd9\xb5\xbd\x43\x3d\xc2\x45\x71\x6d" + "\x8e\x00\x9f\x21\x35\x74\xd1\xc8\xf7\xf1\x36\xe2\xfd\x16\xa9\xbd" + "\x9e\x9c\x6f\x32\xc3\x40\x5e\x43\x9f\x6b\x44\xea\x60\x5e\xc0\x96" + "\x67\xd0\x69\xe4\x3a\x9f\xb1\xd5\xa8\xd2\x5a\x46\x68\x69\x8d\x48" + "\x9b\xab\xa7\x55\x71\xc6\xc5\x5a\xdc\x4d\x88\x73\x44\xc6\x99\x6a" + "\xb4\xb8\x04\xc4\xd5\x46\xe1\x67\x72\x5f\x0b\x50\x17\x8d\x38\x02" + "\x5c\x6c\x7c\x66\x89\xf3\x68\xe9\x93\x90\xbe\x2d\x12\x16\x91\x16" + "\x97\x8c\x38\x4f\x64\xdc\xc7\xa9\x5a\xdc\x78\xc4\x05\x22\xe3\x0c" + "\x7a\x3e\x6b\x9f\x6b\xa4\x35\x46\x3d\xb9\x7c\x83\x2a\x9b\xeb\x30" + "\x72\x3e\xd2\x54\x72\x9a\x15\xb6\x4a\x62\x5e\x71\xdc\x89\xa6\xc1" + "\xf2\x39\x4d\x9e\x0e\xc7\x83\xfc\x61\x34\x05\x2d\x47\x56\xe8\xf9" + "\xd3\x6d\x0c\x83\x24\x0d\x19\x8e\x87\x46\x64\x32\x1c\xfe\xc6\xef" + "\x89\x5c\x6f\xed\xb7\x8d\xeb\x17\xb9\xa7\x07\x43\x22\x8a\xc7\xa0" + "\x87\xcf\x59\x0f\x37\xeb\x32\x50\x66\x15\x41\xe7\xcd\xbc\x6f\xeb" + "\x61\x4f\xd0\x25\xc8\xed\xf0\x93\x6d\x02\x39\x2f\xd0\x4d\x56\xde" + "\x17\xb4\x7f\x2b\x99\x9d\x25\xc2\xcf\xe7\xfc\xdb\xbd\x3d\xe4\xf4" + "\x8a\x6e\x3e\x4b\xbf\xe3\x0a\x99\xd9\x27\xd4\x8e\x97\xc9\xda\x56" + "\xf1\x59\xcc\xbd\x48\x41\xf6\x4d\x3d\x91\xf3\x76\x52\x7b\x7d\x27" + "\x39\xeb\x23\xf3\x3a\x6f\x25\xeb\x69\x3e\x97\xef\xa2\x44\xc6\xa3" + "\xcd\x16\xa0\x40\xf2\xc3\x9e\x8a\x77\xc8\xe4\x9c\x44\xc6\xd3\x05" + "\xad\x3a\x2e\x1e\xc6\x65\xf7\x45\x32\x7f\xf0\x3c\x64\xe8\x22\xe3" + "\xfb\xa8\xe7\xc3\xad\x7e\xe3\x09\x6b\x16\x9d\xb0\x9e\xa3\x36\xeb" + "\x02\x6a\x73\xa4\xd3\xfe\x8b\x94\x70\xc2\x3f\x9f\xda\x4c\x8b\xd0" + "\xc6\xd2\xc9\xdd\x83\xdf\xb6\x01\xa4\xf1\xc9\x73\x1e\x5d\x74\xd3" + "\x99\xda\x17\xc9\xec\x51\x30\x41\xdf\x9b\xce\xe9\x67\x16\xf8\x3b" + "\x56\x3d\xca\x6e\x26\x2b\xf0\xeb\x06\x2e\xf7\x5f\xa0\x84\xb1\x93" + "\xad\x94\x0a\x9c\x87\xbb\xeb\x02\x64\xaa\xa0\x11\x43\xb4\xad\x14" + "\x79\xde\x19\xb2\xd9\x70\x50\x74\xb3\x8c\xf6\x6e\xcb\x41\x3b\x4d" + "\xc8\x42\xd9\x3d\xda\x3e\xc0\x1e\xe7\xfb\x64\xea\xdd\x9c\xc3\xfb" + "\x9f\x3b\x11\x57\xa4\xc7\xf1\x39\x6e\x3e\x9f\x3d\x23\x85\x2c\xee" + "\x40\x1a\x7d\x72\xad\x9b\xf7\x18\xf6\xf0\xbe\x4f\x86\x97\xe8\xa0" + "\x38\xd4\x27\x1e\xf8\xf0\xd9\xc5\x9e\x1f\x20\x1d\xf2\x1f\xf6\xd0" + "\x31\x29\x47\x62\xfc\x6a\x5f\x70\xfc\xea\x2b\xc1\xb7\x57\xf7\x8a" + "\xb7\x57\x7f\x35\xf0\xf6\xea\x2f\x9d\x5b\xc8\x3c\x30\x7e\xb5\xb7" + "\xbd\x44\xf2\xc0\xd2\x5e\x72\x89\xf7\x0b\x9a\xb7\x5f\x22\xcb\x9a" + "\x97\xc1\xfb\xc0\x1f\x68\xfb\x3a\xb2\x06\x93\x16\xd7\xb9\x03\x9f" + "\xd2\x9a\x0a\x12\xf8\x7d\x38\x56\xfd\x7a\x93\x1f\xb3\xa9\x36\x64" + "\x46\x9d\x46\xd9\x3c\xa6\x87\x3a\xb8\x5c\x6f\xd2\x72\x1b\x9e\xc9" + "\x78\xec\x78\xa6\x8a\xe4\xc7\xa6\x82\x56\xce\xd1\x3b\x0d\xc4\xe7" + "\x14\x66\x04\xc9\x70\x91\x46\xcd\x07\xfe\x96\x21\xe8\x36\x31\x58" + "\x53\xed\xfd\x61\x25\xed\x60\x1f\x07\xac\x9b\x58\x2f\xb1\x9e\x42" + "\x39\x7b\x3c\xa6\x87\xad\xb2\x2d\x1e\x14\x3e\x91\x5c\xcd\x67\xe6" + "\xbb\x7d\xdb\x8a\x0c\xde\x6d\x45\xc6\xde\xe4\xea\x5e\xa4\x39\x82" + "\x34\xd9\x1a\x0d\xbb\x19\x16\xda\x84\x77\x54\x80\xe2\x00\xb3\xe4" + "\xef\xaf\x76\x98\x0e\x1d\x14\xe7\x90\xee\xec\x20\x2c\xc0\x06\x1c" + "\xd0\x7f\x54\xb7\x1e\x06\x5a\x77\xee\x43\x3a\xce\xef\xf6\xa7\xb1" + "\xfe\xf6\xb8\x8b\xbb\x79\x9f\xee\x48\xd1\xaf\xca\x43\x1a\x3e\xc3" + "\xe9\x1d\xe5\xa7\x61\x7d\x2e\xca\x66\xd8\x9c\xcf\xdd\xd3\x4d\xc8" + "\xd7\x2b\x9c\x45\xd0\x6f\xb4\xb4\x4f\x14\x19\xf8\xcc\xfe\x09\xe4" + "\x57\x65\x8f\xce\xd6\x71\xe4\x32\xe4\x99\x7d\xc6\x13\xf2\x70\xa2" + "\xd8\x4f\xa3\xea\x28\x0e\xf9\x96\x33\x3c\x86\x05\x39\xf0\xa0\xae" + "\xbd\x27\x8a\xbd\x14\x14\x11\x30\x3d\x1a\xbc\xa6\x08\x78\x08\x17" + "\x80\xc7\xf2\xd7\x86\x3c\xa3\x9a\x24\xbc\x27\xfe\x3e\xc8\xf0\xfc" + "\x64\xb2\x49\x7c\x57\x31\x0c\xe9\x77\x03\x30\x5b\x37\x3d\x4c\x3d" + "\x94\x68\xf6\x3a\x8b\xe2\xe4\x7e\x41\xe4\xff\x70\x47\x77\xbc\xe8" + "\xcd\x89\x1b\x2d\xf7\x0a\x3e\x4c\xec\x67\xa3\x87\x46\x7f\x2e\x7a" + "\x8b\xe2\x46\xf5\x90\x89\x71\xe6\xf3\x42\x8c\x67\x38\x2f\x9f\xc8" + "\x58\xb5\x80\x56\xa5\x2f\x4e\x5f\x40\x4b\x1e\x5a\xb8\x80\x52\xef" + "\x9f\x96\x7a\xef\x8f\xe6\xde\x4b\xd9\x4f\x3e\xb1\x80\xb2\x97\x2e" + "\xa0\xe5\x78\xb2\x97\x67\x3c\x91\x9e\xb1\x7c\x01\xe5\x2c\x5a\x8c" + "\xaf\x85\x0b\x66\xa6\x3e\x32\x2d\x7b\xe1\xe2\x0c\x7a\x7c\xc5\xac" + "\xd4\x59\xb3\xe8\xa1\x8c\xac\x99\xa9\xa9\xda\x7b\x66\x2a\x27\x79" + "\x7a\x6e\xc6\xf2\x69\xd9\xa5\x1b\xcb\x37\x4e\x5b\xba\x78\x21\x65" + "\x64\x2c\xc8\x8e\xec\x6b\xed\x03\x57\x07\x98\xc6\x3e\xf1\x45\x26" + "\xfb\x66\xa0\x06\xf0\x1e\x4f\x8f\x3c\xf3\x41\x96\x4f\x1b\x98\x67" + "\x52\xb7\x26\x72\x7f\x65\xea\x73\x25\x9e\x03\xed\xaa\x98\x76\xec" + "\x1f\xa1\x8b\xc6\x4d\x41\xdc\x5d\x5a\xdf\x11\x8f\xf8\x40\x64\x7c" + "\xd2\x19\xc4\xcf\xe0\x33\x04\x6e\x3c\xa0\xb7\x0f\x3a\x10\x74\xf5" + "\x52\xaf\x33\x27\x5e\x9e\xe1\x04\xaf\x79\x6f\x6d\x9f\xcb\x32\x37" + "\xac\xad\x77\xf2\x1e\x5c\xdb\x56\x8a\xbb\x4c\x96\xa4\xf6\xf2\x34" + "\x3e\x67\x43\xee\x72\x0d\xc6\x95\x41\x18\x23\xb5\x73\xa0\x9e\x06" + "\xde\xdf\xac\xe0\x54\x86\xe9\x05\x0f\xc3\xd9\x8f\x38\x0d\xd6\xca" + "\x76\xe8\x07\xe8\xef\x8b\x41\xa7\x9d\x44\xf2\xc3\xdd\xc1\x7e\xbb" + "\xec\x13\x90\xaf\x45\x97\xe7\xfd\xbc\x77\xb6\x04\xe9\x3e\xc8\x34" + "\xf0\xde\x53\xb9\x0f\x95\x12\xd9\x17\x83\x2f\x58\xb3\x3c\x55\x9e" + "\x91\x96\x61\x49\x26\x91\x8c\xef\x9a\xe5\x33\x85\x53\x9d\x9b\x46" + "\x58\x3c\x87\x81\xd7\x71\xd2\xef\xc8\x36\x19\x1e\x87\xf0\x2d\xc0" + "\xaf\x63\x80\xf3\x7f\x21\xf3\x0f\x47\xd8\x53\x48\x3b\x33\x98\xbc" + "\x7c\x16\x64\x87\xc3\x60\x27\x8c\x4b\x07\xbc\x7b\xf9\xcc\xba\xb0" + "\x9c\xf1\xe2\xf7\xec\xd6\xad\x3d\xd2\xf7\xa0\x07\x71\x41\x27\x60" + "\xf6\x0f\x96\x6f\xe7\xbc\x28\xcb\xd4\xd7\x5f\x84\x3e\x2e\x49\xf9" + "\x9d\x63\x7c\xbe\x18\x4c\x63\xe5\x32\xb9\x5d\x83\x17\xb3\xc1\xa7" + "\x11\x7d\xae\xa4\xe6\x28\x3e\x1d\x07\x9c\x99\xa0\x7b\x07\x60\xa4" + "\x04\x7b\x51\x06\xbe\x01\xd7\xa8\xc1\xd5\x61\xf8\x94\x1c\x24\x75" + "\x46\xc9\xc1\x08\xc0\x5e\x10\x8a\x4f\x36\x45\xc6\x8f\xbd\x84\xf8" + "\x87\xb5\x78\xb4\xaf\xe4\xc9\x91\xf1\xc9\x69\x88\x5f\x84\xf2\x7d" + "\x68\x3f\x71\x1e\xb2\xf0\xf9\x1d\x6f\x58\xfa\x15\x51\xe9\x4b\x90" + "\xfe\x51\xde\x1f\xcf\xba\x9d\xd3\x37\x6a\xb2\x8a\xf4\x66\xa4\xdf" + "\x1d\x55\xfe\x69\xa4\x5f\x1e\x86\x5f\x54\xfd\xc7\x14\x23\x3e\x87" + "\x65\x0b\xef\x02\xa4\x19\xce\x6d\x96\xf5\xc5\x89\x62\xb6\x17\x93" + "\xcf\x46\x95\xcf\xe9\x5e\x0a\xea\x34\xea\x65\x1a\x59\x0e\x6b\xb6" + "\xc8\x39\x85\xc3\x18\x73\x54\x19\x76\xe4\x29\x83\xfc\xcc\xd4\x65" + "\x23\x46\x9e\xf9\x51\x79\x72\xa5\x6c\xa9\x72\x34\x1e\xab\x3c\x9a" + "\x2e\x0a\x87\xc1\x75\x83\x7d\x34\xa6\x32\xaa\xee\xb9\x28\x77\xdb" + "\x3e\xd5\xce\x6f\x82\x4c\xcc\x42\xd8\x12\xc0\x9c\xc3\x72\xc4\xb2" + "\xee\xf6\xfa\xa1\x2b\x33\x13\x54\x9f\x3f\xe6\x7c\x62\x05\xf1\xef" + "\x69\xfc\x9b\x61\x8b\xfe\x2c\xad\x0d\x8c\x39\x8f\x37\x87\x4b\x3f" + "\x50\xdc\xf6\x44\xff\x63\x41\x05\x33\x25\x1e\x6d\xd4\x88\xef\x01" + "\xad\x8c\x0c\x3e\x5f\x0c\xfc\x67\x41\x0f\x13\x9f\x91\x46\xf8\x6c" + "\x84\x2f\xd0\xe2\xe7\x70\x7a\xfc\x9e\xa9\xfd\x66\xb9\x9d\xa5\xc9" + "\x2d\xda\xc1\x58\x79\xd6\x55\xb5\x05\x95\x3f\xa8\xe4\x7e\x21\xe2" + "\x6e\xc6\x7b\x31\xde\xf1\x78\x3f\x8e\xb2\xcf\xb3\x4f\x08\xe7\x00" + "\xec\x0e\xf5\x7d\x1a\xef\x27\xf0\xfe\x08\xef\xe5\x78\xff\x9c\xdb" + "\xad\x77\x73\x11\x45\xc9\x4c\x4f\x50\xb5\xd5\xe1\x8a\x87\x29\xb5" + "\x5a\xfb\x51\xed\xf7\x8b\x50\x98\x50\x61\x46\x45\x73\x2d\xac\x3f" + "\x93\xe9\x92\x0d\xf8\x25\x5c\xbe\xd6\xee\xe3\x15\x9f\x54\x9a\xa0" + "\xca\x67\x52\xfc\xd6\xc2\x54\x3a\x43\x78\x99\x78\xa7\xef\xf0\x09" + "\x81\x77\xaa\xf4\x27\x41\x63\x67\x83\x26\x26\x7c\x9b\x98\x4e\x32" + "\xbd\x84\x3b\xa6\x29\x8c\xdf\xb0\xc7\xc7\x96\x44\xf1\xbb\x19\xfc" + "\xde\x27\xf9\x0d\xda\xe9\x38\x33\xfe\x90\x69\xee\xdb\x86\xe9\x72" + "\x03\xf9\xee\x09\xe9\xee\xb1\x2d\x91\x70\x2c\x87\x91\x07\xe3\xa4" + "\x31\xd2\x67\x21\xfb\xc5\x89\xab\x60\x19\x1d\x0b\xfb\xff\xb4\xf4" + "\x79\x84\xf8\xfb\x18\x8e\xcf\x29\xfd\xef\xf8\xe2\x4a\xb8\x6d\x8d" + "\x23\x3d\x5e\xc6\x25\xd5\x94\x30\x2e\x71\xc5\x32\x6e\xa2\x07\xa2" + "\xa5\xc7\x91\x3a\xd7\xe5\x8b\x2b\x97\x71\x73\x43\x70\x17\x9a\x35" + "\xb8\x71\x6c\x6f\xb0\xdd\x80\xfe\xbb\x1b\x69\x30\xfe\x19\x95\x33" + "\xa4\x5f\xa5\xaa\x87\xfd\x10\x1a\xe3\xdd\x95\x14\xef\x0e\x9c\xa5" + "\x65\x01\x31\x30\xad\x92\x46\xb8\x03\x47\xe8\x2e\xa2\x24\x77\xe0" + "\x1c\xdd\x4d\x34\xc9\x1d\xa8\x45\xff\xdc\xcc\xf1\x9f\xd8\xc9\x60" + "\xc0\xdb\x79\x67\xa5\xd1\xe0\x0e\xec\xa6\xc9\x95\x26\xbc\x8b\x69" + "\x51\xbc\xe8\x73\x07\xb2\x90\xae\x80\x96\x0d\x88\x2f\xd2\xe3\xc5" + "\x9f\xd6\x0e\x90\x25\xeb\x55\xe1\x74\x07\x60\x2b\x07\x4e\x21\x3c" + "\x28\x96\x0d\x7c\x8d\xa7\x4f\x04\xab\x16\x9a\x97\x0d\x7c\x21\x16" + "\xbe\xfa\x09\xbe\xff\x24\x84\x91\x84\x3b\x30\x9f\xda\x7d\x3e\xa4" + "\x73\x0a\x51\xfd\xb0\x7f\xcd\x15\x23\xf5\xb3\x1f\xa4\xea\x85\x66" + "\xd4\xd1\xda\x8f\xfa\x89\xe4\x85\xe3\xfb\xb7\xe1\x5d\xb3\x70\x9c" + "\xfc\xae\x5a\x68\x17\x96\x85\xd6\xe9\x18\x78\x70\x1d\xdc\x81\x4e" + "\x5a\x0b\xd3\x79\xd9\x16\xaf\x60\xfc\x47\xef\xe4\x71\xc7\x7c\xf6" + "\xa1\x90\xb8\x6c\x8b\x53\x20\xce\x2c\x92\x16\x5a\xdd\x81\x1e\x12" + "\xd5\xc8\x9b\xbc\x70\x8a\x84\x57\xb5\x30\x13\x69\xbd\x9c\x2e\x1c" + "\x0e\xc3\xe0\xb4\xcb\x06\xd8\xb7\xd5\xc2\xcc\xfe\xa4\x85\x73\xf1" + "\xe4\xe0\xd9\x83\xbc\xef\x0a\x57\xca\x6f\xf8\x1c\x2c\xf2\x1f\xc6" + "\x77\x4b\x1f\xfb\x6c\x62\x5a\x0e\xd0\x70\xa4\x3f\x0c\xf9\x49\x87" + "\x1c\x32\xbe\x1d\x12\xdf\x9a\x85\xff\x77\x9f\xaa\xc7\x7f\xd5\xea" + "\xf1\x29\x87\xf7\x42\xa6\xf0\xdb\xdf\xab\xe2\xfa\x90\x6f\x85\xcc" + "\x57\xb5\xd0\x2f\x2c\xe9\x66\x3f\xda\x17\xe8\x5a\xc9\x74\x04\x5d" + "\x2b\x99\x96\x80\x8f\xf1\xcf\x5e\x12\x49\xe9\xe6\xfe\xa4\x74\xab" + "\xa8\x49\xbf\xbb\x5f\xf6\xd3\xe9\x73\xfb\x24\xec\xf4\x1f\x01\x4e" + "\x2e\xe4\x37\x0e\x30\xe6\x8a\xaa\xf4\xcc\x7e\x97\x8d\x96\x6d\x11" + "\xfe\x65\x81\x9d\x81\xb5\x5b\x28\x6e\x2a\x55\x1a\xf8\xbe\x2b\xb7" + "\xa3\x00\xf5\x6c\xc3\x3b\x1d\xf1\x34\x06\x65\x7d\x02\xb8\x73\xb9" + "\x3c\x51\x9d\x9e\x09\x98\x19\x80\x55\xc0\x38\x7d\xcd\xfe\x51\x93" + "\xd3\x73\xbe\x96\xf8\xa5\x3b\x82\x55\xe9\x75\x41\x4b\xfa\x1e\x5d" + "\x86\x58\x7e\x14\xdd\x6a\x69\xa9\x4f\x04\xdc\x81\x43\x04\x19\xb3" + "\xb4\xfb\xce\x71\x3c\xc6\x06\x47\xc0\x67\x96\xa9\xdd\x78\x37\x13" + "\xcb\x4f\x7b\xc9\x2b\x9c\xf6\x13\x96\xa1\xa5\x25\xbe\x9d\xd3\xa8" + "\xc4\x80\x6f\xe7\xda\x80\x99\xd6\x94\x98\x2a\x07\xaa\xd2\x8b\xda" + "\x4b\x98\x2f\x67\x91\x87\xf3\x15\x53\xa2\x01\xf6\xb1\x41\x04\x12" + "\x1d\x5e\xd3\xa8\x22\xa7\x68\xf7\x65\x21\x6d\x89\xbc\xbf\x8b\xe5" + "\x88\xd3\x2f\xe9\x11\x9e\x01\x4b\x86\x95\xeb\x26\x46\x57\xd2\xe9" + "\x9e\x39\xc4\x63\x94\xd3\x3d\xcd\x2c\xa7\x41\xd0\xa5\x1b\x32\xda" + "\xbf\xa4\xa7\x32\x7e\xcd\x15\x32\x20\x6c\xe0\x74\xd1\x11\xc4\xb7" + "\x21\xdd\x29\x29\xb7\x4b\xaf\x04\x12\x03\x96\xf4\x9c\x40\x55\xba" + "\x7f\xe9\x95\x7e\x71\xba\xa8\x96\x9e\xe9\xa9\x04\xad\x8e\xd0\x92" + "\x4b\x81\xb8\xf6\x92\x02\xa4\xe9\x43\x78\xb3\x94\xff\x25\x97\x7a" + "\xc5\xd2\x97\xc5\x17\x4b\xaf\xfc\x49\x2c\x29\x12\x9f\xac\x75\xd0" + "\xe8\x9b\x76\x8a\x20\xb7\x8b\x53\x9d\x47\xe8\xa6\x73\xec\x23\x27" + "\x9d\xb2\xf2\x83\x62\xc9\xa5\x2f\xc4\x9a\x97\x99\x36\xf3\xe9\x74" + "\x11\xda\x8f\xa3\x96\xe9\xed\x38\x5d\x74\x1c\xe5\xa7\x03\xae\x53" + "\xb8\x1d\x87\x90\xb6\x35\xf1\x99\x4b\x16\x3a\xd5\x59\x4b\x81\xa4" + "\xf4\x9c\x81\xea\xf4\xa2\x60\x52\xfa\x9e\x60\x75\x7a\x1d\xf8\xd4" + "\x1d\xa8\x4e\xf7\x0f\x24\x65\x40\x06\x32\x8a\xc0\xa7\x11\xcc\xf3" + "\x6b\x18\xb3\xe3\xfb\xf9\x6b\xcc\xff\xaa\x0c\x87\xb0\x64\xd4\x41" + "\x37\x0a\x25\xfb\x19\x0e\x1e\x77\x8b\xa4\x8c\xba\xfe\xa4\x8c\x3d" + "\x48\x57\xa7\xda\x57\xc6\x61\x96\x4b\xd9\x37\xd5\x64\xfc\x27\xf4" + "\x25\x71\x88\x6f\xc1\x73\x12\x4f\x87\xa8\x59\x64\x07\xfc\x24\x29" + "\x53\x55\x8b\xec\xe2\x81\x2a\xd8\x99\x57\x58\x26\x9d\x22\x69\x51" + "\xe6\xb2\x81\xb9\x4e\xd0\x11\x6d\x65\x91\x3d\x58\xbd\x68\xae\x48" + "\x5e\x54\xe4\x97\xf2\xbf\xe8\x05\x86\xdf\xbf\xcd\xce\x63\x72\x13" + "\xe2\x1d\x08\xbb\xd8\xc7\xf2\x6a\x59\xd4\x1d\xb4\x3c\x92\x09\x78" + "\xfe\xc7\x5e\x15\xde\x81\xaa\x47\xac\xc1\xaa\x47\xcc\x81\x61\xb0" + "\x61\x1d\xc7\x89\x75\x54\xe0\x63\x01\x3a\xfc\x0e\x34\x69\x96\x32" + "\xe0\x76\xa0\x1d\x6c\x99\x50\x79\xba\x07\xf2\x50\xf2\x2b\xa9\x9f" + "\xda\x7d\x67\x25\x5d\x81\x47\x37\xcb\x15\xf3\x78\x4d\x09\x55\xa2" + "\x2c\x7f\xb0\xfa\x11\xf3\x40\x35\xe0\x26\xa1\x9c\xe4\xc5\x6f\xf8" + "\x65\x9b\x5d\x0c\x99\x3d\x4e\xec\xcf\x5a\xc9\xf9\xe2\x3d\x43\xe9" + "\x49\xd6\x57\xac\xa3\x96\x05\xfc\x2c\x37\xff\xca\xba\x4d\xe9\x2a" + "\x5a\xab\xeb\x2a\xd6\x53\x3c\x2e\x60\x5d\x15\xd4\x74\x55\x50\xd3" + "\x55\xf2\xdb\x02\x7d\x53\xb5\xd0\xca\x3a\x69\x99\x43\xe9\x9a\x65" + "\x03\xa9\x02\xf2\x91\x80\xb6\x6c\x55\xfc\x40\x9a\x9a\x85\x53\x64" + "\x7a\x49\xa7\x85\x99\x41\xe8\x1c\x3c\x39\x41\xa5\x73\xea\x34\x9d" + "\x63\xd4\x75\x0e\xfb\x5a\x45\xbb\x0a\xc6\xd2\x39\x41\x4d\xe7\x0c" + "\x08\xa5\x73\x34\x7c\x3e\xe5\xf0\x01\x4d\xe7\x0c\xc4\xd0\x39\x68" + "\xd3\x5c\xdf\x38\x4d\xd7\x54\xb2\xae\xe1\xfa\x42\xde\xcc\x41\xa5" + "\x6b\xec\x18\x13\x18\x59\xd7\x0c\x20\x4f\x50\xd7\x35\x7d\x52\x27" + "\x64\xb2\xbe\xe9\x7f\x8d\xa0\x43\x6d\xc4\x7a\x46\xea\x94\xc0\xa4" + "\x00\xeb\x14\xd0\xef\xc1\x68\x9d\x02\x78\x39\xf8\x6d\xd1\x74\xd5" + "\x9e\xc4\x9d\x22\x00\x9d\x52\xb4\xcc\xe1\x03\xaf\xff\x80\xb1\x31" + "\x74\xb7\xa3\xbc\xd2\xed\x08\x10\x74\x41\x9d\x68\xaf\x24\xe0\x08" + "\x19\x1e\x80\xbe\x20\x42\xdb\xec\x0e\xa0\x9d\xa3\x6c\x7f\x7b\xc9" + "\xa7\x34\x80\xf6\xba\xa4\xa7\xd7\xbd\xc6\x67\xb7\x2c\xb9\x24\xbc" + "\xa0\x8f\x67\x4d\x49\x25\x74\x8c\xdd\x7b\xba\xe7\xd7\x94\xd5\x29" + "\x82\x59\x79\x1e\x1b\xf0\xf0\x2f\x59\xd7\x9a\xc8\xbe\xc4\x97\x5e" + "\x11\xad\xd0\x8d\xff\xb2\xe4\x92\x25\x31\xb7\x93\x6e\xcb\xca\x17" + "\xc1\x01\xb4\x35\xd4\xb7\x08\xf5\x76\x00\xf7\x3d\x68\x77\x75\x68" + "\x6b\xdd\x81\xa8\xb6\x86\x76\xf3\x3c\x7e\xdb\x14\xfd\x32\xea\xd0" + "\xd6\x1c\x41\xd9\xa7\x75\xca\xb1\x18\xda\x5b\x1d\xcf\x55\xa1\xbd" + "\x39\x82\xd5\xaa\xbd\x05\x55\xbe\xc3\x41\xa6\x9f\x51\x6b\x6f\xe0" + "\x05\xe2\x5b\xf0\x9c\xc4\x13\xbb\xbd\x95\x44\xb5\xb7\x97\xb5\xf6" + "\x96\xa4\xda\x1b\xf8\x1a\x37\xb0\x4d\xb5\x39\x2e\x83\xc7\x6c\x83" + "\x6d\x2e\x79\x51\x37\xfb\xfc\x51\xf2\xc3\xed\x6e\x11\xfa\x97\x47" + "\xac\x68\x73\x66\xb4\x39\xc0\x13\x5e\xd6\x9f\x90\xcf\x3f\x72\x9f" + "\xb7\xb4\x44\xfc\x71\xed\xc0\x84\x4a\x91\xf4\x88\x15\x3a\xed\x4f" + "\xd0\xa7\x7f\x5c\xe3\xa3\x26\xc0\xea\x46\x79\x7e\xb4\x29\x33\xda" + "\x16\xb7\xa9\x3d\x03\xdb\x18\xe6\xe2\x3d\x83\x30\x64\x9f\x19\xd9" + "\xa6\xd4\x4c\x77\xec\xf9\xc2\x3e\xd7\xed\x09\x1e\x3a\x27\xe7\x7a" + "\xf0\xdb\xea\xa1\x3f\x1c\xd1\x7e\x4f\xf6\xd0\xc7\x32\x9c\xdb\x62" + "\xc9\x0e\x1a\x7b\x91\x6e\xef\x80\xdc\x13\x7e\x27\xe0\xf7\xb9\x65" + "\x77\x7d\x02\x9b\xe2\x63\x3b\xca\xee\xe3\xf6\x28\x5c\xb3\x31\x0e" + "\xa1\x34\xc8\xa3\x59\xf4\xb1\xff\xf9\x55\xf3\xd8\xff\x3c\xfb\x9b" + "\xc7\xf7\x68\xd0\x60\x32\xde\xc9\x87\xae\x52\x0a\x1e\xf6\x5b\x5b" + "\xc9\xf6\x15\x7e\xa7\x8a\xcd\xd6\x91\xfb\x37\xd1\xd4\x44\x9f\xf2" + "\x33\xcf\x7e\xf1\x13\x03\x94\xc2\xbf\x85\xeb\xb7\x81\xc6\xab\x9a" + "\xaf\xf9\x24\x94\xc7\xbe\xe6\xcb\xec\xd4\x58\x2a\xfd\x5f\x5a\x1b" + "\x5d\xe2\xe8\x40\x1f\xd3\xe1\x61\xbf\x8e\x0b\xe3\x06\x3c\x6f\x05" + "\x9e\x3d\x2b\xb7\xa4\xc9\x3b\x06\x63\xe9\x99\x3e\x97\x6d\xb0\xfe" + "\x43\xc4\x4f\xd5\x69\x32\x44\x7c\x96\x4e\xa7\xa1\xce\xb9\x72\x7f" + "\x3d\xb0\x49\xf4\xb0\x6f\x0e\x3e\x8f\xeb\x0c\x88\xff\x87\xfd\xcc" + "\xef\x18\x20\xf3\x32\x87\x5f\xb8\x7b\x44\x2b\xdf\x97\xd9\xc8\xfe" + "\x42\x2a\x44\x30\x98\xb4\x6a\xa2\xa8\x5e\x65\xed\xdd\x24\x02\x3c" + "\xf7\x81\x32\x8e\x7a\x68\xe1\x61\xc5\x8b\x74\x87\x1c\x03\x5a\x56" + "\x61\x2c\x41\x49\x0c\xeb\x34\xf2\x0f\x54\xaf\xb2\x21\x1d\xc6\xc6" + "\x17\x7d\x32\x9d\x25\xdd\x51\xb2\x95\x6e\xb9\x48\x93\x2c\x72\x1c" + "\x50\xb5\x2a\x95\xf5\x02\xc2\x2c\x08\x63\xf8\xb3\xfb\x5c\x93\x60" + "\xc3\xfe\xd7\x80\xb2\x75\x27\x4d\xd4\xd3\x79\xc8\xc6\x27\x39\x23" + "\xe6\x4e\xb5\xdd\x12\x95\x11\xe7\xbd\x0c\x14\x79\x7a\x8d\x4b\x4a" + "\x8b\x1d\x1d\xd2\xeb\xe9\x7e\xf6\xb3\xe9\xdc\x4e\x13\xc1\x1f\xc6" + "\xaf\xda\xe9\x10\x5d\xc2\x35\xc9\xfe\xc1\x56\x3f\xc6\x10\x93\xea" + "\x3d\xf4\x57\xe5\x43\xd1\x33\x78\x55\x74\x02\x46\xdd\x01\x8c\x03" + "\x99\x3e\x4c\x4f\xb4\x9b\x20\xe8\x70\x9e\xf5\x52\xe3\x26\x1e\x0b" + "\x4f\xf2\xe8\xf4\x1a\x9a\x27\xab\xa6\xaa\xf1\xe2\x1d\x69\xc2\x25" + "\xa8\xf5\x36\x5e\x6b\xb8\xe3\x21\x45\x83\x8c\x3d\xbd\xd0\x25\x3c" + "\x97\xca\x3e\x31\xcb\xac\xc2\xdf\xe7\xba\x63\xb6\x87\xee\x3e\xa3" + "\xcd\xd9\xf8\xdc\x81\x0c\xd6\x2f\x31\xfb\x2e\x79\x36\x79\x10\xfe" + "\x0f\xf2\xda\x27\xf2\x5d\xa6\xac\x9f\x6a\x8e\xed\x50\xfc\xf7\x33" + "\x5c\x3e\x5b\xdf\x89\xf8\x32\x9f\xe8\x16\x55\x35\x87\x79\x9c\xc1" + "\xe7\x7c\x11\x96\x0f\xb9\x16\xad\xa5\x8c\xd3\x0f\xf2\x5b\x6f\xbb" + "\x46\x5d\x18\x0f\xf2\x59\x7a\x35\x7f\xf3\x83\xac\x13\xe5\xa4\xcd" + "\x09\xdd\x71\xca\x43\xd3\x8a\x75\xbc\xd8\xd6\x00\x6d\xcd\x6c\x7b" + "\xb0\xcd\xc1\xf3\xf3\x65\x15\xc2\xcf\xb6\x07\xd2\xfa\xf5\x3a\x70" + "\xfd\x54\xbd\x7e\x90\x10\x5e\x2f\xe0\xe0\xc5\xd8\x5a\xd2\xa0\x6c" + "\x0b\x99\xa5\x8f\xbe\x01\x9e\xdf\xcf\x90\x75\xe1\x3a\xcb\xba\x48" + "\x3d\x8b\x7e\x22\x30\x07\x63\x29\x19\x5e\x07\x58\x39\x1e\xba\xa7" + "\x43\xc9\xd3\x1d\xa7\xa2\x65\x28\xe4\x5b\x36\x3d\xd3\xf9\x35\xdd" + "\xe6\x0c\x8a\x0b\x80\xf9\x19\xe8\x14\xc7\xef\x20\xdb\xdb\x7e\x96" + "\xdd\xdc\x14\xee\x97\xdd\x15\x57\xd8\xce\xe6\xb4\x63\x90\xb6\x13" + "\x69\x3e\xd5\xd2\x7e\xaa\xd6\x66\xe4\x7b\x38\xbf\xd1\x97\x65\x00" + "\x8f\x1e\xaf\xec\xf3\x6b\x4a\xf4\x6f\x81\x6f\xbc\x9b\x45\x75\x6e" + "\x4a\x6c\x5c\x1e\xc9\xe4\x3e\x6d\xe0\xaa\xe8\x41\x39\xe3\x59\x8e" + "\x9c\x5b\xe8\x66\xc8\xe4\xf9\x1d\xdb\x69\x2c\xcb\x98\x48\x5a\x35" + "\x57\xd1\x7d\xf2\x5c\xe1\x82\x0d\x0a\x8d\x5a\xb2\x89\x6e\x41\x1b" + "\x4a\xbd\x48\x93\x97\xac\xad\xb0\x01\x57\xa2\x03\x97\x89\xed\x94" + "\x3f\x21\xfd\x6c\x77\xe0\x33\xbe\x53\x04\xb2\x38\xb9\x58\x97\x45" + "\xfc\x76\xdc\x48\x57\x80\xae\x27\xd5\xbc\xc2\xe4\xcf\x78\x2e\xfe" + "\x02\x4d\x3e\xc3\xf5\xc5\x63\x40\xd8\x6f\xc4\x55\x31\x51\xa8\x7e" + "\xad\xc5\x43\x93\x03\x78\x9f\x94\x0f\x74\x89\xf6\xdd\x82\x74\x47" + "\xc5\xd5\x01\x4e\x73\x12\x61\x88\x33\x70\x3b\xa9\x47\xd9\x3e\x0f" + "\x2d\x6a\x55\xbc\x99\xdc\xca\xb0\x86\xc0\xa1\x45\xc8\x73\xee\x5f" + "\xa1\xbe\x53\x9e\xb1\xed\x30\x00\x8f\x29\x33\x65\xbb\x00\xac\x46" + "\xa3\xd2\xd9\x41\xe0\xda\xe0\x0a\x16\x41\x3f\x17\x05\x6b\xd6\x78" + "\xe4\x6f\x2d\x4e\x68\x7d\x69\x6c\xf8\x35\xc7\xa4\xaf\x65\x9a\xd2" + "\xa2\xe0\xd4\x1c\x6e\x9d\x70\x91\xbf\xa5\xaf\x25\x9f\x65\xad\xc7" + "\x5d\x97\xa6\xfc\x3f\x23\x8d\x1a\xe7\x4f\xf9\xa8\x17\x65\xf4\xb9" + "\xa6\xa0\xde\xd3\x0f\xab\x75\x89\xb5\x9e\x21\xda\x9e\x85\xdb\x0e" + "\xb7\x39\xd5\xa6\x7f\xb8\xef\x74\x93\x6c\x7f\x87\x21\xf3\x27\x35" + "\xfd\xcb\x73\x30\x09\x17\xe8\x87\x7b\x4f\x5b\xa5\x7c\x1b\x85\xf1" + "\x4e\x6b\x84\xef\x56\xc4\x5d\xff\xdc\x99\x85\x27\x17\x4f\x91\xf6" + "\x8d\xd4\x77\xee\xc1\xd3\x81\xef\x0a\x49\xbb\xf7\x0a\x0c\x1e\xc4" + "\xf5\xc2\x76\xe7\x6f\x0f\xdd\xb9\x42\xbc\x37\xd9\xa8\xff\x6e\x7c" + "\x87\xe7\x11\xee\x04\xbf\xa6\x98\x15\x2f\x7e\x28\xfd\xe7\x03\x37" + "\xa6\xbb\x70\xd6\x09\x7f\xdb\x0e\x1f\xf0\xbe\xf3\x68\x5b\x9d\x8f" + "\x6c\x77\x72\xfd\xef\x3c\xc6\x75\xf2\x81\xfe\xfc\x2e\xab\x13\xde" + "\x13\xf5\x01\xe2\x35\x2c\xc0\x42\xfb\xff\xc9\x5e\x35\x27\x51\xe3" + "\x61\x78\x9a\x4c\x08\xbd\xfe\x8a\xce\x6b\x3d\xb6\x4d\x06\xfe\xbe" + "\xb9\x41\xcd\xbb\x34\x87\xe6\x83\x7f\x98\x84\x76\xfe\x20\xfb\x71" + "\xbe\x4c\x3f\x5c\x29\x40\xeb\x13\x45\xd2\x47\xa4\x97\xe7\x5f\x1a" + "\xe4\xbc\xc6\x0f\xa1\xff\xa6\x14\x69\xfe\x70\xbc\x52\xd7\x00\xe6" + "\x7e\xc4\xa1\x3f\xea\x39\x5d\xe4\xa7\x01\xae\x33\xf2\xfe\xfa\xaa" + "\xdf\xc4\x7e\xac\x77\x94\x40\xef\x00\x0f\x01\x5e\x29\x5d\x76\x67" + "\xf7\xf6\x4b\xc2\xaf\xd7\x99\xd7\x3a\x01\x77\xaf\x87\xaa\xea\x86" + "\x6c\x13\x83\xf5\xb0\xff\xf2\xc4\x64\xc5\xc7\x20\x68\x15\xc9\x47" + "\xfb\x61\xc5\xc3\x1f\x46\xfa\xdf\x45\x38\x1e\xe4\xb2\xcf\xc7\x93" + "\xa5\x7d\x87\x3f\x96\xb0\xdf\xe0\xab\xbd\xb6\xcf\x65\x9f\x88\xf6" + "\xb1\x5b\xf1\xc6\xae\x7c\xf5\xb3\xdc\x7c\x89\xbe\xa7\x9f\xfd\x8e" + "\x5f\x22\x0e\x67\x19\xe7\xf0\x20\xec\x1b\x7c\xa7\x22\xde\xc2\xed" + "\x97\xfd\x6d\x86\xc7\x0f\xfa\x55\x22\xbb\xf4\xd1\x97\xb8\x73\xcf" + "\x1e\x96\x5d\xa4\x99\x9d\x18\xd8\xb3\x07\xe5\xed\xd5\xe9\x8a\xb0" + "\x72\x8e\x67\x39\x45\x78\x33\xe8\x22\x75\x85\x0f\x63\xc1\xd8\xb6" + "\x87\xfd\xe4\xa0\x8d\x66\x59\x64\x67\x5e\xf6\xd0\x5d\x67\xa1\xc7" + "\xa0\xbf\xd7\x28\x3f\x22\x74\xd7\xa7\xfc\x0d\xfd\x79\x1e\xbf\xcf" + "\x9c\x86\x9e\xba\x56\xb3\xdc\xd6\x6f\xa4\xe1\xd7\x8c\x94\x16\xa8" + "\xf9\x38\x2b\x90\xfc\xd8\x54\x77\xf7\x31\x6a\x0f\xfc\x1f\x64\x7b" + "\x51\xc2\xf8\x07\xf6\xfb\xea\xdc\x22\x06\x3e\xbc\x76\xd8\xe4\x0e" + "\x7c\xd1\x2a\x7d\xbc\xab\x73\xf4\x86\x9f\x5e\x50\xf7\x1c\x75\x69" + "\xdf\xc2\xf2\xb1\x7d\xff\xf3\x22\xb0\xbf\x8b\x7d\xc1\x58\x47\xee" + "\xbb\x46\x53\xdf\xdd\x4a\xa9\xf5\xd7\x68\x72\xc3\x35\xb2\x8b\x7f" + "\xe5\x7b\x80\x82\x39\x6b\xae\x58\x08\x7a\x22\x67\x74\x09\x99\x1b" + "\xb6\xc2\x9e\x0b\x90\x61\xa0\x1a\xf6\x1c\xdf\x87\xf4\x85\x9d\xf5" + "\xe5\xa0\x3d\xd7\x2f\x6d\xe5\x55\xd2\x37\x2b\xf4\x6c\xf3\xa8\x22" + "\x32\x24\xe4\x91\x05\xf8\x39\x2f\xd3\x5d\x23\x12\x3a\x61\x4b\xa2" + "\xce\x1e\xad\xbe\x78\x4f\x4c\x2c\xa2\xe1\xb2\xae\xd0\xe1\xa2\x7a" + "\x4d\xc7\x90\x7d\xb3\x91\x65\xca\xc7\x6d\x09\x75\xb8\x7b\x12\xaf" + "\xb5\x1e\x9b\xe0\x37\x95\xd5\x0b\x3f\x87\x97\x4f\x12\x7e\x84\x9b" + "\xb9\xec\xa3\x08\xef\x73\xdd\x9d\xea\x31\x3d\x10\x18\x4a\x46\x31" + "\x6e\xd2\x74\xcd\xdd\x7f\x2d\x8c\x95\x90\xd1\x45\x45\xdb\x03\xb0" + "\xc7\x2f\x73\x3b\xbe\xfb\xe8\xb2\x62\x11\xb0\x6d\xe0\x75\xef\xbb" + "\x9b\x78\x4d\x9e\xd7\xe2\xfe\x0a\xb6\xce\x37\xad\xc3\x73\x1f\xc2" + "\xe3\x87\xc4\x62\xc0\xac\x59\x54\x24\x30\x6e\xff\xb6\x76\x3d\xef" + "\x05\x79\x53\xee\x3b\xb9\xbb\xc7\x43\xab\xd2\x34\xff\xae\x3d\x4a" + "\x9f\xde\x73\xca\x07\x1a\x44\xea\x80\x7b\x9a\xd8\x4f\x49\x6f\xd5" + "\xf2\x23\xad\xb7\xb1\xee\xbf\xe7\x1d\x65\x0b\x2d\x3f\xac\xfa\x82" + "\x7b\xb6\xa8\x39\xfd\x7b\xe6\x7b\x68\x9e\x94\xb9\x92\x3b\x58\x26" + "\xee\x29\x17\xc9\xcb\xff\x92\xd3\x4d\xaf\xa4\xca\x8d\x01\x82\x2d" + "\xb0\xfc\xb0\x90\x6d\xe5\x32\x89\xb7\x5f\xea\xe3\xbd\x14\xbe\xf1" + "\xab\xfb\x60\x1b\x9c\x42\xdc\x11\x2e\xc3\x8b\x34\xa0\xfb\x08\xb5" + "\x66\x7f\x4f\x95\x87\xee\xd7\xf4\xe1\x3d\x05\x6a\xae\xf9\x9e\x82" + "\x5e\xe4\x85\xad\x38\x06\xf1\xb0\x7f\x97\xa7\x68\x6b\xbb\x72\x5d" + "\x15\x61\x6d\x1e\x5a\x21\xe7\x59\xcb\x27\x91\xb5\xdc\x26\xba\x87" + "\xb4\xf5\x22\xea\x39\x6d\xb1\xdc\x17\x63\xa4\xf1\x7d\xae\xa9\x66" + "\x1d\x2e\xfa\xdb\xbf\xe8\x35\xae\x5c\x89\xb0\x89\x3a\x5c\xa4\x19" + "\x8b\xef\xa9\x83\x69\x54\x9e\xf9\x61\x79\x56\xf6\x1a\xef\xfe\x0b" + "\x84\x65\x47\xe5\xc9\x8b\xca\x53\x12\x96\xa7\x52\x2b\x67\x77\x54" + "\x9e\xda\xa8\x3c\xcd\x31\x70\x6b\x89\xca\x73\x32\x2a\x4f\x47\x0c" + "\xdc\x7a\xa2\xf2\x04\x22\xf3\x4c\x4b\x08\xa3\x2d\xef\x51\x49\x45" + "\x98\x2d\x32\xcf\xb4\xd4\xa8\x3c\x69\xfa\x37\x6c\xcf\x3c\x65\x1b" + "\x40\x9e\xc0\x53\xf0\xf5\x08\xe2\x51\xff\x05\x43\xda\xf0\x2c\x9b" + "\x90\x99\x66\xe7\x21\xe5\x27\x9f\xf5\x2a\xcf\x9f\xb3\x3e\x87\x5d" + "\xdc\xc3\x32\xc1\x76\x27\x97\xd5\x45\xd3\xf7\xb1\x0c\x01\xe6\xb1" + "\xeb\xe9\x31\xed\x64\x14\x9e\x1d\x51\x78\x76\x5f\x4f\x8f\x69\x81" + "\xc8\x3c\xd3\x13\x22\xf3\x4c\x9f\x18\x96\xa7\x49\x95\x33\x3d\x35" + "\x2a\x4f\x5a\x54\x9e\xec\xeb\xe5\x73\x7a\x41\x54\x9e\xf2\xa8\x3c" + "\xbb\x43\x34\x9c\x2e\xef\xa4\xe1\xf6\x80\x70\x8c\x7f\x7e\x7c\xa3" + "\x7d\x62\x16\x5d\x9e\xf5\xfd\x62\x4a\xae\x67\x4c\xaa\x55\xfb\xa6" + "\xa4\x8f\xa2\x4e\x9a\x31\x87\x94\x9f\x3f\xef\x07\xd7\xfc\xf1\xbc" + "\xa6\x04\xda\x76\x9f\x70\xf8\xd1\xe7\xce\x40\x1f\x35\x67\xae\xbe" + "\xa7\x82\xf7\xa1\x48\x9f\x76\x72\x3c\x32\xdd\xa3\xda\xdf\x8c\xd9" + "\xda\x1a\x0e\xd7\x07\xe3\x8c\x19\xb3\xff\x27\xf1\xfa\x94\xf1\x62" + "\x1f\x4f\x80\xe1\x18\x1c\x6b\x0c\xe2\xca\x65\xce\x38\xaf\xe3\xda" + "\xa8\xf6\xc2\xb0\x3f\x31\x2f\xfb\xdb\x42\x9e\x23\x61\xe3\x13\xc6" + "\xd5\x77\x6c\xab\xdf\x14\x89\xf3\x8c\xbd\x1a\xce\x1e\xa5\xa3\x66" + "\x78\x74\x7d\x32\xa4\xfc\x55\xd5\xd4\xb5\x83\xea\xbc\xee\x7f\xba" + "\x1e\xf6\x26\xc6\x58\x8c\xf7\x05\x4a\xb5\x4b\xfb\x77\xc3\x35\xe2" + "\xdf\xee\x8a\x79\x72\x5f\x80\xaa\x4b\x6a\x1e\xdf\xab\xc0\xb6\x4f" + "\x5b\xc9\x57\xd4\x2b\xc7\x68\xac\x1b\x53\xf7\x9d\xa8\xf0\x02\xd7" + "\xd4\x1c\x7d\xdf\x8c\x87\x52\x95\x5d\x57\x55\x53\xc5\x7b\x16\x78" + "\x1d\xef\x84\x6f\x2e\xa7\xa9\x00\x9e\x69\x3a\x0d\xf8\x8e\x06\xa4" + "\x9d\x3d\xd4\x58\x29\x9c\xae\x0a\x87\x59\x5f\x2b\xf9\x49\x6d\x8b" + "\x6c\x0f\xf1\x90\xd3\xd4\x8e\x48\x99\x4b\xed\x8e\x94\xb9\x54\x7f" + "\x64\x7b\x30\xa2\x3d\xcc\x4c\x88\xcc\x33\x73\x62\x64\x9e\x99\x53" + "\xc3\xf2\x54\xa9\x72\x66\xa6\x45\xe5\xc9\x8e\xca\x13\xae\xff\x50" + "\xe7\x99\x25\x83\xe3\x4e\xa9\xef\x67\x56\x86\x7d\x1b\x6b\x65\x3f" + "\x35\xb3\x56\x0f\xe3\xb9\x3b\xb6\x51\x59\x6e\x34\x78\x47\xa3\x74" + "\x14\xa7\x6f\x8b\xc2\xe1\x6c\x14\x0e\x9d\xfa\xf7\x01\x35\x6e\xfe" + "\x2d\x68\x77\x97\x26\x67\xbe\xc4\x9d\xf4\x78\x62\xe0\x89\xa7\xd8" + "\x36\xe3\xfe\x49\xee\xdd\xda\x0e\x9b\xf2\x0a\x59\x78\xcf\x5c\x57" + "\x39\xc5\xb1\xdf\x37\x0f\xdd\x9b\x8b\xf1\x5c\x13\xd2\xf4\xc0\x9e" + "\x5a\xd6\x45\x33\xb9\xfc\x3a\x94\x01\xda\xcd\xca\x8c\xc4\x61\x56" + "\x4e\x24\x0e\xb3\x8a\xc2\xbe\x2d\xf8\x76\x84\xd5\xdb\x12\x67\x95" + "\x7b\x34\x61\x5b\xcf\xaa\xd2\xc3\x79\x0e\x00\x75\xec\x76\x4a\x3b" + "\x20\x8d\xf7\xcb\x25\x5f\xa0\x59\xdb\x79\xbe\x40\x83\x79\x3c\x9c" + "\xb6\x8a\x16\xb3\xce\x44\xe1\xe1\x89\xc2\xc3\x1b\xd2\x35\x33\x7d" + "\xaa\x8d\xdc\x6b\xf2\xd0\x03\xa9\x1c\x06\x5a\xd8\x12\x03\xb6\x31" + "\xad\x77\xb0\x9d\x7a\xef\xe3\x3e\xd4\x57\xbc\x66\x4c\xd6\xbe\x57" + "\x8a\x3b\xd8\xee\x5e\xd5\x04\xfd\xcc\x7b\x22\x6f\x47\x58\xae\xe2" + "\xeb\xbd\xa8\xff\x8f\x33\x15\xdc\x7b\xe5\x1a\x2c\xa7\xc5\x6f\xbb" + "\x48\xaa\x89\xb9\xcf\x8c\xe5\xb9\x37\xb9\xa6\x49\xdb\xaf\x69\x03" + "\x8c\xbd\x7a\x7b\x08\xd6\xd4\x34\x05\xab\x9f\xa9\x44\x58\x13\xda" + "\x44\x9d\x1a\xd3\xe4\x9e\x82\xec\xd7\x81\x7f\x18\x03\xcf\xd6\xc6" + "\x32\x35\xec\x3b\x96\xf7\x6a\xb1\x6f\xc9\x04\xb5\x5f\xe2\xde\xb3" + "\x61\xed\xca\x67\xdb\xfa\xa0\xb8\x40\xb3\xdf\x61\xdb\x8e\xf5\x06" + "\xef\xbd\x3b\x11\xf0\x12\xcf\xb3\xb8\x03\x17\xa5\x4d\x8e\xf8\x3a" + "\x95\x77\xb6\x25\x2c\xaf\x57\x9b\x07\xe9\xe6\xb8\x19\x01\x32\x9d" + "\xf0\x79\xd9\x87\x7e\x8a\xb2\xe3\x67\xbf\x73\x02\xfa\x02\x79\xd2" + "\xf5\x3c\x3c\x67\xc2\x79\x30\xe6\x31\x4d\xaf\x50\xf7\x88\x32\x6c" + "\x6d\x4d\x5a\x8e\x8f\xdc\x15\xdd\xe4\xf6\x75\xf0\x9c\xa6\x49\xed" + "\x5d\x9a\x5d\x17\xe7\x27\x73\x6f\x75\x0d\x78\x3f\xbb\x6e\xa0\xba" + "\xa6\x0e\xb8\x41\xce\xef\x3d\xce\x3a\x30\x9c\x76\x19\x19\xd9\x4f" + "\x2c\x5b\x32\xed\xc9\x27\x16\xaf\xc8\x98\x67\x5b\xb1\x6e\x7d\x61" + "\xc1\xb4\x8d\xaf\x94\xdb\x36\x97\xae\x2b\x5f\xb7\xe1\x05\xe9\xf6" + "\xd3\x96\x5f\xae\xde\xf6\xe2\xfc\xb2\xf2\x05\xfc\x73\xaa\xad\xa4" + "\xb4\x70\x93\xfc\x79\xd7\x48\x8a\x04\xb2\xae\xbc\xb0\xd4\x36\xa5" + "\x60\xaa\x6d\x51\xfe\xba\xe2\x57\x4a\x0b\x63\xc2\x9a\x67\x2b\x2d" + "\x2c\x2d\xcc\x2f\xb0\x2d\xb0\xa5\x32\xe4\x70\x70\x61\xfc\x4c\xd5" + "\xf5\x53\x19\xfa\x73\xd8\xd0\xdd\xac\xa7\xb8\x5f\xef\xa2\x1f\x6d" + "\x67\x1b\x4e\xfa\xe9\x84\x1c\xa2\x4f\xc0\x18\x7e\x4e\xc5\xf5\xfd" + "\xf8\x9c\xaa\x48\xf9\x9d\xd3\x14\x29\xbf\x73\x8e\x5e\xdf\x8f\xcf" + "\x89\x6a\xff\x73\xa2\xda\xff\x9c\xce\xeb\xfb\xf1\x39\xfe\xc8\x3c" + "\xf7\x99\x23\xf3\xdc\x67\x1d\xd4\x33\xc0\x75\x97\xd4\x4b\xf7\x4d" + "\x8d\xca\x33\x3f\x2a\x4f\x56\xd4\x77\x6e\xd8\x37\x6c\xd7\xfb\x8a" + "\xc3\x6d\x03\x7c\x57\xe8\x6d\x3d\xa4\xdf\xee\xab\xd2\xd3\x70\xdf" + "\xd3\xc8\xf7\x01\xa9\xb4\x87\xc3\xd2\x76\x6b\x69\x07\xdb\x3f\xeb" + "\x24\xde\xb3\xa8\xec\xf3\x1f\x4d\xd3\x74\x1b\xdf\x0f\xa4\xf7\xa1" + "\x9d\xe0\xc5\xed\x97\xe9\xbe\x77\x1a\x55\x5a\x2f\xef\x63\x15\x6f" + "\xaf\xee\x6b\x4c\x26\x33\xe7\x65\x3f\x95\xc2\x35\xbb\x99\x7d\x28" + "\x22\x2c\x01\x0f\xf4\xd4\x8f\x6c\x1e\xd3\x83\xd2\xb7\x3e\xef\x69" + "\xf0\xd0\x8f\xa4\x2c\x73\xbe\xdd\x72\xef\x9d\x2c\xef\x1d\xbe\xe7" + "\x88\x7d\xbf\xb2\xfe\xe4\x72\xd9\x7f\x2a\x97\x0d\x18\x26\x61\x9c" + "\xfd\xb9\xe6\x07\xd3\x82\x27\x05\x30\xcb\x75\x98\x80\x67\x23\xe5" + "\x6f\x57\xee\x53\x57\x76\xcf\x8f\x6a\x75\xfb\x82\xc7\x0a\xb1\x74" + "\x47\xec\x3d\xc9\x94\x78\xc0\x15\xec\x68\xdd\xd1\xc9\x38\xb5\xb1" + "\x1d\xea\xb6\x06\xa8\xbd\x3e\x80\xf1\x2b\x59\xe4\x78\xca\x71\x89" + "\xdc\x4d\x01\xe2\xf9\xe1\xb5\x0e\xaa\x6c\x34\x06\x3b\xc4\x60\x3e" + "\x1e\xa3\xfd\x48\xee\xf9\xdf\xcd\xe1\xc8\x8f\xb1\x84\x97\xf7\x2e" + "\x0f\x75\xdf\x16\xa7\x6b\xbd\x83\xc7\x7b\x73\x67\x6b\xb6\xef\x9e" + "\x46\xc0\x8a\xb9\xaf\xd6\x48\xee\x3e\xd7\x5c\xf4\x7f\x6b\x3b\x74" + "\x9d\x7d\xa2\x4e\xea\x3e\x23\xc2\xf7\x80\x16\x2d\x43\xd9\x29\x9a" + "\x7e\x2f\xe1\xbd\x5e\x48\x7b\xec\x46\x69\x19\xef\x13\xa8\x37\xda" + "\xe2\xd1\x0f\x76\xa4\xc6\x6b\xfa\xd5\x8c\x7c\x3d\x7a\xbe\x6f\x53" + "\x3f\xed\x0c\x81\x17\x6d\xd5\xa7\xc6\x8a\xf3\xf2\xdf\x94\x7b\x75" + "\xef\x87\xfd\x37\x57\x6f\x07\x37\xe1\x1b\xfa\x6f\xae\xf2\xf5\xcb" + "\x3e\x60\x31\x9e\x2c\x2b\x81\xcd\x66\xf5\x41\x37\xde\x9f\xa7\xc7" + "\xc9\x79\x22\x8e\xab\x10\xfe\x13\xd6\x4e\x8e\xab\x18\x8c\xe3\x7c" + "\x8c\xb7\x23\xc0\xe1\xb5\x7a\xb8\xea\x5b\xee\x6f\x8e\xfa\x3e\xa6" + "\x7f\xe3\x77\x2b\x7e\x0f\xee\xd3\x87\xce\xe5\x3d\x4e\x86\x0b\x34" + "\x6f\x52\x83\x6c\x37\xf7\x7b\xf4\x78\x39\xa7\xf6\x3e\xaf\x8d\xf9" + "\x28\x98\xbc\xfc\xa8\xb4\xb9\x90\x87\xef\xcd\xc2\x18\xc3\x20\xfa" + "\xe5\x7e\xab\x1e\x86\xc3\x6d\x46\xde\x5d\x83\xef\x0b\x74\xff\xd9" + "\x46\x96\x6b\xf0\x75\x73\x80\x26\x96\x3c\xc0\xf3\xcf\xf3\xa4\xdc" + "\x72\x18\xc3\x65\x78\xdc\x27\x32\x6c\x86\xc7\xf7\x7b\x89\xde\x22" + "\xe0\x3a\x8f\xeb\x5f\x3b\x14\xaf\x10\x5f\x19\x46\xcb\x78\x7c\x57" + "\x45\xd6\x75\x5e\x53\xd4\xf7\x51\xfd\x9b\xe7\x7a\x95\xec\xcd\x6b" + "\xd6\xe2\x4e\xdd\xa8\x2c\x1e\xff\x22\x8d\x37\xb2\xbc\x1f\x53\x24" + "\xfc\x1f\x5b\xa2\xbe\x6d\xfa\x77\xad\x5c\x63\xf8\x71\xaa\x5e\x86" + "\xe4\x19\x64\xac\x79\x87\x37\xfe\x46\x7e\x5d\x91\xa7\x20\xac\xcc" + "\x61\xf8\x2e\x0f\xf1\xef\xc7\x95\x3a\x3c\xfc\xde\x1b\x96\x0e\x76" + "\xc9\x8f\xeb\xf5\x74\x6a\x7d\xe3\xc7\x47\xc2\xf2\xb5\x7c\x43\x5d" + "\xa3\x64\x77\x41\xbc\x92\xdd\x1f\x7b\x23\x71\x99\x4f\x21\x98\xf3" + "\x13\x42\xb8\xcc\xb7\x86\xa5\x43\xfb\x9c\x6f\x8f\x96\xd5\x32\x07" + "\xcb\x38\xcb\xeb\xfc\xf4\x18\x71\x7e\x2d\x2e\x2f\xb6\x8c\xcf\x77" + "\x84\x85\x6b\xe3\xa3\xf9\xfa\xdd\x29\xac\x9f\x7d\x7c\x77\x99\xe6" + "\x3f\x5d\xca\x24\xfb\x55\xd6\xee\x53\x82\x5c\xcf\x6f\x89\x86\xcb" + "\x77\xe0\x0c\xc2\x08\xc1\xdc\xa3\x6c\xbc\xf9\xdd\x61\x75\xf3\x79" + "\x68\x9e\xbe\x4e\xe4\x55\x73\x83\x3f\xee\x1c\x6a\xdc\xd1\xe7\x5a" + "\x30\x39\x92\x66\x0b\x66\x87\x68\xb6\x20\x2d\x04\x77\x41\x56\x58" + "\xba\xff\x8c\xef\xdc\xb0\x74\x45\xdf\x24\x9b\x4a\x56\x16\x54\x45" + "\x95\xd5\x14\x06\xe3\x48\x58\x59\x2d\x61\xe9\x3a\xf0\x7d\x72\x68" + "\xfe\x2c\xe8\x1c\x9a\x3f\x0f\x50\x6c\xfe\x3c\x60\x0d\x95\xfb\xc0" + "\xe4\x6f\x6e\x57\x0f\x64\x86\xe1\xd3\x88\xef\x9c\xc8\x76\xf4\x40" + "\x51\xd4\xf7\x20\xff\x05\x74\x47\xf3\xd6\xb4\x78\x0e\x2f\x9f\x44" + "\x16\xd5\xce\x1e\xa8\x0b\x8f\xff\xf0\x9a\x8a\x67\x1c\xe5\x1a\x1c" + "\xaf\x6f\xaa\x74\xad\xd1\xe9\x38\x4d\x58\xbc\x47\xc7\x7d\xf7\x10" + "\xbe\xbe\xf5\xfe\xcf\x1d\xe4\xfe\xef\x81\x80\x5a\xb7\x59\xd1\x29" + "\x5c\x9f\xe4\x0c\xd5\x97\xf5\xb9\x1e\x9c\x8b\x31\x83\x57\xd1\xe7" + "\x41\xc8\xff\x2a\x69\x9b\x88\xaa\x15\x9d\x90\xa7\x6b\x5d\xf4\xe0" + "\x1f\xf0\xee\xc7\xfb\x37\x91\xfd\xeb\x83\xb9\xc2\x65\x58\xde\xe8" + "\x8a\xee\x77\x1f\x2c\xc7\xd8\xe3\x5a\x62\xa0\x32\x27\x46\x5c\x95" + "\x70\xc5\x3d\x11\x23\x9c\x7d\xe9\x5f\xf3\xd0\x83\xe7\x18\xdf\xb0" + "\xf0\x56\xe1\x1a\xbd\x82\xd3\x7b\xb8\x3c\xe4\x19\x8a\x6f\xfa\xf9" + "\x1f\x25\x7b\x69\x09\x51\xf5\xf8\xba\x8b\xd2\x5e\x57\xf5\x48\xfb" + "\x2c\xb2\xec\xb4\xc9\xb1\xeb\x91\x36\x1f\xf5\xf8\x3a\x76\x3d\xd2" + "\xe4\xfd\xdb\xc2\x88\xba\x5c\x67\x77\xa4\x95\xa3\x2e\x5f\x4b\xba" + "\x47\x86\xef\xd5\xc7\xa9\xce\xaf\x31\xfe\x37\x92\xcc\xbb\xbc\x22" + "\xc4\x37\x2d\xdd\xb1\xc4\x3a\xca\x8e\x51\xe6\x29\xe1\x1a\xbe\xdc" + "\x43\x0f\x99\xf4\xfe\x4a\x0b\xef\x54\xb8\x80\x4e\x46\xa6\x13\xea" + "\x83\x7c\x43\xf1\x5b\x6f\x9f\x6a\x9d\xe9\x21\xb4\xff\x07\xbb\xf5" + "\x3e\x1d\xfd\xb9\x57\xa7\x23\xe2\xb2\xa3\xe2\xfc\x61\x71\xc5\x11" + "\x71\xdb\x07\xc3\x77\xeb\xe1\xdf\x8e\x4f\x0f\x1d\x8b\xe2\x13\xf8" + "\xf3\x70\x46\x64\xbd\x1f\x6a\x53\xf5\x03\x8f\xae\xa3\xf5\x43\x1e" + "\xf0\xa8\x3f\x36\x8f\x1e\x0a\xc4\x96\xb5\x87\xe5\xbd\x30\x22\x99" + "\x62\xc0\x7b\x98\xcf\x8c\xf5\x4b\x19\xd4\xf8\x74\x3d\x7f\x1e\x5e" + "\xa1\xf3\xe7\xdb\xd5\xf1\xe1\xba\xa8\x3a\x0e\x74\xd1\xc2\xb1\xaa" + "\xae\x0b\x0b\xa3\x60\x1f\x8d\x2d\x8b\x0f\x9f\x44\x3d\x07\x62\xd7" + "\xf3\xe1\xce\xa1\x65\x71\x21\xaf\x87\x0c\x5c\x2f\x8b\x0b\xad\x2a" + "\x0f\xc5\xca\x33\x5b\xb8\x62\x95\xb3\x30\x8b\xed\x22\x0f\x2d\xdc" + "\xcd\xeb\x74\x61\xe1\x05\x91\xf2\x87\x3a\x70\x3e\xa6\x5f\x40\x8d" + "\x63\x98\x0f\x5d\x36\x32\x7e\x93\x4c\xf6\xb9\x16\xb6\x45\xd1\xea" + "\x8b\x2e\x4a\xcf\xe8\x35\x1a\x17\x29\x7a\x65\x8c\x88\xc2\xc9\x13" + "\x9b\x5e\x0b\xfd\xa0\xd7\x17\xb1\xe9\x95\x9e\x32\x34\xbd\xd2\x99" + "\xff\x5f\x5c\x4f\xaf\xf4\xcc\x70\x7a\xf1\x9d\xab\x5c\xbf\x1f\x58" + "\x21\x1b\xfd\x6b\x45\xa3\xd2\xe5\x96\x44\xc8\x8a\xca\xd3\xc3\x79" + "\x2a\x12\xfd\x4a\x4e\x6c\x13\xc8\x7c\x99\xd2\x0b\xf4\xf6\x3f\xba" + "\x8e\x86\x8b\xfe\xd5\xbc\x57\x9b\xef\x70\xb0\xb8\x1d\x5f\xb4\xf2" + "\x5d\x8f\x3c\xdf\x18\x55\x6e\x6b\x6c\x5d\x90\x0e\x9b\x3f\xae\x26" + "\x46\xb8\x57\xcd\x99\x66\xd8\x23\x75\x44\x86\x39\x92\x47\xa0\x9b" + "\x51\x7a\x2b\x37\x7c\x9b\xe7\xc6\x3c\xcb\x70\x5c\xcf\xb3\x45\x37" + "\x6b\xfc\xfa\x3a\x12\xbf\x8c\xaa\xd8\xfc\xca\x38\x3c\x34\xbf\x32" + "\xda\x86\xe6\x57\x86\x87\xf9\xe5\xa1\x45\xd6\xc8\x7e\x23\xc3\x1f" + "\x59\x5f\x94\x8b\x7c\xc2\x38\x6c\x0c\x7f\x7f\xdb\x7a\xeb\x0f\xeb" + "\x38\xe6\x55\x23\xec\x2b\xe0\x3f\x89\x71\xfc\xae\x30\x86\x84\x0d" + "\x1a\x56\x6d\x1d\xf2\x5e\x90\x84\x76\x8c\x2b\x79\x7f\x9e\xbc\xa3" + "\x99\x16\x5d\x0a\x1a\x0d\xf3\xf0\xdb\xd8\x45\x99\x1f\x05\x8d\x71" + "\x95\xbc\x97\x4c\x9e\x9f\x93\xeb\x13\x8f\x98\xc2\x79\xc1\x7b\xca" + "\x78\x2e\x7a\xbf\x9a\xe7\xfc\x53\x17\x3d\xb2\x4f\xf1\x25\xf3\x9d" + "\x48\x3a\x3e\x62\x8f\xcd\x97\x47\xd2\xc0\x97\x3f\xc5\xe6\xcb\x23" + "\xb9\x43\xf3\xe5\x11\x07\xf8\xf2\xa7\xeb\xdb\xd1\x23\x55\x5a\x3b" + "\xda\xc5\x79\x6c\x1b\xd8\x5e\xcd\xe4\xef\x44\xfc\x46\x1b\x79\xe4" + "\x73\x8e\x9f\xd6\xa3\xb7\x23\x99\x87\xc7\xff\xb2\x7c\x2d\x4d\xab" + "\x06\x23\x1c\x6e\x77\x62\x4f\xac\x76\x92\x29\xf7\x0c\x4c\x2f\x21" + "\x33\x68\x98\x73\x88\x61\x94\x12\x5d\xa6\xcc\x95\x9c\x8e\xc3\xf9" + "\x8e\x85\xb0\xf4\xa9\x7a\x3a\x39\x2f\xaa\xd2\xda\xf9\x4e\x72\x4e" + "\x17\x05\x5b\xab\xff\x70\xd9\x8f\x70\x7a\x79\x07\x7a\x64\x9a\x4a" + "\xd5\x1e\x33\xdb\x22\xdb\x63\x66\x5d\xa4\x7c\x3e\xc2\xeb\x13\x89" + "\x41\xe8\x39\xc8\x72\xcf\x80\xcb\x30\xef\xcf\xd3\x36\x17\xa7\x44" + "\xb5\x4d\xc8\xc0\xe2\xbf\x55\x32\xb0\xf8\xad\x48\x5c\x17\x4f\x8d" + "\x2d\x03\x8b\xd3\x87\x96\x81\xc5\x79\x43\xcb\xc0\xe2\x0a\x96\x01" + "\x0f\x2d\x3e\x16\xd9\x36\x17\xd7\x46\xd6\x1d\xe5\xca\xb6\x49\x49" + "\xdf\xa5\x6d\xc2\x16\x1a\x33\x54\x3b\xd4\xec\x7f\x03\xdf\x93\xf6" + "\x1d\x68\xa6\xee\xfd\xa1\x47\x33\x79\x0d\x09\x3a\xbe\x88\x69\xd8" + "\x20\xc7\x68\x8f\xe6\x86\xd3\x71\xbf\x1a\x6b\x39\x91\xf6\x3c\xef" + "\xd9\x53\xf4\x7c\xec\x97\x91\xf5\x7f\xb4\x22\x36\x3d\x1f\xad\x05" + "\x3d\x9d\xb1\xe9\xf9\xe8\xd1\xa1\xe9\xf9\xe8\x29\x3e\xa3\x7d\x7d" + "\x9b\x7a\xb4\x93\xef\xc0\xd4\xfb\xa6\xcb\xf4\xd8\x82\x6f\xd7\x3f" + "\x3d\x36\x31\xb2\x7f\x7a\xcc\xf4\xdd\xfb\xa7\xc7\xf2\x62\xf7\x4f" + "\x8f\x39\x62\xf7\x4f\x8f\x55\xa9\xf6\xf0\xd8\xc9\xc8\xf6\xf0\xd8" + "\xe1\x48\x99\x00\xed\xfe\x6c\xfd\x53\x96\x35\xaa\x0d\x1c\xe8\xa2" + "\xac\x77\x60\x53\xbc\xaa\xf8\xb6\xe4\x99\x48\x1c\xb3\x66\xc7\xe6" + "\x5b\x56\x16\xf8\x76\x20\x36\xdf\xb2\x8a\x86\xe6\x5b\xd6\x6e\xf0" + "\xed\xc0\xf5\x7c\xcb\xaa\xff\xee\x36\x45\xd6\x99\x48\x9e\x65\xb5" + "\x7c\x77\x9e\x2d\x49\x89\xcd\xb3\x25\x53\x63\xf3\x6c\x49\xba\xe2" + "\xd9\x92\x8a\x48\x9e\x2d\xc9\x8d\xe4\x19\xe8\xf6\x67\xe3\xd9\x92" + "\x53\x51\x3c\xdb\xd8\x45\x4b\x97\x80\x67\x67\x14\xcf\x96\x25\x45" + "\xe1\xd8\x1d\x9b\x67\x4b\x31\x60\xa4\x8d\xb1\x79\xb6\x74\xe2\xd0" + "\x3c\x5b\x3a\x17\x3c\xdb\x78\x3d\xcf\x96\x66\x7f\x77\x9e\x2d\xdd" + "\x1d\xc9\xb3\xa5\xc5\xdf\x9d\x67\x4b\x4f\xc6\xe6\xd9\x52\x4f\x6c" + "\x9e\x2d\xf5\x2b\x9e\x2d\x4b\x8d\xe4\xd9\x32\x4b\x24\xcf\x40\xb7" + "\x7f\x27\xcf\xc0\x9f\x6e\xb5\x5f\x77\x59\x75\xaf\x9c\xd3\x5e\xb6" + "\xc7\x43\xd9\xd9\x6a\x4d\x20\x5b\xca\x8e\xc6\xc3\x0f\x91\xa6\xe2" + "\xfa\xbe\x7b\x59\xb3\x16\xf6\xe4\xf5\x7c\x58\xd6\x8a\x7e\xb5\xa7" + "\xad\x42\xee\xeb\x52\x3c\x64\x9a\x23\x9d\x9a\x23\x5b\xe6\xe1\xbc" + "\xe0\xb1\x70\xfb\x03\xc4\x7d\x31\xd2\xfb\x18\x0e\xfb\x13\x89\x84" + "\x95\x9d\xf0\x5d\xec\xb2\xa1\xf7\x98\xaf\xc0\x98\x66\x16\xe0\x3d" + "\x3e\x49\xc9\x6a\x76\xb4\xfd\xdb\x88\xb2\xae\x28\x39\x7d\x22\x6a" + "\xce\x24\x7b\x08\xfb\x37\x9b\xed\xdf\xc6\xd8\x72\x9a\x7d\x03\xfb" + "\x37\x9b\xed\xdf\xc6\xb0\xf1\x6a\xf2\x9a\x80\x27\x6a\xbc\xfa\xb8" + "\x29\xd1\xa7\x64\x47\xda\xb1\xd5\x2b\x30\x4e\x7f\x7c\x6a\x14\xce" + "\xe0\xcd\xe3\xbf\xd4\x70\x7e\x3f\x2a\x7f\x7a\x6c\x9c\x1f\xcf\x05" + "\xce\x1f\xc6\xc6\xf9\x71\xc7\xd0\x38\x3f\x5e\x0b\x9c\x3f\xbc\xbe" + "\x6d\x3d\x7e\x44\x93\x83\x18\xe3\xf2\xc7\x4f\xc6\xe6\xff\xe3\x51" + "\xfc\xa7\x9c\xf2\x0a\xe1\x95\xf9\x23\xd2\x3d\x61\x0e\x4f\xc7\x7b" + "\xf5\x39\x2d\xcb\x48\x8c\xb4\xb3\xa3\x61\x0e\x91\x2e\xf7\x3a\xd9" + "\xe3\xb3\x05\x31\x65\xef\x89\x3d\xaa\x3d\x3e\xe1\x89\x6c\x8f\x4f" + "\x34\x45\xb6\x47\xd0\x3a\x32\x5f\x6b\x64\x7c\x76\xd5\x9f\x4f\xc7" + "\x2e\x4f\x8d\x92\x81\x4f\xba\x68\xf9\xaf\x94\x0c\xac\x88\x8f\xc4" + "\x63\x79\x66\x6c\x19\x58\x9e\x87\xfa\x7f\x12\x5b\x06\x96\x57\x0c" + "\x2d\x03\xcb\xeb\x40\xcb\x4f\xc2\xe5\x76\x79\x45\xda\xf0\xa8\x34" + "\xc7\x63\xeb\xbc\xe5\x67\x63\xcf\xeb\x2c\xef\x51\x34\x5e\x31\x39" + "\x92\xc6\x2b\x4c\x91\x34\x44\x5d\xfe\xfd\x34\x1c\xf4\xeb\xd5\xe7" + "\x5a\x11\xdd\xfe\xdd\x28\x53\x6b\xff\x2b\x2f\x45\xe2\xb8\x42\x1b" + "\xff\xc4\x9a\xcb\x5a\x71\x04\xb4\x74\xc7\xa6\xe5\x8a\x93\xb1\xeb" + "\xbc\xc2\x83\x3e\xc8\x1d\xbc\xae\x2d\xad\xf0\x23\x7c\xb9\xbc\xbb" + "\xf1\x6b\xb2\x34\x20\x7c\x79\x80\xcc\xb2\xbf\x1a\xec\x97\x56\xf2" + "\xb9\x03\x21\xe7\x98\x21\xbf\x89\x13\x29\x9b\xfb\x20\xc6\x6b\x6d" + "\x45\xf4\x9a\xe8\x4a\x39\xff\xc1\xfb\x58\xf8\x5c\x4d\xa2\x83\xb2" + "\xdd\xbe\x00\xe9\xf2\xce\xe9\xa3\x60\x3b\xb8\x5d\x70\x7a\x3d\xad" + "\x9a\xeb\xac\x8c\xd2\x4d\x2b\x9b\x62\xf3\x78\x65\xcb\xd0\xb2\xb3" + "\xf2\xac\xe2\xf3\x2a\x73\x24\x9f\x57\xf6\x04\x5d\xa3\x57\x70\x5d" + "\x21\x03\xdf\xa9\x9d\xf0\xda\xe9\x90\xfa\x7e\xd7\xea\x8e\x92\x1d" + "\x74\xdb\x45\x5a\x55\x22\xcb\x33\x0a\x7f\xe2\x4e\x03\xb5\x49\x1d" + "\xb0\xea\x77\x12\x4f\xa4\x59\x1b\x20\xa3\xd8\xf5\x52\x07\xc7\x35" + "\xba\x84\x5f\xde\x4d\xe9\x12\x67\xd8\x1f\x0f\x64\x61\xcc\x05\x5a" + "\xf5\x7a\x44\x7e\x48\xa5\x5b\xc1\x68\x53\xf3\xfb\xab\x5a\xf5\x79" + "\xf8\xa1\xe6\xf7\x91\xa6\x53\xdf\xf7\xab\xd6\xc2\x56\x75\x0c\xd9" + "\x2f\x03\x27\x3e\x43\xce\x38\xdd\x58\x0f\x3c\x39\x57\x97\x5f\xb5" + "\x36\xf7\x64\x66\xe8\x6c\xcb\x93\x2b\x10\x37\xe4\x1e\xe9\xc8\x76" + "\xf0\x64\x65\x38\x1c\xe5\xdb\xee\xc9\x5a\xfd\x7c\x0a\x7e\x37\x7d" + "\x03\x2c\x1d\x9f\x93\x51\xf8\x80\x9f\x8f\x05\x34\x18\x9d\xdf\x00" + "\x23\xc5\xdd\x3c\x8f\xa6\x07\x29\xee\x22\x3d\x3d\xb3\x96\xf7\xe8" + "\xd4\x77\x53\x42\x80\x4c\x6a\x6c\x97\x73\x3f\x9f\x0d\xe1\xb1\xa1" + "\x3b\xf0\x60\x2b\xaf\xc1\xc9\x3d\x04\xd6\x07\x5b\x4f\x3b\x06\x34" + "\xdf\x63\x39\x8b\x99\xa6\xa7\x8b\xbe\x68\xad\x3f\x28\xba\x0f\x49" + "\x9f\x53\x39\x11\xe3\xbf\xbd\xbc\xff\x87\xf7\x61\xec\xa0\x07\x91" + "\xfe\xbc\x6a\xeb\x4f\x47\xd9\xa4\x39\x43\x8c\xff\x72\x78\xfc\xf7" + "\x60\xec\x76\x9e\x73\x83\xf1\x5f\x0e\x8f\xff\x1e\x0c\xef\x37\xd5" + "\x3a\x4f\x4e\x67\xb8\x4d\xca\x7e\xa1\x6c\xcf\xb3\x9d\xf9\xd4\x53" + "\xf7\xd4\x92\x25\xc0\x6b\xda\x68\x9b\xee\xee\x36\x6e\xaf\x96\xd3" + "\xde\x16\xf6\xc7\x60\xe6\x3b\xb5\x55\x5f\xc6\xed\xf5\x29\x39\x5f" + "\x98\x18\x50\x6d\xd1\xe9\x10\xde\xa9\x9d\x90\xa1\x8d\x45\x3a\xac" + "\x94\xed\x45\xea\xdc\xc7\xe8\x4e\x1a\xee\xee\x96\xfd\xa2\x81\xed" + "\x55\x69\xb7\x06\xae\x10\xc3\x3d\x51\x71\x9a\x18\x6e\x70\xb0\x9f" + "\x94\xb0\x77\x73\x1b\x67\x98\x0c\xbb\x1d\xe9\x18\x2e\xa7\xd3\xeb" + "\xa1\xce\xc6\x3c\x75\x24\xbc\xee\x72\xfe\x05\x65\x23\xfc\x73\x9e" + "\x57\x71\x73\x3e\xe7\x6a\x31\xbd\x93\xd7\xcc\xbe\x68\x15\xce\x97" + "\xc4\xf4\x52\x9e\x13\x7b\xfa\x7e\xce\xf7\xe1\x1f\x3d\xf1\xe5\x93" + "\xc8\xac\xc2\x9e\xf2\xb5\xd9\xfc\xe4\xa1\xa7\xe7\x46\xea\x88\xa7" + "\xa3\xec\xdf\x1c\x39\xce\xc4\x3b\x81\xf7\x27\x6a\xfb\x57\x59\x1f" + "\x08\x77\xa0\x4f\xca\xc7\x8d\xf6\x54\xf0\x9a\x34\xef\x89\x52\x7e" + "\xcf\x9e\xae\x8c\x9a\x7b\xf3\xee\x97\xfb\x6a\x7e\x8f\x72\x57\x8f" + "\x52\x32\x92\x3b\x2a\x92\xa7\x4f\x37\x39\x2f\xf1\x5a\x90\xea\x0f" + "\xd6\x04\xa2\xf5\xe3\xd3\xad\xba\xed\x16\x15\xde\xa1\xf7\x07\xb6" + "\x0d\x0c\x77\x75\x54\x3f\xf3\xb4\xb4\xff\x07\xae\xeb\x17\x56\xf3" + "\x39\xaa\x08\x99\x6c\x97\x32\xb4\xda\x7e\xda\x07\xb9\x29\x65\xf9" + "\x5f\xfd\x3e\xd2\xec\xe4\x33\x87\xf8\x1e\x7e\x99\x56\xe7\x0c\xb8" + "\xc8\x7c\xda\x2b\xcf\x54\x59\x20\x23\x52\x6e\xb9\xdf\x98\xa1\xf6" + "\x23\xf9\xa2\xca\x28\xd7\x69\xce\x69\xda\x4b\x7f\x4f\x6a\x3f\x05" + "\xcb\xc2\xea\x4c\xde\x9b\x31\xba\x87\x86\x33\x2c\x5d\x86\xdc\x81" + "\x0e\x6a\x0f\x44\x8f\x79\x56\x1f\x8f\x5d\xf7\xd5\xdc\xff\xd7\x78" + "\x28\x77\x6a\x24\x6f\x57\xcb\xfe\x5f\x5f\xd7\x01\xef\xfd\x91\xf9" + "\x72\x13\x22\x79\xff\x74\x13\xc7\x0f\xb9\xc7\xa7\x6a\x05\xef\xe3" + "\x5a\xeb\x93\xfb\xbd\x72\xd1\xfe\x9f\xce\xbd\x91\x1e\x14\x96\x15" + "\x3d\x41\xa4\xd5\xf6\x05\x43\x6f\xe5\x56\x45\xcc\x19\x8d\x93\x73" + "\x46\x6b\xbb\xe8\x19\x6d\xed\xe7\x99\x4f\xa3\xf0\x3b\x32\xb4\x6d" + "\x90\xcb\xeb\x3f\x6b\x63\xeb\x8c\xdc\xce\xd8\xb6\x41\x6e\x40\xd3" + "\x0b\x6b\x45\x52\xb4\x1c\x3c\x63\x05\x8f\x65\x1e\x7d\x0c\xcb\x73" + "\xa1\x43\x8f\x61\x9f\xc9\x1c\x1c\xc3\x96\xb2\x3e\x78\x26\x75\x70" + "\x0c\xeb\x8d\x35\x86\xf5\xc4\xe0\xe7\x33\x7b\x63\xf3\xf3\x99\xe6" + "\xd8\x63\xd8\x67\x8e\xab\x7e\xfe\x19\x6f\x24\x9f\x9f\x39\x1b\x5a" + "\x13\xce\x3d\xf2\xe7\xb3\x87\xd7\xa4\x5d\x6f\x0f\xaf\xf9\xb5\xe2" + "\xd5\x9a\x81\x48\xdc\xd6\xe4\xc4\xd6\xed\x6b\x4a\x86\xb6\x87\xd7" + "\xec\x1d\x5a\xb7\xaf\x39\x7c\xbd\x3d\x6c\x1b\x16\x95\xe6\xd4\xa0" + "\xad\x14\x61\x9b\xad\xe9\x54\x74\x5a\xcb\xf6\x5c\x5c\x58\xfa\x40" + "\xa4\xbc\x03\x67\xc0\x83\x6e\xbb\xc8\x3a\x4d\x97\x99\xa1\x68\xc2" + "\xbe\x99\x7e\x50\x4b\x23\xd0\x06\x3e\xe9\x73\xad\x1d\x94\x7f\xde" + "\xc7\xc7\xe5\xb0\x8e\x1c\x72\x3f\x9d\x51\xc7\x8f\xf1\x58\xbb\xfb" + "\x46\xeb\xa5\x71\x56\xca\x7e\xf3\x3a\x7a\xac\x95\xf6\x1f\xc3\xb8" + "\x31\xcf\xd6\xfa\xa2\xda\x98\x4f\xed\xc3\xcd\xfb\x8d\xe2\x5b\x5e" + "\xd4\x58\x36\xcf\x22\xcf\xf4\x0d\xa9\x6f\xf3\x52\x63\xcb\x68\x5e" + "\xe6\xa0\xbe\x2d\x95\x70\x77\x46\xc5\x17\x29\x1e\xe4\xb5\x06\x93" + "\xc2\xe7\xba\xf3\x2a\x23\x75\x52\x5e\x51\x54\xbe\xa8\xf1\x5f\x1e" + "\xeb\xc4\xa1\xf6\x38\x44\xf5\x37\x79\xde\xa1\xfb\x9b\xfc\xed\xaa" + "\xfe\xcf\x46\xad\x2f\xe7\x5b\x6e\xdc\xdf\xe4\x0f\x51\xff\xfc\xcc" + "\xc8\xfe\xe6\xd9\xa8\x35\xfa\xfc\xa2\xd8\xfd\x4d\x7e\xa5\xae\x67" + "\x94\xde\xc8\xff\x6f\xdf\x4e\xdf\xe4\xb7\x44\xea\x9b\xfc\xa6\x6f" + "\xd2\x37\x27\xae\xd3\x37\xf9\x81\xc4\xfa\x58\x75\x79\x36\x25\xb6" + "\xbe\x79\x76\xaa\xe2\xe1\xb3\xbb\x23\xf5\xcd\xb3\xe9\x91\x3c\xcc" + "\x8f\xe2\xe1\xb3\x51\xeb\xdf\xf9\x96\xff\x59\x9d\x14\x17\x17\x67" + "\x8c\x33\x18\x0d\x71\xc4\x97\x47\x19\x68\x78\x9c\x29\x2e\x1e\xcf" + "\x30\xed\x3d\xdc\x18\x67\x34\xe1\x89\xd7\xde\xc3\xa2\xbe\x87\x73" + "\x5e\x3c\x26\xed\x1d\x1f\xf5\x3d\xec\x1b\xe2\x87\x6b\xe5\xea\xe5" + "\x9b\xa2\xbe\xe3\xbf\x21\x7e\xd8\xbf\x33\x3f\x5d\xf7\x1d\x79\x0e" + "\x72\xf1\x86\x4d\xf9\xc5\xeb\x0a\xe4\xbe\xf6\x42\x5b\xfe\x73\xcf" + "\x15\x96\x95\xd9\xca\x37\xda\x1e\x7e\xe8\x89\x59\xf3\x6c\x6a\x7b" + "\x7c\xf1\x82\x29\x05\x23\x69\xc9\xe6\x52\x8e\x58\xb2\x7c\x71\x8e" + "\x2d\xfb\xe1\x87\x22\x23\x75\x30\x72\x1b\xfc\x8d\xa0\x84\xb5\xbd" + "\xb4\xd7\xc7\x11\xed\x1d\x27\xf5\x4e\x27\x9f\x3d\x57\xe3\x89\xa2" + "\x7f\x3e\xd5\x8c\xf1\xc4\x35\xa7\xe0\x73\x15\x17\xa8\xe0\x55\xae" + "\xc4\xb4\xa6\x4a\x2a\x79\x9e\xfd\xa9\x14\xbc\x2f\x3e\xf6\x92\xed" + "\x51\x32\x5e\xa0\xf5\xe7\xdb\x30\x8a\xe6\x6f\x77\x67\x80\x6c\x4e" + "\xb6\x6d\x8b\x76\x22\xce\x20\x1e\x08\x22\xcc\xa7\x9d\xcf\x7f\xa1" + "\x5a\x86\x7d\x5c\xa9\xa7\x4b\xec\xa2\xc2\x0c\xf1\xb1\x90\xdf\xec" + "\xb7\x46\xa5\x2b\xbc\x39\xe8\x7a\xae\x83\xf5\x42\x7d\x0d\x99\x1a" + "\x6a\x88\xde\x49\x26\xf3\x3b\xe3\xd8\xd7\x6c\x61\x82\xbe\x2f\xfb" + "\x75\x7c\x7b\x68\xbd\x87\xcb\xe6\xb4\x41\x63\x81\x51\xa6\x4f\x8e" + "\x48\x3f\x3f\xb4\x8f\xbb\x30\xc1\x88\x74\xcb\x3e\xa3\x44\x7f\xf2" + "\x63\x36\x77\x45\x25\x25\x0e\x88\x2f\xa7\x67\x92\xa1\x1d\x2d\x63" + "\x4b\x40\x04\x5a\x4b\x2f\x72\xf9\xaf\x27\x6e\x11\x5f\xba\x61\x37" + "\x2e\xe9\x71\x8a\xfd\x97\xc8\x84\x36\x6d\x68\x2d\xe5\xf3\x14\x85" + "\x25\x0d\x5f\x93\x09\x34\x98\x78\x91\x9e\x6f\xaa\x58\x22\x06\x9c" + "\x4b\xc8\xf4\x8f\x0e\x3e\xf3\xba\x6a\xde\xfe\xff\x42\xa6\xbf\xbc" + "\x56\x69\xbc\x26\xac\x54\x51\x2e\xba\x05\xfb\xa0\xf6\x09\x3f\xef" + "\xb9\x3d\x95\x37\xc0\x69\xee\xee\x73\x5a\xa9\xbd\xdc\x47\xdb\xcf" + "\x09\xff\x9e\xff\xa2\x7c\x56\x9c\xee\xf1\xf1\x19\x5a\xf3\xf6\x25" + "\x14\xd7\x95\x43\xc6\xd3\x45\x75\xe4\xce\xf5\x51\xc5\x39\xd1\x7d" + "\x2a\xef\x33\x6a\x2f\x3a\x4a\x6b\x3b\xc8\x78\xaa\xf3\x0f\x24\xfd" + "\x28\xd7\x7c\x9c\xb6\xe3\x0a\x59\xb7\xaf\xe3\xb0\x2b\xb4\x75\x3b" + "\x8d\xda\xfa\x29\x8f\x85\x3a\x50\xce\x25\x7a\xfa\x2c\x19\x00\xcf" + "\xb8\xed\x0f\x64\xdd\xf6\x14\x9f\x35\x4f\xa3\xfa\x1d\x64\x15\x4e" + "\x7b\xc2\x35\xa7\xdd\x72\x4d\xd8\x93\xfb\x9c\xf6\x94\xf6\x12\xa4" + "\xef\xfc\x35\x8d\xee\xa0\x94\x8f\x2f\x76\x18\xeb\xbe\xa2\x89\xb6" + "\xa5\xcc\xff\xe7\xeb\xeb\xbf\x42\xfa\x9a\x37\xbd\x41\xe4\x0d\xcf" + "\x13\x48\xaa\x35\xbb\x73\xfc\x14\x04\xac\xba\x6b\x34\xb1\xfe\x1a" + "\x59\x83\xd5\x6f\x7a\x99\x16\xfd\x35\xcb\x6d\xd0\x83\xc3\x3f\x7c" + "\xb6\xc5\xe4\x3e\xd5\x43\xa7\x7d\xd7\xa8\x9d\x7e\x4f\x6e\xc7\xbf" + "\xb6\xfe\xe5\xb3\x2d\xf1\xb0\x23\x0d\xad\x5b\x79\xef\xbb\x92\x19" + "\xe7\x69\xf6\x9f\x57\x49\x07\x76\x50\x42\xc9\x56\x1a\x7e\x11\xe1" + "\x52\xe7\x54\x2d\xb2\xbb\x03\xff\xda\xba\x55\x9e\x03\x5f\xef\xd9" + "\x71\x9a\xe2\xda\x7d\x75\x7c\xde\xd8\x38\x90\xfc\x71\x9a\xdb\x77" + "\x86\xdc\x25\x7f\x6a\x0d\x5a\x3e\xb6\xef\x0d\x92\xf9\x57\x57\xcf" + "\x18\xdd\xa6\xab\xe4\xce\xf1\xd1\x27\x28\x5b\xd4\x7c\x9c\x05\x5d" + "\x95\xd6\xee\xf3\xb3\xdf\x9d\x54\xd1\x6b\x1d\x79\xa0\x94\xa6\x36" + "\x7c\x45\x93\x0f\x7d\x45\x76\xd1\x67\x37\xf2\xd9\x6e\xf6\x97\x76" + "\x08\xef\x04\x8c\xbd\x50\x5f\x79\xc6\x5b\x24\x69\x67\xbc\xfb\xed" + "\xd4\x78\x2d\x74\xc6\xfb\x5a\x6f\xe8\x8c\x37\x64\xc9\xc2\xe7\xbc" + "\xd1\x2e\x4e\xb2\x3c\x1f\xb8\x4c\xa6\x5d\x97\x89\xa6\x57\x1a\xc9" + "\xf6\x2c\xfb\xfa\x28\x7a\xc5\x5d\x70\x49\xfe\xbe\x40\x45\x53\xf1" + "\x4e\xc0\x83\xf1\x5b\xd1\x24\xae\x5f\xa7\x26\xb7\x08\x33\x22\x6c" + "\x2c\xde\x71\x78\x8f\x72\xd6\x0b\x2f\xca\x60\x9f\x33\x23\x59\x7e" + "\xb5\xf3\xe4\xfe\x3e\x57\x91\xc9\x43\xd5\xc7\x75\x39\x56\xfa\xbc" + "\xd0\xf2\x49\xd7\x25\xf6\x6b\xee\x95\xf8\xf4\x17\x19\xd8\xc7\xb9" + "\x16\xce\x38\xac\xe7\x72\x51\x7e\x36\xde\x89\x78\xd0\x2e\x5f\xe8" + "\xd4\xf3\xf6\xf6\x17\x71\x99\x85\x08\x17\x7a\x38\xea\x6b\xe2\xb8" + "\xbf\xe9\xba\x64\x54\x69\xec\x46\xc0\xf4\x6b\xf0\xd1\xd6\x0b\x8e" + "\x71\x9b\xee\x35\x26\x8a\x13\x05\xb3\xa9\x7e\x9c\x38\x73\xe8\xa0" + "\x68\x53\x6d\xad\xe8\xb0\x87\xde\x94\xbe\xcc\xd1\x67\xb7\xed\x45" + "\xdc\x09\x1b\x11\xd3\xa5\x2d\x8f\xf7\x93\x16\x9d\xf4\xd0\x4d\x93" + "\xc3\xeb\x20\x5c\xcf\xb6\x70\xbf\xf9\x57\x3b\x5a\xe3\x85\xf1\xb9" + "\x96\x76\x4f\x0f\xfd\xe5\xb5\xee\x78\xe7\x3f\x90\xd1\x1d\xb8\x40" + "\x33\x52\xc8\xca\x73\x30\x8d\x07\x85\x07\xef\x6e\x3c\x3d\x90\x93" + "\x5b\x2f\xd2\xba\xb1\xf7\xa4\x50\xca\x3f\x39\x48\xd3\x47\xeb\xa6" + "\x85\xe9\xa3\xbf\x3d\xdd\xd9\x12\xa6\x8b\xd6\x17\x5e\xaf\x8b\x8a" + "\xf3\x95\x2e\x12\x01\xa5\x7b\x06\x3c\x5a\xf8\x92\xa8\x70\xed\xbc" + "\x4a\xf1\xcc\xa8\x70\xbf\x16\x7e\x6b\x54\xb8\x57\x85\xbf\xf4\x8c" + "\xae\xeb\xda\x19\x8f\xcd\xac\xeb\x5e\x7a\x88\x75\x5d\x7b\x81\xa6" + "\xeb\xe4\x59\xcc\x97\xa6\x88\x9f\x55\x12\xfb\xd1\xe9\xa2\x17\x07" + "\x18\x7f\xf1\x31\xe9\xb8\x8f\x40\xd8\xaf\x39\xac\xea\xf7\x64\xc2" + "\x23\xf5\x9c\x70\x15\xdc\xce\x7a\x8e\x75\x1c\x9f\x83\x79\x6f\x9c" + "\xe8\x78\xef\xa0\x38\x5b\x7f\x50\x9c\xea\x73\xbd\x38\x55\xd7\x77" + "\x3f\x45\xd8\x5e\x84\xfd\x14\xf1\xac\xf7\x98\x26\xa7\x73\x5a\xd8" + "\xaf\x68\x27\x64\x6c\x6e\xa2\x81\x4a\xf6\x43\xe6\xd9\xdf\xd5\x6e" + "\xd0\xd7\x5d\xee\x93\x67\x4e\xa4\x3f\x70\x63\x2a\x74\x54\x27\xb7" + "\xb7\x71\xbb\x82\x3c\x2f\xf1\x19\xed\xf0\x89\x8b\x7c\x36\x85\x71" + "\x58\xbb\xe5\x51\xf6\x6f\x6d\x68\x83\x75\xc4\x7e\x08\xf8\xec\x0c" + "\xf4\xae\xa9\x0a\x38\x29\xff\xbe\x2f\x1e\x83\xe5\x92\xa6\x78\xbd" + "\x5e\xfa\xcf\xbf\x40\xeb\xfc\xc2\x05\x5d\x88\xba\x25\x0e\x54\x12" + "\xfb\x62\x41\x1b\xe5\x79\xd6\xa2\xf7\xf0\x54\xe9\xfe\x58\xf8\x2e" + "\x05\xa4\x71\x77\xf8\x89\x71\xf6\xd0\x8b\xe9\xa7\x2b\x5a\x38\x7f" + "\x37\xd3\x46\xb8\x9c\x3a\x0c\x83\xf4\xe7\x82\x31\x3c\xfb\x73\x41" + "\xba\x0e\x65\xcf\x2c\xb7\x9d\xce\xf5\x12\xeb\x79\x77\x37\x60\x54" + "\x5c\x50\x30\x00\x4b\x40\xef\x47\xc4\x69\xf0\x47\x6d\x17\x5f\x02" + "\xfe\x31\xe6\x17\xfb\xe5\xe2\x7d\x49\xa0\x4b\x02\xfb\x66\x50\x76" + "\xe7\x8b\x0b\x1a\x7f\x4f\xa4\xf9\x16\x83\xbc\xbd\x38\x9f\x7d\x77" + "\xb1\x3f\x31\xe9\x4b\xcc\x38\x9b\xc4\x66\x7b\xc2\xa0\x3f\xb1\xff" + "\x00\x5f\x62\xa0\xbf\xb5\xc1\x28\x8e\x02\xff\xf9\xec\x4f\x0c\xf8" + "\xd7\xb3\x1c\x6a\x75\x4a\x7b\xeb\x69\x49\xf3\xdd\x1c\x76\xc0\x25" + "\x4e\xea\xfc\xe7\xfa\x72\x5d\x10\x57\xa4\xec\x41\x71\xc6\x43\xc5" + "\x69\x1c\x8f\xb0\x15\x9c\x7e\x06\xf4\x98\xbb\x60\x80\x3e\xec\x1a" + "\x30\x1e\xd8\x4a\x26\xa5\xd3\xd6\x3f\xc5\xf9\x95\x4e\x5b\x6f\x09" + "\xe9\xb4\xf5\xf1\x4a\xa7\x29\x1a\x2b\x9d\x56\xfc\xb5\xd2\x69\xc5" + "\x5f\xca\xfd\x43\xd0\x69\x1c\xc7\x7a\x4d\xd7\x69\x87\xc6\x89\x93" + "\xac\x3b\xfa\x5c\xc5\x1e\x5d\xb7\xed\x43\x18\xeb\x0e\xc6\x51\xe9" + "\xa9\x97\xe6\x8a\xff\x6e\x27\xb5\x3f\x93\x7f\x17\xb1\xbf\x8c\x6e" + "\xed\x37\xf7\x23\x8f\x2b\x1d\xb7\x7e\x76\x48\xc7\x15\xb7\x84\xf2" + "\xb2\x8e\x5b\xbf\x58\xe9\x38\x15\xde\xf8\x34\xeb\xb8\x97\xe6\x32" + "\x0d\x34\xf8\x46\x5e\x37\xd3\xd2\x33\x1d\xd3\xc2\x75\x5c\x64\xfb" + "\x5a\xbf\x57\xd7\x71\xac\xdb\xf0\x5d\xef\xa1\x91\x27\x65\x7b\x43" + "\xba\x5a\xd0\x5c\x6f\x77\xcc\x03\xae\x33\xfb\xc9\x67\xba\x2d\xbc" + "\x44\xc3\x35\x3f\x35\x5a\xbd\xd7\x77\xe8\x67\x32\x41\x7f\x4f\xb4" + "\xcd\x8c\xef\x41\x3b\x0d\xbc\xbe\x9d\x7d\x38\xba\x2b\x2f\x90\xbb" + "\x4e\x54\xb6\x07\xce\x51\x70\xd7\x4b\xe7\x99\xaf\x18\x5f\x0c\xe3" + "\x37\xeb\x9d\x8b\xb4\xe1\xe6\xb5\x3e\x39\x5f\x7f\xfe\x80\x11\x71" + "\x0e\xfa\x71\x58\x9c\x3c\x63\x1f\x96\x6f\x5a\x58\xdc\xe3\x1c\xc7" + "\x73\x8c\xf8\x4d\x43\xcd\x29\x7c\x07\x3c\xde\xbf\x01\x1e\xbf\xbe" + "\x01\x1e\xff\x4d\xe2\x01\x7b\x0b\xe3\xa3\xa4\xcb\xb4\x41\x3b\x1b" + "\x82\x27\x66\x39\x1b\x47\x68\xf1\x71\x61\xf1\x61\x65\x6d\xbc\x2b" + "\x46\xfe\xb0\xf2\x36\x2e\xfe\x06\xf8\xeb\xbe\x01\xfe\xeb\xdf\x00" + "\xff\x97\xac\xfb\xf8\xdc\xdf\x80\x2b\x32\xdd\xf4\x80\x6c\x7b\x27" + "\xd9\x77\x14\xd2\xfd\xb3\xb6\xde\x72\xde\x39\x49\x8e\xff\xa4\xbf" + "\xa0\xfd\x88\x97\x7e\x72\xa1\x97\xd3\xb7\x10\xa9\x3d\x7d\x7a\x9e" + "\x92\xf8\x68\xdc\x46\x07\x74\xdc\x64\xfc\x94\x68\xdc\x10\x3f\x2d" + "\x2c\x3e\x23\xc4\xf3\x8d\xad\x37\x98\x47\x4a\x70\xd7\x91\xbc\x3b" + "\xe6\x04\x86\x2d\x7c\xd6\xa7\x76\x70\x6d\xa4\x04\xf2\xbf\x5e\xae" + "\xed\x68\xe7\x8a\x7b\xa0\xd3\x6f\x67\x3f\xa0\x6c\xf3\x6a\x67\x41" + "\xc6\xa3\x1f\x49\x66\x3f\x31\x3c\x9f\xbe\x76\x20\xdb\x78\xa2\x82" + "\xdb\x4e\x49\x87\x9e\x77\xa8\xb9\x47\x2e\x57\x2b\x53\x9e\x93\xea" + "\x73\xbd\x9c\xa0\xe7\x61\xd8\x7c\x36\x08\xfa\xff\x76\xe9\x7f\x2d" + "\xd0\xc3\xfa\x76\x3c\xec\xe3\x64\x55\x4e\x1e\xa9\x72\x5e\x4e\xf3" + "\xd0\x06\xc7\x8d\xce\x61\x0d\x5d\xbf\x97\x2b\xbe\x7b\xfd\x48\xab" + "\xdf\xcb\x2d\xdf\x50\xbf\x1b\x95\xeb\xfb\xee\xe5\x5a\xb4\x72\x4b" + "\x53\xbf\x3b\x5d\x4b\x0b\xbe\x3d\x5d\x53\x35\xba\x96\xd6\x7d\x03" + "\x5d\x63\x95\x73\xea\xdb\x97\x63\xd3\xca\x29\xa3\x58\xe5\x90\xfc" + "\x1b\xd2\x9f\x90\x59\xbf\xbb\x85\xef\x31\x52\x77\x34\x94\x65\x86" + "\xdf\x51\xa5\xee\x37\x2a\xcb\xd5\xef\xa8\x0a\x9d\x33\x2b\xdb\xb2" + "\xb6\x89\xed\x10\x11\xf4\x50\x59\x05\xcf\x05\xa6\x6f\x57\xfe\x0b" + "\xb5\x3c\x55\xdf\x70\x37\x16\xfb\xf0\x49\xe5\xb2\x85\x90\xbe\x62" + "\x7c\xca\x0f\x60\xd9\x3f\xf3\x99\x41\xb5\xa7\x48\x3a\xfd\x62\x58" + "\x18\xc3\x96\x49\xff\xed\xec\x5b\xbe\xd7\xa9\xa5\x9f\xc0\x7d\xa8" + "\x9e\xa6\x9c\xf4\x34\x31\xe7\x24\x6b\x6a\x3c\xcd\x3b\x52\x23\xce" + "\x37\x66\x94\x96\x6e\x2c\x9d\x67\x2b\x5b\xff\xec\xb4\xb2\xf2\xfc" + "\xf2\x57\xca\xe4\x41\xf8\x91\x84\x00\x5b\xf9\xba\xf5\x85\x1b\x5f" + "\x29\xb7\x6f\xce\x5f\xa7\x0e\xce\xdf\x85\x84\xe1\x89\x28\xe2\x4e" + "\x13\x2b\x74\xd0\x19\x61\x94\x3e\x2e\x7a\xb8\x4e\xec\xeb\x44\x3f" + "\x17\xdc\x66\x25\xf2\x61\x7c\x04\x1c\x9b\x3d\xf4\xa4\x57\xa7\x23" + "\xfb\x5f\x84\x9d\x64\xbd\x48\xe5\xbf\x61\xde\x2f\x83\xc9\xdb\xa8" + "\xfc\x56\x48\xdf\x03\xee\x72\x04\xb4\x93\xb9\x75\x13\xcf\xf3\xbe" + "\x32\x37\xe8\x2a\xb7\x4b\x7f\x92\x5b\x79\xfc\xfd\xca\x33\xba\x5d" + "\xc2\xeb\x56\x6a\x9d\xf9\xf6\x07\x2f\x50\xf9\x3e\x2e\x97\xdb\x4d" + "\x03\xec\x5f\x86\x25\x5c\xe5\x69\x6c\x03\xe3\xdb\xdc\xe7\x7a\xc5" + "\xae\xdb\xbe\xc0\x37\x41\x24\xd5\xc0\xae\x79\x25\xf7\xb7\x16\x2f" + "\x69\x67\xc9\xcd\x0d\xea\xdc\xb8\x09\x69\x57\x0c\xa6\x75\xb1\x6f" + "\xe5\x9a\x33\x7c\xef\x59\x4c\xfa\x26\xe7\xf1\x3d\x09\xf1\xe1\x75" + "\xc6\x98\x1d\xfc\xd9\x34\x0a\x75\x4f\x61\x5e\x6b\xfe\x4e\x86\x01" + "\xf7\x2b\xca\xbf\x73\x1e\x21\x6c\x18\xde\x56\xe6\x29\xfb\x58\x40" + "\x1c\xef\xf5\x31\xb4\x57\x7c\xd1\x7a\xc2\x7a\x01\x72\xfd\x0a\xcf" + "\x5d\x4f\x56\xe7\xe2\xf2\xf8\x0e\x92\x78\x77\xe5\x35\x6a\xb3\x89" + "\x56\x9e\x03\xf4\xd0\xa6\xc9\x6d\x36\x1f\x89\xb8\xd5\xe7\x39\x1f" + "\xda\x85\xd5\xe9\x60\xdb\x07\xe1\xf2\xfc\xdf\x26\xab\x4e\xf3\x72" + "\x9b\xb8\xc4\x69\x86\x9a\xb7\xe6\x3e\xf8\x80\xec\x4b\xbe\x22\xde" + "\xe3\xd5\x49\x9b\xe6\x47\xeb\xfb\x29\x05\xf3\x6c\x05\xf9\xe5\xb6" + "\xe2\x75\x1b\x0a\x6d\x05\xeb\x0a\x6c\x1b\x36\x96\xdb\x5e\xd8\xc8" + "\x13\x48\x3c\x65\x14\x21\x13\x41\xae\xdf\xe6\x9c\x78\x7d\x8d\xbc" + "\x77\x73\xd1\x30\xd4\x1f\x34\xd9\xfc\x56\x6f\x5f\xd1\xf0\x48\x9a" + "\x6c\xd6\x7c\x71\x6d\xc2\xf8\xef\x95\x62\x75\xbe\x30\xae\x1b\xdf" + "\xa8\xff\xa6\xd4\xc8\xb6\xb7\xf9\x77\x5a\x5a\x9f\x9e\x56\xca\xc5" + "\x1d\x17\x07\xe3\x0e\x68\xf2\xd8\xa8\xce\x41\x4b\xbf\x3a\x8d\xf2" + "\x8c\xc0\x66\xfb\x90\x79\xd8\x97\xd8\x56\x7a\xee\x32\x6d\x4e\x12" + "\xae\x4d\xb9\x9a\x0c\x99\x83\x55\x79\x16\x4d\x7e\x20\x13\x9b\x8b" + "\xae\x97\x9f\xcd\x6d\x2c\x3f\xa2\x2f\xc7\x2c\xf7\x93\x04\xfc\xd0" + "\x53\xf8\x46\x7f\x0a\xdc\x4f\x71\x3d\x7c\x9b\x73\xcc\xce\x77\x64" + "\x7f\xfd\x39\xaf\xcd\x9e\xf0\x4b\x5f\x50\x23\x20\x1b\xe0\xd1\xe6" + "\xe3\x3a\x8f\xf4\xf4\xb1\xdb\xb0\x94\x97\x48\x19\x93\xf4\x74\x8c" + "\x95\x32\x06\xbb\x00\x38\x19\x75\xbb\x80\xfb\x00\x0f\x39\xa6\x96" + "\x6f\x17\xa2\xcf\xe5\xb0\x85\xc9\xc1\xe5\x58\x72\x00\xde\x3e\x57" + "\xbc\xf1\xb9\x97\xd0\xd0\x4b\x0b\xcb\x9f\x2b\x62\xdf\x19\xac\x07" + "\xa4\x63\x8e\x29\x05\xb6\x57\xca\x0a\x9f\x1b\x49\xb1\x52\x0d\x46" + "\x86\xf3\xdf\x12\x84\xbc\xf6\xf6\xe6\xc4\xf3\x19\x0e\x75\x66\x63" + "\xcb\x67\xbd\x65\x18\xf7\x44\xf0\x7d\xcb\x7f\x73\x5b\x53\x61\x27" + "\xa6\x92\xb4\xf9\x41\x33\xb5\x0f\x61\xeb\xad\x4c\x87\x5e\xa3\x01" + "\xfd\x81\xe3\x9c\x2e\x03\xf8\x0d\xd9\xde\x7c\x26\xb4\x07\x64\xeb" + "\xc4\x5e\x63\xfc\x39\xd6\x3f\x6a\xbf\xc9\x45\xe8\x81\xc4\xc6\x0b" + "\xb4\x25\x8d\x79\xda\x20\xfb\x93\x2d\x13\xf5\x3c\xfb\x07\xcf\x51" + "\x6f\xd9\xad\xcb\x49\x58\x9e\x51\x1c\xa6\xc6\xcf\x8e\xb9\xcc\x73" + "\xa1\x78\x6f\xd2\xd3\x81\xae\xa2\x51\xea\x91\x2d\x25\xd1\xba\xe1" + "\xb7\x16\x5e\x73\x57\xf8\x48\xf9\xb3\xac\xed\x96\x7e\x59\x60\xe3" + "\x01\xf6\x76\x6d\xff\xcb\x19\xd9\xa7\x3b\x00\xcb\xaf\x60\xa1\xac" + "\x35\x7a\x59\x22\x69\xad\xf4\x5f\x01\xf8\x67\x42\x73\x92\x5b\x2a" + "\x78\x6c\x2e\x7a\x73\x86\x81\x9f\xc7\xa5\x6c\xe1\x77\xf9\xcd\xca" + "\x47\x1c\xcb\x1b\xd7\x93\xe5\x2a\x24\x53\x5b\x2d\x3a\xbf\xb9\xce" + "\xc8\xd7\x66\x93\x7e\x84\xb7\xda\x75\x5a\x0e\xe5\xcb\x46\xb6\x5b" + "\x0b\x70\xe9\x53\x6d\x57\x8e\x2b\x95\xff\x22\x3e\x47\x13\x27\x92" + "\xf2\x2c\x5d\xb4\xed\x7e\x3e\x1b\x90\xe8\xe7\x71\x5a\x9e\x85\x7d" + "\x33\xa8\xb3\xee\x5b\xf7\x00\x7e\x45\xe8\xec\xfb\x56\xf4\xff\x8e" + "\x0a\xc5\xbb\xad\xcd\x61\x6d\xcf\xab\xed\x37\x18\xce\x34\x62\x7d" + "\xe6\x76\x64\xc8\xf6\xaa\xce\x15\x6f\x3d\xa3\xe7\x93\x7e\x0c\x02" + "\xaa\x4f\xbc\x4c\x5b\x79\x9e\xc7\xcb\xf8\x81\xd6\x25\x5c\x3e\xd7" + "\x8f\xfb\x5c\x29\x37\x56\xbe\x6b\x65\x5b\x42\x24\x0e\xdb\x26\xea" + "\xb0\x14\xec\x6d\x53\xf5\x6f\xf6\x6b\xe6\xa1\x8a\x96\xb6\x89\x68" + "\x53\x3e\x59\x87\x9b\xda\xd0\xa5\xb6\xf9\x64\xba\x15\x3a\x0d\x11" + "\x5e\x89\x6f\xd8\x3f\xe5\x45\x6a\xcd\xa9\xe6\x8c\xd2\x45\x15\xc7" + "\xd8\x67\x96\xd3\xc6\x7e\x0f\xe7\x2b\x7d\x23\x7d\xf5\xc8\xb8\x97" + "\xb5\x36\x3b\x82\xcf\x20\xc9\x7d\x37\xbe\x80\xd4\x0d\xca\xb7\x03" + "\xe2\xd1\x46\xfa\xd4\x7d\x4f\x23\x34\xdc\x4e\x0e\x96\x01\x99\x68" + "\x93\x6b\x9c\xdb\x5a\x94\xaf\x94\xe1\x67\x10\xdf\xad\xf3\x6f\xf7" + "\x41\x84\x01\x26\xf2\x99\xdb\xa4\x2f\xb2\x0a\x93\x8e\xaf\x16\x67" + "\x94\xf2\x20\x69\x50\x31\xd8\xfe\x7b\x93\x65\xda\x54\xbd\x1c\x99" + "\x16\xe9\x38\x3d\xdf\xf9\x89\xb8\xac\x41\x38\xca\x47\x8b\x99\xcb" + "\x69\x6b\x92\x71\x45\x21\x5d\xb5\x4d\xae\x19\xc9\x7d\x71\xa8\x87" + "\x77\x5b\xd1\x08\xc9\x03\x1b\xf1\x3d\x24\x26\x86\xa7\x64\xb1\xa2" + "\x5e\xcf\x13\x67\x60\x3a\x56\x1c\xd1\xcb\xd6\x61\x30\xfe\x37\xd4" + "\x79\xaa\x2e\x26\x6e\x23\x9c\x96\xe1\x4a\x99\x90\x77\x7c\x6d\x9f" + "\x23\x65\x50\xd6\x73\xbb\x39\x9c\xd7\xca\x16\xdb\x3e\x31\x4c\x1e" + "\x80\xcf\xf6\x41\xfe\x7b\x68\x7b\xae\xea\x4b\xb6\xa7\x85\xe1\x98" + "\x86\xef\xec\x10\x1f\x24\x8f\xf8\xde\xa7\x98\xf7\x28\xca\xb6\x82" + "\x34\x41\x21\xf1\x64\x7e\x60\x2c\x36\x97\xda\xa0\xf7\xb8\xad\x80" + "\x26\x8c\xe3\xa7\x2c\x57\x80\x7b\x38\x52\x36\xb7\xb7\x84\xe1\x6b" + "\x60\xbd\x8e\xb0\x53\x7a\x1a\xe0\x27\xf7\xb2\xe8\xf4\x44\x5c\xf7" + "\x20\x1f\x67\xc9\xb4\x7e\x1d\xcf\x6f\xe8\x33\x34\x5a\xed\x98\xa9" + "\xca\xd8\x91\xaa\x97\x81\xdf\xf3\xd1\x06\xae\xb3\x55\x9f\xdd\x52" + "\x5e\xa8\x9c\x27\x71\x27\x9f\xff\xdc\x4b\x85\x05\x53\x6d\xf9\xcf" + "\xb3\x9b\xa5\xb2\xe2\xc2\xc2\x12\xb9\x48\x14\x69\x07\xa6\xc8\xf2" + "\x40\x07\x65\xcb\x3a\x3f\x7a\x53\xed\x8f\xe1\x76\xc1\xed\xdd\xcb" + "\xed\xfd\x44\xc5\x57\x72\x6c\xe2\xae\x9c\x45\x6e\xbf\xa8\x64\xfb" + "\x5d\xea\x3e\xae\xbf\xd5\xa7\xfa\x01\xf0\x93\xfb\x48\xe0\xd6\x11" + "\x49\xaf\x1d\xdd\x91\x6d\x79\x87\x3f\xb6\x9e\xd8\xf1\x8e\xd4\x13" + "\x55\x4a\x2e\x58\x3f\xf1\xd9\x02\x86\xdb\xe7\x72\x4e\x8d\x84\xe9" + "\x9c\x1f\xd2\x51\xce\x4c\x5d\x47\xa9\x7e\xc2\x59\x8c\x3e\xa8\x4a" + "\x95\xe5\x2c\x08\xc9\x8d\xb3\x53\xc9\x8d\xd3\xe1\xa1\x9a\xb3\xfa" + "\x58\x45\xf5\x1d\x3b\x32\xd9\x7e\x64\x9d\x8e\xf8\x3a\x1d\x5e\x6d" + "\x32\xf7\x1b\xce\xc3\xd7\xdb\x0f\xce\x15\x6c\x3f\xf0\xbe\x47\xa6" + "\x05\x70\x35\xab\x76\xe3\x3c\x1b\xa6\x7f\x18\xef\xce\x58\xbc\x7e" + "\x96\xbb\xe3\x69\xbc\x9c\x37\xed\xb9\x0d\xe5\x0b\xd8\x05\x56\xa1" + "\xa3\xa4\xf0\xb9\xf2\xc2\x82\xe8\x75\x3c\xbb\x6e\x8b\xf1\x1a\x7a" + "\x2d\xda\xbd\x37\x89\xe9\x51\x89\xfa\xbb\x0a\xf4\x3a\x48\x3d\x05" + "\xdb\x51\xd3\x71\x09\x5d\xe4\x9a\xd9\x28\xf7\x01\x56\x16\xe8\x72" + "\xc2\xe9\x16\x3a\x44\x10\x61\xa8\xff\x8e\x12\x6d\xbc\x84\x31\x69" + "\xe5\x1e\xfd\x3b\x94\xbf\xf2\xb4\xec\xfb\x0e\xca\x3d\x83\xa0\xe9" + "\xce\xac\x30\x7b\x8b\xbf\x27\x6b\xdf\xd2\xcf\x13\xfb\x24\xeb\xa1" + "\xca\xf3\x8a\xbe\x95\xe0\xff\x76\x4d\x57\xb8\xd4\xbe\x9b\x83\x44" + "\x1f\xec\xf0\xc6\x37\xca\xf5\x84\x4a\xbf\x5e\x1e\xf2\x9f\x0b\x2f" + "\x93\xfb\xad\x68\x78\x1e\xaa\x94\x3e\xdc\x77\x49\x1f\x75\x3b\x67" + "\xc7\xc0\xb5\x25\x3c\x1d\xd2\xe4\x20\x8d\x49\xaf\xf3\x72\x87\x0c" + "\x2b\xbe\x41\x1d\x7b\xb4\x3a\xb2\xde\x94\xe5\xb3\xfc\x6b\x38\x9c" + "\xd2\xfc\x9e\x78\xf8\x8e\x44\xc6\x5f\xfa\x5f\xb3\x72\xbb\xde\xd9" + "\x8a\xfe\x6c\xb6\x5e\x0f\xae\xe3\xb1\x1d\x5e\x93\xee\xf7\x4a\xe5" + "\xdf\xf9\xf3\x28\xdc\x7c\x61\x79\xba\x5b\xef\xe0\xb5\x82\x9d\xfb" + "\x84\xcb\xc9\xe3\x18\xf6\x7b\x65\xae\x1d\x94\x43\x97\xed\x7a\xb9" + "\xdb\xb9\x97\xe5\x2e\x5c\x96\xd6\xcd\x7a\x0e\x92\x54\x56\x58\x3e" + "\x4f\x5a\xf7\x30\xec\xd8\xad\x5a\x7e\xf9\xba\x8d\x1b\xca\xa6\xda" + "\xca\x0a\xf2\xb5\x46\x1f\xd1\xe6\x5d\x72\xec\xee\xd3\xdb\x19\xca" + "\xda\x1b\xd2\x2d\xae\x90\xfc\xf3\x1e\x30\x79\x37\xb3\xeb\xbc\x6a" + "\x4f\xae\x63\x61\x6d\x57\xe6\xe7\x36\xda\x28\x6d\x36\x57\x78\xff" + "\xcf\x63\xe3\x11\x97\xc9\xb5\x5d\xa3\xa9\x4f\xd1\x78\xd7\x5d\xb2" + "\x9e\xd2\xdf\x97\x6b\x3e\xd7\x53\xfa\x97\x91\xf6\xd9\x2e\x8b\x5e" + "\xdf\xd0\xb8\x61\x97\x5d\xda\x51\x9a\xbd\x76\xa3\x71\x79\xc8\x3e" + "\xdd\xd5\xa6\xcd\xb9\x75\xe8\x63\x3c\xdd\xbe\x06\x2e\x05\xca\x56" + "\xdd\xb5\x7d\x59\x85\xe8\x5f\xeb\x60\x3f\x78\xcc\x83\x5d\xbf\xd4" + "\x6d\x4b\xb9\x3f\xb0\x7a\x2d\xda\xc5\xae\xa6\x70\x3d\x21\xe2\x5e" + "\xea\xd0\x6c\x44\xaf\x1a\xbb\xde\xf4\xf7\x17\x50\x16\x70\x33\xdf" + "\x00\x37\xae\x17\xf4\x5f\x6d\x33\xc3\x61\xfb\x5a\xf4\x5a\xb5\xfb" + "\x26\x77\x57\x4b\x7b\x17\xb0\xbd\xe0\x6d\x9f\x6b\x37\xec\xa3\x5d" + "\x52\x36\x82\x90\x51\xde\x1b\xe4\xd3\x6d\x24\xda\xbd\x80\xfb\x22" + "\xfc\x86\xdc\xee\xd6\xce\x24\xee\xae\xf2\x96\xd9\x61\xaf\x5b\x8d" + "\xbd\x65\x39\x26\x9e\x2f\x60\x5a\xb8\xeb\xfd\xa4\xe4\x67\x77\x1e" + "\xe4\xce\x12\x0e\x4f\x83\xc5\x34\x35\x31\x1e\xa2\xcc\x6a\x64\xf9" + "\x96\xf7\x13\xf6\xda\x61\x0b\xef\xb6\x8b\x32\xbb\x71\x08\xdf\x5e" + "\x37\xaa\x67\x02\xdf\xf1\xc8\x77\x73\xb2\xbe\x52\xf7\x07\xbc\x7a" + "\xe9\x4d\x35\x37\xa0\x97\xfb\xa5\x30\xbe\x2f\xfb\x95\xfd\xb2\x5f" + "\x11\xa4\xfc\xb1\xbf\x2a\x7d\xe5\x8f\x2e\x79\x5f\xde\xab\xaa\x9d" + "\xff\xf6\xb6\x95\x04\xe4\x5d\x79\xce\x72\xb6\xd3\x02\xbc\x4e\x25" + "\xcf\x37\x9f\x28\x0f\xd0\x72\x3f\xcb\xe4\xab\x69\xec\x8b\xde\x27" + "\xed\x85\x57\xb3\x74\xff\xf3\x7c\x6f\x24\xdf\x3b\x8a\x7a\xc5\x31" + "\xdf\x6d\x4e\xbe\x3b\xe0\x35\xbe\x97\x95\xd4\x78\xdc\x4a\xfb\x61" + "\xd3\x2b\x1e\xbc\xfa\x16\xdf\xe3\xaa\xc6\x0a\x17\xc0\x97\xb8\x7f" + "\xbd\x40\xaf\xfe\x4a\xad\x55\xeb\x7a\xe2\xb5\x29\xbc\xf7\xdd\xa3" + "\xc1\x40\x59\xe8\xff\x77\x29\x1f\xa1\xdc\x77\xf6\xe9\xfc\x7c\xf5" + "\xad\xeb\xe7\x37\x42\xf0\x3c\xf4\x6a\xad\x66\x17\x90\x9a\xbb\xfa" + "\x2d\x60\xbd\x66\xd2\xe7\xae\x42\xb6\xcf\x6b\x56\x7d\xee\x4a\xf9" + "\xb6\xde\x7d\x8e\xcb\x1f\x6a\x8e\x48\x38\x9f\x62\xb9\x37\xb3\x0d" + "\x37\xa4\x3d\x81\xfe\x9d\x71\xd7\xed\x42\xc5\x9f\xd7\xfe\x9a\xed" + "\xc3\xb6\x0a\x35\xae\xed\x55\x77\x4c\xc2\x06\x78\xed\xb8\xea\xcb" + "\x5e\x6b\xd2\xfb\x32\xe4\x3d\xa6\xe9\x0a\xad\x9f\x7b\x6d\x70\xfc" + "\x1b\x7b\xdf\xff\x6b\xe7\x74\x1a\xe9\x34\x57\x34\xfa\xc9\x9c\xde" + "\xe4\x95\xb9\x21\xda\xfe\x44\xae\x5d\x84\xc5\xaf\x0f\xa3\x3d\x7f" + "\x17\x2b\xbd\xf9\x13\xf4\xff\xbb\xeb\x55\x9f\xa2\xc2\x44\x72\xcd" + "\xbf\xf0\x9d\xb1\x8a\x06\xeb\xe4\xdc\x8c\xd7\x69\x07\x6e\x3f\xc9" + "\xf1\x18\x92\xb3\x95\x2e\xfb\x09\xfa\xbf\xd7\x56\x68\xf9\x24\xff" + "\xc3\xf1\x5d\xb9\xe1\xa5\x0d\x1b\x37\x6f\xe0\x09\xb5\x57\xca\x6c" + "\xcf\x6d\x2c\x28\x1c\x19\x63\x3e\xc4\xca\xf7\x45\xfb\x6a\x07\xfd" + "\x5a\xbd\x51\xc2\xfb\xf4\xd5\x9d\x08\x6f\xbc\x6c\xbb\x93\xe5\xeb" + "\x27\x9f\xf2\x5c\x81\xbc\x9b\x82\x7d\xb8\xaa\x79\x83\x6e\xce\xaf" + "\x68\xfd\xc6\x33\xbd\x9b\x8b\x34\x1b\xeb\x8d\x9b\x99\x8e\xda\x98" + "\x43\x74\xd1\x9e\xc7\xf5\x7e\x88\xf1\x93\xb6\x79\xbf\x5d\xea\xc5" + "\x60\x7f\x91\x49\xd2\xab\xdf\x8e\xfe\x66\x4f\xaa\xc7\x90\x34\x55" + "\xd5\x6b\xcf\x7c\x9d\x1e\x5c\x7f\xd8\xba\xe6\x3e\xb1\x0e\x32\xfa" + "\x46\x89\x06\x8b\xf5\x27\xc3\x36\xe9\xfb\xc4\xd9\x57\x69\xeb\x26" + "\xf6\x53\xfc\xfa\x82\x60\x35\xeb\x9b\x3d\x95\xba\x5e\xe2\xbe\x28" + "\x08\x38\x1f\x5e\xf5\xc6\xa3\xdd\x3c\x84\xbc\xe3\x2e\xd0\xeb\xa7" + "\xd4\x7d\x06\x7b\x8e\x44\xde\x67\xf0\xfa\x1e\x3c\xa7\xb4\xa7\x27" + "\xec\xf7\x8d\x1e\x3d\x4f\x4b\x58\x98\x39\x2a\x4d\x4f\x9f\xeb\xf5" + "\x94\x41\x7b\x45\xf9\x4b\xd5\xfc\x2b\xf3\xdd\x1c\xaf\x3f\xce\x3e" + "\x49\x43\xb2\xb1\xe7\x15\xcd\x06\xe9\x66\xda\x71\x7f\x8b\x34\x72" + "\x2f\x37\x68\xf2\x2f\x3c\x47\xcb\x75\x12\x7d\xeb\x20\x13\xaf\x17" + "\x87\xe4\x40\xd1\x08\x61\x95\x21\x3b\xe5\xf5\x15\x9c\x27\x9c\x0e" + "\x28\xe3\x21\x35\x36\x7d\xfd\xb0\xde\x67\xb3\x3f\x56\x75\xbf\xc5" + "\xeb\x29\xc7\x76\x74\x63\xcc\xff\x7a\x5b\x18\x8c\x14\x6d\x2e\xc2" + "\x24\x8c\x3f\x71\x34\xca\x31\xdb\xeb\x9d\xa1\x39\x81\xd7\x53\x58" + "\xef\x4a\x18\xc9\x35\x1e\xb7\x4f\xde\xcb\x6c\xd0\xef\x5e\xef\x73" + "\xbd\x61\xd1\x6d\x14\x1d\x56\x9b\x9a\x73\x92\x3e\x34\xd1\x06\xab" + "\x90\x66\xf6\xe0\x7c\x2c\xc2\x06\xc7\x80\x0e\xb4\x63\x69\x7b\xbf" + "\xb1\x22\x34\xd6\xfb\x89\xf4\xb1\x2b\xc7\x81\x0a\x0e\xc6\x59\x6f" + "\x64\x46\x8f\xdb\x60\x3f\xd8\xd6\x6d\x58\x07\xf3\xe1\x85\x92\x8d" + "\x0b\x30\x74\x78\xa1\x64\xdd\x02\xde\x52\xb6\x24\x7d\xb1\x7c\xa3" + "\x71\x2c\x88\x31\x7f\x3c\x78\xf7\x32\xcf\x19\x61\x9c\xcb\x73\xa7" + "\x7d\xea\xee\xd5\xe1\xda\xdb\xac\xbd\x87\xa1\xdf\xb3\x42\xee\xaf" + "\xf0\xdd\x3a\x1e\xfa\xa9\x59\xbb\xef\x56\xef\xb3\xa1\xcb\xdf\xb8" + "\xa4\xaf\x93\xc9\x3d\xf6\xec\x27\x91\xef\x56\xde\xf5\xd2\xf9\x3e" + "\xd7\x4f\x07\xe7\x3f\xd4\xfc\xa2\x5a\xf7\x42\x78\x9a\x1e\xae\xcf" + "\xc7\x22\x6c\x85\x3e\xf7\xaa\xd2\xfe\xb4\x20\x94\x37\x62\x6e\x3b" + "\x45\x5f\x5f\x43\x9a\x3d\x3a\xcd\x74\x38\x4e\x9b\xb8\xac\xd9\x49" + "\x71\xd2\xae\x76\xbd\x51\x21\x7d\x93\xb2\x2d\x2e\xe7\x99\x7f\x7a" + "\x5c\x2f\x87\xc7\x08\x8c\xb7\xb6\x76\x23\xdb\x3d\xfb\x20\x55\x3e" + "\x4c\x7f\x3a\xc8\xff\xc8\x35\x8e\xd8\xeb\x1b\xfd\x9b\x44\x5b\xe0" + "\xaa\x68\xd9\xff\x7b\xb4\xd9\xe7\x89\x02\x9b\xc4\xd1\xfe\xab\xe2" + "\x18\xd3\x7a\xff\xb3\x44\xfb\xfe\x48\x34\x10\xb7\xfa\xf3\x6b\xa0" + "\xfb\xd2\x2b\xc1\xcb\x7c\xbf\x5e\x23\xd2\x2d\xf5\x7d\x21\x1a\x90" + "\x67\x69\x89\xb8\xdc\x80\x74\x4b\x2e\x5d\x16\x87\x90\x76\x49\x11" + "\xea\xbd\x49\x04\x06\xe2\x5e\xfa\xdc\xb6\x8a\xf5\xd0\x5e\x87\xb7" + "\x3a\x37\x4b\xb8\x8c\x07\xc4\xae\x7b\xee\xee\x73\xed\xdd\x3d\x78" + "\xa7\x17\xe0\x32\x8d\x96\x39\xf8\xf7\x4b\x9f\xa3\x4e\x9f\xaf\x45" + "\x1f\x0a\x1e\x7c\x8e\x74\x18\xff\x97\x49\x7d\xe3\x8d\xbb\x3b\x19" + "\x8f\x3d\x96\xde\x07\xae\x6d\x03\x9b\x44\xcb\x81\x35\xc0\xff\x22" + "\xf0\xbf\x2a\x8e\xa2\x0e\xc7\xf6\x77\x11\x31\xfe\x03\x0c\x73\x80" + "\xe2\xd6\x6e\x31\x24\x35\x22\x7e\xad\xc3\x42\x8d\x48\xbb\xc6\x47" + "\x49\x0d\x48\xb3\xe6\xe5\x24\x92\xf8\xf7\x00\xef\xa4\xdc\xac\x01" + "\x94\xcd\xf8\xf7\xb9\xf6\x4d\xd5\xf1\xd4\xcb\x67\x7c\x75\x19\x5c" + "\xcb\xf3\x5d\xc9\x2b\xeb\x19\x6f\x35\x87\xbf\xaf\xd0\x5b\x56\x44" + "\xde\xb8\x7b\xee\xf6\xd0\xbe\x4a\x6e\x43\x5c\x1f\x2f\x64\x4a\x3b" + "\xf7\xf6\xb9\x4e\x03\x35\x9e\xdc\xb7\x57\xaf\x5f\x78\xbd\xb2\x37" + "\x96\xca\x79\xd4\xfc\xe7\xca\xd7\x6d\xca\xc7\xe8\x6c\x24\x95\x70" + "\x90\x1c\xbf\x15\x16\xd8\x36\x6e\xb0\x3d\x9f\xbf\xae\x78\xe3\xa6" + "\xc2\xd2\xa9\x72\xc8\x5d\x56\xb8\xa1\x80\xa7\x57\x4b\xf3\x4b\x4b" + "\x46\x46\xd9\xdc\x55\xb9\x59\xbc\x1f\x91\x75\x59\x17\x55\xed\xd3" + "\xe6\x16\xfd\xc2\x95\x26\xc7\x6e\xaa\x1d\xec\x7f\xc8\xb6\x35\x8d" + "\xe3\x77\xaa\xbe\xa6\x6a\xaf\xa8\x59\x79\x48\x08\x79\x27\xb4\xe1" + "\x32\x55\x6d\x91\xf5\xec\xcd\xd4\xe1\xc8\x3d\xfa\xd2\x66\xe5\xf0" + "\xfe\x4c\x0a\xed\x29\xaf\xda\x27\x8c\xa8\x23\x68\xa0\xec\xd6\x3c" + "\x9b\x76\xb6\xef\x3f\x5f\xa0\xaa\x42\xd4\x9b\xd7\x0e\x94\x5d\x28" + "\xcf\x20\x55\xad\xc4\x58\xdb\x26\x5c\xc3\x12\x98\x2e\xfb\xd5\xb8" + "\xd2\x98\x68\xe0\x7b\x62\x2f\xf0\x79\xc8\x54\x5e\x23\x6c\x74\x05" + "\x53\x43\x7b\x7a\xf6\xd5\xb1\x8d\x2b\xe7\xda\x65\xbb\xd8\x7f\x56" + "\x97\x77\x23\x9f\x31\xd9\x35\x61\x9e\xd2\xd5\xfb\xe5\xfa\x3f\xf8" + "\x36\x4f\xe1\x2f\xef\xa7\x46\xff\x74\xe0\x4b\xd4\xaf\x41\x38\x33" + "\x35\xbf\xf2\x07\xbe\x0c\x26\x9f\x29\x19\x28\xb3\x6a\x77\xba\xaf" + "\xfc\xbb\x60\xcd\xca\x5f\x0c\xa0\x5f\x0f\xc2\x56\x15\x35\x67\x7a" + "\x07\x6a\x56\x36\x05\x37\xdb\x8d\xac\xdf\x9d\x0e\xd0\x6f\x63\xd1" + "\x48\xf1\x45\xd1\x4d\x03\x9b\xed\xb0\x01\x56\x1e\x16\x02\x79\x93" + "\x57\xb6\xc8\xbb\x79\x6b\x56\xfe\x85\xf6\xfd\x7f\xf2\x77\x10\xb6" + "\x1a\xc2\x5a\xf1\xfd\xdb\xa0\x08\x4b\x1f\x99\xb6\x8d\xbf\x13\x0d" + "\x72\x0f\x21\xdf\x31\x3d\x9f\xeb\xae\xd7\x59\x8e\x11\x78\x9e\x62" + "\xb0\x6e\x07\x7a\xf4\x70\xb6\x5d\x95\x1d\x49\xcf\x81\xc6\xa4\x74" + "\xda\x60\xba\xdf\xe9\x34\x90\xb4\xad\x59\x59\xef\x01\xff\xe4\x3d" + "\xf5\xbb\x6e\xb9\x5b\x18\xf7\xfd\x25\xf7\x1d\xcb\x06\xe4\x5a\x16" + "\xa9\xb5\x8f\xaa\xc9\x3a\x3d\x79\xaf\x3c\xf7\x1f\xe0\x9b\x7d\xad" + "\x97\x46\xaa\xf6\x5b\x95\x1e\x36\x46\xe9\x11\x52\xde\x0f\x9c\x93" + "\xe5\x1a\xcd\xbb\xd4\xf7\xfe\x5a\xd5\xdf\x55\x95\xe8\x69\x11\xe6" + "\x50\x36\xe9\xfe\x74\x1e\xbb\xf1\xda\x16\xff\x6e\x18\xe2\x1c\xe7" + "\x8e\x7a\x21\x58\x17\xb2\x6e\xb6\x4d\x20\x6a\xf7\xb1\xdd\x5e\x75" + "\xea\x44\xbd\x8f\x24\xff\x92\x57\x1e\xea\x15\x45\x18\x6b\x15\xc5" + "\xb4\x53\x39\x4f\x17\x55\x9b\xa5\x0d\x0e\x79\x0e\x42\x9e\x91\xa7" + "\x81\xe5\x75\xc7\x15\xc6\xa3\x3a\xb3\xad\xa2\x9b\xfd\xcc\x43\x0e" + "\xab\x33\x99\x36\xdc\x37\xec\x77\xc9\x33\x7c\x52\x07\xb7\x6e\x9a" + "\xcd\x30\xe6\x8c\xf6\x93\xa9\x1d\x1a\x14\xf4\xe6\x3d\x5b\x49\x17" + "\x91\xde\x54\x4e\x66\x1e\x1f\x7d\xdb\x75\x64\x94\xb7\x5b\xd1\xa4" + "\x7a\xb7\x6e\x03\xe1\x77\x55\xe4\x59\xd5\x6a\x47\xf4\x5a\xda\xb3" + "\x1b\x37\x96\xaf\x2d\x2d\xe4\x97\x7d\xca\x2b\x77\x45\xf7\x89\x09" + "\xea\x5e\x9f\xea\xc3\xcc\x3f\xee\x27\xd4\x99\x8f\xea\xee\xb0\x71" + "\x2d\xcf\xad\x3d\xc8\xfd\x1b\xaf\x89\xf7\xb9\x6a\x4c\xbf\xa9\xd8" + "\x2e\xe5\xe4\xbc\x99\x8c\xd1\xe5\x3d\x9f\x5f\x9e\x5f\x3c\x4f\x2d" + "\xdf\x5e\x5f\x4e\x8d\x35\xb2\x9c\x9a\xec\xc1\x72\xd4\x18\xc4\x27" + "\xdb\x60\xf5\x19\x8f\x48\xfa\xa8\x52\xe9\xb9\x9a\x72\x7d\x4f\x56" + "\x6c\xdf\x18\xab\x52\x06\x6a\x6a\x53\x99\x5f\xce\xed\x64\xfc\x9b" + "\xad\x1d\x46\xb6\xbf\x76\xe0\x37\xef\x59\x91\xf3\x7c\xda\x9d\x7b" + "\x1f\x7f\xd5\x01\x3d\x5b\x73\x52\x54\xaf\x82\xcd\x56\x33\xe4\x3e" + "\x93\xf0\x73\xc5\x6a\x8d\xb2\xc6\x33\x54\x5a\x51\x95\x67\x57\x6d" + "\xe5\xcd\x39\x72\xad\x6c\x02\xfd\xe4\x02\xbd\x39\xd3\x64\xc5\x38" + "\x6e\x02\xfd\x27\xfc\x96\xe3\x05\x8e\x8b\xe0\xf5\xad\x3d\x4d\x26" + "\x48\x27\xa4\xd4\x20\xd4\x1f\x8c\x30\xf5\x17\x87\xc7\x28\x0c\x72" + "\x77\x7e\x1c\x28\x3c\x7c\x98\x89\x12\x47\x27\x98\x6f\xbf\x6d\xa2" + "\xf5\xc1\x07\xe6\xcf\x75\xee\xa8\x70\x88\x60\xc0\x9f\x28\xc2\xef" + "\x87\xfc\xc8\xbe\xf2\xae\x4a\xd5\x57\x54\x7f\x14\xb3\xaf\xdb\xe7" + "\x12\x25\x6c\x5b\x43\x5f\x65\x3b\x5f\x21\xe3\x87\xd7\x3c\x46\xb6" + "\xe5\xb8\xff\x71\x07\xfe\x80\x31\xc1\x9b\xbf\xf9\x04\x61\xa8\xbf" + "\x43\x54\x9d\xc9\x56\x67\x2f\x6a\x0d\xc1\x9a\x33\xd9\x21\xf8\x26" + "\x62\xf8\x18\x2f\x18\x9b\x77\x74\x1b\xdd\xa6\x07\xc8\x6d\xf3\xd1" + "\x27\xf8\x1d\x93\x96\x28\x93\xe7\xa6\x18\x06\xf4\xf0\x1e\xe7\xd7" + "\xd0\xcf\x0e\x39\x4f\x6c\xbc\x4c\xb5\xf7\x1f\x1d\x22\x9f\x5c\xeb" + "\x49\x5e\x1d\xec\x73\xd5\x82\xff\x8f\x4e\xd5\xec\x21\xd8\x6b\xb5" + "\xbb\x75\x9d\x80\xf8\x01\x35\x5f\x5d\x5b\xa7\xa7\x89\xc9\xa3\x37" + "\x78\x8f\xa7\x68\x65\xbe\x8a\xab\xdd\xdd\xec\x63\x6e\x88\x39\x81" + "\x74\xf4\xcf\x73\xb8\x1d\x8f\xda\x69\x19\x36\x7a\x67\xea\xfa\x53" + "\x68\x75\xa3\x7a\xc6\xd2\x68\xdf\x33\x8c\x33\xd5\x1f\x94\xfb\x8c" + "\xbb\x79\x9d\x2a\xd1\x90\xba\x2e\x71\x67\x6a\xfe\x80\x6b\xfe\xbd" + "\xdc\x4f\x26\x3a\x16\x1b\x12\x03\x0f\x19\x02\xae\xd9\xf7\x36\xaa" + "\x3b\x59\x7c\x55\xe3\x44\x07\xf2\x9c\x43\x1e\x0f\x9e\x4e\xe4\x3b" + "\xd5\x45\x6f\x3d\x85\xf7\xc9\x44\x83\x68\x4c\x04\x27\x67\x54\xca" + "\x3b\x2a\x59\x47\x9f\x12\xc9\xb0\x31\xfb\xe5\x5c\x40\x7c\x68\x2e" + "\xe0\xad\x0a\xf0\x6d\x58\xd6\xab\xe2\x13\xc0\x3a\x39\x70\x35\x78" + "\xb2\xe1\x32\x91\x36\xe7\x7d\x16\x6d\xf4\xec\xd4\x5a\xb2\x6a\x7b" + "\x45\x8d\xa7\x02\x27\x59\x17\xf3\xd9\xea\x36\x94\x79\x1c\x4f\x8b" + "\x6d\x03\xc5\x5d\xa6\xb7\x4e\xb3\xfd\x11\xb2\x61\xdf\xce\xd0\xc6" + "\x23\xad\xd3\x91\x7f\xfb\x7a\x96\x89\x6e\x63\x00\xf0\x61\xf3\x9f" + "\x74\x17\x9d\x94\x7b\x61\x78\x2f\x36\xa7\x41\x19\x76\xb7\xff\x24" + "\x05\x85\xd5\x88\xef\x16\xde\x5b\x28\x90\xb6\xdd\xd1\x41\xed\x25" + "\x7e\xe8\xd8\x53\xb0\x81\xed\x93\x81\x8f\x84\x87\xf8\xb3\x1f\x82" + "\xbf\x36\xd8\x7b\x80\x77\x86\xf7\xd6\xf0\x19\x65\x51\x66\xbf\x13" + "\xf9\xd1\x67\x59\x8d\x0c\xff\x32\x1d\xfc\x54\xf4\xda\xed\x33\x7a" + "\xd4\x9d\x8d\x17\xe8\xe0\x11\xe0\x79\x5f\x18\x9e\x73\x80\xbf\x09" + "\x7a\xb5\x15\x30\x8f\x8b\x4d\x28\xb3\x13\x65\x62\x3c\x02\xf9\x9d" + "\x8c\xf1\xae\x89\x71\x6e\x67\x7c\x1d\x03\xbc\xff\xd5\x74\xe0\x2b" + "\x32\xa1\x2d\xb4\x36\xe2\x8d\xfa\x1f\x83\x4d\x36\xb1\xcf\x75\xb0" + "\x55\x3f\xe7\xce\xb6\x04\xbe\xcf\xe8\xb2\xb4\x0f\x69\x80\x63\x0b" + "\xf0\x3a\x3e\xaa\x87\x78\x8c\x13\x0f\x39\x8d\x47\xb9\xc3\xc1\xab" + "\x16\xd0\xee\xaf\x41\xeb\xe3\x5c\xa7\xe0\xd5\x60\x77\x10\xf0\x0e" + "\x5c\x05\x4e\x65\x56\x53\x42\x27\xdf\x69\xdd\x27\x40\xef\xb3\xcb" + "\x1c\x7d\x82\xf7\xc9\xa2\xce\x4c\xef\x7d\xa8\xab\xc9\x43\x6f\x17" + "\xf3\x78\xa3\x8b\x0e\x96\xab\x3b\x27\x0f\x3a\xb4\x35\xad\xb3\x6a" + "\x9e\xe9\xad\xd3\x4c\x7b\xae\x57\xc2\x4e\xcb\x6b\xee\x6e\x2f\x25" + "\x74\x8e\x45\xff\xf6\x96\xb7\x3e\xc8\x36\xca\xdb\x83\xf3\xff\x43" + "\xb4\x31\xbf\x1b\xfa\x25\x78\x55\x74\xb3\xed\xa9\xf6\xbb\xbc\x7d" + "\x64\xad\x23\x2e\x0d\x76\xa6\x11\x78\xf2\x59\x8d\x71\xe8\xa7\x1f" + "\xe4\xfd\x4c\xc0\x0f\xe3\x8e\xb7\x4f\xdd\xe8\xae\x57\xd0\xc7\x8a" + "\x34\x5e\xe0\x2e\xef\xf4\xe3\xbb\x30\xd5\x5c\x4f\x9d\x49\xf7\x37" + "\x20\xae\x8a\x8a\x03\x3b\x64\xb9\x95\xbb\x37\xc9\x32\xf8\xfe\xcf" + "\xee\x72\x9b\x38\xdf\x66\xf3\x0e\x79\xa6\x3b\x6c\x1f\x8f\x57\xbb" + "\x53\x4c\xae\x69\x46\xee\xe3\xa9\x2b\x0e\x1b\x37\xf2\xba\x66\x25" + "\xaf\xdd\x2a\xbf\x30\x75\x72\x2f\xe6\x32\x87\xf2\x7f\xe1\xf6\xf7" + "\x68\xb6\x65\xdd\x47\xf2\x9e\x21\xb6\x6b\xe4\xde\x9f\x8b\xda\x7e" + "\x9d\xba\xc7\xb9\x8c\xb6\xa8\xbb\x8c\x0b\x37\xe4\x3f\x5b\x5c\xa8" + "\xa6\x52\xa6\xbd\x58\x9e\xff\x42\xa4\xfd\x6b\x92\xe3\x62\x57\x5d" + "\x9b\x9a\x9b\xac\x0b\x84\xd9\x89\xa6\xc1\xb9\x25\x23\x1d\x53\xf3" + "\x4b\xef\x4c\x8c\x35\xbf\xb4\xf8\x85\x0d\x1b\x4b\x65\x19\x72\x6b" + "\x53\xa1\x3a\xfd\x34\x92\x56\xa6\x2f\x4e\x9f\x56\x56\x58\x2e\x2f" + "\x0f\x51\x93\x39\xf9\x05\x05\xa5\xda\xc6\xa7\x75\x9c\x8b\x63\x9e" + "\xdf\x2c\xb3\x96\xbc\x54\xae\xb6\x4c\x95\x15\xe7\x6f\x2a\xd4\x40" + "\x84\xe3\x3a\x91\xf5\x65\x5b\xbd\x1c\x33\x8f\x54\xeb\xb4\xef\x1c" + "\x09\x5b\xd7\x09\x1f\x47\xde\x8c\xb8\x93\x7a\x5c\xc9\x1d\x2c\x2b" + "\xef\x4e\x6b\x6f\x92\x3e\x1b\x4c\x27\x7e\xc6\xf4\x7d\x97\xd7\x89" + "\xe3\xb9\xcf\x0e\x1a\xdf\xb1\x37\x68\x67\x99\xfa\x5c\xef\x52\x68" + "\x6e\xe0\xd0\x71\x6d\xef\x43\x27\x97\xc7\x65\x23\xde\x16\xb6\x1f" + "\xa0\xd3\x43\xef\x74\x33\x0c\x5e\xb7\x96\xf7\x4b\xc0\x26\xd2\xce" + "\xb2\x1b\xdb\x7f\xc6\x7d\x4b\xfd\x54\xd6\xa3\xc1\xaa\xbc\x34\xd5" + "\x0e\xde\xcb\x17\x35\xab\xc5\x0c\x1f\xa5\x28\x3d\xf0\xee\xaf\x10" + "\x3e\xe6\x32\xbd\xbb\x47\xd4\xe4\x12\x74\x49\x3c\xdb\x23\x6a\xfe" + "\xfb\xdd\x5f\x69\x73\x05\x5c\xe7\xf8\x30\x1c\x9a\x43\xf3\x09\x87" + "\x8e\x7b\x93\xf2\xd2\x76\xab\xf5\x7e\xb9\xb6\xa9\xd6\x97\xdf\x1d" + "\xac\x3f\xfa\xef\x34\x6d\x3d\x2f\xa5\x0b\xe9\x31\x9e\x48\xd3\xd6" + "\xd8\xb8\xee\x69\x5c\x6f\xb5\x4f\xeb\xdd\x40\xb8\x5d\xab\xfc\xf9" + "\xaf\x16\x6c\x0b\xab\x71\xc0\x7b\x77\x49\xdb\x85\xe7\x2e\xae\x31" + "\x0d\xdf\x5b\x80\x78\xf4\x5f\xef\xcd\xf6\x50\x5d\x47\x38\xcd\xca" + "\x1d\xe8\xe0\x91\x8f\xfb\x33\xe0\x34\x1c\x69\x72\x42\x38\xbf\x27" + "\xfd\x44\xf0\x58\x41\xd9\x15\xef\x5d\x92\xf7\x8f\xf9\x50\x3f\x6d" + "\xcf\x00\xd3\x5c\xdd\x47\xf0\x5e\x95\x9e\x2f\x98\x9c\x97\xca\x63" + "\x94\xfd\x6a\xfd\x0b\xb4\x7b\xef\x9f\xe3\x0c\xe7\xe5\x1a\xe8\x0c" + "\x3f\x35\x21\x6c\x18\xc2\x7e\xc7\xe9\x18\x0f\x39\x57\x01\xfc\xb9" + "\xbc\x20\xec\xe0\x38\xeb\xb0\x05\x80\xe7\x81\x9e\x99\x1c\xe2\xdf" + "\x7b\x87\x43\xf3\x43\xef\xac\x51\xf3\x43\xf5\x26\x9d\x0e\x7c\x8f" + "\x90\xd6\x16\xe2\xf5\xf5\x72\xc4\x4f\x0e\xa7\xbf\xd4\x73\x1a\x3d" + "\x85\xeb\x9d\xb2\xd0\xb8\xab\x3e\x6b\x70\xad\x08\x78\x84\x74\x7d" + "\xfd\xcb\x4c\x47\xc6\xbb\x64\x2b\xcf\x25\x1f\x6a\x96\xf5\x50\xeb" + "\x31\xbf\x05\x8f\xde\x12\xb0\x0b\xb8\x8f\xe4\x31\x00\xf3\x97\xd3" + "\xaa\x3b\x86\x0e\x2d\x69\x50\x73\x9e\x07\xf1\xfb\xf1\xa0\x31\x96" + "\x7c\xd4\xb7\x85\xef\x0f\x54\x34\x3e\x94\x10\x64\x98\xa0\x1f\xc3" + "\x42\xbf\x31\xb8\xef\x59\xc1\xad\x1f\x00\xcc\xb7\xbb\x42\xf5\xc1" + "\x38\x4f\xa3\x23\xf3\x51\xd2\xe5\x10\xda\x7f\x9d\x9c\xb7\x71\x36" + "\x89\x4b\x1b\x01\x43\xdd\xfd\x79\x68\xbe\x60\xde\x68\xe9\xbd\x3c" + "\x76\x02\xee\xea\xec\x16\xe4\x0d\xe3\x0f\xc6\x33\x58\x93\x37\x97" + "\x71\xe7\x75\x80\xd0\x78\xf8\x10\xef\xdd\x48\xf5\x6e\x53\x79\x0e" + "\xa8\x75\x0a\xf0\xb6\xfe\x97\x62\x73\x11\x69\xf3\xe3\xd0\xc7\xf5" + "\x29\x2c\xdb\x0c\xc7\x27\xc7\x45\x87\xf6\x04\x41\x17\xf0\x94\xf1" + "\x3a\xa6\xf3\x14\xe9\x4a\x6e\xb0\xb7\x1a\x3c\x39\xe4\xd1\x7d\xbf" + "\x70\x9f\x82\x76\x5a\xa9\x6c\xc0\x86\xf7\x13\x77\x3e\x28\x12\x03" + "\xf7\xde\xcb\x36\x4d\xa3\x51\x8e\x55\xf4\xfd\x6f\xb7\x83\x4e\x5f" + "\xe8\x7b\x81\x83\xbb\x56\x77\xf0\xde\x41\xb7\x5f\xed\x1d\xe4\xf0" + "\xa5\x3e\x11\x6c\xf7\x0d\xf0\xfe\xfc\x8e\x3e\x57\x43\xba\x3e\x7e" + "\x61\xbd\x14\xb7\xd3\x00\x1c\x1b\x20\xff\x6f\x1e\xd1\xf4\xd1\xf0" + "\x8b\xd4\xb0\x53\x83\x1f\x86\xc3\xa1\x80\x1a\xff\x35\x34\xa9\x71" + "\x50\xc3\x5e\xe8\x97\xdd\x6a\x1c\xd4\x50\xa7\xe3\x8d\xf8\x82\xe8" + "\x3a\x66\x2f\x5c\x5c\x68\x2b\x66\xd5\x9a\x3a\xcb\x61\xb3\x4f\x29" + "\x98\x21\x37\x9b\xda\x16\x2d\x9c\x67\xcb\x5e\x30\xc5\x51\x34\x75" + "\xa9\x7a\x2d\xcc\xce\xe2\x77\xd4\xda\xa3\x0d\xf0\xfd\x91\xe3\xac" + "\x66\x0d\x87\x46\x8b\xc7\x30\x55\x9e\xb9\x10\x96\x55\xd9\x7c\xbf" + "\x3a\xfa\xc2\x1e\xb6\x6f\x97\x0d\xfc\x49\x88\xea\xf4\x3a\x91\xb4" + "\x2a\xdb\x9b\xf4\x91\xdd\x9b\xd4\xe2\xf5\x26\xe5\x4e\xe6\xfb\xd7" + "\x13\x77\x0a\x7f\x62\x60\xb8\xd2\x87\xf8\x86\x2d\xd1\x0d\x7b\x85" + "\x79\x49\x19\x77\x39\xc5\xb2\x01\xe1\x86\xdd\x02\xba\x34\x96\xe8" + "\xfd\xaf\x9c\x3b\xaa\x5a\x95\xbd\xcc\x21\xfa\x59\x76\xd0\xaf\x63" + "\x9c\x84\x32\xe3\x78\xae\xab\x11\xf5\xaf\xb5\x29\x5a\x34\x42\xff" + "\x1d\x3a\xa9\xd1\x37\x1b\xdf\x7c\xff\x8d\x5a\xcb\x73\x59\xa5\x8e" + "\x0f\xee\xba\xfb\x09\x51\xdd\xe2\xd5\x61\x02\x56\x82\x76\x16\x46" + "\xc2\xa3\x1b\x9c\xa5\x0e\x7f\x82\x35\x4f\x66\xf1\x9c\x03\x9f\x5f" + "\x4c\x74\x18\xf8\x7e\xa0\x9c\xc1\x79\x16\xc4\x8d\xde\x69\xe1\xb9" + "\x97\x9c\xd1\x3e\x43\x25\xa7\x09\xcd\x47\x04\x3d\x07\x8c\x41\x3f" + "\xec\x00\x8b\xba\x0b\xbd\x47\x5b\x8f\x6d\xca\x1b\x9c\xdf\x8f\xe0" + "\x7d\x93\x94\x87\xaf\x5c\x26\xc8\x76\x43\xf7\x1d\x29\xca\xe6\x09" + "\xba\x0c\xa4\xce\xb2\x37\xad\x94\xed\x52\x93\x47\xd0\xd7\xcb\x6b" + "\x6f\x89\x01\xe1\xe5\x7d\xea\xc1\x38\xc8\x24\x5d\x24\x77\x45\x5f" + "\x25\xdf\x41\x3e\x28\x97\x25\x90\xcb\x12\xc8\x25\xaf\x93\xa2\x7c" + "\x6f\xdc\xdd\x79\x68\xb3\x86\x8b\xd4\x34\x99\xf1\x67\xda\xc0\xee" + "\x4e\x08\x82\x56\x72\x3f\x1c\xd3\x27\x39\xe7\x14\x9f\x8b\xe2\xba" + "\x26\x06\x50\xe7\xf0\x7a\x19\x83\x9e\xfd\x2e\xd4\xcb\x88\x7a\x39" + "\x2e\xc9\xf1\x3e\x9f\x57\x83\x2e\x19\x17\xba\x63\xe2\xfd\xf4\xf0" + "\x3a\x06\xf9\x5e\x1a\x59\x87\xf7\x0b\x63\xd5\x51\x18\xb9\x8e\x4c" + "\x83\xf7\xef\xd7\xd6\x49\x24\x9e\xac\xb7\x7a\xa8\xc9\x3f\x7a\x27" + "\x9f\x13\x5b\x95\x0d\x7b\x75\x21\xf3\xb0\xc1\x25\xaa\x18\xcf\x58" + "\xfc\x62\x78\x0a\xd6\xcf\x4c\x89\x3b\x2b\xf3\x80\xcb\x99\xd8\xf4" + "\x7e\xff\xcb\x1b\xd3\xfb\xfd\xdf\x71\x7e\xc6\x83\xcf\xcd\x25\xb2" + "\x03\x24\xc8\x37\xc6\x58\x7b\x62\x95\x3b\x7a\x67\x13\xe3\x15\x33" + "\x0e\xb2\xdf\x73\xa0\x34\xb2\x4d\x04\x1b\xfc\xc4\xf4\x6b\x44\xb8" + "\x9a\x4b\xfd\x99\x63\x70\xce\xb7\x6a\x95\x23\xd1\x60\x8b\xe3\x36" + "\x26\x6d\x59\xd4\x37\x16\xdc\x44\x43\x15\xfb\x50\x5b\x08\x5d\x15" + "\x33\x1e\xed\xc0\x26\x76\xdd\x73\x07\xe0\xcd\x1f\xbd\xd3\x20\xbc" + "\x71\xf7\x8c\x1c\xed\x0b\x4c\x66\xba\x02\x57\x07\xda\xf8\x3e\xd9" + "\x3f\xcb\x39\x88\x9f\xa1\xfd\x7f\x98\x27\xe7\x72\x93\x56\xcd\x57" + "\xfb\x0a\x3e\x48\xf0\xd0\xdf\x79\x42\x7b\x84\x3e\x98\xe8\x31\x8c" + "\x68\x53\x6d\xf5\x96\x77\xd1\xa7\x9d\x0b\xba\x12\x85\x6d\x6b\xa2" + "\xe8\xa2\x0f\xfe\x36\x28\xec\x46\xf4\x5b\xe7\x42\xb2\xa3\xce\xd5" + "\xe9\xb2\x83\xfc\xb9\xb1\xe5\xe2\x83\xed\x37\x96\x8b\x0f\x1e\xd7" + "\xe6\xe8\xf2\xd4\xde\xbd\x0f\x9a\xf5\xb1\x82\xd8\x75\xcb\xbb\xb6" + "\x1d\xb2\xfc\xb9\xaa\x6c\xd0\x24\x90\xc6\x7a\x26\x0b\x74\xab\x44" + "\xda\x33\xba\x6e\x60\x19\x4a\x1c\xe0\x71\x0c\x49\x39\x47\x5c\x0f" + "\x74\x8f\xba\x23\xbb\x26\xf7\x14\xdb\x98\x41\x57\xc3\x11\xf4\x5f" + "\xef\xf1\xde\x75\x5f\xd2\xaa\xe3\x7d\xae\x66\x8b\x87\xba\x76\x6b" + "\xfa\xef\x18\x60\xb4\xc8\xbd\x20\xea\x3c\x68\x02\xb7\x73\xbe\xc7" + "\x8c\xdb\x3a\xc2\x52\x80\x37\xef\x73\x85\x6d\xdf\x9c\xa9\xf7\xfd" + "\x41\x57\x1a\xd3\x5b\xda\x19\x46\xb6\x63\x41\xbb\xb7\x8c\xc1\xc3" + "\x57\x67\x58\x89\xeb\x7c\x75\xd7\x84\xc3\x3f\x99\x4e\xa6\xff\xcb" + "\xfa\x2c\x95\xcc\xa2\x94\x9d\xf7\x99\xe8\xdf\xe6\x92\x91\xe9\xe0" + "\xa1\xe6\x1c\x45\xbb\xe6\x3a\x9d\x3f\x1e\xfa\x40\xea\x51\x9e\x3b" + "\x5f\x16\x10\xbd\x6a\x2d\xa0\xb9\xc5\x43\xd5\xda\x9a\x57\xa3\x29" + "\x46\xff\x90\x61\x5b\x57\x66\x2b\xd8\xb8\x79\xc3\xa4\x49\x23\x63" + "\x8c\x01\x9a\x4f\xa9\x31\xc0\xcf\x29\x7c\x0c\x80\x6f\xd4\xbf\xc1" + "\x13\x6d\xf3\x67\xad\xd5\xdc\x1f\xac\x4d\xa5\xd0\xef\x99\x94\x35" + "\x33\xec\xf3\x5e\xca\x9a\x75\xef\xda\x27\x0a\xf3\x0b\xb6\x84\x85" + "\xce\x09\x9f\x9f\x3b\xf0\x2e\xca\x8e\x9b\xf0\x30\xf4\x87\x61\xe9" + "\x36\xee\x77\x7e\x7e\x65\x47\x40\xfc\x2b\x64\x77\x2e\xfb\x1c\x3a" + "\x5d\x1e\xa0\xd3\xd0\x6f\xe2\x16\xd6\xeb\xc3\x95\xdf\x4d\x8c\xff" + "\x21\x5b\x89\xa8\xbb\x17\x63\xb1\x2b\x6a\xef\xf6\x2f\x6e\x6e\xaf" + "\xf3\x43\x4f\xe4\x4e\x55\xf6\xce\xcf\xcf\x22\x3c\x09\xef\x01\xb5" + "\xff\xe4\x17\x06\x8c\x73\xd3\xa4\x8f\x85\x4d\xec\x63\xe1\xe7\xb2" + "\x0f\x98\xee\xab\x24\xe5\xeb\xeb\xe7\x7b\xd9\x07\xb7\x87\x7e\x31" + "\x9f\xed\x0b\x4e\x8b\xb0\x4f\x6d\x2f\x52\x2a\xbf\xd9\xe6\xf5\x00" + "\xa6\xa8\xce\x9d\x2a\xde\xcb\xe1\x35\xf9\xc9\x80\x79\x3f\xdb\x6d" + "\x71\xd6\xe1\x7d\x7d\xae\x5f\xcc\xd5\x6d\x10\xde\x27\x3a\x94\xfd" + "\xa1\xf7\x83\xa3\xa1\xbf\x47\xfb\x12\xc5\x5a\xf6\x59\x62\xa0\xc9" + "\xdc\x3f\x24\x3a\xb2\xe5\xd9\x22\xee\x17\x59\x27\x34\x48\x5d\xfa" + "\x8b\x2a\x5d\x2f\xec\x57\xe3\xc8\x91\x9c\xff\x7f\x90\xf7\xc6\x71" + "\x51\x55\xe9\xff\xf8\x99\x01\x91\x8c\x9c\x81\x45\x1b\x8d\x72\x6c" + "\xb1\xcf\xb4\x4b\x45\xe5\xee\xba\xbd\x6c\x63\xd5\x8a\x4a\xd3\x5a" + "\x33\x32\x14\x30\x68\xd1\x50\x27\x44\x1c\x15\x01\xc9\xf8\xe2\xae" + "\xe2\x68\xe8\x97\x12\x95\x3e\x5f\xb7\xb5\xd2\xa2\xcf\xba\xbb\xd8" + "\x9a\x4d\x89\xad\x25\x32\xd4\x5a\x1f\x6a\xb1\x26\x42\x22\x96\x6c" + "\x14\x90\x11\x66\xee\xf9\xbe\x9f\x73\xee\x65\x66\x10\x34\x76\xfb" + "\x7e\xfa\xfc\x7e\x9f\x3f\xe0\xce\x3d\xf7\xdc\x73\xcf\x79\xce\x39" + "\xef\xf3\x3c\xcf\x79\xce\xf3\x60\xfd\xfc\x46\xae\x9f\x2f\x54\x69" + "\x73\x01\xbf\x0f\x6a\x63\x35\xe8\x7c\xca\x92\x9c\x8c\xec\x8c\x74" + "\xf3\x84\x65\x23\x58\x40\x84\xc8\xcc\x8c\x25\xe6\xec\x8c\x27\x97" + "\x67\x2c\x13\x02\x1a\x3d\x0d\xde\x1b\x01\x06\xf9\xe3\xf5\x8a\x33" + "\x32\xbf\x1f\x4f\x32\xac\x61\xed\x78\xa1\x07\x97\xfb\x17\xf5\x99" + "\x4a\xe9\x15\x09\x52\x8f\xd8\x06\xba\xee\x91\xfe\xa8\xed\xc9\x31" + "\xc4\xc7\xb5\xb0\x3d\x3f\x91\x7b\xed\xbf\x5f\x2c\x69\x15\x5e\xd0" + "\x5d\xf4\xfb\x74\x3f\xbf\xb6\x47\xd8\xff\x49\x9b\xb7\xdf\xe7\x81" + "\xc6\xc9\x7e\x1e\x64\xcf\x29\xc2\x41\x81\x87\x97\xc0\x42\x95\x77" + "\xc6\x77\xf6\x5c\xcf\x73\x79\xf3\xa6\x1e\x26\xf4\x78\xe4\xbb\x5d" + "\xe2\xeb\xef\x1b\x34\x3a\x82\x7f\x69\x26\x7d\x81\x26\x03\xcd\xf4" + "\x9e\xe7\xf9\x2b\x99\x9e\x74\x06\x3c\x2a\x39\xfe\x95\x6c\xb7\x9e" + "\x17\xbd\x70\x14\xbc\x4c\x0c\xe5\xd9\xa9\xda\x7e\xf1\xc8\x64\xcc" + "\xeb\x3d\x66\xbf\x7c\xb8\xa7\x59\xf0\xf1\x3d\x34\x6e\x7e\x5f\x93" + "\x42\x6b\x84\xc4\xee\xcb\x2f\x55\x5f\x3e\x42\xea\xca\x25\xbe\xed" + "\x49\x55\xdb\xd0\x4e\x98\xa5\xda\x0e\xea\xe5\xb8\xde\xd3\x8c\x31" + "\x17\x43\x7d\x01\x9c\x2f\xd1\xe8\x45\xed\x15\x72\xe7\x1a\xa6\x07" + "\x76\xc5\xbf\xba\xca\xa3\x97\xb1\x15\x5f\x38\x21\x65\x98\x3d\x47" + "\x03\xf7\x7c\xa4\x2c\xb5\xa7\xd1\xef\xd7\xe0\xf7\x17\x9c\x49\x59" + "\xba\x84\x8e\xa3\x3c\x91\xb2\x22\xed\x89\x8c\x94\xe5\xd6\x38\xf3" + "\xf2\x25\x62\x4b\x4d\x88\xef\x39\xcb\x1f\x7b\xc2\x4c\x28\x92\x32" + "\x6d\xfa\xf4\x94\x29\x0f\xfd\xea\x91\x11\x6c\x4a\x1a\xd2\x72\x96" + "\x9a\xa7\xc7\xc7\xc9\x47\x0f\xde\x39\x75\x4e\xca\xd4\x99\x0f\xdd" + "\x3f\x7b\x00\x9b\xd6\x08\x8c\x09\x13\xfa\x68\x58\x13\x7b\x79\xa2" + "\xb4\x61\x78\xd1\x1a\x6c\xc3\xf0\x22\xd6\xcf\x17\x77\xe3\xcf\xc1" + "\xd8\xcb\x90\x66\x5e\x9e\x88\x3f\x8b\x3a\x6e\x7a\xbb\x8b\x5e\xac" + "\xf0\x8f\x9b\x97\x85\x7f\x5d\x92\xf9\xa5\xce\xf4\x45\xe0\xdf\x0b" + "\x9d\x81\xcf\xfc\x58\xf0\xd2\xef\x04\x5e\xaa\xe3\x82\xc6\x43\x8a" + "\x37\x5c\x8c\x0d\xc9\xaf\xbc\xd8\xa9\x8d\x0d\x71\x4e\x0e\xe9\xa4" + "\xeb\xa2\xe7\x18\xdf\xb3\x49\x2f\x8c\xb1\x60\xa2\xfd\x4c\x4a\xe7" + "\x91\xf5\xb3\xd5\x72\xe3\x48\x4f\x4c\xfc\xac\xba\xef\x31\xb2\x8d" + "\xbd\xb4\x90\x17\xed\x71\x4b\x59\xf0\xc5\xf1\x62\xdc\x3c\x35\x76" + "\x8a\xd8\x3f\x12\xe7\x11\x5e\x4a\xf5\x8f\x9f\x97\x27\x52\xdf\x10" + "\x2e\x48\xec\x7d\x29\xaf\x9f\xfe\x25\x04\x69\x76\xcd\x0f\x76\xce" + "\x78\xa6\x0f\x1d\x6f\x67\x65\x7a\x5e\xe8\x62\x2f\x25\x48\x3b\xb6" + "\x97\xaa\x34\xfe\x19\xbf\x31\xff\xbf\x48\xe8\xaf\xb7\x2a\x0d\xd0" + "\x5b\xe5\x5b\xf9\xe7\x75\x56\x37\xf1\xc8\x0e\xa7\x5b\xf8\x5f\xbc" + "\xa3\xce\xda\x49\x3e\xfb\x46\xb4\xb0\x97\x87\x15\xf8\x78\x0f\x7e" + "\x8f\x45\xdb\xc4\x1a\x72\x93\xd4\x1b\x40\x1e\x7b\xf9\x27\x52\x36" + "\x91\xe9\x44\x77\x17\x7b\x71\x2f\xc9\x66\xd4\x3f\xf8\x6d\x0f\x31" + "\x5d\x76\xdb\x40\xb8\x37\x72\xad\x5e\xf5\x73\xf3\xf2\x7a\x92\x51" + "\x89\x56\xcf\xe8\x95\xcc\x67\x8a\xf0\x87\x2b\x61\x9f\x9f\xbf\xe4" + "\x1e\x49\xdb\x97\x4b\x6a\x6c\xed\xb4\x6e\x7a\x06\xb5\x2f\xcc\xe5" + "\x8d\x5a\x7f\xce\xf4\xb9\xef\xa0\xfe\xea\x2e\x7a\xd9\xa1\xf5\x65" + "\xc7\x8d\x19\x55\x21\x6b\x99\xf9\x70\xc5\x2d\x94\x8e\xf9\xff\x72" + "\x82\x6a\x3f\xd9\xd9\xff\x5d\xe0\x70\x82\x7c\x7f\x2f\xd3\xde\xef" + "\xef\x3f\x55\x1c\xf0\x23\xe5\xd4\x6d\x42\x85\x65\x51\xc3\xdd\x06" + "\x9d\xd5\xa1\x33\x98\x35\x72\x4c\x6a\xba\x33\xa3\x6c\xcf\xde\xf3" + "\xca\x16\xc8\xdf\x5b\x7e\x75\x8b\xaa\x07\xc0\xdc\xde\xbb\xe3\x46" + "\xc6\xb2\x3a\x57\x24\xf5\xe9\x49\x48\xbf\x40\x3e\xd1\x50\x8f\x92" + "\x00\xdd\x56\x9f\x8d\x97\x8b\xed\xf5\x90\xcd\x09\xca\x99\x48\xe5" + "\xd0\xbc\x92\xba\x99\xbd\xd5\xe4\x43\x07\xe5\x2d\x11\x7b\x97\x45" + "\x7b\xc5\x59\x2b\x92\xb5\x85\x9c\x9f\xc7\xbf\x54\x6d\x20\x04\xef" + "\x22\xcf\xf3\xec\x6d\xef\xd3\xf7\x88\xb3\x2d\x7b\x33\xc9\xae\xb3" + "\xbb\x68\x5f\xe8\x40\x7a\x3e\xe0\x43\x66\xda\x92\xf4\xa5\x8f\x3f" + "\x7e\x69\x68\x08\xb4\xb5\xb4\x17\x29\x25\x28\x13\xf2\x6f\x59\x92" + "\x1c\xa7\xfb\x80\xff\xbf\x91\xbc\x2e\x78\x18\xcc\x9b\xab\xdb\xd8" + "\x3e\x87\xc6\xbf\xcb\x79\xb4\xaf\x96\x17\xed\x33\xfa\xe7\xc6\xbe" + "\xf2\x0b\xe7\xc6\xbe\xbd\x03\xcf\x8d\x7d\xf5\x58\x67\x1b\xf1\xbc" + "\x16\xdf\x94\x3c\x18\xf5\xb7\xe4\xc1\x1d\x06\xef\x1d\x82\x07\x4f" + "\x59\xc9\x74\xc4\x7f\x93\x4e\x99\xd6\x03\x1f\xe4\x5a\x1f\x30\x22" + "\xc5\xcb\x8c\xb4\x16\x6c\x5a\x42\xfa\xc2\x71\xdc\x7b\x8e\xbb\x52" + "\x56\x02\x2f\x70\x5f\xda\x26\xf7\x59\xe7\x77\x41\x0e\xc1\xef\x4d" + "\x2d\x84\x15\x0a\x39\x6b\x67\x72\xbd\x7e\x25\x41\xe3\x71\x0d\x6b" + "\xcd\xc2\x87\xaf\x58\xb7\x31\xce\x68\xdd\x4e\xf1\x19\x1c\x72\xdd" + "\x7e\x25\xf3\xa2\xba\xe9\xc8\x03\xc6\x81\xd2\x51\xc7\x1a\xaa\x17" + "\xea\x59\x85\x7a\xed\xa7\xfa\x94\x3e\x4e\xed\x0a\xb9\xd5\xe0\x8d" + "\x17\x7b\x03\x54\xcf\xf9\x9d\xec\x56\xaa\xdf\xfc\x27\x6f\x65\x3b" + "\x1f\xa7\xfd\x5d\x69\xd7\xa3\x8e\xa5\x50\x8c\x99\xe1\x2d\xec\xd5" + "\x98\x4e\x11\x53\xf1\x15\xf4\x7d\xb8\xe4\xeb\xd5\xbd\x13\xca\x43" + "\xcf\xe4\x38\x7d\x35\xe6\xb0\x8d\xea\xfc\x6a\x8c\x96\x2f\xb0\x6e" + "\x53\xd3\xac\x60\x2c\x17\x3e\xfe\x78\x46\xf6\x32\x2d\x3e\xb4\x65" + "\x69\x56\xfa\xed\xea\x79\xd7\x25\x19\x2b\x52\x16\xa6\x0b\x7b\x7a" + "\xa4\xca\x9f\xfd\x78\x8d\x38\x92\x05\x84\x8d\xaa\xe0\x33\xfe\x70" + "\x7e\xa7\xca\x73\x34\xb1\xaa\x12\xb9\xff\x5c\xf5\x4b\xb9\x0e\x5c" + "\xfe\x24\xea\xb1\x5b\x5b\x07\x48\x1f\xd1\xc1\xc6\x5b\x68\x5f\x88" + "\xce\x30\xd3\xfe\x13\xe9\x24\x90\xe7\xa8\x8b\xbd\x92\xa3\x8d\xed" + "\x8d\x48\xa7\x73\x13\x8e\x25\x64\x6b\xb7\x7f\x8c\xb2\x79\x4e\x1c" + "\x8f\x9a\xe2\x02\x06\x44\xd0\xda\x40\xfb\x21\xd2\x1f\x7f\x55\x34" + "\x61\x1b\xe9\xcd\x1c\x4b\xc8\x76\xed\xd5\x66\xac\xe5\xe0\x81\xf7" + "\xc7\x40\x2e\x8a\x5b\xb7\x8a\x85\xd3\x37\xb0\x6e\xb8\xa4\x9e\xb5" + "\x2a\xfe\xad\x3c\xc6\xd4\xb5\xc3\xb5\x51\xe8\x14\x5f\x95\x3e\x13" + "\xed\x73\x12\x54\x9d\x43\x02\xf2\x61\xfc\x5f\xc1\x64\x9d\xa7\x86" + "\x8b\x7d\x2f\x81\x0b\x55\x79\x7c\xcb\xd4\x72\x61\x5f\xb8\x65\x6a" + "\xb8\xc2\x33\x43\xe8\x1e\xb8\x3c\x02\xe5\xec\xe6\x05\x16\xa6\xda" + "\x24\x86\xb4\xb0\xd7\x86\xe1\x1a\x8a\xfe\x28\x23\x5a\xa0\xfc\xe9" + "\x6a\xf9\xd3\x51\x3e\xd6\xbf\xab\xec\x72\x7e\x55\xd5\x68\xdf\xc2" + "\xd8\x26\x9d\x4c\x34\xad\x5f\xa8\x7f\x2c\xfe\x2c\x52\x3f\xe3\x81" + "\x9c\x34\xae\x4f\x3f\x23\x79\xa4\x2a\xaf\x36\x26\xe9\xdb\x6a\x1b" + "\x12\xc9\xe7\x0b\xe9\x13\xd4\x6f\x25\x92\xae\x40\x2b\x93\xa3\x4c" + "\x7e\xae\xbd\x12\x6b\x4d\x38\xe6\x98\x7b\xe4\x5a\xac\x29\xf4\x0d" + "\xe2\x71\x3b\xc7\x71\xac\x39\xbe\x14\x5f\xa8\x3c\x6f\xbe\x92\x5d" + "\x11\xc8\xdf\x76\x17\xbd\x96\xe5\xe7\xc9\x50\xc6\x39\x60\x59\x3e" + "\x2b\x6c\x66\xaf\x09\xff\x67\x64\xcf\x41\xfd\xda\x83\x7e\x42\x5f" + "\xb5\xe2\x3b\x55\xe0\xcb\xaf\x00\x1d\x5e\xa4\xfe\x2a\x55\x30\xe7" + "\x7a\x04\xaf\x6e\xa0\xd8\xe9\x4d\xec\xb5\xad\xd4\x57\x54\x16\x68" + "\x5c\xed\xed\x4e\xba\x9b\xfc\x52\x11\xad\xd7\xe4\xf1\x56\xda\xa3" + "\xc3\xd8\x1a\x43\x3c\x2c\xf8\x7a\xf1\xbb\x20\x9d\x2b\xa2\xaf\x85" + "\x9d\xe2\x1f\xc6\xac\x69\xe5\xca\xf9\x22\xc6\x8f\x02\x4b\xcf\xeb" + "\x99\xd7\x03\x19\x14\xf5\xd6\x17\x7c\x4d\xbe\xb3\x2a\x31\xbf\x4a" + "\x18\xbe\x1b\x5e\xba\x8a\x19\xc9\xd7\x58\x81\x95\x7b\xea\x3a\x2b" + "\x58\x9d\xb5\x82\xbd\xe7\x2d\x63\x8e\x5c\xd2\x69\xfe\xc1\x71\xcc" + "\x56\x46\x76\xe1\x97\xe1\xf7\x5a\xf3\x1c\xfa\xd6\x7f\x24\x1d\x3b" + "\xf1\x01\x3b\xe6\xf8\x80\x99\xe7\x8a\xfb\xcc\xda\xa4\xf7\x58\x6d" + "\xc2\x7b\xac\xa0\x99\x2b\xc4\x0f\xe5\x2f\xa6\x6f\x94\xa0\xac\x4a" + "\xf2\xd1\x65\x54\x3a\x4c\x23\xd0\xfe\xd0\x99\x36\x26\xf6\x01\x1d" + "\x4b\x5e\x47\x1d\xff\xe3\xab\x9d\x67\x59\xb8\x63\xc9\xdb\xe2\xb7" + "\xd0\x2f\xa0\xbd\xce\xf4\x06\x61\x23\x46\x3e\xc9\x9c\xb6\x56\x3a" + "\x5f\xa9\x6c\xa2\x3a\xfa\x64\xbd\x41\xaf\x50\xed\xfd\x5d\xf9\x7d" + "\xef\x0b\x5f\xb1\x3b\x88\x1e\xa8\xd3\xf1\xd9\x92\x26\xb5\x0d\xa0" + "\xe9\x1c\x95\x3e\x49\x81\xf4\xf9\x8f\x70\xa2\x0f\xd9\x7f\x2a\xb9" + "\xed\x95\xa8\x5b\x02\x68\xa0\x68\xdf\xa0\x31\x40\xfb\x55\x54\x7e" + "\xe9\x59\x16\xe1\x58\x42\xf6\xa1\x7f\x58\x6c\x98\x15\x1a\xae\x9c" + "\xfb\xba\x6a\x53\x17\x0b\xa5\x7e\xa3\x75\x76\x93\x78\x2e\x68\x3e" + "\x8b\xfa\xcc\x1d\xf9\x2b\x33\xfe\x30\x3e\x7f\x65\xa1\xb1\x87\x6b" + "\x1c\xfa\xab\x04\x74\x6a\x45\x5f\x55\xd2\x55\x8e\xc7\x69\x49\xe4" + "\xaf\x91\xd6\x32\x8c\x15\x7f\xfa\x96\x69\x0f\x7b\x31\x77\x14\x21" + "\xa7\xfd\x47\xab\xb2\x39\xd5\x22\x6d\x05\x5f\xb5\xec\x00\x5f\x5c" + "\xb1\x45\x9c\x47\x8f\x00\x2f\x2f\xd6\xc5\xe7\xc4\xb9\x95\x3f\xf4" + "\xad\x7f\xbf\x11\xb1\xcc\xff\x60\xd2\x0b\x9b\xb0\x39\xd3\xd4\xb1" + "\x3e\xad\xbb\x68\x3f\xe6\xfe\x68\x55\xae\xae\x12\x67\x5a\x08\x07" + "\x06\xe3\x49\x80\xcb\xb5\x64\x63\xc7\xaf\x4a\x62\x11\x3a\xee\x8e" + "\x48\x35\x70\xa7\xb7\x86\xc6\x50\x84\x18\xfb\xf2\x19\xf8\x48\xb7" + "\x01\x58\x5e\x8f\xf4\x50\x2d\x9d\x70\x5d\x81\x6c\x49\x72\xed\xcc" + "\x95\x06\x9e\xdf\xc5\x62\x84\x8e\x48\x4b\x5f\xe9\x36\xd4\x99\x18" + "\xd9\xdc\x7b\xc9\x0f\x05\xbd\x83\xf4\x10\xac\x03\x07\xf1\x5d\x07" + "\xf2\x47\x6b\xf9\x79\x47\x52\xa8\xd3\x56\x23\xe6\x19\xf9\x56\xd2" + "\xd6\x05\xa4\x0f\x9b\x69\x73\x1b\x44\x9f\x69\x69\xcb\x92\xc4\x3a" + "\x46\x67\xde\xc1\xa7\x72\x51\x9f\x16\x91\xae\x83\x9c\x29\x62\xa5" + "\x07\xa4\xe9\xc9\xbf\x00\xf9\xc5\x0b\x48\x0b\x41\x9d\x59\xdf\x3d" + "\xbe\xbd\x69\x91\xd8\xa7\x37\xcd\x5c\x49\x7b\x62\xf8\xce\x22\xf5" + "\xdb\x2b\x39\x93\xfe\x36\x65\x9a\x5c\x33\xff\x98\x13\x28\xe3\xd2" + "\x1e\x05\x7d\x5b\xe9\x48\xd2\xfb\x3a\x92\x42\xe8\xfb\x54\x16\xe9" + "\x27\x45\xcc\x76\x6f\x2b\x23\x5f\xcf\x7c\x73\xbd\x95\xd3\x19\x0b" + "\x94\x2b\xea\x63\x83\xfc\x1f\x59\x3f\xb0\x5f\x01\xfb\x21\x8b\x23" + "\x7f\x2e\xc6\xf4\x9f\xf2\x08\x53\x7c\xc6\x87\x27\x9b\x17\x91\xdd" + "\xc1\x1f\xbb\xa8\x4f\x7d\x98\xe7\xbe\xc8\x87\x27\xdf\xd4\xca\x74" + "\xf9\x98\x3b\x72\xaf\xee\x4f\xa3\x88\xa7\x2a\x50\x38\xc7\xef\x70" + "\x1a\xbb\x86\x76\xb2\x3d\x79\x38\x41\xd8\x7b\x44\xbd\x6e\x76\x7a" + "\x5a\x59\x6d\xe1\x27\xac\xd6\xeb\x2c\x3c\x78\xd6\x1d\x2a\xed\x3e" + "\x42\x51\xee\x9f\xae\xa7\x67\x05\x98\x2f\x29\xbe\xca\xc1\xe5\x40" + "\xc8\x16\xa0\xdd\x67\x72\x2d\xf8\x53\x9e\x26\x4f\x5c\xa2\x0d\x27" + "\xc8\xb7\x21\xd9\xc5\x29\x5b\xca\x67\xa1\x2e\x05\xbc\xdb\xc2\x6e" + "\x5a\x45\x7a\xdd\x3f\xed\x1d\xd9\xc9\x12\xd4\x72\xbf\x51\xcb\x3d" + "\x71\xb1\x72\x69\xdc\xd6\x96\x4b\x5b\x0b\x25\xaa\x3c\xc1\x87\xb2" + "\x7d\x51\xe5\x85\x58\x6b\x0a\x0a\xce\x93\xee\xa4\x7a\x0c\xbe\x93" + "\x50\xe7\xad\x67\xe4\x23\x75\xa7\x82\xf5\xfa\x1b\x13\x53\x6d\x5c" + "\x0a\x4e\xb3\x3f\x0f\x53\xb8\xc5\x08\x39\x87\x74\xa5\x05\x84\xb3" + "\xa4\x7b\xce\xf7\xb1\x30\x27\x7a\x96\x7c\xfc\xa1\x8c\x2b\x8e\x90" + "\x5e\x1a\x58\xe5\xe3\x26\xfd\x1b\xe7\x5c\x6c\x13\xf0\x5b\xf8\xfc" + "\x7b\xea\xaa\xe7\x46\xae\x65\x77\x70\xbd\x41\xd8\x30\x61\x7d\x49" + "\x42\xdf\xda\xa4\x4d\xcd\x9c\xd9\x01\xf6\x34\x21\xf8\xd6\x7a\xb2" + "\xa7\xe1\xc6\x39\xa6\x0a\x5a\x33\xd1\x67\xdd\x45\x7f\xde\xef\x62" + "\x7f\x14\x7c\xc9\x06\xd2\x03\x08\x9c\xaf\x1e\xef\x8e\x2c\x33\x53" + "\x19\xe4\x0b\x48\xc9\xf5\x56\x6d\x3a\x03\xbe\x47\xd0\xa3\x5a\x57" + "\xd7\xde\xed\xe0\xf6\x32\x33\xcd\x23\xb5\x6c\x03\xca\x7e\x9f\x6f" + "\x2e\x33\xbb\x58\xb5\x59\xf6\x0d\xfd\xfe\xb3\xd8\xeb\xf0\xf6\xd2" + "\x39\x9c\x3f\x67\x56\xf4\x90\x4e\xee\xcf\xc0\x95\x71\x8e\x0e\x63" + "\x99\xf9\x57\xa6\x42\xf0\x00\xd5\x13\x5d\xfa\x6f\x04\xaf\xa1\xf9" + "\x2f\x1c\x6c\x0f\x8a\x6f\x37\x8d\x70\xa2\x10\xf0\xb8\xd1\x6d\xec" + "\xf5\xdf\xf5\x40\xce\xef\xc5\xda\xda\x03\x39\x81\x6f\x4f\x8a\x28" + "\x1d\xcb\xe2\xf1\x6c\x6c\x1b\xab\x5e\xef\xd5\xb3\x68\xfc\x19\xdd" + "\x57\x65\x5e\x86\x72\x13\x48\xff\x79\xfc\x2c\xed\xbb\x56\x0b\xdc" + "\xdf\xf4\x1c\x8b\x55\x50\x1e\xe9\x5d\x37\x8d\x65\xb1\xa4\x73\x45" + "\x9a\x25\xc5\x27\xf7\x24\x34\x99\xea\xa9\xb1\x2c\x2e\xf8\xbb\xd5" + "\x56\x29\xcb\xbd\x2e\xd6\xf8\x15\x6e\x76\x8d\xf5\x17\xbc\xa9\x85" + "\x1d\x48\xe7\x45\x21\x9c\x5f\x65\xd2\x4b\x99\xe2\xc0\x0c\x43\xb9" + "\x1c\x77\x42\x07\x8f\xf1\x46\x7b\x1c\xaa\x6e\x57\x27\xfc\x36\x46" + "\x3d\x5a\x4b\xe7\x20\x44\x9a\xce\x48\xb4\x34\x8a\x7a\xa8\x3e\xd7" + "\x7c\x4f\xfd\x88\x62\xbb\x09\x5f\x6b\x29\x69\x52\x2f\x4c\xfe\xd8" + "\x40\x63\x71\x1e\x6c\xc3\x73\x2c\xe2\xb7\xcf\x31\xe3\xf1\xc7\xa9" + "\x5d\x07\xf2\xe4\x5c\x0c\x65\x54\x5f\xc5\x4e\xf3\x0c\x63\x02\xf5" + "\xa6\xef\xd1\xd8\xa8\xf3\x7e\xe3\x28\xc8\xe1\x8a\x63\x11\xf9\x02" + "\x38\xf0\x86\x23\x7b\x2f\x9b\x49\xfe\xeb\xc8\x87\x4d\x32\x73\xef" + "\x42\x79\xbb\xc6\x32\x23\xca\x7a\xd7\x99\x45\x58\x6b\xba\xd6\x91" + "\xbd\x9f\xca\x3e\x49\xeb\xd1\x46\xd0\x47\xae\x4b\xaf\xdb\x9d\x9e" + "\x06\x46\xfe\xea\xef\xb7\x72\x1f\x95\xd3\xc2\x5e\x1f\x25\xda\xbb" + "\xdd\x64\x4e\x91\x3e\xf3\x44\x5b\xfb\xf4\xed\x6a\x3b\x9c\x67\xa9" + "\xbc\xd7\x2d\xce\x54\xf0\x9c\x6a\x9b\x34\x5a\xcb\xf1\xf5\x7a\x86" + "\x23\x7b\x37\xa3\xfe\xa1\xfc\xb8\x9f\xed\x6c\x47\xde\xaf\x83\xfb" + "\x85\xf2\xe0\xd9\xd3\x28\xf7\x67\xfe\x7d\x24\xda\xdf\xf0\xe7\xa9" + "\x40\x7b\x40\xab\xa3\xdb\x41\x23\xa9\x5f\x3b\x70\x86\xea\xea\x62" + "\x07\xdc\xce\x9c\x4f\x06\x3e\x7f\x84\xb9\x8f\x71\xbf\xb6\x4e\xe8" + "\x96\x5e\xff\xfc\x7e\xaf\xc2\x25\x9e\xfd\xa5\x4c\x01\x0e\xb8\x70" + "\x25\x2c\x10\x78\x72\x23\xed\xfd\xfe\x65\xab\x41\x27\xfb\x97\xda" + "\x42\x3c\xd3\x40\x7d\x1c\xa0\xd7\x37\x52\x5d\xb5\x3e\xe6\xc6\x43" + "\x16\x85\xf6\x6b\xc6\x32\x71\xa6\x48\x8e\x3f\x6e\x47\xb9\x4f\xab" + "\x3c\x64\xb9\xba\x9e\x96\x77\x44\x3e\x9c\xc8\x57\x9b\x98\x66\x6b" + "\x87\xf9\x3b\x2d\x45\xda\x2f\x9a\x08\xa3\x76\xe9\xe5\xdc\xa1\x3a" + "\xaa\xef\x96\xc9\x7d\xe4\xbf\xcc\xc6\xfb\x65\x03\xb6\x37\x04\xb8" + "\x53\x04\x98\x46\x7b\xc4\xb9\x00\x60\x15\xd6\x83\x30\x67\x67\x0f" + "\x93\x7b\xdb\x07\x23\x29\x76\x3c\x9d\x09\xd3\xea\x36\x34\x1d\xfc" + "\x5f\x1a\xa5\x0e\xfe\x60\x8c\x26\x6f\x72\x23\x68\x5c\x64\x10\xbe" + "\xcb\xc1\x77\x29\x9d\x91\x87\xe2\xdd\x91\xf5\xa9\x72\xde\x1c\x9c" + "\xc6\x23\x25\xde\xa6\x78\x58\x21\xb5\x4b\x95\xbb\xc2\xa8\xcd\x28" + "\x27\x5d\xdb\x0b\xd6\xca\x1e\x34\x1e\x80\xd6\x36\xb4\x49\x9e\x25" + "\x3e\x64\x11\x6d\x23\x7f\x18\xb2\x6d\xe2\x3c\xee\xd0\xda\x73\x50" + "\xc6\x08\xb0\x1f\x8a\x77\x8c\xa5\x32\x0e\xad\x14\xb6\xf8\xe8\x13" + "\xe0\xc3\x95\x6d\xec\x8d\x89\x7c\xc4\x6f\x47\x0c\xad\xcc\x37\x98" + "\x2c\xb3\x3e\x75\x2b\x30\x58\x9e\x0f\x22\x1b\x96\x43\x69\xc0\xf2" + "\x54\x92\x61\x3a\xf0\x3d\x8c\x8f\x00\x1c\x7a\xa3\x99\xfa\xea\xc6" + "\xbd\x2c\x41\x8e\xc3\x37\x3e\x26\xbd\x84\x8c\xd7\xf2\x46\x09\xc6" + "\xfd\x74\x29\x2f\x69\x76\x99\x3a\x61\x97\x19\x88\xb1\x43\xac\xa3" + "\x94\x69\xa2\xc8\x2f\xe3\x1b\x36\x61\xa7\x83\xfa\xae\xf0\x6a\xf8" + "\xf7\x86\x8d\x93\x6e\x38\x5f\xd5\x11\x12\x96\xe5\x4b\x7f\x5a\xdd" + "\x45\x87\x4c\x7d\x3a\x42\x3a\x3f\x59\xc4\x8f\x52\x3e\xf4\xfd\x37" + "\x94\x47\xfa\xfb\x69\x53\xcf\x16\x1e\xba\x41\x3d\x37\x68\x21\x7b" + "\x24\xbc\x3b\xdb\xc5\x9a\xf6\x0b\x5d\x0e\x68\x40\xdf\x16\x75\xd7" + "\x93\x3e\xf0\x90\xd5\xaf\x93\x7d\x43\x9c\xe7\x96\x67\x7f\x0f\x95" + "\x68\x63\x04\xed\x0d\x93\x3e\xfa\x0f\x9e\x39\x1c\xc7\xc4\x18\xe8" + "\xe0\xa6\x11\x3f\xac\xa0\x31\x79\xa8\x2a\x90\x4e\x33\xbd\x4a\x81" + "\xc4\xa0\x37\xca\xb9\x98\xeb\x6f\x94\x5f\x9a\x9f\x78\x73\x98\xc6" + "\x8b\x48\x3a\x1b\x41\x9f\xb7\xea\x05\xad\xed\x53\x3d\xe4\x57\x73" + "\x75\x3e\xf9\x06\x7e\xf3\x08\xf9\x5d\xf6\xda\xa7\x99\x7c\x05\x26" + "\x8a\xe9\xc2\x14\xfb\x34\x4b\x8b\x95\xe9\x53\xac\xa4\x87\x7e\xc6" + "\x4d\x32\x1e\x64\x56\x23\x8f\x02\x7f\x82\x79\xbe\x66\x21\x33\xcc" + "\xcb\x44\xd9\x05\x96\x68\xf2\x8b\x4c\x3e\x91\xc9\xaf\xb9\xaf\xc0" + "\x12\x85\xdf\xa3\xc1\xcf\x19\xb9\x71\x5a\x38\xed\x65\xfb\x8a\x38" + "\xf0\xb8\x91\x7c\x33\xeb\x9d\x6e\x0f\x5b\xf3\x35\x0b\x27\xbf\xcb" + "\xde\xcd\x65\xe1\x75\x9d\x27\x85\x7c\x33\xd2\xca\xa2\xc1\x7f\xc4" + "\x80\xe6\x26\x25\xf2\x19\xc8\xa1\xcf\x74\xca\x76\x7f\xc3\x65\xbb" + "\x65\xbd\xa9\xfe\x12\xe3\xee\xb2\xe4\x8b\xba\xbf\xb5\xd0\x8b\xf2" + "\x15\xfb\x7d\xb1\x3e\xfb\x7d\x66\x79\x7e\xb5\x96\xe5\xe7\xf0\x56" + "\x67\x67\x2d\x64\xae\x2e\x11\x87\x8a\xf6\xca\xa9\x8d\xd4\x3e\xfa" + "\xf6\xb1\xb3\x5f\x0b\x3f\xd2\x5e\xdc\x17\x64\xa9\xef\xb4\xe3\x9d" + "\xf6\x5a\xd6\x63\xbf\x4f\xb4\xbd\xae\x53\xbe\x9b\x22\x7e\xd3\xfb" + "\x01\x74\x50\xdb\xdc\x47\x07\xb4\x9d\xda\x47\xed\xf7\x12\x4d\x40" + "\x03\xb5\xad\xa6\x5e\xb5\x9d\xd4\xc6\xf7\xb0\xea\x3c\x87\x76\xa2" + "\xad\xa2\x9d\xbd\x68\xe7\xd1\x4c\xc6\x3c\x5b\x0e\x25\x9c\x8f\xba" + "\xcf\x4c\x32\x6a\xc1\xfb\xe0\xe1\xf3\xec\x0c\xb2\x68\xe8\xbe\x7c" + "\xbb\xfe\x37\xe0\x4d\xf2\xdd\x90\x49\xdd\xbc\x95\xec\x54\x9d\x56" + "\xfc\x79\x2b\x18\xf1\x38\x1a\xbf\x8e\x6f\x9b\x8e\x29\xa7\x58\x7e" + "\x2b\x6f\x05\x6f\xea\x71\x7a\x91\x27\x13\xed\x87\x0c\xdb\xa2\xd6" + "\x9f\xf2\xae\x39\x23\xdb\x65\xc8\x62\xd1\x6f\xce\x2d\xd1\x3b\x1b" + "\x4a\x98\xd6\x96\xf9\xc8\x87\xf6\x98\x50\x96\x88\x43\xa3\xa0\x9d" + "\xdb\x51\x4f\x4f\x40\x9b\x8e\xb7\x93\xad\xec\x87\x6c\xc4\x2c\xa6" + "\x7b\xee\x34\xda\x71\x9a\x99\xec\xf9\xe0\xbf\x1e\x24\x7e\xd1\xf1" + "\xfc\xe5\x49\x2c\xd6\xc5\xde\x94\xf1\x5a\xa5\x9f\xd7\x51\x6d\xec" + "\xad\x77\x35\x5f\xae\x0a\xf9\xc2\x8e\x2c\x8b\xa0\x71\x24\xfc\xba" + "\xd2\x9a\xd1\x8d\x31\x43\x7b\xda\x2b\xf0\x8d\x6e\xcb\x68\x51\x9f" + "\x22\xe9\x0b\x16\xf7\xe4\xf7\x82\xce\x86\xe9\xf0\x5e\x38\x07\xcd" + "\xa8\x7c\xbe\xf9\x99\x4e\xba\x12\x0d\x07\xb4\x2b\x7d\x85\x4d\xc2" + "\x37\x66\x93\xfc\x5d\x95\xef\xd6\x3f\xfd\x0a\x8b\x1b\x1a\xa6\xbc" + "\xe5\x19\x0c\xbf\x49\x97\x49\xe5\xa1\x6d\x51\x6d\xec\xed\x93\xc1" + "\x73\xcc\x2c\xb0\x4c\xe2\xe0\xdb\xbb\x49\x57\x38\xb4\xef\xbe\x2d" + "\x78\x38\xb2\x47\x18\xe2\x7b\x7b\xb4\x7a\xe0\xf7\x05\x76\x44\x5a" + "\xdd\x87\x4e\x87\xc3\x6c\xb0\xb2\x36\x6e\x13\x36\x83\x05\xa5\xdb" + "\x80\x17\xe0\x15\x0e\x9b\x68\xdf\x01\x6b\xe7\xee\x4e\xb6\x6c\x07" + "\x0b\x2f\xf8\x9a\xf4\x42\x33\xd8\xe1\x8a\x78\xb6\xf3\x2c\xf9\x67" + "\xb2\x44\x3d\x73\x16\x7d\xa9\x62\x08\xf1\xa4\xa4\x73\xe5\xcb\x2c" + "\xc6\x4d\xdb\x34\x1e\xfe\xf0\xbb\x79\x5d\x4c\x2f\x63\x7f\x1f\x3e" + "\x3a\xcd\xcc\xbd\x65\x7a\x25\xb3\x82\xfc\x1c\x47\x55\x5b\xc9\xcf" + "\xb1\xe6\xf7\x57\xf0\x3e\x36\xcc\xb9\x0e\xd3\x88\x8d\xd9\x2c\x8e" + "\x7c\x94\x1b\xdc\x92\x97\x93\xeb\xf5\x61\xb2\xdd\x34\xaa\xbe\x80" + "\x8d\xaa\x2f\xe0\x04\xb2\xab\x96\xcf\x6b\xae\xf7\x41\x86\x11\xe5" + "\x66\xb3\xd8\x8a\xb3\xcc\x42\x7c\x50\xca\x29\xc9\xb3\x91\x5c\x38" + "\xa3\xdd\xc0\x7d\xff\xb0\xb0\x1d\x6d\x7e\x1f\xe6\xee\x65\xe4\xf7" + "\x9c\x9b\x06\xb3\x11\xde\x34\x5a\xec\xbd\x0b\xbf\x94\xa4\x93\xc7" + "\x3d\x2b\xdb\xc2\x42\x0f\x93\x1d\x5f\xa5\x3c\x6f\x74\xd8\x2b\x6d" + "\x5a\xbb\x8b\x6a\xca\x35\x1f\xcf\x83\xee\x2d\xdb\xa5\xbc\xa3\x84" + "\x41\xfe\x72\x77\x3b\xa4\xbf\xbf\x1a\x97\x73\x9d\x12\x20\xe3\xd4" + "\xbc\x45\xcf\x28\x8d\x7c\x28\x25\x08\x5a\x1e\x09\x27\xb9\x47\x95" + "\x19\xdf\x34\xf7\xa5\x49\x1e\x46\xd8\x15\x9b\xe4\x5e\x19\xd6\xa6" + "\x91\xdd\x45\x47\x62\xb5\xf5\x8c\xd6\x75\xa9\x1b\x3e\x32\xc9\xa5" + "\x3f\xb3\xf7\x22\xf5\x33\xaa\x76\xd0\xb4\xcf\x91\x80\xfc\x99\xda" + "\xfa\x26\xf6\x3b\x9f\x1a\x3b\x65\xd9\x4a\x16\xf3\xab\x31\xe1\x8c" + "\xf6\xca\x90\xb7\x55\xae\xbb\x47\xec\x7e\x7d\x7a\x82\xa0\x37\x9d" + "\x07\x16\x32\x06\xf9\xd9\x93\xfe\xca\xdb\x35\x7f\x7b\x72\xfd\x3d" + "\xb2\x2f\xe0\x3b\xf5\x7d\xeb\x28\xbe\x41\x76\xd6\x54\xbe\xe4\x4d" + "\x8e\xac\x13\x67\xc6\x90\x4f\xae\xaf\x47\xd6\x5d\x84\x17\xb3\x10" + "\x7d\x15\x55\x9e\x74\xb6\x7f\x29\xe9\x6b\x63\x21\x37\x95\x31\xd3" + "\x9b\xf9\xae\xd0\x91\xd2\x8f\xae\xa1\x89\xbd\x33\x9e\x9e\xd3\x58" + "\x77\xdc\x48\xfa\xc0\x77\xd6\x38\x69\xdd\xee\x4d\x8a\xb8\x9f\x64" + "\x7d\xc1\x8b\xbf\x93\x75\x03\xde\x43\x5a\xd4\xa1\xd3\x9e\xd0\x4d" + "\xab\x58\x9c\xf4\x5b\xf8\x8e\xb0\x6b\x72\x5f\xf9\x44\xf7\x0f\xa3" + "\x99\xe9\x87\x65\xcc\xd2\x5d\xf4\x4e\x19\xe4\xcb\x56\xa1\x27\xa5" + "\xef\x6f\xa9\xb7\x93\xaf\xf6\x57\x7b\x5c\xc3\x64\x5f\xfd\xf5\x66" + "\xdc\x5b\xfc\xf7\xef\x1c\x57\xf7\x52\xd0\xf6\xbf\xc6\xef\x3a\x2d" + "\xed\xc5\x85\x7e\xc9\x7e\xc0\xe8\xdf\xab\xff\xeb\xcd\xb2\x2e\x7f" + "\xbd\xf9\x30\xd0\x64\xc7\x36\x7e\x62\xe7\x68\x5e\xdf\x5d\xf4\xd7" + "\x50\x17\x3b\x32\x4d\xd5\xc7\xd4\x8b\x71\x45\xfc\x6e\x31\xc9\x60" + "\x5f\x3a\x36\x22\x1f\xad\x13\xe0\x8f\x12\x24\x0f\x7f\xc0\xa2\x60" + "\xfc\x04\xb4\x7f\x07\xe9\x1b\x07\xc4\xc4\xe7\x18\x13\xef\x6c\xae" + "\xce\x14\xb6\x1f\x9b\xeb\x5b\x71\xc5\x58\x7b\xdd\x88\x6b\x04\xc6" + "\x9c\x19\x57\x23\xae\x26\x5c\xa3\xf1\xbc\x9e\xc6\x25\x64\x58\x13" + "\xc5\x9b\xeb\x88\xac\x4e\x1d\xec\xec\x0f\xd1\xc6\xb9\x6e\x0e\x93" + "\xf6\x6d\x47\xa3\x29\xd6\xd8\xcc\x1d\x8c\x2d\xf3\xf2\x1e\xf3\x35" + "\x6c\x78\x13\xd2\x0a\x76\xd0\xbe\xf3\x5f\x5b\x83\xf7\x9d\x8f\x86" + "\xe3\x2f\x11\x7f\x15\xf8\xab\xc5\x5f\xb4\xff\xef\xdd\xf0\xee\xa2" + "\xa3\xd1\xa0\xa3\xf4\x07\x31\x24\x4c\x3c\x2a\xce\x8b\x6f\x22\xb9" + "\x28\xb2\x3c\x5e\x6d\x6f\x02\xee\xb1\x3e\xd5\x17\xaa\xed\x8d\xc7" + "\xbd\xd1\x5c\x80\x75\x2d\x12\x34\x19\x8b\x36\x47\xd6\xb7\x52\x7b" + "\xa9\xbe\x1d\x91\xaf\x1b\x03\xcf\x3d\x51\x99\xd4\x7e\x77\xe4\x01" + "\x2a\x8f\xf1\x1b\x33\xaa\x34\x7a\xaa\x74\xa2\x33\x21\xfa\x0e\x94" + "\x21\xf9\x20\xe4\x47\x19\x5a\xfe\x3e\xda\x8f\x25\x1f\x60\xe8\x53" + "\xe4\x83\x4c\x1c\xae\x9d\xa9\xea\x2e\x7a\x97\xbd\x95\x25\xf7\x33" + "\xe8\xdd\xce\x80\x77\xc9\xcf\xc7\x40\xef\xe3\x9b\xe1\xf2\x9b\xaf" + "\x43\xee\x3e\x3a\x4a\xfd\x6e\xe7\x60\x73\x29\x7f\x3c\xf8\xbb\x0a" + "\x17\x9d\xff\x21\x7e\x68\xb2\x33\xa6\x93\x39\x2b\x14\xac\xf9\x07" + "\x12\x12\xf2\xb9\xa3\x85\xbd\xfb\xc7\x3a\x4f\xeb\x10\xd7\xc3\x77" + "\xa5\x2c\xda\x53\xc8\x9c\x79\xb7\x08\x7b\xf5\xd3\xec\xbd\x53\x4e" + "\xb7\x38\x5b\x4b\xbf\x85\xcf\x67\xda\x6f\xa6\xb5\x81\x7c\xd8\x6b" + "\x32\xb6\x82\xbc\x3b\x29\x1d\x69\x74\xfe\x7f\x57\xc0\x33\xbe\xa5" + "\x3a\x51\xce\xa9\xf7\x76\x10\x6f\x21\xea\xeb\xbd\xdb\x41\x75\x56" + "\xec\xd5\x89\xd4\x86\x02\xc8\x7f\x14\xe7\x8f\xe6\x84\x39\x97\x74" + "\x85\xef\xad\xc4\xb8\xe3\xca\xe6\xea\xc4\xa1\xb5\xe1\x3d\xe1\x87" + "\xbd\xc0\xcb\x4f\xbb\x23\xab\x13\x89\x27\xd9\x94\x3f\x2c\x7c\x6a" + "\x05\x77\x74\x44\x1d\x00\x96\xbd\x57\xf1\x96\x4d\xf6\xcd\x10\xcb" + "\xad\xd0\xda\xbe\x53\x6d\x3b\xe8\x25\xf6\xa8\x6e\x2a\x97\xb1\x01" + "\x90\xe7\xc4\xa0\x3a\x2b\xf4\x33\xf1\x03\x58\x1b\xce\x4b\x5a\x1c" + "\x8b\xed\x5b\x1b\x86\x54\x8f\x63\xb1\xdf\xe2\x1b\xbd\xea\x37\x4a" + "\xfe\xc9\x6f\x94\x5c\xec\x1b\x72\xaf\xb9\x36\x7a\xe8\xb2\xe3\x31" + "\x97\x18\x2b\xf6\x03\xf1\x12\x33\x8f\x3f\xed\x83\xfc\xe6\x35\xd6" + "\x27\x10\x6f\x43\x76\xa5\x4e\x97\x97\x79\xed\xe5\xf1\xc7\x6d\x3d" + "\xcc\x91\xfb\x01\x6b\x66\xb5\x33\xe8\x9d\xe3\x39\x24\xb3\xd5\x17" + "\xf6\x6e\x39\x60\xef\xd5\x1f\x4b\x27\x7a\xef\xa0\x38\x0c\x01\xe3" + "\xac\xae\xf3\x03\xe6\x4c\x25\xfd\x6a\x3d\xe9\xb5\x0b\x31\xaf\x12" + "\x14\x60\x03\x78\x74\x9f\xa0\x07\xf8\x17\x29\x6f\x1d\x92\xf2\x96" + "\x5b\xf8\x27\xbd\x02\x7c\x6f\x04\x2f\x7a\x26\x9d\x74\xdf\xbe\xde" + "\x24\x73\x77\x11\x9b\x45\x31\x11\x48\xef\xcc\x8d\x73\xe2\x67\x7a" + "\x43\xb8\x90\xa7\xc0\xfb\x53\x6c\x04\x27\xb8\x61\x1f\xf8\xe8\x8a" + "\x73\x2c\xba\x02\xbc\x27\x30\xdb\x48\xb8\xbe\x4b\x8d\x8d\xb0\xf1" + "\x9c\x3f\x36\xc2\x4e\xd2\xf5\x34\xe0\xf7\x39\x16\xea\xdb\x7c\xc8" + "\xb2\xfd\x1c\x8b\xdd\x91\xcb\x2c\xdb\x49\x97\xf7\x95\xe4\x7d\x84" + "\x1d\x38\xc5\x49\x58\x6a\xa1\xbd\x04\x3f\xef\x43\x67\xc1\xfd\xb8" + "\x15\x2a\x74\x20\x43\xa2\xf7\x71\xb1\x0e\x7a\xed\xd5\x99\xa0\x71" + "\x6b\xef\x96\xd7\x8d\x2e\x56\xbb\x0e\xf4\x1b\x50\xe7\xa5\xd9\x93" + "\x94\x05\xc4\xb6\x78\x2b\x56\xe2\x3b\xca\x3a\x3a\xd8\x98\xf0\x6d" + "\x4f\x62\x37\xb5\xb3\x78\x79\x0e\xf1\x32\xac\x89\x75\x71\x64\xff" + "\x97\xbf\x98\x99\x7c\xdb\x93\x75\x05\xcf\xb3\x10\xa7\x37\x81\xd1" + "\x5f\xfe\x19\xde\x7a\x53\x16\x8b\xa7\xfd\x07\xda\x2b\x31\xaf\xa6" + "\xfc\xc7\x7d\xb1\x79\x2c\x3e\xb0\xec\xc5\x2b\xb3\x17\xde\x1c\xff" + "\xeb\x0c\xf3\xe3\x0b\xb3\x17\xaf\x48\xcb\xce\x60\x89\xd2\x6c\x42" + "\xb8\x7e\x5e\x49\x36\x13\x2b\x16\xe6\x64\x9a\x1f\x5b\x9e\x9d\x9d" + "\xb1\x24\xc7\x3c\x63\xea\xac\x0b\xfd\xff\x6d\x37\xed\x16\xfe\x5e" + "\x85\x0d\x9d\xf3\x24\xff\xdf\x3f\x3e\x57\x9a\xcb\x42\x0d\x6b\xef" + "\x9c\x6d\xf0\x26\x9a\x65\x7c\x24\x8c\x95\x2d\xc9\xb5\xbc\x20\xa9" + "\x5c\xf2\xa9\xf5\xea\x9e\x42\x72\xbd\x3c\x5b\x51\x2f\x75\x32\xdd" + "\x89\x31\x72\x4e\x39\x23\x43\x72\x18\xfd\x5e\x4c\xbf\x0d\x39\xac" + "\xc4\x31\x96\xf6\xc3\x9d\x91\x22\xdf\xf6\xe9\x3a\x2d\x9f\x96\x47" + "\x3e\xaf\x13\xb1\x13\x77\x0a\x5f\x98\x75\x93\x40\x9f\xa8\xee\x22" + "\xa7\xc5\x15\x3a\xc5\xae\xee\xaf\xb7\x4a\x7b\xbd\x7a\x46\xfe\xf0" + "\xf8\xff\xbe\xea\x9c\x5a\x4e\x2a\xbe\x77\x39\xf2\xce\x46\x1f\x34" + "\xaa\x76\x7d\xe3\x9a\xd4\x7a\x49\xbb\xd3\xba\x7b\xa5\x7d\x87\xd3" + "\x16\x70\x1e\x5b\x9c\xa9\xa7\xb5\x51\xe5\x49\xbb\xd5\xf2\x2a\x34" + "\x4c\x40\x7e\x8a\x7f\x53\x32\x74\x2c\x74\x4a\xf9\x27\xc8\xcf\x89" + "\x4a\xa7\xed\xa6\x17\x80\x0f\x31\x6d\xac\xce\xde\x7f\xbc\xf4\xf5" + "\xe0\x3d\x4b\x1e\x5b\xba\xd8\x9a\x96\xb3\x70\xc1\xc2\xac\x85\x39" + "\x2b\xc5\x31\xf0\x38\xf1\xef\xae\x09\xe9\xb3\xfb\xfb\x6e\x8e\x23" + "\x1d\x8b\xea\xf3\xb5\x93\x6c\x1a\xa4\x9e\xab\x7e\xab\xb7\x88\x8d" + "\x1b\x5a\xbd\xeb\x53\x85\x3e\x58\xf8\x1f\xa8\xdf\xed\xd2\xbb\x0f" + "\xaa\xfb\x1d\xed\x2a\xed\xc5\xf3\x0e\x63\x7d\xbd\x79\x2c\x9b\xdc" + "\xc4\x4e\x4c\xa3\x7d\x2e\xd0\xcf\x4c\xeb\x61\xe9\x2a\x5a\xb7\xd0" + "\x0b\xde\x5b\xd4\xf8\xac\xef\xbf\x46\x34\x20\x9e\x10\x34\xd8\xdd" + "\xc4\xde\x1f\x23\x68\xf0\x8d\x69\xb7\xf0\x3d\xf0\x8d\xe9\x05\x1a" + "\x5b\x54\x67\x85\x27\x6d\xe7\x3c\xe9\x39\xe5\x9b\xcc\xed\xfc\x9b" + "\xcc\xe7\xfc\x7e\xe3\xde\x5f\x87\x77\xf7\xe2\xdd\xf5\x14\x87\xa6" + "\xf4\x34\xdb\x4b\xfb\xdf\x74\x6f\xc8\x31\x32\x9f\xf1\x80\x89\xea" + "\xe3\x6c\x8d\x17\xfc\x76\x33\xf2\x3b\x3b\x6f\x61\xe0\x25\xcd\xe2" + "\x4c\xa3\xd8\xaf\x03\xbf\x87\xf7\x9c\xa8\x97\xb3\xb5\x87\x64\x62" + "\x93\x02\x9e\x0f\xed\xdd\x8f\xf5\x33\x95\xca\xa5\x36\x8b\x73\xc5" + "\xa3\xb9\xab\xbb\xe8\xfd\x4a\x17\xab\xb3\xaa\xbc\xa9\xb0\xb7\x20" + "\x1a\x04\xf7\xe7\xfb\xc2\xa7\x03\x68\x7c\x25\xb7\x4f\x4b\x94\x7d" + "\xfa\xbe\xf0\x75\x31\xbd\x99\x7f\xe3\x3f\xcf\xfe\xfe\xd7\xb8\xef" + "\xc5\x9f\xc2\xed\x77\x66\x06\xec\x2b\xe3\xd9\x07\xa3\x04\xef\x36" + "\x9a\xbb\xad\xab\x28\x6e\xf7\x07\xe3\xe5\xb8\xb9\xf3\xd7\xee\x82" + "\xcc\x10\xbc\xe3\xa3\xf3\x97\x92\x96\x1f\xfc\xd2\xb9\xee\xb4\x66" + "\xa7\x81\xef\x7f\xf0\xb9\xe3\x71\x2f\x13\x71\xa4\x9b\xbd\xc2\xee" + "\x4f\xf5\x31\xa0\x53\x8a\xea\xc9\xcf\x9e\x11\xb2\x1d\xed\x45\x0b" + "\x1f\xe9\xdd\x45\x1f\xe4\xf4\x9d\x13\x33\x4a\x7e\x8f\x78\x2e\x8a" + "\xb1\x45\x63\x9f\xf8\x37\xaa\x13\x8d\x7d\x94\x5d\x49\x7b\xd4\x72" + "\x0e\x7c\xb0\xf7\x9f\x9b\x03\x1f\x08\xfd\x2f\xca\x4a\xe0\xfa\x02" + "\x7e\xd3\x06\x96\x2a\x6c\x08\xbc\x9d\x74\x6e\x36\x14\xeb\x46\xac" + "\xc4\x93\x13\x57\x0b\x3b\x93\xdc\xf6\x4a\x3a\x9b\xba\xab\x87\x45" + "\x28\xf6\x39\x16\xe2\xb3\x8f\xe7\x09\xdb\x8b\x70\xbc\x57\x45\xb6" + "\x19\x64\x4b\x37\x52\xc4\x6d\xfb\x80\xed\xea\x62\xa1\xcd\xec\x6f" + "\x71\xb4\x17\xe4\xa7\xf5\xdf\xd6\xd2\xde\x1f\xdf\x32\xc5\x65\xc8" + "\xd3\x97\x50\x19\xca\xb9\xaf\x27\x69\xef\x51\x8c\x60\x7a\xaf\x89" + "\xfd\x2d\x43\xbc\x47\x79\xc9\xc7\x52\xbe\x31\x19\x7c\x56\x26\xe5" + "\xf7\xe2\x7e\xa7\x62\x9c\xc5\xb1\x1e\xf8\x72\xbd\x55\x78\x36\x5b" + "\xb1\xbf\x6e\x44\x5a\x92\xd8\x83\xe8\x35\xd1\xde\x24\xc6\x57\x99" + "\xd9\xe9\xfa\xd2\x21\xea\x43\x67\x69\x73\xb0\x76\x0a\xb9\xe4\x6f" + "\x07\x76\x7e\x25\xe2\xc9\xa1\x3f\x4f\x48\xdf\x99\xa7\xd9\x1e\x59" + "\xbf\x13\x33\x3a\xb6\xdc\x67\xee\xc0\xd8\xec\xd4\x87\xb3\xc3\x26" + "\xb2\x25\xaf\xaf\x3f\x6c\xea\x41\xff\x9c\x88\x06\xd6\xcd\x92\x3c" + "\xb1\x7c\x4f\x1b\x93\x21\x26\x63\x22\x9e\x4f\xd4\xec\x91\xb4\xf1" + "\xe8\x62\x7f\x8b\x20\xba\x61\x1c\x37\xd4\x65\x91\x6d\x99\x52\x8b" + "\x6f\x31\x5f\xae\xd2\x48\x7b\xe3\x64\xb7\x4f\xf2\xcc\x4c\x1b\xef" + "\x20\xf9\x8c\xce\x3a\xd1\x7e\x38\x9d\xe1\xde\x01\xf9\x96\xca\x46" + "\xb9\x1b\xb4\xb3\xdc\x1b\x91\x46\x65\xd3\x79\xa6\xd2\x45\x62\xae" + "\x91\x0d\x67\x84\xd8\x13\x08\x79\xe2\xab\xfb\x3b\x79\x07\x9d\x97" + "\xbf\xdf\x8a\xab\x5a\x0e\xf9\xd9\x41\x19\xf5\x5a\x19\x0a\xd9\xbf" + "\x66\x0b\x3b\x37\x97\x7c\x5f\xda\xff\xdc\xdf\xa9\x88\x73\x28\xf4" + "\xbe\xb4\xcb\xf9\x30\xb4\xcf\x86\x52\x9c\x0d\xf9\x30\x5a\xf3\xc3" + "\x83\xdf\xe6\xbe\xb3\x6d\xa0\x55\x87\xfd\x80\xa9\x13\x73\xbc\xd3" + "\x5e\x9d\x8a\x67\x93\x81\x30\xbb\x2f\xaa\xa3\xa0\xf3\xfb\xcb\x99" + "\x5e\x89\x9a\x33\x9b\x7c\x33\xd0\x99\x4f\x69\xb7\xfd\xe1\x0e\xd5" + "\x4f\x43\xc8\x69\xf6\xe1\x23\xfe\xbd\x71\x9f\xaa\xd7\xfd\xb0\x46" + "\xca\x15\x1f\xd6\x08\xbd\xee\x96\x03\xec\xff\xac\xf2\xe8\xab\x56" + "\xb9\xf4\xd2\x96\xf1\xc3\x6a\x17\x3b\xd9\xee\xb7\x65\xfc\xd0\x46" + "\x65\x0d\xcc\x07\x26\xab\x63\xf2\x23\x71\xbe\xd6\x2f\xa7\x7f\x24" + "\xd6\x39\xda\xc7\x56\x88\xa7\x8b\x2a\x4f\x20\xbb\x25\xa7\xf5\x2c" + "\xe9\x77\xc3\xa4\xce\xe0\x23\x35\x8e\xb0\xb0\x53\xfc\x41\x5b\xf0" + "\x7d\x14\xdd\x4b\x9a\x7d\x94\xa8\xed\x15\x95\xea\x15\x97\x41\xc7" + "\x78\x41\x25\x30\xcf\xda\x29\xfc\x03\x38\xc1\x23\x52\x6c\x6c\x6b" + "\x36\x9d\x05\xfc\x68\x0d\xf9\x0d\x90\x73\xee\x23\x71\x2e\x49\x29" + "\xba\x83\x17\x90\x9c\xe4\xa6\x58\x1d\x67\x19\xf2\x45\x22\xdf\x8b" + "\x35\x79\xed\x64\xf7\x15\x43\x71\x22\x9b\xd5\x6f\xbb\x23\x93\x2d" + "\x3f\x8c\x60\xa0\xff\x47\x07\x5d\xec\xc5\x69\x43\xc7\x83\x8f\x0e" + "\x5e\x8c\x67\x96\x3c\x5c\x02\x1b\x4c\xee\x26\xbd\xca\x8d\xf8\xfe" + "\x0c\x4e\xf5\xff\xcf\x17\xbd\x7a\x0f\xeb\xd5\x0f\xe7\x3f\x2e\xb4" + "\x31\x6f\xd1\x70\xee\x5b\x85\xfe\xea\x30\x41\x2e\xab\x65\x75\xd2" + "\x16\x86\xf6\xf3\x0d\xf9\x9d\xfc\xac\xd3\xbb\x9f\xf4\xfa\x6e\xf4" + "\x15\xf0\xe8\x3f\x9f\x77\x7a\xdf\x60\x64\x9f\x4c\x38\xd2\xc4\xfe" + "\x53\xf8\x63\xba\xd1\x5a\xc8\x6e\x38\x2d\x9e\x4f\x97\xfc\xdc\x7f" + "\xee\x51\xaf\x36\xf2\x8f\x19\x58\xa7\xbb\x96\x2f\x79\x8c\x9c\xac" + "\xde\x30\x3d\x23\x37\x23\xcb\xfc\x20\xb9\x60\xed\x67\x6b\x18\xee" + "\x8f\x2b\xd6\x90\x43\x6b\x24\xf1\xd4\x14\x5f\x4c\xc4\x16\x2b\x9a" + "\xc8\xfa\xe2\x8a\x11\x6f\xfd\x5f\x10\x5b\x4c\xe3\x99\x29\xae\x98" + "\x7f\x4f\xe6\xe3\x89\x7d\x73\x40\x79\xb3\x9b\xee\xc5\xba\x5c\xf4" + "\x9f\xfb\x69\x1e\xc9\x75\xa3\x61\x6f\xa0\x0f\x1b\xc9\x33\x95\x41" + "\x06\x68\xa8\xd1\xce\x6c\x62\x2c\x46\xe0\xfe\x84\xff\x8c\x48\x83" + "\x0b\x74\x33\xcb\xf9\x2b\xf2\xba\x35\xdb\x05\x35\x66\xb4\xb0\xb5" + "\x50\x8a\xaf\xdc\x2b\xf5\x85\x0d\x5d\x3b\x95\xe1\xe1\x72\xaf\xea" + "\xe3\x18\xed\x0c\x92\x9c\x9b\x6f\xaa\x73\xf3\xe3\x89\x17\xb3\x2f" + "\xf1\xcf\x8d\x8f\xad\xfe\x79\xfd\x99\xf6\xae\xf5\x52\xb6\x29\xaa" + "\xdc\x36\xaa\x8d\xfd\xfd\x69\xd2\x21\xca\x33\xc7\x7f\x17\x3e\x29" + "\xa5\x1f\x88\xbf\xdf\xa3\xfe\xc6\x37\xfe\x7e\xb3\xfa\xfb\x2a\xfc" + "\x1e\xa3\xfe\x1e\x8b\xdf\x3a\xf5\x37\xe6\xec\x27\x5f\xa9\xbf\xa3" + "\xf1\xfb\x7d\xf5\x37\xd6\x84\x4f\x0e\xa8\xbf\x47\xe3\xf7\xf3\xea" + "\xef\x31\xf8\xbd\x5e\xfd\x8d\x39\xf8\xc9\x93\x4c\xee\xf3\x87\xb7" + "\xb0\x4f\xe6\x0d\x5d\x8e\xfc\xc4\x22\xf7\x92\x3f\x81\xcc\x5d\x3f" + "\x49\xae\x29\x7d\x69\x79\xe8\x9b\x5a\x8d\xbe\x48\x37\xd3\x77\x90" + "\x5e\xe6\x62\x35\xbb\x03\xd2\x8d\x6a\x7e\xac\xff\x1f\x26\x06\xa4" + "\x87\xaa\xe9\x35\x90\x57\x8f\xfa\xd3\x3f\xf6\xa8\xe9\x8d\xc8\x5f" + "\x1f\x90\xde\xae\xa6\x03\x2f\x0f\x35\x04\xa4\xbb\x64\xfa\xdf\x23" + "\x34\xbb\x1a\x35\xfd\x84\x9a\x1e\xeb\x62\x7f\x2a\x09\x48\x3f\xaa" + "\xa6\x03\xff\x3f\x4e\x08\x48\x17\xb8\x22\x7d\x12\x1b\xf8\xe1\x3c" + "\x9a\x5b\x7f\x4f\x75\xb1\x83\xb6\x80\x3c\x55\xea\xbb\x36\x17\xfb" + "\x4b\x65\x40\xfa\x6e\x35\xdd\xee\xd2\x8d\x88\x0e\x48\x2f\x1f\x0c" + "\xab\x74\xe5\x2c\x75\x30\x5d\x3b\xc9\x25\xc2\xbe\x58\xf0\xca\x8d" + "\xc7\xe9\x4c\x93\x61\x07\x6f\x32\xe7\x73\xde\xc4\x1a\xf7\xab\xf6" + "\xb4\x26\xb2\x6d\xa4\xf3\x61\xcd\xac\x71\x87\xea\x5b\xc0\x2d\xce" + "\x8c\xad\xa2\x33\x63\x8d\x82\x07\xbc\xc9\x56\x28\xfd\xe5\x6a\xb1" + "\x17\x48\xe7\xa4\xee\xc7\x23\xcf\x3d\xa4\x83\xa7\x72\x48\x2f\xed" + "\xcc\xe9\x91\xbe\x94\x21\x9b\x52\x1a\xe9\x5e\x88\x1e\x81\x3a\x26" + "\x89\xfb\x8d\xc7\x95\x1e\x3a\x97\x29\xf5\x53\x34\x17\x29\x3f\xd9" + "\x90\x05\xe6\x75\xb1\x46\xe1\xb3\x3a\xc4\x14\xf9\x6c\x77\x51\xe3" + "\x5e\xff\x79\x98\xc6\x50\x35\xbd\x1c\xe9\x35\xfe\xf4\xbf\xbb\x07" + "\xc7\x76\xe0\x9d\x71\xaa\xa5\xf7\x1c\xef\xf4\x9e\xe3\x9e\xd2\x4f" + "\xa5\x2d\x39\xb0\xee\x1a\x9f\x7d\xea\x24\x3a\x2f\x42\x31\x19\xbd" + "\xb9\x9c\xf6\x33\x29\x76\xe5\xe5\xf7\x77\xba\xc1\x63\x74\xf3\x8d" + "\x0b\xc8\x26\xb5\x8b\xd1\x7e\x69\x41\x3b\xc5\xcb\x32\x70\x3a\x87" + "\xbc\xe6\x6b\x16\x41\xe7\x49\xc8\xe6\x9c\xf6\x32\x67\x64\xba\xd9" + "\xf1\x4c\x1f\xdb\x89\xb2\x77\x2c\xd0\xf8\x8b\x93\xe9\xfe\xb3\xae" + "\x53\x68\x7f\xf9\x9a\x02\x11\x7b\xf6\xa4\xf0\xd5\x6b\x58\x4b\xfb" + "\xfc\xf5\x1e\xfe\x36\xf1\xbc\xd5\xb3\x0c\x6b\x19\x78\x8e\x93\x95" + "\xf8\x9d\x20\xff\xf0\x0c\xe9\x83\xb5\x49\xce\xe5\x93\xd2\xdf\x9a" + "\x7d\xea\x1e\x89\x17\x27\x1b\xf9\xbf\xd3\xf9\x89\x93\x2e\xbc\xeb" + "\x71\x47\x56\x0f\x78\xae\x64\xcd\x0e\xa6\xef\xdd\x02\xde\xe4\x74" + "\xb5\x5e\xe2\xd3\xa7\xb5\x8a\x3e\x7c\x2d\xe9\xbf\x45\xfc\xc9\x2d" + "\x73\xd2\xf7\x2e\xf1\xe8\x8f\xaf\x6a\x66\xab\xc7\x30\x53\xb2\x47" + "\x4f\x79\x66\x8c\xcc\x21\x9f\xbe\x07\xc8\xcf\x81\xfe\x0f\x78\x7e" + "\x68\x49\xb5\xde\x2b\xf8\x95\x4f\x6b\x85\xce\xd4\x3e\x67\x12\xad" + "\x21\xce\x06\x1f\xf1\xd8\x11\xe0\xb1\xc9\xa7\x73\xb8\x6f\x45\x66" + "\x94\x77\x59\xe6\xe5\x3b\xb2\x59\x84\x6f\x99\x25\xfa\x99\x73\x6c" + "\x92\xb6\xfe\xec\xc8\xc5\x9a\xd2\x6d\x1a\xb1\x09\x6b\x0a\xe9\x62" + "\x46\xea\x8c\x62\x6f\x98\x7e\x2b\xfa\xb7\x9a\x77\xe6\x5e\x3c\x86" + "\xae\x6f\x85\x45\xf8\x4b\xa0\xba\x0c\xd4\xd6\x0d\xcf\xb1\x50\x9f" + "\x7a\xae\x32\xff\x14\x1b\x0d\xbe\x58\x3f\xb2\x8b\x3b\xda\xb2\x98" + "\x9e\xe2\x8f\xe6\x67\x08\x7d\xe7\xb0\xe3\x99\x5e\xe6\xb4\x7d\xc2" + "\xf2\xb3\xa9\x8f\x3e\x1b\x4f\x7c\x1a\xd9\x18\x23\xbf\xb1\x8d\x7d" + "\x76\xb3\xc1\x83\x35\xc3\x03\x5e\x7b\x11\xc9\xb6\x9f\xdd\x29\xfd" + "\x33\x7c\x56\x42\xe7\x20\x1d\xd9\x53\x28\x2d\xad\xe0\x94\xb0\xe5" + "\x89\x91\x67\x2f\x3f\x9b\x4c\xf7\x05\x74\xce\x33\xea\xd1\xe9\xaf" + "\xf4\x78\x86\x49\x9d\xda\x67\xb7\xcb\x3e\xab\x76\x4b\x99\xed\xb3" + "\x0b\xce\xa8\xf5\xe9\xfa\xed\x77\x27\x72\x8a\x65\x56\x41\xfc\x2b" + "\x77\x89\x7d\x77\x3a\xf3\x6e\xbb\xc3\xc1\xcf\xd9\x55\x1f\x3a\x2e" + "\x9d\xb2\xf9\xee\x44\xe9\xe7\xee\xb3\xf3\x4c\xda\xcc\x61\x8d\xbc" + "\x3b\x49\xee\x39\xdc\x9d\x29\x75\xf0\x77\xdb\x9e\x1a\x4b\x36\xfe" + "\x2e\xd6\x11\x79\x77\x09\xea\x7e\xa2\x23\x2a\x35\x71\xf0\xf5\x68" + "\x9a\xcd\x7c\x0d\x8b\xa6\xbd\x9f\x14\x9f\xf4\xf3\x28\xe7\xf0\xe7" + "\x28\x5b\x3c\x1b\xd7\x64\x65\x21\x52\x36\x74\x3d\x70\x53\x05\x33" + "\xa3\xae\x57\x70\xe3\xdd\x16\x61\x8b\x68\xbf\x7b\x92\xb3\x9d\xe2" + "\xb4\xf8\x98\xdc\xa3\xfb\xdc\xc8\x23\xef\xb6\xa8\xf9\x9f\xaf\x6b" + "\x47\x1b\x8c\x77\x79\x9c\x9e\xaf\x55\x9e\xd0\x85\xb1\x7f\x97\x87" + "\xdb\xef\x0e\x97\xe7\xa5\x5d\x67\x34\x5c\x95\x63\xd4\x75\x4a\xd2" + "\x6d\x9a\x4d\xd2\xed\x73\xa3\xba\x5e\x8d\xa3\xdf\x58\xbb\xe3\xa5" + "\x4d\x89\xab\x51\xe3\x91\x5d\x6a\x1e\x7a\x07\xed\x76\x48\xac\x75" + "\x21\xfd\xb3\x32\xf9\xdc\x55\x49\x69\x68\x1f\xd6\x2c\xd7\x24\x6a" + "\xd7\x60\xd8\x2a\x68\x91\xc7\x42\xd0\x3e\x13\xd9\x5f\x13\x9f\xe2" + "\xec\xbc\xc3\xe1\x14\x7d\xd0\xf4\x2c\xd9\xdb\xd3\x77\xc8\x27\x0e" + "\xe1\x26\xca\x14\x74\xf2\xd7\xff\xf3\x35\x5a\x5d\xe8\x7b\xf4\x8c" + "\xdb\xef\xf2\x08\x79\x19\x6d\xa6\x3c\xd4\xaf\x2d\x56\xd2\xc5\x75" + "\x81\x66\x64\xd7\xd6\xb4\x87\x68\x22\x69\xd6\xb4\x4e\x95\xd5\xd5" + "\x7e\x68\x5a\x19\x4c\x0f\x79\xaf\x18\x81\x0d\xd9\x64\xdf\xd4\xb4" + "\x47\xa5\x9f\x1a\x63\xa0\x49\xf8\x56\x50\x9f\x5d\x11\xf0\xee\xd5" + "\x7d\x79\x51\x6f\xe2\x8d\xc8\x56\x80\xf6\x8e\xe4\x78\x6d\x9a\x14" + "\xf0\xde\xa4\x94\x33\xc4\x23\x4f\xf1\x3c\xb5\x4d\xc4\x6c\x8b\xef" + "\x2e\x6a\x9a\xee\xa7\xb7\x2c\x67\x80\x6f\x5c\xa3\x7d\x03\x79\x22" + "\xb4\x7a\xa2\x7f\xd4\x35\xb8\xc9\xee\xef\x93\xcf\xab\xb4\xf7\x48" + "\x2f\x83\xfb\x64\x8a\x7f\x38\x88\x5f\x78\x9d\x33\x06\x18\xec\xbd" + "\xc3\x21\xc6\x23\xfb\x22\x9c\x6c\xc7\x31\x86\x4c\x72\x0c\x35\xa9" + "\x7a\xa3\x2f\xc2\xa9\x4c\xda\xff\x93\x71\x42\xbe\xc0\x2c\xf8\x3c" + "\x46\x7e\xef\x8b\x68\x59\x87\x2f\x20\xff\xb9\x22\xfa\xcb\x75\x53" + "\xd2\xd2\xcd\xb3\x6e\x16\x67\x46\x6f\x58\x6e\xa5\xe3\xa0\xe9\xfe" + "\x9b\x60\x9e\xdb\xe8\xf7\xad\xf5\x45\x6a\x9f\x6f\x2d\x7b\xf2\x74" + "\x49\xff\x2f\xf6\xf2\x73\xbc\x8c\xce\x73\xf0\x5c\x5e\x5e\x8a\x3e" + "\x2c\xe8\x62\x57\x52\x1c\xda\x7c\x2b\xff\x92\xfc\xae\x01\x2f\xd7" + "\x01\x3f\x4a\xf2\xbb\xd8\x70\xb2\x15\x22\xfc\x21\x7d\x16\x8f\x44" + "\xfa\xe6\x39\x25\xfe\x73\x64\x2d\x64\xc3\x95\xc7\x0b\x92\x28\x7e" + "\x78\x05\x8d\x07\xb2\x1b\x6f\x61\x2d\x49\xc8\x57\x81\x67\x39\x1b" + "\x85\x8e\x60\x8e\xcb\x67\x4c\x8e\x2d\xf8\x9a\x85\x89\x18\x5f\x36" + "\x0f\x33\x2f\xa2\xf3\x46\xcd\x57\xa0\x4c\x17\xd2\x47\x8a\x74\x8f" + "\x87\x7c\x05\xb8\xf0\x6c\x24\x9e\xdd\x83\xab\x82\x32\x6c\xa5\xa8" + "\x77\xfe\xd7\xec\x1a\xd4\xa5\x15\xdf\x71\xa1\x9e\x2d\x05\x8b\xd9" + "\xe8\x3a\x6b\x2b\xc9\x77\x28\xcf\xc5\x54\x7f\x1a\x2e\xbc\xb7\x03" + "\xed\xb2\x91\xae\x03\xd7\xbc\x8d\xb8\xe6\xfb\xd8\xc8\xfc\x35\x58" + "\xf7\xd6\xe0\xfb\x74\x2e\x13\xe5\x90\x0f\x0d\x59\x17\xb4\x8d\x74" + "\x63\x28\x77\x4d\x3b\x6f\x41\xd9\xad\xc7\xdb\x51\x9e\xad\xa1\xaf" + "\x4c\x95\xa7\xc6\xfc\x6e\x79\x80\x6f\x49\x4d\x45\x9d\xca\xc9\x9e" + "\x1a\x69\xc0\xe4\x96\xe9\x7e\x7e\xb8\x65\x86\xfa\xfb\xb2\xbe\xbc" + "\x05\x49\x2c\xff\x3c\x33\x09\x9b\x80\x15\x21\xc0\xe3\x53\x8d\xe4" + "\xab\xc9\xef\xbb\xf3\xd4\x87\xc8\x97\x89\x32\x37\xa8\x65\x52\x5a" + "\xbd\x9f\x7f\x3e\xa5\xf1\xcc\x23\xfa\xf2\x5e\x50\x66\xcb\x4a\x2a" + "\x53\xfa\x55\xfa\xc2\x2c\xcf\x24\x9f\x4a\xee\xf3\x89\x70\x8e\x57" + "\xd1\x99\x3b\x25\x97\xef\x27\x9d\x04\xe9\x42\x48\x7e\xa1\x73\x77" + "\x29\x2b\x4b\x0a\x85\x3e\x62\xb4\xd4\x99\x4a\x9e\xe1\x54\x79\xdf" + "\x19\x81\x6d\x22\x1e\x81\x3c\x53\x47\xe7\xf4\xb2\x85\x3e\xa5\x7b" + "\xe6\xca\x15\x05\xf4\x3e\xbd\x8b\xfc\x47\xfd\x67\x99\x5a\x6c\x52" + "\x77\x97\x9a\x49\xbf\xdd\x5a\xbd\x8a\xbe\x88\x97\xba\xe7\x53\x9d" + "\x7d\xfa\xb7\x5c\x5e\x43\xfd\x24\xce\x18\x92\x0d\xa0\x8f\x95\xa4" + "\x78\x4b\xb4\xb3\xc2\xed\xdd\x45\x2d\xe6\x80\xb3\xc2\xed\xa2\x0e" + "\x3d\xe2\x3c\xfe\x8a\x99\xde\x15\x5c\x9e\x21\x6d\x99\xe6\xff\x76" + "\xb3\x5b\xfd\x76\x2a\xfd\x76\x4b\x9f\x58\x64\x1b\x68\x96\x76\x1d" + "\x2d\x56\xcd\x96\x02\xf3\xad\x81\xc6\xe7\xc0\xbe\xfb\x5b\xca\x83" + "\xfd\xf3\x7c\x99\x49\xbe\xc3\x91\x1e\x70\xfe\xb7\xe5\x92\xe7\x7f" + "\x0b\xdc\xfc\x73\x1a\x43\x56\x11\x87\xf6\x4b\x60\x6d\x72\xac\xf4" + "\x7f\xff\xa5\xd0\xb9\x34\xb1\x2f\x49\x37\x62\x90\xfb\x0e\x5f\x8e" + "\x51\xf1\xa6\x7c\xa6\xcf\x6b\x70\xe1\x9b\xc2\xdf\x8f\xff\xde\x48" + "\xfe\x0b\x90\xef\x1e\xe9\x37\xf8\xcb\xf0\x7e\xf9\xe9\x79\x61\xbf" + "\xfb\x84\x7e\xf7\xe6\x4e\xcc\xc3\xc1\x6c\x46\x36\x8e\x15\xfa\xc8" + "\x49\x23\xd7\x32\x6b\xc1\x57\x2c\x04\xf3\xe3\x14\xd5\xad\xae\x55" + "\x9c\x27\x33\xf0\xa2\x78\xe6\x6c\xf5\x4a\x5e\x14\x3c\x40\x53\x2c" + "\xf2\x7c\xc5\x46\xd3\x79\x06\x8a\x0f\x80\xfc\x6d\x32\x26\x40\xeb" + "\x99\xe4\xe5\x23\x98\xf2\xeb\xa4\xcb\xb9\x7e\x41\x35\xed\x59\xef" + "\xeb\x71\x91\x5f\x7d\x5d\xfe\xb3\x2c\x86\xe6\x1e\xe6\x60\x33\xd7" + "\x3f\x56\x8d\x77\xda\xff\x4f\x4f\xeb\x30\xa7\xf7\x13\x66\x05\x26" + "\xb4\xb1\xd6\xe6\xd0\x3c\x16\xba\xa9\x85\x19\x31\xce\xbc\x87\xbd" + "\x93\x98\x76\xfe\xbe\x22\x4a\x9e\xeb\xae\xc0\x98\x5c\x66\xe2\x9e" + "\xee\xa2\xd6\x04\xc8\x6a\xb3\x35\x99\x7c\x83\xf4\xbf\x15\x8a\xef" + "\xef\x13\xbe\x02\xe4\x9a\x07\xda\xb6\xae\x91\xe7\x19\xa3\xaf\xc4" + "\x3b\x39\x7e\x7e\xfd\x2b\xa6\xee\xe1\xa8\xfb\xce\x5f\xb1\xc3\xe9" + "\x4c\xc4\x34\xea\x10\xfe\xd1\x5b\x2b\xfb\x6c\x6f\x84\x9e\xeb\x2b" + "\xe0\x41\x72\xa2\xe4\xe5\x93\x13\x53\x7c\xe1\x2a\xcf\xf0\x95\x58" + "\x8b\xe8\x5d\xbc\x67\x90\xb1\xcb\x5a\x1b\xfd\x63\xad\x75\x37\xad" + "\x11\x68\x13\x64\xbc\x56\x13\xb5\x8b\x68\xd2\x29\x7c\x6d\xb5\xc6" + "\x1c\xde\x3d\x48\x6c\x0b\xe3\xd4\x3d\x5e\xa1\x33\xa9\xf6\x60\x3c" + "\x7d\x8d\x3e\xf8\x01\xf9\x1b\x72\xe2\x3b\xc7\x77\xf6\xb0\xe3\xa6" + "\x0e\x56\x87\xdf\x64\x63\xef\x58\xf4\x05\x6b\x36\x0f\xbc\x3e\x29" + "\x90\x3b\xc0\x9b\x4f\xa2\xb2\x08\xdf\xc8\x2e\xd1\x99\xc7\xc4\x4e" + "\x93\xb3\x99\x89\x32\x8e\x2b\xad\xec\xb8\x8d\xe4\xb2\x7a\x4f\xdd" + "\xce\x4f\x58\x9d\xe9\x6f\xe2\x3b\xc4\x43\x3a\xb2\x3b\x2e\x56\x36" + "\xe8\x31\x35\x49\x2d\xbb\x1d\x65\x47\x0f\x5e\x76\xf5\xac\x21\x96" + "\x3d\x84\x7a\x57\x27\x0c\xa5\xec\x82\x72\xee\xc3\x9a\x70\x05\x70" + "\xdf\x42\xbe\x2e\xe9\x2c\xa5\xef\x1c\xf9\x09\x19\xc7\xa5\xad\x77" + "\xdb\xc7\x84\x37\xc2\x0e\x61\xf3\x9c\x58\x71\xce\x92\x74\xc7\xea" + "\xf9\x4a\xa7\xf7\x14\x23\x5d\x72\x77\x51\x5b\x8d\x5f\xbe\xea\xdb" + "\x83\x05\x7f\xdb\xd6\x2a\x6d\x7a\xe7\xc4\xca\xb1\xd5\x26\x6c\x1a" + "\x06\x96\xa3\x1e\x9e\x2c\x6d\xc3\xff\x31\x5e\xd3\xd9\x74\x44\x3e" + "\x3c\x59\x2d\xcb\xdc\x5f\x17\xa8\x3a\x77\x31\x67\xd8\x72\xcc\x2b" + "\xb2\x17\xe6\x64\x68\x07\x81\x47\xb0\x07\x33\x1e\xcb\x58\x98\x9b" + "\x91\x6e\x9e\xbd\x3c\x7b\xc9\x0d\x4b\x1f\x7f\xdc\x3c\x23\x63\xd9" + "\xb2\xb4\x5f\x67\x8c\x60\xb3\xb3\xd3\x96\x2c\x5b\x48\xfa\x3a\xb3" + "\x79\xda\xad\x29\x99\x4b\x73\x6e\xf8\xc5\xb4\xf8\x7e\xfa\x3a\x3a" + "\x17\xdc\x48\x7c\x3b\xd6\xca\xd1\x58\x37\x23\xc9\x57\x8c\x61\x25" + "\x77\xac\x86\xcc\x88\x31\xd8\x46\x6b\x0e\xe6\xee\xe7\x24\x4f\x90" + "\xaf\x58\xf2\x3f\xbb\x7d\x1b\xaf\x6f\x61\xbe\x8f\xc1\x8b\x36\x20" + "\x8d\x7c\xbd\x36\x42\x8e\x77\x53\x1f\x20\xfd\x8f\xc8\x53\xf3\x5b" + "\xa4\xb9\x23\x93\x13\x37\x7d\xca\x42\xe5\xba\xd9\x3e\x91\xeb\x87" + "\xf3\x0d\xe4\xb7\xf5\x0b\x13\x53\xfd\x41\xeb\x9d\x2e\x0f\xd9\xaa" + "\x84\xcf\xf4\x16\x70\xc2\x54\x39\xbf\xda\x65\x8c\x14\xc8\x21\xd2" + "\x66\xde\xb7\x95\xe4\x9e\xa7\x44\x2c\xad\x76\xe0\xff\xa7\x0d\x7e" + "\xac\xee\xca\x53\xf9\xcd\x06\xd0\x7d\x45\x13\xee\xa5\xff\x8b\xf6" + "\x7e\xfe\x2f\x4e\xcf\x62\xec\x7c\xb5\xfc\xa3\x77\xce\xd7\xc8\x3f" + "\xfa\x1d\xf8\xe7\xb3\xc9\xbf\xfe\xe9\xff\xea\x9f\xf6\xfd\x7f\xf6" + "\xfd\x73\x13\x2f\xfe\xf7\x6d\xbe\x2f\xda\xfd\x3d\xb6\xff\x5f\x79" + "\xff\xdc\xe4\x8b\xfd\xd1\x78\xc3\xd8\x6a\xfc\xed\xa7\x2c\x1c\xe3" + "\xb3\x6c\xe3\x02\x8c\xe9\x93\xcc\x94\xe7\xe5\xcd\x05\xf3\x58\x4c" + "\xfe\x57\x4c\x4f\xfc\x5f\x8e\x8d\x37\xe7\x9f\x23\x59\xfb\xdc\x15" + "\x18\xbf\xd5\xa5\x4d\x2c\x62\x63\x13\x33\xd6\xe5\xc8\x18\x0c\xb4" + "\x87\x42\xe7\x89\x9c\xb8\xaf\xcd\xf5\xb0\x63\xee\x33\x64\xbb\xe7" + "\xa8\x4b\x05\xf6\x34\x32\x46\xe3\x37\x22\x95\x45\x57\x8c\xe6\x07" + "\x79\xd1\x33\xb3\xb9\xfe\x99\x69\x48\x3b\xf1\xaa\x92\x30\xec\xd5" + "\x55\x47\x87\x99\x17\xd0\x3a\x7f\xba\x4b\x1d\x9b\x6b\xe4\x79\xb9" + "\x2e\x21\x83\xa9\xfe\x7a\xb1\x3e\x75\x9d\x97\x6b\x7a\xd7\xbb\xaa" + "\x8e\x8a\x7e\x0b\x9d\x2b\xda\x51\xcd\x8b\x16\x54\x53\x99\xaf\x28" + "\xd5\xc3\x68\xcd\x7c\x75\x55\xc2\xb0\xbc\x34\xa6\xaf\x73\xb5\xb1" + "\xc3\xc0\x42\xda\xb7\xc5\xbc\xdb\x8b\x79\x56\xb5\x63\x34\xb7\xa3" + "\x7e\x1b\xc0\xcf\x95\xa0\x4e\x7b\xba\x8b\xbe\x49\xc7\xba\x35\x5b" + "\xe5\xe5\x1c\x98\x17\x7b\x37\x22\xcf\xcc\xe5\x6c\xdc\x46\xe4\x03" + "\x6f\x57\x42\x7c\xb7\xac\x5f\xc7\x3c\xd0\x60\x3f\xbe\x59\x6f\x9e" + "\x4f\xf7\x67\x04\x8f\x41\xdf\x46\x3b\xcc\x4d\xcc\x2d\xfc\xe1\xd0" + "\x37\xb4\xef\xa2\x7c\xe0\x5f\x5b\x84\xba\x6f\x66\x97\xe5\x7c\x23" + "\xf9\x30\xfb\x9c\xbd\x14\x17\x4e\x3d\x8f\xb4\x77\xe3\x2a\xac\xeb" + "\x3d\x2c\x1c\xdf\x28\xc3\x37\x1c\x86\xb5\x8c\x1b\xe8\x2c\x6b\xa3" + "\x17\xbc\xba\xa2\xda\x89\xba\x3f\x54\xdf\x15\x7c\x88\xe0\x3d\x7c" + "\xcc\x20\x75\x0e\xe0\x3f\x32\x81\x13\xe0\x39\xc4\x39\x00\xf0\x1b" + "\x94\x8e\x6f\x94\xa1\x5d\xf5\x90\x05\xf7\x63\xed\xae\x22\x5e\x61" + "\x7e\xd7\xbd\x4c\xc4\xc4\x06\xbf\xb0\xcc\xc6\x3d\x32\x46\x96\xdb" + "\xaa\xf1\x0b\x34\x3e\x88\x47\xd8\x38\x9f\x85\xf6\xa2\x8f\x31\x46" + "\x8e\x82\xff\x00\xef\xed\xde\xab\xf6\xcd\x51\xc1\x17\xa8\xb1\x41" + "\x25\x86\xbb\x0f\x60\x7d\x8f\xc0\x37\xc0\xef\xfa\x34\x5f\x4a\xc0" + "\x20\xf7\x51\x6d\xad\x97\xf1\xad\xdd\x7b\x39\xb0\x0e\x74\xdb\x1f" + "\x97\xaa\x83\x8c\xe7\x36\xa2\x2f\xf6\x53\x5e\xf2\xf5\x80\xfc\x90" + "\x39\xbf\xb4\xa9\x7d\xd2\xb8\x31\x97\xf8\x00\x77\x21\xd5\x03\xef" + "\xd4\x82\xd6\xd4\x17\x6a\xdc\x40\xd0\x5e\xf0\x30\x1d\x63\x34\xda" + "\xa3\xaf\xd7\xf9\xe9\x7f\x66\x5a\x20\xfd\x41\x8b\x75\xb2\x0f\xce" + "\x1e\x09\xe8\x3b\xc8\x5a\x67\x2b\x48\xb7\x8a\xef\x1d\x94\x7a\xa1" + "\x33\x6b\xc8\x1f\x17\xc6\xcc\x41\xd0\xe2\x20\xf2\x55\x13\x36\x3f" + "\xf5\x29\x30\x77\x01\xf1\x50\x67\x9f\x96\x3c\xea\xd9\x58\x1a\xc3" + "\xb8\x17\x72\x74\x33\x73\xaf\xa3\xf2\x30\x36\xba\x70\x05\x2f\x7b" + "\xe6\xeb\x82\x0a\x8a\x59\x39\xc7\x43\xfe\xb2\xd4\xbe\x06\x6f\x76" + "\xa6\xcf\xff\x11\x8d\x01\xea\x7b\xb4\x71\x9d\x94\xbd\xcf\x34\x92" + "\xfe\x4c\xbc\xd7\x9b\x49\x75\x6c\xa4\xf9\xa9\x3d\x47\x7a\x2b\xf9" + "\x31\x0d\xa0\xcd\x3a\xb5\x4f\xaa\x65\xfc\xb7\xb3\x6b\xd4\xba\x25" + "\xe1\x3e\x1c\x75\x10\x3a\x95\x8e\xde\xcc\x90\x4d\xf4\x4e\xbe\xff" + "\x1d\x9a\x3f\x18\xcb\x06\xbc\xb3\x1c\x57\xae\xe5\x25\x1f\xe4\xa8" + "\x87\xf7\x19\xe1\x4f\xea\x6c\x74\x47\xaf\x45\x8f\xef\x7a\xf0\x5d" + "\x3d\x8d\x0d\x1a\x17\x5a\x19\x9b\x24\x8d\xf6\xa2\xff\xc4\xf8\x3a" + "\xec\xad\x06\xdd\xcf\x82\xff\xff\xbb\x43\xf2\x77\x67\xbc\x6a\xfd" + "\x1c\x32\x2e\xc1\x3f\xe2\x76\x4a\xdf\x2f\x94\xaf\x2f\xfe\x8d\x9f" + "\xcf\x3c\x23\xfc\x44\xa1\xac\x5a\x75\x4c\x18\xba\x8b\x3a\x22\xfa" + "\xc6\x90\x38\x57\x7f\x76\x03\xf1\x9a\x6a\xfd\x69\xec\x3d\xad\xd2" + "\x2e\x8e\xc6\x00\xf8\xf8\x44\xd9\xcf\xee\x75\xc4\xab\xca\x71\xd8" + "\x31\x4b\x2b\x43\x9e\xcd\x3f\xd3\xa8\xa0\x0c\x6d\xac\x04\x62\x03" + "\xf2\xe6\x01\x17\xfa\xc6\x8d\x86\x05\xb2\xcc\xce\x3f\xaa\xba\x41" + "\x0f\xfa\x86\x7c\x5f\x3b\x84\x6f\x22\x31\x2e\x3b\x4b\x0e\x77\x7a" + "\xd9\x6f\x69\x5c\xce\x27\x4c\xe8\x38\xd5\x11\x95\x6a\xf5\x8f\xed" + "\x8e\x13\xda\xd8\x0e\xe8\x57\x31\xb6\xd7\x09\x3c\xea\x00\x1f\x7d" + "\x93\xb6\x77\xdc\x48\xf3\x5c\xc1\xbc\xde\x94\x2b\x74\xde\x06\xd2" + "\x71\x89\x79\xef\x69\x17\x32\x06\xf5\x67\x9d\xad\x59\xf8\x1b\x7f" + "\x4a\x61\xe1\x75\x9d\xa7\x48\xe6\x6f\xa3\xf9\xaf\xcd\x71\xea\x1b" + "\x7c\xcb\x41\x3e\xe1\xd7\x01\x03\x69\x0e\x76\xa2\x4e\x14\x07\x9d" + "\xfc\x74\xd5\x24\x27\xb0\x65\xe8\xdb\xc3\xa9\xd4\x6f\x9d\x39\x9a" + "\x6d\xff\x26\x89\x01\x11\xea\x78\x11\x75\xec\x47\x57\x83\xa4\x6b" + "\xe7\x9e\xe0\xf9\x7d\x36\x91\xe6\x77\x20\x5d\x89\xa6\x44\x5b\xe4" + "\x45\xfb\xbf\xaa\xd2\xe8\xea\xa7\x69\xd7\x9d\xea\x78\x54\xb1\xb5" + "\x6b\x40\x6c\xdd\x24\xfd\xef\x57\x3f\x45\x6d\xc1\x9a\x42\xdf\x17" + "\xf1\x65\x54\xd9\xa7\xc6\x4d\x63\xaa\x6b\x92\x8b\xa5\x27\x6a\x38" + "\x86\xfa\xd8\x69\x3c\x51\x5f\x69\xd8\x41\xfa\x1f\x59\xf7\xae\x74" + "\xad\x3f\xa8\xde\x81\x98\x80\x3a\xbc\x46\xf7\xfe\x36\x77\x6d\xc5" + "\x7b\x51\x84\x6d\x7e\xfe\xaa\x6b\x77\x70\xdb\xbb\x36\x50\xdb\x69" + "\x4c\x58\x73\x49\x07\x24\xd7\x32\x17\xfb\xc6\x14\x8c\x57\xdf\x5c" + "\x21\x6d\x0d\x24\x3f\x46\x78\x6f\x9d\x2f\xf3\xd3\xfa\x86\xfc\x42" + "\x27\xaa\xae\x87\x79\xb4\xfe\x21\x2d\x54\xa5\x41\x23\xf2\xd7\xd0" + "\x79\x61\xf2\x19\x73\x79\xa3\x94\x05\x81\xd1\x07\x29\x0e\x81\x8b" + "\x9d\xae\xa9\x43\xa9\xde\x30\xc6\x2a\x54\x7e\x93\x70\x82\xaf\x48" + "\xba\x7c\x45\x2b\xbb\xcc\xfa\x0b\xfe\x05\xd6\xf3\xb7\x30\x8f\x3c" + "\xe4\xc3\x10\x65\x9b\x5b\xd8\xf9\xe7\xf1\xdd\x68\xf5\x6a\xc2\x75" + "\x3d\xae\x63\x70\x7d\x12\xd7\xab\x70\x7d\x04\xf9\x15\x35\x7f\x3c" + "\xee\x7f\x89\xf4\x5b\xd5\x2b\xea\x78\xae\x1a\xd7\x59\xbf\x25\xbe" + "\x72\xbe\x48\x1f\x45\xf7\xb8\x0e\x53\xdb\x5d\x2b\xe7\xf6\xb9\x53" + "\x28\xc7\x46\xf9\x68\x5d\x43\x9a\xb5\x85\x79\xde\xa5\xb2\xe9\xfc" + "\x3e\x7e\xaf\x09\xe0\x4f\x51\x4e\xf7\x8b\xb8\x4e\xc4\x75\x31\xae" + "\x39\xb8\xde\x4c\xe5\x82\x06\xf5\x7e\xbc\x70\xaf\x4b\xb7\xc9\xfe" + "\x74\xb1\x0e\x92\x31\xa3\x35\x3c\xa0\xf1\x14\x94\x2f\x59\xe6\x93" + "\xf2\x6b\x77\xaa\xd6\x77\x5e\x39\x6e\xa3\xbd\xe8\x3b\x94\xff\x4b" + "\x7a\x1f\xd7\xa9\xea\x35\x41\xbd\xde\xa9\x5e\xef\x56\xaf\xd3\xd4" + "\x6b\xa2\x8b\x75\xc7\xab\xbc\x09\x68\xd6\x1d\x4f\x34\xc1\xdc\x4d" + "\x95\xdf\xf5\xa4\x93\x7c\x0d\xfc\xff\x49\x07\xc5\x14\x2b\xea\x6e" + "\xd0\x74\xb1\xa4\xfb\xe9\x2d\xfa\xc7\xdd\xdb\x85\xee\xa7\xdb\x1d" + "\x80\x85\xa6\x08\x5d\x02\x03\xef\x14\x56\xa1\x07\xdf\x20\xcb\x49" + "\xd4\xab\x7b\xd0\x14\x5b\x83\x62\xa5\x91\xef\x38\x21\x47\x45\xd6" + "\xd3\x5e\x5e\xa3\xd0\x53\x6f\x26\x5f\x38\xc9\x31\xf8\x23\x5f\x71" + "\x71\x1a\xde\x93\xbc\xa4\xfa\x88\x3c\xd4\x5d\xe4\x49\xf6\xcb\xf9" + "\x9e\x08\xb9\x5f\x77\xe5\x78\xa4\x07\xc8\xff\xdd\x47\xa9\xce\xa0" + "\x75\x03\xda\x33\xb1\x89\x79\x48\x87\x79\x4b\xb3\x6c\x73\xbc\xd6" + "\x66\xb5\xaf\xac\x1a\xcd\x9b\x59\xf7\x24\xe0\x61\x36\x8d\xef\xa6" + "\x3e\x5c\xee\x16\xfa\x69\x75\xfc\xa0\x9f\xcf\x7d\x45\xfd\x1d\x80" + "\x27\x79\x7e\x9c\xf6\x78\x82\xfb\xc5\xed\xf1\x4a\x7e\xa1\x01\xf3" + "\x12\x63\xe0\x9c\xa3\xdf\xbc\xdc\x40\xf3\x52\xbe\x7b\x7e\x62\x30" + "\xc6\x77\x6d\x20\x8c\x57\xeb\x88\x71\x7b\xae\x92\xfa\xc6\xc5\xce" + "\x47\xab\x6b\x52\x03\xd6\xc8\x9f\x20\xbd\x44\xd6\x53\xa6\xab\xdf" + "\xc2\xf8\x3b\x47\xbe\x27\xae\xd2\xd2\xd5\xf1\x4d\xe5\xd8\xa8\xaf" + "\xb5\x74\xb5\x7c\x8c\xd3\x73\x56\x9a\x3f\x5a\xba\x3a\x26\x8f\x12" + "\xde\xd0\xbb\x5e\x61\x77\x07\xf9\x7b\x7e\x0d\xea\x7d\x9e\x74\x8a" + "\x95\x34\x9f\x9f\x5a\xc5\x22\x56\x94\xb3\x2b\xe4\xdc\xec\x19\xa5" + "\xbd\x2b\xf5\xd4\x3d\xe1\x1a\x46\x6d\x12\x78\xd6\x99\x17\x8c\x95" + "\xde\xdf\xf1\x22\x83\xd7\x6b\x4c\x8e\x3e\xee\x9d\x28\x30\x17\xf3" + "\xbe\x02\xef\x25\xb8\xd8\x33\x4c\x5d\x4b\x6a\xe5\x3e\x41\xcf\xf2" + "\xe3\x95\x12\xbb\xd4\xb2\xfb\xf0\x2f\x80\x0f\x11\x58\x4f\xdf\xa2" + "\xb2\xb0\xae\x18\x3b\x0b\x92\x2e\x97\xf8\xdd\x53\xe6\x62\x97\xc7" + "\x6a\xd8\x4a\xeb\x93\x41\xc7\xac\xa5\xf3\xe5\xfa\xa4\x90\x0e\xcc" + "\xda\x29\x7c\x7f\xd5\x59\xdb\x19\xad\x9b\xe4\x93\x39\x65\xe5\x08" + "\xf2\x8d\x94\x84\xba\xae\x07\x7f\xb6\x5b\xdd\x6f\x80\x9c\xeb\xfd" + "\x39\xc9\xb2\x2a\x5d\x31\x9f\xbc\x57\xab\xfd\xd2\x88\xfa\xec\x26" + "\x6c\x7f\x2a\x57\xc6\xa7\x21\x7d\x90\x88\x67\x44\x3c\xab\x89\x7b" + "\xa4\x7f\xf9\xde\xd8\x00\x1d\x57\xa5\x9c\x27\x3d\x97\x89\xd8\x00" + "\xf6\xe4\x68\xa9\x4f\xec\x7d\x4d\xa6\xf7\xaa\xbe\xaa\x92\x55\x7f" + "\x57\xbd\x85\x21\xa6\xd1\xff\x4b\xea\x85\xff\xb1\x40\xf2\x23\xbd" + "\x39\x01\x76\x2c\x82\xd6\xd2\xf7\x6c\xef\x06\xff\xbc\xe8\x4d\xa5" + "\x77\xf0\xee\x73\x48\xef\xf3\xff\x25\xd7\x1a\xb7\x4d\xd5\x99\x99" + "\x2e\x5f\x9b\xc0\x80\xcd\x61\xdb\x8b\xb4\xf9\xeb\x0d\x95\xdf\x97" + "\xf3\x97\xda\x48\xe3\x81\xe6\xb0\x57\xf8\xaf\xaa\xcf\xa4\xb9\x8c" + "\xdf\x31\x5e\x6d\xee\x4a\xfe\x2e\x4f\xcc\x5d\x31\x6f\xbd\xd1\x01" + "\xf5\xa8\x55\xc7\x6a\x63\xc7\x63\xa6\x08\x3c\xc3\x9c\x6c\x53\xfd" + "\x03\xf5\x48\x19\x63\xf3\x34\x9b\x72\x8e\x7b\x48\x37\x4d\xfa\x04" + "\xd2\xd9\xa8\xb6\x95\xa4\xff\xef\x24\x9f\x5c\x76\xcc\x07\xbf\x1f" + "\x2e\x23\xd3\xfc\x70\xa1\xbc\x42\xbf\xee\xb8\xc7\xa5\xb6\x2b\x1a" + "\xdf\xab\x70\xe4\xbf\x4d\x74\x7e\x5f\xce\xb1\x9e\x7a\x1a\xc7\x4e" + "\x8c\x3d\xac\x3f\xe5\x14\xef\x1c\xef\x1e\xd4\xc6\x1e\xe6\x68\x7a" + "\x0b\xf3\xcd\x28\x1b\xcd\xcb\xd1\xa7\x64\x1f\x9e\x85\xfb\x9f\xe3" + "\x9a\x2e\xaf\x3a\x23\x5d\xd5\x31\x5f\x8e\x77\x31\xff\x47\x1c\xd5" + "\xfa\xa0\x33\xb2\xda\x2a\xc6\x58\x3e\xd9\xec\xc5\x8b\xfd\x6b\x1a" + "\x63\x34\xbe\xc4\x3e\x36\xc6\x9a\x61\xed\xbd\x8c\xc6\x99\xf0\xcd" + "\x81\x7b\xaa\x2f\x8d\xb3\xee\x22\xdf\x34\xcd\x0f\xad\x8b\x79\x5b" + "\xe5\x1e\x92\x2f\x49\xb3\x59\xa6\x71\x98\x33\x9e\x8d\x42\xf9\xe6" + "\x1a\x73\x27\xe9\xce\x3f\x73\x7a\xef\x64\x94\x97\x68\x27\xf1\xf2" + "\xca\x1c\xbc\x13\xd0\xff\x6e\x61\xc3\x72\x38\x59\xe8\x33\x7f\x80" + "\x67\x7b\x82\x31\xa7\x7d\xa2\xe0\x2b\xb1\x3e\xff\x30\x9a\x99\x31" + "\x6e\xb1\xd6\xf8\x6a\x35\x7e\xf8\xa6\x68\xb2\x21\xf8\x87\x88\x15" + "\x4e\x3c\x09\x7e\xd7\xd2\x3a\x3d\x88\xde\x79\x22\xe9\x8a\x08\x33" + "\x48\xf7\x44\x7a\x30\xd0\xfa\x44\x8b\x4e\x37\xe3\x38\xf9\xc9\x59" + "\x7a\xa1\x2f\xe2\x7c\x1b\xef\x22\xbf\x4d\xe6\x6c\xf6\x83\x26\x9d" + "\x2e\x9e\xf4\x4e\x05\x67\x48\xc7\xa3\xcc\x0e\xd6\xf1\x28\xbb\xd5" + "\xbf\x6a\x94\x14\x13\xf0\xb7\x57\xbd\x5a\x2e\xf1\x57\xa3\xe6\xad" + "\xc7\x5f\xa3\x4a\xab\xfd\xdd\x45\x4a\xb5\x46\x2b\xc2\x14\xc2\x58" + "\xb2\x1d\xa1\x79\xae\xf3\x32\xf2\xcb\x83\x7e\x42\xbd\x9f\xfa\xd1" + "\x83\x8e\x55\x24\xd3\x2a\xc2\x06\x8a\x7c\xca\x0e\xcd\x7e\x49\x11" + "\xfd\x29\x7d\x7e\x2a\x7b\xf1\xed\x9a\x4d\xa7\x59\xa8\x35\x9b\x5d" + "\x4d\x3a\x74\x83\x8f\x3b\x48\x06\x36\xc8\xf8\xec\xf5\x6d\x8c\xef" + "\xcb\x59\xc3\xf4\x78\x3e\x0e\xbf\x2b\x34\x5e\x0a\xef\x18\x43\x3c" + "\x2c\x9a\x78\xa8\xa9\x6b\xd8\xb8\xee\x22\x6e\xd3\xfa\x8a\xf8\x0c" + "\xd2\xe3\xf9\x63\x07\x29\xc2\x2e\x8b\xfc\xab\xbb\x04\xdd\x54\xac" + "\x3a\x4d\xba\x6b\x9e\x1e\xd2\xc9\x8c\x72\x1d\xe2\x18\xff\xff\xc8" + "\x93\xe3\x85\x17\x62\xec\x9f\x08\xa8\xe7\x39\xff\x6f\xd3\x4f\xe9" + "\x7d\x43\x27\xf1\x70\x83\xd0\x47\xc7\x2e\xd3\xe8\x43\x36\xf2\x06" + "\xf0\xff\xa2\xbf\xbd\xbc\x1d\x75\xab\xb5\xae\x62\xe1\x6d\x3a\x76" + "\x1e\x6d\xa4\x33\xa8\x47\x85\x8e\x5f\xc7\xbe\xd6\xe4\x74\x51\x6f" + "\x1d\x3b\x60\x58\x1b\xc2\x48\x37\x4f\xbe\x09\x85\x7d\x21\x58\x52" + "\xe2\xe1\x9d\xde\xc9\xcc\x91\x7f\x1b\xe5\x79\x5a\x5d\xcb\x1a\x3b" + "\x0a\x4c\xec\xb0\x69\x32\xeb\x2e\x66\xeb\x5c\xfa\x33\xb1\x43\xb6" + "\xe3\xd4\x31\x6d\x1f\xbc\x56\xd8\x3f\xe8\xd8\x43\xb4\x96\x90\x6e" + "\x00\xeb\x48\x0d\xad\xd7\x28\xdb\xa5\xcd\x1b\xac\x13\x35\x78\x67" + "\xb6\xc4\x98\x29\x1e\xfc\x9e\x45\xfe\x51\x84\xfc\x20\xf3\x47\x88" + "\x7d\x83\x62\x5d\x74\x1f\xbf\x8d\x7c\xf4\x9e\xb0\x8b\xd3\x91\xaf" + "\x21\x1d\xc3\x7b\x16\x6a\x9b\x1c\x8b\xa6\xc9\xc8\x3f\xcd\x3f\x6f" + "\x79\xa1\x98\xb7\xed\x01\xf3\xb2\x58\x97\xee\x97\x53\x15\xd3\x0d" + "\x65\xcc\x3c\xd0\x3c\xb4\x8e\x64\xc6\x7f\x84\xb3\x5f\x6d\xda\xc4" + "\x2b\xed\x7a\x65\xca\x53\xa5\x2c\x42\xb7\x01\x64\xa3\x79\x96\x9b" + "\x3a\x0a\xf3\xf1\x94\x21\xe2\xca\x59\x53\x73\x86\xf3\x7c\x13\xd3" + "\x6f\x3c\x3b\x3c\x7c\xbc\xe7\xca\x4a\x1e\xf2\xa3\x07\x67\xe4\xd0" + "\x7e\xae\x9d\x7d\x99\xc5\x42\xa6\xfa\xf0\xed\x08\x66\x75\xe9\x42" + "\xdc\x74\x9e\xfa\x30\x38\x2f\xfa\x4d\x65\xe6\x55\xb0\xf0\xbc\x66" + "\xde\xba\xe1\xf1\x61\xe1\x58\x7f\x8d\x58\x37\x4a\x2e\x8f\xb8\xb2" + "\xb2\x17\x65\xbc\x95\x2a\xde\xab\x1a\x7a\xdd\xac\xa3\x5b\x74\xfa" + "\xb5\x43\xab\xdb\xb0\x78\x7f\xdd\x86\xc5\x7f\xc7\x75\x33\xfa\xeb" + "\x96\x89\xba\x85\x5c\x3d\xb4\xba\x85\x59\xfd\x75\x0b\xb3\x7e\xcb" + "\xba\xed\x1d\x7a\xdd\x6c\x57\xa2\x6e\x07\x86\x56\xb7\xe1\x55\xfe" + "\xba\x0d\xaf\xfa\x57\xea\x96\x5f\xc1\x4f\xd5\x01\x81\x49\x9f\x43" + "\x38\xdf\xa2\x0b\x7d\x63\x4d\x8c\xb0\x4d\x8e\xc2\xef\x27\x0b\x2a" + "\xf8\x17\x82\xb7\xd1\x85\x0a\xdd\x7f\x77\x71\x68\x1c\xe4\x52\x19" + "\x07\x48\x37\x2c\x46\xd8\x6e\x84\x8c\xdd\xc3\x8b\xb8\xf7\xc6\x4e" + "\xb2\x83\xf3\x92\x0f\x11\xf2\xcf\x3d\xeb\xd5\x73\x1e\x3d\x8f\x4a" + "\x4e\xdd\x75\x36\x94\xbd\x7a\xce\xad\xc7\xbb\x99\x9a\xdf\x50\xed" + "\x5d\x43\xf9\xc5\xf0\x28\x74\xc7\xd4\x4c\x66\x20\x3c\xa2\x2b\xc5" + "\x26\xdc\x94\x3f\x3c\x7c\xea\x19\xac\xfb\xc5\xa1\xfb\xb5\x73\xa1" + "\x5a\x59\x33\x5b\x87\x73\x43\x1e\x0b\xa1\xb3\xa9\xc2\xc7\xa0\xc9" + "\xcd\x62\xf3\xd8\xb0\x99\x36\x94\xef\x61\xa9\x06\x1b\xca\x06\x3d" + "\x04\x2f\xaf\x0b\x3d\x1f\x92\xc5\x22\xca\x50\x36\x5d\xa7\x9a\x0a" + "\xf8\x53\xcf\xb2\x50\x3a\xc3\x4a\x67\x51\xe5\x39\xd4\xb0\xf0\xee" + "\xe2\x61\x31\xda\x77\x2e\x41\xbf\x91\x92\x7e\xc3\x7c\x7e\xfa\x0d" + "\x7b\xcd\x4f\xbf\x61\xcb\x25\xfd\x86\x65\xf9\xe9\x17\x96\x3c\x34" + "\xfa\x0d\xdb\xe3\xa7\x9f\x7c\xf7\xe2\xf4\x1b\x76\x72\x70\xfa\x0d" + "\xeb\xf4\xd3\x4f\x96\x35\x08\xfd\xc2\x06\xa6\x5f\xd8\xcf\xbf\x1d" + "\xfd\xc2\x92\xbf\x25\xfd\xae\x90\xf4\x1b\x7e\xbb\x9f\x7e\x61\x67" + "\xfc\xf4\x0b\xfb\xa3\xa4\x5f\xd8\x5e\x3f\xfd\x86\x57\x0c\x8d\x7e" + "\x61\xad\x7e\xfa\xc9\x77\x2f\x4e\xbf\xe1\x57\x0f\x4e\xbf\xe1\x13" + "\xfd\xf4\x93\x65\x0d\x8d\x7e\xc3\x57\x82\x6e\x46\x95\x7e\xc6\xc1" + "\xe9\x37\xbc\xe2\x5b\xd2\xcf\x20\xe9\x17\xbe\xc6\x4f\xbf\xf0\x9b" + "\xfd\xf4\x1b\xde\x25\xe9\x37\xbc\xdd\x4f\xbf\xf0\xc6\xa1\xd1\x2f" + "\xdc\xe2\xa7\x9f\x7c\xf7\xe2\xf4\x0b\x9f\x37\x38\xfd\xc2\x73\xfc" + "\xf4\x93\x65\x0d\x42\xbf\xe1\x03\xd3\x2f\xfc\xc0\xb7\xa3\x5f\x78" + "\xe3\xc5\xe8\x37\x34\x5e\x23\x7c\x50\xbb\xe2\xa1\x95\x73\xd9\xa4" + "\xc1\xca\x21\x1a\x92\xcd\x9d\x52\x7c\xd9\xa4\x9d\x4a\x58\xb8\x3c" + "\x97\x10\x4e\xb1\xcf\xee\x68\xd2\x5d\xf6\xf4\x4e\x65\x58\x38\x2f" + "\xfa\x6b\x95\x52\xf4\x6e\x12\x5f\x1b\x16\xaa\xac\x1d\x1e\x4a\xe7" + "\xe6\x07\x8d\x75\xac\xbb\xec\x54\xc8\x18\x76\x0d\x9d\x2d\x7b\x0a" + "\xfc\x1a\xfd\xee\x2e\xbe\xcc\x0d\x5e\xe4\x02\x3f\xdc\xe9\x0b\x97" + "\x89\xc0\x89\xd9\x19\xe9\xcb\x97\xa4\xa7\x2d\xc9\x31\xa7\x3d\xf6" + "\xc4\xb2\x60\xbf\xe6\x22\xe6\xe0\x3a\xea\xbf\x11\x13\xfb\x7c\x99" + "\x80\x8f\x25\x9f\x70\xd6\x6b\xd9\x65\x6d\xba\x11\x39\xc2\xd7\x7c" + "\x54\x72\x2d\xef\x4d\x7a\x2e\xe1\x87\xfc\x4d\xe1\xeb\xae\x37\xf3" + "\x39\xc8\x53\x1b\xc8\x7f\x89\xba\x37\xb1\xa1\x45\x17\xb1\x91\x47" + "\xa6\x19\xc9\xa6\x43\x9c\x57\xd0\x8d\x10\xfe\x11\xc9\xaf\x09\x37" + "\xce\x69\x56\xec\x69\x46\xbe\x39\x4d\xd0\xa0\x8e\xfc\x8c\xe5\x86" + "\x8c\x6b\xd2\x8d\x9c\xc5\x23\xe7\x34\xa3\xac\x56\xb5\x9c\x56\xb2" + "\x81\x4c\x58\xc5\x3f\xa3\xf2\x54\x5e\x90\x62\x49\x38\x24\x3f\x78" + "\xf9\x65\x86\xb5\xe6\x10\xca\x4b\xfe\xfe\xc8\x0f\x9e\x16\x3f\x88" + "\xea\x4d\x79\xc1\x8f\xdf\x81\xf7\xef\xd8\x45\xf1\x81\xb4\x32\x64" + "\x9d\x7e\xd0\xa6\xbb\x3c\x41\xb4\xc5\x3e\xc7\xde\xb1\x3a\xe9\x39" + "\x11\x53\x50\xd0\x75\xe4\x4f\xf0\x6d\x51\x06\xf9\xe1\xa2\x77\xd5" + "\x77\xae\xc6\x3b\x02\x4f\xc9\xc7\xa7\x2c\x63\xe4\xd5\x5a\xbd\xc0" + "\x43\x8f\xc0\xfd\xb0\x80\x6f\x5c\xde\xa6\xbb\xe2\xeb\x80\xe7\x11" + "\xb8\x7f\x1f\x7c\x68\xa4\xfa\xfc\x0a\xdc\xff\x91\xf8\x52\xd1\xae" + "\xd2\x42\x69\xe7\xab\xbb\xa2\x1c\x69\x1a\xed\x22\x91\x67\x0d\xf1" + "\xba\x6a\x19\x51\xb8\x4f\x23\x99\x51\x7d\x1e\x8d\xfb\x3b\x69\x5f" + "\x40\x7d\x3e\x0a\xf7\xd7\xe3\xfe\xdf\xd4\xe7\xe0\xeb\x23\x52\x45" + "\x9d\x8d\x73\x1a\xa9\x4d\x8a\x3d\xd5\x4d\x74\x07\xad\x1b\x91\xb6" + "\x01\xf2\x6a\x01\xf5\x23\xb5\xd3\xb1\xaa\x8d\x35\xe9\x22\x1e\xa2" + "\xb3\x66\xb2\xaf\xd2\x8c\xd2\x0f\x8d\x3e\x09\xe9\xb3\x29\x9d\xec" + "\xa5\x95\xcd\xa9\x84\x43\xc0\x9e\x88\xaf\x89\x86\xea\xb7\xc6\xe1" + "\x5b\x79\x6a\x3f\x83\x76\xe4\x2b\x96\x15\xee\x52\xfb\x02\x75\x1b" + "\x8e\xe7\x1f\x6b\xf6\x17\x33\xbd\xbd\xf2\xcc\x8c\x2e\x62\xf7\x3f" + "\xe5\x1b\x01\xef\x49\xdc\x8b\x68\xd6\xe2\xca\x21\x4d\xc4\xaa\xa7" + "\xf1\x49\xfa\x15\x77\xe4\x1c\x9b\xf0\x05\x82\x31\xaa\x8d\x15\x1a" + "\x27\x3c\xec\x32\xaf\xd0\xd5\x14\x5f\xe1\x8f\x7f\xa2\x8b\x48\x56" + "\x7d\xf1\x33\x29\x27\x5c\x31\xb9\xcf\xbe\x48\x77\xb9\xc0\x87\x80" + "\x67\x49\x01\xcf\x5c\xda\x33\x61\x03\x57\x7c\x45\x4e\xc0\xb3\xfa" + "\x7e\xcf\xec\x01\xcf\x1c\xfd\xca\xdc\x1b\xf0\xac\xaa\xdf\x7b\x47" + "\x03\x9e\x55\xf4\x7b\xd6\x1c\xf0\x6c\x83\xfa\x2c\x04\xe9\xde\x3e" + "\x5f\x7c\xba\xcb\xf3\xd4\x74\x60\xfd\xc8\xe8\x80\xf4\x2c\x35\x1d" + "\xdf\x1f\x09\xfe\xef\xf5\x2a\x35\x5d\x8c\x73\x8c\xa3\xeb\xe4\x37" + "\x46\x26\x06\x7c\x63\xb2\xba\x7f\x6c\x93\xfd\x37\x62\xbf\x41\x67" + "\x1e\x4e\x63\xca\xb0\xb6\x90\xe2\xba\xd8\xa5\xdf\x29\x39\x0f\x45" + "\x4c\x5f\x92\x87\x91\x6f\x30\x6c\x1c\xd0\x46\xb0\x78\xe4\x41\xed" + "\x6c\xa6\xcf\x3e\x27\x4f\xb1\x1f\xa0\x18\x4a\xe3\xc8\x3f\x55\x41" + "\x3b\xf9\x28\xe9\x64\x4e\xd6\xc3\x9c\x39\xdd\x85\x14\x2f\xae\x4e" + "\xc6\x89\xa3\x33\x6d\x3a\x3a\xb3\x41\x3e\xb6\xea\xac\x5f\x8b\x58" + "\x71\x2b\xda\x59\x8c\xf5\x17\xbc\xb9\x45\x67\x30\xfb\x36\xcf\xc9" + "\x53\xfd\x0c\x3c\x2b\xce\x42\xeb\x0c\x72\x7e\x90\x1c\xdb\x2e\x74" + "\xcb\xe1\xc8\x57\x25\xf2\xf0\xa4\x67\x65\x1b\x0d\xa2\x3f\x76\xa9" + "\xe7\xe3\xba\x8b\x0d\x49\x7d\xf1\x0b\x75\x86\xfd\x5d\x91\x65\x26" + "\xa4\x65\x05\xd9\x34\xea\x0c\x4f\x53\x99\x54\x77\xe4\xb1\x50\xd9" + "\xc8\x63\xef\xb3\x69\x44\xfa\x0a\x2f\x1b\x8b\x7a\xb5\x68\xe5\xe3" + "\x79\x95\x4b\x37\x52\xd8\x47\x53\x99\x5d\x9b\x5f\xa7\x72\x6b\x5c" + "\xa1\xd7\x09\xfd\x24\x7e\xd7\xbb\xd8\x3b\xa1\x83\xad\x79\x42\x0f" + "\x69\x4c\xb3\x70\x7b\x5a\x3c\x30\xd6\x2c\xcf\xa4\xa7\x59\xa4\xfc" + "\x6e\xbc\x9a\x6c\x2e\x28\x06\x32\xed\x35\x4a\xac\x31\xa6\x89\xf9" + "\x8a\x34\xf4\xd1\x1e\x60\xb2\xd0\xc7\x0f\x6d\x1e\x1a\xe3\x44\x19" + "\x67\x59\x78\xa9\x6a\xe7\xda\x5d\x6c\xb4\x05\xc4\x11\x90\x76\xec" + "\x3a\xe3\xf3\x75\x36\xb1\xdf\x24\xea\xd8\xbf\x0e\x54\x5f\x94\x15" + "\x33\xe8\xfa\x69\x4c\x33\x0b\xdd\xe7\x96\x64\xab\xb0\x1f\xd3\x19" + "\xbf\x0a\x31\x5d\xb5\x0d\xdf\x6a\xee\x8b\x9f\x80\x3c\xa5\x3d\xe4" + "\x97\x2d\xcd\xd2\xd7\xce\x6c\xfa\x46\xa4\xd8\x9f\x70\xe9\x22\xcd" + "\xca\xe6\x34\x33\xd5\x41\x4d\x37\xd7\x79\x3d\x74\xf6\x7b\x40\xff" + "\x4e\xb4\x2e\x0a\xdf\x40\x5b\xd2\xcc\x74\x0e\xe0\x26\x8f\x56\xe7" + "\x28\x33\xd9\x9f\x53\x9d\x25\x6d\xa3\x46\x69\x74\xdc\x78\x16\x65" + "\xe7\x7f\xc2\x9a\x75\x91\x3b\xc8\xa6\x85\xce\x53\x6c\x5a\xa5\xda" + "\x59\x21\x4d\xe4\xeb\xe9\xcb\x23\x74\xbd\x64\xe3\x4b\x18\xba\x93" + "\xce\xc5\xa3\xcc\x52\xf4\x85\xf0\x79\xa1\x8b\x14\x67\x21\x9e\xca" + "\x66\xb2\xdd\x64\xc3\xa6\x8b\x9a\x26\xc7\x4a\x64\xa3\x4b\x17\x25" + "\xcf\x71\xab\x69\x14\x43\x9b\x6c\x0f\x4e\xeb\x22\xdf\xa0\x98\x9e" + "\xa0\x47\x3c\xf9\x45\xab\xeb\xc4\x3c\xb1\xf5\xd0\x58\x88\xa7\xd8" + "\x6d\xa0\xc3\x41\xb9\x26\x10\xcd\x23\x2b\xe9\xfb\x44\x5b\x8a\x67" + "\x0a\x9a\xee\xee\x2e\x8e\xea\x8b\xff\x45\xb1\x53\x91\x67\xf6\x60" + "\xfd\x42\x34\xf2\xa1\xce\xe4\xdf\xc3\x31\xf6\x13\xd4\xef\x07\x3a" + "\x25\x2a\xcd\x4c\x36\x93\xa8\xeb\xef\x24\x56\xc8\xbe\x93\x73\x29" + "\xea\x63\x7c\xc3\x49\xfb\x8b\x64\x8f\x2d\xe2\x40\xeb\xa2\x0a\x55" + "\xfa\x89\x78\x0a\xf6\x5c\x49\x07\x99\xff\x07\x13\xa5\x2e\xe6\xaa" + "\x0f\x51\xaf\xfa\x3e\x5d\x0c\xd2\x85\x1e\x4d\xb5\xab\xc6\xb3\xf6" + "\x80\x3a\x77\x8a\xf3\x6c\x67\x49\x8e\x8e\x2a\xa3\x6f\x6d\x24\xbf" + "\x55\x34\x2e\xda\x02\xc7\x7f\xd4\x72\xaa\x27\xd9\xe3\xf9\x22\x93" + "\xad\x7c\x73\x72\x0e\xd1\x19\xef\xec\xc5\x5c\x18\x50\x8f\x43\x58" + "\x49\x31\x35\xba\x8b\x7f\x90\x1c\x10\x03\x15\x6b\xdf\x0f\x36\x6a" + "\x6b\x1b\xad\xcb\xe4\x87\xa0\x2f\x6d\x73\x7d\x03\xe6\xbb\x43\xe5" + "\x6b\x1c\x83\xfa\xd0\xbb\x91\xc5\xd3\x99\x59\xb2\xcd\xa6\xf1\xc6" + "\x8d\xf5\x36\xf2\xcb\x4b\x3e\x06\x1d\xab\x6e\x41\x7d\xa3\x6f\x7f" + "\x66\xb4\x38\xa7\xd7\xe9\xb8\xf1\x2c\xd9\xe5\xb4\xb7\xe4\x09\xdf" + "\x39\xe1\x33\x6d\x5e\xbe\x4b\xc6\x39\x76\xf3\xc8\x7a\x5a\x73\xdb" + "\x85\x5f\x7a\x2a\xf3\x9f\xf5\x31\xab\x8b\x0e\x57\xf9\x97\x76\x60" + "\xe5\x95\x68\x8f\xd8\x2f\xc0\xef\xd1\x6d\xba\x51\x19\x32\x6e\x9f" + "\xf4\x93\xae\xda\x17\x86\xc9\x73\xe6\x6e\x26\xce\xfd\xea\xa2\x3f" + "\x36\xff\x88\xb1\x76\x5d\xf4\x49\xe1\xb3\xd8\x3e\xa7\x5e\xa5\x41" + "\xfd\x26\x59\x2f\x43\x8a\x4d\x2f\xea\x48\xf5\x1b\x62\xdd\x76\xab" + "\x6b\x57\x58\x77\x71\x74\xab\x76\x3e\x5d\xb4\x5f\xf5\x65\xec\xb8" + "\x96\x64\x95\x51\x0f\xa9\xeb\xd5\x09\xf5\xdb\x27\xfe\xf5\x6f\x8f" + "\x32\xab\x65\xee\x11\xfe\x9c\x41\x17\x94\xbb\xa7\xbb\x78\x94\x55" + "\x5b\x43\x55\xbb\xf8\x38\xb9\xb6\x8f\x2a\xf1\xaf\x9f\x92\x86\x41" + "\x67\x4f\x96\x2e\xcd\x31\x83\x49\xb7\xa6\xe5\x3c\x96\x69\xce\xc8" + "\xce\x5e\x9a\x6d\x26\xe7\x2b\x81\x73\x4c\xd8\xbd\x14\x8f\xaa\x50" + "\x63\x70\xed\xe9\x8b\xc1\x55\x3c\xaa\xcf\xfe\x85\xf6\xac\x50\xb7" + "\xd6\xef\x46\x96\x19\x7d\x41\xdc\x45\xad\x1c\xbb\x5e\x21\xdd\x54" + "\x35\xfe\x1c\xf8\x3b\x4a\xb2\x4d\x8a\x87\x25\x60\x7d\x14\xfc\x8e" + "\xff\xdc\xf5\xa8\x83\xb4\xf7\xdd\xa4\x1b\x9d\xb6\x53\x09\x65\xc2" + "\xef\x46\x91\x42\xf6\x23\xe4\x7b\xbb\x1a\x7f\x0e\xfc\x1d\xc5\x9f" + "\x78\x4f\x79\x5b\x9c\x19\xad\x0a\x7c\x46\xfb\xd1\xbc\x68\x77\x33" + "\xe5\xe1\x6b\x43\xc5\xbe\x83\xb2\x45\xe6\xeb\x57\x07\x3d\x2f\x36" + "\x68\xf9\x44\xdd\x47\xae\x65\xe6\x01\xf2\x85\xf0\xe2\x11\x31\x6a" + "\x3e\x31\xbe\xb5\xf6\x90\x5f\x78\xe4\xd7\xf2\x85\xf2\xe2\x1f\x54" + "\xaa\xf9\xe4\x59\xa6\x22\xfd\x40\xdf\x1d\xc6\x8b\x3e\x5e\xa7\xe6" + "\x33\x06\x96\x17\x90\x27\x4c\x29\x16\xf1\x76\xeb\x95\xb5\xa1\x62" + "\x5f\x97\x17\x8f\x0e\x45\xfe\x01\xfd\x69\x0e\xad\x9f\xae\xdc\xdb" + "\xbf\x9f\xac\x8f\x2d\xcc\xb8\x6d\xe1\x92\x5c\x8a\x52\x94\xb3\x74" + "\x79\x0e\x5d\x97\xa4\x3d\x21\x2e\x4b\x53\x1e\x7f\x4c\xfe\xc8\xc9" + "\x8a\xa7\x1f\x59\x18\x6f\x74\x4d\x5f\x6e\xa5\xcb\x63\x4b\xe9\xd6" + "\x96\x19\xb7\xfc\x31\x2d\xb4\x72\xe0\x38\xb4\x74\x17\x9b\x66\x63" + "\x6c\x4c\x93\xfc\x88\x29\x15\x32\xaf\xd8\xfb\x35\xac\x75\xb1\x23" + "\x16\x11\x83\x8d\x5d\x70\xee\x5e\x67\x5a\x4c\xe7\xee\x0d\x6b\xad" + "\x8f\x19\xbc\x0b\x33\x80\xb3\xf5\x78\xb7\xc2\xc5\x36\xa8\x31\x84" + "\xe6\xb8\x84\x4f\xca\xe2\x2b\xdb\x35\x9b\x42\xc5\x3e\xa7\x8c\x7c" + "\xad\x0b\x1b\xa3\x2d\xc2\x57\x8b\x03\xf7\x8d\x3b\xb7\x88\x98\x27" + "\xd1\xb8\xaf\xc0\x7d\x33\xee\x4d\xb8\x8f\x51\xec\x77\x5b\xe8\x9c" + "\x1d\xee\xcd\xb8\x8f\x45\xf9\x7d\xf1\xdf\x03\x69\xa3\x06\xfd\xba" + "\x6d\x40\x99\x38\xd8\xdf\x11\xe6\xd6\x98\x04\x2d\xa6\xaa\x88\x9f" + "\x5a\x3c\x66\x96\xb6\x17\x28\xe3\x04\x19\x93\xc5\xba\x26\xd6\xf6" + "\x31\xc7\x43\x4c\x57\xc7\x4a\xde\x7b\x8c\x4d\xf3\x2d\x20\x79\xeb" + "\x31\x25\x01\xb1\x67\xe9\xbe\xbc\x2f\xf6\xac\xe4\x45\x9f\x93\xbc" + "\xe8\x18\x17\x2f\x1e\xe3\x8f\xa1\x57\x3c\xc6\x11\x18\x27\xcc\x85" + "\xe7\x24\xd3\x20\xbd\xc1\xbf\x0e\x8e\xc9\xa2\x6f\x0e\x14\x67\x17" + "\x32\xb9\x2d\x65\x25\xf8\x6f\x5c\x05\x2f\xee\xd3\x31\x21\x8f\xe1" + "\x9e\x17\x25\x90\x9f\x16\x33\x3d\x23\xde\x6f\x40\x3d\x03\xc5\xb9" + "\xd3\x8d\x7d\x92\x7c\xba\xba\x0b\xd2\x75\x3f\xdc\xc9\x74\xe2\x5e" + "\xfa\x24\xe4\xa7\x75\x63\x7f\x49\x63\x4f\xf3\x57\x16\x78\xb6\x7b" + "\xc0\xf3\x06\x1f\x68\xfb\xc4\x59\x4b\x0d\xde\xb4\x0c\xc9\xc7\x8d" + "\x7d\x5f\xdd\x17\x2e\x93\xeb\xfd\xd8\x83\xfc\x41\x19\x4b\xc3\xa5" + "\xbb\x4a\xc4\xb1\x33\xe8\xb2\x96\x72\xbc\x6b\xb0\xa5\x65\x88\x34" + "\xe4\x7b\x0a\xbc\x96\x5a\xbf\xe7\x9d\x31\xad\x8c\x9f\xf3\xc9\x33" + "\xeb\xba\xb1\x95\xf3\xaf\x2e\xa4\xef\x84\x0b\x3e\xe2\x03\x16\x41" + "\x31\xdb\xa8\x6e\x3b\x03\xfc\xa9\x6d\x42\x9a\x88\xc7\xfe\x20\x8b" + "\x20\xff\xb1\x6a\x5d\x2a\x45\x1c\xac\xe2\xab\x26\x69\xbe\x5f\x5c" + "\x48\xeb\xdf\x9e\x07\x7f\x25\x66\xc8\x84\xc7\xe2\x66\xdd\x89\x5f" + "\x71\x6a\xb8\xd1\xc0\xb1\x13\xd3\x11\x35\xbf\xa1\xe3\x95\x8c\x3f" + "\x8b\x78\x7d\xc5\x57\x95\xa0\x9c\x38\xd1\xdf\x4f\x3d\xfa\x15\x61" + "\x8b\x16\xaf\xde\xa9\x74\xe2\xbb\xd7\x64\x08\xdf\xad\x7a\xc9\x2f" + "\x0a\x9f\x69\xc5\x57\x4d\xe7\x51\x73\x0a\x65\xac\xce\x79\x99\xe8" + "\x3f\xb1\xee\xd3\xdc\x10\xe7\x00\x8d\xd4\xf6\xab\x5c\xc0\xd4\xa9" + "\xf8\x7b\x58\xc6\x1e\x79\xf4\x2b\xad\x5c\xf2\x6f\x84\xb1\x55\x8f" + "\xab\xb1\xbb\x38\x26\xbc\xcf\x2e\x48\x3b\x5b\xa8\x8b\xb9\x9e\x7c" + "\x2f\xf9\xf9\xf3\x6b\x1e\x90\x7c\x65\xcc\x44\x17\x33\x94\xc9\xf9" + "\x1d\x83\xf1\xbf\x6f\xb2\xfa\x7b\xba\x8b\xdd\x9a\xd9\xaf\x8c\xad" + "\x9a\xbe\x43\xf6\x5d\x8c\x15\x63\x71\x2a\xfe\x1e\x46\xfe\x3c\x2d" + "\x56\xf1\x53\x7a\x71\x9e\xa8\x25\xc4\xc4\xe2\x91\x5e\xa6\xa5\x0f" + "\xd3\x25\x80\x36\x31\xbb\x35\x3c\xe9\x88\x4a\xce\xc3\xfd\x7e\xf0" + "\x9b\x71\xea\x7d\x09\xee\x6b\xb4\x7b\xfc\xae\xd7\xf0\x86\xf4\x0e" + "\x1d\xab\x93\x9e\x25\x79\xef\x31\x13\x78\x32\x13\xc9\x57\x31\x6e" + "\x17\xdb\x6b\x51\xf3\x42\xfe\x7d\x65\x83\xfc\x7d\x35\xda\x6f\xa9" + "\xf2\xd3\x3f\xc4\x20\xeb\x7f\xcd\x64\x1e\x79\x60\x12\xc5\x88\x46" + "\x9e\x38\xcc\x25\xf1\x2e\xf9\x3a\xda\xd0\x63\x9c\xed\x5c\x07\xfe" + "\xf4\x71\x1a\x17\xd7\x88\xfd\xd3\x8d\xab\x8c\xb3\x88\xbf\xa3\xb3" + "\xf3\x22\xe6\x16\xf9\x2e\xf4\xb2\x30\xe1\x2f\x7e\xf3\x01\x8b\xf0" + "\x93\xbe\xc2\x12\xa1\xf9\x2d\xc4\x9c\x8c\xe7\xfa\x67\xd2\xc9\x97" + "\xa1\xd0\x95\x75\x5b\x46\x0a\xff\x85\xaa\xdf\xc2\x1d\xb9\x2c\xba" + "\x42\x91\x7e\x0b\xc5\xb9\xfa\x8b\xf8\x2e\xe4\x45\xc7\xfa\x7c\x17" + "\x52\x4c\x78\xfc\xb6\xf0\x73\x5e\x0f\xae\xb1\x01\xfe\x59\x42\x07" + "\xf4\x63\xa8\x07\x46\xea\xa5\x1f\xc3\xa1\xad\x2d\xd7\x84\xcb\x31" + "\x71\x4d\xa2\x16\x37\x39\x20\x2d\x19\x63\x5a\xee\x4f\xeb\x62\x2c" + "\x6a\x1a\xf8\x9f\x97\xcb\xfa\xf8\x30\x60\x1b\xe9\x0c\x31\x67\xf7" + "\xf2\x82\xcc\x67\x03\xe7\x10\x63\xb4\x44\x0f\x43\x59\x61\xf8\x1b" + "\x4e\x7f\x89\x7d\x38\x71\x8e\x37\x90\x2c\x60\xd0\x61\x5d\xb1\x85" + "\xf0\x99\x5e\x6f\x48\x8a\x57\x77\x82\x78\x4c\x3a\x23\x3c\xd3\xe7" + "\xa5\xb3\xea\xa1\x33\x7d\x1d\x14\xcf\xf0\x04\x9d\x13\xdb\xf4\x38" + "\x9d\x5b\x1c\xc7\x29\xd6\xc9\x4c\xdf\x37\x7c\x97\x3c\x8f\x59\x4f" + "\x32\x80\xef\x1c\xaf\xf5\xe5\xf2\xa3\xe8\x83\x08\x92\x2f\xc8\x5f" + "\xd4\x48\x9d\x87\x8d\xb4\x86\xbc\x79\x7f\xd7\x9b\x9c\x7c\x45\x51" + "\x9c\x2b\xa5\xd8\x03\x4c\x34\xeb\x52\xbc\x21\x85\x4e\x6f\xb3\xf0" + "\x35\x3f\xd3\x37\x9c\xcf\xb4\xdd\xce\x45\x7c\xaa\x5c\x5e\x03\x3c" + "\x0d\x11\x31\x8b\x57\xf2\x0e\xfc\x0e\x9f\xb9\xb2\x83\x53\x3c\x45" + "\x94\x7d\x74\xa6\x57\xe9\x99\x69\x53\x0a\x52\x6c\x3a\xbc\xf7\x05" + "\xde\xfb\x02\xf5\x89\x47\x99\x46\xdc\xdf\xc1\x77\x3d\x4e\xe7\x9b" + "\x0a\x85\x8c\x83\x36\x3a\xd4\x33\xa3\xd5\xa8\xdf\x7e\xf2\x55\x9d" + "\xe2\x75\x14\xee\x52\xcf\x80\x8a\x58\x9e\xb6\x5e\xae\x7e\x67\xd2" + "\xcc\x95\xec\x8e\x94\x95\xe3\xc4\x59\x52\x3a\x27\x35\xd3\x6b\xc6" + "\x37\x0b\x89\x1e\x11\x22\x7e\x32\x9d\x95\x2a\x1e\xe7\xbe\x58\x1c" + "\x46\xb2\x01\x59\x36\x86\xe9\x49\x0f\xe0\x7b\x61\x86\x91\x7c\x57" + "\x15\xb8\xb9\x87\x74\x7a\x6f\xf6\x34\xe8\xcd\xb9\xa1\xc0\x4f\xf3" + "\xa8\x3a\x6b\xfc\xc0\xe7\xe5\x4a\x7f\x95\xc5\xb7\xce\xcd\xe1\xa5" + "\x73\x12\x71\xed\xe4\xf6\x79\xe5\x64\x8b\xca\x4b\x1f\x89\xe5\x5b" + "\x1f\x45\x7a\x32\xc3\xb5\x93\x97\xce\x6f\xe4\x5b\x21\x4b\x95\xa6" + "\x55\xe3\x8a\xfb\x5b\x77\x23\xbf\x95\x97\xfe\x24\x1a\x57\x37\x2f" + "\xfd\xe9\x3a\xe4\xc3\xfd\xcf\x3a\x71\xc5\xfd\xcf\xd3\x91\x0f\xf7" + "\xb7\x9d\x68\xd1\x99\x5d\xf8\x8d\xb4\xf4\x32\xf9\xad\x5f\x57\x8a" + "\x6f\x95\x2e\xda\x2b\xbf\xb1\xb8\x5a\x7e\xc3\x5a\x23\xbf\xb1\xac" + "\x5e\x7e\x63\xf2\x34\xe4\xb3\xf1\xd2\x5f\xc4\xe3\xea\xe1\xa5\x09" + "\x31\xc8\x87\xfb\x29\xe1\xb8\xe2\x7e\x2a\xbe\x95\x8c\xfb\x3b\xa9" + "\x7c\xdc\xdf\x5d\x8b\x7c\x79\xbc\xf4\x9e\x83\xb8\x7a\x79\xe9\x7d" + "\x54\x3e\xee\x67\x54\xe0\x8a\xfb\x99\x1b\x90\x0f\xf7\x0f\xe4\xe1" + "\x8a\xfb\x5c\xb4\x69\x6e\x21\x2f\xb5\xd9\xf1\x9c\xf1\xd2\x55\xf8" + "\xde\xa3\xb8\x5f\xed\xc1\x73\xdc\xaf\xc1\xfb\xc9\xb8\x2f\x48\xe5" + "\x5b\xe7\xe1\x7e\x2d\xb5\x75\x1d\x2f\x2d\xc2\x77\x1e\x0d\xe5\xa5" + "\xeb\xa8\xcd\xb8\x2f\x9e\x8c\x7c\xb8\xff\x5f\x54\x1f\xdc\xaf\xc7" + "\x7b\xf3\x70\xff\x5b\xd0\x60\x6e\x09\x2f\x2d\x9d\x88\x7c\xa0\xf5" + "\xe6\x50\x5c\x71\xff\xcc\x09\xe4\xc3\xfd\x36\xd0\x30\x19\xf7\xcf" + "\xe6\x20\x3f\xee\x2b\xa8\xbd\x1b\x78\xe9\x2e\x13\xf2\x45\xf0\xd2" + "\xe7\xdb\x71\xc5\xfd\x6e\x07\xf2\xe1\xfe\xf7\xa0\x5f\x32\xee\x5f" + "\xca\x44\xfe\x88\x81\xfb\x73\x9f\x8b\xaf\x0d\x43\x5d\x0f\xb4\xf3" + "\xb5\xc3\x71\xfd\x4b\x05\x5f\x3b\xcc\xc2\x4b\xdf\x9c\x8e\x74\x5c" + "\x0f\x96\xe0\x3e\x4e\xbd\xc7\xf5\x8d\x1c\xdc\xc7\xab\xf7\xb8\x1e" + "\x4a\xc5\xfd\x44\xf5\x1e\xd7\xc3\x74\x3f\x89\x97\xd6\xe0\x1a\x86" + "\xeb\x61\x94\x3f\x6c\xb2\x7a\x8f\xeb\x3b\x71\xb8\x82\x96\x6f\x99" + "\x90\x9e\x80\x6b\x03\xee\x71\x7d\xbb\x1c\xf7\xd3\x70\xf5\xe2\x7e" + "\x9a\x7b\xc2\xbd\xf1\x34\x56\x95\xd1\xe3\xe3\xf9\xe8\xf9\xee\x82" + "\x2e\xa6\xa7\x31\x4a\x31\x0d\xcc\xb9\x6c\x5c\x93\xee\xda\x37\xaa" + "\xf2\x5d\x7a\xca\xe3\xdb\x36\xd7\xaa\x8c\x9e\x4b\xfa\xe8\x30\xe4" + "\x1b\xde\xa2\xfb\x21\xad\xaf\xcc\x99\xe7\x12\x71\xd5\x54\x3f\x6c" + "\x61\x78\xe7\x14\xf8\x86\x49\x14\x8b\x1a\x74\xdb\xcb\x8b\x86\x9d" + "\x05\xbd\xe2\x78\xd1\xe5\x4d\xb8\xe2\x3e\xf2\x03\xd0\x0b\xf7\x3f" + "\xfd\x0d\xae\xb8\x7f\x74\x0a\xe8\x16\xd7\x5d\xfc\xc3\x69\x2e\x9d" + "\x59\xac\x81\xfc\x95\x8c\x2a\x83\x97\x03\x8f\xb0\x26\x3f\xbf\x3e" + "\xde\xe0\x75\x60\xbc\x2f\x36\x1a\xc8\x9f\xd8\xef\xee\x43\x5d\x7f" + "\x94\x40\x75\xa2\x18\x27\xbc\x37\x56\x2f\xbf\x7d\x39\x6f\xd2\xfd" + "\xf0\x49\xd2\x89\xf2\xd1\x53\x06\x7b\xbe\x59\x3c\xbf\x76\x7d\x95" + "\x7c\x1e\xce\xfc\xcf\x1f\xa5\xe7\xaf\x19\x48\x8f\x7d\xdd\x2f\xc5" + "\x73\x67\x67\xab\xda\xae\x10\x7a\x76\x9c\xf2\xba\x74\x3f\x74\x4b" + "\x1d\xd7\xb5\x9d\xbc\x28\x84\x75\x18\xe7\xad\xeb\x2e\x8e\x65\x2e" + "\xdd\x38\xaf\xca\x63\x97\x71\xe3\x9c\x72\x79\xe6\x3e\x6d\x30\x7f" + "\x20\xe1\x4a\x59\x76\xf9\xc6\x22\x5e\x4f\x72\x2b\xd6\x1f\xbd\x39" + "\x3f\xb6\xba\x49\x37\xa1\x76\x07\xe9\x23\xa2\x4b\xac\x74\x86\xa8" + "\x49\x17\xbb\xb9\x77\xcb\xbc\x5a\xf3\x2a\x03\xbe\x3f\xe1\x78\x81" + "\x87\x77\x39\xf2\xa7\x60\x9d\xa4\xf4\xf9\xe1\xc2\x2e\x5d\xe6\xe9" + "\x94\xb6\x44\xe2\xb7\x4b\xea\x56\x27\xd4\xd2\xbb\x81\x72\x82\xaf" + "\xf8\x94\x57\x19\x5d\x52\x28\xf7\xc2\x62\xb7\xbe\xa1\xb8\xf4\x86" + "\x1c\x36\xcc\xbc\xea\x4d\x94\x1f\xdb\x18\x2c\x53\x6a\x79\xc5\xb3" + "\xb7\x0e\x21\xef\x76\xa1\xff\x89\x6d\xd7\xf4\xc5\x1c\x6d\xf8\xad" + "\xe4\xa7\x28\x66\x69\xa8\xe4\x0b\x27\x64\x91\x9f\x47\x6f\xf4\x13" + "\x85\xde\xb2\xf1\x66\x5f\x59\x89\x95\x6f\x2b\x29\x1c\xe9\xd5\x31" + "\x61\xd3\xaf\x9b\xf0\xfc\x4d\x1e\xd2\xcb\xbd\x47\x79\x1f\x51\xc2" + "\xdc\xd3\x6f\xb4\x31\xbd\x23\xfb\x13\xba\x7f\x96\x17\xf7\x16\x3a" + "\xdb\x1b\x18\xf9\xaa\xc5\x7d\x39\xff\x4d\xd4\x09\x65\x44\x58\xed" + "\x4e\xe2\x67\x6d\xa4\x4f\xfa\x80\xd2\xaf\x46\xbf\x40\x6e\x98\x60" + "\xd3\xea\x42\xbe\xea\x37\x82\x76\xc4\x6b\xd2\x19\xec\x14\x9f\x8f" + "\x7c\x20\x81\x1f\x9c\x50\x2b\xfb\x6b\x42\x32\x61\xbe\xfa\xdd\xd7" + "\x94\xa8\x79\xd5\x75\xc9\xb4\xdf\x1a\x4e\x3e\x65\xba\xc4\x99\x4d" + "\x2f\xc5\x97\xa3\x75\x56\xe6\x0d\xec\xbb\x85\xea\x59\xd5\x85\x4b" + "\x72\xb2\x9f\x34\x2f\x5b\xb8\x2a\xe3\xf6\x09\xcb\xe3\xcc\xd9\x36" + "\x73\xb6\x88\x67\x2c\x12\xd2\xe3\xcc\xcb\xb2\x96\xe6\x98\x73\x56" + "\x5a\x33\x2e\x8c\x57\x6b\xe2\xc6\x79\x65\x92\x07\xfc\xb1\xe0\x75" + "\x79\xe5\x7a\x4b\x4e\x1e\x57\xcc\xd7\x0e\x07\x8f\x7f\x5d\xd6\xf9" + "\xb0\x09\x0d\x74\x7e\x5d\x29\x32\x33\x35\xe6\x72\xc4\xb3\x51\x8c" + "\xce\x86\x84\x77\x17\x5f\x97\xee\xdf\x43\xf9\xf1\x5e\xa9\xef\xb8" + "\xce\xe6\xd2\xc5\x0a\xbf\x1b\x65\x9a\x9f\x2a\xf5\x99\xdc\x83\xb8" + "\xae\x1c\xb2\x9f\xf4\x9b\x51\x59\x52\x22\x79\xc7\xeb\x84\xdf\x2d" + "\x6e\x5e\x6f\xe1\xbb\xef\x8b\x07\x2f\xa5\xa3\xb1\x2a\xe2\xba\xb2" + "\xb3\xe2\xfc\x2a\xdf\x9a\x65\xa7\xb3\xe3\xbe\x6d\xf3\x8d\xca\xe8" + "\x2c\xbb\xf2\xc2\x7d\xee\x82\xe7\x99\xfe\x55\x60\x41\xa8\x19\xf3" + "\xe1\x5a\x36\xee\xcd\xfc\x56\x3d\xea\xfc\xf1\x9b\xf9\x0d\x7a\x5e" + "\x36\xbf\xb5\x23\x76\x9e\xc9\x03\x1e\x51\xd2\xdf\xc3\xfe\x3a\x8d" + "\x91\x0c\x54\xdd\x39\x6a\xf9\xa4\xce\x51\xf3\x3c\x9e\xad\x6b\x2a" + "\x1d\xd7\xde\xc2\xee\xbc\x9e\x7f\xf3\x4e\x0d\xe9\xaa\x7e\x5c\xf6" + "\xce\x34\xd2\x15\xce\xdb\xe0\x31\xce\xb3\x77\x6e\xcb\x32\x92\x9f" + "\x97\xf3\xdb\xd6\xb8\x7b\x46\xa7\x5a\x0f\x23\xcf\x7b\xa0\xd2\x31" + "\x33\xc6\xef\x78\xa6\x3f\x7f\xdd\xbd\x85\xaf\xf6\xd8\xf5\x47\x6b" + "\x26\x4b\xfd\x66\x2a\xe6\x8c\x18\x4f\xff\xb6\xe6\x9d\xfd\x35\x0c" + "\xdf\x66\xaf\xf6\x24\xea\xff\x3a\xe9\x82\xe7\x3b\xde\x89\xaf\x61" + "\xdd\xe4\x3b\x14\xb2\xd8\xa1\x4f\xca\x19\xdf\xb6\x6c\xd6\xbe\x55" + "\x1e\x7d\xb2\x8b\xe9\x8f\x37\x94\xb3\xbc\x53\xec\x0a\xef\x37\x96" + "\xd0\x97\xf1\xfe\x79\xf2\xdd\x77\xcc\x24\x7c\x78\xe5\x3b\x44\x9c" + "\x52\x43\x1d\xf8\x13\xe5\x1b\x4b\x58\xdd\x6c\x07\xc3\xf3\x1f\x79" + "\xef\x33\xb1\xe3\x99\x6e\xe6\x4c\xaa\x64\xe7\xf5\x09\xec\xc0\xdc" + "\x4a\xb6\x1d\x72\xc0\xf6\xd3\x2c\x42\xee\xd5\x5a\xc2\xbc\xbd\x96" + "\x50\xef\x6a\x0b\xf9\x54\xe1\xfc\x1b\xcb\x08\xe2\x47\xbd\x4b\x2d" + "\xe1\x75\xee\x4a\x76\x53\x2b\xb3\x9c\xd7\x33\xc3\xf9\xd5\x96\x11" + "\x75\xd6\x72\x94\x45\xc1\x95\x99\x8e\xfc\x39\x91\x9f\x27\xa2\xd3" + "\xe5\x49\x6c\x76\xbb\xee\xdf\x1e\x1a\x71\x82\x8d\x22\x7f\x82\xe4" + "\x0f\x8c\x7c\x95\x2a\xd1\xcb\x66\xf9\xa2\xb3\x8c\xf9\x5d\xa8\x17" + "\xf9\x38\x79\x25\xc3\x4e\x3c\xf2\x7c\xe0\x14\xb5\x59\xe1\x96\x11" + "\x29\x74\xdd\x32\xe7\x47\xc4\x27\x2b\xdd\x26\x8a\xbf\x13\x4e\xf5" + "\xc4\x3c\x0d\x5f\xf3\x39\x68\x59\x60\x09\x45\xbe\x08\xa4\x8f\x74" + "\xb6\x7b\x98\xef\x86\x8c\xca\x1b\xad\x22\xce\x6a\xf4\xce\x7c\x66" + "\xb4\xe7\xb3\x68\xf3\x4f\xc5\x58\x5a\xee\xdb\x97\x61\xe7\xc5\x3f" + "\x9f\xc5\xd7\x86\xc6\xc8\xb4\x1f\x3d\x64\xbe\x8b\x31\xf3\x2d\xf4" + "\xfb\x7a\x9f\xf9\x36\xf4\x61\x74\x76\x95\xe0\xe1\x85\x6c\x77\xfd" + "\x19\x39\xc6\xaf\xff\xea\x7c\xd8\x53\x65\x4a\xf1\x9f\xaa\x94\xb5" + "\xa1\x66\x8a\xc7\x7c\x5a\x77\xfd\x71\x5e\x5a\x7f\x82\x97\xad\x11" + "\x63\x11\xf7\xef\x9e\x0f\x9b\x08\x1e\xe1\xfd\x49\x28\x3f\xe1\xbc" + "\x2e\xb4\x01\x7f\x8d\xea\xfb\x0e\x6a\xb7\x6f\xf7\x7d\xe1\xd4\x6e" + "\x11\xb3\x05\xed\x4a\x41\x9f\xf1\xd1\xd9\xa9\xc2\x8f\x79\x2f\xe8" + "\xab\xc6\xb4\x24\x7a\x10\x0d\x94\x5e\xcb\x08\xd1\xd6\x5e\x4b\x04" + "\xe8\x4b\xbe\x43\x0d\xf9\x69\x78\x67\x5b\x76\x0e\x9e\x8d\x3c\x1f" + "\x9d\xbd\x87\x62\x27\x39\xad\x6e\xe6\xdb\x9a\x6d\x25\xdf\x58\xcf" + "\xae\xc2\x9c\x1b\x95\x0d\x7e\x22\x3b\x4f\x9d\x5b\x8c\xea\xa9\x94" + "\xbe\xbf\xee\x3c\x9d\x03\x40\xdd\x50\x3f\xac\xa1\xa1\x8d\x2e\xdd" + "\xf5\xd3\xce\x4f\xb8\xcf\x84\xab\x09\x75\x35\xf3\xe2\x07\x0a\xe9" + "\x37\x9e\x99\x41\x9b\x1b\x88\x0e\x44\x0f\x49\x8b\x1f\x4d\xf0\xd3" + "\x62\xcd\x41\xe4\x8b\x56\x8a\x5f\x9b\x8d\x6b\x27\x2f\x9e\x9e\x10" + "\x90\x6f\x86\x3f\xdf\xfa\x54\x99\xef\x60\xa8\xcc\x37\xa7\x1a\xcf" + "\xbf\x92\xf4\xfe\xd1\xe6\x0b\xe9\xfd\xa3\xf5\xfe\x77\xb3\xc3\xe5" + "\xbb\x2f\x94\xc9\x77\x7f\x49\xef\xbe\xd5\xaf\x4e\x07\xfc\xf9\xb3" + "\x26\xcb\xfc\xcf\x4f\x93\xf9\x27\xaf\x0b\xc8\xf7\xb9\x3f\xdf\x8a" + "\xa3\x32\xdf\xcb\x8d\x32\xdf\x5d\xcd\x18\x1b\x57\x5f\x58\x97\x1f" + "\x8f\xf2\xbf\xb3\x75\xba\x7c\xe7\x1d\x8f\x7c\x27\x2d\x07\xcf\x67" + "\x04\xd7\xe5\xc7\x77\xfa\xf3\x6f\x52\xdb\xfd\x56\x89\xcc\x9f\x6c" + "\x0e\xc8\xb7\x58\xcd\x87\xe7\xb5\x94\xaf\xf5\x7c\xd8\xf6\x78\x99" + "\xef\x71\x07\x8d\x47\xe4\xd9\xa8\x14\xdf\xe6\x3a\x1f\xf6\xb3\x5a" + "\x97\xce\xd2\x88\xbe\x89\xa1\x2b\xfa\x2e\x46\xb1\xcf\xdb\x80\xdf" + "\xb3\x69\xff\x82\x30\xd7\xa5\xbb\x6e\x22\x70\xd7\x37\xf0\x7e\xe8" + "\x8f\x6b\xfb\xf4\x65\x0a\xf8\x87\xad\x73\x13\x06\xe4\xe9\xb6\x3c" + "\x54\x41\x76\x0c\x84\x29\x2d\xba\xb8\xdb\xc9\x67\x1a\x2f\x48\x54" + "\x75\x54\x71\x42\x3f\x49\xfe\x1d\x48\x8f\xa9\xa6\x89\x38\x06\x0a" + "\xc6\x26\xe4\xcc\x6a\xf2\x53\x47\x7a\x4b\xac\x51\xa0\x6d\xdc\x2c" + "\xe0\xc4\xb0\x67\xf4\x4a\x15\xfe\xaa\xf1\xe7\x78\x86\xf4\x99\x45" + "\xec\x4e\x4d\xd7\x3b\x70\x5d\xe3\xb0\xfe\x6d\x6c\xf0\xeb\xbb\xe2" + "\x40\xbb\x1f\xbb\x86\x6e\x03\x1c\x37\x68\xfc\x03\x11\x9f\x98\x78" + "\xa5\x6d\x73\xed\x76\x45\xc6\x3c\xc7\x5c\x04\x9f\x17\x77\x12\x6b" + "\x7e\xa1\xf0\x85\x5a\xb6\xd8\xa8\xc4\x62\x2d\xf9\x9a\x85\x38\xf3" + "\x5a\x59\x95\xd2\xaa\xb7\xf7\xb0\xd0\x3a\xac\xa7\x94\xbf\x0a\xbc" + "\x83\x79\x09\xf1\x50\x71\x5d\xf6\x73\x6a\x79\x95\xeb\xe3\x0b\x16" + "\xcb\xd8\xce\xc4\x6f\xd2\x1a\x04\xdc\x89\x10\xf1\xbe\x96\x0c\x47" + "\xde\x1b\xae\xc7\xef\x70\xca\x7b\xfe\xba\x7b\xaa\xce\xff\xfb\xfa" + "\xf8\x9e\x6d\x29\xd6\x9e\xeb\xa6\xdb\x7b\x47\x2f\x36\xf6\x6e\x7b" + "\xc2\xee\xfd\xf7\x92\x4a\xef\x75\xf7\xc5\xfb\x46\xa7\xb8\xf1\x6d" + "\xac\x4f\xe5\xfa\x57\x94\x2a\xfd\x2b\xf9\x0e\x3d\x95\xfb\x66\xfe" + "\x1e\xfd\xa1\xfc\x7a\xfd\x21\xa5\x5a\xff\x66\xbe\x1d\xd7\x4a\x8a" + "\xfd\x04\xbe\xf6\x86\x95\x87\xf2\x8f\x62\x7d\xbc\xa1\x1a\xf4\xaa" + "\xd6\xf4\xaa\x7c\x8a\x97\xd5\xed\xf1\xb2\x23\x39\x5d\xcc\x1d\x39" + "\xaf\x0c\x7f\xe5\xee\x51\xd9\xf8\x5b\x53\x29\xea\x3c\x3a\x47\xb4" + "\x91\xce\x73\x1d\x52\x64\x9d\x55\x7a\x50\x99\x9f\xef\x54\xe8\xcc" + "\x97\xea\x27\x56\x77\x63\xc5\x05\x7e\x62\xf5\x32\xee\x58\x9f\xaf" + "\xd8\xff\x0a\x3f\xb1\xaa\x4e\x82\xfc\xc4\x42\x16\xae\x57\x65\x61" + "\x87\xea\x3f\x29\x82\xe4\x5f\xe1\x3f\xc9\xe6\x10\x3e\x90\x84\x9f" + "\x90\xad\x8b\xdc\xc4\x87\x76\x17\xdf\xd8\xa0\xc9\xb9\xc4\x5b\xf9" + "\x36\xcf\xdb\x8d\xbf\x4a\xa4\xbb\x5d\xba\x0f\x92\xb5\x74\xbe\xed" + "\x5a\x92\x23\x42\x7c\x3c\xf3\x17\xdd\x74\x56\x89\x67\xde\xe1\xdb" + "\x3a\x1f\xf8\xba\xa6\x10\x69\x93\xf1\x77\xbb\x6f\xeb\xb5\x13\xf1" + "\x37\x09\x7f\x93\xf1\x97\x80\xbf\x69\xf8\x4b\xc4\xdf\x2c\xfc\xcd" + "\xc6\x5f\x12\xfe\x92\xf1\x97\x8a\xbf\x74\x65\xeb\xb5\xd3\xc9\xef" + "\x1d\xca\xb6\x62\x1c\x98\xb4\x72\xfd\xf4\xbe\xe9\x21\xb4\x3f\x81" + "\xf8\x3e\x3e\xb2\xde\xcd\x31\xdf\xf9\xef\xee\x9d\x24\xea\x4f\xb8" + "\xfc\xbb\x79\x26\xf7\xf8\xf5\x66\xf7\xa8\x1c\xb3\x7b\x7c\x49\x89" + "\x3b\x72\x73\x3d\xfe\x1a\xf0\xe7\x72\x6f\xcd\xae\x42\x9f\x96\xb8" + "\x47\x2d\x4b\xe8\x2e\xbe\x09\xb8\xfc\xd3\x3d\x52\x7f\x75\x13\xe6" + "\xe2\x4f\x8f\xaa\xbf\x4f\xb8\x74\xb7\xc6\xd3\x6f\x94\x01\x99\xff" + "\xa6\x66\x97\x6e\xa2\xf4\x6f\x3d\x3a\xdb\xa1\x9e\x73\x2a\x44\xba" + "\xd7\x15\xfa\xcb\x06\x99\xef\x89\x42\xda\x8f\xea\x2e\x8e\x37\x6a" + "\xf3\x30\x28\xc6\xc3\x63\xd6\x94\xc5\x69\xb6\x94\x65\x59\x0b\x1f" + "\xcb\x58\x76\x9b\x79\x42\xba\xd9\xb2\x30\xfb\xc9\x94\x27\x97\x67" + "\x2c\xcf\x10\x2c\x24\x92\xae\x0f\xda\x8f\xa2\x58\xbe\xcc\x0b\x79" + "\x68\x64\x33\xe7\xb4\x76\x4f\xef\x44\x1f\x5d\xbb\x3e\xfe\xe0\x69" + "\xb7\xde\x07\x1e\x2e\xa2\xb9\x10\x73\x73\xb1\xf1\xe0\x69\x8f\x3e" + "\xa2\xd9\xcc\x38\xe6\x03\x3d\x73\x36\xd7\xab\x3c\xdd\x07\xac\x96" + "\x78\x3a\xe4\x79\x65\x89\x47\x7f\x3f\xbd\xff\xc2\x7d\xf1\xaf\xe2" + "\x37\xdf\x96\x65\xa7\xf7\x38\xf8\x3c\x71\x05\x9f\x27\xef\x53\xac" + "\x87\xc4\xf5\x09\xfb\x21\x91\x2f\xc5\xfd\x26\x5d\xcf\xe5\xf1\x5a" + "\x94\x4b\xba\x3a\xfe\xc2\x3d\x55\x22\xcf\x0b\xd3\x65\x1e\xcc\xc5" + "\x26\xdd\xcd\x95\x94\x4f\xc8\x56\xa8\xe3\xab\xa8\x47\xc1\x72\x16" + "\xaa\xcd\x6f\x92\xa5\xfa\xe6\x78\x2e\xf1\xbc\x37\x5f\x46\x73\x9c" + "\xea\xc3\x31\xa7\xf7\xe1\xdd\x57\x96\xb8\xc5\xfb\x90\x31\x43\x48" + "\xb6\x24\x1c\x21\xfc\x70\xe6\xd5\x8b\xf7\xab\x94\x7a\x3d\xc9\x63" + "\x78\xf7\x1e\x7a\x56\x01\x3e\xb5\x42\xc8\x25\x37\xaf\xd3\x64\x81" + "\x0d\xa3\xa5\x0f\xa5\x88\x54\x46\x67\xbd\xc7\x9d\xd6\xc5\xcf\x23" + "\xfa\x11\xbd\x68\xff\x97\x17\xc7\xc7\x54\x44\xb1\xd0\x1d\x51\x2c" + "\xdc\x3b\xaa\xc4\x26\xf7\x00\x6e\xae\xd1\xf8\xeb\xce\xe8\x92\x20" + "\xbf\x85\xb2\xbf\xcc\x19\x4b\x68\x27\x23\x5d\x6c\x19\xa6\x2d\x5b" + "\xb6\x7c\x71\x86\x39\x23\xed\xb1\x4c\xb3\x78\x6c\x5e\xbe\x0c\x59" + "\x16\xe6\x2c\x33\x2f\x5d\xb1\xc4\xbc\x78\xd9\x42\x92\x14\x32\xb2" + "\xb3\x97\x5b\x73\x46\x30\xf9\xa6\x79\xf1\xf2\xac\x9c\x85\x56\xfc" + "\x58\x96\xb1\x24\xdd\x2c\x7a\x7d\x19\x8a\xca\xca\x32\xab\x5f\x58" + "\x96\x99\x96\x4d\x03\x61\xc9\xaf\x91\x29\xe0\xfd\x60\x39\x22\x82" + "\x7c\x54\xd1\xda\x73\x5a\x77\xeb\x84\x9a\x50\xd0\xba\xac\xc4\x46" + "\x36\x0b\xb8\x8f\x15\xb2\x65\xf1\xcd\x27\x68\x7f\xe7\x19\xb4\xb1" + "\x63\xc2\x3c\x53\x77\xf1\x2d\x95\x5a\xdb\xc8\xcf\xb9\xf0\xf3\x47" + "\x3e\x24\x75\xb7\x46\x8a\xf3\x77\x98\x0f\xc2\xa6\xa5\xf8\xe6\x2f" + "\x25\x2d\x6e\xa9\x0f\xf4\x11\x2d\xfc\x0d\xea\x6e\xf9\x4a\xee\x8d" + "\xdc\x1a\x4b\xfc\x91\xea\x97\x5d\xc7\x8b\x6f\x19\x45\xef\x28\x5b" + "\xd7\x94\x74\x17\xdf\x1a\xee\x97\x51\x6e\x71\x51\x7e\x91\xaf\xf8" + "\x96\x5b\xf8\xa8\xec\x2a\xa4\xd5\x50\xbd\x06\x59\x67\xcc\xe7\x50" + "\xee\xb1\x2a\xc6\x7e\x1c\xcd\x2c\xe7\xb6\xa4\xcd\xea\x8e\x9a\xb7" + "\xa7\xa7\x88\x0d\xef\xc1\xda\xe6\xd1\xb3\x71\xe7\x31\x2e\x56\xde" + "\xcc\x42\xd6\xcc\x60\xfa\xaa\x45\x55\xe4\xa7\x94\xd5\x26\x96\x33" + "\x67\xaa\x8b\x39\x3d\x7b\x59\xad\xa3\x89\x1d\xf7\xbe\x24\x63\x03" + "\xac\x22\x19\x63\xe2\x7a\xf2\x33\x55\xb0\x86\xfb\x5e\x7d\xdd\x3d" + "\xec\x95\xb6\x2a\xf2\xe9\x3f\xce\xe9\xfd\xcc\xe1\xcc\xdb\xcd\x9c" + "\x36\xa7\x83\xce\xdf\x83\x6e\xcb\x0f\xe1\xd9\x65\xb5\x78\xef\x7e" + "\x36\x1c\xf7\x0b\xe9\x1b\x25\xdb\x78\xc3\xfa\xd1\xbc\x71\xfd\x36" + "\xee\xc2\x98\x22\x1f\xfd\xad\x1b\x47\xf3\xf6\x8d\xaa\x2f\x39\x1a" + "\xa7\xd6\x5c\x66\x6a\xd3\x4d\x14\xfb\x71\xce\x69\xe2\x7e\x0c\xee" + "\xc5\xfa\xef\xb4\x6d\xa3\xfb\xb1\xb8\x37\xcb\xfb\x9d\x74\x7f\x15" + "\xee\xe3\xe5\xfd\x3b\x74\x1f\x83\xfb\x04\x79\x5f\xc7\xc4\x59\x74" + "\xdd\xc4\x59\xf2\xfe\x23\xba\x07\xed\x27\xa6\x3a\x72\xa9\xbe\x9f" + "\xa2\xcf\x26\x2e\x2e\x38\x09\x59\xd5\xd6\x22\xe6\xc3\x9b\xf9\x99" + "\xa4\xab\xc1\x7c\xb8\xf5\xcc\xe5\x8d\x24\xe7\x4e\xb4\x87\xc5\xd3" + "\xf5\xd6\x32\x83\x87\x0d\x07\xdf\x78\x39\x9e\xa5\x11\xed\x06\xe4" + "\x63\x5e\x99\x97\x32\xd3\xcb\x1d\xfc\x77\xf7\x59\xf8\xd6\xc5\x76" + "\xfe\xbb\xe9\x56\x2e\xd6\xba\xb9\xb3\xaa\x56\x79\x84\xaf\x58\xf0" + "\xea\x98\x43\x13\x45\x7c\x38\x37\x78\xdf\x41\x7c\x47\x1a\xf9\xd6" + "\xf9\x76\xc8\x94\xa6\x19\x16\x2f\xd9\x1c\x82\xdf\xff\x49\xda\x91" + "\x4c\xe2\x1d\x72\x42\x94\xdd\xd3\xad\x4a\x41\x12\xe3\xb1\xf7\x59" + "\x66\x64\x72\x07\xd6\x31\x9d\xd4\x9f\xf3\xcf\x28\x96\xbd\xf8\xee" + "\x84\xfb\x2c\xca\x8a\x4c\x8a\x49\x24\xf0\x25\x9f\xd6\xf4\x5c\xe0" + "\xc9\xea\x24\x83\x6f\x6b\x0e\x3b\x92\x79\x6a\x68\xf1\xbd\x74\x3f" + "\x49\x1d\xd4\xce\x09\x75\xf2\xf1\x24\xe6\xc5\x77\xbc\x68\x2b\xf1" + "\x0f\xaf\x28\x47\xf5\xe0\x63\x2c\xfb\x16\x34\x0c\xe3\x2b\x92\x0c" + "\x68\xd3\xcd\x4e\x4b\x17\xab\xeb\xa1\xb9\xf2\x53\xf3\x11\x1b\x63" + "\x77\xda\xbc\x0e\x83\x5b\xf8\xb8\x35\x5a\x17\xb1\x6b\xf8\xa8\xf9" + "\xf6\x36\xdd\x4f\xad\xf7\xe7\xa1\x0d\x68\xfb\xa1\xa6\x86\x50\x05" + "\xed\xb8\x49\xd2\x8d\xde\x9b\x0d\xda\x9a\x34\x19\x67\x68\xf5\xff" + "\xa9\x18\x37\xca\xb2\x24\x46\xe7\x02\x5f\x05\xcf\xa2\xf4\x26\x19" + "\x14\xac\x47\xf4\xec\x88\xe5\x6b\x46\xdf\x94\xb4\xfe\xa9\xf4\xb9" + "\x15\x0b\x3a\xe3\xfb\xe4\x5b\x57\xa3\x2b\xf2\xce\xf6\xf5\x66\x0e" + "\xdc\xff\xdb\x96\xd5\xa3\x7e\xe8\xbb\x6b\x07\xb4\xc3\xe1\xdb\xc6" + "\x73\x39\x3e\xee\x4d\xc4\x5f\x12\x7f\xbe\xc4\xee\x9e\x70\x6f\xa6" + "\x88\x19\xb9\xed\x89\x3e\xdd\x12\xe6\x1b\xc6\xc8\x4f\xcf\x54\xe5" + "\xb7\x0e\xec\x5b\xd4\x5e\x9d\x24\x62\x75\x0d\xfb\x8c\x1b\x7c\x14" + "\x83\xb6\x8b\xfc\x34\x27\x1d\xb1\x74\x0e\xb1\x4f\x7f\x36\x71\xb0" + "\x3e\xa5\xf2\xef\xbc\x9e\xf7\x0e\xb1\xbc\x41\xe3\x37\x82\xb6\x46" + "\x1e\x7d\xad\xb9\x87\x4f\xd3\x49\x39\xe4\xe7\xd7\x13\xad\xbc\x58" + "\x47\x56\x7d\xc8\xf4\x1e\xac\x97\x2f\xcd\x29\xd1\xc7\xa5\x52\xfc" + "\x79\x56\xf8\x6e\x7d\x0d\x9b\x39\x9d\x15\x1c\xcf\x3c\xcb\xb4\x18" + "\x5c\x7c\x74\x96\xfd\xc5\x39\x6e\x3d\xed\x61\x51\xcc\x2d\x21\xb3" + "\x6f\x7b\xb2\xfe\xe5\x8f\x3c\x24\xc7\x3a\xf6\x7d\xe4\xd6\x7b\x3b" + "\x92\xcc\xc2\x4f\x34\x64\x89\x82\x4c\xae\xf4\xed\x6b\x51\x2c\x01" + "\xfb\x9c\x78\x8a\x69\x7c\x6c\x56\xbd\x38\xab\x7d\x2c\xa9\x86\x1d" + "\x6b\x2c\x67\xb5\xcd\x27\xe9\x7c\xe1\xf3\xc7\x92\xec\xc4\x53\x8e" + "\xf4\x82\x6f\xdc\x0e\xbe\x11\xf3\xf5\x32\xc5\x58\x9d\xa4\xed\x6d" + "\xd1\x3e\x97\xc6\x33\x7a\x31\x47\x2b\xd4\x38\x5c\xde\xe2\x9f\x99" + "\x2a\xd4\x7d\x2e\x8a\xcf\xf5\x5c\x2e\x8b\x7d\x4e\xaf\x24\x0d\xb4" + "\xaf\x35\xf2\x49\xe1\xcb\xc5\xa4\x44\x56\x27\x69\x71\xba\xee\x7f" + "\xd2\xcc\xfe\x82\xb6\x1f\xb1\x0c\x75\x4e\x4e\xea\x24\x7a\x7b\x31" + "\xee\xbc\x18\x73\x5e\xd0\x13\x7d\xd0\x8c\x7e\x1b\x50\x1e\xd3\xfa" + "\xa0\xb7\x40\xeb\x83\xdb\x0e\x88\x3e\x80\x1c\xb7\xfa\x11\xb5\x0f" + "\x3e\x41\x1f\x34\xa3\x0f\x8a\x58\xe1\x7b\xb3\x6b\xd9\xcc\x59\xe8" + "\x83\xf6\xb3\xe4\x63\x5c\xc6\x41\xcb\x91\xb4\x17\x7d\xf1\x89\x5b" + "\x5f\xd7\x29\xfb\x60\xef\x5c\xd9\x07\xaf\xcc\x75\x83\x8f\xb9\xb7" + "\xf0\x45\xdc\xfb\x56\x24\x99\x29\x2e\x0c\x2f\x4a\xa5\x98\xcd\xb2" + "\x2f\x7a\xd1\x17\xbd\xb2\x2f\xf2\x9f\x44\x5f\x9c\x68\x10\x3e\x5d" + "\x8e\x35\xd6\xb2\xda\xd4\x4a\x76\x1c\xb8\x84\xbe\x48\xa3\x7e\x21" + "\x1d\x83\x6f\xb5\x25\xea\xd9\x55\x2c\xba\x62\x15\x33\x69\xfd\xa1" + "\xf4\xa2\x3f\x56\xa1\x3f\x7a\xd0\x1f\x9e\xbe\xfe\x88\x16\xfd\xf1" + "\xb5\xda\x1f\x3d\x64\x1f\x87\xfe\xe8\x41\x7f\xf4\xa0\x3f\x8a\x64" + "\x7f\x10\xce\xdf\xdf\x69\xe0\xca\x3f\x2c\x6c\x67\xdb\x00\xfd\xb1" + "\x5a\xed\x8f\x4f\xfe\x99\xfe\xb8\x6d\xdd\x85\xfd\xf1\xf3\xcc\x4b" + "\xf5\x87\x7f\x4e\x4c\x9e\x47\xfd\xd1\x5b\xa9\xce\x89\xeb\x68\x4e" + "\x14\xea\x7f\x8c\xb5\x88\x68\xfa\x6e\xfd\x41\x31\x27\xd0\xd6\xc2" + "\x17\xe7\x78\xf4\xb5\xcd\xe8\x97\x74\xf4\xcb\x2a\x7f\xbf\xc8\xfe" + "\xc8\xb2\xef\xf9\x48\xd2\xdf\x7c\x2f\xad\x19\x34\x37\xa8\x7f\xd0" + "\x4f\x98\x3f\x03\xc5\xb0\x0b\xdc\xff\x45\x99\x0a\xcd\x13\x9a\x23" + "\x34\x1f\x8e\x67\x9e\x14\x31\xc1\x8f\xcd\x3a\xca\x68\x1f\xf8\x58" + "\xd2\x41\xf4\x55\x39\xf3\xad\x40\xdf\xe4\x62\x9e\xe8\xd8\x78\x8a" + "\x65\x77\x2c\xa9\x84\xf8\x05\x23\xc6\xfc\x65\x3e\xf4\x93\xaf\xdb" + "\x34\x62\x03\xe4\xac\x5d\xb9\xfe\x79\xb3\x53\x8d\xdb\xcb\xc3\x7e" + "\x66\x42\x7a\xa8\x17\x7d\x84\xb9\x13\x34\x67\xfa\xe2\xf9\x7e\x61" + "\x61\x3b\x9a\x58\xf8\x15\x0b\x65\x1f\xf9\x02\xe6\xcc\x8c\x85\x34" + "\x67\x0a\xd1\x47\x1f\x0e\xb1\x8f\x26\x8b\x7d\x5f\x3e\x1a\x58\x3d" + "\xea\x5a\x33\xd6\x49\xf4\xd1\x6d\x9e\xc1\xfa\xc8\xb7\xfb\xde\x44" + "\x9f\x71\x9e\x9d\x7c\x9d\x2b\x4b\x67\xeb\x14\xc8\x50\x3d\x90\x5d" + "\x8f\xb9\xbd\x2c\x6f\x1e\xd3\xaf\x3a\xc9\xc2\x9c\xb3\x3f\x60\x4e" + "\x57\x35\x23\xbf\xc1\xa4\xfb\xa6\xf8\x01\x4e\x6f\x35\xf0\x2a\x5f" + "\xdc\xef\x10\xf7\x6e\xb6\x7a\x1e\x0b\x11\x31\x2e\x93\x2a\xd9\x06" + "\x8c\xcf\x7d\x73\x2b\xf5\x4a\xd9\xfc\x56\x6e\xa4\xb8\x27\xcc\x41" + "\xe7\x9d\x0a\x56\xb2\x88\xe3\x99\xb5\xe4\x67\xee\xb3\x02\x1b\xff" + "\xbc\xae\x13\x65\xba\x79\x8f\x0f\x6b\xc6\xce\x22\x5e\x4d\xbe\xe0" + "\x6f\xa2\x35\x82\x7c\x60\xe8\x6e\xff\x39\xf1\x22\xa4\x03\x74\xe4" + "\x3f\x07\xde\xeb\x76\xe1\xbf\x1d\x69\xba\xe3\x8b\xc8\x46\x23\x61" + "\x1f\xd5\x4b\xea\xe3\xe5\xf5\x26\x8a\x05\x38\x3a\x7f\xea\x1b\xf9" + "\xee\x50\x3b\x64\x62\xf0\x68\x54\xce\x7a\x2e\xe5\xc3\x4c\xe7\x09" + "\x8f\xd0\xc5\xba\x0b\x32\xc3\xec\xab\xc8\x47\x2f\xf9\x95\xa7\x35" + "\x3b\x61\x1e\xc5\xe9\xe5\xbb\xb1\x5e\x8d\x7e\x82\x55\x2d\x70\xeb" + "\xfd\xeb\xf2\xed\xfb\xb1\x9e\x65\xde\x69\xe1\x05\xe4\x7f\xff\x10" + "\xda\x45\x72\xd0\x4b\x4d\x1e\x81\x29\x2f\x2f\x28\xd1\x93\xae\xc8" + "\x03\x7c\xa8\xfd\xe8\x3f\x44\xdc\xd1\x16\xdd\x2f\x8e\xbc\x97\xe4" + "\x65\xf4\xfd\x87\xae\xa7\xfd\x96\xdb\x3d\xe7\xf5\x6f\x77\x9e\x0f" + "\xfb\x59\x4e\x41\xb3\x3f\xe6\x62\x60\x6c\x45\xc2\x99\x7d\x0b\x50" + "\x26\xe1\x4c\x53\xa1\x5e\x62\x4b\x02\xe9\x2b\xc3\xfb\x63\xcb\xf1" + "\xf6\xaf\x59\x3e\xc6\xf1\xf1\xcc\x4a\x11\x23\x61\x24\xf0\x5d\x59" + "\x0d\x3c\xe9\xb5\x44\xed\x00\x9e\x10\x0e\xec\x04\x7e\x28\xab\x4d" + "\x23\x4a\x7b\x58\x9c\x86\x23\xc4\x7b\xd1\x75\x1e\xc6\xa8\xe1\x28" + "\xd2\xd0\x4f\x0a\x70\x1d\x78\x62\xd9\xbe\x8a\xc5\x6e\xc7\x18\xdd" + "\x41\x38\x02\xbe\xf8\x7e\x2b\x70\x64\x05\x70\x24\x57\xc4\xbe\x35" + "\xed\xd4\x4b\xfc\x78\xbd\xa9\x44\x6f\xd7\x62\x5f\x0b\xfa\xde\xf1" + "\x48\x1d\x8d\x8f\xd4\x42\x71\x9e\xcd\x47\xeb\xd3\xea\xa4\x90\xba" + "\x4e\x8c\x91\x6d\x6b\xdc\x94\x26\xe6\xed\x8a\xcc\x11\x8a\x1c\x6b" + "\x09\x44\x93\x5d\xa7\x59\xbc\x88\x0f\xf9\x8d\x69\xc4\xa6\x25\x2c" + "\x6e\xe7\x69\x16\xbb\x73\x09\xb3\x60\xbe\xea\x77\xa2\x0e\xf3\x9f" + "\x34\x32\x11\x8b\x20\xec\x67\x79\x48\x1f\x30\x16\x01\xf8\x6a\xd3" + "\x4e\x9a\x33\x4b\x2d\x7d\x75\xf2\xda\x9f\x71\xfb\x40\x3b\xe1\x67" + "\x49\x77\xc7\x6b\xd2\xae\xfa\x2e\x8b\xe4\xf3\xef\x68\x96\xb6\x4d" + "\xf7\x51\xdc\xf4\xe1\x6d\xba\x3b\x9e\xe5\x5b\x7e\x65\xb6\xae\x62" + "\xba\x36\xed\x19\x78\x4f\x05\x7d\x75\x63\x21\x2b\x54\x22\x0f\x25" + "\x3a\x6d\xe0\x9d\xc8\xaf\xf2\x90\xe6\xe1\x1d\xc2\xb6\xd7\x67\x7f" + "\x86\x64\xa8\x04\x65\xcb\x33\xde\x5d\x6d\x2c\x9e\x3f\x81\xfe\x58" + "\x84\xb6\xb6\xb1\xd8\x8a\x36\xb4\x75\x85\x6c\xab\x16\xeb\x5b\x29" + "\x7a\xdb\x8b\x67\x17\x8d\xe3\xe3\x7e\x82\xe2\xf8\x4c\xf1\x00\xc3" + "\x7e\xc0\xaf\x65\xec\x78\xbb\xf0\x71\xd1\xed\xf4\x9e\x64\xf4\x5d" + "\xd2\x1f\x39\xcf\x8a\x31\xbd\x91\xc6\xb2\x52\x59\x62\x4f\x69\xc4" + "\xd8\xee\xce\x64\x1c\xbf\x0f\x35\xb9\xc9\xa7\x84\xe0\xf9\x5c\xba" + "\xdb\x0f\x12\x9f\xf6\x26\xd2\x68\xec\x07\x8c\xf9\x83\x34\xe6\xe9" + "\xb9\x18\xf7\x78\xcf\xd9\x78\x8a\x51\x79\x81\xe5\x50\xff\x6b\x65" + "\xb5\xe8\x7e\xf9\x24\x95\x45\x63\x81\xf4\x3c\x34\xd7\x64\xdf\x57" + "\x93\x5d\xb9\x89\x8f\x4e\xb5\xca\x7b\x37\xf9\x2a\x31\xd2\x18\x10" + "\x63\x05\xf8\x4d\x3e\x50\x39\x4f\x0a\xc1\x38\xa3\x7a\x8e\x40\x7f" + "\xc7\x6b\xe3\x02\x69\xd1\xfd\xc7\xc6\xc8\xb5\x46\x92\x69\xa2\xe9" + "\xf7\xb7\x1d\x1f\x43\xeb\xbf\x5f\x5a\x07\xb5\x99\x8b\xbd\x57\xc4" + "\x86\x20\xdc\xf4\x75\x04\x60\x66\xbb\xc4\x4c\xc2\x24\x0d\x37\x05" + "\x36\x09\x5f\xf2\xd5\x64\x5f\x9b\x29\xea\x38\x44\xdc\x3c\xde\xee" + "\xc7\xcd\xfb\xad\x01\xb8\xd9\xce\x7b\x94\x09\x03\xe1\xe6\x94\x27" + "\x83\x71\x73\xca\xf2\x60\xdc\xbc\xf3\xe3\xfe\xb8\x79\x21\x66\x4e" + "\xf9\xe3\x40\x78\x09\x39\x66\x5c\x9b\xee\xce\x92\xc1\xb1\x72\x8a" + "\x6b\xe8\x58\x39\xf5\x4c\x30\x56\x4e\x8d\xfd\xff\x2f\x56\x4e\x7b" + "\x3a\x08\x2b\x8d\xdf\x12\x2b\xdb\x04\x56\x46\xf3\x7f\x60\x4e\xa8" + "\xf8\xb1\x73\xd1\x20\x58\xb9\xe8\x12\x73\xe1\x89\xc1\xb0\x72\xda" + "\xc9\x60\xac\xbc\xd3\x18\x8c\x95\xd3\x8e\xf8\xb1\x52\x7d\xf6\x9d" + "\x60\xe5\xb4\xc6\xef\x07\x2b\xa7\x35\x0a\xac\x3c\x4d\x58\x79\xe7" + "\x81\x4b\x63\xe5\x94\xd6\x81\xb1\x12\xe9\x02\x2b\xa7\xb4\xfa\xb1" + "\xf2\xe4\x25\xb0\xf2\xae\x1d\x43\xc0\xca\x68\x81\x95\xc6\x41\xb0" + "\x72\x11\x68\xa5\x8e\x0b\x31\xf6\xfa\x8d\x0d\x15\x2b\x4d\x7d\x58" + "\xf9\x2d\xc6\xc7\xd0\xfa\xef\xae\x8a\x8b\x61\xa5\x62\x97\xfc\x25" + "\x61\x25\x1f\xad\x62\x65\x96\x97\xad\xfa\x18\x18\x79\xa2\x4d\xc4" + "\x9c\x10\xb6\xc0\xf8\xcb\x7b\x84\xb0\x28\xcb\xf8\x0a\xe8\xe5\x74" + "\x55\x09\x6c\x12\xe7\xb9\xa6\x13\x56\x55\x21\x6f\x79\x1f\xdf\x29" + "\xb0\xf3\x63\x15\x3b\x93\x55\xec\x9c\xff\x2f\x60\xe7\x5c\xea\xcb" + "\xbb\xf7\x9d\xd7\x6b\xd8\xb9\x05\xd8\x79\xb7\xe0\x1f\x68\x6f\x57" + "\x62\xe7\x7d\xd7\x6b\xf5\x22\x9d\xa6\x33\xe7\x39\x26\xeb\x75\xf6" + "\x42\x1c\xbd\x97\xca\x4b\x04\x7f\xd9\xce\xfa\xb0\x34\xd9\x8f\xa5" + "\x2d\xba\x7b\x3f\x1e\x1c\x47\x13\x2d\x7d\x38\x5a\x04\x1c\xfd\x34" + "\x00\x47\x21\x37\xbd\x4c\x98\x07\x1c\xed\x16\x38\xfa\xba\x8a\xa3" + "\xf7\xfc\xfc\xbd\x64\xe0\xe8\xbd\x1a\x8e\x26\x66\x79\x8a\xde\xee" + "\xf4\x14\x5f\x1a\x47\xbb\x05\x8e\x5a\xff\xdf\xe3\x68\x4d\x3f\x1c" + "\x85\xec\x4a\xf1\xbe\x07\xc4\x51\x6d\x3c\x0a\x1c\x2d\xf4\xe3\xa8" + "\xa0\xeb\x3d\x1f\xd6\xa5\x82\xee\xa9\x56\x21\xbb\xf5\xe1\xa8\xb5" + "\x4a\xe2\x28\xd2\x84\xfe\x64\x19\x70\x14\xe3\xaf\xe0\x38\xf9\xca" + "\x62\x09\xa8\xa3\x91\xf0\x75\x17\xe6\x0c\xd1\xa8\x0f\x4f\x17\x61" + "\xce\x10\xc6\x74\x60\xce\x00\x47\xe7\x77\x19\x99\x98\x2f\xc5\x98" + "\x2f\x6d\x83\xc4\xc1\xd2\x6c\x78\x07\xc5\xd3\x7b\x6f\x08\xc6\xd3" + "\x7b\x53\x83\xf1\xf4\xde\x51\x7e\x3c\x55\x9f\x11\x9e\xa2\xcf\x40" + "\x9f\x44\xc2\xd4\x7f\x0e\x4f\xef\x8d\xeb\xc3\x53\xbd\x8a\xa7\x8b" + "\x2e\x8d\xa7\x62\x6f\x70\x10\x3c\x0d\xc4\x86\xc1\xf1\xf4\xde\x38" + "\x3f\x9e\xde\x77\x59\x1f\x9e\x36\x0c\x86\xa7\x89\xf1\x03\xe3\x29" + "\xd2\x05\x9e\x26\xc6\xf7\xe1\x69\xc3\x00\x78\x7a\x6f\x20\x9e\xde" + "\x77\x5e\xe2\x69\x95\xf4\xa9\x01\x4c\xad\xeb\xc4\xf8\xa0\x39\x97" + "\x53\x2e\x30\x55\x01\xa6\x52\x6c\x50\x8a\x9d\x43\x36\xf8\x03\x61" + "\xaa\xc4\x5c\x17\x7d\x67\x04\xcd\xcd\x82\x19\x90\x77\xb1\x16\x81" + "\x26\x62\xed\xd5\xe8\xb7\x2b\x00\x5f\x53\x56\x1a\x89\xb7\x0b\x1a" + "\x2b\x8a\x36\x56\x3a\x2c\x64\x5b\x1c\x34\x56\x86\xd6\x97\xf7\x79" + "\x06\xc3\xd6\xc1\x64\xf7\xf7\x48\x76\x7f\x88\xe9\x57\x3f\x04\x7c" + "\x4d\x22\xd9\x7d\x4f\x3f\xd9\x7d\xcf\x85\xb2\xfb\x87\x17\xc7\xd1" + "\x21\xc9\xee\x73\xa8\x0f\xa7\x77\x05\xe3\xe8\xf4\xf3\xc1\x38\x3a" + "\x6b\x39\xd5\x4b\xe2\xf8\x9e\x81\x65\x77\x31\xcf\x67\xdc\xd9\x27" + "\xbb\x37\x04\xe3\xa7\x5f\x76\x9f\x35\x61\x70\x1c\x9d\x61\x0d\xe2" + "\x47\xe7\xab\x38\xba\x40\xc5\xd1\x05\x7e\x1c\x3d\xf6\x81\xc6\x8f" + "\xde\xbf\xf1\xdd\x86\x40\x1c\x9d\xb1\xbf\x0f\x47\x1b\x2f\xc4\x51" + "\x0d\x43\x09\x4f\xa9\x1c\xd2\x65\xed\x05\x4e\xbf\xba\xc0\xaa\x97" + "\xba\xda\x54\xa2\x5d\x78\x7f\x5d\xed\xf1\xf6\x2e\x96\x9f\x4c\x78" + "\x5a\x2e\xf0\xd4\xa0\x63\x69\xc0\xbe\x91\x74\x0e\xa1\x82\xf6\xf5" + "\x73\x65\xbc\x23\xd2\x2f\x29\x2b\x64\x9c\x3e\x4d\xcf\x84\xf6\x8a" + "\xfd\xfc\x79\x27\x55\x4c\xa5\xb8\xda\x18\x73\xdb\xcf\x01\x53\x73" + "\x07\xe0\x4d\x57\x03\x53\x57\x05\xf0\xa6\x98\xfb\xaf\x2f\xe8\x8f" + "\xa9\x33\xc7\xd7\xd1\x58\x21\x4c\x0d\x92\xe3\xf7\xfc\x37\x90\xe3" + "\x67\xae\x0c\xc6\xd2\x99\x7b\x83\xb1\x74\x66\x9a\x1f\x4b\xd5\x67" + "\xdf\x09\x6f\x3a\xd3\xf6\xfd\xf0\xa6\x33\x6d\x7e\x39\x7e\xd6\x43" + "\x7d\x58\x7a\x62\x30\x2c\x9d\x61\x1b\x18\x4b\x91\x2e\xb0\x74\x86" + "\xad\x0f\x4b\x4f\x0c\x20\xc7\x07\x61\xe9\x03\x3f\x97\x58\xba\x47" + "\xf2\xa6\x0d\x1a\x6f\xba\xe7\xff\x83\x72\xfc\x03\x83\xfa\xff\x19" + "\x4c\x8e\x7f\xaf\x5d\xe2\x27\xe1\x93\x86\xa1\x7e\x39\x7e\xcf\xe0" + "\x72\xfc\x25\x30\x74\x48\xbc\xa8\xc0\xd0\x07\x7f\x1e\x8c\xa1\x0f" + "\xde\x1e\x8c\xa1\x0f\xed\xeb\x8f\xa1\x17\xe2\xe7\x83\x6b\x06\xc2" + "\x4e\x29\xc7\x3f\x94\x3c\x38\x6e\x3e\xb8\x67\xe8\xb8\xf9\xab\x23" + "\xc1\xb8\xf9\x60\xfb\xff\x0c\xdc\x9c\xfd\x48\x10\x6e\x1a\xbf\x25" + "\x6e\xfe\x97\xc8\xf4\xb3\xfb\xe9\x3f\x67\xf7\xd3\x7f\xce\x0e\xd0" + "\x7f\xce\xfe\x0e\xf5\x9f\xb3\xbf\x27\xfd\xe7\xec\x2a\x3f\x0f\xfa" + "\xd0\xc6\x4b\xe3\xe6\x83\x55\x03\xe3\x26\xd2\x05\x6e\x3e\x58\xe5" + "\xc7\xcd\x4b\xf1\xa0\x73\x9e\x1c\x02\x6e\xfe\x37\x97\xe9\xe7\x5c" + "\x54\xff\x39\x90\x4c\x4f\xb8\x29\xf0\xb2\xa1\x9f\x4c\xff\x50\xa0" + "\x4c\xbf\xc7\x2f\xd3\x27\x4a\xdc\x72\x7a\xed\xc1\x32\xfd\x77\x8e" + "\xa3\x0f\xaf\xf5\xf4\xe9\x43\x7f\x03\x1c\x7d\x58\xf8\xc4\xf5\xf4" + "\xe9\x43\x1f\xbd\x4c\xab\x97\x94\xe9\xb7\x30\x59\xaf\x01\x64\x7a" + "\x61\x3f\xfc\xf0\x87\x7d\x32\x7d\x43\x7f\x99\x7e\xee\x81\xc1\x31" + "\xf5\x61\xef\x80\x32\x3d\xc9\xdf\x02\x53\xad\x02\x53\xcf\x6d\x0b" + "\xc4\xd4\x47\xc6\x08\x4c\xbd\x4b\xc3\xd4\xa4\x04\x0f\xe6\xa6\x27" + "\xec\xd2\x98\x4a\xe5\xf8\x31\x35\xf3\xbf\x06\x53\x1d\xdf\x1e\x53" + "\x03\xcf\xc0\xbe\x8e\xb6\xf7\x61\xaa\xa0\xf1\x23\x7f\xac\x4b\x25" + "\x4c\xcd\xec\x27\xdf\xef\x19\x58\xbe\x7f\x97\xe9\x89\x3e\x9a\x7c" + "\x4f\x7d\x20\xf0\xe6\xff\xa9\x7c\x3f\xf7\x8a\x60\x6c\x9d\x9b\x10" + "\x8c\xad\x8f\x74\xf9\xb1\x55\x7d\xf6\x9d\xc8\xf7\x73\x23\xbe\x1f" + "\xf9\x7e\x6e\x84\x1f\x5b\xe7\x7e\x75\x69\x6c\x4d\x0a\x1d\x18\x5b" + "\x91\x2e\xb0\x35\x29\xf4\xa2\xd8\x7a\x57\x20\xb6\x3e\xfa\xb1\x86" + "\xad\x7e\xf9\x1e\xe3\x83\xe6\x5f\x8e\xfd\x9f\x97\xef\xef\xf9\xbe" + "\xe5\xfb\x47\x1b\x86\x24\xdf\x6f\x03\xce\x42\x16\x5f\xfd\x3e\xe4" + "\xfb\x07\x54\xf9\xbe\xb1\xb2\x9f\x7c\x5f\x79\x81\x7c\x9f\xf7\x80" + "\x8a\xa9\x98\x53\x02\x53\x17\xec\xf9\xe7\xe5\xfb\x07\xa9\x0f\x93" + "\x3f\x0c\xc6\xd4\xe4\x8f\x83\x31\x35\x75\x21\xd5\x4b\x62\x7a\xe5" + "\xc0\xf2\xbd\x98\xe7\xf3\x26\x04\xc9\xf7\xa8\xdf\x85\xf2\x7d\xea" + "\x98\x20\x4c\x9d\x1f\x88\xa9\xf3\x66\x05\xf1\xa9\x68\x17\x61\xea" + "\x8b\x9f\x4a\x4c\x7d\xe9\xd3\x00\x4c\xbd\xff\x25\x15\x53\xe7\xaf" + "\x7d\x77\x76\x20\xa6\xce\x2b\xd3\x30\x55\xe0\xe5\x7c\x8f\xbe\x20" + "\xe9\x42\xbb\x13\x61\xef\x43\xb6\x40\x28\x9b\xce\x8b\x51\x99\xfb" + "\x3e\xcd\xbc\xb4\xbd\x49\xd2\xc0\xf6\x26\xce\x1c\x17\xab\x6d\xb6" + "\x0b\x3b\x93\x0a\xb2\x33\x59\xcb\xc6\x57\xf4\x48\xdf\x03\xc2\x2f" + "\xe2\x20\x7e\x07\xe6\x3d\xe2\xc7\x59\xb2\xc9\xda\x4e\x36\x59\xe7" + "\xa4\x0d\x10\xfa\xfb\x42\x5f\x03\x1a\xdf\x04\x3c\x38\xf0\x69\x7f" + "\x9c\x4d\x19\x55\x47\xe3\x27\x39\xb3\x9f\xcc\x5f\xf9\xdf\x40\xe6" + "\x4f\x59\x1c\x8c\xaf\x29\x95\xc1\xf8\x9a\xf2\x90\x1f\x5f\xd5\x67" + "\xdf\x09\xef\x9a\x92\xf5\xfd\xf0\xae\x29\x59\x7e\x99\x3f\xf5\x9e" + "\x3e\x7c\xad\x0f\xc0\xd7\x4f\x03\xf1\x75\x9e\xb0\xb1\x7c\xf3\xd3" + "\xfe\xf8\x8a\x74\x81\xaf\xf3\x92\xfa\xf0\xb5\xbe\x9f\xcc\xff\x69" + "\x7f\x7c\x4d\xbb\x41\xe0\x6b\x63\x65\x3f\xde\xb5\xf2\xd2\x32\x7f" + "\xe3\x7f\x37\x99\x3f\x2d\x6e\x48\x32\x3f\x61\x6a\x96\xc4\x54\xc2" + "\x2c\x0d\x57\xfd\x32\x7f\xe5\xa0\x32\xff\xa5\x70\x75\x48\xbc\xaa" + "\xc0\xd5\x05\x37\x04\xe3\xea\x82\x9b\x83\x71\x35\xe3\x8f\xfd\x71" + "\xf5\x42\x4c\x5d\xf0\xe4\x40\x78\x2a\x65\xfe\x8c\xf4\xc1\xb1\x74" + "\x41\xc5\xd0\xb1\xf4\xb1\xe3\xc1\x58\xba\xc0\xf5\x3f\x17\x4b\xd3" + "\xd3\x82\xb0\xd4\xf8\x2d\xb1\xf4\xbf\x44\x0f\x90\x7e\x20\x18\x4b" + "\xd3\xdb\x83\xb1\x34\xfd\x79\x3f\x96\xaa\xcf\xbe\x13\x2c\x4d\xaf" + "\xfe\x7e\xb0\x34\xbd\xda\xcf\xab\x66\x6c\xbd\x34\x96\x2e\xd8\x3d" + "\x30\x96\x22\x5d\x60\xe9\x82\xdd\x7e\x2c\x3d\x79\x09\x2c\x7d\x7c" + "\xe5\x10\xb0\x34\x58\x0f\xd0\x1f\x4b\xbf\x77\x3d\xc0\xe3\xb6\x21" + "\xe9\x01\x34\x2c\x7d\xe0\x42\x3d\x00\xe1\xab\xd0\x03\x80\x5e\x1a" + "\x86\x09\x3d\xc0\x34\x89\x65\x4e\x6f\x49\x90\x1e\xe0\xbb\xc7\xd6" + "\x5f\xaf\xf7\xf4\xe9\x53\x8b\x80\xad\xbf\x16\xbe\x40\x3d\x7d\xfa" + "\xd4\x27\x26\x68\xf5\x92\x7a\x80\xdf\x30\x59\xaf\x01\xf4\x00\x53" + "\x44\x79\x27\x83\xf4\x00\x01\x58\xdb\xa2\x5b\xf4\xe1\xe0\x38\x9b" + "\x19\x1a\xa4\x07\x68\xf2\xe3\xec\x39\xb2\x51\x07\x0e\x0a\x9c\x1d" + "\x1d\x88\xb3\x0b\x7f\x22\x70\x76\x8a\x86\xb3\x99\x89\xdd\x98\x9b" + "\xdd\x43\xc5\x59\x3a\x47\xf0\x69\xea\xf7\x83\xb3\xd5\x43\xc0\xd9" + "\x00\xdd\xc0\x01\xd0\xa3\x0f\x67\x05\xdd\x17\xbe\x5f\x97\x4c\x38" + "\x9b\xda\x4f\x37\x50\x39\xb0\x6e\xe0\xc8\xf7\xa1\x1b\x58\x74\x7d" + "\x30\xde\x2e\x4a\x0e\xc6\xdb\x45\x91\x7e\xbc\x55\x9f\x7d\x27\xba" + "\x81\x45\x96\xef\x47\x37\xb0\xc8\xe2\xc7\xdb\x27\x86\x5d\x1a\x6f" + "\x33\x23\x06\xc6\x5b\xa4\x0b\xbc\xcd\x8c\xb8\x28\xde\x4e\x09\xc4" + "\xdb\x27\xba\x34\xbc\xf5\xeb\x06\x2a\x55\xdd\x40\xc9\xa5\x75\x03" + "\x8d\x83\xe8\x06\xee\xfc\xbe\x75\x03\x4f\x74\x0e\x45\x37\x70\x7e" + "\x9b\xb4\xdb\x5f\x4d\x76\xfb\xf3\x80\xbf\xb3\x3e\x00\x0d\x2e\x6d" + "\xb7\x9f\xa7\xd9\x9f\xa6\x96\xab\x38\x5b\x3e\xa0\x6e\xe0\xbd\xd6" + "\xc1\x75\x03\xef\x9d\x08\xb4\x3f\xcd\x3a\x13\xbc\x6f\x95\xd5\xa5" + "\xed\x5b\xbd\xf7\x11\xe1\xac\xd5\x47\xf7\x4a\xd9\xb2\x04\xe9\xab" + "\xdb\xea\xa5\x7a\x0e\x64\xc7\xff\xba\x12\xb8\x97\xb5\xf8\x81\x3e" + "\x5d\x41\x3d\xe1\x6d\x39\x53\x78\x66\x18\xf9\x0a\x17\xba\x82\x39" + "\x34\xf6\xac\xfb\x02\x71\xf7\xd0\x27\x81\xb8\xbb\x38\x4f\xc3\x5d" + "\x1f\x70\xf7\x8d\xa6\x72\xa9\x7f\x9d\x2b\x6d\x53\xf7\xce\x0d\xb0" + "\x4d\xfd\xe0\x6d\x15\x77\x97\xac\x7c\xd7\x85\xf6\x5f\xcc\x7e\x0a" + "\xef\xbf\xf2\xc9\xb7\xb5\x41\x2d\x1f\xd0\x76\x4a\xc5\xa7\x01\xed" + "\xa7\x50\x57\xe3\x0e\x75\xae\xfa\x30\x4f\x77\x04\xd8\x4f\x55\xac" + "\xc2\x7c\x56\xcf\x95\x5c\xd4\x0e\x75\xae\xdf\x0e\x95\x97\x65\xe7" + "\xd1\xfa\xa6\x6c\x5d\x96\xd0\xc3\x33\x43\x78\x74\x76\x1e\x7d\xbf" + "\xb7\x17\xeb\xce\xd4\xa4\x10\x55\xae\x4b\x05\xf6\x8c\x94\x74\x5f" + "\xb2\xdf\x87\xb5\xc6\x87\xb5\x46\x29\xcb\x4e\xf5\x12\x6f\xb2\x2d" + "\x3b\xbd\x02\x72\x9e\xb7\x48\xc4\x2b\x1c\x51\x0a\x59\x6f\x17\xc9" + "\x79\xa7\x31\x37\x0a\x2c\x7a\xaa\x8f\x86\xa3\x86\x56\xb4\xe3\xf4" + "\xc5\x79\x39\xef\x37\x7e\x1c\x75\xdc\xfb\x1e\xbe\xb9\xf4\xc5\x3a" + "\x1a\xbb\x49\xfe\x33\x05\x82\x67\x1e\xc4\x56\x96\xea\x22\x7d\x36" + "\x62\x2c\x7c\x07\x3a\x89\xc0\xfa\x04\xe3\xba\x55\x17\x8c\xeb\xd6" + "\x89\xc1\xb8\xbe\xf4\x2b\x3f\xae\xab\xcf\x80\xeb\xe8\x37\xc1\x47" + "\x63\xed\xfb\x27\xf9\x68\xda\x8e\x91\xb8\xae\xa8\xb8\xbe\xf3\x5b" + "\xe0\xfa\x45\xf9\xe8\x00\x5c\x1a\x1c\xd7\xad\xcc\xaf\x93\xb0\x9e" + "\x1c\xd0\x46\xf6\x93\x40\x5c\x5f\xbc\x4e\xe0\xfa\x27\xfd\x71\x1d" + "\xe9\x02\xd7\x17\xaf\x1b\xf4\x3c\xc1\x27\xfd\xf7\xd3\x9e\x7c\x4b" + "\xe0\x7a\x83\x6a\x23\x5b\x3f\x84\xf3\x04\x0d\x12\xd3\x35\x2c\x27" + "\x7d\xd5\xf7\xab\x93\x78\xd2\x31\x14\x9d\x84\xc0\xf2\x76\x89\xe5" + "\x84\x8d\x1a\x9e\x7f\x9b\xf3\x04\x97\xc2\x73\x8d\x6f\x26\x3c\x1f" + "\x8c\x6f\x0e\xc6\xf3\xec\xb7\x82\xf1\x3c\xfb\x48\x30\x9e\xe7\xbe" + "\x15\x8c\xe7\xb9\x8e\xfe\x78\x7e\x21\x96\x2f\x1b\x35\x10\x8e\x5b" + "\xe7\x90\x8e\x22\xd7\x3a\x38\x86\x2f\x4b\x18\x3a\x86\xe7\xdc\xfe" + "\x3f\x0e\xc3\x8d\xfd\x31\x3c\xc7\x46\x18\xe4\x2b\xee\x87\xe1\x8b" + "\x54\x0c\x57\x71\x64\x57\x9b\xca\x0b\xf7\xc7\xf0\x76\xb4\xe3\x12" + "\xf2\xb8\xf7\x1f\xfd\x31\x7c\xf9\xe2\x20\x0c\x37\x5e\x02\xc3\x17" + "\x49\x3d\x48\x90\x5d\xee\x20\xba\x10\xb4\x23\x6f\xc7\x20\xbc\xb9" + "\x46\xb3\xc0\xfa\x04\x63\xf8\xf2\x23\xc1\x18\xbe\xdc\x13\x8c\xe1" + "\xcb\xf7\xf9\x31\x5c\x7d\xf6\x9d\xf0\xe6\xcb\x6b\xbe\x73\xde\x5c" + "\x1b\x1f\x17\xc5\xf0\xe5\x35\x7e\xde\x3c\xf7\xf9\x4b\x63\xf8\xb2" + "\xc4\x81\x31\x7c\x59\xa2\xc4\xf0\x65\x89\x83\x9e\x73\xb8\x00\xc3" + "\x57\xac\x1d\x02\x86\x07\xeb\x42\x34\x0c\x57\x75\x21\xbb\x02\x74" + "\x21\xbe\x22\xa9\x0b\xd9\xd1\x26\xc7\xc6\x48\x9d\x1c\xa7\x18\x3f" + "\xa6\x9d\xfa\x8b\xcb\x6e\x3b\xfe\x29\x3d\xc8\x8a\xc2\xa1\xe8\x41" + "\x04\x7e\xd3\x19\x87\x47\x80\xdb\xf5\xdf\xf2\x8c\x43\xa2\x76\xc6" + "\xc1\x3e\xc8\x19\x07\x15\xcf\xe7\xff\x0b\x78\x2e\xce\x38\xd8\x36" + "\x07\xeb\x98\x6d\x5b\x35\x1d\xb3\xc4\xf3\xbc\xdf\x05\xe3\x79\xde" + "\xee\xbe\x33\x0f\xc0\x7c\xa7\x75\xcb\x05\x67\x1e\xfa\xb0\x5d\xe8" + "\x41\x6d\x5d\x8e\x39\xcd\xac\x0f\xdf\x93\xfd\xf8\x8e\xb2\x1e\x0a" + "\xc2\xf6\xa6\x40\x6c\x5f\x19\x13\x84\xed\x9f\x96\x07\xdb\x47\x34" + "\x59\x03\xb0\x5d\x3b\xf3\xb0\x6a\xcc\xbb\x8d\x97\xc0\x76\xbc\xff" + "\xed\xcf\x88\x7d\xb7\xd8\xae\x9d\x6f\x18\x10\xdb\x03\xcf\x37\x04" + "\xd8\x3f\x10\xb6\x8b\x18\x1b\xa3\xfa\x61\xfb\xea\x4c\xbd\xef\x30" + "\xe6\x03\x70\x9d\xe6\x88\x8f\x03\xdb\x05\xbd\x57\xcd\x0e\xc4\xf6" + "\xde\x22\x89\xed\xdb\xdb\xfe\x75\x6c\xef\xe3\x87\x03\xb1\xfd\x2e" + "\xc2\xf6\xd5\x0f\xc8\xf3\x17\xff\x97\xbd\x6f\x8f\x8b\xaa\xda\xdb" + "\x5f\x33\x80\x61\xa1\x80\x0d\x1e\x34\xb5\xd1\x57\x3b\x83\x69\xe1" + "\x39\x5a\x68\xf9\x8a\xa5\xa5\x86\x8a\x1d\xed\x20\x17\xc3\x04\x0f" + "\x94\x28\x22\x72\x50\xb9\xe7\x05\x0d\x14\x12\x3c\x68\xa8\x58\xd8" + "\xd1\x12\x2f\x65\xef\xc1\x5e\xb5\xb1\xa3\xe7\x45\xe3\x66\x47\x4f" + "\x58\x98\xa3\xa1\xa1\xa1\x8d\x8a\xca\x65\x66\xf6\xef\xbb\xf6\xda" + "\xc3\x9e\x3d\xb3\xf7\xcc\xec\x3d\x80\xd8\xcf\x3f\xf8\x28\xfb\xb2" + "\xd8\x7b\x7d\x9f\xfd\xac\xe7\xf9\xee\xb5\xbe\x3b\xcd\xbe\xf5\x17" + "\x66\xf3\x33\x3e\xb0\x23\xff\x62\x95\xe3\x79\xae\x8b\xcb\xf1\x2b" + "\x76\x73\x39\x7e\x45\x2d\x97\xe3\x57\xe4\xb2\x1c\xcf\xec\x6b\x17" + "\x9d\xbe\x62\xd7\xfd\xc9\xbf\xac\xd8\xc5\x72\x7c\xd2\x2a\xdb\x6b" + "\x2f\x96\x0d\xe6\x9f\x9b\x01\xdb\x69\x8e\x5f\x36\xd8\xea\xda\x0b" + "\x4e\xbe\x3b\x79\x29\xef\xda\x8b\xea\xce\x9b\x9b\x61\x8a\x15\xf3" + "\xfc\x8b\xf4\xdc\x77\x72\xbc\xd8\xfc\x0b\x5e\x7b\xb1\xe2\xac\xc9" + "\xda\x8b\x5a\xdb\x6b\x2f\x92\x66\xd9\x99\x7f\xb1\x32\x37\xe3\x54" + "\xa0\xe9\x7c\xb7\x94\xc5\x5c\x7e\x4f\x59\xda\xc6\xef\xaf\x63\x7e" + "\xcf\x58\xcb\xe5\xf7\x8c\x4c\x7c\x9d\x7c\x6b\x31\xbe\xe4\xbc\x57" + "\x4c\x39\xcd\x9d\xab\x61\x96\x7f\x79\x1d\x63\x2f\x63\x34\x87\xdf" + "\x7f\x34\xe5\xf7\x14\x1d\x9f\x76\xc7\x79\x6f\x7a\x4e\xf1\x1c\x93" + "\x35\x6d\xd3\x8c\xf3\xdf\xd2\x5c\x4e\x06\xc1\xfd\x6b\x04\xe6\xba" + "\xcd\x21\x73\xdd\xe8\xb9\x6d\x38\x0f\x0e\x6d\xed\x9b\x13\x2b\x4f" + "\x09\xa7\x0c\x78\xae\x9b\xf9\x3c\x37\x3c\xf7\x0d\xcf\x75\xab\x88" + "\xca\x11\x9c\xe7\x86\xb1\x29\x34\xd7\x0d\xae\x5b\x41\x73\xfd\x45" + "\x86\xeb\x99\xb9\x6e\x85\x09\xec\x5c\x37\x0e\xd7\xf3\xcc\x1f\x3e" + "\xf4\x63\x1a\xbf\x8e\x4f\x65\xb9\xbe\x05\xeb\xf8\x17\xcc\x72\x31" + "\x74\x0c\xd2\xfc\x3b\x35\x17\x43\x73\x7d\xfa\xa8\x4a\x8c\xe3\xd0" + "\x58\x9e\x5c\x8c\xe5\x1c\xe7\xce\xcb\xc5\xa4\x67\x73\x39\x3e\x5d" + "\xcd\xe5\xf8\xf4\xa5\x2c\xc7\x33\xfb\xda\x85\xe3\xd3\xb3\xee\x4f" + "\x2e\x26\x3d\x8b\xcd\xc5\x64\x44\xf3\xce\xbf\xe3\xe4\xd8\x53\x9d" + "\xf9\x73\xec\xa9\xcc\xfc\xbb\x54\x67\xc1\x35\x21\x16\xef\x34\xdf" + "\x9d\x4a\x72\xec\x12\xd6\x84\xd4\x76\xb5\x5c\xcc\xbb\x01\x62\x73" + "\x31\xf4\xdc\xe6\xb3\x78\x7e\x88\xb8\x35\x21\xb6\xb8\xbd\x4d\xbb" + "\x5b\x79\x87\xc9\xe5\xf6\x95\x53\xb9\xdc\xbe\x72\x06\x97\xdb\x33" + "\x67\x73\xb9\x3d\x33\xc8\x9c\xdb\x2d\x79\x7d\xe5\x0e\x3e\x4e\x8f" + "\x7d\x1d\xe7\x62\x32\x5d\x85\xf9\x7c\x65\xb9\x78\x3e\x5f\x75\xf6" + "\xff\x6b\x3e\xf7\x30\xe7\xf3\xd5\x1e\x9d\x9a\x97\xa1\xf9\x7c\x8d" + "\x0b\x87\xcf\x3d\x6c\xf0\x79\xa7\xe5\x65\xd6\x84\x71\xf9\x7c\x4d" + "\x0e\x97\xcf\xd7\x4c\x64\xf9\x9c\xd9\xd7\x2e\x79\x99\x35\xa1\xf7" + "\x27\x2f\xb3\x26\x94\xd5\xec\x99\xa3\x6d\xf3\xf9\xca\x33\xfc\x7c" + "\x0e\xdb\x69\x3e\x5f\x79\x46\x70\x3e\xb5\x05\x9f\xaf\xed\x23\x82" + "\xcf\x79\xe7\xa8\x74\x8d\xbc\xcc\x5a\x6f\xb1\x79\x19\xa1\x75\x2a" + "\x98\xdf\xd9\xf9\x29\x26\xeb\x54\xfc\x8d\xeb\x54\xd2\xb8\xf3\x53" + "\xda\x9d\xdb\xd7\xf9\x70\xb9\x7d\xdd\x70\x2e\xb7\xaf\x9f\xcc\xe5" + "\xf6\xf5\x93\x8c\xd7\x49\xf2\x32\x19\x16\xeb\x56\xb8\x3c\xbf\x2e" + "\x5b\xfd\x7a\x1d\xe2\xe3\xfa\x2b\xb2\xec\x66\x61\x9e\x5f\x77\x50" + "\x88\xe7\xf1\x7c\x95\x4f\xe7\x44\xf1\xf0\xfc\x7b\x47\x7e\x0b\x3c" + "\x2f\x34\x0f\x85\xf6\x41\xc0\xf1\x98\xef\x69\x7e\x67\xb8\x1e\xf3" + "\xbc\xfe\x7f\xf9\x72\x34\xef\x35\x75\x14\xcf\x0b\xe7\x68\xb2\xee" + "\x54\x86\x32\x3c\x6f\xcf\x1a\x9a\x63\xdc\x1c\x4d\xe1\xdb\x1d\x9d" + "\xa3\xc9\x9e\xca\xe5\xfb\xec\x34\x2e\xdf\x67\x8f\x62\xf9\x9e\xd9" + "\xd7\x2e\xfa\x3d\x3b\xe0\xfe\xe4\x68\xb2\x03\x58\xbe\x5f\xef\x63" + "\x9b\xef\xd7\x1d\xe6\xe7\xfb\x75\x4c\x6d\xb6\x75\x87\xed\xe7\xfb" + "\x0d\x6d\x7c\x6f\xb9\x7e\x26\x4d\xfa\x1c\x99\xf1\xf7\x3b\x47\xb3" + "\x41\x90\xff\xad\xd5\xc7\x90\x9e\xa3\x61\xd6\x24\xbe\xc5\x5f\x1f" + "\xe3\xa4\x95\x39\x32\x27\xcb\x4d\xb9\x3e\xc7\x8b\x3b\x17\x31\xa7" + "\x8f\x71\x2e\xe2\xc9\x4a\xcc\xf5\x79\xe3\xb9\x5c\x9f\xe7\x2f\x94" + "\xa3\x39\x64\x30\x9d\x93\x98\xb3\x94\x9b\xa3\x29\xe2\xe6\x68\xa6" + "\x61\xec\x6d\xbc\x29\xcc\xf5\x39\x45\xdc\x39\xe0\x64\x8d\xe2\xee" + "\x39\xcc\x1c\xf0\x39\x26\x73\xc0\xa7\x7c\xc8\x70\x7d\xee\x91\xb2" + "\x6a\x1d\x12\x33\x0f\xd1\xf1\xb9\xde\x99\xbc\x73\x10\xe9\x31\xc0" + "\xca\x3c\xc4\x37\xcf\x79\xe0\x39\xcd\xba\x6d\x09\x26\xf3\x10\xad" + "\xd4\x33\xe6\xf0\xff\x9c\x58\x41\xfe\x6f\xa6\x58\xfe\x37\x3c\xcf" + "\xe6\x6d\x0c\x58\xe7\xd3\x71\xc9\x6d\xea\xa8\xbc\x0d\x5f\x9e\x44" + "\xfd\x12\xe6\xff\xf7\xaf\x13\x9d\x1f\xd5\xc5\xf2\x36\x1b\x27\x72" + "\x79\x7f\x63\x22\x97\xf7\x37\x0e\x67\x79\x9f\xd9\xd7\x2e\x73\xd1" + "\x37\x4e\xb8\x3f\x3a\x7f\xe3\x04\x36\x6f\x93\x37\xd0\x36\xef\xe7" + "\xec\xe2\xe7\xfd\x9c\x5d\x84\xf7\x73\x76\x59\xcd\xdb\x70\xe6\x46" + "\xe6\xbb\x38\x9c\xb7\x31\xea\xfc\xfb\xbe\xae\x27\xdf\x59\x4c\xde" + "\xa6\x6d\x4d\xba\x43\x79\x1b\x7e\xbe\x37\x6a\xfb\x93\x56\xde\xb9" + "\x72\xf9\x7e\x93\x0b\x97\xef\x37\x75\xe7\xf2\xfd\x96\x21\x5c\xbe" + "\xdf\x32\x98\x2f\x6f\xc3\xe5\xfa\x4d\xb3\xf9\x78\x3e\x76\x1a\xce" + "\xdb\x6c\x3e\x23\xcc\xf1\x9b\x56\x8a\xe7\xf8\xbf\xed\x78\xc8\xf1" + "\x66\x1c\xef\x61\xce\xf1\x7f\xab\xed\x54\x8d\x4f\x73\x7c\xc1\x69" + "\x0e\xc7\xb7\x63\x2e\xc7\x9e\xf5\x24\xc2\xda\x7e\xb3\xd9\xfc\xf7" + "\xcd\x66\xf3\xdf\x37\x9b\xcc\x7f\xdf\x1c\xda\x7e\x1c\xbf\xb9\xfd" + "\xe7\xbf\xdb\xc5\xf1\x9b\x4d\xe6\xbf\x6f\x71\xb1\xcd\xf1\x9b\xb2" + "\xf8\x39\x1e\xb6\xd3\x1c\xbf\x29\xcb\xaa\xb6\xe7\x70\xfc\x96\xab" + "\x1d\x91\xcb\xb9\x3f\xeb\x8d\xb6\xd4\x8b\xc9\xe7\x58\xab\x3b\x22" + "\x98\xcf\xf1\x33\xe6\x73\x62\x05\xf2\x39\xed\xc5\xf9\x1f\x34\x73" + "\x39\xff\x03\x3d\x97\xf3\x8b\x86\x73\x39\xbf\x68\x18\x37\x9f\x13" + "\x67\x91\xcf\xe1\xf2\x7f\x61\x98\x7a\x9a\x69\x3e\xa7\xc8\x24\x9f" + "\xb3\xfd\xbc\x30\xff\x17\x0a\xf2\xff\x5d\x9a\xff\xc3\x79\xf8\x7f" + "\xeb\xff\x27\xfc\x1f\xee\x00\xff\x6f\xbd\x0f\xfc\xbf\xed\x1c\xc9" + "\xf1\xd8\x59\x27\xe5\x90\xf8\x1c\x8f\x63\xe3\xc0\xf6\x11\xdc\x71" + "\x60\x7b\x04\x77\x1c\xd8\xde\x87\x1d\x07\x98\x7d\xed\x32\x0e\x6c" + "\xf7\xbd\x3f\xe3\xc0\x76\x5f\x76\x1c\x28\xea\x61\x7b\x1c\x28\x14" + "\x18\x07\x0a\x99\x71\xa0\x50\xc4\x38\x50\xa4\x17\xce\xf1\xc4\x4a" + "\xcf\xf1\x8c\xbe\xdf\xeb\xa0\x8a\x74\xa2\x72\x3c\x9b\xe2\x7d\xcb" + "\x71\x8d\x94\x8b\x48\xbe\x62\xae\x31\xc7\xa3\x36\xcb\xf1\xa8\x2d" + "\x72\x3c\xcb\x2e\x32\xfc\x1f\xc0\xac\x37\x9d\xe6\x40\x8d\x14\xfa" + "\x7b\xd2\x3b\x9a\xb9\xf3\xe6\x77\xd0\xfc\xcf\xd6\xef\xdb\xb9\x16" + "\x5f\x17\x19\x7f\xd4\x56\x6a\xa0\x7e\x38\x99\x93\xd3\x09\xe0\xab" + "\x91\xb2\x93\x33\xef\x86\xbb\xde\xf4\xc3\x78\x0e\xdf\x4f\x23\xeb" + "\x4d\x3f\xe1\x7b\x4f\xdb\x56\x93\xff\xa3\x55\x74\x4d\xfe\xb6\x5a" + "\x7e\x1f\x96\xda\x55\x4b\x7a\x0e\x53\x4b\xfa\xc7\xfb\x50\x4b\xda" + "\xde\x9a\xfc\x3f\x9a\xd7\xef\x2b\x1e\x58\x55\xae\x46\x95\x18\x23" + "\xa1\xe6\xb5\x4f\xd5\xfc\x6b\xf7\xe5\xcc\xda\xfd\x85\x1d\x53\x07" + "\x05\x5f\x0f\x3d\xe6\xf7\x3a\xea\x5f\x92\xa2\xa5\xaf\x07\x7f\xbb" + "\x1b\xae\x75\x67\x39\x60\xd5\x80\xf9\x34\x0e\xf3\x69\x71\x0d\x7d" + "\xec\x45\xc0\x42\xaf\xd7\x94\x18\xc7\xeb\x0d\xc8\x2d\x36\x01\x73" + "\x6b\x31\x3d\xef\x0b\x64\x04\x70\x2b\x39\x2e\xf9\x22\xa5\xd7\xf7" + "\xfa\x93\x12\xae\xff\x91\xbd\x0b\xab\x5d\x2a\x35\x8d\xf0\x5c\x5c" + "\xa3\xbf\xe5\x5a\xa5\xbb\xa7\xc6\xb1\x38\xba\xb0\xda\x99\x02\xfe" + "\xdd\x3e\x1f\xb9\x8a\x7b\x4e\x8b\x8b\x69\x3d\x83\xc7\xbd\x5e\x47" + "\x03\x70\x1d\x10\xa3\xb6\x32\xfc\xca\xe6\xb7\xb6\x42\xff\x18\x28" + "\x32\xf6\xbd\x19\x4d\x78\x03\xfe\x9e\x0e\xfa\x92\x9e\x63\x8b\x79" + "\x83\xfe\x86\x15\xf0\xc6\xb6\x5b\xec\x7b\x6c\xdc\x3e\xee\x23\x92" + "\x47\xd9\xc9\xce\x7f\xd1\x08\x71\xeb\x87\x49\xfc\xdc\xfa\x61\x12" + "\xe1\xd6\x0f\x93\xda\xb8\x55\xc3\x93\x47\xe1\xcc\x63\xff\x98\x99" + "\xff\xa2\x36\xd3\xd8\xea\x07\xb0\x3e\xca\xc7\xa2\xe6\xbf\xd0\x7c" + "\xba\x80\xf0\x29\xe6\x2b\x23\xa7\xb2\x79\x14\xb5\x60\x1e\xc5\x16" + "\xa7\x8a\x5a\xc3\x4f\x73\xea\xdf\xa7\x72\x39\xf5\xef\x33\xb8\x9c" + "\xfa\xc9\x69\x73\x4e\xb5\xe4\xd3\xbf\xe7\xf2\x71\x29\xa9\x8f\xf2" + "\x49\x9a\x30\x8f\xfe\xfd\xb0\x10\x8f\xd2\xf3\xd3\xe7\x98\xcc\x4f" + "\x6f\xe3\xd1\x5d\x15\x5c\x1e\xdd\x85\xec\xe5\x51\xfa\xdb\x26\x3f" + "\x76\xc2\xb7\x4d\x24\xf3\x68\xac\x19\x8f\xee\x8e\x66\x79\xd4\xfc" + "\xfb\x26\x36\x78\xf4\xed\x8e\xa9\x81\xc2\xe1\x51\x83\x96\xbe\x1e" + "\xe5\x42\xfa\x5a\xaf\x73\x79\xf4\x13\xa5\x30\x8f\xee\x3e\xc2\xf2" + "\x28\x39\xae\x63\x79\x74\x77\x03\x87\x47\xdf\x36\xe1\xd1\x5f\x58" + "\x0f\x81\xe7\x58\xb4\xf1\x68\x8c\x09\x8f\xbe\x6d\x8b\x47\x77\x37" + "\xe0\x3e\x22\x1a\xf5\x93\x03\xb6\x79\xf4\xef\xc7\xf9\x79\x14\xb6" + "\xd3\x3c\xfa\xf7\xe3\x2c\x8f\xf2\x68\x54\x0e\x8f\x7e\x9a\x2f\x82" + "\x47\xbb\x78\x6d\x94\x4f\xf3\x44\xe5\x2a\xd8\x35\x9d\x96\x35\x52" + "\xc3\x4c\xd7\x04\x95\x9a\x7d\xf7\xa4\xd4\xe2\xbb\x27\xcb\x8c\x6b" + "\x3c\x27\x31\xbc\x3a\xc5\x01\x5e\xa5\xd7\x78\xee\xd9\xc9\x9d\x7b" + "\xb2\x67\xb7\x71\xee\x09\xe1\xd5\xfd\x63\x8d\xd7\xc5\x7e\xf7\xa4" + "\xd4\x4a\x8d\xd4\x3d\xcd\x9c\xda\x28\x93\x4c\x6b\xa3\xec\xbb\x2e" + "\x5c\x23\xb5\x44\xc9\xa9\x8d\x72\x6a\x57\xdb\x77\x4f\xcc\x6b\xa4" + "\xb2\x1c\xbb\x77\x04\xcd\xb1\x6d\x35\xa8\x4a\x22\xda\x6a\xa4\xda" + "\x58\x17\x84\xdb\xd9\x7b\x29\xaa\xe3\x39\x56\x2d\x82\x63\x39\xdf" + "\x3d\x31\xaf\x31\xb5\xf7\x6c\x55\x59\x29\xaa\x0c\x2f\xe5\xa9\x8d" + "\x5a\x7a\x5f\xbf\x7d\x82\xaf\x8b\x9f\x6b\xf7\xcd\xe6\x72\xed\xbe" + "\x2c\xfa\xd8\xf3\x7c\x5c\xbb\xcf\x87\xe5\x5a\x72\x5c\xf2\x79\x33" + "\xae\xad\x15\xe0\x5a\x18\x57\xb7\x5f\x11\xcb\xb5\xfb\x82\x68\xae" + "\xcd\x60\xb8\xf6\x5a\x7b\x73\xed\xbe\x20\x96\x6b\xf7\xf7\xb7\xfd" + "\x8d\xa9\x12\x15\xff\xba\x9c\x12\x15\xe1\xda\x12\x95\xd5\x6f\x4c" + "\x71\xe6\x7c\x1c\xe8\x61\xfc\xc6\x14\x9b\x0f\x28\x65\xf2\x01\x0f" + "\xf2\x37\x51\x0e\xb8\x89\xcd\x07\x7c\x03\xde\x1d\xaf\xbb\x5c\x81" + "\xbf\x39\x15\x8a\xbf\x89\xb2\xdf\x2c\x1f\xb0\xdf\x32\x1f\x30\xdb" + "\x3a\xc7\x8a\xca\x07\xd0\xeb\x2e\x3f\xeb\xce\xe5\xd8\xcf\x7a\x70" + "\x39\xf6\x8b\x9d\xc6\x75\x96\xf8\x7a\x84\x6b\xa6\x7e\x36\xbb\x2d" + "\x1f\x50\xcb\xe5\x56\x36\x1f\xf0\xc5\x2c\x61\x8e\xfd\x8c\x9b\xff" + "\x9d\xb2\x8b\xb3\xce\xf2\x93\x4b\xa6\x75\xa8\x8d\xf5\xa7\x3e\xdf" + "\x71\xf2\x8c\x29\xc7\x7e\x56\xf6\x20\xd5\xa1\x6e\xab\x35\x65\x63" + "\x2e\xb7\x65\x1d\xea\x83\x63\xab\xca\xf6\x23\xbc\xb6\x8d\xe6\x5b" + "\x4e\x6e\x60\xff\xfd\xc9\x0d\x94\xed\x17\xc8\x0d\x1c\x3c\xc6\xe5" + "\xd9\x83\x8d\xf4\xb1\xe7\xf8\x78\xf6\x60\x2e\xcb\xb3\xe4\xb8\xe4" + "\x73\x66\x3c\x5b\xd3\x9e\x9a\xf6\xa0\xba\x63\x73\x03\x07\xd5\x6c" + "\x6e\xe0\x0b\x3b\xd6\x3f\x7e\x96\xc5\xcf\xb3\x9f\x31\x79\xd7\xcf" + "\xd8\xbc\x6b\x0d\xcf\xf7\x52\x38\x3c\xfb\x3f\xd1\xc6\xf5\x8f\xb4" + "\xa6\xad\x35\x6a\xda\xfd\x0f\xe0\xf7\x52\xfe\x27\x4a\x6c\x6e\x00" + "\xaf\x73\xc7\xdc\x8a\xb9\xcb\xc8\xaf\x6c\x6e\x60\xbf\x70\x6e\xc0" + "\x06\xbf\x8a\xff\x76\xdf\x3f\xa2\xb9\xfc\xfa\x8f\x18\x2e\xbf\x7e" + "\xd9\x6c\xce\xaf\x96\xdc\xfa\x8f\x12\x3e\x5e\x25\xb9\x81\x2f\x77" + "\x09\x73\xea\x3f\x6a\x84\x38\x95\xae\xe9\x77\x89\x9d\x23\xcd\x72" + "\x6a\xe9\x1d\x2e\xa7\x96\xf6\xb3\x97\x53\xef\xcb\xf7\x52\x24\x73" + "\x6a\x94\x19\xa7\x1e\xca\x65\x39\xd5\xfc\x9b\x29\x36\x38\xb5\xa3" + "\xf2\x04\xa6\x9c\xca\xd1\xae\x5f\x7a\x71\x39\xf5\xcb\x49\xc2\x9c" + "\x7a\xe8\x32\xcb\xa9\xe4\xb8\x8e\xe5\xd4\x2f\x15\x1d\x9b\x27\xf8" + "\x52\xc1\x6a\xd7\x2f\xcf\xd9\xe6\xd4\x7f\x68\xf8\x39\xf5\x1f\x1a" + "\xc2\xa9\xff\xd0\xd8\xbf\xa6\xfc\x7f\x8f\x88\xe0\xd4\x2e\xfe\x2d" + "\x95\xff\x3d\x2c\x3a\x4f\x80\xf3\xad\x98\x4b\x6b\x1d\xab\x1d\x92" + "\x68\xac\x1d\x32\x81\xe1\xd8\x57\x1c\xe5\xd8\xc3\x15\xdc\x39\x0d" + "\x87\x4f\x1b\xe7\x34\x10\x8e\x55\x2f\xe6\x7e\x1f\xd5\xb2\x56\x08" + "\xb7\x86\xea\x91\x81\x6d\x79\x02\xcc\xb9\x13\x4c\xf3\x04\xea\x81" + "\xc2\x7c\x7b\x64\x12\x27\x4f\xf0\x2f\x7e\xbe\xbd\xcb\xe1\xdb\xa3" + "\x91\x34\xdf\xb6\xd5\x50\x3d\x92\x65\xac\xa1\x6a\x53\xc3\x72\xf8" + "\x36\xbc\x73\xf8\xb6\xd4\x7e\xbe\xe5\x7e\x4b\xc5\xbc\x5e\xea\x57" + "\xdd\xab\x8e\x03\xdf\xd2\xf5\x3a\xcc\x6b\xa6\xda\x57\xaf\xa3\xa3" + "\x6a\xa6\xe2\xeb\xe2\xe7\xdd\xaf\xb2\xb9\xbc\xfb\x95\x9a\x3e\x96" + "\x97\x77\xbf\x0a\x63\x79\x97\x1c\x67\x37\xef\x4a\xca\x19\x7c\x95" + "\xd5\xb1\x39\x83\xaf\xb2\x58\xde\x55\xcf\xb0\xcd\xbb\x47\x02\xf9" + "\x79\xf7\x48\x20\xe1\xdd\x23\x81\x56\x79\x97\x33\x87\xe0\xd8\x78" + "\xde\x5a\x1e\xb5\x0f\xfa\x77\x56\x8e\xf9\x4b\xc9\x19\x00\x07\xcb" + "\x93\x70\x0d\xa7\x70\x3c\x87\xc0\x76\xce\xc0\x16\xdf\x8a\xcf\x19" + "\x7c\x3d\x96\xcb\xb7\x5f\x8f\xe7\xf2\xed\x89\xeb\xf8\xba\xac\xe6" + "\x0c\x68\x0e\xf8\x3a\xbb\x2d\x67\xa0\xe1\xf2\x2c\x9b\x33\x38\xb1" + "\x55\xf8\xdd\xd7\xd7\xa5\x1c\x7d\xfb\x8a\x59\xcd\xea\x39\x2c\xdf" + "\x9e\xaa\x34\xce\x19\xfb\xe7\xd5\x93\x81\xa6\x7c\xfb\xb5\xce\xa2" + "\x66\xf5\xcc\x76\xac\x59\x3d\xb3\x9d\x6b\x56\xcf\xe2\xd6\xac\xde" + "\x72\x97\x9d\x47\x26\xbe\x66\xf5\xf1\x55\x34\x07\x63\x0c\xe1\xba" + "\xd5\xf6\xe4\x11\x3a\xf8\x5b\x2b\x1c\xee\xe5\xe4\x11\x4e\x74\xe7" + "\x72\xef\x89\x17\x85\xb9\xf7\xf8\x39\x96\x7b\xc9\x71\x1d\xab\x79" + "\x4f\xb8\x76\x6c\x1e\xe1\x84\x2b\x9b\x47\x38\x51\xc1\xcb\xbd\x9c" + "\x77\x63\x5f\xab\xf9\xdf\x8d\xc1\x76\x9a\x7b\xbf\x56\x0b\xe6\x11" + "\x2c\xe6\x6f\xfd\xeb\x00\x79\x37\xc6\x68\x5e\x8d\x88\x3c\x42\x97" + "\x9b\x63\xf0\xaf\xfd\x52\xf2\x08\x98\x6f\x31\x9f\x19\x39\xd7\x9e" + "\x3c\x42\xfb\x6b\xdc\xff\x3b\xc0\xe5\xdc\xff\xfb\x82\xcb\xb9\xdf" + "\xcc\x32\xe7\x5c\x4b\xbe\xfd\xbf\x3b\x7c\x5c\x4b\xf2\x08\xdf\x38" + "\x0b\xf3\x6c\x99\x52\x90\x67\xcd\xe6\xe6\xb2\x3c\x7b\x72\x06\x97" + "\x67\xcb\x22\x24\xf1\xac\xbd\xdf\x60\xe9\x52\x3c\x1b\x6e\xc6\xb3" + "\x27\xaf\xb3\x3c\x6b\xfe\x1d\x16\x1b\x3c\xdb\x41\xdf\x61\x11\xd6" + "\xb8\xa7\x16\x73\x79\xf6\x54\xb1\x30\xcf\x9e\x1a\xcf\xf2\x2c\x39" + "\xae\x63\x79\xf6\x54\x6c\xc7\xe6\x16\x4e\xc5\xb2\x1a\xf7\x9b\x51" + "\xb6\x79\xb6\x4c\xc5\xcf\xb3\x65\xcc\x7b\xb1\x32\x95\xa0\xc6\xb5" + "\xe0\xd9\xf2\x3e\x22\x78\xb6\x8b\xcf\x41\x28\x17\x55\xff\xc2\x24" + "\x5f\xdb\xad\x4a\x63\xb6\x5e\xe2\x9c\xe9\x7a\x09\x93\xdc\xc2\x04" + "\x63\x6e\x81\xfb\x7d\x96\x44\x63\xfe\xd6\x9f\xe1\xdd\x97\x1c\xe5" + "\xdd\x0a\x9f\x7b\x6d\xbc\x1b\x07\xbc\x5b\x41\xaf\x8f\xb8\xd7\xc6" + "\xbb\xd5\x17\x8d\xd7\xc5\x7e\x9f\x45\x20\xb7\x30\x86\x6e\x2f\xb9" + "\x2d\xb7\x80\x79\xd8\xdf\x34\xb7\x50\x9d\x2b\xcc\xc1\x15\xc5\x9c" + "\xdc\xc2\xd7\xfc\x1c\xdc\xc8\xe1\xe0\xca\xb3\x34\x07\x8f\x31\x72" + "\x70\x45\xfd\x5d\xf0\x96\x77\x57\x8b\xe3\xe0\x46\x9a\x83\x27\xdd" + "\x1f\x0e\x3e\xd8\x0e\x1c\x4c\xf7\x7b\xd5\xb2\x2a\x35\x70\x70\x28" + "\xe6\xe0\x49\xf6\xe5\x1b\x3a\xe9\x1b\x2d\xf8\xba\xf8\xb9\xb8\x4a" + "\xcf\xe5\xe2\x6a\x5f\xfa\x58\x5e\x2e\xae\xaa\x60\xb9\x98\x1c\xd7" + "\xb1\xf9\x86\x2a\x5d\xc7\xe6\x1b\xa0\xa5\x36\x2e\xae\x3e\x66\x9b" + "\x8b\x2b\xf6\xf0\x73\x31\x6c\xa7\xb9\xb8\x62\x8f\x55\x2e\x1e\x63" + "\xca\xc5\xa7\xdb\x34\x2f\x27\xdf\xa0\x79\xd0\xbf\xdd\x72\x5a\x50" + "\xff\x2a\x07\xa0\xb4\x4b\xb2\x6f\xbb\x57\x15\x22\x74\x3b\x03\xa5" + "\x55\xe9\xc6\x20\xd8\x06\xfd\xf7\xed\x88\x2a\x6f\x3f\x64\x78\x7f" + "\x8e\x12\xf3\xf1\x46\xfc\x03\x1a\x37\x47\xce\x3c\x5b\x74\x1f\x7f" + "\x4b\xcf\x77\xc5\xdb\x31\xf7\x6e\x37\xd9\xcf\xf7\xb7\xa8\x9c\xb0" + "\x22\xe6\xbc\x2c\xb2\xee\x26\xac\xd8\xf8\x3b\xc6\xa6\x46\xf6\x6d" + "\x0e\x95\x1b\x56\xa8\xf5\x0c\x2b\xe4\x3b\x7f\x90\x07\x72\xed\x99" + "\x4e\x51\xdb\x36\x51\x8d\xb7\x9f\x0a\x53\xde\x5e\x87\x50\xce\x26" + "\x4a\x7b\x6f\xf5\xb7\x65\x70\x8f\xda\xbf\xc1\x71\xb7\x7b\x9d\xf6" + "\xb8\x9d\x11\x88\x60\x5b\xad\x71\x1b\xf4\x1b\x32\x64\x38\x51\x06" + "\xd8\x47\x6d\x52\xea\xb6\xa7\x00\x57\x25\x21\xf4\xcc\x5d\xfc\xcc" + "\x7c\xdb\x00\x98\x51\xac\x87\x36\x37\x40\x5b\xd4\xef\x9e\x68\x04" + "\x3c\x3a\x57\xae\x44\xf8\x99\xce\x84\xfb\x2a\x5a\x8f\xfb\xde\x69" + "\x68\x01\x25\x77\x46\x86\x9d\x01\x89\x94\xd7\x52\x5f\x88\x07\xca" + "\x89\x43\xb4\xff\xdb\x00\xc7\x51\xf2\x54\xca\x30\xe4\x35\xe0\xff" + "\x46\xf2\x4c\xc3\xf5\x1d\x05\x1f\x4b\xc1\xdf\xdd\x16\x87\x3c\xe0" + "\xc7\x8d\xca\x5f\xea\x7b\x6f\xf5\xbf\xe3\xe1\x3e\x43\xf1\x75\x09" + "\xdd\xe3\x86\x2d\x30\xee\x3c\xe1\x8d\xc7\x0e\xfa\xef\xe3\xbf\x4d" + "\xff\x1d\xb9\x21\x53\x0f\xdb\xa9\x8c\x54\xaa\x2a\x51\x87\xdc\xa1" + "\x2f\xb6\xc3\x75\x63\x3c\x1a\x3e\x0e\x53\xbe\xdb\x17\xa1\xbd\xcb" + "\xeb\xe5\x55\x70\xed\xfa\xbf\x3d\xd1\xa8\x4e\xf9\x03\x82\xfd\x5a" + "\xec\x59\xae\xc8\xce\x2c\x9e\x7e\x15\x21\xcc\x27\xf0\xff\xe4\x46" + "\x18\xc7\xa6\xc2\xef\x1b\xe0\x3e\x0c\xb7\xbd\x9d\xf1\xb1\xb0\xdd" + "\x47\x9d\xf0\x3d\x72\x8f\x45\xae\xeb\xe1\xde\xc8\xb1\xff\x6e\xc2" + "\xc7\x6a\x64\x67\x92\xf0\x35\xc0\x31\x6e\xf0\x3b\x3e\x0f\xcf\x21" + "\x43\x54\x71\x40\x22\x8d\xcd\xbc\xa5\xbe\x86\x21\x01\x89\x34\xf7" + "\xc1\x7d\x6e\x80\x7b\x86\x63\xdc\xe0\x18\x37\xfa\xdf\x14\xe4\x91" + "\x07\xdb\x70\x3b\xf0\xaf\x9b\x7a\x61\x0b\x6e\xbb\x1e\xb7\x2d\xd0" + "\x0f\xce\x94\x62\xa9\x2f\x05\xd8\xc6\x63\xaa\x32\x45\x76\xfa\x92" + "\xec\x6c\x3f\x77\x19\x45\x51\xc5\xaf\xa1\x77\x53\x90\x5b\x8e\x01" + "\x21\x75\x5f\xdc\xce\x99\x3b\xd0\xbe\x33\xee\x8b\x7b\xab\xcf\x9c" + "\xd1\xc8\xfe\x9d\x86\xfb\x17\xe2\xd9\xa8\x1c\x84\xef\xe1\xec\x30" + "\xfc\x77\xf0\x39\xcc\xf1\x74\xed\x7b\x7c\xcd\xca\x14\x27\x0a\xf6" + "\x7b\x39\xc9\x2e\x22\x27\x6f\xb7\xd5\xf7\x56\x9f\x55\x68\xd0\xfb" + "\x83\xf1\xf9\x1a\x72\x1e\x60\xe9\xac\x0a\x62\x56\x88\xb7\xe1\xdf" + "\x05\xae\xd7\xcd\x18\xb7\x0a\x50\x41\x16\xb1\x33\x62\x04\x70\x61" + "\xc4\x08\xbe\xde\x7d\x29\x1a\x39\x3d\x0e\xcb\xce\xd2\xbe\x6e\x3d" + "\xc4\x50\xff\x81\xb7\xf3\x06\xe8\x5b\x43\x2b\x8e\xcb\x25\xd8\xf7" + "\x9f\x18\x1c\x97\x0d\xcb\x21\x26\xe4\xd8\x1c\xf6\xfa\xf1\xef\xff" + "\xa1\xe3\x69\x80\x58\x90\xb5\x9b\xff\x19\x8f\xef\x67\xc3\x5d\x88" + "\x63\x6f\xaa\xf1\x78\x22\x5c\x17\xc6\x2d\x60\x64\x6f\x5c\x93\x1c" + "\xcf\xeb\xc3\xdb\x8f\xde\x6a\x92\x6f\xb8\x86\xb0\xae\x44\xd9\xc0" + "\xcb\x5b\x13\xa0\xcf\xa1\x4d\x6a\xf0\x6b\xb4\x8e\xa0\xe3\xb8\x1c" + "\x62\x97\x00\xd8\x85\x3e\xdf\x00\xfd\xb7\x0d\x38\x0f\xff\x7f\x1b" + "\x8c\x3f\x06\x38\x4e\x23\xfb\x4f\x12\xb4\xe7\xb1\xb5\x37\xa5\xdd" + "\xde\x9b\x6a\x80\x3e\xdc\x72\x6f\xf5\x7f\x82\x8c\x7d\x88\xaf\x69" + "\x03\x6c\xcf\x86\xfd\xd0\x9f\x67\x08\x86\xce\x16\x1b\xef\x59\xa8" + "\x3f\xb3\xf6\x22\xbf\xec\xbd\xa8\xdf\xba\xbd\xe8\xc5\x15\x75\xf0" + "\x5c\x66\x8c\xa3\xbe\x09\xd5\xc1\x98\x58\x1a\xd4\xd2\x7b\x8e\x07" + "\x7e\xf7\x64\x78\xf7\x89\xa2\x55\x7b\xd1\x30\xbc\x36\x76\x7a\x03" + "\x42\x78\x0c\x9f\xee\x72\x81\xaa\x8a\xbd\x83\x0c\x9e\xa5\x41\xfa" + "\x77\x87\xf6\x9a\x76\x07\xa1\x13\xaa\x46\x94\x12\x0f\x63\xf9\xad" + "\x7a\x94\xd2\x48\x69\x2b\xd3\xae\x22\xe0\x9e\x3c\xd2\x77\x35\xde" + "\xd3\x23\x11\xc2\x6b\x06\x0d\xbf\xa8\x50\x8f\x28\xe4\x9c\x74\x0e" + "\x79\xa7\xd6\x51\xf5\xfa\x4d\xef\xa0\x94\x64\x24\xdf\x7b\xab\x86" + "\x68\x4f\xd9\x77\x57\x8f\xe0\xf5\xa9\xf7\x82\xd0\x9b\x3a\x66\x3c" + "\xca\x5b\xea\x97\x1a\x8d\xfa\xe0\xfb\x71\xa7\xb5\xd7\x77\xab\xa0" + "\xdf\xfc\xc4\xf1\xf3\x77\x81\x74\x3c\x37\x2d\xc8\xd9\xfb\x56\x13" + "\xe8\xd6\x41\xca\xd4\x48\xaa\x1e\xeb\x3a\x18\x5f\x68\x2d\x58\x55" + "\xaf\x03\x6d\x15\x01\xa3\xa3\x06\x7d\x75\xa9\x48\x6e\xc8\x1f\xa4" + "\x14\xf9\x37\x0e\xd2\xe3\x36\x1e\x4b\xe1\xda\x67\xa9\x50\x1a\x7d" + "\xfd\x30\x66\xba\xc7\x63\x3d\x45\x5d\xc0\xd7\x7f\x14\xee\x95\x1a" + "\x98\x99\x03\xc7\xfb\xe1\xf1\x73\x7a\xad\x1a\x95\x37\xe9\xd1\x96" + "\x6b\x74\x1f\x75\x83\x3e\x72\x86\x7d\x6e\xd0\x4f\xae\x7c\x71\xc3" + "\x31\x33\xe4\x94\x06\x19\x9c\x48\x6c\xe8\xb8\x34\x92\xb8\x4c\x5b" + "\x8c\x60\x1c\x85\xd8\xe4\x92\xd8\x18\xbc\xe2\x3d\x70\x6c\xc4\xdd" + "\x47\x4d\x92\xd0\xf8\x82\xff\x36\x05\xf8\xc0\xb8\x30\x28\xe2\x3d" + "\xf0\xdf\xc6\xd7\x80\xdf\x9f\x61\x1c\x4c\x5f\x75\x81\xaa\x8c\xad" + "\x47\x55\x70\x3f\x94\xa7\xe9\x35\xe8\x44\x5e\x03\x4e\x33\xf2\x5f" + "\x43\xd6\x33\x80\xdb\x67\x00\xb7\xcf\x00\x6e\x35\x04\xb7\xa7\x6a" + "\x09\x6e\xf5\x70\x5d\xcd\xa0\xdd\x57\xcc\x42\x72\x7c\x5d\x7b\xbe" + "\xc7\x35\xfa\xe0\x3a\xeb\x59\xec\x4e\xbd\x0e\x7d\x64\xc4\xaf\xd3" + "\xd0\x5e\xb8\x7f\x2a\x1b\x6b\x50\x2a\xc6\x6f\x0b\x1f\x7e\xbf\xaf" + "\x99\x3e\x17\x62\xf3\x17\xc0\xef\xcf\x2a\xe4\x56\x87\x9c\x93\x67" + "\x01\x7e\xeb\xf9\xf0\xfb\xfd\xee\xc3\xf0\x37\x2d\xf0\x1b\x69\x8a" + "\xdf\xef\x27\x8a\xc7\xef\xf7\x1e\x6d\xf8\x0d\x66\xf0\x1b\x6d\x86" + "\xdf\x3a\x13\xfc\xe2\xfb\x16\x8d\xdf\xef\xe3\xc5\xe1\xf7\x5c\x53" + "\x1b\x7e\xc1\x97\x6c\x99\x4f\xf7\x51\x37\xe8\x23\xc0\xef\xb9\x72" + "\xe8\x27\x5e\xfc\x76\x7e\xfc\x6a\x0b\xec\x8f\x5f\x6d\xb4\xed\xf8" + "\xd5\xba\x88\x8f\xdf\x0f\xd5\x1d\x1f\xbf\xda\x91\xe2\xe2\xf7\x43" + "\xa9\x70\xfc\x7e\xc8\xea\x3a\xf1\xfb\x31\xc8\xfe\xf8\xfd\xe8\x63" + "\x3b\x7e\xe7\x4f\x88\x8f\xdf\xf9\x9c\x8e\x8f\xdf\xf9\x46\x71\xf1" + "\x3b\x9f\x28\x1c\xbf\xf3\x01\x42\xf1\x7b\xb9\x8f\x81\x32\xe0\x79" + "\x73\xbd\x83\x63\xb1\x06\x22\x7a\xed\xc2\x10\xec\x19\xe1\x77\x67" + "\xe3\xef\xb4\xa6\x02\x5f\x6d\xf6\xbb\x9b\xd9\xef\x1e\x66\xbf\x2b" + "\xcc\x7e\xf7\x36\xfb\xbd\x9f\xf1\x77\x88\x97\xcb\x0d\xd9\x8f\xf9" + "\xe0\xd9\xd2\x34\xb2\x0b\xbe\xcc\xfe\xc1\x6f\xea\x95\xd8\xf7\x0d" + "\xe6\xbb\xf6\x0d\x19\x54\x53\x0f\x19\xa2\x5a\xe5\x14\x8a\x4d\x41" + "\x4f\x5c\x93\x5d\x28\x6e\xc9\x00\x4b\xe8\xd4\x57\x45\xb5\xa4\x21" + "\x88\xcb\xcc\x69\xcb\x00\x5f\x5a\xf0\x89\xa9\xde\xdd\xa0\xed\xdf" + "\x41\xbf\x69\x2b\x63\xb5\xa0\xcb\xbf\xa2\x2e\xc9\x2e\xe4\xe2\xfb" + "\x7c\x26\x56\x8d\x0c\x4e\x43\x55\x14\x5d\xbb\x79\xd0\x4c\xad\xd3" + "\xd0\xbe\xd4\x8e\xb5\xca\xec\x0c\x83\x6b\x55\xc3\x19\xb4\x5e\x6e" + "\x50\x26\x25\x81\xae\x6f\x38\x88\x56\x34\x50\xf5\x49\x3a\xaa\xa9" + "\x2a\x54\x8d\xdf\xdb\xd6\x57\x25\x96\xa1\x4a\xed\x19\x84\xc7\x3c" + "\x8c\xd5\x2a\xed\x41\xf2\x9e\x18\x1f\x03\xdb\x2a\xb5\x7b\x50\x05" + "\xfc\xae\x5e\x78\x19\xee\x53\x33\xbe\xaa\x61\x0f\xd2\xe7\x0d\x0a" + "\x34\x28\x06\x8d\xa4\x14\x83\xfc\x2a\x1a\xe0\xda\xf2\x06\xbd\x88" + "\xaf\xb5\x12\xae\x83\xfe\x46\x67\xfe\xa0\x17\xe9\x76\x1b\xab\xe9" + "\x1c\x82\x3e\x1f\x8e\xf7\x82\xe3\xbd\x06\xf9\xe1\xeb\xc3\xd7\xc6" + "\xeb\xf7\xf2\x82\x8b\xe1\xda\xc7\xcc\x52\x39\x23\x2a\xdd\xd9\x5b" + "\x1c\xde\x34\x11\x82\x3e\x32\x2f\x64\x30\x69\xd7\x55\x4a\xbb\x82" + "\xf3\x9f\xa0\x5d\xe6\x7a\x3d\x24\xb4\x7b\x51\x21\xdc\x6e\x28\x73" + "\xbd\x4a\x29\xed\x2e\xb0\xd2\x2e\x73\xbd\xfe\x52\xda\x3d\x2e\xdc" + "\x6e\x18\x73\xbd\x69\x12\xda\xbd\xd4\x4f\xb8\xdd\xe0\x62\x69\x58" + "\xb8\x14\x6b\x0d\x0b\xd2\x70\x70\xc9\xca\xfd\x87\x14\x4b\xc3\xc0" + "\x4f\x82\xf9\x6f\x8c\x01\x69\xf1\xff\xc9\x6a\xfc\xa5\xc5\xfe\x27" + "\xb5\xb5\xd8\x4b\x8b\x7b\x9d\x20\xfe\xb1\x37\x86\xd8\xfb\x53\xbd" + "\x33\xd3\x0c\x9b\x86\xfa\x1b\x7a\x07\xbf\xf4\xae\xc1\x1f\xbd\x9c" + "\x0c\x63\x5e\x01\xf2\x7c\x79\xeb\x05\xca\x9f\xce\x39\xd5\xed\x49" + "\x2e\x44\xf2\x1c\xb9\x41\x5e\xb2\xbc\x46\x5e\xa5\xf3\xc3\xbc\xa5" + "\x2f\x4e\x68\x92\xfd\x17\x6c\x3f\x16\x85\x50\xe3\x12\x15\x22\x6d" + "\x0d\xf5\x5f\x9f\xe2\x8f\xa6\xeb\x11\xce\x71\x34\x4e\x5b\x7c\x81" + "\xfa\x27\x38\x83\xe9\x37\x81\x5f\x0b\x9a\xf0\x58\xea\x09\xe7\xea" + "\x00\xc7\xd0\x4e\x13\xda\x67\xd0\xca\xa6\x69\xe9\x63\xb5\xe0\x47" + "\xb5\xd4\xa6\xe0\x97\xf0\x98\x4c\xa5\xaa\xd0\x4a\xf8\xfd\x8a\xec" + "\x72\x7f\x27\x2d\x92\x6f\x03\xaf\x7a\x6f\xf5\x65\x6f\x8d\xec\x72" + "\x23\xf6\xaf\xe0\x93\x1b\x52\x6f\xe2\x7c\x7e\x66\xda\x5e\x83\x56" + "\xfe\x2e\xf8\x66\x7c\xfc\x33\xb1\x48\xfe\x4f\x2d\xce\x0d\x5c\x9e" + "\x70\x0c\x94\xa9\x95\x7c\x8e\xb3\x41\x11\xb7\x12\x9f\x8f\xdb\xc1" + "\x79\xd2\x0d\x06\xe8\x67\xc5\x52\x3f\x7c\xdd\xd0\xdf\x4d\xea\xe5" + "\x78\xcc\xb9\x5c\x3e\xd1\x87\xba\x87\xc7\x10\x18\x3b\xfa\x5e\x83" + "\xdf\xe9\x7c\x40\x06\x55\x4d\x29\x06\xaa\xa8\xf5\x3d\xfc\x2b\x1b" + "\x6f\x21\x75\x42\x0b\xba\x24\xbb\x5c\x81\xff\xf6\x6d\x45\x5c\x5a" + "\xa3\x22\x2e\x13\xae\xa1\xcc\x78\xbd\xf8\x6f\x19\xb7\xe3\xfc\x07" + "\x73\x8d\xf5\xc7\x92\x84\xaf\x91\x7a\xb7\x6f\xaf\xe9\xde\x94\x16" + "\xf7\xa5\x3a\xe5\x16\x5c\xcb\xcf\x61\xb8\xbf\xa9\xbc\xb8\xc0\xc6" + "\x54\xd5\x00\x92\x0f\xbc\xb2\x12\xe7\x95\x60\x6c\x98\x40\x72\x3c" + "\x83\x26\xd0\x73\x78\x80\xfb\xa9\xe2\xd7\xbc\xb1\x16\xba\x21\xbb" + "\x42\xe7\x03\x67\xa9\xe4\x22\xfd\xd4\x15\xda\xff\xaa\x07\xe0\x7e" + "\xf8\x79\x22\xfc\xbd\x17\x2e\xc9\xae\xec\x22\x39\x8e\x41\x41\xf8" + "\xef\xc1\x31\x23\xe1\x6f\x06\x51\x79\x03\x95\xf8\x38\xd8\x5f\xc6" + "\xec\x0f\x37\xd9\x1f\x0e\xd7\x5c\xc0\xec\xaf\x67\xf6\x47\x98\xec" + "\x8f\x88\x1d\x80\x73\x7e\x3f\x7b\xe0\x7b\x82\xf1\xce\x1f\xf6\xcf" + "\xc4\xef\x13\xe8\x7b\xf2\x1a\xe4\xcf\x1c\x37\xb3\x41\xf6\xb3\xcf" + "\x6d\xc0\x17\xec\x0f\x35\x39\x3f\xf4\x9f\x89\xbe\xe8\xe5\xad\xb8" + "\x4f\x7f\x7e\x51\xe3\xec\xe3\x4a\xf2\x44\x57\xfc\xe8\xbe\x80\xf1" + "\xd3\xb4\x3d\x8d\xec\x67\x57\x3c\x46\x36\x82\x8e\x84\x63\x94\xf8" + "\x6f\x9a\xf6\x7f\x64\x5c\xdc\xa2\x38\xe5\x90\x08\x65\x44\xcc\x5c" + "\xe5\xbc\x45\x4b\x17\xc6\x8f\x1d\x12\xf1\x28\x42\x26\xd8\xf1\xa0" + "\x32\xdc\x29\x43\x5e\x4c\x59\x55\x01\xe8\x37\xb9\x07\x8c\xe5\x2d" + "\x28\x0f\xe2\xaa\xef\x9d\xbc\x5f\xbf\x29\x19\x9e\xa5\x39\x45\xea" + "\xe5\x2f\x41\xdf\xff\x4c\xbf\x07\xa8\x52\x22\x94\x05\xfb\xd5\xcb" + "\x4f\xe1\x6d\x17\xe9\x6d\x30\x92\xd2\xb9\xb0\xe5\xae\xe8\xb8\xf2" + "\x16\x9d\x4f\xbb\x21\xab\xef\x43\xe7\x0e\xef\x20\xb9\x2e\xc3\x15" + "\x7d\x9e\x52\x2d\x3f\x6c\xd0\xc8\x3f\x37\xd4\xc8\xb1\x06\xf9\xa7" + "\x77\x19\x7a\x36\xd1\x15\xe1\xfd\x5f\xa5\xc0\x76\xd8\x8f\xf7\xd1" + "\xed\xd0\xb1\xae\x8f\xc6\xc7\xe1\xfc\x1a\xfe\x7f\x6a\x01\x75\xf1" + "\x9f\xde\xa0\x63\x68\x4d\xfc\xf3\x11\x7c\xad\xca\xbe\xf8\xdd\xc5" + "\xcf\xc7\xf0\xf5\x41\x5f\xa8\x9d\x0a\xe1\xf8\x04\xe4\x06\xc7\x97" + "\x18\xf2\x63\xca\x30\x2f\xe8\x56\xff\x1c\x4f\x65\x78\xce\xdf\xf6" + "\x3e\x72\x2d\x7c\x1f\x9e\xcf\xf7\x91\xf3\xbd\xd5\xf5\x05\x1a\xe7" + "\x71\xe5\xb8\x6f\xa1\x19\xb7\xdb\x72\x34\x0e\xb6\xed\xd1\xa0\xdc" + "\xc3\x78\x1b\x3c\x7f\x8d\x42\x3c\x73\x17\xb4\x63\xd3\xe0\x29\xfe" + "\x06\x45\x4c\x29\x05\xfd\x76\x6f\xf0\x94\x58\xf7\x58\xc0\x16\x3c" + "\x63\x94\x57\x4c\x69\x83\xec\x9a\xfa\x5f\xe0\x44\x52\xf0\x33\xbd" + "\x69\x4e\xd1\x27\x77\x9b\xe0\xd9\x4e\xde\xbf\xe7\xae\x16\x7e\x4f" + "\xf6\xdf\x05\xbf\x9f\x54\xef\x42\xca\x69\x58\x8f\x5d\x1d\xf8\x5a" + "\x04\xa5\xf3\x29\x07\x0d\x5b\xf7\x19\xfa\xe6\x4c\x19\x72\x0b\x45" + "\x4e\x6d\x75\xe4\xe3\x91\x7c\xba\x06\x7e\x5f\x8a\xe4\x95\x4d\x7a" + "\xfa\x9d\x41\xca\x68\x9c\xfb\xaf\x40\xf8\x7d\x00\x25\xdf\x18\x51" + "\x72\xab\x09\xb8\xac\xde\x05\xcf\x27\x37\x78\x1c\x55\xe1\x73\xde" + "\x6c\x64\xde\xa3\xdd\x66\xde\xa3\xdd\xa6\xdf\xa3\x8d\x4c\x0a\x27" + "\xef\xd1\xf0\xfb\xb3\xe9\xe1\x4e\x14\x6e\x0f\xbf\x53\xeb\xd1\x08" + "\x38\x58\xa2\xea\xa9\x5f\xa2\xea\x55\x70\x0b\x29\x2a\xb5\xf5\xa8" + "\xaa\xa1\x0c\x7d\x90\x80\x14\xd4\xed\xa8\xee\xe5\xea\x53\x88\x7a" + "\xff\x4b\xe5\xbe\x14\xb5\x8b\x1e\xe7\x3f\x6e\x7b\x3f\xea\x9e\x2e" + "\xc3\xef\x10\x7a\x66\xc5\xa1\x61\xdb\x6f\x21\xdf\x37\x2f\xa7\xd1" + "\x35\xa5\xf0\xf7\xff\x74\xb7\x55\xca\xd6\xdb\xaa\x41\xcd\xb7\x55" + "\x03\xdc\xb5\xe4\xbd\x5b\xd8\x75\x0f\x84\xe7\xf2\x52\xab\x6b\x8e" + "\x6f\xc7\xf9\xef\x46\x2d\xd2\x79\x1e\x55\x61\x2c\xc3\xdf\xee\x87" + "\xdf\xd5\xa4\x2e\x43\x1e\x86\x9f\x54\xa8\x22\xea\x16\x7a\x16\x62" + "\x8f\xdf\x4b\x6c\xbb\x44\xde\x4b\xe8\xc1\x2f\xe1\x77\x13\x77\x6f" + "\xab\xe4\x94\x22\x5e\x39\x35\x5a\x89\x9a\x77\x4e\xf1\xaf\x4a\xfc" + "\x04\xa5\x36\x53\x17\xab\x56\x1a\x10\xce\x59\x53\xab\xeb\x8f\x53" + "\x5e\xf1\xca\x13\xaa\xb3\x78\x8c\x19\xc9\x72\xc7\xb5\x6c\x69\xdc" + "\x71\x8d\x7e\x97\x80\xdf\xe1\x41\xfc\xf6\xef\xb9\x85\xe3\x09\x71" + "\xbd\xa5\x95\x4f\x81\xd8\x55\xd4\x7d\x08\x71\xab\xe1\xc4\x8d\x8e" + "\x33\x1c\x77\x25\x02\xe2\x75\x99\xc4\xb0\xbc\x11\xe2\x77\x08\xb7" + "\x11\xa7\x2e\x49\x68\x92\x83\x27\x93\x97\x37\x9d\xa7\xd7\xc3\xe0" + "\x38\xee\x69\x29\x73\x69\x86\x71\x07\xbf\x0b\xbd\x5b\x3c\x25\xbc" + "\x59\x11\x53\xd0\xaa\x88\xd9\x65\xe5\xbd\x28\x89\x67\x34\x72\x2d" + "\xaf\x3b\x4b\xe2\xb9\x98\x89\x27\x9e\x3f\xf7\x57\x55\x4f\xdd\x3d" + "\x88\xe7\x5d\x88\x67\xbc\x06\x6d\x89\x43\x8a\xaa\xfa\x1a\xfc\xce" + "\xa8\xfb\x64\x78\x92\xa7\xf8\x50\x86\x0a\xf5\xf7\x74\x5c\xf7\x42" + "\x5c\x75\x39\xa5\x41\xf8\x5d\x69\x5b\x5c\x13\x20\xae\x77\x21\xae" + "\xd7\xd9\xb8\xea\xef\x41\x5c\xef\x41\x5c\xef\x41\x5c\x99\xf7\xa9" + "\x61\xd1\x10\x57\xfc\xee\x6d\xf5\xb9\x49\xf8\x7d\x2a\x7e\x6f\x85" + "\xe3\x8a\xe7\x6c\x1b\xfe\xaa\xea\x47\xbf\x47\x9d\xa7\x42\xdb\xdf" + "\x42\xae\xc3\x9b\x90\x2c\xf5\x10\xf2\x80\xeb\xf4\x78\xea\x20\x92" + "\x43\x7b\x80\xfb\x4b\x08\xc7\xb7\xea\xa0\x1e\xad\x98\x8d\x06\xe8" + "\x72\x49\x9c\xab\x74\x5f\xe0\xbc\xb1\xdf\xdd\xbf\xaa\xe4\x9b\x13" + "\xd0\x8b\x38\xe6\x01\x97\x95\xe8\x44\x60\x05\x32\x8f\xb9\x21\x3f" + "\x2e\x10\xe2\x94\x88\xe3\x2e\xfd\xb9\xbd\x91\x68\xff\x73\xdb\x70" + "\xee\xe1\x73\xdb\xde\xcf\x6d\x43\x12\xff\x73\x7b\x63\xa2\xb4\xe7" + "\xf6\xc6\x84\x87\xcf\xed\x83\xf0\xdc\xde\xf0\x35\x7f\x6e\xdb\x74" + "\x4b\x5c\x64\xcc\xdc\xe8\x85\xd1\x0b\xff\xa2\x7c\x6b\x59\x7c\xe4" + "\x12\xa2\x5e\x38\xfa\x45\xa5\x37\xf8\xcb\x37\xc2\x78\xfd\x8d\x77" + "\x0d\xda\xd7\xb7\x46\x6e\x08\xf1\x76\xa6\x72\xaa\x63\x0d\x39\xd5" + "\xda\x8d\xa0\xc5\xf1\xf3\x9d\x07\x1a\xfb\x8a\xac\x65\xcf\xff\x81" + "\x73\x54\xc7\x5d\x43\xf8\xff\xe4\xfd\x70\x6e\x0d\x5e\x43\x59\xb0" + "\x89\xaa\xc7\x6b\x28\x4f\x1e\xc7\xda\x42\x7b\xfd\xb1\x20\xf0\x13" + "\x21\xde\xa8\x39\x24\x48\xbe\xee\x7b\xe4\xea\x5e\x83\x02\x0c\x06" + "\x8a\x52\xa7\x5c\x03\xdd\x77\xaf\x51\x1d\x7c\x0d\x61\xad\x73\x45" + "\x76\x77\x96\x72\x79\x3a\xfe\x77\xb4\x72\xf9\xea\x0b\x57\x64\x77" + "\x9a\xe9\x3c\x4e\x6f\xaa\x9e\xda\x14\xe3\xa1\xff\x38\x20\x07\xbf" + "\x3b\xdd\xde\x9b\xaa\xdb\x0b\x7e\x63\x6f\x4b\x93\xfc\xdd\x5b\x80" + "\x9b\x8c\x27\x29\xfc\x0e\x14\xf7\xc1\xbb\x71\xd0\xf7\xa0\x7b\x89" + "\x36\xbd\x33\x1b\x3f\x5f\xa0\xaf\xea\x8e\x5e\xa9\x91\xe3\x77\xc0" + "\xf8\x99\x6b\x54\x0c\x54\xae\x84\x7b\x81\xeb\xd4\x6c\xde\x44\xd5" + "\x6a\xbd\x62\xca\x9c\x95\x48\x7e\x6f\xf5\xcd\x70\xd0\x3d\x59\x58" + "\xb3\x64\xc2\xbe\xb5\xb0\x8f\xbc\x8f\xbc\xa3\xa0\xba\x69\x87\x61" + "\x9e\x03\x5c\xcb\x6e\xc8\x6e\x96\xe0\x3a\x52\x59\xc4\x9b\xd4\x37" + "\xe5\xc7\xec\xd2\xed\x9c\x12\xae\xc3\x9a\x72\xc8\x94\xd8\xe6\xfc" + "\x98\x02\x5d\x7e\x4c\xe9\x2c\x1f\xfa\xbd\x3b\x1c\x7f\x3b\x1d\xdf" + "\x47\x73\xde\x9c\x22\x38\xbe\xf1\xb6\x22\x79\xff\xed\xbc\x64\xff" + "\x53\x89\x05\x48\xf9\x3a\xe6\xbf\x9b\xe7\xa6\x14\x50\xba\xa1\x81" + "\xc0\x7f\x05\x9f\xa0\x6f\x02\x80\xff\x82\x2c\xf9\x8f\xcc\x53\xd0" + "\x23\xc2\x83\x15\x08\xda\xaa\xc3\xcf\x11\xd6\xa9\x25\xd0\x17\xf8" + "\x19\xc1\xcf\x02\xcd\x87\xc0\x85\xc6\xe7\x05\x3f\x4b\x98\xef\xe8" + "\x67\xd7\xec\xd9\xc1\xcf\xcb\x63\x5a\xe4\x81\x9f\x17\xcc\x87\xf8" + "\x79\xc1\xf3\x7f\x36\x32\xcf\x8b\x7b\x2d\xf2\xd8\x02\x5c\x58\xa5" + "\x2b\xa3\x9f\x19\xac\x27\xcb\x75\x26\x3c\x88\xdf\x1d\x99\x3c\x2f" + "\xd9\xc6\xe7\xc5\xc8\x83\xf0\x4c\xe8\xf0\xf3\xf2\x57\xd5\xa0\x96" + "\xbf\xb2\xcf\x4b\xc8\x79\x0f\x44\x73\xe4\xea\x9a\x49\x85\xf0\xbc" + "\xe0\x9c\x9a\xde\xc8\x83\xf0\xbc\xe0\xf5\x49\x34\x0f\xbe\x03\x3c" + "\xd8\x00\x3c\xa8\x85\xed\xf0\x9c\x6c\x7b\x9b\xe1\x41\xe6\xf9\x68" + "\xfe\x2b\xc3\x83\xd7\x95\xa8\x65\x08\xe6\xc1\x2d\x02\xfa\xe5\xbc" + "\x19\x0f\xde\x9e\x2a\x8d\x07\x6f\xd3\xf5\xcf\x70\x0c\x5b\x20\x9e" + "\x38\x8e\x53\xbc\x29\x5d\x79\x01\xf0\xdf\xcc\x2e\x16\xb7\x38\xfe" + "\xb8\xed\x65\xc6\x2f\x5e\x9e\xe3\x89\x1b\xe0\xbc\x41\x77\xcf\x32" + "\x76\xd4\xea\xff\xe4\x98\x72\x1d\xe6\x38\xcc\x77\x98\xe7\x30\xe7" + "\xe1\xe7\x03\x73\x1d\xe6\xb9\xdf\xc3\x18\x00\xbf\xd7\x57\x44\x5d" + "\xa2\x39\x30\xf5\x32\xf2\x48\x9d\x88\x06\x54\x95\xea\xc1\xdf\xdc" + "\x41\x98\x03\x4d\xc7\x37\xcc\x79\x38\xb6\x9b\xef\x12\xce\xc3\xe3" + "\x1c\xe6\x37\x8b\x71\x0e\x62\x0b\x31\xf1\xc3\xe3\x1c\x9d\xb7\xc8" + "\x78\x7c\xdc\xf6\x5e\xc4\x97\xe4\xf5\x42\xae\xf7\x56\xdf\x19\x69" + "\xe9\x4d\xee\x4c\x32\x7a\x13\xfc\x8c\xe3\x67\x5d\x23\xbb\x49\xbf" + "\xaf\x52\xf7\x1d\x03\xcf\xfb\xcd\x61\xc4\x8b\xbe\xad\x25\xfe\xa8" + "\x95\x7c\x5b\x4e\xb1\xd4\x8f\xf5\xff\x77\xf2\xc9\x3c\x01\xf0\xfb" + "\x5e\x61\x4d\x54\xfe\x40\x15\xee\x63\x7c\xcf\x6f\xfa\x00\x46\xf3" + "\xe3\xd2\x36\xe0\x7e\xcb\x8f\x5b\x09\xff\xcf\x64\x71\x77\xe7\xc4" + "\x89\x44\x84\x66\x25\x8a\xc5\xdd\x1d\x32\x07\xe2\x87\xa0\xc7\xa9" + "\x90\x20\x67\xc3\x0f\x41\x2e\x80\x11\xef\x45\xfa\x34\x74\x37\x27" + "\xb7\x3a\x55\x47\xd5\x2b\x97\xa3\xa1\xc0\x9d\x43\x4e\xea\x10\x3a" + "\xd9\x88\x50\x55\xc0\x02\x88\x77\x6e\xe0\x3e\x83\xd6\x59\x23\xd3" + "\x36\x80\x7f\xac\x07\x2e\x76\x36\xe5\x62\xc2\xbb\x5a\xba\x66\x58" + "\x53\x4e\xae\x06\xb7\x35\xbd\x0c\xb9\xc3\x78\xec\x7c\x45\x76\xef" + "\xc4\xb2\x64\x84\xd7\xd6\xba\xc0\xff\x73\x5b\x7a\xcd\x0d\x84\xf3" + "\x7b\x52\x3f\xcc\x94\xc5\xbe\x82\x06\x50\x21\x33\x65\x78\x5e\xc4" + "\x6e\x43\x91\xdc\x00\xdb\xc8\x3c\xab\x22\x84\xf7\x67\xb5\x38\xd3" + "\x3a\xcd\x00\xc7\x54\x36\x16\xa1\xac\x04\x57\x84\x8f\x27\x73\xf7" + "\x8a\x10\x3e\x3e\x3b\xce\x83\x9e\x57\x41\x9f\xa7\x2b\x42\xf8\x5c" + "\x3d\x6c\x7f\xcf\xe0\x86\xd6\x2f\x57\xa0\x93\xe5\x95\x74\x1b\x27" + "\xcb\xff\x85\x70\x1b\xf0\x2c\xc0\xff\x8f\xa2\x0d\x09\xde\xc0\x09" + "\x45\xb0\xff\x3f\x68\xc3\x8d\x7e\xf0\xef\x15\xf8\xb9\x8b\xae\xc9" + "\xee\x8d\x3c\x59\x6e\x40\xee\xe9\xe3\x28\xc0\x34\x55\x85\xd7\x6b" + "\xa6\xa0\x6e\x70\xed\x63\xab\x6a\x72\xc0\xd3\xde\x1d\x8c\xd7\xf3" + "\x53\xa9\x21\x0d\x06\x2a\xe4\xba\x21\x35\xe4\x06\xfe\xdb\x7a\x2a" + "\xe4\x57\xfc\xb7\xb3\x97\x2b\x99\xb9\xbc\x45\xf4\xbc\xc3\xac\xbb" + "\x83\x11\xbe\x56\xfc\x77\xf1\xdf\xdb\x10\xa7\x62\xfe\xe6\x30\xfa" + "\xda\xf0\xdf\xc4\x6d\x9a\xfe\xcd\x53\xf8\x6f\xbe\x41\xff\xcd\x03" + "\xf0\xaf\x27\xc4\x43\x85\xe3\x80\xff\xbe\x81\x0a\x72\xa1\x52\x83" + "\x9c\xe8\x73\x9a\xea\xf9\xce\xb9\xcc\x9c\x33\x98\xce\x03\xc0\x39" + "\xcd\x14\x7d\x3c\xdd\xc6\x25\x59\x93\x0c\x6f\x7f\x3a\x48\x8d\x2c" + "\x63\xd8\xb4\x95\x8c\x9d\x4d\x31\x64\xec\x24\x31\xa5\xb1\x12\x12" + "\xe4\x02\x71\xf3\xc0\xe3\x2c\xb4\x31\xb1\xad\x8d\x1f\x82\x9c\x70" + "\xbc\x31\x6e\x8c\x58\xc2\x38\x32\x62\x88\xbe\x4e\x2d\x42\xa6\x98" + "\x81\xff\xbb\x32\xed\x64\x1b\xdb\x81\x6b\x40\x46\x1c\x3d\x0d\xfb" + "\x2d\x71\xd4\x12\xc9\xe2\xa8\xc5\xa5\x29\x85\xa2\x30\x8e\xd4\xc1" + "\x19\xb8\x9d\xb3\xec\xf5\xcc\x94\x61\x8c\x3d\x60\xd8\x1a\x89\xe3" + "\xf4\x74\x12\x52\x90\xfb\x69\xde\x49\xdf\x4f\x92\x5a\x81\xaf\xd5" + "\x78\x1f\xf8\x1a\xd6\x1b\x94\xc8\x78\x1f\x1b\x5a\x06\x43\xbb\x37" + "\x10\x73\xce\x39\xdc\xb6\xb1\x0f\x20\x66\xc8\x78\x8e\xf1\xf8\xf5" + "\x06\x15\x5c\xf7\x30\xfa\x1c\x82\xb9\x2b\x3c\xf8\x69\x19\x62\x8e" + "\xb9\xc7\x92\x10\x08\x62\xd0\x5a\xc1\xb7\xe0\xef\xb4\x8c\x27\xd7" + "\xf6\x95\xbe\xf9\x87\x20\x1c\x57\x39\xb3\x7d\xb6\x09\x26\x98\xf6" + "\x9b\xf8\xda\x5f\xc5\x69\x3f\x08\xda\x4f\x84\xf6\xb1\x96\x0b\xc6" + "\x39\xbc\x96\x1d\x74\x3b\x89\xa4\x7d\x23\x6e\xa9\x9c\xb0\xc2\xd8" + "\xe5\x78\xee\x6b\xeb\x24\xc2\xa7\x5a\x9a\x3b\xe9\x39\x57\x72\x43" + "\x91\xc1\x6c\xce\x95\xe9\x9c\xbc\x7d\x29\x5a\x66\xbe\x55\x2b\x5d" + "\xdb\x0b\xe7\xca\xb0\x26\x2d\x01\x3d\xc7\xce\xb9\xfa\x1e\xef\x1f" + "\xa1\x4e\xb8\x64\x32\xe7\xaa\x95\xfe\xde\x8b\x46\xd6\x1a\x7a\x4f" + "\x8e\xe4\xf0\xbb\x37\xd9\xae\xcd\x33\xdd\xce\xce\x69\x24\xdb\xf1" + "\x7c\x71\x26\x67\xdc\xf0\xcf\x52\x9c\x37\x6c\x8d\x37\xe6\x6a\x05" + "\xbc\xb0\xfd\x9a\x59\xee\xd2\xd4\xa6\x99\xe1\xff\xc2\x9a\x59\x37" + "\xd0\xaa\x66\x96\x3b\xf9\xb7\x69\x66\xb9\x6c\x07\xfd\xdc\xcb\x65" + "\xab\xe8\xe7\x5e\x2e\xa3\x9f\xef\xf5\xd0\x9e\xee\xc3\xcc\x22\xea" + "\xe3\xd7\x7c\x31\xce\xb7\x81\x06\xde\x97\x50\x26\x2f\x01\xdf\xad" + "\x97\x3f\x49\xbd\x0b\x7d\x87\x6b\xcd\xbd\xbb\x1c\xc6\x6f\xdd\x19" + "\x54\xe9\x8c\x35\xf3\x25\x68\x07\xed\xac\xa4\xdf\x29\xce\x61\x72" + "\x83\xba\x64\x88\x85\x53\x55\x53\x13\xa2\x8f\x83\x7d\x30\xae\xd5" + "\x61\xcd\x7c\xd4\x50\x26\xdf\x06\x7d\x0a\x3f\xa0\xa9\x33\x63\x4d" + "\x35\xf5\xbd\xd5\xba\x3d\xbc\x5a\x5a\x8e\xc2\x75\xab\x4d\xb5\xb4" + "\x8e\xae\x73\x8d\x73\xfc\x58\x1f\x18\x88\x86\x0e\x07\x3d\x1d\x8b" + "\x75\x35\xd6\xd2\x06\x8e\x96\x36\x54\x58\xd7\xd2\xfa\x21\x0f\xb5" + "\x74\x47\x69\x69\x63\x4e\xc1\x5c\x4b\x1b\x36\x4b\xd3\xd2\x86\x82" + "\x87\x5a\xba\xab\x69\x69\xc3\x4a\xa3\x96\x36\x64\x3c\x3e\x14\xe7" + "\xf8\xb7\x19\xb5\xf4\x3a\x94\x66\xa1\xa5\xd7\xa1\x3c\x4b\x2d\xad" + "\x53\xb3\x5a\x5a\x17\xce\xd1\xd2\xf2\x6e\xbb\x2d\xb4\xb4\x1c\x5d" + "\x14\xd2\xd2\xc0\x63\x0d\x58\x4b\x63\xac\x61\x5d\x8d\xf5\x34\x5c" + "\x7b\x26\x8d\x3b\xb9\xcc\x53\x92\x96\x96\xcb\x3c\xec\xd2\xd2\x72" + "\xd9\x62\x7e\x2d\xad\x53\x0a\x6b\x69\x9d\x92\x57\x4b\xcb\x9d\x3c" + "\xdb\x34\x90\x5c\x7e\xbe\xcb\x6b\x69\xb9\x3c\x8d\x57\xef\xc8\xe5" + "\x6b\x69\x2d\x2d\x97\xc5\xb6\xbb\x96\x86\x36\x79\xb5\xb4\x5c\xae" + "\xa7\x75\x87\x5c\x16\x6f\xa1\xa5\xf1\x39\x7c\x5a\x5a\xee\x34\x82" + "\x39\x27\x96\xa3\xa5\x99\x36\x60\x0c\x9d\x2a\xa8\xa5\xe5\x4e\x57" + "\xc9\x98\xea\x74\x88\x68\x69\x12\x53\x0b\x2d\x2d\x77\xca\xb5\xa9" + "\xa5\x19\x0c\xd1\xd7\x29\xa4\xa5\xe5\x4e\xe7\x2c\xb5\xb4\x4e\xc9" + "\xab\xa5\xe5\x2e\x07\x58\x1c\xb9\xcc\xe0\x68\x69\xb9\xf3\xc0\x07" + "\x42\x4b\x0b\x63\x2b\x8d\xa3\xa5\xe5\xce\x37\x45\x6b\x69\xb9\xcb" + "\x10\x51\x5a\x9a\xc6\x1c\x8f\x96\x96\xbb\x2c\x36\xc7\x1c\x47\x4b" + "\xcb\x5d\xb2\x79\xb5\xb4\xdc\x65\x27\x47\x4b\xd3\xed\xf3\x68\x69" + "\xb9\xcb\x69\x4e\xfb\xe6\x5a\x5a\xee\x72\x9d\xa3\xa5\x99\xe3\xda" + "\xb4\xb4\xbc\x1b\x33\x9f\xb1\xf5\xa4\x68\x2d\x2d\xef\xb6\xd4\xaa" + "\x96\x96\x77\x4b\xe6\x68\x69\x79\x37\xfa\x7d\xbf\x46\xde\x6d\x17" + "\xad\xa5\xe5\xdd\x22\x18\x8d\x5d\x66\xba\x9d\xd5\xd2\x64\xbb\x85" + "\x96\x5e\xd7\x4d\x6d\x43\x4b\xfb\xdb\xaf\xa5\x7b\xa1\xb2\x36\x2d" + "\xdd\x0b\x19\xb5\x34\xfe\x56\x52\x21\xe8\xd3\x42\x5a\x4f\x9f\x42" + "\x27\xeb\xf0\xf5\x3f\xb2\xd8\xba\x9e\x76\xf7\x65\xf5\x74\x8f\x74" + "\xf2\xec\xf7\x88\x24\x7a\xba\xc7\x90\xb6\x1c\x34\x68\x69\xac\xa9" + "\x99\x1c\xf4\x99\x2c\xf8\xd9\xb7\xbc\x8c\xd6\xd3\x78\x1d\x00\xd6" + "\xd4\x58\x4f\x63\x5d\x8d\xb5\x72\xc5\x4a\x84\x2a\xb5\x4d\x78\x0e" + "\x4b\xb5\x7a\x00\xee\xd7\x1e\x9e\xa0\xc3\x35\x30\xb6\x55\xc3\xb9" + "\x9a\x7d\xb7\x9a\xf0\x9a\x92\xda\xf5\x97\xe0\x1c\x0d\x39\x07\xf6" + "\xd7\xe0\x73\xe0\x98\x5a\x12\x0b\xb7\x18\x32\x7e\x32\x7a\x5c\xee" + "\xda\x83\xa3\xc7\xc9\xb1\x67\x8c\x7a\x7c\x2b\x5c\x03\xfc\x38\x63" + "\x2d\x8e\x35\x39\x68\xf1\xf2\xad\x9b\xa8\xb2\x6d\xbd\xa9\xe3\xf7" + "\xd6\xb9\xfa\x1b\x35\x79\x36\x6c\x5b\x0f\xdb\xe0\x3a\xaa\x8f\x17" + "\x21\x74\xe4\x96\x1a\x6b\x0a\xcd\xd6\x2b\xc8\x19\x62\x56\xf3\x2e" + "\xfc\x7d\x7c\x3e\x9c\x13\x6f\x3c\x07\xc6\xf7\x72\xa2\xe1\xdd\x86" + "\x19\x4c\xf3\xe1\x72\xd7\x63\x6d\x1a\x1e\xfa\x09\xe7\xdb\xf1\x37" + "\xc8\x68\x1d\x3f\x64\x4a\xac\xce\xa8\xe3\xbd\x4c\x74\xbc\xfc\xd1" + "\x7c\xa3\x8e\xc7\x6b\xb9\xda\x74\x7c\x3c\xa3\xe3\xe5\xae\xd7\x25" + "\xea\xf8\x33\x5d\x45\xc7\xbb\xc9\x64\xce\x6e\xe1\x44\xc7\x17\x26" + "\xb4\x8f\x8e\xc7\x1a\x1e\xeb\x76\xac\xe1\xb1\xa6\xc7\x3a\x1e\x6b" + "\x7a\x03\xa3\xe3\xb7\x99\xe9\x78\x03\x68\x76\x73\x1d\x8f\xb5\xbd" + "\x51\xc7\x1b\x4c\x75\xbc\xfc\xd1\xb9\x92\x74\xbc\xfc\xd1\xf0\x76" + "\xd0\xf1\x9d\x13\xb7\x2e\xa4\xe3\x55\x66\x3a\x1e\xeb\x76\x78\x26" + "\xeb\xb0\x9e\xaf\x52\x43\xdf\x2c\x06\x4d\x0f\x7a\x5e\xb2\x96\x97" + "\x3f\x1a\x60\xaa\xe5\xb7\xf5\x32\xd5\xf2\x6e\x01\x96\x5a\xde\x2d" + "\xdc\x44\xcb\x97\x6b\xe4\xae\x2b\xe9\x71\x02\xf8\x40\xfd\x16\xd6" + "\xe9\x8f\x68\xb9\x5a\xbe\xd7\x01\x4b\x2d\xef\x56\xc2\xab\xe5\x89" + "\xbf\xe7\x6a\x79\xaf\xb8\x95\xba\x36\x2d\xef\x76\x5e\x9a\x96\x77" + "\xab\x6d\xf3\x1a\xf2\x47\x0e\x93\xf1\xc8\x2d\x49\x48\xdf\xdf\xf3" + "\x30\xd5\xf7\x3d\x66\xb0\xfa\x3e\x9e\xd5\xf7\xf2\x47\x62\x05\xf5" + "\x3d\xec\xa3\xe7\xd5\x7b\xe4\x6a\x70\x5b\x58\x97\x01\xb7\xd6\x29" + "\xe3\xb0\x36\x73\x97\x61\x6d\x06\x7c\x56\x87\xe7\xa3\x5f\x91\xf7" + "\xac\x30\xea\x7c\xda\xa7\x62\xad\xbf\xbc\x2b\xea\xb1\x9e\x0b\xf8" + "\xf5\x58\xcf\x65\x58\xf7\xd0\x6b\x7d\xe5\x3d\x02\xa1\x4f\xea\xda" + "\x57\xef\xf7\x08\xe4\xd7\xfb\x3d\xaf\x13\x6d\xd4\x63\x26\x8e\x0b" + "\x57\xef\xc3\x39\xbc\x7a\xdf\x7d\x20\x73\x4e\x20\x57\xef\x93\x36" + "\x60\x8c\x1f\x2b\xac\xf7\xdd\xcf\x91\x31\xdf\x7d\x37\x19\xf3\x49" + "\x8c\x2d\xf5\xbe\x7b\xba\xa9\xde\xc7\xf1\xb7\xd4\xfb\x04\x53\xf4" + "\x75\x0a\xea\x7d\xf7\x93\x16\x7a\x1f\xfe\x26\xd6\xfb\x3a\x13\x5c" + "\x15\x62\x5c\xbd\x85\x71\xe5\x79\x08\xe3\x0a\x8f\xab\xca\xf9\x18" + "\x57\x9e\xb3\x9b\x0c\x46\xdd\xbf\x0e\xda\xf3\xe8\x63\xae\xfb\x31" + "\x8f\x58\xc3\x59\x6c\x1c\x1a\x80\xb1\x86\x71\x66\x8c\x1b\x3e\x1e" + "\xe3\xad\x63\xb1\xe6\x51\xc3\x8f\x35\x8f\xcb\x74\x9c\x19\xac\xe1" + "\x7c\x25\xf1\x01\xf4\xfd\x35\x8b\xf3\x01\xf8\x1c\xcf\xe1\xe2\x7c" + "\x00\xc6\x22\x9f\x0f\xf0\x5c\x66\x8e\x45\xae\x0f\xf0\xcc\xe7\xf7" + "\x01\x9e\x25\x5c\x1f\x80\xdb\xe7\xf3\x01\x9e\xe7\x38\xed\x5b\xf8" + "\x00\xcf\x3b\x5c\x1f\x40\x8e\x63\x7d\x40\xaf\x42\xc2\xc5\x8f\x78" + "\x89\xf7\x01\xbd\x92\x19\x7e\x27\x3e\xe0\x92\xb9\x0f\xe8\xb5\x8a" + "\xeb\x03\x7a\x05\x11\x7e\xed\xb5\xbf\x89\xf6\x01\xbd\x16\x90\xed" + "\x8f\x28\x4c\xb7\xb7\xf9\x00\x66\x7b\x93\xa9\x0f\x50\x63\x1f\xd0" + "\xab\xcc\x86\x0f\x08\xb4\xdf\x07\x0c\x48\x64\x7d\xc0\x80\x44\xeb" + "\x3e\xe0\xf1\x65\xd6\x7d\xc0\x13\x07\x59\x1f\xd0\xd7\x85\x70\x42" + "\x9f\xab\x84\x13\xfa\xd0\x79\x2b\x78\xae\xd8\xbc\xfa\x62\x7a\xfe" + "\x79\xd9\xde\x5b\x65\xf2\x7d\x71\x4c\x5e\xfd\x2e\x78\x80\x04\xd0" + "\xf3\x8d\x44\xcf\x03\x67\x1e\xc7\x3e\x00\xeb\x75\xe2\x01\xfa\xe4" + "\xc3\x36\x0d\xf4\xf9\x71\x68\x4b\xb3\x67\xb9\x5a\x8e\xe7\x86\xe1" + "\x63\xe1\x79\xaf\xc9\x82\x71\x04\xb6\xd7\xc0\x31\x6a\x7c\x0e\x6c" + "\x3b\xa3\x8e\xa3\xcf\x4b\xc7\x5e\x01\xce\x53\xc3\xfe\x5a\xb3\xf3" + "\xaa\xf1\x79\x95\x89\xb4\x17\xa8\x26\xb1\xf3\xbe\x08\xdb\xcb\x59" + "\xdf\xa0\x98\x48\xfb\x86\x46\xc6\x37\xc0\xb1\xd0\x56\x19\xed\x1b" + "\xde\x02\xdf\x00\xd7\x0d\x3f\xa6\xbe\xe1\x30\xf8\x86\x52\xf0\x39" + "\x07\xef\xad\x53\x24\x9a\xf8\x86\x52\xec\x13\xb0\x67\xc0\x5e\x01" + "\xc6\xb5\x83\xd8\x47\x1c\x69\xd1\xe0\xb9\xf6\x67\xc0\x37\xd4\xe0" + "\xf3\x4d\xce\x3d\x68\x7a\x2e\x3e\x1e\xae\x51\x4d\x7b\x0e\xd0\x79" + "\x70\x0d\xb5\x5b\x2f\xd1\x9e\xa3\x1c\xce\xad\x26\x9e\x43\x51\x6f" + "\xe2\x39\x0e\x13\xcf\xe1\x5d\xc4\x79\x6f\x20\xf7\x1a\x25\xde\x73" + "\xfc\xae\xbb\xd5\x77\x07\x72\xaf\xb9\x62\x3c\x07\xdc\x77\x99\x51" + "\xbf\x5a\xcc\x43\xc4\x73\xf0\x41\xc3\x62\xbd\x6a\x75\xde\x1a\xa3" + "\x65\xb1\x76\xc5\xba\x15\xeb\x57\xbb\x3c\x07\x5c\x7f\x79\x53\x3b" + "\xbe\x3b\xe8\x06\x9e\x23\x41\xd8\x73\x98\xfa\x0d\xec\x3f\xb0\xe7" + "\x80\x67\x8c\xf6\x1c\x85\x19\x66\x9e\xa3\x9b\x0d\xcf\x21\x33\xf5" + "\x1c\xbd\xcf\x4a\xf3\x1c\xbd\xcf\xb4\x83\xe7\x28\x7b\xe8\x39\xda" + "\xdb\x73\xf4\x56\xb7\x79\x0e\x39\xf3\xfe\xa0\x97\xd1\x73\x78\xab" + "\x2d\x3d\x87\xf7\x19\x13\xcf\x71\x58\x23\x57\xd0\xef\x45\x89\xdf" + "\x50\xa8\xb8\x7e\xe3\x49\x1f\x4b\xbf\xd1\xa7\xbf\x34\xbf\xd1\x67" + "\xaa\x34\xbf\xd1\x27\x80\x5c\x1f\x7e\x57\xfa\x78\x13\x19\xf7\xbc" + "\x1b\x58\x0f\xf2\xb8\xda\x74\x9b\x6d\x0f\xd2\xe7\x2c\xbf\x07\x79" + "\x3c\x51\xd8\x83\x3c\x9e\x28\xec\x41\x9e\x58\x85\xb5\x22\xf6\x1b" + "\xd0\x3e\x68\xc5\x27\x66\x98\xbe\x6b\xc8\xb2\xa1\x0b\xcd\xfd\x47" + "\xec\x5b\xc4\xaf\x74\xbc\x2e\xec\xab\xe5\xd7\x85\x7d\xf5\x58\x73" + "\xe9\x68\x5d\xd8\xe7\x4c\x61\xbb\x7b\x90\x3e\x67\xf8\x3d\xc8\x13" + "\x4c\xfe\xb7\x4f\x8d\xa5\x07\x81\x73\x78\x3d\xc8\x13\x3b\x99\x73" + "\xce\x70\x3d\x08\x69\x03\xf4\xc5\x31\x61\x0f\xd2\x2f\x8c\xe8\x8d" + "\x7e\xc3\x89\xde\x20\x31\xb6\xf4\x20\xfd\x5c\x6c\x7b\x10\x82\x29" + "\xfa\x3a\x05\x3d\x48\xbf\xb6\xf7\x1f\xac\x07\x79\x3c\x11\x7b\x10" + "\x7e\x5c\x0d\x18\xc1\xc5\x55\xff\xd3\x5c\x0f\xd2\x6f\xab\xb9\x07" + "\x79\x00\xb1\xa6\x65\xdf\x3f\xe0\x7b\xea\xbf\x58\xbc\xef\xe8\xbf" + "\x53\x9c\xef\xc0\xf8\xe3\xf3\x1d\xfd\x6f\x9a\xe3\x8f\xeb\x3b\x06" + "\xf4\xe0\xf7\x1d\x03\x86\x70\x7d\x07\x6e\x9f\xcf\x77\x0c\x98\xc1" + "\x69\xdf\xc2\x77\x0c\x88\xe1\xfa\x0e\x72\x1c\xeb\x3b\x9e\x54\x10" + "\x4e\x7e\xbc\xbf\x78\xdf\x31\xe0\x8e\x75\xdf\x31\x40\xcf\xf5\x1d" + "\x03\xaa\x09\xa7\x3e\xa9\x22\xbe\x63\x40\x1d\xd9\xfe\x78\x3f\xd3" + "\xed\xac\xef\x20\xdb\x2d\x7d\xc7\x93\xfe\x36\x7c\x87\x9b\xae\x78" + "\x4a\x78\xcb\xe0\x29\xb1\x2d\x79\xc9\x39\x4f\xd7\x3d\xa9\x6f\xfb" + "\xb6\x43\x38\x68\x88\x5a\xd0\x14\x73\x91\x1c\xd7\x47\x48\x39\x0d" + "\x5a\x61\x2e\x59\xc7\x80\xf5\xc2\xde\x04\xac\xfb\xd4\x2e\xd0\xa7" + "\xa8\x55\x11\xec\xaf\x1b\x16\x96\x86\x75\x43\x73\xf1\x14\xff\xa6" + "\xbc\x98\x82\x66\xbc\x86\x61\x01\x92\xbf\xd9\xc0\xaf\x05\x57\xd4" + "\x52\x06\xc0\xbc\xeb\xf4\x50\xa2\x03\x2b\xa2\x2e\xd3\x38\xc6\x5a" + "\x62\x0b\x68\x89\xaa\xc6\x1a\x5a\x5b\xb8\x85\x2b\x51\x61\x0a\x52" + "\xf4\x68\x40\x1e\x3d\x64\xb2\x6e\xaf\xcd\x46\x48\x0f\xba\x62\xa2" + "\x0f\x65\x18\x5a\xa7\xc4\xf5\x90\x7a\x12\x6d\x51\xea\xa2\x63\xb4" + "\xc5\x7b\x77\xd1\xb0\xad\x38\xff\x5c\x41\x34\x05\xfe\x0e\x44\x33" + "\xd1\x14\x03\x5a\xee\xa9\x06\xb5\xad\x61\x68\x5b\x9b\xc2\xae\x61" + "\x68\xcd\x65\xf5\x04\xd6\x12\xd4\x9b\xa0\x05\x9b\xc8\xfc\x91\xe5" + "\x33\xc8\x1a\x86\x61\x75\x48\xbe\x7d\x0e\x72\x2d\x0f\xbf\x84\x73" + "\x45\xde\xe5\x75\x3b\xd1\xb2\xc9\x68\x80\x0e\xeb\x07\xd0\x86\xe5" + "\x75\xf9\x08\xd7\x7a\x2c\x04\x1d\x51\xc0\x68\x88\x80\xb9\x02\x1a" + "\x02\xc6\x6a\xac\x23\xc8\x18\xad\xbc\x79\x42\x75\x02\x89\xd7\x86" + "\x4a\x3a\x4f\x29\xb8\xb6\xb9\x18\xfc\xc1\xe0\x29\xfe\x7a\x45\x72" + "\x0e\xa9\xfd\x19\xa7\x36\x7c\xb8\x76\x3f\xae\xe9\xf8\xe9\xa5\x7a" + "\x19\xae\x63\x8e\xbf\xe9\x69\xd8\x13\x96\xc6\x59\x77\xd2\xca\xc4" + "\xac\x95\xc4\x0c\x6b\xc2\xb0\x06\x44\xbd\xa9\x93\x23\xd8\xd7\x93" + "\x5e\x77\xd2\xa4\x41\xec\xb7\x3d\xbd\x71\xdd\x2d\xba\x7e\xa6\x61" + "\x45\x54\x77\x03\xc4\x85\xca\x90\xa3\x92\xbb\x4d\xb4\xee\xcb\xc2" + "\xdf\xfb\x4c\x97\xf5\xc0\xba\x0f\xb0\xff\xe8\xf6\x16\x88\xd1\x45" + "\x12\x23\x2a\xc3\x95\xfe\x57\xb7\x42\xa5\x84\xb6\x07\xb5\xb6\x82" + "\xee\x63\xbe\x0d\x6a\xac\x25\x4c\xaf\x21\x6a\xc1\x6b\x88\x6a\x90" + "\x2e\x97\xd4\x67\x04\x5c\xc8\x70\x5d\x13\xb8\x86\x7e\xf4\xda\xa1" + "\x56\x15\xc6\x91\xc7\xb6\x2b\x78\xbd\xd3\xf7\x74\x7c\xf4\x4c\x5c" + "\xf0\x37\x42\x8d\x7a\xae\x72\xd7\x59\xb2\x7e\xd4\x2c\x16\xad\x3b" + "\x89\x6e\xa7\xd7\xf3\xac\x7b\x72\x26\x9e\xf7\x73\x43\x3e\x68\xed" + "\x89\x78\xd0\x4e\xf1\x62\xe3\x32\x28\xb3\x6b\xc4\xc5\xe3\x37\x16" + "\x97\x81\x7e\x24\x2e\x83\x07\x4a\x8b\xcb\x60\x65\xd7\x88\x8b\xeb" + "\x6f\x2c\x2e\x83\xaa\x49\x5c\x86\x1c\x92\x16\x97\x21\xa5\xd6\xe2" + "\x82\x73\x64\xc6\xfc\x98\x31\x37\x86\xc7\x53\xe2\x8b\x86\x67\xb1" + "\x73\x4d\x87\x67\x99\xce\x35\xfd\xe6\x38\xae\x1b\xb0\x0e\x9d\x9a" + "\x80\xc7\xca\xa7\xb2\xad\xe7\xc4\x86\x9e\x61\x73\x62\x3e\xa3\x88" + "\x46\xf5\xe9\x43\x34\xaa\x8a\x9e\xb7\x92\x7c\x1e\xc9\x75\x4f\x05" + "\xe4\xec\x5d\xa8\x96\xe3\x75\x5a\x7b\x6f\x34\xc9\xb3\x6e\x81\xe6" + "\x94\x3f\x49\xe1\x1c\x55\x76\x1c\xa2\xeb\x6c\xc6\xce\x47\x4f\x5e" + "\x93\xab\x66\xe0\xfa\x72\x47\x6f\xa8\xe5\x39\xf8\x98\x41\x6b\xf7" + "\xef\xe9\xab\x95\xe1\x71\x74\xef\xc2\x26\xb9\x11\x4b\xc6\xf5\x9b" + "\xd0\x9f\xb1\xb7\x77\x4e\x09\xc7\x73\x41\x5b\xbc\x62\x0a\xf4\x5e" + "\xc9\x39\xba\x92\xb0\x34\x3e\x7c\xd1\xeb\x42\x61\x0c\xc5\xeb\x38" + "\xe7\xc4\xb2\x38\x33\xac\x20\xf8\xaa\x04\xcd\x8e\xbf\xa1\xe4\x0e" + "\x63\x27\xd5\x1a\xd5\x3d\x64\x37\xc4\x9e\xc1\x18\x8c\xdf\xc2\x18" + "\xdb\xcc\xc5\xd8\x6d\x06\x63\x80\xb5\x36\x8c\x99\xac\xeb\x9c\x44" + "\x30\xa6\x69\xc3\x18\x3d\x76\xae\x50\xf5\xc3\x38\x33\x62\x0c\x8f" + "\x9b\x04\x63\x97\x04\x31\xf6\x4d\x2d\x3f\xc6\x74\x43\x4c\x31\x36" + "\x38\x8a\x60\x4c\xd5\xff\x44\x28\x60\x2c\x54\x2c\xc6\x54\xfd\xb8" + "\x1e\xfb\x99\xd1\x96\x1e\x5b\x95\x6e\xee\xb1\x8d\x9e\xfa\xb6\x57" + "\x5c\xda\xed\xfc\xb8\x95\x8d\x5e\x46\x5f\xad\xda\x29\xcd\x57\xab" + "\x8a\xed\x9b\x93\xe7\xe3\x72\x2a\x09\xa1\x53\xf0\x3c\x55\x05\x92" + "\x39\x79\x9f\xd2\x7e\xf9\xa9\x1c\x8c\x43\x7e\xbf\x4c\xf6\x59\xce" + "\xa5\x1a\xba\x93\x9d\x4b\x35\x74\x71\xf3\xfb\xfc\x73\xf2\x3e\x49" + "\x29\x30\xf1\x2e\x05\x3c\xde\xa5\xc0\xec\x3d\x5d\x01\x8f\x6f\x29" + "\x40\xf8\x5c\x53\xdf\x72\x2a\x90\xf8\x96\x53\x81\xd8\xb7\x14\xd0" + "\x7a\xef\x54\xa0\xd1\xb7\x14\xc0\x7e\xe2\x5b\x4e\x05\x5e\x81\x1f" + "\xec\x5b\x86\x2a\x4e\x05\xf2\xf9\x96\xa1\xfd\xc9\x9c\x3c\x1f\x67" + "\xe1\x39\x79\x05\x26\xfe\xb8\xc0\xc4\x1f\x17\x30\xfe\xb8\x80\xf6" + "\xc7\xe4\x6f\x0e\xa3\xaf\x0d\xff\x4d\xdc\xa6\xe9\xdf\x64\xfd\xc3" + "\xd0\x5c\xe2\x1f\x7c\x5c\x71\x1c\xb8\xfe\x18\xce\x49\xe4\xf3\xc7" + "\x43\x4f\x30\xe7\x38\x1b\xfd\x71\x0b\x39\x9e\x6e\x03\xb8\xe6\xa2" + "\xb0\x3f\x7e\x3a\x99\x70\xcf\xd3\x53\x09\xf7\x90\x98\x5a\xfa\xe3" + "\xa7\x4d\xfd\x8f\xc0\x9c\x3c\x82\x21\xfa\x3a\x63\x85\xfc\xf1\xd3" + "\x31\x96\xfe\xf8\xa9\x2c\xfe\x39\x79\xc3\x27\xb2\x38\x1a\x76\x99" + "\x3b\x27\xef\xe9\x2f\x4c\x7d\x31\xc6\xd8\x03\x86\x2d\x05\x77\x4e" + "\xde\xb0\x55\xfc\x9e\xb8\xc0\xc4\x13\x17\xd0\x9e\xf8\x54\xa0\x71" + "\x4e\xde\xb0\x43\xb8\x6d\x4b\x4f\x5c\xd0\x76\xbc\xd1\x13\xe3\x73" + "\x08\xe6\xf8\x3c\xf1\x70\x17\x73\xcc\x71\x3d\xf1\xf0\x81\x46\x4f" + "\xdc\x12\x62\xea\x89\x87\x8f\xe6\x7a\x62\xdc\x3e\x9f\x27\x1e\x1e" + "\xc9\x69\xdf\xc2\x13\x0f\x4f\x37\x7a\x62\xdc\xbe\x11\xb7\xac\x27" + "\x7e\x66\x30\xe1\xd0\xa7\x46\x89\xf7\xc4\xcf\xd0\x79\x9d\x92\x2d" + "\xe4\x5d\x17\xd7\x0f\x3f\xd3\x83\xeb\x87\x87\x6b\x88\xef\x7d\xc6" + "\x8f\xcc\xc7\x1b\xde\x48\xb6\x3f\x35\xd2\x74\x3b\xeb\x87\xc9\x76" + "\x3c\x1f\x8f\xcc\xc3\x7b\x66\x92\x38\x1f\xfc\xbb\x2e\xe8\x83\xbd" + "\xad\xf8\x60\xef\xdf\x98\x0f\x7e\xb6\x59\x9a\x0f\x7e\xb6\xa9\x6b" + "\xe8\xfa\xdf\x9a\xdf\x7a\x26\x94\x68\xae\x11\xb9\xd2\x74\xfd\x88" + "\x9c\xae\x11\x97\xdf\x9a\xdf\xf2\xf5\x27\x71\xf9\xa3\x8f\xb4\xb8" + "\xfc\x51\x25\xdd\x6f\x8d\xd1\xb1\x7e\x6b\x8c\x4e\xd8\x6f\xfd\x51" + "\x6f\xdd\x6f\xf9\x4d\x60\xfd\xd6\x73\x3b\x89\xe6\x79\x6e\x2d\xd1" + "\x3c\xcf\x4d\x16\xef\xb7\x46\x1d\x7b\xe8\xb7\xda\xd3\x6f\x8d\xa8" + "\x21\x18\x1b\x95\x2d\xcd\x6f\x8d\xca\xe2\xfa\xad\x17\x78\xd6\x43" + "\x8d\xba\x69\xbf\xdf\x7a\xce\x4b\x9a\xdf\x7a\x4e\x61\x9f\xdf\x7a" + "\x6e\x29\xbf\xdf\x1a\x89\x84\xfd\x16\xd9\x67\xa9\x93\xfd\xbc\x58" + "\x9d\xfc\xfc\xc5\xae\xef\xb7\x9e\x5f\xc9\xaf\x89\x9f\xcf\x26\x7e" + "\xeb\xb9\xf8\xf6\xf7\x5b\xcf\xc5\xf3\xfb\x2d\x3f\x19\xd1\xa6\xcf" + "\x25\x5a\xfa\x2d\x38\x87\xd7\x6f\xf9\x8d\x62\xce\x89\xe7\xfa\x2d" + "\xd2\x06\x70\xcd\x0c\x61\xbf\xe5\x77\x9d\x70\x8f\xdf\x11\xc2\x3d" + "\x24\xa6\x96\x7e\xcb\x2f\xdf\xb6\xdf\x22\x18\xa2\xaf\x53\xd0\x6f" + "\xf9\x9d\xb7\xf4\x5b\x7f\xd4\xf1\xfb\xad\x31\x5f\xb0\x38\x1a\x33" + "\x8b\xeb\xb7\x46\x0f\x79\x30\xfc\x96\x20\xb6\x56\x72\xfd\xd6\xe8" + "\x3b\xe2\xfd\xd6\x18\x1f\x71\x7e\x0b\x63\x8e\xcf\x6f\x8d\x59\x6a" + "\x8e\x39\xae\xdf\x1a\x93\xcb\xef\xb7\xc6\xec\xe6\xfa\x2d\xdc\x3e" + "\x9f\xdf\x1a\x73\x96\xd3\xbe\x85\xdf\x1a\x73\x93\xeb\xb7\xc8\x71" + "\xac\xdf\x7a\x81\xac\x81\x92\xff\x71\xa7\x78\xbf\xf5\xc2\x52\x61" + "\xbf\xf5\x82\xd9\xfa\xa7\x17\x98\xf5\x4f\x2f\x30\xeb\x9f\x5e\x20" + "\xeb\x9f\xe4\x7f\x2c\x36\xdd\xce\xfa\x2d\xb2\x9d\xf5\x5b\x2f\x94" + "\x8a\xf3\x5b\xee\x5d\xd0\x6f\x79\x58\xf1\x5b\x1e\xbf\x31\xbf\x35" + "\x36\x5a\x9a\xdf\x1a\x1b\xf5\x50\xd7\x77\x84\xae\x7f\xa1\x9c\x68" + "\xae\x71\x32\x69\xba\x7e\x1c\x92\xae\xeb\x5f\x39\xc3\xea\xfa\x57" + "\xce\x08\xeb\xfa\x71\x67\xad\xeb\xfa\x09\xfd\x58\x5d\xff\x12\x93" + "\xcb\x7c\x69\x2e\x19\x5b\x5f\x1a\x28\x5e\xd7\x8f\xdf\xfc\x50\xd7" + "\xb7\xa7\xae\x1f\xbb\x9f\x60\x6c\x7c\xa4\x34\x5d\x3f\x3e\x82\xab" + "\xeb\x5f\x4d\xb7\xd4\xf5\xe3\x4f\xda\xaf\xeb\xc7\x5f\x97\xa6\xeb" + "\xc7\x0b\xce\x3b\xe4\xea\xfa\x97\xa6\xf2\xeb\xfa\x71\x35\xc2\xba" + "\x9e\xec\xb3\xd4\x63\x2f\x5f\x67\xf5\xd8\xcb\x87\xba\xbe\xae\x7f" + "\x39\x94\x5f\x7b\xbd\x1c\x49\x74\xfd\x4b\x01\xed\xaf\xeb\x5f\x0a" + "\xe0\xd7\xf5\x2f\x33\xeb\x3f\x5e\x0a\xb4\xd4\xf5\x70\x0e\xaf\xae" + "\x9f\xd0\x83\x39\x27\x80\xab\xeb\x49\x1b\xc0\x35\x3e\xc2\xba\x7e" + "\xc2\x09\xc2\x3d\x13\xf2\x09\xf7\x90\x98\x5a\xea\xfa\x09\x31\xb6" + "\x75\x3d\xc1\x10\x7d\x9d\x82\xba\x7e\xc2\x17\x96\xba\x7e\xdc\x19" + "\x7e\x5d\xff\x4a\x36\x8b\xa3\x57\x86\x73\x75\xfd\x04\xfd\x83\xa1" + "\xeb\x05\xb1\x15\xca\xd5\xf5\x13\x2b\xc4\xeb\xfa\x57\x64\xe2\x74" + "\x3d\xc6\x1c\x9f\xae\x7f\x65\xaa\x39\xe6\xb8\xba\xfe\x95\x68\x7e" + "\x5d\xff\x4a\x3a\x57\xd7\xe3\xf6\xf9\x74\xfd\x2b\x25\x9c\xf6\x2d" + "\x74\xfd\x2b\x27\xb9\xba\x9e\x1c\xc7\xea\xfa\x57\x17\x10\x0e\x1d" + "\x97\x2c\x5e\xd7\xbf\x3a\x55\x58\xd7\xbf\x3a\x8b\xab\xeb\x5f\x55" + "\x11\xfd\xfe\x6a\x1a\xd1\xf5\xaf\xbe\x48\xb6\x8f\x4b\x32\xdd\xce" + "\xea\x7a\xb2\x9d\xd5\xf5\xaf\xe6\x88\xd3\xf5\x8f\x74\x41\x5d\xef" + "\x6a\x45\xd7\xbb\xfe\xc6\x74\xfd\xe4\xf1\xd2\x74\xfd\x64\x7f\xe9" + "\xfa\x71\x86\x82\xd5\x8f\x33\x14\xc2\xfa\x71\x8a\x97\x75\xfd\x38" + "\x2d\x94\xd5\x8f\x01\x47\x08\x87\x07\xec\x20\x1c\x1e\x30\x57\xbc" + "\x7e\x7c\xed\xdc\x43\xfd\xd8\x9e\xfa\xf1\xd5\x62\xa2\x1f\x5f\xdb" + "\x29\x4d\x3f\xbe\x56\xcc\xd5\x8f\x33\x8e\x59\xea\xc7\x80\xee\xf6" + "\xeb\xc7\x80\xe1\xd2\xf4\x63\xc0\x30\xfb\xf4\x63\x40\x36\xbf\x7e" + "\x9c\xe2\x2d\xac\x1f\xc9\x3e\xcb\x71\x7f\xda\x70\x76\xdc\x9f\xda" + "\xdc\xf5\xf5\xe3\xd4\x42\xfe\x31\x7e\xea\x4e\xa2\x1f\x03\xb2\xda" + "\x5f\x3f\x06\x64\xf1\xeb\xc7\x69\x7d\xc8\x58\x1b\x90\x63\xa9\x1f" + "\xe1\x1c\x5e\xfd\x38\x8d\x19\xff\x03\xb2\xb8\xfa\x91\xb4\x01\x5c" + "\x13\x2d\xac\x1f\xa7\x33\xeb\x62\xa7\x9d\x25\xdc\x43\x62\x6a\xa9" + "\x1f\xa7\x95\xd8\xd6\x8f\x04\x43\xf4\x75\x0a\xea\xc7\x69\x77\x2c" + "\xf5\xe3\x14\x05\xbf\x7e\x0c\xac\x60\x71\x14\x18\xc3\xd5\x8f\xd3" + "\xc7\x3e\x18\xfa\x51\x10\x5b\x85\x5c\xfd\x18\xd8\x43\xbc\x7e\x0c" + "\x1c\x2f\x4e\x3f\x62\xcc\xf1\xe9\xc7\xc0\x6c\x73\xcc\x71\xf5\x63" + "\xe0\x6e\x7e\xfd\x18\x78\x8c\xab\x1f\x71\xfb\x7c\xfa\x31\xf0\x3a" + "\xa7\x7d\x0b\xfd\x38\xa3\x3b\x57\x3f\x92\xe3\x58\xfd\x38\x63\x0f" + "\xe1\xd0\xc9\x47\xc4\xeb\xc7\x19\xd9\xc2\xfa\x71\x46\x3e\x57\x3f" + "\xce\x88\x22\x3a\x71\x86\x9a\xe8\xc7\x19\x49\x64\xfb\xe4\xc3\xa6" + "\xdb\x59\xfd\x48\xb6\xb3\xfa\x71\x46\xb5\x2d\xfd\x68\x5d\x5b\xcc" + "\x5e\xc9\x6a\x8b\xd9\x2b\x4d\xb5\xc5\x49\x8e\xb6\x78\xdd\x46\xfd" + "\xab\x37\xca\x59\x6d\x31\x6b\x38\x79\xbe\x67\x79\x92\xe7\x7b\xe6" + "\x69\x5a\x5b\x4c\x05\x0d\x00\xda\xa2\xe4\xda\x7e\xa2\x2d\xae\x35" + "\xc9\xdf\xbb\xc1\x68\x8b\x06\xe4\x9a\xb5\x90\xd1\x16\x73\xb0\xb6" + "\x98\x39\x19\x6b\x0b\xb7\x42\xd0\xb7\x75\x8c\xde\x8d\x05\xbd\x5b" + "\x07\xbf\xc3\xb3\x73\x14\xda\xa8\x04\x4d\x9a\x83\xcf\xc7\xdf\x01" + "\x81\xb6\xe8\xb5\xb5\xf4\xba\x5b\x8d\x8b\xf2\x2d\xb2\x66\x17\x7f" + "\xc7\x45\xe8\x1b\x2e\xc6\xef\xb7\x24\xd5\x51\x06\xfc\xbd\x96\xe9" + "\x11\x26\xdf\x71\xc1\xdf\x7e\xd5\xd6\x23\xfc\x2d\x97\xc2\x38\xa4" + "\xf8\x00\x6b\x8d\x7a\xe4\xd1\x33\x5d\xd6\x13\x7f\xc7\xa5\x67\x23" + "\xd1\xb4\x25\x86\x32\xa2\x69\x97\x78\x3f\x0a\x3a\x69\xd8\xb6\x5b" + "\xac\xc6\xd8\x88\xf5\xc5\x12\x95\xb2\x71\x89\x6a\xc0\xed\xdb\xa0" + "\x69\xb5\xe6\xdf\xf9\xf8\x4f\x0e\xfe\x96\x44\x55\x22\xc9\x81\xd2" + "\xdf\xf7\xf8\x8b\x0a\x6d\x9f\x0f\xba\xa7\x01\xc9\x9e\xc1\xdf\xf8" + "\xa8\x40\x1e\xbf\xef\x07\xbc\x7f\x5b\xd5\xcf\xb4\x3e\x27\xce\x8b" + "\x1a\x6e\xab\x50\x79\xf8\xf7\xf4\x3a\x5b\x9d\x71\x9d\xed\x2d\xe4" + "\xa7\x5d\xa2\x92\x6f\x89\x33\xd1\xb4\x5e\x58\xd3\x8e\xb1\xa2\x69" + "\x67\x7a\x49\xd3\xb4\x33\x15\x5c\xbd\x11\x3c\xc2\x52\x6f\xcc\x5c" + "\x66\xbf\xde\x98\xb9\x55\x9a\xde\x98\x59\x68\x9f\xde\x98\xa9\x37" + "\xd7\x1b\xbb\x69\xbd\xf1\x7a\x3c\xc6\x26\xbf\xde\x20\xfb\x2c\xc7" + "\x89\x37\xb6\xb2\xe3\xc4\x1b\xd1\x5d\x5f\x6f\xbc\xe1\xc6\x3f\x26" + "\xbc\xe1\x45\xf4\xc6\x4c\x5d\xfb\xeb\x8d\x99\x3a\x7e\xbd\xf1\xc6" + "\x5a\xc2\xcd\xb3\x90\xa5\xde\x80\x73\x78\xf5\xc6\x1b\x47\xc8\x39" + "\x33\x75\x5c\xbd\x41\xda\x00\xfe\x39\x27\xac\x37\xfe\xbc\x94\xf0" + "\xd1\x9f\x27\x12\x3e\x22\x31\xb5\xd4\x1b\x7f\xee\x6f\x5b\x6f\x10" + "\x0c\xd1\xd7\x29\xa8\x37\xfe\x1c\x69\xa9\x37\x5e\x8f\xe5\xd7\x1b" + "\xb3\xc7\xb2\x38\x0a\x3a\xcf\xd5\x1b\x7f\x2e\x79\x30\xf4\x86\x20" + "\xb6\xdc\xb8\x7a\x23\x28\x59\xbc\xde\x08\x3a\x20\x4e\x6f\x60\xcc" + "\xf1\xe9\x8d\x20\xbd\x39\xe6\xb8\x7a\x63\x76\x1f\x7e\xbd\x31\x7b" + "\x04\x57\x6f\xe0\xf6\xf9\xf4\xc6\xec\x30\x4e\xfb\x16\x7a\x63\xf6" + "\x32\xae\xde\x20\xc7\xb1\x7a\x23\xb8\x1f\xe1\xd0\xd7\xfb\x88\xd7" + "\x1b\xb3\xf5\xc2\x7a\x23\xd8\x85\xab\x37\x66\xd7\x10\x5d\x11\xec" + "\x4b\xf4\xc6\xec\x06\xb2\xfd\x75\x6f\xd3\xed\xac\xde\x20\xdb\x59" + "\xbd\x11\xfc\x70\xfd\xeb\x03\x95\xaf\x0a\x91\xb8\xfe\x35\xe4\xe1" + "\xfa\xd7\x0e\x79\x0f\x1d\xcc\xac\x7f\x0d\x93\xb8\xfe\x35\xec\xe1" + "\xfa\xd7\x0e\x89\x4b\x28\xb3\xfe\xf5\x4d\x89\xeb\x5f\xdf\x7c\xb8" + "\xfe\xb5\x43\xe2\x12\xc6\xac\x7f\x0d\x97\xb8\xfe\x35\xdc\x81\xf5" + "\xaf\x51\xbb\x58\x6f\x1c\xb5\x4b\xd8\x1b\xcf\xb5\xb1\xfe\x35\x52" + "\xcb\x7a\xe3\x88\x19\x44\x8b\x46\x8c\x22\x5a\x74\x1e\x9d\x9b\x4a" + "\xc1\xde\xf8\xc3\xcc\xa2\x7d\x71\xa5\x72\x5c\x17\x0e\x7f\x1b\x33" + "\x7b\x39\x72\xd6\x61\x6f\x0c\x31\xc8\x6e\xc1\xde\xf8\x38\x8a\x7d" + "\x1b\x7b\xe3\x79\x31\x95\x75\x26\xdf\x57\x91\xcf\x3d\xcf\xd6\x73" + "\x3e\x8e\xf0\xbe\xa3\xb7\x4a\xe5\x39\x2d\x66\x39\xf9\xb8\x26\xb9" + "\x72\x21\x37\x27\xaf\xcf\x4f\xce\xc1\x39\xf9\x66\xe6\x5b\x29\x74" + "\x5e\x7e\xb8\xf5\x9c\xfc\xd6\x16\x18\x3b\x79\xf2\xf2\x38\x27\x0f" + "\x63\xe4\x6f\x2c\x27\xff\x26\xb3\x36\x76\xde\x68\x69\x39\xf9\x79" + "\x7e\x5c\x8f\x1c\x3d\xcb\xd2\x23\xcf\xdb\x6a\xbf\x47\x9e\x77\x4c" + "\x9a\x47\x9e\xa7\xb6\xcf\x23\x47\x0c\xe4\xf7\xc8\x73\x73\x52\x04" + "\x3d\x32\xd9\x67\xe9\x6d\x22\x8f\xb1\xde\x26\x32\xbb\xeb\x7b\xe4" + "\x48\x5f\x7e\x1f\x13\x39\x9a\x78\xe4\x08\x65\xfb\x7b\xe4\x08\x25" + "\xbf\x47\x8e\x64\xde\x7f\x47\x0c\xb6\xf4\xc8\x70\x0e\xaf\x47\x8e" + "\xbc\xc8\x9c\xa3\xe4\x7a\x64\xd2\x06\xf0\x90\x5e\xd8\x23\xcf\xdf" + "\x4c\x78\x69\x7e\x34\xe1\x25\x12\x53\x4b\x8f\x3c\x7f\xbc\x6d\x8f" + "\x4c\x30\x44\x5f\xa7\xa0\x47\x9e\xbf\xd6\xd2\x23\xcf\x15\x58\x1b" + "\x1b\x35\x97\xc5\x51\x94\x8c\xeb\x91\xe7\x9f\x7e\x30\x3c\xb2\x20" + "\xb6\x7c\xb9\x1e\xf9\x2f\x3b\xc4\x7b\xe4\xbf\x9c\x15\xe7\x91\x31" + "\xe6\xf8\x3c\x72\xd4\x40\x73\xcc\x71\x3d\x72\xd4\x58\x7e\x8f\x1c" + "\x35\x8b\xeb\x91\x71\xfb\x7c\x1e\x39\x2a\x9d\xd3\xbe\x85\x47\x8e" + "\xda\xca\xf5\xc8\xe4\x38\xd6\x23\x47\xfb\x33\xe3\x9d\x84\xb5\xb1" + "\xd1\x03\x85\x3d\x72\xb4\x0f\xd7\x23\x47\xe9\x88\x17\x8e\x9e\x49" + "\x3c\x72\xb4\x07\xd9\x3e\x77\xa4\xe9\x76\xd6\x23\xcf\x35\x5b\x1b" + "\x1b\x1d\xf1\x70\x6d\xec\x83\xe4\x91\xdf\x91\x98\xff\x7e\x47\xd1" + "\x35\x34\xff\x6f\xcd\x8b\x45\x27\x12\xcd\xb5\xa0\x44\x9a\xe6\x5f" + "\xb0\xa7\x6b\xc4\xe5\xb7\xe6\xc5\xde\x61\xd6\x2c\x2f\x9c\x28\x2d" + "\x2e\x0b\x27\x48\xf7\x62\x09\x23\x59\x2f\x96\x30\x52\xd8\x8b\x2d" + "\xea\x63\xdd\x8b\x2d\x49\x62\xbd\xd8\xe2\xf3\x44\xf3\x2c\x3e\x46" + "\x34\xcf\xe2\x74\xf1\x5e\x2c\xb6\x99\xeb\xc5\x16\x45\x3f\xf4\x62" + "\x1d\xe5\xc5\x16\x34\x12\xfc\xc5\x9e\x90\xe6\xc5\x62\x8f\x73\xbd" + "\x58\xc2\x45\x4b\x2f\xb6\xd8\xc7\x7e\x2f\xb6\x58\x62\xfd\xdf\xc5" + "\x01\xf6\x79\xb1\xc5\x25\xfc\x5e\x6c\x51\x3f\x61\x2f\x46\xf6\x59" + "\x6a\xe8\x25\x53\x59\x0d\xbd\xa4\x4f\xd7\xf7\x62\x71\x87\xf9\xf5" + "\x72\xdc\x09\xe2\xc5\x16\xef\x69\x7f\x2f\xb6\x78\x0f\xbf\x17\x5b" + "\x32\x9a\xe8\xd6\xc5\xfb\x2d\xbd\x18\x9c\xc3\xeb\xc5\x96\xc4\x30" + "\xe7\xec\xe1\x7a\x31\xd2\x06\xf0\xd0\x5a\x61\x2f\x16\x3f\x84\xf0" + "\xd2\x92\x3b\x84\x97\x48\x4c\x2d\xbd\xd8\x92\x0a\xdb\x5e\x8c\x60" + "\x88\xbe\x4e\x41\x2f\x16\xef\x65\xe9\xc5\x16\x79\xf3\x7b\xb1\xa5" + "\x26\xeb\x34\x96\x66\x73\xbd\x58\x7c\xd8\x83\xe1\xc5\x04\xb1\x75" + "\x98\xeb\xc5\x96\x0e\x17\xef\xc5\x96\xce\x15\xe7\xc5\x30\xe6\xf8" + "\xbc\xd8\xd2\x12\x73\xcc\x71\xbd\xd8\xd2\x93\xfc\x5e\x6c\xe9\x45" + "\xae\x17\xc3\xed\xf3\x79\xb1\x84\x1e\x9c\xf6\x2d\xbc\x58\x82\x0f" + "\xd7\x8b\x91\xe3\x58\x2f\x96\x50\x4e\x38\x74\xe1\x31\xf1\x5e\x2c" + "\xa1\x44\xd8\x8b\x25\x7c\xc1\xf5\x62\x09\x99\xc4\x73\x25\x68\x88" + "\x17\x4b\x28\x24\xdb\x17\xaa\x4d\xb7\xb3\x5e\x8c\x6c\x67\xbd\x58" + "\x82\xf6\xe1\xba\xd9\x07\xc9\x8b\x25\xee\x90\xe6\xc5\x12\x8b\x1e" + "\x6a\xfe\x8e\xd0\xfc\x7f\x75\x26\x9a\x6b\xf9\x68\x69\x9a\x7f\xb9" + "\x9f\x74\xcd\x9f\xa1\x62\x35\x7f\x86\x4a\x58\xf3\xaf\xe8\x61\x5d" + "\xf3\xa7\xc6\xb2\x9a\x3f\xf9\x34\x19\x5b\x93\xbf\x20\x63\x6b\xf2" + "\x52\xf1\x9a\x3f\xe9\x3a\x57\xf3\xaf\x08\x7b\xa8\xf9\x3b\x4a\xf3" + "\x27\xd6\x13\xfc\x25\x1d\x92\xa6\xf9\x93\x4a\xb9\x9a\x3f\xe3\xac" + "\xa5\xe6\x4f\xb6\xf8\xfe\x87\xb0\xe6\x4f\x1e\x2f\x4d\xf3\x27\xfb" + "\xdb\xa7\xf9\x93\x77\xf0\x6b\xfe\x15\x1e\xc2\x9a\x9f\xec\xb3\xd4" + "\x6a\xa9\xe3\x59\xad\x96\xda\xa3\xeb\x6b\xfe\x94\xfd\xfc\xba\x2c" + "\xe5\x10\xd1\xfc\xc9\x45\xed\xaf\xf9\x93\x8b\xf8\x35\x7f\xea\x70" + "\xa2\x8f\x92\x8b\x2d\x35\x3f\x9c\xc3\xab\xf9\x53\xe7\x32\xe7\x14" + "\x71\x35\x3f\x69\x03\x78\x28\x59\x58\xf3\xa7\xf5\x21\xbc\x94\xca" + "\x7c\x2b\x8c\xc4\xd4\x52\xf3\xa7\x1e\xb3\xad\xf9\x09\x86\xe8\xeb" + "\x14\xd4\xfc\x69\xdd\x2d\x35\xff\x0a\x37\x7e\xcd\x9f\x7e\x91\xc5" + "\x51\x7a\x3a\x57\xf3\xa7\xcd\x78\x30\x34\xbf\x20\xb6\xf6\x73\x35" + "\x7f\xfa\x40\xf1\x9a\x3f\x7d\x96\x38\xcd\x8f\x31\xc7\xa7\xf9\xd3" + "\x77\x98\x63\x8e\xab\xf9\xd3\x8f\xf0\x6b\xfe\xf4\xb3\x5c\xcd\x8f" + "\xdb\xe7\xd3\xfc\x19\x32\x4e\xfb\x16\x9a\x3f\xa3\x3f\x57\xf3\x93" + "\xe3\x58\xcd\x9f\xa1\x26\x1c\xba\xfc\x0b\xf1\x9a\x3f\x63\x87\xb0" + "\xe6\xcf\xd8\xcd\xd5\xfc\x19\xcc\xda\xd9\x8c\x33\x44\xf3\x67\xe4" + "\x90\xed\xcb\x0f\x9a\x6e\x67\x35\x3f\xd9\xce\x6a\xfe\x8c\xba\x87" + "\x6b\x6a\x1f\x24\xcd\xbf\x32\x5f\x9a\xe6\x5f\x99\x27\x5d\x5b\x66" + "\x99\xac\x7b\xc9\xb2\xb2\xee\x65\x55\xb4\x75\x6d\xb9\xd6\x64\xdd" + "\x4b\x26\xb3\xee\x25\x93\x59\xf7\xb2\xe6\xb4\x78\x6d\xb9\x66\x32" + "\x57\x5b\xae\x3a\xf4\x50\x5b\x76\x94\xb6\xcc\x68\x22\xda\x72\x8d" + "\x97\x34\x6d\xb9\xc6\x6c\xfd\x4b\x36\xcf\xfa\x97\x35\x22\xd6\xbf" + "\xac\x91\xb8\xfe\x65\x8d\x9d\xeb\x5f\xd6\x08\xac\x7f\x59\xb5\x40" + "\x58\x5b\x92\x7d\x96\x9a\x60\xad\xc9\xfa\x97\xb5\x0f\xc0\xfa\x97" + "\xb5\x02\x6b\x14\xd6\x32\xeb\x5f\xd6\x74\xc0\xfa\x97\x35\x02\xeb" + "\x5f\xd6\x32\xeb\x5f\x32\x79\xd6\xbf\xac\x11\x58\xff\xb2\x96\x59" + "\xff\xb2\xc6\x6c\xfd\x4b\x26\xb3\xfe\x65\xad\x95\xf5\x2f\xeb\x98" + "\xf5\x2f\xeb\x98\xf5\x2f\x24\xa6\x96\xda\x72\x9d\x1d\xeb\x5f\xd6" + "\x30\xeb\x5f\xd6\x58\x59\xff\xb2\x8e\x67\xfd\xcb\xaa\x28\x7e\x6d" + "\x99\x65\xb2\xfe\xe5\x3d\xb3\xf5\x2f\xeb\x1e\x90\xf5\x2f\x82\xd8" + "\x32\x5b\xff\xf2\x9e\x84\xf5\x2f\xef\x89\x5c\xff\xb2\x46\x60\xfd" + "\xcb\x7b\x7a\x73\xcc\x71\xb5\x65\x96\xc0\xfa\x97\x2c\xb3\xf5\x2f" + "\x6b\x04\xd6\xbf\x64\x85\x71\xda\xb7\xd0\x96\x59\x66\xeb\x5f\x32" + "\xcd\xd6\xbf\x64\x33\xeb\x5f\x56\x79\x8a\xd7\x96\x59\x56\xd6\xbf" + "\x64\x9b\xad\x7f\xc9\x62\xd6\xbf\x64\x33\xeb\x5f\xb2\x98\xf5\x2f" + "\xab\x3c\x4c\xb7\xb3\xda\x92\x6c\x67\xb5\x65\xb6\xcd\xf5\x2f\xd6" + "\x75\x47\xbe\x07\xab\x3b\xf2\x3d\x84\x75\x47\xf6\x45\xeb\xba\xe3" + "\xfd\x20\x56\x77\xe4\x1c\x22\xcf\x77\xce\x56\xf2\x7c\xe7\xd0\xef" + "\x61\x92\x2b\x40\x77\x0c\xca\x2c\xda\x7b\x63\x3f\xad\x3b\xf6\x2d" + "\x6c\x92\x83\x46\x74\x36\x60\xdd\x01\x5a\x30\x2b\x01\xeb\x8e\x3a" + "\x66\xbd\xed\x86\xb3\x15\x89\xa6\xba\x63\xfd\x28\x7a\xed\x6d\xdb" + "\xf7\x9e\xeb\x10\xde\xcf\xb7\x16\xf7\xc8\x42\x66\x2d\x2e\xb4\x6d" + "\xba\x06\x97\x5e\x97\x7b\x03\x74\xc9\x5b\x10\x0f\x13\x5d\xf2\x70" + "\x2d\xae\xb5\xb5\xb8\x1b\x24\xe6\xbf\x37\x14\x71\xb5\x48\xfe\x11" + "\x4b\x2d\x92\xe3\x62\xbf\x16\xc9\xf1\x91\xa6\x45\x72\x54\xf6\x69" + "\x91\x9c\xb5\xfc\x5a\x24\xbb\x0e\xe3\x96\x5f\x8b\x90\x7d\x96\x63" + "\xc8\xfb\x3e\xec\x18\x92\x7b\xa7\xeb\x6b\x91\xdc\x02\xfe\xf1\x22" + "\x77\x07\xd1\x22\x39\x99\xed\xaf\x45\x72\x32\xf9\xb5\xc8\xfb\x5e" + "\x84\xb7\x73\xb2\x2c\xb5\x08\x9c\xc3\xab\x45\xde\x9f\xcc\x9c\x93" + "\xc9\xd5\x22\xa4\x0d\xe0\xa6\x48\x61\x2d\xb2\x51\x46\xb8\xea\xfd" + "\xd3\x84\xab\x48\x4c\x2d\xb5\xc8\xfb\xbb\x6d\x6b\x11\x82\x21\xfa" + "\x3a\x05\xb5\xc8\xfb\x37\x2d\xb5\x48\xb6\x86\x5f\x8b\xe4\x9d\x64" + "\x71\x94\x17\xcd\xd5\x22\x1b\x47\x3f\x18\x5a\x44\x10\x5b\x05\x5c" + "\x2d\x92\xd7\x5d\xbc\x16\xc9\x1b\x2b\x4e\x8b\x60\xcc\xf1\x69\x91" + "\xbc\xb5\xe6\x98\xe3\x6a\x91\xbc\x9d\xfc\x5a\x24\xef\x08\x57\x8b" + "\xe0\xf6\xf9\xb4\x48\xde\x55\x4e\xfb\x16\x5a\x24\xdf\x85\xab\x45" + "\xc8\x71\xac\x16\xc9\xdf\xc5\xf8\xb9\xb5\xe2\xb5\x48\xfe\x5a\x61" + "\x2d\x92\x9f\xcb\xd5\x22\xf9\x11\x44\x73\xe4\x1f\x26\x5a\x24\x3f" + "\x91\x6c\xcf\xce\x34\xdd\xce\x6a\x11\xb2\x9d\xd5\x22\xf9\xe5\x22" + "\xf2\x5c\x79\x62\xd6\xe2\x96\xdc\xe5\xe6\xb9\x8c\x39\x2e\xdd\xb0" + "\xb0\x95\x6d\x79\x2e\xd3\xf7\xa4\x3c\x79\x2e\x3c\xa6\xb3\x79\xae" + "\xf3\x34\x57\xb1\x79\x2e\x0d\x9d\xe7\xc2\x39\x2e\xfc\xae\xd4\x98" + "\xe3\x32\xfc\xd5\x72\x1d\x6e\x89\x41\x7c\x8e\x8b\x7d\x5f\xfa\x83" + "\x2b\xc9\x71\xd5\xb4\xe5\xb8\xf0\x78\xae\xbf\x67\x99\xe3\xc2\xe3" + "\x38\x9b\xe3\xfa\xbe\x9d\x73\x5c\x7f\x5b\x26\x6d\x5c\xff\x5b\x62" + "\xd7\x78\xaf\xfd\x5b\x5b\x87\x9b\xaf\x21\xb9\x9f\xcd\x9e\xd2\xde" + "\x6b\x6f\xf6\xe8\x1a\x71\xf9\xad\xcd\xfd\xfe\x9b\x9a\xc4\x65\xcb" + "\x6e\x69\x71\xd9\xb2\xab\x6b\xc4\xe5\xb7\x36\x0f\x64\x73\x10\x89" + "\x4b\xe1\x78\x69\x71\x29\xf4\x97\x9e\xab\x2f\x9e\xc9\x7a\xe6\xe2" + "\x99\xa6\x9e\xb9\x6c\x82\xa9\x67\xde\x6a\xa3\xfe\xe5\x8e\x42\xd6" + "\x33\x6f\xd7\x13\x1d\xba\xfd\x22\xd1\xa1\xdb\xe9\xf7\x53\xc9\xe3" + "\x11\xed\x95\x75\xd8\x37\xbf\xdd\x24\xdf\x7b\x4d\x2d\xd7\x65\x10" + "\xbf\x5c\xa5\x2b\x47\x15\xda\x26\xf4\x5e\x02\x72\x5e\x7b\x03\x39" + "\x7f\x72\xab\x49\xee\xbe\x00\xb9\xc2\x98\x04\x7d\x56\x0e\x3a\x66" + "\x2b\x8a\x4d\xc1\x5e\x7a\x7b\x9f\xaa\x58\xad\x89\x97\xde\x9a\xcc" + "\xfa\x68\x38\x2e\xb6\x09\x7d\xf5\xb6\x5a\x8e\xfd\x72\x6b\x7e\x72" + "\x4e\xeb\xf0\xb0\x34\xba\x8e\x95\x69\x3e\x1f\xfe\xb6\x72\x0e\x37" + "\x9f\xdf\x92\x9f\x9c\xd7\x5c\x12\xb6\x92\xae\xa1\x39\x84\xcd\xe9" + "\x8b\xa9\x9f\xf9\x41\x0b\x52\x18\xf3\xf9\x1f\xfc\xe6\xf2\xf9\x5b" + "\xb4\x04\xa3\xdb\x2e\x4b\xcb\xe7\x6f\xab\xe3\x7a\xe8\x9d\x32\x4b" + "\x0f\xbd\x7d\xb2\xfd\x1e\x7a\x7b\x8c\x34\x0f\xbd\x7d\x81\x7d\x1e" + "\x7a\x7b\x85\xb9\x87\xde\x95\x82\x3d\xf4\x56\x6f\x8c\x63\x7e\x0f" + "\x4d\xf6\x59\x7a\x9f\x1d\x31\xac\xf7\xd9\x31\xba\xeb\x7b\xe8\xa2" + "\x5a\x7e\x9f\x53\x74\x99\x78\xe8\xed\xe5\xed\xef\xa1\xb7\x97\xf3" + "\x7b\xe8\x1d\xb3\x89\xdf\xd8\x5e\x6e\xf4\xc3\xac\x87\x86\x73\x78" + "\x3d\xf4\x8e\x6c\xf3\x73\x88\x87\xde\x5e\x4d\x3c\xf4\x8e\xdd\xc2" + "\x1e\xfa\xc3\x89\x84\xbb\x3e\xf4\x22\xdc\x45\x62\x6a\xe9\xa1\x77" + "\x5c\xb7\xed\xa1\x09\x86\xe8\xeb\x14\xf4\xd0\x1f\x8e\xb2\xf4\xd0" + "\x5b\x05\xea\x67\x16\xf7\x60\x71\xf4\x51\x09\xd7\x43\x7f\x98\xfc" + "\x60\x78\x68\x41\x6c\xd5\x72\x3d\xf4\x47\x53\xc5\x7b\xe8\x8f\xd2" + "\xc5\x79\x68\x8c\x39\x3e\x0f\xfd\x51\x05\x83\x9f\x6a\x7e\x0f\xfd" + "\xd1\x55\x7e\x0f\x5d\x2c\xe3\x7a\x68\xdc\x3e\x9f\x87\x2e\x1e\xce" + "\x69\xdf\xc2\x43\x17\x4f\xe6\x7a\x68\x72\x1c\xeb\xa1\x8b\x1b\x08" + "\x87\x16\x4a\xa8\x9f\x59\x5c\x21\xec\xa1\x8b\xcf\x72\x3d\x74\xf1" + "\x2e\xe2\x95\x77\x22\xe2\xa1\x8b\x0f\x93\xed\x85\x87\x4d\xb7\xb3" + "\x1e\xba\xd0\xac\x7e\xe6\x4e\x0f\x11\x1e\xba\xa0\x9d\x3c\x74\xe6" + "\x83\xe5\xa1\x6b\xcb\xba\x86\x87\xfe\xf8\x88\x34\x0f\xfd\xf1\x61" + "\x3b\x3d\x41\x9e\x0d\x4f\xb0\xf2\xa1\x27\x30\xd5\x5b\x3b\x07\x13" + "\xbd\xb5\x6b\x96\x34\x4f\xb0\x6b\x66\x57\x88\xcb\x6f\x2b\x26\x7f" + "\x67\xe6\xeb\xef\xbe\x2a\x2d\x26\xbb\xeb\x1f\xfa\xe7\x8e\x88\xcb" + "\xae\x42\x12\x97\x4f\xd3\xa5\xc5\xe5\xd3\x34\xe9\xfe\xf9\xf3\x52" + "\xd6\x3f\x7f\x5e\x6a\xea\x9f\xff\xc5\x79\xe7\xbc\x67\x96\x75\xff" + "\x7c\x00\xb1\xfe\x79\xdf\x5c\xa2\x41\xf7\x31\x73\x4a\xf6\xd1\x39" + "\xf5\xa4\x2f\x88\x7f\xbe\x8b\xfd\xf3\x15\xf0\xcf\xf3\xc3\xe5\x3a" + "\xe6\xdb\x11\x78\xfe\x5a\x05\x78\x60\xec\x99\xab\x12\xe1\xff\xf1" + "\x5a\xf4\x5e\x1c\x72\x5e\x07\xde\x77\x37\x8c\x95\xbb\x13\xb4\xf2" + "\xcc\xb7\x61\x9c\xa9\x29\x41\xee\x51\xe0\xab\x6f\x61\x5f\x7d\x1c" + "\x3c\xf3\x2a\xc6\x57\xef\x4d\xae\x8a\x37\xf5\xd5\x7b\xce\xd2\xbe" + "\x5a\x4b\xe6\xc6\x55\xc5\x83\xaf\x86\xbf\x87\xbf\x45\x61\xea\xab" + "\x9b\xc1\x37\xb7\x80\x6f\xce\xb9\x66\xe6\xb1\xe7\x5b\x7a\xec\x66" + "\xaf\xe4\x82\xa6\xe1\x61\x99\xd8\x63\xdf\xdd\xf9\xd0\x63\x5b\x7a" + "\xec\x4f\x7c\x09\x8e\xf7\x4e\x96\xe6\xb1\xf7\x4e\xe2\x7a\xec\x83" + "\x91\x96\x1e\x7b\x6f\x89\xfd\x1e\x7b\xef\x69\x69\x1e\x7b\x6f\xb5" + "\x7d\x1e\x7b\xdf\x08\x73\x8f\xfd\x31\xfd\x9e\x7a\x4f\x10\xc6\x3a" + "\xbf\xc7\x26\xfb\x2c\xbd\xd1\xfe\xd3\xac\x37\xda\xbf\xb5\xeb\x7b" + "\xec\xfd\xfe\xfc\x3e\x68\xff\x64\xe2\xb1\xf7\xf9\xb6\xbf\xc7\xde" + "\xe7\xcb\xef\xb1\xf7\x33\xf3\xdf\xf6\xf9\x5a\x7a\x6c\x38\x87\xd7" + "\x63\xef\xbf\x69\x7e\x0e\xf1\xd8\xfb\x46\x12\x8f\x7d\xa0\x87\xb0" + "\xc7\x3e\xb0\x9b\xf0\xdb\x81\x65\x84\xdf\x48\x4c\x2d\x3d\xf6\x81" + "\x19\xb6\x3d\x36\xc1\x10\x7d\x9d\x82\x1e\xfb\xc0\x66\x4b\x8f\xbd" + "\x67\x26\xbf\xc7\xfe\x7c\x31\x8b\xa3\xcf\x3d\xb9\x1e\xfb\xc0\xc5" + "\x07\xc3\x63\x0b\x62\xcb\x9f\xeb\xb1\x3f\x3b\x20\xde\x63\x7f\x76" + "\x59\x9c\xc7\xc6\x98\xe3\xf3\xd8\x9f\x8f\x60\xf0\x33\x92\xdf\x63" + "\x7f\x3e\x95\xdf\x63\x7f\x1e\xc9\xf5\xd8\xb8\x7d\x3e\x8f\xfd\x79" + "\x2e\xa7\x7d\x0b\x8f\xfd\x79\x09\xd7\x63\x93\xe3\x58\x8f\x7d\x30" + "\x90\x70\xe8\xa7\x7a\xf1\x1e\xfb\xe0\x08\x61\x8f\x7d\x70\x34\xd7" + "\x63\x1f\x74\x23\x5e\xfa\x60\x04\xf1\xd8\x07\x95\x64\xfb\xa7\x3a" + "\xd3\xed\xac\xc7\x26\xdb\x59\x8f\x7d\x30\x5e\xdc\x7b\x6a\x87\xea" + "\x61\xad\xec\xfc\xf5\x18\xed\x55\x0f\xcb\xf8\xae\xfa\x7e\xaf\xc7" + "\xf8\x9f\x21\xd2\x7c\xf6\xff\x0c\x7e\xe8\xe7\xda\xdb\x37\x1c\xcc" + "\x24\x7a\xeb\x1f\x12\xeb\xdf\xfe\xc3\x6a\xfd\xdb\x87\x7e\x4e\x6a" + "\x5c\xfe\x67\x01\x89\xcb\xa1\x19\xd2\xe2\x72\x28\x50\xba\x9f\x3b" + "\x16\xc1\xfa\xb9\x63\x11\xc2\xef\x43\xbf\x1c\x62\xdd\xcf\x1d\xdd" + "\xc3\xfa\xb9\x23\x3d\x88\xde\x39\x7c\x93\xe8\x9d\xc3\x07\xda\xef" + "\x7d\xe8\x61\x1f\xee\xfb\xd0\x2f\xb3\x1f\xbe\x0f\xed\x0c\xaf\x56" + "\x8a\x08\x46\xff\xf7\x8e\x34\xaf\xf6\xbf\x8d\x5c\xaf\xf6\xb5\xa7" + "\xa5\x57\x3b\x3c\xdb\x7e\xaf\x76\x38\x59\x9a\x57\x3b\x9c\x64\x9f" + "\x57\x3b\x7c\x9e\xff\x7d\xe8\x97\x2a\xe1\xf7\xa1\x64\x9f\xa5\xc6" + "\x3e\x9a\xcc\x6a\xec\xa3\x93\xbb\xbe\x57\x3b\xd2\xc0\xaf\xa7\x8f" + "\xdc\x21\x5e\xed\x70\x6d\xfb\x7b\xb5\xc3\xb5\xfc\x5e\xed\x68\x34" + "\xd1\xb5\x87\x6b\x2d\xbd\x1a\x9c\xc3\xeb\xd5\x8e\x6e\x35\x3f\x87" + "\x78\xb5\xc3\x1a\xe2\xd5\x8e\x1e\x12\xf6\x6a\x5f\xcd\x22\xdc\xf5" + "\xd5\x10\xc2\x5d\x24\xa6\x96\x5e\xed\xa8\xde\xb6\x57\x23\x18\xa2" + "\xaf\x53\xd0\xab\x7d\x35\xd1\xd2\xab\x7d\x39\x98\xdf\xab\x1d\xeb" + "\xcf\xe2\x48\x7d\x84\xeb\xd5\xbe\xca\x7e\x30\xbc\x9a\x20\xb6\x1a" + "\xb8\x5e\x4d\x1d\x26\xde\xab\xa9\x73\xc5\x79\x35\x8c\x39\x3e\xaf" + "\xa6\x3e\xcf\xe0\x47\xc3\xef\xd5\xd4\xcd\xfc\x5e\xed\x98\x27\xd7" + "\xab\xe1\xf6\xf9\xbc\xda\xb1\xb1\x9c\xf6\x2d\xbc\xda\xb1\xd9\x5c" + "\xaf\x46\x8e\x63\xbd\xda\x31\x1d\xe1\xd0\x43\x15\xe2\xbd\xda\xb1" + "\xf3\xc2\x5e\xed\xd8\x65\xae\x57\x3b\x56\x4a\x3c\xd9\xd7\x1e\xc4" + "\xab\x1d\x2b\x27\xdb\x0f\x95\x9b\x6e\x67\xbd\x1a\xd9\xce\x7a\xb5" + "\xaf\x95\xe2\xbc\x9a\xfd\xf5\xb2\xee\xff\x9c\x62\x8f\xdf\xd8\x9c" + "\xe2\x7f\x56\x48\xf3\x69\xff\x2c\x7f\xe8\x09\x3a\xc2\x13\x7c\x3d" + "\x92\xe8\xad\x13\x91\xd2\x3c\xc1\x89\x08\xe9\x9e\xa0\x22\x91\xf5" + "\x04\x15\x89\xc2\x9e\xe0\x5f\xa3\xad\x7b\x82\x53\x6a\xd6\x13\x9c" + "\x1c\x48\xc6\xd5\x93\x2e\x64\x5c\x2d\x3b\xd1\x7e\x9e\xa0\x6c\x2c" + "\xd7\x13\xfc\x6b\xc7\x43\x4f\xd0\x19\x9e\xe0\xb8\x82\x60\xb4\xac" + "\xbb\x34\x4f\x50\xe6\xca\xf5\x04\x95\x43\x2c\x3d\x41\x59\x8c\xfd" + "\x9e\xa0\x2c\x57\x9a\x27\x28\xcb\xb1\xcf\x13\x94\xdd\xe4\xf7\x04" + "\xff\x7a\x51\xd8\x13\x90\x7d\x96\x5a\xee\x54\x2e\xab\xe5\x4e\x85" + "\x75\x7d\x4f\x70\x0a\xf1\xeb\xb6\x53\xdd\x89\x27\x28\xd3\xb6\xbf" + "\x27\x28\xd3\xf2\x7b\x82\x53\xc9\x44\x3f\x95\x69\x2d\x3d\x01\x9c" + "\xc3\xeb\x09\x4e\x1d\x30\x3f\x87\x78\x82\xb2\x46\xe2\x09\x4e\x55" + "\x08\x7b\x82\x6f\xa2\x09\x77\x7d\x33\x9a\x70\x17\x89\xa9\xa5\x27" + "\xf8\xc6\xd3\xb6\x27\x20\x18\xa2\xaf\x53\xd0\x13\x7c\x33\xdb\xd2" + "\x13\xfc\xcb\x8f\xdf\x13\x54\x8c\x60\x71\x54\x7e\x9a\xeb\x09\xbe" + "\xd9\xf1\x60\x78\x02\x41\x6c\x21\xae\x27\x28\x5f\x2c\xde\x13\x94" + "\xef\x14\xe7\x09\x30\xe6\xf8\x3c\x41\x39\xf3\xfe\x8f\xe0\xc5\xd2" + "\x13\x54\xf4\xe0\xf7\x04\x15\x43\xb8\x9e\x00\xb7\xcf\xe7\x09\x2a" + "\x66\x70\xda\xb7\xf0\x04\x15\x31\x5c\x4f\x40\x8e\x63\x3d\x41\xa5" + "\x07\xe1\xd0\x13\x17\xc5\x7b\x82\x8a\x9b\xc2\x9e\xa0\xa2\x99\xeb" + "\x09\x2a\x18\xed\x5f\x39\x98\x78\x82\x0a\x0d\xd9\x7e\x42\x63\xba" + "\x9d\xf5\x04\x64\x3b\xeb\x09\x2a\x47\x3e\xac\xa7\xf5\x20\xd5\xd3" + "\xaa\xba\x2c\xcd\x17\x54\xd5\x49\xd7\x9f\xdf\x9d\x61\xf5\xe7\x77" + "\x67\x4c\xf5\x27\xb7\xae\x45\xf5\x21\xeb\xfa\xf3\x6c\x3f\x56\x7f" + "\xfe\x3b\x99\x70\xf8\xbf\xe7\x12\x0e\xff\x37\x5d\x9b\x4f\x5c\x3d" + "\xad\x6f\x37\x73\xeb\x69\x9d\xee\xfe\xb0\x9e\x56\x47\x69\xcb\xca" + "\x49\x44\x5b\x7e\x1b\x29\x4d\x5b\x7e\x1b\xc1\xd5\x96\x35\xe9\x96" + "\xda\xf2\xdb\x93\xf6\x6b\xcb\x6f\xaf\x4b\xd3\x96\xdf\x36\xd8\xa7" + "\x2d\xff\x3d\x95\xbf\x86\x45\xf5\x61\xe1\x7a\x5a\x64\x9f\xa5\x26" + "\x38\x63\x52\x57\xff\xcc\xa1\xae\xaf\x2d\xcf\x84\xf2\x8f\xff\x67" + "\x22\x89\xb6\xfc\x77\x40\xfb\x6b\xcb\x7f\x07\xf0\x6b\xcb\x33\xe7" + "\xc8\x38\xfc\xef\x40\xcb\x1a\x16\x70\x0e\xaf\xb6\x3c\xcb\xd4\xbf" + "\xff\x77\x00\x57\x5b\x92\x36\x80\x87\x7c\x84\xb5\xe5\xd9\x13\x84" + "\x97\xce\xe6\x13\x5e\x22\x31\xb5\xd4\x96\x67\x63\x6c\x6b\x4b\x82" + "\x21\xfa\x3a\x05\xb5\xe5\xd9\x2f\x2c\xb5\x65\x75\x29\xbf\xb6\xfc" + "\x2e\x9b\xc5\xd1\x77\xc3\xb9\xda\xf2\xac\xfe\xc1\xd0\x96\x82\xd8" + "\x0a\xe5\x6a\xcb\xff\x54\x88\xd7\x96\xdf\xc9\xc4\x69\x4b\x8c\x39" + "\x3e\x6d\xf9\xdd\x54\x73\xcc\x71\xb5\xe5\x77\xd1\xfc\xda\xf2\xbb" + "\x74\xae\xb6\xc4\xed\xf3\x69\xcb\xef\x4a\x38\xed\x5b\x68\xcb\xef" + "\x4e\x72\xb5\x25\x39\x8e\xd5\x96\x35\x0b\x08\x87\x56\xcf\x15\xaf" + "\x2d\x6b\xa6\x0a\x6b\xcb\x9a\x59\x5c\x6d\x59\xa3\x22\x1a\xb2\x26" + "\x8d\x68\xcb\x9a\x17\xc9\xf6\xea\x70\xd3\xed\xac\xb6\x24\xdb\x59" + "\x6d\x59\x93\x23\x6e\xfd\x4d\xbb\xe4\x9b\x3b\x69\xfd\x4d\x7b\xe5" + "\x9b\xbb\xca\xfa\x9b\xef\xc7\x4a\xd3\x95\xdf\xbf\xf8\x70\x5e\x50" + "\x7b\xe7\x9a\x6b\x8a\x89\xd6\xfa\xe1\xb4\xb4\x5c\xf3\x0f\xd5\xd2" + "\xb5\x7e\x1d\x62\xb5\x3e\xb6\x0c\x42\xeb\x09\x6a\x77\x5a\xd7\xfa" + "\x17\x27\xb1\x5a\xff\x02\x33\xdf\xf6\x42\x36\x19\x53\x2f\x4c\x95" + "\xb2\x9e\x60\xdd\x2d\xe4\xfc\x9e\xf9\x7a\x82\x33\x47\xc8\x7a\x82" + "\x38\xf3\xf5\x04\x3f\x9e\xe0\xae\x27\x38\x3f\x44\x68\x3d\x01\xce" + "\x3d\xb7\x96\x84\xad\xc4\x6b\x09\x78\xd7\x11\x04\xb7\xff\x3a\x02" + "\xec\x13\x3e\x00\xdc\x62\xaf\x80\xf9\xe6\xb7\xe5\x15\xbe\x5f\x49" + "\xf0\xfb\x63\xae\x34\xaf\xf0\x63\x0e\xd7\x2b\xd4\x95\x58\x7a\x85" + "\x1f\xef\xd8\xef\x15\x2e\xf4\x91\xe6\x15\x2e\x78\xdb\xe7\x15\x2e" + "\x2c\xe3\x5f\x47\x50\xbb\x4b\x78\x1d\x01\xd9\x67\xa9\xf1\x2e\xf6" + "\x61\x35\x9e\xe6\x72\xd7\xf7\x0a\x9a\x4c\x7e\x3d\xa7\xc9\x25\x5e" + "\xe1\x42\x62\xfb\x7b\x85\x0b\x89\xfc\x5e\xe1\xa2\x0b\xd1\x55\x17" + "\x12\x2d\xf3\xd0\x70\x0e\xaf\x57\xb8\x38\xda\xfc\x1c\xe2\x15\x2e" + "\x24\x11\xaf\x70\x71\x96\xb0\x57\xb8\x78\x93\xf0\xda\x45\xe6\x1b" + "\x93\x24\xa6\x96\x5e\xe1\xe2\x66\xdb\x5e\x81\x60\x88\xbe\x4e\x41" + "\xaf\x70\xf1\xa2\xa5\x57\xa8\x2d\xe6\xf7\x0a\x3f\x1d\x62\x71\xf4" + "\xd3\x6c\xae\x57\xb8\xe4\xf3\x60\x78\x05\x41\x6c\x65\x72\xbd\xc2" + "\xa5\x66\xf1\x5e\xe1\xa7\xe1\xe2\xbc\x02\xc6\x1c\x9f\x57\xf8\x69" + "\x19\x83\x9f\x24\x7e\xaf\xf0\x53\x3e\xbf\x57\xf8\xa9\x84\xeb\x15" + "\x70\xfb\x7c\x5e\xe1\xa7\x73\x9c\xf6\x2d\xbc\xc2\x4f\x77\xb8\x5e" + "\x81\x1c\xc7\x7a\x85\xba\x02\xc2\xa1\xb5\x53\xc5\x7b\x85\xba\x65" + "\xc2\x5e\xa1\x2e\x9d\xeb\x15\xea\x66\x12\x4f\x50\xb7\x87\x78\x85" + "\xba\x28\xb2\xbd\x36\xc0\x74\x3b\xeb\x15\xc8\x76\xd6\x2b\xd4\x1d" + "\x16\x37\x37\xc5\xfe\x3c\xf4\xfd\x9f\x9b\xe2\xfa\x1b\x9b\x9b\x72" + "\x25\x5a\x9a\x57\xb8\x12\x25\x5d\x97\xde\x88\x67\x75\xe9\x8d\x78" + "\xe1\x39\x10\x3f\x8f\xb5\xae\x4b\x7f\x39\xcc\xea\xd2\x6b\xfd\x09" + "\x7f\x5f\x93\x11\xfe\xbe\x7a\xcc\xde\x39\x10\xeb\xee\x32\x5a\xd4" + "\x38\x07\x22\x81\x99\x03\x01\x7a\x94\xe8\xcf\xab\xa3\xb9\x73\x20" + "\x7e\xde\x29\x34\x07\x82\x77\xee\x83\x99\xe6\x34\xea\x53\x47\xe6" + "\x3e\xfc\xb6\x35\x67\x5d\x35\xd1\x9c\x57\x5d\xa4\x69\xce\xab\xce" + "\x5c\xcd\xf9\xeb\x40\x4b\xcd\x79\x35\xda\x7e\xcd\x79\x35\x5b\x9a" + "\xe6\xbc\x9a\x65\x9f\xe6\xbc\x7a\x9d\x7f\xee\xc3\xcf\xfe\xc2\x73" + "\x1f\xc8\x3e\x4b\xad\xf0\x8b\x49\x5e\xf1\x97\xd9\x5d\x5f\x73\x5e" + "\xd3\xf1\xeb\x82\x5f\x5c\x88\xe6\xbc\xda\xd0\xfe\x9a\xf3\x6a\x03" + "\xbf\xe6\xfc\x85\x19\xff\xaf\x36\x58\x6a\x4e\x38\x87\x57\x73\xfe" + "\x52\x62\x7e\x0e\xd1\x9c\x57\xb5\x44\x73\xfe\x72\x52\x58\x73\x36" + "\x44\x12\xce\x6a\x18\x45\x38\x8b\xc4\xd4\x52\x73\x36\xf4\xb0\xad" + "\x39\x09\x86\xe8\xeb\x14\xd4\x9c\x0d\xb3\x2c\x35\xe7\xcf\x2f\xf2" + "\x6b\xce\x1b\xc3\x59\x1c\x5d\xaf\xe0\x6a\xce\x86\xad\x0f\x86\xe6" + "\x14\xc2\xd6\x35\x1d\x57\x73\x5e\x8f\x11\xaf\x39\xaf\xef\x10\xa7" + "\x39\x31\xe6\xf8\x34\xe7\xf5\xeb\x0c\x7e\xb4\xfc\x9a\xf3\x46\x77" + "\x7e\xcd\x79\x63\x20\x57\x73\xe2\xf6\xf9\x34\xe7\x8d\xa9\x9c\xf6" + "\x2d\x34\xe7\x8d\x68\xae\xe6\x24\xc7\xb1\x9a\xf3\x57\x37\xc2\xa1" + "\x57\x2e\x8b\xd7\x9c\x37\xae\x0b\x6b\xce\x1b\x77\xb8\x9a\xf3\x46" + "\x19\xd1\x96\xbf\x2a\x89\xe6\xbc\x51\x4b\xb6\x5f\xa9\x33\xdd\xce" + "\x6a\x4e\xb2\x9d\xd5\x9c\xbf\xfa\x5a\xd3\x9c\x54\xde\xa0\xa8\x1c" + "\xb9\x61\x3f\xfc\x94\xc2\x75\xf6\x81\xf1\x4d\x0d\xff\x2f\x83\x71" + "\xca\x13\xfe\x2f\x98\x63\xd3\x7a\x0d\x8a\x32\x80\x2e\x31\xc0\xdf" + "\xa9\xd2\xfe\xaa\x56\xf7\xd5\xe1\xf1\x64\x3f\x19\x5f\x06\x45\xb9" + "\xeb\x1e\x99\x64\xa0\xa2\x10\xa5\x80\xff\x27\xc2\x36\x38\xbe\x27" + "\x8c\x87\xca\x04\xd4\xf3\x86\xfc\xd7\x6a\xe3\x71\x70\xcd\x3d\x2f" + "\xc9\x7f\xcd\xc6\x6d\xc0\xb5\xd6\xc2\xfd\xbc\x28\x78\xad\xd0\xd6" + "\xf4\xdd\x03\x50\xb2\x8e\xfa\x59\xbd\xf0\x16\xaa\x93\x6b\x87\xb8" + "\x37\x3c\x32\x09\x78\x08\x61\x8d\xb8\xbf\xaf\xd6\x19\xb7\xa9\x5e" + "\xd8\x82\xf7\xb9\xe2\x7d\x7a\xb8\xc6\x94\x18\x24\x5f\x7f\xeb\x11" + "\x57\xd0\x5c\x2e\xa9\x8d\x54\xfd\x22\x1d\x5c\x33\x8c\xaf\x5f\x0d" + "\xa8\x71\xde\xb7\xa5\x86\x1e\x7b\x2a\x1b\xf5\x74\x1b\xca\x85\xf8" + "\x7a\xb4\x3e\xdb\xe0\x78\xbe\x6b\x58\xb5\x17\x0d\x73\xf1\xa1\x34" + "\xe2\xc6\x3b\x6d\x92\x50\x3f\xba\xa7\x0f\x40\xea\xa1\xd0\x77\x4a" + "\x24\xe7\xdb\x2f\xf2\xef\x58\x9b\xff\xe0\xba\xb1\x37\xd5\x98\xba" + "\x19\xc9\x37\x18\x1e\x71\xfd\x27\x5c\xd1\xf6\x4d\x94\xf6\xde\xba" + "\x9b\x81\x1a\xd9\x8f\x69\xb8\xcf\xdf\x85\xfd\x1b\x7a\x53\xda\xdb" + "\x19\x18\x37\x37\xa3\x8e\xc1\xd8\x6e\x1e\x8b\xb8\x88\x98\xb9\xca" + "\xf8\xe8\x98\xc8\x45\x4b\xe3\x95\x43\x22\x1e\x45\x33\x17\x2d\x52" + "\xc6\xcc\x5d\xb8\x4c\x69\xba\x67\x8c\x32\x22\x7a\xc9\xdc\xb7\x16" + "\x44\x0e\x8f\x99\x17\xfb\x28\x4e\xb0\x9a\x5c\x87\x02\x5f\x8b\x61" + "\xdd\xcd\xf8\x6d\xef\x23\xb4\xb1\x17\x72\xc6\xd7\x05\x7f\xaf\x46" + "\xe3\x3c\xae\x1c\xff\xbd\xf5\x9b\xa8\x46\x39\x1c\x93\x0a\x9c\xb6" + "\x21\xe5\x11\x38\x56\x5b\xb7\x1d\xae\x6b\x1b\x5c\x37\x5c\x23\x5c" + "\xf3\x2d\x67\xe3\x35\x1b\x31\x91\x8a\x31\x91\x72\x0b\x30\x78\x6b" + "\x88\x7b\xd3\x23\xaf\x52\x54\x10\xbe\xbf\x46\x78\x56\x64\xb0\xed" + "\x08\xed\x1b\xf2\x07\x45\xc1\xb9\xfe\x46\x8c\x19\xf2\xde\x41\xd4" + "\xa6\x41\xbe\xa0\x2b\x65\xf7\xa8\xa8\xff\x06\x6c\xe2\xf3\xb3\x9f" + "\x45\x28\x8d\xba\x17\x44\x7f\x1b\x83\xba\x07\x18\x26\x38\x85\x7d" + "\xb7\xc3\x6f\xcb\xd1\x38\x68\x63\xa5\x06\xe5\x1e\xc6\x6d\x68\x60" + "\x1b\xee\x73\x43\x51\x66\xce\x2c\x15\x4a\xfb\x7d\x1a\x4a\xbb\x87" + "\xcf\x29\x9e\x12\xe5\x1e\x8f\x64\xd3\x13\xa9\x0b\xc0\x3b\x32\x6a" + "\x60\x66\x0e\xb5\x73\x4a\x94\x46\x7e\x2b\xca\x90\xff\x0e\x82\xfb" + "\x69\x80\x76\xca\x35\x32\x6f\xfa\x5a\x36\x6c\xa2\xfb\xbe\x01\xdf" + "\x3b\xf4\x0f\xf8\x1f\x4a\x4d\x65\x30\xcf\x50\xce\x4b\x4d\x86\x9c" + "\x3c\x65\x95\xf3\x5d\x34\x5d\x47\xb5\x52\xb9\x2f\x35\x55\x36\x36" + "\x02\xa7\xc5\xce\xa3\x1e\xbd\xb9\xca\x5d\x17\x1d\xb9\xbd\x17\x3c" + "\x8b\xb9\x79\x4a\x2a\x37\xb4\x7a\x96\x0f\xf2\xb8\xb7\xee\xb6\xca" + "\xd8\x9f\xd0\x97\xce\xe2\x70\x74\x7b\x18\xbe\x27\x8c\x07\xb8\x1e" + "\x06\x0f\xb7\x13\x8f\xc5\x5b\xe2\xa1\xed\xd9\xdc\x14\x1c\xab\xa3" + "\x82\x5e\x6d\xcd\x0b\xde\x45\x29\x82\xf3\x52\x2e\xa3\x6e\xb8\x6f" + "\x2b\xc1\x0b\xac\x4f\x40\xde\xd9\x60\x11\xde\x5c\xe6\x81\xb4\xf9" + "\xc1\x39\xee\xe9\x69\x32\xe8\x13\x39\xf0\x8b\x2f\x70\xa6\x6f\x6b" + "\xef\x77\x50\x52\x24\x92\x97\x5c\xda\x2f\xc7\xfa\x19\xcf\x5b\xb9" + "\x22\x6f\x1c\xbd\x0d\xce\xa3\x7e\x0d\x42\x38\x1e\x74\x2c\x7e\x8d" + "\x42\x53\x81\x95\xf1\xfb\x14\xd8\x1f\xb3\x15\xda\x14\x77\x5f\x8d" + "\xb4\xfe\xd5\x43\xac\x9e\x85\x38\x55\xd5\xe9\xe9\x36\xe9\x58\x2d" + "\x60\x63\x75\x04\xae\x83\x8d\xd7\xed\x46\x1c\x57\x81\x7b\xd6\x92" + "\x7b\x0e\x51\x51\x8a\x10\x85\xf0\x3d\x87\x78\x90\x7b\x76\xb9\x65" + "\xfd\x9e\xef\x0c\xb7\x7e\xcf\x77\xe6\x4a\xb8\xe7\x26\xf1\xf7\xdc" + "\x58\x2f\x7c\xcf\x21\x4c\x9c\x43\x20\xce\x21\x56\xe2\x1c\xc2\xc4" + "\xf9\xb1\x4b\xd6\xef\xf9\xee\x40\xeb\xf7\x7c\x77\x96\xf8\x7b\xbe" + "\xd3\x20\xfe\x9e\xef\xd4\x5a\xb9\x67\x26\xce\xa1\x10\xe7\x50\x2b" + "\x71\x0e\x65\xe2\xec\xf9\xad\xf5\x7b\xbe\xe7\x65\xfd\x9e\xef\x4d" + "\x16\x7f\xcf\x77\x35\xe2\xef\xf9\x6e\xb5\xf0\x3d\x87\x32\x71\x0e" + "\x85\x38\x87\x5a\x89\x73\x28\x13\xe7\xe7\xd6\x59\xbf\xe7\xa6\xee" + "\xd6\xef\xb9\x69\xac\xf8\x7b\xbe\x77\x46\xfc\x3d\xdf\x3b\x6e\xe5" + "\x9e\x99\x38\x87\x41\x9c\xc3\xac\xc4\x39\x8c\x89\x73\xc8\x4b\x36" + "\xee\x59\x6f\xfd\x9e\x9b\x47\x88\xbf\xe7\xa6\x32\xf1\xf7\xdc\x54" + "\x2a\x74\xcf\x2d\xc0\xdb\x6e\x70\x2f\xad\xdf\x05\xbd\xaa\x57\x04" + "\x17\xba\xd5\x21\x79\x61\x86\x21\xca\xbd\x1e\x75\x87\x7b\x8b\xa2" + "\x36\xc5\x54\xe3\x7f\x0d\x8a\xe0\x82\x16\x45\xf0\xae\xe6\xde\x83" + "\x7c\x57\x84\xa1\x6e\x58\x8f\xaf\x35\x20\x6f\x43\x5e\x70\x5e\xd6" + "\xeb\x48\x99\xaa\x45\x1e\x95\x29\x1a\x94\x12\x4b\x69\x2b\xd1\x45" + "\xd4\xa3\x1e\x7b\xcf\xef\x51\x79\x43\x19\x5a\x18\x47\x51\x57\xe4" + "\x2d\xc9\x38\x6f\x02\x3a\x39\x2d\xe7\x3f\x48\x09\x7f\xc3\x77\x1b" + "\xfc\xe0\x76\xdc\x03\x60\xfc\xdc\x14\xf3\xed\xf6\x14\xe4\x7d\xf4" + "\xed\x7a\x84\xb7\x6f\x85\x1f\xfd\xa6\x77\x50\x4a\x18\x92\xef\xbd" + "\x55\x23\x27\x63\x73\xcb\x64\xf3\xb1\x39\x60\x2e\xf4\xe5\x5b\xf4" + "\xbe\xfc\xc2\xd7\xc5\xf6\x65\x8b\xc2\x38\x76\xd3\x7d\x59\xab\x27" + "\xe3\xbd\xd9\xd8\x7d\x14\xfe\x3e\xdb\x97\x2d\xce\xb8\x2f\xa9\xbc" + "\xe0\xfd\x55\xf5\x2d\xd8\x37\x79\x5c\x49\x44\x72\x8d\xbc\xf9\x60" + "\x65\xec\x2d\x24\xd0\xc7\x5a\xb6\x8f\x43\xfa\xb9\xd5\xb9\xdc\xe2" + "\xef\xe3\x10\xef\x16\x45\x88\xca\xb2\x8f\x43\x14\xf6\xf5\x71\xeb" + "\x45\xc7\xfb\xb8\xb5\x44\xb8\x8f\x5b\x9b\xc5\xf7\x71\x6b\xa2\xf8" + "\x3e\x6e\x8d\x22\x7d\x1c\xe2\xcb\xed\xe3\x56\x6f\xe1\x3e\x0e\x31" + "\xc1\x71\x08\xe0\xf8\xb1\x4b\x02\x7d\x0c\x38\x0e\xe1\xc1\x71\x88" + "\x9d\x38\xd6\x4f\x74\xbc\x8f\xf5\x9e\xc2\x7d\xac\x0f\x13\xdf\xc7" + "\xba\x5a\xf1\x7d\xac\x2b\x67\xfa\xd8\x0c\xc7\xba\x24\x2b\x7d\x6c" + "\x82\xe3\x50\xc0\xb1\xe7\xb7\xfc\x7d\x1c\x0a\x38\x0e\xe5\xc1\x71" + "\xa8\x9d\x38\x36\xec\x76\xbc\x8f\x0d\x4b\x85\xfb\xd8\x70\x4c\x7c" + "\x1f\x1b\xfc\xc5\xf7\xb1\xc1\x97\xf4\x71\xa8\x19\x8e\xf5\x1a\xe1" + "\x3e\x0e\x35\xc1\x71\x28\xe0\xf8\xb9\x75\x02\x7d\x0c\x38\x0e\xe5" + "\xc1\x71\xa8\x7d\x38\x76\x42\x3d\x1c\xef\x63\xea\x9c\x60\x1f\x3b" + "\xa1\x21\xe2\xfb\x98\x2a\x16\xdf\xc7\x54\x1e\xd3\xc7\x66\x38\xa6" + "\x26\x58\xe9\x63\x13\x1c\x87\x01\x8e\x43\x5e\xe2\xef\xe3\x30\xc0" + "\x71\x18\x0f\x8e\xc3\xec\xc3\xb1\x93\x6c\xb1\xc3\x7d\xec\x24\x1b" + "\x2b\xdc\xc7\xb2\xb5\xa2\xfb\xd8\x49\xe6\x2a\xba\x8f\x9d\x50\x13" + "\xe9\xe3\x30\x2e\x8e\x9d\xd0\x2e\xa1\x3e\x6e\x05\x0f\xd8\x03\xfa" + "\xb8\x47\x03\x92\x6f\xc5\x7d\x5b\x43\xfa\x56\xdf\x3b\xa6\x7a\xab" + "\xdc\x10\x85\xfb\x84\xce\x01\xfd\xe2\xdd\x53\x9f\x17\x5c\x48\xc9" + "\xe1\x9e\x52\x5c\xf1\x3d\xdd\xd4\x65\xa0\x9e\xca\x94\x74\xf8\xbf" + "\x13\x3d\x3f\x56\x99\xb2\xfa\x3c\xfc\x3d\x27\x9c\xf7\xd2\xe5\x0f" + "\xf4\xd0\x7b\xcd\xd1\xc0\x3e\x1f\x6a\x48\x40\x1a\xf8\xcd\xfd\xd4" + "\x3b\xde\x8a\xaa\x86\xfd\xd0\x3f\xa7\x50\x65\xcd\x97\xc8\xd0\x3b" + "\xe6\xdb\x67\x75\x48\x45\xfd\xa2\x52\x94\xc7\x6b\x90\x7e\x9e\xb7" + "\x5b\x55\x62\x19\xaa\x4a\xfc\x0c\x4d\xaf\xa7\xee\x52\x3f\xa9\xdc" + "\x5a\xbd\xe2\xbd\xf5\x5e\x31\xfb\xf5\xf9\xc9\xbb\x74\x5e\xf1\xae" + "\x25\x09\x1a\xb9\x5b\x13\x52\x2d\xa8\xa3\xa8\xf5\x6f\x21\xe7\xf5" + "\x97\x90\xeb\x86\xb7\x90\xdb\x86\x4b\xc8\xa3\xbc\xae\x06\x55\x5c" + "\x2b\x43\x15\xb7\xce\xa1\x8a\xbb\xf0\xd3\x02\x3f\x06\xf8\x49\x3b" + "\x07\xb1\x46\x68\xea\x75\x84\xbf\x2b\xaa\x7d\xba\x16\x29\xca\x75" + "\x35\x08\xaf\xe9\xbd\xe1\x24\x3f\xe1\x16\x8e\x14\xd4\x4f\xde\x88" + "\x9a\xe7\x2d\x87\x7d\xce\x78\x7b\x95\x4e\x8b\xca\xeb\x9a\xf0\xfe" + "\x62\xd8\xef\x9c\x5a\x07\xed\x1b\xca\xf0\x77\x43\xb5\xe5\x69\x27" + "\x91\x2e\xf7\x34\xa2\xb0\x87\xee\x1d\x1c\x9b\x03\x5d\x6d\xa0\xbc" + "\x07\x11\x1c\x38\x9d\xdf\x66\x10\x1b\x6b\x39\xa9\x7f\xf3\x8e\x77" + "\x2f\xe8\xe7\xbe\x86\x77\x82\x3c\xa6\x9d\xbb\x40\xe1\x39\x7e\x38" + "\x97\x50\xd9\x78\x0a\xe1\x77\x4d\xd3\x97\x21\x14\xa0\x47\x08\xf7" + "\x45\x55\x62\x3d\x9a\x16\x8b\xdc\x71\xfe\xd9\xf0\x8b\xaa\x57\x55" + "\x9d\x16\x25\xeb\xe0\x1a\x6f\x34\xb5\x5d\x63\xe5\xca\x4a\x04\xfb" + "\xfa\x56\x46\x69\x90\x5b\x2c\xf2\xc0\xfd\xab\xcb\x0b\x2e\x98\x06" + "\xcf\xcf\xc2\x46\x8a\xc2\x7d\x8b\xfb\x14\xf7\x2f\x6e\xcf\xd8\xe7" + "\x55\x11\x5a\x94\xda\x84\x3c\xaa\x52\xe0\xdf\x44\x4a\x5b\x85\x6e" + "\x22\xb8\xc6\x1a\xca\xf3\x34\x02\x5c\x9c\xc1\x58\x00\x7c\xd6\x43" + "\xfc\x7b\xf1\x63\x2a\x44\x41\x30\xe5\x72\xcb\x36\xa6\x42\xfa\xb1" + "\x98\x72\x9e\xc8\x62\xaa\xdb\x40\x61\x4c\xb9\x24\x13\x4c\x85\xf8" + "\x76\x4d\x4c\xb9\xf4\xb1\x8e\x29\xe7\x26\x61\x4c\x85\xa8\x00\x53" + "\x5a\x2e\xa6\xba\x8d\x10\x8f\x29\x97\x49\x9d\x87\xa9\x10\x6f\x69" + "\x98\x72\x19\xc6\xc5\x94\xf3\x8b\x56\x30\xc5\xf0\xd4\x63\x97\xec" + "\xc0\x94\x09\x4f\x75\xdb\xcc\x62\xca\x75\xa9\x30\xa6\x1e\x39\xcd" + "\x60\xaa\x8b\xf2\xd4\x23\x31\xd6\x31\xf5\x48\x80\x15\x4c\x01\x4f" + "\x85\x98\xf1\x94\xeb\x2a\xf1\x98\x7a\xa4\xb0\x13\x31\x25\x91\xa7" + "\x1e\x49\xe3\x62\xaa\x5b\x8e\x30\xa6\x42\x19\x9e\xf2\xfc\xd6\x36" + "\xa6\x42\x4d\x78\xca\xf5\x3a\x8b\xa9\x47\x4f\x0a\x63\xea\xd1\x21" + "\x04\x53\xa1\x5d\x94\xa7\xba\x1f\xb3\x8e\xa9\xee\x45\xc2\x98\x0a" + "\x05\x9e\x0a\x31\xe3\xa9\x47\xcf\x89\xc7\x54\x77\x6d\xe7\x61\x2a" + "\x54\x22\x4f\x75\x3f\xc3\xc5\x94\x6b\x9d\x15\x4c\x31\x3c\xf5\xdc" + "\x3a\x3b\x30\x65\xc2\x53\x8f\x8d\x67\x31\xd5\xa3\xbf\x30\xa6\xdc" + "\x96\x31\x98\xea\xa2\x3c\xe5\xe6\x65\x1d\x53\x8f\x35\x5a\xc1\x14" + "\xf0\x54\xa8\x19\x4f\xf5\x18\x2e\x1e\x53\x6e\x13\x3a\x11\x53\x12" + "\x79\xca\x4d\xc5\xc5\xd4\x63\x7e\xc2\x98\x0a\x63\x78\x2a\xe4\x25" + "\xdb\x98\x0a\x33\xe1\xa9\x1e\xf9\x2c\xa6\xdc\x17\x0b\x63\xaa\x67" + "\x05\xc1\x54\x58\x17\xe5\xa9\x9e\xd1\xd6\x31\xd5\x73\x92\x30\xa6" + "\xc2\x80\xa7\x42\xcd\x78\xca\x3d\x5d\x3c\xa6\x7a\x16\x74\x1e\xa6" + "\xc2\x24\xf2\x54\xcf\x24\x2e\xa6\x7a\x64\x09\x61\xaa\x05\xfb\x3e" + "\x19\x60\x2a\x0a\x7c\x1f\x60\xc8\xbd\x9a\x60\xaa\x15\x30\xf5\x81" + "\x29\xa6\x7e\x30\xf7\x7d\xee\x57\x0d\x6d\x98\xf2\xbc\x63\x8e\x29" + "\x03\x60\xaa\x95\xc6\x94\x67\x0f\xa3\xef\xab\x6a\x28\x82\x58\x5d" + "\x43\x55\x81\x80\xa7\x4d\x0c\x9e\x7e\x00\x3c\xc1\xfd\x18\xe0\x7e" + "\xcb\x6b\x6b\xd0\x74\x2d\xb9\xaf\x16\xb8\x5f\x83\x29\x96\x5a\xea" + "\xe5\x18\x43\x18\x3b\x46\x1c\x55\x2c\x04\xfc\xc4\x9d\x46\x15\x09" + "\xf0\xb3\x1c\x7e\x52\xe0\x07\x9d\x46\xe5\xf5\x88\xce\xd9\xb3\xf8" + "\xa9\x66\xf0\xe3\xb1\xdb\x3a\x7e\x3c\x32\xc5\x79\xbc\x5e\x2e\xe2" + "\xf1\xe3\x51\xc3\xcc\xa5\xf3\x98\x3e\xe3\x02\x85\xe7\xcd\x12\x8c" + "\x5c\x43\xd3\x75\xc8\x9d\x0a\x51\xf5\x72\x0b\x42\x1e\x2b\xf4\x48" + "\x9e\xfd\x16\xf2\xc8\xfe\x1e\xee\xd7\xf8\xec\x5c\x42\x6e\xa7\x9a" + "\xbe\x44\xe5\xb7\x6a\x50\xf9\xdd\x93\xa8\xdc\x00\x3f\xd7\xe0\x07" + "\xae\x71\x7a\xa4\xe9\xfd\x6a\x99\xfb\xf5\xdc\x0c\x6d\x0d\x16\xbe" + "\x5f\xcf\x44\xfa\x7e\x23\xe0\x7e\x5b\xd8\xfb\xad\x02\x2c\x42\x5c" + "\xfa\x1a\x18\x9f\x38\x5d\x8b\xba\x2f\xd2\x51\x54\x0b\x83\x41\x1c" + "\x97\x53\x67\x9a\xd0\xf4\x58\x88\xd5\x3c\xc0\x60\xdd\x2e\x94\x9a" + "\x04\x18\x6c\x69\xc2\xef\xf5\xb5\x55\x69\xcd\x80\x41\x8f\xc3\x14" + "\xf4\x5b\x2b\xc6\xe0\x0f\x18\x83\xee\x1a\x83\x20\x06\xc1\x27\xd2" + "\x18\x04\x9f\x68\x13\x83\xa6\x3e\xb1\x57\x0c\x8b\x41\xc5\x32\x61" + "\x0c\x3e\x9e\x6b\xf4\x89\xf7\x1f\x83\x8f\x0f\xb7\x8e\xc1\xc7\xdd" + "\xc4\x79\x42\xc5\x5a\xf1\x18\x7c\x3c\xb4\xf3\x30\xa8\xe8\x6f\x1d" + "\x83\x8f\xeb\x6c\x63\x30\xc4\x5b\x1a\x06\x1f\xf7\xe7\x62\xb0\x57" + "\x84\x15\x0c\x32\x3c\x08\xbe\xd2\x36\x06\x4d\x78\x50\x71\x93\xc5" + "\x60\x6f\xbd\x30\x06\x7b\x7b\x19\x7d\xe5\xfd\xc7\xa0\xd7\x01\xeb" + "\x18\xf4\xca\x11\xe7\x21\x7f\xd7\x43\x3c\x06\xbd\x34\x9d\x87\xc1" + "\xde\x3b\xac\x63\xb0\x77\x9a\x1d\x18\x94\xc8\x83\x5e\xc7\xb9\x18" + "\x54\xd4\x0b\x63\x30\x94\xe1\x41\xf0\xa1\x36\x31\x68\xea\x43\x7f" + "\xb7\x94\xc5\x60\x9f\x74\x61\x0c\x7a\x6f\x36\xfa\xd0\xfb\x8f\x41" + "\xef\x51\xd6\x31\xe8\xad\x10\xe7\x39\xfb\xe4\x8a\xc7\xa0\x77\x44" + "\xe7\x61\xb0\xcf\x10\xeb\x18\xec\xe3\x6c\x1b\x83\xa1\x12\x79\xd0" + "\x7b\x12\x17\x83\xbf\x5b\x60\x05\x83\x0c\x0f\x82\x6f\xb5\x8d\x41" + "\x13\x1e\xec\xd3\xcc\x62\xb0\x9f\x8b\x30\x06\x9f\xe8\x6f\xf4\xad" + "\xf7\x1f\x83\x7d\x0f\x59\xc7\x60\xdf\x02\x71\x1e\xb5\x9f\x97\x78" + "\x0c\xf6\xad\xef\x3c\x0c\x3e\xb1\xdb\x3a\x06\x9f\xc8\xb4\x03\x83" + "\x12\x79\xb0\x6f\x39\x17\x83\x7d\xb4\xc2\x18\x0c\x63\x78\x10\x7c" + "\xae\x4d\x0c\x9a\xfa\xdc\x7e\xc9\x2c\x06\x07\xac\x15\xc6\x60\xff" + "\x1d\x46\x9f\x7b\xff\x31\xd8\x7f\xac\x75\x0c\xf6\xef\x27\xce\xd3" + "\x0e\xd8\x2c\x1e\x83\xfd\x17\x74\x1e\x06\x07\x0c\xb7\x8e\xc1\x01" + "\x6e\xb6\x31\x18\x26\x91\x07\xfb\x07\x72\x31\xd8\x2f\x5e\x08\x83" + "\x06\xf0\xc5\xad\xc5\x01\x69\x86\xbc\x78\x6f\x77\x99\x12\xe9\x14" + "\x73\x34\x55\xf1\x8d\x68\xda\x1d\xe8\x9f\xd8\x3b\x68\xce\x1d\x0f" + "\xa4\xcf\x8b\x77\x05\x5f\x58\x60\xe2\x9f\xe9\xb9\x65\xba\x9c\xd3" + "\x68\xc3\x42\xe4\x0c\xfe\x1b\x8f\xe3\xbe\x55\x57\x9a\x10\xfe\xfb" + "\xc9\xf8\x7a\xae\xb1\xd7\x83\xf3\x04\xd4\xaf\x2a\x0f\xfa\x1d\x73" + "\x8b\x06\xd5\xbd\x88\x9c\xca\xeb\x34\xd0\x0f\xcb\xe9\xf8\xe2\x7e" + "\xb9\xe2\xf4\xe4\x82\xed\x37\x90\xb3\xee\x27\xef\xbe\xd0\xdf\x8a" + "\x1e\x7f\x45\xb2\x7e\x75\x94\x01\xf7\x2b\xee\x2f\xdc\xc7\xca\xe5" + "\xf8\xdd\xf5\x93\x47\x2a\x01\x63\xba\x9f\x54\x7d\xb7\xc1\x71\xfc" + "\x7e\xf5\xc9\x13\xe2\xb1\xf1\x64\x26\xbd\x6e\xc1\xe9\xc9\x88\xf2" + "\x5a\xc4\xfb\xee\xd8\x00\xfe\xcd\xbe\xbe\x0a\xf1\x36\xf1\x79\x1d" + "\xd0\x57\xca\x02\xfb\xfa\x4a\x79\x95\xdb\x57\x7c\xbe\x4a\x79\x53" + "\x7c\x5f\x29\x0f\x92\xbe\x52\xe6\x58\xe9\x2b\x3b\x71\x15\x52\x60" + "\xe2\x47\x3a\xa0\xaf\x06\x1e\xb7\xaf\xaf\x06\x79\x99\xf5\x15\x8f" + "\xfe\x1f\xd4\x5f\x7c\x5f\x0d\xd4\x90\xbe\x1a\x78\x58\xb8\xaf\x42" + "\xed\xc4\x55\xa8\xb7\x89\x6e\xee\x80\xbe\x1a\xa4\xb5\xaf\xaf\xfe" + "\x6b\x3c\xb7\xaf\xf8\x74\xea\x7f\x4d\x16\xdf\x57\xff\x45\xbe\x87" + "\xe7\x34\xa8\xde\x4a\x5f\xd9\x89\xab\xd0\x02\x13\x7d\xd7\x01\x7d" + "\x35\xb8\x9f\x7d\x7d\x35\x38\xc6\xac\xaf\x78\xf4\xd4\xe0\xa5\xe2" + "\xfb\x6a\xb0\x1f\xe9\xab\xc1\x0a\xe1\xbe\x0a\xb3\x13\x57\x61\xde" + "\x26\x3a\xa4\x03\xfa\x6a\xc8\x24\xfb\xfa\x6a\xc8\x66\x6e\x5f\xf1" + "\x8d\xfb\x43\x76\x88\xef\xab\x21\x11\xa4\xaf\x86\xf8\x0b\xf5\x95" + "\x3e\x2f\x38\xcf\x1d\xfa\xa0\x79\x53\x70\xac\x7b\x22\x92\xb7\x0c" + "\x86\x7e\x53\x40\xbf\xa5\x2b\x51\x6b\x1e\xf4\x9b\x56\x87\xa6\x2d" + "\xbe\x40\x55\x36\xe8\x51\x0b\xf4\x59\xb3\x22\xb8\xa0\x4a\x5b\x8f" + "\xe7\x1c\xbd\x70\xc9\xe9\xf7\xe9\x21\x8b\x3d\x10\xee\x37\xdc\x0f" + "\xb8\xef\x28\xe8\x37\xba\x1f\x15\xc9\xbb\xf4\x8a\x98\xfd\x53\xaf" + "\x5f\xa0\x16\x69\x28\x0a\xdf\x2f\xa5\x18\x48\xbf\x17\x98\x5e\x8f" + "\xba\x2b\x5f\xc7\xf7\xf4\xfb\x11\x78\x7b\x95\xb6\x06\xf4\xc1\x2d" + "\x44\x6b\xb3\x0b\x2a\x85\xfe\xcf\x2a\x37\x7d\x55\xd0\xab\x54\xef" + "\x41\xbe\xba\xde\xef\xa0\xd4\xeb\xa8\x1b\xd6\x0f\xeb\x0d\xc8\x3b" + "\x39\x06\xc9\xf7\xbe\xad\x96\xd3\x6b\xd7\xe2\x70\x1b\x4f\xe9\xa1" + "\x5f\xbc\xa9\xdb\x26\x73\xba\x6f\x47\xa1\xaa\x2b\x39\x74\xdc\xcc" + "\x35\x02\x1d\xb7\xef\x54\x1e\xa0\x33\x7d\x29\x45\xf0\xae\x9c\x4a" + "\xa4\xa4\x5a\xa1\x8f\x53\xe8\xeb\xb9\xba\xbd\x45\x6c\x1f\x3f\x45" + "\xcf\xff\x36\x28\x99\xf9\x5b\xd0\x4f\xf8\xef\xd3\xf3\xb7\x62\x4d" + "\xe6\x6f\xc1\x35\xb3\xf3\xb7\x9e\xca\xc2\xf3\xb7\x0c\x17\xbc\xfb" + "\x1a\xef\x7d\xd1\x02\x8a\x82\x7b\xef\x55\xd9\xa8\x45\xf8\xfe\x2b" + "\x1b\xd5\x28\x35\x1e\x79\x54\xb6\xd4\xa3\x94\x46\x4a\x5b\x99\x76" + "\x15\x4d\xbf\x83\x75\x30\xc6\xcb\xef\x97\x91\xb8\x3e\x15\x60\xb8" + "\xa0\xea\xab\x71\xfa\x7d\x6c\x65\x35\x42\x26\xeb\x78\xa2\x40\x33" + "\xbb\x42\x1c\xa2\xaa\xd2\x2e\x41\x4c\x16\xfa\x56\xe9\xbe\xc7\x71" + "\x8a\x82\xfd\x2f\xb6\xe9\xeb\xde\x0b\xff\x80\xb7\xe1\x98\xe1\xf7" + "\x4d\xb8\x76\xc0\x76\x13\xfd\x8d\x71\xe1\x9e\x98\x86\xaa\x12\x5b" + "\x50\xa5\x0e\x81\xbe\x1a\xd2\xf4\x4d\x50\x8d\x00\x8e\x42\x14\x0c" + "\x8e\xb4\xee\x89\x2e\xb7\x6c\xe3\x28\xc4\x9b\xc5\x91\xcf\x49\xc7" + "\x70\xe4\xb3\xcc\x71\x1c\xf9\x4c\x94\x8e\xa3\x10\x15\x17\x47\x43" + "\x47\x88\xc7\x91\x8f\x87\x78\x1c\xa9\xce\x38\x86\x23\x9f\x63\x04" + "\x47\xaa\x3c\x82\x23\x9f\x52\x16\x47\xf4\xda\xa8\x0e\xc2\x91\xca" + "\xdf\x0a\x8e\x18\x3e\x0a\x01\x3e\x7a\xec\x92\x1d\x38\x32\xe1\xa3" + "\x61\x9e\x8e\xe1\xe8\xe9\x63\x8e\xe3\xe8\xe9\x6c\x07\x70\x64\xc6" + "\x47\xc3\x96\x89\xc7\xd1\xd3\x41\xe2\x71\xf4\x74\x3f\xc7\x70\x34" + "\xac\x3b\xc1\xd1\xd0\x5a\x82\xa3\x61\x88\xc5\x11\xbd\xde\xac\x83" + "\x70\x34\x34\x53\x18\x47\xa1\x0c\x1f\x85\x00\x1f\x79\x7e\x6b\x1b" + "\x47\xa1\x26\x7c\xf4\xcc\x6c\xc7\x70\xf4\x4c\x77\xc7\x71\x34\xfc" + "\xac\x74\x1c\x85\x9a\xf1\xd1\x33\xc7\xc4\xe3\x68\x78\x91\x78\x1c" + "\x0d\x8f\x70\x0c\x47\xcf\xcc\x20\x38\x1a\x3e\x98\xe0\xe8\x99\x49" + "\x2c\x8e\xe8\x35\x7c\x1d\x84\xa3\x61\xd5\x56\x70\xc4\xf0\x51\x28" + "\xf0\xd1\x73\xeb\xec\xc0\x91\x09\x1f\xf9\xee\x70\x0c\x47\xbe\x33" + "\x1c\xc7\x91\x6f\x7f\x07\x70\x64\xc6\x47\x23\xba\x8b\xc7\xd1\xb3" + "\xf5\xe2\x71\xf4\xec\x1e\xc7\x70\xe4\xbb\x99\xe0\xe8\xd9\x05\x04" + "\x47\xbe\x39\x2c\x8e\xe8\x75\x91\x1d\x84\xa3\x67\xbd\x85\x71\x14" + "\xc6\xf0\x51\x28\xf0\x51\xc8\x4b\xb6\x71\x14\x66\xc2\x47\x7f\xb8" + "\xea\x18\x8e\xfe\xb0\xd9\x71\x1c\xfd\x21\x52\x3a\x8e\xc2\xcc\xf8" + "\xe8\x8f\x33\xc4\xe3\xe8\x0f\xbe\xe2\x71\x34\xa2\xd1\x31\x1c\xfd" + "\xe1\x22\xc1\xd1\x88\x83\x04\x47\x7f\xa8\x61\x71\x44\xaf\x35\xed" + "\x20\x1c\x8d\x08\x17\xc2\x11\xae\x45\xb0\x91\xd4\x85\x68\xdc\xb0" + "\x1c\xf9\x6d\xc7\xff\xb6\x20\xdf\x7b\xeb\xff\x98\x79\x2c\x89\xd4" + "\x03\xd0\x38\xfd\x91\xce\xf7\xf2\x9d\xff\xd8\x6e\x88\x8b\x22\x38" + "\x67\xfa\x79\x52\xa3\x01\xd7\x05\xb9\x9d\x1a\x85\x9e\xc5\x75\x19" + "\x9c\x46\xaa\x71\x1d\xab\xb6\xda\x01\x0a\x81\xda\x01\xc1\xc2\xb5" + "\x03\x5a\x36\x19\xd7\xdd\xee\x62\xd7\xdd\x3a\x8d\xcc\xb6\xba\xee" + "\xd6\x69\xe4\xd2\xad\xc1\x62\xf1\x30\xd2\x1f\xdf\xe3\xed\xde\xc1" + "\xb1\xf7\xd6\x8f\x5c\x09\xf7\x1c\x4a\xee\x7d\x14\x42\x76\xad\xc7" + "\xdd\x65\x82\x93\x91\xbe\xb3\x42\x51\x1a\xb5\xee\xf6\x4a\xca\x2b" + "\x38\x87\xca\x0f\x2e\x12\x79\x2d\x82\xdf\x3f\x24\xfd\x1d\xe2\xc1" + "\xdf\xdf\xcf\xf9\x32\xfd\x4d\xd6\x39\x2b\x04\xea\x16\x04\x0b\xd7" + "\x2d\xe0\xef\xef\x51\xd6\xd7\x39\x3b\x8d\xba\x2c\xbe\xbf\x47\xed" + "\x67\xfa\x5b\x7b\x6f\xfd\xa8\x46\xb6\xbf\x9f\x8b\x15\xdf\xdf\xa3" + "\x8a\x48\x7f\x37\x26\x52\x5e\x21\x1e\x54\x7e\x88\xc8\x6b\x79\x4e" + "\xb0\xfe\x37\xd3\xdf\x02\xf8\x7e\xbe\x88\xf4\x37\x53\x33\x41\x21" + "\x50\x33\x21\x58\xb8\x66\x02\x7f\x7f\x3f\x1f\x63\xbd\xbf\x9f\x9f" + "\x25\xbe\xbf\x9f\x57\x92\xfe\x0e\x01\x7c\x3f\x1f\xc1\xf6\xf7\xf3" + "\x1a\xf1\xfd\xfd\xbc\x07\xe9\xef\x3b\x0b\xa0\xbf\x01\xdf\x21\x22" + "\xf1\xfd\xfc\x1e\xeb\xfd\x1d\x2a\x80\xef\xd1\x1e\x4c\x7f\x33\xf8" + "\x16\xa8\xd7\x10\x2c\x5c\xaf\x81\xbf\xbf\xfd\xce\x5b\xef\x6f\xbf" + "\x13\xe2\xfb\xdb\x2f\x87\xe9\x6f\xc0\xb7\xdf\x19\xb6\xbf\x47\x07" + "\x8a\xef\x6f\xbf\x34\xd2\xdf\x77\xc3\x29\xaf\x50\xc0\x77\xa8\xc8" + "\x6b\x19\xdd\xcf\x46\x7f\x0b\xe0\x7b\x4c\x1a\xe9\x6f\xa6\x56\x84" + "\x42\xa0\x56\x44\xb0\x70\xad\x08\xfe\xfe\x1e\x33\xd5\x7a\x7f\x8f" + "\x19\x25\xbe\xbf\xc7\x20\xd2\xdf\xa1\x80\xef\x31\x13\xd8\xfe\x1e" + "\xa3\x16\xdf\xdf\xa3\xb5\xa4\xbf\xef\xcd\x84\xfe\x06\x7c\x87\x8a" + "\xc4\xf7\x98\x2c\xeb\xfd\x1d\x26\x80\xef\x17\xb4\x4c\x7f\x33\xf8" + "\x16\xa8\x53\x11\x2c\x5c\xa7\x82\xbf\xbf\x5f\x38\x62\xbd\xbf\x5f" + "\xd8\x29\xbe\xbf\x5f\x88\x65\xfa\x1b\xf0\xfd\xc2\x41\xb6\xbf\x5f" + "\xf4\x15\xdf\xdf\x2f\x84\x93\xfe\x6e\x9a\x44\x79\x85\x01\xbe\xc3" + "\xc4\x5e\x8b\x4e\xa8\xbf\xdd\xa1\xbf\x4f\x80\x8e\x01\xdd\x51\x60" + "\xc8\x03\x9d\xa2\xe7\xf6\x7b\x55\xa2\x1f\x7a\xe6\x2e\xee\xfb\xb1" + "\xb5\x30\x56\x17\x74\x5a\xbd\x0c\xa7\xb1\x27\x1c\x5f\x3b\x3c\x36" + "\x57\x78\xed\xf0\xd8\x65\xe2\xd7\x0e\x8f\x9d\xc0\x6a\xa0\xb1\x99" + "\x6c\x4c\xff\x9b\xe6\x0f\x71\x6b\x8a\xc7\x8e\xe4\xad\xa3\xe1\xf4" + "\x62\x1d\x5e\x53\x4c\xad\x6b\x7e\xd1\x90\x2f\x45\x1b\x8d\xad\xb7" + "\x1d\xeb\x10\x5c\xef\xc1\x43\x38\xd6\xe3\xca\x60\xdc\xf2\xee\xb4" + "\xba\x1d\x4e\xe3\x0e\x38\x1e\xeb\x71\xc9\xc2\xb1\x1e\x17\x29\x3e" + "\xd6\xe3\x7c\x59\xfd\x35\x2e\x9e\x8d\xb5\xbf\x84\xf5\xe3\xe3\x94" + "\xbc\xf5\x3c\x9c\xfe\xbb\x9a\xc4\xba\xa5\xc8\x90\x2f\x45\x97\x8d" + "\x3b\x63\x47\xac\xe1\xb9\x0e\xb1\xf2\x5c\x8f\x3f\x08\xb1\x2e\xe8" + "\xb4\xfa\x21\x4e\xe3\xb7\x3a\x1e\xeb\xf1\xd1\xc2\xb1\x1e\x3f\x43" + "\x7c\xac\xc7\xf7\x63\xb5\xdf\xf8\x70\x36\xd6\xe3\x1b\xc5\xc7\x7a" + "\xbc\x1b\x6f\x5d\x11\x27\xff\xc3\x24\xd6\x3a\x67\x88\xb5\x04\x4d" + "\x38\x5e\x6d\x3b\xd6\xa1\xb8\xfe\x85\x95\xe7\xfa\xe5\x22\x18\xaf" + "\xbd\x3b\xad\x8e\x89\xd3\xcb\x6b\x1d\x8f\xf5\xcb\xb3\x84\x63\xfd" + "\xf2\x58\xf1\xb1\x7e\xd9\x95\xd5\x9d\x2f\x07\xb0\xb1\x7e\x59\x23" + "\x3e\xd6\x2f\x35\xf1\xd6\x37\x71\x7a\x69\x17\x89\xb5\x3e\xca\x90" + "\x2f\x45\x8f\xbe\x2c\xa8\xff\x4d\x62\x0d\xcf\x75\xa8\x95\xe7\x7a" + "\x62\x16\xc4\xba\xa0\xf3\xea\xa9\x4c\x5c\xea\x78\xac\x27\x8e\x17" + "\x8e\xf5\x44\x1f\xf1\xb1\x9e\xd0\xc8\x6a\xde\x89\x7e\x6c\xac\x27" + "\x96\x8b\x8f\xf5\x84\x3a\xde\x3a\x2b\x4e\x13\xf2\x48\xac\x0d\xe5" + "\x10\x6b\x09\x5a\x78\x62\x81\xed\x58\x87\xe1\x9a\x2b\x56\x9e\xeb" + "\x57\xc1\xd7\x87\x79\x77\x5e\x5d\x97\x57\xe7\x3a\x1e\xeb\x57\x87" + "\x0b\xc7\xfa\x55\x2f\xf1\xb1\x7e\x45\xc3\xea\xed\x57\x07\xb3\xb1" + "\x7e\xb5\x54\x7c\xac\x5f\xa9\xe6\xaf\xf7\xf2\x4a\x1a\x1d\xeb\xf5" + "\xc8\xd7\x90\x2f\x45\x87\xbf\xba\x52\x8a\x0e\x5f\xb2\x15\xb9\x72" + "\xe3\x3d\x39\xaa\x73\xb5\xf8\xe4\x19\x8e\xc7\x7b\x72\x7f\xe1\x78" + "\x4f\x76\x11\x1f\xef\x49\xd5\xac\x16\x9f\xac\x60\xe3\x3d\x79\x97" + "\xf8\x78\x4f\x52\xf3\x6b\xf1\x49\xb1\x8e\x69\xf1\xc9\xf1\x52\xb4" + "\xb8\x65\xbc\x5f\x0b\xea\x5c\x3d\xfe\xda\x78\xc7\xe3\xfd\x5a\x0f" + "\xe1\x78\x4f\xb9\x23\x3e\xde\x53\xd4\xac\x1e\x7f\xcd\x99\x8d\xf7" + "\x6b\x05\xe2\xe3\x3d\x65\x3f\xbf\x1e\x9f\x12\xee\x98\x1e\x7f\x2d" + "\x42\x8a\x1e\xb7\x8c\xf7\xd4\x49\x9d\xab\xc9\xa7\x8e\x70\x3c\xde" + "\x01\x7a\xe1\x78\x07\x5c\x16\x1f\xef\x80\xfd\xac\x26\x0f\x30\xc9" + "\x7f\x4f\xcd\x14\x1f\xef\x80\x22\x7e\x4d\x1e\x10\xe8\x98\x26\x9f" + "\x3a\x53\x8a\x26\xb7\x8c\xf7\x74\xbf\xce\xd5\xe5\xd3\x07\x3a\x1e" + "\xef\x69\xd7\x85\xe3\x3d\xed\xac\xf8\x78\x4f\x2b\x62\x75\xf9\xb4" + "\x3a\x36\xde\xd3\xc5\xd7\xcf\x74\x9a\x96\xc3\xaf\xcb\xa7\xf9\x3b" + "\xa6\xcb\xa7\x4f\x90\xa2\xcb\x2d\xe3\x3d\x43\xd5\xb9\xda\x7c\x86" + "\xa7\xe3\xf1\x0e\x3c\x2f\x1c\xef\xc0\x13\xe2\xe3\x1d\x98\xc3\x6a" + "\xf3\x40\x93\xfc\xff\x8c\x28\xf1\xf1\x0e\x4c\xe3\xd7\xe6\x81\xbe" + "\x8e\x69\xf3\x19\x23\xa5\x68\x73\xcb\x78\xff\xc9\xbb\x73\xf5\xf9" + "\x9f\x64\x8e\xc7\xfb\xf5\x0a\xe1\x78\xbf\xfe\x85\xf8\x78\xbf\x9e" + "\xc6\xea\xf3\xd7\x8f\xb3\xf1\xfe\x53\x90\xf8\x78\xbf\x1e\xcb\xaf" + "\xcf\x5f\x57\x3a\xa6\xcf\xff\x34\xd8\xf1\x3c\xf9\xac\x46\xac\xcd" + "\xc5\xd6\x7f\xac\x8a\x37\xae\xb9\xfb\x93\x49\xfd\xc7\x59\xf4\xb7" + "\x55\xf8\x6b\xcb\xcc\x1a\xdf\xb5\xeb\x3f\xce\xb4\x51\xff\x71\xa6" + "\xc8\xfa\x8f\xb3\x7c\xc4\xcf\xc7\x9f\xd9\xc8\x7a\x84\x59\x26\xfe" + "\xff\x0d\xfa\xb9\xee\xda\x75\x21\x67\x9a\xd5\x85\xfc\x13\x5d\x17" + "\x92\x5a\x2f\xcb\x93\xe6\x45\xde\x40\x8e\xbf\x17\x08\xaa\xc6\x3e" + "\x44\x6c\x1d\x4a\x16\xdb\x6f\x54\xb0\xd8\x0e\x3a\x26\x8c\xed\xa0" + "\xfe\x5d\xbb\x0e\xe5\x9f\x77\x58\xc7\xf6\x9f\xd3\xc4\xd5\x1c\x09" + "\x92\x50\xf7\xe6\xcf\xd5\xac\x1f\x0a\x32\xf1\xbf\xb3\x3d\x3a\x0f" + "\xdb\x52\xeb\x53\xfe\xf9\x20\x17\xdb\x6f\x1c\x27\xd8\x76\xaa\x97" + "\xe6\xbb\x82\x6a\x1d\x7f\x0f\x12\xb2\x07\x7b\x2e\xb1\xf5\x30\x59" + "\x6c\xcf\xde\xcd\x62\x3b\x64\xab\x30\xb6\x83\x9b\xbb\x76\x3d\xcc" + "\xe0\x64\xeb\xd8\x0e\x0e\x15\x57\xcb\x24\xf8\xa2\x78\x6c\x07\xef" + "\x61\xbd\x5f\xb0\x96\xc5\x76\x48\x43\x27\x62\x5b\x22\x6f\x03\x37" + "\x73\xb0\x3d\xbb\x88\x60\xbb\xdb\x8b\xd2\x3c\x66\x48\xa9\xe3\xef" + "\x7d\xe6\x64\x62\x7f\x29\xb6\x2e\x27\x8b\xed\xd0\x55\x2c\xb6\xe7" + "\x58\xd4\x85\x62\xb1\x1d\x76\xb6\x6b\xd7\xe5\x0c\x9b\x6d\x1d\xdb" + "\x61\x7e\xe2\x6a\xa4\x84\x1d\x11\x8f\xed\xb0\x4c\xd6\xe7\x86\x95" + "\xb3\xd8\x9e\x53\xd6\x79\xd8\x96\x5a\xaf\x33\x6c\x01\x17\xdb\xa1" + "\x49\x04\xdb\xae\x39\xd2\xfc\xf4\x9c\x3c\xc7\xdf\x73\xcd\x8d\xc0" + "\x5e\x5a\x6c\x7d\x50\x16\xdb\x6f\xce\x65\xb1\x3d\x77\x96\x30\xb6" + "\xc3\x0f\x74\xed\xfa\xa0\xe1\x36\xea\xff\x84\x5b\xab\xff\xc3\xb3" + "\x56\x38\x5c\x42\xdd\x8b\xf0\x08\xd6\xd3\x87\xef\x62\xb1\x3d\xb7" + "\xb8\x13\xb1\x2d\x91\xb7\xc3\x27\x71\xb1\xfd\x66\x10\xc1\xf6\xa3" + "\x75\xd2\x72\x07\x73\x63\x1d\x7f\xaf\x17\xe1\x8f\xf3\x06\x62\xeb" + "\x94\xb2\xd8\x7e\x6b\x2c\x8b\xed\x88\x11\xc2\xd8\x9e\x97\xdd\xb5" + "\xeb\x94\xce\xf3\xb4\x8e\xed\xb7\xb4\xe2\x6a\xba\xcc\x93\xb0\x0e" + "\x7e\x9e\x3f\x9b\xbf\x98\x67\x32\xff\x3d\x22\xad\xf3\xb0\x2d\xb5" + "\x7e\xe9\xbc\xc1\x5c\x6c\xbf\x35\x92\x60\xbb\x87\x9f\xb4\x3c\x49" + "\x44\x80\xe3\x79\x92\xbf\x04\xd0\xef\x30\x45\xd6\x4b\x65\xb1\x1d" + "\xd9\x87\xad\x4d\xf4\x97\xb1\xe6\xd8\x66\x6b\x13\xcd\x9f\xd5\x75" + "\xea\xa5\x46\x9e\xb3\x8e\xe3\xc8\x52\x71\x39\x91\xf9\x63\xc5\xe3" + "\x78\xbe\x2b\x9b\x13\x99\x6f\x32\xff\xe5\x2f\xc6\x6f\x92\x77\x42" + "\xcd\xa2\xf9\x17\xad\xd7\x2c\x9a\xaf\xee\xb8\x3a\xaa\x91\x0d\xdc" + "\x9a\x45\x91\x1e\x06\xfa\x59\x70\xcf\x92\x96\x57\xf9\x4b\x90\xe3" + "\x79\x95\xb7\xc9\xfb\x5d\x91\x75\x5b\xd9\x67\x21\x6a\x08\xfb\x2c" + "\xbc\x3d\x59\xf8\x59\x88\x9e\xdb\x75\xea\xb6\x46\x5d\xb6\xfe\x2c" + "\x44\x1d\x17\x97\x43\x89\x96\x50\x07\x26\x5a\xc1\xe6\x50\xa2\x83" + "\xd8\x67\xe1\xed\x82\xce\x7b\x16\xa2\xaf\x5b\x7f\x16\xa2\xcb\x3b" + "\xae\x9e\x6b\x54\x13\xf7\x59\x88\xea\x47\x9e\x85\x5e\x1e\xd2\xf2" + "\x30\x6f\x4b\x7a\xff\xcd\x7d\x16\x62\x22\xe8\x77\xdf\x22\xeb\xc7" + "\xb2\xcf\xc2\x3b\x23\xd8\x67\x21\xc6\x42\xcf\xb3\xcf\xc2\x82\x98" + "\xae\x53\x3f\xf6\x9d\x9b\xd6\x9f\x85\x77\xaa\xc5\xe5\x5c\x16\xcc" + "\x12\xff\x2c\x2c\x50\xb2\x39\x97\x05\x26\xeb\x9f\x62\x8a\x3b\xef" + "\x59\x58\xd0\x6c\xfd\x59\x58\x50\xd3\x71\x75\x65\x17\x38\x73\x9f" + "\x85\x77\x54\xe4\x59\x50\xe4\x49\xcb\xdb\xc4\xd8\xa1\xff\x6d\xe5" + "\x6d\x62\x63\xe9\x79\x01\x22\xeb\xd8\xb2\xcf\xc2\xc2\xb1\xec\xb3" + "\x10\x3b\x57\xf8\x59\x58\xb4\xac\xeb\xd4\xb1\x5d\xa8\xb7\xfe\x2c" + "\x2c\xac\x15\x97\xa3\x59\x34\x57\xfc\xb3\xb0\x68\x18\x9b\xa3\x59" + "\x14\xcb\x3e\x0b\xb1\xfb\x3b\xef\x59\x88\x75\xb1\xfe\x2c\x2c\xaa" + "\xeb\xb8\xfa\xb6\x8b\x3c\xb8\xcf\xc2\xc2\x91\xe4\x59\xf8\x9d\xb7" + "\xb4\x3c\x4f\x6c\x92\xe3\x79\x9e\x25\x49\xf4\x9c\x09\x91\xf5\x74" + "\xd9\x67\x61\xf1\x64\xf6\x59\x58\x12\x23\xfc\x2c\xc4\xad\xea\x3a" + "\xf5\x74\xe3\xba\x5b\x7f\x16\x16\xd7\x8b\xcb\xe9\xc4\xc5\x88\x7f" + "\x16\xe2\xfc\xd8\x9c\x4e\x5c\x12\xfb\x2c\x2c\x39\xdc\x79\xcf\xc2" + "\x12\x4f\xeb\xcf\x42\x9c\xb6\xe3\xea\xec\xc6\xf5\xe3\x3e\x0b\x8b" + "\xfd\xc9\xb3\xd0\xa7\x50\x5a\x5e\x68\x49\xa6\xe3\x79\xa1\x84\x4c" + "\x7a\x3e\x89\xc8\xba\xbe\xec\xb3\x10\x3f\x8b\x7d\x16\x12\xac\x7c" + "\xe7\x61\x69\x6e\xd7\xa9\xeb\xbb\xd4\xc6\xf7\x8f\xe2\xad\x7c\xff" + "\x88\x2f\x07\xb4\x74\x99\xf8\x67\x61\xe9\x04\x36\x07\xb4\xd4\x64" + "\xfd\x5f\x42\x59\xe7\x3d\x0b\x09\x36\xbe\xff\xb0\xd4\x8e\xef\x3f" + "\x48\xad\xf7\xbb\x54\xc5\x7d\x16\xe2\x03\xc8\xb3\xd0\x4f\x29\x2d" + "\x8f\x94\x60\x33\xff\x8f\x7d\x7e\xab\xc2\x32\x8f\x54\x5e\xe7\x87" + "\x9e\x0e\xc6\xcf\x42\xe2\x8b\xba\xfc\xe0\x02\x5c\x5f\x58\x3f\x98" + "\xa9\x41\x99\xce\xd4\x78\x69\xd4\x91\x1a\x94\x5a\x7d\x5b\x0d\x4a" + "\x52\xfb\x03\xc9\xf1\x5a\x60\xbc\x26\x58\xe7\x41\xea\x4f\x52\x78" + "\x4e\x14\x9e\x23\x75\xa9\x8c\xae\xaf\x92\xa4\x83\x7b\xbf\x62\xa3" + "\xfe\x64\xb8\x06\x95\x87\x2f\x47\x3a\xcf\xd3\xcc\x3a\xe1\xbf\x96" + "\xd3\xf5\x27\xdf\xf4\xee\xbb\xfe\x47\xa4\x70\xc7\xf5\x27\xc3\x29" + "\x43\xaa\x86\xd2\x56\x36\x21\x38\x16\xfa\x77\xae\xb1\x06\x65\x22" + "\x2e\x9c\x21\xd3\xbd\xa9\xea\xbb\xed\x47\xa1\xfa\xc2\x89\x12\xea" + "\xc0\xfe\xb5\x9e\xcd\xef\x24\x0e\x63\x31\x9a\x48\x8f\xc1\xb0\xff" + "\x78\x79\x10\x70\xcc\xfa\x01\xc5\xad\x92\x6a\x6f\x24\x4e\xb2\x1d" + "\x33\x7a\x8e\x88\x05\x7f\xb1\x31\x5b\xa6\xd5\xe5\x87\x78\xe3\x3a" + "\xc7\xf6\xc7\xcc\xe5\x56\xc7\xc4\x6c\x59\x9a\xfd\x31\x5b\x76\x95" + "\x1b\x33\xbe\x3c\xc4\xb2\xd3\xe2\x63\xb6\xac\x90\xcd\x43\x2c\xd3" + "\xb0\x31\x5b\xee\x4b\x62\xb6\x2c\x91\xc4\xec\xc9\xea\x56\x49\xf5" + "\x3b\x96\xd9\x5c\xff\x8d\x7d\x53\xab\xc2\xd2\x97\xb3\x31\x5b\x51" + "\x0c\x31\x2b\xc0\xf5\x96\xed\x8f\xd9\x63\x97\x3a\x26\x66\x2b\x46" + "\xda\x1f\xb3\x15\x5b\xcd\x62\xc6\xe3\x97\x57\x48\xf8\x66\xe7\x8a" + "\x40\xd6\x2f\xaf\xc8\x63\x63\xb6\xa2\x8e\xc4\x6c\xc5\x30\x12\x33" + "\xa5\xae\x55\x52\x0d\x90\x15\xfb\x6d\xc7\x8c\x7e\xa7\x6f\xe5\x39" + "\x4b\x0e\xd2\xe5\x83\xc7\x04\xff\x68\x7f\xcc\x3c\xbf\xed\x98\x98" + "\x25\xd5\xdb\x1f\xb3\xe4\x19\xdc\x98\xf1\xf9\xba\xe4\xd1\xe2\x63" + "\x96\xec\xcc\xfa\xba\xe4\x49\x6c\xcc\x92\x0b\x48\xcc\x92\x34\x24" + "\x66\x83\x54\xad\x92\xea\x88\x24\xdb\xcc\x7f\x61\x1d\xda\xaa\xb0" + "\xf4\x39\x6c\xcc\x52\xdd\x20\x66\x05\xb8\xfe\xb4\xfd\x31\x7b\x6e" + "\x5d\xc7\xc4\x2c\xa5\xd0\xfe\x98\xa5\xba\x98\xc5\x8c\xc7\x7f\xa4" + "\x5c\x17\x1f\xb3\x94\x52\xd6\x7f\xa4\xe8\xd8\x98\xa5\x06\x90\x98" + "\xa5\xe4\x91\x98\xfd\xd7\xcc\x56\x49\xb5\x48\x52\xbd\x6d\xc7\x8c" + "\x7e\x07\x6b\xe5\x39\x4b\x53\xeb\xf2\x41\xb3\x83\x1e\xb7\x3f\x66" + "\x21\x2f\x75\x4c\xcc\xd2\x02\xed\x8f\x59\xda\x21\x6e\xcc\xf8\x74" + "\x72\x9a\x84\x3a\xd8\x69\x0b\x58\x9d\x9c\xb6\x9f\x8d\x59\x3a\x22" + "\x31\x4b\x9b\x44\x62\x36\x38\xad\x55\x52\x3d\x93\x34\xc1\xfa\x5f" + "\xd6\x74\xa3\x71\x5e\x3e\x1b\xb7\x8c\xc4\xae\xa3\x1d\x33\x5c\xed" + "\x8f\x5b\xc6\x62\xdb\xda\x31\x63\xb6\xf8\xb8\x65\x0c\x66\xb5\x63" + "\x46\x14\x1b\xb7\x8c\x52\x12\xb7\x0c\xe4\x98\x76\xcc\xb0\xb9\xfe" + "\x95\x4f\x3b\x5a\xc6\x6d\xa5\x6f\xd7\xd1\x8f\xef\xaa\xed\x8f\xdb" + "\x4a\x1f\xdb\xfa\x71\xa5\xa7\xf8\xb8\xbd\x5b\xcb\xea\xc7\x95\x4a" + "\x36\x6e\x2b\x63\x49\xdc\xde\x2d\x75\x4c\x3f\xae\x14\xac\xff\x66" + "\x4d\x3f\x5a\xc6\x6d\x55\x7d\xd7\xd1\x90\xab\x12\xed\x8f\xdb\xaa" + "\x8b\xb6\x35\xe4\xaa\x93\xe2\xe3\xb6\x2a\x8f\xd5\x90\xab\x6a\xd8" + "\xb8\xad\x56\x91\xb8\xad\x8a\x75\x4c\x43\xae\x6a\x94\xa2\x21\x2d" + "\xe3\xb6\xa6\xa8\xeb\xe8\xc8\x35\xbe\xf6\xc7\x6d\xcd\x66\xdb\x3a" + "\x72\x8d\x84\x6f\x16\xaf\x09\x60\x75\xe4\x9a\x1c\x36\x6e\x6b\x34" + "\x24\x6e\x6b\x54\x8e\xe9\xc8\x35\x36\xeb\x7f\xf0\xe9\x48\xcb\xb8" + "\xad\x0d\xea\x3a\x5a\x32\x53\x84\xfe\x5f\x6b\xae\xff\x79\xb4\xe4" + "\x5a\x09\xfa\x7f\xad\x33\xab\x25\xd7\x9a\xe8\xff\xb5\x8c\xfe\xcf" + "\xd4\x38\xa6\x25\xd7\xda\xa1\xff\x2d\xb5\xa4\x65\xdc\xde\xf3\xe8" + "\x3a\x7a\x72\x5d\x91\xfd\x71\x7b\xaf\xbb\x6d\x3d\xb9\x4e\xc2\x77" + "\xa0\xd6\x1d\x66\xf5\xe4\x7b\x88\x8d\xdb\x7b\x81\x24\x6e\xeb\x0a" + "\x1c\xd3\x93\xef\x09\xd6\x7f\x34\xc6\x4d\xaf\x08\x2e\xa0\x78\xf2" + "\x90\x15\x51\x7e\x4c\x6d\xc2\x6c\x8d\xde\x2b\xb8\x40\xec\xf7\x5d" + "\x8c\x35\xa7\x4f\x46\x21\x74\xc9\x29\x7b\x99\x63\x75\xa7\xb3\x7d" + "\x1c\xaf\x3b\x9d\x75\xa7\xfd\xbe\xef\x92\x75\x5e\x7c\xdd\xe9\xac" + "\x5d\xac\x06\xcd\x6a\x60\x63\xbd\x9e\x9e\x9f\x20\xae\x1e\x75\xd6" + "\x02\xc7\xea\x51\x67\x2f\x26\xf8\xca\x1a\x46\xea\x51\x67\x47\x75" + "\xce\x77\x5f\xde\xab\xc1\xf5\xa8\xa9\xf5\x43\xf6\x48\xab\x8f\x9c" + "\xdd\x60\x1b\xcf\x21\xde\x14\x4f\x8e\x96\xc5\x73\xce\x7e\xbd\x57" + "\x88\xb7\xd8\xef\xcc\x70\xf1\x9c\x33\xd9\x31\x3c\x6f\x68\x76\x1c" + "\xcf\x1b\x4e\xb4\xdf\x77\x66\x36\x94\x88\xc7\xf3\x86\x44\x56\x9b" + "\x6f\x38\xcc\xe2\x39\x47\x2b\x1e\xcf\x1b\x5e\x74\x0c\xcf\x39\xe3" + "\x09\x9e\xd7\xeb\x08\x9e\x73\xfc\x3a\xe7\xfb\x33\xeb\x77\x11\x3c" + "\xff\xbe\x51\x5a\xfd\xe9\x9c\xc3\x76\xe0\xb9\x80\xe2\xc9\x5f\xb3" + "\x78\xde\x98\x06\x78\x2e\x10\xfb\xbd\x1b\x2e\x9e\x37\xf6\x71\x0c" + "\xcf\xef\x9f\x74\x1c\xcf\xef\xe7\xb7\xdf\xf7\x6e\xde\x4f\x16\x8f" + "\xe7\xf7\x27\xb1\x9e\xe5\xfd\x2c\x16\xcf\x1b\xd5\xe2\xf1\xfc\xbe" + "\x9b\x63\x78\xde\xe8\x49\xf0\x9c\x5b\x4e\xf0\xbc\xd1\xb5\x73\xbe" + "\x83\x93\x9b\x48\xf0\x3c\xf4\x45\x69\xf5\xbd\x37\x0a\xd6\x3f\x66" + "\xf1\x1c\xea\x4d\xf1\xe4\xf6\x59\x3c\x6f\x0a\xd4\x7b\x85\x7a\x8b" + "\xfd\xee\x0e\x17\xcf\xf9\x0e\x7e\xe7\x22\xbf\x1d\xbe\x73\x91\xef" + "\xc0\x77\x2e\xcc\xbf\xbb\x93\x3f\x55\x3c\x9e\xf3\xbd\x59\x2f\x97" + "\x1f\xca\xe2\x79\x53\x8e\x78\x3c\xe7\xd5\x3a\x86\xe7\x7c\xe6\xfb" + "\x17\x79\x85\x04\xcf\xf9\x35\x9d\xf3\x3d\x9e\xbc\x49\x04\xcf\xc3" + "\x56\x4a\xab\x9f\xbe\x29\xd4\x0e\x3c\x17\x50\x3c\xef\x3d\x58\x3c" + "\x6f\x56\x02\x9e\x0b\xc4\x7e\xff\x87\x8b\xe7\x82\x43\x8e\xe1\xb9" + "\x20\xda\x71\x3c\x17\x8c\x6a\xbf\xef\xff\x14\xf4\x17\x8f\xe7\xbf" + "\xd5\xb3\x1e\xb7\xc0\xe4\xfd\xff\xe6\x70\xf1\x78\xfe\x9b\x83\xdf" + "\x05\x2a\x38\x40\xf0\xfc\x37\xe6\xbb\x40\x05\xbb\x3a\xe7\xbb\x40" + "\x7f\xf3\x26\x78\x7e\xa6\x5c\x5a\x7d\xfa\xcd\xc3\x6c\xe3\x39\xcc" + "\x9b\xe2\x79\x27\xc4\xe2\xf9\x03\xad\xde\x2b\xcc\x5b\xec\x77\x88" + "\xb8\x78\xfe\x60\xad\x63\x78\xfe\x60\xb4\xe3\x78\xfe\xc0\xa5\xfd" + "\xbe\x43\xb4\xe5\xba\x78\x3c\x6f\x31\xbe\xff\x03\x7e\xde\x62\xf2" + "\xfe\xaf\x50\xc2\xf7\x89\xb6\x24\x39\x86\xe7\x0f\xd2\x09\x9e\xb7" + "\xbc\x48\xf0\xfc\x41\x62\xe7\x7c\x9f\x68\x73\x3d\xc1\xf3\x08\x85" + "\xb4\xfa\xff\x1f\xd8\x9c\xff\xc1\x97\xdf\x30\xe6\xa5\x58\x4c\x6f" + "\x3b\xee\x78\x8e\x63\x5b\x98\x63\x98\xde\xd6\xc3\x71\x4c\x6f\x3d" + "\xd7\x7e\x39\x8e\xad\x12\xbe\xf5\xb7\x35\x8b\xcd\x71\x6c\xad\x66" + "\x31\xbd\xdd\x59\x3c\xa6\xb7\x06\x3a\x86\xe9\x6d\xb3\x08\xa6\xb7" + "\x7a\x10\x4c\x6f\x0b\xe8\x9c\x1c\x47\xe1\x61\xc7\x72\x1c\xdb\xaa" + "\xa5\xe4\x38\x2c\x31\xbd\xa3\xc0\xf1\x3c\xc7\x8e\x11\x8e\x61\xba" + "\xe8\xa2\xe3\x98\x2e\x2a\x69\xbf\x3c\x47\x51\xbe\x78\x4c\x17\x85" + "\xb3\x79\x8e\xa2\x62\x16\xd3\x3b\x6a\xc4\x63\xba\x68\xb0\x63\x98" + "\xde\xe1\x43\x30\xbd\xbd\x8e\x60\x7a\x87\xb2\x73\xf2\x1c\xdb\x73" + "\x1c\xcb\x73\xec\x28\x96\x92\xe7\xb0\xc4\x74\xf1\x02\xc7\x73\x1d" + "\xc5\x2e\x8e\x61\xfa\xa3\x2f\x1c\xc7\xf4\x47\xe9\xed\x97\xeb\xf8" + "\x28\x5a\x3c\xa6\x3f\x1a\xc9\xe6\x3a\x3e\x4a\x64\x31\x5d\xbc\x47" + "\x3c\xa6\x3f\x6c\x72\x0c\xd3\x1f\xe9\x09\xa6\x3f\x2c\x25\x98\xfe" + "\xa8\xb1\x73\x72\x1d\x1f\x46\x38\x96\xeb\x28\x4e\x94\x92\xeb\xb0" + "\xc4\xf4\xdf\xfd\x1d\xcf\x77\x7c\x7c\xce\x31\x4c\x7f\xbc\xd6\x71" + "\x4c\x7f\x3c\xab\xfd\xf2\x1d\x1f\x8f\x15\x8f\xe9\x8f\x4d\xbe\x7f" + "\xf1\xb1\xc9\xfa\xff\xbf\xa7\x89\xc7\xf4\xce\x72\xc7\x30\xfd\xf1" + "\x69\x82\xe9\x9d\x59\x04\xd3\x1f\x97\x75\x4e\xbe\x63\xa7\x9f\x63" + "\xf9\x8e\xbf\xdb\xac\x7f\xc1\x97\xef\xb0\xc4\xf4\x27\x0a\xc7\x73" + "\x1e\xbb\x4b\x1c\xc3\xf4\xee\x30\xc7\x31\xbd\xdb\xa7\xfd\x72\x1e" + "\xbb\x3d\xc5\x63\x7a\x57\x2d\x9b\xf3\xd8\x6d\x32\xff\xe9\x93\x99" + "\xe2\x31\xbd\xab\xc8\x31\x4c\xef\xde\x49\x30\xbd\x2b\x9c\x60\x7a" + "\x77\x61\xe7\xe4\x3c\x76\xb9\x39\x96\xf3\xf8\x44\x29\x25\xe7\x61" + "\x89\xe9\x3d\xf5\x8e\xe7\x3d\xf6\xa4\x3b\x86\xe9\x3d\x23\x1c\xc7" + "\xf4\xa7\xfa\xf6\xcb\x7b\x7c\x7a\x59\x3c\xa6\x3f\xdd\xcf\xe6\x3d" + "\x3e\x35\xa9\x7f\x5f\xa2\x12\x8f\xe9\x4f\xe3\x1d\xc3\xf4\x9e\x65" + "\x04\xd3\x9f\x8e\x24\x98\xde\x13\xdb\x39\x79\x8f\x4f\x34\x8e\xe5" + "\x3d\xf6\x58\xcc\x7f\x5b\x12\xb9\x30\x42\xb9\x68\xfe\xfc\x25\x91" + "\xf1\xca\x25\x0b\xa2\xe7\x45\x8e\x1d\x62\xfc\x7d\xac\x6f\xe2\x90" + "\xc4\x47\x51\x44\xcc\xdc\x37\x13\xfe\xc0\xee\x5c\x10\xb9\x10\xfe" + "\x79\x14\x45\xcd\x5d\x12\xa5\x8c\x5f\x16\x1b\xa9\xc4\xbf\xc5\xcc" + "\x8b\x85\x43\x16\xc5\xb3\x5b\x5e\x8f\x5c\x30\x37\x31\x7a\xe1\x5f" + "\x94\x73\x17\x44\xff\x65\x61\x4c\xe4\xc2\x78\x65\x5c\xe4\xe2\xa5" + "\xd1\x71\x91\xf8\xff\x4b\x94\xf3\x17\xc5\xc1\x86\x79\x91\xd1\x09" + "\x91\xca\xb7\x96\xce\x9f\x1f\x19\xb7\xe4\x51\x34\x75\xe9\x82\xf8" + "\xe8\xd8\x05\x91\xca\x09\x53\xc7\x0f\x9f\x39\xf1\x4f\x33\xc7\x8d" + "\x7b\x14\x99\x7c\x7b\x5a\x49\xe5\x25\x17\x01\x86\x9c\xaf\x38\x1d" + "\xda\x5a\xe9\x8d\x50\x36\x60\x73\x43\x1c\xf2\x58\x1b\x87\x9c\x33" + "\x6f\x21\xd7\xec\x5b\xc8\x4d\xf9\x36\xf2\xa7\x3c\x0b\x7c\x37\xdc" + "\x42\x0a\xaa\xf7\x40\x6f\x2a\xb7\x1a\x7e\xaf\x4e\xd3\x7a\x1e\xc2" + "\xdb\x3c\xa8\xdc\xd2\x28\xbc\x0f\x62\xe1\x0c\xfb\xea\x2f\x39\x1d" + "\x0a\xd5\x7a\x7e\xe9\x91\x7a\x15\xc9\xa9\x9e\x7b\x67\xee\x35\x68" + "\xe5\xc7\xf0\x97\x4a\xa0\xaf\x90\xd3\xbe\x05\xf0\x13\x84\x9c\xfe" + "\x5f\x7b\xdf\x03\x10\x55\x95\xf6\x7d\xe6\xce\x55\xc9\x90\x19\x0d" + "\x5c\x2a\xb3\xd1\xc5\x1a\xff\x8f\x86\x85\x46\x46\x6e\x6d\xa4\xa6" + "\xee\xfb\x9a\x2f\x29\x98\xb6\xe6\x62\xa1\x12\xa2\xa2\x22\x20\xeb" + "\xf6\x69\x29\x0c\x04\xbc\xb4\x22\xd0\xae\xed\x67\xef\x5a\x62\x4b" + "\x86\xbb\x54\x53\xe2\x2e\x19\x3a\xd4\xda\xbe\xb4\xab\xeb\xc8\x92" + "\x4b\x84\x3a\xc9\x28\x03\xcc\xcc\xf9\x9e\xe7\x9c\x7b\x99\x3b\xc3" + "\x8c\x02\xa2\xdb\xe7\x76\xf5\x30\xf7\x9e\xfb\x9c\xe7\x3c\xe7\x3c" + "\xbf\xf3\x3b\x7f\xee\xbf\xb2\x00\x08\xa1\x10\x96\x40\xd8\x06\xc1" + "\x08\xc1\x41\xd4\x07\x1e\x85\x90\x0c\x01\xe2\x0e\x14\x41\xd8\x0b" + "\xa1\x8c\xa8\xdf\x19\x06\x21\x12\xc2\x6c\x08\xcb\xb8\x9e\x77\x30" + "\x34\x13\xf5\xef\xc2\x21\xc4\x13\x75\x39\xc4\x97\x83\x9e\x77\x41" + "\xae\x1c\xd2\x94\xd7\x40\x38\x01\xc1\x0e\x71\x98\x3e\x91\x9f\x7b" + "\xb7\x91\xa8\x0f\x86\x41\x80\xbc\x0e\x42\xfe\x07\xf3\x20\x40\x3e" + "\x07\xcb\x21\x54\x42\xb0\x40\x40\x19\xb0\xe7\x3d\x48\xf3\x5e\x0a" + "\x04\xb0\xe5\x3d\x1b\x51\x57\x80\xed\x15\xfb\x08\x94\x91\x87\x0a" + "\x88\x3b\x14\xe1\x3e\x3e\x34\x5f\xb1\xef\x2b\x24\x6b\xb6\xdc\x6d" + "\x31\x8d\x71\x40\xbb\xdd\xff\x89\x33\x93\xa8\x9d\x39\xbf\xd7\x26" + "\x8e\x21\xaa\x26\xf5\xfe\x7c\xf3\x56\x42\xa8\xb6\x36\xca\xb4\xb1" + "\x1d\xcf\xe7\x63\x9d\xb5\x66\xed\xcf\xb3\x90\x57\xb7\x61\xfb\xec" + "\x19\x3e\xf7\xe7\x49\xe9\x4f\x58\x54\xe3\xaa\x31\x3d\xcd\x8d\xad" + "\xa1\xe9\x31\xbb\xf0\x39\xdc\xb3\x58\x87\xd8\x6e\x8c\xb1\x61\x54" + "\xbb\xa0\x12\x39\xc6\xb4\x91\xd9\xb5\x12\xda\x5b\x10\xa4\x4f\xa0" + "\xe0\x47\x6b\x08\xf8\x3c\x93\x88\xec\x38\xe7\x90\x81\x96\x6e\xdb" + "\xc6\x79\xa7\x8c\xcd\x5f\xda\x42\x5e\xac\xc5\x73\xf6\x37\x66\x66" + "\xd0\x3d\x71\xa1\xa6\x55\xed\xa4\x41\x5d\xf6\x34\xf0\x9f\x40\xef" + "\x99\x99\xe1\x2a\x78\xb1\xb6\x02\x30\x80\x32\x87\xd2\x1a\xf1\x37" + "\x1e\xca\x2d\xd0\xbc\xa4\x42\x5c\x03\x32\xa5\xe5\x02\x27\xef\x5f" + "\xd9\x16\xb2\x2d\x51\x37\x53\x43\xeb\x25\xbb\x2c\xea\x32\x02\x76" + "\xb0\x74\x6d\x21\x23\x74\xa8\xdb\x59\xba\xdd\x00\x71\x22\x05\xec" + "\x81\x0d\xaa\xf3\x90\xce\x99\x3f\x22\xd4\x34\x93\xe5\x79\x09\xec" + "\x14\xd2\x9f\x00\xdd\xbf\xda\x6e\xd8\xbf\xd1\x2e\x50\xb4\x3d\x78" + "\x44\x28\x60\x3d\xd0\x99\xf5\x56\xf8\x6b\x43\x88\xb8\x3b\x97\x90" + "\x92\x21\x24\xa0\x35\xab\xac\xd9\x22\x3e\x5c\xc3\x79\x6f\x7f\x82" + "\x00\x32\x90\x67\x35\x05\x7f\xb0\xbc\xf2\x56\x6a\xfd\xe7\x75\xe0" + "\xa1\xce\xbc\x0a\x56\x6a\x31\x2f\x56\x3f\xbc\xae\xf8\xbe\xac\x67" + "\xcf\xac\x2b\xd8\x7c\x60\x2a\xea\xb0\xa8\x0f\x8c\xa3\xbf\x99\x65" + "\x70\x16\x24\x1b\xf0\x1c\xca\xf3\xfa\x3f\x64\xd0\x6c\x21\x36\x0a" + "\x71\x4e\xc9\x07\x4e\xf4\x81\x90\x01\xfc\x55\x16\x88\xf9\x41\xda" + "\x14\x67\xa6\x0e\x70\x13\x97\xc7\xfd\x7a\xe0\x48\x4a\x35\x75\x41" + "\x70\x4e\xac\x26\x2a\xd3\x4c\xf4\xe9\x81\x06\xdd\x8f\x07\x40\xdd" + "\x1e\xf8\x8a\xd7\x2d\xd4\xe9\x88\xed\x7a\xa8\x17\x2d\xd4\x45\x20" + "\x7d\x69\x54\x1d\xd3\x01\xf5\x8d\x75\x54\x02\x75\x04\xf5\x14\x80" + "\xfe\x6f\xcd\x7a\x27\xd8\xab\x9e\x30\x4e\x6f\x51\xdd\xa3\xc5\x38" + "\xdd\x48\xc2\x31\xa3\x28\x37\xfa\xd7\x99\xbf\xb9\x14\x8f\x9f\x1a" + "\x4d\xb4\x9a\x6a\x22\xe8\xd2\xc2\x2a\xb8\x9f\x93\x0a\xdd\xbe\x3d" + "\xb0\x83\x16\x2c\x6e\x04\x79\xbd\x1b\x57\xef\xec\x71\xe6\xc4\xed" + "\x68\x0b\x59\x33\xcf\x9e\x9f\xa0\xa5\xc6\xb8\x1d\xf8\x5c\x79\xbd" + "\xfa\x1d\xf6\xac\x1d\xcd\x0c\x20\x3c\x9f\x38\x63\x5a\x02\xb5\xa6" + "\x7d\x0b\x3e\x18\xba\x66\xde\xa1\x75\x56\xf0\x45\x82\x16\x7d\x5d" + "\x71\xd9\x2e\xe0\xbb\xfe\x68\xd0\x5b\x0b\x8a\xb9\xcf\x03\xa0\x9c" + "\x04\xf5\x82\xed\x0d\xee\xf2\xbc\xb3\x0d\xfd\x0e\x79\xec\xe1\x79" + "\x83\x5e\x01\xf2\x18\x1c\xb7\xa7\x35\xeb\x77\x81\x16\xd5\xe7\xac" + "\x5f\xa4\xeb\xe8\x89\xec\x76\x42\x5a\xd6\x51\xc7\x5c\xc7\x69\x17" + "\xf4\xb7\x04\xce\x8f\xb3\x90\x1f\xed\x95\xeb\x85\xb7\xa5\x4e\x3d" + "\xec\x1d\x10\x56\xae\x67\xbe\x2f\x3d\x16\xf5\xef\x86\x3d\xe3\xd0" + "\xa9\xda\x2f\xd3\xda\xec\x05\x60\x5b\x26\xa1\xed\xeb\x68\xcd\xe6" + "\x68\x6a\xcf\xfa\x9c\xc0\x98\xe7\x24\x01\x0e\x1d\x16\xa4\xa2\xd6" + "\xb9\x1b\x88\x26\x28\x51\x43\x3f\xa9\x3e\x49\x36\x45\xd3\x46\x73" + "\x8a\x93\x1c\xb7\x35\x90\xd4\x2f\x49\x60\xfa\x31\x12\x9c\x1a\x4d" + "\xad\x35\x4b\x4e\x12\x1e\x7f\x8c\xa4\x9f\x21\xe2\xa6\x2a\x6a\x9f" + "\x03\xfd\xef\xa7\x27\x31\xbe\x01\xe2\x9d\x24\xbd\x91\x3a\xd2\xe2" + "\x48\x20\xee\x1f\xab\xc2\xf8\xaf\x70\x9c\x22\xce\x4d\xb1\x6a\x8a" + "\x21\x4f\x4c\x5f\x02\xb6\xb8\x2e\xd3\xca\xec\xcb\x84\x6c\x7a\x9a" + "\x84\xa6\x2e\x25\x30\x26\x23\xd4\xec\x78\x97\xcc\x75\x52\xe8\xdf" + "\x8f\x90\xcd\x2b\x48\xc0\x5c\x07\x3e\x17\xfe\x05\x84\xdd\xa4\x04" + "\x64\xa1\x6c\x26\x2c\xdb\xa6\x53\x30\xde\x39\x27\xa7\x79\x5f\x4a" + "\x73\x8a\x60\x9d\xb5\x0d\xae\x4d\xb4\xe7\xd4\x5a\xa1\xec\x3a\xac" + "\x03\xc8\xa7\xd6\x85\xe9\x2e\xb3\x7e\x07\xeb\x40\xf5\x8c\x03\xda" + "\x6a\xfe\xf3\xd6\x67\x52\x4c\x4c\xaf\x45\x5d\x1e\x5b\x92\xc4\x6c" + "\xf2\x90\x9d\xeb\xa0\x2d\xd6\x90\xe7\x41\x57\xf9\xd6\xb9\x29\x0f" + "\x53\xc0\x9f\x0a\x30\x51\xda\x9a\x55\x5e\x25\xd7\xb7\xa5\x93\x4b" + "\xca\x2b\xc0\x17\xa5\xea\x44\x22\xc2\xf9\x06\x8b\xea\x8b\x08\x05" + "\x76\x91\x8f\xfa\xcb\xb2\x5c\xe6\xdd\x00\x8b\xea\xcf\x19\x6e\x19" + "\x86\xd7\x4e\x19\x38\x0f\xf8\x3f\xb1\xcd\x7d\xfe\x40\x24\x55\xe8" + "\x90\xfa\x55\x59\xb7\x1a\xf8\xd5\xe8\x0c\x49\x2a\x85\xf6\x5a\x46" + "\x5b\x42\x03\xa9\x00\xbe\x71\x50\xbb\x2b\x3f\xce\x0a\x7d\x67\xa0" + "\xd9\x61\x23\x5c\xfe\xdd\x63\xd0\xd6\x2b\xf8\xbd\xac\xef\xbe\x8b" + "\x3a\x61\x8c\x35\x0f\xfa\x61\xed\xdc\x6a\x6a\x47\x5e\x70\xe6\x8f" + "\x31\x64\x25\x41\x5f\x9c\x9f\x64\x74\x85\xac\x2c\xb5\xbf\xbe\x2d" + "\x03\xb9\x9e\x86\x6c\x2e\xa5\x79\x90\x56\xd2\x03\xf9\xf6\xb3\xa8" + "\xdf\xdd\xe1\x84\xf4\x34\x2f\xce\xca\xe3\x39\x6f\x71\x7e\x79\x77" + "\x07\x1d\x05\xe7\x8c\x0b\xf2\xe0\x5c\xbf\x7a\xf5\x41\xe4\x1d\x02" + "\xc7\x35\xa6\xb4\x8b\x20\x7b\xf0\x2e\x8e\xe9\x05\x46\x8f\x63\x01" + "\xeb\xf3\x80\x11\xb9\x47\x37\x13\x75\x1e\x7c\xc8\xcd\x33\x4a\xce" + "\x5e\x0c\x6d\xe4\xe0\x3c\x8b\xca\xf0\x28\xc3\x3e\xa4\xb3\x31\xbe" + "\x02\xde\x1a\xb1\x6d\xdb\xe1\x68\x42\x0e\x57\x61\x3b\x3a\x98\x6c" + "\x51\x4d\x8e\x71\xd7\xe5\xc1\x9d\x28\xcb\x38\x04\x39\x54\xe0\x7c" + "\x85\x69\x68\xc1\x9a\x28\xe4\x41\xe4\x43\x8b\xfa\xe0\x36\xe4\x42" + "\xe0\x93\xbd\xbc\xff\x99\x15\xc0\xf8\x24\x37\x67\x1e\xd8\x95\x51" + "\x2f\xd9\xa2\xb4\x4d\xe6\x3e\x9a\x93\x53\xcb\x65\xe3\xf6\x42\xfe" + "\x36\x8b\xea\x3e\x83\x12\x2f\xbc\x5c\xef\x3d\x0d\x98\xae\x9b\x58" + "\x05\xc7\x30\x46\x02\x7d\x19\x34\xeb\xad\x55\xc0\x2f\x01\x88\x53" + "\xe4\xc8\xc2\x5c\x22\xda\x73\x72\x2c\xce\x9c\x9c\xba\xd6\xac\xf7" + "\x22\x65\x5e\xc1\x74\xd8\x16\x80\x5b\x02\x18\x67\x38\x1d\x6a\xd6" + "\xde\x9d\x64\x5c\x27\x8f\x40\x5c\xdb\xe0\x9c\x3a\x29\x5e\x64\xf6" + "\x64\xaa\x5d\x90\xb7\x4a\xb6\xbd\x6d\x70\x5c\x21\xe8\xcd\xb3\xa8" + "\x74\x91\x1e\x3c\x93\xfb\x9f\x06\x4a\x63\x10\x33\x6a\xb0\xf3\x10" + "\xfc\x0e\x90\x30\x78\xeb\xe1\x6a\x42\x1e\x7d\x0c\xf2\x00\x5f\xbe" + "\x36\x94\xc2\xf8\xfe\xbd\x13\x16\xf2\xe2\x6c\x4c\xbf\x1d\x8e\x31" + "\x1e\x65\x20\xbe\xd9\x42\x92\x24\xbd\x07\x8c\xe8\x1b\x4f\xbd\x15" + "\x83\xb9\x5e\x66\xcb\xad\xa8\x13\xd3\xa1\xce\xdd\x05\xb4\x19\xf5" + "\xb4\x66\x55\x18\x64\xdd\x3b\x21\x4e\xd6\xff\xe8\x4a\x39\x8f\x8a" + "\x79\x70\xbe\x4a\x69\x7b\x61\x01\xb5\x71\xbb\x2a\x12\x2c\xe4\x25" + "\x56\xef\xdb\x20\x0e\xd3\x72\xff\x57\x6c\x47\x6c\x58\x78\x79\xd4" + "\x1c\x23\x15\x85\x16\xb2\xb5\x42\xd9\xdf\x80\x0f\x06\xf1\xfe\xf0" + "\xf7\x5a\x49\x5f\xa5\xac\xcf\xad\x8b\xeb\xa0\xc6\xdc\x5a\x45\x7b" + "\x0c\x44\xfd\x20\x0f\xe5\x4f\x0e\x94\xca\x9f\x6a\xe3\x78\x86\xba" + "\x3f\x34\x18\xeb\x1e\xfb\x3e\xf4\x33\xcb\xe3\xf5\x6d\xdb\xd0\xef" + "\xe0\xff\x54\xb9\x7f\x04\xdf\xe4\xb5\x66\x1d\x32\xb8\xfb\x92\x43" + "\x22\xfa\x1b\xe2\xb7\x72\xfd\x87\x66\x5b\x54\x77\x3b\x3c\x79\xe8" + "\x40\x29\x1d\x9a\x64\x42\xae\x92\xec\xc9\xc7\xfe\x52\x3e\x0f\x79" + "\x88\x30\x4e\xc9\x42\xcc\xe3\x38\x85\x86\xbc\x90\x01\x7a\xf2\xbc" + "\xfa\x5f\x51\x92\x3b\x8c\x32\xaf\x0e\xa5\x8d\x20\x53\x21\xcb\xe0" + "\x79\xf0\xc1\x74\x88\xab\xb1\x90\x9c\x4a\x8c\xcb\x02\x19\x98\xdb" + "\xf9\x7d\x5e\x27\x6d\x04\x11\xcc\x45\x16\x9c\xcb\x62\xfb\x8e\x34" + "\x0f\xb3\x11\x73\x91\x8b\xb8\x7e\x33\xab\x2c\x2a\x8d\x9a\xce\xaa" + "\x7f\xff\xc4\x71\x7b\x23\xe9\xd9\xf8\xf3\xf7\xec\xfd\x87\xb4\x1d" + "\xe6\x5c\xa9\x93\x09\x8e\x4d\xce\xab\xff\xb0\xc1\x6c\xbd\xc8\xb8" + "\x0e\xf6\x9f\xc3\xf3\xaf\xc2\x1c\x0d\xe7\x69\x30\x17\x8f\x37\x0a" + "\x7c\xae\xe6\x02\xd9\x62\x8c\xc7\x79\x1c\xf4\x61\x25\x8a\x73\xf4" + "\x37\x33\x0d\xbc\xee\xfe\x30\x89\x71\x3e\xda\xeb\x78\xdc\x84\x36" + "\xbb\xf6\xcc\x34\x60\x19\xd2\x53\xa8\xcb\xec\x68\x35\x61\x3f\xa7" + "\x5b\x87\x73\xcc\x3f\x0c\x9a\xbb\x9b\x50\xd7\x1b\x33\x0d\x3d\x2c" + "\x03\xbb\xbe\x04\xf3\xf0\xf3\xd6\x51\x33\x0d\xe9\x4e\x22\x64\xa7" + "\xf5\x0b\xf8\x51\x11\x35\xb5\xdc\x33\xab\xac\x35\xeb\x0f\x86\x8f" + "\x52\x08\xe9\xf9\xd8\xfc\x0f\x06\xb9\xec\xc5\x52\xd9\x21\x2f\x76" + "\x4f\xd8\xc4\xc2\x0c\x56\x5e\x90\x89\xf7\xe7\x2f\x9a\xa9\xa1\x87" + "\x8b\x1c\x64\x4d\x11\x6d\x5f\xb3\x1b\x78\xb2\xe0\x99\xc4\xfd\xc5" + "\x75\xc8\xeb\x51\x72\x7d\xb2\xba\x73\x58\x49\x62\x1a\xd1\x36\xa9" + "\x2b\x07\xcf\x4d\xcd\x60\xdf\x6c\xfa\x10\xe4\x7a\x68\x2b\x5b\xff" + "\x3a\x0e\xf3\xfa\xb9\x8e\x74\xca\xfb\xa6\xca\xa9\x73\x24\x7d\x78" + "\x4e\xf6\x5f\xb1\x34\xdf\xee\x79\x1e\x95\x51\xbd\x28\xab\xd6\x4f" + "\x59\x9d\xbd\x2f\x6b\x65\x75\xd7\xb2\xbe\x3f\xaa\x6f\xcb\xfa\xbe" + "\xdf\xfb\x7f\xae\x50\x56\x9d\xef\xb2\xbe\xff\x75\xef\xcb\xfa\x7e" + "\x79\xd7\xb2\x7e\x30\xb8\x6f\xcb\xfa\x81\xdf\xe7\xdf\xaf\x50\x56" + "\x83\xef\xb2\x7e\xf0\x45\xef\xcb\xfa\x41\xa9\x8f\xb2\x3a\xfb\xb6" + "\xac\x1f\x8a\x7e\xcb\x2a\x68\x28\xf2\x13\xf0\x52\x7b\x5a\x1b\x8c" + "\xe9\x0a\xd6\x46\x6d\x7e\x9d\x08\x35\x36\x3b\x39\x3e\xac\x8e\xa4" + "\x6f\x20\xc2\x84\x44\xe0\xbd\x4c\x12\x49\x0b\x46\x18\x8e\x17\x35" + "\x43\xfc\x59\x72\x2c\xc5\x4e\xa2\x92\x90\x7f\x3f\xfc\xc4\xbc\xac" + "\xa7\xfc\xfb\x61\x5e\x27\xff\x3a\x26\x4b\x9c\x6b\xba\x74\xbc\xb9" + "\x9d\x60\xf9\x61\xff\x4c\x27\xff\x66\xf2\xfa\xf6\xe6\x5f\xac\x0f" + "\xb3\xdd\xee\xc1\xbf\xfc\xb9\x2d\xd3\x5b\xde\xdc\x9b\xd5\x44\x88" + "\x6f\xee\x35\x6d\x47\xee\x2d\x86\xf3\x3d\xb3\xdf\x34\x5f\xe6\x5e" + "\x23\xe4\xa9\xe4\xde\xc3\xcb\xb0\x7f\x35\xed\xeb\x1d\xf7\x9a\xf6" + "\xc9\xe5\xde\x2d\x95\x1b\xe2\xb4\x9e\xdc\x6b\x6a\xe8\x0e\x6e\x69" + "\xc1\xc2\x79\xfb\x87\xdb\xfb\xb9\xf6\xcc\x4e\xc4\xfe\xad\x15\xea" + "\xe4\xbd\x62\xbb\x78\x56\xfd\x11\xff\x56\x41\xeb\x32\x15\xdd\x33" + "\x2b\x74\x6e\x32\x3d\x4d\x47\xcd\x4e\xc4\xb5\x53\x5c\x03\x80\xf3" + "\xaf\xd1\x37\x66\x85\xf6\xcc\x6e\xae\x93\xfe\xe6\x89\xb2\x34\x68" + "\x2f\xfb\xd7\xd9\x05\xd7\xa6\x18\x0d\xf8\x41\x4b\xf3\x17\x1b\xe9" + "\x4b\x53\xf6\xb6\xe4\x27\x93\x23\xfa\xaf\x08\xca\xd2\x2d\x62\x54" + "\xef\xed\xff\x38\xec\xca\xf6\x7f\xfc\x74\xcf\xed\xe7\x3a\xbb\x67" + "\xff\xc7\x61\xdd\xb2\x7f\x28\xd8\xdf\x1e\xd1\x0f\xe6\x8c\xc2\x87" + "\xed\x11\x62\x0f\xed\x29\xef\x96\x8f\xaf\x29\x8f\xc3\xdd\xe6\x3f" + "\x3a\xf4\x05\xe3\xfe\x62\xab\x00\x1c\xc0\xfa\x70\x6c\x7b\x9c\xff" + "\x1a\x81\xb3\x4e\x53\xce\x49\xd6\x1e\x72\xd2\x61\xbf\xdf\x7f\xef" + "\x9a\xff\x33\xd6\xbe\xcf\xbf\xca\x7f\xf9\xbd\x39\xf1\xed\x38\xa3" + "\x7f\x4e\x5c\x6c\xed\xca\x89\x55\xa7\x7a\xce\x89\x55\x7b\xbb\x72" + "\xe2\x1f\x6f\x71\x73\xe2\x91\x4b\xbd\xe7\xc4\x23\x1f\x75\x9f\x13" + "\x8f\xec\xee\x1d\x27\x1e\x89\xbf\x32\x27\x1e\x31\xf5\x8e\x13\x8f" + "\x98\xba\x72\xe2\x91\x30\x4f\x4e\x3c\x62\xf7\xeb\x4b\xe3\x0c\x3b" + "\xf4\xd1\x81\x4d\xea\x3f\x56\x3b\x32\x09\x71\x19\x3f\xd0\xcf\x75" + "\xd2\x56\x9a\x33\xc3\xee\x12\xc2\x91\x57\xa2\x5a\x5b\xe3\x03\x5c" + "\xeb\xf5\x81\x74\xc8\x82\x69\xb4\x23\x14\xe7\x94\x61\x60\xbf\x86" + "\xb6\xea\x83\xe8\x7a\xfd\x90\xa2\xcb\x24\x18\x42\x68\x91\xd4\x1f" + "\xc3\xbe\x81\xae\x0f\x1d\x98\xb5\x8e\x8c\xd3\xd8\x48\x00\xd8\x10" + "\xa3\xd9\xa2\x25\xc0\x41\xc1\xb8\x4f\x33\x3f\x76\x94\x5c\x26\xa2" + "\x26\x05\x7c\x33\x18\xf2\x4b\xd1\x50\xba\x46\x4f\x4a\x92\x48\x80" + "\x4b\x20\xa1\xc5\x02\x2d\x73\xb4\xea\x05\x67\x70\x52\x19\xf7\xcf" + "\x9f\x52\xd9\xdc\x2b\x2f\x29\xd5\x35\x34\x69\x99\x33\x3d\x5e\x4d" + "\x37\xc5\xa8\xd1\x56\x67\x5e\xd2\x12\x5a\x00\x21\x3d\x3e\x08\xc7" + "\xd0\x25\xeb\x20\xef\xd6\xd0\x81\xd9\x90\x77\xf1\x3a\x12\xb6\xfb" + "\x32\xd1\xd3\x16\xbd\x00\xfe\x8f\xc1\x6f\x9f\x42\x1d\xc5\xb8\x84" + "\x8f\x1d\x70\x4e\x44\x4e\xa4\x98\xbf\x03\xf2\xef\xd0\xe3\x3a\x17" + "\x60\x9b\x84\x96\x40\xfe\xce\xf5\xfa\x1e\xb6\x97\x3f\xb1\xe7\x9f" + "\x64\xbb\x5c\xe3\x9e\x33\xd2\xb7\x21\xa0\x5d\x50\x87\x25\x58\x27" + "\x13\x9e\xcb\x43\xdb\x76\x5e\x26\xe3\xc0\xce\x30\xb0\x41\x0f\xf9" + "\xe2\x7b\x63\x62\x16\xbf\xa8\x45\x8c\x7a\xd8\xe6\xcc\x91\x6c\xbb" + "\x00\xb6\x9d\x77\xdb\x86\x79\x61\xfd\xf8\xbb\x26\x3b\x77\xf3\x70" + "\x6c\x9b\xff\xd4\xa4\x0c\x88\xc6\xeb\xb3\x2d\x9b\xe2\x7b\x88\xd5" + "\xea\x60\x7f\x78\xc9\x7e\x9b\x0c\xa3\xda\x8a\x98\x39\xbf\x38\x4d" + "\x71\x1d\xf1\x17\x6f\x93\x71\x66\x68\xd7\xc7\xed\xe7\x08\x1d\x5c" + "\x11\x73\x44\xdf\xdc\xd3\xbc\x32\xfc\xe5\xf5\x72\x26\xad\xed\x08" + "\xc3\x35\xb0\x35\xf6\x6c\x81\xa6\xb4\x87\xcd\xd2\x1d\x3d\xd1\x4e" + "\x9e\x49\xc1\x6b\xc0\x34\x45\xb7\x90\x04\xd4\xab\xcd\xe1\xe9\x5f" + "\xe2\xf5\xaa\x4f\x44\xcf\xeb\x55\x9f\xe8\x89\xfa\x68\x0d\x51\x7f" + "\xea\x20\xea\x63\x5b\x09\xc8\x79\x86\xe3\x95\x73\xdf\x1c\x4e\xd2" + "\x1c\xf4\x9f\x34\x6f\x64\x7c\x96\x40\xed\x73\x47\xab\x2c\xa6\x75" + "\x78\xfd\xe6\xe8\x11\xa8\xbf\x6f\xa0\x5f\xd5\xe0\x3e\xea\x4b\x4c" + "\x22\xb7\x35\xa9\x8f\x56\x69\x6c\x03\xa2\x1d\xc1\xc9\x3a\x07\x8d" + "\x21\x1d\xba\x6d\x19\x6d\x79\x49\xc6\x0e\x5c\xa3\x7b\x16\x39\xe8" + "\x93\xf7\x35\xaa\x0c\x42\xc1\xff\x94\x86\xe2\x35\xcc\x98\x22\x08" + "\xe8\x4b\xe6\xc7\x21\x8b\x6a\xd0\xdf\xd8\x16\x4a\x78\xbc\x16\xdb" + "\x43\xb6\xd4\x6e\xac\xea\x31\x4b\x9c\x02\x21\x4e\x48\x9f\xfe\x15" + "\x19\x86\xdf\xbc\xdd\x0d\x72\xcf\x38\x03\xb0\x1d\xc7\x98\x16\x7e" + "\x4e\xce\x26\x12\x21\xfd\x5b\x32\x08\x30\xc1\xda\xa3\x0b\xda\xe3" + "\xdc\x93\x1a\x3b\xf0\x8a\x2b\xed\x12\xd1\x20\x4f\xe1\xf7\x63\xcc" + "\xcd\x16\xe2\xba\xa0\x0f\xda\xb5\x8a\x04\x3b\x2e\xc4\x0f\xb1\x5e" + "\x88\xbf\xed\x35\x17\x09\x0e\x4a\x24\xda\xdd\xab\x00\x8b\xab\xa1" + "\x7d\x9e\x87\xf6\xd9\xcc\xdb\xa7\x8c\x3f\xfa\xb2\x35\x19\x9f\xeb" + "\x67\x6d\x33\x47\x6a\x9b\xeb\x01\x7f\xeb\xdc\xf8\x73\xac\xd6\x0b" + "\xbb\x05\x4a\xc0\x46\xa8\xf7\x3f\xd9\x4a\xd2\x06\x04\xe0\x3a\x25" + "\xbd\xe7\x49\xfc\x66\x06\x94\x95\x3a\xf6\x83\x2f\xfa\x8d\x16\x74" + "\x34\x3f\x59\x77\x74\x5e\x23\x71\xaf\x9b\x98\xa7\xb4\x8f\x9a\xa5" + "\xd3\xfd\x07\xbd\x50\xaf\x3e\x5a\x09\xf1\x01\xba\x05\xf7\x6a\xc1" + "\x8f\x53\xf8\x3a\x8b\x39\x1c\xd7\x4d\x2d\xea\xa3\x46\xd0\x45\xf0" + "\xbe\x80\x4f\xd9\x35\xb7\x4f\x6d\x20\x4b\x9c\x50\xe7\x8e\xe0\x11" + "\x15\xae\xe0\x24\x93\xe9\xf9\x76\xc6\x57\x1d\xe0\x83\xb3\x09\x44" + "\x78\xa6\x19\xea\xc6\x09\x75\xd3\xaa\x0f\x04\xde\x9a\x87\xbc\x45" + "\x8d\x0b\xc2\x53\x2d\xd4\x35\x77\x99\x9a\x42\xbd\x04\xe0\x3a\xf9" + "\xe2\x44\x42\x37\x9f\x83\x3a\xb2\xd5\x11\x28\x5b\x10\x70\xdb\x90" + "\xdd\xeb\x48\xf0\x2e\xa8\x9f\x41\xcd\x30\xa6\xc9\xfd\xbd\xee\xed" + "\xb4\xea\x7e\x4e\xc0\x39\xf2\x98\x66\x8b\xea\x16\xf0\x55\xd0\x0e" + "\x6c\xb7\xd0\x8e\x35\x5b\x18\xaf\x32\xdf\x3a\xd6\xeb\x47\x76\xac" + "\xd7\xeb\x20\x0c\x97\xb9\x4e\xe6\x19\x9a\x55\x1d\x8b\x3c\x67\x4e" + "\xb1\x10\x07\xd4\x65\x10\xf6\x89\xeb\xf5\xc3\x58\x9d\xfe\x0c\xea" + "\x74\x39\x09\x98\x68\x27\x2a\xb0\x4b\x0b\x36\x93\x63\xf1\xf5\xc8" + "\xad\xa1\x4e\x68\x47\x58\xcf\xa0\x53\xa0\x80\x35\x57\xde\x88\x8a" + "\x27\x57\xe8\x60\x7c\xf5\x05\xc1\x77\xc7\xa6\xb7\xd1\x33\x78\xcd" + "\xcf\x9c\xe2\x20\x34\x24\x59\x47\xd9\x5a\xd7\xd1\xbc\xa3\xf3\xec" + "\xc4\x3f\xa6\x8f\x6d\x76\x63\xfa\xd8\x66\x37\xa6\x8f\xb1\xf7\x7f" + "\x2a\x71\xdd\x56\x0a\xb8\x0e\x56\xe2\xba\x26\xff\xba\xe2\x7a\x4e" + "\xcf\x71\xfd\xda\x79\x05\xae\xd3\xfe\x35\xb8\xfe\x34\x86\xe1\x5a" + "\xdd\x31\x8a\xe1\xb5\xd0\xec\x78\x07\xc6\xbf\xc7\xe2\x65\xdc\x7e" + "\xf2\x3f\x88\xdb\xe3\xfb\xbe\xab\xb8\x6d\x6b\xd5\xeb\x20\xf4\x39" + "\x6e\x41\x67\xb7\x71\xfb\x69\x4c\x3b\x91\xeb\x0f\xf1\x4b\x8d\x15" + "\x31\xba\x74\xf2\x30\xf0\x44\xb8\x66\xcb\x70\x72\x8c\xd5\xa1\x39" + "\x5c\xb7\x80\xba\xea\xd5\xc7\xd9\x35\xd0\xf6\x4c\x4a\x5d\xc1\x2b" + "\x4b\xd3\x3f\x23\x5a\x57\xde\x18\x83\xd9\xf1\x16\xd1\x24\xf2\x6b" + "\x0b\x74\x70\x6d\x23\xcc\xc3\xd9\x75\x58\x57\x4e\x45\x3c\xae\x31" + "\xe3\x75\x14\xbc\xa6\xe9\xca\x29\x34\xb8\x06\xd7\x46\xd1\x9c\xda" + "\x0c\xbc\x3e\xdb\x9a\x65\x0e\x97\xaf\xcf\xfb\x1c\x1b\x05\x6f\x2e" + "\x85\xf6\x02\x73\xaa\xda\xb7\xe0\x57\x00\x3b\x8e\xc1\xaf\x1a\x7e" + "\xd9\xf5\xcc\x9e\xf5\x73\xe6\x78\x7e\x7d\x29\x39\x5c\xe2\xc1\x15" + "\xac\x0d\x8e\x21\x83\x9a\xa4\x7d\xb0\xa7\x4a\xbe\xde\xdf\x29\xef" + "\xae\x8f\x25\x98\x37\xd4\x89\xc8\xef\x41\xe0\xc7\x78\x7f\x8f\xa4" + "\x8f\x1d\xbb\xc2\xe2\x42\x4d\x69\xf5\xa4\x59\x5d\x6b\x30\x43\xcb" + "\x76\x15\x24\x87\xe3\x75\x37\xc4\xbd\x9c\x6f\x10\xf8\xdb\xb4\x91" + "\xc9\xb0\xe7\xa4\x5d\x79\x2f\x10\x5a\x30\xd2\x80\x73\xc8\x56\x1a" + "\x3f\x5d\xfa\xc5\xeb\x4d\x6a\xbe\xde\x52\xbb\x99\x42\xfd\xe1\x37" + "\xdf\x3b\xef\x79\xc2\x6f\xb1\x67\x88\xba\x8f\x52\x89\x74\x6d\x86" + "\xdb\x8b\xdf\x6b\xc7\x7b\x8a\xee\xcd\x20\x19\xad\x3e\xbe\xd7\xee" + "\xbe\xf7\xa8\x36\xde\x95\xff\x02\x8c\x7b\x6b\x2b\x60\x0c\x60\x52" + "\x96\xd9\x97\x2f\x40\xfe\x84\xbf\x73\x3d\xf3\x43\xad\xd5\x9f\x9e" + "\xc7\xf4\x4e\xda\x33\x5d\x9f\xf9\x7d\xff\x19\x0d\x7b\xa2\x6c\xee" + "\x5e\xa7\xc9\xd5\x11\xa3\x39\x92\x7a\xae\x87\x63\xa2\xcf\xfc\xbe" + "\xff\xda\x99\xb7\xd2\xe4\xb8\x07\x74\x8f\x1e\x4e\x9c\xab\x63\x1e" + "\x07\x1f\x05\xe2\x58\x6f\xf3\x0a\x7e\x9f\x5a\xcd\x5e\x07\xc1\x71" + "\xdf\x9b\xab\xaa\x85\xf6\x8e\x18\x12\x64\x25\xda\x39\xb6\x74\x9a" + "\x7d\x9e\x84\xd1\xf5\x31\x9a\x1d\xe7\x49\x64\x47\x4b\xe8\xc0\x57" + "\x92\x88\xd8\x0e\x9c\xdc\xbe\x26\x5e\x83\xf7\xc4\x7d\xd0\x64\x12" + "\xcc\x8e\x0a\x1c\x67\x86\x61\x3f\x80\xb6\x3b\x5b\x62\x82\xb6\x5f" + "\xc4\x6b\xc5\x97\x88\xe9\xd9\x5f\x41\x3f\xf0\xf9\xeb\xfd\x36\x03" + "\xf7\x01\x77\xb1\xfe\xa0\x17\x7d\x41\x3b\xf4\x05\x4f\xc6\x50\xfb" + "\xf1\xba\xcf\xf1\xfa\xb5\x36\x7d\x2d\x19\x84\xfa\xf1\x7a\x33\xeb" + "\x1f\x9e\x82\xfe\x01\x8e\x61\x2e\xd1\xd9\x3f\xe8\xe6\x90\x2e\xfd" + "\x03\xce\x43\x8e\x9f\x6c\x24\x80\xe5\x01\x73\x6c\x1a\x7b\x9a\x8d" + "\xba\x70\x4e\x62\x76\x9c\xc3\x77\x17\x05\xc9\x7d\x05\xf6\x13\xed" + "\x52\x3f\xb1\x5b\xea\x27\x7e\xd9\x07\xfd\xc4\x2f\xb1\x9f\xf8\x82" + "\x08\xaf\x61\x1f\x01\xfd\xc3\x6f\xff\x6e\x15\x3a\xa0\x4f\xe8\x99" + "\x9f\xff\xec\xf7\xfb\x17\xb4\x20\x59\xed\x82\xbe\x18\xfd\xbc\x09" + "\xfc\x8b\x7e\x36\xeb\xc1\xb7\x75\x03\xa2\xdb\x20\xde\x51\xb0\x30" + "\x71\xef\x59\xab\x40\xf3\x16\x1b\xdb\x00\x0f\x1b\x2f\x11\xc1\x11" + "\xbc\xd2\xf4\xd6\x02\xa3\x80\xf3\x56\x57\xfe\xc2\x72\x3e\x47\xfe" + "\xe2\x5b\x5c\xa3\xd1\x34\x12\x2d\xae\x9f\x3a\x69\x8c\xc6\xf5\x4d" + "\xcc\x20\xd7\x0b\xa1\x01\x1d\xdf\x84\x0e\x7c\xf9\x79\x22\x5a\x5f" + "\x88\xd7\xa4\x3f\x4d\xb4\x1f\xfe\xc5\x28\x1c\xb7\x41\xdb\xee\x6f" + "\x99\x4f\x41\x7f\x49\x3d\x89\x28\x79\x96\x84\x17\x9f\x25\xba\xe2" + "\xe5\x64\xdc\xae\xb3\x80\xa1\x17\x62\x82\x3a\x18\x3e\xda\x4c\xec" + "\xde\x80\xe5\x24\x8a\x0e\x8d\x4b\x84\xdf\x08\xe3\x72\x82\xef\x2d" + "\x4c\xa4\x21\x2b\x4d\x2e\x90\xdb\x01\x73\x37\x18\xa3\x83\x0d\x27" + "\xbe\xf4\x85\x9b\x5d\x3d\x1c\x43\x3c\x39\x0f\x70\x53\x0b\xb8\xf9" + "\xd6\x13\x37\x38\x6f\x65\xd8\x79\x92\x63\x07\xaf\x01\x96\x28\xc7" + "\x17\xcf\x1e\xed\x35\x7e\x8a\x60\xfc\xdc\xe6\x85\x9f\xa2\xf3\xd7" + "\x86\x9f\x0e\xc0\x4f\x51\x26\xe0\xe7\x18\x11\x0a\x5d\xd7\x82\x9f" + "\x2f\xf8\xb7\x36\xf6\xcc\x0a\xe5\xf7\x27\x9d\xb8\x1d\xfd\x6c\x51" + "\x9f\x08\x7d\x4a\xaf\x22\xbd\xc4\x95\xf5\xca\xb8\x5a\x14\xce\x71" + "\x55\xf7\x44\x2f\x70\xb5\x0f\x70\x65\xbd\x32\xae\x2e\xf9\xc3\x95" + "\xb5\x2b\xae\xfe\x77\xd2\x8d\xc5\x15\x7b\x57\xe8\xbf\x01\xae\xea" + "\x82\x3d\x71\xf5\x97\x17\x39\xae\xfe\x92\xd8\x7b\x5c\x2d\xba\x0a" + "\x5f\x2d\x92\xf8\xea\xaf\xaf\xf7\x1c\x57\x67\x44\x0a\xfa\xaf\x8c" + "\xab\x73\x7e\x70\xb5\xc8\x07\x5f\x7d\xb9\xfd\xc6\xe2\x8a\xbd\xcb" + "\xf4\xdf\x00\x57\x7f\x4d\xf0\xc4\x55\xdd\x27\x1c\x57\x75\xd5\xd7" + "\x80\xab\xab\xf0\x55\xac\xc4\x57\x27\xdb\x7a\x81\xab\x58\xc0\xd5" + "\x55\xf8\xea\x94\x3f\x5c\xf9\xe0\xab\xbf\x9d\xb9\xb1\xb8\x62\xef" + "\x5a\xfd\x37\xc0\xd5\xc9\x2a\x4f\x5c\xfd\x6d\x04\xc7\xd5\xdf\x74" + "\xbd\xc7\x55\xec\x55\xf8\x2a\x56\xe2\xab\xd3\x3f\xe9\x05\xae\xca" + "\x29\xe8\xbf\x32\xae\xde\xf7\x83\xab\x58\x1f\x7c\xf5\xf7\xa9\x37" + "\x16\x57\xec\x5d\xb0\xff\x06\xb8\x3a\x3d\xcc\x13\x57\xa7\x36\x70" + "\x5c\x9d\x4a\xb9\x06\x5c\x5d\x85\xaf\xe2\x24\xbe\x3a\xf3\x66\xcf" + "\x71\x55\x1f\x08\xb8\xba\x0a\x5f\x6d\xf6\x87\x2b\x1f\x7c\x65\xc9" + "\xb9\xb1\xb8\x62\xef\xaa\xfd\x37\xc0\xd5\x99\x64\x4f\x5c\x9d\xfe" + "\x8c\xe3\xea\x74\x6d\xb7\x70\x65\x57\xe0\xea\xe4\x80\xe8\xf6\x74" + "\x3e\x1f\x7c\x73\xb9\x84\xab\xdf\x3c\x51\xb6\x69\x2d\x11\xde\x5a" + "\x58\xe8\x35\x17\xfc\xc7\x25\x6f\x4c\x01\x2e\x18\xa6\x1c\x2f\x00" + "\xa6\x9a\x38\xa6\xd2\x4e\x01\xa6\xfe\x5a\x28\x98\x53\xce\x21\x4e" + "\x18\x86\x8a\x96\x03\x86\x70\x5e\xa8\x12\x43\x7b\x32\x07\x7c\xa5" + "\x49\xc6\x52\xfd\xa9\x3e\xc1\xd2\x7c\xc0\xd2\x09\x6f\x2c\x1d\x71" + "\x63\xe9\x27\x7e\xe6\x80\x8b\xfd\x60\xc9\x72\x75\x2c\xed\xc2\x35" + "\x84\xd5\xd7\x09\x4b\x9f\xb9\xd7\x10\xf6\x3d\x6b\x15\x1c\x21\x3d" + "\xc5\xd2\x3f\x4c\x9e\x58\xaa\x1f\xc5\xb1\x54\x1f\xd6\x7b\x2c\x2d" + "\xb2\xfa\xc7\x92\x3c\x9e\x3a\xfb\xc8\xb5\x61\x09\xc6\x56\x1e\x58" + "\xba\xfa\x38\xca\x8d\xa5\xaf\x46\xdf\x58\x2c\x79\x8d\xa3\x6e\x5a" + "\x2c\x9d\x0d\xf4\xc4\x52\x83\x34\xef\x6b\xf0\x3b\xef\x73\x41\xdf" + "\x85\xd7\x9c\xf0\xb9\x5f\x67\x4b\xcc\xe3\x4e\xe8\xd3\xf0\xf9\x5f" + "\xbc\x4e\xb1\x7f\x55\xad\x80\x78\xca\xba\x48\xc2\x76\x24\x91\x48" + "\x8d\x9d\x63\xc5\x01\x58\xd9\x76\x91\x88\x1d\x1d\x80\x93\x76\x22" + "\xb6\x41\x7d\xb7\x75\xc4\x6b\x6a\x96\x34\x92\x0f\xcf\xd7\x42\x5f" + "\x56\x41\x8a\x21\x4d\x87\xb4\x0e\xe9\xda\x14\x13\xb4\x7d\x23\xae" + "\x43\x1e\x23\xa6\x85\xbf\x04\xff\xff\xf3\x9a\xfd\xdf\xf6\x73\x7f" + "\xfe\x7f\xdf\xc3\xf7\x45\x0a\xbf\xb3\x67\x0b\x7a\xd9\x1f\xb1\xeb" + "\x54\xab\xb8\xef\x65\xbf\xbf\xd6\x07\x7e\x7f\x4d\xf2\xfb\xb5\xf5" + "\x47\x8d\xfe\xef\x7f\x54\x70\x05\xbb\xa7\xc0\xce\x39\x42\xe6\x05" + "\xe4\x08\x1c\xbf\xb4\x05\x2f\x4c\xf6\xee\x6f\x90\x1f\xce\xab\x9b" + "\x5e\xc4\xbe\xc9\xef\x38\x46\xe2\x89\xf4\x0d\x9c\x27\xa4\x71\xcc" + "\xb2\xbe\x5d\x7f\xfc\xfa\xe9\xeb\xc7\x17\xef\x5f\xbd\xef\xb9\x86" + "\x71\x0c\xe2\xa6\xc8\x0b\x37\xd7\x83\x2f\x7a\x87\x9b\xa6\x48\x4f" + "\xbe\x68\x7c\x8d\xf3\x45\x63\x61\x77\xfa\x9e\xab\xe0\xc9\xe6\xc6" + "\x13\x5f\x73\xe4\x78\x6a\xfe\x08\xd7\x28\x7b\x88\xa7\x8a\xbe\x5d" + "\x77\xfc\xe6\xcd\x1b\x8b\xa7\xbe\x5b\x77\xfc\x6e\xe3\xa9\x79\x87" + "\x27\x9e\x9a\xbe\xe6\x78\x6a\x6a\xbc\x76\x3c\x2d\x52\xf0\xd3\x22" + "\x05\x3f\x5d\x18\x8c\x6b\x93\x3d\xc3\xd3\x3f\x02\xfb\x76\xbd\xf1" + "\x5c\xdb\x8d\xc5\x53\xdf\xad\x37\x7e\xb7\xf1\x74\xfe\xa4\x27\x9e" + "\xce\x4d\xe5\x78\x3a\x17\xd1\x07\x78\xb2\x79\x8f\x89\x39\x9e\xbe" + "\x5d\x8a\xe3\xe7\x1e\xe2\x69\x49\xdf\xae\x33\x5a\x9f\xb8\xb1\x78" + "\xea\xbb\x75\xc6\xef\x36\x9e\xbe\x1d\xe7\x89\xa7\x0b\xdb\x39\x9e" + "\x2e\x6c\xbb\x76\x3c\xc5\x2a\xf8\x29\x56\xc1\x4f\x2d\x07\x70\x2d" + "\xb2\x87\x78\xea\xe3\xf5\xc5\x8b\xaf\xdd\x58\x3c\xf5\xdd\xfa\xe2" + "\x77\x1b\x4f\x2d\xa9\x9e\x78\xfa\xf6\x4b\x8e\xa7\x6f\xeb\xfa\x00" + "\x4f\x0a\x7e\x8a\x53\xf0\xd3\x65\x15\xae\x41\xf6\x0c\x4f\x0d\x01" + "\x7d\xbb\xae\x68\xfb\xfa\xc6\xe2\xa9\xef\xd6\x15\xbf\xdb\x78\xba" + "\x54\xe3\x89\x27\xdb\x68\x8e\x27\x9b\xbe\xbb\x6b\x41\xf2\x1a\x90" + "\x12\x4f\xfe\xe7\x76\xf6\xc7\xbc\xe7\x76\x3d\x5b\x03\x82\x79\x5e" + "\xaf\xd7\x13\x5b\xc7\xff\xff\xba\x9e\x88\x18\x92\xd7\x81\xbe\x7b" + "\x6b\x40\x76\xad\x27\x86\x2e\xaf\xe5\x18\xba\x9c\xec\x0f\x43\x0e" + "\xe5\x3d\x69\xff\x54\xdc\x93\x76\x8e\x08\x6f\xad\x32\x09\xc7\xa5" + "\x7b\xd2\xf0\x7e\xb4\xe3\x0d\x8d\x64\xfb\x65\xa2\x0d\x8a\x27\xda" + "\x39\x89\xe9\x34\x1b\x39\x64\x4d\x8c\xe6\x95\xb3\x24\xb2\x03\x30" + "\x93\xd5\x24\xdd\x97\x06\xb8\xf9\xf4\xa4\x9d\x7c\xb0\x0a\xef\x4b" + "\x2b\x23\x25\x20\xe7\xc8\xe3\xeb\x41\xc8\x23\xec\x9e\xb4\xe5\x78" + "\x4f\x5a\xdb\x14\x9f\xf7\xa4\x65\xf6\xf0\x9e\xb4\x64\xc0\x81\x0d" + "\x70\x70\x09\x31\xf0\xae\xc7\xbd\x68\xbb\x32\x15\x6b\x40\xcf\xfa" + "\x59\x03\xaa\xeb\xde\x35\x89\x3e\xbf\x17\xed\x82\xe2\x5e\x34\x79" + "\x0d\x68\x21\x70\x47\x8f\xfd\xde\x1e\x70\xa5\x35\x20\x27\x70\xc2" + "\x1c\xbc\xb7\xdc\xe6\x5e\x2f\x4e\x5d\x81\xcf\xfe\x2e\x4c\x74\x00" + "\x57\xe0\xfd\xe3\x6f\x3f\x5b\xcd\xd6\xfb\xcc\x29\x75\x64\x7b\x3b" + "\xd1\x6a\xac\x12\x2f\x84\x2c\x2c\xef\x00\x6e\x70\x42\xbf\x04\xbe" + "\x1e\xd4\xb1\x06\xb8\xe1\x22\x70\xc3\x1a\xe0\x86\x4b\xc0\x0d\xf5" + "\xd5\x8c\x1b\xe8\x4b\x96\xf9\xf8\xce\xef\x92\x26\x12\xbe\xbb\x89" + "\x44\x20\x07\x38\xf3\x57\x9a\x3a\x42\x16\xe6\x59\x43\x16\x16\xc2" + "\xb9\xbd\x1c\x03\x6d\xa6\x1d\x49\x84\x71\x3d\xfa\x5e\xb7\x1c\xf9" + "\xa0\xe3\xa1\x8e\x4c\x42\xae\x05\x07\x1d\xca\x35\x41\x25\x0e\xfc" + "\x70\xc0\x35\x63\xc1\x6b\x1d\x78\xd7\x35\x72\x00\x62\x61\x97\xcc" + "\x01\xd7\x84\x05\x87\xdf\xe7\x7f\xae\x82\x05\xeb\xd5\xb1\xb0\x28" + "\xbc\x9b\x58\xd8\x87\xef\xca\xee\x8a\x85\x45\xc1\xd6\x90\x45\xa1" + "\x70\x4e\xcf\xb1\x70\xc9\x07\x16\x9c\x4f\x5c\x7f\x2c\x78\xae\xc9" + "\xdc\xbc\x58\x70\xe9\x7a\x87\x85\x45\xdd\xe0\x85\x45\xdd\xe4\x85" + "\x33\x22\xbe\x63\xda\x07\x16\x80\x17\x16\x01\x2f\x2c\x92\x78\xe1" + "\x9c\x0f\x2c\xd0\xa7\xae\x3f\x16\x3c\xd7\x53\x6e\x5a\x2c\x88\xc4" + "\xff\xfb\x2f\xae\x8c\x85\x6e\xf0\x42\x6c\x37\x79\xe1\x4c\x2c\xbe" + "\x9b\xb9\x2b\x16\x62\x81\x17\x62\x81\x17\x62\x25\x5e\x38\xd5\x15" + "\x0b\xa2\x6a\xe9\xf5\xc7\x82\xe7\x5a\xc8\xcd\x8b\x05\x21\xa2\x77" + "\x58\x88\xed\x06\x2f\xc4\x76\x97\x17\xca\xf1\x9d\xc6\x3e\xb0\x00" + "\xbc\x10\x0b\xbc\x10\x2b\xf1\xc2\xfb\x3e\xb0\xa0\x5e\x79\xfd\xb1" + "\xe0\xb9\x8e\x71\xf3\x62\x41\x7c\xb4\x97\x58\xe8\x06\x2f\xc4\x75" + "\x93\x17\xea\x03\xf1\x5d\xc0\x5d\xb1\x10\x07\xbc\x10\x07\xbc\x10" + "\x27\xf1\xc2\x66\x1f\x58\xe8\xb7\xe1\xfa\x63\xc1\x73\x0d\xe2\xe6" + "\xc5\x42\xff\x79\x57\xc4\x02\xed\x8a\x05\x5c\x43\xc0\xf9\x23\xbe" + "\x6b\x9b\x61\xe1\x79\x93\xd0\x4e\x11\x0b\xd5\xe4\xe5\x8d\x0a\x2c" + "\xe4\xf3\x79\x84\x8c\x83\x9d\x4a\x1c\xe0\xf3\x4b\x88\x03\x98\x3f" + "\x38\xc0\xef\xb4\x20\x2e\x91\xdd\xaf\x94\xbf\x70\x2f\xce\x1f\x70" + "\x9d\x01\xe7\x10\x7e\xe7\x0f\xe2\x80\xcd\x7d\x82\x81\x04\xc0\x40" + "\xb3\xef\x79\x64\x9f\xcf\x1f\x2e\x5c\x27\x0c\xc0\x5c\xf2\x97\x69" + "\xd7\x82\x81\x80\xf9\x3d\xc7\x00\x8c\x11\xba\x85\x01\x3e\x4e\xb8" + "\x32\x06\x62\xb5\x6e\x0c\xc0\x78\x21\x3f\x56\x8f\xe3\x03\x8e\x81" + "\xd8\x50\xff\xe3\x83\x5b\xb6\x5c\x7f\x0c\xf4\xf1\xf8\xe0\x3b\x8b" + "\x81\x81\x31\x7e\x9f\x61\x44\x2e\x07\xde\x9f\x33\x7a\x38\xa1\x2f" + "\xc4\x3c\x9e\xd5\x44\xc2\x5e\x79\x9e\x44\xe2\x7b\x63\xde\x6a\xb7" + "\x0b\x69\x89\xf4\x9f\xf8\x6c\xb5\x03\xca\x81\xef\xaf\x66\xf8\xb8" + "\x10\x1a\x60\x8e\xb7\x92\xed\x80\x85\x57\xa0\x0c\xf8\x5e\xfa\xa0" + "\xc4\x01\xd1\xc7\x6d\x47\x49\x7b\x4b\x0c\xa9\x59\xd2\x44\xe6\xea" + "\x69\x87\xf9\xa4\x09\x9f\x61\x14\x4d\xeb\x8e\xe2\x73\xe2\x03\x9f" + "\x49\x21\xc2\x79\xf1\xd6\x61\xb8\xa6\x34\x31\x85\x68\x8b\x9a\xf8" + "\x3a\xd2\xf6\xf3\x84\x1c\x49\x21\x84\xfb\xfd\xd6\x0d\xfd\x36\xf4" + "\xc1\x1a\x52\x2c\xf8\xfd\xa4\xec\xf7\x23\x9e\x6b\x48\x42\x37\x9e" + "\x67\xec\xc6\xda\xe1\x75\x79\x9e\xf1\x42\xd7\xe7\x19\x7b\xb5\x76" + "\x28\x06\xfa\xfd\xfe\x09\x5b\x67\x96\xc6\x01\x9b\x92\x59\xbb\x67" + "\x7e\xed\x00\xee\x37\xa7\x54\xb0\xfb\xa3\xb1\x9d\x63\x9b\x47\x7c" + "\xa4\x43\x79\x11\x23\x88\x87\x39\x7b\x3b\x3a\x16\xdb\x88\xe0\x0a" + "\x59\x58\x8e\x98\x70\xad\x0e\x0d\xd8\x01\x65\x32\x2f\xa9\x07\xbf" + "\x5f\x24\xe6\x06\xc9\xe7\x1b\xeb\xc1\x97\x83\x02\xe8\x6a\xfd\xc0" + "\x09\x36\xa2\x4d\xff\x92\x68\x9f\xc1\x67\x8e\xa1\x1f\xd8\x05\x63" + "\x82\x92\xe7\x49\x38\xf4\x07\xc6\x0e\x89\x1b\x5c\xf2\xba\x12\xf6" + "\x11\x80\x89\x57\x56\x01\x26\x92\x01\x13\x8b\x11\x13\x83\x76\xf6" + "\x5b\xeb\x63\x7d\xb9\x07\x98\x60\xeb\xcb\xcb\x00\x13\x0d\x6e\x4c" + "\x74\xae\x2b\xfb\xe9\x13\x4c\x0b\xaf\xe1\xde\x42\x1f\x7c\x70\xcd" + "\xeb\xca\x17\xa4\x75\x65\x05\x1f\xf4\x0e\x1b\x41\xfe\xdf\x89\xe9" + "\x1f\x1b\xd6\xab\x63\xa3\x55\xc2\xc6\xa2\xf0\xab\x63\x43\x13\xe6" + "\x03\x1b\xfb\xdc\xd8\x58\xa4\x75\x63\x43\x5a\x67\xca\x5f\xa4\xef" + "\x8a\x0d\xcd\x9b\x37\x06\x1b\x5e\xf7\xfd\xdc\xb4\xd8\xd0\x6e\xed" + "\x39\x36\x16\x75\x83\x37\x2e\xc8\xd8\xe8\x06\x6f\x0c\x8e\xea\x8a" + "\x8d\x33\xa2\x02\x1b\x0a\xde\x90\xd6\x9d\xf2\x17\xf9\xe0\x8d\xc1" + "\x47\x6e\x0c\x36\xbc\xee\xe1\xb9\x69\xb1\x31\xa4\xb4\x17\xd8\xe8" + "\x06\x6f\x9c\x96\xb0\x11\xdb\x0d\xde\xb8\x2d\xd6\x07\x36\x62\xdd" + "\xd8\x88\x55\xf0\x86\xb4\x0e\x85\x63\xce\x2e\xd8\xb8\xed\xcc\x8d" + "\xc1\x86\xd7\xfd\x38\x37\x2d\x36\x82\x2b\x7b\x8e\x8d\xd8\x6e\xf0" + "\xc6\x87\x32\x36\xba\xc1\x1b\x21\x29\x3e\xb0\x51\xae\xc0\x86\x82" + "\x37\xa4\x75\xa9\xfc\x58\x1f\xbc\x11\xe2\xbc\x31\xd8\xf0\xba\xb7" + "\xe6\xa6\xc5\xc6\xd0\xba\x5e\x60\xa3\x1b\xbc\x91\x2e\x61\x23\xae" + "\x1b\xbc\xf1\x83\xbc\xae\xd8\xa8\x0f\x74\x63\x23\x4e\xc1\x1b\xd2" + "\x3a\x55\x7e\x9c\x0f\xde\x08\xbd\xfd\xc6\x60\xc3\xeb\x3e\x99\x9b" + "\x16\x1b\xa1\x7e\xdf\xa7\xaf\xc4\x46\xaa\xcd\xc7\x3c\xa5\x81\x63" + "\xa3\x03\x64\x94\xb8\x50\xce\x4d\xa0\x7c\xe2\x5c\x98\xb3\x20\x26" + "\xe2\x52\x89\xc0\x70\x61\x53\xe2\xe2\xf6\x7d\x88\x8b\xf1\xf1\x80" + "\x8b\xaf\x24\x5c\xc8\xf3\x12\xf6\xee\x15\x3e\x37\x91\xd7\xac\xe4" + "\xf9\xc9\xcb\x38\x67\x8d\x97\x31\x71\xc7\xf8\x7e\x2b\xfa\x00\x13" + "\x1e\xf7\x3d\x28\x30\xf1\xb4\x9f\xf9\xc9\x82\xde\x63\xe2\x97\x30" + "\x77\xed\xe8\xeb\x67\x9f\x64\x4c\x7c\x79\xad\x98\xb8\xf3\x8a\xf7" + "\x3f\xf8\xc6\x84\x34\xce\xf0\x8b\x09\xf7\xd8\x82\x63\xe2\xf4\x15" + "\x30\x71\xa7\xa9\x2b\x26\xa4\x71\x05\x7b\x0f\x01\x1f\x5b\xc8\x6b" + "\x58\xf2\xf8\xc2\x13\x13\xc3\x1e\xb9\x31\x98\xf0\x1a\x5f\xdc\xb4" + "\x98\xb8\x6b\x98\x3f\x4c\x18\x05\x57\x19\x84\x0a\x08\x26\x08\xd5" + "\x4e\x81\x3c\xb6\x5b\x70\xb1\x6f\xcf\x4b\x6d\xc6\xfb\x7c\x7f\xfa" + "\xd2\xb8\x04\x94\xa1\x5b\x44\x76\x7f\x85\xac\xc3\x39\x90\xe0\xfb" + "\x10\x4d\x1a\xd5\x12\xf4\x09\xca\x0e\x90\x75\x69\xb6\x90\x28\x28" + "\x3f\x97\x13\x48\x06\x97\x8b\xea\x8f\x72\x34\xab\xd6\x0a\x71\x01" + "\x92\x4e\x66\xab\x53\x10\x50\x97\x77\xde\xb7\x48\x32\x3a\x67\x26" + "\xd1\x29\xf3\x06\x5d\x98\xa7\x2c\x37\x10\xe5\x9c\xfd\x55\x19\x4e" + "\x95\x18\xa6\x94\xa3\x33\x88\x52\xee\x56\x49\x9f\xde\xa3\x1c\x23" + "\x09\xd1\xa8\x74\xbc\x2c\x29\x82\x5c\x96\x40\xa6\x33\xc8\x1c\x0d" + "\x3a\xc7\x79\xe8\xec\x4f\xc8\x20\x90\x47\xbd\x83\xe2\x99\xdd\x28" + "\x3f\x88\xf6\xff\x2a\x86\xe9\x57\x89\x06\x97\x40\x0c\xbc\x5c\x44" + "\xdc\xdd\x69\xb3\x8e\x18\x3d\xf3\x08\x92\xeb\x4b\x29\x87\x32\x54" + "\xe8\x94\xd1\xf0\xb2\x35\xc4\x82\x1d\x11\x4a\x3b\xb8\x1c\x99\x24" + "\xc9\x69\xa1\x5c\x91\x9d\xbe\xcc\x1b\x19\x2f\xcb\x01\x7e\x6f\x07" + "\x5f\x98\xf0\x2d\x75\x52\x3d\x0c\xa6\x59\x9f\x6d\x95\xea\x22\x4a" + "\xa9\x73\x90\x4a\x65\xd9\x2d\xd5\x97\x2b\xeb\xb3\x08\x90\x1d\xe2" + "\xda\x22\x3e\xda\xa9\x37\x53\x4b\x64\xbf\xd2\x4c\xc7\x6d\x4c\x6f" + "\x23\xb4\x33\x41\xa5\x93\xea\xe1\x36\x94\x85\x34\xd1\xbc\x5c\xda" + "\x4e\xbf\x3a\x05\x11\xcf\x99\x14\xb2\xc1\xbc\x8e\xcf\x9c\x80\xb2" + "\xcd\xee\x2a\x1f\xe0\x2d\x1f\xc2\xe5\xff\x5c\x05\xf2\xf3\xba\xca" + "\x6b\xbd\xe5\x87\x72\xf9\xbf\x0c\x03\xf9\xf9\x5d\xe5\x1d\x43\xbc" + "\xe4\x7f\xc0\xe5\xeb\x92\x41\x3e\xa6\xab\xbc\xce\x5b\x3e\x94\xcb" + "\x37\xe8\x40\x3e\xb6\xab\x7c\x94\xb7\xfc\xed\x5c\xfe\xaf\x35\x20" + "\xbf\xa4\xab\x7c\x86\xb7\xfc\x1d\x5c\xfe\x54\x18\xc8\x2f\xf3\x96" + "\x2f\x61\xb2\x64\xa4\x24\x7b\x27\x97\x3d\x9d\x0a\xb2\xf1\x3e\xca" + "\xaa\x96\x74\x1b\x24\xf9\x61\x5c\xfe\xb3\x93\x20\x9f\xe0\xc3\x57" + "\xde\xf2\x77\x71\xf9\xcb\xe3\x40\x3e\xd1\x87\xaf\xbc\xe5\x87\x73" + "\xf9\xc6\xd9\x20\x9f\xec\xc3\x57\xde\xf2\x77\x73\xf9\xa6\x22\x90" + "\x4f\xf1\x51\xf7\x9e\xf2\x41\xcd\xcd\x20\x97\xba\x3b\x53\x6e\x3f" + "\x1e\xf5\xee\xad\x7b\x04\xd7\x7d\x21\x12\xd2\x64\xf8\xa8\x77\x6f" + "\xf9\x91\x5c\xfe\xdb\x1d\x20\xbf\xb5\xab\x3c\x51\x71\x79\x32\x59" + "\x92\xff\x21\x97\x6f\xc1\xba\xdc\xe6\xa3\xee\xf1\xbc\x49\x6a\xa7" + "\x61\x5c\xf6\x6c\x02\xc8\xee\xf0\x51\xef\x4a\xd9\x51\x4c\x76\x48" + "\xff\x42\x90\x35\xfa\xa8\x73\xa5\xec\x3d\x5c\x6f\xfb\x3c\x90\xcd" + "\xf3\x51\xdf\x4a\xd9\x7b\xb9\xac\x03\x39\xa5\xd0\x87\xbd\x23\x15" + "\xb2\x7a\x2e\xeb\x8a\x07\xd9\x22\x1f\x7e\x51\xca\x8e\xe6\xf6\x06" + "\xa0\x0f\x4b\x7d\xf8\x45\x29\x3b\x86\xcb\x12\x6c\x6b\x7b\x7c\xf8" + "\x44\x29\x3b\x96\x0e\x11\x32\x24\x6e\xdd\xeb\x2d\x0b\x18\x30\x01" + "\x0f\x55\x03\x17\x8e\xa3\xb9\xe2\x8e\x12\xce\x6b\xec\x9b\x1b\xb2" + "\x0c\x15\x1c\xf7\x29\xfa\x81\xf1\x34\xcb\x9e\x28\xf1\x5f\x99\xb7" + "\x3e\x2a\x88\x4a\xd9\x09\x34\xf7\xf6\x48\x49\xb6\xbc\xab\x6c\x80" + "\x52\x76\x22\xcd\x0d\xcc\x93\x64\x2b\xba\xca\x6a\x3b\x65\x69\x6e" + "\x50\x19\xc8\x54\x16\x4b\xbc\xaa\xb0\x73\xb2\x42\xdf\x24\x9a\xab" + "\xad\x91\xf4\x99\xba\xea\xd3\x29\x65\x27\xd3\xdc\x3b\xe7\x49\xb2" + "\x55\x5d\x65\xa3\x94\xb2\xf7\xd1\xdc\x21\x8d\x92\x6c\x75\x57\xd9" + "\x0c\xa5\x6c\x38\xcd\x0d\x11\x25\xd9\x1a\x6f\xd9\x62\xde\x07\x09" + "\x92\x9f\xa6\xd0\xdc\x1f\xe8\x24\xd9\x5a\x8f\x3e\x56\x50\xb1\x36" + "\x56\xcc\xe5\xee\xa7\x43\x06\x96\x4a\xfe\x3c\xe1\xd1\xb7\x66\xaa" + "\x86\x60\x9f\xb2\x1b\xfd\xf9\x52\xb8\x1d\x64\x1f\x90\xf4\xd5\x79" + "\xf7\x7d\x92\x7d\x11\x70\xee\xa4\xdc\x3f\x41\xbf\x63\xf1\x35\xee" + "\x49\x1c\x43\x6e\x6d\x12\xef\xd9\xc3\xfb\x46\xe9\x1b\xc4\xa2\x9e" + "\x1d\xbb\xf6\xcc\x9c\x37\xd7\x46\x1d\xca\xb8\x6c\x81\xd6\x4e\xb4" + "\x11\x11\xdf\xe9\x4d\x43\xd6\xd8\x2d\x10\x6f\x1d\x35\x4b\xd7\x9a" + "\x7b\x4f\x99\x45\x75\x9a\x7d\xc3\x0e\xf6\x2b\x2d\x64\x67\x1d\xee" + "\x67\x67\xe2\xb7\x12\xa3\x54\xce\x82\x91\x06\xfc\xb6\x62\x09\x1c" + "\x67\x41\x60\xdf\x31\x84\x31\x26\x7d\x89\x44\x99\xd6\x39\xc8\xd9" + "\x14\x22\xb0\xef\x71\x8b\xf7\xde\x42\x57\xc7\x47\x82\x2d\x19\x90" + "\xef\xb2\x7a\x38\x66\xb6\xe0\x77\xe0\xf2\x46\xce\x36\x25\xb5\xa3" + "\x4c\x9c\x35\x64\x73\x06\xfd\xf9\xa2\xaf\x13\xd3\xc8\xdd\x4d\xe2" + "\xbd\xac\x8f\xc1\xf7\xde\xba\x42\x46\xce\x66\xef\xbb\xbd\x10\x3f" + "\x9d\xbd\xeb\x56\xd4\xaf\xc5\x77\xdc\xe2\xbb\x6e\xe5\xf7\xdc\xf2" + "\x7c\xf4\x4b\x5a\xf0\xfb\xa2\xa5\xdb\x75\xec\x3d\xba\xe2\xbd\x07" + "\x58\xf9\x32\x69\x2d\x0d\x9b\x19\xe1\x6a\xdf\x9a\x81\xdf\xcf\x36" + "\xa5\x35\x91\x7a\xe9\x1c\xea\x97\x74\x4e\xf2\xd6\x89\xe9\xac\x23" + "\xb6\xeb\xa0\x5e\x22\x9c\xc6\x05\x85\x2e\xed\x82\x3c\x6a\x5c\x1a" + "\x6d\x4e\xb0\x10\x56\x56\x51\xff\x06\x0d\x7a\xda\xec\x32\x2e\x48" + "\x85\xf8\x08\xb3\xad\x9d\xc5\x83\x6e\x07\x8e\x9b\x5b\xb4\x71\x5b" + "\xa9\x31\x6e\x9b\xe9\x8e\x76\xd2\x20\xea\xd9\xdc\x05\xe3\x69\xce" + "\xd2\x68\xac\x63\x57\xce\xd2\x08\x75\x28\x11\x5b\x06\xc7\x6d\x6d" + "\xcd\xd5\x0f\x93\xbf\x67\x27\xe7\x85\x7a\x2d\x92\xae\x6e\xbf\xb3" + "\x57\xbc\x77\x0f\x7b\x67\x6f\xae\x3e\xc1\xa2\x1a\x6b\x61\xef\xec" + "\x95\xeb\xb2\xfb\x3a\xe6\xa1\x0e\xdf\xdf\x35\x21\x1a\x9a\x3f\x32" + "\x1e\xf4\xd7\xc0\xd8\x3b\x96\x63\x43\x5f\x67\x51\x0d\xdf\x23\xed" + "\x37\x58\x54\x23\x03\xa5\x7d\xab\x45\xf5\x79\x91\xb4\xef\x90\xdf" + "\x9b\xec\xfb\x3d\xce\x23\x01\x1f\x23\xe7\xbb\x76\xc5\x04\xe0\xbc" + "\x81\xd9\x13\x32\x32\x52\x37\x9c\xa8\xce\x8a\xa3\x33\x20\xcf\xf9" + "\xdc\x4f\xa3\x9f\x86\x5f\x8d\xf4\x6b\x95\x7e\x29\xca\x30\xbc\x07" + "\xaf\x8d\x00\x5f\x44\x71\xff\x8c\x7e\x91\xcd\x97\x10\x57\x80\x3d" + "\x3a\x78\x69\x14\xd3\x9b\xbf\x39\x43\x69\x03\xc8\x10\xc3\xa4\xc9" + "\xf7\x85\x4f\xb9\xff\x81\x88\xa9\x4b\x9f\xfd\xe9\xb2\xe7\x96\xff" + "\x2c\x7e\xc5\xf3\x2f\x24\xac\x5c\xb5\x3a\xf1\xc5\xa4\x35\xc9\x6b" + "\xd7\xad\x4f\xd9\xb0\x11\xe5\x3a\xed\xdd\xf5\xa8\xca\x26\x10\xf0" + "\xf7\x0c\xcc\x87\xbd\xf3\x1a\xe3\x38\xee\x46\x9f\x10\x75\xbe\xe7" + "\x24\xe6\x50\x98\x07\xc2\x18\xbc\x59\x1c\x33\x09\xbf\xe5\x08\x6d" + "\x40\x65\x2e\x7a\xdc\x84\xdf\xa4\x6e\x10\xc7\x84\x1d\xb7\x3e\x6e" + "\xc2\x6f\xa8\x1f\x0e\x6d\x24\x61\x23\x89\xaa\x49\x1c\xa3\xc5\xf3" + "\x25\xf7\x10\x82\x5f\x7b\xf1\xa5\x73\xa4\x96\x84\xbe\x3a\x94\x5a" + "\xf3\x86\xd2\x66\xd4\x9f\x57\x40\x1b\xad\x9b\xe2\x49\x16\x1c\x43" + "\xbb\xd0\x9e\x15\xc7\x7c\x75\x18\x66\x1e\xae\x4c\x32\xac\xb8\x80" + "\x36\x6c\x1d\x4a\x1b\x7e\x5e\x40\x9b\x4b\x86\x52\x4b\x58\x1e\x09" + "\x6c\xcd\x1d\x53\x68\x11\x47\x5b\x59\xdb\x86\xf3\xae\x21\xa3\x8d" + "\xd9\x70\x6e\xa2\x83\xa8\x4b\xe0\x18\xe2\x6c\x87\x75\xdc\xee\xfd" + "\x17\xed\xfd\x40\x5f\x2a\xed\x48\x50\x65\x41\x3e\xdc\x27\x63\x6f" + "\xa9\x82\x51\x0c\xe4\x67\x35\xdb\xeb\x89\x45\x1c\x1b\x80\xdf\x96" + "\x85\xfc\x34\xe6\xc2\x66\x82\xfa\xde\x4e\xb2\xf7\x5b\x73\x07\x75" + "\x40\xda\x46\xd7\xa6\x04\x95\x45\x1c\x53\x05\xba\x6d\xca\xf2\xe8" + "\x97\xaf\x4c\xd6\xad\x5a\x9b\x90\x30\x7a\x20\xd1\xb3\x5f\xa2\xfc" + "\x9e\x7a\x32\xbe\xb3\xfd\xd5\x02\x5a\x05\xe5\x34\x41\x79\xab\x8f" + "\xc1\xec\x07\xf0\x41\xa0\x4c\x46\xb0\x21\x0e\xe2\x2b\x61\xbf\x12" + "\x6c\xaf\x66\xdf\x6a\x16\x23\xb7\xd3\xdc\xb1\xc1\x60\x27\xf6\x97" + "\xf8\x2e\x73\xd2\xb2\x7e\xbe\x0a\xca\x9d\x07\x72\xd5\xba\x3b\xc8" + "\x28\x48\xf7\x15\xd8\xb1\x07\xf6\x51\x3e\x07\xfd\x08\xf2\x55\xbc" + "\x5c\x91\x1b\xf0\x18\xea\xca\xb4\x7b\x28\xdd\xd1\x9a\x3b\xd6\x84" + "\xdf\xae\x60\xdf\xe3\x84\x63\xa8\x97\x6a\x90\x35\xb6\xa4\xcf\x57" + "\xc1\x1c\x5a\x55\xe2\xd6\x69\x44\x9b\xd0\x0e\x9c\x97\x7f\x0a\xa3" + "\x59\x57\x47\x0c\x19\x6f\x27\xaa\x4f\x1b\x08\x29\x2a\xa0\xa5\x10" + "\x8a\x20\x14\x1e\x85\x73\x9f\x40\xa8\x86\xf8\x1a\xf8\x3d\x0a\xbf" + "\x9f\x40\x80\x79\x7d\x28\xda\xbd\x26\x95\x36\x4e\x2c\x24\x3f\x44" + "\xfd\x80\xad\xff\xaa\x17\x1f\xb4\xa0\xed\xf8\x6d\x1a\x3a\x64\x9c" + "\xe7\xf7\xdf\xc5\xf1\xd5\x04\xce\xc3\xef\x49\xfe\xab\x0c\x13\xc2" + "\x20\x3c\x2a\xed\xef\x00\x99\x72\x69\xbf\x14\xc2\xbe\xab\x07\x6f" + "\x7d\xfe\x02\x4c\xda\xbb\x2d\xdb\x9d\x10\x39\xbf\x7b\x72\x86\x5a" + "\x22\xde\xa7\x87\xb0\xc4\x33\xfe\xbe\x08\x1e\x17\x21\xf2\xe3\x08" + "\xad\xf4\x1b\x09\x01\xea\x69\x2a\xe8\x9f\x9a\xc2\xe3\xa6\x6e\x85" + "\xdf\x1a\x08\x75\x9e\xf9\x47\x42\xfa\xc8\x04\xf4\x67\x07\xf4\x43" + "\xe8\x4b\x8b\x38\x2e\x0c\x7d\x94\xcd\xb1\xa5\xc2\xe7\xf3\x20\x4e" + "\x07\xd8\x2a\x72\xe3\x67\x42\x88\x27\x7e\x26\x10\x2f\xfc\x18\x91" + "\x8f\xa0\xbd\x24\x94\x70\xbc\x54\xb6\x6c\x5a\x06\xc7\x13\x44\xd0" + "\x53\x89\xeb\x45\xa0\x83\xcd\x0f\xb2\x9b\x60\x1e\x1e\x4f\x44\xe4" + "\x97\x66\x71\xc2\x53\x88\x59\xcc\x5b\xca\x97\xdb\x02\xf6\x41\x5c" + "\x29\xda\xb7\x1a\xf4\xc2\xf1\x1e\x90\x2b\x35\x93\x8b\xb2\x6d\x2c" + "\xcd\xcb\xcf\x03\x1e\x25\x7b\x51\x27\xa6\xa3\xee\x72\xe9\x30\x0d" + "\xcf\x7b\xe2\x2d\x10\x8f\xf3\x7b\x7c\xf6\x4e\x6d\x76\x58\x08\x62" + "\x12\x7f\xcd\x0e\x03\xb4\xa5\x68\xe2\xc2\xf7\xcd\x87\x12\x03\xb4" + "\xb7\x5b\xea\xc5\x09\xcd\x13\x52\x89\x01\xf5\x21\x87\x43\x39\xca" + "\x4a\xb0\x2d\x72\x5d\x2a\x2c\x07\xea\x3f\x0a\x33\x2a\xfc\x2d\x46" + "\x7b\xe0\xbc\x22\xdf\x3c\x9c\xb7\x67\x6f\xe4\x65\x85\xbc\xf6\x40" + "\xfa\x32\x2c\x3b\xd6\x27\x9c\xaf\x00\x3d\xd1\x78\x0e\xbf\x4f\x29" + "\x95\x67\x0f\x3e\xf3\x88\xf5\x81\xf2\x66\x98\xc1\xb0\x6f\x69\x88" + "\x63\xd9\x37\xc2\x41\x7f\x19\xfa\x83\x42\x1e\xa8\x23\xdd\x41\x1d" + "\x14\xf8\xe8\xd7\x1b\xed\x30\xfe\x31\x7c\xe4\xe9\x9f\x89\xa5\x4a" + "\xff\x40\xba\x32\x48\x5f\x85\x63\x02\xe4\x13\xc8\x53\x83\xe3\x1d" + "\x88\x33\xba\x72\x41\xc7\x3a\x3b\x5b\xe3\x02\x3d\x07\xc0\x16\x23" + "\xea\x01\x7b\xaa\x24\x5d\xcd\xf8\xde\x7d\xa5\xaf\x25\x7d\x7b\xd0" + "\xe7\xac\x3d\x6f\x64\x65\x02\xee\x32\x6c\x29\xe6\xe7\x2a\x40\xa6" + "\x82\x76\x44\x13\xba\x29\x86\x7f\xb3\x9a\x9f\x2b\x4f\x6f\x63\xfe" + "\xad\xe2\xbc\x66\x78\x7d\xcd\x66\xda\xe8\xb6\xdb\x10\x23\x7f\x97" + "\x4a\xb2\xbb\x1c\xf3\xa3\xeb\x63\x59\x3f\x8a\x79\x60\x7a\x49\x5f" + "\x38\xea\x93\xeb\x6a\x02\xd8\xc1\xeb\x6b\x62\x3c\xc4\xef\x41\x2c" + "\xb2\x7a\x03\x1e\x6d\x49\x47\x2c\x1a\x62\x21\x7d\x65\x16\x1e\xaf" + "\xc7\xe3\x89\x56\xc6\xb1\x9d\xe7\x27\x22\xc6\x2a\x71\x5d\x24\xfb" + "\x05\xc0\x92\x8b\x90\x1f\x06\x13\x83\x2d\x93\x95\x6d\x9f\x6d\xd3" + "\xa3\xaa\xc3\x0e\x42\xd0\x4e\xa8\xa3\x8a\xd6\xdc\x49\x22\x70\x3f" + "\xfb\x66\x35\xf0\x75\x39\xfd\x75\x0c\x41\x9b\x81\xcf\x24\xfb\x26" + "\xad\x95\x7c\x5f\x8e\x65\xc4\xfa\x9c\xc0\xb9\x0f\xce\xdd\x77\x3b" + "\xda\xee\x2e\xf7\xa4\x79\xca\x3a\x66\xe5\x06\x3f\xa0\xbf\xd0\x2f" + "\x0a\x9d\x88\x7d\x23\xe8\xda\xc7\x8f\x39\x36\xb0\xae\x8d\x43\x69" + "\x0d\xca\xbb\x65\x27\x6f\xc7\x73\x69\x90\xf7\xc4\x44\x5c\x03\x82" + "\xfe\xd9\xd1\x6a\x02\xbd\xfb\x4c\x1b\x1d\x04\x74\x54\x60\x9d\x82" + "\xdc\x29\xc4\x23\x1c\xd7\x48\x79\x9c\x84\xfe\x7c\x1c\x84\x48\x77" + "\xfb\x9f\x7c\xcc\x13\x5f\x93\xbd\xdb\x3f\xfa\xdb\xe8\x4a\x8f\x26" + "\x0c\x0f\x49\x44\x77\x5e\x9c\xbc\x42\xea\x3b\x24\x5f\x4f\x7e\xff" + "\x30\xb4\x17\x85\x8e\x47\xbd\x7c\x5d\xc1\xf0\xb8\x7e\xb6\x0a\xcb" + "\x0c\x69\x2b\x24\x3d\xac\xcc\x0c\x4f\x99\x0c\x03\x35\x74\x3d\x94" + "\xb3\x13\x07\x93\x4a\x25\x3f\xd7\x78\xd5\x89\x64\xfb\x78\xfc\x06" + "\xf5\x74\xe4\x24\x18\x7b\x4f\x6f\xed\x70\xf3\x12\xfa\xde\xc5\x7c" + "\x3f\x39\xba\x84\xf7\xb7\x12\x6f\x4d\xe6\xe7\x87\x7a\x60\x18\x6d" + "\xd9\xcc\xf0\x8b\xb6\xa4\xc7\xa2\x2d\x15\xcc\x8e\x74\x1d\x81\x73" + "\x36\xcc\x1f\xd2\x66\x48\xed\x55\xd2\x35\x69\x3e\xea\xfa\x39\x70" + "\x15\xda\x64\x11\xc7\x5b\x18\xff\xfd\x98\xe1\xe0\x29\xc9\xf6\x6a" + "\x7b\x26\xa6\x9d\x10\xdd\x26\xb0\xb4\xd5\x20\x57\x69\xe7\xdf\x89" + "\x1b\x08\xe9\xf7\xb2\x7b\x37\xc5\x07\xca\x91\xa3\xf1\x99\x64\xd8" + "\xdf\xad\x5b\x00\x58\x6d\x22\x22\xe8\x0b\x40\x8c\xca\xb8\x68\x16" + "\x1f\xd8\x89\xdf\x90\x81\xba\xde\x07\x63\xa4\xbd\x58\xdf\x88\x65" + "\x18\x23\x85\xb7\xe6\xde\x57\x29\xe3\x16\xf2\x29\xc2\xba\xe7\xfe" + "\x09\x57\x01\x8e\x2b\xdc\xd8\x0a\x57\x49\xf5\xb8\x17\xea\x31\x00" + "\xf2\xdb\x22\x95\x6b\x2f\xc8\xc3\x58\xec\x81\x17\x25\xdb\x0b\x25" + "\xf9\xbb\x64\x3f\x48\x6d\xb5\x26\x0b\xf9\x97\xf9\x20\xbc\x5c\x4a" + "\xbb\x47\xca\xeb\x5d\x59\x16\xc7\x88\xec\x9b\xcf\x10\x87\x3c\x38" + "\x11\x7c\xcf\xb8\x6f\x63\x3b\x93\x93\xb8\xb1\x8a\xe7\xf1\x40\x1c" + "\xc3\x21\x8c\x7b\xdc\x38\x0a\xdf\xe1\xc5\x4f\xc8\xc5\xc6\xe3\x5b" + "\xf9\x37\xf5\x10\x4b\xc8\xa9\x38\x57\x02\x7d\xcb\xa4\xf6\x23\xdb" + "\xdc\xe6\x89\x95\x07\x9e\x00\xac\x8c\x57\xe8\x6e\xf4\xd5\xcf\x95" + "\x70\x0e\x2c\xe2\x69\xa6\x4c\x95\xca\xb6\x8f\x97\x4d\x3a\xc6\x7a" + "\x4b\xc3\x7a\xbb\xdf\xa9\xa8\x47\xa8\xb7\xfb\x57\x48\xf2\x15\xc8" + "\xe5\xee\xf6\x3a\xe5\x0d\xb9\x2d\x77\xe5\x8b\xfb\x9f\xc6\xf6\xe0" + "\xb6\x6b\x4a\x86\x17\x5f\x54\xf8\xe6\x8b\x29\xf3\xa4\xf2\x96\x7a" + "\xb5\x8d\x3d\xd2\x78\x77\xa5\xec\x87\xe3\x36\xe9\xdb\x86\x10\x87" + "\xfc\x89\x79\x2b\xfb\xa0\x62\x5e\xaf\x52\x5b\xbe\xff\xb1\xae\x7e" + "\xb8\x3f\x58\xd9\x9e\xd1\xd7\xc8\x09\xa8\x03\x7d\xca\xc6\x95\x10" + "\xc7\xfd\x3a\xa5\x19\xb9\x41\xc9\xd1\x20\x9b\xe7\xa2\xd8\x5e\xee" + "\x0f\xf5\x6c\x8b\x53\xb6\x4a\x6d\x51\xce\xfb\x6b\xf0\x91\x41\x91" + "\xef\x0e\xaf\x7c\xd1\x37\x55\xec\x1b\x34\xac\x8c\xf7\x7f\x21\xf7" + "\x69\x28\x0f\x69\x53\x20\x8d\xc9\xab\x7f\x34\xa2\x7d\x90\x57\x04" + "\xe3\xac\x02\xc6\x15\x29\xad\xdc\x9e\xaa\x12\xa9\x9f\x80\x38\x83" + "\x14\x67\x94\xfa\x12\x19\x37\x53\x3c\x6d\x7a\x40\xe7\x7b\x7c\x34" + "\x25\x42\x1e\x1f\x31\x5d\x8c\x8b\x1e\x08\x93\xca\x87\x71\xe3\x79" + "\x5c\x38\xce\x69\x58\x5f\x05\xf1\x79\x94\xf5\x57\xe1\x46\xa9\xbf" + "\xc2\xf6\x25\xc0\x31\xf6\x4b\x35\x78\x0c\x3a\x52\x50\xbf\x39\xa3" + "\x1d\xe7\x10\x30\x07\xba\xaf\x08\xf9\x00\xf9\x02\xef\x39\x66\xbf" + "\x73\xd8\xef\x11\xe4\x1d\x1c\x87\xe0\x79\x90\xdb\x81\x5c\x04\xf1" + "\x5f\xe2\xfb\x06\xe9\x37\x01\xa0\xf7\x81\x4a\x29\xed\x39\x36\x56" + "\xf8\x26\x5a\x2d\xc7\xc9\xe9\x80\xb7\x76\x63\x3a\x4c\x2f\xf3\x17" + "\x72\x97\x03\xb9\x89\xe5\x17\x31\x49\xc2\x38\xff\xce\xa3\x34\x2e" + "\xea\x10\x14\xb2\xf8\x8d\x36\xc6\x69\x11\xa9\x9c\xcf\x22\x56\x62" + "\x5a\xe6\x3f\xe0\xca\xb4\x36\x7a\xa6\x24\x89\x88\xc5\x17\x91\x17" + "\xc7\x26\x70\x3b\x23\xaa\x79\x39\x22\x72\x58\x39\x38\xa7\x1a\xb9" + "\x2d\x63\x13\x8a\xdb\xd9\xb9\xb7\xb0\x2c\x78\x2e\x5b\x71\x0e\xbf" + "\xb9\x08\xe7\x3e\x61\x76\x79\xa5\x73\x75\xc4\x77\x91\x2f\x69\x67" + "\xf3\xbe\x80\xe2\x02\x99\x7b\xa7\x46\x73\x3b\xa7\xf6\x93\x79\x17" + "\xea\x25\x0f\xb9\x97\x9d\x5b\x2e\xc9\xcc\x91\x7e\x19\xbf\x4f\x9d" + "\xc2\xeb\x35\x54\x90\xea\xbb\x88\x97\x63\xea\x13\x6c\x9e\xfd\x4d" + "\x0c\xd4\xed\xd4\x71\x72\xdd\x2a\xf7\xb1\xfd\x40\xfe\x5a\x3c\x66" + "\xb8\x4f\x65\x73\xd8\x22\x94\x41\x9b\x78\x1f\x11\x11\xe6\x3d\xa6" + "\x3e\x2b\x3e\xf8\x11\xf6\x4b\x7c\xac\xfa\xe0\xeb\xd2\xfa\x14\x31" + "\x25\xfd\x0a\xfa\x85\xa9\xcd\x32\xc7\xd0\xd6\x68\x82\xdf\x6e\x02" + "\x5b\xce\x61\x1c\x7e\x77\x4b\x29\x83\xfc\xb4\xbf\xdd\x22\xe9\x9c" + "\x5a\x2d\xf3\x06\x72\xc9\x71\x5b\xbd\x34\xa6\x9b\x96\x52\x2c\x71" + "\xc9\x79\x71\xda\x06\xcf\x71\xd8\xb4\x0d\x9e\x9c\xf1\xe0\x4e\x6f" + "\xce\x80\x71\xf3\xd6\xd6\xdc\x69\xb3\x3d\xc6\x01\x10\x77\x65\xee" + "\x98\xa6\xc3\x36\x8a\xdf\x7c\x65\xfc\xc4\xd6\xdc\xa6\x9d\x91\x6d" + "\x46\xde\x6c\xd9\x24\xaf\x5f\x3c\xb8\x19\xc7\x6a\x5e\xf9\x55\x7a" + "\x70\x27\xe6\x27\xeb\x13\x09\x7e\x37\x14\xea\x01\xd7\x5c\xa6\xed" + "\x90\x78\xbe\xd4\x83\x2b\xa5\x3e\x0c\x79\xd2\xb3\xaf\x1a\xbb\xd2" + "\xb3\xaf\x7a\x70\x45\x57\x8e\x7c\x30\xa2\xfb\x7d\xd5\x83\x38\x2f" + "\xe8\xe4\x48\x4f\x2e\x78\x30\xb2\xd8\x63\x2c\x3b\xad\x4a\x1e\xcb" + "\xba\x79\x74\xda\x7c\xe4\x28\xc8\xbf\x42\xca\xbb\xdc\x22\x8e\xae" + "\x90\xf3\x06\x1c\x35\x1f\xd7\x01\x36\x73\xc7\xea\x60\xbf\x50\x1a" + "\x03\xb2\xb6\xd9\x8e\xdf\xf8\x13\x23\x2c\x80\xbf\x81\x88\x33\xd3" + "\xaa\x8b\xa4\xc1\xdd\x57\x54\xb5\xac\x96\xeb\x37\xf2\x31\xe5\xb8" + "\x70\x77\x01\xdd\xd6\x9a\x1b\x39\x4c\x59\xc6\x9d\x10\x97\x2d\xad" + "\x21\xb0\xba\x65\xba\x1e\xb4\x96\x14\x78\x96\x8d\x97\x23\x32\x0c" + "\xcb\x81\x73\x22\xc8\xbf\x01\xc7\x3d\xf8\xdd\x67\x68\x37\xf1\x25" + "\x9d\x98\x1f\x5f\xd9\x96\xa9\x1c\x5f\x8d\xad\x42\xae\x94\xe6\x9e" + "\xd5\x30\xde\x31\x2a\xd7\x62\x9e\xfc\xd1\x3c\x5d\x62\xd2\x8a\x55" + "\xc9\xcb\x27\xeb\x56\xac\x5a\x91\xbc\x62\x69\xc2\x8a\x8d\x4b\x93" + "\x57\xac\x5e\x35\x6e\xe5\xd2\x9f\xad\xf8\xa9\x6e\xfd\xd2\x35\x3a" + "\x43\xca\xa8\x94\x81\xc4\x2d\x3a\x4d\xb7\x74\xcd\x9a\xb5\x2b\x9f" + "\x5b\xa6\x5b\xb5\xe2\xa7\xe3\x93\x9e\x5b\xf3\x5c\xb2\x6e\x69\xd2" + "\xea\xb5\xab\x96\xe9\x46\x2d\x9b\x30\xca\x70\xff\xb2\x81\xca\x35" + "\xb4\x91\x5a\xd2\xec\xba\xdc\xd8\x98\x7d\x99\x04\x68\x54\x89\x49" + "\x9a\x94\x15\xab\xf8\xba\xdd\x43\x3b\x27\xe6\x91\x44\x38\x1f\x58" + "\x92\x8b\x75\x1d\x59\x0a\xbf\x22\xca\x41\x39\x75\xb0\x1f\x00\xb6" + "\x0f\x6b\xcd\x7d\x68\x9e\x45\x7c\x24\x02\xeb\x0c\xea\x42\x07\x65" + "\x1b\x46\x2f\x57\x37\xc2\x98\x2d\x11\xef\x35\x28\xb9\x4c\x82\x8d" + "\xeb\x88\x08\x21\x10\x82\x56\xd0\xe2\x5a\xd7\x43\x5b\x2d\xe2\xf4" + "\x52\xbe\x2e\x3a\x3d\xcc\x3a\x78\xf1\x09\x6a\x5c\x7c\x82\xfb\x65" + "\xfa\x08\x79\x3d\x7c\xee\x2f\xc8\x5c\xc4\x67\xbd\x38\x5d\xc7\x7c" + "\x05\x58\xc6\xf5\xe0\x96\x0f\x66\x44\xc1\x78\xf0\x24\xae\xe9\xc2" + "\xb9\x11\x36\x81\x04\x82\x5d\xe2\xe1\x54\x03\x79\x15\xf2\x5a\x13" + "\x4a\x29\xe4\xd1\x28\xaf\xa7\x41\x19\xb4\x50\x96\x3a\xa9\x1c\x9f" + "\xb2\x72\x14\xd0\xb0\xbc\x21\x60\x5f\x2e\xda\x33\x3d\x58\x2e\x03" + "\xd8\x5d\x67\x11\x1f\x4a\x01\x3b\xb5\x68\x97\xaf\xb5\x3e\x5c\xef" + "\x02\x3b\xe3\x5c\xeb\xa0\xde\x86\xf3\xef\xc6\x66\x17\xf3\xf6\x07" + "\xe5\xc9\x2b\x81\xfd\xac\x8b\x24\x70\x67\x12\x09\xa6\x99\x77\xd3" + "\x63\x36\x07\x31\xc7\xd7\x11\xcd\x06\x6a\xa5\x07\x1b\x1b\xa5\x32" + "\x6d\x43\x6e\xf8\xdd\xf3\x75\x22\x96\x09\xfa\x8a\xc0\x92\x8b\x7e" + "\xd7\x16\xc5\x57\x87\x52\x1b\xdd\xa5\x1c\x73\x4d\xff\x16\xeb\x04" + "\xc7\x5b\x2d\xd0\x4f\x41\x19\xc0\xee\xe9\x06\x69\x6c\x6c\xa3\x1d" + "\xb1\x8a\xb1\xd4\x74\xc4\x99\xcd\x8f\xee\x00\x59\x37\x15\xd8\xf7" + "\x96\x43\xb9\xff\x1f\x8e\x83\x34\x56\xb7\xfe\x87\x23\xbc\xf5\xa3" + "\x4e\xd8\xb7\xca\xf9\xf0\x79\xf8\xc3\x38\x26\xb0\x02\x96\xad\x7e" + "\xf2\x0b\xcb\x2d\xa0\x27\xcc\x10\x9f\xdd\x46\x70\xae\x72\xa2\xa4" + "\x80\xe9\x87\xbe\x3f\x92\xad\xbd\xff\x7c\x28\x21\x5b\x41\xa6\x25" + "\x77\xba\x01\xd7\x77\xe1\x1c\xb4\xff\xb1\x7a\xef\x75\x6b\x09\xcf" + "\xd3\xbc\xf0\x1c\x95\x8b\x63\xc2\x3c\xd0\x0f\x18\xca\xbe\x04\xfd" + "\x30\x1c\x4f\xc8\x23\x7a\xcc\x07\xf6\x6b\x71\x3d\xa4\x35\x37\x2a" + "\x40\xce\x8f\x02\xfe\xb3\x5c\x7c\x0d\x46\xc2\xd6\x38\x73\x4a\x23" + "\xbe\x37\x8c\x1e\x06\x7e\x47\x1b\x11\x63\x90\x26\x52\xc6\x14\x60" + "\xfd\x04\xc3\x55\x30\xd1\xd3\xdc\x87\x4d\x25\x43\x40\x0e\x70\x55" + "\x0c\x78\x42\x5c\x81\x6c\xbc\x8c\x29\xc0\x5a\x2d\xca\x81\x0d\x03" + "\xcb\x36\x46\x89\xc8\x91\x0d\x62\xd4\x29\xc4\x18\xfd\xef\x59\x75" + "\xf4\x07\x8b\xea\xb8\x9f\xa2\x4e\x99\xed\xdc\x07\xee\x7a\x8f\x2a" + "\x53\xd4\x7b\x2d\xe0\x78\x20\xd6\x33\x5f\xab\x8e\x3a\x05\xb6\xd5" + "\xb2\xb1\xf8\x66\xf0\x01\xeb\xab\xa2\x8a\x30\xbd\x54\x87\x35\xee" + "\x3a\x8c\xb2\xfb\xaa\x43\xaf\xba\x13\x31\xd0\xdc\x47\x44\x6c\x2b" + "\xad\xb9\x8f\x8c\xb3\x88\x0f\xd7\xf8\xbb\x5e\x00\x79\x88\x62\x1e" + "\x09\xc0\x3c\xaa\x82\x99\x7c\xac\xaf\x3c\xbc\x71\x5c\x05\xb3\x5e" + "\x5c\x0b\xc7\x74\x61\xc1\x58\xaf\x8f\xe4\xf9\xf4\xef\x4f\x3d\x6c" + "\x63\x01\x6c\x2b\x7d\x75\x08\x91\xed\xab\xb9\x92\x7d\x61\x3a\xde" + "\x2f\x9a\x46\x22\x9e\x67\xf4\x33\x17\x12\x82\x71\xfc\xf8\x11\x5b" + "\x0b\xf4\x35\xde\xeb\xf9\xfe\xaf\x2f\xcc\x78\xcc\xf3\xfa\xc2\x8c" + "\x70\x7f\xd7\x17\xbc\xf2\xdd\x82\xf9\xba\x4a\xe6\xab\xdc\x79\xcf" + "\x48\x70\xf9\xc8\x5b\x4e\x3f\xa1\x54\x39\x7f\x99\xf1\x19\xda\x70" + "\x1c\xfa\x25\x7a\xe7\x7c\x15\x05\x3d\x55\xac\xcf\x9e\x51\xcb\xc7" + "\x2b\x38\x0e\x9a\x51\x86\x32\xde\xe5\xe8\xdc\x02\x82\x71\x8d\x8d" + "\xb4\xb1\x83\x7e\x3f\x26\xf8\xe6\x2a\x32\xbc\x53\x46\xf0\x10\x26" + "\xd4\xc7\x41\x20\x21\x77\x33\x79\x0a\x1b\x8f\x92\x8e\xad\xec\x40" + "\xec\x94\xef\x3c\x7f\x0d\xdb\x2d\xdc\x5e\xa6\xcf\x4e\x54\x7c\x4f" + "\x17\xaa\x90\x78\xf4\x0a\xa9\x29\x91\x93\xf8\xda\x70\xe6\x9f\x31" + "\xbf\x1f\xe8\x8b\x60\xc2\x94\x3a\x24\xfd\xf2\x31\x55\x1e\x63\x8c" + "\xe7\x31\x6c\xea\x58\x45\x06\x77\xab\x97\xb1\x5b\xc5\x7e\x98\xd0" + "\x19\x25\x94\x6a\x95\x59\x6a\x49\x46\x3f\xb6\xa3\xc1\x3f\x76\xd0" + "\xa7\x87\xf3\xba\x98\x4e\x81\xdb\x6c\x5b\x14\xe2\x9f\x72\xf3\x47" + "\xec\xbd\x42\x19\x7b\xba\x0d\x57\xec\xdf\xcd\x7f\x46\xc4\xf7\xa1" + "\xfe\x2b\x6f\xba\xda\x5b\xe4\x5d\x37\x3c\x46\x34\xfb\x12\x75\xd7" + "\xff\xc8\xd9\x72\x94\x12\xa1\xee\xf3\xa3\xaa\x3d\x8f\xef\x2d\xf4" + "\x3c\x1e\xdd\xd8\x17\xa6\x9b\xf0\x4f\xba\x65\x30\xf8\xac\xbc\x33" + "\x52\xe3\xd5\x64\x34\x46\xaf\x26\xe4\xde\x24\x6b\xd4\x84\x8c\x89" + "\x54\x44\x8b\xbe\xa5\xaf\xcf\x76\xc7\x16\xa9\x41\xdc\x6d\xd5\x76" + "\x39\xf9\xb0\x57\x1c\x1e\xf7\xd7\x49\x71\x93\x3e\xea\x22\xcf\xe2" + "\x74\x8a\x63\x55\x14\xfc\x29\x05\xfc\xdb\xbb\xca\x7e\xbf\x7d\xbf" + "\x75\x63\x53\x61\xfb\xf8\x7e\xbb\x4e\x1b\xe5\xbd\x38\x30\x11\xfb" + "\xc1\x7f\xb4\x93\x28\xa9\x74\x82\x4a\x11\x54\xda\xe9\x93\x7e\xfc" + "\xfb\xed\xfb\xed\xfb\xed\xfb\xed\xfb\xed\xfb\xed\xfb\xed\x26\xd8" + "\x54\xca\x89\x35\xde\x4b\x3b\x40\xfa\x55\xce\x7f\x54\x52\x50\xc6" + "\x09\xd7\x92\x8e\x4a\x1b\xc9\x88\x32\xe9\x4a\x97\x58\xb4\xc6\x79" + "\xb5\x86\xb2\x44\x6b\xc0\xb6\xe8\x6a\xfd\xde\xf8\xc6\xd0\xc2\x98" + "\xba\x88\x8a\x14\xbb\xb8\xf5\xd1\xaa\xb0\x3d\xcb\x1a\x82\xf3\xe6" + "\x9f\x08\x2f\x4f\xb6\x05\xee\x98\x5d\x33\x6e\x5f\x42\xf3\xb0\xa2" + "\xd8\x93\x91\x95\xa9\x0e\x21\x73\xc6\xc7\x23\x7f\xf5\x6c\xfd\x90" + "\xdc\xff\xf8\x7c\xf2\x3b\x49\x17\x07\xbe\x3c\xf3\xe8\x98\xff\x79" + "\xbe\xe9\x8e\x5f\x2e\xfc\xeb\xb4\xdf\x6f\x6c\xef\xff\xd2\x8f\xff" + "\x78\xcf\x6f\x96\x9f\x1d\x5a\xb0\xe0\x2f\xf7\x1f\x5c\x77\x39\x28" + "\x6b\xce\xf1\x09\x6f\xaf\x3a\x3f\xbc\x78\xf1\xdf\xa7\x7f\x90\xe6" + "\x52\x6d\x79\xe4\xa3\x11\xaf\x2f\x3d\x33\x38\xe7\x27\x9f\x4d\x3a" + "\xf0\xe2\xb7\xb7\x6c\x7f\xe2\x93\xd1\x6f\xae\xf8\xfa\xf6\xd7\x9e" + "\xfe\x72\xea\xa1\x0d\x6d\xfd\x7e\xf1\xd8\x91\x51\x6f\x3c\xf7\x55" + "\x48\xfe\x53\x5f\x4c\x79\x77\xed\xa5\x41\x3b\x9f\x3c\x36\xfe\xad" + "\x95\xe7\xee\xda\x1d\x77\xea\xa1\xf7\x37\x3b\xd5\x3f\xff\xd1\xe1" + "\x1f\xfe\xfa\xa7\xff\xb8\xed\xd5\xff\xfc\xf3\x7d\xbf\x5b\xd3\x72" + "\xeb\x2b\xb3\x3e\x1d\xfb\xdb\x17\xbe\xb9\x73\xd7\xa2\xbf\x3d\xf8" + "\x87\x4d\x1d\x03\xfe\xcf\xe3\x7f\xba\xf7\xff\xfe\xec\x9f\x3f\xf8" + "\xef\xff\xfa\xdf\x07\xde\x5b\xdf\xaa\xc9\x9e\x6b\x9e\xb8\x7f\xf5" + "\x85\xbb\x4b\x9e\x39\xfd\xf0\x87\xe9\xf4\x5a\xea\x8f\x88\xb9\x87" + "\x6f\xb4\xdf\xf8\xcf\x4b\xd5\xbd\x49\x4f\x05\x95\xe4\x77\x1e\x91" + "\x31\x85\xa8\x02\x48\x7f\xb1\x17\x33\x85\xde\x96\xd7\xcf\xa6\x53" + "\xa6\xef\xce\x86\xcf\xe5\xe1\x35\xe5\xfb\x20\xdc\xc9\x62\xdc\xb3" + "\xff\xe1\x3e\x53\xdc\x88\x4d\x05\x65\x55\x83\x25\xfd\x48\x7f\xa8" + "\x9d\x00\x72\x0b\x19\x48\x6e\x25\x81\x64\x10\x09\x22\x1a\xa2\x25" + "\x83\xc9\x10\x72\x1b\x09\x26\x21\x64\x28\xf9\x01\x09\x25\xb7\x93" + "\x3b\xc0\xfa\x61\xe4\x2e\xdf\x36\x67\x90\xa8\x50\xf8\x03\xff\xe7" + "\x91\x28\x76\xbc\xe4\xfb\xf8\x1b\x1a\x6f\x92\xe2\x6b\xa5\x78\xcb" + "\xf7\xf1\x37\x34\x5e\xf7\x2f\xfe\x1d\xf1\x2f\xfd\x55\xc1\xd0\x80" + "\x8f\x0e\x3c\xc6\x08\x9d\x9b\x77\xac\x4a\xda\x3a\x8f\xc9\x55\xd2" + "\x77\xd1\xe7\x99\xde\x7b\x8b\x82\x10\xce\x77\xd3\x09\xe1\xd7\x13" + "\xa8\x72\x73\x14\xa8\x3e\x16\x07\x67\xe0\xa5\x91\x00\x12\xcc\xfe" + "\x5e\x7d\x7b\x63\x18\x04\x3d\x04\x50\xfd\xc6\x03\x10\x7e\x04\xe1" + "\x49\x59\x37\x18\x95\x41\x54\x42\x05\x84\x61\x44\xa5\x9e\x0f\xa1" + "\x91\xa8\xfa\xc7\x13\x55\x3f\x3d\x51\x0d\x70\xaf\xe7\xab\xb4\x15" + "\x9d\x56\xaa\x82\xa4\x78\x1d\xec\xdf\x16\xa5\xc8\xac\xa7\xfd\x56" + "\xc5\x63\xf3\xa3\x75\x93\x26\x84\x4f\x08\x8f\x78\x56\x37\x7e\xde" + "\x78\xdd\x64\x83\x61\xea\xc4\x49\x93\x27\x4e\x8a\xd0\x4d\x9a\x32" + "\x6d\xf2\xfd\xd3\xa6\x44\xe8\x56\x6e\x48\x5a\x31\xc9\xf0\xb3\xe7" + "\x74\xab\x96\xad\x58\xa3\x5b\xbe\x22\x69\xe5\xfa\xa5\x49\xcf\x75" + "\xa3\xe8\x3d\xd9\xa0\x28\xe4\x2e\x27\x37\x53\xe9\x21\x15\xb9\x9b" + "\x88\xb3\x74\x44\x5c\x5c\x47\x3a\xcf\xa8\x8c\x52\x51\xf4\x52\xe8" + "\xb2\xad\x5c\xb8\xe0\xaf\xa3\x16\x05\x7d\xfc\xc8\xcf\x46\x3d\xf4" + "\xa3\x5f\x67\x97\x11\xe1\x27\x0d\x44\x78\x62\x1b\x11\x1e\x8e\x26" + "\xc2\x7d\x89\x44\xb8\x07\x54\xec\x9c\x4f\x84\xad\x27\x89\xb0\x31" + "\x83\x08\xab\x76\x10\x61\xa9\x8f\xb8\xa2\x6d\x3c\xae\x76\x1c\x11" + "\x8e\xec\x23\xc2\xa1\x42\x22\xfc\xb6\x9a\xc7\x9d\x05\xbd\x27\x43" + "\x7d\xe5\xff\x2f\xde\x7a\x8a\x03\xd5\xff\x03\x8a\xd2\xee\x33" ; diff --git a/sys/dev/my/if_my.c b/sys/dev/my/if_my.c index 8bfeb34887ba..99f6071ba200 100644 --- a/sys/dev/my/if_my.c +++ b/sys/dev/my/if_my.c @@ -126,7 +126,8 @@ static int my_ioctl(struct ifnet *, u_long, caddr_t); static void my_init(void *); static void my_init_locked(struct my_softc *); static void my_stop(struct my_softc *); -static void my_watchdog(struct ifnet *); +static void my_autoneg_timeout(void *); +static void my_watchdog(void *); static int my_shutdown(device_t); static int my_ifmedia_upd(struct ifnet *); static void my_ifmedia_sts(struct ifnet *, struct ifmediareq *); @@ -382,6 +383,15 @@ my_autoneg_xmit(struct my_softc * sc) return; } +static void +my_autoneg_timeout(void *arg) +{ + struct my_softc *sc; + + sc = arg; + MY_LOCK_ASSERT(sc); + my_autoneg_mii(sc, MY_FLAG_DELAYTIMEO, 1); +} /* * Invoke autonegotiation on a PHY. @@ -439,12 +449,13 @@ my_autoneg_mii(struct my_softc * sc, int flag, int verbose) return; } my_autoneg_xmit(sc); - ifp->if_timer = 5; + callout_reset(&sc->my_autoneg_timer, hz * 5, my_autoneg_timeout, + sc); sc->my_autoneg = 1; sc->my_want_auto = 0; return; case MY_FLAG_DELAYTIMEO: - ifp->if_timer = 0; + callout_stop(&sc->my_autoneg_timer); sc->my_autoneg = 0; break; default: @@ -661,7 +672,8 @@ my_setmode_mii(struct my_softc * sc, int media) */ if (sc->my_autoneg) { device_printf(sc->my_dev, "canceling autoneg session\n"); - ifp->if_timer = sc->my_autoneg = sc->my_want_auto = 0; + callout_stop(&sc->my_autoneg_timer); + sc->my_autoneg = sc->my_want_auto = 0; bmcr = my_phy_readreg(sc, PHY_BMCR); bmcr &= ~PHY_BMCR_AUTONEGENBL; my_phy_writereg(sc, PHY_BMCR, bmcr); @@ -808,6 +820,8 @@ my_attach(device_t dev) sc->my_dev = dev; mtx_init(&sc->my_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); + callout_init_mtx(&sc->my_autoneg_timer, &sc->my_mtx, 0); + callout_init_mtx(&sc->my_watchdog, &sc->my_mtx, 0); /* * Map control/status registers. @@ -886,7 +900,6 @@ my_attach(device_t dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = my_ioctl; ifp->if_start = my_start; - ifp->if_watchdog = my_watchdog; ifp->if_init = my_init; ifp->if_baudrate = 10000000; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); @@ -984,13 +997,15 @@ my_detach(device_t dev) struct ifnet *ifp; sc = device_get_softc(dev); + ifp = sc->my_ifp; + ether_ifdetach(ifp); MY_LOCK(sc); my_stop(sc); MY_UNLOCK(sc); bus_teardown_intr(dev, sc->my_irq, sc->my_intrhand); + callout_drain(&sc->my_watchdog); + callout_drain(&sc->my_autoneg_timer); - ifp = sc->my_ifp; - ether_ifdetach(ifp); if_free(ifp); free(sc->my_ldata_ptr, M_DEVBUF); @@ -1188,7 +1203,7 @@ my_txeof(struct my_softc * sc) MY_LOCK_ASSERT(sc); ifp = sc->my_ifp; /* Clear the timeout timer. */ - ifp->if_timer = 0; + sc->my_timer = 0; if (sc->my_cdata.my_tx_head == NULL) { return; } @@ -1240,7 +1255,7 @@ my_txeoc(struct my_softc * sc) MY_LOCK_ASSERT(sc); ifp = sc->my_ifp; - ifp->if_timer = 0; + sc->my_timer = 0; if (sc->my_cdata.my_tx_head == NULL) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; sc->my_cdata.my_tx_tail = NULL; @@ -1249,7 +1264,7 @@ my_txeoc(struct my_softc * sc) } else { if (MY_TXOWN(sc->my_cdata.my_tx_head) == MY_UNSENT) { MY_TXOWN(sc->my_cdata.my_tx_head) = MY_OWNByNIC; - ifp->if_timer = 5; + sc->my_timer = 5; CSR_WRITE_4(sc, MY_TXPDR, 0xFFFFFFFF); } } @@ -1455,7 +1470,7 @@ my_start_locked(struct ifnet * ifp) /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->my_timer = 5; return; } @@ -1555,6 +1570,8 @@ my_init_locked(struct my_softc *sc) my_phy_writereg(sc, PHY_BMCR, phy_bmcr); ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + + callout_reset(&sc->my_watchdog, hz, my_watchdog, sc); return; } @@ -1680,17 +1697,18 @@ my_ioctl(struct ifnet * ifp, u_long command, caddr_t data) } static void -my_watchdog(struct ifnet * ifp) +my_watchdog(void *arg) { struct my_softc *sc; + struct ifnet *ifp; - sc = ifp->if_softc; - MY_LOCK(sc); - if (sc->my_autoneg) { - my_autoneg_mii(sc, MY_FLAG_DELAYTIMEO, 1); - MY_UNLOCK(sc); + sc = arg; + MY_LOCK_ASSERT(sc); + callout_reset(&sc->my_watchdog, hz, my_watchdog, sc); + if (sc->my_timer == 0 || --sc->my_timer > 0) return; - } + + ifp = sc->my_ifp; ifp->if_oerrors++; if_printf(ifp, "watchdog timeout\n"); if (!(my_phy_readreg(sc, PHY_BMSR) & PHY_BMSR_LINKSTAT)) @@ -1700,8 +1718,6 @@ my_watchdog(struct ifnet * ifp) my_init_locked(sc); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) my_start_locked(ifp); - MY_UNLOCK(sc); - return; } @@ -1716,7 +1732,9 @@ my_stop(struct my_softc * sc) MY_LOCK_ASSERT(sc); ifp = sc->my_ifp; - ifp->if_timer = 0; + + callout_stop(&sc->my_autoneg_timer); + callout_stop(&sc->my_watchdog); MY_CLRBIT(sc, MY_TCRRCR, (MY_RE | MY_TE)); CSR_WRITE_4(sc, MY_IMR, 0x00000000); diff --git a/sys/dev/my/if_myreg.h b/sys/dev/my/if_myreg.h index 71eb3f37bd5a..f7870319fe31 100644 --- a/sys/dev/my/if_myreg.h +++ b/sys/dev/my/if_myreg.h @@ -371,8 +371,10 @@ struct my_softc { struct my_chain_data my_cdata; device_t my_miibus; /* Add by Surfer 2001/12/2 */ - struct mtx my_mtx; - + struct mtx my_mtx; + struct callout my_autoneg_timer; + struct callout my_watchdog; + int my_timer; }; /* Add by Surfer 2001/12/2 */ diff --git a/sys/dev/nfe/if_nfe.c b/sys/dev/nfe/if_nfe.c index 67d48710f5ff..5d0bfd268f63 100644 --- a/sys/dev/nfe/if_nfe.c +++ b/sys/dev/nfe/if_nfe.c @@ -567,7 +567,6 @@ nfe_attach(device_t dev) ifp->if_start = nfe_start; ifp->if_hwassist = 0; ifp->if_capabilities = 0; - ifp->if_watchdog = NULL; ifp->if_init = nfe_init; IFQ_SET_MAXLEN(&ifp->if_snd, NFE_TX_RING_COUNT - 1); ifp->if_snd.ifq_drv_maxlen = NFE_TX_RING_COUNT - 1; diff --git a/sys/dev/nve/if_nve.c b/sys/dev/nve/if_nve.c index a987c6c89ac8..6179869757b0 100644 --- a/sys/dev/nve/if_nve.c +++ b/sys/dev/nve/if_nve.c @@ -140,7 +140,7 @@ static int nve_ioctl(struct ifnet *, u_long, caddr_t); static void nve_intr(void *); static void nve_tick(void *); static void nve_setmulti(struct nve_softc *); -static void nve_watchdog(struct ifnet *); +static void nve_watchdog(struct nve_softc *); static void nve_update_stats(struct nve_softc *); static int nve_ifmedia_upd(struct ifnet *); @@ -526,22 +526,12 @@ nve_attach(device_t dev) goto fail; } - /* Probe device for MII interface to PHY */ - DEBUGOUT(NVE_DEBUG_INIT, "nve: do mii_phy_probe\n"); - if (mii_phy_probe(dev, &sc->miibus, nve_ifmedia_upd, nve_ifmedia_sts)) { - device_printf(dev, "MII without any phy!\n"); - error = ENXIO; - goto fail; - } - /* Setup interface parameters */ ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = nve_ioctl; ifp->if_start = nve_ifstart; - ifp->if_watchdog = nve_watchdog; - ifp->if_timer = 0; ifp->if_init = nve_init; ifp->if_mtu = ETHERMTU; ifp->if_baudrate = IF_Mbps(100); @@ -551,6 +541,14 @@ nve_attach(device_t dev) ifp->if_capabilities |= IFCAP_VLAN_MTU; ifp->if_capenable |= IFCAP_VLAN_MTU; + /* Probe device for MII interface to PHY */ + DEBUGOUT(NVE_DEBUG_INIT, "nve: do mii_phy_probe\n"); + if (mii_phy_probe(dev, &sc->miibus, nve_ifmedia_upd, nve_ifmedia_sts)) { + device_printf(dev, "MII without any phy!\n"); + error = ENXIO; + goto fail; + } + /* Attach to OS's managers. */ ether_ifattach(ifp, eaddr); @@ -709,7 +707,7 @@ nve_stop(struct nve_softc *sc) DEBUGOUT(NVE_DEBUG_RUNNING, "nve: nve_stop - entry\n"); ifp = sc->ifp; - ifp->if_timer = 0; + sc->tx_timer = 0; /* Cancel tick timer */ callout_stop(&sc->stat_callout); @@ -983,7 +981,7 @@ nve_ifstart_locked(struct ifnet *ifp) return; } /* Set watchdog timer. */ - ifp->if_timer = 8; + sc->tx_timer = 8; /* Copy packet to BPF tap */ BPF_MTAP(ifp, m0); @@ -1095,7 +1093,7 @@ nve_intr(void *arg) /* If no pending packets we don't need a timeout */ if (sc->pending_txs == 0) - sc->ifp->if_timer = 0; + sc->tx_timer = 0; NVE_UNLOCK(sc); DEBUGOUT(NVE_DEBUG_INTERRUPT, "nve: nve_intr - exit\n"); @@ -1236,6 +1234,9 @@ nve_tick(void *xsc) if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) nve_ifstart_locked(ifp); } + + if (sc->tx_timer > 0 && --sc->tx_timer == 0) + nve_watchdog(sc); callout_reset(&sc->stat_callout, hz, nve_tick, sc); return; @@ -1307,12 +1308,13 @@ nve_miibus_writereg(device_t dev, int phy, int reg, int data) /* Watchdog timer to prevent PHY lockups */ static void -nve_watchdog(struct ifnet *ifp) +nve_watchdog(struct nve_softc *sc) { - struct nve_softc *sc = ifp->if_softc; + struct ifnet *ifp; int pending_txs_start; - NVE_LOCK(sc); + NVE_LOCK_ASSERT(sc); + ifp = sc->ifp; /* * The nvidia driver blob defers tx completion notifications. @@ -1328,24 +1330,18 @@ nve_watchdog(struct ifnet *ifp) sc->hwapi->pfnDisableInterrupts(sc->hwapi->pADCX); sc->hwapi->pfnHandleInterrupt(sc->hwapi->pADCX); sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX); - if (sc->pending_txs < pending_txs_start) { - NVE_UNLOCK(sc); + if (sc->pending_txs < pending_txs_start) return; - } device_printf(sc->dev, "device timeout (%d)\n", sc->pending_txs); sc->tx_errors++; nve_stop(sc); - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; nve_init_locked(sc); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) nve_ifstart_locked(ifp); - NVE_UNLOCK(sc); - - return; } /* --- Start of NVOSAPI interface --- */ diff --git a/sys/dev/nve/if_nvereg.h b/sys/dev/nve/if_nvereg.h index c3c4edc805d3..b6346690d1ae 100644 --- a/sys/dev/nve/if_nvereg.h +++ b/sys/dev/nve/if_nvereg.h @@ -138,6 +138,7 @@ struct nve_softc { device_t miibus; device_t dev; struct callout stat_callout; + int tx_timer; void *sc_ih; bus_space_tag_t sc_st; diff --git a/sys/dev/nxge/if_nxge.c b/sys/dev/nxge/if_nxge.c index 129ccb5576f4..c86d7b61bad9 100644 --- a/sys/dev/nxge/if_nxge.c +++ b/sys/dev/nxge/if_nxge.c @@ -2943,10 +2943,8 @@ xge_flush_txds(xge_hal_channel_h channelh) xge_lldev_t *lldev = xge_hal_channel_userdata(channelh); xge_hal_dtr_h tx_dtr; xge_tx_priv_t *tx_priv; - struct ifnet *ifnetp = lldev->ifnetp; u8 t_code; - ifnetp->if_timer = 0; while(xge_hal_fifo_dtr_next_completed(channelh, &tx_dtr, &t_code) == XGE_HAL_OK) { XGE_DRV_STATS(tx_desc_compl); @@ -3006,7 +3004,7 @@ xge_send_locked(struct ifnet *ifnetp, int qindex) /* If device is not initialized, return */ if((!lldev->initialized) || (!(ifnetp->if_drv_flags & IFF_DRV_RUNNING))) - goto _exit; + return; XGE_DRV_STATS(tx_calls); @@ -3016,7 +3014,10 @@ xge_send_locked(struct ifnet *ifnetp, int qindex) */ for(;;) { IF_DEQUEUE(&ifnetp->if_snd, m_head); - if(m_head == NULL) break; + if (m_head == NULL) { + ifnetp->if_drv_flags &= ~(IFF_DRV_OACTIVE); + return; + } for(m_buf = m_head; m_buf != NULL; m_buf = m_buf->m_next) { if(m_buf->m_len) count += 1; @@ -3033,7 +3034,7 @@ xge_send_locked(struct ifnet *ifnetp, int qindex) if(status != XGE_HAL_OK) { XGE_DRV_STATS(tx_no_txd); xge_flush_txds(channelh); - goto _exit1; + break; } vlan_tag = @@ -3054,7 +3055,7 @@ xge_send_locked(struct ifnet *ifnetp, int qindex) ll_tx_priv->dma_map, m_head, segs, &nsegs, BUS_DMA_NOWAIT)) { xge_trace(XGE_TRACE, "DMA map load failed"); XGE_DRV_STATS(tx_map_fail); - goto _exit1; + break; } if(lldev->driver_stats.tx_max_frags < nsegs) @@ -3093,9 +3094,7 @@ xge_send_locked(struct ifnet *ifnetp, int qindex) * listener so that we can use tools like tcpdump */ ETHER_BPF_MTAP(ifnetp, m_head); } - ifnetp->if_drv_flags &= ~(IFF_DRV_OACTIVE); - goto _exit; -_exit1: + /* Prepend the packet back to queue */ IF_PREPEND(&ifnetp->if_snd, m_head); ifnetp->if_drv_flags |= IFF_DRV_OACTIVE; @@ -3103,9 +3102,6 @@ _exit1: xge_queue_produce_context(xge_hal_device_queue(lldev->devh), XGE_LL_EVENT_TRY_XMIT_AGAIN, lldev->devh); XGE_DRV_STATS(tx_again); - -_exit: - ifnetp->if_timer = 15; } /** @@ -3269,8 +3265,6 @@ xge_tx_compl(xge_hal_channel_h channelh, XGE_DRV_STATS(tx_completions); - ifnetp->if_timer = 0; - /* * For each completed descriptor: Get private structure, free buffer, * do unmapping, and free descriptor diff --git a/sys/dev/ofw/ofw_pci.h b/sys/dev/ofw/ofw_pci.h index ef48ee96ab63..eb60c5baee0b 100644 --- a/sys/dev/ofw/ofw_pci.h +++ b/sys/dev/ofw/ofw_pci.h @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/dev/patm/if_patm_attach.c b/sys/dev/patm/if_patm_attach.c index 940d0ac3009a..12dfa1498cc7 100644 --- a/sys/dev/patm/if_patm_attach.c +++ b/sys/dev/patm/if_patm_attach.c @@ -197,11 +197,9 @@ patm_attach(device_t dev) ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_flags = IFF_SIMPLEX; - ifp->if_watchdog = NULL; ifp->if_init = patm_init; ifp->if_ioctl = patm_ioctl; ifp->if_start = patm_start; - ifp->if_watchdog = NULL; /* do this early so we can destroy unconditionally */ mtx_init(&sc->mtx, device_get_nameunit(dev), diff --git a/sys/dev/patm/if_patm_intr.c b/sys/dev/patm/if_patm_intr.c index a13125ae54c5..79cb248966ba 100644 --- a/sys/dev/patm/if_patm_intr.c +++ b/sys/dev/patm/if_patm_intr.c @@ -381,7 +381,7 @@ patm_feed_lbufs(struct patm_softc *sc) static void patm_intr_tsif(struct patm_softc *sc) { - struct idt_tsqe *tsqe = sc->tsq_next;; + struct idt_tsqe *tsqe = sc->tsq_next; struct idt_tsqe *prev = NULL; uint32_t stamp; diff --git a/sys/dev/pccard/card_if.m b/sys/dev/pccard/card_if.m index 26723c18ae3d..606af16b3e59 100644 --- a/sys/dev/pccard/card_if.m +++ b/sys/dev/pccard/card_if.m @@ -35,7 +35,7 @@ INTERFACE card; # # Companion interface for pccard. We need to set attributes for memory # and i/o port mappings (as well as other types of attributes) that have -# a well defined meaning inside the pccard/cardbus system. The bus +# a well defined meaning inside the PC Card/CardBus system. The bus # methods are inadequate for this because this must be done at the time the # resources are set for the device, which predates their activation. Also, # the driver activating the resources doesn't necessarily know or need to know diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index 47aedbde0dd5..29593eb12f19 100644 --- a/sys/dev/pci/pci.c +++ b/sys/dev/pci/pci.c @@ -62,6 +62,10 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include +#include + #include "pcib_if.h" #include "pci_if.h" @@ -76,6 +80,8 @@ static pci_addr_t pci_mapbase(uint64_t mapreg); static const char *pci_maptype(uint64_t mapreg); static int pci_mapsize(uint64_t testval); static int pci_maprange(uint64_t mapreg); +static pci_addr_t pci_rombase(uint64_t mapreg); +static int pci_romsize(uint64_t testval); static void pci_fixancient(pcicfgregs *cfg); static int pci_printf(pcicfgregs *cfg, const char *fmt, ...); @@ -138,7 +144,7 @@ static device_method_t pci_methods[] = { DEVMETHOD(bus_alloc_resource, pci_alloc_resource), DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource), DEVMETHOD(bus_activate_resource, pci_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_deactivate_resource, pci_deactivate_resource), DEVMETHOD(bus_child_pnpinfo_str, pci_child_pnpinfo_str_method), DEVMETHOD(bus_child_location_str, pci_child_location_str_method), @@ -249,7 +255,7 @@ disable. 1 means conservatively place devices into D3 state. 2 means\n\ agressively place devices into D3 state. 3 means put absolutely everything\n\ in D3 state."); -static int pci_do_power_resume = 1; +int pci_do_power_resume = 1; TUNABLE_INT("hw.pci.do_power_resume", &pci_do_power_resume); SYSCTL_INT(_hw_pci, OID_AUTO, do_power_resume, CTLFLAG_RW, &pci_do_power_resume, 1, @@ -270,6 +276,17 @@ TUNABLE_INT("hw.pci.honor_msi_blacklist", &pci_honor_msi_blacklist); SYSCTL_INT(_hw_pci, OID_AUTO, honor_msi_blacklist, CTLFLAG_RD, &pci_honor_msi_blacklist, 1, "Honor chipset blacklist for MSI"); +#if defined(__i386__) || defined(__amd64__) +static int pci_usb_takeover = 1; +#else +static int pci_usb_takeover = 0; +#endif +TUNABLE_INT("hw.pci.usb_early_takeover", &pci_usb_takeover); +SYSCTL_INT(_hw_pci, OID_AUTO, usb_early_takeover, CTLFLAG_RD | CTLFLAG_TUN, + &pci_usb_takeover, 1, "Enable early takeover of USB controllers.\n\ +Disable this if you depend on BIOS emulation of USB devices, that is\n\ +you use USB devices (like keyboard or mouse) but do not load USB drivers"); + /* Find a device_t by bus/slot/function in domain 0 */ device_t @@ -373,6 +390,34 @@ pci_mapsize(uint64_t testval) return (ln2size); } +/* return base address of device ROM */ + +static pci_addr_t +pci_rombase(uint64_t mapreg) +{ + + return (mapreg & PCIM_BIOS_ADDR_MASK); +} + +/* return log2 of map size decided for device ROM */ + +static int +pci_romsize(uint64_t testval) +{ + int ln2size; + + testval = pci_rombase(testval); + ln2size = 0; + if (testval != 0) { + while ((testval & 1) == 0) + { + ln2size++; + testval >>= 1; + } + } + return (ln2size); +} + /* return log2 of address range supported by map register */ static int @@ -1581,6 +1626,40 @@ pci_ht_map_msi(device_t dev, uint64_t addr) } } +int +pci_get_max_read_req(device_t dev) +{ + int cap; + uint16_t val; + + if (pci_find_extcap(dev, PCIY_EXPRESS, &cap) != 0) + return (0); + val = pci_read_config(dev, cap + PCIR_EXPRESS_DEVICE_CTL, 2); + val &= PCIM_EXP_CTL_MAX_READ_REQUEST; + val >>= 12; + return (1 << (val + 7)); +} + +int +pci_set_max_read_req(device_t dev, int size) +{ + int cap; + uint16_t val; + + if (pci_find_extcap(dev, PCIY_EXPRESS, &cap) != 0) + return (0); + if (size < 128) + size = 128; + if (size > 4096) + size = 4096; + size = (1 << (fls(size) - 1)); + val = pci_read_config(dev, cap + PCIR_EXPRESS_DEVICE_CTL, 2); + val &= ~PCIM_EXP_CTL_MAX_READ_REQUEST; + val |= (fls(size) - 8) << 12; + pci_write_config(dev, cap + PCIR_EXPRESS_DEVICE_CTL, val, 2); + return (size); +} + /* * Support for MSI message signalled interrupts. */ @@ -2265,6 +2344,21 @@ pci_read_bar(device_t dev, int reg, pci_addr_t *mapp, pci_addr_t *testvalp) int ln2range; uint16_t cmd; + /* + * The device ROM BAR is special. It is always a 32-bit + * memory BAR. Bit 0 is special and should not be set when + * sizing the BAR. + */ + if (reg == PCIR_BIOS) { + map = pci_read_config(dev, reg, 4); + pci_write_config(dev, reg, 0xfffffffe, 4); + testval = pci_read_config(dev, reg, 4); + pci_write_config(dev, reg, map, 4); + *mapp = map; + *testvalp = testval; + return; + } + map = pci_read_config(dev, reg, 4); ln2range = pci_maprange(map); if (ln2range == 64) @@ -2312,6 +2406,10 @@ pci_write_bar(device_t dev, int reg, pci_addr_t base) int ln2range; map = pci_read_config(dev, reg, 4); + + /* The device ROM BAR is always 32-bits. */ + if (reg == PCIR_BIOS) + return; ln2range = pci_maprange(map); pci_write_config(dev, reg, base, 4); if (ln2range == 64) @@ -2436,7 +2534,7 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl, * driver for this device will later inherit this resource in * pci_alloc_resource(). */ - res = resource_list_alloc(rl, bus, dev, type, ®, start, end, count, + res = resource_list_reserve(rl, bus, dev, type, ®, start, end, count, prefetch ? RF_PREFETCHABLE : 0); if (res == NULL) { /* @@ -2447,10 +2545,8 @@ pci_add_map(device_t bus, device_t dev, int reg, struct resource_list *rl, */ resource_list_delete(rl, type, reg); start = 0; - } else { + } else start = rman_get_start(res); - rman_set_device(res, bus); - } pci_write_bar(dev, reg, start); return (barlen); } @@ -2489,14 +2585,12 @@ pci_ata_maps(device_t bus, device_t dev, struct resource_list *rl, int force, } else { rid = PCIR_BAR(0); resource_list_add(rl, type, rid, 0x1f0, 0x1f7, 8); - r = resource_list_alloc(rl, bus, dev, type, &rid, 0x1f0, 0x1f7, - 8, 0); - rman_set_device(r, bus); + r = resource_list_reserve(rl, bus, dev, type, &rid, 0x1f0, + 0x1f7, 8, 0); rid = PCIR_BAR(1); resource_list_add(rl, type, rid, 0x3f6, 0x3f6, 1); - r = resource_list_alloc(rl, bus, dev, type, &rid, 0x3f6, 0x3f6, - 1, 0); - rman_set_device(r, bus); + r = resource_list_reserve(rl, bus, dev, type, &rid, 0x3f6, + 0x3f6, 1, 0); } if (progif & PCIP_STORAGE_IDE_MODESEC) { pci_add_map(bus, dev, PCIR_BAR(2), rl, force, @@ -2506,14 +2600,12 @@ pci_ata_maps(device_t bus, device_t dev, struct resource_list *rl, int force, } else { rid = PCIR_BAR(2); resource_list_add(rl, type, rid, 0x170, 0x177, 8); - r = resource_list_alloc(rl, bus, dev, type, &rid, 0x170, 0x177, - 8, 0); - rman_set_device(r, bus); + r = resource_list_reserve(rl, bus, dev, type, &rid, 0x170, + 0x177, 8, 0); rid = PCIR_BAR(3); resource_list_add(rl, type, rid, 0x376, 0x376, 1); - r = resource_list_alloc(rl, bus, dev, type, &rid, 0x376, 0x376, - 1, 0); - rman_set_device(r, bus); + r = resource_list_reserve(rl, bus, dev, type, &rid, 0x376, + 0x376, 1, 0); } pci_add_map(bus, dev, PCIR_BAR(4), rl, force, prefetchmask & (1 << 4)); @@ -2569,6 +2661,123 @@ pci_assign_interrupt(device_t bus, device_t dev, int force_route) resource_list_add(&dinfo->resources, SYS_RES_IRQ, 0, irq, irq, 1); } +/* Perform early OHCI takeover from SMM. */ +static void +ohci_early_takeover(device_t self) +{ + struct resource *res; + uint32_t ctl; + int rid; + int i; + + rid = PCIR_BAR(0); + res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); + if (res == NULL) + return; + + ctl = bus_read_4(res, OHCI_CONTROL); + if (ctl & OHCI_IR) { + if (bootverbose) + printf("ohci early: " + "SMM active, request owner change\n"); + bus_write_4(res, OHCI_COMMAND_STATUS, OHCI_OCR); + for (i = 0; (i < 100) && (ctl & OHCI_IR); i++) { + DELAY(1000); + ctl = bus_read_4(res, OHCI_CONTROL); + } + if (ctl & OHCI_IR) { + if (bootverbose) + printf("ohci early: " + "SMM does not respond, resetting\n"); + bus_write_4(res, OHCI_CONTROL, OHCI_HCFS_RESET); + } + /* Disable interrupts */ + bus_write_4(res, OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS); + } + + bus_release_resource(self, SYS_RES_MEMORY, rid, res); +} + +/* Perform early UHCI takeover from SMM. */ +static void +uhci_early_takeover(device_t self) +{ + struct resource *res; + int rid; + + /* + * Set the PIRQD enable bit and switch off all the others. We don't + * want legacy support to interfere with us XXX Does this also mean + * that the BIOS won't touch the keyboard anymore if it is connected + * to the ports of the root hub? + */ + pci_write_config(self, PCI_LEGSUP, PCI_LEGSUP_USBPIRQDEN, 2); + + /* Disable interrupts */ + rid = PCI_UHCI_BASE_REG; + res = bus_alloc_resource_any(self, SYS_RES_IOPORT, &rid, RF_ACTIVE); + if (res != NULL) { + bus_write_2(res, UHCI_INTR, 0); + bus_release_resource(self, SYS_RES_IOPORT, rid, res); + } +} + +/* Perform early EHCI takeover from SMM. */ +static void +ehci_early_takeover(device_t self) +{ + struct resource *res; + uint32_t cparams; + uint32_t eec; + uint8_t eecp; + uint8_t bios_sem; + uint8_t offs; + int rid; + int i; + + rid = PCIR_BAR(0); + res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); + if (res == NULL) + return; + + cparams = bus_read_4(res, EHCI_HCCPARAMS); + + /* Synchronise with the BIOS if it owns the controller. */ + for (eecp = EHCI_HCC_EECP(cparams); eecp != 0; + eecp = EHCI_EECP_NEXT(eec)) { + eec = pci_read_config(self, eecp, 4); + if (EHCI_EECP_ID(eec) != EHCI_EC_LEGSUP) { + continue; + } + bios_sem = pci_read_config(self, eecp + + EHCI_LEGSUP_BIOS_SEM, 1); + if (bios_sem == 0) { + continue; + } + if (bootverbose) + printf("ehci early: " + "SMM active, request owner change\n"); + + pci_write_config(self, eecp + EHCI_LEGSUP_OS_SEM, 1, 1); + + for (i = 0; (i < 100) && (bios_sem != 0); i++) { + DELAY(1000); + bios_sem = pci_read_config(self, eecp + + EHCI_LEGSUP_BIOS_SEM, 1); + } + + if (bios_sem != 0) { + if (bootverbose) + printf("ehci early: " + "SMM does not respond\n"); + } + /* Disable interrupts */ + offs = bus_read_1(res, EHCI_CAPLENGTH); + bus_write_4(res, offs + EHCI_USBINTR, 0); + } + bus_release_resource(self, SYS_RES_MEMORY, rid, res); +} + void pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask) { @@ -2612,6 +2821,16 @@ pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask) pci_assign_interrupt(bus, dev, 0); #endif } + + if (pci_usb_takeover && pci_get_class(dev) == PCIC_SERIALBUS && + pci_get_subclass(dev) == PCIS_SERIALBUS_USB) { + if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_EHCI) + ehci_early_takeover(dev); + else if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_OHCI) + ohci_early_takeover(dev); + else if (pci_get_progif(dev) == PCIP_SERIALBUS_USB_UHCI) + uhci_early_takeover(dev); + } } void @@ -3422,7 +3641,7 @@ DB_SHOW_COMMAND(pciregs, db_pci_dump) #endif /* DDB */ static struct resource * -pci_alloc_map(device_t dev, device_t child, int type, int *rid, +pci_reserve_map(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { struct pci_devinfo *dinfo = device_get_ivars(child); @@ -3443,10 +3662,11 @@ pci_alloc_map(device_t dev, device_t child, int type, int *rid, pci_read_bar(child, *rid, &map, &testval); /* Ignore a BAR with a base of 0. */ - if (pci_mapbase(testval) == 0) + if ((*rid == PCIR_BIOS && pci_rombase(testval) == 0) || + pci_mapbase(testval) == 0) goto out; - if (PCI_BAR_MEM(testval)) { + if (PCI_BAR_MEM(testval) || *rid == PCIR_BIOS) { if (type != SYS_RES_MEMORY) { if (bootverbose) device_printf(dev, @@ -3472,8 +3692,13 @@ pci_alloc_map(device_t dev, device_t child, int type, int *rid, * actually uses and we would otherwise have a * situation where we might allocate the excess to * another driver, which won't work. + * + * Device ROM BARs use a different mask value. */ - mapsize = pci_mapsize(testval); + if (*rid == PCIR_BIOS) + mapsize = pci_romsize(testval); + else + mapsize = pci_mapsize(testval); count = 1UL << mapsize; if (RF_ALIGNMENT(flags) < mapsize) flags = (flags & ~RF_ALIGNMENT_MASK) | RF_ALIGNMENT_LOG2(mapsize); @@ -3492,15 +3717,15 @@ pci_alloc_map(device_t dev, device_t child, int type, int *rid, count, *rid, type, start, end); goto out; } - rman_set_device(res, dev); resource_list_add(rl, type, *rid, start, end, count); rle = resource_list_find(rl, type, *rid); if (rle == NULL) - panic("pci_alloc_map: unexpectedly can't find resource."); + panic("pci_reserve_map: unexpectedly can't find resource."); rle->res = res; rle->start = rman_get_start(res); rle->end = rman_get_end(res); rle->count = count; + rle->flags = RLE_RESERVED; if (bootverbose) device_printf(child, "Lazy allocation of %#lx bytes rid %#x type %d at %#lx\n", @@ -3550,71 +3775,19 @@ pci_alloc_resource(device_t dev, device_t child, int type, int *rid, break; case SYS_RES_IOPORT: case SYS_RES_MEMORY: - /* Allocate resources for this BAR if needed. */ + /* Reserve resources for this BAR if needed. */ rle = resource_list_find(rl, type, *rid); if (rle == NULL) { - res = pci_alloc_map(dev, child, type, rid, start, end, + res = pci_reserve_map(dev, child, type, rid, start, end, count, flags); if (res == NULL) return (NULL); - rle = resource_list_find(rl, type, *rid); - } - - /* - * If the resource belongs to the bus, then give it to - * the child. We need to activate it if requested - * since the bus always allocates inactive resources. - */ - if (rle != NULL && rle->res != NULL && - rman_get_device(rle->res) == dev) { - if (bootverbose) - device_printf(child, - "Reserved %#lx bytes for rid %#x type %d at %#lx\n", - rman_get_size(rle->res), *rid, type, - rman_get_start(rle->res)); - rman_set_device(rle->res, child); - if ((flags & RF_ACTIVE) && - bus_activate_resource(child, type, *rid, - rle->res) != 0) - return (NULL); - return (rle->res); } } return (resource_list_alloc(rl, dev, child, type, rid, start, end, count, flags)); } -int -pci_release_resource(device_t dev, device_t child, int type, int rid, - struct resource *r) -{ - int error; - - if (device_get_parent(child) != dev) - return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child, - type, rid, r)); - - /* - * For BARs we don't actually want to release the resource. - * Instead, we deactivate the resource if needed and then give - * ownership of the BAR back to the bus. - */ - switch (type) { - case SYS_RES_IOPORT: - case SYS_RES_MEMORY: - if (rman_get_device(r) != child) - return (EINVAL); - if (rman_get_flags(r) & RF_ACTIVE) { - error = bus_deactivate_resource(child, type, rid, r); - if (error) - return (error); - } - rman_set_device(r, dev); - return (0); - } - return (bus_generic_rl_release_resource(dev, child, type, rid, r)); -} - int pci_activate_resource(device_t dev, device_t child, int type, int rid, struct resource *r) @@ -3627,6 +3800,10 @@ pci_activate_resource(device_t dev, device_t child, int type, int rid, /* Enable decoding in the command register when activating BARs. */ if (device_get_parent(child) == dev) { + /* Device ROMs need their decoding explicitly enabled. */ + if (rid == PCIR_BIOS) + pci_write_config(child, rid, rman_get_start(r) | + PCIM_BIOS_ENABLE, 4); switch (type) { case SYS_RES_IOPORT: case SYS_RES_MEMORY: @@ -3637,6 +3814,62 @@ pci_activate_resource(device_t dev, device_t child, int type, int rid, return (error); } +int +pci_deactivate_resource(device_t dev, device_t child, int type, + int rid, struct resource *r) +{ + int error; + + error = bus_generic_deactivate_resource(dev, child, type, rid, r); + if (error) + return (error); + + /* Disable decoding for device ROMs. */ + if (rid == PCIR_BIOS) + pci_write_config(child, rid, rman_get_start(r), 4); + return (0); +} + +void +pci_delete_child(device_t dev, device_t child) +{ + struct resource_list_entry *rle; + struct resource_list *rl; + struct pci_devinfo *dinfo; + + dinfo = device_get_ivars(child); + rl = &dinfo->resources; + + if (device_is_attached(child)) + device_detach(child); + + /* Turn off access to resources we're about to free */ + pci_write_config(child, PCIR_COMMAND, pci_read_config(child, + PCIR_COMMAND, 2) & ~(PCIM_CMD_MEMEN | PCIM_CMD_PORTEN), 2); + + /* Free all allocated resources */ + STAILQ_FOREACH(rle, rl, link) { + if (rle->res) { + if (rman_get_flags(rle->res) & RF_ACTIVE || + resource_list_busy(rl, rle->type, rle->rid)) { + pci_printf(&dinfo->cfg, + "Resource still owned, oops. " + "(type=%d, rid=%d, addr=%lx)\n", + rle->type, rle->rid, + rman_get_start(rle->res)); + bus_release_resource(child, rle->type, rle->rid, + rle->res); + } + resource_list_unreserve(rl, dev, child, rle->type, + rle->rid); + } + } + resource_list_free(rl); + + device_delete_child(dev, child); + pci_freecfg(dinfo); +} + void pci_delete_resource(device_t dev, device_t child, int type, int rid) { @@ -3654,13 +3887,12 @@ pci_delete_resource(device_t dev, device_t child, int type, int rid) return; if (rle->res) { - if (rman_get_device(rle->res) != dev || - rman_get_flags(rle->res) & RF_ACTIVE) { + if (rman_get_flags(rle->res) & RF_ACTIVE || + resource_list_busy(rl, type, rid)) { device_printf(dev, "delete_resource: " "Resource still owned by child, oops. " "(type=%d, rid=%d, addr=%lx)\n", - rle->type, rle->rid, - rman_get_start(rle->res)); + type, rid, rman_get_start(rle->res)); return; } @@ -3676,7 +3908,7 @@ pci_delete_resource(device_t dev, device_t child, int type, int rid) break; } #endif - bus_release_resource(dev, type, rid, rle->res); + resource_list_unreserve(rl, dev, child, type, rid); } resource_list_delete(rl, type, rid); } diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c index 15cad92484d7..996d27455270 100644 --- a/sys/dev/pci/pci_pci.c +++ b/sys/dev/pci/pci_pci.c @@ -52,7 +52,18 @@ __FBSDID("$FreeBSD$"); #include "pcib_if.h" +#ifdef __HAVE_ACPI +#include +#include "acpi_if.h" +#else +#define ACPI_PWR_FOR_SLEEP(x, y, z) +#endif + +extern int pci_do_power_resume; + static int pcib_probe(device_t dev); +static int pcib_suspend(device_t dev); +static int pcib_resume(device_t dev); static device_method_t pcib_methods[] = { /* Device interface */ @@ -60,8 +71,8 @@ static device_method_t pcib_methods[] = { DEVMETHOD(device_attach, pcib_attach), DEVMETHOD(device_detach, bus_generic_detach), DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), + DEVMETHOD(device_suspend, pcib_suspend), + DEVMETHOD(device_resume, pcib_resume), /* Bus interface */ DEVMETHOD(bus_print_child, bus_generic_print_child), @@ -120,6 +131,154 @@ pcib_is_io_open(struct pcib_softc *sc) return (sc->iobase > 0 && sc->iobase < sc->iolimit); } +/* + * Get current I/O decode. + */ +static void +pcib_get_io_decode(struct pcib_softc *sc) +{ + device_t dev; + uint32_t iolow; + + dev = sc->dev; + + iolow = pci_read_config(dev, PCIR_IOBASEL_1, 1); + if ((iolow & PCIM_BRIO_MASK) == PCIM_BRIO_32) + sc->iobase = PCI_PPBIOBASE( + pci_read_config(dev, PCIR_IOBASEH_1, 2), iolow); + else + sc->iobase = PCI_PPBIOBASE(0, iolow); + + iolow = pci_read_config(dev, PCIR_IOLIMITL_1, 1); + if ((iolow & PCIM_BRIO_MASK) == PCIM_BRIO_32) + sc->iolimit = PCI_PPBIOLIMIT( + pci_read_config(dev, PCIR_IOLIMITH_1, 2), iolow); + else + sc->iolimit = PCI_PPBIOLIMIT(0, iolow); +} + +/* + * Get current memory decode. + */ +static void +pcib_get_mem_decode(struct pcib_softc *sc) +{ + device_t dev; + pci_addr_t pmemlow; + + dev = sc->dev; + + sc->membase = PCI_PPBMEMBASE(0, + pci_read_config(dev, PCIR_MEMBASE_1, 2)); + sc->memlimit = PCI_PPBMEMLIMIT(0, + pci_read_config(dev, PCIR_MEMLIMIT_1, 2)); + + pmemlow = pci_read_config(dev, PCIR_PMBASEL_1, 2); + if ((pmemlow & PCIM_BRPM_MASK) == PCIM_BRPM_64) + sc->pmembase = PCI_PPBMEMBASE( + pci_read_config(dev, PCIR_PMBASEH_1, 4), pmemlow); + else + sc->pmembase = PCI_PPBMEMBASE(0, pmemlow); + + pmemlow = pci_read_config(dev, PCIR_PMLIMITL_1, 2); + if ((pmemlow & PCIM_BRPM_MASK) == PCIM_BRPM_64) + sc->pmemlimit = PCI_PPBMEMLIMIT( + pci_read_config(dev, PCIR_PMLIMITH_1, 4), pmemlow); + else + sc->pmemlimit = PCI_PPBMEMLIMIT(0, pmemlow); +} + +/* + * Restore previous I/O decode. + */ +static void +pcib_set_io_decode(struct pcib_softc *sc) +{ + device_t dev; + uint32_t iohi; + + dev = sc->dev; + + iohi = sc->iobase >> 16; + if (iohi > 0) + pci_write_config(dev, PCIR_IOBASEH_1, iohi, 2); + pci_write_config(dev, PCIR_IOBASEL_1, sc->iobase >> 8, 1); + + iohi = sc->iolimit >> 16; + if (iohi > 0) + pci_write_config(dev, PCIR_IOLIMITH_1, iohi, 2); + pci_write_config(dev, PCIR_IOLIMITL_1, sc->iolimit >> 8, 1); +} + +/* + * Restore previous memory decode. + */ +static void +pcib_set_mem_decode(struct pcib_softc *sc) +{ + device_t dev; + pci_addr_t pmemhi; + + dev = sc->dev; + + pci_write_config(dev, PCIR_MEMBASE_1, sc->membase >> 16, 2); + pci_write_config(dev, PCIR_MEMLIMIT_1, sc->memlimit >> 16, 2); + + pmemhi = sc->pmembase >> 32; + if (pmemhi > 0) + pci_write_config(dev, PCIR_PMBASEH_1, pmemhi, 4); + pci_write_config(dev, PCIR_PMBASEL_1, sc->pmembase >> 16, 2); + + pmemhi = sc->pmemlimit >> 32; + if (pmemhi > 0) + pci_write_config(dev, PCIR_PMLIMITH_1, pmemhi, 4); + pci_write_config(dev, PCIR_PMLIMITL_1, sc->pmemlimit >> 16, 2); +} + +/* + * Get current bridge configuration. + */ +static void +pcib_cfg_save(struct pcib_softc *sc) +{ + device_t dev; + + dev = sc->dev; + + sc->command = pci_read_config(dev, PCIR_COMMAND, 2); + sc->pribus = pci_read_config(dev, PCIR_PRIBUS_1, 1); + sc->secbus = pci_read_config(dev, PCIR_SECBUS_1, 1); + sc->subbus = pci_read_config(dev, PCIR_SUBBUS_1, 1); + sc->bridgectl = pci_read_config(dev, PCIR_BRIDGECTL_1, 2); + sc->seclat = pci_read_config(dev, PCIR_SECLAT_1, 1); + if (sc->command & PCIM_CMD_PORTEN) + pcib_get_io_decode(sc); + if (sc->command & PCIM_CMD_MEMEN) + pcib_get_mem_decode(sc); +} + +/* + * Restore previous bridge configuration. + */ +static void +pcib_cfg_restore(struct pcib_softc *sc) +{ + device_t dev; + + dev = sc->dev; + + pci_write_config(dev, PCIR_COMMAND, sc->command, 2); + pci_write_config(dev, PCIR_PRIBUS_1, sc->pribus, 1); + pci_write_config(dev, PCIR_SECBUS_1, sc->secbus, 1); + pci_write_config(dev, PCIR_SUBBUS_1, sc->subbus, 1); + pci_write_config(dev, PCIR_BRIDGECTL_1, sc->bridgectl, 2); + pci_write_config(dev, PCIR_SECLAT_1, sc->seclat, 1); + if (sc->command & PCIM_CMD_PORTEN) + pcib_set_io_decode(sc); + if (sc->command & PCIM_CMD_MEMEN) + pcib_set_mem_decode(sc); +} + /* * Generic device interface */ @@ -138,7 +297,6 @@ void pcib_attach_common(device_t dev) { struct pcib_softc *sc; - uint8_t iolow; struct sysctl_ctx_list *sctx; struct sysctl_oid *soid; @@ -148,14 +306,9 @@ pcib_attach_common(device_t dev) /* * Get current bridge configuration. */ - sc->command = pci_read_config(dev, PCIR_COMMAND, 1); - sc->domain = pci_get_domain(dev); - sc->pribus = pci_read_config(dev, PCIR_PRIBUS_1, 1); - sc->secbus = pci_read_config(dev, PCIR_SECBUS_1, 1); - sc->subbus = pci_read_config(dev, PCIR_SUBBUS_1, 1); - sc->secstat = pci_read_config(dev, PCIR_SECSTAT_1, 2); - sc->bridgectl = pci_read_config(dev, PCIR_BRIDGECTL_1, 2); - sc->seclat = pci_read_config(dev, PCIR_SECLAT_1, 1); + sc->domain = pci_get_domain(dev); + sc->secstat = pci_read_config(dev, PCIR_SECSTAT_1, 2); + pcib_cfg_save(sc); /* * Setup sysctl reporting nodes @@ -171,51 +324,6 @@ pcib_attach_common(device_t dev) SYSCTL_ADD_UINT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "subbus", CTLFLAG_RD, &sc->subbus, 0, "Subordinate bus number"); - /* - * Determine current I/O decode. - */ - if (sc->command & PCIM_CMD_PORTEN) { - iolow = pci_read_config(dev, PCIR_IOBASEL_1, 1); - if ((iolow & PCIM_BRIO_MASK) == PCIM_BRIO_32) { - sc->iobase = PCI_PPBIOBASE(pci_read_config(dev, PCIR_IOBASEH_1, 2), - pci_read_config(dev, PCIR_IOBASEL_1, 1)); - } else { - sc->iobase = PCI_PPBIOBASE(0, pci_read_config(dev, PCIR_IOBASEL_1, 1)); - } - - iolow = pci_read_config(dev, PCIR_IOLIMITL_1, 1); - if ((iolow & PCIM_BRIO_MASK) == PCIM_BRIO_32) { - sc->iolimit = PCI_PPBIOLIMIT(pci_read_config(dev, PCIR_IOLIMITH_1, 2), - pci_read_config(dev, PCIR_IOLIMITL_1, 1)); - } else { - sc->iolimit = PCI_PPBIOLIMIT(0, pci_read_config(dev, PCIR_IOLIMITL_1, 1)); - } - } - - /* - * Determine current memory decode. - */ - if (sc->command & PCIM_CMD_MEMEN) { - sc->membase = PCI_PPBMEMBASE(0, pci_read_config(dev, PCIR_MEMBASE_1, 2)); - sc->memlimit = PCI_PPBMEMLIMIT(0, pci_read_config(dev, PCIR_MEMLIMIT_1, 2)); - iolow = pci_read_config(dev, PCIR_PMBASEL_1, 1); - if ((iolow & PCIM_BRPM_MASK) == PCIM_BRPM_64) - sc->pmembase = PCI_PPBMEMBASE( - pci_read_config(dev, PCIR_PMBASEH_1, 4), - pci_read_config(dev, PCIR_PMBASEL_1, 2)); - else - sc->pmembase = PCI_PPBMEMBASE(0, - pci_read_config(dev, PCIR_PMBASEL_1, 2)); - iolow = pci_read_config(dev, PCIR_PMLIMITL_1, 1); - if ((iolow & PCIM_BRPM_MASK) == PCIM_BRPM_64) - sc->pmemlimit = PCI_PPBMEMLIMIT( - pci_read_config(dev, PCIR_PMLIMITH_1, 4), - pci_read_config(dev, PCIR_PMLIMITL_1, 2)); - else - sc->pmemlimit = PCI_PPBMEMLIMIT(0, - pci_read_config(dev, PCIR_PMLIMITL_1, 2)); - } - /* * Quirk handling. */ @@ -336,6 +444,41 @@ pcib_attach(device_t dev) return(0); } +int +pcib_suspend(device_t dev) +{ + device_t acpi_dev; + int dstate, error; + + pcib_cfg_save(device_get_softc(dev)); + error = bus_generic_suspend(dev); + if (error == 0 && pci_do_power_resume) { + acpi_dev = devclass_get_device(devclass_find("acpi"), 0); + if (acpi_dev != NULL) { + dstate = PCI_POWERSTATE_D3; + ACPI_PWR_FOR_SLEEP(acpi_dev, dev, &dstate); + pci_set_powerstate(dev, dstate); + } + } + return (error); +} + +int +pcib_resume(device_t dev) +{ + device_t acpi_dev; + + if (pci_do_power_resume) { + acpi_dev = devclass_get_device(devclass_find("acpi"), 0); + if (acpi_dev != NULL) { + ACPI_PWR_FOR_SLEEP(acpi_dev, dev, NULL); + pci_set_powerstate(dev, PCI_POWERSTATE_D0); + } + } + pcib_cfg_restore(device_get_softc(dev)); + return (bus_generic_resume(dev)); +} + int pcib_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) { diff --git a/sys/dev/pci/pci_private.h b/sys/dev/pci/pci_private.h index e45afb7ac1c3..2240b4f2c0d8 100644 --- a/sys/dev/pci/pci_private.h +++ b/sys/dev/pci/pci_private.h @@ -43,6 +43,7 @@ void pci_add_children(device_t dev, int domain, int busno, void pci_add_child(device_t bus, struct pci_devinfo *dinfo); void pci_add_resources(device_t bus, device_t dev, int force, uint32_t prefetchmask); +void pci_delete_child(device_t dev, device_t child); void pci_driver_added(device_t dev, driver_t *driver); int pci_print_child(device_t dev, device_t child); void pci_probe_nomatch(device_t dev, device_t child); @@ -82,10 +83,10 @@ int pci_msix_count_method(device_t dev, device_t child); struct resource *pci_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags); -int pci_release_resource(device_t dev, device_t child, int type, - int rid, struct resource *r); int pci_activate_resource(device_t dev, device_t child, int type, int rid, struct resource *r); +int pci_deactivate_resource(device_t dev, device_t child, int type, + int rid, struct resource *r); void pci_delete_resource(device_t dev, device_t child, int type, int rid); struct resource_list *pci_get_resource_list (device_t dev, device_t child); diff --git a/sys/dev/pci/pcireg.h b/sys/dev/pci/pcireg.h index 981d1e0cde4e..54ed1f3124df 100644 --- a/sys/dev/pci/pcireg.h +++ b/sys/dev/pci/pcireg.h @@ -605,9 +605,17 @@ #define PCIR_EXPRESS_DEVICE_CAP 0x4 #define PCIM_EXP_CAP_MAX_PAYLOAD 0x0007 #define PCIR_EXPRESS_DEVICE_CTL 0x8 +#define PCIM_EXP_CTL_RELAXED_ORD_ENABLE 0x0010 #define PCIM_EXP_CTL_MAX_PAYLOAD 0x00e0 +#define PCIM_EXP_CTL_NOSNOOP_ENABLE 0x0800 #define PCIM_EXP_CTL_MAX_READ_REQUEST 0x7000 #define PCIR_EXPRESS_DEVICE_STA 0xa +#define PCIM_EXP_STA_CORRECTABLE_ERROR 0x0001 +#define PCIM_EXP_STA_NON_FATAL_ERROR 0x0002 +#define PCIM_EXP_STA_FATAL_ERROR 0x0004 +#define PCIM_EXP_STA_UNSUPPORTED_REQ 0x0008 +#define PCIM_EXP_STA_AUX_POWER 0x0010 +#define PCIM_EXP_STA_TRANSACTION_PND 0x0020 #define PCIR_EXPRESS_LINK_CAP 0xc #define PCIM_LINK_CAP_MAX_SPEED 0x0000000f #define PCIM_LINK_CAP_MAX_WIDTH 0x000003f0 diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h index d7de96e65625..948370813e2d 100644 --- a/sys/dev/pci/pcivar.h +++ b/sys/dev/pci/pcivar.h @@ -458,6 +458,9 @@ int pci_msi_device_blacklisted(device_t dev); void pci_ht_map_msi(device_t dev, uint64_t addr); +int pci_get_max_read_req(device_t dev); +int pci_set_max_read_req(device_t dev, int size); + #endif /* _SYS_BUS_H_ */ /* diff --git a/sys/dev/pci/vga_pci.c b/sys/dev/pci/vga_pci.c index 3e5b1a64bdd0..19fe9df7beb9 100644 --- a/sys/dev/pci/vga_pci.c +++ b/sys/dev/pci/vga_pci.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -58,9 +59,19 @@ struct vga_pci_softc { struct vga_resource vga_res[PCIR_MAX_BAR_0 + 1]; }; +SYSCTL_DECL(_hw_pci); + +int vga_pci_default_unit = -1; +TUNABLE_INT("hw.pci.default_vgapci_unit", &vga_pci_default_unit); +SYSCTL_INT(_hw_pci, OID_AUTO, default_vgapci_unit, CTLFLAG_RDTUN, + &vga_pci_default_unit, -1, "Default VGA-compatible display"); + static int vga_pci_probe(device_t dev) { + device_t bdev; + int unit; + uint16_t bctl; switch (pci_get_class(dev)) { case PCIC_DISPLAY: @@ -72,6 +83,16 @@ vga_pci_probe(device_t dev) default: return (ENXIO); } + + /* Probe default display. */ + unit = device_get_unit(dev); + bdev = device_get_parent(device_get_parent(dev)); + bctl = pci_read_config(bdev, PCIR_BRIDGECTL_1, 2); + if (vga_pci_default_unit < 0 && (bctl & PCIB_BCR_VGA_ENABLE) != 0) + vga_pci_default_unit = unit; + if (vga_pci_default_unit == unit) + device_set_flags(dev, 1); + device_set_desc(dev, "VGA-compatible display"); return (BUS_PROBE_GENERIC); } diff --git a/sys/dev/pcn/if_pcn.c b/sys/dev/pcn/if_pcn.c index c52c22be3944..6295a46b5bd5 100644 --- a/sys/dev/pcn/if_pcn.c +++ b/sys/dev/pcn/if_pcn.c @@ -143,7 +143,7 @@ static int pcn_ioctl(struct ifnet *, u_long, caddr_t); static void pcn_init(void *); static void pcn_init_locked(struct pcn_softc *); static void pcn_stop(struct pcn_softc *); -static void pcn_watchdog(struct ifnet *); +static void pcn_watchdog(struct pcn_softc *); static int pcn_shutdown(device_t); static int pcn_ifmedia_upd(struct ifnet *); static void pcn_ifmedia_sts(struct ifnet *, struct ifmediareq *); @@ -630,7 +630,6 @@ pcn_attach(dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = pcn_ioctl; ifp->if_start = pcn_start; - ifp->if_watchdog = pcn_watchdog; ifp->if_init = pcn_init; ifp->if_snd.ifq_maxlen = PCN_TX_LIST_CNT - 1; @@ -948,7 +947,7 @@ pcn_txeof(sc) sc->pcn_cdata.pcn_tx_cons = idx; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; } - ifp->if_timer = (sc->pcn_cdata.pcn_tx_cnt == 0) ? 0 : 5; + sc->pcn_timer = (sc->pcn_cdata.pcn_tx_cnt == 0) ? 0 : 5; return; } @@ -980,6 +979,8 @@ pcn_tick(xsc) pcn_start_locked(ifp); } + if (sc->pcn_timer > 0 && --sc->pcn_timer == 0) + pcn_watchdog(sc); callout_reset(&sc->pcn_stat_callout, hz, pcn_tick, sc); return; @@ -1147,7 +1148,7 @@ pcn_start_locked(ifp) /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->pcn_timer = 5; return; } @@ -1429,14 +1430,12 @@ pcn_ioctl(ifp, command, data) } static void -pcn_watchdog(ifp) - struct ifnet *ifp; +pcn_watchdog(struct pcn_softc *sc) { - struct pcn_softc *sc; + struct ifnet *ifp; - sc = ifp->if_softc; - - PCN_LOCK(sc); + PCN_LOCK_ASSERT(sc); + ifp = sc->pcn_ifp; ifp->if_oerrors++; if_printf(ifp, "watchdog timeout\n"); @@ -1447,10 +1446,6 @@ pcn_watchdog(ifp) if (ifp->if_snd.ifq_head != NULL) pcn_start_locked(ifp); - - PCN_UNLOCK(sc); - - return; } /* @@ -1465,7 +1460,7 @@ pcn_stop(struct pcn_softc *sc) PCN_LOCK_ASSERT(sc); ifp = sc->pcn_ifp; - ifp->if_timer = 0; + sc->pcn_timer = 0; callout_stop(&sc->pcn_stat_callout); diff --git a/sys/dev/pcn/if_pcnreg.h b/sys/dev/pcn/if_pcnreg.h index 406d4380be01..a10edfd76aa4 100644 --- a/sys/dev/pcn/if_pcnreg.h +++ b/sys/dev/pcn/if_pcnreg.h @@ -465,6 +465,7 @@ struct pcn_softc { struct pcn_ring_data pcn_cdata; struct callout pcn_stat_callout; struct mtx pcn_mtx; + int pcn_timer; }; #define PCN_LOCK(_sc) mtx_lock(&(_sc)->pcn_mtx) diff --git a/sys/dev/pdq/if_fea.c b/sys/dev/pdq/if_fea.c index a2cb27fe7aa3..bcdbfc032e66 100644 --- a/sys/dev/pdq/if_fea.c +++ b/sys/dev/pdq/if_fea.c @@ -140,7 +140,7 @@ pdq_eisa_probe (dev) u_int32_t maddr; u_int32_t msize; - u_int32_t eisa_id = eisa_get_id(dev);; + u_int32_t eisa_id = eisa_get_id(dev); desc = pdq_eisa_match(eisa_id); if (!desc) { @@ -163,11 +163,9 @@ static void pdq_eisa_ifintr(arg) void * arg; { - device_t dev; pdq_softc_t * sc; - dev = (device_t)arg; - sc = device_get_softc(dev); + sc = arg; PDQ_LOCK(sc); (void) pdq_interrupt(sc->sc_pdq); @@ -181,11 +179,9 @@ pdq_eisa_attach (dev) device_t dev; { pdq_softc_t * sc; - struct ifnet * ifp; int error; sc = device_get_softc(dev); - ifp = sc->ifp; sc->dev = dev; @@ -222,28 +218,20 @@ pdq_eisa_attach (dev) goto bad; } - if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - pdq_eisa_devinit(sc); - sc->sc_pdq = pdq_initialize(sc->mem_bst, sc->mem_bsh, - ifp->if_xname, -1, - (void *)sc, PDQ_DEFEA); - if (sc->sc_pdq == NULL) { - device_printf(dev, "Initialization failed.\n"); - error = ENXIO; + error = pdq_ifattach(sc, sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, + PDQ_DEFEA); + if (error) goto bad; - } - error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, - NULL, pdq_eisa_ifintr, dev, &sc->irq_ih); + error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, + NULL, pdq_eisa_ifintr, sc, &sc->irq_ih); if (error) { device_printf(dev, "Failed to setup interrupt handler.\n"); - error = ENXIO; - goto bad; + pdq_ifdetach(sc); + return (error); } - pdq_ifattach(sc, sc->sc_pdq->pdq_hwaddr.lanaddr_bytes); - return (0); bad: pdq_free(dev); @@ -269,7 +257,9 @@ pdq_eisa_shutdown(dev) pdq_softc_t * sc; sc = device_get_softc(dev); + PDQ_LOCK(sc); pdq_hwreset(sc->sc_pdq); + PDQ_UNLOCK(sc); return (0); } diff --git a/sys/dev/pdq/if_fpa.c b/sys/dev/pdq/if_fpa.c index ced3b8f76633..3fe88add845d 100644 --- a/sys/dev/pdq/if_fpa.c +++ b/sys/dev/pdq/if_fpa.c @@ -73,11 +73,9 @@ static void pdq_pci_ifintr (void *); static void pdq_pci_ifintr(void *arg) { - device_t dev; pdq_softc_t *sc; - dev = (device_t)arg; - sc = device_get_softc(dev); + sc = arg; PDQ_LOCK(sc); (void) pdq_interrupt(sc->sc_pdq); @@ -105,12 +103,10 @@ static int pdq_pci_attach(device_t dev) { pdq_softc_t *sc; - struct ifnet *ifp; u_int32_t command; int error; sc = device_get_softc(dev); - ifp = sc->ifp; sc->dev = dev; @@ -146,26 +142,18 @@ pdq_pci_attach(device_t dev) goto bad; } - if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - - sc->sc_pdq = pdq_initialize(sc->mem_bst, sc->mem_bsh, - ifp->if_xname, -1, - (void *)sc, PDQ_DEFPA); - if (sc->sc_pdq == NULL) { - device_printf(dev, "Initialization failed.\n"); - error = ENXIO; + error = pdq_ifattach(sc, sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, PDQ_DEFPA); + if (error) goto bad; - } - - error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, NULL, - pdq_pci_ifintr, dev, &sc->irq_ih); + + error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, NULL, + pdq_pci_ifintr, sc, &sc->irq_ih); if (error) { device_printf(dev, "Failed to setup interrupt handler.\n"); - error = ENXIO; - goto bad; + pdq_ifdetach(sc); + return (error); } - pdq_ifattach(sc, sc->sc_pdq->pdq_hwaddr.lanaddr_bytes); return (0); bad: @@ -191,7 +179,9 @@ pdq_pci_shutdown(device_t dev) pdq_softc_t *sc; sc = device_get_softc(dev); + PDQ_LOCK(sc); pdq_hwreset(sc->sc_pdq); + PDQ_UNLOCK(sc); return (0); } diff --git a/sys/dev/pdq/pdq_freebsd.h b/sys/dev/pdq/pdq_freebsd.h index cdbf3893e904..6efd6849b4e7 100644 --- a/sys/dev/pdq/pdq_freebsd.h +++ b/sys/dev/pdq/pdq_freebsd.h @@ -124,10 +124,13 @@ typedef struct _pdq_os_ctx_t { void * irq_ih; struct mtx mtx; + struct callout watchdog; + int timer; } pdq_softc_t; #define PDQ_LOCK(_sc) mtx_lock(&(_sc)->mtx) #define PDQ_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx) +#define PDQ_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->mtx, MA_OWNED) #define PDQ_OS_HDR_OFFSET PDQ_RX_FC_OFFSET @@ -255,7 +258,8 @@ pdq_state_t pdq_stop (pdq_t *pdq); * OS dependent functions provided by * pdq_ifsubr.c or pdq.c to the bus front ends */ -void pdq_ifattach (pdq_softc_t *, const pdq_uint8_t *); +int pdq_ifattach (pdq_softc_t *, const pdq_uint8_t *, + pdq_type_t type); void pdq_ifdetach (pdq_softc_t *); void pdq_free (device_t); int pdq_interrupt (pdq_t *pdq); diff --git a/sys/dev/pdq/pdq_ifsubr.c b/sys/dev/pdq/pdq_ifsubr.c index ce67b0e7d071..ec141502a9e8 100644 --- a/sys/dev/pdq/pdq_ifsubr.c +++ b/sys/dev/pdq/pdq_ifsubr.c @@ -69,10 +69,23 @@ __FBSDID("$FreeBSD$"); devclass_t pdq_devclass; +static void pdq_watchdog(void *); + static void -pdq_ifinit( - pdq_softc_t *sc) +pdq_ifstop(pdq_softc_t *sc) { + + PDQ_IFNET(sc)->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + sc->sc_pdq->pdq_flags &= ~PDQ_RUNNING; + pdq_stop(sc->sc_pdq); + callout_stop(&sc->watchdog); +} + +static void +pdq_ifinit_locked(pdq_softc_t *sc) +{ + + PDQ_LOCK_ASSERT(sc); if (PDQ_IFNET(sc)->if_flags & IFF_UP) { PDQ_IFNET(sc)->if_drv_flags |= IFF_DRV_RUNNING; if (PDQ_IFNET(sc)->if_flags & IFF_PROMISC) { @@ -87,24 +100,40 @@ pdq_ifinit( } sc->sc_pdq->pdq_flags |= PDQ_RUNNING; pdq_run(sc->sc_pdq); - } else { - PDQ_IFNET(sc)->if_drv_flags &= ~IFF_DRV_RUNNING; - sc->sc_pdq->pdq_flags &= ~PDQ_RUNNING; - pdq_stop(sc->sc_pdq); - } + callout_reset(&sc->watchdog, hz, pdq_watchdog, sc); + } else + pdq_ifstop(sc); +} + +static void +pdq_ifinit(void *arg) +{ + pdq_softc_t *sc; + + sc = arg; + PDQ_LOCK(sc); + pdq_ifinit_locked(sc); + PDQ_UNLOCK(sc); } static void -pdq_ifwatchdog( - struct ifnet *ifp) +pdq_watchdog(void *arg) { + pdq_softc_t *sc; + struct ifnet *ifp; + + sc = arg; + PDQ_LOCK_ASSERT(sc); + callout_reset(&sc->watchdog, hz, pdq_watchdog, sc); + if (sc->timer == 0 || --sc->timer > 0) + return; + /* * No progress was made on the transmit queue for PDQ_OS_TX_TRANSMIT * seconds. Remove all queued packets. */ - + ifp = PDQ_IFNET(sc); ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - ifp->if_timer = 0; for (;;) { struct mbuf *m; IFQ_DEQUEUE(&ifp->if_snd, m); @@ -115,18 +144,18 @@ pdq_ifwatchdog( } static void -pdq_ifstart( - struct ifnet *ifp) +pdq_ifstart_locked(struct ifnet *ifp) { pdq_softc_t * const sc = PDQ_OS_IFP_TO_SOFTC(ifp); struct mbuf *m; int tx = 0; + PDQ_LOCK_ASSERT(sc); if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) return; - if (PDQ_IFNET(sc)->if_timer == 0) - PDQ_IFNET(sc)->if_timer = PDQ_OS_TX_TIMEOUT; + if (sc->timer == 0) + sc->timer = PDQ_OS_TX_TIMEOUT; if ((sc->sc_pdq->pdq_flags & PDQ_TXOK) == 0) { PDQ_IFNET(sc)->if_drv_flags |= IFF_DRV_OACTIVE; @@ -177,6 +206,16 @@ pdq_ifstart( PDQ_DO_TYPE2_PRODUCER(sc->sc_pdq); sc->sc_flags &= ~PDQIF_DOWNCALL; } + +static void +pdq_ifstart(struct ifnet *ifp) +{ + pdq_softc_t * const sc = PDQ_OS_IFP_TO_SOFTC(ifp); + + PDQ_LOCK(sc); + pdq_ifstart_locked(ifp); + PDQ_UNLOCK(sc); +} void pdq_os_receive_pdu( @@ -218,7 +257,9 @@ pdq_os_receive_pdu( } m->m_pkthdr.rcvif = ifp; + PDQ_UNLOCK(sc); (*ifp->if_input)(ifp, m); + PDQ_LOCK(sc); } void @@ -228,11 +269,11 @@ pdq_os_restart_transmitter( pdq_softc_t *sc = pdq->pdq_os_ctx; PDQ_IFNET(sc)->if_drv_flags &= ~IFF_DRV_OACTIVE; if (IFQ_IS_EMPTY(&PDQ_IFNET(sc)->if_snd) == 0) { - PDQ_IFNET(sc)->if_timer = PDQ_OS_TX_TIMEOUT; + sc->timer = PDQ_OS_TX_TIMEOUT; if ((sc->sc_flags & PDQIF_DOWNCALL) == 0) - pdq_ifstart(PDQ_IFNET(sc)); + pdq_ifstart_locked(PDQ_IFNET(sc)); } else { - PDQ_IFNET(sc)->if_timer = 0; + sc->timer = 0; } } @@ -305,6 +346,7 @@ pdq_ifmedia_change( { pdq_softc_t * const sc = PDQ_OS_IFP_TO_SOFTC(ifp); + PDQ_LOCK(sc); if (sc->sc_ifmedia.ifm_media & IFM_FDX) { if ((sc->sc_pdq->pdq_flags & PDQ_WANT_FDX) == 0) { sc->sc_pdq->pdq_flags |= PDQ_WANT_FDX; @@ -316,6 +358,7 @@ pdq_ifmedia_change( if (sc->sc_pdq->pdq_flags & PDQ_RUNNING) pdq_run(sc->sc_pdq); } + PDQ_UNLOCK(sc); return 0; } @@ -327,6 +370,7 @@ pdq_ifmedia_status( { pdq_softc_t * const sc = PDQ_OS_IFP_TO_SOFTC(ifp); + PDQ_LOCK(sc); ifmr->ifm_status = IFM_AVALID; if (sc->sc_pdq->pdq_flags & PDQ_IS_ONRING) ifmr->ifm_status |= IFM_ACTIVE; @@ -334,6 +378,7 @@ pdq_ifmedia_status( ifmr->ifm_active = (ifmr->ifm_current & ~IFM_FDX); if (sc->sc_pdq->pdq_flags & PDQ_IS_FDX) ifmr->ifm_active |= IFM_FDX; + PDQ_UNLOCK(sc); } void @@ -369,8 +414,6 @@ pdq_ifioctl( pdq_softc_t *sc = PDQ_OS_IFP_TO_SOFTC(ifp); int error = 0; - PDQ_LOCK(sc); - switch (cmd) { case SIOCSIFFLAGS: { pdq_ifinit(sc); @@ -379,10 +422,12 @@ pdq_ifioctl( case SIOCADDMULTI: case SIOCDELMULTI: { + PDQ_LOCK(sc); if (PDQ_IFNET(sc)->if_drv_flags & IFF_DRV_RUNNING) { pdq_run(sc->sc_pdq); error = 0; } + PDQ_UNLOCK(sc); break; } @@ -401,7 +446,6 @@ pdq_ifioctl( } } - PDQ_UNLOCK(sc); return error; } @@ -409,25 +453,27 @@ pdq_ifioctl( #define IFF_NOTRAILERS 0 #endif -void -pdq_ifattach(pdq_softc_t *sc, const pdq_uint8_t *llc) +int +pdq_ifattach(pdq_softc_t *sc, const pdq_uint8_t *llc, pdq_type_t type) { struct ifnet *ifp; ifp = PDQ_IFNET(sc) = if_alloc(IFT_FDDI); - if (ifp == NULL) - panic("%s: can not if_alloc()", device_get_nameunit(sc->dev)); + if (ifp == NULL) { + device_printf(sc->dev, "can not if_alloc()\n"); + return (ENOSPC); + } mtx_init(&sc->mtx, device_get_nameunit(sc->dev), MTX_NETWORK_LOCK, - MTX_DEF | MTX_RECURSE); + MTX_DEF); + callout_init_mtx(&sc->watchdog, &sc->mtx, 0); + if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev)); ifp->if_softc = sc; - ifp->if_init = (if_init_f_t *)pdq_ifinit; + ifp->if_init = pdq_ifinit; ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; ifp->if_flags = IFF_BROADCAST|IFF_SIMPLEX|IFF_NOTRAILERS|IFF_MULTICAST; - ifp->if_watchdog = pdq_ifwatchdog; - ifp->if_ioctl = pdq_ifioctl; ifp->if_start = pdq_ifstart; @@ -441,7 +487,15 @@ pdq_ifattach(pdq_softc_t *sc, const pdq_uint8_t *llc) } #endif + sc->sc_pdq = pdq_initialize(sc->mem_bst, sc->mem_bsh, ifp->if_xname, -1, + sc, type); + if (sc->sc_pdq == NULL) { + device_printf(sc->dev, "Initialization failed.\n"); + return (ENXIO); + } + fddi_ifattach(ifp, llc, FDDI_BPF_SUPPORTED); + return (0); } void @@ -452,8 +506,10 @@ pdq_ifdetach (pdq_softc_t *sc) ifp = sc->ifp; fddi_ifdetach(ifp, FDDI_BPF_SUPPORTED); - if_free(ifp); - pdq_stop(sc->sc_pdq); + PDQ_LOCK(sc); + pdq_ifstop(sc); + PDQ_UNLOCK(sc); + callout_drain(&sc->watchdog); pdq_free(sc->dev); return; @@ -474,6 +530,8 @@ pdq_free (device_t dev) bus_teardown_intr(dev, sc->irq, sc->irq_ih); if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); + if (sc->ifp) + if_free(sc->ifp); /* * Destroy the mutex. diff --git a/sys/dev/ppbus/lpt.c b/sys/dev/ppbus/lpt.c index 10d67d91811b..18d46ae39d5c 100644 --- a/sys/dev/ppbus/lpt.c +++ b/sys/dev/ppbus/lpt.c @@ -456,7 +456,7 @@ lptout(void *arg) if (sc->sc_state & OPEN) { sc->sc_backoff++; if (sc->sc_backoff > hz/LPTOUTMAX) - sc->sc_backoff = sc->sc_backoff > hz/LPTOUTMAX; + sc->sc_backoff = hz/LPTOUTMAX; callout_reset(&sc->sc_timer, sc->sc_backoff, lptout, sc); } else sc->sc_state &= ~TOUT; @@ -486,12 +486,15 @@ lptopen(struct cdev *dev, int flags, int fmt, struct thread *td) { int trys, err; struct lpt_data *sc = dev->si_drv1; - device_t lptdev = sc->sc_dev; - device_t ppbus = device_get_parent(lptdev); + device_t lptdev; + device_t ppbus; if (!sc) return (ENXIO); + lptdev = sc->sc_dev; + ppbus = device_get_parent(lptdev); + ppb_lock(ppbus); if (sc->sc_state) { lprintf(("%s: still open %x\n", device_get_nameunit(lptdev), @@ -624,7 +627,7 @@ lptclose(struct cdev *dev, int flags, int fmt, struct thread *td) while ((ppb_rstr(ppbus) & (LPS_SEL|LPS_OUT|LPS_NBSY|LPS_NERR)) != (LPS_SEL|LPS_NBSY|LPS_NERR) || sc->sc_xfercnt) - /* wait 1/4 second, give up if we get a signal */ + /* wait 1 second, give up if we get a signal */ if (ppb_sleep(ppbus, lptdev, LPPRI | PCATCH, "lpclose", hz) != EWOULDBLOCK) break; diff --git a/sys/dev/ppbus/pcfclock.c b/sys/dev/ppbus/pcfclock.c index e59a8919e03f..65612a21de4c 100644 --- a/sys/dev/ppbus/pcfclock.c +++ b/sys/dev/ppbus/pcfclock.c @@ -150,12 +150,14 @@ static int pcfclock_open(struct cdev *dev, int flag, int fms, struct thread *td) { struct pcfclock_data *sc = dev->si_drv1; - device_t pcfclockdev = sc->dev; - device_t ppbus = device_get_parent(pcfclockdev); + device_t pcfclockdev; + device_t ppbus; int res; if (!sc) return (ENXIO); + pcfclockdev = sc->dev; + ppbus = device_get_parent(pcfclockdev); ppb_lock(ppbus); res = ppb_request_bus(ppbus, pcfclockdev, diff --git a/sys/dev/ppbus/vpo.c b/sys/dev/ppbus/vpo.c index 673a7858d4da..02bc9b397b2e 100644 --- a/sys/dev/ppbus/vpo.c +++ b/sys/dev/ppbus/vpo.c @@ -83,9 +83,6 @@ struct vpo_data { /* cam related functions */ static void vpo_action(struct cam_sim *sim, union ccb *ccb); static void vpo_poll(struct cam_sim *sim); -static void vpo_cam_rescan_callback(struct cam_periph *periph, - union ccb *ccb); -static void vpo_cam_rescan(struct vpo_data *vpo); static void vpo_identify(driver_t *driver, device_t parent) @@ -176,44 +173,10 @@ vpo_attach(device_t dev) return (ENXIO); } ppb_unlock(ppbus); - vpo_cam_rescan(vpo); /* have CAM rescan the bus */ return (0); } -static void -vpo_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb) -{ - - free(ccb, M_TEMP); -} - -static void -vpo_cam_rescan(struct vpo_data *vpo) -{ - device_t ppbus = device_get_parent(vpo->vpo_dev); - struct cam_path *path; - union ccb *ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK | M_ZERO); - - ppb_lock(ppbus); - if (xpt_create_path(&path, xpt_periph, cam_sim_path(vpo->sim), 0, 0) - != CAM_REQ_CMP) { - /* A failure is benign as the user can do a manual rescan */ - ppb_unlock(ppbus); - free(ccb, M_TEMP); - return; - } - - xpt_setup_ccb(&ccb->ccb_h, path, 5/*priority (low)*/); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = vpo_cam_rescan_callback; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); - ppb_unlock(ppbus); - - /* The scan is in progress now. */ -} - /* * vpo_intr() */ diff --git a/sys/dev/puc/puc.c b/sys/dev/puc/puc.c index 39e7a19a6111..b6fa3c5e5609 100644 --- a/sys/dev/puc/puc.c +++ b/sys/dev/puc/puc.c @@ -129,62 +129,78 @@ puc_intr(void *arg) { struct puc_port *port; struct puc_softc *sc = arg; - u_long dev, devs; - int i, idx, ipend, isrc; + u_long ds, dev, devs; + int i, idx, ipend, isrc, nints; uint8_t ilr; - devs = sc->sc_serdevs; - if (sc->sc_ilr == PUC_ILR_DIGI) { - idx = 0; - while (devs & (0xfful << idx)) { - ilr = ~bus_read_1(sc->sc_port[idx].p_rres, 7); - devs &= ~0ul ^ ((u_long)ilr << idx); - idx += 8; - } - } else if (sc->sc_ilr == PUC_ILR_QUATECH) { + nints = 0; + while (1) { /* - * Don't trust the value if it's the same as the option - * register. It may mean that the ILR is not active and - * we're reading the option register instead. This may - * lead to false positives on 8-port boards. + * Obtain the set of devices with pending interrupts. */ - ilr = bus_read_1(sc->sc_port[0].p_rres, 7); - if (ilr != (sc->sc_cfg_data & 0xff)) - devs &= (u_long)ilr; - } - - ipend = 0; - idx = 0, dev = 1UL; - while (devs != 0UL) { - while ((devs & dev) == 0UL) - idx++, dev <<= 1; - devs &= ~dev; - port = &sc->sc_port[idx]; - port->p_ipend = SERDEV_IPEND(port->p_dev); - ipend |= port->p_ipend; - } - - i = 0, isrc = SER_INT_OVERRUN; - while (ipend) { - while (i < PUC_ISRCCNT && !(ipend & isrc)) - i++, isrc <<= 1; - KASSERT(i < PUC_ISRCCNT, ("%s", __func__)); - ipend &= ~isrc; - idx = 0, dev = 1UL; devs = sc->sc_serdevs; - while (devs != 0UL) { - while ((devs & dev) == 0UL) - idx++, dev <<= 1; - devs &= ~dev; - port = &sc->sc_port[idx]; - if (!(port->p_ipend & isrc)) - continue; - if (port->p_ihsrc[i] != NULL) - (*port->p_ihsrc[i])(port->p_iharg); + if (sc->sc_ilr == PUC_ILR_DIGI) { + idx = 0; + while (devs & (0xfful << idx)) { + ilr = ~bus_read_1(sc->sc_port[idx].p_rres, 7); + devs &= ~0ul ^ ((u_long)ilr << idx); + idx += 8; + } + } else if (sc->sc_ilr == PUC_ILR_QUATECH) { + /* + * Don't trust the value if it's the same as the option + * register. It may mean that the ILR is not active and + * we're reading the option register instead. This may + * lead to false positives on 8-port boards. + */ + ilr = bus_read_1(sc->sc_port[0].p_rres, 7); + if (ilr != (sc->sc_cfg_data & 0xff)) + devs &= (u_long)ilr; + } + if (devs == 0UL) + break; + + /* + * Obtain the set of interrupt sources from those devices + * that have pending interrupts. + */ + ipend = 0; + idx = 0, dev = 1UL; + ds = devs; + while (ds != 0UL) { + while ((ds & dev) == 0UL) + idx++, dev <<= 1; + ds &= ~dev; + port = &sc->sc_port[idx]; + port->p_ipend = SERDEV_IPEND(port->p_dev); + ipend |= port->p_ipend; + } + if (ipend == 0) + break; + + i = 0, isrc = SER_INT_OVERRUN; + while (ipend) { + while (i < PUC_ISRCCNT && !(ipend & isrc)) + i++, isrc <<= 1; + KASSERT(i < PUC_ISRCCNT, ("%s", __func__)); + ipend &= ~isrc; + idx = 0, dev = 1UL; + ds = devs; + while (ds != 0UL) { + while ((ds & dev) == 0UL) + idx++, dev <<= 1; + ds &= ~dev; + port = &sc->sc_port[idx]; + if (!(port->p_ipend & isrc)) + continue; + if (port->p_ihsrc[i] != NULL) + (*port->p_ihsrc[i])(port->p_iharg); + nints++; + } } - return (FILTER_HANDLED); } - return (FILTER_STRAY); + + return ((nints > 0) ? FILTER_HANDLED : FILTER_STRAY); } int diff --git a/sys/dev/puc/pucdata.c b/sys/dev/puc/pucdata.c index 36183b75b522..b74574d2c3c4 100644 --- a/sys/dev/puc/pucdata.c +++ b/sys/dev/puc/pucdata.c @@ -168,10 +168,10 @@ const struct puc_cfg puc_pci_devices[] = { { 0x10e8, 0x818e, 0xffff, 0, "Applied Micro Circuits 8 Port UART", - DEFAULT_RCLK, - PUC_PORT_8S, 0x14, -1, -1, + DEFAULT_RCLK, + PUC_PORT_8S, 0x14, -1, -1, .config_function = puc_config_amc - }, + }, { 0x11fe, 0x8010, 0xffff, 0, "Comtrol RocketPort 550/8 RJ11 part A", @@ -808,6 +808,42 @@ const struct puc_cfg puc_pci_devices[] = { PUC_PORT_4S1P, 0x10, 4, 0, }, + { 0x9710, 0x9865, 0xa000, 0x3002, + "NetMos NM9865 Dual UART", + DEFAULT_RCLK, + PUC_PORT_2S, 0x10, 4, 0, + }, + + { 0x9710, 0x9865, 0xa000, 0x3003, + "NetMos NM9865 Triple UART", + DEFAULT_RCLK, + PUC_PORT_3S, 0x10, 4, 0, + }, + + { 0x9710, 0x9865, 0xa000, 0x3004, + "NetMos NM9865 Quad UART", + DEFAULT_RCLK, + PUC_PORT_4S, 0x10, 4, 0,0 + }, + + { 0x9710, 0x9865, 0xa000, 0x3011, + "NetMos NM9865 Single UART and 1284 Printer port", + DEFAULT_RCLK, + PUC_PORT_1S1P, 0x10, 4, 0, + }, + + { 0x9710, 0x9865, 0xa000, 0x3012, + "NetMos NM9865 Dual UART and 1284 Printer port", + DEFAULT_RCLK, + PUC_PORT_2S1P, 0x10, 4, 0, + }, + + { 0x9710, 0x9865, 0xa000, 0x3020, + "NetMos NM9865 Dual 1284 Printer port", + DEFAULT_RCLK, + PUC_PORT_2P, 0x10, 4, 0, + }, + { 0xb00c, 0x021c, 0xffff, 0, "IC Book Labs Gunboat x4 Lite", DEFAULT_RCLK, diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index 5a5790d0c257..978580179d5d 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -172,7 +172,7 @@ static struct rl_type re_devs[] = { { RT_VENDORID, RT_DEVICEID_8139, 0, "RealTek 8139C+ 10/100BaseTX" }, { RT_VENDORID, RT_DEVICEID_8101E, 0, - "RealTek 8101E/8102E/8102EL PCIe 10/100baseTX" }, + "RealTek 8101E/8102E/8102EL/8103E PCIe 10/100baseTX" }, { RT_VENDORID, RT_DEVICEID_8168, 0, "RealTek 8168/8168B/8168C/8168CP/8168D/8168DP/" "8111B/8111C/8111CP/8111DP PCIe Gigabit Ethernet" }, @@ -212,6 +212,7 @@ static struct rl_hwrev re_hwrevs[] = { { RL_HWREV_8102E, RL_8169, "8102E"}, { RL_HWREV_8102EL, RL_8169, "8102EL"}, { RL_HWREV_8102EL_SPIN1, RL_8169, "8102EL"}, + { RL_HWREV_8103E, RL_8169, "8103E"}, { RL_HWREV_8168_SPIN2, RL_8169, "8168"}, { RL_HWREV_8168_SPIN3, RL_8169, "8168"}, { RL_HWREV_8168C, RL_8169, "8168C/8111C"}, @@ -753,6 +754,7 @@ re_diag(struct rl_softc *sc) ifp->if_flags |= IFF_PROMISC; sc->rl_testmode = 1; + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; re_init_locked(sc); sc->rl_flags |= RL_FLAG_LINK; if (sc->rl_type == RL_8169) @@ -1160,6 +1162,9 @@ re_attach(device_t dev) msic = 0; if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) { sc->rl_flags |= RL_FLAG_PCIE; + /* Set PCIe maximum read request size to 2048. */ + if (pci_get_max_read_req(dev) < 2048) + pci_set_max_read_req(dev, 2048); msic = pci_msi_count(dev); if (bootverbose) device_printf(dev, "MSI count : %d\n", msic); @@ -1267,6 +1272,12 @@ re_attach(device_t dev) RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_FASTETHER | RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD; break; + case RL_HWREV_8103E: + sc->rl_flags |= RL_FLAG_NOJUMBO | RL_FLAG_PHYWAKE | + RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | + RL_FLAG_FASTETHER | RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD | + RL_FLAG_MACSLEEP; + break; case RL_HWREV_8168_SPIN1: case RL_HWREV_8168_SPIN2: sc->rl_flags |= RL_FLAG_WOLRXENB; @@ -1418,7 +1429,7 @@ re_attach(device_t dev) */ if ((sc->rl_flags & RL_FLAG_DESCV2) == 0) { ifp->if_hwassist |= CSUM_TSO; - ifp->if_capabilities |= IFCAP_TSO4; + ifp->if_capabilities |= IFCAP_TSO4 | IFCAP_VLAN_HWTSO; } /* @@ -1440,7 +1451,7 @@ re_attach(device_t dev) * packets in TSO size. */ ifp->if_hwassist &= ~CSUM_TSO; - ifp->if_capenable &= ~IFCAP_TSO4; + ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_VLAN_HWTSO); #ifdef DEVICE_POLLING ifp->if_capabilities |= IFCAP_POLLING; #endif @@ -1817,6 +1828,8 @@ re_rxeof(struct rl_softc *sc, int *rx_npktsp) for (i = sc->rl_ldata.rl_rx_prodidx; maxpkt > 0; i = RL_RX_DESC_NXT(sc, i)) { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + break; cur_rx = &sc->rl_ldata.rl_rx_list[i]; rxstat = le32toh(cur_rx->rl_cmdstat); if ((rxstat & RL_RDESC_STAT_OWN) != 0) @@ -2143,8 +2156,10 @@ re_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count) * XXX check behaviour on receiver stalls. */ - if (status & RL_ISR_SYSTEM_ERR) + if (status & RL_ISR_SYSTEM_ERR) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; re_init_locked(sc); + } } return (rx_npkts); } @@ -2220,8 +2235,10 @@ re_int_task(void *arg, int npending) RL_ISR_TX_ERR|RL_ISR_TX_DESC_UNAVAIL)) re_txeof(sc); - if (status & RL_ISR_SYSTEM_ERR) + if (status & RL_ISR_SYSTEM_ERR) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; re_init_locked(sc); + } if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_txtask); @@ -2537,6 +2554,9 @@ re_init_locked(struct rl_softc *sc) mii = device_get_softc(sc->rl_miibus); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + return; + /* * Cancel pending I/O and free all RX/TX buffers. */ @@ -2769,6 +2789,7 @@ re_ioctl(struct ifnet *ifp, u_long command, caddr_t data) (ifp->if_capenable & IFCAP_TSO4) != 0) { ifp->if_capenable &= ~IFCAP_TSO4; ifp->if_hwassist &= ~CSUM_TSO; + VLAN_CAPABILITIES(ifp); } RL_UNLOCK(sc); break; @@ -2791,7 +2812,8 @@ re_ioctl(struct ifnet *ifp, u_long command, caddr_t data) case SIOCADDMULTI: case SIOCDELMULTI: RL_LOCK(sc); - re_set_rxmode(sc); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + re_set_rxmode(sc); RL_UNLOCK(sc); break; case SIOCGIFMEDIA: @@ -2834,14 +2856,10 @@ re_ioctl(struct ifnet *ifp, u_long command, caddr_t data) ifp->if_hwassist &= ~RE_CSUM_FEATURES; reinit = 1; } - if (mask & IFCAP_VLAN_HWTAGGING) { - ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; - reinit = 1; - } - if (mask & IFCAP_TSO4) { + if ((mask & IFCAP_TSO4) != 0 && + (ifp->if_capabilities & IFCAP_TSO) != 0) { ifp->if_capenable ^= IFCAP_TSO4; - if ((IFCAP_TSO4 & ifp->if_capenable) && - (IFCAP_TSO4 & ifp->if_capabilities)) + if ((IFCAP_TSO4 & ifp->if_capenable) != 0) ifp->if_hwassist |= CSUM_TSO; else ifp->if_hwassist &= ~CSUM_TSO; @@ -2851,6 +2869,17 @@ re_ioctl(struct ifnet *ifp, u_long command, caddr_t data) ifp->if_hwassist &= ~CSUM_TSO; } } + if ((mask & IFCAP_VLAN_HWTSO) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0) + ifp->if_capenable ^= IFCAP_VLAN_HWTSO; + if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) { + ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + /* TSO over VLAN requires VLAN hardware tagging. */ + if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0) + ifp->if_capenable &= ~IFCAP_VLAN_HWTSO; + reinit = 1; + } if ((mask & IFCAP_WOL) != 0 && (ifp->if_capabilities & IFCAP_WOL) != 0) { if ((mask & IFCAP_WOL_UCAST) != 0) @@ -2860,8 +2889,10 @@ re_ioctl(struct ifnet *ifp, u_long command, caddr_t data) if ((mask & IFCAP_WOL_MAGIC) != 0) ifp->if_capenable ^= IFCAP_WOL_MAGIC; } - if (reinit && ifp->if_drv_flags & IFF_DRV_RUNNING) + if (reinit && ifp->if_drv_flags & IFF_DRV_RUNNING) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; re_init(sc); + } VLAN_CAPABILITIES(ifp); } break; @@ -2897,6 +2928,7 @@ re_watchdog(struct rl_softc *sc) ifp->if_oerrors++; re_rxeof(sc, NULL); + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; re_init_locked(sc); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_txtask); @@ -3009,15 +3041,16 @@ re_resume(device_t dev) CSR_READ_1(sc, RL_GPIO) | 0x01); } - /* reinitialize interface if necessary */ - if (ifp->if_flags & IFF_UP) - re_init_locked(sc); - /* * Clear WOL matching such that normal Rx filtering * wouldn't interfere with WOL patterns. */ re_clrwol(sc); + + /* reinitialize interface if necessary */ + if (ifp->if_flags & IFF_UP) + re_init_locked(sc); + sc->suspended = 0; RL_UNLOCK(sc); diff --git a/sys/dev/safe/safe.c b/sys/dev/safe/safe.c index 736b329e8c29..ac970980449b 100644 --- a/sys/dev/safe/safe.c +++ b/sys/dev/safe/safe.c @@ -1902,7 +1902,7 @@ safe_init_board(struct safe_softc *sc) { u_int32_t v, dwords; - v = READ_REG(sc, SAFE_PE_DMACFG);; + v = READ_REG(sc, SAFE_PE_DMACFG); v &=~ SAFE_PE_DMACFG_PEMODE; v |= SAFE_PE_DMACFG_FSENA /* failsafe enable */ | SAFE_PE_DMACFG_GPRPCI /* gather ring on PCI */ diff --git a/sys/dev/siba/siba.c b/sys/dev/siba/siba.c index 04a530959215..541585b47e75 100644 --- a/sys/dev/siba/siba.c +++ b/sys/dev/siba/siba.c @@ -37,9 +37,9 @@ __FBSDID("$FreeBSD$"); #include -#include -#include #include +#include +#include /* * TODO: De-mipsify this code. @@ -77,7 +77,7 @@ static struct siba_devid siba_devids[] = { "MIPS core" }, { SIBA_VID_BROADCOM, SIBA_DEVID_ETHERNET, SIBA_REV_ANY, "Ethernet core" }, - { SIBA_VID_BROADCOM, SIBA_DEVID_USB, SIBA_REV_ANY, + { SIBA_VID_BROADCOM, SIBA_DEVID_USB11_HOSTDEV, SIBA_REV_ANY, "USB host controller" }, { SIBA_VID_BROADCOM, SIBA_DEVID_IPSEC, SIBA_REV_ANY, "IPSEC accelerator" }, @@ -103,7 +103,6 @@ static struct siba_devid * static struct resource_list * siba_get_reslist(device_t, device_t); static uint8_t siba_getirq(uint16_t); -static uint8_t siba_getncores(uint16_t); static int siba_print_all_resources(device_t dev); static int siba_print_child(device_t, device_t); static int siba_probe(device_t); @@ -112,30 +111,7 @@ int siba_read_ivar(device_t, device_t, int, uintptr_t *); static struct siba_devinfo * siba_setup_devinfo(device_t, uint8_t); int siba_write_ivar(device_t, device_t, int, uintptr_t); - -/* - * Earlier ChipCommon revisions have hardcoded number of cores - * present dependent on the ChipCommon ID. - */ -static uint8_t -siba_getncores(uint16_t ccid) -{ - uint8_t ncores; - - switch (ccid) { - case SIBA_CCID_SENTRY5: - ncores = 7; - break; - case SIBA_CCID_BCM4710: - case SIBA_CCID_BCM4704: - ncores = 9; - break; - default: - ncores = 0; - } - - return (ncores); -} +uint8_t siba_getncores(device_t, uint16_t); /* * On the Sentry5, the system bus IRQs are the same as the @@ -156,7 +132,7 @@ siba_getirq(uint16_t devid) case SIBA_DEVID_IPSEC: irq = 2; break; - case SIBA_DEVID_USB: + case SIBA_DEVID_USB11_HOSTDEV: irq = 3; break; case SIBA_DEVID_PCI: @@ -188,7 +164,7 @@ siba_probe(device_t dev) uint16_t ccid; int rid; - sc->sc_dev = dev; + sc->siba_dev = dev; //rman_debug = 1; /* XXX */ @@ -197,24 +173,24 @@ siba_probe(device_t dev) * was compiled with. */ rid = MIPS_MEM_RID; - sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + sc->siba_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); - if (sc->sc_mem == NULL) { + if (sc->siba_mem_res == NULL) { device_printf(dev, "unable to allocate probe aperture\n"); return (ENXIO); } - sc->sc_bt = rman_get_bustag(sc->sc_mem); - sc->sc_bh = rman_get_bushandle(sc->sc_mem); - sc->sc_maddr = rman_get_start(sc->sc_mem); - sc->sc_msize = rman_get_size(sc->sc_mem); + sc->siba_mem_bt = rman_get_bustag(sc->siba_mem_res); + sc->siba_mem_bh = rman_get_bushandle(sc->siba_mem_res); + sc->siba_maddr = rman_get_start(sc->siba_mem_res); + sc->siba_msize = rman_get_size(sc->siba_mem_res); if (siba_debug) { device_printf(dev, "start %08x len %08x\n", - sc->sc_maddr, sc->sc_msize); + sc->siba_maddr, sc->siba_msize); } - idlo = siba_read_4(sc, 0, SIBA_CORE_IDLO); - idhi = siba_read_4(sc, 0, SIBA_CORE_IDHI); + idlo = siba_mips_read_4(sc, 0, SIBA_IDLOW); + idhi = siba_mips_read_4(sc, 0, SIBA_IDHIGH); ccid = ((idhi & 0x8ff0) >> 4); if (siba_debug) { device_printf(dev, "idlo = %08x\n", idlo); @@ -256,7 +232,7 @@ siba_probe(device_t dev) uint16_t cc_id; uint16_t cc_rev; - ccidreg = siba_read_4(sc, 0, SIBA_CC_CCID); + ccidreg = siba_mips_read_4(sc, 0, SIBA_CC_CHIPID); cc_id = (ccidreg & SIBA_CC_IDMASK); cc_rev = (ccidreg & SIBA_CC_REVMASK) >> SIBA_CC_REVSHIFT; if (siba_debug) { @@ -264,9 +240,9 @@ siba_probe(device_t dev) ccidreg, cc_id, cc_rev); } - sc->sc_ncores = siba_getncores(cc_id); + sc->siba_ncores = siba_getncores(dev, cc_id); if (siba_debug) { - device_printf(dev, "%d cores detected.\n", sc->sc_ncores); + device_printf(dev, "%d cores detected.\n", sc->siba_ncores); } /* @@ -275,36 +251,38 @@ siba_probe(device_t dev) */ rid = MIPS_MEM_RID; int result; - result = bus_release_resource(dev, SYS_RES_MEMORY, rid, sc->sc_mem); + result = bus_release_resource(dev, SYS_RES_MEMORY, rid, + sc->siba_mem_res); if (result != 0) { device_printf(dev, "error %d releasing resource\n", result); return (ENXIO); } uint32_t total; - total = sc->sc_ncores * SIBA_CORE_LEN; + total = sc->siba_ncores * SIBA_CORE_LEN; /* XXX Don't allocate the entire window until we * enumerate the bus. Once the bus has been enumerated, * and instance variables/children instantiated + populated, * release the resource so children may attach. */ - sc->sc_mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - sc->sc_maddr, sc->sc_maddr + total - 1, total, RF_ACTIVE); - if (sc->sc_mem == NULL) { + sc->siba_mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + sc->siba_maddr, sc->siba_maddr + total - 1, total, RF_ACTIVE); + if (sc->siba_mem_res == NULL) { device_printf(dev, "unable to allocate entire aperture\n"); return (ENXIO); } - sc->sc_bt = rman_get_bustag(sc->sc_mem); - sc->sc_bh = rman_get_bushandle(sc->sc_mem); - sc->sc_maddr = rman_get_start(sc->sc_mem); - sc->sc_msize = rman_get_size(sc->sc_mem); + sc->siba_mem_bt = rman_get_bustag(sc->siba_mem_res); + sc->siba_mem_bh = rman_get_bushandle(sc->siba_mem_res); + sc->siba_maddr = rman_get_start(sc->siba_mem_res); + sc->siba_msize = rman_get_size(sc->siba_mem_res); if (siba_debug) { device_printf(dev, "after remapping: start %08x len %08x\n", - sc->sc_maddr, sc->sc_msize); + sc->siba_maddr, sc->siba_msize); } - bus_set_resource(dev, SYS_RES_MEMORY, rid, sc->sc_maddr, sc->sc_msize); + bus_set_resource(dev, SYS_RES_MEMORY, rid, sc->siba_maddr, + sc->siba_msize); /* * We need a manager for the space we claim on nexus to @@ -313,12 +291,13 @@ siba_probe(device_t dev) * otherwise it may be claimed elsewhere. * XXX move to softc */ - mem_rman.rm_start = sc->sc_maddr; - mem_rman.rm_end = sc->sc_maddr + sc->sc_msize - 1; + mem_rman.rm_start = sc->siba_maddr; + mem_rman.rm_end = sc->siba_maddr + sc->siba_msize - 1; mem_rman.rm_type = RMAN_ARRAY; mem_rman.rm_descr = "SiBa I/O memory addresses"; if (rman_init(&mem_rman) != 0 || - rman_manage_region(&mem_rman, mem_rman.rm_start, mem_rman.rm_end) != 0) { + rman_manage_region(&mem_rman, mem_rman.rm_start, + mem_rman.rm_end) != 0) { panic("%s: mem_rman", __func__); } @@ -344,7 +323,7 @@ siba_attach(device_t dev) * NB: only one core may be mapped at any time if the siba bus * is the child of a PCI or PCMCIA bus. */ - for (idx = 0; idx < sc->sc_ncores; idx++) { + for (idx = 0; idx < sc->siba_ncores; idx++) { sdi = siba_setup_devinfo(dev, idx); child = device_add_child(dev, NULL, -1); if (child == NULL) @@ -483,13 +462,14 @@ siba_setup_devinfo(device_t dev, uint8_t idx) sdi = malloc(sizeof(*sdi), M_DEVBUF, M_WAITOK | M_ZERO); resource_list_init(&sdi->sdi_rl); - idlo = siba_read_4(sc, idx, SIBA_CORE_IDLO); - idhi = siba_read_4(sc, idx, SIBA_CORE_IDHI); + idlo = siba_mips_read_4(sc, idx, SIBA_IDLOW); + idhi = siba_mips_read_4(sc, idx, SIBA_IDHIGH); - vendorid = (idhi & SIBA_IDHIGH_VC) >> SIBA_IDHIGH_VC_SHIFT; + vendorid = (idhi & SIBA_IDHIGH_VENDORMASK) >> + SIBA_IDHIGH_VENDOR_SHIFT; devid = ((idhi & 0x8ff0) >> 4); - rev = (idhi & SIBA_IDHIGH_RCLO); - rev |= (idhi & SIBA_IDHIGH_RCHI) >> SIBA_IDHIGH_RCHI_SHIFT; + rev = (idhi & SIBA_IDHIGH_REVLO); + rev |= (idhi & SIBA_IDHIGH_REVHI) >> SIBA_IDHIGH_REVHI_SHIFT; sdi->sdi_vid = vendorid; sdi->sdi_devid = devid; @@ -500,7 +480,7 @@ siba_setup_devinfo(device_t dev, uint8_t idx) /* * Determine memory window on bus and irq if one is needed. */ - baseaddr = sc->sc_maddr + (idx * SIBA_CORE_LEN); + baseaddr = sc->siba_maddr + (idx * SIBA_CORE_LEN); resource_list_add(&sdi->sdi_rl, SYS_RES_MEMORY, MIPS_MEM_RID, /* XXX */ baseaddr, baseaddr + SIBA_CORE_LEN - 1, SIBA_CORE_LEN); diff --git a/sys/dev/siba/siba_bwn.c b/sys/dev/siba/siba_bwn.c new file mode 100644 index 000000000000..a5513bdb4e14 --- /dev/null +++ b/sys/dev/siba/siba_bwn.c @@ -0,0 +1,366 @@ +/*- + * Copyright (c) 2009-2010 Weongyo Jeong + * 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, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Sonics Silicon Backplane front-end for bwn(4). + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include + +/* + * PCI glue. + */ + +struct siba_bwn_softc { + /* Child driver using MSI. */ + device_t ssc_msi_child; + struct siba_softc ssc_siba; +}; + +#define BS_BAR 0x10 +#define PCI_VENDOR_BROADCOM 0x14e4 +#define N(a) (sizeof(a) / sizeof(a[0])) + +static const struct siba_dev { + uint16_t vid; + uint16_t did; + const char *desc; +} siba_devices[] = { + { PCI_VENDOR_BROADCOM, 0x4301, "Broadcom BCM4301 802.11b Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4306, "Unknown" }, + { PCI_VENDOR_BROADCOM, 0x4307, "Broadcom BCM4307 802.11b Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4311, "Broadcom BCM4311 802.11b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4312, + "Broadcom BCM4312 802.11a/b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4315, "Broadcom BCM4312 802.11b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4318, "Broadcom BCM4318 802.11b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4319, + "Broadcom BCM4318 802.11a/b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4320, "Broadcom BCM4306 802.11b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4321, "Broadcom BCM4306 802.11a Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4324, + "Broadcom BCM4309 802.11a/b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4325, "Broadcom BCM4306 802.11b/g Wireless" }, + { PCI_VENDOR_BROADCOM, 0x4328, "Unknown" }, + { PCI_VENDOR_BROADCOM, 0x4329, "Unknown" }, + { PCI_VENDOR_BROADCOM, 0x432b, "Unknown" } +}; + +device_t siba_add_child(device_t, struct siba_softc *, int, const char *, + int); +int siba_core_attach(struct siba_softc *); +int siba_core_detach(struct siba_softc *); +int siba_core_suspend(struct siba_softc *); +int siba_core_resume(struct siba_softc *); + +static int +siba_bwn_probe(device_t dev) +{ + int i; + uint16_t did, vid; + + did = pci_get_device(dev); + vid = pci_get_vendor(dev); + + for (i = 0; i < N(siba_devices); i++) { + if (siba_devices[i].did == did && siba_devices[i].vid == vid) { + device_set_desc(dev, siba_devices[i].desc); + return (BUS_PROBE_DEFAULT); + } + } + return (ENXIO); +} + +static int +siba_bwn_attach(device_t dev) +{ + struct siba_bwn_softc *ssc = device_get_softc(dev); + struct siba_softc *siba = &ssc->ssc_siba; + + siba->siba_dev = dev; + siba->siba_type = SIBA_TYPE_PCI; + + /* + * Enable bus mastering. + */ + pci_enable_busmaster(dev); + + /* + * Setup memory-mapping of PCI registers. + */ + siba->siba_mem_rid = SIBA_PCIR_BAR; + siba->siba_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, + &siba->siba_mem_rid, RF_ACTIVE); + if (siba->siba_mem_res == NULL) { + device_printf(dev, "cannot map register space\n"); + return (ENXIO); + } + siba->siba_mem_bt = rman_get_bustag(siba->siba_mem_res); + siba->siba_mem_bh = rman_get_bushandle(siba->siba_mem_res); + + /* Get more PCI information */ + siba->siba_pci_did = pci_get_device(dev); + siba->siba_pci_vid = pci_get_vendor(dev); + siba->siba_pci_subvid = pci_get_subvendor(dev); + siba->siba_pci_subdid = pci_get_subdevice(dev); + + return (siba_core_attach(siba)); +} + +static int +siba_bwn_detach(device_t dev) +{ + struct siba_bwn_softc *ssc = device_get_softc(dev); + struct siba_softc *siba = &ssc->ssc_siba; + + /* check if device was removed */ + siba->siba_invalid = !bus_child_present(dev); + + pci_disable_busmaster(dev); + bus_generic_detach(dev); + siba_core_detach(siba); + + bus_release_resource(dev, SYS_RES_MEMORY, BS_BAR, siba->siba_mem_res); + + return (0); +} + +static int +siba_bwn_shutdown(device_t dev) +{ + device_t *devlistp; + int devcnt, error = 0, i; + + error = device_get_children(dev, &devlistp, &devcnt); + if (error != 0) + return (error); + + for (i = 0 ; i < devcnt ; i++) + device_shutdown(devlistp[i]); + free(devlistp, M_TEMP); + return (0); +} + +static int +siba_bwn_suspend(device_t dev) +{ + struct siba_bwn_softc *ssc = device_get_softc(dev); + struct siba_softc *siba = &ssc->ssc_siba; + device_t *devlistp; + int devcnt, error = 0, i, j; + + error = device_get_children(dev, &devlistp, &devcnt); + if (error != 0) + return (error); + + for (i = 0 ; i < devcnt ; i++) { + error = DEVICE_SUSPEND(devlistp[i]); + if (error) { + for (j = 0; j < i; i++) + DEVICE_RESUME(devlistp[j]); + return (error); + } + } + free(devlistp, M_TEMP); + return (siba_core_suspend(siba)); +} + +static int +siba_bwn_resume(device_t dev) +{ + struct siba_bwn_softc *ssc = device_get_softc(dev); + struct siba_softc *siba = &ssc->ssc_siba; + device_t *devlistp; + int devcnt, error = 0, i; + + error = siba_core_resume(siba); + if (error != 0) + return (error); + + error = device_get_children(dev, &devlistp, &devcnt); + if (error != 0) + return (error); + + for (i = 0 ; i < devcnt ; i++) + DEVICE_RESUME(devlistp[i]); + free(devlistp, M_TEMP); + return (0); +} + +static device_t +siba_bwn_add_child(device_t dev, int order, const char *name, int unit) +{ + struct siba_bwn_softc *ssc = device_get_softc(dev); + struct siba_softc *siba = &ssc->ssc_siba; + + return (siba_add_child(dev, siba, order, name, unit)); +} + +/* proxying to the parent */ +static struct resource * +siba_bwn_alloc_resource(device_t dev, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + + return (BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, + type, rid, start, end, count, flags)); +} + +/* proxying to the parent */ +static int +siba_bwn_release_resource(device_t dev, device_t child, int type, + int rid, struct resource *r) +{ + + return (BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, type, + rid, r)); +} + +/* proxying to the parent */ +static int +siba_bwn_setup_intr(device_t dev, device_t child, struct resource *irq, + int flags, driver_filter_t *filter, driver_intr_t *intr, void *arg, + void **cookiep) +{ + + return (BUS_SETUP_INTR(device_get_parent(dev), dev, irq, flags, + filter, intr, arg, cookiep)); +} + +/* proxying to the parent */ +static int +siba_bwn_teardown_intr(device_t dev, device_t child, struct resource *irq, + void *cookie) +{ + + return (BUS_TEARDOWN_INTR(device_get_parent(dev), dev, irq, cookie)); +} + +static int +siba_bwn_find_extcap(device_t dev, device_t child, int capability, + int *capreg) +{ + + return (pci_find_extcap(dev, capability, capreg)); +} + +static int +siba_bwn_alloc_msi(device_t dev, device_t child, int *count) +{ + struct siba_bwn_softc *ssc; + int error; + + ssc = device_get_softc(dev); + if (ssc->ssc_msi_child != NULL) + return (EBUSY); + error = pci_alloc_msi(dev, count); + if (error == 0) + ssc->ssc_msi_child = child; + return (error); +} + +static int +siba_bwn_release_msi(device_t dev, device_t child) +{ + struct siba_bwn_softc *ssc; + int error; + + ssc = device_get_softc(dev); + if (ssc->ssc_msi_child != child) + return (ENXIO); + error = pci_release_msi(dev); + if (error == 0) + ssc->ssc_msi_child = NULL; + return (error); +} + +static int +siba_bwn_msi_count(device_t dev, device_t child) +{ + + return (pci_msi_count(dev)); +} + +static device_method_t siba_bwn_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, siba_bwn_probe), + DEVMETHOD(device_attach, siba_bwn_attach), + DEVMETHOD(device_detach, siba_bwn_detach), + DEVMETHOD(device_shutdown, siba_bwn_shutdown), + DEVMETHOD(device_suspend, siba_bwn_suspend), + DEVMETHOD(device_resume, siba_bwn_resume), + + /* Bus interface */ + DEVMETHOD(bus_add_child, siba_bwn_add_child), + DEVMETHOD(bus_alloc_resource, siba_bwn_alloc_resource), + DEVMETHOD(bus_release_resource, siba_bwn_release_resource), + DEVMETHOD(bus_setup_intr, siba_bwn_setup_intr), + DEVMETHOD(bus_teardown_intr, siba_bwn_teardown_intr), + + /* PCI interface */ + DEVMETHOD(pci_find_extcap, siba_bwn_find_extcap), + DEVMETHOD(pci_alloc_msi, siba_bwn_alloc_msi), + DEVMETHOD(pci_release_msi, siba_bwn_release_msi), + DEVMETHOD(pci_msi_count, siba_bwn_msi_count), + + { 0,0 } +}; +static driver_t siba_bwn_driver = { + "siba_bwn", + siba_bwn_methods, + sizeof(struct siba_bwn_softc) +}; +static devclass_t siba_bwn_devclass; +DRIVER_MODULE(siba_bwn, pci, siba_bwn_driver, siba_bwn_devclass, 0, 0); +MODULE_VERSION(siba_bwn, 1); diff --git a/sys/mips/sentry5/siba_cc.c b/sys/dev/siba/siba_cc.c similarity index 100% rename from sys/mips/sentry5/siba_cc.c rename to sys/dev/siba/siba_cc.c index cd78f0b02448..db0aac507be6 100644 --- a/sys/mips/sentry5/siba_cc.c +++ b/sys/dev/siba/siba_cc.c @@ -55,9 +55,9 @@ __FBSDID("$FreeBSD$"); #include -#include -#include #include +#include +#include static int siba_cc_attach(device_t); static int siba_cc_probe(device_t); diff --git a/sys/dev/siba/siba_core.c b/sys/dev/siba/siba_core.c new file mode 100644 index 000000000000..d19771dac9d7 --- /dev/null +++ b/sys/dev/siba/siba_core.c @@ -0,0 +1,2126 @@ +/*- + * Copyright (c) 2009-2010 Weongyo Jeong + * 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, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + * redistribution must be conditioned upon including a substantially + * similar Disclaimer requirement for further binary redistribution. + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * the Sonics Silicon Backplane driver. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include + +#ifdef SIBA_DEBUG +enum { + SIBA_DEBUG_SCAN = 0x00000001, /* scan */ + SIBA_DEBUG_PMU = 0x00000002, /* PMU */ + SIBA_DEBUG_PLL = 0x00000004, /* PLL */ + SIBA_DEBUG_SWITCHCORE = 0x00000008, /* switching core */ + SIBA_DEBUG_SPROM = 0x00000010, /* SPROM */ + SIBA_DEBUG_CORE = 0x00000020, /* handling cores */ + SIBA_DEBUG_ANY = 0xffffffff +}; +#define DPRINTF(siba, m, fmt, ...) do { \ + if (siba->siba_debug & (m)) \ + printf(fmt, __VA_ARGS__); \ +} while (0) +#else +#define DPRINTF(siba, m, fmt, ...) do { (void) siba; } while (0) +#endif +#define N(a) (sizeof(a) / sizeof(a[0])) + +static void siba_pci_gpio(struct siba_softc *, uint32_t, int); +static void siba_scan(struct siba_softc *); +static int siba_switchcore(struct siba_softc *, uint8_t); +static int siba_pci_switchcore_sub(struct siba_softc *, uint8_t); +static uint32_t siba_scan_read_4(struct siba_softc *, uint8_t, uint16_t); +static uint16_t siba_dev2chipid(struct siba_softc *); +static uint16_t siba_pci_read_2(struct siba_dev_softc *, uint16_t); +static uint32_t siba_pci_read_4(struct siba_dev_softc *, uint16_t); +static void siba_pci_write_2(struct siba_dev_softc *, uint16_t, uint16_t); +static void siba_pci_write_4(struct siba_dev_softc *, uint16_t, uint32_t); +static void siba_cc_clock(struct siba_cc *, + enum siba_clock); +static void siba_cc_pmu_init(struct siba_cc *); +static void siba_cc_power_init(struct siba_cc *); +static void siba_cc_powerup_delay(struct siba_cc *); +static int siba_cc_clockfreq(struct siba_cc *, int); +static void siba_cc_pmu1_pll0_init(struct siba_cc *, uint32_t); +static void siba_cc_pmu0_pll0_init(struct siba_cc *, uint32_t); +static enum siba_clksrc siba_cc_clksrc(struct siba_cc *); +static const struct siba_cc_pmu1_plltab *siba_cc_pmu1_plltab_find(uint32_t); +static uint32_t siba_cc_pll_read(struct siba_cc *, uint32_t); +static void siba_cc_pll_write(struct siba_cc *, uint32_t, + uint32_t); +static const struct siba_cc_pmu0_plltab * + siba_cc_pmu0_plltab_findentry(uint32_t); +static int siba_pci_sprom(struct siba_softc *, struct siba_sprom *); +static int siba_sprom_read(struct siba_softc *, uint16_t *, uint16_t); +static int sprom_check_crc(const uint16_t *, size_t); +static uint8_t siba_crc8(uint8_t, uint8_t); +static void siba_sprom_r123(struct siba_sprom *, const uint16_t *); +static void siba_sprom_r45(struct siba_sprom *, const uint16_t *); +static void siba_sprom_r8(struct siba_sprom *, const uint16_t *); +static int8_t siba_sprom_r123_antgain(uint8_t, const uint16_t *, uint16_t, + uint16_t); +static uint32_t siba_tmslow_reject_bitmask(struct siba_dev_softc *); +static uint32_t siba_pcicore_read_4(struct siba_pci *, uint16_t); +static void siba_pcicore_write_4(struct siba_pci *, uint16_t, uint32_t); +static uint32_t siba_pcie_read(struct siba_pci *, uint32_t); +static void siba_pcie_write(struct siba_pci *, uint32_t, uint32_t); +static void siba_pcie_mdio_write(struct siba_pci *, uint8_t, uint8_t, + uint16_t); +static void siba_pci_read_multi_1(struct siba_dev_softc *, void *, size_t, + uint16_t); +static void siba_pci_read_multi_2(struct siba_dev_softc *, void *, size_t, + uint16_t); +static void siba_pci_read_multi_4(struct siba_dev_softc *, void *, size_t, + uint16_t); +static void siba_pci_write_multi_1(struct siba_dev_softc *, const void *, + size_t, uint16_t); +static void siba_pci_write_multi_2(struct siba_dev_softc *, const void *, + size_t, uint16_t); +static void siba_pci_write_multi_4(struct siba_dev_softc *, const void *, + size_t, uint16_t); +static const char *siba_core_name(uint16_t); +static void siba_pcicore_init(struct siba_pci *); +device_t siba_add_child(device_t, struct siba_softc *, int, const char *, + int); +int siba_core_attach(struct siba_softc *); +int siba_core_detach(struct siba_softc *); +int siba_core_suspend(struct siba_softc *); +int siba_core_resume(struct siba_softc *); +uint8_t siba_getncores(device_t, uint16_t); + +static const struct siba_bus_ops siba_pci_ops = { + .read_2 = siba_pci_read_2, + .read_4 = siba_pci_read_4, + .write_2 = siba_pci_write_2, + .write_4 = siba_pci_write_4, + .read_multi_1 = siba_pci_read_multi_1, + .read_multi_2 = siba_pci_read_multi_2, + .read_multi_4 = siba_pci_read_multi_4, + .write_multi_1 = siba_pci_write_multi_1, + .write_multi_2 = siba_pci_write_multi_2, + .write_multi_4 = siba_pci_write_multi_4, +}; + +static const struct siba_cc_pmu_res_updown siba_cc_pmu_4325_updown[] = + SIBA_CC_PMU_4325_RES_UPDOWN; +static const struct siba_cc_pmu_res_depend siba_cc_pmu_4325_depend[] = + SIBA_CC_PMU_4325_RES_DEPEND; +static const struct siba_cc_pmu_res_updown siba_cc_pmu_4328_updown[] = + SIBA_CC_PMU_4328_RES_UPDOWN; +static const struct siba_cc_pmu_res_depend siba_cc_pmu_4328_depend[] = + SIBA_CC_PMU_4328_RES_DEPEND; +static const struct siba_cc_pmu0_plltab siba_cc_pmu0_plltab[] = + SIBA_CC_PMU0_PLLTAB_ENTRY; +static const struct siba_cc_pmu1_plltab siba_cc_pmu1_plltab[] = + SIBA_CC_PMU1_PLLTAB_ENTRY; + +int +siba_core_attach(struct siba_softc *siba) +{ + struct siba_cc *scc; + int error; + + KASSERT(siba->siba_type == SIBA_TYPE_PCI, + ("unsupported BUS type (%#x)", siba->siba_type)); + + siba->siba_ops = &siba_pci_ops; + + siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1); + siba_scan(siba); + + /* XXX init PCI or PCMCIA host devices */ + + siba_powerup(siba, 0); + + /* init ChipCommon */ + scc = &siba->siba_cc; + if (scc->scc_dev != NULL) { + siba_cc_pmu_init(scc); + siba_cc_power_init(scc); + siba_cc_clock(scc, SIBA_CLOCK_FAST); + siba_cc_powerup_delay(scc); + } + + /* fetch various internal informations for PCI */ + siba->siba_board_vendor = pci_read_config(siba->siba_dev, + PCIR_SUBVEND_0, 2); + siba->siba_board_type = pci_read_config(siba->siba_dev, PCIR_SUBDEV_0, + 2); + siba->siba_board_rev = pci_read_config(siba->siba_dev, PCIR_REVID, 2); + error = siba_pci_sprom(siba, &siba->siba_sprom); + if (error) { + siba_powerdown(siba); + return (error); + } + + siba_powerdown(siba); + return (0); +} + +int +siba_core_detach(struct siba_softc *siba) +{ + device_t *devlistp; + int devcnt, error = 0, i; + + error = device_get_children(siba->siba_dev, &devlistp, &devcnt); + if (error != 0) + return (0); + + for ( i = 0 ; i < devcnt ; i++) + device_delete_child(siba->siba_dev, devlistp[i]); + free(devlistp, M_TEMP); + return (0); +} + +static void +siba_pci_gpio(struct siba_softc *siba, uint32_t what, int on) +{ + uint32_t in, out; + uint16_t status; + + if (siba->siba_type != SIBA_TYPE_PCI) + return; + + out = pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4); + if (on == 0) { + if (what & SIBA_GPIO_PLL) + out |= SIBA_GPIO_PLL; + if (what & SIBA_GPIO_CRYSTAL) + out &= ~SIBA_GPIO_CRYSTAL; + pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4); + pci_write_config(siba->siba_dev, SIBA_GPIO_OUT_EN, + pci_read_config(siba->siba_dev, + SIBA_GPIO_OUT_EN, 4) | what, 4); + return; + } + + in = pci_read_config(siba->siba_dev, SIBA_GPIO_IN, 4); + if ((in & SIBA_GPIO_CRYSTAL) != SIBA_GPIO_CRYSTAL) { + if (what & SIBA_GPIO_CRYSTAL) { + out |= SIBA_GPIO_CRYSTAL; + if (what & SIBA_GPIO_PLL) + out |= SIBA_GPIO_PLL; + pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4); + pci_write_config(siba->siba_dev, + SIBA_GPIO_OUT_EN, pci_read_config(siba->siba_dev, + SIBA_GPIO_OUT_EN, 4) | what, 4); + DELAY(1000); + } + if (what & SIBA_GPIO_PLL) { + out &= ~SIBA_GPIO_PLL; + pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4); + DELAY(5000); + } + } + + status = pci_read_config(siba->siba_dev, PCIR_STATUS, 2); + status &= ~PCIM_STATUS_STABORT; + pci_write_config(siba->siba_dev, PCIR_STATUS, status, 2); +} + +static void +siba_scan(struct siba_softc *siba) +{ + struct siba_dev_softc *sd; + uint32_t idhi, tmp; + int base, dev_i = 0, error, i, is_pcie, n_80211 = 0, n_cc = 0, + n_pci = 0; + + KASSERT(siba->siba_type == SIBA_TYPE_PCI, + ("unsupported BUS type (%#x)", siba->siba_type)); + + siba->siba_ndevs = 0; + error = siba_switchcore(siba, 0); /* need the first core */ + if (error) + return; + + idhi = siba_scan_read_4(siba, 0, SIBA_IDHIGH); + if (SIBA_IDHIGH_CORECODE(idhi) == SIBA_DEVID_CHIPCOMMON) { + tmp = siba_scan_read_4(siba, 0, SIBA_CC_CHIPID); + siba->siba_chipid = SIBA_CC_ID(tmp); + siba->siba_chiprev = SIBA_CC_REV(tmp); + siba->siba_chippkg = SIBA_CC_PKG(tmp); + if (SIBA_IDHIGH_REV(idhi) >= 4) + siba->siba_ndevs = SIBA_CC_NCORES(tmp); + siba->siba_cc.scc_caps = siba_scan_read_4(siba, 0, + SIBA_CC_CAPS); + } else { + if (siba->siba_type == SIBA_TYPE_PCI) { + siba->siba_chipid = siba_dev2chipid(siba); + siba->siba_chiprev = pci_read_config(siba->siba_dev, + PCIR_REVID, 2); + siba->siba_chippkg = 0; + } else { + siba->siba_chipid = 0x4710; + siba->siba_chiprev = 0; + siba->siba_chippkg = 0; + } + } + if (siba->siba_ndevs == 0) + siba->siba_ndevs = siba_getncores(siba->siba_dev, + siba->siba_chipid); + if (siba->siba_ndevs > SIBA_MAX_CORES) { + device_printf(siba->siba_dev, + "too many siba cores (max %d %d)\n", + SIBA_MAX_CORES, siba->siba_ndevs); + return; + } + + /* looking basic information about each cores/devices */ + for (i = 0; i < siba->siba_ndevs; i++) { + error = siba_switchcore(siba, i); + if (error) + return; + sd = &(siba->siba_devs[dev_i]); + idhi = siba_scan_read_4(siba, i, SIBA_IDHIGH); + sd->sd_bus = siba; + sd->sd_id.sd_device = SIBA_IDHIGH_CORECODE(idhi); + sd->sd_id.sd_rev = SIBA_IDHIGH_REV(idhi); + sd->sd_id.sd_vendor = SIBA_IDHIGH_VENDOR(idhi); + sd->sd_ops = siba->siba_ops; + sd->sd_coreidx = i; + + DPRINTF(siba, SIBA_DEBUG_SCAN, + "core %d (%s) found (cc %#xrev %#x vendor %#x)\n", + i, siba_core_name(sd->sd_id.sd_device), + sd->sd_id.sd_device, sd->sd_id.sd_rev, sd->sd_id.vendor); + + switch (sd->sd_id.sd_device) { + case SIBA_DEVID_CHIPCOMMON: + n_cc++; + if (n_cc > 1) { + device_printf(siba->siba_dev, + "warn: multiple ChipCommon\n"); + break; + } + siba->siba_cc.scc_dev = sd; + break; + case SIBA_DEVID_80211: + n_80211++; + if (n_80211 > 1) { + device_printf(siba->siba_dev, + "warn: multiple 802.11 core\n"); + continue; + } + break; + case SIBA_DEVID_PCI: + case SIBA_DEVID_PCIE: + n_pci++; + error = pci_find_extcap(siba->siba_dev, PCIY_EXPRESS, + &base); + is_pcie = (error == 0) ? 1 : 0; + + if (n_pci > 1) { + device_printf(siba->siba_dev, + "warn: multiple PCI(E) cores\n"); + break; + } + if (sd->sd_id.sd_device == SIBA_DEVID_PCI && + is_pcie == 1) + continue; + if (sd->sd_id.sd_device == SIBA_DEVID_PCIE && + is_pcie == 0) + continue; + siba->siba_pci.spc_dev = sd; + break; + case SIBA_DEVID_MODEM: + case SIBA_DEVID_PCMCIA: + break; + default: + device_printf(siba->siba_dev, + "unsupported coreid (%s)\n", + siba_core_name(sd->sd_id.sd_device)); + break; + } + dev_i++; + } + siba->siba_ndevs = dev_i; +} + +static int +siba_switchcore(struct siba_softc *siba, uint8_t idx) +{ + + switch (siba->siba_type) { + case SIBA_TYPE_PCI: + return (siba_pci_switchcore_sub(siba, idx)); + default: + KASSERT(0 == 1, + ("%s: unsupported bustype %#x", __func__, + siba->siba_type)); + } + return (0); +} + +static int +siba_pci_switchcore_sub(struct siba_softc *siba, uint8_t idx) +{ +#define RETRY_MAX 50 + int i; + uint32_t dir; + + dir = SIBA_REGWIN(idx); + + for (i = 0; i < RETRY_MAX; i++) { + pci_write_config(siba->siba_dev, SIBA_BAR0, dir, 4); + if (pci_read_config(siba->siba_dev, SIBA_BAR0, 4) == dir) + return (0); + DELAY(10); + } + return (ENODEV); +#undef RETRY_MAX +} + +static int +siba_pci_switchcore(struct siba_softc *siba, struct siba_dev_softc *sd) +{ + int error; + + DPRINTF(siba, SIBA_DEBUG_SWITCHCORE, "Switching to %s core, index %d\n", + siba_core_name(sd->sd_id.sd_device), sd->sd_coreidx); + + error = siba_pci_switchcore_sub(siba, sd->sd_coreidx); + if (error == 0) + siba->siba_curdev = sd; + + return (error); +} + +static uint32_t +siba_scan_read_4(struct siba_softc *siba, uint8_t coreidx, + uint16_t offset) +{ + + (void)coreidx; + KASSERT(siba->siba_type == SIBA_TYPE_PCI, + ("unsupported BUS type (%#x)", siba->siba_type)); + + return (SIBA_READ_4(siba, offset)); +} + +static uint16_t +siba_dev2chipid(struct siba_softc *siba) +{ + uint16_t chipid = 0; + + switch (siba->siba_pci_did) { + case 0x4301: + chipid = 0x4301; + break; + case 0x4305: + case 0x4306: + case 0x4307: + chipid = 0x4307; + break; + case 0x4403: + chipid = 0x4402; + break; + case 0x4610: + case 0x4611: + case 0x4612: + case 0x4613: + case 0x4614: + case 0x4615: + chipid = 0x4610; + break; + case 0x4710: + case 0x4711: + case 0x4712: + case 0x4713: + case 0x4714: + case 0x4715: + chipid = 0x4710; + break; + case 0x4320: + case 0x4321: + case 0x4322: + case 0x4323: + case 0x4324: + case 0x4325: + chipid = 0x4309; + break; + case PCI_DEVICE_ID_BCM4401: + case PCI_DEVICE_ID_BCM4401B0: + case PCI_DEVICE_ID_BCM4401B1: + chipid = 0x4401; + break; + default: + device_printf(siba->siba_dev, "unknown PCI did (%d)\n", + siba->siba_pci_did); + } + + return (chipid); +} + +/* + * Earlier ChipCommon revisions have hardcoded number of cores + * present dependent on the ChipCommon ID. + */ +uint8_t +siba_getncores(device_t dev, uint16_t chipid) +{ + switch (chipid) { + case 0x4401: + case 0x4402: + return (3); + case 0x4301: + case 0x4307: + return (5); + case 0x4306: + return (6); + case SIBA_CCID_SENTRY5: + return (7); + case 0x4310: + return (8); + case SIBA_CCID_BCM4710: + case 0x4610: + case SIBA_CCID_BCM4704: + return (9); + default: + device_printf(dev, "unknown the chipset ID %#x\n", chipid); + } + + return (1); +} + +static const char * +siba_core_name(uint16_t coreid) +{ + + switch (coreid) { + case SIBA_DEVID_CHIPCOMMON: + return ("ChipCommon"); + case SIBA_DEVID_ILINE20: + return ("ILine 20"); + case SIBA_DEVID_SDRAM: + return ("SDRAM"); + case SIBA_DEVID_PCI: + return ("PCI"); + case SIBA_DEVID_MIPS: + return ("MIPS"); + case SIBA_DEVID_ETHERNET: + return ("Fast Ethernet"); + case SIBA_DEVID_MODEM: + return ("Modem"); + case SIBA_DEVID_USB11_HOSTDEV: + return ("USB 1.1 Hostdev"); + case SIBA_DEVID_ADSL: + return ("ADSL"); + case SIBA_DEVID_ILINE100: + return ("ILine 100"); + case SIBA_DEVID_IPSEC: + return ("IPSEC"); + case SIBA_DEVID_PCMCIA: + return ("PCMCIA"); + case SIBA_DEVID_INTERNAL_MEM: + return ("Internal Memory"); + case SIBA_DEVID_SDRAMDDR: + return ("MEMC SDRAM"); + case SIBA_DEVID_EXTIF: + return ("EXTIF"); + case SIBA_DEVID_80211: + return ("IEEE 802.11"); + case SIBA_DEVID_MIPS_3302: + return ("MIPS 3302"); + case SIBA_DEVID_USB11_HOST: + return ("USB 1.1 Host"); + case SIBA_DEVID_USB11_DEV: + return ("USB 1.1 Device"); + case SIBA_DEVID_USB20_HOST: + return ("USB 2.0 Host"); + case SIBA_DEVID_USB20_DEV: + return ("USB 2.0 Device"); + case SIBA_DEVID_SDIO_HOST: + return ("SDIO Host"); + case SIBA_DEVID_ROBOSWITCH: + return ("Roboswitch"); + case SIBA_DEVID_PARA_ATA: + return ("PATA"); + case SIBA_DEVID_SATA_XORDMA: + return ("SATA XOR-DMA"); + case SIBA_DEVID_ETHERNET_GBIT: + return ("GBit Ethernet"); + case SIBA_DEVID_PCIE: + return ("PCI-Express"); + case SIBA_DEVID_MIMO_PHY: + return ("MIMO PHY"); + case SIBA_DEVID_SRAM_CTRLR: + return ("SRAM Controller"); + case SIBA_DEVID_MINI_MACPHY: + return ("Mini MACPHY"); + case SIBA_DEVID_ARM_1176: + return ("ARM 1176"); + case SIBA_DEVID_ARM_7TDMI: + return ("ARM 7TDMI"); + } + return ("unknown"); +} + +static uint16_t +siba_pci_read_2(struct siba_dev_softc *sd, uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) + return (0xffff); + + return (SIBA_READ_2(siba, offset)); +} + +static uint32_t +siba_pci_read_4(struct siba_dev_softc *sd, uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) + return (0xffff); + + return (SIBA_READ_4(siba, offset)); +} + +static void +siba_pci_write_2(struct siba_dev_softc *sd, uint16_t offset, uint16_t value) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) + return; + + SIBA_WRITE_2(siba, offset, value); +} + +static void +siba_pci_write_4(struct siba_dev_softc *sd, uint16_t offset, uint32_t value) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) + return; + + SIBA_WRITE_4(siba, offset, value); +} + +static void +siba_pci_read_multi_1(struct siba_dev_softc *sd, void *buffer, size_t count, + uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) { + memset(buffer, 0xff, count); + return; + } + + SIBA_READ_MULTI_1(siba, offset, buffer, count); +} + +static void +siba_pci_read_multi_2(struct siba_dev_softc *sd, void *buffer, size_t count, + uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) { + memset(buffer, 0xff, count); + return; + } + + KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__)); + SIBA_READ_MULTI_2(siba, offset, buffer, count >> 1); +} + +static void +siba_pci_read_multi_4(struct siba_dev_softc *sd, void *buffer, size_t count, + uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) { + memset(buffer, 0xff, count); + return; + } + + KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__)); + SIBA_READ_MULTI_4(siba, offset, buffer, count >> 2); +} + +static void +siba_pci_write_multi_1(struct siba_dev_softc *sd, const void *buffer, + size_t count, uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) + return; + + SIBA_WRITE_MULTI_1(siba, offset, buffer, count); +} + +static void +siba_pci_write_multi_2(struct siba_dev_softc *sd, const void *buffer, + size_t count, uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) + return; + + KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__)); + SIBA_WRITE_MULTI_2(siba, offset, buffer, count >> 1); +} + +static void +siba_pci_write_multi_4(struct siba_dev_softc *sd, const void *buffer, + size_t count, uint16_t offset) +{ + struct siba_softc *siba = sd->sd_bus; + + if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) + return; + + KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__)); + SIBA_WRITE_MULTI_4(siba, offset, buffer, count >> 2); +} + +void +siba_powerup(struct siba_softc *siba, int dynamic) +{ + + siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1); + siba_cc_clock(&siba->siba_cc, + (dynamic != 0) ? SIBA_CLOCK_DYNAMIC : SIBA_CLOCK_FAST); +} + +static void +siba_cc_clock(struct siba_cc *scc, enum siba_clock clock) +{ + struct siba_dev_softc *sd = scc->scc_dev; + struct siba_softc *siba; + uint32_t tmp; + + if (sd == NULL) + return; + siba = sd->sd_bus; + /* + * chipcommon < r6 (no dynamic clock control) + * chipcommon >= r10 (unknown) + */ + if (sd->sd_id.sd_rev < 6 || sd->sd_id.sd_rev >= 10 || + (scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0) + return; + + switch (clock) { + case SIBA_CLOCK_DYNAMIC: + tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) & + ~(SIBA_CC_CLKSLOW_ENXTAL | SIBA_CC_CLKSLOW_FSLOW | + SIBA_CC_CLKSLOW_IPLL); + if ((tmp & SIBA_CC_CLKSLOW_SRC) != SIBA_CC_CLKSLOW_SRC_CRYSTAL) + tmp |= SIBA_CC_CLKSLOW_ENXTAL; + SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW, tmp); + if (tmp & SIBA_CC_CLKSLOW_ENXTAL) + siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 0); + break; + case SIBA_CLOCK_SLOW: + SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW, + SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) | + SIBA_CC_CLKSLOW_FSLOW); + break; + case SIBA_CLOCK_FAST: + /* crystal on */ + siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 1); + SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW, + (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) | + SIBA_CC_CLKSLOW_IPLL) & ~SIBA_CC_CLKSLOW_FSLOW); + break; + default: + KASSERT(0 == 1, + ("%s: unsupported clock %#x", __func__, clock)); + } +} + +uint16_t +siba_read_2(struct siba_dev_softc *sd, uint16_t offset) +{ + + return (sd->sd_ops->read_2(sd, offset)); +} + +uint32_t +siba_read_4(struct siba_dev_softc *sd, uint16_t offset) +{ + + return (sd->sd_ops->read_4(sd, offset)); +} + +void +siba_write_2(struct siba_dev_softc *sd, uint16_t offset, uint16_t value) +{ + + sd->sd_ops->write_2(sd, offset, value); +} + +void +siba_write_4(struct siba_dev_softc *sd, uint16_t offset, uint32_t value) +{ + + sd->sd_ops->write_4(sd, offset, value); +} + +void +siba_read_multi_1(struct siba_dev_softc *sd, void *buffer, size_t count, + uint16_t offset) +{ + + sd->sd_ops->read_multi_1(sd, buffer, count, offset); +} + +void +siba_read_multi_2(struct siba_dev_softc *sd, void *buffer, size_t count, + uint16_t offset) +{ + + sd->sd_ops->read_multi_2(sd, buffer, count, offset); +} + +void +siba_read_multi_4(struct siba_dev_softc *sd, void *buffer, size_t count, + uint16_t offset) +{ + + sd->sd_ops->read_multi_4(sd, buffer, count, offset); +} + +void +siba_write_multi_1(struct siba_dev_softc *sd, const void *buffer, + size_t count, uint16_t offset) +{ + + sd->sd_ops->write_multi_1(sd, buffer, count, offset); +} + +void +siba_write_multi_2(struct siba_dev_softc *sd, const void *buffer, + size_t count, uint16_t offset) +{ + + sd->sd_ops->write_multi_2(sd, buffer, count, offset); +} + +void +siba_write_multi_4(struct siba_dev_softc *sd, const void *buffer, + size_t count, uint16_t offset) +{ + + sd->sd_ops->write_multi_4(sd, buffer, count, offset); +} + +static void +siba_cc_pmu_init(struct siba_cc *scc) +{ + const struct siba_cc_pmu_res_updown *updown = NULL; + const struct siba_cc_pmu_res_depend *depend = NULL; + struct siba_dev_softc *sd = scc->scc_dev; + struct siba_softc *siba = sd->sd_bus; + uint32_t min = 0, max = 0, pmucap; + unsigned int i, updown_size, depend_size; + + if ((scc->scc_caps & SIBA_CC_CAPS_PMU) == 0) + return; + + pmucap = SIBA_CC_READ32(scc, SIBA_CC_PMUCAPS); + scc->scc_pmu.rev = (pmucap & SIBA_CC_PMUCAPS_REV); + + DPRINTF(siba, SIBA_DEBUG_PMU, "PMU(r%u) found (caps %#x)\n", + scc->scc_pmu.rev, pmucap); + + if (scc->scc_pmu.rev >= 1) { + if (siba->siba_chiprev < 2 && siba->siba_chipid == 0x4325) + SIBA_CC_MASK32(scc, SIBA_CC_PMUCTL, + ~SIBA_CC_PMUCTL_NOILP); + else + SIBA_CC_SET32(scc, SIBA_CC_PMUCTL, + SIBA_CC_PMUCTL_NOILP); + } + + /* initialize PLL & PMU resources */ + switch (siba->siba_chipid) { + case 0x4312: + siba_cc_pmu1_pll0_init(scc, 0 /* use default */); + /* use the default: min = 0xcbb max = 0x7ffff */ + break; + case 0x4325: + siba_cc_pmu1_pll0_init(scc, 0 /* use default */); + + updown = siba_cc_pmu_4325_updown; + updown_size = N(siba_cc_pmu_4325_updown); + depend = siba_cc_pmu_4325_depend; + depend_size = N(siba_cc_pmu_4325_depend); + + min = (1 << SIBA_CC_PMU_4325_BURST) | + (1 << SIBA_CC_PMU_4325_LN); + if (SIBA_CC_READ32(scc, SIBA_CC_CHIPSTAT) & + SIBA_CC_CHST_4325_PMUTOP_2B) + min |= (1 << SIBA_CC_PMU_4325_CLBURST); + max = 0xfffff; + break; + case 0x4328: + siba_cc_pmu0_pll0_init(scc, 0 /* use default */); + + updown = siba_cc_pmu_4328_updown; + updown_size = N(siba_cc_pmu_4328_updown); + depend = siba_cc_pmu_4328_depend; + depend_size = N(siba_cc_pmu_4328_depend); + + min = (1 << SIBA_CC_PMU_4328_EXT_SWITCH_PWM) | + (1 << SIBA_CC_PMU_4328_BB_SWITCH_PWM) | + (1 << SIBA_CC_PMU_4328_CRYSTAL_EN); + + max = 0xfffff; + break; + case 0x5354: + siba_cc_pmu0_pll0_init(scc, 0 /* use default */); + + max = 0xfffff; + break; + default: + device_printf(siba->siba_dev, + "unknown chipid %#x for PLL & PMU init\n", + siba->siba_chipid); + } + + if (updown) { + for (i = 0; i < updown_size; i++) { + SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL, + updown[i].res); + SIBA_CC_WRITE32(scc, SIBA_CC_PMU_UPDNTM, + updown[i].updown); + } + } + if (depend) { + for (i = 0; i < depend_size; i++) { + SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL, + depend[i].res); + switch (depend[i].task) { + case SIBA_CC_PMU_DEP_SET: + SIBA_CC_WRITE32(scc, SIBA_CC_PMU_DEPMSK, + depend[i].depend); + break; + case SIBA_CC_PMU_DEP_ADD: + SIBA_CC_SET32(scc, SIBA_CC_PMU_DEPMSK, + depend[i].depend); + break; + case SIBA_CC_PMU_DEP_REMOVE: + SIBA_CC_MASK32(scc, SIBA_CC_PMU_DEPMSK, + ~(depend[i].depend)); + break; + default: + KASSERT(0 == 1, + ("%s:%d: assertion failed", + __func__, __LINE__)); + } + } + } + + if (min) + SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MINRES, min); + if (max) + SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MAXRES, max); +} + +static void +siba_cc_power_init(struct siba_cc *scc) +{ + struct siba_softc *siba = scc->scc_dev->sd_bus; + int maxfreq; + + if (siba->siba_chipid == 0x4321) { + if (siba->siba_chiprev == 0) + SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0x3a4); + else if (siba->siba_chiprev == 1) + SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0xa4); + } + + if ((scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0) + return; + + if (scc->scc_dev->sd_id.sd_rev >= 10) + SIBA_CC_WRITE32(scc, SIBA_CC_CLKSYSCTL, + (SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) & + 0xffff) | 0x40000); + else { + maxfreq = siba_cc_clockfreq(scc, 1); + SIBA_CC_WRITE32(scc, SIBA_CC_PLLONDELAY, + (maxfreq * 150 + 999999) / 1000000); + SIBA_CC_WRITE32(scc, SIBA_CC_FREFSELDELAY, + (maxfreq * 15 + 999999) / 1000000); + } +} + +static void +siba_cc_powerup_delay(struct siba_cc *scc) +{ + struct siba_softc *siba = scc->scc_dev->sd_bus; + int min; + + if (siba->siba_type != SIBA_TYPE_PCI || + !(scc->scc_caps & SIBA_CC_CAPS_PWCTL)) + return; + + min = siba_cc_clockfreq(scc, 0); + scc->scc_powerup_delay = + (((SIBA_CC_READ32(scc, SIBA_CC_PLLONDELAY) + 2) * 1000000) + + (min - 1)) / min; +} + +static int +siba_cc_clockfreq(struct siba_cc *scc, int max) +{ + enum siba_clksrc src; + int div = 1, limit = 0; + + src = siba_cc_clksrc(scc); + if (scc->scc_dev->sd_id.sd_rev < 6) { + div = (src == SIBA_CC_CLKSRC_PCI) ? 64 : + (src == SIBA_CC_CLKSRC_CRYSTAL) ? 32 : 1; + KASSERT(div != 1, + ("%s: unknown clock %d", __func__, src)); + } else if (scc->scc_dev->sd_id.sd_rev < 10) { + switch (src) { + case SIBA_CC_CLKSRC_CRYSTAL: + case SIBA_CC_CLKSRC_PCI: + div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) >> 16) + + 1) * 4; + break; + case SIBA_CC_CLKSRC_LOWPW: + break; + } + } else + div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) >> 16) + 1) * 4; + + switch (src) { + case SIBA_CC_CLKSRC_CRYSTAL: + limit = (max) ? 20200000 : 19800000; + break; + case SIBA_CC_CLKSRC_LOWPW: + limit = (max) ? 43000 : 25000; + break; + case SIBA_CC_CLKSRC_PCI: + limit = (max) ? 34000000 : 25000000; + break; + } + + return (limit / div); +} + +static void +siba_cc_pmu1_pll0_init(struct siba_cc *scc, uint32_t freq) +{ + struct siba_dev_softc *sd = scc->scc_dev; + struct siba_softc *siba = sd->sd_bus; + const struct siba_cc_pmu1_plltab *e = NULL; + uint32_t bufsth = 0, pll, pmu; + unsigned int i; + + KASSERT(freq == 0, ("%s:%d: assertion vail", __func__, __LINE__)); + if (siba->siba_chipid == 0x4312) { + scc->scc_pmu.freq = 20000; + return; + } + + e = siba_cc_pmu1_plltab_find(SIBA_CC_PMU1_DEFAULT_FREQ); + KASSERT(e != NULL, ("%s:%d: assertion vail", __func__, __LINE__)); + scc->scc_pmu.freq = e->freq; + + pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL); + if (SIBA_CC_PMUCTL_XF_VAL(pmu) == e->xf) + return; + + DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n", + (e->freq / 1000), (e->freq % 1000)); + + /* turn PLL off */ + switch (siba->siba_chipid) { + case 0x4325: + bufsth = 0x222222; + SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, + ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) | + (1 << SIBA_CC_PMU_4325_HT))); + SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES, + ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) | + (1 << SIBA_CC_PMU_4325_HT))); + break; + default: + KASSERT(0 == 1, + ("%s:%d: assertion failed", __func__, __LINE__)); + } + for (i = 0; i < 1500; i++) { + if (!(SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) & + SIBA_CC_CLKCTLSTATUS_HT)) + break; + DELAY(10); + } + if (SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) & SIBA_CC_CLKCTLSTATUS_HT) + device_printf(siba->siba_dev, "failed to turn PLL off!\n"); + + pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL0); + pll &= ~(SIBA_CC_PMU1_PLL0_P1DIV | SIBA_CC_PMU1_PLL0_P2DIV); + pll |= ((uint32_t)e->p1div << 20) & SIBA_CC_PMU1_PLL0_P1DIV; + pll |= ((uint32_t)e->p2div << 24) & SIBA_CC_PMU1_PLL0_P2DIV; + siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, pll); + + pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL2); + pll &= ~(SIBA_CC_PMU1_PLL2_NDIVINT | SIBA_CC_PMU1_PLL2_NDIVMODE); + pll |= ((uint32_t)e->ndiv_int << 20) & SIBA_CC_PMU1_PLL2_NDIVINT; + pll |= (1 << 17) & SIBA_CC_PMU1_PLL2_NDIVMODE; + siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, pll); + + pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL3); + pll &= ~SIBA_CC_PMU1_PLL3_NDIVFRAC; + pll |= ((uint32_t)e->ndiv_frac << 0) & SIBA_CC_PMU1_PLL3_NDIVFRAC; + siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, pll); + + if (bufsth) { + pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL5); + pll &= ~SIBA_CC_PMU1_PLL5_CLKDRV; + pll |= (bufsth << 8) & SIBA_CC_PMU1_PLL5_CLKDRV; + siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, pll); + } + + pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL); + pmu &= ~(SIBA_CC_PMUCTL_ILP | SIBA_CC_PMUCTL_XF); + pmu |= ((((uint32_t)e->freq + 127) / 128 - 1) << 16) & + SIBA_CC_PMUCTL_ILP; + pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF; + SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu); +} + +static void +siba_cc_pmu0_pll0_init(struct siba_cc *scc, uint32_t xtalfreq) +{ + struct siba_dev_softc *sd = scc->scc_dev; + struct siba_softc *siba = sd->sd_bus; + const struct siba_cc_pmu0_plltab *e = NULL; + uint32_t pmu, tmp, pll; + unsigned int i; + + if ((siba->siba_chipid == 0x5354) && !xtalfreq) + xtalfreq = 25000; + if (xtalfreq) + e = siba_cc_pmu0_plltab_findentry(xtalfreq); + if (!e) + e = siba_cc_pmu0_plltab_findentry( + SIBA_CC_PMU0_DEFAULT_XTALFREQ); + KASSERT(e != NULL, ("%s:%d: fail", __func__, __LINE__)); + xtalfreq = e->freq; + scc->scc_pmu.freq = e->freq; + + pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL); + if (((pmu & SIBA_CC_PMUCTL_XF) >> 2) == e->xf) + return; + + DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u mhz\n", + (xtalfreq / 1000), (xtalfreq % 1000)); + + KASSERT(siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354, + ("%s:%d: fail", __func__, __LINE__)); + + switch (siba->siba_chipid) { + case 0x4328: + SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, + ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU)); + SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES, + ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU)); + break; + case 0x5354: + SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, + ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU)); + SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES, + ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU)); + break; + } + for (i = 1500; i; i--) { + tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS); + if (!(tmp & SIBA_CC_CLKCTLSTATUS_HT)) + break; + DELAY(10); + } + tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS); + if (tmp & SIBA_CC_CLKCTLSTATUS_HT) + device_printf(siba->siba_dev, "failed to turn PLL off!\n"); + + /* set PDIV */ + pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL0); + if (xtalfreq >= SIBA_CC_PMU0_PLL0_PDIV_FREQ) + pll |= SIBA_CC_PMU0_PLL0_PDIV_MSK; + else + pll &= ~SIBA_CC_PMU0_PLL0_PDIV_MSK; + siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL0, pll); + + /* set WILD */ + pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL1); + pll &= ~(SIBA_CC_PMU0_PLL1_STOPMOD | SIBA_CC_PMU0_PLL1_IMSK | + SIBA_CC_PMU0_PLL1_FMSK); + pll |= ((uint32_t)e->wb_int << 28) & SIBA_CC_PMU0_PLL1_IMSK; + pll |= ((uint32_t)e->wb_frac << 8) & SIBA_CC_PMU0_PLL1_FMSK; + if (e->wb_frac == 0) + pll |= SIBA_CC_PMU0_PLL1_STOPMOD; + siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL1, pll); + + /* set WILD */ + pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL2); + pll &= ~SIBA_CC_PMU0_PLL2_IMSKHI; + pll |= (((uint32_t)e->wb_int >> 4) << 0) & SIBA_CC_PMU0_PLL2_IMSKHI; + siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL2, pll); + + /* set freq and divisor. */ + pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL); + pmu &= ~SIBA_CC_PMUCTL_ILP; + pmu |= (((xtalfreq + 127) / 128 - 1) << 16) & SIBA_CC_PMUCTL_ILP; + pmu &= ~SIBA_CC_PMUCTL_XF; + pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF; + SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu); +} + +static enum siba_clksrc +siba_cc_clksrc(struct siba_cc *scc) +{ + struct siba_dev_softc *sd = scc->scc_dev; + struct siba_softc *siba = sd->sd_bus; + + if (sd->sd_id.sd_rev < 6) { + if (siba->siba_type == SIBA_TYPE_PCI) { + if (pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4) & + 0x10) + return (SIBA_CC_CLKSRC_PCI); + return (SIBA_CC_CLKSRC_CRYSTAL); + } + if (siba->siba_type == SIBA_TYPE_SSB || + siba->siba_type == SIBA_TYPE_PCMCIA) + return (SIBA_CC_CLKSRC_CRYSTAL); + } + if (sd->sd_id.sd_rev < 10) { + switch (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) & 0x7) { + case 0: + return (SIBA_CC_CLKSRC_LOWPW); + case 1: + return (SIBA_CC_CLKSRC_CRYSTAL); + case 2: + return (SIBA_CC_CLKSRC_PCI); + default: + break; + } + } + + return (SIBA_CC_CLKSRC_CRYSTAL); +} + +static const struct siba_cc_pmu1_plltab * +siba_cc_pmu1_plltab_find(uint32_t crystalfreq) +{ + const struct siba_cc_pmu1_plltab *e; + unsigned int i; + + for (i = 0; i < N(siba_cc_pmu1_plltab); i++) { + e = &siba_cc_pmu1_plltab[i]; + if (crystalfreq == e->freq) + return (e); + } + + return (NULL); +} + +static uint32_t +siba_cc_pll_read(struct siba_cc *scc, uint32_t offset) +{ + + SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset); + return (SIBA_CC_READ32(scc, SIBA_CC_PLLCTL_DATA)); +} + +static void +siba_cc_pll_write(struct siba_cc *scc, uint32_t offset, uint32_t value) +{ + + SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset); + SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_DATA, value); +} + +static const struct siba_cc_pmu0_plltab * +siba_cc_pmu0_plltab_findentry(uint32_t crystalfreq) +{ + const struct siba_cc_pmu0_plltab *e; + unsigned int i; + + for (i = 0; i < N(siba_cc_pmu0_plltab); i++) { + e = &siba_cc_pmu0_plltab[i]; + if (e->freq == crystalfreq) + return (e); + } + + return (NULL); +} + +static int +siba_pci_sprom(struct siba_softc *siba, struct siba_sprom *sprom) +{ + int error = ENOMEM; + uint16_t *buf; + + buf = malloc(SIBA_SPROMSIZE_R123 * sizeof(uint16_t), + M_DEVBUF, M_NOWAIT | M_ZERO); + if (buf == NULL) + return (ENOMEM); + siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R123); + error = sprom_check_crc(buf, siba->siba_spromsize); + if (error) { + free(buf, M_DEVBUF); + buf = malloc(SIBA_SPROMSIZE_R4 * sizeof(uint16_t), + M_DEVBUF, M_NOWAIT | M_ZERO); + if (buf == NULL) + return (ENOMEM); + siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R4); + error = sprom_check_crc(buf, siba->siba_spromsize); + if (error) + device_printf(siba->siba_dev, "warn: bad SPROM CRC\n"); + } + + bzero(sprom, sizeof(*sprom)); + + sprom->rev = buf[siba->siba_spromsize - 1] & 0x00FF; + DPRINTF(siba, SIBA_DEBUG_SPROM, "SPROM rev %d\n", + sprom->rev); + memset(sprom->mac_eth, 0xff, 6); + memset(sprom->mac_80211a, 0xff, 6); + if ((siba->siba_chipid & 0xff00) == 0x4400) { + sprom->rev = 1; + siba_sprom_r123(sprom, buf); + } else if (siba->siba_chipid == 0x4321) { + sprom->rev = 4; + siba_sprom_r45(sprom, buf); + } else { + switch (sprom->rev) { + case 1: + case 2: + case 3: + siba_sprom_r123(sprom, buf); + break; + case 4: + case 5: + siba_sprom_r45(sprom, buf); + break; + case 8: + siba_sprom_r8(sprom, buf); + break; + default: + device_printf(siba->siba_dev, + "unknown SPROM revision %d.\n", sprom->rev); + siba_sprom_r123(sprom, buf); + } + } + + if (sprom->bf_lo == 0xffff) + sprom->bf_lo = 0; + if (sprom->bf_hi == 0xffff) + sprom->bf_hi = 0; + + free(buf, M_DEVBUF); + return (error); +} + +static int +siba_sprom_read(struct siba_softc *siba, uint16_t *sprom, uint16_t len) +{ + int i; + + for (i = 0; i < len; i++) + sprom[i] = SIBA_READ_2(siba, SIBA_SPROM_BASE + (i * 2)); + + siba->siba_spromsize = len; + return (0); +} + +static int +sprom_check_crc(const uint16_t *sprom, size_t size) +{ + int word; + uint8_t crc0, crc1 = 0xff; + + crc0 = (sprom[size - 1] & SIBA_SPROM_REV_CRC) >> 8; + for (word = 0; word < size - 1; word++) { + crc1 = siba_crc8(crc1, sprom[word] & 0x00ff); + crc1 = siba_crc8(crc1, (sprom[word] & 0xff00) >> 8); + } + crc1 = siba_crc8(crc1, sprom[size - 1] & 0x00ff); + crc1 ^= 0xff; + + return ((crc0 != crc1) ? EPROTO : 0); +} + +static uint8_t +siba_crc8(uint8_t crc, uint8_t data) +{ + static const uint8_t ct[] = { + 0x00, 0xf7, 0xb9, 0x4e, 0x25, 0xd2, 0x9c, 0x6b, + 0x4a, 0xbd, 0xf3, 0x04, 0x6f, 0x98, 0xd6, 0x21, + 0x94, 0x63, 0x2d, 0xda, 0xb1, 0x46, 0x08, 0xff, + 0xde, 0x29, 0x67, 0x90, 0xfb, 0x0c, 0x42, 0xb5, + 0x7f, 0x88, 0xc6, 0x31, 0x5a, 0xad, 0xe3, 0x14, + 0x35, 0xc2, 0x8c, 0x7b, 0x10, 0xe7, 0xa9, 0x5e, + 0xeb, 0x1c, 0x52, 0xa5, 0xce, 0x39, 0x77, 0x80, + 0xa1, 0x56, 0x18, 0xef, 0x84, 0x73, 0x3d, 0xca, + 0xfe, 0x09, 0x47, 0xb0, 0xdb, 0x2c, 0x62, 0x95, + 0xb4, 0x43, 0x0d, 0xfa, 0x91, 0x66, 0x28, 0xdf, + 0x6a, 0x9d, 0xd3, 0x24, 0x4f, 0xb8, 0xf6, 0x01, + 0x20, 0xd7, 0x99, 0x6e, 0x05, 0xf2, 0xbc, 0x4b, + 0x81, 0x76, 0x38, 0xcf, 0xa4, 0x53, 0x1d, 0xea, + 0xcb, 0x3c, 0x72, 0x85, 0xee, 0x19, 0x57, 0xa0, + 0x15, 0xe2, 0xac, 0x5b, 0x30, 0xc7, 0x89, 0x7e, + 0x5f, 0xa8, 0xe6, 0x11, 0x7a, 0x8d, 0xc3, 0x34, + 0xab, 0x5c, 0x12, 0xe5, 0x8e, 0x79, 0x37, 0xc0, + 0xe1, 0x16, 0x58, 0xaf, 0xc4, 0x33, 0x7d, 0x8a, + 0x3f, 0xc8, 0x86, 0x71, 0x1a, 0xed, 0xa3, 0x54, + 0x75, 0x82, 0xcc, 0x3b, 0x50, 0xa7, 0xe9, 0x1e, + 0xd4, 0x23, 0x6d, 0x9a, 0xf1, 0x06, 0x48, 0xbf, + 0x9e, 0x69, 0x27, 0xd0, 0xbb, 0x4c, 0x02, 0xf5, + 0x40, 0xb7, 0xf9, 0x0e, 0x65, 0x92, 0xdc, 0x2b, + 0x0a, 0xfd, 0xb3, 0x44, 0x2f, 0xd8, 0x96, 0x61, + 0x55, 0xa2, 0xec, 0x1b, 0x70, 0x87, 0xc9, 0x3e, + 0x1f, 0xe8, 0xa6, 0x51, 0x3a, 0xcd, 0x83, 0x74, + 0xc1, 0x36, 0x78, 0x8f, 0xe4, 0x13, 0x5d, 0xaa, + 0x8b, 0x7c, 0x32, 0xc5, 0xae, 0x59, 0x17, 0xe0, + 0x2a, 0xdd, 0x93, 0x64, 0x0f, 0xf8, 0xb6, 0x41, + 0x60, 0x97, 0xd9, 0x2e, 0x45, 0xb2, 0xfc, 0x0b, + 0xbe, 0x49, 0x07, 0xf0, 0x9b, 0x6c, 0x22, 0xd5, + 0xf4, 0x03, 0x4d, 0xba, 0xd1, 0x26, 0x68, 0x9f, + }; + return (ct[crc ^ data]); +} + +#define SIBA_LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask)) +#define SIBA_OFFSET(offset) \ + (((offset) - SIBA_SPROM_BASE) / sizeof(uint16_t)) +#define SIBA_SHIFTOUT_SUB(__x, __mask) \ + (((__x) & (__mask)) / SIBA_LOWEST_SET_BIT(__mask)) +#define SIBA_SHIFTOUT(_var, _offset, _mask) \ + out->_var = SIBA_SHIFTOUT_SUB(in[SIBA_OFFSET(_offset)], (_mask)) +#define SIBA_SHIFTOUT_4(_var, _offset, _mask, _shift) \ + out->_var = ((((uint32_t)in[SIBA_OFFSET((_offset)+2)] << 16 | \ + in[SIBA_OFFSET(_offset)]) & (_mask)) >> (_shift)) + +static void +siba_sprom_r123(struct siba_sprom *out, const uint16_t *in) +{ + int i; + uint16_t v; + int8_t gain; + uint16_t loc[3]; + + if (out->rev == 3) + loc[0] = SIBA_SPROM3_MAC_80211BG; + else { + loc[0] = SIBA_SPROM1_MAC_80211BG; + loc[1] = SIBA_SPROM1_MAC_ETH; + loc[2] = SIBA_SPROM1_MAC_80211A; + } + for (i = 0; i < 3; i++) { + v = in[SIBA_OFFSET(loc[0]) + i]; + *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v); + } + if (out->rev < 3) { + for (i = 0; i < 3; i++) { + v = in[SIBA_OFFSET(loc[1]) + i]; + *(((uint16_t *)out->mac_eth) + i) = htobe16(v); + } + for (i = 0; i < 3; i++) { + v = in[SIBA_OFFSET(loc[2]) + i]; + *(((uint16_t *)out->mac_80211a) + i) = htobe16(v); + } + } + SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM1_ETHPHY, + SIBA_SPROM1_ETHPHY_MII_ETH0); + SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM1_ETHPHY, + SIBA_SPROM1_ETHPHY_MII_ETH1); + SIBA_SHIFTOUT(mdio_eth0, SIBA_SPROM1_ETHPHY, + SIBA_SPROM1_ETHPHY_MDIO_ETH0); + SIBA_SHIFTOUT(mdio_eth1, SIBA_SPROM1_ETHPHY, + SIBA_SPROM1_ETHPHY_MDIO_ETH1); + SIBA_SHIFTOUT(brev, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_BREV); + SIBA_SHIFTOUT(ccode, SIBA_SPROM1_BOARDINFO, + SIBA_SPROM1_BOARDINFO_CCODE); + SIBA_SHIFTOUT(ant_a, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_ANTA); + SIBA_SHIFTOUT(ant_bg, SIBA_SPROM1_BOARDINFO, + SIBA_SPROM1_BOARDINFO_ANTBG); + SIBA_SHIFTOUT(pa0b0, SIBA_SPROM1_PA0B0, 0xffff); + SIBA_SHIFTOUT(pa0b1, SIBA_SPROM1_PA0B1, 0xffff); + SIBA_SHIFTOUT(pa0b2, SIBA_SPROM1_PA0B2, 0xffff); + SIBA_SHIFTOUT(pa1b0, SIBA_SPROM1_PA1B0, 0xffff); + SIBA_SHIFTOUT(pa1b1, SIBA_SPROM1_PA1B1, 0xffff); + SIBA_SHIFTOUT(pa1b2, SIBA_SPROM1_PA1B2, 0xffff); + SIBA_SHIFTOUT(gpio0, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P0); + SIBA_SHIFTOUT(gpio1, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P1); + SIBA_SHIFTOUT(gpio2, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P2); + SIBA_SHIFTOUT(gpio3, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P3); + + SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_A); + SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_BG); + SIBA_SHIFTOUT(tssi_a, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_A); + SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_BG); + SIBA_SHIFTOUT(bf_lo, SIBA_SPROM1_BFLOW, 0xffff); + if (out->rev >= 2) + SIBA_SHIFTOUT(bf_hi, SIBA_SPROM2_BFHIGH, 0xffff); + + /* antenna gain */ + gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_BG, 0); + out->again.ghz24.a0 = out->again.ghz24.a1 = gain; + out->again.ghz24.a2 = out->again.ghz24.a3 = gain; + gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_A, 8); + out->again.ghz5.a0 = out->again.ghz5.a1 = gain; + out->again.ghz5.a2 = out->again.ghz5.a3 = gain; +} + +static void +siba_sprom_r45(struct siba_sprom *out, const uint16_t *in) +{ + int i; + uint16_t v; + uint16_t mac_80211bg_offset; + + if (out->rev == 4) + mac_80211bg_offset = SIBA_SPROM4_MAC_80211BG; + else + mac_80211bg_offset = SIBA_SPROM5_MAC_80211BG; + for (i = 0; i < 3; i++) { + v = in[SIBA_OFFSET(mac_80211bg_offset) + i]; + *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v); + } + SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET0A); + SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET1A); + if (out->rev == 4) { + SIBA_SHIFTOUT(ccode, SIBA_SPROM4_CCODE, 0xffff); + SIBA_SHIFTOUT(bf_lo, SIBA_SPROM4_BFLOW, 0xffff); + SIBA_SHIFTOUT(bf_hi, SIBA_SPROM4_BFHIGH, 0xffff); + } else { + SIBA_SHIFTOUT(ccode, SIBA_SPROM5_CCODE, 0xffff); + SIBA_SHIFTOUT(bf_lo, SIBA_SPROM5_BFLOW, 0xffff); + SIBA_SHIFTOUT(bf_hi, SIBA_SPROM5_BFHIGH, 0xffff); + } + SIBA_SHIFTOUT(ant_a, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_A); + SIBA_SHIFTOUT(ant_bg, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_BG); + SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_MAXP_BG_MASK); + SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_TSSI_BG); + SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_MAXP_A_MASK); + SIBA_SHIFTOUT(tssi_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_TSSI_A); + if (out->rev == 4) { + SIBA_SHIFTOUT(gpio0, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P0); + SIBA_SHIFTOUT(gpio1, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P1); + SIBA_SHIFTOUT(gpio2, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P2); + SIBA_SHIFTOUT(gpio3, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P3); + } else { + SIBA_SHIFTOUT(gpio0, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P0); + SIBA_SHIFTOUT(gpio1, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P1); + SIBA_SHIFTOUT(gpio2, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P2); + SIBA_SHIFTOUT(gpio3, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P3); + } + + /* antenna gain */ + SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN0); + SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN1); + SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN2); + SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN3); + bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5)); +} + +static void +siba_sprom_r8(struct siba_sprom *out, const uint16_t *in) +{ + int i; + uint16_t v; + + for (i = 0; i < 3; i++) { + v = in[SIBA_OFFSET(SIBA_SPROM8_MAC_80211BG) + i]; + *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v); + } + SIBA_SHIFTOUT(ccode, SIBA_SPROM8_CCODE, 0xffff); + SIBA_SHIFTOUT(bf_lo, SIBA_SPROM8_BFLOW, 0xffff); + SIBA_SHIFTOUT(bf_hi, SIBA_SPROM8_BFHIGH, 0xffff); + SIBA_SHIFTOUT(bf2_lo, SIBA_SPROM8_BFL2LO, 0xffff); + SIBA_SHIFTOUT(bf2_hi, SIBA_SPROM8_BFL2HI, 0xffff); + SIBA_SHIFTOUT(ant_a, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_A); + SIBA_SHIFTOUT(ant_bg, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_BG); + SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_MAXP_BG_MASK); + SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_TSSI_BG); + SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_MAXP_A_MASK); + SIBA_SHIFTOUT(tssi_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_TSSI_A); + SIBA_SHIFTOUT(maxpwr_ah, SIBA_SPROM8_MAXP_AHL, + SIBA_SPROM8_MAXP_AH_MASK); + SIBA_SHIFTOUT(maxpwr_al, SIBA_SPROM8_MAXP_AHL, + SIBA_SPROM8_MAXP_AL_MASK); + SIBA_SHIFTOUT(gpio0, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P0); + SIBA_SHIFTOUT(gpio1, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P1); + SIBA_SHIFTOUT(gpio2, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P2); + SIBA_SHIFTOUT(gpio3, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P3); + SIBA_SHIFTOUT(tri2g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI2G); + SIBA_SHIFTOUT(tri5g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI5G); + SIBA_SHIFTOUT(tri5gl, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GL); + SIBA_SHIFTOUT(tri5gh, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GH); + SIBA_SHIFTOUT(rxpo2g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO2G); + SIBA_SHIFTOUT(rxpo5g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO5G); + SIBA_SHIFTOUT(rssismf2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMF2G); + SIBA_SHIFTOUT(rssismc2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMC2G); + SIBA_SHIFTOUT(rssisav2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISAV2G); + SIBA_SHIFTOUT(bxa2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_BXA2G); + SIBA_SHIFTOUT(rssismf5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMF5G); + SIBA_SHIFTOUT(rssismc5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMC5G); + SIBA_SHIFTOUT(rssisav5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISAV5G); + SIBA_SHIFTOUT(bxa5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_BXA5G); + + SIBA_SHIFTOUT(pa0b0, SIBA_SPROM8_PA0B0, 0xffff); + SIBA_SHIFTOUT(pa0b1, SIBA_SPROM8_PA0B1, 0xffff); + SIBA_SHIFTOUT(pa0b2, SIBA_SPROM8_PA0B2, 0xffff); + SIBA_SHIFTOUT(pa1b0, SIBA_SPROM8_PA1B0, 0xffff); + SIBA_SHIFTOUT(pa1b1, SIBA_SPROM8_PA1B1, 0xffff); + SIBA_SHIFTOUT(pa1b2, SIBA_SPROM8_PA1B2, 0xffff); + SIBA_SHIFTOUT(pa1lob0, SIBA_SPROM8_PA1LOB0, 0xffff); + SIBA_SHIFTOUT(pa1lob1, SIBA_SPROM8_PA1LOB1, 0xffff); + SIBA_SHIFTOUT(pa1lob2, SIBA_SPROM8_PA1LOB2, 0xffff); + SIBA_SHIFTOUT(pa1hib0, SIBA_SPROM8_PA1HIB0, 0xffff); + SIBA_SHIFTOUT(pa1hib1, SIBA_SPROM8_PA1HIB1, 0xffff); + SIBA_SHIFTOUT(pa1hib2, SIBA_SPROM8_PA1HIB2, 0xffff); + SIBA_SHIFTOUT(cck2gpo, SIBA_SPROM8_CCK2GPO, 0xffff); + + SIBA_SHIFTOUT_4(ofdm2gpo, SIBA_SPROM8_OFDM2GPO, 0xffffffff, 0); + SIBA_SHIFTOUT_4(ofdm5glpo, SIBA_SPROM8_OFDM5GLPO, 0xffffffff, 0); + SIBA_SHIFTOUT_4(ofdm5gpo, SIBA_SPROM8_OFDM5GPO, 0xffffffff, 0); + SIBA_SHIFTOUT_4(ofdm5ghpo, SIBA_SPROM8_OFDM5GHPO, 0xffffffff, 0); + + /* antenna gain */ + SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN0); + SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN1); + SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN2); + SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN3); + bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5)); +} + +static int8_t +siba_sprom_r123_antgain(uint8_t sprom_revision, const uint16_t *in, + uint16_t mask, uint16_t shift) +{ + uint16_t v; + uint8_t gain; + + v = in[SIBA_OFFSET(SIBA_SPROM1_AGAIN)]; + gain = (v & mask) >> shift; + gain = (gain == 0xff) ? 2 : (sprom_revision == 1) ? gain << 2 : + ((gain & 0xc0) >> 6) | ((gain & 0x3f) << 2); + + return ((int8_t)gain); +} + +#undef SIBA_LOWEST_SET_BIT +#undef SIBA_OFFSET +#undef SIBA_SHIFTOUT_SUB +#undef SIBA_SHIFTOUT + +int +siba_powerdown(struct siba_softc *siba) +{ + struct siba_cc *scc; + + if (siba->siba_type == SIBA_TYPE_SSB) + return (0); + + scc = &siba->siba_cc; + if (!scc->scc_dev || scc->scc_dev->sd_id.sd_rev < 5) + return (0); + siba_cc_clock(scc, SIBA_CLOCK_SLOW); + siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0); + return (0); +} + +static void +siba_pcicore_init(struct siba_pci *spc) +{ + struct siba_dev_softc *sd = spc->spc_dev; + struct siba_softc *siba; + + if (sd == NULL) + return; + + siba = sd->sd_bus; + if (!siba_dev_isup(sd)) + siba_dev_up(sd, 0); + + KASSERT(spc->spc_hostmode == 0, + ("%s:%d: hostmode", __func__, __LINE__)); + /* disable PCI interrupt */ + siba_write_4(spc->spc_dev, SIBA_INTR_MASK, 0); +} + +int +siba_dev_isup(struct siba_dev_softc *sd) +{ + uint32_t reject, val; + + reject = siba_tmslow_reject_bitmask(sd); + val = siba_read_4(sd, SIBA_TGSLOW); + val &= SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_RESET | reject; + + return (val == SIBA_TGSLOW_CLOCK); +} + +void +siba_dev_up(struct siba_dev_softc *sd, uint32_t flags) +{ + uint32_t val; + + siba_dev_down(sd, flags); + siba_write_4(sd, SIBA_TGSLOW, SIBA_TGSLOW_RESET | SIBA_TGSLOW_CLOCK | + SIBA_TGSLOW_FGC | flags); + siba_read_4(sd, SIBA_TGSLOW); + DELAY(1); + + if (siba_read_4(sd, SIBA_TGSHIGH) & SIBA_TGSHIGH_SERR) + siba_write_4(sd, SIBA_TGSHIGH, 0); + + val = siba_read_4(sd, SIBA_IAS); + if (val & (SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT)) { + val &= ~(SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT); + siba_write_4(sd, SIBA_IAS, val); + } + + siba_write_4(sd, SIBA_TGSLOW, + SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags); + siba_read_4(sd, SIBA_TGSLOW); + DELAY(1); + + siba_write_4(sd, SIBA_TGSLOW, SIBA_TGSLOW_CLOCK | flags); + siba_read_4(sd, SIBA_TGSLOW); + DELAY(1); +} + +static uint32_t +siba_tmslow_reject_bitmask(struct siba_dev_softc *sd) +{ + uint32_t rev = siba_read_4(sd, SIBA_IDLOW) & SIBA_IDLOW_SSBREV; + + switch (rev) { + case SIBA_IDLOW_SSBREV_22: + return (SIBA_TGSLOW_REJECT_22); + case SIBA_IDLOW_SSBREV_23: + return (SIBA_TGSLOW_REJECT_23); + case SIBA_IDLOW_SSBREV_24: + case SIBA_IDLOW_SSBREV_25: + case SIBA_IDLOW_SSBREV_26: + case SIBA_IDLOW_SSBREV_27: + return (SIBA_TGSLOW_REJECT_23); + default: + KASSERT(0 == 1, + ("%s:%d: unknown backplane rev %#x\n", + __func__, __LINE__, rev)); + } + return (SIBA_TGSLOW_REJECT_22 | SIBA_TGSLOW_REJECT_23); +} + +void +siba_dev_down(struct siba_dev_softc *sd, uint32_t flags) +{ + struct siba_softc *siba = sd->sd_bus; + uint32_t reject, val; + int i; + + if (siba_read_4(sd, SIBA_TGSLOW) & SIBA_TGSLOW_RESET) + return; + + reject = siba_tmslow_reject_bitmask(sd); + siba_write_4(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_CLOCK); + + for (i = 0; i < 1000; i++) { + val = siba_read_4(sd, SIBA_TGSLOW); + if (val & reject) + break; + DELAY(10); + } + if ((val & reject) == 0) { + device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n", + reject, SIBA_TGSLOW); + } + for (i = 0; i < 1000; i++) { + val = siba_read_4(sd, SIBA_TGSHIGH); + if (!(val & SIBA_TGSHIGH_BUSY)) + break; + DELAY(10); + } + if ((val & SIBA_TGSHIGH_BUSY) != 0) { + device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n", + SIBA_TGSHIGH_BUSY, SIBA_TGSHIGH); + } + + siba_write_4(sd, SIBA_TGSLOW, SIBA_TGSLOW_FGC | SIBA_TGSLOW_CLOCK | + reject | SIBA_TGSLOW_RESET | flags); + siba_read_4(sd, SIBA_TGSLOW); + DELAY(1); + siba_write_4(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_RESET | flags); + siba_read_4(sd, SIBA_TGSLOW); + DELAY(1); +} + +static void +siba_pcicore_setup(struct siba_pci *spc, struct siba_dev_softc *sd) +{ + struct siba_dev_softc *psd = spc->spc_dev; + struct siba_softc *siba = psd->sd_bus; + uint32_t tmp; + + if (psd->sd_id.sd_device == SIBA_DEVID_PCI) { + siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2, + siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2) | + SIBA_PCICORE_SBTOPCI_PREF | SIBA_PCICORE_SBTOPCI_BURST); + + if (psd->sd_id.sd_rev < 5) { + tmp = siba_read_4(psd, SIBA_IMCFGLO); + tmp &= ~SIBA_IMCFGLO_SERTO; + tmp = (tmp | 2) & ~SIBA_IMCFGLO_REQTO; + tmp |= 3 << 4 /* SIBA_IMCFGLO_REQTO_SHIFT */; + siba_write_4(psd, SIBA_IMCFGLO, tmp); + + /* broadcast value */ + sd = (siba->siba_cc.scc_dev != NULL) ? + siba->siba_cc.scc_dev : siba->siba_pci.spc_dev; + if (sd != NULL) { + siba_write_4(sd, SIBA_PCICORE_BCAST_ADDR, + 0xfd8); + siba_read_4(sd, SIBA_PCICORE_BCAST_ADDR); + siba_write_4(sd, SIBA_PCICORE_BCAST_DATA, 0); + siba_read_4(sd, SIBA_PCICORE_BCAST_DATA); + } + } else if (psd->sd_id.sd_rev >= 11) { + tmp = siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2); + tmp |= SIBA_PCICORE_SBTOPCI_MRM; + siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2, tmp); + } + } else { + KASSERT(psd->sd_id.sd_device == SIBA_DEVID_PCIE, ("only PCIE")); + if ((psd->sd_id.sd_rev == 0) || (psd->sd_id.sd_rev == 1)) + siba_pcie_write(spc, 0x4, + siba_pcie_read(spc, 0x4) | 0x8); + if (psd->sd_id.sd_rev == 0) { + siba_pcie_mdio_write(spc, 0x1f, 2, 0x8128); /* Timer */ + siba_pcie_mdio_write(spc, 0x1f, 6, 0x0100); /* CDR */ + siba_pcie_mdio_write(spc, 0x1f, 7, 0x1466); /* CDR BW */ + } else if (psd->sd_id.sd_rev == 1) + siba_pcie_write(spc, 0x100, + siba_pcie_read(spc, 0x100) | 0x40); + } + spc->spc_inited = 1; +} + +void +siba_pcicore_intr(struct siba_pci *spc, struct siba_dev_softc *sd) +{ + struct siba_dev_softc *psd = spc->spc_dev; + struct siba_softc *siba; + uint32_t tmp; + + if (sd->sd_bus->siba_type != SIBA_TYPE_PCI || !psd) + return; + + siba = psd->sd_bus; + /* enable interrupts */ + if (siba->siba_dev != NULL && + (psd->sd_id.sd_rev >= 6 || psd->sd_id.sd_device == SIBA_DEVID_PCIE)) { + tmp = pci_read_config(siba->siba_dev, SIBA_IRQMASK, 4); + tmp |= (1 << sd->sd_coreidx) << 8; + pci_write_config(siba->siba_dev, SIBA_IRQMASK, tmp, 4); + } else { + tmp = siba_read_4(sd, SIBA_TPS); + tmp &= SIBA_TPS_BPFLAG; + siba_write_4(psd, SIBA_INTR_MASK, + siba_read_4(psd, SIBA_INTR_MASK) | (1 << tmp)); + } + + /* setup PCIcore */ + if (spc->spc_inited == 0) + siba_pcicore_setup(spc, sd); +} + +static uint32_t +siba_pcicore_read_4(struct siba_pci *spc, uint16_t offset) +{ + + return (siba_read_4(spc->spc_dev, offset)); +} + +static void +siba_pcicore_write_4(struct siba_pci *spc, uint16_t offset, uint32_t value) +{ + + siba_write_4(spc->spc_dev, offset, value); +} + +static uint32_t +siba_pcie_read(struct siba_pci *spc, uint32_t address) +{ + + siba_pcicore_write_4(spc, 0x130, address); + return (siba_pcicore_read_4(spc, 0x134)); +} + +static void +siba_pcie_write(struct siba_pci *spc, uint32_t address, uint32_t data) +{ + + siba_pcicore_write_4(spc, 0x130, address); + siba_pcicore_write_4(spc, 0x134, data); +} + +static void +siba_pcie_mdio_write(struct siba_pci *spc, uint8_t device, uint8_t address, + uint16_t data) +{ + int i; + + siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0x80 | 0x2); + siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_DATA, + (1 << 30) | (1 << 28) | + ((uint32_t)device << 22) | ((uint32_t)address << 18) | + (1 << 17) | data); + DELAY(10); + for (i = 0; i < 10; i++) { + if (siba_pcicore_read_4(spc, SIBA_PCICORE_MDIO_CTL) & 0x100) + break; + DELAY(1000); + } + siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0); +} + +uint32_t +siba_dma_translation(struct siba_dev_softc *sd) +{ + + KASSERT(sd->sd_bus->siba_type == SIBA_TYPE_PCI, + ("unsupported bustype %d\n", sd->sd_bus->siba_type)); + return (SIBA_PCI_DMA); +} + +void +siba_barrier(struct siba_dev_softc *sd, int flags) +{ + struct siba_softc *siba = sd->sd_bus; + + SIBA_BARRIER(siba, flags); +} + +/* + * Attach it as child. + */ +device_t +siba_add_child(device_t dev, struct siba_softc *siba, int order, + const char *name, int unit) +{ + struct siba_dev_softc *sd; + device_t child; + int idx = 0, i; + + child = device_add_child(dev, name, unit); + if (child == NULL) + return (NULL); + + siba_powerup(siba, 0); + siba_pcicore_init(&siba->siba_pci); + siba_powerdown(siba); + + for (i = 0; i < siba->siba_ndevs; i++) { + sd = &(siba->siba_devs[i]); + + if (sd->sd_id.sd_device != SIBA_DEVID_80211) { + DPRINTF(siba, SIBA_DEBUG_CORE, + "skip to register coreid %#x (%s)\n", + sd->sd_id.sd_device, + siba_core_name(sd->sd_id.sd_device)); + continue; + } + + DPRINTF(siba, SIBA_DEBUG_CORE, + "siba: attaching coreid %#x (%s) idx %d\n", + sd->sd_id.sd_device, + siba_core_name(sd->sd_id.sd_device), idx); + + KASSERT(sd->sd_id.sd_device == SIBA_DEVID_80211, + ("%s:%d: SIBA_DEVID_80211 is only supportted currently.", + __func__, __LINE__)); + + device_set_ivars(child, sd); + device_probe_and_attach(child); + idx++; + } + return (child); +} + +static void +siba_cc_suspend(struct siba_cc *scc) +{ + + siba_cc_clock(scc, SIBA_CLOCK_SLOW); +} + +static void +siba_cc_resume(struct siba_cc *scc) +{ + + siba_cc_power_init(scc); + siba_cc_clock(scc, SIBA_CLOCK_FAST); +} + +int +siba_core_suspend(struct siba_softc *siba) +{ + + siba_cc_suspend(&siba->siba_cc); + siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0); + return (0); +} + +int +siba_core_resume(struct siba_softc *siba) +{ + + siba->siba_pci.spc_inited = 0; + siba->siba_curdev = NULL; + + siba_powerup(siba, 0); + /* XXX setup H/W for PCMCIA??? */ + siba_cc_resume(&siba->siba_cc); + siba_powerdown(siba); + + return (0); +} + +static void +siba_cc_regctl_setmask(struct siba_cc *cc, uint32_t offset, uint32_t mask, + uint32_t set) +{ + + SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR); + SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_ADDR, offset); + SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR); + SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_DATA, + (SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA) & mask) | set); + SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA); +} + +void +siba_cc_pmu_set_ldovolt(struct siba_cc *scc, int id, uint32_t volt) +{ + struct siba_softc *siba = scc->scc_dev->sd_bus; + uint32_t *p = NULL, info[5][3] = { + { 2, 25, 0xf }, + { 3, 1, 0xf }, + { 3, 9, 0xf }, + { 3, 17, 0x3f }, + { 0, 21, 0x3f } + }; + + if (siba->siba_chipid == 0x4312) { + if (id != SIBA_LDO_PAREF) + return; + p = info[4]; + siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]), + (volt & p[2]) << p[1]); + return; + } + if (siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354) { + switch (id) { + case SIBA_LDO_PAREF: + p = info[3]; + break; + case SIBA_LDO_VOLT1: + p = info[0]; + break; + case SIBA_LDO_VOLT2: + p = info[1]; + break; + case SIBA_LDO_VOLT3: + p = info[2]; + break; + default: + KASSERT(0 == 1, + ("%s: unsupported voltage ID %#x", __func__, id)); + return; + } + siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]), + (volt & p[2]) << p[1]); + } +} + +void +siba_cc_pmu_set_ldoparef(struct siba_cc *scc, uint8_t on) +{ + struct siba_softc *siba = scc->scc_dev->sd_bus; + int ldo; + + ldo = ((siba->siba_chipid == 0x4312) ? SIBA_CC_PMU_4312_PA_REF : + ((siba->siba_chipid == 0x4328) ? SIBA_CC_PMU_4328_PA_REF : + ((siba->siba_chipid == 0x5354) ? SIBA_CC_PMU_5354_PA_REF : -1))); + if (ldo == -1) + return; + + if (on) + SIBA_CC_SET32(scc, SIBA_CC_PMU_MINRES, 1 << ldo); + else + SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, ~(1 << ldo)); + SIBA_CC_READ32(scc, SIBA_CC_PMU_MINRES); +} diff --git a/sys/dev/siba/siba_ids.h b/sys/dev/siba/siba_ids.h index c7acd20316a2..b5aaf3419c75 100644 --- a/sys/dev/siba/siba_ids.h +++ b/sys/dev/siba/siba_ids.h @@ -39,23 +39,45 @@ struct siba_devid { uint8_t sd_rev; char *sd_desc; }; +#define SIBA_DEV(_vendor, _cid, _rev, _msg) \ + { SIBA_VID_##_vendor, SIBA_DEVID_##_cid, _rev, _msg } /* * Device IDs */ -#define SIBA_DEVID_ANY 0xffff -#define SIBA_DEVID_CHIPCOMMON 0x0800 -#define SIBA_DEVID_INSIDELINE 0x0801 -#define SIBA_DEVID_SDRAM 0x0803 -#define SIBA_DEVID_PCI 0x0804 -#define SIBA_DEVID_MIPS 0x0805 -#define SIBA_DEVID_ETHERNET 0x0806 -#define SIBA_DEVID_MODEM 0x0807 -#define SIBA_DEVID_USB 0x0808 -#define SIBA_DEVID_IPSEC 0x080b -#define SIBA_DEVID_SDRAMDDR 0x080f -#define SIBA_DEVID_EXTIF 0x0811 -#define SIBA_DEVID_MIPS_3302 0x0816 +#define SIBA_DEVID_ANY 0xffff +#define SIBA_DEVID_CHIPCOMMON 0x800 +#define SIBA_DEVID_ILINE20 0x801 +#define SIBA_DEVID_SDRAM 0x803 +#define SIBA_DEVID_PCI 0x804 +#define SIBA_DEVID_MIPS 0x805 +#define SIBA_DEVID_ETHERNET 0x806 +#define SIBA_DEVID_MODEM 0x807 +#define SIBA_DEVID_USB11_HOSTDEV 0x808 +#define SIBA_DEVID_ADSL 0x809 +#define SIBA_DEVID_ILINE100 0x80a +#define SIBA_DEVID_IPSEC 0x80b +#define SIBA_DEVID_PCMCIA 0x80d +#define SIBA_DEVID_INTERNAL_MEM 0x80e +#define SIBA_DEVID_SDRAMDDR 0x80f +#define SIBA_DEVID_EXTIF 0x811 +#define SIBA_DEVID_80211 0x812 +#define SIBA_DEVID_MIPS_3302 0x816 +#define SIBA_DEVID_USB11_HOST 0x817 +#define SIBA_DEVID_USB11_DEV 0x818 +#define SIBA_DEVID_USB20_HOST 0x819 +#define SIBA_DEVID_USB20_DEV 0x81a +#define SIBA_DEVID_SDIO_HOST 0x81b +#define SIBA_DEVID_ROBOSWITCH 0x81c +#define SIBA_DEVID_PARA_ATA 0x81d +#define SIBA_DEVID_SATA_XORDMA 0x81e +#define SIBA_DEVID_ETHERNET_GBIT 0x81f +#define SIBA_DEVID_PCIE 0x820 +#define SIBA_DEVID_MIMO_PHY 0x821 +#define SIBA_DEVID_SRAM_CTRLR 0x822 +#define SIBA_DEVID_MINI_MACPHY 0x823 +#define SIBA_DEVID_ARM_1176 0x824 +#define SIBA_DEVID_ARM_7TDMI 0x825 /* * Vendor IDs diff --git a/sys/dev/siba/siba_pcib.c b/sys/dev/siba/siba_pcib.c index d43f54c9c0a4..5175aa7ee0bc 100644 --- a/sys/dev/siba/siba_pcib.c +++ b/sys/dev/siba/siba_pcib.c @@ -55,9 +55,9 @@ __FBSDID("$FreeBSD$"); #include "pcib_if.h" -#include -#include #include +#include +#include #include #ifndef MIPS_MEM_RID @@ -79,10 +79,6 @@ __FBSDID("$FreeBSD$"); #define SBPCI_CFGBASE 0x0C000000 #define SBPCI_CFGSIZE 0x01000000 -#define SBPCI_SBTOPCI0 0x100 -#define SBPCI_SBTOPCI1 0x104 -#define SBPCI_SBTOPCI2 0x108 - /* * TODO: implement type 1 config space access (ie beyond bus 0) * we may need to tweak the windows to do this @@ -187,9 +183,12 @@ siba_pcib_attach(device_t dev) * XXX we need to be able to do type 1 too. * we probably don't need to be able to do i/o cycles. */ - SBPCI_WRITE_4(sc, SBPCI_SBTOPCI0, 1); /* I/O read/write window */ - SBPCI_WRITE_4(sc, SBPCI_SBTOPCI1, 2); /* type 0 configuration only */ - SBPCI_WRITE_4(sc, SBPCI_SBTOPCI2, 1 << 30); /* memory only */ + + /* I/O read/write window */ + SBPCI_WRITE_4(sc, SIBA_PCICORE_SBTOPCI0, 1); + /* type 0 configuration only */ + SBPCI_WRITE_4(sc, SIBA_PCICORE_SBTOPCI1, 2); + SBPCI_WRITE_4(sc, SIBA_PCICORE_SBTOPCI2, 1 << 30); /* memory only */ DELAY(500); /* XXX resource managers */ @@ -365,7 +364,7 @@ siba_pcib_read_config(device_t dev, u_int bus, u_int slot, u_int func, /* * The configuration tag on the broadcom is weird. */ - SBPCI_WRITE_4(sc, SBPCI_SBTOPCI1, 2); /* XXX again??? */ + SBPCI_WRITE_4(sc, SIBA_PCICORE_SBTOPCI1, 2); /* XXX again??? */ cfgtag = ((1 << slot) << 16) | (func << 8); cfgaddr = SBPCI_CFGBASE | cfgtag | (reg & ~3); diff --git a/sys/dev/siba/sibareg.h b/sys/dev/siba/sibareg.h index dc1b7f7d75b0..c2a4fdbfbd79 100644 --- a/sys/dev/siba/sibareg.h +++ b/sys/dev/siba/sibareg.h @@ -32,42 +32,433 @@ */ #ifndef _SIBA_SIBAREG_H_ -#define _SIBA_SIBAREG_H_ +#define _SIBA_SIBAREG_H_ -#define SIBA_CORE_LEN 0x00001000 /* Size of cfg per core */ -#define SIBA_CFG_END 0x00010000 /* Upper bound of cfg space */ -#define SIBA_MAX_CORES (SIBA_CFG_END/SIBA_CORE_LEN) /* #max cores */ - -/* offset of high ID register */ -#define SIBA_CORE_IDLO 0x00000ff8 -#define SIBA_CORE_IDHI 0x00000ffc +#define PCI_DEVICE_ID_BCM4401 0x4401 +#define PCI_DEVICE_ID_BCM4401B0 0x4402 +#define PCI_DEVICE_ID_BCM4401B1 0x170c +#define SIBA_PCIR_BAR PCIR_BAR(0) +#define SIBA_CCID_BCM4710 0x4710 +#define SIBA_CCID_BCM4704 0x4704 +#define SIBA_CCID_SENTRY5 0x5365 /* - * Offsets of ChipCommon core registers. - * XXX: move to siba_cc + * ChipCommon registers. */ -#define SIBA_CC_UART0 0x00000300 /* offset of UART0 */ -#define SIBA_CC_UART1 0x00000400 /* offset of UART1 */ +#define SIBA_CC_CHIPID 0x0000 +#define SIBA_CC_IDMASK 0x0000ffff +#define SIBA_CC_ID(id) (id & SIBA_CC_IDMASK) +#define SIBA_CC_REVMASK 0x000f0000 +#define SIBA_CC_REVSHIFT 16 +#define SIBA_CC_REV(id) \ + ((id & SIBA_CC_REVMASK) >> SIBA_CC_REVSHIFT) +#define SIBA_CC_PKGMASK 0x00F00000 +#define SIBA_CC_PKGSHIFT 20 +#define SIBA_CC_PKG(id) \ + ((id & SIBA_CC_PKGMASK) >> SIBA_CC_PKGSHIFT) +#define SIBA_CC_NCORESMASK 0x0F000000 +#define SIBA_CC_NCORESSHIFT 24 +#define SIBA_CC_NCORES(id) \ + ((id & SIBA_CC_NCORESMASK) >> SIBA_CC_NCORESSHIFT) +#define SIBA_CC_CAPS 0x0004 +#define SIBA_CC_CAPS_PWCTL 0x00040000 +#define SIBA_CC_CAPS_PMU 0x10000000 /* PMU (rev >= 20) */ +#define SIBA_CC_CHIPCTL 0x0028 /* rev >= 11 */ +#define SIBA_CC_CHIPSTAT 0x002C /* rev >= 11 */ +#define SIBA_CC_BCAST_ADDR 0x0050 /* Broadcast Address */ +#define SIBA_CC_BCAST_DATA 0x0054 /* Broadcast Data */ +#define SIBA_CC_PLLONDELAY 0x00B0 /* Rev >= 4 only */ +#define SIBA_CC_FREFSELDELAY 0x00B4 /* Rev >= 4 only */ +#define SIBA_CC_CLKSLOW 0x00b8 /* 6 <= Rev <= 9 only */ +#define SIBA_CC_CLKSLOW_SRC 0x00000007 +#define SIBA_CC_CLKSLOW_SRC_CRYSTAL 0x00000001 +#define SIBA_CC_CLKSLOW_FSLOW 0x00000800 +#define SIBA_CC_CLKSLOW_IPLL 0x00001000 +#define SIBA_CC_CLKSLOW_ENXTAL 0x00002000 +#define SIBA_CC_CLKSYSCTL 0x00C0 /* Rev >= 3 only */ +#define SIBA_CC_CLKCTLSTATUS 0x01e0 +#define SIBA_CC_CLKCTLSTATUS_HT 0x00010000 +#define SIBA_CC_UART0 0x0300 /* offset of UART0 */ +#define SIBA_CC_UART1 0x0400 /* offset of UART1 */ +#define SIBA_CC_PMUCTL 0x0600 /* PMU control */ +#define SIBA_CC_PMUCTL_ILP 0xffff0000 /* mask */ +#define SIBA_CC_PMUCTL_NOILP 0x00000200 +#define SIBA_CC_PMUCTL_XF 0x0000007c /* crystal freq */ +#define SIBA_CC_PMUCTL_XF_VAL(id) ((id & 0x0000007c) >> 2) +#define SIBA_CC_PMUCAPS 0x0604 +#define SIBA_CC_PMUCAPS_REV 0x000000ff +#define SIBA_CC_PMU_MINRES 0x0618 +#define SIBA_CC_PMU_MAXRES 0x061c +#define SIBA_CC_PMU_TABSEL 0x0620 +#define SIBA_CC_PMU_DEPMSK 0x0624 +#define SIBA_CC_PMU_UPDNTM 0x0628 +#define SIBA_CC_REGCTL_ADDR 0x0658 +#define SIBA_CC_REGCTL_DATA 0x065c +#define SIBA_CC_PLLCTL_ADDR 0x0660 +#define SIBA_CC_PLLCTL_DATA 0x0664 -#define SIBA_CC_CCID 0x0000 -#define SIBA_CC_IDMASK 0x0000FFFF -#define SIBA_CC_REVMASK 0x000F0000 -#define SIBA_CC_REVSHIFT 16 -#define SIBA_CC_PACKMASK 0x00F00000 -#define SIBA_CC_PACKSHIFT 20 -#define SIBA_CC_NRCORESMASK 0x0F000000 -#define SIBA_CC_NRCORESSHIFT 24 +#define SIBA_CC_PMU0_PLL0 0 +#define SIBA_CC_PMU0_PLL0_PDIV_MSK 0x00000001 +#define SIBA_CC_PMU0_PLL0_PDIV_FREQ 25000 +#define SIBA_CC_PMU0_PLL1 1 +#define SIBA_CC_PMU0_PLL1_IMSK 0xf0000000 +#define SIBA_CC_PMU0_PLL1_FMSK 0x0fffff00 +#define SIBA_CC_PMU0_PLL1_STOPMOD 0x00000040 +#define SIBA_CC_PMU0_PLL2 2 +#define SIBA_CC_PMU0_PLL2_IMSKHI 0x0000000f +#define SIBA_CC_PMU1_PLL0 0 +#define SIBA_CC_PMU1_PLL0_P1DIV 0x00f00000 +#define SIBA_CC_PMU1_PLL0_P2DIV 0x0f000000 +#define SIBA_CC_PMU1_PLL2 2 +#define SIBA_CC_PMU1_PLL2_NDIVMODE 0x000e0000 +#define SIBA_CC_PMU1_PLL2_NDIVINT 0x1ff00000 +#define SIBA_CC_PMU1_PLL3 3 +#define SIBA_CC_PMU1_PLL3_NDIVFRAC 0x00ffffff +#define SIBA_CC_PMU1_PLL5 5 +#define SIBA_CC_PMU1_PLL5_CLKDRV 0xffffff00 -#define SIBA_IDHIGH_RCLO 0x0000000F /* Revision Code (low part) */ -#define SIBA_IDHIGH_CC 0x00008FF0 /* Core Code */ -#define SIBA_IDHIGH_CC_SHIFT 4 -#define SIBA_IDHIGH_RCHI 0x00007000 /* Revision Code (high part) */ -#define SIBA_IDHIGH_RCHI_SHIFT 8 -#define SIBA_IDHIGH_VC 0xFFFF0000 /* Vendor Code */ -#define SIBA_IDHIGH_VC_SHIFT 16 +#define SIBA_CC_PMU0_DEFAULT_XTALFREQ 20000 +#define SIBA_CC_PMU1_DEFAULT_FREQ 15360 -#define SIBA_CCID_BCM4710 0x4710 -#define SIBA_CCID_BCM4704 0x4704 -#define SIBA_CCID_SENTRY5 0x5365 +#define SIBA_CC_PMU1_PLLTAB_ENTRY \ +{ \ + { 12000, 1, 3, 22, 0x9, 0xffffef }, \ + { 13000, 2, 1, 6, 0xb, 0x483483 }, \ + { 14400, 3, 1, 10, 0xa, 0x1c71c7 }, \ + { 15360, 4, 1, 5, 0xb, 0x755555 }, \ + { 16200, 5, 1, 10, 0x5, 0x6e9e06 }, \ + { 16800, 6, 1, 10, 0x5, 0x3cf3cf }, \ + { 19200, 7, 1, 9, 0x5, 0x17b425 }, \ + { 19800, 8, 1, 11, 0x4, 0xa57eb }, \ + { 20000, 9, 1, 11, 0x4, 0 }, \ + { 24000, 10, 3, 11, 0xa, 0 }, \ + { 25000, 11, 5, 16, 0xb, 0 }, \ + { 26000, 12, 1, 2, 0x10, 0xec4ec4 }, \ + { 30000, 13, 3, 8, 0xb, 0 }, \ + { 38400, 14, 1, 5, 0x4, 0x955555 }, \ + { 40000, 15, 1, 2, 0xb, 0 } \ +} + +#define SIBA_CC_PMU0_PLLTAB_ENTRY \ +{ \ + { 12000, 1, 73, 349525, }, { 13000, 2, 67, 725937, }, \ + { 14400, 3, 61, 116508, }, { 15360, 4, 57, 305834, }, \ + { 16200, 5, 54, 336579, }, { 16800, 6, 52, 399457, }, \ + { 19200, 7, 45, 873813, }, { 19800, 8, 44, 466033, }, \ + { 20000, 9, 44, 0, }, { 25000, 10, 70, 419430, }, \ + { 26000, 11, 67, 725937, }, { 30000, 12, 58, 699050, }, \ + { 38400, 13, 45, 873813, }, { 40000, 14, 45, 0, }, \ +} + +#define SIBA_CC_PMU_4312_PA_REF 2 +#define SIBA_CC_PMU_4325_BURST 1 +#define SIBA_CC_PMU_4325_CLBURST 3 +#define SIBA_CC_PMU_4325_LN 10 +#define SIBA_CC_PMU_4325_CRYSTAL 13 +#define SIBA_CC_PMU_4325_RX_PWR 15 +#define SIBA_CC_PMU_4325_TX_PWR 16 +#define SIBA_CC_PMU_4325_LOGEN_PWR 18 +#define SIBA_CC_PMU_4325_AFE_PWR 19 +#define SIBA_CC_PMU_4325_BBPLL_PWR 20 +#define SIBA_CC_PMU_4325_HT 21 +#define SIBA_CC_PMU_4328_EXT_SWITCH_PWM 0 +#define SIBA_CC_PMU_4328_BB_SWITCH_PWM 1 +#define SIBA_CC_PMU_4328_BB_SWITCH_BURST 2 +#define SIBA_CC_PMU_4328_BB_EXT_SWITCH_BURST 3 +#define SIBA_CC_PMU_4328_ILP_REQUEST 4 +#define SIBA_CC_PMU_4328_RADSWITCH_PWM 5 /* radio switch */ +#define SIBA_CC_PMU_4328_RADSWITCH_BURST 6 +#define SIBA_CC_PMU_4328_ROM_SWITCH 7 +#define SIBA_CC_PMU_4328_PA_REF 8 +#define SIBA_CC_PMU_4328_RADIO 9 +#define SIBA_CC_PMU_4328_AFE 10 +#define SIBA_CC_PMU_4328_PLL 11 +#define SIBA_CC_PMU_4328_BG_FILTBYP 12 +#define SIBA_CC_PMU_4328_TX_FILTBYP 13 +#define SIBA_CC_PMU_4328_RX_FILTBYP 14 +#define SIBA_CC_PMU_4328_CRYSTAL_PU 15 +#define SIBA_CC_PMU_4328_CRYSTAL_EN 16 +#define SIBA_CC_PMU_4328_BB_PLL_FILTBYP 17 +#define SIBA_CC_PMU_4328_RF_PLL_FILTBYP 18 +#define SIBA_CC_PMU_4328_BB_PLL_PU 19 +#define SIBA_CC_PMU_5354_PA_REF 8 +#define SIBA_CC_PMU_5354_BB_PLL_PU 19 + +#define SIBA_CC_PMU_4325_RES_UPDOWN \ +{ \ + { SIBA_CC_PMU_4325_CRYSTAL, 0x1501 } \ +} + +#define SIBA_CC_PMU_4325_RES_DEPEND \ +{ \ + { SIBA_CC_PMU_4325_HT, SIBA_CC_PMU_DEP_ADD, \ + ((1 << SIBA_CC_PMU_4325_RX_PWR) | \ + (1 << SIBA_CC_PMU_4325_TX_PWR) | \ + (1 << SIBA_CC_PMU_4325_LOGEN_PWR) | \ + (1 << SIBA_CC_PMU_4325_AFE_PWR)) } \ +} + +#define SIBA_CC_PMU_4328_RES_UPDOWN \ +{ \ + { SIBA_CC_PMU_4328_EXT_SWITCH_PWM, 0x0101 }, \ + { SIBA_CC_PMU_4328_BB_SWITCH_PWM, 0x1f01 }, \ + { SIBA_CC_PMU_4328_BB_SWITCH_BURST, 0x010f }, \ + { SIBA_CC_PMU_4328_BB_EXT_SWITCH_BURST, 0x0101 }, \ + { SIBA_CC_PMU_4328_ILP_REQUEST, 0x0202 }, \ + { SIBA_CC_PMU_4328_RADSWITCH_PWM, 0x0f01 }, \ + { SIBA_CC_PMU_4328_RADSWITCH_BURST, 0x0f01 }, \ + { SIBA_CC_PMU_4328_ROM_SWITCH, 0x0101 }, \ + { SIBA_CC_PMU_4328_PA_REF, 0x0f01 }, \ + { SIBA_CC_PMU_4328_RADIO, 0x0f01 }, \ + { SIBA_CC_PMU_4328_AFE, 0x0f01 }, \ + { SIBA_CC_PMU_4328_PLL, 0x0f01 }, \ + { SIBA_CC_PMU_4328_BG_FILTBYP, 0x0101 }, \ + { SIBA_CC_PMU_4328_TX_FILTBYP, 0x0101 }, \ + { SIBA_CC_PMU_4328_RX_FILTBYP, 0x0101 }, \ + { SIBA_CC_PMU_4328_CRYSTAL_PU, 0x0101 }, \ + { SIBA_CC_PMU_4328_CRYSTAL_EN, 0xa001 }, \ + { SIBA_CC_PMU_4328_BB_PLL_FILTBYP, 0x0101 }, \ + { SIBA_CC_PMU_4328_RF_PLL_FILTBYP, 0x0101 }, \ + { SIBA_CC_PMU_4328_BB_PLL_PU, 0x0701 }, \ +} + +#define SIBA_CC_PMU_4328_RES_DEPEND \ +{ \ + { SIBA_CC_PMU_4328_ILP_REQUEST, SIBA_CC_PMU_DEP_SET, \ + ((1 << SIBA_CC_PMU_4328_EXT_SWITCH_PWM) | \ + (1 << SIBA_CC_PMU_4328_BB_SWITCH_PWM)) }, \ +} + +#define SIBA_CC_CHST_4325_PMUTOP_2B 0x00000200 + +#define SIBA_BAR0 0x80 +#define SIBA_IRQMASK 0x94 +#define SIBA_GPIO_IN 0xb0 +#define SIBA_GPIO_OUT 0xb4 +#define SIBA_GPIO_OUT_EN 0xb8 +#define SIBA_GPIO_CRYSTAL 0x40 +#define SIBA_GPIO_PLL 0x80 + +#define SIBA_REGWIN(x) \ + (SIBA_ENUM_START + ((x) * SIBA_CORE_LEN)) +#define SIBA_CORE_LEN 0x00001000 /* Size of cfg per core */ +#define SIBA_CFG_END 0x00010000 /* Upper bound of cfg space */ +#define SIBA_MAX_CORES (SIBA_CFG_END/SIBA_CORE_LEN) /* #max cores */ +#define SIBA_ENUM_START 0x18000000U +#define SIBA_ENUM_END 0x18010000U + +#define SIBA_DMA_TRANSLATION_MASK 0xc0000000 + +#define SIBA_PCI_DMA 0x40000000U +#define SIBA_TPS 0x0f18 +#define SIBA_TPS_BPFLAG 0x0000003f +#define SIBA_IAS 0x0f90 /* Initiator Agent State */ +#define SIBA_IAS_INBAND_ERR 0x00020000 +#define SIBA_IAS_TIMEOUT 0x00040000 +#define SIBA_INTR_MASK 0x0f94 +#define SIBA_TGSLOW 0x0f98 +#define SIBA_TGSLOW_RESET 0x00000001 /* target state low */ +#define SIBA_TGSLOW_REJECT_22 0x00000002 +#define SIBA_TGSLOW_REJECT_23 0x00000004 +#define SIBA_TGSLOW_CLOCK 0x00010000 +#define SIBA_TGSLOW_FGC 0x00020000 +#define SIBA_TGSHIGH 0x0f9c +#define SIBA_TGSHIGH_SERR 0x00000001 +#define SIBA_TGSHIGH_BUSY 0x00000004 +#define SIBA_TGSHIGH_DMA64 0x10000000 +#define SIBA_IMCFGLO 0x0fa8 +#define SIBA_IMCFGLO_SERTO 0x00000007 +#define SIBA_IMCFGLO_REQTO 0x00000070 +#define SIBA_IDLOW 0x0ff8 +#define SIBA_IDLOW_SSBREV 0xf0000000 +#define SIBA_IDLOW_SSBREV_22 0x00000000 +#define SIBA_IDLOW_SSBREV_23 0x10000000 +#define SIBA_IDLOW_SSBREV_24 0x40000000 +#define SIBA_IDLOW_SSBREV_25 0x50000000 +#define SIBA_IDLOW_SSBREV_26 0x60000000 +#define SIBA_IDLOW_SSBREV_27 0x70000000 +#define SIBA_IDHIGH 0x0ffc +#define SIBA_IDHIGH_CORECODEMASK 0x00008FF0 /* Core Code */ +#define SIBA_IDHIGH_CORECODE_SHIFT 4 +#define SIBA_IDHIGH_CORECODE(id) \ + ((id & SIBA_IDHIGH_CORECODEMASK) >> SIBA_IDHIGH_CORECODE_SHIFT) +/* Revision Code (low part) */ +#define SIBA_IDHIGH_REVLO 0x0000000f +/* Revision Code (high part) */ +#define SIBA_IDHIGH_REVHI 0x00007000 +#define SIBA_IDHIGH_REVHI_SHIFT 8 +#define SIBA_IDHIGH_REV(id) \ + ((id & SIBA_IDHIGH_REVLO) | ((id & SIBA_IDHIGH_REVHI) >> \ + SIBA_IDHIGH_REVHI_SHIFT)) +#define SIBA_IDHIGH_VENDORMASK 0xFFFF0000 /* Vendor Code */ +#define SIBA_IDHIGH_VENDOR_SHIFT 16 +#define SIBA_IDHIGH_VENDOR(id) \ + ((id & SIBA_IDHIGH_VENDORMASK) >> SIBA_IDHIGH_VENDOR_SHIFT) + +#define SIBA_SPROMSIZE_R123 64 +#define SIBA_SPROMSIZE_R4 220 +#define SIBA_SPROM_BASE 0x1000 +#define SIBA_SPROM_REV_CRC 0xff00 +#define SIBA_SPROM1_MAC_80211BG 0x1048 +#define SIBA_SPROM1_MAC_ETH 0x104e +#define SIBA_SPROM1_MAC_80211A 0x1054 +#define SIBA_SPROM1_ETHPHY 0x105a +#define SIBA_SPROM1_ETHPHY_MII_ETH0 0x001f +#define SIBA_SPROM1_ETHPHY_MII_ETH1 0x03e0 +#define SIBA_SPROM1_ETHPHY_MDIO_ETH0 (1 << 14) +#define SIBA_SPROM1_ETHPHY_MDIO_ETH1 (1 << 15) +#define SIBA_SPROM1_BOARDINFO 0x105c +#define SIBA_SPROM1_BOARDINFO_BREV 0x00ff +#define SIBA_SPROM1_BOARDINFO_CCODE 0x0f00 +#define SIBA_SPROM1_BOARDINFO_ANTBG 0x3000 +#define SIBA_SPROM1_BOARDINFO_ANTA 0xc000 +#define SIBA_SPROM1_PA0B0 0x105e +#define SIBA_SPROM1_PA0B1 0x1060 +#define SIBA_SPROM1_PA0B2 0x1062 +#define SIBA_SPROM1_GPIOA 0x1064 +#define SIBA_SPROM1_GPIOA_P0 0x00ff +#define SIBA_SPROM1_GPIOA_P1 0xff00 +#define SIBA_SPROM1_GPIOB 0x1066 +#define SIBA_SPROM1_GPIOB_P2 0x00ff +#define SIBA_SPROM1_GPIOB_P3 0xff00 +#define SIBA_SPROM1_MAXPWR 0x1068 +#define SIBA_SPROM1_MAXPWR_BG 0x00ff +#define SIBA_SPROM1_MAXPWR_A 0xff00 +#define SIBA_SPROM1_PA1B0 0x106a +#define SIBA_SPROM1_PA1B1 0x106c +#define SIBA_SPROM1_PA1B2 0x106e +#define SIBA_SPROM1_TSSI 0x1070 +#define SIBA_SPROM1_TSSI_BG 0x00ff +#define SIBA_SPROM1_TSSI_A 0xff00 +#define SIBA_SPROM1_BFLOW 0x1072 +#define SIBA_SPROM1_AGAIN 0x1074 +#define SIBA_SPROM1_AGAIN_BG 0x00ff +#define SIBA_SPROM1_AGAIN_A 0xff00 +#define SIBA_SPROM2_BFHIGH 0x1038 +#define SIBA_SPROM3_MAC_80211BG 0x104a +#define SIBA_SPROM4_MAC_80211BG 0x104c +#define SIBA_SPROM4_ETHPHY 0x105a +#define SIBA_SPROM4_ETHPHY_ET0A 0x001f +#define SIBA_SPROM4_ETHPHY_ET1A 0x03e0 +#define SIBA_SPROM4_CCODE 0x1052 +#define SIBA_SPROM4_ANTAVAIL 0x105d +#define SIBA_SPROM4_ANTAVAIL_A 0x00ff +#define SIBA_SPROM4_ANTAVAIL_BG 0xff00 +#define SIBA_SPROM4_BFLOW 0x1044 +#define SIBA_SPROM4_AGAIN01 0x105e +#define SIBA_SPROM4_AGAIN0 0x00ff +#define SIBA_SPROM4_AGAIN1 0xff00 +#define SIBA_SPROM4_AGAIN23 0x1060 +#define SIBA_SPROM4_AGAIN2 0x00ff +#define SIBA_SPROM4_AGAIN3 0xff00 +#define SIBA_SPROM4_BFHIGH 0x1046 +#define SIBA_SPROM4_MAXP_BG 0x1080 +#define SIBA_SPROM4_MAXP_BG_MASK 0x00ff +#define SIBA_SPROM4_TSSI_BG 0xff00 +#define SIBA_SPROM4_MAXP_A 0x108a +#define SIBA_SPROM4_MAXP_A_MASK 0x00ff +#define SIBA_SPROM4_TSSI_A 0xff00 +#define SIBA_SPROM4_GPIOA 0x1056 +#define SIBA_SPROM4_GPIOA_P0 0x00ff +#define SIBA_SPROM4_GPIOA_P1 0xff00 +#define SIBA_SPROM4_GPIOB 0x1058 +#define SIBA_SPROM4_GPIOB_P2 0x00ff +#define SIBA_SPROM4_GPIOB_P3 0xff00 +#define SIBA_SPROM5_BFLOW 0x104a +#define SIBA_SPROM5_BFHIGH 0x104c +#define SIBA_SPROM5_MAC_80211BG 0x1052 +#define SIBA_SPROM5_CCODE 0x1044 +#define SIBA_SPROM5_GPIOA 0x1076 +#define SIBA_SPROM5_GPIOA_P0 0x00ff +#define SIBA_SPROM5_GPIOA_P1 0xff00 +#define SIBA_SPROM5_GPIOB 0x1078 +#define SIBA_SPROM5_GPIOB_P2 0x00ff +#define SIBA_SPROM5_GPIOB_P3 0xff00 +#define SIBA_SPROM8_BFLOW 0x1084 +#define SIBA_SPROM8_BFHIGH 0x1086 +#define SIBA_SPROM8_BFL2LO 0x1088 +#define SIBA_SPROM8_BFL2HI 0x108a +#define SIBA_SPROM8_MAC_80211BG 0x108c +#define SIBA_SPROM8_CCODE 0x1092 +#define SIBA_SPROM8_ANTAVAIL 0x109c +#define SIBA_SPROM8_ANTAVAIL_A 0xff00 +#define SIBA_SPROM8_ANTAVAIL_BG 0x00ff +#define SIBA_SPROM8_AGAIN01 0x109e +#define SIBA_SPROM8_AGAIN0 0x00ff +#define SIBA_SPROM8_AGAIN1 0xff00 +#define SIBA_SPROM8_GPIOA 0x1096 +#define SIBA_SPROM8_GPIOA_P0 0x00ff +#define SIBA_SPROM8_GPIOA_P1 0xff00 +#define SIBA_SPROM8_GPIOB 0x1098 +#define SIBA_SPROM8_GPIOB_P2 0x00ff +#define SIBA_SPROM8_GPIOB_P3 0xff00 +#define SIBA_SPROM8_AGAIN23 0x10a0 +#define SIBA_SPROM8_AGAIN2 0x00ff +#define SIBA_SPROM8_AGAIN3 0xff00 +#define SIBA_SPROM8_RSSIPARM2G 0x10a4 +#define SIBA_SPROM8_RSSISMF2G 0x000f +#define SIBA_SPROM8_RSSISMC2G 0x00f0 +#define SIBA_SPROM8_RSSISAV2G 0x0700 /* BITMASK */ +#define SIBA_SPROM8_BXA2G 0x1800 /* BITMASK */ +#define SIBA_SPROM8_RSSIPARM5G 0x10a6 +#define SIBA_SPROM8_RSSISMF5G 0x000f +#define SIBA_SPROM8_RSSISMC5G 0x00f0 +#define SIBA_SPROM8_RSSISAV5G 0x0700 /* BITMASK */ +#define SIBA_SPROM8_BXA5G 0x1800 /* BITMASK */ +#define SIBA_SPROM8_TRI25G 0x10a8 +#define SIBA_SPROM8_TRI2G 0x00ff +#define SIBA_SPROM8_TRI5G 0xff00 +#define SIBA_SPROM8_TRI5GHL 0x10aa +#define SIBA_SPROM8_TRI5GL 0x00ff +#define SIBA_SPROM8_TRI5GH 0xff00 +#define SIBA_SPROM8_RXPO 0x10ac +#define SIBA_SPROM8_RXPO2G 0x00ff +#define SIBA_SPROM8_RXPO5G 0xff00 +#define SIBA_SPROM8_MAXP_BG 0x10c0 +#define SIBA_SPROM8_MAXP_BG_MASK 0x00ff +#define SIBA_SPROM8_TSSI_BG 0xff00 +#define SIBA_SPROM8_PA0B0 0x10c2 +#define SIBA_SPROM8_PA0B1 0x10c4 +#define SIBA_SPROM8_PA0B2 0x10c6 +#define SIBA_SPROM8_MAXP_A 0x10c8 +#define SIBA_SPROM8_MAXP_A_MASK 0x00ff +#define SIBA_SPROM8_TSSI_A 0xff00 +#define SIBA_SPROM8_MAXP_AHL 0x10ca +#define SIBA_SPROM8_MAXP_AH_MASK 0x00ff +#define SIBA_SPROM8_MAXP_AL_MASK 0xff00 +#define SIBA_SPROM8_PA1B0 0x10cc +#define SIBA_SPROM8_PA1B1 0x10ce +#define SIBA_SPROM8_PA1B2 0x10d0 +#define SIBA_SPROM8_PA1LOB0 0x10d2 +#define SIBA_SPROM8_PA1LOB1 0x10d4 +#define SIBA_SPROM8_PA1LOB2 0x10d6 +#define SIBA_SPROM8_PA1HIB0 0x10d8 +#define SIBA_SPROM8_PA1HIB1 0x10da +#define SIBA_SPROM8_PA1HIB2 0x10dc +#define SIBA_SPROM8_CCK2GPO 0x1140 +#define SIBA_SPROM8_OFDM2GPO 0x1142 +#define SIBA_SPROM8_OFDM5GPO 0x1146 +#define SIBA_SPROM8_OFDM5GLPO 0x114a +#define SIBA_SPROM8_OFDM5GHPO 0x114e + +#define SIBA_BOARDVENDOR_DELL 0x1028 +#define SIBA_BOARDVENDOR_BCM 0x14e4 +#define SIBA_BOARD_BCM4309G 0x0421 +#define SIBA_BOARD_MP4318 0x044a +#define SIBA_BOARD_BU4306 0x0416 +#define SIBA_BOARD_BU4309 0x040a + +#define SIBA_PCICORE_BCAST_ADDR SIBA_CC_BCAST_ADDR +#define SIBA_PCICORE_BCAST_DATA SIBA_CC_BCAST_DATA +#define SIBA_PCICORE_SBTOPCI0 0x0100 +#define SIBA_PCICORE_SBTOPCI1 0x0104 +#define SIBA_PCICORE_SBTOPCI2 0x0108 +#define SIBA_PCICORE_MDIO_CTL 0x0128 +#define SIBA_PCICORE_MDIO_DATA 0x012c +#define SIBA_PCICORE_SBTOPCI_PREF 0x00000004 +#define SIBA_PCICORE_SBTOPCI_BURST 0x00000008 +#define SIBA_PCICORE_SBTOPCI_MRM 0x00000020 + +#define SIBA_CHIPPACK_BCM4712S 1 /* Small 200pin 4712 */ #endif /* _SIBA_SIBAREG_H_ */ diff --git a/sys/dev/siba/sibavar.h b/sys/dev/siba/sibavar.h index f9c231b8f4c2..307903b9920e 100644 --- a/sys/dev/siba/sibavar.h +++ b/sys/dev/siba/sibavar.h @@ -31,46 +31,8 @@ #include -struct siba_softc { - device_t sc_dev; /* Device ID */ - struct resource *sc_mem; /* Memory window on nexus */ - - bus_space_tag_t sc_bt; - bus_space_handle_t sc_bh; - bus_addr_t sc_maddr; - bus_size_t sc_msize; - - uint8_t sc_ncores; -}; - -struct siba_devinfo { - struct resource_list sdi_rl; - /*devhandle_t sdi_devhandle; XXX*/ - /*struct rman sdi_intr_rman;*/ - - /* Accessors are needed for ivars below. */ - uint16_t sdi_vid; - uint16_t sdi_devid; - uint8_t sdi_rev; - uint8_t sdi_idx; /* core index on bus */ - uint8_t sdi_irq; /* TODO */ -}; - -#define siba_read_2(sc, core, reg) \ - bus_space_read_2((sc)->sc_bt, (sc)->sc_bh, \ - (core * SIBA_CORE_LEN) + (reg)) - -#define siba_read_4(sc, core, reg) \ - bus_space_read_4((sc)->sc_bt, (sc)->sc_bh, \ - (core * SIBA_CORE_LEN) + (reg)) - -#define siba_write_2(sc, core, reg, val) \ - bus_space_write_2((sc)->sc_bt, (sc)->sc_bh, \ - (core * SIBA_CORE_LEN) + (reg), (val)) - -#define siba_write_4(sc, core, reg, val) \ - bus_space_write_4((sc)->sc_bt, (sc)->sc_bh, \ - (core * SIBA_CORE_LEN) + (reg), (val)) +struct siba_softc; +struct siba_dev_softc; enum siba_device_ivars { SIBA_IVAR_VENDOR, @@ -89,4 +51,358 @@ SIBA_ACCESSOR(core_index, CORE_INDEX, uint8_t) #undef SIBA_ACCESSOR +/* XXX just for SPROM1? */ +enum { + SIBA_CCODE_WORLD, + SIBA_CCODE_THAILAND, + SIBA_CCODE_ISRAEL, + SIBA_CCODE_JORDAN, + SIBA_CCODE_CHINA, + SIBA_CCODE_JAPAN, + SIBA_CCODE_USA_CANADA_ANZ, + SIBA_CCODE_EUROPE, + SIBA_CCODE_USA_LOW, + SIBA_CCODE_JAPAN_HIGH, + SIBA_CCODE_ALL, + SIBA_CCODE_NONE, +}; + +#define siba_mips_read_2(sc, core, reg) \ + bus_space_read_2((sc)->siba_mem_bt, (sc)->siba_mem_bh, \ + (core * SIBA_CORE_LEN) + (reg)) + +#define siba_mips_read_4(sc, core, reg) \ + bus_space_read_4((sc)->siba_mem_bt, (sc)->siba_mem_bh, \ + (core * SIBA_CORE_LEN) + (reg)) + +#define siba_mips_write_2(sc, core, reg, val) \ + bus_space_write_2((sc)->siba_mem_bt, (sc)->siba_mem_bh, \ + (core * SIBA_CORE_LEN) + (reg), (val)) + +#define siba_mips_write_4(sc, core, reg, val) \ + bus_space_write_4((sc)->siba_mem_bt, (sc)->siba_mem_bh, \ + (core * SIBA_CORE_LEN) + (reg), (val)) + +#define SIBA_READ_4(siba, reg) \ + bus_space_read_4((siba)->siba_mem_bt, (siba)->siba_mem_bh, (reg)) +#define SIBA_READ_2(siba, reg) \ + bus_space_read_2((siba)->siba_mem_bt, (siba)->siba_mem_bh, (reg)) +#define SIBA_READ_MULTI_1(siba, reg, addr, count) \ + bus_space_read_multi_1((siba)->siba_mem_bt, (siba)->siba_mem_bh,\ + (reg), (addr), (count)) +#define SIBA_READ_MULTI_2(siba, reg, addr, count) \ + bus_space_read_multi_2((siba)->siba_mem_bt, (siba)->siba_mem_bh,\ + (reg), (addr), (count)) +#define SIBA_READ_MULTI_4(siba, reg, addr, count) \ + bus_space_read_multi_4((siba)->siba_mem_bt, (siba)->siba_mem_bh,\ + (reg), (addr), (count)) + +#define SIBA_WRITE_4(siba, reg, val) \ + bus_space_write_4((siba)->siba_mem_bt, (siba)->siba_mem_bh, \ + (reg), (val)) +#define SIBA_WRITE_2(siba, reg, val) \ + bus_space_write_2((siba)->siba_mem_bt, (siba)->siba_mem_bh, \ + (reg), (val)) +#define SIBA_WRITE_MULTI_1(siba, reg, addr, count) \ + bus_space_write_multi_1((siba)->siba_mem_bt, (siba)->siba_mem_bh,\ + (reg), (addr), (count)) +#define SIBA_WRITE_MULTI_2(siba, reg, addr, count) \ + bus_space_write_multi_2((siba)->siba_mem_bt, (siba)->siba_mem_bh,\ + (reg), (addr), (count)) +#define SIBA_WRITE_MULTI_4(siba, reg, addr, count) \ + bus_space_write_multi_4((siba)->siba_mem_bt, (siba)->siba_mem_bh,\ + (reg), (addr), (count)) + +#define SIBA_BARRIER(siba, flags) \ + bus_space_barrier((siba)->siba_mem_bt, (siba)->siba_mem_bh, (0),\ + (0), (flags)) + +#define SIBA_SETBITS_4(siba, reg, bits) \ + SIBA_WRITE_4((siba), (reg), SIBA_READ_4((siba), (reg)) | (bits)) +#define SIBA_SETBITS_2(siba, reg, bits) \ + SIBA_WRITE_2((siba), (reg), SIBA_READ_2((siba), (reg)) | (bits)) + +#define SIBA_FILT_SETBITS_4(siba, reg, filt, bits) \ + SIBA_WRITE_4((siba), (reg), (SIBA_READ_4((siba), \ + (reg)) & (filt)) | (bits)) +#define SIBA_FILT_SETBITS_2(siba, reg, filt, bits) \ + SIBA_WRITE_2((siba), (reg), (SIBA_READ_2((siba), \ + (reg)) & (filt)) | (bits)) + +#define SIBA_CLRBITS_4(siba, reg, bits) \ + SIBA_WRITE_4((siba), (reg), SIBA_READ_4((siba), (reg)) & ~(bits)) +#define SIBA_CLRBITS_2(siba, reg, bits) \ + SIBA_WRITE_2((siba), (reg), SIBA_READ_2((siba), (reg)) & ~(bits)) + +#define SIBA_CC_READ32(scc, offset) \ + siba_read_4((scc)->scc_dev, offset) +#define SIBA_CC_WRITE32(scc, offset, val) \ + siba_write_4((scc)->scc_dev, offset, val) +#define SIBA_CC_MASK32(scc, offset, mask) \ + SIBA_CC_WRITE32(scc, offset, SIBA_CC_READ32(scc, offset) & (mask)) +#define SIBA_CC_SET32(scc, offset, set) \ + SIBA_CC_WRITE32(scc, offset, SIBA_CC_READ32(scc, offset) | (set)) +#define SIBA_CC_MASKSET32(scc, offset, mask, set) \ + SIBA_CC_WRITE32(scc, offset, \ + (SIBA_CC_READ32(scc, offset) & (mask)) | (set)) + +enum siba_type { + SIBA_TYPE_SSB, + SIBA_TYPE_PCI, + SIBA_TYPE_PCMCIA, +}; + +enum siba_clock { + SIBA_CLOCK_DYNAMIC, + SIBA_CLOCK_SLOW, + SIBA_CLOCK_FAST, +}; + +enum siba_clksrc { + SIBA_CC_CLKSRC_PCI, + SIBA_CC_CLKSRC_CRYSTAL, + SIBA_CC_CLKSRC_LOWPW, +}; + +struct siba_cc_pmu0_plltab { + uint16_t freq; /* in kHz.*/ + uint8_t xf; /* crystal frequency */ + uint8_t wb_int; + uint32_t wb_frac; +}; + +struct siba_cc_pmu1_plltab { + uint16_t freq; + uint8_t xf; + uint8_t p1div; + uint8_t p2div; + uint8_t ndiv_int; + uint32_t ndiv_frac; +}; + +struct siba_cc_pmu_res_updown { + uint8_t res; + uint16_t updown; +}; + +#define SIBA_CC_PMU_DEP_SET 1 +#define SIBA_CC_PMU_DEP_ADD 2 +#define SIBA_CC_PMU_DEP_REMOVE 3 + +struct siba_cc_pmu_res_depend { + uint8_t res; + uint8_t task; + uint32_t depend; +}; + +struct siba_sprom { + uint8_t rev; /* revision */ + uint8_t mac_80211bg[6]; /* address for 802.11b/g */ + uint8_t mac_eth[6]; /* address for Ethernet */ + uint8_t mac_80211a[6]; /* address for 802.11a */ + uint8_t mii_eth0; /* MII address for eth0 */ + uint8_t mii_eth1; /* MII address for eth1 */ + uint8_t mdio_eth0; /* MDIO for eth0 */ + uint8_t mdio_eth1; /* MDIO for eth1 */ + uint8_t brev; /* board revision */ + uint8_t ccode; /* Country Code */ + uint8_t ant_a; /* A-PHY antenna */ + uint8_t ant_bg; /* B/G-PHY antenna */ + uint16_t pa0b0; + uint16_t pa0b1; + uint16_t pa0b2; + uint16_t pa1b0; + uint16_t pa1b1; + uint16_t pa1b2; + uint16_t pa1lob0; + uint16_t pa1lob1; + uint16_t pa1lob2; + uint16_t pa1hib0; + uint16_t pa1hib1; + uint16_t pa1hib2; + uint8_t gpio0; + uint8_t gpio1; + uint8_t gpio2; + uint8_t gpio3; + uint16_t maxpwr_al; + uint16_t maxpwr_a; /* A-PHY Max Power */ + uint16_t maxpwr_ah; + uint16_t maxpwr_bg; /* BG-PHY Max Power */ + uint8_t rxpo2g; + uint8_t rxpo5g; + uint8_t tssi_a; /* Idle TSSI */ + uint8_t tssi_bg; /* Idle TSSI */ + uint8_t tri2g; + uint8_t tri5gl; + uint8_t tri5g; + uint8_t tri5gh; + uint8_t rssisav2g; + uint8_t rssismc2g; + uint8_t rssismf2g; + uint8_t bxa2g; + uint8_t rssisav5g; + uint8_t rssismc5g; + uint8_t rssismf5g; + uint8_t bxa5g; + uint16_t cck2gpo; + uint32_t ofdm2gpo; + uint32_t ofdm5glpo; + uint32_t ofdm5gpo; + uint32_t ofdm5ghpo; + uint16_t bf_lo; /* boardflags */ + uint16_t bf_hi; /* boardflags */ + uint16_t bf2_lo; + uint16_t bf2_hi; + + struct { + struct { + int8_t a0, a1, a2, a3; + } ghz24; + struct { + int8_t a0, a1, a2, a3; + } ghz5; + } again; /* antenna gain */ +}; + +#define SIBA_LDO_PAREF 0 +#define SIBA_LDO_VOLT1 1 +#define SIBA_LDO_VOLT2 2 +#define SIBA_LDO_VOLT3 3 + +struct siba_cc_pmu { + uint8_t rev; /* PMU rev */ + uint32_t freq; /* crystal freq in kHz */ +}; + +struct siba_cc { + struct siba_dev_softc *scc_dev; + uint32_t scc_caps; + struct siba_cc_pmu scc_pmu; + uint16_t scc_powerup_delay; +}; + +struct siba_pci { + struct siba_dev_softc *spc_dev; + uint8_t spc_inited; + uint8_t spc_hostmode; +}; + +struct siba_bus_ops { + uint16_t (*read_2)(struct siba_dev_softc *, + uint16_t); + uint32_t (*read_4)(struct siba_dev_softc *, + uint16_t); + void (*write_2)(struct siba_dev_softc *, + uint16_t, uint16_t); + void (*write_4)(struct siba_dev_softc *, + uint16_t, uint32_t); + void (*read_multi_1)(struct siba_dev_softc *, + void *, size_t, uint16_t); + void (*read_multi_2)(struct siba_dev_softc *, + void *, size_t, uint16_t); + void (*read_multi_4)(struct siba_dev_softc *, + void *, size_t, uint16_t); + void (*write_multi_1)(struct siba_dev_softc *, + const void *, size_t, uint16_t); + void (*write_multi_2)(struct siba_dev_softc *, + const void *, size_t, uint16_t); + void (*write_multi_4)(struct siba_dev_softc *, + const void *, size_t, uint16_t); +}; + +struct siba_dev_softc { + struct siba_softc *sd_bus; + struct siba_devid sd_id; + const struct siba_bus_ops *sd_ops; + + uint8_t sd_coreidx; +}; + +struct siba_devinfo { + struct resource_list sdi_rl; + /*devhandle_t sdi_devhandle; XXX*/ + /*struct rman sdi_intr_rman;*/ + + /* Accessors are needed for ivars below. */ + uint16_t sdi_vid; + uint16_t sdi_devid; + uint8_t sdi_rev; + uint8_t sdi_idx; /* core index on bus */ + uint8_t sdi_irq; /* TODO */ +}; + +struct siba_softc { + /* + * common variables which used for siba(4) bus and siba_bwn bridge. + */ + device_t siba_dev; /* Device ID */ + struct resource *siba_mem_res; + bus_space_tag_t siba_mem_bt; + bus_space_handle_t siba_mem_bh; + bus_addr_t siba_maddr; + bus_size_t siba_msize; + uint8_t siba_ncores; + + /* + * the following variables are only used for siba_bwn bridge. + */ + + enum siba_type siba_type; + int siba_invalid; + + struct siba_dev_softc *siba_curdev; /* only for PCI */ + struct siba_dev_softc siba_devs[SIBA_MAX_CORES]; + int siba_ndevs; + + uint16_t siba_pci_vid; + uint16_t siba_pci_did; + uint16_t siba_pci_subvid; + uint16_t siba_pci_subdid; + int siba_mem_rid; + + uint16_t siba_chipid; /* for CORE 0 */ + uint16_t siba_chiprev; + uint8_t siba_chippkg; + + struct siba_cc siba_cc; /* ChipCommon */ + struct siba_pci siba_pci; /* PCI-core */ + const struct siba_bus_ops *siba_ops; + + /* board informations */ + uint16_t siba_board_vendor; + uint16_t siba_board_type; + uint16_t siba_board_rev; + struct siba_sprom siba_sprom; /* SPROM */ + uint16_t siba_spromsize; /* in word size */ +}; + +void siba_powerup(struct siba_softc *, int); +uint16_t siba_read_2(struct siba_dev_softc *, uint16_t); +void siba_write_2(struct siba_dev_softc *, uint16_t, uint16_t); +uint32_t siba_read_4(struct siba_dev_softc *, uint16_t); +void siba_write_4(struct siba_dev_softc *, uint16_t, uint32_t); +void siba_dev_up(struct siba_dev_softc *, uint32_t); +void siba_dev_down(struct siba_dev_softc *, uint32_t); +int siba_powerdown(struct siba_softc *); +int siba_dev_isup(struct siba_dev_softc *); +void siba_pcicore_intr(struct siba_pci *, struct siba_dev_softc *); +uint32_t siba_dma_translation(struct siba_dev_softc *); +void *siba_dma_alloc_consistent(struct siba_dev_softc *, size_t, + bus_addr_t *); +void siba_read_multi_1(struct siba_dev_softc *, void *, size_t, + uint16_t); +void siba_read_multi_2(struct siba_dev_softc *, void *, size_t, + uint16_t); +void siba_read_multi_4(struct siba_dev_softc *, void *, size_t, + uint16_t); +void siba_write_multi_1(struct siba_dev_softc *, const void *, + size_t, uint16_t); +void siba_write_multi_2(struct siba_dev_softc *, const void *, + size_t, uint16_t); +void siba_write_multi_4(struct siba_dev_softc *, const void *, + size_t, uint16_t); +void siba_barrier(struct siba_dev_softc *, int); +void siba_cc_pmu_set_ldovolt(struct siba_cc *, int, uint32_t); +void siba_cc_pmu_set_ldoparef(struct siba_cc *, uint8_t); + #endif /* _SIBA_SIBAVAR_H_ */ diff --git a/sys/dev/siis/siis.c b/sys/dev/siis/siis.c index 31002ebcfce2..29afa2a40527 100644 --- a/sys/dev/siis/siis.c +++ b/sys/dev/siis/siis.c @@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include /* local prototypes */ @@ -69,7 +68,7 @@ static void siis_dmasetprd(void *arg, bus_dma_segment_t *segs, int nsegs, int er static void siis_execute_transaction(struct siis_slot *slot); static void siis_timeout(struct siis_slot *slot); static void siis_end_transaction(struct siis_slot *slot, enum siis_err_type et); -static int siis_setup_fis(struct siis_cmd *ctp, union ccb *ccb, int tag); +static int siis_setup_fis(device_t dev, struct siis_cmd *ctp, union ccb *ccb, int tag); static void siis_dmainit(device_t dev); static void siis_dmasetupc_cb(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); static void siis_dmafini(device_t dev); @@ -80,7 +79,6 @@ static void siis_portinit(device_t dev); static int siis_wait_ready(device_t dev, int t); static int siis_sata_connect(struct siis_channel *ch); -static int siis_sata_phy_reset(device_t dev); static void siis_issue_read_log(device_t dev); static void siis_process_read_log(device_t dev, union ccb *ccb); @@ -90,24 +88,39 @@ static void siispoll(struct cam_sim *sim); MALLOC_DEFINE(M_SIIS, "SIIS driver", "SIIS driver data buffers"); +static struct { + uint32_t id; + const char *name; + int ports; + int quirks; +#define SIIS_Q_SNTF 1 +} siis_ids[] = { + {0x31241095, "SiI3124", 4, 0}, + {0x31248086, "SiI3124", 4, 0}, + {0x31321095, "SiI3132", 2, SIIS_Q_SNTF}, + {0x02421095, "SiI3132", 2, SIIS_Q_SNTF}, + {0x02441095, "SiI3132", 2, SIIS_Q_SNTF}, + {0x31311095, "SiI3131", 1, SIIS_Q_SNTF}, + {0x35311095, "SiI3531", 1, SIIS_Q_SNTF}, + {0, NULL, 0, 0} +}; + static int siis_probe(device_t dev) { + char buf[64]; + int i; uint32_t devid = pci_get_devid(dev); - if (devid == SIIS_SII3124) { - device_set_desc_copy(dev, "SiI3124 SATA2 controller"); - } else if (devid == SIIS_SII3132 || - devid == SIIS_SII3132_1 || - devid == SIIS_SII3132_2) { - device_set_desc_copy(dev, "SiI3132 SATA2 controller"); - } else if (devid == SIIS_SII3531) { - device_set_desc_copy(dev, "SiI3531 SATA2 controller"); - } else { - return (ENXIO); + for (i = 0; siis_ids[i].id != 0; i++) { + if (siis_ids[i].id == devid) { + snprintf(buf, sizeof(buf), "%s SATA controller", + siis_ids[i].name); + device_set_desc_copy(dev, buf); + return (BUS_PROBE_VENDOR); + } } - - return (BUS_PROBE_VENDOR); + return (ENXIO); } static int @@ -116,14 +129,20 @@ siis_attach(device_t dev) struct siis_controller *ctlr = device_get_softc(dev); uint32_t devid = pci_get_devid(dev); device_t child; - int error, unit; + int error, i, unit; ctlr->dev = dev; + for (i = 0; siis_ids[i].id != 0; i++) { + if (siis_ids[i].id == devid) + break; + } + ctlr->quirks = siis_ids[i].quirks; /* Global memory */ ctlr->r_grid = PCIR_BAR(0); if (!(ctlr->r_gmem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &ctlr->r_grid, RF_ACTIVE))) return (ENXIO); + ctlr->gctl = ATA_INL(ctlr->r_gmem, SIIS_GCTL); /* Channels memory */ ctlr->r_rid = PCIR_BAR(2); if (!(ctlr->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, @@ -147,8 +166,7 @@ siis_attach(device_t dev) /* Reset controller */ siis_resume(dev); /* Number of HW channels */ - ctlr->channels = (devid == SIIS_SII3124) ? 4 : - (devid == SIIS_SII3531 ? 1 : 2); + ctlr->channels = siis_ids[i].ports; /* Setup interrupts. */ if (siis_setup_interrupt(dev)) { bus_release_resource(dev, SYS_RES_MEMORY, ctlr->r_rid, ctlr->r_mem); @@ -203,7 +221,8 @@ siis_suspend(device_t dev) bus_generic_suspend(dev); /* Put controller into reset state. */ - ATA_OUTL(ctlr->r_gmem, SIIS_GCTL, SIIS_GCTL_GRESET); + ctlr->gctl |= SIIS_GCTL_GRESET; + ATA_OUTL(ctlr->r_gmem, SIIS_GCTL, ctlr->gctl); return 0; } @@ -212,11 +231,17 @@ siis_resume(device_t dev) { struct siis_controller *ctlr = device_get_softc(dev); + /* Set PCIe max read request size to at least 1024 bytes */ + if (pci_get_max_read_req(dev) < 1024) + pci_set_max_read_req(dev, 1024); /* Put controller into reset state. */ - ATA_OUTL(ctlr->r_gmem, SIIS_GCTL, SIIS_GCTL_GRESET); + ctlr->gctl |= SIIS_GCTL_GRESET; + ATA_OUTL(ctlr->r_gmem, SIIS_GCTL, ctlr->gctl); DELAY(10000); /* Get controller out of reset state and enable port interrupts. */ - ATA_OUTL(ctlr->r_gmem, SIIS_GCTL, 0x0000000f); + ctlr->gctl &= ~(SIIS_GCTL_GRESET | SIIS_GCTL_I2C_IE); + ctlr->gctl |= 0x0000000f; + ATA_OUTL(ctlr->r_gmem, SIIS_GCTL, ctlr->gctl); return (bus_generic_resume(dev)); } @@ -270,6 +295,11 @@ siis_intr(void *data) ctlr->interrupt[unit].function(arg); } } + /* Acknowledge interrupt, if MSI enabled. */ + if (ctlr->irq.r_irq_rid) { + ATA_OUTL(ctlr->r_gmem, SIIS_GCTL, + ctlr->gctl | SIIS_GCTL_MSIACK); + } } static struct resource * @@ -398,16 +428,25 @@ siis_ch_probe(device_t dev) static int siis_ch_attach(device_t dev) { + struct siis_controller *ctlr = device_get_softc(device_get_parent(dev)); struct siis_channel *ch = device_get_softc(dev); struct cam_devq *devq; - int rid, error; + int rid, error, i, sata_rev = 0; ch->dev = dev; ch->unit = (intptr_t)device_get_ivars(dev); + ch->quirks = ctlr->quirks; resource_int_value(device_get_name(dev), device_get_unit(dev), "pm_level", &ch->pm_level); resource_int_value(device_get_name(dev), - device_get_unit(dev), "sata_rev", &ch->sata_rev); + device_get_unit(dev), "sata_rev", &sata_rev); + for (i = 0; i < 16; i++) { + ch->user[i].revision = sata_rev; + ch->user[i].mode = 0; + ch->user[i].bytecount = 8192; + ch->user[i].tags = SIIS_MAX_SLOTS; + ch->curr[i] = ch->user[i]; + } mtx_init(&ch->mtx, "SIIS channel lock", NULL, MTX_DEF); rid = ch->unit; if (!(ch->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, @@ -439,7 +478,7 @@ siis_ch_attach(device_t dev) } /* Construct SIM entry */ ch->sim = cam_sim_alloc(siisaction, siispoll, "siisch", ch, - device_get_unit(dev), &ch->mtx, SIIS_MAX_SLOTS, 0, devq); + device_get_unit(dev), &ch->mtx, 2, SIIS_MAX_SLOTS, devq); if (ch->sim == NULL) { device_printf(dev, "unable to allocate sim\n"); error = ENOMEM; @@ -512,7 +551,10 @@ siis_ch_resume(device_t dev) /* Get port out of reset state. */ ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PORT_RESET); ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_32BIT); - ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); + if (ch->pm_present) + ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); + else + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); /* Enable port interrupts */ ATA_OUTL(ch->r_mem, SIIS_P_IESET, SIIS_P_IX_ENABLED); return (0); @@ -561,7 +603,7 @@ siis_dmainit(device_t dev) } ch->dma.work_bus = dcba.maddr; /* Data area. */ - if (bus_dma_tag_create(bus_get_dma_tag(dev), 2, 0, + if (bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, SIIS_SG_ENTRIES * PAGE_SIZE * SIIS_MAX_SLOTS, @@ -639,6 +681,7 @@ siis_slotsfree(device_t dev) for (i = 0; i < SIIS_MAX_SLOTS; i++) { struct siis_slot *slot = &ch->slot[i]; + callout_drain(&slot->timeout); if (slot->dma.data_map) { bus_dmamap_destroy(ch->dma.data_tag, slot->dma.data_map); slot->dma.data_map = NULL; @@ -654,8 +697,16 @@ siis_notify_events(device_t dev) u_int32_t status; int i; - status = ATA_INL(ch->r_mem, SIIS_P_SNTF); - ATA_OUTL(ch->r_mem, SIIS_P_SNTF, status); + if (ch->quirks & SIIS_Q_SNTF) { + status = ATA_INL(ch->r_mem, SIIS_P_SNTF); + ATA_OUTL(ch->r_mem, SIIS_P_SNTF, status); + } else { + /* + * Without SNTF we have no idea which device sent notification. + * If PMP is connected, assume it, else - device. + */ + status = (ch->pm_present) ? 0x8000 : 0x0001; + } if (bootverbose) device_printf(dev, "SNTF 0x%04x\n", status); for (i = 0; i < 16; i++) { @@ -678,17 +729,26 @@ siis_phy_check_events(device_t dev) /* If we have a connection event, deal with it */ if (ch->pm_level == 0) { u_int32_t status = ATA_INL(ch->r_mem, SIIS_P_SSTS); - if (((status & ATA_SS_DET_MASK) == ATA_SS_DET_PHY_ONLINE) && - ((status & ATA_SS_SPD_MASK) != ATA_SS_SPD_NO_SPEED) && - ((status & ATA_SS_IPM_MASK) == ATA_SS_IPM_ACTIVE)) { - if (bootverbose) + union ccb *ccb; + + if (bootverbose) { + if (((status & ATA_SS_DET_MASK) == ATA_SS_DET_PHY_ONLINE) && + ((status & ATA_SS_SPD_MASK) != ATA_SS_SPD_NO_SPEED) && + ((status & ATA_SS_IPM_MASK) == ATA_SS_IPM_ACTIVE)) { device_printf(dev, "CONNECT requested\n"); - siis_reset(dev); - } else { - if (bootverbose) + } else device_printf(dev, "DISCONNECT requested\n"); - ch->devices = 0; } + siis_reset(dev); + if ((ccb = xpt_alloc_ccb_nowait()) == NULL) + return; + if (xpt_create_path(&ccb->ccb_h.path, NULL, + cam_sim_path(ch->sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + xpt_free_ccb(ccb); + return; + } + xpt_rescan(ccb); } } @@ -752,7 +812,12 @@ siis_ch_intr(void *data) if (ch->frozen) { union ccb *fccb = ch->frozen; ch->frozen = NULL; - fccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; + fccb->ccb_h.status &= ~CAM_STATUS_MASK; + fccb->ccb_h.status |= CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; + if (!(fccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(fccb->ccb_h.path, 1); + fccb->ccb_h.status |= CAM_DEV_QFRZN; + } xpt_done(fccb); } if (estatus == SIIS_P_CMDERR_DEV || @@ -760,7 +825,7 @@ siis_ch_intr(void *data) estatus == SIIS_P_CMDERR_DATAFIS) { tslots = ch->numtslots[port]; for (i = 0; i < SIIS_MAX_SLOTS; i++) { - /* XXX: reqests in loading state. */ + /* XXX: requests in loading state. */ if (((ch->rslots >> i) & 1) == 0) continue; if (ch->slot[i].ccb->ccb_h.target_id != port) @@ -792,7 +857,7 @@ siis_ch_intr(void *data) } else et = SIIS_ERR_INVALID; for (i = 0; i < SIIS_MAX_SLOTS; i++) { - /* XXX: reqests in loading state. */ + /* XXX: requests in loading state. */ if (((ch->rslots >> i) & 1) == 0) continue; siis_end_transaction(&ch->slot[i], et); @@ -808,6 +873,13 @@ siis_check_collision(device_t dev, union ccb *ccb) struct siis_channel *ch = device_get_softc(dev); mtx_assert(&ch->mtx, MA_OWNED); + if ((ccb->ccb_h.func_code == XPT_ATA_IO) && + (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { + /* Tagged command while we have no supported tag free. */ + if (((~ch->oslots) & (0x7fffffff >> (31 - + ch->curr[ccb->ccb_h.target_id].tags))) == 0) + return (1); + } if ((ccb->ccb_h.func_code == XPT_ATA_IO) && (ccb->ataio.cmd.flags & (CAM_ATAIO_CONTROL | CAM_ATAIO_NEEDRESULT))) { /* Atomic command while anything active. */ @@ -826,25 +898,20 @@ siis_begin_transaction(device_t dev, union ccb *ccb) { struct siis_channel *ch = device_get_softc(dev); struct siis_slot *slot; - int tag; + int tag, tags; mtx_assert(&ch->mtx, MA_OWNED); /* Choose empty slot. */ - tag = ch->lastslot; - do { - tag++; - if (tag >= SIIS_MAX_SLOTS) - tag = 0; - if (ch->slot[tag].state == SIIS_SLOT_EMPTY) - break; - } while (tag != ch->lastslot); - if (ch->slot[tag].state != SIIS_SLOT_EMPTY) - device_printf(ch->dev, "ALL SLOTS BUSY!\n"); - ch->lastslot = tag; + tags = SIIS_MAX_SLOTS; + if ((ccb->ccb_h.func_code == XPT_ATA_IO) && + (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) + tags = ch->curr[ccb->ccb_h.target_id].tags; + tag = fls((~ch->oslots) & (0x7fffffff >> (31 - tags))) - 1; /* Occupy chosen slot. */ slot = &ch->slot[tag]; slot->ccb = ccb; /* Update channel stats. */ + ch->oslots |= (1 << slot->slot); ch->numrslots++; if ((ccb->ccb_h.func_code == XPT_ATA_IO) && (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { @@ -931,17 +998,40 @@ siis_execute_transaction(struct siis_slot *slot) ctp->protocol_override = 0; ctp->transfer_count = 0; /* Special handling for Soft Reset command. */ - if ((ccb->ccb_h.func_code == XPT_ATA_IO) && - (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL)) { - ctp->control |= htole16(SIIS_PRB_SOFT_RESET); + if (ccb->ccb_h.func_code == XPT_ATA_IO) { + if (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) { + ctp->control |= htole16(SIIS_PRB_SOFT_RESET); + } else { + ctp->control |= htole16(SIIS_PRB_PROTOCOL_OVERRIDE); + if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) { + ctp->protocol_override |= + htole16(SIIS_PRB_PROTO_NCQ); + } + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { + ctp->protocol_override |= + htole16(SIIS_PRB_PROTO_READ); + } else + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { + ctp->protocol_override |= + htole16(SIIS_PRB_PROTO_WRITE); + } + } } else if (ccb->ccb_h.func_code == XPT_SCSI_IO) { - if (ccb->ccb_h.flags & CAM_DIR_IN) + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) ctp->control |= htole16(SIIS_PRB_PACKET_READ); - if (ccb->ccb_h.flags & CAM_DIR_OUT) + else + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) ctp->control |= htole16(SIIS_PRB_PACKET_WRITE); } + /* Special handling for Soft Reset command. */ + if ((ccb->ccb_h.func_code == XPT_ATA_IO) && + (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) && + (ccb->ataio.cmd.control & ATA_A_RESET)) { + /* Kick controller into sane state */ + siis_portinit(dev); + } /* Setup the FIS for this request */ - if (!siis_setup_fis(ctp, ccb, slot->slot)) { + if (!siis_setup_fis(dev, ctp, ccb, slot->slot)) { device_printf(ch->dev, "Setting up SATA FIS failed\n"); if (!ch->readlog) xpt_freeze_simq(ch->sim, 1); @@ -963,40 +1053,75 @@ siis_execute_transaction(struct siis_slot *slot) return; } +/* Must be called with channel locked. */ +static void +siis_process_timeout(device_t dev) +{ + struct siis_channel *ch = device_get_softc(dev); + int i; + + mtx_assert(&ch->mtx, MA_OWNED); + if (!ch->readlog && !ch->recovery) { + xpt_freeze_simq(ch->sim, ch->numrslots); + ch->recovery = 1; + } + /* Handle the rest of commands. */ + for (i = 0; i < SIIS_MAX_SLOTS; i++) { + /* Do we have a running request on slot? */ + if (ch->slot[i].state < SIIS_SLOT_RUNNING) + continue; + siis_end_transaction(&ch->slot[i], SIIS_ERR_TIMEOUT); + } +} + +/* Must be called with channel locked. */ +static void +siis_rearm_timeout(device_t dev) +{ + struct siis_channel *ch = device_get_softc(dev); + int i; + + mtx_assert(&ch->mtx, MA_OWNED); + for (i = 0; i < SIIS_MAX_SLOTS; i++) { + struct siis_slot *slot = &ch->slot[i]; + + /* Do we have a running request on slot? */ + if (slot->state < SIIS_SLOT_RUNNING) + continue; + if ((ch->toslots & (1 << i)) == 0) + continue; + callout_reset(&slot->timeout, + (int)slot->ccb->ccb_h.timeout * hz / 1000, + (timeout_t*)siis_timeout, slot); + } +} + /* Locked by callout mechanism. */ static void siis_timeout(struct siis_slot *slot) { device_t dev = slot->dev; struct siis_channel *ch = device_get_softc(dev); - int i; mtx_assert(&ch->mtx, MA_OWNED); + /* Check for stale timeout. */ + if (slot->state < SIIS_SLOT_RUNNING) + return; device_printf(dev, "Timeout on slot %d\n", slot->slot); -device_printf(dev, "%s is %08x ss %08x rs %08x es %08x sts %08x serr %08x\n", - __func__, ATA_INL(ch->r_mem, SIIS_P_IS), ATA_INL(ch->r_mem, SIIS_P_SS), ch->rslots, - ATA_INL(ch->r_mem, SIIS_P_CMDERR), ATA_INL(ch->r_mem, SIIS_P_STS), - ATA_INL(ch->r_mem, SIIS_P_SERR)); - /* Kick controller into sane state. */ - siis_portinit(ch->dev); + device_printf(dev, "%s is %08x ss %08x rs %08x es %08x sts %08x serr %08x\n", + __func__, ATA_INL(ch->r_mem, SIIS_P_IS), + ATA_INL(ch->r_mem, SIIS_P_SS), ch->rslots, + ATA_INL(ch->r_mem, SIIS_P_CMDERR), ATA_INL(ch->r_mem, SIIS_P_STS), + ATA_INL(ch->r_mem, SIIS_P_SERR)); - if (!ch->readlog) - xpt_freeze_simq(ch->sim, ch->numrslots); - /* Handle command with timeout. */ - siis_end_transaction(&ch->slot[slot->slot], SIIS_ERR_TIMEOUT); - /* Handle the rest of commands. */ - if (ch->frozen) { - union ccb *fccb = ch->frozen; - ch->frozen = NULL; - fccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; - xpt_done(fccb); - } - for (i = 0; i < SIIS_MAX_SLOTS; i++) { - /* Do we have a running request on slot? */ - if (ch->slot[i].state < SIIS_SLOT_RUNNING) - continue; - siis_end_transaction(&ch->slot[i], SIIS_ERR_INNOCENT); - } + if (ch->toslots == 0) + xpt_freeze_simq(ch->sim, 1); + ch->toslots |= (1 << slot->slot); + if ((ch->rslots & ~ch->toslots) == 0) + siis_process_timeout(dev); + else + device_printf(dev, " ... waiting for slots %08x\n", + ch->rslots & ~ch->toslots); } /* Must be called with channel locked. */ @@ -1008,8 +1133,6 @@ siis_end_transaction(struct siis_slot *slot, enum siis_err_type et) union ccb *ccb = slot->ccb; mtx_assert(&ch->mtx, MA_OWNED); - /* Cancel command execution timeout */ - callout_stop(&slot->timeout); bus_dmamap_sync(ch->dma.work_tag, ch->dma.work_map, BUS_DMASYNC_POSTWRITE); /* Read result registers to the result struct @@ -1043,11 +1166,17 @@ siis_end_transaction(struct siis_slot *slot, enum siis_err_type et) bus_dmamap_unload(ch->dma.data_tag, slot->dma.data_map); } /* Set proper result status. */ - ccb->ccb_h.status &= ~CAM_STATUS_MASK; if (et != SIIS_ERR_NONE || ch->recovery) { ch->eslots |= (1 << slot->slot); ccb->ccb_h.status |= CAM_RELEASE_SIMQ; } + /* In case of error, freeze device for proper recovery. */ + if (et != SIIS_ERR_NONE && + !(ccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(ccb->ccb_h.path, 1); + ccb->ccb_h.status |= CAM_DEV_QFRZN; + } + ccb->ccb_h.status &= ~CAM_STATUS_MASK; switch (et) { case SIIS_ERR_NONE: ccb->ccb_h.status |= CAM_REQ_CMP; @@ -1055,12 +1184,14 @@ siis_end_transaction(struct siis_slot *slot, enum siis_err_type et) ccb->csio.scsi_status = SCSI_STATUS_OK; break; case SIIS_ERR_INVALID: + ch->fatalerr = 1; ccb->ccb_h.status |= CAM_REQ_INVALID; break; case SIIS_ERR_INNOCENT: ccb->ccb_h.status |= CAM_REQUEUE_REQ; break; case SIIS_ERR_TFE: + case SIIS_ERR_NCQ: if (ccb->ccb_h.func_code == XPT_SCSI_IO) { ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; @@ -1069,20 +1200,25 @@ siis_end_transaction(struct siis_slot *slot, enum siis_err_type et) } break; case SIIS_ERR_SATA: + ch->fatalerr = 1; ccb->ccb_h.status |= CAM_UNCOR_PARITY; break; case SIIS_ERR_TIMEOUT: + ch->fatalerr = 1; ccb->ccb_h.status |= CAM_CMD_TIMEOUT; break; - case SIIS_ERR_NCQ: - ccb->ccb_h.status |= CAM_ATA_STATUS_ERROR; - break; default: ccb->ccb_h.status |= CAM_REQ_CMP_ERR; } /* Free slot. */ + ch->oslots &= ~(1 << slot->slot); ch->rslots &= ~(1 << slot->slot); ch->aslots &= ~(1 << slot->slot); + if (et != SIIS_ERR_TIMEOUT) { + if (ch->toslots == (1 << slot->slot)) + xpt_release_simq(ch->sim, TRUE); + ch->toslots &= ~(1 << slot->slot); + } slot->state = SIIS_SLOT_EMPTY; slot->ccb = NULL; /* Update channel stats. */ @@ -1091,16 +1227,17 @@ siis_end_transaction(struct siis_slot *slot, enum siis_err_type et) (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) { ch->numtslots[ccb->ccb_h.target_id]--; } + /* If it was our READ LOG command - process it. */ + if (ch->readlog) { + siis_process_read_log(dev, ccb); /* If it was NCQ command error, put result on hold. */ - if (et == SIIS_ERR_NCQ) { + } else if (et == SIIS_ERR_NCQ) { ch->hold[slot->slot] = ccb; ch->numhslots++; - } else if (ch->readlog) /* If it was our READ LOG command - process it. */ - siis_process_read_log(dev, ccb); - else + } else xpt_done(ccb); /* Unfreeze frozen command. */ - if (ch->frozen && ch->numrslots == 0) { + if (ch->frozen && !siis_check_collision(dev, ch->frozen)) { union ccb *fccb = ch->frozen; ch->frozen = NULL; siis_begin_transaction(dev, fccb); @@ -1108,13 +1245,21 @@ siis_end_transaction(struct siis_slot *slot, enum siis_err_type et) } /* If we have no other active commands, ... */ if (ch->rslots == 0) { - /* if we have slots in error, we can reinit port. */ - if (ch->eslots != 0) - siis_portinit(dev); - /* if there commands on hold, we can do READ LOG. */ - if (!ch->readlog && ch->numhslots) - siis_issue_read_log(dev); - } + /* if there were timeouts or fatal error - reset port. */ + if (ch->toslots != 0 || ch->fatalerr) { + siis_reset(dev); + } else { + /* if we have slots in error, we can reinit port. */ + if (ch->eslots != 0) + siis_portinit(dev); + /* if there commands on hold, we can do READ LOG. */ + if (!ch->readlog && ch->numhslots) + siis_issue_read_log(dev); + } + /* If all the reset of commands are in timeout - abort them. */ + } else if ((ch->rslots & ~ch->toslots) == 0 && + et != SIIS_ERR_TIMEOUT) + siis_rearm_timeout(dev); } static void @@ -1235,16 +1380,25 @@ siis_portinit(device_t dev) siis_wait_ready(dev, 1000); } -#if 0 -static void +static int siis_devreset(device_t dev) { struct siis_channel *ch = device_get_softc(dev); + int timeout = 0; + uint32_t val; ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_DEV_RESET); - siis_wait_ready(dev, 1000); + while (((val = ATA_INL(ch->r_mem, SIIS_P_STS)) & + SIIS_P_CTL_DEV_RESET) != 0) { + DELAY(1000); + if (timeout++ > 100) { + device_printf(dev, "device reset stuck (timeout %dms) " + "status = %08x\n", timeout, val); + return (EBUSY); + } + } + return (0); } -#endif static int siis_wait_ready(device_t dev, int t) @@ -1262,8 +1416,6 @@ siis_wait_ready(device_t dev, int t) return (EBUSY); } } - if (bootverbose) - device_printf(dev, "ready wait time=%dms\n", timeout); return (0); } @@ -1271,22 +1423,27 @@ static void siis_reset(device_t dev) { struct siis_channel *ch = device_get_softc(dev); - int i; + int i, retry = 0, sata_rev; + uint32_t val; + xpt_freeze_simq(ch->sim, 1); if (bootverbose) device_printf(dev, "SIIS reset...\n"); - xpt_freeze_simq(ch->sim, ch->numrslots); - /* Requeue freezed command. */ + if (!ch->readlog && !ch->recovery) + xpt_freeze_simq(ch->sim, ch->numrslots); + /* Requeue frozen command. */ if (ch->frozen) { union ccb *fccb = ch->frozen; ch->frozen = NULL; - fccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; + fccb->ccb_h.status &= ~CAM_STATUS_MASK; + fccb->ccb_h.status |= CAM_REQUEUE_REQ | CAM_RELEASE_SIMQ; + if (!(fccb->ccb_h.status & CAM_DEV_QFRZN)) { + xpt_freeze_devq(fccb->ccb_h.path, 1); + fccb->ccb_h.status |= CAM_DEV_QFRZN; + } xpt_done(fccb); } - /* Disable port interrupts */ - ATA_OUTL(ch->r_mem, SIIS_P_IECLR, 0x0000FFFF); - /* Kill the engine and requeue all running commands. */ - siis_portinit(dev); + /* Requeue all running commands. */ for (i = 0; i < SIIS_MAX_SLOTS; i++) { /* Do we have a running request on slot? */ if (ch->slot[i].state < SIIS_SLOT_RUNNING) @@ -1294,8 +1451,39 @@ siis_reset(device_t dev) /* XXX; Commands in loading state. */ siis_end_transaction(&ch->slot[i], SIIS_ERR_INNOCENT); } + /* Finish all holden commands as-is. */ + for (i = 0; i < SIIS_MAX_SLOTS; i++) { + if (!ch->hold[i]) + continue; + xpt_done(ch->hold[i]); + ch->hold[i] = NULL; + ch->numhslots--; + } + if (ch->toslots != 0) + xpt_release_simq(ch->sim, TRUE); + ch->eslots = 0; + ch->recovery = 0; + ch->toslots = 0; + ch->fatalerr = 0; + /* Disable port interrupts */ + ATA_OUTL(ch->r_mem, SIIS_P_IECLR, 0x0000FFFF); + /* Set speed limit. */ + sata_rev = ch->user[ch->pm_present ? 15 : 0].revision; + if (sata_rev == 1) + val = ATA_SC_SPD_SPEED_GEN1; + else if (sata_rev == 2) + val = ATA_SC_SPD_SPEED_GEN2; + else if (sata_rev == 3) + val = ATA_SC_SPD_SPEED_GEN3; + else + val = 0; + ATA_OUTL(ch->r_mem, SIIS_P_SCTL, + ATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 : + (ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER))); +retry: + siis_devreset(dev); /* Reset and reconnect PHY, */ - if (!siis_sata_phy_reset(dev)) { + if (!siis_sata_connect(ch)) { ch->devices = 0; /* Enable port interrupts */ ATA_OUTL(ch->r_mem, SIIS_P_IESET, SIIS_P_IX_ENABLED); @@ -1304,11 +1492,28 @@ siis_reset(device_t dev) "SIIS reset done: phy reset found no device\n"); /* Tell the XPT about the event */ xpt_async(AC_BUS_RESET, ch->path, NULL); + xpt_release_simq(ch->sim, TRUE); return; } /* Wait for clearing busy status. */ if (siis_wait_ready(dev, 10000)) { device_printf(dev, "device ready timeout\n"); + if (!retry) { + device_printf(dev, "trying full port reset ...\n"); + /* Get port to the reset state. */ + ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PORT_RESET); + DELAY(10000); + /* Get port out of reset state. */ + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PORT_RESET); + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_32BIT); + if (ch->pm_present) + ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); + else + ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); + siis_wait_ready(dev, 5000); + retry = 1; + goto retry; + } } ch->devices = 1; /* Enable port interrupts */ @@ -1318,11 +1523,13 @@ siis_reset(device_t dev) device_printf(dev, "SIIS reset done: devices=%08x\n", ch->devices); /* Tell the XPT about the event */ xpt_async(AC_BUS_RESET, ch->path, NULL); + xpt_release_simq(ch->sim, TRUE); } static int -siis_setup_fis(struct siis_cmd *ctp, union ccb *ccb, int tag) +siis_setup_fis(device_t dev, struct siis_cmd *ctp, union ccb *ccb, int tag) { + struct siis_channel *ch = device_get_softc(dev); u_int8_t *fis = &ctp->fis[0]; bzero(fis, 24); @@ -1331,7 +1538,8 @@ siis_setup_fis(struct siis_cmd *ctp, union ccb *ccb, int tag) if (ccb->ccb_h.func_code == XPT_SCSI_IO) { fis[1] |= 0x80; fis[2] = ATA_PACKET_CMD; - if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) + if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE && + ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA) fis[3] = ATA_F_DMA; else { fis[5] = ccb->csio.dxfer_len; @@ -1400,32 +1608,6 @@ siis_sata_connect(struct siis_channel *ch) return (1); } -static int -siis_sata_phy_reset(device_t dev) -{ - struct siis_channel *ch = device_get_softc(dev); - uint32_t val; - - if (bootverbose) - device_printf(dev, "hardware reset ...\n"); - ATA_OUTL(ch->r_mem, SIIS_P_SCTL, ATA_SC_IPM_DIS_PARTIAL | - ATA_SC_IPM_DIS_SLUMBER | ATA_SC_DET_RESET); - DELAY(50000); - if (ch->sata_rev == 1) - val = ATA_SC_SPD_SPEED_GEN1; - else if (ch->sata_rev == 2) - val = ATA_SC_SPD_SPEED_GEN2; - else if (ch->sata_rev == 3) - val = ATA_SC_SPD_SPEED_GEN3; - else - val = 0; - ATA_OUTL(ch->r_mem, SIIS_P_SCTL, - ATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 : - (ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER))); - DELAY(50000); - return (siis_sata_connect(ch)); -} - static void siisaction(struct cam_sim *sim, union ccb *ccb) { @@ -1469,13 +1651,29 @@ siisaction(struct cam_sim *sim, union ccb *ccb) case XPT_SET_TRAN_SETTINGS: { struct ccb_trans_settings *cts = &ccb->cts; + struct siis_device *d; + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + d = &ch->curr[ccb->ccb_h.target_id]; + else + d = &ch->user[ccb->ccb_h.target_id]; + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_REVISION) + d->revision = cts->xport_specific.sata.revision; + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_MODE) + d->mode = cts->xport_specific.sata.mode; + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT) + d->bytecount = min(8192, cts->xport_specific.sata.bytecount); + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_TAGS) + d->tags = min(SIIS_MAX_SLOTS, cts->xport_specific.sata.tags); if (cts->xport_specific.sata.valid & CTS_SATA_VALID_PM) { - if (cts->xport_specific.sata.pm_present) + ch->pm_present = cts->xport_specific.sata.pm_present; + if (ch->pm_present) ATA_OUTL(ch->r_mem, SIIS_P_CTLSET, SIIS_P_CTL_PME); else ATA_OUTL(ch->r_mem, SIIS_P_CTLCLR, SIIS_P_CTL_PME); } + if (cts->xport_specific.sata.valid & CTS_SATA_VALID_TAGS) + d->atapi = cts->xport_specific.sata.atapi; ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); break; @@ -1484,32 +1682,43 @@ siisaction(struct cam_sim *sim, union ccb *ccb) /* Get default/user set transfer settings for the target */ { struct ccb_trans_settings *cts = &ccb->cts; + struct siis_device *d; uint32_t status; + if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + d = &ch->curr[ccb->ccb_h.target_id]; + else + d = &ch->user[ccb->ccb_h.target_id]; cts->protocol = PROTO_ATA; cts->protocol_version = PROTO_VERSION_UNSPECIFIED; cts->transport = XPORT_SATA; cts->transport_version = XPORT_VERSION_UNSPECIFIED; cts->proto_specific.valid = 0; cts->xport_specific.sata.valid = 0; - if (cts->type == CTS_TYPE_CURRENT_SETTINGS) + if (cts->type == CTS_TYPE_CURRENT_SETTINGS && + (ccb->ccb_h.target_id == 15 || + (ccb->ccb_h.target_id == 0 && !ch->pm_present))) { status = ATA_INL(ch->r_mem, SIIS_P_SSTS) & ATA_SS_SPD_MASK; - else - status = ATA_INL(ch->r_mem, SIIS_P_SCTL) & ATA_SC_SPD_MASK; - if (status & ATA_SS_SPD_GEN3) { - cts->xport_specific.sata.bitrate = 600000; - cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED; - } else if (status & ATA_SS_SPD_GEN2) { - cts->xport_specific.sata.bitrate = 300000; - cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED; - } else if (status & ATA_SS_SPD_GEN1) { - cts->xport_specific.sata.bitrate = 150000; - cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED; + if (status & 0x0f0) { + cts->xport_specific.sata.revision = + (status & 0x0f0) >> 4; + cts->xport_specific.sata.valid |= + CTS_SATA_VALID_REVISION; + } + } else { + cts->xport_specific.sata.revision = d->revision; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_REVISION; } - cts->xport_specific.sata.pm_present = - (ATA_INL(ch->r_mem, SIIS_P_STS) & SIIS_P_CTL_PME) ? - 1 : 0; + cts->xport_specific.sata.mode = d->mode; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_MODE; + cts->xport_specific.sata.bytecount = d->bytecount; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_BYTECOUNT; + cts->xport_specific.sata.pm_present = ch->pm_present; cts->xport_specific.sata.valid |= CTS_SATA_VALID_PM; + cts->xport_specific.sata.tags = d->tags; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_TAGS; + cts->xport_specific.sata.atapi = d->atapi; + cts->xport_specific.sata.valid |= CTS_SATA_VALID_ATAPI; ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); break; @@ -1564,7 +1773,7 @@ siisaction(struct cam_sim *sim, union ccb *ccb) cpi->target_sprt = 0; cpi->hba_misc = PIM_SEQSCAN; cpi->hba_eng_cnt = 0; - cpi->max_target = 14; + cpi->max_target = 15; cpi->max_lun = 0; cpi->initiator_id = 0; cpi->bus_id = cam_sim_bus(sim); diff --git a/sys/dev/siis/siis.h b/sys/dev/siis/siis.h index 87a1d5d99948..92b4e26d13a8 100644 --- a/sys/dev/siis/siis.h +++ b/sys/dev/siis/siis.h @@ -137,12 +137,6 @@ #define ATA_SACTIVE 16 -#define SIIS_SII3124 0x31241095 -#define SIIS_SII3132 0x31321095 -#define SIIS_SII3132_1 0x02421095 -#define SIIS_SII3132_2 0x02441095 -#define SIIS_SII3531 0x35311095 - /* * Global registers */ @@ -310,6 +304,12 @@ struct siis_cmd { #define SIIS_PRB_INTERRUPT_MASK 0x0040 #define SIIS_PRB_SOFT_RESET 0x0080 u_int16_t protocol_override; +#define SIIS_PRB_PROTO_PACKET 0x0001 +#define SIIS_PRB_PROTO_TCQ 0x0002 +#define SIIS_PRB_PROTO_NCQ 0x0004 +#define SIIS_PRB_PROTO_READ 0x0008 +#define SIIS_PRB_PROTO_WRITE 0x0010 +#define SIIS_PRB_PROTO_TRANSPARENT 0x0020 u_int32_t transfer_count; u_int8_t fis[24]; union { @@ -352,6 +352,14 @@ struct siis_slot { struct callout timeout; /* Execution timeout */ }; +struct siis_device { + int revision; + int mode; + u_int bytecount; + u_int atapi; + u_int tags; +}; + /* structure describing an ATA channel */ struct siis_channel { device_t dev; /* Device handle */ @@ -362,25 +370,29 @@ struct siis_channel { struct ata_dma dma; /* DMA data */ struct cam_sim *sim; struct cam_path *path; + int quirks; int pm_level; /* power management level */ - int sata_rev; /* Maximum allowed SATA generation */ struct siis_slot slot[SIIS_MAX_SLOTS]; union ccb *hold[SIIS_MAX_SLOTS]; struct mtx mtx; /* state lock */ int devices; /* What is present */ int pm_present; /* PM presence reported */ + uint32_t oslots; /* Occupied slots */ uint32_t rslots; /* Running slots */ uint32_t aslots; /* Slots with atomic commands */ uint32_t eslots; /* Slots in error */ + uint32_t toslots; /* Slots in timeout */ int numrslots; /* Number of running slots */ int numtslots[SIIS_MAX_SLOTS]; /* Number of tagged slots */ int numhslots; /* Number of holden slots */ int readlog; /* Our READ LOG active */ + int fatalerr; /* Fatal error happend */ int recovery; /* Some slots are in error */ - int lastslot; /* Last used slot */ - int taggedtarget; /* Last tagged target */ union ccb *frozen; /* Frozen command */ + + struct siis_device user[16]; /* User-specified settings */ + struct siis_device curr[16]; /* Current settings */ }; /* structure describing a SIIS controller */ @@ -396,7 +408,9 @@ struct siis_controller { void *handle; int r_irq_rid; } irq; + int quirks; int channels; + uint32_t gctl; struct { void (*function)(void *); void *argument; diff --git a/sys/dev/sk/if_sk.c b/sys/dev/sk/if_sk.c index b9ca1cf5aa75..0f5d2b151017 100644 --- a/sys/dev/sk/if_sk.c +++ b/sys/dev/sk/if_sk.c @@ -1372,8 +1372,6 @@ sk_attach(dev) ifp->if_capenable = ifp->if_capabilities; ifp->if_ioctl = sk_ioctl; ifp->if_start = sk_start; - ifp->if_timer = 0; - ifp->if_watchdog = NULL; ifp->if_init = sk_init; IFQ_SET_MAXLEN(&ifp->if_snd, SK_TX_RING_CNT - 1); ifp->if_snd.ifq_drv_maxlen = SK_TX_RING_CNT - 1; diff --git a/sys/dev/sn/if_sn.c b/sys/dev/sn/if_sn.c index 923c0285784e..217d811cb0ae 100644 --- a/sys/dev/sn/if_sn.c +++ b/sys/dev/sn/if_sn.c @@ -82,6 +82,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -121,6 +122,7 @@ static int snioctl(struct ifnet * ifp, u_long, caddr_t); static void snresume(struct ifnet *); +static void snintr_locked(struct sn_softc *); static void sninit_locked(void *); static void snstart_locked(struct ifnet *); @@ -128,7 +130,7 @@ static void sninit(void *); static void snread(struct ifnet *); static void snstart(struct ifnet *); static void snstop(struct sn_softc *); -static void snwatchdog(struct ifnet *); +static void snwatchdog(void *); static void sn_setmcast(struct sn_softc *); static int sn_getmcf(struct ifnet *ifp, u_char *mcf); @@ -170,6 +172,7 @@ sn_attach(device_t dev) } SN_LOCK_INIT(sc); + callout_init_mtx(&sc->watchdog, &sc->sc_mtx, 0); snstop(sc); sc->pages_wanted = -1; @@ -202,13 +205,11 @@ sn_attach(device_t dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_start = snstart; ifp->if_ioctl = snioctl; - ifp->if_watchdog = snwatchdog; ifp->if_init = sninit; ifp->if_baudrate = 10000000; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); - ifp->if_timer = 0; ether_ifattach(ifp, eaddr); @@ -233,9 +234,11 @@ sn_detach(device_t dev) struct sn_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->ifp; - snstop(sc); - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; ether_ifdetach(ifp); + SN_LOCK(sc); + snstop(sc); + SN_UNLOCK(sc); + callout_drain(&sc->watchdog); sn_deactivate(dev); if_free(ifp); SN_LOCK_DESTROY(sc); @@ -342,6 +345,7 @@ sninit_locked(void *xsc) */ ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + callout_reset(&sc->watchdog, hz, snwatchdog, sc); /* * Attempt to push out any waiting packets. @@ -463,7 +467,7 @@ startagain: CSR_WRITE_1(sc, INTR_MASK_REG_B, mask); sc->intr_mask = mask; - ifp->if_timer = 1; + sc->timer = 1; ifp->if_drv_flags |= IFF_DRV_OACTIVE; sc->pages_wanted = numPages; return; @@ -548,7 +552,7 @@ startagain: CSR_WRITE_2(sc, MMU_CMD_REG_W, MMUCR_ENQUEUE); ifp->if_drv_flags |= IFF_DRV_OACTIVE; - ifp->if_timer = 1; + sc->timer = 1; BPF_MTAP(ifp, top); @@ -657,7 +661,7 @@ snresume(struct ifnet *ifp) packet_no = CSR_READ_1(sc, ALLOC_RESULT_REG_B); if (packet_no & ARR_FAILED) { if_printf(ifp, "Memory allocation failed. Weird.\n"); - ifp->if_timer = 1; + sc->timer = 1; goto try_start; } /* @@ -755,24 +759,32 @@ try_start: * Now pass control to snstart() to queue any additional packets */ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - snstart(ifp); + snstart_locked(ifp); /* * We've sent something, so we're active. Set a watchdog in case the * TX_EMPTY interrupt is lost. */ ifp->if_drv_flags |= IFF_DRV_OACTIVE; - ifp->if_timer = 1; + sc->timer = 1; return; } - void sn_intr(void *arg) { - int status, interrupts; struct sn_softc *sc = (struct sn_softc *) arg; + + SN_LOCK(sc); + snintr_locked(sc); + SN_UNLOCK(sc); +} + +static void +snintr_locked(struct sn_softc *sc) +{ + int status, interrupts; struct ifnet *ifp = sc->ifp; /* @@ -783,12 +795,10 @@ sn_intr(void *arg) uint16_t tx_status; uint16_t card_stats; - SN_LOCK(sc); - /* * Clear the watchdog. */ - ifp->if_timer = 0; + sc->timer = 0; SMC_SELECT_BANK(sc, 2); @@ -981,7 +991,6 @@ out: mask |= CSR_READ_1(sc, INTR_MASK_REG_B); CSR_WRITE_1(sc, INTR_MASK_REG_B, mask); sc->intr_mask = mask; - SN_UNLOCK(sc); } static void @@ -1136,7 +1145,6 @@ snioctl(struct ifnet *ifp, u_long cmd, caddr_t data) SN_LOCK(sc); if ((ifp->if_flags & IFF_UP) == 0 && ifp->if_drv_flags & IFF_DRV_RUNNING) { - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; snstop(sc); } else { /* reinitialize card on any parameter change */ @@ -1161,9 +1169,16 @@ snioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } static void -snwatchdog(struct ifnet *ifp) +snwatchdog(void *arg) { - sn_intr(ifp->if_softc); + struct sn_softc *sc; + + sc = arg; + SN_ASSERT_LOCKED(sc); + callout_reset(&sc->watchdog, hz, snwatchdog, sc); + if (sc->timer == 0 || --sc->timer > 0) + return; + snintr_locked(sc); } @@ -1193,7 +1208,9 @@ snstop(struct sn_softc *sc) /* * Cancel watchdog. */ - ifp->if_timer = 0; + sc->timer = 0; + callout_stop(&sc->watchdog); + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); } @@ -1220,8 +1237,6 @@ sn_activate(device_t dev) sn_deactivate(dev); return ENOMEM; } - sc->bst = rman_get_bustag(sc->port_res); - sc->bsh = rman_get_bushandle(sc->port_res); return (0); } diff --git a/sys/dev/sn/if_sn_pccard.c b/sys/dev/sn/if_sn_pccard.c index 034f51a70456..5c0d4eeeac3e 100644 --- a/sys/dev/sn/if_sn_pccard.c +++ b/sys/dev/sn/if_sn_pccard.c @@ -271,8 +271,6 @@ sn_pccard_megahertz_activate(device_t dev) sn_deactivate(dev); return ENOMEM; } - sc->bst = rman_get_bustag(sc->port_res); - sc->bsh = rman_get_bushandle(sc->port_res); return 0; } diff --git a/sys/dev/sn/if_snvar.h b/sys/dev/sn/if_snvar.h index 048f23a41fc0..bd4f31285c65 100644 --- a/sys/dev/sn/if_snvar.h +++ b/sys/dev/sn/if_snvar.h @@ -32,9 +32,9 @@ struct sn_softc { struct ifnet *ifp; - bus_space_tag_t bst; - bus_space_handle_t bsh; struct mtx sc_mtx; + struct callout watchdog; + int timer; int pages_wanted; /* Size of outstanding MMU ALLOC */ int intr_mask; /* Most recently set interrupt mask */ device_t dev; @@ -55,20 +55,20 @@ void sn_intr(void *); int sn_activate(device_t); void sn_deactivate(device_t); -#define CSR_READ_1(sc, off) (bus_space_read_1((sc)->bst, (sc)->bsh, off)) -#define CSR_READ_2(sc, off) (bus_space_read_2((sc)->bst, (sc)->bsh, off)) +#define CSR_READ_1(sc, off) (bus_read_1((sc)->port_res, off)) +#define CSR_READ_2(sc, off) (bus_read_2((sc)->port_res, off)) #define CSR_WRITE_1(sc, off, val) \ - bus_space_write_1(sc->bst, sc->bsh, off, val) + bus_write_1((sc)->port_res, off, val) #define CSR_WRITE_2(sc, off, val) \ - bus_space_write_2(sc->bst, sc->bsh, off, val) + bus_write_2((sc)->port_res, off, val) #define CSR_WRITE_MULTI_1(sc, off, addr, count) \ - bus_space_write_multi_1(sc->bst, sc->bsh, off, addr, count) + bus_write_multi_1((sc)->port_res, off, addr, count) #define CSR_WRITE_MULTI_2(sc, off, addr, count) \ - bus_space_write_multi_2(sc->bst, sc->bsh, off, addr, count) + bus_write_multi_2((sc)->port_res, off, addr, count) #define CSR_READ_MULTI_1(sc, off, addr, count) \ - bus_space_read_multi_1(sc->bst, sc->bsh, off, addr, count) + bus_read_multi_1((sc)->port_res, off, addr, count) #define CSR_READ_MULTI_2(sc, off, addr, count) \ - bus_space_read_multi_2(sc->bst, sc->bsh, off, addr, count) + bus_read_multi_2((sc)->port_res, off, addr, count) #define SN_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) #define SN_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) diff --git a/sys/dev/sound/pci/hda/hda_reg.h b/sys/dev/sound/pci/hda/hda_reg.h index 3c5757a314a9..0eeea64b178e 100644 --- a/sys/dev/sound/pci/hda/hda_reg.h +++ b/sys/dev/sound/pci/hda/hda_reg.h @@ -660,13 +660,49 @@ #define HDA_CMD_VERB_GET_STRIPE_CONTROL 0xf24 #define HDA_CMD_VERB_SET_STRIPE_CONTROL 0x724 -#define HDA_CMD_SET_STRIPE_CONTROL(cad, nid) \ +#define HDA_CMD_GET_STRIPE_CONTROL(cad, nid) \ (HDA_CMD_12BIT((cad), (nid), \ HDA_CMD_VERB_GET_STRIPE_CONTROL, 0x0)) -#define HDA_CMD_GET_STRIPE_CONTROL(cad, nid, payload) \ +#define HDA_CMD_SET_STRIPE_CONTROL(cad, nid, payload) \ (HDA_CMD_12BIT((cad), (nid), \ HDA_CMD_VERB_SET_STRIPE_CONTROL, (payload))) +/* Channel Count Control */ +#define HDA_CMD_VERB_GET_CONV_CHAN_COUNT 0xf2d +#define HDA_CMD_VERB_SET_CONV_CHAN_COUNT 0x72d + +#define HDA_CMD_GET_CONV_CHAN_COUNT(cad, nid) \ + (HDA_CMD_12BIT((cad), (nid), \ + HDA_CMD_VERB_GET_CONV_CHAN_COUNT, 0x0)) +#define HDA_CMD_SET_CONV_CHAN_COUNT(cad, nid, payload) \ + (HDA_CMD_12BIT((cad), (nid), \ + HDA_CMD_VERB_SET_CONV_CHAN_COUNT, (payload))) + +#define HDA_CMD_VERB_GET_HDMI_DIP_SIZE 0xf2e +#define HDA_CMD_VERB_GET_HDMI_ELDD 0xf2f + +#define HDA_CMD_VERB_GET_HDMI_DIP_INDEX 0xf30 +#define HDA_CMD_VERB_SET_HDMI_DIP_INDEX 0x730 + +#define HDA_CMD_VERB_GET_HDMI_DIP_DATA 0xf31 +#define HDA_CMD_VERB_SET_HDMI_DIP_DATA 0x731 + +#define HDA_CMD_VERB_GET_HDMI_DIP_XMIT 0xf32 +#define HDA_CMD_VERB_SET_HDMI_DIP_XMIT 0x732 + +#define HDA_CMD_VERB_GET_HDMI_CP_CTRL 0xf33 +#define HDA_CMD_VERB_SET_HDMI_CP_CTRL 0x733 + +#define HDA_CMD_VERB_GET_HDMI_CHAN_SLOT 0xf34 +#define HDA_CMD_VERB_SET_HDMI_CHAN_SLOT 0x734 + +#define HDA_CMD_GET_HDMI_CHAN_SLOT(cad, nid) \ + (HDA_CMD_12BIT((cad), (nid), \ + HDA_CMD_VERB_GET_HDMI_CHAN_SLOT, 0x0)) +#define HDA_CMD_SET_HDMI_CHAN_SLOT(cad, nid, payload) \ + (HDA_CMD_12BIT((cad), (nid), \ + HDA_CMD_VERB_SET_HDMI_CHAN_SLOT, (payload))) + /* Function Reset */ #define HDA_CMD_VERB_FUNCTION_RESET 0x7ff @@ -779,6 +815,10 @@ #define HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_SHIFT 20 #define HDA_PARAM_AUDIO_WIDGET_CAP_DELAY_MASK 0x000f0000 #define HDA_PARAM_AUDIO_WIDGET_CAP_DELAY_SHIFT 16 +#define HDA_PARAM_AUDIO_WIDGET_CAP_CC_EXT_MASK 0x0000e000 +#define HDA_PARAM_AUDIO_WIDGET_CAP_CC_EXT_SHIFT 13 +#define HDA_PARAM_AUDIO_WIDGET_CAP_CP_MASK 0x00001000 +#define HDA_PARAM_AUDIO_WIDGET_CAP_CP_SHIFT 12 #define HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP_MASK 0x00000800 #define HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP_SHIFT 11 #define HDA_PARAM_AUDIO_WIDGET_CAP_POWER_CTRL_MASK 0x00000400 @@ -810,6 +850,14 @@ #define HDA_PARAM_AUDIO_WIDGET_CAP_DELAY(param) \ (((param) & HDA_PARAM_AUDIO_WIDGET_CAP_DELAY_MASK) >> \ HDA_PARAM_AUDIO_WIDGET_CAP_DELAY_SHIFT) +#define HDA_PARAM_AUDIO_WIDGET_CAP_CC(param) \ + ((((param) & HDA_PARAM_AUDIO_WIDGET_CAP_CC_EXT_MASK) >> \ + (HDA_PARAM_AUDIO_WIDGET_CAP_CC_EXT_SHIFT - 1)) | \ + (((param) & HDA_PARAM_AUDIO_WIDGET_CAP_STEREO_MASK) >> \ + HDA_PARAM_AUDIO_WIDGET_CAP_STEREO_SHIFT)) +#define HDA_PARAM_AUDIO_WIDGET_CAP_CP(param) \ + (((param) & HDA_PARAM_AUDIO_WIDGET_CAP_CP_MASK) >> \ + HDA_PARAM_AUDIO_WIDGET_CAP_CP_SHIFT) #define HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP(param) \ (((param) & HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP_MASK) >> \ HDA_PARAM_AUDIO_WIDGET_CAP_LR_SWAP_SHIFT) @@ -971,6 +1019,10 @@ /* Pin Capabilities */ #define HDA_PARAM_PIN_CAP 0x0c +#define HDA_PARAM_PIN_CAP_HBR_MASK 0x08000000 +#define HDA_PARAM_PIN_CAP_HBR_SHIFT 27 +#define HDA_PARAM_PIN_CAP_DP_MASK 0x01000000 +#define HDA_PARAM_PIN_CAP_DP_SHIFT 24 #define HDA_PARAM_PIN_CAP_EAPD_CAP_MASK 0x00010000 #define HDA_PARAM_PIN_CAP_EAPD_CAP_SHIFT 16 #define HDA_PARAM_PIN_CAP_VREF_CTRL_MASK 0x0000ff00 @@ -985,6 +1037,8 @@ #define HDA_PARAM_PIN_CAP_VREF_CTRL_50_SHIFT 9 #define HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ_MASK 0x00000100 #define HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ_SHIFT 8 +#define HDA_PARAM_PIN_CAP_HDMI_MASK 0x00000080 +#define HDA_PARAM_PIN_CAP_HDMI_SHIFT 7 #define HDA_PARAM_PIN_CAP_BALANCED_IO_PINS_MASK 0x00000040 #define HDA_PARAM_PIN_CAP_BALANCED_IO_PINS_SHIFT 6 #define HDA_PARAM_PIN_CAP_INPUT_CAP_MASK 0x00000020 @@ -1000,6 +1054,12 @@ #define HDA_PARAM_PIN_CAP_IMP_SENSE_CAP_MASK 0x00000001 #define HDA_PARAM_PIN_CAP_IMP_SENSE_CAP_SHIFT 0 +#define HDA_PARAM_PIN_CAP_HBR(param) \ + (((param) & HDA_PARAM_PIN_CAP_HBR_MASK) >> \ + HDA_PARAM_PIN_CAP_HBR_SHIFT) +#define HDA_PARAM_PIN_CAP_DP(param) \ + (((param) & HDA_PARAM_PIN_CAP_DP_MASK) >> \ + HDA_PARAM_PIN_CAP_DP_SHIFT) #define HDA_PARAM_PIN_CAP_EAPD_CAP(param) \ (((param) & HDA_PARAM_PIN_CAP_EAPD_CAP_MASK) >> \ HDA_PARAM_PIN_CAP_EAPD_CAP_SHIFT) @@ -1021,6 +1081,9 @@ #define HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ(param) \ (((param) & HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ_MASK) >> \ HDA_PARAM_PIN_CAP_VREF_CTRL_HIZ_SHIFT) +#define HDA_PARAM_PIN_CAP_HDMI(param) \ + (((param) & HDA_PARAM_PIN_CAP_HDMI_MASK) >> \ + HDA_PARAM_PIN_CAP_HDMI_SHIFT) #define HDA_PARAM_PIN_CAP_BALANCED_IO_PINS(param) \ (((param) & HDA_PARAM_PIN_CAP_BALANCED_IO_PINS_MASK) >> \ HDA_PARAM_PIN_CAP_BALANCED_IO_PINS_SHIFT) diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c index 31988a95e5cd..068156866607 100644 --- a/sys/dev/sound/pci/hda/hdac.c +++ b/sys/dev/sound/pci/hda/hdac.c @@ -38,7 +38,6 @@ * 2) HDA Codecs support, which may include * - HDA * - Modem - * - HDMI * 3) Widget parser - the real magic of why this driver works on so * many hardwares with minimal vendor specific quirk. The original * parser was written using Ruby and can be found at @@ -87,7 +86,7 @@ #include "mixer_if.h" -#define HDA_DRV_TEST_REV "20090624_0136" +#define HDA_DRV_TEST_REV "20100226_0142" SND_DECLARE_FILE("$FreeBSD$"); @@ -316,6 +315,7 @@ SND_DECLARE_FILE("$FreeBSD$"); * (see HDA_CODEC_STAC9221 below). */ #define APPLE_INTEL_MAC 0x76808384 +#define APPLE_MACBOOKPRO55 0xcb7910de /* LG Electronics */ #define LG_VENDORID 0x1854 @@ -606,6 +606,12 @@ static const struct { #define HDA_CODEC_CONSTRUCT(vendor, id) \ (((uint32_t)(vendor##_VENDORID) << 16) | ((id) & 0xffff)) +/* Cirrus Logic */ +#define CIRRUSLOGIC_VENDORID 0x1013 +#define HDA_CODEC_CS4206 HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4206) +#define HDA_CODEC_CS4207 HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0x4207) +#define HDA_CODEC_CSXXXX HDA_CODEC_CONSTRUCT(CIRRUSLOGIC, 0xffff) + /* Realtek */ #define REALTEK_VENDORID 0x10ec #define HDA_CODEC_ALC260 HDA_CODEC_CONSTRUCT(REALTEK, 0x0260) @@ -623,6 +629,7 @@ static const struct { #define HDA_CODEC_ALC882 HDA_CODEC_CONSTRUCT(REALTEK, 0x0882) #define HDA_CODEC_ALC883 HDA_CODEC_CONSTRUCT(REALTEK, 0x0883) #define HDA_CODEC_ALC885 HDA_CODEC_CONSTRUCT(REALTEK, 0x0885) +#define HDA_CODEC_ALC887 HDA_CODEC_CONSTRUCT(REALTEK, 0x0887) #define HDA_CODEC_ALC888 HDA_CODEC_CONSTRUCT(REALTEK, 0x0888) #define HDA_CODEC_ALC889 HDA_CODEC_CONSTRUCT(REALTEK, 0x0889) #define HDA_CODEC_ALCXXXX HDA_CODEC_CONSTRUCT(REALTEK, 0xffff) @@ -677,7 +684,9 @@ static const struct { #define HDA_CODEC_IDT92HD700D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7639) #define HDA_CODEC_IDT92HD206X HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7645) #define HDA_CODEC_IDT92HD206D HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7646) +#define HDA_CODEC_CXD9872RDK HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7661) #define HDA_CODEC_STAC9872AK HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7662) +#define HDA_CODEC_CXD9872AKD HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7664) #define HDA_CODEC_STAC9221 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7680) #define HDA_CODEC_STAC922XD HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7681) #define HDA_CODEC_STAC9221_A2 HDA_CODEC_CONSTRUCT(SIGMATEL, 0x7682) @@ -725,6 +734,7 @@ static const struct { #define HDA_CODEC_CX20549 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5045) #define HDA_CODEC_CX20551 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5047) #define HDA_CODEC_CX20561 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5051) +#define HDA_CODEC_CX20582 HDA_CODEC_CONSTRUCT(CONEXANT, 0x5066) #define HDA_CODEC_CXXXXX HDA_CODEC_CONSTRUCT(CONEXANT, 0xffff) /* VIA */ @@ -764,6 +774,16 @@ static const struct { #define HDA_CODEC_VT1702_5 HDA_CODEC_CONSTRUCT(VIA, 0x5398) #define HDA_CODEC_VT1702_6 HDA_CODEC_CONSTRUCT(VIA, 0x6398) #define HDA_CODEC_VT1702_7 HDA_CODEC_CONSTRUCT(VIA, 0x7398) +#define HDA_CODEC_VT1716S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0433) +#define HDA_CODEC_VT1716S_1 HDA_CODEC_CONSTRUCT(VIA, 0xa721) +#define HDA_CODEC_VT1718S_0 HDA_CODEC_CONSTRUCT(VIA, 0x0428) +#define HDA_CODEC_VT1718S_1 HDA_CODEC_CONSTRUCT(VIA, 0x4428) +#define HDA_CODEC_VT1812 HDA_CODEC_CONSTRUCT(VIA, 0x0448) +#define HDA_CODEC_VT1818S HDA_CODEC_CONSTRUCT(VIA, 0x0440) +#define HDA_CODEC_VT1828S HDA_CODEC_CONSTRUCT(VIA, 0x4441) +#define HDA_CODEC_VT2002P_0 HDA_CODEC_CONSTRUCT(VIA, 0x0438) +#define HDA_CODEC_VT2002P_1 HDA_CODEC_CONSTRUCT(VIA, 0x4438) +#define HDA_CODEC_VT2020 HDA_CODEC_CONSTRUCT(VIA, 0x0441) #define HDA_CODEC_VTXXXX HDA_CODEC_CONSTRUCT(VIA, 0xffff) /* ATI */ @@ -786,6 +806,7 @@ static const struct { #define HDA_CODEC_INTELG45_2 HDA_CODEC_CONSTRUCT(INTEL, 0x2802) #define HDA_CODEC_INTELG45_3 HDA_CODEC_CONSTRUCT(INTEL, 0x2803) #define HDA_CODEC_INTELG45_4 HDA_CODEC_CONSTRUCT(INTEL, 0x29fb) +#define HDA_CODEC_INTELQ57 HDA_CODEC_CONSTRUCT(INTEL, 0x0054) #define HDA_CODEC_INTELXXXX HDA_CODEC_CONSTRUCT(INTEL, 0xffff) /* Codecs */ @@ -793,6 +814,8 @@ static const struct { uint32_t id; char *name; } hdac_codecs[] = { + { HDA_CODEC_CS4206, "Cirrus Logic CS4206" }, + { HDA_CODEC_CS4207, "Cirrus Logic CS4207" }, { HDA_CODEC_ALC260, "Realtek ALC260" }, { HDA_CODEC_ALC262, "Realtek ALC262" }, { HDA_CODEC_ALC267, "Realtek ALC267" }, @@ -808,6 +831,7 @@ static const struct { { HDA_CODEC_ALC882, "Realtek ALC882" }, { HDA_CODEC_ALC883, "Realtek ALC883" }, { HDA_CODEC_ALC885, "Realtek ALC885" }, + { HDA_CODEC_ALC887, "Realtek ALC887" }, { HDA_CODEC_ALC888, "Realtek ALC888" }, { HDA_CODEC_ALC889, "Realtek ALC889" }, { HDA_CODEC_AD1882, "Analog Devices AD1882" }, @@ -826,6 +850,8 @@ static const struct { { HDA_CODEC_AD1988B, "Analog Devices AD1988B" }, { HDA_CODEC_AD1989B, "Analog Devices AD1989B" }, { HDA_CODEC_CMI9880, "CMedia CMI9880" }, + { HDA_CODEC_CXD9872RDK, "Sigmatel CXD9872RD/K" }, + { HDA_CODEC_CXD9872AKD, "Sigmatel CXD9872AKD" }, { HDA_CODEC_STAC9200D, "Sigmatel STAC9200D" }, { HDA_CODEC_STAC9204X, "Sigmatel STAC9204X" }, { HDA_CODEC_STAC9204D, "Sigmatel STAC9204D" }, @@ -880,6 +906,7 @@ static const struct { { HDA_CODEC_CX20549, "Conexant CX20549 (Venice)" }, { HDA_CODEC_CX20551, "Conexant CX20551 (Waikiki)" }, { HDA_CODEC_CX20561, "Conexant CX20561 (Hermosa)" }, + { HDA_CODEC_CX20582, "Conexant CX20582 (Pebble)" }, { HDA_CODEC_VT1708_8, "VIA VT1708_8" }, { HDA_CODEC_VT1708_9, "VIA VT1708_9" }, { HDA_CODEC_VT1708_A, "VIA VT1708_A" }, @@ -916,6 +943,16 @@ static const struct { { HDA_CODEC_VT1702_5, "VIA VT1702_5" }, { HDA_CODEC_VT1702_6, "VIA VT1702_6" }, { HDA_CODEC_VT1702_7, "VIA VT1702_7" }, + { HDA_CODEC_VT1716S_0, "VIA VT1716S_0" }, + { HDA_CODEC_VT1716S_1, "VIA VT1716S_1" }, + { HDA_CODEC_VT1718S_0, "VIA VT1718S_0" }, + { HDA_CODEC_VT1718S_1, "VIA VT1718S_1" }, + { HDA_CODEC_VT1812, "VIA VT1812" }, + { HDA_CODEC_VT1818S, "VIA VT1818S" }, + { HDA_CODEC_VT1828S, "VIA VT1828S" }, + { HDA_CODEC_VT2002P_0, "VIA VT2002P_0" }, + { HDA_CODEC_VT2002P_1, "VIA VT2002P_1" }, + { HDA_CODEC_VT2020, "VIA VT2020" }, { HDA_CODEC_ATIRS600_1,"ATI RS600 HDMI" }, { HDA_CODEC_ATIRS600_2,"ATI RS600 HDMI" }, { HDA_CODEC_ATIRS690, "ATI RS690/780 HDMI" }, @@ -929,11 +966,13 @@ static const struct { { HDA_CODEC_INTELG45_2, "Intel G45 HDMI" }, { HDA_CODEC_INTELG45_3, "Intel G45 HDMI" }, { HDA_CODEC_INTELG45_4, "Intel G45 HDMI" }, + { HDA_CODEC_INTELQ57, "Intel Q57 HDMI" }, { HDA_CODEC_SII1390, "Silicon Image SiI1390 HDMI" }, { HDA_CODEC_SII1392, "Silicon Image SiI1392 HDMI" }, /* Unknown codec */ { HDA_CODEC_ALCXXXX, "Realtek (Unknown)" }, { HDA_CODEC_ADXXXX, "Analog Devices (Unknown)" }, + { HDA_CODEC_CSXXXX, "Cirrus Logic (Unknown)" }, { HDA_CODEC_CMIXXXX, "CMedia (Unknown)" }, { HDA_CODEC_STACXXXX, "Sigmatel (Unknown)" }, { HDA_CODEC_SIIXXXX, "Silicon Image (Unknown)" }, @@ -3416,7 +3455,11 @@ hdac_stream_setup(struct hdac_chan *ch) int i, chn, totalchn, c; nid_t cad = ch->devinfo->codec->cad; uint16_t fmt, dfmt; + uint16_t chmap[2][5] = {{ 0x0010, 0x0001, 0x0201, 0x0231, 0x0231 }, /* 5.1 */ + { 0x0010, 0x0001, 0x2001, 0x2031, 0x2431 }};/* 7.1 */ + int map = -1; + totalchn = AFMT_CHANNEL(ch->fmt); HDA_BOOTHVERBOSE( device_printf(ch->pdevinfo->dev, "PCMDIR_%s: Stream setup fmt=%08x speed=%d\n", @@ -3430,7 +3473,6 @@ hdac_stream_setup(struct hdac_chan *ch) fmt |= ch->bit32 << 4; else fmt |= 1 << 4; - for (i = 0; i < HDA_RATE_TAB_LEN; i++) { if (hda_rate_tab[i].valid && ch->spd == hda_rate_tab[i].rate) { fmt |= hda_rate_tab[i].base; @@ -3439,10 +3481,13 @@ hdac_stream_setup(struct hdac_chan *ch) break; } } + fmt |= (totalchn - 1); - totalchn = AFMT_CHANNEL(ch->fmt); - if (totalchn > 1) - fmt |= 1; + /* Set channel mapping for known speaker setups. */ + if (as->pinset == 0x0007 || as->pinset == 0x0013) /* Standard 5.1 */ + map = 0; + else if (as->pinset == 0x0017) /* Standard 7.1 */ + map = 1; HDAC_WRITE_2(&sc->mem, ch->off + HDAC_SDFMT, fmt); @@ -3456,14 +3501,26 @@ hdac_stream_setup(struct hdac_chan *ch) if (w == NULL) continue; - if (as->hpredir >= 0 && i == as->pincnt) - chn = 0; + /* If HP redirection is enabled, but failed to use same + DAC, make last DAC to duplicate first one. */ + if (as->fakeredir && i == (as->pincnt - 1)) { + c = (ch->sid << 4); + } else { + if (map >= 0) /* Map known speaker setups. */ + chn = (((chmap[map][totalchn / 2] >> i * 4) & + 0xf) - 1) * 2; + if (chn < 0 || chn >= totalchn) { + c = 0; + } else { + c = (ch->sid << 4) | chn; + } + } HDA_BOOTHVERBOSE( device_printf(ch->pdevinfo->dev, "PCMDIR_%s: Stream setup nid=%d: " - "fmt=0x%04x, dfmt=0x%04x\n", + "fmt=0x%04x, dfmt=0x%04x, chan=0x%04x\n", (ch->dir == PCMDIR_PLAY) ? "PLAY" : "REC", - ch->io[i], fmt, dfmt); + ch->io[i], fmt, dfmt, c); ); hdac_command(sc, HDA_CMD_SET_CONV_FMT(cad, ch->io[i], fmt), cad); @@ -3472,25 +3529,46 @@ hdac_stream_setup(struct hdac_chan *ch) HDA_CMD_SET_DIGITAL_CONV_FMT1(cad, ch->io[i], dfmt), cad); } - /* If HP redirection is enabled, but failed to use same - DAC make last DAC one to duplicate first one. */ - if (as->hpredir >= 0 && i == as->pincnt) { - c = (ch->sid << 4); - } else if (chn >= totalchn) { - /* This is until OSS will support multichannel. - Should be: c = 0; to disable unused DAC */ - c = (ch->sid << 4); - }else { - c = (ch->sid << 4) | chn; - } hdac_command(sc, HDA_CMD_SET_CONV_STREAM_CHAN(cad, ch->io[i], c), cad); - chn += - HDA_PARAM_AUDIO_WIDGET_CAP_STEREO(w->param.widget_cap) ? - 2 : 1; +#if 0 + hdac_command(sc, + HDA_CMD_SET_CONV_CHAN_COUNT(cad, ch->io[i], 1), cad); + hdac_command(sc, + HDA_CMD_SET_HDMI_CHAN_SLOT(cad, ch->io[i], 0x00), cad); + hdac_command(sc, + HDA_CMD_SET_HDMI_CHAN_SLOT(cad, ch->io[i], 0x11), cad); +#endif + chn += HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) + 1; } } +/* + * Greatest Common Divisor. + */ +static unsigned +gcd(unsigned a, unsigned b) +{ + u_int c; + + while (b != 0) { + c = a; + a = b; + b = (c % b); + } + return (a); +} + +/* + * Least Common Multiple. + */ +static unsigned +lcm(unsigned a, unsigned b) +{ + + return ((a * b) / gcd(a, b)); +} + static int hdac_channel_setfragments(kobj_t obj, void *data, uint32_t blksz, uint32_t blkcnt) @@ -3498,7 +3576,7 @@ hdac_channel_setfragments(kobj_t obj, void *data, struct hdac_chan *ch = data; struct hdac_softc *sc = ch->devinfo->codec->sc; - blksz &= HDA_BLK_ALIGN; + blksz -= blksz % lcm(HDAC_DMA_ALIGNMENT, sndbuf_getalign(ch->b)); if (blksz > (sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN)) blksz = sndbuf_getmaxsize(ch->b) / HDA_BDL_MIN; @@ -3856,8 +3934,8 @@ hdac_audio_ctl_ossmixer_set(struct snd_mixer *m, unsigned dev, rvol = rvol * pdevinfo->right[j] / 100; } } - mute = (left == 0) ? HDA_AMP_MUTE_LEFT : 0; - mute |= (right == 0) ? HDA_AMP_MUTE_RIGHT : 0; + mute = (lvol == 0) ? HDA_AMP_MUTE_LEFT : 0; + mute |= (rvol == 0) ? HDA_AMP_MUTE_RIGHT : 0; lvol = (lvol * ctl->step + 50) / 100; rvol = (rvol * ctl->step + 50) / 100; hdac_audio_ctl_amp_set(ctl, mute, lvol, rvol); @@ -4492,7 +4570,7 @@ hdac_audio_as_parse(struct hdac_devinfo *devinfo) for (i = 0; i < max; i++) { as[i].hpredir = -1; as[i].chan = -1; - as[i].digital = 1; + as[i].digital = 0; } /* Scan associations skipping as=0. */ @@ -4547,8 +4625,14 @@ hdac_audio_as_parse(struct hdac_devinfo *devinfo) __func__, w->nid, j); as[cnt].enable = 0; } - if (!HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) - as[cnt].digital = 0; + if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) { + if (HDA_PARAM_PIN_CAP_DP(w->wclass.pin.cap)) + as[cnt].digital = 3; + else if (HDA_PARAM_PIN_CAP_HDMI(w->wclass.pin.cap)) + as[cnt].digital = 2; + else + as[cnt].digital = 1; + } /* Headphones with seq=15 may mean redirection. */ if (type == HDA_CONFIG_DEFAULTCONF_DEVICE_HP_OUT && seq == 15) @@ -4630,6 +4714,8 @@ static const struct { HDA_QUIRK_GPIO0 | HDA_QUIRK_OVREF50, 0}, { APPLE_INTEL_MAC, HDA_CODEC_STAC9221, HDA_QUIRK_GPIO0 | HDA_QUIRK_GPIO1, 0 }, + { APPLE_MACBOOKPRO55, HDA_CODEC_CS4206, + HDA_QUIRK_GPIO1 | HDA_QUIRK_GPIO3, 0 }, { DELL_D630_SUBVENDOR, HDA_CODEC_STAC9205X, HDA_QUIRK_GPIO0, 0 }, { DELL_V1400_SUBVENDOR, HDA_CODEC_STAC9228X, @@ -4671,37 +4757,6 @@ hdac_vendor_patch_parse(struct hdac_devinfo *devinfo) } switch (id) { -#if 0 - case HDA_CODEC_ALC883: - /* - * nid: 24/25 = External (jack) or Internal (fixed) Mic. - * Clear vref cap for jack connectivity. - */ - w = hdac_widget_get(devinfo, 24); - if (w != NULL && w->enable != 0 && w->type == - HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && - (w->wclass.pin.config & - HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) == - HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK) - w->wclass.pin.cap &= ~( - HDA_PARAM_PIN_CAP_VREF_CTRL_100_MASK | - HDA_PARAM_PIN_CAP_VREF_CTRL_80_MASK | - HDA_PARAM_PIN_CAP_VREF_CTRL_50_MASK); - w = hdac_widget_get(devinfo, 25); - if (w != NULL && w->enable != 0 && w->type == - HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && - (w->wclass.pin.config & - HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_MASK) == - HDA_CONFIG_DEFAULTCONF_CONNECTIVITY_JACK) - w->wclass.pin.cap &= ~( - HDA_PARAM_PIN_CAP_VREF_CTRL_100_MASK | - HDA_PARAM_PIN_CAP_VREF_CTRL_80_MASK | - HDA_PARAM_PIN_CAP_VREF_CTRL_50_MASK); - /* - * nid: 26 = Line-in, leave it alone. - */ - break; -#endif case HDA_CODEC_AD1983: /* * This codec has several possible usages, but none @@ -4814,10 +4869,19 @@ hdac_vendor_patch_parse(struct hdac_devinfo *devinfo) w = hdac_widget_get(devinfo, 31); if (w != NULL) w->enable = 0; - /* Disable playback mixer, use direct bypass. */ - w = hdac_widget_get(devinfo, 14); + /* Disable direct playback, use mixer. */ + w = hdac_widget_get(devinfo, 5); if (w != NULL) - w->enable = 0; + w->connsenable[0] = 0; + w = hdac_widget_get(devinfo, 6); + if (w != NULL) + w->connsenable[0] = 0; + w = hdac_widget_get(devinfo, 9); + if (w != NULL) + w->connsenable[0] = 0; + w = hdac_widget_get(devinfo, 24); + if (w != NULL) + w->connsenable[0] = 0; break; } } @@ -5193,6 +5257,8 @@ hdac_audio_trace_to_out(struct hdac_devinfo *devinfo, nid_t nid, int depth) " %*snid %d found output association %d\n", depth + 1, "", w->nid, w->bindas); ); + if (w->bindas >= 0) + w->pflags |= HDA_ADC_MONITOR; return (1); } else { HDA_BOOTHVERBOSE( @@ -5235,7 +5301,7 @@ hdac_audio_trace_to_out(struct hdac_devinfo *devinfo, nid_t nid, int depth) } break; } - if (res) + if (res && w->bindas == -1) w->bindas = -2; HDA_BOOTHVERBOSE( @@ -5282,11 +5348,39 @@ hdac_audio_trace_as_extra(struct hdac_devinfo *devinfo) " nid %d is input monitor\n", w->nid); ); - w->pflags |= HDA_ADC_MONITOR; w->ossdev = SOUND_MIXER_IMIX; } } + /* Other inputs monitor */ + /* Find input pins supplying signal for output associations. + Hope it will be input monitoring. */ + HDA_BOOTVERBOSE( + device_printf(devinfo->codec->sc->dev, + "Tracing other input monitors\n"); + ); + for (j = devinfo->startnode; j < devinfo->endnode; j++) { + w = hdac_widget_get(devinfo, j); + if (w == NULL || w->enable == 0) + continue; + if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) + continue; + if (w->bindas < 0 || as[w->bindas].dir != HDA_CTL_IN) + continue; + HDA_BOOTVERBOSE( + device_printf(devinfo->codec->sc->dev, + " Tracing nid %d to out\n", + j); + ); + if (hdac_audio_trace_to_out(devinfo, w->nid, 0)) { + HDA_BOOTVERBOSE( + device_printf(devinfo->codec->sc->dev, + " nid %d is input monitor\n", + w->nid); + ); + } + } + /* Beeper */ HDA_BOOTVERBOSE( device_printf(devinfo->codec->sc->dev, @@ -5662,6 +5756,7 @@ hdac_audio_disable_notselected(struct hdac_devinfo *devinfo) static void hdac_audio_disable_crossas(struct hdac_devinfo *devinfo) { + struct hdac_audio_as *ases = devinfo->function.audio.as; struct hdac_widget *w, *cw; struct hdac_audio_ctl *ctl; int i, j; @@ -5684,7 +5779,10 @@ hdac_audio_disable_crossas(struct hdac_devinfo *devinfo) cw = hdac_widget_get(devinfo, w->conns[j]); if (cw == NULL || w->enable == 0) continue; - if (cw->bindas == -2) + if (cw->bindas == -2 || + ((w->pflags & HDA_ADC_MONITOR) && + cw->bindas >= 0 && + ases[cw->bindas].dir == HDA_CTL_IN)) continue; if (w->bindas == cw->bindas && (w->bindseqmask & cw->bindseqmask) != 0) @@ -5703,8 +5801,12 @@ hdac_audio_disable_crossas(struct hdac_devinfo *devinfo) while ((ctl = hdac_audio_ctl_each(devinfo, &i)) != NULL) { if (ctl->enable == 0 || ctl->childwidget == NULL) continue; - if (ctl->widget->bindas == -2 || - ctl->childwidget->bindas == -2) + if (ctl->widget->bindas == -2) + continue; + if (ctl->childwidget->bindas == -2 || + ((ctl->widget->pflags & HDA_ADC_MONITOR) && + ctl->childwidget->bindas >= 0 && + ases[ctl->childwidget->bindas].dir == HDA_CTL_IN)) continue; if (ctl->widget->bindas != ctl->childwidget->bindas || (ctl->widget->bindseqmask & ctl->childwidget->bindseqmask) == 0) { @@ -5823,7 +5925,7 @@ hdac_audio_ctl_source_amp(struct hdac_devinfo *devinfo, nid_t nid, int index, * Find controls to control amplification for destination. */ static void -hdac_audio_ctl_dest_amp(struct hdac_devinfo *devinfo, nid_t nid, +hdac_audio_ctl_dest_amp(struct hdac_devinfo *devinfo, nid_t nid, int index, int ossdev, int depth, int need) { struct hdac_audio_as *as = devinfo->function.audio.as; @@ -5882,6 +5984,8 @@ hdac_audio_ctl_dest_amp(struct hdac_devinfo *devinfo, nid_t nid, int tneed = need; if (w->connsenable[i] == 0) continue; + if (index >= 0 && i != index) + continue; ctl = hdac_audio_ctl_amp_get(devinfo, w->nid, HDA_CTL_IN, i, 1); if (ctl) { @@ -5891,7 +5995,7 @@ hdac_audio_ctl_dest_amp(struct hdac_devinfo *devinfo, nid_t nid, ctl->possmask |= (1 << ossdev); tneed &= ~HDA_CTL_GIVE(ctl); } - hdac_audio_ctl_dest_amp(devinfo, w->conns[i], ossdev, + hdac_audio_ctl_dest_amp(devinfo, w->conns[i], -1, ossdev, depth + 1, tneed); } } @@ -6098,8 +6202,8 @@ hdac_audio_assign_mixers(struct hdac_devinfo *devinfo) { struct hdac_audio_as *as = devinfo->function.audio.as; struct hdac_audio_ctl *ctl; - struct hdac_widget *w; - int i; + struct hdac_widget *w, *cw; + int i, j; /* Assign mixers to the tree. */ for (i = devinfo->startnode; i < devinfo->endnode; i++) { @@ -6114,23 +6218,38 @@ hdac_audio_assign_mixers(struct hdac_devinfo *devinfo) continue; hdac_audio_ctl_source_amp(devinfo, w->nid, -1, w->ossdev, 1, 0, 1); - } else if ((w->pflags & HDA_ADC_MONITOR) != 0) { - if (w->ossdev < 0) - continue; + } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { + hdac_audio_ctl_dest_amp(devinfo, w->nid, -1, + SOUND_MIXER_RECLEV, 0, 1); + } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && + as[w->bindas].dir == HDA_CTL_OUT) { + hdac_audio_ctl_dest_amp(devinfo, w->nid, -1, + SOUND_MIXER_VOLUME, 0, 1); + } + if (w->ossdev == SOUND_MIXER_IMIX) { if (hdac_audio_ctl_source_amp(devinfo, w->nid, -1, w->ossdev, 1, 0, 1)) { /* If we are unable to control input monitor as source - try to control it as destination. */ - hdac_audio_ctl_dest_amp(devinfo, w->nid, + hdac_audio_ctl_dest_amp(devinfo, w->nid, -1, w->ossdev, 0, 1); } - } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_AUDIO_INPUT) { - hdac_audio_ctl_dest_amp(devinfo, w->nid, - SOUND_MIXER_RECLEV, 0, 1); - } else if (w->type == HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX && - as[w->bindas].dir == HDA_CTL_OUT) { - hdac_audio_ctl_dest_amp(devinfo, w->nid, - SOUND_MIXER_VOLUME, 0, 1); + } + if (w->pflags & HDA_ADC_MONITOR) { + for (j = 0; j < w->nconns; j++) { + if (!w->connsenable[j]) + continue; + cw = hdac_widget_get(devinfo, w->conns[j]); + if (cw == NULL || cw->enable == 0) + continue; + if (cw->bindas == -1) + continue; + if (cw->bindas >= 0 && + as[cw->bindas].dir != HDA_CTL_IN) + continue; + hdac_audio_ctl_dest_amp(devinfo, + w->nid, j, SOUND_MIXER_IGAIN, 0, 1); + } } } /* Treat unrequired as possible. */ @@ -6381,7 +6500,8 @@ hdac_pcmchannel_setup(struct hdac_chan *ch) struct hdac_audio_as *as = devinfo->function.audio.as; struct hdac_widget *w; uint32_t cap, fmtcap, pcmcap; - int i, j, ret, max; + int i, j, ret, channels, onlystereo; + uint16_t pinset; ch->caps = hdac_caps; ch->caps.fmtlist = ch->fmtlist; @@ -6391,11 +6511,13 @@ hdac_pcmchannel_setup(struct hdac_chan *ch) ch->pcmrates[1] = 0; ret = 0; + channels = 0; + onlystereo = 1; + pinset = 0; fmtcap = devinfo->function.audio.supp_stream_formats; pcmcap = devinfo->function.audio.supp_pcm_size_rate; - max = (sizeof(ch->io) / sizeof(ch->io[0])) - 1; - for (i = 0; i < 16 && ret < max; i++) { + for (i = 0; i < 16; i++) { /* Check as is correct */ if (ch->as < 0) break; @@ -6413,15 +6535,11 @@ hdac_pcmchannel_setup(struct hdac_chan *ch) w = hdac_widget_get(devinfo, as[ch->as].dacs[i]); if (w == NULL || w->enable == 0) continue; - if (!HDA_PARAM_AUDIO_WIDGET_CAP_STEREO(w->param.widget_cap)) - continue; cap = w->param.supp_stream_formats; - /*if (HDA_PARAM_SUPP_STREAM_FORMATS_FLOAT32(cap)) { - }*/ if (!HDA_PARAM_SUPP_STREAM_FORMATS_PCM(cap) && !HDA_PARAM_SUPP_STREAM_FORMATS_AC3(cap)) continue; - /* Many codec does not declare AC3 support on SPDIF. + /* Many CODECs does not declare AC3 support on SPDIF. I don't beleave that they doesn't support it! */ if (HDA_PARAM_AUDIO_WIDGET_CAP_DIGITAL(w->param.widget_cap)) cap |= HDA_PARAM_SUPP_STREAM_FORMATS_AC3_MASK; @@ -6433,9 +6551,24 @@ hdac_pcmchannel_setup(struct hdac_chan *ch) pcmcap &= w->param.supp_pcm_size_rate; } ch->io[ret++] = as[ch->as].dacs[i]; + /* Do not count redirection pin/dac channels. */ + if (i == 15 && as[ch->as].hpredir >= 0) + continue; + channels += HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) + 1; + if (HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap) != 1) + onlystereo = 0; + pinset |= (1 << i); } ch->io[ret] = -1; + if (as[ch->as].fakeredir) + ret--; + /* Standard speaks only about stereo pins and playback, ... */ + if ((!onlystereo) || as[ch->as].dir != HDA_CTL_OUT) + pinset = 0; + /* ..., but there it gives us info about speakers layout. */ + as[ch->as].pinset = pinset; + ch->supp_stream_formats = fmtcap; ch->supp_pcm_size_rate = pcmcap; @@ -6459,17 +6592,34 @@ hdac_pcmchannel_setup(struct hdac_chan *ch) ch->bit32 = 3; else if (HDA_PARAM_SUPP_PCM_SIZE_RATE_20BIT(pcmcap)) ch->bit32 = 2; - if (!(devinfo->function.audio.quirks & HDA_QUIRK_FORCESTEREO)) - ch->fmtlist[i++] = - SND_FORMAT(AFMT_S16_LE, 1, 0); - ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 2, 0); - if (ch->bit32 > 0) { - if (!(devinfo->function.audio.quirks & - HDA_QUIRK_FORCESTEREO)) - ch->fmtlist[i++] = - SND_FORMAT(AFMT_S32_LE, 1, 0); - ch->fmtlist[i++] = - SND_FORMAT(AFMT_S32_LE, 2, 0); + if (!(devinfo->function.audio.quirks & HDA_QUIRK_FORCESTEREO)) { + ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 1, 0); + if (ch->bit32) + ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 1, 0); + } + if (channels >= 2) { + ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 2, 0); + if (ch->bit32) + ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 2, 0); + } + if (channels == 4 || /* Any 4-channel */ + pinset == 0x0007 || /* 5.1 */ + pinset == 0x0013 || /* 5.1 */ + pinset == 0x0017) { /* 7.1 */ + ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 4, 0); + if (ch->bit32) + ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 4, 0); + } + if (channels == 6 || /* Any 6-channel */ + pinset == 0x0017) { /* 7.1 */ + ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 6, 1); + if (ch->bit32) + ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 6, 1); + } + if (channels == 8) { /* Any 8-channel */ + ch->fmtlist[i++] = SND_FORMAT(AFMT_S16_LE, 8, 1); + if (ch->bit32) + ch->fmtlist[i++] = SND_FORMAT(AFMT_S32_LE, 8, 1); } } if (HDA_PARAM_SUPP_STREAM_FORMATS_AC3(fmtcap)) { @@ -6548,15 +6698,15 @@ hdac_create_pcms(struct hdac_devinfo *devinfo) devinfo->function.audio.devs[i].devinfo = devinfo; devinfo->function.audio.devs[i].play = -1; devinfo->function.audio.devs[i].rec = -1; - devinfo->function.audio.devs[i].digital = 2; + devinfo->function.audio.devs[i].digital = 255; } for (i = 0; i < devinfo->function.audio.ascnt; i++) { if (as[i].enable == 0) continue; for (j = 0; j < devinfo->function.audio.num_devs; j++) { - if (devinfo->function.audio.devs[j].digital != 2 && - devinfo->function.audio.devs[j].digital != - as[i].digital) + if (devinfo->function.audio.devs[j].digital != 255 && + (!devinfo->function.audio.devs[j].digital) != + (!as[i].digital)) continue; if (as[i].dir == HDA_CTL_IN) { if (devinfo->function.audio.devs[j].rec >= 0) @@ -6598,8 +6748,8 @@ hdac_dump_ctls(struct hdac_pcm_devinfo *pdevinfo, const char *banner, uint32_t f if (flag == 0) { flag = ~(SOUND_MASK_VOLUME | SOUND_MASK_PCM | SOUND_MASK_CD | SOUND_MASK_LINE | SOUND_MASK_RECLEV | - SOUND_MASK_MIC | SOUND_MASK_SPEAKER | SOUND_MASK_OGAIN | - SOUND_MASK_IMIX | SOUND_MASK_MONITOR); + SOUND_MASK_MIC | SOUND_MASK_SPEAKER | SOUND_MASK_IGAIN | + SOUND_MASK_OGAIN | SOUND_MASK_IMIX | SOUND_MASK_MONITOR); } for (j = 0; j < SOUND_MIXER_NRDEVICES; j++) { @@ -6732,6 +6882,8 @@ hdac_dump_pin(struct hdac_softc *sc, struct hdac_widget *w) printf(" IN"); if (HDA_PARAM_PIN_CAP_BALANCED_IO_PINS(pincap)) printf(" BAL"); + if (HDA_PARAM_PIN_CAP_HDMI(pincap)) + printf(" HDMI"); if (HDA_PARAM_PIN_CAP_VREF_CTRL(pincap)) { printf(" VREF["); if (HDA_PARAM_PIN_CAP_VREF_CTRL_50(pincap)) @@ -6748,6 +6900,10 @@ hdac_dump_pin(struct hdac_softc *sc, struct hdac_widget *w) } if (HDA_PARAM_PIN_CAP_EAPD_CAP(pincap)) printf(" EAPD"); + if (HDA_PARAM_PIN_CAP_DP(pincap)) + printf(" DP"); + if (HDA_PARAM_PIN_CAP_HBR(pincap)) + printf(" HBR"); printf("\n"); device_printf(sc->dev, " Pin config: 0x%08x\n", w->wclass.pin.config); @@ -6855,8 +7011,11 @@ hdac_dump_nodes(struct hdac_devinfo *devinfo) printf(" PROC"); if (HDA_PARAM_AUDIO_WIDGET_CAP_STRIPE(w->param.widget_cap)) printf(" STRIPE"); - if (HDA_PARAM_AUDIO_WIDGET_CAP_STEREO(w->param.widget_cap)) + j = HDA_PARAM_AUDIO_WIDGET_CAP_CC(w->param.widget_cap); + if (j == 1) printf(" STEREO"); + else if (j > 1) + printf(" %dCH", j + 1); printf("\n"); } if (w->bindas != -1) { @@ -6965,27 +7124,27 @@ hdac_dump_dac(struct hdac_pcm_devinfo *pdevinfo) { struct hdac_devinfo *devinfo = pdevinfo->devinfo; struct hdac_softc *sc = devinfo->codec->sc; + struct hdac_audio_as *as; struct hdac_widget *w; int i, printed = 0; if (pdevinfo->play < 0) return; - for (i = devinfo->startnode; i < devinfo->endnode; i++) { - w = hdac_widget_get(devinfo, i); + as = &devinfo->function.audio.as[sc->chans[pdevinfo->play].as]; + for (i = 0; i < 16; i++) { + if (as->pins[i] <= 0) + continue; + w = hdac_widget_get(devinfo, as->pins[i]); if (w == NULL || w->enable == 0) continue; - if (w->type != HDA_PARAM_AUDIO_WIDGET_CAP_TYPE_PIN_COMPLEX) - continue; - if (w->bindas != sc->chans[pdevinfo->play].as) - continue; if (printed == 0) { printed = 1; device_printf(pdevinfo->dev, "\n"); device_printf(pdevinfo->dev, "Playback:\n"); } device_printf(pdevinfo->dev, "\n"); - hdac_dump_dst_nid(pdevinfo, i, 0); + hdac_dump_dst_nid(pdevinfo, as->pins[i], 0); } } @@ -7034,7 +7193,7 @@ hdac_dump_mix(struct hdac_pcm_devinfo *pdevinfo) w = hdac_widget_get(devinfo, i); if (w == NULL || w->enable == 0) continue; - if ((w->pflags & HDA_ADC_MONITOR) == 0) + if (w->ossdev != SOUND_MIXER_IMIX) continue; if (printed == 0) { printed = 1; @@ -7957,7 +8116,9 @@ hdac_pcm_probe(device_t dev) snprintf(buf, sizeof(buf), "HDA %s PCM #%d %s", hdac_codec_name(pdevinfo->devinfo->codec), pdevinfo->index, - pdevinfo->digital?"Digital":"Analog"); + (pdevinfo->digital == 3)?"DisplayPort": + ((pdevinfo->digital == 2)?"HDMI": + ((pdevinfo->digital)?"Digital":"Analog"))); device_set_desc_copy(dev, buf); return (0); } @@ -7999,6 +8160,7 @@ hdac_pcm_attach(device_t dev) hdac_dump_ctls(pdevinfo, "Speaker/Beep Volume", SOUND_MASK_SPEAKER); hdac_dump_ctls(pdevinfo, "Recording Level", SOUND_MASK_RECLEV); hdac_dump_ctls(pdevinfo, "Input Mix Level", SOUND_MASK_IMIX); + hdac_dump_ctls(pdevinfo, "Input Monitoring Level", SOUND_MASK_IGAIN); hdac_dump_ctls(pdevinfo, NULL, 0); device_printf(dev, "\n"); ); diff --git a/sys/dev/sound/pci/hda/hdac_private.h b/sys/dev/sound/pci/hda/hdac_private.h index 2369a9a8d1d9..24beed746436 100644 --- a/sys/dev/sound/pci/hda/hdac_private.h +++ b/sys/dev/sound/pci/hda/hdac_private.h @@ -221,6 +221,7 @@ struct hdac_audio_as { u_char pincnt; u_char fakeredir; u_char digital; + uint16_t pinset; nid_t hpredir; nid_t pins[16]; nid_t dacs[16]; @@ -281,7 +282,7 @@ struct hdac_chan { struct hdac_devinfo *devinfo; struct hdac_pcm_devinfo *pdevinfo; struct hdac_dma bdl_dma; - uint32_t spd, fmt, fmtlist[8], pcmrates[16]; + uint32_t spd, fmt, fmtlist[16], pcmrates[16]; uint32_t supp_stream_formats, supp_pcm_size_rate; uint32_t ptr, prevptr, blkcnt, blksz; uint32_t *dmapos; diff --git a/sys/dev/sound/pci/maestro3.c b/sys/dev/sound/pci/maestro3.c index 8a57c8ccf85e..51f9ee083cc0 100644 --- a/sys/dev/sound/pci/maestro3.c +++ b/sys/dev/sound/pci/maestro3.c @@ -353,7 +353,7 @@ m3_wrcd(kobj_t kobj, void *devinfo, int regno, u_int32_t data) struct sc_info *sc = (struct sc_info *)devinfo; if (m3_wait(sc)) { device_printf(sc->dev, "m3_wrcd timed out.\n"); - return -1;; + return -1; } m3_wr_2(sc, CODEC_DATA, data); m3_wr_1(sc, CODEC_COMMAND, regno & 0x7f); diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c index 42ea86faab43..ec7cb9802ac8 100644 --- a/sys/dev/sound/pcm/channel.c +++ b/sys/dev/sound/pcm/channel.c @@ -220,7 +220,7 @@ MTX_SYSINIT(pcm_syncgroup, &snd_pcm_syncgroups_mtx, "PCM channel sync group lock * * See SNDCTL_DSP_SYNCGROUP for more information. */ -struct pcm_synclist snd_pcm_syncgroups = SLIST_HEAD_INITIALIZER(head); +struct pcm_synclist snd_pcm_syncgroups = SLIST_HEAD_INITIALIZER(snd_pcm_syncgroups); static void chn_lockinit(struct pcm_channel *c, int dir) diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index 66faef13c15b..d0ebfad00710 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -1003,7 +1003,7 @@ dsp_ioctl_channel(struct cdev *dev, struct pcm_channel *volch, u_long cmd, if (volch != NULL && ((j == SOUND_MIXER_PCM && volch->direction == PCMDIR_PLAY) || (j == SOUND_MIXER_RECLEV && volch->direction == PCMDIR_REC))) { - if ((cmd & MIXER_WRITE(0)) == MIXER_WRITE(0)) { + if ((cmd & ~0xff) == MIXER_WRITE(0)) { int left, right, center; left = *(int *)arg & 0x7f; @@ -1011,7 +1011,7 @@ dsp_ioctl_channel(struct cdev *dev, struct pcm_channel *volch, u_long cmd, center = (left + right) >> 1; chn_setvolume_multi(volch, SND_VOL_C_PCM, left, right, center); - } else if ((cmd & MIXER_READ(0)) == MIXER_READ(0)) { + } else if ((cmd & ~0xff) == MIXER_READ(0)) { *(int *)arg = CHN_GETVOLUME(volch, SND_VOL_C_PCM, SND_CHN_T_FL); *(int *)arg |= CHN_GETVOLUME(volch, @@ -1023,7 +1023,7 @@ dsp_ioctl_channel(struct cdev *dev, struct pcm_channel *volch, u_long cmd, case SOUND_MIXER_DEVMASK: case SOUND_MIXER_CAPS: case SOUND_MIXER_STEREODEVS: - if ((cmd & MIXER_READ(0)) == MIXER_READ(0)) { + if ((cmd & ~0xff) == MIXER_READ(0)) { *(int *)arg = 0; if (rdch != NULL) *(int *)arg |= SOUND_MASK_RECLEV; @@ -1034,7 +1034,7 @@ dsp_ioctl_channel(struct cdev *dev, struct pcm_channel *volch, u_long cmd, break; case SOUND_MIXER_RECMASK: case SOUND_MIXER_RECSRC: - if ((cmd & MIXER_READ(0)) == MIXER_READ(0)) + if ((cmd & ~0xff) == MIXER_READ(0)) *(int *)arg = 0; ret = 0; break; @@ -1069,6 +1069,10 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, chn = NULL; if (IOCGROUP(cmd) == 'M') { + if (cmd == OSS_GETVERSION) { + *arg_i = SOUND_VERSION; + return (0); + } ret = dsp_ioctl_channel(i_dev, PCM_VOLCH(i_dev), cmd, arg); if (ret != -1) { PCM_GIANT_EXIT(d); @@ -2179,7 +2183,8 @@ dsp_poll(struct cdev *i_dev, int events, struct thread *td) } static int -dsp_mmap(struct cdev *i_dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +dsp_mmap(struct cdev *i_dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { struct snddev_info *d; struct pcm_channel *wrch, *rdch, *c; diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c index 2b8d6ce771c4..4c60c50d5c5d 100644 --- a/sys/dev/sound/pcm/mixer.c +++ b/sys/dev/sound/pcm/mixer.c @@ -87,7 +87,7 @@ static u_int16_t snd_mixerdefaults[SOUND_MIXER_NRDEVICES] = { [SOUND_MIXER_IGAIN] = 0, [SOUND_MIXER_LINE1] = 75, [SOUND_MIXER_VIDEO] = 75, - [SOUND_MIXER_RECLEV] = 0, + [SOUND_MIXER_RECLEV] = 75, [SOUND_MIXER_OGAIN] = 50, [SOUND_MIXER_MONITOR] = 75, }; @@ -352,7 +352,13 @@ mixer_setrecsrc(struct snd_mixer *mixer, u_int32_t src) dropmtx = 0; src &= mixer->recdevs; if (src == 0) - src = SOUND_MASK_MIC; + src = mixer->recdevs & SOUND_MASK_MIC; + if (src == 0) + src = mixer->recdevs & SOUND_MASK_MONITOR; + if (src == 0) + src = mixer->recdevs & SOUND_MASK_LINE; + if (src == 0 && mixer->recdevs != 0) + src = (1 << (ffs(mixer->recdevs) - 1)); /* It is safe to drop this mutex due to Giant. */ MIXER_SET_UNLOCK(mixer, dropmtx); recsrc = MIXER_SETRECSRC(mixer, src); @@ -716,7 +722,7 @@ mixer_init(device_t dev, kobj_class_t cls, void *devinfo) mixer_set(m, i, v | (v << 8)); } - mixer_setrecsrc(m, SOUND_MASK_MIC); + mixer_setrecsrc(m, 0); /* Set default input. */ unit = device_get_unit(dev); devunit = snd_mkunit(unit, SND_DEV_CTL, 0); @@ -1130,7 +1136,7 @@ mixer_ioctl_channel(struct cdev *dev, u_long cmd, caddr_t arg, int mode, if ((j == SOUND_MIXER_DEVMASK || j == SOUND_MIXER_CAPS || j == SOUND_MIXER_STEREODEVS) && - (cmd & MIXER_READ(0)) == MIXER_READ(0)) { + (cmd & ~0xff) == MIXER_READ(0)) { snd_mtxlock(m->lock); *(int *)arg = mix_getdevs(m); snd_mtxunlock(m->lock); @@ -1148,14 +1154,14 @@ mixer_ioctl_channel_proc: KASSERT(c != NULL, ("%s(): NULL channel", __func__)); CHN_LOCKASSERT(c); - if ((cmd & MIXER_WRITE(0)) == MIXER_WRITE(0)) { + if ((cmd & ~0xff) == MIXER_WRITE(0)) { int left, right, center; left = *(int *)arg & 0x7f; right = (*(int *)arg >> 8) & 0x7f; center = (left + right) >> 1; chn_setvolume_multi(c, SND_VOL_C_PCM, left, right, center); - } else if ((cmd & MIXER_READ(0)) == MIXER_READ(0)) { + } else if ((cmd & ~0xff) == MIXER_READ(0)) { *(int *)arg = CHN_GETVOLUME(c, SND_VOL_C_PCM, SND_CHN_T_FL); *(int *)arg |= CHN_GETVOLUME(c, SND_VOL_C_PCM, SND_CHN_T_FR) << 8; @@ -1208,7 +1214,7 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td, int from) { struct snd_mixer *m; - int ret, *arg_i = (int *)arg; + int ret = EINVAL, *arg_i = (int *)arg; int v = -1, j = cmd & 0xff; /* @@ -1242,8 +1248,23 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, snd_mtxunlock(m->lock); return (EBADF); } - - if ((cmd & MIXER_WRITE(0)) == MIXER_WRITE(0)) { + switch (cmd) { + case SNDCTL_DSP_GET_RECSRC_NAMES: + bcopy((void *)&m->enuminfo, arg, sizeof(oss_mixer_enuminfo)); + ret = 0; + goto done; + case SNDCTL_DSP_GET_RECSRC: + ret = mixer_get_recroute(m, arg_i); + goto done; + case SNDCTL_DSP_SET_RECSRC: + ret = mixer_set_recroute(m, *arg_i); + goto done; + case OSS_GETVERSION: + *arg_i = SOUND_VERSION; + ret = 0; + goto done; + } + if ((cmd & ~0xff) == MIXER_WRITE(0)) { if (j == SOUND_MIXER_RECSRC) ret = mixer_setrecsrc(m, *arg_i); else @@ -1251,23 +1272,19 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, snd_mtxunlock(m->lock); return ((ret == 0) ? 0 : ENXIO); } - - if ((cmd & MIXER_READ(0)) == MIXER_READ(0)) { + if ((cmd & ~0xff) == MIXER_READ(0)) { switch (j) { - case SOUND_MIXER_DEVMASK: - case SOUND_MIXER_CAPS: - case SOUND_MIXER_STEREODEVS: + case SOUND_MIXER_DEVMASK: + case SOUND_MIXER_CAPS: + case SOUND_MIXER_STEREODEVS: v = mix_getdevs(m); break; - - case SOUND_MIXER_RECMASK: + case SOUND_MIXER_RECMASK: v = mix_getrecdevs(m); break; - - case SOUND_MIXER_RECSRC: + case SOUND_MIXER_RECSRC: v = mixer_getrecsrc(m); break; - default: v = mixer_get(m, j); } @@ -1275,29 +1292,8 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, snd_mtxunlock(m->lock); return ((v != -1) ? 0 : ENXIO); } - - ret = 0; - - switch (cmd) { - case SNDCTL_DSP_GET_RECSRC_NAMES: - bcopy((void *)&m->enuminfo, arg, sizeof(oss_mixer_enuminfo)); - break; - case SNDCTL_DSP_GET_RECSRC: - ret = mixer_get_recroute(m, arg_i); - break; - case SNDCTL_DSP_SET_RECSRC: - ret = mixer_set_recroute(m, *arg_i); - break; - case OSS_GETVERSION: - *arg_i = SOUND_VERSION; - break; - default: - ret = EINVAL; - break; - } - +done: snd_mtxunlock(m->lock); - return (ret); } diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c index 6d35803de87f..11d176427704 100644 --- a/sys/dev/sound/pcm/sndstat.c +++ b/sys/dev/sound/pcm/sndstat.c @@ -79,9 +79,9 @@ static int sndstat_files = 0; } \ } while (0) -static SLIST_HEAD(, sndstat_entry) sndstat_devlist = SLIST_HEAD_INITIALIZER(none); +static SLIST_HEAD(, sndstat_entry) sndstat_devlist = SLIST_HEAD_INITIALIZER(sndstat_devlist); -int snd_verbose = 1; +int snd_verbose = 0; TUNABLE_INT("hw.snd.verbose", &snd_verbose); #ifdef SND_DEBUG @@ -372,12 +372,10 @@ sndstat_prepare(struct sbuf *s) PCM_ACQUIRE_QUICK(d); sbuf_printf(s, "%s:", device_get_nameunit(ent->dev)); sbuf_printf(s, " <%s>", device_get_desc(ent->dev)); - sbuf_printf(s, " %s [%s]", ent->str, - (d->flags & SD_F_MPSAFE) ? "MPSAFE" : "GIANT"); + if (snd_verbose > 0) + sbuf_printf(s, " %s", ent->str); if (ent->handler) ent->handler(s, ent->dev, snd_verbose); - else - sbuf_printf(s, " [no handler]"); sbuf_printf(s, "\n"); PCM_RELEASE_QUICK(d); } diff --git a/sys/dev/sound/pcm/sndstat.h b/sys/dev/sound/pcm/sndstat.h index 0c3a9bffcb2e..0bdb96ac01fa 100644 --- a/sys/dev/sound/pcm/sndstat.h +++ b/sys/dev/sound/pcm/sndstat.h @@ -37,9 +37,6 @@ struct pcm_channel *c; \ struct pcm_feeder *f; \ \ - if (verbose < 1) \ - return (0); \ - \ d = device_get_softc(dev); \ PCM_BUSYASSERT(d); \ \ @@ -48,9 +45,19 @@ return (0); \ } \ \ - sbuf_printf(s, " (%dp:%dv/%dr:%dv channels %splex%s)", \ - d->playcount, d->pvchancount, d->reccount, d->rvchancount, \ - (d->flags & SD_F_SIMPLEX) ? "sim" : "du", \ + if (verbose < 1) { \ + sbuf_printf(s, " (%s%s%s", \ + d->playcount ? "play" : "", \ + (d->playcount && d->reccount) ? "/" : "", \ + d->reccount ? "rec" : ""); \ + } else { \ + sbuf_printf(s, " (%dp:%dv/%dr:%dv", \ + d->playcount, d->pvchancount, \ + d->reccount, d->rvchancount); \ + } \ + sbuf_printf(s, "%s)%s", \ + ((d->playcount != 0 && d->reccount != 0) && \ + (d->flags & SD_F_SIMPLEX)) ? " simplex" : "", \ (device_get_unit(dev) == snd_unit) ? " default" : "") diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c index f5d47406391c..069a8c04887b 100644 --- a/sys/dev/sound/usb/uaudio.c +++ b/sys/dev/sound/usb/uaudio.c @@ -87,28 +87,34 @@ #include #include "feeder_if.h" -static int uaudio_default_rate = 96000; +static int uaudio_default_rate = 0; /* use rate list */ static int uaudio_default_bits = 32; -static int uaudio_default_channels = 2; +static int uaudio_default_channels = 0; /* use default */ #if USB_DEBUG static int uaudio_debug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio"); + SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW, &uaudio_debug, 0, "uaudio debug level"); + +TUNABLE_INT("hw.usb.uaudio.default_rate", &uaudio_default_rate); SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_rate, CTLFLAG_RW, &uaudio_default_rate, 0, "uaudio default sample rate"); + +TUNABLE_INT("hw.usb.uaudio.default_bits", &uaudio_default_bits); SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_bits, CTLFLAG_RW, &uaudio_default_bits, 0, "uaudio default sample bits"); + +TUNABLE_INT("hw.usb.uaudio.default_channels", &uaudio_default_channels); SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RW, &uaudio_default_channels, 0, "uaudio default sample channels"); #endif -#define UAUDIO_MINFRAMES 16 /* must be factor of 8 due HS-USB */ +#define UAUDIO_NFRAMES 64 /* must be factor of 8 due HS-USB */ #define UAUDIO_NCHANBUFS 2 /* number of outstanding request */ #define UAUDIO_RECURSE_LIMIT 24 /* rounds */ -#define UAUDIO_MINFRAMES_ALIGN(x) ((x) & ~(UAUDIO_MINFRAMES - 1)) #define MAKE_WORD(h,l) (((h) << 8) | (l)) #define BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1) @@ -119,7 +125,6 @@ struct uaudio_mixer_node { int32_t maxval; #define MIX_MAX_CHAN 8 int32_t wValue[MIX_MAX_CHAN]; /* using nchan */ - uint32_t delta; uint32_t mul; uint32_t ctl; @@ -150,16 +155,16 @@ struct uaudio_chan { struct pcmchan_caps pcm_cap; /* capabilities */ struct snd_dbuf *pcm_buf; - const struct usb_config *usb2_cfg; + const struct usb_config *usb_cfg; struct mtx *pcm_mtx; /* lock protecting this structure */ struct uaudio_softc *priv_sc; struct pcm_channel *pcm_ch; struct usb_xfer *xfer[UAUDIO_NCHANBUFS]; - const struct usb2_audio_streaming_interface_descriptor *p_asid; - const struct usb2_audio_streaming_type1_descriptor *p_asf1d; - const struct usb2_audio_streaming_endpoint_descriptor *p_sed; - const usb2_endpoint_descriptor_audio_t *p_ed1; - const usb2_endpoint_descriptor_audio_t *p_ed2; + const struct usb_audio_streaming_interface_descriptor *p_asid; + const struct usb_audio_streaming_type1_descriptor *p_asf1d; + const struct usb_audio_streaming_endpoint_descriptor *p_sed; + const usb_endpoint_descriptor_audio_t *p_ed1; + const usb_endpoint_descriptor_audio_t *p_ed2; const struct uaudio_format *p_fmt; uint8_t *buf; /* pointer to buffer */ @@ -169,12 +174,18 @@ struct uaudio_chan { * buffer */ uint32_t intr_size; /* in bytes */ - uint32_t block_size; + uint32_t intr_frames; /* in units */ uint32_t sample_rate; + uint32_t frames_per_second; + uint32_t sample_rem; + uint32_t sample_curr; + uint32_t format; uint32_t pcm_format[2]; - uint16_t bytes_per_frame; + uint16_t bytes_per_frame[2]; + + uint16_t sample_size; uint8_t valid; uint8_t iface_index; @@ -267,13 +278,13 @@ struct uaudio_search_result { struct uaudio_terminal_node { union { const struct usb_descriptor *desc; - const struct usb2_audio_input_terminal *it; - const struct usb2_audio_output_terminal *ot; - const struct usb2_audio_mixer_unit_0 *mu; - const struct usb2_audio_selector_unit *su; - const struct usb2_audio_feature_unit *fu; - const struct usb2_audio_processing_unit_0 *pu; - const struct usb2_audio_extension_unit_0 *eu; + const struct usb_audio_input_terminal *it; + const struct usb_audio_output_terminal *ot; + const struct usb_audio_mixer_unit_0 *mu; + const struct usb_audio_selector_unit *su; + const struct usb_audio_feature_unit *fu; + const struct usb_audio_processing_unit_0 *pu; + const struct usb_audio_extension_unit_0 *eu; } u; struct uaudio_search_result usr; struct uaudio_terminal_node *root; @@ -332,7 +343,7 @@ static usb_callback_t umidi_write_clear_stall_callback; static usb_callback_t umidi_bulk_write_callback; static void uaudio_chan_fill_info_sub(struct uaudio_softc *, - struct usb_device *, uint32_t, uint16_t, uint8_t, uint8_t); + struct usb_device *, uint32_t, uint8_t, uint8_t); static void uaudio_chan_fill_info(struct uaudio_softc *, struct usb_device *); static void uaudio_mixer_add_ctl_sub(struct uaudio_softc *, @@ -348,7 +359,7 @@ static void uaudio_mixer_add_mixer(struct uaudio_softc *, static void uaudio_mixer_add_selector(struct uaudio_softc *, const struct uaudio_terminal_node *, int); static uint32_t uaudio_mixer_feature_get_bmaControls( - const struct usb2_audio_feature_unit *, uint8_t); + const struct usb_audio_feature_unit *, uint8_t); static void uaudio_mixer_add_feature(struct uaudio_softc *, const struct uaudio_terminal_node *, int); static void uaudio_mixer_add_processing_updown(struct uaudio_softc *, @@ -357,7 +368,7 @@ static void uaudio_mixer_add_processing(struct uaudio_softc *, const struct uaudio_terminal_node *, int); static void uaudio_mixer_add_extension(struct uaudio_softc *, const struct uaudio_terminal_node *, int); -static struct usb2_audio_cluster uaudio_mixer_get_cluster(uint8_t, +static struct usb_audio_cluster uaudio_mixer_get_cluster(uint8_t, const struct uaudio_terminal_node *); static uint16_t uaudio_mixer_determine_class(const struct uaudio_terminal_node *, struct uaudio_mixer_node *); @@ -397,7 +408,7 @@ static int32_t umidi_detach(device_t dev); #if USB_DEBUG static void uaudio_chan_dump_ep_desc( - const usb2_endpoint_descriptor_audio_t *); + const usb_endpoint_descriptor_audio_t *); static void uaudio_mixer_dump_cluster(uint8_t, const struct uaudio_terminal_node *); static const char *uaudio_mixer_get_terminal_name(uint16_t); @@ -410,7 +421,7 @@ static const struct usb_config .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .bufsize = 0, /* use "wMaxPacketSize * frames" */ - .frames = UAUDIO_MINFRAMES, + .frames = UAUDIO_NFRAMES, .flags = {.short_xfer_ok = 1,}, .callback = &uaudio_chan_record_callback, }, @@ -420,7 +431,7 @@ static const struct usb_config .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .bufsize = 0, /* use "wMaxPacketSize * frames" */ - .frames = UAUDIO_MINFRAMES, + .frames = UAUDIO_NFRAMES, .flags = {.short_xfer_ok = 1,}, .callback = &uaudio_chan_record_callback, }, @@ -433,7 +444,7 @@ static const struct usb_config .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = 0, /* use "wMaxPacketSize * frames" */ - .frames = UAUDIO_MINFRAMES, + .frames = UAUDIO_NFRAMES, .flags = {.short_xfer_ok = 1,}, .callback = &uaudio_chan_play_callback, }, @@ -443,7 +454,7 @@ static const struct usb_config .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = 0, /* use "wMaxPacketSize * frames" */ - .frames = UAUDIO_MINFRAMES, + .frames = UAUDIO_NFRAMES, .flags = {.short_xfer_ok = 1,}, .callback = &uaudio_chan_play_callback, }, @@ -506,7 +517,6 @@ static const struct usb_config .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, .bufsize = sizeof(struct usb_device_request), - .flags = {}, .callback = &umidi_write_clear_stall_callback, .timeout = 1000, /* 1 second */ .interval = 50, /* 50ms */ @@ -517,7 +527,6 @@ static const struct usb_config .endpoint = 0x00, /* Control pipe */ .direction = UE_DIR_ANY, .bufsize = sizeof(struct usb_device_request), - .flags = {}, .callback = &umidi_read_clear_stall_callback, .timeout = 1000, /* 1 second */ .interval = 50, /* 50ms */ @@ -563,6 +572,13 @@ uaudio_probe(device_t dev) else return (0); } + + /* check for MIDI stream */ + + if ((uaa->info.bInterfaceClass == UICLASS_AUDIO) && + (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) { + return (0); + } return (ENXIO); } @@ -577,6 +593,8 @@ uaudio_attach(device_t dev) sc->sc_play_chan.priv_sc = sc; sc->sc_rec_chan.priv_sc = sc; sc->sc_udev = uaa->device; + sc->sc_mixer_iface_index = uaa->info.bIfaceIndex; + sc->sc_mixer_iface_no = uaa->info.bIfaceNum; if (usb_test_quirk(uaa, UQ_AUDIO_SWAP_LR)) sc->sc_uq_audio_swap_lr = 1; @@ -600,9 +618,6 @@ uaudio_attach(device_t dev) uaudio_mixer_fill_info(sc, uaa->device, id); - sc->sc_mixer_iface_index = uaa->info.bIfaceIndex; - sc->sc_mixer_iface_no = uaa->info.bIfaceNum; - DPRINTF("audio rev %d.%02x\n", sc->sc_audio_rev >> 8, sc->sc_audio_rev & 0xff); @@ -767,7 +782,7 @@ uaudio_detach(device_t dev) #if USB_DEBUG static void -uaudio_chan_dump_ep_desc(const usb2_endpoint_descriptor_audio_t *ed) +uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed) { if (ed) { DPRINTF("endpoint=%p bLength=%d bDescriptorType=%d \n" @@ -785,15 +800,14 @@ uaudio_chan_dump_ep_desc(const usb2_endpoint_descriptor_audio_t *ed) static void uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev, - uint32_t rate, uint16_t fps, uint8_t channels, - uint8_t bit_resolution) + uint32_t rate, uint8_t channels, uint8_t bit_resolution) { struct usb_descriptor *desc = NULL; - const struct usb2_audio_streaming_interface_descriptor *asid = NULL; - const struct usb2_audio_streaming_type1_descriptor *asf1d = NULL; - const struct usb2_audio_streaming_endpoint_descriptor *sed = NULL; - const usb2_endpoint_descriptor_audio_t *ed1 = NULL; - const usb2_endpoint_descriptor_audio_t *ed2 = NULL; + const struct usb_audio_streaming_interface_descriptor *asid = NULL; + const struct usb_audio_streaming_type1_descriptor *asf1d = NULL; + const struct usb_audio_streaming_endpoint_descriptor *sed = NULL; + const usb_endpoint_descriptor_audio_t *ed1 = NULL; + const usb_endpoint_descriptor_audio_t *ed2 = NULL; struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev); struct usb_interface_descriptor *id; const struct uaudio_format *p_fmt; @@ -809,7 +823,6 @@ uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev, uint8_t bBitResolution; uint8_t x; uint8_t audio_if = 0; - uint8_t sample_size; while ((desc = usb_desc_foreach(cd, desc))) { @@ -1032,22 +1045,16 @@ uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev, chan->iface_alt_index = alt_index; if (ep_dir == UE_DIR_IN) - chan->usb2_cfg = + chan->usb_cfg = uaudio_cfg_record; else - chan->usb2_cfg = + chan->usb_cfg = uaudio_cfg_play; - sample_size = (( + chan->sample_size = (( UAUDIO_MAX_CHAN(chan->p_asf1d->bNrChannels) * chan->p_asf1d->bBitResolution) / 8); - /* - * NOTE: "chan->bytes_per_frame" - * should not be zero! - */ - chan->bytes_per_frame = ((rate / fps) * sample_size); - if (sc->sc_sndstat_valid) { sbuf_printf(&sc->sc_sndstat, "\n\t" "mode %d.%d:(%s) %dch, %d/%dbit, %s, %dHz", @@ -1065,12 +1072,32 @@ uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev, } } +/* This structure defines all the supported rates. */ + +static const uint32_t uaudio_rate_list[] = { + 96000, + 88000, + 80000, + 72000, + 64000, + 56000, + 48000, + 44100, + 40000, + 32000, + 24000, + 22050, + 16000, + 11025, + 8000, + 0 +}; + static void uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev) { uint32_t rate = uaudio_default_rate; - uint32_t z; - uint16_t fps = usbd_get_isoc_fps(udev); + uint8_t z; uint8_t bits = uaudio_default_bits; uint8_t y; uint8_t channels = uaudio_default_channels; @@ -1081,14 +1108,24 @@ uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev) /* set a valid value */ bits = 32; } - rate -= (rate % fps); - if ((rate == 0) || (rate > 192000)) { - /* set a valid value */ - rate = 192000 - (192000 % fps); - } - if ((channels == 0) || (channels > 2)) { - /* set a valid value */ - channels = 2; + if (channels == 0) { + switch (usbd_get_speed(udev)) { + case USB_SPEED_LOW: + case USB_SPEED_FULL: + /* + * Due to high bandwidth usage and problems + * with HIGH-speed split transactions we + * disable surround setups on FULL-speed USB + * by default + */ + channels = 2; + break; + default: + channels = 16; + break; + } + } else if (channels > 16) { + channels = 16; } if (sbuf_new(&sc->sc_sndstat, NULL, 4096, SBUF_AUTOEXTEND)) { sc->sc_sndstat_valid = 1; @@ -1097,8 +1134,14 @@ uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev) for (x = channels; x; x--) { for (y = bits; y; y -= 8) { - for (z = rate; z; z -= fps) { - uaudio_chan_fill_info_sub(sc, udev, z, fps, x, y); + + /* try user defined rate, if any */ + if (rate != 0) + uaudio_chan_fill_info_sub(sc, udev, rate, x, y); + + /* try find a matching rate, if any */ + for (z = 0; uaudio_rate_list[z]; z++) { + uaudio_chan_fill_info_sub(sc, udev, uaudio_rate_list[z], x, y); if (sc->sc_rec_chan.valid && sc->sc_play_chan.valid) { @@ -1114,41 +1157,6 @@ done: } } -/* - * The following function sets up data size and block count for the - * next audio transfer. - */ -static void -uaudio_setup_blockcount(struct uaudio_chan *ch, usb_frcount_t max_frames, - uint32_t *total, uint32_t *blockcount) -{ - uint32_t temp; - uint32_t isiz; - - /* allow dynamic sizing of play buffer */ - isiz = ch->intr_size; - - /* allow dynamic sizing of play buffer */ - temp = isiz / ch->bytes_per_frame; - - /* align units */ - temp = UAUDIO_MINFRAMES_ALIGN(temp); - - /* range check - min */ - if (temp == 0) - temp = UAUDIO_MINFRAMES; - - /* range check - max */ - if (temp > max_frames) - temp = max_frames; - - /* store blockcount */ - *blockcount = temp; - - /* compute the total length */ - *total = temp * ch->bytes_per_frame; -} - static void uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error) { @@ -1158,39 +1166,55 @@ uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error) uint32_t blockcount; uint32_t n; uint32_t offset; - int actlen, sumlen; + int actlen; + int sumlen; usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL); - uaudio_setup_blockcount(ch, usbd_xfer_max_frames(xfer), - &total, &blockcount); + if (ch->end == ch->start) { + DPRINTF("no buffer!\n"); + return; + } switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: tr_transferred: if (actlen < sumlen) { DPRINTF("short transfer, " - "%d of %d bytes\n", actlen, total); + "%d of %d bytes\n", actlen, sumlen); } chn_intr(ch->pcm_ch); case USB_ST_SETUP: - if (ch->bytes_per_frame > usbd_xfer_max_framelen(xfer)) { + if (ch->bytes_per_frame[1] > usbd_xfer_max_framelen(xfer)) { DPRINTF("bytes per transfer, %d, " "exceeds maximum, %d!\n", - ch->bytes_per_frame, + ch->bytes_per_frame[1], usbd_xfer_max_framelen(xfer)); break; } - /* setup frame length */ - usbd_xfer_set_frames(xfer, blockcount); - for (n = 0; n != blockcount; n++) - usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame); - if (ch->end == ch->start) { - DPRINTF("no buffer!\n"); - break; + blockcount = ch->intr_frames; + + /* setup number of frames */ + usbd_xfer_set_frames(xfer, blockcount); + + /* reset total length */ + total = 0; + + /* setup frame lengths */ + for (n = 0; n != blockcount; n++) { + ch->sample_curr += ch->sample_rem; + if (ch->sample_curr >= ch->frames_per_second) { + ch->sample_curr -= ch->frames_per_second; + usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame[1]); + total += ch->bytes_per_frame[1]; + } else { + usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame[0]); + total += ch->bytes_per_frame[0]; + } } + DPRINTFN(6, "transfer %d bytes\n", total); offset = 0; @@ -1231,34 +1255,33 @@ uaudio_chan_record_callback(struct usb_xfer *xfer, usb_error_t error) struct usb_page_cache *pc; uint32_t n; uint32_t m; - uint32_t total; uint32_t blockcount; uint32_t offset0; uint32_t offset1; + uint32_t mfl; int len; - int actlen, nframes; + int actlen; + int nframes; usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes); + mfl = usbd_xfer_max_framelen(xfer); - uaudio_setup_blockcount(ch, usbd_xfer_max_frames(xfer), - &total, &blockcount); + if (ch->end == ch->start) { + DPRINTF("no buffer!\n"); + return; + } switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: -tr_transferred: - if (actlen < total) { - DPRINTF("short transfer, " - "%d of %d bytes\n", actlen, total); - } else { - DPRINTFN(6, "transferred %d bytes\n", actlen); - } + + DPRINTFN(6, "transferred %d bytes\n", actlen); offset0 = 0; + pc = usbd_xfer_get_frame(xfer, 0); for (n = 0; n != nframes; n++) { offset1 = offset0; - pc = usbd_xfer_get_frame(xfer, 0); len = usbd_xfer_frame_len(xfer, n); while (len > 0) { @@ -1279,36 +1302,28 @@ tr_transferred: } } - offset0 += ch->bytes_per_frame; + offset0 += mfl; } chn_intr(ch->pcm_ch); case USB_ST_SETUP: - if (ch->bytes_per_frame > usbd_xfer_max_framelen(xfer)) { - DPRINTF("bytes per transfer, %d, " - "exceeds maximum, %d!\n", - ch->bytes_per_frame, - usbd_xfer_max_framelen(xfer)); - return; - } +tr_setup: + blockcount = ch->intr_frames; + usbd_xfer_set_frames(xfer, blockcount); for (n = 0; n < blockcount; n++) { - usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame); + usbd_xfer_set_frame_len(xfer, n, mfl); } - if (ch->end == ch->start) { - DPRINTF("no buffer!\n"); - return; - } usbd_transfer_submit(xfer); - return; + break; default: /* Error */ if (error == USB_ERR_CANCELLED) { - return; + break; } - goto tr_transferred; + goto tr_setup; } } @@ -1319,38 +1334,26 @@ uaudio_chan_init(struct uaudio_softc *sc, struct snd_dbuf *b, struct uaudio_chan *ch = ((dir == PCMDIR_PLAY) ? &sc->sc_play_chan : &sc->sc_rec_chan); uint32_t buf_size; + uint32_t frames; + uint32_t format; + uint16_t fps; uint8_t endpoint; + uint8_t blocks; uint8_t iface_index; uint8_t alt_index; + uint8_t fps_shift; usb_error_t err; - /* compute required buffer size */ - buf_size = (ch->bytes_per_frame * UAUDIO_MINFRAMES); + fps = usbd_get_isoc_fps(sc->sc_udev); - /* setup interrupt interval */ - ch->intr_size = buf_size; - - /* double buffering */ - buf_size *= 2; - - ch->buf = malloc(buf_size, M_DEVBUF, M_WAITOK | M_ZERO); - if (ch->buf == NULL) { - goto error; + if (fps < 8000) { + /* FULL speed USB */ + frames = 8; + } else { + /* HIGH speed USB */ + frames = UAUDIO_NFRAMES; } - if (sndbuf_setup(b, ch->buf, buf_size) != 0) { - goto error; - } - ch->start = ch->buf; - ch->end = ch->buf + buf_size; - ch->cur = ch->buf; - ch->pcm_ch = c; - ch->pcm_mtx = c->lock; - ch->pcm_buf = b; - if (ch->pcm_mtx == NULL) { - DPRINTF("ERROR: PCM channels does not have a mutex!\n"); - goto error; - } /* setup play/record format */ ch->pcm_cap.fmtlist = ch->pcm_format; @@ -1361,15 +1364,38 @@ uaudio_chan_init(struct uaudio_softc *sc, struct snd_dbuf *b, ch->pcm_cap.minspeed = ch->sample_rate; ch->pcm_cap.maxspeed = ch->sample_rate; - if (ch->p_asf1d->bNrChannels >= 2) - ch->pcm_cap.fmtlist[0] = - SND_FORMAT(ch->p_fmt->freebsd_fmt, 2, 0); - else - ch->pcm_cap.fmtlist[0] = - SND_FORMAT(ch->p_fmt->freebsd_fmt, 1, 0); + /* setup mutex and PCM channel */ + ch->pcm_ch = c; + ch->pcm_mtx = c->lock; + + format = ch->p_fmt->freebsd_fmt; + + switch (ch->p_asf1d->bNrChannels) { + case 2: + /* stereo */ + format = SND_FORMAT(format, 2, 0); + break; + case 1: + /* mono */ + format = SND_FORMAT(format, 1, 0); + break; + default: + /* surround and more */ + format = feeder_matrix_default_format( + SND_FORMAT(format, ch->p_asf1d->bNrChannels, 0)); + break; + } + + ch->pcm_cap.fmtlist[0] = format; ch->pcm_cap.fmtlist[1] = 0; + /* check if format is not supported */ + + if (format == 0) { + DPRINTF("The selected audio format is not supported\n"); + goto error; + } /* set alternate interface corresponding to the mode */ @@ -1403,10 +1429,62 @@ uaudio_chan_init(struct uaudio_softc *sc, struct snd_dbuf *b, } } if (usbd_transfer_setup(sc->sc_udev, &iface_index, ch->xfer, - ch->usb2_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) { + ch->usb_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) { DPRINTF("could not allocate USB transfers!\n"); goto error; } + + fps_shift = usbd_xfer_get_fps_shift(ch->xfer[0]); + + /* down shift number of frames per second, if any */ + fps >>= fps_shift; + frames >>= fps_shift; + + /* bytes per frame should not be zero */ + ch->bytes_per_frame[0] = ((ch->sample_rate / fps) * ch->sample_size); + ch->bytes_per_frame[1] = (((ch->sample_rate + fps - 1) / fps) * ch->sample_size); + + /* setup data rate dithering, if any */ + ch->frames_per_second = fps; + ch->sample_rem = ch->sample_rate % fps; + ch->sample_curr = 0; + ch->frames_per_second = fps; + + /* compute required buffer size */ + buf_size = (ch->bytes_per_frame[1] * frames); + + ch->intr_size = buf_size; + ch->intr_frames = frames; + + DPRINTF("fps=%d sample_rem=%d\n", fps, ch->sample_rem); + + if (ch->intr_frames == 0) { + DPRINTF("frame shift is too high!\n"); + goto error; + } + + /* setup double buffering */ + buf_size *= 2; + blocks = 2; + + ch->buf = malloc(buf_size, M_DEVBUF, M_WAITOK | M_ZERO); + if (ch->buf == NULL) + goto error; + if (sndbuf_setup(b, ch->buf, buf_size) != 0) + goto error; + if (sndbuf_resize(b, blocks, ch->intr_size)) + goto error; + + ch->start = ch->buf; + ch->end = ch->buf + buf_size; + ch->cur = ch->buf; + ch->pcm_buf = b; + + if (ch->pcm_mtx == NULL) { + DPRINTF("ERROR: PCM channels does not have a mutex!\n"); + goto error; + } + return (ch); error: @@ -1431,30 +1509,13 @@ uaudio_chan_free(struct uaudio_chan *ch) int uaudio_chan_set_param_blocksize(struct uaudio_chan *ch, uint32_t blocksize) { - uaudio_chan_set_param_fragments(ch, blocksize, 0 - 1); - - return (ch->block_size); + return (ch->intr_size); } int uaudio_chan_set_param_fragments(struct uaudio_chan *ch, uint32_t blocksize, uint32_t blockcount) { - /* we only support one size */ - blocksize = ch->intr_size; - blockcount = 2; - - if ((sndbuf_getblksz(ch->pcm_buf) != blocksize) || - (sndbuf_getblkcnt(ch->pcm_buf) != blockcount)) { - DPRINTFN(1, "resizing to %u x " - "%u bytes\n", blockcount, blocksize); - if (sndbuf_resize(ch->pcm_buf, blockcount, blocksize)) { - DPRINTFN(0, "failed to resize sound buffer, count=%u, " - "size=%u\n", blockcount, blocksize); - } - } - ch->block_size = sndbuf_getblksz(ch->pcm_buf); - return (1); } @@ -1591,12 +1652,10 @@ uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc) DPRINTF("adding %d\n", mc->ctl); } - mc->delta = 0; if (mc->type == MIX_ON_OFF) { mc->minval = 0; mc->maxval = 1; } else if (mc->type == MIX_SELECTOR) { - } else { /* determine min and max values */ @@ -1607,21 +1666,27 @@ uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc) mc->maxval = uaudio_mixer_get(sc->sc_udev, GET_MAX, mc); - mc->maxval = 1 + uaudio_mixer_signext(mc->type, mc->maxval); + mc->maxval = uaudio_mixer_signext(mc->type, mc->maxval); + /* check if max and min was swapped */ + + if (mc->maxval < mc->minval) { + res = mc->maxval; + mc->maxval = mc->minval; + mc->minval = res; + } + + /* compute value range */ mc->mul = mc->maxval - mc->minval; - if (mc->mul == 0) { + if (mc->mul == 0) mc->mul = 1; - } + + /* compute value alignment */ res = uaudio_mixer_get(sc->sc_udev, GET_RES, mc); - if (res > 0) { - mc->delta = ((res * 255) + (mc->mul / 2)) / mc->mul; - } + + DPRINTF("Resolution = %d\n", (int)res); } - if (mc->maxval < mc->minval) { - mc->maxval = mc->minval; - } uaudio_mixer_add_ctl_sub(sc, mc); #if USB_DEBUG @@ -1644,7 +1709,7 @@ uaudio_mixer_add_input(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { #if USB_DEBUG - const struct usb2_audio_input_terminal *d = iot[id].u.it; + const struct usb_audio_input_terminal *d = iot[id].u.it; DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x " "bAssocTerminal=%d bNrChannels=%d wChannelConfig=%d " @@ -1660,7 +1725,7 @@ uaudio_mixer_add_output(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { #if USB_DEBUG - const struct usb2_audio_output_terminal *d = iot[id].u.ot; + const struct usb_audio_output_terminal *d = iot[id].u.ot; DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x " "bAssocTerminal=%d bSourceId=%d iTerminal=%d\n", @@ -1675,8 +1740,8 @@ uaudio_mixer_add_mixer(struct uaudio_softc *sc, { struct uaudio_mixer_node mix; - const struct usb2_audio_mixer_unit_0 *d0 = iot[id].u.mu; - const struct usb2_audio_mixer_unit_1 *d1; + const struct usb_audio_mixer_unit_0 *d0 = iot[id].u.mu; + const struct usb_audio_mixer_unit_1 *d1; uint32_t bno; /* bit number */ uint32_t p; /* bit number accumulator */ @@ -1758,7 +1823,7 @@ static void uaudio_mixer_add_selector(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb2_audio_selector_unit *d = iot[id].u.su; + const struct usb_audio_selector_unit *d = iot[id].u.su; struct uaudio_mixer_node mix; uint16_t i; @@ -1799,7 +1864,7 @@ uaudio_mixer_add_selector(struct uaudio_softc *sc, } static uint32_t -uaudio_mixer_feature_get_bmaControls(const struct usb2_audio_feature_unit *d, +uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d, uint8_t index) { uint32_t temp = 0; @@ -1824,7 +1889,7 @@ static void uaudio_mixer_add_feature(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb2_audio_feature_unit *d = iot[id].u.fu; + const struct usb_audio_feature_unit *d = iot[id].u.fu; struct uaudio_mixer_node mix; uint32_t fumask; uint32_t mmask; @@ -1950,10 +2015,10 @@ static void uaudio_mixer_add_processing_updown(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu; - const struct usb2_audio_processing_unit_1 *d1 = + const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu; + const struct usb_audio_processing_unit_1 *d1 = (const void *)(d0->baSourceId + d0->bNrInPins); - const struct usb2_audio_processing_unit_updown *ud = + const struct usb_audio_processing_unit_updown *ud = (const void *)(d1->bmControls + d1->bControlSize); struct uaudio_mixer_node mix; uint8_t i; @@ -1992,8 +2057,8 @@ static void uaudio_mixer_add_processing(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu; - const struct usb2_audio_processing_unit_1 *d1 = + const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu; + const struct usb_audio_processing_unit_1 *d1 = (const void *)(d0->baSourceId + d0->bNrInPins); struct uaudio_mixer_node mix; uint16_t ptype; @@ -2037,8 +2102,8 @@ static void uaudio_mixer_add_extension(struct uaudio_softc *sc, const struct uaudio_terminal_node *iot, int id) { - const struct usb2_audio_extension_unit_0 *d0 = iot[id].u.eu; - const struct usb2_audio_extension_unit_1 *d1 = + const struct usb_audio_extension_unit_0 *d0 = iot[id].u.eu; + const struct usb_audio_extension_unit_1 *d1 = (const void *)(d0->baSourceId + d0->bNrInPins); struct uaudio_mixer_node mix; @@ -2068,19 +2133,19 @@ uaudio_mixer_add_extension(struct uaudio_softc *sc, static const void * uaudio_mixer_verify_desc(const void *arg, uint32_t len) { - const struct usb2_audio_mixer_unit_1 *d1; - const struct usb2_audio_extension_unit_1 *e1; - const struct usb2_audio_processing_unit_1 *u1; + const struct usb_audio_mixer_unit_1 *d1; + const struct usb_audio_extension_unit_1 *e1; + const struct usb_audio_processing_unit_1 *u1; union { const struct usb_descriptor *desc; - const struct usb2_audio_input_terminal *it; - const struct usb2_audio_output_terminal *ot; - const struct usb2_audio_mixer_unit_0 *mu; - const struct usb2_audio_selector_unit *su; - const struct usb2_audio_feature_unit *fu; - const struct usb2_audio_processing_unit_0 *pu; - const struct usb2_audio_extension_unit_0 *eu; + const struct usb_audio_input_terminal *it; + const struct usb_audio_output_terminal *ot; + const struct usb_audio_mixer_unit_0 *mu; + const struct usb_audio_selector_unit *su; + const struct usb_audio_feature_unit *fu; + const struct usb_audio_processing_unit_0 *pu; + const struct usb_audio_extension_unit_0 *eu; } u; u.desc = arg; @@ -2204,7 +2269,7 @@ uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot) }; uint16_t cc; uint8_t i; - const struct usb2_audio_cluster cl = uaudio_mixer_get_cluster(id, iot); + const struct usb_audio_cluster cl = uaudio_mixer_get_cluster(id, iot); cc = UGETW(cl.wChannelConfig); @@ -2221,10 +2286,10 @@ uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot) #endif -static struct usb2_audio_cluster +static struct usb_audio_cluster uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot) { - struct usb2_audio_cluster r; + struct usb_audio_cluster r; const struct usb_descriptor *dp; uint8_t i; @@ -2246,7 +2311,7 @@ uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot) break; case UDESCSUB_AC_MIXER: - r = *(const struct usb2_audio_cluster *) + r = *(const struct usb_audio_cluster *) &iot[id].u.mu->baSourceId[iot[id].u.mu-> bNrInPins]; goto done; @@ -2263,13 +2328,13 @@ uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot) break; case UDESCSUB_AC_PROCESSING: - r = *((const struct usb2_audio_cluster *) + r = *((const struct usb_audio_cluster *) &iot[id].u.pu->baSourceId[iot[id].u.pu-> bNrInPins]); goto done; case UDESCSUB_AC_EXTENSION: - r = *((const struct usb2_audio_cluster *) + r = *((const struct usb_audio_cluster *) &iot[id].u.eu->baSourceId[iot[id].u.eu-> bNrInPins]); goto done; @@ -2695,10 +2760,10 @@ static void uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usb_device *udev, void *desc) { - const struct usb2_audio_control_descriptor *acdp; + const struct usb_audio_control_descriptor *acdp; struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev); const struct usb_descriptor *dp; - const struct usb2_audio_unit *au; + const struct usb_audio_unit *au; struct uaudio_terminal_node *iot = NULL; uint16_t wTotalLen; uint8_t ID_max = 0; /* inclusive */ @@ -3108,7 +3173,18 @@ uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val) val = mc->minval; } } else { - val = (((val + (mc->delta / 2)) * mc->mul) / 255) + mc->minval; + + /* compute actual volume */ + val = (val * mc->mul) / 255; + + /* add lower offset */ + val = val + mc->minval; + + /* make sure we don't write a value out of range */ + if (val > mc->maxval) + val = mc->maxval; + else if (val < mc->minval) + val = mc->minval; } DPRINTFN(6, "type=0x%03x val=%d min=%d max=%d val=%d\n", diff --git a/sys/dev/sound/usb/uaudioreg.h b/sys/dev/sound/usb/uaudioreg.h index 495f94a8b96c..0df4ea525f0d 100644 --- a/sys/dev/sound/usb/uaudioreg.h +++ b/sys/dev/sound/usb/uaudioreg.h @@ -64,9 +64,9 @@ typedef struct { */ uByte bRefresh; uByte bSynchAddress; -} __packed usb2_endpoint_descriptor_audio_t; +} __packed usb_endpoint_descriptor_audio_t; -struct usb2_audio_control_descriptor { +struct usb_audio_control_descriptor { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -76,7 +76,7 @@ struct usb2_audio_control_descriptor { uByte baInterfaceNr[1]; } __packed; -struct usb2_audio_streaming_interface_descriptor { +struct usb_audio_streaming_interface_descriptor { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -85,7 +85,7 @@ struct usb2_audio_streaming_interface_descriptor { uWord wFormatTag; } __packed; -struct usb2_audio_streaming_endpoint_descriptor { +struct usb_audio_streaming_endpoint_descriptor { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -97,7 +97,7 @@ struct usb2_audio_streaming_endpoint_descriptor { uWord wLockDelay; } __packed; -struct usb2_audio_streaming_type1_descriptor { +struct usb_audio_streaming_type1_descriptor { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -115,7 +115,7 @@ struct usb2_audio_streaming_type1_descriptor { #define UA_SAMP_HI(p) UA_GETSAMP(p, 1) } __packed; -struct usb2_audio_cluster { +struct usb_audio_cluster { uByte bNrChannels; uWord wChannelConfig; #define UA_CHANNEL_LEFT 0x0001 @@ -134,7 +134,7 @@ struct usb2_audio_cluster { } __packed; /* Shared by all units and terminals */ -struct usb2_audio_unit { +struct usb_audio_unit { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -142,7 +142,7 @@ struct usb2_audio_unit { }; /* UDESCSUB_AC_INPUT */ -struct usb2_audio_input_terminal { +struct usb_audio_input_terminal { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -156,7 +156,7 @@ struct usb2_audio_input_terminal { } __packed; /* UDESCSUB_AC_OUTPUT */ -struct usb2_audio_output_terminal { +struct usb_audio_output_terminal { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -168,16 +168,16 @@ struct usb2_audio_output_terminal { } __packed; /* UDESCSUB_AC_MIXER */ -struct usb2_audio_mixer_unit_0 { +struct usb_audio_mixer_unit_0 { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; uByte bUnitId; uByte bNrInPins; uByte baSourceId[0]; /* [bNrInPins] */ - /* struct usb2_audio_mixer_unit_1 */ + /* struct usb_audio_mixer_unit_1 */ } __packed; -struct usb2_audio_mixer_unit_1 { +struct usb_audio_mixer_unit_1 { uByte bNrChannels; uWord wChannelConfig; uByte iChannelNames; @@ -186,7 +186,7 @@ struct usb2_audio_mixer_unit_1 { } __packed; /* UDESCSUB_AC_SELECTOR */ -struct usb2_audio_selector_unit { +struct usb_audio_selector_unit { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -197,7 +197,7 @@ struct usb2_audio_selector_unit { } __packed; /* UDESCSUB_AC_FEATURE */ -struct usb2_audio_feature_unit { +struct usb_audio_feature_unit { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -209,7 +209,7 @@ struct usb2_audio_feature_unit { } __packed; /* UDESCSUB_AC_PROCESSING */ -struct usb2_audio_processing_unit_0 { +struct usb_audio_processing_unit_0 { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -217,9 +217,9 @@ struct usb2_audio_processing_unit_0 { uWord wProcessType; uByte bNrInPins; uByte baSourceId[0]; /* [bNrInPins] */ - /* struct usb2_audio_processing_unit_1 */ + /* struct usb_audio_processing_unit_1 */ } __packed; -struct usb2_audio_processing_unit_1 { +struct usb_audio_processing_unit_1 { uByte bNrChannels; uWord wChannelConfig; uByte iChannelNames; @@ -228,14 +228,14 @@ struct usb2_audio_processing_unit_1 { #define UA_PROC_ENABLE_MASK 1 } __packed; -struct usb2_audio_processing_unit_updown { +struct usb_audio_processing_unit_updown { uByte iProcessing; uByte bNrModes; uWord waModes[0]; /* [bNrModes] */ } __packed; /* UDESCSUB_AC_EXTENSION */ -struct usb2_audio_extension_unit_0 { +struct usb_audio_extension_unit_0 { uByte bLength; uByte bDescriptorType; uByte bDescriptorSubtype; @@ -243,9 +243,9 @@ struct usb2_audio_extension_unit_0 { uWord wExtensionCode; uByte bNrInPins; uByte baSourceId[0]; /* [bNrInPins] */ - /* struct usb2_audio_extension_unit_1 */ + /* struct usb_audio_extension_unit_1 */ } __packed; -struct usb2_audio_extension_unit_1 { +struct usb_audio_extension_unit_1 { uByte bNrChannels; uWord wChannelConfig; uByte iChannelNames; diff --git a/sys/dev/ste/if_ste.c b/sys/dev/ste/if_ste.c index f68a97d2e833..78c0290b70a0 100644 --- a/sys/dev/ste/if_ste.c +++ b/sys/dev/ste/if_ste.c @@ -39,14 +39,19 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include -#include +#include +#include #include +#include +#include +#include #include +#include #include +#include #include +#include #include #include #include @@ -55,14 +60,8 @@ __FBSDID("$FreeBSD$"); #include #include -#include - -#include /* for vtophys */ -#include /* for vtophys */ #include #include -#include -#include #include #include @@ -70,17 +69,18 @@ __FBSDID("$FreeBSD$"); #include #include +#include + /* "device miibus" required. See GENERIC if you get errors here. */ #include "miibus_if.h" -#define STE_USEIOSPACE - -#include - MODULE_DEPEND(ste, pci, 1, 1, 1); MODULE_DEPEND(ste, ether, 1, 1, 1); MODULE_DEPEND(ste, miibus, 1, 1, 1); +/* Define to show Tx error status. */ +#define STE_SHOW_TXERRORS + /* * Various supported device vendors/types and their names. */ @@ -91,53 +91,52 @@ static struct ste_type ste_devs[] = { { 0, 0, NULL } }; -static int ste_probe(device_t); -static int ste_attach(device_t); -static int ste_detach(device_t); -static void ste_init(void *); -static void ste_init_locked(struct ste_softc *); -static void ste_intr(void *); -static void ste_rxeoc(struct ste_softc *); -static int ste_rxeof(struct ste_softc *); -static void ste_txeoc(struct ste_softc *); -static void ste_txeof(struct ste_softc *); -static void ste_stats_update(void *); -static void ste_stop(struct ste_softc *); -static void ste_reset(struct ste_softc *); -static int ste_ioctl(struct ifnet *, u_long, caddr_t); -static int ste_encap(struct ste_softc *, struct ste_chain *, struct mbuf *); -static void ste_start(struct ifnet *); -static void ste_start_locked(struct ifnet *); -static void ste_watchdog(struct ifnet *); -static int ste_shutdown(device_t); -static int ste_newbuf(struct ste_softc *, struct ste_chain_onefrag *, - struct mbuf *); -static int ste_ifmedia_upd(struct ifnet *); -static void ste_ifmedia_upd_locked(struct ifnet *); -static void ste_ifmedia_sts(struct ifnet *, struct ifmediareq *); +static int ste_attach(device_t); +static int ste_detach(device_t); +static int ste_probe(device_t); +static int ste_resume(device_t); +static int ste_shutdown(device_t); +static int ste_suspend(device_t); -static void ste_mii_sync(struct ste_softc *); -static void ste_mii_send(struct ste_softc *, u_int32_t, int); -static int ste_mii_readreg(struct ste_softc *, struct ste_mii_frame *); -static int ste_mii_writereg(struct ste_softc *, struct ste_mii_frame *); -static int ste_miibus_readreg(device_t, int, int); -static int ste_miibus_writereg(device_t, int, int, int); -static void ste_miibus_statchg(device_t); - -static int ste_eeprom_wait(struct ste_softc *); -static int ste_read_eeprom(struct ste_softc *, caddr_t, int, int, int); -static void ste_wait(struct ste_softc *); -static void ste_setmulti(struct ste_softc *); -static int ste_init_rx_list(struct ste_softc *); -static void ste_init_tx_list(struct ste_softc *); - -#ifdef STE_USEIOSPACE -#define STE_RES SYS_RES_IOPORT -#define STE_RID STE_PCI_LOIO -#else -#define STE_RES SYS_RES_MEMORY -#define STE_RID STE_PCI_LOMEM -#endif +static int ste_dma_alloc(struct ste_softc *); +static void ste_dma_free(struct ste_softc *); +static void ste_dmamap_cb(void *, bus_dma_segment_t *, int, int); +static int ste_eeprom_wait(struct ste_softc *); +static int ste_encap(struct ste_softc *, struct mbuf **, + struct ste_chain *); +static int ste_ifmedia_upd(struct ifnet *); +static void ste_ifmedia_sts(struct ifnet *, struct ifmediareq *); +static void ste_init(void *); +static void ste_init_locked(struct ste_softc *); +static int ste_init_rx_list(struct ste_softc *); +static void ste_init_tx_list(struct ste_softc *); +static void ste_intr(void *); +static int ste_ioctl(struct ifnet *, u_long, caddr_t); +static int ste_mii_readreg(struct ste_softc *, struct ste_mii_frame *); +static void ste_mii_send(struct ste_softc *, uint32_t, int); +static void ste_mii_sync(struct ste_softc *); +static int ste_mii_writereg(struct ste_softc *, struct ste_mii_frame *); +static int ste_miibus_readreg(device_t, int, int); +static void ste_miibus_statchg(device_t); +static int ste_miibus_writereg(device_t, int, int, int); +static int ste_newbuf(struct ste_softc *, struct ste_chain_onefrag *); +static int ste_read_eeprom(struct ste_softc *, uint16_t *, int, int); +static void ste_reset(struct ste_softc *); +static void ste_restart_tx(struct ste_softc *); +static int ste_rxeof(struct ste_softc *, int); +static void ste_rxfilter(struct ste_softc *); +static void ste_setwol(struct ste_softc *); +static void ste_start(struct ifnet *); +static void ste_start_locked(struct ifnet *); +static void ste_stats_clear(struct ste_softc *); +static void ste_stats_update(struct ste_softc *); +static void ste_stop(struct ste_softc *); +static void ste_sysctl_node(struct ste_softc *); +static void ste_tick(void *); +static void ste_txeoc(struct ste_softc *); +static void ste_txeof(struct ste_softc *); +static void ste_wait(struct ste_softc *); +static void ste_watchdog(struct ste_softc *); static device_method_t ste_methods[] = { /* Device interface */ @@ -145,6 +144,8 @@ static device_method_t ste_methods[] = { DEVMETHOD(device_attach, ste_attach), DEVMETHOD(device_detach, ste_detach), DEVMETHOD(device_shutdown, ste_shutdown), + DEVMETHOD(device_suspend, ste_suspend), + DEVMETHOD(device_resume, ste_resume), /* bus interface */ DEVMETHOD(bus_print_child, bus_generic_print_child), @@ -169,11 +170,6 @@ static devclass_t ste_devclass; DRIVER_MODULE(ste, pci, ste_driver, ste_devclass, 0, 0); DRIVER_MODULE(miibus, ste, miibus_driver, miibus_devclass, 0, 0); -SYSCTL_NODE(_hw, OID_AUTO, ste, CTLFLAG_RD, 0, "if_ste parameters"); - -static int ste_rxsyncs; -SYSCTL_INT(_hw_ste, OID_AUTO, rxsyncs, CTLFLAG_RW, &ste_rxsyncs, 0, ""); - #define STE_SETBIT4(sc, reg, x) \ CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) | (x)) @@ -194,16 +190,15 @@ SYSCTL_INT(_hw_ste, OID_AUTO, rxsyncs, CTLFLAG_RW, &ste_rxsyncs, 0, ""); #define MII_SET(x) STE_SETBIT1(sc, STE_PHYCTL, x) -#define MII_CLR(x) STE_CLRBIT1(sc, STE_PHYCTL, x) +#define MII_CLR(x) STE_CLRBIT1(sc, STE_PHYCTL, x) /* * Sync the PHYs by setting data bit and strobing the clock 32 times. */ static void -ste_mii_sync(sc) - struct ste_softc *sc; +ste_mii_sync(struct ste_softc *sc) { - register int i; + int i; MII_SET(STE_PHYCTL_MDIR|STE_PHYCTL_MDATA); @@ -213,20 +208,15 @@ ste_mii_sync(sc) MII_CLR(STE_PHYCTL_MCLK); DELAY(1); } - - return; } /* * Clock a series of bits through the MII. */ static void -ste_mii_send(sc, bits, cnt) - struct ste_softc *sc; - u_int32_t bits; - int cnt; +ste_mii_send(struct ste_softc *sc, uint32_t bits, int cnt) { - int i; + int i; MII_CLR(STE_PHYCTL_MCLK); @@ -247,12 +237,9 @@ ste_mii_send(sc, bits, cnt) * Read an PHY register through the MII. */ static int -ste_mii_readreg(sc, frame) - struct ste_softc *sc; - struct ste_mii_frame *frame; - +ste_mii_readreg(struct ste_softc *sc, struct ste_mii_frame *frame) { - int i, ack; + int i, ack; /* * Set up frame for RX. @@ -261,7 +248,7 @@ ste_mii_readreg(sc, frame) frame->mii_opcode = STE_MII_READOP; frame->mii_turnaround = 0; frame->mii_data = 0; - + CSR_WRITE_2(sc, STE_PHYCTL, 0); /* * Turn on data xmit. @@ -299,7 +286,7 @@ ste_mii_readreg(sc, frame) * need to clock through 16 cycles to keep the PHY(s) in sync. */ if (ack) { - for(i = 0; i < 16; i++) { + for (i = 0; i < 16; i++) { MII_CLR(STE_PHYCTL_MCLK); DELAY(1); MII_SET(STE_PHYCTL_MCLK); @@ -328,18 +315,15 @@ fail: DELAY(1); if (ack) - return(1); - return(0); + return (1); + return (0); } /* * Write to a PHY register through the MII. */ static int -ste_mii_writereg(sc, frame) - struct ste_softc *sc; - struct ste_mii_frame *frame; - +ste_mii_writereg(struct ste_softc *sc, struct ste_mii_frame *frame) { /* @@ -349,7 +333,7 @@ ste_mii_writereg(sc, frame) frame->mii_stdelim = STE_MII_STARTDELIM; frame->mii_opcode = STE_MII_WRITEOP; frame->mii_turnaround = STE_MII_TURNAROUND; - + /* * Turn on data output. */ @@ -375,20 +359,18 @@ ste_mii_writereg(sc, frame) */ MII_CLR(STE_PHYCTL_MDIR); - return(0); + return (0); } static int -ste_miibus_readreg(dev, phy, reg) - device_t dev; - int phy, reg; +ste_miibus_readreg(device_t dev, int phy, int reg) { - struct ste_softc *sc; - struct ste_mii_frame frame; + struct ste_softc *sc; + struct ste_mii_frame frame; sc = device_get_softc(dev); - if ( sc->ste_one_phy && phy != 0 ) + if ((sc->ste_flags & STE_FLAG_ONE_PHY) != 0 && phy != 0) return (0); bzero((char *)&frame, sizeof(frame)); @@ -397,16 +379,14 @@ ste_miibus_readreg(dev, phy, reg) frame.mii_regaddr = reg; ste_mii_readreg(sc, &frame); - return(frame.mii_data); + return (frame.mii_data); } static int -ste_miibus_writereg(dev, phy, reg, data) - device_t dev; - int phy, reg, data; +ste_miibus_writereg(device_t dev, int phy, int reg, int data) { - struct ste_softc *sc; - struct ste_mii_frame frame; + struct ste_softc *sc; + struct ste_mii_frame frame; sc = device_get_softc(dev); bzero((char *)&frame, sizeof(frame)); @@ -417,97 +397,114 @@ ste_miibus_writereg(dev, phy, reg, data) ste_mii_writereg(sc, &frame); - return(0); + return (0); } static void -ste_miibus_statchg(dev) - device_t dev; +ste_miibus_statchg(device_t dev) { - struct ste_softc *sc; - struct mii_data *mii; + struct ste_softc *sc; + struct mii_data *mii; + struct ifnet *ifp; + uint16_t cfg; sc = device_get_softc(dev); mii = device_get_softc(sc->ste_miibus); + ifp = sc->ste_ifp; + if (mii == NULL || ifp == NULL || + (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; - if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) { - STE_SETBIT2(sc, STE_MACCTL0, STE_MACCTL0_FULLDUPLEX); - } else { - STE_CLRBIT2(sc, STE_MACCTL0, STE_MACCTL0_FULLDUPLEX); + sc->ste_flags &= ~STE_FLAG_LINK; + if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == + (IFM_ACTIVE | IFM_AVALID)) { + switch (IFM_SUBTYPE(mii->mii_media_active)) { + case IFM_10_T: + case IFM_100_TX: + case IFM_100_FX: + case IFM_100_T4: + sc->ste_flags |= STE_FLAG_LINK; + default: + break; + } } - return; + /* Program MACs with resolved speed/duplex/flow-control. */ + if ((sc->ste_flags & STE_FLAG_LINK) != 0) { + cfg = CSR_READ_2(sc, STE_MACCTL0); + cfg &= ~(STE_MACCTL0_FLOWCTL_ENABLE | STE_MACCTL0_FULLDUPLEX); + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) { + /* + * ST201 data sheet says driver should enable receiving + * MAC control frames bit of receive mode register to + * receive flow-control frames but the register has no + * such bits. In addition the controller has no ability + * to send pause frames so it should be handled in + * driver. Implementing pause timer handling in driver + * layer is not trivial, so don't enable flow-control + * here. + */ + cfg |= STE_MACCTL0_FULLDUPLEX; + } + CSR_WRITE_2(sc, STE_MACCTL0, cfg); + } } - + static int -ste_ifmedia_upd(ifp) - struct ifnet *ifp; +ste_ifmedia_upd(struct ifnet *ifp) { - struct ste_softc *sc; + struct ste_softc *sc; + struct mii_data *mii; + struct mii_softc *miisc; + int error; sc = ifp->if_softc; STE_LOCK(sc); - ste_ifmedia_upd_locked(ifp); - STE_UNLOCK(sc); - - return(0); -} - -static void -ste_ifmedia_upd_locked(ifp) - struct ifnet *ifp; -{ - struct ste_softc *sc; - struct mii_data *mii; - - sc = ifp->if_softc; - STE_LOCK_ASSERT(sc); mii = device_get_softc(sc->ste_miibus); - sc->ste_link = 0; if (mii->mii_instance) { - struct mii_softc *miisc; LIST_FOREACH(miisc, &mii->mii_phys, mii_list) mii_phy_reset(miisc); } - mii_mediachg(mii); + error = mii_mediachg(mii); + STE_UNLOCK(sc); + + return (error); } static void -ste_ifmedia_sts(ifp, ifmr) - struct ifnet *ifp; - struct ifmediareq *ifmr; +ste_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) { - struct ste_softc *sc; - struct mii_data *mii; + struct ste_softc *sc; + struct mii_data *mii; sc = ifp->if_softc; mii = device_get_softc(sc->ste_miibus); STE_LOCK(sc); + if ((ifp->if_flags & IFF_UP) == 0) { + STE_UNLOCK(sc); + return; + } mii_pollstat(mii); ifmr->ifm_active = mii->mii_media_active; ifmr->ifm_status = mii->mii_media_status; STE_UNLOCK(sc); - - return; } static void -ste_wait(sc) - struct ste_softc *sc; +ste_wait(struct ste_softc *sc) { - register int i; + int i; for (i = 0; i < STE_TIMEOUT; i++) { if (!(CSR_READ_4(sc, STE_DMACTL) & STE_DMACTL_DMA_HALTINPROG)) break; + DELAY(1); } if (i == STE_TIMEOUT) device_printf(sc->ste_dev, "command never completed!\n"); - - return; } /* @@ -515,10 +512,9 @@ ste_wait(sc) * it a command. */ static int -ste_eeprom_wait(sc) - struct ste_softc *sc; +ste_eeprom_wait(struct ste_softc *sc) { - int i; + int i; DELAY(1000); @@ -531,10 +527,10 @@ ste_eeprom_wait(sc) if (i == 100) { device_printf(sc->ste_dev, "eeprom failed to come ready\n"); - return(1); + return (1); } - return(0); + return (0); } /* @@ -542,58 +538,53 @@ ste_eeprom_wait(sc) * data is stored in the EEPROM in network byte order. */ static int -ste_read_eeprom(sc, dest, off, cnt, swap) - struct ste_softc *sc; - caddr_t dest; - int off; - int cnt; - int swap; +ste_read_eeprom(struct ste_softc *sc, uint16_t *dest, int off, int cnt) { - int err = 0, i; - u_int16_t word = 0, *ptr; + int err = 0, i; if (ste_eeprom_wait(sc)) - return(1); + return (1); for (i = 0; i < cnt; i++) { CSR_WRITE_2(sc, STE_EEPROM_CTL, STE_EEOPCODE_READ | (off + i)); err = ste_eeprom_wait(sc); if (err) break; - word = CSR_READ_2(sc, STE_EEPROM_DATA); - ptr = (u_int16_t *)(dest + (i * 2)); - if (swap) - *ptr = ntohs(word); - else - *ptr = word; + *dest = le16toh(CSR_READ_2(sc, STE_EEPROM_DATA)); + dest++; } - return(err ? 1 : 0); + return (err ? 1 : 0); } static void -ste_setmulti(sc) - struct ste_softc *sc; +ste_rxfilter(struct ste_softc *sc) { - struct ifnet *ifp; - int h = 0; - u_int32_t hashes[2] = { 0, 0 }; - struct ifmultiaddr *ifma; + struct ifnet *ifp; + struct ifmultiaddr *ifma; + uint32_t hashes[2] = { 0, 0 }; + uint8_t rxcfg; + int h; + + STE_LOCK_ASSERT(sc); ifp = sc->ste_ifp; - if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { - STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_ALLMULTI); - STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_MULTIHASH); - return; + rxcfg = CSR_READ_1(sc, STE_RX_MODE); + rxcfg |= STE_RXMODE_UNICAST; + rxcfg &= ~(STE_RXMODE_ALLMULTI | STE_RXMODE_MULTIHASH | + STE_RXMODE_BROADCAST | STE_RXMODE_PROMISC); + if (ifp->if_flags & IFF_BROADCAST) + rxcfg |= STE_RXMODE_BROADCAST; + if ((ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) != 0) { + if ((ifp->if_flags & IFF_ALLMULTI) != 0) + rxcfg |= STE_RXMODE_ALLMULTI; + if ((ifp->if_flags & IFF_PROMISC) != 0) + rxcfg |= STE_RXMODE_PROMISC; + goto chipit; } - /* first, zot all the existing hash bits */ - CSR_WRITE_2(sc, STE_MAR0, 0); - CSR_WRITE_2(sc, STE_MAR1, 0); - CSR_WRITE_2(sc, STE_MAR2, 0); - CSR_WRITE_2(sc, STE_MAR3, 0); - - /* now program new ones */ + rxcfg |= STE_RXMODE_MULTIHASH; + /* Now program new ones. */ if_maddr_rlock(ifp); TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) @@ -607,14 +598,13 @@ ste_setmulti(sc) } if_maddr_runlock(ifp); +chipit: CSR_WRITE_2(sc, STE_MAR0, hashes[0] & 0xFFFF); CSR_WRITE_2(sc, STE_MAR1, (hashes[0] >> 16) & 0xFFFF); CSR_WRITE_2(sc, STE_MAR2, hashes[1] & 0xFFFF); CSR_WRITE_2(sc, STE_MAR3, (hashes[1] >> 16) & 0xFFFF); - STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_ALLMULTI); - STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_MULTIHASH); - - return; + CSR_WRITE_1(sc, STE_RX_MODE, rxcfg); + CSR_READ_1(sc, STE_RX_MODE); } #ifdef DEVICE_POLLING @@ -641,32 +631,22 @@ ste_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count) STE_LOCK_ASSERT(sc); - sc->rxcycles = count; - if (cmd == POLL_AND_CHECK_STATUS) - ste_rxeoc(sc); - rx_npkts = ste_rxeof(sc); + rx_npkts = ste_rxeof(sc, count); ste_txeof(sc); + ste_txeoc(sc); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) ste_start_locked(ifp); if (cmd == POLL_AND_CHECK_STATUS) { - u_int16_t status; + uint16_t status; status = CSR_READ_2(sc, STE_ISR_ACK); - if (status & STE_ISR_TX_DONE) - ste_txeoc(sc); - - if (status & STE_ISR_STATS_OFLOW) { - callout_stop(&sc->ste_stat_callout); + if (status & STE_ISR_STATS_OFLOW) ste_stats_update(sc); - } - - if (status & STE_ISR_LINKEVENT) - mii_pollstat(device_get_softc(sc->ste_miibus)); if (status & STE_ISR_HOSTERR) { - ste_reset(sc); + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; ste_init_locked(sc); } } @@ -675,12 +655,11 @@ ste_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count) #endif /* DEVICE_POLLING */ static void -ste_intr(xsc) - void *xsc; +ste_intr(void *xsc) { - struct ste_softc *sc; - struct ifnet *ifp; - u_int16_t status; + struct ste_softc *sc; + struct ifnet *ifp; + uint16_t intrs, status; sc = xsc; STE_LOCK(sc); @@ -692,77 +671,68 @@ ste_intr(xsc) return; } #endif - - /* See if this is really our interrupt. */ - if (!(CSR_READ_2(sc, STE_ISR) & STE_ISR_INTLATCH)) { + /* Reading STE_ISR_ACK clears STE_IMR register. */ + status = CSR_READ_2(sc, STE_ISR_ACK); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { STE_UNLOCK(sc); return; } - for (;;) { - status = CSR_READ_2(sc, STE_ISR_ACK); + intrs = STE_INTRS; + if (status == 0xFFFF || (status & intrs) == 0) + goto done; - if (!(status & STE_INTRS)) - break; + if (sc->ste_int_rx_act > 0) { + status &= ~STE_ISR_RX_DMADONE; + intrs &= ~STE_IMR_RX_DMADONE; + } - if (status & STE_ISR_RX_DMADONE) { - ste_rxeoc(sc); - ste_rxeof(sc); + if ((status & (STE_ISR_SOFTINTR | STE_ISR_RX_DMADONE)) != 0) { + ste_rxeof(sc, -1); + /* + * The controller has no ability to Rx interrupt + * moderation feature. Receiving 64 bytes frames + * from wire generates too many interrupts which in + * turn make system useless to process other useful + * things. Fortunately ST201 supports single shot + * timer so use the timer to implement Rx interrupt + * moderation in driver. This adds more register + * access but it greatly reduces number of Rx + * interrupts under high network load. + */ + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 && + (sc->ste_int_rx_mod != 0)) { + if ((status & STE_ISR_RX_DMADONE) != 0) { + CSR_WRITE_2(sc, STE_COUNTDOWN, + STE_TIMER_USECS(sc->ste_int_rx_mod)); + intrs &= ~STE_IMR_RX_DMADONE; + sc->ste_int_rx_act = 1; + } else { + intrs |= STE_IMR_RX_DMADONE; + sc->ste_int_rx_act = 0; + } } - - if (status & STE_ISR_TX_DMADONE) + } + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + if ((status & STE_ISR_TX_DMADONE) != 0) ste_txeof(sc); - - if (status & STE_ISR_TX_DONE) + if ((status & STE_ISR_TX_DONE) != 0) ste_txeoc(sc); - - if (status & STE_ISR_STATS_OFLOW) { - callout_stop(&sc->ste_stat_callout); + if ((status & STE_ISR_STATS_OFLOW) != 0) ste_stats_update(sc); - } - - if (status & STE_ISR_LINKEVENT) - mii_pollstat(device_get_softc(sc->ste_miibus)); - - - if (status & STE_ISR_HOSTERR) { - ste_reset(sc); + if ((status & STE_ISR_HOSTERR) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; ste_init_locked(sc); + STE_UNLOCK(sc); + return; } + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + ste_start_locked(ifp); +done: + /* Re-enable interrupts */ + CSR_WRITE_2(sc, STE_IMR, intrs); } - - /* Re-enable interrupts */ - CSR_WRITE_2(sc, STE_IMR, STE_INTRS); - - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - ste_start_locked(ifp); - STE_UNLOCK(sc); - - return; -} - -static void -ste_rxeoc(struct ste_softc *sc) -{ - struct ste_chain_onefrag *cur_rx; - - STE_LOCK_ASSERT(sc); - - if (sc->ste_cdata.ste_rx_head->ste_ptr->ste_status == 0) { - cur_rx = sc->ste_cdata.ste_rx_head; - do { - cur_rx = cur_rx->ste_next; - /* If the ring is empty, just return. */ - if (cur_rx == sc->ste_cdata.ste_rx_head) - return; - } while (cur_rx->ste_ptr->ste_status == 0); - if (sc->ste_cdata.ste_rx_head->ste_ptr->ste_status == 0) { - /* We've fallen behind the chip: catch it. */ - sc->ste_cdata.ste_rx_head = cur_rx; - ++ste_rxsyncs; - } - } } /* @@ -770,35 +740,35 @@ ste_rxeoc(struct ste_softc *sc) * the higher level protocols. */ static int -ste_rxeof(sc) - struct ste_softc *sc; +ste_rxeof(struct ste_softc *sc, int count) { - struct mbuf *m; - struct ifnet *ifp; - struct ste_chain_onefrag *cur_rx; - int total_len = 0, count=0, rx_npkts = 0; - u_int32_t rxstat; - - STE_LOCK_ASSERT(sc); + struct mbuf *m; + struct ifnet *ifp; + struct ste_chain_onefrag *cur_rx; + uint32_t rxstat; + int total_len, rx_npkts; ifp = sc->ste_ifp; - while((rxstat = sc->ste_cdata.ste_rx_head->ste_ptr->ste_status) - & STE_RXSTAT_DMADONE) { + bus_dmamap_sync(sc->ste_cdata.ste_rx_list_tag, + sc->ste_cdata.ste_rx_list_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + cur_rx = sc->ste_cdata.ste_rx_head; + for (rx_npkts = 0; rx_npkts < STE_RX_LIST_CNT; rx_npkts++, + cur_rx = cur_rx->ste_next) { + rxstat = le32toh(cur_rx->ste_ptr->ste_status); + if ((rxstat & STE_RXSTAT_DMADONE) == 0) + break; #ifdef DEVICE_POLLING if (ifp->if_capenable & IFCAP_POLLING) { - if (sc->rxcycles <= 0) + if (count == 0) break; - sc->rxcycles--; + count--; } #endif - if ((STE_RX_LIST_CNT - count) < 3) { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) break; - } - - cur_rx = sc->ste_cdata.ste_rx_head; - sc->ste_cdata.ste_rx_head = cur_rx->ste_next; - /* * If an error occurs, update stats, clear the * status word and leave the mbuf cluster in place: @@ -811,22 +781,9 @@ ste_rxeof(sc) continue; } - /* - * If there error bit was not set, the upload complete - * bit should be set which means we have a valid packet. - * If not, something truly strange has happened. - */ - if (!(rxstat & STE_RXSTAT_DMADONE)) { - device_printf(sc->ste_dev, - "bad receive status -- packet dropped\n"); - ifp->if_ierrors++; - cur_rx->ste_ptr->ste_status = 0; - continue; - } - - /* No errors; receive the packet. */ + /* No errors; receive the packet. */ m = cur_rx->ste_mbuf; - total_len = cur_rx->ste_ptr->ste_status & STE_RXSTAT_FRAMELEN; + total_len = STE_RX_BYTES(rxstat); /* * Try to conjure up a new mbuf cluster. If that @@ -835,8 +792,8 @@ ste_rxeof(sc) * result in a lost packet, but there's little else we * can do in this situation. */ - if (ste_newbuf(sc, cur_rx, NULL) == ENOBUFS) { - ifp->if_ierrors++; + if (ste_newbuf(sc, cur_rx) != 0) { + ifp->if_iqdrops++; cur_rx->ste_ptr->ste_status = 0; continue; } @@ -848,137 +805,239 @@ ste_rxeof(sc) STE_UNLOCK(sc); (*ifp->if_input)(ifp, m); STE_LOCK(sc); + } - cur_rx->ste_ptr->ste_status = 0; - count++; - rx_npkts++; + if (rx_npkts > 0) { + sc->ste_cdata.ste_rx_head = cur_rx; + bus_dmamap_sync(sc->ste_cdata.ste_rx_list_tag, + sc->ste_cdata.ste_rx_list_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); } return (rx_npkts); } static void -ste_txeoc(sc) - struct ste_softc *sc; +ste_txeoc(struct ste_softc *sc) { - u_int8_t txstat; - struct ifnet *ifp; + uint16_t txstat; + struct ifnet *ifp; + + STE_LOCK_ASSERT(sc); ifp = sc->ste_ifp; - while ((txstat = CSR_READ_1(sc, STE_TX_STATUS)) & - STE_TXSTATUS_TXDONE) { - if (txstat & STE_TXSTATUS_UNDERRUN || - txstat & STE_TXSTATUS_EXCESSCOLLS || - txstat & STE_TXSTATUS_RECLAIMERR) { + /* + * STE_TX_STATUS register implements a queue of up to 31 + * transmit status byte. Writing an arbitrary value to the + * register will advance the queue to the next transmit + * status byte. This means if driver does not read + * STE_TX_STATUS register after completing sending more + * than 31 frames the controller would be stalled so driver + * should re-wake the Tx MAC. This is the most severe + * limitation of ST201 based controller. + */ + for (;;) { + txstat = CSR_READ_2(sc, STE_TX_STATUS); + if ((txstat & STE_TXSTATUS_TXDONE) == 0) + break; + if ((txstat & (STE_TXSTATUS_UNDERRUN | + STE_TXSTATUS_EXCESSCOLLS | STE_TXSTATUS_RECLAIMERR | + STE_TXSTATUS_STATSOFLOW)) != 0) { ifp->if_oerrors++; - device_printf(sc->ste_dev, - "transmission error: %x\n", txstat); - - ste_reset(sc); - ste_init_locked(sc); - - if (txstat & STE_TXSTATUS_UNDERRUN && +#ifdef STE_SHOW_TXERRORS + device_printf(sc->ste_dev, "TX error : 0x%b\n", + txstat & 0xFF, STE_ERR_BITS); +#endif + if ((txstat & STE_TXSTATUS_UNDERRUN) != 0 && sc->ste_tx_thresh < STE_PACKET_SIZE) { sc->ste_tx_thresh += STE_MIN_FRAMELEN; + if (sc->ste_tx_thresh > STE_PACKET_SIZE) + sc->ste_tx_thresh = STE_PACKET_SIZE; device_printf(sc->ste_dev, - "tx underrun, increasing tx" + "TX underrun, increasing TX" " start threshold to %d bytes\n", sc->ste_tx_thresh); + /* Make sure to disable active DMA cycles. */ + STE_SETBIT4(sc, STE_DMACTL, + STE_DMACTL_TXDMA_STALL); + ste_wait(sc); + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + ste_init_locked(sc); + break; } - CSR_WRITE_2(sc, STE_TX_STARTTHRESH, sc->ste_tx_thresh); - CSR_WRITE_2(sc, STE_TX_RECLAIM_THRESH, - (STE_PACKET_SIZE >> 4)); + /* Restart Tx. */ + ste_restart_tx(sc); } - ste_init_locked(sc); + /* + * Advance to next status and ACK TxComplete + * interrupt. ST201 data sheet was wrong here, to + * get next Tx status, we have to write both + * STE_TX_STATUS and STE_TX_FRAMEID register. + * Otherwise controller returns the same status + * as well as not acknowledge Tx completion + * interrupt. + */ CSR_WRITE_2(sc, STE_TX_STATUS, txstat); } - - return; } static void -ste_txeof(sc) - struct ste_softc *sc; +ste_tick(void *arg) { - struct ste_chain *cur_tx; - struct ifnet *ifp; - int idx; + struct ste_softc *sc; + struct mii_data *mii; + + sc = (struct ste_softc *)arg; + + STE_LOCK_ASSERT(sc); + + mii = device_get_softc(sc->ste_miibus); + mii_tick(mii); + /* + * ukphy(4) does not seem to generate CB that reports + * resolved link state so if we know we lost a link, + * explicitly check the link state. + */ + if ((sc->ste_flags & STE_FLAG_LINK) == 0) + ste_miibus_statchg(sc->ste_dev); + /* + * Because we are not generating Tx completion + * interrupt for every frame, reclaim transmitted + * buffers here. + */ + ste_txeof(sc); + ste_txeoc(sc); + ste_stats_update(sc); + ste_watchdog(sc); + callout_reset(&sc->ste_callout, hz, ste_tick, sc); +} + +static void +ste_txeof(struct ste_softc *sc) +{ + struct ifnet *ifp; + struct ste_chain *cur_tx; + uint32_t txstat; + int idx; + + STE_LOCK_ASSERT(sc); ifp = sc->ste_ifp; - idx = sc->ste_cdata.ste_tx_cons; - while(idx != sc->ste_cdata.ste_tx_prod) { + if (idx == sc->ste_cdata.ste_tx_prod) + return; + + bus_dmamap_sync(sc->ste_cdata.ste_tx_list_tag, + sc->ste_cdata.ste_tx_list_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + while (idx != sc->ste_cdata.ste_tx_prod) { cur_tx = &sc->ste_cdata.ste_tx_chain[idx]; - - if (!(cur_tx->ste_ptr->ste_ctl & STE_TXCTL_DMADONE)) + txstat = le32toh(cur_tx->ste_ptr->ste_ctl); + if ((txstat & STE_TXCTL_DMADONE) == 0) break; - + bus_dmamap_sync(sc->ste_cdata.ste_tx_tag, cur_tx->ste_map, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->ste_cdata.ste_tx_tag, cur_tx->ste_map); + KASSERT(cur_tx->ste_mbuf != NULL, + ("%s: freeing NULL mbuf!\n", __func__)); m_freem(cur_tx->ste_mbuf); cur_tx->ste_mbuf = NULL; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_opackets++; - + sc->ste_cdata.ste_tx_cnt--; STE_INC(idx, STE_TX_LIST_CNT); } sc->ste_cdata.ste_tx_cons = idx; - if (idx == sc->ste_cdata.ste_tx_prod) - ifp->if_timer = 0; + if (sc->ste_cdata.ste_tx_cnt == 0) + sc->ste_timer = 0; } static void -ste_stats_update(xsc) - void *xsc; +ste_stats_clear(struct ste_softc *sc) { - struct ste_softc *sc; - struct ifnet *ifp; - struct mii_data *mii; - sc = xsc; + STE_LOCK_ASSERT(sc); + + /* Rx stats. */ + CSR_READ_2(sc, STE_STAT_RX_OCTETS_LO); + CSR_READ_2(sc, STE_STAT_RX_OCTETS_HI); + CSR_READ_2(sc, STE_STAT_RX_FRAMES); + CSR_READ_1(sc, STE_STAT_RX_BCAST); + CSR_READ_1(sc, STE_STAT_RX_MCAST); + CSR_READ_1(sc, STE_STAT_RX_LOST); + /* Tx stats. */ + CSR_READ_2(sc, STE_STAT_TX_OCTETS_LO); + CSR_READ_2(sc, STE_STAT_TX_OCTETS_HI); + CSR_READ_2(sc, STE_STAT_TX_FRAMES); + CSR_READ_1(sc, STE_STAT_TX_BCAST); + CSR_READ_1(sc, STE_STAT_TX_MCAST); + CSR_READ_1(sc, STE_STAT_CARRIER_ERR); + CSR_READ_1(sc, STE_STAT_SINGLE_COLLS); + CSR_READ_1(sc, STE_STAT_MULTI_COLLS); + CSR_READ_1(sc, STE_STAT_LATE_COLLS); + CSR_READ_1(sc, STE_STAT_TX_DEFER); + CSR_READ_1(sc, STE_STAT_TX_EXDEFER); + CSR_READ_1(sc, STE_STAT_TX_ABORT); +} + +static void +ste_stats_update(struct ste_softc *sc) +{ + struct ifnet *ifp; + struct ste_hw_stats *stats; + uint32_t val; + STE_LOCK_ASSERT(sc); ifp = sc->ste_ifp; - mii = device_get_softc(sc->ste_miibus); - - ifp->if_collisions += CSR_READ_1(sc, STE_LATE_COLLS) - + CSR_READ_1(sc, STE_MULTI_COLLS) - + CSR_READ_1(sc, STE_SINGLE_COLLS); - - if (!sc->ste_link) { - mii_pollstat(mii); - if (mii->mii_media_status & IFM_ACTIVE && - IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { - sc->ste_link++; - /* - * we don't get a call-back on re-init so do it - * otherwise we get stuck in the wrong link state - */ - ste_miibus_statchg(sc->ste_dev); - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - ste_start_locked(ifp); - } - } - - callout_reset(&sc->ste_stat_callout, hz, ste_stats_update, sc); - - return; + stats = &sc->ste_stats; + /* Rx stats. */ + val = (uint32_t)CSR_READ_2(sc, STE_STAT_RX_OCTETS_LO) | + ((uint32_t)CSR_READ_2(sc, STE_STAT_RX_OCTETS_HI)) << 16; + val &= 0x000FFFFF; + stats->rx_bytes += val; + stats->rx_frames += CSR_READ_2(sc, STE_STAT_RX_FRAMES); + stats->rx_bcast_frames += CSR_READ_1(sc, STE_STAT_RX_BCAST); + stats->rx_mcast_frames += CSR_READ_1(sc, STE_STAT_RX_MCAST); + stats->rx_lost_frames += CSR_READ_1(sc, STE_STAT_RX_LOST); + /* Tx stats. */ + val = (uint32_t)CSR_READ_2(sc, STE_STAT_TX_OCTETS_LO) | + ((uint32_t)CSR_READ_2(sc, STE_STAT_TX_OCTETS_HI)) << 16; + val &= 0x000FFFFF; + stats->tx_bytes += val; + stats->tx_frames += CSR_READ_2(sc, STE_STAT_TX_FRAMES); + stats->tx_bcast_frames += CSR_READ_1(sc, STE_STAT_TX_BCAST); + stats->tx_mcast_frames += CSR_READ_1(sc, STE_STAT_TX_MCAST); + stats->tx_carrsense_errs += CSR_READ_1(sc, STE_STAT_CARRIER_ERR); + val = CSR_READ_1(sc, STE_STAT_SINGLE_COLLS); + stats->tx_single_colls += val; + ifp->if_collisions += val; + val = CSR_READ_1(sc, STE_STAT_MULTI_COLLS); + stats->tx_multi_colls += val; + ifp->if_collisions += val; + val += CSR_READ_1(sc, STE_STAT_LATE_COLLS); + stats->tx_late_colls += val; + ifp->if_collisions += val; + stats->tx_frames_defered += CSR_READ_1(sc, STE_STAT_TX_DEFER); + stats->tx_excess_defers += CSR_READ_1(sc, STE_STAT_TX_EXDEFER); + stats->tx_abort += CSR_READ_1(sc, STE_STAT_TX_ABORT); } - /* * Probe for a Sundance ST201 chip. Check the PCI vendor and device * IDs against our list and return a device name if we find a match. */ static int -ste_probe(dev) - device_t dev; +ste_probe(device_t dev) { - struct ste_type *t; + struct ste_type *t; t = ste_devs; - while(t->ste_name != NULL) { + while (t->ste_name != NULL) { if ((pci_get_vendor(dev) == t->ste_vid) && (pci_get_device(dev) == t->ste_did)) { device_set_desc(dev, t->ste_name); @@ -987,7 +1046,7 @@ ste_probe(dev) t++; } - return(ENXIO); + return (ENXIO); } /* @@ -995,13 +1054,12 @@ ste_probe(dev) * setup and ethernet/BPF attach. */ static int -ste_attach(dev) - device_t dev; +ste_attach(device_t dev) { - struct ste_softc *sc; - struct ifnet *ifp; - int error = 0, rid; - u_char eaddr[6]; + struct ste_softc *sc; + struct ifnet *ifp; + uint16_t eaddr[ETHER_ADDR_LEN / 2]; + int error = 0, pmc, rid; sc = device_get_softc(dev); sc->ste_dev = dev; @@ -1014,7 +1072,7 @@ ste_attach(dev) if (pci_get_vendor(dev) == DL_VENDORID && pci_get_device(dev) == DL_DEVICEID_DL10050 && pci_get_revid(dev) == 0x12 ) - sc->ste_one_phy = 1; + sc->ste_flags |= STE_FLAG_ONE_PHY; mtx_init(&sc->ste_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); @@ -1023,18 +1081,23 @@ ste_attach(dev) */ pci_enable_busmaster(dev); - rid = STE_RID; - sc->ste_res = bus_alloc_resource_any(dev, STE_RES, &rid, RF_ACTIVE); - + /* Prefer memory space register mapping over IO space. */ + sc->ste_res_id = PCIR_BAR(1); + sc->ste_res_type = SYS_RES_MEMORY; + sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type, + &sc->ste_res_id, RF_ACTIVE); + if (sc->ste_res == NULL) { + sc->ste_res_id = PCIR_BAR(0); + sc->ste_res_type = SYS_RES_IOPORT; + sc->ste_res = bus_alloc_resource_any(dev, sc->ste_res_type, + &sc->ste_res_id, RF_ACTIVE); + } if (sc->ste_res == NULL) { device_printf(dev, "couldn't map ports/memory\n"); error = ENXIO; goto fail; } - sc->ste_btag = rman_get_bustag(sc->ste_res); - sc->ste_bhandle = rman_get_bushandle(sc->ste_res); - /* Allocate interrupt */ rid = 0; sc->ste_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, @@ -1046,7 +1109,7 @@ ste_attach(dev) goto fail; } - callout_init_mtx(&sc->ste_stat_callout, &sc->ste_mtx, 0); + callout_init_mtx(&sc->ste_callout, &sc->ste_mtx, 0); /* Reset the adapter. */ ste_reset(sc); @@ -1054,24 +1117,15 @@ ste_attach(dev) /* * Get station address from the EEPROM. */ - if (ste_read_eeprom(sc, eaddr, - STE_EEADDR_NODE0, 3, 0)) { + if (ste_read_eeprom(sc, eaddr, STE_EEADDR_NODE0, ETHER_ADDR_LEN / 2)) { device_printf(dev, "failed to read station address\n"); - error = ENXIO;; - goto fail; - } - - /* Allocate the descriptor queues. */ - sc->ste_ldata = contigmalloc(sizeof(struct ste_list_data), M_DEVBUF, - M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0); - - if (sc->ste_ldata == NULL) { - device_printf(dev, "no memory for list buffers!\n"); error = ENXIO; goto fail; } + ste_sysctl_node(sc); - bzero(sc->ste_ldata, sizeof(struct ste_list_data)); + if ((error = ste_dma_alloc(sc)) != 0) + goto fail; ifp = sc->ste_ifp = if_alloc(IFT_ETHER); if (ifp == NULL) { @@ -1090,11 +1144,9 @@ ste_attach(dev) ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_mtu = ETHERMTU; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = ste_ioctl; ifp->if_start = ste_start; - ifp->if_watchdog = ste_watchdog; ifp->if_init = ste_init; IFQ_SET_MAXLEN(&ifp->if_snd, STE_TX_LIST_CNT - 1); ifp->if_snd.ifq_drv_maxlen = STE_TX_LIST_CNT - 1; @@ -1105,13 +1157,15 @@ ste_attach(dev) /* * Call MI attach routine. */ - ether_ifattach(ifp, eaddr); + ether_ifattach(ifp, (uint8_t *)eaddr); /* * Tell the upper layer(s) we support long frames. */ ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); ifp->if_capabilities |= IFCAP_VLAN_MTU; + if (pci_find_extcap(dev, PCIY_PMG, &pmc) == 0) + ifp->if_capabilities |= IFCAP_WOL_MAGIC; ifp->if_capenable = ifp->if_capabilities; #ifdef DEVICE_POLLING ifp->if_capabilities |= IFCAP_POLLING; @@ -1131,7 +1185,7 @@ fail: if (error) ste_detach(dev); - return(error); + return (error); } /* @@ -1142,11 +1196,10 @@ fail: * allocated. */ static int -ste_detach(dev) - device_t dev; +ste_detach(device_t dev) { - struct ste_softc *sc; - struct ifnet *ifp; + struct ste_softc *sc; + struct ifnet *ifp; sc = device_get_softc(dev); KASSERT(mtx_initialized(&sc->ste_mtx), ("ste mutex not initialized")); @@ -1159,11 +1212,11 @@ ste_detach(dev) /* These should only be active if attach succeeded */ if (device_is_attached(dev)) { + ether_ifdetach(ifp); STE_LOCK(sc); ste_stop(sc); STE_UNLOCK(sc); - callout_drain(&sc->ste_stat_callout); - ether_ifdetach(ifp); + callout_drain(&sc->ste_callout); } if (sc->ste_miibus) device_delete_child(dev, sc->ste_miibus); @@ -1174,123 +1227,411 @@ ste_detach(dev) if (sc->ste_irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->ste_irq); if (sc->ste_res) - bus_release_resource(dev, STE_RES, STE_RID, sc->ste_res); + bus_release_resource(dev, sc->ste_res_type, sc->ste_res_id, + sc->ste_res); if (ifp) if_free(ifp); - if (sc->ste_ldata) { - contigfree(sc->ste_ldata, sizeof(struct ste_list_data), - M_DEVBUF); - } - + ste_dma_free(sc); mtx_destroy(&sc->ste_mtx); - return(0); + return (0); +} + +struct ste_dmamap_arg { + bus_addr_t ste_busaddr; +}; + +static void +ste_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + struct ste_dmamap_arg *ctx; + + if (error != 0) + return; + + KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs)); + + ctx = (struct ste_dmamap_arg *)arg; + ctx->ste_busaddr = segs[0].ds_addr; } static int -ste_newbuf(sc, c, m) - struct ste_softc *sc; - struct ste_chain_onefrag *c; - struct mbuf *m; +ste_dma_alloc(struct ste_softc *sc) { - struct mbuf *m_new = NULL; + struct ste_chain *txc; + struct ste_chain_onefrag *rxc; + struct ste_dmamap_arg ctx; + int error, i; - if (m == NULL) { - MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) - return(ENOBUFS); - MCLGET(m_new, M_DONTWAIT); - if (!(m_new->m_flags & M_EXT)) { - m_freem(m_new); - return(ENOBUFS); - } - m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; - } else { - m_new = m; - m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; - m_new->m_data = m_new->m_ext.ext_buf; + /* Create parent DMA tag. */ + error = bus_dma_tag_create( + bus_get_dma_tag(sc->ste_dev), /* parent */ + 1, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ + 0, /* nsegments */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->ste_cdata.ste_parent_tag); + if (error != 0) { + device_printf(sc->ste_dev, + "could not create parent DMA tag.\n"); + goto fail; } - m_adj(m_new, ETHER_ALIGN); + /* Create DMA tag for Tx descriptor list. */ + error = bus_dma_tag_create( + sc->ste_cdata.ste_parent_tag, /* parent */ + STE_DESC_ALIGN, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + STE_TX_LIST_SZ, /* maxsize */ + 1, /* nsegments */ + STE_TX_LIST_SZ, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->ste_cdata.ste_tx_list_tag); + if (error != 0) { + device_printf(sc->ste_dev, + "could not create Tx list DMA tag.\n"); + goto fail; + } - c->ste_mbuf = m_new; - c->ste_ptr->ste_status = 0; - c->ste_ptr->ste_frag.ste_addr = vtophys(mtod(m_new, caddr_t)); - c->ste_ptr->ste_frag.ste_len = (1536 + ETHER_VLAN_ENCAP_LEN) | STE_FRAG_LAST; + /* Create DMA tag for Rx descriptor list. */ + error = bus_dma_tag_create( + sc->ste_cdata.ste_parent_tag, /* parent */ + STE_DESC_ALIGN, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + STE_RX_LIST_SZ, /* maxsize */ + 1, /* nsegments */ + STE_RX_LIST_SZ, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->ste_cdata.ste_rx_list_tag); + if (error != 0) { + device_printf(sc->ste_dev, + "could not create Rx list DMA tag.\n"); + goto fail; + } - return(0); + /* Create DMA tag for Tx buffers. */ + error = bus_dma_tag_create( + sc->ste_cdata.ste_parent_tag, /* parent */ + 1, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MCLBYTES * STE_MAXFRAGS, /* maxsize */ + STE_MAXFRAGS, /* nsegments */ + MCLBYTES, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->ste_cdata.ste_tx_tag); + if (error != 0) { + device_printf(sc->ste_dev, "could not create Tx DMA tag.\n"); + goto fail; + } + + /* Create DMA tag for Rx buffers. */ + error = bus_dma_tag_create( + sc->ste_cdata.ste_parent_tag, /* parent */ + 1, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MCLBYTES, /* maxsize */ + 1, /* nsegments */ + MCLBYTES, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->ste_cdata.ste_rx_tag); + if (error != 0) { + device_printf(sc->ste_dev, "could not create Rx DMA tag.\n"); + goto fail; + } + + /* Allocate DMA'able memory and load the DMA map for Tx list. */ + error = bus_dmamem_alloc(sc->ste_cdata.ste_tx_list_tag, + (void **)&sc->ste_ldata.ste_tx_list, + BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_COHERENT, + &sc->ste_cdata.ste_tx_list_map); + if (error != 0) { + device_printf(sc->ste_dev, + "could not allocate DMA'able memory for Tx list.\n"); + goto fail; + } + ctx.ste_busaddr = 0; + error = bus_dmamap_load(sc->ste_cdata.ste_tx_list_tag, + sc->ste_cdata.ste_tx_list_map, sc->ste_ldata.ste_tx_list, + STE_TX_LIST_SZ, ste_dmamap_cb, &ctx, 0); + if (error != 0 || ctx.ste_busaddr == 0) { + device_printf(sc->ste_dev, + "could not load DMA'able memory for Tx list.\n"); + goto fail; + } + sc->ste_ldata.ste_tx_list_paddr = ctx.ste_busaddr; + + /* Allocate DMA'able memory and load the DMA map for Rx list. */ + error = bus_dmamem_alloc(sc->ste_cdata.ste_rx_list_tag, + (void **)&sc->ste_ldata.ste_rx_list, + BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_COHERENT, + &sc->ste_cdata.ste_rx_list_map); + if (error != 0) { + device_printf(sc->ste_dev, + "could not allocate DMA'able memory for Rx list.\n"); + goto fail; + } + ctx.ste_busaddr = 0; + error = bus_dmamap_load(sc->ste_cdata.ste_rx_list_tag, + sc->ste_cdata.ste_rx_list_map, sc->ste_ldata.ste_rx_list, + STE_RX_LIST_SZ, ste_dmamap_cb, &ctx, 0); + if (error != 0 || ctx.ste_busaddr == 0) { + device_printf(sc->ste_dev, + "could not load DMA'able memory for Rx list.\n"); + goto fail; + } + sc->ste_ldata.ste_rx_list_paddr = ctx.ste_busaddr; + + /* Create DMA maps for Tx buffers. */ + for (i = 0; i < STE_TX_LIST_CNT; i++) { + txc = &sc->ste_cdata.ste_tx_chain[i]; + txc->ste_ptr = NULL; + txc->ste_mbuf = NULL; + txc->ste_next = NULL; + txc->ste_phys = 0; + txc->ste_map = NULL; + error = bus_dmamap_create(sc->ste_cdata.ste_tx_tag, 0, + &txc->ste_map); + if (error != 0) { + device_printf(sc->ste_dev, + "could not create Tx dmamap.\n"); + goto fail; + } + } + /* Create DMA maps for Rx buffers. */ + if ((error = bus_dmamap_create(sc->ste_cdata.ste_rx_tag, 0, + &sc->ste_cdata.ste_rx_sparemap)) != 0) { + device_printf(sc->ste_dev, + "could not create spare Rx dmamap.\n"); + goto fail; + } + for (i = 0; i < STE_RX_LIST_CNT; i++) { + rxc = &sc->ste_cdata.ste_rx_chain[i]; + rxc->ste_ptr = NULL; + rxc->ste_mbuf = NULL; + rxc->ste_next = NULL; + rxc->ste_map = NULL; + error = bus_dmamap_create(sc->ste_cdata.ste_rx_tag, 0, + &rxc->ste_map); + if (error != 0) { + device_printf(sc->ste_dev, + "could not create Rx dmamap.\n"); + goto fail; + } + } + +fail: + return (error); +} + +static void +ste_dma_free(struct ste_softc *sc) +{ + struct ste_chain *txc; + struct ste_chain_onefrag *rxc; + int i; + + /* Tx buffers. */ + if (sc->ste_cdata.ste_tx_tag != NULL) { + for (i = 0; i < STE_TX_LIST_CNT; i++) { + txc = &sc->ste_cdata.ste_tx_chain[i]; + if (txc->ste_map != NULL) { + bus_dmamap_destroy(sc->ste_cdata.ste_tx_tag, + txc->ste_map); + txc->ste_map = NULL; + } + } + bus_dma_tag_destroy(sc->ste_cdata.ste_tx_tag); + sc->ste_cdata.ste_tx_tag = NULL; + } + /* Rx buffers. */ + if (sc->ste_cdata.ste_rx_tag != NULL) { + for (i = 0; i < STE_RX_LIST_CNT; i++) { + rxc = &sc->ste_cdata.ste_rx_chain[i]; + if (rxc->ste_map != NULL) { + bus_dmamap_destroy(sc->ste_cdata.ste_rx_tag, + rxc->ste_map); + rxc->ste_map = NULL; + } + } + if (sc->ste_cdata.ste_rx_sparemap != NULL) { + bus_dmamap_destroy(sc->ste_cdata.ste_rx_tag, + sc->ste_cdata.ste_rx_sparemap); + sc->ste_cdata.ste_rx_sparemap = NULL; + } + bus_dma_tag_destroy(sc->ste_cdata.ste_rx_tag); + sc->ste_cdata.ste_rx_tag = NULL; + } + /* Tx descriptor list. */ + if (sc->ste_cdata.ste_tx_list_tag != NULL) { + if (sc->ste_cdata.ste_tx_list_map != NULL) + bus_dmamap_unload(sc->ste_cdata.ste_tx_list_tag, + sc->ste_cdata.ste_tx_list_map); + if (sc->ste_cdata.ste_tx_list_map != NULL && + sc->ste_ldata.ste_tx_list != NULL) + bus_dmamem_free(sc->ste_cdata.ste_tx_list_tag, + sc->ste_ldata.ste_tx_list, + sc->ste_cdata.ste_tx_list_map); + sc->ste_ldata.ste_tx_list = NULL; + sc->ste_cdata.ste_tx_list_map = NULL; + bus_dma_tag_destroy(sc->ste_cdata.ste_tx_list_tag); + sc->ste_cdata.ste_tx_list_tag = NULL; + } + /* Rx descriptor list. */ + if (sc->ste_cdata.ste_rx_list_tag != NULL) { + if (sc->ste_cdata.ste_rx_list_map != NULL) + bus_dmamap_unload(sc->ste_cdata.ste_rx_list_tag, + sc->ste_cdata.ste_rx_list_map); + if (sc->ste_cdata.ste_rx_list_map != NULL && + sc->ste_ldata.ste_rx_list != NULL) + bus_dmamem_free(sc->ste_cdata.ste_rx_list_tag, + sc->ste_ldata.ste_rx_list, + sc->ste_cdata.ste_rx_list_map); + sc->ste_ldata.ste_rx_list = NULL; + sc->ste_cdata.ste_rx_list_map = NULL; + bus_dma_tag_destroy(sc->ste_cdata.ste_rx_list_tag); + sc->ste_cdata.ste_rx_list_tag = NULL; + } + if (sc->ste_cdata.ste_parent_tag != NULL) { + bus_dma_tag_destroy(sc->ste_cdata.ste_parent_tag); + sc->ste_cdata.ste_parent_tag = NULL; + } } static int -ste_init_rx_list(sc) - struct ste_softc *sc; +ste_newbuf(struct ste_softc *sc, struct ste_chain_onefrag *rxc) { - struct ste_chain_data *cd; - struct ste_list_data *ld; - int i; + struct mbuf *m; + bus_dma_segment_t segs[1]; + bus_dmamap_t map; + int error, nsegs; + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) + return (ENOBUFS); + m->m_len = m->m_pkthdr.len = MCLBYTES; + m_adj(m, ETHER_ALIGN); + + if ((error = bus_dmamap_load_mbuf_sg(sc->ste_cdata.ste_rx_tag, + sc->ste_cdata.ste_rx_sparemap, m, segs, &nsegs, 0)) != 0) { + m_freem(m); + return (error); + } + KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs)); + + if (rxc->ste_mbuf != NULL) { + bus_dmamap_sync(sc->ste_cdata.ste_rx_tag, rxc->ste_map, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->ste_cdata.ste_rx_tag, rxc->ste_map); + } + map = rxc->ste_map; + rxc->ste_map = sc->ste_cdata.ste_rx_sparemap; + sc->ste_cdata.ste_rx_sparemap = map; + bus_dmamap_sync(sc->ste_cdata.ste_rx_tag, rxc->ste_map, + BUS_DMASYNC_PREREAD); + rxc->ste_mbuf = m; + rxc->ste_ptr->ste_status = 0; + rxc->ste_ptr->ste_frag.ste_addr = htole32(segs[0].ds_addr); + rxc->ste_ptr->ste_frag.ste_len = htole32(segs[0].ds_len | + STE_FRAG_LAST); + return (0); +} + +static int +ste_init_rx_list(struct ste_softc *sc) +{ + struct ste_chain_data *cd; + struct ste_list_data *ld; + int error, i; + + sc->ste_int_rx_act = 0; cd = &sc->ste_cdata; - ld = sc->ste_ldata; - + ld = &sc->ste_ldata; + bzero(ld->ste_rx_list, STE_RX_LIST_SZ); for (i = 0; i < STE_RX_LIST_CNT; i++) { cd->ste_rx_chain[i].ste_ptr = &ld->ste_rx_list[i]; - if (ste_newbuf(sc, &cd->ste_rx_chain[i], NULL) == ENOBUFS) - return(ENOBUFS); + error = ste_newbuf(sc, &cd->ste_rx_chain[i]); + if (error != 0) + return (error); if (i == (STE_RX_LIST_CNT - 1)) { - cd->ste_rx_chain[i].ste_next = - &cd->ste_rx_chain[0]; + cd->ste_rx_chain[i].ste_next = &cd->ste_rx_chain[0]; ld->ste_rx_list[i].ste_next = - vtophys(&ld->ste_rx_list[0]); + htole32(ld->ste_rx_list_paddr + + (sizeof(struct ste_desc_onefrag) * 0)); } else { - cd->ste_rx_chain[i].ste_next = - &cd->ste_rx_chain[i + 1]; + cd->ste_rx_chain[i].ste_next = &cd->ste_rx_chain[i + 1]; ld->ste_rx_list[i].ste_next = - vtophys(&ld->ste_rx_list[i + 1]); + htole32(ld->ste_rx_list_paddr + + (sizeof(struct ste_desc_onefrag) * (i + 1))); } - ld->ste_rx_list[i].ste_status = 0; } cd->ste_rx_head = &cd->ste_rx_chain[0]; + bus_dmamap_sync(sc->ste_cdata.ste_rx_list_tag, + sc->ste_cdata.ste_rx_list_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - return(0); + return (0); } static void -ste_init_tx_list(sc) - struct ste_softc *sc; +ste_init_tx_list(struct ste_softc *sc) { - struct ste_chain_data *cd; - struct ste_list_data *ld; - int i; + struct ste_chain_data *cd; + struct ste_list_data *ld; + int i; cd = &sc->ste_cdata; - ld = sc->ste_ldata; + ld = &sc->ste_ldata; + bzero(ld->ste_tx_list, STE_TX_LIST_SZ); for (i = 0; i < STE_TX_LIST_CNT; i++) { cd->ste_tx_chain[i].ste_ptr = &ld->ste_tx_list[i]; - cd->ste_tx_chain[i].ste_ptr->ste_next = 0; - cd->ste_tx_chain[i].ste_ptr->ste_ctl = 0; - cd->ste_tx_chain[i].ste_phys = vtophys(&ld->ste_tx_list[i]); - if (i == (STE_TX_LIST_CNT - 1)) - cd->ste_tx_chain[i].ste_next = - &cd->ste_tx_chain[0]; - else - cd->ste_tx_chain[i].ste_next = - &cd->ste_tx_chain[i + 1]; + cd->ste_tx_chain[i].ste_mbuf = NULL; + if (i == (STE_TX_LIST_CNT - 1)) { + cd->ste_tx_chain[i].ste_next = &cd->ste_tx_chain[0]; + cd->ste_tx_chain[i].ste_phys = htole32(STE_ADDR_LO( + ld->ste_tx_list_paddr + + (sizeof(struct ste_desc) * 0))); + } else { + cd->ste_tx_chain[i].ste_next = &cd->ste_tx_chain[i + 1]; + cd->ste_tx_chain[i].ste_phys = htole32(STE_ADDR_LO( + ld->ste_tx_list_paddr + + (sizeof(struct ste_desc) * (i + 1)))); + } } + cd->ste_last_tx = NULL; cd->ste_tx_prod = 0; cd->ste_tx_cons = 0; + cd->ste_tx_cnt = 0; - return; + bus_dmamap_sync(sc->ste_cdata.ste_tx_list_tag, + sc->ste_cdata.ste_tx_list_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); } static void -ste_init(xsc) - void *xsc; +ste_init(void *xsc) { - struct ste_softc *sc; + struct ste_softc *sc; sc = xsc; STE_LOCK(sc); @@ -1299,16 +1640,23 @@ ste_init(xsc) } static void -ste_init_locked(sc) - struct ste_softc *sc; +ste_init_locked(struct ste_softc *sc) { - int i; - struct ifnet *ifp; + struct ifnet *ifp; + struct mii_data *mii; + uint8_t val; + int i; STE_LOCK_ASSERT(sc); ifp = sc->ste_ifp; + mii = device_get_softc(sc->ste_miibus); + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + return; ste_stop(sc); + /* Reset the chip to a known state. */ + ste_reset(sc); /* Init our MAC address */ for (i = 0; i < ETHER_ADDR_LEN; i += 2) { @@ -1318,7 +1666,7 @@ ste_init_locked(sc) } /* Init RX list */ - if (ste_init_rx_list(sc) == ENOBUFS) { + if (ste_init_rx_list(sc) != 0) { device_printf(sc->ste_dev, "initialization failed: no memory for RX buffers\n"); ste_stop(sc); @@ -1331,6 +1679,12 @@ ste_init_locked(sc) /* Init TX descriptors */ ste_init_tx_list(sc); + /* Clear and disable WOL. */ + val = CSR_READ_1(sc, STE_WAKE_EVENT); + val &= ~(STE_WAKEEVENT_WAKEPKT_ENB | STE_WAKEEVENT_MAGICPKT_ENB | + STE_WAKEEVENT_LINKEVT_ENB | STE_WAKEEVENT_WAKEONLAN_ENB); + CSR_WRITE_1(sc, STE_WAKE_EVENT, val); + /* Set the TX freethresh value */ CSR_WRITE_1(sc, STE_TX_DMABURST_THRESH, STE_PACKET_SIZE >> 8); @@ -1340,34 +1694,21 @@ ste_init_locked(sc) /* Set the TX reclaim threshold. */ CSR_WRITE_1(sc, STE_TX_RECLAIM_THRESH, (STE_PACKET_SIZE >> 4)); + /* Accept VLAN length packets */ + CSR_WRITE_2(sc, STE_MAX_FRAMELEN, ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN); + /* Set up the RX filter. */ - CSR_WRITE_1(sc, STE_RX_MODE, STE_RXMODE_UNICAST); - - /* If we want promiscuous mode, set the allframes bit. */ - if (ifp->if_flags & IFF_PROMISC) { - STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_PROMISC); - } else { - STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_PROMISC); - } - - /* Set capture broadcast bit to accept broadcast frames. */ - if (ifp->if_flags & IFF_BROADCAST) { - STE_SETBIT1(sc, STE_RX_MODE, STE_RXMODE_BROADCAST); - } else { - STE_CLRBIT1(sc, STE_RX_MODE, STE_RXMODE_BROADCAST); - } - - ste_setmulti(sc); + ste_rxfilter(sc); /* Load the address of the RX list. */ STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_RXDMA_STALL); ste_wait(sc); CSR_WRITE_4(sc, STE_RX_DMALIST_PTR, - vtophys(&sc->ste_ldata->ste_rx_list[0])); + STE_ADDR_LO(sc->ste_ldata.ste_rx_list_paddr)); STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_RXDMA_UNSTALL); STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_RXDMA_UNSTALL); - /* Set TX polling interval (defer until we TX first packet */ + /* Set TX polling interval(defer until we TX first packet). */ CSR_WRITE_1(sc, STE_TX_DMAPOLL_PERIOD, 0); /* Load address of the TX list */ @@ -1377,7 +1718,9 @@ ste_init_locked(sc) STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL); STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL); ste_wait(sc); - sc->ste_tx_prev = NULL; + /* Select 3.2us timer. */ + STE_CLRBIT4(sc, STE_DMACTL, STE_DMACTL_COUNTDOWN_SPEED | + STE_DMACTL_COUNTDOWN_MODE); /* Enable receiver and transmitter */ CSR_WRITE_2(sc, STE_MACCTL0, 0); @@ -1387,153 +1730,183 @@ ste_init_locked(sc) /* Enable stats counters. */ STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_STATS_ENABLE); + /* Clear stats counters. */ + ste_stats_clear(sc); + CSR_WRITE_2(sc, STE_COUNTDOWN, 0); CSR_WRITE_2(sc, STE_ISR, 0xFFFF); #ifdef DEVICE_POLLING /* Disable interrupts if we are polling. */ if (ifp->if_capenable & IFCAP_POLLING) CSR_WRITE_2(sc, STE_IMR, 0); - else + else #endif /* Enable interrupts. */ CSR_WRITE_2(sc, STE_IMR, STE_INTRS); - /* Accept VLAN length packets */ - CSR_WRITE_2(sc, STE_MAX_FRAMELEN, ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN); - - ste_ifmedia_upd_locked(ifp); + sc->ste_flags &= ~STE_FLAG_LINK; + /* Switch to the current media. */ + mii_mediachg(mii); ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - callout_reset(&sc->ste_stat_callout, hz, ste_stats_update, sc); - - return; + callout_reset(&sc->ste_callout, hz, ste_tick, sc); } static void -ste_stop(sc) - struct ste_softc *sc; +ste_stop(struct ste_softc *sc) { - int i; - struct ifnet *ifp; + struct ifnet *ifp; + struct ste_chain_onefrag *cur_rx; + struct ste_chain *cur_tx; + uint32_t val; + int i; STE_LOCK_ASSERT(sc); ifp = sc->ste_ifp; - callout_stop(&sc->ste_stat_callout); + callout_stop(&sc->ste_callout); + sc->ste_timer = 0; ifp->if_drv_flags &= ~(IFF_DRV_RUNNING|IFF_DRV_OACTIVE); CSR_WRITE_2(sc, STE_IMR, 0); - STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_TX_DISABLE); - STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_RX_DISABLE); - STE_SETBIT2(sc, STE_MACCTL1, STE_MACCTL1_STATS_DISABLE); - STE_SETBIT2(sc, STE_DMACTL, STE_DMACTL_TXDMA_STALL); - STE_SETBIT2(sc, STE_DMACTL, STE_DMACTL_RXDMA_STALL); + CSR_WRITE_2(sc, STE_COUNTDOWN, 0); + /* Stop pending DMA. */ + val = CSR_READ_4(sc, STE_DMACTL); + val |= STE_DMACTL_TXDMA_STALL | STE_DMACTL_RXDMA_STALL; + CSR_WRITE_4(sc, STE_DMACTL, val); ste_wait(sc); - /* - * Try really hard to stop the RX engine or under heavy RX - * data chip will write into de-allocated memory. - */ - ste_reset(sc); - - sc->ste_link = 0; + /* Disable auto-polling. */ + CSR_WRITE_1(sc, STE_RX_DMAPOLL_PERIOD, 0); + CSR_WRITE_1(sc, STE_TX_DMAPOLL_PERIOD, 0); + /* Nullify DMA address to stop any further DMA. */ + CSR_WRITE_4(sc, STE_RX_DMALIST_PTR, 0); + CSR_WRITE_4(sc, STE_TX_DMALIST_PTR, 0); + /* Stop TX/RX MAC. */ + val = CSR_READ_2(sc, STE_MACCTL1); + val |= STE_MACCTL1_TX_DISABLE | STE_MACCTL1_RX_DISABLE | + STE_MACCTL1_STATS_DISABLE; + CSR_WRITE_2(sc, STE_MACCTL1, val); + for (i = 0; i < STE_TIMEOUT; i++) { + DELAY(10); + if ((CSR_READ_2(sc, STE_MACCTL1) & (STE_MACCTL1_TX_DISABLE | + STE_MACCTL1_RX_DISABLE | STE_MACCTL1_STATS_DISABLE)) == 0) + break; + } + if (i == STE_TIMEOUT) + device_printf(sc->ste_dev, "Stopping MAC timed out\n"); + /* Acknowledge any pending interrupts. */ + CSR_READ_2(sc, STE_ISR_ACK); + ste_stats_update(sc); for (i = 0; i < STE_RX_LIST_CNT; i++) { - if (sc->ste_cdata.ste_rx_chain[i].ste_mbuf != NULL) { - m_freem(sc->ste_cdata.ste_rx_chain[i].ste_mbuf); - sc->ste_cdata.ste_rx_chain[i].ste_mbuf = NULL; + cur_rx = &sc->ste_cdata.ste_rx_chain[i]; + if (cur_rx->ste_mbuf != NULL) { + bus_dmamap_sync(sc->ste_cdata.ste_rx_tag, + cur_rx->ste_map, BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->ste_cdata.ste_rx_tag, + cur_rx->ste_map); + m_freem(cur_rx->ste_mbuf); + cur_rx->ste_mbuf = NULL; } } for (i = 0; i < STE_TX_LIST_CNT; i++) { - if (sc->ste_cdata.ste_tx_chain[i].ste_mbuf != NULL) { - m_freem(sc->ste_cdata.ste_tx_chain[i].ste_mbuf); - sc->ste_cdata.ste_tx_chain[i].ste_mbuf = NULL; + cur_tx = &sc->ste_cdata.ste_tx_chain[i]; + if (cur_tx->ste_mbuf != NULL) { + bus_dmamap_sync(sc->ste_cdata.ste_tx_tag, + cur_tx->ste_map, BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->ste_cdata.ste_tx_tag, + cur_tx->ste_map); + m_freem(cur_tx->ste_mbuf); + cur_tx->ste_mbuf = NULL; } } - - bzero(sc->ste_ldata, sizeof(struct ste_list_data)); - - return; } static void -ste_reset(sc) - struct ste_softc *sc; +ste_reset(struct ste_softc *sc) { - int i; + uint32_t ctl; + int i; - STE_SETBIT4(sc, STE_ASICCTL, - STE_ASICCTL_GLOBAL_RESET|STE_ASICCTL_RX_RESET| - STE_ASICCTL_TX_RESET|STE_ASICCTL_DMA_RESET| - STE_ASICCTL_FIFO_RESET|STE_ASICCTL_NETWORK_RESET| - STE_ASICCTL_AUTOINIT_RESET|STE_ASICCTL_HOST_RESET| - STE_ASICCTL_EXTRESET_RESET); - - DELAY(100000); + ctl = CSR_READ_4(sc, STE_ASICCTL); + ctl |= STE_ASICCTL_GLOBAL_RESET | STE_ASICCTL_RX_RESET | + STE_ASICCTL_TX_RESET | STE_ASICCTL_DMA_RESET | + STE_ASICCTL_FIFO_RESET | STE_ASICCTL_NETWORK_RESET | + STE_ASICCTL_AUTOINIT_RESET |STE_ASICCTL_HOST_RESET | + STE_ASICCTL_EXTRESET_RESET; + CSR_WRITE_4(sc, STE_ASICCTL, ctl); + CSR_READ_4(sc, STE_ASICCTL); + /* + * Due to the need of accessing EEPROM controller can take + * up to 1ms to complete the global reset. + */ + DELAY(1000); for (i = 0; i < STE_TIMEOUT; i++) { if (!(CSR_READ_4(sc, STE_ASICCTL) & STE_ASICCTL_RESET_BUSY)) break; + DELAY(10); } if (i == STE_TIMEOUT) device_printf(sc->ste_dev, "global reset never completed\n"); +} - return; +static void +ste_restart_tx(struct ste_softc *sc) +{ + uint16_t mac; + int i; + + for (i = 0; i < STE_TIMEOUT; i++) { + mac = CSR_READ_2(sc, STE_MACCTL1); + mac |= STE_MACCTL1_TX_ENABLE; + CSR_WRITE_2(sc, STE_MACCTL1, mac); + mac = CSR_READ_2(sc, STE_MACCTL1); + if ((mac & STE_MACCTL1_TX_ENABLED) != 0) + break; + DELAY(10); + } + + if (i == STE_TIMEOUT) + device_printf(sc->ste_dev, "starting Tx failed"); } static int -ste_ioctl(ifp, command, data) - struct ifnet *ifp; - u_long command; - caddr_t data; +ste_ioctl(struct ifnet *ifp, u_long command, caddr_t data) { - struct ste_softc *sc; - struct ifreq *ifr; - struct mii_data *mii; - int error = 0; + struct ste_softc *sc; + struct ifreq *ifr; + struct mii_data *mii; + int error = 0, mask; sc = ifp->if_softc; ifr = (struct ifreq *)data; - switch(command) { + switch (command) { case SIOCSIFFLAGS: STE_LOCK(sc); - if (ifp->if_flags & IFF_UP) { - if (ifp->if_drv_flags & IFF_DRV_RUNNING && - ifp->if_flags & IFF_PROMISC && - !(sc->ste_if_flags & IFF_PROMISC)) { - STE_SETBIT1(sc, STE_RX_MODE, - STE_RXMODE_PROMISC); - } else if (ifp->if_drv_flags & IFF_DRV_RUNNING && - !(ifp->if_flags & IFF_PROMISC) && - sc->ste_if_flags & IFF_PROMISC) { - STE_CLRBIT1(sc, STE_RX_MODE, - STE_RXMODE_PROMISC); - } - if (ifp->if_drv_flags & IFF_DRV_RUNNING && - (ifp->if_flags ^ sc->ste_if_flags) & IFF_ALLMULTI) - ste_setmulti(sc); - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { - sc->ste_tx_thresh = STE_TXSTART_THRESH; + if ((ifp->if_flags & IFF_UP) != 0) { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 && + ((ifp->if_flags ^ sc->ste_if_flags) & + (IFF_PROMISC | IFF_ALLMULTI)) != 0) + ste_rxfilter(sc); + else ste_init_locked(sc); - } - } else { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - ste_stop(sc); - } + } else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + ste_stop(sc); sc->ste_if_flags = ifp->if_flags; STE_UNLOCK(sc); - error = 0; break; case SIOCADDMULTI: case SIOCDELMULTI: STE_LOCK(sc); - ste_setmulti(sc); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + ste_rxfilter(sc); STE_UNLOCK(sc); - error = 0; break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: @@ -1541,95 +1914,107 @@ ste_ioctl(ifp, command, data) error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command); break; case SIOCSIFCAP: + STE_LOCK(sc); + mask = ifr->ifr_reqcap ^ ifp->if_capenable; #ifdef DEVICE_POLLING - if (ifr->ifr_reqcap & IFCAP_POLLING && - !(ifp->if_capenable & IFCAP_POLLING)) { - error = ether_poll_register(ste_poll, ifp); - if (error) - return(error); - STE_LOCK(sc); - /* Disable interrupts */ - CSR_WRITE_2(sc, STE_IMR, 0); - ifp->if_capenable |= IFCAP_POLLING; - STE_UNLOCK(sc); - return (error); - - } - if (!(ifr->ifr_reqcap & IFCAP_POLLING) && - ifp->if_capenable & IFCAP_POLLING) { - error = ether_poll_deregister(ifp); - /* Enable interrupts. */ - STE_LOCK(sc); - CSR_WRITE_2(sc, STE_IMR, STE_INTRS); - ifp->if_capenable &= ~IFCAP_POLLING; - STE_UNLOCK(sc); - return (error); + if ((mask & IFCAP_POLLING) != 0 && + (IFCAP_POLLING & ifp->if_capabilities) != 0) { + ifp->if_capenable ^= IFCAP_POLLING; + if ((IFCAP_POLLING & ifp->if_capenable) != 0) { + error = ether_poll_register(ste_poll, ifp); + if (error != 0) { + STE_UNLOCK(sc); + break; + } + /* Disable interrupts. */ + CSR_WRITE_2(sc, STE_IMR, 0); + } else { + error = ether_poll_deregister(ifp); + /* Enable interrupts. */ + CSR_WRITE_2(sc, STE_IMR, STE_INTRS); + } } #endif /* DEVICE_POLLING */ + if ((mask & IFCAP_WOL_MAGIC) != 0 && + (ifp->if_capabilities & IFCAP_WOL_MAGIC) != 0) + ifp->if_capenable ^= IFCAP_WOL_MAGIC; + STE_UNLOCK(sc); break; default: error = ether_ioctl(ifp, command, data); break; } - return(error); + return (error); } static int -ste_encap(sc, c, m_head) - struct ste_softc *sc; - struct ste_chain *c; - struct mbuf *m_head; +ste_encap(struct ste_softc *sc, struct mbuf **m_head, struct ste_chain *txc) { - int frag = 0; - struct ste_frag *f = NULL; - struct mbuf *m; - struct ste_desc *d; + struct ste_frag *frag; + struct mbuf *m; + struct ste_desc *desc; + bus_dma_segment_t txsegs[STE_MAXFRAGS]; + int error, i, nsegs; - d = c->ste_ptr; - d->ste_ctl = 0; + STE_LOCK_ASSERT(sc); + M_ASSERTPKTHDR((*m_head)); -encap_retry: - for (m = m_head, frag = 0; m != NULL; m = m->m_next) { - if (m->m_len != 0) { - if (frag == STE_MAXFRAGS) - break; - f = &d->ste_frags[frag]; - f->ste_addr = vtophys(mtod(m, vm_offset_t)); - f->ste_len = m->m_len; - frag++; + error = bus_dmamap_load_mbuf_sg(sc->ste_cdata.ste_tx_tag, + txc->ste_map, *m_head, txsegs, &nsegs, 0); + if (error == EFBIG) { + m = m_collapse(*m_head, M_DONTWAIT, STE_MAXFRAGS); + if (m == NULL) { + m_freem(*m_head); + *m_head = NULL; + return (ENOMEM); } - } - - if (m != NULL) { - struct mbuf *mn; - - /* - * We ran out of segments. We have to recopy this - * mbuf chain first. Bail out if we can't get the - * new buffers. - */ - mn = m_defrag(m_head, M_DONTWAIT); - if (mn == NULL) { - m_freem(m_head); - return ENOMEM; + *m_head = m; + error = bus_dmamap_load_mbuf_sg(sc->ste_cdata.ste_tx_tag, + txc->ste_map, *m_head, txsegs, &nsegs, 0); + if (error != 0) { + m_freem(*m_head); + *m_head = NULL; + return (error); } - m_head = mn; - goto encap_retry; + } else if (error != 0) + return (error); + if (nsegs == 0) { + m_freem(*m_head); + *m_head = NULL; + return (EIO); } + bus_dmamap_sync(sc->ste_cdata.ste_tx_tag, txc->ste_map, + BUS_DMASYNC_PREWRITE); - c->ste_mbuf = m_head; - d->ste_frags[frag - 1].ste_len |= STE_FRAG_LAST; - d->ste_ctl = 1; + desc = txc->ste_ptr; + for (i = 0; i < nsegs; i++) { + frag = &desc->ste_frags[i]; + frag->ste_addr = htole32(STE_ADDR_LO(txsegs[i].ds_addr)); + frag->ste_len = htole32(txsegs[i].ds_len); + } + desc->ste_frags[i - 1].ste_len |= htole32(STE_FRAG_LAST); + /* + * Because we use Tx polling we can't chain multiple + * Tx descriptors here. Otherwise we race with controller. + */ + desc->ste_next = 0; + if ((sc->ste_cdata.ste_tx_prod % STE_TX_INTR_FRAMES) == 0) + desc->ste_ctl = htole32(STE_TXCTL_ALIGN_DIS | + STE_TXCTL_DMAINTR); + else + desc->ste_ctl = htole32(STE_TXCTL_ALIGN_DIS); + txc->ste_mbuf = *m_head; + STE_INC(sc->ste_cdata.ste_tx_prod, STE_TX_LIST_CNT); + sc->ste_cdata.ste_tx_cnt++; - return(0); + return (0); } static void -ste_start(ifp) - struct ifnet *ifp; +ste_start(struct ifnet *ifp) { - struct ste_softc *sc; + struct ste_softc *sc; sc = ifp->if_softc; STE_LOCK(sc); @@ -1638,120 +2023,250 @@ ste_start(ifp) } static void -ste_start_locked(ifp) - struct ifnet *ifp; +ste_start_locked(struct ifnet *ifp) { - struct ste_softc *sc; - struct mbuf *m_head = NULL; - struct ste_chain *cur_tx; - int idx; + struct ste_softc *sc; + struct ste_chain *cur_tx; + struct mbuf *m_head = NULL; + int enq; sc = ifp->if_softc; STE_LOCK_ASSERT(sc); - if (!sc->ste_link) + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING || (sc->ste_flags & STE_FLAG_LINK) == 0) return; - if (ifp->if_drv_flags & IFF_DRV_OACTIVE) - return; - - idx = sc->ste_cdata.ste_tx_prod; - - while(sc->ste_cdata.ste_tx_chain[idx].ste_mbuf == NULL) { - /* - * We cannot re-use the last (free) descriptor; - * the chip may not have read its ste_next yet. - */ - if (STE_NEXT(idx, STE_TX_LIST_CNT) == - sc->ste_cdata.ste_tx_cons) { + for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd);) { + if (sc->ste_cdata.ste_tx_cnt == STE_TX_LIST_CNT - 1) { + /* + * Controller may have cached copy of the last used + * next ptr so we have to reserve one TFD to avoid + * TFD overruns. + */ ifp->if_drv_flags |= IFF_DRV_OACTIVE; break; } - IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; - - cur_tx = &sc->ste_cdata.ste_tx_chain[idx]; - - if (ste_encap(sc, cur_tx, m_head) != 0) + cur_tx = &sc->ste_cdata.ste_tx_chain[sc->ste_cdata.ste_tx_prod]; + if (ste_encap(sc, &m_head, cur_tx) != 0) { + if (m_head == NULL) + break; + IFQ_DRV_PREPEND(&ifp->if_snd, m_head); break; - - cur_tx->ste_ptr->ste_next = 0; - - if (sc->ste_tx_prev == NULL) { - cur_tx->ste_ptr->ste_ctl = STE_TXCTL_DMAINTR | 1; - /* Load address of the TX list */ + } + if (sc->ste_cdata.ste_last_tx == NULL) { + bus_dmamap_sync(sc->ste_cdata.ste_tx_list_tag, + sc->ste_cdata.ste_tx_list_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_STALL); ste_wait(sc); - CSR_WRITE_4(sc, STE_TX_DMALIST_PTR, - vtophys(&sc->ste_ldata->ste_tx_list[0])); - - /* Set TX polling interval to start TX engine */ + STE_ADDR_LO(sc->ste_ldata.ste_tx_list_paddr)); CSR_WRITE_1(sc, STE_TX_DMAPOLL_PERIOD, 64); - STE_SETBIT4(sc, STE_DMACTL, STE_DMACTL_TXDMA_UNSTALL); ste_wait(sc); - }else{ - cur_tx->ste_ptr->ste_ctl = STE_TXCTL_DMAINTR | 1; - sc->ste_tx_prev->ste_ptr->ste_next - = cur_tx->ste_phys; + } else { + sc->ste_cdata.ste_last_tx->ste_ptr->ste_next = + sc->ste_cdata.ste_last_tx->ste_phys; + bus_dmamap_sync(sc->ste_cdata.ste_tx_list_tag, + sc->ste_cdata.ste_tx_list_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); } + sc->ste_cdata.ste_last_tx = cur_tx; - sc->ste_tx_prev = cur_tx; - + enq++; /* * If there's a BPF listener, bounce a copy of this frame * to him. */ - BPF_MTAP(ifp, cur_tx->ste_mbuf); - - STE_INC(idx, STE_TX_LIST_CNT); - ifp->if_timer = 5; + BPF_MTAP(ifp, m_head); } - sc->ste_cdata.ste_tx_prod = idx; - return; + if (enq > 0) + sc->ste_timer = STE_TX_TIMEOUT; } static void -ste_watchdog(ifp) - struct ifnet *ifp; +ste_watchdog(struct ste_softc *sc) { - struct ste_softc *sc; + struct ifnet *ifp; - sc = ifp->if_softc; - STE_LOCK(sc); + ifp = sc->ste_ifp; + STE_LOCK_ASSERT(sc); + + if (sc->ste_timer == 0 || --sc->ste_timer) + return; ifp->if_oerrors++; if_printf(ifp, "watchdog timeout\n"); - ste_txeoc(sc); ste_txeof(sc); - ste_rxeoc(sc); - ste_rxeof(sc); - ste_reset(sc); + ste_txeoc(sc); + ste_rxeof(sc, -1); + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; ste_init_locked(sc); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) ste_start_locked(ifp); - STE_UNLOCK(sc); - - return; } static int -ste_shutdown(dev) - device_t dev; +ste_shutdown(device_t dev) { - struct ste_softc *sc; + + return (ste_suspend(dev)); +} + +static int +ste_suspend(device_t dev) +{ + struct ste_softc *sc; sc = device_get_softc(dev); STE_LOCK(sc); ste_stop(sc); + ste_setwol(sc); STE_UNLOCK(sc); return (0); } + +static int +ste_resume(device_t dev) +{ + struct ste_softc *sc; + struct ifnet *ifp; + int pmc; + uint16_t pmstat; + + sc = device_get_softc(dev); + STE_LOCK(sc); + if (pci_find_extcap(sc->ste_dev, PCIY_PMG, &pmc) == 0) { + /* Disable PME and clear PME status. */ + pmstat = pci_read_config(sc->ste_dev, + pmc + PCIR_POWER_STATUS, 2); + if ((pmstat & PCIM_PSTAT_PMEENABLE) != 0) { + pmstat &= ~PCIM_PSTAT_PMEENABLE; + pci_write_config(sc->ste_dev, + pmc + PCIR_POWER_STATUS, pmstat, 2); + } + } + ifp = sc->ste_ifp; + if ((ifp->if_flags & IFF_UP) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + ste_init_locked(sc); + } + STE_UNLOCK(sc); + + return (0); +} + +#define STE_SYSCTL_STAT_ADD32(c, h, n, p, d) \ + SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d) +#define STE_SYSCTL_STAT_ADD64(c, h, n, p, d) \ + SYSCTL_ADD_QUAD(c, h, OID_AUTO, n, CTLFLAG_RD, p, d) + +static void +ste_sysctl_node(struct ste_softc *sc) +{ + struct sysctl_ctx_list *ctx; + struct sysctl_oid_list *child, *parent; + struct sysctl_oid *tree; + struct ste_hw_stats *stats; + + stats = &sc->ste_stats; + ctx = device_get_sysctl_ctx(sc->ste_dev); + child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->ste_dev)); + + SYSCTL_ADD_INT(ctx, child, OID_AUTO, "int_rx_mod", + CTLFLAG_RW, &sc->ste_int_rx_mod, 0, "ste RX interrupt moderation"); + /* Pull in device tunables. */ + sc->ste_int_rx_mod = STE_IM_RX_TIMER_DEFAULT; + resource_int_value(device_get_name(sc->ste_dev), + device_get_unit(sc->ste_dev), "int_rx_mod", &sc->ste_int_rx_mod); + + tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD, + NULL, "STE statistics"); + parent = SYSCTL_CHILDREN(tree); + + /* Rx statistics. */ + tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "rx", CTLFLAG_RD, + NULL, "Rx MAC statistics"); + child = SYSCTL_CHILDREN(tree); + STE_SYSCTL_STAT_ADD64(ctx, child, "good_octets", + &stats->rx_bytes, "Good octets"); + STE_SYSCTL_STAT_ADD32(ctx, child, "good_frames", + &stats->rx_frames, "Good frames"); + STE_SYSCTL_STAT_ADD32(ctx, child, "good_bcast_frames", + &stats->rx_bcast_frames, "Good broadcast frames"); + STE_SYSCTL_STAT_ADD32(ctx, child, "good_mcast_frames", + &stats->rx_mcast_frames, "Good multicast frames"); + STE_SYSCTL_STAT_ADD32(ctx, child, "lost_frames", + &stats->rx_lost_frames, "Lost frames"); + + /* Tx statistics. */ + tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD, + NULL, "Tx MAC statistics"); + child = SYSCTL_CHILDREN(tree); + STE_SYSCTL_STAT_ADD64(ctx, child, "good_octets", + &stats->tx_bytes, "Good octets"); + STE_SYSCTL_STAT_ADD32(ctx, child, "good_frames", + &stats->tx_frames, "Good frames"); + STE_SYSCTL_STAT_ADD32(ctx, child, "good_bcast_frames", + &stats->tx_bcast_frames, "Good broadcast frames"); + STE_SYSCTL_STAT_ADD32(ctx, child, "good_mcast_frames", + &stats->tx_mcast_frames, "Good multicast frames"); + STE_SYSCTL_STAT_ADD32(ctx, child, "carrier_errs", + &stats->tx_carrsense_errs, "Carrier sense errors"); + STE_SYSCTL_STAT_ADD32(ctx, child, "single_colls", + &stats->tx_single_colls, "Single collisions"); + STE_SYSCTL_STAT_ADD32(ctx, child, "multi_colls", + &stats->tx_multi_colls, "Multiple collisions"); + STE_SYSCTL_STAT_ADD32(ctx, child, "late_colls", + &stats->tx_late_colls, "Late collisions"); + STE_SYSCTL_STAT_ADD32(ctx, child, "defers", + &stats->tx_frames_defered, "Frames with deferrals"); + STE_SYSCTL_STAT_ADD32(ctx, child, "excess_defers", + &stats->tx_excess_defers, "Frames with excessive derferrals"); + STE_SYSCTL_STAT_ADD32(ctx, child, "abort", + &stats->tx_abort, "Aborted frames due to Excessive collisions"); +} + +#undef STE_SYSCTL_STAT_ADD32 +#undef STE_SYSCTL_STAT_ADD64 + +static void +ste_setwol(struct ste_softc *sc) +{ + struct ifnet *ifp; + uint16_t pmstat; + uint8_t val; + int pmc; + + STE_LOCK_ASSERT(sc); + + if (pci_find_extcap(sc->ste_dev, PCIY_PMG, &pmc) != 0) { + /* Disable WOL. */ + CSR_READ_1(sc, STE_WAKE_EVENT); + CSR_WRITE_1(sc, STE_WAKE_EVENT, 0); + return; + } + + ifp = sc->ste_ifp; + val = CSR_READ_1(sc, STE_WAKE_EVENT); + val &= ~(STE_WAKEEVENT_WAKEPKT_ENB | STE_WAKEEVENT_MAGICPKT_ENB | + STE_WAKEEVENT_LINKEVT_ENB | STE_WAKEEVENT_WAKEONLAN_ENB); + if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0) + val |= STE_WAKEEVENT_MAGICPKT_ENB | STE_WAKEEVENT_WAKEONLAN_ENB; + CSR_WRITE_1(sc, STE_WAKE_EVENT, val); + /* Request PME. */ + pmstat = pci_read_config(sc->ste_dev, pmc + PCIR_POWER_STATUS, 2); + pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE); + if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0) + pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; + pci_write_config(sc->ste_dev, pmc + PCIR_POWER_STATUS, pmstat, 2); +} diff --git a/sys/dev/ste/if_stereg.h b/sys/dev/ste/if_stereg.h index 0114ebe459c6..840e0bfada5f 100644 --- a/sys/dev/ste/if_stereg.h +++ b/sys/dev/ste/if_stereg.h @@ -63,6 +63,7 @@ #define STE_RX_DMABURST_THRESH 0x14 #define STE_RX_DMAURG_THRESH 0x15 #define STE_RX_DMAPOLL_PERIOD 0x16 +#define STE_COUNTDOWN 0x18 #define STE_DEBUGCTL 0x1A #define STE_ASICCTL 0x30 #define STE_EEPROM_DATA 0x34 @@ -75,7 +76,6 @@ #define STE_WAKE_EVENT 0x45 #define STE_TX_STATUS 0x46 #define STE_TX_FRAMEID 0x47 -#define STE_COUNTDOWN 0x48 #define STE_ISR_ACK 0x4A #define STE_IMR 0x4C #define STE_ISR 0x4E @@ -92,11 +92,25 @@ #define STE_MAR1 0x62 #define STE_MAR2 0x64 #define STE_MAR3 0x66 -#define STE_STATS 0x68 -#define STE_LATE_COLLS 0x75 -#define STE_MULTI_COLLS 0x76 -#define STE_SINGLE_COLLS 0x77 +#define STE_STAT_RX_OCTETS_LO 0x68 +#define STE_STAT_RX_OCTETS_HI 0x6A +#define STE_STAT_TX_OCTETS_LO 0x6C +#define STE_STAT_TX_OCTETS_HI 0x6E +#define STE_STAT_TX_FRAMES 0x70 +#define STE_STAT_RX_FRAMES 0x72 +#define STE_STAT_CARRIER_ERR 0x74 +#define STE_STAT_LATE_COLLS 0x75 +#define STE_STAT_MULTI_COLLS 0x76 +#define STE_STAT_SINGLE_COLLS 0x77 +#define STE_STAT_TX_DEFER 0x78 +#define STE_STAT_RX_LOST 0x79 +#define STE_STAT_TX_EXDEFER 0x7A +#define STE_STAT_TX_ABORT 0x7B +#define STE_STAT_TX_BCAST 0x7C +#define STE_STAT_RX_BCAST 0x7D +#define STE_STAT_TX_MCAST 0x7E +#define STE_STAT_RX_MCAST 0x7F #define STE_DMACTL_RXDMA_STOPPED 0x00000001 #define STE_DMACTL_TXDMA_CMPREQ 0x00000002 @@ -199,18 +213,6 @@ #define STE_ASICCTL_SOFTINTR 0x02000000 #define STE_ASICCTL_RESET_BUSY 0x04000000 -#define STE_ASICCTL1_GLOBAL_RESET 0x0001 -#define STE_ASICCTL1_RX_RESET 0x0002 -#define STE_ASICCTL1_TX_RESET 0x0004 -#define STE_ASICCTL1_DMA_RESET 0x0008 -#define STE_ASICCTL1_FIFO_RESET 0x0010 -#define STE_ASICCTL1_NETWORK_RESET 0x0020 -#define STE_ASICCTL1_HOST_RESET 0x0040 -#define STE_ASICCTL1_AUTOINIT_RESET 0x0080 -#define STE_ASICCTL1_EXTRESET_RESET 0x0100 -#define STE_ASICCTL1_SOFTINTR 0x0200 -#define STE_ASICCTL1_RESET_BUSY 0x0400 - #define STE_EECTL_ADDR 0x00FF #define STE_EECTL_OPCODE 0x0300 #define STE_EECTL_BUSY 0x1000 @@ -253,6 +255,11 @@ #define STE_TXSTATUS_TXINTR_REQ 0x40 #define STE_TXSTATUS_TXDONE 0x80 +#define STE_ERR_BITS "\20" \ + "\2RECLAIM\3STSOFLOW" \ + "\4EXCESSCOLLS\5UNDERRUN" \ + "\6INTREQ\7DONE" + #define STE_ISRACK_INTLATCH 0x0001 #define STE_ISRACK_HOSTERR 0x0002 #define STE_ISRACK_TX_DONE 0x0004 @@ -276,10 +283,10 @@ #define STE_IMR_TX_DMADONE 0x0200 #define STE_IMR_RX_DMADONE 0x0400 -#define STE_INTRS \ +#define STE_INTRS \ (STE_IMR_RX_DMADONE|STE_IMR_TX_DMADONE| \ - STE_IMR_TX_DONE|STE_IMR_HOSTERR| \ - STE_IMR_LINKEVENT) + STE_IMR_TX_DONE|STE_IMR_SOFTINTR| \ + STE_IMR_HOSTERR) #define STE_ISR_INTLATCH 0x0001 #define STE_ISR_HOSTERR 0x0002 @@ -343,6 +350,13 @@ #define STE_PHYCTL_SPEEDSTAT 0x40 #define STE_PHYCTL_LINKSTAT 0x80 +#define STE_TIMER_TICKS 32 +#define STE_TIMER_USECS(x) ((x * 10) / STE_TIMER_TICKS) + +#define STE_IM_RX_TIMER_MIN 0 +#define STE_IM_RX_TIMER_MAX 209712 +#define STE_IM_RX_TIMER_DEFAULT 150 + /* * EEPROM offsets. */ @@ -384,49 +398,63 @@ #define STE_PME_EN 0x0010 #define STE_PME_STATUS 0x8000 - -struct ste_stats { - u_int32_t ste_rx_bytes; - u_int32_t ste_tx_bytes; - u_int16_t ste_tx_frames; - u_int16_t ste_rx_frames; - u_int8_t ste_carrsense_errs; - u_int8_t ste_late_colls; - u_int8_t ste_multi_colls; - u_int8_t ste_single_colls; - u_int8_t ste_tx_frames_defered; - u_int8_t ste_rx_lost_frames; - u_int8_t ste_tx_excess_defers; - u_int8_t ste_tx_abort_excess_colls; - u_int8_t ste_tx_bcast_frames; - u_int8_t ste_rx_bcast_frames; - u_int8_t ste_tx_mcast_frames; - u_int8_t ste_rx_mcast_frames; +struct ste_hw_stats { + uint64_t rx_bytes; + uint32_t rx_frames; + uint32_t rx_bcast_frames; + uint32_t rx_mcast_frames; + uint32_t rx_lost_frames; + uint64_t tx_bytes; + uint32_t tx_frames; + uint32_t tx_bcast_frames; + uint32_t tx_mcast_frames; + uint32_t tx_carrsense_errs; + uint32_t tx_single_colls; + uint32_t tx_multi_colls; + uint32_t tx_late_colls; + uint32_t tx_frames_defered; + uint32_t tx_excess_defers; + uint32_t tx_abort; }; struct ste_frag { - u_int32_t ste_addr; - u_int32_t ste_len; + uint32_t ste_addr; + uint32_t ste_len; }; #define STE_FRAG_LAST 0x80000000 #define STE_FRAG_LEN 0x00001FFF +/* + * A TFD is 16 to 512 bytes in length which means it can have up to 126 + * fragments for a single Tx frame. Since most frames used in stack have + * 3-4 fragments supporting 8 fragments would be enough for normal + * operation. If we encounter more than 8 fragments we'll collapse them + * into a frame that has less than or equal to 8 fragments. Each buffer + * address of a fragment has no alignment limitation. + */ #define STE_MAXFRAGS 8 struct ste_desc { - u_int32_t ste_next; - u_int32_t ste_ctl; + uint32_t ste_next; + uint32_t ste_ctl; struct ste_frag ste_frags[STE_MAXFRAGS]; }; +/* + * A RFD has the same structure of TFD which in turn means hardware + * supports scatter operation in Rx buffer. Since we just allocate Rx + * buffer with m_getcl(9) there is no fragmentation at all so use + * single fragment for RFD. + */ struct ste_desc_onefrag { - u_int32_t ste_next; - u_int32_t ste_status; + uint32_t ste_next; + uint32_t ste_status; struct ste_frag ste_frag; }; #define STE_TXCTL_WORDALIGN 0x00000003 +#define STE_TXCTL_ALIGN_DIS 0x00000001 #define STE_TXCTL_FRAMEID 0x000003FC #define STE_TXCTL_NOCRC 0x00002000 #define STE_TXCTL_TXINTR 0x00008000 @@ -445,87 +473,118 @@ struct ste_desc_onefrag { #define STE_RXSTAT_DMA_OFLOW 0x01000000 #define STE_RXATAT_ONEBUF 0x10000000 +#define STE_RX_BYTES(x) ((x) & STE_RXSTAT_FRAMELEN) + /* * register space access macros */ #define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->ste_btag, sc->ste_bhandle, reg, val) + bus_write_4((sc)->ste_res, reg, val) #define CSR_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->ste_btag, sc->ste_bhandle, reg, val) + bus_write_2((sc)->ste_res, reg, val) #define CSR_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->ste_btag, sc->ste_bhandle, reg, val) + bus_write_1((sc)->ste_res, reg, val) #define CSR_READ_4(sc, reg) \ - bus_space_read_4(sc->ste_btag, sc->ste_bhandle, reg) + bus_read_4((sc)->ste_res, reg) #define CSR_READ_2(sc, reg) \ - bus_space_read_2(sc->ste_btag, sc->ste_bhandle, reg) + bus_read_2((sc)->ste_res, reg) #define CSR_READ_1(sc, reg) \ - bus_space_read_1(sc->ste_btag, sc->ste_bhandle, reg) + bus_read_1((sc)->ste_res, reg) +#define STE_DESC_ALIGN 8 +#define STE_RX_LIST_CNT 128 +#define STE_TX_LIST_CNT 128 +#define STE_RX_LIST_SZ \ + (sizeof(struct ste_desc_onefrag) * STE_RX_LIST_CNT) +#define STE_TX_LIST_SZ \ + (sizeof(struct ste_desc) * STE_TX_LIST_CNT) +#define STE_ADDR_LO(x) ((uint64_t)(x) & 0xFFFFFFFF) +#define STE_ADDR_HI(x) ((uint64_t)(x) >> 32) + +/* + * Since Tx status can hold up to 31 status bytes we should + * check Tx status before controller fills it up. Otherwise + * Tx MAC stalls. + */ +#define STE_TX_INTR_FRAMES 16 +#define STE_TX_TIMEOUT 5 #define STE_TIMEOUT 1000 #define STE_MIN_FRAMELEN 60 #define STE_PACKET_SIZE 1536 -#define ETHER_ALIGN 2 -#define STE_RX_LIST_CNT 64 -#define STE_TX_LIST_CNT 128 #define STE_INC(x, y) (x) = (x + 1) % y +#define STE_DEC(x, y) (x) = ((x) + ((y) - 1)) % (y) #define STE_NEXT(x, y) (x + 1) % y struct ste_type { - u_int16_t ste_vid; - u_int16_t ste_did; + uint16_t ste_vid; + uint16_t ste_did; char *ste_name; }; struct ste_list_data { - struct ste_desc_onefrag ste_rx_list[STE_RX_LIST_CNT]; - struct ste_desc ste_tx_list[STE_TX_LIST_CNT]; + struct ste_desc_onefrag *ste_rx_list; + bus_addr_t ste_rx_list_paddr; + struct ste_desc *ste_tx_list; + bus_addr_t ste_tx_list_paddr; }; struct ste_chain { struct ste_desc *ste_ptr; struct mbuf *ste_mbuf; struct ste_chain *ste_next; - u_int32_t ste_phys; + uint32_t ste_phys; + bus_dmamap_t ste_map; }; struct ste_chain_onefrag { struct ste_desc_onefrag *ste_ptr; struct mbuf *ste_mbuf; struct ste_chain_onefrag *ste_next; + bus_dmamap_t ste_map; }; struct ste_chain_data { + bus_dma_tag_t ste_parent_tag; + bus_dma_tag_t ste_rx_tag; + bus_dma_tag_t ste_tx_tag; + bus_dma_tag_t ste_rx_list_tag; + bus_dmamap_t ste_rx_list_map; + bus_dma_tag_t ste_tx_list_tag; + bus_dmamap_t ste_tx_list_map; + bus_dmamap_t ste_rx_sparemap; struct ste_chain_onefrag ste_rx_chain[STE_RX_LIST_CNT]; - struct ste_chain ste_tx_chain[STE_TX_LIST_CNT]; + struct ste_chain ste_tx_chain[STE_TX_LIST_CNT]; struct ste_chain_onefrag *ste_rx_head; - + struct ste_chain *ste_last_tx; int ste_tx_prod; int ste_tx_cons; + int ste_tx_cnt; }; struct ste_softc { struct ifnet *ste_ifp; - bus_space_tag_t ste_btag; - bus_space_handle_t ste_bhandle; struct resource *ste_res; + int ste_res_id; + int ste_res_type; struct resource *ste_irq; void *ste_intrhand; struct ste_type *ste_info; device_t ste_miibus; device_t ste_dev; int ste_tx_thresh; - u_int8_t ste_link; + int ste_flags; +#define STE_FLAG_ONE_PHY 0x0001 +#define STE_FLAG_LINK 0x8000 int ste_if_flags; - struct ste_chain *ste_tx_prev; - struct ste_list_data *ste_ldata; + int ste_timer; + int ste_int_rx_act; + int ste_int_rx_mod; + struct ste_list_data ste_ldata; struct ste_chain_data ste_cdata; - struct callout ste_stat_callout; + struct callout ste_callout; + struct ste_hw_stats ste_stats; struct mtx ste_mtx; - u_int8_t ste_one_phy; -#ifdef DEVICE_POLLING - int rxcycles; -#endif }; #define STE_LOCK(_sc) mtx_lock(&(_sc)->ste_mtx) @@ -533,12 +592,12 @@ struct ste_softc { #define STE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->ste_mtx, MA_OWNED) struct ste_mii_frame { - u_int8_t mii_stdelim; - u_int8_t mii_opcode; - u_int8_t mii_phyaddr; - u_int8_t mii_regaddr; - u_int8_t mii_turnaround; - u_int16_t mii_data; + uint8_t mii_stdelim; + uint8_t mii_opcode; + uint8_t mii_phyaddr; + uint8_t mii_regaddr; + uint8_t mii_turnaround; + uint16_t mii_data; }; /* diff --git a/sys/dev/stge/if_stge.c b/sys/dev/stge/if_stge.c index dac4da6d5db2..e28981482b6b 100644 --- a/sys/dev/stge/if_stge.c +++ b/sys/dev/stge/if_stge.c @@ -15,13 +15,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -722,8 +715,6 @@ stge_attach(device_t dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = stge_ioctl; ifp->if_start = stge_start; - ifp->if_timer = 0; - ifp->if_watchdog = NULL; ifp->if_init = stge_init; ifp->if_mtu = ETHERMTU; ifp->if_snd.ifq_drv_maxlen = STGE_TX_RING_CNT - 1; diff --git a/sys/dev/stge/if_stgereg.h b/sys/dev/stge/if_stgereg.h index 9add8cb2d9b4..6ecbdf973dc3 100644 --- a/sys/dev/stge/if_stgereg.h +++ b/sys/dev/stge/if_stgereg.h @@ -15,13 +15,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/dev/sym/sym_hipd.c b/sys/dev/sym/sym_hipd.c index ab74a55c94d7..a43c816c65fe 100644 --- a/sys/dev/sym/sym_hipd.c +++ b/sys/dev/sym/sym_hipd.c @@ -8582,7 +8582,7 @@ sym_pci_attach(device_t dev) * Allocate a tag for the DMA of user data. */ if (bus_dma_tag_create(np->bus_dmat, 1, (1<<24), - BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, BUS_SPACE_MAXSIZE, SYM_CONF_MAX_SG, (1<<24), 0, busdma_lock_mutex, &np->mtx, diff --git a/sys/dev/syscons/scmouse.c b/sys/dev/syscons/scmouse.c index 2d998d403993..7c1dcc9a99c4 100644 --- a/sys/dev/syscons/scmouse.c +++ b/sys/dev/syscons/scmouse.c @@ -117,6 +117,48 @@ sc_alloc_cut_buffer(scr_stat *scp, int wait) } #endif /* SC_NO_CUTPASTE */ +static void +sc_mouse_input_button(scr_stat *scp, int button) +{ + char mouseb[6] = "\x1B[M"; + + mouseb[3] = ' ' + button; + mouseb[4] = '!' + scp->mouse_pos % scp->xsize; + mouseb[5] = '!' + scp->mouse_pos / scp->xsize; + sc_respond(scp, mouseb, sizeof mouseb, 1); +} + +static void +sc_mouse_input(scr_stat *scp, mouse_info_t *mouse) +{ + + switch (mouse->operation) { + case MOUSE_BUTTON_EVENT: + if (mouse->u.event.value > 0) { + /* Mouse button pressed. */ + if (mouse->u.event.id & MOUSE_BUTTON1DOWN) + sc_mouse_input_button(scp, 0); + if (mouse->u.event.id & MOUSE_BUTTON2DOWN) + sc_mouse_input_button(scp, 1); + if (mouse->u.event.id & MOUSE_BUTTON3DOWN) + sc_mouse_input_button(scp, 2); + } else { + /* Mouse button released. */ + sc_mouse_input_button(scp, 3); + } + break; + case MOUSE_MOTION_EVENT: + if (mouse->u.data.z < 0) { + /* Scroll up. */ + sc_mouse_input_button(scp, 64); + } else if (mouse->u.data.z > 0) { + /* Scroll down. */ + sc_mouse_input_button(scp, 65); + } + break; + } +} + /* move mouse */ void sc_mouse_move(scr_stat *scp, int x, int y) @@ -755,6 +797,11 @@ sc_mouse_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) cur_scp->status &= ~MOUSE_HIDDEN; + if (cur_scp->mouse_level > 0) { + sc_mouse_input(scp, mouse); + break; + } + if (cur_scp->mouse_signal && cur_scp->mouse_proc) { /* has controlling process died? */ if (cur_scp->mouse_proc != (p1 = pfind(cur_scp->mouse_pid))) { @@ -811,6 +858,11 @@ sc_mouse_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) cur_scp->status &= ~MOUSE_HIDDEN; + if (cur_scp->mouse_level > 0) { + sc_mouse_input(scp, mouse); + break; + } + if (cur_scp->mouse_signal && cur_scp->mouse_proc) { if (cur_scp->mouse_proc != (p1 = pfind(cur_scp->mouse_pid))){ cur_scp->mouse_signal = 0; diff --git a/sys/dev/syscons/scterm-teken.c b/sys/dev/syscons/scterm-teken.c index 4782beb99747..1d110ab91c0d 100644 --- a/sys/dev/syscons/scterm-teken.c +++ b/sys/dev/syscons/scterm-teken.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #if defined(__sparc64__) || defined(__powerpc__) #include @@ -52,14 +53,15 @@ __FBSDID("$FreeBSD$"); static void scteken_revattr(unsigned char, teken_attr_t *); static unsigned int scteken_attr(const teken_attr_t *); -static sc_term_init_t scteken_init; -static sc_term_term_t scteken_term; -static sc_term_puts_t scteken_puts; -static sc_term_ioctl_t scteken_ioctl; -static sc_term_default_attr_t scteken_default_attr; -static sc_term_clear_t scteken_clear; -static sc_term_input_t scteken_input; -static void scteken_nop(void); +static sc_term_init_t scteken_init; +static sc_term_term_t scteken_term; +static sc_term_puts_t scteken_puts; +static sc_term_ioctl_t scteken_ioctl; +static sc_term_default_attr_t scteken_default_attr; +static sc_term_clear_t scteken_clear; +static sc_term_input_t scteken_input; +static sc_term_fkeystr_t scteken_fkeystr; +static void scteken_nop(void); typedef struct { teken_t ts_teken; @@ -84,6 +86,7 @@ static sc_term_sw_t sc_term_scteken = { scteken_clear, (sc_term_notify_t *)scteken_nop, scteken_input, + scteken_fkeystr, }; SCTERM_MODULE(scteken, sc_term_scteken); @@ -129,9 +132,9 @@ scteken_init(scr_stat *scp, void **softc, int code) #ifndef TEKEN_UTF8 teken_set_8bit(&ts->ts_teken); #endif /* !TEKEN_UTF8 */ -#ifndef TEKEN_XTERM +#ifdef TEKEN_CONS25 teken_set_cons25(&ts->ts_teken); -#endif /* !TEKEN_XTERM */ +#endif /* TEKEN_CONS25 */ tp.tp_row = scp->ysize; tp.tp_col = scp->xsize; @@ -241,6 +244,56 @@ scteken_input(scr_stat *scp, int c, struct tty *tp) return FALSE; } +static const char * +scteken_fkeystr(scr_stat *scp, int c) +{ + teken_stat *ts = scp->ts; + unsigned int k; + + switch (c) { + case FKEY | F(1): case FKEY | F(2): case FKEY | F(3): + case FKEY | F(4): case FKEY | F(5): case FKEY | F(6): + case FKEY | F(7): case FKEY | F(8): case FKEY | F(9): + case FKEY | F(10): case FKEY | F(11): case FKEY | F(12): + k = TKEY_F1 + c - (FKEY | F(1)); + break; + case FKEY | F(49): + k = TKEY_HOME; + break; + case FKEY | F(50): + k = TKEY_UP; + break; + case FKEY | F(51): + k = TKEY_PAGE_UP; + break; + case FKEY | F(53): + k = TKEY_LEFT; + break; + case FKEY | F(55): + k = TKEY_RIGHT; + break; + case FKEY | F(57): + k = TKEY_END; + break; + case FKEY | F(58): + k = TKEY_DOWN; + break; + case FKEY | F(59): + k = TKEY_PAGE_DOWN; + break; + case FKEY | F(60): + k = TKEY_INSERT; + break; + case FKEY | F(61): + k = TKEY_DELETE; + break; + default: + return (NULL); + } + + return (teken_get_sequence(&ts->ts_teken, k)); +} + static void scteken_nop(void) { @@ -644,6 +697,9 @@ scteken_param(void *arg, int cmd, unsigned int value) scp->bell_pitch = TP_SETBELLPD_PITCH(value); scp->bell_duration = TP_SETBELLPD_DURATION(value); break; + case TP_MOUSE: + scp->mouse_level = value; + break; } } @@ -652,5 +708,5 @@ scteken_respond(void *arg, const void *buf, size_t len) { scr_stat *scp = arg; - sc_respond(scp, buf, len); + sc_respond(scp, buf, len, 0); } diff --git a/sys/dev/syscons/scvidctl.c b/sys/dev/syscons/scvidctl.c index d481e066430f..0f55499bac74 100644 --- a/sys/dev/syscons/scvidctl.c +++ b/sys/dev/syscons/scvidctl.c @@ -321,6 +321,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, return ENODEV; #else video_info_t info; + ksiginfo_t ksi; u_char *font; int prev_ysize; int error; @@ -368,34 +369,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, if ((info.vi_width < xsize*8) || (info.vi_height < ysize*fontsize)) return EINVAL; - /* - * We currently support the following graphic modes: - * - * - 4 bpp planar modes whose memory size does not exceed 64K - * - 15, 16, 24 and 32 bpp linear modes - */ - - if (info.vi_mem_model == V_INFO_MM_PLANAR) { - if (info.vi_planes != 4) - return ENODEV; - - /* - * A memory size >64K requires bank switching to access the entire - * screen. XXX - */ - - if (info.vi_width * info.vi_height / 8 > info.vi_window_size) - return ENODEV; - } else if (info.vi_mem_model == V_INFO_MM_DIRECT) { - if (!(info.vi_flags & V_INFO_LINEAR) && - (info.vi_depth != 15) && (info.vi_depth != 16) && - (info.vi_depth != 24) && (info.vi_depth != 32)) - return ENODEV; - } else if (info.vi_mem_model == V_INFO_MM_PACKED) { - if (!(info.vi_flags & V_INFO_LINEAR) && - (info.vi_depth != 8)) - return ENODEV; - } else + if (!sc_support_pixel_mode(&info)) return ENODEV; /* stop screen saver, etc */ @@ -458,8 +432,11 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, tp->t_winsize.ws_col = scp->xsize; tp->t_winsize.ws_row = scp->ysize; if (tp->t_pgrp != NULL) { + ksiginfo_init(&ksi); + ksi.ksi_signo = SIGWINCH; + ksi.ksi_code = SI_KERNEL; PGRP_LOCK(tp->t_pgrp); - pgsignal(tp->t_pgrp, SIGWINCH, 1); + pgsignal(tp->t_pgrp, SIGWINCH, 1, &ksi); PGRP_UNLOCK(tp->t_pgrp); } } @@ -468,6 +445,48 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, #endif /* SC_PIXEL_MODE */ } +int +sc_support_pixel_mode(void *arg) +{ +#ifdef SC_PIXEL_MODE + video_info_t *info = arg; + + if ((info->vi_flags & V_INFO_GRAPHICS) == 0) + return (0); + + /* + * We currently support the following graphic modes: + * + * - 4 bpp planar modes whose memory size does not exceed 64K + * - 15, 16, 24 and 32 bpp linear modes + */ + switch (info->vi_mem_model) { + case V_INFO_MM_PLANAR: + if (info->vi_planes != 4) + break; + /* + * A memory size >64K requires bank switching to access + * the entire screen. XXX + */ + if (info->vi_width * info->vi_height / 8 > info->vi_window_size) + break; + return (1); + case V_INFO_MM_DIRECT: + if ((info->vi_flags & V_INFO_LINEAR) == 0 && + info->vi_depth != 15 && info->vi_depth != 16 && + info->vi_depth != 24 && info->vi_depth != 32) + break; + return (1); + case V_INFO_MM_PACKED: + if ((info->vi_flags & V_INFO_LINEAR) == 0 && + info->vi_depth != 8) + break; + return (1); + } +#endif + return (0); +} + #define fb_ioctl(a, c, d) \ (((a) == NULL) ? ENODEV : \ vidd_ioctl((a), (c), (caddr_t)(d))) @@ -721,6 +740,11 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) #endif #ifndef SC_NO_PALETTE_LOADING +#ifdef SC_PIXEL_MODE + if ((adp->va_flags & V_ADP_DAC8) != 0) + vidd_load_palette(adp, scp->sc->palette2); + else +#endif vidd_load_palette(adp, scp->sc->palette); #endif @@ -778,7 +802,10 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) if (scp == scp->sc->cur_scp) { set_mode(scp); #ifndef SC_NO_PALETTE_LOADING - vidd_load_palette(adp, scp->sc->palette); + if ((adp->va_flags & V_ADP_DAC8) != 0) + vidd_load_palette(adp, scp->sc->palette2); + else + vidd_load_palette(adp, scp->sc->palette); #endif } sc_clear_screen(scp); diff --git a/sys/dev/syscons/snake/snake_saver.c b/sys/dev/syscons/snake/snake_saver.c index bbdcda31b5e4..dbcc21758b20 100644 --- a/sys/dev/syscons/snake/snake_saver.c +++ b/sys/dev/syscons/snake/snake_saver.c @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include @@ -48,11 +50,22 @@ static int *messagep; static int messagelen; static int blanked; +#define MSGBUF_LEN 70 + +static int nofancy = 0; +TUNABLE_INT("hw.syscons.saver_snake_nofancy", &nofancy); + +#define FANCY_SNAKE (!nofancy) +#define LOAD_HIGH(ld) (((ld * 100 + FSCALE / 2) >> FSHIFT) / 100) +#define LOAD_LOW(ld) (((ld * 100 + FSCALE / 2) >> FSHIFT) % 100) + +static inline void update_msg(void); + static int snake_saver(video_adapter_t *adp, int blank) { static int dirx, diry; - int f; + int f, color, load; sc_softc_t *sc; scr_stat *scp; @@ -99,22 +112,52 @@ snake_saver(video_adapter_t *adp, int blank) (random() % 20) == 0) diry = -diry; savs[0] += dirx + diry; + if (FANCY_SNAKE) { + update_msg(); + load = ((averunnable.ldavg[0] * 100 + FSCALE / 2) >> FSHIFT); + if (load == 0) + color = FG_LIGHTGREY | BG_BLACK; + else if (load / mp_ncpus <= 50) + color = FG_LIGHTGREEN | BG_BLACK; + else if (load / mp_ncpus <= 75) + color = FG_YELLOW | BG_BLACK; + else if (load / mp_ncpus <= 99) + color = FG_LIGHTRED | BG_BLACK; + else + color = FG_RED | FG_BLINK | BG_BLACK; + } else + color = FG_LIGHTGREY | BG_BLACK; + for (f=messagelen-1; f>=0; f--) sc_vtb_putc(&scp->scr, savs[f], sc->scr_map[save[f]], - (FG_LIGHTGREY | BG_BLACK) << 8); + color << 8); } else blanked = 0; return 0; } +static inline void +update_msg(void) +{ + if (!FANCY_SNAKE) { + messagelen = sprintf(message, "%s %s", ostype, osrelease); + return; + } + messagelen = snprintf(message, MSGBUF_LEN, + "%s %s (%d.%02d %d.%02d, %d.%02d)", + ostype, osrelease, + LOAD_HIGH(averunnable.ldavg[0]), LOAD_LOW(averunnable.ldavg[0]), + LOAD_HIGH(averunnable.ldavg[1]), LOAD_LOW(averunnable.ldavg[1]), + LOAD_HIGH(averunnable.ldavg[2]), LOAD_LOW(averunnable.ldavg[2])); +} + static int snake_init(video_adapter_t *adp) { - messagelen = strlen(ostype) + 1 + strlen(osrelease); - message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK); - sprintf(message, "%s %s", ostype, osrelease); - messagep = malloc(messagelen * sizeof *messagep, M_DEVBUF, M_WAITOK); + message = malloc(MSGBUF_LEN, M_DEVBUF, M_WAITOK); + messagep = malloc(MSGBUF_LEN * sizeof *messagep, M_DEVBUF, M_WAITOK); + update_msg(); return 0; } diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index c9809583d923..719935d68fc3 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -343,17 +343,105 @@ sc_alloc_tty(int index, int devnum) return (tp); } +#ifdef SC_PIXEL_MODE +static void +sc_set_vesa_mode(scr_stat *scp, sc_softc_t *sc, int unit) +{ + video_info_t info; + int depth; + int i; + int vmode; + + vmode = 0; + (void)resource_int_value("sc", unit, "vesa_mode", &vmode); + if (vmode < M_VESA_BASE || vmode > M_VESA_MODE_MAX || + vidd_get_info(sc->adp, vmode, &info) != 0 || + !sc_support_pixel_mode(&info)) + vmode = 0; + + /* + * If the mode is unset or unsupported, search for an available + * 800x600 graphics mode with the highest color depth. + */ + if (vmode == 0) { + for (depth = 0, i = M_VESA_BASE; i <= M_VESA_MODE_MAX; i++) + if (vidd_get_info(sc->adp, i, &info) == 0 && + info.vi_width == 800 && info.vi_height == 600 && + sc_support_pixel_mode(&info) && + info.vi_depth > depth) { + vmode = i; + depth = info.vi_depth; + } + if (vmode == 0) + return; + vidd_get_info(sc->adp, vmode, &info); + } + +#ifndef SC_NO_FONT_LOADING + if ((sc->fonts_loaded & FONT_16) == 0) + return; +#endif +#ifdef DEV_SPLASH + if ((sc->flags & SC_SPLASH_SCRN) != 0) + splash_term(sc->adp); +#endif +#ifndef SC_NO_HISTORY + if (scp->history != NULL) { + sc_vtb_append(&scp->vtb, 0, scp->history, + scp->ypos * scp->xsize + scp->xpos); + scp->history_pos = sc_vtb_tail(scp->history); + } +#endif + vidd_set_mode(sc->adp, vmode); + scp->status |= (UNKNOWN_MODE | PIXEL_MODE | MOUSE_HIDDEN); + scp->status &= ~(GRAPHICS_MODE | MOUSE_VISIBLE); + scp->xpixel = info.vi_width; + scp->ypixel = info.vi_height; + scp->xsize = scp->xpixel / 8; + scp->ysize = scp->ypixel / 16; + scp->xpos = 0; + scp->ypos = scp->ysize - 1; + scp->xoff = scp->yoff = 0; +#ifndef SC_NO_FONT_LOADING + scp->font = sc->font_16; +#else + scp->font = NULL; +#endif + scp->font_size = 16; + scp->font_width = 8; + scp->start = scp->xsize * scp->ysize - 1; + scp->end = 0; + scp->cursor_pos = scp->cursor_oldpos = scp->xsize * scp->xsize; + scp->mode = sc->initial_mode = vmode; +#ifndef __sparc64__ + sc_vtb_init(&scp->scr, VTB_FRAMEBUFFER, scp->xsize, scp->ysize, + (void *)sc->adp->va_window, FALSE); +#endif + sc_alloc_scr_buffer(scp, FALSE, FALSE); + sc_init_emulator(scp, NULL); +#ifndef SC_NO_CUTPASTE + sc_alloc_cut_buffer(scp, FALSE); +#endif +#ifndef SC_NO_HISTORY + sc_alloc_history_buffer(scp, 0, 0, FALSE); +#endif + sc_set_border(scp, scp->border); + sc_set_cursor_image(scp); + scp->status &= ~UNKNOWN_MODE; +#ifdef DEV_SPLASH + if ((sc->flags & SC_SPLASH_SCRN) != 0) + splash_init(sc->adp, scsplash_callback, sc); +#endif +} +#endif + int sc_attach_unit(int unit, int flags) { sc_softc_t *sc; scr_stat *scp; -#ifdef SC_PIXEL_MODE - video_info_t info; -#endif - int vc; struct cdev *dev; - unsigned int vmode = 0; + int vc; flags &= ~SC_KERNEL_CONSOLE; @@ -374,26 +462,9 @@ sc_attach_unit(int unit, int flags) if (sc_console == NULL) /* sc_console_unit < 0 */ sc_console = scp; - (void)resource_int_value("sc", unit, "vesa_mode", &vmode); - if (vmode < M_VESA_BASE || vmode > M_VESA_MODE_MAX) - vmode = M_VESA_FULL_800; - #ifdef SC_PIXEL_MODE - if ((sc->config & SC_VESAMODE) - && (vidd_get_info(sc->adp, vmode, &info) == 0)) { -#ifdef DEV_SPLASH - if (sc->flags & SC_SPLASH_SCRN) - splash_term(sc->adp); -#endif - sc_set_graphics_mode(scp, NULL, vmode); - sc_set_pixel_mode(scp, NULL, 0, 0, 16, 8); - sc->initial_mode = vmode; -#ifdef DEV_SPLASH - /* put up the splash again! */ - if (sc->flags & SC_SPLASH_SCRN) - splash_init(sc->adp, scsplash_callback, sc); -#endif - } + if ((sc->config & SC_VESAMODE) != 0) + sc_set_vesa_mode(scp, sc, unit); #endif /* SC_PIXEL_MODE */ /* initialize cursor */ @@ -594,7 +665,7 @@ sckbdevent(keyboard_t *thiskbd, int event, void *arg) struct tty *cur_tty; int c, error = 0; size_t len; - u_char *cp; + const u_char *cp; sc = (sc_softc_t *)arg; /* assert(thiskbd == sc->kbd) */ @@ -633,6 +704,11 @@ sckbdevent(keyboard_t *thiskbd, int event, void *arg) ttydisc_rint(cur_tty, KEYCHAR(c), 0); break; case FKEY: /* function key, return string */ + cp = (*sc->cur_scp->tsw->te_fkeystr)(sc->cur_scp, c); + if (cp != NULL) { + ttydisc_rint_simple(cur_tty, cp, strlen(cp)); + break; + } cp = kbdd_get_fkeystr(thiskbd, KEYCHAR(c), &len); if (cp != NULL) ttydisc_rint_simple(cur_tty, cp, len); @@ -642,9 +718,7 @@ sckbdevent(keyboard_t *thiskbd, int event, void *arg) ttydisc_rint(cur_tty, KEYCHAR(c), 0); break; case BKEY: /* backtab fixed sequence (esc [ Z) */ - ttydisc_rint(cur_tty, 0x1b, 0); - ttydisc_rint(cur_tty, '[', 0); - ttydisc_rint(cur_tty, 'Z', 0); + ttydisc_rint_simple(cur_tty, "\x1B[Z", 3); break; } @@ -1541,7 +1615,7 @@ sc_cngetc(struct consdev *cd) static struct fkeytab fkey; static int fkeycp; scr_stat *scp; - u_char *p; + const u_char *p; int cur_mode; int s = spltty(); /* block sckbdevent and scrn_timer while we poll */ int c; @@ -1590,6 +1664,13 @@ sc_cngetc(struct consdev *cd) case 0: /* normal char */ return KEYCHAR(c); case FKEY: /* function key */ + p = (*scp->tsw->te_fkeystr)(scp, c); + if (p != NULL) { + fkey.len = strlen(p); + bcopy(p, fkey.str, fkey.len); + fkeycp = 1; + return fkey.str[0]; + } p = kbdd_get_fkeystr(scp->sc->kbd, KEYCHAR(c), (size_t *)&fkeycp); fkey.len = fkeycp; if ((p != NULL) && (fkey.len > 0)) { @@ -2049,6 +2130,11 @@ restore_scrn_saver_mode(scr_stat *scp, int changemode) } if (set_mode(scp) == 0) { #ifndef SC_NO_PALETTE_LOADING +#ifdef SC_PIXEL_MODE + if ((scp->sc->adp->va_flags & V_ADP_DAC8) != 0) + vidd_load_palette(scp->sc->adp, scp->sc->palette2); + else +#endif vidd_load_palette(scp->sc->adp, scp->sc->palette); #endif --scrn_blanked; @@ -2452,8 +2538,14 @@ exchange_scr(sc_softc_t *sc) if (!ISGRAPHSC(scp)) sc_set_cursor_image(scp); #ifndef SC_NO_PALETTE_LOADING - if (ISGRAPHSC(sc->old_scp)) + if (ISGRAPHSC(sc->old_scp)) { +#ifdef SC_PIXEL_MODE + if ((sc->adp->va_flags & V_ADP_DAC8) != 0) + vidd_load_palette(sc->adp, sc->palette2); + else +#endif vidd_load_palette(sc->adp, sc->palette); + } #endif sc_set_border(scp, scp->border); @@ -2802,6 +2894,10 @@ scinit(int unit, int flags) #ifndef SC_NO_PALETTE_LOADING vidd_save_palette(sc->adp, sc->palette); +#ifdef SC_PIXEL_MODE + for (i = 0; i < sizeof(sc->palette2); i++) + sc->palette2[i] = i / 3; +#endif #endif #ifdef DEV_SPLASH @@ -3390,14 +3486,15 @@ next_code: } static int -sctty_mmap(struct tty *tp, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +sctty_mmap(struct tty *tp, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { scr_stat *scp; scp = sc_get_stat(tp); if (scp != scp->sc->cur_scp) return -1; - return vidd_mmap(scp->sc->adp, offset, paddr, nprot); + return vidd_mmap(scp->sc->adp, offset, paddr, nprot, memattr); } static int @@ -3561,19 +3658,18 @@ sc_paste(scr_stat *scp, const u_char *p, int count) } void -sc_respond(scr_stat *scp, const u_char *p, int count) +sc_respond(scr_stat *scp, const u_char *p, int count, int wakeup) { struct tty *tp; tp = SC_DEV(scp->sc, scp->sc->cur_scp->index); if (!tty_opened(tp)) return; - for (; count > 0; --count) - ttydisc_rint(tp, *p++, 0); -#if 0 - /* XXX: we can't call ttydisc_rint_done() here! */ - ttydisc_rint_done(tp); -#endif + ttydisc_rint_simple(tp, p, count); + if (wakeup) { + /* XXX: we can't always call ttydisc_rint_done() here! */ + ttydisc_rint_done(tp); + } } void diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h index 202769f120c0..a23f88474a30 100644 --- a/sys/dev/syscons/syscons.h +++ b/sys/dev/syscons/syscons.h @@ -245,7 +245,10 @@ typedef struct sc_softc { #endif #ifndef SC_NO_PALETTE_LOADING - u_char palette[256*3]; + u_char palette[256 * 3]; +#ifdef SC_PIXEL_MODE + u_char palette2[256 * 3]; +#endif #endif #ifndef SC_NO_FONT_LOADING @@ -314,6 +317,7 @@ typedef struct scr_stat { short mouse_buttons; /* mouse buttons */ int mouse_cut_start; /* mouse cut start pos */ int mouse_cut_end; /* mouse cut end pos */ + int mouse_level; /* xterm mouse protocol */ struct proc *mouse_proc; /* proc* of controlling proc */ pid_t mouse_pid; /* pid of controlling proc */ int mouse_signal; /* signal # to report with */ @@ -380,6 +384,7 @@ typedef void sc_term_notify_t(scr_stat *scp, int event); #define SC_TE_NOTIFY_VTSWITCH_IN 0 #define SC_TE_NOTIFY_VTSWITCH_OUT 1 typedef int sc_term_input_t(scr_stat *scp, int c, struct tty *tp); +typedef const char *sc_term_fkeystr_t(scr_stat *scp, int c); typedef struct sc_term_sw { LIST_ENTRY(sc_term_sw) link; @@ -397,6 +402,7 @@ typedef struct sc_term_sw { sc_term_clear_t *te_clear; sc_term_notify_t *te_notify; sc_term_input_t *te_input; + sc_term_fkeystr_t *te_fkeystr; } sc_term_sw_t; #define SCTERM_MODULE(name, sw) \ @@ -564,7 +570,8 @@ int sc_switch_scr(sc_softc_t *sc, u_int next_scr); void sc_alloc_scr_buffer(scr_stat *scp, int wait, int discard); int sc_init_emulator(scr_stat *scp, char *name); void sc_paste(scr_stat *scp, const u_char *p, int count); -void sc_respond(scr_stat *scp, const u_char *p, int count); +void sc_respond(scr_stat *scp, const u_char *p, + int count, int wakeup); void sc_bell(scr_stat *scp, int pitch, int duration); /* schistory.c */ @@ -616,6 +623,7 @@ int sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode); int sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, int fontsize, int font_width); +int sc_support_pixel_mode(void *arg); int sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td); diff --git a/sys/dev/syscons/sysmouse.c b/sys/dev/syscons/sysmouse.c index 4e787efbbe51..c58e9aeae895 100644 --- a/sys/dev/syscons/sysmouse.c +++ b/sys/dev/syscons/sysmouse.c @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include diff --git a/sys/dev/tdfx/tdfx_pci.c b/sys/dev/tdfx/tdfx_pci.c index 08db0857c5a9..7ed00ac1979f 100644 --- a/sys/dev/tdfx/tdfx_pci.c +++ b/sys/dev/tdfx/tdfx_pci.c @@ -421,7 +421,8 @@ tdfx_close(struct cdev *dev, int fflag, int devtype, struct thread *td) } static int -tdfx_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +tdfx_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { /* * mmap(2) is called by a user process to request that an area of memory diff --git a/sys/dev/ti/if_ti.c b/sys/dev/ti/if_ti.c index 488d038c3022..20130bcd15f5 100644 --- a/sys/dev/ti/if_ti.c +++ b/sys/dev/ti/if_ti.c @@ -194,7 +194,7 @@ static void ti_init(void *); static void ti_init_locked(void *); static void ti_init2(struct ti_softc *); static void ti_stop(struct ti_softc *); -static void ti_watchdog(struct ifnet *); +static void ti_watchdog(void *); static int ti_shutdown(device_t); static int ti_ifmedia_upd(struct ifnet *); static void ti_ifmedia_sts(struct ifnet *, struct ifmediareq *); @@ -2285,6 +2285,7 @@ ti_attach(dev) mtx_init(&sc->ti_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); + callout_init_mtx(&sc->ti_watchdog, &sc->ti_mtx, 0); ifmedia_init(&sc->ifmedia, IFM_IMASK, ti_ifmedia_upd, ti_ifmedia_sts); ifp = sc->ti_ifp = if_alloc(IFT_ETHER); if (ifp == NULL) { @@ -2486,7 +2487,6 @@ ti_attach(dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = ti_ioctl; ifp->if_start = ti_start; - ifp->if_watchdog = ti_watchdog; ifp->if_init = ti_init; ifp->if_baudrate = 1000000000; ifp->if_mtu = ETHERMTU; @@ -2565,24 +2565,22 @@ ti_detach(dev) { struct ti_softc *sc; struct ifnet *ifp; - int attached; sc = device_get_softc(dev); if (sc->dev) destroy_dev(sc->dev); KASSERT(mtx_initialized(&sc->ti_mtx), ("ti mutex not initialized")); - attached = device_is_attached(dev); - TI_LOCK(sc); ifp = sc->ti_ifp; - if (attached) - ti_stop(sc); - TI_UNLOCK(sc); - if (attached) + if (device_is_attached(dev)) { ether_ifdetach(ifp); + TI_LOCK(sc); + ti_stop(sc); + TI_UNLOCK(sc); + } /* These should only be active if attach succeeded */ - if (attached) - bus_generic_detach(dev); + callout_drain(&sc->ti_watchdog); + bus_generic_detach(dev); ti_free_dmamaps(sc); ifmedia_removeall(&sc->ifmedia); @@ -2866,7 +2864,7 @@ ti_txeof(sc) } sc->ti_tx_saved_considx = idx; - ifp->if_timer = sc->ti_txcnt > 0 ? 5 : 0; + sc->ti_timer = sc->ti_txcnt > 0 ? 5 : 0; } static void @@ -3121,7 +3119,7 @@ ti_start_locked(ifp) /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->ti_timer = 5; } } @@ -3225,6 +3223,7 @@ static void ti_init2(sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + callout_reset(&sc->ti_watchdog, hz, ti_watchdog, sc); /* * Make sure to set media properly. We have to do this @@ -3786,30 +3785,31 @@ ti_ioctl2(struct cdev *dev, u_long cmd, caddr_t addr, int flag, } static void -ti_watchdog(ifp) - struct ifnet *ifp; +ti_watchdog(void *arg) { struct ti_softc *sc; + struct ifnet *ifp; - sc = ifp->if_softc; - TI_LOCK(sc); + sc = arg; + TI_LOCK_ASSERT(sc); + callout_reset(&sc->ti_watchdog, hz, ti_watchdog, sc); + if (sc->ti_timer == 0 || --sc->ti_timer > 0) + return; /* * When we're debugging, the chip is often stopped for long periods * of time, and that would normally cause the watchdog timer to fire. * Since that impedes debugging, we don't want to do that. */ - if (sc->ti_flags & TI_FLAG_DEBUGING) { - TI_UNLOCK(sc); + if (sc->ti_flags & TI_FLAG_DEBUGING) return; - } + ifp = sc->ti_ifp; if_printf(ifp, "watchdog timeout -- resetting\n"); ti_stop(sc); ti_init_locked(sc); ifp->if_oerrors++; - TI_UNLOCK(sc); } /* @@ -3859,6 +3859,7 @@ ti_stop(sc) sc->ti_tx_saved_considx = TI_TXCONS_UNSET; ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + callout_stop(&sc->ti_watchdog); } /* diff --git a/sys/dev/ti/if_tireg.h b/sys/dev/ti/if_tireg.h index 5f0bda9561a3..070a70af5ab9 100644 --- a/sys/dev/ti/if_tireg.h +++ b/sys/dev/ti/if_tireg.h @@ -1038,6 +1038,8 @@ struct ti_softc { int ti_if_flags; int ti_txcnt; struct mtx ti_mtx; + struct callout ti_watchdog; + int ti_timer; ti_flag_vals ti_flags; struct cdev *dev; }; diff --git a/sys/dev/tl/if_tl.c b/sys/dev/tl/if_tl.c index f1a3db8b59c6..d18d21a63b69 100644 --- a/sys/dev/tl/if_tl.c +++ b/sys/dev/tl/if_tl.c @@ -281,7 +281,7 @@ static int tl_ioctl(struct ifnet *, u_long, caddr_t); static void tl_init(void *); static void tl_init_locked(struct tl_softc *); static void tl_stop(struct tl_softc *); -static void tl_watchdog(struct ifnet *); +static void tl_watchdog(struct tl_softc *); static int tl_shutdown(device_t); static int tl_ifmedia_upd(struct ifnet *); static void tl_ifmedia_sts(struct ifnet *, struct ifmediareq *); @@ -1170,9 +1170,6 @@ tl_attach(dev) goto fail; } - sc->tl_btag = rman_get_bustag(sc->tl_res); - sc->tl_bhandle = rman_get_bushandle(sc->tl_res); - #ifdef notdef /* * The ThunderLAN manual suggests jacking the PCI latency @@ -1263,7 +1260,6 @@ tl_attach(dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = tl_ioctl; ifp->if_start = tl_start; - ifp->if_watchdog = tl_watchdog; ifp->if_init = tl_init; ifp->if_mtu = ETHERMTU; ifp->if_snd.ifq_maxlen = TL_TX_LIST_CNT - 1; @@ -1340,11 +1336,11 @@ tl_detach(dev) /* These should only be active if attach succeeded */ if (device_is_attached(dev)) { + ether_ifdetach(ifp); TL_LOCK(sc); tl_stop(sc); TL_UNLOCK(sc); callout_drain(&sc->tl_stat_callout); - ether_ifdetach(ifp); } if (sc->tl_miibus) device_delete_child(dev, sc->tl_miibus); @@ -1638,7 +1634,7 @@ tl_intvec_txeoc(xsc, type) ifp = sc->tl_ifp; /* Clear the timeout timer. */ - ifp->if_timer = 0; + sc->tl_timer = 0; if (sc->tl_cdata.tl_tx_head == NULL) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; @@ -1824,6 +1820,9 @@ tl_stats_update(xsc) } } + if (sc->tl_timer > 0 && --sc->tl_timer == 0) + tl_watchdog(sc); + callout_reset(&sc->tl_stat_callout, hz, tl_stats_update, sc); if (!sc->tl_bitrate) { @@ -2032,7 +2031,7 @@ tl_start_locked(ifp) /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->tl_timer = 5; return; } @@ -2257,21 +2256,20 @@ tl_ioctl(ifp, command, data) } static void -tl_watchdog(ifp) - struct ifnet *ifp; -{ +tl_watchdog(sc) struct tl_softc *sc; +{ + struct ifnet *ifp; - sc = ifp->if_softc; + TL_LOCK_ASSERT(sc); + ifp = sc->tl_ifp; if_printf(ifp, "device timeout\n"); - TL_LOCK(sc); ifp->if_oerrors++; tl_softreset(sc, 1); tl_init_locked(sc); - TL_UNLOCK(sc); return; } diff --git a/sys/dev/tl/if_tlreg.h b/sys/dev/tl/if_tlreg.h index f04b52bda59c..f0347e769ee0 100644 --- a/sys/dev/tl/if_tlreg.h +++ b/sys/dev/tl/if_tlreg.h @@ -112,8 +112,6 @@ struct tl_softc { struct ifnet *tl_ifp; device_t tl_dev; struct ifmedia ifmedia; /* media info */ - bus_space_handle_t tl_bhandle; - bus_space_tag_t tl_btag; void *tl_intrhand; struct resource *tl_irq; struct resource *tl_res; @@ -127,6 +125,7 @@ struct tl_softc { int tl_if_flags; struct callout tl_stat_callout; struct mtx tl_mtx; + int tl_timer; }; #define TL_LOCK(_sc) mtx_lock(&(_sc)->tl_mtx) @@ -493,19 +492,13 @@ struct tl_stats { /* * register space access macros */ -#define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->tl_btag, sc->tl_bhandle, reg, val) -#define CSR_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->tl_btag, sc->tl_bhandle, reg, val) -#define CSR_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->tl_btag, sc->tl_bhandle, reg, val) +#define CSR_WRITE_4(sc, reg, val) bus_write_4(sc->tl_res, reg, val) +#define CSR_WRITE_2(sc, reg, val) bus_write_2(sc->tl_res, reg, val) +#define CSR_WRITE_1(sc, reg, val) bus_write_1(sc->tl_res, reg, val) -#define CSR_READ_4(sc, reg) \ - bus_space_read_4(sc->tl_btag, sc->tl_bhandle, reg) -#define CSR_READ_2(sc, reg) \ - bus_space_read_2(sc->tl_btag, sc->tl_bhandle, reg) -#define CSR_READ_1(sc, reg) \ - bus_space_read_1(sc->tl_btag, sc->tl_bhandle, reg) +#define CSR_READ_4(sc, reg) bus_read_4(sc->tl_res, reg) +#define CSR_READ_2(sc, reg) bus_read_2(sc->tl_res, reg) +#define CSR_READ_1(sc, reg) bus_read_1(sc->tl_res, reg) #define CMD_PUT(sc, x) CSR_WRITE_4(sc, TL_HOSTCMD, x) #define CMD_SET(sc, x) \ diff --git a/sys/dev/trm/trm.c b/sys/dev/trm/trm.c index 222857fb7c37..e7d5aad6d77d 100644 --- a/sys/dev/trm/trm.c +++ b/sys/dev/trm/trm.c @@ -746,15 +746,6 @@ trm_action(struct cam_sim *psim, union ccb *pccb) pccb->ccb_h.status = CAM_REQ_INVALID; xpt_done(pccb); break; - /* - * (Re)Scan the SCSI Bus - * Rescan the given bus, or bus/target/lun - */ - case XPT_SCAN_BUS: - TRM_DPRINTF(" XPT_SCAN_BUS \n"); - pccb->ccb_h.status = CAM_REQ_INVALID; - xpt_done(pccb); - break; /* * Get EDT entries matching the given pattern */ @@ -818,15 +809,6 @@ trm_action(struct cam_sim *psim, union ccb *pccb) pccb->ccb_h.status = CAM_REQ_INVALID; xpt_done(pccb); break; - /* - * Scan Logical Unit - */ - case XPT_SCAN_LUN: - TRM_DPRINTF(" XPT_SCAN_LUN \n"); - pccb->ccb_h.status = CAM_REQ_INVALID; - xpt_done(pccb); - break; - /* * Get/Set transfer rate/width/disconnection/tag queueing * settings @@ -2770,7 +2752,7 @@ trm_DoingSRB_Done(PACB pACB) xpt_done(pccb); psrb = psrb2; } - pdcb->GoingSRBCnt = 0;; + pdcb->GoingSRBCnt = 0; pdcb->pGoingSRB = NULL; pdcb = pdcb->pNextDCB; } diff --git a/sys/dev/tsec/if_tsec.c b/sys/dev/tsec/if_tsec.c index 2fb271019dde..204fce932b2b 100644 --- a/sys/dev/tsec/if_tsec.c +++ b/sys/dev/tsec/if_tsec.c @@ -716,9 +716,9 @@ tsec_start_locked(struct ifnet *ifp) bus_dmamap_sync(sc->tsec_tx_dtag, sc->tsec_tx_dmap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - for (;;) { + while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { /* Get packet from the queue */ - IF_DEQUEUE(&ifp->if_snd, m0); + IFQ_DRV_DEQUEUE(&ifp->if_snd, m0); if (m0 == NULL) break; @@ -755,7 +755,7 @@ tsec_start_locked(struct ifnet *ifp) m0 = mtmp; if (tsec_encap(sc, m0, fcb_inserted)) { - IF_PREPEND(&ifp->if_snd, m0); + IFQ_DRV_PREPEND(&ifp->if_snd, m0); ifp->if_drv_flags |= IFF_DRV_OACTIVE; break; } diff --git a/sys/dev/twa/tw_osl_cam.c b/sys/dev/twa/tw_osl_cam.c index b7a085f19789..1d22920f291b 100644 --- a/sys/dev/twa/tw_osl_cam.c +++ b/sys/dev/twa/tw_osl_cam.c @@ -56,7 +56,6 @@ static TW_VOID twa_action(struct cam_sim *sim, union ccb *ccb); static TW_VOID twa_poll(struct cam_sim *sim); static TW_VOID twa_timeout(TW_VOID *arg); -static TW_VOID twa_bus_scan_cb(struct cam_periph *periph, union ccb *ccb); static TW_INT32 tw_osli_execute_scsi(struct tw_osli_req_context *req, union ccb *ccb); @@ -76,7 +75,6 @@ TW_INT32 tw_osli_cam_attach(struct twa_softc *sc) { struct cam_devq *devq; - TW_INT32 error; tw_osli_dbg_dprintf(3, sc, "entered"); @@ -149,23 +147,8 @@ tw_osli_cam_attach(struct twa_softc *sc) mtx_unlock(sc->sim_lock); return(ENXIO); } - - tw_osli_dbg_dprintf(3, sc, "Calling xpt_setup_ccb"); mtx_unlock(sc->sim_lock); - tw_osli_dbg_dprintf(3, sc, "Calling tw_osli_request_bus_scan"); - /* - * Request a bus scan, so that CAM gets to know of - * the logical units that we control. - */ - if ((error = tw_osli_request_bus_scan(sc))) - tw_osli_printf(sc, "error = %d", - TW_CL_SEVERITY_ERROR_STRING, - TW_CL_MESSAGE_SOURCE_FREEBSD_DRIVER, - 0x2104, - "Bus scan request to CAM failed", - error); - tw_osli_dbg_dprintf(3, sc, "exiting"); return(0); } @@ -561,7 +544,6 @@ twa_timeout(TW_VOID *arg) TW_INT32 tw_osli_request_bus_scan(struct twa_softc *sc) { - struct cam_path *path; union ccb *ccb; tw_osli_dbg_dprintf(3, sc, "entering"); @@ -569,13 +551,12 @@ tw_osli_request_bus_scan(struct twa_softc *sc) /* If we get here before sc->sim is initialized, return an error. */ if (!(sc->sim)) return(ENXIO); - if ((ccb = malloc(sizeof(union ccb), M_TEMP, M_WAITOK)) == NULL) + if ((ccb = xpt_alloc_ccb()) == NULL) return(ENOMEM); - bzero(ccb, sizeof(union ccb)); mtx_lock(sc->sim_lock); - if (xpt_create_path(&path, xpt_periph, cam_sim_path(sc->sim), - CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { - free(ccb, M_TEMP); + if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(sc->sim), + CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) { + xpt_free_ccb(ccb); mtx_unlock(sc->sim_lock); return(EIO); } @@ -586,43 +567,13 @@ tw_osli_request_bus_scan(struct twa_softc *sc) sc->state &= ~TW_OSLI_CTLR_STATE_SIMQ_FROZEN; } - xpt_setup_ccb(&ccb->ccb_h, path, 5); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = twa_bus_scan_cb; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); + xpt_rescan(ccb); mtx_unlock(sc->sim_lock); return(0); } -/* - * Function name: twa_bus_scan_cb - * Description: Callback from CAM on a bus scan request. - * - * Input: periph -- we don't use this - * ccb -- bus scan request ccb that we sent to CAM - * Output: None - * Return value: None - */ -static TW_VOID -twa_bus_scan_cb(struct cam_periph *periph, union ccb *ccb) -{ - tw_osli_dbg_printf(3, "entering"); - - if (ccb->ccb_h.status != CAM_REQ_CMP) - printf("cam_scan_callback: failure status = %x\n", - ccb->ccb_h.status); - else - tw_osli_dbg_printf(3, "success"); - - xpt_free_path(ccb->ccb_h.path); - free(ccb, M_TEMP); -} - - - /* * Function name: tw_osli_allow_new_requests * Description: Sets the appropriate status bits in a ccb such that, diff --git a/sys/dev/twe/twe.c b/sys/dev/twe/twe.c index 90dfa2e505e4..6994cb4106d1 100644 --- a/sys/dev/twe/twe.c +++ b/sys/dev/twe/twe.c @@ -201,7 +201,7 @@ twe_add_unit(struct twe_softc *sc, int unit) int table, error = 0; u_int16_t dsize; TWE_Param *drives = NULL, *param = NULL; - TWE_Unit_Descriptor *ud; + TWE_Array_Descriptor *ud; if (unit < 0 || unit > TWE_MAX_UNITS) return (EINVAL); @@ -244,8 +244,9 @@ twe_add_unit(struct twe_softc *sc, int unit) error = EIO; goto out; } - ud = (TWE_Unit_Descriptor *)param->data; + ud = (TWE_Array_Descriptor *)param->data; dr->td_type = ud->configuration; + dr->td_stripe = ud->stripe_size; /* build synthetic geometry as per controller internal rules */ if (dr->td_size > 0x200000) { diff --git a/sys/dev/twe/twe_freebsd.c b/sys/dev/twe/twe_freebsd.c index 9ad65c94d9e2..0328599c1293 100644 --- a/sys/dev/twe/twe_freebsd.c +++ b/sys/dev/twe/twe_freebsd.c @@ -818,6 +818,13 @@ twed_attach(device_t dev) sc->twed_disk->d_maxsize = (TWE_MAX_SGL_LENGTH - 1) * PAGE_SIZE; sc->twed_disk->d_sectorsize = TWE_BLOCK_SIZE; sc->twed_disk->d_mediasize = TWE_BLOCK_SIZE * (off_t)sc->twed_drive->td_size; + if (sc->twed_drive->td_type == TWE_UD_CONFIG_RAID0 || + sc->twed_drive->td_type == TWE_UD_CONFIG_RAID5 || + sc->twed_drive->td_type == TWE_UD_CONFIG_RAID10) { + sc->twed_disk->d_stripesize = + TWE_BLOCK_SIZE << sc->twed_drive->td_stripe; + sc->twed_disk->d_stripeoffset = 0; + } sc->twed_disk->d_fwsectors = sc->twed_drive->td_sectors; sc->twed_disk->d_fwheads = sc->twed_drive->td_heads; sc->twed_disk->d_unit = sc->twed_drive->td_sys_unit; diff --git a/sys/dev/twe/twevar.h b/sys/dev/twe/twevar.h index 2711ccc94932..4990ca80666d 100644 --- a/sys/dev/twe/twevar.h +++ b/sys/dev/twe/twevar.h @@ -59,6 +59,7 @@ struct twe_drive /* unit state and type */ u_int8_t td_state; u_int8_t td_type; + u_int8_t td_stripe; /* handle for attached driver */ device_t td_disk; diff --git a/sys/dev/uart/uart_bus.h b/sys/dev/uart/uart_bus.h index 7154d859026a..b1498f5f0a99 100644 --- a/sys/dev/uart/uart_bus.h +++ b/sys/dev/uart/uart_bus.h @@ -96,6 +96,7 @@ struct uart_softc { int sc_opened:1; /* This UART is open for business. */ int sc_polled:1; /* This UART has no interrupts. */ int sc_txbusy:1; /* This UART is transmitting. */ + int sc_isquelch:1; /* This UART has input squelched. */ struct uart_devinfo *sc_sysdev; /* System device (or NULL). */ @@ -141,6 +142,8 @@ int uart_bus_ipend(device_t dev); int uart_bus_probe(device_t dev, int regshft, int rclk, int rid, int chan); int uart_bus_sysdev(device_t dev); +void uart_sched_softih(struct uart_softc *, uint32_t); + int uart_tty_attach(struct uart_softc *); int uart_tty_detach(struct uart_softc *); void uart_tty_intr(void *arg); @@ -174,6 +177,28 @@ uart_rx_get(struct uart_softc *sc) return (xc); } +static __inline int +uart_rx_next(struct uart_softc *sc) +{ + int ptr; + + ptr = sc->sc_rxget; + if (ptr == sc->sc_rxput) + return (-1); + ptr += 1; + sc->sc_rxget = (ptr < sc->sc_rxbufsz) ? ptr : 0; + return (0); +} + +static __inline int +uart_rx_peek(struct uart_softc *sc) +{ + int ptr; + + ptr = sc->sc_rxget; + return ((ptr == sc->sc_rxput) ? -1 : sc->sc_rxbuf[ptr]); +} + static __inline int uart_rx_put(struct uart_softc *sc, int xc) { diff --git a/sys/dev/uart/uart_bus_acpi.c b/sys/dev/uart/uart_bus_acpi.c index 042dfef5d219..d320b73a799e 100644 --- a/sys/dev/uart/uart_bus_acpi.c +++ b/sys/dev/uart/uart_bus_acpi.c @@ -59,6 +59,7 @@ static driver_t uart_acpi_driver = { static struct isa_pnp_id acpi_ns8250_ids[] = { {0x0005d041, "Standard PC COM port"}, /* PNP0500 */ {0x0105d041, "16550A-compatible COM port"}, /* PNP0501 */ + {0x04f0235c, "Wacom Tablet PC Screen"}, /* WACF004 */ {0} }; diff --git a/sys/dev/uart/uart_bus_ebus.c b/sys/dev/uart/uart_bus_ebus.c index e4ea2d149376..c79c91e908ef 100644 --- a/sys/dev/uart/uart_bus_ebus.c +++ b/sys/dev/uart/uart_bus_ebus.c @@ -77,7 +77,7 @@ uart_ebus_probe(device_t dev) if (!strcmp(nm, "lom-console") || !strcmp(nm, "su") || !strcmp(nm, "su_pnp") || !strcmp(cmpt, "rsc-console") || !strcmp(cmpt, "rsc-control") || !strcmp(cmpt, "su") || - !strcmp(cmpt, "su16550")) { + !strcmp(cmpt, "su16550") || !strcmp(cmpt, "su16552")) { /* * On AXi and AXmp boards the NS16550 (used to connect * keyboard/mouse) share their IRQ lines with the i8042. diff --git a/sys/dev/uart/uart_bus_pci.c b/sys/dev/uart/uart_bus_pci.c index 7a01e77a06a6..48a134bdbd17 100644 --- a/sys/dev/uart/uart_bus_pci.c +++ b/sys/dev/uart/uart_bus_pci.c @@ -110,7 +110,11 @@ static struct pci_id pci_ns8250_ids[] = { { 0x1415, 0x950b, 0xffff, 0, "Oxford Semiconductor OXCB950 Cardbus 16950 UART", 0x10, 16384000 }, { 0x151f, 0x0000, 0xffff, 0, "TOPIC Semiconductor TP560 56k modem", 0x10 }, +{ 0x9710, 0x9820, 0x1000, 1, "NetMos NM9820 Serial Port", 0x10 }, { 0x9710, 0x9835, 0x1000, 1, "NetMos NM9835 Serial Port", 0x10 }, +{ 0x9710, 0x9865, 0xa000, 0x1000, "NetMos NM9865 Serial Port", 0x10 }, +{ 0x9710, 0x9901, 0xa000, 0x1000, + "MosChip MCS9901 PCIe to Peripheral Controller", 0x10 }, { 0xdeaf, 0x9051, 0xffff, 0, "Middle Digital PC Weasel Serial Port", 0x10 }, { 0xffff, 0, 0xffff, 0, NULL, 0, 0} }; diff --git a/sys/dev/uart/uart_core.c b/sys/dev/uart/uart_core.c index 932c08ab4638..38d2a8f73773 100644 --- a/sys/dev/uart/uart_core.c +++ b/sys/dev/uart/uart_core.c @@ -45,7 +45,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -91,7 +90,7 @@ uart_getrange(struct uart_class *uc) * Schedule a soft interrupt. We do this on the 0 to !0 transition * of the TTY pending interrupt status. */ -static void +void uart_sched_softih(struct uart_softc *sc, uint32_t ipend) { uint32_t new, old; diff --git a/sys/dev/uart/uart_cpu_sparc64.c b/sys/dev/uart/uart_cpu_sparc64.c index 9d92a3908732..0f40cb70bd73 100644 --- a/sys/dev/uart/uart_cpu_sparc64.c +++ b/sys/dev/uart/uart_cpu_sparc64.c @@ -254,7 +254,8 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) addr += range - range * (di->bas.chan - 1); } else if (!strcmp(buf, "lom-console") || !strcmp(buf, "su") || !strcmp(buf, "su_pnp") || !strcmp(compat, "rsc-console") || - !strcmp(compat, "su") || !strcmp(compat, "su16550")) { + !strcmp(compat, "su") || !strcmp(compat, "su16550") || + !strcmp(compat, "su16552")) { class = &uart_ns8250_class; di->bas.chan = 0; } diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c index cb77f65ecae9..f306af53f163 100644 --- a/sys/dev/uart/uart_tty.c +++ b/sys/dev/uart/uart_tty.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -166,27 +165,6 @@ uart_tty_outwakeup(struct tty *tp) if (sc == NULL || sc->sc_leaving) return; - /* - * Handle input flow control. Note that if we have hardware support, - * we don't do anything here. We continue to receive until our buffer - * is full. At that time we cannot empty the UART itself and it will - * de-assert RTS for us. In that situation we're completely stuffed. - * Without hardware support, we need to toggle RTS ourselves. - */ - if ((tp->t_termios.c_cflag & CRTS_IFLOW) && !sc->sc_hwiflow) { -#if 0 - /*if ((tp->t_state & TS_TBLOCK) && - (sc->sc_hwsig & SER_RTS)) - UART_SETSIG(sc, SER_DRTS); - else */ if (/*!(tp->t_state & TS_TBLOCK) &&*/ - !(sc->sc_hwsig & SER_RTS)) - UART_SETSIG(sc, SER_DRTS|SER_RTS); -#endif - /* XXX: we should use inwakeup to implement this! */ - if (!(sc->sc_hwsig & SER_RTS)) - UART_SETSIG(sc, SER_DRTS|SER_RTS); - } - if (sc->sc_txbusy) return; @@ -195,6 +173,23 @@ uart_tty_outwakeup(struct tty *tp) UART_TRANSMIT(sc); } +static void +uart_tty_inwakeup(struct tty *tp) +{ + struct uart_softc *sc; + + sc = tty_softc(tp); + if (sc == NULL || sc->sc_leaving) + return; + + if (sc->sc_isquelch) { + if ((tp->t_termios.c_cflag & CRTS_IFLOW) && !sc->sc_hwiflow) + UART_SETSIG(sc, SER_DRTS|SER_RTS); + sc->sc_isquelch = 0; + uart_sched_softih(sc, SER_INT_RXREADY); + } +} + static int uart_tty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) { @@ -252,9 +247,9 @@ uart_tty_param(struct tty *tp, struct termios *t) UART_SETSIG(sc, SER_DDTR | SER_DTR); /* Set input flow control state. */ if (!sc->sc_hwiflow) { - /* if ((t->c_cflag & CRTS_IFLOW) && (tp->t_state & TS_TBLOCK)) + if ((t->c_cflag & CRTS_IFLOW) && sc->sc_isquelch) UART_SETSIG(sc, SER_DRTS); - else */ + else UART_SETSIG(sc, SER_DRTS | SER_RTS); } else UART_IOCTL(sc, UART_IOCTL_IFLOW, (t->c_cflag & CRTS_IFLOW)); @@ -294,8 +289,8 @@ uart_tty_intr(void *arg) tty_lock(tp); if (pend & SER_INT_RXREADY) { - while (!uart_rx_empty(sc) /* && !(tp->t_state & TS_TBLOCK)*/) { - xc = uart_rx_get(sc); + while (!uart_rx_empty(sc) && !sc->sc_isquelch) { + xc = uart_rx_peek(sc); c = xc & 0xff; if (xc & UART_STAT_FRAMERR) err |= TRE_FRAMING; @@ -303,7 +298,13 @@ uart_tty_intr(void *arg) err |= TRE_OVERRUN; if (xc & UART_STAT_PARERR) err |= TRE_PARITY; - ttydisc_rint(tp, c, err); + if (ttydisc_rint(tp, c, err) != 0) { + sc->sc_isquelch = 1; + if ((tp->t_termios.c_cflag & CRTS_IFLOW) && + !sc->sc_hwiflow) + UART_SETSIG(sc, SER_DRTS); + } else + uart_rx_next(sc); } } @@ -344,6 +345,7 @@ static struct ttydevsw uart_tty_class = { .tsw_open = uart_tty_open, .tsw_close = uart_tty_close, .tsw_outwakeup = uart_tty_outwakeup, + .tsw_inwakeup = uart_tty_inwakeup, .tsw_ioctl = uart_tty_ioctl, .tsw_param = uart_tty_param, .tsw_modem = uart_tty_modem, diff --git a/sys/dev/usb/controller/at91dci.c b/sys/dev/usb/controller/at91dci.c index d9f8e4066c31..fc0db86a3b85 100644 --- a/sys/dev/usb/controller/at91dci.c +++ b/sys/dev/usb/controller/at91dci.c @@ -894,6 +894,7 @@ at91dci_setup_standard_chain(struct usb_xfer *xfer) /* setup temp */ + temp.pc = NULL; temp.td = NULL; temp.td_next = xfer->td_start[0]; temp.offset = 0; diff --git a/sys/dev/usb/controller/atmegadci.c b/sys/dev/usb/controller/atmegadci.c index 9b60ad7e17be..adbd972db6d5 100644 --- a/sys/dev/usb/controller/atmegadci.c +++ b/sys/dev/usb/controller/atmegadci.c @@ -301,8 +301,8 @@ atmegadci_setup_rx(struct atmegadci_td *td) sc->sc_dv_addr = 0xFF; } - /* clear SETUP packet interrupt */ - ATMEGA_WRITE_1(sc, ATMEGA_UEINTX, ~ATMEGA_UEINTX_RXSTPI); + /* Clear SETUP packet interrupt and all other previous interrupts */ + ATMEGA_WRITE_1(sc, ATMEGA_UEINTX, 0); return (0); /* complete */ not_complete: @@ -797,6 +797,7 @@ atmegadci_setup_standard_chain(struct usb_xfer *xfer) /* setup temp */ + temp.pc = NULL; temp.td = NULL; temp.td_next = xfer->td_start[0]; temp.offset = 0; @@ -1191,7 +1192,8 @@ atmegadci_clear_stall_sub(struct atmegadci_softc *sc, uint8_t ep_no, temp = ATMEGA_READ_1(sc, ATMEGA_UESTA0X); if (!(temp & ATMEGA_UESTA0X_CFGOK)) { - DPRINTFN(0, "Chip rejected configuration\n"); + device_printf(sc->sc_bus.bdev, + "Chip rejected configuration\n"); } } while (0); } @@ -1913,7 +1915,8 @@ tr_handle_clear_port_feature: /* check valid config */ temp = ATMEGA_READ_1(sc, ATMEGA_UESTA0X); if (!(temp & ATMEGA_UESTA0X_CFGOK)) { - DPRINTFN(0, "Chip rejected EP0 configuration\n"); + device_printf(sc->sc_bus.bdev, + "Chip rejected EP0 configuration\n"); } break; case UHF_C_PORT_SUSPEND: diff --git a/sys/dev/usb/controller/avr32dci.c b/sys/dev/usb/controller/avr32dci.c index f251f9109ae8..8abe46c4a6c4 100644 --- a/sys/dev/usb/controller/avr32dci.c +++ b/sys/dev/usb/controller/avr32dci.c @@ -767,6 +767,7 @@ avr32dci_setup_standard_chain(struct usb_xfer *xfer) /* setup temp */ + temp.pc = NULL; temp.td = NULL; temp.td_next = xfer->td_start[0]; temp.offset = 0; @@ -1159,7 +1160,7 @@ avr32dci_clear_stall_sub(struct avr32dci_softc *sc, uint8_t ep_no, temp = AVR32_READ_4(sc, AVR32_EPTCFG(ep_no)); if (!(temp & AVR32_EPTCFG_EPT_MAPD)) { - DPRINTFN(0, "Chip rejected configuration\n"); + device_printf(sc->sc_bus.bdev, "Chip rejected configuration\n"); } else { AVR32_WRITE_4(sc, AVR32_EPTCTLENB(ep_no), AVR32_EPTCTL_EPT_ENABL); @@ -1839,7 +1840,8 @@ tr_handle_clear_port_feature: temp = AVR32_READ_4(sc, AVR32_EPTCFG(0)); if (!(temp & AVR32_EPTCFG_EPT_MAPD)) { - DPRINTFN(0, "Chip rejected configuration\n"); + device_printf(sc->sc_bus.bdev, + "Chip rejected configuration\n"); } else { AVR32_WRITE_4(sc, AVR32_EPTCTLENB(0), AVR32_EPTCTL_EPT_ENABL); diff --git a/sys/dev/usb/controller/ehci.c b/sys/dev/usb/controller/ehci.c index 30c9bb967abb..28ad987b31dc 100644 --- a/sys/dev/usb/controller/ehci.c +++ b/sys/dev/usb/controller/ehci.c @@ -83,6 +83,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #define EHCI_BUS2SC(bus) \ ((ehci_softc_t *)(((uint8_t *)(bus)) - \ @@ -91,12 +92,23 @@ __FBSDID("$FreeBSD$"); #if USB_DEBUG static int ehcidebug = 0; static int ehcinohighspeed = 0; +static int ehciiaadbug = 0; +static int ehcilostintrbug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, ehci, CTLFLAG_RW, 0, "USB ehci"); SYSCTL_INT(_hw_usb_ehci, OID_AUTO, debug, CTLFLAG_RW, &ehcidebug, 0, "Debug level"); SYSCTL_INT(_hw_usb_ehci, OID_AUTO, no_hs, CTLFLAG_RW, &ehcinohighspeed, 0, "Disable High Speed USB"); +SYSCTL_INT(_hw_usb_ehci, OID_AUTO, iaadbug, CTLFLAG_RW, + &ehciiaadbug, 0, "Enable doorbell bug workaround"); +SYSCTL_INT(_hw_usb_ehci, OID_AUTO, lostintrbug, CTLFLAG_RW, + &ehcilostintrbug, 0, "Enable lost interrupt bug workaround"); + +TUNABLE_INT("hw.usb.ehci.debug", &ehcidebug); +TUNABLE_INT("hw.usb.ehci.no_hs", &ehcinohighspeed); +TUNABLE_INT("hw.usb.ehci.iaadbug", &ehciiaadbug); +TUNABLE_INT("hw.usb.ehci.lostintrbug", &ehcilostintrbug); static void ehci_dump_regs(ehci_softc_t *sc); static void ehci_dump_sqh(ehci_softc_t *sc, ehci_qh_t *sqh); @@ -112,10 +124,12 @@ extern struct usb_pipe_methods ehci_device_intr_methods; extern struct usb_pipe_methods ehci_device_isoc_fs_methods; extern struct usb_pipe_methods ehci_device_isoc_hs_methods; -static void ehci_do_poll(struct usb_bus *bus); -static void ehci_device_done(struct usb_xfer *xfer, usb_error_t error); -static uint8_t ehci_check_transfer(struct usb_xfer *xfer); -static void ehci_timeout(void *arg); +static void ehci_do_poll(struct usb_bus *); +static void ehci_device_done(struct usb_xfer *, usb_error_t); +static uint8_t ehci_check_transfer(struct usb_xfer *); +static void ehci_timeout(void *); +static void ehci_poll_timeout(void *); + static void ehci_root_intr(ehci_softc_t *sc); struct ehci_std_temp { @@ -131,6 +145,7 @@ struct ehci_std_temp { uint8_t auto_data_toggle; uint8_t setup_alt_next; uint8_t last_frame; + uint8_t can_use_next; }; void @@ -241,8 +256,13 @@ ehci_init(ehci_softc_t *sc) DPRINTF("start\n"); usb_callout_init_mtx(&sc->sc_tmo_pcd, &sc->sc_bus.bus_mtx, 0); + usb_callout_init_mtx(&sc->sc_tmo_poll, &sc->sc_bus.bus_mtx, 0); #if USB_DEBUG + if (ehciiaadbug) + sc->sc_flags |= EHCI_SCFLG_IAADBUG; + if (ehcilostintrbug) + sc->sc_flags |= EHCI_SCFLG_LOSTINTRBUG; if (ehcidebug > 2) { ehci_dump_regs(sc); } @@ -518,8 +538,9 @@ ehci_detach(ehci_softc_t *sc) USB_BUS_LOCK(&sc->sc_bus); usb_callout_stop(&sc->sc_tmo_pcd); + usb_callout_stop(&sc->sc_tmo_poll); - EOWRITE4(sc, EHCI_USBINTR, sc->sc_eintrs); + EOWRITE4(sc, EHCI_USBINTR, 0); USB_BUS_UNLOCK(&sc->sc_bus); if (ehci_hcreset(sc)) { @@ -530,6 +551,7 @@ ehci_detach(ehci_softc_t *sc) usb_pause_mtx(NULL, hz / 20); usb_callout_drain(&sc->sc_tmo_pcd); + usb_callout_drain(&sc->sc_tmo_poll); } void @@ -1207,11 +1229,6 @@ ehci_non_isoc_done_sub(struct usb_xfer *xfer) xfer->td_transfer_cache = td; - /* update data toggle */ - - xfer->endpoint->toggle_next = - (status & EHCI_QTD_TOGGLE_MASK) ? 1 : 0; - #if USB_DEBUG if (status & EHCI_QTD_STATERRS) { DPRINTFN(11, "error, addr=%d, endpt=0x%02x, frame=0x%02x" @@ -1235,6 +1252,9 @@ ehci_non_isoc_done_sub(struct usb_xfer *xfer) static void ehci_non_isoc_done(struct usb_xfer *xfer) { + ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus); + ehci_qh_t *qh; + uint32_t status; usb_error_t err = 0; DPRINTFN(13, "xfer=%p endpoint=%p transfer done\n", @@ -1248,6 +1268,17 @@ ehci_non_isoc_done(struct usb_xfer *xfer) } #endif + /* extract data toggle directly from the QH's overlay area */ + + qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; + + usb_pc_cpu_invalidate(qh->page_cache); + + status = hc32toh(sc, qh->qh_qtd.qtd_status); + + xfer->endpoint->toggle_next = + (status & EHCI_QTD_TOGGLE_MASK) ? 1 : 0; + /* reset scanner */ xfer->td_transfer_cache = xfer->td_transfer_first; @@ -1321,25 +1352,22 @@ ehci_check_transfer(struct usb_xfer *xfer) } } else if (methods == &ehci_device_isoc_hs_methods) { ehci_itd_t *td; + uint8_t n = (xfer->nframes & 7); /* isochronous high speed transfer */ + /* check last transfer */ td = xfer->td_transfer_last; usb_pc_cpu_invalidate(td->page_cache); - status = - td->itd_status[0] | td->itd_status[1] | - td->itd_status[2] | td->itd_status[3] | - td->itd_status[4] | td->itd_status[5] | - td->itd_status[6] | td->itd_status[7]; + if (n == 0) + status = td->itd_status[7]; + else + status = td->itd_status[n-1]; /* also check first transfer */ td = xfer->td_transfer_first; usb_pc_cpu_invalidate(td->page_cache); - status |= - td->itd_status[0] | td->itd_status[1] | - td->itd_status[2] | td->itd_status[3] | - td->itd_status[4] | td->itd_status[5] | - td->itd_status[6] | td->itd_status[7]; + status |= td->itd_status[0]; /* if no transactions are active we continue */ if (!(status & htohc32(sc, EHCI_ITD_ACTIVE))) { @@ -1348,6 +1376,7 @@ ehci_check_transfer(struct usb_xfer *xfer) } } else { ehci_qtd_t *td; + ehci_qh_t *qh; /* non-isochronous transfer */ @@ -1357,16 +1386,35 @@ ehci_check_transfer(struct usb_xfer *xfer) */ td = xfer->td_transfer_cache; + qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; + + usb_pc_cpu_invalidate(qh->page_cache); + + status = hc32toh(sc, qh->qh_qtd.qtd_status); + if (status & EHCI_QTD_ACTIVE) { + /* transfer is pending */ + goto done; + } + while (1) { usb_pc_cpu_invalidate(td->page_cache); status = hc32toh(sc, td->qtd_status); /* - * if there is an active TD the transfer isn't done + * Check if there is an active TD which + * indicates that the transfer isn't done. */ if (status & EHCI_QTD_ACTIVE) { /* update cache */ - xfer->td_transfer_cache = td; + if (xfer->td_transfer_cache != td) { + xfer->td_transfer_cache = td; + if (qh->qh_qtd.qtd_next & + htohc32(sc, EHCI_LINK_TERMINATE)) { + /* XXX - manually advance to next frame */ + qh->qh_qtd.qtd_next = td->qtd_self; + usb_pc_cpu_flush(td->page_cache); + } + } goto done; } /* @@ -1441,6 +1489,28 @@ repeat: } } +/* + * Some EHCI chips from VIA / ATI seem to trigger interrupts before + * writing back the qTD status, or miss signalling occasionally under + * heavy load. If the host machine is too fast, we can miss + * transaction completion - when we scan the active list the + * transaction still seems to be active. This generally exhibits + * itself as a umass stall that never recovers. + * + * We work around this behaviour by setting up this callback after any + * softintr that completes with transactions still pending, giving us + * another chance to check for completion after the writeback has + * taken place. + */ +static void +ehci_poll_timeout(void *arg) +{ + ehci_softc_t *sc = arg; + + DPRINTFN(3, "\n"); + ehci_interrupt_poll(sc); +} + /*------------------------------------------------------------------------* * ehci_interrupt - EHCI interrupt handler * @@ -1508,6 +1578,11 @@ ehci_interrupt(ehci_softc_t *sc) /* poll all the USB transfers */ ehci_interrupt_poll(sc); + if (sc->sc_flags & EHCI_SCFLG_LOSTINTRBUG) { + usb_callout_reset(&sc->sc_tmo_poll, hz / 128, + (void *)&ehci_poll_timeout, sc); + } + done: USB_BUS_UNLOCK(&sc->sc_bus); } @@ -1545,7 +1620,6 @@ ehci_setup_standard_chain_sub(struct ehci_std_temp *temp) ehci_qtd_t *td; ehci_qtd_t *td_next; ehci_qtd_t *td_alt_next; - uint32_t qtd_altnext; uint32_t buf_offset; uint32_t average; uint32_t len_old; @@ -1554,7 +1628,6 @@ ehci_setup_standard_chain_sub(struct ehci_std_temp *temp) uint8_t precompute; terminate = htohc32(temp->sc, EHCI_LINK_TERMINATE); - qtd_altnext = terminate; td_alt_next = NULL; buf_offset = 0; shortpkt_old = temp->shortpkt; @@ -1612,7 +1685,8 @@ restart: td->qtd_status = temp->qtd_status | - htohc32(temp->sc, EHCI_QTD_SET_BYTES(average)); + htohc32(temp->sc, EHCI_QTD_IOC | + EHCI_QTD_SET_BYTES(average)); if (average == 0) { @@ -1687,11 +1761,23 @@ restart: td->qtd_buffer_hi[x] = 0; } - if (td_next) { - /* link the current TD with the next one */ - td->qtd_next = td_next->qtd_self; + if (temp->can_use_next) { + if (td_next) { + /* link the current TD with the next one */ + td->qtd_next = td_next->qtd_self; + } + } else { + /* + * BUG WARNING: The EHCI HW can use the + * qtd_next field instead of qtd_altnext when + * a short packet is received! We work this + * around in software by not queueing more + * than one job/TD at a time! + */ + td->qtd_next = terminate; } - td->qtd_altnext = qtd_altnext; + + td->qtd_altnext = terminate; td->alt_next = td_alt_next; usb_pc_cpu_flush(td->page_cache); @@ -1703,15 +1789,9 @@ restart: /* setup alt next pointer, if any */ if (temp->last_frame) { td_alt_next = NULL; - qtd_altnext = terminate; } else { /* we use this field internally */ td_alt_next = td_next; - if (temp->setup_alt_next) { - qtd_altnext = td_next->qtd_self; - } else { - qtd_altnext = terminate; - } } /* restore */ @@ -1756,6 +1836,8 @@ ehci_setup_standard_chain(struct usb_xfer *xfer, ehci_qh_t **qh_last) temp.qtd_status = 0; temp.last_frame = 0; temp.setup_alt_next = xfer->flags_int.short_frames_ok; + temp.can_use_next = (xfer->flags_int.control_xfr || + (UE_GET_DIR(xfer->endpointno) == UE_DIR_OUT)); if (xfer->flags_int.control_xfr) { if (xfer->endpoint->toggle_next) { @@ -1889,7 +1971,6 @@ ehci_setup_standard_chain(struct usb_xfer *xfer, ehci_qh_t **qh_last) /* the last TD terminates the transfer: */ td->qtd_next = htohc32(temp.sc, EHCI_LINK_TERMINATE); td->qtd_altnext = htohc32(temp.sc, EHCI_LINK_TERMINATE); - td->qtd_status |= htohc32(temp.sc, EHCI_QTD_IOC); usb_pc_cpu_flush(td->page_cache); @@ -1918,18 +1999,15 @@ ehci_setup_standard_chain(struct usb_xfer *xfer, ehci_qh_t **qh_last) EHCI_QH_SET_MPL(xfer->max_packet_size)); if (usbd_get_speed(xfer->xroot->udev) == USB_SPEED_HIGH) { - qh_endp |= (EHCI_QH_SET_EPS(EHCI_QH_SPEED_HIGH) | - EHCI_QH_DTC); + qh_endp |= EHCI_QH_SET_EPS(EHCI_QH_SPEED_HIGH); if (methods != &ehci_device_intr_methods) qh_endp |= EHCI_QH_SET_NRL(8); } else { if (usbd_get_speed(xfer->xroot->udev) == USB_SPEED_FULL) { - qh_endp |= (EHCI_QH_SET_EPS(EHCI_QH_SPEED_FULL) | - EHCI_QH_DTC); + qh_endp |= EHCI_QH_SET_EPS(EHCI_QH_SPEED_FULL); } else { - qh_endp |= (EHCI_QH_SET_EPS(EHCI_QH_SPEED_LOW) | - EHCI_QH_DTC); + qh_endp |= EHCI_QH_SET_EPS(EHCI_QH_SPEED_LOW); } if (methods == &ehci_device_ctrl_methods) { @@ -1941,33 +2019,32 @@ ehci_setup_standard_chain(struct usb_xfer *xfer, ehci_qh_t **qh_last) } } + if (temp.auto_data_toggle == 0) { + /* software computes the data toggle */ + qh_endp |= EHCI_QH_DTC; + } + qh->qh_endp = htohc32(temp.sc, qh_endp); qh_endphub = (EHCI_QH_SET_MULT(xfer->max_packet_count & 3) | - EHCI_QH_SET_CMASK(xfer->usb_cmask) | - EHCI_QH_SET_SMASK(xfer->usb_smask) | + EHCI_QH_SET_CMASK(xfer->endpoint->usb_cmask) | + EHCI_QH_SET_SMASK(xfer->endpoint->usb_smask) | EHCI_QH_SET_HUBA(xfer->xroot->udev->hs_hub_addr) | EHCI_QH_SET_PORT(xfer->xroot->udev->hs_port_no)); qh->qh_endphub = htohc32(temp.sc, qh_endphub); - qh->qh_curqtd = htohc32(temp.sc, 0); + qh->qh_curqtd = 0; /* fill the overlay qTD */ - qh->qh_qtd.qtd_status = htohc32(temp.sc, 0); - if (temp.auto_data_toggle) { - - /* let the hardware compute the data toggle */ - - qh->qh_endp &= htohc32(temp.sc, ~EHCI_QH_DTC); - - if (xfer->endpoint->toggle_next) { - /* DATA1 is next */ - qh->qh_qtd.qtd_status |= - htohc32(temp.sc, EHCI_QTD_SET_TOGGLE(1)); - } + if (temp.auto_data_toggle && xfer->endpoint->toggle_next) { + /* DATA1 is next */ + qh->qh_qtd.qtd_status = htohc32(temp.sc, EHCI_QTD_SET_TOGGLE(1)); + } else { + qh->qh_qtd.qtd_status = 0; } + td = xfer->td_transfer_first; qh->qh_qtd.qtd_next = td->qtd_self; @@ -2075,7 +2152,7 @@ ehci_isoc_hs_done(ehci_softc_t *sc, struct usb_xfer *xfer) DPRINTFN(13, "xfer=%p endpoint=%p transfer done\n", xfer, xfer->endpoint); - while (nframes--) { + while (nframes) { if (td == NULL) { panic("%s:%d: out of TD's\n", __FUNCTION__, __LINE__); @@ -2097,21 +2174,26 @@ ehci_isoc_hs_done(ehci_softc_t *sc, struct usb_xfer *xfer) DPRINTFN(2, "status=0x%08x, len=%u\n", status, len); - if (*plen >= len) { - /* - * The length is valid. NOTE: The complete - * length is written back into the status - * field, and not the remainder like with - * other transfer descriptor types. - */ - } else { - /* Invalid length - truncate */ - len = 0; + if (xfer->endpoint->usb_smask & (1 << td_no)) { + + if (*plen >= len) { + /* + * The length is valid. NOTE: The + * complete length is written back + * into the status field, and not the + * remainder like with other transfer + * descriptor types. + */ + } else { + /* Invalid length - truncate */ + len = 0; + } + + *plen = len; + plen++; + nframes--; } - *plen = len; - - plen++; td_no++; if ((td_no == 8) || (nframes == 0)) { @@ -2210,6 +2292,13 @@ ehci_device_bulk_start(struct usb_xfer *xfer) /* put transfer on interrupt queue */ ehci_transfer_intr_enqueue(xfer); + /* + * XXX Certain nVidia chipsets choke when using the IAAD + * feature too frequently. + */ + if (sc->sc_flags & EHCI_SCFLG_IAADBUG) + return; + /* XXX Performance quirk: Some Host Controllers have a too low * interrupt rate. Issue an IAAD to stimulate the Host * Controller after queueing the BULK transfer. @@ -2278,22 +2367,8 @@ ehci_device_intr_open(struct usb_xfer *xfer) uint16_t best; uint16_t bit; uint16_t x; - uint8_t slot; - /* Allocate a microframe slot first: */ - - slot = usb_intr_schedule_adjust - (xfer->xroot->udev, xfer->max_frame_size, USB_HS_MICRO_FRAMES_MAX); - - if (usbd_get_speed(xfer->xroot->udev) == USB_SPEED_HIGH) { - xfer->usb_uframe = slot; - xfer->usb_smask = (1 << slot) & 0xFF; - xfer->usb_cmask = 0; - } else { - xfer->usb_uframe = slot; - xfer->usb_smask = (1 << slot) & 0x3F; - xfer->usb_cmask = (-(4 << slot)) & 0xFE; - } + usb_hs_bandwidth_alloc(xfer); /* * Find the best QH position corresponding to the given interval: @@ -2328,14 +2403,13 @@ static void ehci_device_intr_close(struct usb_xfer *xfer) { ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus); - uint8_t slot; - - slot = usb_intr_schedule_adjust - (xfer->xroot->udev, -(xfer->max_frame_size), xfer->usb_uframe); sc->sc_intr_stat[xfer->qh_pos]--; ehci_device_done(xfer, USB_ERR_CANCELLED); + + /* bandwidth must be freed after device done */ + usb_hs_bandwidth_free(xfer); } static void @@ -2658,6 +2732,8 @@ ehci_device_isoc_hs_open(struct usb_xfer *xfer) uint32_t temp; uint8_t ds; + usb_hs_bandwidth_alloc(xfer); + /* initialize all TD's */ for (ds = 0; ds != 2; ds++) { @@ -2701,6 +2777,9 @@ static void ehci_device_isoc_hs_close(struct usb_xfer *xfer) { ehci_device_done(xfer, USB_ERR_CANCELLED); + + /* bandwidth must be freed after device done */ + usb_hs_bandwidth_free(xfer); } static void @@ -2789,7 +2868,7 @@ ehci_device_isoc_hs_enter(struct usb_xfer *xfer) xfer->qh_pos = xfer->endpoint->isoc_next; - while (nframes--) { + while (nframes) { if (td == NULL) { panic("%s:%d: out of TD's\n", __FUNCTION__, __LINE__); @@ -2809,13 +2888,21 @@ ehci_device_isoc_hs_enter(struct usb_xfer *xfer) #endif *plen = xfer->max_frame_size; } - status = (EHCI_ITD_SET_LEN(*plen) | - EHCI_ITD_ACTIVE | - EHCI_ITD_SET_PG(0)); - td->itd_status[td_no] = htohc32(sc, status); - itd_offset[td_no] = buf_offset; - buf_offset += *plen; - plen++; + + if (xfer->endpoint->usb_smask & (1 << td_no)) { + status = (EHCI_ITD_SET_LEN(*plen) | + EHCI_ITD_ACTIVE | + EHCI_ITD_SET_PG(0)); + td->itd_status[td_no] = htohc32(sc, status); + itd_offset[td_no] = buf_offset; + buf_offset += *plen; + plen++; + nframes --; + } else { + td->itd_status[td_no] = 0; /* not active */ + itd_offset[td_no] = buf_offset; + } + td_no++; if ((td_no == 8) || (nframes == 0)) { @@ -2872,7 +2959,7 @@ ehci_device_isoc_hs_enter(struct usb_xfer *xfer) } /* set IOC bit if we are complete */ if (nframes == 0) { - td->itd_status[7] |= htohc32(sc, EHCI_ITD_IOC); + td->itd_status[td_no - 1] |= htohc32(sc, EHCI_ITD_IOC); } usb_pc_cpu_flush(td->page_cache); #if USB_DEBUG @@ -3518,7 +3605,8 @@ ehci_xfer_setup(struct usb_setup_params *parm) usbd_transfer_setup_sub(parm); - nitd = (xfer->nframes + 7) / 8; + nitd = ((xfer->nframes + 7) / 8) << + usbd_xfer_get_fps_shift(xfer); } else { diff --git a/sys/dev/usb/controller/ehci.h b/sys/dev/usb/controller/ehci.h index 0868bc8f15aa..b6426c45ca36 100644 --- a/sys/dev/usb/controller/ehci.h +++ b/sys/dev/usb/controller/ehci.h @@ -40,139 +40,6 @@ #define EHCI_MAX_DEVICES MIN(USB_MAX_DEVICES, 128) -/* PCI config registers */ -#define PCI_CBMEM 0x10 /* configuration base MEM */ -#define PCI_INTERFACE_EHCI 0x20 -#define PCI_USBREV 0x60 /* RO USB protocol revision */ -#define PCI_USB_REV_MASK 0xff -#define PCI_USB_REV_PRE_1_0 0x00 -#define PCI_USB_REV_1_0 0x10 -#define PCI_USB_REV_1_1 0x11 -#define PCI_USB_REV_2_0 0x20 -#define PCI_EHCI_FLADJ 0x61 /* RW Frame len adj, SOF=59488+6*fladj */ -#define PCI_EHCI_PORTWAKECAP 0x62 /* RW Port wake caps (opt) */ - -/* EHCI Extended Capabilities */ -#define EHCI_EC_LEGSUP 0x01 -#define EHCI_EECP_NEXT(x) (((x) >> 8) & 0xff) -#define EHCI_EECP_ID(x) ((x) & 0xff) - -/* Legacy support extended capability */ -#define EHCI_LEGSUP_BIOS_SEM 0x02 -#define EHCI_LEGSUP_OS_SEM 0x03 -#define EHCI_LEGSUP_USBLEGCTLSTS 0x04 - -/* EHCI capability registers */ -#define EHCI_CAPLENGTH 0x00 /* RO Capability register length field */ -/* reserved 0x01 */ -#define EHCI_HCIVERSION 0x02 /* RO Interface version number */ -#define EHCI_HCSPARAMS 0x04 /* RO Structural parameters */ -#define EHCI_HCS_DEBUGPORT(x) (((x) >> 20) & 0xf) -#define EHCI_HCS_P_INDICATOR(x) ((x) & 0x10000) -#define EHCI_HCS_N_CC(x) (((x) >> 12) & 0xf) /* # of companion ctlrs */ -#define EHCI_HCS_N_PCC(x) (((x) >> 8) & 0xf) /* # of ports per comp. */ -#define EHCI_HCS_PPC(x) ((x) & 0x10) /* port power control */ -#define EHCI_HCS_N_PORTS(x) ((x) & 0xf) /* # of ports */ -#define EHCI_HCCPARAMS 0x08 /* RO Capability parameters */ -#define EHCI_HCC_EECP(x) (((x) >> 8) & 0xff) /* extended ports caps */ -#define EHCI_HCC_IST(x) (((x) >> 4) & 0xf) /* isoc sched threshold */ -#define EHCI_HCC_ASPC(x) ((x) & 0x4) /* async sched park cap */ -#define EHCI_HCC_PFLF(x) ((x) & 0x2) /* prog frame list flag */ -#define EHCI_HCC_64BIT(x) ((x) & 0x1) /* 64 bit address cap */ -#define EHCI_HCSP_PORTROUTE 0x0c /* RO Companion port route description */ - -/* EHCI operational registers. Offset given by EHCI_CAPLENGTH register */ -#define EHCI_USBCMD 0x00 /* RO, RW, WO Command register */ -#define EHCI_CMD_ITC_M 0x00ff0000 /* RW interrupt threshold ctrl */ -#define EHCI_CMD_ITC_1 0x00010000 -#define EHCI_CMD_ITC_2 0x00020000 -#define EHCI_CMD_ITC_4 0x00040000 -#define EHCI_CMD_ITC_8 0x00080000 -#define EHCI_CMD_ITC_16 0x00100000 -#define EHCI_CMD_ITC_32 0x00200000 -#define EHCI_CMD_ITC_64 0x00400000 -#define EHCI_CMD_ASPME 0x00000800 /* RW/RO async park enable */ -#define EHCI_CMD_ASPMC 0x00000300 /* RW/RO async park count */ -#define EHCI_CMD_LHCR 0x00000080 /* RW light host ctrl reset */ -#define EHCI_CMD_IAAD 0x00000040 /* RW intr on async adv door - * bell */ -#define EHCI_CMD_ASE 0x00000020 /* RW async sched enable */ -#define EHCI_CMD_PSE 0x00000010 /* RW periodic sched enable */ -#define EHCI_CMD_FLS_M 0x0000000c /* RW/RO frame list size */ -#define EHCI_CMD_FLS(x) (((x) >> 2) & 3) /* RW/RO frame list size */ -#define EHCI_CMD_HCRESET 0x00000002 /* RW reset */ -#define EHCI_CMD_RS 0x00000001 /* RW run/stop */ -#define EHCI_USBSTS 0x04 /* RO, RW, RWC Status register */ -#define EHCI_STS_ASS 0x00008000 /* RO async sched status */ -#define EHCI_STS_PSS 0x00004000 /* RO periodic sched status */ -#define EHCI_STS_REC 0x00002000 /* RO reclamation */ -#define EHCI_STS_HCH 0x00001000 /* RO host controller halted */ -#define EHCI_STS_IAA 0x00000020 /* RWC interrupt on async adv */ -#define EHCI_STS_HSE 0x00000010 /* RWC host system error */ -#define EHCI_STS_FLR 0x00000008 /* RWC frame list rollover */ -#define EHCI_STS_PCD 0x00000004 /* RWC port change detect */ -#define EHCI_STS_ERRINT 0x00000002 /* RWC error interrupt */ -#define EHCI_STS_INT 0x00000001 /* RWC interrupt */ -#define EHCI_STS_INTRS(x) ((x) & 0x3f) - -/* - * NOTE: the doorbell interrupt is enabled, but the doorbell is never - * used! SiS chipsets require this. - */ -#define EHCI_NORMAL_INTRS (EHCI_STS_IAA | EHCI_STS_HSE | \ - EHCI_STS_PCD | EHCI_STS_ERRINT | EHCI_STS_INT) - -#define EHCI_USBINTR 0x08 /* RW Interrupt register */ -#define EHCI_INTR_IAAE 0x00000020 /* interrupt on async advance - * ena */ -#define EHCI_INTR_HSEE 0x00000010 /* host system error ena */ -#define EHCI_INTR_FLRE 0x00000008 /* frame list rollover ena */ -#define EHCI_INTR_PCIE 0x00000004 /* port change ena */ -#define EHCI_INTR_UEIE 0x00000002 /* USB error intr ena */ -#define EHCI_INTR_UIE 0x00000001 /* USB intr ena */ - -#define EHCI_FRINDEX 0x0c /* RW Frame Index register */ - -#define EHCI_CTRLDSSEGMENT 0x10 /* RW Control Data Structure Segment */ - -#define EHCI_PERIODICLISTBASE 0x14 /* RW Periodic List Base */ -#define EHCI_ASYNCLISTADDR 0x18 /* RW Async List Base */ - -#define EHCI_CONFIGFLAG 0x40 /* RW Configure Flag register */ -#define EHCI_CONF_CF 0x00000001 /* RW configure flag */ - -#define EHCI_PORTSC(n) (0x40+(4*(n))) /* RO, RW, RWC Port Status reg */ -#define EHCI_PS_WKOC_E 0x00400000 /* RW wake on over current ena */ -#define EHCI_PS_WKDSCNNT_E 0x00200000 /* RW wake on disconnect ena */ -#define EHCI_PS_WKCNNT_E 0x00100000 /* RW wake on connect ena */ -#define EHCI_PS_PTC 0x000f0000 /* RW port test control */ -#define EHCI_PS_PIC 0x0000c000 /* RW port indicator control */ -#define EHCI_PS_PO 0x00002000 /* RW port owner */ -#define EHCI_PS_PP 0x00001000 /* RW,RO port power */ -#define EHCI_PS_LS 0x00000c00 /* RO line status */ -#define EHCI_PS_IS_LOWSPEED(x) (((x) & EHCI_PS_LS) == 0x00000400) -#define EHCI_PS_PR 0x00000100 /* RW port reset */ -#define EHCI_PS_SUSP 0x00000080 /* RW suspend */ -#define EHCI_PS_FPR 0x00000040 /* RW force port resume */ -#define EHCI_PS_OCC 0x00000020 /* RWC over current change */ -#define EHCI_PS_OCA 0x00000010 /* RO over current active */ -#define EHCI_PS_PEC 0x00000008 /* RWC port enable change */ -#define EHCI_PS_PE 0x00000004 /* RW port enable */ -#define EHCI_PS_CSC 0x00000002 /* RWC connect status change */ -#define EHCI_PS_CS 0x00000001 /* RO connect status */ -#define EHCI_PS_CLEAR (EHCI_PS_OCC | EHCI_PS_PEC | EHCI_PS_CSC) - -#define EHCI_USBMODE 0x68 /* RW USB Device mode register */ -#define EHCI_UM_CM 0x00000003 /* R/WO Controller Mode */ -#define EHCI_UM_CM_IDLE 0x0 /* Idle */ -#define EHCI_UM_CM_HOST 0x3 /* Host Controller */ -#define EHCI_UM_ES 0x00000004 /* R/WO Endian Select */ -#define EHCI_UM_ES_LE 0x0 /* Little-endian byte alignment */ -#define EHCI_UM_ES_BE 0x4 /* Big-endian byte alignment */ -#define EHCI_UM_SDIS 0x00000010 /* R/WO Stream Disable Mode */ - -#define EHCI_PORT_RESET_COMPLETE 2 /* ms */ - /* * Alignment NOTE: structures must be aligned so that the hardware can index * without performing addition. @@ -454,6 +321,7 @@ typedef struct ehci_softc { struct ehci_hw_softc sc_hw; struct usb_bus sc_bus; /* base device */ struct usb_callout sc_tmo_pcd; + struct usb_callout sc_tmo_poll; union ehci_hub_desc sc_hub_desc; struct usb_device *sc_devices[EHCI_MAX_DEVICES]; @@ -481,6 +349,8 @@ typedef struct ehci_softc { #define EHCI_SCFLG_BIGEDESC 0x0008 /* big-endian byte order descriptors */ #define EHCI_SCFLG_BIGEMMIO 0x0010 /* big-endian byte order MMIO */ #define EHCI_SCFLG_TT 0x0020 /* transaction translator present */ +#define EHCI_SCFLG_LOSTINTRBUG 0x0040 /* workaround for VIA / ATI chipsets */ +#define EHCI_SCFLG_IAADBUG 0x0080 /* workaround for nVidia chipsets */ uint8_t sc_offs; /* offset to operational registers */ uint8_t sc_doorbell_disable; /* set on doorbell failure */ diff --git a/sys/dev/usb/controller/ehci_ixp4xx.c b/sys/dev/usb/controller/ehci_ixp4xx.c index 7668d8608e0a..3a2b6e46e569 100644 --- a/sys/dev/usb/controller/ehci_ixp4xx.c +++ b/sys/dev/usb/controller/ehci_ixp4xx.c @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -156,8 +157,6 @@ ehci_ixp_attach(device_t self) return (ENOMEM); } - sc->sc_bus.usbrev = USB_REV_2_0; - /* NB: hints fix the memory location and irq */ rid = 0; @@ -229,7 +228,6 @@ ehci_ixp_attach(device_t self) | EHCI_SCFLG_BIGEMMIO | EHCI_SCFLG_NORESTERM ; - (void) ehci_reset(sc); err = ehci_init(sc); if (!err) { diff --git a/sys/dev/usb/controller/ehci_mbus.c b/sys/dev/usb/controller/ehci_mbus.c index 7076854d6f2f..368e3e57494f 100644 --- a/sys/dev/usb/controller/ehci_mbus.c +++ b/sys/dev/usb/controller/ehci_mbus.c @@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -165,8 +166,6 @@ ehci_mbus_attach(device_t self) return (ENOMEM); } - sc->sc_bus.usbrev = USB_REV_2_0; - rid = 0; sc->sc_io_res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); if (!sc->sc_io_res) { diff --git a/sys/dev/usb/controller/ehci_pci.c b/sys/dev/usb/controller/ehci_pci.c index 7f8c0a0012d7..c81122b6d5f2 100644 --- a/sys/dev/usb/controller/ehci_pci.c +++ b/sys/dev/usb/controller/ehci_pci.c @@ -84,6 +84,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #define PCI_EHCI_VENDORID_ACERLABS 0x10b9 #define PCI_EHCI_VENDORID_AMD 0x1022 @@ -192,6 +193,14 @@ ehci_pci_match(device_t self) return "Intel 82801I (ICH9) USB 2.0 controller"; case 0x293c8086: return "Intel 82801I (ICH9) USB 2.0 controller"; + case 0x3a3a8086: + return "Intel 82801JI (ICH10) USB 2.0 controller USB-A"; + case 0x3a3c8086: + return "Intel 82801JI (ICH10) USB 2.0 controller USB-B"; + case 0x3b348086: + return ("Intel PCH USB 2.0 controller USB-A"); + case 0x3b3c8086: + return ("Intel PCH USB 2.0 controller USB-B"); case 0x00e01033: return ("NEC uPD 720100 USB 2.0 controller"); @@ -208,6 +217,12 @@ ehci_pci_match(device_t self) return "NVIDIA nForce4 USB 2.0 controller"; case 0x03f210de: return "NVIDIA nForce MCP61 USB 2.0 controller"; + case 0x0aa610de: + return "NVIDIA nForce MCP79 USB 2.0 controller"; + case 0x0aa910de: + return "NVIDIA nForce MCP79 USB 2.0 controller"; + case 0x0aaa10de: + return "NVIDIA nForce MCP79 USB 2.0 controller"; case 0x15621131: return "Philips ISP156x USB 2.0 controller"; @@ -240,6 +255,50 @@ ehci_pci_probe(device_t self) } } +static void +ehci_pci_ati_quirk(device_t self, uint8_t is_sb700) +{ + device_t smbdev; + uint32_t val; + + if (is_sb700) { + /* Lookup SMBUS PCI device */ + smbdev = pci_find_device(PCI_EHCI_VENDORID_ATI, 0x4385); + if (smbdev == NULL) + return; + val = pci_get_revid(smbdev); + if (val != 0x3a && val != 0x3b) + return; + } + + /* + * Note: this bit is described as reserved in SB700 + * Register Reference Guide. + */ + val = pci_read_config(self, 0x53, 1); + if (!(val & 0x8)) { + val |= 0x8; + pci_write_config(self, 0x53, val, 1); + device_printf(self, "AMD SB600/700 quirk applied\n"); + } +} + +static void +ehci_pci_via_quirk(device_t self) +{ + uint32_t val; + + if ((pci_get_device(self) == 0x3104) && + ((pci_get_revid(self) & 0xf0) == 0x60)) { + /* Correct schedule sleep time to 10us */ + val = pci_read_config(self, 0x4b, 1); + if (val & 0x20) + return; + pci_write_config(self, 0x4b, val, 1); + device_printf(self, "VIA-quirk applied\n"); + } +} + static int ehci_pci_attach(device_t self) { @@ -273,13 +332,11 @@ ehci_pci_attach(device_t self) device_printf(self, "pre-2.0 USB revision (ignored)\n"); /* fallthrough */ case PCI_USB_REV_2_0: - sc->sc_bus.usbrev = USB_REV_2_0; break; default: /* Quirk for Parallels Desktop 4.0 */ device_printf(self, "USB revision is unknown. Assuming v2.0.\n"); - sc->sc_bus.usbrev = USB_REV_2_0; - break; + break; } rid = PCI_CBMEM; @@ -370,6 +427,58 @@ ehci_pci_attach(device_t self) goto error; } ehci_pci_takecontroller(self); + + /* Undocumented quirks taken from Linux */ + + switch (pci_get_vendor(self)) { + case PCI_EHCI_VENDORID_ATI: + /* SB600 and SB700 EHCI quirk */ + switch (pci_get_device(self)) { + case 0x4386: + ehci_pci_ati_quirk(self, 0); + break; + case 0x4396: + ehci_pci_ati_quirk(self, 1); + break; + default: + break; + } + break; + + case PCI_EHCI_VENDORID_VIA: + ehci_pci_via_quirk(self); + break; + + default: + break; + } + + /* Dropped interrupts workaround */ + switch (pci_get_vendor(self)) { + case PCI_EHCI_VENDORID_ATI: + case PCI_EHCI_VENDORID_VIA: + sc->sc_flags |= EHCI_SCFLG_LOSTINTRBUG; + if (bootverbose) + device_printf(self, + "Dropped interrupts workaround enabled\n"); + break; + default: + break; + } + + /* Doorbell feature workaround */ + switch (pci_get_vendor(self)) { + case PCI_EHCI_VENDORID_NVIDIA: + case PCI_EHCI_VENDORID_NVIDIA2: + sc->sc_flags |= EHCI_SCFLG_IAADBUG; + if (bootverbose) + device_printf(self, + "Doorbell workaround enabled\n"); + break; + default: + break; + } + err = ehci_init(sc); if (!err) { err = device_probe_and_attach(sc->sc_bus.bdev); diff --git a/sys/dev/usb/controller/ehcireg.h b/sys/dev/usb/controller/ehcireg.h new file mode 100644 index 000000000000..182d9d6acab2 --- /dev/null +++ b/sys/dev/usb/controller/ehcireg.h @@ -0,0 +1,174 @@ +/* $FreeBSD$ */ +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson (lennart@augustsson.net). + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 _EHCIREG_H_ +#define _EHCIREG_H_ + +/* PCI config registers */ +#define PCI_CBMEM 0x10 /* configuration base MEM */ +#define PCI_INTERFACE_EHCI 0x20 +#define PCI_USBREV 0x60 /* RO USB protocol revision */ +#define PCI_USB_REV_MASK 0xff +#define PCI_USB_REV_PRE_1_0 0x00 +#define PCI_USB_REV_1_0 0x10 +#define PCI_USB_REV_1_1 0x11 +#define PCI_USB_REV_2_0 0x20 +#define PCI_EHCI_FLADJ 0x61 /* RW Frame len adj, SOF=59488+6*fladj */ +#define PCI_EHCI_PORTWAKECAP 0x62 /* RW Port wake caps (opt) */ + +/* EHCI Extended Capabilities */ +#define EHCI_EC_LEGSUP 0x01 +#define EHCI_EECP_NEXT(x) (((x) >> 8) & 0xff) +#define EHCI_EECP_ID(x) ((x) & 0xff) + +/* Legacy support extended capability */ +#define EHCI_LEGSUP_BIOS_SEM 0x02 +#define EHCI_LEGSUP_OS_SEM 0x03 +#define EHCI_LEGSUP_USBLEGCTLSTS 0x04 + +/* EHCI capability registers */ +#define EHCI_CAPLENGTH 0x00 /* RO Capability register length field */ +/* reserved 0x01 */ +#define EHCI_HCIVERSION 0x02 /* RO Interface version number */ +#define EHCI_HCSPARAMS 0x04 /* RO Structural parameters */ +#define EHCI_HCS_DEBUGPORT(x) (((x) >> 20) & 0xf) +#define EHCI_HCS_P_INDICATOR(x) ((x) & 0x10000) +#define EHCI_HCS_N_CC(x) (((x) >> 12) & 0xf) /* # of companion ctlrs */ +#define EHCI_HCS_N_PCC(x) (((x) >> 8) & 0xf) /* # of ports per comp. */ +#define EHCI_HCS_PPC(x) ((x) & 0x10) /* port power control */ +#define EHCI_HCS_N_PORTS(x) ((x) & 0xf) /* # of ports */ +#define EHCI_HCCPARAMS 0x08 /* RO Capability parameters */ +#define EHCI_HCC_EECP(x) (((x) >> 8) & 0xff) /* extended ports caps */ +#define EHCI_HCC_IST(x) (((x) >> 4) & 0xf) /* isoc sched threshold */ +#define EHCI_HCC_ASPC(x) ((x) & 0x4) /* async sched park cap */ +#define EHCI_HCC_PFLF(x) ((x) & 0x2) /* prog frame list flag */ +#define EHCI_HCC_64BIT(x) ((x) & 0x1) /* 64 bit address cap */ +#define EHCI_HCSP_PORTROUTE 0x0c /* RO Companion port route description */ + +/* EHCI operational registers. Offset given by EHCI_CAPLENGTH register */ +#define EHCI_USBCMD 0x00 /* RO, RW, WO Command register */ +#define EHCI_CMD_ITC_M 0x00ff0000 /* RW interrupt threshold ctrl */ +#define EHCI_CMD_ITC_1 0x00010000 +#define EHCI_CMD_ITC_2 0x00020000 +#define EHCI_CMD_ITC_4 0x00040000 +#define EHCI_CMD_ITC_8 0x00080000 +#define EHCI_CMD_ITC_16 0x00100000 +#define EHCI_CMD_ITC_32 0x00200000 +#define EHCI_CMD_ITC_64 0x00400000 +#define EHCI_CMD_ASPME 0x00000800 /* RW/RO async park enable */ +#define EHCI_CMD_ASPMC 0x00000300 /* RW/RO async park count */ +#define EHCI_CMD_LHCR 0x00000080 /* RW light host ctrl reset */ +#define EHCI_CMD_IAAD 0x00000040 /* RW intr on async adv door + * bell */ +#define EHCI_CMD_ASE 0x00000020 /* RW async sched enable */ +#define EHCI_CMD_PSE 0x00000010 /* RW periodic sched enable */ +#define EHCI_CMD_FLS_M 0x0000000c /* RW/RO frame list size */ +#define EHCI_CMD_FLS(x) (((x) >> 2) & 3) /* RW/RO frame list size */ +#define EHCI_CMD_HCRESET 0x00000002 /* RW reset */ +#define EHCI_CMD_RS 0x00000001 /* RW run/stop */ +#define EHCI_USBSTS 0x04 /* RO, RW, RWC Status register */ +#define EHCI_STS_ASS 0x00008000 /* RO async sched status */ +#define EHCI_STS_PSS 0x00004000 /* RO periodic sched status */ +#define EHCI_STS_REC 0x00002000 /* RO reclamation */ +#define EHCI_STS_HCH 0x00001000 /* RO host controller halted */ +#define EHCI_STS_IAA 0x00000020 /* RWC interrupt on async adv */ +#define EHCI_STS_HSE 0x00000010 /* RWC host system error */ +#define EHCI_STS_FLR 0x00000008 /* RWC frame list rollover */ +#define EHCI_STS_PCD 0x00000004 /* RWC port change detect */ +#define EHCI_STS_ERRINT 0x00000002 /* RWC error interrupt */ +#define EHCI_STS_INT 0x00000001 /* RWC interrupt */ +#define EHCI_STS_INTRS(x) ((x) & 0x3f) + +/* + * NOTE: the doorbell interrupt is enabled, but the doorbell is never + * used! SiS chipsets require this. + */ +#define EHCI_NORMAL_INTRS (EHCI_STS_IAA | EHCI_STS_HSE | \ + EHCI_STS_PCD | EHCI_STS_ERRINT | EHCI_STS_INT) + +#define EHCI_USBINTR 0x08 /* RW Interrupt register */ +#define EHCI_INTR_IAAE 0x00000020 /* interrupt on async advance + * ena */ +#define EHCI_INTR_HSEE 0x00000010 /* host system error ena */ +#define EHCI_INTR_FLRE 0x00000008 /* frame list rollover ena */ +#define EHCI_INTR_PCIE 0x00000004 /* port change ena */ +#define EHCI_INTR_UEIE 0x00000002 /* USB error intr ena */ +#define EHCI_INTR_UIE 0x00000001 /* USB intr ena */ + +#define EHCI_FRINDEX 0x0c /* RW Frame Index register */ + +#define EHCI_CTRLDSSEGMENT 0x10 /* RW Control Data Structure Segment */ + +#define EHCI_PERIODICLISTBASE 0x14 /* RW Periodic List Base */ +#define EHCI_ASYNCLISTADDR 0x18 /* RW Async List Base */ + +#define EHCI_CONFIGFLAG 0x40 /* RW Configure Flag register */ +#define EHCI_CONF_CF 0x00000001 /* RW configure flag */ + +#define EHCI_PORTSC(n) (0x40+(4*(n))) /* RO, RW, RWC Port Status reg */ +#define EHCI_PS_WKOC_E 0x00400000 /* RW wake on over current ena */ +#define EHCI_PS_WKDSCNNT_E 0x00200000 /* RW wake on disconnect ena */ +#define EHCI_PS_WKCNNT_E 0x00100000 /* RW wake on connect ena */ +#define EHCI_PS_PTC 0x000f0000 /* RW port test control */ +#define EHCI_PS_PIC 0x0000c000 /* RW port indicator control */ +#define EHCI_PS_PO 0x00002000 /* RW port owner */ +#define EHCI_PS_PP 0x00001000 /* RW,RO port power */ +#define EHCI_PS_LS 0x00000c00 /* RO line status */ +#define EHCI_PS_IS_LOWSPEED(x) (((x) & EHCI_PS_LS) == 0x00000400) +#define EHCI_PS_PR 0x00000100 /* RW port reset */ +#define EHCI_PS_SUSP 0x00000080 /* RW suspend */ +#define EHCI_PS_FPR 0x00000040 /* RW force port resume */ +#define EHCI_PS_OCC 0x00000020 /* RWC over current change */ +#define EHCI_PS_OCA 0x00000010 /* RO over current active */ +#define EHCI_PS_PEC 0x00000008 /* RWC port enable change */ +#define EHCI_PS_PE 0x00000004 /* RW port enable */ +#define EHCI_PS_CSC 0x00000002 /* RWC connect status change */ +#define EHCI_PS_CS 0x00000001 /* RO connect status */ +#define EHCI_PS_CLEAR (EHCI_PS_OCC | EHCI_PS_PEC | EHCI_PS_CSC) + +#define EHCI_USBMODE 0x68 /* RW USB Device mode register */ +#define EHCI_UM_CM 0x00000003 /* R/WO Controller Mode */ +#define EHCI_UM_CM_IDLE 0x0 /* Idle */ +#define EHCI_UM_CM_HOST 0x3 /* Host Controller */ +#define EHCI_UM_ES 0x00000004 /* R/WO Endian Select */ +#define EHCI_UM_ES_LE 0x0 /* Little-endian byte alignment */ +#define EHCI_UM_ES_BE 0x4 /* Big-endian byte alignment */ +#define EHCI_UM_SDIS 0x00000010 /* R/WO Stream Disable Mode */ + +#define EHCI_PORT_RESET_COMPLETE 2 /* ms */ + +#endif /* _EHCIREG_H_ */ diff --git a/sys/dev/usb/controller/musb_otg.c b/sys/dev/usb/controller/musb_otg.c index 60d29dd690b6..e4db7bf6857f 100644 --- a/sys/dev/usb/controller/musb_otg.c +++ b/sys/dev/usb/controller/musb_otg.c @@ -1144,6 +1144,7 @@ musbotg_setup_standard_chain(struct usb_xfer *xfer) /* setup temp */ + temp.pc = NULL; temp.td = NULL; temp.td_next = xfer->td_start[0]; temp.offset = 0; @@ -1538,18 +1539,18 @@ musbotg_clear_stall_sub(struct musbotg_softc *sc, uint16_t wMaxPacket, /* Configure endpoint */ switch (ep_type) { case UE_INTERRUPT: - MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, wMaxPacket); + MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, wMaxPacket); MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, MUSB2_MASK_CSRH_TXMODE | temp); break; case UE_ISOCHRONOUS: - MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, wMaxPacket); + MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, wMaxPacket); MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, MUSB2_MASK_CSRH_TXMODE | MUSB2_MASK_CSRH_TXISO | temp); break; case UE_BULK: - MUSB2_WRITE_1(sc, MUSB2_REG_TXMAXP, wMaxPacket); + MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, wMaxPacket); MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, MUSB2_MASK_CSRH_TXMODE | temp); break; @@ -1599,18 +1600,18 @@ musbotg_clear_stall_sub(struct musbotg_softc *sc, uint16_t wMaxPacket, /* Configure endpoint */ switch (ep_type) { case UE_INTERRUPT: - MUSB2_WRITE_1(sc, MUSB2_REG_RXMAXP, wMaxPacket); + MUSB2_WRITE_2(sc, MUSB2_REG_RXMAXP, wMaxPacket); MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, MUSB2_MASK_CSRH_RXNYET | temp); break; case UE_ISOCHRONOUS: - MUSB2_WRITE_1(sc, MUSB2_REG_RXMAXP, wMaxPacket); + MUSB2_WRITE_2(sc, MUSB2_REG_RXMAXP, wMaxPacket); MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, MUSB2_MASK_CSRH_RXNYET | MUSB2_MASK_CSRH_RXISO | temp); break; case UE_BULK: - MUSB2_WRITE_1(sc, MUSB2_REG_RXMAXP, wMaxPacket); + MUSB2_WRITE_2(sc, MUSB2_REG_RXMAXP, wMaxPacket); MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, temp); break; default: @@ -1687,12 +1688,14 @@ usb_error_t musbotg_init(struct musbotg_softc *sc) { struct usb_hw_ep_profile *pf; + uint16_t offset; uint8_t nrx; uint8_t ntx; uint8_t temp; uint8_t fsize; uint8_t frx; uint8_t ftx; + uint8_t dynfifo; DPRINTFN(1, "start\n"); @@ -1775,11 +1778,20 @@ musbotg_init(struct musbotg_softc *sc) DPRINTFN(2, "Config Data: 0x%02x\n", sc->sc_conf_data); + dynfifo = (sc->sc_conf_data & MUSB2_MASK_CD_DYNFIFOSZ) ? 1 : 0; + + if (dynfifo) { + device_printf(sc->sc_bus.bdev, "Dynamic FIFO sizing detected, " + "assuming 16Kbytes of FIFO RAM\n"); + } + DPRINTFN(2, "HW version: 0x%04x\n", MUSB2_READ_1(sc, MUSB2_REG_HWVERS)); /* initialise endpoint profiles */ + offset = 0; + for (temp = 1; temp <= sc->sc_ep_max; temp++) { pf = sc->sc_hw_ep_profile + temp; @@ -1787,12 +1799,48 @@ musbotg_init(struct musbotg_softc *sc) MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, temp); fsize = MUSB2_READ_1(sc, MUSB2_REG_FSIZE); - frx = (fsize & MUSB2_MASK_RX_FSIZE) / 16;; + frx = (fsize & MUSB2_MASK_RX_FSIZE) / 16; ftx = (fsize & MUSB2_MASK_TX_FSIZE); - DPRINTF("Endpoint %u FIFO size: IN=%u, OUT=%u\n", - temp, pf->max_in_frame_size, - pf->max_out_frame_size); + DPRINTF("Endpoint %u FIFO size: IN=%u, OUT=%u, DYN=%d\n", + temp, ftx, frx, dynfifo); + + if (dynfifo) { + if (frx && (temp <= nrx)) { + if (temp < 8) { + frx = 10; /* 1K */ + MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, + MUSB2_VAL_FIFOSZ_512 | + MUSB2_MASK_FIFODB); + } else { + frx = 7; /* 128 bytes */ + MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ, + MUSB2_VAL_FIFOSZ_128); + } + + MUSB2_WRITE_2(sc, MUSB2_REG_RXFIFOADD, + offset >> 3); + + offset += (1 << frx); + } + if (ftx && (temp <= ntx)) { + if (temp < 8) { + ftx = 10; /* 1K */ + MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ, + MUSB2_VAL_FIFOSZ_512 | + MUSB2_MASK_FIFODB); + } else { + ftx = 7; /* 128 bytes */ + MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ, + MUSB2_VAL_FIFOSZ_128); + } + + MUSB2_WRITE_2(sc, MUSB2_REG_TXFIFOADD, + offset >> 3); + + offset += (1 << ftx); + } + } if (frx && ftx && (temp <= nrx) && (temp <= ntx)) { pf->max_in_frame_size = 1 << ftx; @@ -1823,6 +1871,8 @@ musbotg_init(struct musbotg_softc *sc) } } + DPRINTFN(2, "Dynamic FIFO size = %d bytes\n", offset); + /* turn on default interrupts */ MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, diff --git a/sys/dev/usb/controller/musb_otg.h b/sys/dev/usb/controller/musb_otg.h index 0e843c910e40..e8eafca6fb1d 100644 --- a/sys/dev/usb/controller/musb_otg.h +++ b/sys/dev/usb/controller/musb_otg.h @@ -191,7 +191,7 @@ #define MUSB2_REG_EPFIFO(n) (0x0020 + (4*(n))) -#define MUSB2_REG_CONFDATA 0x000F /* EPN=0 */ +#define MUSB2_REG_CONFDATA (0x000F + MUSB2_REG_INDEXED_CSR) /* EPN=0 */ #define MUSB2_MASK_CD_UTMI_DW 0x01 #define MUSB2_MASK_CD_SOFTCONE 0x02 #define MUSB2_MASK_CD_DYNFIFOSZ 0x04 diff --git a/sys/dev/usb/controller/ohci.c b/sys/dev/usb/controller/ohci.c index 30592c14751b..fa7f23ac1963 100644 --- a/sys/dev/usb/controller/ohci.c +++ b/sys/dev/usb/controller/ohci.c @@ -72,6 +72,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #define OHCI_BUS2SC(bus) \ ((ohci_softc_t *)(((uint8_t *)(bus)) - \ @@ -83,6 +84,9 @@ static int ohcidebug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, ohci, CTLFLAG_RW, 0, "USB ohci"); SYSCTL_INT(_hw_usb_ohci, OID_AUTO, debug, CTLFLAG_RW, &ohcidebug, 0, "ohci debug level"); + +TUNABLE_INT("hw.usb.ohci.debug", &ohcidebug); + static void ohci_dumpregs(ohci_softc_t *); static void ohci_dump_tds(ohci_td_t *); static uint8_t ohci_dump_td(ohci_td_t *); diff --git a/sys/dev/usb/controller/ohci.h b/sys/dev/usb/controller/ohci.h index eeb49aabd41f..60574bb9cadf 100644 --- a/sys/dev/usb/controller/ohci.h +++ b/sys/dev/usb/controller/ohci.h @@ -41,95 +41,6 @@ #define OHCI_MAX_DEVICES MIN(USB_MAX_DEVICES, 128) -/* PCI config registers */ -#define PCI_CBMEM 0x10 /* configuration base memory */ -#define PCI_INTERFACE_OHCI 0x10 - -/* OHCI registers */ -#define OHCI_REVISION 0x00 /* OHCI revision */ -#define OHCI_REV_LO(rev) ((rev) & 0xf) -#define OHCI_REV_HI(rev) (((rev)>>4) & 0xf) -#define OHCI_REV_LEGACY(rev) ((rev) & 0x100) -#define OHCI_CONTROL 0x04 -#define OHCI_CBSR_MASK 0x00000003 /* Control/Bulk Service Ratio */ -#define OHCI_RATIO_1_1 0x00000000 -#define OHCI_RATIO_1_2 0x00000001 -#define OHCI_RATIO_1_3 0x00000002 -#define OHCI_RATIO_1_4 0x00000003 -#define OHCI_PLE 0x00000004 /* Periodic List Enable */ -#define OHCI_IE 0x00000008 /* Isochronous Enable */ -#define OHCI_CLE 0x00000010 /* Control List Enable */ -#define OHCI_BLE 0x00000020 /* Bulk List Enable */ -#define OHCI_HCFS_MASK 0x000000c0 /* HostControllerFunctionalStat - * e */ -#define OHCI_HCFS_RESET 0x00000000 -#define OHCI_HCFS_RESUME 0x00000040 -#define OHCI_HCFS_OPERATIONAL 0x00000080 -#define OHCI_HCFS_SUSPEND 0x000000c0 -#define OHCI_IR 0x00000100 /* Interrupt Routing */ -#define OHCI_RWC 0x00000200 /* Remote Wakeup Connected */ -#define OHCI_RWE 0x00000400 /* Remote Wakeup Enabled */ -#define OHCI_COMMAND_STATUS 0x08 -#define OHCI_HCR 0x00000001 /* Host Controller Reset */ -#define OHCI_CLF 0x00000002 /* Control List Filled */ -#define OHCI_BLF 0x00000004 /* Bulk List Filled */ -#define OHCI_OCR 0x00000008 /* Ownership Change Request */ -#define OHCI_SOC_MASK 0x00030000 /* Scheduling Overrun Count */ -#define OHCI_INTERRUPT_STATUS 0x0c -#define OHCI_SO 0x00000001 /* Scheduling Overrun */ -#define OHCI_WDH 0x00000002 /* Writeback Done Head */ -#define OHCI_SF 0x00000004 /* Start of Frame */ -#define OHCI_RD 0x00000008 /* Resume Detected */ -#define OHCI_UE 0x00000010 /* Unrecoverable Error */ -#define OHCI_FNO 0x00000020 /* Frame Number Overflow */ -#define OHCI_RHSC 0x00000040 /* Root Hub Status Change */ -#define OHCI_OC 0x40000000 /* Ownership Change */ -#define OHCI_MIE 0x80000000 /* Master Interrupt Enable */ -#define OHCI_INTERRUPT_ENABLE 0x10 -#define OHCI_INTERRUPT_DISABLE 0x14 -#define OHCI_HCCA 0x18 -#define OHCI_PERIOD_CURRENT_ED 0x1c -#define OHCI_CONTROL_HEAD_ED 0x20 -#define OHCI_CONTROL_CURRENT_ED 0x24 -#define OHCI_BULK_HEAD_ED 0x28 -#define OHCI_BULK_CURRENT_ED 0x2c -#define OHCI_DONE_HEAD 0x30 -#define OHCI_FM_INTERVAL 0x34 -#define OHCI_GET_IVAL(s) ((s) & 0x3fff) -#define OHCI_GET_FSMPS(s) (((s) >> 16) & 0x7fff) -#define OHCI_FIT 0x80000000 -#define OHCI_FM_REMAINING 0x38 -#define OHCI_FM_NUMBER 0x3c -#define OHCI_PERIODIC_START 0x40 -#define OHCI_LS_THRESHOLD 0x44 -#define OHCI_RH_DESCRIPTOR_A 0x48 -#define OHCI_GET_NDP(s) ((s) & 0xff) -#define OHCI_PSM 0x0100 /* Power Switching Mode */ -#define OHCI_NPS 0x0200 /* No Power Switching */ -#define OHCI_DT 0x0400 /* Device Type */ -#define OHCI_OCPM 0x0800 /* Overcurrent Protection Mode */ -#define OHCI_NOCP 0x1000 /* No Overcurrent Protection */ -#define OHCI_GET_POTPGT(s) ((s) >> 24) -#define OHCI_RH_DESCRIPTOR_B 0x4c -#define OHCI_RH_STATUS 0x50 -#define OHCI_LPS 0x00000001 /* Local Power Status */ -#define OHCI_OCI 0x00000002 /* OverCurrent Indicator */ -#define OHCI_DRWE 0x00008000 /* Device Remote Wakeup Enable */ -#define OHCI_LPSC 0x00010000 /* Local Power Status Change */ -#define OHCI_CCIC 0x00020000 /* OverCurrent Indicator - * Change */ -#define OHCI_CRWE 0x80000000 /* Clear Remote Wakeup Enable */ -#define OHCI_RH_PORT_STATUS(n) (0x50 + ((n)*4)) /* 1 based indexing */ - -#define OHCI_LES (OHCI_PLE | OHCI_IE | OHCI_CLE | OHCI_BLE) -#define OHCI_ALL_INTRS (OHCI_SO | OHCI_WDH | OHCI_SF | \ - OHCI_RD | OHCI_UE | OHCI_FNO | \ - OHCI_RHSC | OHCI_OC) -#define OHCI_NORMAL_INTRS (OHCI_WDH | OHCI_RD | OHCI_UE | OHCI_RHSC) - -#define OHCI_FSMPS(i) (((i-210)*6/7) << 16) -#define OHCI_PERIODIC(i) ((i)*9/10) - #define OHCI_NO_INTRS 32 #define OHCI_HCCA_SIZE 256 diff --git a/sys/dev/usb/controller/ohci_atmelarm.c b/sys/dev/usb/controller/ohci_atmelarm.c index a4fe9f397b94..c235a8bd5c2f 100644 --- a/sys/dev/usb/controller/ohci_atmelarm.c +++ b/sys/dev/usb/controller/ohci_atmelarm.c @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include diff --git a/sys/dev/usb/controller/ohci_pci.c b/sys/dev/usb/controller/ohci_pci.c index 3be6e42d43ee..395947174e53 100644 --- a/sys/dev/usb/controller/ohci_pci.c +++ b/sys/dev/usb/controller/ohci_pci.c @@ -81,6 +81,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #define PCI_OHCI_VENDORID_ACERLABS 0x10b9 #define PCI_OHCI_VENDORID_AMD 0x1022 @@ -174,6 +175,12 @@ ohci_pci_match(device_t self) case 0x03f110de: return ("nVidia nForce MCP61 USB Controller"); + case 0x0aa510de: + return ("nVidia nForce MCP79 USB Controller"); + case 0x0aa710de: + return ("nVidia nForce MCP79 USB Controller"); + case 0x0aa810de: + return ("nVidia nForce MCP79 USB Controller"); case 0x70011039: return ("SiS 5571 USB controller"); diff --git a/sys/dev/usb/controller/ohcireg.h b/sys/dev/usb/controller/ohcireg.h new file mode 100644 index 000000000000..9127a02a36f1 --- /dev/null +++ b/sys/dev/usb/controller/ohcireg.h @@ -0,0 +1,131 @@ +/* $FreeBSD$ */ +/*- + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson (lennart@augustsson.net) at + * Carlstedt Research & Technology. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 _OHCIREG_H_ +#define _OHCIREG_H_ + +/* PCI config registers */ +#define PCI_CBMEM 0x10 /* configuration base memory */ +#define PCI_INTERFACE_OHCI 0x10 + +/* OHCI registers */ +#define OHCI_REVISION 0x00 /* OHCI revision */ +#define OHCI_REV_LO(rev) ((rev) & 0xf) +#define OHCI_REV_HI(rev) (((rev)>>4) & 0xf) +#define OHCI_REV_LEGACY(rev) ((rev) & 0x100) +#define OHCI_CONTROL 0x04 +#define OHCI_CBSR_MASK 0x00000003 /* Control/Bulk Service Ratio */ +#define OHCI_RATIO_1_1 0x00000000 +#define OHCI_RATIO_1_2 0x00000001 +#define OHCI_RATIO_1_3 0x00000002 +#define OHCI_RATIO_1_4 0x00000003 +#define OHCI_PLE 0x00000004 /* Periodic List Enable */ +#define OHCI_IE 0x00000008 /* Isochronous Enable */ +#define OHCI_CLE 0x00000010 /* Control List Enable */ +#define OHCI_BLE 0x00000020 /* Bulk List Enable */ +#define OHCI_HCFS_MASK 0x000000c0 /* HostControllerFunctionalStat + * e */ +#define OHCI_HCFS_RESET 0x00000000 +#define OHCI_HCFS_RESUME 0x00000040 +#define OHCI_HCFS_OPERATIONAL 0x00000080 +#define OHCI_HCFS_SUSPEND 0x000000c0 +#define OHCI_IR 0x00000100 /* Interrupt Routing */ +#define OHCI_RWC 0x00000200 /* Remote Wakeup Connected */ +#define OHCI_RWE 0x00000400 /* Remote Wakeup Enabled */ +#define OHCI_COMMAND_STATUS 0x08 +#define OHCI_HCR 0x00000001 /* Host Controller Reset */ +#define OHCI_CLF 0x00000002 /* Control List Filled */ +#define OHCI_BLF 0x00000004 /* Bulk List Filled */ +#define OHCI_OCR 0x00000008 /* Ownership Change Request */ +#define OHCI_SOC_MASK 0x00030000 /* Scheduling Overrun Count */ +#define OHCI_INTERRUPT_STATUS 0x0c +#define OHCI_SO 0x00000001 /* Scheduling Overrun */ +#define OHCI_WDH 0x00000002 /* Writeback Done Head */ +#define OHCI_SF 0x00000004 /* Start of Frame */ +#define OHCI_RD 0x00000008 /* Resume Detected */ +#define OHCI_UE 0x00000010 /* Unrecoverable Error */ +#define OHCI_FNO 0x00000020 /* Frame Number Overflow */ +#define OHCI_RHSC 0x00000040 /* Root Hub Status Change */ +#define OHCI_OC 0x40000000 /* Ownership Change */ +#define OHCI_MIE 0x80000000 /* Master Interrupt Enable */ +#define OHCI_INTERRUPT_ENABLE 0x10 +#define OHCI_INTERRUPT_DISABLE 0x14 +#define OHCI_HCCA 0x18 +#define OHCI_PERIOD_CURRENT_ED 0x1c +#define OHCI_CONTROL_HEAD_ED 0x20 +#define OHCI_CONTROL_CURRENT_ED 0x24 +#define OHCI_BULK_HEAD_ED 0x28 +#define OHCI_BULK_CURRENT_ED 0x2c +#define OHCI_DONE_HEAD 0x30 +#define OHCI_FM_INTERVAL 0x34 +#define OHCI_GET_IVAL(s) ((s) & 0x3fff) +#define OHCI_GET_FSMPS(s) (((s) >> 16) & 0x7fff) +#define OHCI_FIT 0x80000000 +#define OHCI_FM_REMAINING 0x38 +#define OHCI_FM_NUMBER 0x3c +#define OHCI_PERIODIC_START 0x40 +#define OHCI_LS_THRESHOLD 0x44 +#define OHCI_RH_DESCRIPTOR_A 0x48 +#define OHCI_GET_NDP(s) ((s) & 0xff) +#define OHCI_PSM 0x0100 /* Power Switching Mode */ +#define OHCI_NPS 0x0200 /* No Power Switching */ +#define OHCI_DT 0x0400 /* Device Type */ +#define OHCI_OCPM 0x0800 /* Overcurrent Protection Mode */ +#define OHCI_NOCP 0x1000 /* No Overcurrent Protection */ +#define OHCI_GET_POTPGT(s) ((s) >> 24) +#define OHCI_RH_DESCRIPTOR_B 0x4c +#define OHCI_RH_STATUS 0x50 +#define OHCI_LPS 0x00000001 /* Local Power Status */ +#define OHCI_OCI 0x00000002 /* OverCurrent Indicator */ +#define OHCI_DRWE 0x00008000 /* Device Remote Wakeup Enable */ +#define OHCI_LPSC 0x00010000 /* Local Power Status Change */ +#define OHCI_CCIC 0x00020000 /* OverCurrent Indicator + * Change */ +#define OHCI_CRWE 0x80000000 /* Clear Remote Wakeup Enable */ +#define OHCI_RH_PORT_STATUS(n) (0x50 + ((n)*4)) /* 1 based indexing */ + +#define OHCI_LES (OHCI_PLE | OHCI_IE | OHCI_CLE | OHCI_BLE) +#define OHCI_ALL_INTRS (OHCI_SO | OHCI_WDH | OHCI_SF | \ + OHCI_RD | OHCI_UE | OHCI_FNO | \ + OHCI_RHSC | OHCI_OC) +#define OHCI_NORMAL_INTRS (OHCI_WDH | OHCI_RD | OHCI_UE | OHCI_RHSC) + +#define OHCI_FSMPS(i) (((i-210)*6/7) << 16) +#define OHCI_PERIODIC(i) ((i)*9/10) + +#endif /* _OHCIREG_H_ */ diff --git a/sys/dev/usb/controller/uhci.c b/sys/dev/usb/controller/uhci.c index 2a2ff1cf2ceb..837a26f16a16 100644 --- a/sys/dev/usb/controller/uhci.c +++ b/sys/dev/usb/controller/uhci.c @@ -75,6 +75,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #define alt_next next #define UHCI_BUS2SC(bus) \ @@ -90,6 +91,10 @@ SYSCTL_INT(_hw_usb_uhci, OID_AUTO, debug, CTLFLAG_RW, &uhcidebug, 0, "uhci debug level"); SYSCTL_INT(_hw_usb_uhci, OID_AUTO, loop, CTLFLAG_RW, &uhcinoloop, 0, "uhci noloop"); + +TUNABLE_INT("hw.usb.uhci.debug", &uhcidebug); +TUNABLE_INT("hw.usb.uhci.loop", &uhcinoloop); + static void uhci_dumpregs(uhci_softc_t *sc); static void uhci_dump_tds(uhci_td_t *td); @@ -824,33 +829,6 @@ uhci_dump_all(uhci_softc_t *sc) uhci_dump_qh(sc->sc_last_qh_p); } -static void -uhci_dump_qhs(uhci_qh_t *sqh) -{ - uint8_t temp; - - temp = uhci_dump_qh(sqh); - - /* - * uhci_dump_qhs displays all the QHs and TDs from the given QH - * onwards Traverses sideways first, then down. - * - * QH1 QH2 No QH TD2.1 TD2.2 TD1.1 etc. - * - * TD2.x being the TDs queued at QH2 and QH1 being referenced from QH1. - */ - - if (temp & 1) - uhci_dump_qhs(sqh->h_next); - else - DPRINTF("No QH\n"); - - if (temp & 2) - uhci_dump_tds(sqh->e_next); - else - DPRINTF("No TD\n"); -} - static void uhci_dump_tds(uhci_td_t *td) { diff --git a/sys/dev/usb/controller/uhci.h b/sys/dev/usb/controller/uhci.h index f2ea246229c7..f526431932dd 100644 --- a/sys/dev/usb/controller/uhci.h +++ b/sys/dev/usb/controller/uhci.h @@ -41,64 +41,6 @@ #define UHCI_MAX_DEVICES MIN(USB_MAX_DEVICES, 128) -/* PCI config registers */ -#define PCI_USBREV 0x60 /* USB protocol revision */ -#define PCI_USB_REV_MASK 0xff -#define PCI_USB_REV_PRE_1_0 0x00 -#define PCI_USB_REV_1_0 0x10 -#define PCI_USB_REV_1_1 0x11 -#define PCI_LEGSUP 0xc0 /* Legacy Support register */ -#define PCI_LEGSUP_USBPIRQDEN 0x2000 /* USB PIRQ D Enable */ -#define PCI_CBIO 0x20 /* configuration base IO */ -#define PCI_INTERFACE_UHCI 0x00 - -/* UHCI registers */ -#define UHCI_CMD 0x00 -#define UHCI_CMD_RS 0x0001 -#define UHCI_CMD_HCRESET 0x0002 -#define UHCI_CMD_GRESET 0x0004 -#define UHCI_CMD_EGSM 0x0008 -#define UHCI_CMD_FGR 0x0010 -#define UHCI_CMD_SWDBG 0x0020 -#define UHCI_CMD_CF 0x0040 -#define UHCI_CMD_MAXP 0x0080 -#define UHCI_STS 0x02 -#define UHCI_STS_USBINT 0x0001 -#define UHCI_STS_USBEI 0x0002 -#define UHCI_STS_RD 0x0004 -#define UHCI_STS_HSE 0x0008 -#define UHCI_STS_HCPE 0x0010 -#define UHCI_STS_HCH 0x0020 -#define UHCI_STS_ALLINTRS 0x003f -#define UHCI_INTR 0x04 -#define UHCI_INTR_TOCRCIE 0x0001 -#define UHCI_INTR_RIE 0x0002 -#define UHCI_INTR_IOCE 0x0004 -#define UHCI_INTR_SPIE 0x0008 -#define UHCI_FRNUM 0x06 -#define UHCI_FRNUM_MASK 0x03ff -#define UHCI_FLBASEADDR 0x08 -#define UHCI_SOF 0x0c -#define UHCI_SOF_MASK 0x7f -#define UHCI_PORTSC1 0x010 -#define UHCI_PORTSC2 0x012 -#define UHCI_PORTSC_CCS 0x0001 -#define UHCI_PORTSC_CSC 0x0002 -#define UHCI_PORTSC_PE 0x0004 -#define UHCI_PORTSC_POEDC 0x0008 -#define UHCI_PORTSC_LS 0x0030 -#define UHCI_PORTSC_LS_SHIFT 4 -#define UHCI_PORTSC_RD 0x0040 -#define UHCI_PORTSC_LSDA 0x0100 -#define UHCI_PORTSC_PR 0x0200 -#define UHCI_PORTSC_OCI 0x0400 -#define UHCI_PORTSC_OCIC 0x0800 -#define UHCI_PORTSC_SUSP 0x1000 - -#define URWMASK(x) ((x) & (UHCI_PORTSC_SUSP | \ - UHCI_PORTSC_PR | UHCI_PORTSC_RD | \ - UHCI_PORTSC_PE)) - #define UHCI_FRAMELIST_COUNT 1024 /* units */ #define UHCI_FRAMELIST_ALIGN 4096 /* bytes */ @@ -118,8 +60,6 @@ typedef uint32_t uhci_physaddr_t; #define UHCI_PTR_QH 0x00000002 #define UHCI_PTR_VF 0x00000004 -#define UHCI_QH_REMOVE_DELAY 5 /* us - QH remove delay */ - /* * The Queue Heads (QH) and Transfer Descriptors (TD) are accessed by * both the CPU and the USB-controller which run concurrently. Great diff --git a/sys/dev/usb/controller/uhci_pci.c b/sys/dev/usb/controller/uhci_pci.c index ba155be3a7d3..81421e3e7a3a 100644 --- a/sys/dev/usb/controller/uhci_pci.c +++ b/sys/dev/usb/controller/uhci_pci.c @@ -81,14 +81,13 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #define PCI_UHCI_VENDORID_INTEL 0x8086 #define PCI_UHCI_VENDORID_VIA 0x1106 /* PIIX4E has no separate stepping */ -#define PCI_UHCI_BASE_REG 0x20 - static device_probe_t uhci_pci_probe; static device_attach_t uhci_pci_attach; static device_detach_t uhci_pci_detach; @@ -231,6 +230,18 @@ uhci_pci_match(device_t self) return ("Intel 82801I (ICH9) USB controller"); case 0x29398086: return ("Intel 82801I (ICH9) USB controller"); + case 0x3a348086: + return ("Intel 82801JI (ICH10) USB controller USB-A"); + case 0x3a358086: + return ("Intel 82801JI (ICH10) USB controller USB-B"); + case 0x3a368086: + return ("Intel 82801JI (ICH10) USB controller USB-C"); + case 0x3a378086: + return ("Intel 82801JI (ICH10) USB controller USB-D"); + case 0x3a388086: + return ("Intel 82801JI (ICH10) USB controller USB-E"); + case 0x3a398086: + return ("Intel 82801JI (ICH10) USB controller USB-F"); case 0x719a8086: return ("Intel 82443MX USB controller"); diff --git a/sys/dev/usb/controller/uhcireg.h b/sys/dev/usb/controller/uhcireg.h new file mode 100644 index 000000000000..993b73cd4ea9 --- /dev/null +++ b/sys/dev/usb/controller/uhcireg.h @@ -0,0 +1,102 @@ +/* $FreeBSD$ */ +/*- + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson (lennart@augustsson.net) at + * Carlstedt Research & Technology. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 _UHCIREG_H_ +#define _UHCIREG_H_ + +#define PCI_UHCI_BASE_REG 0x20 + +/* PCI config registers */ +#define PCI_USBREV 0x60 /* USB protocol revision */ +#define PCI_USB_REV_MASK 0xff +#define PCI_USB_REV_PRE_1_0 0x00 +#define PCI_USB_REV_1_0 0x10 +#define PCI_USB_REV_1_1 0x11 +#define PCI_LEGSUP 0xc0 /* Legacy Support register */ +#define PCI_LEGSUP_USBPIRQDEN 0x2000 /* USB PIRQ D Enable */ +#define PCI_CBIO 0x20 /* configuration base IO */ +#define PCI_INTERFACE_UHCI 0x00 + +/* UHCI registers */ +#define UHCI_CMD 0x00 +#define UHCI_CMD_RS 0x0001 +#define UHCI_CMD_HCRESET 0x0002 +#define UHCI_CMD_GRESET 0x0004 +#define UHCI_CMD_EGSM 0x0008 +#define UHCI_CMD_FGR 0x0010 +#define UHCI_CMD_SWDBG 0x0020 +#define UHCI_CMD_CF 0x0040 +#define UHCI_CMD_MAXP 0x0080 +#define UHCI_STS 0x02 +#define UHCI_STS_USBINT 0x0001 +#define UHCI_STS_USBEI 0x0002 +#define UHCI_STS_RD 0x0004 +#define UHCI_STS_HSE 0x0008 +#define UHCI_STS_HCPE 0x0010 +#define UHCI_STS_HCH 0x0020 +#define UHCI_STS_ALLINTRS 0x003f +#define UHCI_INTR 0x04 +#define UHCI_INTR_TOCRCIE 0x0001 +#define UHCI_INTR_RIE 0x0002 +#define UHCI_INTR_IOCE 0x0004 +#define UHCI_INTR_SPIE 0x0008 +#define UHCI_FRNUM 0x06 +#define UHCI_FRNUM_MASK 0x03ff +#define UHCI_FLBASEADDR 0x08 +#define UHCI_SOF 0x0c +#define UHCI_SOF_MASK 0x7f +#define UHCI_PORTSC1 0x010 +#define UHCI_PORTSC2 0x012 +#define UHCI_PORTSC_CCS 0x0001 +#define UHCI_PORTSC_CSC 0x0002 +#define UHCI_PORTSC_PE 0x0004 +#define UHCI_PORTSC_POEDC 0x0008 +#define UHCI_PORTSC_LS 0x0030 +#define UHCI_PORTSC_LS_SHIFT 4 +#define UHCI_PORTSC_RD 0x0040 +#define UHCI_PORTSC_LSDA 0x0100 +#define UHCI_PORTSC_PR 0x0200 +#define UHCI_PORTSC_OCI 0x0400 +#define UHCI_PORTSC_OCIC 0x0800 +#define UHCI_PORTSC_SUSP 0x1000 + +#define URWMASK(x) ((x) & (UHCI_PORTSC_SUSP | \ + UHCI_PORTSC_PR | UHCI_PORTSC_RD | \ + UHCI_PORTSC_PE)) + +#endif /* _UHCIREG_H_ */ diff --git a/sys/dev/usb/controller/usb_controller.c b/sys/dev/usb/controller/usb_controller.c index a92544435905..eb961fcb9455 100644 --- a/sys/dev/usb/controller/usb_controller.c +++ b/sys/dev/usb/controller/usb_controller.c @@ -130,7 +130,7 @@ usb_attach(device_t dev) DPRINTF("\n"); if (bus == NULL) { - DPRINTFN(0, "USB device has no ivars\n"); + device_printf(dev, "USB device has no ivars\n"); return (ENXIO); } @@ -270,11 +270,9 @@ usb_bus_detach(struct usb_proc_msg *pm) mtx_unlock(&Giant); /* - * Free USB Root device, but not any sub-devices, hence they - * are freed by the caller of this function: + * Free USB device and all subdevices, if any. */ - usb_free_device(udev, - USB_UNCFG_FLAG_FREE_EP0); + usb_free_device(udev, 0); USB_BUS_LOCK(bus); /* clear bdev variable last */ @@ -345,7 +343,7 @@ usb_bus_attach(struct usb_proc_msg *pm) break; default: - device_printf(bus->bdev, "Unsupported USB revision!\n"); + device_printf(bus->bdev, "Unsupported USB revision\n"); return; } @@ -532,7 +530,7 @@ usb_bus_mem_alloc_all(struct usb_bus *bus, bus_dma_tag_t dmat, (bus->devices_max < USB_MIN_DEVICES) || (bus->devices == NULL)) { DPRINTFN(0, "Devices field has not been " - "initialised properly!\n"); + "initialised properly\n"); bus->alloc_failed = 1; /* failure */ } #if USB_HAVE_BUSDMA diff --git a/sys/dev/usb/controller/uss820dci.c b/sys/dev/usb/controller/uss820dci.c index 62fa8df4b619..fe14d513c8bf 100644 --- a/sys/dev/usb/controller/uss820dci.c +++ b/sys/dev/usb/controller/uss820dci.c @@ -858,6 +858,7 @@ uss820dci_setup_standard_chain(struct usb_xfer *xfer) /* setup temp */ + temp.pc = NULL; temp.td = NULL; temp.td_next = xfer->td_start[0]; temp.offset = 0; diff --git a/sys/dev/usb/input/atp.c b/sys/dev/usb/input/atp.c new file mode 100644 index 000000000000..6c0ce2c7036e --- /dev/null +++ b/sys/dev/usb/input/atp.c @@ -0,0 +1,2224 @@ +/*- + * Copyright (c) 2009 Rohit Grover + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "usbdevs.h" + +#define USB_DEBUG_VAR atp_debug +#include + +#include + +#define ATP_DRIVER_NAME "atp" + +/* + * Driver specific options: the following options may be set by + * `options' statements in the kernel configuration file. + */ + +/* The multiplier used to translate sensor reported positions to mickeys. */ +#ifndef ATP_SCALE_FACTOR +#define ATP_SCALE_FACTOR 48 +#endif + +/* + * This is the age (in microseconds) beyond which a touch is + * considered to be a slide; and therefore a tap event isn't registered. + */ +#ifndef ATP_TOUCH_TIMEOUT +#define ATP_TOUCH_TIMEOUT 125000 +#endif + +/* + * A double-tap followed by a single-finger slide is treated as a + * special gesture. The driver responds to this gesture by assuming a + * virtual button-press for the lifetime of the slide. The following + * threshold is the maximum time gap (in microseconds) between the two + * tap events preceding the slide for such a gesture. + */ +#ifndef ATP_DOUBLE_TAP_N_DRAG_THRESHOLD +#define ATP_DOUBLE_TAP_N_DRAG_THRESHOLD 200000 +#endif + +/* + * The device provides us only with pressure readings from an array of + * X and Y sensors; for our algorithms, we need to interpret groups + * (typically pairs) of X and Y readings as being related to a single + * finger stroke. We can relate X and Y readings based on their times + * of incidence. The coincidence window should be at least 10000us + * since it is used against values from getmicrotime(), which has a + * precision of around 10ms. + */ +#ifndef ATP_COINCIDENCE_THRESHOLD +#define ATP_COINCIDENCE_THRESHOLD 40000 /* unit: microseconds */ +#if ATP_COINCIDENCE_THRESHOLD > 100000 +#error "ATP_COINCIDENCE_THRESHOLD too large" +#endif +#endif /* #ifndef ATP_COINCIDENCE_THRESHOLD */ + +/* + * The wait duration (in microseconds) after losing a touch contact + * before zombied strokes are reaped and turned into button events. + */ +#define ATP_ZOMBIE_STROKE_REAP_WINDOW 50000 +#if ATP_ZOMBIE_STROKE_REAP_WINDOW > 100000 +#error "ATP_ZOMBIE_STROKE_REAP_WINDOW too large" +#endif + +/* end of driver specific options */ + + +/* Tunables */ +SYSCTL_NODE(_hw_usb, OID_AUTO, atp, CTLFLAG_RW, 0, "USB atp"); + +#if USB_DEBUG +enum atp_log_level { + ATP_LLEVEL_DISABLED = 0, + ATP_LLEVEL_ERROR, + ATP_LLEVEL_DEBUG, /* for troubleshooting */ + ATP_LLEVEL_INFO, /* for diagnostics */ +}; +static int atp_debug = ATP_LLEVEL_ERROR; /* the default is to only log errors */ +SYSCTL_INT(_hw_usb_atp, OID_AUTO, debug, CTLFLAG_RW, + &atp_debug, ATP_LLEVEL_ERROR, "ATP debug level"); +#endif /* #if USB_DEBUG */ + +static u_int atp_touch_timeout = ATP_TOUCH_TIMEOUT; +SYSCTL_INT(_hw_usb_atp, OID_AUTO, touch_timeout, CTLFLAG_RW, &atp_touch_timeout, + 125000, "age threshold (in micros) for a touch"); + +static u_int atp_double_tap_threshold = ATP_DOUBLE_TAP_N_DRAG_THRESHOLD; +SYSCTL_INT(_hw_usb_atp, OID_AUTO, double_tap_threshold, CTLFLAG_RW, + &atp_double_tap_threshold, ATP_DOUBLE_TAP_N_DRAG_THRESHOLD, + "maximum time (in micros) between a double-tap"); + +static u_int atp_mickeys_scale_factor = ATP_SCALE_FACTOR; +static int atp_sysctl_scale_factor_handler(SYSCTL_HANDLER_ARGS); +SYSCTL_PROC(_hw_usb_atp, OID_AUTO, scale_factor, CTLTYPE_UINT | CTLFLAG_RW, + &atp_mickeys_scale_factor, sizeof(atp_mickeys_scale_factor), + atp_sysctl_scale_factor_handler, "IU", "movement scale factor"); + +static u_int atp_small_movement_threshold = ATP_SCALE_FACTOR >> 3; +SYSCTL_UINT(_hw_usb_atp, OID_AUTO, small_movement, CTLFLAG_RW, + &atp_small_movement_threshold, ATP_SCALE_FACTOR >> 3, + "the small movement black-hole for filtering noise"); +/* + * The movement threshold for a stroke; this is the maximum difference + * in position which will be resolved as a continuation of a stroke + * component. + */ +static u_int atp_max_delta_mickeys = ((3 * ATP_SCALE_FACTOR) >> 1); +SYSCTL_UINT(_hw_usb_atp, OID_AUTO, max_delta_mickeys, CTLFLAG_RW, + &atp_max_delta_mickeys, ((3 * ATP_SCALE_FACTOR) >> 1), + "max. mickeys-delta which will match against an existing stroke"); +/* + * Strokes which accumulate at least this amount of absolute movement + * from the aggregate of their components are considered as + * slides. Unit: mickeys. + */ +static u_int atp_slide_min_movement = (ATP_SCALE_FACTOR >> 3); +SYSCTL_UINT(_hw_usb_atp, OID_AUTO, slide_min_movement, CTLFLAG_RW, + &atp_slide_min_movement, (ATP_SCALE_FACTOR >> 3), + "strokes with at least this amt. of movement are considered slides"); + +/* + * The minimum age of a stroke for it to be considered mature; this + * helps filter movements (noise) from immature strokes. Units: interrupts. + */ +static u_int atp_stroke_maturity_threshold = 2; +SYSCTL_UINT(_hw_usb_atp, OID_AUTO, stroke_maturity_threshold, CTLFLAG_RW, + &atp_stroke_maturity_threshold, 2, + "the minimum age of a stroke for it to be considered mature"); + +/* Accept pressure readings from sensors only if above this value. */ +static u_int atp_sensor_noise_threshold = 2; +SYSCTL_UINT(_hw_usb_atp, OID_AUTO, sensor_noise_threshold, CTLFLAG_RW, + &atp_sensor_noise_threshold, 2, + "accept pressure readings from sensors only if above this value"); + +/* Ignore pressure spans with cumulative press. below this value. */ +static u_int atp_pspan_min_cum_pressure = 10; +SYSCTL_UINT(_hw_usb_atp, OID_AUTO, pspan_min_cum_pressure, CTLFLAG_RW, + &atp_pspan_min_cum_pressure, 10, + "ignore pressure spans with cumulative press. below this value"); + +/* Maximum allowed width for pressure-spans.*/ +static u_int atp_pspan_max_width = 4; +SYSCTL_UINT(_hw_usb_atp, OID_AUTO, pspan_max_width, CTLFLAG_RW, + &atp_pspan_max_width, 4, + "maximum allowed width (in sensors) for pressure-spans"); + +/* We support three payload protocols */ +typedef enum { + ATP_PROT_GEYSER1, + ATP_PROT_GEYSER2, + ATP_PROT_GEYSER3, +} atp_protocol; + +/* Define the various flavours of devices supported by this driver. */ +enum { + ATP_DEV_PARAMS_0, + ATP_DEV_PARAMS_PBOOK, + ATP_DEV_PARAMS_PBOOK_15A, + ATP_DEV_PARAMS_PBOOK_17, + ATP_N_DEV_PARAMS +}; +struct atp_dev_params { + u_int data_len; /* for sensor data */ + u_int n_xsensors; + u_int n_ysensors; + atp_protocol prot; +} atp_dev_params[ATP_N_DEV_PARAMS] = { + [ATP_DEV_PARAMS_0] = { + .data_len = 64, + .n_xsensors = 20, + .n_ysensors = 10, + .prot = ATP_PROT_GEYSER3 + }, + [ATP_DEV_PARAMS_PBOOK] = { + .data_len = 81, + .n_xsensors = 16, + .n_ysensors = 16, + .prot = ATP_PROT_GEYSER1 + }, + [ATP_DEV_PARAMS_PBOOK_15A] = { + .data_len = 64, + .n_xsensors = 15, + .n_ysensors = 9, + .prot = ATP_PROT_GEYSER2 + }, + [ATP_DEV_PARAMS_PBOOK_17] = { + .data_len = 81, + .n_xsensors = 26, + .n_ysensors = 16, + .prot = ATP_PROT_GEYSER1 + }, +}; + +static const struct usb_device_id atp_devs[] = { + /* Core Duo MacBook & MacBook Pro */ + { USB_VPI(USB_VENDOR_APPLE, 0x0217, ATP_DEV_PARAMS_0) }, + { USB_VPI(USB_VENDOR_APPLE, 0x0218, ATP_DEV_PARAMS_0) }, + { USB_VPI(USB_VENDOR_APPLE, 0x0219, ATP_DEV_PARAMS_0) }, + + /* Core2 Duo MacBook & MacBook Pro */ + { USB_VPI(USB_VENDOR_APPLE, 0x021a, ATP_DEV_PARAMS_0) }, + { USB_VPI(USB_VENDOR_APPLE, 0x021b, ATP_DEV_PARAMS_0) }, + { USB_VPI(USB_VENDOR_APPLE, 0x021c, ATP_DEV_PARAMS_0) }, + + /* Core2 Duo MacBook3,1 */ + { USB_VPI(USB_VENDOR_APPLE, 0x0229, ATP_DEV_PARAMS_0) }, + { USB_VPI(USB_VENDOR_APPLE, 0x022a, ATP_DEV_PARAMS_0) }, + { USB_VPI(USB_VENDOR_APPLE, 0x022b, ATP_DEV_PARAMS_0) }, + + /* 12 inch PowerBook and iBook */ + { USB_VPI(USB_VENDOR_APPLE, 0x030a, ATP_DEV_PARAMS_PBOOK) }, + { USB_VPI(USB_VENDOR_APPLE, 0x030b, ATP_DEV_PARAMS_PBOOK) }, + + /* 15 inch PowerBook */ + { USB_VPI(USB_VENDOR_APPLE, 0x020e, ATP_DEV_PARAMS_PBOOK) }, + { USB_VPI(USB_VENDOR_APPLE, 0x020f, ATP_DEV_PARAMS_PBOOK) }, + { USB_VPI(USB_VENDOR_APPLE, 0x0215, ATP_DEV_PARAMS_PBOOK_15A) }, + + /* 17 inch PowerBook */ + { USB_VPI(USB_VENDOR_APPLE, 0x020d, ATP_DEV_PARAMS_PBOOK_17) }, + +}; + +/* + * The following structure captures the state of a pressure span along + * an axis. Each contact with the touchpad results in separate + * pressure spans along the two axes. + */ +typedef struct atp_pspan { + u_int width; /* in units of sensors */ + u_int cum; /* cumulative compression (from all sensors) */ + u_int cog; /* center of gravity */ + u_int loc; /* location (scaled using the mickeys factor) */ + boolean_t matched; /* to track pspans as they match against strokes. */ +} atp_pspan; + +typedef enum atp_stroke_type { + ATP_STROKE_TOUCH, + ATP_STROKE_SLIDE, +} atp_stroke_type; + +#define ATP_MAX_PSPANS_PER_AXIS 3 + +typedef struct atp_stroke_component { + /* Fields encapsulating the pressure-span. */ + u_int loc; /* location (scaled) */ + u_int cum_pressure; /* cumulative compression */ + u_int max_cum_pressure; /* max cumulative compression */ + boolean_t matched; /*to track components as they match against pspans.*/ + + /* Fields containing information about movement. */ + int delta_mickeys; /* change in location (un-smoothened movement)*/ + int pending; /* cum. of pending short movements */ + int movement; /* current smoothened movement */ +} atp_stroke_component; + +typedef enum atp_axis { + X = 0, + Y = 1 +} atp_axis; + +#define ATP_MAX_STROKES (2 * ATP_MAX_PSPANS_PER_AXIS) + +/* + * The following structure captures a finger contact with the + * touchpad. A stroke comprises two p-span components and some state. + */ +typedef struct atp_stroke { + atp_stroke_type type; + struct timeval ctime; /* create time; for coincident siblings. */ + u_int age; /* + * Unit: interrupts; we maintain + * this value in addition to + * 'ctime' in order to avoid the + * expensive call to microtime() + * at every interrupt. + */ + + atp_stroke_component components[2]; + u_int velocity_squared; /* + * Average magnitude (squared) + * of recent velocity. + */ + u_int cum_movement; /* cum. absolute movement so far */ + + uint32_t flags; /* the state of this stroke */ +#define ATSF_ZOMBIE 0x1 +} atp_stroke; + +#define ATP_FIFO_BUF_SIZE 8 /* bytes */ +#define ATP_FIFO_QUEUE_MAXLEN 50 /* units */ + +enum { + ATP_INTR_DT, + ATP_RESET, + ATP_N_TRANSFER, +}; + +struct atp_softc { + device_t sc_dev; + struct usb_device *sc_usb_device; +#define MODE_LENGTH 8 + char sc_mode_bytes[MODE_LENGTH]; /* device mode */ + struct mtx sc_mutex; /* for synchronization */ + struct usb_xfer *sc_xfer[ATP_N_TRANSFER]; + struct usb_fifo_sc sc_fifo; + + struct atp_dev_params *sc_params; + + mousehw_t sc_hw; + mousemode_t sc_mode; + u_int sc_pollrate; + mousestatus_t sc_status; + u_int sc_state; +#define ATP_ENABLED 0x01 +#define ATP_ZOMBIES_EXIST 0x02 +#define ATP_DOUBLE_TAP_DRAG 0x04 +#define ATP_VALID 0x08 + + u_int sc_left_margin; + u_int sc_right_margin; + + atp_stroke sc_strokes[ATP_MAX_STROKES]; + u_int sc_n_strokes; + + int8_t *sensor_data; /* from interrupt packet */ + int *base_x; /* base sensor readings */ + int *base_y; + int *cur_x; /* current sensor readings */ + int *cur_y; + int *pressure_x; /* computed pressures */ + int *pressure_y; + + u_int sc_idlecount; /* preceding idle interrupts */ +#define ATP_IDLENESS_THRESHOLD 10 + + struct timeval sc_reap_time; + struct timeval sc_reap_ctime; /*ctime of siblings to be reaped*/ +}; + +/* + * The last byte of the sensor data contains status bits; the + * following values define the meanings of these bits. + */ +enum atp_status_bits { + ATP_STATUS_BUTTON = (uint8_t)0x01, /* The button was pressed */ + ATP_STATUS_BASE_UPDATE = (uint8_t)0x04, /* Data from an untouched pad.*/ +}; + +typedef enum interface_mode { + RAW_SENSOR_MODE = (uint8_t)0x04, + HID_MODE = (uint8_t)0x08 +} interface_mode; + +/* + * function prototypes + */ +static usb_fifo_cmd_t atp_start_read; +static usb_fifo_cmd_t atp_stop_read; +static usb_fifo_open_t atp_open; +static usb_fifo_close_t atp_close; +static usb_fifo_ioctl_t atp_ioctl; + +static struct usb_fifo_methods atp_fifo_methods = { + .f_open = &atp_open, + .f_close = &atp_close, + .f_ioctl = &atp_ioctl, + .f_start_read = &atp_start_read, + .f_stop_read = &atp_stop_read, + .basename[0] = ATP_DRIVER_NAME, +}; + +/* device initialization and shutdown */ +static usb_error_t atp_req_get_report(struct usb_device *udev, void *data); +static int atp_set_device_mode(device_t dev, interface_mode mode); +static void atp_reset_callback(struct usb_xfer *, usb_error_t); +static int atp_enable(struct atp_softc *sc); +static void atp_disable(struct atp_softc *sc); +static int atp_softc_populate(struct atp_softc *); +static void atp_softc_unpopulate(struct atp_softc *); + +/* sensor interpretation */ +static __inline void atp_interpret_sensor_data(const int8_t *, u_int, atp_axis, + int *, atp_protocol); +static __inline void atp_get_pressures(int *, const int *, const int *, int); +static void atp_detect_pspans(int *, u_int, u_int, atp_pspan *, + u_int *); + +/* movement detection */ +static boolean_t atp_match_stroke_component(atp_stroke_component *, + const atp_pspan *, atp_stroke_type); +static void atp_match_strokes_against_pspans(struct atp_softc *, + atp_axis, atp_pspan *, u_int, u_int); +static boolean_t atp_update_strokes(struct atp_softc *, + atp_pspan *, u_int, atp_pspan *, u_int); +static __inline void atp_add_stroke(struct atp_softc *, const atp_pspan *, + const atp_pspan *); +static void atp_add_new_strokes(struct atp_softc *, atp_pspan *, + u_int, atp_pspan *, u_int); +static void atp_advance_stroke_state(struct atp_softc *, + atp_stroke *, boolean_t *); +static void atp_terminate_stroke(struct atp_softc *, u_int); +static __inline boolean_t atp_stroke_has_small_movement(const atp_stroke *); +static __inline void atp_update_pending_mickeys(atp_stroke_component *); +static void atp_compute_smoothening_scale_ratio(atp_stroke *, int *, + int *); +static boolean_t atp_compute_stroke_movement(atp_stroke *); + +/* tap detection */ +static __inline void atp_setup_reap_time(struct atp_softc *, struct timeval *); +static void atp_reap_zombies(struct atp_softc *, u_int *, u_int *); +static void atp_convert_to_slide(struct atp_softc *, atp_stroke *); + +/* updating fifo */ +static void atp_reset_buf(struct atp_softc *sc); +static void atp_add_to_queue(struct atp_softc *, int, int, uint32_t); + + +usb_error_t +atp_req_get_report(struct usb_device *udev, void *data) +{ + struct usb_device_request req; + + req.bmRequestType = UT_READ_CLASS_INTERFACE; + req.bRequest = UR_GET_REPORT; + USETW2(req.wValue, (uint8_t)0x03 /* type */, (uint8_t)0x00 /* id */); + USETW(req.wIndex, 0); + USETW(req.wLength, MODE_LENGTH); + + return (usbd_do_request(udev, NULL /* mutex */, &req, data)); +} + +static int +atp_set_device_mode(device_t dev, interface_mode mode) +{ + struct atp_softc *sc; + usb_device_request_t req; + usb_error_t err; + + if ((mode != RAW_SENSOR_MODE) && (mode != HID_MODE)) + return (ENXIO); + + sc = device_get_softc(dev); + + sc->sc_mode_bytes[0] = mode; + req.bmRequestType = UT_WRITE_CLASS_INTERFACE; + req.bRequest = UR_SET_REPORT; + USETW2(req.wValue, (uint8_t)0x03 /* type */, (uint8_t)0x00 /* id */); + USETW(req.wIndex, 0); + USETW(req.wLength, MODE_LENGTH); + err = usbd_do_request(sc->sc_usb_device, NULL, &req, sc->sc_mode_bytes); + if (err != USB_ERR_NORMAL_COMPLETION) + return (ENXIO); + + return (0); +} + +void +atp_reset_callback(struct usb_xfer *xfer, usb_error_t error) +{ + usb_device_request_t req; + struct usb_page_cache *pc; + struct atp_softc *sc = usbd_xfer_softc(xfer); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_SETUP: + sc->sc_mode_bytes[0] = RAW_SENSOR_MODE; + req.bmRequestType = UT_WRITE_CLASS_INTERFACE; + req.bRequest = UR_SET_REPORT; + USETW2(req.wValue, + (uint8_t)0x03 /* type */, (uint8_t)0x00 /* id */); + USETW(req.wIndex, 0); + USETW(req.wLength, MODE_LENGTH); + + pc = usbd_xfer_get_frame(xfer, 0); + usbd_copy_in(pc, 0, &req, sizeof(req)); + pc = usbd_xfer_get_frame(xfer, 1); + usbd_copy_in(pc, 0, sc->sc_mode_bytes, MODE_LENGTH); + + usbd_xfer_set_frame_len(xfer, 0, sizeof(req)); + usbd_xfer_set_frame_len(xfer, 1, MODE_LENGTH); + usbd_xfer_set_frames(xfer, 2); + usbd_transfer_submit(xfer); + break; + + case USB_ST_TRANSFERRED: + default: + break; + } +} + +static int +atp_enable(struct atp_softc *sc) +{ + /* Allocate the dynamic buffers */ + if (atp_softc_populate(sc) != 0) { + atp_softc_unpopulate(sc); + return (ENOMEM); + } + + /* reset status */ + memset(sc->sc_strokes, 0, sizeof(sc->sc_strokes)); + sc->sc_n_strokes = 0; + memset(&sc->sc_status, 0, sizeof(sc->sc_status)); + sc->sc_idlecount = 0; + sc->sc_state |= ATP_ENABLED; + + DPRINTFN(ATP_LLEVEL_INFO, "enabled atp\n"); + return (0); +} + +static void +atp_disable(struct atp_softc *sc) +{ + atp_softc_unpopulate(sc); + + sc->sc_state &= ~(ATP_ENABLED | ATP_VALID); + DPRINTFN(ATP_LLEVEL_INFO, "disabled atp\n"); +} + +/* Allocate dynamic memory for some fields in softc. */ +static int +atp_softc_populate(struct atp_softc *sc) +{ + const struct atp_dev_params *params = sc->sc_params; + + if (params == NULL) { + DPRINTF("params uninitialized!\n"); + return (ENXIO); + } + if (params->data_len) { + sc->sensor_data = malloc(params->data_len * sizeof(int8_t), + M_USB, M_WAITOK); + if (sc->sensor_data == NULL) { + DPRINTF("mem for sensor_data\n"); + return (ENXIO); + } + } + + if (params->n_xsensors != 0) { + sc->base_x = malloc(params->n_xsensors * sizeof(*(sc->base_x)), + M_USB, M_WAITOK); + if (sc->base_x == NULL) { + DPRINTF("mem for sc->base_x\n"); + return (ENXIO); + } + + sc->cur_x = malloc(params->n_xsensors * sizeof(*(sc->cur_x)), + M_USB, M_WAITOK); + if (sc->cur_x == NULL) { + DPRINTF("mem for sc->cur_x\n"); + return (ENXIO); + } + + sc->pressure_x = + malloc(params->n_xsensors * sizeof(*(sc->pressure_x)), + M_USB, M_WAITOK); + if (sc->pressure_x == NULL) { + DPRINTF("mem. for pressure_x\n"); + return (ENXIO); + } + } + + if (params->n_ysensors != 0) { + sc->base_y = malloc(params->n_ysensors * sizeof(*(sc->base_y)), + M_USB, M_WAITOK); + if (sc->base_y == NULL) { + DPRINTF("mem for base_y\n"); + return (ENXIO); + } + + sc->cur_y = malloc(params->n_ysensors * sizeof(*(sc->cur_y)), + M_USB, M_WAITOK); + if (sc->cur_y == NULL) { + DPRINTF("mem for cur_y\n"); + return (ENXIO); + } + + sc->pressure_y = + malloc(params->n_ysensors * sizeof(*(sc->pressure_y)), + M_USB, M_WAITOK); + if (sc->pressure_y == NULL) { + DPRINTF("mem. for pressure_y\n"); + return (ENXIO); + } + } + + return (0); +} + +/* Free dynamic memory allocated for some fields in softc. */ +static void +atp_softc_unpopulate(struct atp_softc *sc) +{ + const struct atp_dev_params *params = sc->sc_params; + + if (params == NULL) { + return; + } + if (params->n_xsensors != 0) { + if (sc->base_x != NULL) { + free(sc->base_x, M_USB); + sc->base_x = NULL; + } + + if (sc->cur_x != NULL) { + free(sc->cur_x, M_USB); + sc->cur_x = NULL; + } + + if (sc->pressure_x != NULL) { + free(sc->pressure_x, M_USB); + sc->pressure_x = NULL; + } + } + if (params->n_ysensors != 0) { + if (sc->base_y != NULL) { + free(sc->base_y, M_USB); + sc->base_y = NULL; + } + + if (sc->cur_y != NULL) { + free(sc->cur_y, M_USB); + sc->cur_y = NULL; + } + + if (sc->pressure_y != NULL) { + free(sc->pressure_y, M_USB); + sc->pressure_y = NULL; + } + } + if (sc->sensor_data != NULL) { + free(sc->sensor_data, M_USB); + sc->sensor_data = NULL; + } +} + +/* + * Interpret the data from the X and Y pressure sensors. This function + * is called separately for the X and Y sensor arrays. The data in the + * USB packet is laid out in the following manner: + * + * sensor_data: + * --,--,Y1,Y2,--,Y3,Y4,--,Y5,...,Y10, ... X1,X2,--,X3,X4 + * indices: 0 1 2 3 4 5 6 7 8 ... 15 ... 20 21 22 23 24 + * + * '--' (in the above) indicates that the value is unimportant. + * + * Information about the above layout was obtained from the + * implementation of the AppleTouch driver in Linux. + * + * parameters: + * sensor_data + * raw sensor data from the USB packet. + * num + * The number of elements in the array 'arr'. + * axis + * Axis of data to fetch + * arr + * The array to be initialized with the readings. + * prot + * The protocol to use to interpret the data + */ +static __inline void +atp_interpret_sensor_data(const int8_t *sensor_data, u_int num, atp_axis axis, + int *arr, atp_protocol prot) +{ + u_int i; + u_int di; /* index into sensor data */ + + switch (prot) { + case ATP_PROT_GEYSER1: + /* + * For Geyser 1, the sensors are laid out in pairs + * every 5 bytes. + */ + for (i = 0, di = (axis == Y) ? 1 : 2; i < 8; di += 5, i++) { + arr[i] = sensor_data[di]; + arr[i+8] = sensor_data[di+2]; + if (axis == X && num > 16) + arr[i+16] = sensor_data[di+40]; + } + + break; + case ATP_PROT_GEYSER2: + case ATP_PROT_GEYSER3: + for (i = 0, di = (axis == Y) ? 2 : 20; i < num; /* empty */ ) { + arr[i++] = sensor_data[di++]; + arr[i++] = sensor_data[di++]; + di++; + } + break; + } +} + +static __inline void +atp_get_pressures(int *p, const int *cur, const int *base, int n) +{ + int i; + + for (i = 0; i < n; i++) { + p[i] = cur[i] - base[i]; + if (p[i] > 127) + p[i] -= 256; + if (p[i] < -127) + p[i] += 256; + if (p[i] < 0) + p[i] = 0; + + /* + * Shave off pressures below the noise-pressure + * threshold; this will reduce the contribution from + * lower pressure readings. + */ + if (p[i] <= atp_sensor_noise_threshold) + p[i] = 0; /* filter away noise */ + else + p[i] -= atp_sensor_noise_threshold; + } +} + +static void +atp_detect_pspans(int *p, u_int num_sensors, + u_int max_spans, /* max # of pspans permitted */ + atp_pspan *spans, /* finger spans */ + u_int *nspans_p) /* num spans detected */ +{ + u_int i; + int maxp; /* max pressure seen within a span */ + u_int num_spans = 0; + + enum atp_pspan_state { + ATP_PSPAN_INACTIVE, + ATP_PSPAN_INCREASING, + ATP_PSPAN_DECREASING, + } state; /* state of the pressure span */ + + /* + * The following is a simple state machine to track + * the phase of the pressure span. + */ + memset(spans, 0, max_spans * sizeof(atp_pspan)); + maxp = 0; + state = ATP_PSPAN_INACTIVE; + for (i = 0; i < num_sensors; i++) { + if (num_spans >= max_spans) + break; + + if (p[i] == 0) { + if (state == ATP_PSPAN_INACTIVE) { + /* + * There is no pressure information for this + * sensor, and we aren't tracking a finger. + */ + continue; + } else { + state = ATP_PSPAN_INACTIVE; + maxp = 0; + num_spans++; + } + } else { + switch (state) { + case ATP_PSPAN_INACTIVE: + state = ATP_PSPAN_INCREASING; + maxp = p[i]; + break; + + case ATP_PSPAN_INCREASING: + if (p[i] > maxp) + maxp = p[i]; + else if (p[i] <= (maxp >> 1)) + state = ATP_PSPAN_DECREASING; + break; + + case ATP_PSPAN_DECREASING: + if (p[i] > p[i - 1]) { + /* + * This is the beginning of + * another span; change state + * to give the appearance that + * we're starting from an + * inactive span, and then + * re-process this reading in + * the next iteration. + */ + num_spans++; + state = ATP_PSPAN_INACTIVE; + maxp = 0; + i--; + continue; + } + break; + } + + /* Update the finger span with this reading. */ + spans[num_spans].width++; + spans[num_spans].cum += p[i]; + spans[num_spans].cog += p[i] * (i + 1); + } + } + if (state != ATP_PSPAN_INACTIVE) + num_spans++; /* close the last finger span */ + + /* post-process the spans */ + for (i = 0; i < num_spans; i++) { + /* filter away unwanted pressure spans */ + if ((spans[i].cum < atp_pspan_min_cum_pressure) || + (spans[i].width > atp_pspan_max_width)) { + if ((i + 1) < num_spans) { + memcpy(&spans[i], &spans[i + 1], + (num_spans - i - 1) * sizeof(atp_pspan)); + i--; + } + num_spans--; + continue; + } + + /* compute this span's representative location */ + spans[i].loc = spans[i].cog * atp_mickeys_scale_factor / + spans[i].cum; + + spans[i].matched = FALSE; /* not yet matched against a stroke */ + } + + *nspans_p = num_spans; +} + +/* + * Match a pressure-span against a stroke-component. If there is a + * match, update the component's state and return TRUE. + */ +static boolean_t +atp_match_stroke_component(atp_stroke_component *component, + const atp_pspan *pspan, atp_stroke_type stroke_type) +{ + int delta_mickeys; + u_int min_pressure; + + delta_mickeys = pspan->loc - component->loc; + + if (abs(delta_mickeys) > atp_max_delta_mickeys) + return (FALSE); /* the finger span is too far out; no match */ + + component->loc = pspan->loc; + + /* + * A sudden and significant increase in a pspan's cumulative + * pressure indicates the incidence of a new finger + * contact. This usually revises the pspan's + * centre-of-gravity, and hence the location of any/all + * matching stroke component(s). But such a change should + * *not* be interpreted as a movement. + */ + if (pspan->cum > ((3 * component->cum_pressure) >> 1)) + delta_mickeys = 0; + + component->cum_pressure = pspan->cum; + if (pspan->cum > component->max_cum_pressure) + component->max_cum_pressure = pspan->cum; + + /* + * Disregard the component's movement if its cumulative + * pressure drops below a fraction of the maximum; this + * fraction is determined based on the stroke's type. + */ + if (stroke_type == ATP_STROKE_TOUCH) + min_pressure = (3 * component->max_cum_pressure) >> 2; + else + min_pressure = component->max_cum_pressure >> 2; + if (component->cum_pressure < min_pressure) + delta_mickeys = 0; + + component->delta_mickeys = delta_mickeys; + return (TRUE); +} + +static void +atp_match_strokes_against_pspans(struct atp_softc *sc, atp_axis axis, + atp_pspan *pspans, u_int n_pspans, u_int repeat_count) +{ + u_int i, j; + u_int repeat_index = 0; + + /* Determine the index of the multi-span. */ + if (repeat_count) { + u_int cum = 0; + for (i = 0; i < n_pspans; i++) { + if (pspans[i].cum > cum) { + repeat_index = i; + cum = pspans[i].cum; + } + } + } + + for (i = 0; i < sc->sc_n_strokes; i++) { + atp_stroke *stroke = &sc->sc_strokes[i]; + if (stroke->components[axis].matched) + continue; /* skip matched components */ + + for (j = 0; j < n_pspans; j++) { + if (pspans[j].matched) + continue; /* skip matched pspans */ + + if (atp_match_stroke_component( + &stroke->components[axis], &pspans[j], + stroke->type)) { + /* There is a match. */ + stroke->components[axis].matched = TRUE; + + /* Take care to repeat at the multi-span. */ + if ((repeat_count > 0) && (j == repeat_index)) + repeat_count--; + else + pspans[j].matched = TRUE; + + break; /* skip to the next stroke */ + } + } /* loop over pspans */ + } /* loop over strokes */ +} + +/* + * Update strokes by matching against current pressure-spans. + * Return TRUE if any movement is detected. + */ +static boolean_t +atp_update_strokes(struct atp_softc *sc, atp_pspan *pspans_x, + u_int n_xpspans, atp_pspan *pspans_y, u_int n_ypspans) +{ + u_int i, j; + atp_stroke *stroke; + boolean_t movement = FALSE; + u_int repeat_count = 0; + + /* Reset X and Y components of all strokes as unmatched. */ + for (i = 0; i < sc->sc_n_strokes; i++) { + stroke = &sc->sc_strokes[i]; + stroke->components[X].matched = FALSE; + stroke->components[Y].matched = FALSE; + } + + /* + * Usually, the X and Y pspans come in pairs (the common case + * being a single pair). It is possible, however, that + * multiple contacts resolve to a single pspan along an + * axis, as illustrated in the following: + * + * F = finger-contact + * + * pspan pspan + * +-----------------------+ + * | . . | + * | . . | + * | . . | + * | . . | + * pspan |.........F......F | + * | | + * | | + * | | + * +-----------------------+ + * + * + * The above case can be detected by a difference in the + * number of X and Y pspans. When this happens, X and Y pspans + * aren't easy to pair or match against strokes. + * + * When X and Y pspans differ in number, the axis with the + * smaller number of pspans is regarded as having a repeating + * pspan (or a multi-pspan)--in the above illustration, the + * Y-axis has a repeating pspan. Our approach is to try to + * match the multi-pspan repeatedly against strokes. The + * difference between the number of X and Y pspans gives us a + * crude repeat_count for matching multi-pspans--i.e. the + * multi-pspan along the Y axis (above) has a repeat_count of 1. + */ + repeat_count = abs(n_xpspans - n_ypspans); + + atp_match_strokes_against_pspans(sc, X, pspans_x, n_xpspans, + (((repeat_count != 0) && ((n_xpspans < n_ypspans))) ? + repeat_count : 0)); + atp_match_strokes_against_pspans(sc, Y, pspans_y, n_ypspans, + (((repeat_count != 0) && (n_ypspans < n_xpspans)) ? + repeat_count : 0)); + + /* Update the state of strokes based on the above pspan matches. */ + for (i = 0; i < sc->sc_n_strokes; i++) { + stroke = &sc->sc_strokes[i]; + if (stroke->components[X].matched && + stroke->components[Y].matched) { + atp_advance_stroke_state(sc, stroke, &movement); + } else { + /* + * At least one component of this stroke + * didn't match against current pspans; + * terminate it. + */ + atp_terminate_stroke(sc, i); + } + } + + /* Add new strokes for pairs of unmatched pspans */ + for (i = 0; i < n_xpspans; i++) { + if (pspans_x[i].matched == FALSE) break; + } + for (j = 0; j < n_ypspans; j++) { + if (pspans_y[j].matched == FALSE) break; + } + if ((i < n_xpspans) && (j < n_ypspans)) { +#if USB_DEBUG + if (atp_debug >= ATP_LLEVEL_INFO) { + printf("unmatched pspans:"); + for (; i < n_xpspans; i++) { + if (pspans_x[i].matched) + continue; + printf(" X:[loc:%u,cum:%u]", + pspans_x[i].loc, pspans_x[i].cum); + } + for (; j < n_ypspans; j++) { + if (pspans_y[j].matched) + continue; + printf(" Y:[loc:%u,cum:%u]", + pspans_y[j].loc, pspans_y[j].cum); + } + printf("\n"); + } +#endif /* #if USB_DEBUG */ + if ((n_xpspans == 1) && (n_ypspans == 1)) + /* The common case of a single pair of new pspans. */ + atp_add_stroke(sc, &pspans_x[0], &pspans_y[0]); + else + atp_add_new_strokes(sc, + pspans_x, n_xpspans, + pspans_y, n_ypspans); + } + +#if USB_DEBUG + if (atp_debug >= ATP_LLEVEL_INFO) { + for (i = 0; i < sc->sc_n_strokes; i++) { + atp_stroke *stroke = &sc->sc_strokes[i]; + + printf(" %s%clc:%u,dm:%d,pnd:%d,cum:%d,max:%d,mv:%d%c" + ",%clc:%u,dm:%d,pnd:%d,cum:%d,max:%d,mv:%d%c", + (stroke->flags & ATSF_ZOMBIE) ? "zomb:" : "", + (stroke->type == ATP_STROKE_TOUCH) ? '[' : '<', + stroke->components[X].loc, + stroke->components[X].delta_mickeys, + stroke->components[X].pending, + stroke->components[X].cum_pressure, + stroke->components[X].max_cum_pressure, + stroke->components[X].movement, + (stroke->type == ATP_STROKE_TOUCH) ? ']' : '>', + (stroke->type == ATP_STROKE_TOUCH) ? '[' : '<', + stroke->components[Y].loc, + stroke->components[Y].delta_mickeys, + stroke->components[Y].pending, + stroke->components[Y].cum_pressure, + stroke->components[Y].max_cum_pressure, + stroke->components[Y].movement, + (stroke->type == ATP_STROKE_TOUCH) ? ']' : '>'); + } + if (sc->sc_n_strokes) + printf("\n"); + } +#endif /* #if USB_DEBUG */ + + return (movement); +} + +/* Initialize a stroke using a pressure-span. */ +static __inline void +atp_add_stroke(struct atp_softc *sc, const atp_pspan *pspan_x, + const atp_pspan *pspan_y) +{ + atp_stroke *stroke; + + if (sc->sc_n_strokes >= ATP_MAX_STROKES) + return; + stroke = &sc->sc_strokes[sc->sc_n_strokes]; + + memset(stroke, 0, sizeof(atp_stroke)); + + /* + * Strokes begin as potential touches. If a stroke survives + * longer than a threshold, or if it records significant + * cumulative movement, then it is considered a 'slide'. + */ + stroke->type = ATP_STROKE_TOUCH; + microtime(&stroke->ctime); + stroke->age = 1; /* Unit: interrupts */ + + stroke->components[X].loc = pspan_x->loc; + stroke->components[X].cum_pressure = pspan_x->cum; + stroke->components[X].max_cum_pressure = pspan_x->cum; + stroke->components[X].matched = TRUE; + + stroke->components[Y].loc = pspan_y->loc; + stroke->components[Y].cum_pressure = pspan_y->cum; + stroke->components[Y].max_cum_pressure = pspan_y->cum; + stroke->components[Y].matched = TRUE; + + sc->sc_n_strokes++; + if (sc->sc_n_strokes > 1) { + /* Reset double-tap-n-drag if we have more than one strokes. */ + sc->sc_state &= ~ATP_DOUBLE_TAP_DRAG; + } + + DPRINTFN(ATP_LLEVEL_INFO, "[%u,%u], time: %u,%ld\n", + stroke->components[X].loc, + stroke->components[Y].loc, + (unsigned int)stroke->ctime.tv_sec, + (unsigned long int)stroke->ctime.tv_usec); +} + +static void +atp_add_new_strokes(struct atp_softc *sc, atp_pspan *pspans_x, + u_int n_xpspans, atp_pspan *pspans_y, u_int n_ypspans) +{ + int i, j; + atp_pspan spans[2][ATP_MAX_PSPANS_PER_AXIS]; + u_int nspans[2]; + + /* Copy unmatched pspans into the local arrays. */ + for (i = 0, nspans[X] = 0; i < n_xpspans; i++) { + if (pspans_x[i].matched == FALSE) { + spans[X][nspans[X]] = pspans_x[i]; + nspans[X]++; + } + } + for (j = 0, nspans[Y] = 0; j < n_ypspans; j++) { + if (pspans_y[j].matched == FALSE) { + spans[Y][nspans[Y]] = pspans_y[j]; + nspans[Y]++; + } + } + + if (nspans[X] == nspans[Y]) { + /* Create new strokes from pairs of unmatched pspans */ + for (i = 0, j = 0; (i < nspans[X]) && (j < nspans[Y]); i++, j++) + atp_add_stroke(sc, &spans[X][i], &spans[Y][j]); + } else { + u_int cum = 0; + atp_axis repeat_axis; /* axis with multi-pspans */ + u_int repeat_count; /* repeat count for the multi-pspan*/ + u_int repeat_index = 0; /* index of the multi-span */ + + repeat_axis = (nspans[X] > nspans[Y]) ? Y : X; + repeat_count = abs(nspans[X] - nspans[Y]); + for (i = 0; i < nspans[repeat_axis]; i++) { + if (spans[repeat_axis][i].cum > cum) { + repeat_index = i; + cum = spans[repeat_axis][i].cum; + } + } + + /* Create new strokes from pairs of unmatched pspans */ + i = 0, j = 0; + for (; (i < nspans[X]) && (j < nspans[Y]); i++, j++) { + atp_add_stroke(sc, &spans[X][i], &spans[Y][j]); + + /* Take care to repeat at the multi-pspan. */ + if (repeat_count > 0) { + if ((repeat_axis == X) && + (repeat_index == i)) { + i--; /* counter loop increment */ + repeat_count--; + } else if ((repeat_axis == Y) && + (repeat_index == j)) { + j--; /* counter loop increment */ + repeat_count--; + } + } + } + } +} + +/* + * Advance the state of this stroke--and update the out-parameter + * 'movement' as a side-effect. + */ +void +atp_advance_stroke_state(struct atp_softc *sc, atp_stroke *stroke, + boolean_t *movement) +{ + stroke->age++; + if (stroke->age <= atp_stroke_maturity_threshold) { + /* Avoid noise from immature strokes. */ + stroke->components[X].delta_mickeys = 0; + stroke->components[Y].delta_mickeys = 0; + } + + /* Revitalize stroke if it had previously been marked as a zombie. */ + if (stroke->flags & ATSF_ZOMBIE) + stroke->flags &= ~ATSF_ZOMBIE; + + if (atp_compute_stroke_movement(stroke)) + *movement = TRUE; + + if (stroke->type != ATP_STROKE_TOUCH) + return; + + /* Convert touch strokes to slides upon detecting movement or age. */ + if (stroke->cum_movement >= atp_slide_min_movement) { + atp_convert_to_slide(sc, stroke); + } else { + /* If a touch stroke is found to be older than the + * touch-timeout threshold, it should be converted to + * a slide; except if there is a co-incident sibling + * with a later creation time. + * + * When multiple fingers make contact with the + * touchpad, they are likely to be separated in their + * times of incidence. During a multi-finger tap, + * therefore, the last finger to make + * contact--i.e. the one with the latest + * 'ctime'--should be used to determine how the + * touch-siblings get treated; otherwise older + * siblings may lapse the touch-timeout and get + * converted into slides prematurely. The following + * loop determines if there exists another touch + * stroke with a larger 'ctime' than the current + * stroke (NOTE: zombies with a larger 'ctime' are + * also considered) . + */ + + u_int i; + for (i = 0; i < sc->sc_n_strokes; i++) { + if ((&sc->sc_strokes[i] == stroke) || + (sc->sc_strokes[i].type != ATP_STROKE_TOUCH)) + continue; + + if (timevalcmp(&sc->sc_strokes[i].ctime, + &stroke->ctime, >)) + break; + } + if (i == sc->sc_n_strokes) { + /* Found no other touch stroke with a larger 'ctime'. */ + struct timeval tdiff; + + /* Compute the stroke's age. */ + getmicrotime(&tdiff); + if (timevalcmp(&tdiff, &stroke->ctime, >)) + timevalsub(&tdiff, &stroke->ctime); + else { + /* + * If we are here, it is because getmicrotime + * reported the current time as being behind + * the stroke's start time; getmicrotime can + * be imprecise. + */ + tdiff.tv_sec = 0; + tdiff.tv_usec = 0; + } + + if ((tdiff.tv_sec > (atp_touch_timeout / 1000000)) || + ((tdiff.tv_sec == (atp_touch_timeout / 1000000)) && + (tdiff.tv_usec >= + (atp_touch_timeout % 1000000)))) + atp_convert_to_slide(sc, stroke); + } + } +} + +/* Switch a given touch stroke to being a slide. */ +void +atp_convert_to_slide(struct atp_softc *sc, atp_stroke *stroke) +{ + stroke->type = ATP_STROKE_SLIDE; + + /* Are we at the beginning of a double-click-n-drag? */ + if ((sc->sc_n_strokes == 1) && + ((sc->sc_state & ATP_ZOMBIES_EXIST) == 0) && + timevalcmp(&stroke->ctime, &sc->sc_reap_time, >)) { + struct timeval delta; + struct timeval window = { + atp_double_tap_threshold / 1000000, + atp_double_tap_threshold % 1000000 + }; + + delta = stroke->ctime; + timevalsub(&delta, &sc->sc_reap_time); + if (timevalcmp(&delta, &window, <=)) + sc->sc_state |= ATP_DOUBLE_TAP_DRAG; + } +} + +/* + * Terminate a stroke. While SLIDE strokes are dropped, TOUCH strokes + * are retained as zombies so as to reap all their siblings together; + * this helps establish the number of fingers involved in the tap. + */ +static void +atp_terminate_stroke(struct atp_softc *sc, + u_int index) /* index of the stroke to be terminated */ +{ + atp_stroke *s = &sc->sc_strokes[index]; + + if (s->flags & ATSF_ZOMBIE) { + return; + } + + if ((s->type == ATP_STROKE_TOUCH) && + (s->age > atp_stroke_maturity_threshold)) { + s->flags |= ATSF_ZOMBIE; + + /* If no zombies exist, then prepare to reap zombies later. */ + if ((sc->sc_state & ATP_ZOMBIES_EXIST) == 0) { + atp_setup_reap_time(sc, &s->ctime); + sc->sc_state |= ATP_ZOMBIES_EXIST; + } + } else { + /* Drop this stroke. */ + memcpy(&sc->sc_strokes[index], &sc->sc_strokes[index + 1], + (sc->sc_n_strokes - index - 1) * sizeof(atp_stroke)); + sc->sc_n_strokes--; + + /* + * Reset the double-click-n-drag at the termination of + * any slide stroke. + */ + sc->sc_state &= ~ATP_DOUBLE_TAP_DRAG; + } +} + +static __inline boolean_t +atp_stroke_has_small_movement(const atp_stroke *stroke) +{ + return ((abs(stroke->components[X].delta_mickeys) <= + atp_small_movement_threshold) && + (abs(stroke->components[Y].delta_mickeys) <= + atp_small_movement_threshold)); +} + +/* + * Accumulate delta_mickeys into the component's 'pending' bucket; if + * the aggregate exceeds the small_movement_threshold, then retain + * delta_mickeys for later. + */ +static __inline void +atp_update_pending_mickeys(atp_stroke_component *component) +{ + component->pending += component->delta_mickeys; + if (abs(component->pending) <= atp_small_movement_threshold) + component->delta_mickeys = 0; + else { + /* + * Penalise pending mickeys for having accumulated + * over short deltas. This operation has the effect of + * scaling down the cumulative contribution of short + * movements. + */ + component->pending -= (component->delta_mickeys << 1); + } +} + + +static void +atp_compute_smoothening_scale_ratio(atp_stroke *stroke, int *numerator, + int *denominator) +{ + int dxdt; + int dydt; + u_int vel_squared; /* Square of the velocity vector's magnitude. */ + u_int vel_squared_smooth; + + /* Table holding (10 * sqrt(x)) for x between 1 and 256. */ + static uint8_t sqrt_table[256] = { + 10, 14, 17, 20, 22, 24, 26, 28, + 30, 31, 33, 34, 36, 37, 38, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 50, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 60, 61, 62, 63, + 64, 64, 65, 66, 67, 67, 68, 69, + 70, 70, 71, 72, 72, 73, 74, 74, + 75, 76, 76, 77, 78, 78, 79, 80, + 80, 81, 81, 82, 83, 83, 84, 84, + 85, 86, 86, 87, 87, 88, 88, 89, + 90, 90, 91, 91, 92, 92, 93, 93, + 94, 94, 95, 95, 96, 96, 97, 97, + 98, 98, 99, 100, 100, 100, 101, 101, + 102, 102, 103, 103, 104, 104, 105, 105, + 106, 106, 107, 107, 108, 108, 109, 109, + 110, 110, 110, 111, 111, 112, 112, 113, + 113, 114, 114, 114, 115, 115, 116, 116, + 117, 117, 117, 118, 118, 119, 119, 120, + 120, 120, 121, 121, 122, 122, 122, 123, + 123, 124, 124, 124, 125, 125, 126, 126, + 126, 127, 127, 128, 128, 128, 129, 129, + 130, 130, 130, 131, 131, 131, 132, 132, + 133, 133, 133, 134, 134, 134, 135, 135, + 136, 136, 136, 137, 137, 137, 138, 138, + 138, 139, 139, 140, 140, 140, 141, 141, + 141, 142, 142, 142, 143, 143, 143, 144, + 144, 144, 145, 145, 145, 146, 146, 146, + 147, 147, 147, 148, 148, 148, 149, 149, + 150, 150, 150, 150, 151, 151, 151, 152, + 152, 152, 153, 153, 153, 154, 154, 154, + 155, 155, 155, 156, 156, 156, 157, 157, + 157, 158, 158, 158, 159, 159, 159, 160 + }; + const u_int N = sizeof(sqrt_table) / sizeof(sqrt_table[0]); + + dxdt = stroke->components[X].delta_mickeys; + dydt = stroke->components[Y].delta_mickeys; + + *numerator = 0, *denominator = 0; /* default values. */ + + /* Compute a smoothened magnitude_squared of the stroke's velocity. */ + vel_squared = dxdt * dxdt + dydt * dydt; + vel_squared_smooth = (3 * stroke->velocity_squared + vel_squared) >> 2; + stroke->velocity_squared = vel_squared_smooth; /* retained as history */ + if ((vel_squared == 0) || (vel_squared_smooth == 0)) + return; /* returning (numerator == 0) will imply zero movement*/ + + /* + * In order to determine the overall movement scale factor, + * we're actually interested in the effect of smoothening upon + * the *magnitude* of velocity; i.e. we need to compute the + * square-root of (vel_squared_smooth / vel_squared) in the + * form of a numerator and denominator. + */ + + /* Keep within the bounds of the square-root table. */ + while ((vel_squared > N) || (vel_squared_smooth > N)) { + /* Dividing uniformly by 2 won't disturb the final ratio. */ + vel_squared >>= 1; + vel_squared_smooth >>= 1; + } + + *numerator = sqrt_table[vel_squared_smooth - 1]; + *denominator = sqrt_table[vel_squared - 1]; +} + +/* + * Compute a smoothened value for the stroke's movement from + * delta_mickeys in the X and Y components. + */ +static boolean_t +atp_compute_stroke_movement(atp_stroke *stroke) +{ + int num; /* numerator of scale ratio */ + int denom; /* denominator of scale ratio */ + + /* + * Short movements are added first to the 'pending' bucket, + * and then acted upon only when their aggregate exceeds a + * threshold. This has the effect of filtering away movement + * noise. + */ + if (atp_stroke_has_small_movement(stroke)) { + atp_update_pending_mickeys(&stroke->components[X]); + atp_update_pending_mickeys(&stroke->components[Y]); + } else { /* large movement */ + /* clear away any pending mickeys if there are large movements*/ + stroke->components[X].pending = 0; + stroke->components[Y].pending = 0; + } + + /* Get the scale ratio and smoothen movement. */ + atp_compute_smoothening_scale_ratio(stroke, &num, &denom); + if ((num == 0) || (denom == 0)) { + stroke->components[X].movement = 0; + stroke->components[Y].movement = 0; + stroke->velocity_squared >>= 1; /* Erode velocity_squared. */ + } else { + stroke->components[X].movement = + (stroke->components[X].delta_mickeys * num) / denom; + stroke->components[Y].movement = + (stroke->components[Y].delta_mickeys * num) / denom; + + stroke->cum_movement += + abs(stroke->components[X].movement) + + abs(stroke->components[Y].movement); + } + + return ((stroke->components[X].movement != 0) || + (stroke->components[Y].movement != 0)); +} + +static __inline void +atp_setup_reap_time(struct atp_softc *sc, struct timeval *tvp) +{ + struct timeval reap_window = { + ATP_ZOMBIE_STROKE_REAP_WINDOW / 1000000, + ATP_ZOMBIE_STROKE_REAP_WINDOW % 1000000 + }; + + microtime(&sc->sc_reap_time); + timevaladd(&sc->sc_reap_time, &reap_window); + + sc->sc_reap_ctime = *tvp; /* ctime to reap */ +} + +static void +atp_reap_zombies(struct atp_softc *sc, u_int *n_reaped, u_int *reaped_xlocs) +{ + u_int i; + atp_stroke *stroke; + + *n_reaped = 0; + for (i = 0; i < sc->sc_n_strokes; i++) { + struct timeval tdiff; + + stroke = &sc->sc_strokes[i]; + + if ((stroke->flags & ATSF_ZOMBIE) == 0) + continue; + + /* Compare this stroke's ctime with the ctime being reaped. */ + if (timevalcmp(&stroke->ctime, &sc->sc_reap_ctime, >=)) { + tdiff = stroke->ctime; + timevalsub(&tdiff, &sc->sc_reap_ctime); + } else { + tdiff = sc->sc_reap_ctime; + timevalsub(&tdiff, &stroke->ctime); + } + + if ((tdiff.tv_sec > (ATP_COINCIDENCE_THRESHOLD / 1000000)) || + ((tdiff.tv_sec == (ATP_COINCIDENCE_THRESHOLD / 1000000)) && + (tdiff.tv_usec > (ATP_COINCIDENCE_THRESHOLD % 1000000)))) { + continue; /* Skip non-siblings. */ + } + + /* + * Reap this sibling zombie stroke. + */ + + if (reaped_xlocs != NULL) + reaped_xlocs[*n_reaped] = stroke->components[X].loc; + + /* Erase the stroke from the sc. */ + memcpy(&stroke[i], &stroke[i + 1], + (sc->sc_n_strokes - i - 1) * sizeof(atp_stroke)); + sc->sc_n_strokes--; + + *n_reaped += 1; + --i; /* Decr. i to keep it unchanged for the next iteration */ + } + + DPRINTFN(ATP_LLEVEL_INFO, "reaped %u zombies\n", *n_reaped); + + /* There could still be zombies remaining in the system. */ + for (i = 0; i < sc->sc_n_strokes; i++) { + stroke = &sc->sc_strokes[i]; + if (stroke->flags & ATSF_ZOMBIE) { + DPRINTFN(ATP_LLEVEL_INFO, "zombies remain!\n"); + atp_setup_reap_time(sc, &stroke->ctime); + return; + } + } + + /* If we reach here, then no more zombies remain. */ + sc->sc_state &= ~ATP_ZOMBIES_EXIST; +} + + +/* Device methods. */ +static device_probe_t atp_probe; +static device_attach_t atp_attach; +static device_detach_t atp_detach; +static usb_callback_t atp_intr; + +static const struct usb_config atp_config[ATP_N_TRANSFER] = { + [ATP_INTR_DT] = { + .type = UE_INTERRUPT, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_IN, + .flags = { + .pipe_bof = 1, + .short_xfer_ok = 1, + }, + .bufsize = 0, /* use wMaxPacketSize */ + .callback = &atp_intr, + }, + [ATP_RESET] = { + .type = UE_CONTROL, + .endpoint = 0, /* Control pipe */ + .direction = UE_DIR_ANY, + .bufsize = sizeof(struct usb_device_request) + MODE_LENGTH, + .callback = &atp_reset_callback, + .interval = 0, /* no pre-delay */ + }, +}; + +static int +atp_probe(device_t self) +{ + struct usb_attach_arg *uaa = device_get_ivars(self); + + if (uaa->usb_mode != USB_MODE_HOST) + return (ENXIO); + + if ((uaa->info.bInterfaceClass != UICLASS_HID) || + (uaa->info.bInterfaceProtocol != UIPROTO_MOUSE)) + return (ENXIO); + + return (usbd_lookup_id_by_uaa(atp_devs, sizeof(atp_devs), uaa)); +} + +static int +atp_attach(device_t dev) +{ + struct atp_softc *sc = device_get_softc(dev); + struct usb_attach_arg *uaa = device_get_ivars(dev); + usb_error_t err; + + DPRINTFN(ATP_LLEVEL_INFO, "sc=%p\n", sc); + + sc->sc_dev = dev; + sc->sc_usb_device = uaa->device; + + /* + * By default the touchpad behaves like an HID device, sending + * packets with reportID = 2. Such reports contain only + * limited information--they encode movement deltas and button + * events,--but do not include data from the pressure + * sensors. The device input mode can be switched from HID + * reports to raw sensor data using vendor-specific USB + * control commands; but first the mode must be read. + */ + err = atp_req_get_report(sc->sc_usb_device, sc->sc_mode_bytes); + if (err != USB_ERR_NORMAL_COMPLETION) { + DPRINTF("failed to read device mode (%d)\n", err); + return (ENXIO); + } + + if (atp_set_device_mode(dev, RAW_SENSOR_MODE) != 0) { + DPRINTF("failed to set mode to 'RAW_SENSOR' (%d)\n", err); + return (ENXIO); + } + + mtx_init(&sc->sc_mutex, "atpmtx", NULL, MTX_DEF | MTX_RECURSE); + + err = usbd_transfer_setup(uaa->device, + &uaa->info.bIfaceIndex, sc->sc_xfer, atp_config, + ATP_N_TRANSFER, sc, &sc->sc_mutex); + + if (err) { + DPRINTF("error=%s\n", usbd_errstr(err)); + goto detach; + } + + if (usb_fifo_attach(sc->sc_usb_device, sc, &sc->sc_mutex, + &atp_fifo_methods, &sc->sc_fifo, + device_get_unit(dev), 0 - 1, uaa->info.bIfaceIndex, + UID_ROOT, GID_OPERATOR, 0644)) { + goto detach; + } + + device_set_usb_desc(dev); + + sc->sc_params = &atp_dev_params[uaa->driver_info]; + + sc->sc_hw.buttons = 3; + sc->sc_hw.iftype = MOUSE_IF_USB; + sc->sc_hw.type = MOUSE_PAD; + sc->sc_hw.model = MOUSE_MODEL_GENERIC; + sc->sc_hw.hwid = 0; + sc->sc_mode.protocol = MOUSE_PROTO_MSC; + sc->sc_mode.rate = -1; + sc->sc_mode.resolution = MOUSE_RES_UNKNOWN; + sc->sc_mode.accelfactor = 0; + sc->sc_mode.level = 0; + sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; + sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; + sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; + + sc->sc_state = 0; + + sc->sc_left_margin = atp_mickeys_scale_factor; + sc->sc_right_margin = (sc->sc_params->n_xsensors - 1) * + atp_mickeys_scale_factor; + + return (0); + +detach: + atp_detach(dev); + return (ENOMEM); +} + +static int +atp_detach(device_t dev) +{ + struct atp_softc *sc; + + sc = device_get_softc(dev); + if (sc->sc_state & ATP_ENABLED) { + mtx_lock(&sc->sc_mutex); + atp_disable(sc); + mtx_unlock(&sc->sc_mutex); + } + + usb_fifo_detach(&sc->sc_fifo); + + usbd_transfer_unsetup(sc->sc_xfer, ATP_N_TRANSFER); + + mtx_destroy(&sc->sc_mutex); + + return (0); +} + +static void +atp_intr(struct usb_xfer *xfer, usb_error_t error) +{ + struct atp_softc *sc = usbd_xfer_softc(xfer); + int len; + struct usb_page_cache *pc; + uint8_t status_bits; + atp_pspan pspans_x[ATP_MAX_PSPANS_PER_AXIS]; + atp_pspan pspans_y[ATP_MAX_PSPANS_PER_AXIS]; + u_int n_xpspans = 0, n_ypspans = 0; + u_int reaped_xlocs[ATP_MAX_STROKES]; + u_int tap_fingers = 0; + + usbd_xfer_status(xfer, &len, NULL, NULL, NULL); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + if (len > sc->sc_params->data_len) { + DPRINTFN(ATP_LLEVEL_ERROR, + "truncating large packet from %u to %u bytes\n", + len, sc->sc_params->data_len); + len = sc->sc_params->data_len; + } + if (len < sc->sc_params->data_len) + goto tr_setup; + + pc = usbd_xfer_get_frame(xfer, 0); + usbd_copy_out(pc, 0, sc->sensor_data, sc->sc_params->data_len); + + /* Interpret sensor data */ + atp_interpret_sensor_data(sc->sensor_data, + sc->sc_params->n_xsensors, X, sc->cur_x, + sc->sc_params->prot); + atp_interpret_sensor_data(sc->sensor_data, + sc->sc_params->n_ysensors, Y, sc->cur_y, + sc->sc_params->prot); + + /* + * If this is the initial update (from an untouched + * pad), we should set the base values for the sensor + * data; deltas with respect to these base values can + * be used as pressure readings subsequently. + */ + status_bits = sc->sensor_data[sc->sc_params->data_len - 1]; + if ((sc->sc_params->prot == ATP_PROT_GEYSER3 && + (status_bits & ATP_STATUS_BASE_UPDATE)) || + !(sc->sc_state & ATP_VALID)) { + memcpy(sc->base_x, sc->cur_x, + sc->sc_params->n_xsensors * sizeof(*(sc->base_x))); + memcpy(sc->base_y, sc->cur_y, + sc->sc_params->n_ysensors * sizeof(*(sc->base_y))); + sc->sc_state |= ATP_VALID; + goto tr_setup; + } + + /* Get pressure readings and detect p-spans for both axes. */ + atp_get_pressures(sc->pressure_x, sc->cur_x, sc->base_x, + sc->sc_params->n_xsensors); + atp_detect_pspans(sc->pressure_x, sc->sc_params->n_xsensors, + ATP_MAX_PSPANS_PER_AXIS, + pspans_x, &n_xpspans); + atp_get_pressures(sc->pressure_y, sc->cur_y, sc->base_y, + sc->sc_params->n_ysensors); + atp_detect_pspans(sc->pressure_y, sc->sc_params->n_ysensors, + ATP_MAX_PSPANS_PER_AXIS, + pspans_y, &n_ypspans); + + /* Update strokes with new pspans to detect movements. */ + sc->sc_status.flags &= ~MOUSE_POSCHANGED; + if (atp_update_strokes(sc, + pspans_x, n_xpspans, + pspans_y, n_ypspans)) + sc->sc_status.flags |= MOUSE_POSCHANGED; + + /* Reap zombies if it is time. */ + if (sc->sc_state & ATP_ZOMBIES_EXIST) { + struct timeval now; + + getmicrotime(&now); + if (timevalcmp(&now, &sc->sc_reap_time, >=)) + atp_reap_zombies(sc, &tap_fingers, + reaped_xlocs); + } + + sc->sc_status.flags &= ~MOUSE_STDBUTTONSCHANGED; + sc->sc_status.obutton = sc->sc_status.button; + + /* Get the state of the physical buttton. */ + sc->sc_status.button = (status_bits & ATP_STATUS_BUTTON) ? + MOUSE_BUTTON1DOWN : 0; + if (sc->sc_status.button != 0) { + /* Reset DOUBLE_TAP_N_DRAG if the button is pressed. */ + sc->sc_state &= ~ATP_DOUBLE_TAP_DRAG; + } else if (sc->sc_state & ATP_DOUBLE_TAP_DRAG) { + /* Assume a button-press with DOUBLE_TAP_N_DRAG. */ + sc->sc_status.button = MOUSE_BUTTON1DOWN; + } + + sc->sc_status.flags |= + sc->sc_status.button ^ sc->sc_status.obutton; + if (sc->sc_status.flags & MOUSE_STDBUTTONSCHANGED) { + DPRINTFN(ATP_LLEVEL_INFO, "button %s\n", + ((sc->sc_status.button & MOUSE_BUTTON1DOWN) ? + "pressed" : "released")); + } else if ((sc->sc_status.obutton == 0) && + (sc->sc_status.button == 0) && + (tap_fingers != 0)) { + /* Ignore single-finger taps at the edges. */ + if ((tap_fingers == 1) && + ((reaped_xlocs[0] <= sc->sc_left_margin) || + (reaped_xlocs[0] > sc->sc_right_margin))) { + tap_fingers = 0; + } + DPRINTFN(ATP_LLEVEL_INFO, + "tap_fingers: %u\n", tap_fingers); + } + + if (sc->sc_status.flags & + (MOUSE_POSCHANGED | MOUSE_STDBUTTONSCHANGED)) { + int dx, dy; + u_int n_movements; + + dx = 0, dy = 0, n_movements = 0; + for (u_int i = 0; i < sc->sc_n_strokes; i++) { + atp_stroke *stroke = &sc->sc_strokes[i]; + + if ((stroke->components[X].movement) || + (stroke->components[Y].movement)) { + dx += stroke->components[X].movement; + dy += stroke->components[Y].movement; + n_movements++; + } + } + /* + * Disregard movement if multiple + * strokes record motion. + */ + if (n_movements != 1) + dx = 0, dy = 0; + + sc->sc_status.dx += dx; + sc->sc_status.dy += dy; + atp_add_to_queue(sc, dx, -dy, sc->sc_status.button); + } + + if (tap_fingers != 0) { + /* Add a pair of events (button-down and button-up). */ + switch (tap_fingers) { + case 1: atp_add_to_queue(sc, 0, 0, MOUSE_BUTTON1DOWN); + break; + case 2: atp_add_to_queue(sc, 0, 0, MOUSE_BUTTON2DOWN); + break; + case 3: atp_add_to_queue(sc, 0, 0, MOUSE_BUTTON3DOWN); + break; + default: break;/* handle taps of only up to 3 fingers */ + } + atp_add_to_queue(sc, 0, 0, 0); /* button release */ + } + + /* + * The device continues to trigger interrupts at a + * fast rate even after touchpad activity has + * stopped. Upon detecting that the device has + * remained idle beyond a threshold, we reinitialize + * it to silence the interrupts. + */ + if ((sc->sc_status.flags == 0) && + (sc->sc_n_strokes == 0) && + (sc->sc_status.button == 0)) { + sc->sc_idlecount++; + if (sc->sc_idlecount >= ATP_IDLENESS_THRESHOLD) { + DPRINTFN(ATP_LLEVEL_INFO, "idle\n"); + + /* + * Use the last frame before we go idle for + * calibration on pads which do not send + * calibration frames. + */ + if (sc->sc_params->prot < ATP_PROT_GEYSER3) { + memcpy(sc->base_x, sc->cur_x, + sc->sc_params->n_xsensors * + sizeof(*(sc->base_x))); + memcpy(sc->base_y, sc->cur_y, + sc->sc_params->n_ysensors * + sizeof(*(sc->base_y))); + } + + sc->sc_idlecount = 0; + usbd_transfer_start(sc->sc_xfer[ATP_RESET]); + } + } else { + sc->sc_idlecount = 0; + } + + case USB_ST_SETUP: + tr_setup: + /* check if we can put more data into the FIFO */ + if (usb_fifo_put_bytes_max( + sc->sc_fifo.fp[USB_FIFO_RX]) != 0) { + usbd_xfer_set_frame_len(xfer, 0, + sc->sc_params->data_len); + usbd_transfer_submit(xfer); + } + break; + + default: /* Error */ + if (error != USB_ERR_CANCELLED) { + /* try clear stall first */ + usbd_xfer_set_stall(xfer); + goto tr_setup; + } + break; + } + + return; +} + +static void +atp_add_to_queue(struct atp_softc *sc, int dx, int dy, uint32_t buttons_in) +{ + uint32_t buttons_out; + uint8_t buf[8]; + + dx = imin(dx, 254); dx = imax(dx, -256); + dy = imin(dy, 254); dy = imax(dy, -256); + + buttons_out = MOUSE_MSC_BUTTONS; + if (buttons_in & MOUSE_BUTTON1DOWN) + buttons_out &= ~MOUSE_MSC_BUTTON1UP; + else if (buttons_in & MOUSE_BUTTON2DOWN) + buttons_out &= ~MOUSE_MSC_BUTTON2UP; + else if (buttons_in & MOUSE_BUTTON3DOWN) + buttons_out &= ~MOUSE_MSC_BUTTON3UP; + + DPRINTFN(ATP_LLEVEL_INFO, "dx=%d, dy=%d, buttons=%x\n", + dx, dy, buttons_out); + + /* Encode the mouse data in standard format; refer to mouse(4) */ + buf[0] = sc->sc_mode.syncmask[1]; + buf[0] |= buttons_out; + buf[1] = dx >> 1; + buf[2] = dy >> 1; + buf[3] = dx - (dx >> 1); + buf[4] = dy - (dy >> 1); + /* Encode extra bytes for level 1 */ + if (sc->sc_mode.level == 1) { + buf[5] = 0; /* dz */ + buf[6] = 0; /* dz - (dz / 2) */ + buf[7] = MOUSE_SYS_EXTBUTTONS; /* Extra buttons all up. */ + } + + usb_fifo_put_data_linear(sc->sc_fifo.fp[USB_FIFO_RX], buf, + sc->sc_mode.packetsize, 1); +} + +static void +atp_reset_buf(struct atp_softc *sc) +{ + /* reset read queue */ + usb_fifo_reset(sc->sc_fifo.fp[USB_FIFO_RX]); +} + +static void +atp_start_read(struct usb_fifo *fifo) +{ + struct atp_softc *sc = usb_fifo_softc(fifo); + int rate; + + /* Check if we should override the default polling interval */ + rate = sc->sc_pollrate; + /* Range check rate */ + if (rate > 1000) + rate = 1000; + /* Check for set rate */ + if ((rate > 0) && (sc->sc_xfer[ATP_INTR_DT] != NULL)) { + /* Stop current transfer, if any */ + usbd_transfer_stop(sc->sc_xfer[ATP_INTR_DT]); + /* Set new interval */ + usbd_xfer_set_interval(sc->sc_xfer[ATP_INTR_DT], 1000 / rate); + /* Only set pollrate once */ + sc->sc_pollrate = 0; + } + + usbd_transfer_start(sc->sc_xfer[ATP_INTR_DT]); +} + +static void +atp_stop_read(struct usb_fifo *fifo) +{ + struct atp_softc *sc = usb_fifo_softc(fifo); + + usbd_transfer_stop(sc->sc_xfer[ATP_INTR_DT]); +} + + +static int +atp_open(struct usb_fifo *fifo, int fflags) +{ + DPRINTFN(ATP_LLEVEL_INFO, "\n"); + + if (fflags & FREAD) { + struct atp_softc *sc = usb_fifo_softc(fifo); + int rc; + + if (sc->sc_state & ATP_ENABLED) + return (EBUSY); + + if (usb_fifo_alloc_buffer(fifo, + ATP_FIFO_BUF_SIZE, ATP_FIFO_QUEUE_MAXLEN)) { + return (ENOMEM); + } + + rc = atp_enable(sc); + if (rc != 0) { + usb_fifo_free_buffer(fifo); + return (rc); + } + } + + return (0); +} + +static void +atp_close(struct usb_fifo *fifo, int fflags) +{ + if (fflags & FREAD) { + struct atp_softc *sc = usb_fifo_softc(fifo); + + atp_disable(sc); + usb_fifo_free_buffer(fifo); + } +} + +int +atp_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags) +{ + struct atp_softc *sc = usb_fifo_softc(fifo); + mousemode_t mode; + int error = 0; + + mtx_lock(&sc->sc_mutex); + + switch(cmd) { + case MOUSE_GETHWINFO: + *(mousehw_t *)addr = sc->sc_hw; + break; + case MOUSE_GETMODE: + *(mousemode_t *)addr = sc->sc_mode; + break; + case MOUSE_SETMODE: + mode = *(mousemode_t *)addr; + + if (mode.level == -1) + /* Don't change the current setting */ + ; + else if ((mode.level < 0) || (mode.level > 1)) { + error = EINVAL; + goto done; + } + sc->sc_mode.level = mode.level; + sc->sc_pollrate = mode.rate; + sc->sc_hw.buttons = 3; + + if (sc->sc_mode.level == 0) { + sc->sc_mode.protocol = MOUSE_PROTO_MSC; + sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; + sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; + sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; + } else if (sc->sc_mode.level == 1) { + sc->sc_mode.protocol = MOUSE_PROTO_SYSMOUSE; + sc->sc_mode.packetsize = MOUSE_SYS_PACKETSIZE; + sc->sc_mode.syncmask[0] = MOUSE_SYS_SYNCMASK; + sc->sc_mode.syncmask[1] = MOUSE_SYS_SYNC; + } + atp_reset_buf(sc); + break; + case MOUSE_GETLEVEL: + *(int *)addr = sc->sc_mode.level; + break; + case MOUSE_SETLEVEL: + if (*(int *)addr < 0 || *(int *)addr > 1) { + error = EINVAL; + goto done; + } + sc->sc_mode.level = *(int *)addr; + sc->sc_hw.buttons = 3; + + if (sc->sc_mode.level == 0) { + sc->sc_mode.protocol = MOUSE_PROTO_MSC; + sc->sc_mode.packetsize = MOUSE_MSC_PACKETSIZE; + sc->sc_mode.syncmask[0] = MOUSE_MSC_SYNCMASK; + sc->sc_mode.syncmask[1] = MOUSE_MSC_SYNC; + } else if (sc->sc_mode.level == 1) { + sc->sc_mode.protocol = MOUSE_PROTO_SYSMOUSE; + sc->sc_mode.packetsize = MOUSE_SYS_PACKETSIZE; + sc->sc_mode.syncmask[0] = MOUSE_SYS_SYNCMASK; + sc->sc_mode.syncmask[1] = MOUSE_SYS_SYNC; + } + atp_reset_buf(sc); + break; + case MOUSE_GETSTATUS: { + mousestatus_t *status = (mousestatus_t *)addr; + + *status = sc->sc_status; + sc->sc_status.obutton = sc->sc_status.button; + sc->sc_status.button = 0; + sc->sc_status.dx = 0; + sc->sc_status.dy = 0; + sc->sc_status.dz = 0; + + if (status->dx || status->dy || status->dz) + status->flags |= MOUSE_POSCHANGED; + if (status->button != status->obutton) + status->flags |= MOUSE_BUTTONSCHANGED; + break; + } + default: + error = ENOTTY; + } + +done: + mtx_unlock(&sc->sc_mutex); + return (error); +} + +static int +atp_sysctl_scale_factor_handler(SYSCTL_HANDLER_ARGS) +{ + int error; + u_int tmp; + u_int prev_mickeys_scale_factor; + + prev_mickeys_scale_factor = atp_mickeys_scale_factor; + + tmp = atp_mickeys_scale_factor; + error = sysctl_handle_int(oidp, &tmp, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + + if (tmp == prev_mickeys_scale_factor) + return (0); /* no change */ + + atp_mickeys_scale_factor = tmp; + DPRINTFN(ATP_LLEVEL_INFO, "%s: resetting mickeys_scale_factor to %u\n", + ATP_DRIVER_NAME, tmp); + + /* Update dependent thresholds. */ + if (atp_small_movement_threshold == (prev_mickeys_scale_factor >> 3)) + atp_small_movement_threshold = atp_mickeys_scale_factor >> 3; + if (atp_max_delta_mickeys == ((3 * prev_mickeys_scale_factor) >> 1)) + atp_max_delta_mickeys = ((3 * atp_mickeys_scale_factor) >>1); + if (atp_slide_min_movement == (prev_mickeys_scale_factor >> 3)) + atp_slide_min_movement = atp_mickeys_scale_factor >> 3; + + return (0); +} + +static device_method_t atp_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, atp_probe), + DEVMETHOD(device_attach, atp_attach), + DEVMETHOD(device_detach, atp_detach), + { 0, 0 } +}; + +static driver_t atp_driver = { + ATP_DRIVER_NAME, + atp_methods, + sizeof(struct atp_softc) +}; + +static devclass_t atp_devclass; + +DRIVER_MODULE(atp, uhub, atp_driver, atp_devclass, NULL, 0); +MODULE_DEPEND(atp, usb, 1, 1, 1); diff --git a/sys/dev/usb/input/uhid.c b/sys/dev/usb/input/uhid.c index 411aeb6170da..be356a5e49d2 100644 --- a/sys/dev/usb/input/uhid.c +++ b/sys/dev/usb/input/uhid.c @@ -173,12 +173,21 @@ uhid_intr_callback(struct usb_xfer *xfer, usb_error_t error) DPRINTF("transferred!\n"); pc = usbd_xfer_get_frame(xfer, 0); - if (actlen >= sc->sc_isize) { + + /* + * If the ID byte is non zero we allow descriptors + * having multiple sizes: + */ + if ((actlen >= sc->sc_isize) || + ((actlen > 0) && (sc->sc_iid != 0))) { + /* limit report length to the maximum */ + if (actlen > sc->sc_isize) + actlen = sc->sc_isize; usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], pc, - 0, sc->sc_isize, 1); + 0, actlen, 1); } else { /* ignore it */ - DPRINTF("ignored short transfer, %d bytes\n", actlen); + DPRINTF("ignored transfer, %d bytes\n", actlen); } case USB_ST_SETUP: @@ -633,7 +642,7 @@ uhid_probe(device_t dev) if (usb_test_quirk(uaa, UQ_HID_IGNORE)) { return (ENXIO); } - return (0); + return (BUS_PROBE_GENERIC); } static int diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c index 5816079b3f6f..4e4393108b32 100644 --- a/sys/dev/usb/input/ukbd.c +++ b/sys/dev/usb/input/ukbd.c @@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -104,6 +105,8 @@ SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, debug, CTLFLAG_RW, SYSCTL_INT(_hw_usb_ukbd, OID_AUTO, no_leds, CTLFLAG_RW, &ukbd_no_leds, 0, "Disables setting of keyboard leds"); +TUNABLE_INT("hw.usb.ukbd.debug", &ukbd_debug); +TUNABLE_INT("hw.usb.ukbd.no_leds", &ukbd_no_leds); #endif #define UPROTO_BOOT_KEYBOARD 1 @@ -148,6 +151,7 @@ struct ukbd_softc { struct ukbd_data sc_ndata; struct ukbd_data sc_odata; + struct thread *sc_poll_thread; struct usb_device *sc_udev; struct usb_interface *sc_iface; struct usb_xfer *sc_xfer[UKBD_N_TRANSFER]; @@ -171,9 +175,10 @@ struct ukbd_softc { #define UKBD_FLAG_APPLE_SWAP 0x0100 #define UKBD_FLAG_TIMER_RUNNING 0x0200 - int32_t sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ - int32_t sc_state; /* shift/lock key state */ - int32_t sc_accents; /* accent key index (> 0) */ + int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ + int sc_state; /* shift/lock key state */ + int sc_accents; /* accent key index (> 0) */ + int sc_poll_tick_last; uint16_t sc_inputs; uint16_t sc_inputhead; @@ -184,6 +189,7 @@ struct ukbd_softc { uint8_t sc_iface_no; uint8_t sc_kbd_id; uint8_t sc_led_id; + uint8_t sc_poll_detected; }; #define KEY_ERROR 0x01 @@ -247,8 +253,8 @@ static const uint8_t ukbd_trtab[256] = { NN, NN, NN, NN, NN, NN, NN, NN, /* 68 - 6F */ NN, NN, NN, NN, 115, 108, 111, 113, /* 70 - 77 */ 109, 110, 112, 118, 114, 116, 117, 119, /* 78 - 7F */ - 121, 120, NN, NN, NN, NN, NN, 115, /* 80 - 87 */ - 112, 125, 121, 123, NN, NN, NN, NN, /* 88 - 8F */ + 121, 120, NN, NN, NN, NN, NN, 123, /* 80 - 87 */ + 124, 125, 126, 127, 128, NN, NN, NN, /* 88 - 8F */ NN, NN, NN, NN, NN, NN, NN, NN, /* 90 - 97 */ NN, NN, NN, NN, NN, NN, NN, NN, /* 98 - 9F */ NN, NN, NN, NN, NN, NN, NN, NN, /* A0 - A7 */ @@ -278,6 +284,9 @@ static int ukbd_ioctl(keyboard_t *, u_long, caddr_t); static int ukbd_enable(keyboard_t *); static int ukbd_disable(keyboard_t *); static void ukbd_interrupt(struct ukbd_softc *); +static int ukbd_is_polling(struct ukbd_softc *); +static int ukbd_polls_other_thread(struct ukbd_softc *); +static void ukbd_event_keyinput(struct ukbd_softc *); static device_probe_t ukbd_probe; static device_attach_t ukbd_attach; @@ -328,6 +337,22 @@ ukbd_do_poll(struct ukbd_softc *sc, uint8_t wait) { DPRINTFN(2, "polling\n"); + /* update stats about last polling event */ + sc->sc_poll_tick_last = ticks; + sc->sc_poll_detected = 1; + + if (kdb_active == 0) { + while (sc->sc_inputs == 0) { + /* make sure the USB code gets a chance to run */ + pause("UKBD", 1); + + /* check if we should wait */ + if (!wait) + break; + } + return; /* Only poll if KDB is active */ + } + while (sc->sc_inputs == 0) { usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER); @@ -360,9 +385,13 @@ ukbd_get_key(struct ukbd_softc *sc, uint8_t wait) /* start transfer, if not already started */ usbd_transfer_start(sc->sc_xfer[UKBD_INTR_DT]); } - if (sc->sc_flags & UKBD_FLAG_POLLING) { + + if (ukbd_polls_other_thread(sc)) + return (-1); + + if (sc->sc_flags & UKBD_FLAG_POLLING) ukbd_do_poll(sc, wait); - } + if (sc->sc_inputs == 0) { c = -1; } else { @@ -383,14 +412,13 @@ ukbd_interrupt(struct ukbd_softc *sc) uint32_t o_mod; uint32_t now = sc->sc_time_ms; uint32_t dtime; - uint32_t c; uint8_t key; uint8_t i; uint8_t j; - if (sc->sc_ndata.keycode[0] == KEY_ERROR) { - goto done; - } + if (sc->sc_ndata.keycode[0] == KEY_ERROR) + return; + n_mod = sc->sc_ndata.modifiers; o_mod = sc->sc_odata.modifiers; if (n_mod != o_mod) { @@ -463,14 +491,22 @@ pfound: ; sc->sc_odata = sc->sc_ndata; - bcopy(sc->sc_ntime, sc->sc_otime, sizeof(sc->sc_otime)); + memcpy(sc->sc_otime, sc->sc_ntime, sizeof(sc->sc_otime)); + + ukbd_event_keyinput(sc); +} + +static void +ukbd_event_keyinput(struct ukbd_softc *sc) +{ + int c; + + if (ukbd_is_polling(sc)) + return; + + if (sc->sc_inputs == 0) + return; - if (sc->sc_inputs == 0) { - goto done; - } - if (sc->sc_flags & UKBD_FLAG_POLLING) { - goto done; - } if (KBD_IS_ACTIVE(&sc->sc_kbd) && KBD_IS_BUSY(&sc->sc_kbd)) { /* let the callback function process the input */ @@ -482,8 +518,6 @@ pfound: ; c = ukbd_read_char(&sc->sc_kbd, 0); } while (c != NOKEY); } -done: - return; } static void @@ -493,12 +527,14 @@ ukbd_timeout(void *arg) mtx_assert(&Giant, MA_OWNED); - if (!(sc->sc_flags & UKBD_FLAG_POLLING)) { - sc->sc_time_ms += 25; /* milliseconds */ - } + sc->sc_time_ms += 25; /* milliseconds */ + ukbd_interrupt(sc); - if (ukbd_any_key_pressed(sc)) { + /* Make sure any leftover key events gets read out */ + ukbd_event_keyinput(sc); + + if (ukbd_any_key_pressed(sc) || (sc->sc_inputs != 0)) { ukbd_start_timer(sc); } else { sc->sc_flags &= ~UKBD_FLAG_TIMER_RUNNING; @@ -745,7 +781,7 @@ ukbd_probe(device_t dev) if (usb_test_quirk(uaa, UQ_KBD_IGNORE)) return (ENXIO); else - return (0); + return (BUS_PROBE_GENERIC); } error = usbd_req_get_hid_desc(uaa->device, NULL, @@ -767,7 +803,7 @@ ukbd_probe(device_t dev) if (usb_test_quirk(uaa, UQ_KBD_IGNORE)) error = ENXIO; else - error = 0; + error = BUS_PROBE_GENERIC; } else error = ENXIO; @@ -831,6 +867,18 @@ ukbd_attach(device_t dev) */ KBD_PROBE_DONE(kbd); + /* + * Set boot protocol if we need the quirk. + */ + if (usb_test_quirk(uaa, UQ_KBD_BOOTPROTO)) { + err = usbd_req_set_protocol(sc->sc_udev, NULL, + sc->sc_iface_index, 0); + if (err != USB_ERR_NORMAL_COMPLETION) { + DPRINTF("set protocol error=%s\n", usbd_errstr(err)); + goto detach; + } + } + /* figure out if there is an ID byte in the data */ err = usbd_req_get_hid_desc(uaa->device, NULL, &hid_ptr, &hid_len, M_TEMP, uaa->info.bIfaceIndex); @@ -874,10 +922,14 @@ ukbd_attach(device_t dev) /* ignore if SETIDLE fails, hence it is not crucial */ err = usbd_req_set_idle(sc->sc_udev, NULL, sc->sc_iface_index, 0, 0); + mtx_lock(&Giant); + ukbd_ioctl(kbd, KDSETLED, (caddr_t)&sc->sc_state); KBD_INIT_DONE(kbd); + mtx_unlock(&Giant); + if (kbd_register(kbd) < 0) { goto detach; } @@ -919,9 +971,8 @@ ukbd_detach(device_t dev) DPRINTF("\n"); - if (sc->sc_flags & UKBD_FLAG_POLLING) { - panic("cannot detach polled keyboard!\n"); - } + mtx_lock(&Giant); + sc->sc_flags |= UKBD_FLAG_GONE; usb_callout_stop(&sc->sc_callout); @@ -948,6 +999,8 @@ ukbd_detach(device_t dev) } sc->sc_kbd.kb_flags = 0; + mtx_unlock(&Giant); + usbd_transfer_unsetup(sc->sc_xfer, UKBD_N_TRANSFER); usb_callout_drain(&sc->sc_callout); @@ -963,8 +1016,12 @@ ukbd_resume(device_t dev) { struct ukbd_softc *sc = device_get_softc(dev); + mtx_lock(&Giant); + ukbd_clear_state(&sc->sc_kbd); + mtx_unlock(&Giant); + return (0); } @@ -1070,13 +1127,19 @@ ukbd_check(keyboard_t *kbd) mtx_unlock(&Giant); return (retval); } - ukbd_do_poll(sc, 0); } else { /* XXX the keyboard layer requires Giant */ if (!mtx_owned(&Giant)) return (0); } + /* check if key belongs to this thread */ + if (ukbd_polls_other_thread(sc)) + return (0); + + if (sc->sc_flags & UKBD_FLAG_POLLING) + ukbd_do_poll(sc, 0); + #ifdef UKBD_EMULATE_ATSCANCODE if (sc->sc_buffered_char[0]) { return (1); @@ -1112,6 +1175,10 @@ ukbd_check_char(keyboard_t *kbd) return (0); } + /* check if key belongs to this thread */ + if (ukbd_polls_other_thread(sc)) + return (0); + if ((sc->sc_composed_char > 0) && (!(sc->sc_flags & UKBD_FLAG_COMPOSE))) { return (1); @@ -1150,6 +1217,10 @@ ukbd_read(keyboard_t *kbd, int wait) return (-1); } + /* check if key belongs to this thread */ + if (ukbd_polls_other_thread(sc)) + return (-1); + #ifdef UKBD_EMULATE_ATSCANCODE if (sc->sc_buffered_char[0]) { scancode = sc->sc_buffered_char[0]; @@ -1214,6 +1285,10 @@ ukbd_read_char(keyboard_t *kbd, int wait) return (NOKEY); } + /* check if key belongs to this thread */ + if (ukbd_polls_other_thread(sc)) + return (NOKEY); + next_code: /* do we have a composed char to return ? */ @@ -1413,7 +1488,17 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) * keyboard system must get out of "Giant" first, before the * CPU can proceed here ... */ - return (EINVAL); + switch (cmd) { + case KDGKBMODE: + case KDSKBMODE: + /* workaround for Geli */ + mtx_lock(&Giant); + i = ukbd_ioctl(kbd, cmd, arg); + mtx_unlock(&Giant); + return (i); + default: + return (EINVAL); + } } switch (cmd) { @@ -1439,7 +1524,8 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) case K_RAW: case K_CODE: if (sc->sc_mode != *(int *)arg) { - ukbd_clear_state(kbd); + if (ukbd_is_polling(sc) == 0) + ukbd_clear_state(kbd); sc->sc_mode = *(int *)arg; } break; @@ -1546,7 +1632,11 @@ ukbd_clear_state(keyboard_t *kbd) struct ukbd_softc *sc = kbd->kb_data; if (!mtx_owned(&Giant)) { - return; /* XXX */ + /* XXX cludge */ + mtx_lock(&Giant); + ukbd_clear_state(kbd); + mtx_unlock(&Giant); + return; } sc->sc_flags &= ~(UKBD_FLAG_COMPOSE | UKBD_FLAG_POLLING); @@ -1557,10 +1647,10 @@ ukbd_clear_state(keyboard_t *kbd) sc->sc_buffered_char[0] = 0; sc->sc_buffered_char[1] = 0; #endif - bzero(&sc->sc_ndata, sizeof(sc->sc_ndata)); - bzero(&sc->sc_odata, sizeof(sc->sc_odata)); - bzero(&sc->sc_ntime, sizeof(sc->sc_ntime)); - bzero(&sc->sc_otime, sizeof(sc->sc_otime)); + memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata)); + memset(&sc->sc_odata, 0, sizeof(sc->sc_odata)); + memset(&sc->sc_ntime, 0, sizeof(sc->sc_ntime)); + memset(&sc->sc_otime, 0, sizeof(sc->sc_otime)); } /* save the internal state, not used */ @@ -1577,6 +1667,30 @@ ukbd_set_state(keyboard_t *kbd, void *buf, size_t len) return (EINVAL); } +static int +ukbd_is_polling(struct ukbd_softc *sc) +{ + int delta; + + if (sc->sc_flags & UKBD_FLAG_POLLING) + return (1); /* polling */ + + delta = ticks - sc->sc_poll_tick_last; + if ((delta < 0) || (delta >= hz)) { + sc->sc_poll_detected = 0; + return (0); /* not polling */ + } + + return (sc->sc_poll_detected); +} + +static int +ukbd_polls_other_thread(struct ukbd_softc *sc) +{ + return (ukbd_is_polling(sc) && + (sc->sc_poll_thread != curthread)); +} + static int ukbd_poll(keyboard_t *kbd, int on) { @@ -1593,8 +1707,10 @@ ukbd_poll(keyboard_t *kbd, int on) if (on) { sc->sc_flags |= UKBD_FLAG_POLLING; + sc->sc_poll_thread = curthread; } else { sc->sc_flags &= ~UKBD_FLAG_POLLING; + ukbd_start_timer(sc); /* start timer */ } return (0); } @@ -1636,20 +1752,59 @@ static int ukbd_key2scan(struct ukbd_softc *sc, int code, int shift, int up) { static const int scan[] = { - 0x1c, 0x1d, 0x35, - 0x37 | SCAN_PREFIX_SHIFT, /* PrintScreen */ - 0x38, 0x47, 0x48, 0x49, 0x4b, 0x4d, 0x4f, - 0x50, 0x51, 0x52, 0x53, - 0x46, /* XXX Pause/Break */ - 0x5b, 0x5c, 0x5d, + /* 89 */ + 0x11c, /* Enter */ + /* 90-99 */ + 0x11d, /* Ctrl-R */ + 0x135, /* Divide */ + 0x137 | SCAN_PREFIX_SHIFT, /* PrintScreen */ + 0x138, /* Alt-R */ + 0x147, /* Home */ + 0x148, /* Up */ + 0x149, /* PageUp */ + 0x14b, /* Left */ + 0x14d, /* Right */ + 0x14f, /* End */ + /* 100-109 */ + 0x150, /* Down */ + 0x151, /* PageDown */ + 0x152, /* Insert */ + 0x153, /* Delete */ + 0x146, /* XXX Pause/Break */ + 0x15b, /* Win_L(Super_L) */ + 0x15c, /* Win_R(Super_R) */ + 0x15d, /* Application(Menu) */ + /* SUN TYPE 6 USB KEYBOARD */ - 0x68, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, - 0x64, 0x65, 0x66, 0x67, 0x25, 0x1f, 0x1e, - 0x20, + 0x168, /* Sun Type 6 Help */ + 0x15e, /* Sun Type 6 Stop */ + /* 110 - 119 */ + 0x15f, /* Sun Type 6 Again */ + 0x160, /* Sun Type 6 Props */ + 0x161, /* Sun Type 6 Undo */ + 0x162, /* Sun Type 6 Front */ + 0x163, /* Sun Type 6 Copy */ + 0x164, /* Sun Type 6 Open */ + 0x165, /* Sun Type 6 Paste */ + 0x166, /* Sun Type 6 Find */ + 0x167, /* Sun Type 6 Cut */ + 0x125, /* Sun Type 6 Mute */ + /* 120 - 128 */ + 0x11f, /* Sun Type 6 VolumeDown */ + 0x11e, /* Sun Type 6 VolumeUp */ + 0x120, /* Sun Type 6 PowerDown */ + + /* Japanese 106/109 keyboard */ + 0x73, /* Keyboard Intl' 1 (backslash / underscore) */ + 0x70, /* Keyboard Intl' 2 (Katakana / Hiragana) */ + 0x7d, /* Keyboard Intl' 3 (Yen sign) (Not using in jp106/109) */ + 0x79, /* Keyboard Intl' 4 (Henkan) */ + 0x7b, /* Keyboard Intl' 5 (Muhenkan) */ + 0x5c, /* Keyboard Intl' 6 (Keypad ,) (For PC-9821 layout) */ }; if ((code >= 89) && (code < (89 + (sizeof(scan) / sizeof(scan[0]))))) { - code = scan[code - 89] | SCAN_PREFIX_E0; + code = scan[code - 89]; } /* Pause/Break */ if ((code == 104) && (!(shift & (MOD_CONTROL_L | MOD_CONTROL_R)))) { diff --git a/sys/dev/usb/input/ums.c b/sys/dev/usb/input/ums.c index 7872fe737c55..e29f4ebbb28d 100644 --- a/sys/dev/usb/input/ums.c +++ b/sys/dev/usb/input/ums.c @@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -161,7 +162,9 @@ static usb_fifo_open_t ums_open; static usb_fifo_close_t ums_close; static usb_fifo_ioctl_t ums_ioctl; -static void ums_put_queue(struct ums_softc *sc, int32_t dx, int32_t dy, int32_t dz, int32_t dt, int32_t buttons); +static void ums_put_queue(struct ums_softc *, int32_t, int32_t, + int32_t, int32_t, int32_t); +static int ums_sysctl_handler_parseinfo(SYSCTL_HANDLER_ARGS); static struct usb_fifo_methods ums_fifo_methods = { .f_open = &ums_open, @@ -372,7 +375,7 @@ ums_probe(device_t dev) if ((uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) && (uaa->info.bInterfaceProtocol == UIPROTO_MOUSE)) - return (0); + return (BUS_PROBE_GENERIC); error = usbd_req_get_hid_desc(uaa->device, NULL, &d_ptr, &d_len, M_TEMP, uaa->info.bIfaceIndex); @@ -382,7 +385,7 @@ ums_probe(device_t dev) if (hid_is_collection(d_ptr, d_len, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE))) - error = 0; + error = BUS_PROBE_GENERIC; else error = ENXIO; @@ -643,6 +646,12 @@ ums_attach(device_t dev) if (err) { goto detach; } + SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), + OID_AUTO, "parseinfo", CTLTYPE_STRING|CTLFLAG_RD, + sc, 0, ums_sysctl_handler_parseinfo, + "", "Dump UMS report parsing information"); + return (0); detach: @@ -916,6 +925,67 @@ done: return (error); } +static int +ums_sysctl_handler_parseinfo(SYSCTL_HANDLER_ARGS) +{ + struct ums_softc *sc = arg1; + struct ums_info *info; + struct sbuf *sb; + int i, j, err; + + sb = sbuf_new_auto(); + for (i = 0; i < UMS_INFO_MAX; i++) { + info = &sc->sc_info[i]; + + /* Don't emit empty info */ + if ((info->sc_flags & + (UMS_FLAG_X_AXIS | UMS_FLAG_Y_AXIS | UMS_FLAG_Z_AXIS | + UMS_FLAG_T_AXIS | UMS_FLAG_W_AXIS)) == 0 && + info->sc_buttons == 0) + continue; + + sbuf_printf(sb, "i%d:", i + 1); + if (info->sc_flags & UMS_FLAG_X_AXIS) + sbuf_printf(sb, " X:r%d, p%d, s%d;", + (int)info->sc_iid_x, + (int)info->sc_loc_x.pos, + (int)info->sc_loc_x.size); + if (info->sc_flags & UMS_FLAG_Y_AXIS) + sbuf_printf(sb, " Y:r%d, p%d, s%d;", + (int)info->sc_iid_y, + (int)info->sc_loc_y.pos, + (int)info->sc_loc_y.size); + if (info->sc_flags & UMS_FLAG_Z_AXIS) + sbuf_printf(sb, " Z:r%d, p%d, s%d;", + (int)info->sc_iid_z, + (int)info->sc_loc_z.pos, + (int)info->sc_loc_z.size); + if (info->sc_flags & UMS_FLAG_T_AXIS) + sbuf_printf(sb, " T:r%d, p%d, s%d;", + (int)info->sc_iid_t, + (int)info->sc_loc_t.pos, + (int)info->sc_loc_t.size); + if (info->sc_flags & UMS_FLAG_W_AXIS) + sbuf_printf(sb, " W:r%d, p%d, s%d;", + (int)info->sc_iid_w, + (int)info->sc_loc_w.pos, + (int)info->sc_loc_w.size); + + for (j = 0; j < info->sc_buttons; j++) { + sbuf_printf(sb, " B%d:r%d, p%d, s%d;", j + 1, + (int)info->sc_iid_btn[j], + (int)info->sc_loc_btn[j].pos, + (int)info->sc_loc_btn[j].size); + } + sbuf_printf(sb, "\n"); + } + sbuf_finish(sb); + err = SYSCTL_OUT(req, sbuf_data(sb), sbuf_len(sb) + 1); + sbuf_delete(sb); + + return (err); +} + static devclass_t ums_devclass; static device_method_t ums_methods[] = { diff --git a/sys/dev/usb/net/if_aue.c b/sys/dev/usb/net/if_aue.c index 1a2ce70b5ae3..b508474e4682 100644 --- a/sys/dev/usb/net/if_aue.c +++ b/sys/dev/usb/net/if_aue.c @@ -112,74 +112,76 @@ SYSCTL_INT(_hw_usb_aue, OID_AUTO, debug, CTLFLAG_RW, &aue_debug, 0, * Various supported device vendors/products. */ static const struct usb_device_id aue_devs[] = { - {USB_VPI(USB_VENDOR_3COM, USB_PRODUCT_3COM_3C460B, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_DSB650TX_PNA, 0)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_UFE1000, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX10, 0)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX1, AUE_FLAG_PNA | AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX2, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX4, AUE_FLAG_PNA)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX5, AUE_FLAG_PNA)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX6, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX7, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX8, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_XX9, AUE_FLAG_PNA)}, - {USB_VPI(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_SS1001, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_USB320_EC, 0)}, - {USB_VPI(USB_VENDOR_ADMTEK, USB_PRODUCT_ADMTEK_PEGASUSII_2, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ADMTEK, USB_PRODUCT_ADMTEK_PEGASUSII_3, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ADMTEK, USB_PRODUCT_ADMTEK_PEGASUSII_4, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ADMTEK, USB_PRODUCT_ADMTEK_PEGASUSII, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ADMTEK, USB_PRODUCT_ADMTEK_PEGASUS, AUE_FLAG_PNA | AUE_FLAG_DUAL_PHY)}, - {USB_VPI(USB_VENDOR_AEI, USB_PRODUCT_AEI_FASTETHERNET, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ALLIEDTELESYN, USB_PRODUCT_ALLIEDTELESYN_ATUSB100, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC110T, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_USB2LAN, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_BILLIONTON, USB_PRODUCT_BILLIONTON_USB100, 0)}, - {USB_VPI(USB_VENDOR_BILLIONTON, USB_PRODUCT_BILLIONTON_USBE100, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_BILLIONTON, USB_PRODUCT_BILLIONTON_USBEL100, 0)}, - {USB_VPI(USB_VENDOR_BILLIONTON, USB_PRODUCT_BILLIONTON_USBLP100, AUE_FLAG_PNA)}, - {USB_VPI(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_FETHER_USB_TXS, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_FETHER_USB_TX, 0)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650TX1, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650TX2, AUE_FLAG_LSYS | AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650TX3, AUE_FLAG_LSYS | AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650TX4, AUE_FLAG_LSYS | AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650TX_PNA, AUE_FLAG_PNA)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650TX, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_ELCON, USB_PRODUCT_ELCON_PLAN, AUE_FLAG_PNA | AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_LDUSB20, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_LDUSBLTX, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_LDUSBTX0, 0)}, - {USB_VPI(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_LDUSBTX1, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_LDUSBTX2, 0)}, - {USB_VPI(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_LDUSBTX3, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_ELSA, USB_PRODUCT_ELSA_USB2ETHERNET, 0)}, - {USB_VPI(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNBR402W, 0)}, - {USB_VPI(USB_VENDOR_HAWKING, USB_PRODUCT_HAWKING_UF100, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_HP, USB_PRODUCT_HP_HN210E, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_USBETTXS, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_USBETTX, 0)}, - {USB_VPI(USB_VENDOR_KINGSTON, USB_PRODUCT_KINGSTON_KNU101TX, 0)}, - {USB_VPI(USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB100H1, AUE_FLAG_LSYS | AUE_FLAG_PNA)}, - {USB_VPI(USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB100TX, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB10TA, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB10TX1, AUE_FLAG_LSYS | AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB10TX2, AUE_FLAG_LSYS | AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB10T, AUE_FLAG_LSYS)}, - {USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_LUA2TX5, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_LUATX1, 0)}, - {USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_LUATX5, 0)}, - {USB_VPI(USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_MN110, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_NETGEAR, USB_PRODUCT_NETGEAR_FA101, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_SIEMENS, USB_PRODUCT_SIEMENS_SPEEDSTREAM, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_SIIG2, USB_PRODUCT_SIIG2_USBTOETHER, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_SMARTBRIDGES, USB_PRODUCT_SMARTBRIDGES_SMARTNIC, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_SMC, USB_PRODUCT_SMC_2202USB, 0)}, - {USB_VPI(USB_VENDOR_SMC, USB_PRODUCT_SMC_2206USB, AUE_FLAG_PII)}, - {USB_VPI(USB_VENDOR_SOHOWARE, USB_PRODUCT_SOHOWARE_NUB100, 0)}, - {USB_VPI(USB_VENDOR_SOHOWARE, USB_PRODUCT_SOHOWARE_NUB110, AUE_FLAG_PII)}, +#define AUE_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) } + AUE_DEV(3COM, 3C460B, AUE_FLAG_PII), + AUE_DEV(ABOCOM, DSB650TX_PNA, 0), + AUE_DEV(ABOCOM, UFE1000, AUE_FLAG_LSYS), + AUE_DEV(ABOCOM, XX10, 0), + AUE_DEV(ABOCOM, XX1, AUE_FLAG_PNA | AUE_FLAG_PII), + AUE_DEV(ABOCOM, XX2, AUE_FLAG_PII), + AUE_DEV(ABOCOM, XX4, AUE_FLAG_PNA), + AUE_DEV(ABOCOM, XX5, AUE_FLAG_PNA), + AUE_DEV(ABOCOM, XX6, AUE_FLAG_PII), + AUE_DEV(ABOCOM, XX7, AUE_FLAG_PII), + AUE_DEV(ABOCOM, XX8, AUE_FLAG_PII), + AUE_DEV(ABOCOM, XX9, AUE_FLAG_PNA), + AUE_DEV(ACCTON, SS1001, AUE_FLAG_PII), + AUE_DEV(ACCTON, USB320_EC, 0), + AUE_DEV(ADMTEK, PEGASUSII_2, AUE_FLAG_PII), + AUE_DEV(ADMTEK, PEGASUSII_3, AUE_FLAG_PII), + AUE_DEV(ADMTEK, PEGASUSII_4, AUE_FLAG_PII), + AUE_DEV(ADMTEK, PEGASUSII, AUE_FLAG_PII), + AUE_DEV(ADMTEK, PEGASUS, AUE_FLAG_PNA | AUE_FLAG_DUAL_PHY), + AUE_DEV(AEI, FASTETHERNET, AUE_FLAG_PII), + AUE_DEV(ALLIEDTELESYN, ATUSB100, AUE_FLAG_PII), + AUE_DEV(ATEN, UC110T, AUE_FLAG_PII), + AUE_DEV(BELKIN, USB2LAN, AUE_FLAG_PII), + AUE_DEV(BILLIONTON, USB100, 0), + AUE_DEV(BILLIONTON, USBE100, AUE_FLAG_PII), + AUE_DEV(BILLIONTON, USBEL100, 0), + AUE_DEV(BILLIONTON, USBLP100, AUE_FLAG_PNA), + AUE_DEV(COREGA, FETHER_USB_TXS, AUE_FLAG_PII), + AUE_DEV(COREGA, FETHER_USB_TX, 0), + AUE_DEV(DLINK, DSB650TX1, AUE_FLAG_LSYS), + AUE_DEV(DLINK, DSB650TX2, AUE_FLAG_LSYS | AUE_FLAG_PII), + AUE_DEV(DLINK, DSB650TX3, AUE_FLAG_LSYS | AUE_FLAG_PII), + AUE_DEV(DLINK, DSB650TX4, AUE_FLAG_LSYS | AUE_FLAG_PII), + AUE_DEV(DLINK, DSB650TX_PNA, AUE_FLAG_PNA), + AUE_DEV(DLINK, DSB650TX, AUE_FLAG_LSYS), + AUE_DEV(DLINK, DSB650, AUE_FLAG_LSYS), + AUE_DEV(ELCON, PLAN, AUE_FLAG_PNA | AUE_FLAG_PII), + AUE_DEV(ELECOM, LDUSB20, AUE_FLAG_PII), + AUE_DEV(ELECOM, LDUSBLTX, AUE_FLAG_PII), + AUE_DEV(ELECOM, LDUSBTX0, 0), + AUE_DEV(ELECOM, LDUSBTX1, AUE_FLAG_LSYS), + AUE_DEV(ELECOM, LDUSBTX2, 0), + AUE_DEV(ELECOM, LDUSBTX3, AUE_FLAG_LSYS), + AUE_DEV(ELSA, USB2ETHERNET, 0), + AUE_DEV(GIGABYTE, GNBR402W, 0), + AUE_DEV(HAWKING, UF100, AUE_FLAG_PII), + AUE_DEV(HP, HN210E, AUE_FLAG_PII), + AUE_DEV(IODATA, USBETTXS, AUE_FLAG_PII), + AUE_DEV(IODATA, USBETTX, 0), + AUE_DEV(KINGSTON, KNU101TX, 0), + AUE_DEV(LINKSYS, USB100H1, AUE_FLAG_LSYS | AUE_FLAG_PNA), + AUE_DEV(LINKSYS, USB100TX, AUE_FLAG_LSYS), + AUE_DEV(LINKSYS, USB10TA, AUE_FLAG_LSYS), + AUE_DEV(LINKSYS, USB10TX1, AUE_FLAG_LSYS | AUE_FLAG_PII), + AUE_DEV(LINKSYS, USB10TX2, AUE_FLAG_LSYS | AUE_FLAG_PII), + AUE_DEV(LINKSYS, USB10T, AUE_FLAG_LSYS), + AUE_DEV(MELCO, LUA2TX5, AUE_FLAG_PII), + AUE_DEV(MELCO, LUATX1, 0), + AUE_DEV(MELCO, LUATX5, 0), + AUE_DEV(MICROSOFT, MN110, AUE_FLAG_PII), + AUE_DEV(NETGEAR, FA101, AUE_FLAG_PII), + AUE_DEV(SIEMENS, SPEEDSTREAM, AUE_FLAG_PII), + AUE_DEV(SIIG2, USBTOETHER, AUE_FLAG_PII), + AUE_DEV(SMARTBRIDGES, SMARTNIC, AUE_FLAG_PII), + AUE_DEV(SMC, 2202USB, 0), + AUE_DEV(SMC, 2206USB, AUE_FLAG_PII), + AUE_DEV(SOHOWARE, NUB100, 0), + AUE_DEV(SOHOWARE, NUB110, AUE_FLAG_PII), +#undef AUE_DEV }; /* prototypes */ @@ -692,7 +694,7 @@ aue_attach(device_t dev) sc->sc_xfer, aue_config, AUE_N_TRANSFER, sc, &sc->sc_mtx); if (error) { - device_printf(dev, "allocating USB transfers failed!\n"); + device_printf(dev, "allocating USB transfers failed\n"); goto detach; } diff --git a/sys/dev/usb/net/if_axe.c b/sys/dev/usb/net/if_axe.c index ae9d5127ff79..9772f401b680 100644 --- a/sys/dev/usb/net/if_axe.c +++ b/sys/dev/usb/net/if_axe.c @@ -135,31 +135,34 @@ SYSCTL_INT(_hw_usb_axe, OID_AUTO, debug, CTLFLAG_RW, &axe_debug, 0, * Various supported device vendors/products. */ static const struct usb_device_id axe_devs[] = { - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_UF200, 0)}, - {USB_VPI(USB_VENDOR_ACERCM, USB_PRODUCT_ACERCM_EP1427X2, 0)}, - {USB_VPI(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_ETHERNET, AXE_FLAG_772)}, - {USB_VPI(USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88172, 0)}, - {USB_VPI(USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88178, AXE_FLAG_178)}, - {USB_VPI(USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88772, AXE_FLAG_772)}, - {USB_VPI(USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC210T, 0)}, - {USB_VPI(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D5055, AXE_FLAG_178)}, - {USB_VPI(USB_VENDOR_BILLIONTON, USB_PRODUCT_BILLIONTON_USB2AR, 0)}, - {USB_VPI(USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_USB200MV2, AXE_FLAG_772)}, - {USB_VPI(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_FETHER_USB2_TX, 0)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DUBE100, 0)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DUBE100B1, AXE_FLAG_772)}, - {USB_VPI(USB_VENDOR_GOODWAY, USB_PRODUCT_GOODWAY_GWUSB2E, 0)}, - {USB_VPI(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_ETGUS2, AXE_FLAG_178)}, - {USB_VPI(USB_VENDOR_JVC, USB_PRODUCT_JVC_MP_PRX1, 0)}, - {USB_VPI(USB_VENDOR_LINKSYS2, USB_PRODUCT_LINKSYS2_USB200M, 0)}, - {USB_VPI(USB_VENDOR_LINKSYS4, USB_PRODUCT_LINKSYS4_USB1000, AXE_FLAG_178)}, - {USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_LUAU2KTX, 0)}, - {USB_VPI(USB_VENDOR_NETGEAR, USB_PRODUCT_NETGEAR_FA120, 0)}, - {USB_VPI(USB_VENDOR_OQO, USB_PRODUCT_OQO_ETHER01PLUS, AXE_FLAG_772)}, - {USB_VPI(USB_VENDOR_PLANEX3, USB_PRODUCT_PLANEX3_GU1000T, AXE_FLAG_178)}, - {USB_VPI(USB_VENDOR_SITECOM, USB_PRODUCT_SITECOM_LN029, 0)}, - {USB_VPI(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_LN028, AXE_FLAG_178)}, - {USB_VPI(USB_VENDOR_SYSTEMTALKS, USB_PRODUCT_SYSTEMTALKS_SGCX2UL, 0)}, +#define AXE_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) } + AXE_DEV(ABOCOM, UF200, 0), + AXE_DEV(ACERCM, EP1427X2, 0), + AXE_DEV(APPLE, ETHERNET, AXE_FLAG_772), + AXE_DEV(ASIX, AX88172, 0), + AXE_DEV(ASIX, AX88178, AXE_FLAG_178), + AXE_DEV(ASIX, AX88772, AXE_FLAG_772), + AXE_DEV(ASIX, AX88772A, AXE_FLAG_772), + AXE_DEV(ATEN, UC210T, 0), + AXE_DEV(BELKIN, F5D5055, AXE_FLAG_178), + AXE_DEV(BILLIONTON, USB2AR, 0), + AXE_DEV(CISCOLINKSYS, USB200MV2, AXE_FLAG_772), + AXE_DEV(COREGA, FETHER_USB2_TX, 0), + AXE_DEV(DLINK, DUBE100, 0), + AXE_DEV(DLINK, DUBE100B1, AXE_FLAG_772), + AXE_DEV(GOODWAY, GWUSB2E, 0), + AXE_DEV(IODATA, ETGUS2, AXE_FLAG_178), + AXE_DEV(JVC, MP_PRX1, 0), + AXE_DEV(LINKSYS2, USB200M, 0), + AXE_DEV(LINKSYS4, USB1000, AXE_FLAG_178), + AXE_DEV(MELCO, LUAU2KTX, 0), + AXE_DEV(NETGEAR, FA120, 0), + AXE_DEV(OQO, ETHER01PLUS, AXE_FLAG_772), + AXE_DEV(PLANEX3, GU1000T, AXE_FLAG_178), + AXE_DEV(SITECOM, LN029, 0), + AXE_DEV(SITECOMEU, LN028, AXE_FLAG_178), + AXE_DEV(SYSTEMTALKS, SGCX2UL, 0), +#undef AXE_DEV }; static device_probe_t axe_probe; @@ -205,10 +208,7 @@ static const struct usb_config axe_config[AXE_N_TRANSFER] = { .type = UE_BULK, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, -#if (MCLBYTES < 2048) -#error "(MCLBYTES < 2048)" -#endif - .bufsize = MCLBYTES, + .bufsize = 16384, /* bytes */ .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, .callback = axe_bulk_read_callback, .timeout = 0, /* no timeout */ @@ -709,7 +709,7 @@ axe_attach(device_t dev) error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, axe_config, AXE_N_TRANSFER, sc, &sc->sc_mtx); if (error) { - device_printf(dev, "allocating USB transfers failed!\n"); + device_printf(dev, "allocating USB transfers failed\n"); goto detach; } @@ -777,7 +777,7 @@ axe_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error) struct ifnet *ifp = uether_getifp(ue); struct axe_sframe_hdr hdr; struct usb_page_cache *pc; - int err, pos, len, adjust; + int err, pos, len; int actlen; usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); @@ -785,50 +785,42 @@ axe_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error) switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: pos = 0; + len = 0; + err = 0; + pc = usbd_xfer_get_frame(xfer, 0); - while (1) { - if (sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) { - if (actlen < sizeof(hdr)) { + if (sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) { + while (pos < actlen) { + if ((pos + sizeof(hdr)) > actlen) { /* too little data */ + err = EINVAL; break; } usbd_copy_out(pc, pos, &hdr, sizeof(hdr)); if ((hdr.len ^ hdr.ilen) != 0xFFFF) { /* we lost sync */ + err = EINVAL; break; } - actlen -= sizeof(hdr); pos += sizeof(hdr); len = le16toh(hdr.len); - if (len > actlen) { + if ((pos + len) > actlen) { /* invalid length */ + err = EINVAL; break; } - adjust = (len & 1); + err = uether_rxbuf(ue, pc, pos, len); - } else { - len = actlen; - adjust = 0; + pos += len + (len % 2); } - err = uether_rxbuf(ue, pc, pos, len); - if (err) - break; - - pos += len; - actlen -= len; - - if (actlen <= adjust) { - /* we are finished */ - goto tr_setup; - } - pos += adjust; - actlen -= adjust; + } else { + err = uether_rxbuf(ue, pc, 0, actlen); } - /* count an error */ - ifp->if_ierrors++; + if (err != 0) + ifp->if_ierrors++; /* FALLTHROUGH */ case USB_ST_SETUP: @@ -993,10 +985,11 @@ axe_init(struct usb_ether *ue) /* Cancel pending I/O */ axe_stop(ue); -#ifdef notdef - /* Set MAC address */ - axe_mac(sc, IF_LLADDR(ifp), 1); -#endif + /* Set MAC address. */ + if (sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) + axe_cmd(sc, AXE_178_CMD_WRITE_NODEID, 0, 0, IF_LLADDR(ifp)); + else + axe_cmd(sc, AXE_172_CMD_WRITE_NODEID, 0, 0, IF_LLADDR(ifp)); /* Set transmitter IPG values */ if (sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) { @@ -1011,7 +1004,15 @@ axe_init(struct usb_ether *ue) /* Enable receiver, set RX mode */ rxmode = (AXE_RXCMD_MULTICAST | AXE_RXCMD_ENABLE); if (sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) { +#if 0 rxmode |= AXE_178_RXCMD_MFB_2048; /* chip default */ +#else + /* + * Default Rx buffer size is too small to get + * maximum performance. + */ + rxmode |= AXE_178_RXCMD_MFB_16384; +#endif } else { rxmode |= AXE_172_RXCMD_UNICAST; } diff --git a/sys/dev/usb/net/if_cdce.c b/sys/dev/usb/net/if_cdce.c index 52ea20693110..2fcb0ff0b5bc 100644 --- a/sys/dev/usb/net/if_cdce.c +++ b/sys/dev/usb/net/if_cdce.c @@ -40,6 +40,11 @@ * http://www.usb.org/developers/devclass_docs/usbcdc11.pdf */ +/* + * USB Network Control Model (NCM) + * http://www.usb.org/developers/devclass_docs/NCM10.zip + */ + #include __FBSDID("$FreeBSD$"); @@ -89,6 +94,11 @@ static usb_callback_t cdce_bulk_read_callback; static usb_callback_t cdce_intr_read_callback; static usb_callback_t cdce_intr_write_callback; +#if CDCE_HAVE_NCM +static usb_callback_t cdce_ncm_bulk_write_callback; +static usb_callback_t cdce_ncm_bulk_read_callback; +#endif + static uether_fn_t cdce_attach_post; static uether_fn_t cdce_init; static uether_fn_t cdce_stop; @@ -159,6 +169,61 @@ static const struct usb_config cdce_config[CDCE_N_TRANSFER] = { }, }; +#if CDCE_HAVE_NCM +static const struct usb_config cdce_ncm_config[CDCE_N_TRANSFER] = { + + [CDCE_BULK_RX] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_RX, + .if_index = 0, + .frames = CDCE_NCM_RX_FRAMES_MAX, + .bufsize = (CDCE_NCM_RX_FRAMES_MAX * CDCE_NCM_RX_MAXLEN), + .flags = {.pipe_bof = 1,.short_frames_ok = 1,.short_xfer_ok = 1,}, + .callback = cdce_ncm_bulk_read_callback, + .timeout = 0, /* no timeout */ + .usb_mode = USB_MODE_DUAL, /* both modes */ + }, + + [CDCE_BULK_TX] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_TX, + .if_index = 0, + .frames = CDCE_NCM_TX_FRAMES_MAX, + .bufsize = (CDCE_NCM_TX_FRAMES_MAX * CDCE_NCM_TX_MAXLEN), + .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, + .callback = cdce_ncm_bulk_write_callback, + .timeout = 10000, /* 10 seconds */ + .usb_mode = USB_MODE_DUAL, /* both modes */ + }, + + [CDCE_INTR_RX] = { + .type = UE_INTERRUPT, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_RX, + .if_index = 1, + .bufsize = CDCE_IND_SIZE_MAX, + .flags = {.pipe_bof = 1,.short_xfer_ok = 1,.no_pipe_ok = 1,}, + .callback = cdce_intr_read_callback, + .timeout = 0, + .usb_mode = USB_MODE_HOST, + }, + + [CDCE_INTR_TX] = { + .type = UE_INTERRUPT, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_TX, + .if_index = 1, + .bufsize = CDCE_IND_SIZE_MAX, + .flags = {.pipe_bof = 1,.force_short_xfer = 1,.no_pipe_ok = 1,}, + .callback = cdce_intr_write_callback, + .timeout = 10000, /* 10 seconds */ + .usb_mode = USB_MODE_DEVICE, + }, +}; +#endif + static device_method_t cdce_methods[] = { /* USB interface */ DEVMETHOD(usb_handle_request, cdce_handle_request), @@ -213,8 +278,151 @@ static const struct usb_device_id cdce_devs[] = { {USB_IF_CSI(UICLASS_CDC, UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL, 0)}, {USB_IF_CSI(UICLASS_CDC, UISUBCLASS_MOBILE_DIRECT_LINE_MODEL, 0)}, + {USB_IF_CSI(UICLASS_CDC, UISUBCLASS_NETWORK_CONTROL_MODEL, 0)}, }; +#if CDCE_HAVE_NCM +/*------------------------------------------------------------------------* + * cdce_ncm_init + * + * Return values: + * 0: Success + * Else: Failure + *------------------------------------------------------------------------*/ +static uint8_t +cdce_ncm_init(struct cdce_softc *sc) +{ + struct usb_ncm_parameters temp; + struct usb_device_request req; + uDWord value; + int err; + + req.bmRequestType = UT_READ_CLASS_INTERFACE; + req.bRequest = UCDC_NCM_GET_NTB_PARAMETERS; + USETW(req.wValue, 0); + req.wIndex[0] = sc->sc_ifaces_index[1]; + req.wIndex[1] = 0; + USETW(req.wLength, sizeof(temp)); + + err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req, + &temp, 0, NULL, 1000 /* ms */); + if (err) + return (1); + + /* Read correct set of parameters according to device mode */ + + if (usbd_get_mode(sc->sc_ue.ue_udev) == USB_MODE_HOST) { + sc->sc_ncm.rx_max = UGETW(temp.dwNtbInMaxSize); + sc->sc_ncm.tx_max = UGETW(temp.dwNtbOutMaxSize); + sc->sc_ncm.tx_remainder = UGETW(temp.wNdpOutPayloadRemainder); + sc->sc_ncm.tx_modulus = UGETW(temp.wNdpOutDivisor); + sc->sc_ncm.tx_struct_align = UGETW(temp.wNdpOutAlignment); + } else { + sc->sc_ncm.rx_max = UGETW(temp.dwNtbOutMaxSize); + sc->sc_ncm.tx_max = UGETW(temp.dwNtbInMaxSize); + sc->sc_ncm.tx_remainder = UGETW(temp.wNdpInPayloadRemainder); + sc->sc_ncm.tx_modulus = UGETW(temp.wNdpInDivisor); + sc->sc_ncm.tx_struct_align = UGETW(temp.wNdpInAlignment); + } + + /* Verify maximum receive length */ + + if (err || (sc->sc_ncm.rx_max < 32) || + (sc->sc_ncm.rx_max > CDCE_NCM_RX_MAXLEN)) { + DPRINTFN(1, "Using default maximum receive length\n"); + sc->sc_ncm.rx_max = CDCE_NCM_RX_MAXLEN; + } + + /* Verify maximum transmit length */ + + if (err || (sc->sc_ncm.tx_max < 32) || + (sc->sc_ncm.tx_max > CDCE_NCM_TX_MAXLEN)) { + DPRINTFN(1, "Using default maximum transmit length\n"); + sc->sc_ncm.tx_max = CDCE_NCM_TX_MAXLEN; + } + + /* + * Verify that the structure alignment is: + * - power of two + * - not greater than the maximum transmit length + * - not less than four bytes + */ + if (err || (sc->sc_ncm.tx_struct_align < 4) || + (sc->sc_ncm.tx_struct_align != + ((-sc->sc_ncm.tx_struct_align) & sc->sc_ncm.tx_struct_align)) || + (sc->sc_ncm.tx_struct_align >= sc->sc_ncm.tx_max)) { + DPRINTFN(1, "Using default other alignment: 4 bytes\n"); + sc->sc_ncm.tx_struct_align = 4; + } + + /* + * Verify that the payload alignment is: + * - power of two + * - not greater than the maximum transmit length + * - not less than four bytes + */ + if (err || (sc->sc_ncm.tx_modulus < 4) || + (sc->sc_ncm.tx_modulus != + ((-sc->sc_ncm.tx_modulus) & sc->sc_ncm.tx_modulus)) || + (sc->sc_ncm.tx_modulus >= sc->sc_ncm.tx_max)) { + DPRINTFN(1, "Using default transmit modulus: 4 bytes\n"); + sc->sc_ncm.tx_modulus = 4; + } + + /* Verify that the payload remainder */ + + if (err || (sc->sc_ncm.tx_remainder >= sc->sc_ncm.tx_modulus)) { + DPRINTFN(1, "Using default transmit remainder: 0 bytes\n"); + sc->sc_ncm.tx_remainder = 0; + } + + /* Additional configuration, will fail in device side mode, which is OK. */ + + req.bmRequestType = UT_WRITE_CLASS_INTERFACE; + req.bRequest = UCDC_NCM_SET_NTB_INPUT_SIZE; + USETW(req.wValue, 0); + req.wIndex[0] = sc->sc_ifaces_index[1]; + req.wIndex[1] = 0; + USETW(req.wLength, 4); + USETDW(value, sc->sc_ncm.rx_max); + + err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req, + &value, 0, NULL, 1000 /* ms */); + if (err) { + DPRINTFN(1, "Setting input size " + "to %u failed.\n", sc->sc_ncm.rx_max); + } + + req.bmRequestType = UT_WRITE_CLASS_INTERFACE; + req.bRequest = UCDC_NCM_SET_CRC_MODE; + USETW(req.wValue, 0); /* no CRC */ + req.wIndex[0] = sc->sc_ifaces_index[1]; + req.wIndex[1] = 0; + USETW(req.wLength, 0); + + err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req, + NULL, 0, NULL, 1000 /* ms */); + if (err) { + DPRINTFN(1, "Setting CRC mode to off failed.\n"); + } + + req.bmRequestType = UT_WRITE_CLASS_INTERFACE; + req.bRequest = UCDC_NCM_SET_NTB_FORMAT; + USETW(req.wValue, 0); /* NTB-16 */ + req.wIndex[0] = sc->sc_ifaces_index[1]; + req.wIndex[1] = 0; + USETW(req.wLength, 0); + + err = usbd_do_request_flags(sc->sc_ue.ue_udev, NULL, &req, + NULL, 0, NULL, 1000 /* ms */); + if (err) { + DPRINTFN(1, "Setting NTB format to 16-bit failed.\n"); + } + + return (0); /* success */ +} +#endif + static int cdce_probe(device_t dev) { @@ -240,31 +448,31 @@ cdce_attach(device_t dev) const struct usb_cdc_union_descriptor *ud; const struct usb_interface_descriptor *id; const struct usb_cdc_ethernet_descriptor *ued; + const struct usb_config *pcfg; int error; uint8_t i; + uint8_t data_iface_no; char eaddr_str[5 * ETHER_ADDR_LEN]; /* approx */ sc->sc_flags = USB_GET_DRIVER_INFO(uaa); + sc->sc_ue.ue_udev = uaa->device; device_set_usb_desc(dev); mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF); - if (sc->sc_flags & CDCE_FLAG_NO_UNION) { - sc->sc_ifaces_index[0] = uaa->info.bIfaceIndex; - sc->sc_ifaces_index[1] = uaa->info.bIfaceIndex; - sc->sc_data_iface_no = 0; /* not used */ - goto alloc_transfers; - } ud = usbd_find_descriptor (uaa->device, NULL, uaa->info.bIfaceIndex, UDESC_CS_INTERFACE, 0 - 1, UDESCSUB_CDC_UNION, 0 - 1); - if ((ud == NULL) || (ud->bLength < sizeof(*ud))) { - device_printf(dev, "no union descriptor!\n"); - goto detach; + if ((ud == NULL) || (ud->bLength < sizeof(*ud)) || + (sc->sc_flags & CDCE_FLAG_NO_UNION)) { + DPRINTFN(1, "No union descriptor!\n"); + sc->sc_ifaces_index[0] = uaa->info.bIfaceIndex; + sc->sc_ifaces_index[1] = uaa->info.bIfaceIndex; + goto alloc_transfers; } - sc->sc_data_iface_no = ud->bSlaveInterface[0]; + data_iface_no = ud->bSlaveInterface[0]; for (i = 0;; i++) { @@ -274,15 +482,14 @@ cdce_attach(device_t dev) id = usbd_get_interface_descriptor(iface); - if (id && (id->bInterfaceNumber == - sc->sc_data_iface_no)) { + if (id && (id->bInterfaceNumber == data_iface_no)) { sc->sc_ifaces_index[0] = i; sc->sc_ifaces_index[1] = uaa->info.bIfaceIndex; usbd_set_parent_iface(uaa->device, i, uaa->info.bIfaceIndex); break; } } else { - device_printf(dev, "no data interface found!\n"); + device_printf(dev, "no data interface found\n"); goto detach; } } @@ -312,24 +519,30 @@ cdce_attach(device_t dev) alloc_transfers: + pcfg = cdce_config; /* Default Configuration */ + for (i = 0; i != 32; i++) { - error = usbd_set_alt_interface_index - (uaa->device, sc->sc_ifaces_index[0], i); - - if (error) { - device_printf(dev, "no valid alternate " - "setting found!\n"); - goto detach; - } - error = usbd_transfer_setup - (uaa->device, sc->sc_ifaces_index, - sc->sc_xfer, cdce_config, CDCE_N_TRANSFER, - sc, &sc->sc_mtx); - - if (error == 0) { + error = usbd_set_alt_interface_index(uaa->device, + sc->sc_ifaces_index[0], i); + if (error) break; - } +#if CDCE_HAVE_NCM + if ((i == 0) && (cdce_ncm_init(sc) == 0)) + pcfg = cdce_ncm_config; +#endif + error = usbd_transfer_setup(uaa->device, + sc->sc_ifaces_index, sc->sc_xfer, + pcfg, CDCE_N_TRANSFER, sc, &sc->sc_mtx); + + if (error == 0) + break; + } + + if (error || (i == 32)) { + device_printf(dev, "No valid alternate " + "setting found\n"); + goto detach; } ued = usbd_find_descriptor @@ -768,3 +981,338 @@ cdce_handle_request(device_t dev, { return (ENXIO); /* use builtin handler */ } + +#if CDCE_HAVE_NCM +static uint8_t +cdce_ncm_fill_tx_frames(struct usb_xfer *xfer, uint8_t index) +{ + struct cdce_softc *sc = usbd_xfer_softc(xfer); + struct ifnet *ifp = uether_getifp(&sc->sc_ue); + struct usb_page_cache *pc = usbd_xfer_get_frame(xfer, index); + struct mbuf *m; + uint32_t rem; + uint32_t offset; + uint32_t last_offset; + uint32_t n; + + usbd_xfer_set_frame_offset(xfer, index * CDCE_NCM_TX_MAXLEN, index); + + offset = sizeof(sc->sc_ncm.hdr) + + sizeof(sc->sc_ncm.dpt) + sizeof(sc->sc_ncm.dp); + + /* Store last valid offset before alignment */ + last_offset = offset; + + /* Align offset correctly */ + offset = sc->sc_ncm.tx_remainder - + ((0UL - offset) & (0UL - sc->sc_ncm.tx_modulus)); + + for (n = 0; n != CDCE_NCM_SUBFRAMES_MAX; n++) { + + /* check if end of transmit buffer is reached */ + + if (offset >= sc->sc_ncm.tx_max) + break; + + /* compute maximum buffer size */ + + rem = sc->sc_ncm.tx_max - offset; + + IFQ_DRV_DEQUEUE(&(ifp->if_snd), m); + + if (m == NULL) + break; + + if (m->m_pkthdr.len > rem) { + if (n == 0) { + /* The frame won't fit in our buffer */ + DPRINTFN(1, "Frame too big to be transmitted!\n"); + m_freem(m); + ifp->if_oerrors++; + n--; + continue; + } + /* Wait till next buffer becomes ready */ + IFQ_DRV_PREPEND(&(ifp->if_snd), m); + break; + } + usbd_m_copy_in(pc, offset, m, 0, m->m_pkthdr.len); + + USETW(sc->sc_ncm.dp[n].wFrameLength, m->m_pkthdr.len); + USETW(sc->sc_ncm.dp[n].wFrameIndex, offset); + + /* Update offset */ + offset += m->m_pkthdr.len; + + /* Store last valid offset before alignment */ + last_offset = offset; + + /* Align offset correctly */ + offset = sc->sc_ncm.tx_remainder - + ((0UL - offset) & (0UL - sc->sc_ncm.tx_modulus)); + + /* + * If there's a BPF listener, bounce a copy + * of this frame to him: + */ + BPF_MTAP(ifp, m); + + /* Free mbuf */ + + m_freem(m); + + /* Pre-increment interface counter */ + + ifp->if_opackets++; + } + + if (n == 0) + return (1); + + rem = (sizeof(sc->sc_ncm.dpt) + (4 * n) + 4); + + USETW(sc->sc_ncm.dpt.wLength, rem); + + /* zero the rest of the data pointer entries */ + for (; n != CDCE_NCM_SUBFRAMES_MAX; n++) { + USETW(sc->sc_ncm.dp[n].wFrameLength, 0); + USETW(sc->sc_ncm.dp[n].wFrameIndex, 0); + } + + /* set frame length */ + usbd_xfer_set_frame_len(xfer, index, last_offset); + + /* Fill out 16-bit header */ + sc->sc_ncm.hdr.dwSignature[0] = 'N'; + sc->sc_ncm.hdr.dwSignature[1] = 'C'; + sc->sc_ncm.hdr.dwSignature[2] = 'M'; + sc->sc_ncm.hdr.dwSignature[3] = 'H'; + USETW(sc->sc_ncm.hdr.wHeaderLength, sizeof(sc->sc_ncm.hdr)); + USETW(sc->sc_ncm.hdr.wBlockLength, last_offset); + USETW(sc->sc_ncm.hdr.wSequence, sc->sc_ncm.tx_seq); + USETW(sc->sc_ncm.hdr.wDptIndex, sizeof(sc->sc_ncm.hdr)); + + sc->sc_ncm.tx_seq++; + + /* Fill out 16-bit frame table header */ + sc->sc_ncm.dpt.dwSignature[0] = 'N'; + sc->sc_ncm.dpt.dwSignature[1] = 'C'; + sc->sc_ncm.dpt.dwSignature[2] = 'M'; + sc->sc_ncm.dpt.dwSignature[3] = '0'; + USETW(sc->sc_ncm.dpt.wNextNdpIndex, 0); /* reserved */ + + usbd_copy_in(pc, 0, &(sc->sc_ncm.hdr), sizeof(sc->sc_ncm.hdr)); + usbd_copy_in(pc, sizeof(sc->sc_ncm.hdr), &(sc->sc_ncm.dpt), + sizeof(sc->sc_ncm.dpt)); + usbd_copy_in(pc, sizeof(sc->sc_ncm.hdr) + sizeof(sc->sc_ncm.dpt), + &(sc->sc_ncm.dp), sizeof(sc->sc_ncm.dp)); + return (0); +} + +static void +cdce_ncm_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct cdce_softc *sc = usbd_xfer_softc(xfer); + struct ifnet *ifp = uether_getifp(&sc->sc_ue); + uint16_t x; + int actlen; + int aframes; + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + + usbd_xfer_status(xfer, &actlen, NULL, &aframes, NULL); + + DPRINTFN(10, "transfer complete: " + "%u bytes in %u frames\n", actlen, aframes); + + case USB_ST_SETUP: + for (x = 0; x != CDCE_NCM_TX_FRAMES_MAX; x++) { + if (cdce_ncm_fill_tx_frames(xfer, x)) + break; + } + + if (x != 0) { + usbd_xfer_set_frames(xfer, x); + usbd_transfer_submit(xfer); + } + break; + + default: /* Error */ + DPRINTFN(10, "Transfer error: %s\n", + usbd_errstr(error)); + + /* update error counter */ + ifp->if_oerrors += 1; + + if (error != USB_ERR_CANCELLED) { + /* try to clear stall first */ + usbd_xfer_set_stall(xfer); + usbd_xfer_set_frames(xfer, 0); + usbd_transfer_submit(xfer); + } + break; + } +} + +static void +cdce_ncm_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct cdce_softc *sc = usbd_xfer_softc(xfer); + struct usb_page_cache *pc = usbd_xfer_get_frame(xfer, 0); + struct ifnet *ifp = uether_getifp(&sc->sc_ue); + struct mbuf *m; + int sumdata; + int sumlen; + int actlen; + int aframes; + int temp; + int nframes; + int x; + int offset; + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + + usbd_xfer_status(xfer, &actlen, &sumlen, &aframes, NULL); + + DPRINTFN(1, "received %u bytes in %u frames\n", + actlen, aframes); + + if (actlen < (sizeof(sc->sc_ncm.hdr) + + sizeof(sc->sc_ncm.dpt))) { + DPRINTFN(1, "frame too short\n"); + goto tr_setup; + } + usbd_copy_out(pc, 0, &(sc->sc_ncm.hdr), + sizeof(sc->sc_ncm.hdr)); + + if ((sc->sc_ncm.hdr.dwSignature[0] != 'N') || + (sc->sc_ncm.hdr.dwSignature[1] != 'C') || + (sc->sc_ncm.hdr.dwSignature[2] != 'M') || + (sc->sc_ncm.hdr.dwSignature[3] != 'H')) { + DPRINTFN(1, "invalid HDR signature: " + "0x%02x:0x%02x:0x%02x:0x%02x\n", + sc->sc_ncm.hdr.dwSignature[0], + sc->sc_ncm.hdr.dwSignature[1], + sc->sc_ncm.hdr.dwSignature[2], + sc->sc_ncm.hdr.dwSignature[3]); + goto tr_stall; + } + temp = UGETW(sc->sc_ncm.hdr.wBlockLength); + if (temp > sumlen) { + DPRINTFN(1, "unsupported block length %u/%u\n", + temp, sumlen); + goto tr_stall; + } + temp = UGETW(sc->sc_ncm.hdr.wDptIndex); + if ((temp + sizeof(sc->sc_ncm.dpt)) > actlen) { + DPRINTFN(1, "invalid DPT index: 0x%04x\n", temp); + goto tr_stall; + } + usbd_copy_out(pc, temp, &(sc->sc_ncm.dpt), + sizeof(sc->sc_ncm.dpt)); + + if ((sc->sc_ncm.dpt.dwSignature[0] != 'N') || + (sc->sc_ncm.dpt.dwSignature[1] != 'C') || + (sc->sc_ncm.dpt.dwSignature[2] != 'M') || + (sc->sc_ncm.dpt.dwSignature[3] != '0')) { + DPRINTFN(1, "invalid DPT signature" + "0x%02x:0x%02x:0x%02x:0x%02x\n", + sc->sc_ncm.dpt.dwSignature[0], + sc->sc_ncm.dpt.dwSignature[1], + sc->sc_ncm.dpt.dwSignature[2], + sc->sc_ncm.dpt.dwSignature[3]); + goto tr_stall; + } + nframes = UGETW(sc->sc_ncm.dpt.wLength) / 4; + + /* Subtract size of header and last zero padded entry */ + if (nframes >= (2 + 1)) + nframes -= (2 + 1); + else + nframes = 0; + + DPRINTFN(1, "nframes = %u\n", nframes); + + temp += sizeof(sc->sc_ncm.dpt); + + if ((temp + (4 * nframes)) > actlen) + goto tr_stall; + + if (nframes > CDCE_NCM_SUBFRAMES_MAX) { + DPRINTFN(1, "Truncating number of frames from %u to %u\n", + nframes, CDCE_NCM_SUBFRAMES_MAX); + nframes = CDCE_NCM_SUBFRAMES_MAX; + } + usbd_copy_out(pc, temp, &(sc->sc_ncm.dp), (4 * nframes)); + + sumdata = 0; + + for (x = 0; x != nframes; x++) { + + offset = UGETW(sc->sc_ncm.dp[x].wFrameIndex); + temp = UGETW(sc->sc_ncm.dp[x].wFrameLength); + + if ((offset == 0) || + (temp < sizeof(struct ether_header)) || + (temp > (MCLBYTES - ETHER_ALIGN))) { + DPRINTFN(1, "NULL frame detected at %d\n", x); + m = NULL; + /* silently ignore this frame */ + continue; + } else if ((offset + temp) > actlen) { + DPRINTFN(1, "invalid frame " + "detected at %d\n", x); + m = NULL; + /* silently ignore this frame */ + continue; + } else if (temp > (MHLEN - ETHER_ALIGN)) { + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + } else { + m = m_gethdr(M_DONTWAIT, MT_DATA); + } + + DPRINTFN(16, "frame %u, offset = %u, length = %u \n", + x, offset, temp); + + /* check if we have a buffer */ + if (m) { + m_adj(m, ETHER_ALIGN); + + usbd_copy_out(pc, offset, m->m_data, temp); + + /* enqueue */ + uether_rxmbuf(&sc->sc_ue, m, temp); + + sumdata += temp; + } else { + ifp->if_ierrors++; + } + } + + DPRINTFN(1, "Efficiency: %u/%u bytes\n", sumdata, actlen); + + case USB_ST_SETUP: +tr_setup: + usbd_xfer_set_frame_len(xfer, 0, sc->sc_ncm.rx_max); + usbd_xfer_set_frames(xfer, 1); + usbd_transfer_submit(xfer); + uether_rxflush(&sc->sc_ue); /* must be last */ + break; + + default: /* Error */ + DPRINTFN(1, "error = %s\n", + usbd_errstr(error)); + + if (error != USB_ERR_CANCELLED) { +tr_stall: + /* try to clear stall first */ + usbd_xfer_set_stall(xfer); + usbd_xfer_set_frames(xfer, 0); + usbd_transfer_submit(xfer); + } + break; + } +} +#endif diff --git a/sys/dev/usb/net/if_cdcereg.h b/sys/dev/usb/net/if_cdcereg.h index 367e1677a3ee..55931698b636 100644 --- a/sys/dev/usb/net/if_cdcereg.h +++ b/sys/dev/usb/net/if_cdcereg.h @@ -38,6 +38,18 @@ #define CDCE_FRAMES_MAX 8 /* units */ #define CDCE_IND_SIZE_MAX 32 /* bytes */ +#define CDCE_NCM_TX_MAXLEN 2048UL /* bytes */ +#define CDCE_NCM_TX_FRAMES_MAX 8 /* units */ + +#define CDCE_NCM_RX_MAXLEN (1UL << 14) /* bytes */ +#define CDCE_NCM_RX_FRAMES_MAX 1 /* units */ + +#define CDCE_NCM_SUBFRAMES_MAX 32 /* units */ + +#ifndef CDCE_HAVE_NCM +#define CDCE_HAVE_NCM 1 +#endif + enum { CDCE_BULK_RX, CDCE_BULK_TX, @@ -46,9 +58,24 @@ enum { CDCE_N_TRANSFER, }; +struct cdce_ncm { + struct usb_ncm16_hdr hdr; + struct usb_ncm16_dpt dpt; + struct usb_ncm16_dp dp[CDCE_NCM_SUBFRAMES_MAX]; + uint32_t rx_max; + uint32_t tx_max; + uint16_t tx_remainder; + uint16_t tx_modulus; + uint16_t tx_struct_align; + uint16_t tx_seq; +}; + struct cdce_softc { struct usb_ether sc_ue; struct mtx sc_mtx; +#if CDCE_HAVE_NCM + struct cdce_ncm sc_ncm; +#endif struct usb_xfer *sc_xfer[CDCE_N_TRANSFER]; struct mbuf *sc_rx_buf[CDCE_FRAMES_MAX]; struct mbuf *sc_tx_buf[CDCE_FRAMES_MAX]; @@ -59,7 +86,6 @@ struct cdce_softc { #define CDCE_FLAG_RX_DATA 0x0010 uint8_t sc_eaddr_str_index; - uint8_t sc_data_iface_no; uint8_t sc_ifaces_index[2]; }; diff --git a/sys/dev/usb/net/if_cue.c b/sys/dev/usb/net/if_cue.c index dcbef616dfc6..05ff1a54a88c 100644 --- a/sys/dev/usb/net/if_cue.c +++ b/sys/dev/usb/net/if_cue.c @@ -90,9 +90,11 @@ __FBSDID("$FreeBSD$"); /* Belkin F5U111 adapter covered by NETMATE entry */ static const struct usb_device_id cue_devs[] = { - {USB_VPI(USB_VENDOR_CATC, USB_PRODUCT_CATC_NETMATE, 0)}, - {USB_VPI(USB_VENDOR_CATC, USB_PRODUCT_CATC_NETMATE2, 0)}, - {USB_VPI(USB_VENDOR_SMARTBRIDGES, USB_PRODUCT_SMARTBRIDGES_SMARTLINK, 0)}, +#define CUE_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) } + CUE_DEV(CATC, NETMATE), + CUE_DEV(CATC, NETMATE2), + CUE_DEV(SMARTBRIDGES, SMARTLINK), +#undef CUE_DEV }; /* prototypes */ @@ -404,7 +406,7 @@ cue_attach(device_t dev) error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, cue_config, CUE_N_TRANSFER, sc, &sc->sc_mtx); if (error) { - device_printf(dev, "allocating USB transfers failed!\n"); + device_printf(dev, "allocating USB transfers failed\n"); goto detach; } diff --git a/sys/dev/usb/net/if_kue.c b/sys/dev/usb/net/if_kue.c index 281d54f919a5..5d35da40bd58 100644 --- a/sys/dev/usb/net/if_kue.c +++ b/sys/dev/usb/net/if_kue.c @@ -102,40 +102,41 @@ __FBSDID("$FreeBSD$"); * Various supported device vendors/products. */ static const struct usb_device_id kue_devs[] = { - {USB_VPI(USB_VENDOR_3COM, USB_PRODUCT_3COM_3C19250, 0)}, - {USB_VPI(USB_VENDOR_3COM, USB_PRODUCT_3COM_3C460, 0)}, - {USB_VPI(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_URE450, 0)}, - {USB_VPI(USB_VENDOR_ADS, USB_PRODUCT_ADS_UBS10BT, 0)}, - {USB_VPI(USB_VENDOR_ADS, USB_PRODUCT_ADS_UBS10BTX, 0)}, - {USB_VPI(USB_VENDOR_AOX, USB_PRODUCT_AOX_USB101, 0)}, - {USB_VPI(USB_VENDOR_ASANTE, USB_PRODUCT_ASANTE_EA, 0)}, - {USB_VPI(USB_VENDOR_ATEN, USB_PRODUCT_ATEN_DSB650C, 0)}, - {USB_VPI(USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC10T, 0)}, - {USB_VPI(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_ETHER_USB_T, 0)}, - {USB_VPI(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650C, 0)}, - {USB_VPI(USB_VENDOR_ENTREGA, USB_PRODUCT_ENTREGA_E45, 0)}, - {USB_VPI(USB_VENDOR_ENTREGA, USB_PRODUCT_ENTREGA_XX1, 0)}, - {USB_VPI(USB_VENDOR_ENTREGA, USB_PRODUCT_ENTREGA_XX2, 0)}, - {USB_VPI(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_USBETT, 0)}, - {USB_VPI(USB_VENDOR_JATON, USB_PRODUCT_JATON_EDA, 0)}, - {USB_VPI(USB_VENDOR_KINGSTON, USB_PRODUCT_KINGSTON_XX1, 0)}, - {USB_VPI(USB_VENDOR_KLSI, USB_PRODUCT_AOX_USB101, 0)}, - {USB_VPI(USB_VENDOR_KLSI, USB_PRODUCT_KLSI_DUH3E10BT, 0)}, - {USB_VPI(USB_VENDOR_KLSI, USB_PRODUCT_KLSI_DUH3E10BTN, 0)}, - {USB_VPI(USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB10T, 0)}, - {USB_VPI(USB_VENDOR_MOBILITY, USB_PRODUCT_MOBILITY_EA, 0)}, - {USB_VPI(USB_VENDOR_NETGEAR, USB_PRODUCT_NETGEAR_EA101, 0)}, - {USB_VPI(USB_VENDOR_NETGEAR, USB_PRODUCT_NETGEAR_EA101X, 0)}, - {USB_VPI(USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET, 0)}, - {USB_VPI(USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET2, 0)}, - {USB_VPI(USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET3, 0)}, - {USB_VPI(USB_VENDOR_PORTGEAR, USB_PRODUCT_PORTGEAR_EA8, 0)}, - {USB_VPI(USB_VENDOR_PORTGEAR, USB_PRODUCT_PORTGEAR_EA9, 0)}, - {USB_VPI(USB_VENDOR_PORTSMITH, USB_PRODUCT_PORTSMITH_EEA, 0)}, - {USB_VPI(USB_VENDOR_SHARK, USB_PRODUCT_SHARK_PA, 0)}, - {USB_VPI(USB_VENDOR_SILICOM, USB_PRODUCT_SILICOM_GPE, 0)}, - {USB_VPI(USB_VENDOR_SILICOM, USB_PRODUCT_SILICOM_U2E, 0)}, - {USB_VPI(USB_VENDOR_SMC, USB_PRODUCT_SMC_2102USB, 0)}, +#define KUE_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) } + KUE_DEV(3COM, 3C19250), + KUE_DEV(3COM, 3C460), + KUE_DEV(ABOCOM, URE450), + KUE_DEV(ADS, UBS10BT), + KUE_DEV(ADS, UBS10BTX), + KUE_DEV(AOX, USB101), + KUE_DEV(ASANTE, EA), + KUE_DEV(ATEN, DSB650C), + KUE_DEV(ATEN, UC10T), + KUE_DEV(COREGA, ETHER_USB_T), + KUE_DEV(DLINK, DSB650C), + KUE_DEV(ENTREGA, E45), + KUE_DEV(ENTREGA, XX1), + KUE_DEV(ENTREGA, XX2), + KUE_DEV(IODATA, USBETT), + KUE_DEV(JATON, EDA), + KUE_DEV(KINGSTON, XX1), + KUE_DEV(KLSI, DUH3E10BT), + KUE_DEV(KLSI, DUH3E10BTN), + KUE_DEV(LINKSYS, USB10T), + KUE_DEV(MOBILITY, EA), + KUE_DEV(NETGEAR, EA101), + KUE_DEV(NETGEAR, EA101X), + KUE_DEV(PERACOM, ENET), + KUE_DEV(PERACOM, ENET2), + KUE_DEV(PERACOM, ENET3), + KUE_DEV(PORTGEAR, EA8), + KUE_DEV(PORTGEAR, EA9), + KUE_DEV(PORTSMITH, EEA), + KUE_DEV(SHARK, PA), + KUE_DEV(SILICOM, GPE), + KUE_DEV(SILICOM, U2E), + KUE_DEV(SMC, 2102USB), +#undef KUE_DEV }; /* prototypes */ @@ -480,14 +481,14 @@ kue_attach(device_t dev) error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, kue_config, KUE_N_TRANSFER, sc, &sc->sc_mtx); if (error) { - device_printf(dev, "allocating USB transfers failed!\n"); + device_printf(dev, "allocating USB transfers failed\n"); goto detach; } sc->sc_mcfilters = malloc(KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN, M_USBDEV, M_WAITOK); if (sc->sc_mcfilters == NULL) { - device_printf(dev, "failed allocating USB memory!\n"); + device_printf(dev, "failed allocating USB memory\n"); goto detach; } diff --git a/sys/dev/usb/net/if_rue.c b/sys/dev/usb/net/if_rue.c index 7b92bc553e3b..3e77305aa979 100644 --- a/sys/dev/usb/net/if_rue.c +++ b/sys/dev/usb/net/if_rue.c @@ -535,7 +535,7 @@ rue_reset(struct rue_softc *sc) break; } if (i == RUE_TIMEOUT) - device_printf(sc->sc_ue.ue_dev, "reset never completed!\n"); + device_printf(sc->sc_ue.ue_dev, "reset never completed\n"); uether_pause(&sc->sc_ue, hz / 100); } @@ -591,7 +591,7 @@ rue_attach(device_t dev) sc->sc_xfer, rue_config, RUE_N_TRANSFER, sc, &sc->sc_mtx); if (error) { - device_printf(dev, "allocating USB transfers failed!\n"); + device_printf(dev, "allocating USB transfers failed\n"); goto detach; } diff --git a/sys/dev/usb/net/if_udav.c b/sys/dev/usb/net/if_udav.c index 20853e0d8bf4..ae30b142da62 100644 --- a/sys/dev/usb/net/if_udav.c +++ b/sys/dev/usb/net/if_udav.c @@ -254,7 +254,7 @@ udav_attach(device_t dev) error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, udav_config, UDAV_N_TRANSFER, sc, &sc->sc_mtx); if (error) { - device_printf(dev, "allocating USB transfers failed!\n"); + device_printf(dev, "allocating USB transfers failed\n"); goto detach; } diff --git a/sys/dev/usb/net/uhso.c b/sys/dev/usb/net/uhso.c new file mode 100644 index 000000000000..a810ec48c5dd --- /dev/null +++ b/sys/dev/usb/net/uhso.c @@ -0,0 +1,1814 @@ +/*- + * Copyright (c) 2009 Fredrik Lindberg + * 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "usbdevs.h" +#define USB_DEBUG_VAR uhso_debug +#include +#include +#include +#include +#include +#include +#include +#include + +struct uhso_tty { + struct uhso_softc *ht_sc; + struct usb_xfer *ht_xfer[3]; + int ht_muxport; /* Mux. port no */ + int ht_open; + char ht_name[32]; +}; + +struct uhso_softc { + device_t sc_dev; + struct usb_device *sc_udev; + struct mtx sc_mtx; + uint32_t sc_type; /* Interface definition */ + + struct usb_xfer *sc_xfer[3]; + uint8_t sc_iface_no; + uint8_t sc_iface_index; + + /* Control pipe */ + struct usb_xfer * sc_ctrl_xfer[2]; + uint8_t sc_ctrl_iface_no; + + /* Network */ + struct usb_xfer *sc_if_xfer[2]; + struct ifnet *sc_ifp; + struct mbuf *sc_mwait; /* Partial packet */ + size_t sc_waitlen; /* No. of outstanding bytes */ + struct ifqueue sc_rxq; + struct callout sc_c; + + /* TTY related structures */ + struct ucom_super_softc sc_super_ucom; + int sc_ttys; + struct uhso_tty *sc_tty; + struct ucom_softc *sc_ucom; + int sc_msr; + int sc_lsr; + int sc_line; +}; + +#define UHSO_MAX_MTU 2048 + +/* + * There are mainly two type of cards floating around. + * The first one has 2,3 or 4 interfaces with a multiplexed serial port + * and packet interface on the first interface and bulk serial ports + * on the others. + * The second type of card has several other interfaces, their purpose + * can be detected during run-time. + */ +#define UHSO_IFACE_SPEC(usb_type, port, port_type) \ + (((usb_type) << 24) | ((port) << 16) | (port_type)) + +#define UHSO_IFACE_USB_TYPE(x) ((x >> 24) & 0xff) +#define UHSO_IFACE_PORT(x) ((x >> 16) & 0xff) +#define UHSO_IFACE_PORT_TYPE(x) (x & 0xff) + +/* + * USB interface types + */ +#define UHSO_IF_NET 0x01 /* Network packet interface */ +#define UHSO_IF_MUX 0x02 /* Multiplexed serial port */ +#define UHSO_IF_BULK 0x04 /* Bulk interface */ + +/* + * Port types + */ +#define UHSO_PORT_UNKNOWN 0x00 +#define UHSO_PORT_SERIAL 0x01 /* Serial port */ +#define UHSO_PORT_NETWORK 0x02 /* Network packet interface */ + +/* + * Multiplexed serial port destination sub-port names + */ +#define UHSO_MPORT_TYPE_CTL 0x00 /* Control port */ +#define UHSO_MPORT_TYPE_APP 0x01 /* Application */ +#define UHSO_MPORT_TYPE_PCSC 0x02 +#define UHSO_MPORT_TYPE_GPS 0x03 +#define UHSO_MPORT_TYPE_APP2 0x04 /* Secondary application */ +#define UHSO_MPORT_TYPE_MAX UHSO_MPORT_TYPE_APP2 +#define UHSO_MPORT_TYPE_NOMAX 8 /* Max number of mux ports */ + +/* + * Port definitions + * Note that these definitions are arbitrary and do not match the values + * returned by the auto config descriptor. + */ +#define UHSO_PORT_TYPE_CTL 0x01 +#define UHSO_PORT_TYPE_APP 0x02 +#define UHSO_PORT_TYPE_APP2 0x03 +#define UHSO_PORT_TYPE_MODEM 0x04 +#define UHSO_PORT_TYPE_NETWORK 0x05 +#define UHSO_PORT_TYPE_DIAG 0x06 +#define UHSO_PORT_TYPE_DIAG2 0x07 +#define UHSO_PORT_TYPE_GPS 0x08 +#define UHSO_PORT_TYPE_GPSCTL 0x09 +#define UHSO_PORT_TYPE_PCSC 0x0a +#define UHSO_PORT_TYPE_MSD 0x0b +#define UHSO_PORT_TYPE_VOICE 0x0c +#define UHSO_PORT_TYPE_MAX 0x0c + +static eventhandler_tag uhso_etag; + +/* Overall port type */ +static char *uhso_port[] = { + "Unknown", + "Serial", + "Network", + "Network/Serial" +}; + +/* + * Map between interface port type read from device and description type. + * The position in this array is a direct map to the auto config + * descriptor values. + */ +static unsigned char uhso_port_map[] = { + 0, + UHSO_PORT_TYPE_DIAG, + UHSO_PORT_TYPE_GPS, + UHSO_PORT_TYPE_GPSCTL, + UHSO_PORT_TYPE_APP, + UHSO_PORT_TYPE_APP2, + UHSO_PORT_TYPE_CTL, + UHSO_PORT_TYPE_NETWORK, + UHSO_PORT_TYPE_MODEM, + UHSO_PORT_TYPE_MSD, + UHSO_PORT_TYPE_PCSC, + UHSO_PORT_TYPE_VOICE +}; +static char uhso_port_map_max = sizeof(uhso_port_map) / sizeof(char); + +static unsigned char uhso_mux_port_map[] = { + UHSO_PORT_TYPE_CTL, + UHSO_PORT_TYPE_APP, + UHSO_PORT_TYPE_PCSC, + UHSO_PORT_TYPE_GPS, + UHSO_PORT_TYPE_APP2 +}; + +static char *uhso_port_type[] = { + "Unknown", /* Not a valid port */ + "Control", + "Application", + "Application (Secondary)", + "Modem", + "Network", + "Diagnostic", + "Diagnostic (Secondary)", + "GPS", + "GPS Control", + "PC Smartcard", + "MSD", + "Voice", +}; + +static char *uhso_port_type_sysctl[] = { + "unknown", + "control", + "application", + "application", + "modem", + "network", + "diagnostic", + "diagnostic", + "gps", + "gps_control", + "pcsc", + "msd", + "voice", +}; + +#define UHSO_STATIC_IFACE 0x01 +#define UHSO_AUTO_IFACE 0x02 + +static const struct usb_device_id uhso_devs[] = { +#define UHSO_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) } + /* Option GlobeSurfer iCON 7.2 */ + UHSO_DEV(OPTION, GSICON72, UHSO_STATIC_IFACE), + /* Option iCON 225 */ + UHSO_DEV(OPTION, GTHSDPA, UHSO_STATIC_IFACE), + /* Option GlobeSurfer iCON HSUPA */ + UHSO_DEV(OPTION, GSICONHSUPA, UHSO_STATIC_IFACE), + /* Option GlobeTrotter HSUPA */ + UHSO_DEV(OPTION, GTHSUPA, UHSO_STATIC_IFACE), + /* GE40x */ + UHSO_DEV(OPTION, GE40X, UHSO_AUTO_IFACE), + UHSO_DEV(OPTION, GE40X_1, UHSO_AUTO_IFACE), + UHSO_DEV(OPTION, GE40X_2, UHSO_AUTO_IFACE), + UHSO_DEV(OPTION, GE40X_3, UHSO_AUTO_IFACE), + /* Option GlobeSurfer iCON 401 */ + UHSO_DEV(OPTION, ICON401, UHSO_AUTO_IFACE), + /* Option GlobeTrotter Module 382 */ + UHSO_DEV(OPTION, GMT382, UHSO_AUTO_IFACE), + /* Option iCON EDGE */ + UHSO_DEV(OPTION, ICONEDGE, UHSO_STATIC_IFACE), + /* Option Module HSxPA */ + UHSO_DEV(OPTION, MODHSXPA, UHSO_STATIC_IFACE), + /* Option iCON 321 */ + UHSO_DEV(OPTION, ICON321, UHSO_STATIC_IFACE), + /* Option iCON 322 */ + UHSO_DEV(OPTION, GTICON322, UHSO_STATIC_IFACE), + /* Option iCON 505 */ + UHSO_DEV(OPTION, ICON505, UHSO_AUTO_IFACE), +#undef UHSO_DEV +}; + +SYSCTL_NODE(_hw_usb, OID_AUTO, uhso, CTLFLAG_RW, 0, "USB uhso"); +static int uhso_autoswitch = 1; +SYSCTL_INT(_hw_usb_uhso, OID_AUTO, auto_switch, CTLFLAG_RW, + &uhso_autoswitch, 0, "Automatically switch to modem mode"); + +#ifdef USB_DEBUG +#ifdef UHSO_DEBUG +static int uhso_debug = UHSO_DEBUG; +#else +static int uhso_debug = -1; +#endif + +SYSCTL_INT(_hw_usb_uhso, OID_AUTO, debug, CTLFLAG_RW, + &uhso_debug, 0, "Debug level"); + +#define UHSO_DPRINTF(n, x, ...) {\ + if (uhso_debug >= n) {\ + printf("%s: " x, __func__, ##__VA_ARGS__);\ + }\ +} +#else +#define UHSO_DPRINTF(n, x, ...) +#endif + +#ifdef UHSO_DEBUG_HEXDUMP +# define UHSO_HEXDUMP(_buf, _len) do { \ + { \ + size_t __tmp; \ + const char *__buf = (const char *)_buf; \ + for (__tmp = 0; __tmp < _len; __tmp++) \ + printf("%02hhx ", *__buf++); \ + printf("\n"); \ + } \ +} while(0) +#else +# define UHSO_HEXDUMP(_buf, _len) +#endif + +enum { + UHSO_MUX_ENDPT_INTR = 0, + UHSO_MUX_ENDPT_MAX +}; + +enum { + UHSO_CTRL_READ = 0, + UHSO_CTRL_WRITE, + UHSO_CTRL_MAX +}; + +enum { + UHSO_IFNET_READ = 0, + UHSO_IFNET_WRITE, + UHSO_IFNET_MAX +}; + +enum { + UHSO_BULK_ENDPT_READ = 0, + UHSO_BULK_ENDPT_WRITE, + UHSO_BULK_ENDPT_INTR, + UHSO_BULK_ENDPT_MAX +}; + +static usb_callback_t uhso_mux_intr_callback; +static usb_callback_t uhso_mux_read_callback; +static usb_callback_t uhso_mux_write_callback; +static usb_callback_t uhso_bs_read_callback; +static usb_callback_t uhso_bs_write_callback; +static usb_callback_t uhso_bs_intr_callback; +static usb_callback_t uhso_ifnet_read_callback; +static usb_callback_t uhso_ifnet_write_callback; + +/* Config used for the default control pipes */ +static const struct usb_config uhso_ctrl_config[UHSO_CTRL_MAX] = { + [UHSO_CTRL_READ] = { + .type = UE_CONTROL, + .endpoint = 0x00, + .direction = UE_DIR_ANY, + .flags = { .pipe_bof = 1, .short_xfer_ok = 1 }, + .bufsize = sizeof(struct usb_device_request) + 1024, + .callback = &uhso_mux_read_callback + }, + + [UHSO_CTRL_WRITE] = { + .type = UE_CONTROL, + .endpoint = 0x00, + .direction = UE_DIR_ANY, + .flags = { .pipe_bof = 1, .force_short_xfer = 1 }, + .bufsize = sizeof(struct usb_device_request) + 1024, + .timeout = 1000, + .callback = &uhso_mux_write_callback + } +}; + +/* Config for the multiplexed serial ports */ +static const struct usb_config uhso_mux_config[UHSO_MUX_ENDPT_MAX] = { + [UHSO_MUX_ENDPT_INTR] = { + .type = UE_INTERRUPT, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_IN, + .flags = { .short_xfer_ok = 1 }, + .bufsize = 0, + .callback = &uhso_mux_intr_callback, + } +}; + +/* Config for the raw IP-packet interface */ +static const struct usb_config uhso_ifnet_config[UHSO_IFNET_MAX] = { + [UHSO_IFNET_READ] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_IN, + .flags = { .pipe_bof = 1, .short_xfer_ok = 1 }, + .bufsize = MCLBYTES, + .callback = &uhso_ifnet_read_callback + }, + [UHSO_IFNET_WRITE] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .flags = { .pipe_bof = 1, .force_short_xfer = 1 }, + .bufsize = MCLBYTES, + .timeout = 5 * USB_MS_HZ, + .callback = &uhso_ifnet_write_callback + } +}; + +/* Config for interfaces with normal bulk serial ports */ +static const struct usb_config uhso_bs_config[UHSO_BULK_ENDPT_MAX] = { + [UHSO_BULK_ENDPT_READ] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_IN, + .flags = { .pipe_bof = 1, .short_xfer_ok = 1 }, + .bufsize = 4096, + .callback = &uhso_bs_read_callback + }, + + [UHSO_BULK_ENDPT_WRITE] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .flags = { .pipe_bof = 1, .force_short_xfer = 1 }, + .bufsize = 8192, + .callback = &uhso_bs_write_callback + }, + + [UHSO_BULK_ENDPT_INTR] = { + .type = UE_INTERRUPT, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_IN, + .flags = { .short_xfer_ok = 1 }, + .bufsize = 0, + .callback = &uhso_bs_intr_callback, + } +}; + +static int uhso_probe_iface(struct uhso_softc *, int, + int (*probe)(struct uhso_softc *, int)); +static int uhso_probe_iface_auto(struct uhso_softc *, int); +static int uhso_probe_iface_static(struct uhso_softc *, int); +static int uhso_attach_muxserial(struct uhso_softc *, struct usb_interface *, + int type); +static int uhso_attach_bulkserial(struct uhso_softc *, struct usb_interface *, + int type); +static int uhso_attach_ifnet(struct uhso_softc *, struct usb_interface *, + int type); +static void uhso_test_autoinst(void *, struct usb_device *, + struct usb_attach_arg *); +static int uhso_driver_loaded(struct module *, int, void *); + +static void uhso_ucom_start_read(struct ucom_softc *); +static void uhso_ucom_stop_read(struct ucom_softc *); +static void uhso_ucom_start_write(struct ucom_softc *); +static void uhso_ucom_stop_write(struct ucom_softc *); +static void uhso_ucom_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *); +static void uhso_ucom_cfg_set_dtr(struct ucom_softc *, uint8_t); +static void uhso_ucom_cfg_set_rts(struct ucom_softc *, uint8_t); +static void uhso_if_init(void *); +static void uhso_if_start(struct ifnet *); +static void uhso_if_stop(struct uhso_softc *); +static int uhso_if_ioctl(struct ifnet *, u_long, caddr_t); +static int uhso_if_output(struct ifnet *, struct mbuf *, struct sockaddr *, + struct route *); +static void uhso_if_rxflush(void *); + +static device_probe_t uhso_probe; +static device_attach_t uhso_attach; +static device_detach_t uhso_detach; + +static device_method_t uhso_methods[] = { + DEVMETHOD(device_probe, uhso_probe), + DEVMETHOD(device_attach, uhso_attach), + DEVMETHOD(device_detach, uhso_detach), + { 0, 0 } +}; + +static driver_t uhso_driver = { + "uhso", + uhso_methods, + sizeof(struct uhso_softc) +}; + +static devclass_t uhso_devclass; +DRIVER_MODULE(uhso, uhub, uhso_driver, uhso_devclass, uhso_driver_loaded, 0); +MODULE_DEPEND(uhso, ucom, 1, 1, 1); +MODULE_DEPEND(uhso, usb, 1, 1, 1); +MODULE_VERSION(uhso, 1); + +static struct ucom_callback uhso_ucom_callback = { + .ucom_cfg_get_status = &uhso_ucom_cfg_get_status, + .ucom_cfg_set_dtr = &uhso_ucom_cfg_set_dtr, + .ucom_cfg_set_rts = &uhso_ucom_cfg_set_rts, + .ucom_start_read = uhso_ucom_start_read, + .ucom_stop_read = uhso_ucom_stop_read, + .ucom_start_write = uhso_ucom_start_write, + .ucom_stop_write = uhso_ucom_stop_write +}; + +static int +uhso_probe(device_t self) +{ + struct usb_attach_arg *uaa = device_get_ivars(self); + + if (uaa->usb_mode != USB_MODE_HOST) + return (ENXIO); + if (uaa->info.bConfigIndex != 0) + return (ENXIO); + if (uaa->device->ddesc.bDeviceClass != 0xff) + return (ENXIO); + + return (usbd_lookup_id_by_uaa(uhso_devs, sizeof(uhso_devs), uaa)); +} + +static int +uhso_attach(device_t self) +{ + struct uhso_softc *sc = device_get_softc(self); + struct usb_attach_arg *uaa = device_get_ivars(self); + struct usb_config_descriptor *cd; + struct usb_interface_descriptor *id; + struct sysctl_ctx_list *sctx; + struct sysctl_oid *soid; + struct sysctl_oid *tree, *tty_node; + struct ucom_softc *ucom; + struct uhso_tty *ht; + int i, error, port; + void *probe_f; + usb_error_t uerr; + char *desc; + + sc->sc_dev = self; + sc->sc_udev = uaa->device; + mtx_init(&sc->sc_mtx, "uhso", NULL, MTX_DEF); + + sc->sc_ucom = NULL; + sc->sc_ttys = 0; + + cd = usbd_get_config_descriptor(uaa->device); + id = usbd_get_interface_descriptor(uaa->iface); + sc->sc_ctrl_iface_no = id->bInterfaceNumber; + + sc->sc_iface_no = uaa->info.bIfaceNum; + sc->sc_iface_index = uaa->info.bIfaceIndex; + + /* Setup control pipe */ + uerr = usbd_transfer_setup(uaa->device, + &sc->sc_iface_index, sc->sc_ctrl_xfer, + uhso_ctrl_config, UHSO_CTRL_MAX, sc, &sc->sc_mtx); + if (uerr) { + device_printf(self, "Failed to setup control pipe: %s\n", + usbd_errstr(uerr)); + goto out; + } + + if (USB_GET_DRIVER_INFO(uaa) == UHSO_STATIC_IFACE) + probe_f = uhso_probe_iface_static; + else if (USB_GET_DRIVER_INFO(uaa) == UHSO_AUTO_IFACE) + probe_f = uhso_probe_iface_auto; + else + goto out; + + error = uhso_probe_iface(sc, uaa->info.bIfaceNum, probe_f); + if (error != 0) + goto out; + + sctx = device_get_sysctl_ctx(sc->sc_dev); + soid = device_get_sysctl_tree(sc->sc_dev); + + SYSCTL_ADD_STRING(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "type", + CTLFLAG_RD, uhso_port[UHSO_IFACE_PORT(sc->sc_type)], 0, + "Port available at this interface"); + + /* + * The default interface description on most Option devices isn't + * very helpful. So we skip device_set_usb_desc and set the + * device description manually. + */ + device_set_desc_copy(self, uhso_port_type[UHSO_IFACE_PORT_TYPE(sc->sc_type)]); + /* Announce device */ + device_printf(self, "<%s port> at <%s %s> on %s\n", + uhso_port_type[UHSO_IFACE_PORT_TYPE(sc->sc_type)], + uaa->device->manufacturer, uaa->device->product, + device_get_nameunit(uaa->device->bus->bdev)); + + if (sc->sc_ttys > 0) { + SYSCTL_ADD_INT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "ports", + CTLFLAG_RD, &sc->sc_ttys, 0, "Number of attached serial ports"); + + tree = SYSCTL_ADD_NODE(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, + "port", CTLFLAG_RD, NULL, "Serial ports"); + } + + /* + * Loop through the number of found TTYs and create sysctl + * nodes for them. + */ + for (i = 0; i < sc->sc_ttys; i++) { + ht = &sc->sc_tty[i]; + ucom = &sc->sc_ucom[i]; + + if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_MUX) + port = uhso_mux_port_map[ht->ht_muxport]; + else + port = UHSO_IFACE_PORT_TYPE(sc->sc_type); + + desc = uhso_port_type_sysctl[port]; + + tty_node = SYSCTL_ADD_NODE(sctx, SYSCTL_CHILDREN(tree), OID_AUTO, + desc, CTLFLAG_RD, NULL, ""); + + ht->ht_name[0] = 0; + if (sc->sc_ttys == 1) + snprintf(ht->ht_name, 32, "cuaU%d", ucom->sc_unit); + else { + snprintf(ht->ht_name, 32, "cuaU%d.%d", + ucom->sc_unit - ucom->sc_local_unit, + ucom->sc_local_unit); + } + + desc = uhso_port_type[port]; + SYSCTL_ADD_STRING(sctx, SYSCTL_CHILDREN(tty_node), OID_AUTO, + "tty", CTLFLAG_RD, ht->ht_name, 0, ""); + SYSCTL_ADD_STRING(sctx, SYSCTL_CHILDREN(tty_node), OID_AUTO, + "desc", CTLFLAG_RD, desc, 0, ""); + + if (bootverbose) + device_printf(sc->sc_dev, + "\"%s\" port at %s\n", desc, ht->ht_name); + } + + return (0); +out: + uhso_detach(sc->sc_dev); + return (ENXIO); +} + +static int +uhso_detach(device_t self) +{ + struct uhso_softc *sc = device_get_softc(self); + int i; + + usbd_transfer_unsetup(sc->sc_xfer, 3); + usbd_transfer_unsetup(sc->sc_ctrl_xfer, UHSO_CTRL_MAX); + if (sc->sc_ttys > 0) { + ucom_detach(&sc->sc_super_ucom, sc->sc_ucom, sc->sc_ttys); + + for (i = 0; i < sc->sc_ttys; i++) { + if (sc->sc_tty[i].ht_muxport != -1) { + usbd_transfer_unsetup(sc->sc_tty[i].ht_xfer, + UHSO_CTRL_MAX); + } + } + + free(sc->sc_tty, M_USBDEV); + free(sc->sc_ucom, M_USBDEV); + } + + if (sc->sc_ifp != NULL) { + callout_drain(&sc->sc_c); + mtx_lock(&sc->sc_mtx); + uhso_if_stop(sc); + bpfdetach(sc->sc_ifp); + if_detach(sc->sc_ifp); + if_free(sc->sc_ifp); + mtx_unlock(&sc->sc_mtx); + usbd_transfer_unsetup(sc->sc_if_xfer, UHSO_IFNET_MAX); + } + + mtx_destroy(&sc->sc_mtx); + return (0); +} + +static void +uhso_test_autoinst(void *arg, struct usb_device *udev, + struct usb_attach_arg *uaa) +{ + struct usb_interface *iface; + struct usb_interface_descriptor *id; + + if (uaa->dev_state != UAA_DEV_READY || !uhso_autoswitch) + return; + + iface = usbd_get_iface(udev, 0); + if (iface == NULL) + return; + id = iface->idesc; + if (id == NULL || id->bInterfaceClass != UICLASS_MASS) + return; + if (usbd_lookup_id_by_uaa(uhso_devs, sizeof(uhso_devs), uaa)) + return; /* no device match */ + + if (usb_msc_eject(udev, 0, MSC_EJECT_REZERO) == 0) { + /* success, mark the udev as disappearing */ + uaa->dev_state = UAA_DEV_EJECTING; + } +} + +static int +uhso_driver_loaded(struct module *mod, int what, void *arg) +{ + switch (what) { + case MOD_LOAD: + /* register our autoinstall handler */ + uhso_etag = EVENTHANDLER_REGISTER(usb_dev_configured, + uhso_test_autoinst, NULL, EVENTHANDLER_PRI_ANY); + break; + case MOD_UNLOAD: + EVENTHANDLER_DEREGISTER(usb_dev_configured, uhso_etag); + break; + default: + return (EOPNOTSUPP); + } + return (0); +} + +/* + * Probe the interface type by querying the device. The elements + * of an array indicates the capabilities of a particular interface. + * Returns a bit mask with the interface capabilities. + */ +static int +uhso_probe_iface_auto(struct uhso_softc *sc, int index) +{ + struct usb_device_request req; + usb_error_t uerr; + uint16_t actlen = 0; + char port; + char buf[17] = {0}; + + req.bmRequestType = UT_READ_VENDOR_DEVICE; + req.bRequest = 0x86; + USETW(req.wValue, 0); + USETW(req.wIndex, 0); + USETW(req.wLength, 17); + + uerr = usbd_do_request_flags(sc->sc_udev, NULL, &req, buf, + 0, &actlen, USB_MS_HZ); + if (uerr != 0) { + device_printf(sc->sc_dev, "usbd_do_request_flags failed: %s\n", + usbd_errstr(uerr)); + return (0); + } + + UHSO_DPRINTF(1, "actlen=%d\n", actlen); + UHSO_HEXDUMP(buf, 17); + + if (index < 0 || index > 16) { + UHSO_DPRINTF(0, "Index %d out of range\n", index); + return (0); + } + + UHSO_DPRINTF(1, "index=%d, type=%x[%s]\n", index, buf[index], + uhso_port_type[(int)uhso_port_map[(int)buf[index]]]); + + if (buf[index] >= uhso_port_map_max) + port = 0; + else + port = uhso_port_map[(int)buf[index]]; + + switch (port) { + case UHSO_PORT_TYPE_NETWORK: + return (UHSO_IFACE_SPEC(UHSO_IF_NET | UHSO_IF_MUX, + UHSO_PORT_SERIAL | UHSO_PORT_NETWORK, port)); + case UHSO_PORT_TYPE_VOICE: + /* Don't claim 'voice' ports */ + return (0); + default: + return (UHSO_IFACE_SPEC(UHSO_IF_BULK, + UHSO_PORT_SERIAL, port)); + } + + return (0); +} + +static int +uhso_probe_iface_static(struct uhso_softc *sc, int index) +{ + struct usb_config_descriptor *cd; + + cd = usbd_get_config_descriptor(sc->sc_udev); + if (cd->bNumInterface <= 3) { + /* Cards with 3 or less interfaces */ + switch (index) { + case 0: + return UHSO_IFACE_SPEC(UHSO_IF_NET | UHSO_IF_MUX, + UHSO_PORT_SERIAL | UHSO_PORT_NETWORK, + UHSO_PORT_TYPE_NETWORK); + case 1: + return UHSO_IFACE_SPEC(UHSO_IF_BULK, + UHSO_PORT_SERIAL, UHSO_PORT_TYPE_DIAG); + case 2: + return UHSO_IFACE_SPEC(UHSO_IF_BULK, + UHSO_PORT_SERIAL, UHSO_PORT_TYPE_MODEM); + } + } else { + /* Cards with 4 interfaces */ + switch (index) { + case 0: + return UHSO_IFACE_SPEC(UHSO_IF_NET | UHSO_IF_MUX, + UHSO_PORT_SERIAL | UHSO_PORT_NETWORK, + UHSO_PORT_TYPE_NETWORK); + case 1: + return UHSO_IFACE_SPEC(UHSO_IF_BULK, + UHSO_PORT_SERIAL, UHSO_PORT_TYPE_DIAG2); + case 2: + return UHSO_IFACE_SPEC(UHSO_IF_BULK, + UHSO_PORT_SERIAL, UHSO_PORT_TYPE_MODEM); + case 3: + return UHSO_IFACE_SPEC(UHSO_IF_BULK, + UHSO_PORT_SERIAL, UHSO_PORT_TYPE_DIAG); + } + } + return (0); +} + +/* + * Probes an interface for its particular capabilities and attaches if + * it's a supported interface. + */ +static int +uhso_probe_iface(struct uhso_softc *sc, int index, + int (*probe)(struct uhso_softc *, int)) +{ + struct usb_interface *iface; + int type, error; + + UHSO_DPRINTF(1, "Probing for interface %d, probe_func=%p\n", index, probe); + + type = probe(sc, index); + UHSO_DPRINTF(1, "Probe result %x\n", type); + if (type <= 0) + return (ENXIO); + + sc->sc_type = type; + iface = usbd_get_iface(sc->sc_udev, index); + + if (UHSO_IFACE_PORT_TYPE(type) == UHSO_PORT_TYPE_NETWORK) { + error = uhso_attach_ifnet(sc, iface, type); + if (error) { + UHSO_DPRINTF(1, "uhso_attach_ifnet failed"); + return (ENXIO); + } + + /* + * If there is an additional interrupt endpoint on this + * interface then we most likely have a multiplexed serial port + * available. + */ + if (iface->idesc->bNumEndpoints < 3) { + sc->sc_type = UHSO_IFACE_SPEC( + UHSO_IFACE_USB_TYPE(type) & ~UHSO_IF_MUX, + UHSO_IFACE_PORT(type) & ~UHSO_PORT_SERIAL, + UHSO_IFACE_PORT_TYPE(type)); + return (0); + } + + UHSO_DPRINTF(1, "Trying to attach mux. serial\n"); + error = uhso_attach_muxserial(sc, iface, type); + if (error == 0 && sc->sc_ttys > 0) { + error = ucom_attach(&sc->sc_super_ucom, sc->sc_ucom, + sc->sc_ttys, sc, &uhso_ucom_callback, &sc->sc_mtx); + if (error) { + device_printf(sc->sc_dev, "ucom_attach failed\n"); + return (ENXIO); + } + + mtx_lock(&sc->sc_mtx); + usbd_transfer_start(sc->sc_xfer[UHSO_MUX_ENDPT_INTR]); + mtx_unlock(&sc->sc_mtx); + } + } else if ((UHSO_IFACE_USB_TYPE(type) & UHSO_IF_BULK) && + UHSO_IFACE_PORT(type) & UHSO_PORT_SERIAL) { + + error = uhso_attach_bulkserial(sc, iface, type); + if (error) + return (ENXIO); + + error = ucom_attach(&sc->sc_super_ucom, sc->sc_ucom, + sc->sc_ttys, sc, &uhso_ucom_callback, &sc->sc_mtx); + if (error) { + device_printf(sc->sc_dev, "ucom_attach failed\n"); + return (ENXIO); + } + } + else { + UHSO_DPRINTF(0, "Unknown type %x\n", type); + return (ENXIO); + } + + return (0); +} + +/* + * Expands allocated memory to fit an additional TTY. + * Two arrays are kept with matching indexes, one for ucom and one + * for our private data. + */ +static int +uhso_alloc_tty(struct uhso_softc *sc) +{ + + sc->sc_ttys++; + sc->sc_tty = reallocf(sc->sc_tty, sizeof(struct uhso_tty) * sc->sc_ttys, + M_USBDEV, M_WAITOK | M_ZERO); + if (sc->sc_tty == NULL) + return (-1); + + sc->sc_ucom = reallocf(sc->sc_ucom, + sizeof(struct ucom_softc) * sc->sc_ttys, M_USBDEV, M_WAITOK | M_ZERO); + if (sc->sc_ucom == NULL) + return (-1); + + sc->sc_tty[sc->sc_ttys - 1].ht_sc = sc; + + UHSO_DPRINTF(1, "Allocated TTY %d\n", sc->sc_ttys - 1); + return (sc->sc_ttys - 1); +} + +/* + * Attach a multiplexed serial port + * Data is read/written with requests on the default control pipe. An interrupt + * endpoint returns when there is new data to be read. + */ +static int +uhso_attach_muxserial(struct uhso_softc *sc, struct usb_interface *iface, + int type) +{ + struct usb_descriptor *desc; + int i, port, tty; + usb_error_t uerr; + + /* + * The class specific interface (type 0x24) descriptor subtype field + * contains a bitmask that specifies which (and how many) ports that + * are available through this multiplexed serial port. + */ + desc = usbd_find_descriptor(sc->sc_udev, NULL, + iface->idesc->bInterfaceNumber, UDESC_CS_INTERFACE, 0xff, 0, 0); + if (desc == NULL) { + UHSO_DPRINTF(0, "Failed to find UDESC_CS_INTERFACE\n"); + return (ENXIO); + } + + UHSO_DPRINTF(1, "Mux port mask %x\n", desc->bDescriptorSubtype); + if (desc->bDescriptorSubtype == 0) + return (ENXIO); + + /* + * The bitmask is one octet, loop through the number of + * bits that are set and create a TTY for each. + */ + for (i = 0; i < 8; i++) { + port = (1 << i); + if ((port & desc->bDescriptorSubtype) == port) { + UHSO_DPRINTF(2, "Found mux port %x (%d)\n", port, i); + tty = uhso_alloc_tty(sc); + if (tty < 0) + return (ENOMEM); + sc->sc_tty[tty].ht_muxport = i; + uerr = usbd_transfer_setup(sc->sc_udev, + &sc->sc_iface_index, sc->sc_tty[tty].ht_xfer, + uhso_ctrl_config, UHSO_CTRL_MAX, sc, &sc->sc_mtx); + if (uerr) { + device_printf(sc->sc_dev, + "Failed to setup control pipe: %s\n", + usbd_errstr(uerr)); + return (ENXIO); + } + } + } + + /* Setup the intr. endpoint */ + uerr = usbd_transfer_setup(sc->sc_udev, + &iface->idesc->bInterfaceNumber, sc->sc_xfer, + uhso_mux_config, 1, sc, &sc->sc_mtx); + if (uerr) + return (ENXIO); + + return (0); +} + +/* + * Interrupt callback for the multiplexed serial port. Indicates + * which serial port has data waiting. + */ +static void +uhso_mux_intr_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct usb_page_cache *pc; + struct usb_page_search res; + struct uhso_softc *sc = usbd_xfer_softc(xfer); + unsigned int i, mux; + + UHSO_DPRINTF(3, "status %d\n", USB_GET_STATE(xfer)); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + /* + * The multiplexed port number can be found at the first byte. + * It contains a bit mask, we transform this in to an integer. + */ + pc = usbd_xfer_get_frame(xfer, 0); + usbd_get_page(pc, 0, &res); + + i = *((unsigned char *)res.buffer); + mux = 0; + while (i >>= 1) { + mux++; + } + + UHSO_DPRINTF(3, "mux port %d (%d)\n", mux, i); + if (mux > UHSO_MPORT_TYPE_NOMAX) + break; + + /* Issue a read for this serial port */ + usbd_xfer_set_priv( + sc->sc_tty[mux].ht_xfer[UHSO_CTRL_READ], + &sc->sc_tty[mux]); + usbd_transfer_start(sc->sc_tty[mux].ht_xfer[UHSO_CTRL_READ]); + + break; + case USB_ST_SETUP: +tr_setup: + usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); + usbd_transfer_submit(xfer); + break; + default: + UHSO_DPRINTF(0, "error: %s\n", usbd_errstr(error)); + if (error == USB_ERR_CANCELLED) + break; + + usbd_xfer_set_stall(xfer); + goto tr_setup; + } +} + +static void +uhso_mux_read_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhso_softc *sc = usbd_xfer_softc(xfer); + struct usb_page_cache *pc; + struct usb_device_request req; + struct uhso_tty *ht; + int actlen, len; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + + UHSO_DPRINTF(3, "status %d\n", USB_GET_STATE(xfer)); + + ht = usbd_xfer_get_priv(xfer); + UHSO_DPRINTF(3, "ht=%p open=%d\n", ht, ht->ht_open); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + /* Got data, send to ucom */ + pc = usbd_xfer_get_frame(xfer, 1); + len = usbd_xfer_frame_len(xfer, 1); + + UHSO_DPRINTF(3, "got %d bytes on mux port %d\n", len, + ht->ht_muxport); + if (len <= 0) { + usbd_transfer_start(sc->sc_xfer[UHSO_MUX_ENDPT_INTR]); + break; + } + + /* Deliver data if the TTY is open, discard otherwise */ + if (ht->ht_open) + ucom_put_data(&sc->sc_ucom[ht->ht_muxport], pc, 0, len); + /* FALLTHROUGH */ + case USB_ST_SETUP: +tr_setup: + bzero(&req, sizeof(struct usb_device_request)); + req.bmRequestType = UT_READ_CLASS_INTERFACE; + req.bRequest = UCDC_GET_ENCAPSULATED_RESPONSE; + USETW(req.wValue, 0); + USETW(req.wIndex, ht->ht_muxport); + USETW(req.wLength, 1024); + + pc = usbd_xfer_get_frame(xfer, 0); + usbd_copy_in(pc, 0, &req, sizeof(req)); + + usbd_xfer_set_frame_len(xfer, 0, sizeof(req)); + usbd_xfer_set_frame_len(xfer, 1, 1024); + usbd_xfer_set_frames(xfer, 2); + usbd_transfer_submit(xfer); + break; + default: + UHSO_DPRINTF(0, "error: %s\n", usbd_errstr(error)); + if (error == USB_ERR_CANCELLED) + break; + usbd_xfer_set_stall(xfer); + goto tr_setup; + } +} + +static void +uhso_mux_write_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhso_softc *sc = usbd_xfer_softc(xfer); + struct uhso_tty *ht; + struct usb_page_cache *pc; + struct usb_device_request req; + int actlen; + struct usb_page_search res; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + + ht = usbd_xfer_get_priv(xfer); + UHSO_DPRINTF(3, "status=%d, using mux port %d\n", + USB_GET_STATE(xfer), ht->ht_muxport); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + UHSO_DPRINTF(3, "wrote %zd data bytes to muxport %d\n", + actlen - sizeof(struct usb_device_request) , + ht->ht_muxport); + /* FALLTHROUGH */ + case USB_ST_SETUP: + pc = usbd_xfer_get_frame(xfer, 1); + if (ucom_get_data(&sc->sc_ucom[ht->ht_muxport], pc, + 0, 32, &actlen)) { + + usbd_get_page(pc, 0, &res); + + bzero(&req, sizeof(struct usb_device_request)); + req.bmRequestType = UT_WRITE_CLASS_INTERFACE; + req.bRequest = UCDC_SEND_ENCAPSULATED_COMMAND; + USETW(req.wValue, 0); + USETW(req.wIndex, ht->ht_muxport); + USETW(req.wLength, actlen); + + pc = usbd_xfer_get_frame(xfer, 0); + usbd_copy_in(pc, 0, &req, sizeof(req)); + + usbd_xfer_set_frame_len(xfer, 0, sizeof(req)); + usbd_xfer_set_frame_len(xfer, 1, actlen); + usbd_xfer_set_frames(xfer, 2); + + UHSO_DPRINTF(3, "Prepared %d bytes for transmit " + "on muxport %d\n", actlen, ht->ht_muxport); + + usbd_transfer_submit(xfer); + } + break; + default: + UHSO_DPRINTF(0, "error: %s\n", usbd_errstr(error)); + if (error == USB_ERR_CANCELLED) + break; + break; + } +} + +static int +uhso_attach_bulkserial(struct uhso_softc *sc, struct usb_interface *iface, + int type) +{ + usb_error_t uerr; + int tty; + + /* Try attaching RD/WR/INTR first */ + uerr = usbd_transfer_setup(sc->sc_udev, + &iface->idesc->bInterfaceNumber, sc->sc_xfer, + uhso_bs_config, UHSO_BULK_ENDPT_MAX, sc, &sc->sc_mtx); + if (uerr) { + /* Try only RD/WR */ + uerr = usbd_transfer_setup(sc->sc_udev, + &iface->idesc->bInterfaceNumber, sc->sc_xfer, + uhso_bs_config, UHSO_BULK_ENDPT_MAX - 1, sc, &sc->sc_mtx); + } + if (uerr) { + UHSO_DPRINTF(0, "usbd_transfer_setup failed"); + return (-1); + } + + tty = uhso_alloc_tty(sc); + if (tty < 0) { + usbd_transfer_unsetup(sc->sc_xfer, UHSO_BULK_ENDPT_MAX); + return (ENOMEM); + } + + sc->sc_tty[tty].ht_muxport = -1; + return (0); +} + +static void +uhso_bs_read_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhso_softc *sc = usbd_xfer_softc(xfer); + struct usb_page_cache *pc; + int actlen; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + + UHSO_DPRINTF(3, "status %d, actlen=%d\n", USB_GET_STATE(xfer), actlen); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + pc = usbd_xfer_get_frame(xfer, 0); + ucom_put_data(&sc->sc_ucom[0], pc, 0, actlen); + /* FALLTHROUGH */ + case USB_ST_SETUP: +tr_setup: + usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); + usbd_transfer_submit(xfer); + break; + default: + UHSO_DPRINTF(0, "error: %s\n", usbd_errstr(error)); + if (error == USB_ERR_CANCELLED) + break; + usbd_xfer_set_stall(xfer); + goto tr_setup; + } +} + +static void +uhso_bs_write_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhso_softc *sc = usbd_xfer_softc(xfer); + struct usb_page_cache *pc; + int actlen; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + + UHSO_DPRINTF(3, "status %d, actlen=%d\n", USB_GET_STATE(xfer), actlen); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + case USB_ST_SETUP: +tr_setup: + pc = usbd_xfer_get_frame(xfer, 0); + if (ucom_get_data(&sc->sc_ucom[0], pc, 0, 8192, &actlen)) { + usbd_xfer_set_frame_len(xfer, 0, actlen); + usbd_transfer_submit(xfer); + } + break; + break; + default: + UHSO_DPRINTF(0, "error: %s\n", usbd_errstr(error)); + if (error == USB_ERR_CANCELLED) + break; + usbd_xfer_set_stall(xfer); + goto tr_setup; + } +} + +static void +uhso_bs_cfg(struct uhso_softc *sc) +{ + struct usb_device_request req; + usb_error_t uerr; + + if (!(UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_BULK)) + return; + + req.bmRequestType = UT_WRITE_CLASS_INTERFACE; + req.bRequest = UCDC_SET_CONTROL_LINE_STATE; + USETW(req.wValue, sc->sc_line); + USETW(req.wIndex, sc->sc_iface_no); + USETW(req.wLength, 0); + + uerr = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom[0], &req, NULL, 0, 1000); + if (uerr != 0) { + device_printf(sc->sc_dev, "failed to set ctrl line state to " + "0x%02x: %s\n", sc->sc_line, usbd_errstr(uerr)); + } +} + +static void +uhso_bs_intr_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhso_softc *sc = usbd_xfer_softc(xfer); + struct usb_page_cache *pc; + int actlen; + struct usb_cdc_notification cdc; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + UHSO_DPRINTF(3, "status %d, actlen=%d\n", USB_GET_STATE(xfer), actlen); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + if (actlen < UCDC_NOTIFICATION_LENGTH) { + UHSO_DPRINTF(0, "UCDC notification too short: %d\n", actlen); + goto tr_setup; + } + else if (actlen > sizeof(struct usb_cdc_notification)) { + UHSO_DPRINTF(0, "UCDC notification too large: %d\n", actlen); + actlen = sizeof(struct usb_cdc_notification); + } + + pc = usbd_xfer_get_frame(xfer, 0); + usbd_copy_out(pc, 0, &cdc, actlen); + + if (UGETW(cdc.wIndex) != sc->sc_iface_no) { + UHSO_DPRINTF(0, "Interface mismatch, got %d expected %d\n", + UGETW(cdc.wIndex), sc->sc_iface_no); + goto tr_setup; + } + + if (cdc.bmRequestType == UCDC_NOTIFICATION && + cdc.bNotification == UCDC_N_SERIAL_STATE) { + UHSO_DPRINTF(2, "notify = 0x%02x\n", cdc.data[0]); + + sc->sc_msr = 0; + sc->sc_lsr = 0; + if (cdc.data[0] & UCDC_N_SERIAL_RI) + sc->sc_msr |= SER_RI; + if (cdc.data[0] & UCDC_N_SERIAL_DSR) + sc->sc_msr |= SER_DSR; + if (cdc.data[0] & UCDC_N_SERIAL_DCD) + sc->sc_msr |= SER_DCD; + + ucom_status_change(&sc->sc_ucom[0]); + } + case USB_ST_SETUP: +tr_setup: + default: + if (error == USB_ERR_CANCELLED) + break; + usbd_xfer_set_stall(xfer); + goto tr_setup; + } +} + +static void +uhso_ucom_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr) +{ + struct uhso_softc *sc = ucom->sc_parent; + + *lsr = sc->sc_lsr; + *msr = sc->sc_msr; +} + +static void +uhso_ucom_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff) +{ + struct uhso_softc *sc = ucom->sc_parent; + + if (!(UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_BULK)) + return; + + if (onoff) + sc->sc_line |= UCDC_LINE_DTR; + else + sc->sc_line &= UCDC_LINE_DTR; + + uhso_bs_cfg(sc); +} + +static void +uhso_ucom_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff) +{ + struct uhso_softc *sc = ucom->sc_parent; + + if (!(UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_BULK)) + return; + + if (onoff) + sc->sc_line |= UCDC_LINE_RTS; + else + sc->sc_line &= UCDC_LINE_DTR; + + uhso_bs_cfg(sc); +} + +static void +uhso_ucom_start_read(struct ucom_softc *ucom) +{ + struct uhso_softc *sc = ucom->sc_parent; + + UHSO_DPRINTF(3, "unit=%d, local_unit=%d\n", + ucom->sc_unit, ucom->sc_local_unit); + + if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_MUX) { + sc->sc_tty[ucom->sc_local_unit].ht_open = 1; + usbd_transfer_start(sc->sc_xfer[UHSO_MUX_ENDPT_INTR]); + } + else if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_BULK) { + sc->sc_tty[0].ht_open = 1; + usbd_transfer_start(sc->sc_xfer[UHSO_BULK_ENDPT_READ]); + if (sc->sc_xfer[UHSO_BULK_ENDPT_INTR] != NULL) + usbd_transfer_start(sc->sc_xfer[UHSO_BULK_ENDPT_INTR]); + } +} + +static void +uhso_ucom_stop_read(struct ucom_softc *ucom) +{ + + struct uhso_softc *sc = ucom->sc_parent; + + if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_MUX) { + sc->sc_tty[ucom->sc_local_unit].ht_open = 0; + usbd_transfer_stop( + sc->sc_tty[ucom->sc_local_unit].ht_xfer[UHSO_CTRL_READ]); + } + else if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_BULK) { + sc->sc_tty[0].ht_open = 0; + usbd_transfer_start(sc->sc_xfer[UHSO_BULK_ENDPT_READ]); + if (sc->sc_xfer[UHSO_BULK_ENDPT_INTR] != NULL) + usbd_transfer_stop(sc->sc_xfer[UHSO_BULK_ENDPT_INTR]); + } +} + +static void +uhso_ucom_start_write(struct ucom_softc *ucom) +{ + struct uhso_softc *sc = ucom->sc_parent; + + if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_MUX) { + UHSO_DPRINTF(3, "local unit %d\n", ucom->sc_local_unit); + + usbd_transfer_start(sc->sc_xfer[UHSO_MUX_ENDPT_INTR]); + + usbd_xfer_set_priv( + sc->sc_tty[ucom->sc_local_unit].ht_xfer[UHSO_CTRL_WRITE], + &sc->sc_tty[ucom->sc_local_unit]); + usbd_transfer_start( + sc->sc_tty[ucom->sc_local_unit].ht_xfer[UHSO_CTRL_WRITE]); + + } + else if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_BULK) { + usbd_transfer_start(sc->sc_xfer[UHSO_BULK_ENDPT_WRITE]); + } +} + +static void +uhso_ucom_stop_write(struct ucom_softc *ucom) +{ + struct uhso_softc *sc = ucom->sc_parent; + + if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_MUX) { + usbd_transfer_stop( + sc->sc_tty[ucom->sc_local_unit].ht_xfer[UHSO_CTRL_WRITE]); + } + else if (UHSO_IFACE_USB_TYPE(sc->sc_type) & UHSO_IF_BULK) { + usbd_transfer_stop(sc->sc_xfer[UHSO_BULK_ENDPT_WRITE]); + } +} + +static int uhso_attach_ifnet(struct uhso_softc *sc, struct usb_interface *iface, + int type) +{ + struct ifnet *ifp; + usb_error_t uerr; + struct sysctl_ctx_list *sctx; + struct sysctl_oid *soid; + + uerr = usbd_transfer_setup(sc->sc_udev, + &iface->idesc->bInterfaceNumber, sc->sc_if_xfer, + uhso_ifnet_config, UHSO_IFNET_MAX, sc, &sc->sc_mtx); + if (uerr) { + UHSO_DPRINTF(0, "usbd_transfer_setup failed: %s\n", + usbd_errstr(uerr)); + return (-1); + } + + sc->sc_ifp = ifp = if_alloc(IFT_OTHER); + if (sc->sc_ifp == NULL) { + device_printf(sc->sc_dev, "if_alloc() failed\n"); + return (-1); + } + + callout_init_mtx(&sc->sc_c, &sc->sc_mtx, 0); + mtx_lock(&sc->sc_mtx); + callout_reset(&sc->sc_c, 1, uhso_if_rxflush, sc); + mtx_unlock(&sc->sc_mtx); + + if_initname(ifp, device_get_name(sc->sc_dev), device_get_unit(sc->sc_dev)); + ifp->if_mtu = UHSO_MAX_MTU; + ifp->if_ioctl = uhso_if_ioctl; + ifp->if_init = uhso_if_init; + ifp->if_start = uhso_if_start; + ifp->if_output = uhso_if_output; + ifp->if_flags = 0; + ifp->if_softc = sc; + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_READY(&ifp->if_snd); + + if_attach(ifp); + bpfattach(ifp, DLT_RAW, 0); + + sctx = device_get_sysctl_ctx(sc->sc_dev); + soid = device_get_sysctl_tree(sc->sc_dev); + /* Unlocked read... */ + SYSCTL_ADD_STRING(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "netif", + CTLFLAG_RD, ifp->if_xname, 0, "Attached network interface"); + + return (0); +} + +static void +uhso_ifnet_read_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhso_softc *sc = usbd_xfer_softc(xfer); + struct mbuf *m; + struct usb_page_cache *pc; + int actlen; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + + UHSO_DPRINTF(3, "status=%d, actlen=%d\n", USB_GET_STATE(xfer), actlen); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + if (actlen > 0 && (sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING)) { + pc = usbd_xfer_get_frame(xfer, 0); + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + usbd_copy_out(pc, 0, mtod(m, uint8_t *), actlen); + m->m_pkthdr.len = m->m_len = actlen; + /* Enqueue frame for further processing */ + _IF_ENQUEUE(&sc->sc_rxq, m); + if (!callout_pending(&sc->sc_c) || + !callout_active(&sc->sc_c)) { + callout_schedule(&sc->sc_c, 1); + } + } + /* FALLTHROUGH */ + case USB_ST_SETUP: +tr_setup: + usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); + usbd_transfer_submit(xfer); + break; + default: + UHSO_DPRINTF(0, "error: %s\n", usbd_errstr(error)); + if (error == USB_ERR_CANCELLED) + break; + usbd_xfer_set_stall(xfer); + goto tr_setup; + } +} + +/* + * Deferred RX processing, called with mutex locked. + * + * Each frame we receive might contain several small ip-packets as well + * as partial ip-packets. We need to separate/assemble them into individual + * packets before sending them to the ip-layer. + */ +static void +uhso_if_rxflush(void *arg) +{ + struct uhso_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + uint8_t *cp; + struct mbuf *m, *m0, *mwait; + struct ip *ip; +#ifdef INET6 + struct ip6_hdr *ip6; +#endif + uint16_t iplen; + int len, isr; + + m = NULL; + mwait = sc->sc_mwait; + for (;;) { + if (m == NULL) { + _IF_DEQUEUE(&sc->sc_rxq, m); + if (m == NULL) + break; + UHSO_DPRINTF(3, "dequeue m=%p, len=%d\n", m, m->m_len); + } + mtx_unlock(&sc->sc_mtx); + + /* Do we have a partial packet waiting? */ + if (mwait != NULL) { + m0 = mwait; + mwait = NULL; + + UHSO_DPRINTF(3, "partial m0=%p(%d), concat w/ m=%p(%d)\n", + m0, m0->m_len, m, m->m_len); + len = m->m_len + m0->m_len; + + /* Concat mbufs and fix headers */ + m_cat(m0, m); + m0->m_pkthdr.len = len; + m->m_flags &= ~M_PKTHDR; + + m = m_pullup(m0, sizeof(struct ip)); + if (m == NULL) { + ifp->if_ierrors++; + UHSO_DPRINTF(0, "m_pullup failed\n"); + mtx_lock(&sc->sc_mtx); + continue; + } + UHSO_DPRINTF(3, "Constructed mbuf=%p, len=%d\n", + m, m->m_pkthdr.len); + } + + cp = mtod(m, uint8_t *); + ip = (struct ip *)cp; +#ifdef INET6 + ip6 = (struct ip6_hdr *)cp; +#endif + + /* Check for IPv4 */ + if (ip->ip_v == IPVERSION) { + iplen = htons(ip->ip_len); + isr = NETISR_IP; + } +#ifdef INET6 + /* Check for IPv6 */ + else if ((ip6->ip6_vfc & IPV6_VERSION_MASK) == IPV6_VERSION) { + iplen = htons(ip6->ip6_plen); + isr = NETISR_IPV6; + } +#endif + else { + UHSO_DPRINTF(0, "got unexpected ip version %d, " + "m=%p, len=%d\n", (*cp & 0xf0) >> 4, m, m->m_len); + ifp->if_ierrors++; + UHSO_HEXDUMP(cp, 4); + m_freem(m); + m = NULL; + mtx_lock(&sc->sc_mtx); + continue; + } + + if (iplen == 0) { + UHSO_DPRINTF(0, "Zero IP length\n"); + ifp->if_ierrors++; + m_freem(m); + m = NULL; + mtx_lock(&sc->sc_mtx); + continue; + } + + UHSO_DPRINTF(3, "m=%p, len=%d, cp=%p, iplen=%d\n", + m, m->m_pkthdr.len, cp, iplen); + + m0 = NULL; + + /* More IP packets in this mbuf */ + if (iplen < m->m_pkthdr.len) { + m0 = m; + + /* + * Allocate a new mbuf for this IP packet and + * copy the IP-packet into it. + */ + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + bcopy(mtod(m0, uint8_t *), mtod(m, uint8_t *), iplen); + m->m_pkthdr.len = m->m_len = iplen; + + /* Adjust the size of the original mbuf */ + m_adj(m0, iplen); + m0 = m_defrag(m0, M_WAIT); + + UHSO_DPRINTF(3, "New mbuf=%p, len=%d/%d, m0=%p, " + "m0_len=%d/%d\n", m, m->m_pkthdr.len, m->m_len, + m0, m0->m_pkthdr.len, m0->m_len); + } + else if (iplen > m->m_pkthdr.len) { + UHSO_DPRINTF(3, "Deferred mbuf=%p, len=%d\n", + m, m->m_pkthdr.len); + mwait = m; + m = NULL; + mtx_lock(&sc->sc_mtx); + continue; + } + + ifp->if_ipackets++; + m->m_pkthdr.rcvif = ifp; + + /* Dispatch to IP layer */ + BPF_MTAP(sc->sc_ifp, m); + netisr_dispatch(isr, m); + m = m0 != NULL ? m0 : NULL; + mtx_lock(&sc->sc_mtx); + } + sc->sc_mwait = mwait; +} + +static void +uhso_ifnet_write_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct uhso_softc *sc = usbd_xfer_softc(xfer); + struct ifnet *ifp = sc->sc_ifp; + struct usb_page_cache *pc; + struct mbuf *m; + int actlen; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + + UHSO_DPRINTF(3, "status %d, actlen=%d\n", USB_GET_STATE(xfer), actlen); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + ifp->if_opackets++; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + case USB_ST_SETUP: +tr_setup: + IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) + break; + + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + + if (m->m_pkthdr.len > MCLBYTES) + m->m_pkthdr.len = MCLBYTES; + + usbd_xfer_set_frame_len(xfer, 0, m->m_pkthdr.len); + pc = usbd_xfer_get_frame(xfer, 0); + usbd_m_copy_in(pc, 0, m, 0, m->m_pkthdr.len); + usbd_transfer_submit(xfer); + + BPF_MTAP(ifp, m); + m_freem(m); + break; + default: + UHSO_DPRINTF(0, "error: %s\n", usbd_errstr(error)); + if (error == USB_ERR_CANCELLED) + break; + usbd_xfer_set_stall(xfer); + goto tr_setup; + } +} + +static int +uhso_if_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct uhso_softc *sc; + + sc = ifp->if_softc; + + switch (cmd) { + case SIOCSIFFLAGS: + if (ifp->if_flags & IFF_UP) { + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + uhso_if_init(sc); + } + } + else { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + mtx_lock(&sc->sc_mtx); + uhso_if_stop(sc); + mtx_unlock(&sc->sc_mtx); + } + } + break; + case SIOCSIFADDR: + case SIOCSIFDSTADDR: + case SIOCADDMULTI: + case SIOCDELMULTI: + break; + default: + return (EINVAL); + } + return (0); +} + +static void +uhso_if_init(void *priv) +{ + struct uhso_softc *sc = priv; + struct ifnet *ifp = sc->sc_ifp; + + mtx_lock(&sc->sc_mtx); + uhso_if_stop(sc); + ifp = sc->sc_ifp; + ifp->if_flags |= IFF_UP; + ifp->if_drv_flags |= IFF_DRV_RUNNING; + mtx_unlock(&sc->sc_mtx); + + UHSO_DPRINTF(2, "ifnet initialized\n"); +} + +static int +uhso_if_output(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, + struct route *ro) +{ + int error; + + /* Only IPv4/6 support */ + if (dst->sa_family != AF_INET +#ifdef INET6 + && dst->sa_family != AF_INET6 +#endif + ) { + return (EAFNOSUPPORT); + } + + error = (ifp->if_transmit)(ifp, m0); + if (error) { + ifp->if_oerrors++; + return (ENOBUFS); + } + ifp->if_opackets++; + return (0); +} + +static void +uhso_if_start(struct ifnet *ifp) +{ + struct uhso_softc *sc = ifp->if_softc; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + UHSO_DPRINTF(1, "Not running\n"); + return; + } + + mtx_lock(&sc->sc_mtx); + usbd_transfer_start(sc->sc_if_xfer[UHSO_IFNET_READ]); + usbd_transfer_start(sc->sc_if_xfer[UHSO_IFNET_WRITE]); + mtx_unlock(&sc->sc_mtx); + UHSO_DPRINTF(3, "interface started\n"); +} + +static void +uhso_if_stop(struct uhso_softc *sc) +{ + + usbd_transfer_stop(sc->sc_if_xfer[UHSO_IFNET_READ]); + usbd_transfer_stop(sc->sc_if_xfer[UHSO_IFNET_WRITE]); + sc->sc_ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); +} diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index 92c2ab05ad44..aa89fdc6011f 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -60,13 +60,7 @@ MODULE_DEPEND(usb_quirk, usb, 1, 1, 1); MODULE_VERSION(usb_quirk, 1); -/* - * The following macro adds one or more quirks for a USB device: - */ -#define USB_QUIRK_ENTRY(v,p,l,h,...) \ - .vid = (v), .pid = (p), .lo_rev = (l), .hi_rev = (h), .quirks = { __VA_ARGS__ } - -#define USB_DEV_QUIRKS_MAX 128 +#define USB_DEV_QUIRKS_MAX 256 #define USB_SUB_QUIRKS_MAX 8 struct usb_quirk_entry { @@ -79,55 +73,382 @@ struct usb_quirk_entry { static struct mtx usb_quirk_mtx; +#define USB_QUIRK_VP(v,p,l,h,...) \ + { .vid = (v), .pid = (p), .lo_rev = (l), .hi_rev = (h), \ + .quirks = { __VA_ARGS__ } } +#define USB_QUIRK(v,p,l,h,...) \ + USB_QUIRK_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, l, h, __VA_ARGS__) + static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { - {USB_QUIRK_ENTRY(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_LCM, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_INSIDEOUT, USB_PRODUCT_INSIDEOUT_EDGEPORT4, 0x094, 0x094, UQ_SWAP_UNICODE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, 0x0a2, UQ_BAD_ADC, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, 0x0a2, UQ_AU_NO_XU, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ADA70, 0x103, 0x103, UQ_BAD_ADC, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_ALTEC, USB_PRODUCT_ALTEC_ASC495, 0x000, 0x000, UQ_BAD_AUDIO, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_QTRONIX, USB_PRODUCT_QTRONIX_980N, 0x110, 0x110, UQ_SPUR_BUT_UP, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_ALCOR2, USB_PRODUCT_ALCOR2_KBD_HUB, 0x001, 0x001, UQ_SPUR_BUT_UP, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_MCT, USB_PRODUCT_MCT_HUB0100, 0x102, 0x102, UQ_BUS_POWERED, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232, 0x102, 0x102, UQ_BUS_POWERED, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_TI, USB_PRODUCT_TI_UTUSB41, 0x110, 0x110, UQ_POWER_CLAIM, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1, 0x009, 0x009, UQ_AU_NO_FRAC, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE, 0x100, 0x100, UQ_AU_INP_ASYNC, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_UN53B, 0x0000, 0xFFFF, UQ_NO_STRINGS, UQ_NONE)}, + USB_QUIRK(ASUS, LCM, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(INSIDEOUT, EDGEPORT4, 0x094, 0x094, UQ_SWAP_UNICODE), + USB_QUIRK(DALLAS, J6502, 0x0a2, 0x0a2, UQ_BAD_ADC), + USB_QUIRK(DALLAS, J6502, 0x0a2, 0x0a2, UQ_AU_NO_XU), + USB_QUIRK(ALTEC, ADA70, 0x103, 0x103, UQ_BAD_ADC), + USB_QUIRK(ALTEC, ASC495, 0x000, 0x000, UQ_BAD_AUDIO), + USB_QUIRK(QTRONIX, 980N, 0x110, 0x110, UQ_SPUR_BUT_UP), + USB_QUIRK(ALCOR2, KBD_HUB, 0x001, 0x001, UQ_SPUR_BUT_UP), + USB_QUIRK(MCT, HUB0100, 0x102, 0x102, UQ_BUS_POWERED), + USB_QUIRK(MCT, USB232, 0x102, 0x102, UQ_BUS_POWERED), + USB_QUIRK(TI, UTUSB41, 0x110, 0x110, UQ_POWER_CLAIM), + USB_QUIRK(TELEX, MIC1, 0x009, 0x009, UQ_AU_NO_FRAC), + USB_QUIRK(SILICONPORTALS, YAPPHONE, 0x100, 0x100, UQ_AU_INP_ASYNC), + USB_QUIRK(LOGITECH, UN53B, 0x0000, 0xffff, UQ_NO_STRINGS), + USB_QUIRK(ELSA, MODEM1, 0x0000, 0xffff, UQ_CFG_INDEX_1), /* * XXX The following quirks should have a more specific revision * number: */ - {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_895C, 0x0000, 0xFFFF, UQ_BROKEN_BIDIR, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_880C, 0x0000, 0xFFFF, UQ_BROKEN_BIDIR, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_815C, 0x0000, 0xFFFF, UQ_BROKEN_BIDIR, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_810C, 0x0000, 0xFFFF, UQ_BROKEN_BIDIR, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_830C, 0x0000, 0xFFFF, UQ_BROKEN_BIDIR, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_HP, USB_PRODUCT_HP_1220C, 0x0000, 0xFFFF, UQ_BROKEN_BIDIR, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_XEROX, USB_PRODUCT_XEROX_WCM15, 0x0000, 0xFFFF, UQ_BROKEN_BIDIR, UQ_NONE)}, + USB_QUIRK(HP, 895C, 0x0000, 0xffff, UQ_BROKEN_BIDIR), + USB_QUIRK(HP, 880C, 0x0000, 0xffff, UQ_BROKEN_BIDIR), + USB_QUIRK(HP, 815C, 0x0000, 0xffff, UQ_BROKEN_BIDIR), + USB_QUIRK(HP, 810C, 0x0000, 0xffff, UQ_BROKEN_BIDIR), + USB_QUIRK(HP, 830C, 0x0000, 0xffff, UQ_BROKEN_BIDIR), + USB_QUIRK(HP, 1220C, 0x0000, 0xffff, UQ_BROKEN_BIDIR), + USB_QUIRK(XEROX, WCM15, 0x0000, 0xffff, UQ_BROKEN_BIDIR), /* Devices which should be ignored by uhid */ - {USB_QUIRK_ENTRY(USB_VENDOR_APC, USB_PRODUCT_APC_UPS, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6C550AVR, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_CYBERPOWER, USB_PRODUCT_CYBERPOWER_1500CAVRLCD, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_DELORME, USB_PRODUCT_DELORME_EARTHMATE, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_ITUNERNET, USB_PRODUCT_ITUNERNET_USBLCD2X20, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_ITUNERNET, USB_PRODUCT_ITUNERNET_USBLCD4X20, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS1, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS2, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_IPHONE, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_APPLE, USB_PRODUCT_APPLE_IPHONE_3G, 0x0000, 0xFFFF, UQ_HID_IGNORE, UQ_NONE)}, + USB_QUIRK(APC, UPS, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(BELKIN, F6C550AVR, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(CYBERPOWER, 1500CAVRLCD, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(DELORME, EARTHMATE, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(ITUNERNET, USBLCD2X20, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(ITUNERNET, USBLCD4X20, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(MGE, UPS1, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(MGE, UPS2, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(APPLE, IPHONE, 0x0000, 0xffff, UQ_HID_IGNORE), + USB_QUIRK(APPLE, IPHONE_3G, 0x0000, 0xffff, UQ_HID_IGNORE), /* Devices which should be ignored by both ukbd and uhid */ - {USB_QUIRK_ENTRY(USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_WISPY1A, 0x0000, 0xFFFF, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY1B, 0x0000, 0xFFFF, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_TENX, USB_PRODUCT_TENX_UAUDIO0, 0x0101, 0x0101, UQ_AUDIO_SWAP_LR, UQ_NONE)}, + USB_QUIRK(CYPRESS, WISPY1A, 0x0000, 0xffff, UQ_KBD_IGNORE, UQ_HID_IGNORE), + USB_QUIRK(METAGEEK, WISPY1B, 0x0000, 0xffff, UQ_KBD_IGNORE, UQ_HID_IGNORE), + USB_QUIRK(TENX, UAUDIO0, 0x0101, 0x0101, UQ_AUDIO_SWAP_LR), /* MS keyboards do weird things */ - {USB_QUIRK_ENTRY(USB_VENDOR_MICROSOFT, USB_PRODUCT_MICROSOFT_WLINTELLIMOUSE, 0x0000, 0xFFFF, UQ_MS_LEADING_BYTE, UQ_NONE)}, - {USB_QUIRK_ENTRY(USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24X, 0x0000, 0xFFFF, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)}, + USB_QUIRK(MICROSOFT, WLINTELLIMOUSE, 0x0000, 0xffff, UQ_MS_LEADING_BYTE), + USB_QUIRK(METAGEEK, WISPY24X, 0x0000, 0xffff, UQ_KBD_IGNORE, UQ_HID_IGNORE), + /* umodem(4) device quirks */ + USB_QUIRK(METRICOM, RICOCHET_GS, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA), + USB_QUIRK(SANYO, SCP4900, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA), + USB_QUIRK(MOTOROLA2, T720C, 0x001, 0x001, UQ_ASSUME_CM_OVER_DATA), + USB_QUIRK(EICON, DIVA852, 0x100, 0x100, UQ_ASSUME_CM_OVER_DATA), + USB_QUIRK(SIEMENS2, ES75, 0x000, 0x000, UQ_ASSUME_CM_OVER_DATA), + USB_QUIRK(QUALCOMM, CDMA_MSM, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA), + USB_QUIRK(QUALCOMM2, CDMA_MSM, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA), + USB_QUIRK(CURITEL, UM175, 0x0000, 0xffff, UQ_ASSUME_CM_OVER_DATA), + + /* USB Mass Storage Class Quirks */ + USB_QUIRK_VP(USB_VENDOR_ASAHIOPTICAL, 0, UQ_MSC_NO_RS_CLEAR_UA, + UQ_MATCH_VENDOR_ONLY), + USB_QUIRK(ADDON, ATTACHE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(ADDON, A256MB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(ADDON, DISKPRO512, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(ADDONICS2, CABLE_205, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(AIPTEK, POCKETCAM3M, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(AIPTEK2, SUNPLUS_TECH, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(ALCOR, SDCR_6335, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(ALCOR, AU6390, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(ALCOR, UMCR_9361, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(ALCOR, TRANSCEND, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(ASAHIOPTICAL, OPTIO230, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(ASAHIOPTICAL, OPTIO330, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(BELKIN, USB2SCSI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(CASIO, QV_DIGICAM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(CCYU, ED1064, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(CENTURY, EX35QUAT, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(CENTURY, EX35SW4_SB4, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(CYPRESS, XX6830XX, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN, + UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(DESKNOTE, UCR_61S2B, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(DMI, CFSM_RW, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(DMI, DISK, 0x000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(EPSON, STYLUS_875DC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(EPSON, STYLUS_895, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(FEIYA, 5IN1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(FREECOM, DVD, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(FUJIPHOTO, MASS0100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_RS_CLEAR_UA), + USB_QUIRK(GENESYS, GL641USB2IDE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(GENESYS, GL641USB2IDE_2, 0x0000, 0xffff, + UQ_MSC_FORCE_WIRE_BBB, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_FORCE_SHORT_INQ, UQ_MSC_NO_START_STOP, + UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(GENESYS, GL641USB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(GENESYS, GL641USB_2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_WRONG_CSWSIG), + USB_QUIRK(HAGIWARA, FG, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(HAGIWARA, FGSM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(HITACHI, DVDCAM_DZ_MV100A, 0x0000, 0xffff, + UQ_MSC_FORCE_WIRE_CBI, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(HITACHI, DVDCAM_USB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(HP, CDW4E, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_ATAPI), + USB_QUIRK(HP, CDW8200, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_START_STOP), + USB_QUIRK(IMAGINATION, DBX1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_WRONG_CSWSIG), + USB_QUIRK(INSYSTEM, USBCABLE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_START_STOP, UQ_MSC_ALT_IFACE_1), + USB_QUIRK(INSYSTEM, ATAPI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC), + USB_QUIRK(INSYSTEM, STORAGE_V2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC), + USB_QUIRK(IODATA, IU_CD2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(IODATA, DVR_UEH8, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(IOMEGA, ZIP100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_TEST_UNIT_READY), /* XXX ZIP drives can also use ATAPI */ + USB_QUIRK(JMICRON, JM20337, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(KYOCERA, FINECAM_L3, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(KYOCERA, FINECAM_S3X, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(KYOCERA, FINECAM_S4, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(KYOCERA, FINECAM_S5, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(LACIE, HD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC), + USB_QUIRK(LEXAR, CF_READER, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(LEXAR, JUMPSHOT, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(LOGITEC, LDR_H443SU2, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(LOGITEC, LDR_H443U2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI,), + USB_QUIRK(MELCO, DUBPXXG, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(MICROTECH, DPCM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_START_STOP), + USB_QUIRK(MICROTECH, SCSIDB25, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(MICROTECH, SCSIHD50, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(MINOLTA, E223, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(MINOLTA, F300, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(MITSUMI, CDRRW, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI | + UQ_MSC_FORCE_PROTO_ATAPI), + USB_QUIRK(MOTOROLA2, E398, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_INQUIRY_EVPD, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK_VP(USB_VENDOR_MPMAN, 0, UQ_MSC_NO_SYNC_CACHE, + UQ_MATCH_VENDOR_ONLY), + USB_QUIRK(MSYSTEMS, DISKONKEY, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE, UQ_MSC_NO_GETMAXLUN, + UQ_MSC_NO_RS_CLEAR_UA), + USB_QUIRK(MSYSTEMS, DISKONKEY2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_ATAPI), + USB_QUIRK(MYSON, HEDEN, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE, + UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(MYSON, HEDEN_8813, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(MYSON, STARREADER, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(NEODIO, ND3260, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ), + USB_QUIRK(NETAC, CF_CARD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(NETAC, ONLYDISK, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(NETCHIP, CLIK_40, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_NO_INQUIRY), + USB_QUIRK(NIKON, D300, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(OLYMPUS, C1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_WRONG_CSWSIG), + USB_QUIRK(OLYMPUS, C700, 0x0000, 0xffff, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(ONSPEC, SDS_HOTFIND_D, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(ONSPEC, CFMS_RW, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(ONSPEC, CFSM_COMBO, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(ONSPEC, CFSM_READER, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(ONSPEC, CFSM_READER2, 0x0000, 0xffff, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(ONSPEC, MDCFE_B_CF_READER, 0x0000, 0xffff, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(ONSPEC, MDSM_B_READER, 0x0000, 0xffff, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(ONSPEC, READER, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(ONSPEC, UCF100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY | UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(ONSPEC2, IMAGEMATE_SDDR55, 0x0000, 0xffff, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(PANASONIC, KXL840AN, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(PANASONIC, KXLCB20AN, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(PANASONIC, KXLCB35AN, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(PANASONIC, LS120CAM, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_UFI), + USB_QUIRK(PHILIPS, SPE3030CC, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(PLEXTOR, 40_12_40U, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_TEST_UNIT_READY), + USB_QUIRK(PNY, ATTACHE2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE, + UQ_MSC_NO_START_STOP), + USB_QUIRK_VP(USB_VENDOR_SAMSUNG_TECHWIN, + USB_PRODUCT_SAMSUNG_TECHWIN_DIGIMAX_410, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(SANDISK, SDDR05A, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1, + UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SANDISK, SDDR09, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_READ_CAP_OFFBY1, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SANDISK, SDDR12, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1, + UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SANDISK, SDCZ2_256, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(SANDISK, SDCZ4_128, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(SANDISK, SDCZ4_256, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(SANDISK, SDDR31, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_READ_CAP_OFFBY1), + USB_QUIRK(SCANLOGIC, SL11R, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(SHUTTLE, EUSB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_START_STOP, UQ_MSC_SHUTTLE_INIT), + USB_QUIRK(SHUTTLE, CDRW, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_ATAPI), + USB_QUIRK(SHUTTLE, CF, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_ATAPI), + USB_QUIRK(SHUTTLE, EUSBATAPI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_ATAPI), + USB_QUIRK(SHUTTLE, EUSBCFSM, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(SHUTTLE, EUSCSI, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(SHUTTLE, HIFD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SHUTTLE, SDDR09, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SHUTTLE, ZIOMMC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SIGMATEL, I_BEAD100, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_SHUTTLE_INIT), + USB_QUIRK(SIIG, WINTERREADER, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(SKANHEX, MD_7425, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(SKANHEX, SX_520Z, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(SONY, HANDYCAM, 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC, UQ_MSC_RBC_PAD_TO_12), + USB_QUIRK(SONY, CLIE_40_MS, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(SONY, DSC, 0x0500, 0x0500, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC, UQ_MSC_RBC_PAD_TO_12), + USB_QUIRK(SONY, DSC, 0x0600, 0x0600, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC, UQ_MSC_RBC_PAD_TO_12), + USB_QUIRK(SONY, DSC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC), + USB_QUIRK(SONY, HANDYCAM, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC), + USB_QUIRK(SONY, MSC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_RBC), + USB_QUIRK(SONY, MS_MSC_U03, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SONY, MS_NW_MS7, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SONY, MS_PEG_N760C, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(SONY, MSACUS1, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(SONY, PORTABLE_HDD_V2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(SUPERTOP, IDE, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE, + UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(TAUGA, CAMERAMATE, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(TEAC, FD05PUB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_UFI), + USB_QUIRK(TECLAST, TLC300, 0x0000, 0xffff, UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(TREK, MEMKEY, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(TREK, THUMBDRIVE_8MB, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(TRUMPION, C3310, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_UFI), + USB_QUIRK(TRUMPION, MP3, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_RBC), + USB_QUIRK(TRUMPION, T33520, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(TWINMOS, MDIV, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI), + USB_QUIRK(VIA, USB2IDEBRIDGE, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(VIVITAR, 35XX, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(WESTERN, COMBO, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(WESTERN, EXTHDD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(WESTERN, MYBOOK, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY_EVPD, + UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(WESTERN, MYPASSWORD, 0x0000, 0xffff, UQ_MSC_FORCE_SHORT_INQ), + USB_QUIRK(WINMAXGROUP, FLASH64MC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY), + USB_QUIRK(YANO, FW800HD, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_NO_START_STOP, UQ_MSC_IGNORE_RESIDUE), + USB_QUIRK(YANO, U640MO, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_ATAPI, UQ_MSC_FORCE_SHORT_INQ), + USB_QUIRK(YEDATA, FLASHBUSTERU, 0x0000, 0x007F, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(YEDATA, FLASHBUSTERU, 0x0080, 0x0080, UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED, + UQ_MSC_NO_TEST_UNIT_READY, UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(YEDATA, FLASHBUSTERU, 0x0081, 0xFFFF, UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_UFI, UQ_MSC_NO_RS_CLEAR_UA, UQ_MSC_FLOPPY_SPEED, + UQ_MSC_NO_GETMAXLUN), + USB_QUIRK(ZORAN, EX20DSC, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_PROTO_ATAPI), + USB_QUIRK(MEIZU, M6_SL, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_INQUIRY, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(ACTIONS, MP4, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_SYNC_CACHE), + USB_QUIRK(ASUS, GMSC, 0x0000, 0xffff, UQ_MSC_NO_SYNC_CACHE), }; +#undef USB_QUIRK_VP +#undef USB_QUIRK static const char *usb_quirk_str[USB_QUIRK_MAX] = { [UQ_NONE] = "UQ_NONE", + [UQ_MATCH_VENDOR_ONLY] = "UQ_MATCH_VENDOR_ONLY", [UQ_AUDIO_SWAP_LR] = "UQ_AUDIO_SWAP_LR", [UQ_AU_INP_ASYNC] = "UQ_AU_INP_ASYNC", [UQ_AU_NO_FRAC] = "UQ_AU_NO_FRAC", @@ -138,6 +459,7 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = { [UQ_BUS_POWERED] = "UQ_BUS_POWERED", [UQ_HID_IGNORE] = "UQ_HID_IGNORE", [UQ_KBD_IGNORE] = "UQ_KBD_IGNORE", + [UQ_KBD_BOOTPROTO] = "UQ_KBD_BOOTPROTO", [UQ_MS_BAD_CLASS] = "UQ_MS_BAD_CLASS", [UQ_MS_LEADING_BYTE] = "UQ_MS_LEADING_BYTE", [UQ_MS_REVZ] = "UQ_MS_REVZ", @@ -151,6 +473,29 @@ static const char *usb_quirk_str[USB_QUIRK_MAX] = { [UQ_CFG_INDEX_3] = "UQ_CFG_INDEX_3", [UQ_CFG_INDEX_4] = "UQ_CFG_INDEX_4", [UQ_CFG_INDEX_0] = "UQ_CFG_INDEX_0", + [UQ_ASSUME_CM_OVER_DATA] = "UQ_ASSUME_CM_OVER_DATA", + [UQ_MSC_NO_TEST_UNIT_READY] = "UQ_MSC_NO_TEST_UNIT_READY", + [UQ_MSC_NO_RS_CLEAR_UA] = "UQ_MSC_NO_RS_CLEAR_UA", + [UQ_MSC_NO_START_STOP] = "UQ_MSC_NO_START_STOP", + [UQ_MSC_NO_GETMAXLUN] = "UQ_MSC_NO_GETMAXLUN", + [UQ_MSC_NO_INQUIRY] = "UQ_MSC_NO_INQUIRY", + [UQ_MSC_NO_INQUIRY_EVPD] = "UQ_MSC_NO_INQUIRY_EVPD", + [UQ_MSC_NO_SYNC_CACHE] = "UQ_MSC_NO_SYNC_CACHE", + [UQ_MSC_SHUTTLE_INIT] = "UQ_MSC_SHUTTLE_INIT", + [UQ_MSC_ALT_IFACE_1] = "UQ_MSC_ALT_IFACE_1", + [UQ_MSC_FLOPPY_SPEED] = "UQ_MSC_FLOPPY_SPEED", + [UQ_MSC_IGNORE_RESIDUE] = "UQ_MSC_IGNORE_RESIDUE", + [UQ_MSC_WRONG_CSWSIG] = "UQ_MSC_WRONG_CSWSIG", + [UQ_MSC_RBC_PAD_TO_12] = "UQ_MSC_RBC_PAD_TO_12", + [UQ_MSC_READ_CAP_OFFBY1] = "UQ_MSC_READ_CAP_OFFBY1", + [UQ_MSC_FORCE_SHORT_INQ] = "UQ_MSC_FORCE_SHORT_INQ", + [UQ_MSC_FORCE_WIRE_BBB] = "UQ_MSC_FORCE_WIRE_BBB", + [UQ_MSC_FORCE_WIRE_CBI] = "UQ_MSC_FORCE_WIRE_CBI", + [UQ_MSC_FORCE_WIRE_CBI_I] = "UQ_MSC_FORCE_WIRE_CBI_I", + [UQ_MSC_FORCE_PROTO_SCSI] = "UQ_MSC_FORCE_PROTO_SCSI", + [UQ_MSC_FORCE_PROTO_ATAPI] = "UQ_MSC_FORCE_PROTO_ATAPI", + [UQ_MSC_FORCE_PROTO_UFI] = "UQ_MSC_FORCE_PROTO_UFI", + [UQ_MSC_FORCE_PROTO_RBC] = "UQ_MSC_FORCE_PROTO_RBC", }; /*------------------------------------------------------------------------* @@ -186,11 +531,22 @@ usb_test_quirk_by_info(const struct usbd_lookup_info *info, uint16_t quirk) for (x = 0; x != USB_DEV_QUIRKS_MAX; x++) { /* see if quirk information does not match */ if ((usb_quirks[x].vid != info->idVendor) || - (usb_quirks[x].pid != info->idProduct) || (usb_quirks[x].lo_rev > info->bcdDevice) || (usb_quirks[x].hi_rev < info->bcdDevice)) { continue; } + /* see if quirk only should match vendor ID */ + if (usb_quirks[x].pid != info->idProduct) { + if (usb_quirks[x].pid != 0) + continue; + + for (y = 0; y != USB_SUB_QUIRKS_MAX; y++) { + if (usb_quirks[x].quirks[y] == UQ_MATCH_VENDOR_ONLY) + break; + } + if (y == USB_SUB_QUIRKS_MAX) + continue; + } /* lookup quirk */ for (y = 0; y != USB_SUB_QUIRKS_MAX; y++) { if (usb_quirks[x].quirks[y] == quirk) { @@ -325,6 +681,10 @@ usb_quirk_ioctl(unsigned long cmd, caddr_t data, mtx_lock(&usb_quirk_mtx); pqe = usb_quirk_get_entry(pgq->vid, pgq->pid, pgq->bcdDeviceLow, pgq->bcdDeviceHigh, 1); + if (pqe == NULL) { + mtx_unlock(&usb_quirk_mtx); + return (EINVAL); + } for (x = 0; x != USB_SUB_QUIRKS_MAX; x++) { if (pqe->quirks[x] == UQ_NONE) { pqe->quirks[x] = y; @@ -359,6 +719,10 @@ usb_quirk_ioctl(unsigned long cmd, caddr_t data, mtx_lock(&usb_quirk_mtx); pqe = usb_quirk_get_entry(pgq->vid, pgq->pid, pgq->bcdDeviceLow, pgq->bcdDeviceHigh, 0); + if (pqe == NULL) { + mtx_unlock(&usb_quirk_mtx); + return (EINVAL); + } for (x = 0; x != USB_SUB_QUIRKS_MAX; x++) { if (pqe->quirks[x] == y) { pqe->quirks[x] = UQ_NONE; diff --git a/sys/dev/usb/quirk/usb_quirk.h b/sys/dev/usb/quirk/usb_quirk.h index f4fb9b9fdc95..d68140262ce0 100644 --- a/sys/dev/usb/quirk/usb_quirk.h +++ b/sys/dev/usb/quirk/usb_quirk.h @@ -30,6 +30,11 @@ /* NOTE: UQ_NONE is not a valid quirk */ enum { /* keep in sync with usb_quirk_str table */ UQ_NONE, + + UQ_MATCH_VENDOR_ONLY, + + /* Various quirks */ + UQ_AUDIO_SWAP_LR, /* left and right sound channels are swapped */ UQ_AU_INP_ASYNC, /* input is async despite claim of adaptive */ UQ_AU_NO_FRAC, /* don't adjust for fractional samples */ @@ -40,6 +45,7 @@ enum { /* keep in sync with usb_quirk_str table */ UQ_BUS_POWERED, /* device is bus powered, despite claim */ UQ_HID_IGNORE, /* device should be ignored by hid class */ UQ_KBD_IGNORE, /* device should be ignored by kbd class */ + UQ_KBD_BOOTPROTO, /* device should set the boot protocol */ UQ_MS_BAD_CLASS, /* doesn't identify properly */ UQ_MS_LEADING_BYTE, /* mouse sends an unknown leading byte */ UQ_MS_REVZ, /* mouse has Z-axis reversed */ @@ -53,6 +59,32 @@ enum { /* keep in sync with usb_quirk_str table */ UQ_CFG_INDEX_3, /* select configuration index 3 by default */ UQ_CFG_INDEX_4, /* select configuration index 4 by default */ UQ_CFG_INDEX_0, /* select configuration index 0 by default */ + UQ_ASSUME_CM_OVER_DATA, /* modem device breaks on cm over data */ + + /* USB Mass Storage Quirks. See "storage/umass.c" for a detailed description. */ + UQ_MSC_NO_TEST_UNIT_READY, + UQ_MSC_NO_RS_CLEAR_UA, + UQ_MSC_NO_START_STOP, + UQ_MSC_NO_GETMAXLUN, + UQ_MSC_NO_INQUIRY, + UQ_MSC_NO_INQUIRY_EVPD, + UQ_MSC_NO_SYNC_CACHE, + UQ_MSC_SHUTTLE_INIT, + UQ_MSC_ALT_IFACE_1, + UQ_MSC_FLOPPY_SPEED, + UQ_MSC_IGNORE_RESIDUE, + UQ_MSC_WRONG_CSWSIG, + UQ_MSC_RBC_PAD_TO_12, + UQ_MSC_READ_CAP_OFFBY1, + UQ_MSC_FORCE_SHORT_INQ, + UQ_MSC_FORCE_WIRE_BBB, + UQ_MSC_FORCE_WIRE_CBI, + UQ_MSC_FORCE_WIRE_CBI_I, + UQ_MSC_FORCE_PROTO_SCSI, + UQ_MSC_FORCE_PROTO_ATAPI, + UQ_MSC_FORCE_PROTO_UFI, + UQ_MSC_FORCE_PROTO_RBC, + USB_QUIRK_MAX }; diff --git a/sys/dev/usb/serial/u3g.c b/sys/dev/usb/serial/u3g.c index 398d6b1f89fe..0d218d548bf6 100644 --- a/sys/dev/usb/serial/u3g.c +++ b/sys/dev/usb/serial/u3g.c @@ -59,9 +59,7 @@ #define USB_DEBUG_VAR u3g_debug #include #include -#include #include -#include #include @@ -86,10 +84,15 @@ SYSCTL_INT(_hw_usb_u3g, OID_AUTO, debug, CTLFLAG_RW, #define U3GSP_HSPA 6 #define U3GSP_MAX 7 -#define U3GFL_HUAWEI_INIT 0x0001 /* Init command required */ -#define U3GFL_SCSI_EJECT 0x0002 /* SCSI eject command required */ -#define U3GFL_SIERRA_INIT 0x0004 /* Init command required */ -#define U3GFL_SAEL_M460_INIT 0x0008 /* Init device */ +#define U3GINIT_HUAWEI 1 /* Requires Huawei init command */ +#define U3GINIT_SIERRA 2 /* Requires Sierra init command */ +#define U3GINIT_SCSIEJECT 3 /* Requires SCSI eject command */ +#define U3GINIT_REZERO 4 /* Requires SCSI rezero command */ +#define U3GINIT_ZTESTOR 5 /* Requires ZTE SCSI command */ +#define U3GINIT_CMOTECH 6 /* Requires CMOTECH SCSI command */ +#define U3GINIT_WAIT 7 /* Device reappears after a delay */ +#define U3GINIT_SAEL_M460 8 /* Requires vendor init */ +#define U3GINIT_HUAWEISCSI 9 /* Requires Huawei SCSI init command */ enum { U3G_BULK_WR, @@ -122,8 +125,13 @@ static void u3g_stop_read(struct ucom_softc *ucom); static void u3g_start_write(struct ucom_softc *ucom); static void u3g_stop_write(struct ucom_softc *ucom); + +static void u3g_test_autoinst(void *, struct usb_device *, + struct usb_attach_arg *); static int u3g_driver_loaded(struct module *mod, int what, void *arg); +static eventhandler_tag u3g_etag; + static const struct usb_config u3g_config[U3G_N_TRANSFER] = { [U3G_BULK_WR] = { @@ -173,29 +181,125 @@ MODULE_DEPEND(u3g, usb, 1, 1, 1); static const struct usb_device_id u3g_devs[] = { #define U3G_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) } - /* OEM: Option */ - U3G_DEV(OPTION, GT3G, 0), - U3G_DEV(OPTION, GT3GQUAD, 0), - U3G_DEV(OPTION, GT3GPLUS, 0), - U3G_DEV(OPTION, GTMAX36, 0), - U3G_DEV(OPTION, GTHSDPA, 0), - U3G_DEV(OPTION, GTMAXHSUPA, 0), - U3G_DEV(OPTION, VODAFONEMC3G, 0), - /* OEM: Qualcomm, Inc. */ - U3G_DEV(QUALCOMMINC, ZTE_STOR, U3GFL_SCSI_EJECT), - U3G_DEV(QUALCOMMINC, CDMA_MSM, U3GFL_SCSI_EJECT), - /* OEM: Huawei */ - U3G_DEV(HUAWEI, MOBILE, U3GFL_HUAWEI_INIT), - U3G_DEV(HUAWEI, E180V, U3GFL_HUAWEI_INIT), - U3G_DEV(HUAWEI, E220, U3GFL_HUAWEI_INIT), - /* OEM: Novatel */ - U3G_DEV(NOVATEL, CDMA_MODEM, 0), + U3G_DEV(ACERP, H10, 0), + U3G_DEV(AIRPLUS, MCD650, 0), + U3G_DEV(AIRPRIME, PC5220, 0), + U3G_DEV(ALINK, 3G, 0), + U3G_DEV(ALINK, 3GU, 0), + U3G_DEV(ALINK, DWM652U5, 0), + U3G_DEV(AMOI, H01, 0), + U3G_DEV(AMOI, H01A, 0), + U3G_DEV(AMOI, H02, 0), + U3G_DEV(ANYDATA, ADU_500A, 0), + U3G_DEV(ANYDATA, ADU_620UW, 0), + U3G_DEV(ANYDATA, ADU_E100X, 0), + U3G_DEV(AXESSTEL, DATAMODEM, 0), + U3G_DEV(CMOTECH, CDMA_MODEM1, 0), + U3G_DEV(CMOTECH, CGU628, U3GINIT_CMOTECH), + U3G_DEV(DELL, U5500, 0), + U3G_DEV(DELL, U5505, 0), + U3G_DEV(DELL, U5510, 0), + U3G_DEV(DELL, U5520, 0), + U3G_DEV(DELL, U5520_2, 0), + U3G_DEV(DELL, U5520_3, 0), + U3G_DEV(DELL, U5700, 0), + U3G_DEV(DELL, U5700_2, 0), + U3G_DEV(DELL, U5700_3, 0), + U3G_DEV(DELL, U5700_4, 0), + U3G_DEV(DELL, U5720, 0), + U3G_DEV(DELL, U5720_2, 0), + U3G_DEV(DELL, U5730, 0), + U3G_DEV(DELL, U5730_2, 0), + U3G_DEV(DELL, U5730_3, 0), + U3G_DEV(DELL, U740, 0), + U3G_DEV(DLINK3, DWM652, 0), + U3G_DEV(HP, EV2200, 0), + U3G_DEV(HP, HS2300, 0), + U3G_DEV(HUAWEI, E1401, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1402, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1403, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1404, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1405, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1406, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1407, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1408, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1409, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E140A, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E140B, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E140D, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E140E, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E140F, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1410, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1411, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1412, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1413, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1414, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1415, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1416, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1417, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1418, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1419, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E141A, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E141B, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E141C, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E141D, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E141E, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E141F, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1420, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1421, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1422, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1423, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1424, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1425, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1426, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1427, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1428, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1429, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E142A, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E142B, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E142C, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E142D, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E142E, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E142F, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1430, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1431, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1432, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1433, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1434, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1435, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1436, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1437, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1438, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1439, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E143A, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E143B, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E143C, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E143D, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E143E, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E143F, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E14AC, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E180V, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E220, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E220BIS, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, MOBILE, U3GINIT_HUAWEI), + U3G_DEV(HUAWEI, E1752, U3GINIT_HUAWEISCSI), + U3G_DEV(KYOCERA2, CDMA_MSM_K, 0), + U3G_DEV(KYOCERA2, KPC680, 0), + U3G_DEV(MERLIN, V620, 0), + U3G_DEV(NOVATEL, E725, 0), U3G_DEV(NOVATEL, ES620, 0), + U3G_DEV(NOVATEL, ES620_2, 0), + U3G_DEV(NOVATEL, EU730, 0), + U3G_DEV(NOVATEL, EU740, 0), + U3G_DEV(NOVATEL, EU870D, 0), + U3G_DEV(NOVATEL, MC760, 0), U3G_DEV(NOVATEL, MC950D, 0), U3G_DEV(NOVATEL, U720, 0), U3G_DEV(NOVATEL, U727, 0), + U3G_DEV(NOVATEL, U727_2, 0), U3G_DEV(NOVATEL, U740, 0), U3G_DEV(NOVATEL, U740_2, 0), + U3G_DEV(NOVATEL, U760, U3GINIT_SCSIEJECT), U3G_DEV(NOVATEL, U870, 0), U3G_DEV(NOVATEL, V620, 0), U3G_DEV(NOVATEL, V640, 0), @@ -203,51 +307,209 @@ static const struct usb_device_id u3g_devs[] = { U3G_DEV(NOVATEL, V740, 0), U3G_DEV(NOVATEL, X950D, 0), U3G_DEV(NOVATEL, XU870, 0), - U3G_DEV(NOVATEL, ZEROCD, U3GFL_SCSI_EJECT), - U3G_DEV(DELL, U740, 0), - /* OEM: Merlin */ - U3G_DEV(MERLIN, V620, 0), - /* OEM: Sierra Wireless: */ - U3G_DEV(SIERRA, AIRCARD580, 0), - U3G_DEV(SIERRA, AIRCARD595, 0), + U3G_DEV(OPTION, E6500, 0), + U3G_DEV(OPTION, E6501, 0), + U3G_DEV(OPTION, E6601, 0), + U3G_DEV(OPTION, E6721, 0), + U3G_DEV(OPTION, E6741, 0), + U3G_DEV(OPTION, E6761, 0), + U3G_DEV(OPTION, E6800, 0), + U3G_DEV(OPTION, E7021, 0), + U3G_DEV(OPTION, E7041, 0), + U3G_DEV(OPTION, E7061, 0), + U3G_DEV(OPTION, E7100, 0), + U3G_DEV(OPTION, GE40X, 0), + U3G_DEV(OPTION, GT3G, 0), + U3G_DEV(OPTION, GT3GPLUS, 0), + U3G_DEV(OPTION, GT3GQUAD, 0), + U3G_DEV(OPTION, GT3G_1, 0), + U3G_DEV(OPTION, GT3G_2, 0), + U3G_DEV(OPTION, GT3G_3, 0), + U3G_DEV(OPTION, GT3G_4, 0), + U3G_DEV(OPTION, GT3G_5, 0), + U3G_DEV(OPTION, GT3G_6, 0), + U3G_DEV(OPTION, GTHSDPA, 0), + U3G_DEV(OPTION, GTM380, 0), + U3G_DEV(OPTION, GTMAX36, 0), + U3G_DEV(OPTION, GTMAX380HSUPAE, 0), + U3G_DEV(OPTION, GTMAXHSUPA, 0), + U3G_DEV(OPTION, GTMAXHSUPAE, 0), + U3G_DEV(OPTION, VODAFONEMC3G, 0), + U3G_DEV(QISDA, H20_1, 0), + U3G_DEV(QISDA, H20_2, 0), + U3G_DEV(QISDA, H21_1, 0), + U3G_DEV(QISDA, H21_2, 0), + U3G_DEV(QUALCOMM2, AC8700, 0), + U3G_DEV(QUALCOMM2, MF330, 0), + U3G_DEV(QUALCOMMINC, AC2726, 0), + U3G_DEV(QUALCOMMINC, AC8700, 0), + U3G_DEV(QUALCOMMINC, AC8710, 0), + U3G_DEV(QUALCOMMINC, CDMA_MSM, U3GINIT_SCSIEJECT), + U3G_DEV(QUALCOMMINC, E0002, 0), + U3G_DEV(QUALCOMMINC, E0003, 0), + U3G_DEV(QUALCOMMINC, E0004, 0), + U3G_DEV(QUALCOMMINC, E0005, 0), + U3G_DEV(QUALCOMMINC, E0006, 0), + U3G_DEV(QUALCOMMINC, E0007, 0), + U3G_DEV(QUALCOMMINC, E0008, 0), + U3G_DEV(QUALCOMMINC, E0009, 0), + U3G_DEV(QUALCOMMINC, E000A, 0), + U3G_DEV(QUALCOMMINC, E000B, 0), + U3G_DEV(QUALCOMMINC, E000C, 0), + U3G_DEV(QUALCOMMINC, E000D, 0), + U3G_DEV(QUALCOMMINC, E000E, 0), + U3G_DEV(QUALCOMMINC, E000F, 0), + U3G_DEV(QUALCOMMINC, E0010, 0), + U3G_DEV(QUALCOMMINC, E0011, 0), + U3G_DEV(QUALCOMMINC, E0012, 0), + U3G_DEV(QUALCOMMINC, E0013, 0), + U3G_DEV(QUALCOMMINC, E0014, 0), + U3G_DEV(QUALCOMMINC, E0017, 0), + U3G_DEV(QUALCOMMINC, E0018, 0), + U3G_DEV(QUALCOMMINC, E0019, 0), + U3G_DEV(QUALCOMMINC, E0020, 0), + U3G_DEV(QUALCOMMINC, E0021, 0), + U3G_DEV(QUALCOMMINC, E0022, 0), + U3G_DEV(QUALCOMMINC, E0023, 0), + U3G_DEV(QUALCOMMINC, E0024, 0), + U3G_DEV(QUALCOMMINC, E0025, 0), + U3G_DEV(QUALCOMMINC, E0026, 0), + U3G_DEV(QUALCOMMINC, E0027, 0), + U3G_DEV(QUALCOMMINC, E0028, 0), + U3G_DEV(QUALCOMMINC, E0029, 0), + U3G_DEV(QUALCOMMINC, E0030, 0), + U3G_DEV(QUALCOMMINC, E0032, 0), + U3G_DEV(QUALCOMMINC, E0033, 0), + U3G_DEV(QUALCOMMINC, E0037, 0), + U3G_DEV(QUALCOMMINC, E0039, 0), + U3G_DEV(QUALCOMMINC, E0042, 0), + U3G_DEV(QUALCOMMINC, E0043, 0), + U3G_DEV(QUALCOMMINC, E0048, 0), + U3G_DEV(QUALCOMMINC, E0049, 0), + U3G_DEV(QUALCOMMINC, E0051, 0), + U3G_DEV(QUALCOMMINC, E0052, 0), + U3G_DEV(QUALCOMMINC, E0054, 0), + U3G_DEV(QUALCOMMINC, E0055, 0), + U3G_DEV(QUALCOMMINC, E0057, 0), + U3G_DEV(QUALCOMMINC, E0058, 0), + U3G_DEV(QUALCOMMINC, E0059, 0), + U3G_DEV(QUALCOMMINC, E0060, 0), + U3G_DEV(QUALCOMMINC, E0061, 0), + U3G_DEV(QUALCOMMINC, E0062, 0), + U3G_DEV(QUALCOMMINC, E0063, 0), + U3G_DEV(QUALCOMMINC, E0064, 0), + U3G_DEV(QUALCOMMINC, E0066, 0), + U3G_DEV(QUALCOMMINC, E0069, 0), + U3G_DEV(QUALCOMMINC, E0070, 0), + U3G_DEV(QUALCOMMINC, E0073, 0), + U3G_DEV(QUALCOMMINC, E0076, 0), + U3G_DEV(QUALCOMMINC, E0078, 0), + U3G_DEV(QUALCOMMINC, E0082, 0), + U3G_DEV(QUALCOMMINC, E0086, 0), + U3G_DEV(QUALCOMMINC, E2002, 0), + U3G_DEV(QUALCOMMINC, E2003, 0), + U3G_DEV(QUALCOMMINC, MF626, 0), + U3G_DEV(QUALCOMMINC, MF628, 0), + U3G_DEV(QUALCOMMINC, MF633R, 0), + U3G_DEV(QUANTA, GKE, 0), + U3G_DEV(QUANTA, GLE, 0), + U3G_DEV(QUANTA, GLX, 0), + U3G_DEV(QUANTA, Q101, 0), + U3G_DEV(QUANTA, Q111, 0), + U3G_DEV(SIERRA, AC402, 0), U3G_DEV(SIERRA, AC595U, 0), U3G_DEV(SIERRA, AC597E, 0), - U3G_DEV(SIERRA, C597, 0), + U3G_DEV(SIERRA, AC875E, 0), + U3G_DEV(SIERRA, AC875U, 0), + U3G_DEV(SIERRA, AC875U_2, 0), U3G_DEV(SIERRA, AC880, 0), U3G_DEV(SIERRA, AC880E, 0), U3G_DEV(SIERRA, AC880U, 0), U3G_DEV(SIERRA, AC881, 0), U3G_DEV(SIERRA, AC881E, 0), U3G_DEV(SIERRA, AC881U, 0), + U3G_DEV(SIERRA, AC885E, 0), + U3G_DEV(SIERRA, AC885E_2, 0), U3G_DEV(SIERRA, AC885U, 0), + U3G_DEV(SIERRA, AIRCARD580, 0), + U3G_DEV(SIERRA, AIRCARD595, 0), + U3G_DEV(SIERRA, AIRCARD875, 0), + U3G_DEV(SIERRA, C22, 0), + U3G_DEV(SIERRA, C597, 0), + U3G_DEV(SIERRA, C888, 0), + U3G_DEV(SIERRA, E0029, 0), + U3G_DEV(SIERRA, E6892, 0), + U3G_DEV(SIERRA, E6893, 0), U3G_DEV(SIERRA, EM5625, 0), + U3G_DEV(SIERRA, EM5725, 0), U3G_DEV(SIERRA, MC5720, 0), U3G_DEV(SIERRA, MC5720_2, 0), U3G_DEV(SIERRA, MC5725, 0), - U3G_DEV(SIERRA, MINI5725, 0), - U3G_DEV(SIERRA, AIRCARD875, 0), + U3G_DEV(SIERRA, MC5727, 0), + U3G_DEV(SIERRA, MC5727_2, 0), + U3G_DEV(SIERRA, MC5728, 0), U3G_DEV(SIERRA, MC8755, 0), U3G_DEV(SIERRA, MC8755_2, 0), U3G_DEV(SIERRA, MC8755_3, 0), + U3G_DEV(SIERRA, MC8755_4, 0), U3G_DEV(SIERRA, MC8765, 0), - U3G_DEV(SIERRA, AC875U, 0), + U3G_DEV(SIERRA, MC8765_2, 0), + U3G_DEV(SIERRA, MC8765_3, 0), + U3G_DEV(SIERRA, MC8775, 0), U3G_DEV(SIERRA, MC8775_2, 0), U3G_DEV(SIERRA, MC8780, 0), + U3G_DEV(SIERRA, MC8780_2, 0), + U3G_DEV(SIERRA, MC8780_3, 0), U3G_DEV(SIERRA, MC8781, 0), - U3G_DEV(HP, HS2300, 0), - /* Sierra TruInstaller device ID */ - U3G_DEV(SIERRA, TRUINSTALL, U3GFL_SIERRA_INIT), - /* PRUEBA SILABS */ - U3G_DEV(SILABS, SAEL, U3GFL_SAEL_M460_INIT), + U3G_DEV(SIERRA, MC8781_2, 0), + U3G_DEV(SIERRA, MC8781_3, 0), + U3G_DEV(SIERRA, MC8785, 0), + U3G_DEV(SIERRA, MC8785_2, 0), + U3G_DEV(SIERRA, MC8790, 0), + U3G_DEV(SIERRA, MC8791, 0), + U3G_DEV(SIERRA, MC8792, 0), + U3G_DEV(SIERRA, MINI5725, 0), + U3G_DEV(SIERRA, T11, 0), + U3G_DEV(SIERRA, T598, 0), + U3G_DEV(SILABS, SAEL, U3GINIT_SAEL_M460), + U3G_DEV(STELERA, C105, 0), + U3G_DEV(STELERA, E1003, 0), + U3G_DEV(STELERA, E1004, 0), + U3G_DEV(STELERA, E1005, 0), + U3G_DEV(STELERA, E1006, 0), + U3G_DEV(STELERA, E1007, 0), + U3G_DEV(STELERA, E1008, 0), + U3G_DEV(STELERA, E1009, 0), + U3G_DEV(STELERA, E100A, 0), + U3G_DEV(STELERA, E100B, 0), + U3G_DEV(STELERA, E100C, 0), + U3G_DEV(STELERA, E100D, 0), + U3G_DEV(STELERA, E100E, 0), + U3G_DEV(STELERA, E100F, 0), + U3G_DEV(STELERA, E1010, 0), + U3G_DEV(STELERA, E1011, 0), + U3G_DEV(STELERA, E1012, 0), + U3G_DEV(TCTMOBILE, X060S, 0), + U3G_DEV(TELIT, UC864E, 0), + U3G_DEV(TELIT, UC864G, 0), + U3G_DEV(TLAYTECH, TEU800, 0), + U3G_DEV(TOSHIBA, G450, 0), + U3G_DEV(TOSHIBA, HSDPA, 0), + U3G_DEV(YISO, C893, 0), + /* Autoinstallers */ + U3G_DEV(NOVATEL, ZEROCD, U3GINIT_SCSIEJECT), + U3G_DEV(OPTION, GTICON322, U3GINIT_REZERO), + U3G_DEV(QUALCOMMINC, ZTE_STOR, U3GINIT_ZTESTOR), + U3G_DEV(QUALCOMMINC, ZTE_STOR2, U3GINIT_SCSIEJECT), + U3G_DEV(SIERRA, TRUINSTALL, U3GINIT_SIERRA), +#undef U3G_DEV }; -static void +static int u3g_sierra_init(struct usb_device *udev) { struct usb_device_request req; - DPRINTFN(0, "\n"); - req.bmRequestType = UT_VENDOR; req.bRequest = UR_SET_INTERFACE; USETW(req.wValue, UF_DEVICE_REMOTE_WAKEUP); @@ -258,16 +520,14 @@ u3g_sierra_init(struct usb_device *udev) NULL, 0, NULL, USB_MS_HZ)) { /* ignore any errors */ } - return; + return (0); } -static void +static int u3g_huawei_init(struct usb_device *udev) { struct usb_device_request req; - DPRINTFN(0, "\n"); - req.bmRequestType = UT_WRITE_DEVICE; req.bRequest = UR_SET_FEATURE; USETW(req.wValue, UF_DEVICE_REMOTE_WAKEUP); @@ -278,7 +538,7 @@ u3g_huawei_init(struct usb_device *udev) NULL, 0, NULL, USB_MS_HZ)) { /* ignore any errors */ } - return; + return (0); } static void @@ -361,58 +621,67 @@ u3g_sael_m460_init(struct usb_device *udev) } } -static int -u3g_lookup_huawei(struct usb_attach_arg *uaa) -{ - /* Calling the lookup function will also set the driver info! */ - return (usbd_lookup_id_by_uaa(u3g_devs, sizeof(u3g_devs), uaa)); -} - /* * The following function handles 3G modem devices (E220, Mobile, * etc.) with auto-install flash disks for Windows/MacOSX on the first * interface. After some command or some delay they change appearance * to a modem. */ -static usb_error_t -u3g_test_huawei_autoinst(struct usb_device *udev, +static void +u3g_test_autoinst(void *arg, struct usb_device *udev, struct usb_attach_arg *uaa) { struct usb_interface *iface; struct usb_interface_descriptor *id; - uint32_t flags; + int error; + + if (uaa->dev_state != UAA_DEV_READY) + return; - if (udev == NULL) { - return (USB_ERR_INVAL); - } iface = usbd_get_iface(udev, 0); - if (iface == NULL) { - return (USB_ERR_INVAL); - } + if (iface == NULL) + return; id = iface->idesc; - if (id == NULL) { - return (USB_ERR_INVAL); - } - if (id->bInterfaceClass != UICLASS_MASS) { - return (USB_ERR_INVAL); - } - if (u3g_lookup_huawei(uaa)) { - /* no device match */ - return (USB_ERR_INVAL); - } - flags = USB_GET_DRIVER_INFO(uaa); + if (id == NULL || id->bInterfaceClass != UICLASS_MASS) + return; + if (usbd_lookup_id_by_uaa(u3g_devs, sizeof(u3g_devs), uaa)) + return; /* no device match */ - if (flags & U3GFL_HUAWEI_INIT) { - u3g_huawei_init(udev); - } else if (flags & U3GFL_SCSI_EJECT) { - return (usb_test_autoinstall(udev, 0, 1)); - } else if (flags & U3GFL_SIERRA_INIT) { - u3g_sierra_init(udev); - } else { - /* no quirks */ - return (USB_ERR_INVAL); + switch (USB_GET_DRIVER_INFO(uaa)) { + case U3GINIT_HUAWEI: + error = u3g_huawei_init(udev); + break; + case U3GINIT_HUAWEISCSI: + error = usb_msc_eject(udev, 0, MSC_EJECT_HUAWEI); + break; + case U3GINIT_SCSIEJECT: + error = usb_msc_eject(udev, 0, MSC_EJECT_STOPUNIT); + break; + case U3GINIT_REZERO: + error = usb_msc_eject(udev, 0, MSC_EJECT_REZERO); + break; + case U3GINIT_ZTESTOR: + error = usb_msc_eject(udev, 0, MSC_EJECT_ZTESTOR); + break; + case U3GINIT_CMOTECH: + error = usb_msc_eject(udev, 0, MSC_EJECT_CMOTECH); + break; + case U3GINIT_SIERRA: + error = u3g_sierra_init(udev); + break; + case U3GINIT_WAIT: + /* Just pretend we ejected, the card will timeout */ + error = 0; + break; + default: + /* no 3G eject quirks */ + error = EOPNOTSUPP; + break; + } + if (error == 0) { + /* success, mark the udev as disappearing */ + uaa->dev_state = UAA_DEV_EJECTING; } - return (0); /* success */ } static int @@ -421,10 +690,11 @@ u3g_driver_loaded(struct module *mod, int what, void *arg) switch (what) { case MOD_LOAD: /* register our autoinstall handler */ - usb_test_huawei_autoinst_p = &u3g_test_huawei_autoinst; + u3g_etag = EVENTHANDLER_REGISTER(usb_dev_configured, + u3g_test_autoinst, NULL, EVENTHANDLER_PRI_ANY); break; case MOD_UNLOAD: - usb_test_huawei_unload(NULL); + EVENTHANDLER_DEREGISTER(usb_dev_configured, u3g_etag); break; default: return (EOPNOTSUPP); @@ -446,7 +716,7 @@ u3g_probe(device_t self) if (uaa->info.bInterfaceClass != UICLASS_VENDOR) { return (ENXIO); } - return (u3g_lookup_huawei(uaa)); + return (usbd_lookup_id_by_uaa(u3g_devs, sizeof(u3g_devs), uaa)); } static int @@ -458,15 +728,14 @@ u3g_attach(device_t dev) struct usb_interface *iface; struct usb_interface_descriptor *id; uint32_t iface_valid; - int error, flags, nports; + int error, type, nports; int ep, n; uint8_t i; DPRINTF("sc=%p\n", sc); - flags = USB_GET_DRIVER_INFO(uaa); - - if (flags & U3GFL_SAEL_M460_INIT) + type = USB_GET_DRIVER_INFO(uaa); + if (type == U3GINIT_SAEL_M460) u3g_sael_m460_init(uaa->device); /* copy in USB config */ @@ -538,8 +807,8 @@ u3g_attach(device_t dev) DPRINTF("ucom_attach failed\n"); goto detach; } - if (sc->sc_numports > 1) - device_printf(dev, "Found %u ports.\n", sc->sc_numports); + device_printf(dev, "Found %u port%s.\n", sc->sc_numports, + sc->sc_numports > 1 ? "s":""); return (0); detach: diff --git a/sys/dev/usb/serial/uark.c b/sys/dev/usb/serial/uark.c index cff124eb0749..7dfb0f83f6e3 100644 --- a/sys/dev/usb/serial/uark.c +++ b/sys/dev/usb/serial/uark.c @@ -114,6 +114,7 @@ static void uark_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *); static void uark_cfg_set_break(struct ucom_softc *, uint8_t); static void uark_cfg_write(struct uark_softc *, uint16_t, uint16_t); +static void uark_poll(struct ucom_softc *ucom); static const struct usb_config uark_xfer_config[UARK_N_TRANSFER] = { @@ -146,6 +147,7 @@ static const struct ucom_callback uark_callback = { .ucom_stop_read = &uark_stop_read, .ucom_start_write = &uark_start_write, .ucom_stop_write = &uark_stop_write, + .ucom_poll = &uark_poll, }; static device_method_t uark_methods[] = { @@ -209,7 +211,7 @@ uark_attach(device_t dev) if (error) { device_printf(dev, "allocating control USB " - "transfers failed!\n"); + "transfers failed\n"); goto detach; } /* clear stall at first run */ @@ -431,3 +433,10 @@ uark_cfg_write(struct uark_softc *sc, uint16_t index, uint16_t value) "(ignored)\n", usbd_errstr(err)); } } + +static void +uark_poll(struct ucom_softc *ucom) +{ + struct uark_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UARK_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/ubsa.c b/sys/dev/usb/serial/ubsa.c index 3e8e61b7c6fd..32639fcc4034 100644 --- a/sys/dev/usb/serial/ubsa.c +++ b/sys/dev/usb/serial/ubsa.c @@ -194,6 +194,7 @@ static void ubsa_start_write(struct ucom_softc *); static void ubsa_stop_write(struct ucom_softc *); static void ubsa_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *); +static void ubsa_poll(struct ucom_softc *ucom); static const struct usb_config ubsa_config[UBSA_N_TRANSFER] = { @@ -236,6 +237,7 @@ static const struct ucom_callback ubsa_callback = { .ucom_stop_read = &ubsa_stop_read, .ucom_start_write = &ubsa_start_write, .ucom_stop_write = &ubsa_stop_write, + .ucom_poll = &ubsa_poll, }; static const struct usb_device_id ubsa_devs[] = { @@ -659,3 +661,11 @@ tr_setup: } } + +static void +ubsa_poll(struct ucom_softc *ucom) +{ + struct ubsa_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UBSA_N_TRANSFER); + +} diff --git a/sys/dev/usb/serial/ubser.c b/sys/dev/usb/serial/ubser.c index a2c29f94b3bb..06c96c026e5d 100644 --- a/sys/dev/usb/serial/ubser.c +++ b/sys/dev/usb/serial/ubser.c @@ -163,6 +163,7 @@ static void ubser_start_read(struct ucom_softc *); static void ubser_stop_read(struct ucom_softc *); static void ubser_start_write(struct ucom_softc *); static void ubser_stop_write(struct ucom_softc *); +static void ubser_poll(struct ucom_softc *ucom); static const struct usb_config ubser_config[UBSER_N_TRANSFER] = { @@ -193,6 +194,7 @@ static const struct ucom_callback ubser_callback = { .ucom_stop_read = &ubser_stop_read, .ucom_start_write = &ubser_start_write, .ucom_stop_write = &ubser_stop_write, + .ucom_poll = &ubser_poll, }; static device_method_t ubser_methods[] = { @@ -280,7 +282,7 @@ ubser_attach(device_t dev) sc->sc_tx_size = usbd_xfer_max_len(sc->sc_xfer[UBSER_BULK_DT_WR]); if (sc->sc_tx_size == 0) { - DPRINTFN(0, "invalid tx_size!\n"); + DPRINTFN(0, "invalid tx_size\n"); goto detach; } /* initialize port numbers */ @@ -535,3 +537,10 @@ ubser_stop_write(struct ucom_softc *ucom) usbd_transfer_stop(sc->sc_xfer[UBSER_BULK_DT_WR]); } + +static void +ubser_poll(struct ucom_softc *ucom) +{ + struct ubser_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UBSER_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/uchcom.c b/sys/dev/usb/serial/uchcom.c index 705d3e6fdf08..9fea8492fca8 100644 --- a/sys/dev/usb/serial/uchcom.c +++ b/sys/dev/usb/serial/uchcom.c @@ -66,7 +66,8 @@ __FBSDID("$FreeBSD$"); /* - * driver for WinChipHead CH341/340, the worst USB-serial chip in the world. + * Driver for WinChipHead CH341/340, the worst USB-serial chip in the + * world. */ #include @@ -206,6 +207,7 @@ static const struct uchcom_divider_record dividers[] = static const struct usb_device_id uchcom_devs[] = { {USB_VPI(USB_VENDOR_WCH, USB_PRODUCT_WCH_CH341SER, 0)}, + {USB_VPI(USB_VENDOR_WCH2, USB_PRODUCT_WCH2_CH341SER, 0)}, }; /* protypes */ @@ -213,6 +215,7 @@ static const struct usb_device_id uchcom_devs[] = { static int uchcom_pre_param(struct ucom_softc *, struct termios *); static void uchcom_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *); +static void uchcom_cfg_open(struct ucom_softc *ucom); static void uchcom_cfg_param(struct ucom_softc *, struct termios *); static void uchcom_cfg_set_break(struct ucom_softc *, uint8_t); static void uchcom_cfg_set_dtr(struct ucom_softc *, uint8_t); @@ -224,12 +227,10 @@ static void uchcom_stop_write(struct ucom_softc *); static void uchcom_update_version(struct uchcom_softc *); static void uchcom_convert_status(struct uchcom_softc *, uint8_t); static void uchcom_update_status(struct uchcom_softc *); -static void uchcom_set_dtrrts(struct uchcom_softc *); +static void uchcom_set_dtr_rts(struct uchcom_softc *); static int uchcom_calc_divider_settings(struct uchcom_divider *, uint32_t); -static void uchcom_set_dte_rate(struct uchcom_softc *, uint32_t); -static void uchcom_set_line_control(struct uchcom_softc *, tcflag_t); -static void uchcom_clear_chip(struct uchcom_softc *); -static void uchcom_reset_chip(struct uchcom_softc *); +static void uchcom_set_baudrate(struct uchcom_softc *, uint32_t); +static void uchcom_poll(struct ucom_softc *ucom); static device_probe_t uchcom_probe; static device_attach_t uchcom_attach; @@ -274,12 +275,14 @@ static struct ucom_callback uchcom_callback = { .ucom_cfg_set_dtr = &uchcom_cfg_set_dtr, .ucom_cfg_set_rts = &uchcom_cfg_set_rts, .ucom_cfg_set_break = &uchcom_cfg_set_break, + .ucom_cfg_open = &uchcom_cfg_open, .ucom_cfg_param = &uchcom_cfg_param, .ucom_pre_param = &uchcom_pre_param, .ucom_start_read = &uchcom_start_read, .ucom_stop_read = &uchcom_stop_read, .ucom_start_write = &uchcom_start_write, .ucom_stop_write = &uchcom_stop_write, + .ucom_poll = &uchcom_poll, }; /* ---------------------------------------------------------------------- @@ -339,17 +342,6 @@ uchcom_attach(device_t dev) "error=%s\n", usbd_errstr(error)); goto detach; } - /* - * Do the initialization during attach so that the system does not - * sleep during open: - */ - uchcom_update_version(sc); - uchcom_clear_chip(sc); - uchcom_reset_chip(sc); - uchcom_update_status(sc); - - sc->sc_dtr = 1; - sc->sc_rts = 1; /* clear stall at first run */ mtx_lock(&sc->sc_mtx); @@ -456,8 +448,7 @@ uchcom_get_version(struct uchcom_softc *sc, uint8_t *rver) { uint8_t buf[UCHCOM_INPUT_BUF_SIZE]; - uchcom_ctrl_read( - sc, UCHCOM_REQ_GET_VERSION, 0, 0, buf, sizeof(buf)); + uchcom_ctrl_read(sc, UCHCOM_REQ_GET_VERSION, 0, 0, buf, sizeof(buf)); if (rver) *rver = buf[0]; @@ -470,13 +461,13 @@ uchcom_get_status(struct uchcom_softc *sc, uint8_t *rval) } static void -uchcom_set_dtrrts_10(struct uchcom_softc *sc, uint8_t val) +uchcom_set_dtr_rts_10(struct uchcom_softc *sc, uint8_t val) { uchcom_write_reg(sc, UCHCOM_REG_STAT1, val, UCHCOM_REG_STAT1, val); } static void -uchcom_set_dtrrts_20(struct uchcom_softc *sc, uint8_t val) +uchcom_set_dtr_rts_20(struct uchcom_softc *sc, uint8_t val) { uchcom_ctrl_write(sc, UCHCOM_REQ_SET_DTRRTS, val, 0); } @@ -513,7 +504,7 @@ uchcom_update_status(struct uchcom_softc *sc) static void -uchcom_set_dtrrts(struct uchcom_softc *sc) +uchcom_set_dtr_rts(struct uchcom_softc *sc) { uint8_t val = 0; @@ -523,9 +514,9 @@ uchcom_set_dtrrts(struct uchcom_softc *sc) val |= UCHCOM_RTS_MASK; if (sc->sc_version < UCHCOM_VER_20) - uchcom_set_dtrrts_10(sc, ~val); + uchcom_set_dtr_rts_10(sc, ~val); else - uchcom_set_dtrrts_20(sc, ~val); + uchcom_set_dtr_rts_20(sc, ~val); } static void @@ -581,16 +572,16 @@ found: dp->dv_div = (uint8_t)-div; } - mod = UCHCOM_BPS_MOD_BASE / rate + UCHCOM_BPS_MOD_BASE_OFS; - mod = mod + mod / 2; + mod = (UCHCOM_BPS_MOD_BASE / rate) + UCHCOM_BPS_MOD_BASE_OFS; + mod = mod + (mod / 2); - dp->dv_mod = mod / 0x100; + dp->dv_mod = (mod + 0xFF) / 0x100; return (0); } static void -uchcom_set_dte_rate(struct uchcom_softc *sc, uint32_t rate) +uchcom_set_baudrate(struct uchcom_softc *sc, uint32_t rate) { struct uchcom_divider dv; @@ -605,76 +596,6 @@ uchcom_set_dte_rate(struct uchcom_softc *sc, uint32_t rate) UCHCOM_REG_BPS_PAD, 0); } -static void -uchcom_set_line_control(struct uchcom_softc *sc, tcflag_t cflag) -{ - uint8_t lcr1 = 0; - uint8_t lcr2 = 0; - - uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2, &lcr2); - - lcr1 &= ~UCHCOM_LCR1_MASK; - lcr2 &= ~UCHCOM_LCR2_MASK; - - /* - * XXX: it is difficult to handle the line control appropriately: - * - CS8, !CSTOPB and any parity mode seems ok, but - * - the chip doesn't have the function to calculate parity - * in !CS8 mode. - * - it is unclear that the chip supports CS5,6 mode. - * - it is unclear how to handle stop bits. - */ - - if (cflag & PARENB) { - lcr1 |= UCHCOM_LCR1_PARENB; - if (cflag & PARODD) - lcr2 |= UCHCOM_LCR2_PARODD; - else - lcr2 |= UCHCOM_LCR2_PAREVEN; - } - uchcom_write_reg(sc, UCHCOM_REG_LCR1, lcr1, UCHCOM_REG_LCR2, lcr2); -} - -static void -uchcom_clear_chip(struct uchcom_softc *sc) -{ - DPRINTF("\n"); - uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, 0, 0); -} - -static void -uchcom_reset_chip(struct uchcom_softc *sc) -{ - uint16_t val; - uint16_t idx; - uint8_t lcr1; - uint8_t lcr2; - uint8_t pre; - uint8_t div; - uint8_t mod; - - uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2, &lcr2); - uchcom_read_reg(sc, UCHCOM_REG_BPS_PRE, &pre, UCHCOM_REG_BPS_DIV, &div); - uchcom_read_reg(sc, UCHCOM_REG_BPS_MOD, &mod, UCHCOM_REG_BPS_PAD, NULL); - - val = 0; - idx = 0; - val |= (uint16_t)(lcr1 & 0xF0) << 8; - val |= 0x01; - val |= (uint16_t)(lcr2 & 0x0F) << 8; - val |= 0x02; - idx |= pre & 0x07; - val |= 0x04; - idx |= (uint16_t)div << 8; - val |= 0x08; - idx |= mod & 0xF8; - val |= 0x10; - - DPRINTF("reset v=0x%04X, i=0x%04X\n", val, idx); - - uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, val, idx); -} - /* ---------------------------------------------------------------------- * methods for ucom */ @@ -697,7 +618,7 @@ uchcom_cfg_set_dtr(struct ucom_softc *ucom, uint8_t onoff) DPRINTF("onoff = %d\n", onoff); sc->sc_dtr = onoff; - uchcom_set_dtrrts(sc); + uchcom_set_dtr_rts(sc); } static void @@ -708,7 +629,18 @@ uchcom_cfg_set_rts(struct ucom_softc *ucom, uint8_t onoff) DPRINTF("onoff = %d\n", onoff); sc->sc_rts = onoff; - uchcom_set_dtrrts(sc); + uchcom_set_dtr_rts(sc); +} + +static void +uchcom_cfg_open(struct ucom_softc *ucom) +{ + struct uchcom_softc *sc = ucom->sc_parent; + + DPRINTF("\n"); + + uchcom_update_version(sc); + uchcom_update_status(sc); } static int @@ -717,12 +649,10 @@ uchcom_pre_param(struct ucom_softc *ucom, struct termios *t) struct uchcom_divider dv; switch (t->c_cflag & CSIZE) { - case CS5: - case CS6: - case CS7: - return (EIO); - default: + case CS8: break; + default: + return (EIO); } if (uchcom_calc_divider_settings(&dv, t->c_ospeed)) { @@ -736,8 +666,16 @@ uchcom_cfg_param(struct ucom_softc *ucom, struct termios *t) { struct uchcom_softc *sc = ucom->sc_parent; - uchcom_set_line_control(sc, t->c_cflag); - uchcom_set_dte_rate(sc, t->c_ospeed); + uchcom_get_version(sc, 0); + uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, 0, 0); + uchcom_set_baudrate(sc, t->c_ospeed); + uchcom_read_reg(sc, 0x18, 0, 0x25, 0); + uchcom_write_reg(sc, 0x18, 0x50, 0x25, 0x00); + uchcom_update_status(sc); + uchcom_ctrl_write(sc, UCHCOM_REQ_RESET, 0x501f, 0xd90a); + uchcom_set_baudrate(sc, t->c_ospeed); + uchcom_set_dtr_rts(sc); + uchcom_update_status(sc); } static void @@ -838,14 +776,14 @@ uchcom_write_callback(struct usb_xfer *xfer, usb_error_t error) tr_setup: pc = usbd_xfer_get_frame(xfer, 0); if (ucom_get_data(&sc->sc_ucom, pc, 0, - UCHCOM_BULK_BUF_SIZE, &actlen)) { + usbd_xfer_max_len(xfer), &actlen)) { DPRINTF("actlen = %d\n", actlen); usbd_xfer_set_frame_len(xfer, 0, actlen); usbd_transfer_submit(xfer); } - return; + break; default: /* Error */ if (error != USB_ERR_CANCELLED) { @@ -853,8 +791,7 @@ tr_setup: usbd_xfer_set_stall(xfer); goto tr_setup; } - return; - + break; } } @@ -869,14 +806,17 @@ uchcom_read_callback(struct usb_xfer *xfer, usb_error_t error) switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: - pc = usbd_xfer_get_frame(xfer, 0); - ucom_put_data(&sc->sc_ucom, pc, 0, actlen); + + if (actlen > 0) { + pc = usbd_xfer_get_frame(xfer, 0); + ucom_put_data(&sc->sc_ucom, pc, 0, actlen); + } case USB_ST_SETUP: tr_setup: usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); usbd_transfer_submit(xfer); - return; + break; default: /* Error */ if (error != USB_ERR_CANCELLED) { @@ -884,10 +824,17 @@ tr_setup: usbd_xfer_set_stall(xfer); goto tr_setup; } - return; + break; } } +static void +uchcom_poll(struct ucom_softc *ucom) +{ + struct uchcom_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UCHCOM_N_TRANSFER); +} + static device_method_t uchcom_methods[] = { /* Device interface */ DEVMETHOD(device_probe, uchcom_probe), diff --git a/sys/dev/usb/serial/ucycom.c b/sys/dev/usb/serial/ucycom.c index 1eb246089531..1cce28eb580b 100644 --- a/sys/dev/usb/serial/ucycom.c +++ b/sys/dev/usb/serial/ucycom.c @@ -124,6 +124,7 @@ static void ucycom_stop_write(struct ucom_softc *); static void ucycom_cfg_write(struct ucycom_softc *, uint32_t, uint8_t); static int ucycom_pre_param(struct ucom_softc *, struct termios *); static void ucycom_cfg_param(struct ucom_softc *, struct termios *); +static void ucycom_poll(struct ucom_softc *ucom); static const struct usb_config ucycom_config[UCYCOM_N_TRANSFER] = { @@ -154,6 +155,7 @@ static const struct ucom_callback ucycom_callback = { .ucom_stop_read = &ucycom_stop_read, .ucom_start_write = &ucycom_start_write, .ucom_stop_write = &ucycom_stop_write, + .ucom_poll = &ucycom_poll, }; static device_method_t ucycom_methods[] = { @@ -264,7 +266,7 @@ ucycom_attach(device_t dev) sc, &sc->sc_mtx); if (error) { device_printf(dev, "allocating USB " - "transfers failed!\n"); + "transfers failed\n"); goto detach; } error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc, @@ -553,7 +555,7 @@ ucycom_intr_read_callback(struct usb_xfer *xfer, usb_error_t error) break; default: - DPRINTFN(0, "unsupported model number!\n"); + DPRINTFN(0, "unsupported model number\n"); goto tr_setup; } @@ -578,3 +580,10 @@ tr_setup: } } + +static void +ucycom_poll(struct ucom_softc *ucom) +{ + struct ucycom_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UCYCOM_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/ufoma.c b/sys/dev/usb/serial/ufoma.c index 7c2c7325769b..b1a734949452 100644 --- a/sys/dev/usb/serial/ufoma.c +++ b/sys/dev/usb/serial/ufoma.c @@ -230,13 +230,13 @@ static void ufoma_start_read(struct ucom_softc *); static void ufoma_stop_read(struct ucom_softc *); static void ufoma_start_write(struct ucom_softc *); static void ufoma_stop_write(struct ucom_softc *); +static void ufoma_poll(struct ucom_softc *ucom); /*sysctl stuff*/ static int ufoma_sysctl_support(SYSCTL_HANDLER_ARGS); static int ufoma_sysctl_current(SYSCTL_HANDLER_ARGS); static int ufoma_sysctl_open(SYSCTL_HANDLER_ARGS); - static const struct usb_config ufoma_ctrl_config[UFOMA_CTRL_ENDPT_MAX] = { @@ -304,6 +304,7 @@ static const struct ucom_callback ufoma_callback = { .ucom_stop_read = &ufoma_stop_read, .ucom_start_write = &ufoma_start_write, .ucom_stop_write = &ufoma_stop_write, + .ucom_poll = &ufoma_poll, }; static device_method_t ufoma_methods[] = { @@ -400,7 +401,7 @@ ufoma_attach(device_t dev) if (error) { device_printf(dev, "allocating control USB " - "transfers failed!\n"); + "transfers failed\n"); goto detach; } mad = ufoma_get_intconf(cd, id, UDESC_VS_INTERFACE, UDESCSUB_MCPC_ACM); @@ -1059,7 +1060,7 @@ ufoma_modem_setup(device_t dev, struct ufoma_softc *sc, break; } } else { - device_printf(dev, "no data interface!\n"); + device_printf(dev, "no data interface\n"); return (EINVAL); } } @@ -1070,7 +1071,7 @@ ufoma_modem_setup(device_t dev, struct ufoma_softc *sc, if (error) { device_printf(dev, "allocating BULK USB " - "transfers failed!\n"); + "transfers failed\n"); return (EINVAL); } return (0); @@ -1241,3 +1242,11 @@ static int ufoma_sysctl_open(SYSCTL_HANDLER_ARGS) return EINVAL; } + +static void +ufoma_poll(struct ucom_softc *ucom) +{ + struct ufoma_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_ctrl_xfer, UFOMA_CTRL_ENDPT_MAX); + usbd_transfer_poll(sc->sc_bulk_xfer, UFOMA_BULK_ENDPT_MAX); +} diff --git a/sys/dev/usb/serial/uftdi.c b/sys/dev/usb/serial/uftdi.c index 52a070b7015c..3518a411141a 100644 --- a/sys/dev/usb/serial/uftdi.c +++ b/sys/dev/usb/serial/uftdi.c @@ -156,6 +156,7 @@ static void uftdi_stop_read(struct ucom_softc *); static void uftdi_start_write(struct ucom_softc *); static void uftdi_stop_write(struct ucom_softc *); static uint8_t uftdi_8u232am_getrate(uint32_t, uint16_t *); +static void uftdi_poll(struct ucom_softc *ucom); static const struct usb_config uftdi_config[UFTDI_N_TRANSFER] = { @@ -164,7 +165,7 @@ static const struct usb_config uftdi_config[UFTDI_N_TRANSFER] = { .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = UFTDI_OBUFSIZE, - .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, + .flags = {.pipe_bof = 1,}, .callback = &uftdi_write_callback, }, @@ -190,6 +191,7 @@ static const struct ucom_callback uftdi_callback = { .ucom_stop_read = &uftdi_stop_read, .ucom_start_write = &uftdi_start_write, .ucom_stop_write = &uftdi_stop_write, + .ucom_poll = &uftdi_poll, }; static device_method_t uftdi_methods[] = { @@ -214,38 +216,47 @@ MODULE_DEPEND(uftdi, ucom, 1, 1, 1); MODULE_DEPEND(uftdi, usb, 1, 1, 1); static struct usb_device_id uftdi_devs[] = { - {USB_VPI(USB_VENDOR_ATMEL, USB_PRODUCT_ATMEL_STK541, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_DRESDENELEKTRONIK, USB_PRODUCT_DRESDENELEKTRONIK_SENSORTERMINALBOARD, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_DRESDENELEKTRONIK, USB_PRODUCT_DRESDENELEKTRONIK_WIRELESSHANDHELDTERMINAL, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_8U100AX, UFTDI_TYPE_SIO)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_2232C, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_8U232AM, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_8U232AM4, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SEMC_DSS20, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CFA_631, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CFA_632, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CFA_633, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CFA_634, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_CFA_635, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_USBSERIAL, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MX2_3, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MX4_5, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LK202, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_LK204, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13M, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13S, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_TACTRIX_OPENPORT_13U, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_EISCOU, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_UOPTBR, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_EMCU2D, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_PCMSFU, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_EMCU2H, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_FTDI, USB_PRODUCT_FTDI_MAXSTREAM, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_SIIG2, USB_PRODUCT_SIIG2_US2308, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_INTREPIDCS, USB_PRODUCT_INTREPIDCS_VALUECAN, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_INTREPIDCS, USB_PRODUCT_INTREPIDCS_NEOVI, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_BBELECTRONICS, USB_PRODUCT_BBELECTRONICS_USOTL4, UFTDI_TYPE_8U232AM)}, - {USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_PCOPRS1, UFTDI_TYPE_8U232AM)}, +#define UFTDI_DEV(v,p,t) \ + { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, UFTDI_TYPE_##t) } + UFTDI_DEV(ATMEL, STK541, 8U232AM), + UFTDI_DEV(DRESDENELEKTRONIK, SENSORTERMINALBOARD, 8U232AM), + UFTDI_DEV(DRESDENELEKTRONIK, WIRELESSHANDHELDTERMINAL, 8U232AM), + UFTDI_DEV(FTDI, SERIAL_8U100AX, SIO), + UFTDI_DEV(FTDI, SERIAL_2232C, 8U232AM), + UFTDI_DEV(FTDI, SERIAL_2232D, 8U232AM), + UFTDI_DEV(FTDI, SERIAL_4232H, 8U232AM), + UFTDI_DEV(FTDI, SERIAL_8U232AM, 8U232AM), + UFTDI_DEV(FTDI, SERIAL_8U232AM4, 8U232AM), + UFTDI_DEV(FTDI, SEMC_DSS20, 8U232AM), + UFTDI_DEV(FTDI, CFA_631, 8U232AM), + UFTDI_DEV(FTDI, CFA_632, 8U232AM), + UFTDI_DEV(FTDI, CFA_633, 8U232AM), + UFTDI_DEV(FTDI, CFA_634, 8U232AM), + UFTDI_DEV(FTDI, CFA_635, 8U232AM), + UFTDI_DEV(FTDI, USBSERIAL, 8U232AM), + UFTDI_DEV(FTDI, MX2_3, 8U232AM), + UFTDI_DEV(FTDI, MX4_5, 8U232AM), + UFTDI_DEV(FTDI, LK202, 8U232AM), + UFTDI_DEV(FTDI, LK204, 8U232AM), + UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13M, 8U232AM), + UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13S, 8U232AM), + UFTDI_DEV(FTDI, TACTRIX_OPENPORT_13U, 8U232AM), + UFTDI_DEV(FTDI, EISCOU, 8U232AM), + UFTDI_DEV(FTDI, UOPTBR, 8U232AM), + UFTDI_DEV(FTDI, EMCU2D, 8U232AM), + UFTDI_DEV(FTDI, PCMSFU, 8U232AM), + UFTDI_DEV(FTDI, EMCU2H, 8U232AM), + UFTDI_DEV(FTDI, MAXSTREAM, 8U232AM), + UFTDI_DEV(FTDI, CTI_USB_NANO_485, 8U232AM), + UFTDI_DEV(FTDI, CTI_USB_MINI_485, 8U232AM), + UFTDI_DEV(SIIG2, US2308, 8U232AM), + UFTDI_DEV(INTREPIDCS, VALUECAN, 8U232AM), + UFTDI_DEV(INTREPIDCS, NEOVI, 8U232AM), + UFTDI_DEV(BBELECTRONICS, USOTL4, 8U232AM), + UFTDI_DEV(MARVELL, SHEEVAPLUG, 8U232AM), + UFTDI_DEV(MELCO, PCOPRS1, 8U232AM), + UFTDI_DEV(RATOC, REXUSB60F, 8U232AM), +#undef UFTDI_DEV }; static int @@ -302,7 +313,7 @@ uftdi_attach(device_t dev) if (error) { device_printf(dev, "allocating USB " - "transfers failed!\n"); + "transfers failed\n"); goto detach; } sc->sc_ucom.sc_portno = FTDI_PIT_SIOA + uaa->info.bIfaceNum; @@ -808,3 +819,10 @@ done: *rate = result; return (0); } + +static void +uftdi_poll(struct ucom_softc *ucom) +{ + struct uftdi_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UFTDI_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/ugensa.c b/sys/dev/usb/serial/ugensa.c index 86e858638a7d..99656dde46fb 100644 --- a/sys/dev/usb/serial/ugensa.c +++ b/sys/dev/usb/serial/ugensa.c @@ -110,9 +110,9 @@ static void ugensa_start_read(struct ucom_softc *); static void ugensa_stop_read(struct ucom_softc *); static void ugensa_start_write(struct ucom_softc *); static void ugensa_stop_write(struct ucom_softc *); +static void ugensa_poll(struct ucom_softc *ucom); -static const struct usb_config - ugensa_xfer_config[UGENSA_N_TRANSFER] = { +static const struct usb_config ugensa_xfer_config[UGENSA_N_TRANSFER] = { [UGENSA_BULK_DT_WR] = { .type = UE_BULK, @@ -138,6 +138,7 @@ static const struct ucom_callback ugensa_callback = { .ucom_stop_read = &ugensa_stop_read, .ucom_start_write = &ugensa_start_write, .ucom_stop_write = &ugensa_stop_write, + .ucom_poll = &ugensa_poll, }; static device_method_t ugensa_methods[] = { @@ -209,7 +210,7 @@ ugensa_attach(device_t dev) } if (cnt == 0) { - device_printf(dev, "No interfaces!\n"); + device_printf(dev, "No interfaces\n"); goto detach; } for (x = 0; x < cnt; x++) { @@ -228,7 +229,7 @@ ugensa_attach(device_t dev) if (error) { device_printf(dev, "allocating USB " - "transfers failed!\n"); + "transfers failed\n"); goto detach; } /* clear stall at first run */ @@ -369,3 +370,12 @@ ugensa_stop_write(struct ucom_softc *ucom) usbd_transfer_stop(ssc->sc_xfer[UGENSA_BULK_DT_WR]); } + +static void +ugensa_poll(struct ucom_softc *ucom) +{ + struct ugensa_softc *sc = ucom->sc_parent; + struct ugensa_sub_softc *ssc = sc->sc_sub + ucom->sc_portno; + + usbd_transfer_poll(ssc->sc_xfer, UGENSA_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/uipaq.c b/sys/dev/usb/serial/uipaq.c index 89a4cd254ab4..0efcaaf82064 100644 --- a/sys/dev/usb/serial/uipaq.c +++ b/sys/dev/usb/serial/uipaq.c @@ -122,6 +122,7 @@ static void uipaq_stop_write(struct ucom_softc *); static void uipaq_cfg_set_dtr(struct ucom_softc *, uint8_t); static void uipaq_cfg_set_rts(struct ucom_softc *, uint8_t); static void uipaq_cfg_set_break(struct ucom_softc *, uint8_t); +static void uipaq_poll(struct ucom_softc *ucom); static const struct usb_config uipaq_config_data[UIPAQ_N_TRANSFER] = { @@ -152,6 +153,7 @@ static const struct ucom_callback uipaq_callback = { .ucom_stop_read = &uipaq_stop_read, .ucom_start_write = &uipaq_start_write, .ucom_stop_write = &uipaq_stop_write, + .ucom_poll = &uipaq_poll, }; /* @@ -1013,6 +1015,8 @@ static const struct usb_device_id uipaq_devs[] = { /**/ {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WZERO3ES, 0)}, /**/ + {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WZERO3ADES, 0)}, + /**/ {USB_VPI(USB_VENDOR_SHARP, USB_PRODUCT_SHARP_WILLCOM03, 0)}, /* Symbol USB Sync */ {USB_VPI(USB_VENDOR_SYMBOL, 0x2000, 0)}, @@ -1342,3 +1346,10 @@ tr_setup: return; } } + +static void +uipaq_poll(struct ucom_softc *ucom) +{ + struct uipaq_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UIPAQ_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/umct.c b/sys/dev/usb/serial/umct.c index 557a511adc04..524f8c4f4c0e 100644 --- a/sys/dev/usb/serial/umct.c +++ b/sys/dev/usb/serial/umct.c @@ -115,6 +115,7 @@ struct umct_softc { uint8_t sc_lcr; uint8_t sc_mcr; uint8_t sc_iface_no; + uint8_t sc_swap_cb; uint8_t sc_name[16]; }; @@ -125,8 +126,10 @@ static device_attach_t umct_attach; static device_detach_t umct_detach; static usb_callback_t umct_intr_callback; -static usb_callback_t umct_write_callback; +static usb_callback_t umct_intr_callback_sub; static usb_callback_t umct_read_callback; +static usb_callback_t umct_read_callback_sub; +static usb_callback_t umct_write_callback; static void umct_cfg_do_request(struct umct_softc *sc, uint8_t request, uint16_t len, uint32_t value); @@ -142,6 +145,7 @@ static void umct_start_read(struct ucom_softc *); static void umct_stop_read(struct ucom_softc *); static void umct_start_write(struct ucom_softc *); static void umct_stop_write(struct ucom_softc *); +static void umct_poll(struct ucom_softc *ucom); static const struct usb_config umct_config[UMCT_N_TRANSFER] = { @@ -186,6 +190,7 @@ static const struct ucom_callback umct_callback = { .ucom_stop_read = &umct_stop_read, .ucom_start_write = &umct_start_write, .ucom_stop_write = &umct_stop_write, + .ucom_poll = &umct_poll, }; static const struct usb_device_id umct_devs[] = { @@ -238,7 +243,7 @@ umct_attach(device_t dev) struct usb_attach_arg *uaa = device_get_ivars(dev); struct umct_softc *sc = device_get_softc(dev); int32_t error; - //uint16_t maxp; + uint16_t maxp; uint8_t iface_index; sc->sc_udev = uaa->device; @@ -258,16 +263,16 @@ umct_attach(device_t dev) if (error) { device_printf(dev, "allocating USB " - "transfers failed!\n"); + "transfers failed\n"); goto detach; } + /* * The real bulk-in endpoint is also marked as an interrupt. * The only way to differentiate it from the real interrupt * endpoint is to look at the wMaxPacketSize field. */ -#ifdef XXX - maxp = UGETW(sc->sc_xfer[UMCT_BULK_DT_RD]->endpoint->edesc->wMaxPacketSize); + maxp = usbd_xfer_max_framelen(sc->sc_xfer[UMCT_BULK_DT_RD]); if (maxp == 0x2) { /* guessed wrong - switch around endpoints */ @@ -276,11 +281,9 @@ umct_attach(device_t dev) sc->sc_xfer[UMCT_INTR_DT_RD] = sc->sc_xfer[UMCT_BULK_DT_RD]; sc->sc_xfer[UMCT_BULK_DT_RD] = temp; - - sc->sc_xfer[UMCT_BULK_DT_RD]->callback = &umct_read_callback; - sc->sc_xfer[UMCT_INTR_DT_RD]->callback = &umct_intr_callback; + sc->sc_swap_cb = 1; } -#endif + sc->sc_obufsize = usbd_xfer_max_len(sc->sc_xfer[UMCT_BULK_DT_WR]); if (uaa->info.idProduct == USB_PRODUCT_MCT_SITECOM_USB232) { @@ -340,7 +343,7 @@ umct_cfg_do_request(struct umct_softc *sc, uint8_t request, } static void -umct_intr_callback(struct usb_xfer *xfer, usb_error_t error) +umct_intr_callback_sub(struct usb_xfer *xfer, usb_error_t error) { struct umct_softc *sc = usbd_xfer_softc(xfer); struct usb_page_cache *pc; @@ -544,6 +547,28 @@ umct_stop_write(struct ucom_softc *ucom) usbd_transfer_stop(sc->sc_xfer[UMCT_BULK_DT_WR]); } +static void +umct_read_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct umct_softc *sc = usbd_xfer_softc(xfer); + + if (sc->sc_swap_cb) + umct_intr_callback_sub(xfer, error); + else + umct_read_callback_sub(xfer, error); +} + +static void +umct_intr_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct umct_softc *sc = usbd_xfer_softc(xfer); + + if (sc->sc_swap_cb) + umct_read_callback_sub(xfer, error); + else + umct_intr_callback_sub(xfer, error); +} + static void umct_write_callback(struct usb_xfer *xfer, usb_error_t error) { @@ -575,7 +600,7 @@ tr_setup: } static void -umct_read_callback(struct usb_xfer *xfer, usb_error_t error) +umct_read_callback_sub(struct usb_xfer *xfer, usb_error_t error) { struct umct_softc *sc = usbd_xfer_softc(xfer); struct usb_page_cache *pc; @@ -603,3 +628,10 @@ tr_setup: return; } } + +static void +umct_poll(struct ucom_softc *ucom) +{ + struct umct_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UMCT_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/umodem.c b/sys/dev/usb/serial/umodem.c index fc658c5b6649..39afdad893f1 100644 --- a/sys/dev/usb/serial/umodem.c +++ b/sys/dev/usb/serial/umodem.c @@ -112,6 +112,7 @@ __FBSDID("$FreeBSD$"); #define USB_DEBUG_VAR umodem_debug #include #include +#include #include @@ -196,6 +197,7 @@ static void umodem_cfg_set_break(struct ucom_softc *, uint8_t); static void *umodem_get_desc(struct usb_attach_arg *, uint8_t, uint8_t); static usb_error_t umodem_set_comm_feature(struct usb_device *, uint8_t, uint16_t, uint16_t); +static void umodem_poll(struct ucom_softc *ucom); static const struct usb_config umodem_config[UMODEM_N_TRANSFER] = { @@ -242,6 +244,7 @@ static const struct ucom_callback umodem_callback = { .ucom_stop_read = &umodem_stop_read, .ucom_start_write = &umodem_start_write, .ucom_stop_write = &umodem_stop_write, + .ucom_poll = &umodem_poll, }; static device_method_t umodem_methods[] = { @@ -309,11 +312,16 @@ umodem_attach(device_t dev) 0 - 1, UDESCSUB_CDC_UNION, 0 - 1); if ((cud == NULL) || (cud->bLength < sizeof(*cud))) { - device_printf(dev, "no CM or union descriptor!\n"); - goto detach; + device_printf(dev, "Missing descriptor. " + "Assuming data interface is next.\n"); + if (sc->sc_ctrl_iface_no == 0xFF) + goto detach; + else + sc->sc_data_iface_no = + sc->sc_ctrl_iface_no + 1; + } else { + sc->sc_data_iface_no = cud->bSlaveInterface[0]; } - - sc->sc_data_iface_no = cud->bSlaveInterface[0]; } else { sc->sc_data_iface_no = cmd->bDataInterface; } @@ -342,21 +350,25 @@ umodem_attach(device_t dev) break; } } else { - device_printf(dev, "no data interface!\n"); + device_printf(dev, "no data interface\n"); goto detach; } } - if (sc->sc_cm_cap & USB_CDC_CM_OVER_DATA) { - if (sc->sc_acm_cap & USB_CDC_ACM_HAS_FEATURE) { - - error = umodem_set_comm_feature - (uaa->device, sc->sc_ctrl_iface_no, - UCDC_ABSTRACT_STATE, UCDC_DATA_MULTIPLEXED); - - /* ignore any errors */ - } + if (usb_test_quirk(uaa, UQ_ASSUME_CM_OVER_DATA)) { sc->sc_cm_over_data = 1; + } else { + if (sc->sc_cm_cap & USB_CDC_CM_OVER_DATA) { + if (sc->sc_acm_cap & USB_CDC_ACM_HAS_FEATURE) { + + error = umodem_set_comm_feature + (uaa->device, sc->sc_ctrl_iface_no, + UCDC_ABSTRACT_STATE, UCDC_DATA_MULTIPLEXED); + + /* ignore any errors */ + } + sc->sc_cm_over_data = 1; + } } error = usbd_transfer_setup(uaa->device, sc->sc_iface_index, sc->sc_xfer, @@ -810,3 +822,10 @@ umodem_detach(device_t dev) return (0); } + +static void +umodem_poll(struct ucom_softc *ucom) +{ + struct umodem_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UMODEM_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/umoscom.c b/sys/dev/usb/serial/umoscom.c index 47f70f1f4d3a..0481b192c8b2 100644 --- a/sys/dev/usb/serial/umoscom.c +++ b/sys/dev/usb/serial/umoscom.c @@ -210,6 +210,7 @@ static void umoscom_start_read(struct ucom_softc *); static void umoscom_stop_read(struct ucom_softc *); static void umoscom_start_write(struct ucom_softc *); static void umoscom_stop_write(struct ucom_softc *); +static void umoscom_poll(struct ucom_softc *ucom); static const struct usb_config umoscom_config_data[UMOSCOM_N_TRANSFER] = { @@ -257,6 +258,7 @@ static const struct ucom_callback umoscom_callback = { .ucom_stop_read = &umoscom_stop_read, .ucom_start_write = &umoscom_start_write, .ucom_stop_write = &umoscom_stop_write, + .ucom_poll = &umoscom_poll, }; static device_method_t umoscom_methods[] = { @@ -694,3 +696,10 @@ tr_setup: return; } } + +static void +umoscom_poll(struct ucom_softc *ucom) +{ + struct umoscom_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UMOSCOM_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/uplcom.c b/sys/dev/usb/serial/uplcom.c index 399792f1ef15..c5d58e46dcbc 100644 --- a/sys/dev/usb/serial/uplcom.c +++ b/sys/dev/usb/serial/uplcom.c @@ -186,6 +186,7 @@ static void uplcom_start_write(struct ucom_softc *); static void uplcom_stop_write(struct ucom_softc *); static void uplcom_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *); +static void uplcom_poll(struct ucom_softc *ucom); static device_probe_t uplcom_probe; static device_attach_t uplcom_attach; @@ -239,59 +240,60 @@ static struct ucom_callback uplcom_callback = { .ucom_stop_read = &uplcom_stop_read, .ucom_start_write = &uplcom_start_write, .ucom_stop_write = &uplcom_stop_write, + .ucom_poll = &uplcom_poll, }; -#define USB_UPL(v,p,rl,rh,t) \ - USB_VENDOR(v), USB_PRODUCT(p), USB_DEV_BCD_GTEQ(rl), \ - USB_DEV_BCD_LTEQ(rh), USB_DRIVER_INFO(t) +#define UPLCOM_DEV(v,p,rl,rh,t) \ + { USB_VENDOR(USB_VENDOR_##v), USB_PRODUCT(USB_PRODUCT_##v##_##p), \ + USB_DEV_BCD_GTEQ(rl), USB_DEV_BCD_LTEQ(rh), USB_DRIVER_INFO(TYPE_##t) } static const struct usb_device_id uplcom_devs[] = { /* Belkin F5U257 */ - {USB_UPL(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U257, 0, 0xFFFF, TYPE_PL2303X)}, + UPLCOM_DEV(BELKIN, F5U257, 0, 0xFFFF, PL2303X), /* I/O DATA USB-RSAQ */ - {USB_UPL(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_USBRSAQ, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(IODATA, USBRSAQ, 0, 0xFFFF, PL2303), /* I/O DATA USB-RSAQ2 */ - {USB_UPL(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_RSAQ2, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(PROLIFIC, RSAQ2, 0, 0xFFFF, PL2303), /* I/O DATA USB-RSAQ3 */ - {USB_UPL(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_RSAQ3, 0, 0xFFFF, TYPE_PL2303X)}, + UPLCOM_DEV(PROLIFIC, RSAQ3, 0, 0xFFFF, PL2303X), /* PLANEX USB-RS232 URS-03 */ - {USB_UPL(USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC232A, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(ATEN, UC232A, 0, 0xFFFF, PL2303), /* TrendNet TU-S9 */ - {USB_UPL(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303, 0x0400, 0xFFFF, TYPE_PL2303X)}, + UPLCOM_DEV(PROLIFIC, PL2303, 0x0400, 0xFFFF, PL2303X), /* ST Lab USB-SERIAL-4 */ - {USB_UPL(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303, 0x0300, 0x03FF, TYPE_PL2303X)}, + UPLCOM_DEV(PROLIFIC, PL2303, 0x0300, 0x03FF, PL2303X), /* IOGEAR/ATEN UC-232A (also ST Lab USB-SERIAL-1) */ - {USB_UPL(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2303, 0, 0x02FF, TYPE_PL2303)}, + UPLCOM_DEV(PROLIFIC, PL2303, 0, 0x02FF, PL2303), /* TDK USB-PHS Adapter UHA6400 */ - {USB_UPL(USB_VENDOR_TDK, USB_PRODUCT_TDK_UHA6400, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(TDK, UHA6400, 0, 0xFFFF, PL2303), /* RATOC REX-USB60 */ - {USB_UPL(USB_VENDOR_RATOC, USB_PRODUCT_RATOC_REXUSB60, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(RATOC, REXUSB60, 0, 0xFFFF, PL2303), /* ELECOM UC-SGT */ - {USB_UPL(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_UCSGT, 0, 0xFFFF, TYPE_PL2303)}, - {USB_UPL(USB_VENDOR_ELECOM, USB_PRODUCT_ELECOM_UCSGT0, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(ELECOM, UCSGT, 0, 0xFFFF, PL2303), + UPLCOM_DEV(ELECOM, UCSGT0, 0, 0xFFFF, PL2303), /* Sagem USB-Serial Controller */ - {USB_UPL(USB_VENDOR_SAGEM, USB_PRODUCT_SAGEM_USBSERIAL, 0, 0xFFFF, TYPE_PL2303X)}, + UPLCOM_DEV(SAGEM, USBSERIAL, 0, 0xFFFF, PL2303X), /* Sony Ericsson USB Cable */ - {USB_UPL(USB_VENDOR_SONYERICSSON, USB_PRODUCT_SONYERICSSON_DCU10, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(SONYERICSSON, DCU10, 0, 0xFFFF, PL2303), /* SOURCENEXT KeikaiDenwa 8 */ - {USB_UPL(USB_VENDOR_SOURCENEXT, USB_PRODUCT_SOURCENEXT_KEIKAI8, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(SOURCENEXT, KEIKAI8, 0, 0xFFFF, PL2303), /* SOURCENEXT KeikaiDenwa 8 with charger */ - {USB_UPL(USB_VENDOR_SOURCENEXT, USB_PRODUCT_SOURCENEXT_KEIKAI8_CHG, 0, 0, TYPE_PL2303)}, + UPLCOM_DEV(SOURCENEXT, KEIKAI8_CHG, 0, 0, PL2303), /* HAL Corporation Crossam2+USB */ - {USB_UPL(USB_VENDOR_HAL, USB_PRODUCT_HAL_IMR001, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(HAL, IMR001, 0, 0xFFFF, PL2303), /* Sitecom USB to Serial */ - {USB_UPL(USB_VENDOR_SITECOM, USB_PRODUCT_SITECOM_SERIAL, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(SITECOM, SERIAL, 0, 0xFFFF, PL2303), /* Tripp-Lite U209-000-R */ - {USB_UPL(USB_VENDOR_TRIPPLITE, USB_PRODUCT_TRIPPLITE_U209, 0, 0xFFFF, TYPE_PL2303X)}, - {USB_UPL(USB_VENDOR_RADIOSHACK, USB_PRODUCT_RADIOSHACK_USBCABLE, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(TRIPPLITE, U209, 0, 0xFFFF, PL2303X), + UPLCOM_DEV(RADIOSHACK, USBCABLE, 0, 0xFFFF, PL2303), /* Prolific Pharos */ - {USB_UPL(USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PHAROS, 0, 0xFFFF, TYPE_PL2303)}, + UPLCOM_DEV(PROLIFIC, PHAROS, 0, 0xFFFF, PL2303), /* Willcom W-SIM */ - {USB_UPL(USB_VENDOR_PROLIFIC2, USB_PRODUCT_PROLIFIC2_WSIM, 0, 0xFFFF, TYPE_PL2303X)}, + UPLCOM_DEV(PROLIFIC2, WSIM, 0, 0xFFFF, PL2303X), /* Mobile Action MA-620 Infrared Adapter */ - {USB_UPL(USB_VENDOR_MOBILEACTION, USB_PRODUCT_MOBILEACTION_MA620, 0, 0xFFFF, TYPE_PL2303X)}, - + UPLCOM_DEV(MOBILEACTION, MA620, 0, 0xFFFF, PL2303X), }; +#undef UPLCOM_DEV static device_method_t uplcom_methods[] = { DEVMETHOD(device_probe, uplcom_probe), @@ -375,7 +377,7 @@ uplcom_attach(device_t dev) if (iface) { id = usbd_get_interface_descriptor(iface); if (id == NULL) { - device_printf(dev, "no interface descriptor (2)!\n"); + device_printf(dev, "no interface descriptor (2)\n"); goto detach; } sc->sc_data_iface_no = id->bInterfaceNumber; @@ -418,7 +420,7 @@ uplcom_attach(device_t dev) */ if (sc->sc_chiptype == TYPE_PL2303X) { if (uplcom_pl2303x_init(uaa->device)) { - device_printf(dev, "init failed!\n"); + device_printf(dev, "init failed\n"); goto detach; } } @@ -862,3 +864,10 @@ tr_setup: return; } } + +static void +uplcom_poll(struct ucom_softc *ucom) +{ + struct uplcom_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UPLCOM_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/usb_serial.c b/sys/dev/usb/serial/usb_serial.c index f3e3e91adde7..871ae54190b8 100644 --- a/sys/dev/usb/serial/usb_serial.c +++ b/sys/dev/usb/serial/usb_serial.c @@ -86,6 +86,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include @@ -98,14 +100,40 @@ __FBSDID("$FreeBSD$"); #include +#include "opt_gdb.h" + +SYSCTL_NODE(_hw_usb, OID_AUTO, ucom, CTLFLAG_RW, 0, "USB ucom"); + #if USB_DEBUG static int ucom_debug = 0; -SYSCTL_NODE(_hw_usb, OID_AUTO, ucom, CTLFLAG_RW, 0, "USB ucom"); SYSCTL_INT(_hw_usb_ucom, OID_AUTO, debug, CTLFLAG_RW, &ucom_debug, 0, "ucom debug level"); #endif +#define UCOM_CONS_BUFSIZE 1024 + +static uint8_t ucom_cons_rx_buf[UCOM_CONS_BUFSIZE]; +static uint8_t ucom_cons_tx_buf[UCOM_CONS_BUFSIZE]; + +static unsigned int ucom_cons_rx_low = 0; +static unsigned int ucom_cons_rx_high = 0; + +static unsigned int ucom_cons_tx_low = 0; +static unsigned int ucom_cons_tx_high = 0; + +static int ucom_cons_unit = -1; +static int ucom_cons_baud = 9600; +static struct ucom_softc *ucom_cons_softc = NULL; + +TUNABLE_INT("hw.usb.ucom.cons_unit", &ucom_cons_unit); +SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_unit, CTLFLAG_RW, + &ucom_cons_unit, 0, "console unit number"); + +TUNABLE_INT("hw.usb.ucom.cons_baud", &ucom_cons_baud); +SYSCTL_INT(_hw_usb_ucom, OID_AUTO, cons_baud, CTLFLAG_RW, + &ucom_cons_baud, 0, "console baud rate"); + static usb_proc_callback_t ucom_cfg_start_transfers; static usb_proc_callback_t ucom_cfg_open; static usb_proc_callback_t ucom_cfg_close; @@ -121,6 +149,7 @@ static void ucom_queue_command(struct ucom_softc *, usb_proc_callback_t *, struct termios *pt, struct usb_proc_msg *t0, struct usb_proc_msg *t1); static void ucom_shutdown(struct ucom_softc *); +static void ucom_ring(struct ucom_softc *, uint8_t); static void ucom_break(struct ucom_softc *, uint8_t); static void ucom_dtr(struct ucom_softc *, uint8_t); static void ucom_rts(struct ucom_softc *, uint8_t); @@ -147,7 +176,7 @@ static struct ttydevsw ucom_class = { MODULE_DEPEND(ucom, usb, 1, 1, 1); MODULE_VERSION(ucom, 1); -#define UCOM_UNIT_MAX 0x1000 /* exclusive */ +#define UCOM_UNIT_MAX 0x200 /* exclusive */ #define UCOM_SUB_UNIT_MAX 0x100 /* exclusive */ static uint8_t ucom_bitmap[(UCOM_UNIT_MAX + 7) / 8]; @@ -346,6 +375,29 @@ ucom_attach_tty(struct ucom_softc *sc, uint32_t sub_units) DPRINTF("ttycreate: %s\n", buf); cv_init(&sc->sc_cv, "ucom"); + /* Check if this device should be a console */ + if ((ucom_cons_softc == NULL) && + (sc->sc_unit == ucom_cons_unit)) { + + struct termios t; + + ucom_cons_softc = sc; + + memset(&t, 0, sizeof(t)); + t.c_ispeed = ucom_cons_baud; + t.c_ospeed = t.c_ispeed; + t.c_cflag = CS8; + + mtx_lock(ucom_cons_softc->sc_mtx); + ucom_cons_rx_low = 0; + ucom_cons_rx_high = 0; + ucom_cons_tx_low = 0; + ucom_cons_tx_high = 0; + sc->sc_flag |= UCOM_FLAG_CONSOLE; + ucom_open(ucom_cons_softc->sc_tty); + ucom_param(ucom_cons_softc->sc_tty, &t); + mtx_unlock(ucom_cons_softc->sc_mtx); + } done: return (error); } @@ -357,12 +409,18 @@ ucom_detach_tty(struct ucom_softc *sc) DPRINTF("sc = %p, tp = %p\n", sc, sc->sc_tty); + if (sc->sc_flag & UCOM_FLAG_CONSOLE) { + mtx_lock(ucom_cons_softc->sc_mtx); + ucom_close(ucom_cons_softc->sc_tty); + mtx_unlock(ucom_cons_softc->sc_mtx); + ucom_cons_softc = NULL; + } + /* the config thread has been stopped when we get here */ mtx_lock(sc->sc_mtx); sc->sc_flag |= UCOM_FLAG_GONE; - sc->sc_flag &= ~(UCOM_FLAG_HL_READY | - UCOM_FLAG_LL_READY); + sc->sc_flag &= ~(UCOM_FLAG_HL_READY | UCOM_FLAG_LL_READY); mtx_unlock(sc->sc_mtx); if (tp) { tty_lock(tp); @@ -588,6 +646,8 @@ ucom_open(struct tty *tp) ucom_modem(tp, SER_DTR | SER_RTS, 0); + ucom_ring(sc, 0); + ucom_break(sc, 0); ucom_status_change(sc); @@ -653,6 +713,16 @@ ucom_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) DPRINTF("cmd = 0x%08lx\n", cmd); switch (cmd) { +#if 0 + case TIOCSRING: + ucom_ring(sc, 1); + error = 0; + break; + case TIOCCRING: + ucom_ring(sc, 0); + error = 0; + break; +#endif case TIOCSBRK: ucom_break(sc, 1); error = 0; @@ -751,6 +821,8 @@ ucom_cfg_line_state(struct usb_proc_msg *_task) mask |= UCOM_LS_RTS; if (sc->sc_callback->ucom_cfg_set_break) mask |= UCOM_LS_BREAK; + if (sc->sc_callback->ucom_cfg_set_ring) + mask |= UCOM_LS_RING; /* compute the bits we are to program */ notch_bits = (sc->sc_pls_set & sc->sc_pls_clr) & mask; @@ -773,6 +845,9 @@ ucom_cfg_line_state(struct usb_proc_msg *_task) if (notch_bits & UCOM_LS_BREAK) sc->sc_callback->ucom_cfg_set_break(sc, (prev_value & UCOM_LS_BREAK) ? 1 : 0); + if (notch_bits & UCOM_LS_RING) + sc->sc_callback->ucom_cfg_set_ring(sc, + (prev_value & UCOM_LS_RING) ? 1 : 0); /* set last value */ if (any_bits & UCOM_LS_DTR) @@ -784,6 +859,9 @@ ucom_cfg_line_state(struct usb_proc_msg *_task) if (any_bits & UCOM_LS_BREAK) sc->sc_callback->ucom_cfg_set_break(sc, (last_value & UCOM_LS_BREAK) ? 1 : 0); + if (any_bits & UCOM_LS_RING) + sc->sc_callback->ucom_cfg_set_ring(sc, + (last_value & UCOM_LS_RING) ? 1 : 0); } static void @@ -810,6 +888,17 @@ ucom_line_state(struct ucom_softc *sc, &sc->sc_line_state_task[1].hdr); } +static void +ucom_ring(struct ucom_softc *sc, uint8_t onoff) +{ + DPRINTF("onoff = %d\n", onoff); + + if (onoff) + ucom_line_state(sc, UCOM_LS_RING, 0); + else + ucom_line_state(sc, 0, UCOM_LS_RING); +} + static void ucom_break(struct ucom_softc *sc, uint8_t onoff) { @@ -895,6 +984,9 @@ ucom_status_change(struct ucom_softc *sc) { mtx_assert(sc->sc_mtx, MA_OWNED); + if (sc->sc_flag & UCOM_FLAG_CONSOLE) + return; /* not supported */ + if (!(sc->sc_flag & UCOM_FLAG_HL_READY)) { return; } @@ -1033,6 +1125,38 @@ ucom_get_data(struct ucom_softc *sc, struct usb_page_cache *pc, mtx_assert(sc->sc_mtx, MA_OWNED); + if (sc->sc_flag & UCOM_FLAG_CONSOLE) { + unsigned int temp; + + /* get total TX length */ + + temp = ucom_cons_tx_high - ucom_cons_tx_low; + temp %= UCOM_CONS_BUFSIZE; + + /* limit TX length */ + + if (temp > (UCOM_CONS_BUFSIZE - ucom_cons_tx_low)) + temp = (UCOM_CONS_BUFSIZE - ucom_cons_tx_low); + + if (temp > len) + temp = len; + + /* copy in data */ + + usbd_copy_in(pc, offset, ucom_cons_tx_buf + ucom_cons_tx_low, temp); + + /* update counters */ + + ucom_cons_tx_low += temp; + ucom_cons_tx_low %= UCOM_CONS_BUFSIZE; + + /* store actual length */ + + *actlen = temp; + + return (temp ? 1 : 0); + } + if (tty_gone(tp) || !(sc->sc_flag & UCOM_FLAG_GP_DATA)) { actlen[0] = 0; @@ -1080,6 +1204,34 @@ ucom_put_data(struct ucom_softc *sc, struct usb_page_cache *pc, mtx_assert(sc->sc_mtx, MA_OWNED); + if (sc->sc_flag & UCOM_FLAG_CONSOLE) { + unsigned int temp; + + /* get maximum RX length */ + + temp = (UCOM_CONS_BUFSIZE - 1) - ucom_cons_rx_high + ucom_cons_rx_low; + temp %= UCOM_CONS_BUFSIZE; + + /* limit RX length */ + + if (temp > (UCOM_CONS_BUFSIZE - ucom_cons_rx_high)) + temp = (UCOM_CONS_BUFSIZE - ucom_cons_rx_high); + + if (temp > len) + temp = len; + + /* copy out data */ + + usbd_copy_out(pc, offset, ucom_cons_rx_buf + ucom_cons_rx_high, temp); + + /* update counters */ + + ucom_cons_rx_high += temp; + ucom_cons_rx_high %= UCOM_CONS_BUFSIZE; + + return; + } + if (tty_gone(tp)) return; /* multiport device polling */ @@ -1136,3 +1288,143 @@ ucom_free(void *xsc) cv_signal(&sc->sc_cv); mtx_unlock(sc->sc_mtx); } + +static cn_probe_t ucom_cnprobe; +static cn_init_t ucom_cninit; +static cn_term_t ucom_cnterm; +static cn_getc_t ucom_cngetc; +static cn_putc_t ucom_cnputc; + +CONSOLE_DRIVER(ucom); + +static void +ucom_cnprobe(struct consdev *cp) +{ + if (ucom_cons_unit != -1) + cp->cn_pri = CN_NORMAL; + else + cp->cn_pri = CN_DEAD; + + strlcpy(cp->cn_name, "ucom", sizeof(cp->cn_name)); +} + +static void +ucom_cninit(struct consdev *cp) +{ +} + +static void +ucom_cnterm(struct consdev *cp) +{ +} + +static int +ucom_cngetc(struct consdev *cd) +{ + struct ucom_softc *sc = ucom_cons_softc; + int c; + + if (sc == NULL) + return (-1); + + mtx_lock(sc->sc_mtx); + + if (ucom_cons_rx_low != ucom_cons_rx_high) { + c = ucom_cons_rx_buf[ucom_cons_rx_low]; + ucom_cons_rx_low ++; + ucom_cons_rx_low %= UCOM_CONS_BUFSIZE; + } else { + c = -1; + } + + /* start USB transfers */ + ucom_outwakeup(sc->sc_tty); + + mtx_unlock(sc->sc_mtx); + + /* poll if necessary */ + if (kdb_active && sc->sc_callback->ucom_poll) + (sc->sc_callback->ucom_poll) (sc); + + return (c); +} + +static void +ucom_cnputc(struct consdev *cd, int c) +{ + struct ucom_softc *sc = ucom_cons_softc; + unsigned int temp; + + if (sc == NULL) + return; + + repeat: + + mtx_lock(sc->sc_mtx); + + /* compute maximum TX length */ + + temp = (UCOM_CONS_BUFSIZE - 1) - ucom_cons_tx_high + ucom_cons_tx_low; + temp %= UCOM_CONS_BUFSIZE; + + if (temp) { + ucom_cons_tx_buf[ucom_cons_tx_high] = c; + ucom_cons_tx_high ++; + ucom_cons_tx_high %= UCOM_CONS_BUFSIZE; + } + + /* start USB transfers */ + ucom_outwakeup(sc->sc_tty); + + mtx_unlock(sc->sc_mtx); + + /* poll if necessary */ + if (kdb_active && sc->sc_callback->ucom_poll) { + (sc->sc_callback->ucom_poll) (sc); + /* simple flow control */ + if (temp == 0) + goto repeat; + } +} + +#if defined(GDB) + +#include + +static gdb_probe_f ucom_gdbprobe; +static gdb_init_f ucom_gdbinit; +static gdb_term_f ucom_gdbterm; +static gdb_getc_f ucom_gdbgetc; +static gdb_putc_f ucom_gdbputc; + +GDB_DBGPORT(sio, ucom_gdbprobe, ucom_gdbinit, ucom_gdbterm, ucom_gdbgetc, ucom_gdbputc); + +static int +ucom_gdbprobe(void) +{ + return ((ucom_cons_softc != NULL) ? 0 : -1); +} + +static void +ucom_gdbinit(void) +{ +} + +static void +ucom_gdbterm(void) +{ +} + +static void +ucom_gdbputc(int c) +{ + ucom_cnputc(NULL, c); +} + +static int +ucom_gdbgetc(void) +{ + return (ucom_cngetc(NULL)); +} + +#endif diff --git a/sys/dev/usb/serial/usb_serial.h b/sys/dev/usb/serial/usb_serial.h index 94f82f1b3fb0..7f7590b499dd 100644 --- a/sys/dev/usb/serial/usb_serial.h +++ b/sys/dev/usb/serial/usb_serial.h @@ -70,7 +70,6 @@ #include #include #include -#include /* Module interface related macros */ #define UCOM_MODVER 1 @@ -94,6 +93,7 @@ struct ucom_callback { void (*ucom_cfg_set_dtr) (struct ucom_softc *, uint8_t); void (*ucom_cfg_set_rts) (struct ucom_softc *, uint8_t); void (*ucom_cfg_set_break) (struct ucom_softc *, uint8_t); + void (*ucom_cfg_set_ring) (struct ucom_softc *, uint8_t); void (*ucom_cfg_param) (struct ucom_softc *, struct termios *); void (*ucom_cfg_open) (struct ucom_softc *); void (*ucom_cfg_close) (struct ucom_softc *); @@ -105,6 +105,7 @@ struct ucom_callback { void (*ucom_start_write) (struct ucom_softc *); void (*ucom_stop_write) (struct ucom_softc *); void (*ucom_tty_name) (struct ucom_softc *, char *pbuf, uint16_t buflen, uint16_t local_subunit); + void (*ucom_poll) (struct ucom_softc *); }; /* Line status register */ @@ -162,13 +163,14 @@ struct ucom_softc { uint32_t sc_unit; uint32_t sc_local_unit; uint16_t sc_portno; - uint8_t sc_flag; + uint16_t sc_flag; #define UCOM_FLAG_RTS_IFLOW 0x01 /* use RTS input flow control */ #define UCOM_FLAG_GONE 0x02 /* the device is gone */ #define UCOM_FLAG_ATTACHED 0x04 /* set if attached */ #define UCOM_FLAG_GP_DATA 0x08 /* set if get and put data is possible */ #define UCOM_FLAG_LL_READY 0x20 /* set if low layer is ready */ #define UCOM_FLAG_HL_READY 0x40 /* set if high layer is ready */ +#define UCOM_FLAG_CONSOLE 0x80 /* set if device is a console */ uint8_t sc_lsr; uint8_t sc_msr; uint8_t sc_mcr; @@ -180,6 +182,7 @@ struct ucom_softc { #define UCOM_LS_DTR 0x01 #define UCOM_LS_RTS 0x02 #define UCOM_LS_BREAK 0x04 +#define UCOM_LS_RING 0x08 }; #define ucom_cfg_do_request(udev,com,req,ptr,flags,timo) \ diff --git a/sys/dev/usb/serial/uslcom.c b/sys/dev/usb/serial/uslcom.c index c319dfd74e54..d97cc2c542cd 100644 --- a/sys/dev/usb/serial/uslcom.c +++ b/sys/dev/usb/serial/uslcom.c @@ -135,6 +135,7 @@ static void uslcom_start_read(struct ucom_softc *); static void uslcom_stop_read(struct ucom_softc *); static void uslcom_start_write(struct ucom_softc *); static void uslcom_stop_write(struct ucom_softc *); +static void uslcom_poll(struct ucom_softc *ucom); static const struct usb_config uslcom_config[USLCOM_N_TRANSFER] = { @@ -170,27 +171,30 @@ static struct ucom_callback uslcom_callback = { .ucom_stop_read = &uslcom_stop_read, .ucom_start_write = &uslcom_start_write, .ucom_stop_write = &uslcom_stop_write, + .ucom_poll = &uslcom_poll, }; static const struct usb_device_id uslcom_devs[] = { - { USB_VPI(USB_VENDOR_BALTECH, USB_PRODUCT_BALTECH_CARDREADER, 0) }, - { USB_VPI(USB_VENDOR_DYNASTREAM, USB_PRODUCT_DYNASTREAM_ANTDEVBOARD, 0) }, - { USB_VPI(USB_VENDOR_JABLOTRON, USB_PRODUCT_JABLOTRON_PC60B, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_ARGUSISP, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_CRUMB128, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_DEGREE, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_BURNSIDE, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_HELICOM, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_LIPOWSKY_HARP, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_LIPOWSKY_JTAG, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_LIPOWSKY_LIN, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_POLOLU, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_CP2102, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_CP210X_2, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_SUUNTO, 0) }, - { USB_VPI(USB_VENDOR_SILABS, USB_PRODUCT_SILABS_TRAQMATE, 0) }, - { USB_VPI(USB_VENDOR_SILABS2, USB_PRODUCT_SILABS2_DCU11CLONE, 0) }, - { USB_VPI(USB_VENDOR_USI, USB_PRODUCT_USI_MC60, 0) }, +#define USLCOM_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) } + USLCOM_DEV(BALTECH, CARDREADER), + USLCOM_DEV(DYNASTREAM, ANTDEVBOARD), + USLCOM_DEV(JABLOTRON, PC60B), + USLCOM_DEV(SILABS, ARGUSISP), + USLCOM_DEV(SILABS, CRUMB128), + USLCOM_DEV(SILABS, DEGREE), + USLCOM_DEV(SILABS, BURNSIDE), + USLCOM_DEV(SILABS, HELICOM), + USLCOM_DEV(SILABS, LIPOWSKY_HARP), + USLCOM_DEV(SILABS, LIPOWSKY_JTAG), + USLCOM_DEV(SILABS, LIPOWSKY_LIN), + USLCOM_DEV(SILABS, POLOLU), + USLCOM_DEV(SILABS, CP2102), + USLCOM_DEV(SILABS, CP210X_2), + USLCOM_DEV(SILABS, SUUNTO), + USLCOM_DEV(SILABS, TRAQMATE), + USLCOM_DEV(SILABS2, DCU11CLONE), + USLCOM_DEV(USI, MC60), +#undef USLCOM_DEV }; static device_method_t uslcom_methods[] = { @@ -562,3 +566,10 @@ uslcom_stop_write(struct ucom_softc *ucom) usbd_transfer_stop(sc->sc_xfer[USLCOM_BULK_DT_WR]); } + +static void +uslcom_poll(struct ucom_softc *ucom) +{ + struct uslcom_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, USLCOM_N_TRANSFER); +} diff --git a/sys/dev/usb/serial/uvisor.c b/sys/dev/usb/serial/uvisor.c index 3f1624bcbf44..9e6daa97cfa3 100644 --- a/sys/dev/usb/serial/uvisor.c +++ b/sys/dev/usb/serial/uvisor.c @@ -261,32 +261,34 @@ MODULE_DEPEND(uvisor, ucom, 1, 1, 1); MODULE_DEPEND(uvisor, usb, 1, 1, 1); static const struct usb_device_id uvisor_devs[] = { - {USB_VPI(USB_VENDOR_ACEECA, USB_PRODUCT_ACEECA_MEZ1000, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_GARMIN, USB_PRODUCT_GARMIN_IQUE_3600, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_FOSSIL, USB_PRODUCT_FOSSIL_WRISTPDA, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_VISOR, UVISOR_FLAG_VISOR)}, - {USB_VPI(USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_TREO, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_HANDSPRING, USB_PRODUCT_HANDSPRING_TREO600, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_M500, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_M505, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_M515, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_I705, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_M125, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_M130, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_TUNGSTEN_Z, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_TUNGSTEN_T, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_ZIRE, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_PALM, USB_PRODUCT_PALM_ZIRE31, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_SAMSUNG, USB_PRODUCT_SAMSUNG_I500, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40, 0)}, - {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_41, 0)}, - {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_S360, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_NX60, UVISOR_FLAG_PALM4)}, - {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_35, UVISOR_FLAG_PALM35)}, -/* {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_25, UVISOR_FLAG_PALM4 )}, */ - {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_TJ37, UVISOR_FLAG_PALM4)}, -/* {USB_VPI(USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_TH55, UVISOR_FLAG_PALM4 )}, See PR 80935 */ - {USB_VPI(USB_VENDOR_TAPWAVE, USB_PRODUCT_TAPWAVE_ZODIAC, UVISOR_FLAG_PALM4)}, +#define UVISOR_DEV(v,p,i) { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, i) } + UVISOR_DEV(ACEECA, MEZ1000, UVISOR_FLAG_PALM4), + UVISOR_DEV(GARMIN, IQUE_3600, UVISOR_FLAG_PALM4), + UVISOR_DEV(FOSSIL, WRISTPDA, UVISOR_FLAG_PALM4), + UVISOR_DEV(HANDSPRING, VISOR, UVISOR_FLAG_VISOR), + UVISOR_DEV(HANDSPRING, TREO, UVISOR_FLAG_PALM4), + UVISOR_DEV(HANDSPRING, TREO600, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, M500, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, M505, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, M515, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, I705, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, M125, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, M130, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, TUNGSTEN_Z, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, TUNGSTEN_T, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, ZIRE, UVISOR_FLAG_PALM4), + UVISOR_DEV(PALM, ZIRE31, UVISOR_FLAG_PALM4), + UVISOR_DEV(SAMSUNG, I500, UVISOR_FLAG_PALM4), + UVISOR_DEV(SONY, CLIE_40, 0), + UVISOR_DEV(SONY, CLIE_41, 0), + UVISOR_DEV(SONY, CLIE_S360, UVISOR_FLAG_PALM4), + UVISOR_DEV(SONY, CLIE_NX60, UVISOR_FLAG_PALM4), + UVISOR_DEV(SONY, CLIE_35, UVISOR_FLAG_PALM35), +/* UVISOR_DEV(SONY, CLIE_25, UVISOR_FLAG_PALM4 ), */ + UVISOR_DEV(SONY, CLIE_TJ37, UVISOR_FLAG_PALM4), +/* UVISOR_DEV(SONY, CLIE_TH55, UVISOR_FLAG_PALM4 ), See PR 80935 */ + UVISOR_DEV(TAPWAVE, ZODIAC, UVISOR_FLAG_PALM4), +#undef UVISOR_DEV }; static int diff --git a/sys/dev/usb/serial/uvscom.c b/sys/dev/usb/serial/uvscom.c index 27f3919b286a..4e3ff576422e 100644 --- a/sys/dev/usb/serial/uvscom.c +++ b/sys/dev/usb/serial/uvscom.c @@ -185,6 +185,7 @@ static void uvscom_cfg_get_status(struct ucom_softc *, uint8_t *, uint8_t *); static void uvscom_cfg_write(struct uvscom_softc *, uint8_t, uint16_t); static uint16_t uvscom_cfg_read_status(struct uvscom_softc *); +static void uvscom_poll(struct ucom_softc *ucom); static const struct usb_config uvscom_config[UVSCOM_N_TRANSFER] = { @@ -230,6 +231,7 @@ static const struct ucom_callback uvscom_callback = { .ucom_stop_read = &uvscom_stop_read, .ucom_start_write = &uvscom_start_write, .ucom_stop_write = &uvscom_stop_write, + .ucom_poll = &uvscom_poll, }; static const struct usb_device_id uvscom_devs[] = { @@ -734,3 +736,10 @@ uvscom_cfg_read_status(struct uvscom_softc *sc) } return (data[0] | (data[1] << 8)); } + +static void +uvscom_poll(struct ucom_softc *ucom) +{ + struct uvscom_softc *sc = ucom->sc_parent; + usbd_transfer_poll(sc->sc_xfer, UVSCOM_N_TRANSFER); +} diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c index 23893e48c48e..b14bb47e8cba 100644 --- a/sys/dev/usb/storage/umass.c +++ b/sys/dev/usb/storage/umass.c @@ -127,6 +127,8 @@ __FBSDID("$FreeBSD$"); #include #include "usbdevs.h" +#include + #include #include #include @@ -175,6 +177,8 @@ static int umass_debug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, umass, CTLFLAG_RW, 0, "USB umass"); SYSCTL_INT(_hw_usb_umass, OID_AUTO, debug, CTLFLAG_RW, &umass_debug, 0, "umass debug level"); + +TUNABLE_INT("hw.usb.umass.debug", &umass_debug); #else #define DIF(...) do { } while (0) #define DPRINTF(...) do { } while (0) @@ -309,32 +313,18 @@ typedef void (umass_callback_t)(struct umass_softc *sc, union ccb *ccb, typedef uint8_t (umass_transform_t)(struct umass_softc *sc, uint8_t *cmd_ptr, uint8_t cmd_len); -struct umass_devdescr { - uint32_t vid; -#define VID_WILDCARD 0xffffffff -#define VID_EOT 0xfffffffe - uint32_t pid; -#define PID_WILDCARD 0xffffffff -#define PID_EOT 0xfffffffe - uint32_t rid; -#define RID_WILDCARD 0xffffffff -#define RID_EOT 0xfffffffe - - /* wire and command protocol */ - uint16_t proto; -#define UMASS_PROTO_DEFAULT 0x0000 /* use protocol indicated by USB descriptors */ +/* Wire and command protocol */ #define UMASS_PROTO_BBB 0x0001 /* USB wire protocol */ #define UMASS_PROTO_CBI 0x0002 #define UMASS_PROTO_CBI_I 0x0004 -#define UMASS_PROTO_WIRE 0x00ff /* USB wire protocol mask */ -#define UMASS_PROTO_SCSI 0x0100 /* command protocol */ +#define UMASS_PROTO_WIRE 0x00ff /* USB wire protocol mask */ +#define UMASS_PROTO_SCSI 0x0100 /* command protocol */ #define UMASS_PROTO_ATAPI 0x0200 #define UMASS_PROTO_UFI 0x0400 #define UMASS_PROTO_RBC 0x0800 #define UMASS_PROTO_COMMAND 0xff00 /* command protocol mask */ - /* Device specific quirks */ - uint16_t quirks; +/* Device specific quirks */ #define NO_QUIRKS 0x0000 /* * The drive does not support Test Unit Ready. Convert to Start Unit @@ -382,608 +372,6 @@ struct umass_devdescr { * result. */ #define NO_SYNCHRONIZE_CACHE 0x4000 -}; - -static const struct umass_devdescr umass_devdescr[] = { - {USB_VENDOR_ASAHIOPTICAL, PID_WILDCARD, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - RS_NO_CLEAR_UA - }, - {USB_VENDOR_ADDON, USB_PRODUCT_ADDON_ATTACHE, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_ADDON, USB_PRODUCT_ADDON_A256MB, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_ADDON, USB_PRODUCT_ADDON_DISKPRO512, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_ADDONICS2, USB_PRODUCT_ADDONICS2_CABLE_205, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_AIPTEK, USB_PRODUCT_AIPTEK_POCKETCAM3M, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_AIPTEK2, USB_PRODUCT_AIPTEK2_SUNPLUS_TECH, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_SDCR_6335, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_TEST_UNIT_READY | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_AU6390, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_UMCR_9361, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_TRANSCEND, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_ASAHIOPTICAL, USB_PRODUCT_ASAHIOPTICAL_OPTIO230, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_ASAHIOPTICAL, USB_PRODUCT_ASAHIOPTICAL_OPTIO330, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_USB2SCSI, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_CASIO, USB_PRODUCT_CASIO_QV_DIGICAM, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_CCYU, USB_PRODUCT_CCYU_ED1064, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_CENTURY, USB_PRODUCT_CENTURY_EX35QUAT, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_XX6830XX, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_GETMAXLUN | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_DESKNOTE, USB_PRODUCT_DESKNOTE_UCR_61S2B, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_DMI, USB_PRODUCT_DMI_CFSM_RW, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_GETMAXLUN - }, - {USB_VENDOR_EPSON, USB_PRODUCT_EPSON_STYLUS_875DC, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_EPSON, USB_PRODUCT_EPSON_STYLUS_895, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_FEIYA, USB_PRODUCT_FEIYA_5IN1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_FREECOM, USB_PRODUCT_FREECOM_DVD, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_FUJIPHOTO, USB_PRODUCT_FUJIPHOTO_MASS0100, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - RS_NO_CLEAR_UA - }, - {USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB2IDE, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB2IDE_2, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB_2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - WRONG_CSWSIG - }, - {USB_VENDOR_HAGIWARA, USB_PRODUCT_HAGIWARA_FG, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_HAGIWARA, USB_PRODUCT_HAGIWARA_FGSM, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_HITACHI, USB_PRODUCT_HITACHI_DVDCAM_DZ_MV100A, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_HITACHI, USB_PRODUCT_HITACHI_DVDCAM_USB, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - NO_INQUIRY - }, - {USB_VENDOR_HP, USB_PRODUCT_HP_CDW4E, RID_WILDCARD, - UMASS_PROTO_ATAPI, - NO_QUIRKS - }, - {USB_VENDOR_HP, USB_PRODUCT_HP_CDW8200, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - NO_TEST_UNIT_READY | NO_START_STOP - }, - {USB_VENDOR_IMAGINATION, USB_PRODUCT_IMAGINATION_DBX1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - WRONG_CSWSIG - }, - {USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_USBCABLE, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_TEST_UNIT_READY | NO_START_STOP | ALT_IFACE_1 - }, - {USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_ATAPI, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_STORAGE_V2, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_IODATA, USB_PRODUCT_IODATA_IU_CD2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_IODATA, USB_PRODUCT_IODATA_DVR_UEH8, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP100, RID_WILDCARD, - /* - * XXX This is not correct as there are Zip drives that use - * ATAPI. - */ - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_TEST_UNIT_READY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_L3, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S3X, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S4, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_INQUIRY - }, - {USB_VENDOR_KYOCERA, USB_PRODUCT_KYOCERA_FINECAM_S5, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_LACIE, USB_PRODUCT_LACIE_HD, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_LEXAR, USB_PRODUCT_LEXAR_CF_READER, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_LEXAR, USB_PRODUCT_LEXAR_JUMPSHOT, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_LDR_H443SU2, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_LDR_H443U2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MELCO, USB_PRODUCT_MELCO_DUBPXXG, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_DPCM, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_TEST_UNIT_READY | NO_START_STOP - }, - {USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_SCSIDB25, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_SCSIHD50, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_E223, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_F300, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MITSUMI, USB_PRODUCT_MITSUMI_CDRRW, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_MITSUMI, USB_PRODUCT_MITSUMI_FDD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_E398, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_INQUIRY_EVPD | NO_GETMAXLUN - }, - {USB_VENDOR_MPMAN, PID_WILDCARD, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE | NO_GETMAXLUN | RS_NO_CLEAR_UA - }, - {USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY2, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_MYSON, USB_PRODUCT_MYSON_HEDEN, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - IGNORE_RESIDUE | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_MYSON, USB_PRODUCT_MYSON_HEDEN_8813, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_MYSON, USB_PRODUCT_MYSON_STARREADER, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND3260, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY - }, - {USB_VENDOR_NETAC, USB_PRODUCT_NETAC_CF_CARD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_NETAC, USB_PRODUCT_NETAC_ONLYDISK, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_NETCHIP, USB_PRODUCT_NETCHIP_CLIK_40, RID_WILDCARD, - UMASS_PROTO_ATAPI, - NO_INQUIRY - }, - {USB_VENDOR_NIKON, USB_PRODUCT_NIKON_D300, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - WRONG_CSWSIG - }, - {USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C700, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_GETMAXLUN - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_SDS_HOTFIND_D, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFMS_RW, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_COMBO, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_CFSM_READER2, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MDCFE_B_CF_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MDSM_B_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_INQUIRY - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_READER, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_UCF100, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_INQUIRY | NO_GETMAXLUN - }, - {USB_VENDOR_ONSPEC2, USB_PRODUCT_ONSPEC2_IMAGEMATE_SDDR55, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_GETMAXLUN - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXL840AN, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXLCB20AN, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_KXLCB35AN, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_PANASONIC, USB_PRODUCT_PANASONIC_LS120CAM, RID_WILDCARD, - UMASS_PROTO_UFI, - NO_QUIRKS - }, - { USB_VENDOR_PHILIPS, USB_PRODUCT_PHILIPS_SPE3030CC, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_PLEXTOR, USB_PRODUCT_PLEXTOR_40_12_40U, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_TEST_UNIT_READY - }, - {USB_VENDOR_PNY, USB_PRODUCT_PNY_ATTACHE2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE | NO_START_STOP - }, - {USB_VENDOR_SAMSUNG, USB_PRODUCT_SAMSUNG_YP_U2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - SHUTTLE_INIT | NO_GETMAXLUN - }, - {USB_VENDOR_SAMSUNG_TECHWIN, USB_PRODUCT_SAMSUNG_TECHWIN_DIGIMAX_410, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR05A, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - READ_CAPACITY_OFFBY1 | NO_GETMAXLUN - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR09, RID_WILDCARD, - UMASS_PROTO_SCSI, - READ_CAPACITY_OFFBY1 | NO_GETMAXLUN - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR12, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - READ_CAPACITY_OFFBY1 | NO_GETMAXLUN - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ2_256, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ4_128, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDCZ4_256, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SDDR31, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - READ_CAPACITY_OFFBY1 - }, - {USB_VENDOR_SCANLOGIC, USB_PRODUCT_SCANLOGIC_SL11R, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSB, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - NO_TEST_UNIT_READY | NO_START_STOP | SHUTTLE_INIT - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_CDRW, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_CF, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSBATAPI, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSBCFSM, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSCSI, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_HIFD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_SDDR09, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_GETMAXLUN - }, - {USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_ZIOMMC, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_I_BEAD100, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - SHUTTLE_INIT - }, - {USB_VENDOR_SIIG, USB_PRODUCT_SIIG_WINTERREADER, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_SKANHEX, USB_PRODUCT_SKANHEX_MD_7425, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SKANHEX, USB_PRODUCT_SKANHEX_SX_520Z, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, 0x0500, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - RBC_PAD_TO_12 - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40_MS, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, 0x0500, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - RBC_PAD_TO_12 - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, 0x0600, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - RBC_PAD_TO_12 - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_HANDYCAM, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MSC, RID_WILDCARD, - UMASS_PROTO_RBC | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_MSC_U03, RID_WILDCARD, - UMASS_PROTO_UFI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_NW_MS7, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MS_PEG_N760C, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_MSACUS1, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_GETMAXLUN - }, - {USB_VENDOR_SONY, USB_PRODUCT_SONY_PORTABLE_HDD_V2, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_SUPERTOP, USB_PRODUCT_SUPERTOP_IDE, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - IGNORE_RESIDUE | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_TAUGA, USB_PRODUCT_TAUGA_CAMERAMATE, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_TEAC, USB_PRODUCT_TEAC_FD05PUB, RID_WILDCARD, - UMASS_PROTO_UFI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_TECLAST, USB_PRODUCT_TECLAST_TLC300, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_TEST_UNIT_READY | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_TREK, USB_PRODUCT_TREK_MEMKEY, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_TREK, USB_PRODUCT_TREK_THUMBDRIVE_8MB, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_BBB, - IGNORE_RESIDUE - }, - {USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_C3310, RID_WILDCARD, - UMASS_PROTO_UFI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_MP3, RID_WILDCARD, - UMASS_PROTO_RBC, - NO_QUIRKS - }, - {USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_T33520, RID_WILDCARD, - UMASS_PROTO_SCSI, - NO_QUIRKS - }, - {USB_VENDOR_TWINMOS, USB_PRODUCT_TWINMOS_MDIV, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_QUIRKS - }, - {USB_VENDOR_VIA, USB_PRODUCT_VIA_USB2IDEBRIDGE, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_VIVITAR, USB_PRODUCT_VIVITAR_35XX, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_COMBO, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_EXTHDD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_WESTERN, USB_PRODUCT_WESTERN_MYBOOK, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY_EVPD - }, - {USB_VENDOR_WINMAXGROUP, USB_PRODUCT_WINMAXGROUP_FLASH64MC, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY - }, - {USB_VENDOR_YANO, USB_PRODUCT_YANO_FW800HD, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - FORCE_SHORT_INQUIRY | NO_START_STOP | IGNORE_RESIDUE - }, - {USB_VENDOR_YANO, USB_PRODUCT_YANO_U640MO, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI_I, - FORCE_SHORT_INQUIRY - }, - {USB_VENDOR_YEDATA, USB_PRODUCT_YEDATA_FLASHBUSTERU, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_CBI, - NO_GETMAXLUN - }, - {USB_VENDOR_ZORAN, USB_PRODUCT_ZORAN_EX20DSC, RID_WILDCARD, - UMASS_PROTO_ATAPI | UMASS_PROTO_CBI, - NO_QUIRKS - }, - {USB_VENDOR_MEIZU, USB_PRODUCT_MEIZU_M6_SL, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_INQUIRY | NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ACTIONS, USB_PRODUCT_ACTIONS_MP4, RID_WILDCARD, - UMASS_PROTO_SCSI | UMASS_PROTO_BBB, - NO_SYNCHRONIZE_CACHE - }, - {USB_VENDOR_ASUS, USB_PRODUCT_ASUS_GMSC, RID_WILDCARD, - UMASS_PROTO_DEFAULT, - NO_SYNCHRONIZE_CACHE - }, - {VID_EOT, PID_EOT, RID_EOT, 0, 0} -}; struct umass_softc { @@ -1025,9 +413,8 @@ struct umass_softc { umass_transform_t *sc_transform; uint32_t sc_unit; - - uint16_t sc_proto; /* wire and cmd protocol */ - uint16_t sc_quirks; /* they got it almost right */ + uint32_t sc_quirks; /* they got it almost right */ + uint32_t sc_proto; /* wire and cmd protocol */ uint8_t sc_name[16]; uint8_t sc_iface_no; /* interface number */ @@ -1037,10 +424,10 @@ struct umass_softc { }; struct umass_probe_proto { - uint16_t quirks; - uint16_t proto; + uint32_t quirks; + uint32_t proto; - int32_t error; + int error; }; /* prototypes */ @@ -1082,8 +469,6 @@ static void umass_cbi_start_status(struct umass_softc *); static void umass_t_cbi_data_clear_stall_callback(struct usb_xfer *, uint8_t, uint8_t, usb_error_t); static int umass_cam_attach_sim(struct umass_softc *); -static void umass_cam_rescan_callback(struct cam_periph *, union ccb *); -static void umass_cam_rescan(struct umass_softc *); static void umass_cam_attach(struct umass_softc *); static void umass_cam_detach_sim(struct umass_softc *); static void umass_cam_action(struct cam_sim *, union ccb *); @@ -1286,7 +671,7 @@ static struct usb_config umass_cbi_config[UMASS_T_CBI_MAX] = { .type = UE_INTERRUPT, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, - .flags = {.short_xfer_ok = 1,}, + .flags = {.short_xfer_ok = 1,.no_pipe_ok = 1,}, .bufsize = sizeof(umass_cbi_sbl_t), .callback = &umass_t_cbi_status_callback, .timeout = 5000, /* ms */ @@ -1364,7 +749,6 @@ umass_get_proto(struct usb_interface *iface) retval |= UMASS_PROTO_ATAPI; break; default: - retval = 0; goto done; } @@ -1380,7 +764,6 @@ umass_get_proto(struct usb_interface *iface) retval |= UMASS_PROTO_BBB; break; default: - retval = 0; goto done; } done: @@ -1388,78 +771,92 @@ done: } /* - * Match the device we are seeing with the - * devices supported. + * Match the device we are seeing with the devices supported. */ static struct umass_probe_proto umass_probe_proto(device_t dev, struct usb_attach_arg *uaa) { - const struct umass_devdescr *udd = umass_devdescr; struct umass_probe_proto ret; + uint32_t quirks = NO_QUIRKS; + uint32_t proto = umass_get_proto(uaa->iface); memset(&ret, 0, sizeof(ret)); - /* - * An entry specifically for Y-E Data devices as they don't fit in - * the device description table. - */ - if ((uaa->info.idVendor == USB_VENDOR_YEDATA) && - (uaa->info.idProduct == USB_PRODUCT_YEDATA_FLASHBUSTERU)) { + /* Search for protocol enforcement */ - /* - * Revisions < 1.28 do not handle the interrupt endpoint - * very well. - */ - if (uaa->info.bcdDevice < 0x128) { - ret.proto = UMASS_PROTO_UFI | UMASS_PROTO_CBI; - } else { - ret.proto = UMASS_PROTO_UFI | UMASS_PROTO_CBI_I; - } + if (usb_test_quirk(uaa, UQ_MSC_FORCE_WIRE_BBB)) { + proto &= ~UMASS_PROTO_WIRE; + proto |= UMASS_PROTO_BBB; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_WIRE_CBI)) { + proto &= ~UMASS_PROTO_WIRE; + proto |= UMASS_PROTO_CBI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_WIRE_CBI_I)) { + proto &= ~UMASS_PROTO_WIRE; + proto |= UMASS_PROTO_CBI_I; + } - /* - * Revisions < 1.28 do not have the TEST UNIT READY command - * Revisions == 1.28 have a broken TEST UNIT READY - */ - if (uaa->info.bcdDevice <= 0x128) { - ret.quirks |= NO_TEST_UNIT_READY; - } - ret.quirks |= RS_NO_CLEAR_UA | FLOPPY_SPEED; + if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_SCSI)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_SCSI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_ATAPI)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_ATAPI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_UFI)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_UFI; + } else if (usb_test_quirk(uaa, UQ_MSC_FORCE_PROTO_RBC)) { + proto &= ~UMASS_PROTO_COMMAND; + proto |= UMASS_PROTO_RBC; + } + + /* Check if the protocol is invalid */ + + if ((proto & UMASS_PROTO_COMMAND) == 0) { + ret.error = ENXIO; goto done; } - /* - * Check the list of supported devices for a match. While looking, - * check for wildcarded and fully matched. First match wins. - */ - for (; udd->vid != VID_EOT; udd++) { - if (((udd->vid == uaa->info.idVendor) || - (udd->vid == VID_WILDCARD)) && - ((udd->pid == uaa->info.idProduct) || - (udd->pid == PID_WILDCARD))) { - if (udd->rid == RID_WILDCARD) { - ret.proto = udd->proto; - ret.quirks = udd->quirks; - if (ret.proto == UMASS_PROTO_DEFAULT) - goto default_proto; - else - goto done; - } else if (udd->rid == uaa->info.bcdDevice) { - ret.proto = udd->proto; - ret.quirks = udd->quirks; - if (ret.proto == UMASS_PROTO_DEFAULT) - goto default_proto; - else - goto done; - } /* else RID does not match */ - } + + if ((proto & UMASS_PROTO_WIRE) == 0) { + ret.error = ENXIO; + goto done; } -default_proto: - ret.proto = umass_get_proto(uaa->iface); - if (ret.proto == 0) - ret.error = ENXIO; - else - ret.error = 0; + /* Search for quirks */ + + if (usb_test_quirk(uaa, UQ_MSC_NO_TEST_UNIT_READY)) + quirks |= NO_TEST_UNIT_READY; + if (usb_test_quirk(uaa, UQ_MSC_NO_RS_CLEAR_UA)) + quirks |= RS_NO_CLEAR_UA; + if (usb_test_quirk(uaa, UQ_MSC_NO_START_STOP)) + quirks |= NO_START_STOP; + if (usb_test_quirk(uaa, UQ_MSC_NO_GETMAXLUN)) + quirks |= NO_GETMAXLUN; + if (usb_test_quirk(uaa, UQ_MSC_NO_INQUIRY)) + quirks |= NO_INQUIRY; + if (usb_test_quirk(uaa, UQ_MSC_NO_INQUIRY_EVPD)) + quirks |= NO_INQUIRY_EVPD; + if (usb_test_quirk(uaa, UQ_MSC_NO_SYNC_CACHE)) + quirks |= NO_SYNCHRONIZE_CACHE; + if (usb_test_quirk(uaa, UQ_MSC_SHUTTLE_INIT)) + quirks |= SHUTTLE_INIT; + if (usb_test_quirk(uaa, UQ_MSC_ALT_IFACE_1)) + quirks |= ALT_IFACE_1; + if (usb_test_quirk(uaa, UQ_MSC_FLOPPY_SPEED)) + quirks |= FLOPPY_SPEED; + if (usb_test_quirk(uaa, UQ_MSC_IGNORE_RESIDUE)) + quirks |= IGNORE_RESIDUE; + if (usb_test_quirk(uaa, UQ_MSC_WRONG_CSWSIG)) + quirks |= WRONG_CSWSIG; + if (usb_test_quirk(uaa, UQ_MSC_RBC_PAD_TO_12)) + quirks |= RBC_PAD_TO_12; + if (usb_test_quirk(uaa, UQ_MSC_READ_CAP_OFFBY1)) + quirks |= READ_CAPACITY_OFFBY1; + if (usb_test_quirk(uaa, UQ_MSC_FORCE_SHORT_INQ)) + quirks |= FORCE_SHORT_INQUIRY; + done: + ret.quirks = quirks; + ret.proto = proto; return (ret); } @@ -1587,9 +984,7 @@ umass_attach(device_t dev) err = usbd_transfer_setup(uaa->device, &uaa->info.bIfaceIndex, sc->sc_xfer, umass_cbi_config, - (sc->sc_proto & UMASS_PROTO_CBI_I) ? - UMASS_T_CBI_MAX : (UMASS_T_CBI_MAX - 2), sc, - &sc->sc_mtx); + UMASS_T_CBI_MAX, sc, &sc->sc_mtx); /* skip reset first time */ sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; @@ -1669,6 +1064,7 @@ umass_detach(device_t dev) #if (__FreeBSD_version >= 700037) mtx_unlock(&sc->sc_mtx); #endif + mtx_destroy(&sc->sc_mtx); return (0); /* success */ } @@ -2278,7 +1674,7 @@ umass_t_cbi_reset1_callback(struct usb_xfer *xfer, usb_error_t error) switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: umass_transfer_start(sc, UMASS_T_CBI_RESET2); - return; + break; case USB_ST_SETUP: /* @@ -2325,11 +1721,14 @@ umass_t_cbi_reset1_callback(struct usb_xfer *xfer, usb_error_t error) usbd_xfer_set_frame_len(xfer, 1, sizeof(buf)); usbd_xfer_set_frames(xfer, 2); usbd_transfer_submit(xfer); - return; + break; default: /* Error */ - umass_tr_error(xfer, error); - return; + if (error == USB_ERR_CANCELLED) + umass_tr_error(xfer, error); + else + umass_transfer_start(sc, UMASS_T_CBI_RESET2); + break; } } @@ -2374,17 +1773,17 @@ tr_transferred: } else { umass_transfer_start(sc, next_xfer); } - return; + break; case USB_ST_SETUP: if (usbd_clear_stall_callback(xfer, sc->sc_xfer[stall_xfer])) { goto tr_transferred; /* should not happen */ } - return; + break; default: /* Error */ umass_tr_error(xfer, error); - return; + break; } } @@ -2407,7 +1806,7 @@ umass_t_cbi_command_callback(struct usb_xfer *xfer, usb_error_t error) (sc, (sc->sc_transfer.dir == DIR_IN) ? UMASS_T_CBI_DATA_READ : UMASS_T_CBI_DATA_WRITE); } - return; + break; case USB_ST_SETUP: @@ -2446,12 +1845,13 @@ umass_t_cbi_command_callback(struct usb_xfer *xfer, usb_error_t error) usbd_transfer_submit(xfer); } - return; + break; default: /* Error */ umass_tr_error(xfer, error); - return; - + /* skip reset */ + sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; + break; } } @@ -2487,7 +1887,7 @@ umass_t_cbi_data_read_callback(struct usb_xfer *xfer, usb_error_t error) if (sc->sc_transfer.data_rem == 0) { umass_cbi_start_status(sc); - return; + break; } if (max_bulk > sc->sc_transfer.data_rem) { max_bulk = sc->sc_transfer.data_rem; @@ -2501,7 +1901,7 @@ umass_t_cbi_data_read_callback(struct usb_xfer *xfer, usb_error_t error) usbd_xfer_set_frame_len(xfer, 0, max_bulk); #endif usbd_transfer_submit(xfer); - return; + break; default: /* Error */ if ((error == USB_ERR_CANCELLED) || @@ -2510,7 +1910,7 @@ umass_t_cbi_data_read_callback(struct usb_xfer *xfer, usb_error_t error) } else { umass_transfer_start(sc, UMASS_T_CBI_DATA_RD_CS); } - return; + break; } } @@ -2550,7 +1950,7 @@ umass_t_cbi_data_write_callback(struct usb_xfer *xfer, usb_error_t error) if (sc->sc_transfer.data_rem == 0) { umass_cbi_start_status(sc); - return; + break; } if (max_bulk > sc->sc_transfer.data_rem) { max_bulk = sc->sc_transfer.data_rem; @@ -2567,7 +1967,7 @@ umass_t_cbi_data_write_callback(struct usb_xfer *xfer, usb_error_t error) #endif usbd_transfer_submit(xfer); - return; + break; default: /* Error */ if ((error == USB_ERR_CANCELLED) || @@ -2576,7 +1976,7 @@ umass_t_cbi_data_write_callback(struct usb_xfer *xfer, usb_error_t error) } else { umass_transfer_start(sc, UMASS_T_CBI_DATA_WR_CS); } - return; + break; } } @@ -2637,7 +2037,7 @@ umass_t_cbi_status_callback(struct usb_xfer *xfer, usb_error_t error) (sc->sc_transfer.callback) (sc, ccb, residue, status); - return; + break; } else { @@ -2662,7 +2062,7 @@ umass_t_cbi_status_callback(struct usb_xfer *xfer, usb_error_t error) (sc->sc_transfer.callback) (sc, ccb, residue, status); - return; + break; } } @@ -2672,13 +2072,13 @@ umass_t_cbi_status_callback(struct usb_xfer *xfer, usb_error_t error) tr_setup: usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); usbd_transfer_submit(xfer); - return; + break; default: /* Error */ DPRINTF(sc, UDMASS_CBI, "Failed to read CSW: %s\n", usbd_errstr(error)); umass_tr_error(xfer, error); - return; + break; } } @@ -2744,68 +2144,6 @@ umass_cam_attach_sim(struct umass_softc *sc) return (0); } -static void -umass_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb) -{ -#if USB_DEBUG - struct umass_softc *sc = NULL; - - if (ccb->ccb_h.status != CAM_REQ_CMP) { - DPRINTF(sc, UDMASS_SCSI, "%s:%d Rescan failed, 0x%04x\n", - periph->periph_name, periph->unit_number, - ccb->ccb_h.status); - } else { - DPRINTF(sc, UDMASS_SCSI, "%s%d: Rescan succeeded\n", - periph->periph_name, periph->unit_number); - } -#endif - - xpt_free_path(ccb->ccb_h.path); - free(ccb, M_USBDEV); -} - -static void -umass_cam_rescan(struct umass_softc *sc) -{ - struct cam_path *path; - union ccb *ccb; - - DPRINTF(sc, UDMASS_SCSI, "scbus%d: scanning for %d:%d:%d\n", - cam_sim_path(sc->sc_sim), - cam_sim_path(sc->sc_sim), - sc->sc_unit, CAM_LUN_WILDCARD); - - ccb = malloc(sizeof(*ccb), M_USBDEV, M_WAITOK | M_ZERO); - - if (ccb == NULL) { - return; - } -#if (__FreeBSD_version >= 700037) - mtx_lock(&sc->sc_mtx); -#endif - - if (xpt_create_path(&path, xpt_periph, cam_sim_path(sc->sc_sim), - CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) - != CAM_REQ_CMP) { -#if (__FreeBSD_version >= 700037) - mtx_unlock(&sc->sc_mtx); -#endif - free(ccb, M_USBDEV); - return; - } - xpt_setup_ccb(&ccb->ccb_h, path, 5 /* priority (low) */ ); - ccb->ccb_h.func_code = XPT_SCAN_BUS; - ccb->ccb_h.cbfcnp = &umass_cam_rescan_callback; - ccb->crcn.flags = CAM_FLAG_NONE; - xpt_action(ccb); - -#if (__FreeBSD_version >= 700037) - mtx_unlock(&sc->sc_mtx); -#endif - - /* The scan is in progress now. */ -} - static void umass_cam_attach(struct umass_softc *sc) { @@ -2816,19 +2154,6 @@ umass_cam_attach(struct umass_softc *sc) sc->sc_name, cam_sim_path(sc->sc_sim), sc->sc_unit, CAM_LUN_WILDCARD, cam_sim_path(sc->sc_sim)); - - if (!cold) { - /* - * Notify CAM of the new device after a short delay. Any - * failure is benign, as the user can still do it by hand - * (camcontrol rescan ). Only do this if we are not - * booting, because CAM does a scan after booting has - * completed, when interrupts have been enabled. - */ - - /* scan the new sim */ - umass_cam_rescan(sc); - } } /* umass_cam_detach @@ -2844,7 +2169,7 @@ umass_cam_detach_sim(struct umass_softc *sc) sc->sc_sim->softc = UMASS_GONE; cam_sim_free(sc->sc_sim, /* free_devq */ TRUE); } else { - panic("%s: CAM layer is busy!\n", + panic("%s: CAM layer is busy\n", sc->sc_name); } sc->sc_sim = NULL; @@ -2860,8 +2185,9 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb) { struct umass_softc *sc = (struct umass_softc *)sim->softc; - if (sc == UMASS_GONE) { - ccb->ccb_h.status = CAM_TID_INVALID; + if (sc == UMASS_GONE || + (sc != NULL && !usbd_device_attached(sc->sc_udev))) { + ccb->ccb_h.status = CAM_SEL_TIMEOUT; xpt_done(ccb); return; } @@ -3268,11 +2594,19 @@ umass_cam_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue, default: /* - * the wire protocol failed and will have recovered - * (hopefully). We return an error to CAM and let CAM retry - * the command if necessary. + * The wire protocol failed and will hopefully have + * recovered. We return an error to CAM and let CAM + * retry the command if necessary. In case of SCSI IO + * commands we ask the CAM layer to check the + * condition first. This is a quick hack to make + * certain devices work. */ - ccb->ccb_h.status = CAM_REQ_CMP_ERR; + if (ccb->ccb_h.func_code == XPT_SCSI_IO) { + ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR; + ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; + } else { + ccb->ccb_h.status = CAM_REQ_CMP_ERR; + } xpt_done(ccb); break; } @@ -3635,7 +2969,7 @@ umass_atapi_transform(struct umass_softc *sc, uint8_t *cmd_ptr, case 0xad: /* READ_DVD_STRUCTURE */ case 0xbb: /* SET_CD_SPEED */ case 0xe5: /* READ_TRACK_INFO_PHILIPS */ - break;; + break; case READ_12: case WRITE_12: @@ -3643,7 +2977,7 @@ umass_atapi_transform(struct umass_softc *sc, uint8_t *cmd_ptr, DPRINTF(sc, UDMASS_SCSI, "Unsupported ATAPI " "command 0x%02x - trying anyway\n", cmd_ptr[0]); - break;; + break; } bcopy(cmd_ptr, sc->sc_transfer.cmd_data, cmd_len); diff --git a/sys/dev/usb/template/usb_template.c b/sys/dev/usb/template/usb_template.c index d9e0dc167519..d3271b24f742 100644 --- a/sys/dev/usb/template/usb_template.c +++ b/sys/dev/usb/template/usb_template.c @@ -727,7 +727,7 @@ handle_endpoint_desc: if ((pf->max_in_frame_size < wMaxPacketSize) || (pf->max_out_frame_size < wMaxPacketSize)) { DPRINTFN(0, "Endpoint profile %u " - "has too small buffer!\n", ep_no); + "has too small buffer\n", ep_no); return (1); } } else if (ed->bEndpointAddress & UE_DIR_IN) { @@ -735,7 +735,7 @@ handle_endpoint_desc: (1 << (ep_no % 8)); if (pf->max_in_frame_size < wMaxPacketSize) { DPRINTFN(0, "Endpoint profile %u " - "has too small buffer!\n", ep_no); + "has too small buffer\n", ep_no); return (1); } } else { @@ -743,7 +743,7 @@ handle_endpoint_desc: (1 << (ep_no % 8)); if (pf->max_out_frame_size < wMaxPacketSize) { DPRINTFN(0, "Endpoint profile %u " - "has too small buffer!\n", ep_no); + "has too small buffer\n", ep_no); return (1); } } diff --git a/sys/dev/usb/usb.h b/sys/dev/usb/usb.h index 119839831c1c..8ebaeecb720a 100644 --- a/sys/dev/usb/usb.h +++ b/sys/dev/usb/usb.h @@ -424,9 +424,9 @@ typedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t; #define UISUBCLASS_MOBILE_DIRECT_LINE_MODEL 10 #define UISUBCLASS_OBEX 11 #define UISUBCLASS_ETHERNET_EMULATION_MODEL 12 +#define UISUBCLASS_NETWORK_CONTROL_MODEL 13 #define UIPROTO_CDC_AT 1 -#define UIPROTO_CDC_ETH_512X4 0x76 /* FreeBSD specific */ #define UICLASS_HID 0x03 #define UISUBCLASS_BOOT 1 @@ -461,7 +461,7 @@ typedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t; #define UIPROTO_HSHUBMTT 1 #define UICLASS_CDC_DATA 0x0a -#define UISUBCLASS_DATA 0 +#define UISUBCLASS_DATA 0x00 #define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */ #define UIPROTO_DATA_HDLC 0x31 /* HDLC */ #define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */ @@ -475,6 +475,7 @@ typedef struct usb_interface_assoc_descriptor usb_interface_assoc_descriptor_t; #define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */ #define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc. */ #define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */ +#define UIPROTO_DATA_NCM 0x01 /* Network Control Model */ #define UICLASS_SMARTCARD 0x0b #define UICLASS_FIRM_UPD 0x0c diff --git a/sys/dev/usb/usb_bus.h b/sys/dev/usb/usb_bus.h index 8d64199e11e8..99e97770665c 100644 --- a/sys/dev/usb/usb_bus.h +++ b/sys/dev/usb/usb_bus.h @@ -98,10 +98,14 @@ struct usb_bus { uint8_t devices_max; /* maximum number of USB devices */ uint8_t do_probe; /* set if USB BUS should be re-probed */ + /* + * The scratch area can only be used inside the explore thread + * belonging to the give serial bus. + */ union { struct usb_hw_ep_scratch hw_ep_scratch[1]; struct usb_temp_setup temp_setup[1]; - uint8_t data[128]; + uint8_t data[255]; } scratch[1]; }; diff --git a/sys/dev/usb/usb_busdma.c b/sys/dev/usb/usb_busdma.c index 177b94faceb1..45482e25da76 100644 --- a/sys/dev/usb/usb_busdma.c +++ b/sys/dev/usb/usb_busdma.c @@ -445,7 +445,7 @@ usb_pc_common_mem_cb(void *arg, bus_dma_segment_t *segs, /* * This check verifies that the physical address is correct: */ - DPRINTFN(0, "Page offset was not preserved!\n"); + DPRINTFN(0, "Page offset was not preserved\n"); error = 1; goto done; } @@ -764,8 +764,8 @@ usb_dma_tag_find(struct usb_dma_parent_tag *udpt, struct usb_dma_tag *udt; uint8_t nudt; - USB_ASSERT(align > 0, ("Invalid parameter align = 0!\n")); - USB_ASSERT(size > 0, ("Invalid parameter size = 0!\n")); + USB_ASSERT(align > 0, ("Invalid parameter align = 0\n")); + USB_ASSERT(size > 0, ("Invalid parameter size = 0\n")); udt = udpt->utag_first; nudt = udpt->utag_max; diff --git a/sys/dev/usb/usb_cdc.h b/sys/dev/usb/usb_cdc.h index f6e312c99a52..7032bf44af05 100644 --- a/sys/dev/usb/usb_cdc.h +++ b/sys/dev/usb/usb_cdc.h @@ -188,4 +188,107 @@ struct usb_cdc_notification { #define UCDC_MDM_PARITY_ERR 0x20 #define UCDC_MDM_OVERRUN_ERR 0x40 +/* + * Network Control Model, NCM16 + NCM32, protocol definitions + */ +struct usb_ncm16_hdr { + uDWord dwSignature; + uWord wHeaderLength; + uWord wSequence; + uWord wBlockLength; + uWord wDptIndex; +} __packed; + +struct usb_ncm16_dp { + uWord wFrameIndex; + uWord wFrameLength; +} __packed; + +struct usb_ncm16_dpt { + uDWord dwSignature; + uWord wLength; + uWord wNextNdpIndex; + struct usb_ncm16_dp dp[0]; +} __packed; + +struct usb_ncm32_hdr { + uDWord dwSignature; + uWord wHeaderLength; + uWord wSequence; + uDWord dwBlockLength; + uDWord dwDptIndex; +} __packed; + +struct usb_ncm32_dp { + uDWord dwFrameIndex; + uDWord dwFrameLength; +} __packed; + +struct usb_ncm32_dpt { + uDWord dwSignature; + uWord wLength; + uWord wReserved6; + uDWord dwNextNdpIndex; + uDWord dwReserved12; + struct usb_ncm32_dp dp[0]; +} __packed; + +/* Communications interface class specific descriptors */ + +#define UCDC_NCM_FUNC_DESC_SUBTYPE 0x1A + +struct usb_ncm_func_descriptor { + uByte bLength; + uByte bDescriptorType; + uByte bDescriptorSubtype; + uByte bcdNcmVersion[2]; + uByte bmNetworkCapabilities; +#define UCDC_NCM_CAP_FILTER 0x01 +#define UCDC_NCM_CAP_MAC_ADDR 0x02 +#define UCDC_NCM_CAP_ENCAP 0x04 +#define UCDC_NCM_CAP_MAX_DATA 0x08 +#define UCDC_NCM_CAP_CRCMODE 0x10 +} __packed; + +/* Communications interface specific class request codes */ + +#define UCDC_NCM_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define UCDC_NCM_SET_ETHERNET_POWER_MGMT_PATTERN_FILTER 0x41 +#define UCDC_NCM_GET_ETHERNET_POWER_MGMT_PATTERN_FILTER 0x42 +#define UCDC_NCM_SET_ETHERNET_PACKET_FILTER 0x43 +#define UCDC_NCM_GET_ETHERNET_STATISTIC 0x44 +#define UCDC_NCM_GET_NTB_PARAMETERS 0x80 +#define UCDC_NCM_GET_NET_ADDRESS 0x81 +#define UCDC_NCM_SET_NET_ADDRESS 0x82 +#define UCDC_NCM_GET_NTB_FORMAT 0x83 +#define UCDC_NCM_SET_NTB_FORMAT 0x84 +#define UCDC_NCM_GET_NTB_INPUT_SIZE 0x85 +#define UCDC_NCM_SET_NTB_INPUT_SIZE 0x86 +#define UCDC_NCM_GET_MAX_DATAGRAM_SIZE 0x87 +#define UCDC_NCM_SET_MAX_DATAGRAM_SIZE 0x88 +#define UCDC_NCM_GET_CRC_MODE 0x89 +#define UCDC_NCM_SET_CRC_MODE 0x8A + +struct usb_ncm_parameters { + uWord wLength; + uWord bmNtbFormatsSupported; +#define UCDC_NCM_FORMAT_NTB16 0x0001 +#define UCDC_NCM_FORMAT_NTB32 0x0002 + uDWord dwNtbInMaxSize; + uWord wNdpInDivisor; + uWord wNdpInPayloadRemainder; + uWord wNdpInAlignment; + uWord wReserved14; + uDWord dwNtbOutMaxSize; + uWord wNdpOutDivisor; + uWord wNdpOutPayloadRemainder; + uWord wNdpOutAlignment; + uWord wReserved26; +} __packed; + +/* Communications interface specific class notification codes */ +#define UCDC_NCM_NOTIF_NETWORK_CONNECTION 0x00 +#define UCDC_NCM_NOTIF_RESPONSE_AVAILABLE 0x01 +#define UCDC_NCM_NOTIF_CONNECTION_SPEED_CHANGE 0x2A + #endif /* _USB_CDC_H_ */ diff --git a/sys/dev/usb/usb_compat_linux.c b/sys/dev/usb/usb_compat_linux.c index 604ac4d88458..b95a4f6f3498 100644 --- a/sys/dev/usb/usb_compat_linux.c +++ b/sys/dev/usb/usb_compat_linux.c @@ -624,10 +624,11 @@ usb_start_wait_urb(struct urb *urb, usb_timeout_t timeout, uint16_t *p_actlen) done: if (do_unlock) mtx_unlock(&Giant); - if (err) { - *p_actlen = 0; - } else { - *p_actlen = urb->actual_length; + if (p_actlen != NULL) { + if (err) + *p_actlen = 0; + else + *p_actlen = urb->actual_length; } return (err); } @@ -1362,8 +1363,17 @@ usb_linux_isoc_callback(struct usb_xfer *xfer, usb_error_t error) for (x = 0; x < urb->number_of_packets; x++) { uipd = urb->iso_frame_desc + x; + if (uipd->length > xfer->frlengths[x]) { + if (urb->transfer_flags & URB_SHORT_NOT_OK) { + /* XXX should be EREMOTEIO */ + uipd->status = -EPIPE; + } else { + uipd->status = 0; + } + } else { + uipd->status = 0; + } uipd->actual_length = xfer->frlengths[x]; - uipd->status = 0; if (!xfer->flags.ext_buffer) { usbd_copy_out(xfer->frbuffers, offset, USB_ADD_BYTES(urb->transfer_buffer, @@ -1385,8 +1395,8 @@ usb_linux_isoc_callback(struct usb_xfer *xfer, usb_error_t error) if (xfer->actlen < xfer->sumlen) { /* short transfer */ if (urb->transfer_flags & URB_SHORT_NOT_OK) { - urb->status = -EPIPE; /* XXX should be - * EREMOTEIO */ + /* XXX should be EREMOTEIO */ + urb->status = -EPIPE; } else { urb->status = 0; } @@ -1482,6 +1492,7 @@ tr_setup: /* Set zero for "actual_length" */ for (x = 0; x < urb->number_of_packets; x++) { urb->iso_frame_desc[x].actual_length = 0; + urb->iso_frame_desc[x].status = urb->status; } /* call callback */ @@ -1663,3 +1674,58 @@ setup_bulk: goto tr_setup; } } + +/*------------------------------------------------------------------------* + * usb_fill_bulk_urb + *------------------------------------------------------------------------*/ +void +usb_fill_bulk_urb(struct urb *urb, struct usb_device *udev, + struct usb_host_endpoint *uhe, void *buf, + int length, usb_complete_t callback, void *arg) +{ + urb->dev = udev; + urb->endpoint = uhe; + urb->transfer_buffer = buf; + urb->transfer_buffer_length = length; + urb->complete = callback; + urb->context = arg; +} + +/*------------------------------------------------------------------------* + * usb_bulk_msg + * + * NOTE: This function can also be used for interrupt endpoints! + * + * Return values: + * 0: Success + * Else: Failure + *------------------------------------------------------------------------*/ +int +usb_bulk_msg(struct usb_device *udev, struct usb_host_endpoint *uhe, + void *data, int len, uint16_t *pactlen, usb_timeout_t timeout) +{ + struct urb *urb; + int err; + + if (uhe == NULL) + return (-EINVAL); + if (len < 0) + return (-EINVAL); + + err = usb_setup_endpoint(udev, uhe, 4096 /* bytes */); + if (err) + return (err); + + urb = usb_alloc_urb(0, 0); + if (urb == NULL) + return (-ENOMEM); + + usb_fill_bulk_urb(urb, udev, uhe, data, len, + usb_linux_wait_complete, NULL); + + err = usb_start_wait_urb(urb, timeout, pactlen); + + usb_free_urb(urb); + + return (err); +} diff --git a/sys/dev/usb/usb_compat_linux.h b/sys/dev/usb/usb_compat_linux.h index 25a5bfb5d1e3..1f00d4b4addc 100644 --- a/sys/dev/usb/usb_compat_linux.h +++ b/sys/dev/usb/usb_compat_linux.h @@ -217,7 +217,7 @@ struct usb_iso_packet_descriptor { * packets are usually back to back) */ uint16_t length; /* expected length */ uint16_t actual_length; - uint16_t status; + int16_t status; /* transfer status */ }; /* @@ -299,6 +299,11 @@ void usb_set_intfdata(struct usb_interface *intf, void *data); void usb_linux_register(void *arg); void usb_linux_deregister(void *arg); +void usb_fill_bulk_urb(struct urb *, struct usb_device *, + struct usb_host_endpoint *, void *, int, usb_complete_t, void *); +int usb_bulk_msg(struct usb_device *, struct usb_host_endpoint *, + void *, int, uint16_t *, usb_timeout_t); + #define interface_to_usbdev(intf) (intf)->linux_udev #define interface_to_bsddev(intf) (intf)->linux_udev diff --git a/sys/dev/usb/usb_core.h b/sys/dev/usb/usb_core.h index 84c163b381c0..3dfd0d1ab6c5 100644 --- a/sys/dev/usb/usb_core.h +++ b/sys/dev/usb/usb_core.h @@ -112,6 +112,7 @@ struct usb_xfer_flags_int { uint8_t curr_dma_set:1; /* used by USB HC/DC driver */ uint8_t can_cancel_immed:1; /* set if USB transfer can be * cancelled immediately */ + uint8_t doing_callback:1; /* set if executing the callback */ }; /* @@ -160,10 +161,8 @@ struct usb_xfer { uint8_t address; /* physical USB address */ uint8_t endpointno; /* physical USB endpoint */ uint8_t max_packet_count; - uint8_t usb_smask; - uint8_t usb_cmask; - uint8_t usb_uframe; uint8_t usb_state; + uint8_t fps_shift; /* down shift of FPS, 0..3 */ usb_error_t error; diff --git a/sys/dev/usb/usb_debug.c b/sys/dev/usb/usb_debug.c index 7f1e4e921a06..64c3a08b4126 100644 --- a/sys/dev/usb/usb_debug.c +++ b/sys/dev/usb/usb_debug.c @@ -67,6 +67,8 @@ SYSCTL_NODE(_hw, OID_AUTO, usb, CTLFLAG_RW, 0, "USB debugging"); SYSCTL_INT(_hw_usb, OID_AUTO, debug, CTLFLAG_RW, &usb_debug, 0, "Debug level"); +TUNABLE_INT("hw.usb.debug", &usb_debug); + /*------------------------------------------------------------------------* * usb_dump_iface * diff --git a/sys/dev/usb/usb_debug.h b/sys/dev/usb/usb_debug.h index dfe2edf55dfa..b6bfbcfca1a8 100644 --- a/sys/dev/usb/usb_debug.h +++ b/sys/dev/usb/usb_debug.h @@ -35,11 +35,11 @@ extern int usb_debug; /* Check if USB debugging is enabled. */ #ifdef USB_DEBUG_VAR #if (USB_DEBUG != 0) -#define DPRINTFN(n,fmt,...) do { \ - if ((USB_DEBUG_VAR) >= (n)) { \ - printf("%s:%u: " fmt, \ - __FUNCTION__, __LINE__,## __VA_ARGS__); \ - } \ +#define DPRINTFN(n,fmt,...) do { \ + if ((USB_DEBUG_VAR) >= (n)) { \ + printf("%s: " fmt, \ + __FUNCTION__,## __VA_ARGS__); \ + } \ } while (0) #define DPRINTF(...) DPRINTFN(1, __VA_ARGS__) #else diff --git a/sys/dev/usb/usb_dev.c b/sys/dev/usb/usb_dev.c index c828b24057fa..dffabad29b9f 100644 --- a/sys/dev/usb/usb_dev.c +++ b/sys/dev/usb/usb_dev.c @@ -85,6 +85,8 @@ static int usb_fifo_debug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, dev, CTLFLAG_RW, 0, "USB device"); SYSCTL_INT(_hw_usb_dev, OID_AUTO, debug, CTLFLAG_RW, &usb_fifo_debug, 0, "Debug Level"); + +TUNABLE_INT("hw.usb.dev.debug", &usb_fifo_debug); #endif #if ((__FreeBSD_version >= 700001) || (__FreeBSD_version == 0) || \ @@ -573,7 +575,7 @@ usb_fifo_free(struct usb_fifo *f) (f->udev->fifo[f->fifo_index] == f)) { f->udev->fifo[f->fifo_index] = NULL; } else { - DPRINTFN(0, "USB FIFO %p has not been linked!\n", f); + DPRINTFN(0, "USB FIFO %p has not been linked\n", f); } /* decrease refcount */ @@ -950,7 +952,7 @@ usb_dev_init_post(void *arg) usb_dev = make_dev(&usb_static_devsw, 0, UID_ROOT, GID_OPERATOR, 0644, USB_DEVICE_NAME); if (usb_dev == NULL) { - DPRINTFN(0, "Could not create usb bus device!\n"); + DPRINTFN(0, "Could not create usb bus device\n"); } } diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index 635a9b1528d4..5aef59d379d0 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -105,9 +105,23 @@ static void usb_cdev_cleanup(void *); int usb_template = 0; +TUNABLE_INT("hw.usb.usb_template", &usb_template); SYSCTL_INT(_hw_usb, OID_AUTO, template, CTLFLAG_RW, &usb_template, 0, "Selected USB device side template"); +/* English is default language */ + +static int usb_lang_id = 0x0009; +static int usb_lang_mask = 0x00FF; + +TUNABLE_INT("hw.usb.usb_lang_id", &usb_lang_id); +SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_id, CTLFLAG_RW, + &usb_lang_id, 0, "Preferred USB language ID"); + +TUNABLE_INT("hw.usb.usb_lang_mask", &usb_lang_mask); +SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_mask, CTLFLAG_RW, + &usb_lang_mask, 0, "Preferred USB language mask"); + static const char* statestr[USB_STATE_MAX] = { [USB_STATE_DETACHED] = "DETACHED", [USB_STATE_ATTACHED] = "ATTACHED", @@ -367,12 +381,14 @@ usb_init_endpoint(struct usb_device *udev, uint8_t iface_index, struct usb_endpoint * usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep) { - struct usb_endpoint *ep_end = udev->endpoints + udev->endpoints_max; + struct usb_endpoint *ep_end; /* be NULL safe */ if (udev == NULL) return (NULL); + ep_end = udev->endpoints + udev->endpoints_max; + /* get next endpoint */ if (ep == NULL) ep = udev->endpoints; @@ -478,7 +494,7 @@ usbd_set_config_index(struct usb_device *udev, uint8_t index) usbd_enum_lock(udev); } - usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_SUBDEV); + usb_unconfigure(udev, 0); if (index == USB_UNCONFIG_INDEX) { /* @@ -582,7 +598,7 @@ usbd_set_config_index(struct usb_device *udev, uint8_t index) done: DPRINTF("error=%s\n", usbd_errstr(err)); if (err) { - usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_SUBDEV); + usb_unconfigure(udev, 0); } if (do_unlock) usbd_enum_unlock(udev); @@ -649,7 +665,7 @@ usb_config_parse(struct usb_device *udev, uint8_t iface_index, uint8_t cmd) /* look for matching endpoints */ if ((iface_index == USB_IFACE_INDEX_ANY) || (iface_index == ep->iface_index)) { - if (ep->refcount != 0) { + if (ep->refcount_alloc != 0) { /* * This typically indicates a * more serious error. @@ -989,18 +1005,13 @@ usb_detach_device_sub(struct usb_device *udev, device_t *ppdev, device_t dev; int err; - if (!(flag & USB_UNCFG_FLAG_FREE_SUBDEV)) { - - *ppdev = NULL; - - } else if (*ppdev) { - + dev = *ppdev; + if (dev) { /* * NOTE: It is important to clear "*ppdev" before deleting * the child due to some device methods being called late * during the delete process ! */ - dev = *ppdev; *ppdev = NULL; device_printf(dev, "at %s, port %d, addr %d " @@ -1012,7 +1023,7 @@ usb_detach_device_sub(struct usb_device *udev, device_t *ppdev, if (udev->flags.peer_suspended) { err = DEVICE_RESUME(dev); if (err) { - device_printf(dev, "Resume failed!\n"); + device_printf(dev, "Resume failed\n"); } } if (device_detach(dev)) { @@ -1027,7 +1038,7 @@ usb_detach_device_sub(struct usb_device *udev, device_t *ppdev, error: /* Detach is not allowed to fail in the USB world */ - panic("An USB driver would not detach!\n"); + panic("A USB driver would not detach\n"); } /*------------------------------------------------------------------------* @@ -1120,7 +1131,7 @@ usb_probe_and_attach_sub(struct usb_device *udev, * to device_detach(). USB devices should * never fail on detach! */ - panic("device_delete_child() failed!\n"); + panic("device_delete_child() failed\n"); } } if (uaa->temp_dev == NULL) { @@ -1129,7 +1140,7 @@ usb_probe_and_attach_sub(struct usb_device *udev, uaa->temp_dev = device_add_child(udev->parent_dev, NULL, -1); if (uaa->temp_dev == NULL) { device_printf(udev->parent_dev, - "Device creation failed!\n"); + "Device creation failed\n"); return (1); /* failure */ } device_set_ivars(uaa->temp_dev, uaa); @@ -1193,6 +1204,7 @@ usb_init_attach_arg(struct usb_device *udev, uaa->device = udev; uaa->usb_mode = udev->flags.usb_mode; uaa->port = udev->port_no; + uaa->dev_state = UAA_DEV_READY; uaa->info.idVendor = UGETW(udev->ddesc.idVendor); uaa->info.idProduct = UGETW(udev->ddesc.idProduct); @@ -1309,7 +1321,7 @@ usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index) /* remove the last created child; it is unused */ if (device_delete_child(udev->parent_dev, uaa.temp_dev)) { - DPRINTFN(0, "device delete child failed!\n"); + DPRINTFN(0, "device delete child failed\n"); } } done: @@ -1342,7 +1354,7 @@ usb_suspend_resume_sub(struct usb_device *udev, device_t dev, uint8_t do_suspend err = DEVICE_RESUME(dev); } if (err) { - device_printf(dev, "%s failed!\n", + device_printf(dev, "%s failed\n", do_suspend ? "Suspend" : "Resume"); } } @@ -1439,9 +1451,12 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, struct usb_device *adev; struct usb_device *hub; uint8_t *scratch_ptr; - uint32_t scratch_size; + size_t scratch_size; usb_error_t err; uint8_t device_index; + uint8_t config_index; + uint8_t config_quirk; + uint8_t set_config_failed; DPRINTF("parent_dev=%p, bus=%p, parent_hub=%p, depth=%u, " "port_index=%u, port_no=%u, speed=%u, usb_mode=%u\n", @@ -1462,13 +1477,13 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, if (device_index == bus->devices_max) { device_printf(bus->bdev, - "No free USB device index for new device!\n"); + "No free USB device index for new device\n"); return (NULL); } if (depth > 0x10) { device_printf(bus->bdev, - "Invalid device depth!\n"); + "Invalid device depth\n"); return (NULL); } udev = malloc(sizeof(*udev), M_USB, M_WAITOK | M_ZERO); @@ -1620,7 +1635,7 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, USB_MAX_IPACKET, USB_MAX_IPACKET, 0, UDESC_DEVICE, 0, 0); if (err) { DPRINTFN(0, "getting device descriptor " - "at addr %d failed, %s!\n", udev->address, + "at addr %d failed, %s\n", udev->address, usbd_errstr(err)); /* XXX try to re-enumerate the device */ err = usbd_req_re_enumerate(udev, NULL); @@ -1676,8 +1691,7 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, udev->ddesc.iSerialNumber) { /* read out the language ID string */ err = usbd_req_get_string_desc(udev, NULL, - (char *)scratch_ptr, 4, scratch_size, - USB_LANGUAGE_TABLE); + (char *)scratch_ptr, 4, 0, USB_LANGUAGE_TABLE); } else { err = USB_ERR_INVAL; } @@ -1685,8 +1699,35 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, if (err || (scratch_ptr[0] < 4)) { udev->flags.no_strings = 1; } else { - /* pick the first language as the default */ - udev->langid = UGETW(scratch_ptr + 2); + uint16_t langid; + uint16_t pref; + uint16_t mask; + uint8_t x; + + /* load preferred value and mask */ + pref = usb_lang_id; + mask = usb_lang_mask; + + /* align length correctly */ + scratch_ptr[0] &= ~1; + + /* fix compiler warning */ + langid = 0; + + /* search for preferred language */ + for (x = 2; (x < scratch_ptr[0]); x += 2) { + langid = UGETW(scratch_ptr + x); + if ((langid & mask) == pref) + break; + } + if (x >= scratch_ptr[0]) { + /* pick the first language as the default */ + DPRINTFN(1, "Using first language\n"); + langid = UGETW(scratch_ptr + 2); + } + + DPRINTFN(1, "Language selected: 0x%04x\n", langid); + udev->langid = langid; } /* assume 100mA bus powered for now. Changed when configured. */ @@ -1694,96 +1735,91 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, /* fetch the vendor and product strings from the device */ usbd_set_device_strings(udev); - if (udev->flags.usb_mode == USB_MODE_HOST) { - uint8_t config_index; - uint8_t config_quirk; - uint8_t set_config_failed = 0; + if (udev->flags.usb_mode == USB_MODE_DEVICE) { + /* USB device mode setup is complete */ + err = 0; + goto config_done; + } - /* - * Most USB devices should attach to config index 0 by - * default - */ - if (usb_test_quirk(&uaa, UQ_CFG_INDEX_0)) { - config_index = 0; - config_quirk = 1; - } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_1)) { - config_index = 1; - config_quirk = 1; - } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_2)) { - config_index = 2; - config_quirk = 1; - } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_3)) { - config_index = 3; - config_quirk = 1; - } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_4)) { - config_index = 4; - config_quirk = 1; - } else { - config_index = 0; - config_quirk = 0; - } + /* + * Most USB devices should attach to config index 0 by + * default + */ + if (usb_test_quirk(&uaa, UQ_CFG_INDEX_0)) { + config_index = 0; + config_quirk = 1; + } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_1)) { + config_index = 1; + config_quirk = 1; + } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_2)) { + config_index = 2; + config_quirk = 1; + } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_3)) { + config_index = 3; + config_quirk = 1; + } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_4)) { + config_index = 4; + config_quirk = 1; + } else { + config_index = 0; + config_quirk = 0; + } + set_config_failed = 0; repeat_set_config: - DPRINTF("setting config %u\n", config_index); + DPRINTF("setting config %u\n", config_index); - /* get the USB device configured */ - err = usbd_set_config_index(udev, config_index); - if (err) { - if (udev->ddesc.bNumConfigurations != 0) { - if (!set_config_failed) { - set_config_failed = 1; - /* XXX try to re-enumerate the device */ - err = usbd_req_re_enumerate( - udev, NULL); - if (err == 0) - goto repeat_set_config; - } - DPRINTFN(0, "Failure selecting " - "configuration index %u: %s, port %u, " - "addr %u (ignored)\n", - config_index, usbd_errstr(err), udev->port_no, - udev->address); + /* get the USB device configured */ + err = usbd_set_config_index(udev, config_index); + if (err) { + if (udev->ddesc.bNumConfigurations != 0) { + if (!set_config_failed) { + set_config_failed = 1; + /* XXX try to re-enumerate the device */ + err = usbd_req_re_enumerate(udev, NULL); + if (err == 0) + goto repeat_set_config; } + DPRINTFN(0, "Failure selecting configuration index %u:" + "%s, port %u, addr %u (ignored)\n", + config_index, usbd_errstr(err), udev->port_no, + udev->address); + } + /* + * Some USB devices do not have any configurations. Ignore any + * set config failures! + */ + err = 0; + goto config_done; + } + if (!config_quirk && config_index + 1 < udev->ddesc.bNumConfigurations) { + if ((udev->cdesc->bNumInterface < 2) && + usbd_get_no_descriptors(udev->cdesc, UDESC_ENDPOINT) == 0) { + DPRINTFN(0, "Found no endpoints, trying next config\n"); + config_index++; + goto repeat_set_config; + } + if (config_index == 0) { /* - * Some USB devices do not have any - * configurations. Ignore any set config - * failures! + * Try to figure out if we have an + * auto-install disk there: */ - err = 0; - } else if (config_quirk) { - /* user quirk selects configuration index */ - } else if ((config_index + 1) < udev->ddesc.bNumConfigurations) { - - if ((udev->cdesc->bNumInterface < 2) && - (usbd_get_no_descriptors(udev->cdesc, - UDESC_ENDPOINT) == 0)) { - DPRINTFN(0, "Found no endpoints " - "(trying next config)!\n"); + if (usb_iface_is_cdrom(udev, 0)) { + DPRINTFN(0, "Found possible auto-install " + "disk (trying next config)\n"); config_index++; goto repeat_set_config; } - if (config_index == 0) { - /* - * Try to figure out if we have an - * auto-install disk there: - */ - if (usb_test_autoinstall(udev, 0, 0) == 0) { - DPRINTFN(0, "Found possible auto-install " - "disk (trying next config)\n"); - config_index++; - goto repeat_set_config; - } - } - } else if (usb_test_huawei_autoinst_p(udev, &uaa) == 0) { - DPRINTFN(0, "Found Huawei auto-install disk!\n"); - /* leave device unconfigured */ - usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_SUBDEV); } - } else { - err = 0; /* set success */ + } + EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa); + if (uaa.dev_state != UAA_DEV_READY) { + /* leave device unconfigured */ + usb_unconfigure(udev, 0); } +config_done: DPRINTF("new dev (addr %d), udev=%p, parent_hub=%p\n", udev->address, udev, udev->parent_hub); @@ -1803,10 +1839,10 @@ repeat_set_config: #endif done: if (err) { - /* free device */ - usb_free_device(udev, - USB_UNCFG_FLAG_FREE_SUBDEV | - USB_UNCFG_FLAG_FREE_EP0); + /* + * Free USB device and all subdevices, if any. + */ + usb_free_device(udev, 0); udev = NULL; } return (udev); @@ -1926,9 +1962,10 @@ usb_cdev_cleanup(void* arg) /*------------------------------------------------------------------------* * usb_free_device * - * This function is NULL safe and will free an USB device. + * This function is NULL safe and will free an USB device and its + * children devices, if any. * - * Flag values, see "USB_UNCFG_FLAG_XXX". + * Flag values: Reserved, set to zero. *------------------------------------------------------------------------*/ void usb_free_device(struct usb_device *udev, uint8_t flag) @@ -1982,7 +2019,7 @@ usb_free_device(struct usb_device *udev, uint8_t flag) } /* the following will get the device unconfigured in software */ - usb_unconfigure(udev, flag); + usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_EP0); /* unsetup any leftover default USB transfers */ usbd_transfer_unsetup(udev->default_xfer, USB_DEFAULT_XFER_MAX); @@ -2151,34 +2188,35 @@ usbd_set_device_strings(struct usb_device *udev) #ifdef USB_VERBOSE const struct usb_knowndev *kdp; #endif - char temp[64]; + uint8_t *temp_ptr; + size_t temp_size; uint16_t vendor_id; uint16_t product_id; + temp_ptr = udev->bus->scratch[0].data; + temp_size = sizeof(udev->bus->scratch[0].data); + vendor_id = UGETW(udd->idVendor); product_id = UGETW(udd->idProduct); /* get serial number string */ - bzero(temp, sizeof(temp)); - usbd_req_get_string_any(udev, NULL, temp, sizeof(temp), + usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, udev->ddesc.iSerialNumber); - udev->serial = strdup(temp, M_USB); + udev->serial = strdup(temp_ptr, M_USB); /* get manufacturer string */ - bzero(temp, sizeof(temp)); - usbd_req_get_string_any(udev, NULL, temp, sizeof(temp), + usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, udev->ddesc.iManufacturer); - usb_trim_spaces(temp); - if (temp[0] != '\0') - udev->manufacturer = strdup(temp, M_USB); + usb_trim_spaces(temp_ptr); + if (temp_ptr[0] != '\0') + udev->manufacturer = strdup(temp_ptr, M_USB); /* get product string */ - bzero(temp, sizeof(temp)); - usbd_req_get_string_any(udev, NULL, temp, sizeof(temp), + usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, udev->ddesc.iProduct); - usb_trim_spaces(temp); - if (temp[0] != '\0') - udev->product = strdup(temp, M_USB); + usb_trim_spaces(temp_ptr); + if (temp_ptr[0] != '\0') + udev->product = strdup(temp_ptr, M_USB); #ifdef USB_VERBOSE if (udev->manufacturer == NULL || udev->product == NULL) { @@ -2204,12 +2242,12 @@ usbd_set_device_strings(struct usb_device *udev) #endif /* Provide default strings if none were found */ if (udev->manufacturer == NULL) { - snprintf(temp, sizeof(temp), "vendor 0x%04x", vendor_id); - udev->manufacturer = strdup(temp, M_USB); + snprintf(temp_ptr, temp_size, "vendor 0x%04x", vendor_id); + udev->manufacturer = strdup(temp_ptr, M_USB); } if (udev->product == NULL) { - snprintf(temp, sizeof(temp), "product 0x%04x", product_id); - udev->product = strdup(temp, M_USB); + snprintf(temp_ptr, temp_size, "product 0x%04x", product_id); + udev->product = strdup(temp_ptr, M_USB); } } @@ -2315,6 +2353,7 @@ usb_notify_addq(const char *type, struct usb_device *udev) { char *data = NULL; struct malloc_type *mt; + const size_t buf_size = 512; mtx_lock(&malloc_mtx); mt = malloc_desc2type("bus"); /* XXX M_BUS */ @@ -2322,12 +2361,12 @@ usb_notify_addq(const char *type, struct usb_device *udev) if (mt == NULL) return; - data = malloc(512, mt, M_NOWAIT); + data = malloc(buf_size, mt, M_NOWAIT); if (data == NULL) return; /* String it all together. */ - snprintf(data, 1024, + snprintf(data, buf_size, "%s" "%s " "vendor=0x%04x " diff --git a/sys/dev/usb/usb_device.h b/sys/dev/usb/usb_device.h index 682e2007e6ee..66f975a5c1f8 100644 --- a/sys/dev/usb/usb_device.h +++ b/sys/dev/usb/usb_device.h @@ -41,7 +41,6 @@ struct usb_device; /* linux compat */ /* "usb_unconfigure()" flags */ #define USB_UNCFG_FLAG_NONE 0x00 -#define USB_UNCFG_FLAG_FREE_SUBDEV 0x01 /* subdevices are freed */ #define USB_UNCFG_FLAG_FREE_EP0 0x02 /* endpoint zero is freed */ struct usb_clear_stall_msg { diff --git a/sys/dev/usb/usb_dynamic.c b/sys/dev/usb/usb_dynamic.c index b64712fc3406..add01ce282c8 100644 --- a/sys/dev/usb/usb_dynamic.c +++ b/sys/dev/usb/usb_dynamic.c @@ -57,7 +57,6 @@ static usb_handle_req_t usb_temp_get_desc_w; static usb_temp_setup_by_index_t usb_temp_setup_by_index_w; static usb_temp_unsetup_t usb_temp_unsetup_w; static usb_test_quirk_t usb_test_quirk_w; -static usb_test_huawei_autoinst_t usb_test_huawei_autoinst_w; static usb_quirk_ioctl_t usb_quirk_ioctl_w; /* global variables */ @@ -65,7 +64,6 @@ usb_handle_req_t *usb_temp_get_desc_p = &usb_temp_get_desc_w; usb_temp_setup_by_index_t *usb_temp_setup_by_index_p = &usb_temp_setup_by_index_w; usb_temp_unsetup_t *usb_temp_unsetup_p = &usb_temp_unsetup_w; usb_test_quirk_t *usb_test_quirk_p = &usb_test_quirk_w; -usb_test_huawei_autoinst_t *usb_test_huawei_autoinst_p = &usb_test_huawei_autoinst_w; usb_quirk_ioctl_t *usb_quirk_ioctl_p = &usb_quirk_ioctl_w; devclass_t usb_devclass_ptr = NULL; @@ -105,13 +103,6 @@ usb_temp_unsetup_w(struct usb_device *udev) } } -static usb_error_t -usb_test_huawei_autoinst_w(struct usb_device *udev, - struct usb_attach_arg *uaa) -{ - return (USB_ERR_INVAL); -} - void usb_quirk_unload(void *arg) { @@ -156,17 +147,3 @@ usb_bus_unload(void *arg) pause("WAIT", hz); } - -void -usb_test_huawei_unload(void *arg) -{ - /* reset function pointers */ - - usb_test_huawei_autoinst_p = &usb_test_huawei_autoinst_w; - - /* wait for CPU to exit the loaded functions, if any */ - - /* XXX this is a tradeoff */ - - pause("WAIT", 16*hz); -} diff --git a/sys/dev/usb/usb_dynamic.h b/sys/dev/usb/usb_dynamic.h index f8b7caf69f3c..568494204c17 100644 --- a/sys/dev/usb/usb_dynamic.h +++ b/sys/dev/usb/usb_dynamic.h @@ -37,8 +37,6 @@ struct usb_device_request; typedef usb_error_t (usb_temp_setup_by_index_t)(struct usb_device *udev, uint16_t index); -typedef usb_error_t (usb_test_huawei_autoinst_t)(struct usb_device *udev, - struct usb_attach_arg *uaa); typedef uint8_t (usb_test_quirk_t)(const struct usbd_lookup_info *info, uint16_t quirk); typedef int (usb_quirk_ioctl_t)(unsigned long cmd, caddr_t data, @@ -51,13 +49,11 @@ extern usb_handle_req_t *usb_temp_get_desc_p; extern usb_temp_setup_by_index_t *usb_temp_setup_by_index_p; extern usb_temp_unsetup_t *usb_temp_unsetup_p; extern usb_test_quirk_t *usb_test_quirk_p; -extern usb_test_huawei_autoinst_t *usb_test_huawei_autoinst_p; extern usb_quirk_ioctl_t *usb_quirk_ioctl_p; extern devclass_t usb_devclass_ptr; /* function prototypes */ -void usb_test_huawei_unload(void *); void usb_temp_unload(void *); void usb_quirk_unload(void *); void usb_bus_unload(void *); diff --git a/sys/dev/usb/usb_generic.c b/sys/dev/usb/usb_generic.c index 5990cd5ff943..9fc0cc7eef2d 100644 --- a/sys/dev/usb/usb_generic.c +++ b/sys/dev/usb/usb_generic.c @@ -130,6 +130,8 @@ static int ugen_debug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, ugen, CTLFLAG_RW, 0, "USB generic"); SYSCTL_INT(_hw_usb_ugen, OID_AUTO, debug, CTLFLAG_RW, &ugen_debug, 0, "Debug level"); + +TUNABLE_INT("hw.usb.ugen.debug", &ugen_debug); #endif diff --git a/sys/dev/usb/usb_hid.c b/sys/dev/usb/usb_hid.c index b9d61c91c39a..f13bbf1b1b40 100644 --- a/sys/dev/usb/usb_hid.c +++ b/sys/dev/usb/usb_hid.c @@ -450,7 +450,7 @@ hid_get_item(struct hid_data *s, struct hid_item *h) c = &s->cur[s->pushlevel]; } else { DPRINTFN(0, "Cannot push " - "item @ %d!\n", s->pushlevel); + "item @ %d\n", s->pushlevel); } break; case 11: /* Pop */ @@ -468,7 +468,7 @@ hid_get_item(struct hid_data *s, struct hid_item *h) c->loc.count = 0; } else { DPRINTFN(0, "Cannot pop " - "item @ %d!\n", s->pushlevel); + "item @ %d\n", s->pushlevel); } break; default: @@ -490,7 +490,7 @@ hid_get_item(struct hid_data *s, struct hid_item *h) s->usages_max[s->nusage] = dval; s->nusage ++; } else { - DPRINTFN(0, "max usage reached!\n"); + DPRINTFN(0, "max usage reached\n"); } /* clear any pending usage sets */ @@ -525,7 +525,7 @@ hid_get_item(struct hid_data *s, struct hid_item *h) c->usage_maximum; s->nusage ++; } else { - DPRINTFN(0, "Usage set dropped!\n"); + DPRINTFN(0, "Usage set dropped\n"); } s->susage = 0; break; diff --git a/sys/dev/usb/usb_hub.c b/sys/dev/usb/usb_hub.c index 2c81d97d1267..97797963269a 100644 --- a/sys/dev/usb/usb_hub.c +++ b/sys/dev/usb/usb_hub.c @@ -79,6 +79,8 @@ static int uhub_debug = 0; SYSCTL_NODE(_hw_usb, OID_AUTO, uhub, CTLFLAG_RW, 0, "USB HUB"); SYSCTL_INT(_hw_usb_uhub, OID_AUTO, debug, CTLFLAG_RW, &uhub_debug, 0, "Debug level"); + +TUNABLE_INT("hw.usb.uhub.debug", &uhub_debug); #endif #if USB_HAVE_POWERD @@ -316,12 +318,13 @@ repeat: if (err) { goto error; } - /* detach any existing devices */ + /* check if there is a child */ - if (child) { - usb_free_device(child, - USB_UNCFG_FLAG_FREE_SUBDEV | - USB_UNCFG_FLAG_FREE_EP0); + if (child != NULL) { + /* + * Free USB device and all subdevices, if any. + */ + usb_free_device(child, 0); child = NULL; } /* get fresh status */ @@ -382,7 +385,7 @@ repeat: (!(sc->sc_st.port_status & UPS_CURRENT_CONNECT_STATUS))) { if (timeout) { DPRINTFN(0, "giving up port reset " - "- device vanished!\n"); + "- device vanished\n"); goto error; } timeout = 1; @@ -432,16 +435,17 @@ repeat: child = usb_alloc_device(sc->sc_dev, udev->bus, udev, udev->depth + 1, portno - 1, portno, speed, mode); if (child == NULL) { - DPRINTFN(0, "could not allocate new device!\n"); + DPRINTFN(0, "could not allocate new device\n"); goto error; } return (0); /* success */ error: - if (child) { - usb_free_device(child, - USB_UNCFG_FLAG_FREE_SUBDEV | - USB_UNCFG_FLAG_FREE_EP0); + if (child != NULL) { + /* + * Free USB device and all subdevices, if any. + */ + usb_free_device(child, 0); child = NULL; } if (err == 0) { @@ -707,14 +711,14 @@ uhub_attach(device_t dev) parent_hub->flags.self_powered : 0); if (udev->depth > USB_HUB_MAX_DEPTH) { - DPRINTFN(0, "hub depth, %d, exceeded. HUB ignored!\n", + DPRINTFN(0, "hub depth, %d, exceeded. HUB ignored\n", USB_HUB_MAX_DEPTH); goto error; } if (!udev->flags.self_powered && parent_hub && (!parent_hub->flags.self_powered)) { DPRINTFN(0, "bus powered HUB connected to " - "bus powered HUB. HUB ignored!\n"); + "bus powered HUB. HUB ignored\n"); goto error; } /* get HUB descriptor */ @@ -736,11 +740,11 @@ uhub_attach(device_t dev) goto error; } if (hubdesc.bNbrPorts != nports) { - DPRINTFN(0, "number of ports changed!\n"); + DPRINTFN(0, "number of ports changed\n"); goto error; } if (nports == 0) { - DPRINTFN(0, "portless HUB!\n"); + DPRINTFN(0, "portless HUB\n"); goto error; } hub = malloc(sizeof(hub[0]) + (sizeof(hub->ports[0]) * nports), @@ -780,7 +784,7 @@ uhub_attach(device_t dev) } if (err) { DPRINTFN(0, "cannot setup interrupt transfer, " - "errstr=%s!\n", usbd_errstr(err)); + "errstr=%s\n", usbd_errstr(err)); goto error; } /* wait with power off for a while */ @@ -888,12 +892,14 @@ uhub_detach(device_t dev) struct usb_device *child; uint8_t x; - /* detach all children first */ - bus_generic_detach(dev); - if (hub == NULL) { /* must be partially working */ return (0); } + + /* Make sure interrupt transfer is gone. */ + usbd_transfer_unsetup(sc->sc_xfer, UHUB_N_TRANSFER); + + /* Detach all ports */ for (x = 0; x != hub->nports; x++) { child = usb_bus_port_get_device(sc->sc_udev->bus, hub->ports + x); @@ -901,15 +907,12 @@ uhub_detach(device_t dev) if (child == NULL) { continue; } - /* - * Subdevices are not freed, because the caller of - * uhub_detach() will do that. - */ - usb_free_device(child, - USB_UNCFG_FLAG_FREE_EP0); - } - usbd_transfer_unsetup(sc->sc_xfer, UHUB_N_TRANSFER); + /* + * Free USB device and all subdevices, if any. + */ + usb_free_device(child, 0); + } free(hub, M_USBDEV); sc->sc_udev->hub = NULL; @@ -984,10 +987,19 @@ static int uhub_child_location_string(device_t parent, device_t child, char *buf, size_t buflen) { - struct uhub_softc *sc = device_get_softc(parent); - struct usb_hub *hub = sc->sc_udev->hub; + struct uhub_softc *sc; + struct usb_hub *hub; struct hub_result res; + if (!device_is_attached(parent)) { + if (buflen) + buf[0] = 0; + return (0); + } + + sc = device_get_softc(parent); + hub = sc->sc_udev->hub; + mtx_lock(&Giant); uhub_find_iface_index(hub, child, &res); if (!res.udev) { @@ -1009,11 +1021,20 @@ static int uhub_child_pnpinfo_string(device_t parent, device_t child, char *buf, size_t buflen) { - struct uhub_softc *sc = device_get_softc(parent); - struct usb_hub *hub = sc->sc_udev->hub; + struct uhub_softc *sc; + struct usb_hub *hub; struct usb_interface *iface; struct hub_result res; + if (!device_is_attached(parent)) { + if (buflen) + buf[0] = 0; + return (0); + } + + sc = device_get_softc(parent); + hub = sc->sc_udev->hub; + mtx_lock(&Giant); uhub_find_iface_index(hub, child, &res); if (!res.udev) { @@ -1087,43 +1108,62 @@ done: * The best Transaction Translation slot for an interrupt endpoint. *------------------------------------------------------------------------*/ static uint8_t -usb_intr_find_best_slot(usb_size_t *ptr, uint8_t start, uint8_t end) +usb_intr_find_best_slot(usb_size_t *ptr, uint8_t start, + uint8_t end, uint8_t mask) { - usb_size_t max = 0 - 1; + usb_size_t min = 0 - 1; + usb_size_t sum; uint8_t x; uint8_t y; + uint8_t z; y = 0; /* find the last slot with lesser used bandwidth */ for (x = start; x < end; x++) { - if (max >= ptr[x]) { - max = ptr[x]; + + sum = 0; + + /* compute sum of bandwidth */ + for (z = x; z < end; z++) { + if (mask & (1U << (z - x))) + sum += ptr[z]; + } + + /* check if the current multi-slot is more optimal */ + if (min >= sum) { + min = sum; y = x; } + + /* check if the mask is about to be shifted out */ + if (mask & (1U << (end - 1 - x))) + break; } return (y); } /*------------------------------------------------------------------------* - * usb_intr_schedule_adjust + * usb_hs_bandwidth_adjust * * This function will update the bandwith usage for the microframe * having index "slot" by "len" bytes. "len" can be negative. If the * "slot" argument is greater or equal to "USB_HS_MICRO_FRAMES_MAX" * the "slot" argument will be replaced by the slot having least used - * bandwidth. + * bandwidth. The "mask" argument is used for multi-slot allocations. * * Returns: - * The slot on which the bandwidth update was done. + * The slot in which the bandwidth update was done: 0..7 *------------------------------------------------------------------------*/ -uint8_t -usb_intr_schedule_adjust(struct usb_device *udev, int16_t len, uint8_t slot) +static uint8_t +usb_hs_bandwidth_adjust(struct usb_device *udev, int16_t len, + uint8_t slot, uint8_t mask) { struct usb_bus *bus = udev->bus; struct usb_hub *hub; enum usb_dev_speed speed; + uint8_t x; USB_BUS_LOCK_ASSERT(bus, MA_OWNED); @@ -1145,22 +1185,156 @@ usb_intr_schedule_adjust(struct usb_device *udev, int16_t len, uint8_t slot) hub = udev->parent_hs_hub->hub; if (slot >= USB_HS_MICRO_FRAMES_MAX) { slot = usb_intr_find_best_slot(hub->uframe_usage, - USB_FS_ISOC_UFRAME_MAX, 6); + USB_FS_ISOC_UFRAME_MAX, 6, mask); + } + for (x = slot; x < 8; x++) { + if (mask & (1U << (x - slot))) { + hub->uframe_usage[x] += len; + bus->uframe_usage[x] += len; + } } - hub->uframe_usage[slot] += len; - bus->uframe_usage[slot] += len; break; default: if (slot >= USB_HS_MICRO_FRAMES_MAX) { slot = usb_intr_find_best_slot(bus->uframe_usage, 0, - USB_HS_MICRO_FRAMES_MAX); + USB_HS_MICRO_FRAMES_MAX, mask); + } + for (x = slot; x < 8; x++) { + if (mask & (1U << (x - slot))) { + bus->uframe_usage[x] += len; + } } - bus->uframe_usage[slot] += len; break; } return (slot); } +/*------------------------------------------------------------------------* + * usb_hs_bandwidth_alloc + * + * This function is a wrapper function for "usb_hs_bandwidth_adjust()". + *------------------------------------------------------------------------*/ +void +usb_hs_bandwidth_alloc(struct usb_xfer *xfer) +{ + struct usb_device *udev; + uint8_t slot; + uint8_t mask; + uint8_t speed; + + udev = xfer->xroot->udev; + + if (udev->flags.usb_mode != USB_MODE_HOST) + return; /* not supported */ + + xfer->endpoint->refcount_bw++; + if (xfer->endpoint->refcount_bw != 1) + return; /* already allocated */ + + speed = usbd_get_speed(udev); + + switch (xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE) { + case UE_INTERRUPT: + /* allocate a microframe slot */ + + mask = 0x01; + slot = usb_hs_bandwidth_adjust(udev, + xfer->max_frame_size, USB_HS_MICRO_FRAMES_MAX, mask); + + xfer->endpoint->usb_uframe = slot; + xfer->endpoint->usb_smask = mask << slot; + + if ((speed != USB_SPEED_FULL) && + (speed != USB_SPEED_LOW)) { + xfer->endpoint->usb_cmask = 0x00 ; + } else { + xfer->endpoint->usb_cmask = (-(0x04 << slot)) & 0xFE; + } + break; + + case UE_ISOCHRONOUS: + switch (usbd_xfer_get_fps_shift(xfer)) { + case 0: + mask = 0xFF; + break; + case 1: + mask = 0x55; + break; + case 2: + mask = 0x11; + break; + default: + mask = 0x01; + break; + } + + /* allocate a microframe multi-slot */ + + slot = usb_hs_bandwidth_adjust(udev, + xfer->max_frame_size, USB_HS_MICRO_FRAMES_MAX, mask); + + xfer->endpoint->usb_uframe = slot; + xfer->endpoint->usb_cmask = 0; + xfer->endpoint->usb_smask = mask << slot; + break; + + default: + xfer->endpoint->usb_uframe = 0; + xfer->endpoint->usb_cmask = 0; + xfer->endpoint->usb_smask = 0; + break; + } + + DPRINTFN(11, "slot=%d, mask=0x%02x\n", + xfer->endpoint->usb_uframe, + xfer->endpoint->usb_smask >> xfer->endpoint->usb_uframe); +} + +/*------------------------------------------------------------------------* + * usb_hs_bandwidth_free + * + * This function is a wrapper function for "usb_hs_bandwidth_adjust()". + *------------------------------------------------------------------------*/ +void +usb_hs_bandwidth_free(struct usb_xfer *xfer) +{ + struct usb_device *udev; + uint8_t slot; + uint8_t mask; + + udev = xfer->xroot->udev; + + if (udev->flags.usb_mode != USB_MODE_HOST) + return; /* not supported */ + + xfer->endpoint->refcount_bw--; + if (xfer->endpoint->refcount_bw != 0) + return; /* still allocated */ + + switch (xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE) { + case UE_INTERRUPT: + case UE_ISOCHRONOUS: + + slot = xfer->endpoint->usb_uframe; + mask = xfer->endpoint->usb_smask; + + /* free microframe slot(s): */ + usb_hs_bandwidth_adjust(udev, + -xfer->max_frame_size, slot, mask >> slot); + + DPRINTFN(11, "slot=%d, mask=0x%02x\n", + slot, mask >> slot); + + xfer->endpoint->usb_uframe = 0; + xfer->endpoint->usb_cmask = 0; + xfer->endpoint->usb_smask = 0; + break; + + default: + break; + } +} + /*------------------------------------------------------------------------* * usbd_fs_isoc_schedule_init_sub * @@ -1750,7 +1924,7 @@ usb_dev_resume_peer(struct usb_device *udev) err = usbd_req_clear_port_feature(udev->parent_hub, NULL, udev->port_no, UHF_PORT_SUSPEND); if (err) { - DPRINTFN(0, "Resuming port failed!\n"); + DPRINTFN(0, "Resuming port failed\n"); return; } /* resume settle time */ @@ -1798,7 +1972,7 @@ usb_dev_resume_peer(struct usb_device *udev) NULL, UF_DEVICE_REMOTE_WAKEUP); if (err) { DPRINTFN(0, "Clearing device " - "remote wakeup failed: %s!\n", + "remote wakeup failed: %s\n", usbd_errstr(err)); } } @@ -1868,7 +2042,7 @@ repeat: NULL, UF_DEVICE_REMOTE_WAKEUP); if (err) { DPRINTFN(0, "Setting device " - "remote wakeup failed!\n"); + "remote wakeup failed\n"); } } USB_BUS_LOCK(udev->bus); diff --git a/sys/dev/usb/usb_hub.h b/sys/dev/usb/usb_hub.h index ceb0cc2283d9..5b8dedf6e647 100644 --- a/sys/dev/usb/usb_hub.h +++ b/sys/dev/usb/usb_hub.h @@ -66,8 +66,8 @@ struct usb_hub { /* function prototypes */ -uint8_t usb_intr_schedule_adjust(struct usb_device *udev, int16_t len, - uint8_t slot); +void usb_hs_bandwidth_alloc(struct usb_xfer *xfer); +void usb_hs_bandwidth_free(struct usb_xfer *xfer); void usbd_fs_isoc_schedule_init_all(struct usb_fs_isoc_schedule *fss); void usb_bus_port_set_device(struct usb_bus *bus, struct usb_port *up, struct usb_device *udev, uint8_t device_index); diff --git a/sys/dev/usb/usb_msctest.c b/sys/dev/usb/usb_msctest.c index 4af0766eb184..ed9eac40ba72 100644 --- a/sys/dev/usb/usb_msctest.c +++ b/sys/dev/usb/usb_msctest.c @@ -67,8 +67,7 @@ #include #include #include - -#include +#include enum { ST_COMMAND, @@ -86,7 +85,21 @@ enum { DIR_NONE, }; +#define SCSI_INQ_LEN 0x24 +static uint8_t scsi_test_unit_ready[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static uint8_t scsi_inquiry[] = { 0x12, 0x00, 0x00, 0x00, SCSI_INQ_LEN, 0x00 }; +static uint8_t scsi_rezero_init[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static uint8_t scsi_start_stop_unit[] = { 0x1b, 0x00, 0x00, 0x00, 0x02, 0x00 }; +static uint8_t scsi_ztestor_eject[] = { 0x85, 0x01, 0x01, 0x01, 0x18, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00 }; +static uint8_t scsi_cmotech_eject[] = { 0xff, 0x52, 0x44, 0x45, 0x56, 0x43, + 0x48, 0x47 }; +static uint8_t scsi_huawei_eject[] = { 0x11, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; + #define BULK_SIZE 64 /* dummy */ +#define ERR_CSW_FAILED -1 /* Command Block Wrapper */ struct bbb_cbw { @@ -134,8 +147,8 @@ struct bbb_transfer { uint8_t dir; uint8_t lun; uint8_t state; - uint8_t error; uint8_t status_try; + int error; uint8_t buffer[256]; }; @@ -147,6 +160,15 @@ static usb_callback_t bbb_data_write_callback; static usb_callback_t bbb_data_wr_cs_callback; static usb_callback_t bbb_status_callback; +static void bbb_done(struct bbb_transfer *, int); +static void bbb_transfer_start(struct bbb_transfer *, uint8_t); +static void bbb_data_clear_stall_callback(struct usb_xfer *, uint8_t, + uint8_t); +static uint8_t bbb_command_start(struct bbb_transfer *, uint8_t, uint8_t, + void *, size_t, void *, size_t, usb_timeout_t); +static struct bbb_transfer *bbb_attach(struct usb_device *, uint8_t); +static void bbb_detach(struct bbb_transfer *); + static const struct usb_config bbb_config[ST_MAX] = { [ST_COMMAND] = { @@ -208,25 +230,9 @@ static const struct usb_config bbb_config[ST_MAX] = { }; static void -bbb_done(struct bbb_transfer *sc, uint8_t error) +bbb_done(struct bbb_transfer *sc, int error) { - struct usb_xfer *xfer; - xfer = sc->xfer[sc->state]; - - /* verify the error code */ - - if (error) { - switch (USB_GET_STATE(xfer)) { - case USB_ST_SETUP: - case USB_ST_TRANSFERRED: - error = 1; - break; - default: - error = 2; - break; - } - } sc->error = error; sc->state = ST_COMMAND; sc->status_try = 1; @@ -253,7 +259,7 @@ bbb_data_clear_stall_callback(struct usb_xfer *xfer, bbb_transfer_start(sc, next_xfer); break; default: - bbb_done(sc, 1); + bbb_done(sc, USB_ERR_STALLED); break; } } @@ -284,14 +290,14 @@ bbb_command_callback(struct usb_xfer *xfer, usb_error_t error) sc->cbw.bCDBLength = sc->cmd_len; if (sc->cbw.bCDBLength > sizeof(sc->cbw.CBWCDB)) { sc->cbw.bCDBLength = sizeof(sc->cbw.CBWCDB); - DPRINTFN(0, "Truncating long command!\n"); + DPRINTFN(0, "Truncating long command\n"); } usbd_xfer_set_frame_data(xfer, 0, &sc->cbw, sizeof(sc->cbw)); usbd_transfer_submit(xfer); break; default: /* Error */ - bbb_done(sc, 1); + bbb_done(sc, error); break; } } @@ -333,7 +339,7 @@ bbb_data_read_callback(struct usb_xfer *xfer, usb_error_t error) default: /* Error */ if (error == USB_ERR_CANCELLED) { - bbb_done(sc, 1); + bbb_done(sc, error); } else { bbb_transfer_start(sc, ST_DATA_RD_CS); } @@ -385,7 +391,7 @@ bbb_data_write_callback(struct usb_xfer *xfer, usb_error_t error) default: /* Error */ if (error == USB_ERR_CANCELLED) { - bbb_done(sc, 1); + bbb_done(sc, error); } else { bbb_transfer_start(sc, ST_DATA_WR_CS); } @@ -415,11 +421,11 @@ bbb_status_callback(struct usb_xfer *xfer, usb_error_t error) /* very simple status check */ if (actlen < sizeof(sc->csw)) { - bbb_done(sc, 1);/* error */ + bbb_done(sc, USB_ERR_SHORT_XFER); } else if (sc->csw.bCSWStatus == CSWSTATUS_GOOD) { - bbb_done(sc, 0);/* success */ + bbb_done(sc, 0); /* success */ } else { - bbb_done(sc, 1);/* error */ + bbb_done(sc, ERR_CSW_FAILED); /* error */ } break; @@ -429,11 +435,11 @@ bbb_status_callback(struct usb_xfer *xfer, usb_error_t error) break; default: - DPRINTFN(0, "Failed to read CSW: %s, try %d\n", + DPRINTF("Failed to read CSW: %s, try %d\n", usbd_errstr(error), sc->status_try); if (error == USB_ERR_CANCELLED || sc->status_try) { - bbb_done(sc, 1); + bbb_done(sc, error); } else { sc->status_try = 1; bbb_transfer_start(sc, ST_DATA_RD_CS); @@ -451,7 +457,7 @@ bbb_status_callback(struct usb_xfer *xfer, usb_error_t error) *------------------------------------------------------------------------*/ static uint8_t bbb_command_start(struct bbb_transfer *sc, uint8_t dir, uint8_t lun, - void *data_ptr, usb_size_t data_len, uint8_t cmd_len, + void *data_ptr, size_t data_len, void *cmd_ptr, size_t cmd_len, usb_timeout_t data_timeout) { sc->lun = lun; @@ -461,54 +467,46 @@ bbb_command_start(struct bbb_transfer *sc, uint8_t dir, uint8_t lun, sc->data_rem = data_len; sc->data_timeout = (data_timeout + USB_MS_HZ); sc->actlen = 0; + sc->data_ptr = data_ptr; sc->cmd_len = cmd_len; + bzero(&sc->cbw.CBWCDB, sizeof(sc->cbw.CBWCDB)); + bcopy(cmd_ptr, &sc->cbw.CBWCDB, cmd_len); + DPRINTFN(1, "SCSI cmd = %*D\n", (int)cmd_len, &sc->cbw.CBWCDB, ":"); + mtx_lock(&sc->mtx); usbd_transfer_start(sc->xfer[sc->state]); while (usbd_transfer_pending(sc->xfer[sc->state])) { cv_wait(&sc->cv, &sc->mtx); } + mtx_unlock(&sc->mtx); return (sc->error); } -/*------------------------------------------------------------------------* - * usb_test_autoinstall - * - * Return values: - * 0: This interface is an auto install disk (CD-ROM) - * Else: Not an auto install disk. - *------------------------------------------------------------------------*/ -usb_error_t -usb_test_autoinstall(struct usb_device *udev, uint8_t iface_index, - uint8_t do_eject) +static struct bbb_transfer * +bbb_attach(struct usb_device *udev, uint8_t iface_index) { struct usb_interface *iface; struct usb_interface_descriptor *id; - usb_error_t err; - uint8_t timeout; - uint8_t sid_type; struct bbb_transfer *sc; + usb_error_t err; - if (udev == NULL) { - return (USB_ERR_INVAL); - } iface = usbd_get_iface(udev, iface_index); - if (iface == NULL) { - return (USB_ERR_INVAL); - } + if (iface == NULL) + return (NULL); + id = iface->idesc; - if (id == NULL) { - return (USB_ERR_INVAL); - } - if (id->bInterfaceClass != UICLASS_MASS) { - return (USB_ERR_INVAL); - } + if (id == NULL || id->bInterfaceClass != UICLASS_MASS) + return (NULL); + switch (id->bInterfaceSubClass) { case UISUBCLASS_SCSI: case UISUBCLASS_UFI: + case UISUBCLASS_SFF8020I: + case UISUBCLASS_SFF8070I: break; default: - return (USB_ERR_INVAL); + return (NULL); } switch (id->bInterfaceProtocol) { @@ -516,75 +514,117 @@ usb_test_autoinstall(struct usb_device *udev, uint8_t iface_index, case UIPROTO_MASS_BBB: break; default: - return (USB_ERR_INVAL); + return (NULL); } sc = malloc(sizeof(*sc), M_USB, M_WAITOK | M_ZERO); - if (sc == NULL) { - return (USB_ERR_NOMEM); - } mtx_init(&sc->mtx, "USB autoinstall", NULL, MTX_DEF); cv_init(&sc->cv, "WBBB"); - err = usbd_transfer_setup(udev, - &iface_index, sc->xfer, bbb_config, + err = usbd_transfer_setup(udev, &iface_index, sc->xfer, bbb_config, ST_MAX, sc, &sc->mtx); - if (err) { - goto done; + bbb_detach(sc); + return (NULL); } - mtx_lock(&sc->mtx); + return (sc); +} - timeout = 4; /* tries */ - -repeat_inquiry: - - sc->cbw.CBWCDB[0] = 0x12; /* INQUIRY */ - sc->cbw.CBWCDB[1] = 0; - sc->cbw.CBWCDB[2] = 0; - sc->cbw.CBWCDB[3] = 0; - sc->cbw.CBWCDB[4] = 0x24; /* length */ - sc->cbw.CBWCDB[5] = 0; - err = bbb_command_start(sc, DIR_IN, 0, - sc->buffer, 0x24, 6, USB_MS_HZ); - - if ((sc->actlen != 0) && (err == 0)) { - sid_type = sc->buffer[0] & 0x1F; - if (sid_type == 0x05) { - /* CD-ROM */ - if (do_eject) { - /* 0: opcode: SCSI START/STOP */ - sc->cbw.CBWCDB[0] = 0x1b; - /* 1: byte2: Not immediate */ - sc->cbw.CBWCDB[1] = 0x00; - /* 2..3: reserved */ - sc->cbw.CBWCDB[2] = 0x00; - sc->cbw.CBWCDB[3] = 0x00; - /* 4: Load/Eject command */ - sc->cbw.CBWCDB[4] = 0x02; - /* 5: control */ - sc->cbw.CBWCDB[5] = 0x00; - err = bbb_command_start(sc, DIR_OUT, 0, - NULL, 0, 6, USB_MS_HZ); - - DPRINTFN(0, "Eject CD command " - "status: %s\n", usbd_errstr(err)); - } - err = 0; - goto done; - } - } else if ((err != 2) && --timeout) { - usb_pause_mtx(&sc->mtx, hz); - goto repeat_inquiry; - } - err = USB_ERR_INVAL; - goto done; - -done: - mtx_unlock(&sc->mtx); +static void +bbb_detach(struct bbb_transfer *sc) +{ usbd_transfer_unsetup(sc->xfer, ST_MAX); mtx_destroy(&sc->mtx); cv_destroy(&sc->cv); free(sc, M_USB); - return (err); +} + +/*------------------------------------------------------------------------* + * usb_iface_is_cdrom + * + * Return values: + * 1: This interface is an auto install disk (CD-ROM) + * 0: Not an auto install disk. + *------------------------------------------------------------------------*/ +int +usb_iface_is_cdrom(struct usb_device *udev, uint8_t iface_index) +{ + struct bbb_transfer *sc; + usb_error_t err; + uint8_t timeout, is_cdrom; + uint8_t sid_type; + + sc = bbb_attach(udev, iface_index); + if (sc == NULL) + return (0); + + is_cdrom = 0; + timeout = 4; /* tries */ + while (--timeout) { + err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, + SCSI_INQ_LEN, &scsi_inquiry, sizeof(scsi_inquiry), + USB_MS_HZ); + + if (err == 0 && sc->actlen > 0) { + sid_type = sc->buffer[0] & 0x1F; + if (sid_type == 0x05) + is_cdrom = 1; + break; + } else if (err != ERR_CSW_FAILED) + break; /* non retryable error */ + usb_pause_mtx(NULL, hz); + } + bbb_detach(sc); + return (is_cdrom); +} + +usb_error_t +usb_msc_eject(struct usb_device *udev, uint8_t iface_index, int method) +{ + struct bbb_transfer *sc; + usb_error_t err; + + sc = bbb_attach(udev, iface_index); + if (sc == NULL) + return (USB_ERR_INVAL); + + err = 0; + switch (method) { + case MSC_EJECT_STOPUNIT: + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_test_unit_ready, sizeof(scsi_test_unit_ready), + USB_MS_HZ); + DPRINTF("Test unit ready status: %s\n", usbd_errstr(err)); + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_start_stop_unit, sizeof(scsi_start_stop_unit), + USB_MS_HZ); + break; + case MSC_EJECT_REZERO: + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_rezero_init, sizeof(scsi_rezero_init), + USB_MS_HZ); + break; + case MSC_EJECT_ZTESTOR: + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_ztestor_eject, sizeof(scsi_ztestor_eject), + USB_MS_HZ); + break; + case MSC_EJECT_CMOTECH: + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_cmotech_eject, sizeof(scsi_cmotech_eject), + USB_MS_HZ); + break; + case MSC_EJECT_HUAWEI: + err = bbb_command_start(sc, DIR_IN, 0, NULL, 0, + &scsi_huawei_eject, sizeof(scsi_huawei_eject), + USB_MS_HZ); + break; + default: + printf("usb_msc_eject: unknown eject method (%d)\n", method); + break; + } + DPRINTF("Eject CD command status: %s\n", usbd_errstr(err)); + + bbb_detach(sc); + return (0); } diff --git a/sys/dev/usb/usb_msctest.h b/sys/dev/usb/usb_msctest.h index 44fa20d96c62..ce763df3fbe4 100644 --- a/sys/dev/usb/usb_msctest.h +++ b/sys/dev/usb/usb_msctest.h @@ -27,7 +27,17 @@ #ifndef _USB_MSCTEST_H_ #define _USB_MSCTEST_H_ -usb_error_t usb_test_autoinstall(struct usb_device *udev, - uint8_t iface_index, uint8_t do_eject); +enum { + MSC_EJECT_STOPUNIT, + MSC_EJECT_REZERO, + MSC_EJECT_ZTESTOR, + MSC_EJECT_CMOTECH, + MSC_EJECT_HUAWEI, +}; + +int usb_iface_is_cdrom(struct usb_device *udev, + uint8_t iface_index); +usb_error_t usb_msc_eject(struct usb_device *udev, + uint8_t iface_index, int method); #endif /* _USB_MSCTEST_H_ */ diff --git a/sys/dev/usb/usb_process.c b/sys/dev/usb/usb_process.c index eb503fd18c41..53461d215027 100644 --- a/sys/dev/usb/usb_process.c +++ b/sys/dev/usb/usb_process.c @@ -83,6 +83,8 @@ static int usb_proc_debug; SYSCTL_NODE(_hw_usb, OID_AUTO, proc, CTLFLAG_RW, 0, "USB process"); SYSCTL_INT(_hw_usb_proc, OID_AUTO, debug, CTLFLAG_RW, &usb_proc_debug, 0, "Debug level"); + +TUNABLE_INT("hw.usb.proc.debug", &usb_proc_debug); #endif /*------------------------------------------------------------------------* @@ -442,7 +444,7 @@ usb_proc_drain(struct usb_process *up) if (cold) { USB_THREAD_SUSPEND(up->up_ptr); printf("WARNING: A USB process has " - "been left suspended!\n"); + "been left suspended\n"); break; } cv_wait(&up->up_cv, up->up_mtx); diff --git a/sys/dev/usb/usb_request.c b/sys/dev/usb/usb_request.c index 8ccaa14f7a5a..03745faa7a5b 100644 --- a/sys/dev/usb/usb_request.c +++ b/sys/dev/usb/usb_request.c @@ -1549,7 +1549,7 @@ retry: USB_MAX_IPACKET, USB_MAX_IPACKET, 0, UDESC_DEVICE, 0, 0); if (err) { DPRINTFN(0, "getting device descriptor " - "at addr %d failed, %s!\n", udev->address, + "at addr %d failed, %s\n", udev->address, usbd_errstr(err)); goto done; } @@ -1557,7 +1557,7 @@ retry: err = usbd_req_get_device_desc(udev, mtx, &udev->ddesc); if (err) { DPRINTFN(0, "addr=%d, getting device " - "descriptor failed, %s!\n", old_addr, + "descriptor failed, %s\n", old_addr, usbd_errstr(err)); goto done; } diff --git a/sys/dev/usb/usb_transfer.c b/sys/dev/usb/usb_transfer.c index 8daf475a4b8a..e7cb202aef57 100644 --- a/sys/dev/usb/usb_transfer.c +++ b/sys/dev/usb/usb_transfer.c @@ -201,9 +201,9 @@ usbd_transfer_setup_sub_malloc(struct usb_setup_params *parm, usb_size_t r; usb_size_t z; - USB_ASSERT(align > 1, ("Invalid alignment, 0x%08x!\n", + USB_ASSERT(align > 1, ("Invalid alignment, 0x%08x\n", align)); - USB_ASSERT(size > 0, ("Invalid size = 0!\n")); + USB_ASSERT(size > 0, ("Invalid size = 0\n")); if (count == 0) { return (0); /* nothing to allocate */ @@ -416,9 +416,15 @@ usbd_transfer_setup_sub(struct usb_setup_params *parm) case USB_SPEED_LOW: case USB_SPEED_FULL: frame_limit = USB_MAX_FS_ISOC_FRAMES_PER_XFER; + xfer->fps_shift = 0; break; default: frame_limit = USB_MAX_HS_ISOC_FRAMES_PER_XFER; + xfer->fps_shift = edesc->bInterval; + if (xfer->fps_shift > 0) + xfer->fps_shift--; + if (xfer->fps_shift > 3) + xfer->fps_shift = 3; break; } @@ -936,10 +942,18 @@ usbd_transfer_setup(struct usb_device *udev, * configuration and alternate setting * when USB transfers are in use on * the given interface. Search the USB - * code for "endpoint->refcount" if you + * code for "endpoint->refcount_alloc" if you * want more information. */ - xfer->endpoint->refcount++; + USB_BUS_LOCK(info->bus); + if (xfer->endpoint->refcount_alloc >= USB_EP_REF_MAX) + parm.err = USB_ERR_INVAL; + + xfer->endpoint->refcount_alloc++; + + if (xfer->endpoint->refcount_alloc == 0) + panic("usbd_transfer_setup(): Refcount wrapped to zero\n"); + USB_BUS_UNLOCK(info->bus); /* * Whenever we set ppxfer[] then we @@ -954,6 +968,10 @@ usbd_transfer_setup(struct usb_device *udev, */ ppxfer[n] = xfer; } + + /* check for error */ + if (parm.err) + goto done; } if (buf || parm.err) { @@ -1173,14 +1191,16 @@ usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup) * NOTE: default endpoint does not have an * interface, even if endpoint->iface_index == 0 */ - xfer->endpoint->refcount--; + USB_BUS_LOCK(info->bus); + xfer->endpoint->refcount_alloc--; + USB_BUS_UNLOCK(info->bus); usb_callout_drain(&xfer->timeout_handle); USB_BUS_LOCK(info->bus); USB_ASSERT(info->setup_refcount != 0, ("Invalid setup " - "reference count!\n")); + "reference count\n")); info->setup_refcount--; @@ -1332,7 +1352,9 @@ usbd_setup_ctrl_transfer(struct usb_xfer *xfer) /* check if there is a length mismatch */ if (len > xfer->flags_int.control_rem) { - DPRINTFN(0, "Length greater than remaining length!\n"); + DPRINTFN(0, "Length (%d) greater than " + "remaining length (%d)\n", len, + xfer->flags_int.control_rem); goto error; } /* check if we are doing a short transfer */ @@ -1344,7 +1366,7 @@ usbd_setup_ctrl_transfer(struct usb_xfer *xfer) (len != xfer->flags_int.control_rem) && (xfer->nframes != 1)) { DPRINTFN(0, "Short control transfer without " - "force_short_xfer set!\n"); + "force_short_xfer set\n"); goto error; } xfer->flags_int.control_rem -= len; @@ -1620,7 +1642,10 @@ usbd_transfer_start(struct usb_xfer *xfer) /* mark the USB transfer started */ if (!xfer->flags_int.started) { + /* lock the BUS lock to avoid races updating flags_int */ + USB_BUS_LOCK(xfer->xroot->bus); xfer->flags_int.started = 1; + USB_BUS_UNLOCK(xfer->xroot->bus); } /* check if the USB transfer callback is already transferring */ @@ -1655,14 +1680,21 @@ usbd_transfer_stop(struct usb_xfer *xfer) /* check if the USB transfer was ever opened */ if (!xfer->flags_int.open) { - /* nothing to do except clearing the "started" flag */ - xfer->flags_int.started = 0; + if (xfer->flags_int.started) { + /* nothing to do except clearing the "started" flag */ + /* lock the BUS lock to avoid races updating flags_int */ + USB_BUS_LOCK(xfer->xroot->bus); + xfer->flags_int.started = 0; + USB_BUS_UNLOCK(xfer->xroot->bus); + } return; } /* try to stop the current USB transfer */ USB_BUS_LOCK(xfer->xroot->bus); - xfer->error = USB_ERR_CANCELLED;/* override any previous error */ + /* override any previous error */ + xfer->error = USB_ERR_CANCELLED; + /* * Clear "open" and "started" when both private and USB lock * is locked so that we don't get a race updating "flags_int" @@ -1785,8 +1817,18 @@ usbd_transfer_drain(struct usb_xfer *xfer) usbd_transfer_stop(xfer); - while (usbd_transfer_pending(xfer)) { + while (usbd_transfer_pending(xfer) || + xfer->flags_int.doing_callback) { + + /* + * It is allowed that the callback can drop its + * transfer mutex. In that case checking only + * "usbd_transfer_pending()" is not enough to tell if + * the USB transfer is fully drained. We also need to + * check the internal "doing_callback" flag. + */ xfer->flags_int.draining = 1; + /* * Wait until the current outstanding USB * transfer is complete ! @@ -1804,6 +1846,23 @@ usbd_xfer_get_frame(struct usb_xfer *xfer, usb_frcount_t frindex) return (&xfer->frbuffers[frindex]); } +/*------------------------------------------------------------------------* + * usbd_xfer_get_fps_shift + * + * The following function is only useful for isochronous transfers. It + * returns how many times the frame execution rate has been shifted + * down. + * + * Return value: + * Success: 0..3 + * Failure: 0 + *------------------------------------------------------------------------*/ +uint8_t +usbd_xfer_get_fps_shift(struct usb_xfer *xfer) +{ + return (xfer->fps_shift); +} + usb_frlength_t usbd_xfer_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex) { @@ -1868,7 +1927,7 @@ usbd_xfer_set_frame_offset(struct usb_xfer *xfer, usb_frlength_t offset, usb_frcount_t frindex) { KASSERT(!xfer->flags.ext_buffer, ("Cannot offset data frame " - "when the USB buffer is external!\n")); + "when the USB buffer is external\n")); KASSERT(frindex < xfer->max_frame_count, ("frame index overflow")); /* set virtual address to load */ @@ -2031,6 +2090,9 @@ usbd_callback_wrapper(struct usb_xfer_queue *pq) /* get next USB transfer in the queue */ info->done_q.curr = NULL; + /* set flag in case of drain */ + xfer->flags_int.doing_callback = 1; + USB_BUS_UNLOCK(info->bus); USB_BUS_LOCK_ASSERT(info->bus, MA_NOTOWNED); @@ -2083,12 +2145,17 @@ usbd_callback_wrapper(struct usb_xfer_queue *pq) if ((!xfer->flags_int.open) && (xfer->flags_int.started) && (xfer->usb_state == USB_ST_ERROR)) { + /* clear flag in case of drain */ + xfer->flags_int.doing_callback = 0; /* try to loop, but not recursivly */ usb_command_wrapper(&info->done_q, xfer); return; } done: + /* clear flag in case of drain */ + xfer->flags_int.doing_callback = 0; + /* * Check if we are draining. */ @@ -2190,6 +2257,8 @@ usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error) */ if (!xfer->flags_int.transferring) { DPRINTF("not transferring\n"); + /* end of control transfer, if any */ + xfer->flags_int.control_act = 0; return; } /* only set transfer error if not already set */ @@ -2368,7 +2437,7 @@ usbd_pipe_start(struct usb_xfer_queue *pq) &udev->cs_msg[0], &udev->cs_msg[1]); } else { /* should not happen */ - DPRINTFN(0, "No stall handler!\n"); + DPRINTFN(0, "No stall handler\n"); } /* * Check if we should stall. Some USB hardware @@ -2511,7 +2580,7 @@ usbd_callback_wrapper_sub(struct usb_xfer *xfer) if (xfer->aframes > xfer->nframes) { if (xfer->error == 0) { panic("%s: actual number of frames, %d, is " - "greater than initial number of frames, %d!\n", + "greater than initial number of frames, %d\n", __FUNCTION__, xfer->aframes, xfer->nframes); } else { /* just set some valid value */ @@ -2538,7 +2607,7 @@ usbd_callback_wrapper_sub(struct usb_xfer *xfer) if (xfer->actlen > xfer->sumlen) { if (xfer->error == 0) { panic("%s: actual length, %d, is greater than " - "initial length, %d!\n", + "initial length, %d\n", __FUNCTION__, xfer->actlen, xfer->sumlen); } else { /* just set some valid value */ @@ -2740,7 +2809,7 @@ repeat: udev->default_xfer, usb_control_ep_cfg, USB_DEFAULT_XFER_MAX, NULL, udev->default_mtx)) { DPRINTFN(0, "could not setup default " - "USB transfer!\n"); + "USB transfer\n"); } else { goto repeat; } diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index 3cb6a3ae82a0..2385daf86e4d 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -328,6 +328,7 @@ vendor AVISION 0x0638 Avision vendor TEAC 0x0644 TEAC vendor SGI 0x065e Silicon Graphics vendor SANWASUPPLY 0x0663 Sanwa Supply +vendor MEGATEC 0x0665 Megatec vendor LINKSYS 0x066b Linksys vendor ACERSA 0x066e Acer Semiconductor America vendor SIGMATEL 0x066f Sigmatel @@ -523,6 +524,7 @@ vendor ELCON 0x0db7 ELCON Systemtechnik vendor NETAC 0x0dd8 Netac vendor SITECOMEU 0x0df6 Sitecom Europe vendor MOBILEACTION 0x0df7 Mobile Action +vendor AMIGO 0x0e0b Amigo Technology vendor SPEEDDRAGON 0x0e55 Speed Dragon Multimedia vendor HAWKING 0x0e66 Hawking vendor FOSSIL 0x0e67 Fossil, Inc @@ -554,6 +556,7 @@ vendor PLX 0x10b5 PLX vendor ASANTE 0x10bd Asante vendor SILABS 0x10c4 Silicon Labs vendor ACTIONS 0x10d6 Actions +vendor AIRPLUS 0x1011 Airplus vendor ANALOG 0x1110 Analog Devices vendor TENX 0x1130 Ten X Technology, Inc. vendor ISSC 0x1131 Integrated System Solution Corp. @@ -561,6 +564,7 @@ vendor JRC 0x1145 Japan Radio Company vendor SPHAIRON 0x114b Sphairon Access Systems GmbH vendor DELORME 0x1163 DeLorme vendor SERVERWORKS 0x1166 ServerWorks +vendor DLINK3 0x1186 Dlink vendor ACERCM 0x1189 Acer Communications & Multimedia vendor SIERRA 0x1199 Sierra Wireless vendor TOPFIELD 0x11db Topfield Co., Ltd @@ -586,12 +590,14 @@ vendor NETGEAR3 0x1385 Netgear vendor BALTECH 0x13ad Baltech vendor CISCOLINKSYS 0x13b1 Cisco-Linksys vendor SHARK 0x13d2 Shark +vendor AZUREWAVE 0x13d3 AsureWave vendor EMTEC 0x13fe Emtec vendor NOVATEL 0x1410 Novatel Wireless vendor MERLIN 0x1416 Merlin vendor WISTRONNEWEB 0x1435 Wistron NeWeb vendor RADIOSHACK 0x1453 Radio Shack vendor HUAWEI3COM 0x1472 Huawei-3Com +vendor ABOCOM2 0x1482 AboCom Systems vendor SILICOM 0x1485 Silicom vendor RALINK 0x148f Ralink Technology vendor IMAGINATION 0x149a Imagination Technologies @@ -600,18 +606,22 @@ vendor SUPERTOP 0x14cd Super Top vendor PLANEX3 0x14ea Planex Communications vendor SILICONPORTALS 0x1527 Silicon Portals vendor UBIQUAM 0x1529 UBIQUAM Co., Ltd. +vendor JMICRON 0x152d JMicron vendor UBLOX 0x1546 U-blox vendor PNY 0x154b PNY vendor OQO 0x1557 OQO vendor UMEDIA 0x157e U-MEDIA Communications vendor FIBERLINE 0x1582 Fiberline vendor SPARKLAN 0x15a9 SparkLAN +vendor AMIT2 0x15c5 AMIT vendor SOHOWARE 0x15e8 SOHOware vendor UMAX 0x1606 UMAX Data Systems vendor INSIDEOUT 0x1608 Inside Out Networks +vendor AMOI 0x1614 Amoi Electronics vendor GOODWAY 0x1631 Good Way Technology vendor ENTREGA 0x1645 Entrega vendor ACTIONTEC 0x1668 Actiontec Electronics +vendor CISCOLINKSYS2 0x167b Cisco-Linksys vendor ATHEROS 0x168c Atheros Communications vendor GIGASET 0x1690 Gigaset vendor GLOBALSUN 0x16ab Global Sun Technology @@ -621,16 +631,28 @@ vendor CMOTECH 0x16d8 C-motech vendor AXESSTEL 0x1726 Axesstel Co., Ltd. vendor LINKSYS4 0x1737 Linksys vendor SENAO 0x1740 Senao +vendor ASUS2 0x1761 ASUS +vendor SWEEX2 0x177f Sweex vendor METAGEEK 0x1781 MetaGeek vendor AMIT 0x18c5 AMIT vendor QCOM 0x18e8 Qcom vendor LINKSYS3 0x1915 Linksys vendor QUALCOMMINC 0x19d2 Qualcomm, Incorporated +vendor WCH2 0x1a86 QinHeng Electronics vendor STELERA 0x1a8d Stelera Wireless +vendor TCTMOBILE 0x1bbb TCT Mobile +vendor TELIT 0x1bc7 Telit vendor MPMAN 0x1cae MpMan vendor DRESDENELEKTRONIK 0x1cf1 dresden elektronik +vendor PEGATRON 0x1d4d Pegatron +vendor QISDA 0x1da5 Qisda +vendor ALINK 0x1e0e Alink +vendor AIRTIES 0x1eda AirTies vendor DLINK 0x2001 D-Link vendor PLANEX2 0x2019 Planex Communications +vendor TLAYTECH 0x20b9 Tlay Tech +vendor ENCORE 0x203d Encore +vendor PARA 0x20b8 PARA Industrial vendor ERICSSON 0x2282 Ericsson vendor MOTOROLA2 0x22b8 Motorola vendor TRIPPLITE 0x2478 Tripp-Lite @@ -656,9 +678,12 @@ vendor ZINWELL 0x5a57 Zinwell vendor SITECOM 0x6189 Sitecom vendor ARKMICRO 0x6547 Arkmicro Technologies Inc. vendor 3COM2 0x6891 3Com +vendor EDIMAX 0x7392 Edimax vendor INTEL 0x8086 Intel +vendor INTEL2 0x8087 Intel vendor SITECOM2 0x9016 Sitecom vendor MOSCHIP 0x9710 MosChip Semiconductor +vendor MARVELL 0x9e88 Marvell Technology Group Ltd. vendor 3COM3 0xa727 3Com vendor HP2 0xf003 Hewlett Packard vendor USRP 0xfffe GNU Radio USRP @@ -688,6 +713,12 @@ product 3COMUSR USR56K 0x3021 U.S. Robotics 56000 Voice FaxModem Pro /* AboCom products */ product ABOCOM XX1 0x110c XX1 product ABOCOM XX2 0x200c XX2 +product ABOCOM RT2770 0x2770 RT2770 +product ABOCOM RT2870 0x2870 RT2870 +product ABOCOM RT3070 0x3070 RT3070 +product ABOCOM RT3071 0x3071 RT3071 +product ABOCOM RT3072 0x3072 RT3072 +product ABOCOM2 RT2870_1 0x3c09 RT2870 product ABOCOM URE450 0x4000 URE450 Ethernet Adapter product ABOCOM UFE1000 0x4002 UFE1000 Fast Ethernet Adapter product ABOCOM DSB650TX_PNA 0x4003 1/10/100 Ethernet Adapter @@ -718,6 +749,17 @@ product ACCTON SMCWUSBTG2_NF 0x4507 SMCWUSBT-G2 (no firmware) product ACCTON SMCWUSBTG2 0x4508 SMCWUSBT-G2 product ACCTON PRISM_GT 0x4521 PrismGT USB 2.0 WLAN product ACCTON SS1001 0x5046 SpeedStream Ethernet Adapter +product ACCTON RT2870_2 0x6618 RT2870 +product ACCTON RT3070 0x7511 RT3070 +product ACCTON RT2770 0x7512 RT2770 +product ACCTON RT2870_3 0x7522 RT2870 +product ACCTON RT2870_5 0x8522 RT2870 +product ACCTON RT3070_4 0xa512 RT3070 +product ACCTON RT2870_4 0xa618 RT2870 +product ACCTON RT3070_1 0xa701 RT3070 +product ACCTON RT3070_2 0xa702 RT3070 +product ACCTON RT2870_1 0xb522 RT2870 +product ACCTON RT3070_3 0xc522 RT3070 product ACCTON ZD1211B 0xe501 ZD1211B /* Aceeca products */ @@ -737,6 +779,7 @@ product ACERP ACERSCAN_620U 0x2060 Acerscan 620U product ACERP ACERSCAN_4300U 0x20b0 Benq 3300U/4300U product ACERP ACERSCAN_640BT 0x20be Acerscan 640BT product ACERP ACERSCAN_1240U 0x20c0 Acerscan 1240U +product ACERP H10 0x4068 AWL400 Wireless Adapter product ACERP ATAPI 0x6003 ATA/ATAPI Adapter product ACERP AWL300 0x9000 AWL300 Wireless Adapter product ACERP AWL400 0x9001 AWL400 Wireless Adapter @@ -813,9 +856,15 @@ product AIPTEK POCKETCAM3M 0x2011 PocketCAM 3Mega product AIPTEK2 PENCAM_MEGA_1_3 0x504a PenCam Mega 1.3 product AIPTEK2 SUNPLUS_TECH 0x0c15 Sunplus Technology Inc. +/* AirPlis products */ +product AIRPLUS MCD650 0x3198 MCD650 modem + /* AirPrime products */ product AIRPRIME PC5220 0x0112 CDMA Wireless PC Card +/* AirTies products */ +product AIRTIES RT3070 0x2310 RT3070 + /* AKS products */ product AKS USBHASP 0x0001 USB-HASP 0.06 @@ -831,6 +880,11 @@ product ALCOR SM_KBD 0x9410 MicroConnectors/StrongMan Keyboard product ALCOR NEC_KBD_HUB 0x9472 NEC Kbd Hub product ALCOR AU6390 0x6390 AU6390 USB-IDE converter +/* Alink products */ +product ALINK DWM652U5 0xce16 DWM-652 +product ALINK 3G 0x9000 3G modem +product ALINK 3GU 0x9200 3G modem + /* Altec Lansing products */ product ALTEC ADA70 0x0070 ADA70 Speakers product ALTEC ASC495 0xff05 ASC495 Speakers @@ -838,6 +892,11 @@ product ALTEC ASC495 0xff05 ASC495 Speakers /* Allied Telesyn International products */ product ALLIEDTELESYN ATUSB100 0xb100 AT-USB100 +/* Amoi products */ +product AMOI H01 0x0800 H01 3G modem +product AMOI H01A 0x7002 H01A 3G modem +product AMOI H02 0x0802 H02 3G modem + /* American Power Conversion products */ product APC UPS 0x0002 Uninterruptible Power Supply @@ -845,14 +904,27 @@ product APC UPS 0x0002 Uninterruptible Power Supply product AMBIT WLAN 0x0302 WLAN product AMBIT NTL_250 0x6098 NTL 250 cable modem +/* American Power Conversion products */ +product APC UPS 0x0002 Uninterruptible Power Supply + +/* Amigo Technology products */ +product AMIGO RT2870_1 0x9031 RT2870 +product AMIGO RT2870_2 0x9041 RT2870 + /* AMIT products */ product AMIT CGWLUSB2GO 0x0002 CG-WLUSB2GO +product AMIT CGWLUSB2GNR 0x0008 CG-WLUSB2GNR +product AMIT RT2870_1 0x0012 RT2870 + +/* AMIT(2) products */ +product AMIT2 RT2870 0x0008 RT2870 /* Anchor products */ product ANCHOR EZUSB 0x2131 EZUSB product ANCHOR EZLINK 0x2720 EZLINK /* AnyData products */ +product ANYDATA ADU_620UW 0x6202 CDMA 2000 EV-DO USB Modem product ANYDATA ADU_E100X 0x6501 CDMA 2000 1xRTT/EV-DO USB Modem product ANYDATA ADU_500A 0x6502 CDMA 2000 EV-DO USB Modem @@ -902,16 +974,26 @@ product ASANTE EA 0x1427 Ethernet product ASIX AX88172 0x1720 10/100 Ethernet product ASIX AX88178 0x1780 AX88178 product ASIX AX88772 0x7720 AX88772 +product ASIX AX88772A 0x772a AX88772A USB 2.0 10/100 Ethernet /* ASUS products */ +product ASUS2 USBN11 0x0b05 USB-N11 product ASUS WL167G 0x1707 WL-167g Wireless Adapter product ASUS WL159G 0x170c WL-159g product ASUS A9T_WIFI 0x171b A9T wireless +product ASUS P5B_WIFI 0x171d P5B wireless product ASUS RT2573_1 0x1723 RT2573 product ASUS RT2573_2 0x1724 RT2573 product ASUS LCM 0x1726 LCM display +product ASUS RT2870_1 0x1731 RT2870 +product ASUS RT2870_2 0x1732 RT2870 +product ASUS RT2870_3 0x1742 RT2870 +product ASUS RT2870_4 0x1760 RT2870 +product ASUS RT2870_5 0x1761 RT2870 +product ASUS RT3070 0x1784 RT3070 product ASUS P535 0x420f ASUS P535 PDA product ASUS GMSC 0x422f ASUS Generic Mass Storage +product ASUS RT2570 0x1706 RT2500USB Wireless Adapter /* ATen products */ product ATEN UC1284 0x2001 Parallel printer @@ -945,6 +1027,13 @@ product AVISION 1200U 0x0268 1200U scanner /* Axesstel products */ product AXESSTEL DATAMODEM 0x1000 Data Modem +/* AsureWave products */ +product AZUREWAVE RT2870_1 0x3247 RT2870 +product AZUREWAVE RT2870_2 0x3262 RT2870 +product AZUREWAVE RT3070_1 0x3273 RT3070 +product AZUREWAVE RT3070_2 0x3284 RT3070 +product AZUREWAVE RT3070_3 0x3305 RT3070 + /* Baltech products */ product BALTECH CARDREADER 0x9999 Card reader @@ -974,8 +1063,14 @@ product BELKIN F5D7051 0x7051 F5D7051 54g USB Network Adapter product BELKIN F5D7050A 0x705a F5D7050A Wireless Adapter /* Also sold as 'Ativa 802.11g wireless card' */ product BELKIN F5D7050_V4000 0x705c F5D7050 v4000 Wireless Adapter +product BELKIN F5D7050E 0x705e F5D7050E Wireless Adapter +product BELKIN RT2870_1 0x8053 RT2870 +product BELKIN RT2870_2 0x805c RT2870 +product BELKIN F5D8053V3 0x815c F5D8053 v3 +product BELKIN F5D8055 0x825a F5D8055 product BELKIN F5D9050V3 0x905b F5D9050 ver 3 Wireless Adapter product BELKIN2 F5U002 0x0002 F5U002 Parallel printer +product BELKIN F6D4050V1 0x935a F6D4050 v1 /* Billionton products */ product BILLIONTON USB100 0x0986 USB100N 10/100 FastEthernet @@ -1022,6 +1117,7 @@ product CCYU ED1064 0x2136 EasyDisk ED1064 /* Century products */ product CENTURY EX35QUAT 0x011e Century USB Disk Enclosure +product CENTURY EX35SW4_SB4 0x011f Century USB Disk Enclosure /* Cherry products */ product CHERRY MY3000KBD 0x0001 My3000 keyboard @@ -1034,6 +1130,7 @@ product CHIC CYPRESS 0x0003 Cypress USB Mouse /* Chicony products */ product CHICONY KB8933 0x0001 KB-8933 keyboard +product CHICONY CNF7129 0xb071 Notebook Web Camera product CHICONY2 TWINKLECAM 0x600d TwinkleCam USB camera /* CH Products */ @@ -1051,6 +1148,7 @@ product CISCOLINKSYS HU200TS 0x001a HU200TS Wireless Adapter product CISCOLINKSYS WUSB54GC 0x0020 WUSB54GC product CISCOLINKSYS WUSB54GR 0x0023 WUSB54GR product CISCOLINKSYS WUSBF54G 0x0024 WUSBF54G +product CISCOLINKSYS2 RT3070 0x4001 RT3070 /* CMOTECH products */ product CMOTECH CNU510 0x5141 CDMA Technologies USB modem @@ -1077,6 +1175,15 @@ product CONCEPTRONIC AR5523_2 0x7811 AR5523 product CONCEPTRONIC AR5523_2_NF 0x7812 AR5523 (no firmware) product CONCEPTRONIC2 C54RU 0x3c02 C54RU WLAN product CONCEPTRONIC2 C54RU2 0x3c22 C54RU +product CONCEPTRONIC2 VIGORN61 0x3c25 VIGORN61 +product CONCEPTRONIC2 RT2870_1 0x3c06 RT2870 +product CONCEPTRONIC2 RT2870_2 0x3c07 RT2870 +product CONCEPTRONIC2 RT2870_7 0x3c09 RT2870 +product CONCEPTRONIC2 RT2870_8 0x3c12 RT2870 +product CONCEPTRONIC2 RT2870_3 0x3c23 RT2870 +product CONCEPTRONIC2 RT2870_4 0x3c25 RT2870 +product CONCEPTRONIC2 RT2870_5 0x3c27 RT2870 +product CONCEPTRONIC2 RT2870_6 0x3c28 RT2870 /* Connectix products */ product CONNECTIX QUICKCAM 0x0001 QuickCam @@ -1091,6 +1198,12 @@ product COREGA FETHER_USB2_TX 0x0017 FEther USB2-TX product COREGA WLUSB_11_KEY 0x001a ULUSB-11 Key product COREGA CGWLUSB2GL 0x002d CG-WLUSB2GL product COREGA CGWLUSB2GPX 0x002e CG-WLUSB2GPX +product COREGA RT2870_1 0x002f RT2870 +product COREGA RT2870_2 0x003c RT2870 +product COREGA RT2870_3 0x003f RT2870 +product COREGA RT3070 0x0041 RT3070 +product COREGA CGWLUSB300GNM 0x0042 CG-WLUSB300GNM + product COREGA WLUSB_11_STICK 0x7613 WLAN USB Stick 11 product COREGA FETHER_USB_TXC 0x9601 FEther USB-TXC @@ -1112,12 +1225,14 @@ product CTX EX1300 0x9999 Ex1300 hub product CURITEL HX550C 0x1101 CDMA 2000 1xRTT USB modem (HX-550C) product CURITEL HX57XB 0x2101 CDMA 2000 1xRTT USB modem (HX-570/575B/PR-600) product CURITEL PC5740 0x3701 Broadband Wireless modem +product CURITEL UM175 0x3714 EVDO modem /* CyberPower products */ product CYBERPOWER 1500CAVRLCD 0x0501 1500CAVRLCD /* CyberTAN Technology products */ product CYBERTAN TG54USB 0x1666 TG54USB +product CYBERTAN RT2870 0x1828 RT2870 /* Cypress Semiconductor products */ product CYPRESS MOUSE 0x0001 mouse @@ -1144,7 +1259,22 @@ product DELL BC02 0x8000 BC02 Bluetooth USB Adapter product DELL PRISM_GT_1 0x8102 PrismGT USB 2.0 WLAN product DELL TM350 0x8103 TrueMobile 350 Bluetooth USB Adapter product DELL PRISM_GT_2 0x8104 PrismGT USB 2.0 WLAN +product DELL U5700 0x8114 Dell 5700 3G +product DELL U5500 0x8115 Dell 5500 3G +product DELL U5505 0x8116 Dell 5505 3G +product DELL U5700_2 0x8117 Dell 5700 3G +product DELL U5510 0x8118 Dell 5510 3G +product DELL U5700_3 0x8128 Dell 5700 3G +product DELL U5700_4 0x8129 Dell 5700 3G +product DELL U5720 0x8133 Dell 5720 3G +product DELL U5720_2 0x8134 Dell 5720 3G product DELL U740 0x8135 Dell U740 CDMA +product DELL U5520 0x8136 Dell 5520 3G +product DELL U5520_2 0x8137 Dell 5520 3G +product DELL U5520_3 0x8138 Dell 5520 3G +product DELL U5730 0x8180 Dell 5730 3G +product DELL U5730_2 0x8181 Dell 5730 3G +product DELL U5730_3 0x8182 Dell 5730 3G /* Delorme Paublishing products */ product DELORME EARTHMATE 0x0100 Earthmate GPS @@ -1180,6 +1310,8 @@ product DLINK DWLAG122 0x3a04 DWL-AG122 product DLINK DWLAG122_NF 0x3a05 DWL-AG122 (no firmware) product DLINK DWLG122 0x3c00 DWL-G122 b1 Wireless Adapter product DLINK DUBE100B1 0x3c05 DUB-E100 rev B1 +product DLINK RT2870 0x3c09 RT2870 +product DLINK RT3072 0x3c0a RT3072 product DLINK DSB650C 0x4000 10Mbps Ethernet product DLINK DSB650TX1 0x4001 10/100 Ethernet product DLINK DSB650TX 0x4002 10/100 Ethernet @@ -1187,15 +1319,25 @@ product DLINK DSB650TX_PNA 0x4003 1/10/100 Ethernet product DLINK DSB650TX3 0x400b 10/100 Ethernet product DLINK DSB650TX2 0x4102 10/100 Ethernet product DLINK DSB650 0xabc1 10/100 Ethernet +product DLINK2 DWA120 0x3a0c DWA-120 product DLINK2 DWA120_NF 0x3a0d DWA-120 (no firmware) -product DLINK2 DWA120 0x3a0e DWA-120 product DLINK2 DWLG122C1 0x3c03 DWL-G122 c1 product DLINK2 WUA1340 0x3c04 WUA-1340 product DLINK2 DWA111 0x3c06 DWA-111 +product DLINK2 RT2870_1 0x3c09 RT2870 product DLINK2 DWA110 0x3c07 DWA-110 +product DLINK2 RT3072 0x3c0a RT3072 +product DLINK2 RT3070_1 0x3c0d RT3070 +product DLINK2 RT3070_2 0x3c0e RT3070 +product DLINK2 RT3070_3 0x3c0f RT3070 +product DLINK2 RT2870_2 0x3c11 RT2870 +product DLINK2 DWA130 0x3c13 DWA-130 +product DLINK2 RT3070_4 0x3c15 RT3070 +product DLINK3 DWM652 0x3e04 DWM-652 /* DMI products */ product DMI CFSM_RW 0xa109 CF/SM Reader/Writer +product DMI DISK 0x2bcf Generic Disk /* DrayTek products */ product DRAYTEK VIGOR550 0x0550 Vigor550 @@ -1207,6 +1349,15 @@ product DRESDENELEKTRONIK WIRELESSHANDHELDTERMINAL 0x0004 Wireless Handheld Ter /* Dynastream Innovations */ product DYNASTREAM ANTDEVBOARD 0x1003 ANT dev board +/* Edimax products */ +product EDIMAX EW7318USG 0x7318 USB Wireless dongle +product EDIMAX RT2870_1 0x7711 RT2870 +product EDIMAX EW7717 0x7717 EW-7717 +product EDIMAX EW7718 0x7718 EW-7718 + +/* Eicon Networks */ +product EICON DIVA852 0x4905 Diva 852 ISDN TA + /* EIZO products */ product EIZO HUB 0x0000 hub product EIZO MONITOR 0x0001 monitor @@ -1232,6 +1383,11 @@ product ELSA USB2ETHERNET 0x3000 Microlink USB2Ethernet /* EMS products */ product EMS DUAL_SHOOTER 0x0003 PSX gun controller converter +/* Encore products */ +product ENCORE RT3070_1 0x1480 RT3070 +product ENCORE RT3070_2 0x14a1 RT3070 +product ENCORE RT3070_3 0x14a9 RT3070 + /* Entrega products */ product ENTREGA 1S 0x0001 1S serial product ENTREGA 2S 0x0002 2S serial @@ -1315,6 +1471,8 @@ product FTDI SERIAL_8U100AX 0x8372 8U100AX Serial product FTDI SERIAL_8U232AM 0x6001 8U232AM Serial product FTDI SERIAL_8U232AM4 0x6004 8U232AM Serial product FTDI SERIAL_2232C 0x6010 FT2232C Dual port Serial +product FTDI SERIAL_2232D 0x9e90 FT2232D Dual port Serial +product FTDI SERIAL_4232H 0x6011 FT4232H Quad port Serial /* Gude Analog- und Digitalsysteme products also uses FTDI's id: */ product FTDI TACTRIX_OPENPORT_13M 0xcc48 OpenPort 1.3 Mitsubishi product FTDI TACTRIX_OPENPORT_13S 0xcc49 OpenPort 1.3 Subaru @@ -1336,6 +1494,9 @@ product FTDI CFA_633 0xfc0b Crystalfontz CFA-633 USB LCD product FTDI CFA_631 0xfc0c Crystalfontz CFA-631 USB LCD product FTDI CFA_635 0xfc0d Crystalfontz CFA-635 USB LCD product FTDI SEMC_DSS20 0xfc82 SEMC DSS-20 SyncStation +/* Commerzielle und Technische Informationssysteme GmbH products */ +product FTDI CTI_USB_NANO_485 0xf60b CTI USB-Nano 485 +product FTDI CTI_USB_MINI_485 0xf608 CTI USB-Mini 485 /* Fuji photo products */ product FUJIPHOTO MASS0100 0x0100 Mass Storage @@ -1372,6 +1533,11 @@ product GIGASET SMCWUSBTG_NF 0x0711 SMCWUSBT-G (no firmware) product GIGASET AR5523 0x0712 AR5523 product GIGASET AR5523_NF 0x0713 AR5523 (no firmware) product GIGASET RT2573 0x0722 RT2573 +product GIGASET RT3070_1 0x0740 RT3070 +product GIGASET RT3070_2 0x0744 RT3070 +product GIGABYTE RT2870_1 0x800b RT2870 +product GIGABYTE GNWB31N 0x800c GN-WB31N +product GIGABYTE GNWB32L 0x800d GN-WB32L /* Global Sun Technology product */ product GLOBALSUN AR5523_1 0x7801 AR5523 @@ -1407,6 +1573,7 @@ product GUILLEMOT DALEADER 0xa300 DA Leader product GUILLEMOT HWGUSB254 0xe000 HWGUSB2-54 WLAN product GUILLEMOT HWGUSB254LB 0xe010 HWGUSB2-54-LB product GUILLEMOT HWGUSB254V2AP 0xe020 HWGUSB2-54V2-AP +product GUILLEMOT HWNU300 0xe030 HWNU-300 /* Hagiwara products */ product HAGIWARA FGSM 0x0002 FlashGate SmartMedia Card Reader @@ -1425,6 +1592,10 @@ product HANDSPRING TREO600 0x0300 Handspring Treo 600 product HAUPPAUGE WINTV_USB_FM 0x4d12 WinTV USB FM /* Hawking Technologies products */ +product HAWKING RT2870_1 0x0001 RT2870 +product HAWKING RT2870_2 0x0003 RT2870 +product HAWKING HWUN2 0x0009 HWUN2 +product HAWKING RT3070 0x000b RT3070 product HAWKING UF100 0x400c 10/100 USB Ethernet /* Hitachi, Ltd. products */ @@ -1471,12 +1642,14 @@ product HP 2215 0x1016 iPAQ 22xx/Jornada 548 product HP 568J 0x1116 Jornada 568 product HP 930C 0x1204 DeskJet 930c product HP P2000U 0x1801 Inkjet P-2000U +product HP HS2300 0x1e1d HS2300 HSDPA (aka MC8775) product HP 640C 0x2004 DeskJet 640c product HP 4670V 0x3005 ScanJet 4670v product HP P1100 0x3102 Photosmart P1100 product HP OJ4215 0x3d11 OfficeJet 4215 product HP HN210E 0x811c Ethernet HN210E product HP2 C500 0x6002 PhotoSmart C500 +product HP EV2200 0x1b1d ev2200 HSDPA (aka MC5720) product HP HS2300 0x1e1d hs2300 HSDPA (aka MC8775) /* HTC products */ @@ -1487,7 +1660,72 @@ product HTC SMARTPHONE 0x0a51 SmartPhone USB Sync /* HUAWEI products */ product HUAWEI MOBILE 0x1001 Huawei Mobile product HUAWEI E220 0x1003 Huawei HSDPA modem +product HUAWEI E220BIS 0x1004 Huawei HSDPA modem +product HUAWEI E1401 0x1401 3G modem +product HUAWEI E1402 0x1402 3G modem +product HUAWEI E1403 0x1403 3G modem +product HUAWEI E1404 0x1404 3G modem +product HUAWEI E1405 0x1405 3G modem +product HUAWEI E1406 0x1406 3G modem +product HUAWEI E1407 0x1407 3G modem +product HUAWEI E1408 0x1408 3G modem +product HUAWEI E1409 0x1409 3G modem +product HUAWEI E140A 0x140a 3G modem +product HUAWEI E140B 0x140b 3G modem product HUAWEI E180V 0x140c Huawei Mobile E180V +product HUAWEI E140D 0x140d 3G modem +product HUAWEI E140E 0x140e 3G modem +product HUAWEI E140F 0x140f 3G modem +product HUAWEI E1410 0x1410 3G modem +product HUAWEI E1411 0x1411 3G modem +product HUAWEI E1412 0x1412 3G modem +product HUAWEI E1413 0x1413 3G modem +product HUAWEI E1414 0x1414 3G modem +product HUAWEI E1415 0x1415 3G modem +product HUAWEI E1416 0x1416 3G modem +product HUAWEI E1417 0x1417 3G modem +product HUAWEI E1418 0x1418 3G modem +product HUAWEI E1419 0x1419 3G modem +product HUAWEI E141A 0x141a 3G modem +product HUAWEI E141B 0x141b 3G modem +product HUAWEI E141C 0x141c 3G modem +product HUAWEI E141D 0x141d 3G modem +product HUAWEI E141E 0x141e 3G modem +product HUAWEI E141F 0x141f 3G modem +product HUAWEI E1420 0x1420 3G modem +product HUAWEI E1421 0x1421 3G modem +product HUAWEI E1422 0x1422 3G modem +product HUAWEI E1423 0x1423 3G modem +product HUAWEI E1424 0x1424 3G modem +product HUAWEI E1425 0x1425 3G modem +product HUAWEI E1426 0x1426 3G modem +product HUAWEI E1427 0x1427 3G modem +product HUAWEI E1428 0x1428 3G modem +product HUAWEI E1429 0x1429 3G modem +product HUAWEI E142A 0x142a 3G modem +product HUAWEI E142B 0x142b 3G modem +product HUAWEI E142C 0x142c 3G modem +product HUAWEI E142D 0x142d 3G modem +product HUAWEI E142E 0x142e 3G modem +product HUAWEI E142F 0x142f 3G modem +product HUAWEI E1430 0x1430 3G modem +product HUAWEI E1431 0x1431 3G modem +product HUAWEI E1432 0x1432 3G modem +product HUAWEI E1433 0x1433 3G modem +product HUAWEI E1434 0x1434 3G modem +product HUAWEI E1435 0x1435 3G modem +product HUAWEI E1436 0x1436 3G modem +product HUAWEI E1437 0x1437 3G modem +product HUAWEI E1438 0x1438 3G modem +product HUAWEI E1439 0x1439 3G modem +product HUAWEI E143A 0x143a 3G modem +product HUAWEI E143B 0x143b 3G modem +product HUAWEI E143C 0x143c 3G modem +product HUAWEI E143D 0x143d 3G modem +product HUAWEI E143E 0x143e 3G modem +product HUAWEI E143F 0x143f 3G modem +product HUAWEI E1752 0x1446 3G modem +product HUAWEI E14AC 0x14ac 3G modem /* HUAWEI 3com products */ product HUAWEI3COM WUB320G 0x0009 Aolynk WUB320g @@ -1512,6 +1750,7 @@ product INSYSTEM STORAGE_V2 0x5701 USB Storage Adapter V2 /* Intel products */ product INTEL EASYPC_CAMERA 0x0110 Easy PC Camera product INTEL TESTBOARD 0x9890 82930 test board +product INTEL2 IRMH 0x0020 Integrated Rate Matching Hub /* Intersil products */ product INTERSIL PRISM_GT 0x1000 PrismGT USB 2.0 WLAN @@ -1532,6 +1771,10 @@ product IODATA USBETTXS 0x0913 USB ETTX product IODATA USBWNB11A 0x0919 USB WN-B11 product IODATA USBWNB11 0x0922 USB Airport WN-B11 product IODATA ETGUS2 0x0930 ETG-US2 +product IODATA RT3072_1 0x0944 RT3072 +product IODATA RT3072_2 0x0945 RT3072 +product IODATA RT3072_3 0x0947 RT3072 +product IODATA RT3072_4 0x0948 RT3072 product IODATA USBRSAQ 0x0a03 Serial USB-RSAQ1 product IODATA2 USB2SC 0x0a09 USB2.0-SCSI Bridge USB2-SC @@ -1549,6 +1792,9 @@ product JABLOTRON PC60B 0x0001 PC-60B /* Jaton products */ product JATON EDA 0x5704 Ethernet +/* JMicron products */ +product JMICRON JM20337 0x2338 USB to ATA/ATAPI Bridge + /* JVC products */ product JVC GR_DX95 0x000a GR-DX95 product JVC MP_PRX1 0x3008 MP-PRX1 Ethernet @@ -1628,6 +1874,7 @@ product KYOCERA FINECAM_S5 0x0103 Finecam S5 product KYOCERA FINECAM_L3 0x0105 Finecam L3 product KYOCERA AHK3001V 0x0203 AH-K3001V product KYOCERA2 CDMA_MSM_K 0x17da Qualcomm Kyocera CDMA Technologies MSM +product KYOCERA2 KPC680 0x180a Qualcomm Kyocera CDMA Technologies MSM /* LaCie products */ product LACIE HD 0xa601 Hard Disk @@ -1652,6 +1899,11 @@ product LINKSYS2 WUSB11 0x2219 WUSB11 Wireless Adapter product LINKSYS2 USB200M 0x2226 USB 2.0 10/100 Ethernet product LINKSYS3 WUSB11v28 0x2233 WUSB11 v2.8 Wireless Adapter product LINKSYS4 USB1000 0x0039 USB1000 +product LINKSYS4 WUSB100 0x0070 WUSB100 +product LINKSYS4 WUSB600N 0x0071 WUSB600N +product LINKSYS4 WUSB54GCV2 0x0073 WUSB54GC v2 +product LINKSYS4 WUSB54GCV3 0x0077 WUSB54GC v3 +product LINKSYS4 WUSB600NV2 0x0079 WUSB600N v2 /* Logitech products */ product LOGITECH M2452 0x0203 M2452 keyboard @@ -1681,6 +1933,9 @@ product LOGITECH QUICKCAMPRO2 0xd001 QuickCam Pro /* Logitec Corp. products */ product LOGITEC LDR_H443SU2 0x0033 DVD Multi-plus unit LDR-H443SU2 product LOGITEC LDR_H443U2 0x00b3 DVD Multi-plus unit LDR-H443U2 +product LOGITEC RT2870_1 0x0162 RT2870 +product LOGITEC RT2870_2 0x0163 RT2870 +product LOGITEC RT2870_3 0x0164 RT2870 /* Lucent products */ product LUCENT EVALKIT 0x1001 USS-720 evaluation kit @@ -1691,6 +1946,9 @@ product LUWEN EASYDISK 0x0005 EasyDisc /* Macally products */ product MACALLY MOUSE1 0x0101 mouse +/* Marvell Technology Group, Ltd. products */ +product MARVELL SHEEVAPLUG 0x9e8f SheevaPlug serial interface + /* MCT Corp. */ product MCT HUB0100 0x0100 Hub product MCT DU_H3SP_USB232 0x0200 D-Link DU-H3SP USB BAY Hub @@ -1715,7 +1973,10 @@ product MELCO PCOPRS1 0x00b3 PC-OP-RS1 RemoteStation product MELCO SG54HP 0x00d8 WLI-U2-SG54HP product MELCO G54HP 0x00d9 WLI-U2-G54HP product MELCO KG54L 0x00da WLI-U2-KG54L +product MELCO WLIUCG300N 0x00e8 WLI-UC-G300N product MELCO SG54HG 0x00f4 WLI-U2-SG54HG +product MELCO WLIUCAG300N 0x012e WLI-UC-AG300N +product MELCO WLIUCGN 0x015d WLI-UC-GN /* Merlin products */ product MERLIN V620 0x1110 Merlin V620 @@ -1733,15 +1994,25 @@ product MGE UPS2 0xffff MGE UPS SYSTEMS PROTECTIONCENTER 2 /* Micro Star International products */ product MSI BT_DONGLE 0x1967 Bluetooth USB dongle +product MSI RT3070_1 0x3820 RT3070 +product MSI RT3070_2 0x3821 RT3070 +product MSI RT3070_3 0x3870 RT3070 product MSI UB11B 0x6823 UB11B product MSI RT2570 0x6861 RT2570 product MSI RT2570_2 0x6865 RT2570 product MSI RT2570_3 0x6869 RT2570 product MSI RT2573_1 0x6874 RT2573 product MSI RT2573_2 0x6877 RT2573 +product MSI RT3070_4 0x6899 RT3070 +product MSI RT3070_5 0x821a RT3070 +product MSI RT3070_6 0x870a RT3070 +product MSI RT3070_7 0x899a RT3070 product MSI RT2573_3 0xa861 RT2573 product MSI RT2573_4 0xa874 RT2573 +/* Microdia products */ +product MICRODIA TWINKLECAM 0x600d TwinkleCam USB camera + /* Microsoft products */ product MICROSOFT SIDEPREC 0x0008 SideWinder Precision Pro product MICROSOFT INTELLIMOUSE 0x0009 IntelliMouse @@ -1813,6 +2084,7 @@ product MOSCHIP MCS7830 0x7830 MCS7830 Ethernet /* Motorola products */ product MOTOROLA MC141555 0x1555 MC141555 hub controller product MOTOROLA SB4100 0x4100 SB4100 USB Cable Modem +product MOTOROLA2 T720C 0x2822 T720c product MOTOROLA2 A41XV32X 0x2a22 A41x/V32x Mobile Phones product MOTOROLA2 E398 0x4810 E398 Mobile Phone product MOTOROLA2 USBLAN 0x600c USBLAN @@ -1869,6 +2141,7 @@ product NETGEAR EA101X 0x1002 Ethernet product NETGEAR FA101 0x1020 Ethernet 10/100, USB1.1 product NETGEAR FA120 0x1040 USB 2.0 Ethernet product NETGEAR WG111V2_2 0x4240 PrismGT USB 2.0 WLAN +product NETGEAR WG111V3 0x4260 WG111v3 product NETGEAR WG111U 0x4300 WG111U product NETGEAR WG111U_NF 0x4301 WG111U (no firmware) product NETGEAR WG111V2 0x6a00 WG111V2 @@ -1878,6 +2151,7 @@ product NETGEAR3 WG111T 0x4250 WG111T product NETGEAR3 WG111T_NF 0x4251 WG111T (no firmware) product NETGEAR3 WPN111 0x5f00 WPN111 product NETGEAR3 WPN111_NF 0x5f01 WPN111 (no firmware) +product NETGEAR3 WPN111_2 0x5f02 WPN111 /* Nikon products */ product NIKON E990 0x0102 Digital Camera E990 @@ -1888,6 +2162,9 @@ product NIKON D300 0x041a Digital Camera D300 product NOVATECH NV902 0x9020 NovaTech NV-902W product NOVATECH RT2573 0x9021 RT2573 +/* Nokia products */ +product NOKIA N958GB 0x0070 Nokia N95 8GBc + /* Novatel Wireless products */ product NOVATEL V640 0x1100 Merlin V620 product NOVATEL CDMA_MODEM 0x1110 Novatel Wireless Merlin CDMA @@ -1899,13 +2176,21 @@ product NOVATEL U740_2 0x1410 Merlin U740 product NOVATEL U870 0x1420 Merlin U870 product NOVATEL XU870 0x1430 Merlin XU870 product NOVATEL X950D 0x1450 Merlin X950D +product NOVATEL ES620 0x2100 Expedite ES620 +product NOVATEL E725 0x2120 Expedite E725 +product NOVATEL ES620_2 0x2130 Expedite ES620 product NOVATEL ES620 0x2100 ES620 CDMA product NOVATEL U720 0x2110 Merlin U720 +product NOVATEL EU730 0x2400 Expedite EU730 +product NOVATEL EU740 0x2410 Expedite EU740 +product NOVATEL EU870D 0x2420 Expedite EU870D product NOVATEL U727 0x4100 Merlin U727 CDMA product NOVATEL MC950D 0x4400 Novatel MC950D HSUPA product NOVATEL ZEROCD 0x5010 Novatel ZeroCD product NOVATEL ZEROCD2 0x5030 Novatel ZeroCD +product NOVATEL U727_2 0x5100 Merlin U727 CDMA product NOVATEL U760 0x6000 Novatel U760 +product NOVATEL MC760 0x6002 Novatel MC760 product NOVATEL2 FLEXPACKGPS 0x0100 NovAtel FlexPack GPS receiver /* Merlin products */ @@ -1940,6 +2225,39 @@ product OPTION GTICON322 0xd033 GlobeTrotter Icon322 storage product OPTION GTMAX36 0x6701 GlobeTrotter Max 3.6 Modem product OPTION GTHSDPA 0x6971 GlobeTrotter HSDPA product OPTION GTMAXHSUPA 0x7001 GlobeTrotter HSUPA +product OPTION GTMAXHSUPAE 0x6901 GlobeTrotter HSUPA PCIe +product OPTION GTMAX380HSUPAE 0x7211 GlobeTrotter 380HSUPA PCIe +product OPTION GT3G_1 0x6050 3G modem +product OPTION GT3G_2 0x6100 3G modem +product OPTION GT3G_3 0x6150 3G modem +product OPTION GT3G_4 0x6200 3G modem +product OPTION GT3G_5 0x6250 3G modem +product OPTION GT3G_6 0x6350 3G modem +product OPTION E6500 0x6500 3G modem +product OPTION E6501 0x6501 3G modem +product OPTION E6601 0x6601 3G modem +product OPTION E6721 0x6721 3G modem +product OPTION E6741 0x6741 3G modem +product OPTION E6761 0x6761 3G modem +product OPTION E6800 0x6800 3G modem +product OPTION E7021 0x7021 3G modem +product OPTION E7041 0x7041 3G modem +product OPTION E7061 0x7061 3G modem +product OPTION E7100 0x7100 3G modem +product OPTION GTM380 0x7201 3G modem +product OPTION GE40X 0x7601 Globetrotter HSUPA +product OPTION GSICON72 0x6911 GlobeSurfer iCON +product OPTION GSICONHSUPA 0x7251 Globetrotter HSUPA +product OPTION ICON401 0x7401 GlobeSurfer iCON 401 +product OPTION GTHSUPA 0x7011 Globetrotter HSUPA +product OPTION GMT382 0x7501 Globetrotter HSUPA +product OPTION GE40X_1 0x7301 Globetrotter HSUPA +product OPTION GE40X_2 0x7361 Globetrotter HSUPA +product OPTION GE40X_3 0x7381 Globetrotter HSUPA +product OPTION ICONEDGE 0xc031 GlobeSurfer iCON EDGE +product OPTION MODHSXPA 0xd013 Globetrotter HSUPA +product OPTION ICON321 0xd031 Globetrotter HSUPA +product OPTION ICON505 0xd055 Globetrotter iCON 505 /* OQO */ product OQO WIFI01 0x0002 model 01 WiFi interface @@ -1968,6 +2286,14 @@ product PANASONIC KXLCB20AN 0x0d0a CD-R Drive KXL-CB20AN product PANASONIC KXLCB35AN 0x0d0e DVD-ROM & CD-R/RW product PANASONIC SDCAAE 0x1b00 MultiMediaCard +/* PARA Industrial products */ +product PARA RT3070 0x8888 RT3070 + +/* Pegatron products */ +product PEGATRON RT2870 0x0002 RT2870 +product PEGATRON RT3070 0x000c RT3070 +product PEGATRON RT3070_2 0x000e RT3070 + /* Peracom products */ product PERACOM SERIAL1 0x0001 Serial product PERACOM ENET 0x0002 Ethernet @@ -1985,9 +2311,13 @@ product PHILIPS SPE3030CC 0x083a USB 2.0 External Disk product PHILIPS SNU5600 0x1236 SNU5600 product PHILIPS UM10016 0x1552 ISP 1581 Hi-Speed USB MPEG2 Encoder Reference Kit product PHILIPS DIVAUSB 0x1801 DIVA USB mp3 player +product PHILIPS RT2870 0x200f RT2870 /* Philips Semiconductor products */ -product PHILIPSSEMI HUB1122 0x1122 hub +product PHILIPSSEMI HUB1122 0x1122 HUB + +/* Megatec */ +product MEGATEC UPS 0x5161 Protocol based UPS /* P.I. Engineering products */ product PIENGINEERING PS2USB 0x020b PS2 to Mac USB Adapter @@ -1997,11 +2327,15 @@ product PLANEX GW_US11H 0x14ea GW-US11H WLAN product PLANEX2 GW_US11S 0x3220 GW-US11S WLAN product PLANEX2 GW_US54GXS 0x5303 GW-US54GXS WLAN product PLANEX2 GWUS54HP 0xab01 GW-US54HP +product PLANEX2 GWUS300MINIS 0xab24 GW-US300MiniS +product PLANEX2 RT3070 0xab25 RT3070 product PLANEX2 GWUS54MINI2 0xab50 GW-US54Mini2 product PLANEX2 GWUS54SG 0xc002 GW-US54SG product PLANEX2 GWUS54GZL 0xc007 GW-US54GZL product PLANEX2 GWUS54GD 0xed01 GW-US54GD product PLANEX2 GWUSMM 0xed02 GW-USMM +product PLANEX2 RT2870 0xed06 RT2870 +product PLANEX2 GWUSMICRON 0xed14 GW-USMicroN product PLANEX3 GWUS54GZ 0xab10 GW-US54GZ product PLANEX3 GU1000T 0xab11 GU-1000T product PLANEX3 GWUS54MINI 0xab13 GW-US54Mini @@ -2059,14 +2393,101 @@ product PUTERCOM UPA100 0x047e USB-1284 BRIDGE product QCOM RT2573 0x6196 RT2573 product QCOM RT2573_2 0x6229 RT2573 product QCOM RT2573_3 0x6238 RT2573 +product QCOM RT2870 0x6259 RT2870 + +/* Qisda products */ +product QISDA H21_1 0x4512 3G modem +product QISDA H21_2 0x4523 3G modem +product QISDA H20_1 0x4515 3G modem +product QISDA H20_2 0x4519 3G modem /* Qualcomm products */ product QUALCOMM CDMA_MSM 0x6000 CDMA Technologies MSM phone product QUALCOMM2 RWT_FCT 0x3100 RWT FCT-CDMA 2000 1xRTT modem product QUALCOMM2 CDMA_MSM 0x3196 CDMA Technologies MSM modem +product QUALCOMM2 AC8700 0x6000 AC8700 +product QUALCOMM2 MF330 0x6613 MF330 product QUALCOMMINC CDMA_MSM 0x0001 CDMA Technologies MSM modem product QUALCOMMINC ZTE_STOR 0x2000 USB ZTE Storage +product QUALCOMMINC AC8710 0xfff1 3G modem +product QUALCOMMINC AC2726 0xfff5 3G modem product QUALCOMMINC AC8700 0xfffe CDMA 1xEVDO USB modem +product QUALCOMMINC E0002 0x0002 3G modem +product QUALCOMMINC E0003 0x0003 3G modem +product QUALCOMMINC E0004 0x0004 3G modem +product QUALCOMMINC E0005 0x0005 3G modem +product QUALCOMMINC E0006 0x0006 3G modem +product QUALCOMMINC E0007 0x0007 3G modem +product QUALCOMMINC E0008 0x0008 3G modem +product QUALCOMMINC E0009 0x0009 3G modem +product QUALCOMMINC E000A 0x000a 3G modem +product QUALCOMMINC E000B 0x000b 3G modem +product QUALCOMMINC E000C 0x000c 3G modem +product QUALCOMMINC E000D 0x000d 3G modem +product QUALCOMMINC E000E 0x000e 3G modem +product QUALCOMMINC E000F 0x000f 3G modem +product QUALCOMMINC E0010 0x0010 3G modem +product QUALCOMMINC E0011 0x0011 3G modem +product QUALCOMMINC E0012 0x0012 3G modem +product QUALCOMMINC E0013 0x0013 3G modem +product QUALCOMMINC E0014 0x0014 3G modem +product QUALCOMMINC MF628 0x0015 3G modem +product QUALCOMMINC MF633R 0x0016 ZTE WCDMA modem +product QUALCOMMINC E0017 0x0017 3G modem +product QUALCOMMINC E0018 0x0018 3G modem +product QUALCOMMINC E0019 0x0019 3G modem +product QUALCOMMINC E0020 0x0020 3G modem +product QUALCOMMINC E0021 0x0021 3G modem +product QUALCOMMINC E0022 0x0022 3G modem +product QUALCOMMINC E0023 0x0023 3G modem +product QUALCOMMINC E0024 0x0024 3G modem +product QUALCOMMINC E0025 0x0025 3G modem +product QUALCOMMINC E0026 0x0026 3G modem +product QUALCOMMINC E0027 0x0027 3G modem +product QUALCOMMINC E0028 0x0028 3G modem +product QUALCOMMINC E0029 0x0029 3G modem +product QUALCOMMINC E0030 0x0030 3G modem +product QUALCOMMINC MF626 0x0031 3G modem +product QUALCOMMINC E0032 0x0032 3G modem +product QUALCOMMINC E0033 0x0033 3G modem +product QUALCOMMINC E0037 0x0037 3G modem +product QUALCOMMINC E0039 0x0039 3G modem +product QUALCOMMINC E0042 0x0042 3G modem +product QUALCOMMINC E0043 0x0043 3G modem +product QUALCOMMINC E0048 0x0048 3G modem +product QUALCOMMINC E0049 0x0049 3G modem +product QUALCOMMINC E0051 0x0051 3G modem +product QUALCOMMINC E0052 0x0052 3G modem +product QUALCOMMINC ZTE_STOR2 0x0053 USB ZTE Storage +product QUALCOMMINC E0054 0x0054 3G modem +product QUALCOMMINC E0055 0x0055 3G modem +product QUALCOMMINC E0057 0x0057 3G modem +product QUALCOMMINC E0058 0x0058 3G modem +product QUALCOMMINC E0059 0x0059 3G modem +product QUALCOMMINC E0060 0x0060 3G modem +product QUALCOMMINC E0061 0x0061 3G modem +product QUALCOMMINC E0062 0x0062 3G modem +product QUALCOMMINC E0063 0x0063 3G modem +product QUALCOMMINC E0064 0x0064 3G modem +product QUALCOMMINC E0066 0x0066 3G modem +product QUALCOMMINC E0069 0x0069 3G modem +product QUALCOMMINC E0070 0x0070 3G modem +product QUALCOMMINC E0073 0x0073 3G modem +product QUALCOMMINC E0076 0x0076 3G modem +product QUALCOMMINC E0078 0x0078 3G modem +product QUALCOMMINC E0082 0x0082 3G modem +product QUALCOMMINC E0086 0x0086 3G modem +product QUALCOMMINC E2002 0x2002 3G modem +product QUALCOMMINC E2003 0x2003 3G modem + +/* Quanta products */ +/* Quanta products */ +product QUANTA RT3070 0x0304 RT3070 +product QUANTA Q101 0xea02 HSDPA modem +product QUANTA Q111 0xea03 HSDPA modem +product QUANTA GLX 0xea04 HSDPA modem +product QUANTA GKE 0xea05 HSDPA modem +product QUANTA GLE 0xea06 HSDPA modem /* Qtronix products */ product QTRONIX 980N 0x2011 Scorpion-980N keyboard @@ -2082,9 +2503,16 @@ product RAINBOW IKEY2000 0x1200 i-Key 2000 /* Ralink Technology products */ product RALINK RT2570 0x1706 RT2500USB Wireless Adapter +product RALINK RT2070 0x2070 RT2070 product RALINK RT2570_2 0x2570 RT2500USB Wireless Adapter product RALINK RT2573 0x2573 RT2501USB Wireless Adapter product RALINK RT2671 0x2671 RT2601USB Wireless Adapter +product RALINK RT2770 0x2770 RT2770 +product RALINK RT2870 0x2870 RT2870 +product RALINK RT3070 0x3070 RT3070 +product RALINK RT3071 0x3071 RT3071 +product RALINK RT3072 0x3072 RT3072 +product RALINK RT3572 0x3572 RT3572 product RALINK RT2570_3 0x9020 RT2500USB Wireless Adapter product RALINK RT2573_2 0x9021 RT2501USB Wireless Adapter @@ -2092,6 +2520,9 @@ product RALINK RT2573_2 0x9021 RT2501USB Wireless Adapter /* Green House and CompUSA OEM this part */ product REALTEK USBKR100 0x8150 USBKR100 USB Ethernet product REALTEK RTL8187 0x8187 RTL8187 Wireless Adapter +product REALTEK RTL8187B_0 0x8189 RTL8187B Wireless Adapter +product REALTEK RTL8187B_1 0x8197 RTL8187B Wireless Adapter +product REALTEK RTL8187B_2 0x8198 RTL8187B Wireless Adapter /* Ricoh products */ product RICOH VGPVCC2 0x1830 VGP-VCC2 Camera @@ -2111,6 +2542,7 @@ product ROCKFIRE GAMEPAD 0x2033 gamepad 203USB /* RATOC Systems products */ product RATOC REXUSB60 0xb000 REX-USB60 +product RATOC REXUSB60F 0xb020 REX-USB60F /* Sagem products */ product SAGEM USBSERIAL 0x0027 USB-Serial Controller @@ -2121,6 +2553,7 @@ product SAGEM XG76NA 0x0062 XG-76NA product SAMSUNG ML6060 0x3008 ML-6060 laser printer product SAMSUNG YP_U2 0x5050 YP-U2 MP3 Player product SAMSUNG I500 0x6601 I500 Palm USB Phone +product SAMSUNG2 RT2870_1 0x2018 RT2870 /* Samsung Techwin products */ product SAMSUNG_TECHWIN DIGIMAX_410 0x000a Digimax 410 @@ -2144,7 +2577,18 @@ product SCANLOGIC SL11R 0x0002 SL11R IDE Adapter product SCANLOGIC 336CX 0x0300 Phantom 336CX - C3 scanner /* Senao products */ +product SENAO RT2870_3 0x0605 RT2870 +product SENAO RT2870_4 0x0615 RT2870 product SENAO NUB8301 0x2000 NUB-8301 +product SENAO RT2870_1 0x9701 RT2870 +product SENAO RT2870_2 0x9702 RT2870 +product SENAO RT3070 0x9703 RT3070 +product SENAO RT3071 0x9705 RT3071 +product SENAO RT3072_1 0x9706 RT3072 +product SENAO RT3072_2 0x9707 RT3072 +product SENAO RT3072_3 0x9708 RT3072 +product SENAO RT3072_4 0x9709 RT3072 +product SENAO RT3072_5 0x9801 RT3072 /* ShanTou products */ product SHANTOU ST268 0x0268 ST268 @@ -2160,6 +2604,7 @@ product SHARP SL5600 0x8006 Zaurus SL-5600 PDA product SHARP SLC700 0x8007 Zaurus SL-C700 PDA product SHARP SLC750 0x9031 Zaurus SL-C750 PDA product SHARP WZERO3ES 0x9123 W-ZERO3 ES Smartphone +product SHARP WZERO3ADES 0x91ac Advanced W-ZERO3 ES Smartphone product SHARP WILLCOM03 0x9242 WILLCOM03 /* Shuttle Technology products */ @@ -2187,33 +2632,64 @@ product SIEMENS3 X65 0x0003 X65 product SIEMENS3 X75 0x0004 X75 /* Sierra Wireless products */ +product SIERRA EM5625 0x0017 EM5625 +product SIERRA MC5720_2 0x0018 MC5720 +product SIERRA MC5725 0x0020 MC5725 product SIERRA AIRCARD580 0x0112 Sierra Wireless AirCard 580 product SIERRA AIRCARD595 0x0019 Sierra Wireless AirCard 595 product SIERRA AC595U 0x0120 Sierra Wireless AirCard 595U product SIERRA AC597E 0x0021 Sierra Wireless AirCard 597E +product SIERRA EM5725 0x0022 EM5725 product SIERRA C597 0x0023 Sierra Wireless Compass 597 +product SIERRA MC5727 0x0024 MC5727 +product SIERRA T598 0x0025 T598 +product SIERRA T11 0x0026 T11 +product SIERRA AC402 0x0027 AC402 +product SIERRA MC5728 0x0028 MC5728 +product SIERRA E0029 0x0029 E0029 +product SIERRA AIRCARD580 0x0112 Sierra Wireless AirCard 580 +product SIERRA AC595U 0x0120 Sierra Wireless AirCard 595U +product SIERRA MC5720 0x0218 MC5720 Wireless Modem +product SIERRA MINI5725 0x0220 Sierra Wireless miniPCI 5275 +product SIERRA MC5727_2 0x0224 MC5727 +product SIERRA MC8755_2 0x6802 MC8755 +product SIERRA MC8765 0x6803 MC8765 +product SIERRA MC8755 0x6804 MC8755 +product SIERRA MC8765_2 0x6805 MC8765 +product SIERRA MC8755_4 0x6808 MC8755 +product SIERRA MC8765_3 0x6809 MC8765 +product SIERRA AC875U 0x6812 AC875U HSDPA USB Modem +product SIERRA MC8755_3 0x6813 MC8755 HSDPA +product SIERRA MC8775_2 0x6815 MC8775 +product SIERRA MC8775 0x6816 MC8775 product SIERRA AC875 0x6820 Sierra Wireless AirCard 875 +product SIERRA AC875U_2 0x6821 AC875U +product SIERRA AC875E 0x6822 AC875E +product SIERRA MC8780 0x6832 MC8780 +product SIERRA MC8781 0x6833 MC8781 +product SIERRA MC8780_2 0x6834 MC8780 +product SIERRA MC8781_2 0x6835 MC8781 +product SIERRA MC8780_3 0x6838 MC8780 +product SIERRA MC8781_3 0x6839 MC8781 +product SIERRA MC8785 0x683A MC8785 +product SIERRA MC8785_2 0x683B MC8785 +product SIERRA MC8790 0x683C MC8790 +product SIERRA MC8791 0x683D MC8791 +product SIERRA MC8792 0x683E MC8792 product SIERRA AC880 0x6850 Sierra Wireless AirCard 880 product SIERRA AC881 0x6851 Sierra Wireless AirCard 881 product SIERRA AC880E 0x6852 Sierra Wireless AirCard 880E product SIERRA AC881E 0x6853 Sierra Wireless AirCard 881E product SIERRA AC880U 0x6855 Sierra Wireless AirCard 880U product SIERRA AC881U 0x6856 Sierra Wireless AirCard 881U +product SIERRA AC885E 0x6859 AC885E +product SIERRA AC885E_2 0x685A AC885E product SIERRA AC885U 0x6880 Sierra Wireless AirCard 885U -product SIERRA EM5625 0x0017 EM5625 -product SIERRA MC5720 0x0218 MC5720 Wireless Modem -product SIERRA MC5720_2 0x0018 MC5720 -product SIERRA MC5725 0x0020 MC5725 -product SIERRA MINI5725 0x0220 Sierra Wireless miniPCI 5275 -product SIERRA MC8755_2 0x6802 MC8755 -product SIERRA MC8765 0x6803 MC8765 -product SIERRA MC8755 0x6804 MC8755 -product SIERRA AC875U 0x6812 AC875U HSDPA USB Modem -product SIERRA MC8755_3 0x6813 MC8755 HSDPA -product SIERRA MC8775_2 0x6815 MC8775 +product SIERRA C888 0x6890 C888 +product SIERRA C22 0x6891 C22 +product SIERRA E6892 0x6892 E6892 +product SIERRA E6893 0x6893 E6893 product SIERRA AIRCARD875 0x6820 Aircard 875 HSDPA -product SIERRA MC8780 0x6832 MC8780 -product SIERRA MC8781 0x6833 MC8781 product SIERRA TRUINSTALL 0x0fff Aircard Tru Installer /* Sigmatel products */ @@ -2261,6 +2737,24 @@ product SITECOM SERIAL 0x2068 USB to serial cable (v2) product SITECOM2 WL022 0x182d WL-022 /* Sitecom Europe products */ +product SITECOMEU RT2870_1 0x0017 RT2870 +product SITECOMEU WL168V1 0x000d WL-168 v1 +product SITECOMEU WL168V4 0x0028 WL-168 v4 +product SITECOMEU RT2870_2 0x002b RT2870 +product SITECOMEU RT2870_3 0x002c RT2870 +product SITECOMEU RT2870_4 0x002d RT2870 +product SITECOMEU RT2770 0x0039 RT2770 +product SITECOMEU RT3070_2 0x003b RT3070 +product SITECOMEU RT3070_3 0x003c RT3070 +product SITECOMEU RT3070_4 0x003d RT3070 +product SITECOMEU RT3070 0x003e RT3070 +product SITECOMEU WL608 0x003f WL-608 +product SITECOMEU RT3072_1 0x0041 RT3072 +product SITECOMEU RT3072_2 0x0042 RT3072 +product SITECOMEU RT3072_3 0x0047 RT3072 +product SITECOMEU RT3072_4 0x0048 RT3072 +product SITECOMEU RT3072_5 0x004a RT3072 +product SITECOMEU RT3072_6 0x004d RT3072 product SITECOMEU LN028 0x061c LN-028 product SITECOMEU WL113 0x9071 WL-113 product SITECOMEU ZD1211B 0x9075 ZD1211B @@ -2318,7 +2812,9 @@ product SOURCENEXT KEIKAI8 0x039f KeikaiDenwa 8 product SOURCENEXT KEIKAI8_CHG 0x012e KeikaiDenwa 8 with charger /* SparkLAN products */ -product SPARKLAN RT2573 0x0004 RT2573 +product SPARKLAN RT2573 0x0004 RT2573 +product SPARKLAN RT2870_1 0x0006 RT2870 +product SPARKLAN RT3070 0x0010 RT3070 /* Sphairon Access Systems GmbH products */ product SPHAIRON UB801R 0x0110 UB801R @@ -2326,6 +2822,22 @@ product SPHAIRON UB801R 0x0110 UB801R /* Stelera Wireless products */ product STELERA ZEROCD 0x1000 Zerocd Installer product STELERA C105 0x1002 Stelera/Bandrish C105 USB +product STELERA E1003 0x1003 3G modem +product STELERA E1004 0x1004 3G modem +product STELERA E1005 0x1005 3G modem +product STELERA E1006 0x1006 3G modem +product STELERA E1007 0x1007 3G modem +product STELERA E1008 0x1008 3G modem +product STELERA E1009 0x1009 3G modem +product STELERA E100A 0x100a 3G modem +product STELERA E100B 0x100b 3G modem +product STELERA E100C 0x100c 3G modem +product STELERA E100D 0x100d 3G modem +product STELERA E100E 0x100e 3G modem +product STELERA E100F 0x100f 3G modem +product STELERA E1010 0x1010 3G modem +product STELERA E1011 0x1011 3G modem +product STELERA E1012 0x1012 3G modem /* MpMan products */ product MPMAN MPF400_1 0x36d0 MPF400 Music Player 1Go @@ -2366,11 +2878,14 @@ product DIAMOND2 RIO600USB 0x5001 Rio 600 USB product DIAMOND2 RIO800USB 0x5002 Rio 800 USB /* Surecom Technology products */ +product SURECOM EP9001G2A 0x11f2 EP-9001-G rev 2A product SURECOM RT2570 0x11f3 RT2570 product SURECOM RT2573 0x31f3 RT2573 /* Sweex products */ product SWEEX ZD1211 0x1809 ZD1211 +product SWEEX2 LW303 0x0302 LW303 +product SWEEX2 LW313 0x0313 LW313 /* System TALKS, Inc. */ product SYSTEMTALKS SGCX2UL 0x1920 SGC-X2UL @@ -2381,6 +2896,9 @@ product TAPWAVE ZODIAC 0x0100 Zodiac /* Taugagreining products */ product TAUGA CAMERAMATE 0x0005 CameraMate (DPCM_USB) +/* TCTMobile products */ +product TCTMOBILE X060S 0x0000 X060S 3G modem + /* TDK products */ product TDK UPA9664 0x0115 USB-PDC Adapter UPA9664 product TDK UCA1464 0x0116 USB-cdmaOne Adapter UCA1464 @@ -2399,6 +2917,10 @@ product TEKRAM ZD1211_2 0x6630 ZD1211 /* Telex Communications products */ product TELEX MIC1 0x0001 Enhanced USB Microphone +/* Telit products */ +product TELIT UC864E 0x1003 UC864E 3G modem +product TELIT UC864G 0x1004 UC864G 3G modem + /* Ten X Technology, Inc. */ product TENX UAUDIO0 0xf211 USB audio headset @@ -2409,11 +2931,16 @@ product TI TUSB2046 0x2046 TUSB2046 hub /* Thrustmaster products */ product THRUST FUSION_PAD 0xa0a3 Fusion Digital Gamepad +/* TLayTech products */ +product TLAYTECH TEU800 0x1682 TEU800 3G modem + /* Topre Corporation products */ product TOPRE HHKB 0x0100 HHKB Professional /* Toshiba Corporation products */ product TOSHIBA POCKETPC_E740 0x0706 PocketPC e740 +product TOSHIBA G450 0x0d45 G450 modem +product TOSHIBA HSDPA 0x1302 G450 modem /* Trek Technology products */ product TREK THUMBDRIVE 0x1111 ThumbDrive @@ -2452,10 +2979,10 @@ product UMEDIA TEW444UBEU_NF 0x3007 TEW-444UB EU (no firmware) product UMEDIA TEW429UB_A 0x300a TEW-429UB_A product UMEDIA TEW429UB 0x300b TEW-429UB product UMEDIA TEW429UBC1 0x300d TEW-429UB C1 +product UMEDIA RT2870_1 0x300e RT2870 product UMEDIA ALL0298V2 0x3204 ALL0298 v2 product UMEDIA AR5523_2 0x3205 AR5523 product UMEDIA AR5523_2_NF 0x3206 AR5523 (no firmware) -product UMEDIA AR5523_3 0x3207 AR5523 /* Universal Access products */ product UNIACCESS PANACHE 0x0101 Panache Surf USB ISDN Adapter @@ -2497,13 +3024,17 @@ product WACOM GRAPHIRE 0x0010 Graphire product WACOM GRAPHIRE3_4X5 0x0013 Graphire 3 4x5 product WACOM INTUOSA5 0x0021 Intuos A5 product WACOM GD0912U 0x0022 Intuos 9x12 Graphics Tablet -/* WCH products*/ + +/* WCH products */ product WCH CH341SER 0x5523 CH341/CH340 USB-Serial Bridge +product WCH2 CH341SER 0x7523 CH341/CH340 USB-Serial Bridge + /* Western Digital products */ product WESTERN COMBO 0x0200 Firewire USB Combo product WESTERN EXTHDD 0x0400 External HDD product WESTERN HUB 0x0500 USB HUB product WESTERN MYBOOK 0x0901 MyBook External HDD +product WESTERN MYPASSWORD 0x0704 MyPassword External HDD /* Windbond Electronics */ product WINBOND UH104 0x5518 4-port USB Hub @@ -2557,9 +3088,16 @@ product ZCOM AR5523 0x0012 AR5523 product ZCOM AR5523_NF 0x0013 AR5523 driver (no firmware) product ZCOM XM142 0x0015 XM-142 product ZCOM ZD1211B 0x001a ZD1211B +product ZCOM RT2870_1 0x0022 RT2870 +product ZCOM RT2870_2 0x0025 RT2870 /* Zinwell products */ product ZINWELL RT2570 0x0260 RT2570 +product ZINWELL RT2870_1 0x0280 RT2870 +product ZINWELL RT2870_2 0x0282 RT2870 +product ZINWELL RT3072_1 0x0283 RT3072 +product ZINWELL RT3072_2 0x0284 RT3072 +product ZINWELL RT3070 0x5257 RT3070 /* Zoom Telephonics, Inc. products */ product ZOOM 2986L 0x9700 2986L Fax modem @@ -2580,3 +3118,4 @@ product ZYXEL AG225H 0x3409 AG-225H product ZYXEL M202 0x340a M-202 product ZYXEL G220V2 0x340f G-220 v2 product ZYXEL G202 0x3410 G-202 +product ZYXEL RT2870_1 0x3416 RT2870 diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h index 0042c97ccffb..9adf39adc776 100644 --- a/sys/dev/usb/usbdi.h +++ b/sys/dev/usb/usbdi.h @@ -29,6 +29,7 @@ struct usb_fifo; struct usb_xfer; struct usb_device; +struct usb_attach_arg; struct usb_interface; struct usb_endpoint; struct usb_page_cache; @@ -98,6 +99,13 @@ typedef int (usb_fifo_ioctl_t)(struct usb_fifo *fifo, u_long cmd, void *addr, in typedef void (usb_fifo_cmd_t)(struct usb_fifo *fifo); typedef void (usb_fifo_filter_t)(struct usb_fifo *fifo, struct usb_mbuf *m); + +/* USB events */ +#include +typedef void (*usb_dev_configured_t)(void *, struct usb_device *, + struct usb_attach_arg *); +EVENTHANDLER_DECLARE(usb_dev_configured, usb_dev_configured_t); + /* * The following macros are used used to convert milliseconds into * HZ. We use 1024 instead of 1000 milliseconds per second to save a @@ -130,13 +138,22 @@ struct usb_endpoint { struct usb_pipe_methods *methods; /* set by HC driver */ uint16_t isoc_next; - uint16_t refcount; uint8_t toggle_next:1; /* next data toggle value */ uint8_t is_stalled:1; /* set if endpoint is stalled */ uint8_t is_synced:1; /* set if we a synchronised */ uint8_t unused:5; uint8_t iface_index; /* not used by "default endpoint" */ + + uint8_t refcount_alloc; /* allocation refcount */ + uint8_t refcount_bw; /* bandwidth refcount */ +#define USB_EP_REF_MAX 0x3f + + /* High-Speed resource allocation (valid if "refcount_bw" > 0) */ + + uint8_t usb_smask; /* USB start mask */ + uint8_t usb_cmask; /* USB complete mask */ + uint8_t usb_uframe; /* USB microframe */ }; /* @@ -329,6 +346,10 @@ struct usb_attach_arg { enum usb_hc_mode usb_mode; /* host or device mode */ uint8_t port; uint8_t use_generic; /* hint for generic drivers */ + uint8_t dev_state; +#define UAA_DEV_READY 0 +#define UAA_DEV_DISABLED 1 +#define UAA_DEV_EJECTING 2 }; /* @@ -478,6 +499,7 @@ void usbd_xfer_set_frame_offset(struct usb_xfer *xfer, usb_frlength_t offset, usb_frlength_t usbd_xfer_max_len(struct usb_xfer *xfer); usb_frlength_t usbd_xfer_max_framelen(struct usb_xfer *xfer); usb_frcount_t usbd_xfer_max_frames(struct usb_xfer *xfer); +uint8_t usbd_xfer_get_fps_shift(struct usb_xfer *xfer); usb_frlength_t usbd_xfer_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex); void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, diff --git a/sys/dev/usb/wlan/if_rum.c b/sys/dev/usb/wlan/if_rum.c index 7abd10473f5e..0cd394d14446 100644 --- a/sys/dev/usb/wlan/if_rum.c +++ b/sys/dev/usb/wlan/if_rum.c @@ -86,54 +86,57 @@ SYSCTL_INT(_hw_usb_rum, OID_AUTO, debug, CTLFLAG_RW, &rum_debug, 0, #endif static const struct usb_device_id rum_devs[] = { - { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_HWU54DM) }, - { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_2) }, - { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_3) }, - { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_4) }, - { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_WUG2700) }, - { USB_VP(USB_VENDOR_AMIT, USB_PRODUCT_AMIT_CGWLUSB2GO) }, - { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2573_1) }, - { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2573_2) }, - { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D7050A) }, - { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D9050V3) }, - { USB_VP(USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_WUSB54GC) }, - { USB_VP(USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_WUSB54GR) }, - { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_C54RU2) }, - { USB_VP(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_CGWLUSB2GL) }, - { USB_VP(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_CGWLUSB2GPX) }, - { USB_VP(USB_VENDOR_DICKSMITH, USB_PRODUCT_DICKSMITH_CWD854F) }, - { USB_VP(USB_VENDOR_DICKSMITH, USB_PRODUCT_DICKSMITH_RT2573) }, - { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_DWLG122C1) }, - { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_WUA1340) }, - { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_DWA111) }, - { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_DWA110) }, - { USB_VP(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNWB01GS) }, - { USB_VP(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNWI05GS) }, - { USB_VP(USB_VENDOR_GIGASET, USB_PRODUCT_GIGASET_RT2573) }, - { USB_VP(USB_VENDOR_GOODWAY, USB_PRODUCT_GOODWAY_RT2573) }, - { USB_VP(USB_VENDOR_GUILLEMOT, USB_PRODUCT_GUILLEMOT_HWGUSB254LB) }, - { USB_VP(USB_VENDOR_GUILLEMOT, USB_PRODUCT_GUILLEMOT_HWGUSB254V2AP) }, - { USB_VP(USB_VENDOR_HUAWEI3COM, USB_PRODUCT_HUAWEI3COM_WUB320G) }, - { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_G54HP) }, - { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_SG54HP) }, - { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573_1) }, - { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573_2) }, - { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573_3) }, - { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573_4) }, - { USB_VP(USB_VENDOR_NOVATECH, USB_PRODUCT_NOVATECH_RT2573) }, - { USB_VP(USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUS54HP) }, - { USB_VP(USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUS54MINI2) }, - { USB_VP(USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUSMM) }, - { USB_VP(USB_VENDOR_QCOM, USB_PRODUCT_QCOM_RT2573) }, - { USB_VP(USB_VENDOR_QCOM, USB_PRODUCT_QCOM_RT2573_2) }, - { USB_VP(USB_VENDOR_QCOM, USB_PRODUCT_QCOM_RT2573_3) }, - { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2573) }, - { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2573_2) }, - { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2671) }, - { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_WL113R2) }, - { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_WL172) }, - { USB_VP(USB_VENDOR_SPARKLAN, USB_PRODUCT_SPARKLAN_RT2573) }, - { USB_VP(USB_VENDOR_SURECOM, USB_PRODUCT_SURECOM_RT2573) }, +#define RUM_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) } + RUM_DEV(ABOCOM, HWU54DM), + RUM_DEV(ABOCOM, RT2573_2), + RUM_DEV(ABOCOM, RT2573_3), + RUM_DEV(ABOCOM, RT2573_4), + RUM_DEV(ABOCOM, WUG2700), + RUM_DEV(AMIT, CGWLUSB2GO), + RUM_DEV(ASUS, RT2573_1), + RUM_DEV(ASUS, RT2573_2), + RUM_DEV(BELKIN, F5D7050A), + RUM_DEV(BELKIN, F5D9050V3), + RUM_DEV(CISCOLINKSYS, WUSB54GC), + RUM_DEV(CISCOLINKSYS, WUSB54GR), + RUM_DEV(CONCEPTRONIC2, C54RU2), + RUM_DEV(COREGA, CGWLUSB2GL), + RUM_DEV(COREGA, CGWLUSB2GPX), + RUM_DEV(DICKSMITH, CWD854F), + RUM_DEV(DICKSMITH, RT2573), + RUM_DEV(EDIMAX, EW7318USG), + RUM_DEV(DLINK2, DWLG122C1), + RUM_DEV(DLINK2, WUA1340), + RUM_DEV(DLINK2, DWA111), + RUM_DEV(DLINK2, DWA110), + RUM_DEV(GIGABYTE, GNWB01GS), + RUM_DEV(GIGABYTE, GNWI05GS), + RUM_DEV(GIGASET, RT2573), + RUM_DEV(GOODWAY, RT2573), + RUM_DEV(GUILLEMOT, HWGUSB254LB), + RUM_DEV(GUILLEMOT, HWGUSB254V2AP), + RUM_DEV(HUAWEI3COM, WUB320G), + RUM_DEV(MELCO, G54HP), + RUM_DEV(MELCO, SG54HP), + RUM_DEV(MSI, RT2573_1), + RUM_DEV(MSI, RT2573_2), + RUM_DEV(MSI, RT2573_3), + RUM_DEV(MSI, RT2573_4), + RUM_DEV(NOVATECH, RT2573), + RUM_DEV(PLANEX2, GWUS54HP), + RUM_DEV(PLANEX2, GWUS54MINI2), + RUM_DEV(PLANEX2, GWUSMM), + RUM_DEV(QCOM, RT2573), + RUM_DEV(QCOM, RT2573_2), + RUM_DEV(QCOM, RT2573_3), + RUM_DEV(RALINK, RT2573), + RUM_DEV(RALINK, RT2573_2), + RUM_DEV(RALINK, RT2671), + RUM_DEV(SITECOMEU, WL113R2), + RUM_DEV(SITECOMEU, WL172), + RUM_DEV(SPARKLAN, RT2573), + RUM_DEV(SURECOM, RT2573), +#undef RUM_DEV }; MODULE_DEPEND(rum, wlan, 1, 1, 1); @@ -826,6 +829,9 @@ tr_setup: usbd_transfer_submit(xfer); } + RUM_UNLOCK(sc); + rum_start(ifp); + RUM_LOCK(sc); break; default: /* Error */ @@ -839,13 +845,18 @@ tr_setup: usbd_xfer_set_priv(xfer, NULL); } - if (error == USB_ERR_STALLED) { - /* try to clear stall first */ + if (error != USB_ERR_CANCELLED) { + if (error == USB_ERR_TIMEOUT) + device_printf(sc->sc_dev, "device timeout\n"); + + /* + * Try to clear stall first, also if other + * errors occur, hence clearing stall + * introduces a 50 ms delay: + */ usbd_xfer_set_stall(xfer); goto tr_setup; } - if (error == USB_ERR_TIMEOUT) - device_printf(sc->sc_dev, "device timeout\n"); break; } } @@ -930,8 +941,8 @@ tr_setup: * the private mutex of a device! That is why we do the * "ieee80211_input" here, and not some lines up! */ + RUM_UNLOCK(sc); if (m) { - RUM_UNLOCK(sc); ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *)); if (ni != NULL) { @@ -941,8 +952,11 @@ tr_setup: } else (void) ieee80211_input_all(ic, m, rssi, RT2573_NOISE_FLOOR); - RUM_LOCK(sc); } + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 && + !IFQ_IS_EMPTY(&ifp->if_snd)) + rum_start(ifp); + RUM_LOCK(sc); return; default: /* Error */ diff --git a/sys/dev/usb/wlan/if_run.c b/sys/dev/usb/wlan/if_run.c new file mode 100644 index 000000000000..03fbdf1bed28 --- /dev/null +++ b/sys/dev/usb/wlan/if_run.c @@ -0,0 +1,4148 @@ +/* $FreeBSD$ */ + +/*- + * Copyright (c) 2008,2009 Damien Bergamini + * ported to FreeBSD by Akinori Furukoshi + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* release date Jan. 09, 2010 */ + +#include +__FBSDID("$FreeBSD$"); + +/*- + * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver. + * http://www.ralinktech.com/ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include "usbdevs.h" + +#define USB_DEBUG_VAR run_debug +#include + +#include "if_runreg.h" /* shared with ral(4) */ +#include "if_runvar.h" + +#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) + +#if USB_DEBUG +#define RUN_DEBUG +#endif + +#ifdef RUN_DEBUG +int run_debug = 0; +SYSCTL_NODE(_hw_usb, OID_AUTO, run, CTLFLAG_RW, 0, "USB run"); +SYSCTL_INT(_hw_usb_run, OID_AUTO, debug, CTLFLAG_RW, &run_debug, 0, + "run debug level"); +#endif + +#define IEEE80211_HAS_ADDR4(wh) \ + (((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS) + +static const struct usb_device_id run_devs[] = { + { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2770) }, + { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2870) }, + { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT3070) }, + { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT3071) }, + { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT3072) }, + { USB_VP(USB_VENDOR_ABOCOM2, USB_PRODUCT_ABOCOM2_RT2870_1) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT2770) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT2870_1) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT2870_2) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT2870_3) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT2870_4) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT2870_5) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT3070_1) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT3070_2) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT3070_3) }, + { USB_VP(USB_VENDOR_ACCTON, USB_PRODUCT_ACCTON_RT3070_4) }, + { USB_VP(USB_VENDOR_AIRTIES, USB_PRODUCT_AIRTIES_RT3070) }, + { USB_VP(USB_VENDOR_AMIGO, USB_PRODUCT_AMIGO_RT2870_1) }, + { USB_VP(USB_VENDOR_AMIGO, USB_PRODUCT_AMIGO_RT2870_2) }, + { USB_VP(USB_VENDOR_AMIT, USB_PRODUCT_AMIT_CGWLUSB2GNR) }, + { USB_VP(USB_VENDOR_AMIT, USB_PRODUCT_AMIT_RT2870_1) }, + { USB_VP(USB_VENDOR_AMIT2, USB_PRODUCT_AMIT2_RT2870) }, + { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2870_1) }, + { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2870_2) }, + { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2870_3) }, + { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2870_4) }, + { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2870_5) }, + { USB_VP(USB_VENDOR_ASUS2, USB_PRODUCT_ASUS2_USBN11) }, + { USB_VP(USB_VENDOR_AZUREWAVE, USB_PRODUCT_AZUREWAVE_RT2870_1) }, + { USB_VP(USB_VENDOR_AZUREWAVE, USB_PRODUCT_AZUREWAVE_RT2870_2) }, + { USB_VP(USB_VENDOR_AZUREWAVE, USB_PRODUCT_AZUREWAVE_RT3070_1) }, + { USB_VP(USB_VENDOR_AZUREWAVE, USB_PRODUCT_AZUREWAVE_RT3070_2) }, + { USB_VP(USB_VENDOR_AZUREWAVE, USB_PRODUCT_AZUREWAVE_RT3070_3) }, + { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D8053V3) }, + { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D8055) }, + { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F6D4050V1) }, + { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_RT2870_1) }, + { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_RT2870_2) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_1) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_2) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_3) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_4) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_5) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_6) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_7) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_RT2870_8) }, + { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_VIGORN61) }, + { USB_VP(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_CGWLUSB300GNM) }, + { USB_VP(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_RT2870_1) }, + { USB_VP(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_RT2870_2) }, + { USB_VP(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_RT2870_3) }, + { USB_VP(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_RT3070) }, + { USB_VP(USB_VENDOR_CYBERTAN, USB_PRODUCT_CYBERTAN_RT2870) }, + { USB_VP(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_RT2870) }, + { USB_VP(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_RT3072) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_DWA130) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_RT2870_1) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_RT2870_2) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_RT3070_1) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_RT3070_2) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_RT3070_3) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_RT3070_4) }, + { USB_VP(USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_RT3072) }, + { USB_VP(USB_VENDOR_EDIMAX, USB_PRODUCT_EDIMAX_EW7717) }, + { USB_VP(USB_VENDOR_EDIMAX, USB_PRODUCT_EDIMAX_EW7718) }, + { USB_VP(USB_VENDOR_EDIMAX, USB_PRODUCT_EDIMAX_RT2870_1) }, + { USB_VP(USB_VENDOR_ENCORE, USB_PRODUCT_ENCORE_RT3070_1) }, + { USB_VP(USB_VENDOR_ENCORE, USB_PRODUCT_ENCORE_RT3070_2) }, + { USB_VP(USB_VENDOR_ENCORE, USB_PRODUCT_ENCORE_RT3070_3) }, + { USB_VP(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNWB31N) }, + { USB_VP(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNWB32L) }, + { USB_VP(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_RT2870_1) }, + { USB_VP(USB_VENDOR_GIGASET, USB_PRODUCT_GIGASET_RT3070_1) }, + { USB_VP(USB_VENDOR_GIGASET, USB_PRODUCT_GIGASET_RT3070_2) }, + { USB_VP(USB_VENDOR_GUILLEMOT, USB_PRODUCT_GUILLEMOT_HWNU300) }, + { USB_VP(USB_VENDOR_HAWKING, USB_PRODUCT_HAWKING_HWUN2) }, + { USB_VP(USB_VENDOR_HAWKING, USB_PRODUCT_HAWKING_RT2870_1) }, + { USB_VP(USB_VENDOR_HAWKING, USB_PRODUCT_HAWKING_RT2870_2) }, + { USB_VP(USB_VENDOR_HAWKING, USB_PRODUCT_HAWKING_RT3070) }, + { USB_VP(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_RT3072_1) }, + { USB_VP(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_RT3072_2) }, + { USB_VP(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_RT3072_3) }, + { USB_VP(USB_VENDOR_IODATA, USB_PRODUCT_IODATA_RT3072_4) }, + { USB_VP(USB_VENDOR_LINKSYS4, USB_PRODUCT_LINKSYS4_WUSB100) }, + { USB_VP(USB_VENDOR_LINKSYS4, USB_PRODUCT_LINKSYS4_WUSB54GCV3) }, + { USB_VP(USB_VENDOR_LINKSYS4, USB_PRODUCT_LINKSYS4_WUSB600N) }, + { USB_VP(USB_VENDOR_LINKSYS4, USB_PRODUCT_LINKSYS4_WUSB600NV2) }, + { USB_VP(USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_RT2870_1) }, + { USB_VP(USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_RT2870_2) }, + { USB_VP(USB_VENDOR_LOGITEC, USB_PRODUCT_LOGITEC_RT2870_3) }, + { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_WLIUCAG300N) }, + { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_WLIUCG300N) }, + { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_WLIUCGN) }, + { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT3070_1) }, + { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT3070_2) }, + { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT3070_3) }, + { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT3070_4) }, + { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT3070_5) }, + { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT3070_6) }, + { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT3070_7) }, + { USB_VP(USB_VENDOR_PARA, USB_PRODUCT_PARA_RT3070) }, + { USB_VP(USB_VENDOR_PEGATRON, USB_PRODUCT_PEGATRON_RT2870) }, + { USB_VP(USB_VENDOR_PEGATRON, USB_PRODUCT_PEGATRON_RT3070) }, + { USB_VP(USB_VENDOR_PEGATRON, USB_PRODUCT_PEGATRON_RT3070_2) }, + { USB_VP(USB_VENDOR_PHILIPS, USB_PRODUCT_PHILIPS_RT2870) }, + { USB_VP(USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUS300MINIS) }, + { USB_VP(USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUSMICRON) }, + { USB_VP(USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_RT2870) }, + { USB_VP(USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_RT3070) }, + { USB_VP(USB_VENDOR_QCOM, USB_PRODUCT_QCOM_RT2870) }, + { USB_VP(USB_VENDOR_QUANTA, USB_PRODUCT_QUANTA_RT3070) }, + { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2070) }, + { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2770) }, + { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2870) }, + { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT3070) }, + { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT3071) }, + { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT3072) }, + { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT3572) }, + { USB_VP(USB_VENDOR_SAMSUNG2, USB_PRODUCT_SAMSUNG2_RT2870_1) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT2870_1) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT2870_2) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT2870_3) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT2870_4) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT3070) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT3071) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT3072_1) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT3072_2) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT3072_3) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT3072_4) }, + { USB_VP(USB_VENDOR_SENAO, USB_PRODUCT_SENAO_RT3072_5) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT2770) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT2870_1) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT2870_2) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT2870_3) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT2870_4) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3070) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3070_2) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3070_3) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3070_4) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3072_1) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3072_2) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3072_3) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3072_4) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3072_5) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_RT3072_6) }, + { USB_VP(USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_WL608) }, + { USB_VP(USB_VENDOR_SPARKLAN, USB_PRODUCT_SPARKLAN_RT2870_1) }, + { USB_VP(USB_VENDOR_SPARKLAN, USB_PRODUCT_SPARKLAN_RT3070) }, + { USB_VP(USB_VENDOR_SWEEX2, USB_PRODUCT_SWEEX2_LW303) }, + { USB_VP(USB_VENDOR_SWEEX2, USB_PRODUCT_SWEEX2_LW313) }, + { USB_VP(USB_VENDOR_UMEDIA, USB_PRODUCT_UMEDIA_RT2870_1) }, + { USB_VP(USB_VENDOR_ZCOM, USB_PRODUCT_ZCOM_RT2870_1) }, + { USB_VP(USB_VENDOR_ZCOM, USB_PRODUCT_ZCOM_RT2870_2) }, + { USB_VP(USB_VENDOR_ZINWELL, USB_PRODUCT_ZINWELL_RT2870_1) }, + { USB_VP(USB_VENDOR_ZINWELL, USB_PRODUCT_ZINWELL_RT2870_2) }, + { USB_VP(USB_VENDOR_ZINWELL, USB_PRODUCT_ZINWELL_RT3070) }, + { USB_VP(USB_VENDOR_ZINWELL, USB_PRODUCT_ZINWELL_RT3072_1) }, + { USB_VP(USB_VENDOR_ZINWELL, USB_PRODUCT_ZINWELL_RT3072_2) }, + { USB_VP(USB_VENDOR_ZYXEL, USB_PRODUCT_ZYXEL_RT2870_1) }, +}; + +MODULE_DEPEND(run, wlan, 1, 1, 1); +MODULE_DEPEND(run, wlan_amrr, 1, 1, 1); +MODULE_DEPEND(run, usb, 1, 1, 1); +MODULE_DEPEND(run, firmware, 1, 1, 1); + +static device_probe_t run_match; +static device_attach_t run_attach; +static device_detach_t run_detach; + +static usb_callback_t run_bulk_rx_callback; +static usb_callback_t run_bulk_tx_callback0; +static usb_callback_t run_bulk_tx_callback1; +static usb_callback_t run_bulk_tx_callback2; +static usb_callback_t run_bulk_tx_callback3; +static usb_callback_t run_bulk_tx_callback4; +static usb_callback_t run_bulk_tx_callback5; + +static void run_bulk_tx_callbackN(struct usb_xfer *xfer, + usb_error_t error, unsigned int index); +static struct ieee80211vap *run_vap_create(struct ieee80211com *, + const char name[IFNAMSIZ], int unit, int opmode, int flags, + const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t + mac[IEEE80211_ADDR_LEN]); +static void run_vap_delete(struct ieee80211vap *); +static void run_setup_tx_list(struct run_softc *, + struct run_endpoint_queue *); +static void run_unsetup_tx_list(struct run_softc *, + struct run_endpoint_queue *); +static int run_load_microcode(struct run_softc *); +static int run_reset(struct run_softc *); +static usb_error_t run_do_request(struct run_softc *, + struct usb_device_request *, void *); +static int run_read(struct run_softc *, uint16_t, uint32_t *); +static int run_read_region_1(struct run_softc *, uint16_t, uint8_t *, int); +static int run_write_2(struct run_softc *, uint16_t, uint16_t); +static int run_write(struct run_softc *, uint16_t, uint32_t); +static int run_write_region_1(struct run_softc *, uint16_t, + const uint8_t *, int); +static int run_set_region_4(struct run_softc *, uint16_t, uint32_t, int); +static int run_efuse_read_2(struct run_softc *, uint16_t, uint16_t *); +static int run_eeprom_read_2(struct run_softc *, uint16_t, uint16_t *); +static int run_rt2870_rf_write(struct run_softc *, uint8_t, uint32_t); +static int run_rt3070_rf_read(struct run_softc *, uint8_t, uint8_t *); +static int run_rt3070_rf_write(struct run_softc *, uint8_t, uint8_t); +static int run_bbp_read(struct run_softc *, uint8_t, uint8_t *); +static int run_bbp_write(struct run_softc *, uint8_t, uint8_t); +static int run_mcu_cmd(struct run_softc *, uint8_t, uint16_t); +static const char *run_get_rf(int); +static int run_read_eeprom(struct run_softc *); +static struct ieee80211_node *run_node_alloc(struct ieee80211vap *, + const uint8_t mac[IEEE80211_ADDR_LEN]); +static int run_media_change(struct ifnet *); +static int run_newstate(struct ieee80211vap *, enum ieee80211_state, int); +static int run_wme_update(struct ieee80211com *); +static void run_wme_update_cb(void *, int); +static void run_key_update_begin(struct ieee80211vap *); +static void run_key_update_end(struct ieee80211vap *); +static int run_key_set(struct ieee80211vap *, const struct ieee80211_key *, + const uint8_t mac[IEEE80211_ADDR_LEN]); +static int run_key_delete(struct ieee80211vap *, + const struct ieee80211_key *); +static void run_amrr_start(struct run_softc *, struct ieee80211_node *); +static void run_amrr_to(void *); +static void run_amrr_cb(void *, int); +static void run_iter_func(void *, struct ieee80211_node *); +static void run_newassoc(struct ieee80211_node *, int); +static void run_rx_frame(struct run_softc *, struct mbuf *, uint32_t); +static void run_tx_free(struct run_endpoint_queue *pq, + struct run_tx_data *, int); +static void run_set_tx_desc(struct run_softc *, struct run_tx_data *, + uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t); +static int run_tx(struct run_softc *, struct mbuf *, + struct ieee80211_node *); +static int run_tx_mgt(struct run_softc *, struct mbuf *, + struct ieee80211_node *); +static int run_sendprot(struct run_softc *, const struct mbuf *, + struct ieee80211_node *, int, int); +static int run_tx_param(struct run_softc *, struct mbuf *, + struct ieee80211_node *, + const struct ieee80211_bpf_params *); +static int run_raw_xmit(struct ieee80211_node *, struct mbuf *, + const struct ieee80211_bpf_params *); +static void run_start(struct ifnet *); +static int run_ioctl(struct ifnet *, u_long, caddr_t); +static void run_select_chan_group(struct run_softc *, int); +static void run_set_rx_antenna(struct run_softc *, int); +static void run_rt2870_set_chan(struct run_softc *, u_int); +static void run_rt3070_set_chan(struct run_softc *, u_int); +static int run_set_chan(struct run_softc *, struct ieee80211_channel *); +static void run_set_channel(struct ieee80211com *); +static void run_scan_start(struct ieee80211com *); +static void run_scan_end(struct ieee80211com *); +static uint8_t run_rate2mcs(uint8_t); +static void run_update_beacon(struct ieee80211vap *, int); +static void run_update_beacon_locked(struct ieee80211vap *, int); +static void run_updateprot(struct ieee80211com *); +static void run_usb_timeout_cb(void *, int); +static void run_reset_livelock(struct run_softc *); +static void run_enable_tsf_sync(struct run_softc *); +static void run_enable_mrr(struct run_softc *); +static void run_set_txpreamble(struct run_softc *); +static void run_set_basicrates(struct run_softc *); +static void run_set_leds(struct run_softc *, uint16_t); +static void run_set_bssid(struct run_softc *, const uint8_t *); +static void run_set_macaddr(struct run_softc *, const uint8_t *); +static void run_updateslot(struct ifnet *); +static int8_t run_rssi2dbm(struct run_softc *, uint8_t, uint8_t); +static void run_update_promisc_locked(struct ifnet *); +static void run_update_promisc(struct ifnet *); +static int run_bbp_init(struct run_softc *); +static int run_rt3070_rf_init(struct run_softc *); +static int run_rt3070_filter_calib(struct run_softc *, uint8_t, uint8_t, + uint8_t *); +static int run_txrx_enable(struct run_softc *); +static void run_init(void *); +static void run_init_locked(struct run_softc *); +static void run_stop(void *); +static void run_delay(struct run_softc *, unsigned int); + +static const struct { + uint32_t reg; + uint32_t val; +} rt2870_def_mac[] = { + RT2870_DEF_MAC +}; + +static const struct { + uint8_t reg; + uint8_t val; +} rt2860_def_bbp[] = { + RT2860_DEF_BBP +}; + +static const struct rfprog { + uint8_t chan; + uint32_t r1, r2, r3, r4; +} rt2860_rf2850[] = { + RT2860_RF2850 +}; + +struct { + uint8_t n, r, k; +} run_rf3020_freqs[] = { + RT3070_RF3020 +}; + +static const struct { + uint8_t reg; + uint8_t val; +} rt3070_def_rf[] = { + RT3070_DEF_RF +}; + +static const struct usb_config run_config[RUN_N_XFER] = { + [RUN_BULK_TX_BE] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .ep_index = 0, + .direction = UE_DIR_OUT, + .bufsize = RUN_MAX_TXSZ, + .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, + .callback = run_bulk_tx_callback0, + .timeout = 5000, /* ms */ + }, + [RUN_BULK_TX_BK] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .ep_index = 1, + .bufsize = RUN_MAX_TXSZ, + .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, + .callback = run_bulk_tx_callback1, + .timeout = 5000, /* ms */ + }, + [RUN_BULK_TX_VI] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .ep_index = 2, + .bufsize = RUN_MAX_TXSZ, + .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, + .callback = run_bulk_tx_callback2, + .timeout = 5000, /* ms */ + }, + [RUN_BULK_TX_VO] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .ep_index = 3, + .bufsize = RUN_MAX_TXSZ, + .flags = {.pipe_bof = 1,.force_short_xfer = 1,}, + .callback = run_bulk_tx_callback3, + .timeout = 5000, /* ms */ + }, + [RUN_BULK_TX_HCCA] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .ep_index = 4, + .bufsize = RUN_MAX_TXSZ, + .flags = {.pipe_bof = 1,.force_short_xfer = 1,.no_pipe_ok = 1,}, + .callback = run_bulk_tx_callback4, + .timeout = 5000, /* ms */ + }, + [RUN_BULK_TX_PRIO] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_OUT, + .ep_index = 5, + .bufsize = RUN_MAX_TXSZ, + .flags = {.pipe_bof = 1,.force_short_xfer = 1,.no_pipe_ok = 1,}, + .callback = run_bulk_tx_callback5, + .timeout = 5000, /* ms */ + }, + [RUN_BULK_RX] = { + .type = UE_BULK, + .endpoint = UE_ADDR_ANY, + .direction = UE_DIR_IN, + .bufsize = RUN_MAX_RXSZ, + .flags = {.pipe_bof = 1,.short_xfer_ok = 1,}, + .callback = run_bulk_rx_callback, + } +}; + +int +run_match(device_t self) +{ + struct usb_attach_arg *uaa = device_get_ivars(self); + + if (uaa->usb_mode != USB_MODE_HOST) + return (ENXIO); + if (uaa->info.bConfigIndex != 0) + return (ENXIO); + if (uaa->info.bIfaceIndex != RT2860_IFACE_INDEX) + return (ENXIO); + + return (usbd_lookup_id_by_uaa(run_devs, sizeof(run_devs), uaa)); +} + +static int +run_attach(device_t self) +{ + struct run_softc *sc = device_get_softc(self); + struct usb_attach_arg *uaa = device_get_ivars(self); + struct ieee80211com *ic; + struct ifnet *ifp; + int i, ntries, error; + uint8_t iface_index, bands; + + device_set_usb_desc(self); + sc->sc_udev = uaa->device; + sc->sc_dev = self; + + mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), + MTX_NETWORK_LOCK, MTX_DEF); + + iface_index = RT2860_IFACE_INDEX; + /* Rx transfer has own lock */ + error = usbd_transfer_setup(uaa->device, &iface_index, + sc->sc_xfer, run_config, RUN_N_XFER, sc, &sc->sc_mtx); + if (error) { + device_printf(self, "could not allocate USB Tx transfers, " + "err=%s\n", usbd_errstr(error)); + goto detach; + } + + RUN_LOCK(sc); + + /* wait for the chip to settle */ + for (ntries = 0; ntries < 100; ntries++) { + if (run_read(sc, RT2860_ASIC_VER_ID, &sc->mac_rev) != 0){ + RUN_UNLOCK(sc); + goto detach; + } + if (sc->mac_rev != 0 && sc->mac_rev != 0xffffffff) + break; + run_delay(sc, 10); + } + if (ntries == 100) { + device_printf(sc->sc_dev, + "timeout waiting for NIC to initialize\n"); + RUN_UNLOCK(sc); + goto detach; + } + + /* retrieve RF rev. no and various other things from EEPROM */ + run_read_eeprom(sc); + + device_printf(sc->sc_dev, + "MAC/BBP RT%04X (rev 0x%04X), RF %s (MIMO %dT%dR), address %s\n", + sc->mac_rev >> 16, sc->mac_rev & 0xffff, run_get_rf(sc->rf_rev), + sc->ntxchains, sc->nrxchains, ether_sprintf(sc->sc_bssid)); + + if ((error = run_load_microcode(sc)) != 0) { + device_printf(sc->sc_dev, "could not load 8051 microcode\n"); + RUN_UNLOCK(sc); + goto detach; + } + + RUN_UNLOCK(sc); + + ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); + if(ifp == NULL){ + device_printf(sc->sc_dev, "can not if_alloc()\n"); + goto detach; + } + ic = ifp->if_l2com; + + ifp->if_softc = sc; + if_initname(ifp, "run", device_get_unit(sc->sc_dev)); + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_init = run_init; + ifp->if_ioctl = run_ioctl; + ifp->if_start = run_start; + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_READY(&ifp->if_snd); + + ic->ic_ifp = ifp; + ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ + ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ +#if 0 + ic->ic_state = IEEE80211_S_INIT; +#endif + /* set device capabilities */ + ic->ic_caps = + IEEE80211_C_STA | /* station mode supported */ + IEEE80211_C_MONITOR | /* monitor mode supported */ + IEEE80211_C_IBSS | + IEEE80211_C_HOSTAP | + IEEE80211_C_SHPREAMBLE | /* short preamble supported */ + IEEE80211_C_SHSLOT | /* short slot time supported */ + IEEE80211_C_WME | /* WME */ + IEEE80211_C_WPA; /* WPA1|WPA2(RSN) */ + + ic->ic_cryptocaps = + IEEE80211_CRYPTO_WEP | + IEEE80211_CRYPTO_AES_CCM | + IEEE80211_CRYPTO_TKIPMIC | + IEEE80211_CRYPTO_TKIP; + + ic->ic_flags |= IEEE80211_F_DATAPAD; + ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS; + + bands = 0; + setbit(&bands, IEEE80211_MODE_11B); + setbit(&bands, IEEE80211_MODE_11G); + ieee80211_init_channels(ic, NULL, &bands); + + /* + * Do this by own because h/w supports + * more channels than ieee80211_init_channels() + */ + if (sc->rf_rev == RT2860_RF_2750 || sc->rf_rev == RT2860_RF_2850) { + /* set supported .11a rates */ + for (i = 14; i < nitems(rt2860_rf2850); i++) { + uint8_t chan = rt2860_rf2850[i].chan; + ic->ic_channels[ic->ic_nchans].ic_freq = + ieee80211_ieee2mhz(chan, IEEE80211_CHAN_A); + ic->ic_channels[ic->ic_nchans].ic_ieee = chan; + ic->ic_channels[ic->ic_nchans].ic_flags = IEEE80211_CHAN_A; + ic->ic_channels[ic->ic_nchans].ic_extieee = 0; + ic->ic_nchans++; + } + } + + ieee80211_ifattach(ic, sc->sc_bssid); + + ic->ic_scan_start = run_scan_start; + ic->ic_scan_end = run_scan_end; + ic->ic_set_channel = run_set_channel; + ic->ic_node_alloc = run_node_alloc; + ic->ic_newassoc = run_newassoc; + //ic->ic_updateslot = run_updateslot; + ic->ic_wme.wme_update = run_wme_update; + ic->ic_raw_xmit = run_raw_xmit; + ic->ic_update_promisc = run_update_promisc; + + ic->ic_vap_create = run_vap_create; + ic->ic_vap_delete = run_vap_delete; + + ieee80211_radiotap_attach(ic, + &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), + RUN_TX_RADIOTAP_PRESENT, + &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), + RUN_RX_RADIOTAP_PRESENT); + + if (bootverbose) + ieee80211_announce(ic); + + return 0; + +detach: + run_detach(self); + return(ENXIO); +} + +static int +run_detach(device_t self) +{ + struct run_softc *sc = device_get_softc(self); + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic; + int i; + + /* stop all USB transfers */ + usbd_transfer_unsetup(sc->sc_xfer, RUN_N_XFER); + + RUN_LOCK(sc); + /* free TX list, if any */ + for (i = 0; i != RUN_EP_QUEUES; i++) + run_unsetup_tx_list(sc, &sc->sc_epq[i]); + RUN_UNLOCK(sc); + + if (ifp) { + ic = ifp->if_l2com; + ieee80211_ifdetach(ic); + if_free(ifp); + } + + mtx_destroy(&sc->sc_mtx); + + return (0); +} + +static struct ieee80211vap * +run_vap_create(struct ieee80211com *ic, + const char name[IFNAMSIZ], int unit, int opmode, int flags, + const uint8_t bssid[IEEE80211_ADDR_LEN], + const uint8_t mac[IEEE80211_ADDR_LEN]) +{ + struct run_softc *sc = ic->ic_ifp->if_softc; + struct run_vap *rvp; + struct ieee80211vap *vap; + + if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ + return NULL; + sc->sc_rvp = rvp = (struct run_vap *) malloc(sizeof(struct run_vap), + M_80211_VAP, M_NOWAIT | M_ZERO); + if (rvp == NULL) + return NULL; + vap = &rvp->vap; + /* enable s/w bmiss handling for sta mode */ + ieee80211_vap_setup(ic, vap, name, unit, opmode, + flags | IEEE80211_CLONE_NOBEACONS, bssid, mac); + + vap->iv_key_update_begin = run_key_update_begin; + vap->iv_key_update_end = run_key_update_end; + vap->iv_key_delete = run_key_delete; + vap->iv_key_set = run_key_set; + vap->iv_update_beacon = run_update_beacon; + + /* override state transition machine */ + rvp->newstate = vap->iv_newstate; + vap->iv_newstate = run_newstate; + + TASK_INIT(&rvp->amrr_task, 0, run_amrr_cb, rvp); + TASK_INIT(&sc->wme_task, 0, run_wme_update_cb, ic); + TASK_INIT(&sc->usb_timeout_task, 0, run_usb_timeout_cb, sc); + callout_init((struct callout *)&rvp->amrr_ch, 1); + ieee80211_amrr_init(&rvp->amrr, vap, + IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD, + IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD, + 1000 /* 1 sec */); + + /* complete setup */ + ieee80211_vap_attach(vap, run_media_change, ieee80211_media_status); + ic->ic_opmode = opmode; + return vap; +} + +static void +run_vap_delete(struct ieee80211vap *vap) +{ + struct run_vap *rvp = RUN_VAP(vap); + struct ifnet *ifp; + struct ieee80211com *ic; + struct run_softc *sc; + + if(vap == NULL) + return; + + ic = vap->iv_ic; + ifp = ic->ic_ifp; + + sc = ifp->if_softc; + + if (ifp && ifp->if_flags & IFF_UP){ + RUN_LOCK(sc); + run_stop(sc); + RUN_UNLOCK(sc); + } + + ieee80211_amrr_cleanup(&rvp->amrr); + ieee80211_vap_detach(vap); + free(rvp, M_80211_VAP); + sc->sc_rvp = NULL; +} + +static void +run_setup_tx_list(struct run_softc *sc, struct run_endpoint_queue *pq) +{ + struct run_tx_data *data; + + memset(pq, 0, sizeof(*pq)); + + STAILQ_INIT(&pq->tx_qh); + STAILQ_INIT(&pq->tx_fh); + + for (data = &pq->tx_data[0]; + data < &pq->tx_data[RUN_TX_RING_COUNT]; data++) { + data->sc = sc; + STAILQ_INSERT_TAIL(&pq->tx_fh, data, next); + } + pq->tx_nfree = RUN_TX_RING_COUNT; +} + +static void +run_unsetup_tx_list(struct run_softc *sc, struct run_endpoint_queue *pq) +{ + struct run_tx_data *data; + + /* make sure any subsequent use of the queues will fail */ + pq->tx_nfree = 0; + STAILQ_INIT(&pq->tx_fh); + STAILQ_INIT(&pq->tx_qh); + + /* free up all node references and mbufs */ + for (data = &pq->tx_data[0]; + data < &pq->tx_data[RUN_TX_RING_COUNT]; data++){ + if (data->m != NULL) { + m_freem(data->m); + data->m = NULL; + } + if (data->ni != NULL) { + ieee80211_free_node(data->ni); + data->ni = NULL; + } + } +} + +int +run_load_microcode(struct run_softc *sc) +{ + usb_device_request_t req; + const struct firmware *fw; + const u_char *base; + uint32_t tmp; + int ntries, error; + const uint64_t *temp; + uint64_t bytes; + + fw = firmware_get("runfw"); + if(fw == NULL){ + device_printf(sc->sc_dev, + "failed loadfirmware of file %s\n", "runfw"); + return ENOENT; + } + + if (fw->datasize != 8192) { + device_printf(sc->sc_dev, + "invalid firmware size (should be 8KB)\n"); + error = EINVAL; + goto fail; + } + + /* + * RT3071/RT3072 use a different firmware + * run-rt2870 (8KB) contains both, + * first half (4KB) is for rt2870, + * last half is for rt3071. + */ + base = fw->data; + if ((sc->mac_rev >> 16) != 0x2860 && + (sc->mac_rev >> 16) != 0x2872 && + (sc->mac_rev >> 16) != 0x3070 && + (sc->mac_rev >> 16) != 0x3572){ + base += 4096; + device_printf(sc->sc_dev, "loading RT3071 firmware\n"); + } else + device_printf(sc->sc_dev, "loading RT2870 firmware\n"); + + /* cheap sanity check */ + temp = fw->data; + bytes = *temp; + if(bytes != be64toh(0xffffff0210280210)) { + device_printf(sc->sc_dev, "firmware checksum failed\n"); + error = EINVAL; + goto fail; + } + + run_read(sc, RT2860_ASIC_VER_ID, &tmp); + /* write microcode image */ + run_write_region_1(sc, RT2870_FW_BASE, base, 4096); + run_write(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff); + run_write(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff); + + req.bmRequestType = UT_WRITE_VENDOR_DEVICE; + req.bRequest = RT2870_RESET; + USETW(req.wValue, 8); + USETW(req.wIndex, 0); + USETW(req.wLength, 0); + if ((error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL)) != 0) { + device_printf(sc->sc_dev, "firmware reset failed\n"); + goto fail; + } + + run_delay(sc, 10); + + run_write(sc, RT2860_H2M_MAILBOX, 0); + if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_BOOT, 0)) != 0) + goto fail; + + /* wait until microcontroller is ready */ + for (ntries = 0; ntries < 1000; ntries++) { + if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0) { + goto fail; + } + if (tmp & RT2860_MCU_READY) + break; + run_delay(sc, 10); + } + if (ntries == 1000) { + device_printf(sc->sc_dev, + "timeout waiting for MCU to initialize\n"); + error = ETIMEDOUT; + goto fail; + } + DPRINTF("microcode successfully loaded after %d tries\n", ntries); + +fail: + firmware_put(fw, FIRMWARE_UNLOAD); + return (error); +} + +int +run_reset(struct run_softc *sc) +{ + usb_device_request_t req; + + req.bmRequestType = UT_WRITE_VENDOR_DEVICE; + req.bRequest = RT2870_RESET; + USETW(req.wValue, 1); + USETW(req.wIndex, 0); + USETW(req.wLength, 0); + return usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL); +} + +static usb_error_t +run_do_request(struct run_softc *sc, + struct usb_device_request *req, void *data) +{ + usb_error_t err; + int ntries = 10; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + while (ntries--) { + err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx, + req, data, 0, NULL, 250 /* ms */); + if (err == 0) + break; + DPRINTFN(1, "Control request failed, %s (retrying)\n", + usbd_errstr(err)); + run_delay(sc, 10); + } + return (err); +} + +static int +run_read(struct run_softc *sc, uint16_t reg, uint32_t *val) +{ + uint32_t tmp; + int error; + + error = run_read_region_1(sc, reg, (uint8_t *)&tmp, sizeof tmp); + if (error == 0) + *val = le32toh(tmp); + else + *val = 0xffffffff; + return error; +} + +static int +run_read_region_1(struct run_softc *sc, uint16_t reg, uint8_t *buf, int len) +{ + usb_device_request_t req; + + req.bmRequestType = UT_READ_VENDOR_DEVICE; + req.bRequest = RT2870_READ_REGION_1; + USETW(req.wValue, 0); + USETW(req.wIndex, reg); + USETW(req.wLength, len); + + return run_do_request(sc, &req, buf); +} + +static int +run_write_2(struct run_softc *sc, uint16_t reg, uint16_t val) +{ + usb_device_request_t req; + + req.bmRequestType = UT_WRITE_VENDOR_DEVICE; + req.bRequest = RT2870_WRITE_2; + USETW(req.wValue, val); + USETW(req.wIndex, reg); + USETW(req.wLength, 0); + + return run_do_request(sc, &req, NULL); +} + +static int +run_write(struct run_softc *sc, uint16_t reg, uint32_t val) +{ + int error; + + if ((error = run_write_2(sc, reg, val & 0xffff)) == 0) + error = run_write_2(sc, reg + 2, val >> 16); + return error; +} + +static int +run_write_region_1(struct run_softc *sc, uint16_t reg, const uint8_t *buf, + int len) +{ +#if 1 + int i, error = 0; + /* + * NB: the WRITE_REGION_1 command is not stable on RT2860. + * We thus issue multiple WRITE_2 commands instead. + */ + KASSERT((len & 1) == 0, ("run_write_region_1: Data too long.\n")); + for (i = 0; i < len && error == 0; i += 2) + error = run_write_2(sc, reg + i, buf[i] | buf[i + 1] << 8); + return error; +#else + usb_device_request_t req; + + req.bmRequestType = UT_WRITE_VENDOR_DEVICE; + req.bRequest = RT2870_WRITE_REGION_1; + USETW(req.wValue, 0); + USETW(req.wIndex, reg); + USETW(req.wLength, len); + return run_do_request(sc, &req, buf); +#endif +} + +static int +run_set_region_4(struct run_softc *sc, uint16_t reg, uint32_t val, int len) +{ + int i, error = 0; + + KASSERT((len & 3) == 0, ("run_set_region_4: Invalid data length.\n")); + for (i = 0; i < len && error == 0; i += 4) + error = run_write(sc, reg + i, val); + return error; +} + +/* Read 16-bit from eFUSE ROM (RT3070 only.) */ +static int +run_efuse_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val) +{ + uint32_t tmp; + uint16_t reg; + int error, ntries; + + if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0) + return error; + + addr *= 2; + /*- + * Read one 16-byte block into registers EFUSE_DATA[0-3]: + * DATA0: F E D C + * DATA1: B A 9 8 + * DATA2: 7 6 5 4 + * DATA3: 3 2 1 0 + */ + tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK); + tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK; + run_write(sc, RT3070_EFUSE_CTRL, tmp); + for (ntries = 0; ntries < 100; ntries++) { + if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0) + return error; + if (!(tmp & RT3070_EFSROM_KICK)) + break; + run_delay(sc, 2); + } + if (ntries == 100) + return ETIMEDOUT; + + if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) { + *val = 0xffff; /* address not found */ + return 0; + } + /* determine to which 32-bit register our 16-bit word belongs */ + reg = RT3070_EFUSE_DATA3 - (addr & 0xc); + if ((error = run_read(sc, reg, &tmp)) != 0) + return error; + + *val = (addr & 2) ? tmp >> 16 : tmp & 0xffff; + return 0; +} + +static int +run_eeprom_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val) +{ + usb_device_request_t req; + uint16_t tmp; + int error; + + addr *= 2; + req.bmRequestType = UT_READ_VENDOR_DEVICE; + req.bRequest = RT2870_EEPROM_READ; + USETW(req.wValue, 0); + USETW(req.wIndex, addr); + USETW(req.wLength, sizeof tmp); + + error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, &tmp); + if (error == 0) + *val = le16toh(tmp); + else + *val = 0xffff; + return error; +} + +static __inline int +run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val) +{ + /* either eFUSE ROM or EEPROM */ + return sc->sc_srom_read(sc, addr, val); +} + +static int +run_rt2870_rf_write(struct run_softc *sc, uint8_t reg, uint32_t val) +{ + uint32_t tmp; + int error, ntries; + + for (ntries = 0; ntries < 10; ntries++) { + if ((error = run_read(sc, RT2860_RF_CSR_CFG0, &tmp)) != 0) + return error; + if (!(tmp & RT2860_RF_REG_CTRL)) + break; + } + if (ntries == 10) + return ETIMEDOUT; + + /* RF registers are 24-bit on the RT2860 */ + tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT | + (val & 0x3fffff) << 2 | (reg & 3); + return run_write(sc, RT2860_RF_CSR_CFG0, tmp); +} + +static int +run_rt3070_rf_read(struct run_softc *sc, uint8_t reg, uint8_t *val) +{ + uint32_t tmp; + int error, ntries; + + for (ntries = 0; ntries < 100; ntries++) { + if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0) + return error; + if (!(tmp & RT3070_RF_KICK)) + break; + } + if (ntries == 100) + return ETIMEDOUT; + + tmp = RT3070_RF_KICK | reg << 8; + if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0) + return error; + + for (ntries = 0; ntries < 100; ntries++) { + if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0) + return error; + if (!(tmp & RT3070_RF_KICK)) + break; + } + if (ntries == 100) + return ETIMEDOUT; + + *val = tmp & 0xff; + return 0; +} + +static int +run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val) +{ + uint32_t tmp; + int error, ntries; + + for (ntries = 0; ntries < 10; ntries++) { + if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0) + return error; + if (!(tmp & RT3070_RF_KICK)) + break; + } + if (ntries == 10) + return ETIMEDOUT; + + tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val; + return run_write(sc, RT3070_RF_CSR_CFG, tmp); +} + +static int +run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val) +{ + uint32_t tmp; + int ntries, error; + + for (ntries = 0; ntries < 10; ntries++) { + if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0) + return error; + if (!(tmp & RT2860_BBP_CSR_KICK)) + break; + } + if (ntries == 10) + return ETIMEDOUT; + + tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8; + if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0) + return error; + + for (ntries = 0; ntries < 10; ntries++) { + if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0) + return error; + if (!(tmp & RT2860_BBP_CSR_KICK)) + break; + } + if (ntries == 10) + return ETIMEDOUT; + + *val = tmp & 0xff; + return 0; +} + +static int +run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val) +{ + uint32_t tmp; + int ntries, error; + + for (ntries = 0; ntries < 10; ntries++) { + if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0) + return error; + if (!(tmp & RT2860_BBP_CSR_KICK)) + break; + } + if (ntries == 10) + return ETIMEDOUT; + + tmp = RT2860_BBP_CSR_KICK | reg << 8 | val; + return run_write(sc, RT2860_BBP_CSR_CFG, tmp); +} + +/* + * Send a command to the 8051 microcontroller unit. + */ +static int +run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg) +{ + uint32_t tmp; + int error, ntries; + + for (ntries = 0; ntries < 100; ntries++) { + if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0) + return error; + if (!(tmp & RT2860_H2M_BUSY)) + break; + } + if (ntries == 100) + return ETIMEDOUT; + + tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg; + if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0) + error = run_write(sc, RT2860_HOST_CMD, cmd); + return error; +} + +/* + * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word. + * Used to adjust per-rate Tx power registers. + */ +static __inline uint32_t +b4inc(uint32_t b32, int8_t delta) +{ + int8_t i, b4; + + for (i = 0; i < 8; i++) { + b4 = b32 & 0xf; + b4 += delta; + if (b4 < 0) + b4 = 0; + else if (b4 > 0xf) + b4 = 0xf; + b32 = b32 >> 4 | b4 << 28; + } + return b32; +} + +static const char * +run_get_rf(int rev) +{ + switch (rev) { + case RT2860_RF_2820: return "RT2820"; + case RT2860_RF_2850: return "RT2850"; + case RT2860_RF_2720: return "RT2720"; + case RT2860_RF_2750: return "RT2750"; + case RT3070_RF_3020: return "RT3020"; + case RT3070_RF_2020: return "RT2020"; + case RT3070_RF_3021: return "RT3021"; + case RT3070_RF_3022: return "RT3022"; + case RT3070_RF_3052: return "RT3052"; + } + return "unknown"; +} + +int +run_read_eeprom(struct run_softc *sc) +{ + int8_t delta_2ghz, delta_5ghz; + uint32_t tmp; + uint16_t val; + int ridx, ant, i; + + /* check whether the ROM is eFUSE ROM or EEPROM */ + sc->sc_srom_read = run_eeprom_read_2; + if ((sc->mac_rev & 0xfff00000) >= 0x30700000) { + run_read(sc, RT3070_EFUSE_CTRL, &tmp); + DPRINTF("EFUSE_CTRL=0x%08x\n", tmp); + if (tmp & RT3070_SEL_EFUSE) + sc->sc_srom_read = run_efuse_read_2; + } + + /* read ROM version */ + run_srom_read(sc, RT2860_EEPROM_VERSION, &val); + DPRINTF("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8); + + /* read MAC address */ + run_srom_read(sc, RT2860_EEPROM_MAC01, &val); + sc->sc_bssid[0] = val & 0xff; + sc->sc_bssid[1] = val >> 8; + run_srom_read(sc, RT2860_EEPROM_MAC23, &val); + sc->sc_bssid[2] = val & 0xff; + sc->sc_bssid[3] = val >> 8; + run_srom_read(sc, RT2860_EEPROM_MAC45, &val); + sc->sc_bssid[4] = val & 0xff; + sc->sc_bssid[5] = val >> 8; + + /* read default BBP settings */ + for (i = 0; i < 8; i++) { + run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val); + sc->bbp[i].val = val & 0xff; + sc->bbp[i].reg = val >> 8; + DPRINTF("BBP%d=0x%02x\n", sc->bbp[i].reg, sc->bbp[i].val); + } + + /* read RF frequency offset from EEPROM */ + run_srom_read(sc, RT2860_EEPROM_FREQ_LEDS, &val); + sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0; + DPRINTF("EEPROM freq offset %d\n", sc->freq & 0xff); + + if ((sc->leds = val >> 8) != 0xff) { + /* read LEDs operating mode */ + run_srom_read(sc, RT2860_EEPROM_LED1, &sc->led[0]); + run_srom_read(sc, RT2860_EEPROM_LED2, &sc->led[1]); + run_srom_read(sc, RT2860_EEPROM_LED3, &sc->led[2]); + } else { + /* broken EEPROM, use default settings */ + sc->leds = 0x01; + sc->led[0] = 0x5555; + sc->led[1] = 0x2221; + sc->led[2] = 0x5627; /* differs from RT2860 */ + } + DPRINTF("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n", + sc->leds, sc->led[0], sc->led[1], sc->led[2]); + + /* read RF information */ + run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val); + if (val == 0xffff) { + DPRINTF("invalid EEPROM antenna info, using default\n"); + if ((sc->mac_rev >> 16) >= 0x3070) { + /* default to RF3020 1T1R */ + sc->rf_rev = RT3070_RF_3020; + sc->ntxchains = 1; + sc->nrxchains = 1; + } else { + /* default to RF2820 1T2R */ + sc->rf_rev = RT2860_RF_2820; + sc->ntxchains = 1; + sc->nrxchains = 2; + } + } else { + sc->rf_rev = (val >> 8) & 0xf; + sc->ntxchains = (val >> 4) & 0xf; + sc->nrxchains = val & 0xf; + } + DPRINTF("EEPROM RF rev=0x%02x chains=%dT%dR\n", + sc->rf_rev, sc->ntxchains, sc->nrxchains); + + /* check if RF supports automatic Tx access gain control */ + run_srom_read(sc, RT2860_EEPROM_CONFIG, &val); + DPRINTF("EEPROM CFG 0x%04x\n", val); + if ((val & 0xff) != 0xff) { + sc->ext_5ghz_lna = (val >> 3) & 1; + sc->ext_2ghz_lna = (val >> 2) & 1; + sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1; + } + + /* read power settings for 2GHz channels */ + for (i = 0; i < 14; i += 2) { + run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val); + sc->txpow1[i + 0] = (int8_t)(val & 0xff); + sc->txpow1[i + 1] = (int8_t)(val >> 8); + + run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val); + sc->txpow2[i + 0] = (int8_t)(val & 0xff); + sc->txpow2[i + 1] = (int8_t)(val >> 8); + } + /* fix broken Tx power entries */ + for (i = 0; i < 14; i++) { + if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31) + sc->txpow1[i] = 5; + if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31) + sc->txpow2[i] = 5; + DPRINTF("chan %d: power1=%d, power2=%d\n", + rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i]); + } + /* read power settings for 5GHz channels */ + for (i = 0; i < 36; i += 2) { + run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val); + sc->txpow1[i + 14] = (int8_t)(val & 0xff); + sc->txpow1[i + 15] = (int8_t)(val >> 8); + + run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val); + sc->txpow2[i + 14] = (int8_t)(val & 0xff); + sc->txpow2[i + 15] = (int8_t)(val >> 8); + } + /* fix broken Tx power entries */ + for (i = 0; i < 36; i++) { + if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15) + sc->txpow1[14 + i] = 5; + if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15) + sc->txpow2[14 + i] = 5; + DPRINTF("chan %d: power1=%d, power2=%d\n", + rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i], + sc->txpow2[14 + i]); + } + + /* read Tx power compensation for each Tx rate */ + run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val); + delta_2ghz = delta_5ghz = 0; + if ((val & 0xff) != 0xff && (val & 0x80)) { + delta_2ghz = val & 0xf; + if (!(val & 0x40)) /* negative number */ + delta_2ghz = -delta_2ghz; + } + val >>= 8; + if ((val & 0xff) != 0xff && (val & 0x80)) { + delta_5ghz = val & 0xf; + if (!(val & 0x40)) /* negative number */ + delta_5ghz = -delta_5ghz; + } + DPRINTF("power compensation=%d (2GHz), %d (5GHz)\n", + delta_2ghz, delta_5ghz); + + for (ridx = 0; ridx < 5; ridx++) { + uint32_t reg; + + run_srom_read(sc, RT2860_EEPROM_RPWR + ridx, &val); + reg = (uint32_t)val << 16; + run_srom_read(sc, RT2860_EEPROM_RPWR + ridx + 1, &val); + reg |= val; + + sc->txpow20mhz[ridx] = reg; + sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz); + sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz); + + DPRINTF("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, " + "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx], + sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx]); + } + + /* read RSSI offsets and LNA gains from EEPROM */ + run_srom_read(sc, RT2860_EEPROM_RSSI1_2GHZ, &val); + sc->rssi_2ghz[0] = val & 0xff; /* Ant A */ + sc->rssi_2ghz[1] = val >> 8; /* Ant B */ + run_srom_read(sc, RT2860_EEPROM_RSSI2_2GHZ, &val); + sc->rssi_2ghz[2] = val & 0xff; /* Ant C */ + sc->lna[2] = val >> 8; /* channel group 2 */ + + run_srom_read(sc, RT2860_EEPROM_RSSI1_5GHZ, &val); + sc->rssi_5ghz[0] = val & 0xff; /* Ant A */ + sc->rssi_5ghz[1] = val >> 8; /* Ant B */ + run_srom_read(sc, RT2860_EEPROM_RSSI2_5GHZ, &val); + sc->rssi_5ghz[2] = val & 0xff; /* Ant C */ + sc->lna[3] = val >> 8; /* channel group 3 */ + + run_srom_read(sc, RT2860_EEPROM_LNA, &val); + sc->lna[0] = val & 0xff; /* channel group 0 */ + sc->lna[1] = val >> 8; /* channel group 1 */ + + /* fix broken 5GHz LNA entries */ + if (sc->lna[2] == 0 || sc->lna[2] == 0xff) { + DPRINTF("invalid LNA for channel group %d\n", 2); + sc->lna[2] = sc->lna[1]; + } + if (sc->lna[3] == 0 || sc->lna[3] == 0xff) { + DPRINTF("invalid LNA for channel group %d\n", 3); + sc->lna[3] = sc->lna[1]; + } + + /* fix broken RSSI offset entries */ + for (ant = 0; ant < 3; ant++) { + if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) { + DPRINTF("invalid RSSI%d offset: %d (2GHz)\n", + ant + 1, sc->rssi_2ghz[ant]); + sc->rssi_2ghz[ant] = 0; + } + if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) { + DPRINTF("invalid RSSI%d offset: %d (5GHz)\n", + ant + 1, sc->rssi_5ghz[ant]); + sc->rssi_5ghz[ant] = 0; + } + } + return 0; +} + +struct ieee80211_node * +run_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN]) +{ + return malloc(sizeof (struct run_node), M_DEVBUF, M_NOWAIT | M_ZERO); +} + +static int +run_media_change(struct ifnet *ifp) +{ + const struct ieee80211_txparam *tp; + struct run_softc *sc = ifp->if_softc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ieee80211vap *vap = &sc->sc_rvp->vap; + uint8_t rate, ridx; + int error; + + RUN_LOCK(sc); + + error = ieee80211_media_change(ifp); + if (error != ENETRESET) + RUN_UNLOCK(sc); + return error; + + tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; + if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { + rate = ic->ic_sup_rates[ic->ic_curmode]. + rs_rates[tp->ucastrate] & IEEE80211_RATE_VAL; + for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++) + if (rt2860_rates[ridx].rate == rate) + break; + sc->fixed_ridx = ridx; + } + + if ((ifp->if_flags & IFF_UP) && + (ifp->if_drv_flags & IFF_DRV_RUNNING)){ + run_init_locked(sc); + } + + RUN_UNLOCK(sc); + + return 0; +} + +static int +run_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) +{ + const struct ieee80211_txparam *tp; + struct ieee80211com *ic = vap->iv_ic; + struct run_softc *sc = ic->ic_ifp->if_softc; + struct run_vap *rvp = RUN_VAP(vap); + enum ieee80211_state ostate; + struct ieee80211_node *ni; + uint32_t tmp; + uint8_t wcid; + + ostate = vap->iv_state; + DPRINTF("%s -> %s\n", + ieee80211_state_name[ostate], + ieee80211_state_name[nstate]); + + IEEE80211_UNLOCK(ic); + RUN_LOCK(sc); + + sc->sc_rvp->amrr_run = RUN_AMRR_OFF; + usb_callout_stop(&rvp->amrr_ch); + + if (ostate == IEEE80211_S_RUN) { + /* turn link LED off */ + run_set_leds(sc, RT2860_LED_RADIO); + } + + switch (nstate) { + case IEEE80211_S_INIT: + if (ostate == IEEE80211_S_RUN) { + /* abort TSF synchronization */ + run_read(sc, RT2860_BCN_TIME_CFG, &tmp); + run_write(sc, RT2860_BCN_TIME_CFG, + tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN | + RT2860_TBTT_TIMER_EN)); + } + break; + + case IEEE80211_S_RUN: + ni = vap->iv_bss; + + if (vap->iv_opmode != IEEE80211_M_MONITOR) { + run_updateslot(ic->ic_ifp); + run_enable_mrr(sc); + run_set_txpreamble(sc); + run_set_basicrates(sc); + IEEE80211_ADDR_COPY(sc->sc_bssid, ni->ni_bssid); + run_set_bssid(sc, ni->ni_bssid); + } + + if (vap->iv_opmode == IEEE80211_M_STA) { + /* add BSS entry to the WCID table */ + wcid = RUN_AID2WCID(ni->ni_associd); + run_write_region_1(sc, RT2860_WCID_ENTRY(wcid), + ni->ni_macaddr, IEEE80211_ADDR_LEN); + } + + if (vap->iv_opmode == IEEE80211_M_HOSTAP || + vap->iv_opmode == IEEE80211_M_IBSS) + run_update_beacon_locked(vap, 0); + + if (vap->iv_opmode != IEEE80211_M_MONITOR) { + run_enable_tsf_sync(sc); + } /* else tsf */ + + /* enable automatic rate adaptation */ + tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; + if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) + run_amrr_start(sc, ni); + + /* turn link LED on */ + run_set_leds(sc, RT2860_LED_RADIO | + (IEEE80211_IS_CHAN_2GHZ(vap->iv_bss->ni_chan) ? + RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ)); + + break; + default: + DPRINTFN(6, "undefined case\n"); + break; + } + + RUN_UNLOCK(sc); + IEEE80211_LOCK(ic); + + return(rvp->newstate(vap, nstate, arg)); +} + +/* another taskqueue, so usbd_do_request() can go sleep */ +static int +run_wme_update(struct ieee80211com *ic) +{ + struct run_softc *sc = ic->ic_ifp->if_softc; + + ieee80211_runtask(ic, &sc->wme_task); + + /* return whatever, upper layer desn't care anyway */ + return 0; +} + +/* ARGSUSED */ +static void +run_wme_update_cb(void *arg, int pending) +{ + struct ieee80211com *ic = arg; + struct run_softc *sc = ic->ic_ifp->if_softc; + struct ieee80211_wme_state *wmesp = &ic->ic_wme; + int aci, error = 0; + + RUN_LOCK(sc); + + /* update MAC TX configuration registers */ + for (aci = 0; aci < WME_NUM_AC; aci++) { + error = run_write(sc, RT2860_EDCA_AC_CFG(aci), + wmesp->wme_params[aci].wmep_logcwmax << 16 | + wmesp->wme_params[aci].wmep_logcwmin << 12 | + wmesp->wme_params[aci].wmep_aifsn << 8 | + wmesp->wme_params[aci].wmep_txopLimit); + if(error) goto err; + } + + /* update SCH/DMA registers too */ + error = run_write(sc, RT2860_WMM_AIFSN_CFG, + wmesp->wme_params[WME_AC_VO].wmep_aifsn << 12 | + wmesp->wme_params[WME_AC_VI].wmep_aifsn << 8 | + wmesp->wme_params[WME_AC_BK].wmep_aifsn << 4 | + wmesp->wme_params[WME_AC_BE].wmep_aifsn); + if(error) goto err; + error = run_write(sc, RT2860_WMM_CWMIN_CFG, + wmesp->wme_params[WME_AC_VO].wmep_logcwmin << 12 | + wmesp->wme_params[WME_AC_VI].wmep_logcwmin << 8 | + wmesp->wme_params[WME_AC_BK].wmep_logcwmin << 4 | + wmesp->wme_params[WME_AC_BE].wmep_logcwmin); + if(error) goto err; + error = run_write(sc, RT2860_WMM_CWMAX_CFG, + wmesp->wme_params[WME_AC_VO].wmep_logcwmax << 12 | + wmesp->wme_params[WME_AC_VI].wmep_logcwmax << 8 | + wmesp->wme_params[WME_AC_BK].wmep_logcwmax << 4 | + wmesp->wme_params[WME_AC_BE].wmep_logcwmax); + if(error) goto err; + error = run_write(sc, RT2860_WMM_TXOP0_CFG, + wmesp->wme_params[WME_AC_BK].wmep_txopLimit << 16 | + wmesp->wme_params[WME_AC_BE].wmep_txopLimit); + if(error) goto err; + error = run_write(sc, RT2860_WMM_TXOP1_CFG, + wmesp->wme_params[WME_AC_VO].wmep_txopLimit << 16 | + wmesp->wme_params[WME_AC_VI].wmep_txopLimit); + +err: + if(error) + DPRINTF("WME update failed\n"); + + RUN_UNLOCK(sc); + return; +} + +static void +run_key_update_begin(struct ieee80211vap *vap) +{ + /* + * Because run_key_delete() needs special attention + * on lock related operation, lock handling is being done + * differently in run_key_set and _delete. + * + * So, we don't use key_update_begin and _end. + */ +} + +static void +run_key_update_end(struct ieee80211vap *vap) +{ + /* null */ +} + +/* + * return 0 on error + */ +static int +run_key_set(struct ieee80211vap *vap, const struct ieee80211_key *k, + const uint8_t mac[IEEE80211_ADDR_LEN]) +{ + struct ieee80211com *ic = vap->iv_ic; + struct ifnet *ifp = ic->ic_ifp; + struct run_softc *sc = ifp->if_softc; + struct ieee80211_node *ni; + uint32_t attr; + uint16_t base, associd; + uint8_t mode, wcid, txmic, rxmic, iv[8]; + int error = 0; + + RUN_LOCK(sc); + + if(vap->iv_opmode == IEEE80211_M_HOSTAP){ + ni = ieee80211_find_vap_node(&ic->ic_sta, vap, mac); + associd = (ni != NULL) ? ni->ni_associd : 0; + if(ni != NULL) + ieee80211_free_node(ni); + txmic = 24; + rxmic = 16; + } else { + ni = vap->iv_bss; + associd = (ni != NULL) ? ni->ni_associd : 0; + txmic = 16; + rxmic = 24; + } + + /* map net80211 cipher to RT2860 security mode */ + switch (k->wk_cipher->ic_cipher) { + case IEEE80211_CIPHER_WEP: + if(k->wk_keylen < 8) + mode = RT2860_MODE_WEP40; + else + mode = RT2860_MODE_WEP104; + break; + case IEEE80211_CIPHER_TKIP: + mode = RT2860_MODE_TKIP; + break; + case IEEE80211_CIPHER_AES_CCM: + mode = RT2860_MODE_AES_CCMP; + break; + default: + DPRINTF("undefined case\n"); + goto fail; + } + + DPRINTFN(1, "associd=%x, keyix=%d, mode=%x, type=%s\n", + associd, k->wk_keyix, mode, + (k->wk_flags & IEEE80211_KEY_GROUP) ? "group" : "pairwise"); + + if (k->wk_flags & IEEE80211_KEY_GROUP) { + wcid = 0; /* NB: update WCID0 for group keys */ + base = RT2860_SKEY(0, k->wk_keyix); + } else { + wcid = RUN_AID2WCID(associd); + base = RT2860_PKEY(wcid); + } + + if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) { + if(run_write_region_1(sc, base, k->wk_key, 16)) + goto fail; + if(run_write_region_1(sc, base + 16, &k->wk_key[txmic], 8)) /* wk_txmic */ + goto fail; + if(run_write_region_1(sc, base + 24, &k->wk_key[rxmic], 8)) /* wk_rxmic */ + goto fail; + } else { + /* roundup len to 16-bit: XXX fix write_region_1() instead */ + if(run_write_region_1(sc, base, k->wk_key, (k->wk_keylen + 1) & ~1)) + goto fail; + } + + if (!(k->wk_flags & IEEE80211_KEY_GROUP) || + (k->wk_flags & (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV))) { + /* set initial packet number in IV+EIV */ + if (k->wk_cipher == IEEE80211_CIPHER_WEP){ + memset(iv, 0, sizeof iv); + iv[3] = sc->sc_rvp->vap.iv_def_txkey << 6; + } else { + if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) { + iv[0] = k->wk_keytsc >> 8; + iv[1] = (iv[0] | 0x20) & 0x7f; + iv[2] = k->wk_keytsc; + } else /* CCMP */ { + iv[0] = k->wk_keytsc; + iv[1] = k->wk_keytsc >> 8; + iv[2] = 0; + } + iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV; + iv[4] = k->wk_keytsc >> 16; + iv[5] = k->wk_keytsc >> 24; + iv[6] = k->wk_keytsc >> 32; + iv[7] = k->wk_keytsc >> 40; + } + if(run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8)) + goto fail; + } + + if (k->wk_flags & IEEE80211_KEY_GROUP) { + /* install group key */ + if(run_read(sc, RT2860_SKEY_MODE_0_7, &attr)) + goto fail; + attr &= ~(0xf << (k->wk_keyix * 4)); + attr |= mode << (k->wk_keyix * 4); + if(run_write(sc, RT2860_SKEY_MODE_0_7, attr)) + goto fail; + } else { + /* install pairwise key */ + if(run_read(sc, RT2860_WCID_ATTR(wcid), &attr)) + goto fail; + attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN; + if(run_write(sc, RT2860_WCID_ATTR(wcid), attr)) + goto fail; + } + + /* TODO create a pass-thru key entry? */ + +fail: + RUN_UNLOCK(sc); + return (error? 0 : 1); +} + +/* + * return 0 on error + */ +static int +run_key_delete(struct ieee80211vap *vap, const struct ieee80211_key *k) +{ + struct ieee80211com *ic = vap->iv_ic; + struct run_softc *sc = ic->ic_ifp->if_softc; + struct ieee80211_node *ni = vap->iv_bss; + struct ieee80211_node_table *nt = &ic->ic_sta; + uint32_t attr; + uint8_t wcid; + int error = 0; + uint8_t nislocked, cislocked; + + if((nislocked = IEEE80211_NODE_IS_LOCKED(nt))) + IEEE80211_NODE_UNLOCK(nt); + if((cislocked = mtx_owned(&ic->ic_comlock.mtx))) + IEEE80211_UNLOCK(ic); + RUN_LOCK(sc); + + if (k->wk_flags & IEEE80211_KEY_GROUP) { + /* remove group key */ + if(run_read(sc, RT2860_SKEY_MODE_0_7, &attr)) + goto fail; + attr &= ~(0xf << (k->wk_keyix * 4)); + if(run_write(sc, RT2860_SKEY_MODE_0_7, attr)) + goto fail; + } else { + /* remove pairwise key */ + wcid = RUN_AID2WCID((ni != NULL) ? ni->ni_associd : 0); + if(run_read(sc, RT2860_WCID_ATTR(wcid), &attr)) + goto fail; + attr &= ~0xf; + if(run_write(sc, RT2860_WCID_ATTR(wcid), attr)) + goto fail; + } + +fail: + RUN_UNLOCK(sc); + if(cislocked) + IEEE80211_LOCK(ic); + if(nislocked) + IEEE80211_NODE_LOCK(nt); + + return (error? 0 : 1); +} + +static void +run_amrr_start(struct run_softc *sc, struct ieee80211_node *ni) +{ + struct ieee80211vap *vap = ni->ni_vap; + struct run_vap *rvp = RUN_VAP(vap); + uint32_t sta[3]; + uint8_t wcid; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + /* read statistic counters (clear on read) and update AMRR state */ + run_read_region_1(sc, RT2860_TX_STA_CNT0, + (uint8_t *)sta, sizeof sta); + + wcid = RUN_AID2WCID(ni == NULL ? 0 : ni->ni_associd); + ieee80211_amrr_node_init(&rvp->amrr, &rvp->amn[wcid], ni); + + /* start at lowest available bit-rate, AMRR will raise */ + ni->ni_txrate = 2; + + /* start calibration timer */ + rvp->amrr_run = RUN_AMRR_ON; + usb_callout_reset(&rvp->amrr_ch, hz, run_amrr_to, rvp); +} + +static void +run_amrr_to(void *arg) +{ + struct run_vap *rvp = arg; + + /* do it in a process context, so it can go sleep */ + ieee80211_runtask(rvp->vap.iv_ic, &rvp->amrr_task); + /* next timeout will be rescheduled in the callback task */ +} + +/* ARGSUSED */ +static void +run_amrr_cb(void *arg, int pending) +{ + struct run_vap *rvp = arg; + struct ieee80211vap *vap = &rvp->vap; + struct ieee80211com *ic = vap->iv_ic; + struct run_softc *sc = ic->ic_ifp->if_softc; + + if (ic->ic_opmode == IEEE80211_M_STA) + run_iter_func(rvp, vap->iv_bss); + else { + /* + * run_reset_livelock() doesn't do anything with AMRR, + * but Ralink wants us to call it every 1 sec. So, we + * piggyback here rather than creating another callout. + * Livelock may occur only in HOSTAP or IBSS mode + * (when h/w is sending beacons). + */ + RUN_LOCK(sc); + run_reset_livelock(sc); + RUN_UNLOCK(sc); + ieee80211_iterate_nodes(&ic->ic_sta, run_iter_func, rvp); + } + + if(rvp->amrr_run == RUN_AMRR_ON) + usb_callout_reset(&rvp->amrr_ch, hz, run_amrr_to, rvp); +} + + +static void +run_iter_func(void *arg, struct ieee80211_node *ni) +{ + struct run_vap *rvp = arg; + struct ieee80211com *ic = rvp->vap.iv_ic; + struct ifnet *ifp = ic->ic_ifp; + struct run_softc *sc = ifp->if_softc; + struct ieee80211_node_table *nt = &ic->ic_sta; + struct ieee80211_amrr_node *amn = &rvp->amn[0]; /* make compiler happy */ + uint32_t sta[3], stat; + int error; + uint8_t wcid, mcs, pid; + + if(ic->ic_opmode != IEEE80211_M_STA) + IEEE80211_NODE_ITERATE_UNLOCK(nt); + + RUN_LOCK(sc); + + if(ic->ic_opmode != IEEE80211_M_STA){ + /* drain Tx status FIFO (maxsize = 16) */ + run_read(sc, RT2860_TX_STAT_FIFO, &stat); + while (stat & RT2860_TXQ_VLD) { + DPRINTFN(4, "tx stat 0x%08x\n", stat); + + wcid = (stat >> RT2860_TXQ_WCID_SHIFT) & 0xff; + + /* if no ACK was requested, no feedback is available */ + if (!(stat & RT2860_TXQ_ACKREQ) || wcid == 0xff) + continue; + + /* update per-STA AMRR stats */ + amn = &rvp->amn[wcid]; + amn->amn_txcnt++; + if (stat & RT2860_TXQ_OK) { + amn->amn_success++; + /* + * Check if there were retries, ie if the Tx + * success rate is different from the requested + * rate. Note that it works only because we do + * not allow rate fallback from OFDM to CCK. + */ + mcs = (stat >> RT2860_TXQ_MCS_SHIFT) & 0x7f; + pid = (stat >> RT2860_TXQ_PID_SHIFT) & 0xf; + if (mcs + 1 != pid) + amn->amn_retrycnt++; + } else { + amn->amn_retrycnt++; + ifp->if_oerrors++; + } + run_read_region_1(sc, RT2860_TX_STAT_FIFO, + (uint8_t *)&stat, sizeof stat); + } + DPRINTFN(3, "retrycnt=%d txcnt=%d success=%d\n", + amn->amn_retrycnt, amn->amn_txcnt, amn->amn_success); + } else { + /* read statistic counters (clear on read) and update AMRR state */ + error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta, + sizeof sta); + if (error != 0) + goto skip; + + DPRINTFN(3, "retrycnt=%d txcnt=%d failcnt=%d\n", + le32toh(sta[1]) >> 16, le32toh(sta[1]) & 0xffff, + le32toh(sta[0]) & 0xffff); + + wcid = RUN_AID2WCID(ni == NULL ? 0 : ni->ni_associd); + amn = &rvp->amn[wcid]; + + /* count failed TX as errors */ + ifp->if_oerrors += le32toh(sta[0]) & 0xffff; + + amn->amn_retrycnt = + (le32toh(sta[0]) & 0xffff) + /* failed TX count */ + (le32toh(sta[1]) >> 16); /* TX retransmission count */ + + amn->amn_txcnt = + amn->amn_retrycnt + + (le32toh(sta[1]) & 0xffff); /* successful TX count */ + + amn->amn_success = + (le32toh(sta[1]) >> 16) + + (le32toh(sta[1]) & 0xffff); + } + + ieee80211_amrr_choose(ni, amn); + +skip:; + RUN_UNLOCK(sc); + + if(ic->ic_opmode != IEEE80211_M_STA) + IEEE80211_NODE_ITERATE_LOCK(nt); +} + +static void +run_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct run_node *rn = (void *)ni; + struct ieee80211_rateset *rs = &ni->ni_rates; + uint8_t rate; + int ridx, i, j; + + DPRINTF("new assoc isnew=%d addr=%s\n", + isnew, ether_sprintf(ni->ni_macaddr)); + + for (i = 0; i < rs->rs_nrates; i++) { + rate = rs->rs_rates[i] & IEEE80211_RATE_VAL; + /* convert 802.11 rate to hardware rate index */ + for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++) + if (rt2860_rates[ridx].rate == rate) + break; + rn->ridx[i] = ridx; + /* determine rate of control response frames */ + for (j = i; j >= 0; j--) { + if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) && + rt2860_rates[rn->ridx[i]].phy == + rt2860_rates[rn->ridx[j]].phy) + break; + } + if (j >= 0) { + rn->ctl_ridx[i] = rn->ridx[j]; + } else { + /* no basic rate found, use mandatory one */ + rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx; + } + DPRINTF("rate=0x%02x ridx=%d ctl_ridx=%d\n", + rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]); + } +} + +/* + * Return the Rx chain with the highest RSSI for a given frame. + */ +static __inline uint8_t +run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi) +{ + uint8_t rxchain = 0; + + if (sc->nrxchains > 1) { + if (rxwi->rssi[1] > rxwi->rssi[rxchain]) + rxchain = 1; + if (sc->nrxchains > 2) + if (rxwi->rssi[2] > rxwi->rssi[rxchain]) + rxchain = 2; + } + return rxchain; +} + +static void +run_rx_frame(struct run_softc *sc, struct mbuf *m, uint32_t dmalen) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211vap *vap = &sc->sc_rvp->vap; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211_frame *wh; + struct ieee80211_node *ni; + struct rt2870_rxd *rxd; + struct rt2860_rxwi *rxwi; + uint32_t flags; + uint16_t len, phy; + uint8_t ant, rssi; + int8_t nf; + + rxwi = mtod(m, struct rt2860_rxwi *); + len = le16toh(rxwi->len) & 0xfff; + if (__predict_false(len > dmalen)) { + m_freem(m); + ifp->if_ierrors++; + DPRINTF("bad RXWI length %u > %u\n", len, dmalen); + return; + } + /* Rx descriptor is located at the end */ + rxd = (struct rt2870_rxd *)(mtod(m, caddr_t) + dmalen); + flags = le32toh(rxd->flags); + + if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) { + m_freem(m); + ifp->if_ierrors++; + DPRINTF("%s error.\n", (flags & RT2860_RX_CRCERR)?"CRC":"ICV"); + return; + } + + m->m_data += sizeof(struct rt2860_rxwi); + m->m_pkthdr.len = m->m_len -= sizeof(struct rt2860_rxwi); + + wh = mtod(m, struct ieee80211_frame *); + + if (wh->i_fc[1] & IEEE80211_FC1_WEP){ + wh->i_fc[1] &= ~IEEE80211_FC1_WEP; + m->m_flags |= M_WEP; + } + + if (flags & RT2860_RX_L2PAD){ + DPRINTFN(8, "received RT2860_RX_L2PAD frame\n"); + len += 2; + } + + if (__predict_false(flags & RT2860_RX_MICERR)) { + /* report MIC failures to net80211 for TKIP */ + ieee80211_notify_michael_failure(vap, wh, rxwi->keyidx); + m_freem(m); + ifp->if_ierrors++; + DPRINTF("MIC error. Someone is lying.\n"); + return; + } + + ant = run_maxrssi_chain(sc, rxwi); + rssi = rxwi->rssi[ant]; + nf = run_rssi2dbm(sc, rssi, ant); + + m->m_pkthdr.rcvif = ifp; + m->m_pkthdr.len = m->m_len = len; + + ni = ieee80211_find_rxnode(ic, + mtod(m, struct ieee80211_frame_min *)); + if (ni != NULL) { + (void)ieee80211_input(ni, m, rssi, nf); + ieee80211_free_node(ni); + } else { + (void)ieee80211_input_all(ic, m, rssi, nf); + } + + if(__predict_false(ieee80211_radiotap_active(ic))){ + struct run_rx_radiotap_header *tap = &sc->sc_rxtap; + + tap->wr_flags = 0; + tap->wr_chan_freq = htole16(ic->ic_bsschan->ic_freq); + tap->wr_chan_flags = htole16(ic->ic_bsschan->ic_flags); + tap->wr_antsignal = rssi; + tap->wr_antenna = ant; + tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant); + tap->wr_rate = 2; /* in case it can't be found below */ + phy = le16toh(rxwi->phy); + switch (phy & RT2860_PHY_MODE) { + case RT2860_PHY_CCK: + switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) { + case 0: tap->wr_rate = 2; break; + case 1: tap->wr_rate = 4; break; + case 2: tap->wr_rate = 11; break; + case 3: tap->wr_rate = 22; break; + } + if (phy & RT2860_PHY_SHPRE) + tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + break; + case RT2860_PHY_OFDM: + switch (phy & RT2860_PHY_MCS) { + case 0: tap->wr_rate = 12; break; + case 1: tap->wr_rate = 18; break; + case 2: tap->wr_rate = 24; break; + case 3: tap->wr_rate = 36; break; + case 4: tap->wr_rate = 48; break; + case 5: tap->wr_rate = 72; break; + case 6: tap->wr_rate = 96; break; + case 7: tap->wr_rate = 108; break; + } + break; + } + } +} + +static void +run_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct run_softc *sc = usbd_xfer_softc(xfer); + struct ifnet *ifp = sc->sc_ifp; + struct mbuf *m = NULL; + struct mbuf *m0; + uint32_t dmalen; + int xferlen; + + usbd_xfer_status(xfer, &xferlen, NULL, NULL, NULL); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + + DPRINTFN(15, "rx done, actlen=%d\n", xferlen); + + if (xferlen < sizeof (uint32_t) + + sizeof (struct rt2860_rxwi) + sizeof (struct rt2870_rxd)) { + DPRINTF("xfer too short %d\n", xferlen); + goto tr_setup; + } + + m = sc->rx_m; + sc->rx_m = NULL; + + /* FALLTHROUGH */ + case USB_ST_SETUP: +tr_setup: + if (sc->rx_m == NULL) { + sc->rx_m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, + MJUMPAGESIZE /* xfer can be bigger than MCLBYTES */); + } + if (sc->rx_m == NULL) { + DPRINTF("could not allocate mbuf - idle with stall\n"); + ifp->if_ierrors++; + usbd_xfer_set_stall(xfer); + usbd_xfer_set_frames(xfer, 0); + } else { + /* + * Directly loading a mbuf cluster into DMA to + * save some data copying. This works because + * there is only one cluster. + */ + usbd_xfer_set_frame_data(xfer, 0, + mtod(sc->rx_m, caddr_t), RUN_MAX_RXSZ); + usbd_xfer_set_frames(xfer, 1); + } + usbd_transfer_submit(xfer); + break; + + default: /* Error */ + if (error != USB_ERR_CANCELLED) { + /* try to clear stall first */ + usbd_xfer_set_stall(xfer); + + if (error == USB_ERR_TIMEOUT) + device_printf(sc->sc_dev, "device timeout\n"); + + ifp->if_ierrors++; + + goto tr_setup; + } + if(sc->rx_m != NULL){ + m_freem(sc->rx_m); + sc->rx_m = NULL; + } + break; + } + + if (m == NULL) + return; + + /* inputting all the frames must be last */ + + RUN_UNLOCK(sc); + + m->m_pkthdr.len = m->m_len = xferlen; + + /* HW can aggregate multiple 802.11 frames in a single USB xfer */ + for(;;) { + dmalen = le32toh(*mtod(m, uint32_t *)) & 0xffff; + + if ((dmalen == 0) || ((dmalen & 3) != 0)) { + DPRINTF("bad DMA length %u\n", dmalen); + break; + } + if ((dmalen + 8) > xferlen) { + DPRINTF("bad DMA length %u > %d\n", + dmalen + 8, xferlen); + break; + } + + /* If it is the last one or a single frame, we won't copy. */ + if((xferlen -= dmalen + 8) <= 8){ + /* trim 32-bit DMA-len header */ + m->m_data += 4; + m->m_pkthdr.len = m->m_len -= 4; + run_rx_frame(sc, m, dmalen); + break; + } + + /* copy aggregated frames to another mbuf */ + m0 = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (__predict_false(m0 == NULL)) { + DPRINTF("could not allocate mbuf\n"); + ifp->if_ierrors++; + break; + } + m_copydata(m, 4 /* skip 32-bit DMA-len header */, + dmalen + sizeof(struct rt2870_rxd), mtod(m0, caddr_t)); + m0->m_pkthdr.len = m0->m_len = + dmalen + sizeof(struct rt2870_rxd); + run_rx_frame(sc, m0, dmalen); + + /* update data ptr */ + m->m_data += dmalen + 8; + m->m_pkthdr.len = m->m_len -= dmalen + 8; + } + + RUN_LOCK(sc); +} + +static void +run_tx_free(struct run_endpoint_queue *pq, + struct run_tx_data *data, int txerr) +{ + if (data->m != NULL) { + if (data->m->m_flags & M_TXCB) + ieee80211_process_callback(data->ni, data->m, + txerr ? ETIMEDOUT : 0); + m_freem(data->m); + data->m = NULL; + + if(data->ni == NULL) { + DPRINTF("no node\n"); + } else { + ieee80211_free_node(data->ni); + data->ni = NULL; + } + } + + STAILQ_INSERT_TAIL(&pq->tx_fh, data, next); + pq->tx_nfree++; +} + +static void +run_bulk_tx_callbackN(struct usb_xfer *xfer, usb_error_t error, unsigned int index) +{ + struct run_softc *sc = usbd_xfer_softc(xfer); + struct ifnet *ifp = sc->sc_ifp; + struct run_tx_data *data; + struct ieee80211vap *vap = NULL; + struct usb_page_cache *pc; + struct run_endpoint_queue *pq = &sc->sc_epq[index]; + struct mbuf *m; + usb_frlength_t size; + unsigned int len; + int actlen; + int sumlen; + + usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL); + + switch (USB_GET_STATE(xfer)){ + case USB_ST_TRANSFERRED: + DPRINTFN(11, "transfer complete: %d " + "bytes @ index %d\n", actlen, index); + + data = usbd_xfer_get_priv(xfer); + + run_tx_free(pq, data, 0); + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + + usbd_xfer_set_priv(xfer, NULL); + + ifp->if_opackets++; + + /* FALLTHROUGH */ + case USB_ST_SETUP: +tr_setup: + data = STAILQ_FIRST(&pq->tx_qh); + if(data == NULL) + break; + + STAILQ_REMOVE_HEAD(&pq->tx_qh, next); + + m = data->m; + if (m->m_pkthdr.len > RUN_MAX_TXSZ) { + DPRINTF("data overflow, %u bytes\n", + m->m_pkthdr.len); + + ifp->if_oerrors++; + + run_tx_free(pq, data, 1); + + goto tr_setup; + } + + pc = usbd_xfer_get_frame(xfer, 0); + size = sizeof(data->desc); + usbd_copy_in(pc, 0, &data->desc, size); + usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len); + + vap = data->ni->ni_vap; + if (ieee80211_radiotap_active_vap(vap)) { + struct run_tx_radiotap_header *tap = &sc->sc_txtap; + + tap->wt_flags = 0; + tap->wt_rate = rt2860_rates[data->ridx].rate; + tap->wt_chan_freq = htole16(vap->iv_bss->ni_chan->ic_freq); + tap->wt_chan_flags = htole16(vap->iv_bss->ni_chan->ic_flags); + tap->wt_hwqueue = index; + if (data->mcs & RT2860_PHY_SHPRE) + tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; + + ieee80211_radiotap_tx(vap, m); + } + + /* align end on a 4-bytes boundary */ + len = (size + m->m_pkthdr.len + 3) & ~3; + + DPRINTFN(11, "sending frame len=%u xferlen=%u @ index %d\n", + m->m_pkthdr.len, len, index); + + usbd_xfer_set_frame_len(xfer, 0, len); + usbd_xfer_set_priv(xfer, data); + + usbd_transfer_submit(xfer); + + RUN_UNLOCK(sc); + run_start(ifp); + RUN_LOCK(sc); + + break; + + default: + DPRINTF("USB transfer error, %s\n", + usbd_errstr(error)); + + data = usbd_xfer_get_priv(xfer); + + ifp->if_oerrors++; + + if (data != NULL) { + run_tx_free(pq, data, error); + usbd_xfer_set_priv(xfer, NULL); + } + + if (error != USB_ERR_CANCELLED) { + if (error == USB_ERR_TIMEOUT) { + device_printf(sc->sc_dev, "device timeout\n"); + ieee80211_runtask(ifp->if_l2com, &sc->usb_timeout_task); + } + + /* + * Try to clear stall first, also if other + * errors occur, hence clearing stall + * introduces a 50 ms delay: + */ + usbd_xfer_set_stall(xfer); + goto tr_setup; + } + break; + } +} + +static void +run_bulk_tx_callback0(struct usb_xfer *xfer, usb_error_t error) +{ + run_bulk_tx_callbackN(xfer, error, 0); +} + +static void +run_bulk_tx_callback1(struct usb_xfer *xfer, usb_error_t error) +{ + run_bulk_tx_callbackN(xfer, error, 1); +} + +static void +run_bulk_tx_callback2(struct usb_xfer *xfer, usb_error_t error) +{ + run_bulk_tx_callbackN(xfer, error, 2); +} + +static void +run_bulk_tx_callback3(struct usb_xfer *xfer, usb_error_t error) +{ + run_bulk_tx_callbackN(xfer, error, 3); +} + +static void +run_bulk_tx_callback4(struct usb_xfer *xfer, usb_error_t error) +{ + run_bulk_tx_callbackN(xfer, error, 4); +} + +static void +run_bulk_tx_callback5(struct usb_xfer *xfer, usb_error_t error) +{ + run_bulk_tx_callbackN(xfer, error, 5); +} + +static void +run_set_tx_desc(struct run_softc *sc, struct run_tx_data *data, + uint8_t wflags, uint8_t xflags, uint8_t opflags, uint8_t dflags, + uint8_t type, uint8_t pad) +{ + struct mbuf *m = data->m; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ieee80211vap *vap = &sc->sc_rvp->vap; + struct ieee80211_frame *wh; + struct rt2870_txd *txd; + struct rt2860_txwi *txwi; + int xferlen; + uint8_t mcs; + uint8_t ridx = data->ridx; + + /* get MCS code from rate index */ + data->mcs = mcs = rt2860_rates[ridx].mcs; + + xferlen = sizeof(*txwi) + m->m_pkthdr.len; + + /* roundup to 32-bit alignment */ + xferlen = (xferlen + 3) & ~3; + + txd = (struct rt2870_txd *)&data->desc; + txd->flags = dflags; + txd->len = htole16(xferlen); + + /* setup TX Wireless Information */ + txwi = (struct rt2860_txwi *)(txd + 1); + txwi->flags = wflags; + txwi->xflags = xflags; + txwi->wcid = (type == IEEE80211_FC0_TYPE_DATA) ? + RUN_AID2WCID(data->ni->ni_associd) : 0xff; + txwi->len = htole16(m->m_pkthdr.len - pad); + if (rt2860_rates[ridx].phy == IEEE80211_T_DS) { + txwi->phy = htole16(RT2860_PHY_CCK); + if (ridx != RT2860_RIDX_CCK1 && + (ic->ic_flags & IEEE80211_F_SHPREAMBLE)) + mcs |= RT2860_PHY_SHPRE; + } else + txwi->phy = htole16(RT2860_PHY_OFDM); + txwi->phy |= htole16(mcs); + + wh = mtod(m, struct ieee80211_frame *); + + /* check if RTS/CTS or CTS-to-self protection is required */ + if (!IEEE80211_IS_MULTICAST(wh->i_addr1) && + (m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold || + ((ic->ic_flags & IEEE80211_F_USEPROT) && + rt2860_rates[ridx].phy == IEEE80211_T_OFDM))) + txwi->txop = RT2860_TX_TXOP_HT | opflags; + else + txwi->txop = RT2860_TX_TXOP_BACKOFF | opflags; +} + +/* This function must be called locked */ +static int +run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ieee80211vap *vap = &sc->sc_rvp->vap; + struct ieee80211_frame *wh; + const struct ieee80211_txparam *tp; + struct run_tx_data *data; + uint16_t qos; + uint16_t dur; + uint8_t type; + uint8_t tid; + uint8_t qid; + uint8_t qflags; + uint8_t pad; + uint8_t xflags = 0; + int hasqos; + int ridx; + int ctl_ridx; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + wh = mtod(m, struct ieee80211_frame *); + + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + /* + * There are 7 bulk endpoints: 1 for RX + * and 6 for TX (4 EDCAs + HCCA + Prio). + * Update 03-14-2009: some devices like the Planex GW-US300MiniS + * seem to have only 4 TX bulk endpoints (Fukaumi Naoki). + */ + if ((hasqos = IEEE80211_QOS_HAS_SEQ(wh))) { + uint8_t *frm; + + if(IEEE80211_HAS_ADDR4(wh)) + frm = ((struct ieee80211_qosframe_addr4 *)wh)->i_qos; + else + frm =((struct ieee80211_qosframe *)wh)->i_qos; + + qos = le16toh(*(const uint16_t *)frm); + tid = qos & IEEE80211_QOS_TID; + qid = TID_TO_WME_AC(tid); + pad = 2; + } else { + qos = 0; + tid = 0; + qid = WME_AC_BE; + pad = 0; + } + qflags = (qid < 4) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_HCCA; + + DPRINTFN(8, "qos %d\tqid %d\ttid %d\tqflags %x\n", + qos, qid, tid, qflags); + + tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; + + /* pickup a rate index */ + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || + type != IEEE80211_FC0_TYPE_DATA) { + ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ? + RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1; + ctl_ridx = rt2860_rates[ridx].ctl_ridx; + } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { + ridx = sc->fixed_ridx; + ctl_ridx = rt2860_rates[ridx].ctl_ridx; + } else { + for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++){ + if (rt2860_rates[ridx].rate == ni->ni_txrate) + break; + } + ctl_ridx = rt2860_rates[ridx].ctl_ridx; + } + + if (!IEEE80211_IS_MULTICAST(wh->i_addr1) && + (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) != + IEEE80211_QOS_ACKPOLICY_NOACK)) { + xflags |= RT2860_TX_ACK; + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) + dur = rt2860_rates[ridx].sp_ack_dur; + else + dur = rt2860_rates[ridx].lp_ack_dur; + *(uint16_t *)wh->i_dur = htole16(dur + sc->sifs); + } + + /* reserve slots for mgmt packets, just in case */ + if (sc->sc_epq[qid].tx_nfree < 3) { + DPRINTFN(10, "tx ring %d is full\n", qid); + return (-1); + } + + data = STAILQ_FIRST(&sc->sc_epq[qid].tx_fh); + STAILQ_REMOVE_HEAD(&sc->sc_epq[qid].tx_fh, next); + sc->sc_epq[qid].tx_nfree--; + + data->m = m; + data->ni = ni; + data->ridx = ridx; + + run_set_tx_desc(sc, data, 0, xflags, 0, qflags, type, pad); + + STAILQ_INSERT_TAIL(&sc->sc_epq[qid].tx_qh, data, next); + + usbd_transfer_start(sc->sc_xfer[qid]); + + DPRINTFN(8, "sending data frame len=%d rate=%d qid=%d\n", m->m_pkthdr.len + + (int)(sizeof (struct rt2870_txd) + sizeof (struct rt2860_rxwi)), + rt2860_rates[ridx].rate, qid); + + return (0); +} + +static int +run_tx_mgt(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni) +{ + const struct ieee80211_txparam *tp; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = ifp->if_l2com; + struct run_tx_data *data; + struct ieee80211_frame *wh; + int ridx; + uint16_t dur; + uint8_t type; + uint8_t xflags = 0; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + wh = mtod(m, struct ieee80211_frame *); + + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; + + if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { + xflags |= RT2860_TX_ACK; + + dur = ieee80211_ack_duration(ic->ic_rt, tp->mgmtrate, + ic->ic_flags & IEEE80211_F_SHPREAMBLE); + *(uint16_t *)wh->i_dur = htole16(dur); + + /* tell hardware to add timestamp for probe responses */ + if ((wh->i_fc[0] & + (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == + (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP)) + xflags |= RT2860_TX_TS; + } + + if (sc->sc_epq[0].tx_nfree == 0) { + /* let caller free mbuf */ + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + return (EIO); + } + data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh); + STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next); + sc->sc_epq[0].tx_nfree--; + + data->m = m; + data->ni = ni; + for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++) + if (rt2860_rates[ridx].rate == tp->mgmtrate) + break; + data->ridx = ridx; + + run_set_tx_desc(sc, data, 0, xflags, 0, RT2860_TX_QSEL_MGMT, + wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK, 0); + + DPRINTFN(10, "sending mgt frame len=%d rate=%d\n", m->m_pkthdr.len + + (int)(sizeof (struct rt2870_txd) + sizeof (struct rt2860_rxwi)), + tp->mgmtrate); + + STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next); + + usbd_transfer_start(sc->sc_xfer[0]); + + return (0); +} + +static int +run_sendprot(struct run_softc *sc, + const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate) +{ + struct ieee80211com *ic = ni->ni_ic; + struct ieee80211_frame *wh; + struct run_tx_data *data; + struct mbuf *mprot; + int ridx; + int protrate; + int ackrate; + int pktlen; + int isshort; + uint16_t dur; + uint8_t type; + uint8_t wflags; + uint8_t txflags = 0; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY, + ("protection %d", prot)); + + wh = mtod(m, struct ieee80211_frame *); + pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN; + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + protrate = ieee80211_ctl_rate(ic->ic_rt, rate); + ackrate = ieee80211_ack_rate(ic->ic_rt, rate); + + isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0; + dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort); + + ieee80211_ack_duration(ic->ic_rt, rate, isshort); + wflags = RT2860_TX_FRAG; + + /* check that there are free slots before allocating the mbuf */ + if (sc->sc_epq[0].tx_nfree == 0) { + /* let caller free mbuf */ + sc->sc_ifp->if_drv_flags |= IFF_DRV_OACTIVE; + return (ENOBUFS); + } + + if (prot == IEEE80211_PROT_RTSCTS) { + /* NB: CTS is the same size as an ACK */ + dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort); + txflags |= RT2860_TX_ACK; + mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur); + } else { + mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur); + } + if (mprot == NULL) { + sc->sc_ifp->if_oerrors++; + DPRINTF("could not allocate mbuf\n"); + return (ENOBUFS); + } + + data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh); + STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next); + sc->sc_epq[0].tx_nfree--; + + data->m = mprot; + data->ni = ieee80211_ref_node(ni); + + for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++) + if (rt2860_rates[ridx].rate == protrate) + break; + data->ridx = ridx; + + run_set_tx_desc(sc, data, wflags, txflags, 0, + RT2860_TX_QSEL_EDCA, type, 0); + + DPRINTFN(1, "sending prot len=%u rate=%u\n", + m->m_pkthdr.len, rate); + + STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next); + + usbd_transfer_start(sc->sc_xfer[0]); + + return (0); +} + +static int +run_tx_param(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni, + const struct ieee80211_bpf_params *params) +{ + struct ieee80211com *ic = ni->ni_ic; + struct ieee80211_frame *wh; + struct run_tx_data *data; + uint8_t type; + uint8_t opflags; + uint8_t txflags; + int ridx; + int rate; + int error; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + KASSERT(params != NULL, ("no raw xmit params")); + + wh = mtod(m, struct ieee80211_frame *); + type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; + + rate = params->ibp_rate0; + if (!ieee80211_isratevalid(ic->ic_rt, rate)) { + /* let caller free mbuf */ + return (EINVAL); + } + + opflags = 0; + txflags = 0; + if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0) + txflags |= RT2860_TX_ACK; + if (params->ibp_flags & (IEEE80211_BPF_RTS|IEEE80211_BPF_CTS)) { + error = run_sendprot(sc, m, ni, + params->ibp_flags & IEEE80211_BPF_RTS ? + IEEE80211_PROT_RTSCTS : IEEE80211_PROT_CTSONLY, + rate); + if (error) { + /* let caller free mbuf */ + return (error); + } + opflags |= /*XXX RT2573_TX_LONG_RETRY |*/ RT2860_TX_TXOP_SIFS; + } + + if (sc->sc_epq[0].tx_nfree == 0) { + /* let caller free mbuf */ + sc->sc_ifp->if_drv_flags |= IFF_DRV_OACTIVE; + DPRINTF("sending raw frame, but tx ring is full\n"); + return (EIO); + } + data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh); + STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next); + sc->sc_epq[0].tx_nfree--; + + data->m = m; + data->ni = ni; + for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++) + if (rt2860_rates[ridx].rate == rate) + break; + data->ridx = ridx; + + run_set_tx_desc(sc, data, 0, txflags, opflags, + RT2860_TX_QSEL_EDCA, type, 0); + + DPRINTFN(10, "sending raw frame len=%u rate=%u\n", + m->m_pkthdr.len, rate); + + STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next); + + usbd_transfer_start(sc->sc_xfer[0]); + + return (0); +} + +static int +run_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, + const struct ieee80211_bpf_params *params) +{ + struct ifnet *ifp = ni->ni_ic->ic_ifp; + struct run_softc *sc = ifp->if_softc; + int error; + + RUN_LOCK(sc); + + /* prevent management frames from being sent if we're not ready */ + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + error = ENETDOWN; + goto bad; + } + + if (params == NULL) { + /* tx mgt packet */ + if ((error = run_tx_mgt(sc, m, ni)) != 0){ + ifp->if_oerrors++; + DPRINTF("mgt tx failed\n"); + goto bad; + } + } else { + /* tx raw packet with param */ + if ((error = run_tx_param(sc, m, ni, params)) != 0){ + ifp->if_oerrors++; + DPRINTF("tx with param failed\n"); + goto bad; + } + } + + ifp->if_opackets++; + + RUN_UNLOCK(sc); + + return (0); + +bad: + RUN_UNLOCK(sc); + if(m != NULL) + m_freem(m); + ieee80211_free_node(ni); + + return (error); +} + +static void +run_start(struct ifnet *ifp) +{ + struct run_softc *sc = ifp->if_softc; + struct ieee80211_node *ni; + struct mbuf *m; + + RUN_LOCK(sc); + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + RUN_UNLOCK(sc); + return; + } + + for (;;) { + /* send data frames */ + IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) + break; + + ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; + if (run_tx(sc, m, ni) != 0) { + IFQ_DRV_PREPEND(&ifp->if_snd, m); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } + } + + RUN_UNLOCK(sc); +} + +static int +run_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct run_softc *sc = ifp->if_softc; + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ifreq *ifr = (struct ifreq *) data; + int error = 0, startall = 0; + + switch (cmd) { + case SIOCSIFFLAGS: + RUN_LOCK(sc); + if (ifp->if_flags & IFF_UP) { + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)){ + run_init_locked(sc); + startall = 1; + } else + run_update_promisc_locked(ifp); + } else { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + run_stop(sc); + } + RUN_UNLOCK(sc); + if(startall) + ieee80211_start_all(ic); + break; + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); + break; + case SIOCGIFADDR: + error = ether_ioctl(ifp, cmd, data); + break; + default: + error = EINVAL; + break; + } + + return (error); +} + +static void +run_select_chan_group(struct run_softc *sc, int group) +{ + uint32_t tmp; + + run_bbp_write(sc, 62, 0x37 - sc->lna[group]); + run_bbp_write(sc, 63, 0x37 - sc->lna[group]); + run_bbp_write(sc, 64, 0x37 - sc->lna[group]); + run_bbp_write(sc, 86, 0x00); + + if (group == 0) { + if (sc->ext_2ghz_lna) { + run_bbp_write(sc, 82, 0x62); + run_bbp_write(sc, 75, 0x46); + } else { + run_bbp_write(sc, 82, 0x84); + run_bbp_write(sc, 75, 0x50); + } + } else { + if (sc->ext_5ghz_lna) { + run_bbp_write(sc, 82, 0xf2); + run_bbp_write(sc, 75, 0x46); + } else { + run_bbp_write(sc, 82, 0xf2); + run_bbp_write(sc, 75, 0x50); + } + } + + run_read(sc, RT2860_TX_BAND_CFG, &tmp); + tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P); + tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P; + run_write(sc, RT2860_TX_BAND_CFG, tmp); + + /* enable appropriate Power Amplifiers and Low Noise Amplifiers */ + tmp = RT2860_RFTR_EN | RT2860_TRSW_EN; + if (group == 0) { /* 2GHz */ + tmp |= RT2860_PA_PE_G0_EN | RT2860_LNA_PE_G0_EN; + if (sc->ntxchains > 1) + tmp |= RT2860_PA_PE_G1_EN; + if (sc->nrxchains > 1) + tmp |= RT2860_LNA_PE_G1_EN; + } else { /* 5GHz */ + tmp |= RT2860_PA_PE_A0_EN | RT2860_LNA_PE_A0_EN; + if (sc->ntxchains > 1) + tmp |= RT2860_PA_PE_A1_EN; + if (sc->nrxchains > 1) + tmp |= RT2860_LNA_PE_A1_EN; + } + run_write(sc, RT2860_TX_PIN_CFG, tmp); + + /* set initial AGC value */ + if (group == 0) + run_bbp_write(sc, 66, 0x2e + sc->lna[0]); + else + run_bbp_write(sc, 66, 0x32 + (sc->lna[group] * 5) / 3); +} + +static void +run_rt2870_set_chan(struct run_softc *sc, uint32_t chan) +{ + const struct rfprog *rfprog = rt2860_rf2850; + uint32_t r2, r3, r4; + int8_t txpow1, txpow2; + int i; + + /* find the settings for this channel (we know it exists) */ + for (i = 0; rfprog[i].chan != chan; i++); + + r2 = rfprog[i].r2; + if (sc->ntxchains == 1) + r2 |= 1 << 12; /* 1T: disable Tx chain 2 */ + if (sc->nrxchains == 1) + r2 |= 1 << 15 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */ + else if (sc->nrxchains == 2) + r2 |= 1 << 4; /* 2R: disable Rx chain 3 */ + + /* use Tx power values from EEPROM */ + txpow1 = sc->txpow1[i]; + txpow2 = sc->txpow2[i]; + if (chan > 14) { + if (txpow1 >= 0) + txpow1 = txpow1 << 1; + else + txpow1 = (7 + txpow1) << 1 | 1; + if (txpow2 >= 0) + txpow2 = txpow2 << 1; + else + txpow2 = (7 + txpow2) << 1 | 1; + } + r3 = rfprog[i].r3 | txpow1 << 7; + r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4; + + run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); + run_rt2870_rf_write(sc, RT2860_RF2, r2); + run_rt2870_rf_write(sc, RT2860_RF3, r3); + run_rt2870_rf_write(sc, RT2860_RF4, r4); + + run_delay(sc, 10); + + run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); + run_rt2870_rf_write(sc, RT2860_RF2, r2); + run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1); + run_rt2870_rf_write(sc, RT2860_RF4, r4); + + run_delay(sc, 10); + + run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); + run_rt2870_rf_write(sc, RT2860_RF2, r2); + run_rt2870_rf_write(sc, RT2860_RF3, r3); + run_rt2870_rf_write(sc, RT2860_RF4, r4); +} + +static void +run_rt3070_set_chan(struct run_softc *sc, uint32_t chan) +{ + int8_t txpow1, txpow2; + uint8_t rf; + + /* RT3070 is 2GHz only */ + KASSERT(chan >= 1 && chan <= 14, ("wrong channel selected\n")); + + /* use Tx power values from EEPROM */ + txpow1 = sc->txpow1[chan - 1]; + txpow2 = sc->txpow2[chan - 1]; + + run_rt3070_rf_write(sc, 2, run_rf3020_freqs[chan - 1].n); + run_rt3070_rf_write(sc, 3, run_rf3020_freqs[chan - 1].k); + run_rt3070_rf_read(sc, 6, &rf); + rf = (rf & ~0x03) | run_rf3020_freqs[chan - 1].r; + run_rt3070_rf_write(sc, 6, rf); + + /* set Tx0 power */ + run_rt3070_rf_read(sc, 12, &rf); + rf = (rf & ~0x1f) | txpow1; + run_rt3070_rf_write(sc, 12, rf); + + /* set Tx1 power */ + run_rt3070_rf_read(sc, 13, &rf); + rf = (rf & ~0x1f) | txpow2; + run_rt3070_rf_write(sc, 13, rf); + + run_rt3070_rf_read(sc, 1, &rf); + rf &= ~0xfc; + if (sc->ntxchains == 1) + rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */ + else if (sc->ntxchains == 2) + rf |= 1 << 7; /* 2T: disable Tx chain 3 */ + if (sc->nrxchains == 1) + rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */ + else if (sc->nrxchains == 2) + rf |= 1 << 6; /* 2R: disable Rx chain 3 */ + run_rt3070_rf_write(sc, 1, rf); + + /* set RF offset */ + run_rt3070_rf_read(sc, 23, &rf); + rf = (rf & ~0x7f) | sc->freq; + run_rt3070_rf_write(sc, 23, rf); + + /* program RF filter */ + run_rt3070_rf_write(sc, 24, sc->rf24_20mhz); + run_rt3070_rf_write(sc, 31, sc->rf24_20mhz); + + /* enable RF tuning */ + run_rt3070_rf_read(sc, 7, &rf); + run_rt3070_rf_write(sc, 7, rf | 0x01); +} + +static void +run_set_rx_antenna(struct run_softc *sc, int aux) +{ + uint32_t tmp; + + if (aux) { + run_read(sc, RT2860_PCI_EECTRL, &tmp); + run_write(sc, RT2860_PCI_EECTRL, tmp & ~RT2860_C); + run_read(sc, RT2860_GPIO_CTRL, &tmp); + run_write(sc, RT2860_GPIO_CTRL, (tmp & ~0x0808) | 0x08); + } else { + run_read(sc, RT2860_PCI_EECTRL, &tmp); + run_write(sc, RT2860_PCI_EECTRL, tmp | RT2860_C); + run_read(sc, RT2860_GPIO_CTRL, &tmp); + run_write(sc, RT2860_GPIO_CTRL, tmp & ~0x0808); + } +} + +static int +run_set_chan(struct run_softc *sc, struct ieee80211_channel *c) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + uint32_t chan, group; + + chan = ieee80211_chan2ieee(ic, c); + if (chan == 0 || chan == IEEE80211_CHAN_ANY) + return EINVAL; + + if ((sc->mac_rev >> 16) >= 0x3070) + run_rt3070_set_chan(sc, chan); + else + run_rt2870_set_chan(sc, chan); + + /* 802.11a uses a 16 microseconds short interframe space */ + sc->sifs = IEEE80211_IS_CHAN_5GHZ(c) ? 16 : 10; + + /* determine channel group */ + if (chan <= 14) + group = 0; + else if (chan <= 64) + group = 1; + else if (chan <= 128) + group = 2; + else + group = 3; + + /* XXX necessary only when group has changed! */ + run_select_chan_group(sc, group); + + run_delay(sc, 10); + + return 0; +} + +static void +run_set_channel(struct ieee80211com *ic) +{ + struct run_softc *sc = ic->ic_ifp->if_softc; + + RUN_LOCK(sc); + run_set_chan(sc, ic->ic_curchan); + RUN_UNLOCK(sc); + + return; +} + +static void +run_scan_start(struct ieee80211com *ic) +{ + struct run_softc *sc = ic->ic_ifp->if_softc; + uint32_t tmp; + + RUN_LOCK(sc); + + /* abort TSF synchronization */ + run_read(sc, RT2860_BCN_TIME_CFG, &tmp); + run_write(sc, RT2860_BCN_TIME_CFG, + tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN | + RT2860_TBTT_TIMER_EN)); + run_set_bssid(sc, sc->sc_ifp->if_broadcastaddr); + + RUN_UNLOCK(sc); + + return; +} + +static void +run_scan_end(struct ieee80211com *ic) +{ + struct run_softc *sc = ic->ic_ifp->if_softc; + + RUN_LOCK(sc); + + run_enable_tsf_sync(sc); + /* XXX keep local copy */ + run_set_bssid(sc, sc->sc_bssid); + + RUN_UNLOCK(sc); + + return; +} + +static uint8_t +run_rate2mcs(uint8_t rate) +{ + switch (rate) { + /* CCK rates */ + case 2: return 0; + case 4: return 1; + case 11: return 2; + case 22: return 3; + /* OFDM rates */ + case 12: return 0; + case 18: return 1; + case 24: return 2; + case 36: return 3; + case 48: return 4; + case 72: return 5; + case 96: return 6; + case 108: return 7; + } + return 0; /* shouldn't get here */ +} + +static void +run_update_beacon_locked(struct ieee80211vap *vap, int item) +{ + struct ieee80211com *ic = vap->iv_ic; + struct run_softc *sc = ic->ic_ifp->if_softc; + struct rt2860_txwi txwi; + struct mbuf *m; + int rate; + + if ((m = ieee80211_beacon_alloc(vap->iv_bss, &RUN_VAP(vap)->bo)) == NULL) + return; + + memset(&txwi, 0, sizeof txwi); + txwi.wcid = 0xff; + txwi.len = htole16(m->m_pkthdr.len); + /* send beacons at the lowest available rate */ + rate = (ic->ic_curmode == IEEE80211_MODE_11A) ? 12 : 2; + txwi.phy = htole16(run_rate2mcs(rate)); + if (rate == 12) + txwi.phy |= htole16(RT2860_PHY_OFDM); + txwi.txop = RT2860_TX_TXOP_HT; + txwi.flags = RT2860_TX_TS; + + run_write_region_1(sc, RT2860_BCN_BASE(0), + (u_int8_t *)&txwi, sizeof txwi); + run_write_region_1(sc, RT2860_BCN_BASE(0) + sizeof txwi, + mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1); /* roundup len */ + + m_freem(m); + + return; +} + +static void +run_update_beacon(struct ieee80211vap *vap, int item) +{ + struct ieee80211com *ic = vap->iv_ic; + struct run_softc *sc = ic->ic_ifp->if_softc; + + IEEE80211_UNLOCK(ic); + RUN_LOCK(sc); + run_update_beacon_locked(vap, item); + RUN_UNLOCK(sc); + IEEE80211_LOCK(ic); + + return; +} + +static void +run_updateprot(struct ieee80211com *ic) +{ + struct run_softc *sc = ic->ic_ifp->if_softc; + uint32_t tmp; + + tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL; + /* setup protection frame rate (MCS code) */ + tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ? + rt2860_rates[RT2860_RIDX_OFDM6].mcs : + rt2860_rates[RT2860_RIDX_CCK11].mcs; + + /* CCK frames don't require protection */ + run_write(sc, RT2860_CCK_PROT_CFG, tmp); + if (ic->ic_flags & IEEE80211_F_USEPROT) { + if (ic->ic_protmode == IEEE80211_PROT_RTSCTS) + tmp |= RT2860_PROT_CTRL_RTS_CTS; + else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) + tmp |= RT2860_PROT_CTRL_CTS; + } + run_write(sc, RT2860_OFDM_PROT_CFG, tmp); +} + +static void +run_usb_timeout_cb(void *arg, int pending) +{ + struct run_softc *sc = arg; + struct ieee80211vap *vap = &sc->sc_rvp->vap; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + if(vap->iv_state == IEEE80211_S_RUN && + vap->iv_opmode != IEEE80211_M_STA) + run_reset_livelock(sc); + else if(vap->iv_state == IEEE80211_S_SCAN){ + DPRINTF("timeout caused by scan\n"); + /* cancel bgscan */ + ieee80211_cancel_scan(vap); + } else + DPRINTF("timeout by unknown cause\n"); +} + +static void +run_reset_livelock(struct run_softc *sc) +{ + uint32_t tmp; + + /* + * In IBSS or HostAP modes (when the hardware sends beacons), the MAC + * can run into a livelock and start sending CTS-to-self frames like + * crazy if protection is enabled. Reset MAC/BBP for a while + */ + run_read(sc, RT2860_DEBUG, &tmp); + if((tmp & (1 << 29)) && (tmp & (1 << 7 | 1 << 5))){ + DPRINTF("CTS-to-self livelock detected\n"); + run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_SRST); + run_delay(sc, 1); + run_write(sc, RT2860_MAC_SYS_CTRL, + RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); + } +} + +static void +run_update_promisc_locked(struct ifnet *ifp) +{ + struct run_softc *sc = ifp->if_softc; + uint32_t tmp; + + run_read(sc, RT2860_RX_FILTR_CFG, &tmp); + + tmp |= RT2860_DROP_UC_NOME; + if (ifp->if_flags & IFF_PROMISC) + tmp &= ~RT2860_DROP_UC_NOME; + + run_write(sc, RT2860_RX_FILTR_CFG, tmp); + + DPRINTF("%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ? + "entering" : "leaving"); +} + +static void +run_update_promisc(struct ifnet *ifp) +{ + struct run_softc *sc = ifp->if_softc; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; + + RUN_LOCK(sc); + run_update_promisc_locked(ifp); + RUN_UNLOCK(sc); +} + +static void +run_enable_tsf_sync(struct run_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); + uint32_t tmp; + + run_read(sc, RT2860_BCN_TIME_CFG, &tmp); + tmp &= ~0x1fffff; + tmp |= vap->iv_bss->ni_intval * 16; + tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN; + + if (vap->iv_opmode == IEEE80211_M_STA) { + /* + * Local TSF is always updated with remote TSF on beacon + * reception. + */ + tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT; + } else if (vap->iv_opmode == IEEE80211_M_IBSS) { + tmp |= RT2860_BCN_TX_EN; + /* + * Local TSF is updated with remote TSF on beacon reception + * only if the remote TSF is greater than local TSF. + */ + tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT; + } else if (vap->iv_opmode == IEEE80211_M_HOSTAP) { + tmp |= RT2860_BCN_TX_EN; + /* SYNC with nobody */ + tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT; + } else + DPRINTF("Enabling TSF failed. undefined opmode\n"); + + run_write(sc, RT2860_BCN_TIME_CFG, tmp); +} + +static void +run_enable_mrr(struct run_softc *sc) +{ +#define CCK(mcs) (mcs) +#define OFDM(mcs) (1 << 3 | (mcs)) + run_write(sc, RT2860_LG_FBK_CFG0, + OFDM(6) << 28 | /* 54->48 */ + OFDM(5) << 24 | /* 48->36 */ + OFDM(4) << 20 | /* 36->24 */ + OFDM(3) << 16 | /* 24->18 */ + OFDM(2) << 12 | /* 18->12 */ + OFDM(1) << 8 | /* 12-> 9 */ + OFDM(0) << 4 | /* 9-> 6 */ + OFDM(0)); /* 6-> 6 */ + + run_write(sc, RT2860_LG_FBK_CFG1, + CCK(2) << 12 | /* 11->5.5 */ + CCK(1) << 8 | /* 5.5-> 2 */ + CCK(0) << 4 | /* 2-> 1 */ + CCK(0)); /* 1-> 1 */ +#undef OFDM +#undef CCK +} + +static void +run_set_txpreamble(struct run_softc *sc) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + uint32_t tmp; + + run_read(sc, RT2860_AUTO_RSP_CFG, &tmp); + if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) + tmp |= RT2860_CCK_SHORT_EN; + else + tmp &= ~RT2860_CCK_SHORT_EN; + run_write(sc, RT2860_AUTO_RSP_CFG, tmp); +} + +static void +run_set_basicrates(struct run_softc *sc) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + + /* set basic rates mask */ + if (ic->ic_curmode == IEEE80211_MODE_11B) + run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003); + else if (ic->ic_curmode == IEEE80211_MODE_11A) + run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150); + else /* 11g */ + run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f); +} + +static void +run_set_leds(struct run_softc *sc, uint16_t which) +{ + (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS, + which | (sc->leds & 0x7f)); +} + +static void +run_set_bssid(struct run_softc *sc, const uint8_t *bssid) +{ + run_write(sc, RT2860_MAC_BSSID_DW0, + bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24); + run_write(sc, RT2860_MAC_BSSID_DW1, + bssid[4] | bssid[5] << 8); +} + +static void +run_set_macaddr(struct run_softc *sc, const uint8_t *addr) +{ + run_write(sc, RT2860_MAC_ADDR_DW0, + addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24); + run_write(sc, RT2860_MAC_ADDR_DW1, + addr[4] | addr[5] << 8 | 0xff << 16); +} + +/* ARGSUSED */ +static void +run_updateslot(struct ifnet *ifp) +{ + struct run_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + + run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp); + tmp &= ~0xff; + tmp |= (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20; + run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp); +} + +static int8_t +run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + struct ieee80211_channel *c = ic->ic_curchan; + int delta; + + if (IEEE80211_IS_CHAN_5GHZ(c)) { + uint32_t chan = ieee80211_chan2ieee(ic, c); + delta = sc->rssi_5ghz[rxchain]; + + /* determine channel group */ + if (chan <= 64) + delta -= sc->lna[1]; + else if (chan <= 128) + delta -= sc->lna[2]; + else + delta -= sc->lna[3]; + } else + delta = sc->rssi_2ghz[rxchain] - sc->lna[0]; + + return -12 - delta - rssi; +} + +static int +run_bbp_init(struct run_softc *sc) +{ + int i, error, ntries; + uint8_t bbp0; + + /* wait for BBP to wake up */ + for (ntries = 0; ntries < 20; ntries++) { + if ((error = run_bbp_read(sc, 0, &bbp0)) != 0) + return error; + if (bbp0 != 0 && bbp0 != 0xff) + break; + } + if (ntries == 20) + return ETIMEDOUT; + + /* initialize BBP registers to default values */ + for (i = 0; i < nitems(rt2860_def_bbp); i++) { + run_bbp_write(sc, rt2860_def_bbp[i].reg, + rt2860_def_bbp[i].val); + } + + /* fix BBP84 for RT2860E */ + if ((sc->mac_rev >> 16) == 0x2860 && (sc->mac_rev & 0xffff) != 0x0101) + run_bbp_write(sc, 84, 0x19); + + if ((sc->mac_rev >> 16) >= 0x3070) { + run_bbp_write(sc, 79, 0x13); + run_bbp_write(sc, 80, 0x05); + run_bbp_write(sc, 81, 0x33); + /* XXX RT3090 needs more */ + } else if (sc->mac_rev == 0x28600100) { + run_bbp_write(sc, 69, 0x16); + run_bbp_write(sc, 73, 0x12); + } + return 0; +} + +static int +run_rt3070_rf_init(struct run_softc *sc) +{ + uint32_t tmp; + uint8_t rf, bbp4; + int i; + + run_rt3070_rf_read(sc, 30, &rf); + /* toggle RF R30 bit 7 */ + run_rt3070_rf_write(sc, 30, rf | 0x80); + run_delay(sc, 10); + run_rt3070_rf_write(sc, 30, rf & ~0x80); + + /* initialize RF registers to default value */ + for (i = 0; i < nitems(rt3070_def_rf); i++) { + run_rt3070_rf_write(sc, rt3070_def_rf[i].reg, + rt3070_def_rf[i].val); + } + if ((sc->mac_rev >> 16) == 0x3070) { + /* change voltage from 1.2V to 1.35V for RT3070 */ + run_read(sc, RT3070_LDO_CFG0, &tmp); + tmp = (tmp & ~0x0f000000) | 0x0d000000; + run_write(sc, RT3070_LDO_CFG0, tmp); + + } else if ((sc->mac_rev >> 16) == 0x3071) { + run_rt3070_rf_read(sc, 6, &rf); + run_rt3070_rf_write(sc, 6, rf | 0x40); + run_rt3070_rf_write(sc, 31, 0x14); + + run_read(sc, RT3070_LDO_CFG0, &tmp); + tmp &= ~0x1f000000; + if ((sc->mac_rev & 0xffff) < 0x0211) + tmp |= 0x0d000000; + else + tmp |= 0x01000000; + run_write(sc, RT3070_LDO_CFG0, tmp); + + /* patch LNA_PE_G1 */ + run_read(sc, RT3070_GPIO_SWITCH, &tmp); + run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20); + } else if((sc->mac_rev >> 16) == 0x3572){ + if ((sc->mac_rev & 0xffff) < 0x0211){ + run_read(sc, RT3070_LDO_CFG0, &tmp); + tmp = (tmp & ~0x0f000000) | 0x0d000000; + run_write(sc, RT3070_LDO_CFG0, tmp); + } else { + run_read(sc, RT3070_LDO_CFG0, &tmp); + tmp = (tmp & ~0x1f000000) | 0x0d000000; + run_write(sc, RT3070_LDO_CFG0, tmp); + + run_delay(sc, 1); /* wait for 1msec */ + + tmp = (tmp & ~0x1f000000) | 0x01000000; + run_write(sc, RT3070_LDO_CFG0, tmp); + } + } + + /* select 20MHz bandwidth */ + run_rt3070_rf_read(sc, 31, &rf); + run_rt3070_rf_write(sc, 31, rf & ~0x20); + + /* calibrate filter for 20MHz bandwidth */ + sc->rf24_20mhz = 0x1f; /* default value */ + run_rt3070_filter_calib(sc, 0x07, 0x16, &sc->rf24_20mhz); + + /* select 40MHz bandwidth */ + run_bbp_read(sc, 4, &bbp4); + run_bbp_write(sc, 4, (bbp4 & ~0x08) | 0x10); + + /* calibrate filter for 40MHz bandwidth */ + sc->rf24_40mhz = 0x2f; /* default value */ + run_rt3070_filter_calib(sc, 0x27, 0x19, &sc->rf24_40mhz); + + /* go back to 20MHz bandwidth */ + run_bbp_read(sc, 4, &bbp4); + run_bbp_write(sc, 4, bbp4 & ~0x18); + + if ((sc->mac_rev & 0xffff) < 0x0211) + run_rt3070_rf_write(sc, 27, 0x03); + + run_read(sc, RT3070_OPT_14, &tmp); + run_write(sc, RT3070_OPT_14, tmp | 1); + + if ((sc->mac_rev >> 16) == 0x3071) { + run_rt3070_rf_read(sc, 1, &rf); + rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD); + rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD; + run_rt3070_rf_write(sc, 1, rf); + + run_rt3070_rf_read(sc, 15, &rf); + run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2); + + run_rt3070_rf_read(sc, 17, &rf); + rf &= ~RT3070_TX_LO1; + if ((sc->mac_rev & 0xffff) >= 0x0211 && !sc->ext_2ghz_lna) + rf |= 0x20; /* fix for long range Rx issue */ + run_rt3070_rf_write(sc, 17, rf); + + run_rt3070_rf_read(sc, 20, &rf); + run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1); + + run_rt3070_rf_read(sc, 21, &rf); + run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2); + + run_rt3070_rf_read(sc, 27, &rf); + rf &= ~0x77; + if ((sc->mac_rev & 0xffff) < 0x0211) + rf |= 0x03; + run_rt3070_rf_write(sc, 27, rf); + } + return 0; +} + +static int +run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target, + uint8_t *val) +{ + uint8_t rf22, rf24; + uint8_t bbp55_pb, bbp55_sb, delta; + int ntries; + + /* program filter */ + rf24 = init; /* initial filter value */ + run_rt3070_rf_write(sc, 24, rf24); + + /* enable baseband loopback mode */ + run_rt3070_rf_read(sc, 22, &rf22); + run_rt3070_rf_write(sc, 22, rf22 | 0x01); + + /* set power and frequency of passband test tone */ + run_bbp_write(sc, 24, 0x00); + for (ntries = 0; ntries < 100; ntries++) { + /* transmit test tone */ + run_bbp_write(sc, 25, 0x90); + run_delay(sc, 10); + /* read received power */ + run_bbp_read(sc, 55, &bbp55_pb); + if (bbp55_pb != 0) + break; + } + if (ntries == 100) + return ETIMEDOUT; + + /* set power and frequency of stopband test tone */ + run_bbp_write(sc, 24, 0x06); + for (ntries = 0; ntries < 100; ntries++) { + /* transmit test tone */ + run_bbp_write(sc, 25, 0x90); + run_delay(sc, 10); + /* read received power */ + run_bbp_read(sc, 55, &bbp55_sb); + + delta = bbp55_pb - bbp55_sb; + if (delta > target) + break; + + /* reprogram filter */ + rf24++; + run_rt3070_rf_write(sc, 24, rf24); + } + if (ntries < 100) { + if (rf24 != init) + rf24--; /* backtrack */ + *val = rf24; + run_rt3070_rf_write(sc, 24, rf24); + } + + /* restore initial state */ + run_bbp_write(sc, 24, 0x00); + + /* disable baseband loopback mode */ + run_rt3070_rf_read(sc, 22, &rf22); + run_rt3070_rf_write(sc, 22, rf22 & ~0x01); + + return 0; +} + +static int +run_txrx_enable(struct run_softc *sc) +{ + struct ieee80211com *ic = sc->sc_ifp->if_l2com; + uint32_t tmp; + int error, ntries; + + run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN); + for (ntries = 0; ntries < 200; ntries++) { + if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0) + return error; + if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0) + break; + run_delay(sc, 50); + } + if (ntries == 200) + return ETIMEDOUT; + + run_delay(sc, 50); + + tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE; + run_write(sc, RT2860_WPDMA_GLO_CFG, tmp); + + /* enable Rx bulk aggregation (set timeout and limit) */ + tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN | + RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2); + run_write(sc, RT2860_USB_DMA_CFG, tmp); + + /* set Rx filter */ + tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR; + if (ic->ic_opmode != IEEE80211_M_MONITOR) { + tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL | + RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK | + RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV | + RT2860_DROP_CFACK | RT2860_DROP_CFEND; + if (ic->ic_opmode == IEEE80211_M_STA) + tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL; + } + run_write(sc, RT2860_RX_FILTR_CFG, tmp); + + run_write(sc, RT2860_MAC_SYS_CTRL, + RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); + + return 0; +} + +static void +run_init_locked(struct run_softc *sc) +{ + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap = &sc->sc_rvp->vap; + uint32_t tmp; + uint8_t bbp1, bbp3; + int i; + int ridx; + int ntries; + + run_stop(sc); + + for (ntries = 0; ntries < 100; ntries++) { + if (run_read(sc, RT2860_ASIC_VER_ID, &tmp) != 0) + goto fail; + if (tmp != 0 && tmp != 0xffffffff) + break; + run_delay(sc, 10); + } + if (ntries == 100) + goto fail; + + for (i = 0; i != RUN_EP_QUEUES; i++) + run_setup_tx_list(sc, &sc->sc_epq[i]); + + run_set_macaddr(sc, IF_LLADDR(ifp)); + + for (ntries = 0; ntries < 100; ntries++) { + if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0) + goto fail; + if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0) + break; + run_delay(sc, 10); + } + if (ntries == 100) { + device_printf(sc->sc_dev, "timeout waiting for DMA engine\n"); + goto fail; + } + tmp &= 0xff0; + tmp |= RT2860_TX_WB_DDONE; + run_write(sc, RT2860_WPDMA_GLO_CFG, tmp); + + /* turn off PME_OEN to solve high-current issue */ + run_read(sc, RT2860_SYS_CTRL, &tmp); + run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN); + + run_write(sc, RT2860_MAC_SYS_CTRL, + RT2860_BBP_HRST | RT2860_MAC_SRST); + run_write(sc, RT2860_USB_DMA_CFG, 0); + + if (run_reset(sc) != 0) { + device_printf(sc->sc_dev, "could not reset chipset\n"); + goto fail; + } + + run_write(sc, RT2860_MAC_SYS_CTRL, 0); + + /* init Tx power for all Tx rates (from EEPROM) */ + for (ridx = 0; ridx < 5; ridx++) { + if (sc->txpow20mhz[ridx] == 0xffffffff) + continue; + run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]); + } + + for (i = 0; i < nitems(rt2870_def_mac); i++) + run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val); + run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273); + run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344); + run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa); + + if ((sc->mac_rev >> 16) >= 0x3070) { + /* set delay of PA_PE assertion to 1us (unit of 0.25us) */ + run_write(sc, RT2860_TX_SW_CFG0, + 4 << RT2860_DLY_PAPE_EN_SHIFT); + run_write(sc, RT2860_TX_SW_CFG1, 0); + run_write(sc, RT2860_TX_SW_CFG2, 0x1f); + } + + /* wait while MAC is busy */ + for (ntries = 0; ntries < 100; ntries++) { + if (run_read(sc, RT2860_MAC_STATUS_REG, &tmp) != 0) + goto fail; + if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY))) + break; + run_delay(sc, 10); + } + if (ntries == 100) + goto fail; + + /* clear Host to MCU mailbox */ + run_write(sc, RT2860_H2M_BBPAGENT, 0); + run_write(sc, RT2860_H2M_MAILBOX, 0); + run_delay(sc, 10); + + if (run_bbp_init(sc) != 0) { + device_printf(sc->sc_dev, "could not initialize BBP\n"); + goto fail; + } + + /* abort TSF synchronization */ + run_read(sc, RT2860_BCN_TIME_CFG, &tmp); + tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN | + RT2860_TBTT_TIMER_EN); + run_write(sc, RT2860_BCN_TIME_CFG, tmp); + + /* clear RX WCID search table */ + run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512); + /* clear WCID attribute table */ + run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32); + /* clear shared key table */ + run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32); + /* clear shared key mode */ + run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4); + + run_read(sc, RT2860_US_CYC_CNT, &tmp); + tmp = (tmp & ~0xff) | 0x1e; + run_write(sc, RT2860_US_CYC_CNT, tmp); + + if ((sc->mac_rev >> 16) == 0x2860 && (sc->mac_rev & 0xffff) != 0x0101) + run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f); + + run_write(sc, RT2860_WMM_TXOP0_CFG, 0); + run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96); + + /* write vendor-specific BBP values (from EEPROM) */ + for (i = 0; i < 8; i++) { + if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff) + continue; + run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val); + } + + /* select Main antenna for 1T1R devices */ + if (sc->rf_rev == RT3070_RF_3020) + run_set_rx_antenna(sc, 0); + + /* send LEDs operating mode to microcontroller */ + (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]); + (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]); + (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]); + + /* disable non-existing Rx chains */ + run_bbp_read(sc, 3, &bbp3); + bbp3 &= ~(1 << 3 | 1 << 4); + if (sc->nrxchains == 2) + bbp3 |= 1 << 3; + else if (sc->nrxchains == 3) + bbp3 |= 1 << 4; + run_bbp_write(sc, 3, bbp3); + + /* disable non-existing Tx chains */ + run_bbp_read(sc, 1, &bbp1); + if (sc->ntxchains == 1) + bbp1 &= ~(1 << 3 | 1 << 4); + run_bbp_write(sc, 1, bbp1); + + if ((sc->mac_rev >> 16) >= 0x3070) + run_rt3070_rf_init(sc); + + /* select default channel */ + vap->iv_bss->ni_chan = ic->ic_curchan; /* ic_bsschan?? */ + run_set_chan(sc, ic->ic_curchan); + + /* setup initial protection mode */ + run_updateprot(ic); + + /* turn radio LED on */ + run_set_leds(sc, RT2860_LED_RADIO); + + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + ifp->if_drv_flags |= IFF_DRV_RUNNING; + + for(i = 0; i != RUN_N_XFER; i++) + usbd_xfer_set_stall(sc->sc_xfer[i]); + + usbd_transfer_start(sc->sc_xfer[RUN_BULK_RX]); + + if (run_txrx_enable(sc) != 0) + goto fail; + + return; + +fail: + run_stop(sc); +} + +static void +run_init(void *arg) +{ + struct run_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + RUN_LOCK(sc); + run_init_locked(sc); + RUN_UNLOCK(sc); + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); +} + +static void +run_stop(void *arg) +{ + struct run_softc *sc = (struct run_softc *)arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + uint32_t tmp; + int i; + int ntries; + + RUN_LOCK_ASSERT(sc, MA_OWNED); + + if (ic->ic_flags & IEEE80211_F_SCAN) + ieee80211_cancel_scan(&sc->sc_rvp->vap); + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + run_set_leds(sc, 0); /* turn all LEDs off */ + + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + + sc->sc_rvp->amrr_run = RUN_AMRR_OFF; + + RUN_UNLOCK(sc); + + /* drain them all */ + usb_callout_drain(&sc->sc_rvp->amrr_ch); + ieee80211_draintask(ic, &sc->sc_rvp->amrr_task); + ieee80211_draintask(ic, &sc->wme_task); + for(i = 0; i < RUN_N_XFER; i++) + usbd_transfer_drain(sc->sc_xfer[i]); + ieee80211_draintask(ic, &sc->usb_timeout_task); + + RUN_LOCK(sc); + + if(sc->rx_m != NULL){ + m_free(sc->rx_m); + sc->rx_m = NULL; + } + + /* disable Tx/Rx */ + run_read(sc, RT2860_MAC_SYS_CTRL, &tmp); + tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); + run_write(sc, RT2860_MAC_SYS_CTRL, tmp); + + /* wait for pending Tx to complete */ + for (ntries = 0; ntries < 100; ntries++) { + if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0){ + DPRINTF("Cannot read Tx queue count\n"); + break; + } + if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0){ + DPRINTF("All Tx cleared\n"); + break; + } + run_delay(sc, 10); + } + if(ntries >= 100) + DPRINTF("There are still pending Tx\n"); + run_delay(sc, 10); + run_write(sc, RT2860_USB_DMA_CFG, 0); + + run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST); + run_write(sc, RT2860_MAC_SYS_CTRL, 0); + + for (i = 0; i != RUN_EP_QUEUES; i++) + run_unsetup_tx_list(sc, &sc->sc_epq[i]); + + return; +} + +static void +run_delay(struct run_softc *sc, unsigned int ms) +{ + usb_pause_mtx(mtx_owned(&sc->sc_mtx) ? + &sc->sc_mtx : NULL, USB_MS_TO_TICKS(ms)); +} + +static device_method_t run_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, run_match), + DEVMETHOD(device_attach, run_attach), + DEVMETHOD(device_detach, run_detach), + + { 0, 0 } +}; + +static driver_t run_driver = { + "run", + run_methods, + sizeof(struct run_softc) +}; + +static devclass_t run_devclass; + +DRIVER_MODULE(run, uhub, run_driver, run_devclass, NULL, 0); diff --git a/sys/dev/usb/wlan/if_runreg.h b/sys/dev/usb/wlan/if_runreg.h new file mode 100644 index 000000000000..f630fb10e679 --- /dev/null +++ b/sys/dev/usb/wlan/if_runreg.h @@ -0,0 +1,1130 @@ +/* $OpenBSD: rt2860reg.h,v 1.19 2009/05/18 19:25:07 damien Exp $ */ + +/*- + * Copyright (c) 2007 + * Damien Bergamini + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef _IF_RUNREG_H_ +#define _IF_RUNREG_H_ + +/* PCI registers */ +#define RT2860_PCI_CFG 0x0000 +#define RT2860_PCI_EECTRL 0x0004 +#define RT2860_PCI_MCUCTRL 0x0008 +#define RT2860_PCI_SYSCTRL 0x000c +#define RT2860_PCIE_JTAG 0x0010 + +#define RT2860_CONFIG_NO 1 +#define RT2860_IFACE_INDEX 0 + +#define RT3070_OPT_14 0x0114 + +/* SCH/DMA registers */ +#define RT2860_INT_STATUS 0x0200 +#define RT2860_INT_MASK 0x0204 +#define RT2860_WPDMA_GLO_CFG 0x0208 +#define RT2860_WPDMA_RST_IDX 0x020c +#define RT2860_DELAY_INT_CFG 0x0210 +#define RT2860_WMM_AIFSN_CFG 0x0214 +#define RT2860_WMM_CWMIN_CFG 0x0218 +#define RT2860_WMM_CWMAX_CFG 0x021c +#define RT2860_WMM_TXOP0_CFG 0x0220 +#define RT2860_WMM_TXOP1_CFG 0x0224 +#define RT2860_GPIO_CTRL 0x0228 +#define RT2860_MCU_CMD_REG 0x022c +#define RT2860_TX_BASE_PTR(qid) (0x0230 + (qid) * 16) +#define RT2860_TX_MAX_CNT(qid) (0x0234 + (qid) * 16) +#define RT2860_TX_CTX_IDX(qid) (0x0238 + (qid) * 16) +#define RT2860_TX_DTX_IDX(qid) (0x023c + (qid) * 16) +#define RT2860_RX_BASE_PTR 0x0290 +#define RT2860_RX_MAX_CNT 0x0294 +#define RT2860_RX_CALC_IDX 0x0298 +#define RT2860_FS_DRX_IDX 0x029c +#define RT2860_USB_DMA_CFG 0x02a0 /* RT2870 only */ +#define RT2860_US_CYC_CNT 0x02a4 + +/* PBF registers */ +#define RT2860_SYS_CTRL 0x0400 +#define RT2860_HOST_CMD 0x0404 +#define RT2860_PBF_CFG 0x0408 +#define RT2860_MAX_PCNT 0x040c +#define RT2860_BUF_CTRL 0x0410 +#define RT2860_MCU_INT_STA 0x0414 +#define RT2860_MCU_INT_ENA 0x0418 +#define RT2860_TXQ_IO(qid) (0x041c + (qid) * 4) +#define RT2860_RX0Q_IO 0x0424 +#define RT2860_BCN_OFFSET0 0x042c +#define RT2860_BCN_OFFSET1 0x0430 +#define RT2860_TXRXQ_STA 0x0434 +#define RT2860_TXRXQ_PCNT 0x0438 +#define RT2860_PBF_DBG 0x043c +#define RT2860_CAP_CTRL 0x0440 + +/* RT3070 registers */ +#define RT3070_RF_CSR_CFG 0x0500 +#define RT3070_EFUSE_CTRL 0x0580 +#define RT3070_EFUSE_DATA0 0x0590 +#define RT3070_EFUSE_DATA1 0x0594 +#define RT3070_EFUSE_DATA2 0x0598 +#define RT3070_EFUSE_DATA3 0x059c +#define RT3070_LDO_CFG0 0x05d4 +#define RT3070_GPIO_SWITCH 0x05dc + +/* MAC registers */ +#define RT2860_ASIC_VER_ID 0x1000 +#define RT2860_MAC_SYS_CTRL 0x1004 +#define RT2860_MAC_ADDR_DW0 0x1008 +#define RT2860_MAC_ADDR_DW1 0x100c +#define RT2860_MAC_BSSID_DW0 0x1010 +#define RT2860_MAC_BSSID_DW1 0x1014 +#define RT2860_MAX_LEN_CFG 0x1018 +#define RT2860_BBP_CSR_CFG 0x101c +#define RT2860_RF_CSR_CFG0 0x1020 +#define RT2860_RF_CSR_CFG1 0x1024 +#define RT2860_RF_CSR_CFG2 0x1028 +#define RT2860_LED_CFG 0x102c + +/* undocumented registers */ +#define RT2860_DEBUG 0x10f4 + +/* MAC Timing control registers */ +#define RT2860_XIFS_TIME_CFG 0x1100 +#define RT2860_BKOFF_SLOT_CFG 0x1104 +#define RT2860_NAV_TIME_CFG 0x1108 +#define RT2860_CH_TIME_CFG 0x110c +#define RT2860_PBF_LIFE_TIMER 0x1110 +#define RT2860_BCN_TIME_CFG 0x1114 +#define RT2860_TBTT_SYNC_CFG 0x1118 +#define RT2860_TSF_TIMER_DW0 0x111c +#define RT2860_TSF_TIMER_DW1 0x1120 +#define RT2860_TBTT_TIMER 0x1124 +#define RT2860_INT_TIMER_CFG 0x1128 +#define RT2860_INT_TIMER_EN 0x112c +#define RT2860_CH_IDLE_TIME 0x1130 + +/* MAC Power Save configuration registers */ +#define RT2860_MAC_STATUS_REG 0x1200 +#define RT2860_PWR_PIN_CFG 0x1204 +#define RT2860_AUTO_WAKEUP_CFG 0x1208 + +/* MAC TX configuration registers */ +#define RT2860_EDCA_AC_CFG(aci) (0x1300 + (aci) * 4) +#define RT2860_EDCA_TID_AC_MAP 0x1310 +#define RT2860_TX_PWR_CFG(ridx) (0x1314 + (ridx) * 4) +#define RT2860_TX_PIN_CFG 0x1328 +#define RT2860_TX_BAND_CFG 0x132c +#define RT2860_TX_SW_CFG0 0x1330 +#define RT2860_TX_SW_CFG1 0x1334 +#define RT2860_TX_SW_CFG2 0x1338 +#define RT2860_TXOP_THRES_CFG 0x133c +#define RT2860_TXOP_CTRL_CFG 0x1340 +#define RT2860_TX_RTS_CFG 0x1344 +#define RT2860_TX_TIMEOUT_CFG 0x1348 +#define RT2860_TX_RTY_CFG 0x134c +#define RT2860_TX_LINK_CFG 0x1350 +#define RT2860_HT_FBK_CFG0 0x1354 +#define RT2860_HT_FBK_CFG1 0x1358 +#define RT2860_LG_FBK_CFG0 0x135c +#define RT2860_LG_FBK_CFG1 0x1360 +#define RT2860_CCK_PROT_CFG 0x1364 +#define RT2860_OFDM_PROT_CFG 0x1368 +#define RT2860_MM20_PROT_CFG 0x136c +#define RT2860_MM40_PROT_CFG 0x1370 +#define RT2860_GF20_PROT_CFG 0x1374 +#define RT2860_GF40_PROT_CFG 0x1378 +#define RT2860_EXP_CTS_TIME 0x137c +#define RT2860_EXP_ACK_TIME 0x1380 + +/* MAC RX configuration registers */ +#define RT2860_RX_FILTR_CFG 0x1400 +#define RT2860_AUTO_RSP_CFG 0x1404 +#define RT2860_LEGACY_BASIC_RATE 0x1408 +#define RT2860_HT_BASIC_RATE 0x140c +#define RT2860_HT_CTRL_CFG 0x1410 +#define RT2860_SIFS_COST_CFG 0x1414 +#define RT2860_RX_PARSER_CFG 0x1418 + +/* MAC Security configuration registers */ +#define RT2860_TX_SEC_CNT0 0x1500 +#define RT2860_RX_SEC_CNT0 0x1504 +#define RT2860_CCMP_FC_MUTE 0x1508 + +/* MAC HCCA/PSMP configuration registers */ +#define RT2860_TXOP_HLDR_ADDR0 0x1600 +#define RT2860_TXOP_HLDR_ADDR1 0x1604 +#define RT2860_TXOP_HLDR_ET 0x1608 +#define RT2860_QOS_CFPOLL_RA_DW0 0x160c +#define RT2860_QOS_CFPOLL_A1_DW1 0x1610 +#define RT2860_QOS_CFPOLL_QC 0x1614 + +/* MAC Statistics Counters */ +#define RT2860_RX_STA_CNT0 0x1700 +#define RT2860_RX_STA_CNT1 0x1704 +#define RT2860_RX_STA_CNT2 0x1708 +#define RT2860_TX_STA_CNT0 0x170c +#define RT2860_TX_STA_CNT1 0x1710 +#define RT2860_TX_STA_CNT2 0x1714 +#define RT2860_TX_STAT_FIFO 0x1718 + +/* RX WCID search table */ +#define RT2860_WCID_ENTRY(wcid) (0x1800 + (wcid) * 8) + +#define RT2860_FW_BASE 0x2000 +#define RT2870_FW_BASE 0x3000 + +/* Pair-wise key table */ +#define RT2860_PKEY(wcid) (0x4000 + (wcid) * 32) + +/* IV/EIV table */ +#define RT2860_IVEIV(wcid) (0x6000 + (wcid) * 8) + +/* WCID attribute table */ +#define RT2860_WCID_ATTR(wcid) (0x6800 + (wcid) * 4) + +/* Shared Key Table */ +#define RT2860_SKEY(vap, kidx) (0x6c00 + (vap) * 128 + (kidx) * 32) + +/* Shared Key Mode */ +#define RT2860_SKEY_MODE_0_7 0x7000 +#define RT2860_SKEY_MODE_8_15 0x7004 +#define RT2860_SKEY_MODE_16_23 0x7008 +#define RT2860_SKEY_MODE_24_31 0x700c + +/* Shared Memory between MCU and host */ +#define RT2860_H2M_MAILBOX 0x7010 +#define RT2860_H2M_MAILBOX_CID 0x7014 +#define RT2860_H2M_MAILBOX_STATUS 0x701c +#define RT2860_H2M_BBPAGENT 0x7028 +#define RT2860_BCN_BASE(vap) (0x7800 + (vap) * 512) + + +/* possible flags for register RT2860_PCI_EECTRL */ +#define RT2860_C (1 << 0) +#define RT2860_S (1 << 1) +#define RT2860_D (1 << 2) +#define RT2860_SHIFT_D 2 +#define RT2860_Q (1 << 3) +#define RT2860_SHIFT_Q 3 + +/* possible flags for registers INT_STATUS/INT_MASK */ +#define RT2860_TX_COHERENT (1 << 17) +#define RT2860_RX_COHERENT (1 << 16) +#define RT2860_MAC_INT_4 (1 << 15) +#define RT2860_MAC_INT_3 (1 << 14) +#define RT2860_MAC_INT_2 (1 << 13) +#define RT2860_MAC_INT_1 (1 << 12) +#define RT2860_MAC_INT_0 (1 << 11) +#define RT2860_TX_RX_COHERENT (1 << 10) +#define RT2860_MCU_CMD_INT (1 << 9) +#define RT2860_TX_DONE_INT5 (1 << 8) +#define RT2860_TX_DONE_INT4 (1 << 7) +#define RT2860_TX_DONE_INT3 (1 << 6) +#define RT2860_TX_DONE_INT2 (1 << 5) +#define RT2860_TX_DONE_INT1 (1 << 4) +#define RT2860_TX_DONE_INT0 (1 << 3) +#define RT2860_RX_DONE_INT (1 << 2) +#define RT2860_TX_DLY_INT (1 << 1) +#define RT2860_RX_DLY_INT (1 << 0) + +/* possible flags for register WPDMA_GLO_CFG */ +#define RT2860_HDR_SEG_LEN_SHIFT 8 +#define RT2860_BIG_ENDIAN (1 << 7) +#define RT2860_TX_WB_DDONE (1 << 6) +#define RT2860_WPDMA_BT_SIZE_SHIFT 4 +#define RT2860_WPDMA_BT_SIZE16 0 +#define RT2860_WPDMA_BT_SIZE32 1 +#define RT2860_WPDMA_BT_SIZE64 2 +#define RT2860_WPDMA_BT_SIZE128 3 +#define RT2860_RX_DMA_BUSY (1 << 3) +#define RT2860_RX_DMA_EN (1 << 2) +#define RT2860_TX_DMA_BUSY (1 << 1) +#define RT2860_TX_DMA_EN (1 << 0) + +/* possible flags for register DELAY_INT_CFG */ +#define RT2860_TXDLY_INT_EN (1 << 31) +#define RT2860_TXMAX_PINT_SHIFT 24 +#define RT2860_TXMAX_PTIME_SHIFT 16 +#define RT2860_RXDLY_INT_EN (1 << 15) +#define RT2860_RXMAX_PINT_SHIFT 8 +#define RT2860_RXMAX_PTIME_SHIFT 0 + +/* possible flags for register GPIO_CTRL */ +#define RT2860_GPIO_D_SHIFT 8 +#define RT2860_GPIO_O_SHIFT 0 + +/* possible flags for register USB_DMA_CFG */ +#define RT2860_USB_TX_BUSY (1 << 31) +#define RT2860_USB_RX_BUSY (1 << 30) +#define RT2860_USB_EPOUT_VLD_SHIFT 24 +#define RT2860_USB_TX_EN (1 << 23) +#define RT2860_USB_RX_EN (1 << 22) +#define RT2860_USB_RX_AGG_EN (1 << 21) +#define RT2860_USB_TXOP_HALT (1 << 20) +#define RT2860_USB_TX_CLEAR (1 << 19) +#define RT2860_USB_PHY_WD_EN (1 << 16) +#define RT2860_USB_PHY_MAN_RST (1 << 15) +#define RT2860_USB_RX_AGG_LMT(x) ((x) << 8) /* in unit of 1KB */ +#define RT2860_USB_RX_AGG_TO(x) ((x) & 0xff) /* in unit of 33ns */ + +/* possible flags for register US_CYC_CNT */ +#define RT2860_TEST_EN (1 << 24) +#define RT2860_TEST_SEL_SHIFT 16 +#define RT2860_BT_MODE_EN (1 << 8) +#define RT2860_US_CYC_CNT_SHIFT 0 + +/* possible flags for register SYS_CTRL */ +#define RT2860_HST_PM_SEL (1 << 16) +#define RT2860_CAP_MODE (1 << 14) +#define RT2860_PME_OEN (1 << 13) +#define RT2860_CLKSELECT (1 << 12) +#define RT2860_PBF_CLK_EN (1 << 11) +#define RT2860_MAC_CLK_EN (1 << 10) +#define RT2860_DMA_CLK_EN (1 << 9) +#define RT2860_MCU_READY (1 << 7) +#define RT2860_ASY_RESET (1 << 4) +#define RT2860_PBF_RESET (1 << 3) +#define RT2860_MAC_RESET (1 << 2) +#define RT2860_DMA_RESET (1 << 1) +#define RT2860_MCU_RESET (1 << 0) + +/* possible values for register HOST_CMD */ +#define RT2860_MCU_CMD_SLEEP 0x30 +#define RT2860_MCU_CMD_WAKEUP 0x31 +#define RT2860_MCU_CMD_LEDS 0x50 +#define RT2860_MCU_CMD_LED_RSSI 0x51 +#define RT2860_MCU_CMD_LED1 0x52 +#define RT2860_MCU_CMD_LED2 0x53 +#define RT2860_MCU_CMD_LED3 0x54 +#define RT2860_MCU_CMD_BOOT 0x72 +#define RT2860_MCU_CMD_BBP 0x80 +#define RT2860_MCU_CMD_PSLEVEL 0x83 + +/* possible flags for register PBF_CFG */ +#define RT2860_TX1Q_NUM_SHIFT 21 +#define RT2860_TX2Q_NUM_SHIFT 16 +#define RT2860_NULL0_MODE (1 << 15) +#define RT2860_NULL1_MODE (1 << 14) +#define RT2860_RX_DROP_MODE (1 << 13) +#define RT2860_TX0Q_MANUAL (1 << 12) +#define RT2860_TX1Q_MANUAL (1 << 11) +#define RT2860_TX2Q_MANUAL (1 << 10) +#define RT2860_RX0Q_MANUAL (1 << 9) +#define RT2860_HCCA_EN (1 << 8) +#define RT2860_TX0Q_EN (1 << 4) +#define RT2860_TX1Q_EN (1 << 3) +#define RT2860_TX2Q_EN (1 << 2) +#define RT2860_RX0Q_EN (1 << 1) + +/* possible flags for register BUF_CTRL */ +#define RT2860_WRITE_TXQ(qid) (1 << (11 - (qid))) +#define RT2860_NULL0_KICK (1 << 7) +#define RT2860_NULL1_KICK (1 << 6) +#define RT2860_BUF_RESET (1 << 5) +#define RT2860_READ_TXQ(qid) (1 << (3 - (qid)) +#define RT2860_READ_RX0Q (1 << 0) + +/* possible flags for registers MCU_INT_STA/MCU_INT_ENA */ +#define RT2860_MCU_MAC_INT_8 (1 << 24) +#define RT2860_MCU_MAC_INT_7 (1 << 23) +#define RT2860_MCU_MAC_INT_6 (1 << 22) +#define RT2860_MCU_MAC_INT_4 (1 << 20) +#define RT2860_MCU_MAC_INT_3 (1 << 19) +#define RT2860_MCU_MAC_INT_2 (1 << 18) +#define RT2860_MCU_MAC_INT_1 (1 << 17) +#define RT2860_MCU_MAC_INT_0 (1 << 16) +#define RT2860_DTX0_INT (1 << 11) +#define RT2860_DTX1_INT (1 << 10) +#define RT2860_DTX2_INT (1 << 9) +#define RT2860_DRX0_INT (1 << 8) +#define RT2860_HCMD_INT (1 << 7) +#define RT2860_N0TX_INT (1 << 6) +#define RT2860_N1TX_INT (1 << 5) +#define RT2860_BCNTX_INT (1 << 4) +#define RT2860_MTX0_INT (1 << 3) +#define RT2860_MTX1_INT (1 << 2) +#define RT2860_MTX2_INT (1 << 1) +#define RT2860_MRX0_INT (1 << 0) + +/* possible flags for register TXRXQ_PCNT */ +#define RT2860_RX0Q_PCNT_MASK 0xff000000 +#define RT2860_TX2Q_PCNT_MASK 0x00ff0000 +#define RT2860_TX1Q_PCNT_MASK 0x0000ff00 +#define RT2860_TX0Q_PCNT_MASK 0x000000ff + +/* possible flags for register CAP_CTRL */ +#define RT2860_CAP_ADC_FEQ (1 << 31) +#define RT2860_CAP_START (1 << 30) +#define RT2860_MAN_TRIG (1 << 29) +#define RT2860_TRIG_OFFSET_SHIFT 16 +#define RT2860_START_ADDR_SHIFT 0 + +/* possible flags for register RF_CSR_CFG */ +#define RT3070_RF_KICK (1 << 17) +#define RT3070_RF_WRITE (1 << 16) + +/* possible flags for register EFUSE_CTRL */ +#define RT3070_SEL_EFUSE (1 << 31) +#define RT3070_EFSROM_KICK (1 << 30) +#define RT3070_EFSROM_AIN_MASK 0x03ff0000 +#define RT3070_EFSROM_AIN_SHIFT 16 +#define RT3070_EFSROM_MODE_MASK 0x000000c0 +#define RT3070_EFUSE_AOUT_MASK 0x0000003f + +/* possible flags for register MAC_SYS_CTRL */ +#define RT2860_RX_TS_EN (1 << 7) +#define RT2860_WLAN_HALT_EN (1 << 6) +#define RT2860_PBF_LOOP_EN (1 << 5) +#define RT2860_CONT_TX_TEST (1 << 4) +#define RT2860_MAC_RX_EN (1 << 3) +#define RT2860_MAC_TX_EN (1 << 2) +#define RT2860_BBP_HRST (1 << 1) +#define RT2860_MAC_SRST (1 << 0) + +/* possible flags for register MAC_BSSID_DW1 */ +#define RT2860_MULTI_BCN_NUM_SHIFT 18 +#define RT2860_MULTI_BSSID_MODE_SHIFT 16 + +/* possible flags for register MAX_LEN_CFG */ +#define RT2860_MIN_MPDU_LEN_SHIFT 16 +#define RT2860_MAX_PSDU_LEN_SHIFT 12 +#define RT2860_MAX_PSDU_LEN8K 0 +#define RT2860_MAX_PSDU_LEN16K 1 +#define RT2860_MAX_PSDU_LEN32K 2 +#define RT2860_MAX_PSDU_LEN64K 3 +#define RT2860_MAX_MPDU_LEN_SHIFT 0 + +/* possible flags for registers BBP_CSR_CFG/H2M_BBPAGENT */ +#define RT2860_BBP_RW_PARALLEL (1 << 19) +#define RT2860_BBP_PAR_DUR_112_5 (1 << 18) +#define RT2860_BBP_CSR_KICK (1 << 17) +#define RT2860_BBP_CSR_READ (1 << 16) +#define RT2860_BBP_ADDR_SHIFT 8 +#define RT2860_BBP_DATA_SHIFT 0 + +/* possible flags for register RF_CSR_CFG0 */ +#define RT2860_RF_REG_CTRL (1 << 31) +#define RT2860_RF_LE_SEL1 (1 << 30) +#define RT2860_RF_LE_STBY (1 << 29) +#define RT2860_RF_REG_WIDTH_SHIFT 24 +#define RT2860_RF_REG_0_SHIFT 0 + +/* possible flags for register RF_CSR_CFG1 */ +#define RT2860_RF_DUR_5 (1 << 24) +#define RT2860_RF_REG_1_SHIFT 0 + +/* possible flags for register LED_CFG */ +#define RT2860_LED_POL (1 << 30) +#define RT2860_Y_LED_MODE_SHIFT 28 +#define RT2860_G_LED_MODE_SHIFT 26 +#define RT2860_R_LED_MODE_SHIFT 24 +#define RT2860_LED_MODE_OFF 0 +#define RT2860_LED_MODE_BLINK_TX 1 +#define RT2860_LED_MODE_SLOW_BLINK 2 +#define RT2860_LED_MODE_ON 3 +#define RT2860_SLOW_BLK_TIME_SHIFT 16 +#define RT2860_LED_OFF_TIME_SHIFT 8 +#define RT2860_LED_ON_TIME_SHIFT 0 + +/* possible flags for register XIFS_TIME_CFG */ +#define RT2860_BB_RXEND_EN (1 << 29) +#define RT2860_EIFS_TIME_SHIFT 20 +#define RT2860_OFDM_XIFS_TIME_SHIFT 16 +#define RT2860_OFDM_SIFS_TIME_SHIFT 8 +#define RT2860_CCK_SIFS_TIME_SHIFT 0 + +/* possible flags for register BKOFF_SLOT_CFG */ +#define RT2860_CC_DELAY_TIME_SHIFT 8 +#define RT2860_SLOT_TIME 0 + +/* possible flags for register NAV_TIME_CFG */ +#define RT2860_NAV_UPD (1 << 31) +#define RT2860_NAV_UPD_VAL_SHIFT 16 +#define RT2860_NAV_CLR_EN (1 << 15) +#define RT2860_NAV_TIMER_SHIFT 0 + +/* possible flags for register CH_TIME_CFG */ +#define RT2860_EIFS_AS_CH_BUSY (1 << 4) +#define RT2860_NAV_AS_CH_BUSY (1 << 3) +#define RT2860_RX_AS_CH_BUSY (1 << 2) +#define RT2860_TX_AS_CH_BUSY (1 << 1) +#define RT2860_CH_STA_TIMER_EN (1 << 0) + +/* possible values for register BCN_TIME_CFG */ +#define RT2860_TSF_INS_COMP_SHIFT 24 +#define RT2860_BCN_TX_EN (1 << 20) +#define RT2860_TBTT_TIMER_EN (1 << 19) +#define RT2860_TSF_SYNC_MODE_SHIFT 17 +#define RT2860_TSF_SYNC_MODE_DIS 0 +#define RT2860_TSF_SYNC_MODE_STA 1 +#define RT2860_TSF_SYNC_MODE_IBSS 2 +#define RT2860_TSF_SYNC_MODE_HOSTAP 3 +#define RT2860_TSF_TIMER_EN (1 << 16) +#define RT2860_BCN_INTVAL_SHIFT 0 + +/* possible flags for register TBTT_SYNC_CFG */ +#define RT2860_BCN_CWMIN_SHIFT 20 +#define RT2860_BCN_AIFSN_SHIFT 16 +#define RT2860_BCN_EXP_WIN_SHIFT 8 +#define RT2860_TBTT_ADJUST_SHIFT 0 + +/* possible flags for register INT_TIMER_CFG */ +#define RT2860_GP_TIMER_SHIFT 16 +#define RT2860_PRE_TBTT_TIMER_SHIFT 0 + +/* possible flags for register INT_TIMER_EN */ +#define RT2860_GP_TIMER_EN (1 << 1) +#define RT2860_PRE_TBTT_INT_EN (1 << 0) + +/* possible flags for register MAC_STATUS_REG */ +#define RT2860_RX_STATUS_BUSY (1 << 1) +#define RT2860_TX_STATUS_BUSY (1 << 0) + +/* possible flags for register PWR_PIN_CFG */ +#define RT2860_IO_ADDA_PD (1 << 3) +#define RT2860_IO_PLL_PD (1 << 2) +#define RT2860_IO_RA_PE (1 << 1) +#define RT2860_IO_RF_PE (1 << 0) + +/* possible flags for register AUTO_WAKEUP_CFG */ +#define RT2860_AUTO_WAKEUP_EN (1 << 15) +#define RT2860_SLEEP_TBTT_NUM_SHIFT 8 +#define RT2860_WAKEUP_LEAD_TIME_SHIFT 0 + +/* possible flags for register TX_PIN_CFG */ +#define RT2860_TRSW_POL (1 << 19) +#define RT2860_TRSW_EN (1 << 18) +#define RT2860_RFTR_POL (1 << 17) +#define RT2860_RFTR_EN (1 << 16) +#define RT2860_LNA_PE_G1_POL (1 << 15) +#define RT2860_LNA_PE_A1_POL (1 << 14) +#define RT2860_LNA_PE_G0_POL (1 << 13) +#define RT2860_LNA_PE_A0_POL (1 << 12) +#define RT2860_LNA_PE_G1_EN (1 << 11) +#define RT2860_LNA_PE_A1_EN (1 << 10) +#define RT2860_LNA_PE_G0_EN (1 << 9) +#define RT2860_LNA_PE_A0_EN (1 << 8) +#define RT2860_PA_PE_G1_POL (1 << 7) +#define RT2860_PA_PE_A1_POL (1 << 6) +#define RT2860_PA_PE_G0_POL (1 << 5) +#define RT2860_PA_PE_A0_POL (1 << 4) +#define RT2860_PA_PE_G1_EN (1 << 3) +#define RT2860_PA_PE_A1_EN (1 << 2) +#define RT2860_PA_PE_G0_EN (1 << 1) +#define RT2860_PA_PE_A0_EN (1 << 0) + +/* possible flags for register TX_BAND_CFG */ +#define RT2860_5G_BAND_SEL_N (1 << 2) +#define RT2860_5G_BAND_SEL_P (1 << 1) +#define RT2860_TX_BAND_SEL (1 << 0) + +/* possible flags for register TX_SW_CFG0 */ +#define RT2860_DLY_RFTR_EN_SHIFT 24 +#define RT2860_DLY_TRSW_EN_SHIFT 16 +#define RT2860_DLY_PAPE_EN_SHIFT 8 +#define RT2860_DLY_TXPE_EN_SHIFT 0 + +/* possible flags for register TX_SW_CFG1 */ +#define RT2860_DLY_RFTR_DIS_SHIFT 16 +#define RT2860_DLY_TRSW_DIS_SHIFT 8 +#define RT2860_DLY_PAPE_DIS SHIFT 0 + +/* possible flags for register TX_SW_CFG2 */ +#define RT2860_DLY_LNA_EN_SHIFT 24 +#define RT2860_DLY_LNA_DIS_SHIFT 16 +#define RT2860_DLY_DAC_EN_SHIFT 8 +#define RT2860_DLY_DAC_DIS_SHIFT 0 + +/* possible flags for register TXOP_THRES_CFG */ +#define RT2860_TXOP_REM_THRES_SHIFT 24 +#define RT2860_CF_END_THRES_SHIFT 16 +#define RT2860_RDG_IN_THRES 8 +#define RT2860_RDG_OUT_THRES 0 + +/* possible flags for register TXOP_CTRL_CFG */ +#define RT2860_EXT_CW_MIN_SHIFT 16 +#define RT2860_EXT_CCA_DLY_SHIFT 8 +#define RT2860_EXT_CCA_EN (1 << 7) +#define RT2860_LSIG_TXOP_EN (1 << 6) +#define RT2860_TXOP_TRUN_EN_MIMOPS (1 << 4) +#define RT2860_TXOP_TRUN_EN_TXOP (1 << 3) +#define RT2860_TXOP_TRUN_EN_RATE (1 << 2) +#define RT2860_TXOP_TRUN_EN_AC (1 << 1) +#define RT2860_TXOP_TRUN_EN_TIMEOUT (1 << 0) + +/* possible flags for register TX_RTS_CFG */ +#define RT2860_RTS_FBK_EN (1 << 24) +#define RT2860_RTS_THRES_SHIFT 8 +#define RT2860_RTS_RTY_LIMIT_SHIFT 0 + +/* possible flags for register TX_TIMEOUT_CFG */ +#define RT2860_TXOP_TIMEOUT_SHIFT 16 +#define RT2860_RX_ACK_TIMEOUT_SHIFT 8 +#define RT2860_MPDU_LIFE_TIME_SHIFT 4 + +/* possible flags for register TX_RTY_CFG */ +#define RT2860_TX_AUTOFB_EN (1 << 30) +#define RT2860_AGG_RTY_MODE_TIMER (1 << 29) +#define RT2860_NAG_RTY_MODE_TIMER (1 << 28) +#define RT2860_LONG_RTY_THRES_SHIFT 16 +#define RT2860_LONG_RTY_LIMIT_SHIFT 8 +#define RT2860_SHORT_RTY_LIMIT_SHIFT 0 + +/* possible flags for register TX_LINK_CFG */ +#define RT2860_REMOTE_MFS_SHIFT 24 +#define RT2860_REMOTE_MFB_SHIFT 16 +#define RT2860_TX_CFACK_EN (1 << 12) +#define RT2860_TX_RDG_EN (1 << 11) +#define RT2860_TX_MRQ_EN (1 << 10) +#define RT2860_REMOTE_UMFS_EN (1 << 9) +#define RT2860_TX_MFB_EN (1 << 8) +#define RT2860_REMOTE_MFB_LT_SHIFT 0 + +/* possible flags for registers *_PROT_CFG */ +#define RT2860_RTSTH_EN (1 << 26) +#define RT2860_TXOP_ALLOW_GF40 (1 << 25) +#define RT2860_TXOP_ALLOW_GF20 (1 << 24) +#define RT2860_TXOP_ALLOW_MM40 (1 << 23) +#define RT2860_TXOP_ALLOW_MM20 (1 << 22) +#define RT2860_TXOP_ALLOW_OFDM (1 << 21) +#define RT2860_TXOP_ALLOW_CCK (1 << 20) +#define RT2860_TXOP_ALLOW_ALL (0x3f << 20) +#define RT2860_PROT_NAV_SHORT (1 << 18) +#define RT2860_PROT_NAV_LONG (2 << 18) +#define RT2860_PROT_CTRL_RTS_CTS (1 << 16) +#define RT2860_PROT_CTRL_CTS (2 << 16) + +/* possible flags for registers EXP_{CTS,ACK}_TIME */ +#define RT2860_EXP_OFDM_TIME_SHIFT 16 +#define RT2860_EXP_CCK_TIME_SHIFT 0 + +/* possible flags for register RX_FILTR_CFG */ +#define RT2860_DROP_CTRL_RSV (1 << 16) +#define RT2860_DROP_BAR (1 << 15) +#define RT2860_DROP_BA (1 << 14) +#define RT2860_DROP_PSPOLL (1 << 13) +#define RT2860_DROP_RTS (1 << 12) +#define RT2860_DROP_CTS (1 << 11) +#define RT2860_DROP_ACK (1 << 10) +#define RT2860_DROP_CFEND (1 << 9) +#define RT2860_DROP_CFACK (1 << 8) +#define RT2860_DROP_DUPL (1 << 7) +#define RT2860_DROP_BC (1 << 6) +#define RT2860_DROP_MC (1 << 5) +#define RT2860_DROP_VER_ERR (1 << 4) +#define RT2860_DROP_NOT_MYBSS (1 << 3) +#define RT2860_DROP_UC_NOME (1 << 2) +#define RT2860_DROP_PHY_ERR (1 << 1) +#define RT2860_DROP_CRC_ERR (1 << 0) + +/* possible flags for register AUTO_RSP_CFG */ +#define RT2860_CTRL_PWR_BIT (1 << 7) +#define RT2860_BAC_ACK_POLICY (1 << 6) +#define RT2860_CCK_SHORT_EN (1 << 4) +#define RT2860_CTS_40M_REF_EN (1 << 3) +#define RT2860_CTS_40M_MODE_EN (1 << 2) +#define RT2860_BAC_ACKPOLICY_EN (1 << 1) +#define RT2860_AUTO_RSP_EN (1 << 0) + +/* possible flags for register SIFS_COST_CFG */ +#define RT2860_OFDM_SIFS_COST_SHIFT 8 +#define RT2860_CCK_SIFS_COST_SHIFT 0 + +/* possible flags for register TXOP_HLDR_ET */ +#define RT2860_TXOP_ETM1_EN (1 << 25) +#define RT2860_TXOP_ETM0_EN (1 << 24) +#define RT2860_TXOP_ETM_THRES_SHIFT 16 +#define RT2860_TXOP_ETO_EN (1 << 8) +#define RT2860_TXOP_ETO_THRES_SHIFT 1 +#define RT2860_PER_RX_RST_EN (1 << 0) + +/* possible flags for register TX_STAT_FIFO */ +#define RT2860_TXQ_MCS_SHIFT 16 +#define RT2860_TXQ_WCID_SHIFT 8 +#define RT2860_TXQ_ACKREQ (1 << 7) +#define RT2860_TXQ_AGG (1 << 6) +#define RT2860_TXQ_OK (1 << 5) +#define RT2860_TXQ_PID_SHIFT 1 +#define RT2860_TXQ_VLD (1 << 0) + +/* possible flags for register WCID_ATTR */ +#define RT2860_MODE_NOSEC 0 +#define RT2860_MODE_WEP40 1 +#define RT2860_MODE_WEP104 2 +#define RT2860_MODE_TKIP 3 +#define RT2860_MODE_AES_CCMP 4 +#define RT2860_MODE_CKIP40 5 +#define RT2860_MODE_CKIP104 6 +#define RT2860_MODE_CKIP128 7 +#define RT2860_RX_PKEY_EN (1 << 0) + +/* possible flags for register H2M_MAILBOX */ +#define RT2860_H2M_BUSY (1 << 24) +#define RT2860_TOKEN_NO_INTR 0xff + + +/* possible flags for MCU command RT2860_MCU_CMD_LEDS */ +#define RT2860_LED_RADIO (1 << 13) +#define RT2860_LED_LINK_2GHZ (1 << 14) +#define RT2860_LED_LINK_5GHZ (1 << 15) + + +/* possible flags for RT3020 RF register 1 */ +#define RT3070_RF_BLOCK (1 << 0) +#define RT3070_RX0_PD (1 << 2) +#define RT3070_TX0_PD (1 << 3) +#define RT3070_RX1_PD (1 << 4) +#define RT3070_TX1_PD (1 << 5) + +/* possible flags for RT3020 RF register 15 */ +#define RT3070_TX_LO2 (1 << 3) + +/* possible flags for RT3020 RF register 17 */ +#define RT3070_TX_LO1 (1 << 3) + +/* possible flags for RT3020 RF register 20 */ +#define RT3070_RX_LO1 (1 << 3) + +/* possible flags for RT3020 RF register 21 */ +#define RT3070_RX_LO2 (1 << 3) + + +/* RT2860 TX descriptor */ +struct rt2860_txd { + uint32_t sdp0; /* Segment Data Pointer 0 */ + uint16_t sdl1; /* Segment Data Length 1 */ +#define RT2860_TX_BURST (1 << 15) +#define RT2860_TX_LS1 (1 << 14) /* SDP1 is the last segment */ + + uint16_t sdl0; /* Segment Data Length 0 */ +#define RT2860_TX_DDONE (1 << 15) +#define RT2860_TX_LS0 (1 << 14) /* SDP0 is the last segment */ + + uint32_t sdp1; /* Segment Data Pointer 1 */ + uint8_t reserved[3]; + uint8_t flags; +#define RT2860_TX_QSEL_SHIFT 1 +#define RT2860_TX_QSEL_MGMT (0 << 1) +#define RT2860_TX_QSEL_HCCA (1 << 1) +#define RT2860_TX_QSEL_EDCA (2 << 1) +#define RT2860_TX_WIV (1 << 0) +} __packed; + +/* RT2870 TX descriptor */ +struct rt2870_txd { + uint16_t len; + uint8_t pad; + uint8_t flags; +} __packed; + +/* TX Wireless Information */ +struct rt2860_txwi { + uint8_t flags; +#define RT2860_TX_MPDU_DSITY_SHIFT 5 +#define RT2860_TX_AMPDU (1 << 4) +#define RT2860_TX_TS (1 << 3) +#define RT2860_TX_CFACK (1 << 2) +#define RT2860_TX_MMPS (1 << 1) +#define RT2860_TX_FRAG (1 << 0) + + uint8_t txop; +#define RT2860_TX_TXOP_HT 0 +#define RT2860_TX_TXOP_PIFS 1 +#define RT2860_TX_TXOP_SIFS 2 +#define RT2860_TX_TXOP_BACKOFF 3 + + uint16_t phy; +#define RT2860_PHY_MODE 0xc000 +#define RT2860_PHY_CCK (0 << 14) +#define RT2860_PHY_OFDM (1 << 14) +#define RT2860_PHY_HT (2 << 14) +#define RT2860_PHY_HT_GF (3 << 14) +#define RT2860_PHY_SGI (1 << 8) +#define RT2860_PHY_BW40 (1 << 7) +#define RT2860_PHY_MCS 0x7f +#define RT2860_PHY_SHPRE (1 << 3) + + uint8_t xflags; +#define RT2860_TX_BAWINSIZE_SHIFT 2 +#define RT2860_TX_NSEQ (1 << 1) +#define RT2860_TX_ACK (1 << 0) + + uint8_t wcid; /* Wireless Client ID */ + uint16_t len; +#define RT2860_TX_PID_SHIFT 12 + + uint32_t iv; + uint32_t eiv; +} __packed; + +/* RT2860 RX descriptor */ +struct rt2860_rxd { + uint32_t sdp0; + uint16_t sdl1; /* unused */ + uint16_t sdl0; +#define RT2860_RX_DDONE (1 << 15) +#define RT2860_RX_LS0 (1 << 14) + + uint32_t sdp1; /* unused */ + uint32_t flags; +#define RT2860_RX_DEC (1 << 16) +#define RT2860_RX_AMPDU (1 << 15) +#define RT2860_RX_L2PAD (1 << 14) +#define RT2860_RX_RSSI (1 << 13) +#define RT2860_RX_HTC (1 << 12) +#define RT2860_RX_AMSDU (1 << 11) +#define RT2860_RX_MICERR (1 << 10) +#define RT2860_RX_ICVERR (1 << 9) +#define RT2860_RX_CRCERR (1 << 8) +#define RT2860_RX_MYBSS (1 << 7) +#define RT2860_RX_BC (1 << 6) +#define RT2860_RX_MC (1 << 5) +#define RT2860_RX_UC2ME (1 << 4) +#define RT2860_RX_FRAG (1 << 3) +#define RT2860_RX_NULL (1 << 2) +#define RT2860_RX_DATA (1 << 1) +#define RT2860_RX_BA (1 << 0) +} __packed; + +/* RT2870 RX descriptor */ +struct rt2870_rxd { + /* single 32-bit field */ + uint32_t flags; +} __packed; + +/* RX Wireless Information */ +struct rt2860_rxwi { + uint8_t wcid; + uint8_t keyidx; +#define RT2860_RX_UDF_SHIFT 5 +#define RT2860_RX_BSS_IDX_SHIFT 2 + + uint16_t len; +#define RT2860_RX_TID_SHIFT 12 + + uint16_t seq; + uint16_t phy; + uint8_t rssi[3]; + uint8_t reserved1; + uint8_t snr[2]; + uint16_t reserved2; +} __packed; + + +/* first DMA segment contains TXWI + 802.11 header + 32-bit padding */ +#define RT2860_TXWI_DMASZ \ + (sizeof (struct rt2860_txwi) + \ + sizeof (struct ieee80211_htframe) + \ + sizeof (uint16_t)) + +#define RT2860_RF1 0 +#define RT2860_RF2 2 +#define RT2860_RF3 1 +#define RT2860_RF4 3 + +#define RT2860_RF_2820 1 /* 2T3R */ +#define RT2860_RF_2850 2 /* dual-band 2T3R */ +#define RT2860_RF_2720 3 /* 1T2R */ +#define RT2860_RF_2750 4 /* dual-band 1T2R */ +#define RT3070_RF_3020 5 /* 1T1R */ +#define RT3070_RF_2020 6 /* b/g */ +#define RT3070_RF_3021 7 /* 1T2R */ +#define RT3070_RF_3022 8 /* 2T2R */ +#define RT3070_RF_3052 9 /* dual-band 2T2R */ + +/* USB commands for RT2870 only */ +#define RT2870_RESET 1 +#define RT2870_WRITE_2 2 +#define RT2870_WRITE_REGION_1 6 +#define RT2870_READ_REGION_1 7 +#define RT2870_EEPROM_READ 9 + +#define RT2860_EEPROM_DELAY 1 /* minimum hold time (microsecond) */ + +#define RT2860_EEPROM_VERSION 0x01 +#define RT2860_EEPROM_MAC01 0x02 +#define RT2860_EEPROM_MAC23 0x03 +#define RT2860_EEPROM_MAC45 0x04 +#define RT2860_EEPROM_PCIE_PSLEVEL 0x11 +#define RT2860_EEPROM_REV 0x12 +#define RT2860_EEPROM_ANTENNA 0x1a +#define RT2860_EEPROM_CONFIG 0x1b +#define RT2860_EEPROM_COUNTRY 0x1c +#define RT2860_EEPROM_FREQ_LEDS 0x1d +#define RT2860_EEPROM_LED1 0x1e +#define RT2860_EEPROM_LED2 0x1f +#define RT2860_EEPROM_LED3 0x20 +#define RT2860_EEPROM_LNA 0x22 +#define RT2860_EEPROM_RSSI1_2GHZ 0x23 +#define RT2860_EEPROM_RSSI2_2GHZ 0x24 +#define RT2860_EEPROM_RSSI1_5GHZ 0x25 +#define RT2860_EEPROM_RSSI2_5GHZ 0x26 +#define RT2860_EEPROM_DELTAPWR 0x28 +#define RT2860_EEPROM_PWR2GHZ_BASE1 0x29 +#define RT2860_EEPROM_PWR2GHZ_BASE2 0x30 +#define RT2860_EEPROM_TSSI1_2GHZ 0x37 +#define RT2860_EEPROM_TSSI2_2GHZ 0x38 +#define RT2860_EEPROM_TSSI3_2GHZ 0x39 +#define RT2860_EEPROM_TSSI4_2GHZ 0x3a +#define RT2860_EEPROM_TSSI5_2GHZ 0x3b +#define RT2860_EEPROM_PWR5GHZ_BASE1 0x3c +#define RT2860_EEPROM_PWR5GHZ_BASE2 0x53 +#define RT2860_EEPROM_TSSI1_5GHZ 0x6a +#define RT2860_EEPROM_TSSI2_5GHZ 0x6b +#define RT2860_EEPROM_TSSI3_5GHZ 0x6c +#define RT2860_EEPROM_TSSI4_5GHZ 0x6d +#define RT2860_EEPROM_TSSI5_5GHZ 0x6e +#define RT2860_EEPROM_RPWR 0x6f +#define RT2860_EEPROM_BBP_BASE 0x78 + +#define RT2860_RIDX_CCK1 0 +#define RT2860_RIDX_CCK11 3 +#define RT2860_RIDX_OFDM6 4 +#define RT2860_RIDX_MAX 11 +static const struct rt2860_rate { + uint8_t rate; + uint8_t mcs; + enum ieee80211_phytype phy; + uint8_t ctl_ridx; + uint16_t sp_ack_dur; + uint16_t lp_ack_dur; +} rt2860_rates[] = { + { 2, 0, IEEE80211_T_DS, 0, 304, 304 }, + { 4, 1, IEEE80211_T_DS, 1, 248, 152 }, + { 11, 2, IEEE80211_T_DS, 2, 213, 117 }, + { 22, 3, IEEE80211_T_DS, 3, 203, 107 }, + { 12, 0, IEEE80211_T_OFDM, 4, 50, 50 }, + { 18, 1, IEEE80211_T_OFDM, 4, 42, 42 }, + { 24, 2, IEEE80211_T_OFDM, 6, 38, 38 }, + { 36, 3, IEEE80211_T_OFDM, 6, 34, 34 }, + { 48, 4, IEEE80211_T_OFDM, 8, 34, 34 }, + { 72, 5, IEEE80211_T_OFDM, 8, 30, 30 }, + { 96, 6, IEEE80211_T_OFDM, 8, 30, 30 }, + { 108, 7, IEEE80211_T_OFDM, 8, 30, 30 } +}; + +/* + * Control and status registers access macros. + */ +#define RAL_READ(sc, reg) \ + bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) + +#define RAL_WRITE(sc, reg, val) \ + bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) + +#define RAL_BARRIER_WRITE(sc) \ + bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, 0x1800, \ + BUS_SPACE_BARRIER_WRITE) + +#define RAL_BARRIER_READ_WRITE(sc) \ + bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, 0x1800, \ + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE) + +#define RAL_WRITE_REGION_1(sc, offset, datap, count) \ + bus_space_write_region_1((sc)->sc_st, (sc)->sc_sh, (offset), \ + (datap), (count)) + +#define RAL_SET_REGION_4(sc, offset, val, count) \ + bus_space_set_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \ + (val), (count)) + +/* + * EEPROM access macro. + */ +#define RT2860_EEPROM_CTL(sc, val) do { \ + RAL_WRITE((sc), RT2860_PCI_EECTRL, (val)); \ + RAL_BARRIER_READ_WRITE((sc)); \ + DELAY(RT2860_EEPROM_DELAY); \ +} while (/* CONSTCOND */0) + +/* + * Default values for MAC registers; values taken from the reference driver. + */ +#define RT2860_DEF_MAC \ + { RT2860_BCN_OFFSET0, 0xf8f0e8e0 }, \ + { RT2860_LEGACY_BASIC_RATE, 0x0000013f }, \ + { RT2860_HT_BASIC_RATE, 0x00008003 }, \ + { RT2860_MAC_SYS_CTRL, 0x00000000 }, \ + { RT2860_BKOFF_SLOT_CFG, 0x00000209 }, \ + { RT2860_TX_SW_CFG0, 0x00000000 }, \ + { RT2860_TX_SW_CFG1, 0x00080606 }, \ + { RT2860_TX_LINK_CFG, 0x00001020 }, \ + { RT2860_TX_TIMEOUT_CFG, 0x000a2090 }, \ + { RT2860_LED_CFG, 0x7f031e46 }, \ + { RT2860_WMM_AIFSN_CFG, 0x00002273 }, \ + { RT2860_WMM_CWMIN_CFG, 0x00002344 }, \ + { RT2860_WMM_CWMAX_CFG, 0x000034aa }, \ + { RT2860_MAX_PCNT, 0x1f3fbf9f }, \ + { RT2860_TX_RTY_CFG, 0x47d01f0f }, \ + { RT2860_AUTO_RSP_CFG, 0x00000013 }, \ + { RT2860_CCK_PROT_CFG, 0x05740003 }, \ + { RT2860_OFDM_PROT_CFG, 0x05740003 }, \ + { RT2860_GF20_PROT_CFG, 0x01744004 }, \ + { RT2860_GF40_PROT_CFG, 0x03f44084 }, \ + { RT2860_MM20_PROT_CFG, 0x01744004 }, \ + { RT2860_MM40_PROT_CFG, 0x03f54084 }, \ + { RT2860_TXOP_CTRL_CFG, 0x0000583f }, \ + { RT2860_TXOP_HLDR_ET, 0x00000002 }, \ + { RT2860_TX_RTS_CFG, 0x00092b20 }, \ + { RT2860_EXP_ACK_TIME, 0x002400ca }, \ + { RT2860_XIFS_TIME_CFG, 0x33a41010 }, \ + { RT2860_PWR_PIN_CFG, 0x00000003 } + +/* XXX only a few registers differ from above, try to merge? */ +#define RT2870_DEF_MAC \ + { RT2860_BCN_OFFSET0, 0xf8f0e8e0 }, \ + { RT2860_LEGACY_BASIC_RATE, 0x0000013f }, \ + { RT2860_HT_BASIC_RATE, 0x00008003 }, \ + { RT2860_MAC_SYS_CTRL, 0x00000000 }, \ + { RT2860_BKOFF_SLOT_CFG, 0x00000209 }, \ + { RT2860_TX_SW_CFG0, 0x00000000 }, \ + { RT2860_TX_SW_CFG1, 0x00080606 }, \ + { RT2860_TX_LINK_CFG, 0x00001020 }, \ + { RT2860_TX_TIMEOUT_CFG, 0x000a2090 }, \ + { RT2860_LED_CFG, 0x7f031e46 }, \ + { RT2860_WMM_AIFSN_CFG, 0x00002273 }, \ + { RT2860_WMM_CWMIN_CFG, 0x00002344 }, \ + { RT2860_WMM_CWMAX_CFG, 0x000034aa }, \ + { RT2860_MAX_PCNT, 0x1f3fbf9f }, \ + { RT2860_TX_RTY_CFG, 0x47d01f0f }, \ + { RT2860_AUTO_RSP_CFG, 0x00000013 }, \ + { RT2860_CCK_PROT_CFG, 0x05740003 }, \ + { RT2860_OFDM_PROT_CFG, 0x05740003 }, \ + { RT2860_PBF_CFG, 0x00f40006 }, \ + { RT2860_WPDMA_GLO_CFG, 0x00000030 }, \ + { RT2860_GF20_PROT_CFG, 0x01744004 }, \ + { RT2860_GF40_PROT_CFG, 0x03f44084 }, \ + { RT2860_MM20_PROT_CFG, 0x01744004 }, \ + { RT2860_MM40_PROT_CFG, 0x03f44084 }, \ + { RT2860_TXOP_CTRL_CFG, 0x0000583f }, \ + { RT2860_TXOP_HLDR_ET, 0x00000002 }, \ + { RT2860_TX_RTS_CFG, 0x00092b20 }, \ + { RT2860_EXP_ACK_TIME, 0x002400ca }, \ + { RT2860_XIFS_TIME_CFG, 0x33a41010 }, \ + { RT2860_PWR_PIN_CFG, 0x00000003 } + +/* + * Default values for BBP registers; values taken from the reference driver. + */ +#define RT2860_DEF_BBP \ + { 65, 0x2c }, \ + { 66, 0x38 }, \ + { 69, 0x12 }, \ + { 70, 0x0a }, \ + { 73, 0x10 }, \ + { 81, 0x37 }, \ + { 82, 0x62 }, \ + { 83, 0x6a }, \ + { 84, 0x99 }, \ + { 86, 0x00 }, \ + { 91, 0x04 }, \ + { 92, 0x00 }, \ + { 103, 0x00 }, \ + { 105, 0x05 } + +/* + * Default settings for RF registers; values derived from the reference driver. + */ +#define RT2860_RF2850 \ + { 1, 0x100bb3, 0x1301e1, 0x05a014, 0x001402 }, \ + { 2, 0x100bb3, 0x1301e1, 0x05a014, 0x001407 }, \ + { 3, 0x100bb3, 0x1301e2, 0x05a014, 0x001402 }, \ + { 4, 0x100bb3, 0x1301e2, 0x05a014, 0x001407 }, \ + { 5, 0x100bb3, 0x1301e3, 0x05a014, 0x001402 }, \ + { 6, 0x100bb3, 0x1301e3, 0x05a014, 0x001407 }, \ + { 7, 0x100bb3, 0x1301e4, 0x05a014, 0x001402 }, \ + { 8, 0x100bb3, 0x1301e4, 0x05a014, 0x001407 }, \ + { 9, 0x100bb3, 0x1301e5, 0x05a014, 0x001402 }, \ + { 10, 0x100bb3, 0x1301e5, 0x05a014, 0x001407 }, \ + { 11, 0x100bb3, 0x1301e6, 0x05a014, 0x001402 }, \ + { 12, 0x100bb3, 0x1301e6, 0x05a014, 0x001407 }, \ + { 13, 0x100bb3, 0x1301e7, 0x05a014, 0x001402 }, \ + { 14, 0x100bb3, 0x1301e8, 0x05a014, 0x001404 }, \ + { 36, 0x100bb3, 0x130266, 0x056014, 0x001408 }, \ + { 38, 0x100bb3, 0x130267, 0x056014, 0x001404 }, \ + { 40, 0x100bb2, 0x1301a0, 0x056014, 0x001400 }, \ + { 44, 0x100bb2, 0x1301a0, 0x056014, 0x001408 }, \ + { 46, 0x100bb2, 0x1301a1, 0x056014, 0x001402 }, \ + { 48, 0x100bb2, 0x1301a1, 0x056014, 0x001406 }, \ + { 52, 0x100bb2, 0x1301a2, 0x056014, 0x001404 }, \ + { 54, 0x100bb2, 0x1301a2, 0x056014, 0x001408 }, \ + { 56, 0x100bb2, 0x1301a3, 0x056014, 0x001402 }, \ + { 60, 0x100bb2, 0x1301a4, 0x056014, 0x001400 }, \ + { 62, 0x100bb2, 0x1301a4, 0x056014, 0x001404 }, \ + { 64, 0x100bb2, 0x1301a4, 0x056014, 0x001408 }, \ + { 100, 0x100bb2, 0x1301ac, 0x05e014, 0x001400 }, \ + { 102, 0x100bb2, 0x1701ac, 0x15e014, 0x001404 }, \ + { 104, 0x100bb2, 0x1701ac, 0x15e014, 0x001408 }, \ + { 108, 0x100bb3, 0x17028c, 0x15e014, 0x001404 }, \ + { 110, 0x100bb3, 0x13028d, 0x05e014, 0x001400 }, \ + { 112, 0x100bb3, 0x13028d, 0x05e014, 0x001406 }, \ + { 116, 0x100bb3, 0x13028e, 0x05e014, 0x001408 }, \ + { 118, 0x100bb3, 0x13028f, 0x05e014, 0x001404 }, \ + { 120, 0x100bb1, 0x1300e0, 0x05e014, 0x001400 }, \ + { 124, 0x100bb1, 0x1300e0, 0x05e014, 0x001404 }, \ + { 126, 0x100bb1, 0x1300e0, 0x05e014, 0x001406 }, \ + { 128, 0x100bb1, 0x1300e0, 0x05e014, 0x001408 }, \ + { 132, 0x100bb1, 0x1300e1, 0x05e014, 0x001402 }, \ + { 134, 0x100bb1, 0x1300e1, 0x05e014, 0x001404 }, \ + { 136, 0x100bb1, 0x1300e1, 0x05e014, 0x001406 }, \ + { 140, 0x100bb1, 0x1300e2, 0x05e014, 0x001400 }, \ + { 149, 0x100bb1, 0x1300e2, 0x05e014, 0x001409 }, \ + { 151, 0x100bb1, 0x1300e3, 0x05e014, 0x001401 }, \ + { 153, 0x100bb1, 0x1300e3, 0x05e014, 0x001403 }, \ + { 157, 0x100bb1, 0x1300e3, 0x05e014, 0x001407 }, \ + { 159, 0x100bb1, 0x1300e3, 0x05e014, 0x001409 }, \ + { 161, 0x100bb1, 0x1300e4, 0x05e014, 0x001401 }, \ + { 165, 0x100bb1, 0x1300e4, 0x05e014, 0x001405 } + +#define RT3070_RF3020 \ + { 241, 2, 2 }, \ + { 241, 2, 7 }, \ + { 242, 2, 2 }, \ + { 242, 2, 7 }, \ + { 243, 2, 2 }, \ + { 243, 2, 7 }, \ + { 244, 2, 2 }, \ + { 244, 2, 7 }, \ + { 245, 2, 2 }, \ + { 245, 2, 7 }, \ + { 246, 2, 2 }, \ + { 246, 2, 7 }, \ + { 247, 2, 2 }, \ + { 248, 2, 4 } + +#define RT3070_DEF_RF \ + { 4, 0x40 }, \ + { 5, 0x03 }, \ + { 6, 0x02 }, \ + { 7, 0x70 }, \ + { 9, 0x0f }, \ + { 10, 0x41 }, \ + { 11, 0x21 }, \ + { 12, 0x7b }, \ + { 14, 0x90 }, \ + { 15, 0x58 }, \ + { 16, 0xb3 }, \ + { 17, 0x92 }, \ + { 18, 0x2c }, \ + { 19, 0x02 }, \ + { 20, 0xba }, \ + { 21, 0xdb }, \ + { 24, 0x16 }, \ + { 25, 0x01 }, \ + { 29, 0x1f } + +#endif /* _IF_RUNREG_H_ */ diff --git a/sys/dev/usb/wlan/if_runvar.h b/sys/dev/usb/wlan/if_runvar.h new file mode 100644 index 000000000000..28d6feb52b13 --- /dev/null +++ b/sys/dev/usb/wlan/if_runvar.h @@ -0,0 +1,220 @@ +/* $OpenBSD: if_runvar.h,v 1.3 2009/03/26 20:17:27 damien Exp $ */ + +/*- + * Copyright (c) 2008,2009 Damien Bergamini + * ported to FreeBSD by Akinori Furukoshi + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef _IF_RUNVAR_H_ +#define _IF_RUNVAR_H_ + +#define RUN_MAX_RXSZ \ + MIN(4096, MJUMPAGESIZE) +#if 0 + (sizeof (uint32_t) + \ + sizeof (struct rt2860_rxwi) + \ + sizeof (uint16_t) + \ + MCLBYTES + \ + sizeof (struct rt2870_rxd)) +#endif +/* NB: "11" is the maximum number of padding bytes needed for Tx */ +#define RUN_MAX_TXSZ \ + (sizeof (struct rt2870_txd) + \ + sizeof (struct rt2860_rxwi) + \ + MCLBYTES + 11) + +#define RUN_TX_TIMEOUT 5000 /* ms */ + +/* Tx ring count was 8/endpoint, now 32 for all 4 (or 6) endpoints. */ +#define RUN_TX_RING_COUNT 32 +#define RUN_RX_RING_COUNT 1 + +#define RT2870_WCID_MAX 253 +#define RUN_AID2WCID(aid) ((aid) & 0xff) + +struct run_rx_radiotap_header { + struct ieee80211_radiotap_header wr_ihdr; + uint8_t wr_flags; + uint8_t wr_rate; + uint16_t wr_chan_freq; + uint16_t wr_chan_flags; + uint8_t wr_dbm_antsignal; + uint8_t wr_antenna; + uint8_t wr_antsignal; +} __packed; + +#define RUN_RX_RADIOTAP_PRESENT \ + (1 << IEEE80211_RADIOTAP_FLAGS | \ + 1 << IEEE80211_RADIOTAP_RATE | \ + 1 << IEEE80211_RADIOTAP_CHANNEL | \ + 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \ + 1 << IEEE80211_RADIOTAP_ANTENNA | \ + 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) + +struct run_tx_radiotap_header { + struct ieee80211_radiotap_header wt_ihdr; + uint8_t wt_flags; + uint8_t wt_rate; + uint16_t wt_chan_freq; + uint16_t wt_chan_flags; + uint8_t wt_hwqueue; +} __packed; + +#define IEEE80211_RADIOTAP_HWQUEUE 15 + +#define RUN_TX_RADIOTAP_PRESENT \ + (1 << IEEE80211_RADIOTAP_FLAGS | \ + 1 << IEEE80211_RADIOTAP_RATE | \ + 1 << IEEE80211_RADIOTAP_CHANNEL | \ + 1 << IEEE80211_RADIOTAP_HWQUEUE) + +struct run_softc; + +struct run_tx_data { + STAILQ_ENTRY(run_tx_data) next; + struct run_softc *sc; + struct mbuf *m; + struct ieee80211_node *ni; + uint32_t align[0]; /* dummy field */ + uint8_t desc[sizeof(struct rt2870_txd) + + sizeof(struct rt2860_txwi)]; + int ridx; + uint8_t mcs; +}; +STAILQ_HEAD(run_tx_data_head, run_tx_data); + +struct run_node { + struct ieee80211_node ni; + uint8_t ridx[IEEE80211_RATE_MAXSIZE]; + uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE]; +}; + +struct run_vap { + struct ieee80211vap vap; + struct ieee80211_beacon_offsets bo; + struct ieee80211_amrr amrr; + struct ieee80211_amrr_node amn[RT2870_WCID_MAX + 1]; + struct usb_callout amrr_ch; + struct task amrr_task; + uint8_t amrr_run; +#define RUN_AMRR_ON 1 +#define RUN_AMRR_OFF 0 + + int (*newstate)(struct ieee80211vap *, + enum ieee80211_state, int); +}; +#define RUN_VAP(vap) ((struct run_vap *)(vap)) + +/* + * There are 7 bulk endpoints: 1 for RX + * and 6 for TX (4 EDCAs + HCCA + Prio). + * Update 03-14-2009: some devices like the Planex GW-US300MiniS + * seem to have only 4 TX bulk endpoints (Fukaumi Naoki). + */ +enum { + RUN_BULK_TX_BE, /* = WME_AC_BE */ + RUN_BULK_TX_BK, /* = WME_AC_BK */ + RUN_BULK_TX_VI, /* = WME_AC_VI */ + RUN_BULK_TX_VO, /* = WME_AC_VO */ + RUN_BULK_TX_HCCA, + RUN_BULK_TX_PRIO, + RUN_BULK_RX, + RUN_N_XFER, +}; + +#define RUN_EP_QUEUES RUN_BULK_RX + +struct run_endpoint_queue { + struct run_tx_data tx_data[RUN_TX_RING_COUNT]; + struct run_tx_data_head tx_qh; + struct run_tx_data_head tx_fh; + uint32_t tx_nfree; +}; + +struct run_softc { + device_t sc_dev; + struct usb_device *sc_udev; + struct ifnet *sc_ifp; + struct run_vap *sc_rvp; + + int (*sc_srom_read)(struct run_softc *, + uint16_t, uint16_t *); + + uint32_t mac_rev; + uint8_t rf_rev; + uint8_t freq; + uint8_t ntxchains; + uint8_t nrxchains; + int fixed_ridx; + + uint8_t rf24_20mhz; + uint8_t rf24_40mhz; + uint8_t ext_2ghz_lna; + uint8_t ext_5ghz_lna; + uint8_t calib_2ghz; + uint8_t calib_5ghz; + int8_t txpow1[50]; + int8_t txpow2[50]; + int8_t rssi_2ghz[3]; + int8_t rssi_5ghz[3]; + uint8_t lna[4]; + + struct { + uint8_t reg; + uint8_t val; + } bbp[8]; + uint8_t leds; + uint16_t led[3]; + uint32_t txpow20mhz[5]; + uint32_t txpow40mhz_2ghz[5]; + uint32_t txpow40mhz_5ghz[5]; + + uint8_t sc_bssid[6]; + + struct mtx sc_mtx; + + struct run_endpoint_queue sc_epq[RUN_EP_QUEUES]; + + struct task wme_task; + struct task usb_timeout_task; + + struct usb_xfer *sc_xfer[RUN_N_XFER]; + + struct mbuf *rx_m; + + int sifs; + + union { + struct run_rx_radiotap_header th; + uint8_t pad[64]; + } sc_rxtapu; +#define sc_rxtap sc_rxtapu.th + int sc_rxtap_len; + + union { + struct run_tx_radiotap_header th; + uint8_t pad[64]; + } sc_txtapu; +#define sc_txtap sc_txtapu.th + int sc_txtap_len; +}; + +#define RUN_LOCK(sc) mtx_lock(&(sc)->sc_mtx) +#define RUN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) +#define RUN_LOCK_ASSERT(sc, t) mtx_assert(&(sc)->sc_mtx, t) + +#endif /* _IF_RUNVAR_H_ */ diff --git a/sys/dev/usb/wlan/if_uath.c b/sys/dev/usb/wlan/if_uath.c index ca9beb36c59e..7838d5ad3533 100644 --- a/sys/dev/usb/wlan/if_uath.c +++ b/sys/dev/usb/wlan/if_uath.c @@ -188,9 +188,9 @@ static const struct usb_device_id uath_devs[] = { UATH_DEV(NETGEAR, WG111U), UATH_DEV(NETGEAR3, WG111T), UATH_DEV(NETGEAR3, WPN111), + UATH_DEV(NETGEAR3, WPN111_2), UATH_DEV(UMEDIA, TEW444UBEU), UATH_DEV(UMEDIA, AR5523_2), - UATH_DEV(UMEDIA, AR5523_3), UATH_DEV(WISTRONNEWEB, AR5523_1), UATH_DEV(WISTRONNEWEB, AR5523_2), UATH_DEV(ZCOM, AR5523) @@ -2762,6 +2762,9 @@ setup: m = NULL; desc = NULL; } + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 && + !IFQ_IS_EMPTY(&ifp->if_snd)) + uath_start(ifp); UATH_LOCK(sc); break; default: diff --git a/sys/dev/usb/wlan/if_upgt.c b/sys/dev/usb/wlan/if_upgt.c index c04c3985b5b9..20f06c6ddea7 100644 --- a/sys/dev/usb/wlan/if_upgt.c +++ b/sys/dev/usb/wlan/if_upgt.c @@ -292,7 +292,7 @@ upgt_attach(device_t dev) /* Calculate device memory space. */ if (sc->sc_memaddr_frame_start == 0 || sc->sc_memaddr_frame_end == 0) { device_printf(dev, - "could not find memory space addresses on FW!\n"); + "could not find memory space addresses on FW\n"); error = EIO; goto fail5; } @@ -732,7 +732,7 @@ upgt_set_macfilter(struct upgt_softc *sc, uint8_t state) break; default: device_printf(sc->sc_dev, - "MAC filter does not know that state!\n"); + "MAC filter does not know that state\n"); break; } @@ -1181,7 +1181,7 @@ upgt_eeprom_parse(struct upgt_softc *sc) break; case UPGT_EEPROM_TYPE_OFF: DPRINTF(sc, UPGT_DEBUG_FW, - "%s: EEPROM off without end option!\n", __func__); + "%s: EEPROM off without end option\n", __func__); return (EIO); default: DPRINTF(sc, UPGT_DEBUG_FW, @@ -1356,7 +1356,7 @@ upgt_eeprom_read(struct upgt_softc *sc) error = mtx_sleep(sc, &sc->sc_mtx, 0, "eeprom_request", hz); if (error != 0) { device_printf(sc->sc_dev, - "timeout while waiting for EEPROM data!\n"); + "timeout while waiting for EEPROM data\n"); UPGT_UNLOCK(sc); return (EIO); } @@ -1490,7 +1490,7 @@ upgt_rx(struct upgt_softc *sc, uint8_t *data, int pkglen, int *rssi) ("A current mbuf storage is small (%d)", pkglen + ETHER_ALIGN)); m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); if (m == NULL) { - device_printf(sc->sc_dev, "could not create RX mbuf!\n"); + device_printf(sc->sc_dev, "could not create RX mbuf\n"); return (NULL); } m_adj(m, ETHER_ALIGN); @@ -1587,7 +1587,7 @@ upgt_mem_free(struct upgt_softc *sc, uint32_t addr) } device_printf(sc->sc_dev, - "could not free memory address 0x%08x!\n", addr); + "could not free memory address 0x%08x\n", addr); } static int @@ -1602,7 +1602,7 @@ upgt_fw_load(struct upgt_softc *sc) fw = firmware_get(upgt_fwname); if (fw == NULL) { - device_printf(sc->sc_dev, "could not read microcode %s!\n", + device_printf(sc->sc_dev, "could not read microcode %s\n", upgt_fwname); return (EIO); } @@ -1676,7 +1676,7 @@ upgt_fw_load(struct upgt_softc *sc) usbd_transfer_start(sc->sc_xfer[UPGT_BULK_RX]); error = mtx_sleep(sc, &sc->sc_mtx, 0, "upgtfw", 2 * hz); if (error != 0) { - device_printf(sc->sc_dev, "firmware load failed!\n"); + device_printf(sc->sc_dev, "firmware load failed\n"); error = EIO; } @@ -1782,7 +1782,7 @@ upgt_fw_verify(struct upgt_softc *sc) fw = firmware_get(upgt_fwname); if (fw == NULL) { - device_printf(sc->sc_dev, "could not read microcode %s!\n", + device_printf(sc->sc_dev, "could not read microcode %s\n", upgt_fwname); return EIO; } @@ -1802,7 +1802,7 @@ upgt_fw_verify(struct upgt_softc *sc) } if (offset == fw->datasize) { device_printf(sc->sc_dev, - "firmware Boot Record Area not found!\n"); + "firmware Boot Record Area not found\n"); error = EIO; goto fail; } @@ -1827,7 +1827,7 @@ upgt_fw_verify(struct upgt_softc *sc) if (bra_option_len != UPGT_BRA_FWTYPE_SIZE) { device_printf(sc->sc_dev, - "wrong UPGT_BRA_TYPE_FW len!\n"); + "wrong UPGT_BRA_TYPE_FW len\n"); error = EIO; goto fail; } @@ -1842,7 +1842,7 @@ upgt_fw_verify(struct upgt_softc *sc) break; } device_printf(sc->sc_dev, - "unsupported firmware type!\n"); + "unsupported firmware type\n"); error = EIO; goto fail; case UPGT_BRA_TYPE_VERSION: @@ -1946,7 +1946,7 @@ upgt_alloc_tx(struct upgt_softc *sc) data->buf = malloc(MCLBYTES, M_USBDEV, M_NOWAIT | M_ZERO); if (data->buf == NULL) { device_printf(sc->sc_dev, - "could not allocate TX buffer!\n"); + "could not allocate TX buffer\n"); return (ENOMEM); } STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); @@ -1970,7 +1970,7 @@ upgt_alloc_rx(struct upgt_softc *sc) data->buf = malloc(MCLBYTES, M_USBDEV, M_NOWAIT | M_ZERO); if (data->buf == NULL) { device_printf(sc->sc_dev, - "could not allocate RX buffer!\n"); + "could not allocate RX buffer\n"); return (ENOMEM); } STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); @@ -2291,6 +2291,9 @@ setup: (void) ieee80211_input_all(ic, m, rssi, nf); m = NULL; } + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 && + !IFQ_IS_EMPTY(&ifp->if_snd)) + upgt_start(ifp); UPGT_LOCK(sc); break; default: diff --git a/sys/dev/usb/wlan/if_ural.c b/sys/dev/usb/wlan/if_ural.c index f9a90a2a7b77..25fb86fafa56 100644 --- a/sys/dev/usb/wlan/if_ural.c +++ b/sys/dev/usb/wlan/if_ural.c @@ -92,35 +92,37 @@ SYSCTL_INT(_hw_usb_ural, OID_AUTO, debug, CTLFLAG_RW, &ural_debug, 0, /* various supported device vendors/products */ static const struct usb_device_id ural_devs[] = { - { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_WL167G) }, - { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_RALINK_RT2570) }, - { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D7050) }, - { USB_VP(USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D7051) }, - { USB_VP(USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_HU200TS) }, - { USB_VP(USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_WUSB54G) }, - { USB_VP(USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_WUSB54GP) }, - { USB_VP(USB_VENDOR_CONCEPTRONIC2, USB_PRODUCT_CONCEPTRONIC2_C54RU) }, - { USB_VP(USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DWLG122) }, - { USB_VP(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GN54G) }, - { USB_VP(USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNWBKG) }, - { USB_VP(USB_VENDOR_GUILLEMOT, USB_PRODUCT_GUILLEMOT_HWGUSB254) }, - { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_KG54) }, - { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_KG54AI) }, - { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_KG54YB) }, - { USB_VP(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_NINWIFI) }, - { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2570) }, - { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2570_2) }, - { USB_VP(USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2570_3) }, - { USB_VP(USB_VENDOR_NOVATECH, USB_PRODUCT_NOVATECH_NV902) }, - { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2570) }, - { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2570_2) }, - { USB_VP(USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2570_3) }, - { USB_VP(USB_VENDOR_SIEMENS2, USB_PRODUCT_SIEMENS2_WL54G) }, - { USB_VP(USB_VENDOR_SMC, USB_PRODUCT_SMC_2862WG) }, - { USB_VP(USB_VENDOR_SPHAIRON, USB_PRODUCT_SPHAIRON_UB801R) }, - { USB_VP(USB_VENDOR_SURECOM, USB_PRODUCT_SURECOM_RT2570) }, - { USB_VP(USB_VENDOR_VTECH, USB_PRODUCT_VTECH_RT2570) }, - { USB_VP(USB_VENDOR_ZINWELL, USB_PRODUCT_ZINWELL_RT2570) }, +#define URAL_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) } + URAL_DEV(ASUS, WL167G), + URAL_DEV(ASUS, RT2570), + URAL_DEV(BELKIN, F5D7050), + URAL_DEV(BELKIN, F5D7051), + URAL_DEV(CISCOLINKSYS, HU200TS), + URAL_DEV(CISCOLINKSYS, WUSB54G), + URAL_DEV(CISCOLINKSYS, WUSB54GP), + URAL_DEV(CONCEPTRONIC2, C54RU), + URAL_DEV(DLINK, DWLG122), + URAL_DEV(GIGABYTE, GN54G), + URAL_DEV(GIGABYTE, GNWBKG), + URAL_DEV(GUILLEMOT, HWGUSB254), + URAL_DEV(MELCO, KG54), + URAL_DEV(MELCO, KG54AI), + URAL_DEV(MELCO, KG54YB), + URAL_DEV(MELCO, NINWIFI), + URAL_DEV(MSI, RT2570), + URAL_DEV(MSI, RT2570_2), + URAL_DEV(MSI, RT2570_3), + URAL_DEV(NOVATECH, NV902), + URAL_DEV(RALINK, RT2570), + URAL_DEV(RALINK, RT2570_2), + URAL_DEV(RALINK, RT2570_3), + URAL_DEV(SIEMENS2, WL54G), + URAL_DEV(SMC, 2862WG), + URAL_DEV(SPHAIRON, UB801R), + URAL_DEV(SURECOM, RT2570), + URAL_DEV(VTECH, RT2570), + URAL_DEV(ZINWELL, RT2570), +#undef URAL_DEV }; static usb_callback_t ural_bulk_read_callback; @@ -837,6 +839,9 @@ tr_setup: usbd_transfer_submit(xfer); } + RAL_UNLOCK(sc); + ural_start(ifp); + RAL_LOCK(sc); break; default: /* Error */ @@ -945,8 +950,8 @@ tr_setup: * the private mutex of a device! That is why we do the * "ieee80211_input" here, and not some lines up! */ + RAL_UNLOCK(sc); if (m) { - RAL_UNLOCK(sc); ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *)); if (ni != NULL) { @@ -954,8 +959,11 @@ tr_setup: ieee80211_free_node(ni); } else (void) ieee80211_input_all(ic, m, rssi, nf); - RAL_LOCK(sc); } + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 && + !IFQ_IS_EMPTY(&ifp->if_snd)) + ural_start(ifp); + RAL_LOCK(sc); return; default: /* Error */ diff --git a/sys/dev/usb/wlan/if_urtw.c b/sys/dev/usb/wlan/if_urtw.c index 0cd8d3535a37..6604268e009b 100644 --- a/sys/dev/usb/wlan/if_urtw.c +++ b/sys/dev/usb/wlan/if_urtw.c @@ -76,6 +76,7 @@ enum { URTW_DEBUG_STATE = 0x00000020, /* 802.11 state transitions */ URTW_DEBUG_STAT = 0x00000040, /* statistic */ URTW_DEBUG_INIT = 0x00000080, /* initialization of dev */ + URTW_DEBUG_TXSTATUS = 0x00000100, /* tx status */ URTW_DEBUG_ANY = 0xffffffff }; #define DPRINTF(sc, m, fmt, ...) do { \ @@ -102,23 +103,24 @@ TUNABLE_INT("hw.usb.urtw.preamble_mode", &urtw_preamble_mode); #define URTW_REV_RTL8187B 0 #define URTW_REV_RTL8187L 1 static const struct usb_device_id urtw_devs[] = { - { USB_VPI(USB_VENDOR_BELKIN, 0x705e, URTW_REV_RTL8187B) }, - { USB_VPI(USB_VENDOR_REALTEK, 0x8189, URTW_REV_RTL8187B) }, - { USB_VPI(USB_VENDOR_REALTEK, 0x8197, URTW_REV_RTL8187B) }, - { USB_VPI(USB_VENDOR_REALTEK, 0x8198, URTW_REV_RTL8187B) }, - { USB_VPI(USB_VENDOR_NETGEAR, 0x4260, URTW_REV_RTL8187B) }, + URTW_DEV_B(NETGEAR, WG111V3), + URTW_DEV_B(REALTEK, RTL8187B_0), + URTW_DEV_B(REALTEK, RTL8187B_1), + URTW_DEV_B(REALTEK, RTL8187B_2), + URTW_DEV_B(SITECOMEU, WL168V4), + URTW_DEV_L(ASUS, P5B_WIFI), + URTW_DEV_L(BELKIN, F5D7050E), + URTW_DEV_L(LINKSYS4, WUSB54GCV2), + URTW_DEV_L(NETGEAR, WG111V2), + URTW_DEV_L(REALTEK, RTL8187), + URTW_DEV_L(SITECOMEU, WL168V1), + URTW_DEV_L(SURECOM, EP9001G2A), { USB_VPI(0x1b75, 0x8187, URTW_REV_RTL8187L) }, - { USB_VPI(USB_VENDOR_ASUS, 0x171d, URTW_REV_RTL8187L) }, { USB_VPI(USB_VENDOR_DICKSMITH, 0x9401, URTW_REV_RTL8187L) }, { USB_VPI(USB_VENDOR_HP, 0xca02, URTW_REV_RTL8187L) }, { USB_VPI(USB_VENDOR_LOGITEC, 0x010c, URTW_REV_RTL8187L) }, { USB_VPI(USB_VENDOR_NETGEAR, 0x6100, URTW_REV_RTL8187L) }, - URTW_DEV_L(NETGEAR, WG111V2), - URTW_DEV_L(REALTEK, RTL8187), - { USB_VPI(USB_VENDOR_SITECOMEU, 0x000d, URTW_REV_RTL8187L) }, - { USB_VPI(USB_VENDOR_SITECOMEU, 0x0028, URTW_REV_RTL8187B) }, { USB_VPI(USB_VENDOR_SPHAIRON, 0x0150, URTW_REV_RTL8187L) }, - { USB_VPI(USB_VENDOR_SURECOM, 0x11f2, URTW_REV_RTL8187L) }, { USB_VPI(USB_VENDOR_QCOM, 0x6232, URTW_REV_RTL8187L) }, #undef URTW_DEV_L #undef URTW_DEV_B @@ -325,13 +327,47 @@ static struct urtw_pair urtw_8225v2_rf_part1[] = { { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } }; -static struct urtw_pair urtw_8225v2b_rf_part1[] = { +static struct urtw_pair urtw_8225v2b_rf_part0[] = { { 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } }; +static struct urtw_pair urtw_8225v2b_rf_part1[] = { + {0x0f0, 0x32}, {0x0f1, 0x32}, {0x0f2, 0x00}, + {0x0f3, 0x00}, {0x0f4, 0x32}, {0x0f5, 0x43}, + {0x0f6, 0x00}, {0x0f7, 0x00}, {0x0f8, 0x46}, + {0x0f9, 0xa4}, {0x0fa, 0x00}, {0x0fb, 0x00}, + {0x0fc, 0x96}, {0x0fd, 0xa4}, {0x0fe, 0x00}, + {0x0ff, 0x00}, {0x158, 0x4b}, {0x159, 0x00}, + {0x15a, 0x4b}, {0x15b, 0x00}, {0x160, 0x4b}, + {0x161, 0x09}, {0x162, 0x4b}, {0x163, 0x09}, + {0x1ce, 0x0f}, {0x1cf, 0x00}, {0x1e0, 0xff}, + {0x1e1, 0x0f}, {0x1e2, 0x00}, {0x1f0, 0x4e}, + {0x1f1, 0x01}, {0x1f2, 0x02}, {0x1f3, 0x03}, + {0x1f4, 0x04}, {0x1f5, 0x05}, {0x1f6, 0x06}, + {0x1f7, 0x07}, {0x1f8, 0x08}, {0x24e, 0x00}, + {0x20c, 0x04}, {0x221, 0x61}, {0x222, 0x68}, + {0x223, 0x6f}, {0x224, 0x76}, {0x225, 0x7d}, + {0x226, 0x84}, {0x227, 0x8d}, {0x24d, 0x08}, + {0x250, 0x05}, {0x251, 0xf5}, {0x252, 0x04}, + {0x253, 0xa0}, {0x254, 0x1f}, {0x255, 0x23}, + {0x256, 0x45}, {0x257, 0x67}, {0x258, 0x08}, + {0x259, 0x08}, {0x25a, 0x08}, {0x25b, 0x08}, + {0x260, 0x08}, {0x261, 0x08}, {0x262, 0x08}, + {0x263, 0x08}, {0x264, 0xcf}, {0x272, 0x56}, + {0x273, 0x9a}, {0x034, 0xf0}, {0x035, 0x0f}, + {0x05b, 0x40}, {0x084, 0x88}, {0x085, 0x24}, + {0x088, 0x54}, {0x08b, 0xb8}, {0x08c, 0x07}, + {0x08d, 0x00}, {0x094, 0x1b}, {0x095, 0x12}, + {0x096, 0x00}, {0x097, 0x06}, {0x09d, 0x1a}, + {0x09f, 0x10}, {0x0b4, 0x22}, {0x0be, 0x80}, + {0x0db, 0x00}, {0x0ee, 0x00}, {0x091, 0x03}, + {0x24c, 0x00}, {0x39f, 0x00}, {0x08c, 0x01}, + {0x08d, 0x10}, {0x08e, 0x08}, {0x08f, 0x00} +}; + static struct urtw_pair urtw_8225v2_rf_part2[] = { { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, @@ -477,6 +513,7 @@ static const uint8_t urtw_8187b_reg_table[][3] = { static usb_callback_t urtw_bulk_rx_callback; static usb_callback_t urtw_bulk_tx_callback; +static usb_callback_t urtw_bulk_tx_status_callback; static const struct usb_config urtw_8187b_usbconfig[URTW_8187B_N_XFERS] = { [URTW_8187B_BULK_RX] = { @@ -491,6 +528,18 @@ static const struct usb_config urtw_8187b_usbconfig[URTW_8187B_N_XFERS] = { }, .callback = urtw_bulk_rx_callback }, + [URTW_8187B_BULK_TX_STATUS] = { + .type = UE_BULK, + .endpoint = 0x89, + .direction = UE_DIR_IN, + .bufsize = MCLBYTES, + .flags = { + .ext_buffer = 1, + .pipe_bof = 1, + .short_xfer_ok = 1 + }, + .callback = urtw_bulk_tx_status_callback + }, [URTW_8187B_BULK_TX_BE] = { .type = UE_BULK, .endpoint = URTW_8187B_TXPIPE_BE, @@ -702,9 +751,6 @@ static usb_error_t urtw_adapter_start(struct urtw_softc *); static usb_error_t urtw_adapter_start_b(struct urtw_softc *); static usb_error_t urtw_set_mode(struct urtw_softc *, uint32_t); static usb_error_t urtw_8187b_cmd_reset(struct urtw_softc *); -static usb_error_t urtw_write16_i(struct urtw_softc *, int, uint16_t, int); -static usb_error_t urtw_write8_i(struct urtw_softc *, int, uint8_t, int); -static usb_error_t urtw_write32_i(struct urtw_softc *, int, uint32_t, int); static usb_error_t urtw_do_request(struct urtw_softc *, struct usb_device_request *, void *); static usb_error_t urtw_8225v2b_set_txpwrlvl(struct urtw_softc *, int); @@ -712,6 +758,11 @@ static usb_error_t urtw_led_off(struct urtw_softc *, int); static void urtw_abort_xfers(struct urtw_softc *); static struct urtw_data * urtw_getbuf(struct urtw_softc *sc); +static int urtw_compute_txtime(uint16_t, uint16_t, uint8_t, + uint8_t); +static void urtw_updateslot(struct ifnet *); +static void urtw_updateslottask(void *, int); +static void urtw_sysctl_node(struct urtw_softc *); static int urtw_match(device_t dev) @@ -756,6 +807,7 @@ urtw_attach(device_t dev) MTX_DEF); usb_callout_init_mtx(&sc->sc_led_ch, &sc->sc_mtx, 0); TASK_INIT(&sc->sc_led_task, 0, urtw_ledtask, sc); + TASK_INIT(&sc->sc_updateslot_task, 0, urtw_updateslottask, sc); callout_init(&sc->sc_watchdog_ch, 0); if (sc->sc_flags & URTW_RTL8187B) { @@ -844,7 +896,7 @@ urtw_attach(device_t dev) ic->ic_scan_start = urtw_scan_start; ic->ic_scan_end = urtw_scan_end; ic->ic_set_channel = urtw_set_channel; - + ic->ic_updateslot = urtw_updateslot; ic->ic_vap_create = urtw_vap_create; ic->ic_vap_delete = urtw_vap_delete; ic->ic_update_mcast = urtw_update_mcast; @@ -855,6 +907,8 @@ urtw_attach(device_t dev) &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), URTW_RX_RADIOTAP_PRESENT); + urtw_sysctl_node(sc); + if (bootverbose) ieee80211_announce(ic); return (0); @@ -877,6 +931,7 @@ urtw_detach(device_t dev) return (0); urtw_stop(ifp, 1); + ieee80211_draintask(ic, &sc->sc_updateslot_task); ieee80211_draintask(ic, &sc->sc_led_task); usb_callout_drain(&sc->sc_led_ch); @@ -1013,6 +1068,9 @@ urtw_init_locked(void *arg) if (error != 0) goto fail; + if (sc->sc_flags & URTW_RTL8187B) + usbd_transfer_start(sc->sc_xfer[URTW_8187B_BULK_TX_STATUS]); + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; @@ -1035,7 +1093,6 @@ static usb_error_t urtw_adapter_start_b(struct urtw_softc *sc) { #define N(a) (sizeof(a) / sizeof((a)[0])) - int i; uint8_t data8; usb_error_t error; @@ -1067,81 +1124,12 @@ urtw_adapter_start_b(struct urtw_softc *sc) if (error) goto fail; - urtw_write16_m(sc, 0x2d, 0xfff); - urtw_read8_m(sc, URTW_CW_CONF, &data8); - urtw_write8_m(sc, URTW_CW_CONF, data8 | URTW_CW_CONF_PERPACKET_RETRY); - urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); - data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN | - URTW_TX_AGC_CTL_PERPACKET_ANTSEL; - urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); - - error = urtw_write16_i(sc, 0xe0, 0xfff, 1); - if (error) - goto fail; - - urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8); - urtw_write8_m(sc, URTW_RATE_FALLBACK, data8 | URTW_RATE_FALLBACK_ENABLE); - - urtw_write16_m(sc, URTW_ATIM_WND, 2); - urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); - error = urtw_write16_i(sc, 0xd4, 0xffff, 1); - if (error) - goto fail; - - error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); - if (error) - goto fail; - urtw_read8_m(sc, URTW_CONFIG1, &data8); - urtw_write8_m(sc, URTW_CONFIG1, (data8 & 0x3f) | 0x80); - error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); - if (error) - goto fail; - - urtw_write8_m(sc, URTW_WPA_CONFIG, 0); - for (i = 0; i < N(urtw_8187b_reg_table); i++) { - error = urtw_write8_i(sc, urtw_8187b_reg_table[i][0], - urtw_8187b_reg_table[i][1], urtw_8187b_reg_table[i][2]); - if (error) - goto fail; - } - - urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50); - urtw_write16_m(sc, URTW_INT_MIG, 0); - - error = urtw_write32_i(sc, 0xf0, 0, 1); - if (error) - goto fail; - error = urtw_write32_i(sc, 0xf4, 0, 1); - if (error) - goto fail; - error = urtw_write8_i(sc, 0xf8, 0, 1); - if (error) - goto fail; - - urtw_write32_m(sc, URTW_RF_TIMING, 0x00004001); - - error = urtw_write16_i(sc, 0x72, 0x569a, 2); - if (error) - goto fail; - - error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); - if (error) - goto fail; - urtw_read8_m(sc, URTW_CONFIG3, &data8); - urtw_write8_m(sc, URTW_CONFIG3, data8 | URTW_CONFIG3_ANAPARAM_WRITE); - error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); - if (error) - goto fail; - - urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480); - urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488); - urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff); - usb_pause_mtx(&sc->sc_mtx, 100); - error = sc->sc_rf_init(sc); if (error != 0) goto fail; + urtw_write8_m(sc, URTW_CMD, URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE); + /* fix RTL8187B RX stall */ error = urtw_intr_enable(sc); if (error) goto fail; @@ -1170,42 +1158,21 @@ urtw_adapter_start_b(struct urtw_softc *sc) urtw_read8_m(sc, 0xdb, &data8); urtw_write8_m(sc, 0xdb, data8 | (1 << 2)); - error = urtw_write16_i(sc, 0x72, 0x59fa, 3); - if (error) - goto fail; - error = urtw_write16_i(sc, 0x74, 0x59d2, 3); - if (error) - goto fail; - error = urtw_write16_i(sc, 0x76, 0x59d2, 3); - if (error) - goto fail; - error = urtw_write16_i(sc, 0x78, 0x19fa, 3); - if (error) - goto fail; - error = urtw_write16_i(sc, 0x7a, 0x19fa, 3); - if (error) - goto fail; - error = urtw_write16_i(sc, 0x7c, 0x00d0, 3); - if (error) - goto fail; + urtw_write16_m(sc, 0x372, 0x59fa); + urtw_write16_m(sc, 0x374, 0x59d2); + urtw_write16_m(sc, 0x376, 0x59d2); + urtw_write16_m(sc, 0x378, 0x19fa); + urtw_write16_m(sc, 0x37a, 0x19fa); + urtw_write16_m(sc, 0x37c, 0x00d0); urtw_write8_m(sc, 0x61, 0); - error = urtw_write8_i(sc, 0x80, 0x0f, 1); - if (error) - goto fail; - error = urtw_write8_i(sc, 0x83, 0x03, 1); - if (error) - goto fail; + + urtw_write8_m(sc, 0x180, 0x0f); + urtw_write8_m(sc, 0x183, 0x03); urtw_write8_m(sc, 0xda, 0x10); - error = urtw_write8_i(sc, 0x4d, 0x08, 2); - if (error) - goto fail; - - urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321B); - - error = urtw_write16_i(sc, 0xec, 0x800, 1); - if (error) - goto fail; + urtw_write8_m(sc, 0x24d, 0x08); + urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b); + urtw_write16_m(sc, 0x1ec, 0x800); /* RX MAX SIZE */ fail: return (error); #undef N @@ -1309,40 +1276,10 @@ urtw_8187b_cmd_reset(struct urtw_softc *sc) device_printf(sc->sc_dev, "reset timeout\n"); goto fail; } - - error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD); - if (error) - goto fail; - - for (i = 0; i < 20; i++) { - usb_pause_mtx(&sc->sc_mtx, 4); - urtw_read8_m(sc, URTW_EPROM_CMD, &data8); - if (!(data8 & URTW_EPROM_CMD_CONFIG)) - break; - } - if (i >= 20) { - device_printf(sc->sc_dev, "eeprom reset timeout\n"); - goto fail; - } - fail: return (error); } -static usb_error_t -urtw_write16_i(struct urtw_softc *sc, int val, uint16_t data, int idx) -{ - struct usb_device_request req; - - req.bmRequestType = UT_WRITE_VENDOR_DEVICE; - req.bRequest = URTW_8187_SETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, idx & 0x3); - USETW(req.wLength, sizeof(uint16_t)); - - return (urtw_do_request(sc, &req, &data)); -} - static usb_error_t urtw_do_request(struct urtw_softc *sc, struct usb_device_request *req, void *data) @@ -1366,34 +1303,6 @@ urtw_do_request(struct urtw_softc *sc, return (err); } -static usb_error_t -urtw_write8_i(struct urtw_softc *sc, int val, uint8_t data, int idx) -{ - struct usb_device_request req; - - req.bmRequestType = UT_WRITE_VENDOR_DEVICE; - req.bRequest = URTW_8187_SETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, idx & 0x3); - USETW(req.wLength, sizeof(uint8_t)); - - return (urtw_do_request(sc, &req, &data)); -} - -static usb_error_t -urtw_write32_i(struct urtw_softc *sc, int val, uint32_t data, int idx) -{ - struct usb_device_request req; - - req.bmRequestType = UT_WRITE_VENDOR_DEVICE; - req.bRequest = URTW_8187_SETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, idx & 0x3); - USETW(req.wLength, sizeof(uint32_t)); - - return (urtw_do_request(sc, &req, &data)); -} - static void urtw_stop_locked(struct ifnet *ifp, int disable) { @@ -1533,6 +1442,7 @@ urtw_start(struct ifnet *ifp) } sc->sc_txtimer = 5; + callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); } URTW_UNLOCK(sc); } @@ -1732,14 +1642,12 @@ static int urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, struct urtw_data *data, int prior) { - int xferlen; struct ifnet *ifp = sc->sc_ifp; struct ieee80211_frame *wh = mtod(m0, struct ieee80211_frame *); struct ieee80211_key *k; const struct ieee80211_txparam *tp; struct ieee80211com *ic = ifp->if_l2com; struct ieee80211vap *vap = ni->ni_vap; - struct urtw_8187b_txhdr *hdr; struct usb_xfer *rtl8187b_pipes[URTW_8187B_TXPIPE_MAX] = { sc->sc_xfer[URTW_8187B_BULK_TX_BE], sc->sc_xfer[URTW_8187B_BULK_TX_BK], @@ -1747,6 +1655,10 @@ urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, sc->sc_xfer[URTW_8187B_BULK_TX_VO] }; struct usb_xfer *xfer; + int dur = 0, rtsdur = 0, rtsenable = 0, ctsenable = 0, rate, + pkttime = 0, txdur = 0, isshort = 0, xferlen; + uint16_t acktime, rtstime, ctstime; + uint32_t flags; usb_error_t error; URTW_ASSERT_LOCKED(sc); @@ -1779,60 +1691,109 @@ urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, ieee80211_radiotap_tx(vap, m0); } + if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_MGT || + (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) { + tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; + rate = tp->mgmtrate; + } else { + tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; + /* for data frames */ + if (IEEE80211_IS_MULTICAST(wh->i_addr1)) + rate = tp->mcastrate; + else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) + rate = tp->ucastrate; + else + rate = urtw_rtl2rate(sc->sc_currate); + } + + sc->sc_stats.txrates[sc->sc_currate]++; + + if (IEEE80211_IS_MULTICAST(wh->i_addr1)) + txdur = pkttime = urtw_compute_txtime(m0->m_pkthdr.len + + IEEE80211_CRC_LEN, rate, 0, 0); + else { + acktime = urtw_compute_txtime(14, 2,0, 0); + if ((m0->m_pkthdr.len + 4) > vap->iv_rtsthreshold) { + rtsenable = 1; + ctsenable = 0; + rtstime = urtw_compute_txtime(URTW_ACKCTS_LEN, 2, 0, 0); + ctstime = urtw_compute_txtime(14, 2, 0, 0); + pkttime = urtw_compute_txtime(m0->m_pkthdr.len + + IEEE80211_CRC_LEN, rate, 0, isshort); + rtsdur = ctstime + pkttime + acktime + + 3 * URTW_ASIFS_TIME; + txdur = rtstime + rtsdur; + } else { + rtsenable = ctsenable = rtsdur = 0; + pkttime = urtw_compute_txtime(m0->m_pkthdr.len + + IEEE80211_CRC_LEN, rate, 0, isshort); + txdur = pkttime + URTW_ASIFS_TIME + acktime; + } + + if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) + dur = urtw_compute_txtime(m0->m_pkthdr.len + + IEEE80211_CRC_LEN, rate, 0, isshort) + + 3 * URTW_ASIFS_TIME + + 2 * acktime; + else + dur = URTW_ASIFS_TIME + acktime; + } + *(uint16_t *)wh->i_dur = htole16(dur); + xferlen = m0->m_pkthdr.len; xferlen += (sc->sc_flags & URTW_RTL8187B) ? (4 * 8) : (4 * 3); if ((0 == xferlen % 64) || (0 == xferlen % 512)) xferlen += 1; bzero(data->buf, URTW_TX_MAXSIZE); - data->buf[0] = m0->m_pkthdr.len & 0xff; - data->buf[1] = (m0->m_pkthdr.len & 0x0f00) >> 8; - data->buf[1] |= (1 << 7); - + flags = m0->m_pkthdr.len & 0xfff; + flags |= URTW_TX_FLAG_NO_ENC; if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) && (sc->sc_preamble_mode == URTW_PREAMBLE_MODE_SHORT) && (sc->sc_currate != 0)) - data->buf[2] |= 1; - if ((m0->m_pkthdr.len > vap->iv_rtsthreshold) && - prior == URTW_PRIORITY_LOW) { - device_printf(sc->sc_dev, "TODO tx.\n"); - return (EIO); - } + flags |= URTW_TX_FLAG_SPLCP; if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) - data->buf[2] |= (1 << 1); - /* RTS rate - 10 means we use a basic rate. */ - data->buf[2] |= (urtw_rate2rtl(2) << 3); - /* - * XXX currently TX rate control depends on the rate value of - * RX descriptor because I don't know how to we can control TX rate - * in more smart way. Please fix me you find a thing. - */ - data->buf[3] = sc->sc_currate; - if (prior == URTW_PRIORITY_NORMAL) { - tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; - if (IEEE80211_IS_MULTICAST(wh->i_addr1)) - data->buf[3] = urtw_rate2rtl(tp->mcastrate); - else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) - data->buf[3] = urtw_rate2rtl(tp->ucastrate); - } + flags |= URTW_TX_FLAG_MOREFRAG; + + flags |= (sc->sc_currate & 0xf) << URTW_TX_FLAG_TXRATE_SHIFT; if (sc->sc_flags & URTW_RTL8187B) { - hdr = (struct urtw_8187b_txhdr *)data->buf; - hdr->rts_duration = 0; - hdr->len = 0; - hdr->retry = 3 | (7 << 4) | 11; - hdr->tx_duration = ieee80211_compute_duration(ic->ic_rt, - m0->m_pkthdr.len + IEEE80211_CRC_LEN, - urtw_rtl2rate(data->buf[3]), - (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0); - /* XXX MUST fill another variables like rts_duration, tx_.. */ - m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[32]); + struct urtw_8187b_txhdr *tx; + + tx = (struct urtw_8187b_txhdr *)data->buf; + if (ctsenable) + flags |= URTW_TX_FLAG_CTS; + if (rtsenable) { + flags |= URTW_TX_FLAG_RTS; + flags |= (urtw_rate2rtl(11) & 0xf) << + URTW_TX_FLAG_RTSRATE_SHIFT; + tx->rtsdur = rtsdur; + } + tx->flag = htole32(flags); + tx->txdur = txdur; + if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == + IEEE80211_FC0_TYPE_MGT && + (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == + IEEE80211_FC0_SUBTYPE_PROBE_RESP) + tx->retry = 1; + else + tx->retry = URTW_TX_MAXRETRY; + m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); } else { - data->buf[8] = 3; /* CW minimum */ - data->buf[8] |= (7 << 4); /* CW maximum */ - data->buf[9] |= 11; /* retry limitation */ - m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[12]); + struct urtw_8187l_txhdr *tx; + + tx = (struct urtw_8187l_txhdr *)data->buf; + if (rtsenable) { + flags |= URTW_TX_FLAG_RTS; + tx->rtsdur = rtsdur; + } + flags |= (urtw_rate2rtl(11) & 0xf) << URTW_TX_FLAG_RTSRATE_SHIFT; + tx->flag = htole32(flags); + tx->retry = 3; /* CW minimum */ + tx->retry = 7 << 4; /* CW maximum */ + tx->retry = URTW_TX_MAXRETRY << 8; /* retry limitation */ + m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); } data->buflen = xferlen; @@ -2053,8 +2014,8 @@ urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data) req.bmRequestType = UT_READ_VENDOR_DEVICE; req.bRequest = URTW_8187_GETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, 0); + USETW(req.wValue, (val & 0xff) | 0xff00); + USETW(req.wIndex, (val >> 8) & 0x3); USETW(req.wLength, sizeof(uint8_t)); error = urtw_do_request(sc, &req, data); @@ -2071,8 +2032,8 @@ urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data) req.bmRequestType = UT_READ_VENDOR_DEVICE; req.bRequest = URTW_8187_GETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, 0); + USETW(req.wValue, (val & 0xff) | 0xff00); + USETW(req.wIndex, (val >> 8) & 0x3); USETW(req.wLength, sizeof(uint16_t)); error = urtw_do_request(sc, &req, data); @@ -2089,8 +2050,8 @@ urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data) req.bmRequestType = UT_READ_VENDOR_DEVICE; req.bRequest = URTW_8187_GETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, 0); + USETW(req.wValue, (val & 0xff) | 0xff00); + USETW(req.wIndex, (val >> 8) & 0x3); USETW(req.wLength, sizeof(uint32_t)); error = urtw_do_request(sc, &req, data); @@ -2106,8 +2067,8 @@ urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data) req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = URTW_8187_SETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, 0); + USETW(req.wValue, (val & 0xff) | 0xff00); + USETW(req.wIndex, (val >> 8) & 0x3); USETW(req.wLength, sizeof(uint8_t)); return (urtw_do_request(sc, &req, &data)); @@ -2122,8 +2083,8 @@ urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data) req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = URTW_8187_SETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, 0); + USETW(req.wValue, (val & 0xff) | 0xff00); + USETW(req.wIndex, (val >> 8) & 0x3); USETW(req.wLength, sizeof(uint16_t)); return (urtw_do_request(sc, &req, &data)); @@ -2138,8 +2099,8 @@ urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data) req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = URTW_8187_SETREGS_REQ; - USETW(req.wValue, val | 0xff00); - USETW(req.wIndex, 0); + USETW(req.wValue, (val & 0xff) | 0xff00); + USETW(req.wIndex, (val >> 8) & 0x3); USETW(req.wLength, sizeof(uint32_t)); return (urtw_do_request(sc, &req, &data)); @@ -2403,6 +2364,38 @@ urtw_get_rfchip(struct urtw_softc *sc) uint32_t data; usb_error_t error; + if (sc->sc_flags & URTW_RTL8187B) { + urtw_read8_m(sc, 0xe1, &data8); + switch (data8) { + case 0: + sc->sc_flags |= URTW_RTL8187B_REV_B; + break; + case 1: + sc->sc_flags |= URTW_RTL8187B_REV_D; + break; + case 2: + sc->sc_flags |= URTW_RTL8187B_REV_E; + break; + default: + device_printf(sc->sc_dev, "unknown type: %#x\n", data8); + sc->sc_flags |= URTW_RTL8187B_REV_B; + break; + } + } else { + urtw_read32_m(sc, URTW_TX_CONF, &data); + switch (data & URTW_TX_HWMASK) { + case URTW_TX_R8187vD_B: + sc->sc_flags |= URTW_RTL8187B; + break; + case URTW_TX_R8187vD: + break; + default: + device_printf(sc->sc_dev, "unknown RTL8187L type: %#x\n", + data & URTW_TX_HWMASK); + break; + } + } + error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data); if (error != 0) goto fail; @@ -2436,12 +2429,6 @@ urtw_get_rfchip(struct urtw_softc *sc) /* never reach */ } - if (sc->sc_flags & URTW_RTL8187B) { - urtw_read8_m(sc, 0xe1, &data8); - sc->sc_flags |= (data8 == 0) ? URTW_RTL8187B_REV_B : - (data8 == 1) ? URTW_RTL8187B_REV_D : URTW_RTL8187B_REV_E; - } - device_printf(sc->sc_dev, "%s rf %s hwrev %s\n", (sc->sc_flags & URTW_RTL8187B) ? "rtl8187b" : "rtl8187l", ((data & 0xff) == URTW_EPROM_RFCHIPID_RTL8225U) ? "rtl8225u" : @@ -2761,8 +2748,6 @@ fail0: return (error); static usb_error_t urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan) { - struct ieee80211com *ic = sc->sc_ifp->if_l2com; - struct ieee80211_channel *c = ic->ic_curchan; usb_error_t error; error = urtw_8225_set_txpwrlvl(sc, chan); @@ -2770,27 +2755,6 @@ urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan) goto fail; urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); usb_pause_mtx(&sc->sc_mtx, 10); - - urtw_write8_m(sc, URTW_SIFS, 0x22); - - if (sc->sc_state == IEEE80211_S_ASSOC && - ic->ic_flags & IEEE80211_F_SHSLOT) - urtw_write8_m(sc, URTW_SLOT, 0x9); - else - urtw_write8_m(sc, URTW_SLOT, 0x14); - - if (IEEE80211_IS_CHAN_G(c)) { - /* for G */ - urtw_write8_m(sc, URTW_DIFS, 0x14); - urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14); - urtw_write8_m(sc, URTW_CW_VAL, 0x73); - } else { - /* for B */ - urtw_write8_m(sc, URTW_DIFS, 0x24); - urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24); - urtw_write8_m(sc, URTW_CW_VAL, 0xa5); - } - fail: return (error); } @@ -3038,8 +3002,6 @@ fail: static usb_error_t urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan) { - struct ieee80211com *ic = sc->sc_ifp->if_l2com; - struct ieee80211_channel *c = ic->ic_curchan; usb_error_t error; error = urtw_8225v2_set_txpwrlvl(sc, chan); @@ -3048,27 +3010,6 @@ urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan) urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); usb_pause_mtx(&sc->sc_mtx, 10); - - urtw_write8_m(sc, URTW_SIFS, 0x22); - - if(sc->sc_state == IEEE80211_S_ASSOC && - ic->ic_flags & IEEE80211_F_SHSLOT) - urtw_write8_m(sc, URTW_SLOT, 0x9); - else - urtw_write8_m(sc, URTW_SLOT, 0x14); - - if (IEEE80211_IS_CHAN_G(c)) { - /* for G */ - urtw_write8_m(sc, URTW_DIFS, 0x14); - urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14); - urtw_write8_m(sc, URTW_CW_VAL, 0x73); - } else { - /* for B */ - urtw_write8_m(sc, URTW_DIFS, 0x24); - urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24); - urtw_write8_m(sc, URTW_CW_VAL, 0xa5); - } - fail: return (error); } @@ -3271,53 +3212,156 @@ urtw_8225v2b_rf_init(struct urtw_softc *sc) { #define N(a) (sizeof(a) / sizeof((a)[0])) int i; + uint8_t data8; usb_error_t error; + error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); + if (error) + goto fail; + + /* + * initialize extra registers on 8187 + */ + urtw_write16_m(sc, URTW_BRSR_8187B, 0xfff); + + /* retry limit */ + urtw_read8_m(sc, URTW_CW_CONF, &data8); + data8 |= URTW_CW_CONF_PERPACKET_RETRY; + urtw_write8_m(sc, URTW_CW_CONF, data8); + + /* TX AGC */ + urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); + data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN; + urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); + + /* Auto Rate Fallback Control */ +#define URTW_ARFR 0x1e0 + urtw_write16_m(sc, URTW_ARFR, 0xfff); + urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8); + urtw_write8_m(sc, URTW_RATE_FALLBACK, + data8 | URTW_RATE_FALLBACK_ENABLE); + + urtw_read8_m(sc, URTW_MSR, &data8); + urtw_write8_m(sc, URTW_MSR, data8 & 0xf3); + urtw_read8_m(sc, URTW_MSR, &data8); + urtw_write8_m(sc, URTW_MSR, data8 | URTW_MSR_LINK_ENEDCA); + urtw_write8_m(sc, URTW_ACM_CONTROL, sc->sc_acmctl); + + urtw_write16_m(sc, URTW_ATIM_WND, 2); + urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); +#define URTW_FEMR_FOR_8187B 0x1d4 + urtw_write16_m(sc, URTW_FEMR_FOR_8187B, 0xffff); + + /* led type */ + urtw_read8_m(sc, URTW_CONFIG1, &data8); + data8 = (data8 & 0x3f) | 0x80; + urtw_write8_m(sc, URTW_CONFIG1, data8); + + /* applying MAC address again. */ + urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]); + urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff); + + error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); + if (error) + goto fail; + + urtw_write8_m(sc, URTW_WPA_CONFIG, 0); + + /* + * MAC configuration + */ for (i = 0; i < N(urtw_8225v2b_rf_part1); i++) - urtw_8225_write(sc, urtw_8225v2b_rf_part1[i].reg, + urtw_write8_m(sc, urtw_8225v2b_rf_part1[i].reg, urtw_8225v2b_rf_part1[i].val); + urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50); + urtw_write16_m(sc, URTW_INT_MIG, 0x0000); + urtw_write32_m(sc, 0x1f0, 0); + urtw_write32_m(sc, 0x1f4, 0); + urtw_write8_m(sc, 0x1f8, 0); + urtw_write32_m(sc, URTW_RF_TIMING, 0x4001); - urtw_8225_write(sc, - URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC1); +#define URTW_RFSW_CTRL 0x272 + urtw_write16_m(sc, URTW_RFSW_CTRL, 0x569a); - for (i = 0; i < N(urtw_8225v2b_rxgain); i++) { + /* + * initialize PHY + */ + error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); + if (error) + goto fail; + urtw_read8_m(sc, URTW_CONFIG3, &data8); + urtw_write8_m(sc, URTW_CONFIG3, + data8 | URTW_CONFIG3_ANAPARAM_WRITE); + + error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); + if (error) + goto fail; + + /* setup RFE initial timing */ + urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480); + urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488); + urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff); + usb_pause_mtx(&sc->sc_mtx, 1100); + + for (i = 0; i < N(urtw_8225v2b_rf_part0); i++) { + urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg, + urtw_8225v2b_rf_part0[i].val); + usb_pause_mtx(&sc->sc_mtx, 1); + } + urtw_8225_write(sc, 0x00, 0x01b7); + + for (i = 0; i < 95; i++) { urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); + usb_pause_mtx(&sc->sc_mtx, 1); urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, urtw_8225v2b_rxgain[i]); + usb_pause_mtx(&sc->sc_mtx, 1); } urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080); + usb_pause_mtx(&sc->sc_mtx, 1); urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004); + usb_pause_mtx(&sc->sc_mtx, 1); urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7); + usb_pause_mtx(&sc->sc_mtx, 1); + usb_pause_mtx(&sc->sc_mtx, 3000); urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d); + usb_pause_mtx(&sc->sc_mtx, 2000); urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d); + usb_pause_mtx(&sc->sc_mtx, 1); urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf); + usb_pause_mtx(&sc->sc_mtx, 1); urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03); urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07); urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03); urtw_8187_write_phy_ofdm(sc, 0x80, 0x12); - for (i = 0; i < N(urtw_8225z2_agc); i++) { - urtw_8187_write_phy_ofdm(sc, 0xf, urtw_8225z2_agc[i]); - urtw_8187_write_phy_ofdm(sc, 0xe, 0x80 + i); - urtw_8187_write_phy_ofdm(sc, 0xe, 0); + for (i = 0; i < 128; i++) { + uint32_t addr, data; + + data = (urtw_8225z2_agc[i] << 8) | 0x0000008f; + addr = ((i + 0x80) << 8) | 0x0000008e; + + urtw_8187_write_phy_ofdm(sc, data & 0x7f, (data >> 8) & 0xff); + urtw_8187_write_phy_ofdm(sc, addr & 0x7f, (addr >> 8) & 0xff); + urtw_8187_write_phy_ofdm(sc, 0x0e, 0x00); } urtw_8187_write_phy_ofdm(sc, 0x80, 0x10); for (i = 0; i < N(urtw_8225v2b_rf_part2); i++) urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2b_rf_part2[i].val); - urtw_write32_m(sc, 0xf0, (7 << 12) | (3 << 8) | 0x1c); - urtw_write32_m(sc, 0xf4, (7 << 12) | (3 << 8) | 0x1c); - urtw_write32_m(sc, 0xf8, (7 << 12) | (3 << 8) | 0x1c); - urtw_write32_m(sc, 0xfc, (7 << 12) | (3 << 8) | 0x1c); - urtw_write8_m(sc, URTW_ACM_CONTROL, 0); + urtw_write32_m(sc, URTW_8187B_AC_VO, (7 << 12) | (3 << 8) | 0x1c); + urtw_write32_m(sc, URTW_8187B_AC_VI, (7 << 12) | (3 << 8) | 0x1c); + urtw_write32_m(sc, URTW_8187B_AC_BE, (7 << 12) | (3 << 8) | 0x1c); + urtw_write32_m(sc, URTW_8187B_AC_BK, (7 << 12) | (3 << 8) | 0x1c); urtw_8187_write_phy_ofdm(sc, 0x97, 0x46); urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6); urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc); urtw_8187_write_phy_cck(sc, 0xc1, 0x88); + fail: return (error); #undef N @@ -3326,8 +3370,6 @@ fail: static usb_error_t urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan) { - int ack; - struct ieee80211com *ic = sc->sc_ifp->if_l2com; usb_error_t error; error = urtw_8225v2b_set_txpwrlvl(sc, chan); @@ -3336,33 +3378,6 @@ urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan) urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); usb_pause_mtx(&sc->sc_mtx, 10); - - urtw_write8_m(sc, URTW_SIFS, 0xa); - if (ic->ic_flags & IEEE80211_F_SHSLOT) { - urtw_write8_m(sc, URTW_SLOT, 0x9); - urtw_write8_m(sc, URTW_DIFS, 0x1c); - /* In 8187B, BRSR + 1 ==> EIFS register */ - urtw_write8_m(sc, URTW_BRSR + 1, 0x53); - - ack = 112 + 48 + 0x1c; - ack += (ic->ic_flags & IEEE80211_F_SHPREAMBLE) ? - 72 : 144; - urtw_write8_m(sc, URTW_CARRIER_SCOUNT, - roundup2(ack, 4)); - } else { - urtw_write8_m(sc, URTW_SLOT, 0x14); - urtw_write8_m(sc, URTW_DIFS, 0x32); - /* In 8187B, BRSR + 1 ==> EIFS register */ - urtw_write8_m(sc, URTW_BRSR + 1, 0x5b); - - ack = 112 + 48 + 0x32; - ack += (ic->ic_flags & IEEE80211_F_SHPREAMBLE) ? - 72 : 144; - urtw_write8_m(sc, URTW_CARRIER_SCOUNT, - roundup2(ack, 4)); - - } - fail: return (error); } @@ -3818,8 +3833,10 @@ urtw_rx_enable(struct urtw_softc *sc) if (error != 0) goto fail; - urtw_read8_m(sc, URTW_CMD, &data); - urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE); + if ((sc->sc_flags & URTW_RTL8187B) == 0) { + urtw_read8_m(sc, URTW_CMD, &data); + urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE); + } fail: return (error); } @@ -3843,8 +3860,9 @@ urtw_tx_enable(struct urtw_softc *sc) (7 << 21); /* MAX TX DMA */ urtw_write32_m(sc, URTW_TX_CONF, data); - urtw_read8_m(sc, URTW_CMD, &data8); - urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE); + urtw_read8_m(sc, URTW_MSR, &data8); + data8 |= URTW_MSR_LINK_ENEDCA; + urtw_write8_m(sc, URTW_MSR, data8); return (error); } @@ -3928,14 +3946,13 @@ static struct mbuf * urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p, int8_t *nf_p) { - int actlen, flen, len, nf = -95, rssi; + int actlen, flen, rssi; struct ieee80211_frame *wh; struct mbuf *m, *mnew; - struct urtw_8187b_rxhdr *bhdr; struct urtw_softc *sc = data->sc; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - uint8_t *desc, quality = 0, rate; + uint8_t noise = 0, rate; usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); @@ -3945,39 +3962,34 @@ urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p, } if (sc->sc_flags & URTW_RTL8187B) { - len = actlen - (sizeof(struct urtw_8187b_rxhdr)); - bhdr = (struct urtw_8187b_rxhdr *)(data->buf + len); - desc = data->buf + len; - flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + struct urtw_8187b_rxhdr *rx; + + rx = (struct urtw_8187b_rxhdr *)(data->buf + + (actlen - (sizeof(struct urtw_8187b_rxhdr)))); + flen = le32toh(rx->flag) & 0xfff; if (flen > actlen) { ifp->if_ierrors++; return (NULL); } - rate = (le32toh(bhdr->flags) >> 20) & 0xf; - rssi = 14 + (bhdr->rssi / 2); - if (rssi > 95) - rssi = 95; + rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; + /* XXX correct? */ + rssi = rx->rssi & URTW_RX_RSSI_MASK; + noise = rx->noise; } else { - /* 4 dword and 4 byte CRC */ - len = actlen - (4 * 4); - desc = data->buf + len; - flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + struct urtw_8187l_rxhdr *rx; + + rx = (struct urtw_8187l_rxhdr *)(data->buf + + (actlen - (sizeof(struct urtw_8187l_rxhdr)))); + flen = le32toh(rx->flag) & 0xfff; if (flen > actlen) { ifp->if_ierrors++; return (NULL); } - rate = (desc[2] & 0xf0) >> 4; - quality = desc[4] & 0xff; - /* XXX correct? */ - rssi = (desc[6] & 0xfe) >> 1; - if (!urtw_isbmode(rate)) { - rssi = (rssi > 90) ? 90 : ((rssi < 25) ? 25 : rssi); - rssi = ((90 - rssi) * 100) / 65; - } else { - rssi = (rssi > 90) ? 95 : ((rssi < 30) ? 30 : rssi); - rssi = ((95 - rssi) * 100) / 65; - } + rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; + /* XXX correct? */ + rssi = rx->rssi & URTW_RX_8187L_RSSI_MASK; + noise = rx->noise; } mnew = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); @@ -3992,7 +4004,7 @@ urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p, /* finalize mbuf */ m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.len = m->m_len = flen - 4; + m->m_pkthdr.len = m->m_len = flen - IEEE80211_CRC_LEN; if (ieee80211_radiotap_active(ic)) { struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap; @@ -4006,12 +4018,9 @@ urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p, wh = mtod(m, struct ieee80211_frame *); if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) sc->sc_currate = (rate > 0) ? rate : sc->sc_currate; - /* XXX correct? */ - if ((sc->sc_flags & URTW_RTL8187B) == 0) - nf = (quality > 64) ? 0 : ((64 - quality) * 100) / 64; *rssi_p = rssi; - *nf_p = nf; + *nf_p = noise; /* XXX correct? */ return (m); } @@ -4089,6 +4098,62 @@ setup: } } +#define URTW_STATUS_TYPE_TXCLOSE 1 +#define URTW_STATUS_TYPE_BEACON_INTR 0 + +static void +urtw_txstatus_eof(struct usb_xfer *xfer) +{ + struct urtw_softc *sc = usbd_xfer_softc(xfer); + struct ifnet *ifp = sc->sc_ifp; + int actlen, type, pktretry, seq; + uint64_t val; + + usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); + + if (actlen != sizeof(uint64_t)) + return; + + val = le64toh(sc->sc_txstatus); + type = (val >> 30) & 0x3; + if (type == URTW_STATUS_TYPE_TXCLOSE) { + pktretry = val & 0xff; + seq = (val >> 16) & 0xff; + if (pktretry == URTW_TX_MAXRETRY) + ifp->if_oerrors++; + DPRINTF(sc, URTW_DEBUG_TXSTATUS, "pktretry %d seq %#x\n", + pktretry, seq); + } +} + +static void +urtw_bulk_tx_status_callback(struct usb_xfer *xfer, usb_error_t error) +{ + struct urtw_softc *sc = usbd_xfer_softc(xfer); + struct ifnet *ifp = sc->sc_ifp; + + URTW_ASSERT_LOCKED(sc); + + switch (USB_GET_STATE(xfer)) { + case USB_ST_TRANSFERRED: + urtw_txstatus_eof(xfer); + /* FALLTHROUGH */ + case USB_ST_SETUP: +setup: + usbd_xfer_set_frame_data(xfer, 0, &sc->sc_txstatus, + sizeof(int64_t)); + usbd_transfer_submit(xfer); + break; + default: + if (error != USB_ERR_CANCELLED) { + usbd_xfer_set_stall(xfer); + ifp->if_ierrors++; + goto setup; + } + break; + } +} + static void urtw_txeof(struct usb_xfer *xfer, struct urtw_data *data) { @@ -4210,12 +4275,156 @@ static int urtw_isbmode(uint16_t rate) { - rate = urtw_rtl2rate(rate); - return ((rate <= 22 && rate != 12 && rate != 18) || rate == 44) ? (1) : (0); } +static uint16_t +urtw_rate2dbps(uint16_t rate) +{ + + switch(rate) { + case 12: + case 18: + case 24: + case 36: + case 48: + case 72: + case 96: + case 108: + return (rate * 2); + default: + break; + } + return (24); +} + +static int +urtw_compute_txtime(uint16_t framelen, uint16_t rate, + uint8_t ismgt, uint8_t isshort) +{ + uint16_t ceiling, frametime, n_dbps; + + if (urtw_isbmode(rate)) { + if (ismgt || !isshort || rate == 2) + frametime = (uint16_t)(144 + 48 + + (framelen * 8 / (rate / 2))); + else + frametime = (uint16_t)(72 + 24 + + (framelen * 8 / (rate / 2))); + if ((framelen * 8 % (rate / 2)) != 0) + frametime++; + } else { + n_dbps = urtw_rate2dbps(rate); + ceiling = (16 + 8 * framelen + 6) / n_dbps + + (((16 + 8 * framelen + 6) % n_dbps) ? 1 : 0); + frametime = (uint16_t)(16 + 4 + 4 * ceiling + 6); + } + return (frametime); +} + +/* + * Callback from the 802.11 layer to update the + * slot time based on the current setting. + */ +static void +urtw_updateslot(struct ifnet *ifp) +{ + struct urtw_softc *sc = ifp->if_softc; + struct ieee80211com *ic = ifp->if_l2com; + + ieee80211_runtask(ic, &sc->sc_updateslot_task); +} + +static void +urtw_updateslottask(void *arg, int pending) +{ + struct urtw_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + int error; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; + + URTW_LOCK(sc); + if (sc->sc_flags & URTW_RTL8187B) { + urtw_write8_m(sc, URTW_SIFS, 0x22); + if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) + urtw_write8_m(sc, URTW_SLOT, 0x9); + else + urtw_write8_m(sc, URTW_SLOT, 0x14); + urtw_write8_m(sc, URTW_8187B_EIFS, 0x5b); + urtw_write8_m(sc, URTW_CARRIER_SCOUNT, 0x5b); + } else { + urtw_write8_m(sc, URTW_SIFS, 0x22); + if (sc->sc_state == IEEE80211_S_ASSOC && + ic->ic_flags & IEEE80211_F_SHSLOT) + urtw_write8_m(sc, URTW_SLOT, 0x9); + else + urtw_write8_m(sc, URTW_SLOT, 0x14); + if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) { + urtw_write8_m(sc, URTW_DIFS, 0x14); + urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14); + urtw_write8_m(sc, URTW_CW_VAL, 0x73); + } else { + urtw_write8_m(sc, URTW_DIFS, 0x24); + urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24); + urtw_write8_m(sc, URTW_CW_VAL, 0xa5); + } + } +fail: + URTW_UNLOCK(sc); +} + +static void +urtw_sysctl_node(struct urtw_softc *sc) +{ +#define URTW_SYSCTL_STAT_ADD32(c, h, n, p, d) \ + SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d) + struct sysctl_ctx_list *ctx; + struct sysctl_oid_list *child, *parent; + struct sysctl_oid *tree; + struct urtw_stats *stats = &sc->sc_stats; + + ctx = device_get_sysctl_ctx(sc->sc_dev); + child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); + + tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD, + NULL, "URTW statistics"); + parent = SYSCTL_CHILDREN(tree); + + /* Tx statistics. */ + tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD, + NULL, "Tx MAC statistics"); + child = SYSCTL_CHILDREN(tree); + URTW_SYSCTL_STAT_ADD32(ctx, child, "1m", &stats->txrates[0], + "1 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "2m", &stats->txrates[1], + "2 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "5.5m", &stats->txrates[2], + "5.5 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "6m", &stats->txrates[4], + "6 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "9m", &stats->txrates[5], + "9 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "11m", &stats->txrates[3], + "11 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "12m", &stats->txrates[6], + "12 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "18m", &stats->txrates[7], + "18 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "24m", &stats->txrates[8], + "24 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "36m", &stats->txrates[9], + "36 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "48m", &stats->txrates[10], + "48 Mbit/s"); + URTW_SYSCTL_STAT_ADD32(ctx, child, "54m", &stats->txrates[11], + "54 Mbit/s"); +#undef URTW_SYSCTL_STAT_ADD32 +} + static device_method_t urtw_methods[] = { DEVMETHOD(device_probe, urtw_match), DEVMETHOD(device_attach, urtw_attach), diff --git a/sys/dev/usb/wlan/if_urtwreg.h b/sys/dev/usb/wlan/if_urtwreg.h index d3399b7eaf18..a0fe5ffd7150 100644 --- a/sys/dev/usb/wlan/if_urtwreg.h +++ b/sys/dev/usb/wlan/if_urtwreg.h @@ -26,18 +26,29 @@ #define URTW_MAC3 0x0003 /* 1 byte */ #define URTW_MAC4 0x0004 /* 1 byte */ #define URTW_MAC5 0x0005 /* 1 byte */ +#define URTW_MAR 0x0008 /* 6 byte */ +#define URTW_RXFIFO_CNT 0x0010 /* 1 byte */ +#define URTW_TXFIFO_CNT 0x0012 /* 1 byte */ +#define URTW_BQREQ 0x0013 /* 1 byte */ +#define URTW_TSFT 0x0018 /* 6 byte */ +#define URTW_TLPDA 0x0020 /* 4 byte */ +#define URTW_TNPDA 0x0024 /* 4 byte */ +#define URTW_THPDA 0x0028 /* 4 byte */ #define URTW_BRSR 0x002c /* 2 byte */ #define URTW_BRSR_MBR_8185 (0x0fff) +#define URTW_8187B_EIFS 0x002d /* 1 byte for 8187B */ #define URTW_BSSID 0x002e /* 6 byte */ -#define URTW_RESP_RATE 0x0034 /* 1 byte */ +#define URTW_BRSR_8187B 0x0034 /* 2 byte for 8187B */ +#define URTW_RESP_RATE 0x0034 /* 1 byte for 8187L */ #define URTW_RESP_MAX_RATE_SHIFT (4) #define URTW_RESP_MIN_RATE_SHIFT (0) #define URTW_EIFS 0x0035 /* 1 byte */ -#define URTW_INTR_MASK 0x003c /* 2 byte */ #define URTW_CMD 0x0037 /* 1 byte */ #define URTW_CMD_TX_ENABLE (0x4) #define URTW_CMD_RX_ENABLE (0x8) #define URTW_CMD_RST (0x10) +#define URTW_INTR_MASK 0x003c /* 2 byte */ +#define URTW_INTR_STATUS 0x003e /* 2 byte */ #define URTW_TX_CONF 0x0040 /* 4 byte */ #define URTW_TX_LOOPBACK_SHIFT (17) #define URTW_TX_LOOPBACK_NONE (0 << URTW_TX_LOOPBACK_SHIFT) @@ -56,6 +67,9 @@ #define URTW_TX_MXDMA_SHIFT (21) #define URTW_TX_DISCW (1 << 20) #define URTW_TX_SWPLCPLEN (1 << 24) +#define URTW_TX_R8187vD (5 << 25) +#define URTW_TX_R8187vD_B (6 << 25) +#define URTW_TX_HWMASK (7 << 25) #define URTW_TX_DISREQQSIZE (1 << 28) #define URTW_TX_HW_SEQNUM (1 << 30) #define URTW_TX_CWMIN (1 << 31) @@ -94,6 +108,7 @@ #define URTW_MAX_RX_DMA_SHIFT (10) #define URTW_RCR_ONLYERLPKT (1 << 31) #define URTW_INT_TIMEOUT 0x0048 /* 4 byte */ +#define URTW_INT_TBDA 0x004c /* 4 byte */ #define URTW_EPROM_CMD 0x0050 /* 1 byte */ #define URTW_EPROM_CMD_NORMAL (0x0) #define URTW_EPROM_CMD_NORMAL_MODE \ @@ -109,6 +124,7 @@ #define URTW_EPROM_WRITEBIT (0x2) #define URTW_EPROM_CK (0x4) #define URTW_EPROM_CS (0x8) +#define URTW_CONFIG0 0x0051 /* 1 byte */ #define URTW_CONFIG1 0x0052 /* 1 byte */ #define URTW_CONFIG2 0x0053 /* 1 byte */ #define URTW_ANAPARAM 0x0054 /* 4 byte */ @@ -132,6 +148,7 @@ #define URTW_CONFIG4_VCOOFF (1 << 7) #define URTW_TESTR 0x005b /* 1 byte */ #define URTW_PSR 0x005e /* 1 byte */ +#define URTW_SECURITY 0x005f /* 1 byte */ #define URTW_ANAPARAM2 0x0060 /* 4 byte */ #define URTW_8225_ANAPARAM2_ON (0x860c7312) #define URTW_8225_ANAPARAM2_OFF (0x840dec11) @@ -141,6 +158,7 @@ #define URTW_ATIM_WND 0x0072 /* 2 byte */ #define URTW_BEACON_INTERVAL_TIME 0x0074 /* 2 byte */ #define URTW_ATIM_TR_ITV 0x0076 /* 2 byte */ +#define URTW_PHY_DELAY 0x0078 /* 1 byte */ #define URTW_CARRIER_SCOUNT 0x0079 /* 1 byte */ #define URTW_PHY_MAGIC1 0x007c /* 1 byte */ #define URTW_PHY_MAGIC2 0x007d /* 1 byte */ @@ -185,13 +203,23 @@ #define URTW_RATE_FALLBACK 0x00be /* 1 byte */ #define URTW_RATE_FALLBACK_ENABLE (0x80) #define URTW_ACM_CONTROL 0x00bf /* 1 byte */ +#define URTW_CONFIG5 0x00d8 /* 1 byte */ +#define URTW_TXDMA_POLLING 0x00d9 /* 1 byte */ +#define URTW_CWR 0x00dc /* 2 byte */ +#define URTW_RETRY_CTR 0x00de /* 1 byte */ #define URTW_INT_MIG 0x00e2 /* 2 byte */ +#define URTW_RDSAR 0x00e4 /* 4 byte */ #define URTW_TID_AC_MAP 0x00e8 /* 2 byte */ #define URTW_ANAPARAM3 0x00ee /* 1 byte */ #define URTW_8187B_8225_ANAPARAM3_ON (0x0) #define URTW_8187B_8225_ANAPARAM3_OFF (0x0) - +#define URTW_8187B_AC_VO 0x00f0 /* 4 byte for 8187B */ +#define URTW_FEMR 0x00f4 /* 2 byte */ +#define URTW_8187B_AC_VI 0x00f4 /* 4 byte for 8187B */ +#define URTW_8187B_AC_BE 0x00f8 /* 4 byte for 8187B */ +#define URTW_TALLY_CNT 0x00fa /* 2 byte */ #define URTW_TALLY_SEL 0x00fc /* 1 byte */ +#define URTW_8187B_AC_BK 0x00fc /* 4 byte for 8187B */ #define URTW_ADDR_MAGIC2 0x00fe /* 2 byte */ #define URTW_ADDR_MAGIC3 0x00ff /* 1 byte */ @@ -224,6 +252,7 @@ #define URTW_8225_ADDR_C_DATA_MAGIC2 (0x050) /* for EEPROM */ +#define URTW_EPROM_CHANPLAN 0x03 #define URTW_EPROM_TXPW_BASE 0x05 #define URTW_EPROM_RFCHIPID 0x06 #define URTW_EPROM_RFCHIPID_RTL8225U (5) @@ -278,26 +307,126 @@ #define URTW_DEFAULT_TX_RETRY 7 #define URTW_DEFAULT_RTS_THRESHOLD 2342U +#define URTW_ASIFS_TIME 10 +#define URTW_ACKCTS_LEN 14 /* len for ACK and CTS */ + struct urtw_8187b_rxhdr { - uint32_t flags; + uint32_t flag; +#define URTW_RX_FLAG_LEN /* 0 ~ 11 bits */ +#define URTW_RX_FLAG_ICV_ERR (1 << 12) +#define URTW_RX_FLAG_CRC32_ERR (1 << 13) +#define URTW_RX_FLAG_PM (1 << 14) +#define URTW_RX_FLAG_RX_ERR (1 << 15) +#define URTW_RX_FLAG_BCAST (1 << 16) +#define URTW_RX_FLAG_PAM (1 << 17) +#define URTW_RX_FLAG_MCAST (1 << 18) +#define URTW_RX_FLAG_QOS (1 << 19) /* only for RTL8187B */ +#define URTW_RX_FLAG_RXRATE /* 20 ~ 23 bits */ +#define URTW_RX_FLAG_RXRATE_SHIFT 20 +#define URTW_RX_FLAG_TRSW (1 << 24) /* only for RTL8187B */ +#define URTW_RX_FLAG_SPLCP (1 << 25) +#define URTW_RX_FLAG_FOF (1 << 26) +#define URTW_RX_FLAG_DMA_FAIL (1 << 27) +#define URTW_RX_FLAG_LAST (1 << 28) +#define URTW_RX_FLAG_FIRST (1 << 29) +#define URTW_RX_FLAG_EOR (1 << 30) +#define URTW_RX_FLAG_OWN (1 << 31) uint64_t mactime; - uint8_t sq; + uint8_t noise; uint8_t rssi; +#define URTW_RX_RSSI /* 0 ~ 6 bits */ +#define URTW_RX_RSSI_MASK 0x3f +#define URTW_RX_ANTENNA (1 << 7) uint8_t agc; - uint8_t flags2; - uint16_t unknown; + uint8_t flag2; +#define URTW_RX_FLAG2_DECRYPTED (1 << 0) +#define URTW_RX_FLAG2_WAKUP (1 << 1) +#define URTW_RX_FLAG2_SHIFT (1 << 2) +#define URTW_RX_FLAG2_RSVD0 /* 3 ~ 7 bits */ + uint16_t flag3; +#define URTW_RX_FLAG3_NUMMCSI /* 0 ~ 3 bits */ +#define URTW_RX_FLAG3_SNR_L2E /* 4 ~ 9 bits */ +#define URTW_RX_FLAG3_CFO_BIAS /* 10 ~ 15 bits */ int8_t pwdb; uint8_t fot; } __packed; struct urtw_8187b_txhdr { - uint32_t flags; - uint16_t rts_duration; + uint32_t flag; +#define URTW_TX_FLAG_PKTLEN /* 0 ~ 11 bits */ +#define URTW_TX_FLAG_RSVD0 /* 12 ~ 14 bits */ +#define URTW_TX_FLAG_NO_ENC (1 << 15) +#define URTW_TX_FLAG_SPLCP (1 << 16) +#define URTW_TX_FLAG_MOREFRAG (1 << 17) +#define URTW_TX_FLAG_CTS (1 << 18) +#define URTW_TX_FLAG_RTSRATE /* 19 ~ 22 bits */ +#define URTW_TX_FLAG_RTSRATE_SHIFT 19 +#define URTW_TX_FLAG_RTS (1 << 23) +#define URTW_TX_FLAG_TXRATE /* 24 ~ 27 bits */ +#define URTW_TX_FLAG_TXRATE_SHIFT 24 +#define URTW_TX_FLAG_LAST (1 << 28) +#define URTW_TX_FLAG_FIRST (1 << 29) +#define URTW_TX_FLAG_DMA (1 << 30) +#define URTW_TX_FLAG_OWN (1 << 31) + uint16_t rtsdur; uint16_t len; - uint32_t unknown1; - uint16_t unknown2; - uint16_t tx_duration; - uint32_t unknown3; - uint32_t retry; - uint32_t unknown4[2]; +#define URTW_TX_LEN /* 0 ~ 14 bits */ +#define URTW_TX_LEN_EXT (1 << 15) + uint32_t bufaddr; + uint16_t flag1; +#define URTW_TX_FLAG1_RXLEN /* 0 ~ 11 bits */ +#define URTW_TX_FLAG1_RSVD0 /* 12 ~ 14 bits */ +#define URTW_TX_FLAG1_MICCAL (1 << 15) + uint16_t txdur; + uint32_t nextdescaddr; + uint8_t rtsagc; + uint8_t retry; + uint16_t flag2; +#define URTW_TX_FLAG2_RTDB (1 << 0) +#define URTW_TX_FLAG2_NOACM (1 << 1) +#define URTW_TX_FLAG2_PIFS (1 << 2) +#define URTW_TX_FLAG2_RSVD0 /* 3 ~ 6 bits */ +#define URTW_TX_FLAG2_RTSRATEFALLBACK /* 7 ~ 10 bits */ +#define URTW_TX_FLAG2_RATEFALLBACK /* 11 ~ 15 bits */ + uint16_t delaybound; + uint16_t flag3; +#define URTW_TX_FLAG3_RSVD0 /* 0 ~ 3 bits */ +#define URTW_TX_FLAG3_AGC /* 4 ~ 11 bits */ +#define URTW_TX_FLAG3_ANTENNA (1 << 12) +#define URTW_TX_FLAG3_SPC /* 13 ~ 14 bits */ +#define URTW_TX_FLAG3_RSVD1 (1 << 15) + uint32_t flag4; +#define URTW_TX_FLAG4_LENADJUST /* 0 ~ 1 bits */ +#define URTW_TX_FLAG4_RSVD0 (1 << 2) +#define URTW_TX_FLAG4_TPCDESEN (1 << 3) +#define URTW_TX_FLAG4_TPCPOLARITY /* 4 ~ 5 bits */ +#define URTW_TX_FLAG4_TPCEN (1 << 6) +#define URTW_TX_FLAG4_PTEN (1 << 7) +#define URTW_TX_FLAG4_BCKEY /* 8 ~ 13 bits */ +#define URTW_TX_FLAG4_ENBCKEY (1 << 14) +#define URTW_TX_FLAG4_ENPMPD (1 << 15) +#define URTW_TX_FLAG4_FRAGQSZ /* 16 ~ 31 bits */ +} __packed; + +struct urtw_8187l_rxhdr { + uint32_t flag; + uint8_t noise; + uint8_t rssi; +#define URTW_RX_8187L_RSSI /* 0 ~ 6 bits */ +#define URTW_RX_8187L_RSSI_MASK 0x3f +#define URTW_RX_8187L_ANTENNA (1 << 7) + uint8_t agc; + uint8_t flag2; +#define URTW_RX_8187L_DECRYPTED (1 << 0) +#define URTW_RX_8187L_WAKEUP (1 << 1) +#define URTW_RX_8187L_SHIFT (1 << 2) +#define URTW_RX_8187L_RSVD0 /* 3 ~ 7 bits */ + uint64_t mactime; +} __packed; + +struct urtw_8187l_txhdr { + uint32_t flag; + uint16_t rtsdur; + uint16_t len; + uint32_t retry; } __packed; diff --git a/sys/dev/usb/wlan/if_urtwvar.h b/sys/dev/usb/wlan/if_urtwvar.h index 975060c70df3..e4a872147fe0 100644 --- a/sys/dev/usb/wlan/if_urtwvar.h +++ b/sys/dev/usb/wlan/if_urtwvar.h @@ -18,12 +18,13 @@ enum { URTW_8187B_BULK_RX, + URTW_8187B_BULK_TX_STATUS, URTW_8187B_BULK_TX_BE, URTW_8187B_BULK_TX_BK, URTW_8187B_BULK_TX_VI, URTW_8187B_BULK_TX_VO, URTW_8187B_BULK_TX_EP12, - URTW_8187B_N_XFERS = 6 + URTW_8187B_N_XFERS = 7 }; enum { @@ -54,6 +55,7 @@ typedef STAILQ_HEAD(, urtw_data) urtw_datahead; #define URTW_TX_DATA_LIST_COUNT 16 #define URTW_RX_MAXSIZE 0x9c4 #define URTW_TX_MAXSIZE 0x9c4 +#define URTW_TX_MAXRETRY 11 struct urtw_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; @@ -79,6 +81,10 @@ struct urtw_tx_radiotap_header { ((1 << IEEE80211_RADIOTAP_FLAGS) | \ (1 << IEEE80211_RADIOTAP_CHANNEL)) +struct urtw_stats { + unsigned int txrates[12]; +}; + struct urtw_vap { struct ieee80211vap vap; int (*newstate)(struct ieee80211vap *, @@ -163,6 +169,12 @@ struct urtw_softc { uint8_t sc_txpwr_ofdm[URTW_MAX_CHANNELS]; uint8_t sc_txpwr_ofdm_base; + uint8_t sc_acmctl; + uint64_t sc_txstatus; /* only for 8187B */ + struct task sc_updateslot_task; + + struct urtw_stats sc_stats; + struct urtw_rx_radiotap_header sc_rxtap; int sc_rxtap_len; struct urtw_tx_radiotap_header sc_txtap; diff --git a/sys/dev/usb/wlan/if_zyd.c b/sys/dev/usb/wlan/if_zyd.c index 493c5fad16ad..724bfaaf957d 100644 --- a/sys/dev/usb/wlan/if_zyd.c +++ b/sys/dev/usb/wlan/if_zyd.c @@ -2322,6 +2322,9 @@ tr_setup: } else (void)ieee80211_input_all(ic, m, rssi, nf); } + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 && + !IFQ_IS_EMPTY(&ifp->if_snd)) + zyd_start(ifp); ZYD_LOCK(sc); break; @@ -2431,6 +2434,9 @@ tr_setup: usbd_xfer_set_priv(xfer, data); usbd_transfer_submit(xfer); } + ZYD_UNLOCK(sc); + zyd_start(ifp); + ZYD_LOCK(sc); break; default: /* Error */ @@ -2443,13 +2449,18 @@ tr_setup: if (data != NULL) zyd_tx_free(data, error); - if (error == USB_ERR_STALLED) { - /* try to clear stall first */ + if (error != USB_ERR_CANCELLED) { + if (error == USB_ERR_TIMEOUT) + device_printf(sc->sc_dev, "device timeout\n"); + + /* + * Try to clear stall first, also if other + * errors occur, hence clearing stall + * introduces a 50 ms delay: + */ usbd_xfer_set_stall(xfer); goto tr_setup; } - if (error == USB_ERR_TIMEOUT) - device_printf(sc->sc_dev, "device timeout\n"); break; } } diff --git a/sys/dev/vge/if_vge.c b/sys/dev/vge/if_vge.c index f08f8a267f3a..127a123cc63d 100644 --- a/sys/dev/vge/if_vge.c +++ b/sys/dev/vge/if_vge.c @@ -93,7 +93,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include @@ -128,68 +128,79 @@ MODULE_DEPEND(vge, miibus, 1, 1, 1); #define VGE_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) +/* Tunables */ +static int msi_disable = 0; +TUNABLE_INT("hw.vge.msi_disable", &msi_disable); + +/* + * The SQE error counter of MIB seems to report bogus value. + * Vendor's workaround does not seem to work on PCIe based + * controllers. Disable it until we find better workaround. + */ +#undef VGE_ENABLE_SQEERR + /* * Various supported device vendors/types and their names. */ static struct vge_type vge_devs[] = { { VIA_VENDORID, VIA_DEVICEID_61XX, - "VIA Networking Gigabit Ethernet" }, + "VIA Networking Velocity Gigabit Ethernet" }, { 0, 0, NULL } }; -static int vge_probe (device_t); -static int vge_attach (device_t); -static int vge_detach (device_t); - -static int vge_encap (struct vge_softc *, struct mbuf *, int); - -static void vge_dma_map_addr (void *, bus_dma_segment_t *, int, int); -static void vge_dma_map_rx_desc (void *, bus_dma_segment_t *, int, - bus_size_t, int); -static void vge_dma_map_tx_desc (void *, bus_dma_segment_t *, int, - bus_size_t, int); -static int vge_allocmem (device_t, struct vge_softc *); -static int vge_newbuf (struct vge_softc *, int, struct mbuf *); -static int vge_rx_list_init (struct vge_softc *); -static int vge_tx_list_init (struct vge_softc *); -#ifdef VGE_FIXUP_RX -static __inline void vge_fixup_rx - (struct mbuf *); -#endif -static int vge_rxeof (struct vge_softc *); -static void vge_txeof (struct vge_softc *); -static void vge_intr (void *); -static void vge_tick (void *); -static void vge_tx_task (void *, int); -static void vge_start (struct ifnet *); -static int vge_ioctl (struct ifnet *, u_long, caddr_t); -static void vge_init (void *); -static void vge_stop (struct vge_softc *); -static void vge_watchdog (struct ifnet *); -static int vge_suspend (device_t); -static int vge_resume (device_t); -static int vge_shutdown (device_t); -static int vge_ifmedia_upd (struct ifnet *); -static void vge_ifmedia_sts (struct ifnet *, struct ifmediareq *); +static int vge_attach(device_t); +static int vge_detach(device_t); +static int vge_probe(device_t); +static int vge_resume(device_t); +static int vge_shutdown(device_t); +static int vge_suspend(device_t); +static void vge_cam_clear(struct vge_softc *); +static int vge_cam_set(struct vge_softc *, uint8_t *); +static void vge_clrwol(struct vge_softc *); +static void vge_discard_rxbuf(struct vge_softc *, int); +static int vge_dma_alloc(struct vge_softc *); +static void vge_dma_free(struct vge_softc *); +static void vge_dmamap_cb(void *, bus_dma_segment_t *, int, int); #ifdef VGE_EEPROM -static void vge_eeprom_getword (struct vge_softc *, int, u_int16_t *); +static void vge_eeprom_getword(struct vge_softc *, int, uint16_t *); #endif -static void vge_read_eeprom (struct vge_softc *, caddr_t, int, int, int); - -static void vge_miipoll_start (struct vge_softc *); -static void vge_miipoll_stop (struct vge_softc *); -static int vge_miibus_readreg (device_t, int, int); -static int vge_miibus_writereg (device_t, int, int, int); -static void vge_miibus_statchg (device_t); - -static void vge_cam_clear (struct vge_softc *); -static int vge_cam_set (struct vge_softc *, uint8_t *); -static void vge_setmulti (struct vge_softc *); -static void vge_reset (struct vge_softc *); - -#define VGE_PCI_LOIO 0x10 -#define VGE_PCI_LOMEM 0x14 +static int vge_encap(struct vge_softc *, struct mbuf **); +#ifndef __NO_STRICT_ALIGNMENT +static __inline void + vge_fixup_rx(struct mbuf *); +#endif +static void vge_freebufs(struct vge_softc *); +static void vge_ifmedia_sts(struct ifnet *, struct ifmediareq *); +static int vge_ifmedia_upd(struct ifnet *); +static void vge_init(void *); +static void vge_init_locked(struct vge_softc *); +static void vge_intr(void *); +static void vge_intr_holdoff(struct vge_softc *); +static int vge_ioctl(struct ifnet *, u_long, caddr_t); +static void vge_link_statchg(void *); +static int vge_miibus_readreg(device_t, int, int); +static void vge_miibus_statchg(device_t); +static int vge_miibus_writereg(device_t, int, int, int); +static void vge_miipoll_start(struct vge_softc *); +static void vge_miipoll_stop(struct vge_softc *); +static int vge_newbuf(struct vge_softc *, int); +static void vge_read_eeprom(struct vge_softc *, caddr_t, int, int, int); +static void vge_reset(struct vge_softc *); +static int vge_rx_list_init(struct vge_softc *); +static int vge_rxeof(struct vge_softc *, int); +static void vge_rxfilter(struct vge_softc *); +static void vge_setvlan(struct vge_softc *); +static void vge_setwol(struct vge_softc *); +static void vge_start(struct ifnet *); +static void vge_start_locked(struct ifnet *); +static void vge_stats_clear(struct vge_softc *); +static void vge_stats_update(struct vge_softc *); +static void vge_stop(struct vge_softc *); +static void vge_sysctl_node(struct vge_softc *); +static int vge_tx_list_init(struct vge_softc *); +static void vge_txeof(struct vge_softc *); +static void vge_watchdog(void *); static device_method_t vge_methods[] = { /* Device interface */ @@ -228,13 +239,10 @@ DRIVER_MODULE(miibus, vge, miibus_driver, miibus_devclass, 0, 0); * Read a word of data stored in the EEPROM at address 'addr.' */ static void -vge_eeprom_getword(sc, addr, dest) - struct vge_softc *sc; - int addr; - u_int16_t *dest; +vge_eeprom_getword(struct vge_softc *sc, int addr, uint16_t *dest) { - register int i; - u_int16_t word = 0; + int i; + uint16_t word = 0; /* * Enter EEPROM embedded programming mode. In order to @@ -270,8 +278,6 @@ vge_eeprom_getword(sc, addr, dest) CSR_CLRBIT_1(sc, VGE_CHIPCFG2, VGE_CHIPCFG2_EELOAD); *dest = word; - - return; } #endif @@ -279,20 +285,15 @@ vge_eeprom_getword(sc, addr, dest) * Read a sequence of words from the EEPROM. */ static void -vge_read_eeprom(sc, dest, off, cnt, swap) - struct vge_softc *sc; - caddr_t dest; - int off; - int cnt; - int swap; +vge_read_eeprom(struct vge_softc *sc, caddr_t dest, int off, int cnt, int swap) { - int i; + int i; #ifdef VGE_EEPROM - u_int16_t word = 0, *ptr; + uint16_t word = 0, *ptr; for (i = 0; i < cnt; i++) { vge_eeprom_getword(sc, off + i, &word); - ptr = (u_int16_t *)(dest + (i * 2)); + ptr = (uint16_t *)(dest + (i * 2)); if (swap) *ptr = ntohs(word); else @@ -305,10 +306,9 @@ vge_read_eeprom(sc, dest, off, cnt, swap) } static void -vge_miipoll_stop(sc) - struct vge_softc *sc; +vge_miipoll_stop(struct vge_softc *sc) { - int i; + int i; CSR_WRITE_1(sc, VGE_MIICMD, 0); @@ -320,15 +320,12 @@ vge_miipoll_stop(sc) if (i == VGE_TIMEOUT) device_printf(sc->vge_dev, "failed to idle MII autopoll\n"); - - return; } static void -vge_miipoll_start(sc) - struct vge_softc *sc; +vge_miipoll_start(struct vge_softc *sc) { - int i; + int i; /* First, make sure we're idle. */ @@ -360,25 +357,20 @@ vge_miipoll_start(sc) if (i == VGE_TIMEOUT) device_printf(sc->vge_dev, "failed to start MII autopoll\n"); - - return; } static int -vge_miibus_readreg(dev, phy, reg) - device_t dev; - int phy, reg; +vge_miibus_readreg(device_t dev, int phy, int reg) { - struct vge_softc *sc; - int i; - u_int16_t rval = 0; + struct vge_softc *sc; + int i; + uint16_t rval = 0; sc = device_get_softc(dev); - if (phy != (CSR_READ_1(sc, VGE_MIICFG) & 0x1F)) - return(0); + if (phy != sc->vge_phyaddr) + return (0); - VGE_LOCK(sc); vge_miipoll_stop(sc); /* Specify the register we want to read. */ @@ -400,25 +392,21 @@ vge_miibus_readreg(dev, phy, reg) rval = CSR_READ_2(sc, VGE_MIIDATA); vge_miipoll_start(sc); - VGE_UNLOCK(sc); return (rval); } static int -vge_miibus_writereg(dev, phy, reg, data) - device_t dev; - int phy, reg, data; +vge_miibus_writereg(device_t dev, int phy, int reg, int data) { - struct vge_softc *sc; - int i, rval = 0; + struct vge_softc *sc; + int i, rval = 0; sc = device_get_softc(dev); - if (phy != (CSR_READ_1(sc, VGE_MIICFG) & 0x1F)) - return(0); + if (phy != sc->vge_phyaddr) + return (0); - VGE_LOCK(sc); vge_miipoll_stop(sc); /* Specify the register we want to write. */ @@ -443,16 +431,14 @@ vge_miibus_writereg(dev, phy, reg, data) } vge_miipoll_start(sc); - VGE_UNLOCK(sc); return (rval); } static void -vge_cam_clear(sc) - struct vge_softc *sc; +vge_cam_clear(struct vge_softc *sc) { - int i; + int i; /* * Turn off all the mask bits. This tells the chip @@ -477,19 +463,15 @@ vge_cam_clear(sc) CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_MAR); sc->vge_camidx = 0; - - return; } static int -vge_cam_set(sc, addr) - struct vge_softc *sc; - uint8_t *addr; +vge_cam_set(struct vge_softc *sc, uint8_t *addr) { - int i, error = 0; + int i, error = 0; if (sc->vge_camidx == VGE_CAM_MAXADDRS) - return(ENOSPC); + return (ENOSPC); /* Select the CAM data page. */ CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL); @@ -537,37 +519,66 @@ fail: return (error); } +static void +vge_setvlan(struct vge_softc *sc) +{ + struct ifnet *ifp; + uint8_t cfg; + + VGE_LOCK_ASSERT(sc); + + ifp = sc->vge_ifp; + cfg = CSR_READ_1(sc, VGE_RXCFG); + if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) + cfg |= VGE_VTAG_OPT2; + else + cfg &= ~VGE_VTAG_OPT2; + CSR_WRITE_1(sc, VGE_RXCFG, cfg); +} + /* * Program the multicast filter. We use the 64-entry CAM filter * for perfect filtering. If there's more than 64 multicast addresses, - * we use the hash filter insted. + * we use the hash filter instead. */ static void -vge_setmulti(sc) - struct vge_softc *sc; +vge_rxfilter(struct vge_softc *sc) { - struct ifnet *ifp; - int error = 0/*, h = 0*/; - struct ifmultiaddr *ifma; - u_int32_t h, hashes[2] = { 0, 0 }; + struct ifnet *ifp; + struct ifmultiaddr *ifma; + uint32_t h, hashes[2]; + uint8_t rxcfg; + int error = 0; - ifp = sc->vge_ifp; + VGE_LOCK_ASSERT(sc); /* First, zot all the multicast entries. */ - vge_cam_clear(sc); - CSR_WRITE_4(sc, VGE_MAR0, 0); - CSR_WRITE_4(sc, VGE_MAR1, 0); + hashes[0] = 0; + hashes[1] = 0; + rxcfg = CSR_READ_1(sc, VGE_RXCTL); + rxcfg &= ~(VGE_RXCTL_RX_MCAST | VGE_RXCTL_RX_BCAST | + VGE_RXCTL_RX_PROMISC); /* - * If the user wants allmulti or promisc mode, enable reception - * of all multicast frames. + * Always allow VLAN oversized frames and frames for + * this host. */ - if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { - CSR_WRITE_4(sc, VGE_MAR0, 0xFFFFFFFF); - CSR_WRITE_4(sc, VGE_MAR1, 0xFFFFFFFF); - return; + rxcfg |= VGE_RXCTL_RX_GIANT | VGE_RXCTL_RX_UCAST; + + ifp = sc->vge_ifp; + if ((ifp->if_flags & IFF_BROADCAST) != 0) + rxcfg |= VGE_RXCTL_RX_BCAST; + if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) { + if ((ifp->if_flags & IFF_PROMISC) != 0) + rxcfg |= VGE_RXCTL_RX_PROMISC; + if ((ifp->if_flags & IFF_ALLMULTI) != 0) { + hashes[0] = 0xFFFFFFFF; + hashes[1] = 0xFFFFFFFF; + } + goto done; } + vge_cam_clear(sc); /* Now program new ones */ if_maddr_rlock(ifp); TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { @@ -593,20 +604,21 @@ vge_setmulti(sc) else hashes[1] |= (1 << (h - 32)); } - - CSR_WRITE_4(sc, VGE_MAR0, hashes[0]); - CSR_WRITE_4(sc, VGE_MAR1, hashes[1]); } if_maddr_runlock(ifp); - return; +done: + if (hashes[0] != 0 || hashes[1] != 0) + rxcfg |= VGE_RXCTL_RX_MCAST; + CSR_WRITE_4(sc, VGE_MAR0, hashes[0]); + CSR_WRITE_4(sc, VGE_MAR1, hashes[1]); + CSR_WRITE_1(sc, VGE_RXCTL, rxcfg); } static void -vge_reset(sc) - struct vge_softc *sc; +vge_reset(struct vge_softc *sc) { - register int i; + int i; CSR_WRITE_1(sc, VGE_CRS1, VGE_CR1_SOFTRESET); @@ -617,29 +629,12 @@ vge_reset(sc) } if (i == VGE_TIMEOUT) { - device_printf(sc->vge_dev, "soft reset timed out"); + device_printf(sc->vge_dev, "soft reset timed out\n"); CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_STOP_FORCE); DELAY(2000); } DELAY(5000); - - CSR_SETBIT_1(sc, VGE_EECSR, VGE_EECSR_RELOAD); - - for (i = 0; i < VGE_TIMEOUT; i++) { - DELAY(5); - if ((CSR_READ_1(sc, VGE_EECSR) & VGE_EECSR_RELOAD) == 0) - break; - } - - if (i == VGE_TIMEOUT) { - device_printf(sc->vge_dev, "EEPROM reload timed out\n"); - return; - } - - CSR_CLRBIT_1(sc, VGE_CHIPCFG0, VGE_CHIPCFG0_PACPI); - - return; } /* @@ -647,10 +642,9 @@ vge_reset(sc) * IDs against our list and return a device name if we find a match. */ static int -vge_probe(dev) - device_t dev; +vge_probe(device_t dev) { - struct vge_type *t; + struct vge_type *t; t = vge_devs; @@ -666,249 +660,320 @@ vge_probe(dev) return (ENXIO); } -static void -vge_dma_map_rx_desc(arg, segs, nseg, mapsize, error) - void *arg; - bus_dma_segment_t *segs; - int nseg; - bus_size_t mapsize; - int error; -{ - - struct vge_dmaload_arg *ctx; - struct vge_rx_desc *d = NULL; - - if (error) - return; - - ctx = arg; - - /* Signal error to caller if there's too many segments */ - if (nseg > ctx->vge_maxsegs) { - ctx->vge_maxsegs = 0; - return; - } - - /* - * Map the segment array into descriptors. - */ - - d = &ctx->sc->vge_ldata.vge_rx_list[ctx->vge_idx]; - - /* If this descriptor is still owned by the chip, bail. */ - - if (le32toh(d->vge_sts) & VGE_RDSTS_OWN) { - device_printf(ctx->sc->vge_dev, - "tried to map busy descriptor\n"); - ctx->vge_maxsegs = 0; - return; - } - - d->vge_buflen = htole16(VGE_BUFLEN(segs[0].ds_len) | VGE_RXDESC_I); - d->vge_addrlo = htole32(VGE_ADDR_LO(segs[0].ds_addr)); - d->vge_addrhi = htole16(VGE_ADDR_HI(segs[0].ds_addr) & 0xFFFF); - d->vge_sts = 0; - d->vge_ctl = 0; - - ctx->vge_maxsegs = 1; - - return; -} - -static void -vge_dma_map_tx_desc(arg, segs, nseg, mapsize, error) - void *arg; - bus_dma_segment_t *segs; - int nseg; - bus_size_t mapsize; - int error; -{ - struct vge_dmaload_arg *ctx; - struct vge_tx_desc *d = NULL; - struct vge_tx_frag *f; - int i = 0; - - if (error) - return; - - ctx = arg; - - /* Signal error to caller if there's too many segments */ - if (nseg > ctx->vge_maxsegs) { - ctx->vge_maxsegs = 0; - return; - } - - /* Map the segment array into descriptors. */ - - d = &ctx->sc->vge_ldata.vge_tx_list[ctx->vge_idx]; - - /* If this descriptor is still owned by the chip, bail. */ - - if (le32toh(d->vge_sts) & VGE_TDSTS_OWN) { - ctx->vge_maxsegs = 0; - return; - } - - for (i = 0; i < nseg; i++) { - f = &d->vge_frag[i]; - f->vge_buflen = htole16(VGE_BUFLEN(segs[i].ds_len)); - f->vge_addrlo = htole32(VGE_ADDR_LO(segs[i].ds_addr)); - f->vge_addrhi = htole16(VGE_ADDR_HI(segs[i].ds_addr) & 0xFFFF); - } - - /* Argh. This chip does not autopad short frames */ - - if (ctx->vge_m0->m_pkthdr.len < VGE_MIN_FRAMELEN) { - f = &d->vge_frag[i]; - f->vge_buflen = htole16(VGE_BUFLEN(VGE_MIN_FRAMELEN - - ctx->vge_m0->m_pkthdr.len)); - f->vge_addrlo = htole32(VGE_ADDR_LO(segs[0].ds_addr)); - f->vge_addrhi = htole16(VGE_ADDR_HI(segs[0].ds_addr) & 0xFFFF); - ctx->vge_m0->m_pkthdr.len = VGE_MIN_FRAMELEN; - i++; - } - - /* - * When telling the chip how many segments there are, we - * must use nsegs + 1 instead of just nsegs. Darned if I - * know why. - */ - i++; - - d->vge_sts = ctx->vge_m0->m_pkthdr.len << 16; - d->vge_ctl = ctx->vge_flags|(i << 28)|VGE_TD_LS_NORM; - - if (ctx->vge_m0->m_pkthdr.len > ETHERMTU + ETHER_HDR_LEN) - d->vge_ctl |= VGE_TDCTL_JUMBO; - - ctx->vge_maxsegs = nseg; - - return; -} - /* * Map a single buffer address. */ -static void -vge_dma_map_addr(arg, segs, nseg, error) - void *arg; - bus_dma_segment_t *segs; - int nseg; - int error; -{ - bus_addr_t *addr; +struct vge_dmamap_arg { + bus_addr_t vge_busaddr; +}; - if (error) +static void +vge_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + struct vge_dmamap_arg *ctx; + + if (error != 0) return; - KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg)); - addr = arg; - *addr = segs->ds_addr; + KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs)); - return; + ctx = (struct vge_dmamap_arg *)arg; + ctx->vge_busaddr = segs[0].ds_addr; } static int -vge_allocmem(dev, sc) - device_t dev; - struct vge_softc *sc; +vge_dma_alloc(struct vge_softc *sc) { - int error; - int nseg; - int i; + struct vge_dmamap_arg ctx; + struct vge_txdesc *txd; + struct vge_rxdesc *rxd; + bus_addr_t lowaddr, tx_ring_end, rx_ring_end; + int error, i; - /* - * Allocate map for RX mbufs. - */ - nseg = 32; - error = bus_dma_tag_create(sc->vge_parent_tag, ETHER_ALIGN, 0, - BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, - NULL, MCLBYTES * nseg, nseg, MCLBYTES, BUS_DMA_ALLOCNOW, - NULL, NULL, &sc->vge_ldata.vge_mtag); - if (error) { - device_printf(dev, "could not allocate dma tag\n"); - return (ENOMEM); + lowaddr = BUS_SPACE_MAXADDR; + +again: + /* Create parent ring tag. */ + error = bus_dma_tag_create(bus_get_dma_tag(sc->vge_dev),/* parent */ + 1, 0, /* algnmnt, boundary */ + lowaddr, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ + 0, /* nsegments */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->vge_cdata.vge_ring_tag); + if (error != 0) { + device_printf(sc->vge_dev, + "could not create parent DMA tag.\n"); + goto fail; } - /* - * Allocate map for TX descriptor list. - */ - error = bus_dma_tag_create(sc->vge_parent_tag, VGE_RING_ALIGN, - 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, - NULL, VGE_TX_LIST_SZ, 1, VGE_TX_LIST_SZ, BUS_DMA_ALLOCNOW, - NULL, NULL, &sc->vge_ldata.vge_tx_list_tag); - if (error) { - device_printf(dev, "could not allocate dma tag\n"); - return (ENOMEM); + /* Create tag for Tx ring. */ + error = bus_dma_tag_create(sc->vge_cdata.vge_ring_tag,/* parent */ + VGE_TX_RING_ALIGN, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + VGE_TX_LIST_SZ, /* maxsize */ + 1, /* nsegments */ + VGE_TX_LIST_SZ, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->vge_cdata.vge_tx_ring_tag); + if (error != 0) { + device_printf(sc->vge_dev, + "could not allocate Tx ring DMA tag.\n"); + goto fail; } - /* Allocate DMA'able memory for the TX ring */ + /* Create tag for Rx ring. */ + error = bus_dma_tag_create(sc->vge_cdata.vge_ring_tag,/* parent */ + VGE_RX_RING_ALIGN, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + VGE_RX_LIST_SZ, /* maxsize */ + 1, /* nsegments */ + VGE_RX_LIST_SZ, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->vge_cdata.vge_rx_ring_tag); + if (error != 0) { + device_printf(sc->vge_dev, + "could not allocate Rx ring DMA tag.\n"); + goto fail; + } - error = bus_dmamem_alloc(sc->vge_ldata.vge_tx_list_tag, - (void **)&sc->vge_ldata.vge_tx_list, BUS_DMA_NOWAIT | BUS_DMA_ZERO, - &sc->vge_ldata.vge_tx_list_map); - if (error) - return (ENOMEM); + /* Allocate DMA'able memory and load the DMA map for Tx ring. */ + error = bus_dmamem_alloc(sc->vge_cdata.vge_tx_ring_tag, + (void **)&sc->vge_rdata.vge_tx_ring, + BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_COHERENT, + &sc->vge_cdata.vge_tx_ring_map); + if (error != 0) { + device_printf(sc->vge_dev, + "could not allocate DMA'able memory for Tx ring.\n"); + goto fail; + } - /* Load the map for the TX ring. */ + ctx.vge_busaddr = 0; + error = bus_dmamap_load(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_cdata.vge_tx_ring_map, sc->vge_rdata.vge_tx_ring, + VGE_TX_LIST_SZ, vge_dmamap_cb, &ctx, BUS_DMA_NOWAIT); + if (error != 0 || ctx.vge_busaddr == 0) { + device_printf(sc->vge_dev, + "could not load DMA'able memory for Tx ring.\n"); + goto fail; + } + sc->vge_rdata.vge_tx_ring_paddr = ctx.vge_busaddr; - error = bus_dmamap_load(sc->vge_ldata.vge_tx_list_tag, - sc->vge_ldata.vge_tx_list_map, sc->vge_ldata.vge_tx_list, - VGE_TX_LIST_SZ, vge_dma_map_addr, - &sc->vge_ldata.vge_tx_list_addr, BUS_DMA_NOWAIT); + /* Allocate DMA'able memory and load the DMA map for Rx ring. */ + error = bus_dmamem_alloc(sc->vge_cdata.vge_rx_ring_tag, + (void **)&sc->vge_rdata.vge_rx_ring, + BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_COHERENT, + &sc->vge_cdata.vge_rx_ring_map); + if (error != 0) { + device_printf(sc->vge_dev, + "could not allocate DMA'able memory for Rx ring.\n"); + goto fail; + } - /* Create DMA maps for TX buffers */ + ctx.vge_busaddr = 0; + error = bus_dmamap_load(sc->vge_cdata.vge_rx_ring_tag, + sc->vge_cdata.vge_rx_ring_map, sc->vge_rdata.vge_rx_ring, + VGE_RX_LIST_SZ, vge_dmamap_cb, &ctx, BUS_DMA_NOWAIT); + if (error != 0 || ctx.vge_busaddr == 0) { + device_printf(sc->vge_dev, + "could not load DMA'able memory for Rx ring.\n"); + goto fail; + } + sc->vge_rdata.vge_rx_ring_paddr = ctx.vge_busaddr; + /* Tx/Rx descriptor queue should reside within 4GB boundary. */ + tx_ring_end = sc->vge_rdata.vge_tx_ring_paddr + VGE_TX_LIST_SZ; + rx_ring_end = sc->vge_rdata.vge_rx_ring_paddr + VGE_RX_LIST_SZ; + if ((VGE_ADDR_HI(tx_ring_end) != + VGE_ADDR_HI(sc->vge_rdata.vge_tx_ring_paddr)) || + (VGE_ADDR_HI(rx_ring_end) != + VGE_ADDR_HI(sc->vge_rdata.vge_rx_ring_paddr)) || + VGE_ADDR_HI(tx_ring_end) != VGE_ADDR_HI(rx_ring_end)) { + device_printf(sc->vge_dev, "4GB boundary crossed, " + "switching to 32bit DMA address mode.\n"); + vge_dma_free(sc); + /* Limit DMA address space to 32bit and try again. */ + lowaddr = BUS_SPACE_MAXADDR_32BIT; + goto again; + } + + /* Create parent buffer tag. */ + error = bus_dma_tag_create(bus_get_dma_tag(sc->vge_dev),/* parent */ + 1, 0, /* algnmnt, boundary */ + VGE_BUF_DMA_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ + 0, /* nsegments */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->vge_cdata.vge_buffer_tag); + if (error != 0) { + device_printf(sc->vge_dev, + "could not create parent buffer DMA tag.\n"); + goto fail; + } + + /* Create tag for Tx buffers. */ + error = bus_dma_tag_create(sc->vge_cdata.vge_buffer_tag,/* parent */ + 1, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MCLBYTES * VGE_MAXTXSEGS, /* maxsize */ + VGE_MAXTXSEGS, /* nsegments */ + MCLBYTES, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->vge_cdata.vge_tx_tag); + if (error != 0) { + device_printf(sc->vge_dev, "could not create Tx DMA tag.\n"); + goto fail; + } + + /* Create tag for Rx buffers. */ + error = bus_dma_tag_create(sc->vge_cdata.vge_buffer_tag,/* parent */ + VGE_RX_BUF_ALIGN, 0, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MCLBYTES, /* maxsize */ + 1, /* nsegments */ + MCLBYTES, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->vge_cdata.vge_rx_tag); + if (error != 0) { + device_printf(sc->vge_dev, "could not create Rx DMA tag.\n"); + goto fail; + } + + /* Create DMA maps for Tx buffers. */ for (i = 0; i < VGE_TX_DESC_CNT; i++) { - error = bus_dmamap_create(sc->vge_ldata.vge_mtag, 0, - &sc->vge_ldata.vge_tx_dmamap[i]); - if (error) { - device_printf(dev, "can't create DMA map for TX\n"); - return (ENOMEM); + txd = &sc->vge_cdata.vge_txdesc[i]; + txd->tx_m = NULL; + txd->tx_dmamap = NULL; + error = bus_dmamap_create(sc->vge_cdata.vge_tx_tag, 0, + &txd->tx_dmamap); + if (error != 0) { + device_printf(sc->vge_dev, + "could not create Tx dmamap.\n"); + goto fail; } } - - /* - * Allocate map for RX descriptor list. - */ - error = bus_dma_tag_create(sc->vge_parent_tag, VGE_RING_ALIGN, - 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, - NULL, VGE_TX_LIST_SZ, 1, VGE_TX_LIST_SZ, BUS_DMA_ALLOCNOW, - NULL, NULL, &sc->vge_ldata.vge_rx_list_tag); - if (error) { - device_printf(dev, "could not allocate dma tag\n"); - return (ENOMEM); + /* Create DMA maps for Rx buffers. */ + if ((error = bus_dmamap_create(sc->vge_cdata.vge_rx_tag, 0, + &sc->vge_cdata.vge_rx_sparemap)) != 0) { + device_printf(sc->vge_dev, + "could not create spare Rx dmamap.\n"); + goto fail; } - - /* Allocate DMA'able memory for the RX ring */ - - error = bus_dmamem_alloc(sc->vge_ldata.vge_rx_list_tag, - (void **)&sc->vge_ldata.vge_rx_list, BUS_DMA_NOWAIT | BUS_DMA_ZERO, - &sc->vge_ldata.vge_rx_list_map); - if (error) - return (ENOMEM); - - /* Load the map for the RX ring. */ - - error = bus_dmamap_load(sc->vge_ldata.vge_rx_list_tag, - sc->vge_ldata.vge_rx_list_map, sc->vge_ldata.vge_rx_list, - VGE_TX_LIST_SZ, vge_dma_map_addr, - &sc->vge_ldata.vge_rx_list_addr, BUS_DMA_NOWAIT); - - /* Create DMA maps for RX buffers */ - for (i = 0; i < VGE_RX_DESC_CNT; i++) { - error = bus_dmamap_create(sc->vge_ldata.vge_mtag, 0, - &sc->vge_ldata.vge_rx_dmamap[i]); - if (error) { - device_printf(dev, "can't create DMA map for RX\n"); - return (ENOMEM); + rxd = &sc->vge_cdata.vge_rxdesc[i]; + rxd->rx_m = NULL; + rxd->rx_dmamap = NULL; + error = bus_dmamap_create(sc->vge_cdata.vge_rx_tag, 0, + &rxd->rx_dmamap); + if (error != 0) { + device_printf(sc->vge_dev, + "could not create Rx dmamap.\n"); + goto fail; } } - return (0); +fail: + return (error); +} + +static void +vge_dma_free(struct vge_softc *sc) +{ + struct vge_txdesc *txd; + struct vge_rxdesc *rxd; + int i; + + /* Tx ring. */ + if (sc->vge_cdata.vge_tx_ring_tag != NULL) { + if (sc->vge_cdata.vge_tx_ring_map) + bus_dmamap_unload(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_cdata.vge_tx_ring_map); + if (sc->vge_cdata.vge_tx_ring_map && + sc->vge_rdata.vge_tx_ring) + bus_dmamem_free(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_rdata.vge_tx_ring, + sc->vge_cdata.vge_tx_ring_map); + sc->vge_rdata.vge_tx_ring = NULL; + sc->vge_cdata.vge_tx_ring_map = NULL; + bus_dma_tag_destroy(sc->vge_cdata.vge_tx_ring_tag); + sc->vge_cdata.vge_tx_ring_tag = NULL; + } + /* Rx ring. */ + if (sc->vge_cdata.vge_rx_ring_tag != NULL) { + if (sc->vge_cdata.vge_rx_ring_map) + bus_dmamap_unload(sc->vge_cdata.vge_rx_ring_tag, + sc->vge_cdata.vge_rx_ring_map); + if (sc->vge_cdata.vge_rx_ring_map && + sc->vge_rdata.vge_rx_ring) + bus_dmamem_free(sc->vge_cdata.vge_rx_ring_tag, + sc->vge_rdata.vge_rx_ring, + sc->vge_cdata.vge_rx_ring_map); + sc->vge_rdata.vge_rx_ring = NULL; + sc->vge_cdata.vge_rx_ring_map = NULL; + bus_dma_tag_destroy(sc->vge_cdata.vge_rx_ring_tag); + sc->vge_cdata.vge_rx_ring_tag = NULL; + } + /* Tx buffers. */ + if (sc->vge_cdata.vge_tx_tag != NULL) { + for (i = 0; i < VGE_TX_DESC_CNT; i++) { + txd = &sc->vge_cdata.vge_txdesc[i]; + if (txd->tx_dmamap != NULL) { + bus_dmamap_destroy(sc->vge_cdata.vge_tx_tag, + txd->tx_dmamap); + txd->tx_dmamap = NULL; + } + } + bus_dma_tag_destroy(sc->vge_cdata.vge_tx_tag); + sc->vge_cdata.vge_tx_tag = NULL; + } + /* Rx buffers. */ + if (sc->vge_cdata.vge_rx_tag != NULL) { + for (i = 0; i < VGE_RX_DESC_CNT; i++) { + rxd = &sc->vge_cdata.vge_rxdesc[i]; + if (rxd->rx_dmamap != NULL) { + bus_dmamap_destroy(sc->vge_cdata.vge_rx_tag, + rxd->rx_dmamap); + rxd->rx_dmamap = NULL; + } + } + if (sc->vge_cdata.vge_rx_sparemap != NULL) { + bus_dmamap_destroy(sc->vge_cdata.vge_rx_tag, + sc->vge_cdata.vge_rx_sparemap); + sc->vge_cdata.vge_rx_sparemap = NULL; + } + bus_dma_tag_destroy(sc->vge_cdata.vge_rx_tag); + sc->vge_cdata.vge_rx_tag = NULL; + } + + if (sc->vge_cdata.vge_buffer_tag != NULL) { + bus_dma_tag_destroy(sc->vge_cdata.vge_buffer_tag); + sc->vge_cdata.vge_buffer_tag = NULL; + } + if (sc->vge_cdata.vge_ring_tag != NULL) { + bus_dma_tag_destroy(sc->vge_cdata.vge_ring_tag); + sc->vge_cdata.vge_ring_tag = NULL; + } } /* @@ -916,84 +981,111 @@ vge_allocmem(dev, sc) * setup and ethernet/BPF attach. */ static int -vge_attach(dev) - device_t dev; +vge_attach(device_t dev) { - u_char eaddr[ETHER_ADDR_LEN]; - struct vge_softc *sc; - struct ifnet *ifp; - int unit, error = 0, rid; + u_char eaddr[ETHER_ADDR_LEN]; + struct vge_softc *sc; + struct ifnet *ifp; + int error = 0, cap, i, msic, rid; sc = device_get_softc(dev); - unit = device_get_unit(dev); sc->vge_dev = dev; mtx_init(&sc->vge_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF | MTX_RECURSE); + MTX_DEF); + callout_init_mtx(&sc->vge_watchdog, &sc->vge_mtx, 0); + /* * Map control/status registers. */ pci_enable_busmaster(dev); - rid = VGE_PCI_LOMEM; - sc->vge_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, - 0, ~0, 1, RF_ACTIVE); + rid = PCIR_BAR(1); + sc->vge_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); if (sc->vge_res == NULL) { - printf ("vge%d: couldn't map ports/memory\n", unit); + device_printf(dev, "couldn't map ports/memory\n"); error = ENXIO; goto fail; } - sc->vge_btag = rman_get_bustag(sc->vge_res); - sc->vge_bhandle = rman_get_bushandle(sc->vge_res); + if (pci_find_extcap(dev, PCIY_EXPRESS, &cap) == 0) { + sc->vge_flags |= VGE_FLAG_PCIE; + sc->vge_expcap = cap; + } else + sc->vge_flags |= VGE_FLAG_JUMBO; + if (pci_find_extcap(dev, PCIY_PMG, &cap) == 0) { + sc->vge_flags |= VGE_FLAG_PMCAP; + sc->vge_pmcap = cap; + } + rid = 0; + msic = pci_msi_count(dev); + if (msi_disable == 0 && msic > 0) { + msic = 1; + if (pci_alloc_msi(dev, &msic) == 0) { + if (msic == 1) { + sc->vge_flags |= VGE_FLAG_MSI; + device_printf(dev, "Using %d MSI message\n", + msic); + rid = 1; + } else + pci_release_msi(dev); + } + } /* Allocate interrupt */ - rid = 0; - sc->vge_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, - 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE); - + sc->vge_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + ((sc->vge_flags & VGE_FLAG_MSI) ? 0 : RF_SHAREABLE) | RF_ACTIVE); if (sc->vge_irq == NULL) { - printf("vge%d: couldn't map interrupt\n", unit); + device_printf(dev, "couldn't map interrupt\n"); error = ENXIO; goto fail; } /* Reset the adapter. */ vge_reset(sc); + /* Reload EEPROM. */ + CSR_WRITE_1(sc, VGE_EECSR, VGE_EECSR_RELOAD); + for (i = 0; i < VGE_TIMEOUT; i++) { + DELAY(5); + if ((CSR_READ_1(sc, VGE_EECSR) & VGE_EECSR_RELOAD) == 0) + break; + } + if (i == VGE_TIMEOUT) + device_printf(dev, "EEPROM reload timed out\n"); + /* + * Clear PACPI as EEPROM reload will set the bit. Otherwise + * MAC will receive magic packet which in turn confuses + * controller. + */ + CSR_CLRBIT_1(sc, VGE_CHIPCFG0, VGE_CHIPCFG0_PACPI); /* * Get station address from the EEPROM. */ vge_read_eeprom(sc, (caddr_t)eaddr, VGE_EE_EADDR, 3, 0); - - sc->vge_unit = unit; - /* - * Allocate the parent bus DMA tag appropriate for PCI. + * Save configured PHY address. + * It seems the PHY address of PCIe controllers just + * reflects media jump strapping status so we assume the + * internal PHY address of PCIe controller is at 1. */ -#define VGE_NSEG_NEW 32 - error = bus_dma_tag_create(NULL, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_32BIT,/* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - MAXBSIZE, VGE_NSEG_NEW, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT,/* maxsegsize */ - BUS_DMA_ALLOCNOW, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &sc->vge_parent_tag); - if (error) - goto fail; - - error = vge_allocmem(dev, sc); - + if ((sc->vge_flags & VGE_FLAG_PCIE) != 0) + sc->vge_phyaddr = 1; + else + sc->vge_phyaddr = CSR_READ_1(sc, VGE_MIICFG) & + VGE_MIICFG_PHYADDR; + /* Clear WOL and take hardware from powerdown. */ + vge_clrwol(sc); + vge_sysctl_node(sc); + error = vge_dma_alloc(sc); if (error) goto fail; ifp = sc->vge_ifp = if_alloc(IFT_ETHER); if (ifp == NULL) { - printf("vge%d: can not if_alloc()\n", sc->vge_unit); + device_printf(dev, "can not if_alloc()\n"); error = ENOSPC; goto fail; } @@ -1001,43 +1093,45 @@ vge_attach(dev) /* Do MII setup */ if (mii_phy_probe(dev, &sc->vge_miibus, vge_ifmedia_upd, vge_ifmedia_sts)) { - printf("vge%d: MII without any phy!\n", sc->vge_unit); + device_printf(dev, "MII without any phy!\n"); error = ENXIO; goto fail; } ifp->if_softc = sc; if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_mtu = ETHERMTU; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = vge_ioctl; ifp->if_capabilities = IFCAP_VLAN_MTU; ifp->if_start = vge_start; ifp->if_hwassist = VGE_CSUM_FEATURES; - ifp->if_capabilities |= IFCAP_HWCSUM|IFCAP_VLAN_HWTAGGING; + ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | + IFCAP_VLAN_HWTAGGING; + if ((sc->vge_flags & VGE_FLAG_PMCAP) != 0) + ifp->if_capabilities |= IFCAP_WOL; ifp->if_capenable = ifp->if_capabilities; #ifdef DEVICE_POLLING ifp->if_capabilities |= IFCAP_POLLING; #endif - ifp->if_watchdog = vge_watchdog; ifp->if_init = vge_init; - IFQ_SET_MAXLEN(&ifp->if_snd, VGE_IFQ_MAXLEN); - ifp->if_snd.ifq_drv_maxlen = VGE_IFQ_MAXLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, VGE_TX_DESC_CNT - 1); + ifp->if_snd.ifq_drv_maxlen = VGE_TX_DESC_CNT - 1; IFQ_SET_READY(&ifp->if_snd); - TASK_INIT(&sc->vge_txtask, 0, vge_tx_task, ifp); - /* * Call MI attach routine. */ ether_ifattach(ifp, eaddr); + /* Tell the upper layer(s) we support long frames. */ + ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); + /* Hook interrupt last to avoid having to lock softc */ error = bus_setup_intr(dev, sc->vge_irq, INTR_TYPE_NET|INTR_MPSAFE, NULL, vge_intr, sc, &sc->vge_intrhand); if (error) { - printf("vge%d: couldn't set up irq\n", unit); + device_printf(dev, "couldn't set up irq\n"); ether_ifdetach(ifp); goto fail; } @@ -1057,12 +1151,10 @@ fail: * allocated. */ static int -vge_detach(dev) - device_t dev; +vge_detach(device_t dev) { - struct vge_softc *sc; - struct ifnet *ifp; - int i; + struct vge_softc *sc; + struct ifnet *ifp; sc = device_get_softc(dev); KASSERT(mtx_initialized(&sc->vge_mtx), ("vge mutex not initialized")); @@ -1075,21 +1167,11 @@ vge_detach(dev) /* These should only be active if attach succeeded */ if (device_is_attached(dev)) { - vge_stop(sc); - /* - * Force off the IFF_UP flag here, in case someone - * still had a BPF descriptor attached to this - * interface. If they do, ether_ifattach() will cause - * the BPF code to try and clear the promisc mode - * flag, which will bubble down to vge_ioctl(), - * which will try to call vge_init() again. This will - * turn the NIC back on and restart the MII ticker, - * which will panic the system when the kernel tries - * to invoke the vge_tick() function that isn't there - * anymore. - */ - ifp->if_flags &= ~IFF_UP; ether_ifdetach(ifp); + VGE_LOCK(sc); + vge_stop(sc); + VGE_UNLOCK(sc); + callout_drain(&sc->vge_watchdog); } if (sc->vge_miibus) device_delete_child(dev, sc->vge_miibus); @@ -1098,104 +1180,31 @@ vge_detach(dev) if (sc->vge_intrhand) bus_teardown_intr(dev, sc->vge_irq, sc->vge_intrhand); if (sc->vge_irq) - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->vge_irq); + bus_release_resource(dev, SYS_RES_IRQ, + sc->vge_flags & VGE_FLAG_MSI ? 1 : 0, sc->vge_irq); + if (sc->vge_flags & VGE_FLAG_MSI) + pci_release_msi(dev); if (sc->vge_res) bus_release_resource(dev, SYS_RES_MEMORY, - VGE_PCI_LOMEM, sc->vge_res); + PCIR_BAR(1), sc->vge_res); if (ifp) if_free(ifp); - /* Unload and free the RX DMA ring memory and map */ - - if (sc->vge_ldata.vge_rx_list_tag) { - bus_dmamap_unload(sc->vge_ldata.vge_rx_list_tag, - sc->vge_ldata.vge_rx_list_map); - bus_dmamem_free(sc->vge_ldata.vge_rx_list_tag, - sc->vge_ldata.vge_rx_list, - sc->vge_ldata.vge_rx_list_map); - bus_dma_tag_destroy(sc->vge_ldata.vge_rx_list_tag); - } - - /* Unload and free the TX DMA ring memory and map */ - - if (sc->vge_ldata.vge_tx_list_tag) { - bus_dmamap_unload(sc->vge_ldata.vge_tx_list_tag, - sc->vge_ldata.vge_tx_list_map); - bus_dmamem_free(sc->vge_ldata.vge_tx_list_tag, - sc->vge_ldata.vge_tx_list, - sc->vge_ldata.vge_tx_list_map); - bus_dma_tag_destroy(sc->vge_ldata.vge_tx_list_tag); - } - - /* Destroy all the RX and TX buffer maps */ - - if (sc->vge_ldata.vge_mtag) { - for (i = 0; i < VGE_TX_DESC_CNT; i++) - bus_dmamap_destroy(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_tx_dmamap[i]); - for (i = 0; i < VGE_RX_DESC_CNT; i++) - bus_dmamap_destroy(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_rx_dmamap[i]); - bus_dma_tag_destroy(sc->vge_ldata.vge_mtag); - } - - if (sc->vge_parent_tag) - bus_dma_tag_destroy(sc->vge_parent_tag); - + vge_dma_free(sc); mtx_destroy(&sc->vge_mtx); return (0); } -static int -vge_newbuf(sc, idx, m) - struct vge_softc *sc; - int idx; - struct mbuf *m; +static void +vge_discard_rxbuf(struct vge_softc *sc, int prod) { - struct vge_dmaload_arg arg; - struct mbuf *n = NULL; - int i, error; + struct vge_rxdesc *rxd; + int i; - if (m == NULL) { - n = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); - if (n == NULL) - return (ENOBUFS); - m = n; - } else - m->m_data = m->m_ext.ext_buf; - - -#ifdef VGE_FIXUP_RX - /* - * This is part of an evil trick to deal with non-x86 platforms. - * The VIA chip requires RX buffers to be aligned on 32-bit - * boundaries, but that will hose non-x86 machines. To get around - * this, we leave some empty space at the start of each buffer - * and for non-x86 hosts, we copy the buffer back two bytes - * to achieve word alignment. This is slightly more efficient - * than allocating a new buffer, copying the contents, and - * discarding the old buffer. - */ - m->m_len = m->m_pkthdr.len = MCLBYTES - VGE_ETHER_ALIGN; - m_adj(m, VGE_ETHER_ALIGN); -#else - m->m_len = m->m_pkthdr.len = MCLBYTES; -#endif - - arg.sc = sc; - arg.vge_idx = idx; - arg.vge_maxsegs = 1; - arg.vge_flags = 0; - - error = bus_dmamap_load_mbuf(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_rx_dmamap[idx], m, vge_dma_map_rx_desc, - &arg, BUS_DMA_NOWAIT); - if (error || arg.vge_maxsegs != 1) { - if (n != NULL) - m_freem(n); - return (ENOMEM); - } + rxd = &sc->vge_cdata.vge_rxdesc[prod]; + rxd->rx_desc->vge_sts = 0; + rxd->rx_desc->vge_ctl = 0; /* * Note: the manual fails to document the fact that for @@ -1205,79 +1214,197 @@ vge_newbuf(sc, idx, m) * but we should not set the OWN bits until we're ready * to hand back 4 of them in one shot. */ + if ((prod % VGE_RXCHUNK) == (VGE_RXCHUNK - 1)) { + for (i = VGE_RXCHUNK; i > 0; i--) { + rxd->rx_desc->vge_sts = htole32(VGE_RDSTS_OWN); + rxd = rxd->rxd_prev; + } + sc->vge_cdata.vge_rx_commit += VGE_RXCHUNK; + } +} -#define VGE_RXCHUNK 4 - sc->vge_rx_consumed++; - if (sc->vge_rx_consumed == VGE_RXCHUNK) { - for (i = idx; i != idx - sc->vge_rx_consumed; i--) - sc->vge_ldata.vge_rx_list[i].vge_sts |= - htole32(VGE_RDSTS_OWN); - sc->vge_rx_consumed = 0; +static int +vge_newbuf(struct vge_softc *sc, int prod) +{ + struct vge_rxdesc *rxd; + struct mbuf *m; + bus_dma_segment_t segs[1]; + bus_dmamap_t map; + int i, nsegs; + + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) + return (ENOBUFS); + /* + * This is part of an evil trick to deal with strict-alignment + * architectures. The VIA chip requires RX buffers to be aligned + * on 32-bit boundaries, but that will hose strict-alignment + * architectures. To get around this, we leave some empty space + * at the start of each buffer and for non-strict-alignment hosts, + * we copy the buffer back two bytes to achieve word alignment. + * This is slightly more efficient than allocating a new buffer, + * copying the contents, and discarding the old buffer. + */ + m->m_len = m->m_pkthdr.len = MCLBYTES; + m_adj(m, VGE_RX_BUF_ALIGN); + + if (bus_dmamap_load_mbuf_sg(sc->vge_cdata.vge_rx_tag, + sc->vge_cdata.vge_rx_sparemap, m, segs, &nsegs, 0) != 0) { + m_freem(m); + return (ENOBUFS); + } + KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs)); + + rxd = &sc->vge_cdata.vge_rxdesc[prod]; + if (rxd->rx_m != NULL) { + bus_dmamap_sync(sc->vge_cdata.vge_rx_tag, rxd->rx_dmamap, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->vge_cdata.vge_rx_tag, rxd->rx_dmamap); + } + map = rxd->rx_dmamap; + rxd->rx_dmamap = sc->vge_cdata.vge_rx_sparemap; + sc->vge_cdata.vge_rx_sparemap = map; + bus_dmamap_sync(sc->vge_cdata.vge_rx_tag, rxd->rx_dmamap, + BUS_DMASYNC_PREREAD); + rxd->rx_m = m; + + rxd->rx_desc->vge_sts = 0; + rxd->rx_desc->vge_ctl = 0; + rxd->rx_desc->vge_addrlo = htole32(VGE_ADDR_LO(segs[0].ds_addr)); + rxd->rx_desc->vge_addrhi = htole32(VGE_ADDR_HI(segs[0].ds_addr) | + (VGE_BUFLEN(segs[0].ds_len) << 16) | VGE_RXDESC_I); + + /* + * Note: the manual fails to document the fact that for + * proper operation, the driver needs to replenish the RX + * DMA ring 4 descriptors at a time (rather than one at a + * time, like most chips). We can allocate the new buffers + * but we should not set the OWN bits until we're ready + * to hand back 4 of them in one shot. + */ + if ((prod % VGE_RXCHUNK) == (VGE_RXCHUNK - 1)) { + for (i = VGE_RXCHUNK; i > 0; i--) { + rxd->rx_desc->vge_sts = htole32(VGE_RDSTS_OWN); + rxd = rxd->rxd_prev; + } + sc->vge_cdata.vge_rx_commit += VGE_RXCHUNK; } - sc->vge_ldata.vge_rx_mbuf[idx] = m; + return (0); +} - bus_dmamap_sync(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_rx_dmamap[idx], - BUS_DMASYNC_PREREAD); +static int +vge_tx_list_init(struct vge_softc *sc) +{ + struct vge_ring_data *rd; + struct vge_txdesc *txd; + int i; + + VGE_LOCK_ASSERT(sc); + + sc->vge_cdata.vge_tx_prodidx = 0; + sc->vge_cdata.vge_tx_considx = 0; + sc->vge_cdata.vge_tx_cnt = 0; + + rd = &sc->vge_rdata; + bzero(rd->vge_tx_ring, VGE_TX_LIST_SZ); + for (i = 0; i < VGE_TX_DESC_CNT; i++) { + txd = &sc->vge_cdata.vge_txdesc[i]; + txd->tx_m = NULL; + txd->tx_desc = &rd->vge_tx_ring[i]; + } + + bus_dmamap_sync(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_cdata.vge_tx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); return (0); } static int -vge_tx_list_init(sc) - struct vge_softc *sc; +vge_rx_list_init(struct vge_softc *sc) { - bzero ((char *)sc->vge_ldata.vge_tx_list, VGE_TX_LIST_SZ); - bzero ((char *)&sc->vge_ldata.vge_tx_mbuf, - (VGE_TX_DESC_CNT * sizeof(struct mbuf *))); + struct vge_ring_data *rd; + struct vge_rxdesc *rxd; + int i; - bus_dmamap_sync(sc->vge_ldata.vge_tx_list_tag, - sc->vge_ldata.vge_tx_list_map, BUS_DMASYNC_PREWRITE); - sc->vge_ldata.vge_tx_prodidx = 0; - sc->vge_ldata.vge_tx_considx = 0; - sc->vge_ldata.vge_tx_free = VGE_TX_DESC_CNT; + VGE_LOCK_ASSERT(sc); - return (0); -} - -static int -vge_rx_list_init(sc) - struct vge_softc *sc; -{ - int i; - - bzero ((char *)sc->vge_ldata.vge_rx_list, VGE_RX_LIST_SZ); - bzero ((char *)&sc->vge_ldata.vge_rx_mbuf, - (VGE_RX_DESC_CNT * sizeof(struct mbuf *))); - - sc->vge_rx_consumed = 0; + sc->vge_cdata.vge_rx_prodidx = 0; + sc->vge_cdata.vge_head = NULL; + sc->vge_cdata.vge_tail = NULL; + sc->vge_cdata.vge_rx_commit = 0; + rd = &sc->vge_rdata; + bzero(rd->vge_rx_ring, VGE_RX_LIST_SZ); for (i = 0; i < VGE_RX_DESC_CNT; i++) { - if (vge_newbuf(sc, i, NULL) == ENOBUFS) + rxd = &sc->vge_cdata.vge_rxdesc[i]; + rxd->rx_m = NULL; + rxd->rx_desc = &rd->vge_rx_ring[i]; + if (i == 0) + rxd->rxd_prev = + &sc->vge_cdata.vge_rxdesc[VGE_RX_DESC_CNT - 1]; + else + rxd->rxd_prev = &sc->vge_cdata.vge_rxdesc[i - 1]; + if (vge_newbuf(sc, i) != 0) return (ENOBUFS); } - /* Flush the RX descriptors */ + bus_dmamap_sync(sc->vge_cdata.vge_rx_ring_tag, + sc->vge_cdata.vge_rx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - bus_dmamap_sync(sc->vge_ldata.vge_rx_list_tag, - sc->vge_ldata.vge_rx_list_map, - BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - - sc->vge_ldata.vge_rx_prodidx = 0; - sc->vge_rx_consumed = 0; - sc->vge_head = sc->vge_tail = NULL; + sc->vge_cdata.vge_rx_commit = 0; return (0); } -#ifdef VGE_FIXUP_RX -static __inline void -vge_fixup_rx(m) - struct mbuf *m; +static void +vge_freebufs(struct vge_softc *sc) { - int i; - uint16_t *src, *dst; + struct vge_txdesc *txd; + struct vge_rxdesc *rxd; + struct ifnet *ifp; + int i; + + VGE_LOCK_ASSERT(sc); + + ifp = sc->vge_ifp; + /* + * Free RX and TX mbufs still in the queues. + */ + for (i = 0; i < VGE_RX_DESC_CNT; i++) { + rxd = &sc->vge_cdata.vge_rxdesc[i]; + if (rxd->rx_m != NULL) { + bus_dmamap_sync(sc->vge_cdata.vge_rx_tag, + rxd->rx_dmamap, BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->vge_cdata.vge_rx_tag, + rxd->rx_dmamap); + m_freem(rxd->rx_m); + rxd->rx_m = NULL; + } + } + + for (i = 0; i < VGE_TX_DESC_CNT; i++) { + txd = &sc->vge_cdata.vge_txdesc[i]; + if (txd->tx_m != NULL) { + bus_dmamap_sync(sc->vge_cdata.vge_tx_tag, + txd->tx_dmamap, BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->vge_cdata.vge_tx_tag, + txd->tx_dmamap); + m_freem(txd->tx_m); + txd->tx_m = NULL; + ifp->if_oerrors++; + } + } +} + +#ifndef __NO_STRICT_ALIGNMENT +static __inline void +vge_fixup_rx(struct mbuf *m) +{ + int i; + uint16_t *src, *dst; src = mtod(m, uint16_t *); dst = src - 1; @@ -1286,8 +1413,6 @@ vge_fixup_rx(m) *dst++ = *src++; m->m_data -= ETHER_ALIGN; - - return; } #endif @@ -1296,49 +1421,37 @@ vge_fixup_rx(m) * been fragmented across multiple 2K mbuf cluster buffers. */ static int -vge_rxeof(sc) - struct vge_softc *sc; +vge_rxeof(struct vge_softc *sc, int count) { - struct mbuf *m; - struct ifnet *ifp; - int i, total_len; - int lim = 0; - struct vge_rx_desc *cur_rx; - u_int32_t rxstat, rxctl; + struct mbuf *m; + struct ifnet *ifp; + int prod, prog, total_len; + struct vge_rxdesc *rxd; + struct vge_rx_desc *cur_rx; + uint32_t rxstat, rxctl; VGE_LOCK_ASSERT(sc); + ifp = sc->vge_ifp; - i = sc->vge_ldata.vge_rx_prodidx; - /* Invalidate the descriptor memory */ + bus_dmamap_sync(sc->vge_cdata.vge_rx_ring_tag, + sc->vge_cdata.vge_rx_ring_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - bus_dmamap_sync(sc->vge_ldata.vge_rx_list_tag, - sc->vge_ldata.vge_rx_list_map, - BUS_DMASYNC_POSTREAD); - - while (!VGE_OWN(&sc->vge_ldata.vge_rx_list[i])) { - -#ifdef DEVICE_POLLING - if (ifp->if_capenable & IFCAP_POLLING) { - if (sc->rxcycles <= 0) - break; - sc->rxcycles--; - } -#endif - - cur_rx = &sc->vge_ldata.vge_rx_list[i]; - m = sc->vge_ldata.vge_rx_mbuf[i]; - total_len = VGE_RXBYTES(cur_rx); + prod = sc->vge_cdata.vge_rx_prodidx; + for (prog = 0; count > 0 && + (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0; + VGE_RX_DESC_INC(prod)) { + cur_rx = &sc->vge_rdata.vge_rx_ring[prod]; rxstat = le32toh(cur_rx->vge_sts); + if ((rxstat & VGE_RDSTS_OWN) != 0) + break; + count--; + prog++; rxctl = le32toh(cur_rx->vge_ctl); - - /* Invalidate the RX mbuf and unload its map */ - - bus_dmamap_sync(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_rx_dmamap[i], - BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_rx_dmamap[i]); + total_len = VGE_RXBYTES(rxstat); + rxd = &sc->vge_cdata.vge_rxdesc[prod]; + m = rxd->rx_m; /* * If the 'start of frame' bit is set, this indicates @@ -1346,17 +1459,22 @@ vge_rxeof(sc) * or an intermediate fragment. Either way, we want to * accumulate the buffers. */ - if (rxstat & VGE_RXPKT_SOF) { - m->m_len = MCLBYTES - VGE_ETHER_ALIGN; - if (sc->vge_head == NULL) - sc->vge_head = sc->vge_tail = m; - else { - m->m_flags &= ~M_PKTHDR; - sc->vge_tail->m_next = m; - sc->vge_tail = m; + if ((rxstat & VGE_RXPKT_SOF) != 0) { + if (vge_newbuf(sc, prod) != 0) { + ifp->if_iqdrops++; + VGE_CHAIN_RESET(sc); + vge_discard_rxbuf(sc, prod); + continue; + } + m->m_len = MCLBYTES - VGE_RX_BUF_ALIGN; + if (sc->vge_cdata.vge_head == NULL) { + sc->vge_cdata.vge_head = m; + sc->vge_cdata.vge_tail = m; + } else { + m->m_flags &= ~M_PKTHDR; + sc->vge_cdata.vge_tail->m_next = m; + sc->vge_cdata.vge_tail = m; } - vge_newbuf(sc, i, NULL); - VGE_RX_DESC_INC(i); continue; } @@ -1368,43 +1486,32 @@ vge_rxeof(sc) * a 'VLAN CAM filter miss' and clears the 'RXOK' bit. * We don't want to drop the frame though: our VLAN * filtering is done in software. + * We also want to receive bad-checksummed frames and + * and frames with bad-length. */ - if (!(rxstat & VGE_RDSTS_RXOK) && !(rxstat & VGE_RDSTS_VIDM) - && !(rxstat & VGE_RDSTS_CSUMERR)) { + if ((rxstat & VGE_RDSTS_RXOK) == 0 && + (rxstat & (VGE_RDSTS_VIDM | VGE_RDSTS_RLERR | + VGE_RDSTS_CSUMERR)) == 0) { ifp->if_ierrors++; /* * If this is part of a multi-fragment packet, * discard all the pieces. */ - if (sc->vge_head != NULL) { - m_freem(sc->vge_head); - sc->vge_head = sc->vge_tail = NULL; - } - vge_newbuf(sc, i, m); - VGE_RX_DESC_INC(i); + VGE_CHAIN_RESET(sc); + vge_discard_rxbuf(sc, prod); continue; } - /* - * If allocating a replacement mbuf fails, - * reload the current one. - */ - - if (vge_newbuf(sc, i, NULL)) { - ifp->if_ierrors++; - if (sc->vge_head != NULL) { - m_freem(sc->vge_head); - sc->vge_head = sc->vge_tail = NULL; - } - vge_newbuf(sc, i, m); - VGE_RX_DESC_INC(i); + if (vge_newbuf(sc, prod) != 0) { + ifp->if_iqdrops++; + VGE_CHAIN_RESET(sc); + vge_discard_rxbuf(sc, prod); continue; } - VGE_RX_DESC_INC(i); - - if (sc->vge_head != NULL) { - m->m_len = total_len % (MCLBYTES - VGE_ETHER_ALIGN); + /* Chain received mbufs. */ + if (sc->vge_cdata.vge_head != NULL) { + m->m_len = total_len % (MCLBYTES - VGE_RX_BUF_ALIGN); /* * Special case: if there's 4 bytes or less * in this buffer, the mbuf can be discarded: @@ -1412,46 +1519,47 @@ vge_rxeof(sc) * care about anyway. */ if (m->m_len <= ETHER_CRC_LEN) { - sc->vge_tail->m_len -= + sc->vge_cdata.vge_tail->m_len -= (ETHER_CRC_LEN - m->m_len); m_freem(m); } else { m->m_len -= ETHER_CRC_LEN; m->m_flags &= ~M_PKTHDR; - sc->vge_tail->m_next = m; + sc->vge_cdata.vge_tail->m_next = m; } - m = sc->vge_head; - sc->vge_head = sc->vge_tail = NULL; + m = sc->vge_cdata.vge_head; + m->m_flags |= M_PKTHDR; m->m_pkthdr.len = total_len - ETHER_CRC_LEN; - } else + } else { + m->m_flags |= M_PKTHDR; m->m_pkthdr.len = m->m_len = (total_len - ETHER_CRC_LEN); + } -#ifdef VGE_FIXUP_RX +#ifndef __NO_STRICT_ALIGNMENT vge_fixup_rx(m); #endif - ifp->if_ipackets++; m->m_pkthdr.rcvif = ifp; /* Do RX checksumming if enabled */ - if (ifp->if_capenable & IFCAP_RXCSUM) { - + if ((ifp->if_capenable & IFCAP_RXCSUM) != 0 && + (rxctl & VGE_RDCTL_FRAG) == 0) { /* Check IP header checksum */ - if (rxctl & VGE_RDCTL_IPPKT) + if ((rxctl & VGE_RDCTL_IPPKT) != 0) m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; - if (rxctl & VGE_RDCTL_IPCSUMOK) + if ((rxctl & VGE_RDCTL_IPCSUMOK) != 0) m->m_pkthdr.csum_flags |= CSUM_IP_VALID; /* Check TCP/UDP checksum */ - if (rxctl & (VGE_RDCTL_TCPPKT|VGE_RDCTL_UDPPKT) && + if (rxctl & (VGE_RDCTL_TCPPKT | VGE_RDCTL_UDPPKT) && rxctl & VGE_RDCTL_PROTOCSUMOK) { m->m_pkthdr.csum_flags |= - CSUM_DATA_VALID|CSUM_PSEUDO_HDR; + CSUM_DATA_VALID | CSUM_PSEUDO_HDR; m->m_pkthdr.csum_data = 0xffff; } } - if (rxstat & VGE_RDSTS_VTAG) { + if ((rxstat & VGE_RDSTS_VTAG) != 0) { /* * The 32-bit rxctl register is stored in little-endian. * However, the 16-bit vlan tag is stored in big-endian, @@ -1465,120 +1573,107 @@ vge_rxeof(sc) VGE_UNLOCK(sc); (*ifp->if_input)(ifp, m); VGE_LOCK(sc); - - lim++; - if (lim == VGE_RX_DESC_CNT) - break; - + sc->vge_cdata.vge_head = NULL; + sc->vge_cdata.vge_tail = NULL; } - /* Flush the RX DMA ring */ - - bus_dmamap_sync(sc->vge_ldata.vge_rx_list_tag, - sc->vge_ldata.vge_rx_list_map, - BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - - sc->vge_ldata.vge_rx_prodidx = i; - CSR_WRITE_2(sc, VGE_RXDESC_RESIDUECNT, lim); - - - return (lim); + if (prog > 0) { + sc->vge_cdata.vge_rx_prodidx = prod; + bus_dmamap_sync(sc->vge_cdata.vge_rx_ring_tag, + sc->vge_cdata.vge_rx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + /* Update residue counter. */ + if (sc->vge_cdata.vge_rx_commit != 0) { + CSR_WRITE_2(sc, VGE_RXDESC_RESIDUECNT, + sc->vge_cdata.vge_rx_commit); + sc->vge_cdata.vge_rx_commit = 0; + } + } + return (prog); } static void -vge_txeof(sc) - struct vge_softc *sc; +vge_txeof(struct vge_softc *sc) { - struct ifnet *ifp; - u_int32_t txstat; - int idx; + struct ifnet *ifp; + struct vge_tx_desc *cur_tx; + struct vge_txdesc *txd; + uint32_t txstat; + int cons, prod; + + VGE_LOCK_ASSERT(sc); ifp = sc->vge_ifp; - idx = sc->vge_ldata.vge_tx_considx; - /* Invalidate the TX descriptor list */ + if (sc->vge_cdata.vge_tx_cnt == 0) + return; - bus_dmamap_sync(sc->vge_ldata.vge_tx_list_tag, - sc->vge_ldata.vge_tx_list_map, - BUS_DMASYNC_POSTREAD); - - while (idx != sc->vge_ldata.vge_tx_prodidx) { - - txstat = le32toh(sc->vge_ldata.vge_tx_list[idx].vge_sts); - if (txstat & VGE_TDSTS_OWN) - break; - - m_freem(sc->vge_ldata.vge_tx_mbuf[idx]); - sc->vge_ldata.vge_tx_mbuf[idx] = NULL; - bus_dmamap_unload(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_tx_dmamap[idx]); - if (txstat & (VGE_TDSTS_EXCESSCOLL|VGE_TDSTS_COLL)) - ifp->if_collisions++; - if (txstat & VGE_TDSTS_TXERR) - ifp->if_oerrors++; - else - ifp->if_opackets++; - - sc->vge_ldata.vge_tx_free++; - VGE_TX_DESC_INC(idx); - } - - /* No changes made to the TX ring, so no flush needed */ - - if (idx != sc->vge_ldata.vge_tx_considx) { - sc->vge_ldata.vge_tx_considx = idx; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - ifp->if_timer = 0; - } + bus_dmamap_sync(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_cdata.vge_tx_ring_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); /* - * If not all descriptors have been released reaped yet, - * reload the timer so that we will eventually get another - * interrupt that will cause us to re-enter this routine. - * This is done in case the transmitter has gone idle. + * Go through our tx list and free mbufs for those + * frames that have been transmitted. */ - if (sc->vge_ldata.vge_tx_free != VGE_TX_DESC_CNT) { - CSR_WRITE_1(sc, VGE_CRS1, VGE_CR1_TIMER0_ENABLE); - } + cons = sc->vge_cdata.vge_tx_considx; + prod = sc->vge_cdata.vge_tx_prodidx; + for (; cons != prod; VGE_TX_DESC_INC(cons)) { + cur_tx = &sc->vge_rdata.vge_tx_ring[cons]; + txstat = le32toh(cur_tx->vge_sts); + if ((txstat & VGE_TDSTS_OWN) != 0) + break; + sc->vge_cdata.vge_tx_cnt--; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - return; + txd = &sc->vge_cdata.vge_txdesc[cons]; + bus_dmamap_sync(sc->vge_cdata.vge_tx_tag, txd->tx_dmamap, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->vge_cdata.vge_tx_tag, txd->tx_dmamap); + + KASSERT(txd->tx_m != NULL, ("%s: freeing NULL mbuf!\n", + __func__)); + m_freem(txd->tx_m); + txd->tx_m = NULL; + txd->tx_desc->vge_frag[0].vge_addrhi = 0; + } + bus_dmamap_sync(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_cdata.vge_tx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + sc->vge_cdata.vge_tx_considx = cons; + if (sc->vge_cdata.vge_tx_cnt == 0) + sc->vge_timer = 0; } static void -vge_tick(xsc) - void *xsc; +vge_link_statchg(void *xsc) { - struct vge_softc *sc; - struct ifnet *ifp; - struct mii_data *mii; + struct vge_softc *sc; + struct ifnet *ifp; + struct mii_data *mii; sc = xsc; ifp = sc->vge_ifp; - VGE_LOCK(sc); + VGE_LOCK_ASSERT(sc); mii = device_get_softc(sc->vge_miibus); - mii_tick(mii); - if (sc->vge_link) { + mii_pollstat(mii); + if ((sc->vge_flags & VGE_FLAG_LINK) != 0) { if (!(mii->mii_media_status & IFM_ACTIVE)) { - sc->vge_link = 0; + sc->vge_flags &= ~VGE_FLAG_LINK; if_link_state_change(sc->vge_ifp, LINK_STATE_DOWN); } } else { if (mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { - sc->vge_link = 1; + sc->vge_flags |= VGE_FLAG_LINK; if_link_state_change(sc->vge_ifp, LINK_STATE_UP); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue(taskqueue_swi, - &sc->vge_txtask); + vge_start_locked(ifp); } } - - VGE_UNLOCK(sc); - - return; } #ifdef DEVICE_POLLING @@ -1592,15 +1687,14 @@ vge_poll (struct ifnet *ifp, enum poll_cmd cmd, int count) if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) goto done; - sc->rxcycles = count; - rx_npkts = vge_rxeof(sc); + rx_npkts = vge_rxeof(sc, count); vge_txeof(sc); if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue(taskqueue_swi, &sc->vge_txtask); + vge_start_locked(ifp); if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */ - u_int32_t status; + uint32_t status; status = CSR_READ_4(sc, VGE_ISR); if (status == 0xFFFFFFFF) goto done; @@ -1612,12 +1706,13 @@ vge_poll (struct ifnet *ifp, enum poll_cmd cmd, int count) */ if (status & VGE_ISR_TXDMA_STALL || - status & VGE_ISR_RXDMA_STALL) - vge_init(sc); + status & VGE_ISR_RXDMA_STALL) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + vge_init_locked(sc); + } if (status & (VGE_ISR_RXOFLOW|VGE_ISR_RXNODESC)) { - vge_rxeof(sc); - ifp->if_ierrors++; + vge_rxeof(sc, count); CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN); CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK); } @@ -1629,23 +1724,18 @@ done: #endif /* DEVICE_POLLING */ static void -vge_intr(arg) - void *arg; +vge_intr(void *arg) { - struct vge_softc *sc; - struct ifnet *ifp; - u_int32_t status; + struct vge_softc *sc; + struct ifnet *ifp; + uint32_t status; sc = arg; - - if (sc->suspended) { - return; - } - VGE_LOCK(sc); - ifp = sc->vge_ifp; - if (!(ifp->if_flags & IFF_UP)) { + ifp = sc->vge_ifp; + if ((sc->vge_flags & VGE_FLAG_SUSPENDED) != 0 || + (ifp->if_flags & IFF_UP) == 0) { VGE_UNLOCK(sc); return; } @@ -1659,189 +1749,223 @@ vge_intr(arg) /* Disable interrupts */ CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_GMSK); - - for (;;) { - - status = CSR_READ_4(sc, VGE_ISR); - /* If the card has gone away the read returns 0xffff. */ - if (status == 0xFFFFFFFF) - break; - - if (status) - CSR_WRITE_4(sc, VGE_ISR, status); - - if ((status & VGE_INTRS) == 0) - break; - + status = CSR_READ_4(sc, VGE_ISR); + CSR_WRITE_4(sc, VGE_ISR, status | VGE_ISR_HOLDOFF_RELOAD); + /* If the card has gone away the read returns 0xffff. */ + if (status == 0xFFFFFFFF || (status & VGE_INTRS) == 0) + goto done; + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { if (status & (VGE_ISR_RXOK|VGE_ISR_RXOK_HIPRIO)) - vge_rxeof(sc); - + vge_rxeof(sc, VGE_RX_DESC_CNT); if (status & (VGE_ISR_RXOFLOW|VGE_ISR_RXNODESC)) { - vge_rxeof(sc); + vge_rxeof(sc, VGE_RX_DESC_CNT); CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN); CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK); } - if (status & (VGE_ISR_TXOK0|VGE_ISR_TIMER0)) + if (status & (VGE_ISR_TXOK0|VGE_ISR_TXOK_HIPRIO)) vge_txeof(sc); - if (status & (VGE_ISR_TXDMA_STALL|VGE_ISR_RXDMA_STALL)) - vge_init(sc); + if (status & (VGE_ISR_TXDMA_STALL|VGE_ISR_RXDMA_STALL)) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + vge_init_locked(sc); + } if (status & VGE_ISR_LINKSTS) - vge_tick(sc); + vge_link_statchg(sc); } +done: + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + /* Re-enable interrupts */ + CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK); - /* Re-enable interrupts */ - CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK); - + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + vge_start_locked(ifp); + } VGE_UNLOCK(sc); - - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue(taskqueue_swi, &sc->vge_txtask); - - return; } static int -vge_encap(sc, m_head, idx) - struct vge_softc *sc; - struct mbuf *m_head; - int idx; +vge_encap(struct vge_softc *sc, struct mbuf **m_head) { - struct mbuf *m_new = NULL; - struct vge_dmaload_arg arg; - bus_dmamap_t map; - int error; + struct vge_txdesc *txd; + struct vge_tx_frag *frag; + struct mbuf *m; + bus_dma_segment_t txsegs[VGE_MAXTXSEGS]; + int error, i, nsegs, padlen; + uint32_t cflags; - if (sc->vge_ldata.vge_tx_free <= 2) - return (EFBIG); + VGE_LOCK_ASSERT(sc); - arg.vge_flags = 0; + M_ASSERTPKTHDR((*m_head)); - if (m_head->m_pkthdr.csum_flags & CSUM_IP) - arg.vge_flags |= VGE_TDCTL_IPCSUM; - if (m_head->m_pkthdr.csum_flags & CSUM_TCP) - arg.vge_flags |= VGE_TDCTL_TCPCSUM; - if (m_head->m_pkthdr.csum_flags & CSUM_UDP) - arg.vge_flags |= VGE_TDCTL_UDPCSUM; - - arg.sc = sc; - arg.vge_idx = idx; - arg.vge_m0 = m_head; - arg.vge_maxsegs = VGE_TX_FRAGS; - - map = sc->vge_ldata.vge_tx_dmamap[idx]; - error = bus_dmamap_load_mbuf(sc->vge_ldata.vge_mtag, map, - m_head, vge_dma_map_tx_desc, &arg, BUS_DMA_NOWAIT); - - if (error && error != EFBIG) { - printf("vge%d: can't map mbuf (error %d)\n", - sc->vge_unit, error); - return (ENOBUFS); - } - - /* Too many segments to map, coalesce into a single mbuf */ - - if (error || arg.vge_maxsegs == 0) { - m_new = m_defrag(m_head, M_DONTWAIT); - if (m_new == NULL) - return (1); - else - m_head = m_new; - - arg.sc = sc; - arg.vge_m0 = m_head; - arg.vge_idx = idx; - arg.vge_maxsegs = 1; - - error = bus_dmamap_load_mbuf(sc->vge_ldata.vge_mtag, map, - m_head, vge_dma_map_tx_desc, &arg, BUS_DMA_NOWAIT); - if (error) { - printf("vge%d: can't map mbuf (error %d)\n", - sc->vge_unit, error); - return (EFBIG); + /* Argh. This chip does not autopad short frames. */ + if ((*m_head)->m_pkthdr.len < VGE_MIN_FRAMELEN) { + m = *m_head; + padlen = VGE_MIN_FRAMELEN - m->m_pkthdr.len; + if (M_WRITABLE(m) == 0) { + /* Get a writable copy. */ + m = m_dup(*m_head, M_DONTWAIT); + m_freem(*m_head); + if (m == NULL) { + *m_head = NULL; + return (ENOBUFS); + } + *m_head = m; } + if (M_TRAILINGSPACE(m) < padlen) { + m = m_defrag(m, M_DONTWAIT); + if (m == NULL) { + m_freem(*m_head); + *m_head = NULL; + return (ENOBUFS); + } + } + /* + * Manually pad short frames, and zero the pad space + * to avoid leaking data. + */ + bzero(mtod(m, char *) + m->m_pkthdr.len, padlen); + m->m_pkthdr.len += padlen; + m->m_len = m->m_pkthdr.len; + *m_head = m; } - sc->vge_ldata.vge_tx_mbuf[idx] = m_head; - sc->vge_ldata.vge_tx_free--; + txd = &sc->vge_cdata.vge_txdesc[sc->vge_cdata.vge_tx_prodidx]; + + error = bus_dmamap_load_mbuf_sg(sc->vge_cdata.vge_tx_tag, + txd->tx_dmamap, *m_head, txsegs, &nsegs, 0); + if (error == EFBIG) { + m = m_collapse(*m_head, M_DONTWAIT, VGE_MAXTXSEGS); + if (m == NULL) { + m_freem(*m_head); + *m_head = NULL; + return (ENOMEM); + } + *m_head = m; + error = bus_dmamap_load_mbuf_sg(sc->vge_cdata.vge_tx_tag, + txd->tx_dmamap, *m_head, txsegs, &nsegs, 0); + if (error != 0) { + m_freem(*m_head); + *m_head = NULL; + return (error); + } + } else if (error != 0) + return (error); + bus_dmamap_sync(sc->vge_cdata.vge_tx_tag, txd->tx_dmamap, + BUS_DMASYNC_PREWRITE); + + m = *m_head; + cflags = 0; + + /* Configure checksum offload. */ + if ((m->m_pkthdr.csum_flags & CSUM_IP) != 0) + cflags |= VGE_TDCTL_IPCSUM; + if ((m->m_pkthdr.csum_flags & CSUM_TCP) != 0) + cflags |= VGE_TDCTL_TCPCSUM; + if ((m->m_pkthdr.csum_flags & CSUM_UDP) != 0) + cflags |= VGE_TDCTL_UDPCSUM; + + /* Configure VLAN. */ + if ((m->m_flags & M_VLANTAG) != 0) + cflags |= m->m_pkthdr.ether_vtag | VGE_TDCTL_VTAG; + txd->tx_desc->vge_sts = htole32(m->m_pkthdr.len << 16); + /* + * XXX + * Velocity family seems to support TSO but no information + * for MSS configuration is available. Also the number of + * fragments supported by a descriptor is too small to hold + * entire 64KB TCP/IP segment. Maybe VGE_TD_LS_MOF, + * VGE_TD_LS_SOF and VGE_TD_LS_EOF could be used to build + * longer chain of buffers but no additional information is + * available. + * + * When telling the chip how many segments there are, we + * must use nsegs + 1 instead of just nsegs. Darned if I + * know why. This also means we can't use the last fragment + * field of Tx descriptor. + */ + txd->tx_desc->vge_ctl = htole32(cflags | ((nsegs + 1) << 28) | + VGE_TD_LS_NORM); + for (i = 0; i < nsegs; i++) { + frag = &txd->tx_desc->vge_frag[i]; + frag->vge_addrlo = htole32(VGE_ADDR_LO(txsegs[i].ds_addr)); + frag->vge_addrhi = htole32(VGE_ADDR_HI(txsegs[i].ds_addr) | + (VGE_BUFLEN(txsegs[i].ds_len) << 16)); + } + + sc->vge_cdata.vge_tx_cnt++; + VGE_TX_DESC_INC(sc->vge_cdata.vge_tx_prodidx); /* - * Set up hardware VLAN tagging. + * Finally request interrupt and give the first descriptor + * ownership to hardware. */ - - if (m_head->m_flags & M_VLANTAG) - sc->vge_ldata.vge_tx_list[idx].vge_ctl |= - htole32(m_head->m_pkthdr.ether_vtag | VGE_TDCTL_VTAG); - - sc->vge_ldata.vge_tx_list[idx].vge_sts |= htole32(VGE_TDSTS_OWN); + txd->tx_desc->vge_ctl |= htole32(VGE_TDCTL_TIC); + txd->tx_desc->vge_sts |= htole32(VGE_TDSTS_OWN); + txd->tx_m = m; return (0); } -static void -vge_tx_task(arg, npending) - void *arg; - int npending; -{ - struct ifnet *ifp; - - ifp = arg; - vge_start(ifp); - - return; -} - /* * Main transmit routine. */ static void -vge_start(ifp) - struct ifnet *ifp; +vge_start(struct ifnet *ifp) { - struct vge_softc *sc; - struct mbuf *m_head = NULL; - int idx, pidx = 0; + struct vge_softc *sc; sc = ifp->if_softc; VGE_LOCK(sc); + vge_start_locked(ifp); + VGE_UNLOCK(sc); +} - if (!sc->vge_link || ifp->if_drv_flags & IFF_DRV_OACTIVE) { - VGE_UNLOCK(sc); + +static void +vge_start_locked(struct ifnet *ifp) +{ + struct vge_softc *sc; + struct vge_txdesc *txd; + struct mbuf *m_head; + int enq, idx; + + sc = ifp->if_softc; + + VGE_LOCK_ASSERT(sc); + + if ((sc->vge_flags & VGE_FLAG_LINK) == 0 || + (ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING) return; - } - if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { - VGE_UNLOCK(sc); - return; - } - - idx = sc->vge_ldata.vge_tx_prodidx; - - pidx = idx - 1; - if (pidx < 0) - pidx = VGE_TX_DESC_CNT - 1; - - - while (sc->vge_ldata.vge_tx_mbuf[idx] == NULL) { + idx = sc->vge_cdata.vge_tx_prodidx; + VGE_TX_DESC_DEC(idx); + for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd) && + sc->vge_cdata.vge_tx_cnt < VGE_TX_DESC_CNT - 1; ) { IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; - - if (vge_encap(sc, m_head, idx)) { + /* + * Pack the data into the transmit ring. If we + * don't have room, set the OACTIVE flag and wait + * for the NIC to drain the ring. + */ + if (vge_encap(sc, &m_head)) { + if (m_head == NULL) + break; IFQ_DRV_PREPEND(&ifp->if_snd, m_head); ifp->if_drv_flags |= IFF_DRV_OACTIVE; break; } - sc->vge_ldata.vge_tx_list[pidx].vge_frag[0].vge_buflen |= - htole16(VGE_TXDESC_Q); - - pidx = idx; + txd = &sc->vge_cdata.vge_txdesc[idx]; + txd->tx_desc->vge_frag[0].vge_addrhi |= htole32(VGE_TXDESC_Q); VGE_TX_DESC_INC(idx); + enq++; /* * If there's a BPF listener, bounce a copy of this frame * to him. @@ -1849,55 +1973,42 @@ vge_start(ifp) ETHER_BPF_MTAP(ifp, m_head); } - if (idx == sc->vge_ldata.vge_tx_prodidx) { - VGE_UNLOCK(sc); - return; + if (enq > 0) { + bus_dmamap_sync(sc->vge_cdata.vge_tx_ring_tag, + sc->vge_cdata.vge_tx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + /* Issue a transmit command. */ + CSR_WRITE_2(sc, VGE_TXQCSRS, VGE_TXQCSR_WAK0); + /* + * Set a timeout in case the chip goes out to lunch. + */ + sc->vge_timer = 5; } - - /* Flush the TX descriptors */ - - bus_dmamap_sync(sc->vge_ldata.vge_tx_list_tag, - sc->vge_ldata.vge_tx_list_map, - BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - - /* Issue a transmit command. */ - CSR_WRITE_2(sc, VGE_TXQCSRS, VGE_TXQCSR_WAK0); - - sc->vge_ldata.vge_tx_prodidx = idx; - - /* - * Use the countdown timer for interrupt moderation. - * 'TX done' interrupts are disabled. Instead, we reset the - * countdown timer, which will begin counting until it hits - * the value in the SSTIMER register, and then trigger an - * interrupt. Each time we set the TIMER0_ENABLE bit, the - * the timer count is reloaded. Only when the transmitter - * is idle will the timer hit 0 and an interrupt fire. - */ - CSR_WRITE_1(sc, VGE_CRS1, VGE_CR1_TIMER0_ENABLE); - - VGE_UNLOCK(sc); - - /* - * Set a timeout in case the chip goes out to lunch. - */ - ifp->if_timer = 5; - - return; } static void -vge_init(xsc) - void *xsc; +vge_init(void *xsc) { - struct vge_softc *sc = xsc; - struct ifnet *ifp = sc->vge_ifp; - struct mii_data *mii; - int i; + struct vge_softc *sc = xsc; VGE_LOCK(sc); + vge_init_locked(sc); + VGE_UNLOCK(sc); +} + +static void +vge_init_locked(struct vge_softc *sc) +{ + struct ifnet *ifp = sc->vge_ifp; + struct mii_data *mii; + int error, i; + + VGE_LOCK_ASSERT(sc); mii = device_get_softc(sc->vge_miibus); + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + return; + /* * Cancel pending I/O and free all RX/TX buffers. */ @@ -1908,9 +2019,14 @@ vge_init(xsc) * Initialize the RX and TX descriptors and mbufs. */ - vge_rx_list_init(sc); + error = vge_rx_list_init(sc); + if (error != 0) { + device_printf(sc->vge_dev, "no memory for Rx buffers.\n"); + return; + } vge_tx_list_init(sc); - + /* Clear MAC statistics. */ + vge_stats_clear(sc); /* Set our station address */ for (i = 0; i < ETHER_ADDR_LEN; i++) CSR_WRITE_1(sc, VGE_PAR0 + i, IF_LLADDR(sc->vge_ifp)[i]); @@ -1920,7 +2036,7 @@ vge_init(xsc) * reception of VLAN tagged frames. */ CSR_CLRBIT_1(sc, VGE_RXCFG, VGE_RXCFG_FIFO_THR|VGE_RXCFG_VTAGOPT); - CSR_SETBIT_1(sc, VGE_RXCFG, VGE_RXFIFOTHR_128BYTES|VGE_VTAG_OPT2); + CSR_SETBIT_1(sc, VGE_RXCFG, VGE_RXFIFOTHR_128BYTES); /* Set DMA burst length */ CSR_CLRBIT_1(sc, VGE_DMACFG0, VGE_DMACFG0_BURSTLEN); @@ -1941,15 +2057,20 @@ vge_init(xsc) * Note that we only use one transmit queue. */ + CSR_WRITE_4(sc, VGE_TXDESC_HIADDR, + VGE_ADDR_HI(sc->vge_rdata.vge_tx_ring_paddr)); CSR_WRITE_4(sc, VGE_TXDESC_ADDR_LO0, - VGE_ADDR_LO(sc->vge_ldata.vge_tx_list_addr)); + VGE_ADDR_LO(sc->vge_rdata.vge_tx_ring_paddr)); CSR_WRITE_2(sc, VGE_TXDESCNUM, VGE_TX_DESC_CNT - 1); CSR_WRITE_4(sc, VGE_RXDESC_ADDR_LO, - VGE_ADDR_LO(sc->vge_ldata.vge_rx_list_addr)); + VGE_ADDR_LO(sc->vge_rdata.vge_rx_ring_paddr)); CSR_WRITE_2(sc, VGE_RXDESCNUM, VGE_RX_DESC_CNT - 1); CSR_WRITE_2(sc, VGE_RXDESC_RESIDUECNT, VGE_RX_DESC_CNT); + /* Configure interrupt moderation. */ + vge_intr_holdoff(sc); + /* Enable and wake up the RX descriptor queue */ CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_RUN); CSR_WRITE_1(sc, VGE_RXQCSRS, VGE_RXQCSR_WAK); @@ -1957,29 +2078,12 @@ vge_init(xsc) /* Enable the TX descriptor queue */ CSR_WRITE_2(sc, VGE_TXQCSRS, VGE_TXQCSR_RUN0); - /* Set up the receive filter -- allow large frames for VLANs. */ - CSR_WRITE_1(sc, VGE_RXCTL, VGE_RXCTL_RX_UCAST|VGE_RXCTL_RX_GIANT); - - /* If we want promiscuous mode, set the allframes bit. */ - if (ifp->if_flags & IFF_PROMISC) { - CSR_SETBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_PROMISC); - } - - /* Set capture broadcast bit to capture broadcast frames. */ - if (ifp->if_flags & IFF_BROADCAST) { - CSR_SETBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_BCAST); - } - - /* Set multicast bit to capture multicast frames. */ - if (ifp->if_flags & IFF_MULTICAST) { - CSR_SETBIT_1(sc, VGE_RXCTL, VGE_RXCTL_RX_MCAST); - } - /* Init the cam filter. */ vge_cam_clear(sc); - /* Init the multicast filter. */ - vge_setmulti(sc); + /* Set up receiver filter. */ + vge_rxfilter(sc); + vge_setvlan(sc); /* Enable flow control */ @@ -1993,42 +2097,6 @@ vge_init(xsc) CSR_WRITE_1(sc, VGE_CRS0, VGE_CR0_TX_ENABLE|VGE_CR0_RX_ENABLE|VGE_CR0_START); - /* - * Configure one-shot timer for microsecond - * resulution and load it for 500 usecs. - */ - CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_TIMER0_RES); - CSR_WRITE_2(sc, VGE_SSTIMER, 400); - - /* - * Configure interrupt moderation for receive. Enable - * the holdoff counter and load it, and set the RX - * suppression count to the number of descriptors we - * want to allow before triggering an interrupt. - * The holdoff timer is in units of 20 usecs. - */ - -#ifdef notyet - CSR_WRITE_1(sc, VGE_INTCTL1, VGE_INTCTL_TXINTSUP_DISABLE); - /* Select the interrupt holdoff timer page. */ - CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL); - CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_INTHLDOFF); - CSR_WRITE_1(sc, VGE_INTHOLDOFF, 10); /* ~200 usecs */ - - /* Enable use of the holdoff timer. */ - CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_HOLDOFF); - CSR_WRITE_1(sc, VGE_INTCTL1, VGE_INTCTL_SC_RELOAD); - - /* Select the RX suppression threshold page. */ - CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL); - CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_RXSUPPTHR); - CSR_WRITE_1(sc, VGE_RXSUPPTHR, 64); /* interrupt after 64 packets */ - - /* Restore the page select bits. */ - CSR_CLRBIT_1(sc, VGE_CAMCTL, VGE_CAMCTL_PAGESEL); - CSR_SETBIT_1(sc, VGE_CAMCTL, VGE_PAGESEL_MAR); -#endif - #ifdef DEVICE_POLLING /* * Disable interrupts if we are polling. @@ -2043,70 +2111,66 @@ vge_init(xsc) * Enable interrupts. */ CSR_WRITE_4(sc, VGE_IMR, VGE_INTRS); - CSR_WRITE_4(sc, VGE_ISR, 0); + CSR_WRITE_4(sc, VGE_ISR, 0xFFFFFFFF); CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK); } + sc->vge_flags &= ~VGE_FLAG_LINK; mii_mediachg(mii); ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - - sc->vge_if_flags = 0; - sc->vge_link = 0; - - VGE_UNLOCK(sc); - - return; + callout_reset(&sc->vge_watchdog, hz, vge_watchdog, sc); } /* * Set media options. */ static int -vge_ifmedia_upd(ifp) - struct ifnet *ifp; +vge_ifmedia_upd(struct ifnet *ifp) { - struct vge_softc *sc; - struct mii_data *mii; + struct vge_softc *sc; + struct mii_data *mii; + int error; sc = ifp->if_softc; VGE_LOCK(sc); mii = device_get_softc(sc->vge_miibus); - mii_mediachg(mii); + error = mii_mediachg(mii); VGE_UNLOCK(sc); - return (0); + return (error); } /* * Report current media status. */ static void -vge_ifmedia_sts(ifp, ifmr) - struct ifnet *ifp; - struct ifmediareq *ifmr; +vge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) { - struct vge_softc *sc; - struct mii_data *mii; + struct vge_softc *sc; + struct mii_data *mii; sc = ifp->if_softc; mii = device_get_softc(sc->vge_miibus); + VGE_LOCK(sc); + if ((ifp->if_flags & IFF_UP) == 0) { + VGE_UNLOCK(sc); + return; + } mii_pollstat(mii); + VGE_UNLOCK(sc); ifmr->ifm_active = mii->mii_media_active; ifmr->ifm_status = mii->mii_media_status; - - return; } static void -vge_miibus_statchg(dev) - device_t dev; +vge_miibus_statchg(device_t dev) { - struct vge_softc *sc; - struct mii_data *mii; - struct ifmedia_entry *ife; + struct vge_softc *sc; + struct mii_data *mii; + struct ifmedia_entry *ife; sc = device_get_softc(dev); mii = device_get_softc(sc->vge_miibus); @@ -2146,52 +2210,50 @@ vge_miibus_statchg(dev) IFM_SUBTYPE(ife->ifm_media)); break; } - - return; } static int -vge_ioctl(ifp, command, data) - struct ifnet *ifp; - u_long command; - caddr_t data; +vge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) { - struct vge_softc *sc = ifp->if_softc; - struct ifreq *ifr = (struct ifreq *) data; - struct mii_data *mii; - int error = 0; + struct vge_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *) data; + struct mii_data *mii; + int error = 0, mask; switch (command) { case SIOCSIFMTU: - if (ifr->ifr_mtu > VGE_JUMBO_MTU) + VGE_LOCK(sc); + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > VGE_JUMBO_MTU) error = EINVAL; - ifp->if_mtu = ifr->ifr_mtu; + else if (ifp->if_mtu != ifr->ifr_mtu) { + if (ifr->ifr_mtu > ETHERMTU && + (sc->vge_flags & VGE_FLAG_JUMBO) == 0) + error = EINVAL; + else + ifp->if_mtu = ifr->ifr_mtu; + } + VGE_UNLOCK(sc); break; case SIOCSIFFLAGS: - if (ifp->if_flags & IFF_UP) { - if (ifp->if_drv_flags & IFF_DRV_RUNNING && - ifp->if_flags & IFF_PROMISC && - !(sc->vge_if_flags & IFF_PROMISC)) { - CSR_SETBIT_1(sc, VGE_RXCTL, - VGE_RXCTL_RX_PROMISC); - vge_setmulti(sc); - } else if (ifp->if_drv_flags & IFF_DRV_RUNNING && - !(ifp->if_flags & IFF_PROMISC) && - sc->vge_if_flags & IFF_PROMISC) { - CSR_CLRBIT_1(sc, VGE_RXCTL, - VGE_RXCTL_RX_PROMISC); - vge_setmulti(sc); - } else - vge_init(sc); - } else { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - vge_stop(sc); - } + VGE_LOCK(sc); + if ((ifp->if_flags & IFF_UP) != 0) { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0 && + ((ifp->if_flags ^ sc->vge_if_flags) & + (IFF_PROMISC | IFF_ALLMULTI)) != 0) + vge_rxfilter(sc); + else + vge_init_locked(sc); + } else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + vge_stop(sc); sc->vge_if_flags = ifp->if_flags; + VGE_UNLOCK(sc); break; case SIOCADDMULTI: case SIOCDELMULTI: - vge_setmulti(sc); + VGE_LOCK(sc); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + vge_rxfilter(sc); + VGE_UNLOCK(sc); break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: @@ -2199,14 +2261,13 @@ vge_ioctl(ifp, command, data) error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command); break; case SIOCSIFCAP: - { - int mask = ifr->ifr_reqcap ^ ifp->if_capenable; + mask = ifr->ifr_reqcap ^ ifp->if_capenable; #ifdef DEVICE_POLLING if (mask & IFCAP_POLLING) { if (ifr->ifr_reqcap & IFCAP_POLLING) { error = ether_poll_register(vge_poll, ifp); if (error) - return(error); + return (error); VGE_LOCK(sc); /* Disable interrupts */ CSR_WRITE_4(sc, VGE_IMR, 0); @@ -2225,6 +2286,7 @@ vge_ioctl(ifp, command, data) } } #endif /* DEVICE_POLLING */ + VGE_LOCK(sc); if ((mask & IFCAP_TXCSUM) != 0 && (ifp->if_capabilities & IFCAP_TXCSUM) != 0) { ifp->if_capenable ^= IFCAP_TXCSUM; @@ -2236,7 +2298,25 @@ vge_ioctl(ifp, command, data) if ((mask & IFCAP_RXCSUM) != 0 && (ifp->if_capabilities & IFCAP_RXCSUM) != 0) ifp->if_capenable ^= IFCAP_RXCSUM; - } + if ((mask & IFCAP_WOL_UCAST) != 0 && + (ifp->if_capabilities & IFCAP_WOL_UCAST) != 0) + ifp->if_capenable ^= IFCAP_WOL_UCAST; + if ((mask & IFCAP_WOL_MCAST) != 0 && + (ifp->if_capabilities & IFCAP_WOL_MCAST) != 0) + ifp->if_capenable ^= IFCAP_WOL_MCAST; + if ((mask & IFCAP_WOL_MAGIC) != 0 && + (ifp->if_capabilities & IFCAP_WOL_MAGIC) != 0) + ifp->if_capenable ^= IFCAP_WOL_MAGIC; + if ((mask & IFCAP_VLAN_HWCSUM) != 0 && + (ifp->if_capabilities & IFCAP_VLAN_HWCSUM) != 0) + ifp->if_capenable ^= IFCAP_VLAN_HWCSUM; + if ((mask & IFCAP_VLAN_HWTAGGING) != 0 && + (IFCAP_VLAN_HWTAGGING & ifp->if_capabilities) != 0) { + ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; + vge_setvlan(sc); + } + VGE_UNLOCK(sc); + VLAN_CAPABILITIES(ifp); break; default: error = ether_ioctl(ifp, command, data); @@ -2247,24 +2327,27 @@ vge_ioctl(ifp, command, data) } static void -vge_watchdog(ifp) - struct ifnet *ifp; +vge_watchdog(void *arg) { - struct vge_softc *sc; + struct vge_softc *sc; + struct ifnet *ifp; - sc = ifp->if_softc; - VGE_LOCK(sc); - printf("vge%d: watchdog timeout\n", sc->vge_unit); + sc = arg; + VGE_LOCK_ASSERT(sc); + vge_stats_update(sc); + callout_reset(&sc->vge_watchdog, hz, vge_watchdog, sc); + if (sc->vge_timer == 0 || --sc->vge_timer > 0) + return; + + ifp = sc->vge_ifp; + if_printf(ifp, "watchdog timeout\n"); ifp->if_oerrors++; vge_txeof(sc); - vge_rxeof(sc); + vge_rxeof(sc, VGE_RX_DESC_CNT); - vge_init(sc); - - VGE_UNLOCK(sc); - - return; + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + vge_init_locked(sc); } /* @@ -2272,15 +2355,14 @@ vge_watchdog(ifp) * RX and TX lists. */ static void -vge_stop(sc) - struct vge_softc *sc; +vge_stop(struct vge_softc *sc) { - register int i; - struct ifnet *ifp; + struct ifnet *ifp; - VGE_LOCK(sc); + VGE_LOCK_ASSERT(sc); ifp = sc->vge_ifp; - ifp->if_timer = 0; + sc->vge_timer = 0; + callout_stop(&sc->vge_watchdog); ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); @@ -2291,36 +2373,10 @@ vge_stop(sc) CSR_WRITE_1(sc, VGE_RXQCSRC, 0xFF); CSR_WRITE_4(sc, VGE_RXDESC_ADDR_LO, 0); - if (sc->vge_head != NULL) { - m_freem(sc->vge_head); - sc->vge_head = sc->vge_tail = NULL; - } - - /* Free the TX list buffers. */ - - for (i = 0; i < VGE_TX_DESC_CNT; i++) { - if (sc->vge_ldata.vge_tx_mbuf[i] != NULL) { - bus_dmamap_unload(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_tx_dmamap[i]); - m_freem(sc->vge_ldata.vge_tx_mbuf[i]); - sc->vge_ldata.vge_tx_mbuf[i] = NULL; - } - } - - /* Free the RX list buffers. */ - - for (i = 0; i < VGE_RX_DESC_CNT; i++) { - if (sc->vge_ldata.vge_rx_mbuf[i] != NULL) { - bus_dmamap_unload(sc->vge_ldata.vge_mtag, - sc->vge_ldata.vge_rx_dmamap[i]); - m_freem(sc->vge_ldata.vge_rx_mbuf[i]); - sc->vge_ldata.vge_rx_mbuf[i] = NULL; - } - } - - VGE_UNLOCK(sc); - - return; + vge_stats_update(sc); + VGE_CHAIN_RESET(sc); + vge_txeof(sc); + vge_freebufs(sc); } /* @@ -2329,16 +2385,17 @@ vge_stop(sc) * resume. */ static int -vge_suspend(dev) - device_t dev; +vge_suspend(device_t dev) { - struct vge_softc *sc; + struct vge_softc *sc; sc = device_get_softc(dev); + VGE_LOCK(sc); vge_stop(sc); - - sc->suspended = 1; + vge_setwol(sc); + sc->vge_flags |= VGE_FLAG_SUSPENDED; + VGE_UNLOCK(sc); return (0); } @@ -2349,24 +2406,35 @@ vge_suspend(dev) * appropriate. */ static int -vge_resume(dev) - device_t dev; +vge_resume(device_t dev) { - struct vge_softc *sc; - struct ifnet *ifp; + struct vge_softc *sc; + struct ifnet *ifp; + uint16_t pmstat; sc = device_get_softc(dev); + VGE_LOCK(sc); + if ((sc->vge_flags & VGE_FLAG_PMCAP) != 0) { + /* Disable PME and clear PME status. */ + pmstat = pci_read_config(sc->vge_dev, + sc->vge_pmcap + PCIR_POWER_STATUS, 2); + if ((pmstat & PCIM_PSTAT_PMEENABLE) != 0) { + pmstat &= ~PCIM_PSTAT_PMEENABLE; + pci_write_config(sc->vge_dev, + sc->vge_pmcap + PCIR_POWER_STATUS, pmstat, 2); + } + } + vge_clrwol(sc); + /* Restart MII auto-polling. */ + vge_miipoll_start(sc); ifp = sc->vge_ifp; - - /* reenable busmastering */ - pci_enable_busmaster(dev); - pci_enable_io(dev, SYS_RES_MEMORY); - - /* reinitialize interface if necessary */ - if (ifp->if_flags & IFF_UP) - vge_init(sc); - - sc->suspended = 0; + /* Reinitialize interface if necessary. */ + if ((ifp->if_flags & IFF_UP) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + vge_init_locked(sc); + } + sc->vge_flags &= ~VGE_FLAG_SUSPENDED; + VGE_UNLOCK(sc); return (0); } @@ -2376,14 +2444,444 @@ vge_resume(dev) * get confused by errant DMAs when rebooting. */ static int -vge_shutdown(dev) - device_t dev; +vge_shutdown(device_t dev) { - struct vge_softc *sc; - sc = device_get_softc(dev); - - vge_stop(sc); - - return (0); + return (vge_suspend(dev)); +} + +#define VGE_SYSCTL_STAT_ADD32(c, h, n, p, d) \ + SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d) + +static void +vge_sysctl_node(struct vge_softc *sc) +{ + struct sysctl_ctx_list *ctx; + struct sysctl_oid_list *child, *parent; + struct sysctl_oid *tree; + struct vge_hw_stats *stats; + + stats = &sc->vge_stats; + ctx = device_get_sysctl_ctx(sc->vge_dev); + child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->vge_dev)); + + SYSCTL_ADD_INT(ctx, child, OID_AUTO, "int_holdoff", + CTLFLAG_RW, &sc->vge_int_holdoff, 0, "interrupt holdoff"); + SYSCTL_ADD_INT(ctx, child, OID_AUTO, "rx_coal_pkt", + CTLFLAG_RW, &sc->vge_rx_coal_pkt, 0, "rx coalescing packet"); + SYSCTL_ADD_INT(ctx, child, OID_AUTO, "tx_coal_pkt", + CTLFLAG_RW, &sc->vge_tx_coal_pkt, 0, "tx coalescing packet"); + + /* Pull in device tunables. */ + sc->vge_int_holdoff = VGE_INT_HOLDOFF_DEFAULT; + resource_int_value(device_get_name(sc->vge_dev), + device_get_unit(sc->vge_dev), "int_holdoff", &sc->vge_int_holdoff); + sc->vge_rx_coal_pkt = VGE_RX_COAL_PKT_DEFAULT; + resource_int_value(device_get_name(sc->vge_dev), + device_get_unit(sc->vge_dev), "rx_coal_pkt", &sc->vge_rx_coal_pkt); + sc->vge_tx_coal_pkt = VGE_TX_COAL_PKT_DEFAULT; + resource_int_value(device_get_name(sc->vge_dev), + device_get_unit(sc->vge_dev), "tx_coal_pkt", &sc->vge_tx_coal_pkt); + + tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD, + NULL, "VGE statistics"); + parent = SYSCTL_CHILDREN(tree); + + /* Rx statistics. */ + tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "rx", CTLFLAG_RD, + NULL, "RX MAC statistics"); + child = SYSCTL_CHILDREN(tree); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames", + &stats->rx_frames, "frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "good_frames", + &stats->rx_good_frames, "Good frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "fifo_oflows", + &stats->rx_fifo_oflows, "FIFO overflows"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "runts", + &stats->rx_runts, "Too short frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "runts_errs", + &stats->rx_runts_errs, "Too short frames with errors"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_64", + &stats->rx_pkts_64, "64 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_65_127", + &stats->rx_pkts_65_127, "65 to 127 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_128_255", + &stats->rx_pkts_128_255, "128 to 255 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_256_511", + &stats->rx_pkts_256_511, "256 to 511 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_512_1023", + &stats->rx_pkts_512_1023, "512 to 1023 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_1024_1518", + &stats->rx_pkts_1024_1518, "1024 to 1518 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_1519_max", + &stats->rx_pkts_1519_max, "1519 to max frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_1519_max_errs", + &stats->rx_pkts_1519_max_errs, "1519 to max frames with error"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_jumbo", + &stats->rx_jumbos, "Jumbo frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "crcerrs", + &stats->rx_crcerrs, "CRC errors"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "pause_frames", + &stats->rx_pause_frames, "CRC errors"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "align_errs", + &stats->rx_alignerrs, "Alignment errors"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "nobufs", + &stats->rx_nobufs, "Frames with no buffer event"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "sym_errs", + &stats->rx_symerrs, "Frames with symbol errors"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "len_errs", + &stats->rx_lenerrs, "Frames with length mismatched"); + + /* Tx statistics. */ + tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD, + NULL, "TX MAC statistics"); + child = SYSCTL_CHILDREN(tree); + VGE_SYSCTL_STAT_ADD32(ctx, child, "good_frames", + &stats->tx_good_frames, "Good frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_64", + &stats->tx_pkts_64, "64 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_65_127", + &stats->tx_pkts_65_127, "65 to 127 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_128_255", + &stats->tx_pkts_128_255, "128 to 255 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_256_511", + &stats->tx_pkts_256_511, "256 to 511 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_512_1023", + &stats->tx_pkts_512_1023, "512 to 1023 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_1024_1518", + &stats->tx_pkts_1024_1518, "1024 to 1518 bytes frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "frames_jumbo", + &stats->tx_jumbos, "Jumbo frames"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "colls", + &stats->tx_colls, "Collisions"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "late_colls", + &stats->tx_latecolls, "Late collisions"); + VGE_SYSCTL_STAT_ADD32(ctx, child, "pause_frames", + &stats->tx_pause, "Pause frames"); +#ifdef VGE_ENABLE_SQEERR + VGE_SYSCTL_STAT_ADD32(ctx, child, "sqeerrs", + &stats->tx_sqeerrs, "SQE errors"); +#endif + /* Clear MAC statistics. */ + vge_stats_clear(sc); +} + +#undef VGE_SYSCTL_STAT_ADD32 + +static void +vge_stats_clear(struct vge_softc *sc) +{ + int i; + + CSR_WRITE_1(sc, VGE_MIBCSR, + CSR_READ_1(sc, VGE_MIBCSR) | VGE_MIBCSR_FREEZE); + CSR_WRITE_1(sc, VGE_MIBCSR, + CSR_READ_1(sc, VGE_MIBCSR) | VGE_MIBCSR_CLR); + for (i = VGE_TIMEOUT; i > 0; i--) { + DELAY(1); + if ((CSR_READ_1(sc, VGE_MIBCSR) & VGE_MIBCSR_CLR) == 0) + break; + } + if (i == 0) + device_printf(sc->vge_dev, "MIB clear timed out!\n"); + CSR_WRITE_1(sc, VGE_MIBCSR, CSR_READ_1(sc, VGE_MIBCSR) & + ~VGE_MIBCSR_FREEZE); +} + +static void +vge_stats_update(struct vge_softc *sc) +{ + struct vge_hw_stats *stats; + struct ifnet *ifp; + uint32_t mib[VGE_MIB_CNT], val; + int i; + + VGE_LOCK_ASSERT(sc); + + stats = &sc->vge_stats; + ifp = sc->vge_ifp; + + CSR_WRITE_1(sc, VGE_MIBCSR, + CSR_READ_1(sc, VGE_MIBCSR) | VGE_MIBCSR_FLUSH); + for (i = VGE_TIMEOUT; i > 0; i--) { + DELAY(1); + if ((CSR_READ_1(sc, VGE_MIBCSR) & VGE_MIBCSR_FLUSH) == 0) + break; + } + if (i == 0) { + device_printf(sc->vge_dev, "MIB counter dump timed out!\n"); + vge_stats_clear(sc); + return; + } + + bzero(mib, sizeof(mib)); +reset_idx: + /* Set MIB read index to 0. */ + CSR_WRITE_1(sc, VGE_MIBCSR, + CSR_READ_1(sc, VGE_MIBCSR) | VGE_MIBCSR_RINI); + for (i = 0; i < VGE_MIB_CNT; i++) { + val = CSR_READ_4(sc, VGE_MIBDATA); + if (i != VGE_MIB_DATA_IDX(val)) { + /* Reading interrupted. */ + goto reset_idx; + } + mib[i] = val & VGE_MIB_DATA_MASK; + } + + /* Rx stats. */ + stats->rx_frames += mib[VGE_MIB_RX_FRAMES]; + stats->rx_good_frames += mib[VGE_MIB_RX_GOOD_FRAMES]; + stats->rx_fifo_oflows += mib[VGE_MIB_RX_FIFO_OVERRUNS]; + stats->rx_runts += mib[VGE_MIB_RX_RUNTS]; + stats->rx_runts_errs += mib[VGE_MIB_RX_RUNTS_ERRS]; + stats->rx_pkts_64 += mib[VGE_MIB_RX_PKTS_64]; + stats->rx_pkts_65_127 += mib[VGE_MIB_RX_PKTS_65_127]; + stats->rx_pkts_128_255 += mib[VGE_MIB_RX_PKTS_128_255]; + stats->rx_pkts_256_511 += mib[VGE_MIB_RX_PKTS_256_511]; + stats->rx_pkts_512_1023 += mib[VGE_MIB_RX_PKTS_512_1023]; + stats->rx_pkts_1024_1518 += mib[VGE_MIB_RX_PKTS_1024_1518]; + stats->rx_pkts_1519_max += mib[VGE_MIB_RX_PKTS_1519_MAX]; + stats->rx_pkts_1519_max_errs += mib[VGE_MIB_RX_PKTS_1519_MAX_ERRS]; + stats->rx_jumbos += mib[VGE_MIB_RX_JUMBOS]; + stats->rx_crcerrs += mib[VGE_MIB_RX_CRCERRS]; + stats->rx_pause_frames += mib[VGE_MIB_RX_PAUSE]; + stats->rx_alignerrs += mib[VGE_MIB_RX_ALIGNERRS]; + stats->rx_nobufs += mib[VGE_MIB_RX_NOBUFS]; + stats->rx_symerrs += mib[VGE_MIB_RX_SYMERRS]; + stats->rx_lenerrs += mib[VGE_MIB_RX_LENERRS]; + + /* Tx stats. */ + stats->tx_good_frames += mib[VGE_MIB_TX_GOOD_FRAMES]; + stats->tx_pkts_64 += mib[VGE_MIB_TX_PKTS_64]; + stats->tx_pkts_65_127 += mib[VGE_MIB_TX_PKTS_65_127]; + stats->tx_pkts_128_255 += mib[VGE_MIB_TX_PKTS_128_255]; + stats->tx_pkts_256_511 += mib[VGE_MIB_TX_PKTS_256_511]; + stats->tx_pkts_512_1023 += mib[VGE_MIB_TX_PKTS_512_1023]; + stats->tx_pkts_1024_1518 += mib[VGE_MIB_TX_PKTS_1024_1518]; + stats->tx_jumbos += mib[VGE_MIB_TX_JUMBOS]; + stats->tx_colls += mib[VGE_MIB_TX_COLLS]; + stats->tx_pause += mib[VGE_MIB_TX_PAUSE]; +#ifdef VGE_ENABLE_SQEERR + stats->tx_sqeerrs += mib[VGE_MIB_TX_SQEERRS]; +#endif + stats->tx_latecolls += mib[VGE_MIB_TX_LATECOLLS]; + + /* Update counters in ifnet. */ + ifp->if_opackets += mib[VGE_MIB_TX_GOOD_FRAMES]; + + ifp->if_collisions += mib[VGE_MIB_TX_COLLS] + + mib[VGE_MIB_TX_LATECOLLS]; + + ifp->if_oerrors += mib[VGE_MIB_TX_COLLS] + + mib[VGE_MIB_TX_LATECOLLS]; + + ifp->if_ipackets += mib[VGE_MIB_RX_GOOD_FRAMES]; + + ifp->if_ierrors += mib[VGE_MIB_RX_FIFO_OVERRUNS] + + mib[VGE_MIB_RX_RUNTS] + + mib[VGE_MIB_RX_RUNTS_ERRS] + + mib[VGE_MIB_RX_CRCERRS] + + mib[VGE_MIB_RX_ALIGNERRS] + + mib[VGE_MIB_RX_NOBUFS] + + mib[VGE_MIB_RX_SYMERRS] + + mib[VGE_MIB_RX_LENERRS]; +} + +static void +vge_intr_holdoff(struct vge_softc *sc) +{ + uint8_t intctl; + + VGE_LOCK_ASSERT(sc); + + /* + * Set Tx interrupt supression threshold. + * It's possible to use single-shot timer in VGE_CRS1 register + * in Tx path such that driver can remove most of Tx completion + * interrupts. However this requires additional access to + * VGE_CRS1 register to reload the timer in addintion to + * activating Tx kick command. Another downside is we don't know + * what single-shot timer value should be used in advance so + * reclaiming transmitted mbufs could be delayed a lot which in + * turn slows down Tx operation. + */ + CSR_WRITE_1(sc, VGE_CAMCTL, VGE_PAGESEL_TXSUPPTHR); + CSR_WRITE_1(sc, VGE_TXSUPPTHR, sc->vge_tx_coal_pkt); + + /* Set Rx interrupt suppresion threshold. */ + CSR_WRITE_1(sc, VGE_CAMCTL, VGE_PAGESEL_RXSUPPTHR); + CSR_WRITE_1(sc, VGE_RXSUPPTHR, sc->vge_rx_coal_pkt); + + intctl = CSR_READ_1(sc, VGE_INTCTL1); + intctl &= ~VGE_INTCTL_SC_RELOAD; + intctl |= VGE_INTCTL_HC_RELOAD; + if (sc->vge_tx_coal_pkt <= 0) + intctl |= VGE_INTCTL_TXINTSUP_DISABLE; + else + intctl &= ~VGE_INTCTL_TXINTSUP_DISABLE; + if (sc->vge_rx_coal_pkt <= 0) + intctl |= VGE_INTCTL_RXINTSUP_DISABLE; + else + intctl &= ~VGE_INTCTL_RXINTSUP_DISABLE; + CSR_WRITE_1(sc, VGE_INTCTL1, intctl); + CSR_WRITE_1(sc, VGE_CRC3, VGE_CR3_INT_HOLDOFF); + if (sc->vge_int_holdoff > 0) { + /* Set interrupt holdoff timer. */ + CSR_WRITE_1(sc, VGE_CAMCTL, VGE_PAGESEL_INTHLDOFF); + CSR_WRITE_1(sc, VGE_INTHOLDOFF, + VGE_INT_HOLDOFF_USEC(sc->vge_int_holdoff)); + /* Enable holdoff timer. */ + CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_HOLDOFF); + } +} + +static void +vge_setlinkspeed(struct vge_softc *sc) +{ + struct mii_data *mii; + int aneg, i; + + VGE_LOCK_ASSERT(sc); + + mii = device_get_softc(sc->vge_miibus); + mii_pollstat(mii); + aneg = 0; + if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == + (IFM_ACTIVE | IFM_AVALID)) { + switch IFM_SUBTYPE(mii->mii_media_active) { + case IFM_10_T: + case IFM_100_TX: + return; + case IFM_1000_T: + aneg++; + default: + break; + } + } + vge_miibus_writereg(sc->vge_dev, sc->vge_phyaddr, MII_100T2CR, 0); + vge_miibus_writereg(sc->vge_dev, sc->vge_phyaddr, MII_ANAR, + ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10 | ANAR_CSMA); + vge_miibus_writereg(sc->vge_dev, sc->vge_phyaddr, MII_BMCR, + BMCR_AUTOEN | BMCR_STARTNEG); + DELAY(1000); + if (aneg != 0) { + /* Poll link state until vge(4) get a 10/100 link. */ + for (i = 0; i < MII_ANEGTICKS_GIGE; i++) { + mii_pollstat(mii); + if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) + == (IFM_ACTIVE | IFM_AVALID)) { + switch (IFM_SUBTYPE(mii->mii_media_active)) { + case IFM_10_T: + case IFM_100_TX: + return; + default: + break; + } + } + VGE_UNLOCK(sc); + pause("vgelnk", hz); + VGE_LOCK(sc); + } + if (i == MII_ANEGTICKS_GIGE) + device_printf(sc->vge_dev, "establishing link failed, " + "WOL may not work!"); + } + /* + * No link, force MAC to have 100Mbps, full-duplex link. + * This is the last resort and may/may not work. + */ + mii->mii_media_status = IFM_AVALID | IFM_ACTIVE; + mii->mii_media_active = IFM_ETHER | IFM_100_TX | IFM_FDX; +} + +static void +vge_setwol(struct vge_softc *sc) +{ + struct ifnet *ifp; + uint16_t pmstat; + uint8_t val; + + VGE_LOCK_ASSERT(sc); + + if ((sc->vge_flags & VGE_FLAG_PMCAP) == 0) { + /* No PME capability, PHY power down. */ + vge_miibus_writereg(sc->vge_dev, sc->vge_phyaddr, MII_BMCR, + BMCR_PDOWN); + vge_miipoll_stop(sc); + return; + } + + ifp = sc->vge_ifp; + + /* Clear WOL on pattern match. */ + CSR_WRITE_1(sc, VGE_WOLCR0C, VGE_WOLCR0_PATTERN_ALL); + /* Disable WOL on magic/unicast packet. */ + CSR_WRITE_1(sc, VGE_WOLCR1C, 0x0F); + CSR_WRITE_1(sc, VGE_WOLCFGC, VGE_WOLCFG_SAB | VGE_WOLCFG_SAM | + VGE_WOLCFG_PMEOVR); + if ((ifp->if_capenable & IFCAP_WOL) != 0) { + vge_setlinkspeed(sc); + val = 0; + if ((ifp->if_capenable & IFCAP_WOL_UCAST) != 0) + val |= VGE_WOLCR1_UCAST; + if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0) + val |= VGE_WOLCR1_MAGIC; + CSR_WRITE_1(sc, VGE_WOLCR1S, val); + val = 0; + if ((ifp->if_capenable & IFCAP_WOL_MCAST) != 0) + val |= VGE_WOLCFG_SAM | VGE_WOLCFG_SAB; + CSR_WRITE_1(sc, VGE_WOLCFGS, val | VGE_WOLCFG_PMEOVR); + /* Disable MII auto-polling. */ + vge_miipoll_stop(sc); + } + CSR_SETBIT_1(sc, VGE_DIAGCTL, + VGE_DIAGCTL_MACFORCE | VGE_DIAGCTL_FDXFORCE); + CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_GMII); + + /* Clear WOL status on pattern match. */ + CSR_WRITE_1(sc, VGE_WOLSR0C, 0xFF); + CSR_WRITE_1(sc, VGE_WOLSR1C, 0xFF); + + val = CSR_READ_1(sc, VGE_PWRSTAT); + val |= VGE_STICKHW_SWPTAG; + CSR_WRITE_1(sc, VGE_PWRSTAT, val); + /* Put hardware into sleep. */ + val = CSR_READ_1(sc, VGE_PWRSTAT); + val |= VGE_STICKHW_DS0 | VGE_STICKHW_DS1; + CSR_WRITE_1(sc, VGE_PWRSTAT, val); + /* Request PME if WOL is requested. */ + pmstat = pci_read_config(sc->vge_dev, sc->vge_pmcap + + PCIR_POWER_STATUS, 2); + pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE); + if ((ifp->if_capenable & IFCAP_WOL) != 0) + pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE; + pci_write_config(sc->vge_dev, sc->vge_pmcap + PCIR_POWER_STATUS, + pmstat, 2); +} + +static void +vge_clrwol(struct vge_softc *sc) +{ + uint8_t val; + + val = CSR_READ_1(sc, VGE_PWRSTAT); + val &= ~VGE_STICKHW_SWPTAG; + CSR_WRITE_1(sc, VGE_PWRSTAT, val); + /* Disable WOL and clear power state indicator. */ + val = CSR_READ_1(sc, VGE_PWRSTAT); + val &= ~(VGE_STICKHW_DS0 | VGE_STICKHW_DS1); + CSR_WRITE_1(sc, VGE_PWRSTAT, val); + + CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_GMII); + CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_MACFORCE); + + /* Clear WOL on pattern match. */ + CSR_WRITE_1(sc, VGE_WOLCR0C, VGE_WOLCR0_PATTERN_ALL); + /* Disable WOL on magic/unicast packet. */ + CSR_WRITE_1(sc, VGE_WOLCR1C, 0x0F); + CSR_WRITE_1(sc, VGE_WOLCFGC, VGE_WOLCFG_SAB | VGE_WOLCFG_SAM | + VGE_WOLCFG_PMEOVR); + /* Clear WOL status on pattern match. */ + CSR_WRITE_1(sc, VGE_WOLSR0C, 0xFF); + CSR_WRITE_1(sc, VGE_WOLSR1C, 0xFF); } diff --git a/sys/dev/vge/if_vgereg.h b/sys/dev/vge/if_vgereg.h index 8d11a9c3e1f6..77cd61eb6baf 100644 --- a/sys/dev/vge/if_vgereg.h +++ b/sys/dev/vge/if_vgereg.h @@ -89,8 +89,8 @@ #define VGE_RXQCSRC 0x36 /* RX queue ctl/status clear */ #define VGE_RXDESC_ADDR_LO 0x38 /* RX desc base addr (lo 32 bits) */ #define VGE_RXDESC_CONSIDX 0x3C /* Current RX descriptor index */ -#define VGE_RXQTIMER 0x3E /* RX queue timer pend register */ -#define VGE_TXQTIMER 0x3F /* TX queue timer pend register */ +#define VGE_TXQTIMER 0x3E /* TX queue timer pend register */ +#define VGE_RXQTIMER 0x3F /* RX queue timer pend register */ #define VGE_TXDESC_ADDR_LO0 0x40 /* TX desc0 base addr (lo 32 bits) */ #define VGE_TXDESC_ADDR_LO1 0x44 /* TX desc1 base addr (lo 32 bits) */ #define VGE_TXDESC_ADDR_LO2 0x48 /* TX desc2 base addr (lo 32 bits) */ @@ -300,8 +300,7 @@ #define VGE_INTRS (VGE_ISR_TXOK0|VGE_ISR_RXOK|VGE_ISR_STOPPED| \ VGE_ISR_RXOFLOW|VGE_ISR_PHYINT| \ VGE_ISR_LINKSTS|VGE_ISR_RXNODESC| \ - VGE_ISR_RXDMA_STALL|VGE_ISR_TXDMA_STALL| \ - VGE_ISR_MIBOFLOW|VGE_ISR_TIMER0) + VGE_ISR_RXDMA_STALL|VGE_ISR_TXDMA_STALL) /* Interrupt mask register */ @@ -339,19 +338,19 @@ #define VGE_TXQCSR_RUN0 0x0001 /* Enable TX queue 0 */ #define VGE_TXQCSR_ACT0 0x0002 /* queue 0 active indicator */ #define VGE_TXQCSR_WAK0 0x0004 /* Wake up (poll) queue 0 */ -#define VGE_TXQCST_DEAD0 0x0008 /* queue 0 dead indicator */ +#define VGE_TXQCSR_DEAD0 0x0008 /* queue 0 dead indicator */ #define VGE_TXQCSR_RUN1 0x0010 /* Enable TX queue 1 */ #define VGE_TXQCSR_ACT1 0x0020 /* queue 1 active indicator */ #define VGE_TXQCSR_WAK1 0x0040 /* Wake up (poll) queue 1 */ -#define VGE_TXQCST_DEAD1 0x0080 /* queue 1 dead indicator */ +#define VGE_TXQCSR_DEAD1 0x0080 /* queue 1 dead indicator */ #define VGE_TXQCSR_RUN2 0x0100 /* Enable TX queue 2 */ #define VGE_TXQCSR_ACT2 0x0200 /* queue 2 active indicator */ #define VGE_TXQCSR_WAK2 0x0400 /* Wake up (poll) queue 2 */ -#define VGE_TXQCST_DEAD2 0x0800 /* queue 2 dead indicator */ +#define VGE_TXQCSR_DEAD2 0x0800 /* queue 2 dead indicator */ #define VGE_TXQCSR_RUN3 0x1000 /* Enable TX queue 3 */ #define VGE_TXQCSR_ACT3 0x2000 /* queue 3 active indicator */ #define VGE_TXQCSR_WAK3 0x4000 /* Wake up (poll) queue 3 */ -#define VGE_TXQCST_DEAD3 0x8000 /* queue 3 dead indicator */ +#define VGE_TXQCSR_DEAD3 0x8000 /* queue 3 dead indicator */ /* RX descriptor queue control/status register */ @@ -543,6 +542,90 @@ #define VGE_TXBLOCK_128PKTS 0x08 #define VGE_TXBLOCK_8PKTS 0x0C +/* MIB control/status register */ +#define VGE_MIBCSR_CLR 0x01 +#define VGE_MIBCSR_RINI 0x02 +#define VGE_MIBCSR_FLUSH 0x04 +#define VGE_MIBCSR_FREEZE 0x08 +#define VGE_MIBCSR_HI_80 0x00 +#define VGE_MIBCSR_HI_C0 0x10 +#define VGE_MIBCSR_BISTGO 0x40 +#define VGE_MIBCSR_BISTOK 0x80 + +/* MIB data index. */ +#define VGE_MIB_RX_FRAMES 0 +#define VGE_MIB_RX_GOOD_FRAMES 1 +#define VGE_MIB_TX_GOOD_FRAMES 2 +#define VGE_MIB_RX_FIFO_OVERRUNS 3 +#define VGE_MIB_RX_RUNTS 4 +#define VGE_MIB_RX_RUNTS_ERRS 5 +#define VGE_MIB_RX_PKTS_64 6 +#define VGE_MIB_TX_PKTS_64 7 +#define VGE_MIB_RX_PKTS_65_127 8 +#define VGE_MIB_TX_PKTS_65_127 9 +#define VGE_MIB_RX_PKTS_128_255 10 +#define VGE_MIB_TX_PKTS_128_255 11 +#define VGE_MIB_RX_PKTS_256_511 12 +#define VGE_MIB_TX_PKTS_256_511 13 +#define VGE_MIB_RX_PKTS_512_1023 14 +#define VGE_MIB_TX_PKTS_512_1023 15 +#define VGE_MIB_RX_PKTS_1024_1518 16 +#define VGE_MIB_TX_PKTS_1024_1518 17 +#define VGE_MIB_TX_COLLS 18 +#define VGE_MIB_RX_CRCERRS 19 +#define VGE_MIB_RX_JUMBOS 20 +#define VGE_MIB_TX_JUMBOS 21 +#define VGE_MIB_RX_PAUSE 22 +#define VGE_MIB_TX_PAUSE 23 +#define VGE_MIB_RX_ALIGNERRS 24 +#define VGE_MIB_RX_PKTS_1519_MAX 25 +#define VGE_MIB_RX_PKTS_1519_MAX_ERRS 26 +#define VGE_MIB_TX_SQEERRS 27 +#define VGE_MIB_RX_NOBUFS 28 +#define VGE_MIB_RX_SYMERRS 29 +#define VGE_MIB_RX_LENERRS 30 +#define VGE_MIB_TX_LATECOLLS 31 + +#define VGE_MIB_CNT (VGE_MIB_TX_LATECOLLS - VGE_MIB_RX_FRAMES + 1) +#define VGE_MIB_DATA_MASK 0x00FFFFFF +#define VGE_MIB_DATA_IDX(x) ((x) >> 24) + +/* Sticky bit shadow register */ + +#define VGE_STICKHW_DS0 0x01 +#define VGE_STICKHW_DS1 0x02 +#define VGE_STICKHW_WOL_ENB 0x04 +#define VGE_STICKHW_WOL_STS 0x08 +#define VGE_STICKHW_SWPTAG 0x10 + +/* WOL pattern control */ +#define VGE_WOLCR0_PATTERN0 0x01 +#define VGE_WOLCR0_PATTERN1 0x02 +#define VGE_WOLCR0_PATTERN2 0x04 +#define VGE_WOLCR0_PATTERN3 0x08 +#define VGE_WOLCR0_PATTERN4 0x10 +#define VGE_WOLCR0_PATTERN5 0x20 +#define VGE_WOLCR0_PATTERN6 0x40 +#define VGE_WOLCR0_PATTERN7 0x80 +#define VGE_WOLCR0_PATTERN_ALL 0xFF + +/* WOL event control */ +#define VGE_WOLCR1_UCAST 0x01 +#define VGE_WOLCR1_MAGIC 0x02 +#define VGE_WOLCR1_LINKON 0x04 +#define VGE_WOLCR1_LINKOFF 0x08 + +/* Poweer management config */ +#define VGE_PWRCFG_LEGACY_WOLEN 0x01 +#define VGE_PWRCFG_WOL_PULSE 0x20 +#define VGE_PWRCFG_WOL_BUTTON 0x00 + +/* WOL config register */ +#define VGE_WOLCFG_PHYINT_ENB 0x01 +#define VGE_WOLCFG_SAB 0x10 +#define VGE_WOLCFG_SAM 0x20 +#define VGE_WOLCFG_PMEOVR 0x80 + /* EEPROM control/status register */ #define VGE_EECSR_EDO 0x01 /* data out pin */ @@ -587,8 +670,7 @@ struct vge_tx_frag { uint32_t vge_addrlo; - uint16_t vge_addrhi; - uint16_t vge_buflen; + uint32_t vge_addrhi; }; /* @@ -600,7 +682,7 @@ struct vge_tx_frag { * to obtain this behavior, the special 'queue' bit must be set. */ -#define VGE_TXDESC_Q 0x8000 +#define VGE_TXDESC_Q 0x80000000 struct vge_tx_desc { uint32_t vge_sts; @@ -645,11 +727,10 @@ struct vge_tx_desc { /* Receive DMA descriptors have a single fragment pointer. */ struct vge_rx_desc { - volatile uint32_t vge_sts; - volatile uint32_t vge_ctl; - volatile uint32_t vge_addrlo; - volatile uint16_t vge_addrhi; - volatile uint16_t vge_buflen; + uint32_t vge_sts; + uint32_t vge_ctl; + uint32_t vge_addrlo; + uint32_t vge_addrhi; }; /* @@ -658,7 +739,7 @@ struct vge_rx_desc { * not interrupts are generated for this descriptor. */ -#define VGE_RXDESC_I 0x8000 +#define VGE_RXDESC_I 0x80000000 #define VGE_RDSTS_VIDM 0x00000001 /* VLAN tag filter miss */ #define VGE_RDSTS_CRCERR 0x00000002 /* bad CRC error */ @@ -680,8 +761,8 @@ struct vge_rx_desc { #define VGE_RDSTS_OWN 0x80000000 /* own bit. */ #define VGE_RXPKT_ONEFRAG 0x00000000 /* only one fragment */ -#define VGE_RXPKT_EOF 0x00000100 /* first frag in frame */ -#define VGE_RXPKT_SOF 0x00000200 /* last frag in frame */ +#define VGE_RXPKT_EOF 0x00000100 /* last frag in frame */ +#define VGE_RXPKT_SOF 0x00000200 /* first frag in frame */ #define VGE_RXPKT_MOF 0x00000300 /* intermediate frag */ #define VGE_RDCTL_VLANID 0x0000FFFF /* VLAN ID info */ diff --git a/sys/dev/vge/if_vgevar.h b/sys/dev/vge/if_vgevar.h index 5d240a33a9ed..ca899cc5fc0a 100644 --- a/sys/dev/vge/if_vgevar.h +++ b/sys/dev/vge/if_vgevar.h @@ -32,34 +32,52 @@ * $FreeBSD$ */ -#if !defined(__i386__) -#define VGE_FIXUP_RX -#endif - #define VGE_JUMBO_MTU 9000 -#define VGE_IFQ_MAXLEN 64 - #define VGE_TX_DESC_CNT 256 -#define VGE_RX_DESC_CNT 256 /* Must be a multiple of 4!! */ -#define VGE_RING_ALIGN 256 +#define VGE_RX_DESC_CNT 252 /* Must be a multiple of 4!! */ +#define VGE_TX_RING_ALIGN 64 +#define VGE_RX_RING_ALIGN 64 +#define VGE_MAXTXSEGS 6 +#define VGE_RX_BUF_ALIGN sizeof(uint64_t) + +/* + * VIA Velocity allows 64bit DMA addressing but high 16bits + * of the DMA address should be the same for Tx/Rx buffers. + * Because this condition can't be guaranteed vge(4) limit + * DMA address space to 48bits. + */ +#if (BUS_SPACE_MAXADDR < 0xFFFFFFFFFF) +#define VGE_BUF_DMA_MAXADDR BUS_SPACE_MAXADDR +#else +#define VGE_BUF_DMA_MAXADDR 0xFFFFFFFFFFFF +#endif + #define VGE_RX_LIST_SZ (VGE_RX_DESC_CNT * sizeof(struct vge_rx_desc)) #define VGE_TX_LIST_SZ (VGE_TX_DESC_CNT * sizeof(struct vge_tx_desc)) -#define VGE_TX_DESC_INC(x) (x = (x + 1) % VGE_TX_DESC_CNT) -#define VGE_RX_DESC_INC(x) (x = (x + 1) % VGE_RX_DESC_CNT) -#define VGE_ADDR_LO(y) ((u_int64_t) (y) & 0xFFFFFFFF) -#define VGE_ADDR_HI(y) ((u_int64_t) (y) >> 32) -#define VGE_BUFLEN(y) ((y) & 0x7FFF) -#define VGE_OWN(x) (le32toh((x)->vge_sts) & VGE_RDSTS_OWN) -#define VGE_RXBYTES(x) ((le32toh((x)->vge_sts) & \ - VGE_RDSTS_BUFSIZ) >> 16) +#define VGE_TX_DESC_INC(x) ((x) = ((x) + 1) % VGE_TX_DESC_CNT) +#define VGE_TX_DESC_DEC(x) \ + ((x) = (((x) + VGE_TX_DESC_CNT - 1) % VGE_TX_DESC_CNT)) +#define VGE_RX_DESC_INC(x) ((x) = ((x) + 1) % VGE_RX_DESC_CNT) +#define VGE_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF) +#define VGE_ADDR_HI(y) ((uint64_t) (y) >> 32) +#define VGE_BUFLEN(y) ((y) & 0x3FFF) +#define VGE_RXBYTES(x) (((x) & VGE_RDSTS_BUFSIZ) >> 16) #define VGE_MIN_FRAMELEN 60 -#ifdef VGE_FIXUP_RX -#define VGE_ETHER_ALIGN sizeof(uint32_t) -#else -#define VGE_ETHER_ALIGN 0 -#endif +#define VGE_INT_HOLDOFF_TICK 20 +#define VGE_INT_HOLDOFF_USEC(x) ((x) / VGE_INT_HOLDOFF_TICK) +#define VGE_INT_HOLDOFF_MIN 0 +#define VGE_INT_HOLDOFF_MAX (255 * VGE_INT_HOLDOFF_TICK) +#define VGE_INT_HOLDOFF_DEFAULT 150 + +#define VGE_RX_COAL_PKT_MIN 1 +#define VGE_RX_COAL_PKT_MAX VGE_RX_DESC_CNT +#define VGE_RX_COAL_PKT_DEFAULT 64 + +#define VGE_TX_COAL_PKT_MIN 1 +#define VGE_TX_COAL_PKT_MAX VGE_TX_DESC_CNT +#define VGE_TX_COAL_PKT_DEFAULT 128 struct vge_type { uint16_t vge_vid; @@ -67,64 +85,124 @@ struct vge_type { char *vge_name; }; -struct vge_softc; - -struct vge_dmaload_arg { - struct vge_softc *sc; - int vge_idx; - int vge_maxsegs; - struct mbuf *vge_m0; - u_int32_t vge_flags; +struct vge_txdesc { + struct mbuf *tx_m; + bus_dmamap_t tx_dmamap; + struct vge_tx_desc *tx_desc; + struct vge_txdesc *txd_prev; }; -struct vge_list_data { - struct mbuf *vge_tx_mbuf[VGE_TX_DESC_CNT]; - struct mbuf *vge_rx_mbuf[VGE_RX_DESC_CNT]; +struct vge_rxdesc { + struct mbuf *rx_m; + bus_dmamap_t rx_dmamap; + struct vge_rx_desc *rx_desc; + struct vge_rxdesc *rxd_prev; +}; + +struct vge_chain_data{ + bus_dma_tag_t vge_ring_tag; + bus_dma_tag_t vge_buffer_tag; + bus_dma_tag_t vge_tx_tag; + struct vge_txdesc vge_txdesc[VGE_TX_DESC_CNT]; + bus_dma_tag_t vge_rx_tag; + struct vge_rxdesc vge_rxdesc[VGE_RX_DESC_CNT]; + bus_dma_tag_t vge_tx_ring_tag; + bus_dmamap_t vge_tx_ring_map; + bus_dma_tag_t vge_rx_ring_tag; + bus_dmamap_t vge_rx_ring_map; + bus_dmamap_t vge_rx_sparemap; + int vge_tx_prodidx; - int vge_rx_prodidx; int vge_tx_considx; - int vge_tx_free; - bus_dmamap_t vge_tx_dmamap[VGE_TX_DESC_CNT]; - bus_dmamap_t vge_rx_dmamap[VGE_RX_DESC_CNT]; - bus_dma_tag_t vge_mtag; /* mbuf mapping tag */ - bus_dma_tag_t vge_rx_list_tag; - bus_dmamap_t vge_rx_list_map; - struct vge_rx_desc *vge_rx_list; - bus_addr_t vge_rx_list_addr; - bus_dma_tag_t vge_tx_list_tag; - bus_dmamap_t vge_tx_list_map; - struct vge_tx_desc *vge_tx_list; - bus_addr_t vge_tx_list_addr; + int vge_tx_cnt; + int vge_rx_prodidx; + int vge_rx_commit; + + struct mbuf *vge_head; + struct mbuf *vge_tail; +}; + +#define VGE_CHAIN_RESET(_sc) \ +do { \ + if ((_sc)->vge_cdata.vge_head != NULL) { \ + m_freem((_sc)->vge_cdata.vge_head); \ + (_sc)->vge_cdata.vge_head = NULL; \ + (_sc)->vge_cdata.vge_tail = NULL; \ + } \ +} while (0); + +struct vge_ring_data { + struct vge_tx_desc *vge_tx_ring; + bus_addr_t vge_tx_ring_paddr; + struct vge_rx_desc *vge_rx_ring; + bus_addr_t vge_rx_ring_paddr; +}; + +struct vge_hw_stats { + uint32_t rx_frames; + uint32_t rx_good_frames; + uint32_t rx_fifo_oflows; + uint32_t rx_runts; + uint32_t rx_runts_errs; + uint32_t rx_pkts_64; + uint32_t rx_pkts_65_127; + uint32_t rx_pkts_128_255; + uint32_t rx_pkts_256_511; + uint32_t rx_pkts_512_1023; + uint32_t rx_pkts_1024_1518; + uint32_t rx_pkts_1519_max; + uint32_t rx_pkts_1519_max_errs; + uint32_t rx_jumbos; + uint32_t rx_crcerrs; + uint32_t rx_pause_frames; + uint32_t rx_alignerrs; + uint32_t rx_nobufs; + uint32_t rx_symerrs; + uint32_t rx_lenerrs; + + uint32_t tx_good_frames; + uint32_t tx_pkts_64; + uint32_t tx_pkts_65_127; + uint32_t tx_pkts_128_255; + uint32_t tx_pkts_256_511; + uint32_t tx_pkts_512_1023; + uint32_t tx_pkts_1024_1518; + uint32_t tx_jumbos; + uint32_t tx_colls; + uint32_t tx_pause; + uint32_t tx_sqeerrs; + uint32_t tx_latecolls; }; struct vge_softc { struct ifnet *vge_ifp; /* interface info */ device_t vge_dev; - bus_space_handle_t vge_bhandle; /* bus space handle */ - bus_space_tag_t vge_btag; /* bus space tag */ struct resource *vge_res; struct resource *vge_irq; void *vge_intrhand; device_t vge_miibus; - bus_dma_tag_t vge_parent_tag; - bus_dma_tag_t vge_tag; - u_int8_t vge_unit; /* interface number */ - u_int8_t vge_type; int vge_if_flags; - int vge_rx_consumed; - int vge_link; + int vge_phyaddr; + int vge_flags; +#define VGE_FLAG_PCIE 0x0001 +#define VGE_FLAG_MSI 0x0002 +#define VGE_FLAG_PMCAP 0x0004 +#define VGE_FLAG_JUMBO 0x0008 +#define VGE_FLAG_SUSPENDED 0x4000 +#define VGE_FLAG_LINK 0x8000 + int vge_expcap; + int vge_pmcap; int vge_camidx; - struct task vge_txtask; + int vge_int_holdoff; + int vge_rx_coal_pkt; + int vge_tx_coal_pkt; struct mtx vge_mtx; - struct mbuf *vge_head; - struct mbuf *vge_tail; + struct callout vge_watchdog; + int vge_timer; - struct vge_list_data vge_ldata; - - int suspended; /* 0 = normal 1 = suspended */ -#ifdef DEVICE_POLLING - int rxcycles; -#endif + struct vge_chain_data vge_cdata; + struct vge_ring_data vge_rdata; + struct vge_hw_stats vge_stats; }; #define VGE_LOCK(_sc) mtx_lock(&(_sc)->vge_mtx) @@ -135,20 +213,20 @@ struct vge_softc { * register space access macros */ #define CSR_WRITE_STREAM_4(sc, reg, val) \ - bus_space_write_stream_4(sc->vge_btag, sc->vge_bhandle, reg, val) + bus_write_stream_4(sc->vge_res, reg, val) #define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->vge_btag, sc->vge_bhandle, reg, val) + bus_write_4(sc->vge_res, reg, val) #define CSR_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->vge_btag, sc->vge_bhandle, reg, val) + bus_write_2(sc->vge_res, reg, val) #define CSR_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->vge_btag, sc->vge_bhandle, reg, val) + bus_write_1(sc->vge_res, reg, val) #define CSR_READ_4(sc, reg) \ - bus_space_read_4(sc->vge_btag, sc->vge_bhandle, reg) + bus_read_4(sc->vge_res, reg) #define CSR_READ_2(sc, reg) \ - bus_space_read_2(sc->vge_btag, sc->vge_bhandle, reg) + bus_read_2(sc->vge_res, reg) #define CSR_READ_1(sc, reg) \ - bus_space_read_1(sc->vge_btag, sc->vge_bhandle, reg) + bus_read_1(sc->vge_res, reg) #define CSR_SETBIT_1(sc, reg, x) \ CSR_WRITE_1(sc, reg, CSR_READ_1(sc, reg) | (x)) @@ -164,5 +242,6 @@ struct vge_softc { #define CSR_CLRBIT_4(sc, reg, x) \ CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) & ~(x)) +#define VGE_RXCHUNK 4 #define VGE_TIMEOUT 10000 diff --git a/sys/dev/vx/if_vx.c b/sys/dev/vx/if_vx.c index c810c711d096..0dea9bf90935 100644 --- a/sys/dev/vx/if_vx.c +++ b/sys/dev/vx/if_vx.c @@ -129,7 +129,7 @@ static void vx_init_locked(struct vx_softc *); static int vx_ioctl(struct ifnet *, u_long, caddr_t); static void vx_start(struct ifnet *); static void vx_start_locked(struct ifnet *); -static void vx_watchdog(struct ifnet *); +static void vx_watchdog(void *); static void vx_reset(struct vx_softc *); static void vx_read(struct vx_softc *); static struct mbuf *vx_get(struct vx_softc *, u_int); @@ -157,6 +157,7 @@ vx_attach(device_t dev) mtx_init(&sc->vx_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); callout_init_mtx(&sc->vx_callout, &sc->vx_mtx, 0); + callout_init_mtx(&sc->vx_watchdog, &sc->vx_mtx, 0); GO_WINDOW(0); CSR_WRITE_2(sc, VX_COMMAND, GLOBAL_RESET); VX_BUSY_WAIT; @@ -193,7 +194,6 @@ vx_attach(device_t dev) ifp->if_start = vx_start; ifp->if_ioctl = vx_ioctl; ifp->if_init = vx_init; - ifp->if_watchdog = vx_watchdog; ifp->if_softc = sc; ether_ifattach(ifp, eaddr); @@ -269,6 +269,7 @@ vx_init_locked(struct vx_softc *sc) /* Interface is now `running', with no output active. */ ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + callout_reset(&sc->vx_watchdog, hz, vx_watchdog, sc); /* Attempt to start output, if any. */ vx_start_locked(ifp); @@ -474,7 +475,7 @@ startagain: /* not enough room in FIFO - make sure */ if (CSR_READ_2(sc, VX_W1_FREE_TX) < len + pad + 4) { ifp->if_drv_flags |= IFF_DRV_OACTIVE; - ifp->if_timer = 1; + sc->vx_timer = 1; return; } } @@ -513,7 +514,7 @@ startagain: CSR_WRITE_1(sc, VX_W1_TX_PIO_WR_1, 0); /* Padding */ ++ifp->if_opackets; - ifp->if_timer = 1; + sc->vx_timer = 1; readcheck: if ((CSR_READ_2(sc, VX_W1_RX_STATUS) & ERR_INCOMPLETE) == 0) { @@ -661,18 +662,18 @@ vx_intr(void *voidsc) if (status & S_RX_COMPLETE) vx_read(sc); if (status & S_TX_AVAIL) { - ifp->if_timer = 0; + sc->vx_timer = 0; sc->vx_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; vx_start_locked(sc->vx_ifp); } if (status & S_CARD_FAILURE) { if_printf(ifp, "adapter failure (%x)\n", status); - ifp->if_timer = 0; + sc->vx_timer = 0; vx_reset(sc); break; } if (status & S_TX_COMPLETE) { - ifp->if_timer = 0; + sc->vx_timer = 0; vx_txstat(sc); vx_start_locked(ifp); } @@ -970,26 +971,32 @@ vx_reset(struct vx_softc *sc) } static void -vx_watchdog(struct ifnet *ifp) +vx_watchdog(void *arg) { - struct vx_softc *sc = ifp->if_softc; + struct vx_softc *sc; + struct ifnet *ifp; - VX_LOCK(sc); + sc = arg; + VX_LOCK_ASSERT(sc); + callout_reset(&sc->vx_watchdog, hz, vx_watchdog, sc); + if (sc->vx_timer == 0 || --sc->vx_timer > 0) + return; + + ifp = sc->vx_ifp; if (ifp->if_flags & IFF_DEBUG) if_printf(ifp, "device timeout\n"); ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; vx_start_locked(ifp); vx_intr(sc); - VX_UNLOCK(sc); } void vx_stop(struct vx_softc *sc) { - struct ifnet *ifp = sc->vx_ifp; VX_LOCK_ASSERT(sc); - ifp->if_timer = 0; + sc->vx_timer = 0; + callout_stop(&sc->vx_watchdog); CSR_WRITE_2(sc, VX_COMMAND, RX_DISABLE); CSR_WRITE_2(sc, VX_COMMAND, RX_DISCARD_TOP_PACK); diff --git a/sys/dev/vx/if_vxvar.h b/sys/dev/vx/if_vxvar.h index ec20a3fbcfe4..8c312e2cbe97 100644 --- a/sys/dev/vx/if_vxvar.h +++ b/sys/dev/vx/if_vxvar.h @@ -51,8 +51,10 @@ struct vx_softc { int vx_tx_succ_ok; /* # packets sent in sequence */ /* w/o underrun */ struct callout vx_callout; /* Callout for timeouts */ + struct callout vx_watchdog; struct mtx vx_mtx; int vx_buffill_pending; + int vx_timer; }; #define CSR_WRITE_4(sc, reg, val) \ diff --git a/sys/dev/wb/if_wb.c b/sys/dev/wb/if_wb.c index d90159535056..cb4f3bb817f3 100644 --- a/sys/dev/wb/if_wb.c +++ b/sys/dev/wb/if_wb.c @@ -158,7 +158,7 @@ static int wb_ioctl(struct ifnet *, u_long, caddr_t); static void wb_init(void *); static void wb_init_locked(struct wb_softc *); static void wb_stop(struct wb_softc *); -static void wb_watchdog(struct ifnet *); +static void wb_watchdog(struct wb_softc *); static int wb_shutdown(device_t); static int wb_ifmedia_upd(struct ifnet *); static void wb_ifmedia_sts(struct ifnet *, struct ifmediareq *); @@ -804,9 +804,6 @@ wb_attach(dev) goto fail; } - sc->wb_btag = rman_get_bustag(sc->wb_res); - sc->wb_bhandle = rman_get_bushandle(sc->wb_res); - /* Allocate interrupt */ rid = 0; sc->wb_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, @@ -852,7 +849,6 @@ wb_attach(dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = wb_ioctl; ifp->if_start = wb_start; - ifp->if_watchdog = wb_watchdog; ifp->if_init = wb_init; ifp->if_snd.ifq_maxlen = WB_TX_LIST_CNT - 1; @@ -910,11 +906,11 @@ wb_detach(dev) * This should only be done if attach succeeded. */ if (device_is_attached(dev)) { + ether_ifdetach(ifp); WB_LOCK(sc); wb_stop(sc); WB_UNLOCK(sc); callout_drain(&sc->wb_stat_callout); - ether_ifdetach(ifp); } if (sc->wb_miibus) device_delete_child(dev, sc->wb_miibus); @@ -1160,7 +1156,7 @@ wb_txeof(sc) ifp = sc->wb_ifp; /* Clear the timeout timer. */ - ifp->if_timer = 0; + sc->wb_timer = 0; if (sc->wb_cdata.wb_tx_head == NULL) return; @@ -1215,7 +1211,7 @@ wb_txeoc(sc) ifp = sc->wb_ifp; - ifp->if_timer = 0; + sc->wb_timer = 0; if (sc->wb_cdata.wb_tx_head == NULL) { ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; @@ -1223,7 +1219,7 @@ wb_txeoc(sc) } else { if (WB_TXOWN(sc->wb_cdata.wb_tx_head) == WB_UNSENT) { WB_TXOWN(sc->wb_cdata.wb_tx_head) = WB_TXSTAT_OWN; - ifp->if_timer = 5; + sc->wb_timer = 5; CSR_WRITE_4(sc, WB_TXSTART, 0xFFFFFFFF); } } @@ -1332,6 +1328,8 @@ wb_tick(xsc) mii_tick(mii); + if (sc->wb_timer > 0 && --sc->wb_timer == 0) + wb_watchdog(sc); callout_reset(&sc->wb_stat_callout, hz, wb_tick, sc); return; @@ -1532,7 +1530,7 @@ wb_start_locked(ifp) /* * Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + sc->wb_timer = 5; return; } @@ -1751,14 +1749,13 @@ wb_ioctl(ifp, command, data) } static void -wb_watchdog(ifp) - struct ifnet *ifp; -{ +wb_watchdog(sc) struct wb_softc *sc; +{ + struct ifnet *ifp; - sc = ifp->if_softc; - - WB_LOCK(sc); + WB_LOCK_ASSERT(sc); + ifp = sc->wb_ifp; ifp->if_oerrors++; if_printf(ifp, "watchdog timeout\n"); #ifdef foo @@ -1771,7 +1768,6 @@ wb_watchdog(ifp) if (ifp->if_snd.ifq_head != NULL) wb_start_locked(ifp); - WB_UNLOCK(sc); return; } @@ -1789,7 +1785,7 @@ wb_stop(sc) WB_LOCK_ASSERT(sc); ifp = sc->wb_ifp; - ifp->if_timer = 0; + sc->wb_timer = 0; callout_stop(&sc->wb_stat_callout); diff --git a/sys/dev/wb/if_wbreg.h b/sys/dev/wb/if_wbreg.h index c5315c4efcb5..95d0a8e761b2 100644 --- a/sys/dev/wb/if_wbreg.h +++ b/sys/dev/wb/if_wbreg.h @@ -365,8 +365,6 @@ struct wb_softc { struct ifnet *wb_ifp; /* interface info */ device_t wb_dev; device_t wb_miibus; - bus_space_handle_t wb_bhandle; - bus_space_tag_t wb_btag; struct resource *wb_res; struct resource *wb_irq; void *wb_intrhand; @@ -374,6 +372,7 @@ struct wb_softc { u_int8_t wb_type; u_int16_t wb_txthresh; int wb_cachesize; + int wb_timer; caddr_t wb_ldata_ptr; struct wb_list_data *wb_ldata; struct wb_chain_data wb_cdata; @@ -388,19 +387,13 @@ struct wb_softc { /* * register space access macros */ -#define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->wb_btag, sc->wb_bhandle, reg, val) -#define CSR_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->wb_btag, sc->wb_bhandle, reg, val) -#define CSR_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->wb_btag, sc->wb_bhandle, reg, val) +#define CSR_WRITE_4(sc, reg, val) bus_write_4(sc->wb_res, reg, val) +#define CSR_WRITE_2(sc, reg, val) bus_write_2(sc->wb_res, reg, val) +#define CSR_WRITE_1(sc, reg, val) bus_write_1(sc->wb_res, reg, val) -#define CSR_READ_4(sc, reg) \ - bus_space_read_4(sc->wb_btag, sc->wb_bhandle, reg) -#define CSR_READ_2(sc, reg) \ - bus_space_read_2(sc->wb_btag, sc->wb_bhandle, reg) -#define CSR_READ_1(sc, reg) \ - bus_space_read_1(sc->wb_btag, sc->wb_bhandle, reg) +#define CSR_READ_4(sc, reg) bus_read_4(sc->wb_res, reg) +#define CSR_READ_2(sc, reg) bus_read_2(sc->wb_res, reg) +#define CSR_READ_1(sc, reg) bus_read_1(sc->wb_res, reg) #define WB_TIMEOUT 1000 diff --git a/sys/dev/wl/if_wl.c b/sys/dev/wl/if_wl.c index e773fd3438fd..ed291ed8dbd2 100644 --- a/sys/dev/wl/if_wl.c +++ b/sys/dev/wl/if_wl.c @@ -559,10 +559,8 @@ wlattach(device_t device) ifp->if_init = wlinit; ifp->if_start = wlstart; ifp->if_ioctl = wlioctl; - ifp->if_timer = 0; /* paranoia */ ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; /* no entries - ifp->if_watchdog ifp->if_done ifp->if_reset */ diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c index af51f60269c5..1797c2d7271f 100644 --- a/sys/dev/wpi/if_wpi.c +++ b/sys/dev/wpi/if_wpi.c @@ -126,7 +126,7 @@ enum { WPI_DEBUG_ANY = 0xffffffff }; -static int wpi_debug = 1; +static int wpi_debug = 0; SYSCTL_INT(_debug, OID_AUTO, wpi, CTLFLAG_RW, &wpi_debug, 0, "wpi debug level"); TUNABLE_INT("debug.wpi", &wpi_debug); @@ -713,13 +713,14 @@ wpi_detach(device_t dev) { struct wpi_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211com *ic; int ac; - ieee80211_draintask(ic, &sc->sc_restarttask); - ieee80211_draintask(ic, &sc->sc_radiotask); - if (ifp != NULL) { + ic = ifp->if_l2com; + + ieee80211_draintask(ic, &sc->sc_restarttask); + ieee80211_draintask(ic, &sc->sc_radiotask); wpi_stop(sc); callout_drain(&sc->watchdog_to); callout_drain(&sc->calib_to); diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c index 8487e8e35f49..6c222ea6ecf0 100644 --- a/sys/dev/xen/blkfront/blkfront.c +++ b/sys/dev/xen/blkfront/blkfront.c @@ -1,24 +1,30 @@ -/*- - * All rights reserved. - * - * 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. - * - */ - /* * XenBSD block device driver * + * Copyright (c) 2009 Scott Long, Yahoo! * Copyright (c) 2009 Frank Suchomel, Citrix + * Copyright (c) 2009 Doug F. Rabson, Citrix + * Copyright (c) 2005 Kip Macy + * Copyright (c) 2003-2004, Keir Fraser & Steve Hand + * Modifications by Mark A. Williamson are (c) Intel Research Cambridge + * + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. */ #include @@ -41,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -58,27 +65,21 @@ __FBSDID("$FreeBSD$"); #include "xenbus_if.h" -#define ASSERT(S) KASSERT(S, (#S)) /* prototypes */ -struct xb_softc; +static void xb_free_command(struct xb_command *cm); static void xb_startio(struct xb_softc *sc); -static void connect(device_t, struct blkfront_info *); +static void connect(struct xb_softc *); static void blkfront_closing(device_t); static int blkfront_detach(device_t); -static int talk_to_backend(device_t, struct blkfront_info *); -static int setup_blkring(device_t, struct blkfront_info *); +static int talk_to_backend(struct xb_softc *); +static int setup_blkring(struct xb_softc *); static void blkif_int(void *); -#if 0 -static void blkif_restart_queue(void *arg); -#endif -static void blkif_recover(struct blkfront_info *); -static void blkif_completion(struct blk_shadow *); -static void blkif_free(struct blkfront_info *, int); +static void blkif_recover(struct xb_softc *); +static void blkif_completion(struct xb_command *); +static void blkif_free(struct xb_softc *, int); +static void blkif_queue_cb(void *, bus_dma_segment_t *, int, int); #define GRANT_INVALID_REF 0 -#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE) - -LIST_HEAD(xb_softc_list_head, xb_softc) xbsl_head; /* Control whether runtime update of vbds is enabled. */ #define ENABLE_VBD_UPDATE 0 @@ -87,7 +88,6 @@ LIST_HEAD(xb_softc_list_head, xb_softc) xbsl_head; static void vbd_update(void); #endif - #define BLKIF_STATE_DISCONNECTED 0 #define BLKIF_STATE_CONNECTED 1 #define BLKIF_STATE_SUSPENDED 2 @@ -106,44 +106,34 @@ static char * blkif_status_name[] = { [BLKIF_INTERFACE_STATUS_CHANGED] = "changed", }; #endif -#define WPRINTK(fmt, args...) printf("[XEN] " fmt, ##args) + #if 0 #define DPRINTK(fmt, args...) printf("[XEN] %s:%d: " fmt ".\n", __func__, __LINE__, ##args) #else #define DPRINTK(fmt, args...) #endif -static grant_ref_t gref_head; #define MAXIMUM_OUTSTANDING_BLOCK_REQS \ (BLKIF_MAX_SEGMENTS_PER_REQUEST * BLK_RING_SIZE) -static void kick_pending_request_queues(struct blkfront_info *); +#define BLKIF_MAXIO (32 * 1024) + static int blkif_open(struct disk *dp); static int blkif_close(struct disk *dp); static int blkif_ioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td); -static int blkif_queue_request(struct bio *bp); +static int blkif_queue_request(struct xb_softc *sc, struct xb_command *cm); static void xb_strategy(struct bio *bp); // In order to quiesce the device during kernel dumps, outstanding requests to // DOM0 for disk reads/writes need to be accounted for. -static int blkif_queued_requests; static int xb_dump(void *, void *, vm_offset_t, off_t, size_t); - /* XXX move to xb_vbd.c when VBD update support is added */ #define MAX_VBDS 64 #define XBD_SECTOR_SIZE 512 /* XXX: assume for now */ #define XBD_SECTOR_SHFT 9 -static struct mtx blkif_io_lock; - -static vm_paddr_t -pfn_to_mfn(vm_paddr_t pfn) -{ - return (phystomach(pfn << PAGE_SHIFT) >> PAGE_SHIFT); -} - /* * Translate Linux major/minor to an appropriate name and unit * number. For HVM guests, this allows us to use the same drive names @@ -212,23 +202,18 @@ blkfront_vdevice_to_unit(int vdevice, int *unit, const char **name) } int -xlvbd_add(device_t dev, blkif_sector_t capacity, - int vdevice, uint16_t vdisk_info, uint16_t sector_size, - struct blkfront_info *info) +xlvbd_add(struct xb_softc *sc, blkif_sector_t capacity, + int vdevice, uint16_t vdisk_info, uint16_t sector_size) { - struct xb_softc *sc; int unit, error = 0; const char *name; blkfront_vdevice_to_unit(vdevice, &unit, &name); - sc = (struct xb_softc *)malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO); sc->xb_unit = unit; - sc->xb_info = info; - info->sc = sc; if (strcmp(name, "xbd")) - device_printf(dev, "attaching as %s%d\n", name, unit); + device_printf(sc->xb_dev, "attaching as %s%d\n", name, unit); memset(&sc->xb_disk, 0, sizeof(sc->xb_disk)); sc->xb_disk = disk_alloc(); @@ -242,31 +227,18 @@ xlvbd_add(device_t dev, blkif_sector_t capacity, sc->xb_disk->d_drv1 = sc; sc->xb_disk->d_sectorsize = sector_size; - /* XXX */ sc->xb_disk->d_mediasize = capacity << XBD_SECTOR_SHFT; -#if 0 - sc->xb_disk->d_maxsize = DFLTPHYS; -#else /* XXX: xen can't handle large single i/o requests */ - sc->xb_disk->d_maxsize = 4096; -#endif -#ifdef notyet - XENPRINTF("attaching device 0x%x unit %d capacity %llu\n", - xb_diskinfo[sc->xb_unit].device, sc->xb_unit, - sc->xb_disk->d_mediasize); -#endif + sc->xb_disk->d_maxsize = BLKIF_MAXIO; sc->xb_disk->d_flags = 0; disk_create(sc->xb_disk, DISK_VERSION_00); - bioq_init(&sc->xb_bioq); return error; } void -xlvbd_del(struct blkfront_info *info) +xlvbd_del(struct xb_softc *sc) { - struct xb_softc *sc; - sc = info->sc; disk_destroy(sc->xb_disk); } /************************ end VBD support *****************/ @@ -284,102 +256,147 @@ xb_strategy(struct bio *bp) if (sc == NULL) { bp->bio_error = EINVAL; bp->bio_flags |= BIO_ERROR; - goto bad; + bp->bio_resid = bp->bio_bcount; + biodone(bp); + return; } - DPRINTK(""); - /* * Place it in the queue of disk activities for this disk */ - mtx_lock(&blkif_io_lock); + mtx_lock(&sc->xb_io_lock); - bioq_disksort(&sc->xb_bioq, bp); + xb_enqueue_bio(sc, bp); xb_startio(sc); - mtx_unlock(&blkif_io_lock); - return; - - bad: - /* - * Correctly set the bio to indicate a failed tranfer. - */ - bp->bio_resid = bp->bio_bcount; - biodone(bp); + mtx_unlock(&sc->xb_io_lock); return; } -static void xb_quiesce(struct blkfront_info *info); +static void +xb_bio_complete(struct xb_softc *sc, struct xb_command *cm) +{ + struct bio *bp; + + bp = cm->bp; + + if ( unlikely(cm->status != BLKIF_RSP_OKAY) ) { + disk_err(bp, "disk error" , -1, 0); + printf(" status: %x\n", cm->status); + bp->bio_flags |= BIO_ERROR; + } + + if (bp->bio_flags & BIO_ERROR) + bp->bio_error = EIO; + else + bp->bio_resid = 0; + + xb_free_command(cm); + biodone(bp); +} + // Quiesce the disk writes for a dump file before allowing the next buffer. static void -xb_quiesce(struct blkfront_info *info) +xb_quiesce(struct xb_softc *sc) { int mtd; // While there are outstanding requests - while (blkif_queued_requests) { - RING_FINAL_CHECK_FOR_RESPONSES(&info->ring, mtd); + while (!TAILQ_EMPTY(&sc->cm_busy)) { + RING_FINAL_CHECK_FOR_RESPONSES(&sc->ring, mtd); if (mtd) { - // Recieved request completions, update queue. - blkif_int(info); + /* Recieved request completions, update queue. */ + blkif_int(sc); } - if (blkif_queued_requests) { - // Still pending requests, wait for the disk i/o to complete - HYPERVISOR_block(); + if (!TAILQ_EMPTY(&sc->cm_busy)) { + /* + * Still pending requests, wait for the disk i/o + * to complete. + */ + HYPERVISOR_yield(); } } } -// Some bio structures for dumping core -#define DUMP_BIO_NO 16 // 16 * 4KB = 64KB dump block -static struct bio xb_dump_bp[DUMP_BIO_NO]; +/* Kernel dump function for a paravirtualized disk device */ +static void +xb_dump_complete(struct xb_command *cm) +{ + + xb_enqueue_complete(cm); +} -// Kernel dump function for a paravirtualized disk device static int xb_dump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t length) { - int sbp; - int mbp; - size_t chunk; - struct disk *dp = arg; - struct xb_softc *sc = (struct xb_softc *) dp->d_drv1; - int rc = 0; + struct disk *dp = arg; + struct xb_softc *sc = (struct xb_softc *) dp->d_drv1; + struct xb_command *cm; + size_t chunk; + int sbp; + int rc = 0; - xb_quiesce(sc->xb_info); // All quiet on the western front. - if (length > 0) { - // If this lock is held, then this module is failing, and a successful - // kernel dump is highly unlikely anyway. - mtx_lock(&blkif_io_lock); - // Split the 64KB block into 16 4KB blocks - for (sbp=0; length>0 && sbp PAGE_SIZE ? PAGE_SIZE : length; - xb_dump_bp[sbp].bio_disk = dp; - xb_dump_bp[sbp].bio_pblkno = offset / dp->d_sectorsize; - xb_dump_bp[sbp].bio_bcount = chunk; - xb_dump_bp[sbp].bio_resid = chunk; - xb_dump_bp[sbp].bio_data = virtual; - xb_dump_bp[sbp].bio_cmd = BIO_WRITE; - xb_dump_bp[sbp].bio_done = NULL; + if (length <= 0) + return (rc); - bioq_disksort(&sc->xb_bioq, &xb_dump_bp[sbp]); + xb_quiesce(sc); /* All quiet on the western front. */ - length -= chunk; - offset += chunk; - virtual = (char *) virtual + chunk; + /* + * If this lock is held, then this module is failing, and a + * successful kernel dump is highly unlikely anyway. + */ + mtx_lock(&sc->xb_io_lock); + + /* Split the 64KB block as needed */ + for (sbp=0; length > 0; sbp++) { + cm = xb_dequeue_free(sc); + if (cm == NULL) { + mtx_unlock(&sc->xb_io_lock); + device_printf(sc->xb_dev, "dump: no more commands?\n"); + return (EBUSY); } - // Tell DOM0 to do the I/O - xb_startio(sc); - mtx_unlock(&blkif_io_lock); - // Must wait for the completion: the dump routine reuses the same - // 16 x 4KB buffer space. - xb_quiesce(sc->xb_info); // All quite on the eastern front - // If there were any errors, bail out... - for (mbp=0; mbpgref_head) < 0) { + xb_free_command(cm); + mtx_unlock(&sc->xb_io_lock); + device_printf(sc->xb_dev, "no more grant allocs?\n"); + return (EBUSY); } + + chunk = length > BLKIF_MAXIO ? BLKIF_MAXIO : length; + cm->data = virtual; + cm->datalen = chunk; + cm->operation = BLKIF_OP_WRITE; + cm->sector_number = offset / dp->d_sectorsize; + cm->cm_complete = xb_dump_complete; + + xb_enqueue_ready(cm); + + length -= chunk; + offset += chunk; + virtual = (char *) virtual + chunk; } + + /* Tell DOM0 to do the I/O */ + xb_startio(sc); + mtx_unlock(&sc->xb_io_lock); + + /* Poll for the completion. */ + xb_quiesce(sc); /* All quite on the eastern front */ + + /* If there were any errors, bail out... */ + while ((cm = xb_dequeue_complete(sc)) != NULL) { + if (cm->status != BLKIF_RSP_OKAY) { + device_printf(sc->xb_dev, + "Dump I/O failed at sector %jd\n", + cm->sector_number); + rc = EIO; + } + xb_free_command(cm); + } + return (rc); } @@ -405,9 +422,10 @@ blkfront_probe(device_t dev) static int blkfront_attach(device_t dev) { - int error, vdevice, i, unit; - struct blkfront_info *info; + struct xb_softc *sc; + struct xb_command *cm; const char *name; + int error, vdevice, i, unit; /* FIXME: Use dynamic device id if this is not set. */ error = xenbus_scanf(XBT_NIL, xenbus_get_node(dev), @@ -422,29 +440,56 @@ blkfront_attach(device_t dev) if (!strcmp(name, "xbd")) device_set_unit(dev, unit); - info = device_get_softc(dev); - - /* - * XXX debug only - */ - for (i = 0; i < sizeof(*info); i++) - if (((uint8_t *)info)[i] != 0) - panic("non-null memory"); + sc = device_get_softc(dev); + mtx_init(&sc->xb_io_lock, "blkfront i/o lock", NULL, MTX_DEF); + xb_initq_free(sc); + xb_initq_busy(sc); + xb_initq_ready(sc); + xb_initq_complete(sc); + xb_initq_bio(sc); - info->shadow_free = 0; - info->xbdev = dev; - info->vdevice = vdevice; - info->connected = BLKIF_STATE_DISCONNECTED; + /* Allocate parent DMA tag */ + if (bus_dma_tag_create( NULL, /* parent */ + 512, 4096, /* algnmnt, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BLKIF_MAXIO, /* maxsize */ + BLKIF_MAX_SEGMENTS_PER_REQUEST, /* nsegments */ + PAGE_SIZE, /* maxsegsize */ + BUS_DMA_ALLOCNOW, /* flags */ + busdma_lock_mutex, /* lockfunc */ + &sc->xb_io_lock, /* lockarg */ + &sc->xb_io_dmat)) { + device_printf(dev, "Cannot allocate parent DMA tag\n"); + return (ENOMEM); + } +#ifdef notyet + if (bus_dma_tag_set(sc->xb_io_dmat, BUS_DMA_SET_MINSEGSZ, + XBD_SECTOR_SIZE)) { + device_printf(dev, "Cannot set sector size\n"); + return (EINVAL); + } +#endif + + sc->xb_dev = dev; + sc->vdevice = vdevice; + sc->connected = BLKIF_STATE_DISCONNECTED; /* work queue needed ? */ - for (i = 0; i < BLK_RING_SIZE; i++) - info->shadow[i].req.id = i+1; - info->shadow[BLK_RING_SIZE-1].req.id = 0x0fffffff; + for (i = 0; i < BLK_RING_SIZE; i++) { + cm = &sc->shadow[i]; + cm->req.id = i; + cm->cm_sc = sc; + if (bus_dmamap_create(sc->xb_io_dmat, 0, &cm->map) != 0) + break; + xb_free_command(cm); + } /* Front end dir is a number, which is used as the id. */ - info->handle = strtoul(strrchr(xenbus_get_node(dev),'/')+1, NULL, 0); + sc->handle = strtoul(strrchr(xenbus_get_node(dev),'/')+1, NULL, 0); - error = talk_to_backend(dev, info); + error = talk_to_backend(sc); if (error) return (error); @@ -454,12 +499,12 @@ blkfront_attach(device_t dev) static int blkfront_suspend(device_t dev) { - struct blkfront_info *info = device_get_softc(dev); + struct xb_softc *sc = device_get_softc(dev); /* Prevent new requests being issued until we fix things up. */ - mtx_lock(&blkif_io_lock); - info->connected = BLKIF_STATE_SUSPENDED; - mtx_unlock(&blkif_io_lock); + mtx_lock(&sc->xb_io_lock); + sc->connected = BLKIF_STATE_SUSPENDED; + mtx_unlock(&sc->xb_io_lock); return (0); } @@ -467,29 +512,31 @@ blkfront_suspend(device_t dev) static int blkfront_resume(device_t dev) { - struct blkfront_info *info = device_get_softc(dev); + struct xb_softc *sc = device_get_softc(dev); int err; DPRINTK("blkfront_resume: %s\n", xenbus_get_node(dev)); - blkif_free(info, 1); - err = talk_to_backend(dev, info); - if (info->connected == BLKIF_STATE_SUSPENDED && !err) - blkif_recover(info); + blkif_free(sc, 1); + err = talk_to_backend(sc); + if (sc->connected == BLKIF_STATE_SUSPENDED && !err) + blkif_recover(sc); return (err); } /* Common code used when first setting up, and when resuming. */ static int -talk_to_backend(device_t dev, struct blkfront_info *info) +talk_to_backend(struct xb_softc *sc) { - const char *message = NULL; + device_t dev; struct xenbus_transaction xbt; + const char *message = NULL; int err; /* Create shared ring, alloc event channel. */ - err = setup_blkring(dev, info); + dev = sc->xb_dev; + err = setup_blkring(sc); if (err) goto out; @@ -501,13 +548,13 @@ talk_to_backend(device_t dev, struct blkfront_info *info) } err = xenbus_printf(xbt, xenbus_get_node(dev), - "ring-ref","%u", info->ring_ref); + "ring-ref","%u", sc->ring_ref); if (err) { message = "writing ring-ref"; goto abort_transaction; } err = xenbus_printf(xbt, xenbus_get_node(dev), - "event-channel", "%u", irq_to_evtchn_port(info->irq)); + "event-channel", "%u", irq_to_evtchn_port(sc->irq)); if (err) { message = "writing event-channel"; goto abort_transaction; @@ -535,47 +582,47 @@ talk_to_backend(device_t dev, struct blkfront_info *info) if (message) xenbus_dev_fatal(dev, err, "%s", message); destroy_blkring: - blkif_free(info, 0); + blkif_free(sc, 0); out: return err; } static int -setup_blkring(device_t dev, struct blkfront_info *info) +setup_blkring(struct xb_softc *sc) { blkif_sring_t *sring; int error; - info->ring_ref = GRANT_INVALID_REF; + sc->ring_ref = GRANT_INVALID_REF; sring = (blkif_sring_t *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT|M_ZERO); if (sring == NULL) { - xenbus_dev_fatal(dev, ENOMEM, "allocating shared ring"); + xenbus_dev_fatal(sc->xb_dev, ENOMEM, "allocating shared ring"); return ENOMEM; } SHARED_RING_INIT(sring); - FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE); + FRONT_RING_INIT(&sc->ring, sring, PAGE_SIZE); - error = xenbus_grant_ring(dev, - (vtomach(info->ring.sring) >> PAGE_SHIFT), &info->ring_ref); + error = xenbus_grant_ring(sc->xb_dev, + (vtomach(sc->ring.sring) >> PAGE_SHIFT), &sc->ring_ref); if (error) { free(sring, M_DEVBUF); - info->ring.sring = NULL; + sc->ring.sring = NULL; goto fail; } - error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(dev), - "xbd", (driver_intr_t *)blkif_int, info, - INTR_TYPE_BIO | INTR_MPSAFE, &info->irq); + error = bind_listening_port_to_irqhandler(xenbus_get_otherend_id(sc->xb_dev), + "xbd", (driver_intr_t *)blkif_int, sc, + INTR_TYPE_BIO | INTR_MPSAFE, &sc->irq); if (error) { - xenbus_dev_fatal(dev, error, + xenbus_dev_fatal(sc->xb_dev, error, "bind_evtchn_to_irqhandler failed"); goto fail; } return (0); fail: - blkif_free(info, 0); + blkif_free(sc, 0); return (error); } @@ -586,7 +633,7 @@ setup_blkring(device_t dev, struct blkfront_info *info) static int blkfront_backend_changed(device_t dev, XenbusState backend_state) { - struct blkfront_info *info = device_get_softc(dev); + struct xb_softc *sc = device_get_softc(dev); DPRINTK("backend_state=%d\n", backend_state); @@ -601,22 +648,22 @@ blkfront_backend_changed(device_t dev, XenbusState backend_state) break; case XenbusStateConnected: - connect(dev, info); + connect(sc); break; case XenbusStateClosing: - if (info->users > 0) + if (sc->users > 0) xenbus_dev_error(dev, -EBUSY, "Device in use; refusing to close"); else blkfront_closing(dev); #ifdef notyet - bd = bdget(info->dev); + bd = bdget(sc->dev); if (bd == NULL) xenbus_dev_fatal(dev, -ENODEV, "bdget failed"); down(&bd->bd_sem); - if (info->users > 0) + if (sc->users > 0) xenbus_dev_error(dev, -EBUSY, "Device in use; refusing to close"); else @@ -634,14 +681,15 @@ blkfront_backend_changed(device_t dev, XenbusState backend_state) ** the details about the physical device - #sectors, size, etc). */ static void -connect(device_t dev, struct blkfront_info *info) +connect(struct xb_softc *sc) { + device_t dev = sc->xb_dev; unsigned long sectors, sector_size; unsigned int binfo; - int err; + int err, feature_barrier; - if( (info->connected == BLKIF_STATE_CONNECTED) || - (info->connected == BLKIF_STATE_SUSPENDED) ) + if( (sc->connected == BLKIF_STATE_CONNECTED) || + (sc->connected == BLKIF_STATE_SUSPENDED) ) return; DPRINTK("blkfront.c:connect:%s.\n", xenbus_get_otherend_path(dev)); @@ -658,10 +706,10 @@ connect(device_t dev, struct blkfront_info *info) return; } err = xenbus_gather(XBT_NIL, xenbus_get_otherend_path(dev), - "feature-barrier", "%lu", &info->feature_barrier, + "feature-barrier", "%lu", &feature_barrier, NULL); - if (err) - info->feature_barrier = 0; + if (!err || feature_barrier) + sc->xb_flags |= XB_BARRIER; device_printf(dev, "%juMB <%s> at %s", (uintmax_t) sectors / (1048576 / sector_size), @@ -669,39 +717,36 @@ connect(device_t dev, struct blkfront_info *info) xenbus_get_node(dev)); bus_print_child_footer(device_get_parent(dev), dev); - xlvbd_add(dev, sectors, info->vdevice, binfo, sector_size, info); + xlvbd_add(sc, sectors, sc->vdevice, binfo, sector_size); (void)xenbus_set_state(dev, XenbusStateConnected); /* Kick pending requests. */ - mtx_lock(&blkif_io_lock); - info->connected = BLKIF_STATE_CONNECTED; - kick_pending_request_queues(info); - mtx_unlock(&blkif_io_lock); - info->is_ready = 1; + mtx_lock(&sc->xb_io_lock); + sc->connected = BLKIF_STATE_CONNECTED; + xb_startio(sc); + sc->xb_flags |= XB_READY; + mtx_unlock(&sc->xb_io_lock); -#if 0 - add_disk(info->gd); -#endif } /** * Handle the change of state of the backend to Closing. We must delete our * device-layer structures now, to ensure that writes are flushed through to - * the backend. Once is this done, we can switch to Closed in + * the backend. Once this is done, we can switch to Closed in * acknowledgement. */ static void blkfront_closing(device_t dev) { - struct blkfront_info *info = device_get_softc(dev); + struct xb_softc *sc = device_get_softc(dev); DPRINTK("blkfront_closing: %s removed\n", xenbus_get_node(dev)); - if (info->mi) { + if (sc->mi) { DPRINTK("Calling xlvbd_del\n"); - xlvbd_del(info); - info->mi = NULL; + xlvbd_del(sc); + sc->mi = NULL; } xenbus_set_state(dev, XenbusStateClosed); @@ -711,92 +756,33 @@ blkfront_closing(device_t dev) static int blkfront_detach(device_t dev) { - struct blkfront_info *info = device_get_softc(dev); + struct xb_softc *sc = device_get_softc(dev); DPRINTK("blkfront_remove: %s removed\n", xenbus_get_node(dev)); - blkif_free(info, 0); + blkif_free(sc, 0); + mtx_destroy(&sc->xb_io_lock); return 0; } -static inline int -GET_ID_FROM_FREELIST(struct blkfront_info *info) -{ - unsigned long nfree = info->shadow_free; - - KASSERT(nfree <= BLK_RING_SIZE, ("free %lu > RING_SIZE", nfree)); - info->shadow_free = info->shadow[nfree].req.id; - info->shadow[nfree].req.id = 0x0fffffee; /* debug */ - atomic_add_int(&blkif_queued_requests, 1); - return nfree; -} - static inline void -ADD_ID_TO_FREELIST(struct blkfront_info *info, unsigned long id) -{ - info->shadow[id].req.id = info->shadow_free; - info->shadow[id].request = 0; - info->shadow_free = id; - atomic_subtract_int(&blkif_queued_requests, 1); -} - -static inline void -flush_requests(struct blkfront_info *info) +flush_requests(struct xb_softc *sc) { int notify; - RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->ring, notify); + RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&sc->ring, notify); if (notify) - notify_remote_via_irq(info->irq); + notify_remote_via_irq(sc->irq); } -static void -kick_pending_request_queues(struct blkfront_info *info) -{ - /* XXX check if we can't simplify */ -#if 0 - if (!RING_FULL(&info->ring)) { - /* Re-enable calldowns. */ - blk_start_queue(info->rq); - /* Kick things off immediately. */ - do_blkif_request(info->rq); - } -#endif - if (!RING_FULL(&info->ring)) { -#if 0 - sc = LIST_FIRST(&xbsl_head); - LIST_REMOVE(sc, entry); - /* Re-enable calldowns. */ - blk_start_queue(di->rq); -#endif - /* Kick things off immediately. */ - xb_startio(info->sc); - } -} - -#if 0 -/* XXX */ -static void blkif_restart_queue(void *arg) -{ - struct blkfront_info *info = (struct blkfront_info *)arg; - - mtx_lock(&blkif_io_lock); - kick_pending_request_queues(info); - mtx_unlock(&blkif_io_lock); -} -#endif - static void blkif_restart_queue_callback(void *arg) { -#if 0 - struct blkfront_info *info = (struct blkfront_info *)arg; - /* XXX BSD equiv ? */ + struct xb_softc *sc = arg; - schedule_work(&info->work); -#endif + xb_startio(sc); } static int @@ -810,7 +796,7 @@ blkif_open(struct disk *dp) } sc->xb_flags |= XB_OPEN; - sc->xb_info->users++; + sc->users++; return (0); } @@ -822,11 +808,11 @@ blkif_close(struct disk *dp) if (sc == NULL) return (ENXIO); sc->xb_flags &= ~XB_OPEN; - if (--(sc->xb_info->users) == 0) { + if (--(sc->users) == 0) { /* Check whether we have been instructed to close. We will have ignored this request initially, as the device was still mounted. */ - device_t dev = sc->xb_info->xbdev; + device_t dev = sc->xb_dev; XenbusState state = xenbus_read_driver_state(xenbus_get_otherend_path(dev)); @@ -847,6 +833,18 @@ blkif_ioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td return (ENOTTY); } +static void +xb_free_command(struct xb_command *cm) +{ + + KASSERT((cm->cm_flags & XB_ON_XBQ_MASK) == 0, + ("Freeing command that is still on a queue\n")); + + cm->cm_flags = 0; + cm->bp = NULL; + cm->cm_complete = NULL; + xb_enqueue_free(cm); +} /* * blkif_queue_request @@ -858,106 +856,152 @@ blkif_ioctl(struct disk *dp, u_long cmd, void *addr, int flag, struct thread *td * buffer: buffer to read/write into. this should be a * virtual address in the guest os. */ -static int blkif_queue_request(struct bio *bp) +static struct xb_command * +xb_bio_command(struct xb_softc *sc) { - caddr_t alignbuf; - vm_paddr_t buffer_ma; - blkif_request_t *ring_req; - unsigned long id; - uint64_t fsect, lsect; - struct xb_softc *sc = (struct xb_softc *)bp->bio_disk->d_drv1; - struct blkfront_info *info = sc->xb_info; - int ref; + struct xb_command *cm; + struct bio *bp; - if (unlikely(sc->xb_info->connected != BLKIF_STATE_CONNECTED)) - return 1; + if (unlikely(sc->connected != BLKIF_STATE_CONNECTED)) + return (NULL); - if (gnttab_alloc_grant_references( - BLKIF_MAX_SEGMENTS_PER_REQUEST, &gref_head) < 0) { - gnttab_request_free_callback( - &info->callback, - blkif_restart_queue_callback, - info, - BLKIF_MAX_SEGMENTS_PER_REQUEST); - return 1; + bp = xb_dequeue_bio(sc); + if (bp == NULL) + return (NULL); + + if ((cm = xb_dequeue_free(sc)) == NULL) { + xb_requeue_bio(sc, bp); + return (NULL); } - /* Check if the buffer is properly aligned */ - if ((vm_offset_t)bp->bio_data & PAGE_MASK) { - int align = (bp->bio_bcount < PAGE_SIZE/2) ? XBD_SECTOR_SIZE : - PAGE_SIZE; - caddr_t newbuf = malloc(bp->bio_bcount + align, M_DEVBUF, - M_NOWAIT); + if (gnttab_alloc_grant_references(BLKIF_MAX_SEGMENTS_PER_REQUEST, + &cm->gref_head) < 0) { + gnttab_request_free_callback(&sc->callback, + blkif_restart_queue_callback, sc, + BLKIF_MAX_SEGMENTS_PER_REQUEST); + xb_requeue_bio(sc, bp); + xb_enqueue_free(cm); + sc->xb_flags |= XB_FROZEN; + return (NULL); + } - alignbuf = (char *)roundup2((u_long)newbuf, align); + /* XXX Can we grab refs before doing the load so that the ref can + * be filled out here? + */ + cm->bp = bp; + cm->data = bp->bio_data; + cm->datalen = bp->bio_bcount; + cm->operation = (bp->bio_cmd == BIO_READ) ? BLKIF_OP_READ : + BLKIF_OP_WRITE; + cm->sector_number = (blkif_sector_t)bp->bio_pblkno; - /* save a copy of the current buffer */ - bp->bio_driver1 = newbuf; - bp->bio_driver2 = alignbuf; - - /* Copy the data for a write */ - if (bp->bio_cmd == BIO_WRITE) - bcopy(bp->bio_data, alignbuf, bp->bio_bcount); - } else - alignbuf = bp->bio_data; - - /* Fill out a communications ring structure. */ - ring_req = RING_GET_REQUEST(&info->ring, - info->ring.req_prod_pvt); - id = GET_ID_FROM_FREELIST(info); - info->shadow[id].request = (unsigned long)bp; - - ring_req->id = id; - ring_req->operation = (bp->bio_cmd == BIO_READ) ? BLKIF_OP_READ : - BLKIF_OP_WRITE; - - ring_req->sector_number= (blkif_sector_t)bp->bio_pblkno; - ring_req->handle = (blkif_vdev_t)(uintptr_t)sc->xb_disk; - - ring_req->nr_segments = 0; /* XXX not doing scatter/gather since buffer - * chaining is not supported. - */ - - buffer_ma = vtomach(alignbuf); - fsect = (buffer_ma & PAGE_MASK) >> XBD_SECTOR_SHFT; - lsect = fsect + (bp->bio_bcount >> XBD_SECTOR_SHFT) - 1; - /* install a grant reference. */ - ref = gnttab_claim_grant_reference(&gref_head); - KASSERT( ref != -ENOSPC, ("grant_reference failed") ); - - gnttab_grant_foreign_access_ref( - ref, - xenbus_get_otherend_id(info->xbdev), - buffer_ma >> PAGE_SHIFT, - ring_req->operation & 1 ); /* ??? */ - info->shadow[id].frame[ring_req->nr_segments] = - buffer_ma >> PAGE_SHIFT; - - ring_req->seg[ring_req->nr_segments] = - (struct blkif_request_segment) { - .gref = ref, - .first_sect = fsect, - .last_sect = lsect }; - - ring_req->nr_segments++; - KASSERT((buffer_ma & (XBD_SECTOR_SIZE-1)) == 0, - ("XEN buffer must be sector aligned")); - KASSERT(lsect <= 7, - ("XEN disk driver data cannot cross a page boundary")); - - buffer_ma &= ~PAGE_MASK; - - info->ring.req_prod_pvt++; - - /* Keep a private copy so we can reissue requests when recovering. */ - info->shadow[id].req = *ring_req; - - gnttab_free_grant_references(gref_head); - - return 0; + return (cm); } +static int +blkif_queue_request(struct xb_softc *sc, struct xb_command *cm) +{ + int error; + error = bus_dmamap_load(sc->xb_io_dmat, cm->map, cm->data, cm->datalen, + blkif_queue_cb, cm, 0); + if (error == EINPROGRESS) { + printf("EINPROGRESS\n"); + sc->xb_flags |= XB_FROZEN; + cm->cm_flags |= XB_CMD_FROZEN; + return (0); + } + + return (error); +} + +static void +blkif_queue_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + struct xb_softc *sc; + struct xb_command *cm; + blkif_request_t *ring_req; + vm_paddr_t buffer_ma; + uint64_t fsect, lsect; + int ref, i, op; + + cm = arg; + sc = cm->cm_sc; + + if (error) { + printf("error %d in blkif_queue_cb\n", error); + cm->bp->bio_error = EIO; + biodone(cm->bp); + xb_free_command(cm); + return; + } + + /* Fill out a communications ring structure. */ + ring_req = RING_GET_REQUEST(&sc->ring, sc->ring.req_prod_pvt); + if (ring_req == NULL) { + /* XXX Is this possible? */ + printf("ring_req NULL, requeuing\n"); + xb_enqueue_ready(cm); + return; + } + ring_req->id = cm->req.id; + ring_req->operation = cm->operation; + ring_req->sector_number = cm->sector_number; + ring_req->handle = (blkif_vdev_t)(uintptr_t)sc->xb_disk; + ring_req->nr_segments = nsegs; + + for (i = 0; i < nsegs; i++) { + buffer_ma = segs[i].ds_addr; + fsect = (buffer_ma & PAGE_MASK) >> XBD_SECTOR_SHFT; + lsect = fsect + (segs[i].ds_len >> XBD_SECTOR_SHFT) - 1; + + KASSERT(lsect <= 7, + ("XEN disk driver data cannot cross a page boundary")); + + /* install a grant reference. */ + ref = gnttab_claim_grant_reference(&cm->gref_head); + KASSERT( ref >= 0, ("grant_reference failed") ); + + gnttab_grant_foreign_access_ref( + ref, + xenbus_get_otherend_id(sc->xb_dev), + buffer_ma >> PAGE_SHIFT, + ring_req->operation & 1 ); /* ??? */ + + ring_req->seg[i] = + (struct blkif_request_segment) { + .gref = ref, + .first_sect = fsect, + .last_sect = lsect }; + } + + + if (cm->operation == BLKIF_OP_READ) + op = BUS_DMASYNC_PREREAD; + else if (cm->operation == BLKIF_OP_WRITE) + op = BUS_DMASYNC_PREWRITE; + else + op = 0; + bus_dmamap_sync(sc->xb_io_dmat, cm->map, op); + + sc->ring.req_prod_pvt++; + + /* Keep a private copy so we can reissue requests when recovering. */ + cm->req = *ring_req; + + xb_enqueue_busy(cm); + + gnttab_free_grant_references(cm->gref_head); + + /* + * This flag means that we're probably executing in the busdma swi + * instead of in the startio context, so an explicit flush is needed. + */ + if (cm->cm_flags & XB_CMD_FROZEN) + flush_requests(sc); + + return; +} /* * Dequeue buffers and place them in the shared communication ring. @@ -969,140 +1013,131 @@ static int blkif_queue_request(struct bio *bp) static void xb_startio(struct xb_softc *sc) { - struct bio *bp; - int queued = 0; - struct blkfront_info *info = sc->xb_info; - DPRINTK(""); + struct xb_command *cm; + int error, queued = 0; - mtx_assert(&blkif_io_lock, MA_OWNED); + mtx_assert(&sc->xb_io_lock, MA_OWNED); - while ((bp = bioq_takefirst(&sc->xb_bioq)) != NULL) { + while (!RING_FULL(&sc->ring)) { + if (sc->xb_flags & XB_FROZEN) + break; - if (RING_FULL(&info->ring)) - goto wait; - - if (blkif_queue_request(bp)) { - wait: - bioq_insert_head(&sc->xb_bioq, bp); + cm = xb_dequeue_ready(sc); + + if (cm == NULL) + cm = xb_bio_command(sc); + + if (cm == NULL) + break; + + if ((error = blkif_queue_request(sc, cm)) != 0) { + printf("blkif_queue_request returned %d\n", error); break; } queued++; } if (queued != 0) - flush_requests(sc->xb_info); + flush_requests(sc); } static void blkif_int(void *xsc) { - struct xb_softc *sc = NULL; - struct bio *bp; + struct xb_softc *sc = xsc; + struct xb_command *cm; blkif_response_t *bret; RING_IDX i, rp; - struct blkfront_info *info = xsc; - DPRINTK(""); + int op; - TRACE_ENTER; + mtx_lock(&sc->xb_io_lock); - mtx_lock(&blkif_io_lock); - - if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) { - mtx_unlock(&blkif_io_lock); + if (unlikely(sc->connected != BLKIF_STATE_CONNECTED)) { + mtx_unlock(&sc->xb_io_lock); return; } again: - rp = info->ring.sring->rsp_prod; + rp = sc->ring.sring->rsp_prod; rmb(); /* Ensure we see queued responses up to 'rp'. */ - for (i = info->ring.rsp_cons; i != rp; i++) { - unsigned long id; + for (i = sc->ring.rsp_cons; i != rp; i++) { + bret = RING_GET_RESPONSE(&sc->ring, i); + cm = &sc->shadow[bret->id]; - bret = RING_GET_RESPONSE(&info->ring, i); - id = bret->id; - bp = (struct bio *)info->shadow[id].request; + xb_remove_busy(cm); + blkif_completion(cm); - blkif_completion(&info->shadow[id]); + if (cm->operation == BLKIF_OP_READ) + op = BUS_DMASYNC_POSTREAD; + else if (cm->operation == BLKIF_OP_WRITE) + op = BUS_DMASYNC_POSTWRITE; + else + op = 0; + bus_dmamap_sync(sc->xb_io_dmat, cm->map, op); + bus_dmamap_unload(sc->xb_io_dmat, cm->map); - ADD_ID_TO_FREELIST(info, id); + /* + * If commands are completing then resources are probably + * being freed as well. It's a cheap assumption even when + * wrong. + */ + sc->xb_flags &= ~XB_FROZEN; - switch (bret->operation) { - case BLKIF_OP_READ: - /* had an unaligned buffer that needs to be copied */ - if (bp->bio_driver1) - bcopy(bp->bio_driver2, bp->bio_data, bp->bio_bcount); - /* FALLTHROUGH */ - case BLKIF_OP_WRITE: - - /* free the copy buffer */ - if (bp->bio_driver1) { - free(bp->bio_driver1, M_DEVBUF); - bp->bio_driver1 = NULL; - } - - if ( unlikely(bret->status != BLKIF_RSP_OKAY) ) { - printf("Bad return from blkdev data request: %x\n", - bret->status); - bp->bio_flags |= BIO_ERROR; - } - - sc = (struct xb_softc *)bp->bio_disk->d_drv1; - - if (bp->bio_flags & BIO_ERROR) - bp->bio_error = EIO; - else - bp->bio_resid = 0; - - biodone(bp); - break; - default: - panic("received invalid operation"); - break; - } + /* + * Directly call the i/o complete routine to save an + * an indirection in the common case. + */ + cm->status = bret->status; + if (cm->bp) + xb_bio_complete(sc, cm); + else if (cm->cm_complete) + (cm->cm_complete)(cm); + else + xb_free_command(cm); } - info->ring.rsp_cons = i; + sc->ring.rsp_cons = i; - if (i != info->ring.req_prod_pvt) { + if (i != sc->ring.req_prod_pvt) { int more_to_do; - RING_FINAL_CHECK_FOR_RESPONSES(&info->ring, more_to_do); + RING_FINAL_CHECK_FOR_RESPONSES(&sc->ring, more_to_do); if (more_to_do) goto again; } else { - info->ring.sring->rsp_event = i + 1; + sc->ring.sring->rsp_event = i + 1; } - kick_pending_request_queues(info); + xb_startio(sc); - mtx_unlock(&blkif_io_lock); + mtx_unlock(&sc->xb_io_lock); } static void -blkif_free(struct blkfront_info *info, int suspend) +blkif_free(struct xb_softc *sc, int suspend) { /* Prevent new requests being issued until we fix things up. */ - mtx_lock(&blkif_io_lock); - info->connected = suspend ? + mtx_lock(&sc->xb_io_lock); + sc->connected = suspend ? BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED; - mtx_unlock(&blkif_io_lock); + mtx_unlock(&sc->xb_io_lock); /* Free resources associated with old device channel. */ - if (info->ring_ref != GRANT_INVALID_REF) { - gnttab_end_foreign_access(info->ring_ref, - info->ring.sring); - info->ring_ref = GRANT_INVALID_REF; - info->ring.sring = NULL; + if (sc->ring_ref != GRANT_INVALID_REF) { + gnttab_end_foreign_access(sc->ring_ref, + sc->ring.sring); + sc->ring_ref = GRANT_INVALID_REF; + sc->ring.sring = NULL; } - if (info->irq) - unbind_from_irqhandler(info->irq); - info->irq = 0; + if (sc->irq) + unbind_from_irqhandler(sc->irq); + sc->irq = 0; } static void -blkif_completion(struct blk_shadow *s) +blkif_completion(struct xb_command *s) { int i; @@ -1111,70 +1146,16 @@ blkif_completion(struct blk_shadow *s) } static void -blkif_recover(struct blkfront_info *info) +blkif_recover(struct xb_softc *sc) { - int i, j; - blkif_request_t *req; - struct blk_shadow *copy; - - if (!info->sc) - return; - - /* Stage 1: Make a safe copy of the shadow state. */ - copy = (struct blk_shadow *)malloc(sizeof(info->shadow), M_DEVBUF, M_NOWAIT|M_ZERO); - memcpy(copy, info->shadow, sizeof(info->shadow)); - - /* Stage 2: Set up free list. */ - memset(&info->shadow, 0, sizeof(info->shadow)); - for (i = 0; i < BLK_RING_SIZE; i++) - info->shadow[i].req.id = i+1; - info->shadow_free = info->ring.req_prod_pvt; - info->shadow[BLK_RING_SIZE-1].req.id = 0x0fffffff; - - /* Stage 3: Find pending requests and requeue them. */ - for (i = 0; i < BLK_RING_SIZE; i++) { - /* Not in use? */ - if (copy[i].request == 0) - continue; - - /* Grab a request slot and copy shadow state into it. */ - req = RING_GET_REQUEST( - &info->ring, info->ring.req_prod_pvt); - *req = copy[i].req; - - /* We get a new request id, and must reset the shadow state. */ - req->id = GET_ID_FROM_FREELIST(info); - memcpy(&info->shadow[req->id], ©[i], sizeof(copy[i])); - - /* Rewrite any grant references invalidated by suspend/resume. */ - for (j = 0; j < req->nr_segments; j++) - gnttab_grant_foreign_access_ref( - req->seg[j].gref, - xenbus_get_otherend_id(info->xbdev), - pfn_to_mfn(info->shadow[req->id].frame[j]), - 0 /* assume not readonly */); - - info->shadow[req->id].req = *req; - - info->ring.req_prod_pvt++; - } - - free(copy, M_DEVBUF); - - xenbus_set_state(info->xbdev, XenbusStateConnected); - - /* Now safe for us to use the shared ring */ - mtx_lock(&blkif_io_lock); - info->connected = BLKIF_STATE_CONNECTED; - mtx_unlock(&blkif_io_lock); - - /* Send off requeued requests */ - mtx_lock(&blkif_io_lock); - flush_requests(info); - - /* Kick any other new requests queued since we resumed */ - kick_pending_request_queues(info); - mtx_unlock(&blkif_io_lock); + /* + * XXX The whole concept of not quiescing and completing all i/o + * during suspend, and then hoping to recover and replay the + * resulting abandoned I/O during resume, is laughable. At best, + * it invalidates the i/o ordering rules required by just about + * every filesystem, and at worst it'll corrupt data. The code + * has been removed until further notice. + */ } /* ** Driver registration ** */ @@ -1196,11 +1177,8 @@ static device_method_t blkfront_methods[] = { static driver_t blkfront_driver = { "xbd", blkfront_methods, - sizeof(struct blkfront_info), + sizeof(struct xb_softc), }; devclass_t blkfront_devclass; DRIVER_MODULE(xbd, xenbus, blkfront_driver, blkfront_devclass, 0, 0); - -MTX_SYSINIT(ioreq, &blkif_io_lock, "BIO LOCK", MTX_NOWITNESS); /* XXX how does one enroll a lock? */ - diff --git a/sys/dev/xen/blkfront/block.h b/sys/dev/xen/blkfront/block.h index 97dfe7e7d0bc..32bfc96a095a 100644 --- a/sys/dev/xen/blkfront/block.h +++ b/sys/dev/xen/blkfront/block.h @@ -1,12 +1,30 @@ /* - * + * XenBSD block device driver + * + * Copyright (c) 2009 Scott Long, Yahoo! + * Copyright (c) 2009 Frank Suchomel, Citrix + * Copyright (c) 2009 Doug F. Rabson, Citrix + * Copyright (c) 2005 Kip Macy + * Copyright (c) 2003-2004, Keir Fraser & Steve Hand + * Modifications by Mark A. Williamson are (c) Intel Research Cambridge + * + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * $FreeBSD$ */ @@ -32,66 +50,208 @@ struct xlbd_major_info struct xlbd_type_info *type; }; -struct blk_shadow { - blkif_request_t req; - unsigned long request; - unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST]; +struct xb_command { + TAILQ_ENTRY(xb_command) cm_link; + struct xb_softc *cm_sc; + u_int cm_flags; +#define XB_CMD_FROZEN (1<<0) +#define XB_CMD_POLLED (1<<1) +#define XB_ON_XBQ_FREE (1<<2) +#define XB_ON_XBQ_READY (1<<3) +#define XB_ON_XBQ_BUSY (1<<4) +#define XB_ON_XBQ_COMPLETE (1<<5) +#define XB_ON_XBQ_MASK ((1<<2)|(1<<3)|(1<<4)|(1<<5)) + bus_dmamap_t map; + blkif_request_t req; + struct bio *bp; + grant_ref_t gref_head; + void *data; + size_t datalen; + int operation; + blkif_sector_t sector_number; + int status; + void (* cm_complete)(struct xb_command *); }; #define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE) +#define XBQ_FREE 0 +#define XBQ_BIO 1 +#define XBQ_READY 2 +#define XBQ_BUSY 3 +#define XBQ_COMPLETE 4 +#define XBQ_COUNT 5 -struct xb_softc { - device_t xb_dev; - struct disk *xb_disk; /* disk params */ - struct bio_queue_head xb_bioq; /* sort queue */ - int xb_unit; - int xb_flags; - struct blkfront_info *xb_info; - LIST_ENTRY(xb_softc) entry; -#define XB_OPEN (1<<0) /* drive is open (can't shut down) */ +struct xb_qstat { + uint32_t q_length; + uint32_t q_max; }; +union xb_statrequest { + uint32_t ms_item; + struct xb_qstat ms_qstat; +}; /* - * We have one of these per vbd, whether ide, scsi or 'other'. They - * hang in private_data off the gendisk structure. We may end up - * putting all kinds of interesting stuff here :-) + * We have one of these per vbd, whether ide, scsi or 'other'. */ -struct blkfront_info -{ - device_t xbdev; - dev_t dev; - struct gendisk *gd; - int vdevice; - blkif_vdev_t handle; - int connected; - int ring_ref; - blkif_front_ring_t ring; - unsigned int irq; - struct xlbd_major_info *mi; -#if 0 - request_queue_t *rq; - struct work_struct work; -#endif - struct gnttab_free_callback callback; - struct blk_shadow shadow[BLK_RING_SIZE]; - unsigned long shadow_free; - struct xb_softc *sc; - int feature_barrier; - int is_ready; +struct xb_softc { + device_t xb_dev; + struct disk *xb_disk; /* disk params */ + struct bio_queue_head xb_bioq; /* sort queue */ + int xb_unit; + int xb_flags; +#define XB_OPEN (1<<0) /* drive is open (can't shut down) */ +#define XB_BARRIER (1 << 1) /* backend supports barriers */ +#define XB_READY (1 << 2) /* Is ready */ +#define XB_FROZEN (1 << 3) /* Waiting for resources */ + int vdevice; + blkif_vdev_t handle; + int connected; + int ring_ref; + blkif_front_ring_t ring; + unsigned int irq; + struct xlbd_major_info *mi; + struct gnttab_free_callback callback; + TAILQ_HEAD(,xb_command) cm_free; + TAILQ_HEAD(,xb_command) cm_ready; + TAILQ_HEAD(,xb_command) cm_busy; + TAILQ_HEAD(,xb_command) cm_complete; + struct xb_qstat xb_qstat[XBQ_COUNT]; + bus_dma_tag_t xb_io_dmat; + /** * The number of people holding this device open. We won't allow a * hot-unplug unless this is 0. */ - int users; + int users; + struct mtx xb_io_lock; + struct xb_command shadow[BLK_RING_SIZE]; }; -/* Note that xlvbd_add doesn't call add_disk for you: you're expected - to call add_disk on info->gd once the disk is properly connected - up. */ -int xlvbd_add(device_t, blkif_sector_t capacity, int device, - uint16_t vdisk_info, uint16_t sector_size, struct blkfront_info *info); -void xlvbd_del(struct blkfront_info *info); + +int xlvbd_add(struct xb_softc *, blkif_sector_t capacity, int device, + uint16_t vdisk_info, uint16_t sector_size); +void xlvbd_del(struct xb_softc *); + +#define XBQ_ADD(sc, qname) \ + do { \ + struct xb_qstat *qs; \ + \ + qs = &(sc)->xb_qstat[qname]; \ + qs->q_length++; \ + if (qs->q_length > qs->q_max) \ + qs->q_max = qs->q_length; \ + } while (0) + +#define XBQ_REMOVE(sc, qname) (sc)->xb_qstat[qname].q_length-- + +#define XBQ_INIT(sc, qname) \ + do { \ + sc->xb_qstat[qname].q_length = 0; \ + sc->xb_qstat[qname].q_max = 0; \ + } while (0) + +#define XBQ_COMMAND_QUEUE(name, index) \ + static __inline void \ + xb_initq_ ## name (struct xb_softc *sc) \ + { \ + TAILQ_INIT(&sc->cm_ ## name); \ + XBQ_INIT(sc, index); \ + } \ + static __inline void \ + xb_enqueue_ ## name (struct xb_command *cm) \ + { \ + if ((cm->cm_flags & XB_ON_XBQ_MASK) != 0) { \ + printf("command %p is on another queue, " \ + "flags = %#x\n", cm, cm->cm_flags); \ + panic("command is on another queue"); \ + } \ + TAILQ_INSERT_TAIL(&cm->cm_sc->cm_ ## name, cm, cm_link); \ + cm->cm_flags |= XB_ON_ ## index; \ + XBQ_ADD(cm->cm_sc, index); \ + } \ + static __inline void \ + xb_requeue_ ## name (struct xb_command *cm) \ + { \ + if ((cm->cm_flags & XB_ON_XBQ_MASK) != 0) { \ + printf("command %p is on another queue, " \ + "flags = %#x\n", cm, cm->cm_flags); \ + panic("command is on another queue"); \ + } \ + TAILQ_INSERT_HEAD(&cm->cm_sc->cm_ ## name, cm, cm_link); \ + cm->cm_flags |= XB_ON_ ## index; \ + XBQ_ADD(cm->cm_sc, index); \ + } \ + static __inline struct xb_command * \ + xb_dequeue_ ## name (struct xb_softc *sc) \ + { \ + struct xb_command *cm; \ + \ + if ((cm = TAILQ_FIRST(&sc->cm_ ## name)) != NULL) { \ + if ((cm->cm_flags & XB_ON_ ## index) == 0) { \ + printf("command %p not in queue, " \ + "flags = %#x, bit = %#x\n", cm, \ + cm->cm_flags, XB_ON_ ## index); \ + panic("command not in queue"); \ + } \ + TAILQ_REMOVE(&sc->cm_ ## name, cm, cm_link); \ + cm->cm_flags &= ~XB_ON_ ## index; \ + XBQ_REMOVE(sc, index); \ + } \ + return (cm); \ + } \ + static __inline void \ + xb_remove_ ## name (struct xb_command *cm) \ + { \ + if ((cm->cm_flags & XB_ON_ ## index) == 0) { \ + printf("command %p not in queue, flags = %#x, " \ + "bit = %#x\n", cm, cm->cm_flags, \ + XB_ON_ ## index); \ + panic("command not in queue"); \ + } \ + TAILQ_REMOVE(&cm->cm_sc->cm_ ## name, cm, cm_link); \ + cm->cm_flags &= ~XB_ON_ ## index; \ + XBQ_REMOVE(cm->cm_sc, index); \ + } \ +struct hack + +XBQ_COMMAND_QUEUE(free, XBQ_FREE); +XBQ_COMMAND_QUEUE(ready, XBQ_READY); +XBQ_COMMAND_QUEUE(busy, XBQ_BUSY); +XBQ_COMMAND_QUEUE(complete, XBQ_COMPLETE); + +static __inline void +xb_initq_bio(struct xb_softc *sc) +{ + bioq_init(&sc->xb_bioq); + XBQ_INIT(sc, XBQ_BIO); +} + +static __inline void +xb_enqueue_bio(struct xb_softc *sc, struct bio *bp) +{ + bioq_insert_tail(&sc->xb_bioq, bp); + XBQ_ADD(sc, XBQ_BIO); +} + +static __inline void +xb_requeue_bio(struct xb_softc *sc, struct bio *bp) +{ + bioq_insert_head(&sc->xb_bioq, bp); + XBQ_ADD(sc, XBQ_BIO); +} + +static __inline struct bio * +xb_dequeue_bio(struct xb_softc *sc) +{ + struct bio *bp; + + if ((bp = bioq_first(&sc->xb_bioq)) != NULL) { + bioq_remove(&sc->xb_bioq, bp); + XBQ_REMOVE(sc, XBQ_BIO); + } + return (bp); +} #endif /* __XEN_DRIVERS_BLOCK_H__ */ diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c index df5c3ee59075..8f765e20c653 100644 --- a/sys/dev/xen/console/console.c +++ b/sys/dev/xen/console/console.c @@ -132,7 +132,6 @@ xc_cngetc(struct consdev *dev) CN_LOCK(cn_mtx); if ((rp - rc)) { - /* if (kdb_active) printf("%s:%d\n", __func__, __LINE__); */ /* we need to return only one char */ ret = (int)rbuf[RBUF_MASK(rc)]; rc++; diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c index 571ecd0e3c0a..d67d3544384e 100644 --- a/sys/dev/xen/netfront/netfront.c +++ b/sys/dev/xen/netfront/netfront.c @@ -81,7 +81,7 @@ __FBSDID("$FreeBSD$"); #include "xenbus_if.h" -#define XN_CSUM_FEATURES (CSUM_TCP | CSUM_UDP | CSUM_TSO) +#define XN_CSUM_FEATURES (CSUM_TCP | CSUM_UDP) #define GRANT_INVALID_REF 0 @@ -155,6 +155,9 @@ static void netif_disconnect_backend(struct netfront_info *info); static int setup_device(device_t dev, struct netfront_info *info); static void end_access(int ref, void *page); +static int xn_ifmedia_upd(struct ifnet *ifp); +static void xn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr); + /* Xenolinux helper functions */ int network_connect(struct netfront_info *); @@ -230,7 +233,7 @@ struct netfront_info { struct mtx tx_lock; struct mtx rx_lock; - struct sx sc_lock; + struct mtx sc_lock; u_int handle; u_int irq; @@ -240,7 +243,9 @@ struct netfront_info { /* Receive-ring batched refills. */ #define RX_MIN_TARGET 32 #define RX_MAX_TARGET NET_RX_RING_SIZE - int rx_min_target, rx_max_target, rx_target; + int rx_min_target; + int rx_max_target; + int rx_target; /* * {tx,rx}_skbs store outstanding skbuffs. The first entry in each @@ -253,19 +258,20 @@ struct netfront_info { grant_ref_t grant_rx_ref[NET_TX_RING_SIZE + 1]; #define TX_MAX_TARGET min(NET_RX_RING_SIZE, 256) - device_t xbdev; - int tx_ring_ref; - int rx_ring_ref; - uint8_t mac[ETHER_ADDR_LEN]; + device_t xbdev; + int tx_ring_ref; + int rx_ring_ref; + uint8_t mac[ETHER_ADDR_LEN]; struct xn_chain_data xn_cdata; /* mbufs */ - struct mbuf_head xn_rx_batch; /* head of the batch queue */ + struct mbuf_head xn_rx_batch; /* head of the batch queue */ int xn_if_flags; struct callout xn_stat_ch; - u_long rx_pfn_array[NET_RX_RING_SIZE]; - multicall_entry_t rx_mcl[NET_RX_RING_SIZE+1]; - mmu_update_t rx_mmu[NET_RX_RING_SIZE]; + u_long rx_pfn_array[NET_RX_RING_SIZE]; + multicall_entry_t rx_mcl[NET_RX_RING_SIZE+1]; + mmu_update_t rx_mmu[NET_RX_RING_SIZE]; + struct ifmedia sc_media; }; #define rx_mbufs xn_cdata.xn_rx_chain @@ -274,7 +280,7 @@ struct netfront_info { #define XN_LOCK_INIT(_sc, _name) \ mtx_init(&(_sc)->tx_lock, #_name"_tx", "network transmit lock", MTX_DEF); \ mtx_init(&(_sc)->rx_lock, #_name"_rx", "network receive lock", MTX_DEF); \ - sx_init(&(_sc)->sc_lock, #_name"_rx") + mtx_init(&(_sc)->sc_lock, #_name"_sc", "netfront softc lock", MTX_DEF) #define XN_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_lock) #define XN_RX_UNLOCK(_sc) mtx_unlock(&(_sc)->rx_lock) @@ -282,15 +288,15 @@ struct netfront_info { #define XN_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_lock) #define XN_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->tx_lock) -#define XN_LOCK(_sc) sx_xlock(&(_sc)->sc_lock); -#define XN_UNLOCK(_sc) sx_xunlock(&(_sc)->sc_lock); +#define XN_LOCK(_sc) mtx_lock(&(_sc)->sc_lock); +#define XN_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_lock); -#define XN_LOCK_ASSERT(_sc) sx_assert(&(_sc)->sc_lock, SX_LOCKED); +#define XN_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_lock, MA_OWNED); #define XN_RX_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->rx_lock, MA_OWNED); #define XN_TX_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->tx_lock, MA_OWNED); #define XN_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_lock); \ mtx_destroy(&(_sc)->tx_lock); \ - sx_destroy(&(_sc)->sc_lock); + mtx_destroy(&(_sc)->sc_lock); struct netfront_rx_info { struct netif_rx_response rx; @@ -355,9 +361,13 @@ xennet_get_rx_ref(struct netfront_info *np, RING_IDX ri) #define IPRINTK(fmt, args...) \ printf("[XEN] " fmt, ##args) +#ifdef INVARIANTS #define WPRINTK(fmt, args...) \ printf("[XEN] " fmt, ##args) -#if 0 +#else +#define WPRINTK(fmt, args...) +#endif +#ifdef DEBUG #define DPRINTK(fmt, args...) \ printf("[XEN] %s: " fmt, __func__, ##args) #else @@ -1056,7 +1066,6 @@ xn_txeof(struct netfront_info *np) return; ifp = np->xn_ifp; - ifp->if_timer = 0; do { prod = np->tx.sring->rsp_prod; @@ -1080,7 +1089,7 @@ xn_txeof(struct netfront_info *np) ifp->if_opackets++; if (unlikely(gnttab_query_foreign_access( np->grant_tx_ref[id]) != 0)) { - printf("network_tx_buf_gc: warning " + WPRINTK("network_tx_buf_gc: warning " "-- grant still in use by backend " "domain.\n"); goto out; @@ -1255,7 +1264,7 @@ xennet_get_responses(struct netfront_info *np, u_long mfn; #if 0 - printf("rx->status=%hd rx->offset=%hu frags=%u\n", + DPRINTK("rx->status=%hd rx->offset=%hu frags=%u\n", rx->status, rx->offset, frags); #endif if (unlikely(rx->status < 0 || @@ -1469,7 +1478,7 @@ xn_start_locked(struct ifnet *ifp) * slot [0] free for the freelist head */ if (sc->xn_cdata.xn_tx_chain_cnt + nfrags >= NET_TX_RING_SIZE) { - printf("xn_start_locked: xn_tx_chain_cnt (%d) + nfrags %d >= NET_TX_RING_SIZE (%d); must be full!\n", + WPRINTK("xn_start_locked: xn_tx_chain_cnt (%d) + nfrags %d >= NET_TX_RING_SIZE (%d); must be full!\n", (int) sc->xn_cdata.xn_tx_chain_cnt, (int) nfrags, (int) NET_TX_RING_SIZE); IF_PREPEND(&ifp->if_snd, m_head); @@ -1485,7 +1494,7 @@ xn_start_locked(struct ifnet *ifp) * the required size. */ if (RING_FREE_REQUESTS(&sc->tx) < (nfrags + 1)) { - printf("xn_start_locked: free ring slots (%d) < (nfrags + 1) (%d); must be full!\n", + WPRINTK("xn_start_locked: free ring slots (%d) < (nfrags + 1) (%d); must be full!\n", (int) RING_FREE_REQUESTS(&sc->tx), (int) (nfrags + 1)); IF_PREPEND(&ifp->if_snd, m_head); @@ -1623,6 +1632,7 @@ xn_ifinit_locked(struct netfront_info *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_link_state_change(ifp, LINK_STATE_UP); callout_reset(&sc->xn_stat_ch, hz, xn_tick, sc); @@ -1762,7 +1772,7 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) /* FALLTHROUGH */ case SIOCSIFMEDIA: case SIOCGIFMEDIA: - error = EINVAL; + error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd); break; default: error = ether_ioctl(ifp, cmd, data); @@ -1786,6 +1796,7 @@ xn_stop(struct netfront_info *sc) xn_free_tx_ring(sc); ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + if_link_state_change(ifp, LINK_STATE_DOWN); } /* START of Xenolinux helper functions adapted to FreeBSD */ @@ -1814,7 +1825,6 @@ network_connect(struct netfront_info *np) np->copying_receiver = ((MODPARM_rx_copy && feature_rx_copy) || (MODPARM_rx_flip && !feature_rx_flip)); - XN_LOCK(np); /* Recovery procedure: */ error = talk_to_backend(np->xbdev, np); if (error) @@ -1864,7 +1874,6 @@ network_connect(struct netfront_info *np) xn_txeof(np); XN_TX_UNLOCK(np); network_alloc_rx_buffers(np); - XN_UNLOCK(np); return (0); } @@ -1904,6 +1913,11 @@ create_netdev(device_t dev) np->xbdev = dev; XN_LOCK_INIT(np, xennetif); + + ifmedia_init(&np->sc_media, 0, xn_ifmedia_upd, xn_ifmedia_sts); + ifmedia_add(&np->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL); + ifmedia_set(&np->sc_media, IFM_ETHER|IFM_MANUAL); + np->rx_target = RX_MIN_TARGET; np->rx_min_target = RX_MIN_TARGET; np->rx_max_target = RX_MAX_TARGET; @@ -1920,14 +1934,14 @@ create_netdev(device_t dev) /* A grant for every tx ring slot */ if (gnttab_alloc_grant_references(TX_MAX_TARGET, &np->gref_tx_head) < 0) { - printf("#### netfront can't alloc tx grant refs\n"); + IPRINTK("#### netfront can't alloc tx grant refs\n"); err = ENOMEM; goto exit; } /* A grant for every rx ring slot */ if (gnttab_alloc_grant_references(RX_MAX_TARGET, &np->gref_rx_head) < 0) { - printf("#### netfront can't alloc rx grant refs\n"); + WPRINTK("#### netfront can't alloc rx grant refs\n"); gnttab_free_grant_references(np->gref_tx_head); err = ENOMEM; goto exit; @@ -1958,7 +1972,6 @@ create_netdev(device_t dev) ifp->if_hwassist = XN_CSUM_FEATURES; ifp->if_capabilities = IFCAP_HWCSUM; #if __FreeBSD_version >= 700000 - ifp->if_capabilities |= IFCAP_TSO4; if (xn_enable_lro) { int err = tcp_lro_init(&np->xn_lro); if (err) { @@ -1991,7 +2004,8 @@ out: * acknowledgement. */ #if 0 -static void netfront_closing(device_t dev) +static void +netfront_closing(device_t dev) { #if 0 struct netfront_info *info = dev->dev_driver_data; @@ -2004,7 +2018,8 @@ static void netfront_closing(device_t dev) } #endif -static int netfront_detach(device_t dev) +static int +netfront_detach(device_t dev) { struct netfront_info *info = device_get_softc(dev); @@ -2015,8 +2030,8 @@ static int netfront_detach(device_t dev) return 0; } - -static void netif_free(struct netfront_info *info) +static void +netif_free(struct netfront_info *info) { netif_disconnect_backend(info); #if 0 @@ -2024,7 +2039,8 @@ static void netif_free(struct netfront_info *info) #endif } -static void netif_disconnect_backend(struct netfront_info *info) +static void +netif_disconnect_backend(struct netfront_info *info) { XN_RX_LOCK(info); XN_TX_LOCK(info); @@ -2046,12 +2062,26 @@ static void netif_disconnect_backend(struct netfront_info *info) } -static void end_access(int ref, void *page) +static void +end_access(int ref, void *page) { if (ref != GRANT_INVALID_REF) gnttab_end_foreign_access(ref, page); } +static int +xn_ifmedia_upd(struct ifnet *ifp) +{ + return (0); +} + +static void +xn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + ifmr->ifm_status = IFM_AVALID|IFM_ACTIVE; + ifmr->ifm_active = IFM_ETHER|IFM_MANUAL; +} + /* ** Driver registration ** */ static device_method_t netfront_methods[] = { /* Device interface */ diff --git a/sys/dev/xl/if_xl.c b/sys/dev/xl/if_xl.c index 3b330a907917..05150af2b7f5 100644 --- a/sys/dev/xl/if_xl.c +++ b/sys/dev/xl/if_xl.c @@ -929,7 +929,7 @@ xl_reset(struct xl_softc *sc) /* * If we're using memory mapped register mode, pause briefly * after issuing the reset command before trying to access any - * other registers. With my 3c575C cardbus card, failing to do + * other registers. With my 3c575C CardBus card, failing to do * this results in the system locking up while trying to poll * the command busy bit in the status register. */ @@ -1392,7 +1392,7 @@ xl_attach(device_t dev) * Figure out the card type. 3c905B adapters have the * 'supportsNoTxLength' bit set in the capabilities * word in the EEPROM. - * Note: my 3c575C cardbus card lies. It returns a value + * Note: my 3c575C CardBus card lies. It returns a value * of 0x1578 for its capabilities word, which is somewhat * nonsensical. Another way to distinguish a 3c90x chip * from a 3c90xB/C chip is to check for the 'supportsLargePackets' diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c index b4c65e109291..e27daf8bb046 100644 --- a/sys/fs/cd9660/cd9660_vfsops.c +++ b/sys/fs/cd9660/cd9660_vfsops.c @@ -589,17 +589,19 @@ cd9660_fhtovp(mp, fhp, vpp) struct fid *fhp; struct vnode **vpp; { - struct ifid *ifhp = (struct ifid *)fhp; + struct ifid ifh; struct iso_node *ip; struct vnode *nvp; int error; + memcpy(&ifh, fhp, sizeof(ifh)); + #ifdef ISOFS_DBG printf("fhtovp: ino %d, start %ld\n", - ifhp->ifid_ino, ifhp->ifid_start); + ifh.ifid_ino, ifh.ifid_start); #endif - if ((error = VFS_VGET(mp, ifhp->ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) { + if ((error = VFS_VGET(mp, ifh.ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) { *vpp = NULLVP; return (error); } diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c index 55ea46b57e36..5f4780f936bb 100644 --- a/sys/fs/cd9660/cd9660_vnops.c +++ b/sys/fs/cd9660/cd9660_vnops.c @@ -819,20 +819,25 @@ cd9660_vptofh(ap) struct fid *a_fhp; } */ *ap; { + struct ifid ifh; struct iso_node *ip = VTOI(ap->a_vp); - struct ifid *ifhp; - ifhp = (struct ifid *)ap->a_fhp; - ifhp->ifid_len = sizeof(struct ifid); + ifh.ifid_len = sizeof(struct ifid); - ifhp->ifid_ino = ip->i_number; - ifhp->ifid_start = ip->iso_start; + ifh.ifid_ino = ip->i_number; + ifh.ifid_start = ip->iso_start; + /* + * This intentionally uses sizeof(ifh) in order to not copy stack + * garbage on ILP32. + */ + memcpy(ap->a_fhp, &ifh, sizeof(ifh)); #ifdef ISOFS_DBG printf("vptofh: ino %d, start %ld\n", - ifhp->ifid_ino,ifhp->ifid_start); + ifh.ifid_ino, ifh.ifid_start); #endif - return 0; + + return (0); } /* diff --git a/sys/fs/devfs/devfs_devs.c b/sys/fs/devfs/devfs_devs.c index c4b9713c2bba..81b2752583e0 100644 --- a/sys/fs/devfs/devfs_devs.c +++ b/sys/fs/devfs/devfs_devs.c @@ -72,8 +72,8 @@ SYSCTL_UINT(_vfs_devfs, OID_AUTO, rule_depth, CTLFLAG_RW, &devfs_rule_depth, 0, "Max depth of ruleset include"); /* - * Helper sysctl for devname(3). We're given a struct cdev * and return - * the name, if any, registered by the device driver. + * Helper sysctl for devname(3). We're given a dev_t and return the + * name, if any, registered by the device driver. */ static int sysctl_devname(SYSCTL_HANDLER_ARGS) @@ -81,23 +81,26 @@ sysctl_devname(SYSCTL_HANDLER_ARGS) int error; dev_t ud; struct cdev_priv *cdp; + struct cdev *dev; error = SYSCTL_IN(req, &ud, sizeof (ud)); if (error) return (error); if (ud == NODEV) - return(EINVAL); -/* - ud ^ devfs_random(); -*/ + return (EINVAL); + dev = NULL; dev_lock(); TAILQ_FOREACH(cdp, &cdevp_list, cdp_list) - if (cdp->cdp_inode == ud) + if (cdp->cdp_inode == ud) { + dev = &cdp->cdp_c; + dev_refl(dev); break; + } dev_unlock(); - if (cdp == NULL) - return(ENOENT); - return(SYSCTL_OUT(req, cdp->cdp_c.si_name, strlen(cdp->cdp_c.si_name) + 1)); + if (dev == NULL) + return (ENOENT); + error = SYSCTL_OUT(req, dev->si_name, strlen(dev->si_name) + 1); + dev_rel(dev); return (error); } diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 3d6e0f0330da..4c059cd840c5 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -436,14 +436,14 @@ devfs_access(struct vop_access_args *ap) error = vaccess(vp->v_type, de->de_mode, de->de_uid, de->de_gid, ap->a_accmode, ap->a_cred, NULL); - if (!error) - return (error); + if (error == 0) + return (0); if (error != EACCES) return (error); /* We do, however, allow access to the controlling terminal */ if (!(ap->a_td->td_proc->p_flag & P_CONTROLT)) return (error); - if (ap->a_td->td_proc->p_session->s_ttyvp == de->de_vnode) + if (ap->a_td->td_proc->p_session->s_ttydp == de->de_cdp) return (0); return (error); } @@ -474,6 +474,7 @@ devfs_close(struct vop_close_args *ap) VI_LOCK(vp); if (count_dev(dev) == 2 && (vp->v_iflag & VI_DOOMED) == 0) { td->td_proc->p_session->s_ttyvp = NULL; + td->td_proc->p_session->s_ttydp = NULL; oldvp = vp; } VI_UNLOCK(vp); @@ -675,6 +676,7 @@ devfs_ioctl_f(struct file *fp, u_long com, void *data, struct ucred *cred, struc VREF(vp); SESS_LOCK(td->td_proc->p_session); td->td_proc->p_session->s_ttyvp = vp; + td->td_proc->p_session->s_ttydp = cdev2priv(dev); SESS_UNLOCK(td->td_proc->p_session); sx_sunlock(&proctree_lock); @@ -708,10 +710,11 @@ devfs_kqfilter_f(struct file *fp, struct knote *kn) } static inline int -devfs_prison_check(struct devfs_dirent *de, struct ucred *tcr) +devfs_prison_check(struct devfs_dirent *de, struct thread *td) { struct cdev_priv *cdp; struct ucred *dcr; + int error; cdp = de->de_cdp; if (cdp == NULL) @@ -720,7 +723,15 @@ devfs_prison_check(struct devfs_dirent *de, struct ucred *tcr) if (dcr == NULL) return (0); - return (prison_check(tcr, dcr)); + error = prison_check(td->td_ucred, dcr); + if (error == 0) + return (0); + /* We do, however, allow access to the controlling terminal */ + if (!(td->td_proc->p_flag & P_CONTROLT)) + return (error); + if (td->td_proc->p_session->s_ttydp == cdp) + return (0); + return (error); } static int @@ -848,7 +859,7 @@ devfs_lookupx(struct vop_lookup_args *ap, int *dm_unlock) return (ENOENT); } - if (devfs_prison_check(de, td->td_ucred)) + if (devfs_prison_check(de, td)) return (ENOENT); if ((cnp->cn_nameiop == DELETE) && (flags & ISLASTCN)) { @@ -1126,7 +1137,7 @@ devfs_readdir(struct vop_readdir_args *ap) KASSERT(dd->de_cdp != (void *)0xdeadc0de, ("%s %d\n", __func__, __LINE__)); if (dd->de_flags & DE_WHITEOUT) continue; - if (devfs_prison_check(dd, ap->a_cred)) + if (devfs_prison_check(dd, uio->uio_td)) continue; if (dd->de_dirent->d_type == DT_DIR) de = dd->de_dir; diff --git a/sys/fs/ext2fs/ext2_alloc.c b/sys/fs/ext2fs/ext2_alloc.c new file mode 100644 index 000000000000..1095100aa9b6 --- /dev/null +++ b/sys/fs/ext2fs/ext2_alloc.c @@ -0,0 +1,973 @@ +/*- + * modified for Lites 1.1 + * + * Aug 1995, Godmar Back (gback@cs.utah.edu) + * University of Utah, Department of Computer Science + */ +/*- + * Copyright (c) 1982, 1986, 1989, 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. + * + * @(#)ffs_alloc.c 8.8 (Berkeley) 2/21/94 + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static daddr_t ext2_alloccg(struct inode *, int, daddr_t, int); +static u_long ext2_dirpref(struct inode *); +static void ext2_fserr(struct m_ext2fs *, uid_t, char *); +static u_long ext2_hashalloc(struct inode *, int, long, int, + daddr_t (*)(struct inode *, int, daddr_t, + int)); +static daddr_t ext2_nodealloccg(struct inode *, int, daddr_t, int); +static daddr_t ext2_mapsearch(struct m_ext2fs *, char *, daddr_t); +/* + * Allocate a block in the file system. + * + * A preference may be optionally specified. If a preference is given + * the following hierarchy is used to allocate a block: + * 1) allocate the requested block. + * 2) allocate a rotationally optimal block in the same cylinder. + * 3) allocate a block in the same cylinder group. + * 4) quadradically rehash into other cylinder groups, until an + * available block is located. + * If no block preference is given the following hierarchy is used + * to allocate a block: + * 1) allocate a block in the cylinder group that contains the + * inode for the file. + * 2) quadradically rehash into other cylinder groups, until an + * available block is located. + * + * A preference may be optionally specified. If a preference is given + * the following hierarchy is used to allocate a block: + * 1) allocate the requested block. + * 2) allocate a rotationally optimal block in the same cylinder. + * 3) allocate a block in the same cylinder group. + * 4) quadradically rehash into other cylinder groups, until an + * available block is located. + * If no block preference is given the following hierarchy is used + * to allocate a block: + * 1) allocate a block in the cylinder group that contains the + * inode for the file. + * 2) quadradically rehash into other cylinder groups, until an + * available block is located. + */ + +int +ext2_alloc(ip, lbn, bpref, size, cred, bnp) + struct inode *ip; + int32_t lbn, bpref; + int size; + struct ucred *cred; + int32_t *bnp; +{ + struct m_ext2fs *fs; + struct ext2mount *ump; + int32_t bno; + int cg; + *bnp = 0; + fs = ip->i_e2fs; + ump = ip->i_ump; + mtx_assert(EXT2_MTX(ump), MA_OWNED); +#ifdef DIAGNOSTIC + if ((u_int)size > fs->e2fs_bsize || blkoff(fs, size) != 0) { + vn_printf(ip->i_devvp, "bsize = %lu, size = %d, fs = %s\n", + (long unsigned int)fs->e2fs_bsize, size, fs->e2fs_fsmnt); + panic("ext2_alloc: bad size"); + } + if (cred == NOCRED) + panic("ext2_alloc: missing credential"); +#endif /* DIAGNOSTIC */ + if (size == fs->e2fs_bsize && fs->e2fs->e2fs_fbcount == 0) + goto nospace; + if (cred->cr_uid != 0 && + fs->e2fs->e2fs_fbcount < fs->e2fs->e2fs_rbcount) + goto nospace; + if (bpref >= fs->e2fs->e2fs_bcount) + bpref = 0; + if (bpref == 0) + cg = ino_to_cg(fs, ip->i_number); + else + cg = dtog(fs, bpref); + bno = (daddr_t)ext2_hashalloc(ip, cg, bpref, fs->e2fs_bsize, + ext2_alloccg); + if (bno > 0) { + ip->i_blocks += btodb(fs->e2fs_bsize); + ip->i_flag |= IN_CHANGE | IN_UPDATE; + *bnp = bno; + return (0); + } +nospace: + EXT2_UNLOCK(ump); + ext2_fserr(fs, cred->cr_uid, "file system full"); + uprintf("\n%s: write failed, file system is full\n", fs->e2fs_fsmnt); + return (ENOSPC); +} + +/* + * Reallocate a sequence of blocks into a contiguous sequence of blocks. + * + * The vnode and an array of buffer pointers for a range of sequential + * logical blocks to be made contiguous is given. The allocator attempts + * to find a range of sequential blocks starting as close as possible to + * an fs_rotdelay offset from the end of the allocation for the logical + * block immediately preceding the current range. If successful, the + * physical block numbers in the buffer pointers and in the inode are + * changed to reflect the new allocation. If unsuccessful, the allocation + * is left unchanged. The success in doing the reallocation is returned. + * Note that the error return is not reflected back to the user. Rather + * the previous block allocation will be used. + */ + +#ifdef FANCY_REALLOC +#include +static int doasyncfree = 1; +static int doreallocblks = 1; + +#ifdef OPT_DEBUG +SYSCTL_INT(_debug, 14, doasyncfree, CTLFLAG_RW, &doasyncfree, 0, ""); +#endif /* OPT_DEBUG */ +#endif + +int +ext2_reallocblks(ap) + struct vop_reallocblks_args /* { + struct vnode *a_vp; + struct cluster_save *a_buflist; + } */ *ap; +{ +#ifndef FANCY_REALLOC +/* printf("ext2_reallocblks not implemented\n"); */ +return ENOSPC; +#else + + struct m_ext2fs *fs; + struct inode *ip; + struct vnode *vp; + struct buf *sbp, *ebp; + int32_t *bap, *sbap, *ebap = 0; + struct ext2mount *ump; + struct cluster_save *buflist; + struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp; + int32_t start_lbn, end_lbn, soff, newblk, blkno =0; + int i, len, start_lvl, end_lvl, pref, ssize; + + vp = ap->a_vp; + ip = VTOI(vp); + fs = ip->i_e2fs; + ump = ip->i_ump; +#ifdef UNKLAR + if (fs->fs_contigsumsize <= 0) + return (ENOSPC); +#endif + buflist = ap->a_buflist; + len = buflist->bs_nchildren; + start_lbn = buflist->bs_children[0]->b_lblkno; + end_lbn = start_lbn + len - 1; +#ifdef DIAGNOSTIC + for (i = 1; i < len; i++) + if (buflist->bs_children[i]->b_lblkno != start_lbn + i) + panic("ext2_reallocblks: non-cluster"); +#endif + /* + * If the latest allocation is in a new cylinder group, assume that + * the filesystem has decided to move and do not force it back to + * the previous cylinder group. + */ + if (dtog(fs, dbtofsb(fs, buflist->bs_children[0]->b_blkno)) != + dtog(fs, dbtofsb(fs, buflist->bs_children[len - 1]->b_blkno))) + return (ENOSPC); + if (ext2_getlbns(vp, start_lbn, start_ap, &start_lvl) || + ext2_getlbns(vp, end_lbn, end_ap, &end_lvl)) + return (ENOSPC); + /* + * Get the starting offset and block map for the first block. + */ + if (start_lvl == 0) { + sbap = &ip->i_db[0]; + soff = start_lbn; + } else { + idp = &start_ap[start_lvl - 1]; + if (bread(vp, idp->in_lbn, (int)fs->e2fs_bsize, NOCRED, &sbp)) { + brelse(sbp); + return (ENOSPC); + } + sbap = (int32_t *)sbp->b_data; + soff = idp->in_off; + } + /* + * Find the preferred location for the cluster. + */ + EXT2_LOCK(ump); + pref = ext2_blkpref(ip, start_lbn, soff, sbap, blkno); + /* + * If the block range spans two block maps, get the second map. + */ + if (end_lvl == 0 || (idp = &end_ap[end_lvl - 1])->in_off + 1 >= len) { + ssize = len; + } else { +#ifdef DIAGNOSTIC + if (start_ap[start_lvl-1].in_lbn == idp->in_lbn) + panic("ext2_reallocblk: start == end"); +#endif + ssize = len - (idp->in_off + 1); + if (bread(vp, idp->in_lbn, (int)fs->e2fs_bsize, NOCRED, &ebp)){ + EXT2_UNLOCK(ump); + goto fail; + } + ebap = (int32_t *)ebp->b_data; + } + /* + * Search the block map looking for an allocation of the desired size. + */ + if ((newblk = (int32_t)ext2_hashalloc(ip, dtog(fs, pref), pref, + len, ext2_clusteralloc)) == 0){ + EXT2_UNLOCK(ump); + goto fail; + } + /* + * We have found a new contiguous block. + * + * First we have to replace the old block pointers with the new + * block pointers in the inode and indirect blocks associated + * with the file. + */ + blkno = newblk; + for (bap = &sbap[soff], i = 0; i < len; i++, blkno += fs->e2fs_fpb) { + if (i == ssize) + bap = ebap; + soff = -i; +#ifdef DIAGNOSTIC + if (buflist->bs_children[i]->b_blkno != fsbtodb(fs, *bap)) + panic("ext2_reallocblks: alloc mismatch"); +#endif + *bap++ = blkno; + } + /* + * Next we must write out the modified inode and indirect blocks. + * For strict correctness, the writes should be synchronous since + * the old block values may have been written to disk. In practise + * they are almost never written, but if we are concerned about + * strict correctness, the `doasyncfree' flag should be set to zero. + * + * The test on `doasyncfree' should be changed to test a flag + * that shows whether the associated buffers and inodes have + * been written. The flag should be set when the cluster is + * started and cleared whenever the buffer or inode is flushed. + * We can then check below to see if it is set, and do the + * synchronous write only when it has been cleared. + */ + if (sbap != &ip->i_db[0]) { + if (doasyncfree) + bdwrite(sbp); + else + bwrite(sbp); + } else { + ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (!doasyncfree) + ext2_update(vp, 1); + } + if (ssize < len) { + if (doasyncfree) + bdwrite(ebp); + else + bwrite(ebp); + } + /* + * Last, free the old blocks and assign the new blocks to the buffers. + */ + for (blkno = newblk, i = 0; i < len; i++, blkno += fs->e2fs_fpb) { + ext2_blkfree(ip, dbtofsb(fs, buflist->bs_children[i]->b_blkno), + fs->e2fs_bsize); + buflist->bs_children[i]->b_blkno = fsbtodb(fs, blkno); + } + return (0); + +fail: + if (ssize < len) + brelse(ebp); + if (sbap != &ip->i_db[0]) + brelse(sbp); + return (ENOSPC); + +#endif /* FANCY_REALLOC */ +} + +/* + * Allocate an inode in the file system. + * + */ +int +ext2_valloc(pvp, mode, cred, vpp) + struct vnode *pvp; + int mode; + struct ucred *cred; + struct vnode **vpp; +{ + struct inode *pip; + struct m_ext2fs *fs; + struct inode *ip; + struct ext2mount *ump; + ino_t ino, ipref; + int i, error, cg; + + *vpp = NULL; + pip = VTOI(pvp); + fs = pip->i_e2fs; + ump = pip->i_ump; + + EXT2_LOCK(ump); + if (fs->e2fs->e2fs_ficount == 0) + goto noinodes; + /* + * If it is a directory then obtain a cylinder group based on + * ext2_dirpref else obtain it using ino_to_cg. The preferred inode is + * always the next inode. + */ + if((mode & IFMT) == IFDIR) { + cg = ext2_dirpref(pip); + if (fs->e2fs_contigdirs[cg] < 255) + fs->e2fs_contigdirs[cg]++; + } else { + cg = ino_to_cg(fs, pip->i_number); + if (fs->e2fs_contigdirs[cg] > 0) + fs->e2fs_contigdirs[cg]--; + } + ipref = cg * fs->e2fs->e2fs_ipg + 1; + ino = (ino_t)ext2_hashalloc(pip, cg, (long)ipref, mode, ext2_nodealloccg); + + if (ino == 0) + goto noinodes; + error = VFS_VGET(pvp->v_mount, ino, LK_EXCLUSIVE, vpp); + if (error) { + ext2_vfree(pvp, ino, mode); + return (error); + } + ip = VTOI(*vpp); + + /* + the question is whether using VGET was such good idea at all - + Linux doesn't read the old inode in when it's allocating a + new one. I will set at least i_size & i_blocks the zero. + */ + ip->i_mode = 0; + ip->i_size = 0; + ip->i_blocks = 0; + ip->i_flags = 0; + /* now we want to make sure that the block pointers are zeroed out */ + for (i = 0; i < NDADDR; i++) + ip->i_db[i] = 0; + for (i = 0; i < NIADDR; i++) + ip->i_ib[i] = 0; + + /* + * Set up a new generation number for this inode. + * XXX check if this makes sense in ext2 + */ + if (ip->i_gen == 0 || ++ip->i_gen == 0) + ip->i_gen = random() / 2 + 1; +/* +printf("ext2_valloc: allocated inode %d\n", ino); +*/ + return (0); +noinodes: + EXT2_UNLOCK(ump); + ext2_fserr(fs, cred->cr_uid, "out of inodes"); + uprintf("\n%s: create/symlink failed, no inodes free\n", fs->e2fs_fsmnt); + return (ENOSPC); +} + +/* + * Find a cylinder to place a directory. + * + * The policy implemented by this algorithm is to allocate a + * directory inode in the same cylinder group as its parent + * directory, but also to reserve space for its files inodes + * and data. Restrict the number of directories which may be + * allocated one after another in the same cylinder group + * without intervening allocation of files. + * + * If we allocate a first level directory then force allocation + * in another cylinder group. + * + */ +static u_long +ext2_dirpref(struct inode *pip) +{ + struct m_ext2fs *fs; + int cg, prefcg, dirsize, cgsize; + int avgifree, avgbfree, avgndir, curdirsize; + int minifree, minbfree, maxndir; + int mincg, minndir; + int maxcontigdirs; + + mtx_assert(EXT2_MTX(pip->i_ump), MA_OWNED); + fs = pip->i_e2fs; + + avgifree = fs->e2fs->e2fs_ficount / fs->e2fs_gcount; + avgbfree = fs->e2fs->e2fs_fbcount / fs->e2fs_gcount; + avgndir = fs->e2fs_total_dir / fs->e2fs_gcount; + + /* + * Force allocation in another cg if creating a first level dir. + */ + ASSERT_VOP_LOCKED(ITOV(pip), "ext2fs_dirpref"); + if (ITOV(pip)->v_vflag & VV_ROOT) { + prefcg = arc4random() % fs->e2fs_gcount; + mincg = prefcg; + minndir = fs->e2fs_ipg; + for (cg = prefcg; cg < fs->e2fs_gcount; cg++) + if (fs->e2fs_gd[cg].ext2bgd_ndirs < minndir && + fs->e2fs_gd[cg].ext2bgd_nifree >= avgifree && + fs->e2fs_gd[cg].ext2bgd_nbfree >= avgbfree) { + mincg = cg; + minndir = fs->e2fs_gd[cg].ext2bgd_ndirs; + } + for (cg = 0; cg < prefcg; cg++) + if (fs->e2fs_gd[cg].ext2bgd_ndirs < minndir && + fs->e2fs_gd[cg].ext2bgd_nifree >= avgifree && + fs->e2fs_gd[cg].ext2bgd_nbfree >= avgbfree) { + mincg = cg; + minndir = fs->e2fs_gd[cg].ext2bgd_ndirs; + } + + return (mincg); + } + + /* + * Count various limits which used for + * optimal allocation of a directory inode. + */ + maxndir = min(avgndir + fs->e2fs_ipg / 16, fs->e2fs_ipg); + minifree = avgifree - avgifree / 4; + if (minifree < 1) + minifree = 1; + minbfree = avgbfree - avgbfree / 4; + if (minbfree < 1) + minbfree = 1; + cgsize = fs->e2fs_fsize * fs->e2fs_fpg; + dirsize = AVGDIRSIZE; + curdirsize = avgndir ? (cgsize - avgbfree * fs->e2fs_bsize) / avgndir : 0; + if (dirsize < curdirsize) + dirsize = curdirsize; + if (dirsize <= 0) + maxcontigdirs = 0; /* dirsize overflowed */ + else + maxcontigdirs = min((avgbfree * fs->e2fs_bsize) / dirsize, 255); + maxcontigdirs = min(maxcontigdirs, fs->e2fs_ipg / AFPDIR); + if (maxcontigdirs == 0) + maxcontigdirs = 1; + + /* + * Limit number of dirs in one cg and reserve space for + * regular files, but only if we have no deficit in + * inodes or space. + */ + prefcg = ino_to_cg(fs, pip->i_number); + for (cg = prefcg; cg < fs->e2fs_gcount; cg++) + if (fs->e2fs_gd[cg].ext2bgd_ndirs < maxndir && + fs->e2fs_gd[cg].ext2bgd_nifree >= minifree && + fs->e2fs_gd[cg].ext2bgd_nbfree >= minbfree) { + if (fs->e2fs_contigdirs[cg] < maxcontigdirs) + return (cg); + } + for (cg = 0; cg < prefcg; cg++) + if (fs->e2fs_gd[cg].ext2bgd_ndirs < maxndir && + fs->e2fs_gd[cg].ext2bgd_nifree >= minifree && + fs->e2fs_gd[cg].ext2bgd_nbfree >= minbfree) { + if (fs->e2fs_contigdirs[cg] < maxcontigdirs) + return (cg); + } + /* + * This is a backstop when we have deficit in space. + */ + for (cg = prefcg; cg < fs->e2fs_gcount; cg++) + if (fs->e2fs_gd[cg].ext2bgd_nifree >= avgifree) + return (cg); + for (cg = 0; cg < prefcg; cg++) + if (fs->e2fs_gd[cg].ext2bgd_nifree >= avgifree) + break; + return (cg); +} + +/* + * Select the desired position for the next block in a file. + * + * we try to mimic what Remy does in inode_getblk/block_getblk + * + * we note: blocknr == 0 means that we're about to allocate either + * a direct block or a pointer block at the first level of indirection + * (In other words, stuff that will go in i_db[] or i_ib[]) + * + * blocknr != 0 means that we're allocating a block that is none + * of the above. Then, blocknr tells us the number of the block + * that will hold the pointer + */ +int32_t +ext2_blkpref(ip, lbn, indx, bap, blocknr) + struct inode *ip; + int32_t lbn; + int indx; + int32_t *bap; + int32_t blocknr; +{ + int tmp; + mtx_assert(EXT2_MTX(ip->i_ump), MA_OWNED); + + /* if the next block is actually what we thought it is, + then set the goal to what we thought it should be + */ + if(ip->i_next_alloc_block == lbn && ip->i_next_alloc_goal != 0) + return ip->i_next_alloc_goal; + + /* now check whether we were provided with an array that basically + tells us previous blocks to which we want to stay closeby + */ + if(bap) + for (tmp = indx - 1; tmp >= 0; tmp--) + if (bap[tmp]) + return bap[tmp]; + + /* else let's fall back to the blocknr, or, if there is none, + follow the rule that a block should be allocated near its inode + */ + return blocknr ? blocknr : + (int32_t)(ip->i_block_group * + EXT2_BLOCKS_PER_GROUP(ip->i_e2fs)) + + ip->i_e2fs->e2fs->e2fs_first_dblock; +} + +/* + * Implement the cylinder overflow algorithm. + * + * The policy implemented by this algorithm is: + * 1) allocate the block in its requested cylinder group. + * 2) quadradically rehash on the cylinder group number. + * 3) brute force search for a free block. + */ +static u_long +ext2_hashalloc(struct inode *ip, int cg, long pref, int size, + daddr_t (*allocator)(struct inode *, int, daddr_t, int)) +{ + struct m_ext2fs *fs; + ino_t result; + int i, icg = cg; + + mtx_assert(EXT2_MTX(ip->i_ump), MA_OWNED); + fs = ip->i_e2fs; + /* + * 1: preferred cylinder group + */ + result = (*allocator)(ip, cg, pref, size); + if (result) + return (result); + /* + * 2: quadratic rehash + */ + for (i = 1; i < fs->e2fs_gcount; i *= 2) { + cg += i; + if (cg >= fs->e2fs_gcount) + cg -= fs->e2fs_gcount; + result = (*allocator)(ip, cg, 0, size); + if (result) + return (result); + } + /* + * 3: brute force search + * Note that we start at i == 2, since 0 was checked initially, + * and 1 is always checked in the quadratic rehash. + */ + cg = (icg + 2) % fs->e2fs_gcount; + for (i = 2; i < fs->e2fs_gcount; i++) { + result = (*allocator)(ip, cg, 0, size); + if (result) + return (result); + cg++; + if (cg == fs->e2fs_gcount) + cg = 0; + } + return (0); +} + +/* + * Determine whether a block can be allocated. + * + * Check to see if a block of the appropriate size is available, + * and if it is, allocate it. + */ +static daddr_t +ext2_alloccg(struct inode *ip, int cg, daddr_t bpref, int size) +{ + struct m_ext2fs *fs; + struct buf *bp; + struct ext2mount *ump; + int error, bno, start, end, loc; + char *bbp; + /* XXX ondisk32 */ + fs = ip->i_e2fs; + ump = ip->i_ump; + if (fs->e2fs_gd[cg].ext2bgd_nbfree == 0) + return (0); + EXT2_UNLOCK(ump); + error = bread(ip->i_devvp, fsbtodb(fs, + fs->e2fs_gd[cg].ext2bgd_b_bitmap), + (int)fs->e2fs_bsize, NOCRED, &bp); + if (error) { + brelse(bp); + EXT2_LOCK(ump); + return (0); + } + bbp = (char *)bp->b_data; + + if (dtog(fs, bpref) != cg) + bpref = 0; + if (bpref != 0) { + bpref = dtogd(fs, bpref); + /* + * if the requested block is available, use it + */ + if (isclr(bbp, bpref)) { + bno = bpref; + goto gotit; + } + } + /* + * no blocks in the requested cylinder, so take next + * available one in this cylinder group. + * first try to get 8 contigous blocks, then fall back to a single + * block. + */ + if (bpref) + start = dtogd(fs, bpref) / NBBY; + else + start = 0; + end = howmany(fs->e2fs->e2fs_fpg, NBBY) - start; + for (loc = start; loc < end; loc++) { + if (bbp[loc] == 0) { + bno = loc * NBBY; + goto gotit; + } + } + for (loc = 0; loc < start; loc++) { + if (bbp[loc] == 0) { + bno = loc * NBBY; + goto gotit; + } + } + + bno = ext2_mapsearch(fs, bbp, bpref); + if (bno < 0){ + brelse(bp); + EXT2_LOCK(ump); + return (0); + } +gotit: +#ifdef DIAGNOSTIC + if (isset(bbp, (daddr_t)bno)) { + printf("ext2fs_alloccgblk: cg=%d bno=%d fs=%s\n", + cg, bno, fs->e2fs_fsmnt); + panic("ext2fs_alloccg: dup alloc"); + } +#endif + setbit(bbp, (daddr_t)bno); + EXT2_LOCK(ump); + fs->e2fs->e2fs_fbcount--; + fs->e2fs_gd[cg].ext2bgd_nbfree--; + fs->e2fs_fmod = 1; + EXT2_UNLOCK(ump); + bdwrite(bp); + return (cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bno); +} + +/* + * Determine whether an inode can be allocated. + * + * Check to see if an inode is available, and if it is, + * allocate it using tode in the specified cylinder group. + */ +static daddr_t +ext2_nodealloccg(struct inode *ip, int cg, daddr_t ipref, int mode) +{ + struct m_ext2fs *fs; + struct buf *bp; + struct ext2mount *ump; + int error, start, len, loc, map, i; + char *ibp; + ipref--; /* to avoid a lot of (ipref -1) */ + if (ipref == -1) + ipref = 0; + fs = ip->i_e2fs; + ump = ip->i_ump; + if (fs->e2fs_gd[cg].ext2bgd_nifree == 0) + return (0); + EXT2_UNLOCK(ump); + error = bread(ip->i_devvp, fsbtodb(fs, + fs->e2fs_gd[cg].ext2bgd_i_bitmap), + (int)fs->e2fs_bsize, NOCRED, &bp); + if (error) { + brelse(bp); + EXT2_LOCK(ump); + return (0); + } + ibp = (char *)bp->b_data; + if (ipref) { + ipref %= fs->e2fs->e2fs_ipg; + if (isclr(ibp, ipref)) + goto gotit; + } + start = ipref / NBBY; + len = howmany(fs->e2fs->e2fs_ipg - ipref, NBBY); + loc = skpc(0xff, len, &ibp[start]); + if (loc == 0) { + len = start + 1; + start = 0; + loc = skpc(0xff, len, &ibp[0]); + if (loc == 0) { + printf("cg = %d, ipref = %lld, fs = %s\n", + cg, (long long)ipref, fs->e2fs_fsmnt); + panic("ext2fs_nodealloccg: map corrupted"); + /* NOTREACHED */ + } + } + i = start + len - loc; + map = ibp[i]; + ipref = i * NBBY; + for (i = 1; i < (1 << NBBY); i <<= 1, ipref++) { + if ((map & i) == 0) { + goto gotit; + } + } + printf("fs = %s\n", fs->e2fs_fsmnt); + panic("ext2fs_nodealloccg: block not in map"); + /* NOTREACHED */ +gotit: + setbit(ibp, ipref); + EXT2_LOCK(ump); + fs->e2fs_gd[cg].ext2bgd_nifree--; + fs->e2fs->e2fs_ficount--; + fs->e2fs_fmod = 1; + if ((mode & IFMT) == IFDIR) { + fs->e2fs_gd[cg].ext2bgd_ndirs++; + fs->e2fs_total_dir++; + } + EXT2_UNLOCK(ump); + bdwrite(bp); + return (cg * fs->e2fs->e2fs_ipg + ipref +1); +} + +/* + * Free a block or fragment. + * + */ +void +ext2_blkfree(ip, bno, size) + struct inode *ip; + int32_t bno; + long size; +{ + struct m_ext2fs *fs; + struct buf *bp; + struct ext2mount *ump; + int cg, error; + char *bbp; + + fs = ip->i_e2fs; + ump = ip->i_ump; + cg = dtog(fs, bno); + if ((u_int)bno >= fs->e2fs->e2fs_bcount) { + printf("bad block %lld, ino %llu\n", (long long)bno, + (unsigned long long)ip->i_number); + ext2_fserr(fs, ip->i_uid, "bad block"); + return; + } + error = bread(ip->i_devvp, + fsbtodb(fs, fs->e2fs_gd[cg].ext2bgd_b_bitmap), + (int)fs->e2fs_bsize, NOCRED, &bp); + if (error) { + brelse(bp); + return; + } + bbp = (char *)bp->b_data; + bno = dtogd(fs, bno); + if (isclr(bbp, bno)) { + printf("block = %lld, fs = %s\n", + (long long)bno, fs->e2fs_fsmnt); + panic("blkfree: freeing free block"); + } + clrbit(bbp, bno); + EXT2_LOCK(ump); + fs->e2fs->e2fs_fbcount++; + fs->e2fs_gd[cg].ext2bgd_nbfree++; + fs->e2fs_fmod = 1; + EXT2_UNLOCK(ump); + bdwrite(bp); +} + +/* + * Free an inode. + * + */ +int +ext2_vfree(pvp, ino, mode) + struct vnode *pvp; + ino_t ino; + int mode; +{ + struct m_ext2fs *fs; + struct inode *pip; + struct buf *bp; + struct ext2mount *ump; + int error, cg; + char * ibp; +/* mode_t save_i_mode; */ + + pip = VTOI(pvp); + fs = pip->i_e2fs; + ump = pip->i_ump; + if ((u_int)ino > fs->e2fs_ipg * fs->e2fs_gcount) + panic("ext2_vfree: range: devvp = %p, ino = %d, fs = %s", + pip->i_devvp, ino, fs->e2fs_fsmnt); + + cg = ino_to_cg(fs, ino); + error = bread(pip->i_devvp, + fsbtodb(fs, fs->e2fs_gd[cg].ext2bgd_i_bitmap), + (int)fs->e2fs_bsize, NOCRED, &bp); + if (error) { + brelse(bp); + return (0); + } + ibp = (char *)bp->b_data; + ino = (ino - 1) % fs->e2fs->e2fs_ipg; + if (isclr(ibp, ino)) { + printf("ino = %llu, fs = %s\n", + (unsigned long long)ino, fs->e2fs_fsmnt); + if (fs->e2fs_ronly == 0) + panic("ifree: freeing free inode"); + } + clrbit(ibp, ino); + EXT2_LOCK(ump); + fs->e2fs->e2fs_ficount++; + fs->e2fs_gd[cg].ext2bgd_nifree++; + if ((mode & IFMT) == IFDIR) { + fs->e2fs_gd[cg].ext2bgd_ndirs--; + fs->e2fs_total_dir--; + } + fs->e2fs_fmod = 1; + EXT2_UNLOCK(ump); + bdwrite(bp); + return (0); +} + +/* + * Find a block in the specified cylinder group. + * + * It is a panic if a request is made to find a block if none are + * available. + */ +static daddr_t +ext2_mapsearch(struct m_ext2fs *fs, char *bbp, daddr_t bpref) +{ + daddr_t bno; + int start, len, loc, i, map; + + /* + * find the fragment by searching through the free block + * map for an appropriate bit pattern + */ + if (bpref) + start = dtogd(fs, bpref) / NBBY; + else + start = 0; + len = howmany(fs->e2fs->e2fs_fpg, NBBY) - start; + loc = skpc(0xff, len, &bbp[start]); + if (loc == 0) { + len = start + 1; + start = 0; + loc = skpc(0xff, len, &bbp[start]); + if (loc == 0) { + printf("start = %d, len = %d, fs = %s\n", + start, len, fs->e2fs_fsmnt); + panic("ext2fs_alloccg: map corrupted"); + /* NOTREACHED */ + } + } + i = start + len - loc; + map = bbp[i]; + bno = i * NBBY; + for (i = 1; i < (1 << NBBY); i <<= 1, bno++) { + if ((map & i) == 0) + return (bno); + } + printf("fs = %s\n", fs->e2fs_fsmnt); + panic("ext2fs_mapsearch: block not in map"); + /* NOTREACHED */ +} + +/* + * Fserr prints the name of a file system with an error diagnostic. + * + * The form of the error message is: + * fs: error message + */ +static void +ext2_fserr(fs, uid, cp) + struct m_ext2fs *fs; + uid_t uid; + char *cp; +{ + + log(LOG_ERR, "uid %u on %s: %s\n", uid, fs->e2fs_fsmnt, cp); +} + +int +cg_has_sb(int i) +{ + int a3, a5, a7; + + if (i == 0 || i == 1) + return 1; + for (a3 = 3, a5 = 5, a7 = 7; + a3 <= i || a5 <= i || a7 <= i; + a3 *= 3, a5 *= 5, a7 *= 7) + if (i == a3 || i == a5 || i == a7) + return 1; + return 0; +} diff --git a/sys/gnu/fs/ext2fs/ext2_balloc.c b/sys/fs/ext2fs/ext2_balloc.c similarity index 71% rename from sys/gnu/fs/ext2fs/ext2_balloc.c rename to sys/fs/ext2fs/ext2_balloc.c index e46414c5bf99..124ac32ddf1c 100644 --- a/sys/gnu/fs/ext2fs/ext2_balloc.c +++ b/sys/fs/ext2fs/ext2_balloc.c @@ -44,42 +44,39 @@ #include #include -#include -#include -#include -#include -#include - +#include +#include +#include +#include +#include /* * Balloc defines the structure of file system storage * by allocating the physical blocks on a device given * the inode and the logical block number in a file. */ int -ext2_balloc(ip, bn, size, cred, bpp, flags) +ext2_balloc(ip, lbn, size, cred, bpp, flags) struct inode *ip; - int32_t bn; + int32_t lbn; int size; struct ucred *cred; struct buf **bpp; int flags; { - struct ext2_sb_info *fs; + struct m_ext2fs *fs; + struct ext2mount *ump; int32_t nb; struct buf *bp, *nbp; struct vnode *vp = ITOV(ip); struct indir indirs[NIADDR + 2]; - int32_t newb, lbn, *bap, pref; + int32_t newb, *bap, pref; int osize, nsize, num, i, error; -/* -ext2_debug("ext2_balloc called (%d, %d, %d)\n", - ip->i_number, (int)bn, (int)size); -*/ + *bpp = NULL; - if (bn < 0) + if (lbn < 0) return (EFBIG); fs = ip->i_e2fs; - lbn = bn; + ump = ip->i_ump; /* * check if this is a sequential block allocation. @@ -94,12 +91,12 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", /* * The first NDADDR blocks are direct blocks */ - if (bn < NDADDR) { - nb = ip->i_db[bn]; + if (lbn < NDADDR) { + nb = ip->i_db[lbn]; /* no new block is to be allocated, and no need to expand the file */ - if (nb != 0 && ip->i_size >= (bn + 1) * fs->s_blocksize) { - error = bread(vp, bn, fs->s_blocksize, NOCRED, &bp); + if (nb != 0 && ip->i_size >= (lbn + 1) * fs->e2fs_bsize) { + error = bread(vp, lbn, fs->e2fs_bsize, NOCRED, &bp); if (error) { brelse(bp); return (error); @@ -115,7 +112,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", osize = fragroundup(fs, blkoff(fs, ip->i_size)); nsize = fragroundup(fs, size); if (nsize <= osize) { - error = bread(vp, bn, osize, NOCRED, &bp); + error = bread(vp, lbn, osize, NOCRED, &bp); if (error) { brelse(bp); return (error); @@ -134,21 +131,22 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", */ } } else { - if (ip->i_size < (bn + 1) * fs->s_blocksize) + if (ip->i_size < (lbn + 1) * fs->e2fs_bsize) nsize = fragroundup(fs, size); else - nsize = fs->s_blocksize; - error = ext2_alloc(ip, bn, - ext2_blkpref(ip, bn, (int)bn, &ip->i_db[0], 0), + nsize = fs->e2fs_bsize; + EXT2_LOCK(ump); + error = ext2_alloc(ip, lbn, + ext2_blkpref(ip, lbn, (int)lbn, &ip->i_db[0], 0), nsize, cred, &newb); if (error) return (error); - bp = getblk(vp, bn, nsize, 0, 0, 0); + bp = getblk(vp, lbn, nsize, 0, 0, 0); bp->b_blkno = fsbtodb(fs, newb); if (flags & B_CLRBUF) vfs_bio_clrbuf(bp); } - ip->i_db[bn] = dbtofsb(fs, bp->b_blkno); + ip->i_db[lbn] = dbtofsb(fs, bp->b_blkno); ip->i_flag |= IN_CHANGE | IN_UPDATE; *bpp = bp; return (0); @@ -157,7 +155,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", * Determine the number of levels of indirection. */ pref = 0; - if ((error = ext2_getlbns(vp, bn, indirs, &num)) != 0) + if ((error = ext2_getlbns(vp, lbn, indirs, &num)) != 0) return(error); #ifdef DIAGNOSTIC if (num < 1) @@ -169,28 +167,14 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", --num; nb = ip->i_ib[indirs[0].in_off]; if (nb == 0) { -#if 0 - pref = ext2_blkpref(ip, lbn, 0, (int32_t *)0, 0); -#else - /* see the comment by ext2_blkpref. What we do here is - to pretend that it'd be good for a block holding indirect - pointers to be allocated near its predecessor in terms - of indirection, or the last direct block. - We shamelessly exploit the fact that i_ib immediately - follows i_db. - Godmar thinks it make sense to allocate i_ib[0] immediately - after i_db[11], but it's not utterly clear whether this also - applies to i_ib[1] and i_ib[0] - */ - + EXT2_LOCK(ump); pref = ext2_blkpref(ip, lbn, indirs[0].in_off + EXT2_NDIR_BLOCKS, &ip->i_db[0], 0); -#endif - if ((error = ext2_alloc(ip, lbn, pref, (int)fs->s_blocksize, - cred, &newb)) != 0) + if ((error = ext2_alloc(ip, lbn, pref, + (int)fs->e2fs_bsize, cred, &newb))) return (error); nb = newb; - bp = getblk(vp, indirs[1].in_lbn, fs->s_blocksize, 0, 0, 0); + bp = getblk(vp, indirs[1].in_lbn, fs->e2fs_bsize, 0, 0, 0); bp->b_blkno = fsbtodb(fs, newb); vfs_bio_clrbuf(bp); /* @@ -198,7 +182,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", * never point at garbage. */ if ((error = bwrite(bp)) != 0) { - ext2_blkfree(ip, nb, fs->s_blocksize); + ext2_blkfree(ip, nb, fs->e2fs_bsize); return (error); } ip->i_ib[indirs[0].in_off] = newb; @@ -209,7 +193,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", */ for (i = 1;;) { error = bread(vp, - indirs[i].in_lbn, (int)fs->s_blocksize, NOCRED, &bp); + indirs[i].in_lbn, (int)fs->e2fs_bsize, NOCRED, &bp); if (error) { brelse(bp); return (error); @@ -220,29 +204,20 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", break; i += 1; if (nb != 0) { - brelse(bp); + bqrelse(bp); continue; } - if (pref == 0) -#if 1 - /* see the comment above and by ext2_blkpref - * I think this implements Linux policy, but - * does it really make sense to allocate to - * block containing pointers together ? - * Also, will it ever succeed ? - */ + EXT2_LOCK(ump); + if (pref == 0) pref = ext2_blkpref(ip, lbn, indirs[i].in_off, bap, bp->b_lblkno); -#else - pref = ext2_blkpref(ip, lbn, 0, (int32_t *)0, 0); -#endif - if ((error = - ext2_alloc(ip, lbn, pref, (int)fs->s_blocksize, cred, &newb)) != 0) { + error = ext2_alloc(ip, lbn, pref, (int)fs->e2fs_bsize, cred, &newb); + if (error) { brelse(bp); return (error); } nb = newb; - nbp = getblk(vp, indirs[i].in_lbn, fs->s_blocksize, 0, 0, 0); + nbp = getblk(vp, indirs[i].in_lbn, fs->e2fs_bsize, 0, 0, 0); nbp->b_blkno = fsbtodb(fs, nb); vfs_bio_clrbuf(nbp); /* @@ -250,7 +225,8 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", * never point at garbage. */ if ((error = bwrite(nbp)) != 0) { - ext2_blkfree(ip, nb, fs->s_blocksize); + ext2_blkfree(ip, nb, fs->e2fs_bsize); + EXT2_UNLOCK(ump); brelse(bp); return (error); } @@ -262,6 +238,8 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", if (flags & B_SYNC) { bwrite(bp); } else { + if (bp->b_bufsize == fs->e2fs_bsize) + bp->b_flags |= B_CLUSTEROK; bdwrite(bp); } } @@ -269,15 +247,16 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", * Get the data block, allocating if necessary. */ if (nb == 0) { + EXT2_LOCK(ump); pref = ext2_blkpref(ip, lbn, indirs[i].in_off, &bap[0], bp->b_lblkno); if ((error = ext2_alloc(ip, - lbn, pref, (int)fs->s_blocksize, cred, &newb)) != 0) { + lbn, pref, (int)fs->e2fs_bsize, cred, &newb)) != 0) { brelse(bp); return (error); } nb = newb; - nbp = getblk(vp, lbn, fs->s_blocksize, 0, 0, 0); + nbp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0, 0); nbp->b_blkno = fsbtodb(fs, nb); if (flags & B_CLRBUF) vfs_bio_clrbuf(nbp); @@ -289,6 +268,8 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", if (flags & B_SYNC) { bwrite(bp); } else { + if (bp->b_bufsize == fs->e2fs_bsize) + bp->b_flags |= B_CLUSTEROK; bdwrite(bp); } *bpp = nbp; @@ -296,15 +277,16 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n", } brelse(bp); if (flags & B_CLRBUF) { - error = bread(vp, lbn, (int)fs->s_blocksize, NOCRED, &nbp); + error = bread(vp, lbn, (int)fs->e2fs_bsize, NOCRED, &nbp); if (error) { brelse(nbp); return (error); } } else { - nbp = getblk(vp, lbn, fs->s_blocksize, 0, 0, 0); + nbp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0, 0); nbp->b_blkno = fsbtodb(fs, nb); } *bpp = nbp; return (0); } + diff --git a/sys/gnu/fs/ext2fs/ext2_bmap.c b/sys/fs/ext2fs/ext2_bmap.c similarity index 96% rename from sys/gnu/fs/ext2fs/ext2_bmap.c rename to sys/fs/ext2fs/ext2_bmap.c index 85cfbf948bf6..c742188d479b 100644 --- a/sys/gnu/fs/ext2fs/ext2_bmap.c +++ b/sys/fs/ext2fs/ext2_bmap.c @@ -45,14 +45,13 @@ #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include /* - * Bmap converts a the logical block number of a file to its physical block + * Bmap converts the logical block number of a file to its physical block * number on the disk. The conversion is done by using the logical block * number to index into the array of block pointers described by the dinode. */ @@ -93,7 +92,7 @@ ext2_bmap(ap) * which they point. Triple indirect blocks are addressed by one less than * the address of the first double indirect block to which they point. * - * ufs_bmaparray does the bmap conversion, and if requested returns the + * ext2_bmaparray does the bmap conversion, and if requested returns the * array of logical blocks which must be traversed to get to a block. * Each entry contains the offset into that block that gets you to the * next block and the disk address of the block (if it is assigned). diff --git a/sys/fs/ext2fs/ext2_dinode.h b/sys/fs/ext2fs/ext2_dinode.h new file mode 100755 index 000000000000..3e45060e566f --- /dev/null +++ b/sys/fs/ext2fs/ext2_dinode.h @@ -0,0 +1,78 @@ +/*- + * Copyright (c) 2009 Aditya Sarawgi + * 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$ + */ + +#ifndef _FS_EXT2FS_EXT2_DINODE_H_ +#define _FS_EXT2FS_EXT2_DINODE_H_ + +#define e2di_size_high e2di_dacl + +/* + * Inode flags + * The current implementation uses only EXT2_IMMUTABLE and EXT2_APPEND flags + */ +#define EXT2_SECRM 0x00000001 /* Secure deletion */ +#define EXT2_UNRM 0x00000002 /* Undelete */ +#define EXT2_COMPR 0x00000004 /* Compress file */ +#define EXT2_SYNC 0x00000008 /* Synchronous updates */ +#define EXT2_IMMUTABLE 0x00000010 /* Immutable file */ +#define EXT2_APPEND 0x00000020 /* writes to file may only append */ +#define EXT2_NODUMP 0x00000040 /* do not dump file */ +#define EXT2_NOATIME 0x00000080 /* do not update atime */ + + +/* + * Structure of an inode on the disk + */ +struct ext2fs_dinode { + u_int16_t e2di_mode; /* 0: IFMT, permissions; see below. */ + u_int16_t e2di_uid; /* 2: Owner UID */ + u_int32_t e2di_size; /* 4: Size (in bytes) */ + u_int32_t e2di_atime; /* 8: Access time */ + u_int32_t e2di_ctime; /* 12: Create time */ + u_int32_t e2di_mtime; /* 16: Modification time */ + u_int32_t e2di_dtime; /* 20: Deletion time */ + u_int16_t e2di_gid; /* 24: Owner GID */ + u_int16_t e2di_nlink; /* 26: File link count */ + u_int32_t e2di_nblock; /* 28: Blocks count */ + u_int32_t e2di_flags; /* 32: Status flags (chflags) */ + u_int32_t e2di_linux_reserved1; /* 36 */ + u_int32_t e2di_blocks[EXT2_N_BLOCKS]; /* 40: disk blocks */ + u_int32_t e2di_gen; /* 100: generation number */ + u_int32_t e2di_facl; /* 104: file ACL (not implemented) */ + u_int32_t e2di_dacl; /* 108: dir ACL (not implemented) */ + u_int32_t e2di_faddr; /* 112: fragment address */ + u_int8_t e2di_nfrag; /* 116: fragment number */ + u_int8_t e2di_fsize; /* 117: fragment size */ + u_int16_t e2di_linux_reserved2; /* 118 */ + u_int16_t e2di_uid_high; /* 120: Owner UID top 16 bits */ + u_int16_t e2di_gid_high; /* 122: Owner GID top 16 bits */ + u_int32_t e2di_linux_reserved3; /* 124 */ +}; + +#endif /* _FS_EXT2FS_EXT2_DINODE_H_ */ + diff --git a/sys/fs/ext2fs/ext2_dir.h b/sys/fs/ext2fs/ext2_dir.h new file mode 100755 index 000000000000..06762682b1b9 --- /dev/null +++ b/sys/fs/ext2fs/ext2_dir.h @@ -0,0 +1,81 @@ +/*- + * Copyright (c) 2009 Aditya Sarawgi + * 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$ + */ + +#ifndef _FS_EXT2FS_EXT2_DIR_H_ +#define _FS_EXT2FS_EXT2_DIR_H_ + +/* + * Structure of a directory entry + */ +#define EXT2FS_MAXNAMLEN 255 + +struct ext2fs_direct { + u_int32_t e2d_ino; /* inode number of entry */ + u_int16_t e2d_reclen; /* length of this record */ + u_int16_t e2d_namlen; /* length of string in d_name */ + char e2d_name[EXT2FS_MAXNAMLEN];/* name with length<=EXT2FS_MAXNAMLEN */ +}; +/* + * The new version of the directory entry. Since EXT2 structures are + * stored in intel byte order, and the name_len field could never be + * bigger than 255 chars, it's safe to reclaim the extra byte for the + * file_type field. + */ +struct ext2fs_direct_2 { + u_int32_t e2d_ino; /* inode number of entry */ + u_int16_t e2d_reclen; /* length of this record */ + u_int8_t e2d_namlen; /* length of string in d_name */ + u_int8_t e2d_type; /* file type */ + char e2d_name[EXT2FS_MAXNAMLEN];/* name with length<=EXT2FS_MAXNAMLEN */ +}; +/* + * Ext2 directory file types. Only the low 3 bits are used. The + * other bits are reserved for now. + */ +#define EXT2_FT_UNKNOWN 0 +#define EXT2_FT_REG_FILE 1 +#define EXT2_FT_DIR 2 +#define EXT2_FT_CHRDEV 3 +#define EXT2_FT_BLKDEV 4 +#define EXT2_FT_FIFO 5 +#define EXT2_FT_SOCK 6 +#define EXT2_FT_SYMLINK 7 + +#define EXT2_FT_MAX 8 + +/* + * EXT2_DIR_PAD defines the directory entries boundaries + * + * NOTE: It must be a multiple of 4 + */ +#define EXT2_DIR_PAD 4 +#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) +#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ + ~EXT2_DIR_ROUND) +#endif /* !_FS_EXT2FS_EXT2_DIR_H_ */ + diff --git a/sys/gnu/fs/ext2fs/ext2_extern.h b/sys/fs/ext2fs/ext2_extern.h similarity index 80% rename from sys/gnu/fs/ext2fs/ext2_extern.h rename to sys/fs/ext2fs/ext2_extern.h index 24c8f4572948..60905cbca3ac 100644 --- a/sys/gnu/fs/ext2fs/ext2_extern.h +++ b/sys/fs/ext2fs/ext2_extern.h @@ -36,10 +36,10 @@ * $FreeBSD$ */ -#ifndef _SYS_GNU_EXT2FS_EXT2_EXTERN_H_ -#define _SYS_GNU_EXT2FS_EXT2_EXTERN_H_ +#ifndef _FS_EXT2FS_EXT2_EXTERN_H_ +#define _FS_EXT2FS_EXT2_EXTERN_H_ -struct ext2_inode; +struct ext2fs_dinode; struct indir; struct inode; struct mount; @@ -56,13 +56,13 @@ int32_t ext2_blkpref(struct inode *, int32_t, int, int32_t *, int32_t); int ext2_bmap(struct vop_bmap_args *); int ext2_bmaparray(struct vnode *, int32_t, int32_t *, int *, int *); void ext2_dirbad(struct inode *ip, doff_t offset, char *how); -void ext2_ei2i(struct ext2_inode *, struct inode *); +void ext2_ei2i(struct ext2fs_dinode *, struct inode *); int ext2_getlbns(struct vnode *, int32_t, struct indir *, int *); -void ext2_i2ei(struct inode *, struct ext2_inode *); +void ext2_i2ei(struct inode *, struct ext2fs_dinode *); void ext2_itimes(struct vnode *vp); int ext2_reallocblks(struct vop_reallocblks_args *); int ext2_reclaim(struct vop_reclaim_args *); -void ext2_setblock(struct ext2_sb_info *, u_char *, int32_t); +void ext2_setblock(struct m_ext2fs *, u_char *, int32_t); int ext2_truncate(struct vnode *, off_t, int, struct ucred *, struct thread *); int ext2_update(struct vnode *, int); int ext2_valloc(struct vnode *, int, struct ucred *, struct vnode **); @@ -78,19 +78,8 @@ int ext2_dirrewrite(struct inode *, struct inode *, struct componentname *); int ext2_dirempty(struct inode *, ino_t, struct ucred *); int ext2_checkpath(struct inode *, struct inode *, struct ucred *); -struct ext2_group_desc * get_group_desc(struct mount * , - unsigned int , struct buf ** ); -int ext2_group_sparse(int group); -void ext2_discard_prealloc(struct inode *); +int cg_has_sb(int i); int ext2_inactive(struct vop_inactive_args *); -int ext2_new_block(struct mount * mp, unsigned long goal, - u_int32_t *prealloc_count, u_int32_t *prealloc_block); -ino_t ext2_new_inode(const struct inode * dir, int mode); -unsigned long ext2_count_free(struct buf *map, unsigned int numchars); -void ext2_free_blocks(struct mount *mp, unsigned long block, - unsigned long count); -void ext2_free_inode(struct inode * inode); -void mark_buffer_dirty(struct buf *bh); /* Flags to low-level allocation routines. */ #define B_CLRBUF 0x01 /* Request allocated buffer be cleared. */ @@ -101,4 +90,4 @@ void mark_buffer_dirty(struct buf *bh); extern struct vop_vector ext2_vnodeops; extern struct vop_vector ext2_fifoops; -#endif /* !_SYS_GNU_EXT2FS_EXT2_EXTERN_H_ */ +#endif /* !_FS_EXT2FS_EXT2_EXTERN_H_ */ diff --git a/sys/gnu/fs/ext2fs/ext2_inode.c b/sys/fs/ext2fs/ext2_inode.c similarity index 87% rename from sys/gnu/fs/ext2fs/ext2_inode.c rename to sys/fs/ext2fs/ext2_inode.c index 0a62c3000443..2cf60a72407f 100644 --- a/sys/gnu/fs/ext2fs/ext2_inode.c +++ b/sys/fs/ext2fs/ext2_inode.c @@ -47,12 +47,11 @@ #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include static int ext2_indirtrunc(struct inode *, int32_t, int32_t, int32_t, int, long *); @@ -71,26 +70,27 @@ ext2_update(vp, waitfor) struct vnode *vp; int waitfor; { - struct ext2_sb_info *fs; + struct m_ext2fs *fs; struct buf *bp; struct inode *ip; int error; + ASSERT_VOP_ELOCKED(vp, "ext2_update"); ext2_itimes(vp); ip = VTOI(vp); - if ((ip->i_flag & IN_MODIFIED) == 0) - return (0); - ip->i_flag &= ~(IN_LAZYMOD | IN_MODIFIED); - if (vp->v_mount->mnt_flag & MNT_RDONLY) + if ((ip->i_flag & IN_MODIFIED) == 0 && waitfor == 0) return (0); + ip->i_flag &= ~(IN_LAZYACCESS | IN_LAZYMOD | IN_MODIFIED); fs = ip->i_e2fs; + if(fs->e2fs_ronly) + return (0); if ((error = bread(ip->i_devvp, fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), - (int)fs->s_blocksize, NOCRED, &bp)) != 0) { + (int)fs->e2fs_bsize, NOCRED, &bp)) != 0) { brelse(bp); return (error); } - ext2_i2ei(ip, (struct ext2_inode *)((char *)bp->b_data + + ext2_i2ei(ip, (struct ext2fs_dinode *)((char *)bp->b_data + EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ip->i_number))); if (waitfor && (vp->v_mount->mnt_kern_flag & MNTK_ASYNC) == 0) return (bwrite(bp)); @@ -120,22 +120,22 @@ ext2_truncate(vp, length, flags, cred, td) struct inode *oip; int32_t bn, lbn, lastiblock[NIADDR], indir_lbn[NIADDR]; int32_t oldblks[NDADDR + NIADDR], newblks[NDADDR + NIADDR]; - struct ext2_sb_info *fs; + struct bufobj *bo; + struct m_ext2fs *fs; struct buf *bp; int offset, size, level; long count, nblocks, blocksreleased = 0; int aflags, error, i, allerror; off_t osize; -/* -printf("ext2_truncate called %d to %d\n", VTOI(ovp)->i_number, length); -*/ /* - * negative file sizes will totally break the code below and - * are not meaningful anyways. - */ - if (length < 0) - return EFBIG; oip = VTOI(ovp); + bo = &ovp->v_bufobj; + + ASSERT_VOP_LOCKED(vp, "ext2_truncate"); + + if (length < 0) + return (EINVAL); + if (ovp->v_type == VLNK && oip->i_size < ovp->v_mount->mnt_maxsymlinklen) { #ifdef DIAGNOSTIC @@ -153,27 +153,32 @@ printf("ext2_truncate called %d to %d\n", VTOI(ovp)->i_number, length); } fs = oip->i_e2fs; osize = oip->i_size; - ext2_discard_prealloc(oip); /* * Lengthen the size of the file. We must ensure that the * last byte of the file is allocated. Since the smallest - * value of oszie is 0, length will be at least 1. + * value of osize is 0, length will be at least 1. */ if (osize < length) { - if (length > oip->i_e2fs->fs_maxfilesize) + if (length > oip->i_e2fs->e2fs_maxfilesize) return (EFBIG); + vnode_pager_setsize(ovp, length); offset = blkoff(fs, length - 1); lbn = lblkno(fs, length - 1); aflags = B_CLRBUF; if (flags & IO_SYNC) aflags |= B_SYNC; - vnode_pager_setsize(ovp, length); - if ((error = ext2_balloc(oip, lbn, offset + 1, cred, &bp, - aflags)) != 0) + error = ext2_balloc(oip, lbn, offset + 1, cred, &bp, aflags); + if (error) { + vnode_pager_setsize(vp, osize); return (error); + } oip->i_size = length; - if (aflags & IO_SYNC) + if (bp->b_bufsize == fs->e2fs_bsize) + bp->b_flags |= B_CLUSTEROK; + if (aflags & B_SYNC) bwrite(bp); + else if (ovp->v_mount->mnt_flag & MNT_ASYNC) + bdwrite(bp); else bawrite(bp); oip->i_flag |= IN_CHANGE | IN_UPDATE; @@ -195,15 +200,19 @@ printf("ext2_truncate called %d to %d\n", VTOI(ovp)->i_number, length); aflags = B_CLRBUF; if (flags & IO_SYNC) aflags |= B_SYNC; - if ((error = ext2_balloc(oip, lbn, offset, cred, &bp, - aflags)) != 0) + error = ext2_balloc(oip, lbn, offset, cred, &bp, aflags); + if (error) return (error); oip->i_size = length; size = blksize(fs, oip, lbn); bzero((char *)bp->b_data + offset, (u_int)(size - offset)); allocbuf(bp, size); - if (aflags & IO_SYNC) + if (bp->b_bufsize == fs->e2fs_bsize) + bp->b_flags |= B_CLUSTEROK; + if (aflags & B_SYNC) bwrite(bp); + else if (ovp->v_mount->mnt_flag & MNT_ASYNC) + bdwrite(bp); else bawrite(bp); } @@ -213,11 +222,11 @@ printf("ext2_truncate called %d to %d\n", VTOI(ovp)->i_number, length); * which we want to keep. Lastblock is -1 when * the file is truncated to 0. */ - lastblock = lblkno(fs, length + fs->s_blocksize - 1) - 1; + lastblock = lblkno(fs, length + fs->e2fs_bsize - 1) - 1; lastiblock[SINGLE] = lastblock - NDADDR; lastiblock[DOUBLE] = lastiblock[SINGLE] - NINDIR(fs); lastiblock[TRIPLE] = lastiblock[DOUBLE] - NINDIR(fs) * NINDIR(fs); - nblocks = btodb(fs->s_blocksize); + nblocks = btodb(fs->e2fs_bsize); /* * Update file and block pointers on disk before we start freeing * blocks. If we crash before free'ing blocks below, the blocks @@ -244,10 +253,11 @@ printf("ext2_truncate called %d to %d\n", VTOI(ovp)->i_number, length); bcopy((caddr_t)&oip->i_db[0], (caddr_t)newblks, sizeof newblks); bcopy((caddr_t)oldblks, (caddr_t)&oip->i_db[0], sizeof oldblks); oip->i_size = osize; - error = vtruncbuf(ovp, cred, td, length, (int)fs->s_blocksize); + error = vtruncbuf(ovp, cred, td, length, (int)fs->e2fs_bsize); if (error && (allerror == 0)) allerror = error; - + vnode_pager_setsize(ovp, length); + /* * Indirect blocks first. */ @@ -264,7 +274,7 @@ printf("ext2_truncate called %d to %d\n", VTOI(ovp)->i_number, length); blocksreleased += count; if (lastiblock[level] < 0) { oip->i_ib[level] = 0; - ext2_blkfree(oip, bn, fs->s_frag_size); + ext2_blkfree(oip, bn, fs->e2fs_fsize); blocksreleased += nblocks; } } @@ -325,11 +335,11 @@ done: for (i = 0; i < NDADDR; i++) if (newblks[i] != oip->i_db[i]) panic("itrunc2"); - VI_LOCK(ovp); - if (length == 0 && (ovp->v_bufobj.bo_dirty.bv_cnt != 0 || - ovp->v_bufobj.bo_clean.bv_cnt != 0)) + BO_LOCK(bo); + if (length == 0 && (bo->bo_dirty.bv_cnt != 0 || + bo->bo_clean.bv_cnt != 0)) panic("itrunc3"); - VI_UNLOCK(ovp); + BO_UNLOCK(bo); #endif /* DIAGNOSTIC */ /* * Put back the real size. @@ -362,7 +372,7 @@ ext2_indirtrunc(ip, lbn, dbn, lastbn, level, countp) long *countp; { struct buf *bp; - struct ext2_sb_info *fs = ip->i_e2fs; + struct m_ext2fs *fs = ip->i_e2fs; struct vnode *vp; int32_t *bap, *copy, nb, nlbn, last; long blkcount, factor; @@ -380,7 +390,7 @@ ext2_indirtrunc(ip, lbn, dbn, lastbn, level, countp) last = lastbn; if (lastbn > 0) last /= factor; - nblocks = btodb(fs->s_blocksize); + nblocks = btodb(fs->e2fs_bsize); /* * Get buffer of block pointers, zero those entries corresponding * to blocks to be free'd, and update on disk copy first. Since @@ -390,7 +400,7 @@ ext2_indirtrunc(ip, lbn, dbn, lastbn, level, countp) * explicitly instead of letting bread do everything for us. */ vp = ITOV(ip); - bp = getblk(vp, lbn, (int)fs->s_blocksize, 0, 0, 0); + bp = getblk(vp, lbn, (int)fs->e2fs_bsize, 0, 0, 0); if (bp->b_flags & (B_DONE | B_DELWRI)) { } else { bp->b_iocmd = BIO_READ; @@ -409,8 +419,8 @@ ext2_indirtrunc(ip, lbn, dbn, lastbn, level, countp) } bap = (int32_t *)bp->b_data; - copy = malloc(fs->s_blocksize, M_TEMP, M_WAITOK); - bcopy((caddr_t)bap, (caddr_t)copy, (u_int)fs->s_blocksize); + copy = malloc(fs->e2fs_bsize, M_TEMP, M_WAITOK); + bcopy((caddr_t)bap, (caddr_t)copy, (u_int)fs->e2fs_bsize); bzero((caddr_t)&bap[last + 1], (u_int)(NINDIR(fs) - (last + 1)) * sizeof (int32_t)); if (last == -1) @@ -434,7 +444,7 @@ ext2_indirtrunc(ip, lbn, dbn, lastbn, level, countp) allerror = error; blocksreleased += blkcount; } - ext2_blkfree(ip, nb, fs->s_blocksize); + ext2_blkfree(ip, nb, fs->e2fs_bsize); blocksreleased += nblocks; } @@ -471,7 +481,6 @@ ext2_inactive(ap) struct thread *td = ap->a_td; int mode, error = 0; - ext2_discard_prealloc(ip); if (prtactive && vrefcnt(vp) != 0) vprint("ext2_inactive: pushing active", vp); diff --git a/sys/gnu/fs/ext2fs/ext2_inode_cnv.c b/sys/fs/ext2fs/ext2_inode_cnv.c similarity index 63% rename from sys/gnu/fs/ext2fs/ext2_inode_cnv.c rename to sys/fs/ext2fs/ext2_inode_cnv.c index de30739fc51f..b042a5a458f0 100644 --- a/sys/gnu/fs/ext2fs/ext2_inode_cnv.c +++ b/sys/fs/ext2fs/ext2_inode_cnv.c @@ -31,9 +31,10 @@ #include #include -#include -#include -#include +#include +#include +#include +#include void ext2_print_inode( in ) @@ -64,36 +65,37 @@ ext2_print_inode( in ) */ void ext2_ei2i(ei, ip) - struct ext2_inode *ei; + struct ext2fs_dinode *ei; struct inode *ip; { int i; - ip->i_nlink = ei->i_links_count; + ip->i_nlink = ei->e2di_nlink; /* Godmar thinks - if the link count is zero, then the inode is unused - according to ext2 standards. Ufs marks this fact by setting i_mode to zero - why ? I can see that this might lead to problems in an undelete. */ - ip->i_mode = ei->i_links_count ? ei->i_mode : 0; - ip->i_size = ei->i_size; + ip->i_mode = ei->e2di_nlink ? ei->e2di_mode : 0; + ip->i_size = ei->e2di_size; if (S_ISREG(ip->i_mode)) - ip->i_size |= ((u_int64_t)ei->i_size_high) << 32; - ip->i_atime = ei->i_atime; - ip->i_mtime = ei->i_mtime; - ip->i_ctime = ei->i_ctime; + ip->i_size |= ((u_int64_t)ei->e2di_size_high) << 32; + ip->i_atime = ei->e2di_atime; + ip->i_mtime = ei->e2di_mtime; + ip->i_ctime = ei->e2di_ctime; ip->i_flags = 0; - ip->i_flags |= (ei->i_flags & EXT2_APPEND_FL) ? APPEND : 0; - ip->i_flags |= (ei->i_flags & EXT2_IMMUTABLE_FL) ? IMMUTABLE : 0; - ip->i_blocks = ei->i_blocks; - ip->i_gen = ei->i_generation; - ip->i_uid = ei->i_uid; - ip->i_gid = ei->i_gid; + ip->i_flags |= (ei->e2di_flags & EXT2_APPEND) ? SF_APPEND : 0; + ip->i_flags |= (ei->e2di_flags & EXT2_IMMUTABLE) ? SF_IMMUTABLE : 0; + ip->i_flags |= (ei->e2di_flags & EXT2_NODUMP) ? UF_NODUMP : 0; + ip->i_blocks = ei->e2di_nblock; + ip->i_gen = ei->e2di_gen; + ip->i_uid = ei->e2di_uid; + ip->i_gid = ei->e2di_gid; /* XXX use memcpy */ for(i = 0; i < NDADDR; i++) - ip->i_db[i] = ei->i_block[i]; + ip->i_db[i] = ei->e2di_blocks[i]; for(i = 0; i < NIADDR; i++) - ip->i_ib[i] = ei->i_block[EXT2_NDIR_BLOCKS + i]; + ip->i_ib[i] = ei->e2di_blocks[EXT2_NDIR_BLOCKS + i]; } /* @@ -102,34 +104,35 @@ ext2_ei2i(ei, ip) void ext2_i2ei(ip, ei) struct inode *ip; - struct ext2_inode *ei; + struct ext2fs_dinode *ei; { int i; - ei->i_mode = ip->i_mode; - ei->i_links_count = ip->i_nlink; + ei->e2di_mode = ip->i_mode; + ei->e2di_nlink = ip->i_nlink; /* Godmar thinks: if dtime is nonzero, ext2 says this inode has been deleted, this would correspond to a zero link count */ - ei->i_dtime = ei->i_links_count ? 0 : ip->i_mtime; - ei->i_size = ip->i_size; + ei->e2di_dtime = ei->e2di_nlink ? 0 : ip->i_mtime; + ei->e2di_size = ip->i_size; if (S_ISREG(ip->i_mode)) - ei->i_size_high = ip->i_size >> 32; - ei->i_atime = ip->i_atime; - ei->i_mtime = ip->i_mtime; - ei->i_ctime = ip->i_ctime; - ei->i_flags = ip->i_flags; - ei->i_flags = 0; - ei->i_flags |= (ip->i_flags & APPEND) ? EXT2_APPEND_FL: 0; - ei->i_flags |= (ip->i_flags & IMMUTABLE) ? EXT2_IMMUTABLE_FL: 0; - ei->i_blocks = ip->i_blocks; - ei->i_generation = ip->i_gen; - ei->i_uid = ip->i_uid; - ei->i_gid = ip->i_gid; + ei->e2di_size_high = ip->i_size >> 32; + ei->e2di_atime = ip->i_atime; + ei->e2di_mtime = ip->i_mtime; + ei->e2di_ctime = ip->i_ctime; + ei->e2di_flags = ip->i_flags; + ei->e2di_flags = 0; + ei->e2di_flags |= (ip->i_flags & SF_APPEND) ? EXT2_APPEND: 0; + ei->e2di_flags |= (ip->i_flags & SF_IMMUTABLE) ? EXT2_IMMUTABLE: 0; + ei->e2di_flags |= (ip->i_flags & UF_NODUMP) ? EXT2_NODUMP: 0; + ei->e2di_nblock = ip->i_blocks; + ei->e2di_gen = ip->i_gen; + ei->e2di_uid = ip->i_uid; + ei->e2di_gid = ip->i_gid; /* XXX use memcpy */ for(i = 0; i < NDADDR; i++) - ei->i_block[i] = ip->i_db[i]; + ei->e2di_blocks[i] = ip->i_db[i]; for(i = 0; i < NIADDR; i++) - ei->i_block[EXT2_NDIR_BLOCKS + i] = ip->i_ib[i]; + ei->e2di_blocks[EXT2_NDIR_BLOCKS + i] = ip->i_ib[i]; } diff --git a/sys/gnu/fs/ext2fs/ext2_lookup.c b/sys/fs/ext2fs/ext2_lookup.c similarity index 83% rename from sys/gnu/fs/ext2fs/ext2_lookup.c rename to sys/fs/ext2fs/ext2_lookup.c index 6ab41e5aa1b4..56963b25d15e 100644 --- a/sys/gnu/fs/ext2fs/ext2_lookup.c +++ b/sys/fs/ext2fs/ext2_lookup.c @@ -55,11 +55,11 @@ #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #ifdef DIAGNOSTIC static int dirchk = 1; @@ -112,7 +112,7 @@ static u_char dt_to_ext2_ft[] = { ((dt) > sizeof(dt_to_ext2_ft) / sizeof(dt_to_ext2_ft[0]) ? \ EXT2_FT_UNKNOWN : dt_to_ext2_ft[(dt)]) -static int ext2_dirbadentry(struct vnode *dp, struct ext2_dir_entry_2 *de, +static int ext2_dirbadentry(struct vnode *dp, struct ext2fs_direct_2 *de, int entryoffsetinblock); /* @@ -144,13 +144,13 @@ ext2_readdir(ap) struct uio *uio = ap->a_uio; int count, error; - struct ext2_dir_entry_2 *edp, *dp; + struct ext2fs_direct_2 *edp, *dp; int ncookies; struct dirent dstdp; struct uio auio; struct iovec aiov; caddr_t dirbuf; - int DIRBLKSIZ = VTOI(ap->a_vp)->i_e2fs->s_blocksize; + int DIRBLKSIZ = VTOI(ap->a_vp)->i_e2fs->e2fs_bsize; int readcnt; off_t startoffset = uio->uio_offset; @@ -166,12 +166,6 @@ ext2_readdir(ap) count -= (uio->uio_offset + count) & (DIRBLKSIZ -1); if (count <= 0) count += DIRBLKSIZ; - -#ifdef EXT2FS_DEBUG - printf("ext2_readdir: uio_offset = %lld, uio_resid = %d, count = %d\n", - uio->uio_offset, uio->uio_resid, count); -#endif - auio = *uio; auio.uio_iov = &aiov; auio.uio_iovcnt = 1; @@ -183,10 +177,10 @@ ext2_readdir(ap) error = VOP_READ(ap->a_vp, &auio, 0, ap->a_cred); if (error == 0) { readcnt = count - auio.uio_resid; - edp = (struct ext2_dir_entry_2 *)&dirbuf[readcnt]; + edp = (struct ext2fs_direct_2 *)&dirbuf[readcnt]; ncookies = 0; bzero(&dstdp, offsetof(struct dirent, d_name)); - for (dp = (struct ext2_dir_entry_2 *)dirbuf; + for (dp = (struct ext2fs_direct_2 *)dirbuf; !error && uio->uio_resid > 0 && dp < edp; ) { /*- * "New" ext2fs directory entries differ in 3 ways @@ -204,20 +198,20 @@ ext2_readdir(ap) * because ext2fs uses a machine-independent disk * layout. */ - dstdp.d_fileno = dp->inode; - dstdp.d_type = FTTODT(dp->file_type); - dstdp.d_namlen = dp->name_len; + dstdp.d_fileno = dp->e2d_ino; + dstdp.d_type = FTTODT(dp->e2d_type); + dstdp.d_namlen = dp->e2d_namlen; dstdp.d_reclen = GENERIC_DIRSIZ(&dstdp); - bcopy(dp->name, dstdp.d_name, dstdp.d_namlen); + bcopy(dp->e2d_name, dstdp.d_name, dstdp.d_namlen); bzero(dstdp.d_name + dstdp.d_namlen, dstdp.d_reclen - offsetof(struct dirent, d_name) - dstdp.d_namlen); - if (dp->rec_len > 0) { + if (dp->e2d_reclen > 0) { if(dstdp.d_reclen <= uio->uio_resid) { /* advance dp */ - dp = (struct ext2_dir_entry_2 *) - ((char *)dp + dp->rec_len); + dp = (struct ext2fs_direct_2 *) + ((char *)dp + dp->e2d_reclen); error = uiomove(&dstdp, dstdp.d_reclen, uio); if (!error) @@ -241,11 +235,11 @@ ext2_readdir(ap) cookies = malloc(ncookies * sizeof(u_long), M_TEMP, M_WAITOK); off = startoffset; - for (dp = (struct ext2_dir_entry_2 *)dirbuf, + for (dp = (struct ext2fs_direct_2 *)dirbuf, cookiep = cookies, ecookies = cookies + ncookies; cookiep < ecookies; - dp = (struct ext2_dir_entry_2 *)((caddr_t) dp + dp->rec_len)) { - off += dp->rec_len; + dp = (struct ext2fs_direct_2 *)((caddr_t) dp + dp->e2d_reclen)) { + off += dp->e2d_reclen; *cookiep++ = (u_long) off; } *ap->a_ncookies = ncookies; @@ -299,11 +293,13 @@ ext2_lookup(ap) struct vnode *vdp; /* vnode for directory being searched */ struct inode *dp; /* inode for directory being searched */ struct buf *bp; /* a buffer of directory entries */ - struct ext2_dir_entry_2 *ep; /* the current directory entry */ + struct ext2fs_direct_2 *ep; /* the current directory entry */ int entryoffsetinblock; /* offset of ep in bp's buffer */ enum {NONE, COMPACT, FOUND} slotstatus; doff_t slotoffset; /* offset of area with free space */ int slotsize; /* size of area at slotoffset */ + doff_t i_diroff; /* cached i_diroff value */ + doff_t i_offset; /* cached i_offset value */ int slotfreespace; /* amount of space free in slot */ int slotneeded; /* size of the entry we're seeking */ int numdirpasses; /* strategy for directory search */ @@ -319,9 +315,10 @@ ext2_lookup(ap) struct ucred *cred = cnp->cn_cred; int flags = cnp->cn_flags; int nameiop = cnp->cn_nameiop; - ino_t saved_ino; + ino_t ino; + int ltype; - int DIRBLKSIZ = VTOI(ap->a_dvp)->i_e2fs->s_blocksize; + int DIRBLKSIZ = VTOI(ap->a_dvp)->i_e2fs->e2fs_bsize; bp = NULL; slotoffset = -1; @@ -338,6 +335,8 @@ ext2_lookup(ap) * we watch for a place to put the new file in * case it doesn't already exist. */ + ino = 0; + i_diroff = dp->i_diroff; slotstatus = FOUND; slotfreespace = slotsize = slotneeded = 0; if ((nameiop == CREATE || nameiop == RENAME) && @@ -361,34 +360,34 @@ ext2_lookup(ap) * of simplicity. */ bmask = VFSTOEXT2(vdp->v_mount)->um_mountp->mnt_stat.f_iosize - 1; - if (nameiop != LOOKUP || dp->i_diroff == 0 || - dp->i_diroff > dp->i_size) { + if (nameiop != LOOKUP || i_diroff == 0 || + i_diroff > dp->i_size) { entryoffsetinblock = 0; - dp->i_offset = 0; + i_offset = 0; numdirpasses = 1; } else { - dp->i_offset = dp->i_diroff; - if ((entryoffsetinblock = dp->i_offset & bmask) && - (error = ext2_blkatoff(vdp, (off_t)dp->i_offset, NULL, + i_offset = i_diroff; + if ((entryoffsetinblock = i_offset & bmask) && + (error = ext2_blkatoff(vdp, (off_t)i_offset, NULL, &bp))) return (error); numdirpasses = 2; nchstats.ncs_2passes++; } - prevoff = dp->i_offset; - endsearch = roundup(dp->i_size, DIRBLKSIZ); + prevoff = i_offset; + endsearch = roundup2(dp->i_size, DIRBLKSIZ); enduseful = 0; searchloop: - while (dp->i_offset < endsearch) { + while (i_offset < endsearch) { /* * If necessary, get the next directory block. */ - if ((dp->i_offset & bmask) == 0) { + if ((i_offset & bmask) == 0) { if (bp != NULL) brelse(bp); if ((error = - ext2_blkatoff(vdp, (off_t)dp->i_offset, NULL, + ext2_blkatoff(vdp, (off_t)i_offset, NULL, &bp)) != 0) return (error); entryoffsetinblock = 0; @@ -409,14 +408,14 @@ searchloop: * directory. Complete checks can be run by setting * "vfs.e2fs.dirchk" to be true. */ - ep = (struct ext2_dir_entry_2 *) + ep = (struct ext2fs_direct_2 *) ((char *)bp->b_data + entryoffsetinblock); - if (ep->rec_len == 0 || + if (ep->e2d_reclen == 0 || (dirchk && ext2_dirbadentry(vdp, ep, entryoffsetinblock))) { int i; - ext2_dirbad(dp, dp->i_offset, "mangled entry"); + ext2_dirbad(dp, i_offset, "mangled entry"); i = DIRBLKSIZ - (entryoffsetinblock & (DIRBLKSIZ - 1)); - dp->i_offset += i; + i_offset += i; entryoffsetinblock += i; continue; } @@ -428,23 +427,23 @@ searchloop: * compaction is viable. */ if (slotstatus != FOUND) { - int size = ep->rec_len; + int size = ep->e2d_reclen; - if (ep->inode != 0) - size -= EXT2_DIR_REC_LEN(ep->name_len); + if (ep->e2d_ino != 0) + size -= EXT2_DIR_REC_LEN(ep->e2d_namlen); if (size > 0) { if (size >= slotneeded) { slotstatus = FOUND; - slotoffset = dp->i_offset; - slotsize = ep->rec_len; + slotoffset = i_offset; + slotsize = ep->e2d_reclen; } else if (slotstatus == NONE) { slotfreespace += size; if (slotoffset == -1) - slotoffset = dp->i_offset; + slotoffset = i_offset; if (slotfreespace >= slotneeded) { slotstatus = COMPACT; - slotsize = dp->i_offset + - ep->rec_len - slotoffset; + slotsize = i_offset + + ep->e2d_reclen - slotoffset; } } } @@ -453,26 +452,25 @@ searchloop: /* * Check for a name match. */ - if (ep->inode) { - namlen = ep->name_len; + if (ep->e2d_ino) { + namlen = ep->e2d_namlen; if (namlen == cnp->cn_namelen && - !bcmp(cnp->cn_nameptr, ep->name, + !bcmp(cnp->cn_nameptr, ep->e2d_name, (unsigned)namlen)) { /* * Save directory entry's inode number and * reclen in ndp->ni_ufs area, and release * directory buffer. */ - dp->i_ino = ep->inode; - dp->i_reclen = ep->rec_len; + ino = ep->e2d_ino; goto found; } } - prevoff = dp->i_offset; - dp->i_offset += ep->rec_len; - entryoffsetinblock += ep->rec_len; - if (ep->inode) - enduseful = dp->i_offset; + prevoff = i_offset; + i_offset += ep->e2d_reclen; + entryoffsetinblock += ep->e2d_reclen; + if (ep->e2d_ino) + enduseful = i_offset; } /* notfound: */ /* @@ -481,10 +479,11 @@ searchloop: */ if (numdirpasses == 2) { numdirpasses--; - dp->i_offset = 0; - endsearch = dp->i_diroff; + i_offset = 0; + endsearch = i_diroff; goto searchloop; } + dp->i_offset = i_offset; if (bp != NULL) brelse(bp); /* @@ -510,7 +509,7 @@ searchloop: * dp->i_offset + dp->i_count. */ if (slotstatus == NONE) { - dp->i_offset = roundup(dp->i_size, DIRBLKSIZ); + dp->i_offset = roundup2(dp->i_size, DIRBLKSIZ); dp->i_count = 0; enduseful = dp->i_offset; } else { @@ -519,7 +518,7 @@ searchloop: if (enduseful < slotoffset + slotsize) enduseful = slotoffset + slotsize; } - dp->i_endoff = roundup(enduseful, DIRBLKSIZ); + dp->i_endoff = roundup2(enduseful, DIRBLKSIZ); dp->i_flag |= IN_CHANGE | IN_UPDATE; /* * We return with the directory locked, so that @@ -551,10 +550,10 @@ found: * Check that directory length properly reflects presence * of this entry. */ - if (entryoffsetinblock + EXT2_DIR_REC_LEN(ep->name_len) + if (entryoffsetinblock + EXT2_DIR_REC_LEN(ep->e2d_namlen) > dp->i_size) { - ext2_dirbad(dp, dp->i_offset, "i_size too small"); - dp->i_size = entryoffsetinblock+EXT2_DIR_REC_LEN(ep->name_len); + ext2_dirbad(dp, i_offset, "i_size too small"); + dp->i_size = entryoffsetinblock+EXT2_DIR_REC_LEN(ep->e2d_namlen); dp->i_flag |= IN_CHANGE | IN_UPDATE; } brelse(bp); @@ -565,8 +564,8 @@ found: * in the cache as to where the entry was found. */ if ((flags & ISLASTCN) && nameiop == LOOKUP) - dp->i_diroff = dp->i_offset &~ (DIRBLKSIZ - 1); - + dp->i_diroff = i_offset &~ (DIRBLKSIZ - 1); + dp->i_offset = i_offset; /* * If deleting, and at end of pathname, return * parameters which can be used to remove file. @@ -587,12 +586,12 @@ found: dp->i_count = 0; else dp->i_count = dp->i_offset - prevoff; - if (dp->i_number == dp->i_ino) { + if (dp->i_number == ino) { VREF(vdp); *vpp = vdp; return (0); } - if ((error = VFS_VGET(vdp->v_mount, dp->i_ino, LK_EXCLUSIVE, + if ((error = VFS_VGET(vdp->v_mount, ino, LK_EXCLUSIVE, &tdp)) != 0) return (error); /* @@ -625,9 +624,9 @@ found: * Careful about locking second inode. * This can only occur if the target is ".". */ - if (dp->i_number == dp->i_ino) + if (dp->i_number == ino) return (EISDIR); - if ((error = VFS_VGET(vdp->v_mount, dp->i_ino, LK_EXCLUSIVE, + if ((error = VFS_VGET(vdp->v_mount, ino, LK_EXCLUSIVE, &tdp)) != 0) return (error); *vpp = tdp; @@ -656,18 +655,29 @@ found: */ pdp = vdp; if (flags & ISDOTDOT) { - saved_ino = dp->i_ino; + ltype = VOP_ISLOCKED(pdp); VOP_UNLOCK(pdp, 0); /* race to get the inode */ - error = VFS_VGET(vdp->v_mount, saved_ino, LK_EXCLUSIVE, &tdp); - vn_lock(pdp, LK_EXCLUSIVE | LK_RETRY); + error = VFS_VGET(vdp->v_mount, ino, cnp->cn_lkflags, &tdp); + vn_lock(pdp, ltype | LK_RETRY); if (error != 0) return (error); *vpp = tdp; - } else if (dp->i_number == dp->i_ino) { + } else if (dp->i_number == ino) { VREF(vdp); /* we want ourself, ie "." */ + /* + * When we lookup "." we still can be asked to lock it + * differently. + */ + ltype = cnp->cn_lkflags & LK_TYPE_MASK; + if (ltype != VOP_ISLOCKED(vdp)) { + if (ltype == LK_EXCLUSIVE) + vn_lock(vdp, LK_UPGRADE | LK_RETRY); + else /* if (ltype == LK_SHARED) */ + vn_lock(vdp, LK_DOWNGRADE | LK_RETRY); + } *vpp = vdp; } else { - if ((error = VFS_VGET(vdp->v_mount, dp->i_ino, LK_EXCLUSIVE, + if ((error = VFS_VGET(vdp->v_mount, ino, cnp->cn_lkflags, &tdp)) != 0) return (error); *vpp = tdp; @@ -690,10 +700,13 @@ ext2_dirbad(ip, offset, how) struct mount *mp; mp = ITOV(ip)->v_mount; - (void)printf("%s: bad dir ino %lu at offset %ld: %s\n", - mp->mnt_stat.f_mntonname, (u_long)ip->i_number, (long)offset, how); if ((mp->mnt_flag & MNT_RDONLY) == 0) - panic("ext2_dirbad: bad dir"); + panic("ext2_dirbad: %s: bad dir ino %lu at offset %ld: %s\n", + mp->mnt_stat.f_mntonname, (u_long)ip->i_number,(long)offset, how); + else + (void)printf("%s: bad dir ino %lu at offset %ld: %s\n", + mp->mnt_stat.f_mntonname, (u_long)ip->i_number, (long)offset, how); + } /* @@ -710,20 +723,20 @@ ext2_dirbad(ip, offset, how) static int ext2_dirbadentry(dp, de, entryoffsetinblock) struct vnode *dp; - struct ext2_dir_entry_2 *de; + struct ext2fs_direct_2 *de; int entryoffsetinblock; { - int DIRBLKSIZ = VTOI(dp)->i_e2fs->s_blocksize; + int DIRBLKSIZ = VTOI(dp)->i_e2fs->e2fs_bsize; char * error_msg = NULL; - if (de->rec_len < EXT2_DIR_REC_LEN(1)) + if (de->e2d_reclen < EXT2_DIR_REC_LEN(1)) error_msg = "rec_len is smaller than minimal"; - else if (de->rec_len % 4 != 0) + else if (de->e2d_reclen % 4 != 0) error_msg = "rec_len % 4 != 0"; - else if (de->rec_len < EXT2_DIR_REC_LEN(de->name_len)) + else if (de->e2d_reclen < EXT2_DIR_REC_LEN(de->e2d_namlen)) error_msg = "reclen is too small for name_len"; - else if (entryoffsetinblock + de->rec_len > DIRBLKSIZ) + else if (entryoffsetinblock + de->e2d_reclen > DIRBLKSIZ) error_msg = "directory entry across blocks"; /* else LATER if (de->inode > dir->i_sb->u.ext2_sb.s_es->s_inodes_count) @@ -733,8 +746,8 @@ ext2_dirbadentry(dp, de, entryoffsetinblock) if (error_msg != NULL) { printf("bad directory entry: %s\n", error_msg); printf("offset=%d, inode=%lu, rec_len=%u, name_len=%u\n", - entryoffsetinblock, (unsigned long)de->inode, - de->rec_len, de->name_len); + entryoffsetinblock, (unsigned long)de->e2d_ino, + de->e2d_reclen, de->e2d_namlen); } return error_msg == NULL ? 0 : 1; } @@ -753,16 +766,16 @@ ext2_direnter(ip, dvp, cnp) struct vnode *dvp; struct componentname *cnp; { - struct ext2_dir_entry_2 *ep, *nep; + struct ext2fs_direct_2 *ep, *nep; struct inode *dp; struct buf *bp; - struct ext2_dir_entry_2 newdir; + struct ext2fs_direct_2 newdir; struct iovec aiov; struct uio auio; u_int dsize; int error, loc, newentrysize, spacefree; char *dirbuf; - int DIRBLKSIZ = ip->i_e2fs->s_blocksize; + int DIRBLKSIZ = ip->i_e2fs->e2fs_bsize; #ifdef DIAGNOSTIC @@ -770,15 +783,15 @@ ext2_direnter(ip, dvp, cnp) panic("direnter: missing name"); #endif dp = VTOI(dvp); - newdir.inode = ip->i_number; - newdir.name_len = cnp->cn_namelen; + newdir.e2d_ino = ip->i_number; + newdir.e2d_namlen = cnp->cn_namelen; if (EXT2_HAS_INCOMPAT_FEATURE(ip->i_e2fs, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - newdir.file_type = DTTOFT(IFTODT(ip->i_mode)); + EXT2F_INCOMPAT_FTYPE)) + newdir.e2d_type = DTTOFT(IFTODT(ip->i_mode)); else - newdir.file_type = EXT2_FT_UNKNOWN; - bcopy(cnp->cn_nameptr, newdir.name, (unsigned)cnp->cn_namelen + 1); - newentrysize = EXT2_DIR_REC_LEN(newdir.name_len); + newdir.e2d_type = EXT2_FT_UNKNOWN; + bcopy(cnp->cn_nameptr, newdir.e2d_name, (unsigned)cnp->cn_namelen + 1); + newentrysize = EXT2_DIR_REC_LEN(newdir.e2d_namlen); if (dp->i_count == 0) { /* * If dp->i_count is 0, then namei could find no @@ -789,7 +802,7 @@ ext2_direnter(ip, dvp, cnp) if (dp->i_offset & (DIRBLKSIZ - 1)) panic("ext2_direnter: newblk"); auio.uio_offset = dp->i_offset; - newdir.rec_len = DIRBLKSIZ; + newdir.e2d_reclen = DIRBLKSIZ; auio.uio_resid = newentrysize; aiov.iov_len = newentrysize; aiov.iov_base = (caddr_t)&newdir; @@ -804,7 +817,7 @@ ext2_direnter(ip, dvp, cnp) /* XXX should grow with balloc() */ panic("ext2_direnter: frag size"); else if (!error) { - dp->i_size = roundup(dp->i_size, DIRBLKSIZ); + dp->i_size = roundup2(dp->i_size, DIRBLKSIZ); dp->i_flag |= IN_CHANGE; } return (error); @@ -841,38 +854,38 @@ ext2_direnter(ip, dvp, cnp) * dp->i_offset + dp->i_count would yield the * space. */ - ep = (struct ext2_dir_entry_2 *)dirbuf; - dsize = EXT2_DIR_REC_LEN(ep->name_len); - spacefree = ep->rec_len - dsize; - for (loc = ep->rec_len; loc < dp->i_count; ) { - nep = (struct ext2_dir_entry_2 *)(dirbuf + loc); - if (ep->inode) { + ep = (struct ext2fs_direct_2 *)dirbuf; + dsize = EXT2_DIR_REC_LEN(ep->e2d_namlen); + spacefree = ep->e2d_reclen - dsize; + for (loc = ep->e2d_reclen; loc < dp->i_count; ) { + nep = (struct ext2fs_direct_2 *)(dirbuf + loc); + if (ep->e2d_ino) { /* trim the existing slot */ - ep->rec_len = dsize; - ep = (struct ext2_dir_entry_2 *)((char *)ep + dsize); + ep->e2d_reclen = dsize; + ep = (struct ext2fs_direct_2 *)((char *)ep + dsize); } else { /* overwrite; nothing there; header is ours */ spacefree += dsize; } - dsize = EXT2_DIR_REC_LEN(nep->name_len); - spacefree += nep->rec_len - dsize; - loc += nep->rec_len; + dsize = EXT2_DIR_REC_LEN(nep->e2d_namlen); + spacefree += nep->e2d_reclen - dsize; + loc += nep->e2d_reclen; bcopy((caddr_t)nep, (caddr_t)ep, dsize); } /* * Update the pointer fields in the previous entry (if any), * copy in the new entry, and write out the block. */ - if (ep->inode == 0) { + if (ep->e2d_ino == 0) { if (spacefree + dsize < newentrysize) panic("ext2_direnter: compact1"); - newdir.rec_len = spacefree + dsize; + newdir.e2d_reclen = spacefree + dsize; } else { if (spacefree < newentrysize) panic("ext2_direnter: compact2"); - newdir.rec_len = spacefree; - ep->rec_len = dsize; - ep = (struct ext2_dir_entry_2 *)((char *)ep + dsize); + newdir.e2d_reclen = spacefree; + ep->e2d_reclen = dsize; + ep = (struct ext2fs_direct_2 *)((char *)ep + dsize); } bcopy((caddr_t)&newdir, (caddr_t)ep, (u_int)newentrysize); error = bwrite(bp); @@ -901,7 +914,7 @@ ext2_dirremove(dvp, cnp) struct componentname *cnp; { struct inode *dp; - struct ext2_dir_entry_2 *ep; + struct ext2fs_direct_2 *ep, *rep; struct buf *bp; int error; @@ -914,7 +927,7 @@ ext2_dirremove(dvp, cnp) ext2_blkatoff(dvp, (off_t)dp->i_offset, (char **)&ep, &bp)) != 0) return (error); - ep->inode = 0; + ep->e2d_ino = 0; error = bwrite(bp); dp->i_flag |= IN_CHANGE | IN_UPDATE; return (error); @@ -925,7 +938,13 @@ ext2_dirremove(dvp, cnp) if ((error = ext2_blkatoff(dvp, (off_t)(dp->i_offset - dp->i_count), (char **)&ep, &bp)) != 0) return (error); - ep->rec_len += dp->i_reclen; + + /* Set 'rep' to the entry being removed. */ + if (dp->i_count == 0) + rep = ep; + else + rep = (struct ext2fs_direct_2 *)((char *)ep + ep->e2d_reclen); + ep->e2d_reclen += rep->e2d_reclen; error = bwrite(bp); dp->i_flag |= IN_CHANGE | IN_UPDATE; return (error); @@ -942,19 +961,19 @@ ext2_dirrewrite(dp, ip, cnp) struct componentname *cnp; { struct buf *bp; - struct ext2_dir_entry_2 *ep; + struct ext2fs_direct_2 *ep; struct vnode *vdp = ITOV(dp); int error; if ((error = ext2_blkatoff(vdp, (off_t)dp->i_offset, (char **)&ep, &bp)) != 0) return (error); - ep->inode = ip->i_number; + ep->e2d_ino = ip->i_number; if (EXT2_HAS_INCOMPAT_FEATURE(ip->i_e2fs, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - ep->file_type = DTTOFT(IFTODT(ip->i_mode)); + EXT2F_INCOMPAT_FTYPE)) + ep->e2d_type = DTTOFT(IFTODT(ip->i_mode)); else - ep->file_type = EXT2_FT_UNKNOWN; + ep->e2d_type = EXT2_FT_UNKNOWN; error = bwrite(bp); dp->i_flag |= IN_CHANGE | IN_UPDATE; return (error); @@ -977,11 +996,11 @@ ext2_dirempty(ip, parentino, cred) { off_t off; struct dirtemplate dbuf; - struct ext2_dir_entry_2 *dp = (struct ext2_dir_entry_2 *)&dbuf; + struct ext2fs_direct_2 *dp = (struct ext2fs_direct_2 *)&dbuf; int error, count, namlen; #define MINDIRSIZ (sizeof (struct dirtemplate) / 2) - for (off = 0; off < ip->i_size; off += dp->rec_len) { + for (off = 0; off < ip->i_size; off += dp->e2d_reclen) { error = vn_rdwr(UIO_READ, ITOV(ip), (caddr_t)dp, MINDIRSIZ, off, UIO_SYSSPACE, IO_NODELOCKED | IO_NOMACCHECK, cred, NOCRED, &count, (struct thread *)0); @@ -992,16 +1011,16 @@ ext2_dirempty(ip, parentino, cred) if (error || count != 0) return (0); /* avoid infinite loops */ - if (dp->rec_len == 0) + if (dp->e2d_reclen == 0) return (0); /* skip empty entries */ - if (dp->inode == 0) + if (dp->e2d_ino == 0) continue; /* accept only "." and ".." */ - namlen = dp->name_len; + namlen = dp->e2d_namlen; if (namlen > 2) return (0); - if (dp->name[0] != '.') + if (dp->e2d_name[0] != '.') return (0); /* * At this point namlen must be 1 or 2. @@ -1010,7 +1029,7 @@ ext2_dirempty(ip, parentino, cred) */ if (namlen == 1) continue; - if (dp->name[1] == '.' && dp->inode == parentino) + if (dp->e2d_name[1] == '.' && dp->e2d_ino == parentino) continue; return (0); } diff --git a/sys/gnu/fs/ext2fs/ext2_mount.h b/sys/fs/ext2fs/ext2_mount.h similarity index 88% rename from sys/gnu/fs/ext2fs/ext2_mount.h rename to sys/fs/ext2fs/ext2_mount.h index 6be0c7d950fb..6bc051c7bc6c 100644 --- a/sys/gnu/fs/ext2fs/ext2_mount.h +++ b/sys/fs/ext2fs/ext2_mount.h @@ -30,8 +30,8 @@ * $FreeBSD$ */ -#ifndef _SYS_GNU_EXT2FS_EXT2_MOUNT_H_ -#define _SYS_GNU_EXT2FS_EXT2_MOUNT_H_ +#ifndef _FS_EXT2FS_EXT2_MOUNT_H_ +#define _FS_EXT2FS_EXT2_MOUNT_H_ #ifdef _KERNEL @@ -47,17 +47,23 @@ struct ext2mount { struct cdev *um_dev; /* device mounted */ struct vnode *um_devvp; /* block device mounted vnode */ - struct ext2_sb_info *um_e2fs; /* EXT2FS */ -#define em_e2fsb um_e2fs->s_es + struct m_ext2fs *um_e2fs; /* EXT2FS */ +#define em_e2fsb um_e2fs->e2fs u_long um_nindir; /* indirect ptrs per block */ u_long um_bptrtodb; /* indir ptr to disk block */ u_long um_seqinc; /* inc between seq blocks */ + struct mtx um_lock; /* Protects ext2mount & fs */ + struct g_consumer *um_cp; struct bufobj *um_bo; }; +#define EXT2_LOCK(aa) mtx_lock(&(aa)->um_lock) +#define EXT2_UNLOCK(aa) mtx_unlock(&(aa)->um_lock) +#define EXT2_MTX(aa) (&(aa)->um_lock) + /* Convert mount ptr to ext2fsmount ptr. */ #define VFSTOEXT2(mp) ((struct ext2mount *)((mp)->mnt_data)) diff --git a/sys/gnu/fs/ext2fs/ext2_readwrite.c b/sys/fs/ext2fs/ext2_readwrite.c similarity index 76% rename from sys/gnu/fs/ext2fs/ext2_readwrite.c rename to sys/fs/ext2fs/ext2_readwrite.c index e533392fd2da..9c9749a21d79 100644 --- a/sys/gnu/fs/ext2fs/ext2_readwrite.c +++ b/sys/fs/ext2fs/ext2_readwrite.c @@ -36,8 +36,9 @@ * $FreeBSD$ */ +/* XXX TODO: remove these obfuscations (as in ffs_vnops.c). */ #define BLKSIZE(a, b, c) blksize(a, b, c) -#define FS struct ext2_sb_info +#define FS struct m_ext2fs #define I_FS i_e2fs #define READ ext2_read #define READ_S "ext2_read" @@ -47,7 +48,6 @@ /* * Vnode op for reading. */ -/* ARGSUSED */ static int READ(ap) struct vop_read_args /* { @@ -65,8 +65,8 @@ READ(ap) daddr_t lbn, nextlbn; off_t bytesinfile; long size, xfersize, blkoffset; - int error, orig_resid; - int seqcount = ap->a_ioflag >> IO_SEQSHIFT; + int error, orig_resid, seqcount; + seqcount = ap->a_ioflag >> IO_SEQSHIFT; u_short mode; vp = ap->a_vp; @@ -84,11 +84,14 @@ READ(ap) } else if (vp->v_type != VREG && vp->v_type != VDIR) panic("%s: type %d", READ_S, vp->v_type); #endif - fs = ip->I_FS; - if ((uoff_t)uio->uio_offset > fs->fs_maxfilesize) - return (EFBIG); - orig_resid = uio->uio_resid; + KASSERT(orig_resid >= 0, ("ext2_read: uio->uio_resid < 0")); + if (orig_resid == 0) + return (0); + KASSERT(uio->uio_offset >= 0, ("ext2_read: uio->uio_offset < 0")); + fs = ip->I_FS; + if (uio->uio_offset < ip->i_size && uio->uio_offset >= fs->e2fs_maxfilesize) + return (EOVERFLOW); for (error = 0, bp = NULL; uio->uio_resid > 0; bp = NULL) { if ((bytesinfile = ip->i_size - uio->uio_offset) <= 0) break; @@ -97,7 +100,7 @@ READ(ap) size = BLKSIZE(fs, ip, lbn); blkoffset = blkoff(fs, uio->uio_offset); - xfersize = fs->s_frag_size - blkoffset; + xfersize = fs->e2fs_fsize - blkoffset; if (uio->uio_resid < xfersize) xfersize = uio->uio_resid; if (bytesinfile < xfersize) @@ -106,9 +109,8 @@ READ(ap) if (lblktosize(fs, nextlbn) >= ip->i_size) error = bread(vp, lbn, size, NOCRED, &bp); else if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0) - error = cluster_read(vp, - ip->i_size, lbn, size, NOCRED, - uio->uio_resid, (ap->a_ioflag >> IO_SEQSHIFT), &bp); + error = cluster_read(vp, ip->i_size, lbn, size, + NOCRED, blkoffset + uio->uio_resid, seqcount, &bp); else if (seqcount > 1) { int nextsize = BLKSIZE(fs, ip, nextlbn); error = breadn(vp, lbn, @@ -134,8 +136,8 @@ READ(ap) break; xfersize = size; } - error = - uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio); + error = uiomove((char *)bp->b_data + blkoffset, + (int)xfersize, uio); if (error) break; @@ -143,7 +145,7 @@ READ(ap) } if (bp != NULL) bqrelse(bp); - if (orig_resid > 0 && (error == 0 || uio->uio_resid != orig_resid) && + if ((error == 0 || uio->uio_resid != orig_resid) && (vp->v_mount->mnt_flag & MNT_NOATIME) == 0) ip->i_flag |= IN_ACCESS; return (error); @@ -169,11 +171,10 @@ WRITE(ap) struct thread *td; daddr_t lbn; off_t osize; - int seqcount; - int blkoffset, error, flags, ioflag, resid, size, xfersize; + int blkoffset, error, flags, ioflag, resid, size, seqcount, xfersize; ioflag = ap->a_ioflag; - seqcount = ap->a_ioflag >> IO_SEQSHIFT; + seqcount = ioflag >> IO_SEQSHIFT; uio = ap->a_uio; vp = ap->a_vp; ip = VTOI(vp); @@ -193,16 +194,20 @@ WRITE(ap) case VLNK: break; case VDIR: + /* XXX differs from ffs -- this is called from ext2_mkdir(). */ if ((ioflag & IO_SYNC) == 0) - panic("%s: nonsync dir write", WRITE_S); + panic("ext2_write: nonsync dir write"); break; default: - panic("%s: type", WRITE_S); + panic("ext2_write: type %p %d (%jd,%jd)", (void *)vp, + vp->v_type, (intmax_t)uio->uio_offset, + (intmax_t)uio->uio_resid); } + KASSERT(uio->uio_resid >= 0, ("ext2_write: uio->uio_resid < 0")); + KASSERT(uio->uio_offset >= 0, ("ext2_write: uio->uio_offset < 0")); fs = ip->I_FS; - if (uio->uio_offset < 0 || - (uoff_t)uio->uio_offset + uio->uio_resid > fs->fs_maxfilesize) + if ((uoff_t)uio->uio_offset + uio->uio_resid > fs->e2fs_maxfilesize) return (EFBIG); /* * Maybe this should be above the vnode op call, but so long as @@ -227,36 +232,25 @@ WRITE(ap) for (error = 0; uio->uio_resid > 0;) { lbn = lblkno(fs, uio->uio_offset); blkoffset = blkoff(fs, uio->uio_offset); - xfersize = fs->s_frag_size - blkoffset; + xfersize = fs->e2fs_fsize - blkoffset; if (uio->uio_resid < xfersize) xfersize = uio->uio_resid; - if (uio->uio_offset + xfersize > ip->i_size) vnode_pager_setsize(vp, uio->uio_offset + xfersize); /* * Avoid a data-consistency race between write() and mmap() - * by ensuring that newly allocated blocks are zerod. The + * by ensuring that newly allocated blocks are zeroed. The * race can occur even in the case where the write covers * the entire block. */ flags |= B_CLRBUF; -#if 0 - if (fs->s_frag_size > xfersize) - flags |= B_CLRBUF; - else - flags &= ~B_CLRBUF; -#endif - - error = ext2_balloc(ip, - lbn, blkoffset + xfersize, ap->a_cred, &bp, flags); - if (error) + error = ext2_balloc(ip, lbn, blkoffset + xfersize, + ap->a_cred, &bp, flags); + if (error != 0) break; - - if (uio->uio_offset + xfersize > ip->i_size) { + if (uio->uio_offset + xfersize > ip->i_size) ip->i_size = uio->uio_offset + xfersize; - } - size = BLKSIZE(fs, ip, lbn) - bp->b_resid; if (size < xfersize) xfersize = size; @@ -264,12 +258,12 @@ WRITE(ap) error = uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio); if ((ioflag & IO_VMIO) && - (LIST_FIRST(&bp->b_dep) == NULL)) /* in ext2fs? */ + LIST_FIRST(&bp->b_dep) == NULL) /* in ext2fs? */ bp->b_flags |= B_RELBUF; if (ioflag & IO_SYNC) { (void)bwrite(bp); - } else if (xfersize + blkoffset == fs->s_frag_size) { + } else if (xfersize + blkoffset == fs->e2fs_fsize) { if ((vp->v_mount->mnt_flag & MNT_NOCLUSTERW) == 0) { bp->b_flags |= B_CLUSTEROK; cluster_write(vp, bp, ip->i_size, seqcount); @@ -282,23 +276,34 @@ WRITE(ap) } if (error || xfersize == 0) break; - ip->i_flag |= IN_CHANGE | IN_UPDATE; } /* * If we successfully wrote any data, and we are not the superuser * we clear the setuid and setgid bits as a precaution against * tampering. + * XXX too late, the tamperer may have opened the file while we + * were writing the data (or before). + * XXX too early, if (error && ioflag & IO_UNIT) then we will + * unwrite the data. */ if (resid > uio->uio_resid && ap->a_cred && ap->a_cred->cr_uid != 0) ip->i_mode &= ~(ISUID | ISGID); if (error) { + /* + * XXX should truncate to the last successfully written + * data if the uiomove() failed. + */ if (ioflag & IO_UNIT) { (void)ext2_truncate(vp, osize, ioflag & IO_SYNC, ap->a_cred, uio->uio_td); uio->uio_offset -= resid - uio->uio_resid; uio->uio_resid = resid; } - } else if (resid > uio->uio_resid && (ioflag & IO_SYNC)) - error = ext2_update(vp, 1); + } + if (uio->uio_resid != resid) { + ip->i_flag |= IN_CHANGE | IN_UPDATE; + if (ioflag & IO_SYNC) + error = ext2_update(vp, 1); + } return (error); } diff --git a/sys/gnu/fs/ext2fs/ext2_subr.c b/sys/fs/ext2fs/ext2_subr.c similarity index 95% rename from sys/gnu/fs/ext2fs/ext2_subr.c rename to sys/fs/ext2fs/ext2_subr.c index 561784294b7b..dcb1b7cd99ce 100644 --- a/sys/gnu/fs/ext2fs/ext2_subr.c +++ b/sys/fs/ext2fs/ext2_subr.c @@ -46,10 +46,10 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include #ifdef KDB void ext2_checkoverlap(struct buf *, struct inode *); @@ -68,7 +68,7 @@ ext2_blkatoff(vp, offset, res, bpp) struct buf **bpp; { struct inode *ip; - struct ext2_sb_info *fs; + struct m_ext2fs *fs; struct buf *bp; int32_t lbn; int bsize, error; diff --git a/sys/gnu/fs/ext2fs/ext2_vfsops.c b/sys/fs/ext2fs/ext2_vfsops.c similarity index 68% rename from sys/gnu/fs/ext2fs/ext2_vfsops.c rename to sys/fs/ext2fs/ext2_vfsops.c index 20c44ef052ed..7690bb8c53bd 100644 --- a/sys/gnu/fs/ext2fs/ext2_vfsops.c +++ b/sys/fs/ext2fs/ext2_vfsops.c @@ -36,24 +36,6 @@ * $FreeBSD$ */ -/*- - * COPYRIGHT.INFO says this has some GPL'd code from ext2_super.c in it - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - #include #include #include @@ -73,19 +55,18 @@ #include #include -#include -#include +#include +#include -#include -#include -#include -#include +#include +#include +#include static int ext2_flushfiles(struct mount *mp, int flags, struct thread *td); static int ext2_mountfs(struct vnode *, struct mount *); static int ext2_reload(struct mount *mp, struct thread *td); static int ext2_sbupdate(struct ext2mount *, int); - +static int ext2_cgupdate(struct ext2mount *, int); static vfs_unmount_t ext2_unmount; static vfs_root_t ext2_root; static vfs_statfs_t ext2_statfs; @@ -109,10 +90,10 @@ static struct vfsops ext2fs_vfsops = { VFS_SET(ext2fs_vfsops, ext2fs, 0); -static int ext2_check_sb_compat(struct ext2_super_block *es, struct cdev *dev, +static int ext2_check_sb_compat(struct ext2fs *es, struct cdev *dev, int ronly); static int compute_sb_data(struct vnode * devvp, - struct ext2_super_block * es, struct ext2_sb_info * fs); + struct ext2fs * es, struct m_ext2fs * fs); static const char *ext2_opts[] = { "from", "export", "acls", "noexec", "noatime", "union", "suiddir", "multilabel", "nosymfollow", @@ -130,7 +111,7 @@ ext2_mount(struct mount *mp) struct vnode *devvp; struct thread *td; struct ext2mount *ump = 0; - struct ext2_sb_info *fs; + struct m_ext2fs *fs; struct nameidata nd, *ndp = &nd; accmode_t accmode; char *path, *fspec; @@ -158,9 +139,9 @@ ext2_mount(struct mount *mp) */ if (mp->mnt_flag & MNT_UPDATE) { ump = VFSTOEXT2(mp); - fs = ump->um_e2fs; + fs = ump->um_e2fs; error = 0; - if (fs->s_rd_only == 0 && + if (fs->e2fs_ronly == 0 && vfs_flagopt(opts, "ro", NULL, 0)) { error = VFS_SYNC(mp, MNT_WAIT); if (error) @@ -168,15 +149,12 @@ ext2_mount(struct mount *mp) flags = WRITECLOSE; if (mp->mnt_flag & MNT_FORCE) flags |= FORCECLOSE; - if (vfs_busy(mp, MBF_NOWAIT)) - return (EBUSY); error = ext2_flushfiles(mp, flags, td); - vfs_unbusy(mp); - if (!error && fs->s_wasvalid) { - fs->s_es->s_state |= EXT2_VALID_FS; + if ( error == 0 && fs->e2fs_wasvalid && ext2_cgupdate(ump, MNT_WAIT) == 0) { + fs->e2fs->e2fs_state |= E2FS_ISCLEAN; ext2_sbupdate(ump, MNT_WAIT); } - fs->s_rd_only = 1; + fs->e2fs_ronly = 1; vfs_flagopt(opts, "ro", &mp->mnt_flag, MNT_RDONLY); DROP_GIANT(); g_topology_lock(); @@ -189,8 +167,8 @@ ext2_mount(struct mount *mp) if (error) return (error); devvp = ump->um_devvp; - if (fs->s_rd_only && !vfs_flagopt(opts, "ro", NULL, 0)) { - if (ext2_check_sb_compat(fs->s_es, devvp->v_rdev, 0)) + if (fs->e2fs_ronly && !vfs_flagopt(opts, "ro", NULL, 0)) { + if (ext2_check_sb_compat(fs->e2fs, devvp->v_rdev, 0)) return (EPERM); /* @@ -215,21 +193,21 @@ ext2_mount(struct mount *mp) if (error) return (error); - if ((fs->s_es->s_state & EXT2_VALID_FS) == 0 || - (fs->s_es->s_state & EXT2_ERROR_FS)) { + if ((fs->e2fs->e2fs_state & E2FS_ISCLEAN) == 0 || + (fs->e2fs->e2fs_state & E2FS_ERRORS)) { if (mp->mnt_flag & MNT_FORCE) { printf( -"WARNING: %s was not properly dismounted\n", fs->fs_fsmnt); +"WARNING: %s was not properly dismounted\n", fs->e2fs_fsmnt); } else { printf( "WARNING: R/W mount of %s denied. Filesystem is not clean - run fsck\n", - fs->fs_fsmnt); + fs->e2fs_fsmnt); return (EPERM); } } - fs->s_es->s_state &= ~EXT2_VALID_FS; - ext2_sbupdate(ump, MNT_WAIT); - fs->s_rd_only = 0; + fs->e2fs->e2fs_state &= ~E2FS_ISCLEAN; + (void)ext2_cgupdate(ump, MNT_WAIT); + fs->e2fs_ronly = 0; MNT_ILOCK(mp); mp->mnt_flag &= ~MNT_RDONLY; MNT_IUNLOCK(mp); @@ -294,78 +272,30 @@ ext2_mount(struct mount *mp) * Note that this strncpy() is ok because of a check at the start * of ext2_mount(). */ - strncpy(fs->fs_fsmnt, path, MAXMNTLEN); - fs->fs_fsmnt[MAXMNTLEN - 1] = '\0'; + strncpy(fs->e2fs_fsmnt, path, MAXMNTLEN); + fs->e2fs_fsmnt[MAXMNTLEN - 1] = '\0'; vfs_mountedfrom(mp, fspec); return (0); } -/* - * Checks that the data in the descriptor blocks make sense - * this is taken from ext2/super.c. - */ static int -ext2_check_descriptors(struct ext2_sb_info *sb) -{ - struct ext2_group_desc *gdp = NULL; - unsigned long block = sb->s_es->s_first_data_block; - int desc_block = 0; - int i; - - for (i = 0; i < sb->s_groups_count; i++) { - /* examine next descriptor block */ - if ((i % EXT2_DESC_PER_BLOCK(sb)) == 0) - gdp = (struct ext2_group_desc *) - sb->s_group_desc[desc_block++]->b_data; - if (gdp->bg_block_bitmap < block || - gdp->bg_block_bitmap >= block + EXT2_BLOCKS_PER_GROUP(sb)) { - printf ("ext2_check_descriptors: " - "Block bitmap for group %d" - " not in group (block %lu)!\n", - i, (unsigned long) gdp->bg_block_bitmap); - return (0); - } - if (gdp->bg_inode_bitmap < block || - gdp->bg_inode_bitmap >= block + EXT2_BLOCKS_PER_GROUP(sb)) { - printf ("ext2_check_descriptors: " - "Inode bitmap for group %d" - " not in group (block %lu)!\n", - i, (unsigned long) gdp->bg_inode_bitmap); - return (0); - } - if (gdp->bg_inode_table < block || - gdp->bg_inode_table + sb->s_itb_per_group >= - block + EXT2_BLOCKS_PER_GROUP(sb)) { - printf ("ext2_check_descriptors: " - "Inode table for group %d" - " not in group (block %lu)!\n", - i, (unsigned long) gdp->bg_inode_table); - return (0); - } - block += EXT2_BLOCKS_PER_GROUP(sb); - gdp++; - } - return (1); -} - -static int -ext2_check_sb_compat(struct ext2_super_block *es, struct cdev *dev, int ronly) +ext2_check_sb_compat(struct ext2fs *es, struct cdev *dev, int ronly) { - if (es->s_magic != EXT2_SUPER_MAGIC) { + if (es->e2fs_magic != E2FS_MAGIC) { printf("ext2fs: %s: wrong magic number %#x (expected %#x)\n", - devtoname(dev), es->s_magic, EXT2_SUPER_MAGIC); + devtoname(dev), es->e2fs_magic, E2FS_MAGIC); return (1); } - if (es->s_rev_level > EXT2_GOOD_OLD_REV) { - if (es->s_feature_incompat & ~EXT2_FEATURE_INCOMPAT_SUPP) { + if (es->e2fs_rev > E2FS_REV0) { + if (es->e2fs_features_incompat & ~EXT2F_INCOMPAT_SUPP) { printf( "WARNING: mount of %s denied due to unsupported optional features\n", devtoname(dev)); return (1); } if (!ronly && - (es->s_feature_ro_compat & ~EXT2_FEATURE_RO_COMPAT_SUPP)) { + (es->e2fs_features_rocompat & ~EXT2F_ROCOMPAT_SUPP)) { printf("WARNING: R/W mount of %s denied due to " "unsupported optional features\n", devtoname(dev)); return (1); @@ -379,52 +309,55 @@ ext2_check_sb_compat(struct ext2_super_block *es, struct cdev *dev, int ronly) * data in the ext2_super_block structure read in. */ static int -compute_sb_data(struct vnode *devvp, struct ext2_super_block *es, - struct ext2_sb_info *fs) +compute_sb_data(struct vnode *devvp, struct ext2fs *es, + struct m_ext2fs *fs) { int db_count, error; - int i, j; + int i; int logic_sb_block = 1; /* XXX for now */ + struct buf *bp; - fs->s_blocksize = EXT2_MIN_BLOCK_SIZE << es->s_log_block_size; - fs->s_bshift = EXT2_MIN_BLOCK_LOG_SIZE + es->s_log_block_size; - fs->s_fsbtodb = es->s_log_block_size + 1; - fs->s_qbmask = fs->s_blocksize - 1; - fs->s_blocksize_bits = es->s_log_block_size + 10; - fs->s_frag_size = EXT2_MIN_FRAG_SIZE << es->s_log_frag_size; - if (fs->s_frag_size) - fs->s_frags_per_block = fs->s_blocksize / fs->s_frag_size; - fs->s_blocks_per_group = es->s_blocks_per_group; - fs->s_frags_per_group = es->s_frags_per_group; - fs->s_inodes_per_group = es->s_inodes_per_group; - if (es->s_rev_level == EXT2_GOOD_OLD_REV) { - fs->s_first_ino = EXT2_GOOD_OLD_FIRST_INO; - fs->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE; + fs->e2fs_bsize = EXT2_MIN_BLOCK_SIZE << es->e2fs_log_bsize; + fs->e2fs_bshift = EXT2_MIN_BLOCK_LOG_SIZE + es->e2fs_log_bsize; + fs->e2fs_fsbtodb = es->e2fs_log_bsize + 1; + fs->e2fs_qbmask = fs->e2fs_bsize - 1; + fs->e2fs_blocksize_bits = es->e2fs_log_bsize + 10; + fs->e2fs_fsize = EXT2_MIN_FRAG_SIZE << es->e2fs_log_fsize; + if (fs->e2fs_fsize) + fs->e2fs_fpb = fs->e2fs_bsize / fs->e2fs_fsize; + fs->e2fs_bpg = es->e2fs_bpg; + fs->e2fs_fpg = es->e2fs_fpg; + fs->e2fs_ipg = es->e2fs_ipg; + if (es->e2fs_rev == E2FS_REV0) { + fs->e2fs_first_inode = E2FS_REV0_FIRST_INO; + fs->e2fs_isize = E2FS_REV0_INODE_SIZE ; } else { - fs->s_first_ino = es->s_first_ino; - fs->s_inode_size = es->s_inode_size; + fs->e2fs_first_inode = es->e2fs_first_ino; + fs->e2fs_isize = es->e2fs_inode_size; /* * Simple sanity check for superblock inode size value. */ - if (fs->s_inode_size < EXT2_GOOD_OLD_INODE_SIZE || - fs->s_inode_size > fs->s_blocksize || - (fs->s_inode_size & (fs->s_inode_size - 1)) != 0) { + if (fs->e2fs_isize < E2FS_REV0_INODE_SIZE || + fs->e2fs_isize > fs->e2fs_bsize || + (fs->e2fs_isize & (fs->e2fs_isize - 1)) != 0) { printf("EXT2-fs: invalid inode size %d\n", - fs->s_inode_size); + fs->e2fs_isize); return (EIO); } } - fs->s_inodes_per_block = fs->s_blocksize / EXT2_INODE_SIZE(fs); - fs->s_itb_per_group = fs->s_inodes_per_group /fs->s_inodes_per_block; - fs->s_desc_per_block = fs->s_blocksize / sizeof (struct ext2_group_desc); + fs->e2fs_ipb = fs->e2fs_bsize / EXT2_INODE_SIZE(fs); + fs->e2fs_itpg = fs->e2fs_ipg /fs->e2fs_ipb; + fs->e2fs_descpb = fs->e2fs_bsize / sizeof (struct ext2_gd); /* s_resuid / s_resgid ? */ - fs->s_groups_count = (es->s_blocks_count - es->s_first_data_block + + fs->e2fs_gcount = (es->e2fs_bcount - es->e2fs_first_dblock + EXT2_BLOCKS_PER_GROUP(fs) - 1) / EXT2_BLOCKS_PER_GROUP(fs); - db_count = (fs->s_groups_count + EXT2_DESC_PER_BLOCK(fs) - 1) / + db_count = (fs->e2fs_gcount + EXT2_DESC_PER_BLOCK(fs) - 1) / EXT2_DESC_PER_BLOCK(fs); - fs->s_gdb_count = db_count; - fs->s_group_desc = malloc(db_count * sizeof (struct buf *), + fs->e2fs_gdbcount = db_count; + fs->e2fs_gd = malloc(db_count * fs->e2fs_bsize, + M_EXT2MNT, M_WAITOK); + fs->e2fs_contigdirs = malloc(fs->e2fs_gcount * sizeof(*fs->e2fs_contigdirs), M_EXT2MNT, M_WAITOK); /* @@ -432,43 +365,34 @@ compute_sb_data(struct vnode *devvp, struct ext2_super_block *es, * Godmar thinks: if the blocksize is greater than 1024, then * the superblock is logically part of block zero. */ - if(fs->s_blocksize > SBSIZE) + if(fs->e2fs_bsize > SBSIZE) logic_sb_block = 0; - for (i = 0; i < db_count; i++) { - error = bread(devvp , fsbtodb(fs, logic_sb_block + i + 1), - fs->s_blocksize, NOCRED, &fs->s_group_desc[i]); - if(error) { - for (j = 0; j < i; j++) - brelse(fs->s_group_desc[j]); - free(fs->s_group_desc, M_EXT2MNT); - printf("EXT2-fs: unable to read group descriptors" - " (%d)\n", error); - return (EIO); + error = bread(devvp , + fsbtodb(fs, logic_sb_block + i + 1 ), + fs->e2fs_bsize, NOCRED, &bp); + if (error) { + free(fs->e2fs_gd, M_EXT2MNT); + brelse(bp); + return (error); } - LCK_BUF(fs->s_group_desc[i]) + e2fs_cgload((struct ext2_gd *)bp->b_data, + &fs->e2fs_gd[ + i * fs->e2fs_bsize / sizeof(struct ext2_gd)], + fs->e2fs_bsize); + brelse(bp); + bp = NULL; } - if(!ext2_check_descriptors(fs)) { - for (j = 0; j < db_count; j++) - ULCK_BUF(fs->s_group_desc[j]) - free(fs->s_group_desc, M_EXT2MNT); - printf("EXT2-fs: (ext2_check_descriptors failure) " - "unable to read group descriptors\n"); - return (EIO); + fs->e2fs_total_dir = 0; + for (i=0; i < fs->e2fs_gcount; i++){ + fs->e2fs_total_dir += fs->e2fs_gd[i].ext2bgd_ndirs; + fs->e2fs_contigdirs[i] = 0; } - for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) { - fs->s_inode_bitmap_number[i] = 0; - fs->s_inode_bitmap[i] = NULL; - fs->s_block_bitmap_number[i] = 0; - fs->s_block_bitmap[i] = NULL; - } - fs->s_loaded_inode_bitmaps = 0; - fs->s_loaded_block_bitmaps = 0; - if (es->s_rev_level == EXT2_GOOD_OLD_REV || - (es->s_feature_ro_compat & EXT2_FEATURE_RO_COMPAT_LARGE_FILE) == 0) - fs->fs_maxfilesize = 0x7fffffff; + if (es->e2fs_rev == E2FS_REV0 || + (es->e2fs_features_rocompat & EXT2F_ROCOMPAT_LARGEFILE) == 0) + fs->e2fs_maxfilesize = 0x7fffffff; else - fs->fs_maxfilesize = 0x7fffffffffffffff; + fs->e2fs_maxfilesize = 0x7fffffffffffffff; return (0); } @@ -484,6 +408,7 @@ compute_sb_data(struct vnode *devvp, struct ext2_super_block *es, * 4) invalidate all inactive vnodes. * 5) invalidate all cached file data. * 6) re-read inode data for all active vnodes. + * XXX we are missing some steps, in particular # 3, this has to be reviewed. */ static int ext2_reload(struct mount *mp, struct thread *td) @@ -491,8 +416,8 @@ ext2_reload(struct mount *mp, struct thread *td) struct vnode *vp, *mvp, *devvp; struct inode *ip; struct buf *bp; - struct ext2_super_block *es; - struct ext2_sb_info *fs; + struct ext2fs *es; + struct m_ext2fs *fs; int error; if ((mp->mnt_flag & MNT_RDONLY) == 0) @@ -512,13 +437,13 @@ ext2_reload(struct mount *mp, struct thread *td) */ if ((error = bread(devvp, SBLOCK, SBSIZE, NOCRED, &bp)) != 0) return (error); - es = (struct ext2_super_block *)bp->b_data; + es = (struct ext2fs *)bp->b_data; if (ext2_check_sb_compat(es, devvp->v_rdev, 0) != 0) { brelse(bp); return (EIO); /* XXX needs translation */ } fs = VFSTOEXT2(mp)->um_e2fs; - bcopy(bp->b_data, fs->s_es, sizeof(struct ext2_super_block)); + bcopy(bp->b_data, fs->e2fs, sizeof(struct ext2fs)); if((error = compute_sb_data(devvp, es, fs)) != 0) { brelse(bp); @@ -554,14 +479,14 @@ loop: */ ip = VTOI(vp); error = bread(devvp, fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), - (int)fs->s_blocksize, NOCRED, &bp); + (int)fs->e2fs_bsize, NOCRED, &bp); if (error) { VOP_UNLOCK(vp, 0); vrele(vp); MNT_VNODE_FOREACH_ABORT(mp, mvp); return (error); } - ext2_ei2i((struct ext2_inode *) ((char *)bp->b_data + + ext2_ei2i((struct ext2fs_dinode *) ((char *)bp->b_data + EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ip->i_number)), ip); brelse(bp); VOP_UNLOCK(vp, 0); @@ -580,8 +505,8 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) { struct ext2mount *ump; struct buf *bp; - struct ext2_sb_info *fs; - struct ext2_super_block *es; + struct m_ext2fs *fs; + struct ext2fs *es; struct cdev *dev = devvp->v_rdev; struct g_consumer *cp; struct bufobj *bo; @@ -622,13 +547,13 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) ump = NULL; if ((error = bread(devvp, SBLOCK, SBSIZE, NOCRED, &bp)) != 0) goto out; - es = (struct ext2_super_block *)bp->b_data; + es = (struct ext2fs *)bp->b_data; if (ext2_check_sb_compat(es, dev, ronly) != 0) { error = EINVAL; /* XXX needs translation */ goto out; } - if ((es->s_state & EXT2_VALID_FS) == 0 || - (es->s_state & EXT2_ERROR_FS)) { + if ((es->e2fs_state & E2FS_ISCLEAN) == 0 || + (es->e2fs_state & E2FS_ERRORS)) { if (ronly || (mp->mnt_flag & MNT_FORCE)) { printf( "WARNING: Filesystem was not properly dismounted\n"); @@ -647,31 +572,28 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) * we dynamically allocate both an ext2_sb_info and an ext2_super_block * while Linux keeps the super block in a locked buffer. */ - ump->um_e2fs = malloc(sizeof(struct ext2_sb_info), + ump->um_e2fs = malloc(sizeof(struct m_ext2fs), M_EXT2MNT, M_WAITOK); - ump->um_e2fs->s_es = malloc(sizeof(struct ext2_super_block), + ump->um_e2fs->e2fs = malloc(sizeof(struct ext2fs), M_EXT2MNT, M_WAITOK); - bcopy(es, ump->um_e2fs->s_es, (u_int)sizeof(struct ext2_super_block)); - if ((error = compute_sb_data(devvp, ump->um_e2fs->s_es, ump->um_e2fs))) + mtx_init(EXT2_MTX(ump), "EXT2FS", "EXT2FS Lock", MTX_DEF); + bcopy(es, ump->um_e2fs->e2fs, (u_int)sizeof(struct ext2fs)); + if ((error = compute_sb_data(devvp, ump->um_e2fs->e2fs, ump->um_e2fs))) goto out; - /* - * We don't free the group descriptors allocated by compute_sb_data() - * until ext2_unmount(). This is OK since the mount will succeed. - */ brelse(bp); bp = NULL; fs = ump->um_e2fs; - fs->s_rd_only = ronly; /* ronly is set according to mnt_flags */ + fs->e2fs_ronly = ronly; /* ronly is set according to mnt_flags */ /* * If the fs is not mounted read-only, make sure the super block is * always written back on a sync(). */ - fs->s_wasvalid = fs->s_es->s_state & EXT2_VALID_FS ? 1 : 0; + fs->e2fs_wasvalid = fs->e2fs->e2fs_state & E2FS_ISCLEAN ? 1 : 0; if (ronly == 0) { - fs->s_dirt = 1; /* mark it modified */ - fs->s_es->s_state &= ~EXT2_VALID_FS; /* set fs invalid */ + fs->e2fs_fmod = 1; /* mark it modified */ + fs->e2fs->e2fs_state &= ~E2FS_ISCLEAN; /* set fs invalid */ } mp->mnt_data = ump; mp->mnt_stat.f_fsid.val[0] = dev2udev(dev); @@ -691,10 +613,17 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp) * ufs_bmap w/o changse! */ ump->um_nindir = EXT2_ADDR_PER_BLOCK(fs); - ump->um_bptrtodb = fs->s_es->s_log_block_size + 1; + ump->um_bptrtodb = fs->e2fs->e2fs_log_bsize + 1; ump->um_seqinc = EXT2_FRAGS_PER_BLOCK(fs); if (ronly == 0) ext2_sbupdate(ump, MNT_WAIT); + /* + * Initialize filesystem stat information in mount struct. + */ + MNT_ILOCK(mp); + mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED | + MNTK_EXTENDED_SHARED; + MNT_IUNLOCK(mp); return (0); out: if (bp) @@ -707,7 +636,10 @@ out: PICKUP_GIANT(); } if (ump) { - free(ump->um_e2fs->s_es, M_EXT2MNT); + mtx_destroy(EXT2_MTX(ump)); + free(ump->um_e2fs->e2fs_gd, M_EXT2MNT); + free(ump->um_e2fs->e2fs_contigdirs, M_EXT2MNT); + free(ump->um_e2fs->e2fs, M_EXT2MNT); free(ump->um_e2fs, M_EXT2MNT); free(ump, M_EXT2MNT); mp->mnt_data = NULL; @@ -722,8 +654,8 @@ static int ext2_unmount(struct mount *mp, int mntflags) { struct ext2mount *ump; - struct ext2_sb_info *fs; - int error, flags, ronly, i; + struct m_ext2fs *fs; + int error, flags, ronly; flags = 0; if (mntflags & MNT_FORCE) { @@ -735,33 +667,22 @@ ext2_unmount(struct mount *mp, int mntflags) return (error); ump = VFSTOEXT2(mp); fs = ump->um_e2fs; - ronly = fs->s_rd_only; - if (ronly == 0) { - if (fs->s_wasvalid) - fs->s_es->s_state |= EXT2_VALID_FS; - ext2_sbupdate(ump, MNT_WAIT); + ronly = fs->e2fs_ronly; + if (ronly == 0 && ext2_cgupdate(ump, MNT_WAIT) == 0) { + if (fs->e2fs_wasvalid) + fs->e2fs->e2fs_state |= E2FS_ISCLEAN; + ext2_sbupdate(ump, MNT_WAIT); } - /* release buffers containing group descriptors */ - for(i = 0; i < fs->s_gdb_count; i++) - ULCK_BUF(fs->s_group_desc[i]) - free(fs->s_group_desc, M_EXT2MNT); - - /* release cached inode/block bitmaps */ - for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) - if (fs->s_inode_bitmap[i]) - ULCK_BUF(fs->s_inode_bitmap[i]) - for (i = 0; i < EXT2_MAX_GROUP_LOADED; i++) - if (fs->s_block_bitmap[i]) - ULCK_BUF(fs->s_block_bitmap[i]) - DROP_GIANT(); g_topology_lock(); g_vfs_close(ump->um_cp); g_topology_unlock(); PICKUP_GIANT(); vrele(ump->um_devvp); - free(fs->s_es, M_EXT2MNT); + free(fs->e2fs_gd, M_EXT2MNT); + free(fs->e2fs_contigdirs, M_EXT2MNT); + free(fs->e2fs, M_EXT2MNT); free(fs, M_EXT2MNT); free(ump, M_EXT2MNT); mp->mnt_data = NULL; @@ -782,50 +703,53 @@ ext2_flushfiles(struct mount *mp, int flags, struct thread *td) error = vflush(mp, 0, flags, td); return (error); } - /* * Get file system statistics. - * taken from ext2/super.c ext2_statfs. */ -static int +int ext2_statfs(struct mount *mp, struct statfs *sbp) { struct ext2mount *ump; - struct ext2_sb_info *fs; - struct ext2_super_block *es; - unsigned long overhead; - int i, nsb; + struct m_ext2fs *fs; + uint32_t overhead, overhead_per_group, ngdb; + int i, ngroups; ump = VFSTOEXT2(mp); fs = ump->um_e2fs; - es = fs->s_es; - - if (es->s_magic != EXT2_SUPER_MAGIC) - panic("ext2_statfs - magic number spoiled"); + if (fs->e2fs->e2fs_magic != E2FS_MAGIC) + panic("ext2fs_statvfs"); /* * Compute the overhead (FS structures) */ - if (es->s_feature_ro_compat & EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER) { - nsb = 0; - for (i = 0 ; i < fs->s_groups_count; i++) - if (ext2_group_sparse(i)) - nsb++; - } else - nsb = fs->s_groups_count; - overhead = es->s_first_data_block + - /* Superblocks and block group descriptors: */ - nsb * (1 + fs->s_gdb_count) + - /* Inode bitmap, block bitmap, and inode table: */ - fs->s_groups_count * (1 + 1 + fs->s_itb_per_group); + overhead_per_group = + 1 /* block bitmap */ + + 1 /* inode bitmap */ + + fs->e2fs_itpg; + overhead = fs->e2fs->e2fs_first_dblock + + fs->e2fs_gcount * overhead_per_group; + if (fs->e2fs->e2fs_rev > E2FS_REV0 && + fs->e2fs->e2fs_features_rocompat & EXT2F_ROCOMPAT_SPARSESUPER) { + for (i = 0, ngroups = 0; i < fs->e2fs_gcount; i++) { + if (cg_has_sb(i)) + ngroups++; + } + } else { + ngroups = fs->e2fs_gcount; + } + ngdb = fs->e2fs_gdbcount; + if (fs->e2fs->e2fs_rev > E2FS_REV0 && + fs->e2fs->e2fs_features_compat & EXT2F_COMPAT_RESIZE) + ngdb += fs->e2fs->e2fs_reserved_ngdb; + overhead += ngroups * (1 /* superblock */ + ngdb); sbp->f_bsize = EXT2_FRAG_SIZE(fs); sbp->f_iosize = EXT2_BLOCK_SIZE(fs); - sbp->f_blocks = es->s_blocks_count - overhead; - sbp->f_bfree = es->s_free_blocks_count; - sbp->f_bavail = sbp->f_bfree - es->s_r_blocks_count; - sbp->f_files = es->s_inodes_count; - sbp->f_ffree = es->s_free_inodes_count; + sbp->f_blocks = fs->e2fs->e2fs_bcount - overhead; + sbp->f_bfree = fs->e2fs->e2fs_fbcount; + sbp->f_bavail = sbp->f_bfree - fs->e2fs->e2fs_rbcount; + sbp->f_files = fs->e2fs->e2fs_icount; + sbp->f_ffree = fs->e2fs->e2fs_ficount; return (0); } @@ -843,13 +767,13 @@ ext2_sync(struct mount *mp, int waitfor) struct thread *td; struct inode *ip; struct ext2mount *ump = VFSTOEXT2(mp); - struct ext2_sb_info *fs; + struct m_ext2fs *fs; int error, allerror = 0; td = curthread; fs = ump->um_e2fs; - if (fs->s_dirt != 0 && fs->s_rd_only != 0) { /* XXX */ - printf("fs = %s\n", fs->fs_fsmnt); + if (fs->e2fs_fmod != 0 && fs->e2fs_ronly != 0) { /* XXX */ + printf("fs = %s\n", fs->e2fs_fsmnt); panic("ext2_sync: rofs mod"); } @@ -904,10 +828,10 @@ loop: /* * Write back modified superblock. */ - if (fs->s_dirt != 0) { - fs->s_dirt = 0; - fs->s_es->s_wtime = time_second; - if ((error = ext2_sbupdate(ump, waitfor)) != 0) + if (fs->e2fs_fmod != 0) { + fs->e2fs_fmod = 0; + fs->e2fs->e2fs_wtime = time_second; + if ((error = ext2_cgupdate(ump, waitfor)) != 0) allerror = error; } return (allerror); @@ -922,7 +846,7 @@ loop: static int ext2_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) { - struct ext2_sb_info *fs; + struct m_ext2fs *fs; struct inode *ip; struct ext2mount *ump; struct buf *bp; @@ -958,6 +882,7 @@ ext2_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) vp->v_data = ip; ip->i_vnode = vp; ip->i_e2fs = fs = ump->um_e2fs; + ip->i_ump = ump; ip->i_number = ino; lockmgr(vp->v_vnlock, LK_EXCLUSIVE, NULL); @@ -973,20 +898,20 @@ ext2_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) /* Read in the disk contents for the inode, copy into the inode. */ if ((error = bread(ump->um_devvp, fsbtodb(fs, ino_to_fsba(fs, ino)), - (int)fs->s_blocksize, NOCRED, &bp)) != 0) { + (int)fs->e2fs_bsize, NOCRED, &bp)) != 0) { /* * The inode does not contain anything useful, so it would * be misleading to leave it on its hash chain. With mode * still zero, it will be unlinked and returned to the free * list by vput(). */ - vput(vp); brelse(bp); + vput(vp); *vpp = NULL; return (error); } /* convert ext2 inode to dinode */ - ext2_ei2i((struct ext2_inode *) ((char *)bp->b_data + EXT2_INODE_SIZE(fs) * + ext2_ei2i((struct ext2fs_dinode *) ((char *)bp->b_data + EXT2_INODE_SIZE(fs) * ino_to_fsbo(fs, ino)), ip); ip->i_block_group = ino_to_cg(fs, ino); ip->i_next_alloc_block = 0; @@ -1000,14 +925,14 @@ ext2_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp) * although for regular files and directories only */ if(S_ISDIR(ip->i_mode) || S_ISREG(ip->i_mode)) { - used_blocks = (ip->i_size+fs->s_blocksize-1) / fs->s_blocksize; + used_blocks = (ip->i_size+fs->e2fs_bsize-1) / fs->e2fs_bsize; for(i = used_blocks; i < EXT2_NDIR_BLOCKS; i++) ip->i_db[i] = 0; } /* ext2_print_inode(ip); */ - brelse(bp); + bqrelse(bp); /* * Initialize the vnode from the inode, check for aliases. @@ -1053,13 +978,13 @@ ext2_fhtovp(struct mount *mp, struct fid *fhp, struct vnode **vpp) struct inode *ip; struct ufid *ufhp; struct vnode *nvp; - struct ext2_sb_info *fs; + struct m_ext2fs *fs; int error; ufhp = (struct ufid *)fhp; fs = VFSTOEXT2(mp)->um_e2fs; if (ufhp->ufid_ino < ROOTINO || - ufhp->ufid_ino > fs->s_groups_count * fs->s_es->s_inodes_per_group) + ufhp->ufid_ino > fs->e2fs_gcount * fs->e2fs->e2fs_ipg) return (ESTALE); error = VFS_VGET(mp, ufhp->ufid_ino, LK_EXCLUSIVE, &nvp); @@ -1085,13 +1010,13 @@ ext2_fhtovp(struct mount *mp, struct fid *fhp, struct vnode **vpp) static int ext2_sbupdate(struct ext2mount *mp, int waitfor) { - struct ext2_sb_info *fs = mp->um_e2fs; - struct ext2_super_block *es = fs->s_es; + struct m_ext2fs *fs = mp->um_e2fs; + struct ext2fs *es = fs->e2fs; struct buf *bp; int error = 0; bp = getblk(mp->um_devvp, SBLOCK, SBSIZE, 0, 0, 0); - bcopy((caddr_t)es, bp->b_data, (u_int)sizeof(struct ext2_super_block)); + bcopy((caddr_t)es, bp->b_data, (u_int)sizeof(struct ext2fs)); if (waitfor == MNT_WAIT) error = bwrite(bp); else @@ -1104,7 +1029,31 @@ ext2_sbupdate(struct ext2mount *mp, int waitfor) */ return (error); } +int +ext2_cgupdate(struct ext2mount *mp, int waitfor) +{ + struct m_ext2fs *fs = mp->um_e2fs; + struct buf *bp; + int i, error = 0, allerror = 0; + allerror = ext2_sbupdate(mp, waitfor); + for (i = 0; i < fs->e2fs_gdbcount; i++) { + bp = getblk(mp->um_devvp, fsbtodb(fs, + fs->e2fs->e2fs_first_dblock + + 1 /* superblock */ + i), fs->e2fs_bsize, 0, 0, 0); + e2fs_cgsave(&fs->e2fs_gd[ + i * fs->e2fs_bsize / sizeof(struct ext2_gd)], + (struct ext2_gd *)bp->b_data, fs->e2fs_bsize); + if (waitfor == MNT_WAIT) + error = bwrite(bp); + else + bawrite(bp); + } + + if (!allerror && error) + allerror = error; + return (allerror); +} /* * Return the root of a filesystem. */ diff --git a/sys/gnu/fs/ext2fs/ext2_vnops.c b/sys/fs/ext2fs/ext2_vnops.c similarity index 95% rename from sys/gnu/fs/ext2fs/ext2_vnops.c rename to sys/fs/ext2fs/ext2_vnops.c index 41643e3e739a..2b2f8c547c71 100644 --- a/sys/gnu/fs/ext2fs/ext2_vnops.c +++ b/sys/fs/ext2fs/ext2_vnops.c @@ -74,14 +74,15 @@ #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int ext2_makeinode(int mode, struct vnode *, struct vnode **, struct componentname *); +static void ext2_itimes_locked(struct vnode *); static vop_access_t ext2_access; static int ext2_chmod(struct vnode *, int, struct ucred *, struct thread *); @@ -160,7 +161,7 @@ struct vop_vector ext2_fifoops = { .vop_vptofh = ext2_vptofh, }; -#include +#include /* * A virgin directory (no blushing please). @@ -177,13 +178,14 @@ static struct dirtemplate omastertemplate = { 0, DIRBLKSIZ - 12, 2, EXT2_FT_UNKNOWN, ".." }; -void -ext2_itimes(vp) - struct vnode *vp; +static void +ext2_itimes_locked(struct vnode *vp) { struct inode *ip; struct timespec ts; + ASSERT_VI_LOCKED(vp, __func__); + ip = VTOI(vp); if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0) return; @@ -210,6 +212,15 @@ ext2_itimes(vp) ip->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); } +void +ext2_itimes(struct vnode *vp) +{ + + VI_LOCK(vp); + ext2_itimes_locked(vp); + VI_UNLOCK(vp); +} + /* * Create a regular file */ @@ -275,7 +286,7 @@ ext2_close(ap) VI_LOCK(vp); if (vp->v_usecount > 1) - ext2_itimes(vp); + ext2_itimes_locked(vp); VI_UNLOCK(vp); return (0); } @@ -316,7 +327,7 @@ ext2_access(ap) } /* If immutable bit set, nobody gets to write it. */ - if ((accmode & VWRITE) && (ip->i_flags & (IMMUTABLE | SF_SNAPSHOT))) + if ((accmode & VWRITE) && (ip->i_flags & (SF_IMMUTABLE | SF_SNAPSHOT))) return (EPERM); error = vaccess(vp->v_type, ip->i_mode, ip->i_uid, ip->i_gid, @@ -391,6 +402,10 @@ ext2_setattr(ap) return (EINVAL); } if (vap->va_flags != VNOVAL) { + /* Disallow flags not supported by ext2fs. */ + if(vap->va_flags & ~(SF_APPEND | SF_IMMUTABLE | UF_NODUMP)) + return (EOPNOTSUPP); + if (vp->v_mount->mnt_flag & MNT_RDONLY) return (EROFS); /* @@ -606,7 +621,6 @@ ext2_fsync(ap) /* * Flush all dirty buffers associated with a vnode. */ - ext2_discard_prealloc(VTOI(ap->a_vp)); vop_stdfsync(ap); @@ -739,7 +753,27 @@ out: /* * Rename system call. - * See comments in sys/ufs/ufs/ufs_vnops.c + * rename("foo", "bar"); + * is essentially + * unlink("bar"); + * link("foo", "bar"); + * unlink("foo"); + * but ``atomically''. Can't do full commit without saving state in the + * inode on disk which isn't feasible at this time. Best we can do is + * always guarantee the target exists. + * + * Basic algorithm is: + * + * 1) Bump link count on source while we're linking it to the + * target. This also ensure the inode won't be deleted out + * from underneath us while we work (it may be truncated by + * a concurrent `trunc' or `open' for creation). + * 2) Link source to destination. If destination already exists, + * delete it first. + * 3) Unlink source reference to inode if still around. If a + * directory was moved and the parent of the destination + * is different from the source, patch the ".." entry in the + * directory. */ static int ext2_rename(ap) @@ -860,7 +894,7 @@ abortit: /* * If ".." must be changed (ie the directory gets a new * parent) then the source directory must not be in the - * directory heirarchy above the target, as this would + * directory hierarchy above the target, as this would * orphan everything below the source directory. Also * the user must have write permission in the source so * as to be able to change "..". We must repeat the call @@ -1185,7 +1219,7 @@ ext2_mkdir(ap) /* Initialize directory with "." and ".." from static template. */ if (EXT2_HAS_INCOMPAT_FEATURE(ip->i_e2fs, - EXT2_FEATURE_INCOMPAT_FILETYPE)) + EXT2F_INCOMPAT_FTYPE)) dtp = &mastertemplate; else dtp = &omastertemplate; @@ -1196,7 +1230,7 @@ ext2_mkdir(ap) * so let's just redefine it - for this function only */ #undef DIRBLKSIZ -#define DIRBLKSIZ VTOI(dvp)->i_e2fs->s_blocksize +#define DIRBLKSIZ VTOI(dvp)->i_e2fs->e2fs_bsize dirtemplate.dotdot_reclen = DIRBLKSIZ - 12; error = vn_rdwr(UIO_WRITE, tvp, (caddr_t)&dirtemplate, sizeof (dirtemplate), (off_t)0, UIO_SYSSPACE, @@ -1450,7 +1484,7 @@ ext2fifo_close(ap) VI_LOCK(vp); if (vp->v_usecount > 1) - ext2_itimes(vp); + ext2_itimes_locked(vp); VI_UNLOCK(vp); return (fifo_specops.vop_close(ap)); } diff --git a/sys/fs/ext2fs/ext2fs.h b/sys/fs/ext2fs/ext2fs.h new file mode 100755 index 000000000000..2efc57fa92f2 --- /dev/null +++ b/sys/fs/ext2fs/ext2fs.h @@ -0,0 +1,329 @@ +/*- + * modified for EXT2FS support in Lites 1.1 + * + * Aug 1995, Godmar Back (gback@cs.utah.edu) + * University of Utah, Department of Computer Science + * + * $FreeBSD$ + */ +/*- + * Copyright (c) 2009 Aditya Sarawgi + * 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. + * + * + */ + +#ifndef _FS_EXT2FS_EXT2_FS_H +#define _FS_EXT2FS_EXT2_FS_H + +#include + +/* + * Special inode numbers + */ +#define EXT2_BAD_INO 1 /* Bad blocks inode */ +#define EXT2_ROOT_INO 2 /* Root inode */ +#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ +#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ + +/* First non-reserved inode for old ext2 filesystems */ +#define E2FS_REV0_FIRST_INO 11 + +/* + * The second extended file system magic number + */ +#define E2FS_MAGIC 0xEF53 + +#if defined(_KERNEL) +/* + * FreeBSD passes the pointer to the in-core struct with relevant + * fields to EXT2_SB macro when accessing superblock fields. + */ +#define EXT2_SB(sb) (sb) +#else +/* Assume that user mode programs are passing in an ext2fs superblock, not + * a kernel struct super_block. This will allow us to call the feature-test + * macros from user land. */ +#define EXT2_SB(sb) (sb) +#endif + +/* + * Maximal count of links to a file + */ +#define EXT2_LINK_MAX 32000 + +/* + * Constants relative to the data blocks + */ +#define EXT2_NDIR_BLOCKS 12 +#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS +#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) +#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) +#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) +#define EXT2_MAXSYMLINKLEN (EXT2_N_BLOCKS * sizeof (uint32_t)) + +/* + * The path name on which the file system is mounted is maintained + * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in + * the super block for this name. + */ +#define MAXMNTLEN 512 + +/* + * Super block for an ext2fs file system. + */ +struct ext2fs { + u_int32_t e2fs_icount; /* Inode count */ + u_int32_t e2fs_bcount; /* blocks count */ + u_int32_t e2fs_rbcount; /* reserved blocks count */ + u_int32_t e2fs_fbcount; /* free blocks count */ + u_int32_t e2fs_ficount; /* free inodes count */ + u_int32_t e2fs_first_dblock; /* first data block */ + u_int32_t e2fs_log_bsize; /* block size = 1024*(2^e2fs_log_bsize) */ + u_int32_t e2fs_log_fsize; /* fragment size */ + u_int32_t e2fs_bpg; /* blocks per group */ + u_int32_t e2fs_fpg; /* frags per group */ + u_int32_t e2fs_ipg; /* inodes per group */ + u_int32_t e2fs_mtime; /* mount time */ + u_int32_t e2fs_wtime; /* write time */ + u_int16_t e2fs_mnt_count; /* mount count */ + u_int16_t e2fs_max_mnt_count; /* max mount count */ + u_int16_t e2fs_magic; /* magic number */ + u_int16_t e2fs_state; /* file system state */ + u_int16_t e2fs_beh; /* behavior on errors */ + u_int16_t e2fs_minrev; /* minor revision level */ + u_int32_t e2fs_lastfsck; /* time of last fsck */ + u_int32_t e2fs_fsckintv; /* max time between fscks */ + u_int32_t e2fs_creator; /* creator OS */ + u_int32_t e2fs_rev; /* revision level */ + u_int16_t e2fs_ruid; /* default uid for reserved blocks */ + u_int16_t e2fs_rgid; /* default gid for reserved blocks */ + /* EXT2_DYNAMIC_REV superblocks */ + u_int32_t e2fs_first_ino; /* first non-reserved inode */ + u_int16_t e2fs_inode_size; /* size of inode structure */ + u_int16_t e2fs_block_group_nr; /* block grp number of this sblk*/ + u_int32_t e2fs_features_compat; /* compatible feature set */ + u_int32_t e2fs_features_incompat; /* incompatible feature set */ + u_int32_t e2fs_features_rocompat; /* RO-compatible feature set */ + u_int8_t e2fs_uuid[16]; /* 128-bit uuid for volume */ + char e2fs_vname[16]; /* volume name */ + char e2fs_fsmnt[64]; /* name mounted on */ + u_int32_t e2fs_algo; /* For comcate for dir */ + u_int16_t e2fs_reserved_ngdb; /* # of reserved gd blocks for resize */ + u_int32_t reserved2[204]; +}; + + +/* Assume that user mode programs are passing in an ext2fs superblock, not + * a kernel struct super_block. This will allow us to call the feature-test + * macros from user land. */ +#define EXT2_SB(sb) (sb) + +/* + * In-Memory Superblock + */ + +struct m_ext2fs { + struct ext2fs * e2fs; + char e2fs_fsmnt[MAXMNTLEN];/* name mounted on */ + char e2fs_ronly; /* mounted read-only flag */ + char e2fs_fmod; /* super block modified flag */ + uint32_t e2fs_bsize; /* Block size */ + uint32_t e2fs_bshift; /* calc of logical block no */ + int32_t e2fs_bmask; /* calc of block offset */ + int32_t e2fs_bpg; /* Number of blocks per group */ + int64_t e2fs_qbmask; /* = s_blocksize -1 */ + uint32_t e2fs_fsbtodb; /* Shift to get disk block */ + uint32_t e2fs_ipg; /* Number of inodes per group */ + uint32_t e2fs_ipb; /* Number of inodes per block */ + uint32_t e2fs_itpg; /* Number of inode table per group */ + uint32_t e2fs_fsize; /* Size of fragments per block */ + uint32_t e2fs_fpb; /* Number of fragments per block */ + uint32_t e2fs_fpg; /* Number of fragments per group */ + uint32_t e2fs_dbpg; /* Number of descriptor blocks per group */ + uint32_t e2fs_descpb; /* Number of group descriptors per block */ + uint32_t e2fs_gdbcount; /* Number of group descriptors */ + uint32_t e2fs_gcount; /* Number of groups */ + uint32_t e2fs_first_inode;/* First inode on fs */ + int32_t e2fs_isize; /* Size of inode */ + uint32_t e2fs_mount_opt; + uint32_t e2fs_blocksize_bits; + uint32_t e2fs_total_dir; /* Total number of directories */ + uint8_t *e2fs_contigdirs; + char e2fs_wasvalid; /* valid at mount time */ + off_t e2fs_maxfilesize; + struct ext2_gd *e2fs_gd; /* Group Descriptors */ +}; + +/* + * The second extended file system version + */ +#define E2FS_DATE "95/08/09" +#define E2FS_VERSION "0.5b" + +/* + * Revision levels + */ +#define E2FS_REV0 0 /* The good old (original) format */ +#define E2FS_REV1 1 /* V2 format w/ dynamic inode sizes */ + +#define E2FS_CURRENT_REV E2FS_REV0 +#define E2FS_MAX_SUPP_REV E2FS_REV1 + +#define E2FS_REV0_INODE_SIZE 128 + +/* + * compatible/incompatible features + */ +#define EXT2F_COMPAT_PREALLOC 0x0001 +#define EXT2F_COMPAT_RESIZE 0x0010 + +#define EXT2F_ROCOMPAT_SPARSESUPER 0x0001 +#define EXT2F_ROCOMPAT_LARGEFILE 0x0002 +#define EXT2F_ROCOMPAT_BTREE_DIR 0x0004 + +#define EXT2F_INCOMPAT_COMP 0x0001 +#define EXT2F_INCOMPAT_FTYPE 0x0002 + +/* + * Features supported in this implementation + * + * We support the following REV1 features: + * - EXT2F_ROCOMPAT_SPARSESUPER + * - EXT2F_ROCOMPAT_LARGEFILE + * - EXT2F_INCOMPAT_FTYPE + */ +#define EXT2F_COMPAT_SUPP 0x0000 +#define EXT2F_ROCOMPAT_SUPP (EXT2F_ROCOMPAT_SPARSESUPER \ + | EXT2F_ROCOMPAT_LARGEFILE) +#define EXT2F_INCOMPAT_SUPP EXT2F_INCOMPAT_FTYPE + +/* + * Feature set definitions + */ +#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ + ( EXT2_SB(sb)->e2fs->e2fs_features_compat & htole32(mask) ) +#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ + ( EXT2_SB(sb)->e2fs->e2fs_features_rocompat & htole32(mask) ) +#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ + ( EXT2_SB(sb)->e2fs->e2fs_features_incompat & htole32(mask) ) + +/* + * Definitions of behavior on errors + */ +#define E2FS_BEH_CONTINUE 1 /* continue operation */ +#define E2FS_BEH_READONLY 2 /* remount fs read only */ +#define E2FS_BEH_PANIC 3 /* cause panic */ +#define E2FS_BEH_DEFAULT E2FS_BEH_CONTINUE + +/* + * OS identification + */ +#define E2FS_OS_LINUX 0 +#define E2FS_OS_HURD 1 +#define E2FS_OS_MASIX 2 +#define E2FS_OS_FREEBSD 3 +#define E2FS_OS_LITES 4 + +/* + * File clean flags + */ +#define E2FS_ISCLEAN 0x0001 /* Unmounted cleanly */ +#define E2FS_ERRORS 0x0002 /* Errors detected */ + +/* ext2 file system block group descriptor */ + +struct ext2_gd { + u_int32_t ext2bgd_b_bitmap; /* blocks bitmap block */ + u_int32_t ext2bgd_i_bitmap; /* inodes bitmap block */ + u_int32_t ext2bgd_i_tables; /* inodes table block */ + u_int16_t ext2bgd_nbfree; /* number of free blocks */ + u_int16_t ext2bgd_nifree; /* number of free inodes */ + u_int16_t ext2bgd_ndirs; /* number of directories */ + u_int16_t reserved; + u_int32_t reserved2[3]; +}; + +/* EXT2FS metadatas are stored in little-endian byte order. These macros + * helps reading these metadatas + */ + +#define e2fs_cgload(old, new, size) memcpy((new), (old), (size)); +#define e2fs_cgsave(old, new, size) memcpy((new), (old), (size)); +/* + * Macro-instructions used to manage several block sizes + */ +#define EXT2_MIN_BLOCK_SIZE 1024 +#define EXT2_MAX_BLOCK_SIZE 4096 +#define EXT2_MIN_BLOCK_LOG_SIZE 10 +#if defined(_KERNEL) +# define EXT2_BLOCK_SIZE(s) ((s)->e2fs_bsize) +#else +# define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->e2fs_log_bsize) +#endif +#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (uint32_t)) +#if defined(_KERNEL) +# define EXT2_BLOCK_SIZE_BITS(s) ((s)->e2fs_blocksize_bits) +#else +# define EXT2_BLOCK_SIZE_BITS(s) ((s)->e2fs_log_bsize + 10) +#endif +#if defined(_KERNEL) +#define EXT2_ADDR_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_addr_per_block_bits) +#define EXT2_INODE_SIZE(s) (EXT2_SB(s)->e2fs_isize) +#define EXT2_FIRST_INO(s) (EXT2_SB(s)->e2fs_first_inode) +#else +#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == E2FS_REV0) ? \ + E2FS_REV0 : (s)->s_inode_size) +#define EXT2_FIRST_INO(s) (((s)->s_rev_level == E2FS_REV0) ? \ + E2FS_REV0 : (s)->e2fs_first_ino) +#endif + +/* + * Macro-instructions used to manage fragments + */ +#define EXT2_MIN_FRAG_SIZE 1024 +#define EXT2_MAX_FRAG_SIZE 4096 +#define EXT2_MIN_FRAG_LOG_SIZE 10 +#if defined(_KERNEL) +# define EXT2_FRAG_SIZE(s) (EXT2_SB(s)->e2fs_fsize) +# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_SB(s)->e2fs_fpb) +#else +# define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->e2fs_log_fsize) +# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s)) +#endif + +/* + * Macro-instructions used to manage group descriptors + */ +#if defined(_KERNEL) +# define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->e2fs_bpg) +# define EXT2_DESC_PER_BLOCK(s) (EXT2_SB(s)->e2fs_descpb) +# define EXT2_DESC_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_desc_per_block_bits) +#else +# define EXT2_BLOCKS_PER_GROUP(s) ((s)->e2fs_bpg) +# define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_gd)) + +#endif + +#endif /* _LINUX_EXT2_FS_H */ diff --git a/sys/gnu/fs/ext2fs/fs.h b/sys/fs/ext2fs/fs.h similarity index 67% rename from sys/gnu/fs/ext2fs/fs.h rename to sys/fs/ext2fs/fs.h index d9e70008a484..54c6b4408db5 100644 --- a/sys/gnu/fs/ext2fs/fs.h +++ b/sys/fs/ext2fs/fs.h @@ -57,45 +57,55 @@ /* * The path name on which the file system is mounted is maintained * in fs_fsmnt. MAXMNTLEN defines the amount of space allocated in - * the super block for this name. + * the super block for this name. */ -#define MAXMNTLEN 512 +#define MAXMNTLEN 512 + +/* + * Grigoriy Orlov has done some extensive work to fine + * tune the layout preferences for directories within a filesystem. + * His algorithm can be tuned by adjusting the following parameters + * which tell the system the average file size and the average number + * of files per directory. These defaults are well selected for typical + * filesystems, but may need to be tuned for odd cases like filesystems + * being used for squid caches or news spools. + * AVFPDIR is the expected number of files per directory. AVGDIRSIZE is + * obtained by multiplying AVFPDIR and AVFILESIZ which is assumed to be + * 16384. + */ + +#define AFPDIR 64 +#define AVGDIRSIZE 1048576 /* * Macros for access to superblock array structures */ -/* - * Convert cylinder group to base address of its global summary info. - */ -#define fs_cs(fs, cgindx) (((struct ext2_group_desc *) \ - (fs->s_group_desc[cgindx / EXT2_DESC_PER_BLOCK(fs)]->b_data)) \ - [cgindx % EXT2_DESC_PER_BLOCK(fs)]) - /* * Turn file system block numbers into disk block addresses. * This maps file system blocks to device size blocks. */ -#define fsbtodb(fs, b) ((b) << ((fs)->s_fsbtodb)) -#define dbtofsb(fs, b) ((b) >> ((fs)->s_fsbtodb)) +#define fsbtodb(fs, b) ((b) << ((fs)->e2fs_fsbtodb)) +#define dbtofsb(fs, b) ((b) >> ((fs)->e2fs_fsbtodb)) /* get group containing inode */ -#define ino_to_cg(fs, x) (((x) - 1) / EXT2_INODES_PER_GROUP(fs)) +#define ino_to_cg(fs, x) (((x) - 1) / (fs->e2fs_ipg)) /* get block containing inode from its number x */ -#define ino_to_fsba(fs, x) fs_cs(fs, ino_to_cg(fs, x)).bg_inode_table + \ - (((x)-1) % EXT2_INODES_PER_GROUP(fs))/EXT2_INODES_PER_BLOCK(fs) +#define ino_to_fsba(fs, x) \ + ((fs)->e2fs_gd[ino_to_cg((fs), (x))].ext2bgd_i_tables + \ + (((x) - 1) % (fs)->e2fs->e2fs_ipg) / (fs)->e2fs_ipb) /* get offset for inode in block */ -#define ino_to_fsbo(fs, x) ((x-1) % EXT2_INODES_PER_BLOCK(fs)) +#define ino_to_fsbo(fs, x) ((x-1) % (fs->e2fs_ipb)) /* * Give cylinder group number for a file system block. * Give cylinder group block number for a file system block. */ -#define dtog(fs, d) (((d) - fs->s_es->s_first_data_block) / \ +#define dtog(fs, d) (((d) - fs->e2fs->e2fs_first_dblock) / \ EXT2_BLOCKS_PER_GROUP(fs)) -#define dtogd(fs, d) (((d) - fs->s_es->s_first_data_block) % \ +#define dtogd(fs, d) (((d) - fs->e2fs->e2fs_first_dblock) % \ EXT2_BLOCKS_PER_GROUP(fs)) /* @@ -104,32 +114,32 @@ * modulos and multiplications. */ #define blkoff(fs, loc) /* calculates (loc % fs->fs_bsize) */ \ - ((loc) & (fs)->s_qbmask) + ((loc) & (fs)->e2fs_qbmask) #define lblktosize(fs, blk) /* calculates (blk * fs->fs_bsize) */ \ - ((blk) << (fs->s_bshift)) + ((blk) << (fs->e2fs_bshift)) #define lblkno(fs, loc) /* calculates (loc / fs->fs_bsize) */ \ - ((loc) >> (fs->s_bshift)) + ((loc) >> (fs->e2fs_bshift)) /* no fragments -> logical block number equal # of frags */ #define numfrags(fs, loc) /* calculates (loc / fs->fs_fsize) */ \ - ((loc) >> (fs->s_bshift)) + ((loc) >> (fs->e2fs_bshift)) #define fragroundup(fs, size) /* calculates roundup(size, fs->fs_fsize) */ \ - roundup(size, fs->s_frag_size) + roundup(size, fs->e2fs_fsize) /* was (((size) + (fs)->fs_qfmask) & (fs)->fs_fmask) */ /* * Determining the size of a file block in the file system. * easy w/o fragments */ -#define blksize(fs, ip, lbn) ((fs)->s_frag_size) +#define blksize(fs, ip, lbn) ((fs)->e2fs_fsize) /* * INOPB is the number of inodes in a secondary storage block. */ -#define INOPB(fs) EXT2_INODES_PER_BLOCK(fs) +#define INOPB(fs) (fs->e2fs_ipb) /* * NINDIR is the number of indirects in a file system block. @@ -139,32 +149,4 @@ extern int inside[], around[]; extern u_char *fragtbl[]; -/* a few remarks about superblock locking/unlocking - * Linux provides special routines for doing so - * I haven't figured out yet what BSD does - * I think I'll try a VOP_LOCK/VOP_UNLOCK on the device vnode - */ -#define DEVVP(inode) (VFSTOEXT2(ITOV(inode)->v_mount)->um_devvp) -#define lock_super(devvp) vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY) -#define unlock_super(devvp) VOP_UNLOCK(devvp, 0) -/* - * Historically, ext2fs kept it's metadata buffers on the LOCKED queue. Now, - * we change the lock owner to kern so that we may use it from contexts other - * than the one that originally locked it. When we are finished with the - * buffer, we release it, writing it first if it was dirty. - */ -#define LCK_BUF(bp) { \ - (bp)->b_flags |= B_PERSISTENT; \ - BUF_KERNPROC(bp); \ -} - -#define ULCK_BUF(bp) { \ - long flags; \ - flags = (bp)->b_flags; \ - (bp)->b_flags &= ~(B_DIRTY | B_PERSISTENT); \ - if (flags & B_DIRTY) \ - bwrite(bp); \ - else \ - brelse(bp); \ -} diff --git a/sys/gnu/fs/ext2fs/inode.h b/sys/fs/ext2fs/inode.h similarity index 96% rename from sys/gnu/fs/ext2fs/inode.h rename to sys/fs/ext2fs/inode.h index 75d9b1b2cbaf..f352cdc161ad 100644 --- a/sys/gnu/fs/ext2fs/inode.h +++ b/sys/fs/ext2fs/inode.h @@ -35,8 +35,8 @@ * $FreeBSD$ */ -#ifndef _SYS_GNU_EXT2FS_INODE_H_ -#define _SYS_GNU_EXT2FS_INODE_H_ +#ifndef _FS_EXT2FS_INODE_H_ +#define _FS_EXT2FS_INODE_H_ #include #include @@ -63,10 +63,11 @@ struct inode { struct vnode *i_vnode;/* Vnode associated with this inode. */ struct vnode *i_devvp;/* Vnode for block I/O. */ + struct ext2mount *i_ump; u_int32_t i_flag; /* flags, see below */ ino_t i_number; /* The identity of the inode. */ - struct ext2_sb_info *i_e2fs; /* EXT2FS */ + struct m_ext2fs *i_e2fs; /* EXT2FS */ u_quad_t i_modrev; /* Revision level for NFS lease. */ /* * Side effects; used during directory lookup. @@ -75,8 +76,6 @@ struct inode { doff_t i_endoff; /* End of useful stuff in directory. */ doff_t i_diroff; /* Offset in dir, where we found last entry. */ doff_t i_offset; /* Offset of free space in directory. */ - ino_t i_ino; /* Inode number of found directory. */ - u_int32_t i_reclen; /* Size of found directory entry. */ u_int32_t i_block_group; u_int32_t i_next_alloc_block; @@ -142,7 +141,8 @@ struct inode { #define IN_HASHED 0x0020 /* Inode is on hash list */ #define IN_LAZYMOD 0x0040 /* Modified, but don't write yet. */ #define IN_SPACECOUNTED 0x0080 /* Blocks to be freed in free count. */ - +#define IN_LAZYACCESS 0x0100 /* Process IN_ACCESS after the + suspension finished */ #ifdef _KERNEL /* * Structure used to pass around logical block paths generated by @@ -167,4 +167,4 @@ struct ufid { }; #endif /* _KERNEL */ -#endif /* !_SYS_GNU_EXT2FS_INODE_H_ */ +#endif /* !_FS_EXT2FS_INODE_H_ */ diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c index 6dea11c0821d..e339a8ac8535 100644 --- a/sys/fs/fifofs/fifo_vnops.c +++ b/sys/fs/fifofs/fifo_vnops.c @@ -78,6 +78,10 @@ struct fileops fifo_ops_f = { /* * This structure is associated with the FIFO vnode and stores * the state associated with the FIFO. + * Notes about locking: + * - fi_readsock and fi_writesock are invariant since init time. + * - fi_readers and fi_writers are vnode lock protected. + * - fi_wgen is fif_mtx lock protected. */ struct fifoinfo { struct socket *fi_readsock; @@ -119,7 +123,6 @@ static struct filterops fifo_notsup_filtops = { struct vop_vector fifo_specops = { .vop_default = &default_vnodeops, - .vop_access = VOP_EBADF, .vop_advlock = fifo_advlock, .vop_close = fifo_close, .vop_create = VOP_PANIC, @@ -224,14 +227,9 @@ fail1: } /* - * General access to fi_readers and fi_writers is protected using - * the vnode lock. - * - * Protect the increment of fi_readers and fi_writers and the - * associated calls to wakeup() with the fifo mutex in addition - * to the vnode lock. This allows the vnode lock to be dropped - * for the msleep() calls below, and using the fifo mutex with - * msleep() prevents the wakeup from being missed. + * Use the fifo_mtx lock here, in addition to the vnode lock, + * in order to allow vnode lock dropping before msleep() calls + * and still avoiding missed wakeups. */ mtx_lock(&fifo_mtx); if (ap->a_mode & FREAD) { @@ -250,6 +248,8 @@ fail1: if (ap->a_mode & FWRITE) { if ((ap->a_mode & O_NONBLOCK) && fip->fi_readers == 0) { mtx_unlock(&fifo_mtx); + if (fip->fi_writers == 0) + fifo_cleanup(vp); return (ENXIO); } fip->fi_writers++; diff --git a/sys/fs/msdosfs/bootsect.h b/sys/fs/msdosfs/bootsect.h index 9e8aa9767b90..ebd60a064167 100644 --- a/sys/fs/msdosfs/bootsect.h +++ b/sys/fs/msdosfs/bootsect.h @@ -16,6 +16,8 @@ * * October 1992 */ +#ifndef _FS_MSDOSFS_BOOTSECT_H_ +#define _FS_MSDOSFS_BOOTSECT_H_ /* * Format of a boot sector. This is the first sector on a DOS floppy disk @@ -91,3 +93,5 @@ union bootsector { #define bsHiddenSecs bsBPB.bpbHiddenSecs #define bsHugeSectors bsBPB.bpbHugeSectors #endif + +#endif /* !_FS_MSDOSFS_BOOTSECT_H_ */ diff --git a/sys/fs/msdosfs/bpb.h b/sys/fs/msdosfs/bpb.h index addacd22fa15..ce20f53d411d 100644 --- a/sys/fs/msdosfs/bpb.h +++ b/sys/fs/msdosfs/bpb.h @@ -17,6 +17,9 @@ * October 1992 */ +#ifndef _FS_MSDOSFS_BPB_H_ +#define _FS_MSDOSFS_BPB_H_ + /* * BIOS Parameter Block (BPB) for DOS 3.3 */ @@ -78,7 +81,7 @@ struct bpb710 { u_int32_t bpbRootClust; /* start cluster for root directory */ u_int16_t bpbFSInfo; /* filesystem info structure sector */ u_int16_t bpbBackup; /* backup boot sector */ - /* There is a 12 byte filler here, but we ignore it */ + u_int8_t bpbReserved[12]; /* reserved for future expansion */ }; /* @@ -153,7 +156,7 @@ struct byte_bpb710 { u_int8_t bpbRootClust[4]; /* start cluster for root directory */ u_int8_t bpbFSInfo[2]; /* filesystem info structure sector */ u_int8_t bpbBackup[2]; /* backup boot sector */ - /* There is a 12 byte filler here, but we ignore it */ + u_int8_t bpbReserved[12]; /* reserved for future expansion */ }; /* @@ -168,3 +171,4 @@ struct fsinfo { u_int8_t fsifill2[12]; u_int8_t fsisig3[4]; }; +#endif /* !_FS_MSDOSFS_BPB_H_ */ diff --git a/sys/fs/msdosfs/denode.h b/sys/fs/msdosfs/denode.h index 5d68d6fabb49..4fd306cf620d 100644 --- a/sys/fs/msdosfs/denode.h +++ b/sys/fs/msdosfs/denode.h @@ -207,9 +207,6 @@ struct denode { ((dep)->de_Attributes & ATTR_DIRECTORY) ? 0 : (dep)->de_FileSize), \ putushort((dp)->deHighClust, (dep)->de_StartCluster >> 16)) -#define de_forw de_chain[0] -#define de_back de_chain[1] - #ifdef _KERNEL #define VTODE(vp) ((struct denode *)(vp)->v_data) diff --git a/sys/fs/msdosfs/direntry.h b/sys/fs/msdosfs/direntry.h index a55b0af219a9..86b6fbb099f2 100644 --- a/sys/fs/msdosfs/direntry.h +++ b/sys/fs/msdosfs/direntry.h @@ -47,16 +47,17 @@ * * October 1992 */ +#ifndef _FS_MSDOSFS_DIRENTRY_H_ +#define _FS_MSDOSFS_DIRENTRY_H_ /* * Structure of a dos directory entry. */ struct direntry { - u_int8_t deName[8]; /* filename, blank filled */ + u_int8_t deName[11]; /* filename, blank filled */ #define SLOT_EMPTY 0x00 /* slot has never been used */ #define SLOT_E5 0x05 /* the real value is 0xe5 */ #define SLOT_DELETED 0xe5 /* file in this slot deleted */ - u_int8_t deExtension[3]; /* extension, blank filled */ u_int8_t deAttributes; /* file attributes */ #define ATTR_NORMAL 0x00 /* normal file */ #define ATTR_READONLY 0x01 /* file is readonly */ @@ -155,7 +156,8 @@ int winChkName(struct mbnambuf *nbp, const u_char *un, size_t unlen, int chksum, struct msdosfsmount *pmp); int win2unixfn(struct mbnambuf *nbp, struct winentry *wep, int chksum, struct msdosfsmount *pmp); -u_int8_t winChksum(struct direntry *dep); +u_int8_t winChksum(u_int8_t *name); int winSlotCnt(const u_char *un, size_t unlen, struct msdosfsmount *pmp); size_t winLenFixup(const u_char *un, size_t unlen); #endif /* _KERNEL */ +#endif /* !_FS_MSDOSFS_DIRENTRY_H_ */ diff --git a/sys/fs/msdosfs/msdosfs_conv.c b/sys/fs/msdosfs/msdosfs_conv.c index 50dc1a06cc92..8dc1d07ea9cf 100644 --- a/sys/fs/msdosfs/msdosfs_conv.c +++ b/sys/fs/msdosfs/msdosfs_conv.c @@ -741,22 +741,13 @@ win2unixfn(nbp, wep, chksum, pmp) * Compute the unrolled checksum of a DOS filename for Win95 LFN use. */ u_int8_t -winChksum(struct direntry *dep) +winChksum(u_int8_t *name) { + int i; u_int8_t s; - s = dep->deName[0]; - s = ((s << 7) | (s >> 1)) + dep->deName[1]; - s = ((s << 7) | (s >> 1)) + dep->deName[2]; - s = ((s << 7) | (s >> 1)) + dep->deName[3]; - s = ((s << 7) | (s >> 1)) + dep->deName[4]; - s = ((s << 7) | (s >> 1)) + dep->deName[5]; - s = ((s << 7) | (s >> 1)) + dep->deName[6]; - s = ((s << 7) | (s >> 1)) + dep->deName[7]; - s = ((s << 7) | (s >> 1)) + dep->deExtension[0]; - s = ((s << 7) | (s >> 1)) + dep->deExtension[1]; - s = ((s << 7) | (s >> 1)) + dep->deExtension[2]; - + for (s = 0, i = 11; --i >= 0; s += *name++) + s = (s << 7)|(s >> 1); return (s); } diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c index d4614847d143..279ee9990d86 100644 --- a/sys/fs/msdosfs/msdosfs_denode.c +++ b/sys/fs/msdosfs/msdosfs_denode.c @@ -144,11 +144,11 @@ deget(pmp, dirclust, diroffset, depp) } /* - * Do the MALLOC before the getnewvnode since doing so afterward + * Do the malloc before the getnewvnode since doing so afterward * might cause a bogus v_data pointer to get dereferenced - * elsewhere if MALLOC should block. + * elsewhere if malloc should block. */ - ldep = malloc(sizeof(struct denode), M_MSDOSFSNODE, M_WAITOK); + ldep = malloc(sizeof(struct denode), M_MSDOSFSNODE, M_WAITOK | M_ZERO); /* * Directory entry was not in cache, have to create a vnode and @@ -161,16 +161,14 @@ deget(pmp, dirclust, diroffset, depp) free(ldep, M_MSDOSFSNODE); return error; } - bzero((caddr_t)ldep, sizeof *ldep); nvp->v_data = ldep; ldep->de_vnode = nvp; ldep->de_flag = 0; ldep->de_dirclust = dirclust; ldep->de_diroffset = diroffset; ldep->de_inode = inode; - fc_purge(ldep, 0); /* init the fat cache for this denode */ - lockmgr(nvp->v_vnlock, LK_EXCLUSIVE, NULL); + fc_purge(ldep, 0); /* init the fat cache for this denode */ error = insmntque(nvp, mntp); if (error != 0) { free(ldep, M_MSDOSFSNODE); @@ -184,9 +182,8 @@ deget(pmp, dirclust, diroffset, depp) return (error); } if (xvp != NULL) { - /* XXX: Not sure this is right */ - nvp = xvp; - ldep->de_vnode = nvp; + *depp = xvp->v_data; + return (0); } ldep->de_pmp = pmp; @@ -595,7 +592,7 @@ msdosfs_inactive(ap) /* * Ignore denodes related to stale file handles. */ - if (dep->de_Name[0] == SLOT_DELETED) + if (dep->de_Name[0] == SLOT_DELETED || dep->de_Name[0] == SLOT_EMPTY) goto out; /* @@ -623,7 +620,7 @@ out: printf("msdosfs_inactive(): v_usecount %d, de_Name[0] %x\n", vrefcnt(vp), dep->de_Name[0]); #endif - if (dep->de_Name[0] == SLOT_DELETED) + if (dep->de_Name[0] == SLOT_DELETED || dep->de_Name[0] == SLOT_EMPTY) vrecycle(vp, td); return (error); } diff --git a/sys/fs/msdosfs/msdosfs_fat.c b/sys/fs/msdosfs/msdosfs_fat.c index 7fae9c0ec100..c857b3426268 100644 --- a/sys/fs/msdosfs/msdosfs_fat.c +++ b/sys/fs/msdosfs/msdosfs_fat.c @@ -60,19 +60,6 @@ #include #include -/* - * Fat cache stats. - */ -static int fc_fileextends; /* # of file extends */ -static int fc_lfcempty; /* # of time last file cluster cache entry - * was empty */ -static int fc_bmapcalls; /* # of times pcbmap was called */ - -#define LMMAX 20 -static int fc_lmdistance[LMMAX];/* counters for how far off the last - * cluster mapped entry was. */ -static int fc_largedistance; /* off by more than LMMAX */ - static int chainalloc(struct msdosfsmount *pmp, u_long start, u_long count, u_long fillwith, u_long *retcluster, u_long *got); @@ -90,6 +77,9 @@ static __inline void usemap_alloc(struct msdosfsmount *pmp, u_long cn); static __inline void usemap_free(struct msdosfsmount *pmp, u_long cn); +static int clusteralloc1(struct msdosfsmount *pmp, u_long start, + u_long count, u_long fillwith, u_long *retcluster, + u_long *got); static void fatblock(pmp, ofs, bnp, sizep, bop) @@ -152,14 +142,9 @@ pcbmap(dep, findcn, bnp, cnp, sp) struct msdosfsmount *pmp = dep->de_pmp; u_long bsize; - fc_bmapcalls++; - - /* - * If they don't give us someplace to return a value then don't - * bother doing anything. - */ - if (bnp == NULL && cnp == NULL && sp == NULL) - return (0); + KASSERT(bnp != NULL || cnp != NULL || sp != NULL, + ("pcbmap: extra call")); + ASSERT_VOP_ELOCKED(DETOV(dep), "pcbmap"); cn = dep->de_StartCluster; /* @@ -203,10 +188,6 @@ pcbmap(dep, findcn, bnp, cnp, sp) */ i = 0; fc_lookup(dep, findcn, &i, &cn); - if ((bn = findcn - i) >= LMMAX) - fc_largedistance++; - else - fc_lmdistance[bn]++; /* * Handle all other files or directories the normal way. @@ -289,6 +270,8 @@ fc_lookup(dep, findcn, frcnp, fsrcnp) u_long cn; struct fatcache *closest = 0; + ASSERT_VOP_LOCKED(DETOV(dep), "fc_lookup"); + for (i = 0; i < FC_SIZE; i++) { cn = dep->de_fc[i].fc_frcn; if (cn != FCE_EMPTY && cn <= findcn) { @@ -314,6 +297,8 @@ fc_purge(dep, frcn) int i; struct fatcache *fcp; + ASSERT_VOP_ELOCKED(DETOV(dep), "fc_purge"); + fcp = dep->de_fc; for (i = 0; i < FC_SIZE; i++, fcp++) { if (fcp->fc_frcn >= frcn) @@ -427,7 +412,13 @@ usemap_alloc(pmp, cn) u_long cn; { + MSDOSFS_ASSERT_MP_LOCKED(pmp); + + KASSERT((pmp->pm_inusemap[cn / N_INUSEBITS] & (1 << (cn % N_INUSEBITS))) + == 0, ("Allocating used sector %ld %ld %x", cn, cn % N_INUSEBITS, + (unsigned)pmp->pm_inusemap[cn / N_INUSEBITS])); pmp->pm_inusemap[cn / N_INUSEBITS] |= 1 << (cn % N_INUSEBITS); + KASSERT(pmp->pm_freeclustercount > 0, ("usemap_alloc: too little")); pmp->pm_freeclustercount--; } @@ -437,7 +428,11 @@ usemap_free(pmp, cn) u_long cn; { + MSDOSFS_ASSERT_MP_LOCKED(pmp); pmp->pm_freeclustercount++; + KASSERT((pmp->pm_inusemap[cn / N_INUSEBITS] & (1 << (cn % N_INUSEBITS))) + != 0, ("Freeing unused sector %ld %ld %x", cn, cn % N_INUSEBITS, + (unsigned)pmp->pm_inusemap[cn / N_INUSEBITS])); pmp->pm_inusemap[cn / N_INUSEBITS] &= ~(1 << (cn % N_INUSEBITS)); } @@ -450,17 +445,17 @@ clusterfree(pmp, cluster, oldcnp) int error; u_long oldcn; - usemap_free(pmp, cluster); error = fatentry(FAT_GET_AND_SET, pmp, cluster, &oldcn, MSDOSFSFREE); - if (error) { - usemap_alloc(pmp, cluster); + if (error) return (error); - } /* * If the cluster was successfully marked free, then update * the count of free clusters, and turn off the "allocated" * bit in the "in use" cluster bit map. */ + MSDOSFS_LOCK_MP(pmp); + usemap_free(pmp, cluster); + MSDOSFS_UNLOCK_MP(pmp); if (oldcnp) *oldcnp = oldcn; return (0); @@ -678,6 +673,8 @@ chainlength(pmp, start, count) u_int map; u_long len; + MSDOSFS_ASSERT_MP_LOCKED(pmp); + max_idx = pmp->pm_maxcluster / N_INUSEBITS; idx = start / N_INUSEBITS; start %= N_INUSEBITS; @@ -726,6 +723,8 @@ chainalloc(pmp, start, count, fillwith, retcluster, got) int error; u_long cl, n; + MSDOSFS_ASSERT_MP_LOCKED(pmp); + for (cl = start, n = count; n-- > 0;) usemap_alloc(pmp, cl++); @@ -758,19 +757,28 @@ chainalloc(pmp, start, count, fillwith, retcluster, got) * got - how many clusters were actually allocated. */ int -clusteralloc(pmp, start, count, fillwith, retcluster, got) - struct msdosfsmount *pmp; - u_long start; - u_long count; - u_long fillwith; - u_long *retcluster; - u_long *got; +clusteralloc(struct msdosfsmount *pmp, u_long start, u_long count, + u_long fillwith, u_long *retcluster, u_long *got) +{ + int error; + + MSDOSFS_LOCK_MP(pmp); + error = clusteralloc1(pmp, start, count, fillwith, retcluster, got); + MSDOSFS_UNLOCK_MP(pmp); + return (error); +} + +static int +clusteralloc1(struct msdosfsmount *pmp, u_long start, u_long count, + u_long fillwith, u_long *retcluster, u_long *got) { u_long idx; u_long len, newst, foundl, cn, l; u_long foundcn = 0; /* XXX: foundcn could be used unititialized */ u_int map; + MSDOSFS_ASSERT_MP_LOCKED(pmp); + #ifdef MSDOSFS_DEBUG printf("clusteralloc(): find %lu clusters\n", count); #endif @@ -846,6 +854,7 @@ freeclusterchain(pmp, cluster) u_long bn, bo, bsize, byteoffset; u_long readcn, lbn = -1; + MSDOSFS_LOCK_MP(pmp); while (cluster >= CLUST_FIRST && cluster <= pmp->pm_maxcluster) { byteoffset = FATOFS(pmp, cluster); fatblock(pmp, byteoffset, &bn, &bsize, &bo); @@ -855,6 +864,7 @@ freeclusterchain(pmp, cluster) error = bread(pmp->pm_devvp, bn, bsize, NOCRED, &bp); if (error) { brelse(bp); + MSDOSFS_UNLOCK_MP(pmp); return (error); } lbn = bn; @@ -890,6 +900,7 @@ freeclusterchain(pmp, cluster) } if (bp) updatefats(pmp, bp, bn); + MSDOSFS_UNLOCK_MP(pmp); return (0); } @@ -906,6 +917,8 @@ fillinusemap(pmp) int error; u_long bn, bo, bsize, byteoffset; + MSDOSFS_ASSERT_MP_LOCKED(pmp); + /* * Mark all clusters in use, we mark the free ones in the fat scan * loop further down. @@ -944,7 +957,8 @@ fillinusemap(pmp) if (readcn == 0) usemap_free(pmp, cn); } - brelse(bp); + if (bp != NULL) + brelse(bp); return (0); } @@ -991,10 +1005,8 @@ extendfile(dep, count, bpp, ncp, flags) * If the "file's last cluster" cache entry is empty, and the file * is not empty, then fill the cache entry by calling pcbmap(). */ - fc_fileextends++; if (dep->de_fc[FC_LASTFC].fc_frcn == FCE_EMPTY && dep->de_StartCluster != 0) { - fc_lfcempty++; error = pcbmap(dep, 0xffff, 0, &cn, 0); /* we expect it to return E2BIG */ if (error != E2BIG) diff --git a/sys/fs/msdosfs/msdosfs_fileno.c b/sys/fs/msdosfs/msdosfs_fileno.c index ff1f2b7d3786..b56fb43874b5 100644 --- a/sys/fs/msdosfs/msdosfs_fileno.c +++ b/sys/fs/msdosfs/msdosfs_fileno.c @@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -59,9 +58,6 @@ __FBSDID("$FreeBSD$"); static MALLOC_DEFINE(M_MSDOSFSFILENO, "msdosfs_fileno", "MSDOSFS fileno mapping node"); -static struct mtx fileno_mtx; -MTX_SYSINIT(fileno, &fileno_mtx, "MSDOSFS fileno", MTX_DEF); - RB_PROTOTYPE(msdosfs_filenotree, msdosfs_fileno, mf_tree, msdosfs_fileno_compare) @@ -117,30 +113,30 @@ msdosfs_fileno_map(mp, fileno) } if (fileno < FILENO_FIRST_DYN) return ((uint32_t)fileno); - mtx_lock(&fileno_mtx); + MSDOSFS_LOCK_MP(pmp); key.mf_fileno64 = fileno; mf = RB_FIND(msdosfs_filenotree, &pmp->pm_filenos, &key); if (mf != NULL) { mapped = mf->mf_fileno32; - mtx_unlock(&fileno_mtx); + MSDOSFS_UNLOCK_MP(pmp); return (mapped); } if (pmp->pm_nfileno < FILENO_FIRST_DYN) panic("msdosfs_fileno_map: wraparound"); - mtx_unlock(&fileno_mtx); + MSDOSFS_UNLOCK_MP(pmp); mf = malloc(sizeof(*mf), M_MSDOSFSFILENO, M_WAITOK); - mtx_lock(&fileno_mtx); + MSDOSFS_LOCK_MP(pmp); tmf = RB_FIND(msdosfs_filenotree, &pmp->pm_filenos, &key); if (tmf != NULL) { mapped = tmf->mf_fileno32; - mtx_unlock(&fileno_mtx); + MSDOSFS_UNLOCK_MP(pmp); free(mf, M_MSDOSFSFILENO); return (mapped); } mf->mf_fileno64 = fileno; mapped = mf->mf_fileno32 = pmp->pm_nfileno++; RB_INSERT(msdosfs_filenotree, &pmp->pm_filenos, mf); - mtx_unlock(&fileno_mtx); + MSDOSFS_UNLOCK_MP(pmp); return (mapped); } diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c index 1344f628ec21..ce5048aa49f6 100644 --- a/sys/fs/msdosfs/msdosfs_lookup.c +++ b/sys/fs/msdosfs/msdosfs_lookup.c @@ -61,6 +61,18 @@ #include #include +static int msdosfs_lookup_(struct vnode *vdp, struct vnode **vpp, + struct componentname *cnp, u_int64_t *inum); +static int msdosfs_deget_dotdot(struct vnode *vp, u_long cluster, int blkoff, + struct vnode **rvp); + +int +msdosfs_lookup(struct vop_cachedlookup_args *ap) +{ + + return (msdosfs_lookup_(ap->a_dvp, ap->a_vpp, ap->a_cnp, NULL)); +} + /* * When we search a directory the blocks containing directory entries are * read and examined. The directory entries contain information that would @@ -76,18 +88,11 @@ * out to disk. This way disk blocks containing directory entries and in * memory denode's will be in synch. */ -int -msdosfs_lookup(ap) - struct vop_cachedlookup_args /* { - struct vnode *a_dvp; - struct vnode **a_vpp; - struct componentname *a_cnp; - } */ *ap; +static int +msdosfs_lookup_(struct vnode *vdp, struct vnode **vpp, + struct componentname *cnp, u_int64_t *dd_inum) { struct mbnambuf nb; - struct vnode *vdp = ap->a_dvp; - struct vnode **vpp = ap->a_vpp; - struct componentname *cnp = ap->a_cnp; daddr_t bn; int error; int slotcount; @@ -109,6 +114,7 @@ msdosfs_lookup(ap) int flags = cnp->cn_flags; int nameiop = cnp->cn_nameiop; int unlen; + u_int64_t inode1; int wincnt = 1; int chksum = -1, chksum_ok; @@ -119,12 +125,14 @@ msdosfs_lookup(ap) #endif dp = VTODE(vdp); pmp = dp->de_pmp; - *vpp = NULL; + if (vpp != NULL) + *vpp = NULL; #ifdef MSDOSFS_DEBUG printf("msdosfs_lookup(): vdp %p, dp %p, Attr %02x\n", vdp, dp, dp->de_Attributes); #endif + restart: /* * If they are going after the . or .. entry in the root directory, * they won't find it. DOS filesystems don't have them in the root @@ -276,7 +284,7 @@ msdosfs_lookup(ap) /* * Check for a checksum or name match */ - chksum_ok = (chksum == winChksum(dep)); + chksum_ok = (chksum == winChksum(dep->deName)); if (!chksum_ok && (!olddos || bcmp(dosfilename, dep->deName, 11))) { chksum = -1; @@ -436,6 +444,11 @@ foundroot: if (FAT32(pmp) && scn == MSDOSFSROOT) scn = pmp->pm_rootdirblk; + if (dd_inum != NULL) { + *dd_inum = (uint64_t)pmp->pm_bpcluster * scn + blkoff; + return (0); + } + /* * If deleting, and at end of pathname, return * parameters which can be used to remove file. @@ -508,23 +521,25 @@ foundroot: * inodes from the root, moving down the directory tree. Thus * when following backward pointers ".." we must unlock the * parent directory before getting the requested directory. - * There is a potential race condition here if both the current - * and parent directories are removed before the VFS_VGET for the - * inode associated with ".." returns. We hope that this occurs - * infrequently since we cannot avoid this race condition without - * implementing a sophisticated deadlock detection algorithm. - * Note also that this simple deadlock detection scheme will not - * work if the filesystem has any hard links other than ".." - * that point backwards in the directory structure. */ pdp = vdp; if (flags & ISDOTDOT) { - VOP_UNLOCK(pdp, 0); - error = deget(pmp, cluster, blkoff, &tdp); - vn_lock(pdp, LK_EXCLUSIVE | LK_RETRY); + error = msdosfs_deget_dotdot(pdp, cluster, blkoff, vpp); if (error) return (error); - *vpp = DETOV(tdp); + /* + * Recheck that ".." still points to the inode we + * looked up before pdp lock was dropped. + */ + error = msdosfs_lookup_(pdp, NULL, cnp, &inode1); + if (error) { + vput(*vpp); + return (error); + } + if (VTODE(*vpp)->de_inode != inode1) { + vput(*vpp); + goto restart; + } } else if (dp->de_StartCluster == scn && isadir) { VREF(vdp); /* we want ourself, ie "." */ *vpp = vdp; @@ -542,6 +557,49 @@ foundroot: return (0); } +static int +msdosfs_deget_dotdot(struct vnode *vp, u_long cluster, int blkoff, + struct vnode **rvp) +{ + struct mount *mp; + struct msdosfsmount *pmp; + struct denode *rdp; + int ltype, error; + + mp = vp->v_mount; + pmp = VFSTOMSDOSFS(mp); + ltype = VOP_ISLOCKED(vp); + KASSERT(ltype == LK_EXCLUSIVE || ltype == LK_SHARED, + ("msdosfs_deget_dotdot: vp not locked")); + + error = vfs_busy(mp, MBF_NOWAIT); + if (error != 0) { + vfs_ref(mp); + VOP_UNLOCK(vp, 0); + error = vfs_busy(mp, 0); + vn_lock(vp, ltype | LK_RETRY); + vfs_rel(mp); + if (error != 0) + return (ENOENT); + if (vp->v_iflag & VI_DOOMED) { + vfs_unbusy(mp); + return (ENOENT); + } + } + VOP_UNLOCK(vp, 0); + error = deget(pmp, cluster, blkoff, &rdp); + vfs_unbusy(mp); + if (error == 0) + *rvp = DETOV(rdp); + vn_lock(vp, ltype | LK_RETRY); + if (vp->v_iflag & VI_DOOMED) { + if (error == 0) + vput(*rvp); + error = ENOENT; + } + return (error); +} + /* * dep - directory entry to copy into the directory * ddep - directory to add to @@ -617,7 +675,7 @@ createde(dep, ddep, depp, cnp) * Now write the Win95 long name */ if (ddep->de_fndcnt > 0) { - u_int8_t chksum = winChksum(ndep); + u_int8_t chksum = winChksum(ndep->deName); const u_char *un = (const u_char *)cnp->cn_nameptr; int unlen = cnp->cn_namelen; int cnt = 1; diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c index 81867634e0d5..20a4dbd4aa45 100644 --- a/sys/fs/msdosfs/msdosfs_vfsops.c +++ b/sys/fs/msdosfs/msdosfs_vfsops.c @@ -75,6 +75,8 @@ #include #include +static const char msdosfs_lock_msg[] = "fatlk"; + /* Mount options that we support. */ static const char *msdosfs_opts[] = { "async", "noatime", "noclusterr", "noclusterw", @@ -466,6 +468,8 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp) pmp->pm_cp = cp; pmp->pm_bo = bo; + lockinit(&pmp->pm_fatlock, 0, msdosfs_lock_msg, 0, 0); + /* * Initialize ownerships and permissions, since nothing else will * initialize them iff we are mounting root. @@ -716,7 +720,10 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp) /* * Have the inuse map filled in. */ - if ((error = fillinusemap(pmp)) != 0) + MSDOSFS_LOCK_MP(pmp); + error = fillinusemap(pmp); + MSDOSFS_UNLOCK_MP(pmp); + if (error != 0) goto error_exit; /* @@ -745,6 +752,7 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp) mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum; MNT_ILOCK(mp); mp->mnt_flag |= MNT_LOCAL; + mp->mnt_kern_flag |= MNTK_MPSAFE; MNT_IUNLOCK(mp); if (pmp->pm_flags & MSDOSFS_LARGEFS) @@ -763,6 +771,7 @@ error_exit: PICKUP_GIANT(); } if (pmp) { + lockdestroy(&pmp->pm_fatlock); if (pmp->pm_inusemap) free(pmp->pm_inusemap, M_MSDOSFSFAT); free(pmp, M_MSDOSFSMNT); @@ -837,6 +846,7 @@ msdosfs_unmount(struct mount *mp, int mntflags) free(pmp->pm_inusemap, M_MSDOSFSFAT); if (pmp->pm_flags & MSDOSFS_LARGEFS) msdosfs_fileno_free(mp); + lockdestroy(&pmp->pm_fatlock); free(pmp, M_MSDOSFSMNT); mp->mnt_data = NULL; MNT_ILOCK(mp); diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c index e62af02364bd..e9c593bdc0ce 100644 --- a/sys/fs/msdosfs/msdosfs_vnops.c +++ b/sys/fs/msdosfs/msdosfs_vnops.c @@ -1072,7 +1072,7 @@ abortit: /* * If ".." must be changed (ie the directory gets a new * parent) then the source directory must not be in the - * directory heirarchy above the target, as this would + * directory hierarchy above the target, as this would * orphan everything below the source directory. Also * the user must have write permission in the source so * as to be able to change "..". We must repeat the call @@ -1287,7 +1287,7 @@ static struct { struct direntry dot; struct direntry dotdot; } dosdirtemplate = { - { ". ", " ", /* the . entry */ + { ". ", /* the . entry */ ATTR_DIRECTORY, /* file attribute */ 0, /* reserved */ 0, { 0, 0 }, { 0, 0 }, /* create time & date */ @@ -1297,7 +1297,7 @@ static struct { { 0, 0 }, /* startcluster */ { 0, 0, 0, 0 } /* filesize */ }, - { ".. ", " ", /* the .. entry */ + { ".. ", /* the .. entry */ ATTR_DIRECTORY, /* file attribute */ 0, /* reserved */ 0, { 0, 0 }, { 0, 0 }, /* create time & date */ @@ -1468,14 +1468,12 @@ msdosfs_rmdir(ap) * the name cache. */ cache_purge(dvp); - VOP_UNLOCK(dvp, 0); /* * Truncate the directory that is being deleted. */ error = detrunc(ip, (u_long)0, IO_SYNC, cnp->cn_cred, td); cache_purge(vp); - vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); out: return (error); } @@ -1729,7 +1727,7 @@ msdosfs_readdir(ap) } else dirbuf.d_fileno = (uint32_t)fileno; - if (chksum != winChksum(dentp)) { + if (chksum != winChksum(dentp->deName)) { dirbuf.d_namlen = dos2unixfn(dentp->deName, (u_char *)dirbuf.d_name, dentp->deLowerCase | diff --git a/sys/fs/msdosfs/msdosfsmount.h b/sys/fs/msdosfs/msdosfsmount.h index bfe3ec3d1e57..2951b2c9f0b6 100644 --- a/sys/fs/msdosfs/msdosfsmount.h +++ b/sys/fs/msdosfs/msdosfsmount.h @@ -53,6 +53,9 @@ #ifdef _KERNEL +#include +#include +#include #include #ifdef MALLOC_DECLARE @@ -106,7 +109,9 @@ struct msdosfsmount { void *pm_u2d; /* Unicode->DOS iconv handle */ void *pm_d2u; /* DOS->Local iconv handle */ u_int32_t pm_nfileno; /* next 32-bit fileno */ - RB_HEAD(msdosfs_filenotree, msdosfs_fileno) pm_filenos; /* 64<->32-bit fileno mapping */ + RB_HEAD(msdosfs_filenotree, msdosfs_fileno) + pm_filenos; /* 64<->32-bit fileno mapping */ + struct lock pm_fatlock; /* lockmgr protecting allocations and rb tree */ }; /* @@ -215,6 +220,13 @@ void msdosfs_fileno_init(struct mount *); void msdosfs_fileno_free(struct mount *); uint32_t msdosfs_fileno_map(struct mount *, uint64_t); +#define MSDOSFS_LOCK_MP(pmp) \ + lockmgr(&(pmp)->pm_fatlock, LK_EXCLUSIVE, NULL) +#define MSDOSFS_UNLOCK_MP(pmp) \ + lockmgr(&(pmp)->pm_fatlock, LK_RELEASE, NULL) +#define MSDOSFS_ASSERT_MP_LOCKED(pmp) \ + lockmgr_assert(&(pmp)->pm_fatlock, KA_XLOCKED) + #endif /* _KERNEL */ /* diff --git a/sys/fs/nfs/nfs_commonacl.c b/sys/fs/nfs/nfs_commonacl.c index 99d796eeb088..910a6a42cd54 100644 --- a/sys/fs/nfs/nfs_commonacl.c +++ b/sys/fs/nfs/nfs_commonacl.c @@ -37,7 +37,6 @@ extern int nfsrv_useacl; static int nfsrv_acemasktoperm(u_int32_t acetype, u_int32_t mask, int owner, enum vtype type, acl_perm_t *permp); -#if defined(NFS4_ACL_EXTATTR_NAME) /* * Handle xdr for an ace. */ @@ -263,189 +262,7 @@ nfsrv_acemasktoperm(u_int32_t acetype, u_int32_t mask, int owner, *permp = perm; return (0); } -#else -/* - * Handle xdr for an ace. - */ -APPLESTATIC int -nfsrv_dissectace(struct nfsrv_descript *nd, struct acl_entry *acep, - int *aceerrp, int *acesizep, NFSPROC_T *p) -{ - u_int32_t *tl; - int len, gotid = 0, owner = 0, error = 0, aceerr = 0; - u_char *name, namestr[NFSV4_SMALLSTR + 1]; - u_int32_t flag, mask, acetype; - gid_t gid; - uid_t uid; - *aceerrp = 0; - NFSM_DISSECT(tl, u_int32_t *, 4 * NFSX_UNSIGNED); - acetype = fxdr_unsigned(u_int32_t, *tl++); - flag = fxdr_unsigned(u_int32_t, *tl++); - mask = fxdr_unsigned(u_int32_t, *tl++); - len = fxdr_unsigned(int, *tl); - if (len < 0) { - return (NFSERR_BADXDR); - } else if (len == 0) { - /* Netapp filers return a 0 length who for nil users */ - acep->ae_tag = ACL_UNDEFINED_TAG; - acep->ae_id = ACL_UNDEFINED_ID; - acep->ae_perm = (acl_perm_t)0; - if (acesizep) - *acesizep = 4 * NFSX_UNSIGNED; - return (0); - } - if (len > NFSV4_SMALLSTR) - name = malloc(len + 1, M_NFSSTRING, M_WAITOK); - else - name = namestr; - error = nfsrv_mtostr(nd, name, len); - if (error) { - if (len > NFSV4_SMALLSTR) - free(name, M_NFSSTRING); - return (error); - } - if (len == 6) { - if (!NFSBCMP(name, "OWNER@", 6)) { - acep->ae_tag = ACL_USER_OBJ; - acep->ae_id = ACL_UNDEFINED_ID; - owner = 1; - gotid = 1; - } else if (!NFSBCMP(name, "GROUP@", 6)) { - acep->ae_tag = ACL_GROUP_OBJ; - acep->ae_id = ACL_UNDEFINED_ID; - gotid = 1; - flag &= ~NFSV4ACE_IDENTIFIERGROUP; - } - } else if (len == 9 && !NFSBCMP(name, "EVERYONE@", 9)) { - acep->ae_tag = ACL_OTHER; - acep->ae_id = ACL_UNDEFINED_ID; - gotid = 1; - } - if (!gotid) { - if (flag & NFSV4ACE_IDENTIFIERGROUP) { - flag &= ~NFSV4ACE_IDENTIFIERGROUP; - acep->ae_tag = ACL_GROUP; - aceerr = nfsv4_strtogid(name, len, &gid, p); - if (!aceerr) - acep->ae_id = (uid_t)gid; - } else { - acep->ae_tag = ACL_USER; - aceerr = nfsv4_strtouid(name, len, &uid, p); - if (!aceerr) - acep->ae_id = uid; - } - } - if (len > NFSV4_SMALLSTR) - free(name, M_NFSSTRING); - - /* - * Now, check for unsupported types or flag bits. - */ - if (!aceerr && ((acetype != NFSV4ACE_ALLOWEDTYPE && - acetype != NFSV4ACE_AUDITTYPE && acetype != NFSV4ACE_ALARMTYPE - && acetype != NFSV4ACE_DENIEDTYPE) || flag)) - aceerr = NFSERR_ATTRNOTSUPP; - - /* - * And turn the mask into perm bits. - */ - if (!aceerr) - aceerr = nfsrv_acemasktoperm(acetype, mask, owner, VREG, - &acep->ae_perm); - *aceerrp = aceerr; - if (acesizep) - *acesizep = NFSM_RNDUP(len) + (4 * NFSX_UNSIGNED); - return (0); -nfsmout: - return (error); -} - -/* - * Turn an NFSv4 ace mask into R/W/X flag bits. - */ -static int -nfsrv_acemasktoperm(u_int32_t acetype, u_int32_t mask, int owner, - enum vtype type, acl_perm_t *permp) -{ - acl_perm_t perm = 0x0; - - if (acetype != NFSV4ACE_ALLOWEDTYPE && acetype != NFSV4ACE_DENIEDTYPE){ - if (mask & ~NFSV4ACE_AUDITMASK) - return (NFSERR_ATTRNOTSUPP); - } - if (mask & NFSV4ACE_DELETE) { - return (NFSERR_ATTRNOTSUPP); - } - if (acetype == NFSV4ACE_DENIEDTYPE) { - if (mask & NFSV4ACE_ALLFILESMASK) { - return (NFSERR_ATTRNOTSUPP); - } - if (owner) { - if (mask & NFSV4ACE_OWNERMASK) { - return (NFSERR_ATTRNOTSUPP); - } - } else { - if ((mask & NFSV4ACE_OWNERMASK) != NFSV4ACE_OWNERMASK) { - return (NFSERR_ATTRNOTSUPP); - } - mask &= ~NFSV4ACE_OWNERMASK; - } - } else if (acetype == NFSV4ACE_ALLOWEDTYPE) { - if ((mask & NFSV4ACE_ALLFILESMASK) != NFSV4ACE_ALLFILESMASK) { - return (NFSERR_ATTRNOTSUPP); - } - mask &= ~NFSV4ACE_ALLFILESMASK; - if (owner) { - if ((mask & NFSV4ACE_OWNERMASK) != NFSV4ACE_OWNERMASK) { - return (NFSERR_ATTRNOTSUPP); - } - mask &= ~NFSV4ACE_OWNERMASK; - } else if (mask & NFSV4ACE_OWNERMASK) { - return (NFSERR_ATTRNOTSUPP); - } - } - if (type == VDIR) { - if ((mask & NFSV4ACE_DIRREADMASK) == NFSV4ACE_DIRREADMASK) { - perm |= ACL_READ; - mask &= ~NFSV4ACE_DIRREADMASK; - } - if ((mask & NFSV4ACE_DIRWRITEMASK) == NFSV4ACE_DIRWRITEMASK) { - perm |= ACL_WRITE; - mask &= ~NFSV4ACE_DIRWRITEMASK; - } - if ((mask & NFSV4ACE_DIREXECUTEMASK)==NFSV4ACE_DIREXECUTEMASK){ - perm |= ACL_EXECUTE; - mask &= ~NFSV4ACE_DIREXECUTEMASK; - } - } else { - if (acetype == NFSV4ACE_DENIEDTYPE && - (mask & NFSV4ACE_SYNCHRONIZE)) { - return (NFSERR_ATTRNOTSUPP); - } - mask &= ~(NFSV4ACE_SYNCHRONIZE | NFSV4ACE_DELETECHILD); - if ((mask & NFSV4ACE_READMASK) == NFSV4ACE_READMASK) { - perm |= ACL_READ; - mask &= ~NFSV4ACE_READMASK; - } - if ((mask & NFSV4ACE_WRITEMASK) == NFSV4ACE_WRITEMASK) { - perm |= ACL_WRITE; - mask &= ~NFSV4ACE_WRITEMASK; - } - if ((mask & NFSV4ACE_EXECUTEMASK) == NFSV4ACE_EXECUTEMASK) { - perm |= ACL_EXECUTE; - mask &= ~NFSV4ACE_EXECUTEMASK; - } - } - if (mask) { - return (NFSERR_ATTRNOTSUPP); - } - *permp = perm; - return (0); -} -#endif /* !NFS4_ACL_EXTATTR_NAME */ - -#ifdef NFS4_ACL_EXTATTR_NAME /* local functions */ static int nfsrv_buildace(struct nfsrv_descript *, u_char *, int, enum vtype, int, int, struct acl_entry *); @@ -619,70 +436,6 @@ nfsrv_buildacl(struct nfsrv_descript *nd, NFSACL_T *aclp, enum vtype type, return (retlen); } -/* - * Check access for an NFSv4 acl. - * The vflags are the basic VREAD, VWRITE, VEXEC. The mask is the NFSV4ACE - * mask bits for the more detailed check. - * If the more detailed check fails, due to no acl, do a basic one. - */ -APPLESTATIC int -nfsrv_aclaccess(vnode_t vp, accmode_t vflags, u_int32_t mask, - struct ucred *cred, NFSPROC_T *p) -{ - int error = 0; - accmode_t access; - - if (nfsrv_useacl == 0) { - error = VOP_ACCESS(vp, vflags, cred, p); - return (error); - } - - /* Convert NFSV4ACE mask to vaccess_t */ - access = 0; - if (mask & NFSV4ACE_READDATA) - access |= VREAD; - if (mask & NFSV4ACE_LISTDIRECTORY) - access |= VREAD; - if (mask & NFSV4ACE_WRITEDATA) - access |= VWRITE; - if (mask & NFSV4ACE_ADDFILE) - access |= VWRITE; - if (mask & NFSV4ACE_APPENDDATA) - access |= VAPPEND; - if (mask & NFSV4ACE_ADDSUBDIRECTORY) - access |= VAPPEND; - if (mask & NFSV4ACE_READNAMEDATTR) - access |= VREAD_NAMED_ATTRS; - if (mask & NFSV4ACE_WRITENAMEDATTR) - access |= VWRITE_NAMED_ATTRS; - if (mask & NFSV4ACE_EXECUTE) - access |= VEXEC; - if (mask & NFSV4ACE_SEARCH) - access |= VEXEC; - if (mask & NFSV4ACE_DELETECHILD) - access |= VDELETE_CHILD; - if (mask & NFSV4ACE_READATTRIBUTES) - access |= VREAD_ATTRIBUTES; - if (mask & NFSV4ACE_WRITEATTRIBUTES) - access |= VWRITE_ATTRIBUTES; - if (mask & NFSV4ACE_DELETE) - access |= VDELETE; - if (mask & NFSV4ACE_READACL) - access |= VREAD_ACL; - if (mask & NFSV4ACE_WRITEACL) - access |= VWRITE_ACL; - if (mask & NFSV4ACE_WRITEOWNER) - access |= VWRITE_OWNER; - if (mask & NFSV4ACE_SYNCHRONIZE) - access |= VSYNCHRONIZE; - - if (access != 0) - error = VOP_ACCESS(vp, access, cred, p); - else - error = VOP_ACCESS(vp, vflags, cred, p); - return (error); -} - /* * Set an NFSv4 acl. */ @@ -695,7 +448,7 @@ nfsrv_setacl(vnode_t vp, NFSACL_T *aclp, struct ucred *cred, if (nfsrv_useacl == 0 || !NFSHASNFS4ACL(vnode_mount(vp))) return (NFSERR_ATTRNOTSUPP); /* - * With NFS4 ACLs, chmod(2) may need to add additional entries. + * With NFSv4 ACLs, chmod(2) may need to add additional entries. * Make sure it has enough room for that - splitting every entry * into two and appending "canonical six" entries at the end. * Cribbed out of kern/vfs_acl.c - Rick M. @@ -742,5 +495,3 @@ nfsrv_compareacl(NFSACL_T *aclp1, NFSACL_T *aclp2) } return (0); } - -#endif /* NFS4_ACL_EXTATTR_NAME */ diff --git a/sys/fs/nfs/nfs_commonport.c b/sys/fs/nfs/nfs_commonport.c index bf982aa0c0e1..7f27494bb8b7 100644 --- a/sys/fs/nfs/nfs_commonport.c +++ b/sys/fs/nfs/nfs_commonport.c @@ -421,7 +421,6 @@ newnfs_portinit(void) mtx_init(&nfs_state_mutex, "nfs_state_mutex", NULL, MTX_DEF); } -#ifdef NFS4_ACL_EXTATTR_NAME /* * Determine if the file system supports NFSv4 ACLs. * Return 1 if it does, 0 otherwise. @@ -441,7 +440,6 @@ nfs_supportsnfsv4acls(struct mount *mp) } return (0); } -#endif /* NFS4_ACL_EXTATTR_NAME */ extern int (*nfsd_call_nfscommon)(struct thread *, struct nfssvc_args *); diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c index b1a7051359b4..8e53ae6a3696 100644 --- a/sys/fs/nfs/nfs_commonsubs.c +++ b/sys/fs/nfs/nfs_commonsubs.c @@ -650,10 +650,8 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp, int acecnt, error = 0, aceerr = 0, acesize; *aclerrp = 0; -#ifdef NFS4_ACL_EXTATTR_NAME if (aclp) aclp->acl_cnt = 0; -#endif /* * Parse out the ace entries and expect them to conform to * what can be supported by R/W/X bits. @@ -661,28 +659,22 @@ nfsrv_dissectacl(struct nfsrv_descript *nd, NFSACL_T *aclp, int *aclerrp, NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED); aclsize = NFSX_UNSIGNED; acecnt = fxdr_unsigned(int, *tl); -#ifdef NFS4_ACL_EXTATTR_NAME if (acecnt > ACL_MAX_ENTRIES) aceerr = 1; -#endif if (nfsrv_useacl == 0) aceerr = 1; for (i = 0; i < acecnt; i++) { -#ifdef NFS4_ACL_EXTATTR_NAME if (aclp && !aceerr) error = nfsrv_dissectace(nd, &aclp->acl_entry[i], &aceerr, &acesize, p); else -#endif error = nfsrv_skipace(nd, &acesize); if (error) return (error); aclsize += acesize; } -#ifdef NFS4_ACL_EXTATTR_NAME if (aclp && !aceerr) aclp->acl_cnt = acecnt; -#endif if (aceerr) *aclerrp = aceerr; if (aclsizep) @@ -1014,7 +1006,6 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp, case NFSATTRBIT_ACL: if (compare) { if (!(*retcmpp)) { -#ifdef NFS4_ACL_EXTATTR_NAME if (nfsrv_useacl) { NFSACL_T *naclp; @@ -1028,9 +1019,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp, if (aceerr || nfsrv_compareacl(aclp, naclp)) *retcmpp = NFSERR_NOTSAME; acl_free(naclp); - } else -#endif - { + } else { error = nfsrv_dissectacl(nd, NULL, &aceerr, &cnt, p); *retcmpp = NFSERR_ATTRNOTSUPP; @@ -1932,9 +1921,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, aclp = saclp; } else { NFSCLRNOTFILLABLE_ATTRBIT(retbitp); -#ifdef NFS4_ACL_EXTATTR_NAME naclp = acl_alloc(M_WAITOK); -#endif aclp = naclp; } nfsvno_getfs(&fsinf, isdgram); @@ -1957,21 +1944,15 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, /* * And the NFSv4 ACL... */ - if (NFSISSET_ATTRBIT(retbitp, NFSATTRBIT_ACLSUPPORT) -#ifdef NFS4_ACL_EXTATTR_NAME - && (nfsrv_useacl == 0 || ((cred != NULL || p != NULL) && - !NFSHASNFS4ACL(vnode_mount(vp)))) -#endif - ) { + if (NFSISSET_ATTRBIT(retbitp, NFSATTRBIT_ACLSUPPORT) && + (nfsrv_useacl == 0 || ((cred != NULL || p != NULL) && + !NFSHASNFS4ACL(vnode_mount(vp))))) { NFSCLRBIT_ATTRBIT(retbitp, NFSATTRBIT_ACLSUPPORT); } if (NFSISSET_ATTRBIT(retbitp, NFSATTRBIT_ACL)) { -#ifdef NFS4_ACL_EXTATTR_NAME if (nfsrv_useacl == 0 || ((cred != NULL || p != NULL) && !NFSHASNFS4ACL(vnode_mount(vp)))) { -#endif NFSCLRBIT_ATTRBIT(retbitp, NFSATTRBIT_ACL); -#ifdef NFS4_ACL_EXTATTR_NAME } else if (naclp != NULL) { NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p); error = VOP_ACCESS(vp, VREAD_ACL, cred, p); @@ -1987,7 +1968,6 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, NFSCLRBIT_ATTRBIT(retbitp, NFSATTRBIT_ACL); } } -#endif } /* * Put out the attribute bitmap for the ones being filled in @@ -2005,11 +1985,8 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, switch (bitpos) { case NFSATTRBIT_SUPPORTEDATTRS: NFSSETSUPP_ATTRBIT(&attrbits); -#ifdef NFS4_ACL_EXTATTR_NAME if (nfsrv_useacl == 0 || ((cred != NULL || p != NULL) - && !NFSHASNFS4ACL(vnode_mount(vp)))) -#endif - { + && !NFSHASNFS4ACL(vnode_mount(vp)))) { NFSCLRBIT_ATTRBIT(&attrbits,NFSATTRBIT_ACLSUPPORT); NFSCLRBIT_ATTRBIT(&attrbits,NFSATTRBIT_ACL); } @@ -2082,7 +2059,6 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, /* * Recommended Attributes. (Only the supported ones.) */ -#ifdef NFS4_ACL_EXTATTR_NAME case NFSATTRBIT_ACL: retnum += nfsrv_buildacl(nd, aclp, vnode_vtype(vp), p); break; @@ -2091,7 +2067,6 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, *tl = txdr_unsigned(NFSV4ACE_SUPTYPES); retnum += NFSX_UNSIGNED; break; -#endif case NFSATTRBIT_CANSETTIME: NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED); if (fsinf.fs_properties & NFSV3FSINFO_CANSETTIME) @@ -2397,10 +2372,8 @@ nfsv4_fillattr(struct nfsrv_descript *nd, vnode_t vp, NFSACL_T *saclp, }; } } -#ifdef NFS4_ACL_EXTATTR_NAME if (naclp != NULL) acl_free(naclp); -#endif *retnump = txdr_unsigned(retnum); return (retnum + prefixnum); } diff --git a/sys/fs/nfs/nfs_var.h b/sys/fs/nfs/nfs_var.h index 2556e354910e..17714d70aaa3 100644 --- a/sys/fs/nfs/nfs_var.h +++ b/sys/fs/nfs/nfs_var.h @@ -329,15 +329,11 @@ void newnfs_timer(void *); /* nfs_commonacl.c */ int nfsrv_dissectace(struct nfsrv_descript *, struct acl_entry *, int *, int *, NFSPROC_T *); -#ifdef NFS4_ACL_EXTATTR_NAME int nfsrv_buildacl(struct nfsrv_descript *, NFSACL_T *, enum vtype, NFSPROC_T *); -int nfsrv_aclaccess(vnode_t, accmode_t, u_int32_t, struct ucred *, - NFSPROC_T *); int nfsrv_setacl(vnode_t, NFSACL_T *, struct ucred *, NFSPROC_T *); int nfsrv_compareacl(NFSACL_T *, NFSACL_T *); -#endif /* nfs_clrpcops.c */ int nfsrpc_null(vnode_t, struct ucred *, NFSPROC_T *); @@ -516,8 +512,8 @@ int nfsvno_getattr(vnode_t, struct nfsvattr *, struct ucred *, int nfsvno_setattr(vnode_t, struct nfsvattr *, struct ucred *, NFSPROC_T *, struct nfsexstuff *); int nfsvno_getfh(vnode_t, fhandle_t *, NFSPROC_T *); -int nfsvno_accchk(vnode_t, u_int32_t, struct ucred *, - struct nfsexstuff *, NFSPROC_T *, int, int); +int nfsvno_accchk(vnode_t, accmode_t, struct ucred *, + struct nfsexstuff *, NFSPROC_T *, int, int, u_int32_t *); int nfsvno_namei(struct nfsrv_descript *, struct nameidata *, vnode_t, int, struct nfsexstuff *, NFSPROC_T *, vnode_t *); void nfsvno_setpathbuf(struct nameidata *, char **, u_long **); @@ -529,7 +525,7 @@ int nfsvno_read(vnode_t, off_t, int, struct ucred *, NFSPROC_T *, int nfsvno_write(vnode_t, off_t, int, int, int, mbuf_t, char *, struct ucred *, NFSPROC_T *); int nfsvno_createsub(struct nfsrv_descript *, struct nameidata *, - vnode_t *, struct nfsvattr *, int *, u_char *, NFSDEV_T, NFSPROC_T *, + vnode_t *, struct nfsvattr *, int *, int32_t *, NFSDEV_T, NFSPROC_T *, struct nfsexstuff *); int nfsvno_mknod(struct nameidata *, struct nfsvattr *, struct ucred *, NFSPROC_T *); @@ -552,7 +548,7 @@ int nfsvno_fsync(vnode_t, u_int64_t, int, struct ucred *, NFSPROC_T *); int nfsvno_statfs(vnode_t, struct statfs *); void nfsvno_getfs(struct nfsfsinfo *, int); void nfsvno_open(struct nfsrv_descript *, struct nameidata *, nfsquad_t, - nfsv4stateid_t *, struct nfsstate *, int *, struct nfsvattr *, u_char *, + nfsv4stateid_t *, struct nfsstate *, int *, struct nfsvattr *, int32_t *, int, NFSACL_T *, nfsattrbit_t *, struct ucred *, NFSPROC_T *, struct nfsexstuff *, vnode_t *); void nfsvno_updfilerev(vnode_t, struct nfsvattr *, struct ucred *, diff --git a/sys/fs/nfs/nfsport.h b/sys/fs/nfs/nfsport.h index f320316be7db..c7ef67c51b0b 100644 --- a/sys/fs/nfs/nfsport.h +++ b/sys/fs/nfs/nfsport.h @@ -125,11 +125,7 @@ #define NFSPROC_T struct thread #define NFSDEV_T dev_t #define NFSSVCARGS nfssvc_args -#ifdef NFS4_ACL_EXTATTR_NAME #define NFSACL_T struct acl -#else -#define NFSACL_T void -#endif /* * These should be defined as the types used for the corresponding VOP's diff --git a/sys/fs/nfsclient/nfs.h b/sys/fs/nfsclient/nfs.h index 8029a00c2db6..4b542869d62a 100644 --- a/sys/fs/nfsclient/nfs.h +++ b/sys/fs/nfsclient/nfs.h @@ -55,6 +55,19 @@ #define NFS_ISV34(v) \ (VFSTONFS((v)->v_mount)->nm_flag & (NFSMNT_NFSV3 | NFSMNT_NFSV4)) +/* + * NFS iod threads can be in one of these three states once spawned. + * NFSIOD_NOT_AVAILABLE - Cannot be assigned an I/O operation at this time. + * NFSIOD_AVAILABLE - Available to be assigned an I/O operation. + * NFSIOD_CREATED_FOR_NFS_ASYNCIO - Newly created for nfs_asyncio() and + * will be used by the thread that called nfs_asyncio(). + */ +enum nfsiod_state { + NFSIOD_NOT_AVAILABLE = 0, + NFSIOD_AVAILABLE = 1, + NFSIOD_CREATED_FOR_NFS_ASYNCIO = 2, +}; + /* * Function prototypes. */ @@ -67,7 +80,6 @@ int ncl_vinvalbuf(struct vnode *, int, struct thread *, int); int ncl_asyncio(struct nfsmount *, struct buf *, struct ucred *, struct thread *); int ncl_doio(struct vnode *, struct buf *, struct ucred *, struct thread *); -int ncl_msleep(struct thread *, void *, struct mtx *, int, char *, int); void ncl_nhinit(void); void ncl_nhuninit(void); void ncl_nodelock(struct nfsnode *); @@ -88,7 +100,7 @@ int ncl_fsinfo(struct nfsmount *, struct vnode *, struct ucred *, int ncl_init(struct vfsconf *); int ncl_uninit(struct vfsconf *); int ncl_mountroot(struct mount *); -int ncl_nfsiodnew(void); +int ncl_nfsiodnew(int); #endif /* _KERNEL */ diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c index 030e322cd99a..d0dd2cc2e9f5 100644 --- a/sys/fs/nfsclient/nfs_clbio.c +++ b/sys/fs/nfsclient/nfs_clbio.c @@ -63,7 +63,7 @@ extern int newnfs_directio_allow_mmap; extern struct nfsstats newnfsstats; extern struct mtx ncl_iod_mutex; extern int ncl_numasync; -extern struct proc *ncl_iodwant[NFS_MAXRAHEAD]; +extern enum nfsiod_state ncl_iodwant[NFS_MAXRAHEAD]; extern struct nfsmount *ncl_iodmount[NFS_MAXRAHEAD]; extern int newnfs_directio_enable; @@ -74,101 +74,6 @@ static struct buf *nfs_getcacheblk(struct vnode *vp, daddr_t bn, int size, static int nfs_directio_write(struct vnode *vp, struct uio *uiop, struct ucred *cred, int ioflag); -/* - * Any signal that can interrupt an NFS operation in an intr mount - * should be added to this set. SIGSTOP and SIGKILL cannot be masked. - */ -static int nfs_sig_set[] = { - SIGINT, - SIGTERM, - SIGHUP, - SIGKILL, - SIGSTOP, - SIGQUIT -}; - -#ifdef notnow -/* - * Check to see if one of the signals in our subset is pending on - * the process (in an intr mount). - */ -int -ncl_sig_pending(sigset_t set) -{ - int i; - - for (i = 0 ; i < sizeof(nfs_sig_set)/sizeof(int) ; i++) - if (SIGISMEMBER(set, nfs_sig_set[i])) - return (1); - return (0); -} -#endif - -/* - * The set/restore sigmask functions are used to (temporarily) overwrite - * the process p_sigmask during an RPC call (for example). These are also - * used in other places in the NFS client that might tsleep(). - */ -static void -ncl_set_sigmask(struct thread *td, sigset_t *oldset) -{ - sigset_t newset; - int i; - struct proc *p; - - SIGFILLSET(newset); - if (td == NULL) - td = curthread; /* XXX */ - p = td->td_proc; - /* Remove the NFS set of signals from newset */ - PROC_LOCK(p); - mtx_lock(&p->p_sigacts->ps_mtx); - for (i = 0 ; i < sizeof(nfs_sig_set)/sizeof(int) ; i++) { - /* - * But make sure we leave the ones already masked - * by the process, ie. remove the signal from the - * temporary signalmask only if it wasn't already - * in p_sigmask. - */ - if (!SIGISMEMBER(td->td_sigmask, nfs_sig_set[i]) && - !SIGISMEMBER(p->p_sigacts->ps_sigignore, nfs_sig_set[i])) - SIGDELSET(newset, nfs_sig_set[i]); - } - mtx_unlock(&p->p_sigacts->ps_mtx); - PROC_UNLOCK(p); - kern_sigprocmask(td, SIG_SETMASK, &newset, oldset, 0); -} - -static void -ncl_restore_sigmask(struct thread *td, sigset_t *set) -{ - if (td == NULL) - td = curthread; /* XXX */ - kern_sigprocmask(td, SIG_SETMASK, set, NULL, 0); -} - -/* - * NFS wrapper to msleep(), that shoves a new p_sigmask and restores the - * old one after msleep() returns. - */ -int -ncl_msleep(struct thread *td, void *ident, struct mtx *mtx, int priority, char *wmesg, int timo) -{ - sigset_t oldset; - int error; - struct proc *p; - - if ((priority & PCATCH) == 0) - return msleep(ident, mtx, priority, wmesg, timo); - if (td == NULL) - td = curthread; /* XXX */ - ncl_set_sigmask(td, &oldset); - error = msleep(ident, mtx, priority, wmesg, timo); - ncl_restore_sigmask(td, &oldset); - p = td->td_proc; - return (error); -} - /* * Vnode op for VM getpages. */ @@ -1356,9 +1261,9 @@ nfs_getcacheblk(struct vnode *vp, daddr_t bn, int size, struct thread *td) if (nmp->nm_flag & NFSMNT_INT) { sigset_t oldset; - ncl_set_sigmask(td, &oldset); + newnfs_set_sigmask(td, &oldset); bp = getblk(vp, bn, size, NFS_PCATCH, 0, 0); - ncl_restore_sigmask(td, &oldset); + newnfs_restore_sigmask(td, &oldset); while (bp == NULL) { if (newnfs_sigintr(nmp, td)) return (NULL); @@ -1491,7 +1396,7 @@ again: * Find a free iod to process this request. */ for (iod = 0; iod < ncl_numasync; iod++) - if (ncl_iodwant[iod]) { + if (ncl_iodwant[iod] == NFSIOD_AVAILABLE) { gotiod = TRUE; break; } @@ -1500,7 +1405,7 @@ again: * Try to create one if none are free. */ if (!gotiod) { - iod = ncl_nfsiodnew(); + iod = ncl_nfsiodnew(1); if (iod != -1) gotiod = TRUE; } @@ -1512,7 +1417,7 @@ again: */ NFS_DPF(ASYNCIO, ("ncl_asyncio: waking iod %d for mount %p\n", iod, nmp)); - ncl_iodwant[iod] = NULL; + ncl_iodwant[iod] = NFSIOD_NOT_AVAILABLE; ncl_iodmount[iod] = nmp; nmp->nm_bufqiods++; wakeup(&ncl_iodwant[iod]); @@ -1544,9 +1449,9 @@ again: NFS_DPF(ASYNCIO, ("ncl_asyncio: waiting for mount %p queue to drain\n", nmp)); nmp->nm_bufqwant = TRUE; - error = ncl_msleep(td, &nmp->nm_bufq, &ncl_iod_mutex, - slpflag | PRIBIO, - "nfsaio", slptimeo); + error = newnfs_msleep(td, &nmp->nm_bufq, + &ncl_iod_mutex, slpflag | PRIBIO, "nfsaio", + slptimeo); if (error) { error2 = newnfs_sigintr(nmp, td); if (error2) { diff --git a/sys/fs/nfsclient/nfs_clnfsiod.c b/sys/fs/nfsclient/nfs_clnfsiod.c index f38aed85305f..6649fc032a3e 100644 --- a/sys/fs/nfsclient/nfs_clnfsiod.c +++ b/sys/fs/nfsclient/nfs_clnfsiod.c @@ -72,7 +72,7 @@ __FBSDID("$FreeBSD$"); extern struct mtx ncl_iod_mutex; int ncl_numasync; -struct proc *ncl_iodwant[NFS_MAXRAHEAD]; +enum nfsiod_state ncl_iodwant[NFS_MAXRAHEAD]; struct nfsmount *ncl_iodmount[NFS_MAXRAHEAD]; static void nfssvc_iod(void *); @@ -114,7 +114,7 @@ sysctl_iodmin(SYSCTL_HANDLER_ARGS) * than the new minimum, create some more. */ for (i = nfs_iodmin - ncl_numasync; i > 0; i--) - ncl_nfsiodnew(); + ncl_nfsiodnew(0); out: mtx_unlock(&ncl_iod_mutex); return (0); @@ -147,7 +147,7 @@ sysctl_iodmax(SYSCTL_HANDLER_ARGS) */ iod = ncl_numasync - 1; for (i = 0; i < ncl_numasync - ncl_iodmax; i++) { - if (ncl_iodwant[iod]) + if (ncl_iodwant[iod] == NFSIOD_AVAILABLE) wakeup(&ncl_iodwant[iod]); iod--; } @@ -159,7 +159,7 @@ SYSCTL_PROC(_vfs_newnfs, OID_AUTO, iodmax, CTLTYPE_UINT | CTLFLAG_RW, 0, sizeof (ncl_iodmax), sysctl_iodmax, "IU", ""); int -ncl_nfsiodnew(void) +ncl_nfsiodnew(int set_iodwant) { int error, i; int newiod; @@ -175,12 +175,17 @@ ncl_nfsiodnew(void) } if (newiod == -1) return (-1); + if (set_iodwant > 0) + ncl_iodwant[i] = NFSIOD_CREATED_FOR_NFS_ASYNCIO; mtx_unlock(&ncl_iod_mutex); error = kproc_create(nfssvc_iod, nfs_asyncdaemon + i, NULL, RFHIGHPID, 0, "nfsiod %d", newiod); mtx_lock(&ncl_iod_mutex); - if (error) + if (error) { + if (set_iodwant > 0) + ncl_iodwant[i] = NFSIOD_NOT_AVAILABLE; return (-1); + } ncl_numasync++; return (newiod); } @@ -199,7 +204,7 @@ nfsiod_setup(void *dummy) nfs_iodmin = NFS_MAXRAHEAD; for (i = 0; i < nfs_iodmin; i++) { - error = ncl_nfsiodnew(); + error = ncl_nfsiodnew(0); if (error == -1) panic("newnfsiod_setup: ncl_nfsiodnew failed"); } @@ -235,7 +240,8 @@ nfssvc_iod(void *instance) goto finish; if (nmp) nmp->nm_bufqiods--; - ncl_iodwant[myiod] = curthread->td_proc; + if (ncl_iodwant[myiod] == NFSIOD_NOT_AVAILABLE) + ncl_iodwant[myiod] = NFSIOD_AVAILABLE; ncl_iodmount[myiod] = NULL; /* * Always keep at least nfs_iodmin kthreads. @@ -295,7 +301,7 @@ finish: nfs_asyncdaemon[myiod] = 0; if (nmp) nmp->nm_bufqiods--; - ncl_iodwant[myiod] = NULL; + ncl_iodwant[myiod] = NFSIOD_NOT_AVAILABLE; ncl_iodmount[myiod] = NULL; /* Someone may be waiting for the last nfsiod to terminate. */ if (--ncl_numasync == 0) diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c index 548ae410055a..e81c3bf805b8 100644 --- a/sys/fs/nfsclient/nfs_clport.c +++ b/sys/fs/nfsclient/nfs_clport.c @@ -1243,6 +1243,10 @@ nfscl_modevent(module_t mod, int type, void *data) break; } + /* + * XXX: Unloading of nfscl module is unsupported. + */ +#if 0 ncl_call_invalcaches = NULL; nfsd_call_nfscl = NULL; /* and get rid of the mutexes */ @@ -1250,6 +1254,9 @@ nfscl_modevent(module_t mod, int type, void *data) mtx_destroy(&ncl_iod_mutex); loaded = 0; break; +#else + /* FALLTHROUGH */ +#endif default: error = EOPNOTSUPP; break; @@ -1261,7 +1268,7 @@ static moduledata_t nfscl_mod = { nfscl_modevent, NULL, }; -DECLARE_MODULE(nfscl, nfscl_mod, SI_SUB_VFS, SI_ORDER_ANY); +DECLARE_MODULE(nfscl, nfscl_mod, SI_SUB_VFS, SI_ORDER_FIRST); /* So that loader and kldload(2) can find us, wherever we are.. */ MODULE_VERSION(nfscl, 1); diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c index 37131cf94484..95943a9660bb 100644 --- a/sys/fs/nfsclient/nfs_clrpcops.c +++ b/sys/fs/nfsclient/nfs_clrpcops.c @@ -81,10 +81,8 @@ static int nfsrpc_createv4(vnode_t , char *, int, struct vattr *, static int nfsrpc_locku(struct nfsrv_descript *, struct nfsmount *, struct nfscllockowner *, u_int64_t, u_int64_t, u_int32_t, struct ucred *, NFSPROC_T *, int); -#ifdef NFS4_ACL_EXTATTR_NAME static int nfsrpc_setaclrpc(vnode_t, struct ucred *, NFSPROC_T *, struct acl *, nfsv4stateid_t *, void *); -#endif /* * nfs null call from vfs. @@ -983,14 +981,9 @@ nfsrpc_setattr(vnode_t vp, struct vattr *vap, NFSACL_T *aclp, if (vap != NULL) error = nfsrpc_setattrrpc(vp, vap, &stateid, cred, p, rnap, attrflagp, stuff); -#ifdef NFS4_ACL_EXTATTR_NAME else error = nfsrpc_setaclrpc(vp, cred, p, aclp, &stateid, stuff); -#else - else - error = EOPNOTSUPP; -#endif if (error == NFSERR_STALESTATEID) nfscl_initiate_recovery(nmp->nm_clp); if (lckp != NULL) @@ -1633,10 +1626,15 @@ nfsrpc_mknod(vnode_t dvp, char *name, int namelen, struct vattr *vap, return (ENAMETOOLONG); NFSCL_REQSTART(nd, NFSPROC_MKNOD, dvp); if (nd->nd_flag & ND_NFSV4) { - NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED); - *tl++ = vtonfsv34_type(vtyp); - *tl++ = txdr_unsigned(NFSMAJOR(rdev)); - *tl = txdr_unsigned(NFSMINOR(rdev)); + if (vtyp == VBLK || vtyp == VCHR) { + NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED); + *tl++ = vtonfsv34_type(vtyp); + *tl++ = txdr_unsigned(NFSMAJOR(rdev)); + *tl = txdr_unsigned(NFSMINOR(rdev)); + } else { + NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED); + *tl = vtonfsv34_type(vtyp); + } } (void) nfsm_strtom(nd, name, namelen); if (nd->nd_flag & ND_NFSV3) { @@ -4094,7 +4092,6 @@ nfsrpc_delegreturn(struct nfscldeleg *dp, struct ucred *cred, return (error); } -#ifdef NFS4_ACL_EXTATTR_NAME /* * nfs getacl call. */ @@ -4168,5 +4165,3 @@ nfsrpc_setaclrpc(vnode_t vp, struct ucred *cred, NFSPROC_T *p, mbuf_freem(nd->nd_mrep); return (nd->nd_repstat); } - -#endif /* NFS4_ACL_EXTATTR_NAME */ diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c index 236432eeb82a..568c5de640af 100644 --- a/sys/fs/nfsclient/nfs_clstate.c +++ b/sys/fs/nfsclient/nfs_clstate.c @@ -36,9 +36,9 @@ __FBSDID("$FreeBSD$"); * - The correct granularity of an OpenOwner is not nearly so * obvious. An OpenOwner does the following: * - provides a serial sequencing of Open/Close/Lock-with-new-lockowner - * - is used to check for Open/SHare contention (not applicable to + * - is used to check for Open/Share contention (not applicable to * this client, since all Opens are Deny_None) - * As such, I considered both extrema. + * As such, I considered both extreme. * 1 OpenOwner per ClientID - Simple to manage, but fully serializes * all Open, Close and Lock (with a new lockowner) Ops. * 1 OpenOwner for each Open - This one results in an OpenConfirm for @@ -50,8 +50,8 @@ __FBSDID("$FreeBSD$"); * which of these the vnodeop close applies to. This is handled by * delaying the Close Op(s) until all of the Opens have been closed. * (It is not yet obvious if this is the correct granularity.) - * - How the code handles serailization: - * - For the ClientId, is uses an exclusive lock while getting its + * - How the code handles serialization: + * - For the ClientId, it uses an exclusive lock while getting its * SetClientId and during recovery. Otherwise, it uses a shared * lock via a reference count. * - For the rest of the data structures, it uses an SMP mutex @@ -116,8 +116,8 @@ static int nfscl_checkconflict(struct nfscllockownerhead *, struct nfscllock *, u_int8_t *, struct nfscllock **); static void nfscl_freelockowner(struct nfscllockowner *, int); static void nfscl_freealllocks(struct nfscllockownerhead *, int); -static int nfscl_localconflict(struct nfsclclient *, struct nfscllock *, - u_int8_t *, struct nfscldeleg *, struct nfscllock **); +static int nfscl_localconflict(struct nfsclclient *, u_int8_t *, int, + struct nfscllock *, u_int8_t *, struct nfscldeleg *, struct nfscllock **); static void nfscl_newopen(struct nfsclclient *, struct nfscldeleg *, struct nfsclowner **, struct nfsclowner **, struct nfsclopen **, struct nfsclopen **, u_int8_t *, u_int8_t *, int, int *); @@ -955,7 +955,8 @@ nfscl_getbytelock(vnode_t vp, u_int64_t off, u_int64_t len, lhp = &op->nfso_lock; } if (!error && !recovery) - error = nfscl_localconflict(clp, nlop, ownp, ldp, NULL); + error = nfscl_localconflict(clp, np->n_fhp->nfh_fh, + np->n_fhp->nfh_len, nlop, ownp, ldp, NULL); if (error) { if (!recovery) { nfscl_clrelease(clp); @@ -1047,7 +1048,7 @@ nfscl_relbytelock(vnode_t vp, u_int64_t off, u_int64_t len, struct nfscldeleg *dp; struct nfsnode *np; u_int8_t own[NFSV4CL_LOCKNAMELEN]; - int ret = 0, fnd, error; + int ret = 0, fnd; np = VTONFS(vp); *lpp = NULL; @@ -1082,16 +1083,6 @@ nfscl_relbytelock(vnode_t vp, u_int64_t off, u_int64_t len, dp = nfscl_finddeleg(clp, np->n_fhp->nfh_fh, np->n_fhp->nfh_len); - /* Search for a local conflict. */ - error = nfscl_localconflict(clp, nlop, own, dp, NULL); - if (error) { - NFSUNLOCKCLSTATE(); - FREE((caddr_t)nlop, M_NFSCLLOCK); - if (other_lop != NULL) - FREE((caddr_t)other_lop, M_NFSCLLOCK); - return (error); - } - /* * First, unlock any local regions on a delegation. */ @@ -3169,8 +3160,9 @@ nfscl_getmnt(u_int32_t cbident) * a write lock or this is an unlock. */ static int -nfscl_localconflict(struct nfsclclient *clp, struct nfscllock *nlop, - u_int8_t *own, struct nfscldeleg *dp, struct nfscllock **lopp) +nfscl_localconflict(struct nfsclclient *clp, u_int8_t *fhp, int fhlen, + struct nfscllock *nlop, u_int8_t *own, struct nfscldeleg *dp, + struct nfscllock **lopp) { struct nfsclowner *owp; struct nfsclopen *op; @@ -3183,10 +3175,13 @@ nfscl_localconflict(struct nfsclclient *clp, struct nfscllock *nlop, } LIST_FOREACH(owp, &clp->nfsc_owner, nfsow_list) { LIST_FOREACH(op, &owp->nfsow_open, nfso_list) { - ret = nfscl_checkconflict(&op->nfso_lock, nlop, own, - lopp); - if (ret) - return (ret); + if (op->nfso_fhlen == fhlen && + !NFSBCMP(op->nfso_fh, fhp, fhlen)) { + ret = nfscl_checkconflict(&op->nfso_lock, nlop, + own, lopp); + if (ret) + return (ret); + } } } return (0); @@ -3245,10 +3240,9 @@ nfscl_lockt(vnode_t vp, struct nfsclclient *clp, u_int64_t off, nfscl_filllockowner(p, own); NFSLOCKCLSTATE(); dp = nfscl_finddeleg(clp, np->n_fhp->nfh_fh, np->n_fhp->nfh_len); - error = nfscl_localconflict(clp, &nlck, own, dp, &lop); - if (error == NFSERR_DENIED) - error = EACCES; - if (error) { + error = nfscl_localconflict(clp, np->n_fhp->nfh_fh, np->n_fhp->nfh_len, + &nlck, own, dp, &lop); + if (error != 0) { fl->l_whence = SEEK_SET; fl->l_start = lop->nfslo_first; if (lop->nfslo_end == NFS64BITSSET) @@ -3257,6 +3251,7 @@ nfscl_lockt(vnode_t vp, struct nfsclclient *clp, u_int64_t off, fl->l_len = lop->nfslo_end - lop->nfslo_first; fl->l_pid = (pid_t)0; fl->l_type = lop->nfslo_type; + error = -1; /* no RPC required */ } else if (dp != NULL && ((dp->nfsdl_flags & NFSCLDL_WRITE) || fl->l_type == F_RDLCK)) { /* diff --git a/sys/fs/nfsclient/nfs_clsubs.c b/sys/fs/nfsclient/nfs_clsubs.c index a217a21513ac..155350987075 100644 --- a/sys/fs/nfsclient/nfs_clsubs.c +++ b/sys/fs/nfsclient/nfs_clsubs.c @@ -78,7 +78,7 @@ __FBSDID("$FreeBSD$"); #include extern struct mtx ncl_iod_mutex; -extern struct proc *ncl_iodwant[NFS_MAXRAHEAD]; +extern enum nfsiod_state ncl_iodwant[NFS_MAXRAHEAD]; extern struct nfsmount *ncl_iodmount[NFS_MAXRAHEAD]; extern int ncl_numasync; extern unsigned int ncl_iodmax; @@ -87,6 +87,10 @@ extern struct nfsstats newnfsstats; int ncl_uninit(struct vfsconf *vfsp) { + /* + * XXX: Unloading of nfscl module is unsupported. + */ +#if 0 int i; /* @@ -96,7 +100,7 @@ ncl_uninit(struct vfsconf *vfsp) mtx_lock(&ncl_iod_mutex); ncl_iodmax = 0; for (i = 0; i < ncl_numasync; i++) - if (ncl_iodwant[i]) + if (ncl_iodwant[i] == NFSIOD_AVAILABLE) wakeup(&ncl_iodwant[i]); /* The last nfsiod to exit will wake us up when ncl_numasync hits 0 */ while (ncl_numasync) @@ -104,6 +108,9 @@ ncl_uninit(struct vfsconf *vfsp) mtx_unlock(&ncl_iod_mutex); ncl_nhuninit(); return (0); +#else + return (EOPNOTSUPP); +#endif } void @@ -389,7 +396,7 @@ ncl_init(struct vfsconf *vfsp) /* Ensure async daemons disabled */ for (i = 0; i < NFS_MAXRAHEAD; i++) { - ncl_iodwant[i] = NULL; + ncl_iodwant[i] = NFSIOD_NOT_AVAILABLE; ncl_iodmount[i] = NULL; } ncl_nhinit(); /* Init the nfsnode table */ diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c index 1f7d20868b3d..0bf2bf4b4e50 100644 --- a/sys/fs/nfsclient/nfs_clvfsops.c +++ b/sys/fs/nfsclient/nfs_clvfsops.c @@ -99,7 +99,7 @@ static void nfs_decode_args(struct mount *mp, struct nfsmount *nmp, struct nfs_args *argp, struct ucred *, struct thread *); static int mountnfs(struct nfs_args *, struct mount *, struct sockaddr *, char *, u_char *, u_char *, u_char *, - struct vnode **, struct ucred *, struct thread *); + struct vnode **, struct ucred *, struct thread *, int); static vfs_mount_t nfs_mount; static vfs_cmount_t nfs_cmount; static vfs_unmount_t nfs_unmount; @@ -498,7 +498,7 @@ nfs_mountdiskless(char *path, nam = sodupsockaddr((struct sockaddr *)sin, M_WAITOK); if ((error = mountnfs(args, mp, nam, path, NULL, NULL, NULL, vpp, - td->td_ucred, td)) != 0) { + td->td_ucred, td, NFS_DEFAULT_NEGNAMETIMEO)) != 0) { printf("nfs_mountroot: mount %s on /: %d\n", path, error); return (error); } @@ -669,6 +669,7 @@ static const char *nfs_opts[] = { "from", "retrans", "acregmin", "acregmax", "acdirmin", "acdirmax", "resvport", "readahead", "hostname", "timeout", "addr", "fh", "nfsv3", "sec", "principal", "nfsv4", "gssname", "allgssname", "dirpath", + "negnametimeo", NULL }; /* @@ -717,6 +718,7 @@ nfs_mount(struct mount *mp) char hst[MNAMELEN]; u_char nfh[NFSX_FHMAX], krbname[100], dirpath[100], srvkrbname[100]; char *opt, *name, *secname; + int negnametimeo = NFS_DEFAULT_NEGNAMETIMEO; if (vfs_filteropt(mp->mnt_optnew, nfs_opts)) { error = EINVAL; @@ -891,6 +893,16 @@ nfs_mount(struct mount *mp) } args.flags |= NFSMNT_TIMEO; } + if (vfs_getopt(mp->mnt_optnew, "negnametimeo", (void **)&opt, NULL) + == 0) { + ret = sscanf(opt, "%d", &negnametimeo); + if (ret != 1 || negnametimeo < 0) { + vfs_mount_error(mp, "illegal negnametimeo: %s", + opt); + error = EINVAL; + goto out; + } + } if (vfs_getopt(mp->mnt_optnew, "sec", (void **) &secname, NULL) == 0) nfs_sec_name(secname, &args.flags); @@ -990,7 +1002,7 @@ nfs_mount(struct mount *mp) args.fh = nfh; error = mountnfs(&args, mp, nam, hst, krbname, dirpath, srvkrbname, - &vp, td->td_ucred, td); + &vp, td->td_ucred, td, negnametimeo); out: if (!error) { MNT_ILOCK(mp); @@ -1033,7 +1045,8 @@ nfs_cmount(struct mntarg *ma, void *data, int flags) static int mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam, char *hst, u_char *krbname, u_char *dirpath, u_char *srvkrbname, - struct vnode **vpp, struct ucred *cred, struct thread *td) + struct vnode **vpp, struct ucred *cred, struct thread *td, + int negnametimeo) { struct nfsmount *nmp; struct nfsnode *np; @@ -1101,6 +1114,7 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam, vfs_getnewfsid(mp); nmp->nm_mountp = mp; mtx_init(&nmp->nm_mtx, "NFSmount lock", NULL, MTX_DEF | MTX_DUPOK); + nmp->nm_negnametimeo = negnametimeo; nfs_decode_args(mp, nmp, argp, cred, td); diff --git a/sys/fs/nfsclient/nfs_clvnops.c b/sys/fs/nfsclient/nfs_clvnops.c index 5dc3a593458a..3be823f1969b 100644 --- a/sys/fs/nfsclient/nfs_clvnops.c +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -128,10 +128,8 @@ static vop_readlink_t nfs_readlink; static vop_print_t nfs_print; static vop_advlock_t nfs_advlock; static vop_advlockasync_t nfs_advlockasync; -#ifdef NFS4_ACL_EXTATTR_NAME static vop_getacl_t nfs_getacl; static vop_setacl_t nfs_setacl; -#endif /* * Global vfs data structures for nfs @@ -166,10 +164,8 @@ struct vop_vector newnfs_vnodeops = { .vop_strategy = nfs_strategy, .vop_symlink = nfs_symlink, .vop_write = ncl_write, -#ifdef NFS4_ACL_EXTATTR_NAME .vop_getacl = nfs_getacl, .vop_setacl = nfs_setacl, -#endif }; struct vop_vector newnfs_fifoops = { @@ -224,10 +220,6 @@ int newnfs_directio_enable = 0; SYSCTL_INT(_vfs_newnfs, OID_AUTO, directio_enable, CTLFLAG_RW, &newnfs_directio_enable, 0, "Enable NFS directio"); -static int newnfs_neglookup_enable = 1; -SYSCTL_INT(_vfs_newnfs, OID_AUTO, neglookup_enable, CTLFLAG_RW, - &newnfs_neglookup_enable, 0, "Enable NFS negative lookup caching"); - /* * This sysctl allows other processes to mmap a file that has been opened * O_DIRECT by a process. In general, having processes mmap the file while @@ -331,12 +323,9 @@ nfs_access(struct vop_access_args *ap) * unless the file is a socket, fifo, or a block or character * device resident on the filesystem. */ - if ((ap->a_accmode & (VWRITE | VAPPEND -#ifdef NFS4_ACL_EXTATTR_NAME - | VWRITE_NAMED_ATTRS | VDELETE_CHILD | VWRITE_ATTRIBUTES | - VDELETE | VWRITE_ACL | VWRITE_OWNER -#endif - )) != 0 && (vp->v_mount->mnt_flag & MNT_RDONLY) != 0) { + if ((ap->a_accmode & (VWRITE | VAPPEND | VWRITE_NAMED_ATTRS | + VDELETE_CHILD | VWRITE_ATTRIBUTES | VDELETE | VWRITE_ACL | + VWRITE_OWNER)) != 0 && (vp->v_mount->mnt_flag & MNT_RDONLY) != 0) { switch (vp->v_type) { case VREG: case VDIR: @@ -366,10 +355,8 @@ nfs_access(struct vop_access_args *ap) mode |= NFSACCESS_EXTEND; if (ap->a_accmode & VEXEC) mode |= NFSACCESS_EXECUTE; -#ifdef NFS4_ACL_EXTATTR_NAME if (ap->a_accmode & VDELETE) mode |= NFSACCESS_DELETE; -#endif } else { if (ap->a_accmode & VWRITE) mode |= (NFSACCESS_MODIFY | NFSACCESS_EXTEND); @@ -377,12 +364,10 @@ nfs_access(struct vop_access_args *ap) mode |= NFSACCESS_EXTEND; if (ap->a_accmode & VEXEC) mode |= NFSACCESS_LOOKUP; -#ifdef NFS4_ACL_EXTATTR_NAME if (ap->a_accmode & VDELETE) mode |= NFSACCESS_DELETE; if (ap->a_accmode & VDELETE_CHILD) mode |= NFSACCESS_MODIFY; -#endif } /* XXX safety belt, only make blanket request if caching */ if (nfsaccess_cache_timeout > 0) { @@ -713,11 +698,11 @@ nfs_close(struct vop_close_args *ap) * enabled. (What does this have to do with negative lookup * caching? Well nothing, except it was reported by the * same user that needed negative lookup caching and I wanted - * there to be a way to disable it via sysctl to see if it + * there to be a way to disable it to see if it * is the cause of some caching/coherency issue that might * crop up.) */ - if (newnfs_neglookup_enable == 0) + if (VFSTONFS(vp->v_mount)->nm_negnametimeo == 0) np->n_attrstamp = 0; if (np->n_flag & NWRITEERR) { np->n_flag &= ~NWRITEERR; @@ -1007,6 +992,8 @@ nfs_lookup(struct vop_lookup_args *ap) struct thread *td = cnp->cn_thread; struct nfsfh *nfhp; struct nfsvattr dnfsva, nfsva; + struct vattr vattr; + time_t dmtime; *vpp = NULLVP; if ((flags & ISLASTCN) && (mp->mnt_flag & MNT_RDONLY) && @@ -1027,37 +1014,68 @@ nfs_lookup(struct vop_lookup_args *ap) if ((error = VOP_ACCESS(dvp, VEXEC, cnp->cn_cred, td)) != 0) return (error); - if ((error = cache_lookup(dvp, vpp, cnp)) && - (error != ENOENT || newnfs_neglookup_enable != 0)) { - struct vattr vattr; - - if (error == ENOENT) { - if (!VOP_GETATTR(dvp, &vattr, cnp->cn_cred) && - vattr.va_mtime.tv_sec == np->n_dmtime) { - NFSINCRGLOBAL(newnfsstats.lookupcache_hits); - return (ENOENT); - } - cache_purge_negative(dvp); - np->n_dmtime = 0; - } else { - newvp = *vpp; - if (nfscl_nodeleg(newvp, 0) == 0 || - (!VOP_GETATTR(newvp, &vattr, cnp->cn_cred) && - vattr.va_ctime.tv_sec==VTONFS(newvp)->n_ctime)) { - NFSINCRGLOBAL(newnfsstats.lookupcache_hits); - if (cnp->cn_nameiop != LOOKUP && - (flags & ISLASTCN)) - cnp->cn_flags |= SAVENAME; - return (0); - } - cache_purge(newvp); - if (dvp != newvp) - vput(newvp); - else - vrele(newvp); - *vpp = NULLVP; + error = cache_lookup(dvp, vpp, cnp); + if (error > 0 && error != ENOENT) + return (error); + if (error == -1) { + /* + * We only accept a positive hit in the cache if the + * change time of the file matches our cached copy. + * Otherwise, we discard the cache entry and fallback + * to doing a lookup RPC. + */ + newvp = *vpp; + if (nfscl_nodeleg(newvp, 0) == 0 || + (!VOP_GETATTR(newvp, &vattr, cnp->cn_cred) + && vattr.va_ctime.tv_sec == VTONFS(newvp)->n_ctime)) { + NFSINCRGLOBAL(newnfsstats.lookupcache_hits); + if (cnp->cn_nameiop != LOOKUP && + (flags & ISLASTCN)) + cnp->cn_flags |= SAVENAME; + return (0); } + cache_purge(newvp); + if (dvp != newvp) + vput(newvp); + else + vrele(newvp); + *vpp = NULLVP; + } else if (error == ENOENT) { + if (dvp->v_iflag & VI_DOOMED) + return (ENOENT); + /* + * We only accept a negative hit in the cache if the + * modification time of the parent directory matches + * our cached copy. Otherwise, we discard all of the + * negative cache entries for this directory. We also + * only trust -ve cache entries for less than + * nm_negative_namecache_timeout seconds. + */ + if ((u_int)(ticks - np->n_dmtime_ticks) < + (nmp->nm_negnametimeo * hz) && + VOP_GETATTR(dvp, &vattr, cnp->cn_cred) == 0 && + vattr.va_mtime.tv_sec == np->n_dmtime) { + NFSINCRGLOBAL(newnfsstats.lookupcache_hits); + return (ENOENT); + } + cache_purge_negative(dvp); + mtx_lock(&np->n_mtx); + np->n_dmtime = 0; + mtx_unlock(&np->n_mtx); } + + /* + * Cache the modification time of the parent directory in case + * the lookup fails and results in adding the first negative + * name cache entry for the directory. Since this is reading + * a single time_t, don't bother with locking. The + * modification time may be a bit stale, but it must be read + * before performing the lookup RPC to prevent a race where + * another lookup updates the timestamp on the directory after + * the lookup RPC has been performed on the server but before + * n_dmtime is set at the end of this function. + */ + dmtime = np->n_vattr.na_mtime.tv_sec; error = 0; newvp = NULLVP; NFSINCRGLOBAL(newnfsstats.lookupcache_misses); @@ -1067,29 +1085,60 @@ nfs_lookup(struct vop_lookup_args *ap) if (dattrflag) (void) nfscl_loadattrcache(&dvp, &dnfsva, NULL, NULL, 0, 1); if (error) { - if (newnfs_neglookup_enable != 0 && - error == ENOENT && (cnp->cn_flags & MAKEENTRY) && - cnp->cn_nameiop != CREATE) { - if (np->n_dmtime == 0) - np->n_dmtime = np->n_vattr.na_mtime.tv_sec; - cache_enter(dvp, NULL, cnp); - } if (newvp != NULLVP) { vput(newvp); *vpp = NULLVP; } - if ((cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME) && - (flags & ISLASTCN) && error == ENOENT) { - if (mp->mnt_flag & MNT_RDONLY) - error = EROFS; - else - error = EJUSTRETURN; + + if (error != ENOENT) { + if (NFS_ISV4(dvp)) + error = nfscl_maperr(td, error, (uid_t)0, + (gid_t)0); + return (error); } - if (cnp->cn_nameiop != LOOKUP && (flags & ISLASTCN)) + + /* The requested file was not found. */ + if ((cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME) && + (flags & ISLASTCN)) { + /* + * XXX: UFS does a full VOP_ACCESS(dvp, + * VWRITE) here instead of just checking + * MNT_RDONLY. + */ + if (mp->mnt_flag & MNT_RDONLY) + return (EROFS); cnp->cn_flags |= SAVENAME; - if (NFS_ISV4(dvp)) - error = nfscl_maperr(td, error, (uid_t)0, (gid_t)0); - return (error); + return (EJUSTRETURN); + } + + if ((cnp->cn_flags & MAKEENTRY) && cnp->cn_nameiop != CREATE) { + /* + * Maintain n_dmtime as the modification time + * of the parent directory when the oldest -ve + * name cache entry for this directory was + * added. If a -ve cache entry has already + * been added with a newer modification time + * by a concurrent lookup, then don't bother + * adding a cache entry. The modification + * time of the directory might have changed + * due to the file this lookup failed to find + * being created. In that case a subsequent + * lookup would incorrectly use the entry + * added here instead of doing an extra + * lookup. + */ + mtx_lock(&np->n_mtx); + if (np->n_dmtime <= dmtime) { + if (np->n_dmtime == 0) { + np->n_dmtime = dmtime; + np->n_dmtime_ticks = ticks; + } + mtx_unlock(&np->n_mtx); + cache_enter(dvp, NULL, cnp); + } else + mtx_unlock(&np->n_mtx); + } + return (ENOENT); } /* @@ -1365,7 +1414,30 @@ nfs_mknod(struct vop_mknod_args *ap) return (nfs_mknodrpc(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap)); } -static u_long create_verf; +static struct mtx nfs_cverf_mtx; +MTX_SYSINIT(nfs_cverf_mtx, &nfs_cverf_mtx, "NFS create verifier mutex", + MTX_DEF); + +static nfsquad_t +nfs_get_cverf(void) +{ + static nfsquad_t cverf; + nfsquad_t ret; + static int cverf_initialized = 0; + + mtx_lock(&nfs_cverf_mtx); + if (cverf_initialized == 0) { + cverf.lval[0] = arc4random(); + cverf.lval[1] = arc4random(); + cverf_initialized = 1; + } else + cverf.qval++; + ret = cverf; + mtx_unlock(&nfs_cverf_mtx); + + return (ret); +} + /* * nfs file create call */ @@ -1405,19 +1477,7 @@ again: } mtx_unlock(&dnp->n_mtx); -#ifdef INET - CURVNET_SET(CRED_TO_VNET(cnp->cn_cred)); - IN_IFADDR_RLOCK(); - if (!TAILQ_EMPTY(&V_in_ifaddrhead)) - cverf.lval[0] = IA_SIN(TAILQ_FIRST(&V_in_ifaddrhead))->sin_addr.s_addr; - else -#endif - cverf.lval[0] = create_verf; -#ifdef INET - IN_IFADDR_RUNLOCK(); - CURVNET_RESTORE(); -#endif - cverf.lval[1] = ++create_verf; + cverf = nfs_get_cverf(); error = nfsrpc_create(dvp, cnp->cn_nameptr, cnp->cn_namelen, vap, cverf, fmode, cnp->cn_cred, cnp->cn_thread, &dnfsva, &nfsva, &nfhp, &attrflag, &dattrflag, NULL); @@ -1829,7 +1889,7 @@ nfs_link(struct vop_link_args *ap) * but if negative caching is enabled, then the system * must care about lookup caching hit rate, so... */ - if (newnfs_neglookup_enable != 0 && + if (VFSTONFS(vp->v_mount)->nm_negnametimeo != 0 && (cnp->cn_flags & MAKEENTRY)) cache_enter(tdvp, vp, cnp); if (error && NFS_ISV4(vp)) @@ -1893,7 +1953,7 @@ nfs_symlink(struct vop_symlink_args *ap) * but if negative caching is enabled, then the system * must care about lookup caching hit rate, so... */ - if (newnfs_neglookup_enable != 0 && + if (VFSTONFS(dvp->v_mount)->nm_negnametimeo != 0 && (cnp->cn_flags & MAKEENTRY)) cache_enter(dvp, newvp, cnp); *ap->a_vpp = newvp; @@ -1973,7 +2033,7 @@ nfs_mkdir(struct vop_mkdir_args *ap) * but if negative caching is enabled, then the system * must care about lookup caching hit rate, so... */ - if (newnfs_neglookup_enable != 0 && + if (VFSTONFS(dvp->v_mount)->nm_negnametimeo != 0 && (cnp->cn_flags & MAKEENTRY)) cache_enter(dvp, newvp, cnp); *ap->a_vpp = newvp; @@ -2708,9 +2768,9 @@ loop: mtx_lock(&np->n_mtx); while (np->n_directio_asyncwr > 0) { np->n_flag |= NFSYNCWAIT; - error = ncl_msleep(td, (caddr_t)&np->n_directio_asyncwr, - &np->n_mtx, slpflag | (PRIBIO + 1), - "nfsfsync", 0); + error = newnfs_msleep(td, &np->n_directio_asyncwr, + &np->n_mtx, slpflag | (PRIBIO + 1), + "nfsfsync", 0); if (error) { if (newnfs_sigintr(nmp, td)) { mtx_unlock(&np->n_mtx); @@ -3125,7 +3185,6 @@ nfs_lock1(struct vop_lock1_args *ap) ap->a_line)); } -#ifdef NFS4_ACL_EXTATTR_NAME static int nfs_getacl(struct vop_getacl_args *ap) { @@ -3157,5 +3216,3 @@ nfs_setacl(struct vop_setacl_args *ap) } return (error); } - -#endif /* NFS4_ACL_EXTATTR_NAME */ diff --git a/sys/fs/nfsclient/nfsmount.h b/sys/fs/nfsclient/nfsmount.h index acf438e1c227..9fd93311e683 100644 --- a/sys/fs/nfsclient/nfsmount.h +++ b/sys/fs/nfsclient/nfsmount.h @@ -69,10 +69,9 @@ struct nfsmount { u_int64_t nm_maxfilesize; /* maximum file size */ int nm_tprintf_initial_delay; /* initial delay */ int nm_tprintf_delay; /* interval for messages */ + int nm_negnametimeo; /* timeout for -ve entries (sec) */ /* Newnfs additions */ - int nm_iothreadcnt; - struct proc *nm_iodwant[NFS_MAXRAHEAD]; struct nfsclclient *nm_clp; uid_t nm_uid; /* Uid for SetClientID etc. */ u_int64_t nm_clval; /* identifies which clientid */ @@ -101,6 +100,10 @@ struct nfsmount { */ #define VFSTONFS(mp) ((struct nfsmount *)((mp)->mnt_data)) +#ifndef NFS_DEFAULT_NEGNAMETIMEO +#define NFS_DEFAULT_NEGNAMETIMEO 60 +#endif + #endif /* _KERNEL */ #endif /* _NFSCLIENT_NFSMOUNT_H_ */ diff --git a/sys/fs/nfsclient/nfsnode.h b/sys/fs/nfsclient/nfsnode.h index c0610c96cff5..3a5731a3bf1d 100644 --- a/sys/fs/nfsclient/nfsnode.h +++ b/sys/fs/nfsclient/nfsnode.h @@ -108,6 +108,7 @@ struct nfsnode { struct timespec n_mtime; /* Prev modify time. */ time_t n_ctime; /* Prev create time. */ time_t n_dmtime; /* Prev dir modify time. */ + int n_dmtime_ticks; /* Tick of -ve cache entry */ time_t n_expiry; /* Lease expiry time */ struct nfsfh *n_fhp; /* NFS File Handle */ struct vnode *n_vnode; /* associated vnode */ diff --git a/sys/fs/nfsserver/nfs_nfsdcache.c b/sys/fs/nfsserver/nfs_nfsdcache.c index a83510e73cc1..b91229f36773 100644 --- a/sys/fs/nfsserver/nfs_nfsdcache.c +++ b/sys/fs/nfsserver/nfs_nfsdcache.c @@ -386,9 +386,9 @@ loop: newrp->rc_inet = saddr->sin_addr.s_addr; else if (saddr->sin_family == AF_INET6) { saddr6 = (struct sockaddr_in6 *)saddr; - NFSBCOPY((caddr_t)&saddr6->sin6_addr,(caddr_t)&newrp->rc_inet6, - sizeof (struct in6_addr)); - rp->rc_flag |= RC_INETIPV6; + NFSBCOPY((caddr_t)&saddr6->sin6_addr, (caddr_t)&newrp->rc_inet6, + sizeof (struct in6_addr)); + newrp->rc_flag |= RC_INETIPV6; } LIST_INSERT_HEAD(hp, newrp, rc_hash); TAILQ_INSERT_TAIL(&nfsrvudplru, newrp, rc_lru); @@ -522,8 +522,9 @@ nfsrvd_sentcache(struct nfsrvcache *rp, struct socket *so, int err) if (!(rp->rc_flag & RC_LOCKED)) panic("nfsrvd_sentcache not locked"); if (!err) { - if (so->so_proto->pr_domain->dom_family != AF_INET || - so->so_proto->pr_protocol != IPPROTO_TCP) + if ((so->so_proto->pr_domain->dom_family != AF_INET && + so->so_proto->pr_domain->dom_family != AF_INET6) || + so->so_proto->pr_protocol != IPPROTO_TCP) panic("nfs sent cache"); if (nfsrv_getsockseqnum(so, &rp->rc_tcpseq)) rp->rc_flag |= RC_TCPSEQ; diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c index 0cebc21ce7b0..3b7f8d0a1dfa 100644 --- a/sys/fs/nfsserver/nfs_nfsdport.c +++ b/sys/fs/nfsserver/nfs_nfsdport.c @@ -131,32 +131,20 @@ nfsvno_getfh(struct vnode *vp, fhandle_t *fhp, struct thread *p) /* * Perform access checking for vnodes obtained from file handles that would * refer to files already opened by a Unix client. You cannot just use - * vn_writechk() and VOP_ACCESS() for two reasons. - * 1 - You must check for exported rdonly as well as MNT_RDONLY for the write case + * vn_writechk() and VOP_ACCESSX() for two reasons. + * 1 - You must check for exported rdonly as well as MNT_RDONLY for the write + * case. * 2 - The owner is to be given access irrespective of mode bits for some * operations, so that processes that chmod after opening a file don't * break. */ int -nfsvno_accchk(struct vnode *vp, u_int32_t accessbits, struct ucred *cred, - struct nfsexstuff *exp, struct thread *p, int override, int vpislocked) +nfsvno_accchk(struct vnode *vp, accmode_t accmode, struct ucred *cred, + struct nfsexstuff *exp, struct thread *p, int override, int vpislocked, + u_int32_t *supportedtypep) { struct vattr vattr; int error = 0, getret = 0; - accmode_t accmode; - - /* - * Convert accessbits to Vxxx flags. - */ - if (accessbits & (NFSV4ACE_WRITEDATA | NFSV4ACE_APPENDDATA | - NFSV4ACE_ADDFILE | NFSV4ACE_ADDSUBDIRECTORY | - NFSV4ACE_DELETECHILD | NFSV4ACE_WRITEATTRIBUTES | - NFSV4ACE_DELETE | NFSV4ACE_WRITEACL | NFSV4ACE_WRITEOWNER)) - accmode = VWRITE; - else if (accessbits & (NFSV4ACE_EXECUTE | NFSV4ACE_SEARCH)) - accmode = VEXEC; - else - accmode = VREAD; if (accmode & VWRITE) { /* Just vn_writechk() changed to check rdonly */ @@ -166,7 +154,7 @@ nfsvno_accchk(struct vnode *vp, u_int32_t accessbits, struct ucred *cred, * device resident on the file system. */ if (NFSVNO_EXRDONLY(exp) || - (vp->v_mount->mnt_flag & MNT_RDONLY)) { + (vp->v_mount->mnt_flag & MNT_RDONLY)) { switch (vp->v_type) { case VREG: case VDIR: @@ -187,22 +175,26 @@ nfsvno_accchk(struct vnode *vp, u_int32_t accessbits, struct ucred *cred, if (vpislocked == 0) NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p); -#if defined(NFS4_ACL_EXTATTR_NAME) && defined(notyet) - /* - * This function should be called once FFS has NFSv4 ACL support - * in it. - */ /* * Should the override still be applied when ACLs are enabled? */ - if (nfsrv_useacl != 0 && NFSHASNFS4ACL(vp->v_mount)) - error = nfsrv_aclaccess(vp, accmode, accessbits, cred, p); - else -#endif - if (accessbits == NFSV4ACE_READATTRIBUTES) - error = 0; - else - error = VOP_ACCESS(vp, accmode, cred, p); + error = VOP_ACCESSX(vp, accmode, cred, p); + if (error != 0 && (accmode & (VDELETE | VDELETE_CHILD))) { + /* + * Try again with VEXPLICIT_DENY, to see if the test for + * deletion is supported. + */ + error = VOP_ACCESSX(vp, accmode | VEXPLICIT_DENY, cred, p); + if (error == 0) { + if (vp->v_type == VDIR) { + accmode &= ~(VDELETE | VDELETE_CHILD); + accmode |= VWRITE; + error = VOP_ACCESSX(vp, accmode, cred, p); + } else if (supportedtypep != NULL) { + *supportedtypep &= ~NFSACCESS_DELETE; + } + } + } /* * Allow certain operations for the owner (reads and writes @@ -720,7 +712,7 @@ nfsvno_write(struct vnode *vp, off_t off, int retlen, int cnt, int stable, int nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp, struct vnode **vpp, struct nfsvattr *nvap, int *exclusive_flagp, - u_char *cverf, NFSDEV_T rdev, struct thread *p, struct nfsexstuff *exp) + int32_t *cverf, NFSDEV_T rdev, struct thread *p, struct nfsexstuff *exp) { u_quad_t tempsize; int error; @@ -737,8 +729,8 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp, if (*exclusive_flagp) { *exclusive_flagp = 0; NFSVNO_ATTRINIT(nvap); - NFSBCOPY(cverf,(caddr_t)&nvap->na_atime, - NFSX_VERF); + nvap->na_atime.tv_sec = cverf[0]; + nvap->na_atime.tv_nsec = cverf[1]; error = VOP_SETATTR(ndp->ni_vp, &nvap->na_vattr, nd->nd_cred); } @@ -790,9 +782,9 @@ nfsvno_createsub(struct nfsrv_descript *nd, struct nameidata *ndp, else vput(ndp->ni_dvp); if (!error && nvap->na_size != VNOVAL) { - error = nfsvno_accchk(*vpp, NFSV4ACE_ADDFILE, + error = nfsvno_accchk(*vpp, VWRITE, nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE, - NFSACCCHK_VPISLOCKED); + NFSACCCHK_VPISLOCKED, NULL); if (!error) { tempsize = nvap->na_size; NFSVNO_ATTRINIT(nvap); @@ -1285,7 +1277,7 @@ nfsvno_statfs(struct vnode *vp, struct statfs *sf) void nfsvno_open(struct nfsrv_descript *nd, struct nameidata *ndp, nfsquad_t clientid, nfsv4stateid_t *stateidp, struct nfsstate *stp, - int *exclusive_flagp, struct nfsvattr *nvap, u_char *cverf, int create, + int *exclusive_flagp, struct nfsvattr *nvap, int32_t *cverf, int create, NFSACL_T *aclp, nfsattrbit_t *attrbitp, struct ucred *cred, struct thread *p, struct nfsexstuff *exp, struct vnode **vpp) { @@ -1307,9 +1299,8 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidata *ndp, if (*exclusive_flagp) { *exclusive_flagp = 0; NFSVNO_ATTRINIT(nvap); - NFSBCOPY(cverf, - (caddr_t)&nvap->na_atime, - NFSX_VERF); + nvap->na_atime.tv_sec = cverf[0]; + nvap->na_atime.tv_nsec = cverf[1]; nd->nd_repstat = VOP_SETATTR(ndp->ni_vp, &nvap->na_vattr, cred); } else { @@ -1335,8 +1326,9 @@ nfsvno_open(struct nfsrv_descript *nd, struct nameidata *ndp, else NFSVNO_EXINIT(&nes); nd->nd_repstat = nfsvno_accchk(vp, - NFSV4ACE_ADDFILE, cred, &nes, p, - NFSACCCHK_NOOVERRIDE,NFSACCCHK_VPISLOCKED); + VWRITE, cred, &nes, p, + NFSACCCHK_NOOVERRIDE, + NFSACCCHK_VPISLOCKED, NULL); nd->nd_repstat = nfsrv_opencheck(clientid, stateidp, stp, vp, nd, p, nd->nd_repstat); if (!nd->nd_repstat) { @@ -1482,9 +1474,9 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram, #endif } if (!nd->nd_repstat) - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_SEARCH, + nd->nd_repstat = nfsvno_accchk(vp, VEXEC, nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE, - NFSACCCHK_VPISLOCKED); + NFSACCCHK_VPISLOCKED, NULL); if (nd->nd_repstat) { vput(vp); if (nd->nd_flag & ND_NFSV3) @@ -1676,7 +1668,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram, struct nfsvattr nva, at, *nvap = &nva; struct mbuf *mb0, *mb1; struct nfsreferral *refp; - int nlen, r, error = 0, getret = 1, vgetret; + int nlen, r, error = 0, getret = 1, usevget = 1; int siz, cnt, fullsiz, eofflag, ncookies, entrycnt; caddr_t bpos0, bpos1; u_int64_t off, toff, verf; @@ -1684,6 +1676,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram, nfsattrbit_t attrbits, rderrbits, savbits; struct uio io; struct iovec iv; + struct componentname cn; if (nd->nd_repstat) { nfsrv_postopattr(nd, getret, &at); @@ -1752,9 +1745,9 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram, if (!nd->nd_repstat && cnt == 0) nd->nd_repstat = NFSERR_TOOSMALL; if (!nd->nd_repstat) - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_SEARCH, + nd->nd_repstat = nfsvno_accchk(vp, VEXEC, nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE, - NFSACCCHK_VPISLOCKED); + NFSACCCHK_VPISLOCKED, NULL); if (nd->nd_repstat) { vput(vp); if (nd->nd_flag & ND_NFSV3) @@ -1762,8 +1755,6 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram, return (0); } - NFSVOPUNLOCK(vp, 0, p); - MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK); again: eofflag = 0; @@ -1781,10 +1772,8 @@ again: io.uio_segflg = UIO_SYSSPACE; io.uio_rw = UIO_READ; io.uio_td = NULL; - NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p); nd->nd_repstat = VOP_READDIR(vp, &io, nd->nd_cred, &eofflag, &ncookies, &cookies); - NFSVOPUNLOCK(vp, 0, p); off = (u_int64_t)io.uio_offset; if (io.uio_resid) siz -= io.uio_resid; @@ -1796,7 +1785,7 @@ again: if (!nd->nd_repstat) nd->nd_repstat = getret; if (nd->nd_repstat) { - vrele(vp); + vput(vp); if (cookies) free((caddr_t)cookies, M_TEMP); free((caddr_t)rbuf, M_TEMP); @@ -1809,7 +1798,7 @@ again: * rpc reply */ if (siz == 0) { - vrele(vp); + vput(vp); if (nd->nd_flag & ND_NFSV3) nfsrv_postopattr(nd, getret, &at); NFSM_BUILD(tl, u_int32_t *, 4 * NFSX_UNSIGNED); @@ -1854,33 +1843,7 @@ again: toff = off; goto again; } - - /* - * Probe one of the directory entries to see if the filesystem - * supports VGET for NFSv3. For NFSv4, it will return an - * error later, if attributes are required. - * (To be honest, most if not all NFSv4 clients will require - * attributes, but??) - */ - if ((nd->nd_flag & ND_NFSV3)) { - vgetret = VFS_VGET(vp->v_mount, dp->d_fileno, LK_EXCLUSIVE, - &nvp); - if (vgetret != 0) { - if (vgetret == EOPNOTSUPP) - nd->nd_repstat = NFSERR_NOTSUPP; - else - nd->nd_repstat = NFSERR_SERVERFAULT; - vrele(vp); - if (cookies) - free((caddr_t)cookies, M_TEMP); - free((caddr_t)rbuf, M_TEMP); - nfsrv_postopattr(nd, getret, &at); - return (0); - } - if (!vgetret) - vput(nvp); - nvp = NULL; - } + NFSVOPUNLOCK(vp, 0, p); /* * Save this position, in case there is an error before one entry @@ -1938,9 +1901,41 @@ again: if (nd->nd_flag & ND_NFSV4) refp = nfsv4root_getreferral(NULL, vp, dp->d_fileno); - if (refp == NULL) - r = VFS_VGET(vp->v_mount, dp->d_fileno, - LK_EXCLUSIVE, &nvp); + if (refp == NULL) { + if (usevget) + r = VFS_VGET(vp->v_mount, + dp->d_fileno, LK_EXCLUSIVE, + &nvp); + else + r = EOPNOTSUPP; + if (r == EOPNOTSUPP) { + if (usevget) { + usevget = 0; + cn.cn_nameiop = LOOKUP; + cn.cn_lkflags = + LK_EXCLUSIVE | + LK_RETRY; + cn.cn_cred = + nd->nd_cred; + cn.cn_thread = p; + } + cn.cn_nameptr = dp->d_name; + cn.cn_namelen = nlen; + cn.cn_flags = ISLASTCN | + NOFOLLOW | LOCKLEAF | + MPSAFE; + if (nlen == 2 && + dp->d_name[0] == '.' && + dp->d_name[1] == '.') + cn.cn_flags |= + ISDOTDOT; + if (!VOP_ISLOCKED(vp)) + vn_lock(vp, + LK_EXCLUSIVE | + LK_RETRY); + r = VOP_LOOKUP(vp, &nvp, &cn); + } + } if (!r) { if (refp == NULL && ((nd->nd_flag & ND_NFSV3) || @@ -2019,7 +2014,10 @@ again: cookiep++; ncookies--; } - vrele(vp); + if (!usevget && VOP_ISLOCKED(vp)) + vput(vp); + else + vrele(vp); /* * If dirlen > cnt, we must strip off the last entry. If that diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c index 668c7fb585bd..e56610b660e8 100644 --- a/sys/fs/nfsserver/nfs_nfsdserv.c +++ b/sys/fs/nfsserver/nfs_nfsdserv.c @@ -88,6 +88,7 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram, int getret, error = 0; struct nfsvattr nva; u_int32_t testmode, nfsmode, supported = 0; + accmode_t deletebit; if (nd->nd_repstat) { nfsrv_postopattr(nd, 1, &nva); @@ -105,26 +106,30 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram, } if (nfsmode & NFSACCESS_READ) { supported |= NFSACCESS_READ; - if (nfsvno_accchk(vp, NFSV4ACE_READDATA, nd->nd_cred, exp, p, - NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED)) + if (nfsvno_accchk(vp, VREAD, nd->nd_cred, exp, p, + NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED, &supported)) nfsmode &= ~NFSACCESS_READ; } if (nfsmode & NFSACCESS_MODIFY) { supported |= NFSACCESS_MODIFY; - if (nfsvno_accchk(vp, NFSV4ACE_WRITEDATA, nd->nd_cred, exp, p, - NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED)) + if (nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp, p, + NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED, &supported)) nfsmode &= ~NFSACCESS_MODIFY; } if (nfsmode & NFSACCESS_EXTEND) { supported |= NFSACCESS_EXTEND; - if (nfsvno_accchk(vp, NFSV4ACE_APPENDDATA, nd->nd_cred, exp, p, - NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED)) + if (nfsvno_accchk(vp, VWRITE | VAPPEND, nd->nd_cred, exp, p, + NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED, &supported)) nfsmode &= ~NFSACCESS_EXTEND; } if (nfsmode & NFSACCESS_DELETE) { supported |= NFSACCESS_DELETE; - if (nfsvno_accchk(vp, NFSV4ACE_DELETE, nd->nd_cred, exp, p, - NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED)) + if (vp->v_type == VDIR) + deletebit = VDELETE_CHILD; + else + deletebit = VDELETE; + if (nfsvno_accchk(vp, deletebit, nd->nd_cred, exp, p, + NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED, &supported)) nfsmode &= ~NFSACCESS_DELETE; } if (vnode_vtype(vp) == VDIR) @@ -133,8 +138,8 @@ nfsrvd_access(struct nfsrv_descript *nd, __unused int isdgram, testmode = NFSACCESS_EXECUTE; if (nfsmode & testmode) { supported |= (nfsmode & testmode); - if (nfsvno_accchk(vp, NFSV4ACE_EXECUTE, nd->nd_cred, exp, p, - NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED)) + if (nfsvno_accchk(vp, VEXEC, nd->nd_cred, exp, p, + NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED, &supported)) nfsmode &= ~testmode; } nfsmode &= supported; @@ -189,9 +194,9 @@ nfsrvd_getattr(struct nfsrv_descript *nd, int isdgram, } if (!nd->nd_repstat) nd->nd_repstat = nfsvno_accchk(vp, - NFSV4ACE_READATTRIBUTES, - nd->nd_cred, exp, p, - NFSACCCHK_NOOVERRIDE, NFSACCCHK_VPISLOCKED); + VREAD_ATTRIBUTES, + nd->nd_cred, exp, p, NFSACCCHK_NOOVERRIDE, + NFSACCCHK_VPISLOCKED, NULL); } if (!nd->nd_repstat) nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p); @@ -291,8 +296,9 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram, else if (nva2.na_uid != nd->nd_cred->cr_uid || NFSVNO_EXSTRICTACCESS(exp)) nd->nd_repstat = nfsvno_accchk(vp, - NFSV4ACE_WRITEDATA, nd->nd_cred, exp, p, - NFSACCCHK_NOOVERRIDE,NFSACCCHK_VPISLOCKED); + VWRITE, nd->nd_cred, exp, p, + NFSACCCHK_NOOVERRIDE, + NFSACCCHK_VPISLOCKED, NULL); } } if (!nd->nd_repstat && (nd->nd_flag & ND_NFSV4)) @@ -612,13 +618,13 @@ nfsrvd_read(struct nfsrv_descript *nd, __unused int isdgram, if (!nd->nd_repstat && (nva.na_uid != nd->nd_cred->cr_uid || NFSVNO_EXSTRICTACCESS(exp))) { - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_READDATA, + nd->nd_repstat = nfsvno_accchk(vp, VREAD, nd->nd_cred, exp, p, - NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED); + NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED, NULL); if (nd->nd_repstat) - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_EXECUTE, - nd->nd_cred, exp, p, - NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED); + nd->nd_repstat = nfsvno_accchk(vp, VEXEC, + nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER, + NFSACCCHK_VPISLOCKED, NULL); } if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid, @@ -788,9 +794,9 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram, if (!nd->nd_repstat && (forat.na_uid != nd->nd_cred->cr_uid || NFSVNO_EXSTRICTACCESS(exp))) - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_WRITEDATA, + nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp, p, - NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED); + NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED, NULL); if ((nd->nd_flag & ND_NFSV4) && !nd->nd_repstat) { nd->nd_repstat = nfsrv_lockctrl(vp, &stp, &lop, NULL, clientid, &stateid, exp, nd, p); @@ -865,11 +871,11 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram, int how = NFSCREATE_UNCHECKED, exclusive_flag = 0; NFSDEV_T rdev = 0; vnode_t vp = NULL, dirp = NULL; - u_char cverf[NFSX_VERF], *cp; fhandle_t fh; char *bufp; u_long *hashp; enum vtype vtyp; + int32_t cverf[2], tverf[2] = { 0, 0 }; if (nd->nd_repstat) { nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft); @@ -920,8 +926,9 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram, goto nfsmout; break; case NFSCREATE_EXCLUSIVE: - NFSM_DISSECT(cp, u_char *, NFSX_VERF); - NFSBCOPY(cp, cverf, NFSX_VERF); + NFSM_DISSECT(tl, u_int32_t *, NFSX_VERF); + cverf[0] = *tl++; + cverf[1] = *tl; exclusive_flag = 1; break; }; @@ -988,6 +995,10 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram, nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p); vput(vp); + if (!nd->nd_repstat) { + tverf[0] = nva.na_atime.tv_sec; + tverf[1] = nva.na_atime.tv_nsec; + } } if (nd->nd_flag & ND_NFSV2) { if (!nd->nd_repstat) { @@ -995,8 +1006,8 @@ nfsrvd_create(struct nfsrv_descript *nd, __unused int isdgram, nfsrv_fillattr(nd, &nva); } } else { - if (exclusive_flag && !nd->nd_repstat && - NFSBCMP(cverf, (caddr_t)&nva.na_atime, NFSX_VERF)) + if (exclusive_flag && !nd->nd_repstat && (cverf[0] != tverf[0] + || cverf[1] != tverf[1])) nd->nd_repstat = EEXIST; diraft_ret = nfsvno_getattr(dirp, &diraft, nd->nd_cred, p); vrele(dirp); @@ -2141,17 +2152,17 @@ nfsrvd_lock(struct nfsrv_descript *nd, __unused int isdgram, } if (!nd->nd_repstat) { if (lflags & NFSLCK_WRITE) { - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_WRITEDATA, + nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER, - NFSACCCHK_VPISLOCKED); + NFSACCCHK_VPISLOCKED, NULL); } else { - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_READDATA, + nd->nd_repstat = nfsvno_accchk(vp, VREAD, nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER, - NFSACCCHK_VPISLOCKED); + NFSACCCHK_VPISLOCKED, NULL); if (nd->nd_repstat) - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_EXECUTE, + nd->nd_repstat = nfsvno_accchk(vp, VEXEC, nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER, - NFSACCCHK_VPISLOCKED); + NFSACCCHK_VPISLOCKED, NULL); } } @@ -2406,7 +2417,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, int error = 0, create, claim, exclusive_flag = 0; u_int32_t rflags = NFSV4OPEN_LOCKTYPEPOSIX, acemask; int how = NFSCREATE_UNCHECKED; - u_char cverf[NFSX_VERF]; + int32_t cverf[2], tverf[2] = { 0, 0 }; vnode_t vp = NULL, dirp = NULL; struct nfsvattr nva, dirfor, diraft; struct nameidata named; @@ -2517,7 +2528,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, break; case NFSCREATE_EXCLUSIVE: NFSM_DISSECT(tl, u_int32_t *, NFSX_VERF); - NFSBCOPY((caddr_t)tl, cverf, NFSX_VERF); + cverf[0] = *tl++; + cverf[1] = *tl; break; default: nd->nd_repstat = NFSERR_BADXDR; @@ -2666,21 +2678,26 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram, nd->nd_repstat = NFSERR_INVAL; } if (!nd->nd_repstat && (stp->ls_flags & NFSLCK_WRITEACCESS)) - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_WRITEDATA, nd->nd_cred, - exp, p, NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED); + nd->nd_repstat = nfsvno_accchk(vp, VWRITE, nd->nd_cred, + exp, p, NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED, NULL); if (!nd->nd_repstat && (stp->ls_flags & NFSLCK_READACCESS)) { - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_READDATA, nd->nd_cred, - exp, p, NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED); + nd->nd_repstat = nfsvno_accchk(vp, VREAD, nd->nd_cred, + exp, p, NFSACCCHK_ALLOWOWNER, NFSACCCHK_VPISLOCKED, NULL); if (nd->nd_repstat) - nd->nd_repstat = nfsvno_accchk(vp, NFSV4ACE_EXECUTE, + nd->nd_repstat = nfsvno_accchk(vp, VEXEC, nd->nd_cred, exp, p, NFSACCCHK_ALLOWOWNER, - NFSACCCHK_VPISLOCKED); + NFSACCCHK_VPISLOCKED, NULL); } - if (!nd->nd_repstat) + if (!nd->nd_repstat) { nd->nd_repstat = nfsvno_getattr(vp, &nva, nd->nd_cred, p); - if (!nd->nd_repstat && exclusive_flag && - NFSBCMP(cverf, (caddr_t)&nva.na_atime, NFSX_VERF)) + if (!nd->nd_repstat) { + tverf[0] = nva.na_atime.tv_sec; + tverf[1] = nva.na_atime.tv_nsec; + } + } + if (!nd->nd_repstat && exclusive_flag && (cverf[0] != tverf[0] || + cverf[1] != tverf[1])) nd->nd_repstat = EEXIST; /* * Do the open locking/delegation stuff. diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c index 77942783155e..3e38cf48e1f1 100644 --- a/sys/fs/nfsserver/nfs_nfsdstate.c +++ b/sys/fs/nfsserver/nfs_nfsdstate.c @@ -33,7 +33,7 @@ __FBSDID("$FreeBSD$"); struct nfsrv_stablefirst nfsrv_stablefirst; int nfsrv_issuedelegs = 0; -int nfsrv_dolocallocks = 1; +int nfsrv_dolocallocks = 0; struct nfsv4lock nfsv4rootfs_lock; extern int newnfs_numnfsd; @@ -1753,7 +1753,7 @@ tryagain: (new_lop->lo_flags == NFSLCK_WRITE || lop->lo_flags == NFSLCK_WRITE) && lckstp != lop->lo_stp && - (lckstp->ls_clp != lop->lo_stp->ls_clp || + (clp != lop->lo_stp->ls_clp || lckstp->ls_ownerlen != lop->lo_stp->ls_ownerlen || NFSBCMP(lckstp->ls_owner, lop->lo_stp->ls_owner, lckstp->ls_ownerlen))) { diff --git a/sys/fs/ntfs/ntfs.h b/sys/fs/ntfs/ntfs.h index 3e88086c408d..4f6431f37152 100644 --- a/sys/fs/ntfs/ntfs.h +++ b/sys/fs/ntfs/ntfs.h @@ -183,6 +183,7 @@ struct attr_indexentry { }; #define NTFS_FILEMAGIC (u_int32_t)(0x454C4946) +#define NTFS_BLOCK_SIZE 512 #define NTFS_FRFLAG_DIR 0x0002 struct filerec { struct fixuphdr fr_fixup; @@ -257,6 +258,7 @@ struct ntfsmount { char ** ntm_u28; /* Unicode to 8 bit */ void * ntm_ic_l2u; /* Local to Unicode (iconv) */ void * ntm_ic_u2l; /* Unicode to Local (iconv) */ + u_int8_t ntm_multiplier; /* NTFS blockno to DEV_BSIZE sectorno */ }; #define ntm_mftcn ntm_bootfile.bf_mftcn diff --git a/sys/fs/ntfs/ntfs_subr.c b/sys/fs/ntfs/ntfs_subr.c index f7157419ea14..a6c3b85fa242 100644 --- a/sys/fs/ntfs/ntfs_subr.c +++ b/sys/fs/ntfs/ntfs_subr.c @@ -278,6 +278,7 @@ ntfs_loadntnode( bn = ntfs_cntobn(ntmp->ntm_mftcn) + ntmp->ntm_bpmftrec * ip->i_number; + bn *= ntmp->ntm_multiplier; error = bread(ntmp->ntm_devvp, bn, ntfs_bntob(ntmp->ntm_bpmftrec), @@ -581,7 +582,7 @@ ntfs_attrtontvattr( memcpy(vap->va_datap, (caddr_t) rap + rap->a_r.a_dataoff, rap->a_r.a_datalen); } - ddprintf((", len: %d", vap->va_datalen)); + ddprintf((", len: %lld", vap->va_datalen)); if (error) free(vap, M_NTFSNTVATTR); @@ -1491,11 +1492,13 @@ ntfs_writentvattr_plain( (u_int32_t) left)); if ((off == 0) && (tocopy == ntfs_cntob(cl))) { - bp = getblk(ntmp->ntm_devvp, ntfs_cntobn(cn), + bp = getblk(ntmp->ntm_devvp, ntfs_cntobn(cn) + * ntmp->ntm_multiplier, ntfs_cntob(cl), 0, 0, 0); clrbuf(bp); } else { - error = bread(ntmp->ntm_devvp, ntfs_cntobn(cn), + error = bread(ntmp->ntm_devvp, ntfs_cntobn(cn) + * ntmp->ntm_multiplier, ntfs_cntob(cl), NOCRED, &bp); if (error) { brelse(bp); @@ -1602,7 +1605,8 @@ ntfs_readntvattr_plain( (u_int32_t) tocopy, (u_int32_t) left)); error = bread(ntmp->ntm_devvp, - ntfs_cntobn(cn), + ntfs_cntobn(cn) + * ntmp->ntm_multiplier, ntfs_cntob(cl), NOCRED, &bp); if (error) { @@ -1878,7 +1882,7 @@ ntfs_procfixups( fhp->fh_magic, magic); return (EINVAL); } - if ((fhp->fh_fnum - 1) * ntmp->ntm_bps != len) { + if ((fhp->fh_fnum - 1) * NTFS_BLOCK_SIZE != len) { printf("ntfs_procfixups: " \ "bad fixups number: %d for %ld bytes block\n", fhp->fh_fnum, (long)len); /* XXX printf kludge */ @@ -1889,7 +1893,7 @@ ntfs_procfixups( return (EINVAL); } fxp = (u_int16_t *) (buf + fhp->fh_foff); - cfxp = (u_int16_t *) (buf + ntmp->ntm_bps - 2); + cfxp = (u_int16_t *) (buf + NTFS_BLOCK_SIZE - 2); fixup = *fxp++; for (i = 1; i < fhp->fh_fnum; i++, fxp++) { if (*cfxp != fixup) { @@ -1897,7 +1901,7 @@ ntfs_procfixups( return (EINVAL); } *cfxp = *fxp; - cfxp = (u_int16_t *) ((caddr_t) cfxp + ntmp->ntm_bps); + cfxp = (u_int16_t *) ((caddr_t) cfxp + NTFS_BLOCK_SIZE); } return (0); } diff --git a/sys/fs/ntfs/ntfs_vfsops.c b/sys/fs/ntfs/ntfs_vfsops.c index 07dc2ddb2f24..ab5eede3f722 100644 --- a/sys/fs/ntfs/ntfs_vfsops.c +++ b/sys/fs/ntfs/ntfs_vfsops.c @@ -316,6 +316,8 @@ ntfs_mountfs(devvp, mp, td) else ntmp->ntm_bpmftrec = (1 << (-cpr)) / ntmp->ntm_bps; } + ntmp->ntm_multiplier = ntmp->ntm_bps / DEV_BSIZE; + dprintf(("ntfs_mountfs(): bps: %d, spc: %d, media: %x, mftrecsz: %d (%d sects)\n", ntmp->ntm_bps,ntmp->ntm_spc,ntmp->ntm_bootfile.bf_media, ntmp->ntm_mftrecsz,ntmp->ntm_bpmftrec)); diff --git a/sys/fs/nwfs/nwfs_node.c b/sys/fs/nwfs/nwfs_node.c index 29ad71c1450e..1e044c66e26f 100644 --- a/sys/fs/nwfs/nwfs_node.c +++ b/sys/fs/nwfs/nwfs_node.c @@ -151,7 +151,7 @@ loop: rescan: if (nwfs_hashlookup(nmp, fid, &np) == 0) { vp = NWTOV(np); - mtx_lock(&vp->v_interlock); + VI_LOCK(vp); sx_xunlock(&nwhashlock); if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, curthread)) goto loop; diff --git a/sys/fs/nwfs/nwfs_vnops.c b/sys/fs/nwfs/nwfs_vnops.c index 7ed5d8522785..e63df804572f 100644 --- a/sys/fs/nwfs/nwfs_vnops.c +++ b/sys/fs/nwfs/nwfs_vnops.c @@ -231,24 +231,24 @@ nwfs_close(ap) if (vp->v_type == VDIR) return 0; /* nothing to do now */ error = 0; - mtx_lock(&vp->v_interlock); + VI_LOCK(vp); if (np->opened == 0) { - mtx_unlock(&vp->v_interlock); + VI_UNLOCK(vp); return 0; } - mtx_unlock(&vp->v_interlock); + VI_UNLOCK(vp); error = nwfs_vinvalbuf(vp, ap->a_td); - mtx_lock(&vp->v_interlock); + VI_LOCK(vp); if (np->opened == 0) { - mtx_unlock(&vp->v_interlock); + VI_UNLOCK(vp); return 0; } if (--np->opened == 0) { - mtx_unlock(&vp->v_interlock); + VI_UNLOCK(vp); error = ncp_close_file(NWFSTOCONN(VTONWFS(vp)), &np->n_fh, ap->a_td, ap->a_cred); } else - mtx_unlock(&vp->v_interlock); + VI_UNLOCK(vp); np->n_atime = 0; return (error); } diff --git a/sys/fs/portalfs/portal_vnops.c b/sys/fs/portalfs/portal_vnops.c index 8d30ebbcc972..64e5afda33a9 100644 --- a/sys/fs/portalfs/portal_vnops.c +++ b/sys/fs/portalfs/portal_vnops.c @@ -246,7 +246,7 @@ portal_open(ap) /* * Create a new socket. */ - error = socreate(AF_UNIX, &so, SOCK_STREAM, 0, ap->a_td->td_ucred, + error = socreate(AF_UNIX, &so, SOCK_STREAM, 0, ap->a_cred, ap->a_td); if (error) goto bad; diff --git a/sys/fs/procfs/procfs_status.c b/sys/fs/procfs/procfs_status.c index 80d739285600..7850504fe30b 100644 --- a/sys/fs/procfs/procfs_status.c +++ b/sys/fs/procfs/procfs_status.c @@ -82,7 +82,7 @@ procfs_doprocstatus(PFS_FILL_ARGS) sid = sess->s_leader ? sess->s_leader->p_pid : 0; /* comm pid ppid pgid sid tty ctty,sldr start ut st wmsg - euid ruid rgid,egid,groups[1 .. NGROUPS] + euid ruid rgid,egid,groups[1 .. ngroups] */ pc = p->p_comm; diff --git a/sys/fs/pseudofs/pseudofs_vnops.c b/sys/fs/pseudofs/pseudofs_vnops.c index 34ca500c985a..5854378336cf 100644 --- a/sys/fs/pseudofs/pseudofs_vnops.c +++ b/sys/fs/pseudofs/pseudofs_vnops.c @@ -637,10 +637,8 @@ pfs_read(struct vop_read_args *va) error = EINVAL; goto ret; } - if (buflen > MAXPHYS + 1) { - error = EIO; - goto ret; - } + if (buflen > MAXPHYS + 1) + buflen = MAXPHYS + 1; sb = sbuf_new(sb, NULL, buflen, 0); if (sb == NULL) { diff --git a/sys/fs/smbfs/smbfs_smb.c b/sys/fs/smbfs/smbfs_smb.c index 7ee93f6a0fec..3a89a9ce7b44 100644 --- a/sys/fs/smbfs/smbfs_smb.c +++ b/sys/fs/smbfs/smbfs_smb.c @@ -139,116 +139,6 @@ smbfs_smb_lock(struct smbnode *np, int op, caddr_t id, return smbfs_smb_lockandx(np, op, (uintptr_t)id, start, end, scred); } -static int -smbfs_smb_qpathinfo(struct smbnode *np, struct smbfattr *fap, - struct smb_cred *scred, short infolevel) -{ - struct smb_share *ssp = np->n_mount->sm_share; - struct smb_vc *vcp = SSTOVC(ssp); - struct smb_t2rq *t2p; - int error, svtz, timesok = 1; - struct mbchain *mbp; - struct mdchain *mdp; - u_int16_t date, time, wattr; - int64_t lint; - u_int32_t size, dattr; - - error = smb_t2_alloc(SSTOCP(ssp), SMB_TRANS2_QUERY_PATH_INFORMATION, - scred, &t2p); - if (error) - return error; - mbp = &t2p->t2_tparam; - mb_init(mbp); - if (!infolevel) { - if (SMB_DIALECT(vcp) < SMB_DIALECT_NTLM0_12) - infolevel = SMB_QUERY_FILE_STANDARD; - else - infolevel = SMB_QUERY_FILE_BASIC_INFO; - } - mb_put_uint16le(mbp, infolevel); - mb_put_uint32le(mbp, 0); - /* mb_put_uint8(mbp, SMB_DT_ASCII); specs are wrong */ - error = smbfs_fullpath(mbp, vcp, np, NULL, 0); - if (error) { - smb_t2_done(t2p); - return error; - } - t2p->t2_maxpcount = 2; - t2p->t2_maxdcount = vcp->vc_txmax; - error = smb_t2_request(t2p); - if (error) { - smb_t2_done(t2p); - if (infolevel == SMB_QUERY_FILE_STANDARD || error != EINVAL) - return error; - return smbfs_smb_qpathinfo(np, fap, scred, - SMB_QUERY_FILE_STANDARD); - } - mdp = &t2p->t2_rdata; - svtz = vcp->vc_sopt.sv_tz; - switch (infolevel) { - case SMB_QUERY_FILE_STANDARD: - timesok = 0; - md_get_uint16le(mdp, NULL); - md_get_uint16le(mdp, NULL); /* creation time */ - md_get_uint16le(mdp, &date); - md_get_uint16le(mdp, &time); /* access time */ - if (date || time) { - timesok++; - smb_dos2unixtime(date, time, 0, svtz, &fap->fa_atime); - } - md_get_uint16le(mdp, &date); - md_get_uint16le(mdp, &time); /* modify time */ - if (date || time) { - timesok++; - smb_dos2unixtime(date, time, 0, svtz, &fap->fa_mtime); - } - md_get_uint32le(mdp, &size); - fap->fa_size = size; - md_get_uint32(mdp, NULL); /* allocation size */ - md_get_uint16le(mdp, &wattr); - fap->fa_attr = wattr; - break; - case SMB_QUERY_FILE_BASIC_INFO: - timesok = 0; - md_get_int64(mdp, NULL); /* creation time */ - md_get_int64le(mdp, &lint); - if (lint) { - timesok++; - smb_time_NT2local(lint, svtz, &fap->fa_atime); - } - md_get_int64le(mdp, &lint); - if (lint) { - timesok++; - smb_time_NT2local(lint, svtz, &fap->fa_mtime); - } - md_get_int64le(mdp, &lint); - if (lint) { - timesok++; - smb_time_NT2local(lint, svtz, &fap->fa_ctime); - } - md_get_uint32le(mdp, &dattr); - fap->fa_attr = dattr; - md_get_uint32(mdp, NULL); - /* XXX could use ALL_INFO to get size */ - break; - default: - SMBERROR("unexpected info level %d\n", infolevel); - error = EINVAL; - } - smb_t2_done(t2p); - /* - * if all times are zero (observed with FAT on NT4SP6) - * then fall back to older info level - */ - if (!timesok) { - if (infolevel != SMB_QUERY_FILE_STANDARD) - return smbfs_smb_qpathinfo(np, fap, scred, - SMB_QUERY_FILE_STANDARD); - error = EINVAL; - } - return error; -} - int smbfs_smb_statfs2(struct smb_share *ssp, struct statfs *sbp, struct smb_cred *scred) diff --git a/sys/fs/smbfs/smbfs_vfsops.c b/sys/fs/smbfs/smbfs_vfsops.c index b762bde99aff..2a328b35a1ca 100644 --- a/sys/fs/smbfs/smbfs_vfsops.c +++ b/sys/fs/smbfs/smbfs_vfsops.c @@ -259,7 +259,7 @@ smbfs_mount(struct mount *mp) VOP_UNLOCK(vp, 0); SMBVDEBUG("root.v_usecount = %d\n", vrefcnt(vp)); -#ifdef DIAGNOSTICS +#ifdef DIAGNOSTIC SMBERROR("mp=%p\n", mp); #endif return error; diff --git a/sys/fs/tmpfs/tmpfs.h b/sys/fs/tmpfs/tmpfs.h index ffd705fe026d..04b1a06cd249 100644 --- a/sys/fs/tmpfs/tmpfs.h +++ b/sys/fs/tmpfs/tmpfs.h @@ -303,10 +303,30 @@ LIST_HEAD(tmpfs_node_list, tmpfs_node); #define TMPFS_NODE_LOCK(node) mtx_lock(&(node)->tn_interlock) #define TMPFS_NODE_UNLOCK(node) mtx_unlock(&(node)->tn_interlock) -#define TMPFS_NODE_MTX(node) (&(node)->tn_interlock) +#define TMPFS_NODE_MTX(node) (&(node)->tn_interlock) + +#ifdef INVARIANTS +#define TMPFS_ASSERT_LOCKED(node) do { \ + MPASS(node != NULL); \ + MPASS(node->tn_vnode != NULL); \ + if (!VOP_ISLOCKED(node->tn_vnode) && \ + !mtx_owned(TMPFS_NODE_MTX(node))) \ + panic("tmpfs: node is not locked: %p", node); \ + } while (0) +#define TMPFS_ASSERT_ELOCKED(node) do { \ + MPASS((node) != NULL); \ + MPASS((node)->tn_vnode != NULL); \ + mtx_assert(TMPFS_NODE_MTX(node), MA_OWNED); \ + ASSERT_VOP_LOCKED((node)->tn_vnode, "tmpfs"); \ + } while (0) +#else +#define TMPFS_ASSERT_LOCKED(node) (void)0 +#define TMPFS_ASSERT_ELOCKED(node) (void)0 +#endif #define TMPFS_VNODE_ALLOCATING 1 #define TMPFS_VNODE_WANT 2 +#define TMPFS_VNODE_DOOMED 4 /* --------------------------------------------------------------------- */ /* @@ -473,10 +493,6 @@ int tmpfs_truncate(struct vnode *, off_t); * Returns information about the number of available memory pages, * including physical and virtual ones. * - * If 'total' is TRUE, the value returned is the total amount of memory - * pages configured for the system (either in use or free). - * If it is FALSE, the value returned is the amount of free memory pages. - * * Remember to remove TMPFS_PAGES_RESERVED from the returned value to avoid * excessive memory usage. * diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c index dad634ea1f7c..b6c5cfe68b24 100644 --- a/sys/fs/tmpfs/tmpfs_subr.c +++ b/sys/fs/tmpfs/tmpfs_subr.c @@ -93,7 +93,7 @@ tmpfs_alloc_node(struct tmpfs_mount *tmp, enum vtype type, MPASS(IFF(type == VLNK, target != NULL)); MPASS(IFF(type == VBLK || type == VCHR, rdev != VNOVAL)); - if (tmp->tm_nodes_inuse > tmp->tm_nodes_max) + if (tmp->tm_nodes_inuse >= tmp->tm_nodes_max) return (ENOSPC); nnode = (struct tmpfs_node *)uma_zalloc_arg( @@ -124,7 +124,9 @@ tmpfs_alloc_node(struct tmpfs_mount *tmp, enum vtype type, nnode->tn_dir.tn_readdir_lastn = 0; nnode->tn_dir.tn_readdir_lastp = NULL; nnode->tn_links++; + TMPFS_NODE_LOCK(nnode->tn_dir.tn_parent); nnode->tn_dir.tn_parent->tn_links++; + TMPFS_NODE_UNLOCK(nnode->tn_dir.tn_parent); break; case VFIFO: @@ -187,6 +189,7 @@ tmpfs_free_node(struct tmpfs_mount *tmp, struct tmpfs_node *node) #ifdef INVARIANTS TMPFS_NODE_LOCK(node); MPASS(node->tn_vnode == NULL); + MPASS((node->tn_vpstate & TMPFS_VNODE_ALLOCATING) == 0); TMPFS_NODE_UNLOCK(node); #endif @@ -312,6 +315,7 @@ tmpfs_alloc_vp(struct mount *mp, struct tmpfs_node *node, int lkflag, loop: TMPFS_NODE_LOCK(node); if ((vp = node->tn_vnode) != NULL) { + MPASS((node->tn_vpstate & TMPFS_VNODE_DOOMED) == 0); VI_LOCK(vp); TMPFS_NODE_UNLOCK(node); vholdl(vp); @@ -330,6 +334,14 @@ loop: goto out; } + if ((node->tn_vpstate & TMPFS_VNODE_DOOMED) || + (node->tn_type == VDIR && node->tn_dir.tn_parent == NULL)) { + TMPFS_NODE_UNLOCK(node); + error = ENOENT; + vp = NULL; + goto out; + } + /* * otherwise lock the vp list while we call getnewvnode * since that can block. @@ -375,6 +387,7 @@ loop: vp->v_op = &tmpfs_fifoop_entries; break; case VDIR: + MPASS(node->tn_dir.tn_parent != NULL); if (node->tn_dir.tn_parent == node) vp->v_vflag |= VV_ROOT; break; @@ -428,10 +441,9 @@ tmpfs_free_vp(struct vnode *vp) node = VP_TO_TMPFS_NODE(vp); - TMPFS_NODE_LOCK(node); + mtx_assert(TMPFS_NODE_MTX(node), MA_OWNED); node->tn_vnode = NULL; vp->v_data = NULL; - TMPFS_NODE_UNLOCK(node); } /* --------------------------------------------------------------------- */ @@ -653,7 +665,18 @@ tmpfs_dir_getdotdotdent(struct tmpfs_node *node, struct uio *uio) TMPFS_VALIDATE_DIR(node); MPASS(uio->uio_offset == TMPFS_DIRCOOKIE_DOTDOT); + /* + * Return ENOENT if the current node is already removed. + */ + TMPFS_ASSERT_LOCKED(node); + if (node->tn_dir.tn_parent == NULL) { + return (ENOENT); + } + + TMPFS_NODE_LOCK(node->tn_dir.tn_parent); dent.d_fileno = node->tn_dir.tn_parent->tn_id; + TMPFS_NODE_UNLOCK(node->tn_dir.tn_parent); + dent.d_type = DT_DIR; dent.d_namlen = 2; dent.d_name[0] = '.'; @@ -883,10 +906,9 @@ tmpfs_reg_resize(struct vnode *vp, off_t newsize) if (zerolen > 0) { m = vm_page_grab(uobj, OFF_TO_IDX(newsize), - VM_ALLOC_NORMAL | VM_ALLOC_RETRY); + VM_ALLOC_NOBUSY | VM_ALLOC_NORMAL | VM_ALLOC_RETRY); pmap_zero_page_area(m, PAGE_SIZE - zerolen, zerolen); - vm_page_wakeup(m); } VM_OBJECT_UNLOCK(uobj); diff --git a/sys/fs/tmpfs/tmpfs_vfsops.c b/sys/fs/tmpfs/tmpfs_vfsops.c index f0ae6be143e5..356be5e30815 100644 --- a/sys/fs/tmpfs/tmpfs_vfsops.c +++ b/sys/fs/tmpfs/tmpfs_vfsops.c @@ -77,62 +77,12 @@ static int tmpfs_statfs(struct mount *, struct statfs *); /* --------------------------------------------------------------------- */ static const char *tmpfs_opts[] = { - "from", "size", "inodes", "uid", "gid", "mode", "export", + "from", "size", "maxfilesize", "inodes", "uid", "gid", "mode", "export", NULL }; /* --------------------------------------------------------------------- */ -#define SWI_MAXMIB 3 - -static u_int -get_swpgtotal(void) -{ - struct xswdev xsd; - char *sname = "vm.swap_info"; - int soid[SWI_MAXMIB], oid[2]; - u_int unswdev, total, dmmax, nswapdev; - size_t mibi, len; - - total = 0; - - len = sizeof(dmmax); - if (kernel_sysctlbyname(curthread, "vm.dmmax", &dmmax, &len, - NULL, 0, NULL, 0) != 0) - return total; - - len = sizeof(nswapdev); - if (kernel_sysctlbyname(curthread, "vm.nswapdev", - &nswapdev, &len, - NULL, 0, NULL, 0) != 0) - return total; - - mibi = (SWI_MAXMIB - 1) * sizeof(int); - oid[0] = 0; - oid[1] = 3; - - if (kernel_sysctl(curthread, oid, 2, - soid, &mibi, (void *)sname, strlen(sname), - NULL, 0) != 0) - return total; - - mibi = (SWI_MAXMIB - 1); - for (unswdev = 0; unswdev < nswapdev; ++unswdev) { - soid[mibi] = unswdev; - len = sizeof(struct xswdev); - if (kernel_sysctl(curthread, - soid, mibi + 1, &xsd, &len, NULL, 0, - NULL, 0) != 0) - return total; - if (len == sizeof(struct xswdev)) - total += (xsd.xsw_nblks - dmmax); - } - - /* Not Reached */ - return total; -} - -/* --------------------------------------------------------------------- */ static int tmpfs_node_ctor(void *mem, int size, void *arg, int flags) { @@ -181,19 +131,19 @@ tmpfs_mount(struct mount *mp) { struct tmpfs_mount *tmp; struct tmpfs_node *root; - size_t pages, mem_size; - ino_t nodes; + size_t pages; + uint32_t nodes; int error; /* Size counters. */ - ino_t nodes_max; - size_t size_max; + u_int nodes_max; + u_quad_t size_max, maxfilesize; /* Root node attributes. */ - uid_t root_uid; - gid_t root_gid; - mode_t root_mode; + uid_t root_uid; + gid_t root_gid; + mode_t root_mode; - struct vattr va; + struct vattr va; if (vfs_filteropt(mp->mnt_optnew, tmpfs_opts)) return (EINVAL); @@ -223,31 +173,35 @@ tmpfs_mount(struct mount *mp) if (mp->mnt_cred->cr_ruid != 0 || vfs_scanopt(mp->mnt_optnew, "mode", "%ho", &root_mode) != 1) root_mode = va.va_mode; - if (vfs_scanopt(mp->mnt_optnew, "inodes", "%d", &nodes_max) != 1) + if (vfs_scanopt(mp->mnt_optnew, "inodes", "%u", &nodes_max) != 1) nodes_max = 0; if (vfs_scanopt(mp->mnt_optnew, "size", "%qu", &size_max) != 1) size_max = 0; + if (vfs_scanopt(mp->mnt_optnew, "maxfilesize", "%qu", + &maxfilesize) != 1) + maxfilesize = 0; /* Do not allow mounts if we do not have enough memory to preserve * the minimum reserved pages. */ - mem_size = cnt.v_free_count + cnt.v_inactive_count + get_swpgtotal(); - mem_size -= mem_size > cnt.v_wire_count ? cnt.v_wire_count : mem_size; - if (mem_size < TMPFS_PAGES_RESERVED) + if (tmpfs_mem_info() < TMPFS_PAGES_RESERVED) return ENOSPC; /* Get the maximum number of memory pages this file system is * allowed to use, based on the maximum size the user passed in * the mount structure. A value of zero is treated as if the * maximum available space was requested. */ - if (size_max < PAGE_SIZE || size_max >= SIZE_MAX) + if (size_max < PAGE_SIZE || size_max > SIZE_MAX - PAGE_SIZE) pages = SIZE_MAX; else pages = howmany(size_max, PAGE_SIZE); MPASS(pages > 0); - if (nodes_max <= 3) - nodes = 3 + pages * PAGE_SIZE / 1024; - else + if (nodes_max <= 3) { + if (pages > UINT32_MAX - 3) + nodes = UINT32_MAX; + else + nodes = pages + 3; + } else nodes = nodes_max; MPASS(nodes >= 3); @@ -258,7 +212,7 @@ tmpfs_mount(struct mount *mp) mtx_init(&tmp->allnode_lock, "tmpfs allnode lock", NULL, MTX_DEF); tmp->tm_nodes_max = nodes; tmp->tm_nodes_inuse = 0; - tmp->tm_maxfilesize = (u_int64_t)(cnt.v_page_count + get_swpgtotal()) * PAGE_SIZE; + tmp->tm_maxfilesize = maxfilesize > 0 ? maxfilesize : UINT64_MAX; LIST_INIT(&tmp->tm_nodes_used); tmp->tm_pages_max = pages; diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c index db8ceeae17be..c17efff9d5f0 100644 --- a/sys/fs/tmpfs/tmpfs_vnops.c +++ b/sys/fs/tmpfs/tmpfs_vnops.c @@ -43,6 +43,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include @@ -85,6 +87,11 @@ tmpfs_lookup(struct vop_cachedlookup_args *v) dnode->tn_dir.tn_parent == dnode, !(cnp->cn_flags & ISDOTDOT))); + TMPFS_ASSERT_LOCKED(dnode); + if (dnode->tn_dir.tn_parent == NULL) { + error = ENOENT; + goto out; + } if (cnp->cn_flags & ISDOTDOT) { int ltype = 0; @@ -428,41 +435,13 @@ tmpfs_setattr(struct vop_setattr_args *v) } /* --------------------------------------------------------------------- */ - static int -tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio) +tmpfs_nocacheread(vm_object_t tobj, vm_pindex_t idx, + vm_offset_t offset, size_t tlen, struct uio *uio) { - vm_pindex_t idx; vm_page_t m; - vm_offset_t offset; - off_t addr; - size_t tlen; int error; - addr = uio->uio_offset; - idx = OFF_TO_IDX(addr); - offset = addr & PAGE_MASK; - tlen = MIN(PAGE_SIZE - offset, len); - - if ((vobj == NULL) || (vobj->resident_page_count == 0)) - goto nocache; - - VM_OBJECT_LOCK(vobj); -lookupvpg: - if (((m = vm_page_lookup(vobj, idx)) != NULL) && - vm_page_is_valid(m, offset, tlen)) { - if (vm_page_sleep_if_busy(m, FALSE, "tmfsmr")) - goto lookupvpg; - vm_page_busy(m); - VM_OBJECT_UNLOCK(vobj); - error = uiomove_fromphys(&m, offset, tlen, uio); - VM_OBJECT_LOCK(vobj); - vm_page_wakeup(m); - VM_OBJECT_UNLOCK(vobj); - return (error); - } - VM_OBJECT_UNLOCK(vobj); -nocache: VM_OBJECT_LOCK(tobj); vm_object_pip_add(tobj, 1); m = vm_page_grab(tobj, idx, VM_ALLOC_WIRED | @@ -488,6 +467,89 @@ out: vm_object_pip_subtract(tobj, 1); VM_OBJECT_UNLOCK(tobj); + return (error); +} + +static __inline int +tmpfs_nocacheread_buf(vm_object_t tobj, vm_pindex_t idx, + vm_offset_t offset, size_t tlen, void *buf) +{ + struct uio uio; + struct iovec iov; + + uio.uio_iovcnt = 1; + uio.uio_iov = &iov; + iov.iov_base = buf; + iov.iov_len = tlen; + + uio.uio_offset = 0; + uio.uio_resid = tlen; + uio.uio_rw = UIO_READ; + uio.uio_segflg = UIO_SYSSPACE; + uio.uio_td = curthread; + + return (tmpfs_nocacheread(tobj, idx, offset, tlen, &uio)); +} + +static int +tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio) +{ + struct sf_buf *sf; + vm_pindex_t idx; + vm_page_t m; + vm_offset_t offset; + off_t addr; + size_t tlen; + char *ma; + int error; + + addr = uio->uio_offset; + idx = OFF_TO_IDX(addr); + offset = addr & PAGE_MASK; + tlen = MIN(PAGE_SIZE - offset, len); + + if ((vobj == NULL) || + (vobj->resident_page_count == 0 && vobj->cache == NULL)) + goto nocache; + + VM_OBJECT_LOCK(vobj); +lookupvpg: + if (((m = vm_page_lookup(vobj, idx)) != NULL) && + vm_page_is_valid(m, offset, tlen)) { + if (vm_page_sleep_if_busy(m, FALSE, "tmfsmr")) + goto lookupvpg; + vm_page_busy(m); + VM_OBJECT_UNLOCK(vobj); + error = uiomove_fromphys(&m, offset, tlen, uio); + VM_OBJECT_LOCK(vobj); + vm_page_wakeup(m); + VM_OBJECT_UNLOCK(vobj); + return (error); + } else if (m != NULL && uio->uio_segflg == UIO_NOCOPY) { + if (vm_page_sleep_if_busy(m, FALSE, "tmfsmr")) + goto lookupvpg; + vm_page_busy(m); + VM_OBJECT_UNLOCK(vobj); + sched_pin(); + sf = sf_buf_alloc(m, SFB_CPUPRIVATE); + ma = (char *)sf_buf_kva(sf); + error = tmpfs_nocacheread_buf(tobj, idx, offset, tlen, + ma + offset); + if (error == 0) { + uio->uio_offset += tlen; + uio->uio_resid -= tlen; + } + sf_buf_free(sf); + sched_unpin(); + VM_OBJECT_LOCK(vobj); + vm_page_wakeup(m); + VM_OBJECT_UNLOCK(vobj); + return (error); + } + VM_OBJECT_UNLOCK(vobj); +nocache: + error = tmpfs_nocacheread(tobj, idx, offset, tlen, uio); + return (error); } @@ -555,7 +617,8 @@ tmpfs_mappedwrite(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *ui offset = addr & PAGE_MASK; tlen = MIN(PAGE_SIZE - offset, len); - if ((vobj == NULL) || (vobj->resident_page_count == 0)) { + if ((vobj == NULL) || + (vobj->resident_page_count == 0 && vobj->cache == NULL)) { vpg = NULL; goto nocache; } @@ -573,6 +636,8 @@ lookupvpg: VM_OBJECT_UNLOCK(vobj); error = uiomove_fromphys(&vpg, offset, tlen, uio); } else { + if (__predict_false(vobj->cache != NULL)) + vm_page_cache_free(vobj, idx, idx + 1); VM_OBJECT_UNLOCK(vobj); vpg = NULL; } @@ -854,6 +919,7 @@ tmpfs_rename(struct vop_rename_args *v) char *newname; int error; struct tmpfs_dirent *de; + struct tmpfs_mount *tmp; struct tmpfs_node *fdnode; struct tmpfs_node *fnode; struct tmpfs_node *tnode; @@ -874,6 +940,7 @@ tmpfs_rename(struct vop_rename_args *v) goto out; } + tmp = VFS_TO_TMPFS(tdvp->v_mount); tdnode = VP_TO_TMPFS_DIR(tdvp); /* If source and target are the same file, there is nothing to do. */ @@ -958,25 +1025,63 @@ tmpfs_rename(struct vop_rename_args *v) * directory being moved. Otherwise, we'd end up * with stale nodes. */ n = tdnode; + /* TMPFS_LOCK garanties that no nodes are freed while + * traversing the list. Nodes can only be marked as + * removed: tn_parent == NULL. */ + TMPFS_LOCK(tmp); + TMPFS_NODE_LOCK(n); while (n != n->tn_dir.tn_parent) { + struct tmpfs_node *parent; + if (n == fnode) { + TMPFS_NODE_UNLOCK(n); + TMPFS_UNLOCK(tmp); error = EINVAL; if (newname != NULL) free(newname, M_TMPFSNAME); goto out_locked; } - n = n->tn_dir.tn_parent; + parent = n->tn_dir.tn_parent; + TMPFS_NODE_UNLOCK(n); + if (parent == NULL) { + n = NULL; + break; + } + TMPFS_NODE_LOCK(parent); + if (parent->tn_dir.tn_parent == NULL) { + TMPFS_NODE_UNLOCK(parent); + n = NULL; + break; + } + n = parent; } + TMPFS_UNLOCK(tmp); + if (n == NULL) { + error = EINVAL; + if (newname != NULL) + free(newname, M_TMPFSNAME); + goto out_locked; + } + TMPFS_NODE_UNLOCK(n); /* Adjust the parent pointer. */ TMPFS_VALIDATE_DIR(fnode); + TMPFS_NODE_LOCK(de->td_node); de->td_node->tn_dir.tn_parent = tdnode; + TMPFS_NODE_UNLOCK(de->td_node); /* As a result of changing the target of the '..' * entry, the link count of the source and target * directories has to be adjusted. */ - fdnode->tn_links--; + TMPFS_NODE_LOCK(tdnode); + TMPFS_ASSERT_LOCKED(tdnode); tdnode->tn_links++; + TMPFS_NODE_UNLOCK(tdnode); + + TMPFS_NODE_LOCK(fdnode); + TMPFS_ASSERT_LOCKED(fdnode); + fdnode->tn_links--; + TMPFS_NODE_UNLOCK(fdnode); } /* Do the move: just remove the entry from the source directory @@ -1103,15 +1208,26 @@ tmpfs_rmdir(struct vop_rmdir_args *v) goto out; } + /* Detach the directory entry from the directory (dnode). */ tmpfs_dir_detach(dvp, de); + /* No vnode should be allocated for this entry from this point */ + TMPFS_NODE_LOCK(node); + TMPFS_ASSERT_ELOCKED(node); node->tn_links--; + node->tn_dir.tn_parent = NULL; node->tn_status |= TMPFS_NODE_ACCESSED | TMPFS_NODE_CHANGED | \ TMPFS_NODE_MODIFIED; - node->tn_dir.tn_parent->tn_links--; - node->tn_dir.tn_parent->tn_status |= TMPFS_NODE_ACCESSED | \ + + TMPFS_NODE_UNLOCK(node); + + TMPFS_NODE_LOCK(dnode); + TMPFS_ASSERT_ELOCKED(dnode); + dnode->tn_links--; + dnode->tn_status |= TMPFS_NODE_ACCESSED | \ TMPFS_NODE_CHANGED | TMPFS_NODE_MODIFIED; + TMPFS_NODE_UNLOCK(dnode); cache_purge(dvp); cache_purge(vp); @@ -1299,13 +1415,21 @@ tmpfs_reclaim(struct vop_reclaim_args *v) vnode_destroy_vobject(vp); cache_purge(vp); + + TMPFS_NODE_LOCK(node); + TMPFS_ASSERT_ELOCKED(node); tmpfs_free_vp(vp); /* If the node referenced by this vnode was deleted by the user, * we must free its associated data structures (now that the vnode * is being reclaimed). */ - if (node->tn_links == 0) + if (node->tn_links == 0 && + (node->tn_vpstate & TMPFS_VNODE_ALLOCATING) == 0) { + node->tn_vpstate = TMPFS_VNODE_DOOMED; + TMPFS_NODE_UNLOCK(node); tmpfs_free_node(tmp, node); + } else + TMPFS_NODE_UNLOCK(node); MPASS(vp->v_data == NULL); return 0; diff --git a/sys/geom/concat/g_concat.c b/sys/geom/concat/g_concat.c index 021c9f56fc00..1f523755c7d6 100644 --- a/sys/geom/concat/g_concat.c +++ b/sys/geom/concat/g_concat.c @@ -347,14 +347,14 @@ static void g_concat_check_and_run(struct g_concat_softc *sc) { struct g_concat_disk *disk; + struct g_provider *pp; u_int no, sectorsize = 0; off_t start; if (g_concat_nvalid(sc) != sc->sc_ndisks) return; - sc->sc_provider = g_new_providerf(sc->sc_geom, "concat/%s", - sc->sc_name); + pp = g_new_providerf(sc->sc_geom, "concat/%s", sc->sc_name); start = 0; for (no = 0; no < sc->sc_ndisks; no++) { disk = &sc->sc_disks[no]; @@ -371,10 +371,13 @@ g_concat_check_and_run(struct g_concat_softc *sc) disk->d_consumer->provider->sectorsize); } } - sc->sc_provider->sectorsize = sectorsize; + pp->sectorsize = sectorsize; /* We have sc->sc_disks[sc->sc_ndisks - 1].d_end in 'start'. */ - sc->sc_provider->mediasize = start; - g_error_provider(sc->sc_provider, 0); + pp->mediasize = start; + pp->stripesize = sc->sc_disks[0].d_consumer->provider->stripesize; + pp->stripeoffset = sc->sc_disks[0].d_consumer->provider->stripeoffset; + sc->sc_provider = pp; + g_error_provider(pp, 0); G_CONCAT_DEBUG(0, "Device %s activated.", sc->sc_name); } @@ -599,6 +602,10 @@ g_concat_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name); g_topology_assert(); + /* Skip providers that are already open for writing. */ + if (pp->acw > 0) + return (NULL); + G_CONCAT_DEBUG(3, "Tasting %s.", pp->name); gp = g_new_geomf(mp, "concat:taste"); diff --git a/sys/geom/eli/g_eli_key.c b/sys/geom/eli/g_eli_key.c index 3f7be95752c2..5b024d787cca 100644 --- a/sys/geom/eli/g_eli_key.c +++ b/sys/geom/eli/g_eli_key.c @@ -120,7 +120,6 @@ g_eli_mkey_decrypt(const struct g_eli_metadata *md, const unsigned char *key, g_eli_crypto_hmac(key, G_ELI_USERKEYLEN, "\x01", 1, enckey, 0); mmkey = md->md_mkeys; - nkey = 0; for (nkey = 0; nkey < G_ELI_MAXMKEYS; nkey++, mmkey += G_ELI_MKEYLEN) { bit = (1 << nkey); if (!(md->md_keys & bit)) diff --git a/sys/geom/gate/g_gate.c b/sys/geom/gate/g_gate.c index 3737ee058689..952e856e279a 100644 --- a/sys/geom/gate/g_gate.c +++ b/sys/geom/gate/g_gate.c @@ -1,7 +1,11 @@ /*- * Copyright (c) 2004-2006 Pawel Jakub Dawidek + * Copyright (c) 2009-2010 The FreeBSD Foundation * All rights reserved. * + * Portions of this software were developed by Pawel Jakub Dawidek + * under sponsorship from the FreeBSD Foundation. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -53,9 +57,14 @@ static MALLOC_DEFINE(M_GATE, "gg_data", "GEOM Gate Data"); SYSCTL_DECL(_kern_geom); SYSCTL_NODE(_kern_geom, OID_AUTO, gate, CTLFLAG_RW, 0, "GEOM_GATE stuff"); -static u_int g_gate_debug = 0; -SYSCTL_UINT(_kern_geom_gate, OID_AUTO, debug, CTLFLAG_RW, &g_gate_debug, 0, +static int g_gate_debug = 0; +TUNABLE_INT("kern.geom.gate.debug", &g_gate_debug); +SYSCTL_INT(_kern_geom_gate, OID_AUTO, debug, CTLFLAG_RW, &g_gate_debug, 0, "Debug level"); +static u_int g_gate_maxunits = 256; +TUNABLE_INT("kern.geom.gate.maxunits", &g_gate_maxunits); +SYSCTL_UINT(_kern_geom_gate, OID_AUTO, maxunits, CTLFLAG_RDTUN, + &g_gate_maxunits, 0, "Maximum number of ggate devices"); struct g_class g_gate_class = { .name = G_GATE_CLASS_NAME, @@ -71,10 +80,9 @@ static struct cdevsw g_gate_cdevsw = { }; -static LIST_HEAD(, g_gate_softc) g_gate_list = - LIST_HEAD_INITIALIZER(&g_gate_list); -static struct mtx g_gate_list_mtx; - +static struct g_gate_softc **g_gate_units; +static u_int g_gate_nunits; +static struct mtx g_gate_units_lock; static int g_gate_destroy(struct g_gate_softc *sc, boolean_t force) @@ -84,13 +92,13 @@ g_gate_destroy(struct g_gate_softc *sc, boolean_t force) struct bio *bp; g_topology_assert(); - mtx_assert(&g_gate_list_mtx, MA_OWNED); + mtx_assert(&g_gate_units_lock, MA_OWNED); pp = sc->sc_provider; if (!force && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) { - mtx_unlock(&g_gate_list_mtx); + mtx_unlock(&g_gate_units_lock); return (EBUSY); } - mtx_unlock(&g_gate_list_mtx); + mtx_unlock(&g_gate_units_lock); mtx_lock(&sc->sc_queue_mtx); if ((sc->sc_flags & G_GATE_FLAG_DESTROY) == 0) sc->sc_flags |= G_GATE_FLAG_DESTROY; @@ -125,14 +133,15 @@ g_gate_destroy(struct g_gate_softc *sc, boolean_t force) } mtx_unlock(&sc->sc_queue_mtx); g_topology_unlock(); - mtx_lock(&g_gate_list_mtx); + mtx_lock(&g_gate_units_lock); /* One reference is ours. */ sc->sc_ref--; - while (sc->sc_ref > 0) { - msleep(&sc->sc_ref, &g_gate_list_mtx, 0, "gg:destroy", 0); - } - LIST_REMOVE(sc, sc_next); - mtx_unlock(&g_gate_list_mtx); + while (sc->sc_ref > 0) + msleep(&sc->sc_ref, &g_gate_units_lock, 0, "gg:destroy", 0); + g_gate_units[sc->sc_unit] = NULL; + KASSERT(g_gate_nunits > 0, ("negative g_gate_nunits?")); + g_gate_nunits--; + mtx_unlock(&g_gate_units_lock); mtx_destroy(&sc->sc_queue_mtx); g_topology_lock(); G_GATE_DEBUG(0, "Device %s destroyed.", gp->name); @@ -196,7 +205,7 @@ g_gate_start(struct bio *bp) if (sc->sc_queue_count > sc->sc_queue_size) { mtx_unlock(&sc->sc_queue_mtx); G_GATE_LOGREQ(1, bp, "Queue full, request canceled."); - g_io_deliver(bp, EIO); + g_io_deliver(bp, ENOMEM); return; } @@ -211,18 +220,29 @@ g_gate_start(struct bio *bp) } static struct g_gate_softc * -g_gate_hold(u_int unit) +g_gate_hold(u_int unit, const char *name) { - struct g_gate_softc *sc; + struct g_gate_softc *sc = NULL; - mtx_lock(&g_gate_list_mtx); - LIST_FOREACH(sc, &g_gate_list, sc_next) { - if (sc->sc_unit == unit) + mtx_lock(&g_gate_units_lock); + if (unit >= 0 && unit < g_gate_maxunits) + sc = g_gate_units[unit]; + else if (unit == G_GATE_NAME_GIVEN) { + KASSERT(name != NULL, ("name is NULL")); + for (unit = 0; unit < g_gate_maxunits; unit++) { + if (g_gate_units[unit] == NULL) + continue; + if (strcmp(name, + g_gate_units[unit]->sc_provider->name) != 0) { + continue; + } + sc = g_gate_units[unit]; break; + } } if (sc != NULL) sc->sc_ref++; - mtx_unlock(&g_gate_list_mtx); + mtx_unlock(&g_gate_units_lock); return (sc); } @@ -231,40 +251,34 @@ g_gate_release(struct g_gate_softc *sc) { g_topology_assert_not(); - mtx_lock(&g_gate_list_mtx); + mtx_lock(&g_gate_units_lock); sc->sc_ref--; KASSERT(sc->sc_ref >= 0, ("Negative sc_ref for %s.", sc->sc_name)); - if (sc->sc_ref == 0 && (sc->sc_flags & G_GATE_FLAG_DESTROY) != 0) { + if (sc->sc_ref == 0 && (sc->sc_flags & G_GATE_FLAG_DESTROY) != 0) wakeup(&sc->sc_ref); - mtx_unlock(&g_gate_list_mtx); - } else { - mtx_unlock(&g_gate_list_mtx); - } + mtx_unlock(&g_gate_units_lock); } static int -g_gate_getunit(int unit) +g_gate_getunit(int unit, int *errorp) { - struct g_gate_softc *sc; - mtx_assert(&g_gate_list_mtx, MA_OWNED); + mtx_assert(&g_gate_units_lock, MA_OWNED); if (unit >= 0) { - LIST_FOREACH(sc, &g_gate_list, sc_next) { - if (sc->sc_unit == unit) - return (-1); - } + if (unit >= g_gate_maxunits) + *errorp = EINVAL; + else if (g_gate_units[unit] == NULL) + return (unit); + else + *errorp = EEXIST; } else { - unit = 0; -once_again: - LIST_FOREACH(sc, &g_gate_list, sc_next) { - if (sc->sc_unit == unit) { - if (++unit > 666) - return (-1); - goto once_again; - } + for (unit = 0; unit < g_gate_maxunits; unit++) { + if (g_gate_units[unit] == NULL) + return (unit); } + *errorp = ENFILE; } - return (unit); + return (-1); } static void @@ -276,7 +290,7 @@ g_gate_guard(void *arg) sc = arg; binuptime(&curtime); - g_gate_hold(sc->sc_unit); + g_gate_hold(sc->sc_unit, NULL); mtx_lock(&sc->sc_queue_mtx); TAILQ_FOREACH_SAFE(bp, &sc->sc_inqueue.queue, bio_queue, bp2) { if (curtime.sec - bp->bio_t0.sec < 5) @@ -311,7 +325,7 @@ g_gate_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, sc = gp->softc; if (sc == NULL || pp != NULL || cp != NULL) return; - g_gate_hold(sc->sc_unit); + g_gate_hold(sc->sc_unit, NULL); if ((sc->sc_flags & G_GATE_FLAG_READONLY) != 0) { sbuf_printf(sb, "%s%s\n", indent, "read-only"); } else if ((sc->sc_flags & G_GATE_FLAG_WRITEONLY) != 0) { @@ -328,6 +342,7 @@ g_gate_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, sbuf_printf(sb, "%s%u\n", indent, sc->sc_queue_size); sbuf_printf(sb, "%s%u\n", indent, sc->sc_ref); + sbuf_printf(sb, "%s%d\n", indent, sc->sc_unit); g_topology_unlock(); g_gate_release(sc); g_topology_lock(); @@ -339,6 +354,8 @@ g_gate_create(struct g_gate_ctl_create *ggio) struct g_gate_softc *sc; struct g_geom *gp; struct g_provider *pp; + char name[NAME_MAX]; + int error = 0, unit; if (ggio->gctl_mediasize == 0) { G_GATE_DEBUG(1, "Invalid media size."); @@ -357,15 +374,22 @@ g_gate_create(struct g_gate_ctl_create *ggio) G_GATE_DEBUG(1, "Invalid flags."); return (EINVAL); } - if (ggio->gctl_unit < -1) { + if (ggio->gctl_unit != G_GATE_UNIT_AUTO && + ggio->gctl_unit != G_GATE_NAME_GIVEN && + ggio->gctl_unit < 0) { G_GATE_DEBUG(1, "Invalid unit number."); return (EINVAL); } + if (ggio->gctl_unit == G_GATE_NAME_GIVEN && + ggio->gctl_name[0] == '\0') { + G_GATE_DEBUG(1, "No device name."); + return (EINVAL); + } sc = malloc(sizeof(*sc), M_GATE, M_WAITOK | M_ZERO); sc->sc_flags = (ggio->gctl_flags & G_GATE_USERFLAGS); strlcpy(sc->sc_info, ggio->gctl_info, sizeof(sc->sc_info)); - sc->sc_seq = 0; + sc->sc_seq = 1; bioq_init(&sc->sc_inqueue); bioq_init(&sc->sc_outqueue); mtx_init(&sc->sc_queue_mtx, "gg:queue", NULL, MTX_DEF); @@ -375,26 +399,44 @@ g_gate_create(struct g_gate_ctl_create *ggio) sc->sc_queue_size = G_GATE_MAX_QUEUE_SIZE; sc->sc_timeout = ggio->gctl_timeout; callout_init(&sc->sc_callout, CALLOUT_MPSAFE); - mtx_lock(&g_gate_list_mtx); - ggio->gctl_unit = g_gate_getunit(ggio->gctl_unit); - if (ggio->gctl_unit == -1) { - mtx_unlock(&g_gate_list_mtx); + mtx_lock(&g_gate_units_lock); + sc->sc_unit = g_gate_getunit(ggio->gctl_unit, &error); + if (sc->sc_unit < 0) { + mtx_unlock(&g_gate_units_lock); mtx_destroy(&sc->sc_queue_mtx); free(sc, M_GATE); - return (EBUSY); + return (error); } - sc->sc_unit = ggio->gctl_unit; - LIST_INSERT_HEAD(&g_gate_list, sc, sc_next); - mtx_unlock(&g_gate_list_mtx); + if (ggio->gctl_unit == G_GATE_NAME_GIVEN) + snprintf(name, sizeof(name), "%s", ggio->gctl_name); + else { + snprintf(name, sizeof(name), "%s%d", G_GATE_PROVIDER_NAME, + sc->sc_unit); + } + /* Check for name collision. */ + for (unit = 0; unit < g_gate_maxunits; unit++) { + if (g_gate_units[unit] == NULL) + continue; + if (strcmp(name, g_gate_units[unit]->sc_provider->name) != 0) + continue; + mtx_unlock(&g_gate_units_lock); + mtx_destroy(&sc->sc_queue_mtx); + free(sc, M_GATE); + return (EEXIST); + } + g_gate_units[sc->sc_unit] = sc; + g_gate_nunits++; + mtx_unlock(&g_gate_units_lock); + + ggio->gctl_unit = sc->sc_unit; g_topology_lock(); - gp = g_new_geomf(&g_gate_class, "%s%d", G_GATE_PROVIDER_NAME, - sc->sc_unit); + gp = g_new_geomf(&g_gate_class, "%s", name); gp->start = g_gate_start; gp->access = g_gate_access; gp->dumpconf = g_gate_dumpconf; gp->softc = sc; - pp = g_new_providerf(gp, "%s%d", G_GATE_PROVIDER_NAME, sc->sc_unit); + pp = g_new_providerf(gp, "%s", name); pp->mediasize = ggio->gctl_mediasize; pp->sectorsize = ggio->gctl_sectorsize; sc->sc_provider = pp; @@ -446,11 +488,11 @@ g_gate_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct threa struct g_gate_ctl_destroy *ggio = (void *)addr; G_GATE_CHECK_VERSION(ggio); - sc = g_gate_hold(ggio->gctl_unit); + sc = g_gate_hold(ggio->gctl_unit, ggio->gctl_name); if (sc == NULL) return (ENXIO); g_topology_lock(); - mtx_lock(&g_gate_list_mtx); + mtx_lock(&g_gate_units_lock); error = g_gate_destroy(sc, ggio->gctl_force); g_topology_unlock(); if (error != 0) @@ -463,7 +505,7 @@ g_gate_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct threa struct bio *tbp, *lbp; G_GATE_CHECK_VERSION(ggio); - sc = g_gate_hold(ggio->gctl_unit); + sc = g_gate_hold(ggio->gctl_unit, ggio->gctl_name); if (sc == NULL) return (ENXIO); lbp = NULL; @@ -491,6 +533,8 @@ g_gate_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct threa break; } } + if (ggio->gctl_unit == G_GATE_NAME_GIVEN) + ggio->gctl_unit = sc->sc_unit; mtx_unlock(&sc->sc_queue_mtx); g_gate_release(sc); return (error); @@ -500,7 +544,7 @@ g_gate_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct threa struct g_gate_ctl_io *ggio = (void *)addr; G_GATE_CHECK_VERSION(ggio); - sc = g_gate_hold(ggio->gctl_unit); + sc = g_gate_hold(ggio->gctl_unit, NULL); if (sc == NULL) return (ENXIO); error = 0; @@ -561,7 +605,7 @@ start_end: struct g_gate_ctl_io *ggio = (void *)addr; G_GATE_CHECK_VERSION(ggio); - sc = g_gate_hold(ggio->gctl_unit); + sc = g_gate_hold(ggio->gctl_unit, NULL); if (sc == NULL) return (ENOENT); error = 0; @@ -631,20 +675,24 @@ g_gate_modevent(module_t mod, int type, void *data) switch (type) { case MOD_LOAD: - mtx_init(&g_gate_list_mtx, "gg_list_lock", NULL, MTX_DEF); + mtx_init(&g_gate_units_lock, "gg_units_lock", NULL, MTX_DEF); + g_gate_units = malloc(g_gate_maxunits * sizeof(g_gate_units[0]), + M_GATE, M_WAITOK | M_ZERO); + g_gate_nunits = 0; g_gate_device(); break; case MOD_UNLOAD: - mtx_lock(&g_gate_list_mtx); - if (!LIST_EMPTY(&g_gate_list)) { - mtx_unlock(&g_gate_list_mtx); + mtx_lock(&g_gate_units_lock); + if (g_gate_nunits > 0) { + mtx_unlock(&g_gate_units_lock); error = EBUSY; break; } - mtx_unlock(&g_gate_list_mtx); - mtx_destroy(&g_gate_list_mtx); + mtx_unlock(&g_gate_units_lock); + mtx_destroy(&g_gate_units_lock); if (status_dev != 0) destroy_dev(status_dev); + free(g_gate_units, M_GATE); break; default: return (EOPNOTSUPP); diff --git a/sys/geom/gate/g_gate.h b/sys/geom/gate/g_gate.h index cd2564d937b2..4f413488e01b 100644 --- a/sys/geom/gate/g_gate.h +++ b/sys/geom/gate/g_gate.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2004-2006 Pawel Jakub Dawidek + * Copyright (c) 2004-2009 Pawel Jakub Dawidek * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -41,7 +41,7 @@ #define G_GATE_MOD_NAME "ggate" #define G_GATE_CTL_NAME "ggctl" -#define G_GATE_VERSION 1 +#define G_GATE_VERSION 2 /* * Maximum number of request that can be stored in @@ -54,6 +54,15 @@ #define G_GATE_FLAG_DESTROY 0x1000 #define G_GATE_USERFLAGS (G_GATE_FLAG_READONLY | G_GATE_FLAG_WRITEONLY) +/* + * Pick unit number automatically in /dev/ggate. + */ +#define G_GATE_UNIT_AUTO (-1) +/* + * Full provider name is given, so don't use ggate. + */ +#define G_GATE_NAME_GIVEN (-2) + #define G_GATE_CMD_CREATE _IOWR('m', 0, struct g_gate_ctl_create) #define G_GATE_CMD_DESTROY _IOWR('m', 1, struct g_gate_ctl_destroy) #define G_GATE_CMD_CANCEL _IOWR('m', 2, struct g_gate_ctl_cancel) @@ -120,20 +129,23 @@ struct g_gate_ctl_create { u_int gctl_flags; u_int gctl_maxcount; u_int gctl_timeout; + char gctl_name[NAME_MAX]; char gctl_info[G_GATE_INFOSIZE]; - int gctl_unit; /* out */ + int gctl_unit; /* in/out */ }; struct g_gate_ctl_destroy { u_int gctl_version; int gctl_unit; int gctl_force; + char gctl_name[NAME_MAX]; }; struct g_gate_ctl_cancel { u_int gctl_version; int gctl_unit; uintptr_t gctl_seq; + char gctl_name[NAME_MAX]; }; struct g_gate_ctl_io { diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index 8b560abe37b6..b2d9d3b94fb5 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -299,8 +299,8 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread } while (length > 0) { chunk = length; - if (chunk > 1024 * cp->provider->sectorsize) - chunk = 1024 * cp->provider->sectorsize; + if (chunk > 65536 * cp->provider->sectorsize) + chunk = 65536 * cp->provider->sectorsize; error = g_delete_data(cp, offset, chunk); length -= chunk; offset += chunk; @@ -323,7 +323,12 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread return (ENOENT); strlcpy(data, pp->name, i); break; - + case DIOCGSTRIPESIZE: + *(off_t *)data = cp->provider->stripesize; + break; + case DIOCGSTRIPEOFFSET: + *(off_t *)data = cp->provider->stripeoffset; + break; default: if (cp->provider->geom->ioctl != NULL) { error = cp->provider->geom->ioctl(cp->provider, cmd, data, fflag, td); diff --git a/sys/geom/geom_dump.c b/sys/geom/geom_dump.c index 1f00db9de171..c804bab2fcec 100644 --- a/sys/geom/geom_dump.c +++ b/sys/geom/geom_dump.c @@ -185,6 +185,10 @@ g_conf_provider(struct sbuf *sb, struct g_provider *pp) sbuf_printf(sb, "\t %jd\n", (intmax_t)pp->mediasize); sbuf_printf(sb, "\t %u\n", pp->sectorsize); + if (pp->stripesize > 0) { + sbuf_printf(sb, "\t %u\n", pp->stripesize); + sbuf_printf(sb, "\t %u\n", pp->stripeoffset); + } if (pp->geom->flags & G_GEOM_WITHER) ; else if (pp->geom->dumpconf != NULL) { diff --git a/sys/geom/geom_io.c b/sys/geom/geom_io.c index c95840a1a3be..0b6525e79e83 100644 --- a/sys/geom/geom_io.c +++ b/sys/geom/geom_io.c @@ -391,6 +391,7 @@ void g_io_request(struct bio *bp, struct g_consumer *cp) { struct g_provider *pp; + int first; KASSERT(cp != NULL, ("NULL cp in g_io_request")); KASSERT(bp != NULL, ("NULL bp in g_io_request")); @@ -463,12 +464,14 @@ g_io_request(struct bio *bp, struct g_consumer *cp) pp->nstart++; cp->nstart++; + first = TAILQ_EMPTY(&g_bio_run_down.bio_queue); TAILQ_INSERT_TAIL(&g_bio_run_down.bio_queue, bp, bio_queue); g_bio_run_down.bio_queue_length++; g_bioq_unlock(&g_bio_run_down); /* Pass it on down. */ - wakeup(&g_wait_down); + if (first) + wakeup(&g_wait_down); } void @@ -476,6 +479,7 @@ g_io_deliver(struct bio *bp, int error) { struct g_consumer *cp; struct g_provider *pp; + int first; KASSERT(bp != NULL, ("NULL bp in g_io_deliver")); pp = bp->bio_to; @@ -536,11 +540,13 @@ g_io_deliver(struct bio *bp, int error) pp->nend++; if (error != ENOMEM) { bp->bio_error = error; + first = TAILQ_EMPTY(&g_bio_run_up.bio_queue); TAILQ_INSERT_TAIL(&g_bio_run_up.bio_queue, bp, bio_queue); bp->bio_flags |= BIO_ONQUEUE; g_bio_run_up.bio_queue_length++; g_bioq_unlock(&g_bio_run_up); - wakeup(&g_wait_up); + if (first) + wakeup(&g_wait_up); return; } g_bioq_unlock(&g_bio_run_up); diff --git a/sys/geom/geom_redboot.c b/sys/geom/geom_redboot.c index 3ece7c15c437..0e1f4d3f9492 100644 --- a/sys/geom/geom_redboot.c +++ b/sys/geom/geom_redboot.c @@ -252,7 +252,8 @@ g_redboot_taste(struct g_class *mp, struct g_provider *pp, int insist) if (!strcmp(pp->geom->class->name, REDBOOT_CLASS_NAME)) return (NULL); /* XXX only taste flash providers */ - if (strncmp(pp->name, "cfi", 3)) + if (strncmp(pp->name, "cfi", 3) && + strncmp(pp->name, "flash/spi", 9)) return (NULL); gp = g_slice_new(mp, REDBOOT_MAXSLICE, pp, &cp, &sc, sizeof(*sc), g_redboot_start); diff --git a/sys/geom/geom_slice.c b/sys/geom/geom_slice.c index 0bdb10c8222f..8a490180a68a 100644 --- a/sys/geom/geom_slice.c +++ b/sys/geom/geom_slice.c @@ -393,10 +393,10 @@ g_slice_config(struct g_geom *gp, u_int idx, int how, off_t offset, off_t length pp = g_new_providerf(gp, sbuf_data(sb)); pp2 = LIST_FIRST(&gp->consumer)->provider; pp->flags = pp2->flags & G_PF_CANDELETE; - if (pp2->stripesize > 0) { - pp->stripesize = pp2->stripesize; - pp->stripeoffset = (pp2->stripeoffset + offset) % pp->stripesize; - } + pp->stripesize = pp2->stripesize; + pp->stripeoffset = pp2->stripeoffset + offset; + if (pp->stripesize > 0) + pp->stripeoffset %= pp->stripesize; if (0 && bootverbose) printf("GEOM: Configure %s, start %jd length %jd end %jd\n", pp->name, (intmax_t)offset, (intmax_t)length, diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c index ae7ee30745a5..9bef0e3638ff 100644 --- a/sys/geom/geom_subr.c +++ b/sys/geom/geom_subr.c @@ -707,6 +707,7 @@ g_attach(struct g_consumer *cp, struct g_provider *pp) g_topology_assert(); G_VALID_CONSUMER(cp); G_VALID_PROVIDER(pp); + g_trace(G_T_TOPOLOGY, "g_attach(%p, %p)", cp, pp); KASSERT(cp->provider == NULL, ("attach but attached")); cp->provider = pp; LIST_INSERT_HEAD(&pp->consumers, cp, consumers); diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c index 0a22dcfabb38..48329aa3656e 100644 --- a/sys/geom/label/g_label.c +++ b/sys/geom/label/g_label.c @@ -34,7 +34,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -271,6 +270,10 @@ g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) G_LABEL_DEBUG(2, "Tasting %s.", pp->name); + /* Skip providers that are already open for writing. */ + if (pp->acw > 0) + return (NULL); + if (strcmp(pp->geom->class->name, mp->name) == 0) return (NULL); @@ -312,6 +315,8 @@ g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) for (i = 0; g_labels[i] != NULL; i++) { char label[64]; + if (g_labels[i]->ld_enabled == 0) + continue; g_topology_unlock(); g_labels[i]->ld_taste(cp, label, sizeof(label)); g_topology_lock(); diff --git a/sys/geom/label/g_label.h b/sys/geom/label/g_label.h index 6e5d8f0d992d..06ba2f55ef2f 100644 --- a/sys/geom/label/g_label.h +++ b/sys/geom/label/g_label.h @@ -30,6 +30,9 @@ #define _G_LABEL_H_ #include +#ifdef _KERNEL +#include +#endif #define G_LABEL_CLASS_NAME "LABEL" @@ -56,23 +59,34 @@ extern u_int g_label_debug; } \ } while (0) +SYSCTL_DECL(_kern_geom_label); + +#define G_LABEL_INIT(kind, label, descr) \ + SYSCTL_NODE(_kern_geom_label, OID_AUTO, kind, CTLFLAG_RD, \ + NULL, ""); \ + SYSCTL_INT(_kern_geom_label_##kind, OID_AUTO, enable, \ + CTLFLAG_RW, &label.ld_enabled, 1, descr); \ + TUNABLE_INT("kern.geom.label." __XSTRING(kind) ".enable", \ + &label.ld_enabled) + typedef void g_label_taste_t (struct g_consumer *cp, char *label, size_t size); struct g_label_desc { g_label_taste_t *ld_taste; char *ld_dir; + int ld_enabled; }; /* Supported labels. */ -extern const struct g_label_desc g_label_ufs_id; -extern const struct g_label_desc g_label_ufs_volume; -extern const struct g_label_desc g_label_iso9660; -extern const struct g_label_desc g_label_msdosfs; -extern const struct g_label_desc g_label_ext2fs; -extern const struct g_label_desc g_label_reiserfs; -extern const struct g_label_desc g_label_ntfs; -extern const struct g_label_desc g_label_gpt; -extern const struct g_label_desc g_label_gpt_uuid; +extern struct g_label_desc g_label_ufs_id; +extern struct g_label_desc g_label_ufs_volume; +extern struct g_label_desc g_label_iso9660; +extern struct g_label_desc g_label_msdosfs; +extern struct g_label_desc g_label_ext2fs; +extern struct g_label_desc g_label_reiserfs; +extern struct g_label_desc g_label_ntfs; +extern struct g_label_desc g_label_gpt; +extern struct g_label_desc g_label_gpt_uuid; #endif /* _KERNEL */ struct g_label_metadata { diff --git a/sys/geom/label/g_label_ext2fs.c b/sys/geom/label/g_label_ext2fs.c index 379785f54558..2e0049307304 100644 --- a/sys/geom/label/g_label_ext2fs.c +++ b/sys/geom/label/g_label_ext2fs.c @@ -86,7 +86,10 @@ exit_free: g_free(fs); } -const struct g_label_desc g_label_ext2fs = { +struct g_label_desc g_label_ext2fs = { .ld_taste = g_label_ext2fs_taste, - .ld_dir = "ext2fs" + .ld_dir = "ext2fs", + .ld_enabled = 1 }; + +G_LABEL_INIT(ext2fs, g_label_ext2fs, "Create device nodes for EXT2FS volumes"); diff --git a/sys/geom/label/g_label_gpt.c b/sys/geom/label/g_label_gpt.c index b186782097a5..37014959cffa 100644 --- a/sys/geom/label/g_label_gpt.c +++ b/sys/geom/label/g_label_gpt.c @@ -153,12 +153,17 @@ g_label_gpt_uuid_taste(struct g_consumer *cp, char *label, size_t size) snprintf_uuid(label, size, &part_gpt_entry->ent.ent_uuid); } -const struct g_label_desc g_label_gpt = { +struct g_label_desc g_label_gpt = { .ld_taste = g_label_gpt_taste, - .ld_dir = G_LABEL_GPT_VOLUME_DIR + .ld_dir = G_LABEL_GPT_VOLUME_DIR, + .ld_enabled = 1 }; -const struct g_label_desc g_label_gpt_uuid = { +struct g_label_desc g_label_gpt_uuid = { .ld_taste = g_label_gpt_uuid_taste, - .ld_dir = G_LABEL_GPT_ID_DIR + .ld_dir = G_LABEL_GPT_ID_DIR, + .ld_enabled = 1 }; + +G_LABEL_INIT(gpt, g_label_gpt, "Create device nodes for GPT labels"); +G_LABEL_INIT(gptid, g_label_gpt_uuid, "Create device nodes for GPT UUIDs"); diff --git a/sys/geom/label/g_label_iso9660.c b/sys/geom/label/g_label_iso9660.c index 7d29bcd864d9..154cefcb4a80 100644 --- a/sys/geom/label/g_label_iso9660.c +++ b/sys/geom/label/g_label_iso9660.c @@ -78,7 +78,10 @@ g_label_iso9660_taste(struct g_consumer *cp, char *label, size_t size) } } -const struct g_label_desc g_label_iso9660 = { +struct g_label_desc g_label_iso9660 = { .ld_taste = g_label_iso9660_taste, - .ld_dir = G_LABEL_ISO9660_DIR + .ld_dir = G_LABEL_ISO9660_DIR, + .ld_enabled = 1 }; + +G_LABEL_INIT(iso9660, g_label_iso9660, "Create device nodes for ISO9660 volume names"); diff --git a/sys/geom/label/g_label_msdosfs.c b/sys/geom/label/g_label_msdosfs.c index 94d88d20fa4c..5f65a72d20d0 100644 --- a/sys/geom/label/g_label_msdosfs.c +++ b/sys/geom/label/g_label_msdosfs.c @@ -216,7 +216,10 @@ error: g_free(sector); } -const struct g_label_desc g_label_msdosfs = { +struct g_label_desc g_label_msdosfs = { .ld_taste = g_label_msdosfs_taste, - .ld_dir = G_LABEL_MSDOSFS_DIR + .ld_dir = G_LABEL_MSDOSFS_DIR, + .ld_enabled = 1 }; + +G_LABEL_INIT(msdosfs, g_label_msdosfs, "Create device nodes for MSDOSFS volumes"); diff --git a/sys/geom/label/g_label_ntfs.c b/sys/geom/label/g_label_ntfs.c index 4781d7debbef..1ee3f797f260 100644 --- a/sys/geom/label/g_label_ntfs.c +++ b/sys/geom/label/g_label_ntfs.c @@ -114,7 +114,10 @@ done: g_free(filerecp); } -const struct g_label_desc g_label_ntfs = { +struct g_label_desc g_label_ntfs = { .ld_taste = g_label_ntfs_taste, - .ld_dir = G_LABEL_NTFS_DIR + .ld_dir = G_LABEL_NTFS_DIR, + .ld_enabled = 1 }; + +G_LABEL_INIT(ntfs, g_label_ntfs, "Create device nodes for NTFS volumes"); diff --git a/sys/geom/label/g_label_reiserfs.c b/sys/geom/label/g_label_reiserfs.c index 18ce1efd4f88..a912e9799141 100644 --- a/sys/geom/label/g_label_reiserfs.c +++ b/sys/geom/label/g_label_reiserfs.c @@ -111,7 +111,10 @@ exit_free: g_free(fs); } -const struct g_label_desc g_label_reiserfs = { +struct g_label_desc g_label_reiserfs = { .ld_taste = g_label_reiserfs_taste, - .ld_dir = "reiserfs" + .ld_dir = "reiserfs", + .ld_enabled = 1 }; + +G_LABEL_INIT(reiserfs, g_label_reiserfs, "Create device nodes for REISERFS volumes"); diff --git a/sys/geom/label/g_label_ufs.c b/sys/geom/label/g_label_ufs.c index 8510fc06912c..b9b04437f0ac 100644 --- a/sys/geom/label/g_label_ufs.c +++ b/sys/geom/label/g_label_ufs.c @@ -137,13 +137,17 @@ g_label_ufs_id_taste(struct g_consumer *cp, char *label, size_t size) g_label_ufs_taste_common(cp, label, size, G_LABEL_UFS_ID); } - -const struct g_label_desc g_label_ufs_volume = { +struct g_label_desc g_label_ufs_volume = { .ld_taste = g_label_ufs_volume_taste, - .ld_dir = G_LABEL_UFS_VOLUME_DIR + .ld_dir = G_LABEL_UFS_VOLUME_DIR, + .ld_enabled = 1 }; -const struct g_label_desc g_label_ufs_id = { +struct g_label_desc g_label_ufs_id = { .ld_taste = g_label_ufs_id_taste, - .ld_dir = G_LABEL_UFS_ID_DIR + .ld_dir = G_LABEL_UFS_ID_DIR, + .ld_enabled = 1 }; + +G_LABEL_INIT(ufsid, g_label_ufs_id, "Create device nodes for UFS file system IDs"); +G_LABEL_INIT(ufs, g_label_ufs_volume, "Create device nodes for UFS volume names"); diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c index 13ff6eaabb60..404ab986b356 100644 --- a/sys/geom/mirror/g_mirror.c +++ b/sys/geom/mirror/g_mirror.c @@ -451,9 +451,6 @@ g_mirror_init_disk(struct g_mirror_softc *sc, struct g_provider *pp, disk->d_id = md->md_did; disk->d_state = G_MIRROR_DISK_STATE_NONE; disk->d_priority = md->md_priority; - disk->d_delay.sec = 0; - disk->d_delay.frac = 0; - binuptime(&disk->d_last_used); disk->d_flags = md->md_dflags; if (md->md_provider[0] != '\0') disk->d_flags |= G_MIRROR_DISK_FLAG_HARDCODED; @@ -862,16 +859,6 @@ bintime_cmp(struct bintime *bt1, struct bintime *bt2) return (0); } -static void -g_mirror_update_delay(struct g_mirror_disk *disk, struct bio *bp) -{ - - if (disk->d_softc->sc_balance != G_MIRROR_BALANCE_LOAD) - return; - binuptime(&disk->d_delay); - bintime_sub(&disk->d_delay, &bp->bio_t0); -} - static void g_mirror_done(struct bio *bp) { @@ -881,8 +868,8 @@ g_mirror_done(struct bio *bp) bp->bio_cflags = G_MIRROR_BIO_FLAG_REGULAR; mtx_lock(&sc->sc_queue_mtx); bioq_disksort(&sc->sc_queue, bp); - wakeup(sc); mtx_unlock(&sc->sc_queue_mtx); + wakeup(sc); } static void @@ -904,8 +891,6 @@ g_mirror_regular_request(struct bio *bp) g_topology_lock(); g_mirror_kill_consumer(sc, bp->bio_from); g_topology_unlock(); - } else { - g_mirror_update_delay(disk, bp); } pbp->bio_inbed++; @@ -969,9 +954,9 @@ g_mirror_regular_request(struct bio *bp) pbp->bio_error = 0; mtx_lock(&sc->sc_queue_mtx); bioq_disksort(&sc->sc_queue, pbp); + mtx_unlock(&sc->sc_queue_mtx); G_MIRROR_DEBUG(4, "%s: Waking up %p.", __func__, sc); wakeup(sc); - mtx_unlock(&sc->sc_queue_mtx); } break; case BIO_DELETE: @@ -1009,8 +994,8 @@ g_mirror_sync_done(struct bio *bp) bp->bio_cflags = G_MIRROR_BIO_FLAG_SYNC; mtx_lock(&sc->sc_queue_mtx); bioq_disksort(&sc->sc_queue, bp); - wakeup(sc); mtx_unlock(&sc->sc_queue_mtx); + wakeup(sc); } static void @@ -1122,9 +1107,9 @@ g_mirror_start(struct bio *bp) } mtx_lock(&sc->sc_queue_mtx); bioq_disksort(&sc->sc_queue, bp); + mtx_unlock(&sc->sc_queue_mtx); G_MIRROR_DEBUG(4, "%s: Waking up %p.", __func__, sc); wakeup(sc); - mtx_unlock(&sc->sc_queue_mtx); } /* @@ -1465,30 +1450,35 @@ g_mirror_request_round_robin(struct g_mirror_softc *sc, struct bio *bp) g_io_request(cbp, cp); } +#define TRACK_SIZE (1 * 1024 * 1024) +#define LOAD_SCALE 256 +#define ABS(x) (((x) >= 0) ? (x) : (-(x))) + static void g_mirror_request_load(struct g_mirror_softc *sc, struct bio *bp) { struct g_mirror_disk *disk, *dp; struct g_consumer *cp; struct bio *cbp; - struct bintime curtime; + int prio, best; - binuptime(&curtime); - /* - * Find a disk which the smallest load. - */ + /* Find a disk with the smallest load. */ disk = NULL; + best = INT_MAX; LIST_FOREACH(dp, &sc->sc_disks, d_next) { if (dp->d_state != G_MIRROR_DISK_STATE_ACTIVE) continue; - /* If disk wasn't used for more than 2 sec, use it. */ - if (curtime.sec - dp->d_last_used.sec >= 2) { - disk = dp; - break; - } - if (disk == NULL || - bintime_cmp(&dp->d_delay, &disk->d_delay) < 0) { + prio = dp->load; + /* If disk head is precisely in position - highly prefer it. */ + if (dp->d_last_offset == bp->bio_offset) + prio -= 2 * LOAD_SCALE; + else + /* If disk head is close to position - prefer it. */ + if (ABS(dp->d_last_offset - bp->bio_offset) < TRACK_SIZE) + prio -= 1 * LOAD_SCALE; + if (prio <= best) { disk = dp; + best = prio; } } KASSERT(disk != NULL, ("NULL disk for %s.", sc->sc_name)); @@ -1505,12 +1495,18 @@ g_mirror_request_load(struct g_mirror_softc *sc, struct bio *bp) cp = disk->d_consumer; cbp->bio_done = g_mirror_done; cbp->bio_to = cp->provider; - binuptime(&disk->d_last_used); G_MIRROR_LOGREQ(3, cbp, "Sending request."); KASSERT(cp->acr >= 1 && cp->acw >= 1 && cp->ace >= 1, ("Consumer %s not opened (r%dw%de%d).", cp->provider->name, cp->acr, cp->acw, cp->ace)); cp->index++; + /* Remember last head position */ + disk->d_last_offset = bp->bio_offset + bp->bio_length; + /* Update loads. */ + LIST_FOREACH(dp, &sc->sc_disks, d_next) { + dp->load = (dp->d_consumer->index * LOAD_SCALE + + dp->load * 7) / 8; + } g_io_request(cbp, cp); } @@ -2040,6 +2036,15 @@ g_mirror_launch_provider(struct g_mirror_softc *sc) pp = g_new_providerf(sc->sc_geom, "mirror/%s", sc->sc_name); pp->mediasize = sc->sc_mediasize; pp->sectorsize = sc->sc_sectorsize; + pp->stripesize = 0; + pp->stripeoffset = 0; + LIST_FOREACH(disk, &sc->sc_disks, d_next) { + if (disk->d_consumer && disk->d_consumer->provider && + disk->d_consumer->provider->stripesize > pp->stripesize) { + pp->stripesize = disk->d_consumer->provider->stripesize; + pp->stripeoffset = disk->d_consumer->provider->stripeoffset; + } + } sc->sc_provider = pp; g_error_provider(pp, 0); g_topology_unlock(); diff --git a/sys/geom/mirror/g_mirror.h b/sys/geom/mirror/g_mirror.h index eb67b6e08ba7..8cd9a691e40c 100644 --- a/sys/geom/mirror/g_mirror.h +++ b/sys/geom/mirror/g_mirror.h @@ -133,8 +133,8 @@ struct g_mirror_disk { struct g_mirror_softc *d_softc; /* Back-pointer to softc. */ int d_state; /* Disk state. */ u_int d_priority; /* Disk priority. */ - struct bintime d_delay; /* Disk delay. */ - struct bintime d_last_used; /* When disk was last used. */ + u_int load; /* Averaged queue length */ + off_t d_last_offset; /* Last read offset */ uint64_t d_flags; /* Additional flags. */ u_int d_genid; /* Disk's generation ID. */ struct g_mirror_disk_sync d_sync;/* Sync information. */ diff --git a/sys/geom/mountver/g_mountver.c b/sys/geom/mountver/g_mountver.c new file mode 100644 index 000000000000..e15ce9d82f4c --- /dev/null +++ b/sys/geom/mountver/g_mountver.c @@ -0,0 +1,644 @@ +/*- + * Copyright (c) 2010 Edward Tomasz Napierala + * Copyright (c) 2004-2006 Pawel Jakub Dawidek + * 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 AUTHORS 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 AUTHORS 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +SYSCTL_DECL(_kern_geom); +SYSCTL_NODE(_kern_geom, OID_AUTO, mountver, CTLFLAG_RW, + 0, "GEOM_MOUNTVER stuff"); +static u_int g_mountver_debug = 0; +static u_int g_mountver_check_ident = 1; +SYSCTL_UINT(_kern_geom_mountver, OID_AUTO, debug, CTLFLAG_RW, + &g_mountver_debug, 0, "Debug level"); +SYSCTL_UINT(_kern_geom_mountver, OID_AUTO, check_ident, CTLFLAG_RW, + &g_mountver_check_ident, 0, "Check disk ident when reattaching"); + +static eventhandler_tag g_mountver_pre_sync = NULL; + +static void g_mountver_queue(struct bio *bp); +static void g_mountver_orphan(struct g_consumer *cp); +static int g_mountver_destroy(struct g_geom *gp, boolean_t force); +static g_taste_t g_mountver_taste; +static int g_mountver_destroy_geom(struct gctl_req *req, struct g_class *mp, + struct g_geom *gp); +static void g_mountver_config(struct gctl_req *req, struct g_class *mp, + const char *verb); +static void g_mountver_dumpconf(struct sbuf *sb, const char *indent, + struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp); +static void g_mountver_init(struct g_class *mp); +static void g_mountver_fini(struct g_class *mp); + +struct g_class g_mountver_class = { + .name = G_MOUNTVER_CLASS_NAME, + .version = G_VERSION, + .ctlreq = g_mountver_config, + .taste = g_mountver_taste, + .destroy_geom = g_mountver_destroy_geom, + .init = g_mountver_init, + .fini = g_mountver_fini +}; + +static void +g_mountver_done(struct bio *bp) +{ + struct g_geom *gp; + struct bio *pbp; + + if (bp->bio_error != ENXIO) { + g_std_done(bp); + return; + } + + /* + * When the device goes away, it's possible that few requests + * will be completed with ENXIO before g_mountver_orphan() + * gets called. To work around that, we have to queue requests + * that failed with ENXIO, in order to send them later. + */ + gp = bp->bio_from->geom; + + pbp = bp->bio_parent; + KASSERT(pbp->bio_to == LIST_FIRST(&gp->provider), + ("parent request was for someone else")); + g_destroy_bio(bp); + pbp->bio_inbed++; + g_mountver_queue(pbp); +} + +static void +g_mountver_send(struct bio *bp) +{ + struct g_geom *gp; + struct bio *cbp; + + gp = bp->bio_to->geom; + + cbp = g_clone_bio(bp); + if (cbp == NULL) { + g_io_deliver(bp, ENOMEM); + return; + } + + cbp->bio_done = g_mountver_done; + g_io_request(cbp, LIST_FIRST(&gp->consumer)); +} + +static void +g_mountver_queue(struct bio *bp) +{ + struct g_mountver_softc *sc; + struct g_geom *gp; + + gp = bp->bio_to->geom; + sc = gp->softc; + + mtx_lock(&sc->sc_mtx); + TAILQ_INSERT_TAIL(&sc->sc_queue, bp, bio_queue); + mtx_unlock(&sc->sc_mtx); +} + +static void +g_mountver_send_queued(struct g_geom *gp) +{ + struct g_mountver_softc *sc; + struct bio *bp; + + sc = gp->softc; + + mtx_lock(&sc->sc_mtx); + while ((bp = TAILQ_FIRST(&sc->sc_queue)) != NULL) { + TAILQ_REMOVE(&sc->sc_queue, bp, bio_queue); + G_MOUNTVER_LOGREQ(bp, "Sending queued request."); + g_mountver_send(bp); + } + mtx_unlock(&sc->sc_mtx); +} + +static void +g_mountver_discard_queued(struct g_geom *gp) +{ + struct g_mountver_softc *sc; + struct bio *bp; + + sc = gp->softc; + + mtx_lock(&sc->sc_mtx); + while ((bp = TAILQ_FIRST(&sc->sc_queue)) != NULL) { + TAILQ_REMOVE(&sc->sc_queue, bp, bio_queue); + G_MOUNTVER_LOGREQ(bp, "Discarding queued request."); + g_io_deliver(bp, ENXIO); + } + mtx_unlock(&sc->sc_mtx); +} + +static void +g_mountver_start(struct bio *bp) +{ + struct g_mountver_softc *sc; + struct g_geom *gp; + + gp = bp->bio_to->geom; + sc = gp->softc; + G_MOUNTVER_LOGREQ(bp, "Request received."); + + /* + * It is possible that some bios were returned with ENXIO, even though + * orphaning didn't happen yet. In that case, queue all subsequent + * requests in order to maintain ordering. + */ + if (sc->sc_orphaned || !TAILQ_EMPTY(&sc->sc_queue)) { + G_MOUNTVER_LOGREQ(bp, "Queueing request."); + g_mountver_queue(bp); + if (!sc->sc_orphaned) + g_mountver_send_queued(gp); + } else { + G_MOUNTVER_LOGREQ(bp, "Sending request."); + g_mountver_send(bp); + } +} + +static int +g_mountver_access(struct g_provider *pp, int dr, int dw, int de) +{ + struct g_mountver_softc *sc; + struct g_geom *gp; + struct g_consumer *cp; + + g_topology_assert(); + + gp = pp->geom; + cp = LIST_FIRST(&gp->consumer); + sc = gp->softc; + if (sc == NULL && dr <= 0 && dw <= 0 && de <= 0) + return (0); + KASSERT(sc != NULL, ("Trying to access withered provider \"%s\".", pp->name)); + + sc->sc_access_r += dr; + sc->sc_access_w += dw; + sc->sc_access_e += de; + + if (sc->sc_orphaned) + return (0); + + return (g_access(cp, dr, dw, de)); +} + +static int +g_mountver_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp) +{ + struct g_mountver_softc *sc; + struct g_geom *gp; + struct g_provider *newpp; + struct g_consumer *cp; + char name[64]; + int error; + int identsize = DISK_IDENT_SIZE; + + g_topology_assert(); + + gp = NULL; + newpp = NULL; + cp = NULL; + + snprintf(name, sizeof(name), "%s%s", pp->name, G_MOUNTVER_SUFFIX); + LIST_FOREACH(gp, &mp->geom, geom) { + if (strcmp(gp->name, name) == 0) { + gctl_error(req, "Provider %s already exists.", name); + return (EEXIST); + } + } + gp = g_new_geomf(mp, name); + if (gp == NULL) { + gctl_error(req, "Cannot create geom %s.", name); + return (ENOMEM); + } + sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO); + mtx_init(&sc->sc_mtx, "gmountver", NULL, MTX_DEF); + TAILQ_INIT(&sc->sc_queue); + sc->sc_provider_name = strdup(pp->name, M_GEOM); + gp->softc = sc; + gp->start = g_mountver_start; + gp->orphan = g_mountver_orphan; + gp->access = g_mountver_access; + gp->dumpconf = g_mountver_dumpconf; + + newpp = g_new_providerf(gp, gp->name); + if (newpp == NULL) { + gctl_error(req, "Cannot create provider %s.", name); + error = ENOMEM; + goto fail; + } + newpp->mediasize = pp->mediasize; + newpp->sectorsize = pp->sectorsize; + + cp = g_new_consumer(gp); + if (cp == NULL) { + gctl_error(req, "Cannot create consumer for %s.", gp->name); + error = ENOMEM; + goto fail; + } + error = g_attach(cp, pp); + if (error != 0) { + gctl_error(req, "Cannot attach to provider %s.", pp->name); + goto fail; + } + error = g_access(cp, 1, 0, 0); + if (error != 0) { + gctl_error(req, "Cannot access provider %s.", pp->name); + goto fail; + } + error = g_io_getattr("GEOM::ident", cp, &identsize, sc->sc_ident); + g_access(cp, -1, 0, 0); + if (error != 0) { + if (g_mountver_check_ident) { + gctl_error(req, "Cannot get disk ident from %s; error = %d.", pp->name, error); + goto fail; + } + + G_MOUNTVER_DEBUG(0, "Cannot get disk ident from %s; error = %d.", pp->name, error); + sc->sc_ident[0] = '\0'; + } + + g_error_provider(newpp, 0); + G_MOUNTVER_DEBUG(0, "Device %s created.", gp->name); + return (0); +fail: + if (sc->sc_provider_name != NULL) + g_free(sc->sc_provider_name); + if (cp != NULL) { + if (cp->provider != NULL) + g_detach(cp); + g_destroy_consumer(cp); + } + if (newpp != NULL) + g_destroy_provider(newpp); + if (gp != NULL) { + if (gp->softc != NULL) + g_free(gp->softc); + g_destroy_geom(gp); + } + return (error); +} + +static int +g_mountver_destroy(struct g_geom *gp, boolean_t force) +{ + struct g_mountver_softc *sc; + struct g_provider *pp; + + g_topology_assert(); + if (gp->softc == NULL) + return (ENXIO); + sc = gp->softc; + pp = LIST_FIRST(&gp->provider); + if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) { + if (force) { + G_MOUNTVER_DEBUG(0, "Device %s is still open, so it " + "can't be definitely removed.", pp->name); + } else { + G_MOUNTVER_DEBUG(1, "Device %s is still open (r%dw%de%d).", + pp->name, pp->acr, pp->acw, pp->ace); + return (EBUSY); + } + } else { + G_MOUNTVER_DEBUG(0, "Device %s removed.", gp->name); + } + g_orphan_provider(pp, ENXIO); + g_mountver_discard_queued(gp); + g_free(sc->sc_provider_name); + g_free(gp->softc); + gp->softc = NULL; + g_wither_geom(gp, ENXIO); + + return (0); +} + +static int +g_mountver_destroy_geom(struct gctl_req *req, struct g_class *mp, struct g_geom *gp) +{ + + return (g_mountver_destroy(gp, 0)); +} + +static void +g_mountver_ctl_create(struct gctl_req *req, struct g_class *mp) +{ + struct g_provider *pp; + const char *name; + char param[16]; + int i, *nargs; + + g_topology_assert(); + + nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs)); + if (nargs == NULL) { + gctl_error(req, "No '%s' argument", "nargs"); + return; + } + if (*nargs <= 0) { + gctl_error(req, "Missing device(s)."); + return; + } + for (i = 0; i < *nargs; i++) { + snprintf(param, sizeof(param), "arg%d", i); + name = gctl_get_asciiparam(req, param); + if (name == NULL) { + gctl_error(req, "No 'arg%d' argument", i); + return; + } + if (strncmp(name, "/dev/", strlen("/dev/")) == 0) + name += strlen("/dev/"); + pp = g_provider_by_name(name); + if (pp == NULL) { + G_MOUNTVER_DEBUG(1, "Provider %s is invalid.", name); + gctl_error(req, "Provider %s is invalid.", name); + return; + } + if (g_mountver_create(req, mp, pp) != 0) + return; + } +} + +static struct g_geom * +g_mountver_find_geom(struct g_class *mp, const char *name) +{ + struct g_geom *gp; + + LIST_FOREACH(gp, &mp->geom, geom) { + if (strcmp(gp->name, name) == 0) + return (gp); + } + return (NULL); +} + +static void +g_mountver_ctl_destroy(struct gctl_req *req, struct g_class *mp) +{ + int *nargs, *force, error, i; + struct g_geom *gp; + const char *name; + char param[16]; + + g_topology_assert(); + + nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs)); + if (nargs == NULL) { + gctl_error(req, "No '%s' argument", "nargs"); + return; + } + if (*nargs <= 0) { + gctl_error(req, "Missing device(s)."); + return; + } + force = gctl_get_paraml(req, "force", sizeof(*force)); + if (force == NULL) { + gctl_error(req, "No 'force' argument"); + return; + } + + for (i = 0; i < *nargs; i++) { + snprintf(param, sizeof(param), "arg%d", i); + name = gctl_get_asciiparam(req, param); + if (name == NULL) { + gctl_error(req, "No 'arg%d' argument", i); + return; + } + if (strncmp(name, "/dev/", strlen("/dev/")) == 0) + name += strlen("/dev/"); + gp = g_mountver_find_geom(mp, name); + if (gp == NULL) { + G_MOUNTVER_DEBUG(1, "Device %s is invalid.", name); + gctl_error(req, "Device %s is invalid.", name); + return; + } + error = g_mountver_destroy(gp, *force); + if (error != 0) { + gctl_error(req, "Cannot destroy device %s (error=%d).", + gp->name, error); + return; + } + } +} + +static void +g_mountver_orphan(struct g_consumer *cp) +{ + struct g_mountver_softc *sc; + + g_topology_assert(); + + sc = cp->geom->softc; + sc->sc_orphaned = 1; + if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0) + g_access(cp, -cp->acr, -cp->acw, -cp->ace); + g_detach(cp); + G_MOUNTVER_DEBUG(0, "%s is offline. Mount verification in progress.", sc->sc_provider_name); +} + +static int +g_mountver_ident_matches(struct g_geom *gp) +{ + struct g_consumer *cp; + struct g_mountver_softc *sc; + char ident[DISK_IDENT_SIZE]; + int error, identsize = DISK_IDENT_SIZE; + + sc = gp->softc; + cp = LIST_FIRST(&gp->consumer); + + if (g_mountver_check_ident == 0) + return (0); + + error = g_access(cp, 1, 0, 0); + if (error != 0) { + G_MOUNTVER_DEBUG(0, "Cannot access %s; " + "not attaching; error = %d.", gp->name, error); + return (1); + } + error = g_io_getattr("GEOM::ident", cp, &identsize, ident); + g_access(cp, -1, 0, 0); + if (error != 0) { + G_MOUNTVER_DEBUG(0, "Cannot get disk ident for %s; " + "not attaching; error = %d.", gp->name, error); + return (1); + } + if (strcmp(ident, sc->sc_ident) != 0) { + G_MOUNTVER_DEBUG(1, "Disk ident for %s (\"%s\") is different " + "from expected \"%s\", not attaching.", gp->name, ident, + sc->sc_ident); + return (1); + } + + return (0); +} + +static struct g_geom * +g_mountver_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) +{ + struct g_mountver_softc *sc; + struct g_consumer *cp; + struct g_geom *gp; + int error; + + g_topology_assert(); + g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name); + G_MOUNTVER_DEBUG(2, "Tasting %s.", pp->name); + + /* + * Let's check if device already exists. + */ + LIST_FOREACH(gp, &mp->geom, geom) { + sc = gp->softc; + if (sc == NULL) + continue; + + /* Already attached? */ + if (pp == LIST_FIRST(&gp->provider)) + return (NULL); + + if (sc->sc_orphaned && strcmp(pp->name, sc->sc_provider_name) == 0) + break; + } + if (gp == NULL) + return (NULL); + + cp = LIST_FIRST(&gp->consumer); + g_attach(cp, pp); + error = g_mountver_ident_matches(gp); + if (error != 0) { + g_detach(cp); + return (NULL); + } + if (sc->sc_access_r > 0 || sc->sc_access_w > 0 || sc->sc_access_e > 0) { + error = g_access(cp, sc->sc_access_r, sc->sc_access_w, sc->sc_access_e); + if (error != 0) { + G_MOUNTVER_DEBUG(0, "Cannot access %s; error = %d.", pp->name, error); + g_detach(cp); + return (NULL); + } + } + g_mountver_send_queued(gp); + sc->sc_orphaned = 0; + G_MOUNTVER_DEBUG(0, "%s has completed mount verification.", sc->sc_provider_name); + + return (gp); +} + +static void +g_mountver_config(struct gctl_req *req, struct g_class *mp, const char *verb) +{ + uint32_t *version; + + g_topology_assert(); + + version = gctl_get_paraml(req, "version", sizeof(*version)); + if (version == NULL) { + gctl_error(req, "No '%s' argument.", "version"); + return; + } + if (*version != G_MOUNTVER_VERSION) { + gctl_error(req, "Userland and kernel parts are out of sync."); + return; + } + + if (strcmp(verb, "create") == 0) { + g_mountver_ctl_create(req, mp); + return; + } else if (strcmp(verb, "destroy") == 0) { + g_mountver_ctl_destroy(req, mp); + return; + } + + gctl_error(req, "Unknown verb."); +} + +static void +g_mountver_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, + struct g_consumer *cp, struct g_provider *pp) +{ + struct g_mountver_softc *sc; + + if (pp != NULL || cp != NULL) + return; + + sc = gp->softc; + sbuf_printf(sb, "%s%s\n", indent, + sc->sc_orphaned ? "OFFLINE" : "ONLINE"); + sbuf_printf(sb, "%s%s\n", indent, sc->sc_provider_name); + sbuf_printf(sb, "%s%s\n", indent, sc->sc_ident); +} + +static void +g_mountver_shutdown_pre_sync(void *arg, int howto) +{ + struct g_class *mp; + struct g_geom *gp, *gp2; + + mp = arg; + DROP_GIANT(); + g_topology_lock(); + LIST_FOREACH_SAFE(gp, &mp->geom, geom, gp2) + g_mountver_destroy(gp, 1); + g_topology_unlock(); + PICKUP_GIANT(); +} + +static void +g_mountver_init(struct g_class *mp) +{ + + g_mountver_pre_sync = EVENTHANDLER_REGISTER(shutdown_pre_sync, + g_mountver_shutdown_pre_sync, mp, SHUTDOWN_PRI_FIRST); + if (g_mountver_pre_sync == NULL) + G_MOUNTVER_DEBUG(0, "Warning! Cannot register shutdown event."); +} + +static void +g_mountver_fini(struct g_class *mp) +{ + + if (g_mountver_pre_sync != NULL) + EVENTHANDLER_DEREGISTER(shutdown_pre_sync, g_mountver_pre_sync); +} + +DECLARE_GEOM_CLASS(g_mountver_class, g_mountver); diff --git a/sys/geom/mountver/g_mountver.h b/sys/geom/mountver/g_mountver.h new file mode 100644 index 000000000000..1dc8372cf872 --- /dev/null +++ b/sys/geom/mountver/g_mountver.h @@ -0,0 +1,71 @@ +/*- + * Copyright (c) 2010 Edward Tomasz Napierala + * Copyright (c) 2004-2006 Pawel Jakub Dawidek + * 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 AUTHORS 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 AUTHORS 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$ + */ + +#ifndef _G_MOUNTVER_H_ +#define _G_MOUNTVER_H_ + +#define G_MOUNTVER_CLASS_NAME "MOUNTVER" +#define G_MOUNTVER_VERSION 4 +#define G_MOUNTVER_SUFFIX ".mountver" + +#ifdef _KERNEL + +#define G_MOUNTVER_DEBUG(lvl, ...) do { \ + if (g_mountver_debug >= (lvl)) { \ + printf("GEOM_MOUNTVER"); \ + if (g_mountver_debug > 0) \ + printf("[%u]", lvl); \ + printf(": "); \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } \ +} while (0) +#define G_MOUNTVER_LOGREQ(bp, ...) do { \ + if (g_mountver_debug >= 2) { \ + printf("GEOM_MOUNTVER[2]: "); \ + printf(__VA_ARGS__); \ + printf(" "); \ + g_print_bio(bp); \ + printf("\n"); \ + } \ +} while (0) + +struct g_mountver_softc { + TAILQ_HEAD(, bio) sc_queue; + struct mtx sc_mtx; + char *sc_provider_name; + char sc_ident[DISK_IDENT_SIZE]; + int sc_orphaned; + int sc_access_r; + int sc_access_w; + int sc_access_e; +}; +#endif /* _KERNEL */ + +#endif /* _G_MOUNTVER_H_ */ diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c index d24edb6f5851..a2e61586b52e 100644 --- a/sys/geom/multipath/g_multipath.c +++ b/sys/geom/multipath/g_multipath.c @@ -95,9 +95,8 @@ g_mpd(void *arg, int flags __unused) g_topology_assert(); cp = arg; - if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0) { + if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0) g_access(cp, -cp->acr, -cp->acw, -cp->ace); - } if (cp->provider) { printf("GEOM_MULTIPATH: %s removed from %s\n", cp->provider->name, cp->geom->name); @@ -222,15 +221,16 @@ g_multipath_done_error(struct bio *bp) static void g_multipath_kt(void *arg) { + g_multipath_kt_state = GKT_RUN; mtx_lock(&gmtbq_mtx); while (g_multipath_kt_state == GKT_RUN) { for (;;) { struct bio *bp; + bp = bioq_takefirst(&gmtbq); - if (bp == NULL) { + if (bp == NULL) break; - } mtx_unlock(&gmtbq_mtx); g_multipath_done_error(bp); mtx_lock(&gmtbq_mtx); @@ -264,9 +264,8 @@ g_multipath_access(struct g_provider *pp, int dr, int dw, int de) fail: LIST_FOREACH(cp, &gp->consumer, consumer) { - if (cp == badcp) { + if (cp == badcp) break; - } (void) g_access(cp, -dr, -dw, -de); } return (error); @@ -290,9 +289,8 @@ g_multipath_create(struct g_class *mp, struct g_multipath_metadata *md) } gp = g_new_geomf(mp, md->md_name); - if (gp == NULL) { + if (gp == NULL) goto fail; - } sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO); gp->softc = sc; @@ -303,9 +301,8 @@ g_multipath_create(struct g_class *mp, struct g_multipath_metadata *md) memcpy(sc->sc_name, md->md_name, sizeof (sc->sc_name)); pp = g_new_providerf(gp, "multipath/%s", md->md_name); - if (pp == NULL) { + if (pp == NULL) goto fail; - } /* limit the provider to not have it stomp on metadata */ pp->mediasize = md->md_size - md->md_sectorsize; pp->sectorsize = md->md_sectorsize; @@ -314,9 +311,8 @@ g_multipath_create(struct g_class *mp, struct g_multipath_metadata *md) return (gp); fail: if (gp != NULL) { - if (gp->softc != NULL) { + if (gp->softc != NULL) g_free(gp->softc); - } g_destroy_geom(gp); } return (NULL); @@ -338,9 +334,8 @@ g_multipath_add_disk(struct g_geom *gp, struct g_provider *pp) * Make sure that the passed provider isn't already attached */ LIST_FOREACH(cp, &gp->consumer, consumer) { - if (cp->provider == pp) { + if (cp->provider == pp) break; - } } if (cp) { printf("GEOM_MULTIPATH: provider %s already attached to %s\n", @@ -349,9 +344,8 @@ g_multipath_add_disk(struct g_geom *gp, struct g_provider *pp) } nxtcp = LIST_FIRST(&gp->consumer); cp = g_new_consumer(gp); - if (cp == NULL) { + if (cp == NULL) return (ENOMEM); - } error = g_attach(cp, pp); if (error != 0) { printf("GEOM_MULTIPATH: cannot attach %s to %s", @@ -392,13 +386,11 @@ g_multipath_destroy(struct g_geom *gp) struct g_provider *pp; g_topology_assert(); - if (gp->softc == NULL) { + if (gp->softc == NULL) return (ENXIO); - } pp = LIST_FIRST(&gp->provider); - if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) { + if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) return (EBUSY); - } printf("GEOM_MULTIPATH: destroying %s\n", gp->name); g_free(gp->softc); gp->softc = NULL; @@ -410,6 +402,7 @@ static int g_multipath_destroy_geom(struct gctl_req *req, struct g_class *mp, struct g_geom *gp) { + return (g_multipath_destroy(gp)); } @@ -418,9 +411,8 @@ g_multipath_init(struct g_class *mp) { bioq_init(&gmtbq); mtx_init(&gmtbq_mtx, "gmtbq", NULL, MTX_DEF); - if (kproc_create(g_multipath_kt, mp, NULL, 0, 0, "g_mp_kt") == 0) { + if (kproc_create(g_multipath_kt, mp, NULL, 0, 0, "g_mp_kt") == 0) g_multipath_kt_state = GKT_RUN; - } } static void @@ -446,18 +438,16 @@ g_multipath_read_metadata(struct g_consumer *cp, g_topology_assert(); error = g_access(cp, 1, 0, 0); - if (error != 0) { + if (error != 0) return (error); - } pp = cp->provider; g_topology_unlock(); buf = g_read_data(cp, pp->mediasize - pp->sectorsize, pp->sectorsize, &error); g_topology_lock(); g_access(cp, -1, 0, 0); - if (buf == NULL) { + if (buf == NULL) return (error); - } multipath_metadata_decode(buf, md); g_free(buf); return (0); @@ -484,15 +474,13 @@ g_multipath_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) g_detach(cp); g_destroy_consumer(cp); g_destroy_geom(gp); - if (error != 0) { + if (error != 0) return (NULL); - } gp = NULL; if (strcmp(md.md_magic, G_MULTIPATH_MAGIC) != 0) { - if (g_multipath_debug) { + if (g_multipath_debug) printf("%s is not MULTIPATH\n", pp->name); - } return (NULL); } if (md.md_version != G_MULTIPATH_VERSION) { @@ -501,9 +489,8 @@ g_multipath_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) G_MULTIPATH_VERSION); return (NULL); } - if (g_multipath_debug) { + if (g_multipath_debug) printf("MULTIPATH: %s/%s\n", md.md_name, md.md_uuid); - } /* * Let's check if such a device already is present. We check against @@ -519,25 +506,20 @@ g_multipath_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) sc = NULL; LIST_FOREACH(gp, &mp->geom, geom) { sc = gp->softc; - if (sc == NULL) { + if (sc == NULL) continue; - } - if (strncmp(md.md_uuid, sc->sc_uuid, sizeof(md.md_uuid)) == 0) { + if (strncmp(md.md_uuid, sc->sc_uuid, sizeof(md.md_uuid)) == 0) break; - } } LIST_FOREACH(gp1, &mp->geom, geom) { - if (gp1 == gp) { + if (gp1 == gp) continue; - } sc = gp1->softc; - if (sc == NULL) { + if (sc == NULL) continue; - } - if (strncmp(md.md_name, sc->sc_name, sizeof(md.md_name)) == 0) { + if (strncmp(md.md_name, sc->sc_name, sizeof(md.md_name)) == 0) break; - } } /* @@ -564,9 +546,9 @@ g_multipath_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) sc->sc_name, sc->sc_uuid); printf("GEOM_MULTIPATH: %s will be (temporarily) %s\n", md.md_uuid, buf); - strlcpy(md.md_name, buf, sizeof (md.md_name)); + strlcpy(md.md_name, buf, sizeof(md.md_name)); } else { - strlcpy(md.md_name, sc->sc_name, sizeof (md.md_name)); + strlcpy(md.md_name, sc->sc_name, sizeof(md.md_name)); } } @@ -586,9 +568,8 @@ g_multipath_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) KASSERT(sc != NULL, ("sc is NULL")); error = g_multipath_add_disk(gp, pp); if (error != 0) { - if (isnew) { + if (isnew) g_multipath_destroy(gp); - } return (NULL); } return (gp); @@ -627,9 +608,8 @@ g_multipath_ctl_create(struct gctl_req *req, struct g_class *mp) gctl_error(req, "No 'arg1' argument"); return; } - if (strncmp(name, devpf, 5) == 0) { + if (strncmp(name, devpf, 5) == 0) name += 5; - } pp0 = g_provider_by_name(name); if (pp0 == NULL) { gctl_error(req, "Provider %s is invalid", name); @@ -641,9 +621,8 @@ g_multipath_ctl_create(struct gctl_req *req, struct g_class *mp) gctl_error(req, "No 'arg2' argument"); return; } - if (strncmp(name, devpf, 5) == 0) { + if (strncmp(name, devpf, 5) == 0) name += 5; - } pp1 = g_provider_by_name(name); if (pp1 == NULL) { gctl_error(req, "Provider %s is invalid", name); @@ -687,13 +666,12 @@ g_multipath_ctl_create(struct gctl_req *req, struct g_class *mp) memset(&md, 0, sizeof(md)); md.md_size = pp0->mediasize; md.md_sectorsize = pp0->sectorsize; - strncpy(md.md_name, mpname, sizeof (md.md_name)); - strncpy(md.md_uuid, uuid, sizeof (md.md_uuid)); + strlcpy(md.md_name, mpname, sizeof(md.md_name)); + strlcpy(md.md_uuid, uuid, sizeof(md.md_uuid)); gp = g_multipath_create(mp, &md); - if (gp == NULL) { + if (gp == NULL) return; - } error = g_multipath_add_disk(gp, pp0); if (error) { g_multipath_destroy(gp); diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c index 6e81a9c70b68..0434ace0cfe1 100644 --- a/sys/geom/part/g_part.c +++ b/sys/geom/part/g_part.c @@ -69,7 +69,13 @@ struct g_part_alias_list { const char *lexeme; enum g_part_alias alias; } g_part_alias_list[G_PART_ALIAS_COUNT] = { + { "apple-boot", G_PART_ALIAS_APPLE_BOOT }, { "apple-hfs", G_PART_ALIAS_APPLE_HFS }, + { "apple-label", G_PART_ALIAS_APPLE_LABEL }, + { "apple-raid", G_PART_ALIAS_APPLE_RAID }, + { "apple-raid-offline", G_PART_ALIAS_APPLE_RAID_OFFLINE }, + { "apple-tv-recovery", G_PART_ALIAS_APPLE_TV_RECOVERY }, + { "apple-ufs", G_PART_ALIAS_APPLE_UFS }, { "efi", G_PART_ALIAS_EFI }, { "freebsd", G_PART_ALIAS_FREEBSD }, { "freebsd-boot", G_PART_ALIAS_FREEBSD_BOOT }, @@ -77,6 +83,20 @@ struct g_part_alias_list { { "freebsd-ufs", G_PART_ALIAS_FREEBSD_UFS }, { "freebsd-vinum", G_PART_ALIAS_FREEBSD_VINUM }, { "freebsd-zfs", G_PART_ALIAS_FREEBSD_ZFS }, + { "linux-data", G_PART_ALIAS_LINUX_DATA }, + { "linux-lvm", G_PART_ALIAS_LINUX_LVM }, + { "linux-raid", G_PART_ALIAS_LINUX_RAID }, + { "linux-swap", G_PART_ALIAS_LINUX_SWAP }, + { "ms-basic-data", G_PART_ALIAS_MS_BASIC_DATA }, + { "ms-ldm-data", G_PART_ALIAS_MS_LDM_DATA }, + { "ms-ldm-metadata", G_PART_ALIAS_MS_LDM_METADATA }, + { "ms-reserved", G_PART_ALIAS_MS_RESERVED }, + { "netbsd-ccd", G_PART_ALIAS_NETBSD_CCD }, + { "netbsd-cgd", G_PART_ALIAS_NETBSD_CGD }, + { "netbsd-ffs", G_PART_ALIAS_NETBSD_FFS }, + { "netbsd-lfs", G_PART_ALIAS_NETBSD_LFS }, + { "netbsd-raid", G_PART_ALIAS_NETBSD_RAID }, + { "netbsd-swap", G_PART_ALIAS_NETBSD_SWAP }, { "mbr", G_PART_ALIAS_MBR } }; @@ -268,11 +288,10 @@ g_part_new_provider(struct g_geom *gp, struct g_part_table *table, entry->gpe_pp->mediasize -= entry->gpe_offset - offset; entry->gpe_pp->sectorsize = pp->sectorsize; entry->gpe_pp->flags = pp->flags & G_PF_CANDELETE; - if (pp->stripesize > 0) { - entry->gpe_pp->stripesize = pp->stripesize; - entry->gpe_pp->stripeoffset = (pp->stripeoffset + - entry->gpe_offset) % pp->stripesize; - } + entry->gpe_pp->stripesize = pp->stripesize; + entry->gpe_pp->stripeoffset = pp->stripeoffset + entry->gpe_offset; + if (pp->stripesize > 0) + entry->gpe_pp->stripeoffset %= pp->stripesize; g_error_provider(entry->gpe_pp, 0); } @@ -1459,6 +1478,10 @@ g_part_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) G_PART_TRACE((G_T_TOPOLOGY, "%s(%s,%s)", __func__, mp->name, pp->name)); g_topology_assert(); + /* Skip providers that are already open for writing. */ + if (pp->acw > 0) + return (NULL); + /* * Create a GEOM with consumer and hook it up to the provider. * With that we become part of the topology. Optain read access diff --git a/sys/geom/part/g_part.h b/sys/geom/part/g_part.h index 504d8aef4741..e146cba61162 100644 --- a/sys/geom/part/g_part.h +++ b/sys/geom/part/g_part.h @@ -36,7 +36,13 @@ #define G_PART_PROBE_PRI_HIGH 0 enum g_part_alias { - G_PART_ALIAS_APPLE_HFS, /* An HFS file system entry. */ + G_PART_ALIAS_APPLE_BOOT, /* An Apple boot partition entry. */ + G_PART_ALIAS_APPLE_HFS, /* An HFS+ file system entry. */ + G_PART_ALIAS_APPLE_LABEL, /* An Apple label partition entry. */ + G_PART_ALIAS_APPLE_RAID, /* An Apple RAID partition entry. */ + G_PART_ALIAS_APPLE_RAID_OFFLINE,/* An Apple RAID (offline) part entry.*/ + G_PART_ALIAS_APPLE_TV_RECOVERY, /* An Apple TV recovery part entry. */ + G_PART_ALIAS_APPLE_UFS, /* An Apple UFS partition entry. */ G_PART_ALIAS_EFI, /* A EFI system partition entry. */ G_PART_ALIAS_FREEBSD, /* A BSD labeled partition entry. */ G_PART_ALIAS_FREEBSD_BOOT, /* A FreeBSD boot partition entry. */ @@ -45,6 +51,20 @@ enum g_part_alias { G_PART_ALIAS_FREEBSD_VINUM, /* A Vinum partition entry. */ G_PART_ALIAS_FREEBSD_ZFS, /* A ZFS file system entry. */ G_PART_ALIAS_MBR, /* A MBR (extended) partition entry. */ + G_PART_ALIAS_LINUX_DATA, /* A Linux data partition entry. */ + G_PART_ALIAS_LINUX_LVM, /* A Linux LVM partition entry. */ + G_PART_ALIAS_LINUX_RAID, /* A Linux RAID partition entry. */ + G_PART_ALIAS_LINUX_SWAP, /* A Linux swap partition entry. */ + G_PART_ALIAS_MS_BASIC_DATA, /* A Microsoft Data part. entry. */ + G_PART_ALIAS_MS_LDM_DATA, /* A Microsoft LDM Data part. entry. */ + G_PART_ALIAS_MS_LDM_METADATA, /* A Microsoft LDM Metadata entry. */ + G_PART_ALIAS_MS_RESERVED, /* A Microsoft Reserved part. entry. */ + G_PART_ALIAS_NETBSD_CCD, /* A NetBSD CCD partition entry. */ + G_PART_ALIAS_NETBSD_CGD, /* A NetBSD CGD partition entry. */ + G_PART_ALIAS_NETBSD_FFS, /* A NetBSD FFS partition entry. */ + G_PART_ALIAS_NETBSD_RAID, /* A NetBSD RAID partition entry. */ + G_PART_ALIAS_NETBSD_SWAP, /* A NetBSD swap partition entry. */ + G_PART_ALIAS_NETBSD_LFS, /* A NetBSD LFS partition entry. */ /* Keep the following last */ G_PART_ALIAS_COUNT }; diff --git a/sys/geom/part/g_part_bsd.c b/sys/geom/part/g_part_bsd.c index b476bfd83ece..18a74aa0c795 100644 --- a/sys/geom/part/g_part_bsd.c +++ b/sys/geom/part/g_part_bsd.c @@ -186,7 +186,6 @@ g_part_bsd_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp) static int g_part_bsd_create(struct g_part_table *basetable, struct g_part_parms *gpp) { - struct g_consumer *cp; struct g_provider *pp; struct g_part_entry *baseentry; struct g_part_bsd_entry *entry; @@ -195,7 +194,6 @@ g_part_bsd_create(struct g_part_table *basetable, struct g_part_parms *gpp) uint32_t msize, ncyls, secpercyl; pp = gpp->gpp_provider; - cp = LIST_FIRST(&pp->consumers); if (pp->sectorsize < sizeof(struct disklabel)) return (ENOSPC); diff --git a/sys/geom/part/g_part_ebr.c b/sys/geom/part/g_part_ebr.c index ab04866cfd20..b107e6120c07 100644 --- a/sys/geom/part/g_part_ebr.c +++ b/sys/geom/part/g_part_ebr.c @@ -410,13 +410,13 @@ g_part_ebr_probe(struct g_part_table *table, struct g_consumer *cp) goto out; /* - * The sector is all zeroes, except for the partition entries - * and some signatures or disk serial number. Those can be - * found in the 9 bytes immediately in front of the partition - * table. + * The sector is all zeroes, except for the partition entries, + * pseudo boot code and some signatures or disk serial number. + * The latter can be found in the 9 bytes immediately in front + * of the partition table. */ sum = 0; - for (index = 0; index < DOSPARTOFF - 9; index++) + for (index = 96; index < DOSPARTOFF - 9; index++) sum += buf[index]; if (sum != 0) goto out; diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c index 61f9c7aa2578..b0c959852b65 100644 --- a/sys/geom/part/g_part_gpt.c +++ b/sys/geom/part/g_part_gpt.c @@ -73,7 +73,7 @@ enum gpt_state { struct g_part_gpt_table { struct g_part_table base; u_char mbr[MBRSIZE]; - struct gpt_hdr hdr; + struct gpt_hdr *hdr; quad_t lba[GPT_ELT_COUNT]; enum gpt_state state[GPT_ELT_COUNT]; }; @@ -131,7 +131,13 @@ static struct g_part_scheme g_part_gpt_scheme = { }; G_PART_SCHEME_DECLARE(g_part_gpt); +static struct uuid gpt_uuid_apple_boot = GPT_ENT_TYPE_APPLE_BOOT; static struct uuid gpt_uuid_apple_hfs = GPT_ENT_TYPE_APPLE_HFS; +static struct uuid gpt_uuid_apple_label = GPT_ENT_TYPE_APPLE_LABEL; +static struct uuid gpt_uuid_apple_raid = GPT_ENT_TYPE_APPLE_RAID; +static struct uuid gpt_uuid_apple_raid_offline = GPT_ENT_TYPE_APPLE_RAID_OFFLINE; +static struct uuid gpt_uuid_apple_tv_recovery = GPT_ENT_TYPE_APPLE_TV_RECOVERY; +static struct uuid gpt_uuid_apple_ufs = GPT_ENT_TYPE_APPLE_UFS; static struct uuid gpt_uuid_efi = GPT_ENT_TYPE_EFI; static struct uuid gpt_uuid_freebsd = GPT_ENT_TYPE_FREEBSD; static struct uuid gpt_uuid_freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT; @@ -139,17 +145,66 @@ static struct uuid gpt_uuid_freebsd_swap = GPT_ENT_TYPE_FREEBSD_SWAP; static struct uuid gpt_uuid_freebsd_ufs = GPT_ENT_TYPE_FREEBSD_UFS; static struct uuid gpt_uuid_freebsd_vinum = GPT_ENT_TYPE_FREEBSD_VINUM; static struct uuid gpt_uuid_freebsd_zfs = GPT_ENT_TYPE_FREEBSD_ZFS; +static struct uuid gpt_uuid_linux_data = GPT_ENT_TYPE_LINUX_DATA; +static struct uuid gpt_uuid_linux_lvm = GPT_ENT_TYPE_LINUX_LVM; +static struct uuid gpt_uuid_linux_raid = GPT_ENT_TYPE_LINUX_RAID; static struct uuid gpt_uuid_linux_swap = GPT_ENT_TYPE_LINUX_SWAP; +static struct uuid gpt_uuid_ms_basic_data = GPT_ENT_TYPE_MS_BASIC_DATA; +static struct uuid gpt_uuid_ms_reserved = GPT_ENT_TYPE_MS_RESERVED; +static struct uuid gpt_uuid_ms_ldm_data = GPT_ENT_TYPE_MS_LDM_DATA; +static struct uuid gpt_uuid_ms_ldm_metadata = GPT_ENT_TYPE_MS_LDM_METADATA; +static struct uuid gpt_uuid_netbsd_ccd = GPT_ENT_TYPE_NETBSD_CCD; +static struct uuid gpt_uuid_netbsd_cgd = GPT_ENT_TYPE_NETBSD_CGD; +static struct uuid gpt_uuid_netbsd_ffs = GPT_ENT_TYPE_NETBSD_FFS; +static struct uuid gpt_uuid_netbsd_lfs = GPT_ENT_TYPE_NETBSD_LFS; +static struct uuid gpt_uuid_netbsd_raid = GPT_ENT_TYPE_NETBSD_RAID; +static struct uuid gpt_uuid_netbsd_swap = GPT_ENT_TYPE_NETBSD_SWAP; static struct uuid gpt_uuid_mbr = GPT_ENT_TYPE_MBR; static struct uuid gpt_uuid_unused = GPT_ENT_TYPE_UNUSED; -static void +static struct g_part_uuid_alias { + struct uuid *uuid; + int alias; +} gpt_uuid_alias_match[] = { + { &gpt_uuid_apple_boot, G_PART_ALIAS_APPLE_BOOT }, + { &gpt_uuid_apple_hfs, G_PART_ALIAS_APPLE_HFS }, + { &gpt_uuid_apple_label, G_PART_ALIAS_APPLE_LABEL }, + { &gpt_uuid_apple_raid, G_PART_ALIAS_APPLE_RAID }, + { &gpt_uuid_apple_raid_offline, G_PART_ALIAS_APPLE_RAID_OFFLINE }, + { &gpt_uuid_apple_tv_recovery, G_PART_ALIAS_APPLE_TV_RECOVERY }, + { &gpt_uuid_apple_ufs, G_PART_ALIAS_APPLE_UFS }, + { &gpt_uuid_efi, G_PART_ALIAS_EFI }, + { &gpt_uuid_freebsd, G_PART_ALIAS_FREEBSD }, + { &gpt_uuid_freebsd_boot, G_PART_ALIAS_FREEBSD_BOOT }, + { &gpt_uuid_freebsd_swap, G_PART_ALIAS_FREEBSD_SWAP }, + { &gpt_uuid_freebsd_ufs, G_PART_ALIAS_FREEBSD_UFS }, + { &gpt_uuid_freebsd_vinum, G_PART_ALIAS_FREEBSD_VINUM }, + { &gpt_uuid_freebsd_zfs, G_PART_ALIAS_FREEBSD_ZFS }, + { &gpt_uuid_linux_data, G_PART_ALIAS_LINUX_DATA }, + { &gpt_uuid_linux_lvm, G_PART_ALIAS_LINUX_LVM }, + { &gpt_uuid_linux_raid, G_PART_ALIAS_LINUX_RAID }, + { &gpt_uuid_linux_swap, G_PART_ALIAS_LINUX_SWAP }, + { &gpt_uuid_mbr, G_PART_ALIAS_MBR }, + { &gpt_uuid_ms_basic_data, G_PART_ALIAS_MS_BASIC_DATA }, + { &gpt_uuid_ms_ldm_data, G_PART_ALIAS_MS_LDM_DATA }, + { &gpt_uuid_ms_ldm_metadata, G_PART_ALIAS_MS_LDM_METADATA }, + { &gpt_uuid_ms_reserved, G_PART_ALIAS_MS_RESERVED }, + { &gpt_uuid_netbsd_ccd, G_PART_ALIAS_NETBSD_CCD }, + { &gpt_uuid_netbsd_cgd, G_PART_ALIAS_NETBSD_CGD }, + { &gpt_uuid_netbsd_ffs, G_PART_ALIAS_NETBSD_FFS }, + { &gpt_uuid_netbsd_lfs, G_PART_ALIAS_NETBSD_LFS }, + { &gpt_uuid_netbsd_raid, G_PART_ALIAS_NETBSD_RAID }, + { &gpt_uuid_netbsd_swap, G_PART_ALIAS_NETBSD_SWAP }, + + { NULL, 0 } +}; + +static struct gpt_hdr * gpt_read_hdr(struct g_part_gpt_table *table, struct g_consumer *cp, - enum gpt_elt elt, struct gpt_hdr *hdr) + enum gpt_elt elt) { - struct uuid uuid; + struct gpt_hdr *buf, *hdr; struct g_provider *pp; - char *buf; quad_t lba, last; int error; uint32_t crc, sz; @@ -161,63 +216,75 @@ gpt_read_hdr(struct g_part_gpt_table *table, struct g_consumer *cp, buf = g_read_data(cp, table->lba[elt] * pp->sectorsize, pp->sectorsize, &error); if (buf == NULL) - return; - bcopy(buf, hdr, sizeof(*hdr)); - if (memcmp(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)) != 0) - return; + return (NULL); + hdr = NULL; + if (memcmp(buf->hdr_sig, GPT_HDR_SIG, sizeof(buf->hdr_sig)) != 0) + goto fail; table->state[elt] = GPT_STATE_CORRUPT; - sz = le32toh(hdr->hdr_size); + sz = le32toh(buf->hdr_size); if (sz < 92 || sz > pp->sectorsize) - return; - crc = le32toh(hdr->hdr_crc_self); - hdr->hdr_crc_self = 0; - if (crc32(hdr, sz) != crc) - return; + goto fail; + + hdr = g_malloc(sz, M_WAITOK | M_ZERO); + bcopy(buf, hdr, sz); hdr->hdr_size = sz; + + crc = le32toh(buf->hdr_crc_self); + buf->hdr_crc_self = 0; + if (crc32(buf, sz) != crc) + goto fail; hdr->hdr_crc_self = crc; table->state[elt] = GPT_STATE_INVALID; - hdr->hdr_revision = le32toh(hdr->hdr_revision); + hdr->hdr_revision = le32toh(buf->hdr_revision); if (hdr->hdr_revision < 0x00010000) - return; - hdr->hdr_lba_self = le64toh(hdr->hdr_lba_self); + goto fail; + hdr->hdr_lba_self = le64toh(buf->hdr_lba_self); if (hdr->hdr_lba_self != table->lba[elt]) - return; - hdr->hdr_lba_alt = le64toh(hdr->hdr_lba_alt); + goto fail; + hdr->hdr_lba_alt = le64toh(buf->hdr_lba_alt); /* Check the managed area. */ - hdr->hdr_lba_start = le64toh(hdr->hdr_lba_start); + hdr->hdr_lba_start = le64toh(buf->hdr_lba_start); if (hdr->hdr_lba_start < 2 || hdr->hdr_lba_start >= last) - return; - hdr->hdr_lba_end = le64toh(hdr->hdr_lba_end); + goto fail; + hdr->hdr_lba_end = le64toh(buf->hdr_lba_end); if (hdr->hdr_lba_end < hdr->hdr_lba_start || hdr->hdr_lba_end >= last) - return; + goto fail; /* Check the table location and size of the table. */ - hdr->hdr_entries = le32toh(hdr->hdr_entries); - hdr->hdr_entsz = le32toh(hdr->hdr_entsz); + hdr->hdr_entries = le32toh(buf->hdr_entries); + hdr->hdr_entsz = le32toh(buf->hdr_entsz); if (hdr->hdr_entries == 0 || hdr->hdr_entsz < 128 || (hdr->hdr_entsz & 7) != 0) - return; - hdr->hdr_lba_table = le64toh(hdr->hdr_lba_table); + goto fail; + hdr->hdr_lba_table = le64toh(buf->hdr_lba_table); if (hdr->hdr_lba_table < 2 || hdr->hdr_lba_table >= last) - return; + goto fail; if (hdr->hdr_lba_table >= hdr->hdr_lba_start && hdr->hdr_lba_table <= hdr->hdr_lba_end) - return; + goto fail; lba = hdr->hdr_lba_table + (hdr->hdr_entries * hdr->hdr_entsz + pp->sectorsize - 1) / pp->sectorsize - 1; if (lba >= last) - return; + goto fail; if (lba >= hdr->hdr_lba_start && lba <= hdr->hdr_lba_end) - return; + goto fail; table->state[elt] = GPT_STATE_OK; - le_uuid_dec(&hdr->hdr_uuid, &uuid); - hdr->hdr_uuid = uuid; - hdr->hdr_crc_table = le32toh(hdr->hdr_crc_table); + le_uuid_dec(&buf->hdr_uuid, &hdr->hdr_uuid); + hdr->hdr_crc_table = le32toh(buf->hdr_crc_table); + + g_free(buf); + return (hdr); + + fail: + if (hdr != NULL) + g_free(hdr); + g_free(buf); + return (NULL); } static struct gpt_ent * @@ -230,6 +297,9 @@ gpt_read_tbl(struct g_part_gpt_table *table, struct g_consumer *cp, unsigned int idx, sectors, tblsz; int error; + if (hdr == NULL) + return (NULL); + pp = cp->provider; table->lba[elt] = hdr->hdr_lba_table; @@ -271,6 +341,9 @@ static int gpt_matched_hdrs(struct gpt_hdr *pri, struct gpt_hdr *sec) { + if (pri == NULL || sec == NULL) + return (0); + if (!EQUUID(&pri->hdr_uuid, &sec->hdr_uuid)) return (0); return ((pri->hdr_revision == sec->hdr_revision && @@ -288,6 +361,7 @@ gpt_parse_type(const char *type, struct uuid *uuid) struct uuid tmp; const char *alias; int error; + struct g_part_uuid_alias *uap; if (type[0] == '!') { error = parse_uuid(type + 1, &tmp); @@ -298,50 +372,12 @@ gpt_parse_type(const char *type, struct uuid *uuid) *uuid = tmp; return (0); } - alias = g_part_alias_name(G_PART_ALIAS_EFI); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_efi; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_FREEBSD); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_freebsd; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_BOOT); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_freebsd_boot; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_freebsd_swap; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_UFS); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_freebsd_ufs; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_VINUM); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_freebsd_vinum; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_FREEBSD_ZFS); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_freebsd_zfs; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_MBR); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_mbr; - return (0); - } - alias = g_part_alias_name(G_PART_ALIAS_APPLE_HFS); - if (!strcasecmp(type, alias)) { - *uuid = gpt_uuid_apple_hfs; - return (0); + for (uap = &gpt_uuid_alias_match[0]; uap->uuid; uap++) { + alias = g_part_alias_name(uap->alias); + if (!strcasecmp(type, alias)) { + *uuid = *uap->uuid; + return (0); + } } return (EINVAL); } @@ -382,6 +418,9 @@ g_part_gpt_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp) codesz = MIN(codesz, gpp->gpp_codesize); if (codesz > 0) bcopy(gpp->gpp_codeptr, table->mbr, codesz); + + /* Mark the PMBR active since some BIOS require it */ + table->mbr[DOSPARTOFF] = 0x80; /* status */ return (0); } @@ -424,17 +463,20 @@ g_part_gpt_create(struct g_part_table *basetable, struct g_part_parms *gpp) table->lba[GPT_ELT_SECHDR] = last; table->lba[GPT_ELT_SECTBL] = last - tblsz; - bcopy(GPT_HDR_SIG, table->hdr.hdr_sig, sizeof(table->hdr.hdr_sig)); - table->hdr.hdr_revision = GPT_HDR_REVISION; - table->hdr.hdr_size = offsetof(struct gpt_hdr, padding); - table->hdr.hdr_lba_start = 2 + tblsz; - table->hdr.hdr_lba_end = last - tblsz - 1; - kern_uuidgen(&table->hdr.hdr_uuid, 1); - table->hdr.hdr_entries = basetable->gpt_entries; - table->hdr.hdr_entsz = sizeof(struct gpt_ent); + /* Allocate space for the header */ + table->hdr = g_malloc(sizeof(struct gpt_hdr), M_WAITOK | M_ZERO); - basetable->gpt_first = table->hdr.hdr_lba_start; - basetable->gpt_last = table->hdr.hdr_lba_end; + bcopy(GPT_HDR_SIG, table->hdr->hdr_sig, sizeof(table->hdr->hdr_sig)); + table->hdr->hdr_revision = GPT_HDR_REVISION; + table->hdr->hdr_size = offsetof(struct gpt_hdr, padding); + table->hdr->hdr_lba_start = 2 + tblsz; + table->hdr->hdr_lba_end = last - tblsz - 1; + kern_uuidgen(&table->hdr->hdr_uuid, 1); + table->hdr->hdr_entries = basetable->gpt_entries; + table->hdr->hdr_entsz = sizeof(struct gpt_ent); + + basetable->gpt_first = table->hdr->hdr_lba_start; + basetable->gpt_last = table->hdr->hdr_lba_end; return (0); } @@ -471,6 +513,9 @@ g_part_gpt_dumpconf(struct g_part_table *table, struct g_part_entry *baseentry, sbuf_printf(sb, "%s", indent); sbuf_printf_uuid(sb, &entry->ent.ent_type); sbuf_printf(sb, "\n"); + sbuf_printf(sb, "%s", indent); + sbuf_printf_uuid(sb, &entry->ent.ent_uuid); + sbuf_printf(sb, "\n"); } else { /* confxml: scheme information */ } @@ -579,7 +624,7 @@ g_part_gpt_probe(struct g_part_table *table, struct g_consumer *cp) static int g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp) { - struct gpt_hdr prihdr, sechdr; + struct gpt_hdr *prihdr, *sechdr; struct gpt_ent *tbl, *pritbl, *sectbl; struct g_provider *pp; struct g_part_gpt_table *table; @@ -598,18 +643,18 @@ g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp) g_free(buf); /* Read the primary header and table. */ - gpt_read_hdr(table, cp, GPT_ELT_PRIHDR, &prihdr); + prihdr = gpt_read_hdr(table, cp, GPT_ELT_PRIHDR); if (table->state[GPT_ELT_PRIHDR] == GPT_STATE_OK) { - pritbl = gpt_read_tbl(table, cp, GPT_ELT_PRITBL, &prihdr); + pritbl = gpt_read_tbl(table, cp, GPT_ELT_PRITBL, prihdr); } else { table->state[GPT_ELT_PRITBL] = GPT_STATE_MISSING; pritbl = NULL; } /* Read the secondary header and table. */ - gpt_read_hdr(table, cp, GPT_ELT_SECHDR, &sechdr); + sechdr = gpt_read_hdr(table, cp, GPT_ELT_SECHDR); if (table->state[GPT_ELT_SECHDR] == GPT_STATE_OK) { - sectbl = gpt_read_tbl(table, cp, GPT_ELT_SECTBL, &sechdr); + sectbl = gpt_read_tbl(table, cp, GPT_ELT_SECTBL, sechdr); } else { table->state[GPT_ELT_SECTBL] = GPT_STATE_MISSING; sectbl = NULL; @@ -632,13 +677,17 @@ g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp) */ if (table->state[GPT_ELT_PRIHDR] == GPT_STATE_OK && table->state[GPT_ELT_SECHDR] == GPT_STATE_OK && - !gpt_matched_hdrs(&prihdr, &sechdr)) { + !gpt_matched_hdrs(prihdr, sechdr)) { if (table->state[GPT_ELT_PRITBL] == GPT_STATE_OK) { table->state[GPT_ELT_SECHDR] = GPT_STATE_INVALID; table->state[GPT_ELT_SECTBL] = GPT_STATE_MISSING; + g_free(sechdr); + sechdr = NULL; } else { table->state[GPT_ELT_PRIHDR] = GPT_STATE_INVALID; table->state[GPT_ELT_PRITBL] = GPT_STATE_MISSING; + g_free(prihdr); + prihdr = NULL; } } @@ -648,6 +697,8 @@ g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp) printf("GEOM: %s: using the secondary instead -- recovery " "strongly advised.\n", pp->name); table->hdr = sechdr; + if (prihdr != NULL) + g_free(prihdr); tbl = sectbl; if (pritbl != NULL) g_free(pritbl); @@ -659,14 +710,16 @@ g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp) "suggested.\n", pp->name); } table->hdr = prihdr; + if (sechdr != NULL) + g_free(sechdr); tbl = pritbl; if (sectbl != NULL) g_free(sectbl); } - basetable->gpt_first = table->hdr.hdr_lba_start; - basetable->gpt_last = table->hdr.hdr_lba_end; - basetable->gpt_entries = table->hdr.hdr_entries; + basetable->gpt_first = table->hdr->hdr_lba_start; + basetable->gpt_last = table->hdr->hdr_lba_end; + basetable->gpt_entries = table->hdr->hdr_entries; for (index = basetable->gpt_entries - 1; index >= 0; index--) { if (EQUUID(&tbl[index].ent_type, &gpt_uuid_unused)) @@ -686,27 +739,16 @@ g_part_gpt_type(struct g_part_table *basetable, struct g_part_entry *baseentry, { struct g_part_gpt_entry *entry; struct uuid *type; + struct g_part_uuid_alias *uap; entry = (struct g_part_gpt_entry *)baseentry; type = &entry->ent.ent_type; - if (EQUUID(type, &gpt_uuid_efi)) - return (g_part_alias_name(G_PART_ALIAS_EFI)); - if (EQUUID(type, &gpt_uuid_freebsd)) - return (g_part_alias_name(G_PART_ALIAS_FREEBSD)); - if (EQUUID(type, &gpt_uuid_freebsd_boot)) - return (g_part_alias_name(G_PART_ALIAS_FREEBSD_BOOT)); - if (EQUUID(type, &gpt_uuid_freebsd_swap)) - return (g_part_alias_name(G_PART_ALIAS_FREEBSD_SWAP)); - if (EQUUID(type, &gpt_uuid_freebsd_ufs)) - return (g_part_alias_name(G_PART_ALIAS_FREEBSD_UFS)); - if (EQUUID(type, &gpt_uuid_freebsd_vinum)) - return (g_part_alias_name(G_PART_ALIAS_FREEBSD_VINUM)); - if (EQUUID(type, &gpt_uuid_freebsd_zfs)) - return (g_part_alias_name(G_PART_ALIAS_FREEBSD_ZFS)); - if (EQUUID(type, &gpt_uuid_mbr)) - return (g_part_alias_name(G_PART_ALIAS_MBR)); + for (uap = &gpt_uuid_alias_match[0]; uap->uuid; uap++) + if (EQUUID(type, uap->uuid)) + return (g_part_alias_name(uap->alias)); buf[0] = '!'; snprintf_uuid(buf + 1, bufsz - 1, type); + return (buf); } @@ -724,7 +766,7 @@ g_part_gpt_write(struct g_part_table *basetable, struct g_consumer *cp) pp = cp->provider; table = (struct g_part_gpt_table *)basetable; - tlbsz = (table->hdr.hdr_entries * table->hdr.hdr_entsz + + tlbsz = (table->hdr->hdr_entries * table->hdr->hdr_entsz + pp->sectorsize - 1) / pp->sectorsize; /* Write the PMBR */ @@ -738,21 +780,21 @@ g_part_gpt_write(struct g_part_table *basetable, struct g_consumer *cp) /* Allocate space for the header and entries. */ buf = g_malloc((tlbsz + 1) * pp->sectorsize, M_WAITOK | M_ZERO); - memcpy(buf, table->hdr.hdr_sig, sizeof(table->hdr.hdr_sig)); - le32enc(buf + 8, table->hdr.hdr_revision); - le32enc(buf + 12, table->hdr.hdr_size); - le64enc(buf + 40, table->hdr.hdr_lba_start); - le64enc(buf + 48, table->hdr.hdr_lba_end); - le_uuid_enc(buf + 56, &table->hdr.hdr_uuid); - le32enc(buf + 80, table->hdr.hdr_entries); - le32enc(buf + 84, table->hdr.hdr_entsz); + memcpy(buf, table->hdr->hdr_sig, sizeof(table->hdr->hdr_sig)); + le32enc(buf + 8, table->hdr->hdr_revision); + le32enc(buf + 12, table->hdr->hdr_size); + le64enc(buf + 40, table->hdr->hdr_lba_start); + le64enc(buf + 48, table->hdr->hdr_lba_end); + le_uuid_enc(buf + 56, &table->hdr->hdr_uuid); + le32enc(buf + 80, table->hdr->hdr_entries); + le32enc(buf + 84, table->hdr->hdr_entsz); LIST_FOREACH(baseentry, &basetable->gpt_entry, gpe_entry) { if (baseentry->gpe_deleted) continue; entry = (struct g_part_gpt_entry *)baseentry; index = baseentry->gpe_index - 1; - bp = buf + pp->sectorsize + table->hdr.hdr_entsz * index; + bp = buf + pp->sectorsize + table->hdr->hdr_entsz * index; le_uuid_enc(bp, &entry->ent.ent_type); le_uuid_enc(bp + 16, &entry->ent.ent_uuid); le64enc(bp + 32, entry->ent.ent_lba_start); @@ -763,7 +805,7 @@ g_part_gpt_write(struct g_part_table *basetable, struct g_consumer *cp) } crc = crc32(buf + pp->sectorsize, - table->hdr.hdr_entries * table->hdr.hdr_entsz); + table->hdr->hdr_entries * table->hdr->hdr_entsz); le32enc(buf + 88, crc); /* Write primary meta-data. */ @@ -771,7 +813,7 @@ g_part_gpt_write(struct g_part_table *basetable, struct g_consumer *cp) le64enc(buf + 24, table->lba[GPT_ELT_PRIHDR]); /* hdr_lba_self. */ le64enc(buf + 32, table->lba[GPT_ELT_SECHDR]); /* hdr_lba_alt. */ le64enc(buf + 72, table->lba[GPT_ELT_PRITBL]); /* hdr_lba_table. */ - crc = crc32(buf, table->hdr.hdr_size); + crc = crc32(buf, table->hdr->hdr_size); le32enc(buf + 16, crc); error = g_write_data(cp, table->lba[GPT_ELT_PRITBL] * pp->sectorsize, @@ -788,7 +830,7 @@ g_part_gpt_write(struct g_part_table *basetable, struct g_consumer *cp) le64enc(buf + 24, table->lba[GPT_ELT_SECHDR]); /* hdr_lba_self. */ le64enc(buf + 32, table->lba[GPT_ELT_PRIHDR]); /* hdr_lba_alt. */ le64enc(buf + 72, table->lba[GPT_ELT_SECTBL]); /* hdr_lba_table. */ - crc = crc32(buf, table->hdr.hdr_size); + crc = crc32(buf, table->hdr->hdr_size); le32enc(buf + 16, crc); error = g_write_data(cp, table->lba[GPT_ELT_SECTBL] * pp->sectorsize, diff --git a/sys/geom/part/g_part_vtoc8.c b/sys/geom/part/g_part_vtoc8.c index 0f9c283c2671..0108e97a0938 100644 --- a/sys/geom/part/g_part_vtoc8.c +++ b/sys/geom/part/g_part_vtoc8.c @@ -177,7 +177,6 @@ g_part_vtoc8_add(struct g_part_table *basetable, struct g_part_entry *entry, static int g_part_vtoc8_create(struct g_part_table *basetable, struct g_part_parms *gpp) { - struct g_consumer *cp; struct g_provider *pp; struct g_part_entry *entry; struct g_part_vtoc8_table *table; @@ -185,7 +184,6 @@ g_part_vtoc8_create(struct g_part_table *basetable, struct g_part_parms *gpp) uint32_t acyls, ncyls, pcyls; pp = gpp->gpp_provider; - cp = LIST_FIRST(&pp->consumers); if (pp->sectorsize < sizeof(struct vtoc8)) return (ENOSPC); diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c index 1cbce257b59f..08792fe35993 100644 --- a/sys/geom/raid3/g_raid3.c +++ b/sys/geom/raid3/g_raid3.c @@ -183,15 +183,17 @@ static void * g_raid3_alloc(struct g_raid3_softc *sc, size_t size, int flags) { void *ptr; + enum g_raid3_zones zone; - if (g_raid3_use_malloc) + if (g_raid3_use_malloc || + (zone = g_raid3_zone(size)) == G_RAID3_NUM_ZONES) ptr = malloc(size, M_RAID3, flags); else { - ptr = uma_zalloc_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone, - &sc->sc_zones[g_raid3_zone(size)], flags); - sc->sc_zones[g_raid3_zone(size)].sz_requested++; + ptr = uma_zalloc_arg(sc->sc_zones[zone].sz_zone, + &sc->sc_zones[zone], flags); + sc->sc_zones[zone].sz_requested++; if (ptr == NULL) - sc->sc_zones[g_raid3_zone(size)].sz_failed++; + sc->sc_zones[zone].sz_failed++; } return (ptr); } @@ -199,12 +201,14 @@ g_raid3_alloc(struct g_raid3_softc *sc, size_t size, int flags) static void g_raid3_free(struct g_raid3_softc *sc, void *ptr, size_t size) { + enum g_raid3_zones zone; - if (g_raid3_use_malloc) + if (g_raid3_use_malloc || + (zone = g_raid3_zone(size)) == G_RAID3_NUM_ZONES) free(ptr, M_RAID3); else { - uma_zfree_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone, - ptr, &sc->sc_zones[g_raid3_zone(size)]); + uma_zfree_arg(sc->sc_zones[zone].sz_zone, + ptr, &sc->sc_zones[zone]); } } @@ -227,31 +231,31 @@ g_raid3_uma_dtor(void *mem, int size, void *arg) sz->sz_inuse--; } -#define g_raid3_xor(src1, src2, dst, size) \ - _g_raid3_xor((uint64_t *)(src1), (uint64_t *)(src2), \ +#define g_raid3_xor(src, dst, size) \ + _g_raid3_xor((uint64_t *)(src), \ (uint64_t *)(dst), (size_t)size) static void -_g_raid3_xor(uint64_t *src1, uint64_t *src2, uint64_t *dst, size_t size) +_g_raid3_xor(uint64_t *src, uint64_t *dst, size_t size) { KASSERT((size % 128) == 0, ("Invalid size: %zu.", size)); for (; size > 0; size -= 128) { - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); - *dst++ = (*src1++) ^ (*src2++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); + *dst++ ^= (*src++); } } @@ -1045,6 +1049,7 @@ g_raid3_scatter(struct bio *pbp) struct g_raid3_disk *disk; struct bio *bp, *cbp, *tmpbp; off_t atom, cadd, padd, left; + int first; sc = pbp->bio_to->geom->softc; bp = NULL; @@ -1075,12 +1080,18 @@ g_raid3_scatter(struct bio *pbp) /* * Calculate parity. */ - bzero(bp->bio_data, bp->bio_length); + first = 1; G_RAID3_FOREACH_SAFE_BIO(pbp, cbp, tmpbp) { if (cbp == bp) continue; - g_raid3_xor(cbp->bio_data, bp->bio_data, bp->bio_data, - bp->bio_length); + if (first) { + bcopy(cbp->bio_data, bp->bio_data, + bp->bio_length); + first = 0; + } else { + g_raid3_xor(cbp->bio_data, bp->bio_data, + bp->bio_length); + } if ((cbp->bio_cflags & G_RAID3_BIO_CFLAG_NODISK) != 0) g_raid3_destroy_bio(sc, cbp); } @@ -1212,7 +1223,7 @@ g_raid3_gather(struct bio *pbp) G_RAID3_FOREACH_BIO(pbp, cbp) { if ((cbp->bio_cflags & G_RAID3_BIO_CFLAG_PARITY) != 0) continue; - g_raid3_xor(cbp->bio_data, xbp->bio_data, xbp->bio_data, + g_raid3_xor(cbp->bio_data, xbp->bio_data, xbp->bio_length); } xbp->bio_cflags &= ~G_RAID3_BIO_CFLAG_PARITY; @@ -1260,9 +1271,9 @@ g_raid3_done(struct bio *bp) G_RAID3_LOGREQ(3, bp, "Regular request done (error=%d).", bp->bio_error); mtx_lock(&sc->sc_queue_mtx); bioq_insert_head(&sc->sc_queue, bp); + mtx_unlock(&sc->sc_queue_mtx); wakeup(sc); wakeup(&sc->sc_queue); - mtx_unlock(&sc->sc_queue_mtx); } static void @@ -1368,9 +1379,9 @@ g_raid3_sync_done(struct bio *bp) bp->bio_cflags |= G_RAID3_BIO_CFLAG_SYNC; mtx_lock(&sc->sc_queue_mtx); bioq_insert_head(&sc->sc_queue, bp); + mtx_unlock(&sc->sc_queue_mtx); wakeup(sc); wakeup(&sc->sc_queue); - mtx_unlock(&sc->sc_queue_mtx); } static void @@ -1448,9 +1459,9 @@ g_raid3_start(struct bio *bp) } mtx_lock(&sc->sc_queue_mtx); bioq_insert_tail(&sc->sc_queue, bp); + mtx_unlock(&sc->sc_queue_mtx); G_RAID3_DEBUG(4, "%s: Waking up %p.", __func__, sc); wakeup(sc); - mtx_unlock(&sc->sc_queue_mtx); } /* @@ -1635,7 +1646,7 @@ g_raid3_sync_request(struct bio *bp) bcopy(src, dst, atom); src += atom; for (n = 1; n < sc->sc_ndisks - 1; n++) { - g_raid3_xor(src, dst, dst, atom); + g_raid3_xor(src, dst, atom); src += atom; } dst += atom; @@ -2313,6 +2324,8 @@ static void g_raid3_launch_provider(struct g_raid3_softc *sc) { struct g_provider *pp; + struct g_raid3_disk *disk; + int n; sx_assert(&sc->sc_lock, SX_LOCKED); @@ -2320,6 +2333,18 @@ g_raid3_launch_provider(struct g_raid3_softc *sc) pp = g_new_providerf(sc->sc_geom, "raid3/%s", sc->sc_name); pp->mediasize = sc->sc_mediasize; pp->sectorsize = sc->sc_sectorsize; + pp->stripesize = 0; + pp->stripeoffset = 0; + for (n = 0; n < sc->sc_ndisks; n++) { + disk = &sc->sc_disks[n]; + if (disk->d_consumer && disk->d_consumer->provider && + disk->d_consumer->provider->stripesize > pp->stripesize) { + pp->stripesize = disk->d_consumer->provider->stripesize; + pp->stripeoffset = disk->d_consumer->provider->stripeoffset; + } + } + pp->stripesize *= sc->sc_ndisks - 1; + pp->stripeoffset *= sc->sc_ndisks - 1; sc->sc_provider = pp; g_error_provider(pp, 0); g_topology_unlock(); diff --git a/sys/geom/raid3/g_raid3.h b/sys/geom/raid3/g_raid3.h index a37599999359..5daf16d2077b 100644 --- a/sys/geom/raid3/g_raid3.h +++ b/sys/geom/raid3/g_raid3.h @@ -183,7 +183,9 @@ enum g_raid3_zones { static __inline enum g_raid3_zones g_raid3_zone(size_t nbytes) { - if (nbytes > 16384) + if (nbytes > 65536) + return (G_RAID3_NUM_ZONES); + else if (nbytes > 16384) return (G_RAID3_ZONE_64K); else if (nbytes > 4096) return (G_RAID3_ZONE_16K); diff --git a/sys/geom/shsec/g_shsec.c b/sys/geom/shsec/g_shsec.c index 96650cf5a839..7be39bb648db 100644 --- a/sys/geom/shsec/g_shsec.c +++ b/sys/geom/shsec/g_shsec.c @@ -638,6 +638,10 @@ g_shsec_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name); g_topology_assert(); + /* Skip providers that are already open for writing. */ + if (pp->acw > 0) + return (NULL); + G_SHSEC_DEBUG(3, "Tasting %s.", pp->name); gp = g_new_geomf(mp, "shsec:taste"); diff --git a/sys/geom/stripe/g_stripe.c b/sys/geom/stripe/g_stripe.c index 17e258ce67b6..a79928471e6a 100644 --- a/sys/geom/stripe/g_stripe.c +++ b/sys/geom/stripe/g_stripe.c @@ -633,7 +633,7 @@ g_stripe_start(struct bio *bp) * Do use "economic" when: * 1. "Economic" mode is ON. * or - * 2. "Fast" mode failed. It can only failed if there is no memory. + * 2. "Fast" mode failed. It can only fail if there is no memory. */ if (!fast || error != 0) error = g_stripe_start_economic(bp, no, offset, length); @@ -675,6 +675,8 @@ g_stripe_check_and_run(struct g_stripe_softc *sc) } sc->sc_provider->sectorsize = sectorsize; sc->sc_provider->mediasize = mediasize * sc->sc_ndisks; + sc->sc_provider->stripesize = sc->sc_stripesize; + sc->sc_provider->stripeoffset = 0; g_error_provider(sc->sc_provider, 0); G_STRIPE_DEBUG(0, "Device %s activated.", sc->sc_name); @@ -912,6 +914,10 @@ g_stripe_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name); g_topology_assert(); + /* Skip providers that are already open for writing. */ + if (pp->acw > 0) + return (NULL); + G_STRIPE_DEBUG(3, "Tasting %s.", pp->name); gp = g_new_geomf(mp, "stripe:taste"); diff --git a/sys/geom/uzip/g_uzip.c b/sys/geom/uzip/g_uzip.c index 99d7c222afe2..2301efbe0e19 100644 --- a/sys/geom/uzip/g_uzip.c +++ b/sys/geom/uzip/g_uzip.c @@ -363,6 +363,11 @@ g_uzip_taste(struct g_class *mp, struct g_provider *pp, int flags) g_trace(G_T_TOPOLOGY, "g_uzip_taste(%s,%s)", mp->name, pp->name); g_topology_assert(); + + /* Skip providers that are already open for writing. */ + if (pp->acw > 0) + return (NULL); + buf = NULL; /* @@ -462,10 +467,8 @@ g_uzip_taste(struct g_class *mp, struct g_provider *pp, int flags) pp2->sectorsize = 512; pp2->mediasize = (off_t)sc->nblocks * sc->blksz; pp2->flags = pp->flags & G_PF_CANDELETE; - if (pp->stripesize > 0) { - pp2->stripesize = pp->stripesize; - pp2->stripeoffset = pp->stripeoffset; - } + pp2->stripesize = pp->stripesize; + pp2->stripeoffset = pp->stripeoffset; g_error_provider(pp2, 0); g_access(cp, -1, 0, 0); diff --git a/sys/geom/vinum/geom_vinum.c b/sys/geom/vinum/geom_vinum.c index 7b730bde00b7..b921a1beb58c 100644 --- a/sys/geom/vinum/geom_vinum.c +++ b/sys/geom/vinum/geom_vinum.c @@ -130,7 +130,6 @@ gv_access(struct g_provider *pp, int dr, int dw, int de) struct gv_drive *d, *d2; int error; - error = ENXIO; gp = pp->geom; sc = gp->softc; /* diff --git a/sys/geom/vinum/geom_vinum_create.c b/sys/geom/vinum/geom_vinum_create.c index 0ea0ef308bb6..1a4a920c5105 100644 --- a/sys/geom/vinum/geom_vinum_create.c +++ b/sys/geom/vinum/geom_vinum_create.c @@ -94,7 +94,7 @@ gv_create_drive(struct gv_softc *sc, struct gv_drive *d) if (g_attach(cp, pp) != 0) { g_destroy_consumer(cp); g_topology_unlock(); - G_VINUM_DEBUG(0, "create drive '%s': couldn't attach", + G_VINUM_DEBUG(0, "create drive '%s': unable to attach", d->name); g_free(d); return (GV_ERR_CREATE); @@ -135,7 +135,7 @@ gv_create_drive(struct gv_softc *sc, struct gv_drive *d) g_detach(cp); g_destroy_consumer(cp); g_topology_unlock(); - G_VINUM_DEBUG(0, "create drive '%s': couldn't update " + G_VINUM_DEBUG(0, "create drive '%s': unable to update " "access counts", d->name); if (d->hdr != NULL) g_free(d->hdr); @@ -314,17 +314,16 @@ gv_concat(struct g_geom *gp, struct gctl_req *req) struct gv_plex *p; struct gv_softc *sc; char *drive, buf[30], *vol; - int *drives, *flags, dcount; + int *drives, dcount; sc = gp->softc; dcount = 0; vol = gctl_get_param(req, "name", NULL); if (vol == NULL) { - gctl_error(req, "volume names not given"); + gctl_error(req, "volume name not given"); return; } - flags = gctl_get_paraml(req, "flags", sizeof(*flags)); drives = gctl_get_paraml(req, "drives", sizeof(*drives)); if (drives == NULL) { @@ -388,7 +387,7 @@ gv_mirror(struct g_geom *gp, struct gctl_req *req) pcount = 0; vol = gctl_get_param(req, "name", NULL); if (vol == NULL) { - gctl_error(req, "volume's not given"); + gctl_error(req, "volume name not given"); return; } @@ -396,7 +395,7 @@ gv_mirror(struct g_geom *gp, struct gctl_req *req) drives = gctl_get_paraml(req, "drives", sizeof(*drives)); if (drives == NULL) { - gctl_error(req, "drives not given"); + gctl_error(req, "drive names not given"); return; } @@ -475,12 +474,11 @@ gv_raid5(struct g_geom *gp, struct gctl_req *req) char *vol, *drive, buf[30]; off_t *stripesize; - dcount = 0; sc = gp->softc; vol = gctl_get_param(req, "name", NULL); if (vol == NULL) { - gctl_error(req, "volume's not given"); + gctl_error(req, "volume name not given"); return; } flags = gctl_get_paraml(req, "flags", sizeof(*flags)); @@ -493,7 +491,7 @@ gv_raid5(struct g_geom *gp, struct gctl_req *req) } if (drives == NULL) { - gctl_error(req, "drives not given"); + gctl_error(req, "drive names not given"); return; } @@ -558,14 +556,14 @@ gv_stripe(struct g_geom *gp, struct gctl_req *req) pcount = 0; vol = gctl_get_param(req, "name", NULL); if (vol == NULL) { - gctl_error(req, "volume's not given"); + gctl_error(req, "volume name not given"); return; } flags = gctl_get_paraml(req, "flags", sizeof(*flags)); drives = gctl_get_paraml(req, "drives", sizeof(*drives)); if (drives == NULL) { - gctl_error(req, "drives not given"); + gctl_error(req, "drive names not given"); return; } diff --git a/sys/geom/vinum/geom_vinum_events.c b/sys/geom/vinum/geom_vinum_events.c index 81e87f3fa877..02c14ce55325 100644 --- a/sys/geom/vinum/geom_vinum_events.c +++ b/sys/geom/vinum/geom_vinum_events.c @@ -193,7 +193,7 @@ gv_drive_lost(struct gv_softc *sc, struct gv_drive *d) if (cp != NULL) { if (cp->nstart != cp->nend) { G_VINUM_DEBUG(0, "dead drive '%s' has still active " - "requests, can't detach consumer", d->name); + "requests, unable to detach consumer", d->name); gv_post_event(sc, GV_EVENT_DRIVE_LOST, d, NULL, 0, 0); return; } diff --git a/sys/geom/vinum/geom_vinum_init.c b/sys/geom/vinum/geom_vinum_init.c index 34f11563e002..de3ad9c49dae 100644 --- a/sys/geom/vinum/geom_vinum_init.c +++ b/sys/geom/vinum/geom_vinum_init.c @@ -87,7 +87,7 @@ gv_start_obj(struct g_geom *gp, struct gctl_req *req) case GV_TYPE_SD: case GV_TYPE_DRIVE: /* XXX Not implemented, but what is the use? */ - gctl_error(req, "cannot start '%s' - not yet supported", + gctl_error(req, "unable to start '%s' - not yet supported", argv); return; default: @@ -279,8 +279,8 @@ gv_rebuild_plex(struct gv_plex *p) LIST_FOREACH(s, &p->subdisks, in_plex) { d = s->drive_sc; if (d == NULL || (d->flags & GV_DRIVE_REFERENCED)) { - G_VINUM_DEBUG(0, "can't rebuild %s, subdisk(s) have no " - "drives", p->name); + G_VINUM_DEBUG(0, "unable to rebuild %s, subdisk(s) have" + " no drives", p->name); return (ENXIO); } } diff --git a/sys/geom/vinum/geom_vinum_move.c b/sys/geom/vinum/geom_vinum_move.c index e55a6a2a48b9..8c295f60821e 100644 --- a/sys/geom/vinum/geom_vinum_move.c +++ b/sys/geom/vinum/geom_vinum_move.c @@ -84,7 +84,7 @@ gv_move(struct g_geom *gp, struct gctl_req *req) type = gv_object_type(sc, object); if (type != GV_TYPE_SD) { gctl_error(req, "you can only move subdisks; " - "'%s' isn't one", object); + "'%s' is not a subdisk", object); return; } @@ -145,7 +145,7 @@ gv_move_sd(struct gv_softc *sc, struct gv_sd *cursd, err = gv_set_sd_state(cursd, GV_SD_STALE, GV_SETSTATE_FORCE | GV_SETSTATE_CONFIG); if (err) { - G_VINUM_DEBUG(0, "could not set the subdisk '%s' to state " + G_VINUM_DEBUG(0, "unable to set the subdisk '%s' to state " "'stale'", cursd->name); return (err); } diff --git a/sys/geom/vinum/geom_vinum_rm.c b/sys/geom/vinum/geom_vinum_rm.c index fa56bc302c13..0d94de9626ca 100644 --- a/sys/geom/vinum/geom_vinum_rm.c +++ b/sys/geom/vinum/geom_vinum_rm.c @@ -207,7 +207,7 @@ gv_rm_vol(struct gv_softc *sc, struct gv_volume *v) /* Check if any of our consumers is open. */ if (gv_provider_is_open(pp)) { - G_VINUM_DEBUG(0, "Unable to remove %s: volume still in use", + G_VINUM_DEBUG(0, "unable to remove %s: volume still in use", v->name); return; } @@ -241,7 +241,7 @@ gv_rm_plex(struct gv_softc *sc, struct gv_plex *p) /* Check if any of our consumers is open. */ if (v != NULL && gv_provider_is_open(v->provider) && v->plexcount < 2) { - G_VINUM_DEBUG(0, "Unable to remove %s: volume still in use", + G_VINUM_DEBUG(0, "unable to remove %s: volume still in use", p->name); return; } @@ -318,7 +318,7 @@ gv_rm_drive(struct gv_softc *sc, struct gv_drive *d, int flags) g_topology_unlock(); if (err) { - G_VINUM_DEBUG(0, "%s: couldn't access '%s', " + G_VINUM_DEBUG(0, "%s: unable to access '%s', " "errno: %d", __func__, cp->provider->name, err); return; } @@ -327,7 +327,7 @@ gv_rm_drive(struct gv_softc *sc, struct gv_drive *d, int flags) d->hdr->magic = GV_NOMAGIC; err = gv_write_header(cp, d->hdr); if (err) - G_VINUM_DEBUG(0, "gv_rm_drive: couldn't write header to" + G_VINUM_DEBUG(0, "gv_rm_drive: error writing header to" " '%s', errno: %d", cp->provider->name, err); g_topology_lock(); diff --git a/sys/geom/vinum/geom_vinum_subr.c b/sys/geom/vinum/geom_vinum_subr.c index 95767fdff108..e381ff2bf597 100644 --- a/sys/geom/vinum/geom_vinum_subr.c +++ b/sys/geom/vinum/geom_vinum_subr.c @@ -585,7 +585,7 @@ gv_sd_to_drive(struct gv_sd *s, struct gv_drive *d) return (0); } } else { - G_VINUM_DEBUG(0, "can't give sd '%s' to '%s' " + G_VINUM_DEBUG(0, "error giving subdisk '%s' to '%s' " "(already on '%s')", s->name, d->name, s->drive_sc->name); return (GV_ERR_ISATTACHED); @@ -612,7 +612,7 @@ gv_sd_to_drive(struct gv_sd *s, struct gv_drive *d) /* No good slot found? */ if (s->size == -1) { - G_VINUM_DEBUG(0, "couldn't autosize '%s' on '%s'", + G_VINUM_DEBUG(0, "unable to autosize '%s' on '%s'", s->name, d->name); return (GV_ERR_BADSIZE); } diff --git a/sys/geom/virstor/g_virstor.c b/sys/geom/virstor/g_virstor.c index 1de3d5ae28e4..efdba4ba3ff0 100644 --- a/sys/geom/virstor/g_virstor.c +++ b/sys/geom/virstor/g_virstor.c @@ -98,7 +98,7 @@ SYSCTL_UINT(_kern_geom_virstor, OID_AUTO, component_watermark, CTLFLAG_RW, "Minimum number of free components before issuing administrative warning"); static int read_metadata(struct g_consumer *, struct g_virstor_metadata *); -static int write_metadata(struct g_consumer *, struct g_virstor_metadata *); +static void write_metadata(struct g_consumer *, struct g_virstor_metadata *); static int clear_metadata(struct g_virstor_component *); static int add_provider_to_geom(struct g_virstor_softc *, struct g_provider *, struct g_virstor_metadata *); @@ -311,6 +311,11 @@ virstor_ctl_add(struct gctl_req *req, struct g_class *cp) snprintf(aname, sizeof aname, "arg%d", i); prov_name = gctl_get_asciiparam(req, aname); + if (prov_name == NULL) { + gctl_error(req, "Error fetching argument '%s'", aname); + g_topology_unlock(); + return; + } if (strncmp(prov_name, _PATH_DEV, strlen(_PATH_DEV)) == 0) prov_name += strlen(_PATH_DEV); @@ -565,6 +570,10 @@ virstor_ctl_remove(struct gctl_req *req, struct g_class *cp) sprintf(param, "arg%d", i); prov_name = gctl_get_asciiparam(req, param); + if (prov_name == NULL) { + gctl_error(req, "Error fetching argument '%s'", param); + return; + } if (strncmp(prov_name, _PATH_DEV, strlen(_PATH_DEV)) == 0) prov_name += strlen(_PATH_DEV); @@ -1002,8 +1011,13 @@ read_metadata(struct g_consumer *cp, struct g_virstor_metadata *md) /** * Utility function: encode & write metadata. Assumes topology lock is * held. + * + * There is no useful way of recovering from errors in this function, + * not involving panicking the kernel. If the metadata cannot be written + * the most we can do is notify the operator and hope he spots it and + * replaces the broken drive. */ -static int +static void write_metadata(struct g_consumer *cp, struct g_virstor_metadata *md) { struct g_provider *pp; @@ -1015,8 +1029,11 @@ write_metadata(struct g_consumer *cp, struct g_virstor_metadata *md) LOG_MSG(LVL_DEBUG, "Writing metadata on %s", cp->provider->name); g_topology_assert(); error = g_access(cp, 0, 1, 0); - if (error != 0) - return (error); + if (error != 0) { + LOG_MSG(LVL_ERROR, "g_access(0,1,0) failed for %s: %d", + cp->provider->name, error); + return; + } pp = cp->provider; buf = malloc(pp->sectorsize, M_GVIRSTOR, M_WAITOK); @@ -1026,9 +1043,11 @@ write_metadata(struct g_consumer *cp, struct g_virstor_metadata *md) pp->sectorsize); g_topology_lock(); g_access(cp, 0, -1, 0); - free(buf, M_GVIRSTOR); - return (0); + + if (error != 0) + LOG_MSG(LVL_ERROR, "Error %d writing metadata to %s", + error, cp->provider->name); } /* diff --git a/sys/gnu/fs/ext2fs/COPYRIGHT.INFO b/sys/gnu/fs/ext2fs/COPYRIGHT.INFO deleted file mode 100644 index 699f519c02a8..000000000000 --- a/sys/gnu/fs/ext2fs/COPYRIGHT.INFO +++ /dev/null @@ -1,35 +0,0 @@ -$FreeBSD$ - -Most of the files in this directory are written by Godmar Back or modified -by him using the CSRG sources. Those files are covered by the Berkeley-style -copyright. However the following files are covered by GPL. Since the policy -of the FreeBSD project is to keep the files with the more restrictive -copyright in the gnu tree and it is a good idea to keep the filesystem code -all together, the EXT2FS in its entirety resides under the gnu tree. Note -that only the files below are under the GPL. In the eventuality that these -files are redesigned or rewritten, this tree can be moved back into the less -restrictive FreeBSD tree. - - ext2_bitmap.c (in the cvs attic) - ext2_fs.h - ext2_fs_i.h - ext2_fs_sb.h - ext2_linux_balloc.c - ext2_linux_ialloc.c - ext2_super.c (in the cvs attic) - ext2_vfsops.c (has some GPL'ed code from ext2_super.c) - i386-bitops.h - -PS. - THANKS GODMAR!!! - -Note that this port has been modified by John Dyson and others on -the FreeBSD team, and it is best to send the bug reports to the FreeBSD -team. If there are any non-FreeBSD specific bugs, fixes will be sent to -Godmar to help him fix the original code base. It is also our intention -to send Godmar any FreeBSD specific porting changes so that he can keep -control of his code.... - -John -dyson@freebsd.org - diff --git a/sys/gnu/fs/ext2fs/ext2_alloc.c b/sys/gnu/fs/ext2fs/ext2_alloc.c deleted file mode 100644 index 190a47264e57..000000000000 --- a/sys/gnu/fs/ext2fs/ext2_alloc.c +++ /dev/null @@ -1,535 +0,0 @@ -/*- - * modified for Lites 1.1 - * - * Aug 1995, Godmar Back (gback@cs.utah.edu) - * University of Utah, Department of Computer Science - */ -/*- - * Copyright (c) 1982, 1986, 1989, 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. - * - * @(#)ffs_alloc.c 8.8 (Berkeley) 2/21/94 - * $FreeBSD$ - */ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -static void ext2_fserr(struct ext2_sb_info *, u_int, char *); - -/* - * Linux calls this functions at the following locations: - * (1) the inode is freed - * (2) a preallocation miss occurs - * (3) truncate is called - * (4) release_file is called and f_mode & 2 - * - * I call it in ext2_inactive, ext2_truncate, ext2_vfree and in (2) - * the call in vfree might be redundant - */ -void -ext2_discard_prealloc(ip) - struct inode * ip; -{ -#ifdef EXT2_PREALLOCATE - if (ip->i_prealloc_count) { - int i = ip->i_prealloc_count; - ip->i_prealloc_count = 0; - ext2_free_blocks (ITOV(ip)->v_mount, - ip->i_prealloc_block, - i); - } -#endif -} - -/* - * Allocate a block in the file system. - * - * this takes the framework from ffs_alloc. To implement the - * actual allocation, it calls ext2_new_block, the ported version - * of the same Linux routine. - * - * we note that this is always called in connection with ext2_blkpref - * - * preallocation is done as Linux does it - */ -int -ext2_alloc(ip, lbn, bpref, size, cred, bnp) - struct inode *ip; - int32_t lbn, bpref; - int size; - struct ucred *cred; - int32_t *bnp; -{ - struct ext2_sb_info *fs; - int32_t bno; - - *bnp = 0; - fs = ip->i_e2fs; -#ifdef DIAGNOSTIC - if ((u_int)size > fs->s_blocksize || blkoff(fs, size) != 0) { - vn_printf(ip->i_devvp, "bsize = %lu, size = %d, fs = %s\n", - fs->s_blocksize, size, fs->fs_fsmnt); - panic("ext2_alloc: bad size"); - } - if (cred == NOCRED) - panic("ext2_alloc: missing credential"); -#endif /* DIAGNOSTIC */ - if (size == fs->s_blocksize && fs->s_es->s_free_blocks_count == 0) - goto nospace; - if (cred->cr_uid != 0 && - fs->s_es->s_free_blocks_count < fs->s_es->s_r_blocks_count) - goto nospace; - if (bpref >= fs->s_es->s_blocks_count) - bpref = 0; - /* call the Linux code */ -#ifdef EXT2_PREALLOCATE - /* To have a preallocation hit, we must - * - have at least one block preallocated - * - and our preferred block must have that block number or one below - */ - if (ip->i_prealloc_count && - (bpref == ip->i_prealloc_block || - bpref + 1 == ip->i_prealloc_block)) - { - bno = ip->i_prealloc_block++; - ip->i_prealloc_count--; - /* ext2_debug ("preallocation hit (%lu/%lu).\n", - ++alloc_hits, ++alloc_attempts); */ - - /* Linux gets, clears, and releases the buffer at this - point - we don't have to that; we leave it to the caller - */ - } else { - ext2_discard_prealloc (ip); - /* ext2_debug ("preallocation miss (%lu/%lu).\n", - alloc_hits, ++alloc_attempts); */ - if (S_ISREG(ip->i_mode)) - bno = ext2_new_block - (ITOV(ip)->v_mount, bpref, - &ip->i_prealloc_count, - &ip->i_prealloc_block); - else - bno = (int32_t)ext2_new_block(ITOV(ip)->v_mount, - bpref, 0, 0); - } -#else - bno = (int32_t)ext2_new_block(ITOV(ip)->v_mount, bpref, 0, 0); -#endif - - if (bno > 0) { - /* set next_alloc fields as done in block_getblk */ - ip->i_next_alloc_block = lbn; - ip->i_next_alloc_goal = bno; - - ip->i_blocks += btodb(size); - ip->i_flag |= IN_CHANGE | IN_UPDATE; - *bnp = bno; - return (0); - } -nospace: - ext2_fserr(fs, cred->cr_uid, "file system full"); - uprintf("\n%s: write failed, file system is full\n", fs->fs_fsmnt); - return (ENOSPC); -} - -/* - * Reallocate a sequence of blocks into a contiguous sequence of blocks. - * - * The vnode and an array of buffer pointers for a range of sequential - * logical blocks to be made contiguous is given. The allocator attempts - * to find a range of sequential blocks starting as close as possible to - * an fs_rotdelay offset from the end of the allocation for the logical - * block immediately preceding the current range. If successful, the - * physical block numbers in the buffer pointers and in the inode are - * changed to reflect the new allocation. If unsuccessful, the allocation - * is left unchanged. The success in doing the reallocation is returned. - * Note that the error return is not reflected back to the user. Rather - * the previous block allocation will be used. - */ - -#ifdef FANCY_REALLOC -#include -static int doasyncfree = 1; -#ifdef OPT_DEBUG -SYSCTL_INT(_debug, 14, doasyncfree, CTLFLAG_RW, &doasyncfree, 0, ""); -#endif /* OPT_DEBUG */ -#endif - -int -ext2_reallocblks(ap) - struct vop_reallocblks_args /* { - struct vnode *a_vp; - struct cluster_save *a_buflist; - } */ *ap; -{ -#ifndef FANCY_REALLOC -/* printf("ext2_reallocblks not implemented\n"); */ -return ENOSPC; -#else - - struct ext2_sb_info *fs; - struct inode *ip; - struct vnode *vp; - struct buf *sbp, *ebp; - int32_t *bap, *sbap, *ebap; - struct cluster_save *buflist; - int32_t start_lbn, end_lbn, soff, eoff, newblk, blkno; - struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp; - int i, len, start_lvl, end_lvl, pref, ssize; - - vp = ap->a_vp; - ip = VTOI(vp); - fs = ip->i_e2fs; -#ifdef UNKLAR - if (fs->fs_contigsumsize <= 0) - return (ENOSPC); -#endif - buflist = ap->a_buflist; - len = buflist->bs_nchildren; - start_lbn = buflist->bs_children[0]->b_lblkno; - end_lbn = start_lbn + len - 1; -#ifdef DIAGNOSTIC - for (i = 1; i < len; i++) - if (buflist->bs_children[i]->b_lblkno != start_lbn + i) - panic("ext2_reallocblks: non-cluster"); -#endif - /* - * If the latest allocation is in a new cylinder group, assume that - * the filesystem has decided to move and do not force it back to - * the previous cylinder group. - */ - if (dtog(fs, dbtofsb(fs, buflist->bs_children[0]->b_blkno)) != - dtog(fs, dbtofsb(fs, buflist->bs_children[len - 1]->b_blkno))) - return (ENOSPC); - if (ufs_getlbns(vp, start_lbn, start_ap, &start_lvl) || - ufs_getlbns(vp, end_lbn, end_ap, &end_lvl)) - return (ENOSPC); - /* - * Get the starting offset and block map for the first block. - */ - if (start_lvl == 0) { - sbap = &ip->i_db[0]; - soff = start_lbn; - } else { - idp = &start_ap[start_lvl - 1]; - if (bread(vp, idp->in_lbn, (int)fs->s_blocksize, NOCRED, &sbp)) { - brelse(sbp); - return (ENOSPC); - } - sbap = (int32_t *)sbp->b_data; - soff = idp->in_off; - } - /* - * Find the preferred location for the cluster. - */ - pref = ext2_blkpref(ip, start_lbn, soff, sbap); - /* - * If the block range spans two block maps, get the second map. - */ - if (end_lvl == 0 || (idp = &end_ap[end_lvl - 1])->in_off + 1 >= len) { - ssize = len; - } else { -#ifdef DIAGNOSTIC - if (start_ap[start_lvl-1].in_lbn == idp->in_lbn) - panic("ext2_reallocblk: start == end"); -#endif - ssize = len - (idp->in_off + 1); - if (bread(vp, idp->in_lbn, (int)fs->s_blocksize, NOCRED, &ebp)) - goto fail; - ebap = (int32_t *)ebp->b_data; - } - /* - * Search the block map looking for an allocation of the desired size. - */ - if ((newblk = (int32_t)ext2_hashalloc(ip, dtog(fs, pref), (long)pref, - len, (u_long (*)())ext2_clusteralloc)) == 0) - goto fail; - /* - * We have found a new contiguous block. - * - * First we have to replace the old block pointers with the new - * block pointers in the inode and indirect blocks associated - * with the file. - */ - blkno = newblk; - for (bap = &sbap[soff], i = 0; i < len; i++, blkno += fs->s_frags_per_block) { - if (i == ssize) - bap = ebap; -#ifdef DIAGNOSTIC - if (buflist->bs_children[i]->b_blkno != fsbtodb(fs, *bap)) - panic("ext2_reallocblks: alloc mismatch"); -#endif - *bap++ = blkno; - } - /* - * Next we must write out the modified inode and indirect blocks. - * For strict correctness, the writes should be synchronous since - * the old block values may have been written to disk. In practise - * they are almost never written, but if we are concerned about - * strict correctness, the `doasyncfree' flag should be set to zero. - * - * The test on `doasyncfree' should be changed to test a flag - * that shows whether the associated buffers and inodes have - * been written. The flag should be set when the cluster is - * started and cleared whenever the buffer or inode is flushed. - * We can then check below to see if it is set, and do the - * synchronous write only when it has been cleared. - */ - if (sbap != &ip->i_db[0]) { - if (doasyncfree) - bdwrite(sbp); - else - bwrite(sbp); - } else { - ip->i_flag |= IN_CHANGE | IN_UPDATE; - if (!doasyncfree) - ext2_update(vp, 1); - } - if (ssize < len) - if (doasyncfree) - bdwrite(ebp); - else - bwrite(ebp); - /* - * Last, free the old blocks and assign the new blocks to the buffers. - */ - for (blkno = newblk, i = 0; i < len; i++, blkno += fs->s_frags_per_block) { - ext2_blkfree(ip, dbtofsb(fs, buflist->bs_children[i]->b_blkno), - fs->s_blocksize); - buflist->bs_children[i]->b_blkno = fsbtodb(fs, blkno); - } - return (0); - -fail: - if (ssize < len) - brelse(ebp); - if (sbap != &ip->i_db[0]) - brelse(sbp); - return (ENOSPC); - -#endif /* FANCY_REALLOC */ -} - -/* - * Allocate an inode in the file system. - * - * we leave the actual allocation strategy to the (modified) - * ext2_new_inode(), to make sure we get the policies right - */ -int -ext2_valloc(pvp, mode, cred, vpp) - struct vnode *pvp; - int mode; - struct ucred *cred; - struct vnode **vpp; -{ - struct inode *pip; - struct ext2_sb_info *fs; - struct inode *ip; - ino_t ino; - int i, error; - - *vpp = NULL; - pip = VTOI(pvp); - fs = pip->i_e2fs; - if (fs->s_es->s_free_inodes_count == 0) - goto noinodes; - - /* call the Linux routine - it returns the inode number only */ - ino = ext2_new_inode(pip, mode); - - if (ino == 0) - goto noinodes; - error = VFS_VGET(pvp->v_mount, ino, LK_EXCLUSIVE, vpp); - if (error) { - ext2_vfree(pvp, ino, mode); - return (error); - } - ip = VTOI(*vpp); - - /* - the question is whether using VGET was such good idea at all - - Linux doesn't read the old inode in when it's allocating a - new one. I will set at least i_size & i_blocks the zero. - */ - ip->i_mode = 0; - ip->i_size = 0; - ip->i_blocks = 0; - ip->i_flags = 0; - /* now we want to make sure that the block pointers are zeroed out */ - for (i = 0; i < NDADDR; i++) - ip->i_db[i] = 0; - for (i = 0; i < NIADDR; i++) - ip->i_ib[i] = 0; - - /* - * Set up a new generation number for this inode. - * XXX check if this makes sense in ext2 - */ - if (ip->i_gen == 0 || ++ip->i_gen == 0) - ip->i_gen = random() / 2 + 1; -/* -printf("ext2_valloc: allocated inode %d\n", ino); -*/ - return (0); -noinodes: - ext2_fserr(fs, cred->cr_uid, "out of inodes"); - uprintf("\n%s: create/symlink failed, no inodes free\n", fs->fs_fsmnt); - return (ENOSPC); -} - -/* - * Select the desired position for the next block in a file. - * - * we try to mimic what Remy does in inode_getblk/block_getblk - * - * we note: blocknr == 0 means that we're about to allocate either - * a direct block or a pointer block at the first level of indirection - * (In other words, stuff that will go in i_db[] or i_ib[]) - * - * blocknr != 0 means that we're allocating a block that is none - * of the above. Then, blocknr tells us the number of the block - * that will hold the pointer - */ -int32_t -ext2_blkpref(ip, lbn, indx, bap, blocknr) - struct inode *ip; - int32_t lbn; - int indx; - int32_t *bap; - int32_t blocknr; -{ - int tmp; - - /* if the next block is actually what we thought it is, - then set the goal to what we thought it should be - */ - if(ip->i_next_alloc_block == lbn) - return ip->i_next_alloc_goal; - - /* now check whether we were provided with an array that basically - tells us previous blocks to which we want to stay closeby - */ - if(bap) - for (tmp = indx - 1; tmp >= 0; tmp--) - if (bap[tmp]) - return bap[tmp]; - - /* else let's fall back to the blocknr, or, if there is none, - follow the rule that a block should be allocated near its inode - */ - return blocknr ? blocknr : - (int32_t)(ip->i_block_group * - EXT2_BLOCKS_PER_GROUP(ip->i_e2fs)) + - ip->i_e2fs->s_es->s_first_data_block; -} - -/* - * Free a block or fragment. - * - * pass on to the Linux code - */ -void -ext2_blkfree(ip, bno, size) - struct inode *ip; - int32_t bno; - long size; -{ - struct ext2_sb_info *fs; - - fs = ip->i_e2fs; - /* - * call Linux code with mount *, block number, count - */ - ext2_free_blocks(ITOV(ip)->v_mount, bno, size / fs->s_frag_size); -} - -/* - * Free an inode. - * - * the maintenance of the actual bitmaps is again up to the linux code - */ -int -ext2_vfree(pvp, ino, mode) - struct vnode *pvp; - ino_t ino; - int mode; -{ - struct ext2_sb_info *fs; - struct inode *pip; - mode_t save_i_mode; - - pip = VTOI(pvp); - fs = pip->i_e2fs; - if ((u_int)ino > fs->s_inodes_per_group * fs->s_groups_count) - panic("ext2_vfree: range: devvp = %p, ino = %d, fs = %s", - pip->i_devvp, ino, fs->fs_fsmnt); - -/* ext2_debug("ext2_vfree (%d, %d) called\n", pip->i_number, mode); - */ - ext2_discard_prealloc(pip); - - /* we need to make sure that ext2_free_inode can adjust the - used_dir_counts in the group summary information - I'd - really like to know what the rationale behind this - 'set i_mode to zero to denote an unused inode' is - */ - save_i_mode = pip->i_mode; - pip->i_mode = mode; - ext2_free_inode(pip); - pip->i_mode = save_i_mode; - return (0); -} - -/* - * Fserr prints the name of a file system with an error diagnostic. - * - * The form of the error message is: - * fs: error message - */ -static void -ext2_fserr(fs, uid, cp) - struct ext2_sb_info *fs; - u_int uid; - char *cp; -{ - - log(LOG_ERR, "uid %d on %s: %s\n", uid, fs->fs_fsmnt, cp); -} diff --git a/sys/gnu/fs/ext2fs/ext2_bitops.h b/sys/gnu/fs/ext2fs/ext2_bitops.h deleted file mode 100644 index c01150fea761..000000000000 --- a/sys/gnu/fs/ext2fs/ext2_bitops.h +++ /dev/null @@ -1,114 +0,0 @@ -/*- - * Copyright (c) 2003 Marcel Moolenaar - * 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 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$ - */ - -#ifndef _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ -#define _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ - -#define find_first_zero_bit(data, sz) find_next_zero_bit(data, sz, 0) - -static __inline int -clear_bit(int no, void *data) -{ - uint32_t *p; - uint32_t mask, new, old; - - p = (uint32_t*)data + (no >> 5); - mask = (1U << (no & 31)); - do { - old = *p; - new = old & ~mask; - } while (!atomic_cmpset_32(p, old, new)); - return (old & mask); -} - -static __inline int -set_bit(int no, void *data) -{ - uint32_t *p; - uint32_t mask, new, old; - - p = (uint32_t*)data + (no >> 5); - mask = (1U << (no & 31)); - do { - old = *p; - new = old | mask; - } while (!atomic_cmpset_32(p, old, new)); - return (old & mask); -} - -static __inline int -test_bit(int no, void *data) -{ - uint32_t *p; - uint32_t mask; - - p = (uint32_t*)data + (no >> 5); - mask = (1U << (no & 31)); - return (*p & mask); -} - -static __inline size_t -find_next_zero_bit(void *data, size_t sz, size_t ofs) -{ - uint32_t *p; - uint32_t mask; - int bit; - - p = (uint32_t*)data + (ofs >> 5); - if (ofs & 31) { - mask = ~0U << (ofs & 31); - bit = *p | ~mask; - if (bit != ~0U) - return (ffs(~bit) + (ofs & ~31U) - 1); - p++; - ofs = (ofs + 31U) & ~31U; - } - while(ofs < sz && *p == ~0U) { - p++; - ofs += 32; - } - if (ofs == sz) - return (ofs); - bit = *p; - return (ffs(~bit) + ofs - 1); -} - -static __inline void * -memscan(void *data, int c, size_t sz) -{ - uint8_t *p; - - p = data; - while (sz && *p != c) { - p++; - sz--; - } - return (p); -} - -#endif /* _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ */ diff --git a/sys/gnu/fs/ext2fs/ext2_fs.h b/sys/gnu/fs/ext2fs/ext2_fs.h deleted file mode 100644 index 8a4081e5f915..000000000000 --- a/sys/gnu/fs/ext2fs/ext2_fs.h +++ /dev/null @@ -1,556 +0,0 @@ -/*- - * modified for EXT2FS support in Lites 1.1 - * - * Aug 1995, Godmar Back (gback@cs.utah.edu) - * University of Utah, Department of Computer Science - * - * $FreeBSD$ - */ -/*- - * linux/include/linux/ext2_fs.h - * - * Copyright (C) 1992, 1993, 1994, 1995 - * Remy Card (card@masi.ibp.fr) - * Laboratoire MASI - Institut Blaise Pascal - * Universite Pierre et Marie Curie (Paris VI) - * - * from - * - * linux/include/linux/minix_fs.h - * - * Copyright (C) 1991, 1992 Linus Torvalds - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _LINUX_EXT2_FS_H -#define _LINUX_EXT2_FS_H - -#include - -#define __u32 u_int32_t -#define u32 u_int32_t -#define __u16 u_int16_t -#define __u8 u_int8_t - -#define __s32 int32_t -#define __s16 int16_t -#define __s8 int8_t - -#define umode_t mode_t -#define loff_t off_t - -#define cpu_to_le32(x) htole32(x) - -/* - * The second extended filesystem constants/structures - */ - -/* - * Define EXT2FS_DEBUG to produce debug messages - */ -#undef EXT2FS_DEBUG - -/* - * Define EXT2_PREALLOCATE to preallocate data blocks for expanding files - */ -#define EXT2_PREALLOCATE -#define EXT2_DEFAULT_PREALLOC_BLOCKS 8 - -/* - * The second extended file system version - */ -#define EXT2FS_DATE "95/08/09" -#define EXT2FS_VERSION "0.5b" - -/* - * Debug code - */ -#ifdef EXT2FS_DEBUG -# define ext2_debug(f, a...) { \ - printf ("EXT2-fs DEBUG (%s, %d): %s:", \ - __FILE__, __LINE__, __func__); \ - printf (f, ## a); \ - } -#else -# define ext2_debug(f, a...) /**/ -#endif - -/* - * Special inode numbers - */ -#define EXT2_BAD_INO 1 /* Bad blocks inode */ -#define EXT2_ROOT_INO 2 /* Root inode */ -#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ -#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -/* First non-reserved inode for old ext2 filesystems */ -#define EXT2_GOOD_OLD_FIRST_INO 11 - -/* - * The second extended file system magic number - */ -#define EXT2_SUPER_MAGIC 0xEF53 - -#ifdef __KERNEL__ -#include -static inline struct ext2_sb_info *EXT2_SB(struct super_block *sb) -{ - return sb->s_fs_info; -} -#elif defined(_KERNEL) -/* - * FreeBSD passes the pointer to the in-core struct with relevant - * fields to EXT2_SB macro when accessing superblock fields. - */ -#define EXT2_SB(sb) (sb) -#else -/* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test - * macros from user land. */ -#define EXT2_SB(sb) (sb) -#endif - -/* - * Maximal count of links to a file - */ -#define EXT2_LINK_MAX 32000 - -/* - * Macro-instructions used to manage several block sizes - */ -#define EXT2_MIN_BLOCK_SIZE 1024 -#define EXT2_MAX_BLOCK_SIZE 4096 -#define EXT2_MIN_BLOCK_LOG_SIZE 10 -#if defined(__KERNEL__) || defined(_KERNEL) -# define EXT2_BLOCK_SIZE(s) ((s)->s_blocksize) -#else -# define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) -#endif -#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) -#if defined(__KERNEL__) || defined(_KERNEL) -# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -#else -# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) -#endif -#if defined(__KERNEL__) || defined(_KERNEL) -#define EXT2_ADDR_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_addr_per_block_bits) -#define EXT2_INODE_SIZE(s) (EXT2_SB(s)->s_inode_size) -#define EXT2_FIRST_INO(s) (EXT2_SB(s)->s_first_ino) -#define EXT2_INODES_PER_BLOCK(s) ((s)->s_inodes_per_block) -#else -#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ - EXT2_GOOD_OLD_INODE_SIZE : \ - (s)->s_inode_size) -#define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \ - EXT2_GOOD_OLD_FIRST_INO : \ - (s)->s_first_ino) -#endif - -/* - * Macro-instructions used to manage fragments - */ -#define EXT2_MIN_FRAG_SIZE 1024 -#define EXT2_MAX_FRAG_SIZE 4096 -#define EXT2_MIN_FRAG_LOG_SIZE 10 -#if defined(__KERNEL__) || defined(_KERNEL) -# define EXT2_FRAG_SIZE(s) (EXT2_SB(s)->s_frag_size) -# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_SB(s)->s_frags_per_block) -#else -# define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size) -# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s)) -#endif - -/* - * ACL structures - */ -struct ext2_acl_header /* Header of Access Control Lists */ -{ - __u32 aclh_size; - __u32 aclh_file_count; - __u32 aclh_acle_count; - __u32 aclh_first_acle; -}; - -struct ext2_acl_entry /* Access Control List Entry */ -{ - __u32 acle_size; - __u16 acle_perms; /* Access permissions */ - __u16 acle_type; /* Type of entry */ - __u16 acle_tag; /* User or group identity */ - __u16 acle_pad1; - __u32 acle_next; /* Pointer on next entry for the */ - /* same inode or on next free entry */ -}; - -/* - * Structure of a blocks group descriptor - */ -struct ext2_group_desc -{ - __u32 bg_block_bitmap; /* Blocks bitmap block */ - __u32 bg_inode_bitmap; /* Inodes bitmap block */ - __u32 bg_inode_table; /* Inodes table block */ - __u16 bg_free_blocks_count; /* Free blocks count */ - __u16 bg_free_inodes_count; /* Free inodes count */ - __u16 bg_used_dirs_count; /* Directories count */ - __u16 bg_pad; - __u32 bg_reserved[3]; -}; - -/* - * Macro-instructions used to manage group descriptors - */ -#if defined(__KERNEL__) || defined(_KERNEL) -# define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->s_blocks_per_group) -# define EXT2_DESC_PER_BLOCK(s) (EXT2_SB(s)->s_desc_per_block) -# define EXT2_INODES_PER_GROUP(s) (EXT2_SB(s)->s_inodes_per_group) -# define EXT2_DESC_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_desc_per_block_bits) -#else -# define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) -# define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc)) -# define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) -#endif - -/* - * Constants relative to the data blocks - */ -#define EXT2_NDIR_BLOCKS 12 -#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS -#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) -#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) -#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) -#define EXT2_MAXSYMLINKLEN (EXT2_N_BLOCKS * sizeof (__u32)) - -/* - * Inode flags - */ -#define EXT2_SECRM_FL 0x00000001 /* Secure deletion */ -#define EXT2_UNRM_FL 0x00000002 /* Undelete */ -#define EXT2_COMPR_FL 0x00000004 /* Compress file */ -#define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */ -#define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */ -#define EXT2_APPEND_FL 0x00000020 /* writes to file may only append */ -#define EXT2_NODUMP_FL 0x00000040 /* do not dump file */ -#define EXT2_NOATIME_FL 0x00000080 /* do not update atime */ -/* Reserved for compression usage... */ -#define EXT2_DIRTY_FL 0x00000100 -#define EXT2_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */ -#define EXT2_NOCOMP_FL 0x00000400 /* Don't compress */ -#define EXT2_ECOMPR_FL 0x00000800 /* Compression error */ -/* End compression flags --- maybe not all used */ -#define EXT2_BTREE_FL 0x00001000 /* btree format dir */ -#define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ - -#define EXT2_FL_USER_VISIBLE 0x00001FFF /* User visible flags */ -#define EXT2_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ - -/* - * ioctl commands - */ -#define EXT2_IOC_GETFLAGS _IOR('f', 1, long) -#define EXT2_IOC_SETFLAGS _IOW('f', 2, long) -#define EXT2_IOC_GETVERSION _IOR('v', 1, long) -#define EXT2_IOC_SETVERSION _IOW('v', 2, long) - -/* - * Structure of an inode on the disk - */ -struct ext2_inode { - __u16 i_mode; /* File mode */ - __u16 i_uid; /* Owner Uid */ - __u32 i_size; /* Size in bytes */ - __u32 i_atime; /* Access time */ - __u32 i_ctime; /* Creation time */ - __u32 i_mtime; /* Modification time */ - __u32 i_dtime; /* Deletion Time */ - __u16 i_gid; /* Group Id */ - __u16 i_links_count; /* Links count */ - __u32 i_blocks; /* Blocks count */ - __u32 i_flags; /* File flags */ - union { - struct { - __u32 l_i_reserved1; - } linux1; - struct { - __u32 h_i_translator; - } hurd1; - struct { - __u32 m_i_reserved1; - } masix1; - } osd1; /* OS dependent 1 */ - __u32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */ - __u32 i_generation; /* File version (for NFS) */ - __u32 i_file_acl; /* File ACL */ - __u32 i_dir_acl; /* Directory ACL */ - __u32 i_faddr; /* Fragment address */ - union { - struct { - __u8 l_i_frag; /* Fragment number */ - __u8 l_i_fsize; /* Fragment size */ - __u16 i_pad1; - __u32 l_i_reserved2[2]; - } linux2; - struct { - __u8 h_i_frag; /* Fragment number */ - __u8 h_i_fsize; /* Fragment size */ - __u16 h_i_mode_high; - __u16 h_i_uid_high; - __u16 h_i_gid_high; - __u32 h_i_author; - } hurd2; - struct { - __u8 m_i_frag; /* Fragment number */ - __u8 m_i_fsize; /* Fragment size */ - __u16 m_pad1; - __u32 m_i_reserved2[2]; - } masix2; - } osd2; /* OS dependent 2 */ -}; - -#define i_size_high i_dir_acl - -#if defined(__KERNEL__) || defined(__linux__) -#define i_reserved1 osd1.linux1.l_i_reserved1 -#define i_frag osd2.linux2.l_i_frag -#define i_fsize osd2.linux2.l_i_fsize -#define i_reserved2 osd2.linux2.l_i_reserved2 -#endif - -#ifdef __hurd__ -#define i_translator osd1.hurd1.h_i_translator -#define i_frag osd2.hurd2.h_i_frag; -#define i_fsize osd2.hurd2.h_i_fsize; -#define i_uid_high osd2.hurd2.h_i_uid_high -#define i_gid_high osd2.hurd2.h_i_gid_high -#define i_author osd2.hurd2.h_i_author -#endif - -#ifdef __masix__ -#define i_reserved1 osd1.masix1.m_i_reserved1 -#define i_frag osd2.masix2.m_i_frag -#define i_fsize osd2.masix2.m_i_fsize -#define i_reserved2 osd2.masix2.m_i_reserved2 -#endif - -/* - * File system states - */ -#define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */ -#define EXT2_ERROR_FS 0x0002 /* Errors detected */ - -/* - * Mount flags - */ -#define EXT2_MOUNT_CHECK_NORMAL 0x0001 /* Do some more checks */ -#define EXT2_MOUNT_CHECK_STRICT 0x0002 /* Do again more checks */ -#define EXT2_MOUNT_CHECK (EXT2_MOUNT_CHECK_NORMAL | \ - EXT2_MOUNT_CHECK_STRICT) -#define EXT2_MOUNT_GRPID 0x0004 /* Create files with directory's group */ -#define EXT2_MOUNT_DEBUG 0x0008 /* Some debugging messages */ -#define EXT2_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ -#define EXT2_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ -#define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ -#define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - -#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt -#define set_opt(o, opt) o |= EXT2_MOUNT_##opt -#define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \ - EXT2_MOUNT_##opt) -/* - * Maximal mount counts between two filesystem checks - */ -#define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */ -#define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */ - -/* - * Behaviour when detecting errors - */ -#define EXT2_ERRORS_CONTINUE 1 /* Continue execution */ -#define EXT2_ERRORS_RO 2 /* Remount fs read-only */ -#define EXT2_ERRORS_PANIC 3 /* Panic */ -#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE - -/* - * Structure of the super block - */ -struct ext2_super_block { - __u32 s_inodes_count; /* Inodes count */ - __u32 s_blocks_count; /* Blocks count */ - __u32 s_r_blocks_count; /* Reserved blocks count */ - __u32 s_free_blocks_count; /* Free blocks count */ - __u32 s_free_inodes_count; /* Free inodes count */ - __u32 s_first_data_block; /* First Data Block */ - __u32 s_log_block_size; /* Block size */ - __s32 s_log_frag_size; /* Fragment size */ - __u32 s_blocks_per_group; /* # Blocks per group */ - __u32 s_frags_per_group; /* # Fragments per group */ - __u32 s_inodes_per_group; /* # Inodes per group */ - __u32 s_mtime; /* Mount time */ - __u32 s_wtime; /* Write time */ - __u16 s_mnt_count; /* Mount count */ - __s16 s_max_mnt_count; /* Maximal mount count */ - __u16 s_magic; /* Magic signature */ - __u16 s_state; /* File system state */ - __u16 s_errors; /* Behaviour when detecting errors */ - __u16 s_minor_rev_level; /* minor revision level */ - __u32 s_lastcheck; /* time of last check */ - __u32 s_checkinterval; /* max. time between checks */ - __u32 s_creator_os; /* OS */ - __u32 s_rev_level; /* Revision level */ - __u16 s_def_resuid; /* Default uid for reserved blocks */ - __u16 s_def_resgid; /* Default gid for reserved blocks */ - /* - * These fields are for EXT2_DYNAMIC_REV superblocks only. - * - * Note: the difference between the compatible feature set and - * the incompatible feature set is that if there is a bit set - * in the incompatible feature set that the kernel doesn't - * know about, it should refuse to mount the filesystem. - * - * e2fsck's requirements are more strict; if it doesn't know - * about a feature in either the compatible or incompatible - * feature set, it must abort and not try to meddle with - * things it doesn't understand... - */ - __u32 s_first_ino; /* First non-reserved inode */ - __u16 s_inode_size; /* size of inode structure */ - __u16 s_block_group_nr; /* block group # of this superblock */ - __u32 s_feature_compat; /* compatible feature set */ - __u32 s_feature_incompat; /* incompatible feature set */ - __u32 s_feature_ro_compat; /* readonly-compatible feature set */ - __u8 s_uuid[16]; /* 128-bit uuid for volume */ - char s_volume_name[16]; /* volume name */ - char s_last_mounted[64]; /* directory where last mounted */ - __u32 s_algorithm_usage_bitmap; /* For compression */ - /* - * Performance hints. Directory preallocation should only - * happen if the EXT2_COMPAT_PREALLOC flag is on. - */ - __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ - __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ - __u16 s_padding1; - __u32 s_reserved[204]; /* Padding to the end of the block */ -}; - -/* - * Codes for operating systems - */ -#define EXT2_OS_LINUX 0 -#define EXT2_OS_HURD 1 -#define EXT2_OS_MASIX 2 -#define EXT2_OS_FREEBSD 3 -#define EXT2_OS_LITES 4 - -/* - * Revision levels - */ -#define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */ -#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */ - -#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV -#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV - -#define EXT2_GOOD_OLD_INODE_SIZE 128 - -/* - * Feature set definitions - */ - -#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ - ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) ) -#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \ - ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) ) -#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ - ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) ) - -#define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001 - -#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001 -#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002 -#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 - -#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001 -#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 - -#define EXT2_FEATURE_COMPAT_SUPP 0 -#define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE -#ifdef notyet -#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ - EXT2_FEATURE_RO_COMPAT_BTREE_DIR) -#else -#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE) -#endif - -/* - * Default values for user and/or group using reserved blocks - */ -#define EXT2_DEF_RESUID 0 -#define EXT2_DEF_RESGID 0 - -/* - * Structure of a directory entry - */ -#define EXT2_NAME_LEN 255 - -struct ext2_dir_entry { - __u32 inode; /* Inode number */ - __u16 rec_len; /* Directory entry length */ - __u16 name_len; /* Name length */ - char name[EXT2_NAME_LEN]; /* File name */ -}; - -/* - * The new version of the directory entry. Since EXT2 structures are - * stored in intel byte order, and the name_len field could never be - * bigger than 255 chars, it's safe to reclaim the extra byte for the - * file_type field. - */ -struct ext2_dir_entry_2 { - __u32 inode; /* Inode number */ - __u16 rec_len; /* Directory entry length */ - __u8 name_len; /* Name length */ - __u8 file_type; - char name[EXT2_NAME_LEN]; /* File name */ -}; - -/* - * Ext2 directory file types. Only the low 3 bits are used. The - * other bits are reserved for now. - */ -#define EXT2_FT_UNKNOWN 0 -#define EXT2_FT_REG_FILE 1 -#define EXT2_FT_DIR 2 -#define EXT2_FT_CHRDEV 3 -#define EXT2_FT_BLKDEV 4 -#define EXT2_FT_FIFO 5 -#define EXT2_FT_SOCK 6 -#define EXT2_FT_SYMLINK 7 - -#define EXT2_FT_MAX 8 - -/* - * EXT2_DIR_PAD defines the directory entries boundaries - * - * NOTE: It must be a multiple of 4 - */ -#define EXT2_DIR_PAD 4 -#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) -#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ - ~EXT2_DIR_ROUND) - -#endif /* _LINUX_EXT2_FS_H */ diff --git a/sys/gnu/fs/ext2fs/ext2_fs_sb.h b/sys/gnu/fs/ext2fs/ext2_fs_sb.h deleted file mode 100644 index 2e3d78f1bc05..000000000000 --- a/sys/gnu/fs/ext2fs/ext2_fs_sb.h +++ /dev/null @@ -1,100 +0,0 @@ -/*- - * modified for EXT2FS support in Lites 1.1 - * - * Aug 1995, Godmar Back (gback@cs.utah.edu) - * University of Utah, Department of Computer Science - * - * $FreeBSD$ - */ -/*- - * linux/include/linux/ext2_fs_sb.h - * - * Copyright (C) 1992, 1993, 1994, 1995 - * Remy Card (card@masi.ibp.fr) - * Laboratoire MASI - Institut Blaise Pascal - * Universite Pierre et Marie Curie (Paris VI) - * - * from - * - * linux/include/linux/minix_fs_sb.h - * - * Copyright (C) 1991, 1992 Linus Torvalds - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _LINUX_EXT2_FS_SB -#define _LINUX_EXT2_FS_SB - -/* - * The following is not needed anymore since the descriptors buffer - * heads are now dynamically allocated - */ -/* #define EXT2_MAX_GROUP_DESC 8 */ - -#define EXT2_MAX_GROUP_LOADED 8 - -#define buffer_head buf -#define MAXMNTLEN 512 - -/* - * second extended-fs super-block data in memory - */ -struct ext2_sb_info { - unsigned long s_frag_size; /* Size of a fragment in bytes */ - unsigned long s_frags_per_block;/* Number of fragments per block */ - unsigned long s_inodes_per_block;/* Number of inodes per block */ - unsigned long s_frags_per_group;/* Number of fragments in a group */ - unsigned long s_blocks_per_group;/* Number of blocks in a group */ - unsigned long s_inodes_per_group;/* Number of inodes in a group */ - unsigned long s_itb_per_group; /* Number of inode table blocks per group */ - unsigned long s_gdb_count; /* Number of group descriptor blocks */ - unsigned long s_desc_per_block; /* Number of group descriptors per block */ - unsigned long s_groups_count; /* Number of groups in the fs */ - struct buffer_head * s_sbh; /* Buffer containing the super block */ - struct ext2_super_block * s_es; /* Pointer to the super block in the buffer */ - struct buffer_head ** s_group_desc; - unsigned short s_loaded_inode_bitmaps; - unsigned short s_loaded_block_bitmaps; - unsigned long s_inode_bitmap_number[EXT2_MAX_GROUP_LOADED]; - struct buffer_head * s_inode_bitmap[EXT2_MAX_GROUP_LOADED]; - unsigned long s_block_bitmap_number[EXT2_MAX_GROUP_LOADED]; - struct buffer_head * s_block_bitmap[EXT2_MAX_GROUP_LOADED]; - unsigned long s_mount_opt; -#ifdef notyet - uid_t s_resuid; - gid_t s_resgid; -#endif - unsigned short s_inode_size; - unsigned int s_first_ino; - unsigned short s_mount_state; - /* - stuff that FFS keeps in its super block or that linux - has in its non-ext2 specific super block and which is - generally considered useful - */ - unsigned long s_blocksize; - unsigned long s_blocksize_bits; - unsigned int s_bshift; /* = log2(s_blocksize) */ - quad_t s_qbmask; /* = s_blocksize - 1 */ - unsigned int s_fsbtodb; /* shift to get disk block */ - char s_rd_only; /* read-only */ - char s_dirt; /* fs modified flag */ - char s_wasvalid; /* valid at mount time */ - off_t fs_maxfilesize; - char fs_fsmnt[MAXMNTLEN]; /* name mounted on */ -}; - -#endif /* _LINUX_EXT2_FS_SB */ diff --git a/sys/gnu/fs/ext2fs/ext2_linux_balloc.c b/sys/gnu/fs/ext2fs/ext2_linux_balloc.c deleted file mode 100644 index 2c9a6dabf205..000000000000 --- a/sys/gnu/fs/ext2fs/ext2_linux_balloc.c +++ /dev/null @@ -1,624 +0,0 @@ -/*- - * modified for Lites 1.1 - * - * Aug 1995, Godmar Back (gback@cs.utah.edu) - * University of Utah, Department of Computer Science - * - * $FreeBSD$ - */ -/*- - * linux/fs/ext2/balloc.c - * - * Copyright (C) 1992, 1993, 1994, 1995 - * Remy Card (card@masi.ibp.fr) - * Laboratoire MASI - Institut Blaise Pascal - * Universite Pierre et Marie Curie (Paris VI) - * - * Enhanced block allocation by Stephen Tweedie (sct@dcs.ed.ac.uk), 1993 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License.. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * The free blocks are managed by bitmaps. A file system contains several - * blocks groups. Each group contains 1 bitmap block for blocks, 1 bitmap - * block for inodes, N blocks for the inode table and data blocks. - * - * The file system contains group descriptors which are located after the - * super block. Each descriptor contains the number of the bitmap block and - * the free blocks count in the block. The descriptors are loaded in memory - * when a file system is mounted (see ext2_read_super). - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#ifdef __i386__ -#include -#else -#include -#endif - -#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) - -/* got rid of get_group_desc since it can already be found in - * ext2_linux_ialloc.c - */ - -static void read_block_bitmap (struct mount * mp, - unsigned int block_group, - unsigned long bitmap_nr) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - struct ext2_group_desc * gdp; - struct buffer_head * bh; - int error; - - gdp = get_group_desc (mp, block_group, NULL); - if ((error = bread (VFSTOEXT2(mp)->um_devvp, - fsbtodb(sb, gdp->bg_block_bitmap),sb->s_blocksize, NOCRED, &bh)) != 0) - panic ( "read_block_bitmap: " - "Cannot read block bitmap - " - "block_group = %d, block_bitmap = %lu", - block_group, (unsigned long) gdp->bg_block_bitmap); - sb->s_block_bitmap_number[bitmap_nr] = block_group; - sb->s_block_bitmap[bitmap_nr] = bh; - LCK_BUF(bh) -} - -/* - * load_block_bitmap loads the block bitmap for a blocks group - * - * It maintains a cache for the last bitmaps loaded. This cache is managed - * with a LRU algorithm. - * - * Notes: - * 1/ There is one cache per mounted file system. - * 2/ If the file system contains less than EXT2_MAX_GROUP_LOADED groups, - * this function reads the bitmap without maintaining a LRU cache. - */ -static int load__block_bitmap (struct mount * mp, - unsigned int block_group) -{ - int i, j; - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - unsigned long block_bitmap_number; - struct buffer_head * block_bitmap; - - if (block_group >= sb->s_groups_count) - panic ( "load_block_bitmap: " - "block_group >= groups_count - " - "block_group = %d, groups_count = %lu", - block_group, sb->s_groups_count); - - if (sb->s_groups_count <= EXT2_MAX_GROUP_LOADED) { - if (sb->s_block_bitmap[block_group]) { - if (sb->s_block_bitmap_number[block_group] != - block_group) - panic ( "load_block_bitmap: " - "block_group != block_bitmap_number"); - else - return block_group; - } else { - read_block_bitmap (mp, block_group, block_group); - return block_group; - } - } - - for (i = 0; i < sb->s_loaded_block_bitmaps && - sb->s_block_bitmap_number[i] != block_group; i++) - ; - if (i < sb->s_loaded_block_bitmaps && - sb->s_block_bitmap_number[i] == block_group) { - block_bitmap_number = sb->s_block_bitmap_number[i]; - block_bitmap = sb->s_block_bitmap[i]; - for (j = i; j > 0; j--) { - sb->s_block_bitmap_number[j] = - sb->s_block_bitmap_number[j - 1]; - sb->s_block_bitmap[j] = - sb->s_block_bitmap[j - 1]; - } - sb->s_block_bitmap_number[0] = block_bitmap_number; - sb->s_block_bitmap[0] = block_bitmap; - } else { - if (sb->s_loaded_block_bitmaps < EXT2_MAX_GROUP_LOADED) - sb->s_loaded_block_bitmaps++; - else - ULCK_BUF(sb->s_block_bitmap[EXT2_MAX_GROUP_LOADED - 1]) - - for (j = sb->s_loaded_block_bitmaps - 1; j > 0; j--) { - sb->s_block_bitmap_number[j] = - sb->s_block_bitmap_number[j - 1]; - sb->s_block_bitmap[j] = - sb->s_block_bitmap[j - 1]; - } - read_block_bitmap (mp, block_group, 0); - } - return 0; -} - -static __inline int load_block_bitmap (struct mount * mp, - unsigned int block_group) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - if (sb->s_loaded_block_bitmaps > 0 && - sb->s_block_bitmap_number[0] == block_group) - return 0; - - if (sb->s_groups_count <= EXT2_MAX_GROUP_LOADED && - sb->s_block_bitmap_number[block_group] == block_group && - sb->s_block_bitmap[block_group]) - return block_group; - - return load__block_bitmap (mp, block_group); -} - -void ext2_free_blocks (struct mount * mp, unsigned long block, - unsigned long count) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - struct buffer_head * bh; - struct buffer_head * bh2; - unsigned long block_group; - unsigned long bit; - unsigned long i; - int bitmap_nr; - struct ext2_group_desc * gdp; - struct ext2_super_block * es; - - if (!sb) { - printf ("ext2_free_blocks: nonexistent device"); - return; - } - es = sb->s_es; - lock_super (VFSTOEXT2(mp)->um_devvp); - if (block < es->s_first_data_block || - (block + count) > es->s_blocks_count) { - printf ( "ext2_free_blocks: " - "Freeing blocks not in datazone - " - "block = %lu, count = %lu", block, count); - unlock_super (VFSTOEXT2(mp)->um_devvp); - return; - } - - ext2_debug ("freeing blocks %lu to %lu\n", block, block+count-1); - - block_group = (block - es->s_first_data_block) / - EXT2_BLOCKS_PER_GROUP(sb); - bit = (block - es->s_first_data_block) % EXT2_BLOCKS_PER_GROUP(sb); - if (bit + count > EXT2_BLOCKS_PER_GROUP(sb)) - panic ( "ext2_free_blocks: " - "Freeing blocks across group boundary - " - "Block = %lu, count = %lu", - block, count); - bitmap_nr = load_block_bitmap (mp, block_group); - bh = sb->s_block_bitmap[bitmap_nr]; - gdp = get_group_desc (mp, block_group, &bh2); - - if (/* test_opt (sb, CHECK_STRICT) && assume always strict ! */ - (in_range (gdp->bg_block_bitmap, block, count) || - in_range (gdp->bg_inode_bitmap, block, count) || - in_range (block, gdp->bg_inode_table, - sb->s_itb_per_group) || - in_range (block + count - 1, gdp->bg_inode_table, - sb->s_itb_per_group))) - panic ( "ext2_free_blocks: " - "Freeing blocks in system zones - " - "Block = %lu, count = %lu", - block, count); - - for (i = 0; i < count; i++) { - if (!clear_bit (bit + i, bh->b_data)) - printf ("ext2_free_blocks: " - "bit already cleared for block %lu", - block); - else { - gdp->bg_free_blocks_count++; - es->s_free_blocks_count++; - } - } - - mark_buffer_dirty(bh2); - mark_buffer_dirty(bh); -/**** - if (sb->s_flags & MS_SYNCHRONOUS) { - ll_rw_block (WRITE, 1, &bh); - wait_on_buffer (bh); - } -****/ - sb->s_dirt = 1; - unlock_super (VFSTOEXT2(mp)->um_devvp); - return; -} - -/* - * ext2_new_block uses a goal block to assist allocation. If the goal is - * free, or there is a free block within 32 blocks of the goal, that block - * is allocated. Otherwise a forward search is made for a free block; within - * each block group the search first looks for an entire free byte in the block - * bitmap, and then for any free bit if that fails. - */ -int ext2_new_block (struct mount * mp, unsigned long goal, - u_int32_t * prealloc_count, - u_int32_t * prealloc_block) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - struct buffer_head * bh; - struct buffer_head * bh2; - char * p, * r; - int i, j, k, tmp; - int bitmap_nr; - struct ext2_group_desc * gdp; - struct ext2_super_block * es; - -#ifdef EXT2FS_DEBUG - static int goal_hits = 0, goal_attempts = 0; -#endif - if (!sb) { - printf ("ext2_new_block: nonexistent device"); - return 0; - } - es = sb->s_es; - lock_super (VFSTOEXT2(mp)->um_devvp); - - ext2_debug ("goal=%lu.\n", goal); - -repeat: - /* - * First, test whether the goal block is free. - */ - if (goal < es->s_first_data_block || goal >= es->s_blocks_count) - goal = es->s_first_data_block; - i = (goal - es->s_first_data_block) / EXT2_BLOCKS_PER_GROUP(sb); - gdp = get_group_desc (mp, i, &bh2); - if (gdp->bg_free_blocks_count > 0) { - j = ((goal - es->s_first_data_block) % EXT2_BLOCKS_PER_GROUP(sb)); -#ifdef EXT2FS_DEBUG - if (j) - goal_attempts++; -#endif - bitmap_nr = load_block_bitmap (mp, i); - bh = sb->s_block_bitmap[bitmap_nr]; - - ext2_debug ("goal is at %d:%d.\n", i, j); - - if (!test_bit(j, bh->b_data)) { -#ifdef EXT2FS_DEBUG - goal_hits++; - ext2_debug ("goal bit allocated.\n"); -#endif - goto got_block; - } - if (j) { - /* - * The goal was occupied; search forward for a free - * block within the next XX blocks. - * - * end_goal is more or less random, but it has to be - * less than EXT2_BLOCKS_PER_GROUP. Aligning up to the - * next 64-bit boundary is simple.. - */ - int end_goal = (j + 63) & ~63; - j = find_next_zero_bit(bh->b_data, end_goal, j); - if (j < end_goal) - goto got_block; - } - - ext2_debug ("Bit not found near goal\n"); - - /* - * There has been no free block found in the near vicinity - * of the goal: do a search forward through the block groups, - * searching in each group first for an entire free byte in - * the bitmap and then for any free bit. - * - * Search first in the remainder of the current group; then, - * cyclicly search through the rest of the groups. - */ - p = ((char *) bh->b_data) + (j >> 3); - r = memscan(p, 0, (EXT2_BLOCKS_PER_GROUP(sb) - j + 7) >> 3); - k = (r - ((char *) bh->b_data)) << 3; - if (k < EXT2_BLOCKS_PER_GROUP(sb)) { - j = k; - goto search_back; - } - k = find_next_zero_bit ((unsigned long *) bh->b_data, - EXT2_BLOCKS_PER_GROUP(sb), - j); - if (k < EXT2_BLOCKS_PER_GROUP(sb)) { - j = k; - goto got_block; - } - } - - ext2_debug ("Bit not found in block group %d.\n", i); - - /* - * Now search the rest of the groups. We assume that - * i and gdp correctly point to the last group visited. - */ - for (k = 0; k < sb->s_groups_count; k++) { - i++; - if (i >= sb->s_groups_count) - i = 0; - gdp = get_group_desc (mp, i, &bh2); - if (gdp->bg_free_blocks_count > 0) - break; - } - if (k >= sb->s_groups_count) { - unlock_super (VFSTOEXT2(mp)->um_devvp); - return 0; - } - bitmap_nr = load_block_bitmap (mp, i); - bh = sb->s_block_bitmap[bitmap_nr]; - r = memscan(bh->b_data, 0, EXT2_BLOCKS_PER_GROUP(sb) >> 3); - j = (r - bh->b_data) << 3; - - if (j < EXT2_BLOCKS_PER_GROUP(sb)) - goto search_back; - else - j = find_first_zero_bit ((unsigned long *) bh->b_data, - EXT2_BLOCKS_PER_GROUP(sb)); - if (j >= EXT2_BLOCKS_PER_GROUP(sb)) { - printf ( "ext2_new_block: " - "Free blocks count corrupted for block group %d", i); - unlock_super (VFSTOEXT2(mp)->um_devvp); - return 0; - } - -search_back: - /* - * We have succeeded in finding a free byte in the block - * bitmap. Now search backwards up to 7 bits to find the - * start of this group of free blocks. - */ - for (k = 0; k < 7 && j > 0 && !test_bit (j - 1, bh->b_data); k++, j--); - -got_block: - - ext2_debug ("using block group %d(%d)\n", i, gdp->bg_free_blocks_count); - - tmp = j + i * EXT2_BLOCKS_PER_GROUP(sb) + es->s_first_data_block; - - if (/* test_opt (sb, CHECK_STRICT) && we are always strict. */ - (tmp == gdp->bg_block_bitmap || - tmp == gdp->bg_inode_bitmap || - in_range (tmp, gdp->bg_inode_table, sb->s_itb_per_group))) - panic ( "ext2_new_block: " - "Allocating block in system zone - " - "%dth block = %u in group %u", j, tmp, i); - - if (set_bit (j, bh->b_data)) { - printf ( "ext2_new_block: " - "bit already set for block %d", j); - goto repeat; - } - - ext2_debug ("found bit %d\n", j); - - /* - * Do block preallocation now if required. - */ -#ifdef EXT2_PREALLOCATE - if (prealloc_block) { - *prealloc_count = 0; - *prealloc_block = tmp + 1; - for (k = 1; - k < 8 && (j + k) < EXT2_BLOCKS_PER_GROUP(sb); k++) { - if (set_bit (j + k, bh->b_data)) - break; - (*prealloc_count)++; - } - gdp->bg_free_blocks_count -= *prealloc_count; - es->s_free_blocks_count -= *prealloc_count; - ext2_debug ("Preallocated a further %lu bits.\n", - *prealloc_count); - } -#endif - - j = tmp; - - mark_buffer_dirty(bh); -/**** - if (sb->s_flags & MS_SYNCHRONOUS) { - ll_rw_block (WRITE, 1, &bh); - wait_on_buffer (bh); - } -****/ - if (j >= es->s_blocks_count) { - printf ( "ext2_new_block: " - "block >= blocks count - " - "block_group = %d, block=%d", i, j); - unlock_super (VFSTOEXT2(mp)->um_devvp); - return 0; - } - - ext2_debug ("allocating block %d. " - "Goal hits %d of %d.\n", j, goal_hits, goal_attempts); - - gdp->bg_free_blocks_count--; - mark_buffer_dirty(bh2); - es->s_free_blocks_count--; - sb->s_dirt = 1; - unlock_super (VFSTOEXT2(mp)->um_devvp); - return j; -} - -#ifdef unused -static unsigned long ext2_count_free_blocks (struct mount * mp) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; -#ifdef EXT2FS_DEBUG - struct ext2_super_block * es; - unsigned long desc_count, bitmap_count, x; - int bitmap_nr; - struct ext2_group_desc * gdp; - int i; - - lock_super (VFSTOEXT2(mp)->um_devvp); - es = sb->s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; - for (i = 0; i < sb->s_groups_count; i++) { - gdp = get_group_desc (mp, i, NULL); - desc_count += gdp->bg_free_blocks_count; - bitmap_nr = load_block_bitmap (mp, i); - x = ext2_count_free (sb->s_block_bitmap[bitmap_nr], - sb->s_blocksize); - ext2_debug ("group %d: stored = %d, counted = %lu\n", - i, gdp->bg_free_blocks_count, x); - bitmap_count += x; - } - ext2_debug( "stored = %lu, computed = %lu, %lu\n", - es->s_free_blocks_count, desc_count, bitmap_count); - unlock_super (VFSTOEXT2(mp)->um_devvp); - return bitmap_count; -#else - return sb->s_es->s_free_blocks_count; -#endif -} -#endif /* unused */ - -static __inline int block_in_use (unsigned long block, - struct ext2_sb_info * sb, - unsigned char * map) -{ - return test_bit ((block - sb->s_es->s_first_data_block) % - EXT2_BLOCKS_PER_GROUP(sb), map); -} - -static int test_root(int a, int b) -{ - if (a == 0) - return 1; - while (1) { - if (a == 1) - return 1; - if (a % b) - return 0; - a = a / b; - } -} - -int ext2_group_sparse(int group) -{ - return (test_root(group, 3) || test_root(group, 5) || - test_root(group, 7)); -} - -#ifdef unused -static void ext2_check_blocks_bitmap (struct mount * mp) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - struct buffer_head * bh; - struct ext2_super_block * es; - unsigned long desc_count, bitmap_count, x; - unsigned long desc_blocks; - int bitmap_nr; - struct ext2_group_desc * gdp; - int i, j; - - lock_super (VFSTOEXT2(mp)->um_devvp); - es = sb->s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; - desc_blocks = (sb->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / - EXT2_DESC_PER_BLOCK(sb); - for (i = 0; i < sb->s_groups_count; i++) { - gdp = get_group_desc (mp, i, NULL); - desc_count += gdp->bg_free_blocks_count; - bitmap_nr = load_block_bitmap (mp, i); - bh = sb->s_block_bitmap[bitmap_nr]; - - if (!(es->s_feature_ro_compat & - EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER) || - ext2_group_sparse(i)) { - if (!test_bit (0, bh->b_data)) - printf ("ext2_check_blocks_bitmap: " - "Superblock in group %d " - "is marked free", i); - - for (j = 0; j < desc_blocks; j++) - if (!test_bit (j + 1, bh->b_data)) - printf ("ext2_check_blocks_bitmap: " - "Descriptor block #%d in group " - "%d is marked free", j, i); - } - - if (!block_in_use (gdp->bg_block_bitmap, sb, bh->b_data)) - printf ("ext2_check_blocks_bitmap: " - "Block bitmap for group %d is marked free", - i); - - if (!block_in_use (gdp->bg_inode_bitmap, sb, bh->b_data)) - printf ("ext2_check_blocks_bitmap: " - "Inode bitmap for group %d is marked free", - i); - - for (j = 0; j < sb->s_itb_per_group; j++) - if (!block_in_use (gdp->bg_inode_table + j, sb, bh->b_data)) - printf ("ext2_check_blocks_bitmap: " - "Block #%d of the inode table in " - "group %d is marked free", j, i); - - x = ext2_count_free (bh, sb->s_blocksize); - if (gdp->bg_free_blocks_count != x) - printf ("ext2_check_blocks_bitmap: " - "Wrong free blocks count for group %d, " - "stored = %d, counted = %lu", i, - gdp->bg_free_blocks_count, x); - bitmap_count += x; - } - if (es->s_free_blocks_count != bitmap_count) - printf ("ext2_check_blocks_bitmap: " - "Wrong free blocks count in super block, " - "stored = %lu, counted = %lu", - (unsigned long) es->s_free_blocks_count, bitmap_count); - unlock_super (VFSTOEXT2(mp)->um_devvp); -} -#endif /* unused */ - -/* - * this function is taken from - * linux/fs/ext2/bitmap.c - */ - -static int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; - -unsigned long ext2_count_free (struct buffer_head * map, unsigned int numchars) -{ - unsigned int i; - unsigned long sum = 0; - - if (!map) - return (0); - for (i = 0; i < numchars; i++) - sum += nibblemap[map->b_data[i] & 0xf] + - nibblemap[(map->b_data[i] >> 4) & 0xf]; - return (sum); -} diff --git a/sys/gnu/fs/ext2fs/ext2_linux_ialloc.c b/sys/gnu/fs/ext2fs/ext2_linux_ialloc.c deleted file mode 100644 index b3263b46ec9d..000000000000 --- a/sys/gnu/fs/ext2fs/ext2_linux_ialloc.c +++ /dev/null @@ -1,526 +0,0 @@ -/*- - * modified for Lites 1.1 - * - * Aug 1995, Godmar Back (gback@cs.utah.edu) - * University of Utah, Department of Computer Science - * - * $FreeBSD$ - */ -/*- - * linux/fs/ext2/ialloc.c - * - * Copyright (C) 1992, 1993, 1994, 1995 - * Remy Card (card@masi.ibp.fr) - * Laboratoire MASI - Institut Blaise Pascal - * Universite Pierre et Marie Curie (Paris VI) - * - * BSD ufs-inspired inode and directory allocation by - * Stephen Tweedie (sct@dcs.ed.ac.uk), 1993 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * The free inodes are managed by bitmaps. A file system contains several - * blocks groups. Each group contains 1 bitmap block for blocks, 1 bitmap - * block for inodes, N blocks for the inode table and data blocks. - * - * The file system contains group descriptors which are located after the - * super block. Each descriptor contains the number of the bitmap block and - * the free blocks count in the block. The descriptors are loaded in memory - * when a file system is mounted (see ext2_read_super). - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef __i386__ -#include -#else -#include -#endif - -/* this is supposed to mark a buffer dirty on ready for delayed writing - */ -void mark_buffer_dirty(struct buf *bh) -{ - int s; - - s = splbio(); - bh->b_flags |= B_DIRTY; - splx(s); -} - -struct ext2_group_desc * get_group_desc (struct mount * mp, - unsigned int block_group, - struct buffer_head ** bh) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - unsigned long group_desc; - unsigned long desc; - struct ext2_group_desc * gdp; - - if (block_group >= sb->s_groups_count) - panic ("get_group_desc: " - "block_group >= groups_count - " - "block_group = %d, groups_count = %lu", - block_group, sb->s_groups_count); - - group_desc = block_group / EXT2_DESC_PER_BLOCK(sb); - desc = block_group % EXT2_DESC_PER_BLOCK(sb); - if (!sb->s_group_desc[group_desc]) - panic ( "get_group_desc:" - "Group descriptor not loaded - " - "block_group = %d, group_desc = %lu, desc = %lu", - block_group, group_desc, desc); - gdp = (struct ext2_group_desc *) - sb->s_group_desc[group_desc]->b_data; - if (bh) - *bh = sb->s_group_desc[group_desc]; - return gdp + desc; -} - -static void read_inode_bitmap (struct mount * mp, - unsigned long block_group, - unsigned int bitmap_nr) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - struct ext2_group_desc * gdp; - struct buffer_head * bh; - int error; - - gdp = get_group_desc (mp, block_group, NULL); - if ((error = bread (VFSTOEXT2(mp)->um_devvp, - fsbtodb(sb, gdp->bg_inode_bitmap), - sb->s_blocksize, - NOCRED, &bh)) != 0) - panic ( "read_inode_bitmap:" - "Cannot read inode bitmap - " - "block_group = %lu, inode_bitmap = %lu", - block_group, (unsigned long) gdp->bg_inode_bitmap); - sb->s_inode_bitmap_number[bitmap_nr] = block_group; - sb->s_inode_bitmap[bitmap_nr] = bh; - LCK_BUF(bh) -} - -/* - * load_inode_bitmap loads the inode bitmap for a blocks group - * - * It maintains a cache for the last bitmaps loaded. This cache is managed - * with a LRU algorithm. - * - * Notes: - * 1/ There is one cache per mounted file system. - * 2/ If the file system contains less than EXT2_MAX_GROUP_LOADED groups, - * this function reads the bitmap without maintaining a LRU cache. - */ -static int load_inode_bitmap (struct mount * mp, - unsigned int block_group) -{ - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - int i, j; - unsigned long inode_bitmap_number; - struct buffer_head * inode_bitmap; - - if (block_group >= sb->s_groups_count) - panic ("load_inode_bitmap:" - "block_group >= groups_count - " - "block_group = %d, groups_count = %lu", - block_group, sb->s_groups_count); - if (sb->s_loaded_inode_bitmaps > 0 && - sb->s_inode_bitmap_number[0] == block_group) - return 0; - if (sb->s_groups_count <= EXT2_MAX_GROUP_LOADED) { - if (sb->s_inode_bitmap[block_group]) { - if (sb->s_inode_bitmap_number[block_group] != - block_group) - panic ( "load_inode_bitmap:" - "block_group != inode_bitmap_number"); - else - return block_group; - } else { - read_inode_bitmap (mp, block_group, block_group); - return block_group; - } - } - - for (i = 0; i < sb->s_loaded_inode_bitmaps && - sb->s_inode_bitmap_number[i] != block_group; - i++) - ; - if (i < sb->s_loaded_inode_bitmaps && - sb->s_inode_bitmap_number[i] == block_group) { - inode_bitmap_number = sb->s_inode_bitmap_number[i]; - inode_bitmap = sb->s_inode_bitmap[i]; - for (j = i; j > 0; j--) { - sb->s_inode_bitmap_number[j] = - sb->s_inode_bitmap_number[j - 1]; - sb->s_inode_bitmap[j] = - sb->s_inode_bitmap[j - 1]; - } - sb->s_inode_bitmap_number[0] = inode_bitmap_number; - sb->s_inode_bitmap[0] = inode_bitmap; - } else { - if (sb->s_loaded_inode_bitmaps < EXT2_MAX_GROUP_LOADED) - sb->s_loaded_inode_bitmaps++; - else - ULCK_BUF(sb->s_inode_bitmap[EXT2_MAX_GROUP_LOADED - 1]) - for (j = sb->s_loaded_inode_bitmaps - 1; j > 0; j--) { - sb->s_inode_bitmap_number[j] = - sb->s_inode_bitmap_number[j - 1]; - sb->s_inode_bitmap[j] = - sb->s_inode_bitmap[j - 1]; - } - read_inode_bitmap (mp, block_group, 0); - } - return 0; -} - - -void ext2_free_inode (struct inode * inode) -{ - struct ext2_sb_info * sb; - struct buffer_head * bh; - struct buffer_head * bh2; - unsigned long block_group; - unsigned long bit; - int bitmap_nr; - struct ext2_group_desc * gdp; - struct ext2_super_block * es; - - if (!inode) - return; - - if (inode->i_nlink) { - printf ("ext2_free_inode: inode has nlink=%d\n", - inode->i_nlink); - return; - } - - ext2_debug ("freeing inode %lu\n", inode->i_number); - - sb = inode->i_e2fs; - lock_super (DEVVP(inode)); - if (inode->i_number < EXT2_FIRST_INO(sb) || - inode->i_number > sb->s_es->s_inodes_count) { - printf ("free_inode reserved inode or nonexistent inode"); - unlock_super (DEVVP(inode)); - return; - } - es = sb->s_es; - block_group = (inode->i_number - 1) / EXT2_INODES_PER_GROUP(sb); - bit = (inode->i_number - 1) % EXT2_INODES_PER_GROUP(sb); - bitmap_nr = load_inode_bitmap (ITOV(inode)->v_mount, block_group); - bh = sb->s_inode_bitmap[bitmap_nr]; - if (!clear_bit (bit, bh->b_data)) - printf ( "ext2_free_inode:" - "bit already cleared for inode %lu", - (unsigned long)inode->i_number); - else { - gdp = get_group_desc (ITOV(inode)->v_mount, block_group, &bh2); - gdp->bg_free_inodes_count++; - if (S_ISDIR(inode->i_mode)) - gdp->bg_used_dirs_count--; - mark_buffer_dirty(bh2); - es->s_free_inodes_count++; - } - mark_buffer_dirty(bh); -/*** XXX - if (sb->s_flags & MS_SYNCHRONOUS) { - ll_rw_block (WRITE, 1, &bh); - wait_on_buffer (bh); - } -***/ - sb->s_dirt = 1; - unlock_super (DEVVP(inode)); -} - -#ifdef linux -/* - * This function increments the inode version number - * - * This may be used one day by the NFS server - */ -static void inc_inode_version (struct inode * inode, - struct ext2_group_desc *gdp, - int mode) -{ - unsigned long inode_block; - struct buffer_head * bh; - struct ext2_inode * raw_inode; - - inode_block = gdp->bg_inode_table + (((inode->i_number - 1) % - EXT2_INODES_PER_GROUP(inode->i_sb)) / - EXT2_INODES_PER_BLOCK(inode->i_sb)); - bh = bread (inode->i_sb->s_dev, inode_block, inode->i_sb->s_blocksize); - if (!bh) { - printf ("inc_inode_version Cannot load inode table block - " - "inode=%lu, inode_block=%lu\n", - inode->i_number, inode_block); - inode->u.ext2_i.i_version = 1; - return; - } - raw_inode = ((struct ext2_inode *) bh->b_data) + - (((inode->i_number - 1) % - EXT2_INODES_PER_GROUP(inode->i_sb)) % - EXT2_INODES_PER_BLOCK(inode->i_sb)); - raw_inode->i_version++; - inode->u.ext2_i.i_version = raw_inode->i_version; - bdwrite (bh); -} - -#endif /* linux */ - -/* - * There are two policies for allocating an inode. If the new inode is - * a directory, then a forward search is made for a block group with both - * free space and a low directory-to-inode ratio; if that fails, then of - * the groups with above-average free space, that group with the fewest - * directories already is chosen. - * - * For other inodes, search forward from the parent directory\'s block - * group to find a free inode. - */ -/* - * this functino has been reduced to the actual 'find the inode number' part - */ -ino_t ext2_new_inode (const struct inode * dir, int mode) -{ - struct ext2_sb_info * sb; - struct buffer_head * bh; - struct buffer_head * bh2; - int i, j, avefreei; - int bitmap_nr; - struct ext2_group_desc * gdp; - struct ext2_group_desc * tmp; - struct ext2_super_block * es; - - if (!dir) - return 0; - sb = dir->i_e2fs; - - lock_super (DEVVP(dir)); - es = sb->s_es; -repeat: - gdp = NULL; i=0; - - if (S_ISDIR(mode)) { - avefreei = es->s_free_inodes_count / - sb->s_groups_count; -/* I am not yet convinced that this next bit is necessary. - i = dir->u.ext2_i.i_block_group; - for (j = 0; j < sb->u.ext2_sb.s_groups_count; j++) { - tmp = get_group_desc (sb, i, &bh2); - if ((tmp->bg_used_dirs_count << 8) < - tmp->bg_free_inodes_count) { - gdp = tmp; - break; - } - else - i = ++i % sb->u.ext2_sb.s_groups_count; - } -*/ - if (!gdp) { - for (j = 0; j < sb->s_groups_count; j++) { - tmp = get_group_desc(ITOV(dir)->v_mount,j,&bh2); - if (tmp->bg_free_inodes_count && - tmp->bg_free_inodes_count >= avefreei) { - if (!gdp || - (tmp->bg_free_blocks_count > - gdp->bg_free_blocks_count)) { - i = j; - gdp = tmp; - } - } - } - } - } - else - { - /* - * Try to place the inode in its parent directory - */ - i = dir->i_block_group; - tmp = get_group_desc (ITOV(dir)->v_mount, i, &bh2); - if (tmp->bg_free_inodes_count) - gdp = tmp; - else - { - /* - * Use a quadratic hash to find a group with a - * free inode - */ - for (j = 1; j < sb->s_groups_count; j <<= 1) { - i += j; - if (i >= sb->s_groups_count) - i -= sb->s_groups_count; - tmp = get_group_desc(ITOV(dir)->v_mount,i,&bh2); - if (tmp->bg_free_inodes_count) { - gdp = tmp; - break; - } - } - } - if (!gdp) { - /* - * That failed: try linear search for a free inode - */ - i = dir->i_block_group + 1; - for (j = 2; j < sb->s_groups_count; j++) { - if (++i >= sb->s_groups_count) - i = 0; - tmp = get_group_desc(ITOV(dir)->v_mount,i,&bh2); - if (tmp->bg_free_inodes_count) { - gdp = tmp; - break; - } - } - } - } - - if (!gdp) { - unlock_super (DEVVP(dir)); - return 0; - } - bitmap_nr = load_inode_bitmap (ITOV(dir)->v_mount, i); - bh = sb->s_inode_bitmap[bitmap_nr]; - if ((j = find_first_zero_bit ((unsigned long *) bh->b_data, - EXT2_INODES_PER_GROUP(sb))) < - EXT2_INODES_PER_GROUP(sb)) { - if (set_bit (j, bh->b_data)) { - printf ( "ext2_new_inode:" - "bit already set for inode %d", j); - goto repeat; - } -/* Linux now does the following: - mark_buffer_dirty(bh); - if (sb->s_flags & MS_SYNCHRONOUS) { - ll_rw_block (WRITE, 1, &bh); - wait_on_buffer (bh); - } -*/ - mark_buffer_dirty(bh); - } else { - if (gdp->bg_free_inodes_count != 0) { - printf ( "ext2_new_inode:" - "Free inodes count corrupted in group %d", - i); - unlock_super (DEVVP(dir)); - return 0; - } - goto repeat; - } - j += i * EXT2_INODES_PER_GROUP(sb) + 1; - if (j < EXT2_FIRST_INO(sb) || j > es->s_inodes_count) { - printf ( "ext2_new_inode:" - "reserved inode or inode > inodes count - " - "block_group = %d,inode=%d", i, j); - unlock_super (DEVVP(dir)); - return 0; - } - gdp->bg_free_inodes_count--; - if (S_ISDIR(mode)) - gdp->bg_used_dirs_count++; - mark_buffer_dirty(bh2); - es->s_free_inodes_count--; - /* mark_buffer_dirty(sb->u.ext2_sb.s_sbh, 1); */ - sb->s_dirt = 1; - unlock_super (DEVVP(dir)); - return j; -} - -#ifdef unused -static unsigned long ext2_count_free_inodes (struct mount * mp) -{ -#ifdef EXT2FS_DEBUG - struct ext2_sb_info *sb = VFSTOEXT2(mp)->um_e2fs; - struct ext2_super_block * es; - unsigned long desc_count, bitmap_count, x; - int bitmap_nr; - struct ext2_group_desc * gdp; - int i; - - lock_super (VFSTOEXT2(mp)->um_devvp); - es = sb->s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; - for (i = 0; i < sb->s_groups_count; i++) { - gdp = get_group_desc (mp, i, NULL); - desc_count += gdp->bg_free_inodes_count; - bitmap_nr = load_inode_bitmap (mp, i); - x = ext2_count_free (sb->s_inode_bitmap[bitmap_nr], - EXT2_INODES_PER_GROUP(sb) / 8); - ext2_debug ("group %d: stored = %d, counted = %lu\n", - i, gdp->bg_free_inodes_count, x); - bitmap_count += x; - } - ext2_debug("stored = %lu, computed = %lu, %lu\n", - es->s_free_inodes_count, desc_count, bitmap_count); - unlock_super (VFSTOEXT2(mp)->um_devvp); - return desc_count; -#else - return VFSTOEXT2(mp)->um_e2fsb->s_free_inodes_count; -#endif -} -#endif /* unused */ - -#ifdef LATER -void ext2_check_inodes_bitmap (struct mount * mp) -{ - struct ext2_super_block * es; - unsigned long desc_count, bitmap_count, x; - int bitmap_nr; - struct ext2_group_desc * gdp; - int i; - - lock_super (sb); - es = sb->u.ext2_sb.s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; - for (i = 0; i < sb->u.ext2_sb.s_groups_count; i++) { - gdp = get_group_desc (sb, i, NULL); - desc_count += gdp->bg_free_inodes_count; - bitmap_nr = load_inode_bitmap (sb, i); - x = ext2_count_free (sb->u.ext2_sb.s_inode_bitmap[bitmap_nr], - EXT2_INODES_PER_GROUP(sb) / 8); - if (gdp->bg_free_inodes_count != x) - printf ( "ext2_check_inodes_bitmap:" - "Wrong free inodes count in group %d, " - "stored = %d, counted = %lu", i, - gdp->bg_free_inodes_count, x); - bitmap_count += x; - } - if (es->s_free_inodes_count != bitmap_count) - printf ( "ext2_check_inodes_bitmap:" - "Wrong free inodes count in super block, " - "stored = %lu, counted = %lu", - (unsigned long) es->s_free_inodes_count, bitmap_count); - unlock_super (sb); -} -#endif diff --git a/sys/gnu/fs/ext2fs/i386-bitops.h b/sys/gnu/fs/ext2fs/i386-bitops.h deleted file mode 100644 index 001c51db7fb9..000000000000 --- a/sys/gnu/fs/ext2fs/i386-bitops.h +++ /dev/null @@ -1,175 +0,0 @@ -/* $FreeBSD$ */ -/* - * this is mixture of i386/bitops.h and asm/string.h - * taken from the Linux source tree - * - * XXX replace with Mach routines or reprogram in C - */ -/*- - * Copyright 1992, Linus Torvalds. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ -#ifndef _SYS_GNU_EXT2FS_I386_BITOPS_H_ -#define _SYS_GNU_EXT2FS_I386_BITOPS_H_ - -/* - * These have to be done with inline assembly: that way the bit-setting - * is guaranteed to be atomic. All bit operations return 0 if the bit - * was cleared before the operation and != 0 if it was not. - * - * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). - */ - -/* - * Some hacks to defeat gcc over-optimizations.. - */ -struct __dummy { unsigned long a[100]; }; -#define ADDR (*(struct __dummy *) addr) - -static __inline__ int set_bit(int nr, void * addr) -{ - int oldbit; - - __asm__ __volatile__("btsl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"ir" (nr)); - return oldbit; -} - -static __inline__ int clear_bit(int nr, void * addr) -{ - int oldbit; - - __asm__ __volatile__("btrl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"ir" (nr)); - return oldbit; -} - -static __inline__ int change_bit(int nr, void * addr) -{ - int oldbit; - - __asm__ __volatile__("btcl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit),"=m" (ADDR) - :"ir" (nr)); - return oldbit; -} - -/* - * This routine doesn't need to be atomic, but it's faster to code it - * this way. - */ -static __inline__ int test_bit(int nr, void * addr) -{ - int oldbit; - - __asm__ __volatile__("btl %2,%1\n\tsbbl %0,%0" - :"=r" (oldbit) - :"m" (ADDR),"ir" (nr)); - return oldbit; -} - -/* - * Find-bit routines.. - */ -static __inline__ int find_first_zero_bit(void * addr, unsigned size) -{ - int res; - int _count = (size + 31) >> 5; - - if (!size) - return 0; - __asm__(" \n\ - cld \n\ - movl $-1,%%eax \n\ - xorl %%edx,%%edx \n\ - repe; scasl \n\ - je 1f \n\ - xorl -4(%%edi),%%eax \n\ - subl $4,%%edi \n\ - bsfl %%eax,%%edx \n\ -1: subl %%ebx,%%edi \n\ - shll $3,%%edi \n\ - addl %%edi,%%edx" - : "=c" (_count), "=D" (addr), "=d" (res) - : "0" (_count), "1" (addr), "b" (addr) - : "ax"); - return res; -} - -static __inline__ int find_next_zero_bit (void * addr, int size, int offset) -{ - unsigned long * p = ((unsigned long *) addr) + (offset >> 5); - int set = 0, bit = offset & 31, res; - - if (bit) { - /* - * Look for zero in first byte - */ - __asm__(" \n\ - bsfl %1,%0 \n\ - jne 1f \n\ - movl $32, %0 \n\ -1: " - : "=r" (set) - : "r" (~(*p >> bit))); - if (set < (32 - bit)) - return set + offset; - set = 32 - bit; - p++; - } - /* - * No zero yet, search remaining full bytes for a zero - */ - res = find_first_zero_bit (p, size - 32 * (p - (unsigned long *) addr)); - return (offset + set + res); -} - -/* - * ffz = Find First Zero in word. Undefined if no zero exists, - * so code should check against ~0UL first.. - */ -static __inline__ unsigned long ffz(unsigned long word) -{ - __asm__("bsfl %1,%0" - :"=r" (word) - :"r" (~word)); - return word; -} - -/* - * memscan() taken from linux asm/string.h - */ -/* - * find the first occurrence of byte 'c', or 1 past the area if none - */ -static __inline__ char * memscan(void * addr, unsigned char c, int size) -{ - if (!size) - return addr; - __asm__(" \n\ - cld \n\ - repnz; scasb \n\ - jnz 1f \n\ - dec %%edi \n\ -1: " - : "=D" (addr), "=c" (size) - : "0" (addr), "1" (size), "a" (c)); - return addr; -} - -#endif /* !_SYS_GNU_EXT2FS_I386_BITOPS_H_ */ diff --git a/sys/gnu/fs/reiserfs/reiserfs_fs.h b/sys/gnu/fs/reiserfs/reiserfs_fs.h index 3c41563ab0af..5ad021ba4b5e 100644 --- a/sys/gnu/fs/reiserfs/reiserfs_fs.h +++ b/sys/gnu/fs/reiserfs/reiserfs_fs.h @@ -728,15 +728,16 @@ struct stat_data_v1 { * We want common flags to have the same values as in ext2, * so chattr(1) will work without problems */ -#include -#define REISERFS_IMMUTABLE_FL EXT2_IMMUTABLE_FL -#define REISERFS_APPEND_FL EXT2_APPEND_FL -#define REISERFS_SYNC_FL EXT2_SYNC_FL -#define REISERFS_NOATIME_FL EXT2_NOATIME_FL -#define REISERFS_NODUMP_FL EXT2_NODUMP_FL -#define REISERFS_SECRM_FL EXT2_SECRM_FL -#define REISERFS_UNRM_FL EXT2_UNRM_FL -#define REISERFS_COMPR_FL EXT2_COMPR_FL +#include +#include +#define REISERFS_IMMUTABLE_FL EXT2_IMMUTABLE +#define REISERFS_APPEND_FL EXT2_APPEND +#define REISERFS_SYNC_FL EXT2_SYNC +#define REISERFS_NOATIME_FL EXT2_NOATIME +#define REISERFS_NODUMP_FL EXT2_NODUMP +#define REISERFS_SECRM_FL EXT2_SECRM +#define REISERFS_UNRM_FL EXT2_UNRM +#define REISERFS_COMPR_FL EXT2_COMPR #define REISERFS_NOTAIL_FL EXT2_NOTAIL_FL /* diff --git a/sys/gnu/fs/reiserfs/reiserfs_vfsops.c b/sys/gnu/fs/reiserfs/reiserfs_vfsops.c index 739eff9a56bf..6b4272e9660e 100644 --- a/sys/gnu/fs/reiserfs/reiserfs_vfsops.c +++ b/sys/gnu/fs/reiserfs/reiserfs_vfsops.c @@ -429,40 +429,11 @@ reiserfs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td) struct reiserfs_super_block *rs; struct cdev *dev = devvp->v_rdev; -#if (__FreeBSD_version >= 600000) struct g_consumer *cp; struct bufobj *bo; -#endif //ronly = (mp->mnt_flag & MNT_RDONLY) != 0; -#if (__FreeBSD_version < 600000) - /* - * Disallow multiple mounts of the same device. - * Disallow mounting of a device that is currently in use - * (except for root, which might share swap device for miniroot). - * Flush out any old buffers remaining from a previous use. - */ - if ((error = vfs_mountedon(devvp)) != 0) - return (error); - if (vcount(devvp) > 1) - return (EBUSY); - - error = vinvalbuf(devvp, V_SAVE, td->td_ucred, td, 0, 0); - if (error) { - VOP_UNLOCK(devvp, 0); - return (error); - } - - /* - * Open the device in read-only, 'cause we don't support write - * for now - */ - error = VOP_OPEN(devvp, FREAD, FSCRED, td, NULL); - VOP_UNLOCK(devvp, 0); - if (error) - return (error); -#else DROP_GIANT(); g_topology_lock(); error = g_vfs_open(devvp, &cp, "reiserfs", /* read-only */ 0); @@ -475,7 +446,6 @@ reiserfs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td) bo = &devvp->v_bufobj; bo->bo_private = cp; bo->bo_ops = g_vfs_bufops; -#endif if (devvp->v_rdev->si_iosize_max != 0) mp->mnt_iosize_max = devvp->v_rdev->si_iosize_max; @@ -500,10 +470,8 @@ reiserfs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td) rmp->rm_mountp = mp; rmp->rm_devvp = devvp; rmp->rm_dev = dev; -#if (__FreeBSD_version >= 600000) rmp->rm_bo = &devvp->v_bufobj; rmp->rm_cp = cp; -#endif /* Set default values for options: non-aggressive tails */ REISERFS_SB(sbi)->s_mount_opt = (1 << REISERFS_SMALLTAIL); @@ -630,9 +598,6 @@ out: } } -#if (__FreeBSD_version < 600000) - (void)VOP_CLOSE(devvp, FREAD, NOCRED, td); -#else if (cp != NULL) { DROP_GIANT(); g_topology_lock(); @@ -640,7 +605,6 @@ out: g_topology_unlock(); PICKUP_GIANT(); } -#endif if (sbi) free(sbi, M_REISERFSMNT); diff --git a/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c b/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c index 80c95181ccc5..20be557d771a 100644 --- a/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c +++ b/sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c @@ -1117,7 +1117,7 @@ _xfs_strategy( } */ *ap) { daddr_t blkno; - struct buf *bp;; + struct buf *bp; struct bufobj *bo; struct vnode *vp; struct xfs_mount *xmp; diff --git a/sys/i386/bios/apm.c b/sys/i386/bios/apm.c index 49d028b2399a..e015cd09f68c 100644 --- a/sys/i386/bios/apm.c +++ b/sys/i386/bios/apm.c @@ -79,9 +79,8 @@ int apm_evindex; #define SCFLAG_OCTL 0x0000002 #define SCFLAG_OPEN (SCFLAG_ONORMAL|SCFLAG_OCTL) -#define APMDEV(dev) (dev2unit(dev)&0x0f) #define APMDEV_NORMAL 0 -#define APMDEV_CTL 8 +#define APMDEV_CTL 1 #ifdef PC98 extern int bios32_apm98(struct bios_regs *, u_int, u_short); @@ -1249,8 +1248,10 @@ apm_attach(device_t dev) sc->suspending = 0; sc->running = 0; - make_dev(&apm_cdevsw, 0, 0, 5, 0664, "apm"); - make_dev(&apm_cdevsw, 8, 0, 5, 0660, "apmctl"); + make_dev(&apm_cdevsw, APMDEV_NORMAL, + UID_ROOT, GID_OPERATOR, 0664, "apm"); + make_dev(&apm_cdevsw, APMDEV_CTL, + UID_ROOT, GID_OPERATOR, 0660, "apmctl"); return 0; } @@ -1258,12 +1259,11 @@ static int apmopen(struct cdev *dev, int flag, int fmt, struct thread *td) { struct apm_softc *sc = &apm_softc; - int ctl = APMDEV(dev); if (sc == NULL || sc->initialized == 0) return (ENXIO); - switch (ctl) { + switch (dev2unit(dev)) { case APMDEV_CTL: if (!(flag & FWRITE)) return EINVAL; @@ -1275,9 +1275,6 @@ apmopen(struct cdev *dev, int flag, int fmt, struct thread *td) case APMDEV_NORMAL: sc->sc_flags |= SCFLAG_ONORMAL; break; - default: - return ENXIO; - break; } return 0; } @@ -1286,9 +1283,8 @@ static int apmclose(struct cdev *dev, int flag, int fmt, struct thread *td) { struct apm_softc *sc = &apm_softc; - int ctl = APMDEV(dev); - switch (ctl) { + switch (dev2unit(dev)) { case APMDEV_CTL: apm_lastreq_rejected(); sc->sc_flags &= ~SCFLAG_OCTL; @@ -1429,7 +1425,7 @@ apmioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td } /* for /dev/apmctl */ - if (APMDEV(dev) == APMDEV_CTL) { + if (dev2unit(dev) == APMDEV_CTL) { struct apm_event_info *evp; int i; @@ -1468,7 +1464,7 @@ apmwrite(struct cdev *dev, struct uio *uio, int ioflag) int error; u_char enabled; - if (APMDEV(dev) != APMDEV_CTL) + if (dev2unit(dev) != APMDEV_CTL) return(ENODEV); if (uio->uio_resid != sizeof(u_int)) return(E2BIG); diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC index ef958af9a14f..730dcc9db89e 100644 --- a/sys/i386/conf/GENERIC +++ b/sys/i386/conf/GENERIC @@ -23,15 +23,6 @@ cpu I586_CPU cpu I686_CPU ident GENERIC -# To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" # Default places to look for devices. - -# Use the following to compile in values accessible to the kernel -# through getenv() (or kenv(1) in userland). The format of the file -# is 'variable=value', see kenv(1) -# -# env "GENERIC.env" - makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols options SCHED_ULE # ULE scheduler @@ -75,11 +66,13 @@ options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework options FLOWTABLE # per-cpu routing cache #options KDTRACE_HOOKS # Kernel DTrace hooks +options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging for use in -current options KDB # Enable kernel debugger support. options DDB # Support DDB. options GDB # Support remote GDB. +options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS options WITNESS # Enable checks to detect deadlocks and cycles @@ -269,7 +262,7 @@ device xe # Xircom pccard Ethernet device wlan # 802.11 support options IEEE80211_DEBUG # enable debug msgs options IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's -options IEEE80211_SUPPORT_MESH # enable 802.11s D3.0 support +options IEEE80211_SUPPORT_MESH # enable 802.11s draft support device wlan_wep # 802.11 WEP support device wlan_ccmp # 802.11 CCMP support device wlan_tkip # 802.11 TKIP support @@ -287,6 +280,7 @@ device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs. device loop # Network loopback device random # Entropy device device ether # Ethernet support +device vlan # 802.1Q VLAN support device tun # Packet tunnel. device pty # BSD-style compatibility pseudo ttys device md # Memory "disks" @@ -310,10 +304,6 @@ device ukbd # Keyboard device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da device ums # Mouse -device rum # Ralink Technology RT2501USB wireless NICs -device ural # Ralink Technology RT2500USB wireless NICs -device uath # Atheros AR5523 wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs device urio # Diamond Rio 500 MP3 player # USB Serial devices device u3g # USB-based 3G modems (Option, Huawei, Sierra) @@ -333,6 +323,11 @@ device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet device udav # Davicom DM9601E USB +# USB Wireless +device rum # Ralink Technology RT2501USB wireless NICs +device uath # Atheros AR5523 wireless NICs +device ural # Ralink Technology RT2500USB wireless NICs +device zyd # ZyDAS zb1211/zb1211b wireless NICs # FireWire support device firewire # FireWire bus code diff --git a/sys/i386/conf/Makefile b/sys/i386/conf/Makefile index 2c006e9c2c80..e04b0abe62f9 100644 --- a/sys/i386/conf/Makefile +++ b/sys/i386/conf/Makefile @@ -1,3 +1,5 @@ # $FreeBSD$ +TARGET=i386 + .include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES index d85e3f6abc77..af3da83d90e3 100644 --- a/sys/i386/conf/NOTES +++ b/sys/i386/conf/NOTES @@ -469,9 +469,6 @@ device tdfx_linux # Enable Linuxulator support # kernel environment variables to select initial debugging levels for the # Intel ACPICA code. (Note that the Intel code must also have USE_DEBUGGER # defined when it is built). -# -# Note that building ACPI into the kernel is deprecated; the module is -# normally loaded automatically by the loader. device acpi options ACPI_DEBUG @@ -522,6 +519,7 @@ device radeondrm # ATI Radeon device savagedrm # S3 Savage3D, Savage4 device sisdrm # SiS 300/305, 540, 630 device tdfxdrm # 3dfx Voodoo 3/4/5 and Banshee +device viadrm # VIA options DRM_DEBUG # Include debug printfs (slow) # @@ -536,7 +534,6 @@ hint.mse.0.irq="5" # Network interfaces: # -# ath: Atheros a/b/g WiFi adapters (requires ath_hal and wlan) # ce: Cronyx Tau-PCI/32 sync single/dual port G.703/E1 serial adaptor # with 32 HDLC subchannels (requires sppp (default), or NETGRAPH if # NETGRAPH_CRONYX is configured) @@ -555,30 +552,20 @@ hint.mse.0.irq="5" # Intel EtherExpress # ipw: Intel PRO/Wireless 2100 IEEE 802.11 adapter # iwi: Intel PRO/Wireless 2200BG/2225BG/2915ABG IEEE 802.11 adapters +# Requires the iwi firmware module # iwn: Intel Wireless WiFi Link 4965AGN 802.11 network adapters +# Requires the iwn firmware module +# mwl: Marvell 88W8363 IEEE 802.11 adapter +# Requires the mwl firmware module # nfe: nVidia nForce MCP on-board Ethernet Networking (BSD open source) # nve: nVidia nForce MCP on-board Ethernet Networking -# ral: Ralink Technology IEEE 802.11 wireless adapter # sbni: Granch SBNI12-xx ISA and PCI adapters # wl: Lucent Wavelan (ISA card only). # wpi: Intel 3945ABG Wireless LAN controller +# Requires the wpi firmware module # Order for ISA/EISA devices is important here -device ath # Atheros pci/cardbus NIC's -device ath_hal # pci/cardbus chip support -#device ath_ar5210 # AR5210 chips -#device ath_ar5211 # AR5211 chips -#device ath_ar5212 # AR5212 chips -#device ath_rf2413 -#device ath_rf2417 -#device ath_rf2425 -#device ath_rf5111 -#device ath_rf5112 -#device ath_rf5413 -#device ath_ar5416 # AR5416 chips -options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors -device ath_rate_sample # SampleRate tx rate control for ath device ce device cp device cs @@ -603,17 +590,17 @@ hint.ie.2.at="isa" hint.ie.2.port="0x300" hint.ie.2.irq="5" hint.ie.2.maddr="0xd0000" +device ipw device iwi device iwn -device ipw # Hint for the i386-only ISA front-end of le(4). hint.le.0.at="isa" hint.le.0.port="0x280" hint.le.0.irq="10" hint.le.0.drq="0" +device mwl device nfe # nVidia nForce MCP on-board Ethernet Networking device nve # nVidia nForce MCP on-board Ethernet Networking -device ral device sbni hint.sbni.0.at="isa" hint.sbni.0.port="0x210" @@ -626,6 +613,45 @@ options WLCACHE # enables the signal-strength cache options WLDEBUG # enables verbose debugging output device wpi +# IEEE 802.11 adapter firmware modules + +# Intel PRO/Wireless 2100 firmware: +# ipwfw: BSS/IBSS/monitor mode firmware +# ipwbssfw: BSS mode firmware +# ipwibssfw: IBSS mode firmware +# ipwmonitorfw: Monitor mode firmware +# Intel PRO/Wireless 2200BG/2225BG/2915ABG firmware: +# iwifw: BSS/IBSS/monitor mode firmware +# iwibssfw: BSS mode firmware +# iwiibssfw: IBSS mode firmware +# iwimonitorfw: Monitor mode firmware +# Intel Wireless WiFi Link 4965/1000/5000/6000 series firmware: +# iwnfw: Single module to support the 4965/1000/5000/5150/6000 +# iwn4965fw: Specific module for the 4965 only +# iwn1000fw: Specific module for the 1000 only +# iwn5000fw: Specific module for the 5000 only +# iwn5150fw: Specific module for the 5150 only +# iwn6000fw: Specific module for the 6000 only +# mwlfw: Marvell 88W8363 firmware +# wpifw: Intel 3945ABG Wireless LAN Controller firmware + +device iwifw +device iwibssfw +device iwiibssfw +device iwimonitorfw +device ipwfw +device ipwbssfw +device ipwibssfw +device ipwmonitorfw +device iwnfw +device iwn4965fw +device iwn1000fw +device iwn5000fw +device iwn5150fw +device iwn6000fw +device mwlfw +device wpifw + # # ATA raid adapters # @@ -785,15 +811,19 @@ hint.pcf.0.irq="5" # Hardware watchdog timers: # # ichwd: Intel ICH watchdog timer +# amdsbwd: AMD SB7xx watchdog timer # device ichwd +device amdsbwd # # Temperature sensors: # # coretemp: on-die sensor on Intel Core and newer CPUs +# amdtemp: on-die sensor on AMD K8/K10/K11 CPUs # device coretemp +device amdtemp # # CPU control pseudo-device. Provides access to MSRs, CPUID info and diff --git a/sys/i386/conf/PAE b/sys/i386/conf/PAE index 5e69a593e6ef..a8abf7aaf54e 100644 --- a/sys/i386/conf/PAE +++ b/sys/i386/conf/PAE @@ -10,10 +10,6 @@ ident PAE-GENERIC # To make a PAE kernel, the next option is needed options PAE # Physical Address Extensions Kernel -# Compile acpi in statically since the module isn't built properly. Most -# machines which support large amounts of memory require acpi. -device acpi - # Don't build modules with this kernel config, since they are not built with # the correct options headers. makeoptions NO_MODULES=yes diff --git a/sys/i386/conf/XEN b/sys/i386/conf/XEN index 6c949663f82c..ed07b0de59f3 100644 --- a/sys/i386/conf/XEN +++ b/sys/i386/conf/XEN @@ -49,6 +49,7 @@ options AUDIT # Security event auditing options KDB # Enable kernel debugger support. options DDB # Support DDB. options GDB # Support remote GDB. +options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS options WITNESS # Enable checks to detect deadlocks and cycles @@ -66,12 +67,12 @@ options SMP # Symmetric MultiProcessor Kernel device apic # I/O APIC -device atkbdc # AT keyboard controller -device atkbd # AT keyboard +#device atkbdc # AT keyboard controller +#device atkbd # AT keyboard device psm # PS/2 mouse device pci -device kbdmux # keyboard multiplexer +#device kbdmux # keyboard multiplexer # Pseudo devices. device loop # Network loopback diff --git a/sys/i386/isa/atpic_vector.s b/sys/i386/i386/atpic_vector.s similarity index 100% rename from sys/i386/isa/atpic_vector.s rename to sys/i386/i386/atpic_vector.s diff --git a/sys/i386/i386/bpf_jit_machdep.c b/sys/i386/i386/bpf_jit_machdep.c index 5d8e0345640b..e9d9ecabe406 100644 --- a/sys/i386/i386/bpf_jit_machdep.c +++ b/sys/i386/i386/bpf_jit_machdep.c @@ -1,6 +1,6 @@ /*- * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (C) 2005-2008 Jung-uk Kim + * Copyright (C) 2005-2009 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,6 +42,9 @@ __FBSDID("$FreeBSD$"); #include #else #include +#include +#include +#include #endif #include @@ -51,21 +54,22 @@ __FBSDID("$FreeBSD$"); #include -bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, int *); +bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, size_t *); /* - * emit routine to update the jump table + * Emit routine to update the jump table. */ static void emit_length(bpf_bin_stream *stream, __unused u_int value, u_int len) { - (stream->refs)[stream->bpf_pc] += len; + if (stream->refs != NULL) + (stream->refs)[stream->bpf_pc] += len; stream->cur_ip += len; } /* - * emit routine to output the actual binary code + * Emit routine to output the actual binary code. */ static void emit_code(bpf_bin_stream *stream, u_int value, u_int len) @@ -92,56 +96,124 @@ emit_code(bpf_bin_stream *stream, u_int value, u_int len) } /* - * Function that does the real stuff + * Scan the filter program and find possible optimization. + */ +static int +bpf_jit_optimize(struct bpf_insn *prog, u_int nins) +{ + int flags; + u_int i; + + /* Do we return immediately? */ + if (BPF_CLASS(prog[0].code) == BPF_RET) + return (BPF_JIT_FRET); + + for (flags = 0, i = 0; i < nins; i++) { + switch (prog[i].code) { + case BPF_LD|BPF_W|BPF_ABS: + case BPF_LD|BPF_H|BPF_ABS: + case BPF_LD|BPF_B|BPF_ABS: + case BPF_LD|BPF_W|BPF_IND: + case BPF_LD|BPF_H|BPF_IND: + case BPF_LD|BPF_B|BPF_IND: + case BPF_LDX|BPF_MSH|BPF_B: + flags |= BPF_JIT_FPKT; + break; + case BPF_LD|BPF_MEM: + case BPF_LDX|BPF_MEM: + case BPF_ST: + case BPF_STX: + flags |= BPF_JIT_FMEM; + break; + case BPF_JMP|BPF_JA: + case BPF_JMP|BPF_JGT|BPF_K: + case BPF_JMP|BPF_JGE|BPF_K: + case BPF_JMP|BPF_JEQ|BPF_K: + case BPF_JMP|BPF_JSET|BPF_K: + case BPF_JMP|BPF_JGT|BPF_X: + case BPF_JMP|BPF_JGE|BPF_X: + case BPF_JMP|BPF_JEQ|BPF_X: + case BPF_JMP|BPF_JSET|BPF_X: + flags |= BPF_JIT_FJMP; + break; + case BPF_ALU|BPF_DIV|BPF_K: + flags |= BPF_JIT_FADK; + break; + } + if (flags == BPF_JIT_FLAG_ALL) + break; + } + + return (flags); +} + +/* + * Function that does the real stuff. */ bpf_filter_func -bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) +bpf_jit_compile(struct bpf_insn *prog, u_int nins, size_t *size) { - struct bpf_insn *ins; - u_int i, pass; bpf_bin_stream stream; + struct bpf_insn *ins; + int flags, fret, fpkt, fmem, fjmp, fadk; + int save_esp; + u_int i, pass; /* - * NOTE: do not modify the name of this variable, as it's used by + * NOTE: Do not modify the name of this variable, as it's used by * the macros to emit code. */ emit_func emitm; - /* Allocate the reference table for the jumps */ + flags = bpf_jit_optimize(prog, nins); + fret = (flags & BPF_JIT_FRET) != 0; + fpkt = (flags & BPF_JIT_FPKT) != 0; + fmem = (flags & BPF_JIT_FMEM) != 0; + fjmp = (flags & BPF_JIT_FJMP) != 0; + fadk = (flags & BPF_JIT_FADK) != 0; + save_esp = (fpkt || fmem || fadk); /* Stack is used. */ + + if (fret) + nins = 1; + + memset(&stream, 0, sizeof(stream)); + + /* Allocate the reference table for the jumps. */ + if (fjmp) { #ifdef _KERNEL - stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int), - M_BPFJIT, M_NOWAIT); + stream.refs = malloc((nins + 1) * sizeof(u_int), M_BPFJIT, + M_NOWAIT | M_ZERO); #else - stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int)); + stream.refs = calloc(nins + 1, sizeof(u_int)); #endif - if (stream.refs == NULL) - return (NULL); - - /* Reset the reference table */ - for (i = 0; i < nins + 1; i++) - stream.refs[i] = 0; - - stream.cur_ip = 0; - stream.bpf_pc = 0; + if (stream.refs == NULL) + return (NULL); + } /* - * the first pass will emit the lengths of the instructions - * to create the reference table + * The first pass will emit the lengths of the instructions + * to create the reference table. */ emitm = emit_length; - pass = 0; - for (;;) { + for (pass = 0; pass < 2; pass++) { ins = prog; - /* create the procedure header */ - PUSH(EBP); - MOVrd(ESP, EBP); - PUSH(EDI); - PUSH(ESI); - PUSH(EBX); - MOVodd(8, EBP, EBX); - MOVodd(16, EBP, EDI); + /* Create the procedure header. */ + if (save_esp) { + PUSH(EBP); + MOVrd(ESP, EBP); + } + if (fmem) + SUBib(BPF_MEMWORDS * sizeof(uint32_t), ESP); + if (save_esp) + PUSH(ESI); + if (fpkt) { + PUSH(EDI); + PUSH(EBX); + MOVodd(8, EBP, EBX); + MOVodd(16, EBP, EDI); + } for (i = 0; i < nins; i++) { stream.bpf_pc++; @@ -156,17 +228,27 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_RET|BPF_K: MOVid(ins->k, EAX); - POP(EBX); - POP(ESI); - POP(EDI); - LEAVE_RET(); + if (save_esp) { + if (fpkt) { + POP(EBX); + POP(EDI); + } + POP(ESI); + LEAVE(); + } + RET(); break; case BPF_RET|BPF_A: - POP(EBX); - POP(ESI); - POP(EDI); - LEAVE_RET(); + if (save_esp) { + if (fpkt) { + POP(EBX); + POP(EDI); + } + POP(ESI); + LEAVE(); + } + RET(); break; case BPF_LD|BPF_W|BPF_ABS: @@ -179,9 +261,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) JAEb(7); ZEROrd(EAX); POP(EBX); - POP(ESI); POP(EDI); - LEAVE_RET(); + POP(ESI); + LEAVE(); + RET(); MOVobd(EBX, ESI, EAX); BSWAP(EAX); break; @@ -196,9 +279,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) CMPid(sizeof(int16_t), ECX); JAEb(5); POP(EBX); - POP(ESI); POP(EDI); - LEAVE_RET(); + POP(ESI); + LEAVE(); + RET(); MOVobw(EBX, ESI, AX); SWAP_AX(); break; @@ -209,18 +293,29 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) CMPrd(EDI, ESI); JBb(5); POP(EBX); - POP(ESI); POP(EDI); - LEAVE_RET(); + POP(ESI); + LEAVE(); + RET(); MOVobb(EBX, ESI, AL); break; case BPF_LD|BPF_W|BPF_LEN: - MOVodd(12, EBP, EAX); + if (save_esp) + MOVodd(12, EBP, EAX); + else { + MOVrd(ESP, ECX); + MOVodd(12, ECX, EAX); + } break; case BPF_LDX|BPF_W|BPF_LEN: - MOVodd(12, EBP, EDX); + if (save_esp) + MOVodd(12, EBP, EDX); + else { + MOVrd(ESP, ECX); + MOVodd(12, ECX, EDX); + } break; case BPF_LD|BPF_W|BPF_IND: @@ -238,9 +333,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) JAEb(7); ZEROrd(EAX); POP(EBX); - POP(ESI); POP(EDI); - LEAVE_RET(); + POP(ESI); + LEAVE(); + RET(); MOVobd(EBX, ESI, EAX); BSWAP(EAX); break; @@ -260,9 +356,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) CMPid(sizeof(int16_t), ECX); JAEb(5); POP(EBX); - POP(ESI); POP(EDI); - LEAVE_RET(); + POP(ESI); + LEAVE(); + RET(); MOVobw(EBX, ESI, AX); SWAP_AX(); break; @@ -277,9 +374,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) CMPrd(ESI, ECX); JAb(5); POP(EBX); - POP(ESI); POP(EDI); - LEAVE_RET(); + POP(ESI); + LEAVE(); + RET(); ADDrd(EDX, ESI); MOVobb(EBX, ESI, AL); break; @@ -290,9 +388,10 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) JBb(7); ZEROrd(EAX); POP(EBX); - POP(ESI); POP(EDI); - LEAVE_RET(); + POP(ESI); + LEAVE(); + RET(); ZEROrd(EDX); MOVobb(EBX, ESI, DL); ANDib(0x0f, DL); @@ -308,14 +407,16 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) break; case BPF_LD|BPF_MEM: - MOVid((uintptr_t)mem, ECX); - MOVid(ins->k * 4, ESI); + MOVrd(EBP, ECX); + MOVid(((int)ins->k - BPF_MEMWORDS) * + sizeof(uint32_t), ESI); MOVobd(ECX, ESI, EAX); break; case BPF_LDX|BPF_MEM: - MOVid((uintptr_t)mem, ECX); - MOVid(ins->k * 4, ESI); + MOVrd(EBP, ECX); + MOVid(((int)ins->k - BPF_MEMWORDS) * + sizeof(uint32_t), ESI); MOVobd(ECX, ESI, EDX); break; @@ -325,14 +426,16 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) * be optimized if the previous instruction * was already of this type */ - MOVid((uintptr_t)mem, ECX); - MOVid(ins->k * 4, ESI); + MOVrd(EBP, ECX); + MOVid(((int)ins->k - BPF_MEMWORDS) * + sizeof(uint32_t), ESI); MOVomd(EAX, ECX, ESI); break; case BPF_STX: - MOVid((uintptr_t)mem, ECX); - MOVid(ins->k * 4, ESI); + MOVrd(EBP, ECX); + MOVid(((int)ins->k - BPF_MEMWORDS) * + sizeof(uint32_t), ESI); MOVomd(EDX, ECX, ESI); break; @@ -413,12 +516,23 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) case BPF_ALU|BPF_DIV|BPF_X: TESTrd(EDX, EDX); - JNEb(7); - ZEROrd(EAX); - POP(EBX); - POP(ESI); - POP(EDI); - LEAVE_RET(); + if (save_esp) { + if (fpkt) { + JNEb(7); + ZEROrd(EAX); + POP(EBX); + POP(EDI); + } else { + JNEb(5); + ZEROrd(EAX); + } + POP(ESI); + LEAVE(); + } else { + JNEb(3); + ZEROrd(EAX); + } + RET(); MOVrd(EDX, ECX); ZEROrd(EDX); DIVrd(ECX); @@ -497,47 +611,56 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) ins++; } - pass++; - if (pass == 2) - break; + if (pass > 0) + continue; + *size = stream.cur_ip; #ifdef _KERNEL - stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT); - if (stream.ibuf == NULL) { - free(stream.refs, M_BPFJIT); - return (NULL); - } + stream.ibuf = malloc(*size, M_BPFJIT, M_NOWAIT); + if (stream.ibuf == NULL) + break; #else - stream.ibuf = (char *)malloc(stream.cur_ip); - if (stream.ibuf == NULL) { - free(stream.refs); - return (NULL); + stream.ibuf = mmap(NULL, *size, PROT_READ | PROT_WRITE, + MAP_ANON, -1, 0); + if (stream.ibuf == MAP_FAILED) { + stream.ibuf = NULL; + break; } #endif /* - * modify the reference table to contain the offsets and - * not the lengths of the instructions + * Modify the reference table to contain the offsets and + * not the lengths of the instructions. */ - for (i = 1; i < nins + 1; i++) - stream.refs[i] += stream.refs[i - 1]; + if (fjmp) + for (i = 1; i < nins + 1; i++) + stream.refs[i] += stream.refs[i - 1]; - /* Reset the counters */ + /* Reset the counters. */ stream.cur_ip = 0; stream.bpf_pc = 0; - /* the second pass creates the actual code */ + /* The second pass creates the actual code. */ emitm = emit_code; } /* - * the reference table is needed only during compilation, - * now we can free it + * The reference table is needed only during compilation, + * now we can free it. */ + if (fjmp) #ifdef _KERNEL - free(stream.refs, M_BPFJIT); + free(stream.refs, M_BPFJIT); #else - free(stream.refs); + free(stream.refs); +#endif + +#ifndef _KERNEL + if (stream.ibuf != NULL && + mprotect(stream.ibuf, *size, PROT_READ | PROT_EXEC) != 0) { + munmap(stream.ibuf, *size); + stream.ibuf = NULL; + } #endif return ((bpf_filter_func)stream.ibuf); diff --git a/sys/i386/i386/bpf_jit_machdep.h b/sys/i386/i386/bpf_jit_machdep.h index 78a3b33134ab..e82f68a2ec7a 100644 --- a/sys/i386/i386/bpf_jit_machdep.h +++ b/sys/i386/i386/bpf_jit_machdep.h @@ -1,6 +1,6 @@ /*- * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (C) 2005-2008 Jung-uk Kim + * Copyright (C) 2005-2009 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -60,7 +60,17 @@ #define DL 2 #define BL 3 -/* A stream of native binary code.*/ +/* Optimization flags */ +#define BPF_JIT_FRET 0x01 +#define BPF_JIT_FPKT 0x02 +#define BPF_JIT_FMEM 0x04 +#define BPF_JIT_FJMP 0x08 +#define BPF_JIT_FADK 0x10 + +#define BPF_JIT_FLAG_ALL \ + (BPF_JIT_FPKT | BPF_JIT_FMEM | BPF_JIT_FJMP | BPF_JIT_FADK) + +/* A stream of native binary code */ typedef struct bpf_bin_stream { /* Current native instruction pointer. */ int cur_ip; @@ -92,7 +102,7 @@ typedef struct bpf_bin_stream { typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); /* - * native Instruction Macros + * Native instruction macros */ /* movl i32,r32 */ @@ -165,9 +175,14 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, (5 << 4) | (1 << 3) | (r32 & 0x7), 1); \ } while (0) -/* leave/ret */ -#define LEAVE_RET() do { \ - emitm(&stream, 0xc3c9, 2); \ +/* leave */ +#define LEAVE() do { \ + emitm(&stream, 0xc9, 1); \ +} while (0) + +/* ret */ +#define RET() do { \ + emitm(&stream, 0xc3, 1); \ } while (0) /* addl sr32,dr32 */ @@ -203,6 +218,13 @@ typedef void (*emit_func)(bpf_bin_stream *stream, u_int value, u_int n); emitm(&stream, i32, 4); \ } while (0) +/* subl i8,r32 */ +#define SUBib(i8, r32) do { \ + emitm(&stream, 0x83, 1); \ + emitm(&stream, (29 << 3) | (r32 & 0x7), 1); \ + emitm(&stream, i8, 1); \ +} while (0) + /* mull r32 */ #define MULrd(r32) do { \ emitm(&stream, 0xf7, 1); \ diff --git a/sys/i386/i386/elan-mmcr.c b/sys/i386/i386/elan-mmcr.c index 45f7c3ac27ca..b184237b971f 100644 --- a/sys/i386/i386/elan-mmcr.c +++ b/sys/i386/i386/elan-mmcr.c @@ -416,7 +416,8 @@ elan_watchdog(void *foo __unused, u_int spec, int *error) } static int -elan_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +elan_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { if (offset >= 0x1000) diff --git a/sys/i386/i386/elf_machdep.c b/sys/i386/i386/elf_machdep.c index abfe147769b5..408d6ad4a769 100644 --- a/sys/i386/i386/elf_machdep.c +++ b/sys/i386/i386/elf_machdep.c @@ -88,7 +88,7 @@ static Elf32_Brandinfo freebsd_brand_info = { .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE }; -SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t) elf32_insert_brand_entry, &freebsd_brand_info); diff --git a/sys/i386/i386/exception.s b/sys/i386/i386/exception.s index 1451fa8c6443..9db9532372a6 100644 --- a/sys/i386/i386/exception.s +++ b/sys/i386/i386/exception.s @@ -294,7 +294,7 @@ ENTRY(fork_trampoline) SUPERALIGN_TEXT MCOUNT_LABEL(bintr) -#include +#include #ifdef DEV_APIC .data diff --git a/sys/i386/i386/i686_mem.c b/sys/i386/i386/i686_mem.c index fe229cc3be20..cc6f300617a0 100644 --- a/sys/i386/i386/i686_mem.c +++ b/sys/i386/i386/i686_mem.c @@ -707,11 +707,8 @@ i686_mem_drvinit(void *unused) switch (cpu_vendor_id) { case CPU_VENDOR_INTEL: case CPU_VENDOR_AMD: - break; case CPU_VENDOR_CENTAUR: - if (cpu_exthigh >= 0x80000008) - break; - /* FALLTHROUGH */ + break; default: return; } diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c index 66c5fed5fa64..62c27abca47d 100644 --- a/sys/i386/i386/identcpu.c +++ b/sys/i386/i386/identcpu.c @@ -265,7 +265,7 @@ printcpuinfo(void) strcat(cpu_model, "/P54C"); break; case 0x30: - strcat(cpu_model, "/P54T Overdrive"); + strcat(cpu_model, "/P24T"); break; case 0x40: strcat(cpu_model, "/P55C"); @@ -746,7 +746,7 @@ printcpuinfo(void) "\024SSE4.1" "\025SSE4.2" "\026x2APIC" /* xAPIC Extensions */ - "\027" + "\027MOVBE" "\030POPCNT" "\031" "\032" @@ -1303,6 +1303,21 @@ print_AMD_info(void) (amd_whcr & 0x0100) ? "Enable" : "Disable"); } } + + /* + * Opteron Rev E shows a bug as in very rare occasions a read memory + * barrier is not performed as expected if it is followed by a + * non-atomic read-modify-write instruction. + * As long as that bug pops up very rarely (intensive machine usage + * on other operating systems generally generates one unexplainable + * crash any 2 months) and as long as a model specific fix would be + * impratical at this stage, print out a warning string if the broken + * model and family are identified. + */ + if (CPUID_TO_FAMILY(cpu_id) == 0xf && CPUID_TO_MODEL(cpu_id) >= 0x20 && + CPUID_TO_MODEL(cpu_id) <= 0x3f) + printf("WARNING: This architecture revision has known SMP " + "hardware bugs which may cause random instability\n"); } static void diff --git a/sys/i386/i386/initcpu.c b/sys/i386/i386/initcpu.c index 1ecff1c25041..dad79197ec0c 100644 --- a/sys/i386/i386/initcpu.c +++ b/sys/i386/i386/initcpu.c @@ -75,6 +75,12 @@ static void init_mendocino(void); static int hw_instruction_sse; SYSCTL_INT(_hw, OID_AUTO, instruction_sse, CTLFLAG_RD, &hw_instruction_sse, 0, "SIMD/MMX2 instructions available in CPU"); +/* + * -1: automatic (default) + * 0: keep enable CLFLUSH + * 1: force disable CLFLUSH + */ +static int hw_clflush_disable = -1; /* Must *NOT* be BSS or locore will bzero these after setting them */ int cpu = 0; /* Are we 386, 386sx, 486, etc? */ @@ -717,6 +723,21 @@ initializecpu(void) */ if ((cpu_feature & CPUID_CLFSH) != 0) cpu_clflush_line_size = ((cpu_procinfo >> 8) & 0xff) * 8; + /* + * XXXKIB: (temporary) hack to work around traps generated when + * CLFLUSHing APIC registers window. + */ + TUNABLE_INT_FETCH("hw.clflush_disable", &hw_clflush_disable); + if (cpu_vendor_id == CPU_VENDOR_INTEL && !(cpu_feature & CPUID_SS) && + hw_clflush_disable == -1) + cpu_feature &= ~CPUID_CLFSH; + /* + * Allow to disable CLFLUSH feature manually by + * hw.clflush_disable tunable. This may help Xen guest on some AMD + * CPUs. + */ + if (hw_clflush_disable == 1) + cpu_feature &= ~CPUID_CLFSH; #if defined(PC98) && !defined(CPU_UPGRADE_HW_CACHE) /* diff --git a/sys/i386/i386/intr_machdep.c b/sys/i386/i386/intr_machdep.c index 3d1b0c49dfc0..75be20593a32 100644 --- a/sys/i386/i386/intr_machdep.c +++ b/sys/i386/i386/intr_machdep.c @@ -366,6 +366,23 @@ intr_init(void *dummy __unused) } SYSINIT(intr_init, SI_SUB_INTR, SI_ORDER_FIRST, intr_init, NULL); +/* Add a description to an active interrupt handler. */ +int +intr_describe(u_int vector, void *ih, const char *descr) +{ + struct intsrc *isrc; + int error; + + isrc = intr_lookup_source(vector); + if (isrc == NULL) + return (EINVAL); + error = intr_event_describe_handler(isrc->is_event, ih, descr); + if (error) + return (error); + intrcnt_updatename(isrc); + return (0); +} + #ifdef DDB /* * Dump data about interrupt handlers diff --git a/sys/i386/i386/io.c b/sys/i386/i386/io.c index eb0deb67c5f4..c392af5f38da 100644 --- a/sys/i386/i386/io.c +++ b/sys/i386/i386/io.c @@ -76,3 +76,12 @@ ioclose(struct cdev *dev __unused, int flags __unused, int fmt __unused, return (0); } + +/* ARGSUSED */ +int +ioioctl(struct cdev *dev __unused, u_long cmd __unused, caddr_t data __unused, + int fflag __unused, struct thread *td __unused) +{ + + return (ENXIO); +} diff --git a/sys/i386/i386/local_apic.c b/sys/i386/i386/local_apic.c index 9b1d1b3173e0..e0049c8cf5b3 100644 --- a/sys/i386/i386/local_apic.c +++ b/sys/i386/i386/local_apic.c @@ -34,6 +34,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_atpic.h" #include "opt_hwpmc_hooks.h" #include "opt_kdtrace.h" @@ -160,6 +161,17 @@ static uint32_t lvt_mode(struct lapic *la, u_int pin, uint32_t value); struct pic lapic_pic = { .pic_resume = lapic_resume }; +/* + * The atrtc device is compiled in only if atpic is present. + * If it is not, force lapic to take care of all the clocks. + */ +#ifdef DEV_ATPIC +static int lapic_allclocks; +TUNABLE_INT("machdep.lapic_allclocks", &lapic_allclocks); +#else +static int lapic_allclocks = 1; +#endif + static uint32_t lvt_mode(struct lapic *la, u_int pin, uint32_t value) { @@ -416,11 +428,9 @@ lapic_disable_pmc(void) /* * Called by cpu_initclocks() on the BSP to setup the local APIC timer so - * that it can drive hardclock, statclock, and profclock. This function - * returns true if it is able to use the local APIC timer to drive the - * clocks and false if it is not able. + * that it can drive hardclock, statclock, and profclock. */ -int +enum lapic_clock lapic_setup_clock(void) { u_long value; @@ -428,10 +438,10 @@ lapic_setup_clock(void) /* Can't drive the timer without a local APIC. */ if (lapic == NULL) - return (0); + return (LAPIC_CLOCK_NONE); if (resource_int_value("apic", 0, "clock", &i) == 0 && i == 0) - return (0); + return (LAPIC_CLOCK_NONE); /* Start off with a divisor of 2 (power on reset default). */ lapic_timer_divisor = 2; @@ -450,7 +460,7 @@ lapic_setup_clock(void) panic("lapic: Divisor too big"); value /= 2; if (bootverbose) - printf("lapic: Divisor %lu, Frequency %lu hz\n", + printf("lapic: Divisor %lu, Frequency %lu Hz\n", lapic_timer_divisor, value); /* @@ -463,19 +473,27 @@ lapic_setup_clock(void) * (and profhz) run at hz. If 'hz' is below 1500 but above * 750, then we let the lapic timer run at 2 * 'hz'. If 'hz' * is below 750 then we let the lapic timer run at 4 * 'hz'. + * + * Please note that stathz and profhz are set only if all the + * clocks are handled through the local APIC. */ - if (hz >= 1500) + if (lapic_allclocks != 0) { + if (hz >= 1500) + lapic_timer_hz = hz; + else if (hz >= 750) + lapic_timer_hz = hz * 2; + else + lapic_timer_hz = hz * 4; + } else lapic_timer_hz = hz; - else if (hz >= 750) - lapic_timer_hz = hz * 2; - else - lapic_timer_hz = hz * 4; - if (lapic_timer_hz < 128) - stathz = lapic_timer_hz; - else - stathz = lapic_timer_hz / (lapic_timer_hz / 128); - profhz = lapic_timer_hz; lapic_timer_period = value / lapic_timer_hz; + if (lapic_allclocks != 0) { + if (lapic_timer_hz < 128) + stathz = lapic_timer_hz; + else + stathz = lapic_timer_hz / (lapic_timer_hz / 128); + profhz = lapic_timer_hz; + } /* * Start up the timer on the BSP. The APs will kick off their @@ -483,7 +501,7 @@ lapic_setup_clock(void) */ lapic_timer_periodic(lapic_timer_period); lapic_timer_enable_intr(); - return (1); + return (lapic_allclocks == 0 ? LAPIC_CLOCK_HARDCLOCK : LAPIC_CLOCK_ALL); } void @@ -786,20 +804,23 @@ lapic_handle_timer(struct trapframe *frame) else hardclock_cpu(TRAPF_USERMODE(frame)); } + if (lapic_allclocks != 0) { - /* Fire statclock at stathz. */ - la->la_stat_ticks += stathz; - if (la->la_stat_ticks >= lapic_timer_hz) { - la->la_stat_ticks -= lapic_timer_hz; - statclock(TRAPF_USERMODE(frame)); - } + /* Fire statclock at stathz. */ + la->la_stat_ticks += stathz; + if (la->la_stat_ticks >= lapic_timer_hz) { + la->la_stat_ticks -= lapic_timer_hz; + statclock(TRAPF_USERMODE(frame)); + } - /* Fire profclock at profhz, but only when needed. */ - la->la_prof_ticks += profhz; - if (la->la_prof_ticks >= lapic_timer_hz) { - la->la_prof_ticks -= lapic_timer_hz; - if (profprocs != 0) - profclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); + /* Fire profclock at profhz, but only when needed. */ + la->la_prof_ticks += profhz; + if (la->la_prof_ticks >= lapic_timer_hz) { + la->la_prof_ticks -= lapic_timer_hz; + if (profprocs != 0) + profclock(TRAPF_USERMODE(frame), + TRAPF_PC(frame)); + } } critical_exit(); } diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s index 94ac6702171e..170aaf139997 100644 --- a/sys/i386/i386/locore.s +++ b/sys/i386/i386/locore.s @@ -104,15 +104,11 @@ IdlePTD: .long 0 /* phys addr of kernel PTD */ IdlePDPT: .long 0 /* phys addr of kernel PDPT */ #endif -#ifdef SMP .globl KPTphys -#endif KPTphys: .long 0 /* phys addr of kernel page tables */ .globl proc0kstack -proc0uarea: .long 0 /* address of proc 0 uarea (unused)*/ proc0kstack: .long 0 /* address of proc 0 kstack space */ -p0upa: .long 0 /* phys addr of proc0 UAREA (unused) */ p0kpa: .long 0 /* phys addr of proc0's STACK */ vm86phystk: .long 0 /* PA of vm86/bios stack */ diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index 96c8f25704e2..1ef94ead8c5f 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -132,7 +132,7 @@ __FBSDID("$FreeBSD$"); #endif #ifdef DEV_ISA -#include +#include #endif #ifdef XBOX @@ -756,7 +756,6 @@ osigreturn(td, uap) struct osigcontext sc; struct trapframe *regs; struct osigcontext *scp; - struct proc *p = td->td_proc; int eflags, error; ksiginfo_t ksi; @@ -856,17 +855,14 @@ osigreturn(td, uap) regs->tf_eip = scp->sc_pc; regs->tf_eflags = eflags; - PROC_LOCK(p); #if defined(COMPAT_43) if (scp->sc_onstack & 1) td->td_sigstk.ss_flags |= SS_ONSTACK; else td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif - SIGSETOLD(td->td_sigmask, scp->sc_mask); - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, (sigset_t *)&scp->sc_mask, NULL, + SIGPROCMASK_OLD); return (EJUSTRETURN); } #endif /* COMPAT_43 */ @@ -883,9 +879,8 @@ freebsd4_sigreturn(td, uap) } */ *uap; { struct ucontext4 uc; - struct proc *p = td->td_proc; struct trapframe *regs; - const struct ucontext4 *ucp; + struct ucontext4 *ucp; int cs, eflags, error; ksiginfo_t ksi; @@ -973,18 +968,13 @@ freebsd4_sigreturn(td, uap) bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs)); } - PROC_LOCK(p); #if defined(COMPAT_43) if (ucp->uc_mcontext.mc_onstack & 1) td->td_sigstk.ss_flags |= SS_ONSTACK; else td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif - - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); return (EJUSTRETURN); } #endif /* COMPAT_FREEBSD4 */ @@ -1000,9 +990,8 @@ sigreturn(td, uap) } */ *uap; { ucontext_t uc; - struct proc *p = td->td_proc; struct trapframe *regs; - const ucontext_t *ucp; + ucontext_t *ucp; int cs, eflags, error, ret; ksiginfo_t ksi; @@ -1094,7 +1083,6 @@ sigreturn(td, uap) bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs)); } - PROC_LOCK(p); #if defined(COMPAT_43) if (ucp->uc_mcontext.mc_onstack & 1) td->td_sigstk.ss_flags |= SS_ONSTACK; @@ -1102,10 +1090,7 @@ sigreturn(td, uap) td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); return (EJUSTRETURN); } @@ -2447,6 +2432,9 @@ do_next: #else phys_avail[0] = physfree; phys_avail[1] = xen_start_info->nr_pages*PAGE_SIZE; + dump_avail[0] = 0; + dump_avail[1] = xen_start_info->nr_pages*PAGE_SIZE; + #endif /* diff --git a/sys/i386/i386/mca.c b/sys/i386/i386/mca.c index 5e7e4ffea260..6148af792430 100644 --- a/sys/i386/i386/mca.c +++ b/sys/i386/i386/mca.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -117,48 +118,6 @@ sysctl_mca_records(SYSCTL_HANDLER_ARGS) return (SYSCTL_OUT(req, &record, sizeof(record))); } -static struct mca_record * -mca_record_entry(int bank) -{ - struct mca_internal *rec; - uint64_t status; - u_int p[4]; - - status = rdmsr(MSR_MC_STATUS(bank)); - if (!(status & MC_STATUS_VAL)) - return (NULL); - - rec = malloc(sizeof(*rec), M_MCA, M_NOWAIT | M_ZERO); - if (rec == NULL) { - printf("MCA: Unable to allocate space for an event.\n"); - return (NULL); - } - - /* Save exception information. */ - rec->rec.mr_status = status; - if (status & MC_STATUS_ADDRV) - rec->rec.mr_addr = rdmsr(MSR_MC_ADDR(bank)); - if (status & MC_STATUS_MISCV) - rec->rec.mr_misc = rdmsr(MSR_MC_MISC(bank)); - rec->rec.mr_tsc = rdtsc(); - rec->rec.mr_apic_id = PCPU_GET(apic_id); - - /* - * Clear machine check. Don't do this for uncorrectable - * errors so that the BIOS can see them. - */ - if (!(rec->rec.mr_status & (MC_STATUS_PCC | MC_STATUS_UC))) { - wrmsr(MSR_MC_STATUS(bank), 0); - do_cpuid(0, p); - } - - mtx_lock_spin(&mca_lock); - STAILQ_INSERT_TAIL(&mca_records, rec, link); - mca_count++; - mtx_unlock_spin(&mca_lock); - return (&rec->rec); -} - static const char * mca_error_ttype(uint16_t mca_error) { @@ -219,11 +178,13 @@ mca_error_request(uint16_t mca_error) } /* Dump details about a single machine check. */ -static void -mca_log(struct mca_record *rec) +static void __nonnull(1) +mca_log(const struct mca_record *rec) { uint16_t mca_error; + printf("MCA: bank %d, status 0x%016llx\n", rec->mr_bank, + (long long)rec->mr_status); printf("MCA: CPU %d ", rec->mr_apic_id); if (rec->mr_status & MC_STATUS_UC) printf("UNCOR "); @@ -327,6 +288,61 @@ mca_log(struct mca_record *rec) printf("\n"); if (rec->mr_status & MC_STATUS_ADDRV) printf("MCA: Address 0x%llx\n", (long long)rec->mr_addr); + if (rec->mr_status & MC_STATUS_MISCV) + printf("MCA: Misc 0x%llx\n", (long long)rec->mr_misc); +} + +static int __nonnull(2) +mca_check_status(int bank, struct mca_record *rec) +{ + uint64_t status; + u_int p[4]; + + status = rdmsr(MSR_MC_STATUS(bank)); + if (!(status & MC_STATUS_VAL)) + return (0); + + /* Save exception information. */ + rec->mr_status = status; + rec->mr_bank = bank; + rec->mr_addr = 0; + if (status & MC_STATUS_ADDRV) + rec->mr_addr = rdmsr(MSR_MC_ADDR(bank)); + rec->mr_misc = 0; + if (status & MC_STATUS_MISCV) + rec->mr_misc = rdmsr(MSR_MC_MISC(bank)); + rec->mr_tsc = rdtsc(); + rec->mr_apic_id = PCPU_GET(apic_id); + + /* + * Clear machine check. Don't do this for uncorrectable + * errors so that the BIOS can see them. + */ + if (!(rec->mr_status & (MC_STATUS_PCC | MC_STATUS_UC))) { + wrmsr(MSR_MC_STATUS(bank), 0); + do_cpuid(0, p); + } + return (1); +} + +static void __nonnull(1) +mca_record_entry(const struct mca_record *record) +{ + struct mca_internal *rec; + + rec = malloc(sizeof(*rec), M_MCA, M_NOWAIT); + if (rec == NULL) { + printf("MCA: Unable to allocate space for an event.\n"); + mca_log(record); + return; + } + + rec->rec = *record; + rec->logged = 0; + mtx_lock_spin(&mca_lock); + STAILQ_INSERT_TAIL(&mca_records, rec, link); + mca_count++; + mtx_unlock_spin(&mca_lock); } /* @@ -341,7 +357,7 @@ mca_log(struct mca_record *rec) static int mca_scan(int mcip) { - struct mca_record *rec; + struct mca_record rec; uint64_t mcg_cap, ucmask; int count, i, recoverable; @@ -354,13 +370,13 @@ mca_scan(int mcip) ucmask |= MC_STATUS_OVER; mcg_cap = rdmsr(MSR_MCG_CAP); for (i = 0; i < (mcg_cap & MCG_CAP_COUNT); i++) { - rec = mca_record_entry(i); - if (rec != NULL) { + if (mca_check_status(i, &rec)) { count++; - if (rec->mr_status & ucmask) { + if (rec.mr_status & ucmask) { recoverable = 0; - mca_log(rec); + mca_log(&rec); } + mca_record_entry(&rec); } } return (mcip ? recoverable : count); @@ -465,6 +481,8 @@ void mca_init(void) { uint64_t mcg_cap; + uint64_t ctl; + int skip; int i; /* MCE is required. */ @@ -482,15 +500,26 @@ mca_init(void) wrmsr(MSR_MCG_CTL, MCG_CTL_ENABLE); for (i = 0; i < (mcg_cap & MCG_CAP_COUNT); i++) { - /* - * Enable logging of all errors. For P6 - * processors, MC0_CTL is always enabled. - * - * XXX: Better CPU test needed here? - */ - if (!(i == 0 && (cpu_id & 0xf00) == 0x600)) - wrmsr(MSR_MC_CTL(i), 0xffffffffffffffffUL); + /* By default enable logging of all errors. */ + ctl = 0xffffffffffffffffUL; + skip = 0; + if (cpu_vendor_id == CPU_VENDOR_INTEL) { + /* + * For P6 models before Nehalem MC0_CTL is + * always enabled and reserved. + */ + if (i == 0 && CPUID_TO_FAMILY(cpu_id) == 0x6 + && CPUID_TO_MODEL(cpu_id) < 0x1a) + skip = 1; + } else if (cpu_vendor_id == CPU_VENDOR_AMD) { + /* BKDG for Family 10h: unset GartTblWkEn. */ + if (i == 4 && CPUID_TO_FAMILY(cpu_id) >= 0xf) + ctl &= ~(1UL << 10); + } + + if (!skip) + wrmsr(MSR_MC_CTL(i), ctl); /* Clear all errors. */ wrmsr(MSR_MC_STATUS(i), 0); } diff --git a/sys/i386/i386/mem.c b/sys/i386/i386/mem.c index b2deab21c7e4..11bfc37cfbe4 100644 --- a/sys/i386/i386/mem.c +++ b/sys/i386/i386/mem.c @@ -163,8 +163,8 @@ memrw(struct cdev *dev, struct uio *uio, int flags) */ /* ARGSUSED */ int -memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, - int prot __unused) +memmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot __unused, vm_memattr_t *memattr __unused) { if (dev2unit(dev) == CDEV_MINOR_MEM) *paddr = offset; diff --git a/sys/i386/i386/minidump_machdep.c b/sys/i386/i386/minidump_machdep.c index af523061ca80..92c0b8f6ffcd 100644 --- a/sys/i386/i386/minidump_machdep.c +++ b/sys/i386/i386/minidump_machdep.c @@ -65,6 +65,11 @@ static void *dump_va; static uint64_t counter, progress; CTASSERT(sizeof(*vm_page_dump) == 4); +#ifndef XEN +#define xpmap_mtop(x) (x) +#define xpmap_ptom(x) (x) +#endif + static int is_dumpable(vm_paddr_t pa) @@ -194,7 +199,7 @@ minidumpsys(struct dumperinfo *di) j = va >> PDRSHIFT; if ((pd[j] & (PG_PS | PG_V)) == (PG_PS | PG_V)) { /* This is an entire 2M page. */ - pa = pd[j] & PG_PS_FRAME; + pa = xpmap_mtop(pd[j] & PG_PS_FRAME); for (k = 0; k < NPTEPG; k++) { if (is_dumpable(pa)) dump_add_page(pa); @@ -204,10 +209,10 @@ minidumpsys(struct dumperinfo *di) } if ((pd[j] & PG_V) == PG_V) { /* set bit for each valid page in this 2MB block */ - pt = pmap_kenter_temporary(pd[j] & PG_FRAME, 0); + pt = pmap_kenter_temporary(xpmap_mtop(pd[j] & PG_FRAME), 0); for (k = 0; k < NPTEPG; k++) { if ((pt[k] & PG_V) == PG_V) { - pa = pt[k] & PG_FRAME; + pa = xpmap_mtop(pt[k] & PG_FRAME); if (is_dumpable(pa)) dump_add_page(pa); } @@ -307,8 +312,24 @@ minidumpsys(struct dumperinfo *di) continue; } if ((pd[j] & PG_V) == PG_V) { - pa = pd[j] & PG_FRAME; + pa = xpmap_mtop(pd[j] & PG_FRAME); +#ifndef XEN error = blk_write(di, 0, pa, PAGE_SIZE); +#else + pt = pmap_kenter_temporary(pa, 0); + memcpy(fakept, pt, PAGE_SIZE); + for (i = 0; i < NPTEPG; i++) + fakept[i] = xpmap_mtop(fakept[i]); + error = blk_write(di, (char *)&fakept, 0, PAGE_SIZE); + if (error) + goto fail; + /* flush, in case we reuse fakept in the same block */ + error = blk_flush(di); + if (error) + goto fail; + bzero(fakept, sizeof(fakept)); +#endif + if (error) goto fail; } else { diff --git a/sys/i386/i386/msi.c b/sys/i386/i386/msi.c index 91a8cbbd004f..6745ce2f5990 100644 --- a/sys/i386/i386/msi.c +++ b/sys/i386/i386/msi.c @@ -288,7 +288,7 @@ msi_init(void) mtx_init(&msi_lock, "msi", NULL, MTX_DEF); } -void +static void msi_create_source(void) { struct msi_intsrc *msi; diff --git a/sys/i386/i386/nexus.c b/sys/i386/i386/nexus.c index 98adc933a23b..04dd464ce77d 100644 --- a/sys/i386/i386/nexus.c +++ b/sys/i386/i386/nexus.c @@ -72,7 +72,7 @@ __FBSDID("$FreeBSD$"); #ifdef PC98 #include #else -#include +#include #endif #endif #include @@ -96,6 +96,9 @@ static int nexus_bind_intr(device_t, device_t, struct resource *, int); #endif static int nexus_config_intr(device_t, int, enum intr_trigger, enum intr_polarity); +static int nexus_describe_intr(device_t dev, device_t child, + struct resource *irq, void *cookie, + const char *descr); static int nexus_activate_resource(device_t, device_t, int, int, struct resource *); static int nexus_deactivate_resource(device_t, device_t, int, int, @@ -141,6 +144,7 @@ static device_method_t nexus_methods[] = { DEVMETHOD(bus_bind_intr, nexus_bind_intr), #endif DEVMETHOD(bus_config_intr, nexus_config_intr), + DEVMETHOD(bus_describe_intr, nexus_describe_intr), DEVMETHOD(bus_get_resource_list, nexus_get_reslist), DEVMETHOD(bus_set_resource, nexus_set_resource), DEVMETHOD(bus_get_resource, nexus_get_resource), @@ -526,6 +530,14 @@ nexus_config_intr(device_t dev, int irq, enum intr_trigger trig, return (intr_config_intr(irq, trig, pol)); } +static int +nexus_describe_intr(device_t dev, device_t child, struct resource *irq, + void *cookie, const char *descr) +{ + + return (intr_describe(rman_get_start(irq), cookie, descr)); +} + static struct resource_list * nexus_get_reslist(device_t dev, device_t child) { diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 7e3bc3701ce4..4b2e34f8cde8 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -162,7 +162,11 @@ __FBSDID("$FreeBSD$"); #endif #if !defined(DIAGNOSTIC) -#define PMAP_INLINE __gnu89_inline +#ifdef __GNUC_GNU_INLINE__ +#define PMAP_INLINE inline +#else +#define PMAP_INLINE extern inline +#endif #else #define PMAP_INLINE #endif @@ -206,6 +210,7 @@ int pseflag = 0; /* PG_PS or-in */ static int nkpt; vm_offset_t kernel_vm_end; extern u_int32_t KERNend; +extern u_int32_t KPTphys; #ifdef PAE pt_entry_t pg_nx; @@ -216,8 +221,8 @@ static int pat_works = 0; /* Is page attribute table sane? */ SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); -static int pg_ps_enabled; -SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RD, &pg_ps_enabled, 0, +static int pg_ps_enabled = 1; +SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0, "Are large page mappings enabled?"); /* @@ -242,8 +247,9 @@ struct sysmaps { caddr_t CADDR2; }; static struct sysmaps sysmaps_pcpu[MAXCPU]; -pt_entry_t *CMAP1 = 0; +pt_entry_t *CMAP1 = 0, *KPTmap; static pt_entry_t *CMAP3; +static pd_entry_t *KPTD; caddr_t CADDR1 = 0, ptvmmap = 0; static caddr_t CADDR3; struct msgbuf *msgbufp = 0; @@ -317,10 +323,10 @@ static int _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, vm_page_t *free); static pt_entry_t *pmap_pte_quick(pmap_t pmap, vm_offset_t va); static void pmap_pte_release(pt_entry_t *pte); static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t *); -static vm_offset_t pmap_kmem_choose(vm_offset_t addr); #ifdef PAE static void *pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait); #endif +static void pmap_set_pg(void); CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t)); CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t)); @@ -332,24 +338,6 @@ CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t)); */ CTASSERT(KERNBASE % (1 << 24) == 0); -/* - * Move the kernel virtual free pointer to the next - * 4MB. This is used to help improve performance - * by using a large (4MB) page for much of the kernel - * (.text, .data, .bss) - */ -static vm_offset_t -pmap_kmem_choose(vm_offset_t addr) -{ - vm_offset_t newaddr = addr; - -#ifndef DISABLE_PSE - if (cpu_feature & CPUID_PSE) - newaddr = (addr + PDRMASK) & ~PDRMASK; -#endif - return newaddr; -} - /* * Bootstrap the system enough to run with virtual memory. * @@ -377,7 +365,6 @@ pmap_bootstrap(vm_paddr_t firstaddr) * in this calculation. */ virtual_avail = (vm_offset_t) KERNBASE + firstaddr; - virtual_avail = pmap_kmem_choose(virtual_avail); virtual_end = VM_MAX_KERNEL_ADDRESS; @@ -421,7 +408,6 @@ pmap_bootstrap(vm_paddr_t firstaddr) } SYSMAP(caddr_t, CMAP1, CADDR1, 1) SYSMAP(caddr_t, CMAP3, CADDR3, 1) - *CMAP3 = 0; /* * Crashdump maps. @@ -438,18 +424,31 @@ pmap_bootstrap(vm_paddr_t firstaddr) */ SYSMAP(struct msgbuf *, unused, msgbufp, atop(round_page(MSGBUF_SIZE))) + /* + * KPTmap is used by pmap_kextract(). + */ + SYSMAP(pt_entry_t *, KPTD, KPTmap, KVA_PAGES) + + for (i = 0; i < NKPT; i++) + KPTD[i] = (KPTphys + (i << PAGE_SHIFT)) | pgeflag | PG_RW | PG_V; + + /* + * Adjust the start of the KPTD and KPTmap so that the implementation + * of pmap_kextract() and pmap_growkernel() can be made simpler. + */ + KPTD -= KPTDI; + KPTmap -= i386_btop(KPTDI << PDRSHIFT); + /* * ptemap is used for pmap_pte_quick */ - SYSMAP(pt_entry_t *, PMAP1, PADDR1, 1); - SYSMAP(pt_entry_t *, PMAP2, PADDR2, 1); + SYSMAP(pt_entry_t *, PMAP1, PADDR1, 1) + SYSMAP(pt_entry_t *, PMAP2, PADDR2, 1) mtx_init(&PMAP2mutex, "PMAP2", NULL, MTX_DEF); virtual_avail = va; - *CMAP1 = 0; - /* * Leave in place an identity mapping (virt == phys) for the low 1 MB * physical memory region that is used by the ACPI wakeup code. This @@ -548,28 +547,22 @@ pmap_init_pat(void) /* * Set PG_G on kernel pages. Only the BSP calls this when SMP is turned on. */ -void +static void pmap_set_pg(void) { - pd_entry_t pdir; pt_entry_t *pte; vm_offset_t va, endva; - int i; if (pgeflag == 0) return; - i = KERNLOAD/NBPDR; endva = KERNBASE + KERNend; if (pseflag) { va = KERNBASE + KERNLOAD; while (va < endva) { - pdir = kernel_pmap->pm_pdir[KPTDI+i]; - pdir |= pgeflag; - kernel_pmap->pm_pdir[KPTDI+i] = PTD[KPTDI+i] = pdir; + pdir_pde(PTD, va) |= pgeflag; invltlb(); /* Play it safe, invltlb() every time */ - i++; va += NBPDR; } } else { @@ -678,13 +671,13 @@ pmap_init(void) * Initialize the vm page array entries for the kernel pmap's * page table pages. */ - for (i = 0; i < nkpt; i++) { - mpte = PHYS_TO_VM_PAGE(PTD[i + KPTDI] & PG_FRAME); + for (i = 0; i < NKPT; i++) { + mpte = PHYS_TO_VM_PAGE(KPTphys + (i << PAGE_SHIFT)); KASSERT(mpte >= vm_page_array && mpte < &vm_page_array[vm_page_array_size], ("pmap_init: page table page is out of range")); mpte->pindex = i + KPTDI; - mpte->phys_addr = PTD[i + KPTDI] & PG_FRAME; + mpte->phys_addr = KPTphys + (i << PAGE_SHIFT); } /* @@ -698,6 +691,15 @@ pmap_init(void) pv_entry_max = roundup(pv_entry_max, _NPCPV); pv_entry_high_water = 9 * (pv_entry_max / 10); + /* + * Disable large page mappings by default if the kernel is running in + * a virtual machine on an AMD Family 10h processor. This is a work- + * around for Erratum 383. + */ + if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD && + CPUID_TO_FAMILY(cpu_id) == 0x10) + pg_ps_enabled = 0; + /* * Are large page mappings enabled? */ @@ -1857,6 +1859,7 @@ pmap_growkernel(vm_offset_t addr) vm_page_t nkpg; pd_entry_t newpdir; pt_entry_t *pde; + boolean_t updated_PTD; mtx_assert(&kernel_map->system_mtx, MA_OWNED); if (kernel_vm_end == 0) { @@ -1896,14 +1899,20 @@ pmap_growkernel(vm_offset_t addr) pmap_zero_page(nkpg); ptppaddr = VM_PAGE_TO_PHYS(nkpg); newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M); - pdir_pde(PTD, kernel_vm_end) = newpdir; + pdir_pde(KPTD, kernel_vm_end) = pgeflag | newpdir; + updated_PTD = FALSE; mtx_lock_spin(&allpmaps_lock); LIST_FOREACH(pmap, &allpmaps, pm_list) { + if ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & + PG_FRAME)) + updated_PTD = TRUE; pde = pmap_pde(pmap, kernel_vm_end); pde_store(pde, newpdir); } mtx_unlock_spin(&allpmaps_lock); + KASSERT(updated_PTD, + ("pmap_growkernel: current page table is not in allpmaps")); kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1); if (kernel_vm_end - 1 >= kernel_map->max_offset) { kernel_vm_end = kernel_map->max_offset; @@ -2386,10 +2395,14 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) mptepa = VM_PAGE_TO_PHYS(mpte); /* - * Temporarily map the page table page (mpte) into the kernel's - * address space at either PADDR1 or PADDR2. + * If the page mapping is in the kernel's address space, then the + * KPTmap can provide access to the page table page. Otherwise, + * temporarily map the page table page (mpte) into the kernel's + * address space at either PADDR1 or PADDR2. */ - if (curthread->td_pinned > 0 && mtx_owned(&vm_page_queue_mtx)) { + if (va >= KERNBASE) + firstpte = &KPTmap[i386_btop(trunc_4mpage(va))]; + else if (curthread->td_pinned > 0 && mtx_owned(&vm_page_queue_mtx)) { if ((*PMAP1 & PG_FRAME) != mptepa) { *PMAP1 = mptepa | PG_RW | PG_V | PG_A | PG_M; #ifdef SMP @@ -2453,10 +2466,9 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) /* * A harmless race exists between this loop and the bcopy() * in pmap_pinit() that initializes the kernel segment of - * the new page table. Specifically, that bcopy() may copy - * the new PDE from the PTD, which is first in allpmaps, to - * the new page table before this loop updates that new - * page table. + * the new page table directory. Specifically, that bcopy() + * may copy the new PDE from the PTD to the new page table + * before this loop updates that new page table. */ mtx_lock_spin(&allpmaps_lock); LIST_FOREACH(allpmaps_entry, &allpmaps, pm_list) { @@ -4859,6 +4871,11 @@ pmap_activate(struct thread *td) critical_exit(); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c index f4df66870217..305cfd28ffc4 100644 --- a/sys/i386/i386/trap.c +++ b/sys/i386/i386/trap.c @@ -825,9 +825,7 @@ trap_pfault(frame, usermode, eva) PROC_UNLOCK(p); /* Fault in the user page: */ - rv = vm_fault(map, va, ftype, - (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY - : VM_FAULT_NORMAL); + rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); PROC_LOCK(p); --p->p_lock; @@ -971,6 +969,72 @@ dblfault_handler() panic("double fault"); } +struct syscall_args { + u_int code; + struct sysent *callp; + int args[8]; + register_t *argp; + int narg; +}; + +static int +fetch_syscall_args(struct thread *td, struct syscall_args *sa) +{ + struct proc *p; + struct trapframe *frame; + caddr_t params; + int error; + + p = td->td_proc; + frame = td->td_frame; + + params = (caddr_t)frame->tf_esp + sizeof(int); + sa->code = frame->tf_eax; + + if (p->p_sysent->sv_prepsyscall) { + (*p->p_sysent->sv_prepsyscall)(frame, sa->args, &sa->code, + ¶ms); + } else { + /* + * Need to check if this is a 32 bit or 64 bit syscall. + */ + if (sa->code == SYS_syscall) { + /* + * Code is first argument, followed by actual args. + */ + sa->code = fuword(params); + params += sizeof(int); + } else if (sa->code == SYS___syscall) { + /* + * Like syscall, but code is a quad, so as to maintain + * quad alignment for the rest of the arguments. + */ + sa->code = fuword(params); + params += sizeof(quad_t); + } + } + + if (p->p_sysent->sv_mask) + sa->code &= p->p_sysent->sv_mask; + if (sa->code >= p->p_sysent->sv_size) + sa->callp = &p->p_sysent->sv_table[0]; + else + sa->callp = &p->p_sysent->sv_table[sa->code]; + sa->narg = sa->callp->sy_narg; + + if (params != NULL && sa->narg != 0) + error = copyin(params, (caddr_t)sa->args, + (u_int)(sa->narg * sizeof(int))); + else + error = 0; + +#ifdef KTRACE + if (KTRPOINT(td, KTR_SYSCALL)) + ktrsyscall(sa->code, sa->narg, sa->args); +#endif + return (error); +} + /* * syscall - system call request C handler * @@ -979,18 +1043,17 @@ dblfault_handler() void syscall(struct trapframe *frame) { - caddr_t params; - struct sysent *callp; - struct thread *td = curthread; - struct proc *p = td->td_proc; + struct thread *td; + struct proc *p; + struct syscall_args sa; register_t orig_tf_eflags; int error; - int narg; - int args[8]; - u_int code; ksiginfo_t ksi; PCPU_INC(cnt.v_syscall); + td = curthread; + p = td->td_proc; + td->td_syscalls++; #ifdef DIAGNOSTIC if (ISPL(frame->tf_cs) != SEL_UPL) { @@ -1003,65 +1066,33 @@ syscall(struct trapframe *frame) td->td_frame = frame; if (td->td_ucred != p->p_ucred) cred_update_thread(td); - params = (caddr_t)frame->tf_esp + sizeof(int); - code = frame->tf_eax; orig_tf_eflags = frame->tf_eflags; - - if (p->p_sysent->sv_prepsyscall) { - (*p->p_sysent->sv_prepsyscall)(frame, args, &code, ¶ms); - } else { - /* - * Need to check if this is a 32 bit or 64 bit syscall. - */ - if (code == SYS_syscall) { - /* - * Code is first argument, followed by actual args. - */ - code = fuword(params); - params += sizeof(int); - } else if (code == SYS___syscall) { - /* - * Like syscall, but code is a quad, so as to maintain - * quad alignment for the rest of the arguments. - */ - code = fuword(params); - params += sizeof(quad_t); - } + if (p->p_flag & P_TRACED) { + PROC_LOCK(p); + td->td_dbgflags &= ~TDB_USERWR; + PROC_UNLOCK(p); } - - if (p->p_sysent->sv_mask) - code &= p->p_sysent->sv_mask; - - if (code >= p->p_sysent->sv_size) - callp = &p->p_sysent->sv_table[0]; - else - callp = &p->p_sysent->sv_table[code]; - - narg = callp->sy_narg; - - if (params != NULL && narg != 0) - error = copyin(params, (caddr_t)args, - (u_int)(narg * sizeof(int))); - else - error = 0; - -#ifdef KTRACE - if (KTRPOINT(td, KTR_SYSCALL)) - ktrsyscall(code, narg, args); -#endif + error = fetch_syscall_args(td, &sa); CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td, - td->td_proc->p_pid, td->td_name, code); - - td->td_syscalls++; + td->td_proc->p_pid, td->td_name, sa.code); if (error == 0) { td->td_retval[0] = 0; td->td_retval[1] = frame->tf_edx; - STOPEVENT(p, S_SCE, narg); - + STOPEVENT(p, S_SCE, sa.narg); PTRACESTOP_SC(p, td, S_PT_SCE); + if (td->td_dbgflags & TDB_USERWR) { + /* + * Reread syscall number and arguments if + * debugger modified registers or memory. + */ + error = fetch_syscall_args(td, &sa); + if (error != 0) + goto retval; + td->td_retval[1] = frame->tf_edx; + } #ifdef KDTRACE_HOOKS /* @@ -1069,13 +1100,13 @@ syscall(struct trapframe *frame) * callback and if there is a probe active for the * syscall 'entry', process the probe. */ - if (systrace_probe_func != NULL && callp->sy_entry != 0) - (*systrace_probe_func)(callp->sy_entry, code, callp, - args); + if (systrace_probe_func != NULL && sa.callp->sy_entry != 0) + (*systrace_probe_func)(sa.callp->sy_entry, sa.code, + sa.callp, sa.args); #endif - AUDIT_SYSCALL_ENTER(code, td); - error = (*callp->sy_call)(td, args); + AUDIT_SYSCALL_ENTER(sa.code, td); + error = (*sa.callp->sy_call)(td, sa.args); AUDIT_SYSCALL_EXIT(error, td); /* Save the latest error return value. */ @@ -1087,41 +1118,13 @@ syscall(struct trapframe *frame) * callback and if there is a probe active for the * syscall 'return', process the probe. */ - if (systrace_probe_func != NULL && callp->sy_return != 0) - (*systrace_probe_func)(callp->sy_return, code, callp, - args); + if (systrace_probe_func != NULL && sa.callp->sy_return != 0) + (*systrace_probe_func)(sa.callp->sy_return, sa.code, + sa.callp, sa.args); #endif } - - switch (error) { - case 0: - frame->tf_eax = td->td_retval[0]; - frame->tf_edx = td->td_retval[1]; - frame->tf_eflags &= ~PSL_C; - break; - - case ERESTART: - /* - * Reconstruct pc, assuming lcall $X,y is 7 bytes, - * int 0x80 is 2 bytes. We saved this in tf_err. - */ - frame->tf_eip -= frame->tf_err; - break; - - case EJUSTRETURN: - break; - - default: - if (p->p_sysent->sv_errsize) { - if (error >= p->p_sysent->sv_errsize) - error = -1; /* XXX */ - else - error = p->p_sysent->sv_errtbl[error]; - } - frame->tf_eax = error; - frame->tf_eflags |= PSL_C; - break; - } + retval: + cpu_set_syscall_retval(td, error); /* * Traced syscall. @@ -1139,14 +1142,16 @@ syscall(struct trapframe *frame) * Check for misbehavior. */ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???"); KASSERT(td->td_critnest == 0, ("System call %s returning in a critical section", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???")); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???")); KASSERT(td->td_locks == 0, ("System call %s returning with %d locks held", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???", - td->td_locks)); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???", td->td_locks)); /* * Handle reschedule and other end-of-syscall issues @@ -1154,11 +1159,11 @@ syscall(struct trapframe *frame) userret(td, frame); CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td, - td->td_proc->p_pid, td->td_name, code); + td->td_proc->p_pid, td->td_name, sa.code); #ifdef KTRACE if (KTRPOINT(td, KTR_SYSRET)) - ktrsysret(code, error, td->td_retval[0]); + ktrsysret(sa.code, error, td->td_retval[0]); #endif /* @@ -1166,7 +1171,7 @@ syscall(struct trapframe *frame) * register set. If we ever support an emulation where this * is not the case, this code will need to be revisited. */ - STOPEVENT(p, S_SCX, code); + STOPEVENT(p, S_SCX, sa.code); PTRACESTOP_SC(p, td, S_PT_SCX); } diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c index b6fd4b6067cf..d2c13b83db3d 100644 --- a/sys/i386/i386/vm_machdep.c +++ b/sys/i386/i386/vm_machdep.c @@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -94,7 +95,7 @@ __FBSDID("$FreeBSD$"); #ifdef PC98 #include #else -#include +#include #endif #ifdef XBOX @@ -270,11 +271,7 @@ cpu_fork(td1, p2, td2, flags) /* * XXX XEN need to check on PSL_USER is handled */ -#ifdef XEN - td2->td_md.md_saved_flags = 0; -#else td2->td_md.md_saved_flags = PSL_KERNEL | PSL_I; -#endif /* * Now, cpu_switch() can schedule the new process. * pcb_esp is loaded pointing to the cpu_switch() stack frame @@ -384,6 +381,41 @@ cpu_thread_free(struct thread *td) cpu_thread_clean(td); } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + + switch (error) { + case 0: + td->td_frame->tf_eax = td->td_retval[0]; + td->td_frame->tf_edx = td->td_retval[1]; + td->td_frame->tf_eflags &= ~PSL_C; + break; + + case ERESTART: + /* + * Reconstruct pc, assuming lcall $X,y is 7 bytes, int + * 0x80 is 2 bytes. We saved this in tf_err. + */ + td->td_frame->tf_eip -= td->td_frame->tf_err; + break; + + case EJUSTRETURN: + break; + + default: + if (td->td_proc->p_sysent->sv_errsize) { + if (error >= td->td_proc->p_sysent->sv_errsize) + error = -1; /* XXX */ + else + error = td->td_proc->p_sysent->sv_errtbl[error]; + } + td->td_frame->tf_eax = error; + td->td_frame->tf_eflags |= PSL_C; + break; + } +} + /* * Initialize machine state (pcb and trap frame) for a new thread about to * upcall. Put enough state in the new thread's PCB to get it to go back @@ -446,11 +478,7 @@ cpu_set_upcall(struct thread *td, struct thread *td0) /* Setup to release spin count in fork_exit(). */ td->td_md.md_spinlock_count = 1; -#ifdef XEN - td->td_md.md_saved_flags = 0; -#else td->td_md.md_saved_flags = PSL_KERNEL | PSL_I; -#endif } /* diff --git a/sys/i386/ibcs2/ibcs2_misc.c b/sys/i386/ibcs2/ibcs2_misc.c index 23c617de6e74..c537100ba177 100644 --- a/sys/i386/ibcs2/ibcs2_misc.c +++ b/sys/i386/ibcs2/ibcs2_misc.c @@ -663,9 +663,13 @@ ibcs2_getgroups(td, uap) u_int i, ngrp; int error; - if (uap->gidsetsize < 0) - return (EINVAL); - ngrp = MIN(uap->gidsetsize, NGROUPS); + if (uap->gidsetsize < td->td_ucred->cr_ngroups) { + if (uap->gidsetsize == 0) + ngrp = 0; + else + return (EINVAL); + } else + ngrp = td->td_ucred->cr_ngroups; gp = malloc(ngrp * sizeof(*gp), M_TEMP, M_WAITOK); error = kern_getgroups(td, &ngrp, gp); if (error) @@ -693,7 +697,7 @@ ibcs2_setgroups(td, uap) gid_t *gp; int error, i; - if (uap->gidsetsize < 0 || uap->gidsetsize > NGROUPS) + if (uap->gidsetsize < 0 || uap->gidsetsize > ngroups_max + 1) return (EINVAL); if (uap->gidsetsize && uap->gidset == NULL) return (EINVAL); diff --git a/sys/i386/ibcs2/syscalls.master b/sys/i386/ibcs2/syscalls.master index 23d585388680..9d0eda612f94 100644 --- a/sys/i386/ibcs2/syscalls.master +++ b/sys/i386/ibcs2/syscalls.master @@ -22,7 +22,6 @@ ; types: ; STD always included ; COMPAT included on COMPAT #ifdef -; LIBCOMPAT included on COMPAT #ifdef, and placed in syscall.h ; OBSOL obsolete, not included in system, only specifies name ; UNIMPL not implemented, placeholder only diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h index b15452b1d81c..2f8e716089d5 100644 --- a/sys/i386/include/apicvar.h +++ b/sys/i386/include/apicvar.h @@ -186,6 +186,12 @@ #define APIC_BUS_PCI 2 #define APIC_BUS_MAX APIC_BUS_PCI +enum lapic_clock { + LAPIC_CLOCK_NONE, + LAPIC_CLOCK_HARDCLOCK, + LAPIC_CLOCK_ALL +}; + /* * An APIC enumerator is a psuedo bus driver that enumerates APIC's including * CPU's and I/O APIC's. @@ -253,7 +259,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt, enum intr_trigger trigger); void lapic_set_tpr(u_int vector); void lapic_setup(int boot); -int lapic_setup_clock(void); +enum lapic_clock lapic_setup_clock(void); #endif /* !LOCORE */ #endif /* _MACHINE_APICVAR_H_ */ diff --git a/sys/i386/include/apm_bios.h b/sys/i386/include/apm_bios.h index 5f0bafa8f038..424852d59683 100644 --- a/sys/i386/include/apm_bios.h +++ b/sys/i386/include/apm_bios.h @@ -230,12 +230,12 @@ typedef struct apm_pwstatus { } *apm_pwstatus_t; struct apm_bios_arg { - u_long eax; - u_long ebx; - u_long ecx; - u_long edx; - u_long esi; - u_long edi; + uint32_t eax; + uint32_t ebx; + uint32_t ecx; + uint32_t edx; + uint32_t esi; + uint32_t edi; }; struct apm_event_info { diff --git a/sys/i386/include/atomic.h b/sys/i386/include/atomic.h index 8c0b95ce0694..b00eb45592f3 100644 --- a/sys/i386/include/atomic.h +++ b/sys/i386/include/atomic.h @@ -73,7 +73,8 @@ */ #if defined(KLD_MODULE) || !defined(__GNUCLIKE_ASM) #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ -void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v) +void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v); \ +void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v) int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src); u_int atomic_fetchadd_int(volatile u_int *p, u_int v); @@ -95,8 +96,9 @@ void atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v) #endif /* - * The assembly is volatilized to demark potential before-and-after side - * effects if an interrupt or SMP collision were to occur. + * The assembly is volatilized to avoid code chunk removal by the compiler. + * GCC aggressively reorders operations and memory clobbering is necessary + * in order to avoid that for memory barriers. */ #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ static __inline void \ @@ -105,6 +107,15 @@ atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ __asm __volatile(MPLOCKED OP \ : "=m" (*p) \ : CONS (V), "m" (*p)); \ +} \ + \ +static __inline void \ +atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ +{ \ + __asm __volatile(MPLOCKED OP \ + : "=m" (*p) \ + : CONS (V), "m" (*p) \ + : "memory"); \ } \ struct __hack @@ -194,18 +205,23 @@ atomic_fetchadd_int(volatile u_int *p, u_int v) * PentiumPro or higher, reads may pass writes, so for that case we have * to use a serializing instruction (i.e. with LOCK) to do the load in * SMP kernels. For UP kernels, however, the cache of the single processor - * is always consistent, so we don't need any memory barriers. + * is always consistent, so we only need to take care of compiler. */ #define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ static __inline u_##TYPE \ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \ { \ - return (*p); \ + u_##TYPE tmp; \ + \ + tmp = *p; \ + __asm __volatile("" : : : "memory"); \ + return (tmp); \ } \ \ static __inline void \ atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ { \ + __asm __volatile("" : : : "memory"); \ *p = v; \ } \ struct __hack @@ -236,7 +252,8 @@ atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\ __asm __volatile(SOP \ : "=m" (*p), /* 0 */ \ "+r" (v) /* 1 */ \ - : "m" (*p)); /* 2 */ \ + : "m" (*p) /* 2 */ \ + : "memory"); \ } \ struct __hack @@ -331,44 +348,43 @@ u_long atomic_readandclear_long(volatile u_long *addr); #endif /* __GNUCLIKE_ASM */ -/* Acquire and release variants are identical to the normal ones. */ -#define atomic_set_acq_char atomic_set_char -#define atomic_set_rel_char atomic_set_char -#define atomic_clear_acq_char atomic_clear_char -#define atomic_clear_rel_char atomic_clear_char -#define atomic_add_acq_char atomic_add_char -#define atomic_add_rel_char atomic_add_char -#define atomic_subtract_acq_char atomic_subtract_char -#define atomic_subtract_rel_char atomic_subtract_char +#define atomic_set_acq_char atomic_set_barr_char +#define atomic_set_rel_char atomic_set_barr_char +#define atomic_clear_acq_char atomic_clear_barr_char +#define atomic_clear_rel_char atomic_clear_barr_char +#define atomic_add_acq_char atomic_add_barr_char +#define atomic_add_rel_char atomic_add_barr_char +#define atomic_subtract_acq_char atomic_subtract_barr_char +#define atomic_subtract_rel_char atomic_subtract_barr_char -#define atomic_set_acq_short atomic_set_short -#define atomic_set_rel_short atomic_set_short -#define atomic_clear_acq_short atomic_clear_short -#define atomic_clear_rel_short atomic_clear_short -#define atomic_add_acq_short atomic_add_short -#define atomic_add_rel_short atomic_add_short -#define atomic_subtract_acq_short atomic_subtract_short -#define atomic_subtract_rel_short atomic_subtract_short +#define atomic_set_acq_short atomic_set_barr_short +#define atomic_set_rel_short atomic_set_barr_short +#define atomic_clear_acq_short atomic_clear_barr_short +#define atomic_clear_rel_short atomic_clear_barr_short +#define atomic_add_acq_short atomic_add_barr_short +#define atomic_add_rel_short atomic_add_barr_short +#define atomic_subtract_acq_short atomic_subtract_barr_short +#define atomic_subtract_rel_short atomic_subtract_barr_short -#define atomic_set_acq_int atomic_set_int -#define atomic_set_rel_int atomic_set_int -#define atomic_clear_acq_int atomic_clear_int -#define atomic_clear_rel_int atomic_clear_int -#define atomic_add_acq_int atomic_add_int -#define atomic_add_rel_int atomic_add_int -#define atomic_subtract_acq_int atomic_subtract_int -#define atomic_subtract_rel_int atomic_subtract_int +#define atomic_set_acq_int atomic_set_barr_int +#define atomic_set_rel_int atomic_set_barr_int +#define atomic_clear_acq_int atomic_clear_barr_int +#define atomic_clear_rel_int atomic_clear_barr_int +#define atomic_add_acq_int atomic_add_barr_int +#define atomic_add_rel_int atomic_add_barr_int +#define atomic_subtract_acq_int atomic_subtract_barr_int +#define atomic_subtract_rel_int atomic_subtract_barr_int #define atomic_cmpset_acq_int atomic_cmpset_int #define atomic_cmpset_rel_int atomic_cmpset_int -#define atomic_set_acq_long atomic_set_long -#define atomic_set_rel_long atomic_set_long -#define atomic_clear_acq_long atomic_clear_long -#define atomic_clear_rel_long atomic_clear_long -#define atomic_add_acq_long atomic_add_long -#define atomic_add_rel_long atomic_add_long -#define atomic_subtract_acq_long atomic_subtract_long -#define atomic_subtract_rel_long atomic_subtract_long +#define atomic_set_acq_long atomic_set_barr_long +#define atomic_set_rel_long atomic_set_barr_long +#define atomic_clear_acq_long atomic_clear_barr_long +#define atomic_clear_rel_long atomic_clear_barr_long +#define atomic_add_acq_long atomic_add_barr_long +#define atomic_add_rel_long atomic_add_barr_long +#define atomic_subtract_acq_long atomic_subtract_barr_long +#define atomic_subtract_rel_long atomic_subtract_barr_long #define atomic_cmpset_acq_long atomic_cmpset_long #define atomic_cmpset_rel_long atomic_cmpset_long diff --git a/sys/i386/include/cpufunc.h b/sys/i386/include/cpufunc.h index 147040bbcca8..2de6f448c9a9 100644 --- a/sys/i386/include/cpufunc.h +++ b/sys/i386/include/cpufunc.h @@ -49,8 +49,8 @@ extern u_int xen_rcr2(void); extern void xen_load_cr3(u_int data); extern void xen_tlb_flush(void); extern void xen_invlpg(u_int addr); -extern int xen_save_and_cli(void); -extern void xen_restore_flags(u_int eflags); +extern void write_eflags(u_int eflags); +extern u_int read_eflags(void); #endif struct region_descriptor; @@ -132,14 +132,14 @@ enable_intr(void) #endif } -static inline void +static __inline void cpu_monitor(const void *addr, int extensions, int hints) { __asm __volatile("monitor;" : :"a" (addr), "c" (extensions), "d"(hints)); } -static inline void +static __inline void cpu_mwait(int extensions, int hints) { __asm __volatile("mwait;" : :"a" (hints), "c" (extensions)); @@ -203,28 +203,28 @@ inl(u_int port) } static __inline void -insb(u_int port, void *addr, size_t cnt) +insb(u_int port, void *addr, size_t count) { __asm __volatile("cld; rep; insb" - : "+D" (addr), "+c" (cnt) + : "+D" (addr), "+c" (count) : "d" (port) : "memory"); } static __inline void -insw(u_int port, void *addr, size_t cnt) +insw(u_int port, void *addr, size_t count) { __asm __volatile("cld; rep; insw" - : "+D" (addr), "+c" (cnt) + : "+D" (addr), "+c" (count) : "d" (port) : "memory"); } static __inline void -insl(u_int port, void *addr, size_t cnt) +insl(u_int port, void *addr, size_t count) { __asm __volatile("cld; rep; insl" - : "+D" (addr), "+c" (cnt) + : "+D" (addr), "+c" (count) : "d" (port) : "memory"); } @@ -257,26 +257,26 @@ outl(u_int port, u_int data) } static __inline void -outsb(u_int port, const void *addr, size_t cnt) +outsb(u_int port, const void *addr, size_t count) { __asm __volatile("cld; rep; outsb" - : "+S" (addr), "+c" (cnt) + : "+S" (addr), "+c" (count) : "d" (port)); } static __inline void -outsw(u_int port, const void *addr, size_t cnt) +outsw(u_int port, const void *addr, size_t count) { __asm __volatile("cld; rep; outsw" - : "+S" (addr), "+c" (cnt) + : "+S" (addr), "+c" (count) : "d" (port)); } static __inline void -outsl(u_int port, const void *addr, size_t cnt) +outsl(u_int port, const void *addr, size_t count) { __asm __volatile("cld; rep; outsl" - : "+S" (addr), "+c" (cnt) + : "+S" (addr), "+c" (count) : "d" (port)); } @@ -293,7 +293,11 @@ ia32_pause(void) } static __inline u_int +#ifdef XEN +_read_eflags(void) +#else read_eflags(void) +#endif { u_int ef; @@ -335,7 +339,11 @@ wbinvd(void) } static __inline void +#ifdef XEN +_write_eflags(u_int ef) +#else write_eflags(u_int ef) +#endif { __asm __volatile("pushl %0; popfl" : : "r" (ef)); } @@ -653,23 +661,15 @@ intr_disable(void) { register_t eflags; -#ifdef XEN - eflags = xen_save_and_cli(); -#else eflags = read_eflags(); disable_intr(); -#endif return (eflags); } static __inline void intr_restore(register_t eflags) { -#ifdef XEN - xen_restore_flags(eflags); -#else write_eflags(eflags); -#endif } #else /* !(__GNUCLIKE_ASM && __CC_SUPPORTS___INLINE) */ @@ -684,9 +684,9 @@ void halt(void); void ia32_pause(void); u_char inb(u_int port); u_int inl(u_int port); -void insb(u_int port, void *addr, size_t cnt); -void insl(u_int port, void *addr, size_t cnt); -void insw(u_int port, void *addr, size_t cnt); +void insb(u_int port, void *addr, size_t count); +void insl(u_int port, void *addr, size_t count); +void insw(u_int port, void *addr, size_t count); register_t intr_disable(void); void intr_restore(register_t ef); void invd(void); @@ -711,9 +711,9 @@ void load_gs(u_int sel); void ltr(u_short sel); void outb(u_int port, u_char data); void outl(u_int port, u_int data); -void outsb(u_int port, const void *addr, size_t cnt); -void outsl(u_int port, const void *addr, size_t cnt); -void outsw(u_int port, const void *addr, size_t cnt); +void outsb(u_int port, const void *addr, size_t count); +void outsl(u_int port, const void *addr, size_t count); +void outsw(u_int port, const void *addr, size_t count); void outw(u_int port, u_short data); u_int rcr0(void); u_int rcr2(void); diff --git a/sys/i386/include/elf.h b/sys/i386/include/elf.h index af71ab8fd0be..37ee279c1675 100644 --- a/sys/i386/include/elf.h +++ b/sys/i386/include/elf.h @@ -105,4 +105,6 @@ __ElfType(Auxinfo); #define ELF_TARG_MACH EM_386 #define ELF_TARG_VER 1 +#define ET_DYN_LOAD_ADDR 0x01001000 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/i386/include/intr_machdep.h b/sys/i386/include/intr_machdep.h index f21e0bcfb7bc..bcff6c22e6e8 100644 --- a/sys/i386/include/intr_machdep.h +++ b/sys/i386/include/intr_machdep.h @@ -138,6 +138,7 @@ int intr_bind(u_int vector, u_char cpu); #endif int intr_config_intr(int vector, enum intr_trigger trig, enum intr_polarity pol); +int intr_describe(u_int vector, void *ih, const char *descr); void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame); u_int intr_next_cpu(void); struct intsrc *intr_lookup_source(int vector); diff --git a/sys/i386/include/iodev.h b/sys/i386/include/iodev.h index 4b35d8b03fa2..1a0a17a9561e 100644 --- a/sys/i386/include/iodev.h +++ b/sys/i386/include/iodev.h @@ -28,3 +28,4 @@ d_open_t ioopen; d_close_t ioclose; +d_ioctl_t ioioctl; diff --git a/sys/i386/include/mca.h b/sys/i386/include/mca.h index c43d98953e42..ddc3aeb649a8 100644 --- a/sys/i386/include/mca.h +++ b/sys/i386/include/mca.h @@ -36,6 +36,7 @@ struct mca_record { uint64_t mr_misc; uint64_t mr_tsc; int mr_apic_id; + int mr_bank; }; #ifdef _KERNEL diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h index 54e8c206cd4e..ae7d79d83fb6 100644 --- a/sys/i386/include/pmap.h +++ b/sys/i386/include/pmap.h @@ -265,6 +265,16 @@ pte_load_store_ma(pt_entry_t *ptep, pt_entry_t v) #define pde_store_ma(ptep, pte) pte_load_store_ma((ptep), (pt_entry_t)pte) #elif !defined(XEN) + +/* + * KPTmap is a linear mapping of the kernel page table. It differs from the + * recursive mapping in two ways: (1) it only provides access to kernel page + * table pages, and not user page table pages, and (2) it provides access to + * a kernel page table page after the corresponding virtual addresses have + * been promoted to a 2/4MB page mapping. + */ +extern pt_entry_t *KPTmap; + /* * Routine: pmap_kextract * Function: @@ -279,10 +289,17 @@ pmap_kextract(vm_offset_t va) if ((pa = PTD[va >> PDRSHIFT]) & PG_PS) { pa = (pa & PG_PS_FRAME) | (va & PDRMASK); } else { - pa = *vtopte(va); + /* + * Beware of a concurrent promotion that changes the PDE at + * this point! For example, vtopte() must not be used to + * access the PTE because it would use the new PDE. It is, + * however, safe to use the old PDE because the page table + * page is preserved by the promotion. + */ + pa = KPTmap[i386_btop(va)]; pa = (pa & PG_FRAME) | (va & PAGE_MASK); } - return pa; + return (pa); } #define PT_UPDATES_FLUSH() @@ -480,7 +497,6 @@ boolean_t pmap_page_is_mapped(vm_page_t m); void pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma); void pmap_unmapdev(vm_offset_t, vm_size_t); pt_entry_t *pmap_pte(pmap_t, vm_offset_t) __pure2; -void pmap_set_pg(void); void pmap_invalidate_page(pmap_t, vm_offset_t); void pmap_invalidate_range(pmap_t, vm_offset_t, vm_offset_t); void pmap_invalidate_all(pmap_t); diff --git a/sys/i386/include/specialreg.h b/sys/i386/include/specialreg.h index c2030597a062..d51da6d59fe4 100644 --- a/sys/i386/include/specialreg.h +++ b/sys/i386/include/specialreg.h @@ -126,6 +126,7 @@ #define CPUID2_SSE41 0x00080000 #define CPUID2_SSE42 0x00100000 #define CPUID2_X2APIC 0x00200000 +#define CPUID2_MOVBE 0x00400000 #define CPUID2_POPCNT 0x00800000 /* diff --git a/sys/i386/isa/elcr.c b/sys/i386/isa/elcr.c deleted file mode 100644 index 266d78396db9..000000000000 --- a/sys/i386/isa/elcr.c +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * Copyright (c) 2004 John Baldwin - * 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. - * 3. Neither the name of the author nor the names of any co-contributors - * may 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 -__FBSDID("$FreeBSD$"); - -/* - * The ELCR is a register that controls the trigger mode and polarity of - * EISA and ISA interrupts. In FreeBSD 3.x and 4.x, the ELCR was only - * consulted for determining the appropriate trigger mode of EISA - * interrupts when using an APIC. However, it seems that almost all - * systems that include PCI also include an ELCR that manages the ISA - * IRQs 0 through 15. Thus, we check for the presence of an ELCR on - * every machine by checking to see if the values found at bootup are - * sane. Note that the polarity of ISA and EISA IRQs are linked to the - * trigger mode. All edge triggered IRQs use active-hi polarity, and - * all level triggered interrupts use active-lo polarity. - * - * The format of the ELCR is simple: it is a 16-bit bitmap where bit 0 - * controls IRQ 0, bit 1 controls IRQ 1, etc. If the bit is zero, the - * associated IRQ is edge triggered. If the bit is one, the IRQ is - * level triggered. - */ - -#include -#include -#include -#include - -#define ELCR_PORT 0x4d0 -#define ELCR_MASK(irq) (1 << (irq)) - -static int elcr_status; -int elcr_found; - -/* - * Check to see if we have what looks like a valid ELCR. We do this by - * verifying that IRQs 0, 1, 2, and 13 are all edge triggered. - */ -int -elcr_probe(void) -{ - int i; - - elcr_status = inb(ELCR_PORT) | inb(ELCR_PORT + 1) << 8; - if ((elcr_status & (ELCR_MASK(0) | ELCR_MASK(1) | ELCR_MASK(2) | - ELCR_MASK(8) | ELCR_MASK(13))) != 0) - return (ENXIO); - if (bootverbose) { - printf("ELCR Found. ISA IRQs programmed as:\n"); - for (i = 0; i < 16; i++) - printf(" %2d", i); - printf("\n"); - for (i = 0; i < 16; i++) - if (elcr_status & ELCR_MASK(i)) - printf(" L"); - else - printf(" E"); - printf("\n"); - } - if (resource_disabled("elcr", 0)) - return (ENXIO); - elcr_found = 1; - return (0); -} - -/* - * Returns 1 for level trigger, 0 for edge. - */ -enum intr_trigger -elcr_read_trigger(u_int irq) -{ - - KASSERT(elcr_found, ("%s: no ELCR was found!", __func__)); - KASSERT(irq <= 15, ("%s: invalid IRQ %u", __func__, irq)); - if (elcr_status & ELCR_MASK(irq)) - return (INTR_TRIGGER_LEVEL); - else - return (INTR_TRIGGER_EDGE); -} - -/* - * Set the trigger mode for a specified IRQ. Mode of 0 means edge triggered, - * and a mode of 1 means level triggered. - */ -void -elcr_write_trigger(u_int irq, enum intr_trigger trigger) -{ - int new_status; - - KASSERT(elcr_found, ("%s: no ELCR was found!", __func__)); - KASSERT(irq <= 15, ("%s: invalid IRQ %u", __func__, irq)); - if (trigger == INTR_TRIGGER_LEVEL) - new_status = elcr_status | ELCR_MASK(irq); - else - new_status = elcr_status & ~ELCR_MASK(irq); - if (new_status == elcr_status) - return; - elcr_status = new_status; - if (irq >= 8) - outb(ELCR_PORT + 1, elcr_status >> 8); - else - outb(ELCR_PORT, elcr_status & 0xff); -} - -void -elcr_resume(void) -{ - - KASSERT(elcr_found, ("%s: no ELCR was found!", __func__)); - outb(ELCR_PORT, elcr_status & 0xff); - outb(ELCR_PORT + 1, elcr_status >> 8); -} diff --git a/sys/i386/isa/isa_dma.c b/sys/i386/isa/isa_dma.c deleted file mode 100644 index ccfb9c54c77e..000000000000 --- a/sys/i386/isa/isa_dma.c +++ /dev/null @@ -1,554 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * 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. - * - * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 - */ - -#include -__FBSDID("$FreeBSD$"); - -/* - * code to manage AT bus - * - * 92/08/18 Frank P. MacLachlan (fpm@crash.cts.com): - * Fixed uninitialized variable problem and added code to deal - * with DMA page boundaries in isa_dmarangecheck(). Fixed word - * mode DMA count compution and reorganized DMA setup code in - * isa_dmastart() - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static int isa_dmarangecheck(caddr_t va, u_int length, int chan); - -static caddr_t dma_bouncebuf[8]; -static u_int dma_bouncebufsize[8]; -static u_int8_t dma_bounced = 0; -static u_int8_t dma_busy = 0; /* Used in isa_dmastart() */ -static u_int8_t dma_inuse = 0; /* User for acquire/release */ -static u_int8_t dma_auto_mode = 0; - -#define VALID_DMA_MASK (7) - -/* high byte of address is stored in this port for i-th dma channel */ -static int dmapageport[8] = { 0x87, 0x83, 0x81, 0x82, 0x8f, 0x8b, 0x89, 0x8a }; - -/* - * Setup a DMA channel's bounce buffer. - */ -int -isa_dma_init(int chan, u_int bouncebufsize, int flag) -{ - void *buf; - - /* - * If a DMA channel is shared, both drivers have to call isa_dma_init - * since they don't know that the other driver will do it. - * Just return if we're already set up good. - * XXX: this only works if they agree on the bouncebuf size. This - * XXX: is typically the case since they are multiple instances of - * XXX: the same driver. - */ - if (dma_bouncebuf[chan] != NULL) - return (0); - -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dma_init: channel out of range"); -#endif - - dma_bouncebufsize[chan] = bouncebufsize; - - /* Try malloc() first. It works better if it works. */ - buf = malloc(bouncebufsize, M_DEVBUF, flag); - if (buf != NULL) { - if (isa_dmarangecheck(buf, bouncebufsize, chan) == 0) { - dma_bouncebuf[chan] = buf; - return (0); - } - free(buf, M_DEVBUF); - } - buf = contigmalloc(bouncebufsize, M_DEVBUF, flag, 0ul, 0xfffffful, - 1ul, chan & 4 ? 0x20000ul : 0x10000ul); - if (buf == NULL) - return (ENOMEM); - dma_bouncebuf[chan] = buf; - return (0); -} - -/* - * Register a DMA channel's usage. Usually called from a device driver - * in open() or during its initialization. - */ -int -isa_dma_acquire(chan) - int chan; -{ -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dma_acquire: channel out of range"); -#endif - - if (dma_inuse & (1 << chan)) { - printf("isa_dma_acquire: channel %d already in use\n", chan); - return (EBUSY); - } - dma_inuse |= (1 << chan); - dma_auto_mode &= ~(1 << chan); - - return (0); -} - -/* - * Unregister a DMA channel's usage. Usually called from a device driver - * during close() or during its shutdown. - */ -void -isa_dma_release(chan) - int chan; -{ -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dma_release: channel out of range"); - - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dma_release: channel %d not in use\n", chan); -#endif - - if (dma_busy & (1 << chan)) { - dma_busy &= ~(1 << chan); - /* - * XXX We should also do "dma_bounced &= (1 << chan);" - * because we are acting on behalf of isa_dmadone() which - * was not called to end the last DMA operation. This does - * not matter now, but it may in the future. - */ - } - - dma_inuse &= ~(1 << chan); - dma_auto_mode &= ~(1 << chan); -} - -/* - * isa_dmacascade(): program 8237 DMA controller channel to accept - * external dma control by a board. - */ -void -isa_dmacascade(chan) - int chan; -{ -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dmacascade: channel out of range"); -#endif - - /* set dma channel mode, and set dma channel mode */ - if ((chan & 4) == 0) { - outb(DMA1_MODE, DMA37MD_CASCADE | chan); - outb(DMA1_SMSK, chan); - } else { - outb(DMA2_MODE, DMA37MD_CASCADE | (chan & 3)); - outb(DMA2_SMSK, chan & 3); - } -} - -/* - * isa_dmastart(): program 8237 DMA controller channel, avoid page alignment - * problems by using a bounce buffer. - */ -void -isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) -{ - vm_paddr_t phys; - int waport; - caddr_t newaddr; - - GIANT_REQUIRED; - -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dmastart: channel out of range"); - - if ((chan < 4 && nbytes > (1<<16)) - || (chan >= 4 && (nbytes > (1<<17) || (u_int)addr & 1))) - panic("isa_dmastart: impossible request"); - - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dmastart: channel %d not acquired\n", chan); -#endif - -#if 0 - /* - * XXX This should be checked, but drivers like ad1848 only call - * isa_dmastart() once because they use Auto DMA mode. If we - * leave this in, drivers that do this will print this continuously. - */ - if (dma_busy & (1 << chan)) - printf("isa_dmastart: channel %d busy\n", chan); -#endif - - dma_busy |= (1 << chan); - - if (isa_dmarangecheck(addr, nbytes, chan)) { - if (dma_bouncebuf[chan] == NULL - || dma_bouncebufsize[chan] < nbytes) - panic("isa_dmastart: bad bounce buffer"); - dma_bounced |= (1 << chan); - newaddr = dma_bouncebuf[chan]; - - /* copy bounce buffer on write */ - if (!(flags & ISADMA_READ)) - bcopy(addr, newaddr, nbytes); - addr = newaddr; - } - - /* translate to physical */ - phys = pmap_extract(kernel_pmap, (vm_offset_t)addr); - - if (flags & ISADMA_RAW) { - dma_auto_mode |= (1 << chan); - } else { - dma_auto_mode &= ~(1 << chan); - } - - if ((chan & 4) == 0) { - /* - * Program one of DMA channels 0..3. These are - * byte mode channels. - */ - /* set dma channel mode, and reset address ff */ - - /* If ISADMA_RAW flag is set, then use autoinitialise mode */ - if (flags & ISADMA_RAW) { - if (flags & ISADMA_READ) - outb(DMA1_MODE, DMA37MD_AUTO|DMA37MD_WRITE|chan); - else - outb(DMA1_MODE, DMA37MD_AUTO|DMA37MD_READ|chan); - } - else - if (flags & ISADMA_READ) - outb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_WRITE|chan); - else - outb(DMA1_MODE, DMA37MD_SINGLE|DMA37MD_READ|chan); - outb(DMA1_FFC, 0); - - /* send start address */ - waport = DMA1_CHN(chan); - outb(waport, phys); - outb(waport, phys>>8); - outb(dmapageport[chan], phys>>16); - - /* send count */ - outb(waport + 1, --nbytes); - outb(waport + 1, nbytes>>8); - - /* unmask channel */ - outb(DMA1_SMSK, chan); - } else { - /* - * Program one of DMA channels 4..7. These are - * word mode channels. - */ - /* set dma channel mode, and reset address ff */ - - /* If ISADMA_RAW flag is set, then use autoinitialise mode */ - if (flags & ISADMA_RAW) { - if (flags & ISADMA_READ) - outb(DMA2_MODE, DMA37MD_AUTO|DMA37MD_WRITE|(chan&3)); - else - outb(DMA2_MODE, DMA37MD_AUTO|DMA37MD_READ|(chan&3)); - } - else - if (flags & ISADMA_READ) - outb(DMA2_MODE, DMA37MD_SINGLE|DMA37MD_WRITE|(chan&3)); - else - outb(DMA2_MODE, DMA37MD_SINGLE|DMA37MD_READ|(chan&3)); - outb(DMA2_FFC, 0); - - /* send start address */ - waport = DMA2_CHN(chan - 4); - outb(waport, phys>>1); - outb(waport, phys>>9); - outb(dmapageport[chan], phys>>16); - - /* send count */ - nbytes >>= 1; - outb(waport + 2, --nbytes); - outb(waport + 2, nbytes>>8); - - /* unmask channel */ - outb(DMA2_SMSK, chan & 3); - } -} - -void -isa_dmadone(int flags, caddr_t addr, int nbytes, int chan) -{ -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dmadone: channel out of range"); - - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dmadone: channel %d not acquired\n", chan); -#endif - - if (((dma_busy & (1 << chan)) == 0) && - (dma_auto_mode & (1 << chan)) == 0 ) - printf("isa_dmadone: channel %d not busy\n", chan); - - if ((dma_auto_mode & (1 << chan)) == 0) - outb(chan & 4 ? DMA2_SMSK : DMA1_SMSK, (chan & 3) | 4); - - if (dma_bounced & (1 << chan)) { - /* copy bounce buffer on read */ - if (flags & ISADMA_READ) - bcopy(dma_bouncebuf[chan], addr, nbytes); - - dma_bounced &= ~(1 << chan); - } - dma_busy &= ~(1 << chan); -} - -/* - * Check for problems with the address range of a DMA transfer - * (non-contiguous physical pages, outside of bus address space, - * crossing DMA page boundaries). - * Return true if special handling needed. - */ - -static int -isa_dmarangecheck(caddr_t va, u_int length, int chan) -{ - vm_paddr_t phys, priorpage = 0; - vm_offset_t endva; - u_int dma_pgmsk = (chan & 4) ? ~(128*1024-1) : ~(64*1024-1); - - GIANT_REQUIRED; - - endva = (vm_offset_t)round_page((vm_offset_t)va + length); - for (; va < (caddr_t) endva ; va += PAGE_SIZE) { - phys = trunc_page(pmap_extract(kernel_pmap, (vm_offset_t)va)); -#define ISARAM_END RAM_END - if (phys == 0) - panic("isa_dmacheck: no physical page present"); - if (phys >= ISARAM_END) - return (1); - if (priorpage) { - if (priorpage + PAGE_SIZE != phys) - return (1); - /* check if crossing a DMA page boundary */ - if (((u_int)priorpage ^ (u_int)phys) & dma_pgmsk) - return (1); - } - priorpage = phys; - } - return (0); -} - -/* - * Query the progress of a transfer on a DMA channel. - * - * To avoid having to interrupt a transfer in progress, we sample - * each of the high and low databytes twice, and apply the following - * logic to determine the correct count. - * - * Reads are performed with interrupts disabled, thus it is to be - * expected that the time between reads is very small. At most - * one rollover in the low count byte can be expected within the - * four reads that are performed. - * - * There are three gaps in which a rollover can occur : - * - * - read low1 - * gap1 - * - read high1 - * gap2 - * - read low2 - * gap3 - * - read high2 - * - * If a rollover occurs in gap1 or gap2, the low2 value will be - * greater than the low1 value. In this case, low2 and high2 are a - * corresponding pair. - * - * In any other case, low1 and high1 can be considered to be correct. - * - * The function returns the number of bytes remaining in the transfer, - * or -1 if the channel requested is not active. - * - */ -int -isa_dmastatus(int chan) -{ - u_long cnt = 0; - int ffport, waport; - u_long low1, high1, low2, high2; - - /* channel active? */ - if ((dma_inuse & (1 << chan)) == 0) { - printf("isa_dmastatus: channel %d not active\n", chan); - return(-1); - } - /* channel busy? */ - - if (((dma_busy & (1 << chan)) == 0) && - (dma_auto_mode & (1 << chan)) == 0 ) { - printf("chan %d not busy\n", chan); - return -2 ; - } - if (chan < 4) { /* low DMA controller */ - ffport = DMA1_FFC; - waport = DMA1_CHN(chan) + 1; - } else { /* high DMA controller */ - ffport = DMA2_FFC; - waport = DMA2_CHN(chan - 4) + 2; - } - - disable_intr(); /* no interrupts Mr Jones! */ - outb(ffport, 0); /* clear register LSB flipflop */ - low1 = inb(waport); - high1 = inb(waport); - outb(ffport, 0); /* clear again */ - low2 = inb(waport); - high2 = inb(waport); - enable_intr(); /* enable interrupts again */ - - /* - * Now decide if a wrap has tried to skew our results. - * Note that after TC, the count will read 0xffff, while we want - * to return zero, so we add and then mask to compensate. - */ - if (low1 >= low2) { - cnt = (low1 + (high1 << 8) + 1) & 0xffff; - } else { - cnt = (low2 + (high2 << 8) + 1) & 0xffff; - } - - if (chan >= 4) /* high channels move words */ - cnt *= 2; - return(cnt); -} - -/* - * Reached terminal count yet ? - */ -int -isa_dmatc(int chan) -{ - - if (chan < 4) - return(inb(DMA1_STATUS) & (1 << chan)); - else - return(inb(DMA2_STATUS) & (1 << (chan & 3))); -} - -/* - * Stop a DMA transfer currently in progress. - */ -int -isa_dmastop(int chan) -{ - if ((dma_inuse & (1 << chan)) == 0) - printf("isa_dmastop: channel %d not acquired\n", chan); - - if (((dma_busy & (1 << chan)) == 0) && - ((dma_auto_mode & (1 << chan)) == 0)) { - printf("chan %d not busy\n", chan); - return -2 ; - } - - if ((chan & 4) == 0) { - outb(DMA1_SMSK, (chan & 3) | 4 /* disable mask */); - } else { - outb(DMA2_SMSK, (chan & 3) | 4 /* disable mask */); - } - return(isa_dmastatus(chan)); -} - -/* - * Attach to the ISA PnP descriptor for the AT DMA controller - */ -static struct isa_pnp_id atdma_ids[] = { - { 0x0002d041 /* PNP0200 */, "AT DMA controller" }, - { 0 } -}; - -static int -atdma_probe(device_t dev) -{ - int result; - - if ((result = ISA_PNP_PROBE(device_get_parent(dev), dev, atdma_ids)) <= 0) - device_quiet(dev); - return(result); -} - -static int -atdma_attach(device_t dev) -{ - return(0); -} - -static device_method_t atdma_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, atdma_probe), - DEVMETHOD(device_attach, atdma_attach), - DEVMETHOD(device_detach, bus_generic_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), - { 0, 0 } -}; - -static driver_t atdma_driver = { - "atdma", - atdma_methods, - 1, /* no softc */ -}; - -static devclass_t atdma_devclass; - -DRIVER_MODULE(atdma, isa, atdma_driver, atdma_devclass, 0, 0); -DRIVER_MODULE(atdma, acpi, atdma_driver, atdma_devclass, 0, 0); diff --git a/sys/i386/linux/linux_machdep.c b/sys/i386/linux/linux_machdep.c index cd3cf79d558c..4e119d87fcc7 100644 --- a/sys/i386/linux/linux_machdep.c +++ b/sys/i386/linux/linux_machdep.c @@ -93,6 +93,10 @@ struct l_old_select_argv { struct l_timeval *timeout; }; +static int linux_mmap_common(struct thread *td, l_uintptr_t addr, + l_size_t len, l_int prot, l_int flags, l_int fd, + l_loff_t pos); + int linux_to_bsd_sigaltstack(int lsa) { @@ -591,12 +595,9 @@ linux_clone(struct thread *td, struct linux_clone_args *args) #define STACK_SIZE (2 * 1024 * 1024) #define GUARD_SIZE (4 * PAGE_SIZE) -static int linux_mmap_common(struct thread *, struct l_mmap_argv *); - int linux_mmap2(struct thread *td, struct linux_mmap2_args *args) { - struct l_mmap_argv linux_args; #ifdef DEBUG if (ldebug(mmap2)) @@ -605,14 +606,9 @@ linux_mmap2(struct thread *td, struct linux_mmap2_args *args) args->flags, args->fd, args->pgoff); #endif - linux_args.addr = args->addr; - linux_args.len = args->len; - linux_args.prot = args->prot; - linux_args.flags = args->flags; - linux_args.fd = args->fd; - linux_args.pgoff = args->pgoff * PAGE_SIZE; - - return (linux_mmap_common(td, &linux_args)); + return (linux_mmap_common(td, args->addr, args->len, args->prot, + args->flags, args->fd, (uint64_t)(uint32_t)args->pgoff * + PAGE_SIZE)); } int @@ -632,11 +628,14 @@ linux_mmap(struct thread *td, struct linux_mmap_args *args) linux_args.flags, linux_args.fd, linux_args.pgoff); #endif - return (linux_mmap_common(td, &linux_args)); + return (linux_mmap_common(td, linux_args.addr, linux_args.len, + linux_args.prot, linux_args.flags, linux_args.fd, + (uint32_t)linux_args.pgoff)); } static int -linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) +linux_mmap_common(struct thread *td, l_uintptr_t addr, l_size_t len, l_int prot, + l_int flags, l_int fd, l_loff_t pos) { struct proc *p = td->td_proc; struct mmap_args /* { @@ -659,21 +658,20 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * Linux mmap(2): * You must specify exactly one of MAP_SHARED and MAP_PRIVATE */ - if (! ((linux_args->flags & LINUX_MAP_SHARED) ^ - (linux_args->flags & LINUX_MAP_PRIVATE))) + if (!((flags & LINUX_MAP_SHARED) ^ (flags & LINUX_MAP_PRIVATE))) return (EINVAL); - if (linux_args->flags & LINUX_MAP_SHARED) + if (flags & LINUX_MAP_SHARED) bsd_args.flags |= MAP_SHARED; - if (linux_args->flags & LINUX_MAP_PRIVATE) + if (flags & LINUX_MAP_PRIVATE) bsd_args.flags |= MAP_PRIVATE; - if (linux_args->flags & LINUX_MAP_FIXED) + if (flags & LINUX_MAP_FIXED) bsd_args.flags |= MAP_FIXED; - if (linux_args->flags & LINUX_MAP_ANON) + if (flags & LINUX_MAP_ANON) bsd_args.flags |= MAP_ANON; else bsd_args.flags |= MAP_NOSYNC; - if (linux_args->flags & LINUX_MAP_GROWSDOWN) + if (flags & LINUX_MAP_GROWSDOWN) bsd_args.flags |= MAP_STACK; /* @@ -681,12 +679,12 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * on Linux/i386. We do this to ensure maximum compatibility. * Linux/ia64 does the same in i386 emulation mode. */ - bsd_args.prot = linux_args->prot; + bsd_args.prot = prot; if (bsd_args.prot & (PROT_READ | PROT_WRITE | PROT_EXEC)) bsd_args.prot |= PROT_READ | PROT_EXEC; /* Linux does not check file descriptor when MAP_ANONYMOUS is set. */ - bsd_args.fd = (bsd_args.flags & MAP_ANON) ? -1 : linux_args->fd; + bsd_args.fd = (bsd_args.flags & MAP_ANON) ? -1 : fd; if (bsd_args.fd != -1) { /* * Linux follows Solaris mmap(2) description: @@ -711,9 +709,9 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) fdrop(fp, td); } - if (linux_args->flags & LINUX_MAP_GROWSDOWN) { + if (flags & LINUX_MAP_GROWSDOWN) { /* - * The linux MAP_GROWSDOWN option does not limit auto + * The Linux MAP_GROWSDOWN option does not limit auto * growth of the region. Linux mmap with this option * takes as addr the inital BOS, and as len, the initial * region size. It can then grow down from addr without @@ -734,8 +732,7 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * fixed size of (STACK_SIZE - GUARD_SIZE). */ - if ((caddr_t)PTRIN(linux_args->addr) + linux_args->len > - p->p_vmspace->vm_maxsaddr) { + if ((caddr_t)PTRIN(addr) + len > p->p_vmspace->vm_maxsaddr) { /* * Some linux apps will attempt to mmap * thread stacks near the top of their @@ -766,19 +763,19 @@ linux_mmap_common(struct thread *td, struct l_mmap_argv *linux_args) * we map the full stack, since we don't have a way * to autogrow it. */ - if (linux_args->len > STACK_SIZE - GUARD_SIZE) { - bsd_args.addr = (caddr_t)PTRIN(linux_args->addr); - bsd_args.len = linux_args->len; + if (len > STACK_SIZE - GUARD_SIZE) { + bsd_args.addr = (caddr_t)PTRIN(addr); + bsd_args.len = len; } else { - bsd_args.addr = (caddr_t)PTRIN(linux_args->addr) - - (STACK_SIZE - GUARD_SIZE - linux_args->len); + bsd_args.addr = (caddr_t)PTRIN(addr) - + (STACK_SIZE - GUARD_SIZE - len); bsd_args.len = STACK_SIZE - GUARD_SIZE; } } else { - bsd_args.addr = (caddr_t)PTRIN(linux_args->addr); - bsd_args.len = linux_args->len; + bsd_args.addr = (caddr_t)PTRIN(addr); + bsd_args.len = len; } - bsd_args.pos = linux_args->pgoff; + bsd_args.pos = pos; #ifdef DEBUG if (ldebug(mmap)) diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c index d07f65563d31..069b5bb85722 100644 --- a/sys/i386/linux/linux_sysvec.c +++ b/sys/i386/linux/linux_sysvec.c @@ -667,10 +667,10 @@ linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) int linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args) { - struct proc *p = td->td_proc; struct l_sigframe frame; struct trapframe *regs; l_sigset_t lmask; + sigset_t bmask; int eflags, i; ksiginfo_t ksi; @@ -725,11 +725,8 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args) lmask.__bits[0] = frame.sf_sc.sc_mask; for (i = 0; i < (LINUX_NSIG_WORDS-1); i++) lmask.__bits[i+1] = frame.sf_extramask[i]; - PROC_LOCK(p); - linux_to_bsd_sigset(&lmask, &td->td_sigmask); - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + linux_to_bsd_sigset(&lmask, &bmask); + kern_sigprocmask(td, SIG_SETMASK, &bmask, NULL, 0); /* * Restore signal context. @@ -767,9 +764,9 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args) int linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args) { - struct proc *p = td->td_proc; struct l_ucontext uc; struct l_sigcontext *context; + sigset_t bmask; l_stack_t *lss; stack_t ss; struct trapframe *regs; @@ -826,11 +823,8 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args) return(EINVAL); } - PROC_LOCK(p); - linux_to_bsd_sigset(&uc.uc_sigmask, &td->td_sigmask); - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + linux_to_bsd_sigset(&uc.uc_sigmask, &bmask); + kern_sigprocmask(td, SIG_SETMASK, &bmask, NULL, 0); /* * Restore signal context diff --git a/sys/i386/xbox/xboxfb.c b/sys/i386/xbox/xboxfb.c index 906ced585d7c..5d83d12eee6e 100644 --- a/sys/i386/xbox/xboxfb.c +++ b/sys/i386/xbox/xboxfb.c @@ -521,8 +521,8 @@ xboxfb_blank_display(video_adapter_t *adp, int mode) } static int -xboxfb_mmap(video_adapter_t *adp, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +xboxfb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { return (EINVAL); } diff --git a/sys/i386/xen/clock.c b/sys/i386/xen/clock.c index d965022637bd..09ed7c3220ed 100644 --- a/sys/i386/xen/clock.c +++ b/sys/i386/xen/clock.c @@ -74,8 +74,8 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include +#include +#include #include #include diff --git a/sys/i386/xen/exception.s b/sys/i386/xen/exception.s index 607f96a46b2f..e965ffd026d3 100644 --- a/sys/i386/xen/exception.s +++ b/sys/i386/xen/exception.s @@ -295,10 +295,6 @@ ENTRY(fork_trampoline) SUPERALIGN_TEXT MCOUNT_LABEL(bintr) -#ifdef DEV_ATPIC -#include -#endif - #ifdef DEV_APIC .data .p2align 4 diff --git a/sys/i386/xen/locore.s b/sys/i386/xen/locore.s index 95d2afae8411..59cdb5474e3d 100644 --- a/sys/i386/xen/locore.s +++ b/sys/i386/xen/locore.s @@ -152,9 +152,7 @@ KPTphys: .long 0 /* phys addr of kernel page tables */ gdtset: .long 0 /* GDT is valid */ .globl proc0kstack -proc0uarea: .long 0 /* address of proc 0 uarea (unused)*/ proc0kstack: .long 0 /* address of proc 0 kstack space */ -p0upa: .long 0 /* phys addr of proc0 UAREA (unused) */ p0kpa: .long 0 /* phys addr of proc0's STACK */ vm86phystk: .long 0 /* PA of vm86/bios stack */ diff --git a/sys/i386/xen/mp_machdep.c b/sys/i386/xen/mp_machdep.c index 92533662b26e..d408e971278f 100644 --- a/sys/i386/xen/mp_machdep.c +++ b/sys/i386/xen/mp_machdep.c @@ -105,9 +105,6 @@ static char callfunc_name[NR_CPUS][15]; /* Free these after use */ void *bootstacks[MAXCPU]; -/* Hotwire a 0->4MB V==P mapping */ -extern pt_entry_t *KPTphys; - struct pcb stoppcbs[MAXCPU]; /* Variables needed for SMP tlb shootdown. */ diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c index 1d9c9c1cd9c7..ae4d4aa2add2 100644 --- a/sys/i386/xen/pmap.c +++ b/sys/i386/xen/pmap.c @@ -173,7 +173,11 @@ __FBSDID("$FreeBSD$"); #endif #if !defined(PMAP_DIAGNOSTIC) -#define PMAP_INLINE __gnu89_inline +#ifdef __GNUC_GNU_INLINE__ +#define PMAP_INLINE inline +#else +#define PMAP_INLINE extern inline +#endif #else #define PMAP_INLINE #endif @@ -247,9 +251,8 @@ struct sysmaps { caddr_t CADDR2; }; static struct sysmaps sysmaps_pcpu[MAXCPU]; -pt_entry_t *CMAP1 = 0; static pt_entry_t *CMAP3; -caddr_t CADDR1 = 0, ptvmmap = 0; +caddr_t ptvmmap = 0; static caddr_t CADDR3; struct msgbuf *msgbufp = 0; @@ -279,7 +282,7 @@ static struct mtx PMAP2mutex; SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); static int pg_ps_enabled; -SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RD, &pg_ps_enabled, 0, +SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0, "Are large page mappings enabled?"); SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, &pv_entry_max, 0, @@ -318,6 +321,9 @@ static __inline void pagezero(void *page); #if defined(PAE) && !defined(XEN) static void *pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait); #endif +#ifndef XEN +static void pmap_set_pg(void); +#endif CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t)); CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t)); @@ -447,8 +453,9 @@ pmap_bootstrap(vm_paddr_t firstaddr) mtx_init(&sysmaps->lock, "SYSMAPS", NULL, MTX_DEF); SYSMAP(caddr_t, sysmaps->CMAP1, sysmaps->CADDR1, 1) SYSMAP(caddr_t, sysmaps->CMAP2, sysmaps->CADDR2, 1) + PT_SET_MA(sysmaps->CADDR1, 0); + PT_SET_MA(sysmaps->CADDR2, 0); } - SYSMAP(caddr_t, CMAP1, CADDR1, 1) SYSMAP(caddr_t, CMAP3, CADDR3, 1) PT_SET_MA(CADDR3, 0); @@ -476,7 +483,6 @@ pmap_bootstrap(vm_paddr_t firstaddr) mtx_init(&PMAP2mutex, "PMAP2", NULL, MTX_DEF); virtual_avail = va; - PT_SET_MA(CADDR1, 0); /* * Leave in place an identity mapping (virt == phys) for the low 1 MB @@ -549,10 +555,11 @@ pmap_init_pat(void) wrmsr(MSR_PAT, pat_msr); } +#ifndef XEN /* * Set PG_G on kernel pages. Only the BSP calls this when SMP is turned on. */ -void +static void pmap_set_pg(void) { pd_entry_t pdir; @@ -587,6 +594,7 @@ pmap_set_pg(void) } } } +#endif /* * Initialize a vm_page's machine-dependent fields. @@ -1052,7 +1060,9 @@ pmap_pte(pmap_t pmap, vm_offset_t va) mtx_lock(&PMAP2mutex); newpf = *pde & PG_FRAME; if ((*PMAP2 & PG_FRAME) != newpf) { + vm_page_lock_queues(); PT_SET_MA(PADDR2, newpf | PG_V | PG_A | PG_M); + vm_page_unlock_queues(); CTR3(KTR_PMAP, "pmap_pte: pmap=%p va=0x%x newpte=0x%08x", pmap, va, (*PMAP2 & 0xffffffff)); } @@ -3101,9 +3111,10 @@ void * pmap_kenter_temporary(vm_paddr_t pa, int i) { vm_offset_t va; + vm_paddr_t ma = xpmap_ptom(pa); va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE); - pmap_kenter(va, pa); + PT_SET_MA(va, (ma & ~PAGE_MASK) | PG_V | pgeflag); invlpg(va); return ((void *)crashdumpmap); } @@ -4175,6 +4186,11 @@ pmap_activate(struct thread *td) critical_exit(); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/i386/xen/xen_machdep.c b/sys/i386/xen/xen_machdep.c index 878f436fde7d..060fad5e72ab 100644 --- a/sys/i386/xen/xen_machdep.c +++ b/sys/i386/xen/xen_machdep.c @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -101,6 +102,7 @@ void ni_sti(void); void ni_cli(void) { + CTR0(KTR_SPARE2, "ni_cli disabling interrupts"); __asm__("pushl %edx;" "pushl %eax;" ); @@ -345,33 +347,53 @@ xen_load_cr3(u_int val) PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0); } -void -xen_restore_flags(u_int eflags) +#ifdef KTR +static __inline u_int +rebp(void) { - if (eflags > 1) - eflags = ((eflags & PSL_I) == 0); + u_int data; - __restore_flags(eflags); + __asm __volatile("movl 4(%%ebp),%0" : "=r" (data)); + return (data); +} +#endif + +u_int +read_eflags(void) +{ + vcpu_info_t *_vcpu; + u_int eflags; + + eflags = _read_eflags(); + _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; + if (_vcpu->evtchn_upcall_mask) + eflags &= ~PSL_I; + + return (eflags); } -int -xen_save_and_cli(void) +void +write_eflags(u_int eflags) { - int eflags; - - __save_and_cli(eflags); - return (eflags); + u_int intr; + + CTR2(KTR_SPARE2, "%x xen_restore_flags eflags %x", rebp(), eflags); + intr = ((eflags & PSL_I) == 0); + __restore_flags(intr); + _write_eflags(eflags); } void xen_cli(void) { + CTR1(KTR_SPARE2, "%x xen_cli disabling interrupts", rebp()); __cli(); } void xen_sti(void) { + CTR1(KTR_SPARE2, "%x xen_sti enabling interrupts", rebp()); __sti(); } @@ -693,9 +715,6 @@ xen_destroy_contiguous_region(void *addr, int npages) balloon_unlock(flags); } -extern unsigned long cpu0prvpage; -extern unsigned long *SMPpt; -extern struct user *proc0uarea; extern vm_offset_t proc0kstack; extern int vm86paddr, vm86phystk; char *bootmem_start, *bootmem_current, *bootmem_end; @@ -850,23 +869,25 @@ extern unsigned long physfree; int pdir, curoffset; extern int nkpt; +extern uint32_t kernbase; + void initvalues(start_info_t *startinfo) { - int l3_pages, l2_pages, l1_pages, offset; vm_offset_t cur_space, cur_space_pt; struct physdev_set_iopl set_iopl; - vm_paddr_t KPTphys, IdlePTDma; + int l3_pages, l2_pages, l1_pages, offset; vm_paddr_t console_page_ma, xen_store_ma; - vm_offset_t KPTphysoff, tmpva; + vm_offset_t tmpva; vm_paddr_t shinfo; #ifdef PAE vm_paddr_t IdlePDPTma, IdlePDPTnewma; vm_paddr_t IdlePTDnewma[4]; pd_entry_t *IdlePDPTnew, *IdlePTDnew; + vm_paddr_t IdlePTDma[4]; #else - vm_paddr_t pdir_shadow_ma; + vm_paddr_t IdlePTDma[1]; #endif unsigned long i; int ncpus = MAXCPU; @@ -902,11 +923,9 @@ initvalues(start_info_t *startinfo) * Note that only one page directory has been allocated at this point. * Thus, if KERNBASE */ -#if 0 for (i = 0; i < l2_pages; i++) IdlePTDma[i] = xpmap_ptom(VTOP(IdlePTD + i*PAGE_SIZE)); -#endif - + l2_pages = (l2_pages == 0) ? 1 : l2_pages; #else l3_pages = 0; @@ -919,10 +938,11 @@ initvalues(start_info_t *startinfo) break; l1_pages++; } - + /* number of pages allocated after the pts + 1*/; cur_space = xen_start_info->pt_base + - ((xen_start_info->nr_pt_frames) + 3 )*PAGE_SIZE; + (l3_pages + l2_pages + l1_pages + 1)*PAGE_SIZE; + printk("initvalues(): wooh - availmem=%x,%x\n", avail_space, cur_space); printk("KERNBASE=%x,pt_base=%x, VTOPFN(base)=%x, nr_pt_frames=%x\n", @@ -930,72 +950,15 @@ initvalues(start_info_t *startinfo) xen_start_info->nr_pt_frames); xendebug_flags = 0; /* 0xffffffff; */ - /* allocate 4 pages for bootmem allocator */ - bootmem_start = bootmem_current = (char *)cur_space; - cur_space += (4 * PAGE_SIZE); - bootmem_end = (char *)cur_space; - - /* allocate page for gdt */ - gdt = (union descriptor *)cur_space; - cur_space += PAGE_SIZE*ncpus; - - /* allocate page for ldt */ - ldt = (union descriptor *)cur_space; cur_space += PAGE_SIZE; - cur_space += PAGE_SIZE; - - HYPERVISOR_shared_info = (shared_info_t *)cur_space; - cur_space += PAGE_SIZE; - - xen_store = (struct ringbuf_head *)cur_space; - cur_space += PAGE_SIZE; - - console_page = (char *)cur_space; - cur_space += PAGE_SIZE; - #ifdef ADD_ISA_HOLE shift_phys_machine(xen_phys_machine, xen_start_info->nr_pages); #endif - /* - * pre-zero unused mapped pages - mapped on 4MB boundary - */ -#ifdef PAE - IdlePDPT = (pd_entry_t *)startinfo->pt_base; - IdlePDPTma = xpmap_ptom(VTOP(startinfo->pt_base)); - /* - * Note that only one page directory has been allocated at this point. - * Thus, if KERNBASE - */ - IdlePTD = (pd_entry_t *)((uint8_t *)startinfo->pt_base + PAGE_SIZE); - IdlePTDma = xpmap_ptom(VTOP(IdlePTD)); - l3_pages = 1; -#else - IdlePTD = (pd_entry_t *)startinfo->pt_base; - IdlePTDma = xpmap_ptom(VTOP(startinfo->pt_base)); - l3_pages = 0; -#endif - l2_pages = 1; - l1_pages = xen_start_info->nr_pt_frames - l2_pages - l3_pages; - - KPTphysoff = (l2_pages + l3_pages)*PAGE_SIZE; - - KPTphys = xpmap_ptom(VTOP(startinfo->pt_base + KPTphysoff)); XENPRINTF("IdlePTD %p\n", IdlePTD); XENPRINTF("nr_pages: %ld shared_info: 0x%lx flags: 0x%lx pt_base: 0x%lx " "mod_start: 0x%lx mod_len: 0x%lx\n", xen_start_info->nr_pages, xen_start_info->shared_info, xen_start_info->flags, xen_start_info->pt_base, xen_start_info->mod_start, xen_start_info->mod_len); - /* Map proc0's KSTACK */ - - proc0kstack = cur_space; cur_space += (KSTACK_PAGES * PAGE_SIZE); - printk("proc0kstack=%u\n", proc0kstack); - - /* vm86/bios stack */ - cur_space += PAGE_SIZE; - - /* Map space for the vm86 region */ - vm86paddr = (vm_offset_t)cur_space; - cur_space += (PAGE_SIZE * 3); #ifdef PAE IdlePDPTnew = (pd_entry_t *)cur_space; cur_space += PAGE_SIZE; @@ -1028,26 +991,42 @@ initvalues(start_info_t *startinfo) * Unpin the current PDPT */ xen_pt_unpin(IdlePDPTma); - - for (i = 0; i < 20; i++) { - int startidx = ((KERNBASE >> 18) & PAGE_MASK) >> 3; - - if (IdlePTD[startidx + i] == 0) { - l1_pages = i; - break; - } - } #endif /* PAE */ + + /* Map proc0's KSTACK */ + proc0kstack = cur_space; cur_space += (KSTACK_PAGES * PAGE_SIZE); + printk("proc0kstack=%u\n", proc0kstack); + + /* vm86/bios stack */ + cur_space += PAGE_SIZE; + + /* Map space for the vm86 region */ + vm86paddr = (vm_offset_t)cur_space; + cur_space += (PAGE_SIZE * 3); + + /* allocate 4 pages for bootmem allocator */ + bootmem_start = bootmem_current = (char *)cur_space; + cur_space += (4 * PAGE_SIZE); + bootmem_end = (char *)cur_space; - /* unmap remaining pages from initial 4MB chunk + /* allocate pages for gdt */ + gdt = (union descriptor *)cur_space; + cur_space += PAGE_SIZE*ncpus; + + /* allocate page for ldt */ + ldt = (union descriptor *)cur_space; cur_space += PAGE_SIZE; + cur_space += PAGE_SIZE; + + /* unmap remaining pages from initial chunk * */ - for (tmpva = cur_space; (tmpva & ((1<<22)-1)) != 0; tmpva += PAGE_SIZE) { + for (tmpva = cur_space; tmpva < (((uint32_t)&kernbase) + (l1_pages<> 18)), @@ -1074,10 +1053,10 @@ initvalues(start_info_t *startinfo) * make sure that all the initial page table pages * have been zeroed */ - PT_SET_MA(cur_space_pt, + PT_SET_MA(cur_space, xpmap_ptom(VTOP(cur_space)) | PG_V | PG_RW); - bzero((char *)cur_space_pt, PAGE_SIZE); - PT_SET_MA(cur_space_pt, (vm_paddr_t)0); + bzero((char *)cur_space, PAGE_SIZE); + PT_SET_MA(cur_space, (vm_paddr_t)0); xen_pt_pin(xpmap_ptom(VTOP(cur_space))); xen_queue_pt_update((vm_paddr_t)(IdlePTDnewma[pdir] + curoffset*sizeof(vm_paddr_t)), @@ -1100,6 +1079,15 @@ initvalues(start_info_t *startinfo) IdlePDPT = IdlePDPTnew; IdlePDPTma = IdlePDPTnewma; + HYPERVISOR_shared_info = (shared_info_t *)cur_space; + cur_space += PAGE_SIZE; + + xen_store = (struct ringbuf_head *)cur_space; + cur_space += PAGE_SIZE; + + console_page = (char *)cur_space; + cur_space += PAGE_SIZE; + /* * shared_info is an unsigned long so this will randomly break if * it is allocated above 4GB - I guess people are used to that diff --git a/sys/ia64/acpica/madt.c b/sys/ia64/acpica/madt.c index 254308846b1e..51193fffcc80 100644 --- a/sys/ia64/acpica/madt.c +++ b/sys/ia64/acpica/madt.c @@ -31,8 +31,6 @@ #include -extern u_int64_t ia64_lapic_address; - struct sapic *sapic_create(int, int, u_int64_t); static void @@ -150,7 +148,7 @@ ia64_probe_sapics(void) /* Save the address of the processor interrupt block. */ if (bootverbose) printf("\tLocal APIC address=0x%x\n", table->Address); - ia64_lapic_address = table->Address; + ia64_lapic_addr = table->Address; end = (char *)table + table->Header.Length; p = (char *)(table + 1); @@ -172,7 +170,7 @@ ia64_probe_sapics(void) case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: { ACPI_MADT_LOCAL_APIC_OVERRIDE *lapic = (ACPI_MADT_LOCAL_APIC_OVERRIDE *)entry; - ia64_lapic_address = lapic->Address; + ia64_lapic_addr = lapic->Address; break; } diff --git a/sys/ia64/conf/DEFAULTS b/sys/ia64/conf/DEFAULTS index 625ff90955cc..2cb2330054bb 100644 --- a/sys/ia64/conf/DEFAULTS +++ b/sys/ia64/conf/DEFAULTS @@ -9,6 +9,7 @@ machine ia64 device acpi # ACPI support # Pseudo devices. +device io # I/O & EFI runtime device device mem # Memory and kernel memory devices # UART chips on this platform diff --git a/sys/ia64/conf/GENERIC b/sys/ia64/conf/GENERIC index b143868870b9..b64c0143bd4c 100644 --- a/sys/ia64/conf/GENERIC +++ b/sys/ia64/conf/GENERIC @@ -31,6 +31,7 @@ options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty) options COMPAT_FREEBSD6 # Compatible with FreeBSD6 options COMPAT_FREEBSD7 # Compatible with FreeBSD7 options DDB # Support DDB +options DEADLKRES # Enable the deadlock resolver options FFS # Berkeley Fast Filesystem options GDB # Support remote GDB options GEOM_LABEL # Provides labelization @@ -40,13 +41,14 @@ options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # required by INVARIANTS options KDB # Enable kernel debugger support options KTRACE # ktrace(1) syscall trace support -options MAC # TrustedBSD MAC Framework +options MAC # TrustedBSD MAC Framework options MD_ROOT # MD usable as root device options MSDOSFS # MSDOS Filesystem options NFSCLIENT # Network Filesystem Client options NFSSERVER # Network Filesystem Server options NFSLOCKD # Network Lock Manager options NFS_ROOT # NFS usable as root device +options PRINTF_BUFR_SIZE=128 # Printf buffering to limit interspersion options PROCFS # Process filesystem (/proc) options PSEUDOFS # Pseudo-filesystem framework options SCHED_ULE # ULE scheduler @@ -65,7 +67,8 @@ options UFS_GJOURNAL # Enable gjournal-based UFS journaling options WITNESS # Enable checks to detect deadlocks and cycles options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed options _KPOSIX_PRIORITY_SCHEDULING # Posix P1003_1B RT extensions -options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) +options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) +options INCLUDE_CONFIG_FILE # Include this file in kernel # Various "busses" device firewire # FireWire bus code @@ -148,6 +151,7 @@ device sbp # SCSI over FireWire (need scbus & da) # Various (pseudo) devices device ether # Ethernet support +device vlan # 802.1Q VLAN support device faith # IPv6-to-IPv4 relaying (translation) device gif # IPv6 and IPv4 tunneling device loop # Network loopback diff --git a/sys/ia64/conf/Makefile b/sys/ia64/conf/Makefile index 2c006e9c2c80..122a7d09c252 100644 --- a/sys/ia64/conf/Makefile +++ b/sys/ia64/conf/Makefile @@ -1,3 +1,5 @@ # $FreeBSD$ +TARGET=ia64 + .include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/ia64/ia64/bus_machdep.c b/sys/ia64/ia64/bus_machdep.c new file mode 100644 index 000000000000..cd9ebc8ce461 --- /dev/null +++ b/sys/ia64/ia64/bus_machdep.c @@ -0,0 +1,377 @@ +/*- + * Copyright (c) 2009 Marcel Moolenaar + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +extern u_long ia64_port_base; + +#define __PIO_ADDR(port) \ + (void *)(ia64_port_base | (((port) & 0xfffc) << 10) | ((port) & 0xFFF)) + +int +bus_space_map(bus_space_tag_t bst, bus_addr_t addr, bus_size_t size, + int flags __unused, bus_space_handle_t *bshp) +{ + + *bshp = (__predict_false(bst == IA64_BUS_SPACE_IO)) + ? addr : (uintptr_t)pmap_mapdev(addr, size); + return (0); +} + + +void +bus_space_unmap(bus_space_tag_t bst __unused, bus_space_handle_t bsh, + bus_size_t size) +{ + + pmap_unmapdev(bsh, size); +} + +uint8_t +bus_space_read_io_1(u_long port) +{ + uint8_t v; + + ia64_mf(); + v = ia64_ld1(__PIO_ADDR(port)); + ia64_mf_a(); + ia64_mf(); + return (v); +} + +uint16_t +bus_space_read_io_2(u_long port) +{ + uint16_t v; + + ia64_mf(); + v = ia64_ld2(__PIO_ADDR(port)); + ia64_mf_a(); + ia64_mf(); + return (v); +} + +uint32_t +bus_space_read_io_4(u_long port) +{ + uint32_t v; + + ia64_mf(); + v = ia64_ld4(__PIO_ADDR(port)); + ia64_mf_a(); + ia64_mf(); + return (v); +} + +#if 0 +uint64_t +bus_space_read_io_8(u_long port) +{ +} +#endif + +void +bus_space_write_io_1(u_long port, uint8_t val) +{ + + ia64_mf(); + ia64_st1(__PIO_ADDR(port), val); + ia64_mf_a(); + ia64_mf(); +} + +void +bus_space_write_io_2(u_long port, uint16_t val) +{ + + ia64_mf(); + ia64_st2(__PIO_ADDR(port), val); + ia64_mf_a(); + ia64_mf(); +} + +void +bus_space_write_io_4(u_long port, uint32_t val) +{ + + ia64_mf(); + ia64_st4(__PIO_ADDR(port), val); + ia64_mf_a(); + ia64_mf(); +} + +#if 0 +void +bus_space_write_io_8(u_long port, uint64_t val) +{ +} +#endif + +void +bus_space_read_multi_io_1(u_long port, uint8_t *ptr, size_t count) +{ + + while (count-- > 0) + *ptr++ = bus_space_read_io_1(port); +} + +void +bus_space_read_multi_io_2(u_long port, uint16_t *ptr, size_t count) +{ + + while (count-- > 0) + *ptr++ = bus_space_read_io_2(port); +} + +void +bus_space_read_multi_io_4(u_long port, uint32_t *ptr, size_t count) +{ + + while (count-- > 0) + *ptr++ = bus_space_read_io_4(port); +} + +#if 0 +void +bus_space_read_multi_io_8(u_long port, uint64_t *ptr, size_t count) +{ +} +#endif + +void +bus_space_write_multi_io_1(u_long port, const uint8_t *ptr, size_t count) +{ + + while (count-- > 0) + bus_space_write_io_1(port, *ptr++); +} + +void +bus_space_write_multi_io_2(u_long port, const uint16_t *ptr, size_t count) +{ + + while (count-- > 0) + bus_space_write_io_2(port, *ptr++); +} + +void +bus_space_write_multi_io_4(u_long port, const uint32_t *ptr, size_t count) +{ + + while (count-- > 0) + bus_space_write_io_4(port, *ptr++); +} + +#if 0 +void +bus_space_write_multi_io_8(u_long port, const uint64_t *ptr, size_t count) +{ +} +#endif + +void +bus_space_read_region_io_1(u_long port, uint8_t *ptr, size_t count) +{ + + while (count-- > 0) { + *ptr++ = bus_space_read_io_1(port); + port += 1; + } +} + +void +bus_space_read_region_io_2(u_long port, uint16_t *ptr, size_t count) +{ + + while (count-- > 0) { + *ptr++ = bus_space_read_io_2(port); + port += 2; + } +} + +void +bus_space_read_region_io_4(u_long port, uint32_t *ptr, size_t count) +{ + + while (count-- > 0) { + *ptr++ = bus_space_read_io_4(port); + port += 4; + } +} + +#if 0 +void bus_space_read_region_io_8(u_long, uint64_t *, size_t); +#endif + +void +bus_space_write_region_io_1(u_long port, const uint8_t *ptr, size_t count) +{ + + while (count-- > 0) { + bus_space_write_io_1(port, *ptr++); + port += 1; + } +} + +void +bus_space_write_region_io_2(u_long port, const uint16_t *ptr, size_t count) +{ + + while (count-- > 0) { + bus_space_write_io_2(port, *ptr++); + port += 2; + } +} + +void +bus_space_write_region_io_4(u_long port, const uint32_t *ptr, size_t count) +{ + + while (count-- > 0) { + bus_space_write_io_4(port, *ptr++); + port += 4; + } +} + +#if 0 +void +bus_space_write_region_io_8(u_long port, const uint64_t *ptr, size_t count) +{ +} +#endif + +void +bus_space_set_region_io_1(u_long port, uint8_t val, size_t count) +{ + + while (count-- > 0) { + bus_space_write_io_1(port, val); + port += 1; + } +} + +void +bus_space_set_region_io_2(u_long port, uint16_t val, size_t count) +{ + + while (count-- > 0) { + bus_space_write_io_2(port, val); + port += 2; + } +} + +void +bus_space_set_region_io_4(u_long port, uint32_t val, size_t count) +{ + + while (count-- > 0) { + bus_space_write_io_4(port, val); + port += 4; + } +} + +#if 0 +void +bus_space_set_region_io_8(u_long port, uint64_t val, size_t count) +{ +} +#endif + +void +bus_space_copy_region_io_1(u_long src, u_long dst, size_t count) +{ + long delta; + uint8_t val; + + if (src < dst) { + src += count - 1; + dst += count - 1; + delta = -1; + } else + delta = 1; + + while (count-- > 0) { + val = bus_space_read_io_1(src); + bus_space_write_io_1(dst, val); + src += delta; + dst += delta; + } +} + +void +bus_space_copy_region_io_2(u_long src, u_long dst, size_t count) +{ + long delta; + uint16_t val; + + if (src < dst) { + src += 2 * (count - 1); + dst += 2 * (count - 1); + delta = -2; + } else + delta = 2; + + while (count-- > 0) { + val = bus_space_read_io_2(src); + bus_space_write_io_2(dst, val); + src += delta; + dst += delta; + } +} + +void +bus_space_copy_region_io_4(u_long src, u_long dst, size_t count) +{ + long delta; + uint32_t val; + + if (src < dst) { + src += 4 * (count - 1); + dst += 4 * (count - 1); + delta = -4; + } else + delta = 4; + + while (count-- > 0) { + val = bus_space_read_io_4(src); + bus_space_write_io_4(dst, val); + src += delta; + dst += delta; + } +} + +#if 0 +void +bus_space_copy_region_io_8(u_long src, u_long dst, size_t count) +{ +} +#endif diff --git a/sys/ia64/ia64/clock.c b/sys/ia64/ia64/clock.c index 22fcf9bf452c..a9c39fce3598 100644 --- a/sys/ia64/ia64/clock.c +++ b/sys/ia64/ia64/clock.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include uint64_t ia64_clock_reload; @@ -64,9 +65,9 @@ void pcpu_initclock(void) { - PCPU_SET(clockadj, 0); - PCPU_SET(clock, ia64_get_itc()); - ia64_set_itm(PCPU_GET(clock) + ia64_clock_reload); + PCPU_SET(md.clockadj, 0); + PCPU_SET(md.clock, ia64_get_itc()); + ia64_set_itm(PCPU_GET(md.clock) + ia64_clock_reload); ia64_set_itv(CLOCK_VECTOR); /* highest priority class */ ia64_srlz_d(); } @@ -78,15 +79,15 @@ pcpu_initclock(void) void cpu_initclocks() { + u_long itc_freq; - if (itc_frequency == 0) - panic("Unknown clock frequency"); + itc_freq = (u_long)ia64_itc_freq() * 1000000ul; stathz = hz; - ia64_clock_reload = (itc_frequency + hz/2) / hz; + ia64_clock_reload = (itc_freq + hz/2) / hz; #ifndef SMP - ia64_timecounter.tc_frequency = itc_frequency; + ia64_timecounter.tc_frequency = itc_freq; tc_init(&ia64_timecounter); #endif diff --git a/sys/ia64/ia64/context.S b/sys/ia64/ia64/context.S index 77a1821f789a..84d8fd1ccc51 100644 --- a/sys/ia64/ia64/context.S +++ b/sys/ia64/ia64/context.S @@ -86,18 +86,18 @@ ENTRY(restorectx, 1) { .mmi ld8.fill r6=[r14],16 // r6 ld8.fill r7=[r15],16 // r7 - nop 1 + nop 0 ;; } { .mmi mov ar.unat=r16 mov ar.rsc=3 - nop 2 + nop 0 } { .mmi ld8 r17=[r14],16 // b1 ld8 r18=[r15],16 // b2 - nop 3 + nop 0 ;; } { .mmi @@ -286,7 +286,7 @@ ENTRY(swapctx, 2) (p15) br.ret.sptk rp ;; } -{ .mfb +{ .mib mov r32=r33 nop 0 br.sptk restorectx @@ -338,10 +338,10 @@ ENTRY(save_callee_saved, 1) mov r17=b5 ;; } -{ .mfi +{ .mii st8 [r14]=r17,16 // b5 - nop 0 mov r16=ar.lc + nop 0 ;; } { .mmb @@ -363,13 +363,13 @@ ENTRY(restore_callee_saved, 1) add r31=-8,r32 ;; } -{ .mmb +{ .mmi ld8.fill r4=[r31],16 // r4 ld8.fill r5=[r32],16 // r5 nop 0 ;; } -{ .mmb +{ .mmi ld8.fill r6=[r31],16 // r6 ld8.fill r7=[r32],16 // r7 nop 0 diff --git a/sys/ia64/ia64/db_machdep.c b/sys/ia64/ia64/db_machdep.c index cdd60ab03c6a..d1163cbd0503 100644 --- a/sys/ia64/ia64/db_machdep.c +++ b/sys/ia64/ia64/db_machdep.c @@ -29,7 +29,7 @@ #include __FBSDID("$FreeBSD$"); -#include +#include "opt_xtrace.h" #include #include diff --git a/sys/ia64/ia64/efi.c b/sys/ia64/ia64/efi.c index 161572d99714..d193f60c055a 100644 --- a/sys/ia64/ia64/efi.c +++ b/sys/ia64/ia64/efi.c @@ -33,6 +33,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include extern uint64_t ia64_call_efi_physical(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t); @@ -41,6 +43,45 @@ static struct efi_systbl *efi_systbl; static struct efi_cfgtbl *efi_cfgtbl; static struct efi_rt *efi_runtime; +static int efi_status2err[25] = { + 0, /* EFI_SUCCESS */ + ENOEXEC, /* EFI_LOAD_ERROR */ + EINVAL, /* EFI_INVALID_PARAMETER */ + ENOSYS, /* EFI_UNSUPPORTED */ + EMSGSIZE, /* EFI_BAD_BUFFER_SIZE */ + EOVERFLOW, /* EFI_BUFFER_TOO_SMALL */ + EBUSY, /* EFI_NOT_READY */ + EIO, /* EFI_DEVICE_ERROR */ + EROFS, /* EFI_WRITE_PROTECTED */ + EAGAIN, /* EFI_OUT_OF_RESOURCES */ + EIO, /* EFI_VOLUME_CORRUPTED */ + ENOSPC, /* EFI_VOLUME_FULL */ + ENXIO, /* EFI_NO_MEDIA */ + ESTALE, /* EFI_MEDIA_CHANGED */ + ENOENT, /* EFI_NOT_FOUND */ + EACCES, /* EFI_ACCESS_DENIED */ + ETIMEDOUT, /* EFI_NO_RESPONSE */ + EADDRNOTAVAIL, /* EFI_NO_MAPPING */ + ETIMEDOUT, /* EFI_TIMEOUT */ + EDOOFUS, /* EFI_NOT_STARTED */ + EALREADY, /* EFI_ALREADY_STARTED */ + ECANCELED, /* EFI_ABORTED */ + EPROTO, /* EFI_ICMP_ERROR */ + EPROTO, /* EFI_TFTP_ERROR */ + EPROTO /* EFI_PROTOCOL_ERROR */ +}; + +static int +efi_status_to_errno(efi_status status) +{ + u_long code; + int error; + + code = status & 0x3ffffffffffffffful; + error = (code < 25) ? efi_status2err[code] : EDOOFUS; + return (error); +} + void efi_boot_finish(void) { @@ -84,8 +125,8 @@ efi_boot_minimal(uint64_t systbl) md->md_virt = (void *)IA64_PHYS_TO_RR7(md->md_phys); else if (md->md_attr & EFI_MD_ATTR_UC) - md->md_virt = - (void *)IA64_PHYS_TO_RR6(md->md_phys); + md->md_virt = pmap_mapdev(md->md_phys, + md->md_pages * EFI_PAGE_SIZE); } md = efi_md_next(md); } @@ -148,9 +189,38 @@ efi_reset_system(void) panic("%s: unable to reset the machine", __func__); } -efi_status +int efi_set_time(struct efi_tm *tm) { - return (efi_runtime->rt_settime(tm)); + return (efi_status_to_errno(efi_runtime->rt_settime(tm))); +} + +int +efi_var_get(efi_char *name, struct uuid *vendor, uint32_t *attrib, + size_t *datasize, void *data) +{ + efi_status status; + + status = efi_runtime->rt_getvar(name, vendor, attrib, datasize, data); + return (efi_status_to_errno(status)); +} + +int +efi_var_nextname(size_t *namesize, efi_char *name, struct uuid *vendor) +{ + efi_status status; + + status = efi_runtime->rt_scanvar(namesize, name, vendor); + return (efi_status_to_errno(status)); +} + +int +efi_var_set(efi_char *name, struct uuid *vendor, uint32_t attrib, + size_t datasize, void *data) +{ + efi_status status; + + status = efi_runtime->rt_setvar(name, vendor, attrib, datasize, data); + return (efi_status_to_errno(status)); } diff --git a/sys/ia64/ia64/elf_machdep.c b/sys/ia64/ia64/elf_machdep.c index 31765cc35001..836016563bc9 100644 --- a/sys/ia64/ia64/elf_machdep.c +++ b/sys/ia64/ia64/elf_machdep.c @@ -95,7 +95,7 @@ static Elf64_Brandinfo freebsd_brand_info = { .brand_note = &elf64_freebsd_brandnote, .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE }; -SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t)elf64_insert_brand_entry, &freebsd_brand_info); static Elf64_Brandinfo freebsd_brand_oinfo = { diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S index 1f076020f776..3a4ac0331bfb 100644 --- a/sys/ia64/ia64/exception.S +++ b/sys/ia64/ia64/exception.S @@ -28,11 +28,19 @@ #include __FBSDID("$FreeBSD$"); -#include +#include "opt_xtrace.h" #include #include +/* + * Nested TLB restart tokens. These are used by the + * nested TLB handler for jumping back to the code + * where the nested TLB was caused. + */ +#define NTLBRT_SAVE 0x12c12c +#define NTLBRT_RESTORE 0x12c12d + /* * ar.k7 = kernel memory stack * ar.k6 = kernel register stack @@ -81,10 +89,10 @@ xhead: data8 xtrace addl r29=1024*5*8,r0 ;; \ (p15) sub r27=r28,r29 ;; \ } ; \ -{ .mib ; \ +{ .mmi ; \ st8 [r28]=r27 ; \ - mov pr=r25,0x1ffff ; \ - nop 0 ;; \ + nop 0 ; \ + mov pr=r25,0x1ffff ;; \ } #else @@ -140,9 +148,10 @@ ENTRY_NOPROFILE(exception_save, 0) add r31=8,r30 ;; } -{ .mlx +{ .mmi mov r22=cr.iip - movl r26=exception_save_restart + nop 0 + addl r29=NTLBRT_SAVE,r0 // 22-bit restart token. ;; } @@ -157,7 +166,7 @@ ENTRY_NOPROFILE(exception_save, 0) * that are currently alive: * r16,r17=arguments * r18=pr, r19=length, r20=unat, r21=rsc, r22=iip, r23=TOS - * r26=restart point + * r29=restart point * r30,r31=trapframe pointers * p14,p15=memory stack switch */ @@ -219,7 +228,7 @@ exception_save_restart: (p13) dep r20=r20,r21,0,9 // align dirty registers ;; } - // r20=bspstore, r22=iip, r23=ipsr + // r19=rnat, r20=bspstore, r22=iip, r23=ipsr { .mmi st8 [r31]=r23,16 // psr (p13) mov ar.bspstore=r20 @@ -227,35 +236,34 @@ exception_save_restart: ;; } { .mmi +(p13) mov ar.rnat=r19 mov r18=ar.bsp - ;; - mov r19=cr.ifs - sub r18=r18,r20 + nop 0 ;; } { .mmi + mov r19=cr.ifs st8.spill [r30]=gp,16 // gp - st8 [r31]=r18,16 // ndirty - nop 0 + sub r18=r18,r20 ;; } // r19=ifs, r22=iip { .mmi + st8 [r31]=r18,16 // ndirty st8 [r30]=r19,16 // cfm - st8 [r31]=r22,16 // iip nop 0 ;; } { .mmi - st8 [r30]=r17 // ifa mov r18=cr.isr + st8 [r31]=r22,16 // iip add r29=16,r30 ;; } { .mmi - st8 [r31]=r18 // isr - add r30=8,r29 - add r31=16,r29 + st8 [r30]=r17,24 // ifa + st8 [r31]=r18,24 // isr + nop 0 ;; } { .mmi @@ -399,7 +407,7 @@ exception_save_restart: movl gp=__gp ;; } -{ .mfb +{ .mib srlz.d nop 0 br.sptk b7 @@ -544,7 +552,7 @@ ENTRY_NOPROFILE(exception_restore, 0) ld8 r21=[r31],24 // rnat mov ar.pfs=r28 ;; - ld8.fill r29=[r30],16 // tp + ld8.fill r26=[r30],16 // tp ld8 r22=[r31],16 // rsc ;; { .mmi @@ -555,21 +563,21 @@ ENTRY_NOPROFILE(exception_restore, 0) } { .mmi ld8.fill r1=[r30],16 // gp - ld8 r25=[r31],16 // ndirty + ld8 r27=[r31],16 // ndirty cmp.le p14,p15=5,r28 ;; } -{ .mmb - ld8 r26=[r30] // cfm +{ .mmi + ld8 r25=[r30] // cfm ld8 r19=[r31] // ip nop 0 ;; } -{ .mib +{ .mii // Switch register stack alloc r30=ar.pfs,0,0,0,0 // discard current frame - shl r31=r25,16 // value for ar.rsc - nop 0 + shl r31=r27,16 // value for ar.rsc +(p15) mov r13=r26 ;; } // The loadrs can fault if the backing store is not currently @@ -580,7 +588,7 @@ ENTRY_NOPROFILE(exception_restore, 0) { .mmi mov ar.rsc=r31 // setup for loadrs mov ar.k7=r16 -(p15) mov r13=r29 + addl r29=NTLBRT_RESTORE,r0 // 22-bit restart token ;; } exception_restore_restart: @@ -598,20 +606,20 @@ exception_restore_restart: dep r31=0,r31,0,13 // 8KB aligned ;; } -{ .mmb +{ .mmi mov ar.k6=r31 mov ar.rnat=r21 nop 0 ;; } -{ .mmb +{ .mmi mov ar.unat=r17 mov cr.iip=r19 nop 0 } { .mmi mov cr.ipsr=r24 - mov cr.ifs=r26 + mov cr.ifs=r25 mov pr=r18,0x1ffff ;; } @@ -648,7 +656,7 @@ END(exception_restore) add out1=16,sp ; \ br.call.sptk rp=_func_ ;; \ } ; \ -{ .mfb ; \ +{ .mib ; \ nop 0 ; \ nop 0 ; \ br.sptk exception_restore ;; \ @@ -944,7 +952,7 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400) } { .mii ld8 r27=[r27] // dir L0 page - extr.u r29=r30,2*PAGE_SHIFT-5, PAGE_SHIFT-3 // dir L1 index + extr.u r26=r30,2*PAGE_SHIFT-5, PAGE_SHIFT-3 // dir L1 index ;; dep r27=0,r27,61,3 ;; @@ -957,16 +965,16 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400) ;; } { .mmi - shladd r27=r29,3,r27 + shladd r27=r26,3,r27 ;; - mov r29=rr[r30] + mov r26=rr[r30] dep r27=0,r27,61,3 ;; } { .mii ld8 r27=[r27] // pte page shl r28=r28,5 - dep r29=0,r29,0,2 + dep r26=0,r26,0,2 ;; } { .mmi @@ -979,28 +987,54 @@ IVT_ENTRY(Data_Nested_TLB, 0x1400) { .mmi ld8 r28=[r27] // pte ;; - mov cr.itir=r29 + mov cr.itir=r26 or r28=PTE_DIRTY+PTE_ACCESSED,r28 ;; } -{ .mlx +{ .mmi st8 [r27]=r28 - movl r29=exception_save_restart ;; + addl r26=NTLBRT_SAVE,r0 + addl r27=NTLBRT_RESTORE,r0 } { .mmi itc.d r28 ;; ssm psr.dt - cmp.eq p12,p13=r26,r29 + cmp.eq p12,p0=r29,r26 ;; } -{ .mbb +{ .mib srlz.d + cmp.eq p13,p0=r29,r27 (p12) br.sptk exception_save_restart + ;; +} +{ .mib + nop 0 + nop 0 (p13) br.sptk exception_restore_restart ;; } +{ .mlx + mov r26=ar.bsp + movl r27=kstack + ;; +} +{ .mmi + mov r28=sp + nop 0 + addl r27=KSTACK_PAGES*PAGE_SIZE-16,r0 + ;; +} +{ .mmi + mov sp=r27 + ;; + mov r27=ar.bspstore + nop 0 + ;; +} + CALL(trap, 5, r30) IVT_END(Data_Nested_TLB) IVT_ENTRY(Instruction_Key_Miss, 0x1800) @@ -1253,13 +1287,13 @@ IVT_ENTRY(Break_Instruction, 0x2c00) (p11) srlz.d add out1=16,sp } -{ .mfb +{ .mib nop 0 nop 0 br.call.sptk rp=trap ;; } -{ .mfb +{ .mib nop 0 nop 0 br.sptk exception_restore @@ -1274,19 +1308,19 @@ IVT_ENTRY(External_Interrupt, 0x3000) br.sptk exception_save ;; } -{ .mfb +{ .mmi alloc r15=ar.pfs,0,0,1,0 nop 0 nop 0 ;; } -{ .mfb +{ .mib add out0=16,sp nop 0 br.call.sptk rp=interrupt ;; } -{ .mfb +{ .mib nop 0 nop 0 br.sptk exception_restore diff --git a/sys/ia64/ia64/genassym.c b/sys/ia64/ia64/genassym.c index 4a192fd79e39..9f7625279d9c 100644 --- a/sys/ia64/ia64/genassym.c +++ b/sys/ia64/ia64/genassym.c @@ -91,7 +91,7 @@ ASSYM(MC_SPECIAL_RNAT, offsetof(mcontext_t, mc_special.rnat)); ASSYM(PAGE_SHIFT, PAGE_SHIFT); ASSYM(PAGE_SIZE, PAGE_SIZE); -ASSYM(PC_CURRENT_PMAP, offsetof(struct pcpu, pc_current_pmap)); +ASSYM(PC_CURRENT_PMAP, offsetof(struct pcpu, pc_md.current_pmap)); ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread)); ASSYM(PC_IDLETHREAD, offsetof(struct pcpu, pc_idlethread)); diff --git a/sys/ia64/ia64/highfp.c b/sys/ia64/ia64/highfp.c new file mode 100644 index 000000000000..145ee488ba66 --- /dev/null +++ b/sys/ia64/ia64/highfp.c @@ -0,0 +1,181 @@ +/*- + * Copyright (c) 2009 Marcel Moolenaar + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +static struct mtx ia64_highfp_mtx; + +static void +ia64_highfp_init(void *_) +{ + mtx_init(&ia64_highfp_mtx, "High FP lock", NULL, MTX_SPIN); +} +SYSINIT(ia64_highfp_init, SI_SUB_LOCK, SI_ORDER_ANY, ia64_highfp_init, NULL); + +#ifdef SMP +static int +ia64_highfp_ipi(struct pcpu *cpu) +{ + int error; + + ipi_send(cpu, IPI_HIGH_FP); + error = msleep_spin(&cpu->pc_fpcurthread, &ia64_highfp_mtx, + "High FP", 0); + return (error); +} +#endif + +int +ia64_highfp_drop(struct thread *td) +{ + struct pcb *pcb; + struct pcpu *cpu; + + pcb = td->td_pcb; + + mtx_lock_spin(&ia64_highfp_mtx); + cpu = pcb->pcb_fpcpu; + if (cpu != NULL) { + KASSERT(cpu->pc_fpcurthread == td, + ("cpu->pc_fpcurthread != td")); + td->td_frame->tf_special.psr |= IA64_PSR_DFH; + pcb->pcb_fpcpu = NULL; + cpu->pc_fpcurthread = NULL; + } + mtx_unlock_spin(&ia64_highfp_mtx); + + return ((cpu != NULL) ? 1 : 0); +} + +int +ia64_highfp_enable(struct thread *td, struct trapframe *tf) +{ + struct pcb *pcb; + struct pcpu *cpu; + struct thread *td1; + + pcb = td->td_pcb; + + mtx_lock_spin(&ia64_highfp_mtx); + KASSERT((tf->tf_special.psr & IA64_PSR_DFH) != 0, + ("(tf->tf_special.psr & IA64_PSR_DFH) == 0")); + cpu = pcb->pcb_fpcpu; +#ifdef SMP + if (cpu != NULL && cpu != pcpup) { + KASSERT(cpu->pc_fpcurthread == td, + ("cpu->pc_fpcurthread != td")); + ia64_highfp_ipi(cpu); + } +#endif + td1 = PCPU_GET(fpcurthread); + if (td1 != NULL && td1 != td) { + KASSERT(td1->td_pcb->pcb_fpcpu == pcpup, + ("td1->td_pcb->pcb_fpcpu != pcpup")); + save_high_fp(&td1->td_pcb->pcb_high_fp); + td1->td_frame->tf_special.psr |= IA64_PSR_DFH; + td1->td_pcb->pcb_fpcpu = NULL; + PCPU_SET(fpcurthread, NULL); + td1 = NULL; + } + if (td1 == NULL) { + KASSERT(pcb->pcb_fpcpu == NULL, ("pcb->pcb_fpcpu != NULL")); + KASSERT(PCPU_GET(fpcurthread) == NULL, + ("PCPU_GET(fpcurthread) != NULL")); + restore_high_fp(&pcb->pcb_high_fp); + PCPU_SET(fpcurthread, td); + pcb->pcb_fpcpu = pcpup; + tf->tf_special.psr &= ~IA64_PSR_MFH; + } + tf->tf_special.psr &= ~IA64_PSR_DFH; + mtx_unlock_spin(&ia64_highfp_mtx); + + return ((td1 != NULL) ? 1 : 0); +} + +int +ia64_highfp_save(struct thread *td) +{ + struct pcb *pcb; + struct pcpu *cpu; + + pcb = td->td_pcb; + + mtx_lock_spin(&ia64_highfp_mtx); + cpu = pcb->pcb_fpcpu; +#ifdef SMP + if (cpu != NULL && cpu != pcpup) { + KASSERT(cpu->pc_fpcurthread == td, + ("cpu->pc_fpcurthread != td")); + ia64_highfp_ipi(cpu); + } else +#endif + if (cpu != NULL) { + KASSERT(cpu->pc_fpcurthread == td, + ("cpu->pc_fpcurthread != td")); + save_high_fp(&pcb->pcb_high_fp); + td->td_frame->tf_special.psr |= IA64_PSR_DFH; + pcb->pcb_fpcpu = NULL; + cpu->pc_fpcurthread = NULL; + } + mtx_unlock_spin(&ia64_highfp_mtx); + + return ((cpu != NULL) ? 1 : 0); +} + +#ifdef SMP +int +ia64_highfp_save_ipi(void) +{ + struct thread *td; + + mtx_lock_spin(&ia64_highfp_mtx); + td = PCPU_GET(fpcurthread); + if (td != NULL) { + KASSERT(td->td_pcb->pcb_fpcpu == pcpup, + ("td->td_pcb->pcb_fpcpu != pcpup")); + save_high_fp(&td->td_pcb->pcb_high_fp); + td->td_frame->tf_special.psr |= IA64_PSR_DFH; + td->td_pcb->pcb_fpcpu = NULL; + PCPU_SET(fpcurthread, NULL); + } + mtx_unlock_spin(&ia64_highfp_mtx); + wakeup(&PCPU_GET(fpcurthread)); + + return ((td != NULL) ? 1 : 0); +} +#endif diff --git a/sys/ia64/ia64/interrupt.c b/sys/ia64/ia64/interrupt.c index b70a807591a2..a9bee2798df0 100644 --- a/sys/ia64/ia64/interrupt.c +++ b/sys/ia64/ia64/interrupt.c @@ -60,7 +60,6 @@ #include #include #include -#include #include #ifdef EVCNT_COUNTERS @@ -74,38 +73,6 @@ struct evcnt clock_intr_evcnt; /* event counter for clock intrs. */ #include #endif -static void ia64_dispatch_intr(void *, u_int); - -static void -dummy_perf(unsigned long vector, struct trapframe *tf) -{ - printf("performance interrupt!\n"); -} - -void (*perf_irq)(unsigned long, struct trapframe *) = dummy_perf; - -static unsigned int ints[MAXCPU]; -SYSCTL_OPAQUE(_debug, OID_AUTO, ints, CTLFLAG_RW, &ints, sizeof(ints), "IU", - ""); - -static unsigned int clks[MAXCPU]; -#ifdef SMP -SYSCTL_OPAQUE(_debug, OID_AUTO, clks, CTLFLAG_RW, &clks, sizeof(clks), "IU", - ""); -#else -SYSCTL_INT(_debug, OID_AUTO, clks, CTLFLAG_RW, clks, 0, ""); -#endif - -#ifdef SMP -static unsigned int asts[MAXCPU]; -SYSCTL_OPAQUE(_debug, OID_AUTO, asts, CTLFLAG_RW, &asts, sizeof(asts), "IU", - ""); - -static unsigned int rdvs[MAXCPU]; -SYSCTL_OPAQUE(_debug, OID_AUTO, rdvs, CTLFLAG_RW, &rdvs, sizeof(rdvs), "IU", - ""); -#endif - SYSCTL_NODE(_debug, OID_AUTO, clock, CTLFLAG_RW, 0, "clock statistics"); static int adjust_edges = 0; @@ -124,11 +91,23 @@ static int adjust_ticks = 0; SYSCTL_INT(_debug_clock, OID_AUTO, adjust_ticks, CTLFLAG_RD, &adjust_ticks, 0, "Total number of ITC interrupts with adjustment"); + +struct ia64_intr { + struct intr_event *event; /* interrupt event */ + volatile long *cntp; /* interrupt counter */ + struct sapic *sapic; + u_int irq; +}; + +static struct ia64_intr *ia64_intrs[256]; + + +static void ia64_dispatch_intr(void *, u_int); + void interrupt(struct trapframe *tf) { struct thread *td; - volatile struct ia64_interrupt_block *ib = IA64_INTERRUPT_BLOCK; uint64_t adj, clk, itc; int64_t delta; u_int vector; @@ -139,43 +118,45 @@ interrupt(struct trapframe *tf) td = curthread; + PCPU_INC(cnt.v_intr); + vector = tf->tf_special.ifa; next: /* * Handle ExtINT interrupts by generating an INTA cycle to * read the vector. - * IPI_STOP_HARD is mapped to IPI_STOP so it is not necessary - * to add it to this switch-like construct. */ if (vector == 0) { - inta = ib->ib_inta; - printf("ExtINT interrupt: vector=%u\n", (int)inta); + PCPU_INC(md.stats.pcs_nextints); + inta = ia64_ld1(&ia64_pib->ib_inta); if (inta == 15) { + PCPU_INC(md.stats.pcs_nstrays); __asm __volatile("mov cr.eoi = r0;; srlz.d"); goto stray; } vector = (int)inta; - } else if (vector == 15) + } else if (vector == 15) { + PCPU_INC(md.stats.pcs_nstrays); goto stray; + } if (vector == CLOCK_VECTOR) {/* clock interrupt */ /* CTR0(KTR_INTR, "clock interrupt"); */ itc = ia64_get_itc(); - PCPU_INC(cnt.v_intr); + PCPU_INC(md.stats.pcs_nclks); #ifdef EVCNT_COUNTERS clock_intr_evcnt.ev_count++; #else intrcnt[INTRCNT_CLOCK]++; #endif - clks[PCPU_GET(cpuid)]++; critical_enter(); - adj = PCPU_GET(clockadj); - clk = PCPU_GET(clock); + adj = PCPU_GET(md.clockadj); + clk = PCPU_GET(md.clock); delta = itc - clk; count = 0; while (delta >= ia64_clock_reload) { @@ -206,40 +187,40 @@ interrupt(struct trapframe *tf) adj = 0; adjust_excess++; } - PCPU_SET(clock, clk); - PCPU_SET(clockadj, adj); + PCPU_SET(md.clock, clk); + PCPU_SET(md.clockadj, adj); critical_exit(); ia64_srlz_d(); #ifdef SMP } else if (vector == ipi_vector[IPI_AST]) { - asts[PCPU_GET(cpuid)]++; + PCPU_INC(md.stats.pcs_nasts); CTR1(KTR_SMP, "IPI_AST, cpuid=%d", PCPU_GET(cpuid)); } else if (vector == ipi_vector[IPI_HIGH_FP]) { - struct thread *thr = PCPU_GET(fpcurthread); - if (thr != NULL) { - mtx_lock_spin(&thr->td_md.md_highfp_mtx); - save_high_fp(&thr->td_pcb->pcb_high_fp); - thr->td_pcb->pcb_fpcpu = NULL; - PCPU_SET(fpcurthread, NULL); - mtx_unlock_spin(&thr->td_md.md_highfp_mtx); - } + PCPU_INC(md.stats.pcs_nhighfps); + ia64_highfp_save_ipi(); } else if (vector == ipi_vector[IPI_RENDEZVOUS]) { - rdvs[PCPU_GET(cpuid)]++; + PCPU_INC(md.stats.pcs_nrdvs); CTR1(KTR_SMP, "IPI_RENDEZVOUS, cpuid=%d", PCPU_GET(cpuid)); enable_intr(); smp_rendezvous_action(); disable_intr(); } else if (vector == ipi_vector[IPI_STOP]) { + PCPU_INC(md.stats.pcs_nstops); cpumask_t mybit = PCPU_GET(cpumask); - savectx(PCPU_PTR(pcb)); + /* Make sure IPI_STOP_HARD is mapped to IPI_STOP. */ + KASSERT(IPI_STOP == IPI_STOP_HARD, + ("%s: IPI_STOP_HARD not handled.", __func__)); + + savectx(PCPU_PTR(md.pcb)); atomic_set_int(&stopped_cpus, mybit); while ((started_cpus & mybit) == 0) cpu_spinwait(); atomic_clear_int(&started_cpus, mybit); atomic_clear_int(&stopped_cpus, mybit); } else if (vector == ipi_vector[IPI_PREEMPT]) { + PCPU_INC(md.stats.pcs_npreempts); CTR1(KTR_SMP, "IPI_PREEMPT, cpuid=%d", PCPU_GET(cpuid)); __asm __volatile("mov cr.eoi = r0;; srlz.d"); enable_intr(); @@ -248,7 +229,7 @@ interrupt(struct trapframe *tf) goto stray; #endif } else { - ints[PCPU_GET(cpuid)]++; + PCPU_INC(md.stats.pcs_nhwints); atomic_add_int(&td->td_intr_nesting_level, 1); ia64_dispatch_intr(tf, vector); atomic_subtract_int(&td->td_intr_nesting_level, 1); @@ -268,19 +249,6 @@ stray: } } -/* - * Hardware irqs have vectors starting at this offset. - */ -#define IA64_HARDWARE_IRQ_BASE 0x20 - -struct ia64_intr { - struct intr_event *event; /* interrupt event */ - volatile long *cntp; /* interrupt counter */ - struct sapic *sapic; - u_int irq; -}; - -static struct ia64_intr *ia64_intrs[256]; static void ia64_intr_eoi(void *arg) @@ -324,57 +292,75 @@ ia64_setup_intr(const char *name, int irq, driver_filter_t filter, struct ia64_intr *i; struct sapic *sa; char *intrname; - u_int vector; + u_int prio, vector; int error; - /* Get the I/O SAPIC that corresponds to the IRQ. */ - sa = sapic_lookup(irq); - if (sa == NULL) + prio = intr_priority(flags); + if (prio > PRI_MAX_ITHD) return (EINVAL); - /* - * XXX - There's a priority implied by the choice of vector. - * We should therefore relate the vector to the interrupt type. - */ - vector = irq + IA64_HARDWARE_IRQ_BASE; + /* XXX lock */ - i = ia64_intrs[vector]; - if (i == NULL) { - i = malloc(sizeof(struct ia64_intr), M_DEVBUF, M_NOWAIT); - if (i == NULL) - return (ENOMEM); + /* Get the I/O SAPIC and vector that corresponds to the IRQ. */ + sa = sapic_lookup(irq, &vector); + if (sa == NULL) { + /* XXX unlock */ + return (EINVAL); + } + + if (vector == 0) { + /* XXX unlock */ + i = malloc(sizeof(struct ia64_intr), M_DEVBUF, + M_ZERO | M_WAITOK); + /* XXX lock */ + sa = sapic_lookup(irq, &vector); + KASSERT(sa != NULL, ("sapic_lookup")); + if (vector != 0) + free(i, M_DEVBUF); + } + + /* + * If the IRQ has no vector assigned to it yet, assign one based + * on the priority. + */ + if (vector == 0) { + vector = (256 - 64) - (prio << 1); + while (vector < 256 && ia64_intrs[vector] != NULL) + vector++; error = intr_event_create(&i->event, (void *)(uintptr_t)vector, 0, irq, ia64_intr_mask, ia64_intr_unmask, ia64_intr_eoi, NULL, "irq%u:", irq); if (error) { + /* XXX unlock */ free(i, M_DEVBUF); return (error); } - if (!atomic_cmpset_ptr(&ia64_intrs[vector], NULL, i)) { - intr_event_destroy(i->event); - free(i, M_DEVBUF); - i = ia64_intrs[vector]; - } else { - i->sapic = sa; - i->irq = irq; + i->sapic = sa; + i->irq = irq; + i->cntp = intrcnt + irq + INTRCNT_ISA_IRQ; + ia64_intrs[vector] = i; + sapic_enable(sa, irq, vector); - i->cntp = intrcnt + irq + INTRCNT_ISA_IRQ; - if (name != NULL && *name != '\0') { - /* XXX needs abstraction. Too error prone. */ - intrname = intrnames + - (irq + INTRCNT_ISA_IRQ) * INTRNAME_LEN; - memset(intrname, ' ', INTRNAME_LEN - 1); - bcopy(name, intrname, strlen(name)); - } + /* XXX unlock */ - sapic_enable(i->sapic, irq, vector); + if (name != NULL && *name != '\0') { + /* XXX needs abstraction. Too error prone. */ + intrname = intrnames + + (irq + INTRCNT_ISA_IRQ) * INTRNAME_LEN; + memset(intrname, ' ', INTRNAME_LEN - 1); + bcopy(name, intrname, strlen(name)); } + } else { + i = ia64_intrs[vector]; + /* XXX unlock */ } + KASSERT(i != NULL, ("vector mapping bug")); + error = intr_event_add_handler(i->event, name, filter, handler, arg, - intr_priority(flags), flags, cookiep); + prio, flags, cookiep); return (error); } diff --git a/sys/ia64/ia64/iodev_machdep.c b/sys/ia64/ia64/iodev_machdep.c new file mode 100644 index 000000000000..d255aae127ba --- /dev/null +++ b/sys/ia64/ia64/iodev_machdep.c @@ -0,0 +1,300 @@ +/*- + * Copyright (c) 2010 Marcel Moolenaar + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +static int iodev_pio_read(struct iodev_pio_req *req); +static int iodev_pio_write(struct iodev_pio_req *req); + +static int iodev_efivar_getvar(struct iodev_efivar_req *req); +static int iodev_efivar_nextname(struct iodev_efivar_req *req); +static int iodev_efivar_setvar(struct iodev_efivar_req *req); + +/* ARGSUSED */ +int +ioopen(struct cdev *dev __unused, int flags __unused, int fmt __unused, + struct thread *td) +{ + int error; + + error = priv_check(td, PRIV_IO); + if (error == 0) + error = securelevel_gt(td->td_ucred, 0); + + return (error); +} + +/* ARGSUSED */ +int +ioclose(struct cdev *dev __unused, int flags __unused, int fmt __unused, + struct thread *td __unused) +{ + + return (0); +} + +/* ARGSUSED */ +int +ioioctl(struct cdev *dev __unused, u_long cmd, caddr_t data, + int fflag __unused, struct thread *td __unused) +{ + struct iodev_efivar_req *efivar_req; + struct iodev_pio_req *pio_req; + int error; + + error = ENOIOCTL; + switch (cmd) { + case IODEV_PIO: + pio_req = (struct iodev_pio_req *)data; + switch (pio_req->access) { + case IODEV_PIO_READ: + error = iodev_pio_read(pio_req); + break; + case IODEV_PIO_WRITE: + error = iodev_pio_write(pio_req); + break; + default: + error = EINVAL; + break; + } + break; + case IODEV_EFIVAR: + efivar_req = (struct iodev_efivar_req *)data; + efivar_req->result = 0; /* So it's well-defined */ + switch (efivar_req->access) { + case IODEV_EFIVAR_GETVAR: + error = iodev_efivar_getvar(efivar_req); + break; + case IODEV_EFIVAR_NEXTNAME: + error = iodev_efivar_nextname(efivar_req); + break; + case IODEV_EFIVAR_SETVAR: + error = iodev_efivar_setvar(efivar_req); + break; + default: + error = EINVAL; + break; + } + break; + } + + return (error); +} + +static int +iodev_pio_read(struct iodev_pio_req *req) +{ + + switch (req->width) { + case 1: + req->val = bus_space_read_io_1(req->port); + break; + case 2: + if (req->port & 1) { + req->val = bus_space_read_io_1(req->port); + req->val |= bus_space_read_io_1(req->port + 1) << 8; + } else + req->val = bus_space_read_io_2(req->port); + break; + case 4: + if (req->port & 1) { + req->val = bus_space_read_io_1(req->port); + req->val |= bus_space_read_io_2(req->port + 1) << 8; + req->val |= bus_space_read_io_1(req->port + 3) << 24; + } else if (req->port & 2) { + req->val = bus_space_read_io_2(req->port); + req->val |= bus_space_read_io_2(req->port + 2) << 16; + } else + req->val = bus_space_read_io_4(req->port); + break; + default: + return (EINVAL); + } + + return (0); +} + +static int +iodev_pio_write(struct iodev_pio_req *req) +{ + + switch (req->width) { + case 1: + bus_space_write_io_1(req->port, req->val); + break; + case 2: + if (req->port & 1) { + bus_space_write_io_1(req->port, req->val); + bus_space_write_io_1(req->port + 1, req->val >> 8); + } else + bus_space_write_io_2(req->port, req->val); + break; + case 4: + if (req->port & 1) { + bus_space_write_io_1(req->port, req->val); + bus_space_write_io_2(req->port + 1, req->val >> 8); + bus_space_write_io_1(req->port + 3, req->val >> 24); + } else if (req->port & 2) { + bus_space_write_io_2(req->port, req->val); + bus_space_write_io_2(req->port + 2, req->val >> 16); + } else + bus_space_write_io_4(req->port, req->val); + break; + default: + return (EINVAL); + } + + return (0); +} + +static int +iodev_efivar_getvar(struct iodev_efivar_req *req) +{ + void *data; + efi_char *name; + int error; + + if ((req->namesize & 1) != 0 || req->namesize < 4) + return (EINVAL); + if (req->datasize == 0) + return (EINVAL); + + /* + * Pre-zero the allocated memory and don't copy the last 2 bytes + * of the name. That should be the closing nul character (ucs-2) + * and if not, then we ensured a nul-terminating string. This is + * to protect the firmware and thus ourselves. + */ + name = malloc(req->namesize, M_TEMP, M_WAITOK | M_ZERO); + error = copyin(req->name, name, req->namesize - 2); + if (error) { + free(name, M_TEMP); + return (error); + } + + data = malloc(req->datasize, M_TEMP, M_WAITOK); + error = efi_var_get(name, &req->vendor, &req->attrib, &req->datasize, + data); + if (error == EOVERFLOW || error == ENOENT) { + req->result = error; + error = 0; + } + if (!error && !req->result) + error = copyout(data, req->data, req->datasize); + + free(data, M_TEMP); + free(name, M_TEMP); + return (error); +} + +static int +iodev_efivar_nextname(struct iodev_efivar_req *req) +{ + efi_char *name; + int error; + + /* Enforce a reasonable minimum size of the name buffer. */ + if (req->namesize < 4) + return (EINVAL); + + name = malloc(req->namesize, M_TEMP, M_WAITOK); + error = copyin(req->name, name, req->namesize); + if (error) { + free(name, M_TEMP); + return (error); + } + + error = efi_var_nextname(&req->namesize, name, &req->vendor); + if (error == EOVERFLOW || error == ENOENT) { + req->result = error; + error = 0; + } + if (!error && !req->result) + error = copyout(name, req->name, req->namesize); + + free(name, M_TEMP); + return (error); +} + +static int +iodev_efivar_setvar(struct iodev_efivar_req *req) +{ + void *data; + efi_char *name; + int error; + + if ((req->namesize & 1) != 0 || req->namesize < 4) + return (EINVAL); + + /* + * Pre-zero the allocated memory and don't copy the last 2 bytes + * of the name. That should be the closing nul character (ucs-2) + * and if not, then we ensured a nul-terminating string. This is + * to protect the firmware and thus ourselves. + */ + name = malloc(req->namesize, M_TEMP, M_WAITOK | M_ZERO); + error = copyin(req->name, name, req->namesize - 2); + if (error) { + free(name, M_TEMP); + return (error); + } + + if (req->datasize) { + data = malloc(req->datasize, M_TEMP, M_WAITOK); + error = copyin(req->data, data, req->datasize); + if (error) { + free(data, M_TEMP); + free(name, M_TEMP); + return (error); + } + } else + data = NULL; + + error = efi_var_set(name, &req->vendor, req->attrib, req->datasize, + data); + if (error == EAGAIN || error == ENOENT) { + req->result = error; + error = 0; + } + + free(data, M_TEMP); + free(name, M_TEMP); + return (error); +} diff --git a/sys/ia64/ia64/locore.S b/sys/ia64/ia64/locore.S index 6b1d8f153998..afba834823b0 100644 --- a/sys/ia64/ia64/locore.S +++ b/sys/ia64/ia64/locore.S @@ -98,13 +98,13 @@ ENTRY_NOPROFILE(__start, 1) mov out0=r0 // we are linked at the right address ;; // we just need to process fptrs } -{ .bbb +{ .mib nop 0 nop 0 br.call.sptk.many rp=_reloc ;; } -{ .bbb +{ .mib nop 0 nop 0 br.call.sptk.many rp=ia64_init @@ -112,21 +112,21 @@ ENTRY_NOPROFILE(__start, 1) } // We have the new bspstore in r8 and the new sp in r9. // Switch onto the new stack and call mi_startup(). -{ +{ .mmi mov ar.rsc = 0 ;; mov ar.bspstore = r8 mov sp = r9 ;; } -{ +{ .mmi loadrs ;; mov ar.rsc = 3 nop 0 ;; } -{ +{ .mib nop 0 nop 0 br.call.sptk.many rp=mi_startup @@ -163,7 +163,7 @@ ENTRY(fork_trampoline, 0) ld8 out1=[r16] nop 0 } -{ .mfb +{ .mib add out2=16,sp nop 0 br.call.sptk rp=fork_exit @@ -174,7 +174,7 @@ ENTRY(fork_trampoline, 0) .global enter_userland .type enter_userland, @function enter_userland: -{ .mfb +{ .mib nop 0 nop 0 br.sptk epc_syscall_return @@ -282,7 +282,7 @@ ENTRY_NOPROFILE(os_boot_rendez,0) add sp = r18, r16 ;; } -{ .mfb +{ .mib mov ar.rsc = 3 nop 0 br.call.sptk.few rp = ia64_ap_startup @@ -290,7 +290,7 @@ ENTRY_NOPROFILE(os_boot_rendez,0) } /* NOT REACHED */ 9: -{ .mfb +{ .mib nop 0 nop 0 br.sptk 9b diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c index 67ca3c28c497..cddf6c0b8f96 100644 --- a/sys/ia64/ia64/machdep.c +++ b/sys/ia64/ia64/machdep.c @@ -85,6 +85,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -101,9 +102,21 @@ __FBSDID("$FreeBSD$"); #include -u_int64_t processor_frequency; -u_int64_t bus_frequency; -u_int64_t itc_frequency; +SYSCTL_NODE(_hw, OID_AUTO, freq, CTLFLAG_RD, 0, ""); +SYSCTL_NODE(_machdep, OID_AUTO, cpu, CTLFLAG_RD, 0, ""); + +static u_int bus_freq; +SYSCTL_UINT(_hw_freq, OID_AUTO, bus, CTLFLAG_RD, &bus_freq, 0, + "Bus clock frequency"); + +static u_int cpu_freq; +SYSCTL_UINT(_hw_freq, OID_AUTO, cpu, CTLFLAG_RD, &cpu_freq, 0, + "CPU clock frequency"); + +static u_int itc_freq; +SYSCTL_UINT(_hw_freq, OID_AUTO, itc, CTLFLAG_RD, &itc_freq, 0, + "ITC frequency"); + int cold = 1; u_int64_t pa_bootinfo; @@ -122,6 +135,10 @@ struct fpswa_iface *fpswa_iface; u_int64_t ia64_pal_base; u_int64_t ia64_port_base; +u_int64_t ia64_lapic_addr = PAL_PIB_DEFAULT_ADDR; + +struct ia64_pib *ia64_pib; + static int ia64_sync_icache_needed; char machine[] = MACHINE; @@ -139,8 +156,6 @@ SYSCTL_STRING(_hw, OID_AUTO, family, CTLFLAG_RD, cpu_family, 0, extern vm_offset_t ksym_start, ksym_end; #endif -static void cpu_startup(void *); -SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); struct msgbuf *msgbufp = NULL; @@ -203,9 +218,7 @@ identifycpu(void) * (i.e. the clock frequency) to identify those. * Allow for roughly 1% error margin. */ - tmp = processor_frequency >> 7; - if ((processor_frequency - tmp) < 1*Ghz && - (processor_frequency + tmp) >= 1*Ghz) + if (cpu_freq > 990 && cpu_freq < 1010) model_name = "Deerfield"; else model_name = "Madison"; @@ -232,11 +245,8 @@ identifycpu(void) features = ia64_get_cpuid(4); printf("CPU: %s (", model_name); - if (processor_frequency) { - printf("%ld.%02ld-Mhz ", - (processor_frequency + 4999) / Mhz, - ((processor_frequency + 4999) / (Mhz/100)) % 100); - } + if (cpu_freq) + printf("%u Mhz ", cpu_freq); printf("%s)\n", family_name); printf(" Origin = \"%s\" Revision = %d\n", vendor, revision); printf(" Features = 0x%b\n", (u_int32_t) features, @@ -247,9 +257,11 @@ identifycpu(void) } static void -cpu_startup(dummy) - void *dummy; +cpu_startup(void *dummy) { + char nodename[16]; + struct pcpu *pc; + struct pcpu_stats *pcs; /* * Good {morning,afternoon,evening,night}. @@ -301,15 +313,71 @@ cpu_startup(dummy) * information. */ ia64_probe_sapics(); + ia64_pib = pmap_mapdev(ia64_lapic_addr, sizeof(*ia64_pib)); + ia64_mca_init(); -} -void -cpu_boot(int howto) -{ + /* + * Create sysctl tree for per-CPU information. + */ + SLIST_FOREACH(pc, &cpuhead, pc_allcpu) { + snprintf(nodename, sizeof(nodename), "%u", pc->pc_cpuid); + sysctl_ctx_init(&pc->pc_md.sysctl_ctx); + pc->pc_md.sysctl_tree = SYSCTL_ADD_NODE(&pc->pc_md.sysctl_ctx, + SYSCTL_STATIC_CHILDREN(_machdep_cpu), OID_AUTO, nodename, + CTLFLAG_RD, NULL, ""); + if (pc->pc_md.sysctl_tree == NULL) + continue; - efi_reset_system(); + pcs = &pc->pc_md.stats; + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nasts", CTLFLAG_RD, &pcs->pcs_nasts, + "Number of IPI_AST interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nclks", CTLFLAG_RD, &pcs->pcs_nclks, + "Number of clock interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nextints", CTLFLAG_RD, &pcs->pcs_nextints, + "Number of ExtINT interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nhighfps", CTLFLAG_RD, &pcs->pcs_nhighfps, + "Number of IPI_HIGH_FP interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nhwints", CTLFLAG_RD, &pcs->pcs_nhwints, + "Number of hardware (device) interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "npreempts", CTLFLAG_RD, &pcs->pcs_npreempts, + "Number of IPI_PREEMPT interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nrdvs", CTLFLAG_RD, &pcs->pcs_nrdvs, + "Number of IPI_RENDEZVOUS interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nstops", CTLFLAG_RD, &pcs->pcs_nstops, + "Number of IPI_STOP interrupts"); + + SYSCTL_ADD_ULONG(&pc->pc_md.sysctl_ctx, + SYSCTL_CHILDREN(pc->pc_md.sysctl_tree), OID_AUTO, + "nstrays", CTLFLAG_RD, &pcs->pcs_nstrays, + "Number of stray vectors"); + } } +SYSINIT(cpu_startup, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); void cpu_flush_dcache(void *ptr, size_t len) @@ -333,7 +401,7 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate) if (pcpu_find(cpu_id) == NULL || rate == NULL) return (EINVAL); - *rate = processor_frequency; + *rate = (u_long)cpu_freq * 1000000ul; return (0); } @@ -366,7 +434,7 @@ void cpu_reset() { - cpu_boot(0); + efi_reset_system(); } void @@ -381,7 +449,7 @@ cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx) if (PCPU_GET(fpcurthread) == old) old->td_frame->tf_special.psr |= IA64_PSR_DFH; if (!savectx(oldpcb)) { - old->td_lock = mtx; + atomic_store_rel_ptr(&old->td_lock, mtx); #if defined(SCHED_ULE) && defined(SMP) /* td_lock is volatile */ while (new->td_lock == &blocked_lock) @@ -537,6 +605,15 @@ map_gateway_page(void) ia64_set_k5(VM_MAX_ADDRESS); } +static u_int +freq_ratio(u_long base, u_long ratio) +{ + u_long f; + + f = (base * (ratio >> 32)) / (ratio & 0xfffffffful); + return ((f + 500000) / 1000000); +} + static void calculate_frequencies(void) { @@ -559,15 +636,9 @@ calculate_frequencies(void) pal.pal_result[2] >> 32, pal.pal_result[2] & ((1L << 32) - 1)); } - processor_frequency = - sal.sal_result[0] * (pal.pal_result[0] >> 32) - / (pal.pal_result[0] & ((1L << 32) - 1)); - bus_frequency = - sal.sal_result[0] * (pal.pal_result[1] >> 32) - / (pal.pal_result[1] & ((1L << 32) - 1)); - itc_frequency = - sal.sal_result[0] * (pal.pal_result[2] >> 32) - / (pal.pal_result[2] & ((1L << 32) - 1)); + cpu_freq = freq_ratio(sal.sal_result[0], pal.pal_result[0]); + bus_freq = freq_ratio(sal.sal_result[0], pal.pal_result[1]); + itc_freq = freq_ratio(sal.sal_result[0], pal.pal_result[2]); } } @@ -613,7 +684,8 @@ ia64_init(void) for (md = efi_md_first(); md != NULL; md = efi_md_next(md)) { switch (md->md_type) { case EFI_MD_TYPE_IOPORT: - ia64_port_base = IA64_PHYS_TO_RR6(md->md_phys); + ia64_port_base = (uintptr_t)pmap_mapdev(md->md_phys, + md->md_pages * EFI_PAGE_SIZE); break; case EFI_MD_TYPE_PALCODE: ia64_pal_base = md->md_phys; @@ -859,16 +931,6 @@ ia64_init(void) return (ret); } -__volatile void * -ia64_ioport_address(u_int port) -{ - uint64_t addr; - - addr = (port > 0xffff) ? IA64_PHYS_TO_RR6((uint64_t)port) : - ia64_port_base | ((port & 0xfffc) << 10) | (port & 0xFFF); - return ((__volatile void *)addr); -} - uint64_t ia64_get_hcdp(void) { @@ -908,6 +970,13 @@ bzero(void *buf, size_t len) } } +u_int +ia64_itc_freq(void) +{ + + return (itc_freq); +} + void DELAY(int n) { @@ -916,7 +985,7 @@ DELAY(int n) sched_pin(); start = ia64_get_itc(); - end = start + (itc_frequency * n) / 1000000; + end = start + itc_freq * n; /* printf("DELAY from 0x%lx to 0x%lx\n", start, end); */ do { now = ia64_get_itc(); @@ -1056,11 +1125,9 @@ sigreturn(struct thread *td, { ucontext_t uc; struct trapframe *tf; - struct proc *p; struct pcb *pcb; tf = td->td_frame; - p = td->td_proc; pcb = td->td_pcb; /* @@ -1072,17 +1139,13 @@ sigreturn(struct thread *td, set_mcontext(td, &uc.uc_mcontext); - PROC_LOCK(p); #if defined(COMPAT_43) if (sigonstack(tf->tf_special.sp)) td->td_sigstk.ss_flags |= SS_ONSTACK; else td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif - td->td_sigmask = uc.uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0); return (EJUSTRETURN); } @@ -1467,81 +1530,6 @@ set_fpregs(struct thread *td, struct fpreg *fpregs) return (0); } -/* - * High FP register functions. - */ - -int -ia64_highfp_drop(struct thread *td) -{ - struct pcb *pcb; - struct pcpu *cpu; - struct thread *thr; - - mtx_lock_spin(&td->td_md.md_highfp_mtx); - pcb = td->td_pcb; - cpu = pcb->pcb_fpcpu; - if (cpu == NULL) { - mtx_unlock_spin(&td->td_md.md_highfp_mtx); - return (0); - } - pcb->pcb_fpcpu = NULL; - thr = cpu->pc_fpcurthread; - cpu->pc_fpcurthread = NULL; - mtx_unlock_spin(&td->td_md.md_highfp_mtx); - - /* Post-mortem sanity checking. */ - KASSERT(thr == td, ("Inconsistent high FP state")); - return (1); -} - -int -ia64_highfp_save(struct thread *td) -{ - struct pcb *pcb; - struct pcpu *cpu; - struct thread *thr; - - /* Don't save if the high FP registers weren't modified. */ - if ((td->td_frame->tf_special.psr & IA64_PSR_MFH) == 0) - return (ia64_highfp_drop(td)); - - mtx_lock_spin(&td->td_md.md_highfp_mtx); - pcb = td->td_pcb; - cpu = pcb->pcb_fpcpu; - if (cpu == NULL) { - mtx_unlock_spin(&td->td_md.md_highfp_mtx); - return (0); - } -#ifdef SMP - if (td == curthread) - sched_pin(); - if (cpu != pcpup) { - mtx_unlock_spin(&td->td_md.md_highfp_mtx); - ipi_send(cpu, IPI_HIGH_FP); - if (td == curthread) - sched_unpin(); - while (pcb->pcb_fpcpu == cpu) - DELAY(100); - return (1); - } else { - save_high_fp(&pcb->pcb_high_fp); - if (td == curthread) - sched_unpin(); - } -#else - save_high_fp(&pcb->pcb_high_fp); -#endif - pcb->pcb_fpcpu = NULL; - thr = cpu->pc_fpcurthread; - cpu->pc_fpcurthread = NULL; - mtx_unlock_spin(&td->td_md.md_highfp_mtx); - - /* Post-mortem sanity cxhecking. */ - KASSERT(thr == td, ("Inconsistent high FP state")); - return (1); -} - void ia64_sync_icache(vm_offset_t va, vm_offset_t sz) { diff --git a/sys/ia64/ia64/mem.c b/sys/ia64/ia64/mem.c index ab213d757940..53b86877c273 100644 --- a/sys/ia64/ia64/mem.c +++ b/sys/ia64/ia64/mem.c @@ -148,7 +148,8 @@ kmemphys: * instead of going through read/write */ int -memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot) +memmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { /* * /dev/mem is the only one that makes sense through this diff --git a/sys/ia64/ia64/mp_machdep.c b/sys/ia64/ia64/mp_machdep.c index 92e26216e48b..c5ed48f501d6 100644 --- a/sys/ia64/ia64/mp_machdep.c +++ b/sys/ia64/ia64/mp_machdep.c @@ -68,15 +68,15 @@ MALLOC_DEFINE(M_SMP, "SMP", "SMP related allocations"); void ia64_ap_startup(void); -#define LID_SAPIC_ID(x) ((int)((x) >> 24) & 0xff) -#define LID_SAPIC_EID(x) ((int)((x) >> 16) & 0xff) +#define LID_SAPIC(x) ((u_int)((x) >> 16)) +#define LID_SAPIC_ID(x) ((u_int)((x) >> 24) & 0xff) +#define LID_SAPIC_EID(x) ((u_int)((x) >> 16) & 0xff) #define LID_SAPIC_SET(id,eid) (((id & 0xff) << 8 | (eid & 0xff)) << 16); #define LID_SAPIC_MASK 0xffff0000UL /* Variables used by os_boot_rendez and ia64_ap_startup */ struct pcpu *ap_pcpu; void *ap_stack; -uint64_t ap_vhpt; volatile int ap_delay; volatile int ap_awake; volatile int ap_spin; @@ -115,14 +115,15 @@ ia64_store_mca_state(void* arg) void ia64_ap_startup(void) { - volatile struct ia64_interrupt_block *ib = IA64_INTERRUPT_BLOCK; + uint64_t vhpt; int vector; pcpup = ap_pcpu; ia64_set_k4((intptr_t)pcpup); - map_vhpt(ap_vhpt); - ia64_set_pta(ap_vhpt + (1 << 8) + (pmap_vhpt_log2size << 2) + 1); + vhpt = PCPU_GET(md.vhpt); + map_vhpt(vhpt); + ia64_set_pta(vhpt + (1 << 8) + (pmap_vhpt_log2size << 2) + 1); ia64_srlz_i(); ap_awake = 1; @@ -152,7 +153,7 @@ ia64_ap_startup(void) while (vector != 15) { ia64_srlz_d(); if (vector == 0) - vector = (int)ib->ib_inta; + vector = (int)ia64_ld1(&ia64_pib->ib_inta); ia64_set_eoi(0); ia64_srlz_d(); vector = ia64_get_ivr(); @@ -225,7 +226,7 @@ cpu_mp_add(u_int acpiid, u_int apicid, u_int apiceid) pc = pcpup; pc->pc_acpi_id = acpiid; - pc->pc_lid = lid; + pc->pc_md.lid = lid; all_cpus |= (1UL << cpuid); } @@ -239,8 +240,8 @@ cpu_mp_announce() pc = pcpu_find(i); if (pc != NULL) { printf("cpu%d: ACPI Id=%x, SAPIC Id=%x, SAPIC Eid=%x", - i, pc->pc_acpi_id, LID_SAPIC_ID(pc->pc_lid), - LID_SAPIC_EID(pc->pc_lid)); + i, pc->pc_acpi_id, LID_SAPIC_ID(pc->pc_md.lid), + LID_SAPIC_EID(pc->pc_md.lid)); if (i == 0) printf(" (BSP)\n"); else @@ -257,13 +258,18 @@ cpu_mp_start() ap_spin = 1; SLIST_FOREACH(pc, &cpuhead, pc_allcpu) { - pc->pc_current_pmap = kernel_pmap; + pc->pc_md.current_pmap = kernel_pmap; pc->pc_other_cpus = all_cpus & ~pc->pc_cpumask; if (pc->pc_cpuid > 0) { ap_pcpu = pc; + pc->pc_md.vhpt = pmap_alloc_vhpt(); + if (pc->pc_md.vhpt == 0) { + printf("SMP: WARNING: unable to allocate VHPT" + " for cpu%d", pc->pc_cpuid); + continue; + } ap_stack = malloc(KSTACK_PAGES * PAGE_SIZE, M_SMP, M_WAITOK); - ap_vhpt = pmap_vhpt_base[pc->pc_cpuid]; ap_delay = 2000; ap_awake = 0; @@ -275,13 +281,13 @@ cpu_mp_start() do { DELAY(1000); } while (--ap_delay > 0); - pc->pc_awake = ap_awake; + pc->pc_md.awake = ap_awake; if (!ap_awake) printf("SMP: WARNING: cpu%d did not wake up\n", pc->pc_cpuid); } else - pc->pc_awake = 1; + pc->pc_md.awake = 1; } } @@ -298,7 +304,7 @@ cpu_mp_unleash(void *dummy) smp_cpus = 0; SLIST_FOREACH(pc, &cpuhead, pc_allcpu) { cpus++; - if (pc->pc_awake) { + if (pc->pc_md.awake) { kproc_create(ia64_store_mca_state, (void*)((uintptr_t)pc->pc_cpuid), NULL, 0, 0, "mca %u", pc->pc_cpuid); @@ -357,16 +363,18 @@ ipi_all_but_self(int ipi) void ipi_send(struct pcpu *cpu, int ipi) { - volatile uint64_t *pipi; - uint64_t vector; + u_int lid; + uint8_t vector; - pipi = __MEMIO_ADDR(ia64_lapic_address | - ((cpu->pc_lid & LID_SAPIC_MASK) >> 12)); - vector = (uint64_t)(ipi_vector[ipi] & 0xff); + lid = LID_SAPIC(cpu->pc_md.lid); + vector = ipi_vector[ipi]; KASSERT(vector != 0, ("IPI %d is not assigned a vector", ipi)); - *pipi = vector; - CTR3(KTR_SMP, "ipi_send(%p, %ld), cpuid=%d", pipi, vector, - PCPU_GET(cpuid)); + + ia64_mf(); + ia64_st8(&(ia64_pib->ib_ipi[lid][0]), vector); + ia64_mf_a(); + CTR4(KTR_SMP, "ipi_send(%p, %ld): cpuid=%d, vector=%u", cpu, ipi, + PCPU_GET(cpuid), vector); } SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, cpu_mp_unleash, NULL); diff --git a/sys/ia64/ia64/nexus.c b/sys/ia64/ia64/nexus.c index 502dc72a4fc4..17c07d650284 100644 --- a/sys/ia64/ia64/nexus.c +++ b/sys/ia64/ia64/nexus.c @@ -59,7 +59,6 @@ #include #include #include -#include #include #include @@ -389,26 +388,23 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid, static int nexus_activate_resource(device_t bus, device_t child, int type, int rid, - struct resource *r) + struct resource *r) { - vm_paddr_t paddr, psize; + vm_paddr_t paddr; void *vaddr; - /* - * If this is a memory resource, map it into the kernel. - */ + paddr = rman_get_start(r); + switch (type) { case SYS_RES_IOPORT: rman_set_bustag(r, IA64_BUS_SPACE_IO); - rman_set_bushandle(r, rman_get_start(r)); + rman_set_bushandle(r, paddr); break; case SYS_RES_MEMORY: - paddr = rman_get_start(r); - psize = rman_get_size(r); - vaddr = pmap_mapdev(paddr, psize); - rman_set_virtual(r, vaddr); + vaddr = pmap_mapdev(paddr, rman_get_size(r)); rman_set_bustag(r, IA64_BUS_SPACE_MEM); - rman_set_bushandle(r, (bus_space_handle_t) paddr); + rman_set_bushandle(r, (bus_space_handle_t) vaddr); + rman_set_virtual(r, vaddr); break; } return (rman_activate_resource(r)); @@ -488,11 +484,27 @@ nexus_get_reslist(device_t dev, device_t child) } static int -nexus_set_resource(device_t dev, device_t child, int type, int rid, u_long start, u_long count) +nexus_set_resource(device_t dev, device_t child, int type, int rid, + u_long start, u_long count) { struct nexus_device *ndev = DEVTONX(child); struct resource_list *rl = &ndev->nx_resources; + if (type == SYS_RES_IOPORT && start > (0x10000 - count)) { + /* + * Work around a firmware bug in the HP rx2660, where in ACPI + * an I/O port is really a memory mapped I/O address. The bug + * is in the GAS that describes the address and in particular + * the SpaceId field. The field should not say the address is + * an I/O port when it is in fact an I/O memory address. + */ + if (bootverbose) + printf("%s: invalid port range (%#lx-%#lx); " + "assuming I/O memory range.\n", __func__, start, + start + count - 1); + type = SYS_RES_MEMORY; + } + /* XXX this should return a success/failure indicator */ resource_list_add(rl, type, rid, start, start + count - 1, count); return(0); diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index a5a2bc3f989e..f8297462a124 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -217,8 +217,6 @@ int pmap_vhpt_nbuckets; SYSCTL_INT(_machdep_vhpt, OID_AUTO, nbuckets, CTLFLAG_RD, &pmap_vhpt_nbuckets, 0, ""); -uint64_t pmap_vhpt_base[MAXCPU]; - int pmap_vhpt_log2size = 0; TUNABLE_INT("machdep.vhpt.log2size", &pmap_vhpt_log2size); SYSCTL_INT(_machdep_vhpt, OID_AUTO, log2size, CTLFLAG_RD, @@ -277,6 +275,40 @@ pmap_steal_memory(vm_size_t size) return va; } +static void +pmap_initialize_vhpt(vm_offset_t vhpt) +{ + struct ia64_lpte *pte; + u_int i; + + pte = (struct ia64_lpte *)vhpt; + for (i = 0; i < pmap_vhpt_nbuckets; i++) { + pte[i].pte = 0; + pte[i].itir = 0; + pte[i].tag = 1UL << 63; /* Invalid tag */ + pte[i].chain = (uintptr_t)(pmap_vhpt_bucket + i); + } +} + +#ifdef SMP +MALLOC_DECLARE(M_SMP); + +vm_offset_t +pmap_alloc_vhpt(void) +{ + vm_offset_t vhpt; + vm_size_t size; + + size = 1UL << pmap_vhpt_log2size; + vhpt = (uintptr_t)contigmalloc(size, M_SMP, 0, 0UL, ~0UL, size, 0UL); + if (vhpt != 0) { + vhpt = IA64_PHYS_TO_RR7(ia64_tpa(vhpt)); + pmap_initialize_vhpt(vhpt); + } + return (vhpt); +} +#endif + /* * Bootstrap the system enough to run with virtual memory. */ @@ -284,8 +316,7 @@ void pmap_bootstrap() { struct ia64_pal_result res; - struct ia64_lpte *pte; - vm_offset_t base, limit; + vm_offset_t base; size_t size; int i, j, count, ridbits; @@ -365,94 +396,52 @@ pmap_bootstrap() ; count = i+2; - /* - * Figure out a useful size for the VHPT, based on the size of - * physical memory and try to locate a region which is large - * enough to contain the VHPT (which must be a power of two in - * size and aligned to a natural boundary). - * We silently bump up the VHPT size to the minimum size if the - * user has set the tunable too small. Likewise, the VHPT size - * is silently capped to the maximum allowed. - */ TUNABLE_INT_FETCH("machdep.vhpt.log2size", &pmap_vhpt_log2size); - if (pmap_vhpt_log2size == 0) { + if (pmap_vhpt_log2size == 0) + pmap_vhpt_log2size = 20; + else if (pmap_vhpt_log2size < 15) pmap_vhpt_log2size = 15; - size = 1UL << pmap_vhpt_log2size; - while (size < Maxmem * 32) { - pmap_vhpt_log2size++; - size <<= 1; - } - } else if (pmap_vhpt_log2size < 15) - pmap_vhpt_log2size = 15; - if (pmap_vhpt_log2size > 61) + else if (pmap_vhpt_log2size > 61) pmap_vhpt_log2size = 61; - pmap_vhpt_base[0] = 0; - base = limit = 0; + base = 0; size = 1UL << pmap_vhpt_log2size; - while (pmap_vhpt_base[0] == 0) { - if (bootverbose) - printf("Trying VHPT size 0x%lx\n", size); - for (i = 0; i < count; i += 2) { - base = (phys_avail[i] + size - 1) & ~(size - 1); - limit = base + MAXCPU * size; - if (limit <= phys_avail[i+1]) - /* - * VHPT can fit in this region - */ - break; - } - if (!phys_avail[i]) { - /* Can't fit, try next smaller size. */ - pmap_vhpt_log2size--; - size >>= 1; - } else - pmap_vhpt_base[0] = IA64_PHYS_TO_RR7(base); + for (i = 0; i < count; i += 2) { + base = (phys_avail[i] + size - 1) & ~(size - 1); + if (base + size <= phys_avail[i+1]) + break; } - if (pmap_vhpt_log2size < 15) - panic("Can't find space for VHPT"); - - if (bootverbose) - printf("Putting VHPT at 0x%lx\n", base); + if (!phys_avail[i]) + panic("Unable to allocate VHPT"); if (base != phys_avail[i]) { /* Split this region. */ - if (bootverbose) - printf("Splitting [%p-%p]\n", (void *)phys_avail[i], - (void *)phys_avail[i+1]); for (j = count; j > i; j -= 2) { phys_avail[j] = phys_avail[j-2]; phys_avail[j+1] = phys_avail[j-2+1]; } phys_avail[i+1] = base; - phys_avail[i+2] = limit; + phys_avail[i+2] = base + size; } else - phys_avail[i] = limit; + phys_avail[i] = base + size; + + base = IA64_PHYS_TO_RR7(base); + PCPU_SET(md.vhpt, base); + if (bootverbose) + printf("VHPT: address=%#lx, size=%#lx\n", base, size); pmap_vhpt_nbuckets = size / sizeof(struct ia64_lpte); - pmap_vhpt_bucket = (void *)pmap_steal_memory(pmap_vhpt_nbuckets * sizeof(struct ia64_bucket)); - pte = (struct ia64_lpte *)pmap_vhpt_base[0]; for (i = 0; i < pmap_vhpt_nbuckets; i++) { - pte[i].pte = 0; - pte[i].itir = 0; - pte[i].tag = 1UL << 63; /* Invalid tag */ - pte[i].chain = (uintptr_t)(pmap_vhpt_bucket + i); - /* Stolen memory is zeroed! */ + /* Stolen memory is zeroed. */ mtx_init(&pmap_vhpt_bucket[i].mutex, "VHPT bucket lock", NULL, MTX_NOWITNESS | MTX_SPIN); } - for (i = 1; i < MAXCPU; i++) { - pmap_vhpt_base[i] = pmap_vhpt_base[i - 1] + size; - bcopy((void *)pmap_vhpt_base[i - 1], (void *)pmap_vhpt_base[i], - size); - } - - map_vhpt(pmap_vhpt_base[0]); - ia64_set_pta(pmap_vhpt_base[0] + (1 << 8) + - (pmap_vhpt_log2size << 2) + 1); + pmap_initialize_vhpt(base); + map_vhpt(base); + ia64_set_pta(base + (1 << 8) + (pmap_vhpt_log2size << 2) + 1); ia64_srlz_i(); virtual_avail = VM_MIN_KERNEL_ADDRESS; @@ -464,9 +453,8 @@ pmap_bootstrap() PMAP_LOCK_INIT(kernel_pmap); for (i = 0; i < 5; i++) kernel_pmap->pm_rid[i] = 0; - kernel_pmap->pm_active = 1; TAILQ_INIT(&kernel_pmap->pm_pvlist); - PCPU_SET(current_pmap, kernel_pmap); + PCPU_SET(md.current_pmap, kernel_pmap); /* * Region 5 is mapped via the vhpt. @@ -551,15 +539,16 @@ static void pmap_invalidate_page(pmap_t pmap, vm_offset_t va) { struct ia64_lpte *pte; - int i, vhpt_ofs; + struct pcpu *pc; + u_int vhpt_ofs; - KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(current_pmap)), + KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(md.current_pmap)), ("invalidating TLB for non-current pmap")); - vhpt_ofs = ia64_thash(va) - pmap_vhpt_base[PCPU_GET(cpuid)]; + vhpt_ofs = ia64_thash(va) - PCPU_GET(md.vhpt); critical_enter(); - for (i = 0; i < MAXCPU; i++) { - pte = (struct ia64_lpte *)(pmap_vhpt_base[i] + vhpt_ofs); + SLIST_FOREACH(pc, &cpuhead, pc_allcpu) { + pte = (struct ia64_lpte *)(pc->pc_md.vhpt + vhpt_ofs); if (pte->tag == ia64_ttag(va)) pte->tag = 1UL << 63; } @@ -591,7 +580,7 @@ static void pmap_invalidate_all(pmap_t pmap) { - KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(current_pmap)), + KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(md.current_pmap)), ("invalidating TLB for non-current pmap")); #ifdef SMP @@ -672,7 +661,6 @@ pmap_pinit(struct pmap *pmap) PMAP_LOCK_INIT(pmap); for (i = 0; i < 5; i++) pmap->pm_rid[i] = pmap_allocate_rid(); - pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvlist); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); return (1); @@ -1172,7 +1160,7 @@ pmap_remove_pte(pmap_t pmap, struct ia64_lpte *pte, vm_offset_t va, int error; vm_page_t m; - KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(current_pmap)), + KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(md.current_pmap)), ("removing pte for non-current pmap")); /* @@ -1340,7 +1328,7 @@ pmap_remove_page(pmap_t pmap, vm_offset_t va) { struct ia64_lpte *pte; - KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(current_pmap)), + KASSERT((pmap == kernel_pmap || pmap == PCPU_GET(md.current_pmap)), ("removing page for non-current pmap")); pte = pmap_find_vhpt(va); @@ -2155,9 +2143,12 @@ pmap_remove_write(vm_page_t m) * NOT real memory. */ void * -pmap_mapdev(vm_offset_t pa, vm_size_t size) +pmap_mapdev(vm_paddr_t pa, vm_size_t size) { - return (void*) IA64_PHYS_TO_RR6(pa); + vm_offset_t va; + + va = pa | IA64_RR_BASE(6); + return ((void *)va); } /* @@ -2166,7 +2157,6 @@ pmap_mapdev(vm_offset_t pa, vm_size_t size) void pmap_unmapdev(vm_offset_t va, vm_size_t size) { - return; } /* @@ -2251,11 +2241,9 @@ pmap_switch(pmap_t pm) int i; critical_enter(); - prevpm = PCPU_GET(current_pmap); + prevpm = PCPU_GET(md.current_pmap); if (prevpm == pm) goto out; - if (prevpm != NULL) - atomic_clear_32(&prevpm->pm_active, PCPU_GET(cpumask)); if (pm == NULL) { for (i = 0; i < 5; i++) { ia64_set_rr(IA64_RR_BASE(i), @@ -2266,9 +2254,8 @@ pmap_switch(pmap_t pm) ia64_set_rr(IA64_RR_BASE(i), (pm->pm_rid[i] << 8)|(PAGE_SHIFT << 2)|1); } - atomic_set_32(&pm->pm_active, PCPU_GET(cpumask)); } - PCPU_SET(current_pmap, pm); + PCPU_SET(md.current_pmap, pm); ia64_srlz_d(); out: @@ -2276,6 +2263,33 @@ out: return (prevpm); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ + pmap_t oldpm; + struct ia64_lpte *pte; + vm_offset_t lim; + vm_size_t len; + + sz += va & 31; + va &= ~31; + sz = (sz + 31) & ~31; + + PMAP_LOCK(pm); + oldpm = pmap_switch(pm); + while (sz > 0) { + lim = round_page(va); + len = MIN(lim - va, sz); + pte = pmap_find_vhpt(va); + if (pte != NULL && pmap_present(pte)) + ia64_sync_icache(va, len); + va += len; + sz -= len; + } + pmap_switch(oldpm); + PMAP_UNLOCK(pm); +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/ia64/ia64/sapic.c b/sys/ia64/ia64/sapic.c index 00ef23490fcd..cb8a1c305eaf 100644 --- a/sys/ia64/ia64/sapic.c +++ b/sys/ia64/ia64/sapic.c @@ -39,76 +39,100 @@ #include #include -#include -#include -static MALLOC_DEFINE(M_SAPIC, "sapic", "I/O SAPIC devices"); +#include +#include + +/* + * Offsets from the SAPIC base in memory. Most registers are accessed + * by indexing using the SAPIC_IO_SELECT register. + */ +#define SAPIC_IO_SELECT 0x00 +#define SAPIC_IO_WINDOW 0x10 +#define SAPIC_APIC_EOI 0x40 + +/* + * Indexed registers. + */ +#define SAPIC_ID 0x00 +#define SAPIC_VERSION 0x01 +#define SAPIC_ARBITRATION_ID 0x02 +#define SAPIC_RTE_BASE 0x10 + +/* Interrupt polarity. */ +#define SAPIC_POLARITY_HIGH 0 +#define SAPIC_POLARITY_LOW 1 + +/* Interrupt trigger. */ +#define SAPIC_TRIGGER_EDGE 0 +#define SAPIC_TRIGGER_LEVEL 1 + +/* Interrupt delivery mode. */ +#define SAPIC_DELMODE_FIXED 0 +#define SAPIC_DELMODE_LOWPRI 1 +#define SAPIC_DELMODE_PMI 2 +#define SAPIC_DELMODE_NMI 4 +#define SAPIC_DELMODE_INIT 5 +#define SAPIC_DELMODE_EXTINT 7 + +struct sapic { + struct mtx sa_mtx; + uint64_t sa_registers; /* virtual address of sapic */ + u_int sa_id; /* I/O SAPIC Id */ + u_int sa_base; /* ACPI vector base */ + u_int sa_limit; /* last ACPI vector handled here */ +}; + +struct sapic_rte { + uint64_t rte_vector :8; + uint64_t rte_delivery_mode :3; + uint64_t rte_destination_mode :1; + uint64_t rte_delivery_status :1; + uint64_t rte_polarity :1; + uint64_t rte_rirr :1; + uint64_t rte_trigger_mode :1; + uint64_t rte_mask :1; + uint64_t rte_flushen :1; + uint64_t rte_reserved :30; + uint64_t rte_destination_eid :8; + uint64_t rte_destination_id :8; +}; + +MALLOC_DEFINE(M_SAPIC, "sapic", "I/O SAPIC devices"); + +struct sapic *ia64_sapics[16]; /* XXX make this resizable */ +int ia64_sapic_count; static int sysctl_machdep_apic(SYSCTL_HANDLER_ARGS); SYSCTL_OID(_machdep, OID_AUTO, apic, CTLTYPE_STRING|CTLFLAG_RD, NULL, 0, sysctl_machdep_apic, "A", "(x)APIC redirection table entries"); -struct sapic *ia64_sapics[16]; /* XXX make this resizable */ -int ia64_sapic_count; - -u_int64_t ia64_lapic_address = PAL_PIB_DEFAULT_ADDR; - -struct sapic_rte { - u_int64_t rte_vector :8; - u_int64_t rte_delivery_mode :3; - u_int64_t rte_destination_mode :1; - u_int64_t rte_delivery_status :1; - u_int64_t rte_polarity :1; - u_int64_t rte_rirr :1; - u_int64_t rte_trigger_mode :1; - u_int64_t rte_mask :1; - u_int64_t rte_flushen :1; - u_int64_t rte_reserved :30; - u_int64_t rte_destination_eid :8; - u_int64_t rte_destination_id :8; -}; - -struct sapic * -sapic_lookup(u_int irq) -{ - struct sapic *sa; - int i; - - for (i = 0; i < ia64_sapic_count; i++) { - sa = ia64_sapics[i]; - if (irq >= sa->sa_base && irq <= sa->sa_limit) - return (sa); - } - - return (NULL); -} - -static __inline u_int32_t +static __inline uint32_t sapic_read(struct sapic *sa, int which) { - vm_offset_t reg = sa->sa_registers; + uint32_t value; - *(volatile u_int32_t *) (reg + SAPIC_IO_SELECT) = which; - ia64_mf(); - return *(volatile u_int32_t *) (reg + SAPIC_IO_WINDOW); + ia64_st4((void *)(sa->sa_registers + SAPIC_IO_SELECT), which); + ia64_mf_a(); + value = ia64_ld4((void *)(sa->sa_registers + SAPIC_IO_WINDOW)); + return (value); } static __inline void -sapic_write(struct sapic *sa, int which, u_int32_t value) +sapic_write(struct sapic *sa, int which, uint32_t value) { - vm_offset_t reg = sa->sa_registers; - *(volatile u_int32_t *) (reg + SAPIC_IO_SELECT) = which; - ia64_mf(); - *(volatile u_int32_t *) (reg + SAPIC_IO_WINDOW) = value; - ia64_mf(); + ia64_st4((void *)(sa->sa_registers + SAPIC_IO_SELECT), which); + ia64_mf_a(); + ia64_st4((void *)(sa->sa_registers + SAPIC_IO_WINDOW), value); + ia64_mf_a(); } static __inline void sapic_read_rte(struct sapic *sa, int which, struct sapic_rte *rte) { - u_int32_t *p = (u_int32_t *) rte; + uint32_t *p = (uint32_t *) rte; p[0] = sapic_read(sa, SAPIC_RTE_BASE + 2 * which); p[1] = sapic_read(sa, SAPIC_RTE_BASE + 2 * which + 1); @@ -117,19 +141,43 @@ sapic_read_rte(struct sapic *sa, int which, struct sapic_rte *rte) static __inline void sapic_write_rte(struct sapic *sa, int which, struct sapic_rte *rte) { - u_int32_t *p = (u_int32_t *) rte; + uint32_t *p = (uint32_t *) rte; - sapic_write(sa, SAPIC_RTE_BASE + 2 *which, p[0]); - sapic_write(sa, SAPIC_RTE_BASE + 2 *which + 1, p[1]); + sapic_write(sa, SAPIC_RTE_BASE + 2 * which, p[0]); + sapic_write(sa, SAPIC_RTE_BASE + 2 * which + 1, p[1]); } +struct sapic * +sapic_lookup(u_int irq, u_int *vecp) +{ + struct sapic_rte rte; + struct sapic *sa; + int i; + + for (i = 0; i < ia64_sapic_count; i++) { + sa = ia64_sapics[i]; + if (irq >= sa->sa_base && irq <= sa->sa_limit) { + if (vecp != NULL) { + mtx_lock_spin(&sa->sa_mtx); + sapic_read_rte(sa, irq - sa->sa_base, &rte); + mtx_unlock_spin(&sa->sa_mtx); + *vecp = rte.rte_vector; + } + return (sa); + } + } + + return (NULL); +} + + int sapic_config_intr(u_int irq, enum intr_trigger trig, enum intr_polarity pol) { struct sapic_rte rte; struct sapic *sa; - sa = sapic_lookup(irq); + sa = sapic_lookup(irq, NULL); if (sa == NULL) return (EINVAL); @@ -153,7 +201,7 @@ sapic_config_intr(u_int irq, enum intr_trigger trig, enum intr_polarity pol) } struct sapic * -sapic_create(u_int id, u_int base, u_int64_t address) +sapic_create(u_int id, u_int base, uint64_t address) { struct sapic_rte rte; struct sapic *sa; @@ -165,7 +213,7 @@ sapic_create(u_int id, u_int base, u_int64_t address) sa->sa_id = id; sa->sa_base = base; - sa->sa_registers = IA64_PHYS_TO_RR6(address); + sa->sa_registers = (uintptr_t)pmap_mapdev(address, 1048576); mtx_init(&sa->sa_mtx, "I/O SAPIC lock", NULL, MTX_SPIN); @@ -213,10 +261,9 @@ sapic_enable(struct sapic *sa, u_int irq, u_int vector) void sapic_eoi(struct sapic *sa, u_int vector) { - vm_offset_t reg = sa->sa_registers; - *(volatile u_int32_t *)(reg + SAPIC_APIC_EOI) = vector; - ia64_mf(); + ia64_st4((void *)(sa->sa_registers + SAPIC_APIC_EOI), vector); + ia64_mf_a(); } /* Expected to be called with interrupts disabled. */ diff --git a/sys/ia64/ia64/sscdisk.c b/sys/ia64/ia64/sscdisk.c index 0d5e32190ccb..f9abc0abd25e 100644 --- a/sys/ia64/ia64/sscdisk.c +++ b/sys/ia64/ia64/sscdisk.c @@ -76,7 +76,7 @@ MALLOC_DEFINE(M_SSC, "ssc_disk", "Simulator Disk"); static d_strategy_t sscstrategy; -static LIST_HEAD(, ssc_s) ssc_softc_list = LIST_HEAD_INITIALIZER(&ssc_softc_list); +static LIST_HEAD(, ssc_s) ssc_softc_list = LIST_HEAD_INITIALIZER(ssc_softc_list); struct ssc_s { int unit; diff --git a/sys/ia64/ia64/support.S b/sys/ia64/ia64/support.S index ea04276e9ecd..1a82dd6391e6 100644 --- a/sys/ia64/ia64/support.S +++ b/sys/ia64/ia64/support.S @@ -227,14 +227,14 @@ ENTRY(casuword, 3) nop 0 ;; } -{ .mfb +{ .mib st8.rel [r15]=r0 // Clear onfault nop 0 br.ret.sptk rp ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -277,14 +277,14 @@ ENTRY(casuword32, 3) nop 0 ;; } -{ .mfb +{ .mib st8.rel [r15]=r0 // Clear onfault nop 0 br.ret.sptk rp ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -338,7 +338,7 @@ ENTRY(subyte, 2) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -384,7 +384,7 @@ ENTRY(suword16, 2) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -430,7 +430,7 @@ ENTRY(suword32, 2) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -477,7 +477,7 @@ XENTRY(suword) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -531,7 +531,7 @@ ENTRY(fubyte, 1) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -577,7 +577,7 @@ ENTRY(fuword16, 2) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -623,7 +623,7 @@ ENTRY(fuword32, 2) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -670,7 +670,7 @@ XENTRY(fuword) ;; } 1: -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -684,7 +684,7 @@ END(fuword64) */ ENTRY(fuswintr, 1) -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp @@ -693,7 +693,7 @@ ENTRY(fuswintr, 1) END(fuswintr) ENTRY(suswintr, 0) -{ .mfb +{ .mib add ret0=-1,r0 nop 0 br.ret.sptk rp diff --git a/sys/ia64/ia64/sys_machdep.c b/sys/ia64/ia64/sys_machdep.c index d4dcc1fd536a..764df2ea0276 100644 --- a/sys/ia64/ia64/sys_machdep.c +++ b/sys/ia64/ia64/sys_machdep.c @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -48,72 +49,9 @@ struct sysarch_args { int sysarch(struct thread *td, struct sysarch_args *uap) { - struct ia64_iodesc iod; int error; - error = 0; switch(uap->op) { - case IA64_IORD: - copyin(uap->parms, &iod, sizeof(iod)); - switch (iod.width) { - case 1: - iod.val = inb(iod.port); - break; - case 2: - if (iod.port & 1) { - iod.val = inb(iod.port); - iod.val |= inb(iod.port + 1) << 8; - } else - iod.val = inw(iod.port); - break; - case 4: - if (iod.port & 3) { - if (iod.port & 1) { - iod.val = inb(iod.port); - iod.val |= inw(iod.port + 1) << 8; - iod.val |= inb(iod.port + 3) << 24; - } else { - iod.val = inw(iod.port); - iod.val |= inw(iod.port + 2) << 16; - } - } else - iod.val = inl(iod.port); - break; - default: - error = EINVAL; - } - copyout(&iod, uap->parms, sizeof(iod)); - break; - case IA64_IOWR: - copyin(uap->parms, &iod, sizeof(iod)); - switch (iod.width) { - case 1: - outb(iod.port, iod.val); - break; - case 2: - if (iod.port & 1) { - outb(iod.port, iod.val); - outb(iod.port + 1, iod.val >> 8); - } else - outw(iod.port, iod.val); - break; - case 4: - if (iod.port & 3) { - if (iod.port & 1) { - outb(iod.port, iod.val); - outw(iod.port + 1, iod.val >> 8); - outb(iod.port + 3, iod.val >> 24); - } else { - outw(iod.port, iod.val); - outw(iod.port + 2, iod.val >> 16); - } - } else - outl(iod.port, iod.val); - break; - default: - error = EINVAL; - } - break; default: error = EINVAL; break; diff --git a/sys/ia64/ia64/syscall.S b/sys/ia64/ia64/syscall.S index 73f8da67b830..b35523a66bed 100644 --- a/sys/ia64/ia64/syscall.S +++ b/sys/ia64/ia64/syscall.S @@ -102,13 +102,13 @@ gw_ret: ;; } gw_ret_ia32: -{ .mfb +{ .mmi flushrs nop 0 nop 0 ;; } -{ .mfb +{ .mib nop 0 nop 0 br.ia.sptk b6 @@ -193,7 +193,7 @@ ENTRY_NOPROFILE(epc_sigtramp, 0) mov b7=r16 ;; } -{ .mmb +{ .mmi alloc r14=ar.pfs, 0, 0, 3, 0 mov ar.rsc=15 nop 0 @@ -204,7 +204,7 @@ ENTRY_NOPROFILE(epc_sigtramp, 0) mov out0=r8 mov out1=r9 } -{ .mfb +{ .mib add out2=16,sp nop 0 br.call.sptk rp=b7 @@ -257,7 +257,7 @@ ENTRY_NOPROFILE(epc_syscall, 8) add r31=8,r30 ;; } -{ .mib +{ .mii mov r22=ar.fpsr sub r29=r14,r30 nop 0 @@ -380,7 +380,7 @@ ENTRY_NOPROFILE(epc_syscall, 8) } .global epc_syscall_return epc_syscall_return: -{ .mfb +{ .mib add out0=16,sp nop 0 br.call.sptk rp=do_ast @@ -392,7 +392,7 @@ epc_syscall_return: (p15) br.spnt 1b // restart syscall ;; } -{ .mfb +{ .mmi ld8 r14=[r14] // tf_flags nop 0 nop 0 @@ -422,7 +422,7 @@ epc_syscall_return: add r31=r31,sp ;; } -{ .mmb +{ .mmi ld8 r19=[r15],16 // pr ld8 r20=[r14],16 // pfs (syscall caller) nop 0 @@ -434,7 +434,7 @@ epc_syscall_return: mov pr=r19,0x1fffe ;; } -{ .mmb +{ .mmi ld8 r23=[r15],16 // tp ld8 r24=[r14],16 // rsc nop 0 @@ -488,7 +488,7 @@ epc_syscall_return: dep r30=0,r30,0,13 // 8KB aligned. ;; } -{ .mib +{ .mii mov ar.k6=r30 mov r13=r23 nop 0 diff --git a/sys/ia64/ia64/trap.c b/sys/ia64/ia64/trap.c index aa31e6c5b196..62644622d796 100644 --- a/sys/ia64/ia64/trap.c +++ b/sys/ia64/ia64/trap.c @@ -414,11 +414,9 @@ trap(int vector, struct trapframe *tf) case IA64_VEC_NESTED_DTLB: /* - * We never call trap() with this vector. We may want to - * do that in the future in case the nested TLB handler - * could not find the translation it needs. In that case - * we could switch to a special (hardwired) stack and - * come here to produce a nice panic(). + * When the nested TLB handler encounters an unexpected + * condition, it'll switch to the backup stack and transfer + * here. All we need to do is panic. */ trap_panic(vector, tf); break; @@ -574,8 +572,7 @@ trap(int vector, struct trapframe *tf) PROC_UNLOCK(p); /* Fault in the user page: */ - rv = vm_fault(map, va, ftype, (ftype & VM_PROT_WRITE) - ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); + rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); PROC_LOCK(p); --p->p_lock; @@ -652,66 +649,10 @@ trap(int vector, struct trapframe *tf) break; case IA64_VEC_DISABLED_FP: { - struct pcpu *pcpu; - struct pcb *pcb; - struct thread *thr; - - /* Always fatal in kernel. Should never happen. */ - if (!user) + if (user) + ia64_highfp_enable(td, tf); + else trap_panic(vector, tf); - - sched_pin(); - thr = PCPU_GET(fpcurthread); - if (thr == td) { - /* - * Short-circuit handling the trap when this CPU - * already holds the high FP registers for this - * thread. We really shouldn't get the trap in the - * first place, but since it's only a performance - * issue and not a correctness issue, we emit a - * message for now, enable the high FP registers and - * return. - */ - printf("XXX: bogusly disabled high FP regs\n"); - tf->tf_special.psr &= ~IA64_PSR_DFH; - sched_unpin(); - goto out; - } else if (thr != NULL) { - mtx_lock_spin(&thr->td_md.md_highfp_mtx); - pcb = thr->td_pcb; - save_high_fp(&pcb->pcb_high_fp); - pcb->pcb_fpcpu = NULL; - PCPU_SET(fpcurthread, NULL); - mtx_unlock_spin(&thr->td_md.md_highfp_mtx); - thr = NULL; - } - - mtx_lock_spin(&td->td_md.md_highfp_mtx); - pcb = td->td_pcb; - pcpu = pcb->pcb_fpcpu; - -#ifdef SMP - if (pcpu != NULL) { - mtx_unlock_spin(&td->td_md.md_highfp_mtx); - ipi_send(pcpu, IPI_HIGH_FP); - while (pcb->pcb_fpcpu == pcpu) - DELAY(100); - mtx_lock_spin(&td->td_md.md_highfp_mtx); - pcpu = pcb->pcb_fpcpu; - thr = PCPU_GET(fpcurthread); - } -#endif - - if (thr == NULL && pcpu == NULL) { - restore_high_fp(&pcb->pcb_high_fp); - PCPU_SET(fpcurthread, td); - pcb->pcb_fpcpu = pcpup; - tf->tf_special.psr &= ~IA64_PSR_MFH; - tf->tf_special.psr &= ~IA64_PSR_DFH; - } - - mtx_unlock_spin(&td->td_md.md_highfp_mtx); - sched_unpin(); goto out; } @@ -862,7 +803,7 @@ trap(int vector, struct trapframe *tf) * out of the gateway page we'll get back into the kernel * and then we enable single stepping. * Since this a rather round-about way of enabling single - * stepping, don't make things complicated even more by + * stepping, don't make things even more complicated by * calling userret() and do_ast(). We do that later... */ tf->tf_special.psr &= ~IA64_PSR_LP; @@ -873,13 +814,14 @@ trap(int vector, struct trapframe *tf) /* * Don't assume there aren't any branches other than the * branch that takes us out of the gateway page. Check the - * iip and raise SIGTRAP only when it's an user address. + * iip and enable single stepping only when it's an user + * address. */ if (tf->tf_special.iip >= VM_MAX_ADDRESS) return; tf->tf_special.psr &= ~IA64_PSR_TB; - sig = SIGTRAP; - break; + tf->tf_special.psr |= IA64_PSR_SS; + return; case IA64_VEC_IA32_EXCEPTION: case IA64_VEC_IA32_INTERCEPT: @@ -1032,26 +974,7 @@ syscall(struct trapframe *tf) error = (*callp->sy_call)(td, args); AUDIT_SYSCALL_EXIT(error, td); - if (error != EJUSTRETURN) { - /* - * Save the "raw" error code in r10. We use this to handle - * syscall restarts (see do_ast()). - */ - tf->tf_scratch.gr10 = error; - if (error == 0) { - tf->tf_scratch.gr8 = td->td_retval[0]; - tf->tf_scratch.gr9 = td->td_retval[1]; - } else if (error != ERESTART) { - if (error < p->p_sysent->sv_errsize) - error = p->p_sysent->sv_errtbl[error]; - /* - * Translated error codes are returned in r8. User - * processes use the translated error code. - */ - tf->tf_scratch.gr8 = error; - } - } - + cpu_set_syscall_retval(td, error); td->td_syscalls++; /* diff --git a/sys/ia64/ia64/vm_machdep.c b/sys/ia64/ia64/vm_machdep.c index 4259875324b8..37af94b081cc 100644 --- a/sys/ia64/ia64/vm_machdep.c +++ b/sys/ia64/ia64/vm_machdep.c @@ -73,6 +73,7 @@ #include #include #include +#include #include #include #include @@ -120,14 +121,11 @@ cpu_thread_alloc(struct thread *td) sp -= sizeof(struct trapframe); td->td_frame = (struct trapframe *)sp; td->td_frame->tf_length = sizeof(struct trapframe); - mtx_init(&td->td_md.md_highfp_mtx, "High FP lock", NULL, MTX_SPIN); } void cpu_thread_free(struct thread *td) { - - mtx_destroy(&td->td_md.md_highfp_mtx); } void @@ -142,12 +140,44 @@ cpu_thread_swapout(struct thread *td) ia64_highfp_save(td); } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + struct proc *p; + struct trapframe *tf; + + if (error == EJUSTRETURN) + return; + + tf = td->td_frame; + + /* + * Save the "raw" error code in r10. We use this to handle + * syscall restarts (see do_ast()). + */ + tf->tf_scratch.gr10 = error; + if (error == 0) { + tf->tf_scratch.gr8 = td->td_retval[0]; + tf->tf_scratch.gr9 = td->td_retval[1]; + } else if (error != ERESTART) { + p = td->td_proc; + if (error < p->p_sysent->sv_errsize) + error = p->p_sysent->sv_errtbl[error]; + /* + * Translated error codes are returned in r8. User + */ + tf->tf_scratch.gr8 = error; + } +} + void cpu_set_upcall(struct thread *td, struct thread *td0) { struct pcb *pcb; struct trapframe *tf; + ia64_highfp_save(td0); + tf = td->td_frame; KASSERT(tf != NULL, ("foo")); bcopy(td0->td_frame, tf, sizeof(*tf)); diff --git a/sys/ia64/include/asm.h b/sys/ia64/include/asm.h index 0e50d47ae5e8..016bc870f2f9 100644 --- a/sys/ia64/include/asm.h +++ b/sys/ia64/include/asm.h @@ -61,7 +61,7 @@ */ #define ENTRY(_name_, _n_args_) \ .global _name_; \ - .align 16; \ + .align 32; \ .proc _name_; \ _name_:; \ .regstk _n_args_, 0, 0, 0; \ @@ -69,7 +69,7 @@ _name_:; \ #define ENTRY_NOPROFILE(_name_, _n_args_) \ .global _name_; \ - .align 16; \ + .align 32; \ .proc _name_; \ _name_:; \ .regstk _n_args_, 0, 0, 0 @@ -79,7 +79,7 @@ _name_:; \ * Declare a local leaf function. */ #define STATIC_ENTRY(_name_, _n_args_) \ - .align 16; \ + .align 32; \ .proc _name_; \ _name_:; \ .regstk _n_args_, 0, 0, 0 \ @@ -161,6 +161,10 @@ label: ASCIZ msg; \ #define SYSCALLNUM(name) SYS_ ## name #define CALLSYS_NOERROR(name) \ + .prologue ; \ + .unwabi @svr4, 'S' ; \ + .save rp, r0 ; \ + .body ; \ { .mmi ; \ alloc r9 = ar.pfs, 0, 0, 8, 0 ; \ mov r31 = ar.k5 ; \ diff --git a/sys/ia64/include/bus.h b/sys/ia64/include/bus.h index 02fe8bee1056..bad4f85ac15f 100644 --- a/sys/ia64/include/bus.h +++ b/sys/ia64/include/bus.h @@ -1,3 +1,29 @@ +/*- + * Copyright (c) 2009 Marcel Moolenaar + * 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. + */ + /* $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $ */ /*- @@ -75,55 +101,52 @@ #include #include +/* + * I/O port reads with ia32 semantics. + */ +#define inb bus_space_read_io_1 +#define inw bus_space_read_io_2 +#define inl bus_space_read_io_4 + +#define outb bus_space_write_io_1 +#define outw bus_space_write_io_2 +#define outl bus_space_write_io_4 + /* * Values for the ia64 bus space tag, not to be used directly by MI code. */ #define IA64_BUS_SPACE_IO 0 /* space is i/o space */ #define IA64_BUS_SPACE_MEM 1 /* space is mem space */ +#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ +#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ + #define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF #define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF #define BUS_SPACE_MAXSIZE 0xFFFFFFFFFFFFFFFF #define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF #define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXADDR 0xFFFFFFFF +#define BUS_SPACE_MAXADDR 0xFFFFFFFFFFFFFFFF #define BUS_SPACE_UNRESTRICTED (~0) -/* - * Map a region of device bus space into CPU virtual address space. - */ - -static __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr, - bus_size_t size, int flags, - bus_space_handle_t *bshp); - -static __inline int -bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr, - bus_size_t size __unused, int flags __unused, - bus_space_handle_t *bshp) -{ - - *bshp = addr; - return (0); -} /* - * Unmap a region of device bus space. + * Map and unmap a region of device bus space into CPU virtual address space. */ -static __inline void -bus_space_unmap(bus_space_tag_t bst __unused, bus_space_handle_t bsh __unused, - bus_size_t size __unused) -{ -} +int +bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, + bus_space_handle_t *); +void +bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t size); /* * Get a new handle for a subregion of an already-mapped area of bus space. */ static __inline int bus_space_subregion(bus_space_tag_t bst, bus_space_handle_t bsh, - bus_size_t ofs, bus_size_t size, bus_space_handle_t *nbshp) + bus_size_t ofs, bus_size_t size __unused, bus_space_handle_t *nbshp) { *nbshp = bsh + ofs; return (0); @@ -149,12 +172,9 @@ bus_space_free(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t size); /* * Bus read/write barrier method. */ -#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ -#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ - static __inline void -bus_space_barrier(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, - bus_size_t size, int flags) +bus_space_barrier(bus_space_tag_t bst __unused, bus_space_handle_t bsh __unused, + bus_size_t ofs __unused, bus_size_t size __unused, int flags __unused) { ia64_mf_a(); ia64_mf(); @@ -166,40 +186,53 @@ bus_space_barrier(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The * data is returned. */ +uint8_t bus_space_read_io_1(u_long); +uint16_t bus_space_read_io_2(u_long); +uint32_t bus_space_read_io_4(u_long); +uint64_t bus_space_read_io_8(u_long); + static __inline uint8_t bus_space_read_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs) { - uint8_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - return (*bsp); + uint8_t val; + + val = (__predict_false(bst == IA64_BUS_SPACE_IO)) + ? bus_space_read_io_1(bsh + ofs) + : ia64_ld1((void *)(bsh + ofs)); + return (val); } static __inline uint16_t bus_space_read_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs) { - uint16_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - return (*bsp); + uint16_t val; + + val = (__predict_false(bst == IA64_BUS_SPACE_IO)) + ? bus_space_read_io_2(bsh + ofs) + : ia64_ld2((void *)(bsh + ofs)); + return (val); } static __inline uint32_t bus_space_read_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs) { - uint32_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - return (*bsp); + uint32_t val; + + val = (__predict_false(bst == IA64_BUS_SPACE_IO)) + ? bus_space_read_io_4(bsh + ofs) + : ia64_ld4((void *)(bsh + ofs)); + return (val); } static __inline uint64_t bus_space_read_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs) { - uint64_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - return (*bsp); + uint64_t val; + + val = (__predict_false(bst == IA64_BUS_SPACE_IO)) + ? bus_space_read_io_8(bsh + ofs) + : ia64_ld8((void *)(bsh + ofs)); + return (val); } @@ -208,44 +241,53 @@ bus_space_read_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs) * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The * data is passed by value. */ +void bus_space_write_io_1(u_long, uint8_t); +void bus_space_write_io_2(u_long, uint16_t); +void bus_space_write_io_4(u_long, uint32_t); +void bus_space_write_io_8(u_long, uint64_t); + static __inline void bus_space_write_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t val) { - uint8_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_io_1(bsh + ofs, val); + else + ia64_st1((void *)(bsh + ofs), val); } static __inline void bus_space_write_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t val) { - uint16_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_io_2(bsh + ofs, val); + else + ia64_st2((void *)(bsh + ofs), val); } static __inline void bus_space_write_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t val) { - uint32_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_io_4(bsh + ofs, val); + else + ia64_st4((void *)(bsh + ofs), val); } static __inline void bus_space_write_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t val) { - uint64_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_io_8(bsh + ofs, val); + else + ia64_st8((void *)(bsh + ofs), val); } @@ -254,48 +296,61 @@ bus_space_write_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The * data is returned in the buffer passed by reference. */ +void bus_space_read_multi_io_1(u_long, uint8_t *, size_t); +void bus_space_read_multi_io_2(u_long, uint16_t *, size_t); +void bus_space_read_multi_io_4(u_long, uint32_t *, size_t); +void bus_space_read_multi_io_8(u_long, uint64_t *, size_t); + static __inline void bus_space_read_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t *bufp, size_t count) { - uint8_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bufp++ = *bsp; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_multi_io_1(bsh + ofs, bufp, count); + else { + while (count-- > 0) + *bufp++ = ia64_ld1((void *)(bsh + ofs)); + } } static __inline void bus_space_read_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t *bufp, size_t count) { - uint16_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bufp++ = *bsp; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_multi_io_2(bsh + ofs, bufp, count); + else { + while (count-- > 0) + *bufp++ = ia64_ld2((void *)(bsh + ofs)); + } } static __inline void bus_space_read_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t *bufp, size_t count) { - uint32_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bufp++ = *bsp; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_multi_io_4(bsh + ofs, bufp, count); + else { + while (count-- > 0) + *bufp++ = ia64_ld4((void *)(bsh + ofs)); + } } static __inline void bus_space_read_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t *bufp, size_t count) { - uint64_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bufp++ = *bsp; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_multi_io_8(bsh + ofs, bufp, count); + else { + while (count-- > 0) + *bufp++ = ia64_ld8((void *)(bsh + ofs)); + } } @@ -304,48 +359,61 @@ bus_space_read_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The * data is read from the buffer passed by reference. */ +void bus_space_write_multi_io_1(u_long, const uint8_t *, size_t); +void bus_space_write_multi_io_2(u_long, const uint16_t *, size_t); +void bus_space_write_multi_io_4(u_long, const uint32_t *, size_t); +void bus_space_write_multi_io_8(u_long, const uint64_t *, size_t); + static __inline void bus_space_write_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *bufp, size_t count) { - uint8_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bsp = *bufp++; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_multi_io_1(bsh + ofs, bufp, count); + else { + while (count-- > 0) + ia64_st1((void *)(bsh + ofs), *bufp++); + } } static __inline void bus_space_write_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *bufp, size_t count) { - uint16_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bsp = *bufp++; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_multi_io_2(bsh + ofs, bufp, count); + else { + while (count-- > 0) + ia64_st2((void *)(bsh + ofs), *bufp++); + } } static __inline void bus_space_write_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *bufp, size_t count) { - uint32_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bsp = *bufp++; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_multi_io_4(bsh + ofs, bufp, count); + else { + while (count-- > 0) + ia64_st4((void *)(bsh + ofs), *bufp++); + } } static __inline void bus_space_write_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *bufp, size_t count) { - uint64_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - while (count-- > 0) - *bsp = *bufp++; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_multi_io_8(bsh + ofs, bufp, count); + else { + while (count-- > 0) + ia64_st8((void *)(bsh + ofs), *bufp++); + } } @@ -355,16 +423,22 @@ bus_space_write_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, * data is written to the buffer passed by reference and read from successive * bus space addresses. Access is unordered. */ +void bus_space_read_region_io_1(u_long, uint8_t *, size_t); +void bus_space_read_region_io_2(u_long, uint16_t *, size_t); +void bus_space_read_region_io_4(u_long, uint32_t *, size_t); +void bus_space_read_region_io_8(u_long, uint64_t *, size_t); + static __inline void bus_space_read_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t *bufp, size_t count) { - uint8_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bufp++ = *bsp; - ofs += 1; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_region_io_1(bsh + ofs, bufp, count); + else { + uint8_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + *bufp++ = ia64_ld1(bsp++); } } @@ -372,12 +446,13 @@ static __inline void bus_space_read_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t *bufp, size_t count) { - uint16_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bufp++ = *bsp; - ofs += 2; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_region_io_2(bsh + ofs, bufp, count); + else { + uint16_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + *bufp++ = ia64_ld2(bsp++); } } @@ -385,12 +460,13 @@ static __inline void bus_space_read_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t *bufp, size_t count) { - uint32_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bufp++ = *bsp; - ofs += 4; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_region_io_4(bsh + ofs, bufp, count); + else { + uint32_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + *bufp++ = ia64_ld4(bsp++); } } @@ -398,12 +474,13 @@ static __inline void bus_space_read_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t *bufp, size_t count) { - uint64_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bufp++ = *bsp; - ofs += 8; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_read_region_io_8(bsh + ofs, bufp, count); + else { + uint64_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + *bufp++ = ia64_ld8(bsp++); } } @@ -414,16 +491,22 @@ bus_space_read_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, * data is read from the buffer passed by reference and written to successive * bus space addresses. Access is unordered. */ +void bus_space_write_region_io_1(u_long, const uint8_t *, size_t); +void bus_space_write_region_io_2(u_long, const uint16_t *, size_t); +void bus_space_write_region_io_4(u_long, const uint32_t *, size_t); +void bus_space_write_region_io_8(u_long, const uint64_t *, size_t); + static __inline void bus_space_write_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint8_t *bufp, size_t count) { - uint8_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = *bufp++; - ofs += 1; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_region_io_1(bsh + ofs, bufp, count); + else { + uint8_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st1(bsp++, *bufp++); } } @@ -431,12 +514,13 @@ static __inline void bus_space_write_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint16_t *bufp, size_t count) { - uint16_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = *bufp++; - ofs += 2; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_region_io_2(bsh + ofs, bufp, count); + else { + uint16_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st2(bsp++, *bufp++); } } @@ -444,12 +528,13 @@ static __inline void bus_space_write_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint32_t *bufp, size_t count) { - uint32_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = *bufp++; - ofs += 4; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_region_io_4(bsh + ofs, bufp, count); + else { + uint32_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st4(bsp++, *bufp++); } } @@ -457,12 +542,13 @@ static __inline void bus_space_write_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, const uint64_t *bufp, size_t count) { - uint64_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = *bufp++; - ofs += 8; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_write_region_io_8(bsh + ofs, bufp, count); + else { + uint64_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st8(bsp++, *bufp++); } } @@ -476,44 +562,36 @@ static __inline void bus_space_set_multi_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t count) { - uint8_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); + while (count-- > 0) - *bsp = val; + bus_space_write_1(bst, bsh, ofs, val); } static __inline void bus_space_set_multi_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t count) { - uint16_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); + while (count-- > 0) - *bsp = val; + bus_space_write_2(bst, bsh, ofs, val); } static __inline void bus_space_set_multi_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t count) { - uint32_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); + while (count-- > 0) - *bsp = val; + bus_space_write_4(bst, bsh, ofs, val); } static __inline void bus_space_set_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t count) { - uint64_t __volatile *bsp; - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); + while (count-- > 0) - *bsp = val; + bus_space_write_8(bst, bsh, ofs, val); } @@ -523,16 +601,22 @@ bus_space_set_multi_8(bus_space_tag_t bst, bus_space_handle_t bsh, * data is passed by value and written to successive bus space addresses. * Writes are unordered. */ +void bus_space_set_region_io_1(u_long, uint8_t, size_t); +void bus_space_set_region_io_2(u_long, uint16_t, size_t); +void bus_space_set_region_io_4(u_long, uint32_t, size_t); +void bus_space_set_region_io_8(u_long, uint64_t, size_t); + static __inline void bus_space_set_region_1(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint8_t val, size_t count) { - uint8_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; - ofs += 1; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_set_region_io_1(bsh + ofs, val, count); + else { + uint8_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st1(bsp++, val); } } @@ -540,12 +624,13 @@ static __inline void bus_space_set_region_2(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint16_t val, size_t count) { - uint16_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; - ofs += 2; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_set_region_io_2(bsh + ofs, val, count); + else { + uint16_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st2(bsp++, val); } } @@ -553,12 +638,13 @@ static __inline void bus_space_set_region_4(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint32_t val, size_t count) { - uint32_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; - ofs += 4; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_set_region_io_4(bsh + ofs, val, count); + else { + uint32_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st4(bsp++, val); } } @@ -566,12 +652,13 @@ static __inline void bus_space_set_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, bus_size_t ofs, uint64_t val, size_t count) { - uint64_t __volatile *bsp; - while (count-- > 0) { - bsp = (bst == IA64_BUS_SPACE_IO) ? __PIO_ADDR(bsh + ofs) : - __MEMIO_ADDR(bsh + ofs); - *bsp = val; - ofs += 8; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) + bus_space_set_region_io_4(bsh + ofs, val, count); + else { + uint64_t *bsp = (void *)(bsh + ofs); + while (count-- > 0) + ia64_st8(bsp++, val); } } @@ -583,159 +670,104 @@ bus_space_set_region_8(bus_space_tag_t bst, bus_space_handle_t bsh, * The data is read from successive bus space addresses and also written to * successive bus space addresses. Both reads and writes are unordered. */ +void bus_space_copy_region_io_1(u_long, u_long, size_t); +void bus_space_copy_region_io_2(u_long, u_long, size_t); +void bus_space_copy_region_io_4(u_long, u_long, size_t); +void bus_space_copy_region_io_8(u_long, u_long, size_t); + static __inline void -bus_space_copy_region_1(bus_space_tag_t bst, bus_space_handle_t bsh1, - bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, size_t count) +bus_space_copy_region_1(bus_space_tag_t bst, bus_space_handle_t sbsh, + bus_size_t sofs, bus_space_handle_t dbsh, bus_size_t dofs, size_t count) { - bus_addr_t dst, src; - uint8_t __volatile *dstp, *srcp; - src = bsh1 + ofs1; - dst = bsh2 + ofs2; - if (dst > src) { + uint8_t *dst, *src; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) { + bus_space_copy_region_io_1(sbsh + sofs, dbsh + dofs, count); + return; + } + + src = (void *)(sbsh + sofs); + dst = (void *)(dbsh + dofs); + if (src < dst) { src += count - 1; dst += count - 1; - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src -= 1; - dst -= 1; - } + while (count-- > 0) + ia64_st1(dst--, ia64_ld1(src--)); } else { - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src += 1; - dst += 1; - } + while (count-- > 0) + ia64_st1(dst++, ia64_ld1(src++)); } } static __inline void -bus_space_copy_region_2(bus_space_tag_t bst, bus_space_handle_t bsh1, - bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, size_t count) +bus_space_copy_region_2(bus_space_tag_t bst, bus_space_handle_t sbsh, + bus_size_t sofs, bus_space_handle_t dbsh, bus_size_t dofs, size_t count) { - bus_addr_t dst, src; - uint16_t __volatile *dstp, *srcp; - src = bsh1 + ofs1; - dst = bsh2 + ofs2; - if (dst > src) { - src += (count - 1) << 1; - dst += (count - 1) << 1; - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src -= 2; - dst -= 2; - } + uint16_t *dst, *src; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) { + bus_space_copy_region_io_2(sbsh + sofs, dbsh + dofs, count); + return; + } + + src = (void *)(sbsh + sofs); + dst = (void *)(dbsh + dofs); + if (src < dst) { + src += count - 1; + dst += count - 1; + while (count-- > 0) + ia64_st2(dst--, ia64_ld2(src--)); } else { - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src += 2; - dst += 2; - } + while (count-- > 0) + ia64_st2(dst++, ia64_ld2(src++)); } } static __inline void -bus_space_copy_region_4(bus_space_tag_t bst, bus_space_handle_t bsh1, - bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, size_t count) +bus_space_copy_region_4(bus_space_tag_t bst, bus_space_handle_t sbsh, + bus_size_t sofs, bus_space_handle_t dbsh, bus_size_t dofs, size_t count) { - bus_addr_t dst, src; - uint32_t __volatile *dstp, *srcp; - src = bsh1 + ofs1; - dst = bsh2 + ofs2; - if (dst > src) { - src += (count - 1) << 2; - dst += (count - 1) << 2; - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src -= 4; - dst -= 4; - } + uint32_t *dst, *src; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) { + bus_space_copy_region_io_4(sbsh + sofs, dbsh + dofs, count); + return; + } + + src = (void *)(sbsh + sofs); + dst = (void *)(dbsh + dofs); + if (src < dst) { + src += count - 1; + dst += count - 1; + while (count-- > 0) + ia64_st4(dst--, ia64_ld4(src--)); } else { - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src += 4; - dst += 4; - } + while (count-- > 0) + ia64_st4(dst++, ia64_ld4(src++)); } } static __inline void -bus_space_copy_region_8(bus_space_tag_t bst, bus_space_handle_t bsh1, - bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, size_t count) +bus_space_copy_region_8(bus_space_tag_t bst, bus_space_handle_t sbsh, + bus_size_t sofs, bus_space_handle_t dbsh, bus_size_t dofs, size_t count) { - bus_addr_t dst, src; - uint64_t __volatile *dstp, *srcp; - src = bsh1 + ofs1; - dst = bsh2 + ofs2; - if (dst > src) { - src += (count - 1) << 3; - dst += (count - 1) << 3; - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src -= 8; - dst -= 8; - } + uint64_t *dst, *src; + + if (__predict_false(bst == IA64_BUS_SPACE_IO)) { + bus_space_copy_region_io_8(sbsh + sofs, dbsh + dofs, count); + return; + } + + src = (void *)(sbsh + sofs); + dst = (void *)(dbsh + dofs); + if (src < dst) { + src += count - 1; + dst += count - 1; + while (count-- > 0) + ia64_st8(dst--, ia64_ld8(src--)); } else { - while (count-- > 0) { - if (bst == IA64_BUS_SPACE_IO) { - srcp = __PIO_ADDR(src); - dstp = __PIO_ADDR(dst); - } else { - srcp = __MEMIO_ADDR(src); - dstp = __MEMIO_ADDR(dst); - } - *dstp = *srcp; - src += 8; - dst += 8; - } + while (count-- > 0) + ia64_st8(dst++, ia64_ld8(src++)); } } @@ -744,86 +776,51 @@ bus_space_copy_region_8(bus_space_tag_t bst, bus_space_handle_t bsh1, * Stream accesses are the same as normal accesses on ia64; there are no * supported bus systems with an endianess different from the host one. */ -#define bus_space_read_stream_1(t, h, o) \ - bus_space_read_1(t, h, o) -#define bus_space_read_stream_2(t, h, o) \ - bus_space_read_2(t, h, o) -#define bus_space_read_stream_4(t, h, o) \ - bus_space_read_4(t, h, o) -#define bus_space_read_stream_8(t, h, o) \ - bus_space_read_8(t, h, o) -#define bus_space_read_multi_stream_1(t, h, o, a, c) \ - bus_space_read_multi_1(t, h, o, a, c) -#define bus_space_read_multi_stream_2(t, h, o, a, c) \ - bus_space_read_multi_2(t, h, o, a, c) -#define bus_space_read_multi_stream_4(t, h, o, a, c) \ - bus_space_read_multi_4(t, h, o, a, c) -#define bus_space_read_multi_stream_8(t, h, o, a, c) \ - bus_space_read_multi_8(t, h, o, a, c) +#define bus_space_read_stream_1 bus_space_read_1 +#define bus_space_read_stream_2 bus_space_read_2 +#define bus_space_read_stream_4 bus_space_read_4 +#define bus_space_read_stream_8 bus_space_read_8 -#define bus_space_write_stream_1(t, h, o, v) \ - bus_space_write_1(t, h, o, v) -#define bus_space_write_stream_2(t, h, o, v) \ - bus_space_write_2(t, h, o, v) -#define bus_space_write_stream_4(t, h, o, v) \ - bus_space_write_4(t, h, o, v) -#define bus_space_write_stream_8(t, h, o, v) \ - bus_space_write_8(t, h, o, v) +#define bus_space_write_stream_1 bus_space_write_1 +#define bus_space_write_stream_2 bus_space_write_2 +#define bus_space_write_stream_4 bus_space_write_4 +#define bus_space_write_stream_8 bus_space_write_8 -#define bus_space_write_multi_stream_1(t, h, o, a, c) \ - bus_space_write_multi_1(t, h, o, a, c) -#define bus_space_write_multi_stream_2(t, h, o, a, c) \ - bus_space_write_multi_2(t, h, o, a, c) -#define bus_space_write_multi_stream_4(t, h, o, a, c) \ - bus_space_write_multi_4(t, h, o, a, c) -#define bus_space_write_multi_stream_8(t, h, o, a, c) \ - bus_space_write_multi_8(t, h, o, a, c) +#define bus_space_read_multi_stream_1 bus_space_read_multi_1 +#define bus_space_read_multi_stream_2 bus_space_read_multi_2 +#define bus_space_read_multi_stream_4 bus_space_read_multi_4 +#define bus_space_read_multi_stream_8 bus_space_read_multi_8 -#define bus_space_set_multi_stream_1(t, h, o, v, c) \ - bus_space_set_multi_1(t, h, o, v, c) -#define bus_space_set_multi_stream_2(t, h, o, v, c) \ - bus_space_set_multi_2(t, h, o, v, c) -#define bus_space_set_multi_stream_4(t, h, o, v, c) \ - bus_space_set_multi_4(t, h, o, v, c) -#define bus_space_set_multi_stream_8(t, h, o, v, c) \ - bus_space_set_multi_8(t, h, o, v, c) +#define bus_space_write_multi_stream_1 bus_space_write_multi_1 +#define bus_space_write_multi_stream_2 bus_space_write_multi_2 +#define bus_space_write_multi_stream_4 bus_space_write_multi_4 +#define bus_space_write_multi_stream_8 bus_space_write_multi_8 -#define bus_space_read_region_stream_1(t, h, o, a, c) \ - bus_space_read_region_1(t, h, o, a, c) -#define bus_space_read_region_stream_2(t, h, o, a, c) \ - bus_space_read_region_2(t, h, o, a, c) -#define bus_space_read_region_stream_4(t, h, o, a, c) \ - bus_space_read_region_4(t, h, o, a, c) -#define bus_space_read_region_stream_8(t, h, o, a, c) \ - bus_space_read_region_8(t, h, o, a, c) +#define bus_space_read_region_stream_1 bus_space_read_region_1 +#define bus_space_read_region_stream_2 bus_space_read_region_2 +#define bus_space_read_region_stream_4 bus_space_read_region_4 +#define bus_space_read_region_stream_8 bus_space_read_region_8 -#define bus_space_write_region_stream_1(t, h, o, a, c) \ - bus_space_write_region_1(t, h, o, a, c) -#define bus_space_write_region_stream_2(t, h, o, a, c) \ - bus_space_write_region_2(t, h, o, a, c) -#define bus_space_write_region_stream_4(t, h, o, a, c) \ - bus_space_write_region_4(t, h, o, a, c) -#define bus_space_write_region_stream_8(t, h, o, a, c) \ - bus_space_write_region_8(t, h, o, a, c) +#define bus_space_write_region_stream_1 bus_space_write_region_1 +#define bus_space_write_region_stream_2 bus_space_write_region_2 +#define bus_space_write_region_stream_4 bus_space_write_region_4 +#define bus_space_write_region_stream_8 bus_space_write_region_8 -#define bus_space_set_region_stream_1(t, h, o, v, c) \ - bus_space_set_region_1(t, h, o, v, c) -#define bus_space_set_region_stream_2(t, h, o, v, c) \ - bus_space_set_region_2(t, h, o, v, c) -#define bus_space_set_region_stream_4(t, h, o, v, c) \ - bus_space_set_region_4(t, h, o, v, c) -#define bus_space_set_region_stream_8(t, h, o, v, c) \ - bus_space_set_region_8(t, h, o, v, c) +#define bus_space_set_multi_stream_1 bus_space_set_multi_1 +#define bus_space_set_multi_stream_2 bus_space_set_multi_2 +#define bus_space_set_multi_stream_4 bus_space_set_multi_4 +#define bus_space_set_multi_stream_8 bus_space_set_multi_8 -#define bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_1(t, h1, o1, h2, o2, c) -#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_2(t, h1, o1, h2, o2, c) -#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_4(t, h1, o1, h2, o2, c) -#define bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_8(t, h1, o1, h2, o2, c) +#define bus_space_set_region_stream_1 bus_space_set_region_1 +#define bus_space_set_region_stream_2 bus_space_set_region_2 +#define bus_space_set_region_stream_4 bus_space_set_region_4 +#define bus_space_set_region_stream_8 bus_space_set_region_8 + +#define bus_space_copy_region_stream_1 bus_space_copy_region_1 +#define bus_space_copy_region_stream_2 bus_space_copy_region_2 +#define bus_space_copy_region_stream_4 bus_space_copy_region_4 +#define bus_space_copy_region_stream_8 bus_space_copy_region_8 #include diff --git a/sys/ia64/include/clock.h b/sys/ia64/include/clock.h index aa4220aa128c..772fc2a29ed3 100644 --- a/sys/ia64/include/clock.h +++ b/sys/ia64/include/clock.h @@ -14,7 +14,6 @@ #define CLOCK_VECTOR 254 extern uint64_t ia64_clock_reload; -extern uint64_t itc_frequency; #endif diff --git a/sys/ia64/include/cpufunc.h b/sys/ia64/include/cpufunc.h index 339bd95801a5..9ae06a2253d2 100644 --- a/sys/ia64/include/cpufunc.h +++ b/sys/ia64/include/cpufunc.h @@ -54,132 +54,6 @@ breakpoint(void) #define HAVE_INLINE_FFS #define ffs(x) __builtin_ffs(x) -#define __MEMIO_ADDR(x) (__volatile void*)(IA64_PHYS_TO_RR6(x)) -extern __volatile void *ia64_ioport_address(u_int); -#define __PIO_ADDR(x) ia64_ioport_address(x) - -/* - * I/O port reads with ia32 semantics. - */ -static __inline uint8_t -inb(unsigned int port) -{ - __volatile uint8_t *p; - uint8_t v; - p = __PIO_ADDR(port); - ia64_mf(); - v = *p; - ia64_mf_a(); - ia64_mf(); - return (v); -} - -static __inline uint16_t -inw(unsigned int port) -{ - __volatile uint16_t *p; - uint16_t v; - p = __PIO_ADDR(port); - ia64_mf(); - v = *p; - ia64_mf_a(); - ia64_mf(); - return (v); -} - -static __inline uint32_t -inl(unsigned int port) -{ - volatile uint32_t *p; - uint32_t v; - p = __PIO_ADDR(port); - ia64_mf(); - v = *p; - ia64_mf_a(); - ia64_mf(); - return (v); -} - -static __inline void -insb(unsigned int port, void *addr, size_t count) -{ - uint8_t *buf = addr; - while (count--) - *buf++ = inb(port); -} - -static __inline void -insw(unsigned int port, void *addr, size_t count) -{ - uint16_t *buf = addr; - while (count--) - *buf++ = inw(port); -} - -static __inline void -insl(unsigned int port, void *addr, size_t count) -{ - uint32_t *buf = addr; - while (count--) - *buf++ = inl(port); -} - -static __inline void -outb(unsigned int port, uint8_t data) -{ - volatile uint8_t *p; - p = __PIO_ADDR(port); - ia64_mf(); - *p = data; - ia64_mf_a(); - ia64_mf(); -} - -static __inline void -outw(unsigned int port, uint16_t data) -{ - volatile uint16_t *p; - p = __PIO_ADDR(port); - ia64_mf(); - *p = data; - ia64_mf_a(); - ia64_mf(); -} - -static __inline void -outl(unsigned int port, uint32_t data) -{ - volatile uint32_t *p; - p = __PIO_ADDR(port); - ia64_mf(); - *p = data; - ia64_mf_a(); - ia64_mf(); -} - -static __inline void -outsb(unsigned int port, const void *addr, size_t count) -{ - const uint8_t *buf = addr; - while (count--) - outb(port, *buf++); -} - -static __inline void -outsw(unsigned int port, const void *addr, size_t count) -{ - const uint16_t *buf = addr; - while (count--) - outw(port, *buf++); -} - -static __inline void -outsl(unsigned int port, const void *addr, size_t count) -{ - const uint32_t *buf = addr; - while (count--) - outl(port, *buf++); -} static __inline void disable_intr(void) diff --git a/sys/ia64/include/efi.h b/sys/ia64/include/efi.h index fe0052367f33..53ff11750c41 100644 --- a/sys/ia64/include/efi.h +++ b/sys/ia64/include/efi.h @@ -158,6 +158,9 @@ void efi_get_time(struct efi_tm *); struct efi_md *efi_md_first(void); struct efi_md *efi_md_next(struct efi_md *); void efi_reset_system(void); -efi_status efi_set_time(struct efi_tm *); +int efi_set_time(struct efi_tm *); +int efi_var_get(efi_char *, struct uuid *, uint32_t *, size_t *, void *); +int efi_var_nextname(size_t *, efi_char *, struct uuid *); +int efi_var_set(efi_char *, struct uuid *, uint32_t, size_t, void *); #endif /* _MACHINE_EFI_H_ */ diff --git a/sys/ia64/include/elf.h b/sys/ia64/include/elf.h index 65802aa20f11..c6a43fcdc170 100644 --- a/sys/ia64/include/elf.h +++ b/sys/ia64/include/elf.h @@ -141,4 +141,6 @@ __ElfType(Auxinfo); #define DT_IA_64_PLT_RESERVE 0x70000000 +#define ET_DYN_LOAD_ADDR 0x2500000000000000 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/ia64/include/ia64_cpu.h b/sys/ia64/include/ia64_cpu.h index 3d6c725c150f..0a5a1154aeb6 100644 --- a/sys/ia64/include/ia64_cpu.h +++ b/sys/ia64/include/ia64_cpu.h @@ -281,6 +281,74 @@ ia64_ptc_l(u_int64_t va, u_int64_t log2size) __asm __volatile("ptc.l %0,%1;; srlz.i;;" :: "r"(va), "r"(log2size)); } +/* + * Unordered memory load. + */ + +static __inline uint8_t +ia64_ld1(uint8_t *p) +{ + uint8_t v; + + __asm __volatile("ld1 %0=[%1];;" : "=r"(v) : "r"(p)); + return (v); +} + +static __inline uint16_t +ia64_ld2(uint16_t *p) +{ + uint16_t v; + + __asm __volatile("ld2 %0=[%1];;" : "=r"(v) : "r"(p)); + return (v); +} + +static __inline uint32_t +ia64_ld4(uint32_t *p) +{ + uint32_t v; + + __asm __volatile("ld4 %0=[%1];;" : "=r"(v) : "r"(p)); + return (v); +} + +static __inline uint64_t +ia64_ld8(uint64_t *p) +{ + uint64_t v; + + __asm __volatile("ld8 %0=[%1];;" : "=r"(v) : "r"(p)); + return (v); +} + +/* + * Unordered memory store. + */ + +static __inline void +ia64_st1(uint8_t *p, uint8_t v) +{ + __asm __volatile("st1 [%0]=%1;;" :: "r"(p), "r"(v)); +} + +static __inline void +ia64_st2(uint16_t *p, uint16_t v) +{ + __asm __volatile("st2 [%0]=%1;;" :: "r"(p), "r"(v)); +} + +static __inline void +ia64_st4(uint32_t *p, uint32_t v) +{ + __asm __volatile("st4 [%0]=%1;;" :: "r"(p), "r"(v)); +} + +static __inline void +ia64_st8(uint64_t *p, uint64_t v) +{ + __asm __volatile("st8 [%0]=%1;;" :: "r"(p), "r"(v)); +} + /* * Read the value of psr. */ diff --git a/sys/ia64/include/intr.h b/sys/ia64/include/intr.h index 7d59ef217d61..0635e3409f53 100644 --- a/sys/ia64/include/intr.h +++ b/sys/ia64/include/intr.h @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2007-2010 Marcel Moolenaar * Copyright (c) 1998 Doug Rabson * All rights reserved. * @@ -27,29 +28,40 @@ */ #ifndef _MACHINE_INTR_H_ -#define _MACHINE_INTR_H_ +#define _MACHINE_INTR_H_ + +struct sapic; /* * Layout of the Processor Interrupt Block. */ -struct ia64_interrupt_block +struct ia64_pib { - u_int64_t ib_ipi[0x20000]; /* 1Mb of IPI interrupts */ - u_int8_t ib_reserved1[0xe0000]; - u_int8_t ib_inta; /* Generate INTA cycle */ - u_int8_t ib_reserved2[7]; - u_int8_t ib_xtp; /* XTP cycle */ - u_int8_t ib_reserved3[7]; - u_int8_t ib_reserved4[0x1fff0]; + uint64_t ib_ipi[65536][2]; /* 64K-way IPIs (1MB area). */ + uint8_t _rsvd1[0xe0000]; + uint8_t ib_inta; /* Generate INTA cycle. */ + uint8_t _rsvd2[7]; + uint8_t ib_xtp; /* External Task Priority. */ + uint8_t _rsvd3[7]; + uint8_t _rsvd4[0x1fff0]; }; -extern u_int64_t ia64_lapic_address; +extern struct ia64_pib *ia64_pib; -#define IA64_INTERRUPT_BLOCK \ - (struct ia64_interrupt_block *)IA64_PHYS_TO_RR6(ia64_lapic_address) +int ia64_setup_intr(const char *, int, driver_filter_t, driver_intr_t, + void *, enum intr_type, void **); +int ia64_teardown_intr(void *); -int ia64_setup_intr(const char *name, int irq, driver_filter_t filter, - driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep); -int ia64_teardown_intr(void *cookie); +int sapic_config_intr(u_int, enum intr_trigger, enum intr_polarity); +struct sapic *sapic_create(u_int, u_int, uint64_t); +int sapic_enable(struct sapic *, u_int, u_int); +void sapic_eoi(struct sapic *, u_int); +struct sapic *sapic_lookup(u_int, u_int *); +void sapic_mask(struct sapic *, u_int); +void sapic_unmask(struct sapic *, u_int); + +#ifdef DDB +void sapic_print(struct sapic *, u_int); +#endif #endif /* !_MACHINE_INTR_H_ */ diff --git a/sys/ia64/include/sapicvar.h b/sys/ia64/include/iodev.h similarity index 55% rename from sys/ia64/include/sapicvar.h rename to sys/ia64/include/iodev.h index 30a353cb6dd1..6d2ae19d36dc 100644 --- a/sys/ia64/include/sapicvar.h +++ b/sys/ia64/include/iodev.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2001 Doug Rabson + * Copyright (c) 2010 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,40 +26,44 @@ * $FreeBSD$ */ -#ifndef _MACHINE_SAPICVAR_H_ -#define _MACHINE_SAPICVAR_H_ +#ifndef _MACHINE_IODEV_H_ +#define _MACHINE_IODEV_H_ -struct sapic { - struct mtx sa_mtx; - vm_offset_t sa_registers; /* virtual address of sapic */ - u_int sa_id; /* I/O SAPIC Id */ - u_int sa_base; /* ACPI vector base */ - u_int sa_limit; /* last ACPI vector handled here */ +#include + +struct iodev_pio_req { + u_int access; +#define IODEV_PIO_READ 0 +#define IODEV_PIO_WRITE 1 + u_int port; + u_int width; + u_int val; }; -#define SAPIC_TRIGGER_EDGE 0 -#define SAPIC_TRIGGER_LEVEL 1 +#define IODEV_PIO _IOWR('I', 0, struct iodev_pio_req) -#define SAPIC_POLARITY_HIGH 0 -#define SAPIC_POLARITY_LOW 1 +struct iodev_efivar_req { + u_int access; +#define IODEV_EFIVAR_GETVAR 0 +#define IODEV_EFIVAR_NEXTNAME 1 +#define IODEV_EFIVAR_SETVAR 2 + u_int result; /* errno value */ + size_t namesize; + u_short *name; /* UCS-2 */ + struct uuid vendor; + uint32_t attrib; + size_t datasize; + void *data; +}; -#define SAPIC_DELMODE_FIXED 0 -#define SAPIC_DELMODE_LOWPRI 1 -#define SAPIC_DELMODE_PMI 2 -#define SAPIC_DELMODE_NMI 4 -#define SAPIC_DELMODE_INIT 5 -#define SAPIC_DELMODE_EXTINT 7 +#define IODEV_EFIVAR _IOWR('I', 1, struct iodev_efivar_req) -int sapic_config_intr(u_int irq, enum intr_trigger, enum intr_polarity); -struct sapic *sapic_create(u_int id, u_int base, uint64_t address); -int sapic_enable(struct sapic *sa, u_int irq, u_int vector); -void sapic_eoi(struct sapic *sa, u_int vector); -struct sapic *sapic_lookup(u_int irq); -void sapic_mask(struct sapic *sa, u_int irq); -void sapic_unmask(struct sapic *sa, u_int irq); +#ifdef _KERNEL + +d_open_t ioopen; +d_close_t ioclose; +d_ioctl_t ioioctl; -#ifdef DDB -void sapic_print(struct sapic *sa, u_int irq); #endif -#endif /* ! _MACHINE_SAPICVAR_H_ */ +#endif /* _MACHINE_IODEV_H_ */ diff --git a/sys/ia64/include/kdb.h b/sys/ia64/include/kdb.h index d8a12e037b4c..8a9cc3a1e3b3 100644 --- a/sys/ia64/include/kdb.h +++ b/sys/ia64/include/kdb.h @@ -33,7 +33,7 @@ #include #include -#define KDB_STOPPEDPCB(pc) (&(pc)->pc_pcb) +#define KDB_STOPPEDPCB(pc) (&(pc)->pc_md.pcb) static __inline void kdb_cpu_clear_singlestep(void) diff --git a/sys/ia64/include/mca.h b/sys/ia64/include/mca.h index 75831c76ceb3..94926d169150 100644 --- a/sys/ia64/include/mca.h +++ b/sys/ia64/include/mca.h @@ -39,6 +39,7 @@ struct mca_record_header { #define MCA_RH_ERROR_CORRECTED 2 uint8_t rh_flags; #define MCA_RH_FLAGS_PLATFORM_ID 0x01 /* Platform_id present. */ +#define MCA_RH_FLAGS_TIME_STAMP 0x02 /* Timestamp invalid. */ uint32_t rh_length; /* Size including header. */ uint8_t rh_time[8]; #define MCA_RH_TIME_SEC 0 diff --git a/sys/ia64/include/md_var.h b/sys/ia64/include/md_var.h index adc4725fcb40..9a2f92a53b2c 100644 --- a/sys/ia64/include/md_var.h +++ b/sys/ia64/include/md_var.h @@ -49,7 +49,7 @@ struct ia64_fdesc { #define IA64_CFM_RRB_FR(x) (((x) >> 25) & 0x7f) #define IA64_CFM_RRB_PR(x) (((x) >> 32) & 0x3f) -/* Concenience function (inline) to adjust backingstore pointers. */ +/* Convenience function (inline) to adjust backingstore pointers. */ static __inline uint64_t ia64_bsp_adjust(uint64_t bsp, int nslots) { @@ -60,22 +60,22 @@ ia64_bsp_adjust(uint64_t bsp, int nslots) #ifdef _KERNEL -extern char sigcode[]; -extern char esigcode[]; -extern int szsigcode; -extern long Maxmem; - struct _special; -struct fpreg; -struct reg; struct thread; struct trapframe; +/* + * Return value from ia64_init. Describes stack to switch to. + */ struct ia64_init_return { uint64_t bspstore; uint64_t sp; }; +extern uint64_t ia64_lapic_addr; + +extern long Maxmem; + void busdma_swi(void); int copyout_regstack(struct thread *, uint64_t *, uint64_t *); void cpu_mp_add(u_int, u_int, u_int); @@ -86,8 +86,11 @@ int ia64_emulate(struct trapframe *, struct thread *); int ia64_flush_dirty(struct thread *, struct _special *); uint64_t ia64_get_hcdp(void); int ia64_highfp_drop(struct thread *); +int ia64_highfp_enable(struct thread *, struct trapframe *); int ia64_highfp_save(struct thread *); +int ia64_highfp_save_ipi(void); struct ia64_init_return ia64_init(void); +u_int ia64_itc_freq(void); void ia64_probe_sapics(void); void ia64_sync_icache(vm_offset_t, vm_size_t); void interrupt(struct trapframe *); diff --git a/sys/ia64/include/param.h b/sys/ia64/include/param.h index 331af7aacf40..ba2629096bb1 100644 --- a/sys/ia64/include/param.h +++ b/sys/ia64/include/param.h @@ -59,7 +59,7 @@ #endif #if defined(SMP) || defined(KLD_MODULE) -#define MAXCPU 4 +#define MAXCPU 32 #else #define MAXCPU 1 #endif diff --git a/sys/ia64/include/pci_cfgreg.h b/sys/ia64/include/pci_cfgreg.h index b4d2702b54ee..a0bc6e1f9b58 100644 --- a/sys/ia64/include/pci_cfgreg.h +++ b/sys/ia64/include/pci_cfgreg.h @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Marcel Moolenaar * Copyright (c) 1997, Stefan Esser * All rights reserved. * @@ -24,9 +25,14 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ - * */ -extern int pci_cfgregopen(void); -extern u_int32_t pci_cfgregread(int bus, int slot, int func, int reg, int bytes); -extern void pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes); +#ifndef _MACHINE_PCI_CFGREG_H_ +#define _MACHINE_PCI_CFGREG_H_ + +int pci_cfgregopen(void); +uint32_t pci_cfgregread(int bus, int slot, int func, int reg, int len); +void pci_cfgregwrite(int bus, int slot, int func, int reg, uint32_t data, + int bytes); + +#endif /* _MACHINE_PCI_CFGREG_H_ */ diff --git a/sys/ia64/include/pcpu.h b/sys/ia64/include/pcpu.h index c63573b9992f..bc9fe0813d7c 100644 --- a/sys/ia64/include/pcpu.h +++ b/sys/ia64/include/pcpu.h @@ -30,16 +30,39 @@ #ifndef _MACHINE_PCPU_H_ #define _MACHINE_PCPU_H_ +#include #include +struct pcpu_stats { + u_long pcs_nasts; /* IPI_AST counter. */ + u_long pcs_nclks; /* Clock interrupt counter. */ + u_long pcs_nextints; /* ExtINT counter. */ + u_long pcs_nhighfps; /* IPI_HIGH_FP counter. */ + u_long pcs_nhwints; /* Hardware int. counter. */ + u_long pcs_npreempts; /* IPI_PREEMPT counter. */ + u_long pcs_nrdvs; /* IPI_RENDEZVOUS counter. */ + u_long pcs_nstops; /* IPI_STOP counter. */ + u_long pcs_nstrays; /* Stray interrupt counter. */ +}; + +struct pcpu_md { + struct pcb pcb; /* Used by IPI_STOP */ + struct pmap *current_pmap; /* active pmap */ + vm_offset_t vhpt; /* Address of VHPT */ + uint64_t lid; /* local CPU ID */ + uint64_t clock; /* Clock counter. */ + uint64_t clockadj; /* Clock adjust. */ + uint32_t awake:1; /* CPU is awake? */ + struct pcpu_stats stats; /* Interrupt stats. */ +#ifdef _KERNEL + struct sysctl_ctx_list sysctl_ctx; + struct sysctl_oid *sysctl_tree; +#endif +}; + #define PCPU_MD_FIELDS \ - struct pcb pc_pcb; /* Used by IPI_STOP */ \ - struct pmap *pc_current_pmap; /* active pmap */ \ - uint64_t pc_lid; /* local CPU ID */ \ - uint64_t pc_clock; /* Clock counter. */ \ - uint64_t pc_clockadj; /* Clock adjust. */ \ - uint32_t pc_awake:1; /* CPU is awake? */ \ - uint32_t pc_acpi_id /* ACPI CPU id. */ + uint32_t pc_acpi_id; /* ACPI CPU id. */ \ + struct pcpu_md pc_md /* MD fields. */ #ifdef _KERNEL diff --git a/sys/ia64/include/pmap.h b/sys/ia64/include/pmap.h index c6b975477a7c..44079c881295 100644 --- a/sys/ia64/include/pmap.h +++ b/sys/ia64/include/pmap.h @@ -76,7 +76,6 @@ struct pmap { struct mtx pm_mtx; TAILQ_HEAD(,pv_entry) pm_pvlist; /* list of mappings in pmap */ u_int32_t pm_rid[5]; /* base RID for pmap */ - int pm_active; /* active flag */ struct pmap_statistics pm_stats; /* pmap statistics */ }; @@ -125,13 +124,14 @@ extern int pmap_vhpt_log2size; #define pmap_unmapbios(va, sz) pmap_unmapdev(va, sz) vm_offset_t pmap_steal_memory(vm_size_t); +vm_offset_t pmap_alloc_vhpt(void); void pmap_bootstrap(void); void pmap_kenter(vm_offset_t va, vm_offset_t pa); vm_paddr_t pmap_kextract(vm_offset_t va); void pmap_kremove(vm_offset_t); void pmap_setdevram(unsigned long long basea, vm_offset_t sizea); int pmap_uses_prom_console(void); -void *pmap_mapdev(vm_offset_t, vm_size_t); +void *pmap_mapdev(vm_paddr_t, vm_size_t); void pmap_unmapdev(vm_offset_t, vm_size_t); unsigned *pmap_pte(pmap_t, vm_offset_t) __pure2; void pmap_set_opt (unsigned *); diff --git a/sys/ia64/include/proc.h b/sys/ia64/include/proc.h index 5cbc0bf89f52..6bf9c78c88b0 100644 --- a/sys/ia64/include/proc.h +++ b/sys/ia64/include/proc.h @@ -30,7 +30,6 @@ #define _MACHINE_PROC_H_ struct mdthread { - struct mtx md_highfp_mtx; int md_spinlock_count; /* (k) */ int md_saved_intr; /* (k) */ }; diff --git a/sys/ia64/include/sysarch.h b/sys/ia64/include/sysarch.h index a7f39de2ffe8..c46d100beea5 100644 --- a/sys/ia64/include/sysarch.h +++ b/sys/ia64/include/sysarch.h @@ -32,15 +32,6 @@ #ifndef _MACHINE_SYSARCH_H_ #define _MACHINE_SYSARCH_H_ -#define IA64_IORD 0 -#define IA64_IOWR 1 - -struct ia64_iodesc { - int port; - int width; - unsigned long val; -}; - #ifndef _KERNEL #include diff --git a/sys/ia64/include/vmparam.h b/sys/ia64/include/vmparam.h index 9e65ea8fa2fd..e040e9af8d72 100644 --- a/sys/ia64/include/vmparam.h +++ b/sys/ia64/include/vmparam.h @@ -132,7 +132,6 @@ #define IA64_RR_BASE(n) (((u_int64_t) (n)) << 61) #define IA64_RR_MASK(x) ((x) & ((1L << 61) - 1)) -#define IA64_PHYS_TO_RR6(x) ((x) | IA64_RR_BASE(6)) #define IA64_PHYS_TO_RR7(x) ((x) | IA64_RR_BASE(7)) /* diff --git a/sys/ia64/pci/pci_cfgreg.c b/sys/ia64/pci/pci_cfgreg.c index cef743b89f7a..4858d94b59f6 100644 --- a/sys/ia64/pci/pci_cfgreg.c +++ b/sys/ia64/pci/pci_cfgreg.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2010 Marcel Moolenaar * Copyright (c) 2001 Doug Rabson * All rights reserved. * @@ -30,35 +31,69 @@ #include #include -#define SAL_PCI_ADDRESS(bus, slot, func, reg) \ - (((bus) << 16) | ((slot) << 11) | ((func) << 8) | (reg)) +static u_long +pci_sal_address(int dom, int bus, int slot, int func, int reg) +{ + u_long addr; + + addr = ~0ul; + if (dom >= 0 && dom <= 255 && bus >= 0 && bus <= 255 && + slot >= 0 && slot <= 31 && func >= 0 && func <= 7 && + reg >= 0 && reg <= 255) { + addr = ((u_long)dom << 24) | ((u_long)bus << 16) | + ((u_long)slot << 11) | ((u_long)func << 8) | (u_long)reg; + } + return (addr); +} + +static int +pci_valid_access(int reg, int len) +{ + int ok; + + ok = ((len == 1 || len == 2 || len == 4) && (reg & (len - 1)) == 0) + ? 1 : 0; + return (ok); +} int pci_cfgregopen(void) { - return 1; + return (1); } -u_int32_t -pci_cfgregread(int bus, int slot, int func, int reg, int bytes) +uint32_t +pci_cfgregread(int bus, int slot, int func, int reg, int len) { struct ia64_sal_result res; + u_long addr; - res = ia64_sal_entry(SAL_PCI_CONFIG_READ, - SAL_PCI_ADDRESS(bus, slot, func, reg), - bytes, 0, 0, 0, 0, 0); + addr = pci_sal_address(0, bus, slot, func, reg); + if (addr == ~0ul) + return (~0); + + if (!pci_valid_access(reg, len)) + return (~0); + + res = ia64_sal_entry(SAL_PCI_CONFIG_READ, addr, len, 0, 0, 0, 0, 0); if (res.sal_status < 0) return (~0); - else - return (res.sal_result[0]); + + return (res.sal_result[0]); } void -pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes) +pci_cfgregwrite(int bus, int slot, int func, int reg, uint32_t data, int len) { struct ia64_sal_result res; + u_long addr; - res = ia64_sal_entry(SAL_PCI_CONFIG_WRITE, - SAL_PCI_ADDRESS(bus, slot, func, reg), - bytes, data, 0, 0, 0, 0); + addr = pci_sal_address(0, bus, slot, func, reg); + if (addr == ~0ul) + return; + + if (!pci_valid_access(reg, len)) + return; + + res = ia64_sal_entry(SAL_PCI_CONFIG_WRITE, addr, len, data, 0, 0, 0, 0); } diff --git a/sys/isa/pnp.c b/sys/isa/pnp.c index 6712f421acd6..83ae10d2d697 100644 --- a/sys/isa/pnp.c +++ b/sys/isa/pnp.c @@ -480,7 +480,7 @@ pnp_create_devices(device_t parent, pnp_id *p, int csn, } resinfo = resp; resp += PNP_SRES_LEN(tag); - scanning -= PNP_SRES_LEN(tag);; + scanning -= PNP_SRES_LEN(tag); switch (PNP_SRES_NUM(tag)) { case PNP_TAG_LOGICAL_DEVICE: diff --git a/sys/isa/vga_isa.c b/sys/isa/vga_isa.c index 3d7cd3ad9fd3..093e555f4573 100644 --- a/sys/isa/vga_isa.c +++ b/sys/isa/vga_isa.c @@ -59,6 +59,69 @@ __FBSDID("$FreeBSD$"); #include #include +static void +vga_suspend(device_t dev) +{ + vga_softc_t *sc; + int nbytes; + + sc = device_get_softc(dev); + + /* Save the video state across the suspend. */ + if (sc->state_buf != NULL) + goto save_palette; + nbytes = vidd_save_state(sc->adp, NULL, 0); + if (nbytes <= 0) + goto save_palette; + sc->state_buf = malloc(nbytes, M_TEMP, M_NOWAIT); + if (sc->state_buf == NULL) + goto save_palette; + if (bootverbose) + device_printf(dev, "saving %d bytes of video state\n", nbytes); + if (vidd_save_state(sc->adp, sc->state_buf, nbytes) != 0) { + device_printf(dev, "failed to save state (nbytes=%d)\n", + nbytes); + free(sc->state_buf, M_TEMP); + sc->state_buf = NULL; + } + +save_palette: + /* Save the color palette across the suspend. */ + if (sc->pal_buf != NULL) + return; + sc->pal_buf = malloc(256 * 3, M_TEMP, M_NOWAIT); + if (sc->pal_buf == NULL) + return; + if (bootverbose) + device_printf(dev, "saving color palette\n"); + if (vidd_save_palette(sc->adp, sc->pal_buf) != 0) { + device_printf(dev, "failed to save palette\n"); + free(sc->pal_buf, M_TEMP); + sc->pal_buf = NULL; + } +} + +static void +vga_resume(device_t dev) +{ + vga_softc_t *sc; + + sc = device_get_softc(dev); + + if (sc->state_buf != NULL) { + if (vidd_load_state(sc->adp, sc->state_buf) != 0) + device_printf(dev, "failed to reload state\n"); + free(sc->state_buf, M_TEMP); + sc->state_buf = NULL; + } + if (sc->pal_buf != NULL) { + if (vidd_load_palette(sc->adp, sc->pal_buf) != 0) + device_printf(dev, "failed to reload palette\n"); + free(sc->pal_buf, M_TEMP); + sc->pal_buf = NULL; + } +} + #define VGA_SOFTC(unit) \ ((vga_softc_t *)devclass_get_softc(isavga_devclass, unit)) @@ -103,9 +166,9 @@ isavga_probe(device_t dev) if (isa_get_vendorid(dev)) return (ENXIO); - device_set_desc(dev, "Generic ISA VGA"); error = vga_probe_unit(device_get_unit(dev), &adp, device_get_flags(dev)); if (error == 0) { + device_set_desc(dev, "Generic ISA VGA"); bus_set_resource(dev, SYS_RES_IOPORT, 0, adp.va_io_base, adp.va_io_size); bus_set_resource(dev, SYS_RES_MEMORY, 0, @@ -117,7 +180,7 @@ isavga_probe(device_t dev) isa_set_msize(dev, adp.va_mem_size); #endif } - return error; + return (error); } static int @@ -140,13 +203,13 @@ isavga_attach(device_t dev) error = vga_attach_unit(unit, sc, device_get_flags(dev)); if (error) - return error; + return (error); #ifdef FB_INSTALL_CDEV /* attach a virtual frame buffer device */ error = fb_attach(VGA_MKMINOR(unit), sc->adp, &isavga_cdevsw); if (error) - return error; + return (error); #endif /* FB_INSTALL_CDEV */ if (0 && bootverbose) @@ -157,57 +220,29 @@ isavga_attach(device_t dev) bus_generic_attach(dev); #endif - return 0; + return (0); } static int isavga_suspend(device_t dev) { - vga_softc_t *sc; - int err, nbytes; + int error; - sc = device_get_softc(dev); - err = bus_generic_suspend(dev); - if (err) - return (err); + error = bus_generic_suspend(dev); + if (error != 0) + return (error); + vga_suspend(dev); - /* Save the video state across the suspend. */ - if (sc->state_buf != NULL) { - free(sc->state_buf, M_TEMP); - sc->state_buf = NULL; - } - nbytes = vidd_save_state(sc->adp, NULL, 0); - if (nbytes <= 0) - return (0); - sc->state_buf = malloc(nbytes, M_TEMP, M_NOWAIT | M_ZERO); - if (sc->state_buf == NULL) - return (0); - if (bootverbose) - device_printf(dev, "saving %d bytes of video state\n", nbytes); - if (vidd_save_state(sc->adp, sc->state_buf, nbytes) != 0) { - device_printf(dev, "failed to save state (nbytes=%d)\n", - nbytes); - free(sc->state_buf, M_TEMP); - sc->state_buf = NULL; - } - return (0); + return (error); } static int isavga_resume(device_t dev) { - vga_softc_t *sc; - sc = device_get_softc(dev); - if (sc->state_buf != NULL) { - if (vidd_load_state(sc->adp, sc->state_buf) != 0) - device_printf(dev, "failed to reload state\n"); - free(sc->state_buf, M_TEMP); - sc->state_buf = NULL; - } + vga_resume(dev); - bus_generic_resume(dev); - return 0; + return (bus_generic_resume(dev)); } #ifdef FB_INSTALL_CDEV @@ -215,37 +250,39 @@ isavga_resume(device_t dev) static int isavga_open(struct cdev *dev, int flag, int mode, struct thread *td) { - return vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td); + return (vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td)); } static int isavga_close(struct cdev *dev, int flag, int mode, struct thread *td) { - return vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td); + return (vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td)); } static int isavga_read(struct cdev *dev, struct uio *uio, int flag) { - return vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag); + return (vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag)); } static int isavga_write(struct cdev *dev, struct uio *uio, int flag) { - return vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag); + return (vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag)); } static int isavga_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) { - return vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, td); + return (vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, td)); } static int -isavga_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot) +isavga_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { - return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, paddr, prot); + return (vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, paddr, prot, + memattr)); } #endif /* FB_INSTALL_CDEV */ @@ -268,3 +305,79 @@ static driver_t isavga_driver = { }; DRIVER_MODULE(vga, isa, isavga_driver, isavga_devclass, 0, 0); + +static devclass_t vgapm_devclass; + +static void +vgapm_identify(driver_t *driver, device_t parent) +{ + + if (device_get_flags(parent) != 0) + device_add_child(parent, "vgapm", 0); +} + +static int +vgapm_probe(device_t dev) +{ + + device_set_desc(dev, "VGA suspend/resume"); + device_quiet(dev); + + return (BUS_PROBE_DEFAULT); +} + +static int +vgapm_attach(device_t dev) +{ + + bus_generic_probe(dev); + bus_generic_attach(dev); + + return (0); +} + +static int +vgapm_suspend(device_t dev) +{ + device_t vga_dev; + int error; + + error = bus_generic_suspend(dev); + if (error != 0) + return (error); + vga_dev = devclass_get_device(isavga_devclass, 0); + if (vga_dev == NULL) + return (0); + vga_suspend(vga_dev); + + return (0); +} + +static int +vgapm_resume(device_t dev) +{ + device_t vga_dev; + + vga_dev = devclass_get_device(isavga_devclass, 0); + if (vga_dev != NULL) + vga_resume(vga_dev); + + return (bus_generic_resume(dev)); +} + +static device_method_t vgapm_methods[] = { + DEVMETHOD(device_identify, vgapm_identify), + DEVMETHOD(device_probe, vgapm_probe), + DEVMETHOD(device_attach, vgapm_attach), + DEVMETHOD(device_suspend, vgapm_suspend), + DEVMETHOD(device_resume, vgapm_resume), + { 0, 0 } +}; + +static driver_t vgapm_driver = { + "vgapm", + vgapm_methods, + 0 +}; + +DRIVER_MODULE(vgapm, vgapci, vgapm_driver, vgapm_devclass, 0, 0); diff --git a/sys/kern/bus_if.m b/sys/kern/bus_if.m index c1c0e348eb07..c0924c882ab7 100644 --- a/sys/kern/bus_if.m +++ b/sys/kern/bus_if.m @@ -509,7 +509,6 @@ METHOD int bind_intr { int _cpu; } DEFAULT bus_generic_bind_intr; - /** * @brief Allow (bus) drivers to specify the trigger mode and polarity * of the specified interrupt. @@ -526,6 +525,25 @@ METHOD int config_intr { enum intr_polarity _pol; } DEFAULT bus_generic_config_intr; +/** + * @brief Allow drivers to associate a description with an active + * interrupt handler. + * + * @param _dev the parent device of @p _child + * @param _child the device which allocated the resource + * @param _irq the resource representing the interrupt + * @param _cookie the cookie value returned when the interrupt + * was originally registered + * @param _descr the description to associate with the interrupt + */ +METHOD int describe_intr { + device_t _dev; + device_t _child; + struct resource *_irq; + void *_cookie; + const char *_descr; +} DEFAULT bus_generic_describe_intr; + /** * @brief Notify a (bus) driver about a child that the hints mechanism * believes it has discovered. diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index ba5833a5bd60..fa6ddaf286e0 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_core.h" #include #include @@ -58,6 +59,10 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include + +#include #include #include @@ -95,6 +100,12 @@ static boolean_t __elfN(check_note)(struct image_params *imgp, SYSCTL_NODE(_kern, OID_AUTO, __CONCAT(elf, __ELF_WORD_SIZE), CTLFLAG_RW, 0, ""); +#ifdef COMPRESS_USER_CORES +static int compress_core(gzFile, char *, char *, unsigned int, + struct thread * td); +#define CORE_BUF_SIZE (16 * 1024) +#endif + int __elfN(fallback_brand) = -1; SYSCTL_INT(__CONCAT(_kern_elf, __ELF_WORD_SIZE), OID_AUTO, fallback_brand, CTLFLAG_RW, &__elfN(fallback_brand), 0, @@ -180,8 +191,11 @@ __elfN(insert_brand_entry)(Elf_Brandinfo *entry) break; } } - if (i == MAX_BRANDS) + if (i == MAX_BRANDS) { + printf("WARNING: %s: could not insert brandinfo entry: %p\n", + __func__, entry); return (-1); + } return (0); } @@ -632,7 +646,8 @@ __elfN(load_file)(struct proc *p, const char *file, u_long *addr, } for (i = 0, numsegs = 0; i < hdr->e_phnum; i++) { - if (phdr[i].p_type == PT_LOAD) { /* Loadable segment */ + if (phdr[i].p_type == PT_LOAD && phdr[i].p_memsz != 0) { + /* Loadable segment */ prot = 0; if (phdr[i].p_flags & PF_X) prot |= VM_PROT_EXECUTE; @@ -684,9 +699,9 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) u_long text_size = 0, data_size = 0, total_size = 0; u_long text_addr = 0, data_addr = 0; u_long seg_size, seg_addr; - u_long addr, entry = 0, proghdr = 0; + u_long addr, baddr, et_dyn_addr, entry = 0, proghdr = 0; int32_t osrel = 0; - int error = 0, i; + int error = 0, i, n; const char *interp = NULL, *newinterp = NULL; Elf_Brandinfo *brand_info; char *path; @@ -715,14 +730,22 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) phdr = (const Elf_Phdr *)(imgp->image_header + hdr->e_phoff); if (!aligned(phdr, Elf_Addr)) return (ENOEXEC); + n = 0; + baddr = 0; for (i = 0; i < hdr->e_phnum; i++) { + if (phdr[i].p_type == PT_LOAD) { + if (n == 0) + baddr = phdr[i].p_vaddr; + n++; + continue; + } if (phdr[i].p_type == PT_INTERP) { /* Path to interpreter */ if (phdr[i].p_filesz > MAXPATHLEN || phdr[i].p_offset + phdr[i].p_filesz > PAGE_SIZE) return (ENOEXEC); interp = imgp->image_header + phdr[i].p_offset; - break; + continue; } } @@ -732,9 +755,19 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) hdr->e_ident[EI_OSABI]); return (ENOEXEC); } - if (hdr->e_type == ET_DYN && - (brand_info->flags & BI_CAN_EXEC_DYN) == 0) - return (ENOEXEC); + if (hdr->e_type == ET_DYN) { + if ((brand_info->flags & BI_CAN_EXEC_DYN) == 0) + return (ENOEXEC); + /* + * Honour the base load address from the dso if it is + * non-zero for some reason. + */ + if (baddr == 0) + et_dyn_addr = ET_DYN_LOAD_ADDR; + else + et_dyn_addr = 0; + } else + et_dyn_addr = 0; sv = brand_info->sysvec; if (interp != NULL && brand_info->interp_newpath != NULL) newinterp = brand_info->interp_newpath; @@ -761,6 +794,8 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) for (i = 0; i < hdr->e_phnum; i++) { switch (phdr[i].p_type) { case PT_LOAD: /* Loadable segment */ + if (phdr[i].p_memsz == 0) + break; prot = 0; if (phdr[i].p_flags & PF_X) prot |= VM_PROT_EXECUTE; @@ -780,7 +815,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) if ((error = __elfN(load_section)(vmspace, imgp->object, phdr[i].p_offset, - (caddr_t)(uintptr_t)phdr[i].p_vaddr, + (caddr_t)(uintptr_t)phdr[i].p_vaddr + et_dyn_addr, phdr[i].p_memsz, phdr[i].p_filesz, prot, sv->sv_pagesize)) != 0) return (error); @@ -794,11 +829,12 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) if (phdr[i].p_offset == 0 && hdr->e_phoff + hdr->e_phnum * hdr->e_phentsize <= phdr[i].p_filesz) - proghdr = phdr[i].p_vaddr + hdr->e_phoff; + proghdr = phdr[i].p_vaddr + hdr->e_phoff + + et_dyn_addr; - seg_addr = trunc_page(phdr[i].p_vaddr); + seg_addr = trunc_page(phdr[i].p_vaddr + et_dyn_addr); seg_size = round_page(phdr[i].p_memsz + - phdr[i].p_vaddr - seg_addr); + phdr[i].p_vaddr + et_dyn_addr - seg_addr); /* * Is this .text or .data? We can't use @@ -820,7 +856,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) phdr[i].p_memsz)) { text_size = seg_size; text_addr = seg_addr; - entry = (u_long)hdr->e_entry; + entry = (u_long)hdr->e_entry + et_dyn_addr; } else { data_size = seg_size; data_addr = seg_addr; @@ -828,7 +864,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) total_size += seg_size; break; case PT_PHDR: /* Program header table info */ - proghdr = phdr[i].p_vaddr; + proghdr = phdr[i].p_vaddr + et_dyn_addr; break; default: break; @@ -900,7 +936,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) return (error); } } else - addr = 0; + addr = et_dyn_addr; /* * Construct auxargs table (used by the fixup routine) @@ -978,16 +1014,38 @@ static void cb_put_phdr(vm_map_entry_t, void *); static void cb_size_segment(vm_map_entry_t, void *); static void each_writable_segment(struct thread *, segment_callback, void *); static int __elfN(corehdr)(struct thread *, struct vnode *, struct ucred *, - int, void *, size_t); + int, void *, size_t, gzFile); static void __elfN(puthdr)(struct thread *, void *, size_t *, int); static void __elfN(putnote)(void *, size_t *, const char *, int, const void *, size_t); +#ifdef COMPRESS_USER_CORES +extern int compress_user_cores; +extern int compress_user_cores_gzlevel; +#endif + +static int +core_output(struct vnode *vp, void *base, size_t len, off_t offset, + struct ucred *active_cred, struct ucred *file_cred, + struct thread *td, char *core_buf, gzFile gzfile) { + + int error; + if (gzfile) { +#ifdef COMPRESS_USER_CORES + error = compress_core(gzfile, base, core_buf, len, td); +#else + panic("shouldn't be here"); +#endif + } else { + error = vn_rdwr_inchunks(UIO_WRITE, vp, base, len, offset, + UIO_USERSPACE, IO_UNIT | IO_DIRECT, active_cred, file_cred, + NULL, td); + } + return (error); +} + int -__elfN(coredump)(td, vp, limit) - struct thread *td; - struct vnode *vp; - off_t limit; +__elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags) { struct ucred *cred = td->td_ucred; int error = 0; @@ -995,6 +1053,37 @@ __elfN(coredump)(td, vp, limit) void *hdr; size_t hdrsize; + gzFile gzfile = Z_NULL; + char *core_buf = NULL; +#ifdef COMPRESS_USER_CORES + char gzopen_flags[8]; + char *p; + int doing_compress = flags & IMGACT_CORE_COMPRESS; +#endif + + hdr = NULL; + +#ifdef COMPRESS_USER_CORES + if (doing_compress) { + p = gzopen_flags; + *p++ = 'w'; + if (compress_user_cores_gzlevel >= 0 && + compress_user_cores_gzlevel <= 9) + *p++ = '0' + compress_user_cores_gzlevel; + *p = 0; + gzfile = gz_open("", gzopen_flags, vp); + if (gzfile == Z_NULL) { + error = EFAULT; + goto done; + } + core_buf = malloc(CORE_BUF_SIZE, M_TEMP, M_WAITOK | M_ZERO); + if (!core_buf) { + error = ENOMEM; + goto done; + } + } +#endif + /* Size the program segments. */ seginfo.count = 0; seginfo.size = 0; @@ -1019,7 +1108,8 @@ __elfN(coredump)(td, vp, limit) if (hdr == NULL) { return (EINVAL); } - error = __elfN(corehdr)(td, vp, cred, seginfo.count, hdr, hdrsize); + error = __elfN(corehdr)(td, vp, cred, seginfo.count, hdr, hdrsize, + gzfile); /* Write the contents of all of the writable segments. */ if (error == 0) { @@ -1030,17 +1120,28 @@ __elfN(coredump)(td, vp, limit) php = (Elf_Phdr *)((char *)hdr + sizeof(Elf_Ehdr)) + 1; offset = hdrsize; for (i = 0; i < seginfo.count; i++) { - error = vn_rdwr_inchunks(UIO_WRITE, vp, - (caddr_t)(uintptr_t)php->p_vaddr, - php->p_filesz, offset, UIO_USERSPACE, - IO_UNIT | IO_DIRECT, cred, NOCRED, NULL, - curthread); + error = core_output(vp, (caddr_t)(uintptr_t)php->p_vaddr, + php->p_filesz, offset, cred, NOCRED, curthread, core_buf, gzfile); if (error != 0) break; offset += php->p_filesz; php++; } } + if (error) { + log(LOG_WARNING, + "Failed to write core file for process %s (error %d)\n", + curproc->p_comm, error); + } + +#ifdef COMPRESS_USER_CORES +done: +#endif + if (core_buf) + free(core_buf, M_TEMP); + if (gzfile) + gzclose(gzfile); + free(hdr, M_TEMP); return (error); @@ -1164,13 +1265,14 @@ each_writable_segment(td, func, closure) * the page boundary. */ static int -__elfN(corehdr)(td, vp, cred, numsegs, hdr, hdrsize) +__elfN(corehdr)(td, vp, cred, numsegs, hdr, hdrsize, gzfile) struct thread *td; struct vnode *vp; struct ucred *cred; int numsegs; size_t hdrsize; void *hdr; + gzFile gzfile; { size_t off; @@ -1179,10 +1281,26 @@ __elfN(corehdr)(td, vp, cred, numsegs, hdr, hdrsize) off = 0; __elfN(puthdr)(td, hdr, &off, numsegs); - /* Write it to the core file. */ - return (vn_rdwr_inchunks(UIO_WRITE, vp, hdr, hdrsize, (off_t)0, - UIO_SYSSPACE, IO_UNIT | IO_DIRECT, cred, NOCRED, NULL, - td)); + if (!gzfile) { + /* Write it to the core file. */ + return (vn_rdwr_inchunks(UIO_WRITE, vp, hdr, hdrsize, (off_t)0, + UIO_SYSSPACE, IO_UNIT | IO_DIRECT, cred, NOCRED, NULL, + td)); + } else { +#ifdef COMPRESS_USER_CORES + if (gzwrite(gzfile, hdr, hdrsize) != hdrsize) { + log(LOG_WARNING, + "Failed to compress core file header for process" + " %s.\n", curproc->p_comm); + return (EFAULT); + } + else { + return (0); + } +#else + panic("shouldn't be here"); +#endif + } } #if defined(COMPAT_IA32) && __ELF_WORD_SIZE == 32 @@ -1451,3 +1569,50 @@ static struct execsw __elfN(execsw) = { __XSTRING(__CONCAT(ELF, __ELF_WORD_SIZE)) }; EXEC_SET(__CONCAT(elf, __ELF_WORD_SIZE), __elfN(execsw)); + +#ifdef COMPRESS_USER_CORES +/* + * Compress and write out a core segment for a user process. + * + * 'inbuf' is the starting address of a VM segment in the process' address + * space that is to be compressed and written out to the core file. 'dest_buf' + * is a buffer in the kernel's address space. The segment is copied from + * 'inbuf' to 'dest_buf' first before being processed by the compression + * routine gzwrite(). This copying is necessary because the content of the VM + * segment may change between the compression pass and the crc-computation pass + * in gzwrite(). This is because realtime threads may preempt the UNIX kernel. + */ +static int +compress_core (gzFile file, char *inbuf, char *dest_buf, unsigned int len, + struct thread *td) +{ + int len_compressed; + int error = 0; + unsigned int chunk_len; + + while (len) { + chunk_len = (len > CORE_BUF_SIZE) ? CORE_BUF_SIZE : len; + copyin(inbuf, dest_buf, chunk_len); + len_compressed = gzwrite(file, dest_buf, chunk_len); + + EVENTHANDLER_INVOKE(app_coredump_progress, td, len_compressed); + + if ((unsigned int)len_compressed != chunk_len) { + log(LOG_WARNING, + "compress_core: length mismatch (0x%x returned, " + "0x%x expected)\n", len_compressed, chunk_len); + EVENTHANDLER_INVOKE(app_coredump_error, td, + "compress_core: length mismatch %x -> %x", + chunk_len, len_compressed); + error = EFAULT; + break; + } + inbuf += chunk_len; + len -= chunk_len; + if (ticks - PCPU_GET(switchticks) >= hogticks) + uio_yield(); + } + + return (error); +} +#endif /* COMPRESS_USER_CORES */ diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index abc16e17afec..f1508c897372 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -284,15 +284,28 @@ restart: *************************************************************************** */ static void -print_caddr_t(void *data __unused) +print_caddr_t(void *data) { printf("%s", (char *)data); } + +static void +print_version(void *data __unused) +{ + int len; + + /* Strip a trailing newline from version. */ + len = strlen(version); + while (len > 0 && version[len - 1] == '\n') + len--; + printf("%.*s %s\n", len, version, machine); +} + SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright); SYSINIT(trademark, SI_SUB_COPYRIGHT, SI_ORDER_SECOND, print_caddr_t, trademark); -SYSINIT(version, SI_SUB_COPYRIGHT, SI_ORDER_THIRD, print_caddr_t, version); +SYSINIT(version, SI_SUB_COPYRIGHT, SI_ORDER_THIRD, print_version, NULL); #ifdef WITNESS static char wit_warn[] = @@ -492,6 +505,11 @@ proc0_init(void *dummy __unused) pmap_pinit0(vmspace_pmap(&vmspace0)); p->p_vmspace = &vmspace0; vmspace0.vm_refcnt = 1; + + /* + * proc0 is not expected to enter usermode, so there is no special + * handling for sv_minuser here, like is done for exec_new_vmspace(). + */ vm_map_init(&vmspace0.vm_map, p->p_sysent->sv_minuser, p->p_sysent->sv_maxuser); vmspace0.vm_map.pmap = vmspace_pmap(&vmspace0); @@ -552,6 +570,19 @@ proc0_post(void *dummy __unused) } SYSINIT(p0post, SI_SUB_INTRINSIC_POST, SI_ORDER_FIRST, proc0_post, NULL); +static void +random_init(void *dummy __unused) +{ + + /* + * After CPU has been started we have some randomness on most + * platforms via get_cyclecount(). For platforms that don't + * we will reseed random(9) in proc0_post() as well. + */ + srandom(get_cyclecount()); +} +SYSINIT(random, SI_SUB_RANDOM, SI_ORDER_FIRST, random_init, NULL); + /* *************************************************************************** **** diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index bad34c1cbce5..1463aede6127 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 195458 2009-07-08 15:23:18Z trasz + * created from FreeBSD: head/sys/kern/syscalls.master 198508 2009-10-27 10:55:34Z kib */ #include "opt_compat.h" @@ -548,4 +548,13 @@ struct sysent sysent[] = { { AS(msgctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0 }, /* 511 = msgctl */ { AS(shmctl_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0 }, /* 512 = shmctl */ { AS(lpathconf_args), (sy_call_t *)lpathconf, AUE_LPATHCONF, NULL, 0, 0, 0 }, /* 513 = lpathconf */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 514 = cap_new */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 515 = cap_getrights */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 516 = cap_enter */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 517 = cap_getmode */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 518 = pdfork */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 519 = pdkill */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 520 = pdgetpid */ + { 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 }, /* 521 = pdwait */ + { AS(pselect_args), (sy_call_t *)pselect, AUE_SELECT, NULL, 0, 0, 0 }, /* 522 = pselect */ }; diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c index e95bc19152cb..2844103fa406 100644 --- a/sys/kern/kern_clock.c +++ b/sys/kern/kern_clock.c @@ -48,14 +48,16 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -159,6 +161,124 @@ sysctl_kern_cp_times(SYSCTL_HANDLER_ARGS) SYSCTL_PROC(_kern, OID_AUTO, cp_times, CTLTYPE_LONG|CTLFLAG_RD|CTLFLAG_MPSAFE, 0,0, sysctl_kern_cp_times, "LU", "per-CPU time statistics"); +#ifdef DEADLKRES +static int slptime_threshold = 1800; +static int blktime_threshold = 900; +static int sleepfreq = 3; + +static void +deadlkres(void) +{ + struct proc *p; + struct thread *td; + void *wchan; + int blkticks, slpticks, slptype, tryl, tticks; + + tryl = 0; + for (;;) { + blkticks = blktime_threshold * hz; + slpticks = slptime_threshold * hz; + + /* + * Avoid to sleep on the sx_lock in order to avoid a possible + * priority inversion problem leading to starvation. + * If the lock can't be held after 100 tries, panic. + */ + if (!sx_try_slock(&allproc_lock)) { + if (tryl > 100) + panic("%s: possible deadlock detected on allproc_lock\n", + __func__); + tryl++; + pause("allproc_lock deadlkres", sleepfreq * hz); + continue; + } + tryl = 0; + FOREACH_PROC_IN_SYSTEM(p) { + PROC_LOCK(p); + FOREACH_THREAD_IN_PROC(p, td) { + thread_lock(td); + if (TD_ON_LOCK(td)) { + + /* + * The thread should be blocked on a + * turnstile, simply check if the + * turnstile channel is in good state. + */ + MPASS(td->td_blocked != NULL); + tticks = ticks - td->td_blktick; + thread_unlock(td); + if (tticks > blkticks) { + + /* + * Accordingly with provided + * thresholds, this thread is + * stuck for too long on a + * turnstile. + */ + PROC_UNLOCK(p); + sx_sunlock(&allproc_lock); + panic("%s: possible deadlock detected for %p, blocked for %d ticks\n", + __func__, td, tticks); + } + } else if (TD_IS_SLEEPING(td)) { + + /* + * Check if the thread is sleeping on a + * lock, otherwise skip the check. + * Drop the thread lock in order to + * avoid a LOR with the sleepqueue + * spinlock. + */ + wchan = td->td_wchan; + tticks = ticks - td->td_slptick; + thread_unlock(td); + slptype = sleepq_type(wchan); + if ((slptype == SLEEPQ_SX || + slptype == SLEEPQ_LK) && + tticks > slpticks) { + + /* + * Accordingly with provided + * thresholds, this thread is + * stuck for too long on a + * sleepqueue. + */ + PROC_UNLOCK(p); + sx_sunlock(&allproc_lock); + panic("%s: possible deadlock detected for %p, blocked for %d ticks\n", + __func__, td, tticks); + } + } else + thread_unlock(td); + } + PROC_UNLOCK(p); + } + sx_sunlock(&allproc_lock); + + /* Sleep for sleepfreq seconds. */ + pause("deadlkres", sleepfreq * hz); + } +} + +static struct kthread_desc deadlkres_kd = { + "deadlkres", + deadlkres, + (struct thread **)NULL +}; + +SYSINIT(deadlkres, SI_SUB_CLOCKS, SI_ORDER_ANY, kthread_start, &deadlkres_kd); + +SYSCTL_NODE(_debug, OID_AUTO, deadlkres, CTLFLAG_RW, 0, "Deadlock resolver"); +SYSCTL_INT(_debug_deadlkres, OID_AUTO, slptime_threshold, CTLFLAG_RW, + &slptime_threshold, 0, + "Number of seconds within is valid to sleep on a sleepqueue"); +SYSCTL_INT(_debug_deadlkres, OID_AUTO, blktime_threshold, CTLFLAG_RW, + &blktime_threshold, 0, + "Number of seconds within is valid to block on a turnstile"); +SYSCTL_INT(_debug_deadlkres, OID_AUTO, sleepfreq, CTLFLAG_RW, &sleepfreq, 0, + "Number of seconds between any deadlock resolver thread run"); +#endif /* DEADLKRES */ + void read_cpu_time(long *cp_time) { diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index 8504e48d3e53..a2e292e40f04 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -63,7 +63,7 @@ static struct cdev *make_dev_credv(int flags, static struct cdev_priv_list cdevp_free_list = TAILQ_HEAD_INITIALIZER(cdevp_free_list); static SLIST_HEAD(free_cdevsw, cdevsw) cdevsw_gt_post_list = - SLIST_HEAD_INITIALIZER(); + SLIST_HEAD_INITIALIZER(cdevsw_gt_post_list); void dev_lock(void) @@ -302,7 +302,7 @@ static struct cdevsw dead_cdevsw = { #define no_read (d_read_t *)enodev #define no_write (d_write_t *)enodev #define no_ioctl (d_ioctl_t *)enodev -#define no_mmap (d_mmap2_t *)enodev +#define no_mmap (d_mmap_t *)enodev #define no_kqfilter (d_kqfilter_t *)enodev #define no_mmap_single (d_mmap_single_t *)enodev @@ -469,7 +469,7 @@ giant_kqfilter(struct cdev *dev, struct knote *kn) } static int -giant_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot, +giant_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr) { struct cdevsw *dsw; @@ -479,11 +479,8 @@ giant_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot, if (dsw == NULL) return (ENXIO); mtx_lock(&Giant); - if (dsw->d_gianttrick->d_flags & D_MMAP2) - retval = dsw->d_gianttrick->d_mmap2(dev, offset, paddr, nprot, - memattr); - else - retval = dsw->d_gianttrick->d_mmap(dev, offset, paddr, nprot); + retval = dsw->d_gianttrick->d_mmap(dev, offset, paddr, nprot, + memattr); mtx_unlock(&Giant); dev_relthread(dev); return (retval); @@ -595,8 +592,7 @@ prep_cdevsw(struct cdevsw *devsw) return; } - if (devsw->d_version != D_VERSION_01 && - devsw->d_version != D_VERSION_02) { + if (devsw->d_version != D_VERSION_03) { printf( "WARNING: Device driver \"%s\" has wrong version %s\n", devsw->d_name == NULL ? "???" : devsw->d_name, @@ -608,18 +604,16 @@ prep_cdevsw(struct cdevsw *devsw) devsw->d_ioctl = dead_ioctl; devsw->d_poll = dead_poll; devsw->d_mmap = dead_mmap; + devsw->d_mmap_single = dead_mmap_single; devsw->d_strategy = dead_strategy; devsw->d_dump = dead_dump; devsw->d_kqfilter = dead_kqfilter; } - if (devsw->d_version == D_VERSION_01) - devsw->d_mmap_single = NULL; if (devsw->d_flags & D_NEEDGIANT) { if (devsw->d_gianttrick == NULL) { memcpy(dsw2, devsw, sizeof *dsw2); devsw->d_gianttrick = dsw2; - devsw->d_flags |= D_MMAP2; dsw2 = NULL; } } @@ -640,7 +634,7 @@ prep_cdevsw(struct cdevsw *devsw) FIXUP(d_write, no_write, giant_write); FIXUP(d_ioctl, no_ioctl, giant_ioctl); FIXUP(d_poll, no_poll, giant_poll); - FIXUP(d_mmap2, no_mmap, giant_mmap); + FIXUP(d_mmap, no_mmap, giant_mmap); FIXUP(d_strategy, no_strategy, giant_strategy); FIXUP(d_kqfilter, no_kqfilter, giant_kqfilter); FIXUP(d_mmap_single, no_mmap_single, giant_mmap_single); @@ -655,7 +649,7 @@ prep_cdevsw(struct cdevsw *devsw) cdevsw_free_devlocked(dsw2); } -struct cdev * +static struct cdev * make_dev_credv(int flags, struct cdevsw *devsw, int unit, struct ucred *cr, uid_t uid, gid_t gid, int mode, const char *fmt, va_list ap) @@ -953,7 +947,8 @@ clone_setup(struct clonedevs **cdp) } int -clone_create(struct clonedevs **cdp, struct cdevsw *csw, int *up, struct cdev **dp, int extra) +clone_create(struct clonedevs **cdp, struct cdevsw *csw, int *up, + struct cdev **dp, int extra) { struct clonedevs *cd; struct cdev *dev, *ndev, *dl, *de; @@ -1124,6 +1119,7 @@ destroy_dev_sched_cbl(struct cdev *dev, void (*cb)(void *), void *arg) int destroy_dev_sched_cb(struct cdev *dev, void (*cb)(void *), void *arg) { + dev_lock(); return (destroy_dev_sched_cbl(dev, cb, arg)); } @@ -1131,6 +1127,7 @@ destroy_dev_sched_cb(struct cdev *dev, void (*cb)(void *), void *arg) int destroy_dev_sched(struct cdev *dev) { + return (destroy_dev_sched_cb(dev, NULL, NULL)); } diff --git a/sys/kern/kern_context.c b/sys/kern/kern_context.c index f951fca4da96..6628eb6b81df 100644 --- a/sys/kern/kern_context.c +++ b/sys/kern/kern_context.c @@ -89,10 +89,8 @@ setcontext(struct thread *td, struct setcontext_args *uap) if (ret == 0) { ret = set_mcontext(td, &uc.uc_mcontext); if (ret == 0) { - SIG_CANTMASK(uc.uc_sigmask); - PROC_LOCK(td->td_proc); - td->td_sigmask = uc.uc_sigmask; - PROC_UNLOCK(td->td_proc); + kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, + NULL, 0); } } } @@ -118,10 +116,8 @@ swapcontext(struct thread *td, struct swapcontext_args *uap) if (ret == 0) { ret = set_mcontext(td, &uc.uc_mcontext); if (ret == 0) { - SIG_CANTMASK(uc.uc_sigmask); - PROC_LOCK(td->td_proc); - td->td_sigmask = uc.uc_sigmask; - PROC_UNLOCK(td->td_proc); + kern_sigprocmask(td, SIG_SETMASK, + &uc.uc_sigmask, NULL, 0); } } } diff --git a/sys/kern/kern_cpu.c b/sys/kern/kern_cpu.c index 9f7f6156704d..4c4f961931fc 100644 --- a/sys/kern/kern_cpu.c +++ b/sys/kern/kern_cpu.c @@ -935,8 +935,10 @@ cpufreq_levels_sysctl(SYSCTL_HANDLER_ARGS) /* Get settings from the device and generate the output string. */ count = CF_MAX_LEVELS; levels = malloc(count * sizeof(*levels), M_TEMP, M_NOWAIT); - if (levels == NULL) + if (levels == NULL) { + sbuf_delete(&sb); return (ENOMEM); + } error = CPUFREQ_LEVELS(sc->dev, levels, &count); if (error) { if (error == E2BIG) @@ -974,8 +976,10 @@ cpufreq_settings_sysctl(SYSCTL_HANDLER_ARGS) /* Get settings from the device and generate the output string. */ set_count = MAX_SETTINGS; sets = malloc(set_count * sizeof(*sets), M_TEMP, M_NOWAIT); - if (sets == NULL) + if (sets == NULL) { + sbuf_delete(&sb); return (ENOMEM); + } error = CPUFREQ_DRV_SETTINGS(dev, sets, &set_count); if (error) goto out; diff --git a/sys/kern/kern_cpuset.c b/sys/kern/kern_cpuset.c index 91269e4aab3a..3bdb45e3bf7c 100644 --- a/sys/kern/kern_cpuset.c +++ b/sys/kern/kern_cpuset.c @@ -79,7 +79,7 @@ __FBSDID("$FreeBSD$"); * not. This means that anonymous sets are immutable because they may be * shared. To modify an anonymous set a new set is created with the desired * mask and the same parent as the existing anonymous set. This gives the - * illusion of each thread having a private mask.A + * illusion of each thread having a private mask. * * Via the syscall apis a user may ask to retrieve or modify the root, base, * or mask that is discovered via a pid, tid, or setid. Modifying a set @@ -87,7 +87,7 @@ __FBSDID("$FreeBSD$"); * Modifying a pid or tid's mask applies only to that tid but must still * exist within the assigned parent set. * - * A thread may not be assigned to a a group seperate from other threads in + * A thread may not be assigned to a group separate from other threads in * the process. This is to remove ambiguity when the setid is queried with * a pid argument. There is no other technical limitation. * @@ -98,7 +98,7 @@ __FBSDID("$FreeBSD$"); * * A simple application should not concern itself with sets at all and * rather apply masks to its own threads via CPU_WHICH_TID and a -1 id - * meaning 'curthread'. It may query availble cpus for that tid with a + * meaning 'curthread'. It may query available cpus for that tid with a * getaffinity call using (CPU_LEVEL_CPUSET, CPU_WHICH_PID, -1, ...). */ static uma_zone_t cpuset_zone; @@ -153,7 +153,7 @@ cpuset_refbase(struct cpuset *set) } /* - * Release a reference in a context where it is safe to allocte. + * Release a reference in a context where it is safe to allocate. */ void cpuset_rel(struct cpuset *set) @@ -752,7 +752,7 @@ cpuset_setproc_update_set(struct proc *p, struct cpuset *set) /* * This is called once the final set of system cpus is known. Modifies - * the root set and all children and mark the root readonly. + * the root set and all children and mark the root read-only. */ static void cpuset_init(void *arg) diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 91733db35d74..676de650524c 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -421,6 +421,8 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) struct vnode *vp; int error, flg, tmp; int vfslocked; + u_int old, new; + uint64_t bsize; vfslocked = 0; error = 0; @@ -686,6 +688,49 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg) vfslocked = 0; fdrop(fp, td); break; + + case F_RDAHEAD: + arg = arg ? 128 * 1024: 0; + /* FALLTHROUGH */ + case F_READAHEAD: + FILEDESC_SLOCK(fdp); + if ((fp = fdtofp(fd, fdp)) == NULL) { + FILEDESC_SUNLOCK(fdp); + error = EBADF; + break; + } + if (fp->f_type != DTYPE_VNODE) { + FILEDESC_SUNLOCK(fdp); + error = EBADF; + break; + } + fhold(fp); + FILEDESC_SUNLOCK(fdp); + if (arg != 0) { + vp = fp->f_vnode; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + error = vn_lock(vp, LK_SHARED); + if (error != 0) + goto readahead_vnlock_fail; + bsize = fp->f_vnode->v_mount->mnt_stat.f_iosize; + VOP_UNLOCK(vp, 0); + fp->f_seqcount = (arg + bsize - 1) / bsize; + do { + new = old = fp->f_flag; + new |= FRDAHEAD; + } while (!atomic_cmpset_rel_int(&fp->f_flag, old, new)); +readahead_vnlock_fail: + VFS_UNLOCK_GIANT(vfslocked); + vfslocked = 0; + } else { + do { + new = old = fp->f_flag; + new &= ~FRDAHEAD; + } while (!atomic_cmpset_rel_int(&fp->f_flag, old, new)); + } + fdrop(fp, td); + break; + default: error = EINVAL; break; diff --git a/sys/kern/kern_environment.c b/sys/kern/kern_environment.c index fc0039a56e52..73551f4b00d6 100644 --- a/sys/kern/kern_environment.c +++ b/sys/kern/kern_environment.c @@ -60,6 +60,8 @@ static MALLOC_DEFINE(M_KENV, "kenv", "kernel environment"); /* pointer to the static environment */ char *kern_envp; +static int env_len; +static int env_pos; static char *kernenv_next(char *); /* dynamic environment variables */ @@ -208,6 +210,14 @@ done: return (error); } +void +init_static_kenv(char *buf, size_t len) +{ + kern_envp = buf; + env_len = len; + env_pos = 0; +} + /* * Setup the dynamic kernel environment. */ @@ -336,6 +346,26 @@ testenv(const char *name) return (0); } +static int +setenv_static(const char *name, const char *value) +{ + int len; + + if (env_pos >= env_len) + return (-1); + + /* Check space for x=y and two nuls */ + len = strlen(name) + strlen(value); + if (len + 3 < env_len - env_pos) { + len = sprintf(&kern_envp[env_pos], "%s=%s", name, value); + env_pos += len+1; + kern_envp[env_pos] = '\0'; + return (0); + } else + return (-1); + +} + /* * Set an environment variable by name. */ @@ -345,6 +375,9 @@ setenv(const char *name, const char *value) char *buf, *cp, *oldenv; int namelen, vallen, i; + if (dynamic_kenv == 0 && env_len > 0) + return (setenv_static(name, value)); + KENV_CHECK; namelen = strlen(name) + 1; diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 86a950f9bd89..cb418fb09b85 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -279,7 +279,7 @@ static struct { { &proc_filtops }, /* EVFILT_PROC */ { &sig_filtops }, /* EVFILT_SIGNAL */ { &timer_filtops }, /* EVFILT_TIMER */ - { &file_filtops }, /* EVFILT_NETDEV */ + { &null_filtops }, /* former EVFILT_NETDEV */ { &fs_filtops }, /* EVFILT_FS */ { &null_filtops }, /* EVFILT_LIO */ { &user_filtops }, /* EVFILT_USER */ @@ -349,8 +349,10 @@ filt_procattach(struct knote *kn) if (p == NULL) return (ESRCH); - if ((error = p_cansee(curthread, p))) + if ((error = p_cansee(curthread, p))) { + PROC_UNLOCK(p); return (error); + } kn->kn_ptr.p_proc = p; kn->kn_flags |= EV_CLEAR; /* automatically set */ @@ -867,6 +869,7 @@ kqueue_add_filteropts(int filt, struct filterops *filtops) { int error; + error = 0; if (filt > 0 || filt + EVFILT_SYSCOUNT < 0) { printf( "trying to add a filterop that is out of range: %d is beyond %d\n", @@ -883,7 +886,7 @@ kqueue_add_filteropts(int filt, struct filterops *filtops) } mtx_unlock(&filterops_lock); - return (0); + return (error); } int @@ -1025,13 +1028,13 @@ findkn: /* knote is in the process of changing, wait for it to stablize. */ if (kn != NULL && (kn->kn_status & KN_INFLUX) == KN_INFLUX) { + KQ_GLOBAL_UNLOCK(&kq_global, haskqglobal); + kq->kq_state |= KQ_FLUXWAIT; + msleep(kq, &kq->kq_lock, PSOCK | PDROP, "kqflxwt", 0); if (fp != NULL) { fdrop(fp, td); fp = NULL; } - KQ_GLOBAL_UNLOCK(&kq_global, haskqglobal); - kq->kq_state |= KQ_FLUXWAIT; - msleep(kq, &kq->kq_lock, PSOCK | PDROP, "kqflxwt", 0); goto findkn; } @@ -1229,7 +1232,7 @@ kqueue_expand(struct kqueue *kq, struct filterops *fops, uintptr_t ident, size = kq->kq_knlistsize; while (size <= fd) size += KQEXTENT; - list = malloc(size * sizeof list, M_KQUEUE, mflag); + list = malloc(size * sizeof(*list), M_KQUEUE, mflag); if (list == NULL) return ENOMEM; KQ_LOCK(kq); @@ -1239,13 +1242,13 @@ kqueue_expand(struct kqueue *kq, struct filterops *fops, uintptr_t ident, } else { if (kq->kq_knlist != NULL) { bcopy(kq->kq_knlist, list, - kq->kq_knlistsize * sizeof list); + kq->kq_knlistsize * sizeof(*list)); free(kq->kq_knlist, M_KQUEUE); kq->kq_knlist = NULL; } bzero((caddr_t)list + - kq->kq_knlistsize * sizeof list, - (size - kq->kq_knlistsize) * sizeof list); + kq->kq_knlistsize * sizeof(*list), + (size - kq->kq_knlistsize) * sizeof(*list)); kq->kq_knlistsize = size; kq->kq_knlist = list; } diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index a90968f03681..dce624d484b0 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -122,6 +122,11 @@ u_long ps_arg_cache_limit = PAGE_SIZE / 16; SYSCTL_ULONG(_kern, OID_AUTO, ps_arg_cache_limit, CTLFLAG_RW, &ps_arg_cache_limit, 0, ""); +static int map_at_zero = 0; +TUNABLE_INT("security.bsd.map_at_zero", &map_at_zero); +SYSCTL_INT(_security_bsd, OID_AUTO, map_at_zero, CTLFLAG_RW, &map_at_zero, 0, + "Permit processes to map an object at virtual address 0."); + static int sysctl_kern_ps_strings(SYSCTL_HANDLER_ARGS) { @@ -321,7 +326,7 @@ do_execve(td, args, mac_p) struct ucred *newcred = NULL, *oldcred; struct uidinfo *euip; register_t *stack_base; - int error, len = 0, i; + int error, i; struct image_params image_params, *imgp; struct vattr attr; int (*img_first)(struct image_params *); @@ -597,18 +602,12 @@ interpret: execsigs(p); /* name this process - nameiexec(p, ndp) */ - if (args->fname) { - len = min(nd.ni_cnd.cn_namelen,MAXCOMLEN); - bcopy(nd.ni_cnd.cn_nameptr, p->p_comm, len); - } else { - if (vn_commname(binvp, p->p_comm, MAXCOMLEN + 1) == 0) - len = MAXCOMLEN; - else { - len = sizeof(fexecv_proc_title); - bcopy(fexecv_proc_title, p->p_comm, len); - } - } - p->p_comm[len] = 0; + bzero(p->p_comm, sizeof(p->p_comm)); + if (args->fname) + bcopy(nd.ni_cnd.cn_nameptr, p->p_comm, + min(nd.ni_cnd.cn_namelen, MAXCOMLEN)); + else if (vn_commname(binvp, p->p_comm, sizeof(p->p_comm)) != 0) + bcopy(fexecv_proc_title, p->p_comm, sizeof(fexecv_proc_title)); bcopy(p->p_comm, td->td_name, sizeof(td->td_name)); /* @@ -999,7 +998,7 @@ exec_new_vmspace(imgp, sv) int error; struct proc *p = imgp->proc; struct vmspace *vmspace = p->p_vmspace; - vm_offset_t stack_addr; + vm_offset_t sv_minuser, stack_addr; vm_map_t map; u_long ssiz; @@ -1015,13 +1014,17 @@ exec_new_vmspace(imgp, sv) * not disrupted */ map = &vmspace->vm_map; - if (vmspace->vm_refcnt == 1 && vm_map_min(map) == sv->sv_minuser && + if (map_at_zero) + sv_minuser = sv->sv_minuser; + else + sv_minuser = MAX(sv->sv_minuser, PAGE_SIZE); + if (vmspace->vm_refcnt == 1 && vm_map_min(map) == sv_minuser && vm_map_max(map) == sv->sv_maxuser) { shmexit(vmspace); pmap_remove_pages(vmspace_pmap(vmspace)); vm_map_remove(map, vm_map_min(map), vm_map_max(map)); } else { - error = vmspace_exec(p, sv->sv_minuser, sv->sv_maxuser); + error = vmspace_exec(p, sv_minuser, sv->sv_maxuser); if (error) return (error); vmspace = p->p_vmspace; diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 39b48e01bded..af00f420c260 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -316,6 +316,7 @@ exit1(struct thread *td, int rv) ttyvp = sp->s_ttyvp; tp = sp->s_ttyp; sp->s_ttyvp = NULL; + sp->s_ttydp = NULL; sp->s_leader = NULL; SESS_UNLOCK(sp); @@ -340,10 +341,10 @@ exit1(struct thread *td, int rv) if (ttyvp != NULL) { sx_xunlock(&proctree_lock); - vn_lock(ttyvp, LK_EXCLUSIVE | LK_RETRY); - if (ttyvp->v_type != VBAD) + if (vn_lock(ttyvp, LK_EXCLUSIVE) == 0) { VOP_REVOKE(ttyvp, REVOKEALL); - VOP_UNLOCK(ttyvp, 0); + VOP_UNLOCK(ttyvp, 0); + } sx_xlock(&proctree_lock); } } diff --git a/sys/kern/kern_fail.c b/sys/kern/kern_fail.c index 06dfc38c91c2..d7601a90a44e 100644 --- a/sys/kern/kern_fail.c +++ b/sys/kern/kern_fail.c @@ -452,7 +452,7 @@ parse_term(struct fail_point_entries *ents, char *p) } else if (*p == '*') { if (!units || decimal) return 0; - ent->fe_count = units;; + ent->fe_count = units; } else { return 0; @@ -497,7 +497,7 @@ parse_number(int *out_units, int *out_decimal, char *p) /* whole part */ old_p = p; - *out_units = strtol(p, &p, 10);; + *out_units = strtol(p, &p, 10); if (p == old_p && *p != '.') return 0; diff --git a/sys/kern/kern_gzio.c b/sys/kern/kern_gzio.c new file mode 100644 index 000000000000..1f9c387dffad --- /dev/null +++ b/sys/kern/kern_gzio.c @@ -0,0 +1,406 @@ +/* + * $Id: kern_gzio.c,v 1.6 2008-10-18 22:54:45 lbazinet Exp $ + * + * core_gzip.c -- gzip routines used in compressing user process cores + * + * This file is derived from src/lib/libz/gzio.c in FreeBSD. + */ + +/* gzio.c -- IO on .gz files + * Copyright (C) 1995-1998 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + */ + +/* @(#) $FreeBSD$ */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define GZ_HEADER_LEN 10 + +#ifndef Z_BUFSIZE +# ifdef MAXSEG_64K +# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ +# else +# define Z_BUFSIZE 16384 +# endif +#endif +#ifndef Z_PRINTF_BUFSIZE +# define Z_PRINTF_BUFSIZE 4096 +#endif + +#define ALLOC(size) malloc(size, M_TEMP, M_WAITOK | M_ZERO) +#define TRYFREE(p) {if (p) free(p, M_TEMP);} + +static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define RESERVED 0xE0 /* bits 5..7: reserved */ + +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + struct vnode *file; /* vnode pointer of .gz file */ + Byte *inbuf; /* input buffer */ + Byte *outbuf; /* output buffer */ + uLong crc; /* crc32 of uncompressed data */ + char *msg; /* error message */ + char *path; /* path name for debugging only */ + int transparent; /* 1 if input file is not a .gz file */ + char mode; /* 'w' or 'r' */ + long startpos; /* start of compressed data in file (header skipped) */ + off_t outoff; /* current offset in output file */ + int flags; +} gz_stream; + + +local int do_flush OF((gzFile file, int flush)); +local int destroy OF((gz_stream *s)); +local void putU32 OF((gz_stream *file, uint32_t x)); +local void *gz_alloc OF((void *notused, u_int items, u_int size)); +local void gz_free OF((void *notused, void *ptr)); + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb"). The file is given either by file descriptor + or path name (if fd == -1). + gz_open return NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +*/ +gzFile gz_open (path, mode, vp) + const char *path; + const char *mode; + struct vnode *vp; +{ + int err; + int level = Z_DEFAULT_COMPRESSION; /* compression level */ + int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ + const char *p = mode; + gz_stream *s; + char fmode[80]; /* copy of mode, without the compression level */ + char *m = fmode; + int resid; + int error; + char buf[GZ_HEADER_LEN + 1]; + + if (!path || !mode) return Z_NULL; + + s = (gz_stream *)ALLOC(sizeof(gz_stream)); + if (!s) return Z_NULL; + + s->stream.zalloc = (alloc_func)gz_alloc; + s->stream.zfree = (free_func)gz_free; + s->stream.opaque = (voidpf)0; + s->stream.next_in = s->inbuf = Z_NULL; + s->stream.next_out = s->outbuf = Z_NULL; + s->stream.avail_in = s->stream.avail_out = 0; + s->file = NULL; + s->z_err = Z_OK; + s->z_eof = 0; + s->crc = 0; + s->msg = NULL; + s->transparent = 0; + s->outoff = 0; + s->flags = 0; + + s->path = (char*)ALLOC(strlen(path)+1); + if (s->path == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + strcpy(s->path, path); /* do this early for debugging */ + + s->mode = '\0'; + do { + if (*p == 'r') s->mode = 'r'; + if (*p == 'w' || *p == 'a') s->mode = 'w'; + if (*p >= '0' && *p <= '9') { + level = *p - '0'; + } else if (*p == 'f') { + strategy = Z_FILTERED; + } else if (*p == 'h') { + strategy = Z_HUFFMAN_ONLY; + } else { + *m++ = *p; /* copy the mode */ + } + } while (*p++ && m != fmode + sizeof(fmode)); + + if (s->mode != 'w') { + log(LOG_ERR, "gz_open: mode is not w (%c)\n", s->mode); + return destroy(s), (gzFile)Z_NULL; + } + + err = deflateInit2(&(s->stream), level, + Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); + /* windowBits is passed < 0 to suppress zlib header */ + + s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); + if (err != Z_OK || s->outbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + + s->stream.avail_out = Z_BUFSIZE; + s->file = vp; + + /* Write a very simple .gz header: + */ + snprintf(buf, sizeof(buf), "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], + gz_magic[1], Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, + 0 /*xflags*/, OS_CODE); + + if ((error = vn_rdwr(UIO_WRITE, s->file, buf, GZ_HEADER_LEN, s->outoff, + UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, curproc->p_ucred, + NOCRED, &resid, curthread))) { + s->outoff += GZ_HEADER_LEN - resid; + return destroy(s), (gzFile)Z_NULL; + } + s->outoff += GZ_HEADER_LEN; + s->startpos = 10L; + + return (gzFile)s; +} + + + /* =========================================================================== + * Cleanup then free the given gz_stream. Return a zlib error code. + Try freeing in the reverse order of allocations. + */ +local int destroy (s) + gz_stream *s; +{ + int err = Z_OK; + + if (!s) return Z_STREAM_ERROR; + + TRYFREE(s->msg); + + if (s->stream.state != NULL) { + if (s->mode == 'w') { + err = deflateEnd(&(s->stream)); + } + } + if (s->z_err < 0) err = s->z_err; + + TRYFREE(s->inbuf); + TRYFREE(s->outbuf); + TRYFREE(s->path); + TRYFREE(s); + return err; +} + + +/* =========================================================================== + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of bytes actually written (0 in case of error). +*/ +int ZEXPORT gzwrite (file, buf, len) + gzFile file; + const voidp buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + off_t curoff; + size_t resid; + int error; + int vfslocked; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.next_in = (Bytef*)buf; + s->stream.avail_in = len; + + curoff = s->outoff; + while (s->stream.avail_in != 0) { + + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + vfslocked = VFS_LOCK_GIANT(s->file->v_mount); + error = vn_rdwr_inchunks(UIO_WRITE, s->file, s->outbuf, Z_BUFSIZE, + curoff, UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, + curproc->p_ucred, NOCRED, &resid, curthread); + VFS_UNLOCK_GIANT(vfslocked); + if (error) { + log(LOG_ERR, "gzwrite: vn_rdwr return %d\n", error); + curoff += Z_BUFSIZE - resid; + s->z_err = Z_ERRNO; + break; + } + curoff += Z_BUFSIZE; + s->stream.avail_out = Z_BUFSIZE; + } + s->z_err = deflate(&(s->stream), Z_NO_FLUSH); + if (s->z_err != Z_OK) { + log(LOG_ERR, + "gzwrite: deflate returned error %d\n", s->z_err); + break; + } + } + + s->crc = ~crc32_raw(buf, len, ~s->crc); + s->outoff = curoff; + + return (int)(len - s->stream.avail_in); +} + + +/* =========================================================================== + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. +*/ +local int do_flush (file, flush) + gzFile file; + int flush; +{ + uInt len; + int done = 0; + gz_stream *s = (gz_stream*)file; + off_t curoff = s->outoff; + size_t resid; + int vfslocked = 0; + int error; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + if (s->stream.avail_in) { + log(LOG_WARNING, "do_flush: avail_in non-zero on entry\n"); + } + + s->stream.avail_in = 0; /* should be zero already anyway */ + + for (;;) { + len = Z_BUFSIZE - s->stream.avail_out; + + if (len != 0) { + vfslocked = VFS_LOCK_GIANT(s->file->v_mount); + error = vn_rdwr_inchunks(UIO_WRITE, s->file, s->outbuf, len, curoff, + UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, curproc->p_ucred, + NOCRED, &resid, curthread); + VFS_UNLOCK_GIANT(vfslocked); + if (error) { + s->z_err = Z_ERRNO; + s->outoff = curoff + len - resid; + return Z_ERRNO; + } + s->stream.next_out = s->outbuf; + s->stream.avail_out = Z_BUFSIZE; + curoff += len; + } + if (done) break; + s->z_err = deflate(&(s->stream), flush); + + /* Ignore the second of two consecutive flushes: */ + if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; + + /* deflate has finished flushing only when it hasn't used up + * all the available space in the output buffer: + */ + done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); + + if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; + } + s->outoff = curoff; + + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} + +int ZEXPORT gzflush (file, flush) + gzFile file; + int flush; +{ + gz_stream *s = (gz_stream*)file; + int err = do_flush (file, flush); + + if (err) return err; + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} + + +/* =========================================================================== + Outputs a long in LSB order to the given file +*/ +local void putU32 (s, x) + gz_stream *s; + uint32_t x; +{ + uint32_t xx; + off_t curoff = s->outoff; + int resid; + +#if BYTE_ORDER == BIG_ENDIAN + xx = bswap32(x); +#else + xx = x; +#endif + vn_rdwr(UIO_WRITE, s->file, (caddr_t)&xx, sizeof(xx), curoff, + UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, curproc->p_ucred, + NOCRED, &resid, curthread); + s->outoff += sizeof(xx) - resid; +} + + +/* =========================================================================== + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. +*/ +int ZEXPORT gzclose (file) + gzFile file; +{ + int err; + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return Z_STREAM_ERROR; + + if (s->mode == 'w') { + err = do_flush (file, Z_FINISH); + if (err != Z_OK) { + log(LOG_ERR, "gzclose: do_flush failed (err %d)\n", err); + return destroy((gz_stream*)file); + } +#if 0 + printf("gzclose: putting crc: %lld total: %lld\n", + (long long)s->crc, (long long)s->stream.total_in); + printf("sizeof uLong = %d\n", (int)sizeof(uLong)); +#endif + putU32 (s, s->crc); + putU32 (s, (uint32_t) s->stream.total_in); + } + return destroy((gz_stream*)file); +} + +/* + * Space allocation and freeing routines for use by zlib routines when called + * from gzip modules. + */ +static void * +gz_alloc(void *notused __unused, u_int items, u_int size) +{ + void *ptr; + + MALLOC(ptr, void *, items * size, M_TEMP, M_NOWAIT | M_ZERO); + return ptr; +} + +static void +gz_free(void *opaque __unused, void *ptr) +{ + FREE(ptr, M_TEMP); +} + diff --git a/sys/kern/kern_idle.c b/sys/kern/kern_idle.c index 1d9b30297789..af12d7dcf5a9 100644 --- a/sys/kern/kern_idle.c +++ b/sys/kern/kern_idle.c @@ -74,10 +74,9 @@ idle_setup(void *dummy) if (error) panic("idle_setup: kproc_create error %d\n", error); - p->p_flag |= P_NOLOAD; thread_lock(td); TD_SET_CAN_RUN(td); - td->td_flags |= TDF_IDLETD; + td->td_flags |= TDF_IDLETD | TDF_NOLOAD; sched_class(td, PRI_IDLE); sched_prio(td, PRI_MAX_IDLE); thread_unlock(td); diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c index 3eb2c6ca3f88..105ea181cfac 100644 --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -524,7 +524,7 @@ intr_event_add_handler(struct intr_event *ie, const char *name, ih->ih_filter = filter; ih->ih_handler = handler; ih->ih_argument = arg; - ih->ih_name = name; + strlcpy(ih->ih_name, name, sizeof(ih->ih_name)); ih->ih_event = ie; ih->ih_pri = pri; if (flags & INTR_EXCL) @@ -597,7 +597,7 @@ intr_event_add_handler(struct intr_event *ie, const char *name, ih->ih_filter = filter; ih->ih_handler = handler; ih->ih_argument = arg; - ih->ih_name = name; + strlcpy(ih->ih_name, name, sizeof(ih->ih_name)); ih->ih_event = ie; ih->ih_pri = pri; if (flags & INTR_EXCL) @@ -664,6 +664,61 @@ intr_event_add_handler(struct intr_event *ie, const char *name, } #endif +/* + * Append a description preceded by a ':' to the name of the specified + * interrupt handler. + */ +int +intr_event_describe_handler(struct intr_event *ie, void *cookie, + const char *descr) +{ + struct intr_handler *ih; + size_t space; + char *start; + + mtx_lock(&ie->ie_lock); +#ifdef INVARIANTS + TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) { + if (ih == cookie) + break; + } + if (ih == NULL) { + mtx_unlock(&ie->ie_lock); + panic("handler %p not found in interrupt event %p", cookie, ie); + } +#endif + ih = cookie; + + /* + * Look for an existing description by checking for an + * existing ":". This assumes device names do not include + * colons. If one is found, prepare to insert the new + * description at that point. If one is not found, find the + * end of the name to use as the insertion point. + */ + start = index(ih->ih_name, ':'); + if (start == NULL) + start = index(ih->ih_name, 0); + + /* + * See if there is enough remaining room in the string for the + * description + ":". The "- 1" leaves room for the trailing + * '\0'. The "+ 1" accounts for the colon. + */ + space = sizeof(ih->ih_name) - (start - ih->ih_name) - 1; + if (strlen(descr) + 1 > space) { + mtx_unlock(&ie->ie_lock); + return (ENOSPC); + } + + /* Append a colon followed by the description. */ + *start = ':'; + strcpy(start + 1, descr); + intr_event_update(ie); + mtx_unlock(&ie->ie_lock); + return (0); +} + /* * Return the ie_source field from the intr_event an intr_handler is * associated with. @@ -1006,6 +1061,7 @@ int swi_add(struct intr_event **eventp, const char *name, driver_intr_t handler, void *arg, int pri, enum intr_type flags, void **cookiep) { + struct thread *td; struct intr_event *ie; int error; @@ -1030,11 +1086,10 @@ swi_add(struct intr_event **eventp, const char *name, driver_intr_t handler, if (error) return (error); if (pri == SWI_CLOCK) { - struct proc *p; - p = ie->ie_thread->it_thread->td_proc; - PROC_LOCK(p); - p->p_flag |= P_NOLOAD; - PROC_UNLOCK(p); + td = ie->ie_thread->it_thread; + thread_lock(td); + td->td_flags |= TDF_NOLOAD; + thread_unlock(td); } return (0); } @@ -1323,6 +1378,12 @@ intr_event_handle(struct intr_event *ie, struct trapframe *frame) ret = ih->ih_filter(frame); else ret = ih->ih_filter(ih->ih_argument); + KASSERT(ret == FILTER_STRAY || + ((ret & (FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) != 0 && + (ret & ~(FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) == 0), + ("%s: incorrect return value %#x from %s", __func__, ret, + ih->ih_name)); + /* * Wrapper handler special handling: * @@ -1491,7 +1552,11 @@ intr_filter_loop(struct intr_event *ie, struct trapframe *frame, thread_only = 1; continue; } - + KASSERT(ret == FILTER_STRAY || + ((ret & (FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) != 0 && + (ret & ~(FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) == 0), + ("%s: incorrect return value %#x from %s", __func__, ret, + ih->ih_name)); if (ret & FILTER_STRAY) continue; else { diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c index 0cc330cd5ad4..93fdfa9303bc 100644 --- a/sys/kern/kern_jail.c +++ b/sys/kern/kern_jail.c @@ -77,6 +77,21 @@ __FBSDID("$FreeBSD$"); MALLOC_DEFINE(M_PRISON, "prison", "Prison structures"); +/* Keep struct prison prison0 and some code in kern_jail_set() readable. */ +#ifdef INET +#ifdef INET6 +#define _PR_IP_SADDRSEL PR_IP4_SADDRSEL|PR_IP6_SADDRSEL +#else +#define _PR_IP_SADDRSEL PR_IP4_SADDRSEL +#endif +#else /* !INET */ +#ifdef INET6 +#define _PR_IP_SADDRSEL PR_IP6_SADDRSEL +#else +#define _PR_IP_SADDRSEL 0 +#endif +#endif + /* prison0 describes what is "real" about the system. */ struct prison prison0 = { .pr_id = 0, @@ -87,11 +102,11 @@ struct prison prison0 = { .pr_securelevel = -1, .pr_childmax = JAIL_MAX, .pr_hostuuid = DEFAULT_HOSTUUID, - .pr_children = LIST_HEAD_INITIALIZER(&prison0.pr_children), + .pr_children = LIST_HEAD_INITIALIZER(prison0.pr_children), #ifdef VIMAGE - .pr_flags = PR_HOST|PR_VNET, + .pr_flags = PR_HOST|PR_VNET|_PR_IP_SADDRSEL, #else - .pr_flags = PR_HOST, + .pr_flags = PR_HOST|_PR_IP_SADDRSEL, #endif .pr_allow = PR_ALLOW_ALL, }; @@ -129,10 +144,22 @@ static int prison_restrict_ip6(struct prison *pr, struct in6_addr *newip6); */ static char *pr_flag_names[] = { [0] = "persist", +#ifdef INET + [7] = "ip4.saddrsel", +#endif +#ifdef INET6 + [8] = "ip6.saddrsel", +#endif }; static char *pr_flag_nonames[] = { [0] = "nopersist", +#ifdef INET + [7] = "ip4.nosaddrsel", +#endif +#ifdef INET6 + [8] = "ip6.nosaddrsel", +#endif }; struct jailsys_flags { @@ -753,7 +780,9 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) * IP addresses are all sorted but ip[0] to preserve * the primary IP address as given from userland. * This special IP is used for unbound outgoing - * connections as well for "loopback" traffic. + * connections as well for "loopback" traffic in case + * source address selection cannot find any more fitting + * address to connect from. */ if (ip4s > 1) qsort(ip4 + 1, ip4s - 1, sizeof(*ip4), qcmp_v4); @@ -1197,6 +1226,9 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags) #endif } #endif + /* Source address selection is always on by default. */ + pr->pr_flags |= _PR_IP_SADDRSEL; + pr->pr_securelevel = ppr->pr_securelevel; pr->pr_allow = JAIL_DEFAULT_ALLOW & ppr->pr_allow; pr->pr_enforce_statfs = JAIL_DEFAULT_ENFORCE_STATFS; @@ -2656,6 +2688,41 @@ prison_get_ip4(struct ucred *cred, struct in_addr *ia) return (0); } +/* + * Return 1 if we should do proper source address selection or are not jailed. + * We will return 0 if we should bypass source address selection in favour + * of the primary jail IPv4 address. Only in this case *ia will be updated and + * returned in NBO. + * Return EAFNOSUPPORT, in case this jail does not allow IPv4. + */ +int +prison_saddrsel_ip4(struct ucred *cred, struct in_addr *ia) +{ + struct prison *pr; + struct in_addr lia; + int error; + + KASSERT(cred != NULL, ("%s: cred is NULL", __func__)); + KASSERT(ia != NULL, ("%s: ia is NULL", __func__)); + + if (!jailed(cred)) + return (1); + + pr = cred->cr_prison; + if (pr->pr_flags & PR_IP4_SADDRSEL) + return (1); + + lia.s_addr = INADDR_ANY; + error = prison_get_ip4(cred, &lia); + if (error) + return (error); + if (lia.s_addr == INADDR_ANY) + return (1); + + ia->s_addr = lia.s_addr; + return (0); +} + /* * Return true if pr1 and pr2 have the same IPv4 address restrictions. */ @@ -2961,6 +3028,41 @@ prison_get_ip6(struct ucred *cred, struct in6_addr *ia6) return (0); } +/* + * Return 1 if we should do proper source address selection or are not jailed. + * We will return 0 if we should bypass source address selection in favour + * of the primary jail IPv6 address. Only in this case *ia will be updated and + * returned in NBO. + * Return EAFNOSUPPORT, in case this jail does not allow IPv6. + */ +int +prison_saddrsel_ip6(struct ucred *cred, struct in6_addr *ia6) +{ + struct prison *pr; + struct in6_addr lia6; + int error; + + KASSERT(cred != NULL, ("%s: cred is NULL", __func__)); + KASSERT(ia6 != NULL, ("%s: ia6 is NULL", __func__)); + + if (!jailed(cred)) + return (1); + + pr = cred->cr_prison; + if (pr->pr_flags & PR_IP6_SADDRSEL) + return (1); + + lia6 = in6addr_any; + error = prison_get_ip6(cred, &lia6); + if (error) + return (error); + if (IN6_IS_ADDR_UNSPECIFIED(&lia6)) + return (1); + + bcopy(&lia6, ia6, sizeof(struct in6_addr)); + return (0); +} + /* * Return true if pr1 and pr2 have the same IPv6 address restrictions. */ @@ -3161,7 +3263,7 @@ prison_check_af(struct ucred *cred, int af) pr = cred->cr_prison; #ifdef VIMAGE /* Prisons with their own network stack are not limited. */ - if (pr->pr_flags & PR_VNET) + if (prison_owns_vnet(cred)) return (0); #endif @@ -3222,6 +3324,11 @@ prison_if(struct ucred *cred, struct sockaddr *sa) KASSERT(cred != NULL, ("%s: cred is NULL", __func__)); KASSERT(sa != NULL, ("%s: sa is NULL", __func__)); +#ifdef VIMAGE + if (prison_owns_vnet(cred)) + return (0); +#endif + error = 0; switch (sa->sa_family) { @@ -3278,6 +3385,24 @@ jailed(struct ucred *cred) return (cred->cr_prison != &prison0); } +/* + * Return 1 if the passed credential is in a jail and that jail does not + * have its own virtual network stack, otherwise 0. + */ +int +jailed_without_vnet(struct ucred *cred) +{ + + if (!jailed(cred)) + return (0); +#ifdef VIMAGE + if (prison_owns_vnet(cred)) + return (0); +#endif + + return (1); +} + /* * Return the correct hostname (domainname, et al) for the passed credential. */ @@ -3467,6 +3592,7 @@ prison_priv_check(struct ucred *cred, int priv) case PRIV_NET_SETIFMTU: case PRIV_NET_SETIFFLAGS: case PRIV_NET_SETIFCAP: + case PRIV_NET_SETIFDESCR: case PRIV_NET_SETIFNAME : case PRIV_NET_SETIFMETRIC: case PRIV_NET_SETIFPHYS: @@ -4091,12 +4217,18 @@ SYSCTL_JAIL_PARAM_SYS_NODE(ip4, CTLFLAG_RDTUN, "Jail IPv4 address virtualization"); SYSCTL_JAIL_PARAM_STRUCT(_ip4, addr, CTLFLAG_RW, sizeof(struct in_addr), "S,in_addr,a", "Jail IPv4 addresses"); +SYSCTL_JAIL_PARAM(_ip4, saddrsel, CTLTYPE_INT | CTLFLAG_RW, + "B", "Do (not) use IPv4 source address selection rather than the " + "primary jail IPv4 address."); #endif #ifdef INET6 SYSCTL_JAIL_PARAM_SYS_NODE(ip6, CTLFLAG_RDTUN, "Jail IPv6 address virtualization"); SYSCTL_JAIL_PARAM_STRUCT(_ip6, addr, CTLFLAG_RW, sizeof(struct in6_addr), "S,in6_addr,a", "Jail IPv6 addresses"); +SYSCTL_JAIL_PARAM(_ip6, saddrsel, CTLTYPE_INT | CTLFLAG_RW, + "B", "Do (not) use IPv6 source address selection rather than the " + "primary jail IPv6 address."); #endif SYSCTL_JAIL_PARAM_NODE(allow, "Jail permission flags"); @@ -4144,10 +4276,11 @@ db_show_prison(struct prison *pr) #endif db_printf(" root = %p\n", pr->pr_root); db_printf(" securelevel = %d\n", pr->pr_securelevel); - db_printf(" childcount = %d\n", pr->pr_childcount); + db_printf(" children.max = %d\n", pr->pr_childmax); + db_printf(" children.cur = %d\n", pr->pr_childcount); db_printf(" child = %p\n", LIST_FIRST(&pr->pr_children)); db_printf(" sibling = %p\n", LIST_NEXT(pr, pr_sibling)); - db_printf(" flags = %x", pr->pr_flags); + db_printf(" flags = 0x%x", pr->pr_flags); for (fi = 0; fi < sizeof(pr_flag_names) / sizeof(pr_flag_names[0]); fi++) if (pr_flag_names[fi] != NULL && (pr->pr_flags & (1 << fi))) @@ -4162,7 +4295,7 @@ db_show_prison(struct prison *pr) : (jsf == pr_flag_jailsys[fi].new) ? "new" : "inherit"); } - db_printf(" allow = %x", pr->pr_allow); + db_printf(" allow = 0x%x", pr->pr_allow); for (fi = 0; fi < sizeof(pr_allow_names) / sizeof(pr_allow_names[0]); fi++) if (pr_allow_names[fi] != NULL && (pr->pr_allow & (1 << fi))) @@ -4177,14 +4310,14 @@ db_show_prison(struct prison *pr) db_printf(" ip4s = %d\n", pr->pr_ip4s); for (ii = 0; ii < pr->pr_ip4s; ii++) db_printf(" %s %s\n", - ii == 0 ? "ip4 =" : " ", + ii == 0 ? "ip4.addr =" : " ", inet_ntoa(pr->pr_ip4[ii])); #endif #ifdef INET6 db_printf(" ip6s = %d\n", pr->pr_ip6s); for (ii = 0; ii < pr->pr_ip6s; ii++) db_printf(" %s %s\n", - ii == 0 ? "ip6 =" : " ", + ii == 0 ? "ip6.addr =" : " ", ip6_sprintf(ip6buf, &pr->pr_ip6[ii])); #endif } diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index 3c5248ebbb6e..341707a8e659 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -312,18 +312,17 @@ kthread_exit(void) { struct proc *p; + p = curthread->td_proc; + /* A module may be waiting for us to exit. */ wakeup(curthread); - - /* - * We could rely on thread_exit to call exit1() but - * there is extra work that needs to be done - */ - if (curthread->td_proc->p_numthreads == 1) - kproc_exit(0); /* never returns */ - - p = curthread->td_proc; PROC_LOCK(p); + if (p->p_numthreads == 1) { + PROC_UNLOCK(p); + kproc_exit(0); + + /* NOTREACHED. */ + } PROC_SLOCK(p); thread_exit(); } @@ -335,34 +334,55 @@ kthread_exit(void) int kthread_suspend(struct thread *td, int timo) { - if ((td->td_pflags & TDP_KTHREAD) == 0) { + struct proc *p; + + p = td->td_proc; + + /* + * td_pflags should not be read by any thread other than + * curthread, but as long as this flag is invariant during the + * thread's lifetime, it is OK to check its state. + */ + if ((td->td_pflags & TDP_KTHREAD) == 0) return (EINVAL); - } + + /* + * The caller of the primitive should have already checked that the + * thread is up and running, thus not being blocked by other + * conditions. + */ + PROC_LOCK(p); thread_lock(td); td->td_flags |= TDF_KTH_SUSP; thread_unlock(td); - /* - * If it's stopped for some other reason, - * kick it to notice our request - * or we'll end up timing out - */ - wakeup(td); /* traditional place for kernel threads to sleep on */ /* XXX ?? */ - return (tsleep(&td->td_flags, PPAUSE | PDROP, "suspkt", timo)); + return (msleep(&td->td_flags, &p->p_mtx, PPAUSE | PDROP, "suspkt", + timo)); } /* - * let the kthread it can keep going again. + * Resume a thread previously put asleep with kthread_suspend(). */ int kthread_resume(struct thread *td) { - if ((td->td_pflags & TDP_KTHREAD) == 0) { + struct proc *p; + + p = td->td_proc; + + /* + * td_pflags should not be read by any thread other than + * curthread, but as long as this flag is invariant during the + * thread's lifetime, it is OK to check its state. + */ + if ((td->td_pflags & TDP_KTHREAD) == 0) return (EINVAL); - } + + PROC_LOCK(p); thread_lock(td); td->td_flags &= ~TDF_KTH_SUSP; thread_unlock(td); - wakeup(&td->td_name); + wakeup(&td->td_flags); + PROC_UNLOCK(p); return (0); } @@ -371,15 +391,28 @@ kthread_resume(struct thread *td) * and notify the caller that is has happened. */ void -kthread_suspend_check(struct thread *td) +kthread_suspend_check() { + struct proc *p; + struct thread *td; + + td = curthread; + p = td->td_proc; + + if ((td->td_pflags & TDP_KTHREAD) == 0) + panic("%s: curthread is not a valid kthread", __func__); + + /* + * As long as the double-lock protection is used when accessing the + * TDF_KTH_SUSP flag, synchronizing the read operation via proc mutex + * is fine. + */ + PROC_LOCK(p); while (td->td_flags & TDF_KTH_SUSP) { - /* - * let the caller know we got the message then sleep - */ wakeup(&td->td_flags); - tsleep(&td->td_name, PPAUSE, "ktsusp", 0); + msleep(&td->td_flags, &p->p_mtx, PPAUSE, "ktsusp", 0); } + PROC_UNLOCK(p); } int diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 7506b6f67543..2182ff7857f6 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -256,6 +256,10 @@ ktrace_resize_pool(u_int newsize) return (ktr_requestpool); } +/* ktr_getrequest() assumes that ktr_comm[] is the same size as td_name[]. */ +CTASSERT(sizeof(((struct ktr_header *)NULL)->ktr_comm) == + (sizeof((struct thread *)NULL)->td_name)); + static struct ktr_request * ktr_getrequest(int type) { @@ -283,7 +287,8 @@ ktr_getrequest(int type) microtime(&req->ktr_header.ktr_time); req->ktr_header.ktr_pid = p->p_pid; req->ktr_header.ktr_tid = td->td_tid; - bcopy(td->td_name, req->ktr_header.ktr_comm, MAXCOMLEN + 1); + bcopy(td->td_name, req->ktr_header.ktr_comm, + sizeof(req->ktr_header.ktr_comm)); req->ktr_buffer = NULL; req->ktr_header.ktr_len = 0; } else { diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 9387ba8ea97b..dd293023494c 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -64,6 +64,8 @@ __FBSDID("$FreeBSD$"); #ifdef KLD_DEBUG int kld_debug = 0; +SYSCTL_INT(_debug, OID_AUTO, kld_debug, CTLFLAG_RW, + &kld_debug, 0, "Set various levels of KLD debug"); #endif #define KLD_LOCK() sx_xlock(&kld_sx) @@ -632,7 +634,7 @@ linker_file_unload(linker_file_t file, int flags) */ if ((error = module_unload(mod)) != 0) { KLD_DPF(FILE, ("linker_file_unload: module %s" - " failed unload\n", mod)); + " failed unload\n", module_getname(mod))); return (error); } MOD_XLOCK; @@ -709,6 +711,9 @@ linker_file_add_dependency(linker_file_t file, linker_file_t dep) file->deps = newdeps; file->deps[file->ndeps] = dep; file->ndeps++; + KLD_DPF(FILE, ("linker_file_add_dependency:" + " adding %s as dependency for %s\n", + dep->filename, file->filename)); return (0); } diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c index e6f2f5362494..18bbf9a46cf5 100644 --- a/sys/kern/kern_lock.c +++ b/sys/kern/kern_lock.c @@ -197,6 +197,8 @@ sleeplk(struct lock *lk, u_int flags, struct lock_object *ilk, if (flags & LK_INTERLOCK) class->lc_unlock(ilk); + if (queue == SQ_EXCLUSIVE_QUEUE && (flags & LK_SLEEPFAIL) != 0) + lk->lk_exslpfail++; GIANT_SAVE(); sleepq_add(&lk->lock_object, NULL, wmesg, SLEEPQ_LK | (catch ? SLEEPQ_INTERRUPTIBLE : 0), queue); @@ -225,6 +227,7 @@ static __inline int wakeupshlk(struct lock *lk, const char *file, int line) { uintptr_t v, x; + u_int realexslp; int queue, wakeup_swapper; TD_LOCKS_DEC(curthread); @@ -241,7 +244,7 @@ wakeupshlk(struct lock *lk, const char *file, int line) * and return. */ if (LK_SHARERS(x) > 1) { - if (atomic_cmpset_ptr(&lk->lk_lock, x, + if (atomic_cmpset_rel_ptr(&lk->lk_lock, x, x - LK_ONE_SHARER)) break; continue; @@ -254,7 +257,7 @@ wakeupshlk(struct lock *lk, const char *file, int line) if ((x & LK_ALL_WAITERS) == 0) { MPASS((x & ~LK_EXCLUSIVE_SPINNERS) == LK_SHARERS_LOCK(1)); - if (atomic_cmpset_ptr(&lk->lk_lock, x, LK_UNLOCKED)) + if (atomic_cmpset_rel_ptr(&lk->lk_lock, x, LK_UNLOCKED)) break; continue; } @@ -270,17 +273,50 @@ wakeupshlk(struct lock *lk, const char *file, int line) /* * If the lock has exclusive waiters, give them preference in * order to avoid deadlock with shared runners up. + * If interruptible sleeps left the exclusive queue empty + * avoid a starvation for the threads sleeping on the shared + * queue by giving them precedence and cleaning up the + * exclusive waiters bit anyway. + * Please note that lk_exslpfail count may be lying about + * the real number of waiters with the LK_SLEEPFAIL flag on + * because they may be used in conjuction with interruptible + * sleeps so lk_exslpfail might be considered an 'upper limit' + * bound, including the edge cases. */ - if (x & LK_EXCLUSIVE_WAITERS) { - queue = SQ_EXCLUSIVE_QUEUE; - v |= (x & LK_SHARED_WAITERS); + realexslp = sleepq_sleepcnt(&lk->lock_object, + SQ_EXCLUSIVE_QUEUE); + if ((x & LK_EXCLUSIVE_WAITERS) != 0 && realexslp != 0) { + if (lk->lk_exslpfail < realexslp) { + lk->lk_exslpfail = 0; + queue = SQ_EXCLUSIVE_QUEUE; + v |= (x & LK_SHARED_WAITERS); + } else { + lk->lk_exslpfail = 0; + LOCK_LOG2(lk, + "%s: %p has only LK_SLEEPFAIL sleepers", + __func__, lk); + LOCK_LOG2(lk, + "%s: %p waking up threads on the exclusive queue", + __func__, lk); + wakeup_swapper = + sleepq_broadcast(&lk->lock_object, + SLEEPQ_LK, 0, SQ_EXCLUSIVE_QUEUE); + queue = SQ_SHARED_QUEUE; + } + } else { - MPASS((x & ~LK_EXCLUSIVE_SPINNERS) == - LK_SHARED_WAITERS); + + /* + * Exclusive waiters sleeping with LK_SLEEPFAIL on + * and using interruptible sleeps/timeout may have + * left spourious lk_exslpfail counts on, so clean + * it up anyway. + */ + lk->lk_exslpfail = 0; queue = SQ_SHARED_QUEUE; } - if (!atomic_cmpset_ptr(&lk->lk_lock, LK_SHARERS_LOCK(1) | x, + if (!atomic_cmpset_rel_ptr(&lk->lk_lock, LK_SHARERS_LOCK(1) | x, v)) { sleepq_release(&lk->lock_object); continue; @@ -288,7 +324,7 @@ wakeupshlk(struct lock *lk, const char *file, int line) LOCK_LOG3(lk, "%s: %p waking up threads on the %s queue", __func__, lk, queue == SQ_SHARED_QUEUE ? "shared" : "exclusive"); - wakeup_swapper = sleepq_broadcast(&lk->lock_object, SLEEPQ_LK, + wakeup_swapper |= sleepq_broadcast(&lk->lock_object, SLEEPQ_LK, 0, queue); sleepq_release(&lk->lock_object); break; @@ -353,6 +389,7 @@ lockinit(struct lock *lk, int pri, const char *wmesg, int timo, int flags) lk->lk_lock = LK_UNLOCKED; lk->lk_recurse = 0; + lk->lk_exslpfail = 0; lk->lk_timo = timo; lk->lk_pri = pri; lock_init(&lk->lock_object, &lock_class_lockmgr, wmesg, NULL, iflags); @@ -365,6 +402,7 @@ lockdestroy(struct lock *lk) KASSERT(lk->lk_lock == LK_UNLOCKED, ("lockmgr still held")); KASSERT(lk->lk_recurse == 0, ("lockmgr still recursed")); + KASSERT(lk->lk_exslpfail == 0, ("lockmgr still exclusive waiters")); lock_destroy(&lk->lock_object); } @@ -376,7 +414,7 @@ __lockmgr_args(struct lock *lk, u_int flags, struct lock_object *ilk, struct lock_class *class; const char *iwmesg; uintptr_t tid, v, x; - u_int op; + u_int op, realexslp; int error, ipri, itimo, queue, wakeup_swapper; #ifdef LOCK_PROFILING uint64_t waittime = 0; @@ -906,14 +944,47 @@ __lockmgr_args(struct lock *lk, u_int flags, struct lock_object *ilk, * If the lock has exclusive waiters, give them * preference in order to avoid deadlock with * shared runners up. + * If interruptible sleeps left the exclusive queue + * empty avoid a starvation for the threads sleeping + * on the shared queue by giving them precedence + * and cleaning up the exclusive waiters bit anyway. + * Please note that lk_exslpfail count may be lying + * about the real number of waiters with the + * LK_SLEEPFAIL flag on because they may be used in + * conjuction with interruptible sleeps so + * lk_exslpfail might be considered an 'upper limit' + * bound, including the edge cases. */ MPASS((x & LK_EXCLUSIVE_SPINNERS) == 0); - if (x & LK_EXCLUSIVE_WAITERS) { - queue = SQ_EXCLUSIVE_QUEUE; - v |= (x & LK_SHARED_WAITERS); + realexslp = sleepq_sleepcnt(&lk->lock_object, + SQ_EXCLUSIVE_QUEUE); + if ((x & LK_EXCLUSIVE_WAITERS) != 0 && realexslp != 0) { + if (lk->lk_exslpfail < realexslp) { + lk->lk_exslpfail = 0; + queue = SQ_EXCLUSIVE_QUEUE; + v |= (x & LK_SHARED_WAITERS); + } else { + lk->lk_exslpfail = 0; + LOCK_LOG2(lk, + "%s: %p has only LK_SLEEPFAIL sleepers", + __func__, lk); + LOCK_LOG2(lk, + "%s: %p waking up threads on the exclusive queue", + __func__, lk); + wakeup_swapper = + sleepq_broadcast(&lk->lock_object, + SLEEPQ_LK, 0, SQ_EXCLUSIVE_QUEUE); + queue = SQ_SHARED_QUEUE; + } } else { - MPASS((x & LK_ALL_WAITERS) == - LK_SHARED_WAITERS); + + /* + * Exclusive waiters sleeping with LK_SLEEPFAIL + * on and using interruptible sleeps/timeout + * may have left spourious lk_exslpfail counts + * on, so clean it up anyway. + */ + lk->lk_exslpfail = 0; queue = SQ_SHARED_QUEUE; } @@ -922,7 +993,7 @@ __lockmgr_args(struct lock *lk, u_int flags, struct lock_object *ilk, __func__, lk, queue == SQ_SHARED_QUEUE ? "shared" : "exclusive"); atomic_store_rel_ptr(&lk->lk_lock, v); - wakeup_swapper = sleepq_broadcast(&lk->lock_object, + wakeup_swapper |= sleepq_broadcast(&lk->lock_object, SLEEPQ_LK, 0, queue); sleepq_release(&lk->lock_object); break; @@ -979,14 +1050,62 @@ __lockmgr_args(struct lock *lk, u_int flags, struct lock_object *ilk, v = x & (LK_ALL_WAITERS | LK_EXCLUSIVE_SPINNERS); if ((x & ~v) == LK_UNLOCKED) { v = (x & ~LK_EXCLUSIVE_SPINNERS); + + /* + * If interruptible sleeps left the exclusive + * queue empty avoid a starvation for the + * threads sleeping on the shared queue by + * giving them precedence and cleaning up the + * exclusive waiters bit anyway. + * Please note that lk_exslpfail count may be + * lying about the real number of waiters with + * the LK_SLEEPFAIL flag on because they may + * be used in conjuction with interruptible + * sleeps so lk_exslpfail might be considered + * an 'upper limit' bound, including the edge + * cases. + */ if (v & LK_EXCLUSIVE_WAITERS) { queue = SQ_EXCLUSIVE_QUEUE; v &= ~LK_EXCLUSIVE_WAITERS; } else { + + /* + * Exclusive waiters sleeping with + * LK_SLEEPFAIL on and using + * interruptible sleeps/timeout may + * have left spourious lk_exslpfail + * counts on, so clean it up anyway. + */ MPASS(v & LK_SHARED_WAITERS); + lk->lk_exslpfail = 0; queue = SQ_SHARED_QUEUE; v &= ~LK_SHARED_WAITERS; } + if (queue == SQ_EXCLUSIVE_QUEUE) { + realexslp = + sleepq_sleepcnt(&lk->lock_object, + SQ_EXCLUSIVE_QUEUE); + if (lk->lk_exslpfail >= realexslp) { + lk->lk_exslpfail = 0; + queue = SQ_SHARED_QUEUE; + v &= ~LK_SHARED_WAITERS; + if (realexslp != 0) { + LOCK_LOG2(lk, + "%s: %p has only LK_SLEEPFAIL sleepers", + __func__, lk); + LOCK_LOG2(lk, + "%s: %p waking up threads on the exclusive queue", + __func__, lk); + wakeup_swapper = + sleepq_broadcast( + &lk->lock_object, + SLEEPQ_LK, 0, + SQ_EXCLUSIVE_QUEUE); + } + } else + lk->lk_exslpfail = 0; + } if (!atomic_cmpset_ptr(&lk->lk_lock, x, v)) { sleepq_release(&lk->lock_object); continue; @@ -1086,6 +1205,7 @@ _lockmgr_disown(struct lock *lk, const char *file, int line) LOCK_LOG_LOCK("XDISOWN", &lk->lock_object, 0, 0, file, line); WITNESS_UNLOCK(&lk->lock_object, LOP_EXCLUSIVE, file, line); TD_LOCKS_DEC(curthread); + STACK_SAVE(lk); /* * In order to preserve waiters flags, just spin. diff --git a/sys/kern/kern_mib.c b/sys/kern/kern_mib.c index 04e4dc0437b7..7ef580f5ac27 100644 --- a/sys/kern/kern_mib.c +++ b/sys/kern/kern_mib.c @@ -124,8 +124,9 @@ SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD, SYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD, 0, _POSIX_VERSION, "Version of POSIX attempting to comply to"); -SYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RD, - 0, NGROUPS_MAX, "Maximum number of groups a user can belong to"); +SYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RDTUN, + &ngroups_max, 0, + "Maximum number of supplemental groups a user can belong to"); SYSCTL_INT(_kern, KERN_JOB_CONTROL, job_control, CTLFLAG_RD, 0, 1, "Whether job control is available"); diff --git a/sys/kern/kern_mutex.c b/sys/kern/kern_mutex.c index 85ca646370d8..f9c3377ce880 100644 --- a/sys/kern/kern_mutex.c +++ b/sys/kern/kern_mutex.c @@ -616,7 +616,6 @@ thread_lock_block(struct thread *td) { struct mtx *lock; - spinlock_enter(); THREAD_LOCK_ASSERT(td, MA_OWNED); lock = td->td_lock; td->td_lock = &blocked_lock; @@ -631,7 +630,6 @@ thread_lock_unblock(struct thread *td, struct mtx *new) mtx_assert(new, MA_OWNED); MPASS(td->td_lock == &blocked_lock); atomic_store_rel_ptr((volatile void *)&td->td_lock, (uintptr_t)new); - spinlock_exit(); } void diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index e012a3ed4c00..c41909d9dc5e 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -140,7 +140,6 @@ struct sx allproc_lock; struct sx proctree_lock; struct mtx ppeers_lock; uma_zone_t proc_zone; -uma_zone_t ithread_zone; int kstack_pages = KSTACK_PAGES; SYSCTL_INT(_kern, OID_AUTO, kstack_pages, CTLFLAG_RD, &kstack_pages, 0, ""); @@ -358,6 +357,7 @@ enterpgrp(p, pgid, pgrp, sess) sess->s_sid = p->p_pid; refcount_init(&sess->s_count, 1); sess->s_ttyvp = NULL; + sess->s_ttydp = NULL; sess->s_ttyp = NULL; bcopy(p->p_session->s_login, sess->s_login, sizeof(sess->s_login)); @@ -676,11 +676,9 @@ fill_kinfo_aggregate(struct proc *p, struct kinfo_proc *kp) kp->ki_estcpu = 0; kp->ki_pctcpu = 0; - kp->ki_runtime = 0; FOREACH_THREAD_IN_PROC(p, td) { thread_lock(td); kp->ki_pctcpu += sched_pctcpu(td); - kp->ki_runtime += cputick2usec(td->td_runtime); kp->ki_estcpu += td->td_estcpu; thread_unlock(td); } @@ -830,9 +828,10 @@ fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp) } /* - * Fill in information that is thread specific. Must be called with p_slock - * locked. If 'preferthread' is set, overwrite certain process-related - * fields that are maintained for both threads and processes. + * Fill in information that is thread specific. Must be called with + * target process locked. If 'preferthread' is set, overwrite certain + * process-related fields that are maintained for both threads and + * processes. */ static void fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) @@ -847,8 +846,7 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) strlcpy(kp->ki_wmesg, td->td_wmesg, sizeof(kp->ki_wmesg)); else bzero(kp->ki_wmesg, sizeof(kp->ki_wmesg)); - if (td->td_name[0] != '\0') - strlcpy(kp->ki_ocomm, td->td_name, sizeof(kp->ki_ocomm)); + strlcpy(kp->ki_ocomm, td->td_name, sizeof(kp->ki_ocomm)); if (TD_ON_LOCK(td)) { kp->ki_kiflag |= KI_LOCKBLOCK; strlcpy(kp->ki_lockname, td->td_lockname, @@ -902,7 +900,8 @@ fill_kinfo_thread(struct thread *td, struct kinfo_proc *kp, int preferthread) /* We can't get this anymore but ps etc never used it anyway. */ kp->ki_rqindex = 0; - SIGSETOR(kp->ki_siglist, td->td_siglist); + if (preferthread) + kp->ki_siglist = td->td_siglist; kp->ki_sigmask = td->td_sigmask; thread_unlock(td); } diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c index 709bcb09723f..16b0f37ae914 100644 --- a/sys/kern/kern_prot.c +++ b/sys/kern/kern_prot.c @@ -283,7 +283,13 @@ getgroups(struct thread *td, register struct getgroups_args *uap) u_int ngrp; int error; - ngrp = MIN(uap->gidsetsize, NGROUPS); + if (uap->gidsetsize < td->td_ucred->cr_ngroups) { + if (uap->gidsetsize == 0) + ngrp = 0; + else + return (EINVAL); + } else + ngrp = td->td_ucred->cr_ngroups; groups = malloc(ngrp * sizeof(*groups), M_TEMP, M_WAITOK); error = kern_getgroups(td, &ngrp, groups); if (error) @@ -796,7 +802,7 @@ setgroups(struct thread *td, struct setgroups_args *uap) gid_t *groups = NULL; int error; - if (uap->gidsetsize > NGROUPS) + if (uap->gidsetsize > ngroups_max + 1) return (EINVAL); groups = malloc(uap->gidsetsize * sizeof(gid_t), M_TEMP, M_WAITOK); error = copyin(uap->gidset, groups, uap->gidsetsize * sizeof(gid_t)); @@ -815,7 +821,7 @@ kern_setgroups(struct thread *td, u_int ngrp, gid_t *groups) struct ucred *newcred, *oldcred; int error; - if (ngrp > NGROUPS) + if (ngrp > ngroups_max + 1) return (EINVAL); AUDIT_ARG_GROUPSET(groups, ngrp); newcred = crget(); @@ -2022,14 +2028,14 @@ crsetgroups_locked(struct ucred *cr, int ngrp, gid_t *groups) /* * Copy groups in to a credential after expanding it if required. - * Truncate the list to NGROUPS if it is too large. + * Truncate the list to (ngroups_max + 1) if it is too large. */ void crsetgroups(struct ucred *cr, int ngrp, gid_t *groups) { - if (ngrp > NGROUPS) - ngrp = NGROUPS; + if (ngrp > ngroups_max + 1) + ngrp = ngroups_max + 1; crextend(cr, ngrp); crsetgroups_locked(cr, ngrp, groups); diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c index b56de666a323..a6a622e141fc 100644 --- a/sys/kern/kern_rmlock.c +++ b/sys/kern/kern_rmlock.c @@ -128,9 +128,9 @@ static struct mtx rm_spinlock; MTX_SYSINIT(rm_spinlock, &rm_spinlock, "rm_spinlock", MTX_SPIN); /* - * Add or remove tracker from per cpu list. + * Add or remove tracker from per-cpu list. * - * The per cpu list can be traversed at any time in forward direction from an + * The per-cpu list can be traversed at any time in forward direction from an * interrupt on the *local* cpu. */ static void inline @@ -147,7 +147,7 @@ rm_tracker_add(struct pcpu *pc, struct rm_priotracker *tracker) next->rmq_prev = &tracker->rmp_cpuQueue; /* Update pointer to first element. */ - pc->pc_rm_queue.rmq_next = &tracker->rmp_cpuQueue; + pc->pc_rm_queue.rmq_next = &tracker->rmp_cpuQueue; } static void inline @@ -257,7 +257,7 @@ _rm_rlock_hard(struct rmlock *rm, struct rm_priotracker *tracker) return; } - /* Remove our tracker from the per cpu list. */ + /* Remove our tracker from the per-cpu list. */ rm_tracker_remove(pc, tracker); /* Check to see if the IPI granted us the lock after all. */ @@ -274,11 +274,11 @@ _rm_rlock_hard(struct rmlock *rm, struct rm_priotracker *tracker) */ if ((rm->lock_object.lo_flags & LO_RECURSABLE) != 0) { /* - * Just grand the lock if this thread already have a tracker - * for this lock on the per cpu queue. + * Just grant the lock if this thread already has a tracker + * for this lock on the per-cpu queue. */ for (queue = pc->pc_rm_queue.rmq_next; - queue != &pc->pc_rm_queue; queue = queue->rmq_next) { + queue != &pc->pc_rm_queue; queue = queue->rmq_next) { atracker = (struct rm_priotracker *)queue; if ((atracker->rmp_rmlock == rm) && (atracker->rmp_thread == tracker->rmp_thread)) { @@ -337,7 +337,7 @@ _rm_rlock(struct rmlock *rm, struct rm_priotracker *tracker) * Fast path to combine two common conditions into a single * conditional jump. */ - if (0 == (td->td_owepreempt | rm->rm_noreadtoken)) + if (0 == (td->td_owepreempt | rm->rm_noreadtoken)) return; /* We do not have a read token and need to acquire one. */ @@ -413,7 +413,7 @@ _rm_wlock(struct rmlock *rm) * before rm_cleanIPI is called. */ #ifdef SMP - smp_rendezvous(smp_no_rendevous_barrier, + smp_rendezvous(smp_no_rendevous_barrier, rm_cleanIPI, smp_no_rendevous_barrier, rm); @@ -487,7 +487,7 @@ _rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, } void -_rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, +_rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, const char *file, int line) { @@ -526,7 +526,7 @@ _rm_rlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, } void -_rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, +_rm_runlock_debug(struct rmlock *rm, struct rm_priotracker *tracker, const char *file, int line) { diff --git a/sys/kern/kern_rwlock.c b/sys/kern/kern_rwlock.c index be05b39de0a2..c1f13e058622 100644 --- a/sys/kern/kern_rwlock.c +++ b/sys/kern/kern_rwlock.c @@ -541,7 +541,7 @@ _rw_runlock(struct rwlock *rw, const char *file, int line) */ x = rw->rw_lock; if (RW_READERS(x) > 1) { - if (atomic_cmpset_ptr(&rw->rw_lock, x, + if (atomic_cmpset_rel_ptr(&rw->rw_lock, x, x - RW_ONE_READER)) { if (LOCK_LOG_TEST(&rw->lock_object, 0)) CTR4(KTR_LOCK, @@ -559,7 +559,8 @@ _rw_runlock(struct rwlock *rw, const char *file, int line) if (!(x & RW_LOCK_WAITERS)) { MPASS((x & ~RW_LOCK_WRITE_SPINNER) == RW_READERS_LOCK(1)); - if (atomic_cmpset_ptr(&rw->rw_lock, x, RW_UNLOCKED)) { + if (atomic_cmpset_rel_ptr(&rw->rw_lock, x, + RW_UNLOCKED)) { if (LOCK_LOG_TEST(&rw->lock_object, 0)) CTR2(KTR_LOCK, "%s: %p last succeeded", __func__, rw); @@ -597,7 +598,7 @@ _rw_runlock(struct rwlock *rw, const char *file, int line) x |= (v & RW_LOCK_READ_WAITERS); } else queue = TS_SHARED_QUEUE; - if (!atomic_cmpset_ptr(&rw->rw_lock, RW_READERS_LOCK(1) | v, + if (!atomic_cmpset_rel_ptr(&rw->rw_lock, RW_READERS_LOCK(1) | v, x)) { turnstile_chain_unlock(&rw->lock_object); continue; diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c index 6534d5c55414..9b28af40c28d 100644 --- a/sys/kern/kern_shutdown.c +++ b/sys/kern/kern_shutdown.c @@ -142,7 +142,7 @@ shutdown_conf(void *unused) { EVENTHANDLER_REGISTER(shutdown_final, poweroff_wait, NULL, - SHUTDOWN_PRI_FIRST); + SHUTDOWN_PRI_FIRST + 100); EVENTHANDLER_REGISTER(shutdown_final, shutdown_halt, NULL, SHUTDOWN_PRI_LAST + 100); EVENTHANDLER_REGISTER(shutdown_final, shutdown_panic, NULL, @@ -618,16 +618,14 @@ void kproc_shutdown(void *arg, int howto) { struct proc *p; - char procname[MAXCOMLEN + 1]; int error; if (panicstr) return; p = (struct proc *)arg; - strlcpy(procname, p->p_comm, sizeof(procname)); printf("Waiting (max %d seconds) for system process `%s' to stop...", - kproc_shutdown_wait, procname); + kproc_shutdown_wait, p->p_comm); error = kproc_suspend(p, kproc_shutdown_wait * hz); if (error == EWOULDBLOCK) @@ -640,16 +638,14 @@ void kthread_shutdown(void *arg, int howto) { struct thread *td; - char procname[MAXCOMLEN + 1]; int error; if (panicstr) return; td = (struct thread *)arg; - strlcpy(procname, td->td_name, sizeof(procname)); printf("Waiting (max %d seconds) for system thread `%s' to stop...", - kproc_shutdown_wait, procname); + kproc_shutdown_wait, td->td_name); error = kthread_suspend(td, kproc_shutdown_wait * hz); if (error == EWOULDBLOCK) diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 74e625a4be5f..98a121b12da0 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" #include "opt_kdtrace.h" #include "opt_ktrace.h" +#include "opt_core.h" #include #include @@ -49,6 +50,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -78,6 +80,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include @@ -98,8 +102,9 @@ SDT_PROBE_ARGTYPE(proc, kernel, , signal_discard, 1, "struct proc *"); SDT_PROBE_ARGTYPE(proc, kernel, , signal_discard, 2, "int"); static int coredump(struct thread *); -static char *expand_name(const char *, uid_t, pid_t); -static int killpg1(struct thread *td, int sig, int pgid, int all); +static char *expand_name(const char *, uid_t, pid_t, struct thread *, int); +static int killpg1(struct thread *td, int sig, int pgid, int all, + ksiginfo_t *ksi); static int issignal(struct thread *td, int stop_allowed); static int sigprop(int sig); static void tdsigwakeup(struct thread *, int, sig_t, int); @@ -162,7 +167,7 @@ SYSINIT(signal, SI_SUB_P1003_1B, SI_ORDER_FIRST+3, sigqueue_start, NULL); int sugid_coredump; SYSCTL_INT(_kern, OID_AUTO, sugid_coredump, CTLFLAG_RW, - &sugid_coredump, 0, "Enable coredumping set user/group ID processes"); + &sugid_coredump, 0, "Allow setuid and setgid processes to dump core"); static int do_coredump = 1; SYSCTL_INT(_kern, OID_AUTO, coredump, CTLFLAG_RW, @@ -220,6 +225,8 @@ static int sigproptbl[NSIG] = { SA_KILL|SA_PROC, /* SIGUSR2 */ }; +static void reschedule_signals(struct proc *p, sigset_t block, int flags); + static void sigqueue_start(void) { @@ -276,7 +283,7 @@ sigqueue_init(sigqueue_t *list, struct proc *p) * 0 - signal not found * others - signal number */ -int +static int sigqueue_get(sigqueue_t *sq, int signo, ksiginfo_t *si) { struct proc *p = sq->sq_proc; @@ -338,7 +345,7 @@ sigqueue_take(ksiginfo_t *ksi) SIGDELSET(sq->sq_signals, ksi->ksi_signo); } -int +static int sigqueue_add(sigqueue_t *sq, int signo, ksiginfo_t *si) { struct proc *p = sq->sq_proc; @@ -354,7 +361,10 @@ sigqueue_add(sigqueue_t *sq, int signo, ksiginfo_t *si) /* directly insert the ksi, don't copy it */ if (si->ksi_flags & KSI_INS) { - TAILQ_INSERT_TAIL(&sq->sq_list, si, ksi_link); + if (si->ksi_flags & KSI_HEAD) + TAILQ_INSERT_HEAD(&sq->sq_list, si, ksi_link); + else + TAILQ_INSERT_TAIL(&sq->sq_list, si, ksi_link); si->ksi_sigq = sq; goto out_set_bit; } @@ -375,11 +385,15 @@ sigqueue_add(sigqueue_t *sq, int signo, ksiginfo_t *si) p->p_pendingcnt++; ksiginfo_copy(si, ksi); ksi->ksi_signo = signo; - TAILQ_INSERT_TAIL(&sq->sq_list, ksi, ksi_link); + if (si->ksi_flags & KSI_HEAD) + TAILQ_INSERT_HEAD(&sq->sq_list, ksi, ksi_link); + else + TAILQ_INSERT_TAIL(&sq->sq_list, ksi, ksi_link); ksi->ksi_sigq = sq; } - if ((si->ksi_flags & KSI_TRAP) != 0) { + if ((si->ksi_flags & KSI_TRAP) != 0 || + (si->ksi_flags & KSI_SIGQ) == 0) { if (ret != 0) SIGADDSET(sq->sq_kill, signo); ret = 0; @@ -416,7 +430,7 @@ sigqueue_flush(sigqueue_t *sq) SIGEMPTYSET(sq->sq_kill); } -void +static void sigqueue_collect_set(sigqueue_t *sq, sigset_t *set) { ksiginfo_t *ksi; @@ -428,7 +442,7 @@ sigqueue_collect_set(sigqueue_t *sq, sigset_t *set) SIGSETOR(*set, sq->sq_kill); } -void +static void sigqueue_move_set(sigqueue_t *src, sigqueue_t *dst, sigset_t *setp) { sigset_t tmp, set; @@ -472,7 +486,7 @@ sigqueue_move_set(sigqueue_t *src, sigqueue_t *dst, sigset_t *setp) sigqueue_collect_set(src, &src->sq_signals); } -void +static void sigqueue_move(sigqueue_t *src, sigqueue_t *dst, int signo) { sigset_t set; @@ -482,7 +496,7 @@ sigqueue_move(sigqueue_t *src, sigqueue_t *dst, int signo) sigqueue_move_set(src, dst, &set); } -void +static void sigqueue_delete_set(sigqueue_t *sq, sigset_t *set) { struct proc *p = sq->sq_proc; @@ -516,7 +530,7 @@ sigqueue_delete(sigqueue_t *sq, int signo) } /* Remove a set of signals for a process */ -void +static void sigqueue_delete_set_proc(struct proc *p, sigset_t *set) { sigqueue_t worklist; @@ -543,7 +557,7 @@ sigqueue_delete_proc(struct proc *p, int signo) sigqueue_delete_set_proc(p, &set); } -void +static void sigqueue_delete_stopmask_proc(struct proc *p) { sigset_t set; @@ -581,20 +595,11 @@ void signotify(struct thread *td) { struct proc *p; - sigset_t set; p = td->td_proc; PROC_LOCK_ASSERT(p, MA_OWNED); - /* - * If our mask changed we may have to move signal that were - * previously masked by all threads to our sigqueue. - */ - set = p->p_sigqueue.sq_signals; - SIGSETNAND(set, td->td_sigmask); - if (! SIGISEMPTY(set)) - sigqueue_move_set(&p->p_sigqueue, &td->td_sigqueue, &set); if (SIGPENDING(td)) { thread_lock(td); td->td_flags |= TDF_NEEDSIGCHK | TDF_ASTPENDING; @@ -976,24 +981,29 @@ execsigs(struct proc *p) * Manipulate signal mask. */ int -kern_sigprocmask(td, how, set, oset, old) - struct thread *td; - int how; - sigset_t *set, *oset; - int old; +kern_sigprocmask(struct thread *td, int how, sigset_t *set, sigset_t *oset, + int flags) { + sigset_t new_block, oset1; + struct proc *p; int error; - PROC_LOCK(td->td_proc); + p = td->td_proc; + if (!(flags & SIGPROCMASK_PROC_LOCKED)) + PROC_LOCK(p); if (oset != NULL) *oset = td->td_sigmask; error = 0; + SIGEMPTYSET(new_block); if (set != NULL) { switch (how) { case SIG_BLOCK: SIG_CANTMASK(*set); + oset1 = td->td_sigmask; SIGSETOR(td->td_sigmask, *set); + new_block = td->td_sigmask; + SIGSETNAND(new_block, oset1); break; case SIG_UNBLOCK: SIGSETNAND(td->td_sigmask, *set); @@ -1001,10 +1011,13 @@ kern_sigprocmask(td, how, set, oset, old) break; case SIG_SETMASK: SIG_CANTMASK(*set); - if (old) + oset1 = td->td_sigmask; + if (flags & SIGPROCMASK_OLD) SIGSETLO(td->td_sigmask, *set); else td->td_sigmask = *set; + new_block = td->td_sigmask; + SIGSETNAND(new_block, oset1); signotify(td); break; default: @@ -1012,7 +1025,21 @@ kern_sigprocmask(td, how, set, oset, old) break; } } - PROC_UNLOCK(td->td_proc); + + /* + * The new_block set contains signals that were not previously + * blocked, but are blocked now. + * + * In case we block any signal that was not previously blocked + * for td, and process has the signal pending, try to schedule + * signal delivery to some thread that does not block the signal, + * possibly waking it up. + */ + if (p->p_numthreads != 1) + reschedule_signals(p, new_block, flags); + + if (!(flags & SIGPROCMASK_PROC_LOCKED)) + PROC_UNLOCK(p); return (error); } @@ -1381,15 +1408,11 @@ osigblock(td, uap) register struct thread *td; struct osigblock_args *uap; { - struct proc *p = td->td_proc; - sigset_t set; + sigset_t set, oset; OSIG2SIG(uap->mask, set); - SIG_CANTMASK(set); - PROC_LOCK(p); - SIG2OSIG(td->td_sigmask, td->td_retval[0]); - SIGSETOR(td->td_sigmask, set); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_BLOCK, &set, &oset, 0); + SIG2OSIG(oset, td->td_retval[0]); return (0); } @@ -1403,16 +1426,11 @@ osigsetmask(td, uap) struct thread *td; struct osigsetmask_args *uap; { - struct proc *p = td->td_proc; - sigset_t set; + sigset_t set, oset; OSIG2SIG(uap->mask, set); - SIG_CANTMASK(set); - PROC_LOCK(p); - SIG2OSIG(td->td_sigmask, td->td_retval[0]); - SIGSETLO(td->td_sigmask, set); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &set, &oset, 0); + SIG2OSIG(oset, td->td_retval[0]); return (0); } #endif /* COMPAT_43 */ @@ -1445,6 +1463,7 @@ int kern_sigsuspend(struct thread *td, sigset_t mask) { struct proc *p = td->td_proc; + int has_sig, sig; /* * When returning from sigsuspend, we want @@ -1454,16 +1473,29 @@ kern_sigsuspend(struct thread *td, sigset_t mask) * to indicate this. */ PROC_LOCK(p); - td->td_oldsigmask = td->td_sigmask; + kern_sigprocmask(td, SIG_SETMASK, &mask, &td->td_oldsigmask, + SIGPROCMASK_PROC_LOCKED); td->td_pflags |= TDP_OLDMASK; - SIG_CANTMASK(mask); - td->td_sigmask = mask; - signotify(td); - while (msleep(&p->p_sigacts, &p->p_mtx, PPAUSE|PCATCH, "pause", 0) == 0) - /* void */; + + /* + * Process signals now. Otherwise, we can get spurious wakeup + * due to signal entered process queue, but delivered to other + * thread. But sigsuspend should return only on signal + * delivery. + */ + cpu_set_syscall_retval(td, EINTR); + for (has_sig = 0; !has_sig;) { + while (msleep(&p->p_sigacts, &p->p_mtx, PPAUSE|PCATCH, "pause", + 0) == 0) + /* void */; + thread_suspend_check(0); + mtx_lock(&p->p_sigacts->ps_mtx); + while ((sig = cursig(td, SIG_STOP_ALLOWED)) != 0) + has_sig += postsig(sig); + mtx_unlock(&p->p_sigacts->ps_mtx); + } PROC_UNLOCK(p); - /* always return EINTR rather than ERESTART... */ - return (EINTR); + return (EJUSTRETURN); } #ifdef COMPAT_43 /* XXX - COMPAT_FBSD3 */ @@ -1482,21 +1514,10 @@ osigsuspend(td, uap) struct thread *td; struct osigsuspend_args *uap; { - struct proc *p = td->td_proc; sigset_t mask; - PROC_LOCK(p); - td->td_oldsigmask = td->td_sigmask; - td->td_pflags |= TDP_OLDMASK; OSIG2SIG(uap->mask, mask); - SIG_CANTMASK(mask); - SIGSETLO(td->td_sigmask, mask); - signotify(td); - while (msleep(&p->p_sigacts, &p->p_mtx, PPAUSE|PCATCH, "opause", 0) == 0) - /* void */; - PROC_UNLOCK(p); - /* always return EINTR rather than ERESTART... */ - return (EINTR); + return (kern_sigsuspend(td, mask)); } #endif /* COMPAT_43 */ @@ -1602,11 +1623,9 @@ kern_sigaltstack(struct thread *td, stack_t *ss, stack_t *oss) * cp is calling process. */ static int -killpg1(td, sig, pgid, all) - register struct thread *td; - int sig, pgid, all; +killpg1(struct thread *td, int sig, int pgid, int all, ksiginfo_t *ksi) { - register struct proc *p; + struct proc *p; struct pgrp *pgrp; int nfound = 0; @@ -1625,7 +1644,7 @@ killpg1(td, sig, pgid, all) if (p_cansignal(td, p, sig) == 0) { nfound++; if (sig) - psignal(p, sig); + pksignal(p, sig, ksi); } PROC_UNLOCK(p); } @@ -1656,7 +1675,7 @@ killpg1(td, sig, pgid, all) if (p_cansignal(td, p, sig) == 0) { nfound++; if (sig) - psignal(p, sig); + pksignal(p, sig, ksi); } PROC_UNLOCK(p); } @@ -1673,11 +1692,10 @@ struct kill_args { #endif /* ARGSUSED */ int -kill(td, uap) - register struct thread *td; - register struct kill_args *uap; +kill(struct thread *td, struct kill_args *uap) { - register struct proc *p; + ksiginfo_t ksi; + struct proc *p; int error; AUDIT_ARG_SIGNUM(uap->signum); @@ -1685,6 +1703,12 @@ kill(td, uap) if ((u_int)uap->signum > _SIG_MAXSIG) return (EINVAL); + ksiginfo_init(&ksi); + ksi.ksi_signo = uap->signum; + ksi.ksi_code = SI_USER; + ksi.ksi_pid = td->td_proc->p_pid; + ksi.ksi_uid = td->td_ucred->cr_ruid; + if (uap->pid > 0) { /* kill single process */ if ((p = pfind(uap->pid)) == NULL) { @@ -1694,17 +1718,17 @@ kill(td, uap) AUDIT_ARG_PROCESS(p); error = p_cansignal(td, p, uap->signum); if (error == 0 && uap->signum) - psignal(p, uap->signum); + pksignal(p, uap->signum, &ksi); PROC_UNLOCK(p); return (error); } switch (uap->pid) { case -1: /* broadcast signal */ - return (killpg1(td, uap->signum, 0, 1)); + return (killpg1(td, uap->signum, 0, 1, &ksi)); case 0: /* signal own process group */ - return (killpg1(td, uap->signum, 0, 0)); + return (killpg1(td, uap->signum, 0, 0, &ksi)); default: /* negative explicit process group */ - return (killpg1(td, uap->signum, -uap->pid, 0)); + return (killpg1(td, uap->signum, -uap->pid, 0, &ksi)); } /* NOTREACHED */ } @@ -1718,17 +1742,21 @@ struct okillpg_args { #endif /* ARGSUSED */ int -okillpg(td, uap) - struct thread *td; - register struct okillpg_args *uap; +okillpg(struct thread *td, struct okillpg_args *uap) { + ksiginfo_t ksi; AUDIT_ARG_SIGNUM(uap->signum); AUDIT_ARG_PID(uap->pgid); if ((u_int)uap->signum > _SIG_MAXSIG) return (EINVAL); - return (killpg1(td, uap->signum, uap->pgid, 0)); + ksiginfo_init(&ksi); + ksi.ksi_signo = uap->signum; + ksi.ksi_code = SI_USER; + ksi.ksi_pid = td->td_proc->p_pid; + ksi.ksi_uid = td->td_ucred->cr_ruid; + return (killpg1(td, uap->signum, uap->pgid, 0, &ksi)); } #endif /* COMPAT_43 */ @@ -1763,6 +1791,7 @@ sigqueue(struct thread *td, struct sigqueue_args *uap) error = p_cansignal(td, p, uap->signum); if (error == 0 && uap->signum != 0) { ksiginfo_init(&ksi); + ksi.ksi_flags = KSI_SIGQ; ksi.ksi_signo = uap->signum; ksi.ksi_code = SI_QUEUE; ksi.ksi_pid = td->td_proc->p_pid; @@ -1778,8 +1807,7 @@ sigqueue(struct thread *td, struct sigqueue_args *uap) * Send a signal to a process group. */ void -gsignal(pgid, sig) - int pgid, sig; +gsignal(int pgid, int sig, ksiginfo_t *ksi) { struct pgrp *pgrp; @@ -1788,7 +1816,7 @@ gsignal(pgid, sig) pgrp = pgfind(pgid); sx_sunlock(&proctree_lock); if (pgrp != NULL) { - pgsignal(pgrp, sig, 0); + pgsignal(pgrp, sig, 0, ksi); PGRP_UNLOCK(pgrp); } } @@ -1799,18 +1827,16 @@ gsignal(pgid, sig) * limit to members which have a controlling terminal. */ void -pgsignal(pgrp, sig, checkctty) - struct pgrp *pgrp; - int sig, checkctty; +pgsignal(struct pgrp *pgrp, int sig, int checkctty, ksiginfo_t *ksi) { - register struct proc *p; + struct proc *p; if (pgrp) { PGRP_LOCK_ASSERT(pgrp, MA_OWNED); LIST_FOREACH(p, &pgrp->pg_members, p_pglist) { PROC_LOCK(p); if (checkctty == 0 || p->p_flag & P_CONTROLT) - psignal(p, sig); + pksignal(p, sig, ksi); PROC_UNLOCK(p); } } @@ -1825,6 +1851,7 @@ void trapsignal(struct thread *td, ksiginfo_t *ksi) { struct sigacts *ps; + sigset_t mask; struct proc *p; int sig; int code; @@ -1847,9 +1874,11 @@ trapsignal(struct thread *td, ksiginfo_t *ksi) #endif (*p->p_sysent->sv_sendsig)(ps->ps_sigact[_SIG_IDX(sig)], ksi, &td->td_sigmask); - SIGSETOR(td->td_sigmask, ps->ps_catchmask[_SIG_IDX(sig)]); + mask = ps->ps_catchmask[_SIG_IDX(sig)]; if (!SIGISMEMBER(ps->ps_signodefer, sig)) - SIGADDSET(td->td_sigmask, sig); + SIGADDSET(mask, sig); + kern_sigprocmask(td, SIG_BLOCK, &mask, NULL, + SIGPROCMASK_PROC_LOCKED | SIGPROCMASK_PS_LOCKED); if (SIGISMEMBER(ps->ps_sigreset, sig)) { /* * See kern_sigaction() for origin of this code. @@ -1892,7 +1921,7 @@ sigtd(struct proc *p, int sig, int prop) /* * Check if current thread can handle the signal without - * switching conetxt to another thread. + * switching context to another thread. */ if (curproc == p && !SIGISMEMBER(curthread->td_sigmask, sig)) return (curthread); @@ -1928,7 +1957,19 @@ sigtd(struct proc *p, int sig, int prop) void psignal(struct proc *p, int sig) { - (void) tdsignal(p, NULL, sig, NULL); + ksiginfo_t ksi; + + ksiginfo_init(&ksi); + ksi.ksi_signo = sig; + ksi.ksi_code = SI_KERNEL; + (void) tdsignal(p, NULL, sig, &ksi); +} + +void +pksignal(struct proc *p, int sig, ksiginfo_t *ksi) +{ + + (void) tdsignal(p, NULL, sig, ksi); } int @@ -1985,17 +2026,9 @@ tdsignal(struct proc *p, struct thread *td, int sig, ksiginfo_t *ksi) KNOTE_LOCKED(&p->p_klist, NOTE_SIGNAL | sig); prop = sigprop(sig); - /* - * If the signal is blocked and not destined for this thread, then - * assign it to the process so that we can find it later in the first - * thread that unblocks it. Otherwise, assign it to this thread now. - */ if (td == NULL) { td = sigtd(p, sig, prop); - if (SIGISMEMBER(td->td_sigmask, sig)) - sigqueue = &p->p_sigqueue; - else - sigqueue = &td->td_sigqueue; + sigqueue = &p->p_sigqueue; } else { KASSERT(td->td_proc == p, ("invalid thread")); sigqueue = &td->td_sigqueue; @@ -2392,6 +2425,64 @@ stopme: return (td->td_xsig); } +static void +reschedule_signals(struct proc *p, sigset_t block, int flags) +{ + struct sigacts *ps; + struct thread *td; + int i; + + PROC_LOCK_ASSERT(p, MA_OWNED); + + ps = p->p_sigacts; + for (i = 1; !SIGISEMPTY(block); i++) { + if (!SIGISMEMBER(block, i)) + continue; + SIGDELSET(block, i); + if (!SIGISMEMBER(p->p_siglist, i)) + continue; + + td = sigtd(p, i, 0); + signotify(td); + if (!(flags & SIGPROCMASK_PS_LOCKED)) + mtx_lock(&ps->ps_mtx); + if (p->p_flag & P_TRACED || SIGISMEMBER(ps->ps_sigcatch, i)) + tdsigwakeup(td, i, SIG_CATCH, + (SIGISMEMBER(ps->ps_sigintr, i) ? EINTR : + ERESTART)); + if (!(flags & SIGPROCMASK_PS_LOCKED)) + mtx_unlock(&ps->ps_mtx); + } +} + +void +tdsigcleanup(struct thread *td) +{ + struct proc *p; + sigset_t unblocked; + + p = td->td_proc; + PROC_LOCK_ASSERT(p, MA_OWNED); + + sigqueue_flush(&td->td_sigqueue); + if (p->p_numthreads == 1) + return; + + /* + * Since we cannot handle signals, notify signal post code + * about this by filling the sigmask. + * + * Also, if needed, wake up thread(s) that do not block the + * same signals as the exiting thread, since the thread might + * have been selected for delivery and woken up. + */ + SIGFILLSET(unblocked); + SIGSETNAND(unblocked, td->td_sigmask); + SIGFILLSET(td->td_sigmask); + reschedule_signals(p, unblocked, 0); + +} + /* * If the current process has received a signal (should be caught or cause * termination, should interrupt current syscall), return the signal number. @@ -2409,7 +2500,9 @@ issignal(struct thread *td, int stop_allowed) { struct proc *p; struct sigacts *ps; + struct sigqueue *queue; sigset_t sigpending; + ksiginfo_t ksi; int sig, prop, newsig; p = td->td_proc; @@ -2420,6 +2513,7 @@ issignal(struct thread *td, int stop_allowed) int traced = (p->p_flag & P_TRACED) || (p->p_stops & S_SIG); sigpending = td->td_sigqueue.sq_signals; + SIGSETOR(sigpending, p->p_sigqueue.sq_signals); SIGSETNAND(sigpending, td->td_sigmask); if (p->p_flag & P_PPWAIT) @@ -2440,24 +2534,28 @@ issignal(struct thread *td, int stop_allowed) */ if (SIGISMEMBER(ps->ps_sigignore, sig) && (traced == 0)) { sigqueue_delete(&td->td_sigqueue, sig); + sigqueue_delete(&p->p_sigqueue, sig); continue; } if (p->p_flag & P_TRACED && (p->p_flag & P_PPWAIT) == 0) { /* * If traced, always stop. + * Remove old signal from queue before the stop. + * XXX shrug off debugger, it causes siginfo to + * be thrown away. */ + queue = &td->td_sigqueue; + ksi.ksi_signo = 0; + if (sigqueue_get(queue, sig, &ksi) == 0) { + queue = &p->p_sigqueue; + sigqueue_get(queue, sig, &ksi); + } + mtx_unlock(&ps->ps_mtx); newsig = ptracestop(td, sig); mtx_lock(&ps->ps_mtx); if (sig != newsig) { - ksiginfo_t ksi; - /* - * clear old signal. - * XXX shrug off debugger, it causes siginfo to - * be thrown away. - */ - sigqueue_get(&td->td_sigqueue, sig, &ksi); /* * If parent wants us to take the signal, @@ -2472,10 +2570,20 @@ issignal(struct thread *td, int stop_allowed) * Put the new signal into td_sigqueue. If the * signal is being masked, look for other signals. */ - SIGADDSET(td->td_sigqueue.sq_signals, sig); + sigqueue_add(queue, sig, NULL); if (SIGISMEMBER(td->td_sigmask, sig)) continue; signotify(td); + } else { + if (ksi.ksi_signo != 0) { + ksi.ksi_flags |= KSI_HEAD; + if (sigqueue_add(&td->td_sigqueue, sig, + &ksi) != 0) + ksi.ksi_signo = 0; + } + if (ksi.ksi_signo == 0) + sigqueue_add(&td->td_sigqueue, sig, + NULL); } /* @@ -2567,6 +2675,7 @@ issignal(struct thread *td, int stop_allowed) return (sig); } sigqueue_delete(&td->td_sigqueue, sig); /* take the signal! */ + sigqueue_delete(&p->p_sigqueue, sig); } /* NOTREACHED */ } @@ -2596,7 +2705,7 @@ thread_stopped(struct proc *p) * Take the action for the specified signal * from the current set of pending signals. */ -void +int postsig(sig) register int sig; { @@ -2605,7 +2714,7 @@ postsig(sig) struct sigacts *ps; sig_t action; ksiginfo_t ksi; - sigset_t returnmask; + sigset_t returnmask, mask; KASSERT(sig != 0, ("postsig")); @@ -2613,7 +2722,9 @@ postsig(sig) ps = p->p_sigacts; mtx_assert(&ps->ps_mtx, MA_OWNED); ksiginfo_init(&ksi); - sigqueue_get(&td->td_sigqueue, sig, &ksi); + if (sigqueue_get(&td->td_sigqueue, sig, &ksi) == 0 && + sigqueue_get(&p->p_sigqueue, sig, &ksi) == 0) + return (0); ksi.ksi_signo = sig; if (ksi.ksi_code == SI_TIMER) itimer_accept(p, ksi.ksi_timerid, &ksi); @@ -2658,9 +2769,11 @@ postsig(sig) } else returnmask = td->td_sigmask; - SIGSETOR(td->td_sigmask, ps->ps_catchmask[_SIG_IDX(sig)]); + mask = ps->ps_catchmask[_SIG_IDX(sig)]; if (!SIGISMEMBER(ps->ps_signodefer, sig)) - SIGADDSET(td->td_sigmask, sig); + SIGADDSET(mask, sig); + kern_sigprocmask(td, SIG_BLOCK, &mask, NULL, + SIGPROCMASK_PROC_LOCKED | SIGPROCMASK_PS_LOCKED); if (SIGISMEMBER(ps->ps_sigreset, sig)) { /* @@ -2679,6 +2792,7 @@ postsig(sig) } (*p->p_sysent->sv_sendsig)(action, &ksi, &returnmask); } + return (1); } /* @@ -2826,12 +2940,51 @@ childproc_exited(struct proc *p) sigparent(p, reason, status); } +/* + * We only have 1 character for the core count in the format + * string, so the range will be 0-9 + */ +#define MAX_NUM_CORES 10 +static int num_cores = 5; + +static int +sysctl_debug_num_cores_check (SYSCTL_HANDLER_ARGS) +{ + int error; + int new_val; + + error = sysctl_handle_int(oidp, &new_val, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + if (new_val > MAX_NUM_CORES) + new_val = MAX_NUM_CORES; + if (new_val < 0) + new_val = 0; + num_cores = new_val; + return (0); +} +SYSCTL_PROC(_debug, OID_AUTO, ncores, CTLTYPE_INT|CTLFLAG_RW, + 0, sizeof(int), sysctl_debug_num_cores_check, "I", ""); + +#if defined(COMPRESS_USER_CORES) +int compress_user_cores = 1; +SYSCTL_INT(_kern, OID_AUTO, compress_user_cores, CTLFLAG_RW, + &compress_user_cores, 0, ""); + +int compress_user_cores_gzlevel = -1; /* default level */ +SYSCTL_INT(_kern, OID_AUTO, compress_user_cores_gzlevel, CTLFLAG_RW, + &compress_user_cores_gzlevel, -1, "user core gz compression level"); + +#define GZ_SUFFIX ".gz" +#define GZ_SUFFIX_LEN 3 +#endif + static char corefilename[MAXPATHLEN] = {"%N.core"}; SYSCTL_STRING(_kern, OID_AUTO, corefile, CTLFLAG_RW, corefilename, sizeof(corefilename), "process corefile name format string"); /* - * expand_name(name, uid, pid) + * expand_name(name, uid, pid, td, compress) * Expand the name described in corefilename, using name, uid, and pid. * corefilename is a printf-like string, with three format specifiers: * %N name of process ("name") @@ -2842,20 +2995,21 @@ SYSCTL_STRING(_kern, OID_AUTO, corefile, CTLFLAG_RW, corefilename, * This is controlled by the sysctl variable kern.corefile (see above). */ static char * -expand_name(name, uid, pid) - const char *name; - uid_t uid; - pid_t pid; +expand_name(const char *name, uid_t uid, pid_t pid, struct thread *td, + int compress) { struct sbuf sb; const char *format; char *temp; size_t i; - + int indexpos; + char hostname[MAXHOSTNAMELEN]; + format = corefilename; temp = malloc(MAXPATHLEN, M_TEMP, M_NOWAIT | M_ZERO); if (temp == NULL) return (NULL); + indexpos = -1; (void)sbuf_new(&sb, temp, MAXPATHLEN, SBUF_FIXEDLEN); for (i = 0; format[i]; i++) { switch (format[i]) { @@ -2865,6 +3019,15 @@ expand_name(name, uid, pid) case '%': sbuf_putc(&sb, '%'); break; + case 'H': /* hostname */ + getcredhostname(td->td_ucred, hostname, + sizeof(hostname)); + sbuf_printf(&sb, "%s", hostname); + break; + case 'I': /* autoincrementing index */ + sbuf_printf(&sb, "0"); + indexpos = sbuf_len(&sb) - 1; + break; case 'N': /* process name */ sbuf_printf(&sb, "%s", name); break; @@ -2884,6 +3047,11 @@ expand_name(name, uid, pid) sbuf_putc(&sb, format[i]); } } +#ifdef COMPRESS_USER_CORES + if (compress) { + sbuf_printf(&sb, GZ_SUFFIX); + } +#endif if (sbuf_overflowed(&sb)) { sbuf_delete(&sb); log(LOG_ERR, "pid %ld (%s), uid (%lu): corename is too " @@ -2893,6 +3061,53 @@ expand_name(name, uid, pid) } sbuf_finish(&sb); sbuf_delete(&sb); + + /* + * If the core format has a %I in it, then we need to check + * for existing corefiles before returning a name. + * To do this we iterate over 0..num_cores to find a + * non-existing core file name to use. + */ + if (indexpos != -1) { + struct nameidata nd; + int error, n; + int flags = O_CREAT | O_EXCL | FWRITE | O_NOFOLLOW; + int cmode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; + int vfslocked; + + for (n = 0; n < num_cores; n++) { + temp[indexpos] = '0' + n; + NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, + temp, td); + error = vn_open(&nd, &flags, cmode, NULL); + if (error) { + if (error == EEXIST) { + continue; + } + log(LOG_ERR, + "pid %d (%s), uid (%u): Path `%s' failed " + "on initial open test, error = %d\n", + pid, name, uid, temp, error); + free(temp, M_TEMP); + return (NULL); + } + vfslocked = NDHASGIANT(&nd); + NDFREE(&nd, NDF_ONLY_PNBUF); + VOP_UNLOCK(nd.ni_vp, 0); + error = vn_close(nd.ni_vp, FWRITE, td->td_ucred, td); + VFS_UNLOCK_GIANT(vfslocked); + if (error) { + log(LOG_ERR, + "pid %d (%s), uid (%u): Path `%s' failed " + "on close after initial open test, " + "error = %d\n", + pid, name, uid, temp, error); + free(temp, M_TEMP); + return (NULL); + } + break; + } + } return (temp); } @@ -2918,12 +3133,19 @@ coredump(struct thread *td) char *name; /* name of corefile */ off_t limit; int vfslocked; + int compress; +#ifdef COMPRESS_USER_CORES + compress = compress_user_cores; +#else + compress = 0; +#endif PROC_LOCK_ASSERT(p, MA_OWNED); MPASS((p->p_flag & P_HADTHREADS) == 0 || p->p_singlethread == td); _STOPEVENT(p, S_CORE, 0); - name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid); + name = expand_name(p->p_comm, td->td_ucred->cr_uid, p->p_pid, td, + compress); if (name == NULL) { PROC_UNLOCK(p); #ifdef AUDIT @@ -3014,7 +3236,7 @@ restart: PROC_UNLOCK(p); error = p->p_sysent->sv_coredump ? - p->p_sysent->sv_coredump(td, vp, limit) : + p->p_sysent->sv_coredump(td, vp, limit, compress ? IMGACT_CORE_COMPRESS : 0) : ENOSYS; if (locked) { @@ -3066,8 +3288,13 @@ pgsigio(sigiop, sig, checkctty) struct sigio **sigiop; int sig, checkctty; { + ksiginfo_t ksi; struct sigio *sigio; + ksiginfo_init(&ksi); + ksi.ksi_signo = sig; + ksi.ksi_code = SI_KERNEL; + SIGIO_LOCK(); sigio = *sigiop; if (sigio == NULL) { diff --git a/sys/kern/kern_sx.c b/sys/kern/kern_sx.c index c00b267e5d26..37e5d032af9b 100644 --- a/sys/kern/kern_sx.c +++ b/sys/kern/kern_sx.c @@ -705,8 +705,12 @@ _sx_xunlock_hard(struct sx *sx, uintptr_t tid, const char *file, int line) * ideal. It gives precedence to shared waiters if they are * present. For this condition, we have to preserve the * state of the exclusive waiters flag. + * If interruptible sleeps left the shared queue empty avoid a + * starvation for the threads sleeping on the exclusive queue by giving + * them precedence and cleaning up the shared waiters bit anyway. */ - if (sx->sx_lock & SX_LOCK_SHARED_WAITERS) { + if ((sx->sx_lock & SX_LOCK_SHARED_WAITERS) != 0 && + sleepq_sleepcnt(&sx->lock_object, SQ_SHARED_QUEUE) != 0) { queue = SQ_SHARED_QUEUE; x |= (sx->sx_lock & SX_LOCK_EXCLUSIVE_WAITERS); } else @@ -931,7 +935,7 @@ _sx_sunlock_hard(struct sx *sx, const char *file, int line) * so, just drop one and return. */ if (SX_SHARERS(x) > 1) { - if (atomic_cmpset_ptr(&sx->sx_lock, x, + if (atomic_cmpset_rel_ptr(&sx->sx_lock, x, x - SX_ONE_SHARER)) { if (LOCK_LOG_TEST(&sx->lock_object, 0)) CTR4(KTR_LOCK, @@ -949,8 +953,8 @@ _sx_sunlock_hard(struct sx *sx, const char *file, int line) */ if (!(x & SX_LOCK_EXCLUSIVE_WAITERS)) { MPASS(x == SX_SHARERS_LOCK(1)); - if (atomic_cmpset_ptr(&sx->sx_lock, SX_SHARERS_LOCK(1), - SX_LOCK_UNLOCKED)) { + if (atomic_cmpset_rel_ptr(&sx->sx_lock, + SX_SHARERS_LOCK(1), SX_LOCK_UNLOCKED)) { if (LOCK_LOG_TEST(&sx->lock_object, 0)) CTR2(KTR_LOCK, "%s: %p last succeeded", __func__, sx); @@ -973,7 +977,7 @@ _sx_sunlock_hard(struct sx *sx, const char *file, int line) * Note that the state of the lock could have changed, * so if it fails loop back and retry. */ - if (!atomic_cmpset_ptr(&sx->sx_lock, + if (!atomic_cmpset_rel_ptr(&sx->sx_lock, SX_SHARERS_LOCK(1) | SX_LOCK_EXCLUSIVE_WAITERS, SX_LOCK_UNLOCKED)) { sleepq_release(&sx->lock_object); diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c index 630069b59407..116e79bae333 100644 --- a/sys/kern/kern_thr.c +++ b/sys/kern/kern_thr.c @@ -282,7 +282,7 @@ thr_exit(struct thread *td, struct thr_exit_args *uap) } PROC_LOCK(p); - sigqueue_flush(&td->td_sigqueue); + tdsigcleanup(td); PROC_SLOCK(p); /* @@ -303,12 +303,18 @@ int thr_kill(struct thread *td, struct thr_kill_args *uap) /* long id, int sig */ { + ksiginfo_t ksi; struct thread *ttd; struct proc *p; int error; p = td->td_proc; error = 0; + ksiginfo_init(&ksi); + ksi.ksi_signo = uap->sig; + ksi.ksi_code = SI_USER; + ksi.ksi_pid = p->p_pid; + ksi.ksi_uid = td->td_ucred->cr_ruid; PROC_LOCK(p); if (uap->id == -1) { if (uap->sig != 0 && !_SIG_VALID(uap->sig)) { @@ -320,7 +326,7 @@ thr_kill(struct thread *td, struct thr_kill_args *uap) error = 0; if (uap->sig == 0) break; - tdsignal(p, ttd, uap->sig, NULL); + tdsignal(p, ttd, uap->sig, &ksi); } } } @@ -336,7 +342,7 @@ thr_kill(struct thread *td, struct thr_kill_args *uap) else if (!_SIG_VALID(uap->sig)) error = EINVAL; else - tdsignal(p, ttd, uap->sig, NULL); + tdsignal(p, ttd, uap->sig, &ksi); } PROC_UNLOCK(p); return (error); @@ -346,6 +352,7 @@ int thr_kill2(struct thread *td, struct thr_kill2_args *uap) /* pid_t pid, long id, int sig */ { + ksiginfo_t ksi; struct thread *ttd; struct proc *p; int error; @@ -362,6 +369,11 @@ thr_kill2(struct thread *td, struct thr_kill2_args *uap) error = p_cansignal(td, p, uap->sig); if (error == 0) { + ksiginfo_init(&ksi); + ksi.ksi_signo = uap->sig; + ksi.ksi_code = SI_USER; + ksi.ksi_pid = td->td_proc->p_pid; + ksi.ksi_uid = td->td_ucred->cr_ruid; if (uap->id == -1) { if (uap->sig != 0 && !_SIG_VALID(uap->sig)) { error = EINVAL; @@ -372,7 +384,8 @@ thr_kill2(struct thread *td, struct thr_kill2_args *uap) error = 0; if (uap->sig == 0) break; - tdsignal(p, ttd, uap->sig, NULL); + tdsignal(p, ttd, uap->sig, + &ksi); } } } @@ -388,7 +401,7 @@ thr_kill2(struct thread *td, struct thr_kill2_args *uap) else if (!_SIG_VALID(uap->sig)) error = EINVAL; else - tdsignal(p, ttd, uap->sig, NULL); + tdsignal(p, ttd, uap->sig, &ksi); } } PROC_UNLOCK(p); diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index 4f3b32cdd0ae..9be4c2f3eb32 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -27,6 +27,7 @@ */ #include "opt_witness.h" +#include "opt_hwpmc_hooks.h" #include __FBSDID("$FreeBSD$"); @@ -47,6 +48,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef HWPMC_HOOKS +#include +#endif #include @@ -417,6 +421,14 @@ thread_exit(void) panic ("thread_exit: Last thread exiting on its own"); } } +#ifdef HWPMC_HOOKS + /* + * If this thread is part of a process that is being tracked by hwpmc(4), + * inform the module of the thread's impending exit. + */ + if (PMC_PROC_IS_USING_PMCS(td->td_proc)) + PMC_SWITCH_CONTEXT(td, PMC_FN_CSW_OUT); +#endif PROC_UNLOCK(p); thread_lock(td); /* Save our tick information with both the thread and proc locked */ diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c index 3ce5069db223..c38888a5f891 100644 --- a/sys/kern/kern_timeout.c +++ b/sys/kern/kern_timeout.c @@ -82,6 +82,23 @@ SYSCTL_INT(_debug, OID_AUTO, to_avg_mpcalls, CTLFLAG_RD, &avg_mpcalls, 0, */ int callwheelsize, callwheelbits, callwheelmask; +/* + * There is one struct callout_cpu per cpu, holding all relevant + * state for the callout processing thread on the individual CPU. + * In particular: + * cc_ticks is incremented once per tick in callout_cpu(). + * It tracks the global 'ticks' but in a way that the individual + * threads should not worry about races in the order in which + * hardclock() and hardclock_cpu() run on the various CPUs. + * cc_softclock is advanced in callout_cpu() to point to the + * first entry in cc_callwheel that may need handling. In turn, + * a softclock() is scheduled so it can serve the various entries i + * such that cc_softclock <= i <= cc_ticks . + * XXX maybe cc_softclock and cc_ticks should be volatile ? + * + * cc_ticks is also used in callout_reset_cpu() to determine + * when the callout should be served. + */ struct callout_cpu { struct mtx cc_lock; struct callout *cc_callout; @@ -90,6 +107,7 @@ struct callout_cpu { struct callout *cc_next; struct callout *cc_curr; void *cc_cookie; + int cc_ticks; int cc_softticks; int cc_cancel; int cc_waiting; @@ -244,7 +262,8 @@ callout_tick(void) need_softclock = 0; cc = CC_SELF(); mtx_lock_spin_flags(&cc->cc_lock, MTX_QUIET); - for (; (cc->cc_softticks - ticks) <= 0; cc->cc_softticks++) { + cc->cc_ticks++; + for (; (cc->cc_softticks - cc->cc_ticks) <= 0; cc->cc_softticks++) { bucket = cc->cc_softticks & callwheelmask; if (!TAILQ_EMPTY(&cc->cc_callwheel[bucket])) { need_softclock = 1; @@ -323,7 +342,7 @@ softclock(void *arg) steps = 0; cc = (struct callout_cpu *)arg; CC_LOCK(cc); - while (cc->cc_softticks - 1 != ticks) { + while (cc->cc_softticks - 1 != cc->cc_ticks) { /* * cc_softticks may be modified by hard clock, so cache * it while we work on a given bucket. @@ -622,7 +641,7 @@ retry: c->c_arg = arg; c->c_flags |= (CALLOUT_ACTIVE | CALLOUT_PENDING); c->c_func = ftn; - c->c_time = ticks + to_ticks; + c->c_time = cc->cc_ticks + to_ticks; TAILQ_INSERT_TAIL(&cc->cc_callwheel[c->c_time & callwheelmask], c, c_links.tqe); CTR5(KTR_CALLOUT, "%sscheduled %p func %p arg %p in %d", diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 2ab099d758fc..14a79a3dafa6 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -58,13 +58,16 @@ __FBSDID("$FreeBSD$"); #include #endif -#define TYPE_SIMPLE_WAIT 0 -#define TYPE_CV 1 -#define TYPE_SIMPLE_LOCK 2 -#define TYPE_NORMAL_UMUTEX 3 -#define TYPE_PI_UMUTEX 4 -#define TYPE_PP_UMUTEX 5 -#define TYPE_RWLOCK 6 +enum { + TYPE_SIMPLE_WAIT, + TYPE_CV, + TYPE_SEM, + TYPE_SIMPLE_LOCK, + TYPE_NORMAL_UMUTEX, + TYPE_PI_UMUTEX, + TYPE_PP_UMUTEX, + TYPE_RWLOCK +}; #define _UMUTEX_TRY 1 #define _UMUTEX_WAIT 2 @@ -141,20 +144,38 @@ struct umtx_q { /* Inherited priority from PP mutex */ u_char uq_inherited_pri; + + /* Spare queue ready to be reused */ + struct umtxq_queue *uq_spare_queue; + + /* The queue we on */ + struct umtxq_queue *uq_cur_queue; }; TAILQ_HEAD(umtxq_head, umtx_q); +/* Per-key wait-queue */ +struct umtxq_queue { + struct umtxq_head head; + struct umtx_key key; + LIST_ENTRY(umtxq_queue) link; + int length; +}; + +LIST_HEAD(umtxq_list, umtxq_queue); + /* Userland lock object's wait-queue chain */ struct umtxq_chain { /* Lock for this chain. */ struct mtx uc_lock; /* List of sleep queues. */ - struct umtxq_head uc_queue[2]; + struct umtxq_list uc_queue[2]; #define UMTX_SHARED_QUEUE 0 #define UMTX_EXCLUSIVE_QUEUE 1 + LIST_HEAD(, umtxq_queue) uc_spare_queue; + /* Busy flag */ char uc_busy; @@ -163,6 +184,7 @@ struct umtxq_chain { /* All PI in the list */ TAILQ_HEAD(,umtx_pi) uc_pi_list; + }; #define UMTXQ_LOCKED_ASSERT(uc) mtx_assert(&(uc)->uc_lock, MA_OWNED) @@ -244,8 +266,9 @@ umtxq_sysinit(void *arg __unused) for (j = 0; j < UMTX_CHAINS; ++j) { mtx_init(&umtxq_chains[i][j].uc_lock, "umtxql", NULL, MTX_DEF | MTX_DUPOK); - TAILQ_INIT(&umtxq_chains[i][j].uc_queue[0]); - TAILQ_INIT(&umtxq_chains[i][j].uc_queue[1]); + LIST_INIT(&umtxq_chains[i][j].uc_queue[0]); + LIST_INIT(&umtxq_chains[i][j].uc_queue[1]); + LIST_INIT(&umtxq_chains[i][j].uc_spare_queue); TAILQ_INIT(&umtxq_chains[i][j].uc_pi_list); umtxq_chains[i][j].uc_busy = 0; umtxq_chains[i][j].uc_waiters = 0; @@ -262,6 +285,8 @@ umtxq_alloc(void) struct umtx_q *uq; uq = malloc(sizeof(struct umtx_q), M_UMTX, M_WAITOK | M_ZERO); + uq->uq_spare_queue = malloc(sizeof(struct umtxq_queue), M_UMTX, M_WAITOK | M_ZERO); + TAILQ_INIT(&uq->uq_spare_queue->head); TAILQ_INIT(&uq->uq_pi_contested); uq->uq_inherited_pri = PRI_MAX; return (uq); @@ -270,6 +295,8 @@ umtxq_alloc(void) void umtxq_free(struct umtx_q *uq) { + MPASS(uq->uq_spare_queue != NULL); + free(uq->uq_spare_queue, M_UMTX); free(uq, M_UMTX); } @@ -291,7 +318,7 @@ umtx_key_match(const struct umtx_key *k1, const struct umtx_key *k2) static inline struct umtxq_chain * umtxq_getchain(struct umtx_key *key) { - if (key->type <= TYPE_CV) + if (key->type <= TYPE_SEM) return (&umtxq_chains[1][key->hash]); return (&umtxq_chains[0][key->hash]); } @@ -368,27 +395,72 @@ umtxq_unbusy(struct umtx_key *key) wakeup_one(uc); } +static struct umtxq_queue * +umtxq_queue_lookup(struct umtx_key *key, int q) +{ + struct umtxq_queue *uh; + struct umtxq_chain *uc; + + uc = umtxq_getchain(key); + UMTXQ_LOCKED_ASSERT(uc); + LIST_FOREACH(uh, &uc->uc_queue[q], link) { + if (umtx_key_match(&uh->key, key)) + return (uh); + } + + return (NULL); +} + static inline void umtxq_insert_queue(struct umtx_q *uq, int q) { + struct umtxq_queue *uh; struct umtxq_chain *uc; uc = umtxq_getchain(&uq->uq_key); UMTXQ_LOCKED_ASSERT(uc); - TAILQ_INSERT_TAIL(&uc->uc_queue[q], uq, uq_link); + KASSERT((uq->uq_flags & UQF_UMTXQ) == 0, ("umtx_q is already on queue")); + uh = umtxq_queue_lookup(&uq->uq_key, q); + if (uh != NULL) { + LIST_INSERT_HEAD(&uc->uc_spare_queue, uq->uq_spare_queue, link); + } else { + uh = uq->uq_spare_queue; + uh->key = uq->uq_key; + LIST_INSERT_HEAD(&uc->uc_queue[q], uh, link); + } + uq->uq_spare_queue = NULL; + + TAILQ_INSERT_TAIL(&uh->head, uq, uq_link); + uh->length++; uq->uq_flags |= UQF_UMTXQ; + uq->uq_cur_queue = uh; + return; } static inline void umtxq_remove_queue(struct umtx_q *uq, int q) { struct umtxq_chain *uc; + struct umtxq_queue *uh; uc = umtxq_getchain(&uq->uq_key); UMTXQ_LOCKED_ASSERT(uc); if (uq->uq_flags & UQF_UMTXQ) { - TAILQ_REMOVE(&uc->uc_queue[q], uq, uq_link); + uh = uq->uq_cur_queue; + TAILQ_REMOVE(&uh->head, uq, uq_link); + uh->length--; uq->uq_flags &= ~UQF_UMTXQ; + if (TAILQ_EMPTY(&uh->head)) { + KASSERT(uh->length == 0, + ("inconsistent umtxq_queue length")); + LIST_REMOVE(uh, link); + } else { + uh = LIST_FIRST(&uc->uc_spare_queue); + KASSERT(uh != NULL, ("uc_spare_queue is empty")); + LIST_REMOVE(uh, link); + } + uq->uq_spare_queue = uh; + uq->uq_cur_queue = NULL; } } @@ -399,18 +471,14 @@ static int umtxq_count(struct umtx_key *key) { struct umtxq_chain *uc; - struct umtx_q *uq; - int count = 0; + struct umtxq_queue *uh; uc = umtxq_getchain(key); UMTXQ_LOCKED_ASSERT(uc); - TAILQ_FOREACH(uq, &uc->uc_queue[UMTX_SHARED_QUEUE], uq_link) { - if (umtx_key_match(&uq->uq_key, key)) { - if (++count > 1) - break; - } - } - return (count); + uh = umtxq_queue_lookup(key, UMTX_SHARED_QUEUE); + if (uh != NULL) + return (uh->length); + return (0); } /* @@ -421,20 +489,17 @@ static int umtxq_count_pi(struct umtx_key *key, struct umtx_q **first) { struct umtxq_chain *uc; - struct umtx_q *uq; - int count = 0; + struct umtxq_queue *uh; *first = NULL; uc = umtxq_getchain(key); UMTXQ_LOCKED_ASSERT(uc); - TAILQ_FOREACH(uq, &uc->uc_queue[UMTX_SHARED_QUEUE], uq_link) { - if (umtx_key_match(&uq->uq_key, key)) { - if (++count > 1) - break; - *first = uq; - } + uh = umtxq_queue_lookup(key, UMTX_SHARED_QUEUE); + if (uh != NULL) { + *first = TAILQ_FIRST(&uh->head); + return (uh->length); } - return (count); + return (0); } /* @@ -445,18 +510,20 @@ static int umtxq_signal_queue(struct umtx_key *key, int n_wake, int q) { struct umtxq_chain *uc; - struct umtx_q *uq, *next; + struct umtxq_queue *uh; + struct umtx_q *uq; int ret; ret = 0; uc = umtxq_getchain(key); UMTXQ_LOCKED_ASSERT(uc); - TAILQ_FOREACH_SAFE(uq, &uc->uc_queue[q], uq_link, next) { - if (umtx_key_match(&uq->uq_key, key)) { + uh = umtxq_queue_lookup(key, q); + if (uh != NULL) { + while ((uq = TAILQ_FIRST(&uh->head)) != NULL) { umtxq_remove_queue(uq, q); wakeup(uq); if (++ret >= n_wake) - break; + return (ret); } } return (ret); @@ -1521,12 +1588,8 @@ umtxq_sleep_pi(struct umtx_q *uq, struct umtx_pi *pi, if (pi->pi_owner == NULL) { /* XXX * Current, We only support process private PI-mutex, - * non-contended PI-mutexes are locked in userland. - * Process shared PI-mutex should always be initialized - * by kernel and be registered in kernel, locking should - * always be done by kernel to avoid security problems. - * For process private PI-mutex, we can find owner - * thread and boost its priority safely. + * we need a faster way to find an owner thread for + * process-shared mutex (not available yet). */ mtx_unlock_spin(&umtx_lock); PROC_LOCK(curproc); @@ -2463,6 +2526,12 @@ do_rw_rdlock(struct thread *td, struct urwlock *rwlock, long fflag, int timo) umtxq_busy(&uq->uq_key); umtxq_unlock(&uq->uq_key); + /* + * re-read the state, in case it changed between the try-lock above + * and the check below + */ + state = fuword32(__DEVOLATILE(int32_t *, &rwlock->rw_state)); + /* set read contention bit */ while ((state & wrflags) && !(state & URWLOCK_READ_WAITERS)) { oldstate = casuword32(&rwlock->rw_state, state, state | URWLOCK_READ_WAITERS); @@ -2595,6 +2664,12 @@ do_rw_wrlock(struct thread *td, struct urwlock *rwlock, int timo) umtxq_busy(&uq->uq_key); umtxq_unlock(&uq->uq_key); + /* + * re-read the state, in case it changed between the try-lock above + * and the check below + */ + state = fuword32(__DEVOLATILE(int32_t *, &rwlock->rw_state)); + while (((state & URWLOCK_WRITE_OWNER) || URWLOCK_READER_COUNT(state) != 0) && (state & URWLOCK_WRITE_WAITERS) == 0) { oldstate = casuword32(&rwlock->rw_state, state, state | URWLOCK_WRITE_WAITERS); @@ -2759,6 +2834,106 @@ out: return (error); } +static int +do_sem_wait(struct thread *td, struct _usem *sem, struct timespec *timeout) +{ + struct umtx_q *uq; + struct timeval tv; + struct timespec cts, ets, tts; + uint32_t flags, count; + int error; + + uq = td->td_umtxq; + flags = fuword32(&sem->_flags); + error = umtx_key_get(sem, TYPE_SEM, GET_SHARE(flags), &uq->uq_key); + if (error != 0) + return (error); + umtxq_lock(&uq->uq_key); + umtxq_busy(&uq->uq_key); + umtxq_insert(uq); + umtxq_unlock(&uq->uq_key); + + suword32(__DEVOLATILE(uint32_t *, &sem->_has_waiters), 1); + + count = fuword32(__DEVOLATILE(uint32_t *, &sem->_count)); + if (count != 0) { + umtxq_lock(&uq->uq_key); + umtxq_unbusy(&uq->uq_key); + umtxq_remove(uq); + umtxq_unlock(&uq->uq_key); + umtx_key_release(&uq->uq_key); + return (0); + } + + umtxq_lock(&uq->uq_key); + umtxq_unbusy(&uq->uq_key); + umtxq_unlock(&uq->uq_key); + + umtxq_lock(&uq->uq_key); + if (timeout == NULL) { + error = umtxq_sleep(uq, "usem", 0); + } else { + getnanouptime(&ets); + timespecadd(&ets, timeout); + TIMESPEC_TO_TIMEVAL(&tv, timeout); + for (;;) { + error = umtxq_sleep(uq, "usem", tvtohz(&tv)); + if (error != ETIMEDOUT) + break; + getnanouptime(&cts); + if (timespeccmp(&cts, &ets, >=)) { + error = ETIMEDOUT; + break; + } + tts = ets; + timespecsub(&tts, &cts); + TIMESPEC_TO_TIMEVAL(&tv, &tts); + } + } + + if (error != 0) { + if ((uq->uq_flags & UQF_UMTXQ) == 0) { + if (!umtxq_signal(&uq->uq_key, 1)) + error = 0; + } + if (error == ERESTART) + error = EINTR; + } + umtxq_remove(uq); + umtxq_unlock(&uq->uq_key); + umtx_key_release(&uq->uq_key); + return (error); +} + +/* + * Signal a userland condition variable. + */ +static int +do_sem_wake(struct thread *td, struct _usem *sem) +{ + struct umtx_key key; + int error, cnt, nwake; + uint32_t flags; + + flags = fuword32(&sem->_flags); + if ((error = umtx_key_get(sem, TYPE_SEM, GET_SHARE(flags), &key)) != 0) + return (error); + umtxq_lock(&key); + umtxq_busy(&key); + cnt = umtxq_count(&key); + nwake = umtxq_signal(&key, 1); + if (cnt <= nwake) { + umtxq_unlock(&key); + error = suword32( + __DEVOLATILE(uint32_t *, &sem->_has_waiters), 0); + umtxq_lock(&key); + } + umtxq_unbusy(&key); + umtxq_unlock(&key); + umtx_key_release(&key); + return (error); +} + int _umtx_lock(struct thread *td, struct _umtx_lock_args *uap) /* struct umtx *umtx */ @@ -3031,6 +3206,35 @@ __umtx_op_rw_unlock(struct thread *td, struct _umtx_op_args *uap) return do_rw_unlock(td, uap->obj); } +static int +__umtx_op_sem_wait(struct thread *td, struct _umtx_op_args *uap) +{ + struct timespec *ts, timeout; + int error; + + /* Allow a null timespec (wait forever). */ + if (uap->uaddr2 == NULL) + ts = NULL; + else { + error = copyin(uap->uaddr2, &timeout, + sizeof(timeout)); + if (error != 0) + return (error); + if (timeout.tv_nsec >= 1000000000 || + timeout.tv_nsec < 0) { + return (EINVAL); + } + ts = &timeout; + } + return (do_sem_wait(td, uap->obj, ts)); +} + +static int +__umtx_op_sem_wake(struct thread *td, struct _umtx_op_args *uap) +{ + return do_sem_wake(td, uap->obj); +} + typedef int (*_umtx_op_func)(struct thread *td, struct _umtx_op_args *uap); static _umtx_op_func op_table[] = { @@ -3052,7 +3256,9 @@ static _umtx_op_func op_table[] = { __umtx_op_wait_uint_private, /* UMTX_OP_WAIT_UINT_PRIVATE */ __umtx_op_wake_private, /* UMTX_OP_WAKE_PRIVATE */ __umtx_op_wait_umutex, /* UMTX_OP_UMUTEX_WAIT */ - __umtx_op_wake_umutex /* UMTX_OP_UMUTEX_WAKE */ + __umtx_op_wake_umutex, /* UMTX_OP_UMUTEX_WAKE */ + __umtx_op_sem_wait, /* UMTX_OP_SEM_WAIT */ + __umtx_op_sem_wake /* UMTX_OP_SEM_WAKE */ }; int @@ -3274,6 +3480,27 @@ __umtx_op_wait_uint_private_compat32(struct thread *td, struct _umtx_op_args *ua return do_wait(td, uap->obj, uap->val, ts, 1, 1); } +static int +__umtx_op_sem_wait_compat32(struct thread *td, struct _umtx_op_args *uap) +{ + struct timespec *ts, timeout; + int error; + + /* Allow a null timespec (wait forever). */ + if (uap->uaddr2 == NULL) + ts = NULL; + else { + error = copyin_timeout32(uap->uaddr2, &timeout); + if (error != 0) + return (error); + if (timeout.tv_nsec >= 1000000000 || + timeout.tv_nsec < 0) + return (EINVAL); + ts = &timeout; + } + return (do_sem_wait(td, uap->obj, ts)); +} + static _umtx_op_func op_table_compat32[] = { __umtx_op_lock_umtx_compat32, /* UMTX_OP_LOCK */ __umtx_op_unlock_umtx_compat32, /* UMTX_OP_UNLOCK */ @@ -3293,7 +3520,9 @@ static _umtx_op_func op_table_compat32[] = { __umtx_op_wait_uint_private_compat32, /* UMTX_OP_WAIT_UINT_PRIVATE */ __umtx_op_wake_private, /* UMTX_OP_WAKE_PRIVATE */ __umtx_op_wait_umutex_compat32, /* UMTX_OP_UMUTEX_WAIT */ - __umtx_op_wake_umutex /* UMTX_OP_UMUTEX_WAKE */ + __umtx_op_wake_umutex, /* UMTX_OP_UMUTEX_WAKE */ + __umtx_op_sem_wait_compat32, /* UMTX_OP_SEM_WAIT */ + __umtx_op_sem_wake /* UMTX_OP_SEM_WAKE */ }; int diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c index 68c60d8d62db..a337fd00c620 100644 --- a/sys/kern/link_elf_obj.c +++ b/sys/kern/link_elf_obj.c @@ -853,8 +853,8 @@ link_elf_load_file(linker_class_t cls, const char *filename, panic("lost relatab"); if (mapbase != (vm_offset_t)ef->address + mapsize) panic("mapbase 0x%lx != address %p + mapsize 0x%lx (0x%lx)\n", - mapbase, ef->address, mapsize, - (vm_offset_t)ef->address + mapsize); + (u_long)mapbase, ef->address, (u_long)mapsize, + (u_long)(vm_offset_t)ef->address + mapsize); /* Local intra-module relocations */ link_elf_reloc_local(lf); diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh index 41a89c6ce5c2..64cdcdf400cd 100644 --- a/sys/kern/makesyscalls.sh +++ b/sys/kern/makesyscalls.sh @@ -497,23 +497,6 @@ s/\$//g syscall++ next } - type("LIBCOMPAT") { - ncompat++ - parseline() - printf("%s\to%s();\n", rettype, funcname) > syscompatdcl - printf("\t{ compat(%s,%s), %s, NULL, 0, 0, %s },", - argssize, funcname, auditev, flags) > sysent - align_sysent_comment(8 + 9 + \ - length(argssize) + 1 + length(funcname) + length(auditev) + length(flags) + 4) - printf("/* %d = old %s */\n", syscall, funcalias) > sysent - printf("\t\"old.%s\",\t\t/* %d = old %s */\n", - funcalias, syscall, funcalias) > sysnames - printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", - syscallprefix, funcalias, syscall) > syshdr - printf(" \\\n\t%s.o", funcalias) > sysmk - syscall++ - next - } type("OBSOL") { printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0 },") > sysent align_sysent_comment(34) diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c index 4fe1c1415f2c..cf215f5355dd 100644 --- a/sys/kern/sched_4bsd.c +++ b/sys/kern/sched_4bsd.c @@ -728,10 +728,10 @@ sched_exit_thread(struct thread *td, struct thread *child) thread_lock(td); td->td_estcpu = ESTCPULIM(td->td_estcpu + child->td_estcpu); thread_unlock(td); - mtx_lock_spin(&sched_lock); - if ((child->td_proc->p_flag & P_NOLOAD) == 0) + thread_lock(child); + if ((child->td_flags & TDF_NOLOAD) == 0) sched_load_rem(); - mtx_unlock_spin(&sched_lock); + thread_unlock(child); } void @@ -913,16 +913,18 @@ sched_sleep(struct thread *td, int pri) td->td_sched->ts_slptime = 0; if (pri) sched_prio(td, pri); - if (TD_IS_SUSPENDED(td) || pri <= PSOCK) + if (TD_IS_SUSPENDED(td) || pri >= PSOCK) td->td_flags |= TDF_CANSWAP; } void sched_switch(struct thread *td, struct thread *newtd, int flags) { + struct mtx *tmtx; struct td_sched *ts; struct proc *p; + tmtx = NULL; ts = td->td_sched; p = td->td_proc; @@ -931,17 +933,20 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) /* * Switch to the sched lock to fix things up and pick * a new thread. + * Block the td_lock in order to avoid breaking the critical path. */ if (td->td_lock != &sched_lock) { mtx_lock_spin(&sched_lock); - thread_unlock(td); + tmtx = thread_lock_block(td); } - if ((p->p_flag & P_NOLOAD) == 0) + if ((td->td_flags & TDF_NOLOAD) == 0) sched_load_rem(); - if (newtd) + if (newtd) { + MPASS(newtd->td_lock == &sched_lock); newtd->td_flags |= (td->td_flags & TDF_NEEDRESCHED); + } td->td_lastcpu = td->td_oncpu; td->td_flags &= ~TDF_NEEDRESCHED; @@ -980,12 +985,12 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) ("trying to run inhibited thread")); newtd->td_flags |= TDF_DIDRUN; TD_SET_RUNNING(newtd); - if ((newtd->td_proc->p_flag & P_NOLOAD) == 0) + if ((newtd->td_flags & TDF_NOLOAD) == 0) sched_load_add(); } else { newtd = choosethread(); + MPASS(newtd->td_lock == &sched_lock); } - MPASS(newtd->td_lock == &sched_lock); if (td != newtd) { #ifdef HWPMC_HOOKS @@ -1004,7 +1009,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) (*dtrace_vtime_switch_func)(newtd); #endif - cpu_switch(td, newtd, td->td_lock); + cpu_switch(td, newtd, tmtx != NULL ? tmtx : td->td_lock); lock_profile_obtain_lock_success(&sched_lock.lock_object, 0, 0, __FILE__, __LINE__); /* @@ -1050,7 +1055,7 @@ sched_wakeup(struct thread *td) updatepri(td); resetpriority(td); } - td->td_slptick = ticks; + td->td_slptick = 0; ts->ts_slptime = 0; sched_add(td, SRQ_BORING); } @@ -1289,7 +1294,7 @@ sched_add(struct thread *td, int flags) } } - if ((td->td_proc->p_flag & P_NOLOAD) == 0) + if ((td->td_flags & TDF_NOLOAD) == 0) sched_load_add(); runq_add(ts->ts_runq, td, flags); if (cpu != NOCPU) @@ -1338,7 +1343,7 @@ sched_add(struct thread *td, int flags) if (maybe_preempt(td)) return; } - if ((td->td_proc->p_flag & P_NOLOAD) == 0) + if ((td->td_flags & TDF_NOLOAD) == 0) sched_load_add(); runq_add(ts->ts_runq, td, flags); maybe_resched(td); @@ -1360,7 +1365,7 @@ sched_rem(struct thread *td) "prio:%d", td->td_priority, KTR_ATTR_LINKED, sched_tdname(curthread)); - if ((td->td_proc->p_flag & P_NOLOAD) == 0) + if ((td->td_flags & TDF_NOLOAD) == 0) sched_load_rem(); #ifdef SMP if (ts->ts_runq != &runq) diff --git a/sys/kern/sched_ule.c b/sys/kern/sched_ule.c index fd14fc4021a3..f29dd95855a7 100644 --- a/sys/kern/sched_ule.c +++ b/sys/kern/sched_ule.c @@ -103,6 +103,7 @@ struct td_sched { u_int ts_slptime; /* Number of ticks we vol. slept */ u_int ts_runtime; /* Number of ticks we were running */ int ts_ltick; /* Last tick that we were running on */ + int ts_incrtick; /* Last tick that we incremented on */ int ts_ftick; /* First tick that we were running on */ int ts_ticks; /* Tick count */ #ifdef KTR @@ -300,7 +301,6 @@ static int sched_pickcpu(struct thread *, int); static void sched_balance(void); static int sched_balance_pair(struct tdq *, struct tdq *); static inline struct tdq *sched_setcpu(struct thread *, int, int); -static inline struct mtx *thread_block_switch(struct thread *); static inline void thread_unblock_switch(struct thread *, struct mtx *); static struct mtx *sched_switch_migrate(struct tdq *, struct thread *, int); static int sysctl_kern_sched_topology_spec(SYSCTL_HANDLER_ARGS); @@ -495,7 +495,7 @@ tdq_load_add(struct tdq *tdq, struct thread *td) THREAD_LOCK_ASSERT(td, MA_OWNED); tdq->tdq_load++; - if ((td->td_proc->p_flag & P_NOLOAD) == 0) + if ((td->td_flags & TDF_NOLOAD) == 0) tdq->tdq_sysload++; KTR_COUNTER0(KTR_SCHED, "load", tdq->tdq_loadname, tdq->tdq_load); } @@ -514,7 +514,7 @@ tdq_load_rem(struct tdq *tdq, struct thread *td) ("tdq_load_rem: Removing with 0 load on queue %d", TDQ_ID(tdq))); tdq->tdq_load--; - if ((td->td_proc->p_flag & P_NOLOAD) == 0) + if ((td->td_flags & TDF_NOLOAD) == 0) tdq->tdq_sysload--; KTR_COUNTER0(KTR_SCHED, "load", tdq->tdq_loadname, tdq->tdq_load); } @@ -773,7 +773,7 @@ sched_balance_group(struct cpu_group *cg) } static void -sched_balance() +sched_balance(void) { struct tdq *tdq; @@ -1105,9 +1105,11 @@ sched_setcpu(struct thread *td, int cpu, int flags) * The hard case, migration, we need to block the thread first to * prevent order reversals with other cpus locks. */ + spinlock_enter(); thread_lock_block(td); TDQ_LOCK(tdq); thread_lock_unblock(td, TDQ_LOCKPTR(tdq)); + spinlock_exit(); return (tdq); } @@ -1406,7 +1408,7 @@ sched_priority(struct thread *td) * score. Negative nice values make it easier for a thread to be * considered interactive. */ - score = imax(0, sched_interact_score(td) - td->td_proc->p_nice); + score = imax(0, sched_interact_score(td) + td->td_proc->p_nice); if (score < sched_interact) { pri = PRI_MIN_REALTIME; pri += ((PRI_MAX_REALTIME - PRI_MIN_REALTIME) / sched_interact) @@ -1713,23 +1715,6 @@ sched_unlend_user_prio(struct thread *td, u_char prio) } } -/* - * Block a thread for switching. Similar to thread_block() but does not - * bump the spin count. - */ -static inline struct mtx * -thread_block_switch(struct thread *td) -{ - struct mtx *lock; - - THREAD_LOCK_ASSERT(td, MA_OWNED); - lock = td->td_lock; - td->td_lock = &blocked_lock; - mtx_unlock_spin(lock); - - return (lock); -} - /* * Handle migration from sched_switch(). This happens only for * cpu binding. @@ -1748,7 +1733,7 @@ sched_switch_migrate(struct tdq *tdq, struct thread *td, int flags) * not holding either run-queue lock. */ spinlock_enter(); - thread_block_switch(td); /* This releases the lock on tdq. */ + thread_lock_block(td); /* This releases the lock on tdq. */ /* * Acquire both run-queue locks before placing the thread on the new @@ -1768,7 +1753,8 @@ sched_switch_migrate(struct tdq *tdq, struct thread *td, int flags) } /* - * Release a thread that was blocked with thread_block_switch(). + * Variadic version of thread_lock_unblock() that does not assume td_lock + * is blocked. */ static inline void thread_unblock_switch(struct thread *td, struct mtx *mtx) @@ -1824,7 +1810,7 @@ sched_switch(struct thread *td, struct thread *newtd, int flags) } else { /* This thread must be going to sleep. */ TDQ_LOCK(tdq); - mtx = thread_block_switch(td); + mtx = thread_lock_block(td); tdq_load_rem(tdq, td); } /* @@ -1908,7 +1894,7 @@ sched_sleep(struct thread *td, int prio) THREAD_LOCK_ASSERT(td, MA_OWNED); td->td_slptick = ticks; - if (TD_IS_SUSPENDED(td) || prio <= PSOCK) + if (TD_IS_SUSPENDED(td) || prio >= PSOCK) td->td_flags |= TDF_CANSWAP; if (static_boost == 1 && prio) sched_prio(td, prio); @@ -1991,6 +1977,7 @@ sched_fork_thread(struct thread *td, struct thread *child) */ ts2->ts_ticks = ts->ts_ticks; ts2->ts_ltick = ts->ts_ltick; + ts2->ts_incrtick = ts->ts_incrtick; ts2->ts_ftick = ts->ts_ftick; child->td_user_pri = td->td_user_pri; child->td_base_user_pri = td->td_base_user_pri; @@ -2182,11 +2169,12 @@ sched_tick(void) * Ticks is updated asynchronously on a single cpu. Check here to * avoid incrementing ts_ticks multiple times in a single tick. */ - if (ts->ts_ltick == ticks) + if (ts->ts_incrtick == ticks) return; /* Adjust ticks for pctcpu */ ts->ts_ticks += 1 << SCHED_TICK_SHIFT; ts->ts_ltick = ticks; + ts->ts_incrtick = ticks; /* * Update if we've exceeded our desired tick threshhold by over one * second. diff --git a/sys/kern/stack_protector.c b/sys/kern/stack_protector.c index 554d47d0a833..b5f9973e24cf 100644 --- a/sys/kern/stack_protector.c +++ b/sys/kern/stack_protector.c @@ -28,5 +28,4 @@ __stack_chk_init(void *dummy __unused) for (i = 0; i < __arraycount(guard); i++) __stack_chk_guard[i] = guard[i]; } -/* SI_SUB_EVENTHANDLER is right after SI_SUB_LOCK used by arc4rand() init. */ -SYSINIT(stack_chk, SI_SUB_EVENTHANDLER, SI_ORDER_ANY, __stack_chk_init, NULL); +SYSINIT(stack_chk, SI_SUB_RANDOM, SI_ORDER_ANY, __stack_chk_init, NULL); diff --git a/sys/kern/subr_acl_nfs4.c b/sys/kern/subr_acl_nfs4.c index c3f4b65cbd5f..1a015772588b 100644 --- a/sys/kern/subr_acl_nfs4.c +++ b/sys/kern/subr_acl_nfs4.c @@ -82,6 +82,13 @@ _access_mask_from_accmode(accmode_t accmode) access_mask |= accmode2mask[i].mask; } + /* + * VAPPEND is just a modifier for VWRITE; if the caller asked + * for 'VAPPEND | VWRITE', we want to check for ACL_APPEND_DATA only. + */ + if (access_mask & ACL_APPEND_DATA) + access_mask &= ~ACL_WRITE_DATA; + return (access_mask); } @@ -156,6 +163,14 @@ vaccess_acl_nfs4(enum vtype type, uid_t file_uid, gid_t file_gid, int denied, explicitly_denied, access_mask, is_directory, must_be_owner = 0; + KASSERT((accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | VAPPEND | + VEXPLICIT_DENY | VREAD_NAMED_ATTRS | VWRITE_NAMED_ATTRS | + VDELETE_CHILD | VREAD_ATTRIBUTES | VWRITE_ATTRIBUTES | VDELETE | + VREAD_ACL | VWRITE_ACL | VWRITE_OWNER | VSYNCHRONIZE)) == 0, + ("invalid bit in accmode")); + KASSERT((accmode & VAPPEND) == 0 || (accmode & VWRITE), + ("VAPPEND without VWRITE")); + if (privused != NULL) *privused = 0; @@ -970,7 +985,7 @@ _acls_are_equal(const struct acl *a, const struct acl *b) } /* - * This routine is used to determine whether to remove entry_type attribute + * This routine is used to determine whether to remove extended attribute * that stores ACL contents. */ int @@ -989,9 +1004,8 @@ acl_nfs4_is_trivial(const struct acl *aclp, int file_owner_id) * * XXX: I guess there is a faster way to do this. However, even * this slow implementation significantly speeds things up - * for files that don't have any entry_type ACL entries - it's - * critical for performance to not use EA when they are not - * needed. + * for files that don't have non-trivial ACLs - it's critical + * for performance to not use EA when they are not needed. */ tmpaclp = acl_alloc(M_WAITOK | M_ZERO); acl_nfs4_sync_mode_from_acl(&tmpmode, aclp); diff --git a/sys/kern/subr_acl_posix1e.c b/sys/kern/subr_acl_posix1e.c index e0016e7e7673..600067c279ad 100644 --- a/sys/kern/subr_acl_posix1e.c +++ b/sys/kern/subr_acl_posix1e.c @@ -61,6 +61,11 @@ vaccess_acl_posix1e(enum vtype type, uid_t file_uid, gid_t file_gid, accmode_t acl_mask_granted; int group_matched, i; + KASSERT((accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | VAPPEND)) == 0, + ("invalid bit in accmode")); + KASSERT((accmode & VAPPEND) == 0 || (accmode & VWRITE), + ("VAPPEND without VWRITE")); + /* * Look for a normal, non-privileged way to access the file/directory * as requested. If it exists, go with that. Otherwise, attempt to diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 3f51c5cada88..6e939c0ed77b 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -35,6 +35,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -738,7 +739,7 @@ fail: * the first time that no match happens, so we don't keep getting this * message. Should that prove to be undesirable, we can change it. * This is called when all drivers that can attach to a given bus - * decline to accept this device. Other errrors may not be detected. + * decline to accept this device. Other errors may not be detected. */ static void devnomatch(device_t dev) @@ -1049,9 +1050,10 @@ devclass_driver_added(devclass_t dc, driver_t *driver) * @param driver the driver to register */ static int -devclass_add_driver(devclass_t dc, driver_t *driver, int pass) +devclass_add_driver(devclass_t dc, driver_t *driver, int pass, devclass_t *dcp) { driverlink_t dl; + const char *parentname; PDEBUG(("%s", DRIVERNAME(driver))); @@ -1072,9 +1074,17 @@ devclass_add_driver(devclass_t dc, driver_t *driver, int pass) kobj_class_compile((kobj_class_t) driver); /* - * Make sure the devclass which the driver is implementing exists. + * If the driver has any base classes, make the + * devclass inherit from the devclass of the driver's + * first base class. This will allow the system to + * search for drivers in both devclasses for children + * of a device using this driver. */ - devclass_find_internal(driver->name, NULL, TRUE); + if (driver->baseclasses) + parentname = driver->baseclasses[0]->name; + else + parentname = NULL; + *dcp = devclass_find_internal(driver->name, parentname, TRUE); dl->driver = driver; TAILQ_INSERT_TAIL(&dc->drivers, dl, link); @@ -1575,7 +1585,7 @@ devclass_add_device(devclass_t dc, device_t dev) PDEBUG(("%s in devclass %s", DEVICENAME(dev), DEVCLANAME(dc))); - buflen = snprintf(NULL, 0, "%s%d$", dc->name, dev->unit); + buflen = snprintf(NULL, 0, "%s%d$", dc->name, INT_MAX); if (buflen < 0) return (ENOMEM); dev->nameunit = malloc(buflen, M_BUS, M_NOWAIT|M_ZERO); @@ -2856,6 +2866,7 @@ resource_list_add(struct resource_list *rl, int type, int rid, rle->type = type; rle->rid = rid; rle->res = NULL; + rle->flags = 0; } if (rle->res) @@ -2867,6 +2878,34 @@ resource_list_add(struct resource_list *rl, int type, int rid, return (rle); } +/** + * @brief Determine if a resource entry is busy. + * + * Returns true if a resource entry is busy meaning that it has an + * associated resource that is not an unallocated "reserved" resource. + * + * @param rl the resource list to search + * @param type the resource entry type (e.g. SYS_RES_MEMORY) + * @param rid the resource identifier + * + * @returns Non-zero if the entry is busy, zero otherwise. + */ +int +resource_list_busy(struct resource_list *rl, int type, int rid) +{ + struct resource_list_entry *rle; + + rle = resource_list_find(rl, type, rid); + if (rle == NULL || rle->res == NULL) + return (0); + if ((rle->flags & (RLE_RESERVED | RLE_ALLOCATED)) == RLE_RESERVED) { + KASSERT(!(rman_get_flags(rle->res) & RF_ACTIVE), + ("reserved resource is active")); + return (0); + } + return (1); +} + /** * @brief Find a resource entry by type and rid. * @@ -2909,6 +2948,66 @@ resource_list_delete(struct resource_list *rl, int type, int rid) } } +/** + * @brief Allocate a reserved resource + * + * This can be used by busses to force the allocation of resources + * that are always active in the system even if they are not allocated + * by a driver (e.g. PCI BARs). This function is usually called when + * adding a new child to the bus. The resource is allocated from the + * parent bus when it is reserved. The resource list entry is marked + * with RLE_RESERVED to note that it is a reserved resource. + * + * Subsequent attempts to allocate the resource with + * resource_list_alloc() will succeed the first time and will set + * RLE_ALLOCATED to note that it has been allocated. When a reserved + * resource that has been allocated is released with + * resource_list_release() the resource RLE_ALLOCATED is cleared, but + * the actual resource remains allocated. The resource can be released to + * the parent bus by calling resource_list_unreserve(). + * + * @param rl the resource list to allocate from + * @param bus the parent device of @p child + * @param child the device for which the resource is being reserved + * @param type the type of resource to allocate + * @param rid a pointer to the resource identifier + * @param start hint at the start of the resource range - pass + * @c 0UL for any start address + * @param end hint at the end of the resource range - pass + * @c ~0UL for any end address + * @param count hint at the size of range required - pass @c 1 + * for any size + * @param flags any extra flags to control the resource + * allocation - see @c RF_XXX flags in + * for details + * + * @returns the resource which was allocated or @c NULL if no + * resource could be allocated + */ +struct resource * +resource_list_reserve(struct resource_list *rl, device_t bus, device_t child, + int type, int *rid, u_long start, u_long end, u_long count, u_int flags) +{ + struct resource_list_entry *rle = NULL; + int passthrough = (device_get_parent(child) != bus); + struct resource *r; + + if (passthrough) + panic( + "resource_list_reserve() should only be called for direct children"); + if (flags & RF_ACTIVE) + panic( + "resource_list_reserve() should only reserve inactive resources"); + + r = resource_list_alloc(rl, bus, child, type, rid, start, end, count, + flags); + if (r != NULL) { + rle = resource_list_find(rl, type, *rid); + rle->flags |= RLE_RESERVED; + } + return (r); +} + /** * @brief Helper function for implementing BUS_ALLOC_RESOURCE() * @@ -2960,8 +3059,19 @@ resource_list_alloc(struct resource_list *rl, device_t bus, device_t child, if (!rle) return (NULL); /* no resource of that type/rid */ - if (rle->res) + if (rle->res) { + if (rle->flags & RLE_RESERVED) { + if (rle->flags & RLE_ALLOCATED) + return (NULL); + if ((flags & RF_ACTIVE) && + bus_activate_resource(child, type, *rid, + rle->res) != 0) + return (NULL); + rle->flags |= RLE_ALLOCATED; + return (rle->res); + } panic("resource_list_alloc: resource entry is busy"); + } if (isdefault) { start = rle->start; @@ -2993,7 +3103,7 @@ resource_list_alloc(struct resource_list *rl, device_t bus, device_t child, * @param rl the resource list which was allocated from * @param bus the parent device of @p child * @param child the device which is requesting a release - * @param type the type of resource to allocate + * @param type the type of resource to release * @param rid the resource identifier * @param res the resource to release * @@ -3020,6 +3130,19 @@ resource_list_release(struct resource_list *rl, device_t bus, device_t child, panic("resource_list_release: can't find resource"); if (!rle->res) panic("resource_list_release: resource entry is not busy"); + if (rle->flags & RLE_RESERVED) { + if (rle->flags & RLE_ALLOCATED) { + if (rman_get_flags(res) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, + rid, res); + if (error) + return (error); + } + rle->flags &= ~RLE_ALLOCATED; + return (0); + } + return (EINVAL); + } error = BUS_RELEASE_RESOURCE(device_get_parent(bus), child, type, rid, res); @@ -3030,6 +3153,45 @@ resource_list_release(struct resource_list *rl, device_t bus, device_t child, return (0); } +/** + * @brief Fully release a reserved resource + * + * Fully releases a resouce reserved via resource_list_reserve(). + * + * @param rl the resource list which was allocated from + * @param bus the parent device of @p child + * @param child the device whose reserved resource is being released + * @param type the type of resource to release + * @param rid the resource identifier + * @param res the resource to release + * + * @retval 0 success + * @retval non-zero a standard unix error code indicating what + * error condition prevented the operation + */ +int +resource_list_unreserve(struct resource_list *rl, device_t bus, device_t child, + int type, int rid) +{ + struct resource_list_entry *rle = NULL; + int passthrough = (device_get_parent(child) != bus); + + if (passthrough) + panic( + "resource_list_unreserve() should only be called for direct children"); + + rle = resource_list_find(rl, type, rid); + + if (!rle) + panic("resource_list_unreserve: can't find resource"); + if (!(rle->flags & RLE_RESERVED)) + return (EINVAL); + if (rle->flags & RLE_ALLOCATED) + return (EBUSY); + rle->flags &= ~RLE_RESERVED; + return (resource_list_release(rl, bus, child, type, rid, rle->res)); +} + /** * @brief Print a description of resources in a resource list * @@ -3519,6 +3681,24 @@ bus_generic_config_intr(device_t dev, int irq, enum intr_trigger trig, return (EINVAL); } +/** + * @brief Helper function for implementing BUS_DESCRIBE_INTR(). + * + * This simple implementation of BUS_DESCRIBE_INTR() simply calls the + * BUS_DESCRIBE_INTR() method of the parent of @p dev. + */ +int +bus_generic_describe_intr(device_t dev, device_t child, struct resource *irq, + void *cookie, const char *descr) +{ + + /* Propagate up the bus hierarchy until someone handles it. */ + if (dev->parent) + return (BUS_DESCRIBE_INTR(dev->parent, child, irq, cookie, + descr)); + return (EINVAL); +} + /** * @brief Helper function for implementing BUS_GET_DMA_TAG(). * @@ -3624,6 +3804,10 @@ bus_generic_rl_release_resource(device_t dev, device_t child, int type, { struct resource_list * rl = NULL; + if (device_get_parent(child) != dev) + return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child, + type, rid, r)); + rl = BUS_GET_RESOURCE_LIST(dev, child); if (!rl) return (EINVAL); @@ -3644,6 +3828,10 @@ bus_generic_rl_alloc_resource(device_t dev, device_t child, int type, { struct resource_list * rl = NULL; + if (device_get_parent(child) != dev) + return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child, + type, rid, start, end, count, flags)); + rl = BUS_GET_RESOURCE_LIST(dev, child); if (!rl) return (NULL); @@ -3823,6 +4011,28 @@ bus_bind_intr(device_t dev, struct resource *r, int cpu) return (BUS_BIND_INTR(dev->parent, dev, r, cpu)); } +/** + * @brief Wrapper function for BUS_DESCRIBE_INTR(). + * + * This function first formats the requested description into a + * temporary buffer and then calls the BUS_DESCRIBE_INTR() method of + * the parent of @p dev. + */ +int +bus_describe_intr(device_t dev, struct resource *irq, void *cookie, + const char *fmt, ...) +{ + va_list ap; + char descr[MAXCOMLEN + 1]; + + if (dev->parent == NULL) + return (EINVAL); + va_start(ap, fmt); + vsnprintf(descr, sizeof(descr), fmt, ap); + va_end(ap); + return (BUS_DESCRIBE_INTR(dev->parent, dev, irq, cookie, descr)); +} + /** * @brief Wrapper function for BUS_SET_RESOURCE(). * @@ -4117,27 +4327,8 @@ driver_module_handler(module_t mod, int what, void *arg) driver = dmd->dmd_driver; PDEBUG(("Loading module: driver %s on bus %s (pass %d)", DRIVERNAME(driver), dmd->dmd_busname, pass)); - error = devclass_add_driver(bus_devclass, driver, pass); - if (error) - break; - - /* - * If the driver has any base classes, make the - * devclass inherit from the devclass of the driver's - * first base class. This will allow the system to - * search for drivers in both devclasses for children - * of a device using this driver. - */ - if (driver->baseclasses) { - const char *parentname; - parentname = driver->baseclasses[0]->name; - *dmd->dmd_devclass = - devclass_find_internal(driver->name, - parentname, TRUE); - } else { - *dmd->dmd_devclass = - devclass_find_internal(driver->name, NULL, TRUE); - } + error = devclass_add_driver(bus_devclass, driver, pass, + dmd->dmd_devclass); break; case MOD_UNLOAD: diff --git a/sys/kern/subr_devstat.c b/sys/kern/subr_devstat.c index e90df59a5a22..a214bf63992b 100644 --- a/sys/kern/subr_devstat.c +++ b/sys/kern/subr_devstat.c @@ -449,7 +449,8 @@ static TAILQ_HEAD(, statspage) pagelist = TAILQ_HEAD_INITIALIZER(pagelist); static MALLOC_DEFINE(M_DEVSTAT, "devstat", "Device statistics"); static int -devstat_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +devstat_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { struct statspage *spp; diff --git a/sys/kern/subr_eventhandler.c b/sys/kern/subr_eventhandler.c index f9c8eadaf4e0..37c482cbd7ff 100644 --- a/sys/kern/subr_eventhandler.c +++ b/sys/kern/subr_eventhandler.c @@ -178,6 +178,8 @@ eventhandler_deregister(struct eventhandler_list *list, eventhandler_tag tag) ep->ee_priority = EHE_DEAD_PRIORITY; } } + while (list->el_runcount > 0) + mtx_sleep(list, &list->el_lock, 0, "evhrm", 0); EHL_UNLOCK(list); } @@ -225,16 +227,17 @@ void eventhandler_prune_list(struct eventhandler_list *list) { struct eventhandler_entry *ep, *en; + int pruned = 0; CTR2(KTR_EVH, "%s: pruning list \"%s\"", __func__, list->el_name); EHL_LOCK_ASSERT(list, MA_OWNED); - ep = TAILQ_FIRST(&list->el_entries); - while (ep != NULL) { - en = TAILQ_NEXT(ep, ee_link); + TAILQ_FOREACH_SAFE(ep, &list->el_entries, ee_link, en) { if (ep->ee_priority == EHE_DEAD_PRIORITY) { TAILQ_REMOVE(&list->el_entries, ep, ee_link); free(ep, M_EVENTHANDLER); + pruned++; } - ep = en; } + if (pruned > 0) + wakeup(list); } diff --git a/sys/kern/subr_firmware.c b/sys/kern/subr_firmware.c index 6a36c24e5f66..3f5e52b8d370 100644 --- a/sys/kern/subr_firmware.c +++ b/sys/kern/subr_firmware.c @@ -500,7 +500,7 @@ firmware_modevent(module_t mod, int type, void *unused) mtx_lock(&firmware_mtx); for (i = 0; i < FIRMWARE_MAX; i++) { fp = &firmware_table[i]; - fp->flags |= FW_UNLOAD;; + fp->flags |= FW_UNLOAD; } mtx_unlock(&firmware_mtx); taskqueue_enqueue(firmware_tq, &firmware_unload_task); diff --git a/sys/kern/subr_hash.c b/sys/kern/subr_hash.c new file mode 100644 index 000000000000..8ffbc9c49646 --- /dev/null +++ b/sys/kern/subr_hash.c @@ -0,0 +1,132 @@ +/*- + * Copyright (c) 1982, 1986, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * 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. + * + * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94 + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +/* + * General routine to allocate a hash table with control of memory flags. + */ +void * +hashinit_flags(int elements, struct malloc_type *type, u_long *hashmask, + int flags) +{ + long hashsize; + LIST_HEAD(generic, generic) *hashtbl; + int i; + + if (elements <= 0) + panic("hashinit: bad elements"); + + /* Exactly one of HASH_WAITOK and HASH_NOWAIT must be set. */ + KASSERT((flags & HASH_WAITOK) ^ (flags & HASH_NOWAIT), + ("Bad flags (0x%x) passed to hashinit_flags", flags)); + + for (hashsize = 1; hashsize <= elements; hashsize <<= 1) + continue; + hashsize >>= 1; + + if (flags & HASH_NOWAIT) + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), + type, M_NOWAIT); + else + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), + type, M_WAITOK); + + if (hashtbl != NULL) { + for (i = 0; i < hashsize; i++) + LIST_INIT(&hashtbl[i]); + *hashmask = hashsize - 1; + } + return (hashtbl); +} + +/* + * Allocate and initialize a hash table with default flag: may sleep. + */ +void * +hashinit(int elements, struct malloc_type *type, u_long *hashmask) +{ + + return (hashinit_flags(elements, type, hashmask, HASH_WAITOK)); +} + +void +hashdestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask) +{ + LIST_HEAD(generic, generic) *hashtbl, *hp; + + hashtbl = vhashtbl; + for (hp = hashtbl; hp <= &hashtbl[hashmask]; hp++) + if (!LIST_EMPTY(hp)) + panic("hashdestroy: hash not empty"); + free(hashtbl, type); +} + +static const int primes[] = { 1, 13, 31, 61, 127, 251, 509, 761, 1021, 1531, + 2039, 2557, 3067, 3583, 4093, 4603, 5119, 5623, 6143, + 6653, 7159, 7673, 8191, 12281, 16381, 24571, 32749 }; +#define NPRIMES (sizeof(primes) / sizeof(primes[0])) + +/* + * General routine to allocate a prime number sized hash table. + */ +void * +phashinit(int elements, struct malloc_type *type, u_long *nentries) +{ + long hashsize; + LIST_HEAD(generic, generic) *hashtbl; + int i; + + if (elements <= 0) + panic("phashinit: bad elements"); + for (i = 1, hashsize = primes[1]; hashsize <= elements;) { + i++; + if (i == NPRIMES) + break; + hashsize = primes[i]; + } + hashsize = primes[i - 1]; + hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); + for (i = 0; i < hashsize; i++) + LIST_INIT(&hashtbl[i]); + *nentries = hashsize; + return (hashtbl); +} diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index 01a3acc98519..972f9f941852 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$"); #define LOG_RDPRI (PZERO + 1) #define LOG_ASYNC 0x04 -#define LOG_RDWAIT 0x08 static d_open_t logopen; static d_close_t logclose; @@ -65,7 +64,6 @@ static void logtimeout(void *arg); static struct cdevsw log_cdevsw = { .d_version = D_VERSION, - .d_flags = D_NEEDGIANT, .d_open = logopen, .d_close = logclose, .d_read = logread, @@ -81,7 +79,10 @@ static struct logsoftc { struct callout sc_callout; /* callout to wakeup syslog */ } logsoftc; -int log_open; /* also used in log() */ +int log_open; /* also used in log() */ +static struct cv log_wakeup; +struct mtx msgbuf_lock; +MTX_SYSINIT(msgbuf_lock, &msgbuf_lock, "msgbuf lock", MTX_DEF); /* Times per second to check for a pending syslog wakeup. */ static int log_wakeups_per_second = 5; @@ -92,17 +93,23 @@ SYSCTL_INT(_kern, OID_AUTO, log_wakeups_per_second, CTLFLAG_RW, static int logopen(struct cdev *dev, int flags, int mode, struct thread *td) { - if (log_open) - return (EBUSY); - log_open = 1; - callout_init(&logsoftc.sc_callout, 0); - fsetown(td->td_proc->p_pid, &logsoftc.sc_sigio); /* signal process only */ + if (log_wakeups_per_second < 1) { printf("syslog wakeup is less than one. Adjusting to 1.\n"); log_wakeups_per_second = 1; } + + mtx_lock(&msgbuf_lock); + if (log_open) { + mtx_unlock(&msgbuf_lock); + return (EBUSY); + } + log_open = 1; callout_reset(&logsoftc.sc_callout, hz / log_wakeups_per_second, logtimeout, NULL); + mtx_unlock(&msgbuf_lock); + + fsetown(td->td_proc->p_pid, &logsoftc.sc_sigio); /* signal process only */ return (0); } @@ -111,10 +118,14 @@ static int logclose(struct cdev *dev, int flag, int mode, struct thread *td) { - log_open = 0; + funsetown(&logsoftc.sc_sigio); + + mtx_lock(&msgbuf_lock); callout_stop(&logsoftc.sc_callout); logsoftc.sc_state = 0; - funsetown(&logsoftc.sc_sigio); + log_open = 0; + mtx_unlock(&msgbuf_lock); + return (0); } @@ -124,32 +135,32 @@ logread(struct cdev *dev, struct uio *uio, int flag) { char buf[128]; struct msgbuf *mbp = msgbufp; - int error = 0, l, s; + int error = 0, l; - s = splhigh(); + mtx_lock(&msgbuf_lock); while (msgbuf_getcount(mbp) == 0) { if (flag & IO_NDELAY) { - splx(s); + mtx_unlock(&msgbuf_lock); return (EWOULDBLOCK); } - logsoftc.sc_state |= LOG_RDWAIT; - if ((error = tsleep(mbp, LOG_RDPRI | PCATCH, "klog", 0))) { - splx(s); + if ((error = cv_wait_sig(&log_wakeup, &msgbuf_lock)) != 0) { + mtx_unlock(&msgbuf_lock); return (error); } } - splx(s); - logsoftc.sc_state &= ~LOG_RDWAIT; while (uio->uio_resid > 0) { l = imin(sizeof(buf), uio->uio_resid); l = msgbuf_getbytes(mbp, buf, l); if (l == 0) break; + mtx_unlock(&msgbuf_lock); error = uiomove(buf, l, uio); - if (error) - break; + if (error || uio->uio_resid == 0) + return (error); + mtx_lock(&msgbuf_lock); } + mtx_unlock(&msgbuf_lock); return (error); } @@ -157,18 +168,16 @@ logread(struct cdev *dev, struct uio *uio, int flag) static int logpoll(struct cdev *dev, int events, struct thread *td) { - int s; int revents = 0; - s = splhigh(); - if (events & (POLLIN | POLLRDNORM)) { + mtx_lock(&msgbuf_lock); if (msgbuf_getcount(msgbufp) > 0) revents |= events & (POLLIN | POLLRDNORM); else selrecord(td, &logsoftc.sc_selp); + mtx_unlock(&msgbuf_lock); } - splx(s); return (revents); } @@ -183,20 +192,16 @@ logtimeout(void *arg) log_wakeups_per_second = 1; } if (msgbuftrigger == 0) { - callout_reset(&logsoftc.sc_callout, - hz / log_wakeups_per_second, logtimeout, NULL); + callout_schedule(&logsoftc.sc_callout, + hz / log_wakeups_per_second); return; } msgbuftrigger = 0; selwakeuppri(&logsoftc.sc_selp, LOG_RDPRI); if ((logsoftc.sc_state & LOG_ASYNC) && logsoftc.sc_sigio != NULL) pgsigio(&logsoftc.sc_sigio, SIGIO, 0); - if (logsoftc.sc_state & LOG_RDWAIT) { - wakeup(msgbufp); - logsoftc.sc_state &= ~LOG_RDWAIT; - } - callout_reset(&logsoftc.sc_callout, hz / log_wakeups_per_second, - logtimeout, NULL); + cv_broadcastpri(&log_wakeup, LOG_RDPRI); + callout_schedule(&logsoftc.sc_callout, hz / log_wakeups_per_second); } /*ARGSUSED*/ @@ -215,10 +220,12 @@ logioctl(struct cdev *dev, u_long com, caddr_t data, int flag, struct thread *td break; case FIOASYNC: + mtx_lock(&msgbuf_lock); if (*(int *)data) logsoftc.sc_state |= LOG_ASYNC; else logsoftc.sc_state &= ~LOG_ASYNC; + mtx_unlock(&msgbuf_lock); break; case FIOSETOWN: @@ -247,6 +254,8 @@ static void log_drvinit(void *unused) { + cv_init(&log_wakeup, "klog"); + callout_init_mtx(&logsoftc.sc_callout, &msgbuf_lock, 0); make_dev(&log_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "klog"); } diff --git a/sys/kern/subr_param.c b/sys/kern/subr_param.c index 6113b6397321..a4d4ff87c444 100644 --- a/sys/kern/subr_param.c +++ b/sys/kern/subr_param.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include "opt_param.h" #include "opt_maxusers.h" +#include #include #include #include @@ -73,10 +74,6 @@ __FBSDID("$FreeBSD$"); #define MAXFILES (maxproc * 2) #endif -/* Values of enum VM_GUEST members are used as indices in - * vm_guest_sysctl_names */ -enum VM_GUEST { VM_GUEST_NO = 0, VM_GUEST_VM, VM_GUEST_XEN }; - static int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS); int hz; @@ -88,6 +85,7 @@ int maxfiles; /* sys. wide open files limit */ int maxfilesperproc; /* per-proc open files limit */ int ncallout; /* maximum # of timer events */ int nbuf; +int ngroups_max; /* max # groups per process */ int nswbuf; long maxswzone; /* max swmeta KVA storage */ long maxbcache; /* max buffer cache KVA storage */ @@ -135,6 +133,10 @@ SYSCTL_PROC(_kern, OID_AUTO, vm_guest, CTLFLAG_RD | CTLTYPE_STRING, */ struct buf *swbuf; +/* + * The elements of this array are ordered based upon the values of the + * corresponding enum VM_GUEST members. + */ static const char *const vm_guest_sysctl_names[] = { "none", "generic", @@ -228,6 +230,16 @@ init_param1(void) TUNABLE_ULONG_FETCH("kern.maxssiz", &maxssiz); sgrowsiz = SGROWSIZ; TUNABLE_ULONG_FETCH("kern.sgrowsiz", &sgrowsiz); + + /* + * Let the administrator set {NGROUPS_MAX}, but disallow values + * less than NGROUPS_MAX which would violate POSIX.1-2008 or + * greater than INT_MAX-1 which would result in overflow. + */ + ngroups_max = NGROUPS_MAX; + TUNABLE_INT_FETCH("kern.ngroups", &ngroups_max); + if (ngroups_max < NGROUPS_MAX) + ngroups_max = NGROUPS_MAX; } /* diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c index 5c34f4087512..30e92cba4dd5 100644 --- a/sys/kern/subr_prf.c +++ b/sys/kern/subr_prf.c @@ -923,16 +923,24 @@ sysctl_kern_msgbuf(SYSCTL_HANDLER_ARGS) } /* Read the whole buffer, one chunk at a time. */ + mtx_lock(&msgbuf_lock); msgbuf_peekbytes(msgbufp, NULL, 0, &seq); - while ((len = msgbuf_peekbytes(msgbufp, buf, sizeof(buf), &seq)) > 0) { + for (;;) { + len = msgbuf_peekbytes(msgbufp, buf, sizeof(buf), &seq); + mtx_unlock(&msgbuf_lock); + if (len == 0) + return (0); + error = sysctl_handle_opaque(oidp, buf, len, req); if (error) return (error); + + mtx_lock(&msgbuf_lock); } - return (0); } -SYSCTL_PROC(_kern, OID_AUTO, msgbuf, CTLTYPE_STRING | CTLFLAG_RD, +SYSCTL_PROC(_kern, OID_AUTO, msgbuf, + CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, sysctl_kern_msgbuf, "A", "Contents of kernel message buffer"); static int msgbuf_clearflag; @@ -943,15 +951,18 @@ sysctl_kern_msgbuf_clear(SYSCTL_HANDLER_ARGS) int error; error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); if (!error && req->newptr) { + mtx_lock(&msgbuf_lock); msgbuf_clear(msgbufp); + mtx_unlock(&msgbuf_lock); msgbuf_clearflag = 0; } return (error); } SYSCTL_PROC(_kern, OID_AUTO, msgbuf_clear, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE, &msgbuf_clearflag, 0, - sysctl_kern_msgbuf_clear, "I", "Clear kernel message buffer"); + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE | CTLFLAG_MPSAFE, + &msgbuf_clearflag, 0, sysctl_kern_msgbuf_clear, "I", + "Clear kernel message buffer"); #ifdef DDB diff --git a/sys/kern/subr_sleepqueue.c b/sys/kern/subr_sleepqueue.c index b3ae6fddc040..5df74d06e9e6 100644 --- a/sys/kern/subr_sleepqueue.c +++ b/sys/kern/subr_sleepqueue.c @@ -118,11 +118,12 @@ __FBSDID("$FreeBSD$"); */ struct sleepqueue { TAILQ_HEAD(, thread) sq_blocked[NR_SLEEPQS]; /* (c) Blocked threads. */ + u_int sq_blockedcnt[NR_SLEEPQS]; /* (c) N. of blocked threads. */ LIST_ENTRY(sleepqueue) sq_hash; /* (c) Chain and free list. */ LIST_HEAD(, sleepqueue) sq_free; /* (c) Free queues. */ void *sq_wchan; /* (c) Wait channel. */ -#ifdef INVARIANTS int sq_type; /* (c) Queue type. */ +#ifdef INVARIANTS struct lock_object *sq_lock; /* (c) Associated lock. */ #endif }; @@ -306,14 +307,16 @@ sleepq_add(void *wchan, struct lock_object *lock, const char *wmesg, int flags, int i; sq = td->td_sleepqueue; - for (i = 0; i < NR_SLEEPQS; i++) + for (i = 0; i < NR_SLEEPQS; i++) { KASSERT(TAILQ_EMPTY(&sq->sq_blocked[i]), - ("thread's sleep queue %d is not empty", i)); + ("thread's sleep queue %d is not empty", i)); + KASSERT(sq->sq_blockedcnt[i] == 0, + ("thread's sleep queue %d count mismatches", i)); + } KASSERT(LIST_EMPTY(&sq->sq_free), ("thread's sleep queue has a non-empty free list")); KASSERT(sq->sq_wchan == NULL, ("stale sq_wchan pointer")); sq->sq_lock = lock; - sq->sq_type = flags & SLEEPQ_TYPE; #endif #ifdef SLEEPQUEUE_PROFILING sc->sc_depth++; @@ -326,6 +329,7 @@ sleepq_add(void *wchan, struct lock_object *lock, const char *wmesg, int flags, sq = td->td_sleepqueue; LIST_INSERT_HEAD(&sc->sc_queues, sq, sq_hash); sq->sq_wchan = wchan; + sq->sq_type = flags & SLEEPQ_TYPE; } else { MPASS(wchan == sq->sq_wchan); MPASS(lock == sq->sq_lock); @@ -334,6 +338,7 @@ sleepq_add(void *wchan, struct lock_object *lock, const char *wmesg, int flags, } thread_lock(td); TAILQ_INSERT_TAIL(&sq->sq_blocked[queue], td, td_slpq); + sq->sq_blockedcnt[queue]++; td->td_sleepqueue = NULL; td->td_sqqueue = queue; td->td_wchan = wchan; @@ -366,6 +371,22 @@ sleepq_set_timeout(void *wchan, int timo) callout_reset_curcpu(&td->td_slpcallout, timo, sleepq_timeout, td); } +/* + * Return the number of actual sleepers for the specified queue. + */ +u_int +sleepq_sleepcnt(void *wchan, int queue) +{ + struct sleepqueue *sq; + + KASSERT(wchan != NULL, ("%s: invalid NULL wait channel", __func__)); + MPASS((queue >= 0) && (queue < NR_SLEEPQS)); + sq = sleepq_lookup(wchan); + if (sq == NULL) + return (0); + return (sq->sq_blockedcnt[queue]); +} + /* * Marks the pending sleep of the current thread as interruptible and * makes an initial check for pending signals before putting a thread @@ -647,6 +668,28 @@ sleepq_timedwait_sig(void *wchan, int pri) return (rvalt); } +/* + * Returns the type of sleepqueue given a waitchannel. + */ +int +sleepq_type(void *wchan) +{ + struct sleepqueue *sq; + int type; + + MPASS(wchan != NULL); + + sleepq_lock(wchan); + sq = sleepq_lookup(wchan); + if (sq == NULL) { + sleepq_release(wchan); + return (-1); + } + type = sq->sq_type; + sleepq_release(wchan); + return (type); +} + /* * Removes a thread from a sleep queue and makes it * runnable. @@ -665,6 +708,7 @@ sleepq_resume_thread(struct sleepqueue *sq, struct thread *td, int pri) mtx_assert(&sc->sc_lock, MA_OWNED); /* Remove the thread from the queue. */ + sq->sq_blockedcnt[td->td_sqqueue]--; TAILQ_REMOVE(&sq->sq_blocked[td->td_sqqueue], td, td_slpq); /* @@ -720,8 +764,10 @@ sleepq_dtor(void *mem, int size, void *arg) int i; sq = mem; - for (i = 0; i < NR_SLEEPQS; i++) + for (i = 0; i < NR_SLEEPQS; i++) { MPASS(TAILQ_EMPTY(&sq->sq_blocked[i])); + MPASS(sq->sq_blockedcnt[i] == 0); + } } #endif @@ -736,8 +782,10 @@ sleepq_init(void *mem, int size, int flags) bzero(mem, size); sq = mem; - for (i = 0; i < NR_SLEEPQS; i++) + for (i = 0; i < NR_SLEEPQS; i++) { TAILQ_INIT(&sq->sq_blocked[i]); + sq->sq_blockedcnt[i] = 0; + } LIST_INIT(&sq->sq_free); return (0); } @@ -1150,8 +1198,8 @@ DB_SHOW_COMMAND(sleepq, db_show_sleepqueue) return; found: db_printf("Wait channel: %p\n", sq->sq_wchan); -#ifdef INVARIANTS db_printf("Queue type: %d\n", sq->sq_type); +#ifdef INVARIANTS if (sq->sq_lock) { lock = sq->sq_lock; db_printf("Associated Interlock: %p - (%s) %s\n", lock, @@ -1170,6 +1218,7 @@ found: td->td_tid, td->td_proc->p_pid, td->td_name); } + db_printf("(expected: %u)\n", sq->sq_blockedcnt[i]); } } diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c index 22c1809a8a29..8405b3d642b7 100644 --- a/sys/kern/subr_taskqueue.c +++ b/sys/kern/subr_taskqueue.c @@ -301,7 +301,7 @@ taskqueue_start_threads(struct taskqueue **tqp, int count, int pri, struct thread *td; struct taskqueue *tq; int i, error; - char ktname[MAXCOMLEN]; + char ktname[MAXCOMLEN + 1]; if (count <= 0) return (EINVAL); @@ -309,7 +309,7 @@ taskqueue_start_threads(struct taskqueue **tqp, int count, int pri, tq = *tqp; va_start(ap, name); - vsnprintf(ktname, MAXCOMLEN, name, ap); + vsnprintf(ktname, sizeof(ktname), name, ap); va_end(ap); tq->tq_threads = malloc(sizeof(struct thread *) * count, M_TASKQUEUE, diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c index 6d60ddbe460d..4d20ebdc1ce1 100644 --- a/sys/kern/subr_trap.c +++ b/sys/kern/subr_trap.c @@ -90,6 +90,7 @@ userret(struct thread *td, struct trapframe *frame) CTR3(KTR_SYSC, "userret: thread %p (pid %d, %s)", td, p->p_pid, td->td_name); +#if 0 #ifdef DIAGNOSTIC /* Check that we called signotify() enough. */ PROC_LOCK(p); @@ -100,6 +101,7 @@ userret(struct thread *td, struct trapframe *frame) thread_unlock(td); PROC_UNLOCK(p); #endif +#endif #ifdef KTRACE KTRUSERRET(td); #endif @@ -218,7 +220,14 @@ ast(struct trapframe *framep) ktrcsw(0, 1); #endif } - if (flags & TDF_NEEDSIGCHK) { + + /* + * Check for signals. Unlocked reads of p_pendingcnt or + * p_siglist might cause process-directed signal to be handled + * later. + */ + if (flags & TDF_NEEDSIGCHK || p->p_pendingcnt > 0 || + !SIGISEMPTY(p->p_siglist)) { PROC_LOCK(p); mtx_lock(&p->p_sigacts->ps_mtx); while ((sig = cursig(td, SIG_STOP_ALLOWED)) != 0) @@ -236,6 +245,11 @@ ast(struct trapframe *framep) PROC_UNLOCK(p); } + if (td->td_pflags & TDP_OLDMASK) { + td->td_pflags &= ~TDP_OLDMASK; + kern_sigprocmask(td, SIG_SETMASK, &td->td_oldsigmask, NULL, 0); + } + userret(td, framep); mtx_assert(&Giant, MA_NOTOWNED); } diff --git a/sys/kern/subr_turnstile.c b/sys/kern/subr_turnstile.c index 31c8cfc4837d..114b1398318b 100644 --- a/sys/kern/subr_turnstile.c +++ b/sys/kern/subr_turnstile.c @@ -686,7 +686,7 @@ turnstile_wait(struct turnstile *ts, struct thread *owner, int queue) */ tc = TC_LOOKUP(ts->ts_lockobj); if (ts == td->td_turnstile) { - mtx_assert(&tc->tc_lock, MA_OWNED); + mtx_assert(&tc->tc_lock, MA_OWNED); #ifdef TURNSTILE_PROFILING tc->tc_depth++; if (tc->tc_depth > tc->tc_max_depth) { @@ -733,6 +733,7 @@ turnstile_wait(struct turnstile *ts, struct thread *owner, int queue) td->td_tsqueue = queue; td->td_blocked = ts; td->td_lockname = lock->lo_name; + td->td_blktick = ticks; TD_SET_LOCK(td); mtx_unlock_spin(&tc->tc_lock); propagate_priority(td); @@ -925,6 +926,7 @@ turnstile_unpend(struct turnstile *ts, int owner_type) MPASS(TD_CAN_RUN(td)); td->td_blocked = NULL; td->td_lockname = NULL; + td->td_blktick = 0; #ifdef INVARIANTS td->td_tsqueue = 0xff; #endif diff --git a/sys/kern/kern_subr.c b/sys/kern/subr_uio.c similarity index 83% rename from sys/kern/kern_subr.c rename to sys/kern/subr_uio.c index 95ce58615092..725b1a83f9bb 100644 --- a/sys/kern/kern_subr.c +++ b/sys/kern/subr_uio.c @@ -42,13 +42,10 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include #include -#include -#include #include #include #include @@ -360,96 +357,6 @@ again: return (0); } -/* - * General routine to allocate a hash table with control of memory flags. - */ -void * -hashinit_flags(int elements, struct malloc_type *type, u_long *hashmask, - int flags) -{ - long hashsize; - LIST_HEAD(generic, generic) *hashtbl; - int i; - - if (elements <= 0) - panic("hashinit: bad elements"); - - /* Exactly one of HASH_WAITOK and HASH_NOWAIT must be set. */ - KASSERT((flags & HASH_WAITOK) ^ (flags & HASH_NOWAIT), - ("Bad flags (0x%x) passed to hashinit_flags", flags)); - - for (hashsize = 1; hashsize <= elements; hashsize <<= 1) - continue; - hashsize >>= 1; - - if (flags & HASH_NOWAIT) - hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), - type, M_NOWAIT); - else - hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), - type, M_WAITOK); - - if (hashtbl != NULL) { - for (i = 0; i < hashsize; i++) - LIST_INIT(&hashtbl[i]); - *hashmask = hashsize - 1; - } - return (hashtbl); -} - -/* - * Allocate and initialize a hash table with default flag: may sleep. - */ -void * -hashinit(int elements, struct malloc_type *type, u_long *hashmask) -{ - - return (hashinit_flags(elements, type, hashmask, HASH_WAITOK)); -} - -void -hashdestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask) -{ - LIST_HEAD(generic, generic) *hashtbl, *hp; - - hashtbl = vhashtbl; - for (hp = hashtbl; hp <= &hashtbl[hashmask]; hp++) - if (!LIST_EMPTY(hp)) - panic("hashdestroy: hash not empty"); - free(hashtbl, type); -} - -static const int primes[] = { 1, 13, 31, 61, 127, 251, 509, 761, 1021, 1531, - 2039, 2557, 3067, 3583, 4093, 4603, 5119, 5623, 6143, - 6653, 7159, 7673, 8191, 12281, 16381, 24571, 32749 }; -#define NPRIMES (sizeof(primes) / sizeof(primes[0])) - -/* - * General routine to allocate a prime number sized hash table. - */ -void * -phashinit(int elements, struct malloc_type *type, u_long *nentries) -{ - long hashsize; - LIST_HEAD(generic, generic) *hashtbl; - int i; - - if (elements <= 0) - panic("phashinit: bad elements"); - for (i = 1, hashsize = primes[1]; hashsize <= elements;) { - i++; - if (i == NPRIMES) - break; - hashsize = primes[i]; - } - hashsize = primes[i - 1]; - hashtbl = malloc((u_long)hashsize * sizeof(*hashtbl), type, M_WAITOK); - for (i = 0; i < hashsize; i++) - LIST_INIT(&hashtbl[i]); - *nentries = hashsize; - return (hashtbl); -} - void uio_yield(void) { diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c index aa46edb60f06..5b7d56517508 100644 --- a/sys/kern/subr_witness.c +++ b/sys/kern/subr_witness.c @@ -551,12 +551,6 @@ static struct witness_order_list_entry order_lists[] = { { "tcpinp", &lock_class_rw }, { "so_snd", &lock_class_mtx_sleep }, { NULL, NULL }, - /* - * SLIP - */ - { "slip_mtx", &lock_class_mtx_sleep }, - { "slip sc_mtx", &lock_class_mtx_sleep }, - { NULL, NULL }, /* * netatalk */ diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 6831fe8d8cad..b34af6132372 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -751,6 +751,58 @@ poll_no_poll(int events) return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)); } +int +pselect(struct thread *td, struct pselect_args *uap) +{ + struct timespec ts; + struct timeval tv, *tvp; + sigset_t set, *uset; + int error; + + if (uap->ts != NULL) { + error = copyin(uap->ts, &ts, sizeof(ts)); + if (error != 0) + return (error); + TIMESPEC_TO_TIMEVAL(&tv, &ts); + tvp = &tv; + } else + tvp = NULL; + if (uap->sm != NULL) { + error = copyin(uap->sm, &set, sizeof(set)); + if (error != 0) + return (error); + uset = &set; + } else + uset = NULL; + return (kern_pselect(td, uap->nd, uap->in, uap->ou, uap->ex, tvp, + uset, NFDBITS)); +} + +int +kern_pselect(struct thread *td, int nd, fd_set *in, fd_set *ou, fd_set *ex, + struct timeval *tvp, sigset_t *uset, int abi_nfdbits) +{ + int error; + + if (uset != NULL) { + error = kern_sigprocmask(td, SIG_SETMASK, uset, + &td->td_oldsigmask, 0); + if (error != 0) + return (error); + td->td_pflags |= TDP_OLDMASK; + /* + * Make sure that ast() is called on return to + * usermode and TDP_OLDMASK is cleared, restoring old + * sigmask. + */ + thread_lock(td); + td->td_flags |= TDF_ASTPENDING; + thread_unlock(td); + } + error = kern_select(td, nd, in, ou, ex, tvp, abi_nfdbits); + return (error); +} + #ifndef _SYS_SYSPROTO_H_ struct select_args { int nd; @@ -759,9 +811,7 @@ struct select_args { }; #endif int -select(td, uap) - register struct thread *td; - register struct select_args *uap; +select(struct thread *td, struct select_args *uap) { struct timeval tv, *tvp; int error; diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index b8803af0c837..d4b5d4dec8de 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #ifdef COMPAT_IA32 @@ -72,6 +73,20 @@ struct ptrace_io_desc32 { u_int32_t piod_addr; u_int32_t piod_len; }; + +struct ptrace_vm_entry32 { + int pve_entry; + int pve_timestamp; + uint32_t pve_start; + uint32_t pve_end; + uint32_t pve_offset; + u_int pve_prot; + u_int pve_pathlen; + int32_t pve_fileid; + u_int pve_fsid; + uint32_t pve_path; +}; + #endif /* @@ -213,10 +228,10 @@ int proc_rwmem(struct proc *p, struct uio *uio) { vm_map_t map; - vm_object_t backing_object, object = NULL; - vm_offset_t pageno = 0; /* page number */ + vm_object_t backing_object, object; + vm_offset_t pageno; /* page number */ vm_prot_t reqprot; - int error, fault_flags, writing; + int error, writing; /* * Assert that someone has locked this vmspace. (Should be @@ -232,9 +247,7 @@ proc_rwmem(struct proc *p, struct uio *uio) map = &p->p_vmspace->vm_map; writing = uio->uio_rw == UIO_WRITE; - reqprot = writing ? (VM_PROT_WRITE | VM_PROT_OVERRIDE_WRITE) : - VM_PROT_READ; - fault_flags = writing ? VM_FAULT_DIRTY : VM_FAULT_NORMAL; + reqprot = writing ? VM_PROT_COPY | VM_PROT_READ : VM_PROT_READ; /* * Only map in one page at a time. We don't have to, but it @@ -269,7 +282,7 @@ proc_rwmem(struct proc *p, struct uio *uio) /* * Fault the page on behalf of the process */ - error = vm_fault(map, pageno, reqprot, fault_flags); + error = vm_fault(map, pageno, reqprot, VM_FAULT_NORMAL); if (error) { if (error == KERN_RESOURCE_SHORTAGE) error = ENOMEM; @@ -279,8 +292,8 @@ proc_rwmem(struct proc *p, struct uio *uio) } /* - * Now we need to get the page. out_entry, out_prot, wired, - * and single_use aren't used. One would think the vm code + * Now we need to get the page. out_entry and wired + * aren't used. One would think the vm code * would be a *bit* nicer... We use tmap because * vm_map_lookup() can change the map argument. */ @@ -303,6 +316,10 @@ proc_rwmem(struct proc *p, struct uio *uio) VM_OBJECT_UNLOCK(object); object = backing_object; } + if (writing && m != NULL) { + vm_page_dirty(m); + vm_pager_page_unswapped(m); + } VM_OBJECT_UNLOCK(object); if (m == NULL) { vm_map_lookup_done(tmap, out_entry); @@ -327,6 +344,10 @@ proc_rwmem(struct proc *p, struct uio *uio) */ error = uiomove_fromphys(&m, page_offset, len, uio); + /* Make the I-cache coherent for breakpoints. */ + if (!error && writing && (out_prot & VM_PROT_EXECUTE)) + vm_sync_icache(map, uva, len); + /* * Release the page. */ @@ -339,6 +360,148 @@ proc_rwmem(struct proc *p, struct uio *uio) return (error); } +static int +ptrace_vm_entry(struct thread *td, struct proc *p, struct ptrace_vm_entry *pve) +{ + struct vattr vattr; + vm_map_t map; + vm_map_entry_t entry; + vm_object_t obj, tobj, lobj; + struct vmspace *vm; + struct vnode *vp; + char *freepath, *fullpath; + u_int pathlen; + int error, index, vfslocked; + + error = 0; + obj = NULL; + + vm = vmspace_acquire_ref(p); + map = &vm->vm_map; + vm_map_lock_read(map); + + do { + entry = map->header.next; + index = 0; + while (index < pve->pve_entry && entry != &map->header) { + entry = entry->next; + index++; + } + if (index != pve->pve_entry) { + error = EINVAL; + break; + } + while (entry != &map->header && + (entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0) { + entry = entry->next; + index++; + } + if (entry == &map->header) { + error = ENOENT; + break; + } + + /* We got an entry. */ + pve->pve_entry = index + 1; + pve->pve_timestamp = map->timestamp; + pve->pve_start = entry->start; + pve->pve_end = entry->end - 1; + pve->pve_offset = entry->offset; + pve->pve_prot = entry->protection; + + /* Backing object's path needed? */ + if (pve->pve_pathlen == 0) + break; + + pathlen = pve->pve_pathlen; + pve->pve_pathlen = 0; + + obj = entry->object.vm_object; + if (obj != NULL) + VM_OBJECT_LOCK(obj); + } while (0); + + vm_map_unlock_read(map); + vmspace_free(vm); + + pve->pve_fsid = VNOVAL; + pve->pve_fileid = VNOVAL; + + if (error == 0 && obj != NULL) { + lobj = obj; + for (tobj = obj; tobj != NULL; tobj = tobj->backing_object) { + if (tobj != obj) + VM_OBJECT_LOCK(tobj); + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); + lobj = tobj; + pve->pve_offset += tobj->backing_object_offset; + } + vp = (lobj->type == OBJT_VNODE) ? lobj->handle : NULL; + if (vp != NULL) + vref(vp); + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); + VM_OBJECT_UNLOCK(obj); + + if (vp != NULL) { + freepath = NULL; + fullpath = NULL; + vn_fullpath(td, vp, &fullpath, &freepath); + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + vn_lock(vp, LK_SHARED | LK_RETRY); + if (VOP_GETATTR(vp, &vattr, td->td_ucred) == 0) { + pve->pve_fileid = vattr.va_fileid; + pve->pve_fsid = vattr.va_fsid; + } + vput(vp); + VFS_UNLOCK_GIANT(vfslocked); + + if (fullpath != NULL) { + pve->pve_pathlen = strlen(fullpath) + 1; + if (pve->pve_pathlen <= pathlen) { + error = copyout(fullpath, pve->pve_path, + pve->pve_pathlen); + } else + error = ENAMETOOLONG; + } + if (freepath != NULL) + free(freepath, M_TEMP); + } + } + + return (error); +} + +#ifdef COMPAT_IA32 +static int +ptrace_vm_entry32(struct thread *td, struct proc *p, + struct ptrace_vm_entry32 *pve32) +{ + struct ptrace_vm_entry pve; + int error; + + pve.pve_entry = pve32->pve_entry; + pve.pve_pathlen = pve32->pve_pathlen; + pve.pve_path = (void *)(uintptr_t)pve32->pve_path; + + error = ptrace_vm_entry(td, p, &pve); + if (error == 0) { + pve32->pve_entry = pve.pve_entry; + pve32->pve_timestamp = pve.pve_timestamp; + pve32->pve_start = pve.pve_start; + pve32->pve_end = pve.pve_end; + pve32->pve_offset = pve.pve_offset; + pve32->pve_prot = pve.pve_prot; + pve32->pve_fileid = pve.pve_fileid; + pve32->pve_fsid = pve.pve_fsid; + } + + pve32->pve_pathlen = pve.pve_pathlen; + return (error); +} +#endif /* COMPAT_IA32 */ + /* * Process debugging system call. */ @@ -382,6 +545,7 @@ ptrace(struct thread *td, struct ptrace_args *uap) union { struct ptrace_io_desc piod; struct ptrace_lwpinfo pl; + struct ptrace_vm_entry pve; struct dbreg dbreg; struct fpreg fpreg; struct reg reg; @@ -390,6 +554,7 @@ ptrace(struct thread *td, struct ptrace_args *uap) struct fpreg32 fpreg32; struct reg32 reg32; struct ptrace_io_desc32 piod32; + struct ptrace_vm_entry32 pve32; #endif } r; void *addr; @@ -422,6 +587,9 @@ ptrace(struct thread *td, struct ptrace_args *uap) case PT_IO: error = COPYIN(uap->addr, &r.piod, sizeof r.piod); break; + case PT_VM_ENTRY: + error = COPYIN(uap->addr, &r.pve, sizeof r.pve); + break; default: addr = uap->addr; break; @@ -434,6 +602,9 @@ ptrace(struct thread *td, struct ptrace_args *uap) return (error); switch (uap->req) { + case PT_VM_ENTRY: + error = COPYOUT(&r.pve, uap->addr, sizeof r.pve); + break; case PT_IO: error = COPYOUT(&r.piod, uap->addr, sizeof r.piod); break; @@ -809,6 +980,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) case PT_WRITE_I: case PT_WRITE_D: + td2->td_dbgflags |= TDB_USERWR; write = 1; /* FALLTHROUGH */ case PT_READ_I: @@ -877,6 +1049,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) break; case PIOD_WRITE_D: case PIOD_WRITE_I: + td2->td_dbgflags |= TDB_USERWR; uio.uio_rw = UIO_WRITE; break; default: @@ -899,6 +1072,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) goto sendsig; /* in PT_CONTINUE above */ case PT_SETREGS: + td2->td_dbgflags |= TDB_USERWR; error = PROC_WRITE(regs, td2, addr); break; @@ -907,6 +1081,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) break; case PT_SETFPREGS: + td2->td_dbgflags |= TDB_USERWR; error = PROC_WRITE(fpregs, td2, addr); break; @@ -915,6 +1090,7 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) break; case PT_SETDBREGS: + td2->td_dbgflags |= TDB_USERWR; error = PROC_WRITE(dbregs, td2, addr); break; @@ -965,6 +1141,21 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) PROC_LOCK(p); break; + case PT_VM_TIMESTAMP: + td->td_retval[0] = p->p_vmspace->vm_map.timestamp; + break; + + case PT_VM_ENTRY: + PROC_UNLOCK(p); +#ifdef COMPAT_IA32 + if (wrap32) + error = ptrace_vm_entry32(td, p, addr); + else +#endif + error = ptrace_vm_entry(td, p, addr); + PROC_LOCK(p); + break; + default: #ifdef __HAVE_PTRACE_MACHDEP if (req >= PT_FIRSTMACH) { diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index dbe9e791c2a4..39211997a0b6 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 195458 2009-07-08 15:23:18Z trasz + * created from FreeBSD: head/sys/kern/syscalls.master 198508 2009-10-27 10:55:34Z kib */ const char *syscallnames[] = { @@ -521,4 +521,13 @@ const char *syscallnames[] = { "msgctl", /* 511 = msgctl */ "shmctl", /* 512 = shmctl */ "lpathconf", /* 513 = lpathconf */ + "#514", /* 514 = cap_new */ + "#515", /* 515 = cap_getrights */ + "#516", /* 516 = cap_enter */ + "#517", /* 517 = cap_getmode */ + "#518", /* 518 = pdfork */ + "#519", /* 519 = pdkill */ + "#520", /* 520 = pdgetpid */ + "#521", /* 521 = pdwait */ + "pselect", /* 522 = pselect */ }; diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 4e2e99c09a5f..6a0ea65f7d53 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -12,7 +12,7 @@ ; case where the event exists, but we don't want auditing, the ; event should be #defined to AUE_NULL in audit_kevents.h. ; type one of STD, OBSOL, UNIMPL, COMPAT, COMPAT4, COMPAT6, -; COMPAT7, LIBCOMPAT, NODEF, NOARGS, NOPROTO, NOSTD +; COMPAT7, NODEF, NOARGS, NOPROTO, NOSTD ; The COMPAT* options may be combined with one or more NO* ; options separated by '|' with no spaces (e.g. COMPAT|NOARGS) ; name psuedo-prototype of syscall routine @@ -28,7 +28,6 @@ ; COMPAT4 included on COMPAT4 #ifdef (FreeBSD 4 compat) ; COMPAT6 included on COMPAT6 #ifdef (FreeBSD 6 compat) ; COMPAT7 included on COMPAT7 #ifdef (FreeBSD 7 compat) -; LIBCOMPAT included on COMPAT #ifdef, and placed in syscall.h ; OBSOL obsolete, not included in system, only specifies name ; UNIMPL not implemented, placeholder only ; NOSTD implemented but as a lkm that can be statically @@ -911,5 +910,17 @@ 512 AUE_SHMCTL NOSTD { int shmctl(int shmid, int cmd, \ struct shmid_ds *buf); } 513 AUE_LPATHCONF STD { int lpathconf(char *path, int name); } +514 AUE_CAP_NEW UNIMPL cap_new +515 AUE_CAP_GETRIGHTS UNIMPL cap_getrights +516 AUE_CAP_ENTER UNIMPL cap_enter +517 AUE_CAP_GETMODE UNIMPL cap_getmode +518 AUE_PDFORK UNIMPL pdfork +519 AUE_PDKILL UNIMPL pdkill +520 AUE_PDGETPID UNIMPL pdgetpid +521 AUE_PDWAIT UNIMPL pdwait +522 AUE_SELECT STD { int pselect(int nd, fd_set *in, \ + fd_set *ou, fd_set *ex, \ + const struct timespec *ts, \ + const sigset_t *sm); } ; Please copy any additions and changes to the following compatability tables: ; sys/compat/freebsd32/syscalls.master diff --git a/sys/kern/systrace_args.c b/sys/kern/systrace_args.c index e8d6bc34acb6..9cbb4b1bb9c7 100644 --- a/sys/kern/systrace_args.c +++ b/sys/kern/systrace_args.c @@ -3072,6 +3072,18 @@ systrace_args(int sysnum, void *params, u_int64_t *uarg, int *n_args) *n_args = 2; break; } + /* pselect */ + case 522: { + struct pselect_args *p = params; + iarg[0] = p->nd; /* int */ + uarg[1] = (intptr_t) p->in; /* fd_set * */ + uarg[2] = (intptr_t) p->ou; /* fd_set * */ + uarg[3] = (intptr_t) p->ex; /* fd_set * */ + uarg[4] = (intptr_t) p->ts; /* const struct timespec * */ + uarg[5] = (intptr_t) p->sm; /* const sigset_t * */ + *n_args = 6; + break; + } default: *n_args = 0; break; @@ -8154,6 +8166,31 @@ systrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz) break; }; break; + /* pselect */ + case 522: + switch(ndx) { + case 0: + p = "int"; + break; + case 1: + p = "fd_set *"; + break; + case 2: + p = "fd_set *"; + break; + case 3: + p = "fd_set *"; + break; + case 4: + p = "const struct timespec *"; + break; + case 5: + p = "const sigset_t *"; + break; + default: + break; + }; + break; default: break; }; diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c index 4e62211ebca8..a16c8afc7701 100644 --- a/sys/kern/sysv_shm.c +++ b/sys/kern/sysv_shm.c @@ -821,12 +821,19 @@ shminit() { int i; - TUNABLE_ULONG_FETCH("kern.ipc.shmmaxpgs", &shminfo.shmall); +#ifndef BURN_BRIDGES + if (TUNABLE_ULONG_FETCH("kern.ipc.shmmaxpgs", &shminfo.shmall) != 0) + printf("kern.ipc.shmmaxpgs is now called kern.ipc.shmall!\n"); +#endif + TUNABLE_ULONG_FETCH("kern.ipc.shmall", &shminfo.shmall); + + /* Initialize shmmax dealing with possible overflow. */ for (i = PAGE_SIZE; i > 0; i--) { shminfo.shmmax = shminfo.shmall * i; if (shminfo.shmmax >= shminfo.shmall) break; } + TUNABLE_ULONG_FETCH("kern.ipc.shmmin", &shminfo.shmmin); TUNABLE_ULONG_FETCH("kern.ipc.shmmni", &shminfo.shmmni); TUNABLE_ULONG_FETCH("kern.ipc.shmseg", &shminfo.shmseg); diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 6990b8ff94fe..1928c1f310bb 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -102,21 +102,22 @@ static const char *dev_console_filename; static void tty_watermarks(struct tty *tp) { - size_t bs; + size_t bs = 0; /* Provide an input buffer for 0.2 seconds of data. */ - bs = MIN(tp->t_termios.c_ispeed / 5, TTYBUF_MAX); + if (tp->t_termios.c_cflag & CREAD) + bs = MIN(tp->t_termios.c_ispeed / 5, TTYBUF_MAX); ttyinq_setsize(&tp->t_inq, tp, bs); /* Set low watermark at 10% (when 90% is available). */ - tp->t_inlow = (ttyinq_getsize(&tp->t_inq) * 9) / 10; + tp->t_inlow = (ttyinq_getallocatedsize(&tp->t_inq) * 9) / 10; /* Provide an ouput buffer for 0.2 seconds of data. */ bs = MIN(tp->t_termios.c_ospeed / 5, TTYBUF_MAX); ttyoutq_setsize(&tp->t_outq, tp, bs); /* Set low watermark at 10% (when 90% is available). */ - tp->t_outlow = (ttyoutq_getsize(&tp->t_outq) * 9) / 10; + tp->t_outlow = (ttyoutq_getallocatedsize(&tp->t_outq) * 9) / 10; } static int @@ -355,6 +356,7 @@ tty_wait_background(struct tty *tp, struct thread *td, int sig) { struct proc *p = td->td_proc; struct pgrp *pg; + ksiginfo_t ksi; int error; MPASS(sig == SIGTTIN || sig == SIGTTOU); @@ -396,8 +398,14 @@ tty_wait_background(struct tty *tp, struct thread *td, int sig) * Send the signal and sleep until we're the new * foreground process group. */ + if (sig != 0) { + ksiginfo_init(&ksi); + ksi.ksi_code = SI_KERNEL; + ksi.ksi_signo = sig; + sig = 0; + } PGRP_LOCK(pg); - pgsignal(pg, sig, 1); + pgsignal(pg, ksi.ksi_signo, 1, &ksi); PGRP_UNLOCK(pg); error = tty_wait(tp, &tp->t_bgwait); @@ -497,12 +505,12 @@ ttydev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, case TIOCSPGRP: case TIOCSTART: case TIOCSTAT: + case TIOCSTI: case TIOCSTOP: case TIOCSWINSZ: #if 0 case TIOCSDRAINWAIT: case TIOCSETD: - case TIOCSTI: #endif #ifdef COMPAT_43TTY case TIOCLBIC: @@ -523,7 +531,35 @@ ttydev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, goto done; } - error = tty_ioctl(tp, cmd, data, td); + if (cmd == TIOCSETA || cmd == TIOCSETAW || cmd == TIOCSETAF) { + struct termios *old = &tp->t_termios; + struct termios *new = (struct termios *)data; + struct termios *lock = TTY_CALLOUT(tp, dev) ? + &tp->t_termios_lock_out : &tp->t_termios_lock_in; + int cc; + + /* + * Lock state devices. Just overwrite the values of the + * commands that are currently in use. + */ + new->c_iflag = (old->c_iflag & lock->c_iflag) | + (new->c_iflag & ~lock->c_iflag); + new->c_oflag = (old->c_oflag & lock->c_oflag) | + (new->c_oflag & ~lock->c_oflag); + new->c_cflag = (old->c_cflag & lock->c_cflag) | + (new->c_cflag & ~lock->c_cflag); + new->c_lflag = (old->c_lflag & lock->c_lflag) | + (new->c_lflag & ~lock->c_lflag); + for (cc = 0; cc < NCCS; ++cc) + if (lock->c_cc[cc]) + new->c_cc[cc] = old->c_cc[cc]; + if (lock->c_ispeed) + new->c_ispeed = old->c_ispeed; + if (lock->c_ospeed) + new->c_ospeed = old->c_ospeed; + } + + error = tty_ioctl(tp, cmd, data, fflag, td); done: tty_unlock(tp); return (error); @@ -567,7 +603,8 @@ ttydev_poll(struct cdev *dev, int events, struct thread *td) } static int -ttydev_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +ttydev_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { struct tty *tp = dev->si_drv1; int error; @@ -577,7 +614,7 @@ ttydev_mmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) error = ttydev_enter(tp); if (error) return (-1); - error = ttydevsw_mmap(tp, offset, paddr, nprot); + error = ttydevsw_mmap(tp, offset, paddr, nprot, memattr); tty_unlock(tp); return (error); @@ -842,8 +879,20 @@ static int ttydevsw_defparam(struct tty *tp, struct termios *t) { - /* Use a fake baud rate, we're not a real device. */ - t->c_ispeed = t->c_ospeed = TTYDEF_SPEED; + /* + * Allow the baud rate to be adjusted for pseudo-devices, but at + * least restrict it to 115200 to prevent excessive buffer + * usage. Also disallow 0, to prevent foot shooting. + */ + if (t->c_ispeed < B50) + t->c_ispeed = B50; + else if (t->c_ispeed > B115200) + t->c_ispeed = B115200; + if (t->c_ospeed < B50) + t->c_ospeed = B50; + else if (t->c_ospeed > B115200) + t->c_ospeed = B115200; + t->c_cflag |= CREAD; return (0); } @@ -857,8 +906,8 @@ ttydevsw_defmodem(struct tty *tp, int sigon, int sigoff) } static int -ttydevsw_defmmap(struct tty *tp, vm_offset_t offset, vm_paddr_t *paddr, - int nprot) +ttydevsw_defmmap(struct tty *tp, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { return (-1); @@ -1201,6 +1250,8 @@ tty_signal_sessleader(struct tty *tp, int sig) void tty_signal_pgrp(struct tty *tp, int sig) { + ksiginfo_t ksi; + tty_lock_assert(tp, MA_OWNED); MPASS(sig >= 1 && sig < NSIG); @@ -1210,8 +1261,11 @@ tty_signal_pgrp(struct tty *tp, int sig) if (sig == SIGINFO && !(tp->t_termios.c_lflag & NOKERNINFO)) tty_info(tp); if (tp->t_pgrp != NULL) { + ksiginfo_init(&ksi); + ksi.ksi_signo = sig; + ksi.ksi_code = SI_KERNEL; PGRP_LOCK(tp->t_pgrp); - pgsignal(tp->t_pgrp, sig, 1); + pgsignal(tp->t_pgrp, sig, 1, &ksi); PGRP_UNLOCK(tp->t_pgrp); } } @@ -1296,7 +1350,8 @@ tty_flush(struct tty *tp, int flags) } static int -tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, struct thread *td) +tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, + struct thread *td) { int error; @@ -1623,17 +1678,26 @@ tty_generic_ioctl(struct tty *tp, u_long cmd, void *data, struct thread *td) case TIOCSTAT: tty_info(tp); return (0); + case TIOCSTI: + if ((fflag & FREAD) == 0 && priv_check(td, PRIV_TTY_STI)) + return (EPERM); + if (!tty_is_ctty(tp, td->td_proc) && + priv_check(td, PRIV_TTY_STI)) + return (EACCES); + ttydisc_rint(tp, *(char *)data, 0); + ttydisc_rint_done(tp); + return (0); } #ifdef COMPAT_43TTY - return tty_ioctl_compat(tp, cmd, data, td); + return tty_ioctl_compat(tp, cmd, data, fflag, td); #else /* !COMPAT_43TTY */ return (ENOIOCTL); #endif /* COMPAT_43TTY */ } int -tty_ioctl(struct tty *tp, u_long cmd, void *data, struct thread *td) +tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, struct thread *td) { int error; @@ -1644,7 +1708,7 @@ tty_ioctl(struct tty *tp, u_long cmd, void *data, struct thread *td) error = ttydevsw_ioctl(tp, cmd, data, td); if (error == ENOIOCTL) - error = tty_generic_ioctl(tp, cmd, data, td); + error = tty_generic_ioctl(tp, cmd, data, fflag, td); return (error); } diff --git a/sys/kern/tty_compat.c b/sys/kern/tty_compat.c index 00764b89d3ee..6dce01d0b6d6 100644 --- a/sys/kern/tty_compat.c +++ b/sys/kern/tty_compat.c @@ -180,7 +180,8 @@ ttsetcompat(struct tty *tp, u_long *com, caddr_t data, struct termios *term) /*ARGSUSED*/ int -tty_ioctl_compat(struct tty *tp, u_long com, caddr_t data, struct thread *td) +tty_ioctl_compat(struct tty *tp, u_long com, caddr_t data, int fflag, + struct thread *td) { switch (com) { case TIOCSETP: @@ -196,7 +197,7 @@ tty_ioctl_compat(struct tty *tp, u_long com, caddr_t data, struct thread *td) term = tp->t_termios; if ((error = ttsetcompat(tp, &com, data, &term)) != 0) return error; - return tty_ioctl(tp, com, &term, td); + return tty_ioctl(tp, com, &term, fflag, td); } case TIOCGETP: { struct sgttyb *sg = (struct sgttyb *)data; @@ -255,12 +256,13 @@ tty_ioctl_compat(struct tty *tp, u_long com, caddr_t data, struct thread *td) int ldisczero = 0; return (tty_ioctl(tp, TIOCSETD, - *(int *)data == 2 ? (caddr_t)&ldisczero : data, td)); + *(int *)data == 2 ? (caddr_t)&ldisczero : data, + fflag, td)); } case OTIOCCONS: *(int *)data = 1; - return (tty_ioctl(tp, TIOCCONS, data, td)); + return (tty_ioctl(tp, TIOCCONS, data, fflag, td)); default: return (ENOIOCTL); diff --git a/sys/kern/tty_inq.c b/sys/kern/tty_inq.c index c618a0ad1a5d..b0e9b18a788d 100644 --- a/sys/kern/tty_inq.c +++ b/sys/kern/tty_inq.c @@ -61,13 +61,6 @@ __FBSDID("$FreeBSD$"); * the outq, we'll stick to 128 byte blocks here. */ -/* Statistics. */ -static unsigned long ttyinq_nfast = 0; -SYSCTL_ULONG(_kern, OID_AUTO, tty_inq_nfast, CTLFLAG_RD, - &ttyinq_nfast, 0, "Unbuffered reads to userspace on input"); -static unsigned long ttyinq_nslow = 0; -SYSCTL_ULONG(_kern, OID_AUTO, tty_inq_nslow, CTLFLAG_RD, - &ttyinq_nslow, 0, "Buffered reads to userspace on input"); static int ttyinq_flush_secure = 1; SYSCTL_INT(_kern, OID_AUTO, tty_inq_flush_secure, CTLFLAG_RW, &ttyinq_flush_secure, 0, "Zero buffers while flushing"); @@ -201,8 +194,6 @@ ttyinq_read_uio(struct ttyinq *ti, struct tty *tp, struct uio *uio, * the write pointer to a new block. */ if (cend == TTYINQ_DATASIZE || cend == ti->ti_end) { - atomic_add_long(&ttyinq_nfast, 1); - /* * Fast path: zero copy. Remove the first block, * so we can unlock the TTY temporarily. @@ -239,7 +230,6 @@ ttyinq_read_uio(struct ttyinq *ti, struct tty *tp, struct uio *uio, TTYINQ_RECYCLE(ti, tib); } else { char ob[TTYINQ_DATASIZE - 1]; - atomic_add_long(&ttyinq_nslow, 1); /* * Slow path: store data in a temporary buffer. @@ -379,7 +369,7 @@ ttyinq_findchar(struct ttyinq *ti, const char *breakc, size_t maxlen, void ttyinq_flush(struct ttyinq *ti) { - struct ttyinq_block *tib = ti->ti_lastblock; + struct ttyinq_block *tib; ti->ti_begin = 0; ti->ti_linestart = 0; diff --git a/sys/kern/tty_outq.c b/sys/kern/tty_outq.c index f429a92893d9..d5ed221efa07 100644 --- a/sys/kern/tty_outq.c +++ b/sys/kern/tty_outq.c @@ -34,7 +34,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include @@ -52,14 +51,6 @@ __FBSDID("$FreeBSD$"); * output. */ -/* Statistics. */ -static unsigned long ttyoutq_nfast = 0; -SYSCTL_ULONG(_kern, OID_AUTO, tty_outq_nfast, CTLFLAG_RD, - &ttyoutq_nfast, 0, "Unbuffered reads to userspace on output"); -static unsigned long ttyoutq_nslow = 0; -SYSCTL_ULONG(_kern, OID_AUTO, tty_outq_nslow, CTLFLAG_RD, - &ttyoutq_nslow, 0, "Buffered reads to userspace on output"); - struct ttyoutq_block { struct ttyoutq_block *tob_next; char tob_data[TTYOUTQ_DATASIZE]; @@ -236,8 +227,6 @@ ttyoutq_read_uio(struct ttyoutq *to, struct tty *tp, struct uio *uio) * the write pointer to a new block. */ if (cend == TTYOUTQ_DATASIZE || cend == to->to_end) { - atomic_add_long(&ttyoutq_nfast, 1); - /* * Fast path: zero copy. Remove the first block, * so we can unlock the TTY temporarily. @@ -258,7 +247,6 @@ ttyoutq_read_uio(struct ttyoutq *to, struct tty *tp, struct uio *uio) TTYOUTQ_RECYCLE(to, tob); } else { char ob[TTYOUTQ_DATASIZE - 1]; - atomic_add_long(&ttyoutq_nslow, 1); /* * Slow path: store data in a temporary buffer. diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c index bc6e15828674..290fdc2ec153 100644 --- a/sys/kern/tty_pts.c +++ b/sys/kern/tty_pts.c @@ -71,9 +71,6 @@ __FBSDID("$FreeBSD$"); * UT_LINESIZE. */ static struct unrhdr *pts_pool; -static unsigned int pts_maxdev = 999; -SYSCTL_UINT(_kern, OID_AUTO, pts_maxdev, CTLFLAG_RW, &pts_maxdev, 0, - "Maximum amount of pts(4) pseudo-terminals"); static MALLOC_DEFINE(M_PTS, "pts", "pseudo tty device"); @@ -379,7 +376,7 @@ ptsdev_ioctl(struct file *fp, u_long cmd, void *data, /* Just redirect this ioctl to the slave device. */ tty_lock(tp); - error = tty_ioctl(tp, cmd, data, td); + error = tty_ioctl(tp, cmd, data, fp->f_flag, td); tty_unlock(tp); if (error == ENOIOCTL) error = ENOTTY; @@ -725,16 +722,11 @@ pts_alloc(int fflags, struct thread *td, struct file *fp) chgptscnt(uid, -1, 0); return (EAGAIN); } - if (unit > pts_maxdev) { - free_unr(pts_pool, unit); - chgptscnt(uid, -1, 0); - return (EAGAIN); - } /* Allocate TTY and softc. */ psc = malloc(sizeof(struct pts_softc), M_PTS, M_WAITOK|M_ZERO); - cv_init(&psc->pts_inwait, "pts inwait"); - cv_init(&psc->pts_outwait, "pts outwait"); + cv_init(&psc->pts_inwait, "ptsin"); + cv_init(&psc->pts_outwait, "ptsout"); psc->pts_unit = unit; psc->pts_uidinfo = uid; @@ -772,8 +764,8 @@ pts_alloc_external(int fflags, struct thread *td, struct file *fp, /* Allocate TTY and softc. */ psc = malloc(sizeof(struct pts_softc), M_PTS, M_WAITOK|M_ZERO); - cv_init(&psc->pts_inwait, "pts inwait"); - cv_init(&psc->pts_outwait, "pts outwait"); + cv_init(&psc->pts_inwait, "ptsin"); + cv_init(&psc->pts_outwait, "ptsout"); psc->pts_unit = -1; psc->pts_cdev = dev; diff --git a/sys/kern/tty_ttydisc.c b/sys/kern/tty_ttydisc.c index d79a2b761d56..6afac8df5e94 100644 --- a/sys/kern/tty_ttydisc.c +++ b/sys/kern/tty_ttydisc.c @@ -624,15 +624,21 @@ ttydisc_echo_force(struct tty *tp, char c, int quote) /* * Only use ^X notation when ECHOCTL is turned on and * we've got an quoted control character. + * + * Print backspaces when echoing an end-of-file. */ - char ob[2] = { '^', '?' }; + char ob[4] = "^?\b\b"; /* Print ^X notation. */ if (c != 0x7f) ob[1] = c + 'A' - 1; - tp->t_column += 2; - return ttyoutq_write_nofrag(&tp->t_outq, ob, 2); + if (!quote && CMP_CC(VEOF, c)) { + return ttyoutq_write_nofrag(&tp->t_outq, ob, 4); + } else { + tp->t_column += 2; + return ttyoutq_write_nofrag(&tp->t_outq, ob, 2); + } } else { /* Can just be printed. */ tp->t_column++; diff --git a/sys/kern/uipc_accf.c b/sys/kern/uipc_accf.c index 102c04f26630..236b60d01cfd 100644 --- a/sys/kern/uipc_accf.c +++ b/sys/kern/uipc_accf.c @@ -54,7 +54,7 @@ MTX_SYSINIT(accept_filter, &accept_filter_mtx, "accept_filter_mtx", #define ACCEPT_FILTER_UNLOCK() mtx_unlock(&accept_filter_mtx) static SLIST_HEAD(, accept_filter) accept_filtlsthd = - SLIST_HEAD_INITIALIZER(&accept_filtlsthd); + SLIST_HEAD_INITIALIZER(accept_filtlsthd); MALLOC_DEFINE(M_ACCF, "accf", "accept filter data"); diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c index 5ca13f8844f7..f41b49c63b97 100644 --- a/sys/kern/uipc_sem.c +++ b/sys/kern/uipc_sem.c @@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include #include diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 34d5edc345fc..5cbdc4086a9e 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -773,6 +773,8 @@ soconnect(struct socket *so, struct sockaddr *nam, struct thread *td) if (so->so_options & SO_ACCEPTCONN) return (EOPNOTSUPP); + + CURVNET_SET(so->so_vnet); /* * If protocol is connection-based, can only connect once. * Otherwise, if connected, try to disconnect first. This allows @@ -788,10 +790,9 @@ soconnect(struct socket *so, struct sockaddr *nam, struct thread *td) * biting us. */ so->so_error = 0; - CURVNET_SET(so->so_vnet); error = (*so->so_proto->pr_usrreqs->pru_connect)(so, nam, td); - CURVNET_RESTORE(); } + CURVNET_RESTORE(); return (error); } @@ -970,9 +971,6 @@ sosend_dgram(struct socket *so, struct sockaddr *addr, struct uio *uio, * must use a signed comparison of space and resid. On the other * hand, a negative resid causes us to loop sending 0-length * segments to the protocol. - * - * Also check to make sure that MSG_EOR isn't used on SOCK_STREAM - * type sockets since that's an error. */ if (resid < 0) { error = EINVAL; diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 34eaf2059c38..c3e755bb834d 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -941,8 +941,8 @@ kern_recvit(td, s, mp, fromseg, controlp) struct uio *ktruio = NULL; #endif - if(controlp != NULL) - *controlp = 0; + if (controlp != NULL) + *controlp = NULL; AUDIT_ARG_FD(s); error = getsock(td->td_proc->p_fd, s, &fp, NULL); @@ -1886,7 +1886,7 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap, if (uap->flags & SF_SYNC) { sfs = malloc(sizeof *sfs, M_TEMP, M_WAITOK); memset(sfs, 0, sizeof *sfs); - mtx_init(&sfs->mtx, "sendfile", MTX_DEF, 0); + mtx_init(&sfs->mtx, "sendfile", NULL, MTX_DEF); cv_init(&sfs->cv, "sendfile"); } @@ -2016,7 +2016,7 @@ retry_space: * Loop and construct maximum sized mbuf chain to be bulk * dumped into socket buffer. */ - while(space > loopbytes) { + while (space > loopbytes) { vm_pindex_t pindex; vm_offset_t pgoff; struct mbuf *m0; @@ -2037,20 +2037,12 @@ retry_space: rem = obj->un_pager.vnp.vnp_size - uap->offset - fsbytes - loopbytes; xfsize = omin(rem, xfsize); + xfsize = omin(space - loopbytes, xfsize); if (xfsize <= 0) { VM_OBJECT_UNLOCK(obj); done = 1; /* all data sent */ break; } - /* - * Don't overflow the send buffer. - * Stop here and send out what we've - * already got. - */ - if (space < loopbytes + xfsize) { - VM_OBJECT_UNLOCK(obj); - break; - } /* * Attempt to look up the page. Allocate @@ -2086,9 +2078,11 @@ retry_space: /* * Get the page from backing store. */ - bsize = vp->v_mount->mnt_stat.f_iosize; vfslocked = VFS_LOCK_GIANT(vp->v_mount); - vn_lock(vp, LK_SHARED | LK_RETRY); + error = vn_lock(vp, LK_SHARED); + if (error != 0) + goto after_read; + bsize = vp->v_mount->mnt_stat.f_iosize; /* * XXXMAC: Because we don't have fp->f_cred @@ -2101,6 +2095,7 @@ retry_space: IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT), td->td_ucred, NOCRED, &resid, td); VOP_UNLOCK(vp, 0); + after_read: VFS_UNLOCK_GIANT(vfslocked); VM_OBJECT_LOCK(obj); vm_page_io_finish(pg); diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index e002b2a90d25..fdf3d902509f 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -50,7 +50,8 @@ * garbage collector to find and tear down cycles of disconnected sockets. * * TODO: - * SEQPACKET, RDM + * RDM + * distinguish datagram size limits from flow control limits in SEQPACKET * rethink name space problems * need a proper out-of-band */ @@ -112,6 +113,7 @@ static ino_t unp_ino; /* Prototype for fake inode numbers. */ static int unp_rights; /* (g) File descriptors in flight. */ static struct unp_head unp_shead; /* (l) List of stream sockets. */ static struct unp_head unp_dhead; /* (l) List of datagram sockets. */ +static struct unp_head unp_sphead; /* (l) List of seqpacket sockets. */ static const struct sockaddr sun_noname = { sizeof(sun_noname), AF_LOCAL }; @@ -139,10 +141,14 @@ static u_long unpst_sendspace = PIPSIZ; static u_long unpst_recvspace = PIPSIZ; static u_long unpdg_sendspace = 2*1024; /* really max datagram size */ static u_long unpdg_recvspace = 4*1024; +static u_long unpsp_sendspace = PIPSIZ; /* really max datagram size */ +static u_long unpsp_recvspace = PIPSIZ; SYSCTL_NODE(_net, PF_LOCAL, local, CTLFLAG_RW, 0, "Local domain"); SYSCTL_NODE(_net_local, SOCK_STREAM, stream, CTLFLAG_RW, 0, "SOCK_STREAM"); SYSCTL_NODE(_net_local, SOCK_DGRAM, dgram, CTLFLAG_RW, 0, "SOCK_DGRAM"); +SYSCTL_NODE(_net_local, SOCK_SEQPACKET, seqpacket, CTLFLAG_RW, 0, + "SOCK_SEQPACKET"); SYSCTL_ULONG(_net_local_stream, OID_AUTO, sendspace, CTLFLAG_RW, &unpst_sendspace, 0, "Default stream send space."); @@ -152,6 +158,10 @@ SYSCTL_ULONG(_net_local_dgram, OID_AUTO, maxdgram, CTLFLAG_RW, &unpdg_sendspace, 0, "Default datagram send space."); SYSCTL_ULONG(_net_local_dgram, OID_AUTO, recvspace, CTLFLAG_RW, &unpdg_recvspace, 0, "Default datagram receive space."); +SYSCTL_ULONG(_net_local_seqpacket, OID_AUTO, maxseqpacket, CTLFLAG_RW, + &unpsp_sendspace, 0, "Default seqpacket send space."); +SYSCTL_ULONG(_net_local_seqpacket, OID_AUTO, recvspace, CTLFLAG_RW, + &unpsp_recvspace, 0, "Default seqpacket receive space."); SYSCTL_INT(_net_local, OID_AUTO, inflight, CTLFLAG_RD, &unp_rights, 0, "File descriptors in flight."); @@ -257,6 +267,7 @@ static struct mbuf *unp_addsockcred(struct thread *, struct mbuf *); */ static struct domain localdomain; static struct pr_usrreqs uipc_usrreqs_dgram, uipc_usrreqs_stream; +static struct pr_usrreqs uipc_usrreqs_seqpacket; static struct protosw localsw[] = { { .pr_type = SOCK_STREAM, @@ -271,6 +282,19 @@ static struct protosw localsw[] = { .pr_flags = PR_ATOMIC|PR_ADDR|PR_RIGHTS, .pr_usrreqs = &uipc_usrreqs_dgram }, +{ + .pr_type = SOCK_SEQPACKET, + .pr_domain = &localdomain, + + /* + * XXXRW: For now, PR_ADDR because soreceive will bump into them + * due to our use of sbappendaddr. A new sbappend variants is needed + * that supports both atomic record writes and control data. + */ + .pr_flags = PR_ADDR|PR_ATOMIC|PR_CONNREQUIRED|PR_WANTRCVD| + PR_RIGHTS, + .pr_usrreqs = &uipc_usrreqs_seqpacket, +}, }; static struct domain localdomain = { @@ -353,6 +377,11 @@ uipc_attach(struct socket *so, int proto, struct thread *td) recvspace = unpdg_recvspace; break; + case SOCK_SEQPACKET: + sendspace = unpsp_sendspace; + recvspace = unpsp_recvspace; + break; + default: panic("uipc_attach"); } @@ -372,8 +401,22 @@ uipc_attach(struct socket *so, int proto, struct thread *td) UNP_LIST_LOCK(); unp->unp_gencnt = ++unp_gencnt; unp_count++; - LIST_INSERT_HEAD(so->so_type == SOCK_DGRAM ? &unp_dhead : &unp_shead, - unp, unp_link); + switch (so->so_type) { + case SOCK_STREAM: + LIST_INSERT_HEAD(&unp_shead, unp, unp_link); + break; + + case SOCK_DGRAM: + LIST_INSERT_HEAD(&unp_dhead, unp, unp_link); + break; + + case SOCK_SEQPACKET: + LIST_INSERT_HEAD(&unp_sphead, unp, unp_link); + break; + + default: + panic("uipc_attach"); + } UNP_LIST_UNLOCK(); return (0); @@ -705,11 +748,8 @@ uipc_rcvd(struct socket *so, int flags) unp = sotounpcb(so); KASSERT(unp != NULL, ("uipc_rcvd: unp == NULL")); - if (so->so_type == SOCK_DGRAM) - panic("uipc_rcvd DGRAM?"); - - if (so->so_type != SOCK_STREAM) - panic("uipc_rcvd unknown socktype"); + if (so->so_type != SOCK_STREAM && so->so_type != SOCK_SEQPACKET) + panic("uipc_rcvd socktype %d", so->so_type); /* * Adjust backpressure on sender and wakeup any waiting to write. @@ -824,6 +864,7 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, break; } + case SOCK_SEQPACKET: case SOCK_STREAM: if ((so->so_state & SS_ISCONNECTED) == 0) { if (nam != NULL) { @@ -875,11 +916,33 @@ uipc_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, * Send to paired receive port, and then reduce send buffer * hiwater marks to maintain backpressure. Wake up readers. */ - if (control != NULL) { - if (sbappendcontrol_locked(&so2->so_rcv, m, control)) + switch (so->so_type) { + case SOCK_STREAM: + if (control != NULL) { + if (sbappendcontrol_locked(&so2->so_rcv, m, + control)) + control = NULL; + } else + sbappend_locked(&so2->so_rcv, m); + break; + + case SOCK_SEQPACKET: { + const struct sockaddr *from; + + from = &sun_noname; + if (sbappendaddr_locked(&so2->so_rcv, from, m, + control)) control = NULL; - } else - sbappend_locked(&so2->so_rcv, m); + break; + } + } + + /* + * XXXRW: While fine for SOCK_STREAM, this conflates maximum + * datagram size and back-pressure for SOCK_SEQPACKET, which + * can lead to undesired return of EMSGSIZE on send instead + * of more desirable blocking. + */ mbcnt_delta = so2->so_rcv.sb_mbcnt - unp2->unp_mbcnt; unp2->unp_mbcnt = so2->so_rcv.sb_mbcnt; sbcc = so2->so_rcv.sb_cc; @@ -939,7 +1002,8 @@ uipc_sense(struct socket *so, struct stat *sb) UNP_LINK_RLOCK(); UNP_PCB_LOCK(unp); unp2 = unp->unp_conn; - if (so->so_type == SOCK_STREAM && unp2 != NULL) { + if ((so->so_type == SOCK_STREAM || so->so_type == SOCK_SEQPACKET) && + unp2 != NULL) { so2 = unp2->unp_socket; sb->st_blksize += so2->so_rcv.sb_cc; } @@ -1009,6 +1073,26 @@ static struct pr_usrreqs uipc_usrreqs_dgram = { .pru_close = uipc_close, }; +static struct pr_usrreqs uipc_usrreqs_seqpacket = { + .pru_abort = uipc_abort, + .pru_accept = uipc_accept, + .pru_attach = uipc_attach, + .pru_bind = uipc_bind, + .pru_connect = uipc_connect, + .pru_connect2 = uipc_connect2, + .pru_detach = uipc_detach, + .pru_disconnect = uipc_disconnect, + .pru_listen = uipc_listen, + .pru_peeraddr = uipc_peeraddr, + .pru_rcvd = uipc_rcvd, + .pru_send = uipc_send, + .pru_sense = uipc_sense, + .pru_shutdown = uipc_shutdown, + .pru_sockaddr = uipc_sockaddr, + .pru_soreceive = soreceive_generic, /* XXX: or...? */ + .pru_close = uipc_close, +}; + static struct pr_usrreqs uipc_usrreqs_stream = { .pru_abort = uipc_abort, .pru_accept = uipc_accept, @@ -1306,6 +1390,7 @@ unp_connect2(struct socket *so, struct socket *so2, int req) break; case SOCK_STREAM: + case SOCK_SEQPACKET: unp2->unp_conn = unp; if (req == PRU_CONNECT && ((unp->unp_flags | unp2->unp_flags) & UNP_CONNWAIT)) @@ -1343,6 +1428,7 @@ unp_disconnect(struct unpcb *unp, struct unpcb *unp2) break; case SOCK_STREAM: + case SOCK_SEQPACKET: soisdisconnected(unp->unp_socket); unp2->unp_conn = NULL; soisdisconnected(unp2->unp_socket); @@ -1368,7 +1454,22 @@ unp_pcblist(SYSCTL_HANDLER_ARGS) struct unp_head *head; struct xunpcb *xu; - head = ((intptr_t)arg1 == SOCK_DGRAM ? &unp_dhead : &unp_shead); + switch ((intptr_t)arg1) { + case SOCK_STREAM: + head = &unp_shead; + break; + + case SOCK_DGRAM: + head = &unp_dhead; + break; + + case SOCK_SEQPACKET: + head = &unp_sphead; + break; + + default: + panic("unp_pcblist: arg1 %d", (int)(intptr_t)arg1); + } /* * The process of preparing the PCB list is too time-consuming and @@ -1481,6 +1582,9 @@ SYSCTL_PROC(_net_local_dgram, OID_AUTO, pcblist, CTLFLAG_RD, SYSCTL_PROC(_net_local_stream, OID_AUTO, pcblist, CTLFLAG_RD, (caddr_t)(long)SOCK_STREAM, 0, unp_pcblist, "S,xunpcb", "List of active local stream sockets"); +SYSCTL_PROC(_net_local_seqpacket, OID_AUTO, pcblist, CTLFLAG_RD, + (caddr_t)(long)SOCK_SEQPACKET, 0, unp_pcblist, "S,xunpcb", + "List of active local seqpacket sockets"); static void unp_shutdown(struct unpcb *unp) @@ -1492,7 +1596,8 @@ unp_shutdown(struct unpcb *unp) UNP_PCB_LOCK_ASSERT(unp); unp2 = unp->unp_conn; - if (unp->unp_socket->so_type == SOCK_STREAM && unp2 != NULL) { + if ((unp->unp_socket->so_type == SOCK_STREAM || + (unp->unp_socket->so_type == SOCK_SEQPACKET)) && unp2 != NULL) { so = unp2->unp_socket; if (so != NULL) socantrcvmore(so); @@ -1658,6 +1763,7 @@ unp_init(void) NULL, EVENTHANDLER_PRI_ANY); LIST_INIT(&unp_dhead); LIST_INIT(&unp_shead); + LIST_INIT(&unp_sphead); TASK_INIT(&unp_gc_task, 0, unp_gc, NULL); UNP_LINK_LOCK_INIT(); UNP_LIST_LOCK_INIT(); @@ -1974,7 +2080,8 @@ SYSCTL_INT(_net_local, OID_AUTO, taskcount, CTLFLAG_RD, &unp_taskcount, 0, static void unp_gc(__unused void *arg, int pending) { - struct unp_head *heads[] = { &unp_dhead, &unp_shead, NULL }; + struct unp_head *heads[] = { &unp_dhead, &unp_shead, &unp_sphead, + NULL }; struct unp_head **head; struct file **unref; struct unpcb *unp; diff --git a/sys/kern/vfs_acl.c b/sys/kern/vfs_acl.c index ce1fa33b4270..c44bb2508196 100644 --- a/sys/kern/vfs_acl.c +++ b/sys/kern/vfs_acl.c @@ -161,7 +161,7 @@ acl_copyout(struct acl *kernel_acl, void *user_acl, acl_type_t type) break; default: - if (fuword((char *)user_acl + + if (fuword32((char *)user_acl + offsetof(struct acl, acl_maxcnt)) != ACL_MAX_ENTRIES) return (EINVAL); @@ -173,7 +173,7 @@ acl_copyout(struct acl *kernel_acl, void *user_acl, acl_type_t type) /* * Convert "old" type - ACL_TYPE_{ACCESS,DEFAULT}_OLD - into its "new" - * counterpart. It's required for old (pre-NFS4 ACLs) libc to work + * counterpart. It's required for old (pre-NFSv4 ACLs) libc to work * with new kernel. Fixing 'type' for old binaries with new libc * is being done in lib/libc/posix1e/acl_support.c:_acl_type_unold(). */ @@ -213,7 +213,7 @@ vacl_set_acl(struct thread *td, struct vnode *vp, acl_type_t type, inkernelacl = acl_alloc(M_WAITOK); error = acl_copyin(aclp, inkernelacl, type); - if (error) + if (error != 0) goto out; error = vn_start_write(vp, &mp, V_WAIT | PCATCH); if (error != 0) @@ -233,7 +233,7 @@ out_unlock: vn_finished_write(mp); out: acl_free(inkernelacl); - return(error); + return (error); } /* @@ -276,12 +276,12 @@ vacl_delete(struct thread *td, struct vnode *vp, acl_type_t type) int error; error = vn_start_write(vp, &mp, V_WAIT | PCATCH); - if (error) + if (error != 0) return (error); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); #ifdef MAC error = mac_vnode_check_deleteacl(td->td_ucred, vp, type); - if (error) + if (error != 0) goto out; #endif error = VOP_SETACL(vp, acl_type_unold(type), 0, td->td_ucred, td); @@ -305,9 +305,10 @@ vacl_aclcheck(struct thread *td, struct vnode *vp, acl_type_t type, inkernelacl = acl_alloc(M_WAITOK); error = acl_copyin(aclp, inkernelacl, type); - if (error) + if (error != 0) goto out; - error = VOP_ACLCHECK(vp, type, inkernelacl, td->td_ucred, td); + error = VOP_ACLCHECK(vp, acl_type_unold(type), inkernelacl, + td->td_ucred, td); out: acl_free(inkernelacl); return (error); @@ -501,7 +502,7 @@ __acl_delete_fd(struct thread *td, struct __acl_delete_fd_args *uap) int __acl_aclcheck_file(struct thread *td, struct __acl_aclcheck_file_args *uap) { - struct nameidata nd; + struct nameidata nd; int vfslocked, error; NDINIT(&nd, LOOKUP, MPSAFE|FOLLOW, UIO_USERSPACE, uap->path, td); @@ -521,7 +522,7 @@ __acl_aclcheck_file(struct thread *td, struct __acl_aclcheck_file_args *uap) int __acl_aclcheck_link(struct thread *td, struct __acl_aclcheck_link_args *uap) { - struct nameidata nd; + struct nameidata nd; int vfslocked, error; NDINIT(&nd, LOOKUP, MPSAFE|NOFOLLOW, UIO_USERSPACE, uap->path, td); diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 86ab01eb0341..50bf0d2be0d2 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -83,12 +83,17 @@ static int dirent_exists(struct vnode *vp, const char *dirname, * * If there is no specific entry here, we will return EOPNOTSUPP. * + * Note that every filesystem has to implement either vop_access + * or vop_accessx; failing to do so will result in immediate crash + * due to stack overflow, as vop_stdaccess() calls vop_stdaccessx(), + * which calls vop_stdaccess() etc. */ struct vop_vector default_vnodeops = { .vop_default = NULL, .vop_bypass = VOP_EOPNOTSUPP, + .vop_access = vop_stdaccess, .vop_accessx = vop_stdaccessx, .vop_advlock = vop_stdadvlock, .vop_advlockasync = vop_stdadvlockasync, @@ -325,6 +330,16 @@ out: return (found); } +int +vop_stdaccess(struct vop_access_args *ap) +{ + + KASSERT((ap->a_accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | + VAPPEND)) == 0, ("invalid bit in accmode")); + + return (VOP_ACCESSX(ap->a_vp, ap->a_accmode, ap->a_cred, ap->a_td)); +} + int vop_stdaccessx(struct vop_accessx_args *ap) { @@ -879,10 +894,7 @@ loop: error = VOP_FSYNC(vp, waitfor, td); if (error) allerror = error; - - /* Do not turn this into vput. td is not always curthread. */ - VOP_UNLOCK(vp, 0); - vrele(vp); + vput(vp); MNT_ILOCK(mp); } MNT_IUNLOCK(mp); diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index d898c085adb8..4185211ec693 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -122,6 +123,8 @@ vfs_hang_addrlist(struct mount *mp, struct netexport *nep, np->netc_anon->cr_uid = argp->ex_anon.cr_uid; crsetgroups(np->netc_anon, argp->ex_anon.cr_ngroups, argp->ex_anon.cr_groups); + np->netc_anon->cr_prison = &prison0; + prison_hold(np->netc_anon->cr_prison); np->netc_numsecflavors = argp->ex_numsecflavors; bcopy(argp->ex_secflavors, np->netc_secflavors, sizeof(np->netc_secflavors)); @@ -206,6 +209,8 @@ vfs_hang_addrlist(struct mount *mp, struct netexport *nep, np->netc_anon->cr_uid = argp->ex_anon.cr_uid; crsetgroups(np->netc_anon, argp->ex_anon.cr_ngroups, np->netc_anon->cr_groups); + np->netc_anon->cr_prison = &prison0; + prison_hold(np->netc_anon->cr_prison); np->netc_numsecflavors = argp->ex_numsecflavors; bcopy(argp->ex_secflavors, np->netc_secflavors, sizeof(np->netc_secflavors)); diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index e553ae4dc064..6f10b49c4181 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -162,11 +162,16 @@ namei(struct nameidata *ndp) error = copyinstr(ndp->ni_dirp, cnp->cn_pnbuf, MAXPATHLEN, (size_t *)&ndp->ni_pathlen); - /* If we are auditing the kernel pathname, save the user pathname. */ - if (cnp->cn_flags & AUDITVNODE1) - AUDIT_ARG_UPATH1(td, cnp->cn_pnbuf); - if (cnp->cn_flags & AUDITVNODE2) - AUDIT_ARG_UPATH2(td, cnp->cn_pnbuf); + if (error == 0) { + /* + * If we are auditing the kernel pathname, save the user + * pathname. + */ + if (cnp->cn_flags & AUDITVNODE1) + AUDIT_ARG_UPATH1(td, cnp->cn_pnbuf); + if (cnp->cn_flags & AUDITVNODE2) + AUDIT_ARG_UPATH2(td, cnp->cn_pnbuf); + } /* * Don't allow empty pathnames. @@ -552,6 +557,12 @@ dirloop: else cnp->cn_flags &= ~ISLASTCN; + if ((cnp->cn_flags & ISLASTCN) != 0 && + cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.' && + (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) { + error = EINVAL; + goto bad; + } /* * Check for degenerate name (e.g. / or "") diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 15899ce1f0bf..088d93973bd7 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -104,13 +104,17 @@ struct vnode *rootvnode; * The root filesystem is detailed in the kernel environment variable * vfs.root.mountfrom, which is expected to be in the general format * - * :[] + * :[][ :[] ...] * vfsname := the name of a VFS known to the kernel and capable * of being mounted as root * path := disk device name or other data used by the filesystem * to locate its physical store * - * The environment variable vfs.root.mountfrom options is a comma delimited + * If the environment variable vfs.root.mountfrom is a space separated list, + * each list element is tried in turn and the root filesystem will be mounted + * from the first one that suceeds. + * + * The environment variable vfs.root.mountfrom.options is a comma delimited * set of string mount options. These mount options must be parseable * by nmount() in the kernel. */ @@ -955,12 +959,12 @@ vfs_domount( } vp->v_iflag |= VI_MOUNT; VI_UNLOCK(vp); + VOP_UNLOCK(vp, 0); /* * Allocate and initialize the filesystem. */ mp = vfs_mount_alloc(vp, vfsp, fspath, td->td_ucred); - VOP_UNLOCK(vp, 0); /* XXXMAC: pass to vfs_mount_alloc? */ mp->mnt_optnew = fsdata; @@ -1056,12 +1060,12 @@ vfs_domount( * Put the new filesystem on the mount list after root. */ cache_purge(vp); + VI_LOCK(vp); + vp->v_iflag &= ~VI_MOUNT; + VI_UNLOCK(vp); if (!error) { struct vnode *newdp; - VI_LOCK(vp); - vp->v_iflag &= ~VI_MOUNT; - VI_UNLOCK(vp); vp->v_mountedhere = mp; mtx_lock(&mountlist_mtx); TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list); @@ -1079,9 +1083,6 @@ vfs_domount( if (error) vrele(vp); } else { - VI_LOCK(vp); - vp->v_iflag &= ~VI_MOUNT; - VI_UNLOCK(vp); vfs_unbusy(mp); vfs_mount_destroy(mp); vput(vp); @@ -1350,7 +1351,7 @@ struct root_hold_token { }; static LIST_HEAD(, root_hold_token) root_holds = - LIST_HEAD_INITIALIZER(&root_holds); + LIST_HEAD_INITIALIZER(root_holds); static int root_mount_complete; @@ -1643,7 +1644,7 @@ vfs_opterror(struct vfsoptlist *opts, const char *fmt, ...) void vfs_mountroot(void) { - char *cp, *options; + char *cp, *cpt, *options, *tmpdev; int error, i, asked = 0; options = NULL; @@ -1695,10 +1696,15 @@ vfs_mountroot(void) */ cp = getenv("vfs.root.mountfrom"); if (cp != NULL) { - error = vfs_mountroot_try(cp, options); + cpt = cp; + while ((tmpdev = strsep(&cpt, " \t")) != NULL) { + error = vfs_mountroot_try(tmpdev, options); + if (error == 0) { + freeenv(cp); + goto mounted; + } + } freeenv(cp); - if (!error) - goto mounted; } /* @@ -1892,6 +1898,7 @@ vfs_mountroot_ask(void) freeenv(options); printf("\nManual root filesystem specification:\n"); printf(" : Mount using filesystem \n"); + printf(" eg. zfs:tank\n"); printf(" eg. ufs:/dev/da0s1a\n"); printf(" eg. cd9660:/dev/acd0\n"); printf(" This is equivalent to: "); diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index c40dad1f0110..daaa5b1bcce1 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -152,6 +152,10 @@ SYSCTL_LONG(_vfs, OID_AUTO, wantfreevnodes, CTLFLAG_RW, &wantfreevnodes, 0, ""); static u_long freevnodes; SYSCTL_LONG(_vfs, OID_AUTO, freevnodes, CTLFLAG_RD, &freevnodes, 0, ""); +static int vlru_allow_cache_src; +SYSCTL_INT(_vfs, OID_AUTO, vlru_allow_cache_src, CTLFLAG_RW, + &vlru_allow_cache_src, 0, "Allow vlru to reclaim source vnode"); + /* * Various variables used for debugging the new implementation of * reassignbuf(). @@ -643,7 +647,9 @@ vlrureclaim(struct mount *mp) * If it's been deconstructed already, it's still * referenced, or it exceeds the trigger, skip it. */ - if (vp->v_usecount || !LIST_EMPTY(&(vp)->v_cache_src) || + if (vp->v_usecount || + (!vlru_allow_cache_src && + !LIST_EMPTY(&(vp)->v_cache_src)) || (vp->v_iflag & VI_DOOMED) != 0 || (vp->v_object != NULL && vp->v_object->resident_page_count > trigger)) { VI_UNLOCK(vp); @@ -668,7 +674,9 @@ vlrureclaim(struct mount *mp) * interlock, the other thread will be unable to drop the * vnode lock before our VOP_LOCK() call fails. */ - if (vp->v_usecount || !LIST_EMPTY(&(vp)->v_cache_src) || + if (vp->v_usecount || + (!vlru_allow_cache_src && + !LIST_EMPTY(&(vp)->v_cache_src)) || (vp->v_object != NULL && vp->v_object->resident_page_count > trigger)) { VOP_UNLOCK(vp, LK_INTERLOCK); @@ -2141,37 +2149,44 @@ vrefcnt(struct vnode *vp) return (usecnt); } +#define VPUTX_VRELE 1 +#define VPUTX_VPUT 2 +#define VPUTX_VUNREF 3 -/* - * Vnode put/release. - * If count drops to zero, call inactive routine and return to freelist. - */ -void -vrele(struct vnode *vp) +static void +vputx(struct vnode *vp, int func) { - struct thread *td = curthread; /* XXX */ + int error; - KASSERT(vp != NULL, ("vrele: null vp")); + KASSERT(vp != NULL, ("vputx: null vp")); + if (func == VPUTX_VUNREF) + ASSERT_VOP_ELOCKED(vp, "vunref"); + else if (func == VPUTX_VPUT) + ASSERT_VOP_LOCKED(vp, "vput"); + else + KASSERT(func == VPUTX_VRELE, ("vputx: wrong func")); VFS_ASSERT_GIANT(vp->v_mount); - + CTR2(KTR_VFS, "%s: vp %p", __func__, vp); VI_LOCK(vp); /* Skip this v_writecount check if we're going to panic below. */ VNASSERT(vp->v_writecount < vp->v_usecount || vp->v_usecount < 1, vp, - ("vrele: missed vn_close")); - CTR2(KTR_VFS, "%s: vp %p", __func__, vp); + ("vputx: missed vn_close")); + error = 0; if (vp->v_usecount > 1 || ((vp->v_iflag & VI_DOINGINACT) && vp->v_usecount == 1)) { + if (func == VPUTX_VPUT) + VOP_UNLOCK(vp, 0); v_decr_usecount(vp); return; } + if (vp->v_usecount != 1) { #ifdef DIAGNOSTIC - vprint("vrele: negative ref count", vp); + vprint("vputx: negative ref count", vp); #endif - VI_UNLOCK(vp); - panic("vrele: negative ref cnt"); + panic("vputx: negative ref cnt"); } CTR2(KTR_VFS, "%s: return vnode %p to the freelist", __func__, vp); /* @@ -2185,21 +2200,35 @@ vrele(struct vnode *vp) * as VI_DOINGINACT to avoid recursion. */ vp->v_iflag |= VI_OWEINACT; - if (vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK) == 0) { + if (func == VPUTX_VRELE) { + error = vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK); VI_LOCK(vp); - if (vp->v_usecount > 0) - vp->v_iflag &= ~VI_OWEINACT; + } else if (func == VPUTX_VPUT && VOP_ISLOCKED(vp) != LK_EXCLUSIVE) { + error = VOP_LOCK(vp, LK_UPGRADE | LK_INTERLOCK | LK_NOWAIT); + VI_LOCK(vp); + } + if (vp->v_usecount > 0) + vp->v_iflag &= ~VI_OWEINACT; + if (error == 0) { if (vp->v_iflag & VI_OWEINACT) - vinactive(vp, td); - VOP_UNLOCK(vp, 0); - } else { - VI_LOCK(vp); - if (vp->v_usecount > 0) - vp->v_iflag &= ~VI_OWEINACT; + vinactive(vp, curthread); + if (func != VPUTX_VUNREF) + VOP_UNLOCK(vp, 0); } vdropl(vp); } +/* + * Vnode put/release. + * If count drops to zero, call inactive routine and return to freelist. + */ +void +vrele(struct vnode *vp) +{ + + vputx(vp, VPUTX_VRELE); +} + /* * Release an already locked vnode. This give the same effects as * unlock+vrele(), but takes less time and avoids releasing and @@ -2208,56 +2237,18 @@ vrele(struct vnode *vp) void vput(struct vnode *vp) { - struct thread *td = curthread; /* XXX */ - int error; - KASSERT(vp != NULL, ("vput: null vp")); - ASSERT_VOP_LOCKED(vp, "vput"); - VFS_ASSERT_GIANT(vp->v_mount); - CTR2(KTR_VFS, "%s: vp %p", __func__, vp); - VI_LOCK(vp); - /* Skip this v_writecount check if we're going to panic below. */ - VNASSERT(vp->v_writecount < vp->v_usecount || vp->v_usecount < 1, vp, - ("vput: missed vn_close")); - error = 0; + vputx(vp, VPUTX_VPUT); +} - if (vp->v_usecount > 1 || ((vp->v_iflag & VI_DOINGINACT) && - vp->v_usecount == 1)) { - VOP_UNLOCK(vp, 0); - v_decr_usecount(vp); - return; - } +/* + * Release an exclusively locked vnode. Do not unlock the vnode lock. + */ +void +vunref(struct vnode *vp) +{ - if (vp->v_usecount != 1) { -#ifdef DIAGNOSTIC - vprint("vput: negative ref count", vp); -#endif - panic("vput: negative ref cnt"); - } - CTR2(KTR_VFS, "%s: return to freelist the vnode %p", __func__, vp); - /* - * We want to hold the vnode until the inactive finishes to - * prevent vgone() races. We drop the use count here and the - * hold count below when we're done. - */ - v_decr_useonly(vp); - vp->v_iflag |= VI_OWEINACT; - if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) { - error = VOP_LOCK(vp, LK_UPGRADE|LK_INTERLOCK|LK_NOWAIT); - VI_LOCK(vp); - if (error) { - if (vp->v_usecount > 0) - vp->v_iflag &= ~VI_OWEINACT; - goto done; - } - } - if (vp->v_usecount > 0) - vp->v_iflag &= ~VI_OWEINACT; - if (vp->v_iflag & VI_OWEINACT) - vinactive(vp, td); - VOP_UNLOCK(vp, 0); -done: - vdropl(vp); + vputx(vp, VPUTX_VUNREF); } /* @@ -2689,14 +2680,12 @@ vn_printf(struct vnode *vp, const char *fmt, ...) strlcat(buf, "|VI_DOOMED", sizeof(buf)); if (vp->v_iflag & VI_FREE) strlcat(buf, "|VI_FREE", sizeof(buf)); - if (vp->v_iflag & VI_OBJDIRTY) - strlcat(buf, "|VI_OBJDIRTY", sizeof(buf)); if (vp->v_iflag & VI_DOINGINACT) strlcat(buf, "|VI_DOINGINACT", sizeof(buf)); if (vp->v_iflag & VI_OWEINACT) strlcat(buf, "|VI_OWEINACT", sizeof(buf)); flags = vp->v_iflag & ~(VI_MOUNT | VI_AGE | VI_DOOMED | VI_FREE | - VI_OBJDIRTY | VI_DOINGINACT | VI_OWEINACT); + VI_DOINGINACT | VI_OWEINACT); if (flags != 0) { snprintf(buf2, sizeof(buf2), "|VI(0x%lx)", flags); strlcat(buf, buf2, sizeof(buf)); @@ -2761,6 +2750,7 @@ DB_SHOW_COMMAND(vnode, db_show_vnode) DB_SHOW_COMMAND(mount, db_show_mount) { struct mount *mp; + struct vfsopt *opt; struct statfs *sp; struct vnode *vp; char buf[512]; @@ -2866,6 +2856,18 @@ DB_SHOW_COMMAND(mount, db_show_mount) } db_printf(" mnt_kern_flag = %s\n", buf); + db_printf(" mnt_opt = "); + opt = TAILQ_FIRST(mp->mnt_opt); + if (opt != NULL) { + db_printf("%s", opt->name); + opt = TAILQ_NEXT(opt, link); + while (opt != NULL) { + db_printf(", %s", opt->name); + opt = TAILQ_NEXT(opt, link); + } + } + db_printf("\n"); + sp = &mp->mnt_stat; db_printf(" mnt_stat = { version=%u type=%u flags=0x%016jx " "bsize=%ju iosize=%ju blocks=%ju bfree=%ju bavail=%jd files=%ju " @@ -3177,7 +3179,8 @@ vfs_msync(struct mount *mp, int flags) MNT_ILOCK(mp); MNT_VNODE_FOREACH(vp, mp, mvp) { VI_LOCK(vp); - if ((vp->v_iflag & VI_OBJDIRTY) && + obj = vp->v_object; + if (obj != NULL && (obj->flags & OBJ_MIGHTBEDIRTY) != 0 && (flags == MNT_WAIT || VOP_ISLOCKED(vp) == 0)) { MNT_IUNLOCK(mp); if (!vget(vp, @@ -3520,6 +3523,11 @@ vaccess(enum vtype type, mode_t file_mode, uid_t file_uid, gid_t file_gid, accmode_t dac_granted; accmode_t priv_granted; + KASSERT((accmode & ~(VEXEC | VWRITE | VREAD | VADMIN | VAPPEND)) == 0, + ("invalid bit in accmode")); + KASSERT((accmode & VAPPEND) == 0 || (accmode & VWRITE), + ("VAPPEND without VWRITE")); + /* * Look for a normal, non-privileged way to access the file/directory * as requested. If it exists, go with that. diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 0a8ef463957e..f1e6ca893950 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1815,23 +1815,25 @@ unlinkat(struct thread *td, struct unlinkat_args *uap) if (flag & AT_REMOVEDIR) return (kern_rmdirat(td, fd, path, UIO_USERSPACE)); else - return (kern_unlinkat(td, fd, path, UIO_USERSPACE)); + return (kern_unlinkat(td, fd, path, UIO_USERSPACE, 0)); } int kern_unlink(struct thread *td, char *path, enum uio_seg pathseg) { - return (kern_unlinkat(td, AT_FDCWD, path, pathseg)); + return (kern_unlinkat(td, AT_FDCWD, path, pathseg, 0)); } int -kern_unlinkat(struct thread *td, int fd, char *path, enum uio_seg pathseg) +kern_unlinkat(struct thread *td, int fd, char *path, enum uio_seg pathseg, + ino_t oldinum) { struct mount *mp; struct vnode *vp; int error; struct nameidata nd; + struct stat sb; int vfslocked; restart: @@ -1842,9 +1844,13 @@ restart: return (error == EINVAL ? EPERM : error); vfslocked = NDHASGIANT(&nd); vp = nd.ni_vp; - if (vp->v_type == VDIR) + if (vp->v_type == VDIR && oldinum == 0) { error = EPERM; /* POSIX */ - else { + } else if (oldinum != 0 && + ((error = vn_stat(vp, &sb, td->td_ucred, NOCRED, td)) == 0) && + sb.st_ino != oldinum) { + error = EIDRM; /* Identifier removed */ + } else { /* * The root of a mounted filesystem cannot be deleted. * @@ -2116,8 +2122,7 @@ kern_accessat(struct thread *td, int fd, char *path, enum uio_seg pathseg, /* * Create and modify a temporary credential instead of one that - * is potentially shared. This could also mess up socket - * buffer accounting which can run in an interrupt context. + * is potentially shared. */ if (!(flags & AT_EACCESS)) { cred = td->td_ucred; @@ -4426,7 +4431,7 @@ fhopen(td, uap) } if (fmode & FREAD) accmode |= VREAD; - if (fmode & O_APPEND) + if ((fmode & O_APPEND) && (fmode & FWRITE)) accmode |= VAPPEND; #ifdef MAC error = mac_vnode_check_open(td->td_ucred, vp, accmode); diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 1b77352b1c6a..d0b713cb3108 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -212,7 +212,7 @@ restart: accmode |= VREAD; if (fmode & FEXEC) accmode |= VEXEC; - if (fmode & O_APPEND) + if ((fmode & O_APPEND) && (fmode & FWRITE)) accmode |= VAPPEND; #ifdef MAC error = mac_vnode_check_open(cred, vp, accmode); @@ -312,6 +312,9 @@ static int sequential_heuristic(struct uio *uio, struct file *fp) { + if (atomic_load_acq_int(&(fp->f_flag)) & FRDAHEAD) + return (fp->f_seqcount << IO_SEQSHIFT); + /* * Offset 0 is handled specially. open() sets f_seqcount to 1 so * that the first I/O is normally considered to be slightly diff --git a/sys/libkern/inet_aton.c b/sys/libkern/inet_aton.c new file mode 100644 index 000000000000..a4625cb4fd1a --- /dev/null +++ b/sys/libkern/inet_aton.c @@ -0,0 +1,136 @@ +/*- + * Copyright (c) 2001 Charles Mott + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +int +inet_aton(const char *cp, struct in_addr *addr) +{ + u_long parts[4]; + in_addr_t val; + const char *c; + char *endptr; + int gotend, n; + + c = (const char *)cp; + n = 0; + + /* + * Run through the string, grabbing numbers until + * the end of the string, or some error + */ + gotend = 0; + while (!gotend) { + unsigned long l; + + l = strtoul(c, &endptr, 0); + + if (l == ULONG_MAX || (l == 0 && endptr == c)) + return (0); + + val = (in_addr_t)l; + + /* + * If the whole string is invalid, endptr will equal + * c.. this way we can make sure someone hasn't + * gone '.12' or something which would get past + * the next check. + */ + if (endptr == c) + return (0); + parts[n] = val; + c = endptr; + + /* Check the next character past the previous number's end */ + switch (*c) { + case '.' : + + /* Make sure we only do 3 dots .. */ + if (n == 3) /* Whoops. Quit. */ + return (0); + n++; + c++; + break; + + case '\0': + gotend = 1; + break; + + default: + if (isspace((unsigned char)*c)) { + gotend = 1; + break; + } else { + + /* Invalid character, then fail. */ + return (0); + } + } + + } + + /* Concoct the address according to the number of parts specified. */ + switch (n) { + case 0: /* a -- 32 bits */ + + /* + * Nothing is necessary here. Overflow checking was + * already done in strtoul(). + */ + break; + case 1: /* a.b -- 8.24 bits */ + if (val > 0xffffff || parts[0] > 0xff) + return (0); + val |= parts[0] << 24; + break; + + case 2: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffff || parts[0] > 0xff || parts[1] > 0xff) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 3: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xff || parts[0] > 0xff || parts[1] > 0xff || + parts[2] > 0xff) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + } + + if (addr != NULL) + addr->s_addr = htonl(val); + return (1); +} + diff --git a/sys/mips/adm5120/adm5120_machdep.c b/sys/mips/adm5120/adm5120_machdep.c index ef188d301d68..90a6b907996c 100644 --- a/sys/mips/adm5120/adm5120_machdep.c +++ b/sys/mips/adm5120/adm5120_machdep.c @@ -73,6 +73,12 @@ __FBSDID("$FreeBSD$"); extern int *edata; extern int *end; +void +platform_cpu_init() +{ + /* Nothing special */ +} + static void mips_init(void) { @@ -88,7 +94,7 @@ mips_init(void) } /* phys_avail regions are in bytes */ - phys_avail[0] = MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); + phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); physmem = realmem; @@ -99,8 +105,10 @@ mips_init(void) pmap_bootstrap(); mips_proc0_init(); mutex_init(); -#ifdef DDB kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); #endif } @@ -145,9 +153,14 @@ platform_start(__register_t a0 __unused, __register_t a1 __unused, uint64_t platform_counter_freq = 175 * 1000 * 1000; /* clear the BSS and SBSS segments */ - kernend = round_page((vm_offset_t)&end); + kernend = (vm_offset_t)&end; memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + mips_postboot_fixup(); + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + cninit(); mips_init(); mips_timer_init_params(platform_counter_freq, 0); diff --git a/sys/mips/adm5120/files.adm5120 b/sys/mips/adm5120/files.adm5120 index 489ea733ba25..c8b60ce88b5f 100644 --- a/sys/mips/adm5120/files.adm5120 +++ b/sys/mips/adm5120/files.adm5120 @@ -9,3 +9,5 @@ mips/adm5120/obio.c standard mips/adm5120/uart_bus_adm5120.c optional uart mips/adm5120/uart_cpu_adm5120.c optional uart mips/adm5120/uart_dev_adm5120.c optional uart +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard diff --git a/sys/mips/adm5120/if_admsw.c b/sys/mips/adm5120/if_admsw.c index fff8930c2c52..164e84008a28 100644 --- a/sys/mips/adm5120/if_admsw.c +++ b/sys/mips/adm5120/if_admsw.c @@ -128,7 +128,7 @@ static uint8_t vlan_matrix[SW_DEVS] = { /* ifnet entry points */ static void admsw_start(struct ifnet *); -static void admsw_watchdog(struct ifnet *); +static void admsw_watchdog(void *); static int admsw_ioctl(struct ifnet *, u_long, caddr_t); static void admsw_init(void *); static void admsw_stop(struct ifnet *, int); @@ -398,6 +398,7 @@ admsw_attach(device_t dev) device_printf(sc->sc_dev, "base Ethernet address %s\n", ether_sprintf(enaddr)); + callout_init(&sc->sc_watchdog, 1); rid = 0; if ((sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, @@ -536,8 +537,6 @@ admsw_attach(device_t dev) ifp->if_ioctl = admsw_ioctl; ifp->if_output = ether_output; ifp->if_start = admsw_start; - ifp->if_watchdog = admsw_watchdog; - ifp->if_timer = 0; ifp->if_init = admsw_init; ifp->if_mtu = ETHERMTU; ifp->if_baudrate = IF_Mbps(100); @@ -733,7 +732,7 @@ admsw_start(struct ifnet *ifp) BPF_MTAP(ifp, m0); /* Set a watchdog timer in case the chip flakes out. */ - sc->sc_ifnet[0]->if_timer = 5; + sc->sc_timer = 5; } } @@ -743,25 +742,30 @@ admsw_start(struct ifnet *ifp) * Watchdog timer handler. */ static void -admsw_watchdog(struct ifnet *ifp) +admsw_watchdog(void *arg) { - struct admsw_softc *sc = ifp->if_softc; + struct admsw_softc *sc = arg; + struct ifnet *ifp; int vlan; + callout_reset(&sc->sc_watchdog, hz, admsw_watchdog, sc); + if (sc->sc_timer == 0 || --sc->sc_timer > 0) + return; + /* Check if an interrupt was lost. */ if (sc->sc_txfree == ADMSW_NTXLDESC) { device_printf(sc->sc_dev, "watchdog false alarm\n"); return; } - if (sc->sc_ifnet[0]->if_timer != 0) + if (sc->sc_timer != 0) device_printf(sc->sc_dev, "watchdog timer is %d!\n", - sc->sc_ifnet[0]->if_timer); + sc->sc_timer); admsw_txintr(sc, 0); if (sc->sc_txfree == ADMSW_NTXLDESC) { device_printf(sc->sc_dev, "tx IRQ lost (queue empty)\n"); return; } - if (sc->sc_ifnet[0]->if_timer != 0) { + if (sc->sc_timer != 0) { device_printf(sc->sc_dev, "tx IRQ lost (timer recharged)\n"); return; } @@ -772,6 +776,8 @@ admsw_watchdog(struct ifnet *ifp) admsw_stop(sc->sc_ifnet[vlan], 0); admsw_init(sc); + ifp = sc->sc_ifnet[0]; + /* Try to get more packets going. */ admsw_start(ifp); } @@ -938,7 +944,7 @@ admsw_txintr(struct admsw_softc *sc, int prio) * cancel the watchdog timer. */ if (sc->sc_txfree == ADMSW_NTXLDESC) - ifp->if_timer = 0; + sc->sc_timer = 0; } @@ -1096,6 +1102,9 @@ admsw_init(void *xsc) ~(ADMSW_INTR_SHD | ADMSW_INTR_SLD | ADMSW_INTR_RHD | ADMSW_INTR_RLD | ADMSW_INTR_HDF | ADMSW_INTR_LDF)); + + callout_reset(&sc->sc_watchdog, hz, + admsw_watchdog, sc); } sc->ndevs++; } @@ -1137,11 +1146,14 @@ admsw_stop(struct ifnet *ifp, int disable) /* disable interrupts */ REG_WRITE(ADMSW_INT_MASK, INT_MASK); + + /* Cancel the watchdog timer. */ + sc->sc_timer = 0; + callout_stop(&sc->sc_watchdog); } - /* Mark the interface as down and cancel the watchdog timer. */ + /* Mark the interface as down. */ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - ifp->if_timer = 0; return; } diff --git a/sys/mips/adm5120/if_admswvar.h b/sys/mips/adm5120/if_admswvar.h index a94bb89f3a19..1304fac4dd02 100644 --- a/sys/mips/adm5120/if_admswvar.h +++ b/sys/mips/adm5120/if_admswvar.h @@ -132,7 +132,9 @@ struct admsw_softc { bus_dma_tag_t sc_bufs_dmat; /* bus DMA tag for buffers */ struct ifmedia sc_ifmedia[SW_DEVS]; int ndevs; /* number of IFF_RUNNING interfaces */ - struct ifnet *sc_ifnet[SW_DEVS]; + struct ifnet *sc_ifnet[SW_DEVS]; + struct callout sc_watchdog; + int sc_timer; /* Ethernet common data */ void *sc_ih; /* interrupt cookie */ struct resource *irq_res; diff --git a/sys/mips/adm5120/obio.c b/sys/mips/adm5120/obio.c index 03e098d42ba4..ad6cb6e2ea7d 100644 --- a/sys/mips/adm5120/obio.c +++ b/sys/mips/adm5120/obio.c @@ -120,6 +120,39 @@ static int obio_setup_intr(device_t, device_t, struct resource *, int, static int obio_teardown_intr(device_t, device_t, struct resource *, void *); + +static void +obio_mask_irq(void *source) +{ + int irq; + uint32_t irqmask; + uint32_t reg; + + irq = (int)source; + irqmask = 1 << irq; + + /* disable IRQ */ + reg = REG_READ(ICU_DISABLE_REG); + REG_WRITE(ICU_DISABLE_REG, (reg | irqmask)); +} + +static void +obio_unmask_irq(void *source) +{ + int irq; + uint32_t irqmask; + uint32_t reg; + + irq = (int)source; + irqmask = 1 << irq; + + /* disable IRQ */ + reg = REG_READ(ICU_DISABLE_REG); + REG_WRITE(ICU_DISABLE_REG, (reg & ~irqmask)); + +} + + static int obio_probe(device_t dev) { @@ -269,7 +302,7 @@ obio_activate_resource(device_t bus, device_t child, int type, int rid, vaddr = (void *)MIPS_PHYS_TO_KSEG1((intptr_t)rman_get_start(r)); rman_set_virtual(r, vaddr); - rman_set_bustag(r, MIPS_BUS_SPACE_MEM); + rman_set_bustag(r, mips_bus_space_generic); rman_set_bushandle(r, (bus_space_handle_t)vaddr); } @@ -321,7 +354,7 @@ obio_setup_intr(device_t dev, device_t child, struct resource *ires, event = sc->sc_eventstab[irq]; if (event == NULL) { error = intr_event_create(&event, (void *)irq, 0, irq, - (mask_fn)mips_mask_irq, (mask_fn)mips_unmask_irq, + obio_mask_irq, obio_unmask_irq, NULL, NULL, "obio intr%d:", irq); sc->sc_eventstab[irq] = event; @@ -343,6 +376,8 @@ obio_setup_intr(device_t dev, device_t child, struct resource *ires, /* enable */ REG_WRITE(ICU_ENABLE_REG, irqmask); + obio_unmask_irq((void*)irq); + return (0); } @@ -351,7 +386,7 @@ obio_teardown_intr(device_t dev, device_t child, struct resource *ires, void *cookie) { struct obio_softc *sc = device_get_softc(dev); - int irq, result; + int irq, result, priority; uint32_t irqmask; irq = rman_get_start(ires); @@ -361,10 +396,18 @@ obio_teardown_intr(device_t dev, device_t child, struct resource *ires, if (sc->sc_eventstab[irq] == NULL) panic("Trying to teardown unoccupied IRQ"); - irqmask = 1 << irq; /* only used as a mask from here on */ + irqmask = (1 << irq); + priority = irq_priorities[irq]; - /* disable this irq in HW */ - REG_WRITE(ICU_DISABLE_REG, irqmask); + if (priority == INTR_FIQ) + REG_WRITE(ICU_MODE_REG, REG_READ(ICU_MODE_REG) & ~irqmask); + else + REG_WRITE(ICU_MODE_REG, REG_READ(ICU_MODE_REG) | irqmask); + + /* disable */ + irqmask = REG_READ(ICU_ENABLE_REG); + irqmask &= ~(1 << irq); + REG_WRITE(ICU_ENABLE_REG, irqmask); result = intr_event_remove_handler(cookie); if (!result) { diff --git a/sys/mips/adm5120/uart_cpu_adm5120.c b/sys/mips/adm5120/uart_cpu_adm5120.c index 59bed5af2667..935d109fe16f 100644 --- a/sys/mips/adm5120/uart_cpu_adm5120.c +++ b/sys/mips/adm5120/uart_cpu_adm5120.c @@ -67,7 +67,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) di->ops = uart_getops(&uart_adm5120_uart_class); di->bas.chan = 0; - di->bas.bst = 0; + di->bas.bst = mips_bus_space_generic; di->bas.regshft = 0; di->bas.rclk = 0; di->baudrate = 115200; @@ -76,7 +76,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) di->parity = UART_PARITY_NONE; uart_bus_space_io = 0; - uart_bus_space_mem = MIPS_PHYS_TO_KSEG1(ADM5120_BASE_UART0); + uart_bus_space_mem = mips_bus_space_generic; di->bas.bsh = MIPS_PHYS_TO_KSEG1(ADM5120_BASE_UART0); return (0); diff --git a/sys/mips/alchemy/alchemy_machdep.c b/sys/mips/alchemy/alchemy_machdep.c new file mode 100644 index 000000000000..a94d995eed00 --- /dev/null +++ b/sys/mips/alchemy/alchemy_machdep.c @@ -0,0 +1,171 @@ +/*- + * Copyright (C) 2007 by Oleksandr Tymoshenko. 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 +__FBSDID("$FreeBSD$"); + +#include "opt_ddb.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern int *edata; +extern int *end; + +void +platform_cpu_init() +{ + /* Nothing special */ +} + +static void +mips_init(void) +{ + int i; + + printf("entry: mips_init()\n"); + + bootverbose = 1; + realmem = btoc(16 << 20); + + for (i = 0; i < 10; i++) { + phys_avail[i] = 0; + } + + /* phys_avail regions are in bytes */ + phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); + phys_avail[1] = ctob(realmem); + + physmem = realmem; + + init_param1(); + init_param2(physmem); + mips_cpu_init(); + pmap_bootstrap(); + mips_proc0_init(); + mutex_init(); + + kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); +#endif +} + +void +platform_halt(void) +{ + +} + + +void +platform_identify(void) +{ + +} + +void +platform_reset(void) +{ + + __asm __volatile("li $25, 0xbfc00000"); + __asm __volatile("j $25"); +} + +void +platform_trap_enter(void) +{ + +} + +void +platform_trap_exit(void) +{ + +} + +void +platform_start(__register_t a0 __unused, __register_t a1 __unused, + __register_t a2 __unused, __register_t a3 __unused) +{ + vm_offset_t kernend; + uint64_t platform_counter_freq = 175 * 1000 * 1000; + + /* clear the BSS and SBSS segments */ + kernend = (vm_offset_t)&end; + memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + + mips_postboot_fixup(); + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + + cninit(); + mips_init(); + /* Set counter_freq for tick_init_params() */ + platform_counter_freq = 175 * 1000 * 1000; + + mips_timer_init_params(platform_counter_freq, 0); +} diff --git a/sys/mips/alchemy/aureg.h b/sys/mips/alchemy/aureg.h new file mode 100644 index 000000000000..dfa21032763a --- /dev/null +++ b/sys/mips/alchemy/aureg.h @@ -0,0 +1,373 @@ +/* $NetBSD: aureg.h,v 1.18 2006/10/02 06:44:00 gdamore Exp $ */ + +/* + * Copyright 2002 Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Simon Burge for Wasabi Systems, Inc. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC + * 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 _MIPS_ALCHEMY_AUREG_H +#define _MIPS_ALCHEMY_AUREG_H + +/************************************************************************/ +/******************** AC97 Controller registers *********************/ +/************************************************************************/ +#define AC97_BASE 0x10000000 + +/************************************************************************/ +/*********************** USB Host registers *************************/ +/************************************************************************/ +#define USBH_BASE 0x10100000 +#define AU1550_USBH_BASE 0x14020000 + +#define USBH_ENABLE 0x7fffc +#define USBH_SIZE 0x100000 + +#define AU1550_USBH_ENABLE 0x7ffc +#define AU1550_USBH_SIZE 0x60000 + +/************************************************************************/ +/********************** USB Device registers ************************/ +/************************************************************************/ +#define USBD_BASE 0x10200000 + +/************************************************************************/ +/************************* IRDA registers ***************************/ +/************************************************************************/ +#define IRDA_BASE 0x10300000 + +/************************************************************************/ +/****************** Interrupt Controller registers ******************/ +/************************************************************************/ + +#define IC0_BASE 0x10400000 +#define IC1_BASE 0x11800000 + +/* + * The *_READ registers read the current value of the register + * The *_SET registers set to 1 all bits that are written 1 + * The *_CLEAR registers clear to zero all bits that are written as 1 + */ +#define IC_CONFIG0_READ 0x40 /* See table below */ +#define IC_CONFIG0_SET 0x40 +#define IC_CONFIG0_CLEAR 0x44 + +#define IC_CONFIG1_READ 0x48 /* See table below */ +#define IC_CONFIG1_SET 0x48 +#define IC_CONFIG1_CLEAR 0x4c + +#define IC_CONFIG2_READ 0x50 /* See table below */ +#define IC_CONFIG2_SET 0x50 +#define IC_CONFIG2_CLEAR 0x54 + +#define IC_REQUEST0_INT 0x54 /* Show active interrupts on request 0 */ + +#define IC_SOURCE_READ 0x58 /* Interrupt source */ +#define IC_SOURCE_SET 0x58 /* 0 - test bit used as source */ +#define IC_SOURCE_CLEAR 0x5c /* 1 - peripheral/GPIO used as source */ + +#define IC_REQUEST1_INT 0x5c /* Show active interrupts on request 1 */ + +#define IC_ASSIGN_REQUEST_READ 0x60 /* Assigns the interrupt to one of the */ +#define IC_ASSIGN_REQUEST_SET 0x60 /* CPU requests (0 - assign to request 1, */ +#define IC_ASSIGN_REQUEST_CLEAR 0x64 /* 1 - assign to request 0) */ + +#define IC_WAKEUP_READ 0x68 /* Controls whether the interrupt can */ +#define IC_WAKEUP_SET 0x68 /* cause a wakeup from IDLE */ +#define IC_WAKEUP_CLEAR 0x6c + +#define IC_MASK_READ 0x70 /* Enables/Disables the interrupt */ +#define IC_MASK_SET 0x70 +#define IC_MASK_CLEAR 0x74 + +#define IC_RISING_EDGE 0x78 /* Check/clear rising edge */ + +#define IC_FALLING_EDGE 0x7c /* Check/clear falling edge */ + +#define IC_TEST_BIT 0x80 /* single bit source select */ + +/* + * Interrupt Configuration Register Functions + * + * Cfg2[n] Cfg1[n] Cfg0[n] Function + * 0 0 0 Interrupts Disabled + * 0 0 1 Rising Edge Enabled + * 0 1 0 Falling Edge Enabled + * 0 1 1 Rising and Falling Edge Enabled + * 1 0 0 Interrupts Disabled + * 1 0 1 High Level Enabled + * 1 1 0 Low Level Enabled + * 1 1 1 Both Levels and Both Edges Enabled + */ + +/************************************************************************/ +/************* Programable Serial Controller registers **************/ +/************************************************************************/ + +#define PSC0_BASE 0x11A00000 +#define PSC1_BASE 0x11B00000 +#define PSC2_BASE 0x10A00000 +#define PSC3_BASE 0x10B00000 + + +/************************************************************************/ +/********************** Ethernet MAC registers **********************/ +/************************************************************************/ + +#define MAC0_BASE 0x10500000 +#define MAC1_BASE 0x10510000 +#define MACx_SIZE 0x28 + +#define AU1500_MAC0_BASE 0x11500000 /* Grr, different on Au1500 */ +#define AU1500_MAC1_BASE 0x11510000 /* Grr, different on Au1500 */ + +#define MAC0_ENABLE 0x10520000 +#define MAC1_ENABLE 0x10520004 +#define MACENx_SIZE 0x04 + +#define AU1500_MAC0_ENABLE 0x11520000 /* Grr, different on Au1500 */ +#define AU1500_MAC1_ENABLE 0x11520004 /* Grr, different on Au1500 */ + +#define MAC0_DMA_BASE 0x14004000 +#define MAC1_DMA_BASE 0x14004200 +#define MACx_DMA_SIZE 0x140 + +/************************************************************************/ +/********************** Static Bus registers ************************/ +/************************************************************************/ +#define STATIC_BUS_BASE 0x14001000 + +/************************************************************************/ +/******************** Secure Digital registers **********************/ +/************************************************************************/ +#define SD0_BASE 0x10600000 +#define SD1_BASE 0x10680000 + +/************************************************************************/ +/************************* I^2S registers ***************************/ +/************************************************************************/ +#define I2S_BASE 0x11000000 + +/************************************************************************/ +/************************** UART registers **************************/ +/************************************************************************/ + +#define UART0_BASE 0x11100000 +#define UART1_BASE 0x11200000 +#define UART2_BASE 0x11300000 +#define UART3_BASE 0x11400000 + +/************************************************************************/ +/************************* SSI registers ****************************/ +/************************************************************************/ +#define SSI0_BASE 0x11600000 +#define SSI1_BASE 0x11680000 + +/************************************************************************/ +/************************ GPIO2 registers ***************************/ +/************************************************************************/ +#define GPIO_BASE 0x11900100 + +/************************************************************************/ +/************************ GPIO2 registers ***************************/ +/************************************************************************/ +#define GPIO2_BASE 0x11700000 + +/************************************************************************/ +/************************* PCI registers ****************************/ +/************************************************************************/ +#define PCI_BASE 0x14005000 +#define PCI_HEADER 0x14005100 +#define PCI_MEM_BASE 0x400000000ULL +#define PCI_IO_BASE 0x500000000ULL +#define PCI_CONFIG_BASE 0x600000000ULL + +/************************************************************************/ +/*********************** PCMCIA registers ***************************/ +/************************************************************************/ +#define PCMCIA_BASE 0xF00000000ULL + +/************************************************************************/ +/****************** Programmable Counter registers ******************/ +/************************************************************************/ + +#define SYS_BASE 0x11900000 + +#define PC_BASE SYS_BASE + +#define PC_TRIM0 0x00 /* PC0 Divide (16 bits) */ +#define PC_COUNTER_WRITE0 0x04 /* set PC0 */ +#define PC_MATCH0_0 0x08 /* match counter & interrupt */ +#define PC_MATCH1_0 0x0c /* match counter & interrupt */ +#define PC_MATCH2_0 0x10 /* match counter & interrupt */ +#define PC_COUNTER_CONTROL 0x14 /* Programmable Counter Control */ +#define CC_E1S 0x00800000 /* Enable PC1 write status */ +#define CC_T1S 0x00100000 /* Trim PC1 write status */ +#define CC_M21 0x00080000 /* Match 2 of PC1 write status */ +#define CC_M11 0x00040000 /* Match 1 of PC1 write status */ +#define CC_M01 0x00020000 /* Match 0 of PC1 write status */ +#define CC_C1S 0x00010000 /* PC1 write status */ +#define CC_BP 0x00004000 /* Bypass OSC (use GPIO1) */ +#define CC_EN1 0x00002000 /* Enable PC1 */ +#define CC_BT1 0x00001000 /* Bypass Trim on PC1 */ +#define CC_EN0 0x00000800 /* Enable PC0 */ +#define CC_BT0 0x00000400 /* Bypass Trim on PC0 */ +#define CC_EO 0x00000100 /* Enable Oscillator */ +#define CC_E0S 0x00000080 /* Enable PC0 write status */ +#define CC_32S 0x00000020 /* 32.768kHz OSC status */ +#define CC_T0S 0x00000010 /* Trim PC0 write status */ +#define CC_M20 0x00000008 /* Match 2 of PC0 write status */ +#define CC_M10 0x00000004 /* Match 1 of PC0 write status */ +#define CC_M00 0x00000002 /* Match 0 of PC0 write status */ +#define CC_C0S 0x00000001 /* PC0 write status */ +#define PC_COUNTER_READ_0 0x40 /* get PC0 */ +#define PC_TRIM1 0x44 /* PC1 Divide (16 bits) */ +#define PC_COUNTER_WRITE1 0x48 /* set PC1 */ +#define PC_MATCH0_1 0x4c /* match counter & interrupt */ +#define PC_MATCH1_1 0x50 /* match counter & interrupt */ +#define PC_MATCH2_1 0x54 /* match counter & interrupt */ +#define PC_COUNTER_READ_1 0x58 /* get PC1 */ + +#define PC_SIZE 0x5c /* size of register set */ +#define PC_RATE 32768 /* counter rate is 32.768kHz */ + +/************************************************************************/ +/******************* Frequency Generator Registers ******************/ +/************************************************************************/ + +#define SYS_FREQCTRL0 (SYS_BASE + 0x20) +#define SFC_FRDIV2(f) (f<<22) /* 29:22. Freq Divider 2 */ +#define SFC_FE2 (1<<21) /* Freq generator output enable 2 */ +#define SFC_FS2 (1<<20) /* Freq generator source 2 */ +#define SFC_FRDIV1(f) (f<<12) /* 19:12. Freq Divider 1 */ +#define SFC_FE1 (1<<11) /* Freq generator output enable 1 */ +#define SFC_FS1 (1<<10) /* Freq generator source 1 */ +#define SFC_FRDIV0(f) (f<<2) /* 9:2. Freq Divider 0 */ +#define SFC_FE0 2 /* Freq generator output enable 0 */ +#define SFC_FS0 1 /* Freq generator source 0 */ + +#define SYS_FREQCTRL1 (SYS_BASE + 0x24) +#define SFC_FRDIV5(f) (f<<22) /* 29:22. Freq Divider 5 */ +#define SFC_FE5 (1<<21) /* Freq generator output enable 5 */ +#define SFC_FS5 (1<<20) /* Freq generator source 5 */ +#define SFC_FRDIV4(f) (f<<12) /* 19:12. Freq Divider 4 */ +#define SFC_FE4 (1<<11) /* Freq generator output enable 4 */ +#define SFC_FS4 (1<<10) /* Freq generator source 4 */ +#define SFC_FRDIV3(f) (f<<2) /* 9:2. Freq Divider 3 */ +#define SFC_FE3 2 /* Freq generator output enable 3 */ +#define SFC_FS3 1 /* Freq generator source 3 */ + +/************************************************************************/ +/****************** Clock Source Control Registers ******************/ +/************************************************************************/ + +#define SYS_CLKSRC (SYS_BASE + 0x28) +#define SCS_ME1(n) (n<<27) /* EXTCLK1 Clock Mux input select */ +#define SCS_ME0(n) (n<<22) /* EXTCLK0 Clock Mux input select */ +#define SCS_MPC(n) (n<<17) /* PCI clock mux input select */ +#define SCS_MUH(n) (n<<12) /* USB Host clock mux input select */ +#define SCS_MUD(n) (n<<7) /* USB Device clock mux input select */ +#define SCS_MEx_AUX 0x1 /* Aux clock */ +#define SCS_MEx_FREQ0 0x2 /* FREQ0 */ +#define SCS_MEx_FREQ1 0x3 /* FREQ1 */ +#define SCS_MEx_FREQ2 0x4 /* FREQ2 */ +#define SCS_MEx_FREQ3 0x5 /* FREQ3 */ +#define SCS_MEx_FREQ4 0x6 /* FREQ4 */ +#define SCS_MEx_FREQ5 0x7 /* FREQ5 */ +#define SCS_DE1 (1<<26) /* EXTCLK1 clock divider select */ +#define SCS_CE1 (1<<25) /* EXTCLK1 clock select */ +#define SCS_DE0 (1<<21) /* EXTCLK0 clock divider select */ +#define SCS_CE0 (1<<20) /* EXTCLK0 clock select */ +#define SCS_DPC (1<<16) /* PCI clock divider select */ +#define SCS_CPC (1<<15) /* PCI clock select */ +#define SCS_DUH (1<<11) /* USB Host clock divider select */ +#define SCS_CUH (1<<10) /* USB Host clock select */ +#define SCS_DUD (1<<6) /* USB Device clock divider select */ +#define SCS_CUD (1<<5) /* USB Device clock select */ +/* + * Au1550 bits, needed for PSCs. Note that some bits collide with + * earlier parts. On Au1550, USB clocks (both device and host) are + * shared with PSC2, and must be configured for 48MHz. DBAU1550 YAMON + * does this by default. Also, EXTCLK0 is shared with PSC3. DBAU1550 + * YAMON does not configure any clocks besides PSC2. + */ +#define SCS_MP3(n) (n<<22) /* psc3_intclock mux */ +#define SCS_DP3 (1<<21) /* psc3_intclock divider */ +#define SCS_CP3 (1<<20) /* psc3_intclock select */ +#define SCS_MP1(n) (n<<12) /* psc1_intclock mux */ +#define SCS_DP1 (1<<11) /* psc1_intclock divider */ +#define SCS_CP1 (1<<10) /* psc1_intclock select */ +#define SCS_MP0(n) (n<<7) /* psc0_intclock mux */ +#define SCS_DP0 (1<<6) /* psc0_intclock divider */ +#define SCS_CP0 (1<<5) /* psc0_intclock seelct */ +#define SCS_MP2(n) (n<<2) /* psc2_intclock mux */ +#define SCS_DP2 (1<<1) /* psc2_intclock divider */ +#define SCS_CP2 (1<<0) /* psc2_intclock select */ + +/************************************************************************/ +/*************************** PIN Function *****************************/ +/************************************************************************/ + +#define SYS_PINFUNC (SYS_BASE + 0x2c) +#define SPF_PSC3_MASK (7<<20) +#define SPF_PSC3_AC97 (0<<17) /* select AC97/SPI */ +#define SPF_PSC3_I2S (1<<17) /* select I2S */ +#define SPF_PSC3_SMBUS (3<<17) /* select SMbus */ +#define SPF_PSC3_GPIO (7<<17) /* select gpio215:211 */ +#define SPF_PSC2_MASK (7<<17) +#define SPF_PSC2_AC97 (0<<17) /* select AC97/SPI */ +#define SPF_PSC2_I2S (1<<17) /* select I2S */ +#define SPF_PSC2_SMBUS (3<<17) /* select SMbus */ +#define SPF_PSC2_GPIO (7<<17) /* select gpio210:206*/ +#define SPF_CS (1<<16) /* extclk0 or 32kHz osc */ +#define SPF_USB (1<<15) /* host or device usb otg */ +#define SPF_U3T (1<<14) /* uart3 tx or gpio23 */ +#define SPF_U1R (1<<13) /* uart1 rx or gpio22 */ +#define SPF_U1T (1<<12) /* uart1 tx or gpio21 */ +#define SPF_EX1 (1<<10) /* gpio3 or extclk1 */ +#define SPF_EX0 (1<<9) /* gpio2 or extclk0/32kHz osc*/ +#define SPF_U3 (1<<7) /* gpio14:9 or uart3 */ +#define SPF_MBSa (1<<5) /* must be set */ +#define SPF_NI2 (1<<4) /* enet1 or gpio28:24 */ +#define SPF_U0 (1<<3) /* uart0 or gpio20 */ +#define SPF_MBSb (1<<2) /* must be set */ +#define SPF_S1 (1<<1) /* gpio17 or psc1_sync1 */ +#define SPF_S0 (1<<0) /* gpio16 or psc0_sync1 */ + +/************************************************************************/ +/*************************** PLL Control *****************************/ +/************************************************************************/ + +#define SYS_CPUPLL (SYS_BASE + 0x60) +#define SYS_AUXPLL (SYS_BASE + 0x64) + +#endif /* _MIPS_ALCHEMY_AUREG_H */ diff --git a/sys/mips/alchemy/files.alchemy b/sys/mips/alchemy/files.alchemy new file mode 100644 index 000000000000..240869cdcbb4 --- /dev/null +++ b/sys/mips/alchemy/files.alchemy @@ -0,0 +1,9 @@ +# $FreeBSD$ +# Alchmy on-board devices +# mips/alchemy/console.c standard +mips/alchemy/alchemy_machdep.c standard +mips/alchemy/obio.c standard +mips/alchemy/uart_bus_alchemy.c optional uart +mips/alchemy/uart_cpu_alchemy.c optional uart +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard diff --git a/sys/mips/alchemy/obio.c b/sys/mips/alchemy/obio.c new file mode 100644 index 000000000000..fb55813c5816 --- /dev/null +++ b/sys/mips/alchemy/obio.c @@ -0,0 +1,536 @@ +/* $NetBSD: obio.c,v 1.11 2003/07/15 00:25:05 lukem Exp $ */ + +/*- + * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Jason R. Thorpe for Wasabi Systems, Inc. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +/* MIPS HW interrupts of IRQ/FIQ respectively */ +#define ADM5120_INTR 0 +#define ADM5120_FAST_INTR 1 + +/* Interrupt levels */ +#define INTR_IRQ 0 +#define INTR_FIQ 1 + +int irq_priorities[NIRQS] = { + INTR_IRQ, /* flash */ + INTR_FIQ, /* uart0 */ + INTR_FIQ, /* uart1 */ + INTR_IRQ, /* ahci */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* admsw */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ + INTR_IRQ, /* unknown */ +}; + + +#define REG_READ(o) *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1(ADM5120_BASE_ICU + (o))) +#define REG_WRITE(o,v) (REG_READ(o)) = (v) + +static int obio_activate_resource(device_t, device_t, int, int, + struct resource *); +static device_t obio_add_child(device_t, int, const char *, int); +static struct resource * + obio_alloc_resource(device_t, device_t, int, int *, u_long, + u_long, u_long, u_int); +static int obio_attach(device_t); +static int obio_deactivate_resource(device_t, device_t, int, int, + struct resource *); +static struct resource_list * + obio_get_resource_list(device_t, device_t); +static void obio_hinted_child(device_t, const char *, int); +static int obio_intr(void *); +static int obio_probe(device_t); +static int obio_release_resource(device_t, device_t, int, int, + struct resource *); +static int obio_setup_intr(device_t, device_t, struct resource *, int, + driver_filter_t *, driver_intr_t *, void *, void **); +static int obio_teardown_intr(device_t, device_t, struct resource *, + void *); + +static void +obio_mask_irq(void *arg) +{ + /* XXX need to write */ +#if 0 + unsigned int irq = (unsigned int)arg; + int ip_bit, mask, mask_register; + + /* mask IRQ */ + mask_register = ICU_IRQ_MASK_REG(irq); + ip_bit = ICU_IP_BIT(irq); + + mask = ICU_REG_READ(mask_register); + ICU_REG_WRITE(mask_register, mask | ip_bit); +#endif +} + +static void +obio_unmask_irq(void *arg) +{ + /* XXX need to write */ +#if 0 + unsigned int irq = (unsigned int)arg; + int ip_bit, mask, mask_register; + + /* unmask IRQ */ + mask_register = ICU_IRQ_MASK_REG(irq); + ip_bit = ICU_IP_BIT(irq); + + mask = ICU_REG_READ(mask_register); + ICU_REG_WRITE(mask_register, mask & ~ip_bit); +#endif +} + +static int +obio_probe(device_t dev) +{ + + return (0); +} + +static int +obio_attach(device_t dev) +{ + struct obio_softc *sc = device_get_softc(dev); + int rid; + + sc->oba_mem_rman.rm_type = RMAN_ARRAY; + sc->oba_mem_rman.rm_descr = "OBIO memeory"; + if (rman_init(&sc->oba_mem_rman) != 0 || + rman_manage_region(&sc->oba_mem_rman, OBIO_MEM_START, + OBIO_MEM_START + OBIO_MEM_SIZE) != 0) + panic("obio_attach: failed to set up I/O rman"); + + sc->oba_irq_rman.rm_type = RMAN_ARRAY; + sc->oba_irq_rman.rm_descr = "OBIO IRQ"; + + if (rman_init(&sc->oba_irq_rman) != 0 || + rman_manage_region(&sc->oba_irq_rman, 0, NIRQS-1) != 0) + panic("obio_attach: failed to set up IRQ rman"); + + /* Hook up our interrupt handler. */ + if ((sc->sc_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, + ADM5120_INTR, ADM5120_INTR, 1, + RF_SHAREABLE | RF_ACTIVE)) == NULL) { + device_printf(dev, "unable to allocate IRQ resource\n"); + return (ENXIO); + } + + if ((bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_MISC, obio_intr, NULL, + sc, &sc->sc_ih))) { + device_printf(dev, + "WARNING: unable to register interrupt handler\n"); + return (ENXIO); + } + + /* Hook up our FAST interrupt handler. */ + if ((sc->sc_fast_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, + ADM5120_FAST_INTR, ADM5120_FAST_INTR, 1, + RF_SHAREABLE | RF_ACTIVE)) == NULL) { + device_printf(dev, "unable to allocate IRQ resource\n"); + return (ENXIO); + } + + if ((bus_setup_intr(dev, sc->sc_fast_irq, INTR_TYPE_MISC, obio_intr, + NULL, sc, &sc->sc_fast_ih))) { + device_printf(dev, + "WARNING: unable to register interrupt handler\n"); + return (ENXIO); + } + + /* disable all interrupts */ + REG_WRITE(ICU_ENABLE_REG, ICU_INT_MASK); + + bus_generic_probe(dev); + bus_enumerate_hinted_children(dev); + bus_generic_attach(dev); + + return (0); +} + +static struct resource * +obio_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct obio_softc *sc = device_get_softc(bus); + struct obio_ivar *ivar = device_get_ivars(child); + struct resource *rv; + struct resource_list_entry *rle; + struct rman *rm; + int isdefault, needactivate, passthrough; + + isdefault = (start == 0UL && end == ~0UL && count == 1); + needactivate = flags & RF_ACTIVE; + passthrough = (device_get_parent(child) != bus); + rle = NULL; + + if (passthrough) + return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, + rid, start, end, count, flags)); + + /* + * If this is an allocation of the "default" range for a given RID, + * and we know what the resources for this device are (ie. they aren't + * maintained by a child bus), then work out the start/end values. + */ + if (isdefault) { + rle = resource_list_find(&ivar->resources, type, *rid); + if (rle == NULL) + return (NULL); + if (rle->res != NULL) { + panic("%s: resource entry is busy", __func__); + } + start = rle->start; + end = rle->end; + count = rle->count; + } + + switch (type) { + case SYS_RES_IRQ: + rm = &sc->oba_irq_rman; + break; + case SYS_RES_MEMORY: + rm = &sc->oba_mem_rman; + break; + default: + printf("%s: unknown resource type %d\n", __func__, type); + return (0); + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + if (rv == 0) { + printf("%s: could not reserve resource\n", __func__); + return (0); + } + + rman_set_rid(rv, *rid); + + if (needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + printf("%s: could not activate resource\n", __func__); + rman_release_resource(rv); + return (0); + } + } + + return (rv); +} + +static int +obio_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + /* + * If this is a memory resource, track the direct mapping + * in the uncached MIPS KSEG1 segment. + */ + if (type == SYS_RES_MEMORY) { + void *vaddr; + + vaddr = (void *)MIPS_PHYS_TO_KSEG1((intptr_t)rman_get_start(r)); + rman_set_virtual(r, vaddr); + rman_set_bustag(r, mips_bus_space_generic); + rman_set_bushandle(r, (bus_space_handle_t)vaddr); + } + + return (rman_activate_resource(r)); +} + +static int +obio_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + return (rman_deactivate_resource(r)); +} + +static int +obio_release_resource(device_t dev, device_t child, int type, + int rid, struct resource *r) +{ + struct resource_list *rl; + struct resource_list_entry *rle; + + rl = obio_get_resource_list(dev, child); + if (rl == NULL) + return (EINVAL); + rle = resource_list_find(rl, type, rid); + if (rle == NULL) + return (EINVAL); + rman_release_resource(r); + rle->res = NULL; + + return (0); +} + +static int +obio_setup_intr(device_t dev, device_t child, struct resource *ires, + int flags, driver_filter_t *filt, driver_intr_t *handler, + void *arg, void **cookiep) +{ + struct obio_softc *sc = device_get_softc(dev); + struct intr_event *event; + int irq, error, priority; + uint32_t irqmask; + + irq = rman_get_start(ires); + + if (irq >= NIRQS) + panic("%s: bad irq %d", __func__, irq); + + event = sc->sc_eventstab[irq]; + if (event == NULL) { + error = intr_event_create(&event, (void *)irq, 0, irq, + obio_mask_irq, obio_unmask_irq, + NULL, NULL, + "obio intr%d:", irq); + + sc->sc_eventstab[irq] = event; + } + else + panic("obio: Can't share IRQs"); + + intr_event_add_handler(event, device_get_nameunit(child), filt, + handler, arg, intr_priority(flags), flags, cookiep); + + irqmask = 1 << irq; + priority = irq_priorities[irq]; + + if (priority == INTR_FIQ) + REG_WRITE(ICU_MODE_REG, REG_READ(ICU_MODE_REG) | irqmask); + else + REG_WRITE(ICU_MODE_REG, REG_READ(ICU_MODE_REG) & ~irqmask); + + /* enable */ + REG_WRITE(ICU_ENABLE_REG, irqmask); + + return (0); +} + +static int +obio_teardown_intr(device_t dev, device_t child, struct resource *ires, + void *cookie) +{ + struct obio_softc *sc = device_get_softc(dev); + int irq, result; + uint32_t irqmask; + + irq = rman_get_start(ires); + if (irq >= NIRQS) + panic("%s: bad irq %d", __func__, irq); + + if (sc->sc_eventstab[irq] == NULL) + panic("Trying to teardown unoccupied IRQ"); + + irqmask = 1 << irq; /* only used as a mask from here on */ + + /* disable this irq in HW */ + REG_WRITE(ICU_DISABLE_REG, irqmask); + + result = intr_event_remove_handler(cookie); + if (!result) { + sc->sc_eventstab[irq] = NULL; + } + + return (result); +} + +static int +obio_intr(void *arg) +{ + struct obio_softc *sc = arg; + struct intr_event *event; + uint32_t irqstat; + int irq; + + irqstat = REG_READ(ICU_FIQ_STATUS_REG); + irqstat |= REG_READ(ICU_STATUS_REG); + + irq = 0; + while (irqstat != 0) { + if ((irqstat & 1) == 1) { + event = sc->sc_eventstab[irq]; + if (!event || TAILQ_EMPTY(&event->ie_handlers)) + continue; + + /* TODO: pass frame as an argument*/ + /* TODO: log stray interrupt */ + intr_event_handle(event, NULL); + } + + irq++; + irqstat >>= 1; + } + + return (FILTER_HANDLED); +} + +static void +obio_hinted_child(device_t bus, const char *dname, int dunit) +{ + device_t child; + long maddr; + int msize; + int irq; + int result; + + child = BUS_ADD_CHILD(bus, 0, dname, dunit); + + /* + * Set hard-wired resources for hinted child using + * specific RIDs. + */ + resource_long_value(dname, dunit, "maddr", &maddr); + resource_int_value(dname, dunit, "msize", &msize); + + + result = bus_set_resource(child, SYS_RES_MEMORY, 0, + maddr, msize); + if (result != 0) + device_printf(bus, "warning: bus_set_resource() failed\n"); + + if (resource_int_value(dname, dunit, "irq", &irq) == 0) { + result = bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1); + if (result != 0) + device_printf(bus, + "warning: bus_set_resource() failed\n"); + } +} + +static device_t +obio_add_child(device_t bus, int order, const char *name, int unit) +{ + device_t child; + struct obio_ivar *ivar; + + ivar = malloc(sizeof(struct obio_ivar), M_DEVBUF, M_WAITOK | M_ZERO); + if (ivar == NULL) { + printf("Failed to allocate ivar\n"); + return (0); + } + resource_list_init(&ivar->resources); + + child = device_add_child_ordered(bus, order, name, unit); + if (child == NULL) { + printf("Can't add child %s%d ordered\n", name, unit); + return (0); + } + + device_set_ivars(child, ivar); + + return (child); +} + +/* + * Helper routine for bus_generic_rl_get_resource/bus_generic_rl_set_resource + * Provides pointer to resource_list for these routines + */ +static struct resource_list * +obio_get_resource_list(device_t dev, device_t child) +{ + struct obio_ivar *ivar; + + ivar = device_get_ivars(child); + return (&(ivar->resources)); +} + +static device_method_t obio_methods[] = { + DEVMETHOD(bus_activate_resource, obio_activate_resource), + DEVMETHOD(bus_add_child, obio_add_child), + DEVMETHOD(bus_alloc_resource, obio_alloc_resource), + DEVMETHOD(bus_deactivate_resource, obio_deactivate_resource), + DEVMETHOD(bus_get_resource_list, obio_get_resource_list), + DEVMETHOD(bus_hinted_child, obio_hinted_child), + DEVMETHOD(bus_release_resource, obio_release_resource), + DEVMETHOD(bus_setup_intr, obio_setup_intr), + DEVMETHOD(bus_teardown_intr, obio_teardown_intr), + DEVMETHOD(device_attach, obio_attach), + DEVMETHOD(device_probe, obio_probe), + DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), + DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), + + {0, 0}, +}; + +static driver_t obio_driver = { + "obio", + obio_methods, + sizeof(struct obio_softc), +}; +static devclass_t obio_devclass; + +DRIVER_MODULE(obio, nexus, obio_driver, obio_devclass, 0, 0); diff --git a/sys/mips/alchemy/std.alchemy b/sys/mips/alchemy/std.alchemy new file mode 100644 index 000000000000..a955b6765c4d --- /dev/null +++ b/sys/mips/alchemy/std.alchemy @@ -0,0 +1,8 @@ +# $FreeBSD$ +# Standard include file for Alchemy Au1xxx CPUs: +# Au1000, Au1200, Au1250, Au1500 and Au1550 + +files "../alchemy/files.alchemy" + +cpu CPU_MIPS4KC +options ISA_MIPS32 diff --git a/sys/mips/sentry5/siba_mips.c b/sys/mips/alchemy/uart_bus_alchemy.c similarity index 50% rename from sys/mips/sentry5/siba_mips.c rename to sys/mips/alchemy/uart_bus_alchemy.c index 676da834df64..5c2315b8b7ce 100644 --- a/sys/mips/sentry5/siba_mips.c +++ b/sys/mips/alchemy/uart_bus_alchemy.c @@ -21,14 +21,14 @@ * 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. + * $Id$ + */ +/* + * Skeleton of this file was based on respective code for ARM + * code written by Olivier Houchard. */ -/* - * Child driver for MIPS 3302 core. - * Interrupt controller registers live here. Interrupts may not be routed - * to the MIPS core if they are masked out. - */ +#include "opt_uart.h" #include __FBSDID("$FreeBSD$"); @@ -36,78 +36,52 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include -#include -#include - #include +#include +#include -#include -#include -#include +#include -static int siba_mips_attach(device_t); -static int siba_mips_probe(device_t); +#include +#include +#include -static int -siba_mips_probe(device_t dev) -{ +#include - if (siba_get_vendor(dev) == SIBA_VID_BROADCOM && - siba_get_device(dev) == SIBA_DEVID_MIPS_3302) { - device_set_desc(dev, "MIPS 3302 processor"); - return (BUS_PROBE_DEFAULT); - } +#include "uart_if.h" - return (ENXIO); -} +static int uart_alchemy_probe(device_t dev); -struct siba_mips_softc { - void *notused; -}; - -static int -siba_mips_attach(device_t dev) -{ - //struct siba_mips_softc *sc = device_get_softc(dev); - struct resource *mem; - int rid; - - /* - * Allocate the resources which the parent bus has already - * determined for us. - * TODO: interrupt routing - */ -#define MIPS_MEM_RID 0x20 - rid = MIPS_MEM_RID; - mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, - RF_ACTIVE); - if (mem == NULL) { - device_printf(dev, "unable to allocate memory\n"); - return (ENXIO); - } -#if 0 - device_printf(dev, "start %08lx size %04lx\n", - rman_get_start(mem), rman_get_size(mem)); -#endif - - return (0); -} - -static device_method_t siba_mips_methods[] = { +static device_method_t uart_alchemy_methods[] = { /* Device interface */ - DEVMETHOD(device_attach, siba_mips_attach), - DEVMETHOD(device_probe, siba_mips_probe), - - {0, 0}, + DEVMETHOD(device_probe, uart_alchemy_probe), + DEVMETHOD(device_attach, uart_bus_attach), + DEVMETHOD(device_detach, uart_bus_detach), + { 0, 0 } }; -static driver_t siba_mips_driver = { - "siba_mips", - siba_mips_methods, - sizeof(struct siba_softc), +static driver_t uart_alchemy_driver = { + uart_driver_name, + uart_alchemy_methods, + sizeof(struct uart_softc), }; -static devclass_t siba_mips_devclass; -DRIVER_MODULE(siba_mips, siba, siba_mips_driver, siba_mips_devclass, 0, 0); +extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs; + +static int +uart_alchemy_probe(device_t dev) +{ + struct uart_softc *sc; + + sc = device_get_softc(dev); + sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs); + sc->sc_class = &uart_ns8250_class; + bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); + + return (uart_bus_probe(dev, 0, 0, 0, 0)); +} + +DRIVER_MODULE(uart, obio, uart_alchemy_driver, uart_devclass, 0, 0); diff --git a/sys/mips/alchemy/uart_cpu_alchemy.c b/sys/mips/alchemy/uart_cpu_alchemy.c new file mode 100644 index 000000000000..c995130ccd2c --- /dev/null +++ b/sys/mips/alchemy/uart_cpu_alchemy.c @@ -0,0 +1,79 @@ +/*- + * Copyright (c) 2006 Wojciech A. Koszek + * 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. + * + * $Id$ + */ +/* + * Skeleton of this file was based on respective code for ARM + * code written by Olivier Houchard. + */ + +#include "opt_uart.h" + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +#include +#include + +#include + +bus_space_tag_t uart_bus_space_io; +bus_space_tag_t uart_bus_space_mem; + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + +int +uart_cpu_getdev(int devtype, struct uart_devinfo *di) +{ + + di->ops = uart_getops(&uart_ns8250_class); + di->bas.chan = 0; + di->bas.bst = mips_bus_space_generic; + di->bas.regshft = 0; + di->bas.rclk = 0; + di->baudrate = 115200; + di->databits = 8; + di->stopbits = 1; + di->parity = UART_PARITY_NONE; + + uart_bus_space_io = 0; + uart_bus_space_mem = mips_bus_space_generic; + di->bas.bsh = MIPS_PHYS_TO_KSEG1(UART0_BASE); + + return (0); +} diff --git a/sys/mips/atheros/apb.c b/sys/mips/atheros/apb.c new file mode 100644 index 000000000000..d71b24210e0d --- /dev/null +++ b/sys/mips/atheros/apb.c @@ -0,0 +1,462 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#undef APB_DEBUG +#ifdef APB_DEBUG +#define dprintf printf +#else +#define dprintf(x, arg...) +#endif /* APB_DEBUG */ + +static int apb_activate_resource(device_t, device_t, int, int, + struct resource *); +static device_t apb_add_child(device_t, int, const char *, int); +static struct resource * + apb_alloc_resource(device_t, device_t, int, int *, u_long, + u_long, u_long, u_int); +static int apb_attach(device_t); +static int apb_deactivate_resource(device_t, device_t, int, int, + struct resource *); +static struct resource_list * + apb_get_resource_list(device_t, device_t); +static void apb_hinted_child(device_t, const char *, int); +static int apb_intr(void *); +static int apb_probe(device_t); +static int apb_release_resource(device_t, device_t, int, int, + struct resource *); +static int apb_setup_intr(device_t, device_t, struct resource *, int, + driver_filter_t *, driver_intr_t *, void *, void **); +static int apb_teardown_intr(device_t, device_t, struct resource *, + void *); + +static void +apb_mask_irq(void *source) +{ + unsigned int irq = (unsigned int)source; + uint32_t reg; + + reg = ATH_READ_REG(AR71XX_MISC_INTR_MASK); + ATH_WRITE_REG(AR71XX_MISC_INTR_MASK, reg & ~(1 << irq)); + +} + +static void +apb_unmask_irq(void *source) +{ + uint32_t reg; + unsigned int irq = (unsigned int)source; + + reg = ATH_READ_REG(AR71XX_MISC_INTR_MASK); + ATH_WRITE_REG(AR71XX_MISC_INTR_MASK, reg | (1 << irq)); +} + +static int +apb_probe(device_t dev) +{ + + return (0); +} + +static int +apb_attach(device_t dev) +{ + struct apb_softc *sc = device_get_softc(dev); + int rid = 0; + + device_set_desc(dev, "APB Bus bridge"); + + sc->apb_mem_rman.rm_type = RMAN_ARRAY; + sc->apb_mem_rman.rm_descr = "APB memory window"; + + if (rman_init(&sc->apb_mem_rman) != 0 || + rman_manage_region(&sc->apb_mem_rman, + AR71XX_APB_BASE, + AR71XX_APB_BASE + AR71XX_APB_SIZE - 1) != 0) + panic("apb_attach: failed to set up memory rman"); + + sc->apb_irq_rman.rm_type = RMAN_ARRAY; + sc->apb_irq_rman.rm_descr = "APB IRQ"; + + if (rman_init(&sc->apb_irq_rman) != 0 || + rman_manage_region(&sc->apb_irq_rman, + APB_IRQ_BASE, APB_IRQ_END) != 0) + panic("apb_attach: failed to set up IRQ rman"); + + if ((sc->sc_misc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_SHAREABLE | RF_ACTIVE)) == NULL) { + device_printf(dev, "unable to allocate IRQ resource\n"); + return (ENXIO); + } + + if ((bus_setup_intr(dev, sc->sc_misc_irq, INTR_TYPE_MISC, + apb_intr, NULL, sc, &sc->sc_misc_ih))) { + device_printf(dev, + "WARNING: unable to register interrupt handler\n"); + return (ENXIO); + } + + bus_generic_probe(dev); + bus_enumerate_hinted_children(dev); + bus_generic_attach(dev); + + return (0); +} + +static struct resource * +apb_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct apb_softc *sc = device_get_softc(bus); + struct apb_ivar *ivar = device_get_ivars(child); + struct resource *rv; + struct resource_list_entry *rle; + struct rman *rm; + int isdefault, needactivate, passthrough; + + isdefault = (start == 0UL && end == ~0UL); + needactivate = flags & RF_ACTIVE; + /* + * Pass memory requests to nexus device + */ + passthrough = (device_get_parent(child) != bus); + rle = NULL; + + dprintf("%s: entry (%p, %p, %d, %d, %p, %p, %ld, %d)\n", + __func__, bus, child, type, *rid, (void *)(intptr_t)start, + (void *)(intptr_t)end, count, flags); + + if (passthrough) + return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, + rid, start, end, count, flags)); + + /* + * If this is an allocation of the "default" range for a given RID, + * and we know what the resources for this device are (ie. they aren't + * maintained by a child bus), then work out the start/end values. + */ + + if (isdefault) { + rle = resource_list_find(&ivar->resources, type, *rid); + if (rle == NULL) { + return (NULL); + } + + if (rle->res != NULL) { + panic("%s: resource entry is busy", __func__); + } + start = rle->start; + end = rle->end; + count = rle->count; + + dprintf("%s: default resource (%p, %p, %ld)\n", + __func__, (void *)(intptr_t)start, + (void *)(intptr_t)end, count); + } + + switch (type) { + case SYS_RES_IRQ: + rm = &sc->apb_irq_rman; + break; + case SYS_RES_MEMORY: + rm = &sc->apb_mem_rman; + break; + default: + printf("%s: unknown resource type %d\n", __func__, type); + return (0); + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + if (rv == 0) { + printf("%s: could not reserve resource\n", __func__); + return (0); + } + + rman_set_rid(rv, *rid); + + if (needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + printf("%s: could not activate resource\n", __func__); + rman_release_resource(rv); + return (0); + } + } + + return (rv); +} + +static int +apb_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + /* XXX: should we mask/unmask IRQ here? */ + return (BUS_ACTIVATE_RESOURCE(device_get_parent(bus), child, + type, rid, r)); +} + +static int +apb_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + /* XXX: should we mask/unmask IRQ here? */ + return (BUS_DEACTIVATE_RESOURCE(device_get_parent(bus), child, + type, rid, r)); +} + +static int +apb_release_resource(device_t dev, device_t child, int type, + int rid, struct resource *r) +{ + struct resource_list *rl; + struct resource_list_entry *rle; + + rl = apb_get_resource_list(dev, child); + if (rl == NULL) + return (EINVAL); + rle = resource_list_find(rl, type, rid); + if (rle == NULL) + return (EINVAL); + rman_release_resource(r); + rle->res = NULL; + + return (0); +} + +static int +apb_setup_intr(device_t bus, device_t child, struct resource *ires, + int flags, driver_filter_t *filt, driver_intr_t *handler, + void *arg, void **cookiep) +{ + struct apb_softc *sc = device_get_softc(bus); + struct intr_event *event; + int irq, error; + + irq = rman_get_start(ires); + + if (irq > APB_IRQ_END) + panic("%s: bad irq %d", __func__, irq); + + event = sc->sc_eventstab[irq]; + if (event == NULL) { + error = intr_event_create(&event, (void *)irq, 0, irq, + apb_mask_irq, apb_unmask_irq, + NULL, NULL, + "apb intr%d:", irq); + + if (error == 0) { + sc->sc_eventstab[irq] = event; + sc->sc_intr_counter[irq] = + mips_intrcnt_create(event->ie_name); + } + else + return (error); + } + + intr_event_add_handler(event, device_get_nameunit(child), filt, + handler, arg, intr_priority(flags), flags, cookiep); + mips_intrcnt_setname(sc->sc_intr_counter[irq], event->ie_fullname); + + apb_unmask_irq((void*)irq); + + return (0); +} + +static int +apb_teardown_intr(device_t dev, device_t child, struct resource *ires, + void *cookie) +{ + struct apb_softc *sc = device_get_softc(dev); + int irq, result; + + irq = rman_get_start(ires); + if (irq > APB_IRQ_END) + panic("%s: bad irq %d", __func__, irq); + + if (sc->sc_eventstab[irq] == NULL) + panic("Trying to teardown unoccupied IRQ"); + + apb_mask_irq((void*)irq); + + result = intr_event_remove_handler(cookie); + if (!result) + sc->sc_eventstab[irq] = NULL; + + return (result); +} + +static int +apb_intr(void *arg) +{ + struct apb_softc *sc = arg; + struct intr_event *event; + uint32_t reg, irq; + + reg = ATH_READ_REG(AR71XX_MISC_INTR_STATUS); + for (irq = 0; irq < APB_NIRQS; irq++) { + if (reg & (1 << irq)) { + event = sc->sc_eventstab[irq]; + if (!event || TAILQ_EMPTY(&event->ie_handlers)) { + /* Ignore timer interrupts */ + if (irq != 0) + printf("Stray APB IRQ %d\n", irq); + continue; + } + + /* TODO: frame instead of NULL? */ + intr_event_handle(event, NULL); + mips_intrcnt_inc(sc->sc_intr_counter[irq]); + } + } + + return (FILTER_HANDLED); +} + +static void +apb_hinted_child(device_t bus, const char *dname, int dunit) +{ + device_t child; + long maddr; + int msize; + int irq; + int result; + int mem_hints_count; + + child = BUS_ADD_CHILD(bus, 0, dname, dunit); + + /* + * Set hard-wired resources for hinted child using + * specific RIDs. + */ + mem_hints_count = 0; + if (resource_long_value(dname, dunit, "maddr", &maddr) == 0) + mem_hints_count++; + if (resource_int_value(dname, dunit, "msize", &msize) == 0) + mem_hints_count++; + + /* check if all info for mem resource has been provided */ + if ((mem_hints_count > 0) && (mem_hints_count < 2)) { + printf("Either maddr or msize hint is missing for %s%d\n", + dname, dunit); + } else if (mem_hints_count) { + result = bus_set_resource(child, SYS_RES_MEMORY, 0, + maddr, msize); + if (result != 0) + device_printf(bus, + "warning: bus_set_resource() failed\n"); + } + + if (resource_int_value(dname, dunit, "irq", &irq) == 0) { + result = bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1); + if (result != 0) + device_printf(bus, + "warning: bus_set_resource() failed\n"); + } +} + +static device_t +apb_add_child(device_t bus, int order, const char *name, int unit) +{ + device_t child; + struct apb_ivar *ivar; + + ivar = malloc(sizeof(struct apb_ivar), M_DEVBUF, M_WAITOK | M_ZERO); + if (ivar == NULL) { + printf("Failed to allocate ivar\n"); + return (0); + } + resource_list_init(&ivar->resources); + + child = device_add_child_ordered(bus, order, name, unit); + if (child == NULL) { + printf("Can't add child %s%d ordered\n", name, unit); + return (0); + } + + device_set_ivars(child, ivar); + + return (child); +} + +/* + * Helper routine for bus_generic_rl_get_resource/bus_generic_rl_set_resource + * Provides pointer to resource_list for these routines + */ +static struct resource_list * +apb_get_resource_list(device_t dev, device_t child) +{ + struct apb_ivar *ivar; + + ivar = device_get_ivars(child); + return (&(ivar->resources)); +} + +static device_method_t apb_methods[] = { + DEVMETHOD(bus_activate_resource, apb_activate_resource), + DEVMETHOD(bus_add_child, apb_add_child), + DEVMETHOD(bus_alloc_resource, apb_alloc_resource), + DEVMETHOD(bus_deactivate_resource, apb_deactivate_resource), + DEVMETHOD(bus_get_resource_list, apb_get_resource_list), + DEVMETHOD(bus_hinted_child, apb_hinted_child), + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_release_resource, apb_release_resource), + DEVMETHOD(bus_setup_intr, apb_setup_intr), + DEVMETHOD(bus_teardown_intr, apb_teardown_intr), + DEVMETHOD(device_attach, apb_attach), + DEVMETHOD(device_probe, apb_probe), + DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), + DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), + + {0, 0}, +}; + +static driver_t apb_driver = { + "apb", + apb_methods, + sizeof(struct apb_softc), +}; +static devclass_t apb_devclass; + +DRIVER_MODULE(apb, nexus, apb_driver, apb_devclass, 0, 0); diff --git a/sys/mips/atheros/apbvar.h b/sys/mips/atheros/apbvar.h new file mode 100644 index 000000000000..2706034d2546 --- /dev/null +++ b/sys/mips/atheros/apbvar.h @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#ifndef _APBVAR_H_ +#define _APBVAR_H_ + +#define APB_IRQ_BASE 0 +#define APB_IRQ_END 7 +#define APB_NIRQS 8 + +struct apb_softc { + struct rman apb_irq_rman; + struct rman apb_mem_rman; + /* IRQ events structs for child devices */ + struct intr_event *sc_eventstab[APB_NIRQS]; + mips_intrcnt_t sc_intr_counter[APB_NIRQS]; + /* Resources and cookies for MIPS CPU INTs */ + struct resource *sc_misc_irq; + void *sc_misc_ih; +}; + +struct apb_ivar { + struct resource_list resources; +}; + +#endif /* _APBVAR_H_ */ diff --git a/sys/mips/atheros/ar71xx_bus_space_reversed.c b/sys/mips/atheros/ar71xx_bus_space_reversed.c new file mode 100644 index 000000000000..e03ade628f5d --- /dev/null +++ b/sys/mips/atheros/ar71xx_bus_space_reversed.c @@ -0,0 +1,181 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include +#include + +static bs_r_1_proto(reversed); +static bs_r_2_proto(reversed); +static bs_w_1_proto(reversed); +static bs_w_2_proto(reversed); + +/* + * Bus space that handles offsets in word for 1/2 bytes read/write access. + * Byte order of values is handled by device drivers itself. + */ +static struct bus_space bus_space_reversed = { + /* cookie */ + (void *) 0, + + /* mapping/unmapping */ + generic_bs_map, + generic_bs_unmap, + generic_bs_subregion, + + /* allocation/deallocation */ + NULL, + NULL, + + /* barrier */ + generic_bs_barrier, + + /* read (single) */ + reversed_bs_r_1, + reversed_bs_r_2, + generic_bs_r_4, + NULL, + + /* read multiple */ + generic_bs_rm_1, + generic_bs_rm_2, + generic_bs_rm_4, + NULL, + + /* read region */ + generic_bs_rr_1, + generic_bs_rr_2, + generic_bs_rr_4, + NULL, + + /* write (single) */ + reversed_bs_w_1, + reversed_bs_w_2, + generic_bs_w_4, + NULL, + + /* write multiple */ + generic_bs_wm_1, + generic_bs_wm_2, + generic_bs_wm_4, + NULL, + + /* write region */ + NULL, + generic_bs_wr_2, + generic_bs_wr_4, + NULL, + + /* set multiple */ + NULL, + NULL, + NULL, + NULL, + + /* set region */ + NULL, + generic_bs_sr_2, + generic_bs_sr_4, + NULL, + + /* copy */ + NULL, + generic_bs_c_2, + NULL, + NULL, + + /* read (single) stream */ + generic_bs_r_1, + generic_bs_r_2, + generic_bs_r_4, + NULL, + + /* read multiple stream */ + generic_bs_rm_1, + generic_bs_rm_2, + generic_bs_rm_4, + NULL, + + /* read region stream */ + generic_bs_rr_1, + generic_bs_rr_2, + generic_bs_rr_4, + NULL, + + /* write (single) stream */ + generic_bs_w_1, + generic_bs_w_2, + generic_bs_w_4, + NULL, + + /* write multiple stream */ + generic_bs_wm_1, + generic_bs_wm_2, + generic_bs_wm_4, + NULL, + + /* write region stream */ + NULL, + generic_bs_wr_2, + generic_bs_wr_4, + NULL, +}; + +bus_space_tag_t ar71xx_bus_space_reversed = &bus_space_reversed; + +static uint8_t +reversed_bs_r_1(void *t, bus_space_handle_t h, bus_size_t o) +{ + + return readb(h + (o &~ 3) + (3 - (o & 3))); +} + +static void +reversed_bs_w_1(void *t, bus_space_handle_t h, bus_size_t o, u_int8_t v) +{ + + writeb(h + (o &~ 3) + (3 - (o & 3)), v); +} + +static uint16_t +reversed_bs_r_2(void *t, bus_space_handle_t h, bus_size_t o) +{ + + return readw(h + (o &~ 3) + (2 - (o & 3))); +} + +static void +reversed_bs_w_2(void *t, bus_space_handle_t h, bus_size_t o, uint16_t v) +{ + + writew(h + (o &~ 3) + (2 - (o & 3)), v); +} diff --git a/sys/mips/atheros/ar71xx_bus_space_reversed.h b/sys/mips/atheros/ar71xx_bus_space_reversed.h new file mode 100644 index 000000000000..c8d28dc70350 --- /dev/null +++ b/sys/mips/atheros/ar71xx_bus_space_reversed.h @@ -0,0 +1,33 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#ifndef __AR71XX_BUS_SPACE_REVERSEDH__ +#define __AR71XX_BUS_SPACE_REVERSEDH__ + +extern bus_space_tag_t ar71xx_bus_space_reversed; + +#endif /* __AR71XX_BUS_SPACE_REVERSEDH__ */ diff --git a/sys/mips/atheros/ar71xx_ehci.c b/sys/mips/atheros/ar71xx_ehci.c new file mode 100644 index 000000000000..936fd355a00e --- /dev/null +++ b/sys/mips/atheros/ar71xx_ehci.c @@ -0,0 +1,288 @@ +/*- + * Copyright (c) 2008 Sam Leffler. 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 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. + */ + +/* + * AR71XX attachment driver for the USB Enhanced Host Controller. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_bus.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#define EHCI_HC_DEVSTR "AR71XX Integrated USB 2.0 controller" + +struct ar71xx_ehci_softc { + ehci_softc_t base; /* storage for EHCI code */ +}; + +static device_attach_t ar71xx_ehci_attach; +static device_detach_t ar71xx_ehci_detach; +static device_shutdown_t ar71xx_ehci_shutdown; +static device_suspend_t ar71xx_ehci_suspend; +static device_resume_t ar71xx_ehci_resume; + +bs_r_1_proto(reversed); +bs_w_1_proto(reversed); + +static int +ar71xx_ehci_suspend(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + int err; + + err = bus_generic_suspend(self); + if (err) + return (err); + ehci_suspend(sc); + return (0); +} + +static int +ar71xx_ehci_resume(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + + ehci_resume(sc); + + bus_generic_resume(self); + + return (0); +} + +static int +ar71xx_ehci_shutdown(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + int err; + + err = bus_generic_shutdown(self); + if (err) + return (err); + ehci_shutdown(sc); + + return (0); +} + +static int +ar71xx_ehci_probe(device_t self) +{ + + device_set_desc(self, EHCI_HC_DEVSTR); + + return (BUS_PROBE_DEFAULT); +} + +static int +ar71xx_ehci_attach(device_t self) +{ + struct ar71xx_ehci_softc *isc = device_get_softc(self); + ehci_softc_t *sc = &isc->base; + int err; + int rid; + + /* initialise some bus fields */ + sc->sc_bus.parent = self; + sc->sc_bus.devices = sc->sc_devices; + sc->sc_bus.devices_max = EHCI_MAX_DEVICES; + + /* get all DMA memory */ + if (usb_bus_mem_alloc_all(&sc->sc_bus, + USB_GET_DMA_TAG(self), &ehci_iterate_hw_softc)) { + return (ENOMEM); + } + + sc->sc_bus.usbrev = USB_REV_2_0; + + /* NB: hints fix the memory location and irq */ + + rid = 0; + sc->sc_io_res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, RF_ACTIVE); + if (!sc->sc_io_res) { + device_printf(self, "Could not map memory\n"); + goto error; + } + + /* + * Craft special resource for bus space ops that handle + * byte-alignment of non-word addresses. + */ + sc->sc_io_tag = ar71xx_bus_space_reversed; + sc->sc_io_hdl = rman_get_bushandle(sc->sc_io_res); + sc->sc_io_size = rman_get_size(sc->sc_io_res); + + rid = 0; + sc->sc_irq_res = bus_alloc_resource_any(self, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (sc->sc_irq_res == NULL) { + device_printf(self, "Could not allocate irq\n"); + goto error; + } + sc->sc_bus.bdev = device_add_child(self, "usbus", -1); + if (!sc->sc_bus.bdev) { + device_printf(self, "Could not add USB device\n"); + goto error; + } + device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus); + device_set_desc(sc->sc_bus.bdev, EHCI_HC_DEVSTR); + + sprintf(sc->sc_vendor, "Atheros"); + + + err = bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, + NULL, (driver_intr_t *)ehci_interrupt, sc, &sc->sc_intr_hdl); + if (err) { + device_printf(self, "Could not setup irq, %d\n", err); + sc->sc_intr_hdl = NULL; + goto error; + } + + /* + * Arrange to force Host mode, select big-endian byte alignment, + * and arrange to not terminate reset operations (the adapter + * will ignore it if we do but might as well save a reg write). + * Also, the controller has an embedded Transaction Translator + * which means port speed must be read from the Port Status + * register following a port enable. + */ + sc->sc_flags = EHCI_SCFLG_SETMODE; + (void) ehci_reset(sc); + + err = ehci_init(sc); + if (!err) { + err = device_probe_and_attach(sc->sc_bus.bdev); + } + if (err) { + device_printf(self, "USB init failed err=%d\n", err); + goto error; + } + return (0); + +error: + ar71xx_ehci_detach(self); + return (ENXIO); +} + +static int +ar71xx_ehci_detach(device_t self) +{ + struct ar71xx_ehci_softc *isc = device_get_softc(self); + ehci_softc_t *sc = &isc->base; + device_t bdev; + int err; + + if (sc->sc_bus.bdev) { + bdev = sc->sc_bus.bdev; + device_detach(bdev); + device_delete_child(self, bdev); + } + /* during module unload there are lots of children leftover */ + device_delete_all_children(self); + + /* + * disable interrupts that might have been switched on in ehci_init + */ + if (sc->sc_io_res) { + EWRITE4(sc, EHCI_USBINTR, 0); + } + + if (sc->sc_irq_res && sc->sc_intr_hdl) { + /* + * only call ehci_detach() after ehci_init() + */ + ehci_detach(sc); + + err = bus_teardown_intr(self, sc->sc_irq_res, sc->sc_intr_hdl); + + if (err) + /* XXX or should we panic? */ + device_printf(self, "Could not tear down irq, %d\n", + err); + sc->sc_intr_hdl = NULL; + } + + if (sc->sc_irq_res) { + bus_release_resource(self, SYS_RES_IRQ, 0, sc->sc_irq_res); + sc->sc_irq_res = NULL; + } + if (sc->sc_io_res) { + bus_release_resource(self, SYS_RES_MEMORY, 0, + sc->sc_io_res); + sc->sc_io_res = NULL; + } + usb_bus_mem_free_all(&sc->sc_bus, &ehci_iterate_hw_softc); + + return (0); +} + +static device_method_t ehci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ar71xx_ehci_probe), + DEVMETHOD(device_attach, ar71xx_ehci_attach), + DEVMETHOD(device_detach, ar71xx_ehci_detach), + DEVMETHOD(device_suspend, ar71xx_ehci_suspend), + DEVMETHOD(device_resume, ar71xx_ehci_resume), + DEVMETHOD(device_shutdown, ar71xx_ehci_shutdown), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + + {0, 0} +}; + +static driver_t ehci_driver = { + "ehci", + ehci_methods, + sizeof(struct ar71xx_ehci_softc), +}; + +static devclass_t ehci_devclass; + +DRIVER_MODULE(ehci, nexus, ehci_driver, ehci_devclass, 0, 0); +MODULE_DEPEND(ehci, usb, 1, 1, 1); diff --git a/sys/mips/atheros/ar71xx_machdep.c b/sys/mips/atheros/ar71xx_machdep.c new file mode 100644 index 000000000000..6cb68cefcca2 --- /dev/null +++ b/sys/mips/atheros/ar71xx_machdep.c @@ -0,0 +1,269 @@ +/*- + * Copyright (c) 2009 Oleksandr Tymoshenko + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include + +#include "opt_ddb.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +extern char edata[], end[]; + +uint32_t ar711_base_mac[ETHER_ADDR_LEN]; +/* 4KB static data aread to keep a copy of the bootload env until + the dynamic kenv is setup */ +char boot1_env[4096]; + +/* + * We get a string in from Redboot with the all the arguments together, + * "foo=bar bar=baz". Split them up and save in kenv. + */ +static void +parse_argv(char *str) +{ + char *n, *v; + + while ((v = strsep(&str, " ")) != NULL) { + if (*v == '\0') + continue; + if (*v == '-') { + while (*v != '\0') { + v++; + switch (*v) { + case 'a': boothowto |= RB_ASKNAME; break; + case 'd': boothowto |= RB_KDB; break; + case 'g': boothowto |= RB_GDB; break; + case 's': boothowto |= RB_SINGLE; break; + case 'v': boothowto |= RB_VERBOSE; break; + } + } + } else { + n = strsep(&v, "="); + if (v == NULL) + setenv(n, "1"); + else + setenv(n, v); + } + } +} + +void +platform_cpu_init() +{ + /* Nothing special */ +} + +void +platform_halt(void) +{ + +} + +void +platform_identify(void) +{ + +} + +void +platform_reset(void) +{ + uint32_t reg = ATH_READ_REG(AR71XX_RST_RESET); + + ATH_WRITE_REG(AR71XX_RST_RESET, reg | RST_RESET_FULL_CHIP); + /* Wait for reset */ + while(1) + ; +} + +void +platform_trap_enter(void) +{ + +} + +void +platform_trap_exit(void) +{ + +} + +void +platform_start(__register_t a0 __unused, __register_t a1 __unused, + __register_t a2 __unused, __register_t a3 __unused) +{ + uint64_t platform_counter_freq; + uint32_t reg; + int argc, i, count = 0; + char **argv, **envp; + vm_offset_t kernend; + + /* + * clear the BSS and SBSS segments, this should be first call in + * the function + */ + kernend = (vm_offset_t)&end; + memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + + mips_postboot_fixup(); + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + + argc = a0; + argv = (char**)a1; + envp = (char**)a2; + /* + * Protect ourselves from garbage in registers + */ + if (MIPS_IS_VALID_PTR(envp)) { + for (i = 0; envp[i]; i += 2) + { + if (strcmp(envp[i], "memsize") == 0) + realmem = btoc(strtoul(envp[i+1], NULL, 16)); + else if (strcmp(envp[i], "ethaddr") == 0) { + count = sscanf(envp[i+1], "%x.%x.%x.%x.%x.%x", + &ar711_base_mac[0], &ar711_base_mac[1], + &ar711_base_mac[2], &ar711_base_mac[3], + &ar711_base_mac[4], &ar711_base_mac[5]); + if (count < 6) + memset(ar711_base_mac, 0, + sizeof(ar711_base_mac)); + } + } + } + + /* + * Just wild guess. RedBoot let us down and didn't reported + * memory size + */ + if (realmem == 0) + realmem = btoc(32*1024*1024); + + /* phys_avail regions are in bytes */ + phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); + phys_avail[1] = ctob(realmem); + + physmem = realmem; + + /* + * ns8250 uart code uses DELAY so ticker should be inititalized + * before cninit. And tick_init_params refers to hz, so * init_param1 + * should be called first. + */ + init_param1(); + platform_counter_freq = ar71xx_cpu_freq(); + mips_timer_init_params(platform_counter_freq, 1); + cninit(); + init_static_kenv(boot1_env, sizeof(boot1_env)); + + printf("platform frequency: %lld\n", platform_counter_freq); + printf("arguments: \n"); + printf(" a0 = %08x\n", a0); + printf(" a1 = %08x\n", a1); + printf(" a2 = %08x\n", a2); + printf(" a3 = %08x\n", a3); + + printf("Cmd line:"); + if (MIPS_IS_VALID_PTR(argv)) { + for (i = 0; i < argc; i++) { + printf(" %s", argv[i]); + parse_argv(argv[i]); + } + } + else + printf ("argv is invalid"); + printf("\n"); + + printf("Environment:\n"); + if (MIPS_IS_VALID_PTR(envp)) { + for (i = 0; envp[i]; i+=2) { + printf(" %s = %s\n", envp[i], envp[i+1]); + setenv(envp[i], envp[i+1]); + } + } + else + printf ("envp is invalid\n"); + + init_param2(physmem); + mips_cpu_init(); + pmap_bootstrap(); + mips_proc0_init(); + mutex_init(); + + /* + * Reset USB devices + */ + reg = ATH_READ_REG(AR71XX_RST_RESET); + reg |= + RST_RESET_USB_OHCI_DLL | RST_RESET_USB_HOST | RST_RESET_USB_PHY; + ATH_WRITE_REG(AR71XX_RST_RESET, reg); + DELAY(1000); + reg &= + ~(RST_RESET_USB_OHCI_DLL | RST_RESET_USB_HOST | RST_RESET_USB_PHY); + ATH_WRITE_REG(AR71XX_RST_RESET, reg); + + ATH_WRITE_REG(AR71XX_USB_CTRL_CONFIG, + USB_CTRL_CONFIG_OHCI_DES_SWAP | USB_CTRL_CONFIG_OHCI_BUF_SWAP | + USB_CTRL_CONFIG_EHCI_DES_SWAP | USB_CTRL_CONFIG_EHCI_BUF_SWAP); + + ATH_WRITE_REG(AR71XX_USB_CTRL_FLADJ, + (32 << USB_CTRL_FLADJ_HOST_SHIFT) | (3 << USB_CTRL_FLADJ_A5_SHIFT)); + DELAY(1000); + + kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); +#endif +} diff --git a/sys/mips/atheros/ar71xx_ohci.c b/sys/mips/atheros/ar71xx_ohci.c new file mode 100644 index 000000000000..acccd850a1c5 --- /dev/null +++ b/sys/mips/atheros/ar71xx_ohci.c @@ -0,0 +1,215 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +static int ar71xx_ohci_attach(device_t dev); +static int ar71xx_ohci_detach(device_t dev); +static int ar71xx_ohci_probe(device_t dev); + +struct ar71xx_ohci_softc +{ + struct ohci_softc sc_ohci; +}; + +static int +ar71xx_ohci_probe(device_t dev) +{ + device_set_desc(dev, "AR71XX integrated OHCI controller"); + return (BUS_PROBE_DEFAULT); +} + +static int +ar71xx_ohci_attach(device_t dev) +{ + struct ar71xx_ohci_softc *sc = device_get_softc(dev); + int err; + int rid; + + /* initialise some bus fields */ + sc->sc_ohci.sc_bus.parent = dev; + sc->sc_ohci.sc_bus.devices = sc->sc_ohci.sc_devices; + sc->sc_ohci.sc_bus.devices_max = OHCI_MAX_DEVICES; + + /* get all DMA memory */ + if (usb_bus_mem_alloc_all(&sc->sc_ohci.sc_bus, + USB_GET_DMA_TAG(dev), &ohci_iterate_hw_softc)) { + return (ENOMEM); + } + + sc->sc_ohci.sc_dev = dev; + + rid = 0; + sc->sc_ohci.sc_io_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (sc->sc_ohci.sc_io_res == NULL) { + err = ENOMEM; + goto error; + } + sc->sc_ohci.sc_io_tag = rman_get_bustag(sc->sc_ohci.sc_io_res); + sc->sc_ohci.sc_io_hdl = rman_get_bushandle(sc->sc_ohci.sc_io_res); + sc->sc_ohci.sc_io_size = rman_get_size(sc->sc_ohci.sc_io_res); + + rid = 0; + sc->sc_ohci.sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_ACTIVE); + if (sc->sc_ohci.sc_irq_res == NULL) { + err = ENOMEM; + goto error; + } + sc->sc_ohci.sc_bus.bdev = device_add_child(dev, "usbus", -1); + if (sc->sc_ohci.sc_bus.bdev == NULL) { + err = ENOMEM; + goto error; + } + device_set_ivars(sc->sc_ohci.sc_bus.bdev, &sc->sc_ohci.sc_bus); + + err = bus_setup_intr(dev, sc->sc_ohci.sc_irq_res, + INTR_TYPE_BIO | INTR_MPSAFE, NULL, + (driver_intr_t *)ohci_interrupt, sc, &sc->sc_ohci.sc_intr_hdl); + if (err) { + err = ENXIO; + goto error; + } + + strlcpy(sc->sc_ohci.sc_vendor, "Atheros", sizeof(sc->sc_ohci.sc_vendor)); + + bus_space_write_4(sc->sc_ohci.sc_io_tag, sc->sc_ohci.sc_io_hdl, OHCI_CONTROL, 0); + + err = ohci_init(&sc->sc_ohci); + if (!err) + err = device_probe_and_attach(sc->sc_ohci.sc_bus.bdev); + + if (err) + goto error; + return (0); + +error: + if (err) { + ar71xx_ohci_detach(dev); + return (err); + } + return (err); +} + +static int +ar71xx_ohci_detach(device_t dev) +{ + struct ar71xx_ohci_softc *sc = device_get_softc(dev); + device_t bdev; + + if (sc->sc_ohci.sc_bus.bdev) { + bdev = sc->sc_ohci.sc_bus.bdev; + device_detach(bdev); + device_delete_child(dev, bdev); + } + /* during module unload there are lots of children leftover */ + device_delete_all_children(dev); + + /* + * Put the controller into reset, then disable clocks and do + * the MI tear down. We have to disable the clocks/hardware + * after we do the rest of the teardown. We also disable the + * clocks in the opposite order we acquire them, but that + * doesn't seem to be absolutely necessary. We free up the + * clocks after we disable them, so the system could, in + * theory, reuse them. + */ + bus_space_write_4(sc->sc_ohci.sc_io_tag, sc->sc_ohci.sc_io_hdl, + OHCI_CONTROL, 0); + + if (sc->sc_ohci.sc_intr_hdl) { + bus_teardown_intr(dev, sc->sc_ohci.sc_irq_res, sc->sc_ohci.sc_intr_hdl); + sc->sc_ohci.sc_intr_hdl = NULL; + } + + if (sc->sc_ohci.sc_irq_res && sc->sc_ohci.sc_intr_hdl) { + /* + * only call ohci_detach() after ohci_init() + */ + ohci_detach(&sc->sc_ohci); + + bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_ohci.sc_irq_res); + sc->sc_ohci.sc_irq_res = NULL; + } + if (sc->sc_ohci.sc_io_res) { + bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_ohci.sc_io_res); + sc->sc_ohci.sc_io_res = NULL; + sc->sc_ohci.sc_io_tag = 0; + sc->sc_ohci.sc_io_hdl = 0; + } + usb_bus_mem_free_all(&sc->sc_ohci.sc_bus, &ohci_iterate_hw_softc); + + return (0); +} + +static device_method_t ohci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ar71xx_ohci_probe), + DEVMETHOD(device_attach, ar71xx_ohci_attach), + DEVMETHOD(device_detach, ar71xx_ohci_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + + {0, 0} +}; + +static driver_t ohci_driver = { + "ohci", + ohci_methods, + sizeof(struct ar71xx_ohci_softc), +}; + +static devclass_t ohci_devclass; + +DRIVER_MODULE(ohci, apb, ohci_driver, ohci_devclass, 0, 0); diff --git a/sys/mips/atheros/ar71xx_pci.c b/sys/mips/atheros/ar71xx_pci.c new file mode 100644 index 000000000000..d96f5a5c0c6c --- /dev/null +++ b/sys/mips/atheros/ar71xx_pci.c @@ -0,0 +1,559 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include "pcib_if.h" + +#include +#include + +#undef AR71XX_PCI_DEBUG +#ifdef AR71XX_PCI_DEBUG +#define dprintf printf +#else +#define dprintf(x, arg...) +#endif + +struct ar71xx_pci_softc { + device_t sc_dev; + + int sc_busno; + struct rman sc_mem_rman; + struct rman sc_irq_rman; + + struct intr_event *sc_eventstab[AR71XX_PCI_NIRQS]; + struct resource *sc_irq; + void *sc_ih; +}; + +static int ar71xx_pci_setup_intr(device_t, device_t, struct resource *, int, + driver_filter_t *, driver_intr_t *, void *, void **); +static int ar71xx_pci_teardown_intr(device_t, device_t, struct resource *, + void *); +static int ar71xx_pci_intr(void *); + +static void +ar71xx_pci_mask_irq(void *source) +{ + uint32_t reg; + unsigned int irq = (unsigned int)source; + + reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK); + /* flush */ + reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK); + ATH_WRITE_REG(AR71XX_PCI_INTR_MASK, reg & ~(1 << irq)); +} + +static void +ar71xx_pci_unmask_irq(void *source) +{ + uint32_t reg; + unsigned int irq = (unsigned int)source; + + reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK); + ATH_WRITE_REG(AR71XX_PCI_INTR_MASK, reg | (1 << irq)); + /* flush */ + reg = ATH_READ_REG(AR71XX_PCI_INTR_MASK); +} + +/* + * get bitmask for bytes of interest: + * 0 - we want this byte, 1 - ignore it. e.g: we read 1 byte + * from register 7. Bitmask would be: 0111 + */ +static uint32_t +ar71xx_get_bytes_to_read(int reg, int bytes) +{ + uint32_t bytes_to_read = 0; + if ((bytes % 4) == 0) + bytes_to_read = 0; + else if ((bytes % 4) == 1) + bytes_to_read = (~(1 << (reg % 4))) & 0xf; + else if ((bytes % 4) == 2) + bytes_to_read = (~(3 << (reg % 4))) & 0xf; + else + panic("%s: wrong combination", __func__); + + return (bytes_to_read); +} + +static int +ar71xx_pci_check_bus_error(void) +{ + uint32_t error, addr, has_errors = 0; + error = ATH_READ_REG(AR71XX_PCI_ERROR) & 0x3; + dprintf("%s: PCI error = %02x\n", __func__, error); + if (error) { + addr = ATH_READ_REG(AR71XX_PCI_ERROR_ADDR); + + /* Do not report it yet */ +#if 0 + printf("PCI bus error %d at addr 0x%08x\n", error, addr); +#endif + ATH_WRITE_REG(AR71XX_PCI_ERROR, error); + has_errors = 1; + } + + error = ATH_READ_REG(AR71XX_PCI_AHB_ERROR) & 0x1; + dprintf("%s: AHB error = %02x\n", __func__, error); + if (error) { + addr = ATH_READ_REG(AR71XX_PCI_AHB_ERROR_ADDR); + /* Do not report it yet */ +#if 0 + printf("AHB bus error %d at addr 0x%08x\n", error, addr); +#endif + ATH_WRITE_REG(AR71XX_PCI_AHB_ERROR, error); + has_errors = 1; + } + + return (has_errors); +} + +static uint32_t +ar71xx_pci_make_addr(int bus, int slot, int func, int reg) +{ + if (bus == 0) { + return ((1 << slot) | (func << 8) | (reg & ~3)); + } else { + return ((bus << 16) | (slot << 11) | (func << 8) + | (reg & ~3) | 1); + } +} + +static int +ar71xx_pci_conf_setup(int bus, int slot, int func, int reg, int bytes, + uint32_t cmd) +{ + uint32_t addr = ar71xx_pci_make_addr(bus, slot, func, (reg & ~3)); + cmd |= (ar71xx_get_bytes_to_read(reg, bytes) << 4); + + ATH_WRITE_REG(AR71XX_PCI_CONF_ADDR, addr); + ATH_WRITE_REG(AR71XX_PCI_CONF_CMD, cmd); + + dprintf("%s: tag (%x, %x, %x) %d/%d addr=%08x, cmd=%08x\n", __func__, + bus, slot, func, reg, bytes, addr, cmd); + + return ar71xx_pci_check_bus_error(); +} + +static uint32_t +ar71xx_pci_read_config(device_t dev, u_int bus, u_int slot, u_int func, + u_int reg, int bytes) +{ + uint32_t data; + uint32_t cmd, shift, mask; + + /* register access is 32-bit aligned */ + shift = (reg & 3) * 8; + if (shift) + mask = (1 << shift) - 1; + else + mask = 0xffffffff; + + dprintf("%s: tag (%x, %x, %x) reg %d(%d)\n", __func__, bus, slot, + func, reg, bytes); + + if ((bus == 0) && (slot == 0) && (func == 0)) { + cmd = PCI_LCONF_CMD_READ | (reg & ~3); + ATH_WRITE_REG(AR71XX_PCI_LCONF_CMD, cmd); + data = ATH_READ_REG(AR71XX_PCI_LCONF_READ_DATA); + } else { + if (ar71xx_pci_conf_setup(bus, slot, func, reg, bytes, + PCI_CONF_CMD_READ) == 0) + data = ATH_READ_REG(AR71XX_PCI_CONF_READ_DATA); + else + data = -1; + } + + /* get request bytes from 32-bit word */ + data = (data >> shift) & mask; + + dprintf("%s: read 0x%x\n", __func__, data); + + return (data); +} + +static void +ar71xx_pci_write_config(device_t dev, u_int bus, u_int slot, u_int func, + u_int reg, uint32_t data, int bytes) +{ + uint32_t cmd; + + dprintf("%s: tag (%x, %x, %x) reg %d(%d)\n", __func__, bus, slot, + func, reg, bytes); + + data = data << (8*(reg % 4)); + + if ((bus == 0) && (slot == 0) && (func == 0)) { + cmd = PCI_LCONF_CMD_WRITE | (reg & ~3); + cmd |= ar71xx_get_bytes_to_read(reg, bytes) << 20; + ATH_WRITE_REG(AR71XX_PCI_LCONF_CMD, cmd); + ATH_WRITE_REG(AR71XX_PCI_LCONF_WRITE_DATA, data); + } else { + if (ar71xx_pci_conf_setup(bus, slot, func, reg, bytes, + PCI_CONF_CMD_WRITE) == 0) + ATH_WRITE_REG(AR71XX_PCI_CONF_WRITE_DATA, data); + } +} + +static int +ar71xx_pci_probe(device_t dev) +{ + + return (0); +} + +static int +ar71xx_pci_attach(device_t dev) +{ + int busno = 0; + int rid = 0; + uint32_t reset; + struct ar71xx_pci_softc *sc = device_get_softc(dev); + + sc->sc_mem_rman.rm_type = RMAN_ARRAY; + sc->sc_mem_rman.rm_descr = "ar71xx PCI memory window"; + if (rman_init(&sc->sc_mem_rman) != 0 || + rman_manage_region(&sc->sc_mem_rman, AR71XX_PCI_MEM_BASE, + AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE - 1) != 0) { + panic("ar71xx_pci_attach: failed to set up I/O rman"); + } + + sc->sc_irq_rman.rm_type = RMAN_ARRAY; + sc->sc_irq_rman.rm_descr = "ar71xx PCI IRQs"; + if (rman_init(&sc->sc_irq_rman) != 0 || + rman_manage_region(&sc->sc_irq_rman, AR71XX_PCI_IRQ_START, + AR71XX_PCI_IRQ_END) != 0) + panic("ar71xx_pci_attach: failed to set up IRQ rman"); + + + ATH_WRITE_REG(AR71XX_PCI_INTR_STATUS, 0); + ATH_WRITE_REG(AR71XX_PCI_INTR_MASK, 0); + + /* Hook up our interrupt handler. */ + if ((sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_SHAREABLE | RF_ACTIVE)) == NULL) { + device_printf(dev, "unable to allocate IRQ resource\n"); + return ENXIO; + } + + if ((bus_setup_intr(dev, sc->sc_irq, INTR_TYPE_MISC, + ar71xx_pci_intr, NULL, sc, &sc->sc_ih))) { + device_printf(dev, + "WARNING: unable to register interrupt handler\n"); + return ENXIO; + } + + /* reset PCI core and PCI bus */ + reset = ATH_READ_REG(AR71XX_RST_RESET); + reset |= (RST_RESET_PCI_CORE | RST_RESET_PCI_BUS); + ATH_WRITE_REG(AR71XX_RST_RESET, reset); + ATH_READ_REG(AR71XX_RST_RESET); + DELAY(100000); + + reset &= ~(RST_RESET_PCI_CORE | RST_RESET_PCI_BUS); + ATH_WRITE_REG(AR71XX_RST_RESET, reset); + ATH_READ_REG(AR71XX_RST_RESET); + DELAY(100000); + + /* Init PCI windows */ + ATH_WRITE_REG(AR71XX_PCI_WINDOW0, PCI_WINDOW0_ADDR); + ATH_WRITE_REG(AR71XX_PCI_WINDOW1, PCI_WINDOW1_ADDR); + ATH_WRITE_REG(AR71XX_PCI_WINDOW2, PCI_WINDOW2_ADDR); + ATH_WRITE_REG(AR71XX_PCI_WINDOW3, PCI_WINDOW3_ADDR); + ATH_WRITE_REG(AR71XX_PCI_WINDOW4, PCI_WINDOW4_ADDR); + ATH_WRITE_REG(AR71XX_PCI_WINDOW5, PCI_WINDOW5_ADDR); + ATH_WRITE_REG(AR71XX_PCI_WINDOW6, PCI_WINDOW6_ADDR); + ATH_WRITE_REG(AR71XX_PCI_WINDOW7, PCI_WINDOW7_CONF_ADDR); + DELAY(100000); + + ar71xx_pci_check_bus_error(); + + /* Fixup internal PCI bridge */ + ar71xx_pci_write_config(dev, 0, 0, 0, PCIR_COMMAND, + PCIM_CMD_BUSMASTEREN | PCIM_CMD_MEMEN + | PCIM_CMD_SERRESPEN | PCIM_CMD_BACKTOBACK + | PCIM_CMD_PERRESPEN | PCIM_CMD_MWRICEN, 2); + + device_add_child(dev, "pci", busno); + return (bus_generic_attach(dev)); +} + +static int +ar71xx_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) +{ + struct ar71xx_pci_softc *sc = device_get_softc(dev); + + switch (which) { + case PCIB_IVAR_DOMAIN: + *result = 0; + return (0); + case PCIB_IVAR_BUS: + *result = sc->sc_busno; + return (0); + } + + return (ENOENT); +} + +static int +ar71xx_pci_write_ivar(device_t dev, device_t child, int which, uintptr_t result) +{ + struct ar71xx_pci_softc * sc = device_get_softc(dev); + + switch (which) { + case PCIB_IVAR_BUS: + sc->sc_busno = result; + return (0); + } + + return (ENOENT); +} + +static struct resource * +ar71xx_pci_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + + struct ar71xx_pci_softc *sc = device_get_softc(bus); + struct resource *rv; + struct rman *rm; + + switch (type) { + case SYS_RES_IRQ: + rm = &sc->sc_irq_rman; + break; + case SYS_RES_MEMORY: + rm = &sc->sc_mem_rman; + break; + default: + return (NULL); + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + + if (rv == NULL) + return (NULL); + + rman_set_rid(rv, *rid); + + if (flags & RF_ACTIVE) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + + + return (rv); +} + + +static int +ar71xx_pci_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + int res = (BUS_ACTIVATE_RESOURCE(device_get_parent(bus), + child, type, rid, r)); + + if (!res) { + switch(type) { + case SYS_RES_MEMORY: + case SYS_RES_IOPORT: + rman_set_bustag(r, ar71xx_bus_space_pcimem); + break; + } + } + + return (res); +} + + + +static int +ar71xx_pci_setup_intr(device_t bus, device_t child, struct resource *ires, + int flags, driver_filter_t *filt, driver_intr_t *handler, + void *arg, void **cookiep) +{ + struct ar71xx_pci_softc *sc = device_get_softc(bus); + struct intr_event *event; + int irq, error; + + irq = rman_get_start(ires); + + if (irq > AR71XX_PCI_IRQ_END) + panic("%s: bad irq %d", __func__, irq); + + event = sc->sc_eventstab[irq]; + if (event == NULL) { + error = intr_event_create(&event, (void *)irq, 0, irq, + ar71xx_pci_mask_irq, ar71xx_pci_unmask_irq, NULL, NULL, + "ar71xx_pci intr%d:", irq); + + sc->sc_eventstab[irq] = event; + } + + intr_event_add_handler(event, device_get_nameunit(child), filt, + handler, arg, intr_priority(flags), flags, cookiep); + + ar71xx_pci_unmask_irq((void*)irq); + + return (0); +} + +static int +ar71xx_pci_teardown_intr(device_t dev, device_t child, struct resource *ires, + void *cookie) +{ + struct ar71xx_pci_softc *sc = device_get_softc(dev); + int irq, result; + + irq = rman_get_start(ires); + if (irq > AR71XX_PCI_IRQ_END) + panic("%s: bad irq %d", __func__, irq); + + if (sc->sc_eventstab[irq] == NULL) + panic("Trying to teardown unoccupied IRQ"); + + ar71xx_pci_mask_irq((void*)irq); + + result = intr_event_remove_handler(cookie); + if (!result) + sc->sc_eventstab[irq] = NULL; + + return (result); +} + +static int +ar71xx_pci_intr(void *arg) +{ + struct ar71xx_pci_softc *sc = arg; + struct intr_event *event; + uint32_t reg, irq, mask; + + reg = ATH_READ_REG(AR71XX_PCI_INTR_STATUS); + mask = ATH_READ_REG(AR71XX_PCI_INTR_MASK); + /* + * Handle only unmasked interrupts + */ + reg &= mask; + for (irq = AR71XX_PCI_IRQ_START; irq <= AR71XX_PCI_IRQ_END; irq++) { + if (reg & (1 << irq)) { + event = sc->sc_eventstab[irq]; + if (!event || TAILQ_EMPTY(&event->ie_handlers)) { + /* Ignore timer interrupts */ + if (irq != 0) + printf("Stray IRQ %d\n", irq); + continue; + } + + /* TODO: frame instead of NULL? */ + intr_event_handle(event, NULL); + } + } + + return (FILTER_HANDLED); +} + +static int +ar71xx_pci_maxslots(device_t dev) +{ + + return (PCI_SLOTMAX); +} + +static int +ar71xx_pci_route_interrupt(device_t pcib, device_t device, int pin) +{ + if (pci_get_slot(device) < AR71XX_PCI_BASE_SLOT) + panic("%s: PCI slot %d is less then AR71XX_PCI_BASE_SLOT", + __func__, pci_get_slot(device)); + + return (pci_get_slot(device) - AR71XX_PCI_BASE_SLOT); +} + +static device_method_t ar71xx_pci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ar71xx_pci_probe), + DEVMETHOD(device_attach, ar71xx_pci_attach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_read_ivar, ar71xx_pci_read_ivar), + DEVMETHOD(bus_write_ivar, ar71xx_pci_write_ivar), + DEVMETHOD(bus_alloc_resource, ar71xx_pci_alloc_resource), + DEVMETHOD(bus_release_resource, bus_generic_release_resource), + DEVMETHOD(bus_activate_resource, ar71xx_pci_activate_resource), + DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_setup_intr, ar71xx_pci_setup_intr), + DEVMETHOD(bus_teardown_intr, ar71xx_pci_teardown_intr), + + /* pcib interface */ + DEVMETHOD(pcib_maxslots, ar71xx_pci_maxslots), + DEVMETHOD(pcib_read_config, ar71xx_pci_read_config), + DEVMETHOD(pcib_write_config, ar71xx_pci_write_config), + DEVMETHOD(pcib_route_interrupt, ar71xx_pci_route_interrupt), + + {0, 0} +}; + +static driver_t ar71xx_pci_driver = { + "pcib", + ar71xx_pci_methods, + sizeof(struct ar71xx_pci_softc), +}; + +static devclass_t ar71xx_pci_devclass; + +DRIVER_MODULE(ar71xx_pci, nexus, ar71xx_pci_driver, ar71xx_pci_devclass, 0, 0); diff --git a/sys/mips/atheros/ar71xx_pci_bus_space.c b/sys/mips/atheros/ar71xx_pci_bus_space.c new file mode 100644 index 000000000000..554018196735 --- /dev/null +++ b/sys/mips/atheros/ar71xx_pci_bus_space.c @@ -0,0 +1,198 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include + +static bs_r_1_s_proto(pcimem); +static bs_r_2_s_proto(pcimem); +static bs_r_4_s_proto(pcimem); +static bs_w_1_s_proto(pcimem); +static bs_w_2_s_proto(pcimem); +static bs_w_4_s_proto(pcimem); + +/* + * Bus space that handles offsets in word for 1/2 bytes read/write access. + * Byte order of values is handled by device drivers itself. + */ +static struct bus_space bus_space_pcimem = { + /* cookie */ + (void *) 0, + + /* mapping/unmapping */ + generic_bs_map, + generic_bs_unmap, + generic_bs_subregion, + + /* allocation/deallocation */ + NULL, + NULL, + + /* barrier */ + generic_bs_barrier, + + /* read (single) */ + generic_bs_r_1, + generic_bs_r_2, + generic_bs_r_4, + NULL, + + /* read multiple */ + generic_bs_rm_1, + generic_bs_rm_2, + generic_bs_rm_4, + NULL, + + /* read region */ + generic_bs_rr_1, + generic_bs_rr_2, + generic_bs_rr_4, + NULL, + + /* write (single) */ + generic_bs_w_1, + generic_bs_w_2, + generic_bs_w_4, + NULL, + + /* write multiple */ + generic_bs_wm_1, + generic_bs_wm_2, + generic_bs_wm_4, + NULL, + + /* write region */ + NULL, + generic_bs_wr_2, + generic_bs_wr_4, + NULL, + + /* set multiple */ + NULL, + NULL, + NULL, + NULL, + + /* set region */ + NULL, + generic_bs_sr_2, + generic_bs_sr_4, + NULL, + + /* copy */ + NULL, + generic_bs_c_2, + NULL, + NULL, + + /* read (single) stream */ + pcimem_bs_r_1_s, + pcimem_bs_r_2_s, + pcimem_bs_r_4_s, + NULL, + + /* read multiple stream */ + generic_bs_rm_1, + generic_bs_rm_2, + generic_bs_rm_4, + NULL, + + /* read region stream */ + generic_bs_rr_1, + generic_bs_rr_2, + generic_bs_rr_4, + NULL, + + /* write (single) stream */ + pcimem_bs_w_1_s, + pcimem_bs_w_2_s, + pcimem_bs_w_4_s, + NULL, + + /* write multiple stream */ + generic_bs_wm_1, + generic_bs_wm_2, + generic_bs_wm_4, + NULL, + + /* write region stream */ + NULL, + generic_bs_wr_2, + generic_bs_wr_4, + NULL, +}; + +bus_space_tag_t ar71xx_bus_space_pcimem = &bus_space_pcimem; + +static uint8_t +pcimem_bs_r_1_s(void *t, bus_space_handle_t h, bus_size_t o) +{ + + return readb(h + (o &~ 3) + (3 - (o & 3))); +} + +static void +pcimem_bs_w_1_s(void *t, bus_space_handle_t h, bus_size_t o, u_int8_t v) +{ + + writeb(h + (o &~ 3) + (3 - (o & 3)), v); +} + +static uint16_t +pcimem_bs_r_2_s(void *t, bus_space_handle_t h, bus_size_t o) +{ + + return readw(h + (o &~ 3) + (2 - (o & 3))); +} + +static void +pcimem_bs_w_2_s(void *t, bus_space_handle_t h, bus_size_t o, uint16_t v) +{ + + writew(h + (o &~ 3) + (2 - (o & 3)), v); +} + +static uint32_t +pcimem_bs_r_4_s(void *t, bus_space_handle_t h, bus_size_t o) +{ + + return le32toh(readl(h + o)); +} + +static void +pcimem_bs_w_4_s(void *t, bus_space_handle_t h, bus_size_t o, uint32_t v) +{ + + writel(h + o, htole32(v)); +} diff --git a/sys/mips/atheros/ar71xx_pci_bus_space.h b/sys/mips/atheros/ar71xx_pci_bus_space.h new file mode 100644 index 000000000000..5dead02a1ece --- /dev/null +++ b/sys/mips/atheros/ar71xx_pci_bus_space.h @@ -0,0 +1,33 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#ifndef __AR71XX_PCI_BUS_SPACEH__ +#define __AR71XX_PCI_BUS_SPACEH__ + +extern bus_space_tag_t ar71xx_bus_space_pcimem; + +#endif /* __AR71XX_PCI_BUS_SPACEH__ */ diff --git a/sys/mips/atheros/ar71xx_spi.c b/sys/mips/atheros/ar71xx_spi.c new file mode 100644 index 000000000000..92cc3654d809 --- /dev/null +++ b/sys/mips/atheros/ar71xx_spi.c @@ -0,0 +1,237 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "spibus_if.h" + +#include + +#undef AR71XX_SPI_DEBUG +#ifdef AR71XX_SPI_DEBUG +#define dprintf printf +#else +#define dprintf(x, arg...) +#endif + +/* + * register space access macros + */ +#define SPI_WRITE(sc, reg, val) do { \ + bus_write_4(sc->sc_mem_res, (reg), (val)); \ + } while (0) + +#define SPI_READ(sc, reg) bus_read_4(sc->sc_mem_res, (reg)) + +#define SPI_SET_BITS(sc, reg, bits) \ + SPI_WRITE(sc, reg, SPI_READ(sc, (reg)) | (bits)) + +#define SPI_CLEAR_BITS(sc, reg, bits) \ + SPI_WRITE(sc, reg, SPI_READ(sc, (reg)) & ~(bits)) + +struct ar71xx_spi_softc { + device_t sc_dev; + struct resource *sc_mem_res; + uint32_t sc_reg_ctrl; +}; + +static int +ar71xx_spi_probe(device_t dev) +{ + device_set_desc(dev, "AR71XX SPI"); + return (0); +} + +static int +ar71xx_spi_attach(device_t dev) +{ + struct ar71xx_spi_softc *sc = device_get_softc(dev); + int rid; + + sc->sc_dev = dev; + rid = 0; + sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (!sc->sc_mem_res) { + device_printf(dev, "Could not map memory\n"); + return (ENXIO); + } + + + SPI_WRITE(sc, AR71XX_SPI_FS, 1); + sc->sc_reg_ctrl = SPI_READ(sc, AR71XX_SPI_CTRL); + SPI_WRITE(sc, AR71XX_SPI_CTRL, 0x43); + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, SPI_IO_CTRL_CSMASK); + + device_add_child(dev, "spibus", 0); + return (bus_generic_attach(dev)); +} + +static void +ar71xx_spi_chip_activate(struct ar71xx_spi_softc *sc, int cs) +{ + uint32_t ioctrl = SPI_IO_CTRL_CSMASK; + /* + * Put respective CSx to low + */ + ioctrl &= ~(SPI_IO_CTRL_CS0 << cs); + + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, ioctrl); +} + +static void +ar71xx_spi_chip_deactivate(struct ar71xx_spi_softc *sc, int cs) +{ + /* + * Put all CSx to high + */ + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, SPI_IO_CTRL_CSMASK); +} + +static uint8_t +ar71xx_spi_txrx(struct ar71xx_spi_softc *sc, int cs, uint8_t data) +{ + int bit; + /* CS0 */ + uint32_t ioctrl = SPI_IO_CTRL_CSMASK; + /* + * low-level for selected CS + */ + ioctrl &= ~(SPI_IO_CTRL_CS0 << cs); + + uint32_t iod, rds; + for (bit = 7; bit >=0; bit--) { + if (data & (1 << bit)) + iod = ioctrl | SPI_IO_CTRL_DO; + else + iod = ioctrl & ~SPI_IO_CTRL_DO; + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, iod); + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, iod | SPI_IO_CTRL_CLK); + } + + /* + * Provide falling edge for connected device by clear clock bit. + */ + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, iod); + rds = SPI_READ(sc, AR71XX_SPI_RDS); + + return (rds & 0xff); +} + +static int +ar71xx_spi_transfer(device_t dev, device_t child, struct spi_command *cmd) +{ + struct ar71xx_spi_softc *sc; + uint8_t *buf_in, *buf_out; + struct spibus_ivar *devi = SPIBUS_IVAR(child); + int i; + + sc = device_get_softc(dev); + + ar71xx_spi_chip_activate(sc, devi->cs); + + KASSERT(cmd->tx_cmd_sz == cmd->rx_cmd_sz, + ("TX/RX command sizes should be equal")); + KASSERT(cmd->tx_data_sz == cmd->rx_data_sz, + ("TX/RX data sizes should be equal")); + + /* + * Transfer command + */ + buf_out = (uint8_t *)cmd->tx_cmd; + buf_in = (uint8_t *)cmd->rx_cmd; + for (i = 0; i < cmd->tx_cmd_sz; i++) + buf_in[i] = ar71xx_spi_txrx(sc, devi->cs, buf_out[i]); + + /* + * Receive/transmit data (depends on command) + */ + buf_out = (uint8_t *)cmd->tx_data; + buf_in = (uint8_t *)cmd->rx_data; + for (i = 0; i < cmd->tx_data_sz; i++) + buf_in[i] = ar71xx_spi_txrx(sc, devi->cs, buf_out[i]); + + ar71xx_spi_chip_deactivate(sc, devi->cs); + + return (0); +} + +static int +ar71xx_spi_detach(device_t dev) +{ + struct ar71xx_spi_softc *sc = device_get_softc(dev); + + SPI_WRITE(sc, AR71XX_SPI_CTRL, sc->sc_reg_ctrl); + SPI_WRITE(sc, AR71XX_SPI_FS, 0); + + if (sc->sc_mem_res) + bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); + + return (0); +} + +static device_method_t ar71xx_spi_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ar71xx_spi_probe), + DEVMETHOD(device_attach, ar71xx_spi_attach), + DEVMETHOD(device_detach, ar71xx_spi_detach), + + DEVMETHOD(spibus_transfer, ar71xx_spi_transfer), + + {0, 0} +}; + +static driver_t ar71xx_spi_driver = { + "spi", + ar71xx_spi_methods, + sizeof(struct ar71xx_spi_softc), +}; + +static devclass_t ar71xx_spi_devclass; + +DRIVER_MODULE(ar71xx_spi, nexus, ar71xx_spi_driver, ar71xx_spi_devclass, 0, 0); diff --git a/sys/mips/atheros/ar71xx_wdog.c b/sys/mips/atheros/ar71xx_wdog.c new file mode 100644 index 000000000000..90caaa84f8af --- /dev/null +++ b/sys/mips/atheros/ar71xx_wdog.c @@ -0,0 +1,118 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +/* + * Watchdog driver for AR71xx + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include + +struct ar71xx_wdog_softc { + device_t dev; + int armed; +}; + +static void +ar71xx_wdog_watchdog_fn(void *private, u_int cmd, int *error) +{ + struct ar71xx_wdog_softc *sc = private; + uint64_t timer_val; + + cmd &= WD_INTERVAL; + if (cmd > 0) { + timer_val = (uint64_t)(1ULL << cmd) * ar71xx_ahb_freq() / + 1000000000; + /* + * Load timer with large enough value to prevent spurious + * reset + */ + ATH_WRITE_REG(AR71XX_RST_WDOG_TIMER, + ar71xx_ahb_freq() * 10); + ATH_WRITE_REG(AR71XX_RST_WDOG_CONTROL, + RST_WDOG_ACTION_RESET); + ATH_WRITE_REG(AR71XX_RST_WDOG_TIMER, + (timer_val & 0xffffffff)); + sc->armed = 1; + *error = 0; + } else { + if (sc->armed) { + ATH_WRITE_REG(AR71XX_RST_WDOG_CONTROL, + RST_WDOG_ACTION_NOACTION); + sc->armed = 0; + } + } +} + +static int +ar71xx_wdog_probe(device_t dev) +{ + + device_set_desc(dev, "Atheros AR71XX watchdog timer"); + return (0); +} + +static int +ar71xx_wdog_attach(device_t dev) +{ + struct ar71xx_wdog_softc *sc = device_get_softc(dev); + + if (ATH_READ_REG(AR71XX_RST_WDOG_CONTROL) & RST_WDOG_LAST) + device_printf (dev, + "Previous reset was due to watchdog timeout\n"); + + ATH_WRITE_REG(AR71XX_RST_WDOG_CONTROL, RST_WDOG_ACTION_NOACTION); + + sc->dev = dev; + EVENTHANDLER_REGISTER(watchdog_list, ar71xx_wdog_watchdog_fn, sc, 0); + + return (0); +} + +static device_method_t ar71xx_wdog_methods[] = { + DEVMETHOD(device_probe, ar71xx_wdog_probe), + DEVMETHOD(device_attach, ar71xx_wdog_attach), + {0, 0}, +}; + +static driver_t ar71xx_wdog_driver = { + "ar71xx_wdog", + ar71xx_wdog_methods, + sizeof(struct ar71xx_wdog_softc), +}; +static devclass_t ar71xx_wdog_devclass; + +DRIVER_MODULE(ar71xx_wdog, nexus, ar71xx_wdog_driver, ar71xx_wdog_devclass, 0, 0); diff --git a/sys/mips/atheros/ar71xxreg.h b/sys/mips/atheros/ar71xxreg.h new file mode 100644 index 000000000000..1908d6859ba9 --- /dev/null +++ b/sys/mips/atheros/ar71xxreg.h @@ -0,0 +1,472 @@ +/*- + * Copyright (c) 2009 Oleksandr Tymoshenko + * 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$ */ + +#ifndef _AR71XX_REG_H_ +#define _AR71XX_REG_H_ + +/* PCI region */ +#define AR71XX_PCI_MEM_BASE 0x10000000 +/* + * PCI mem windows is 0x08000000 bytes long but we exclude control + * region from the resource manager + */ +#define AR71XX_PCI_MEM_SIZE 0x07000000 +#define AR71XX_PCI_IRQ_START 0 +#define AR71XX_PCI_IRQ_END 2 +#define AR71XX_PCI_NIRQS 3 +/* + * PCI devices slots are starting from this number + */ +#define AR71XX_PCI_BASE_SLOT 17 + +/* PCI config registers */ +#define AR71XX_PCI_LCONF_CMD 0x17010000 +#define PCI_LCONF_CMD_READ 0x00000000 +#define PCI_LCONF_CMD_WRITE 0x00010000 +#define AR71XX_PCI_LCONF_WRITE_DATA 0x17010004 +#define AR71XX_PCI_LCONF_READ_DATA 0x17010008 +#define AR71XX_PCI_CONF_ADDR 0x1701000C +#define AR71XX_PCI_CONF_CMD 0x17010010 +#define PCI_CONF_CMD_READ 0x0000000A +#define PCI_CONF_CMD_WRITE 0x0000000B +#define AR71XX_PCI_CONF_WRITE_DATA 0x17010014 +#define AR71XX_PCI_CONF_READ_DATA 0x17010018 +#define AR71XX_PCI_ERROR 0x1701001C +#define AR71XX_PCI_ERROR_ADDR 0x17010020 +#define AR71XX_PCI_AHB_ERROR 0x17010024 +#define AR71XX_PCI_AHB_ERROR_ADDR 0x17010028 + +/* APB region */ +/* + * Size is not really true actual APB window size is + * 0x01000000 but it should handle OHCI memory as well + * because this controller's interrupt is routed through + * APB. + */ +#define AR71XX_APB_BASE 0x18000000 +#define AR71XX_APB_SIZE 0x06000000 + +/* DDR registers */ +#define AR71XX_DDR_CONFIG 0x18000000 +#define AR71XX_DDR_CONFIG2 0x18000004 +#define AR71XX_DDR_MODE_REGISTER 0x18000008 +#define AR71XX_DDR_EXT_MODE_REGISTER 0x1800000C +#define AR71XX_DDR_CONTROL 0x18000010 +#define AR71XX_DDR_REFRESH 0x18000014 +#define AR71XX_DDR_RD_DATA_THIS_CYCLE 0x18000018 +#define AR71XX_TAP_CONTROL0 0x1800001C +#define AR71XX_TAP_CONTROL1 0x18000020 +#define AR71XX_TAP_CONTROL2 0x18000024 +#define AR71XX_TAP_CONTROL3 0x18000028 +#define AR71XX_PCI_WINDOW0 0x1800007C +#define AR71XX_PCI_WINDOW1 0x18000080 +#define AR71XX_PCI_WINDOW2 0x18000084 +#define AR71XX_PCI_WINDOW3 0x18000088 +#define AR71XX_PCI_WINDOW4 0x1800008C +#define AR71XX_PCI_WINDOW5 0x18000090 +#define AR71XX_PCI_WINDOW6 0x18000094 +#define AR71XX_PCI_WINDOW7 0x18000098 +#define AR71XX_WB_FLUSH_GE0 0x1800009C +#define AR71XX_WB_FLUSH_GE1 0x180000A0 +#define AR71XX_WB_FLUSH_USB 0x180000A4 +#define AR71XX_WB_FLUSH_PCI 0x180000A8 + +/* + * Values for PCI_WINDOW_X registers + */ +#define PCI_WINDOW0_ADDR 0x10000000 +#define PCI_WINDOW1_ADDR 0x11000000 +#define PCI_WINDOW2_ADDR 0x12000000 +#define PCI_WINDOW3_ADDR 0x13000000 +#define PCI_WINDOW4_ADDR 0x14000000 +#define PCI_WINDOW5_ADDR 0x15000000 +#define PCI_WINDOW6_ADDR 0x16000000 +#define PCI_WINDOW7_ADDR 0x17000000 +/* This value enables acces to PCI config registers */ +#define PCI_WINDOW7_CONF_ADDR 0x07000000 + +#define AR71XX_UART_ADDR 0x18020000 + +#define AR71XX_USB_CTRL_FLADJ 0x18030000 +#define USB_CTRL_FLADJ_HOST_SHIFT 12 +#define USB_CTRL_FLADJ_A5_SHIFT 10 +#define USB_CTRL_FLADJ_A4_SHIFT 8 +#define USB_CTRL_FLADJ_A3_SHIFT 6 +#define USB_CTRL_FLADJ_A2_SHIFT 4 +#define USB_CTRL_FLADJ_A1_SHIFT 2 +#define USB_CTRL_FLADJ_A0_SHIFT 0 +#define AR71XX_USB_CTRL_CONFIG 0x18030004 +#define USB_CTRL_CONFIG_OHCI_DES_SWAP (1 << 19) +#define USB_CTRL_CONFIG_OHCI_BUF_SWAP (1 << 18) +#define USB_CTRL_CONFIG_EHCI_DES_SWAP (1 << 17) +#define USB_CTRL_CONFIG_EHCI_BUF_SWAP (1 << 16) +#define USB_CTRL_CONFIG_DISABLE_XTL (1 << 13) +#define USB_CTRL_CONFIG_OVERRIDE_XTL (1 << 12) +#define USB_CTRL_CONFIG_CLK_SEL_SHIFT 4 +#define USB_CTRL_CONFIG_CLK_SEL_MASK 3 +#define USB_CTRL_CONFIG_CLK_SEL_12 0 +#define USB_CTRL_CONFIG_CLK_SEL_24 1 +#define USB_CTRL_CONFIG_CLK_SEL_48 2 +#define USB_CTRL_CONFIG_OVER_CURRENT_AS_GPIO (1 << 8) +#define USB_CTRL_CONFIG_SS_SIMULATION_MODE (1 << 2) +#define USB_CTRL_CONFIG_RESUME_UTMI_PLS_DIS (1 << 1) +#define USB_CTRL_CONFIG_UTMI_BACKWARD_ENB (1 << 0) + +#define AR71XX_BASE_FREQ 40000000 +#define AR71XX_PLL_CPU_CONFIG 0x18050000 +#define PLL_SW_UPDATE (1 << 31) +#define PLL_LOCKED (1 << 30) +#define PLL_AHB_DIV_SHIFT 20 +#define PLL_AHB_DIV_MASK 7 +#define PLL_DDR_DIV_SEL_SHIFT 18 +#define PLL_DDR_DIV_SEL_MASK 3 +#define PLL_CPU_DIV_SEL_SHIFT 16 +#define PLL_CPU_DIV_SEL_MASK 3 +#define PLL_LOOP_BW_SHIFT 12 +#define PLL_LOOP_BW_MASK 0xf +#define PLL_DIV_IN_SHIFT 10 +#define PLL_DIV_IN_MASK 3 +#define PLL_DIV_OUT_SHIFT 8 +#define PLL_DIV_OUT_MASK 3 +#define PLL_FB_SHIFT 3 +#define PLL_FB_MASK 0x1f +#define PLL_BYPASS (1 << 1) +#define PLL_POWER_DOWN (1 << 0) +#define AR71XX_PLL_SEC_CONFIG 0x18050004 +#define AR71XX_PLL_CPU_CLK_CTRL 0x18050008 +#define AR71XX_PLL_ETH_INT0_CLK 0x18050010 +#define AR71XX_PLL_ETH_INT1_CLK 0x18050014 +#define XPLL_ETH_INT_CLK_10 0x00991099 +#define XPLL_ETH_INT_CLK_100 0x00441011 +#define XPLL_ETH_INT_CLK_1000 0x13110000 +#define XPLL_ETH_INT_CLK_1000_GMII 0x14110000 +#define PLL_ETH_INT_CLK_10 0x00991099 +#define PLL_ETH_INT_CLK_100 0x00001099 +#define PLL_ETH_INT_CLK_1000 0x00110000 +#define AR71XX_PLL_ETH_EXT_CLK 0x18050018 +#define AR71XX_PLL_PCI_CLK 0x1805001C + +#define AR71XX_RST_WDOG_CONTROL 0x18060008 +#define RST_WDOG_LAST (1 << 31) +#define RST_WDOG_ACTION_MASK 3 +#define RST_WDOG_ACTION_RESET 3 +#define RST_WDOG_ACTION_NMI 2 +#define RST_WDOG_ACTION_GP_INTR 1 +#define RST_WDOG_ACTION_NOACTION 0 + +#define AR71XX_RST_WDOG_TIMER 0x1806000C +/* + * APB interrupt status and mask register and interrupt bit numbers for + */ +#define AR71XX_MISC_INTR_STATUS 0x18060010 +#define AR71XX_MISC_INTR_MASK 0x18060014 +#define MISC_INTR_TIMER 0 +#define MISC_INTR_ERROR 1 +#define MISC_INTR_GPIO 2 +#define MISC_INTR_UART 3 +#define MISC_INTR_WATCHDOG 4 +#define MISC_INTR_PERF 5 +#define MISC_INTR_OHCI 6 +#define MISC_INTR_DMA 7 + +#define AR71XX_PCI_INTR_STATUS 0x18060018 +#define AR71XX_PCI_INTR_MASK 0x1806001C +#define PCI_INTR_CORE (1 << 4) + +#define AR71XX_RST_RESET 0x18060024 +#define RST_RESET_FULL_CHIP (1 << 24) /* Same as pulling + the reset pin */ +#define RST_RESET_CPU_COLD (1 << 20) /* Cold reset */ +#define RST_RESET_GE1_MAC (1 << 13) +#define RST_RESET_GE1_PHY (1 << 12) +#define RST_RESET_GE0_MAC (1 << 9) +#define RST_RESET_GE0_PHY (1 << 8) +#define RST_RESET_USB_OHCI_DLL (1 << 6) +#define RST_RESET_USB_HOST (1 << 5) +#define RST_RESET_USB_PHY (1 << 4) +#define RST_RESET_PCI_BUS (1 << 1) +#define RST_RESET_PCI_CORE (1 << 0) + +/* + * GigE adapters region + */ +#define AR71XX_MAC0_BASE 0x19000000 +#define AR71XX_MAC1_BASE 0x1A000000 +/* + * All 5 PHYs accessible only through MAC0 register space + */ +#define AR71XX_MII_BASE 0x19000000 + +#define AR71XX_MAC_CFG1 0x00 +#define MAC_CFG1_SOFT_RESET (1 << 31) +#define MAC_CFG1_SIMUL_RESET (1 << 30) +#define MAC_CFG1_MAC_RX_BLOCK_RESET (1 << 19) +#define MAC_CFG1_MAC_TX_BLOCK_RESET (1 << 18) +#define MAC_CFG1_RX_FUNC_RESET (1 << 17) +#define MAC_CFG1_TX_FUNC_RESET (1 << 16) +#define MAC_CFG1_LOOPBACK (1 << 8) +#define MAC_CFG1_RXFLOW_CTRL (1 << 5) +#define MAC_CFG1_TXFLOW_CTRL (1 << 4) +#define MAC_CFG1_SYNC_RX (1 << 3) +#define MAC_CFG1_RX_ENABLE (1 << 2) +#define MAC_CFG1_SYNC_TX (1 << 1) +#define MAC_CFG1_TX_ENABLE (1 << 0) +#define AR71XX_MAC_CFG2 0x04 +#define MAC_CFG2_PREAMBLE_LEN_MASK 0xf +#define MAC_CFG2_PREAMBLE_LEN_SHIFT 12 +#define MAC_CFG2_IFACE_MODE_1000 (2 << 8) +#define MAC_CFG2_IFACE_MODE_10_100 (1 << 8) +#define MAC_CFG2_IFACE_MODE_SHIFT 8 +#define MAC_CFG2_IFACE_MODE_MASK 3 +#define MAC_CFG2_HUGE_FRAME (1 << 5) +#define MAC_CFG2_LENGTH_FIELD (1 << 4) +#define MAC_CFG2_ENABLE_PADCRC (1 << 2) +#define MAC_CFG2_ENABLE_CRC (1 << 1) +#define MAC_CFG2_FULL_DUPLEX (1 << 0) +#define AR71XX_MAC_IFG 0x08 +#define AR71XX_MAC_HDUPLEX 0x0C +#define AR71XX_MAC_MAX_FRAME_LEN 0x10 +#define AR71XX_MAC_MII_CFG 0x20 +#define MAC_MII_CFG_RESET (1 << 31) +#define MAC_MII_CFG_SCAN_AUTO_INC (1 << 5) +#define MAC_MII_CFG_PREAMBLE_SUP (1 << 4) +#define MAC_MII_CFG_CLOCK_SELECT_MASK 0x7 +#define MAC_MII_CFG_CLOCK_DIV_4 0 +#define MAC_MII_CFG_CLOCK_DIV_6 2 +#define MAC_MII_CFG_CLOCK_DIV_8 3 +#define MAC_MII_CFG_CLOCK_DIV_10 4 +#define MAC_MII_CFG_CLOCK_DIV_14 5 +#define MAC_MII_CFG_CLOCK_DIV_20 6 +#define MAC_MII_CFG_CLOCK_DIV_28 7 +#define AR71XX_MAC_MII_CMD 0x24 +#define MAC_MII_CMD_SCAN_CYCLE (1 << 1) +#define MAC_MII_CMD_READ 1 +#define MAC_MII_CMD_WRITE 0 +#define AR71XX_MAC_MII_ADDR 0x28 +#define MAC_MII_PHY_ADDR_SHIFT 8 +#define MAC_MII_PHY_ADDR_MASK 0xff +#define MAC_MII_REG_MASK 0x1f +#define AR71XX_MAC_MII_CONTROL 0x2C +#define MAC_MII_CONTROL_MASK 0xffff +#define AR71XX_MAC_MII_STATUS 0x30 +#define MAC_MII_STATUS_MASK 0xffff +#define AR71XX_MAC_MII_INDICATOR 0x34 +#define MAC_MII_INDICATOR_NOT_VALID (1 << 2) +#define MAC_MII_INDICATOR_SCANNING (1 << 1) +#define MAC_MII_INDICATOR_BUSY (1 << 0) +#define AR71XX_MAC_IFCONTROL 0x38 +#define MAC_IFCONTROL_SPEED (1 << 16) +#define AR71XX_MAC_STA_ADDR1 0x40 +#define AR71XX_MAC_STA_ADDR2 0x44 +#define AR71XX_MAC_FIFO_CFG0 0x48 +#define FIFO_CFG0_TX_FABRIC (1 << 4) +#define FIFO_CFG0_TX_SYSTEM (1 << 3) +#define FIFO_CFG0_RX_FABRIC (1 << 2) +#define FIFO_CFG0_RX_SYSTEM (1 << 1) +#define FIFO_CFG0_WATERMARK (1 << 0) +#define FIFO_CFG0_ALL ((1 << 5) - 1) +#define FIFO_CFG0_ENABLE_SHIFT 8 +#define AR71XX_MAC_FIFO_CFG1 0x4C +#define AR71XX_MAC_FIFO_CFG2 0x50 +#define AR71XX_MAC_FIFO_TX_THRESHOLD 0x54 +#define AR71XX_MAC_FIFO_RX_FILTMATCH 0x58 +/* + * These flags applicable both to AR71XX_MAC_FIFO_RX_FILTMASK and + * to AR71XX_MAC_FIFO_RX_FILTMATCH + */ +#define FIFO_RX_MATCH_UNICAST (1 << 17) +#define FIFO_RX_MATCH_TRUNC_FRAME (1 << 16) +#define FIFO_RX_MATCH_VLAN_TAG (1 << 15) +#define FIFO_RX_MATCH_UNSUP_OPCODE (1 << 14) +#define FIFO_RX_MATCH_PAUSE_FRAME (1 << 13) +#define FIFO_RX_MATCH_CTRL_FRAME (1 << 12) +#define FIFO_RX_MATCH_LONG_EVENT (1 << 11) +#define FIFO_RX_MATCH_DRIBBLE_NIBBLE (1 << 10) +#define FIFO_RX_MATCH_BCAST (1 << 9) +#define FIFO_RX_MATCH_MCAST (1 << 8) +#define FIFO_RX_MATCH_OK (1 << 7) +#define FIFO_RX_MATCH_OORANGE (1 << 6) +#define FIFO_RX_MATCH_LEN_MSMTCH (1 << 5) +#define FIFO_RX_MATCH_CRC_ERROR (1 << 4) +#define FIFO_RX_MATCH_CODE_ERROR (1 << 3) +#define FIFO_RX_MATCH_FALSE_CARRIER (1 << 2) +#define FIFO_RX_MATCH_RX_DV_EVENT (1 << 1) +#define FIFO_RX_MATCH_DROP_EVENT (1 << 0) +/* + * Exclude unicast and truncated frames from matching + */ +#define FIFO_RX_FILTMATCH_DEFAULT \ + (FIFO_RX_MATCH_VLAN_TAG | \ + FIFO_RX_MATCH_UNSUP_OPCODE | \ + FIFO_RX_MATCH_PAUSE_FRAME | \ + FIFO_RX_MATCH_CTRL_FRAME | \ + FIFO_RX_MATCH_LONG_EVENT | \ + FIFO_RX_MATCH_DRIBBLE_NIBBLE | \ + FIFO_RX_MATCH_BCAST | \ + FIFO_RX_MATCH_MCAST | \ + FIFO_RX_MATCH_OK | \ + FIFO_RX_MATCH_OORANGE | \ + FIFO_RX_MATCH_LEN_MSMTCH | \ + FIFO_RX_MATCH_CRC_ERROR | \ + FIFO_RX_MATCH_CODE_ERROR | \ + FIFO_RX_MATCH_FALSE_CARRIER | \ + FIFO_RX_MATCH_RX_DV_EVENT | \ + FIFO_RX_MATCH_DROP_EVENT) +#define AR71XX_MAC_FIFO_RX_FILTMASK 0x5C +#define FIFO_RX_MASK_BYTE_MODE (1 << 19) +#define FIFO_RX_MASK_NO_SHORT_FRAME (1 << 18) +#define FIFO_RX_MASK_BIT17 (1 << 17) +#define FIFO_RX_MASK_BIT16 (1 << 16) +#define FIFO_RX_MASK_TRUNC_FRAME (1 << 15) +#define FIFO_RX_MASK_LONG_EVENT (1 << 14) +#define FIFO_RX_MASK_VLAN_TAG (1 << 13) +#define FIFO_RX_MASK_UNSUP_OPCODE (1 << 12) +#define FIFO_RX_MASK_PAUSE_FRAME (1 << 11) +#define FIFO_RX_MASK_CTRL_FRAME (1 << 10) +#define FIFO_RX_MASK_DRIBBLE_NIBBLE (1 << 9) +#define FIFO_RX_MASK_BCAST (1 << 8) +#define FIFO_RX_MASK_MCAST (1 << 7) +#define FIFO_RX_MASK_OK (1 << 6) +#define FIFO_RX_MASK_OORANGE (1 << 5) +#define FIFO_RX_MASK_LEN_MSMTCH (1 << 4) +#define FIFO_RX_MASK_CODE_ERROR (1 << 3) +#define FIFO_RX_MASK_FALSE_CARRIER (1 << 2) +#define FIFO_RX_MASK_RX_DV_EVENT (1 << 1) +#define FIFO_RX_MASK_DROP_EVENT (1 << 0) + +/* + * Len. mismatch, unsup. opcode and short frmae bits excluded + */ +#define FIFO_RX_FILTMASK_DEFAULT \ + (FIFO_RX_MASK_NO_SHORT_FRAME | \ + FIFO_RX_MASK_BIT17 | \ + FIFO_RX_MASK_BIT16 | \ + FIFO_RX_MASK_TRUNC_FRAME | \ + FIFO_RX_MASK_LONG_EVENT | \ + FIFO_RX_MASK_VLAN_TAG | \ + FIFO_RX_MASK_PAUSE_FRAME | \ + FIFO_RX_MASK_CTRL_FRAME | \ + FIFO_RX_MASK_DRIBBLE_NIBBLE | \ + FIFO_RX_MASK_BCAST | \ + FIFO_RX_MASK_MCAST | \ + FIFO_RX_MASK_OK | \ + FIFO_RX_MASK_OORANGE | \ + FIFO_RX_MASK_CODE_ERROR | \ + FIFO_RX_MASK_FALSE_CARRIER | \ + FIFO_RX_MASK_RX_DV_EVENT | \ + FIFO_RX_MASK_DROP_EVENT) + +#define AR71XX_MAC_FIFO_RAM0 0x60 +#define AR71XX_MAC_FIFO_RAM1 0x64 +#define AR71XX_MAC_FIFO_RAM2 0x68 +#define AR71XX_MAC_FIFO_RAM3 0x6C +#define AR71XX_MAC_FIFO_RAM4 0x70 +#define AR71XX_MAC_FIFO_RAM5 0x74 +#define AR71XX_MAC_FIFO_RAM6 0x78 +#define AR71XX_DMA_TX_CONTROL 0x180 +#define DMA_TX_CONTROL_EN (1 << 0) +#define AR71XX_DMA_TX_DESC 0x184 +#define AR71XX_DMA_TX_STATUS 0x188 +#define DMA_TX_STATUS_PCOUNT_MASK 0xff +#define DMA_TX_STATUS_PCOUNT_SHIFT 16 +#define DMA_TX_STATUS_BUS_ERROR (1 << 3) +#define DMA_TX_STATUS_UNDERRUN (1 << 1) +#define DMA_TX_STATUS_PKT_SENT (1 << 0) +#define AR71XX_DMA_RX_CONTROL 0x18C +#define DMA_RX_CONTROL_EN (1 << 0) +#define AR71XX_DMA_RX_DESC 0x190 +#define AR71XX_DMA_RX_STATUS 0x194 +#define DMA_RX_STATUS_PCOUNT_MASK 0xff +#define DMA_RX_STATUS_PCOUNT_SHIFT 16 +#define DMA_RX_STATUS_BUS_ERROR (1 << 3) +#define DMA_RX_STATUS_OVERFLOW (1 << 2) +#define DMA_RX_STATUS_PKT_RECVD (1 << 0) +#define AR71XX_DMA_INTR 0x198 +#define AR71XX_DMA_INTR_STATUS 0x19C +#define DMA_INTR_ALL ((1 << 8) - 1) +#define DMA_INTR_RX_BUS_ERROR (1 << 7) +#define DMA_INTR_RX_OVERFLOW (1 << 6) +#define DMA_INTR_RX_PKT_RCVD (1 << 4) +#define DMA_INTR_TX_BUS_ERROR (1 << 3) +#define DMA_INTR_TX_UNDERRUN (1 << 1) +#define DMA_INTR_TX_PKT_SENT (1 << 0) + +#define AR71XX_SPI_BASE 0x1f000000 +#define AR71XX_SPI_FS 0x00 +#define AR71XX_SPI_CTRL 0x04 +#define SPI_CTRL_REMAP_DISABLE (1 << 6) +#define SPI_CTRL_CLOCK_DIVIDER_MASK ((1 << 6) - 1) +#define AR71XX_SPI_IO_CTRL 0x08 +#define SPI_IO_CTRL_CS2 (1 << 18) +#define SPI_IO_CTRL_CS1 (1 << 17) +#define SPI_IO_CTRL_CS0 (1 << 16) +#define SPI_IO_CTRL_CSMASK (7 << 16) +#define SPI_IO_CTRL_CLK (1 << 8) +#define SPI_IO_CTRL_DO 1 +#define AR71XX_SPI_RDS 0x0C + +#define ATH_READ_REG(reg) \ + *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1((reg))) + +#define ATH_WRITE_REG(reg, val) \ + *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1((reg))) = (val) + +static inline uint64_t +ar71xx_cpu_freq(void) +{ + uint32_t pll_config, div; + uint64_t freq; + + /* PLL freq */ + pll_config = ATH_READ_REG(AR71XX_PLL_CPU_CONFIG); + div = ((pll_config >> PLL_FB_SHIFT) & PLL_FB_MASK) + 1; + freq = div * AR71XX_BASE_FREQ; + /* CPU freq */ + div = ((pll_config >> PLL_CPU_DIV_SEL_SHIFT) & PLL_CPU_DIV_SEL_MASK) + + 1; + freq = freq / div; + + return (freq); +} + +static inline uint64_t +ar71xx_ahb_freq(void) +{ + uint32_t pll_config, div; + uint64_t freq; + + /* PLL freq */ + pll_config = ATH_READ_REG(AR71XX_PLL_CPU_CONFIG); + /* AHB freq */ + div = (((pll_config >> PLL_AHB_DIV_SHIFT) & PLL_AHB_DIV_MASK) + 1) * 2; + freq = ar71xx_cpu_freq() / div; + return (freq); +} + + +#endif /* _AR71XX_REG_H_ */ diff --git a/sys/mips/atheros/files.ar71xx b/sys/mips/atheros/files.ar71xx new file mode 100644 index 000000000000..fed21afc83bd --- /dev/null +++ b/sys/mips/atheros/files.ar71xx @@ -0,0 +1,17 @@ +# $FreeBSD$ + +mips/atheros/apb.c standard +mips/atheros/ar71xx_machdep.c standard +mips/atheros/ar71xx_ehci.c optional ehci +mips/atheros/ar71xx_ohci.c optional ohci +mips/atheros/ar71xx_pci.c optional pci +mips/atheros/ar71xx_pci_bus_space.c optional pci +mips/atheros/ar71xx_spi.c optional ar71xx_spi +mips/atheros/pcf2123_rtc.c optional pcf2123_rtc ar71xx_spi +mips/atheros/ar71xx_wdog.c optional ar71xx_wdog +mips/atheros/if_arge.c optional arge +mips/atheros/uart_bus_ar71xx.c optional uart +mips/atheros/uart_cpu_ar71xx.c optional uart +mips/atheros/ar71xx_bus_space_reversed.c standard +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard diff --git a/sys/mips/atheros/if_arge.c b/sys/mips/atheros/if_arge.c new file mode 100644 index 000000000000..da8d181de088 --- /dev/null +++ b/sys/mips/atheros/if_arge.c @@ -0,0 +1,1811 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * AR71XX gigabit ethernet driver + */ +#ifdef HAVE_KERNEL_OPTION_HEADERS +#include "opt_device_polling.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +MODULE_DEPEND(arge, ether, 1, 1, 1); +MODULE_DEPEND(arge, miibus, 1, 1, 1); + +#include "miibus_if.h" + +#include +#include + +#undef ARGE_DEBUG +#ifdef ARGE_DEBUG +#define dprintf printf +#else +#define dprintf(x, arg...) +#endif + +static int arge_attach(device_t); +static int arge_detach(device_t); +static void arge_flush_ddr(struct arge_softc *); +static int arge_ifmedia_upd(struct ifnet *); +static void arge_ifmedia_sts(struct ifnet *, struct ifmediareq *); +static int arge_ioctl(struct ifnet *, u_long, caddr_t); +static void arge_init(void *); +static void arge_init_locked(struct arge_softc *); +static void arge_link_task(void *, int); +static void arge_set_pll(struct arge_softc *, int, int); +static int arge_miibus_readreg(device_t, int, int); +static void arge_miibus_statchg(device_t); +static int arge_miibus_writereg(device_t, int, int, int); +static int arge_probe(device_t); +static void arge_reset_dma(struct arge_softc *); +static int arge_resume(device_t); +static int arge_rx_ring_init(struct arge_softc *); +static int arge_tx_ring_init(struct arge_softc *); +#ifdef DEVICE_POLLING +static int arge_poll(struct ifnet *, enum poll_cmd, int); +#endif +static int arge_shutdown(device_t); +static void arge_start(struct ifnet *); +static void arge_start_locked(struct ifnet *); +static void arge_stop(struct arge_softc *); +static int arge_suspend(device_t); + +static int arge_rx_locked(struct arge_softc *); +static void arge_tx_locked(struct arge_softc *); +static void arge_intr(void *); +static int arge_intr_filter(void *); +static void arge_tick(void *); + +/* + * ifmedia callbacks for multiPHY MAC + */ +void arge_multiphy_mediastatus(struct ifnet *, struct ifmediareq *); +int arge_multiphy_mediachange(struct ifnet *); + +static void arge_dmamap_cb(void *, bus_dma_segment_t *, int, int); +static int arge_dma_alloc(struct arge_softc *); +static void arge_dma_free(struct arge_softc *); +static int arge_newbuf(struct arge_softc *, int); +static __inline void arge_fixup_rx(struct mbuf *); + +static device_method_t arge_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, arge_probe), + DEVMETHOD(device_attach, arge_attach), + DEVMETHOD(device_detach, arge_detach), + DEVMETHOD(device_suspend, arge_suspend), + DEVMETHOD(device_resume, arge_resume), + DEVMETHOD(device_shutdown, arge_shutdown), + + /* bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_driver_added, bus_generic_driver_added), + + /* MII interface */ + DEVMETHOD(miibus_readreg, arge_miibus_readreg), + DEVMETHOD(miibus_writereg, arge_miibus_writereg), + DEVMETHOD(miibus_statchg, arge_miibus_statchg), + + { 0, 0 } +}; + +static driver_t arge_driver = { + "arge", + arge_methods, + sizeof(struct arge_softc) +}; + +static devclass_t arge_devclass; + +DRIVER_MODULE(arge, nexus, arge_driver, arge_devclass, 0, 0); +DRIVER_MODULE(miibus, arge, miibus_driver, miibus_devclass, 0, 0); + +/* + * RedBoot passes MAC address to entry point as environment + * variable. platfrom_start parses it and stores in this variable + */ +extern uint32_t ar711_base_mac[ETHER_ADDR_LEN]; + +static struct mtx miibus_mtx; + +MTX_SYSINIT(miibus_mtx, &miibus_mtx, "arge mii lock", MTX_SPIN); + + +/* + * Flushes all + */ +static void +arge_flush_ddr(struct arge_softc *sc) +{ + + ATH_WRITE_REG(sc->arge_ddr_flush_reg, 1); + while (ATH_READ_REG(sc->arge_ddr_flush_reg) & 1) + ; + + ATH_WRITE_REG(sc->arge_ddr_flush_reg, 1); + while (ATH_READ_REG(sc->arge_ddr_flush_reg) & 1) + ; +} + +static int +arge_probe(device_t dev) +{ + + device_set_desc(dev, "Atheros AR71xx built-in ethernet interface"); + return (0); +} + +static int +arge_attach(device_t dev) +{ + uint8_t eaddr[ETHER_ADDR_LEN]; + struct ifnet *ifp; + struct arge_softc *sc; + int error = 0, rid, phymask; + uint32_t reg, rnd; + int is_base_mac_empty, i, phys_total; + uint32_t hint; + + sc = device_get_softc(dev); + sc->arge_dev = dev; + sc->arge_mac_unit = device_get_unit(dev); + + KASSERT(((sc->arge_mac_unit == 0) || (sc->arge_mac_unit == 1)), + ("if_arge: Only MAC0 and MAC1 supported")); + if (sc->arge_mac_unit == 0) { + sc->arge_ddr_flush_reg = AR71XX_WB_FLUSH_GE0; + sc->arge_pll_reg = AR71XX_PLL_ETH_INT0_CLK; + sc->arge_pll_reg_shift = 17; + } else { + sc->arge_ddr_flush_reg = AR71XX_WB_FLUSH_GE1; + sc->arge_pll_reg = AR71XX_PLL_ETH_INT1_CLK; + sc->arge_pll_reg_shift = 19; + } + + /* + * Get which PHY of 5 available we should use for this unit + */ + if (resource_int_value(device_get_name(dev), device_get_unit(dev), + "phymask", &phymask) != 0) { + /* + * Use port 4 (WAN) for GE0. For any other port use + * its PHY the same as its unit number + */ + if (sc->arge_mac_unit == 0) + phymask = (1 << 4); + else + /* Use all phys up to 4 */ + phymask = (1 << 4) - 1; + + device_printf(dev, "No PHY specified, using mask %d\n", phymask); + } + + /* + * Get default media & duplex mode, by default its Base100T + * and full duplex + */ + if (resource_int_value(device_get_name(dev), device_get_unit(dev), + "media", &hint) != 0) + hint = 0; + + if (hint == 1000) + sc->arge_media_type = IFM_1000_T; + else + sc->arge_media_type = IFM_100_TX; + + if (resource_int_value(device_get_name(dev), device_get_unit(dev), + "fduplex", &hint) != 0) + hint = 1; + + if (hint) + sc->arge_duplex_mode = IFM_FDX; + else + sc->arge_duplex_mode = 0; + + sc->arge_phymask = phymask; + + mtx_init(&sc->arge_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, + MTX_DEF); + callout_init_mtx(&sc->arge_stat_callout, &sc->arge_mtx, 0); + TASK_INIT(&sc->arge_link_task, 0, arge_link_task, sc); + + /* Map control/status registers. */ + sc->arge_rid = 0; + sc->arge_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, + &sc->arge_rid, RF_ACTIVE); + + if (sc->arge_res == NULL) { + device_printf(dev, "couldn't map memory\n"); + error = ENXIO; + goto fail; + } + + /* Allocate interrupts */ + rid = 0; + sc->arge_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, + RF_SHAREABLE | RF_ACTIVE); + + if (sc->arge_irq == NULL) { + device_printf(dev, "couldn't map interrupt\n"); + error = ENXIO; + goto fail; + } + + /* Allocate ifnet structure. */ + ifp = sc->arge_ifp = if_alloc(IFT_ETHER); + + if (ifp == NULL) { + device_printf(dev, "couldn't allocate ifnet structure\n"); + error = ENOSPC; + goto fail; + } + + ifp->if_softc = sc; + if_initname(ifp, device_get_name(dev), device_get_unit(dev)); + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_ioctl = arge_ioctl; + ifp->if_start = arge_start; + ifp->if_init = arge_init; + sc->arge_if_flags = ifp->if_flags; + + /* XXX: add real size */ + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; + IFQ_SET_READY(&ifp->if_snd); + + ifp->if_capenable = ifp->if_capabilities; +#ifdef DEVICE_POLLING + ifp->if_capabilities |= IFCAP_POLLING; +#endif + + is_base_mac_empty = 1; + for (i = 0; i < ETHER_ADDR_LEN; i++) { + eaddr[i] = ar711_base_mac[i] & 0xff; + if (eaddr[i] != 0) + is_base_mac_empty = 0; + } + + if (is_base_mac_empty) { + /* + * No MAC address configured. Generate the random one. + */ + if (bootverbose) + device_printf(dev, + "Generating random ethernet address.\n"); + + rnd = arc4random(); + eaddr[0] = 'b'; + eaddr[1] = 's'; + eaddr[2] = 'd'; + eaddr[3] = (rnd >> 24) & 0xff; + eaddr[4] = (rnd >> 16) & 0xff; + eaddr[5] = (rnd >> 8) & 0xff; + } + + if (sc->arge_mac_unit != 0) + eaddr[5] += sc->arge_mac_unit; + + if (arge_dma_alloc(sc) != 0) { + error = ENXIO; + goto fail; + } + + /* Initialize the MAC block */ + + /* Step 1. Soft-reset MAC */ + ARGE_SET_BITS(sc, AR71XX_MAC_CFG1, MAC_CFG1_SOFT_RESET); + DELAY(20); + + /* Step 2. Punt the MAC core from the central reset register */ + reg = ATH_READ_REG(AR71XX_RST_RESET); + if (sc->arge_mac_unit == 0) + reg |= RST_RESET_GE0_MAC; + else if (sc->arge_mac_unit == 1) + reg |= RST_RESET_GE1_MAC; + ATH_WRITE_REG(AR71XX_RST_RESET, reg); + DELAY(100); + reg = ATH_READ_REG(AR71XX_RST_RESET); + if (sc->arge_mac_unit == 0) + reg &= ~RST_RESET_GE0_MAC; + else if (sc->arge_mac_unit == 1) + reg &= ~RST_RESET_GE1_MAC; + ATH_WRITE_REG(AR71XX_RST_RESET, reg); + + /* Step 3. Reconfigure MAC block */ + ARGE_WRITE(sc, AR71XX_MAC_CFG1, + MAC_CFG1_SYNC_RX | MAC_CFG1_RX_ENABLE | + MAC_CFG1_SYNC_TX | MAC_CFG1_TX_ENABLE); + + reg = ARGE_READ(sc, AR71XX_MAC_CFG2); + reg |= MAC_CFG2_ENABLE_PADCRC | MAC_CFG2_LENGTH_FIELD ; + ARGE_WRITE(sc, AR71XX_MAC_CFG2, reg); + + ARGE_WRITE(sc, AR71XX_MAC_MAX_FRAME_LEN, 1536); + + /* Reset MII bus */ + ARGE_WRITE(sc, AR71XX_MAC_MII_CFG, MAC_MII_CFG_RESET); + DELAY(100); + ARGE_WRITE(sc, AR71XX_MAC_MII_CFG, MAC_MII_CFG_CLOCK_DIV_28); + DELAY(100); + + /* + * Set all Ethernet address registers to the same initial values + * set all four addresses to 66-88-aa-cc-dd-ee + */ + ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR1, + (eaddr[2] << 24) | (eaddr[3] << 16) | (eaddr[4] << 8) | eaddr[5]); + ARGE_WRITE(sc, AR71XX_MAC_STA_ADDR2, (eaddr[0] << 8) | eaddr[1]); + + ARGE_WRITE(sc, AR71XX_MAC_FIFO_CFG0, + FIFO_CFG0_ALL << FIFO_CFG0_ENABLE_SHIFT); + ARGE_WRITE(sc, AR71XX_MAC_FIFO_CFG1, 0x0fff0000); + ARGE_WRITE(sc, AR71XX_MAC_FIFO_CFG2, 0x00001fff); + + ARGE_WRITE(sc, AR71XX_MAC_FIFO_RX_FILTMATCH, + FIFO_RX_FILTMATCH_DEFAULT); + + ARGE_WRITE(sc, AR71XX_MAC_FIFO_RX_FILTMASK, + FIFO_RX_FILTMASK_DEFAULT); + + /* + * Check if we have single-PHY MAC or multi-PHY + */ + phys_total = 0; + for (i = 0; i < ARGE_NPHY; i++) + if (phymask & (1 << i)) + phys_total ++; + + if (phys_total == 0) { + error = EINVAL; + goto fail; + } + + if (phys_total == 1) { + /* Do MII setup. */ + if (mii_phy_probe(dev, &sc->arge_miibus, + arge_ifmedia_upd, arge_ifmedia_sts)) { + device_printf(dev, "MII without any phy!\n"); + error = ENXIO; + goto fail; + } + } + else { + ifmedia_init(&sc->arge_ifmedia, 0, + arge_multiphy_mediachange, + arge_multiphy_mediastatus); + ifmedia_add(&sc->arge_ifmedia, + IFM_ETHER | sc->arge_media_type | sc->arge_duplex_mode, + 0, NULL); + ifmedia_set(&sc->arge_ifmedia, + IFM_ETHER | sc->arge_media_type | sc->arge_duplex_mode); + arge_set_pll(sc, sc->arge_media_type, sc->arge_duplex_mode); + } + + /* Call MI attach routine. */ + ether_ifattach(ifp, eaddr); + + /* Hook interrupt last to avoid having to lock softc */ + error = bus_setup_intr(dev, sc->arge_irq, INTR_TYPE_NET | INTR_MPSAFE, + arge_intr_filter, arge_intr, sc, &sc->arge_intrhand); + + if (error) { + device_printf(dev, "couldn't set up irq\n"); + ether_ifdetach(ifp); + goto fail; + } + +fail: + if (error) + arge_detach(dev); + + return (error); +} + +static int +arge_detach(device_t dev) +{ + struct arge_softc *sc = device_get_softc(dev); + struct ifnet *ifp = sc->arge_ifp; + + KASSERT(mtx_initialized(&sc->arge_mtx), ("arge mutex not initialized")); + + /* These should only be active if attach succeeded */ + if (device_is_attached(dev)) { + ARGE_LOCK(sc); + sc->arge_detach = 1; +#ifdef DEVICE_POLLING + if (ifp->if_capenable & IFCAP_POLLING) + ether_poll_deregister(ifp); +#endif + + arge_stop(sc); + ARGE_UNLOCK(sc); + taskqueue_drain(taskqueue_swi, &sc->arge_link_task); + ether_ifdetach(ifp); + } + + if (sc->arge_miibus) + device_delete_child(dev, sc->arge_miibus); + + bus_generic_detach(dev); + + if (sc->arge_intrhand) + bus_teardown_intr(dev, sc->arge_irq, sc->arge_intrhand); + + if (sc->arge_res) + bus_release_resource(dev, SYS_RES_MEMORY, sc->arge_rid, + sc->arge_res); + + if (ifp) + if_free(ifp); + + arge_dma_free(sc); + + mtx_destroy(&sc->arge_mtx); + + return (0); + +} + +static int +arge_suspend(device_t dev) +{ + + panic("%s", __func__); + return 0; +} + +static int +arge_resume(device_t dev) +{ + + panic("%s", __func__); + return 0; +} + +static int +arge_shutdown(device_t dev) +{ + struct arge_softc *sc; + + sc = device_get_softc(dev); + + ARGE_LOCK(sc); + arge_stop(sc); + ARGE_UNLOCK(sc); + + return (0); +} + +static int +arge_miibus_readreg(device_t dev, int phy, int reg) +{ + struct arge_softc * sc = device_get_softc(dev); + int i, result; + uint32_t addr = (phy << MAC_MII_PHY_ADDR_SHIFT) + | (reg & MAC_MII_REG_MASK); + + if ((sc->arge_phymask & (1 << phy)) == 0) + return (0); + + mtx_lock(&miibus_mtx); + ARGE_MII_WRITE(AR71XX_MAC_MII_CMD, MAC_MII_CMD_WRITE); + ARGE_MII_WRITE(AR71XX_MAC_MII_ADDR, addr); + ARGE_MII_WRITE(AR71XX_MAC_MII_CMD, MAC_MII_CMD_READ); + + i = ARGE_MII_TIMEOUT; + while ((ARGE_MII_READ(AR71XX_MAC_MII_INDICATOR) & + MAC_MII_INDICATOR_BUSY) && (i--)) + DELAY(5); + + if (i < 0) { + mtx_unlock(&miibus_mtx); + dprintf("%s timedout\n", __func__); + /* XXX: return ERRNO istead? */ + return (-1); + } + + result = ARGE_MII_READ(AR71XX_MAC_MII_STATUS) & MAC_MII_STATUS_MASK; + ARGE_MII_WRITE(AR71XX_MAC_MII_CMD, MAC_MII_CMD_WRITE); + mtx_unlock(&miibus_mtx); + + dprintf("%s: phy=%d, reg=%02x, value[%08x]=%04x\n", __func__, + phy, reg, addr, result); + + return (result); +} + +static int +arge_miibus_writereg(device_t dev, int phy, int reg, int data) +{ + struct arge_softc * sc = device_get_softc(dev); + int i; + uint32_t addr = + (phy << MAC_MII_PHY_ADDR_SHIFT) | (reg & MAC_MII_REG_MASK); + + + if ((sc->arge_phymask & (1 << phy)) == 0) + return (-1); + + dprintf("%s: phy=%d, reg=%02x, value=%04x\n", __func__, + phy, reg, data); + + mtx_lock(&miibus_mtx); + ARGE_MII_WRITE(AR71XX_MAC_MII_ADDR, addr); + ARGE_MII_WRITE(AR71XX_MAC_MII_CONTROL, data); + + i = ARGE_MII_TIMEOUT; + while ((ARGE_MII_READ(AR71XX_MAC_MII_INDICATOR) & + MAC_MII_INDICATOR_BUSY) && (i--)) + DELAY(5); + + mtx_unlock(&miibus_mtx); + + if (i < 0) { + dprintf("%s timedout\n", __func__); + /* XXX: return ERRNO istead? */ + return (-1); + } + + return (0); +} + +static void +arge_miibus_statchg(device_t dev) +{ + struct arge_softc *sc; + + sc = device_get_softc(dev); + taskqueue_enqueue(taskqueue_swi, &sc->arge_link_task); +} + +static void +arge_link_task(void *arg, int pending) +{ + struct arge_softc *sc; + struct mii_data *mii; + struct ifnet *ifp; + uint32_t media, duplex; + + sc = (struct arge_softc *)arg; + + ARGE_LOCK(sc); + mii = device_get_softc(sc->arge_miibus); + ifp = sc->arge_ifp; + if (mii == NULL || ifp == NULL || + (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + ARGE_UNLOCK(sc); + return; + } + + if (mii->mii_media_status & IFM_ACTIVE) { + + media = IFM_SUBTYPE(mii->mii_media_active); + + if (media != IFM_NONE) { + sc->arge_link_status = 1; + duplex = mii->mii_media_active & IFM_GMASK; + arge_set_pll(sc, media, duplex); + } + } else + sc->arge_link_status = 0; + + ARGE_UNLOCK(sc); +} + +static void +arge_set_pll(struct arge_softc *sc, int media, int duplex) +{ + uint32_t cfg, ifcontrol, rx_filtmask, pll, sec_cfg; + + cfg = ARGE_READ(sc, AR71XX_MAC_CFG2); + cfg &= ~(MAC_CFG2_IFACE_MODE_1000 + | MAC_CFG2_IFACE_MODE_10_100 + | MAC_CFG2_FULL_DUPLEX); + + if (duplex == IFM_FDX) + cfg |= MAC_CFG2_FULL_DUPLEX; + + ifcontrol = ARGE_READ(sc, AR71XX_MAC_IFCONTROL); + ifcontrol &= ~MAC_IFCONTROL_SPEED; + rx_filtmask = + ARGE_READ(sc, AR71XX_MAC_FIFO_RX_FILTMASK); + rx_filtmask &= ~FIFO_RX_MASK_BYTE_MODE; + + switch(media) { + case IFM_10_T: + cfg |= MAC_CFG2_IFACE_MODE_10_100; + pll = PLL_ETH_INT_CLK_10; + break; + case IFM_100_TX: + cfg |= MAC_CFG2_IFACE_MODE_10_100; + ifcontrol |= MAC_IFCONTROL_SPEED; + pll = PLL_ETH_INT_CLK_100; + break; + case IFM_1000_T: + case IFM_1000_SX: + cfg |= MAC_CFG2_IFACE_MODE_1000; + rx_filtmask |= FIFO_RX_MASK_BYTE_MODE; + pll = PLL_ETH_INT_CLK_1000; + break; + default: + pll = PLL_ETH_INT_CLK_100; + device_printf(sc->arge_dev, + "Unknown media %d\n", media); + } + + ARGE_WRITE(sc, AR71XX_MAC_FIFO_TX_THRESHOLD, + 0x008001ff); + + ARGE_WRITE(sc, AR71XX_MAC_CFG2, cfg); + ARGE_WRITE(sc, AR71XX_MAC_IFCONTROL, ifcontrol); + ARGE_WRITE(sc, AR71XX_MAC_FIFO_RX_FILTMASK, + rx_filtmask); + + /* set PLL registers */ + sec_cfg = ATH_READ_REG(AR71XX_PLL_SEC_CONFIG); + sec_cfg &= ~(3 << sc->arge_pll_reg_shift); + sec_cfg |= (2 << sc->arge_pll_reg_shift); + + ATH_WRITE_REG(AR71XX_PLL_SEC_CONFIG, sec_cfg); + DELAY(100); + + ATH_WRITE_REG(sc->arge_pll_reg, pll); + + sec_cfg |= (3 << sc->arge_pll_reg_shift); + ATH_WRITE_REG(AR71XX_PLL_SEC_CONFIG, sec_cfg); + DELAY(100); + + sec_cfg &= ~(3 << sc->arge_pll_reg_shift); + ATH_WRITE_REG(AR71XX_PLL_SEC_CONFIG, sec_cfg); + DELAY(100); +} + + +static void +arge_reset_dma(struct arge_softc *sc) +{ + ARGE_WRITE(sc, AR71XX_DMA_RX_CONTROL, 0); + ARGE_WRITE(sc, AR71XX_DMA_TX_CONTROL, 0); + + ARGE_WRITE(sc, AR71XX_DMA_RX_DESC, 0); + ARGE_WRITE(sc, AR71XX_DMA_TX_DESC, 0); + + /* Clear all possible RX interrupts */ + while(ARGE_READ(sc, AR71XX_DMA_RX_STATUS) & DMA_RX_STATUS_PKT_RECVD) + ARGE_WRITE(sc, AR71XX_DMA_RX_STATUS, DMA_RX_STATUS_PKT_RECVD); + + /* + * Clear all possible TX interrupts + */ + while(ARGE_READ(sc, AR71XX_DMA_TX_STATUS) & DMA_TX_STATUS_PKT_SENT) + ARGE_WRITE(sc, AR71XX_DMA_TX_STATUS, DMA_TX_STATUS_PKT_SENT); + + /* + * Now Rx/Tx errors + */ + ARGE_WRITE(sc, AR71XX_DMA_RX_STATUS, + DMA_RX_STATUS_BUS_ERROR | DMA_RX_STATUS_OVERFLOW); + ARGE_WRITE(sc, AR71XX_DMA_TX_STATUS, + DMA_TX_STATUS_BUS_ERROR | DMA_TX_STATUS_UNDERRUN); +} + + + +static void +arge_init(void *xsc) +{ + struct arge_softc *sc = xsc; + + ARGE_LOCK(sc); + arge_init_locked(sc); + ARGE_UNLOCK(sc); +} + +static void +arge_init_locked(struct arge_softc *sc) +{ + struct ifnet *ifp = sc->arge_ifp; + struct mii_data *mii; + + ARGE_LOCK_ASSERT(sc); + + arge_stop(sc); + + /* Init circular RX list. */ + if (arge_rx_ring_init(sc) != 0) { + device_printf(sc->arge_dev, + "initialization failed: no memory for rx buffers\n"); + arge_stop(sc); + return; + } + + /* Init tx descriptors. */ + arge_tx_ring_init(sc); + + arge_reset_dma(sc); + + + if (sc->arge_miibus) { + sc->arge_link_status = 0; + mii = device_get_softc(sc->arge_miibus); + mii_mediachg(mii); + } + else { + /* + * Sun always shines over multiPHY interface + */ + sc->arge_link_status = 1; + } + + ifp->if_drv_flags |= IFF_DRV_RUNNING; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + + if (sc->arge_miibus) + callout_reset(&sc->arge_stat_callout, hz, arge_tick, sc); + + ARGE_WRITE(sc, AR71XX_DMA_TX_DESC, ARGE_TX_RING_ADDR(sc, 0)); + ARGE_WRITE(sc, AR71XX_DMA_RX_DESC, ARGE_RX_RING_ADDR(sc, 0)); + + /* Start listening */ + ARGE_WRITE(sc, AR71XX_DMA_RX_CONTROL, DMA_RX_CONTROL_EN); + + /* Enable interrupts */ + ARGE_WRITE(sc, AR71XX_DMA_INTR, DMA_INTR_ALL); +} + +/* + * Encapsulate an mbuf chain in a descriptor by coupling the mbuf data + * pointers to the fragment pointers. + */ +static int +arge_encap(struct arge_softc *sc, struct mbuf **m_head) +{ + struct arge_txdesc *txd; + struct arge_desc *desc, *prev_desc; + bus_dma_segment_t txsegs[ARGE_MAXFRAGS]; + int error, i, nsegs, prod, prev_prod; + struct mbuf *m; + + ARGE_LOCK_ASSERT(sc); + + /* + * Fix mbuf chain, all fragments should be 4 bytes aligned and + * even 4 bytes + */ + m = *m_head; + if((mtod(m, intptr_t) & 3) != 0) { + m = m_defrag(*m_head, M_DONTWAIT); + if (m == NULL) { + *m_head = NULL; + return (ENOBUFS); + } + *m_head = m; + } + + prod = sc->arge_cdata.arge_tx_prod; + txd = &sc->arge_cdata.arge_txdesc[prod]; + error = bus_dmamap_load_mbuf_sg(sc->arge_cdata.arge_tx_tag, + txd->tx_dmamap, *m_head, txsegs, &nsegs, BUS_DMA_NOWAIT); + + if (error == EFBIG) { + panic("EFBIG"); + } else if (error != 0) + return (error); + + if (nsegs == 0) { + m_freem(*m_head); + *m_head = NULL; + return (EIO); + } + + /* Check number of available descriptors. */ + if (sc->arge_cdata.arge_tx_cnt + nsegs >= (ARGE_TX_RING_COUNT - 1)) { + bus_dmamap_unload(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap); + return (ENOBUFS); + } + + txd->tx_m = *m_head; + bus_dmamap_sync(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap, + BUS_DMASYNC_PREWRITE); + + /* + * Make a list of descriptors for this packet. DMA controller will + * walk through it while arge_link is not zero. + */ + prev_prod = prod; + desc = prev_desc = NULL; + for (i = 0; i < nsegs; i++) { + desc = &sc->arge_rdata.arge_tx_ring[prod]; + desc->packet_ctrl = ARGE_DMASIZE(txsegs[i].ds_len); + + if (txsegs[i].ds_addr & 3) + panic("TX packet address unaligned\n"); + + desc->packet_addr = txsegs[i].ds_addr; + + /* link with previous descriptor */ + if (prev_desc) + prev_desc->packet_ctrl |= ARGE_DESC_MORE; + + sc->arge_cdata.arge_tx_cnt++; + prev_desc = desc; + ARGE_INC(prod, ARGE_TX_RING_COUNT); + } + + /* Update producer index. */ + sc->arge_cdata.arge_tx_prod = prod; + + /* Sync descriptors. */ + bus_dmamap_sync(sc->arge_cdata.arge_tx_ring_tag, + sc->arge_cdata.arge_tx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + + /* Start transmitting */ + ARGE_WRITE(sc, AR71XX_DMA_TX_CONTROL, DMA_TX_CONTROL_EN); + return (0); +} + +static void +arge_start(struct ifnet *ifp) +{ + struct arge_softc *sc; + + sc = ifp->if_softc; + + ARGE_LOCK(sc); + arge_start_locked(ifp); + ARGE_UNLOCK(sc); +} + +static void +arge_start_locked(struct ifnet *ifp) +{ + struct arge_softc *sc; + struct mbuf *m_head; + int enq; + + sc = ifp->if_softc; + + ARGE_LOCK_ASSERT(sc); + + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING || sc->arge_link_status == 0 ) + return; + + arge_flush_ddr(sc); + + for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd) && + sc->arge_cdata.arge_tx_cnt < ARGE_TX_RING_COUNT - 2; ) { + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); + if (m_head == NULL) + break; + + + /* + * Pack the data into the transmit ring. + */ + if (arge_encap(sc, &m_head)) { + if (m_head == NULL) + break; + IFQ_DRV_PREPEND(&ifp->if_snd, m_head); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + break; + } + + enq++; + /* + * If there's a BPF listener, bounce a copy of this frame + * to him. + */ + ETHER_BPF_MTAP(ifp, m_head); + } +} + +static void +arge_stop(struct arge_softc *sc) +{ + struct ifnet *ifp; + + ARGE_LOCK_ASSERT(sc); + + ifp = sc->arge_ifp; + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + if (sc->arge_miibus) + callout_stop(&sc->arge_stat_callout); + + /* mask out interrupts */ + ARGE_WRITE(sc, AR71XX_DMA_INTR, 0); + + arge_reset_dma(sc); +} + + +static int +arge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) +{ + struct arge_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *) data; + struct mii_data *mii; + int error; +#ifdef DEVICE_POLLING + int mask; +#endif + + switch (command) { + case SIOCSIFFLAGS: + ARGE_LOCK(sc); + if ((ifp->if_flags & IFF_UP) != 0) { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + if (((ifp->if_flags ^ sc->arge_if_flags) + & (IFF_PROMISC | IFF_ALLMULTI)) != 0) { + /* XXX: handle promisc & multi flags */ + } + + } else { + if (!sc->arge_detach) + arge_init_locked(sc); + } + } else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + arge_stop(sc); + } + sc->arge_if_flags = ifp->if_flags; + ARGE_UNLOCK(sc); + error = 0; + break; + case SIOCADDMULTI: + case SIOCDELMULTI: + /* XXX: implement SIOCDELMULTI */ + error = 0; + break; + case SIOCGIFMEDIA: + case SIOCSIFMEDIA: + if (sc->arge_miibus) { + mii = device_get_softc(sc->arge_miibus); + error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command); + } + else + error = ifmedia_ioctl(ifp, ifr, &sc->arge_ifmedia, command); + break; + case SIOCSIFCAP: + /* XXX: Check other capabilities */ +#ifdef DEVICE_POLLING + mask = ifp->if_capenable ^ ifr->ifr_reqcap; + if (mask & IFCAP_POLLING) { + if (ifr->ifr_reqcap & IFCAP_POLLING) { + ARGE_WRITE(sc, AR71XX_DMA_INTR, 0); + error = ether_poll_register(arge_poll, ifp); + if (error) + return error; + ARGE_LOCK(sc); + ifp->if_capenable |= IFCAP_POLLING; + ARGE_UNLOCK(sc); + } else { + ARGE_WRITE(sc, AR71XX_DMA_INTR, DMA_INTR_ALL); + error = ether_poll_deregister(ifp); + ARGE_LOCK(sc); + ifp->if_capenable &= ~IFCAP_POLLING; + ARGE_UNLOCK(sc); + } + } + error = 0; + break; +#endif + default: + error = ether_ioctl(ifp, command, data); + break; + } + + return (error); +} + +/* + * Set media options. + */ +static int +arge_ifmedia_upd(struct ifnet *ifp) +{ + struct arge_softc *sc; + struct mii_data *mii; + struct mii_softc *miisc; + int error; + + sc = ifp->if_softc; + ARGE_LOCK(sc); + mii = device_get_softc(sc->arge_miibus); + if (mii->mii_instance) { + LIST_FOREACH(miisc, &mii->mii_phys, mii_list) + mii_phy_reset(miisc); + } + error = mii_mediachg(mii); + ARGE_UNLOCK(sc); + + return (error); +} + +/* + * Report current media status. + */ +static void +arge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + struct arge_softc *sc = ifp->if_softc; + struct mii_data *mii; + + mii = device_get_softc(sc->arge_miibus); + ARGE_LOCK(sc); + mii_pollstat(mii); + ARGE_UNLOCK(sc); + ifmr->ifm_active = mii->mii_media_active; + ifmr->ifm_status = mii->mii_media_status; +} + +struct arge_dmamap_arg { + bus_addr_t arge_busaddr; +}; + +static void +arge_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) +{ + struct arge_dmamap_arg *ctx; + + if (error != 0) + return; + ctx = arg; + ctx->arge_busaddr = segs[0].ds_addr; +} + +static int +arge_dma_alloc(struct arge_softc *sc) +{ + struct arge_dmamap_arg ctx; + struct arge_txdesc *txd; + struct arge_rxdesc *rxd; + int error, i; + + /* Create parent DMA tag. */ + error = bus_dma_tag_create( + bus_get_dma_tag(sc->arge_dev), /* parent */ + 1, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ + 0, /* nsegments */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->arge_cdata.arge_parent_tag); + if (error != 0) { + device_printf(sc->arge_dev, "failed to create parent DMA tag\n"); + goto fail; + } + /* Create tag for Tx ring. */ + error = bus_dma_tag_create( + sc->arge_cdata.arge_parent_tag, /* parent */ + ARGE_RING_ALIGN, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + ARGE_TX_DMA_SIZE, /* maxsize */ + 1, /* nsegments */ + ARGE_TX_DMA_SIZE, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->arge_cdata.arge_tx_ring_tag); + if (error != 0) { + device_printf(sc->arge_dev, "failed to create Tx ring DMA tag\n"); + goto fail; + } + + /* Create tag for Rx ring. */ + error = bus_dma_tag_create( + sc->arge_cdata.arge_parent_tag, /* parent */ + ARGE_RING_ALIGN, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + ARGE_RX_DMA_SIZE, /* maxsize */ + 1, /* nsegments */ + ARGE_RX_DMA_SIZE, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->arge_cdata.arge_rx_ring_tag); + if (error != 0) { + device_printf(sc->arge_dev, "failed to create Rx ring DMA tag\n"); + goto fail; + } + + /* Create tag for Tx buffers. */ + error = bus_dma_tag_create( + sc->arge_cdata.arge_parent_tag, /* parent */ + sizeof(uint32_t), 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MCLBYTES * ARGE_MAXFRAGS, /* maxsize */ + ARGE_MAXFRAGS, /* nsegments */ + MCLBYTES, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->arge_cdata.arge_tx_tag); + if (error != 0) { + device_printf(sc->arge_dev, "failed to create Tx DMA tag\n"); + goto fail; + } + + /* Create tag for Rx buffers. */ + error = bus_dma_tag_create( + sc->arge_cdata.arge_parent_tag, /* parent */ + ARGE_RX_ALIGN, 0, /* alignment, boundary */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MCLBYTES, /* maxsize */ + ARGE_MAXFRAGS, /* nsegments */ + MCLBYTES, /* maxsegsize */ + 0, /* flags */ + NULL, NULL, /* lockfunc, lockarg */ + &sc->arge_cdata.arge_rx_tag); + if (error != 0) { + device_printf(sc->arge_dev, "failed to create Rx DMA tag\n"); + goto fail; + } + + /* Allocate DMA'able memory and load the DMA map for Tx ring. */ + error = bus_dmamem_alloc(sc->arge_cdata.arge_tx_ring_tag, + (void **)&sc->arge_rdata.arge_tx_ring, BUS_DMA_WAITOK | + BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->arge_cdata.arge_tx_ring_map); + if (error != 0) { + device_printf(sc->arge_dev, + "failed to allocate DMA'able memory for Tx ring\n"); + goto fail; + } + + ctx.arge_busaddr = 0; + error = bus_dmamap_load(sc->arge_cdata.arge_tx_ring_tag, + sc->arge_cdata.arge_tx_ring_map, sc->arge_rdata.arge_tx_ring, + ARGE_TX_DMA_SIZE, arge_dmamap_cb, &ctx, 0); + if (error != 0 || ctx.arge_busaddr == 0) { + device_printf(sc->arge_dev, + "failed to load DMA'able memory for Tx ring\n"); + goto fail; + } + sc->arge_rdata.arge_tx_ring_paddr = ctx.arge_busaddr; + + /* Allocate DMA'able memory and load the DMA map for Rx ring. */ + error = bus_dmamem_alloc(sc->arge_cdata.arge_rx_ring_tag, + (void **)&sc->arge_rdata.arge_rx_ring, BUS_DMA_WAITOK | + BUS_DMA_COHERENT | BUS_DMA_ZERO, &sc->arge_cdata.arge_rx_ring_map); + if (error != 0) { + device_printf(sc->arge_dev, + "failed to allocate DMA'able memory for Rx ring\n"); + goto fail; + } + + ctx.arge_busaddr = 0; + error = bus_dmamap_load(sc->arge_cdata.arge_rx_ring_tag, + sc->arge_cdata.arge_rx_ring_map, sc->arge_rdata.arge_rx_ring, + ARGE_RX_DMA_SIZE, arge_dmamap_cb, &ctx, 0); + if (error != 0 || ctx.arge_busaddr == 0) { + device_printf(sc->arge_dev, + "failed to load DMA'able memory for Rx ring\n"); + goto fail; + } + sc->arge_rdata.arge_rx_ring_paddr = ctx.arge_busaddr; + + /* Create DMA maps for Tx buffers. */ + for (i = 0; i < ARGE_TX_RING_COUNT; i++) { + txd = &sc->arge_cdata.arge_txdesc[i]; + txd->tx_m = NULL; + txd->tx_dmamap = NULL; + error = bus_dmamap_create(sc->arge_cdata.arge_tx_tag, 0, + &txd->tx_dmamap); + if (error != 0) { + device_printf(sc->arge_dev, + "failed to create Tx dmamap\n"); + goto fail; + } + } + /* Create DMA maps for Rx buffers. */ + if ((error = bus_dmamap_create(sc->arge_cdata.arge_rx_tag, 0, + &sc->arge_cdata.arge_rx_sparemap)) != 0) { + device_printf(sc->arge_dev, + "failed to create spare Rx dmamap\n"); + goto fail; + } + for (i = 0; i < ARGE_RX_RING_COUNT; i++) { + rxd = &sc->arge_cdata.arge_rxdesc[i]; + rxd->rx_m = NULL; + rxd->rx_dmamap = NULL; + error = bus_dmamap_create(sc->arge_cdata.arge_rx_tag, 0, + &rxd->rx_dmamap); + if (error != 0) { + device_printf(sc->arge_dev, + "failed to create Rx dmamap\n"); + goto fail; + } + } + +fail: + return (error); +} + +static void +arge_dma_free(struct arge_softc *sc) +{ + struct arge_txdesc *txd; + struct arge_rxdesc *rxd; + int i; + + /* Tx ring. */ + if (sc->arge_cdata.arge_tx_ring_tag) { + if (sc->arge_cdata.arge_tx_ring_map) + bus_dmamap_unload(sc->arge_cdata.arge_tx_ring_tag, + sc->arge_cdata.arge_tx_ring_map); + if (sc->arge_cdata.arge_tx_ring_map && + sc->arge_rdata.arge_tx_ring) + bus_dmamem_free(sc->arge_cdata.arge_tx_ring_tag, + sc->arge_rdata.arge_tx_ring, + sc->arge_cdata.arge_tx_ring_map); + sc->arge_rdata.arge_tx_ring = NULL; + sc->arge_cdata.arge_tx_ring_map = NULL; + bus_dma_tag_destroy(sc->arge_cdata.arge_tx_ring_tag); + sc->arge_cdata.arge_tx_ring_tag = NULL; + } + /* Rx ring. */ + if (sc->arge_cdata.arge_rx_ring_tag) { + if (sc->arge_cdata.arge_rx_ring_map) + bus_dmamap_unload(sc->arge_cdata.arge_rx_ring_tag, + sc->arge_cdata.arge_rx_ring_map); + if (sc->arge_cdata.arge_rx_ring_map && + sc->arge_rdata.arge_rx_ring) + bus_dmamem_free(sc->arge_cdata.arge_rx_ring_tag, + sc->arge_rdata.arge_rx_ring, + sc->arge_cdata.arge_rx_ring_map); + sc->arge_rdata.arge_rx_ring = NULL; + sc->arge_cdata.arge_rx_ring_map = NULL; + bus_dma_tag_destroy(sc->arge_cdata.arge_rx_ring_tag); + sc->arge_cdata.arge_rx_ring_tag = NULL; + } + /* Tx buffers. */ + if (sc->arge_cdata.arge_tx_tag) { + for (i = 0; i < ARGE_TX_RING_COUNT; i++) { + txd = &sc->arge_cdata.arge_txdesc[i]; + if (txd->tx_dmamap) { + bus_dmamap_destroy(sc->arge_cdata.arge_tx_tag, + txd->tx_dmamap); + txd->tx_dmamap = NULL; + } + } + bus_dma_tag_destroy(sc->arge_cdata.arge_tx_tag); + sc->arge_cdata.arge_tx_tag = NULL; + } + /* Rx buffers. */ + if (sc->arge_cdata.arge_rx_tag) { + for (i = 0; i < ARGE_RX_RING_COUNT; i++) { + rxd = &sc->arge_cdata.arge_rxdesc[i]; + if (rxd->rx_dmamap) { + bus_dmamap_destroy(sc->arge_cdata.arge_rx_tag, + rxd->rx_dmamap); + rxd->rx_dmamap = NULL; + } + } + if (sc->arge_cdata.arge_rx_sparemap) { + bus_dmamap_destroy(sc->arge_cdata.arge_rx_tag, + sc->arge_cdata.arge_rx_sparemap); + sc->arge_cdata.arge_rx_sparemap = 0; + } + bus_dma_tag_destroy(sc->arge_cdata.arge_rx_tag); + sc->arge_cdata.arge_rx_tag = NULL; + } + + if (sc->arge_cdata.arge_parent_tag) { + bus_dma_tag_destroy(sc->arge_cdata.arge_parent_tag); + sc->arge_cdata.arge_parent_tag = NULL; + } +} + +/* + * Initialize the transmit descriptors. + */ +static int +arge_tx_ring_init(struct arge_softc *sc) +{ + struct arge_ring_data *rd; + struct arge_txdesc *txd; + bus_addr_t addr; + int i; + + sc->arge_cdata.arge_tx_prod = 0; + sc->arge_cdata.arge_tx_cons = 0; + sc->arge_cdata.arge_tx_cnt = 0; + sc->arge_cdata.arge_tx_pkts = 0; + + rd = &sc->arge_rdata; + bzero(rd->arge_tx_ring, sizeof(rd->arge_tx_ring)); + for (i = 0; i < ARGE_TX_RING_COUNT; i++) { + if (i == ARGE_TX_RING_COUNT - 1) + addr = ARGE_TX_RING_ADDR(sc, 0); + else + addr = ARGE_TX_RING_ADDR(sc, i + 1); + rd->arge_tx_ring[i].packet_ctrl = ARGE_DESC_EMPTY; + rd->arge_tx_ring[i].next_desc = addr; + txd = &sc->arge_cdata.arge_txdesc[i]; + txd->tx_m = NULL; + } + + bus_dmamap_sync(sc->arge_cdata.arge_tx_ring_tag, + sc->arge_cdata.arge_tx_ring_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + + return (0); +} + +/* + * Initialize the RX descriptors and allocate mbufs for them. Note that + * we arrange the descriptors in a closed ring, so that the last descriptor + * points back to the first. + */ +static int +arge_rx_ring_init(struct arge_softc *sc) +{ + struct arge_ring_data *rd; + struct arge_rxdesc *rxd; + bus_addr_t addr; + int i; + + sc->arge_cdata.arge_rx_cons = 0; + + rd = &sc->arge_rdata; + bzero(rd->arge_rx_ring, sizeof(rd->arge_rx_ring)); + for (i = 0; i < ARGE_RX_RING_COUNT; i++) { + rxd = &sc->arge_cdata.arge_rxdesc[i]; + rxd->rx_m = NULL; + rxd->desc = &rd->arge_rx_ring[i]; + if (i == ARGE_RX_RING_COUNT - 1) + addr = ARGE_RX_RING_ADDR(sc, 0); + else + addr = ARGE_RX_RING_ADDR(sc, i + 1); + rd->arge_rx_ring[i].next_desc = addr; + if (arge_newbuf(sc, i) != 0) { + return (ENOBUFS); + } + } + + bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag, + sc->arge_cdata.arge_rx_ring_map, + BUS_DMASYNC_PREWRITE); + + return (0); +} + +/* + * Initialize an RX descriptor and attach an MBUF cluster. + */ +static int +arge_newbuf(struct arge_softc *sc, int idx) +{ + struct arge_desc *desc; + struct arge_rxdesc *rxd; + struct mbuf *m; + bus_dma_segment_t segs[1]; + bus_dmamap_t map; + int nsegs; + + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m == NULL) + return (ENOBUFS); + m->m_len = m->m_pkthdr.len = MCLBYTES; + m_adj(m, sizeof(uint64_t)); + + if (bus_dmamap_load_mbuf_sg(sc->arge_cdata.arge_rx_tag, + sc->arge_cdata.arge_rx_sparemap, m, segs, &nsegs, 0) != 0) { + m_freem(m); + return (ENOBUFS); + } + KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs)); + + rxd = &sc->arge_cdata.arge_rxdesc[idx]; + if (rxd->rx_m != NULL) { + bus_dmamap_unload(sc->arge_cdata.arge_rx_tag, rxd->rx_dmamap); + } + map = rxd->rx_dmamap; + rxd->rx_dmamap = sc->arge_cdata.arge_rx_sparemap; + sc->arge_cdata.arge_rx_sparemap = map; + rxd->rx_m = m; + desc = rxd->desc; + if (segs[0].ds_addr & 3) + panic("RX packet address unaligned"); + desc->packet_addr = segs[0].ds_addr; + desc->packet_ctrl = ARGE_DESC_EMPTY | ARGE_DMASIZE(segs[0].ds_len); + + bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag, + sc->arge_cdata.arge_rx_ring_map, + BUS_DMASYNC_PREWRITE); + + return (0); +} + +static __inline void +arge_fixup_rx(struct mbuf *m) +{ + int i; + uint16_t *src, *dst; + + src = mtod(m, uint16_t *); + dst = src - 1; + + for (i = 0; i < m->m_len / sizeof(uint16_t); i++) { + *dst++ = *src++; + } + + if (m->m_len % sizeof(uint16_t)) + *(uint8_t *)dst = *(uint8_t *)src; + + m->m_data -= ETHER_ALIGN; +} + +#ifdef DEVICE_POLLING +static int +arge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) +{ + struct arge_softc *sc = ifp->if_softc; + int rx_npkts = 0; + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + ARGE_LOCK(sc); + arge_tx_locked(sc); + rx_npkts = arge_rx_locked(sc); + ARGE_UNLOCK(sc); + } + + return (rx_npkts); +} +#endif /* DEVICE_POLLING */ + + +static void +arge_tx_locked(struct arge_softc *sc) +{ + struct arge_txdesc *txd; + struct arge_desc *cur_tx; + struct ifnet *ifp; + uint32_t ctrl; + int cons, prod; + + ARGE_LOCK_ASSERT(sc); + + cons = sc->arge_cdata.arge_tx_cons; + prod = sc->arge_cdata.arge_tx_prod; + if (cons == prod) + return; + + bus_dmamap_sync(sc->arge_cdata.arge_tx_ring_tag, + sc->arge_cdata.arge_tx_ring_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + ifp = sc->arge_ifp; + /* + * Go through our tx list and free mbufs for those + * frames that have been transmitted. + */ + for (; cons != prod; ARGE_INC(cons, ARGE_TX_RING_COUNT)) { + cur_tx = &sc->arge_rdata.arge_tx_ring[cons]; + ctrl = cur_tx->packet_ctrl; + /* Check if descriptor has "finished" flag */ + if ((ctrl & ARGE_DESC_EMPTY) == 0) + break; + + ARGE_WRITE(sc, AR71XX_DMA_TX_STATUS, DMA_TX_STATUS_PKT_SENT); + + sc->arge_cdata.arge_tx_cnt--; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + + txd = &sc->arge_cdata.arge_txdesc[cons]; + + ifp->if_opackets++; + + bus_dmamap_sync(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->arge_cdata.arge_tx_tag, txd->tx_dmamap); + + /* Free only if it's first descriptor in list */ + if (txd->tx_m) + m_freem(txd->tx_m); + txd->tx_m = NULL; + + /* reset descriptor */ + cur_tx->packet_addr = 0; + } + + sc->arge_cdata.arge_tx_cons = cons; + + bus_dmamap_sync(sc->arge_cdata.arge_tx_ring_tag, + sc->arge_cdata.arge_tx_ring_map, BUS_DMASYNC_PREWRITE); +} + + +static int +arge_rx_locked(struct arge_softc *sc) +{ + struct arge_rxdesc *rxd; + struct ifnet *ifp = sc->arge_ifp; + int cons, prog, packet_len, i; + struct arge_desc *cur_rx; + struct mbuf *m; + int rx_npkts = 0; + + ARGE_LOCK_ASSERT(sc); + + cons = sc->arge_cdata.arge_rx_cons; + + bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag, + sc->arge_cdata.arge_rx_ring_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + + for (prog = 0; prog < ARGE_RX_RING_COUNT; + ARGE_INC(cons, ARGE_RX_RING_COUNT)) { + cur_rx = &sc->arge_rdata.arge_rx_ring[cons]; + rxd = &sc->arge_cdata.arge_rxdesc[cons]; + m = rxd->rx_m; + + if ((cur_rx->packet_ctrl & ARGE_DESC_EMPTY) != 0) + break; + + ARGE_WRITE(sc, AR71XX_DMA_RX_STATUS, DMA_RX_STATUS_PKT_RECVD); + + prog++; + + packet_len = ARGE_DMASIZE(cur_rx->packet_ctrl); + bus_dmamap_sync(sc->arge_cdata.arge_rx_tag, rxd->rx_dmamap, + BUS_DMASYNC_POSTREAD); + m = rxd->rx_m; + + arge_fixup_rx(m); + m->m_pkthdr.rcvif = ifp; + /* Skip 4 bytes of CRC */ + m->m_pkthdr.len = m->m_len = packet_len - ETHER_CRC_LEN; + ifp->if_ipackets++; + rx_npkts++; + + ARGE_UNLOCK(sc); + (*ifp->if_input)(ifp, m); + ARGE_LOCK(sc); + cur_rx->packet_addr = 0; + } + + if (prog > 0) { + + i = sc->arge_cdata.arge_rx_cons; + for (; prog > 0 ; prog--) { + if (arge_newbuf(sc, i) != 0) { + device_printf(sc->arge_dev, + "Failed to allocate buffer\n"); + break; + } + ARGE_INC(i, ARGE_RX_RING_COUNT); + } + + bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag, + sc->arge_cdata.arge_rx_ring_map, + BUS_DMASYNC_PREWRITE); + + sc->arge_cdata.arge_rx_cons = cons; + } + + return (rx_npkts); +} + +static int +arge_intr_filter(void *arg) +{ + struct arge_softc *sc = arg; + uint32_t status, ints; + + status = ARGE_READ(sc, AR71XX_DMA_INTR_STATUS); + ints = ARGE_READ(sc, AR71XX_DMA_INTR); + +#if 0 + dprintf("int mask(filter) = %b\n", ints, + "\20\10RX_BUS_ERROR\7RX_OVERFLOW\5RX_PKT_RCVD" + "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT"); + dprintf("status(filter) = %b\n", status, + "\20\10RX_BUS_ERROR\7RX_OVERFLOW\5RX_PKT_RCVD" + "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT"); +#endif + + if (status & DMA_INTR_ALL) { + sc->arge_intr_status |= status; + ARGE_WRITE(sc, AR71XX_DMA_INTR, 0); + return (FILTER_SCHEDULE_THREAD); + } + + sc->arge_intr_status = 0; + return (FILTER_STRAY); +} + +static void +arge_intr(void *arg) +{ + struct arge_softc *sc = arg; + uint32_t status; + + status = ARGE_READ(sc, AR71XX_DMA_INTR_STATUS); + status |= sc->arge_intr_status; + +#if 0 + dprintf("int status(intr) = %b\n", status, + "\20\10\7RX_OVERFLOW\5RX_PKT_RCVD" + "\4TX_BUS_ERROR\2TX_UNDERRUN\1TX_PKT_SENT"); +#endif + + /* + * Is it our interrupt at all? + */ + if (status == 0) + return; + + if (status & DMA_INTR_RX_BUS_ERROR) { + ARGE_WRITE(sc, AR71XX_DMA_RX_STATUS, DMA_RX_STATUS_BUS_ERROR); + device_printf(sc->arge_dev, "RX bus error"); + return; + } + + if (status & DMA_INTR_TX_BUS_ERROR) { + ARGE_WRITE(sc, AR71XX_DMA_TX_STATUS, DMA_TX_STATUS_BUS_ERROR); + device_printf(sc->arge_dev, "TX bus error"); + return; + } + + ARGE_LOCK(sc); + + if (status & DMA_INTR_RX_PKT_RCVD) + arge_rx_locked(sc); + + /* + * RX overrun disables the receiver. + * Clear indication and re-enable rx. + */ + if ( status & DMA_INTR_RX_OVERFLOW) { + ARGE_WRITE(sc, AR71XX_DMA_RX_STATUS, DMA_RX_STATUS_OVERFLOW); + ARGE_WRITE(sc, AR71XX_DMA_RX_CONTROL, DMA_RX_CONTROL_EN); + } + + if (status & DMA_INTR_TX_PKT_SENT) + arge_tx_locked(sc); + /* + * Underrun turns off TX. Clear underrun indication. + * If there's anything left in the ring, reactivate the tx. + */ + if (status & DMA_INTR_TX_UNDERRUN) { + ARGE_WRITE(sc, AR71XX_DMA_TX_STATUS, DMA_TX_STATUS_UNDERRUN); + if (sc->arge_cdata.arge_tx_pkts > 0 ) { + ARGE_WRITE(sc, AR71XX_DMA_TX_CONTROL, + DMA_TX_CONTROL_EN); + } + } + + /* + * We handled all bits, clear status + */ + sc->arge_intr_status = 0; + ARGE_UNLOCK(sc); + /* + * re-enable all interrupts + */ + ARGE_WRITE(sc, AR71XX_DMA_INTR, DMA_INTR_ALL); +} + + +static void +arge_tick(void *xsc) +{ + struct arge_softc *sc = xsc; + struct mii_data *mii; + + ARGE_LOCK_ASSERT(sc); + + if (sc->arge_miibus) { + mii = device_get_softc(sc->arge_miibus); + mii_tick(mii); + callout_reset(&sc->arge_stat_callout, hz, arge_tick, sc); + } +} + +int +arge_multiphy_mediachange(struct ifnet *ifp) +{ + struct arge_softc *sc = ifp->if_softc; + struct ifmedia *ifm = &sc->arge_ifmedia; + struct ifmedia_entry *ife = ifm->ifm_cur; + + if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) + return (EINVAL); + + if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { + device_printf(sc->arge_dev, + "AUTO is not supported for multiphy MAC"); + return (EINVAL); + } + + /* + * Ignore everything + */ + return (0); +} + +void +arge_multiphy_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + struct arge_softc *sc = ifp->if_softc; + + ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; + ifmr->ifm_active = IFM_ETHER | sc->arge_media_type | + sc->arge_duplex_mode; +} + diff --git a/sys/mips/atheros/if_argevar.h b/sys/mips/atheros/if_argevar.h new file mode 100644 index 000000000000..bfa45099cc96 --- /dev/null +++ b/sys/mips/atheros/if_argevar.h @@ -0,0 +1,157 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#ifndef __IF_ARGEVAR_H__ +#define __IF_ARGEVAR_H__ + +#define ARGE_NPHY 32 +#define ARGE_TX_RING_COUNT 128 +#define ARGE_RX_RING_COUNT 128 +#define ARGE_RX_DMA_SIZE ARGE_RX_RING_COUNT * sizeof(struct arge_desc) +#define ARGE_TX_DMA_SIZE ARGE_TX_RING_COUNT * sizeof(struct arge_desc) +#define ARGE_MAXFRAGS 8 +#define ARGE_RING_ALIGN sizeof(struct arge_desc) +#define ARGE_RX_ALIGN sizeof(uint32_t) +#define ARGE_MAXFRAGS 8 +#define ARGE_TX_RING_ADDR(sc, i) \ + ((sc)->arge_rdata.arge_tx_ring_paddr + sizeof(struct arge_desc) * (i)) +#define ARGE_RX_RING_ADDR(sc, i) \ + ((sc)->arge_rdata.arge_rx_ring_paddr + sizeof(struct arge_desc) * (i)) +#define ARGE_INC(x,y) (x) = (((x) + 1) % y) + + +#define ARGE_MII_TIMEOUT 1000 + +#define ARGE_LOCK(_sc) mtx_lock(&(_sc)->arge_mtx) +#define ARGE_UNLOCK(_sc) mtx_unlock(&(_sc)->arge_mtx) +#define ARGE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->arge_mtx, MA_OWNED) + +/* + * register space access macros + */ +#define ARGE_WRITE(sc, reg, val) do { \ + bus_write_4(sc->arge_res, (reg), (val)); \ + } while (0) + +#define ARGE_READ(sc, reg) bus_read_4(sc->arge_res, (reg)) + +#define ARGE_SET_BITS(sc, reg, bits) \ + ARGE_WRITE(sc, reg, ARGE_READ(sc, (reg)) | (bits)) + +#define ARGE_CLEAR_BITS(sc, reg, bits) \ + ARGE_WRITE(sc, reg, ARGE_READ(sc, (reg)) & ~(bits)) + +/* + * MII registers access macros + */ +#define ARGE_MII_READ(reg) \ + *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1((AR71XX_MII_BASE + reg))) + +#define ARGE_MII_WRITE(reg, val) \ + *((volatile uint32_t *)MIPS_PHYS_TO_KSEG1((AR71XX_MII_BASE + reg))) = (val) + + +#define ARGE_DESC_EMPTY (1 << 31) +#define ARGE_DESC_MORE (1 << 24) +#define ARGE_DESC_SIZE_MASK ((1 << 12) - 1) +#define ARGE_DMASIZE(len) ((len) & ARGE_DESC_SIZE_MASK) +struct arge_desc { + uint32_t packet_addr; + uint32_t packet_ctrl; + uint32_t next_desc; + uint32_t padding; +}; + +struct arge_txdesc { + struct mbuf *tx_m; + bus_dmamap_t tx_dmamap; +}; + +struct arge_rxdesc { + struct mbuf *rx_m; + bus_dmamap_t rx_dmamap; + struct arge_desc *desc; +}; + +struct arge_chain_data { + bus_dma_tag_t arge_parent_tag; + bus_dma_tag_t arge_tx_tag; + struct arge_txdesc arge_txdesc[ARGE_TX_RING_COUNT]; + bus_dma_tag_t arge_rx_tag; + struct arge_rxdesc arge_rxdesc[ARGE_RX_RING_COUNT]; + bus_dma_tag_t arge_tx_ring_tag; + bus_dma_tag_t arge_rx_ring_tag; + bus_dmamap_t arge_tx_ring_map; + bus_dmamap_t arge_rx_ring_map; + bus_dmamap_t arge_rx_sparemap; + int arge_tx_pkts; + int arge_tx_prod; + int arge_tx_cons; + int arge_tx_cnt; + int arge_rx_cons; +}; + +struct arge_ring_data { + struct arge_desc *arge_rx_ring; + struct arge_desc *arge_tx_ring; + bus_addr_t arge_rx_ring_paddr; + bus_addr_t arge_tx_ring_paddr; +}; + +struct arge_softc { + struct ifnet *arge_ifp; /* interface info */ + device_t arge_dev; + struct ifmedia arge_ifmedia; + /* + * Media & duples settings for multiPHY MAC + */ + uint32_t arge_media_type; + uint32_t arge_duplex_mode; + struct resource *arge_res; + int arge_rid; + struct resource *arge_irq; + void *arge_intrhand; + device_t arge_miibus; + bus_dma_tag_t arge_parent_tag; + bus_dma_tag_t arge_tag; + struct mtx arge_mtx; + struct callout arge_stat_callout; + struct task arge_link_task; + struct arge_chain_data arge_cdata; + struct arge_ring_data arge_rdata; + int arge_link_status; + int arge_detach; + uint32_t arge_intr_status; + int arge_mac_unit; + int arge_phymask; + uint32_t arge_ddr_flush_reg; + uint32_t arge_pll_reg; + uint32_t arge_pll_reg_shift; + int arge_if_flags; +}; + +#endif /* __IF_ARGEVAR_H__ */ diff --git a/sys/mips/atheros/pcf2123_rtc.c b/sys/mips/atheros/pcf2123_rtc.c new file mode 100644 index 000000000000..0cb4c8fdc160 --- /dev/null +++ b/sys/mips/atheros/pcf2123_rtc.c @@ -0,0 +1,204 @@ +/*- + * Copyright (c) 2010, Oleksandr Tymoshenko + * 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 unmodified, 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include "spibus_if.h" + +#include "clock_if.h" + +#define YEAR_BASE 1970 +#define PCF2123_DELAY 50 + +struct pcf2123_rtc_softc { + device_t dev; +}; + +static int pcf2123_rtc_probe(device_t dev); +static int pcf2123_rtc_attach(device_t dev); + +static int pcf2123_rtc_gettime(device_t dev, struct timespec *ts); +static int pcf2123_rtc_settime(device_t dev, struct timespec *ts); + +static int +pcf2123_rtc_probe(device_t dev) +{ + + device_set_desc(dev, "PCF2123 SPI RTC"); + return (0); +} + +static int +pcf2123_rtc_attach(device_t dev) +{ + struct pcf2123_rtc_softc *sc; + struct spi_command cmd; + unsigned char rxBuf[3]; + unsigned char txBuf[3]; + int err; + + sc = device_get_softc(dev); + sc->dev = dev; + + clock_register(dev, 1000000); + + memset(&cmd, 0, sizeof(cmd)); + memset(rxBuf, 0, sizeof(rxBuf)); + memset(txBuf, 0, sizeof(txBuf)); + + /* Make sure Ctrl1 and Ctrl2 are zeroes */ + txBuf[0] = PCF2123_WRITE(PCF2123_REG_CTRL1); + cmd.rx_cmd = rxBuf; + cmd.tx_cmd = txBuf; + cmd.rx_cmd_sz = sizeof(rxBuf); + cmd.tx_cmd_sz = sizeof(txBuf); + err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); + DELAY(PCF2123_DELAY); + + return (0); +} + +static int +pcf2123_rtc_gettime(device_t dev, struct timespec *ts) +{ + struct clocktime ct; + struct spi_command cmd; + unsigned char rxTimedate[8]; + unsigned char txTimedate[8]; + int err; + + memset(&cmd, 0, sizeof(cmd)); + memset(rxTimedate, 0, sizeof(rxTimedate)); + memset(txTimedate, 0, sizeof(txTimedate)); + + /* + * Counter is stopped when access to time registers is in progress + * So there is no need to stop/start counter + */ + /* Start reading from seconds */ + txTimedate[0] = PCF2123_READ(PCF2123_REG_SECONDS); + cmd.rx_cmd = rxTimedate; + cmd.tx_cmd = txTimedate; + cmd.rx_cmd_sz = sizeof(rxTimedate); + cmd.tx_cmd_sz = sizeof(txTimedate); + err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); + DELAY(PCF2123_DELAY); + + ct.nsec = 0; + ct.sec = FROMBCD(rxTimedate[1] & 0x7f); + ct.min = FROMBCD(rxTimedate[2] & 0x7f); + ct.hour = FROMBCD(rxTimedate[3] & 0x3f); + + ct.dow = FROMBCD(rxTimedate[5] & 0x3f); + + ct.day = FROMBCD(rxTimedate[4] & 0x3f); + ct.mon = FROMBCD(rxTimedate[6] & 0x1f); + ct.year = YEAR_BASE + FROMBCD(rxTimedate[7]); + + return (clock_ct_to_ts(&ct, ts)); +} + +static int +pcf2123_rtc_settime(device_t dev, struct timespec *ts) +{ + struct clocktime ct; + struct pcf2123_rtc_softc *sc; + struct spi_command cmd; + unsigned char rxTimedate[8]; + unsigned char txTimedate[8]; + int err; + + sc = device_get_softc(dev); + + /* Resolution: 1 sec */ + if (ts->tv_nsec >= 500000000) + ts->tv_sec++; + ts->tv_nsec = 0; + clock_ts_to_ct(ts, &ct); + + memset(&cmd, 0, sizeof(cmd)); + memset(rxTimedate, 0, sizeof(rxTimedate)); + memset(txTimedate, 0, sizeof(txTimedate)); + + /* Start reading from seconds */ + cmd.rx_cmd = rxTimedate; + cmd.tx_cmd = txTimedate; + cmd.rx_cmd_sz = sizeof(rxTimedate); + cmd.tx_cmd_sz = sizeof(txTimedate); + + /* + * Counter is stopped when access to time registers is in progress + * So there is no need to stop/start counter + */ + txTimedate[0] = PCF2123_WRITE(PCF2123_REG_SECONDS); + txTimedate[1] = TOBCD(ct.sec); + txTimedate[2] = TOBCD(ct.min); + txTimedate[3] = TOBCD(ct.hour); + txTimedate[4] = TOBCD(ct.day); + txTimedate[5] = TOBCD(ct.dow); + txTimedate[6] = TOBCD(ct.mon); + txTimedate[7] = TOBCD(ct.year - YEAR_BASE); + + err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd); + DELAY(PCF2123_DELAY); + + return (err); +} + +static device_method_t pcf2123_rtc_methods[] = { + DEVMETHOD(device_probe, pcf2123_rtc_probe), + DEVMETHOD(device_attach, pcf2123_rtc_attach), + + DEVMETHOD(clock_gettime, pcf2123_rtc_gettime), + DEVMETHOD(clock_settime, pcf2123_rtc_settime), + + { 0, 0 }, +}; + +static driver_t pcf2123_rtc_driver = { + "rtc", + pcf2123_rtc_methods, + sizeof(struct pcf2123_rtc_softc), +}; +static devclass_t pcf2123_rtc_devclass; + +DRIVER_MODULE(pcf2123_rtc, spibus, pcf2123_rtc_driver, pcf2123_rtc_devclass, 0, 0); diff --git a/sys/mips/atheros/pcf2123reg.h b/sys/mips/atheros/pcf2123reg.h new file mode 100644 index 000000000000..bd97e6c8f493 --- /dev/null +++ b/sys/mips/atheros/pcf2123reg.h @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 unmodified, 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$ */ + +#ifndef __PCF2123REG_H__ +#define __PCF2123REG_H__ + +/* Control and status */ +#define PCF2123_REG_CTRL1 0x0 +#define PCF2123_REG_CTRL2 0x1 + +/* Time and date */ +#define PCF2123_REG_SECONDS 0x2 +#define PCF2123_REG_MINUTES 0x3 +#define PCF2123_REG_HOURS 0x4 +#define PCF2123_REG_DAYS 0x5 +#define PCF2123_REG_WEEKDAYS 0x6 +#define PCF2123_REG_MONTHS 0x7 +#define PCF2123_REG_YEARS 0x8 + +/* Alarm registers */ +#define PCF2123_REG_MINUTE_ALARM 0x9 +#define PCF2123_REG_HOUR_ALARM 0xA +#define PCF2123_REG_DAY_ALARM 0xB +#define PCF2123_REG_WEEKDAY_ALARM 0xC + +/* Offset */ +#define PCF2123_REG_OFFSET 0xD + +/* Timer */ +#define PCF2123_REG_TIMER_CLKOUT 0xE +#define PCF2123_REG_COUNTDOWN_TIMER 0xF + +/* Commands */ +#define PCF2123_CMD_READ (1 << 7) +#define PCF2123_CMD_WRITE (0 << 7) + +#define PCF2123_READ(reg) (PCF2123_CMD_READ | (1 << 4) | (reg)) +#define PCF2123_WRITE(reg) (PCF2123_CMD_WRITE | (1 << 4) | (reg)) + +#endif /* __PCF2123REG_H__ */ + diff --git a/sys/mips/atheros/uart_bus_ar71xx.c b/sys/mips/atheros/uart_bus_ar71xx.c new file mode 100644 index 000000000000..8d83291c271a --- /dev/null +++ b/sys/mips/atheros/uart_bus_ar71xx.c @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 2009, Oleksandr Tymoshenko + * 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 + */ +#include "opt_uart.h" + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include "uart_if.h" + +static int uart_ar71xx_probe(device_t dev); +extern struct uart_class uart_ar71xx_uart_class; + +static device_method_t uart_ar71xx_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, uart_ar71xx_probe), + DEVMETHOD(device_attach, uart_bus_attach), + DEVMETHOD(device_detach, uart_bus_detach), + { 0, 0 } +}; + +static driver_t uart_ar71xx_driver = { + uart_driver_name, + uart_ar71xx_methods, + sizeof(struct uart_softc), +}; + +extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs; + +static int +uart_ar71xx_probe(device_t dev) +{ + struct uart_softc *sc; + uint64_t freq; + + freq = ar71xx_ahb_freq(); + + sc = device_get_softc(dev); + sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs); + sc->sc_class = &uart_ns8250_class; + bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); + sc->sc_sysdev->bas.regshft = 2; + sc->sc_sysdev->bas.bst = mips_bus_space_generic; + sc->sc_sysdev->bas.bsh = MIPS_PHYS_TO_KSEG1(AR71XX_UART_ADDR) + 3; + sc->sc_bas.regshft = 2; + sc->sc_bas.bst = mips_bus_space_generic; + sc->sc_bas.bsh = MIPS_PHYS_TO_KSEG1(AR71XX_UART_ADDR) + 3; + + return (uart_bus_probe(dev, 2, freq, 0, 0)); +} + +DRIVER_MODULE(uart, apb, uart_ar71xx_driver, uart_devclass, 0, 0); diff --git a/sys/mips/atheros/uart_cpu_ar71xx.c b/sys/mips/atheros/uart_cpu_ar71xx.c new file mode 100644 index 000000000000..4528ac68142f --- /dev/null +++ b/sys/mips/atheros/uart_cpu_ar71xx.c @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 2009 Oleksandr Tymoshenko + * 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. + * + */ +#include "opt_uart.h" + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include + +#include +#include + +#include +#include + +bus_space_tag_t uart_bus_space_io; +bus_space_tag_t uart_bus_space_mem; + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + +int +uart_cpu_getdev(int devtype, struct uart_devinfo *di) +{ + uint64_t freq; + + freq = ar71xx_ahb_freq(); + + di->ops = uart_getops(&uart_ns8250_class); + di->bas.chan = 0; + di->bas.bst = ar71xx_bus_space_reversed; + di->bas.regshft = 2; + di->bas.rclk = freq; + di->baudrate = 115200; + di->databits = 8; + di->stopbits = 1; + + di->parity = UART_PARITY_NONE; + + uart_bus_space_io = NULL; + uart_bus_space_mem = ar71xx_bus_space_reversed; + di->bas.bsh = MIPS_PHYS_TO_KSEG1(AR71XX_UART_ADDR); + return (0); +} diff --git a/sys/mips/cavium/asm_octeon.S b/sys/mips/cavium/asm_octeon.S new file mode 100644 index 000000000000..d9f79f134ffd --- /dev/null +++ b/sys/mips/cavium/asm_octeon.S @@ -0,0 +1,182 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +#include +#include +#include +#include +#include + +#include "assym.s" + + + +#define CPU_DISABLE_INTERRUPTS(reg, reg2, reg3) \ + mfc0 reg, MIPS_COP_0_STATUS; \ + nop; \ + move reg3, reg; \ + li reg2, ~MIPS_SR_INT_IE; \ + and reg, reg2, reg; \ + mtc0 reg, MIPS_COP_0_STATUS; \ + COP0_SYNC + + + +#define CPU_ENABLE_INTERRUPTS(reg, reg3) \ + mfc0 reg, MIPS_COP_0_STATUS; \ + nop; \ + or reg, reg, reg3; \ + mtc0 reg, MIPS_COP_0_STATUS; \ + COP0_SYNC + + +#define PUSHR(reg) \ + addiu sp,sp,-16 ; \ + sd reg, 8(sp) ; \ + nop ; + +#define POPR(reg) \ + ld reg, 8(sp) ; \ + addiu sp,sp,16 ; \ + nop ; + + + + +/* + * octeon_ciu_get_interrupt_reg_addr + * + * Given Int-X, En-X combination, return the CIU Interrupt Enable Register addr + * a0 = ciu Int-X: 0/1 + * a1 = ciu EN-0: 0/1 + */ +LEAF(octeon_ciu_get_interrupt_reg_addr) + .set noreorder + .set mips3 + + beqz a0, ciu_get_interrupt_reg_addr_Int_0 + nop + +ciu_get_interrupt_reg_addr_Int_1: + beqz a1, ciu_get_interrupt_reg_addr_Int_1_En_0 + nop + +ciu_get_interrupt_reg_addr_Int_1_En1: + li a0, OCTEON_CIU_ADDR_HI + dsll32 a0, a0, 0 + nop + ori a0, OCTEON_CIU_EN1_INT1_LO + j ciu_get_interrupt_reg_addr_ret + nop + +ciu_get_interrupt_reg_addr_Int_1_En_0: + li a0, OCTEON_CIU_ADDR_HI + dsll32 a0, a0, 0 + nop + ori a0, OCTEON_CIU_EN0_INT1_LO + j ciu_get_interrupt_reg_addr_ret + nop + +ciu_get_interrupt_reg_addr_Int_0: + beqz a1, ciu_get_interrupt_reg_addr_Int_0_En_0 + nop + +ciu_get_interrupt_reg_addr_Int_0_En_1: + li a0, OCTEON_CIU_ADDR_HI + dsll32 a0, a0, 0 + nop + ori a0, OCTEON_CIU_EN1_INT0_LO + j ciu_get_interrupt_reg_addr_ret + nop + +ciu_get_interrupt_reg_addr_Int_0_En_0: + li a0, OCTEON_CIU_ADDR_HI + dsll32 a0, a0, 0 + nop + ori a0, OCTEON_CIU_EN0_INT0_LO + + +ciu_get_interrupt_reg_addr_ret: + j ra + nop + + .set mips0 + .set reorder +END(octeon_ciu_get_interrupt_reg_addr) + + + +/* + * octeon_ciu_mask_all_interrupts + * + * a0 = ciu Interrupt-X: 0/1 + * a1 = ciu Enable-X: 0/1 + */ +LEAF(octeon_ciu_mask_all_interrupts) + .set noreorder + .set mips3 + + PUSHR(ra) + PUSHR(s0) + + move t0, a0 + move t1, a1 + li a0, MIPS_SR_INT_IE + CPU_DISABLE_INTERRUPTS(a2, a1, s0) + move a0, t0 + move t1, a1 + jal octeon_ciu_get_interrupt_reg_addr + nop + ld a2, 0(a0) # Dummy read + nop + move a2, zero # Clear all + sd a2, 0(a0) # Write new Enable bits + nop + CPU_ENABLE_INTERRUPTS(a2, s0) + + POPR(s0) + POPR(ra) + j ra # Return + nop # (bd slot) + + .set mips0 + .set reorder +END(octeon_ciu_mask_all_interrupts) + diff --git a/sys/mips/cavium/dev/rgmii/octeon_fau.c b/sys/mips/cavium/dev/rgmii/octeon_fau.c new file mode 100644 index 000000000000..fb4c0ad3a80e --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_fau.c @@ -0,0 +1,83 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/*------------------------------------------------------------------ + * octeon_fau.c Fetch & Add Block + * + *------------------------------------------------------------------ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include "octeon_fau.h" + +/* + * oct_fau_init + * + * How do we initialize FAU unit. I don't even think we can reset it. + */ +void octeon_fau_init (void) +{ +} + + +/* + * oct_fau_enable + * + * Let the Fetch/Add unit roll + */ +void octeon_fau_enable (void) +{ +} + + +/* + * oct_fau_disable + * + * disable fau + * + * Don't know if we can even do that. + */ +void octeon_fau_disable (void) +{ +} diff --git a/sys/mips/cavium/dev/rgmii/octeon_fau.h b/sys/mips/cavium/dev/rgmii/octeon_fau.h new file mode 100644 index 000000000000..1683ff55e005 --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_fau.h @@ -0,0 +1,225 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/*------------------------------------------------------------------ + * octeon_fau.h Fetch & Add Unit + * + *------------------------------------------------------------------ + */ + + +#ifndef ___OCTEON_FAU__H___ +#define ___OCTEON_FAU__H___ + + + + +typedef enum { + OCTEON_FAU_OP_SIZE_8 = 0, + OCTEON_FAU_OP_SIZE_16 = 1, + OCTEON_FAU_OP_SIZE_32 = 2, + OCTEON_FAU_OP_SIZE_64 = 3 +} octeon_fau_op_size_t; + + + +#define OCTEON_FAU_LOAD_IO_ADDRESS octeon_build_io_address(0x1e, 0) +#define OCTEON_FAU_BITS_SCRADDR 63,56 +#define OCTEON_FAU_BITS_LEN 55,48 +#define OCTEON_FAU_BITS_INEVAL 35,14 +#define OCTEON_FAU_BITS_TAGWAIT 13,13 +#define OCTEON_FAU_BITS_NOADD 13,13 +#define OCTEON_FAU_BITS_SIZE 12,11 +#define OCTEON_FAU_BITS_REGISTER 10,0 + +#define OCTEON_FAU_REG_64_ADDR(x) ((x <<3) + OCTEON_FAU_REG_64_START) +typedef enum +{ + OCTEON_FAU_REG_64_START = 0, + OCTEON_FAU_REG_OQ_ADDR_INDEX = OCTEON_FAU_REG_64_ADDR(0), + OCTEON_FAU_REG_OQ_ADDR_END = OCTEON_FAU_REG_64_ADDR(31), + OCTEON_FAU_REG_64_END = OCTEON_FAU_REG_64_ADDR(39), +} octeon_fau_reg_64_t; + +#define OCTEON_FAU_REG_32_ADDR(x) ((x <<2) + OCTEON_FAU_REG_32_START) +typedef enum +{ + OCTEON_FAU_REG_32_START = OCTEON_FAU_REG_64_END, + OCTEON_FAU_REG_32_END = OCTEON_FAU_REG_32_ADDR(0), +} octeon_fau_reg_32_t; + + + +/* + * octeon_fau_atomic_address + * + * Builds a I/O address for accessing the FAU + * + * @param tagwait Should the atomic add wait for the current tag switch + * operation to complete. + * - 0 = Don't wait + * - 1 = Wait for tag switch to complete + * @param reg FAU atomic register to access. 0 <= reg < 4096. + * - Step by 2 for 16 bit access. + * - Step by 4 for 32 bit access. + * - Step by 8 for 64 bit access. + * @param value Signed value to add. + * Note: When performing 32 and 64 bit access, only the low + * 22 bits are available. + * @return Address to read from for atomic update + */ +static inline uint64_t octeon_fau_atomic_address (uint64_t tagwait, uint64_t reg, + int64_t value) +{ + return (OCTEON_ADD_IO_SEG(OCTEON_FAU_LOAD_IO_ADDRESS) | + octeon_build_bits(OCTEON_FAU_BITS_INEVAL, value) | + octeon_build_bits(OCTEON_FAU_BITS_TAGWAIT, tagwait) | + octeon_build_bits(OCTEON_FAU_BITS_REGISTER, reg)); +} + + +/* + * octeon_fau_store_address + * + * Builds a store I/O address for writing to the FAU + * + * noadd 0 = Store value is atomically added to the current value + * 1 = Store value is atomically written over the current value + * reg FAU atomic register to access. 0 <= reg < 4096. + * - Step by 2 for 16 bit access. + * - Step by 4 for 32 bit access. + * - Step by 8 for 64 bit access. + * Returns Address to store for atomic update + */ +static inline uint64_t octeon_fau_store_address (uint64_t noadd, uint64_t reg) +{ + return (OCTEON_ADD_IO_SEG(OCTEON_FAU_LOAD_IO_ADDRESS) | + octeon_build_bits(OCTEON_FAU_BITS_NOADD, noadd) | + octeon_build_bits(OCTEON_FAU_BITS_REGISTER, reg)); +} + + +/* + * octeon_fau_atomic_add32 + * + * Perform an atomic 32 bit add + * + * @param reg FAU atomic register to access. 0 <= reg < 4096. + * - Step by 4 for 32 bit access. + * @param value Signed value to add. + */ +static inline void octeon_fau_atomic_add32 (octeon_fau_reg_32_t reg, int32_t value) +{ + oct_write32(octeon_fau_store_address(0, reg), value); +} + +/* + * octeon_fau_fetch_and_add + * + * reg FAU atomic register to access. 0 <= reg < 4096. + * - Step by 8 for 64 bit access. + * value Signed value to add. + * Note: Only the low 22 bits are available. + * returns Value of the register before the update + */ +static inline int64_t octeon_fau_fetch_and_add64 (octeon_fau_reg_64_t reg, + int64_t val64) +{ + + return (oct_read64(octeon_fau_atomic_address(0, reg, val64))); +} + +/* + * octeon_fau_fetch_and_add32 + * + * reg FAU atomic register to access. 0 <= reg < 4096. + * - Step by 8 for 64 bit access. + * value Signed value to add. + * Note: Only the low 22 bits are available. + * returns Value of the register before the update + */ +static inline int32_t octeon_fau_fetch_and_add32 (octeon_fau_reg_64_t reg, + int32_t val32) +{ + return (oct_read32(octeon_fau_atomic_address(0, reg, val32))); +} + +/* + * octeon_fau_atomic_write32 + * + * Perform an atomic 32 bit write + * + * @param reg FAU atomic register to access. 0 <= reg < 4096. + * - Step by 4 for 32 bit access. + * @param value Signed value to write. + */ +static inline void octeon_fau_atomic_write32(octeon_fau_reg_32_t reg, int32_t value) +{ + oct_write32(octeon_fau_store_address(1, reg), value); +} + + +/* + * octeon_fau_atomic_write64 + * + * Perform an atomic 32 bit write + * + * reg FAU atomic register to access. 0 <= reg < 4096. + * - Step by 8 for 64 bit access. + * value Signed value to write. + */ +static inline void octeon_fau_atomic_write64 (octeon_fau_reg_64_t reg, int64_t value) +{ + oct_write64(octeon_fau_store_address(1, reg), value); +} + + +static inline void octeon_fau_atomic_add64 (octeon_fau_reg_64_t reg, int64_t value) +{ + oct_write64_int64(octeon_fau_store_address(0, reg), value); +} + + +extern void octeon_fau_init(void); +extern void octeon_fau_enable(void); +extern void octeon_fau_disable(void); + + +#endif /* ___OCTEON_FAU__H___ */ diff --git a/sys/mips/cavium/dev/rgmii/octeon_fpa.c b/sys/mips/cavium/dev/rgmii/octeon_fpa.c new file mode 100644 index 000000000000..3e43a886b122 --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_fpa.c @@ -0,0 +1,230 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/*------------------------------------------------------------------ + * octeon_fpa.c Free Pool Allocator + * + *------------------------------------------------------------------ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + + +#include +#include "octeon_fpa.h" + + +#define FPA_DEBUG 1 + +/* + * octeon_dump_fpa + * + */ +void octeon_dump_fpa (void) +{ + int i; + octeon_fpa_ctl_status_t status; + octeon_fpa_queue_available_t q_avail; + + status.word64 = oct_read64(OCTEON_FPA_CTL_STATUS); + if (!status.bits.enb) { + printf("\n FPA Disabled"); + /* + * No dumping if disabled + */ + return; + } + printf(" FPA Ctrl-Status-reg 0x%llX := 0x%llX EN %X M1_E %X M0_E %X\n", + OCTEON_FPA_CTL_STATUS, (unsigned long long)status.word64, + status.bits.enb, status.bits.mem1_err, status.bits.mem0_err); + for (i = 0; i < OCTEON_FPA_QUEUES; i++) { + printf(" Pool: %d\n", i); + + q_avail.word64 = oct_read64((OCTEON_FPA_QUEUE_AVAILABLE + (i)*8ull)); + printf(" Avail-reg 0x%llX := Size: 0x%X\n", + (OCTEON_FPA_QUEUE_AVAILABLE + (i)*8ull), q_avail.bits.queue_size); + } +} + +void octeon_dump_fpa_pool (u_int pool) +{ + octeon_fpa_ctl_status_t status; + octeon_fpa_queue_available_t q_avail; + + status.word64 = oct_read64(OCTEON_FPA_CTL_STATUS); + if (!status.bits.enb) { + printf("\n FPA Disabled"); + /* + * No dumping if disabled + */ + return; + } + printf(" FPA Ctrl-Status-reg 0x%llX := 0x%llX EN %X M1_E %X M0_E %X\n", + OCTEON_FPA_CTL_STATUS, (unsigned long long)status.word64, + status.bits.enb, status.bits.mem1_err, status.bits.mem0_err); + q_avail.word64 = oct_read64((OCTEON_FPA_QUEUE_AVAILABLE + (pool)*8ull)); + printf(" FPA Pool: %u Avail-reg 0x%llX := Size: 0x%X\n", pool, + (OCTEON_FPA_QUEUE_AVAILABLE + (pool)*8ull), q_avail.bits.queue_size); +} + + +u_int octeon_fpa_pool_size (u_int pool) +{ + octeon_fpa_queue_available_t q_avail; + u_int size = 0; + + if (pool < 7) { + q_avail.word64 = oct_read64((OCTEON_FPA_QUEUE_AVAILABLE + (pool)*8ull)); + size = q_avail.bits.queue_size; + } + return (size); +} + + +/* + * octeon_enable_fpa + * + * configure fpa with defaults and then mark it enabled. + */ +void octeon_enable_fpa (void) +{ + int i; + octeon_fpa_ctl_status_t status; + octeon_fpa_fpf_marks_t marks; + + for (i = 0; i < OCTEON_FPA_QUEUES; i++) { + marks.word64 = oct_read64((OCTEON_FPA_FPF_MARKS + (i)*8ull)); + + marks.bits.fpf_wr = 0xe0; + oct_write64((OCTEON_FPA_FPF_MARKS + (i)*8ull), marks.word64); + } + + /* Enforce a 10 cycle delay between config and enable */ + octeon_wait(10); + + status.word64 = 0; + status.bits.enb = 1; + oct_write64(OCTEON_FPA_CTL_STATUS, status.word64); +} + + +#define FPA_DEBUG_TERSE 1 + +/* + * octeon_fpa_fill_pool_mem + * + * Fill the specified FPA pool with elem_num number of + * elements of size elem_size_words * 8 + */ +void octeon_fpa_fill_pool_mem (u_int pool, u_int elem_size_words, u_int elem_num) +{ + void *memory; + u_int bytes, elem_size_bytes; + u_int block_size; + +#ifdef FPA_DEBUG + u_int elems = elem_num; + printf(" FPA fill: Pool %u elem_size_words %u Num: %u\n", pool, elem_size_words, elem_num); +#endif + elem_size_bytes = elem_size_words * sizeof(uint64_t); + block_size = OCTEON_ALIGN(elem_size_bytes); + +// block_size = ((elem_size_bytes / OCTEON_FPA_POOL_ALIGNMENT) + 1) * OCTEON_FPA_POOL_ALIGNMENT; + + bytes = (elem_num * block_size); + +#ifdef FPA_DEBUG + printf(" elem_size_bytes = words * 8 = %u; block_size %u\n", elem_size_bytes, block_size); +#endif + + +#ifdef FPA_DEBUG + int block = 0; + + printf(" %% Filling Pool %u with %u blocks of %u bytes %u words\n", + pool, elem_num, elem_size_bytes, elem_size_words); +#endif + +// memory = malloc(bytes, M_DEVBUF, M_NOWAIT | M_ZERO); + memory = contigmalloc(bytes, M_DEVBUF, M_NOWAIT | M_ZERO, + 0, 0x20000000, + OCTEON_FPA_POOL_ALIGNMENT, 0); + + if (memory == NULL) { + printf(" %% FPA pool %u could not be filled with %u bytes\n", + pool, bytes); + return; + } + + /* + * Forward Align allocated mem to needed alignment. Don't worry about growth, we + * already preallocated extra + */ +#ifdef FPA_DEBUG + printf(" %% Huge MemBlock %p Bytes %u\n", memory, bytes); +#endif + + memory = (void *) OCTEON_ALIGN(memory); + +#ifdef FPA_DEBUG_TERSE + printf("FPA fill: %u Count: %u SizeBytes: %u SizeBytesAligned: %u 1st: %p = %p\n", + pool, elem_num, elem_size_bytes, block_size, memory, + (void *)(intptr_t)OCTEON_PTR2PHYS(memory)); +#endif + +// memory = (void *) ((((u_int) memory / OCTEON_FPA_POOL_ALIGNMENT) + 1) * OCTEON_FPA_POOL_ALIGNMENT); + + while (elem_num--) { +#ifdef FPA_DEBUG + if (((elems - elem_num) < 4) || (elem_num < 4)) + printf(" %% Block %d: %p Phys %p Bytes %u\n", block, memory, + (void *)(intptr_t)OCTEON_PTR2PHYS(memory), elem_size_bytes); + block++; +#endif + octeon_fpa_free(memory, pool, 0); + memory = (void *) (((u_long) memory) + block_size); + } +} + diff --git a/sys/mips/cavium/dev/rgmii/octeon_fpa.h b/sys/mips/cavium/dev/rgmii/octeon_fpa.h new file mode 100644 index 000000000000..33d273bd9e3f --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_fpa.h @@ -0,0 +1,259 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/*------------------------------------------------------------------ + * octeon_fpa.h Free Pool Allocator + * + *------------------------------------------------------------------ + */ + + +#ifndef ___OCTEON_FPA__H___ +#define ___OCTEON_FPA__H___ + + +#define OCTEON_FPA_FPA_OUTPUT_BUFFER_POOL 2 /* Same in octeon_rgmx.h */ + + +/* + * OCTEON_FPA_FPF_MARKS = FPA's Queue Free Page FIFO Read Write Marks + * + * The high and low watermark register that determines when we write and + * read free pages from L2C for Queue. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 42; /* Must be zero */ + uint64_t fpf_wr : 11; /* Write Hi Water mark */ + uint64_t fpf_rd : 11; /* Read Lo Water mark */ + } bits; +} octeon_fpa_fpf_marks_t; + + +/* + * OCTEON_FPA_CTL_STATUS = FPA's Control/Status Register + * + * The FPA's interrupt enable register. + * - Use with the CVMX_FPA_CTL_STATUS CSR. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 49; /* Must be zero */ + uint64_t enb : 1; /* Enable */ + uint64_t mem1_err : 7; /* ECC flip 1 */ + uint64_t mem0_err : 7; /* ECC flip 0 */ + } bits; +} octeon_fpa_ctl_status_t; + + +/* + * OCTEON_FPA_FPF_SIZE = FPA's Queue N Free Page FIFO Size + * + * The number of page pointers that will be kept local to the FPA for + * this Queue. FPA Queues are assigned in order from Queue 0 to + * Queue 7, though only Queue 0 through Queue x can be used. + * The sum of the 8 (0-7)OCTEON_FPA_FPF#_SIZE registers must be limited to 2048. + * - Use with the CVMX_FPA_FPF0_SIZE CSR. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 52; /* Must be zero */ + /* + * The number of entries assigned in the FPA FIFO (used to hold + * page-pointers) for this Queue. + * The value of this register must divisable by 2, and the FPA will + * ignore bit [0] of this register. + * The total of the FPF_SIZ field of the 8 (0-7)OCTEON_FPA_FPF#_MARKS + * registers must not exceed 2048. + * After writing this field the FPA will need 10 core clock cycles + * to be ready for operation. The assignment of location in + * the FPA FIFO must start with Queue 0, then 1, 2, etc. + * The number of useable entries will be FPF_SIZ-2. + */ + uint64_t fpf_siz : 12; + } bits; +} octeon_fpa_fpf_size_t; + +/* + *OCTEON_FPA_INT_ENB = FPA's Interrupt Enable + * + * The FPA's interrupt enable register. + * - Use with the CVMX_FPA_INT_ENB CSR. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 60; /* Must be zero */ + uint64_t fed1_dbe : 1; /* Int iff bit3 Int-Sum set */ + uint64_t fed1_sbe : 1; /* Int iff bit2 Int-Sum set */ + uint64_t fed0_dbe : 1; /* Int iff bit1 Int-Sum set */ + uint64_t fed0_sbe : 1; /* Int iff bit0 Int-Sum set */ + } bits; +} octeon_fpa_int_enb_t; + +/** + *OCTEON_FPA_INT_SUM = FPA's Interrupt Summary Register + * + * Contains the diffrent interrupt summary bits of the FPA. + * - Use with the CVMX_FPA_INT_SUM CSR. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 60; /**< Must be zero */ + uint64_t fed1_dbe : 1; + uint64_t fed1_sbe : 1; + uint64_t fed0_dbe : 1; + uint64_t fed0_sbe : 1; + } bits; +} octeon_fpa_int_sum_t; + + +/* + *OCTEON_FPA_QUEUE_PAGES_AVAILABLE = FPA's Queue 0-7 Free Page Available Register + * + * The number of page pointers that are available in the FPA and local DRAM. + * - Use with the CVMX_FPA_QUEX_AVAILABLE(0..7) CSR. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 38; /* Must be zero */ + uint64_t queue_size : 26; /* free pages available */ + } bits; +} octeon_fpa_queue_available_t; + + +/* + *OCTEON_FPA_QUEUE_PAGE_INDEX + * + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 39; /* Must be zero */ + uint64_t page_index : 25; /* page_index */ + } bits; +} octeon_fpa_queue_page_index_t; + + +#define OCTEON_DID_FPA 5ULL + +#define OCTEON_FPA_POOL_ALIGNMENT (OCTEON_CACHE_LINE_SIZE) + + +/* + * Externs + */ +extern void octeon_dump_fpa(void); +extern void octeon_dump_fpa_pool(u_int pool); +extern u_int octeon_fpa_pool_size(u_int pool); +extern void octeon_enable_fpa(void); +extern void octeon_fpa_fill_pool_mem(u_int pool, + u_int block_size_words, + u_int block_num); + +/* + * octeon_fpa_free + * + * Free a mem-block to FPA pool. + * + * Takes away this 'buffer' from SW and passes it to FPA for management. + * + * pool is FPA pool num, ptr is block ptr, num_cache_lines is number of + * cache lines to invalidate (not written back). + */ +static inline void octeon_fpa_free (void *ptr, u_int pool, + u_int num_cache_lines) +{ + octeon_addr_t free_ptr; + + free_ptr.word64 = (uint64_t)OCTEON_PTR2PHYS(ptr); + + free_ptr.sfilldidspace.didspace = OCTEON_ADDR_DIDSPACE( + OCTEON_ADDR_FULL_DID(OCTEON_DID_FPA, pool)); + + /* + * Do not 'sync' + * asm volatile ("sync\n"); + */ + oct_write64(free_ptr.word64, num_cache_lines); +} + + + +/* + * octeon_fpa_alloc + * + * Allocate a new block from the FPA + * + * Buffer passes away from FPA management to SW control + */ +static inline void *octeon_fpa_alloc (u_int pool) +{ + uint64_t address; + + address = oct_read64(OCTEON_ADDR_DID(OCTEON_ADDR_FULL_DID(OCTEON_DID_FPA, + pool))); + if (address) { + +/* + * 32 bit FPA pointers only + */ + /* + * We only use 32 bit pointers at this time + */ +/*XXX mips64 issue */ + return ((void *) MIPS_PHYS_TO_KSEG0(address & 0xffffffff)); + } + return (NULL); +} + +static inline uint64_t octeon_fpa_alloc_phys (u_int pool) +{ + + return (oct_read64(OCTEON_ADDR_DID(OCTEON_ADDR_FULL_DID(OCTEON_DID_FPA, + pool)))); +} + +#endif /* ___OCTEON_FPA__H___ */ diff --git a/sys/mips/cavium/dev/rgmii/octeon_ipd.c b/sys/mips/cavium/dev/rgmii/octeon_ipd.c new file mode 100644 index 000000000000..8757a1046598 --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_ipd.c @@ -0,0 +1,148 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/*------------------------------------------------------------------ + * octeon_ipd.c Input Packet Unit + * + *------------------------------------------------------------------ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include "octeon_ipd.h" + +/* + * octeon_ipd_enable + * + * enable ipd + */ +void octeon_ipd_enable (void) +{ + octeon_ipd_ctl_status_t octeon_ipd_reg; + + octeon_ipd_reg.word64 = oct_read64(OCTEON_IPD_CTL_STATUS); + octeon_ipd_reg.bits.ipd_en = 1; + oct_write64(OCTEON_IPD_CTL_STATUS, octeon_ipd_reg.word64); +} + + +/* + * octeon_ipd_disable + * + * disable ipd + */ +void octeon_ipd_disable (void) +{ + octeon_ipd_ctl_status_t octeon_ipd_reg; + + octeon_ipd_reg.word64 = oct_read64(OCTEON_IPD_CTL_STATUS); + octeon_ipd_reg.bits.ipd_en = 0; + oct_write64(OCTEON_IPD_CTL_STATUS, octeon_ipd_reg.word64); +} + + +/* + * octeon_ipd_config + * + * Configure IPD + * + * mbuff_size Packets buffer size in 8 byte words + * first_mbuff_skip + * Number of 8 byte words to skip in the first buffer + * not_first_mbuff_skip + * Number of 8 byte words to skip in each following buffer + * first_back Must be same as first_mbuff_skip / Cache_Line_size + * second_back + * Must be same as not_first_mbuff_skip / Cache_Line_Size + * wqe_fpa_pool + * FPA pool to get work entries from + * cache_mode + * back_pres_enable_flag + * Enable or disable port back pressure + */ +void octeon_ipd_config (u_int mbuff_size, + u_int first_mbuff_skip, + u_int not_first_mbuff_skip, + u_int first_back, + u_int second_back, + u_int wqe_fpa_pool, + octeon_ipd_mode_t cache_mode, + u_int back_pres_enable_flag) +{ + octeon_ipd_mbuff_first_skip_t first_skip; + octeon_ipd_mbuff_not_first_skip_t not_first_skip; + octeon_ipd_mbuff_size_t size; + octeon_ipd_first_next_ptr_back_t first_back_struct; + octeon_ipd_second_next_ptr_back_t second_back_struct; + octeon_ipd_wqe_fpa_pool_t wqe_pool; + octeon_ipd_ctl_status_t octeon_ipd_ctl_reg; + + first_skip.word64 = 0; + first_skip.bits.skip_sz = first_mbuff_skip; + oct_write64(OCTEON_IPD_1ST_MBUFF_SKIP, first_skip.word64); + + not_first_skip.word64 = 0; + not_first_skip.bits.skip_sz = not_first_mbuff_skip; + oct_write64(OCTEON_IPD_NOT_1ST_MBUFF_SKIP, not_first_skip.word64); + + size.word64 = 0; + size.bits.mb_size = mbuff_size; + oct_write64(OCTEON_IPD_PACKET_MBUFF_SIZE, size.word64); + + first_back_struct.word64 = 0; + first_back_struct.bits.back = first_back; + oct_write64(OCTEON_IPD_1ST_NEXT_PTR_BACK, first_back_struct.word64); + + second_back_struct.word64 = 0; + second_back_struct.bits.back = second_back; + oct_write64(OCTEON_IPD_2ND_NEXT_PTR_BACK, second_back_struct.word64); + + wqe_pool.word64 = 0; + wqe_pool.bits.wqe_pool = wqe_fpa_pool; + oct_write64(OCTEON_IPD_WQE_FPA_QUEUE, wqe_pool.word64); + + octeon_ipd_ctl_reg.word64 = 0; + octeon_ipd_ctl_reg.bits.opc_mode = cache_mode; + octeon_ipd_ctl_reg.bits.pbp_en = back_pres_enable_flag; + oct_write64(OCTEON_IPD_CTL_STATUS, octeon_ipd_ctl_reg.word64); +} diff --git a/sys/mips/cavium/dev/rgmii/octeon_ipd.h b/sys/mips/cavium/dev/rgmii/octeon_ipd.h new file mode 100644 index 000000000000..aabfaaec23d9 --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_ipd.h @@ -0,0 +1,204 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/*------------------------------------------------------------------ + * octeon_ipd.h Input Packet Unit + * + *------------------------------------------------------------------ + */ + + +#ifndef ___OCTEON_IPD__H___ +#define ___OCTEON_IPD__H___ + + + +typedef enum { + OCTEON_IPD_OPC_MODE_STT = 0LL, /* All blocks DRAM, not cached in L2 */ + OCTEON_IPD_OPC_MODE_STF = 1LL, /* All blocks into L2 */ + OCTEON_IPD_OPC_MODE_STF1_STT = 2LL, /* 1st block L2, rest DRAM */ + OCTEON_IPD_OPC_MODE_STF2_STT = 3LL /* 1st, 2nd blocks L2, rest DRAM */ +} octeon_ipd_mode_t; + + + + +/* + * IPD_CTL_STATUS = IPS'd Control Status Register + * The number of words in a MBUFF used for packet data store. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 58; /* Reserved */ + uint64_t pkt_lend : 1; /* Pkt Lil-Endian Writes to L2C */ + uint64_t wqe_lend : 1; /* WQE Lik-Endian Writes to L2C */ + uint64_t pbp_en : 1; /* Enable Back-Pressure */ + octeon_ipd_mode_t opc_mode : 2; /* Pkt data in Mem/L2-cache ? */ + uint64_t ipd_en : 1; /* Enable IPD */ + } bits; +} octeon_ipd_ctl_status_t; + + +/* + * IPD_1ST_NEXT_PTR_BACK = IPD First Next Pointer Back Values + * + * Contains the Back Field for use in creating the Next Pointer Header + * for the First MBUF + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 60; /* Must be zero */ + uint64_t back : 4; /* Used to find head of buffer from the nxt-hdr-ptr. */ + } bits; +} octeon_ipd_first_next_ptr_back_t; + + +/* + * IPD_INTERRUPT_ENB = IPD Interrupt Enable Register + * + * Used to enable the various interrupting conditions of IPD + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 59; /* Must be zero */ + uint64_t bp_sub : 1; /* BP subtract is illegal val */ + uint64_t prc_par3 : 1; /* PBM Bits [127:96] Parity Err */ + uint64_t prc_par2 : 1; /* PBM Bits [ 95:64] Parity Err */ + uint64_t prc_par1 : 1; /* PBM Bits [ 63:32] Parity Err */ + uint64_t prc_par0 : 1; /* PBM Bits [ 31:0 ] Parity Err */ + } bits; +} octeon_ipd_int_enb_t; + + +/* + * IPD_INTERRUPT_SUM = IPD Interrupt Summary Register + * + * Set when an interrupt condition occurs, write '1' to clear. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 59; /* Must be zero */ + uint64_t bp_sub : 1; /* BP subtract is illegal val */ + uint64_t prc_par3 : 1; /* PBM Bits [127:96] Parity Err */ + uint64_t prc_par2 : 1; /* PBM Bits [ 95:64] Parity Err */ + uint64_t prc_par1 : 1; /* PBM Bits [ 63:32] Parity Err */ + uint64_t prc_par0 : 1; /* PBM Bits [ 31:0 ] Parity Err */ + } bits; +} octeon_ipd_int_sum_t; + + +/** + * IPD_1ST_MBUFF_SKIP = IPD First MBUFF Word Skip Size + * + * The number of words that the IPD will skip when writing the first MBUFF. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 58; /* Must be zero */ + uint64_t skip_sz : 6; /* 64bit words from the top of */ + /* 1st MBUFF that the IPD will */ + /* store the next-pointer. */ + /* [0..32] && */ + /* (skip_sz + 16) <= IPD_PACKET_MBUFF_SIZE[MB_SIZE]. */ + } bits; +} octeon_ipd_mbuff_first_skip_t; + + +/* + * IPD_PACKET_MBUFF_SIZE = IPD's PACKET MUBUF Size In Words + * + * The number of words in a MBUFF used for packet data store. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 52; /* Must be zero */ + uint64_t mb_size : 12; /* 64bit words in a MBUF. */ + /* Must be [32..2048] */ + /* Is also the size of the FPA's */ + /* Queue-0 Free-Page */ + } bits; +} octeon_ipd_mbuff_size_t; + + +/* + * IPD_WQE_FPA_QUEUE = IPD Work-Queue-Entry FPA Page Size + * + * Which FPA Queue (0-7) to fetch page-pointers from for WQE's + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 61; /* Must be zero */ + uint64_t wqe_pool : 3; /* FPA Pool to fetch WQE Page-ptrs */ + } bits; +} octeon_ipd_wqe_fpa_pool_t; + + + + +/* End of Control and Status Register (CSR) definitions */ + +typedef octeon_ipd_mbuff_first_skip_t octeon_ipd_mbuff_not_first_skip_t; +typedef octeon_ipd_first_next_ptr_back_t octeon_ipd_second_next_ptr_back_t; + + +/* + * Externs + */ +extern void octeon_ipd_enable(void); +extern void octeon_ipd_disable(void); +extern void octeon_ipd_config(u_int mbuff_size, + u_int first_mbuff_skip, + u_int not_first_mbuff_skip, + u_int first_back, + u_int second_back, + u_int wqe_fpa_pool, + octeon_ipd_mode_t cache_mode, + u_int back_pres_enable_flag); + + + +#endif /* ___OCTEON_IPD__H___ */ diff --git a/sys/mips/cavium/dev/rgmii/octeon_pip.h b/sys/mips/cavium/dev/rgmii/octeon_pip.h new file mode 100644 index 000000000000..a13d2446b010 --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_pip.h @@ -0,0 +1,219 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/* + * octeon_pip.h Packet Input Processing Block + * + */ + + + +#ifndef __OCTEON_PIP_H__ +#define __OCTEON_PIP_H__ + +/** + * Enumeration representing the amount of packet processing + * and validation performed by the input hardware. + */ +typedef enum +{ + OCTEON_PIP_PORT_CFG_MODE_NONE = 0ull, /**< Packet input doesn't perform any + processing of the input packet. */ + OCTEON_PIP_PORT_CFG_MODE_SKIPL2 = 1ull,/**< Full packet processing is performed + with pointer starting at the L2 + (ethernet MAC) header. */ + OCTEON_PIP_PORT_CFG_MODE_SKIPIP = 2ull /**< Input packets are assumed to be IP. + Results from non IP packets is + undefined. Pointers reference the + beginning of the IP header. */ +} octeon_pip_port_parse_mode_t; + + + +#define OCTEON_PIP_PRT_CFGX(offset) (0x80011800A0000200ull+((offset)*8)) +#define OCTEON_PIP_PRT_TAGX(offset) (0x80011800A0000400ull+((offset)*8)) +#define OCTEON_PIP_STAT_INB_PKTS(port) (0x80011800A0001A00ull+((port) * 32)) +#define OCTEON_PIP_STAT_INB_ERRS(port) (0x80011800A0001A10ull+((port) * 32)) + +/* + * PIP Global Config + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved2 : 45; /* Must be zero */ + uint64_t tag_syn : 1; /* Not Include src_crc in TCP..*/ + uint64_t ip6_udp : 1; /* IPv6/UDP checksum is mandatory */ + uint64_t max_l2 : 1; /* Largest L2 frame. 0/1 : 1500/1535 */ + uint64_t reserved1 : 5; /* Must be zero */ + uint64_t raw_shf : 3; /* PCI RAW Packet shift/pad amount */ + uint64_t reserved0 : 5; /* Must be zero */ + uint64_t nip_shf : 3; /* Non-IP shift/pad amount */ + } bits; +} octeon_pip_gbl_cfg_t; + + +typedef union { + uint64_t word64; + struct { + uint64_t reserved4 : 37; /* Must be zero */ + uint64_t qos : 3; /* Default POW QoS queue */ + uint64_t qos_wat : 4; /* Bitfield to enable QoS watcher */ + /* look up tables. 4 per port. */ + uint64_t reserved3 : 1; /* Must be zero */ + uint64_t spare : 1; /* Must be zero */ + uint64_t qos_diff : 1; /* Use IP diffserv to determine */ + /* the queue in the POW */ + uint64_t qos_vlan : 1; /* Use the VLAN tag to determine */ + /* the queue in the POW */ + uint64_t reserved2 : 3; /* Must be zero */ + uint64_t crc_en : 1; /* Enable HW checksum */ + uint64_t reserved1 : 2; /* Must be zero */ + octeon_pip_port_parse_mode_t mode : 2; /* Raw/Parsed/IP/etc */ + uint64_t reserved0 : 1; /* Must be zero */ + uint64_t skip : 7; /* 8 byte words to skip in the */ + /* beginning of a packet buffer */ + } bits; +} octeon_pip_port_cfg_t; + + + +/* + * Packet input to POW interface. How input packets are tagged for + * the POW is controlled here. + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 24; /**< Reserved */ + uint64_t grptagbase : 4; /**< Offset to use when computing group from tag bits + when GRPTAG is set. Only applies to IP packets. + (PASS2 only) */ + uint64_t grptagmask : 4; /**< Which bits of the tag to exclude when computing + group when GRPTAG is set. Only applies to IP packets. + (PASS2 only) */ + uint64_t grptag : 1; /**< When set, use the lower bit of the tag to compute + the group in the work queue entry + GRP = WQE[TAG[3:0]] & ~GRPTAGMASK + GRPTAGBASE. + Only applies to IP packets. (PASS2 only) */ + uint64_t spare : 1; /**< Spare bit + (PASS2 only) */ + uint64_t tag_mode : 2; /**< Which tag algorithm to use + 0 = always use tuple tag algorithm + 1 = always use mask tag algorithm + 2 = if packet is IP, use tuple else use mask + 3 = tuple XOR mask + (PASS2 only) */ + uint64_t inc_vs : 2; /**< determines the VLAN ID (VID) to be included in + tuple tag when VLAN stacking is detected + 0 = do not include VID in tuple tag generation + 1 = include VID (VLAN0) in hash + 2 = include VID (VLAN1) in hash + 3 = include VID ([VLAN0,VLAN1]) in hash + (PASS2 only) */ + uint64_t inc_vlan : 1; /**< when set, the VLAN ID is included in tuple tag + when VLAN stacking is not detected + 0 = do not include VID in tuple tag generation + 1 = include VID in hash + (PASS2 only) */ + uint64_t inc_prt_flag : 1; /**< sets whether the port is included in tuple tag */ + uint64_t ip6_dprt_flag : 1; /**< sets whether the TCP/UDP dst port is + included in tuple tag for IPv6 packets */ + uint64_t ip4_dprt_flag : 1; /**< sets whether the TCP/UDP dst port is + included in tuple tag for IPv4 */ + uint64_t ip6_sprt_flag : 1; /**< sets whether the TCP/UDP src port is + included in tuple tag for IPv6 packets */ + uint64_t ip4_sprt_flag : 1; /**< sets whether the TCP/UDP src port is + included in tuple tag for IPv4 */ + uint64_t ip6_nxth_flag : 1; /**< sets whether ipv6 includes next header in tuple + tag hash */ + uint64_t ip4_pctl_flag : 1; /**< sets whether ipv4 includes protocol in tuple + tag hash */ + uint64_t ip6_dst_flag : 1; /**< sets whether ipv6 includes dst address in tuple + tag hash */ + uint64_t ip4_dst_flag : 1; /**< sets whether ipv4 includes dst address in tuple + tag hash */ + uint64_t ip6_src_flag : 1; /**< sets whether ipv6 includes src address in tuple + tag hash */ + uint64_t ip4_src_flag : 1; /**< sets whether ipv4 includes src address in tuple + tag hash */ + uint64_t tcp6_tag_type : 2; /**< sets the tag_type of a TCP packet (IPv6) + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + uint64_t tcp4_tag_type : 2; /**< sets the tag_type of a TCP packet (IPv4) + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + uint64_t ip6_tag_type : 2; /**< sets whether IPv6 packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + uint64_t ip4_tag_type : 2; /**< sets whether IPv4 packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + uint64_t non_tag_type : 2; /**< sets whether non-IP packet tag type + 0 = ordered tags + 1 = atomic tags + 2 = Null tags */ + uint64_t grp : 4; /* POW group for input pkts */ + } bits; +} octeon_pip_port_tag_cfg_t; + + +/** + * Configure an ethernet input port + * + * @param port_num Port number to configure + * @param port_cfg Port hardware configuration + * @param port_tag_cfg + * Port POW tagging configuration + */ +static inline void octeon_pip_config_port(u_int port_num, + octeon_pip_port_cfg_t port_cfg, + octeon_pip_port_tag_cfg_t port_tag_cfg) +{ + oct_write64(OCTEON_PIP_PRT_CFGX(port_num), port_cfg.word64); + oct_write64(OCTEON_PIP_PRT_TAGX(port_num), port_tag_cfg.word64); +} + + +#endif /* __OCTEON_PIP_H__ */ diff --git a/sys/mips/cavium/dev/rgmii/octeon_pko.c b/sys/mips/cavium/dev/rgmii/octeon_pko.c new file mode 100644 index 000000000000..e93ef87004bd --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_pko.c @@ -0,0 +1,378 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/*------------------------------------------------------------------ + * octeon_pko.c Packet Output Unit + * + *------------------------------------------------------------------ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include +#include "octeon_fau.h" +#include "octeon_fpa.h" +#include "octeon_pko.h" + + +/* + * + */ +static void octeon_pko_clear_port_counts (u_int port) +{ + u_int port_num; + octeon_pko_read_idx_t octeon_pko_idx; + + octeon_pko_idx.word64 = 0; + octeon_pko_idx.bits.idx = port; + octeon_pko_idx.bits.inc = 0; + oct_write64(OCTEON_PKO_REG_READ_IDX, octeon_pko_idx.word64); + + port_num = port; + oct_write64(OCTEON_PKO_MEM_COUNT0, port_num); + port_num = port; + oct_write64(OCTEON_PKO_MEM_COUNT1, port_num); +} + +/* + * octeon_pko_init + * + */ +void octeon_pko_init (void) +{ + u_int queue, port; + octeon_pko_read_idx_t octeon_pko_idx; + octeon_pko_queue_cfg_t octeon_pko_queue_cfg; + + for (port = 0; port < OCTEON_PKO_PORTS_MAX; port++) { + octeon_pko_clear_port_counts(port); + } + + octeon_pko_idx.word64 = 0; + octeon_pko_idx.bits.idx = 0; + octeon_pko_idx.bits.inc = 1; + oct_write64(OCTEON_PKO_REG_READ_IDX, octeon_pko_idx.word64); + for (queue = 0; queue < OCTEON_PKO_QUEUES_MAX; queue++) { + + octeon_pko_queue_cfg.word64 = 0; + octeon_pko_queue_cfg.bits.queue = queue; + octeon_pko_queue_cfg.bits.port = OCTEON_PKO_PORT_ILLEGAL; + octeon_pko_queue_cfg.bits.buf_ptr = 0; + oct_write64(OCTEON_PKO_MEM_QUEUE_PTRS, octeon_pko_queue_cfg.word64); + } +} + + +/* + * octeon_pko_enable + * + * enable pko + */ +void octeon_pko_enable (void) +{ + + /* + * PKO enable + */ + oct_write64(OCTEON_PKO_REG_FLAGS, 3); /* octeon_pko_enable() */ +} + + +/* + * octeon_pko_disable + * + * disable pko + */ +void octeon_pko_disable (void) +{ + + /* + * PKO disable + */ + oct_write64(OCTEON_PKO_REG_FLAGS, 0); /* pko_disable() */ +} + +/* + * octeon_pko_config_cmdbuf_global_defaults + * + */ +void octeon_pko_config_cmdbuf_global_defaults (u_int cmdbuf_pool, + u_int cmdbuf_pool_elem_size ) +{ + octeon_pko_pool_cfg_t octeon_pko_pool_config; + + octeon_pko_pool_config.word64 = 0; + octeon_pko_pool_config.bits.pool = cmdbuf_pool; + octeon_pko_pool_config.bits.size = cmdbuf_pool_elem_size; + oct_write64(OCTEON_PKO_CMD_BUF, octeon_pko_pool_config.word64); +} + +/* + * octeon_pko_config_rgmx_ports + * + * Configure rgmx pko. Always enables 4 + 4 ports + */ +void octeon_pko_config_rgmx_ports (void) +{ + octeon_pko_reg_gmx_port_mode_t octeon_pko_gmx_mode; + + octeon_pko_gmx_mode.word64 = 0; + octeon_pko_gmx_mode.bits.mode0 = 2; /* 16 >> 2 == 4 ports */ + octeon_pko_gmx_mode.bits.mode1 = 2; /* 16 >> 2 == 4 ports */ + oct_write64(OCTEON_PKO_GMX_PORT_MODE, octeon_pko_gmx_mode.word64); +} + + +/* + * octeon_pko_config + * + * Configure PKO + * + */ +void octeon_pko_config (void) +{ +} + +/* + * octeon_pko_get_port_status + * + * Get the status counters for a PKO port. + * + * port_num Port number to get statistics for. + * clear Set to 1 to clear the counters after they are read + * status Where to put the results. + */ +void octeon_pko_get_port_status (u_int port, u_int clear, + octeon_pko_port_status_t *status) +{ + octeon_word_t packet_num; + octeon_pko_read_idx_t octeon_pko_idx; + + packet_num.word64 = 0; + + octeon_pko_idx.word64 = 0; + octeon_pko_idx.bits.idx = port; + octeon_pko_idx.bits.inc = 0; + oct_write64(OCTEON_PKO_REG_READ_IDX, octeon_pko_idx.word64); + + packet_num.word64 = oct_read64(OCTEON_PKO_MEM_COUNT0); + status->packets = packet_num.bits.word32lo; + + status->octets = oct_read64(OCTEON_PKO_MEM_COUNT1); + status->doorbell = oct_read64(OCTEON_PKO_MEM_DEBUG9); + status->doorbell = (status->doorbell >> 8) & 0xfffff; + if (clear) { + octeon_pko_clear_port_counts(port); + } +} + +static void octeon_pko_doorbell_data_dump(uint64_t port); + +static void octeon_pko_doorbell_data_dump (uint64_t port) +{ + octeon_pko_port_status_t status; + + octeon_pko_get_port_status(port, 0, &status); + printf("\n Port #%lld Pkts %ld Bytes %lld DoorBell %lld", + (unsigned long long)port, status.packets, + (unsigned long long)status.octets, + (unsigned long long)status.doorbell); +} + +/* + * octeon_pko_show + * + * Show the OCTEON_PKO status & configs + */ +void octeon_pko_show (u_int start_port, u_int end_port) +{ + u_int queue, queue_max, gmx_int0_ports, gmx_int1_ports; + u_int port; + uint64_t val64; + octeon_pko_port_status_t status; + octeon_pko_pool_cfg_t octeon_pko_pool_config; + octeon_pko_read_idx_t octeon_pko_idx; + octeon_pko_queue_mode_t octeon_pko_queue_mode; + octeon_pko_reg_gmx_port_mode_t octeon_pko_gmx_mode; + octeon_pko_crc_ports_enable_t octeon_pko_crc_ports; + octeon_pko_queue_cfg_t octeon_pko_queue_cfg; + + printf("\n\nPKO Status:"); + val64 = oct_read64(OCTEON_PKO_REG_FLAGS); + if ((val64 & 0x3) != 0x3) { + printf(" Disabled"); + return; + } else { + printf(" Enabled"); + } + octeon_pko_queue_mode.word64 = oct_read64(OCTEON_PKO_QUEUE_MODE); + queue_max = (128 >> octeon_pko_queue_mode.bits.mode); + octeon_pko_gmx_mode.word64 = oct_read64(OCTEON_PKO_GMX_PORT_MODE); + gmx_int0_ports = (16 >> octeon_pko_gmx_mode.bits.mode0); + gmx_int1_ports = (16 >> octeon_pko_gmx_mode.bits.mode1); + octeon_pko_crc_ports.word64 = oct_read64(OCTEON_PKO_REG_CRC_ENABLE); + printf("\n Total Queues: 0..%d Ports GMX0 %d GMX1 %d CRC 0x%X", + queue_max - 1, gmx_int0_ports, gmx_int1_ports, + octeon_pko_crc_ports.bits.crc_ports_mask); + + octeon_pko_pool_config.word64 = oct_read64(OCTEON_PKO_CMD_BUF); + printf("\n CmdBuf Pool: %d CmdBuf Size in Words: %d Bytes: %d", + octeon_pko_pool_config.bits.pool, octeon_pko_pool_config.bits.size, + octeon_pko_pool_config.bits.size * 8); + + octeon_pko_idx.word64 = 0; + octeon_pko_idx.bits.idx = 0; + octeon_pko_idx.bits.inc = 1; + oct_write64(OCTEON_PKO_REG_READ_IDX, octeon_pko_idx.word64); + for (queue = 0; queue < queue_max; queue++) { + + octeon_pko_queue_cfg.word64 = oct_read64(OCTEON_PKO_MEM_QUEUE_PTRS); + if (!octeon_pko_queue_cfg.bits.buf_ptr) continue; + printf("\n Port # %d Queue %3d [%d] BufPtr: 0x%llX Mask: %X%s", + octeon_pko_queue_cfg.bits.port, octeon_pko_queue_cfg.bits.queue, + octeon_pko_queue_cfg.bits.index, + (unsigned long long)octeon_pko_queue_cfg.bits.buf_ptr, + octeon_pko_queue_cfg.bits.qos_mask, + (octeon_pko_queue_cfg.bits.tail)? " Last":""); + } + printf("\n"); + + for (port = start_port; port < (end_port + 1); port++) { + + octeon_pko_get_port_status(port, 0, &status); + octeon_pko_doorbell_data_dump(port); + + } +} + + + + +/* + * octeon_pko_config_port + * + * Configure a output port and the associated queues for use. + * + */ +octeon_pko_status_t octeon_pko_config_port (u_int port, + u_int base_queue, + u_int num_queues, + const u_int priority[], + u_int pko_output_cmdbuf_fpa_pool, + octeon_pko_sw_queue_info_t sw_queues[]) +{ + octeon_pko_status_t result_code; + u_int queue; + octeon_pko_queue_cfg_t qconfig; + + if ((port >= OCTEON_PKO_PORTS_MAX) && (port != OCTEON_PKO_PORT_ILLEGAL)) { + printf("\n%% Error: octeon_pko_config_port: Invalid port %u", port); + return (OCTEON_PKO_INVALID_PORT); + } + + if ((base_queue + num_queues) > OCTEON_PKO_QUEUES_MAX) { + printf("\n%% Error: octeon_pko_config_port: Invalid queue range"); + return (OCTEON_PKO_INVALID_QUEUE); + } + + result_code = OCTEON_PKO_SUCCESS; + + for (queue = 0; queue < num_queues; queue++) { + uint64_t buf_ptr = 0; + + qconfig.word64 = 0; + qconfig.bits.tail = (queue == (num_queues - 1)) ? 1 : 0; + qconfig.bits.index = queue; + qconfig.bits.port = port; + qconfig.bits.queue = base_queue + queue; + + /* Convert the priority into an enable bit field. */ + /* Try to space the bits out evenly so the pkts don't get grouped up */ + switch ((int)priority[queue]) { + case 0: qconfig.bits.qos_mask = 0x00; break; + case 1: qconfig.bits.qos_mask = 0x01; break; + case 2: qconfig.bits.qos_mask = 0x11; break; + case 3: qconfig.bits.qos_mask = 0x49; break; + case 4: qconfig.bits.qos_mask = 0x55; break; + case 5: qconfig.bits.qos_mask = 0x57; break; + case 6: qconfig.bits.qos_mask = 0x77; break; + case 7: qconfig.bits.qos_mask = 0x7f; break; + case 8: qconfig.bits.qos_mask = 0xff; break; + default: + printf("\n%% Error: octeon_pko_config_port Invalid priority %llu", + (unsigned long long)priority[queue]); + qconfig.bits.qos_mask = 0xff; + result_code = OCTEON_PKO_INVALID_PRIORITY; + break; + } + if (port != OCTEON_PKO_PORT_ILLEGAL) { + + buf_ptr = octeon_fpa_alloc_phys(pko_output_cmdbuf_fpa_pool); + if (!buf_ptr) { + printf("\n%% Error: octeon_pko_config_port: Unable to allocate"); + return (OCTEON_PKO_NO_MEMORY); + } + + sw_queues[queue].xmit_command_state = (buf_ptr << OCTEON_PKO_INDEX_BITS); + octeon_spinlock_init(&(sw_queues[queue].lock)); + +//#define DEBUG_TX + +#ifdef DEBUG_TX + printf(" PKO: port %u pool: %u base+queue %u %u %u buf_ptr: 0x%llX\n", + port, + pko_output_cmdbuf_fpa_pool, + base_queue, queue, base_queue+queue, + buf_ptr); + +#endif + qconfig.bits.buf_ptr = buf_ptr; + oct_write64(OCTEON_PKO_MEM_QUEUE_PTRS, qconfig.word64); + + } + } + + return (result_code); +} + diff --git a/sys/mips/cavium/dev/rgmii/octeon_pko.h b/sys/mips/cavium/dev/rgmii/octeon_pko.h new file mode 100644 index 000000000000..c6ece8c2a379 --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_pko.h @@ -0,0 +1,332 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/*------------------------------------------------------------------ + * octeon_pko.h Packet Output Block + * + *------------------------------------------------------------------ + */ + + +#ifndef ___OCTEON_PKO__H___ +#define ___OCTEON_PKO__H___ + + + +/* + * PKO Command Buffer Register. + * Specify Pool-# and Size of each entry in Pool. For Output Cmd Buffers. + */ +typedef union { + uint64_t word64; + struct { + uint64_t unused_mbz : 41; /* Must be zero */ + uint64_t pool : 3; /* FPA Pool to use */ + uint64_t unused_mbz2 : 7; /* Must be zero */ + uint64_t size : 13; /* Size of the pool blocks */ + } bits; +} octeon_pko_pool_cfg_t; + + +/* + * PKO GMX Mode Register + * Specify the # of GMX1 ports and GMX0 ports + */ +typedef union { + uint64_t word64; + struct { + uint64_t unused_mbz : 58; /* MBZ */ + uint64_t mode1 : 3; /* # GMX1 ports; */ + /* 16 >> MODE1, 0 <= MODE1 <=4 */ + uint64_t mode0 : 3; /* # GMX0 ports; */ + /* 16 >> MODE0, 0 <= MODE0 <=4 */ + } bits; +} octeon_pko_reg_gmx_port_mode_t; + + +typedef union { + uint64_t word64; + struct { + uint64_t unused_mbz : 62; /* MBZ */ + uint64_t mode : 2; /* Queues Mode */ + } bits; +} octeon_pko_queue_mode_t; + + +typedef union { + uint64_t word64; + struct { + uint64_t unused_mbz : 32; /* MBZ */ + uint64_t crc_ports_mask : 32; /* CRC Ports Enable mask */ + } bits; +} octeon_pko_crc_ports_enable_t; + + + +#define OCTEON_PKO_QUEUES_MAX 128 +#define OCTEON_PKO_PORTS_MAX 36 +#define OCTEON_PKO_PORT_ILLEGAL 63 + +/* Defines how the PKO command buffer FAU register is used */ + +#define OCTEON_PKO_INDEX_BITS 12 +#define OCTEON_PKO_INDEX_MASK ((1ull << OCTEON_PKO_INDEX_BITS) - 1) + + + +typedef enum { + OCTEON_PKO_SUCCESS, + OCTEON_PKO_INVALID_PORT, + OCTEON_PKO_INVALID_QUEUE, + OCTEON_PKO_INVALID_PRIORITY, + OCTEON_PKO_NO_MEMORY +} octeon_pko_status_t; + + +typedef struct { + long packets; + uint64_t octets; + uint64_t doorbell; +} octeon_pko_port_status_t; + + +typedef union { + uint64_t word64; + struct { + octeon_mips_space_t mem_space : 2; /* Octeon IO_SEG */ + uint64_t unused_mbz :13; /* Must be zero */ + uint64_t is_io : 1; /* Must be one */ + uint64_t did : 8; /* device-ID on non-coherent bus*/ + uint64_t unused_mbz2 : 4; /* Must be zero */ + uint64_t unused_mbz3 :18; /* Must be zero */ + uint64_t port : 6; /* output port */ + uint64_t queue : 9; /* output queue to send */ + uint64_t unused_mbz4 : 3; /* Must be zero */ + } bits; +} octeon_pko_doorbell_address_t; + +/* + * Structure of the first packet output command word. + */ +typedef union { + uint64_t word64; + struct { + octeon_fau_op_size_t size1 : 2; /* The size of reg1 operation */ + /* - could be 8, 16, 32, or 64 bits */ + octeon_fau_op_size_t size0 : 2; /* The size of the reg0 operation */ + /* - could be 8, 16, 32, or 64 bits */ + uint64_t subone1 : 1; /* Subtract 1, else sub pkt size */ + uint64_t reg1 :11; /* The register, subtract will be */ + /* done if reg1 is non-zero */ + uint64_t subone0 : 1; /* Subtract 1, else sub pkt size */ + uint64_t reg0 :11; /* The register, subtract will be */ + /* done if reg0 is non-zero */ + uint64_t unused : 2; /* Must be zero */ + uint64_t wqp : 1; /* If rsp, then word3 contains a */ + /* ptr to a work queue entry */ + uint64_t rsp : 1; /* HW will respond when done */ + uint64_t gather : 1; /* If set, the supplied pkt_ptr is */ + /* a ptr to a list of pkt_ptr's */ + uint64_t ipoffp1 : 7; /* Off to IP hdr. For HW checksum */ + uint64_t ignore_i : 1; /* Ignore I bit in all pointers */ + uint64_t dontfree : 1; /* Don't free buffs containing pkt */ + uint64_t segs : 6; /* Number of segs. If gather set, */ + /* also gather list length */ + uint64_t total_bytes :16; /* Includes L2, w/o trailing CRC */ + } bits; +} octeon_pko_command_word0_t; + + +typedef union { + void* ptr; + uint64_t word64; + struct { + uint64_t i : 1; /* Invert the "free" pick of the overall pkt. */ + /* For inbound pkts, HW always sets this to 0 */ + uint64_t back : 4; /* Amount to back up to get to buffer start */ + /* in cache lines. This is mostly less than 1 */ + /* complete cache line; so the value is zero */ + uint64_t pool : 3; /* FPA pool that the buffer belongs to */ + uint64_t size :16; /* segment size (bytes) pointed at by addr */ + uint64_t addr :40; /* Ptr to 1st data byte. NOT buffer */ + } bits; +} octeon_pko_packet_ptr_t; + + +/* + * Definition of the hardware structure used to configure an + * output queue. + */ +typedef union { + uint64_t word64; + struct { + uint64_t unused_mbz : 3; /* Must be zero */ + uint64_t qos_mask : 8; /* Control Mask priority */ + /* across 8 QOS levels */ + uint64_t buf_ptr : 36; /* Command buffer pointer, */ + /* 8 byte-aligned */ + uint64_t tail : 1; /* Set if this queue is the tail */ + /* of the port queue array */ + uint64_t index : 3; /* Index (distance from head) in */ + /* the port queue array */ + uint64_t port : 6; /* Port ID for this queue mapping */ + uint64_t queue : 7; /* Hardware queue number */ + } bits; +} octeon_pko_queue_cfg_t; + + +typedef union { + uint64_t word64; + struct { + uint64_t unused_mbz : 48; + uint64_t inc : 8; + uint64_t idx : 8; + } bits; +} octeon_pko_read_idx_t; + + +typedef struct octeon_pko_sw_queue_info_t_ +{ + uint64_t xmit_command_state; + octeon_spinlock_t lock; + uint32_t pad[29]; +} octeon_pko_sw_queue_info_t; + + + +#define OCTEON_DID_PKT 10ULL +#define OCTEON_DID_PKT_SEND OCTEON_ADDR_FULL_DID(OCTEON_DID_PKT,2ULL) + + +/* + * Ring the packet output doorbell. This tells the packet + * output hardware that "len" command words have been added + * to its pending list. This command includes the required + * SYNCW before the doorbell ring. + * + * @param port Port the packet is for + * @param queue Queue the packet is for + * @param len Length of the command in 64 bit words + */ +extern void octeon_pko_doorbell_data(u_int port); + +//#define CORE_0_ONLY 1 + +static inline void octeon_pko_ring_doorbell (u_int port, u_int queue, + u_int len) +{ + octeon_pko_doorbell_address_t ptr; + + ptr.word64 = 0; + ptr.bits.mem_space = OCTEON_IO_SEG; + ptr.bits.did = OCTEON_DID_PKT_SEND; + ptr.bits.is_io = 1; + ptr.bits.port = port; + ptr.bits.queue = queue; + OCTEON_SYNCWS; + oct_write64(ptr.word64, len); +} + + + +#define OCTEON_PKO_QUEUES_PER_PORT_INTERFACE0 1 +#define OCTEON_PKO_QUEUES_PER_PORT_INTERFACE1 1 +#define OCTEON_PKO_QUEUES_PER_PORT_PCI 1 + +/* + * octeon_pko_get_base_queue + * + * For a given port number, return the base pko output queue + * for the port. + */ +static inline u_int octeon_pko_get_base_queue (u_int port) +{ + if (port < 16) { + return (port * OCTEON_PKO_QUEUES_PER_PORT_INTERFACE0); + } + if (port < 32) { + return (16 * OCTEON_PKO_QUEUES_PER_PORT_INTERFACE0 + + (port - 16) * OCTEON_PKO_QUEUES_PER_PORT_INTERFACE1); + } + return (16 * OCTEON_PKO_QUEUES_PER_PORT_INTERFACE0 + + 16 * OCTEON_PKO_QUEUES_PER_PORT_INTERFACE1 + + (port - 32) * OCTEON_PKO_QUEUES_PER_PORT_PCI); +} + + +/* + * For a given port number, return the number of pko output queues. + * + * @param port Port number + * @return Number of output queues + */ +static inline u_int octeon_pko_get_num_queues(u_int port) +{ + if (port < 16) { + return (OCTEON_PKO_QUEUES_PER_PORT_INTERFACE0); + } else if (port<32) { + return (OCTEON_PKO_QUEUES_PER_PORT_INTERFACE1); + } + + return (OCTEON_PKO_QUEUES_PER_PORT_PCI); +} + + + +/* + * Externs + */ +extern void octeon_pko_init(void); +extern void octeon_pko_enable(void); +extern void octeon_pko_disable(void); +extern void octeon_pko_show(u_int start_port, u_int end_port); +extern void octeon_pko_config(void); +extern void octeon_pko_config_cmdbuf_global_defaults(u_int cmdbuf_pool, u_int elem_size); +extern void octeon_pko_config_rgmx_ports(void); +extern void octeon_pko_get_port_status(u_int, u_int, octeon_pko_port_status_t *status); +extern octeon_pko_status_t octeon_pko_config_port(u_int port, + u_int base_queue, + u_int num_queues, + const u_int priority[], + u_int pko_output_cmdbuf_fpa_pool, + octeon_pko_sw_queue_info_t sw_queues[]); + + +#endif /* ___OCTEON_PKO__H___ */ diff --git a/sys/mips/cavium/dev/rgmii/octeon_rgmx.c b/sys/mips/cavium/dev/rgmii/octeon_rgmx.c new file mode 100644 index 000000000000..53365cc464ff --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_rgmx.c @@ -0,0 +1,2252 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* + * octeon_rgmx.c RGMII Ethernet Interfaces on Octeon + * + */ + + +/* + * Driver for the Reduced Gigabit Media Independent Interface (RGMII) + * present on the Cavium Networks' Octeon chip. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include + +#include + +#include "octeon_fau.h" +#include "octeon_fpa.h" +#include "octeon_ipd.h" +#include "octeon_pko.h" +#include "octeon_pip.h" +#include "octeon_rgmx.h" + + +/* The "battleship" boards have 8 ports */ +#define OCTEON_RGMX_NUM_PORTS_MAX 8 +#define NUM_TX_PACKETS 80 +#define NUM_RX_PACKETS 300 +#define MAX_RX_BUFS (NUM_RX_PACKETS) * (OCTEON_RGMX_NUM_PORTS_MAX) +#define MAX_TX_BUFS (NUM_TX_PACKETS) +#define OCTEON_RGMX_DEV_NAME "rgmx" +#define OCTEON_RGMX_MIN_PORT 0 +#define OCTEON_RGMX_MAX_PORT 19 +#define OCTEON_RGMX_OQUEUE_PER_PORT 8 + + +#define OCTEON_RGMX_SCHEDULED_ISRS 1 /* Use Scheduled ISRs from kernel tasks */ + + +#ifndef POW_MAX_LOOP +#define POW_MAX_LOOP 0x800 +#endif + + +/* + * CIU related stuff for enabling POW interrupts + */ +#define OCTEON_RGMX_CIU_INTX CIU_INT_0 +#define OCTEON_RGMX_CIU_ENX CIU_EN_0 + +MALLOC_DEFINE(M_RGMII_WQE, "rgmii_wqe", "FPA pool for WQEs"); + +/* Driver data */ + +struct rgmx_softc_dev { + device_t sc_dev; /* Device ID */ + uint64_t link_status; + struct ifnet *ifp; + int sc_unit; + + u_int port; + u_int idx; + u_char ieee[6]; + + char const * typestr; /* printable name of the interface. */ + u_short txb_size; /* size of TX buffer, in bytes */ + + /* Transmission buffer management. */ + u_short txb_free; /* free bytes in TX buffer */ + u_char txb_count; /* number of packets in TX buffer */ + u_char txb_sched; /* number of scheduled packets */ + + /* Media information. */ + struct ifmedia media; /* used by if_media. */ + u_short mbitmap; /* bitmap for supported media; see bit2media */ + int defmedia; /* default media */ + struct ifqueue tx_pending_queue; /* Queue of mbuf given to PKO currently */ + octeon_pko_sw_queue_info_t *outq_ptr; + + struct mtx mtx; +}; + + +/* + * Device methods + */ +static int rgmii_probe(device_t); +static void rgmii_identify(driver_t *, device_t); +static int rgmii_attach(device_t); + + + +/* + * Octeon specific routines + */ +static int octeon_has_4ports(void); +static void octeon_config_rgmii_port(u_int port); +static void octeon_rgmx_config_pip(u_int port); +static void octeon_line_status_loop(void *); +static void octeon_rx_loop(void *); +static void octeon_config_hw_units_post_ports(void); +static void octeon_config_hw_units_pre_ports(void); +static void octeon_config_hw_units_port(struct rgmx_softc_dev *sc, u_int port); +static struct rgmx_softc_dev *get_rgmx_softc(u_int port); +static void octeon_rgmx_start_port(u_int port); +static u_int octeon_rgmx_stop_port(u_int port); +static u_int get_rgmx_port_ordinal(u_int port); +static void octeon_rgmx_set_mac(u_int port); +static void octeon_rgmx_init_sc(struct rgmx_softc_dev *sc, device_t dev, u_int port, u_int num_devices); +static int octeon_rgmx_init_ifnet(struct rgmx_softc_dev *sc); +static void octeon_rgmx_mark_ready(struct rgmx_softc_dev *sc); +static void octeon_rgmx_stop(struct rgmx_softc_dev *sc); +static void octeon_rgmx_config_speed(u_int port, u_int); +#ifdef DEBUG_RGMX_DUMP +static void octeon_dump_rgmx_stats(u_int port); +static void octeon_dump_pow_stats(void); +#endif +#ifdef __not_used__ +static void rgmx_timer_periodic(void); +#endif +static void octeon_rgmx_enable_RED_all(int, int); + +#ifdef OCTEON_RGMX_SCHEDULED_ISRS +static void octeon_rgmx_isr_link(void *context, int pending); +static void octeon_rgmx_isr_rxtx(void *context, int pending); +static int octeon_rgmx_intr_fast(void *arg); +#else +static int octeon_rgmx_intr(void *arg); +#endif + + + + + + + +/* Standard driver entry points. These can be static. */ +static void octeon_rgmx_init (void *); +//static driver_intr_t rgmx_intr; +static int octeon_rgmx_ioctl (struct ifnet *, u_long, caddr_t); +static void octeon_rgmx_output_start (struct ifnet *); +static void octeon_rgmx_output_start_locked (struct ifnet *); +static int octeon_rgmx_medchange (struct ifnet *); +static void octeon_rgmx_medstat (struct ifnet *, struct ifmediareq *); + + +/* Mapping between media bitmap (in fe_softc.mbitmap) and ifm_media. */ +static int const bit2media [] = { + IFM_ETHER | IFM_AUTO, + IFM_ETHER | IFM_MANUAL, + IFM_ETHER | IFM_10_T, + IFM_ETHER | IFM_10_2, + IFM_ETHER | IFM_10_5, + IFM_ETHER | IFM_10_FL, + IFM_ETHER | IFM_10_T, + /* More can be added here... */ +}; + +/* Mapping between media bitmap (in fe_softc.mbitmap) and ifm_media. */ +#define MB_HA 0x0001 +#define MB_HM 0x0002 +#define MB_HT 0x0004 +#define MB_H2 0x0008 +#define MB_H5 0x0010 +#define MB_HF 0x0020 +#define MB_FT 0x0040 + +#define LEBLEN (ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) + + +static struct rgmx_softc_dev *rgmx_scdev_array[OCTEON_RGMX_NUM_PORTS_MAX] = {NULL}; +static u_int port_array[OCTEON_RGMX_NUM_PORTS_MAX] = {0}; +static u_int num_devices = 0; +static octeon_pko_sw_queue_info_t output_queues_array[OCTEON_RGMX_NUM_PORTS_MAX * OCTEON_RGMX_OQUEUE_PER_PORT]; +static struct resource *irq_res; /* Interrupt resource. */ +static void *int_handler_tag; + + +#ifdef OCTEON_RGMX_SCHEDULED_ISRS + +struct task link_isr_task; +struct task rxtx_isr_task; +struct taskqueue *tq; /* private task queue */ + +#endif + + + +static u_int get_rgmx_port_ordinal (u_int port) +{ + u_int idx; + + for (idx = 0; idx < OCTEON_RGMX_NUM_PORTS_MAX; idx++) { + if (port_array[idx] == port) { + return (idx); + } + } + return (-1); +} + +static struct rgmx_softc_dev *get_rgmx_softc (u_int port) +{ + u_int idx; + + idx = get_rgmx_port_ordinal(port); + if (idx != -1) { + return (rgmx_scdev_array[idx]); + } + return (NULL); +} + + + +static void octeon_rgmx_init_sc (struct rgmx_softc_dev *sc, device_t dev, u_int port, u_int num_devices) +{ + int ii; + + /* No software-controllable media selection. */ + sc->mbitmap = MB_HM; + sc->defmedia = MB_HM; + + sc->sc_dev = dev; + sc->port = port; + sc->idx = num_devices; + sc->link_status = 0; + sc->sc_unit = num_devices; + sc->mbitmap = MB_HT; + sc->defmedia = MB_HT; + sc->tx_pending_queue.ifq_maxlen = NUM_TX_PACKETS; + sc->tx_pending_queue.ifq_head = sc->tx_pending_queue.ifq_tail = NULL; + sc->tx_pending_queue.ifq_len = sc->tx_pending_queue.ifq_drops = 0; + mtx_init(&sc->tx_pending_queue.ifq_mtx, "if->sc->txpq.ifqmtx", NULL, MTX_DEF); + + sc->outq_ptr = &(output_queues_array[num_devices * OCTEON_RGMX_OQUEUE_PER_PORT]); + + for (ii = 0; ii < 6; ii++) { + sc->ieee[ii] = octeon_mac_addr[ii]; + } + sc->ieee[5] += get_rgmx_port_ordinal(port); + +} + +static int octeon_rgmx_init_ifnet (struct rgmx_softc_dev *sc) +{ + struct ifnet *ifp; + + ifp = sc->ifp = if_alloc(IFT_ETHER); + if (NULL == ifp) { + device_printf(sc->sc_dev, "can not ifalloc for rgmx port\n"); + return (ENOSPC); + } + /* + * Initialize ifnet structure + */ + ifp->if_softc = sc; + if_initname(sc->ifp, device_get_name(sc->sc_dev), device_get_unit(sc->sc_dev)); + ifp->if_start = octeon_rgmx_output_start; + ifp->if_ioctl = octeon_rgmx_ioctl; + ifp->if_hwassist = CSUM_TCP | CSUM_UDP; + ifp->if_capabilities = IFCAP_HWCSUM; + ifp->if_capenable = ifp->if_capabilities; + ifp->if_init = octeon_rgmx_init; + ifp->if_linkmib = NULL; // &sc->mibdata; + ifp->if_linkmiblen = 0; // sizeof (sc->mibdata); + /* + * Set fixed interface flags. + */ + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; +// | IFF_NEEDSGIANT; + if (ifp->if_snd.ifq_maxlen == 0) + ifp->if_snd.ifq_maxlen = ifqmaxlen; + + ifmedia_init(&sc->media, 0, octeon_rgmx_medchange, octeon_rgmx_medstat); + ifmedia_add(&sc->media, bit2media[0], 0, NULL); + ifmedia_set(&sc->media, bit2media[0]); + + ether_ifattach(sc->ifp, sc->ieee); + /* Print additional info when attached. */ + device_printf(sc->sc_dev, "type %s, full duplex\n", sc->typestr); + + return (0); +} + + + +/* Driver methods */ + + +/* ------------------------------------------------------------------- * + * rgmii_identify() * + * ------------------------------------------------------------------- */ +static void rgmii_identify (driver_t *drv, device_t parent) +{ + BUS_ADD_CHILD(parent, 0, "rgmii", 0); +} + + +/* ------------------------------------------------------------------- * + * rgmii_probe() * + * ------------------------------------------------------------------- */ +static int rgmii_probe (device_t dev) +{ + if (device_get_unit(dev) != 0) + panic("can't probe/attach more rgmii devices\n"); + + device_set_desc(dev, "Octeon RGMII"); + return (0); +} + + + +/* ------------------------------------------------------------------- * + * rgmii_attach() * + * ------------------------------------------------------------------- */ +static int rgmii_attach (device_t dev) +{ + struct rgmx_softc_dev *sc; + device_t child; + int iface, port, nr_ports, error; + void *softc; + int irq_rid; + + octeon_config_hw_units_pre_ports(); + + /* Count interfaces and ports*/ + octeon_gmxx_inf_mode_t iface_mode; + iface_mode.word64 = 0; + + for (iface = 0; iface < 2; iface++) { + iface_mode.word64 = oct_read64(OCTEON_RGMX_INF_MODE(iface)); + + /* interface is either disabled or SPI */ + if (!iface_mode.bits.en) + continue; + if (octeon_get_chipid() == OCTEON_CN3020_CHIP) { + nr_ports = 2; + } else { + nr_ports = (octeon_has_4ports()) ? 4 : 3; + if (iface_mode.bits.type ) { + if (octeon_get_chipid() == OCTEON_CN5020_CHIP) + nr_ports = 2; + else + continue; + } + } + + oct_write64(OCTEON_RGMX_TX_PRTS(iface), nr_ports); + + for (port = iface * 16; port < iface * 16 + nr_ports; port++) { + + child = device_add_child(dev, OCTEON_RGMX_DEV_NAME, num_devices); + if (child == NULL) + panic("%s: device_add_child() failed\n", __func__); + + softc = malloc(sizeof(struct rgmx_softc_dev), M_DEVBUF, M_NOWAIT | M_ZERO); + if (!softc) { + panic("%s malloc failed for softc\n", __func__); + } + device_set_softc(child, softc); + device_set_desc(child, "Octeon RGMII"); + sc = device_get_softc(child); + if (!sc) { + printf(" No sc\n"); + num_devices++; + continue; + } + port_array[num_devices] = port; + rgmx_scdev_array[num_devices] = sc; + RGMX_LOCK_INIT(sc, device_get_nameunit(child)); + octeon_rgmx_init_sc(sc, child, port, num_devices); + octeon_config_hw_units_port(sc, port); + if (octeon_rgmx_init_ifnet(sc)) { + device_printf(dev, " ifinit failed for rgmx port %u\n", port); + return (ENOSPC); + } +/* + * Don't call octeon_rgmx_mark_ready() + * ifnet will call it indirectly via octeon_rgmx_init() + * + * octeon_rgmx_mark_ready(sc); + */ + num_devices++; + } + } + + octeon_config_hw_units_post_ports(); + + irq_rid = 0; + irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &irq_rid, 0, 0, 1, RF_SHAREABLE | RF_ACTIVE); + if (irq_res == NULL) { + device_printf(dev, "failed to allocate irq\n"); + return (ENXIO); + } + + +#ifdef OCTEON_RGMX_SCHEDULED_ISRS + /* + * Single task queues for all child devices. Since POW gives us a unified + * interrupt based on POW groups, not based on PORTs. + */ + TASK_INIT(&rxtx_isr_task, 0, octeon_rgmx_isr_rxtx, NULL); + TASK_INIT(&link_isr_task, 0, octeon_rgmx_isr_link, NULL); + tq = taskqueue_create_fast("octeon_rgmx_taskq", M_NOWAIT, + taskqueue_thread_enqueue, &tq); + taskqueue_start_threads(&tq, 1, PI_NET, "%s taskq", device_get_nameunit(dev)); + + error = bus_setup_intr(dev, irq_res, INTR_TYPE_NET, octeon_rgmx_intr_fast, NULL, + NULL, &int_handler_tag); + if (error != 0) { + device_printf(dev, "bus_setup_intr returned %d\n", error); + taskqueue_free(tq); + tq = NULL; + return (error); + } + +#else /* OCTEON_RGMX_SCHEDULED_ISRS */ + + error = bus_setup_intr(dev, irq_res, INTR_TYPE_NET, octeon_rgmx_intr, NULL, + NULL, &int_handler_tag); + + if (error != 0) { + device_printf(dev, "bus_setup_intr returned %d\n", error); + tq = NULL; + return (error); + } + +#endif /* OCTEON_RGMX_SCHEDULED_ISRS */ + + return (bus_generic_attach(dev)); +} + + + + +#define OCTEON_MAX_RGMX_PORT_NUMS 32 + + + +#define OCTEON_POW_RX_GROUP_NUM 0 +#define OCTEON_POW_TX_GROUP_NUM 1 /* If using TX WQE from PKO */ + +#define OCTEON_POW_RX_GROUP_MASK (1 << OCTEON_POW_RX_GROUP_NUM) +#define OCTEON_POW_TX_GROUP_MASK (1 << OCTEON_POW_TX_GROUP_NUM) +#define OCTEON_POW_ALL_OUR_GROUPS_MASK (OCTEON_POW_RX_GROUP_MASK | OCTEON_POW_RX_GROUP_MASK) +#define OCTEON_POW_ALL_GROUPS_MASK 0xffff +#define OCTEON_POW_WORKQUEUE_INT (0x8001670000000200ull) +#define OCTEON_POW_WORKQUEUE_INT_PC (0x8001670000000208ull) +#define OCTEON_POW_WORKQUEUE_INT_THRESHOLD(group_num) ((0x8001670000000080ull+((group_num)*0x8))) +#define OCTEON_RGMX_POW_NOS_CNT (0x8001670000000228ull) +#define OCTEON_POW_INT_CNTR(core) (0x8001670000000100ull+((core)*0x8)) +#define OCTEON_POW_INPT_Q_ALL_QOS (0x8001670000000388ull) +#define OCTEON_POW_INPT_QOS_GRP(grp) (0x8001670000000340ull + ((grp) * 0x8)) + + + + +#define NUM_RX_PACKETS_CTL (MAX_RX_BUFS + 3000) +#define NUM_TX_PACKETS_CTL 40 + +#define FPA_NOPOOL 0 + +#define OCTEON_FPA_RX_PACKET_POOL 0 +#define OCTEON_FPA_RX_PACKET_POOL_WORDS 208 /* 2048 bytes */ +#define OCTEON_FPA_RX_PACKET_POOL_ELEM_SIZE (OCTEON_FPA_RX_PACKET_POOL_WORDS) +#define OCTEON_FPA_RX_PACKET_POOL_ELEMENTS (MAX_RX_BUFS) +#define OCTEON_RX_MAX_SIZE (OCTEON_FPA_RX_PACKET_POOL_WORDS * sizeof(uint64_t)) + +#define OCTEON_FPA_WQE_RX_POOL 1 +#define OCTEON_FPA_WQE_RX_WORDS (OCTEON_CACHE_LINE_SIZE/8) +#define OCTEON_FPA_WQE_RX_POOL_ELEM_SIZE (OCTEON_FPA_WQE_RX_WORDS) +#define OCTEON_FPA_WQE_RX_POOL_ELEMENTS (NUM_RX_PACKETS_CTL) + +#define OCTEON_FPA_TX_PACKET_POOL 2 +#define OCTEON_FPA_TX_PACKET_POOL_WORDS 208 /* 2048 bytes */ +#define OCTEON_FPA_TX_PACKET_POOL_ELEM_SIZE (OCTEON_FPA_TX_PACKET_POOL_WORDS) +#define OCTEON_FPA_TX_PACKET_POOL_ELEMENTS (MAX_TX_BUFS) +#define OCTEON_TX_MAX_SIZE (OCTEON_FPA_TX_PACKET_POOL_WORDS * sizeof(uint64_t)) + +#define OCTEON_FPA_TX_CMDBUF_POOL 3 +#define OCTEON_FPA_TX_CMD_SIZE 2 +#define OCTEON_FPA_TX_CMD_NUM 300 +#define OCTEON_FPA_TX_CMDBUF_POOL_WORDS (OCTEON_FPA_TX_CMD_SIZE * OCTEON_FPA_TX_CMD_NUM) +#define OCTEON_FPA_TX_CMDBUF_POOL_ELEM_SIZE (OCTEON_FPA_TX_CMDBUF_POOL_WORDS +1) +#define OCTEON_FPA_TX_CMDBUF_POOL_ELEMENTS (30 * OCTEON_RGMX_NUM_PORTS_MAX) + +#define FIRST_PARTICLE_SKIP 0 +#define NOT_FIRST_PARTICLE_SKIP 0 + +#define ENABLE_BACK_PRESSURE 0 +#define RGMX_MAX_PAK_RECEIVE 5000000 + + +#ifdef OCTEON_RGMX_SCHEDULED_ISRS + + +static void octeon_rgmx_isr_link (void *context, int pending) +{ + octeon_line_status_loop(NULL); +} + + +static void octeon_rgmx_isr_rxtx (void *context, int pending) +{ + octeon_rx_loop(NULL); +} + + +/********************************************************************* + * + * Fast Interrupt Service routine + * + *********************************************************************/ + +//#define OCTEON_RGMX_POW_TIME_THR_INTS 1 + + +static int octeon_rgmx_intr_fast(void *arg) +{ + + int handled_flag = 0; + uint64_t ciu_summary; + + ciu_summary = ciu_get_int_summary(CIU_THIS_CORE, OCTEON_RGMX_CIU_INTX, + OCTEON_RGMX_CIU_ENX); + + if (ciu_summary & CIU_GENTIMER_BITS_ENABLE(CIU_GENTIMER_NUM_1)) { + + /* + * Timer Interrupt for link status checks + * Acknowledging it will mask it for this cycle. + */ + ciu_clear_int_summary(CIU_THIS_CORE, OCTEON_RGMX_CIU_INTX, + OCTEON_RGMX_CIU_ENX, + CIU_GENTIMER_BITS_ENABLE(CIU_GENTIMER_NUM_1)); + + taskqueue_enqueue(taskqueue_fast, &link_isr_task); + handled_flag = 1; + } + + if (ciu_summary & OCTEON_POW_ALL_GROUPS_MASK) { +#ifndef OCTEON_RGMX_POW_TIME_THR_INTS + /* + * When using POW IQ/DSQ size based interrupts, then + * ack the interrupts right away. So they don't interrupt + * until the queue size goes to 0 again. + */ + oct_write64(OCTEON_POW_WORKQUEUE_INT, + 0x10001 << OCTEON_POW_RX_GROUP_NUM); + +#else + /* + * We use POW thresholds based interrupt signalled on timer + * countdown. Acknowledge it now so that it doesn't + * interrupt us until next countdown to zero. + */ + oct_write64(OCTEON_POW_WORKQUEUE_INT, + 0x1 << OCTEON_POW_RX_GROUP_NUM); +#endif + + taskqueue_enqueue(tq, &rxtx_isr_task); + handled_flag = 1; + } + + return ((handled_flag) ? FILTER_HANDLED : FILTER_STRAY); +} + + +#else /* ! OCTEON_RGMX_SCHEDULED_ISRS */ + + +/* + * octeon_rgmx_intr + * + * This is direct inline isr. Will do all its work and heavy-lifting in interrupt context. + * + * Also note that the RGMX_LOCK/UNLOCK code will have to checked/added, since that is new and + * was not supported with this model. + */ +static int octeon_rgmx_intr (void *arg) +{ + int flag = 0; + uint64_t ciu_summary; + + /* + * read ciu to see if any bits are pow + */ + while (1) { + ciu_summary = ciu_get_int_summary(CIU_THIS_CORE, OCTEON_RGMX_CIU_INTX, + OCTEON_RGMX_CIU_ENX); + + if ((ciu_summary & (OCTEON_POW_ALL_GROUPS_MASK | CIU_GENTIMER_BITS_ENABLE(CIU_GENTIMER_NUM_1))) == 0) { + break; + } + + flag = 1; + + if (ciu_summary & OCTEON_POW_ALL_GROUPS_MASK) { + octeon_rx_loop(NULL); + /* + * Acknowledge the interrupt after processing queues. + */ + oct_write64(OCTEON_POW_WORKQUEUE_INT, OCTEON_POW_RX_GROUP_MASK); + } + if (ciu_summary & CIU_GENTIMER_BITS_ENABLE(CIU_GENTIMER_NUM_1)) { + octeon_line_status_loop(NULL); + ciu_clear_int_summary(CIU_THIS_CORE, OCTEON_RGMX_CIU_INTX, + OCTEON_RGMX_CIU_ENX, + CIU_GENTIMER_BITS_ENABLE(CIU_GENTIMER_NUM_1)); + } + } + + return ((flag) ? FILTER_HANDLED : FILTER_STRAY); +} + + +#endif /* OCTEON_RGMX_SCHEDULED_ISRS */ + + + +static struct mbuf *octeon_rgmx_build_new_rx_mbuf(struct ifnet *ifp, void *data_start, u_int totlen); + +static struct mbuf *octeon_rgmx_build_new_rx_mbuf (struct ifnet *ifp, void *data_start, u_int totlen) +{ + struct mbuf *m, *m0, *newm; + caddr_t newdata; + int len; + + if (totlen <= ETHER_HDR_LEN || totlen > LEBLEN - ETHER_CRC_LEN) { +#ifdef LEDEBUG + if_printf(ifp, "invalid packet size %d; dropping\n", totlen); +#endif + return (NULL); + } + + MGETHDR(m0, M_DONTWAIT, MT_DATA); + if (m0 == NULL) { + return (NULL); + } + + /* Initialize packet header info. */ + m0->m_pkthdr.rcvif = ifp; + m0->m_pkthdr.len = totlen; + m0->m_pkthdr.csum_flags = CSUM_IP_CHECKED | CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR; + m0->m_pkthdr.csum_data = 0xffff; + len = MHLEN; + m = m0; + + while (totlen > 0) { + if (totlen >= MINCLSIZE) { + MCLGET(m, M_DONTWAIT); + if ((m->m_flags & M_EXT) == 0) + goto octeon_rgmx_build_new_rx_mbuf_bad; + len = MCLBYTES; + } + + if (m == m0) { + newdata = (caddr_t)ALIGN(m->m_data + ETHER_HDR_LEN) - ETHER_HDR_LEN; + len -= newdata - m->m_data; + m->m_data = newdata; + } + + /* Set the length of this mbuf. */ + m->m_len = len = min(totlen, len); + bcopy(data_start, mtod(m, caddr_t), len); + data_start = (void *) (((u_long) (data_start)) + len); + + totlen -= len; + if (totlen > 0) { + MGET(newm, M_DONTWAIT, MT_DATA); + if (newm == 0) + goto octeon_rgmx_build_new_rx_mbuf_bad; + len = MLEN; + m = m->m_next = newm; + } + } + + return (m0); + +octeon_rgmx_build_new_rx_mbuf_bad: + + m_freem(m0); + return (NULL); +} + + + +//#define DEBUG_RX 1 + +static void octeon_rgmx_rx_process_work (octeon_wqe_t *work, u_int port) +{ + struct rgmx_softc_dev *sc; + struct ifnet *ifp; + u_int len; + void *data_start, *new_data_start; + struct mbuf *mbuf; + +//#define DEBUG_RX_PKT_DUMP 1 +#ifdef DEBUG_RX_PKT_DUMP + int i; u_char *dc; +#endif + + data_start = octeon_pow_pktptr_to_kbuffer(work->packet_ptr); + +//#define DEBUG_RX2 +#ifdef DEBUG_RX2 + printf(" WQE 0x%X: port:%u ", work, port); + printf(" Grp: %u, %llX Tag: %u %llX type: %u 0x%llx\n", + work->grp, work->grp, work->tag, work->tag, work->tag_type, work->tag_type); +#endif + + if ((port >= OCTEON_RGMX_MIN_PORT) || (port <= OCTEON_RGMX_MAX_PORT)) { + + sc = get_rgmx_softc(port); + + if (!sc || !sc->ifp) { + + printf(" octeon_rgmx_rx_process_work No sc or sc->ifp - port:%u", port); + } else { + + ifp = sc->ifp; + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + + if (!work->word2.bits.rcv_error) { + + len = work->len; + + /* + * We cannot pass the same FPA phys-buffer higher up. + * User space will not be able to use this phys-buffer. + * + * Start building a mbuf packet here using data_start & len. + */ + + new_data_start = data_start; + if (!work->word2.bits.not_IP) { + new_data_start = (void *) (((unsigned long) (new_data_start)) + 14); + /* mark it as checksum checked */ + } else { + new_data_start = (void *) (((unsigned long) (new_data_start)) + 8); + } + +#ifdef DEBUG_RX_PKT_DUMP + dc = new_data_start; printf("In:\n"); + for (i = 0; i < len; i++) { if (!(i % 16)) printf ("\n"); printf(" %02X", dc[i]); } +#endif + + mbuf = octeon_rgmx_build_new_rx_mbuf(ifp, new_data_start, len); + if (mbuf) { +// printf(" Passing pkt to ifp: pkt_len: %u len: %u ", mbuf->m_pkthdr.len, mbuf->m_len); +#ifdef DEBUG_RX_PKT_DUMP + + dc = mtod(mbuf, u_char *); printf("\n"); printf("In: "); + for (i = 0; i < mbuf->m_len; i++) { if (!(i % 16)) printf ("\n"); printf(" %02X", dc[i]); } + +#endif + + /* Feed the packet to upper layer. */ + (*ifp->if_input)(ifp, mbuf); + ifp->if_ipackets++; + + } else { /* mbuf error */ + if_printf(ifp, "mbuf rx construct error\n"); + printf(" mbuf rx construct error\n"); + ifp->if_ierrors++; + } /* mbuf error */ + + } else { /* rcv_error */ + ifp->if_ierrors++; + } /* rcv_error */ + + } /* IFF_DRV_RUNNING */ + + } /* sc && sc->ifp */ + + } else { /* port number */ + printf(" rgmx_rx:%u bad port\n", port); + } + + octeon_fpa_free(data_start, OCTEON_FPA_RX_PACKET_POOL, 0); + octeon_fpa_free((void *)work, OCTEON_FPA_WQE_RX_POOL, 0); +} + + + + +/* ------------------------------------------------------------------- * + * octeon_rx_loop() * + * ------------------------------------------------------------------- */ + + +//#define OCTEON_VISUAL_RGMX 1 +#ifdef OCTEON_VISUAL_RGMX +static int where0 = 0; +static int where1 = 0; +#endif + +static void octeon_rx_loop (void *unused) +{ + u_int core_id; + uint64_t prev_grp_mask; + u_int pak_count; + octeon_wqe_t *work; + + core_id = octeon_get_core_num(); + pak_count = 0; + + /* Only allow work for our group */ + prev_grp_mask = oct_read64(OCTEON_POW_CORE_GROUP_MASK(core_id)); + oct_write64(OCTEON_POW_CORE_GROUP_MASK(core_id), OCTEON_POW_ALL_GROUPS_MASK); + + +#ifdef OCTEON_VISUAL_RGMX + octeon_led_run_wheel(&where0, 3); +#endif + while(1) { + + if (pak_count++ > RGMX_MAX_PAK_RECEIVE) { + break; + } + + work = octeon_pow_work_request_sync(OCTEON_POW_WAIT); + + if (work == NULL) { + /* + * No more incoming packets. We can take a break now. + */ + break; + } + +#ifdef OCTEON_VISUAL_RGMX + octeon_led_run_wheel(&where1, 4); +#endif + octeon_rgmx_rx_process_work(work, work->ipprt); + + } + + oct_write64(OCTEON_POW_CORE_GROUP_MASK(core_id), prev_grp_mask); +} + + +static void *octeon_rgmx_write_mbufs_to_fpa_buff (struct rgmx_softc_dev *sc, struct mbuf *m, u_int len) +{ + struct mbuf *mp; + void *data_area; + u_char *write_offset; + + /* + * FIXME + * + * Compare len with max FPA-tx-packet size. Or else we will possibly corrupt the next pkt. + */ + + + /* + * Get an FPA buffer from Xmit-packets FPA pool + */ + data_area = octeon_fpa_alloc(OCTEON_FPA_TX_PACKET_POOL); + if (!data_area) { + /* + * Fail. No room. No resources. + */ + return (NULL); + } + + /* + * Transfer the data from mbuf chain to the transmission buffer. + */ + write_offset = data_area; + for (mp = m; mp != 0; mp = mp->m_next) { + if (mp->m_len) { + bcopy(mtod(mp, caddr_t), write_offset, mp->m_len); + write_offset = (u_char *) (((u_long) write_offset) + mp->m_len); + } + } + return (data_area); +} + + +static u_int octeon_rgmx_pko_xmit_packet (struct rgmx_softc_dev *sc, void *out_buff, u_int len, u_int checksum) +{ + octeon_pko_command_word0_t pko_cmd; + octeon_pko_packet_ptr_t pko_pkt_word; + u_long temp; + u_short xmit_cmd_index; + uint64_t *xmit_cmd_ptr; + uint64_t xmit_cmd_state; + int queue = 0; // we should randomize queue # based on core num. Using same + // queue 0 for this port, by all cores on is less efficient. + + /* + * Prepare the PKO buffer and command word. + * Cmd Buf Word 0 + * No FAU + * Set #-segs and #-bytes + */ + pko_cmd.word64 = 0; + pko_cmd.bits.segs = 1; + pko_cmd.bits.total_bytes = len; + if (checksum) { + pko_cmd.bits.ipoffp1 = ETHER_HDR_LEN + 1; /* IPOffP1 is +1 based. 1 means offset 0 */ + } + + /* + * Build the PKO buffer pointer. PKO Cmd Buf Word 1 + */ + pko_pkt_word.word64 = 0; + pko_pkt_word.bits.addr = OCTEON_PTR2PHYS(out_buff); + pko_pkt_word.bits.pool = OCTEON_FPA_TX_PACKET_POOL; + pko_pkt_word.bits.size = 2048; // dummy. Actual len is above. + +#ifdef DEBUG_TX + printf(" PKO: 0x%llX 0x%llX ", pko_cmd.word64, pko_pkt_word.word64); +#endif + + /* + * Get the queue command ptr location from the per port per queue, pko info struct. + */ + octeon_spinlock_lock(&(sc->outq_ptr[queue].lock)); +#ifdef DEBUG_TX + printf(" xmit: sc->outq_ptr[queue].xmit_command_state: 0x%llX ", sc->outq_ptr[queue].xmit_command_state); +#endif + xmit_cmd_state = sc->outq_ptr[queue].xmit_command_state; + sc->outq_ptr[queue].xmit_command_state = xmit_cmd_state + 2; + + temp = (u_long) (xmit_cmd_state >> OCTEON_PKO_INDEX_BITS); +#ifdef DEBUG_TX + printf(" temp: 0x%X ", temp); +#endif + xmit_cmd_ptr = (uint64_t *) MIPS_PHYS_TO_KSEG0(temp); + xmit_cmd_index = xmit_cmd_state & OCTEON_PKO_INDEX_MASK; + xmit_cmd_ptr += xmit_cmd_index; + + /* + * We end the PKO cmd buffer at odd boundary. Towards the end we will have + * 4 or 3 or 2 or 1 or 0 word remaining. Case of 4, 2, or 0 can never happen. + * We only care when we have 3 words remaining. In this case we write our 2 words + * for PKO command and 3rd word as chain for next PKO cmd buffer. + */ + xmit_cmd_ptr[0] = pko_cmd.word64; + + if (xmit_cmd_index < (OCTEON_FPA_TX_CMDBUF_POOL_WORDS - 2)) { + /* + * Plenty of space left. Write our 2nd word and worry the next time. + */ + xmit_cmd_ptr[1] = pko_pkt_word.word64; + + } else { + /* + * 3 words or less are left. We write our 2nd word now and then put in a chain link + * to new PKO cmd buf. + */ + void *pko_cmd_buf = octeon_fpa_alloc(OCTEON_FPA_TX_CMDBUF_POOL); + uint64_t phys_cmd_buf; + + if (!pko_cmd_buf) { + /* + * FPA pool for xmit-buffer-commands is empty. + */ + sc->outq_ptr[queue].xmit_command_state -= 2; + octeon_spinlock_unlock(&(sc->outq_ptr[queue].lock)); + return (0); + } + phys_cmd_buf = OCTEON_PTR2PHYS(pko_cmd_buf); + + xmit_cmd_ptr[1] = pko_pkt_word.word64; + xmit_cmd_ptr[2] = phys_cmd_buf; + + sc->outq_ptr[queue].xmit_command_state = (phys_cmd_buf << OCTEON_PKO_INDEX_BITS); + } + /* + * Unlock queue structures. + */ + octeon_spinlock_unlock(&(sc->outq_ptr[queue].lock)); + + /* + * 2 words incremented in PKO. Ring the doorbell. + */ +#ifdef DEBUG_TX + printf(" Ringing doorbell: Port %u Queue %u words 2", sc->port, octeon_pko_get_base_queue(sc->port) + queue); +#endif + octeon_pko_ring_doorbell(sc->port, octeon_pko_get_base_queue(sc->port) + queue, 2); + + return (1); +} + + +static void octeon_rgmx_xmit_mark_buffers_done(struct rgmx_softc_dev *sc, u_int n); + +static void octeon_rgmx_xmit_mark_buffers_done (struct rgmx_softc_dev *sc, u_int n) +{ + struct mbuf *m; + u_int i; + + for (i = 0; i < n; i++) { + /* + * Remove packets in queue. Leaving a lag of 3, to allow for PKO in-flight xmission + */ + if (_IF_QLEN(&sc->tx_pending_queue) > 4) { + IF_DEQUEUE(&sc->tx_pending_queue, m); + if (!m) { + break; // Queue became empty now. Break out. + } + /* + * Return the mbuf to system. + */ + m_freem(m); + } + } + if (!i) { + return; // Nothing removed from queue. + } + + /* + * The transmitter is no more active. + * Reset output active flag and watchdog timer. + */ + sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; +} + + +#define OCTEON_RGMX_FLUSH_N_XMIT_MBUFS_EACH_LOOP 5 +#define OCTEON_RGMX_FLUSH_PENDING_MBUFS_MAX 1000 + +#ifdef __not_used__ +/* + * octeon_rgmx_output_flush + * + * Drop all packets queued at ifnet layer. + */ +static void octeon_rgmx_output_flush (struct ifnet *ifp) +{ + struct mbuf *m; + u_int max_flush = OCTEON_RGMX_FLUSH_PENDING_MBUFS_MAX; /* Arbitrarily high number */ + + while (max_flush-- && _IF_QLEN(&ifp->if_snd)) { + /* + * Get the next mbuf Packet chain to flush. + */ + IF_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) { + /* No more packets to flush */ + break; + } + _IF_DROP(&ifp->if_snd); + m_freem(m); + ifp->if_oerrors++; + } +} +#endif + +/* + * octeon_rgmx_output_start + * + * Start output on interface. + */ +static void octeon_rgmx_output_start (struct ifnet *ifp) +{ + struct rgmx_softc_dev *sc = ifp->if_softc; + + RGMX_LOCK(sc); + octeon_rgmx_output_start_locked(ifp); + RGMX_UNLOCK(sc); +} + + + +/* + * octeon_rgmx_output_start_locked + * + * Start output on interface. Assume Driver locked + */ +static void octeon_rgmx_output_start_locked (struct ifnet *ifp) +{ + struct rgmx_softc_dev *sc = ifp->if_softc; + struct mbuf *m; + u_int len, need_l4_checksum; + void *out_buff; + + /* + * Take out some of the last queued mbuf's from xmit-pending queue + */ + octeon_rgmx_xmit_mark_buffers_done(sc, OCTEON_RGMX_FLUSH_N_XMIT_MBUFS_EACH_LOOP); + + while (1) { + /* + * See if there is room to put another packet in the buffer. + * We *could* do better job by peeking the send queue to + * know the length of the next packet. Current version just + * tests against the worst case (i.e., longest packet). FIXME. + * + * When adding the packet-peek feature, don't forget adding a + * test on txb_count against QUEUEING_MAX. + * There is a little chance the packet count exceeds + * the limit. Assume transmission buffer is 8KB (2x8KB + * configuration) and an application sends a bunch of small + * (i.e., minimum packet sized) packets rapidly. An 8KB + * buffer can hold 130 blocks of 62 bytes long... + */ + + /* + * If unable to send more. + */ + if (_IF_QLEN(&sc->tx_pending_queue) >= MAX_TX_BUFS) { + printf(" Xmit not possible. NO room %u", _IF_QLEN(&sc->tx_pending_queue)); + goto indicate_active; + } + + + /* + * Get the next mbuf chain for a packet to send. + */ + IF_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) { + /* No more packets to send. */ + goto indicate_inactive; + } + + len = m->m_pkthdr.len; + /* + * Should never send big packets. If such a packet is passed, + * it should be a bug of upper layer. We just ignore it. + * ... Partial (too short) packets, neither. + */ + if (len < ETHER_HDR_LEN || + len > ETHER_MAX_LEN - ETHER_CRC_LEN) { + /* + * Fail. Bad packet size. Return the mbuf to system. + */ + if_printf(ifp, + "got an out-of-spec packet (%u bytes) to send\n", len); + m_freem(m); + goto indicate_active; + } + + /* + * Copy the mbuf chain into the transmission buffer. + * txb_* variables are updated as necessary. + */ + out_buff = octeon_rgmx_write_mbufs_to_fpa_buff(sc, m, len); + if (!out_buff) { + /* + * No FPA physical buf resource. + * Let's requeue it back. And slow it down for a while. + */ + IF_PREPEND(&ifp->if_snd, m); + goto indicate_active; + } + + need_l4_checksum = (m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)) ? 1 : 0; + + /* + * put the mbuf onto pending queue + */ +//#define DEBUG_TX_PKT_DUMP 1 +#ifdef DEBUG_TX_PKT_DUMP + int ii; + u_char *dc = out_buff; + + printf("\n"); printf("Out: "); + for (ii = 0; ii < len; ii++) printf(" %X", dc[ii]); printf("\n"); +#endif + + IF_ENQUEUE(&sc->tx_pending_queue, m); + + /* + * Pass the mbuf data packet to PKO for xmission. + */ + octeon_rgmx_pko_xmit_packet(sc, out_buff, len, need_l4_checksum); + + ifp->if_opackets++; + } + +indicate_inactive: + /* + * We are using the !OACTIVE flag to indicate to + * the outside world that we can accept an + * additional packet rather than that the + * transmitter is _actually_ active. Indeed, the + * transmitter may be active, but if we haven't + * filled all the buffers with data then we still + * want to accept more. + */ + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + return; + + +indicate_active: + /* + * The transmitter is active, and there are no room for + * more outgoing packets in the transmission buffer. + */ + ifp->if_oerrors++; +// sc->mibdata.dot3StatsInternalMacTransmitErrors++; + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + return; +} + + + + +/* ------------------------------------------------------------------- * + * octeon_config_hw_units() * + * ------------------------------------------------------------------- * + * + * Initialize Octeon hardware components. To get the RGMX going. + * + */ +static void octeon_config_hw_units_pre_ports (void) +{ + + /* Enable FPA */ + octeon_enable_fpa(); + + /* Enable PKO */ + octeon_pko_enable(); + + /* Init PKO */ + octeon_pko_init(); + + + /* Fill FPA */ + + /* + * Input Buffers Pool + * Pool 0 + */ + octeon_fpa_fill_pool_mem(OCTEON_FPA_RX_PACKET_POOL, OCTEON_FPA_RX_PACKET_POOL_ELEM_SIZE, + OCTEON_FPA_RX_PACKET_POOL_ELEMENTS); + + /* + * WQE Blocks Pool + * Pool 1 + */ + octeon_fpa_fill_pool_mem(OCTEON_FPA_WQE_RX_POOL, OCTEON_FPA_WQE_RX_POOL_ELEM_SIZE, + OCTEON_FPA_WQE_RX_POOL_ELEMENTS); + + /* + * PKO Command Pool + * Pool 3 + */ + octeon_fpa_fill_pool_mem(OCTEON_FPA_TX_CMDBUF_POOL, OCTEON_FPA_TX_CMDBUF_POOL_ELEM_SIZE, + OCTEON_FPA_TX_CMDBUF_POOL_ELEMENTS); + + /* + * Output Buffers Pool + * Pool 2 + */ + octeon_fpa_fill_pool_mem(OCTEON_FPA_TX_PACKET_POOL, OCTEON_FPA_TX_PACKET_POOL_ELEM_SIZE, + OCTEON_FPA_TX_PACKET_POOL_ELEMENTS); + + + + octeon_rgmx_enable_RED_all(OCTEON_FPA_RX_PACKET_POOL_ELEMENTS >> 2, OCTEON_FPA_RX_PACKET_POOL_ELEMENTS >> 3); + + /* Configure IPD */ + octeon_ipd_config(OCTEON_FPA_RX_PACKET_POOL_WORDS, + FIRST_PARTICLE_SKIP / 8, + NOT_FIRST_PARTICLE_SKIP / 8, + FIRST_PARTICLE_SKIP / 128, + NOT_FIRST_PARTICLE_SKIP / 128, + OCTEON_FPA_WQE_RX_POOL, + OCTEON_IPD_OPC_MODE_STF, + ENABLE_BACK_PRESSURE); + + /* + * PKO setup Output Command Buffers + */ + octeon_pko_config_cmdbuf_global_defaults(OCTEON_FPA_TX_CMDBUF_POOL, + OCTEON_FPA_TX_CMDBUF_POOL_ELEM_SIZE); + +} + + + +static void octeon_config_hw_units_port (struct rgmx_softc_dev *sc, u_int port) +{ + const u_int priorities[8] = {8,8,8,8,8,8,8,8}; + u_int total_queues, base_queue; + + octeon_config_rgmii_port(port); + + total_queues = octeon_pko_get_num_queues(port); + base_queue = octeon_pko_get_base_queue(port); + /* Packet output configures Queue and Ports */ + octeon_pko_config_port(port, base_queue, + total_queues, + priorities, + OCTEON_FPA_TX_CMDBUF_POOL, + sc->outq_ptr); + + octeon_rgmx_set_mac(port); + + /* Setup Port input tagging */ + octeon_rgmx_config_pip(port); +} + + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd3 : 35; + uint64_t enable : 1; + uint64_t time_thr : 4; + uint64_t rsvd2 : 1; + uint64_t ds_thr : 11; + uint64_t rsvd : 1; + uint64_t iq_thr : 11; + } bits; +} octeon_rgmx_pow_int_threshold_t; + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd : 36; + uint64_t tc_cnt : 4; + uint64_t ds_cnt : 12; + uint64_t iq_cnt : 12; + } bits; +} octeon_rgmx_pow_int_cnt_t; + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd3 : 4; + uint64_t thr_freq : 28; // R/O + uint64_t rsvd2 : 4; + uint64_t thr_period : 20; + uint64_t rsvd : 8; + } bits; +} octeon_rgmx_pow_int_pc_t; + + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd : 52; + uint64_t nos_cnt : 12; + } bits; +} octeon_rgmx_pow_nos_cnt; + + + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd : 32; + uint64_t inb_pkts : 32; + } bits; +} octeon_rgmx_pip_inb_pkts; + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd : 48; + uint64_t inb_errs : 16; + } bits; +} octeon_rgmx_pip_inb_errs; + + + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd : 32; + uint64_t iq_cnt : 32; + } bits; +} octeon_pow_inpt_q_all_qos; + + + +typedef union +{ + uint64_t word64; + struct + { + uint64_t rsvd : 32; + uint64_t iq_cnt : 32; + } bits; +} octeon_pow_inpt_q_grp_qos; + + +static void octeon_config_hw_units_post_ports (void) +{ + + octeon_rgmx_pow_int_threshold_t thr; + octeon_rgmx_pow_int_pc_t intpc; + + thr.word64 = 0; + intpc.word64 = 0; + intpc.bits.thr_freq = (500 * 1000 * 1000) / (1000 * 16 * 256); + +#ifdef OCTEON_RGMX_POW_TIME_THR_INTS + thr.bits.enable = 1; + thr.bits.time_thr = 0xf; + oct_write64(OCTEON_POW_WORKQUEUE_INT_THRESHOLD(OCTEON_POW_RX_GROUP_NUM), thr.word64); + + oct_write64(OCTEON_POW_WORKQUEUE_INT_PC, intpc.word64); + +#else + thr.bits.ds_thr = thr.bits.iq_thr = 1; // Only if doing absolute queue-cnt interrupts. + oct_write64(OCTEON_POW_WORKQUEUE_INT_THRESHOLD(OCTEON_POW_RX_GROUP_NUM), thr.word64); +#endif + + ciu_enable_interrupts(OCTEON_CORE_ID, OCTEON_RGMX_CIU_INTX, OCTEON_RGMX_CIU_ENX, + (OCTEON_POW_RX_GROUP_MASK | + CIU_GENTIMER_BITS_ENABLE(CIU_GENTIMER_NUM_1)), CIU_MIPS_IP2); + + ciu_clear_int_summary(CIU_THIS_CORE, OCTEON_RGMX_CIU_INTX, + OCTEON_RGMX_CIU_ENX, CIU_GENTIMER_BITS_ENABLE(CIU_GENTIMER_NUM_1)); + + octeon_ciu_start_gtimer(CIU_GENTIMER_NUM_1, OCTEON_GENTIMER_PERIODIC, + OCTEON_GENTIMER_LEN_1SEC); + /* + * Enable IPD + */ + octeon_ipd_enable(); +} + + + + + +static void octeon_rgmx_config_pip (u_int port) +{ + octeon_pip_gbl_cfg_t pip_config; + octeon_pip_port_cfg_t pip_port_config; + octeon_pip_port_tag_cfg_t pip_tag_config; + + /* + * PIP Global config + */ + pip_config.word64 = 0; + pip_config.bits.max_l2 = 1; + oct_write64(OCTEON_PIP_GBL_CFG, pip_config.word64); + + /* + * PIP Port config + */ + pip_port_config.word64 = 0; + pip_port_config.bits.mode = OCTEON_PIP_PORT_CFG_MODE_SKIPL2; + pip_port_config.bits.qos = port & 0x7; + pip_port_config.bits.crc_en = 1; + + + /* + * PIP -> POW tags config + * + * We don't use any pkt input fields for tag hash, except for Port# + */ + pip_tag_config.word64 = 0; + + pip_tag_config.bits.grptag = 0; + pip_tag_config.bits.grptagmask = 0xf; + pip_tag_config.bits.grptagbase = 1; + + pip_tag_config.bits.ip6_src_flag = 0; + pip_tag_config.bits.ip6_dst_flag = 0; + pip_tag_config.bits.ip6_sprt_flag = 0; + pip_tag_config.bits.ip6_dprt_flag = 0; + pip_tag_config.bits.ip6_nxth_flag = 0; + + pip_tag_config.bits.ip4_src_flag = 1; + pip_tag_config.bits.ip4_dst_flag = 1; + pip_tag_config.bits.ip4_sprt_flag = 1; + pip_tag_config.bits.ip4_dprt_flag = 1; + pip_tag_config.bits.ip4_pctl_flag = 1; + + pip_tag_config.bits.tcp6_tag_type = 0; + pip_tag_config.bits.tcp4_tag_type = 0; + pip_tag_config.bits.ip6_tag_type = 0; + pip_tag_config.bits.ip4_tag_type = 0; + pip_tag_config.bits.inc_prt_flag = 1; + pip_tag_config.bits.non_tag_type = OCTEON_POW_TAG_TYPE_NULL; + pip_tag_config.bits.grp = OCTEON_POW_RX_GROUP_NUM; + + octeon_pip_config_port(port, pip_port_config, pip_tag_config); + + oct_write64(OCTEON_POW_CORE_GROUP_MASK(OUR_CORE), OCTEON_POW_ALL_GROUPS_MASK); + +} + + +/* + * octeon_rgmx_stop_port + * + */ +static u_int octeon_rgmx_stop_port (u_int port) +{ + int interface = INTERFACE(port); + int index = INDEX(port); + octeon_rgmx_prtx_cfg_t gmx_cfg; + u_int last_enabled = 0; + + gmx_cfg.word64 = oct_read64(OCTEON_RGMX_PRTX_CFG(index, interface)); + last_enabled = (gmx_cfg.bits.en == 1); + gmx_cfg.bits.en = 0; + oct_write64(OCTEON_RGMX_PRTX_CFG(index, interface), gmx_cfg.word64); + return (last_enabled); +} + +static void octeon_rgmx_start_port(u_int port) +{ + int interface = INTERFACE(port); + int index = INDEX(port); + octeon_rgmx_prtx_cfg_t gmx_cfg; + + gmx_cfg.word64 = oct_read64(OCTEON_RGMX_PRTX_CFG(index, interface)); + gmx_cfg.bits.en = 1; + oct_write64(OCTEON_RGMX_PRTX_CFG(index, interface), gmx_cfg.word64); +} + + +static void octeon_rgmx_stop (struct rgmx_softc_dev *sc) +{ + octeon_rgmx_stop_port(sc->port); + + /* Reset transmitter variables and interface flags. */ + sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE | IFF_DRV_RUNNING); + sc->txb_count = 0; + sc->txb_sched = 0; +} + + +/* Change the media selection. */ +static int octeon_rgmx_medchange (struct ifnet *ifp) +{ + struct rgmx_softc_dev *sc = ifp->if_softc; + +#ifdef DIAGNOSTIC + /* If_media should not pass any request for a media which this + interface doesn't support. */ + int b; + + for (b = 0; bit2media[b] != 0; b++) { + if (bit2media[b] == sc->media.ifm_media) break; + } + if (((1 << b) & sc->mbitmap) == 0) { + if_printf(sc->ifp, + "got an unsupported media request (0x%x)\n", + sc->media.ifm_media); + return EINVAL; + } +#endif + + /* We don't actually change media when the interface is down. + fe_init() will do the job, instead. Should we also wait + until the transmission buffer being empty? Changing the + media when we are sending a frame will cause two garbages + on wires, one on old media and another on new. FIXME */ + if (sc->ifp->if_flags & IFF_UP) { + printf(" Media change requested while IF is up\n"); + } else { + printf(" Media change requested while IF is Down\n"); + } + + return 0; +} + + +static void octeon_rgmx_medstat (struct ifnet *ifp, struct ifmediareq *ifm) +{ + /* + * No support for Media Status callback + */ +} + +static int octeon_rgmx_ioctl (struct ifnet * ifp, u_long command, caddr_t data) +{ + struct rgmx_softc_dev *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *)data; + int error = 0; + + if (!sc) { + printf(" octeon_rgmx_ioctl. No sc\n"); + return (0); + } + switch (command) { + + case SIOCSIFFLAGS: + /* + * Switch interface state between "running" and + * "stopped", reflecting the UP flag. + */ + if (ifp->if_flags & IFF_UP) { + + + /* + * New state is IFF_UP + * Restart or Start now, if driver is not running currently. + */ + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + printf(" SIOCSTIFFLAGS UP/Not-running\n"); break; + octeon_rgmx_init(sc); + } else { + printf(" SIOCSTIFFLAGS UP/Running\n"); break; + } + } else { + /* + * New state is IFF_DOWN. + * Stop & shut it down now, if driver is running currently. + */ + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + printf(" SIOCSTIFFLAGS Down/Running\n"); break; + octeon_rgmx_stop(sc); + } else { + printf(" SIOCSTIFFLAGS Down/Not-Running\n"); break; + } + } + break; + + case SIOCADDMULTI: + case SIOCDELMULTI: + break; + + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + /* Let if_media to handle these commands and to call + us back. */ + error = ifmedia_ioctl(ifp, ifr, &sc->media, command); + break; + + case SIOCSIFCAP: + { + int mask; + + ifp->if_hwassist &= ~CSUM_TSO; + ifp->if_capenable &= ~IFCAP_VLAN_HWTAGGING; + mask = ifr->ifr_reqcap ^ ifp->if_capenable; + if (mask & IFCAP_HWCSUM) { + ifp->if_capenable ^= IFCAP_HWCSUM; + if (ifp->if_capenable & IFCAP_TXCSUM) { + ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP); + } else { + ifp->if_hwassist &= ~(CSUM_TCP | CSUM_UDP); + } + } + } + break; + + default: + error = ether_ioctl(ifp, command, data); + break; + } + + return (error); +} + + + + +/* + * octeon_rgmx_mark_ready + * + * Initialize the rgmx driver for this instance + * Initialize device. + */ +static void octeon_rgmx_mark_ready (struct rgmx_softc_dev *sc) +{ + + /* Enable interrupts. */ + /* For RGMX they are already enabled earlier */ + + /* Enable transmitter and receiver. */ + /* For RGMX they are already enabled earlier */ + + /* Flush out all HW receive buffers for this interface. */ + /* For RGMX, no means to flush an individual port */ + + /* Set 'running' flag, because we are now running. */ + sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; + + /* Set the HW Address filter. aka program Mac-addr & Multicast filters */ + /* For RGMX this was taken care of via set_mac_addr() */ + + /* Kick start the output */ + /* Hopefully PKO is running and will pick up packets via the timer or receive loop */ +} + + +static void octeon_rgmx_init (void *xsc) +{ + + /* + * Called mostly from ifnet interface ifp->if_init(); + * I think we can anchor most of our iniialization here and + * not do it in different places from driver_attach(). + */ + /* + * For now, we only mark the interface ready + */ + octeon_rgmx_mark_ready((struct rgmx_softc_dev *) xsc); +} + + + +static void octeon_rgmx_config_speed (u_int port, u_int report_link) +{ + int index = INDEX(port); + int iface = INTERFACE(port); + struct rgmx_softc_dev *sc; + octeon_rgmx_rxx_rx_inbnd_t link_status, old_link_status; + octeon_rgmx_prtx_cfg_t gmx_cfg; + uint64_t val64_tx_clk, val64_tx_slot, val64_tx_burst; + u_int last_enabled; + + + sc = get_rgmx_softc(port); + if (!sc) { + printf(" config_speed didn't find sc int:%u port:%u", iface, port); + return; + } + + /* + * Look up interface-port speed params + */ + link_status.word64 = oct_read64(OCTEON_RGMX_RXX_RX_INBND(index, iface)); + + /* + * Compre to prev known state. If same then nothing to do. + */ + if (link_status.word64 == sc->link_status) { + return; + } + + RGMX_LOCK(sc); + + old_link_status.word64 = sc->link_status; + + sc->link_status = link_status.word64; + + last_enabled = octeon_rgmx_stop_port(port); + + gmx_cfg.word64 = oct_read64(OCTEON_RGMX_PRTX_CFG(index, iface)); + + /* + * Duplex + */ + gmx_cfg.bits.duplex = 1; + + switch (link_status.bits.speed) { + case 0: /* 10Mbps */ + gmx_cfg.bits.speed = 0; + gmx_cfg.bits.slottime = 0; + val64_tx_clk = 50; val64_tx_slot = 0x40; val64_tx_burst = 0; + break; + case 1: /* 100Mbps */ + gmx_cfg.bits.speed = 0; + gmx_cfg.bits.slottime = 0; + val64_tx_clk = 5; val64_tx_slot = 0x40; val64_tx_burst = 0; + break; + + case 2: /* 1Gbps */ + gmx_cfg.bits.speed = 1; + gmx_cfg.bits.slottime = 1; + val64_tx_clk = 1; val64_tx_slot = 0x200; val64_tx_burst = 0x2000; + break; + + case 3: /* ?? */ + default: + gmx_cfg.bits.speed = 1; + gmx_cfg.bits.slottime = 1; + val64_tx_clk = 1; val64_tx_slot = 0x200; val64_tx_burst = 0x2000; + break; + } + + oct_write64(OCTEON_RGMX_TXX_CLK(index, iface), val64_tx_clk); + oct_write64(OCTEON_RGMX_TXX_SLOT(index, iface), val64_tx_slot); + oct_write64(OCTEON_RGMX_TXX_BURST(index, iface), val64_tx_burst); + + oct_write64(OCTEON_RGMX_PRTX_CFG(index, iface), gmx_cfg.word64); + + if (last_enabled) octeon_rgmx_start_port(port); + + if (link_status.bits.status != old_link_status.bits.status) { + +//#define DEBUG_LINESTATUS + if (link_status.bits.status) { +#ifdef DEBUG_LINESTATUS + printf(" %u/%u: Interface is now alive\n", iface, port); +#endif + if (report_link) if_link_state_change(sc->ifp, LINK_STATE_UP); + } else { +#ifdef DEBUG_LINESTATUS + printf(" %u/%u: Interface went down\n", iface, port); +#endif + if (report_link) if_link_state_change(sc->ifp, LINK_STATE_DOWN); + } + } + RGMX_UNLOCK(sc); + +} + + + +#ifdef DEBUG_RGMX_DUMP +static void octeon_dump_rgmx_stats (u_int port) +{ + +} +#endif + +#ifdef __not_used__ +static void rgmx_timer_periodic (void) +{ + u_int port; + int index; + struct rgmx_softc_dev *sc; + struct ifnet *ifp; + + for (index = 0; index < OCTEON_RGMX_NUM_PORTS_MAX; index ++) { + + port = port_array[index]; + sc = rgmx_scdev_array[index]; + + /* + * Skip over ports/slots not in service. + */ + if ((port < OCTEON_RGMX_MIN_PORT) || (port > OCTEON_RGMX_MAX_PORT)) { + continue; + } + if ((NULL == sc) || (((struct rgmx_softc_dev *)-1) == sc)) { + continue; + } + + /* + * Now look for anamolous conditions + */ + if (sc != get_rgmx_softc(port)) { + printf(" port %u sc %p not in sync with index: %u\n", + port, sc, index); + continue; + } + + if (sc->port != port) { + printf(" port %u sc %p port-> %u not in sync with index: %u\n", + port, sc, sc->port, index); + continue; + } + + ifp = sc->ifp; + if (ifp == NULL) { + printf(" port %u sc %p . Bad ifp %p\n", port, sc, ifp); + continue; + } + + /* + * Check if packets queued at ifnet layer. Kick start output if we can. + */ + if (sc->ifp->if_flags & IFF_UP) { + octeon_rgmx_output_start(ifp); + } else { + octeon_rgmx_output_flush(ifp); + } + + /* + * Check if line status changed ? Adjust ourselves. + */ + octeon_rgmx_config_speed(port, 1); + } +} +#endif + +#ifdef DEBUG_RGMX_DUMP +static void octeon_dump_pow_stats(void) +{ + octeon_rgmx_pow_nos_cnt nos_cnt; + octeon_rgmx_pow_int_pc_t intpc; + octeon_rgmx_pow_int_threshold_t thr; + octeon_rgmx_pow_int_cnt_t int_cnt; + int core = octeon_get_core_num(); + octeon_pow_inpt_q_all_qos inpt_q_all; + octeon_pow_inpt_q_grp_qos inpt_q_grp; + octeon_rgmx_pip_inb_pkts pkts; + octeon_rgmx_pip_inb_errs errs; + static u_int pkts0 = 0; + static u_int pkts1 = 0; + static u_int errs0 = 0; + static u_int errs1 = 0; + int i; + + + nos_cnt.word64 = oct_read64(OCTEON_RGMX_POW_NOS_CNT); + if (nos_cnt.bits.nos_cnt) printf(" *** No sched cnt %u\n", nos_cnt.bits.nos_cnt); + printf(" \nGroup mask: 0x%llX WorkQueue Int : 0x%llX\n", oct_read64(OCTEON_POW_CORE_GROUP_MASK(OUR_CORE)), oct_read64(OCTEON_POW_WORKQUEUE_INT)); + intpc.word64 = oct_read64(OCTEON_POW_WORKQUEUE_INT_PC); + printf(" Intr Periodic Cntr: PC %u thr: %u\n", intpc.bits.thr_freq, intpc.bits.thr_period); + thr.word64 = oct_read64(OCTEON_POW_WORKQUEUE_INT_THRESHOLD(OCTEON_POW_RX_GROUP_NUM)); + printf(" Thresholds iq %u ds %u time %u enable %u\n", + thr.bits.iq_thr, thr.bits.ds_thr, thr.bits.time_thr, thr.bits.enable); + int_cnt.word64 = oct_read64(OCTEON_POW_INT_CNTR(core)); + printf(" Int_cnt iq_cnt %u ds_cnt %u tc_cnt %u\n", + int_cnt.bits.iq_cnt, int_cnt.bits.ds_cnt, int_cnt.bits.tc_cnt); + pkts.word64 = oct_read64(OCTEON_PIP_STAT_INB_PKTS(16)); pkts0 += pkts.bits.inb_pkts; + errs.word64 = oct_read64(OCTEON_PIP_STAT_INB_ERRS(16)); errs0 += errs.bits.inb_errs; + pkts.word64 = oct_read64(OCTEON_PIP_STAT_INB_PKTS(17)); pkts1 += pkts.bits.inb_pkts; + errs.word64 = oct_read64(OCTEON_PIP_STAT_INB_ERRS(17)); errs1 += errs.bits.inb_errs; + printf(" PIP inbound pkts(16): %u Errors: %u inbound(17): %u Errors: %u\n", pkts0, errs0, pkts1, errs1); + inpt_q_all.word64 = oct_read64(OCTEON_POW_INPT_Q_ALL_QOS); + printf(" All queued pkt in qos Levels: %u -- ", inpt_q_all.bits.iq_cnt); + for (i = 0 ; i < 7; i++) { + inpt_q_grp.word64 = oct_read64(OCTEON_POW_INPT_QOS_GRP(i)); + if (inpt_q_grp.bits.iq_cnt) printf(" Grp-%u: %u ", i, inpt_q_grp.bits.iq_cnt); + } +} +#endif + +/* ------------------------------------------------------------------- * + * octeon_line_status_loop() * + * ------------------------------------------------------------------- */ +static void octeon_line_status_loop (void *unused) +{ + struct rgmx_softc_dev *sc; + u_int idx; + + for (idx = 0; idx < num_devices; idx++) { + sc = rgmx_scdev_array[idx]; + if (sc && sc->ifp) { + if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING)) { + octeon_rgmx_config_speed(sc->port, 1); + + octeon_rgmx_output_start(sc->ifp); + } + } + } + +//#define DEBUG_RGMX_DUMP +#ifdef DEBUG_RGMX_DUMP + static int count = 0; + + if (++count > 5) { + count = 0; +// octeon_dump_fpa_pool(OCTEON_FPA_RX_PACKET_POOL); +// octeon_dump_fpa_pool(OCTEON_FPA_WQE_RX_POOL); +// octeon_dump_fpa_pool(OCTEON_FPA_TX_PACKET_POOL); + octeon_dump_rgmx_stats(16); + octeon_dump_pow_stats(); + } +#endif +} + + +/* ------------------------------------------------------------------- * + * octeon_rgmx_set_mac * + * ------------------------------------------------------------------- * + * + * octeon_rgmx_set_mac + * + * Program the ethernet HW address + * + */ +static void octeon_rgmx_set_mac (u_int port) +{ + struct rgmx_softc_dev *sc; + u_int iface = INTERFACE(port); + u_int index = INDEX(port); + int ii; + uint64_t mac = 0; + u_int last_enabled; + + sc = get_rgmx_softc(port); + if (!sc) { + printf(" octeon_rgmx_set_mac Missing sc. port:%u", port); + return; + } + + for (ii = 0; ii < 6; ii++) { + mac = (mac << 8) | (uint64_t)(sc->ieee[ii]); + } + + last_enabled = octeon_rgmx_stop_port(port); + + oct_write64(OCTEON_RGMX_SMACX(index, iface), mac); + oct_write64(OCTEON_RGMX_RXX_ADR_CAM0(index, iface), sc->ieee[0]); + oct_write64(OCTEON_RGMX_RXX_ADR_CAM1(index, iface), sc->ieee[1]); + oct_write64(OCTEON_RGMX_RXX_ADR_CAM2(index, iface), sc->ieee[2]); + oct_write64(OCTEON_RGMX_RXX_ADR_CAM3(index, iface), sc->ieee[3]); + oct_write64(OCTEON_RGMX_RXX_ADR_CAM4(index, iface), sc->ieee[4]); + oct_write64(OCTEON_RGMX_RXX_ADR_CAM5(index, iface), sc->ieee[5]); + oct_write64(OCTEON_RGMX_RXX_ADR_CTL(index, iface), + OCTEON_RGMX_ADRCTL_ACCEPT_BROADCAST | + OCTEON_RGMX_ADRCTL_ACCEPT_ALL_MULTICAST | + OCTEON_RGMX_ADRCTL_CAM_MODE_ACCEPT_DMAC); + oct_write64(OCTEON_RGMX_RXX_ADR_CAM_EN(index, iface), 1); + if (last_enabled) octeon_rgmx_start_port(port); +} + + +/* ------------------------------------------------------------------- * + * octeon_config_rgmii_port() * + * ------------------------------------------------------------------- */ +static void octeon_config_rgmii_port (u_int port) +{ + u_int iface = INTERFACE(port); + u_int index = INDEX(port); + + /* + * Configure an RGMII port + */ + octeon_rgmx_prtx_cfg_t gmx_cfg; + + /* Enable ASX */ + oct_write64(OCTEON_ASXX_RX_PRT_EN(iface), oct_read64(OCTEON_ASXX_RX_PRT_EN(iface)) | (1<sc_dev; + + /* + * Make sure that sc/dev are the parent Root structs. Not one + * of the rgmxN childs. + */ + if (int_handler_tag != NULL) { + bus_teardown_intr(dev, irq_res, int_handler_tag); + int_handler_tag = NULL; + } + +#ifdef OCTEON_RGMX_SCHEDULED_ISRS + if (tq != NULL) { + taskqueue_drain(tq, &rxtx_isr_task); + taskqueue_drain(taskqueue_fast, &link_isr_task); + taskqueue_free(tq); + tq = NULL; + } +#endif + +} +#endif + +static device_method_t rgmii_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, rgmii_probe), + DEVMETHOD(device_identify, rgmii_identify), + DEVMETHOD(device_attach, rgmii_attach), + DEVMETHOD(device_detach, bus_generic_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + { 0, 0 } +}; + +static driver_t rgmii_driver = { + "rgmii", rgmii_methods, sizeof(struct rgmx_softc_dev) +}; + +static devclass_t rgmii_devclass; + +DRIVER_MODULE(rgmii, nexus, rgmii_driver, rgmii_devclass, 0, 0); diff --git a/sys/mips/cavium/dev/rgmii/octeon_rgmx.h b/sys/mips/cavium/dev/rgmii/octeon_rgmx.h new file mode 100644 index 000000000000..19393416da81 --- /dev/null +++ b/sys/mips/cavium/dev/rgmii/octeon_rgmx.h @@ -0,0 +1,630 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/*------------------------------------------------------------------ + * octeon_rgmx.h RGMII Ethernet Interfaces + * + *------------------------------------------------------------------ + */ + + +#ifndef ___OCTEON_RGMX__H___ +#define ___OCTEON_RGMX__H___ + + + +#define OCTEON_FPA_PACKET_POOL 0 +#define OCTEON_FPA_WQE_RX_POOL 1 +#define OCTEON_FPA_OUTPUT_BUFFER_POOL 2 +#define OCTEON_FPA_WQE_POOL_SIZE (1 * OCTEON_CACHE_LINE_SIZE) +#define OCTEON_FPA_OUTPUT_BUFFER_POOL_SIZE (8 * OCTEON_CACHE_LINE_SIZE) +#define OCTEON_FPA_PACKET_POOL_SIZE (16 * OCTEON_CACHE_LINE_SIZE) + +#define OCTEON_POW_WORK_REQUEST(wait) (0x8001600000000000ull | (wait<<3)) + +typedef union +{ + void* ptr; + uint64_t word64; + struct + { + uint64_t i : 1; + uint64_t back : 4; + uint64_t pool : 3; + uint64_t size :16; + uint64_t addr :40; + } bits; +} octeon_buf_ptr_t; + +/** + * Work queue entry format + */ +typedef struct +{ + uint16_t hw_chksum; + uint8_t unused; + uint64_t next_ptr : 40; + uint64_t len :16; + uint64_t ipprt : 6; + uint64_t qos : 3; + uint64_t grp : 4; + uint64_t tag_type : 3; + uint64_t tag :32; + union + { + uint64_t word64; + struct + { + uint64_t bufs : 8; + uint64_t ip_offset : 8; + uint64_t vlan_valid : 1; + uint64_t unassigned : 2; + uint64_t vlan_cfi : 1; + uint64_t vlan_id :12; + uint64_t unassigned2 :12; + uint64_t dec_ipcomp : 1; + uint64_t tcp_or_udp : 1; + uint64_t dec_ipsec : 1; + uint64_t is_v6 : 1; + uint64_t software : 1; + uint64_t L4_error : 1; + uint64_t is_frag : 1; + uint64_t IP_exc : 1; + uint64_t is_bcast : 1; + uint64_t is_mcast : 1; + uint64_t not_IP : 1; + uint64_t rcv_error : 1; + uint64_t err_code : 8; + } bits; + struct + { + uint64_t bufs : 8; + uint64_t unused : 8; + uint64_t vlan_valid : 1; + uint64_t unassigned : 2; + uint64_t vlan_cfi : 1; + uint64_t vlan_id :12; + uint64_t unassigned2 :16; + uint64_t software : 1; + uint64_t unassigned3 : 1; + uint64_t is_rarp : 1; + uint64_t is_arp : 1; + uint64_t is_bcast : 1; + uint64_t is_mcast : 1; + uint64_t not_IP : 1; + uint64_t rcv_error : 1; + uint64_t err_code : 8; + } snoip; + } word2; + octeon_buf_ptr_t packet_ptr; + uint8_t packet_data[96]; +} octeon_wqe_t; + +typedef union { + uint64_t word64; + + struct { + uint64_t scraddr : 8; /**< the (64-bit word) location in scratchpad to write to (if len != 0) */ + uint64_t len : 8; /**< the number of words in the response (0 => no response) */ + uint64_t did : 8; /**< the ID of the device on the non-coherent bus */ + uint64_t unused :36; + uint64_t wait : 1; /**< if set, don't return load response until work is available */ + uint64_t unused2 : 3; + } bits; + +} octeon_pow_iobdma_store_t; + + +/** + * Wait flag values for pow functions. + */ +typedef enum +{ + OCTEON_POW_WAIT = 1, + OCTEON_POW_NO_WAIT = 0, +} octeon_pow_wait_t; + + + +static inline void * phys_to_virt (unsigned long address) +{ + return (void *)(address + 0x80000000UL); +} + +// decode within DMA space +typedef enum { + OCTEON_ADD_WIN_DMA_ADD = 0L, // add store data to the write buffer entry, allocating it if necessary + OCTEON_ADD_WIN_DMA_SENDMEM = 1L, // send out the write buffer entry to DRAM + // store data must be normal DRAM memory space address in this case + OCTEON_ADD_WIN_DMA_SENDDMA = 2L, // send out the write buffer entry as an IOBDMA command + // see OCTEON_ADD_WIN_DMA_SEND_DEC for data contents + OCTEON_ADD_WIN_DMA_SENDIO = 3L, // send out the write buffer entry as an IO write + // store data must be normal IO space address in this case + OCTEON_ADD_WIN_DMA_SENDSINGLE = 4L, // send out a single-tick command on the NCB bus + // no write buffer data needed/used +} octeon_add_win_dma_dec_t; + + +#define OCTEON_OCT_DID_FPA 5ULL +#define OCTEON_OCT_DID_TAG 12ULL +#define OCTEON_OCT_DID_TAG_SWTAG OCTEON_ADDR_FULL_DID(OCTEON_OCT_DID_TAG, 0ULL) + + +#define OCTEON_IOBDMA_OFFSET (-3*1024ll) +#define OCTEON_IOBDMA_SEP 16 +#define OCTEON_IOBDMA_SENDSINGLE (OCTEON_IOBDMA_OFFSET + \ + (OCTEON_ADD_WIN_DMA_SENDSINGLE *\ + OCTEON_IOBDMA_SEP)) + +static inline void octeon_send_single (uint64_t data) +{ + oct_write64((uint64_t)(OCTEON_IOBDMA_SENDSINGLE * (long long)8), data); +} + + +static inline void octeon_pow_work_request_async_nocheck (int scratch_addr, + octeon_pow_wait_t wait) +{ + octeon_pow_iobdma_store_t data; + + /* scratch_addr must be 8 byte aligned */ + data.bits.scraddr = scratch_addr >> 3; + data.bits.len = 1; + data.bits.did = OCTEON_OCT_DID_TAG_SWTAG; + data.bits.wait = wait; + octeon_send_single(data.word64); +} + + + +/** + * octeon_gmx_inf_mode + * + * GMX_INF_MODE = Interface Mode + * + */ +typedef union +{ + uint64_t word64; + struct gmxx_inf_mode_s + { + uint64_t reserved_3_63 : 61; + uint64_t p0mii : 1; /**< Port 0 Interface Mode + 0: Port 0 is RGMII + 1: Port 0 is MII */ + uint64_t en : 1; /**< Interface Enable */ + uint64_t type : 1; /**< Interface Mode + 0: RGMII Mode + 1: Spi4 Mode */ + } bits; + struct gmxx_inf_mode_cn3020 + { + uint64_t reserved_2_63 : 62; + uint64_t en : 1; /**< Interface Enable */ + uint64_t type : 1; /**< Interface Mode + 0: All three ports are RGMII ports + 1: prt0 is RGMII, prt1 is GMII, and prt2 is unused */ + } cn3020; + struct gmxx_inf_mode_s cn30xx; + struct gmxx_inf_mode_cn3020 cn31xx; + struct gmxx_inf_mode_cn3020 cn36xx; + struct gmxx_inf_mode_cn3020 cn38xx; + struct gmxx_inf_mode_cn3020 cn38xxp2; + struct gmxx_inf_mode_cn3020 cn56xx; + struct gmxx_inf_mode_cn3020 cn58xx; +} octeon_gmxx_inf_mode_t; + + + + +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 60; /* Reserved */ + uint64_t slottime : 1; /* Slot Time for Half-Duplex */ + /* operation - 0 = 512 bitimes (10/100Mbs operation) */ + /* - 1 = 4096 bitimes (1000Mbs operation) */ + uint64_t duplex : 1; /* Duplex - 0 = Half Duplex */ + /* (collisions/extentions/bursts) - 1 = Full Duplex */ + uint64_t speed : 1; /* Link Speed - 0 = 10/100Mbs */ + /* operation - 1 = 1000Mbs operation */ + uint64_t en : 1; /* Link Enable */ + } bits; +} octeon_rgmx_prtx_cfg_t; + + +/* + * GMX_RX_INBND = RGMX InBand Link Status + * + */ +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 60; /* Reserved */ + uint64_t duplex : 1; /* 0 = Half, 1 = Full */ + uint64_t speed : 2; /* Inbound Link Speed */ + /* 00 = 2.5Mhz, 01 = 25Mhz */ + /* 10 = 125MHz, 11 = Reserved */ + uint64_t status : 1; /* Inbound Status Up/Down */ + } bits; +} octeon_rgmx_rxx_rx_inbnd_t; + + + +typedef union +{ + uint64_t word64; + struct { + uint64_t all_drop : 32; + uint64_t slow_drop : 32; + } bits; +} octeon_rgmx_ipd_queue_red_marks_t; + + +typedef union +{ + uint64_t word64; + struct { + uint64_t reserved : 15; + uint64_t use_pagecount : 1; + uint64_t new_con : 8; + uint64_t avg_con : 8; + uint64_t prb_con : 32; + } bits; +} octeon_rgmx_ipd_red_q_param_t; + + + +typedef union +{ + uint64_t word64; + struct { + uint64_t reserved : 46; + uint64_t bp_enable : 1; + uint64_t page_count : 17; + } bits; +} octeon_ipd_port_bp_page_count_t; + + +typedef union +{ + uint64_t word64; + struct { + uint64_t prb_dly : 14; + uint64_t avg_dly : 14; + uint64_t port_enable : 36; + } bits; +} octeon_ipd_red_port_enable_t; + + +/** + * Tag type definitions + */ +typedef enum +{ + OCTEON_POW_TAG_TYPE_ORDERED = 0L, /**< Tag ordering is maintained */ + OCTEON_POW_TAG_TYPE_ATOMIC = 1L, /**< Tag ordering is maintained, and at most one PP has the tag */ + OCTEON_POW_TAG_TYPE_NULL = 2L, /**< The work queue entry from the order + - NEVER tag switch from NULL to NULL */ + OCTEON_POW_TAG_TYPE_NULL_NULL = 3L /**< A tag switch to NULL, and there is no space reserved in POW + - NEVER tag switch to NULL_NULL + - NEVER tag switch from NULL_NULL + - NULL_NULL is entered at the beginning of time and on a deschedule. + - NULL_NULL can be exited by a new work request. A NULL_SWITCH load can also switch the state to NULL */ +} octeon_pow_tag_type_t ; + +/** + * This structure defines the response to a load/SENDSINGLE to POW (except CSR reads) + */ +typedef union { + uint64_t word64; + + octeon_wqe_t *wqp; + + // response to new work request loads + struct { + uint64_t no_work : 1; // set when no new work queue entry was returned + // If there was de-scheduled work, the HW will definitely + // return it. When this bit is set, it could mean + // either mean: + // - There was no work, or + // - There was no work that the HW could find. This + // case can happen, regardless of the wait bit value + // in the original request, when there is work + // in the IQ's that is too deep down the list. + uint64_t unused : 23; + uint64_t addr : 40; // 36 in O1 -- the work queue pointer + } s_work; + + // response to NULL_RD request loads + struct { + uint64_t unused : 62; + uint64_t state : 2; // of type octeon_pow_tag_type_t + // state is one of the following: + // OCTEON_POW_TAG_TYPE_ORDERED + // OCTEON_POW_TAG_TYPE_ATOMIC + // OCTEON_POW_TAG_TYPE_NULL + // OCTEON_POW_TAG_TYPE_NULL_NULL + } s_null_rd; + +} octeon_pow_tag_load_resp_t; + + +/* + * This structure describes the address to load stuff from POW + */ +typedef union { + uint64_t word64; + + // address for new work request loads (did<2:0> == 0) + struct { + uint64_t mem_region :2; + uint64_t mbz :13; + uint64_t is_io : 1; // must be one + uint64_t did : 8; // the ID of POW -- did<2:0> == 0 in this case + uint64_t unaddr : 4; + uint64_t unused :32; + uint64_t wait : 1; // if set, don't return load response until work is available + uint64_t mbzl : 3; // must be zero + } swork; // physical address + + + // address for NULL_RD request (did<2:0> == 4) + // when this is read, HW attempts to change the state to NULL if it is NULL_NULL + // (the hardware cannot switch from NULL_NULL to NULL if a POW entry is not available - + // software may need to recover by finishing another piece of work before a POW + // entry can ever become available.) + struct { + uint64_t mem_region :2; + uint64_t mbz :13; + uint64_t is_io : 1; // must be one + uint64_t did : 8; // the ID of POW -- did<2:0> == 4 in this case + uint64_t unaddr : 4; + uint64_t unused :33; + uint64_t mbzl : 3; // must be zero + } snull_rd; // physical address + + // address for CSR accesses + struct { + uint64_t mem_region :2; + uint64_t mbz :13; + uint64_t is_io : 1; // must be one + uint64_t did : 8; // the ID of POW -- did<2:0> == 7 in this case + uint64_t unaddr : 4; + uint64_t csraddr:36; // only 36 bits in O1, addr<2:0> must be zero + } stagcsr; // physical address + +} octeon_pow_load_addr_t; + + +static inline void octeon_pow_tag_switch_wait (void) +{ + uint64_t switch_complete; + + do + { + OCTEON_CHORD_HEX(&switch_complete); + } while (!switch_complete); + + return; +} + + +static inline octeon_wqe_t *octeon_pow_work_request_sync_nocheck (octeon_pow_wait_t wait) +{ + octeon_pow_load_addr_t ptr; + octeon_pow_tag_load_resp_t result; + + ptr.word64 = 0; + ptr.swork.mem_region = OCTEON_IO_SEG; + ptr.swork.is_io = 1; + ptr.swork.did = OCTEON_OCT_DID_TAG_SWTAG; + ptr.swork.wait = wait; + + result.word64 = oct_read64(ptr.word64); + + if (result.s_work.no_work || !result.s_work.addr) { + return NULL; + } + return (octeon_wqe_t *) MIPS_PHYS_TO_KSEG0(result.s_work.addr); +} + +static inline octeon_wqe_t *octeon_pow_work_request_sync_nocheck_debug (octeon_pow_wait_t wait) +{ + octeon_pow_load_addr_t ptr; + octeon_pow_tag_load_resp_t result; + + ptr.word64 = 0; + ptr.swork.mem_region = OCTEON_IO_SEG; + ptr.swork.is_io = 1; + ptr.swork.did = OCTEON_OCT_DID_TAG_SWTAG; + ptr.swork.wait = wait; + + result.word64 = oct_read64(ptr.word64); + + printf("WQE Result: 0x%llX No-work %X Addr %llX Ptr: %p\n", + (unsigned long long)result.word64, result.s_work.no_work, + (unsigned long long)result.s_work.addr, + (void *)MIPS_PHYS_TO_KSEG0(result.s_work.addr)); + + if (result.s_work.no_work || !result.s_work.addr) { + return NULL; + } + return (octeon_wqe_t *) MIPS_PHYS_TO_KSEG0(result.s_work.addr); +} + +static inline octeon_wqe_t *octeon_pow_work_request_sync (octeon_pow_wait_t wait) +{ + octeon_pow_tag_switch_wait(); + return (octeon_pow_work_request_sync_nocheck(wait)); +} + + +static inline octeon_wqe_t *octeon_pow_work_request_sync_debug (octeon_pow_wait_t wait) +{ + octeon_pow_tag_switch_wait(); + return (octeon_pow_work_request_sync_nocheck_debug(wait)); +} + + + +/** + * Gets result of asynchronous work request. Performs a IOBDMA sync + * to wait for the response. + * + * @param scratch_addr Scratch memory address to get result from + * Byte address, must be 8 byte aligned. + * @return Returns the WQE from the scratch register, or NULL if no work was available. + */ +static inline octeon_wqe_t *octeon_pow_work_response_async(int scratch_addr) +{ + octeon_pow_tag_load_resp_t result; + + OCTEON_SYNCIOBDMA; + result.word64 = oct_scratch_read64(scratch_addr); + + if (result.s_work.no_work) { + return NULL; + } + return (octeon_wqe_t*) MIPS_PHYS_TO_KSEG0(result.s_work.addr); +} + + + +/* + * The address from POW is a physical address. Adjust for back ptr, as well as + * make it accessible using KSEG0. + */ +static inline void *octeon_pow_pktptr_to_kbuffer (octeon_buf_ptr_t pkt_ptr) +{ + return ((void *)MIPS_PHYS_TO_KSEG0( + ((pkt_ptr.bits.addr >> 7) - pkt_ptr.bits.back) << 7)); +} + +#define INTERFACE(port) (port >> 4) /* Ports 0-15 are interface 0, 16-31 are interface 1 */ +#define INDEX(port) (port & 0xf) + + +#define OCTEON_RGMX_PRTX_CFG(index,interface) (0x8001180008000010ull+((index)*2048)+((interface)*0x8000000ull)) +#define OCTEON_RGMX_SMACX(offset,block_id) (0x8001180008000230ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CAM0(offset,block_id) (0x8001180008000180ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CAM1(offset,block_id) (0x8001180008000188ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CAM2(offset,block_id) (0x8001180008000190ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CAM3(offset,block_id) (0x8001180008000198ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CAM4(offset,block_id) (0x80011800080001A0ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CAM5(offset,block_id) (0x80011800080001A8ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CTL(offset,block_id) (0x8001180008000100ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_ADR_CAM_EN(offset,block_id) (0x8001180008000108ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_INF_MODE(block_id) (0x80011800080007F8ull+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_TX_PRTS(block_id) (0x8001180008000480ull+((block_id)*0x8000000ull)) +#define OCTEON_ASXX_RX_PRT_EN(block_id) (0x80011800B0000000ull+((block_id)*0x8000000ull)) +#define OCTEON_ASXX_TX_PRT_EN(block_id) (0x80011800B0000008ull+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_TXX_THRESH(offset,block_id) (0x8001180008000210ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_ASXX_TX_HI_WATERX(offset,block_id) (0x80011800B0000080ull+((offset)*8)+((block_id)*0x8000000ull)) +#define OCTEON_ASXX_RX_CLK_SETX(offset,block_id) (0x80011800B0000020ull+((offset)*8)+((block_id)*0x8000000ull)) +#define OCTEON_ASXX_TX_CLK_SETX(offset,block_id) (0x80011800B0000048ull+((offset)*8)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_RXX_RX_INBND(offset,block_id) (0x8001180008000060ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_TXX_CLK(offset,block_id) (0x8001180008000208ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_TXX_SLOT(offset,block_id) (0x8001180008000220ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_RGMX_TXX_BURST(offset,block_id) (0x8001180008000228ull+((offset)*2048)+((block_id)*0x8000000ull)) +#define OCTEON_PIP_GBL_CTL (0x80011800A0000020ull) +#define OCTEON_PIP_GBL_CFG (0x80011800A0000028ull) +#define OCTEON_PIP_PRT_CFGX(offset) (0x80011800A0000200ull+((offset)*8)) +#define OCTEON_PIP_PRT_TAGX(offset) (0x80011800A0000400ull+((offset)*8)) + + + +#define OUR_CORE 0 +#define IP2 0 +#define IP3 1 +#define CIU_TIMERS 4 +#define OCTEON_POW_CORE_GROUP_MASK(core) (0x8001670000000000ull + (8 * core)) + +#define OCTEON_CIU_INT_EN0(CORE,IP) (0x8001070000000200ull + (IP * 16) + \ + ((CORE) * 32)) +#define OCTEON_CIU_INT_SUM0(CORE,IP) (0x8001070000000000ull + (IP * 8) + \ + ((CORE) * 32)) +#define OCTEON_CIU_TIMX(offset) (0x8001070000000480ull+((offset)*8)) + +#define OCTEON_POW_WQ_INT_THRX(offset) ((0x8001670000000080ull+((offset)*8))) +#define OCTEON_POW_WQ_INT_CNTX(offset) ((0x8001670000000100ull+((offset)*8))) +#define OCTEON_POW_QOS_THRX(offset) ((0x8001670000000180ull+((offset)*8))) +#define OCTEON_POW_QOS_RNDX(offset) ((0x80016700000001C0ull+((offset)*8))) +#define OCTEON_POW_WQ_INT_PC (0x8001670000000208ull) +#define OCTEON_POW_NW_TIM (0x8001670000000210ull) +#define OCTEON_POW_ECC_ERR (0x8001670000000218ull) +#define OCTEON_POW_INT_CTL (0x8001670000000220ull) +#define OCTEON_POW_NOS_CNT (0x8001670000000228ull) +#define OCTEON_POW_WS_PCX(offset) ((0x8001670000000280ull+((offset)*8))) +#define OCTEON_POW_WA_PCX(offset) ((0x8001670000000300ull+((offset)*8))) +#define OCTEON_POW_IQ_CNTX(offset) ((0x8001670000000340ull+((offset)*8))) +#define OCTEON_POW_WA_COM_PC (0x8001670000000380ull) +#define OCTEON_POW_IQ_COM_CNT (0x8001670000000388ull) +#define OCTEON_POW_TS_PC (0x8001670000000390ull) +#define OCTEON_POW_DS_PC (0x8001670000000398ull) +#define OCTEON_POW_BIST_STAT (0x80016700000003F8ull) + + +#define OCTEON_POW_WQ_INT (0x8001670000000200ull) + +#define OCTEON_IPD_PORT_BP_COUNTERS_PAIRX(offset) (0x80014F00000001B8ull+((offset)*8)) + +/* + * Current Counts that triggered interrupt + */ +#define OCTEON_POW_WQ_INT_CNTX(offset) ((0x8001670000000100ull+((offset)*8))) + + + +#define OCTEON_RGMX_ADRCTL_CAM_MODE_REJECT_DMAC 0 +#define OCTEON_RGMX_ADRCTL_ACCEPT_BROADCAST 1 +#define OCTEON_RGMX_ADRCTL_REJECT_ALL_MULTICAST 2 +#define OCTEON_RGMX_ADRCTL_ACCEPT_ALL_MULTICAST 4 +#define OCTEON_RGMX_ADRCTL_CAM_MODE_ACCEPT_DMAC 8 + + +#define RGMX_LOCK_INIT(_sc, _name) \ + mtx_init(&(_sc)->mtx, _name, MTX_NETWORK_LOCK, MTX_DEF) +#define RGMX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->mtx) +#define RGMX_LOCK(_sc) mtx_lock(&(_sc)->mtx) +#define RGMX_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx) +#define RGMX_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->mtx, MA_OWNED) + +#endif /* ___OCTEON_RGMX__H___ */ diff --git a/sys/mips/cavium/driveid.h b/sys/mips/cavium/driveid.h new file mode 100644 index 000000000000..b4805d905d86 --- /dev/null +++ b/sys/mips/cavium/driveid.h @@ -0,0 +1,298 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/* + * driveid.h + * + */ + +#ifndef __DRIVEID_H__ +#define __DRIVEID_H__ + + +struct hd_driveid { + unsigned short config; /* lots of obsolete bit flags */ + unsigned short cyls; /* Obsolete, "physical" cyls */ + unsigned short reserved2; /* reserved (word 2) */ + unsigned short heads; /* Obsolete, "physical" heads */ + unsigned short track_bytes; /* unformatted bytes per track */ + unsigned short sector_bytes; /* unformatted bytes per sector */ + unsigned short sectors; /* Obsolete, "physical" sectors per track */ + unsigned short vendor0; /* vendor unique */ + unsigned short vendor1; /* vendor unique */ + unsigned short vendor2; /* Retired vendor unique */ + unsigned char serial_no[20]; /* 0 = not_specified */ + unsigned short buf_type; /* Retired */ + unsigned short buf_size; /* Retired, 512 byte increments + * 0 = not_specified + */ + unsigned short ecc_bytes; /* for r/w long cmds; 0 = not_specified */ + unsigned char fw_rev[8]; /* 0 = not_specified */ + unsigned char model[40]; /* 0 = not_specified */ + unsigned char max_multsect; /* 0=not_implemented */ + unsigned char vendor3; /* vendor unique */ + unsigned short dword_io; /* 0=not_implemented; 1=implemented */ + unsigned char vendor4; /* vendor unique */ + unsigned char capability; /* (upper byte of word 49) + * 3: IORDYsup + * 2: IORDYsw + * 1: LBA + * 0: DMA + */ + unsigned short reserved50; /* reserved (word 50) */ + unsigned char vendor5; /* Obsolete, vendor unique */ + unsigned char tPIO; /* Obsolete, 0=slow, 1=medium, 2=fast */ + unsigned char vendor6; /* Obsolete, vendor unique */ + unsigned char tDMA; /* Obsolete, 0=slow, 1=medium, 2=fast */ + unsigned short field_valid; /* (word 53) + * 2: ultra_ok word 88 + * 1: eide_ok words 64-70 + * 0: cur_ok words 54-58 + */ + unsigned short cur_cyls; /* Obsolete, logical cylinders */ + unsigned short cur_heads; /* Obsolete, l heads */ + unsigned short cur_sectors; /* Obsolete, l sectors per track */ + unsigned short cur_capacity0; /* Obsolete, l total sectors on drive */ + unsigned short cur_capacity1; /* Obsolete, (2 words, misaligned int) */ + unsigned char multsect; /* current multiple sector count */ + unsigned char multsect_valid; /* when (bit0==1) multsect is ok */ + unsigned int lba_capacity; /* Obsolete, total number of sectors */ + unsigned short dma_1word; /* Obsolete, single-word dma info */ + unsigned short dma_mword; /* multiple-word dma info */ + unsigned short eide_pio_modes; /* bits 0:mode3 1:mode4 */ + unsigned short eide_dma_min; /* min mword dma cycle time (ns) */ + unsigned short eide_dma_time; /* recommended mword dma cycle time (ns) */ + unsigned short eide_pio; /* min cycle time (ns), no IORDY */ + unsigned short eide_pio_iordy; /* min cycle time (ns), with IORDY */ + unsigned short words69_70[2]; /* reserved words 69-70 + * future command overlap and queuing + */ + /* HDIO_GET_IDENTITY currently returns only words 0 through 70 */ + unsigned short words71_74[4]; /* reserved words 71-74 + * for IDENTIFY PACKET DEVICE command + */ + unsigned short queue_depth; /* (word 75) + * 15:5 reserved + * 4:0 Maximum queue depth -1 + */ + unsigned short words76_79[4]; /* reserved words 76-79 */ + unsigned short major_rev_num; /* (word 80) */ + unsigned short minor_rev_num; /* (word 81) */ + unsigned short command_set_1; /* (word 82) supported + * 15: Obsolete + * 14: NOP command + * 13: READ_BUFFER + * 12: WRITE_BUFFER + * 11: Obsolete + * 10: Host Protected Area + * 9: DEVICE Reset + * 8: SERVICE Interrupt + * 7: Release Interrupt + * 6: look-ahead + * 5: write cache + * 4: PACKET Command + * 3: Power Management Feature Set + * 2: Removable Feature Set + * 1: Security Feature Set + * 0: SMART Feature Set + */ + unsigned short command_set_2; /* (word 83) + * 15: Shall be ZERO + * 14: Shall be ONE + * 13: FLUSH CACHE EXT + * 12: FLUSH CACHE + * 11: Device Configuration Overlay + * 10: 48-bit Address Feature Set + * 9: Automatic Acoustic Management + * 8: SET MAX security + * 7: reserved 1407DT PARTIES + * 6: SetF sub-command Power-Up + * 5: Power-Up in Standby Feature Set + * 4: Removable Media Notification + * 3: APM Feature Set + * 2: CFA Feature Set + * 1: READ/WRITE DMA QUEUED + * 0: Download MicroCode + */ + unsigned short cfsse; /* (word 84) + * cmd set-feature supported extensions + * 15: Shall be ZERO + * 14: Shall be ONE + * 13:6 reserved + * 5: General Purpose Logging + * 4: Streaming Feature Set + * 3: Media Card Pass Through + * 2: Media Serial Number Valid + * 1: SMART selt-test supported + * 0: SMART error logging + */ + unsigned short cfs_enable_1; /* (word 85) + * command set-feature enabled + * 15: Obsolete + * 14: NOP command + * 13: READ_BUFFER + * 12: WRITE_BUFFER + * 11: Obsolete + * 10: Host Protected Area + * 9: DEVICE Reset + * 8: SERVICE Interrupt + * 7: Release Interrupt + * 6: look-ahead + * 5: write cache + * 4: PACKET Command + * 3: Power Management Feature Set + * 2: Removable Feature Set + * 1: Security Feature Set + * 0: SMART Feature Set + */ + unsigned short cfs_enable_2; /* (word 86) + * command set-feature enabled + * 15: Shall be ZERO + * 14: Shall be ONE + * 13: FLUSH CACHE EXT + * 12: FLUSH CACHE + * 11: Device Configuration Overlay + * 10: 48-bit Address Feature Set + * 9: Automatic Acoustic Management + * 8: SET MAX security + * 7: reserved 1407DT PARTIES + * 6: SetF sub-command Power-Up + * 5: Power-Up in Standby Feature Set + * 4: Removable Media Notification + * 3: APM Feature Set + * 2: CFA Feature Set + * 1: READ/WRITE DMA QUEUED + * 0: Download MicroCode + */ + unsigned short csf_default; /* (word 87) + * command set-feature default + * 15: Shall be ZERO + * 14: Shall be ONE + * 13:6 reserved + * 5: General Purpose Logging enabled + * 4: Valid CONFIGURE STREAM executed + * 3: Media Card Pass Through enabled + * 2: Media Serial Number Valid + * 1: SMART selt-test supported + * 0: SMART error logging + */ + unsigned short dma_ultra; /* (word 88) */ + unsigned short trseuc; /* time required for security erase */ + unsigned short trsEuc; /* time required for enhanced erase */ + unsigned short CurAPMvalues; /* current APM values */ + unsigned short mprc; /* master password revision code */ + unsigned short hw_config; /* hardware config (word 93) + * 15: Shall be ZERO + * 14: Shall be ONE + * 13: + * 12: + * 11: + * 10: + * 9: + * 8: + * 7: + * 6: + * 5: + * 4: + * 3: + * 2: + * 1: + * 0: Shall be ONE + */ + unsigned short acoustic; /* (word 94) + * 15:8 Vendor's recommended value + * 7:0 current value + */ + unsigned short msrqs; /* min stream request size */ + unsigned short sxfert; /* stream transfer time */ + unsigned short sal; /* stream access latency */ + unsigned int spg; /* stream performance granularity */ + unsigned long long lba_capacity_2;/* 48-bit total number of sectors */ + unsigned short words104_125[22];/* reserved words 104-125 */ + unsigned short last_lun; /* (word 126) */ + unsigned short word127; /* (word 127) Feature Set + * Removable Media Notification + * 15:2 reserved + * 1:0 00 = not supported + * 01 = supported + * 10 = reserved + * 11 = reserved + */ + unsigned short dlf; /* (word 128) + * device lock function + * 15:9 reserved + * 8 security level 1:max 0:high + * 7:6 reserved + * 5 enhanced erase + * 4 expire + * 3 frozen + * 2 locked + * 1 en/disabled + * 0 capability + */ + unsigned short csfo; /* (word 129) + * current set features options + * 15:4 reserved + * 3: auto reassign + * 2: reverting + * 1: read-look-ahead + * 0: write cache + */ + unsigned short words130_155[26];/* reserved vendor words 130-155 */ + unsigned short word156; /* reserved vendor word 156 */ + unsigned short words157_159[3];/* reserved vendor words 157-159 */ + unsigned short cfa_power; /* (word 160) CFA Power Mode + * 15 word 160 supported + * 14 reserved + * 13 + * 12 + * 11:0 + */ + unsigned short words161_175[15];/* Reserved for CFA */ + unsigned short words176_205[30];/* Current Media Serial Number */ + unsigned short words206_254[49];/* reserved words 206-254 */ + unsigned short integrity_word; /* (word 255) + * 15:8 Checksum + * 7:0 Signature + */ +}; + +#endif /* __DRIVEID_H__ */ + diff --git a/sys/mips/cavium/files.octeon1 b/sys/mips/cavium/files.octeon1 new file mode 100644 index 000000000000..c10988c46c13 --- /dev/null +++ b/sys/mips/cavium/files.octeon1 @@ -0,0 +1,17 @@ +# $FreeBSD$ +# Octeon Support Files +# +mips/mips/mp_machdep.c optional smp +mips/cavium/dev/rgmii/octeon_fau.c optional rgmii +mips/cavium/dev/rgmii/octeon_fpa.c optional rgmii +mips/cavium/dev/rgmii/octeon_ipd.c optional rgmii +mips/cavium/dev/rgmii/octeon_pko.c optional rgmii +mips/cavium/dev/rgmii/octeon_rgmx.c optional rgmii +mips/cavium/obio.c optional uart +mips/cavium/octeon_ebt3000_cf.c optional cf +mips/cavium/octeon_machdep.c standard +mips/cavium/uart_bus_octeonusart.c optional uart +mips/cavium/uart_cpu_octeonusart.c optional uart +mips/cavium/uart_dev_oct16550.c optional uart +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard diff --git a/sys/mips/cavium/obio.c b/sys/mips/cavium/obio.c new file mode 100644 index 000000000000..9ef5b45823ff --- /dev/null +++ b/sys/mips/cavium/obio.c @@ -0,0 +1,185 @@ +/* $NetBSD: obio.c,v 1.11 2003/07/15 00:25:05 lukem Exp $ */ + +/*- + * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Jason R. Thorpe for Wasabi Systems, Inc. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC + * 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. + */ + +/* + * On-board device autoconfiguration support for Cavium OCTEON 1 family of + * SoC devices. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +extern struct bus_space octeon_uart_tag; + +int obio_probe(device_t); +int obio_attach(device_t); + +/* + * We need only one obio. Any other device hanging off of it, + * shouldn't cause multiple of these to be found. + */ +static int have_one = 0; + +int +obio_probe(device_t dev) +{ + if (!have_one) { + have_one = 1; + return 0; + } + return (ENXIO); +} + +int +obio_attach(device_t dev) +{ + struct obio_softc *sc = device_get_softc(dev); + + sc->oba_st = mips_bus_space_generic; + sc->oba_addr = OCTEON_MIO_UART0; + sc->oba_size = 0x10000; + sc->oba_rman.rm_type = RMAN_ARRAY; + sc->oba_rman.rm_descr = "OBIO I/O"; + if (rman_init(&sc->oba_rman) != 0 || + rman_manage_region(&sc->oba_rman, + sc->oba_addr, sc->oba_addr + sc->oba_size) != 0) + panic("obio_attach: failed to set up I/O rman"); + sc->oba_irq_rman.rm_type = RMAN_ARRAY; + sc->oba_irq_rman.rm_descr = "OBIO IRQ"; + + /* + * This module is intended for UART purposes only and + * it's IRQ is 0 corresponding to IP2. + */ + if (rman_init(&sc->oba_irq_rman) != 0 || + rman_manage_region(&sc->oba_irq_rman, 0, 0) != 0) + panic("obio_attach: failed to set up IRQ rman"); + + device_add_child(dev, "uart", 1); /* Setup Uart-1 first. */ + device_add_child(dev, "uart", 0); /* Uart-0 next. So it is first in console list */ + bus_generic_probe(dev); + bus_generic_attach(dev); + return (0); +} + +static struct resource * +obio_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct resource *rv; + struct rman *rm; + bus_space_tag_t bt = 0; + bus_space_handle_t bh = 0; + struct obio_softc *sc = device_get_softc(bus); + + switch (type) { + case SYS_RES_IRQ: + rm = &sc->oba_irq_rman; + break; + case SYS_RES_MEMORY: + return (NULL); + case SYS_RES_IOPORT: + rm = &sc->oba_rman; + bt = &octeon_uart_tag; + bh = device_get_unit(child) ? + OCTEON_MIO_UART1 : OCTEON_MIO_UART0; + start = bh; + break; + default: + return (NULL); + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + if (rv == NULL) { + return (NULL); + } + if (type == SYS_RES_IRQ) { + return (rv); + } + rman_set_rid(rv, *rid); + rman_set_bustag(rv, bt); + rman_set_bushandle(rv, bh); + + if (0) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + return (rv); + +} + +static int +obio_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (0); +} +static device_method_t obio_methods[] = { + DEVMETHOD(device_probe, obio_probe), + DEVMETHOD(device_attach, obio_attach), + + DEVMETHOD(bus_alloc_resource, obio_alloc_resource), + DEVMETHOD(bus_activate_resource, obio_activate_resource), + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + + {0, 0}, +}; + +static driver_t obio_driver = { + "obio", + obio_methods, + sizeof(struct obio_softc), +}; +static devclass_t obio_devclass; + +DRIVER_MODULE(obio, nexus, obio_driver, obio_devclass, 0, 0); diff --git a/sys/arm/xscale/xscalevar.h b/sys/mips/cavium/obiovar.h similarity index 80% rename from sys/arm/xscale/xscalevar.h rename to sys/mips/cavium/obiovar.h index 32a510ff458f..3b58fe631ad0 100644 --- a/sys/arm/xscale/xscalevar.h +++ b/sys/mips/cavium/obiovar.h @@ -1,7 +1,7 @@ -/* $NetBSD: xscalevar.h,v 1.1 2002/10/08 23:59:41 thorpej Exp $ */ +/* $NetBSD: obiovar.h,v 1.4 2003/06/16 17:40:53 thorpej Exp $ */ /*- - * Copyright (c) 2002 Wasabi Systems, Inc. + * Copyright (c) 2002, 2003 Wasabi Systems, Inc. * All rights reserved. * * Written by Jason R. Thorpe for Wasabi Systems, Inc. @@ -38,11 +38,18 @@ * */ -#ifndef _ARM_XSCALE_XSCALEVAR_H_ -#define _ARM_XSCALE_XSCALEVAR_H_ +#ifndef _OCTEON_OBIOVAR_H_ +#define _OCTEON_OBIOVAR_H_ -/* Performance Monitoring Unit */ -void xscale_pmu_init(void); -int xscale_pmc_dispatch(void *); +#include -#endif /* _ARM_XSCALE_XSCALEVAR_H_ */ +struct obio_softc { + bus_space_tag_t oba_st; /* bus space tag */ + bus_addr_t oba_addr; /* address of device */ + bus_size_t oba_size; /* size of device */ + struct rman oba_rman; + struct rman oba_irq_rman; + +}; + +#endif /* _OCTEON_OBIOVAR_H_ */ diff --git a/sys/mips/cavium/octeon_ebt3000_cf.c b/sys/mips/cavium/octeon_ebt3000_cf.c new file mode 100644 index 000000000000..10fb3136c491 --- /dev/null +++ b/sys/mips/cavium/octeon_ebt3000_cf.c @@ -0,0 +1,659 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* + * octeon_ebt3000_cf.c + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "octeon_ebt3000_cf.h" +#include "driveid.h" +#include + +/* ATA Commands */ +#define CMD_READ_SECTOR 0x20 +#define CMD_WRITE_SECTOR 0x30 +#define CMD_IDENTIFY 0xEC + +/* The ATA Task File */ +#define TF_DATA 0x00 +#define TF_ERROR 0x01 +#define TF_PRECOMP 0x01 +#define TF_SECTOR_COUNT 0x02 +#define TF_SECTOR_NUMBER 0x03 +#define TF_CYL_LSB 0x04 +#define TF_CYL_MSB 0x05 +#define TF_DRV_HEAD 0x06 +#define TF_STATUS 0x07 +#define TF_COMMAND 0x07 + +/* Status Register */ +#define STATUS_BSY 0x80 /* Drive is busy */ +#define STATUS_RDY 0x40 /* Drive is ready */ +#define STATUS_DRQ 0x08 /* Data can be transferred */ + +/* Miscelaneous */ +#define SECTOR_SIZE 512 +#define WAIT_DELAY 1000 +#define NR_TRIES 1000 +#define SWAP_SHORT(x) ((x << 8) | (x >> 8)) +#define SWAP_LONG(x) (((x << 24) & 0xFF000000) | ((x << 8) & 0x00FF0000) | \ + ((x >> 8) & 0x0000FF00) | ((x << 24) & 0x000000FF) ) +#define MODEL_STR_SIZE 40 + + +/* Globals */ +int bus_width; +void *base_addr; + +/* Device softc */ +struct cf_priv { + + device_t dev; + struct drive_param *drive_param; + + struct bio_queue_head cf_bq; + struct g_geom *cf_geom; + struct g_provider *cf_provider; + +}; + +/* Device parameters */ +struct drive_param{ + union { + char buf[SECTOR_SIZE]; + struct hd_driveid driveid; + } u; + + char model[MODEL_STR_SIZE]; + uint32_t nr_sectors; + uint16_t sector_size; + uint16_t heads; + uint16_t tracks; + uint16_t sec_track; + +} drive_param; + +/* GEOM class implementation */ +static g_access_t cf_access; +static g_start_t cf_start; +static g_ioctl_t cf_ioctl; + +struct g_class g_cf_class = { + .name = "CF", + .version = G_VERSION, + .start = cf_start, + .access = cf_access, + .ioctl = cf_ioctl, +}; + +/* Device methods */ +static int cf_probe(device_t); +static void cf_identify(driver_t *, device_t); +static int cf_attach(device_t); +static int cf_attach_geom(void *, int); + +/* ATA methods */ +static void cf_cmd_identify(void); +static void cf_cmd_write(uint32_t, uint32_t, void *); +static void cf_cmd_read(uint32_t, uint32_t, void *); +static void cf_wait_busy(void); +static void cf_send_cmd(uint32_t, uint8_t); +static void cf_attach_geom_proxy(void *arg, int flag); + +/* Miscelenous */ +static void cf_swap_ascii(unsigned char[], char[]); + + +/* ------------------------------------------------------------------- * + * cf_access() * + * ------------------------------------------------------------------- */ +static int cf_access (struct g_provider *pp, int r, int w, int e) +{ + + pp->sectorsize = drive_param.sector_size; + pp->stripesize = drive_param.heads * drive_param.sec_track * drive_param.sector_size; + pp->mediasize = pp->stripesize * drive_param.tracks; + + return (0); +} + + +/* ------------------------------------------------------------------- * + * cf_start() * + * ------------------------------------------------------------------- */ +static void cf_start (struct bio *bp) +{ + /* + * Handle actual I/O requests. The request is passed down through + * the bio struct. + */ + + if(bp->bio_cmd & BIO_GETATTR) { + if (g_handleattr_int(bp, "GEOM::fwsectors", drive_param.sec_track)) + return; + if (g_handleattr_int(bp, "GEOM::fwheads", drive_param.heads)) + return; + g_io_deliver(bp, ENOIOCTL); + return; + } + + if ((bp->bio_cmd & (BIO_READ | BIO_WRITE))) { + + if (bp->bio_cmd & BIO_READ) { + cf_cmd_read(bp->bio_length / drive_param.sector_size, + bp->bio_offset / drive_param.sector_size, bp->bio_data); + + } else if (bp->bio_cmd & BIO_WRITE) { + cf_cmd_write(bp->bio_length / drive_param.sector_size, + bp->bio_offset/drive_param.sector_size, bp->bio_data); + } + + bp->bio_resid = 0; + bp->bio_completed = bp->bio_length; + g_io_deliver(bp, 0); + } +} + + +static int cf_ioctl (struct g_provider *pp, u_long cmd, void *data, int fflag, struct thread *td) +{ + return (0); +} + + +/* ------------------------------------------------------------------- * + * cf_cmd_read() * + * ------------------------------------------------------------------- * + * + * Read nr_sectors from the device starting from start_sector. + */ +static void cf_cmd_read (uint32_t nr_sectors, uint32_t start_sector, void *buf) +{ + unsigned long lba; + uint32_t count; + uint16_t *ptr_16; + uint8_t *ptr_8; + +//#define OCTEON_VISUAL_CF_0 1 +#ifdef OCTEON_VISUAL_CF_0 + octeon_led_write_char(0, 'R'); +#endif + ptr_8 = (uint8_t*)buf; + ptr_16 = (uint16_t*)buf; + lba = start_sector; + + + while (nr_sectors--) { + + cf_send_cmd(lba, CMD_READ_SECTOR); + + if (bus_width == 8) { + volatile uint8_t *task_file = (volatile uint8_t*)base_addr; + volatile uint8_t dummy; + for (count = 0; count < SECTOR_SIZE; count++) { + *ptr_8++ = task_file[TF_DATA]; + if ((count & 0xf) == 0) dummy = task_file[TF_STATUS]; + } + } else { + volatile uint16_t *task_file = (volatile uint16_t*)base_addr; + volatile uint16_t dummy; + for (count = 0; count < SECTOR_SIZE; count+=2) { + uint16_t temp; + temp = task_file[TF_DATA]; + *ptr_16++ = SWAP_SHORT(temp); + if ((count & 0xf) == 0) dummy = task_file[TF_STATUS/2]; + } + } + + lba ++; + } +#ifdef OCTEON_VISUAL_CF_0 + octeon_led_write_char(0, ' '); +#endif +} + + +/* ------------------------------------------------------------------- * + * cf_cmd_write() * + * ------------------------------------------------------------------- * + * + * Write nr_sectors to the device starting from start_sector. + */ +static void cf_cmd_write (uint32_t nr_sectors, uint32_t start_sector, void *buf) +{ + uint32_t lba; + uint32_t count; + uint16_t *ptr_16; + uint8_t *ptr_8; + +//#define OCTEON_VISUAL_CF_1 1 +#ifdef OCTEON_VISUAL_CF_1 + octeon_led_write_char(1, 'W'); +#endif + lba = start_sector; + ptr_8 = (uint8_t*)buf; + ptr_16 = (uint16_t*)buf; + + while (nr_sectors--) { + + cf_send_cmd(lba, CMD_WRITE_SECTOR); + + if (bus_width == 8) { + volatile uint8_t *task_file; + volatile uint8_t dummy; + + task_file = (volatile uint8_t *) base_addr; + for (count = 0; count < SECTOR_SIZE; count++) { + task_file[TF_DATA] = *ptr_8++; + if ((count & 0xf) == 0) dummy = task_file[TF_STATUS]; + } + } else { + volatile uint16_t *task_file; + volatile uint16_t dummy; + + task_file = (volatile uint16_t *) base_addr; + for (count = 0; count < SECTOR_SIZE; count+=2) { + uint16_t temp = *ptr_16++; + task_file[TF_DATA] = SWAP_SHORT(temp); + if ((count & 0xf) == 0) dummy = task_file[TF_STATUS/2]; + } + } + + lba ++; + } +#ifdef OCTEON_VISUAL_CF_1 + octeon_led_write_char(1, ' '); +#endif +} + + +/* ------------------------------------------------------------------- * + * cf_cmd_identify() * + * ------------------------------------------------------------------- * + * + * Read parameters and other information from the drive and store + * it in the drive_param structure + * + */ +static void cf_cmd_identify (void) +{ + int count; + uint8_t status; + + if (bus_width == 8) { + volatile uint8_t *task_file; + + task_file = (volatile uint8_t *) base_addr; + + while ((status = task_file[TF_STATUS]) & STATUS_BSY) { + DELAY(WAIT_DELAY); + } + + task_file[TF_SECTOR_COUNT] = 0; + task_file[TF_SECTOR_NUMBER] = 0; + task_file[TF_CYL_LSB] = 0; + task_file[TF_CYL_MSB] = 0; + task_file[TF_DRV_HEAD] = 0; + task_file[TF_COMMAND] = CMD_IDENTIFY; + + cf_wait_busy(); + + for (count = 0; count < SECTOR_SIZE; count++) + drive_param.u.buf[count] = task_file[TF_DATA]; + + } else { + volatile uint16_t *task_file; + + task_file = (volatile uint16_t *) base_addr; + + while ((status = (task_file[TF_STATUS/2]>>8)) & STATUS_BSY) { + DELAY(WAIT_DELAY); + } + + task_file[TF_SECTOR_COUNT/2] = 0; /* this includes TF_SECTOR_NUMBER */ + task_file[TF_CYL_LSB/2] = 0; /* this includes TF_CYL_MSB */ + task_file[TF_DRV_HEAD/2] = 0 | (CMD_IDENTIFY<<8); /* this includes TF_COMMAND */ + + cf_wait_busy(); + + for (count = 0; count < SECTOR_SIZE; count+=2) { + uint16_t temp; + temp = task_file[TF_DATA]; + + /* endianess will be swapped below */ + drive_param.u.buf[count] = (temp & 0xff); + drive_param.u.buf[count+1] = (temp & 0xff00)>>8; + } + } + + cf_swap_ascii(drive_param.u.driveid.model, drive_param.model); + + drive_param.sector_size = 512; //= SWAP_SHORT (drive_param.u.driveid.sector_bytes); + drive_param.heads = SWAP_SHORT (drive_param.u.driveid.cur_heads); + drive_param.tracks = SWAP_SHORT (drive_param.u.driveid.cur_cyls); + drive_param.sec_track = SWAP_SHORT (drive_param.u.driveid.cur_sectors); + drive_param.nr_sectors = SWAP_LONG (drive_param.u.driveid.lba_capacity); + +} + + +/* ------------------------------------------------------------------- * + * cf_send_cmd() * + * ------------------------------------------------------------------- * + * + * Send command to read/write one sector specified by lba. + * + */ +static void cf_send_cmd (uint32_t lba, uint8_t cmd) +{ + uint8_t status; + + if (bus_width == 8) { + volatile uint8_t *task_file; + + task_file = (volatile uint8_t *) base_addr; + + while ( (status = task_file[TF_STATUS]) & STATUS_BSY) { + DELAY(WAIT_DELAY); + } + + task_file[TF_SECTOR_COUNT] = 1; + task_file[TF_SECTOR_NUMBER] = (lba & 0xff); + task_file[TF_CYL_LSB] = ((lba >> 8) & 0xff); + task_file[TF_CYL_MSB] = ((lba >> 16) & 0xff); + task_file[TF_DRV_HEAD] = ((lba >> 24) & 0xff) | 0xe0; + task_file[TF_COMMAND] = cmd; + + } else { + volatile uint16_t *task_file; + + task_file = (volatile uint16_t *) base_addr; + + while ( (status = (task_file[TF_STATUS/2]>>8)) & STATUS_BSY) { + DELAY(WAIT_DELAY); + } + + task_file[TF_SECTOR_COUNT/2] = 1 | ((lba & 0xff) << 8); + task_file[TF_CYL_LSB/2] = ((lba >> 8) & 0xff) | (((lba >> 16) & 0xff) << 8); + task_file[TF_DRV_HEAD/2] = (((lba >> 24) & 0xff) | 0xe0) | (cmd << 8); + + } + + cf_wait_busy(); +} + +/* ------------------------------------------------------------------- * + * cf_wait_busy() * + * ------------------------------------------------------------------- * + * + * Wait until the drive finishes a given command and data is + * ready to be transferred. This is done by repeatedly checking + * the BSY and DRQ bits of the status register. When the controller + * is ready for data transfer, it clears the BSY bit and sets the + * DRQ bit. + * + */ +static void cf_wait_busy (void) +{ + uint8_t status; + +//#define OCTEON_VISUAL_CF_2 1 +#ifdef OCTEON_VISUAL_CF_2 + static int where0 = 0; + + octeon_led_run_wheel(&where0, 2); +#endif + + if (bus_width == 8) { + volatile uint8_t *task_file; + task_file = (volatile uint8_t *)base_addr; + + status = task_file[TF_STATUS]; + while ((status & STATUS_BSY) == STATUS_BSY || (status & STATUS_DRQ) != STATUS_DRQ ) { + DELAY(WAIT_DELAY); + status = task_file[TF_STATUS]; + } + } else { + volatile uint16_t *task_file; + task_file = (volatile uint16_t *)base_addr; + + status = task_file[TF_STATUS/2]>>8; + while ((status & STATUS_BSY) == STATUS_BSY || (status & STATUS_DRQ) != STATUS_DRQ ) { + DELAY(WAIT_DELAY); + status = (uint8_t)(task_file[TF_STATUS/2]>>8); + } + } + +#ifdef OCTEON_VISUAL_CF_2 + octeon_led_write_char(2, ' '); +#endif +} + +/* ------------------------------------------------------------------- * + * cf_swap_ascii() * + * ------------------------------------------------------------------- * + * + * The ascii string returned by the controller specifying + * the model of the drive is byte-swaped. This routine + * corrects the byte ordering. + * + */ +static void cf_swap_ascii (unsigned char str1[], char str2[]) +{ + int i; + + for(i = 0; i < MODEL_STR_SIZE; i++) { + str2[i] = str1[i^1]; + } +} + + +/* ------------------------------------------------------------------- * + * cf_probe() * + * ------------------------------------------------------------------- */ + +static int cf_probe (device_t dev) +{ + if (!octeon_board_real()) return 1; + + if (device_get_unit(dev) != 0) { + panic("can't attach more devices\n"); + } + + device_set_desc(dev, "Octeon Compact Flash Driver"); + + cf_cmd_identify(); + + return (0); +} + +/* ------------------------------------------------------------------- * + * cf_identify() * + * ------------------------------------------------------------------- * + * + * Find the bootbus region for the CF to determine + * 16 or 8 bit and check to see if device is + * inserted. + * + */ +static void cf_identify (driver_t *drv, device_t parent) +{ + uint8_t status; + int bus_region; + int count = 0; + octeon_mio_boot_reg_cfgx_t cfg; + + + if (!octeon_board_real()) + return; + + base_addr = (void *) MIPS_PHYS_TO_KSEG0(OCTEON_CF_COMMON_BASE_ADDR); + + for (bus_region = 0; bus_region < 8; bus_region++) + { + cfg.word64 = oct_read64(OCTEON_MIO_BOOT_REG_CFGX(bus_region)); + if (cfg.bits.base == OCTEON_CF_COMMON_BASE_ADDR >> 16) + { + bus_width = (cfg.bits.width) ? 16: 8; + printf("Compact flash found in bootbus region %d (%d bit).\n", bus_region, bus_width); + break; + } + } + + if (bus_width == 8) { + volatile uint8_t *task_file; + task_file = (volatile uint8_t *) base_addr; + /* Check if CF is inserted */ + while ( (status = task_file[TF_STATUS]) & STATUS_BSY){ + if ((count++) == NR_TRIES ) { + printf("Compact Flash not present\n"); + return; + } + DELAY(WAIT_DELAY); + } + } else { + volatile uint16_t *task_file; + task_file = (volatile uint16_t *) base_addr; + /* Check if CF is inserted */ + while ( (status = (task_file[TF_STATUS/2]>>8)) & STATUS_BSY){ + if ((count++) == NR_TRIES ) { + printf("Compact Flash not present\n"); + return; + } + DELAY(WAIT_DELAY); + } + } + + BUS_ADD_CHILD(parent, 0, "cf", 0); +} + + +/* ------------------------------------------------------------------- * + * cf_attach_geom() * + * ------------------------------------------------------------------- */ + +static int cf_attach_geom (void *arg, int flag) +{ + struct cf_priv *cf_priv; + + cf_priv = (struct cf_priv *) arg; + cf_priv->cf_geom = g_new_geomf(&g_cf_class, "cf%d", device_get_unit(cf_priv->dev)); + cf_priv->cf_provider = g_new_providerf(cf_priv->cf_geom, cf_priv->cf_geom->name); + cf_priv->cf_geom->softc = cf_priv; + g_error_provider(cf_priv->cf_provider, 0); + + return (0); +} + +/* ------------------------------------------------------------------- * + * cf_attach_geom() * + * ------------------------------------------------------------------- */ +static void cf_attach_geom_proxy (void *arg, int flag) +{ + cf_attach_geom(arg, flag); +} + + + +/* ------------------------------------------------------------------- * + * cf_attach() * + * ------------------------------------------------------------------- */ + +static int cf_attach (device_t dev) +{ + struct cf_priv *cf_priv; + + if (!octeon_board_real()) return 1; + + cf_priv = device_get_softc(dev); + cf_priv->dev = dev; + cf_priv->drive_param = &drive_param; + + g_post_event(cf_attach_geom_proxy, cf_priv, M_WAITOK, NULL); + bioq_init(&cf_priv->cf_bq); + + return 0; +} + + +static device_method_t cf_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, cf_probe), + DEVMETHOD(device_identify, cf_identify), + DEVMETHOD(device_attach, cf_attach), + DEVMETHOD(device_detach, bus_generic_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + + { 0, 0 } +}; + +static driver_t cf_driver = { + "cf", + cf_methods, + sizeof(struct cf_priv) +}; + +static devclass_t cf_devclass; + +DRIVER_MODULE(cf, nexus, cf_driver, cf_devclass, 0, 0); + diff --git a/sys/mips/cavium/octeon_ebt3000_cf.h b/sys/mips/cavium/octeon_ebt3000_cf.h new file mode 100644 index 000000000000..1ce8a8a0f3f2 --- /dev/null +++ b/sys/mips/cavium/octeon_ebt3000_cf.h @@ -0,0 +1,75 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* $FreeBSD$ */ + +/* + * octeon_ebt3000_cf.h + * + */ + + +#ifndef __OCTEON_EBT3000_H__ +#define __OCTEON_EBT3000_H__ + + + +#define OCTEON_CF_COMMON_BASE_ADDR (0x1d000000 | (1 << 11)) +#define OCTEON_MIO_BOOT_REG_CFGX(offset) (0x8001180000000000ull + ((offset) * 8)) + + +typedef union +{ + uint64_t word64; + struct + { + uint64_t reserved : 27; /**< Reserved */ + uint64_t sam : 1; /**< Region 0 SAM */ + uint64_t we_ext : 2; /**< Region 0 write enable count extension */ + uint64_t oe_ext : 2; /**< Region 0 output enable count extension */ + uint64_t en : 1; /**< Region 0 enable */ + uint64_t orbit : 1; /**< No function for region 0 */ + uint64_t ale : 1; /**< Region 0 ALE mode */ + uint64_t width : 1; /**< Region 0 bus width */ + uint64_t size : 12; /**< Region 0 size */ + uint64_t base : 16; /**< Region 0 base address */ + } bits; +} octeon_mio_boot_reg_cfgx_t; + + +#endif /* __OCTEON_EBT3000_H__ */ diff --git a/sys/mips/cavium/octeon_machdep.c b/sys/mips/cavium/octeon_machdep.c new file mode 100644 index 000000000000..e3f2fbda9611 --- /dev/null +++ b/sys/mips/cavium/octeon_machdep.c @@ -0,0 +1,986 @@ +/*- + * Copyright (c) 2006 Wojciech A. Koszek + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__mips_n64) +#define MAX_APP_DESC_ADDR 0xffffffffafffffff +#else +#define MAX_APP_DESC_ADDR 0xafffffff +#endif + +extern int *edata; +extern int *end; + +uint64_t ciu_get_en_reg_addr_new(int corenum, int intx, int enx, int ciu_ip); +void ciu_dump_interrutps_enabled(int core_num, int intx, int enx, int ciu_ip); + +static void octeon_boot_params_init(register_t ptr); +static uint64_t ciu_get_intr_sum_reg_addr(int core_num, int intx, int enx); +static uint64_t ciu_get_intr_en_reg_addr(int core_num, int intx, int enx); + +static __inline void +mips_wr_ebase(u_int32_t a0) +{ + __asm __volatile("mtc0 %[a0], $15, 1 ;" + : + : [a0] "r"(a0)); + + mips_barrier(); +} + +void +platform_cpu_init() +{ + /* Nothing special yet */ +} + +/* + * Perform a board-level soft-reset. + */ +void +platform_reset(void) +{ + oct_write64(OCTEON_CIU_SOFT_RST, 1); +} + + +static inline uint32_t +octeon_disable_interrupts(void) +{ + uint32_t status_bits; + + status_bits = mips_rd_status(); + mips_wr_status(status_bits & ~MIPS_SR_INT_IE); + return (status_bits); +} + + +static inline void +octeon_set_interrupts(uint32_t status_bits) +{ + mips_wr_status(status_bits); +} + + +void +octeon_led_write_char(int char_position, char val) +{ + uint64_t ptr = (OCTEON_CHAR_LED_BASE_ADDR | 0xf8); + + if (!octeon_board_real()) + return; + + char_position &= 0x7; /* only 8 chars */ + ptr += char_position; + oct_write8_x8(ptr, val); +} + +void +octeon_led_write_char0(char val) +{ + uint64_t ptr = (OCTEON_CHAR_LED_BASE_ADDR | 0xf8); + + if (!octeon_board_real()) + return; + oct_write8_x8(ptr, val); +} + +void +octeon_led_write_hexchar(int char_position, char hexval) +{ + uint64_t ptr = (OCTEON_CHAR_LED_BASE_ADDR | 0xf8); + char char1, char2; + + if (!octeon_board_real()) + return; + + char1 = (hexval >> 4) & 0x0f; char1 = (char1 < 10)?char1+'0':char1+'7'; + char2 = (hexval & 0x0f); char2 = (char2 < 10)?char2+'0':char2+'7'; + char_position &= 0x7; /* only 8 chars */ + if (char_position > 6) + char_position = 6; + ptr += char_position; + oct_write8_x8(ptr, char1); + ptr++; + oct_write8_x8(ptr, char2); +} + +void +octeon_led_write_string(const char *str) +{ + uint64_t ptr = (OCTEON_CHAR_LED_BASE_ADDR | 0xf8); + int i; + + if (!octeon_board_real()) + return; + + for (i=0; i<8; i++, ptr++) { + if (str && *str) + oct_write8_x8(ptr, *str++); + else + oct_write8_x8(ptr, ' '); + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); + } +} + +static char progress[8] = { '-', '/', '|', '\\', '-', '/', '|', '\\'}; + +void +octeon_led_run_wheel(int *prog_count, int led_position) +{ + if (!octeon_board_real()) + return; + octeon_led_write_char(led_position, progress[*prog_count]); + *prog_count += 1; + *prog_count &= 0x7; +} + +#define LSR_DATAREADY 0x01 /* Data ready */ +#define LSR_THRE 0x20 /* Transmit holding register empty */ +#define LSR_TEMT 0x40 /* Transmitter Empty. THR, TSR & FIFO */ +#define USR_TXFIFO_NOTFULL 0x02 /* Uart TX FIFO Not full */ + +/* + * octeon_uart_write_byte + * + * Put out a single byte off of uart port. + */ + +void +octeon_uart_write_byte(int uart_index, uint8_t ch) +{ + uint64_t val, val2; + if (uart_index < 0 || uart_index > 1) + return; + + while (1) { + val = oct_read64(OCTEON_MIO_UART0_LSR + (uart_index * 0x400)); + val2 = oct_read64(OCTEON_MIO_UART0_USR + (uart_index * 0x400)); + if ((((uint8_t) val) & LSR_THRE) || + (((uint8_t) val2) & USR_TXFIFO_NOTFULL)) { + break; + } + } + + /* Write the byte */ + oct_write8(OCTEON_MIO_UART0_THR + (uart_index * 0x400), (uint64_t) ch); + + /* Force Flush the IOBus */ + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); +} + + +void +octeon_uart_write_byte0(uint8_t ch) +{ + uint64_t val, val2; + + while (1) { + val = oct_read64(OCTEON_MIO_UART0_LSR); + val2 = oct_read64(OCTEON_MIO_UART0_USR); + if ((((uint8_t) val) & LSR_THRE) || + (((uint8_t) val2) & USR_TXFIFO_NOTFULL)) { + break; + } + } + + /* Write the byte */ + oct_write8(OCTEON_MIO_UART0_THR, (uint64_t) ch); + + /* Force Flush the IOBus */ + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); +} + +/* + * octeon_uart_write_string + * + */ +void +octeon_uart_write_string(int uart_index, const char *str) +{ + /* Just loop writing one byte at a time */ + + while (*str) { + octeon_uart_write_byte(uart_index, *str); + if (*str == '\n') { + octeon_uart_write_byte(uart_index, '\r'); + } + str++; + } +} + +static char wstr[30]; + +void +octeon_led_write_hex(uint32_t wl) +{ + char nbuf[80]; + + sprintf(nbuf, "%X", wl); + octeon_led_write_string(nbuf); +} + + +void octeon_uart_write_hex2(uint32_t wl, uint32_t wh) +{ + sprintf(wstr, "0x%X-0x%X ", wh, wl); + octeon_uart_write_string(0, wstr); +} + +void +octeon_uart_write_hex(uint32_t wl) +{ + sprintf(wstr, " 0x%X ", wl); + octeon_uart_write_string(0, wstr); +} + +/* + * octeon_wait_uart_flush + */ +void +octeon_wait_uart_flush(int uart_index, uint8_t ch) +{ + uint64_t val; + int64_t val3; + uint32_t cpu_status_bits; + + if (uart_index < 0 || uart_index > 1) + return; + + cpu_status_bits = octeon_disable_interrupts(); + /* Force Flush the IOBus */ + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); + for (val3 = 0xfffffffff; val3 > 0; val3--) { + val = oct_read64(OCTEON_MIO_UART0_LSR + (uart_index * 0x400)); + if (((uint8_t) val) & LSR_TEMT) + break; + } + octeon_set_interrupts(cpu_status_bits); +} + + +/* + * octeon_debug_symbol + * + * Does nothing. + * Used to mark the point for simulator to begin tracing + */ +void +octeon_debug_symbol(void) +{ +} + +void +octeon_ciu_stop_gtimer(int timer) +{ + oct_write64(OCTEON_CIU_GENTIMER_ADDR(timer), 0ll); +} + +void +octeon_ciu_start_gtimer(int timer, u_int one_shot, uint64_t time_cycles) +{ + octeon_ciu_gentimer gentimer; + + gentimer.word64 = 0; + gentimer.bits.one_shot = one_shot; + gentimer.bits.len = time_cycles - 1; + oct_write64(OCTEON_CIU_GENTIMER_ADDR(timer), gentimer.word64); +} + +/* + * octeon_ciu_reset + * + * Shutdown all CIU to IP2, IP3 mappings + */ +void +octeon_ciu_reset(void) +{ + + octeon_ciu_stop_gtimer(CIU_GENTIMER_NUM_0); + octeon_ciu_stop_gtimer(CIU_GENTIMER_NUM_1); + octeon_ciu_stop_gtimer(CIU_GENTIMER_NUM_2); + octeon_ciu_stop_gtimer(CIU_GENTIMER_NUM_3); + + ciu_disable_intr(CIU_THIS_CORE, CIU_INT_0, CIU_EN_0); + ciu_disable_intr(CIU_THIS_CORE, CIU_INT_0, CIU_EN_1); + ciu_disable_intr(CIU_THIS_CORE, CIU_INT_1, CIU_EN_0); + ciu_disable_intr(CIU_THIS_CORE, CIU_INT_1, CIU_EN_1); + + ciu_clear_int_summary(CIU_THIS_CORE, CIU_INT_0, CIU_EN_0, 0ll); + ciu_clear_int_summary(CIU_THIS_CORE, CIU_INT_1, CIU_EN_0, 0ll); + ciu_clear_int_summary(CIU_THIS_CORE, CIU_INT_1, CIU_EN_1, 0ll); +} + +/* + * mips_disable_interrupt_controllers + * + * Disable interrupts in the CPU controller + */ +void +mips_disable_interrupt_controls(void) +{ + /* + * Disable interrupts in CIU. + */ + octeon_ciu_reset(); +} + +/* + * ciu_get_intr_sum_reg_addr + */ +static uint64_t +ciu_get_intr_sum_reg_addr(int core_num, int intx, int enx) +{ + uint64_t ciu_intr_sum_reg_addr; + + if (enx == CIU_EN_0) + ciu_intr_sum_reg_addr = OCTEON_CIU_SUMMARY_BASE_ADDR + + (core_num * 0x10) + (intx * 0x8); + else + ciu_intr_sum_reg_addr = OCTEON_CIU_SUMMARY_INT1_ADDR; + + return (ciu_intr_sum_reg_addr); +} + + +/* + * ciu_get_intr_en_reg_addr + */ +static uint64_t +ciu_get_intr_en_reg_addr(int core_num, int intx, int enx) +{ + uint64_t ciu_intr_reg_addr; + + ciu_intr_reg_addr = OCTEON_CIU_ENABLE_BASE_ADDR + + ((enx == 0) ? 0x0 : 0x8) + (intx * 0x10) + (core_num * 0x20); + return (ciu_intr_reg_addr); +} + + + + +/* + * ciu_get_intr_reg_addr + * + * 200 ---int0,en0 ip2 + * 208 ---int0,en1 ip2 ----> this is wrong... this is watchdog + * + * 210 ---int0,en0 ip3 -- + * 218 ---int0,en1 ip3 ----> same here.. .this is watchdog... right? + * + * 220 ---int1,en0 ip2 + * 228 ---int1,en1 ip2 + * 230 ---int1,en0 ip3 -- + * 238 ---int1,en1 ip3 + * + */ +uint64_t +ciu_get_en_reg_addr_new(int corenum, int intx, int enx, int ciu_ip) +{ + uint64_t ciu_intr_reg_addr = OCTEON_CIU_ENABLE_BASE_ADDR; + + /* XXX kasserts? */ + if (enx < CIU_EN_0 || enx > CIU_EN_1) { + printf("%s: invalid enx value %d, should be %d or %d\n", + __FUNCTION__, enx, CIU_EN_0, CIU_EN_1); + return 0; + } + if (intx < CIU_INT_0 || intx > CIU_INT_1) { + printf("%s: invalid intx value %d, should be %d or %d\n", + __FUNCTION__, enx, CIU_INT_0, CIU_INT_1); + return 0; + } + if (ciu_ip < CIU_MIPS_IP2 || ciu_ip > CIU_MIPS_IP3) { + printf("%s: invalid ciu_ip value %d, should be %d or %d\n", + __FUNCTION__, ciu_ip, CIU_MIPS_IP2, CIU_MIPS_IP3); + return 0; + } + + ciu_intr_reg_addr += (enx * 0x8); + ciu_intr_reg_addr += (ciu_ip * 0x10); + ciu_intr_reg_addr += (intx * 0x20); + return (ciu_intr_reg_addr); +} + +/* + * ciu_get_int_summary + */ +uint64_t +ciu_get_int_summary(int core_num, int intx, int enx) +{ + uint64_t ciu_intr_sum_reg_addr; + + if (core_num == CIU_THIS_CORE) + core_num = octeon_get_core_num(); + ciu_intr_sum_reg_addr = ciu_get_intr_sum_reg_addr(core_num, intx, enx); + return (oct_read64(ciu_intr_sum_reg_addr)); +} + +//#define DEBUG_CIU 1 + +#ifdef DEBUG_CIU +#define DEBUG_CIU_SUM 1 +#define DEBUG_CIU_EN 1 +#endif + + +/* + * ciu_clear_int_summary + */ +void +ciu_clear_int_summary(int core_num, int intx, int enx, uint64_t write_bits) +{ + uint32_t cpu_status_bits; + uint64_t ciu_intr_sum_reg_addr; + +//#define DEBUG_CIU_SUM 1 + +#ifdef DEBUG_CIU_SUM + uint64_t ciu_intr_sum_bits; +#endif + + + if (core_num == CIU_THIS_CORE) { + core_num = octeon_get_core_num(); + } + +#ifdef DEBUG_CIU_SUM + printf(" CIU: core %u clear sum IntX %u Enx %u Bits: 0x%llX\n", + core_num, intx, enx, write_bits); +#endif + + cpu_status_bits = octeon_disable_interrupts(); + + ciu_intr_sum_reg_addr = ciu_get_intr_sum_reg_addr(core_num, intx, enx); + +#ifdef DEBUG_CIU_SUM + ciu_intr_sum_bits = oct_read64(ciu_intr_sum_reg_addr); /* unneeded dummy read */ + printf(" CIU: status: 0x%X reg_addr: 0x%llX Val: 0x%llX -> 0x%llX", + cpu_status_bits, ciu_intr_sum_reg_addr, ciu_intr_sum_bits, + ciu_intr_sum_bits | write_bits); +#endif + + oct_write64(ciu_intr_sum_reg_addr, write_bits); + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); /* Bus Barrier */ + +#ifdef DEBUG_CIU_SUM + printf(" Readback: 0x%llX\n\n ", (uint64_t) oct_read64(ciu_intr_sum_reg_addr)); +#endif + + octeon_set_interrupts(cpu_status_bits); +} + +/* + * ciu_disable_intr + */ +void +ciu_disable_intr(int core_num, int intx, int enx) +{ + uint32_t cpu_status_bits; + uint64_t ciu_intr_reg_addr; + + if (core_num == CIU_THIS_CORE) + core_num = octeon_get_core_num(); + + cpu_status_bits = octeon_disable_interrupts(); + + ciu_intr_reg_addr = ciu_get_intr_en_reg_addr(core_num, intx, enx); + + oct_read64(ciu_intr_reg_addr); /* Dummy read */ + + oct_write64(ciu_intr_reg_addr, 0LL); + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); /* Bus Barrier */ + + octeon_set_interrupts(cpu_status_bits); +} + +void +ciu_dump_interrutps_enabled(int core_num, int intx, int enx, int ciu_ip) +{ + + uint64_t ciu_intr_reg_addr; + uint64_t ciu_intr_bits; + + if (core_num == CIU_THIS_CORE) { + core_num = octeon_get_core_num(); + } + +#ifndef OCTEON_SMP_1 + ciu_intr_reg_addr = ciu_get_intr_en_reg_addr(core_num, intx, enx); +#else + ciu_intr_reg_addr = ciu_get_en_reg_addr_new(core_num, intx, enx, ciu_ip); +#endif + + if (!ciu_intr_reg_addr) { + printf("Bad call to %s\n", __FUNCTION__); + while(1); + return; + } + + ciu_intr_bits = oct_read64(ciu_intr_reg_addr); + printf(" CIU core %d int: %d en: %d ip: %d Add: %#llx enabled: %#llx SR: %x\n", + core_num, intx, enx, ciu_ip, (unsigned long long)ciu_intr_reg_addr, + (unsigned long long)ciu_intr_bits, mips_rd_status()); +} + + +/* + * ciu_enable_interrupts + */ +void ciu_enable_interrupts(int core_num, int intx, int enx, + uint64_t set_these_interrupt_bits, int ciu_ip) +{ + uint32_t cpu_status_bits; + uint64_t ciu_intr_reg_addr; + uint64_t ciu_intr_bits; + + if (core_num == CIU_THIS_CORE) + core_num = octeon_get_core_num(); + +//#define DEBUG_CIU_EN 1 + +#ifdef DEBUG_CIU_EN + printf(" CIU: core %u enabling Intx %u Enx %u IP %d Bits: 0x%llX\n", + core_num, intx, enx, ciu_ip, set_these_interrupt_bits); +#endif + + cpu_status_bits = octeon_disable_interrupts(); + +#ifndef OCTEON_SMP_1 + ciu_intr_reg_addr = ciu_get_intr_en_reg_addr(core_num, intx, enx); +#else + ciu_intr_reg_addr = ciu_get_en_reg_addr_new(core_num, intx, enx, ciu_ip); +#endif + + if (!ciu_intr_reg_addr) { + printf("Bad call to %s\n", __FUNCTION__); + while(1); + return; /* XXX */ + } + + ciu_intr_bits = oct_read64(ciu_intr_reg_addr); + +#ifdef DEBUG_CIU_EN + printf(" CIU: status: 0x%X reg_addr: 0x%llX Val: 0x%llX -> 0x%llX", + cpu_status_bits, ciu_intr_reg_addr, ciu_intr_bits, ciu_intr_bits | set_these_interrupt_bits); +#endif + ciu_intr_bits |= set_these_interrupt_bits; + oct_write64(ciu_intr_reg_addr, ciu_intr_bits); +#ifdef OCTEON_SMP + mips_wbflush(); +#endif + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); /* Bus Barrier */ + +#ifdef DEBUG_CIU_EN + printf(" Readback: 0x%llX\n\n ", + (uint64_t)oct_read64(ciu_intr_reg_addr)); +#endif + + octeon_set_interrupts(cpu_status_bits); +} + +unsigned long +octeon_get_clock_rate(void) +{ + return octeon_cpu_clock; +} + +static void +octeon_memory_init(void) +{ + uint32_t realmem_bytes; + + if (octeon_board_real()) { + printf("octeon_dram == %jx\n", (intmax_t)octeon_dram); + printf("reduced to ram: %u MB", (uint32_t)octeon_dram >> 20); + + realmem_bytes = (octeon_dram - PAGE_SIZE); + realmem_bytes &= ~(PAGE_SIZE - 1); + printf("Real memory bytes is %x\n", realmem_bytes); + } else { + /* Simulator we limit to 96 meg */ + realmem_bytes = (96 << 20); + } + /* phys_avail regions are in bytes */ + phys_avail[0] = (MIPS_KSEG0_TO_PHYS((vm_offset_t)&end) + PAGE_SIZE) & ~(PAGE_SIZE - 1); + if (octeon_board_real()) { + if (realmem_bytes > OCTEON_DRAM_FIRST_256_END) + phys_avail[1] = OCTEON_DRAM_FIRST_256_END; + else + phys_avail[1] = realmem_bytes; + realmem_bytes -= OCTEON_DRAM_FIRST_256_END; + realmem_bytes &= ~(PAGE_SIZE - 1); + printf("phys_avail[0] = %#lx phys_avail[1] = %#lx\n", + (long)phys_avail[0], (long)phys_avail[1]); + } else { + /* Simulator gets 96Meg period. */ + phys_avail[1] = (96 << 20); + } + /*- + * Octeon Memory looks as follows: + * PA + * 0000 0000 to 0x0 0000 0000 0000 + * 0FFF FFFF First 256 MB memory Maps to 0x0 0000 0FFF FFFF + * + * 1000 0000 to 0x1 0000 1000 0000 + * 1FFF FFFF Uncached Bu I/O space.converted to 0x1 0000 1FFF FFFF + * + * 2FFF FFFF to Cached 0x0 0000 2000 0000 + * FFFF FFFF all dram mem above the first 512M 0x3 FFFF FFFF FFFF + * + */ + physmem = btoc(phys_avail[1] - phys_avail[0]); + if ((octeon_board_real()) && + (realmem_bytes > OCTEON_DRAM_FIRST_256_END)) { + /* take out the upper non-cached 1/2 */ + realmem_bytes -= OCTEON_DRAM_FIRST_256_END; + realmem_bytes &= ~(PAGE_SIZE - 1); + /* Now map the rest of the memory */ + phys_avail[2] = 0x20000000; + printf("realmem_bytes is now at %x\n", realmem_bytes); + phys_avail[3] = ((uint32_t) 0x20000000 + realmem_bytes); + printf("Next block of memory goes from %#lx to %#lx\n", + (long)phys_avail[2], (long)phys_avail[3]); + physmem += btoc(phys_avail[3] - phys_avail[2]); + } else { + printf("realmem_bytes is %d\n", realmem_bytes); + } + realmem = physmem; + + printf("Total DRAM Size %#X\n", (uint32_t) octeon_dram); + printf("Bank 0 = %#08lX -> %#08lX\n", (long)phys_avail[0], (long)phys_avail[1]); + printf("Bank 1 = %#08lX -> %#08lX\n", (long)phys_avail[2], (long)phys_avail[3]); + printf("physmem: %#lx\n", physmem); + + Maxmem = physmem; + +} + +void +platform_start(__register_t a0, __register_t a1, __register_t a2 __unused, + __register_t a3) +{ + uint64_t platform_counter_freq; + + boothowto |= RB_SINGLE; + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + mips_timer_early_init(OCTEON_CLOCK_DEFAULT); + cninit(); + + octeon_ciu_reset(); + octeon_boot_params_init(a3); + bootverbose = 1; + + /* + * For some reason on the cn38xx simulator ebase register is set to + * 0x80001000 at bootup time. Move it back to the default, but + * when we move to having support for multiple executives, we need + * to rethink this. + */ + mips_wr_ebase(0x80000000); + + octeon_memory_init(); + init_param1(); + init_param2(physmem); + mips_cpu_init(); + pmap_bootstrap(); + mips_proc0_init(); + mutex_init(); + kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); +#endif + platform_counter_freq = octeon_get_clock_rate(); + mips_timer_init_params(platform_counter_freq, 1); +} + +/* impSTART: This stuff should move back into the Cavium SDK */ +/* + **************************************************************************************** + * + * APP/BOOT DESCRIPTOR STUFF + * + **************************************************************************************** + */ + +/* Define the struct that is initialized by the bootloader used by the + * startup code. + * + * Copyright (c) 2004, 2005, 2006 Cavium Networks. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#define OCTEON_CURRENT_DESC_VERSION 6 +#define OCTEON_ARGV_MAX_ARGS (64) +#define OCTOEN_SERIAL_LEN 20 + + +typedef struct { + /* Start of block referenced by assembly code - do not change! */ + uint32_t desc_version; + uint32_t desc_size; + + uint64_t stack_top; + uint64_t heap_base; + uint64_t heap_end; + uint64_t entry_point; /* Only used by bootloader */ + uint64_t desc_vaddr; + /* End of This block referenced by assembly code - do not change! */ + + uint32_t exception_base_addr; + uint32_t stack_size; + uint32_t heap_size; + uint32_t argc; /* Argc count for application */ + uint32_t argv[OCTEON_ARGV_MAX_ARGS]; + uint32_t flags; + uint32_t core_mask; + uint32_t dram_size; /**< DRAM size in megabyes */ + uint32_t phy_mem_desc_addr; /**< physical address of free memory descriptor block*/ + uint32_t debugger_flags_base_addr; /**< used to pass flags from app to debugger */ + uint32_t eclock_hz; /**< CPU clock speed, in hz */ + uint32_t dclock_hz; /**< DRAM clock speed, in hz */ + uint32_t spi_clock_hz; /**< SPI4 clock in hz */ + uint16_t board_type; + uint8_t board_rev_major; + uint8_t board_rev_minor; + uint16_t chip_type; + uint8_t chip_rev_major; + uint8_t chip_rev_minor; + char board_serial_number[OCTOEN_SERIAL_LEN]; + uint8_t mac_addr_base[6]; + uint8_t mac_addr_count; + uint64_t cvmx_desc_vaddr; +} octeon_boot_descriptor_t; + + +typedef struct { + uint32_t major_version; + uint32_t minor_version; + + uint64_t stack_top; + uint64_t heap_base; + uint64_t heap_end; + uint64_t desc_vaddr; + + uint32_t exception_base_addr; + uint32_t stack_size; + uint32_t flags; + uint32_t core_mask; + uint32_t dram_size; /**< DRAM size in megabyes */ + uint32_t phy_mem_desc_addr; /**< physical address of free memory descriptor block*/ + uint32_t debugger_flags_base_addr; /**< used to pass flags from app to debugger */ + uint32_t eclock_hz; /**< CPU clock speed, in hz */ + uint32_t dclock_hz; /**< DRAM clock speed, in hz */ + uint32_t spi_clock_hz; /**< SPI4 clock in hz */ + uint16_t board_type; + uint8_t board_rev_major; + uint8_t board_rev_minor; + uint16_t chip_type; + uint8_t chip_rev_major; + uint8_t chip_rev_minor; + char board_serial_number[OCTOEN_SERIAL_LEN]; + uint8_t mac_addr_base[6]; + uint8_t mac_addr_count; +} cvmx_bootinfo_t; + +uint32_t octeon_cpu_clock; +uint64_t octeon_dram; +uint32_t octeon_bd_ver = 0, octeon_cvmx_bd_ver = 0, octeon_board_rev_major, octeon_board_rev_minor, octeon_board_type; +uint8_t octeon_mac_addr[6] = { 0 }; +int octeon_core_mask, octeon_mac_addr_count; +int octeon_chip_rev_major = 0, octeon_chip_rev_minor = 0, octeon_chip_type = 0; + +static octeon_boot_descriptor_t *app_desc_ptr; +static cvmx_bootinfo_t *cvmx_desc_ptr; + +#define OCTEON_BOARD_TYPE_NONE 0 +#define OCTEON_BOARD_TYPE_SIM 1 + +#define OCTEON_CLOCK_MIN (100 * 1000 * 1000) +#define OCTEON_CLOCK_MAX (800 * 1000 * 1000) +#define OCTEON_DRAM_DEFAULT (256 * 1024 * 1024) +#define OCTEON_DRAM_MIN 30 +#define OCTEON_DRAM_MAX 3000 + + +int +octeon_board_real(void) +{ + if ((octeon_board_type == OCTEON_BOARD_TYPE_NONE) || + (octeon_board_type == OCTEON_BOARD_TYPE_SIM) || + !octeon_board_rev_major) + return 0; + return 1; +} + +static void +octeon_process_app_desc_ver_unknown(void) +{ + printf(" Unknown Boot-Descriptor: Using Defaults\n"); + + octeon_cpu_clock = OCTEON_CLOCK_DEFAULT; + octeon_dram = OCTEON_DRAM_DEFAULT; + octeon_board_rev_major = octeon_board_rev_minor = octeon_board_type = 0; + octeon_core_mask = 1; + octeon_chip_type = octeon_chip_rev_major = octeon_chip_rev_minor = 0; + octeon_mac_addr[0] = 0x00; octeon_mac_addr[1] = 0x0f; + octeon_mac_addr[2] = 0xb7; octeon_mac_addr[3] = 0x10; + octeon_mac_addr[4] = 0x09; octeon_mac_addr[5] = 0x06; + octeon_mac_addr_count = 1; +} + +static int +octeon_process_app_desc_ver_6(void) +{ + /* XXX Why is 0x00000000ffffffffULL a bad value? */ + if (app_desc_ptr->cvmx_desc_vaddr == 0 || + app_desc_ptr->cvmx_desc_vaddr == 0xfffffffful) { + printf ("Bad cvmx_desc_ptr %p\n", cvmx_desc_ptr); + return 1; + } + cvmx_desc_ptr = + (cvmx_bootinfo_t *)(intptr_t)app_desc_ptr->cvmx_desc_vaddr; + cvmx_desc_ptr = + (cvmx_bootinfo_t *) ((intptr_t)cvmx_desc_ptr | MIPS_KSEG0_START); + octeon_cvmx_bd_ver = (cvmx_desc_ptr->major_version * 100) + + cvmx_desc_ptr->minor_version; + if (cvmx_desc_ptr->major_version != 1) { + panic("Incompatible CVMX descriptor from bootloader: %d.%d %p\n", + (int) cvmx_desc_ptr->major_version, + (int) cvmx_desc_ptr->minor_version, cvmx_desc_ptr); + } + + octeon_core_mask = cvmx_desc_ptr->core_mask; + octeon_cpu_clock = cvmx_desc_ptr->eclock_hz; + octeon_board_type = cvmx_desc_ptr->board_type; + octeon_board_rev_major = cvmx_desc_ptr->board_rev_major; + octeon_board_rev_minor = cvmx_desc_ptr->board_rev_minor; + octeon_chip_type = cvmx_desc_ptr->chip_type; + octeon_chip_rev_major = cvmx_desc_ptr->chip_rev_major; + octeon_chip_rev_minor = cvmx_desc_ptr->chip_rev_minor; + octeon_mac_addr[0] = cvmx_desc_ptr->mac_addr_base[0]; + octeon_mac_addr[1] = cvmx_desc_ptr->mac_addr_base[1]; + octeon_mac_addr[2] = cvmx_desc_ptr->mac_addr_base[2]; + octeon_mac_addr[3] = cvmx_desc_ptr->mac_addr_base[3]; + octeon_mac_addr[4] = cvmx_desc_ptr->mac_addr_base[4]; + octeon_mac_addr[5] = cvmx_desc_ptr->mac_addr_base[5]; + octeon_mac_addr_count = cvmx_desc_ptr->mac_addr_count; + + if (app_desc_ptr->dram_size > 16*1024*1024) + octeon_dram = (uint64_t)app_desc_ptr->dram_size; + else + octeon_dram = (uint64_t)app_desc_ptr->dram_size << 20; + return 0; +} + +static void +octeon_boot_params_init(register_t ptr) +{ + int bad_desc = 1; + + if (ptr != 0 && ptr < MAX_APP_DESC_ADDR) { + app_desc_ptr = (octeon_boot_descriptor_t *)(intptr_t)ptr; + octeon_bd_ver = app_desc_ptr->desc_version; + if (app_desc_ptr->desc_version < 6) + panic("Your boot code is too old to be supported.\n"); + if (app_desc_ptr->desc_version >= 6) + bad_desc = octeon_process_app_desc_ver_6(); + } + if (bad_desc) + octeon_process_app_desc_ver_unknown(); + + printf("Boot Descriptor Ver: %u -> %u/%u", + octeon_bd_ver, octeon_cvmx_bd_ver/100, octeon_cvmx_bd_ver%100); + printf(" CPU clock: %uMHz\n", octeon_cpu_clock/1000000); + printf(" Dram: %u MB", (uint32_t)(octeon_dram >> 20)); + printf(" Board Type: %u Revision: %u/%u\n", + octeon_board_type, octeon_board_rev_major, octeon_board_rev_minor); + printf(" Octeon Chip: %u Rev %u/%u", + octeon_chip_type, octeon_chip_rev_major, octeon_chip_rev_minor); + + printf(" Mac Address %02X.%02X.%02X.%02X.%02X.%02X (%d)\n", + octeon_mac_addr[0], octeon_mac_addr[1], octeon_mac_addr[2], + octeon_mac_addr[3], octeon_mac_addr[4], octeon_mac_addr[5], + octeon_mac_addr_count); +} +/* impEND: This stuff should move back into the Cavium SDK */ diff --git a/sys/mips/cavium/octeon_pcmap_regs.h b/sys/mips/cavium/octeon_pcmap_regs.h new file mode 100644 index 000000000000..a80c3d4695a6 --- /dev/null +++ b/sys/mips/cavium/octeon_pcmap_regs.h @@ -0,0 +1,1118 @@ +/***********************license start*************** + * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights + * reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of Cavium Networks nor the names of + * its contributors may be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" + * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS + * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH + * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY + * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT + * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES + * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR + * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET + * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT + * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. + * + * + * For any questions regarding licensing please contact marketing@caviumnetworks.com + * + ***********************license end**************************************/ + +/* + * This product includes software developed by the University of + * California, Berkeley and its contributors." + */ + +/* $FreeBSD$ */ + +#ifndef __OCTEON_PCMAP_REGS_H__ +#define __OCTEON_PCMAP_REGS_H__ + +#include "opt_cputype.h" + +#define OCTEON_CACHE_LINE_SIZE 0x80 /* 128 bytes cache line size */ +#define IS_OCTEON_ALIGNED(p) (!((u_long)(p) & 0x7f)) +#define OCTEON_ALIGN(p) (((u_long)(p) + ((OCTEON_CACHE_LINE_SIZE) - 1)) & ~((OCTEON_CACHE_LINE_SIZE) - 1)) + +#ifndef LOCORE + +/* XXXimp: From Cavium's include/pcpu.h, need to port that over */ +#ifndef OCTEON_SMP +#define OCTEON_CORE_ID 0 +#else +extern struct pcpu *cpuid_to_pcpu[]; +#define OCTEON_CORE_ID (mips_rd_coreid()) +#endif + +/* + * Utility inlines & macros + */ + +/* turn the variable name into a string */ +#define OCTEON_TMP_STR(x) OCTEON_TMP_STR2(x) +#define OCTEON_TMP_STR2(x) #x + +#define OCTEON_PREFETCH_PREF0(address, offset) \ + __asm __volatile ( ".set mips64\n" \ + ".set noreorder\n" \ + "pref 0, " OCTEON_TMP_STR(offset) "(%0)\n" \ + ".set reorder\n" \ + ".set mips0\n" \ + : \ + : "r" (address) ); + +#define OCTEON_PREFETCH(address, offset) OCTEON_PREFETCH_PREF0(address,offset) + +#define OCTEON_PREFETCH0(address) OCTEON_PREFETCH(address, 0) +#define OCTEON_PREFETCH128(address) OCTEON_PREFETCH(address, 128) + +#define OCTEON_SYNCIOBDMA __asm __volatile (".word 0x8f" : : :"memory") + +#define OCTEON_SYNCW __asm __volatile (".word 0x10f" : : ) +#define OCTEON_SYNCW __asm __volatile (".word 0x10f" : : ) +#define OCTEON_SYNCWS __asm __volatile (".word 0x14f" : : ) + +#if defined(__mips_n32) || defined(__mips_n64) + +static inline void oct_write64 (uint64_t csr_addr, uint64_t val64) +{ + uint64_t *ptr = (uint64_t *) csr_addr; + *ptr = val64; +} + +static inline void oct_write64_int64 (uint64_t csr_addr, int64_t val64i) +{ + int64_t *ptr = (int64_t *) csr_addr; + *ptr = val64i; +} + +static inline void oct_write8_x8 (uint64_t csr_addr, uint8_t val8) +{ + uint64_t *ptr = (uint64_t *) csr_addr; + *ptr = (uint64_t) val8; +} + +static inline void oct_write8 (uint64_t csr_addr, uint8_t val8) +{ + oct_write64(csr_addr, (uint64_t) val8); +} + +static inline void oct_write16 (uint64_t csr_addr, uint16_t val16) +{ + oct_write64(csr_addr, (uint64_t) val16); +} + +static inline void oct_write32 (uint64_t csr_addr, uint32_t val32) +{ + oct_write64(csr_addr, (uint64_t) val32); +} + +static inline uint8_t oct_read8 (uint64_t csr_addr) +{ + uint8_t *ptr = (uint8_t *) csr_addr; + return (*ptr); +} + +static inline uint8_t oct_read16 (uint64_t csr_addr) +{ + uint16_t *ptr = (uint16_t *) csr_addr; + return (*ptr); +} + + +static inline uint32_t oct_read32 (uint64_t csr_addr) +{ + uint32_t *ptr = (uint32_t *) csr_addr; + return (*ptr); +} + +static inline uint64_t oct_read64 (uint64_t csr_addr) +{ + uint64_t *ptr = (uint64_t *) csr_addr; + return (*ptr); +} + +static inline int32_t oct_readint32 (uint64_t csr_addr) +{ + int32_t *ptr = (int32_t *) csr_addr; + return (*ptr); +} + + + +#else + + +/* ABI o32 */ + + +/* + * Read/write functions + */ +static inline void oct_write64 (uint64_t csr_addr, uint64_t val64) +{ + uint32_t csr_addrh = csr_addr >> 32; + uint32_t csr_addrl = csr_addr; + uint32_t valh = (uint64_t)val64 >> 32; + uint32_t vall = val64; + uint32_t tmp1; + uint32_t tmp2; + uint32_t tmp3; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %3, 32\n" + "dsll %1, %5, 32\n" + "dsll %2, %4, 32\n" + "dsrl %2, %2, 32\n" + "or %0, %0, %2\n" + "dsll %2, %6, 32\n" + "dsrl %2, %2, 32\n" + "or %1, %1, %2\n" + "sd %0, 0(%1)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3) + : "r" (valh), "r" (vall), + "r" (csr_addrh), "r" (csr_addrl) + ); +} + +static inline void oct_write64_int64 (uint64_t csr_addr, int64_t val64i) +{ + uint32_t csr_addrh = csr_addr >> 32; + uint32_t csr_addrl = csr_addr; + int32_t valh = (uint64_t)val64i >> 32; + int32_t vall = val64i; + uint32_t tmp1; + uint32_t tmp2; + uint32_t tmp3; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %3, 32\n" + "dsll %1, %5, 32\n" + "dsll %2, %4, 32\n" + "dsrl %2, %2, 32\n" + "or %0, %0, %2\n" + "dsll %2, %6, 32\n" + "dsrl %2, %2, 32\n" + "or %1, %1, %2\n" + "sd %0, 0(%1)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3) + : "r" (valh), "r" (vall), + "r" (csr_addrh), "r" (csr_addrl) + ); +} + + +/* + * oct_write8_x8 + * + * 8 bit data write into IO Space. Written using an 8 bit bus io transaction + */ +static inline void oct_write8_x8 (uint64_t csr_addr, uint8_t val8) +{ + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + uint32_t tmp1; + uint32_t tmp2; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %3, 32\n" + "dsll %1, %4, 32\n" + "dsrl %1, %1, 32\n" + "or %0, %0, %1\n" + "sb %2, 0(%0)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2) + : "r" (val8), "r" (csr_addrh), "r" (csr_addrl) ); +} + +/* + * oct_write8 + * + * 8 bit data write into IO Space. Written using a 64 bit bus io transaction + */ +static inline void oct_write8 (uint64_t csr_addr, uint8_t val8) +{ +#if 1 + oct_write64(csr_addr, (uint64_t) val8); +#else + + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + uint32_t tmp1; + uint32_t tmp2; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %3, 32\n" + "dsll %1, %4, 32\n" + "dsrl %1, %1, 32\n" + "or %0, %0, %1\n" + "sb %2, 0(%0)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2) + : "r" (val8), "r" (csr_addrh), "r" (csr_addrl) ); +#endif +} + +static inline void oct_write16 (uint64_t csr_addr, uint16_t val16) +{ +#if 1 + oct_write64(csr_addr, (uint64_t) val16); + +#else + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + uint32_t tmp1; + uint32_t tmp2; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %3, 32\n" + "dsll %1, %4, 32\n" + "dsrl %1, %1, 32\n" + "or %0, %0, %1\n" + "sh %2, 0(%0)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2) + : "r" (val16), "r" (csr_addrh), "r" (csr_addrl) ); +#endif +} + +static inline void oct_write32 (uint64_t csr_addr, uint32_t val32) +{ +#if 1 + oct_write64(csr_addr, (uint64_t) val32); +#else + + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + uint32_t tmp1; + uint32_t tmp2; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %3, 32\n" + "dsll %1, %4, 32\n" + "dsrl %1, %1, 32\n" + "or %0, %0, %1\n" + "sw %2, 0(%0)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2) + : "r" (val32), "r" (csr_addrh), "r" (csr_addrl) ); +#endif +} + + + +static inline uint8_t oct_read8 (uint64_t csr_addr) +{ + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + uint32_t tmp1, tmp2; + + __asm __volatile ( + ".set mips64\n" + "dsll %1, %2, 32\n" + "dsll %0, %3, 32\n" + "dsrl %0, %0, 32\n" + "or %1, %1, %0\n" + "lb %1, 0(%1)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2) + : "r" (csr_addrh), "r" (csr_addrl) ); + return ((uint8_t) tmp2); +} + +static inline uint8_t oct_read16 (uint64_t csr_addr) +{ + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + uint32_t tmp1, tmp2; + + __asm __volatile ( + ".set mips64\n" + "dsll %1, %2, 32\n" + "dsll %0, %3, 32\n" + "dsrl %0, %0, 32\n" + "or %1, %1, %0\n" + "lh %1, 0(%1)\n" + ".set mips0\n" + : "=&r" (tmp1), "=&r" (tmp2) + : "r" (csr_addrh), "r" (csr_addrl) ); + return ((uint16_t) tmp2); +} + + +static inline uint32_t oct_read32 (uint64_t csr_addr) +{ + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + uint32_t val32; + uint32_t tmp; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %2, 32\n" + "dsll %1, %3, 32\n" + "dsrl %1, %1, 32\n" + "or %0, %0, %1\n" + "lw %0, 0(%0)\n" + ".set mips0\n" + : "=&r" (val32), "=&r" (tmp) + : "r" (csr_addrh), "r" (csr_addrl) ); + return (val32); +} + + +static inline uint64_t oct_read64 (uint64_t csr_addr) +{ + uint32_t csr_addrh = csr_addr >> 32; + uint32_t csr_addrl = csr_addr; + uint32_t valh; + uint32_t vall; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %2, 32\n" + "dsll %1, %3, 32\n" + "dsrl %1, %1, 32\n" + "or %0, %0, %1\n" + "ld %1, 0(%0)\n" + "dsrl %0, %1, 32\n" + "dsll %1, %1, 32\n" + "dsrl %1, %1, 32\n" + ".set mips0\n" + : "=&r" (valh), "=&r" (vall) + : "r" (csr_addrh), "r" (csr_addrl) + ); + return ((uint64_t)valh << 32) | vall; +} + + +static inline int32_t oct_readint32 (uint64_t csr_addr) +{ + uint32_t csr_addrh = csr_addr>>32; + uint32_t csr_addrl = csr_addr; + int32_t val32; + uint32_t tmp; + + __asm __volatile ( + ".set mips64\n" + "dsll %0, %2, 32\n" + "dsll %1, %3, 32\n" + "dsrl %1, %1, 32\n" + "or %0, %0, %1\n" + "lw %0, 0(%0)\n" + : "=&r" (val32), "=&r" (tmp) + : "r" (csr_addrh), "r" (csr_addrl) ); + return (val32); +} + + +#endif + + +#define OCTEON_HW_BASE ((volatile uint64_t *) 0L) +#define OCTEON_REG_OFFSET (-4 * 1024ll) /* local scratchpad reg base */ +#define OCTEON_SCRATCH_BASE ((volatile uint8_t *)(OCTEON_HW_BASE + \ + OCTEON_REG_OFFSET)) + +#define OCTEON_SCR_SCRATCH 8 +#define OCTEON_SCRATCH_0 16 +#define OCTEON_SCRATCH_1 24 +#define OCTEON_SCRATCH_2 32 + + +static inline uint64_t oct_mf_chord (void) +{ + uint64_t dest; + + __asm __volatile ( ".set push\n" + ".set noreorder\n" + ".set noat\n" + ".set mips64\n" + "dmfc2 $1, 0x400\n" + "move %0, $1\n" + ".set pop\n" + : "=r" (dest) : : "$1"); + return dest; +} + + +#define MIPS64_DMFCz(cop,regnum,cp0reg,select) \ + .word (0x40200000 | (cop << 25) | (regnum << 16) | (cp0reg << 11) | select) + + +#define mips64_getcpz_xstr(s) mips64_getcpz_str(s) +#define mips64_getcpz_str(s) #s + +#define mips64_dgetcpz(cop,cpzreg,sel,val_ptr) \ + ({ __asm __volatile( \ + ".set push\n" \ + ".set mips3\n" \ + ".set noreorder\n" \ + ".set noat\n" \ + mips64_getcpz_xstr(MIPS64_DMFCz(cop,1,cpzreg,sel)) "\n" \ + "nop\n" \ + "nop\n" \ + "nop\n" \ + "nop\n" \ + "sd $1,0(%0)\n" \ + ".set pop" \ + : /* no outputs */ : "r" (val_ptr) : "$1"); \ + }) + + +#define mips64_dgetcp2(cp2reg,sel,retval_ptr) \ + mips64_dgetcpz(2,cp2reg,sel,retval_ptr) + + +#define OCTEON_MF_CHORD(dest) mips64_dgetcp2(0x400, 0, &dest) + + + +#define OCTEON_RDHWR(result, regstr) \ + __asm __volatile ( \ + ".set mips3\n" \ + "rdhwr %0,$" OCTEON_TMP_STR(regstr) "\n" \ + ".set mips\n" \ + : "=d" (result)); + +#define CVMX_MF_CHORD(dest) OCTEON_RDHWR(dest, 30) + +#define OCTEON_CHORD_HEX(dest_ptr) \ + ({ __asm __volatile( \ + ".set push\n" \ + ".set mips3\n" \ + ".set noreorder\n" \ + ".set noat\n" \ + ".word 0x7c02f03b \n"\ + "nop\n" \ + "nop\n" \ + "nop\n" \ + "nop\n" \ + "sd $2,0(%0)\n" \ + ".set pop" \ + : /* no outputs */ : "r" (dest_ptr) : "$2"); \ + }) + + + +#define OCTEON_MF_CHORD_BAD(dest) \ + __asm __volatile ( \ + ".set mips3\n" \ + "dmfc2 %0, 0x400\n" \ + ".set mips0\n" \ + : "=&r" (dest) : ) + +static inline uint64_t oct_scratch_read64 (uint64_t address) +{ + return(*((volatile uint64_t *)(OCTEON_SCRATCH_BASE + address))); +} + +static inline void oct_scratch_write64 (uint64_t address, uint64_t value) +{ + *((volatile uint64_t *)(OCTEON_SCRATCH_BASE + address)) = value; +} + + +#define OCTEON_READ_CSR32(addr, val) \ + addr_ptr = addr; \ + oct_read_32_ptr(&addr_ptr, &val); + +#define OCTEON_WRITE_CSR32(addr, val, val_dummy) \ + addr_ptr = addr; \ + oct_write_32_ptr(&addr_ptr, &val); \ + oct_read64(OCTEON_MIO_BOOT_BIST_STAT); + + + +/* + * Octeon Address Space Definitions + */ +typedef enum { + OCTEON_MIPS_SPACE_XKSEG = 3LL, + OCTEON_MIPS_SPACE_XKPHYS = 2LL, + OCTEON_MIPS_SPACE_XSSEG = 1LL, + OCTEON_MIPS_SPACE_XUSEG = 0LL +} octeon_mips_space_t; + +typedef enum { + OCTEON_MIPS_XKSEG_SPACE_KSEG0 = 0LL, + OCTEON_MIPS_XKSEG_SPACE_KSEG1 = 1LL, + OCTEON_MIPS_XKSEG_SPACE_SSEG = 2LL, + OCTEON_MIPS_XKSEG_SPACE_KSEG3 = 3LL +} octeon_mips_xkseg_space_t; + + +/* +*********************************************************************** + * 32 bit mode alert + * The kseg0 calc below might fail in xkphys. + */ + +/* + * We limit the allocated device physical blocks to low mem. So use Kseg0 + */ + +/* + * Need to go back to kernel to find v->p mappings & vice-versa + * We are getting non 1-1 mappings. + * #define OCTEON_PTR2PHYS(addr) ((unsigned long) addr & 0x7fffffff) + */ +#define OCTEON_PTR2PHYS(addr) octeon_ptr_to_phys(addr) + + + +/* PTR_SIZE == sizeof(uint32_t) */ + +#ifdef ISA_MIPS32 +#define mipsx_addr_size uint32_t // u_int64 +#define MIPSX_ADDR_SIZE_KSEGX_BIT_SHIFT 30 // 62 +#define MIPSX_ADDR_SIZE_KSEGX_MASK_REMOVED 0x1fffffff // 0x1fffffff +#else +#define mipsx_addr_size uint64_t +#define MIPSX_ADDR_SIZE_KSEGX_BIT_SHIFT 62 +#define MIPSX_ADDR_SIZE_KSEGX_MASK_REMOVED 0x1fffffffffffffff +#endif + + +#define octeon_ptr_to_phys(ptr) \ + (((((mipsx_addr_size) ptr) >> MIPSX_ADDR_SIZE_KSEGX_BIT_SHIFT) == 2) ? \ + ((mipsx_addr_size) ptr & MIPSX_ADDR_SIZE_KSEGX_MASK_REMOVED) : \ + (vtophys(ptr))) + +#ifdef CODE_FOR_64_BIT_NEEDED +static inline mipsx_addr_size octeon_ptr_to_phys (void *ptr) +{ + if ((((mipsx_addr_size) ptr) >> MIPSX_ADDR_SIZE_KSEGX_BIT_SHIFT) == 2) { + /* + * KSEG0 based address ? + */ + return ((mipsx_addr_size) ptr & MIPSX_ADDR_SIZE_KSEGX_MASK_REMOVED); + } else { + /* + * Ask kernel/vm to give us the phys translation. + */ + return (vtophys(ptr)); + } +} +#endif + +#define OCTEON_IO_SEG OCTEON_MIPS_SPACE_XKPHYS + + +#define OCTEON_ADD_SEG(segment, add) ((((uint64_t)segment) << 62) | (add)) + +#define OCTEON_ADD_IO_SEG(add) OCTEON_ADD_SEG(OCTEON_IO_SEG, (add)) +#define OCTEON_ADDR_DID(did) (OCTEON_ADDR_DIDSPACE(did) << 40) +#define OCTEON_ADDR_DIDSPACE(did) (((OCTEON_IO_SEG) << 22) | ((1ULL) << 8) | (did)) +#define OCTEON_ADDR_FULL_DID(did,subdid) (((did) << 3) | (subdid)) + + +#define OCTEON_CIU_PP_RST OCTEON_ADD_IO_SEG(0x0001070000000700ull) +#define OCTEON_CIU_SOFT_RST OCTEON_ADD_IO_SEG(0x0001070000000740ull) +#define OCTEON_OCTEON_DID_TAG 12ULL + +/* + * octeon_addr_t + */ +typedef union { + uint64_t word64; + + struct { + octeon_mips_space_t R : 2; + uint64_t offset :62; + } sva; // mapped or unmapped virtual address + + struct { + uint64_t zeroes :33; + uint64_t offset :31; + } suseg; // mapped USEG virtual addresses (typically) + + struct { + uint64_t ones :33; + octeon_mips_xkseg_space_t sp : 2; + uint64_t offset :29; + } sxkseg; // mapped or unmapped virtual address + + struct { + octeon_mips_space_t R :2; // CVMX_MIPS_SPACE_XKPHYS in this case + uint64_t cca : 3; // ignored by octeon + uint64_t mbz :10; + uint64_t pa :49; // physical address + } sxkphys; // physical address accessed through xkphys unmapped virtual address + + struct { + uint64_t mbz :15; + uint64_t is_io : 1; // if set, the address is uncached and resides on MCB bus + uint64_t did : 8; // the hardware ignores this field when is_io==0, else device ID + uint64_t unaddr: 4; // the hardware ignores <39:36> in Octeon I + uint64_t offset :36; + } sphys; // physical address + + struct { + uint64_t zeroes :24; // techically, <47:40> are dont-cares + uint64_t unaddr: 4; // the hardware ignores <39:36> in Octeon I + uint64_t offset :36; + } smem; // physical mem address + + struct { + uint64_t mem_region :2; + uint64_t mbz :13; + uint64_t is_io : 1; // 1 in this case + uint64_t did : 8; // the hardware ignores this field when is_io==0, else device ID + uint64_t unaddr: 4; // the hardware ignores <39:36> in Octeon I + uint64_t offset :36; + } sio; // physical IO address + + struct { + uint64_t didspace : 24; + uint64_t unused : 40; + } sfilldidspace; + +} octeon_addr_t; + + +typedef union { + uint64_t word64; + struct { + uint32_t word32hi; + uint32_t word32lo; + } bits; +} octeon_word_t; + + + + +/* + * octeon_build_io_address + * + * Builds a memory address for I/O based on the Major 5bits and Sub DID 3bits + */ +static inline uint64_t octeon_build_io_address (uint64_t major_did, + uint64_t sub_did) +{ + return ((0x1ull << 48) | (major_did << 43) | (sub_did << 40)); +} + +/* + * octeon_build_mask + * + * Builds a bit mask given the required size in bits. + * + * @param bits Number of bits in the mask + * @return The mask + */ +static inline uint64_t octeon_build_mask (uint64_t bits) +{ + return ~((~0x0ull) << bits); +} + +/* + * octeon_build_bits + * + * Perform mask and shift to place the supplied value into + * the supplied bit rage. + * + * Example: octeon_build_bits(39,24,value) + *

    + * 6       5       4       3       3       2       1
    + * 3       5       7       9       1       3       5       7      0
    + * +-------+-------+-------+-------+-------+-------+-------+------+
    + * 000000000000000000000000___________value000000000000000000000000
    + * 
    + * + * @param high_bit Highest bit value can occupy (inclusive) 0-63 + * @param low_bit Lowest bit value can occupy inclusive 0-high_bit + * @param value Value to use + * @return Value masked and shifted + */ +static inline uint64_t octeon_build_bits (uint64_t high_bit, uint64_t low_bit, + uint64_t value) +{ + return ((value & octeon_build_mask(high_bit - low_bit + 1)) << low_bit); +} + + +/********************** simple spinlocks ***************/ +typedef struct { + volatile uint32_t value; +} octeon_spinlock_t; + +// note - macros not expanded in inline ASM, so values hardcoded +#define OCTEON_SPINLOCK_UNLOCKED_VAL 0 +#define OCTEON_SPINLOCK_LOCKED_VAL 1 + +/** + * Initialize a spinlock + * + * @param lock Lock to initialize + */ +static inline void octeon_spinlock_init(octeon_spinlock_t *lock) +{ + lock->value = OCTEON_SPINLOCK_UNLOCKED_VAL; +} +/** + * Releases lock + * + * @param lock pointer to lock structure + */ +static inline void octeon_spinlock_unlock(octeon_spinlock_t *lock) +{ + OCTEON_SYNCWS; + + lock->value = 0; + OCTEON_SYNCWS; +} + +/** + * Gets lock, spins until lock is taken + * + * @param lock pointer to lock structure + */ +static inline void octeon_spinlock_lock(octeon_spinlock_t *lock) +{ + unsigned int tmp; + __asm __volatile( + ".set noreorder \n" + "1: ll %1, %0 \n" + " bnez %1, 1b \n" + " li %1, 1 \n" + " sc %1, %0 \n" + " beqz %1, 1b \n" + " nop \n" + ".set reorder \n" + : "+m" (lock->value), "=&r" (tmp ) + : + : "memory"); +} + +/********************** end simple spinlocks ***************/ + + + +/* ------------------------------------------------------------------- * + * octeon_get_chipid() * + * ------------------------------------------------------------------- */ +#define OCTEON_CN31XX_CHIP 0x000d0100 +#define OCTEON_CN30XX_CHIP 0x000d0200 +#define OCTEON_CN3020_CHIP 0x000d0112 +#define OCTEON_CN5020_CHIP 0x000d0601 + +static inline uint32_t octeon_get_chipid(void) +{ + uint32_t id; + + __asm __volatile ("mfc0 %0, $15,0" : "=r" (id)); + + return (id); +} + + +static inline uint32_t octeon_get_except_base_reg (void) +{ + uint32_t tmp; + + __asm volatile ( + " .set mips64r2 \n" + " .set noreorder \n" + " mfc0 %0, $15, 1 \n" + " .set reorder \n" + : "=&r" (tmp) : ); + + return(tmp); +} + + + + +static inline unsigned int get_coremask (void) +{ + return(~(oct_read64(OCTEON_CIU_PP_RST)) & 0xffff); +} + + +static inline uint32_t octeon_get_core_num (void) +{ + + return (0x3FF & octeon_get_except_base_reg()); +} + + +static inline uint64_t octeon_get_cycle(void) +{ + +/* ABI == 32 */ + + uint32_t tmp_low, tmp_hi; + + __asm __volatile ( + " .set push \n" + " .set mips64r2 \n" + " .set noreorder \n" + " rdhwr %[tmpl], $31 \n" + " dadd %[tmph], %[tmpl], $0 \n" + " dsrl %[tmph], 32 \n" + " dsll %[tmpl], 32 \n" + " dsrl %[tmpl], 32 \n" + " .set pop \n" + : [tmpl] "=&r" (tmp_low), [tmph] "=&r" (tmp_hi) : ); + + return(((uint64_t)tmp_hi << 32) + tmp_low); +} + + +/** + * Wait for the specified number of cycle + * + * @param cycles + */ +static inline void octeon_wait (uint64_t cycles) +{ + uint64_t done = octeon_get_cycle() + cycles; + + while (octeon_get_cycle() < done) + { + /* Spin */ + } +} + + + +/* + * octeon_machdep.c + * + * Direct to Board Support level. + */ +extern void octeon_led_write_char(int char_position, char val); +extern void octeon_led_write_hexchar(int char_position, char hexval); +extern void octeon_led_write_hex(uint32_t wl); +extern void octeon_led_write_string(const char *str); +extern void octeon_reset(void); +extern void octeon_uart_write_byte(int uart_index, uint8_t ch); +extern void octeon_uart_write_string(int uart_index, const char *str); +extern void octeon_uart_write_hex(uint32_t wl); +extern void octeon_uart_write_hex2(uint32_t wl, uint32_t wh); +extern void octeon_wait_uart_flush(int uart_index, uint8_t ch); +extern void octeon_uart_write_byte0(uint8_t ch); +extern void octeon_led_write_char0(char val); +extern void octeon_led_run_wheel(int *pos, int led_position); +extern void octeon_debug_symbol(void); +extern void mips_disable_interrupt_controls(void); +extern uint32_t octeon_cpu_clock; +extern uint64_t octeon_dram; +extern uint32_t octeon_bd_ver, octeon_board_rev_major, octeon_board_rev_minor, octeon_board_type; +extern uint8_t octeon_mac_addr[6]; +extern int octeon_core_mask, octeon_mac_addr_count, octeon_chip_rev_major, octeon_chip_rev_minor, octeon_chip_type; +extern void bzero_64(void *str, size_t len); +extern void bzero_32(void *str, size_t len); +extern void bzero_16(void *str, size_t len); +extern void bzero_old(void *str, size_t len); +extern void octeon_ciu_reset(void); +extern void ciu_disable_intr(int core_num, int intx, int enx); +extern void ciu_enable_interrupts (int core_num, int intx, int enx, uint64_t set_these_interrupt_bits, int ciu_ip); +extern void ciu_clear_int_summary(int core_num, int intx, int enx, uint64_t write_bits); +extern uint64_t ciu_get_int_summary(int core_num, int intx, int enx); +extern void octeon_ciu_start_gtimer(int timer, u_int one_shot, uint64_t time_cycles); +extern void octeon_ciu_stop_gtimer(int timer); +extern int octeon_board_real(void); +extern unsigned long octeon_get_clock_rate(void); + +typedef union { + uint64_t word64; + struct { + uint64_t reserved : 27; /* Not used */ + uint64_t one_shot : 1; /* Oneshot ? */ + uint64_t len : 36; /* len of timer in clock cycles - 1 */ + } bits; +} octeon_ciu_gentimer; + + + +#endif /* LOCORE */ + + +/* + * R4K Address space definitions + */ +#define ADRSPC_K0BASE (0x80000000) +#define ADRSPC_K0SIZE (0x20000000) +#define ADRSPC_K1BASE (0xA0000000) +#define ADRSPC_K1SIZE (0x20000000) +#define ADRSPC_KSBASE (0xC0000000) +#define ADRSPC_KSSIZE (0x20000000) +#define ADRSPC_K3BASE (0xE0000000) +#define ADRSPC_K3SIZE (0x20000000) +#define ADRSPC_KUBASE (0x00000000) +#define ADRSPC_KUSIZE (0x80000000) +#define KSEG_MSB_ADDR 0xFFFFFFFF + + + +#define OCTEON_CLOCK_DEFAULT (500 * 1000 * 1000) + + +/* + * Octeon Boot Bus BIST Status + * Mostly used for dummy read to ensure all prev I/Os are write-complete. + */ +#define OCTEON_MIO_BOOT_BIST_STAT 0x80011800000000F8ull + +/* + * Octeon UART unit + */ +#define OCTEON_MIO_UART0 0x8001180000000800ull +#define OCTEON_MIO_UART1 0x8001180000000C00ull +#define OCTEON_MIO_UART0_THR 0x8001180000000840ull +#define OCTEON_MIO_UART1_THR 0x8001180000000C40ull +#define OCTEON_MIO_UART0_LSR 0x8001180000000828ull +#define OCTEON_MIO_UART1_LSR 0x8001180000000C28ull +#define OCTEON_MIO_UART0_RBR 0x8001180000000800ull +#define OCTEON_MIO_UART1_RBR 0x8001180000000C00ull +#define OCTEON_MIO_UART0_USR 0x8001180000000938ull +#define OCTEON_MIO_UART1_USR 0x8001180000000D38ull +#define OCTEON_MIO_ADDR_HI24 0x800118 +#define OCTEON_MIO_UART_SIZE 0x400ull + + +/* + * EBT3000 LED Unit + */ +#define OCTEON_CHAR_LED_BASE_ADDR (0x1d020000 | (0x1ffffffffull << 31)) + +#define OCTEON_FPA_QUEUES 8 + +/* + * Octeon FPA I/O Registers + */ +#define OCTEON_FPA_CTL_STATUS 0x8001180028000050ull +#define OCTEON_FPA_FPF_SIZE 0x8001180028000058ull +#define OCTEON_FPA_FPF_MARKS 0x8001180028000000ull +#define OCTEON_FPA_INT_SUMMARY 0x8001180028000040ull +#define OCTEON_FPA_INT_ENABLE 0x8001180028000048ull +#define OCTEON_FPA_QUEUE_AVAILABLE 0x8001180028000098ull +#define OCTEON_FPA_PAGE_INDEX 0x80011800280000f0ull + +/* + * Octeon PKO Unit + */ +#define OCTEON_PKO_REG_FLAGS 0x8001180050000000ull +#define OCTEON_PKO_REG_READ_IDX 0x8001180050000008ull +#define OCTEON_PKO_CMD_BUF 0x8001180050000010ull +#define OCTEON_PKO_GMX_PORT_MODE 0x8001180050000018ull +#define OCTEON_PKO_REG_CRC_ENABLE 0x8001180050000020ull +#define OCTEON_PKO_QUEUE_MODE 0x8001180050000048ull +#define OCTEON_PKO_MEM_QUEUE_PTRS 0x8001180050001000ull +#define OCTEON_PKO_MEM_COUNT0 0x8001180050001080ull +#define OCTEON_PKO_MEM_COUNT1 0x8001180050001088ull +#define OCTEON_PKO_MEM_DEBUG0 0x8001180050001100ull +#define OCTEON_PKO_MEM_DEBUG1 0x8001180050001108ull +#define OCTEON_PKO_MEM_DEBUG2 0x8001180050001110ull +#define OCTEON_PKO_MEM_DEBUG3 0x8001180050001118ull +#define OCTEON_PKO_MEM_DEBUG4 0x8001180050001120ull +#define OCTEON_PKO_MEM_DEBUG5 0x8001180050001128ull +#define OCTEON_PKO_MEM_DEBUG6 0x8001180050001130ull +#define OCTEON_PKO_MEM_DEBUG7 0x8001180050001138ull +#define OCTEON_PKO_MEM_DEBUG8 0x8001180050001140ull +#define OCTEON_PKO_MEM_DEBUG9 0x8001180050001148ull + + +/* + * Octeon IPD Unit + */ +#define OCTEON_IPD_1ST_MBUFF_SKIP 0x80014F0000000000ull +#define OCTEON_IPD_NOT_1ST_MBUFF_SKIP 0x80014F0000000008ull +#define OCTEON_IPD_PACKET_MBUFF_SIZE 0x80014F0000000010ull +#define OCTEON_IPD_1ST_NEXT_PTR_BACK 0x80014F0000000150ull +#define OCTEON_IPD_2ND_NEXT_PTR_BACK 0x80014F0000000158ull +#define OCTEON_IPD_WQE_FPA_QUEUE 0x80014F0000000020ull +#define OCTEON_IPD_CTL_STATUS 0x80014F0000000018ull +#define OCTEON_IPD_QOSX_RED_MARKS(queue) (0x80014F0000000178ull + ((queue) * 8)) +#define OCTEON_IPD_RED_Q_PARAM(queue) (0x80014F00000002E0ull + ((queue) * 8)) +#define OCTEON_IPD_PORT_BP_PAGE_COUNT(port) (0x80014F0000000028ull + ((port) * 8)) +#define OCTEON_IPD_BP_PORT_RED_END 0x80014F0000000328ull +#define OCTEON_IPD_RED_PORT_ENABLE 0x80014F00000002D8ull + +/* + * Octeon CIU Unit + */ +#define OCTEON_CIU_ENABLE_BASE_ADDR 0x8001070000000200ull +#define OCTEON_CIU_SUMMARY_BASE_ADDR 0x8001070000000000ull +#define OCTEON_CIU_SUMMARY_INT1_ADDR 0x8001070000000108ull + +#define OCTEON_CIU_MBOX_SETX(offset) (0x8001070000000600ull+((offset)*8)) +#define OCTEON_CIU_MBOX_CLRX(offset) (0x8001070000000680ull+((offset)*8)) +#define OCTEON_CIU_ENABLE_MBOX_INTR 0x0000000300000000ull /* bits 32, 33 */ + +#define CIU_MIPS_IP2 0 +#define CIU_MIPS_IP3 1 + +#define CIU_INT_0 CIU_MIPS_IP2 +#define CIU_INT_1 CIU_MIPS_IP3 + +#define CIU_EN_0 0 +#define CIU_EN_1 1 + +#define CIU_THIS_CORE -1 + +#define CIU_UART_BITS_UART0 (0x1ull << 34) // Bit 34 +#define CIU_UART_BITS_UART1 (0x1ull << 35) // Bit 35 +#define CIU_GENTIMER_BITS_ENABLE(timer) (0x1ull << (52 + (timer))) // Bit 52..55 + +#define CIU_GENTIMER_NUM_0 0 +#define CIU_GENTIMER_NUM_1 1 +#define CIU_GENTIMER_NUM_2 2 +#define CIU_GENTIMER_NUM_3 3 +#define OCTEON_GENTIMER_ONESHOT 1 +#define OCTEON_GENTIMER_PERIODIC 0 + +#define OCTEON_CIU_GENTIMER_ADDR(timer) (0x8001070000000480ull + ((timer) * 0x8)) + + +#define OCTEON_GENTIMER_LEN_1MS (0x7a120ull) /* Back of envelope. 500Mhz Octeon */ // FIXME IF WRONG +#define OCTEON_GENTIMER_LEN_1SEC ((OCTEON_GENTIMER_LEN_1MS) * 1000) + +/* + * Physical Memory Banks + */ +/* 1st BANK */ +#define OCTEON_DRAM_FIRST_256_START 0x00000000ull +#define OCTEON_DRAM_FIRST_256_END (0x10000000ull - 1ull) +#define OCTEON_DRAM_RESERVED_END 0X1FFF000ULL /* 32 Meg Reserved for Mips Kernel MD Ops */ +#define OCTEON_DRAM_FIRST_BANK_SIZE (OCTEON_DRAM_FIRST_256_END - OCTEON_DRAM_FIRST_256_START + 1) + +/* 2nd BANK */ +#define OCTEON_DRAM_SECOND_256_START (0x0000000410000000ull) +#define OCTEON_DRAM_SECOND_256_END (0x0000000420000000ull - 1ull) /* Requires 64 bit paddr */ +#define OCTEON_DRAM_SECOND_BANK_SIZE (OCTEON_DRAM_SECOND_256_END - OCTEON_DRAM_SECOND_256_START + 1ull) + +/* 3rd BANK */ +#define OCTEON_DRAM_ABOVE_512_START 0x20000000ull +#define OCTEON_DRAM_ABOVE_512_END (0x0000000300000000ull - 1ull) /* To be calculated as remaining */ +#define OCTEON_DRAM_THIRD_BANK_SIZE (OCTEON_DRAM_ABOVE_512_END - OCTEON_DRAM_ABOVE_512_START + 1ull) + +#endif /* !OCTEON_PCMAP_REGS_H__ */ diff --git a/sys/mips/cavium/std.octeon1 b/sys/mips/cavium/std.octeon1 new file mode 100644 index 000000000000..4e72e4da3ab7 --- /dev/null +++ b/sys/mips/cavium/std.octeon1 @@ -0,0 +1,22 @@ +# /* +# * This product includes software developed by the University of +# * California, Berkeley and its contributors." +# */ +# $FreeBSD$ +# +files "../cavium/files.octeon1" + +# +# +# +cpu CPU_MIPS4KC +#device pci +#device ata +#device atadisk + +#device clock +#device obio +#device uart + +# Kludge +options TARGET_OCTEON diff --git a/sys/mips/cavium/uart_bus_octeonusart.c b/sys/mips/cavium/uart_bus_octeonusart.c new file mode 100644 index 000000000000..1adaf1c3f586 --- /dev/null +++ b/sys/mips/cavium/uart_bus_octeonusart.c @@ -0,0 +1,116 @@ +/*- + * Copyright (c) 2006 Wojciech A. Koszek + * 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 + * $Id$ + */ +/* + * Skeleton of this file was based on respective code for ARM + * code written by Olivier Houchard. + */ + +/* + * XXXMIPS: This file is hacked from arm/... . XXXMIPS here means this file is + * experimental and was written for MIPS32 port. + */ +#include "opt_uart.h" + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include "uart_if.h" + +extern struct uart_class uart_oct16550_class; + + +static int uart_octeon_probe(device_t dev); +static void octeon_uart_identify(driver_t * drv, device_t parent); + +extern struct uart_class octeon_uart_class; + +static device_method_t uart_octeon_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, uart_octeon_probe), + DEVMETHOD(device_attach, uart_bus_attach), + DEVMETHOD(device_detach, uart_bus_detach), + DEVMETHOD(device_identify, octeon_uart_identify), + {0, 0} +}; + +static driver_t uart_octeon_driver = { + uart_driver_name, + uart_octeon_methods, + sizeof(struct uart_softc), +}; + +extern +SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs; + +static int +uart_octeon_probe(device_t dev) +{ + struct uart_softc *sc; + int unit; + + unit = device_get_unit(dev); + sc = device_get_softc(dev); + sc->sc_class = &uart_oct16550_class; + + /* + * We inherit the settings from the systme console. Note, the bst + * bad bus_space_map are bogus here, but obio doesn't yet support + * them, it seems. + */ + sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs); + bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); + sc->sc_bas.bst = uart_bus_space_mem; + if (bus_space_map(sc->sc_bas.bst, OCTEON_MIO_UART0, OCTEON_MIO_UART_SIZE, + 0, &sc->sc_bas.bsh) != 0) + return (ENXIO); + return (uart_bus_probe(dev, sc->sc_bas.regshft, 0, 0, unit)); +} + +static void +octeon_uart_identify(driver_t * drv, device_t parent) +{ + BUS_ADD_CHILD(parent, 0, "uart", 0); +} + +DRIVER_MODULE(uart, obio, uart_octeon_driver, uart_devclass, 0, 0); diff --git a/sys/mips/cavium/uart_cpu_octeonusart.c b/sys/mips/cavium/uart_cpu_octeonusart.c new file mode 100644 index 000000000000..d2d8f56d704f --- /dev/null +++ b/sys/mips/cavium/uart_cpu_octeonusart.c @@ -0,0 +1,189 @@ +/*- + * Copyright (c) 2009 M. Warner Losh + * Copyright (c) 2006 Wojciech A. Koszek + * 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. + * + * $Id$ + */ +#include "opt_uart.h" + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +#include +#include + +#include + +bus_space_tag_t uart_bus_space_io; +bus_space_tag_t uart_bus_space_mem; + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +/* + * Specailized uart bus space. We present a 1 apart byte oriented + * bus to the outside world, but internally translate to/from the 8-apart + * 64-bit word bus that's on the octeon. We only support simple read/write + * in this space. Everything else is undefined. + */ +static uint8_t +ou_bs_r_1(void *t, bus_space_handle_t handle, bus_size_t offset) +{ + + return (oct_read64(handle + (offset << 3))); +} + +static uint16_t +ou_bs_r_2(void *t, bus_space_handle_t handle, bus_size_t offset) +{ + + return (oct_read64(handle + (offset << 3))); +} + +static uint32_t +ou_bs_r_4(void *t, bus_space_handle_t handle, bus_size_t offset) +{ + + return (oct_read64(handle + (offset << 3))); +} + +static uint64_t +ou_bs_r_8(void *t, bus_space_handle_t handle, bus_size_t offset) +{ + + return (oct_read64(handle + (offset << 3))); +} + +static void +ou_bs_w_1(void *t, bus_space_handle_t bsh, bus_size_t offset, uint8_t value) +{ + + oct_write64(bsh + (offset << 3), value); +} + +static void +ou_bs_w_2(void *t, bus_space_handle_t bsh, bus_size_t offset, uint16_t value) +{ + + oct_write64(bsh + (offset << 3), value); +} + +static void +ou_bs_w_4(void *t, bus_space_handle_t bsh, bus_size_t offset, uint32_t value) +{ + + oct_write64(bsh + (offset << 3), value); +} + +static void +ou_bs_w_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value) +{ + + oct_write64(bsh + (offset << 3), value); +} + +struct bus_space octeon_uart_tag = { + .bs_map = generic_bs_map, + .bs_unmap = generic_bs_unmap, + .bs_subregion = generic_bs_subregion, + .bs_barrier = generic_bs_barrier, + .bs_r_1 = ou_bs_r_1, + .bs_r_2 = ou_bs_r_2, + .bs_r_4 = ou_bs_r_4, + .bs_r_8 = ou_bs_r_8, + .bs_w_1 = ou_bs_w_1, + .bs_w_2 = ou_bs_w_2, + .bs_w_4 = ou_bs_w_4, + .bs_w_8 = ou_bs_w_8, +}; + +extern struct uart_class uart_oct16550_class; + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + +int +uart_cpu_getdev(int devtype, struct uart_devinfo *di) +{ + struct uart_class *class = &uart_oct16550_class; + + /* + * These fields need to be setup corretly for uart_getenv to + * work in all cases. + */ + uart_bus_space_io = NULL; /* No io map for this device */ + uart_bus_space_mem = &octeon_uart_tag; + di->bas.bst = uart_bus_space_mem; + + /* + * If env specification for UART exists it takes precedence: + * hw.uart.console="mm:0xf1012000" or similar + */ + if (uart_getenv(devtype, di, class) == 0) + return (0); + + /* + * Fallback to UART0 for console. + */ + di->ops = uart_getops(class); + di->bas.chan = 0; + if (bus_space_map(di->bas.bst, OCTEON_MIO_UART0, OCTEON_MIO_UART_SIZE, + 0, &di->bas.bsh) != 0) + return (ENXIO); + di->bas.regshft = 0; + di->bas.rclk = 0; + di->baudrate = 115200; + di->databits = 8; + di->stopbits = 1; + di->parity = UART_PARITY_NONE; + + return (0); +} diff --git a/sys/mips/cavium/uart_dev_oct16550.c b/sys/mips/cavium/uart_dev_oct16550.c new file mode 100644 index 000000000000..3e6d7c7cce7c --- /dev/null +++ b/sys/mips/cavium/uart_dev_oct16550.c @@ -0,0 +1,827 @@ +/*- + * Copyright (c) 2003 Marcel Moolenaar + * 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 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. + */ + +/* + * uart_dev_oct16550.c + * + * Derived from uart_dev_ns8250.c + * + * 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include + +#include "uart_if.h" + +/* + * Clear pending interrupts. THRE is cleared by reading IIR. Data + * that may have been received gets lost here. + */ +static void +oct16550_clrint (struct uart_bas *bas) +{ + uint8_t iir; + + iir = uart_getreg(bas, REG_IIR); + while ((iir & IIR_NOPEND) == 0) { + iir &= IIR_IMASK; + if (iir == IIR_RLS) + (void)uart_getreg(bas, REG_LSR); + else if (iir == IIR_RXRDY || iir == IIR_RXTOUT) + (void)uart_getreg(bas, REG_DATA); + else if (iir == IIR_MLSC) + (void)uart_getreg(bas, REG_MSR); + else if (iir == IIR_BUSY) + (void) uart_getreg(bas, REG_USR); + uart_barrier(bas); + iir = uart_getreg(bas, REG_IIR); + } +} + +static int delay_changed = 1; + +static int +oct16550_delay (struct uart_bas *bas) +{ + int divisor; + u_char lcr; + static int delay = 0; + + if (!delay_changed) return delay; + delay_changed = 0; + lcr = uart_getreg(bas, REG_LCR); + uart_setreg(bas, REG_LCR, lcr | LCR_DLAB); + uart_barrier(bas); + divisor = uart_getreg(bas, REG_DLL) | (uart_getreg(bas, REG_DLH) << 8); + uart_barrier(bas); + uart_setreg(bas, REG_LCR, lcr); + uart_barrier(bas); + + if(!bas->rclk) + return 10; /* return an approx delay value */ + + /* 1/10th the time to transmit 1 character (estimate). */ + if (divisor <= 134) + return (16000000 * divisor / bas->rclk); + return (16000 * divisor / (bas->rclk / 1000)); + +} + +static int +oct16550_divisor (int rclk, int baudrate) +{ + int actual_baud, divisor; + int error; + + if (baudrate == 0) + return (0); + + divisor = (rclk / (baudrate << 3) + 1) >> 1; + if (divisor == 0 || divisor >= 65536) + return (0); + actual_baud = rclk / (divisor << 4); + + /* 10 times error in percent: */ + error = ((actual_baud - baudrate) * 2000 / baudrate + 1) >> 1; + + /* 3.0% maximum error tolerance: */ + if (error < -30 || error > 30) + return (0); + + return (divisor); +} + +static int +oct16550_drain (struct uart_bas *bas, int what) +{ + int delay, limit; + + delay = oct16550_delay(bas); + + if (what & UART_DRAIN_TRANSMITTER) { + /* + * Pick an arbitrary high limit to avoid getting stuck in + * an infinite loop when the hardware is broken. Make the + * limit high enough to handle large FIFOs. + */ + limit = 10*10*10*1024; + while ((uart_getreg(bas, REG_LSR) & LSR_TEMT) == 0 && --limit) + DELAY(delay); + if (limit == 0) { + /* printf("oct16550: transmitter appears stuck... "); */ + return (0); + } + } + + if (what & UART_DRAIN_RECEIVER) { + /* + * Pick an arbitrary high limit to avoid getting stuck in + * an infinite loop when the hardware is broken. Make the + * limit high enough to handle large FIFOs and integrated + * UARTs. The HP rx2600 for example has 3 UARTs on the + * management board that tend to get a lot of data send + * to it when the UART is first activated. + */ + limit=10*4096; + while ((uart_getreg(bas, REG_LSR) & LSR_RXRDY) && --limit) { + (void)uart_getreg(bas, REG_DATA); + uart_barrier(bas); + DELAY(delay << 2); + } + if (limit == 0) { + /* printf("oct16550: receiver appears broken... "); */ + return (EIO); + } + } + + return (0); +} + +/* + * We can only flush UARTs with FIFOs. UARTs without FIFOs should be + * drained. WARNING: this function clobbers the FIFO setting! + */ +static void +oct16550_flush (struct uart_bas *bas, int what) +{ + uint8_t fcr; + + fcr = FCR_ENABLE; + if (what & UART_FLUSH_TRANSMITTER) + fcr |= FCR_XMT_RST; + if (what & UART_FLUSH_RECEIVER) + fcr |= FCR_RCV_RST; + uart_setreg(bas, REG_FCR, fcr); + uart_barrier(bas); +} + +static int +oct16550_param (struct uart_bas *bas, int baudrate, int databits, int stopbits, + int parity) +{ + int divisor; + uint8_t lcr; + + lcr = 0; + if (databits >= 8) + lcr |= LCR_8BITS; + else if (databits == 7) + lcr |= LCR_7BITS; + else if (databits == 6) + lcr |= LCR_6BITS; + else + lcr |= LCR_5BITS; + if (stopbits > 1) + lcr |= LCR_STOPB; + lcr |= parity << 3; + + /* Set baudrate. */ + if (baudrate > 0) { + divisor = oct16550_divisor(bas->rclk, baudrate); + if (divisor == 0) + return (EINVAL); + uart_setreg(bas, REG_LCR, lcr | LCR_DLAB); + uart_barrier(bas); + uart_setreg(bas, REG_DLL, divisor & 0xff); + uart_setreg(bas, REG_DLH, (divisor >> 8) & 0xff); + uart_barrier(bas); + delay_changed = 1; + } + + /* Set LCR and clear DLAB. */ + uart_setreg(bas, REG_LCR, lcr); + uart_barrier(bas); + return (0); +} + +/* + * Low-level UART interface. + */ +static int oct16550_probe(struct uart_bas *bas); +static void oct16550_init(struct uart_bas *bas, int, int, int, int); +static void oct16550_term(struct uart_bas *bas); +static void oct16550_putc(struct uart_bas *bas, int); +static int oct16550_rxready(struct uart_bas *bas); +static int oct16550_getc(struct uart_bas *bas, struct mtx *); + +struct uart_ops uart_oct16550_ops = { + .probe = oct16550_probe, + .init = oct16550_init, + .term = oct16550_term, + .putc = oct16550_putc, + .rxready = oct16550_rxready, + .getc = oct16550_getc, +}; + +static int +oct16550_probe (struct uart_bas *bas) +{ + u_char val; + + /* Check known 0 bits that don't depend on DLAB. */ + val = uart_getreg(bas, REG_IIR); + if (val & 0x30) + return (ENXIO); + val = uart_getreg(bas, REG_MCR); + if (val & 0xc0) + return (ENXIO); + val = uart_getreg(bas, REG_USR); + if (val & 0xe0) + return (ENXIO); + return (0); +} + +static void +oct16550_init (struct uart_bas *bas, int baudrate, int databits, int stopbits, + int parity) +{ + u_char ier; + + oct16550_param(bas, baudrate, databits, stopbits, parity); + + /* Disable all interrupt sources. */ + ier = uart_getreg(bas, REG_IER) & 0x0; + uart_setreg(bas, REG_IER, ier); + uart_barrier(bas); + + /* Disable the FIFO (if present). */ +// uart_setreg(bas, REG_FCR, 0); + uart_barrier(bas); + + /* Set RTS & DTR. */ + uart_setreg(bas, REG_MCR, MCR_RTS | MCR_DTR); + uart_barrier(bas); + + oct16550_clrint(bas); +} + +static void +oct16550_term (struct uart_bas *bas) +{ + + /* Clear RTS & DTR. */ + uart_setreg(bas, REG_MCR, 0); + uart_barrier(bas); +} + +static inline void oct16550_wait_txhr_empty (struct uart_bas *bas, int limit, int delay) +{ + while (((uart_getreg(bas, REG_LSR) & LSR_THRE) == 0) && + ((uart_getreg(bas, REG_USR) & USR_TXFIFO_NOTFULL) == 0)) + DELAY(delay); +} + +static void +oct16550_putc (struct uart_bas *bas, int c) +{ + int delay; + + /* 1/10th the time to transmit 1 character (estimate). */ + delay = oct16550_delay(bas); + oct16550_wait_txhr_empty(bas, 100, delay); + uart_setreg(bas, REG_DATA, c); + uart_barrier(bas); + oct16550_wait_txhr_empty(bas, 100, delay); +} + +static int +oct16550_rxready (struct uart_bas *bas) +{ + + return ((uart_getreg(bas, REG_LSR) & LSR_RXRDY) != 0 ? 1 : 0); +} + +static int +oct16550_getc (struct uart_bas *bas, struct mtx *hwmtx) +{ + int c, delay; + + uart_lock(hwmtx); + + /* 1/10th the time to transmit 1 character (estimate). */ + delay = oct16550_delay(bas); + + while ((uart_getreg(bas, REG_LSR) & LSR_RXRDY) == 0) { + uart_unlock(hwmtx); + DELAY(delay); + uart_lock(hwmtx); + } + + c = uart_getreg(bas, REG_DATA); + + uart_unlock(hwmtx); + + return (c); +} + +/* + * High-level UART interface. + */ +struct oct16550_softc { + struct uart_softc base; + uint8_t fcr; + uint8_t ier; + uint8_t mcr; +}; + +static int oct16550_bus_attach(struct uart_softc *); +static int oct16550_bus_detach(struct uart_softc *); +static int oct16550_bus_flush(struct uart_softc *, int); +static int oct16550_bus_getsig(struct uart_softc *); +static int oct16550_bus_ioctl(struct uart_softc *, int, intptr_t); +static int oct16550_bus_ipend(struct uart_softc *); +static int oct16550_bus_param(struct uart_softc *, int, int, int, int); +static int oct16550_bus_probe(struct uart_softc *); +static int oct16550_bus_receive(struct uart_softc *); +static int oct16550_bus_setsig(struct uart_softc *, int); +static int oct16550_bus_transmit(struct uart_softc *); + +static kobj_method_t oct16550_methods[] = { + KOBJMETHOD(uart_attach, oct16550_bus_attach), + KOBJMETHOD(uart_detach, oct16550_bus_detach), + KOBJMETHOD(uart_flush, oct16550_bus_flush), + KOBJMETHOD(uart_getsig, oct16550_bus_getsig), + KOBJMETHOD(uart_ioctl, oct16550_bus_ioctl), + KOBJMETHOD(uart_ipend, oct16550_bus_ipend), + KOBJMETHOD(uart_param, oct16550_bus_param), + KOBJMETHOD(uart_probe, oct16550_bus_probe), + KOBJMETHOD(uart_receive, oct16550_bus_receive), + KOBJMETHOD(uart_setsig, oct16550_bus_setsig), + KOBJMETHOD(uart_transmit, oct16550_bus_transmit), + { 0, 0 } +}; + +struct uart_class uart_oct16550_class = { + "oct16550 class", + oct16550_methods, + sizeof(struct oct16550_softc), + .uc_ops = &uart_oct16550_ops, + .uc_range = 8, + .uc_rclk = 0 +}; + +#define SIGCHG(c, i, s, d) \ + if (c) { \ + i |= (i & s) ? s : s | d; \ + } else { \ + i = (i & s) ? (i & ~s) | d : i; \ + } + +static int +oct16550_bus_attach (struct uart_softc *sc) +{ + struct oct16550_softc *oct16550 = (struct oct16550_softc*)sc; + struct uart_bas *bas; + int unit; + + unit = device_get_unit(sc->sc_dev); + bas = &sc->sc_bas; + + oct16550_drain(bas, UART_DRAIN_TRANSMITTER); + oct16550->mcr = uart_getreg(bas, REG_MCR); + oct16550->fcr = FCR_ENABLE | FCR_RX_HIGH; + uart_setreg(bas, REG_FCR, oct16550->fcr); + uart_barrier(bas); + oct16550_bus_flush(sc, UART_FLUSH_RECEIVER|UART_FLUSH_TRANSMITTER); + + if (oct16550->mcr & MCR_DTR) + sc->sc_hwsig |= SER_DTR; + if (oct16550->mcr & MCR_RTS) + sc->sc_hwsig |= SER_RTS; + oct16550_bus_getsig(sc); + + oct16550_clrint(bas); + oct16550->ier = uart_getreg(bas, REG_IER) & 0xf0; + oct16550->ier |= IER_EMSC | IER_ERLS | IER_ERXRDY; + uart_setreg(bas, REG_IER, oct16550->ier); + uart_barrier(bas); + + uint32_t status_bits = mips_rd_status(); + mips_wr_status(status_bits & ~MIPS_SR_INT_IE); + /* + * Enable the interrupt in CIU. // UART-x2 @ IP2 + */ + ciu_enable_interrupts(0, CIU_INT_0, CIU_EN_0, + (!unit) ? CIU_UART_BITS_UART0 : CIU_UART_BITS_UART1, CIU_MIPS_IP2); + return (0); +} + +static int +oct16550_bus_detach (struct uart_softc *sc) +{ + struct uart_bas *bas; + u_char ier; + + bas = &sc->sc_bas; + ier = uart_getreg(bas, REG_IER) & 0xf0; + uart_setreg(bas, REG_IER, ier); + uart_barrier(bas); + oct16550_clrint(bas); + return (0); +} + +static int +oct16550_bus_flush (struct uart_softc *sc, int what) +{ + struct oct16550_softc *oct16550 = (struct oct16550_softc*)sc; + struct uart_bas *bas; + int error; + + bas = &sc->sc_bas; + uart_lock(sc->sc_hwmtx); + if (sc->sc_rxfifosz > 1) { + oct16550_flush(bas, what); + uart_setreg(bas, REG_FCR, oct16550->fcr); + uart_barrier(bas); + error = 0; + } else + error = oct16550_drain(bas, what); + uart_unlock(sc->sc_hwmtx); + return (error); +} + +static int +oct16550_bus_getsig (struct uart_softc *sc) +{ + uint32_t new, old, sig; + uint8_t msr; + + do { + old = sc->sc_hwsig; + sig = old; + uart_lock(sc->sc_hwmtx); + msr = uart_getreg(&sc->sc_bas, REG_MSR); + uart_unlock(sc->sc_hwmtx); + SIGCHG(msr & MSR_DSR, sig, SER_DSR, SER_DDSR); + SIGCHG(msr & MSR_CTS, sig, SER_CTS, SER_DCTS); + SIGCHG(msr & MSR_DCD, sig, SER_DCD, SER_DDCD); + SIGCHG(msr & MSR_RI, sig, SER_RI, SER_DRI); + new = sig & ~SER_MASK_DELTA; + } while (!atomic_cmpset_32(&sc->sc_hwsig, old, new)); + return (sig); +} + +static int +oct16550_bus_ioctl (struct uart_softc *sc, int request, intptr_t data) +{ + struct uart_bas *bas; + int baudrate, divisor, error; + uint8_t efr, lcr; + + bas = &sc->sc_bas; + error = 0; + uart_lock(sc->sc_hwmtx); + switch (request) { + case UART_IOCTL_BREAK: + lcr = uart_getreg(bas, REG_LCR); + if (data) + lcr |= LCR_SBREAK; + else + lcr &= ~LCR_SBREAK; + uart_setreg(bas, REG_LCR, lcr); + uart_barrier(bas); + break; + case UART_IOCTL_IFLOW: + lcr = uart_getreg(bas, REG_LCR); + uart_barrier(bas); + uart_setreg(bas, REG_LCR, 0xbf); + uart_barrier(bas); + efr = uart_getreg(bas, REG_EFR); + if (data) + efr |= EFR_RTS; + else + efr &= ~EFR_RTS; + uart_setreg(bas, REG_EFR, efr); + uart_barrier(bas); + uart_setreg(bas, REG_LCR, lcr); + uart_barrier(bas); + break; + case UART_IOCTL_OFLOW: + lcr = uart_getreg(bas, REG_LCR); + uart_barrier(bas); + uart_setreg(bas, REG_LCR, 0xbf); + uart_barrier(bas); + efr = uart_getreg(bas, REG_EFR); + if (data) + efr |= EFR_CTS; + else + efr &= ~EFR_CTS; + uart_setreg(bas, REG_EFR, efr); + uart_barrier(bas); + uart_setreg(bas, REG_LCR, lcr); + uart_barrier(bas); + break; + case UART_IOCTL_BAUD: + lcr = uart_getreg(bas, REG_LCR); + uart_setreg(bas, REG_LCR, lcr | LCR_DLAB); + uart_barrier(bas); + divisor = uart_getreg(bas, REG_DLL) | + (uart_getreg(bas, REG_DLH) << 8); + uart_barrier(bas); + uart_setreg(bas, REG_LCR, lcr); + uart_barrier(bas); + baudrate = (divisor > 0) ? bas->rclk / divisor / 16 : 0; + delay_changed = 1; + if (baudrate > 0) + *(int*)data = baudrate; + else + error = ENXIO; + break; + default: + error = EINVAL; + break; + } + uart_unlock(sc->sc_hwmtx); + return (error); +} + + +static int +oct16550_bus_ipend(struct uart_softc *sc) +{ + struct uart_bas *bas; + int ipend = 0; + uint8_t iir, lsr; + + bas = &sc->sc_bas; + uart_lock(sc->sc_hwmtx); + + iir = uart_getreg(bas, REG_IIR) & IIR_IMASK; + if (iir != IIR_NOPEND) { + + if (iir == IIR_RLS) { + lsr = uart_getreg(bas, REG_LSR); + if (lsr & LSR_OE) + ipend |= SER_INT_OVERRUN; + if (lsr & LSR_BI) + ipend |= SER_INT_BREAK; + if (lsr & LSR_RXRDY) + ipend |= SER_INT_RXREADY; + + } else if (iir == IIR_RXRDY) { + ipend |= SER_INT_RXREADY; + + } else if (iir == IIR_RXTOUT) { + ipend |= SER_INT_RXREADY; + + } else if (iir == IIR_TXRDY) { + ipend |= SER_INT_TXIDLE; + + } else if (iir == IIR_MLSC) { + ipend |= SER_INT_SIGCHG; + + } else if (iir == IIR_BUSY) { + (void) uart_getreg(bas, REG_USR); + } + } + uart_unlock(sc->sc_hwmtx); + +//#define OCTEON_VISUAL_UART 1 +#ifdef OCTEON_VISUAL_UART + static int where1 = 0; + + if (ipend) octeon_led_run_wheel(&where1, 6 + device_get_unit(sc->sc_dev)); +#endif + + return ((sc->sc_leaving) ? 0 : ipend); +} + + + + +static int +oct16550_bus_param (struct uart_softc *sc, int baudrate, int databits, + int stopbits, int parity) +{ + struct uart_bas *bas; + int error; + + bas = &sc->sc_bas; + uart_lock(sc->sc_hwmtx); + error = oct16550_param(bas, baudrate, databits, stopbits, parity); + uart_unlock(sc->sc_hwmtx); + return (error); +} + +static int +oct16550_bus_probe (struct uart_softc *sc) +{ + struct uart_bas *bas; + int error; + + bas = &sc->sc_bas; + bas->rclk = uart_oct16550_class.uc_rclk = octeon_cpu_clock; + + error = oct16550_probe(bas); + if (error) { + return (error); + } + + uart_setreg(bas, REG_MCR, (MCR_DTR | MCR_RTS)); + + /* + * Enable FIFOs. And check that the UART has them. If not, we're + * done. Since this is the first time we enable the FIFOs, we reset + * them. + */ + oct16550_drain(bas, UART_DRAIN_TRANSMITTER); +#define ENABLE_OCTEON_FIFO 1 +#ifdef ENABLE_OCTEON_FIFO + uart_setreg(bas, REG_FCR, FCR_ENABLE | FCR_XMT_RST | FCR_RCV_RST); +#endif + uart_barrier(bas); + + oct16550_flush(bas, UART_FLUSH_RECEIVER|UART_FLUSH_TRANSMITTER); + + if (device_get_unit(sc->sc_dev)) { + device_set_desc(sc->sc_dev, "Octeon-16550 channel 1"); + } else { + device_set_desc(sc->sc_dev, "Octeon-16550 channel 0"); + } +#ifdef ENABLE_OCTEON_FIFO + sc->sc_rxfifosz = 64; + sc->sc_txfifosz = 64; +#else + sc->sc_rxfifosz = 1; + sc->sc_txfifosz = 1; +#endif + + +#if 0 + /* + * XXX there are some issues related to hardware flow control and + * it's likely that uart(4) is the cause. This basicly needs more + * investigation, but we avoid using for hardware flow control + * until then. + */ + /* 16650s or higher have automatic flow control. */ + if (sc->sc_rxfifosz > 16) { + sc->sc_hwiflow = 1; + sc->sc_hwoflow = 1; + } +#endif + + return (0); +} + +static int +oct16550_bus_receive (struct uart_softc *sc) +{ + struct uart_bas *bas; + int xc; + uint8_t lsr; + + bas = &sc->sc_bas; + uart_lock(sc->sc_hwmtx); + lsr = uart_getreg(bas, REG_LSR); + + while (lsr & LSR_RXRDY) { + if (uart_rx_full(sc)) { + sc->sc_rxbuf[sc->sc_rxput] = UART_STAT_OVERRUN; + break; + } + xc = uart_getreg(bas, REG_DATA); + if (lsr & LSR_FE) + xc |= UART_STAT_FRAMERR; + if (lsr & LSR_PE) + xc |= UART_STAT_PARERR; + uart_rx_put(sc, xc); + lsr = uart_getreg(bas, REG_LSR); + } + /* Discard everything left in the Rx FIFO. */ + /* + * First do a dummy read/discard anyway, in case the UART was lying to us. + * This problem was seen on board, when IIR said RBR, but LSR said no RXRDY + * Results in a stuck ipend loop. + */ + (void)uart_getreg(bas, REG_DATA); + while (lsr & LSR_RXRDY) { + (void)uart_getreg(bas, REG_DATA); + uart_barrier(bas); + lsr = uart_getreg(bas, REG_LSR); + } + uart_unlock(sc->sc_hwmtx); + return (0); +} + +static int +oct16550_bus_setsig (struct uart_softc *sc, int sig) +{ + struct oct16550_softc *oct16550 = (struct oct16550_softc*)sc; + struct uart_bas *bas; + uint32_t new, old; + + bas = &sc->sc_bas; + do { + old = sc->sc_hwsig; + new = old; + if (sig & SER_DDTR) { + SIGCHG(sig & SER_DTR, new, SER_DTR, + SER_DDTR); + } + if (sig & SER_DRTS) { + SIGCHG(sig & SER_RTS, new, SER_RTS, + SER_DRTS); + } + } while (!atomic_cmpset_32(&sc->sc_hwsig, old, new)); + uart_lock(sc->sc_hwmtx); + oct16550->mcr &= ~(MCR_DTR|MCR_RTS); + if (new & SER_DTR) + oct16550->mcr |= MCR_DTR; + if (new & SER_RTS) + oct16550->mcr |= MCR_RTS; + uart_setreg(bas, REG_MCR, oct16550->mcr); + uart_barrier(bas); + uart_unlock(sc->sc_hwmtx); + return (0); +} + +static int +oct16550_bus_transmit (struct uart_softc *sc) +{ + struct oct16550_softc *oct16550 = (struct oct16550_softc*)sc; + struct uart_bas *bas; + int i; + + bas = &sc->sc_bas; + uart_lock(sc->sc_hwmtx); +#ifdef NO_UART_INTERRUPTS + for (i = 0; i < sc->sc_txdatasz; i++) { + oct16550_putc(bas, sc->sc_txbuf[i]); + } +#else + + oct16550_wait_txhr_empty(bas, 100, oct16550_delay(bas)); + uart_setreg(bas, REG_IER, oct16550->ier | IER_ETXRDY); + uart_barrier(bas); + + for (i = 0; i < sc->sc_txdatasz; i++) { + uart_setreg(bas, REG_DATA, sc->sc_txbuf[i]); + uart_barrier(bas); + } + sc->sc_txbusy = 1; +#endif + uart_unlock(sc->sc_hwmtx); + return (0); +} diff --git a/sys/mips/conf/ADM5120 b/sys/mips/conf/ADM5120 index fc6b679201a9..a834c16b5141 100644 --- a/sys/mips/conf/ADM5120 +++ b/sys/mips/conf/ADM5120 @@ -25,7 +25,6 @@ makeoptions MIPS_LITTLE_ENDIAN=defined # Don't build any modules yet. makeoptions MODULES_OVERRIDE="" -options KERNVIRTADDR=0x80100000 include "../adm5120/std.adm5120" hints "ADM5120.hints" #Default places to look for devices. @@ -55,6 +54,7 @@ options BOOTP_COMPAT options ROOTDEVNAME=\"nfs:10.0.0.1:/mnt/bsd\" # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver options INVARIANTS #Enable calls of extra sanity checking options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/mips/conf/ALCHEMY b/sys/mips/conf/ALCHEMY new file mode 100644 index 000000000000..8fa6070da56f --- /dev/null +++ b/sys/mips/conf/ALCHEMY @@ -0,0 +1,67 @@ +# ALCHEMY -- Generic kernel for Alchemy Au1xxx CPUs. +# +# For more information on this file, please read the handbook section on +# Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +ident ALCHEMY + +makeoptions ARCH_FLAGS=-march=mips32 +makeoptions MIPS_LITTLE_ENDIAN=defined + +# Don't build any modules yet. +makeoptions MODULES_OVERRIDE="" + +include "../alchemy/std.alchemy" + +#hints "ALCHEMY.hints" #Default places to look for devices. + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols + +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +options NFSCLIENT #Network Filesystem Client +options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options PSEUDOFS #Pseudo-filesystem framework +# options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions + +options BOOTP +options BOOTP_NFSROOT +options BOOTP_NFSV3 +options BOOTP_WIRED_TO=admsw0 +options BOOTP_COMPAT + +# options FFS #Berkeley Fast Filesystem +# options SOFTUPDATES #Enable FFS soft updates support +# options UFS_ACL #Support for access control lists +# options UFS_DIRHASH #Improve performance on big directories +options ROOTDEVNAME=\"nfs:10.0.0.1:/mnt/bsd\" + + +# Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver +options INVARIANTS #Enable calls of extra sanity checking +options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed + +device loop +device ether +device uart +# device md diff --git a/sys/mips/conf/AR71XX b/sys/mips/conf/AR71XX new file mode 100644 index 000000000000..30126bf8040e --- /dev/null +++ b/sys/mips/conf/AR71XX @@ -0,0 +1,89 @@ +# +# AR71XX -- Kernel configuration file for FreeBSD/mips for Atheros 71xx systems +# +# $FreeBSD$ +# + +ident AR71XX +cpu CPU_MIPS4KC +options ISA_MIPS32 +makeoptions TARGET_BIG_ENDIAN +makeoptions KERNLOADADDR=0x80050000 +options HZ=1000 + +files "../atheros/files.ar71xx" +hints "AR71XX.hints" + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols +makeoptions MODULES_OVERRIDE="" + +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +options NFSCLIENT #Network Filesystem Client +options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options PSEUDOFS #Pseudo-filesystem framework +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions + +# options NFS_LEGACYRPC +# Debugging for use in -current +# options DEADLKRES +# options INVARIANTS +# options INVARIANT_SUPPORT +# options WITNESS +# options WITNESS_SKIPSPIN +options FFS #Berkeley Fast Filesystem +options SOFTUPDATES #Enable FFS soft updates support +options UFS_ACL #Support for access control lists +options UFS_DIRHASH #Improve performance on big directories + + +options BOOTP +options BOOTP_NFSROOT +options BOOTP_NFSV3 +options BOOTP_WIRED_TO=arge0 +options BOOTP_COMPAT +options ROOTDEVNAME=\"nfs:192.168.10.1:/mnt/bsd\" + +device pci + +# Wireless NIC cards +options IEEE80211_DEBUG +options IEEE80211_SUPPORT_MESH +options IEEE80211_SUPPORT_TDMA +device wlan # 802.11 support +device wlan_wep # 802.11 WEP support +device wlan_ccmp # 802.11 CCMP support +device wlan_tkip # 802.11 TKIP support + +device ath # Atheros pci/cardbus NIC's +options ATH_DEBUG +device ath_hal +option AH_SUPPORT_AR5416 +device ath_rate_sample + +device mii +device arge + +# device usb +# options USB_EHCI_BIG_ENDIAN_DESC # handle big-endian byte order +# options USB_DEBUG +# device ehci + +device spibus +device ar71xx_spi +device mx25l +# device geom_redboot + +device ar71xx_wdog + +device uart + +device loop +device ether +device md +device bpf +device random +device if_bridge diff --git a/sys/mips/conf/AR71XX.hints b/sys/mips/conf/AR71XX.hints new file mode 100644 index 000000000000..c68d6bc8efcf --- /dev/null +++ b/sys/mips/conf/AR71XX.hints @@ -0,0 +1,65 @@ +# $FreeBSD$ +hint.apb.0.at="nexus0" +hint.apb.0.irq=4 + +# uart0 +hint.uart.0.at="apb0" +# see atheros/uart_cpu_ar71xx.c why +3 +hint.uart.0.maddr=0x18020003 +hint.uart.0.msize=0x18 +hint.uart.0.irq=3 + +#ohci +hint.ohci.0.at="apb0" +hint.ohci.0.maddr=0x1c000000 +hint.ohci.0.msize=0x01000000 +hint.ohci.0.irq=6 + +#ehci +hint.ehci.0.at="nexus0" +hint.ehci.0.maddr=0x1b000000 +hint.ehci.0.msize=0x01000000 +hint.ehci.0.irq=1 + +# pci +hint.pcib.0.at="nexus0" +hint.pcib.0.irq=0 + +hint.arge.0.at="nexus0" +hint.arge.0.maddr=0x19000000 +hint.arge.0.msize=0x1000 +hint.arge.0.irq=2 +# PHY4 = 1 << 4 +hint.arge.0.phymask=0x10 +# Uncomment this hint for RS (not PRO) +# PHY20 = 1 << 20 +# hint.arge.0.phymask=0x100000 + +hint.arge.1.at="nexus0" +hint.arge.1.maddr=0x1a000000 +hint.arge.1.msize=0x1000 +hint.arge.1.irq=3 +# PHY1, PHY2, PHY3 +hint.arge.1.phymask=0x0e +# should be 100 for RS +hint.arge.1.media=1000 +hint.arge.1.fduplex=1 +# Uncomment this hint for RS (not PRO) +# hint.arge.0.phymask=70000 + +# SPI flash +hint.spi.0.at="nexus0" +hint.spi.0.maddr=0x1f000000 +hint.spi.0.msize=0x10 + +hint.mx25l.0.at="spibus0" +hint.mx25l.0.cs=0 + +# shares the same bus with mx25l. +# CE low for flash, CE high for RTC +# at the moment it's just stub until SPI bus is ready for such hacks +# hint.rtc.0.at="spibus0" +# hint.rtc.0.cs=0 + +# Watchdog +hint.ar71xx_wdog.0.at="nexus0" diff --git a/sys/mips/conf/IDT b/sys/mips/conf/IDT index 3082d1c1a650..d0e33d1f1575 100644 --- a/sys/mips/conf/IDT +++ b/sys/mips/conf/IDT @@ -27,6 +27,7 @@ options BOOTP_WIRED_TO=kr0 options BOOTP_COMPAT # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver options INVARIANTS #Enable calls of extra sanity checking options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS diff --git a/sys/mips/conf/MALTA b/sys/mips/conf/MALTA index d4ce4461651d..77e072cb3045 100644 --- a/sys/mips/conf/MALTA +++ b/sys/mips/conf/MALTA @@ -21,18 +21,20 @@ ident MALTA #makeoptions ARCH_FLAGS=-march=mips32 makeoptions MIPS_LITTLE_ENDIAN=defined +makeoptions KERNLOADADDR=0x80100000 options YAMON # Don't build any modules yet. makeoptions MODULES_OVERRIDE="" -options KERNVIRTADDR=0x80100000 options TICK_USE_YAMON_FREQ=defined #options TICK_USE_MALTA_RTC=defined include "../malta/std.malta" +options ISA_MIPS32 + hints "MALTA.hints" #Default places to look for devices. makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols @@ -55,6 +57,7 @@ options ROOTDEVNAME=\"ufs:ad0s1a\" # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver options INVARIANTS #Enable calls of extra sanity checking options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/mips/conf/MALTA64 b/sys/mips/conf/MALTA64 new file mode 100644 index 000000000000..e7f01c7093bb --- /dev/null +++ b/sys/mips/conf/MALTA64 @@ -0,0 +1,72 @@ +# MALTA -- Kernel config for MALTA boards +# +# For more information on this file, please read the handbook section on +# Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +ident MALTA + +makeoptions ARCH_FLAGS="-march=mips64 -mabi=64" +makeoptions MIPS_LITTLE_ENDIAN=defined +makeoptions TARGET_64BIT=t +makeoptions LDSCRIPT_NAME= ldscript.mips.mips64 + +options YAMON + +# Don't build any modules yet. +makeoptions MODULES_OVERRIDE="" + +options TICK_USE_YAMON_FREQ=defined +#options TICK_USE_MALTA_RTC=defined + +include "../malta/std.malta" + +options ISA_MIPS64 + +hints "MALTA.hints" #Default places to look for devices. + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols + +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +options NFSCLIENT #Network Filesystem Client +options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options PSEUDOFS #Pseudo-filesystem framework +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions + +options FFS #Berkeley Fast Filesystem +options SOFTUPDATES #Enable FFS soft updates support +options UFS_ACL #Support for access control lists +options UFS_DIRHASH #Improve performance on big directories +options ROOTDEVNAME=\"ufs:ad0s1a\" + + +# Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver +options INVARIANTS #Enable calls of extra sanity checking +options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed + +device loop +device ether +device le +device miibus +device md +device uart diff --git a/sys/mips/conf/OCTEON1 b/sys/mips/conf/OCTEON1 new file mode 100644 index 000000000000..b3268238b6af --- /dev/null +++ b/sys/mips/conf/OCTEON1 @@ -0,0 +1,97 @@ +# OCTEON1 -- Configuration kernel for all Octeon1 SoCs from Cavium Networks +# +# For more information on this file, please read the handbook section on +# Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +############################################################################## +### ### +### PLEASE NOTE: This file is the experimental 64-bit kernel. If you want ### +### a stable kernel, please use the 32-bit OCTEON1-32 instead. ### +### ### +############################################################################## + +machine mips +cpu CPU_MIPS4KC +ident OCTEON1 + +makeoptions ARCH_FLAGS="-march=mips64 -mabi=64" +makeoptions LDSCRIPT_NAME=ldscript.mips.octeon1.64 + +# Don't build any modules yet. +makeoptions MODULES_OVERRIDE="" +makeoptions TARGET_BIG_ENDIAN=defined +makeoptions TARGET_64BIT=defined +makeoptions KERNLOADADDR=0xffffffff80100000 + +include "../cavium/std.octeon1" + +hints "OCTEON1.hints" #Default places to look for devices. + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols + +#XXXimp: Need to make work with 64-bit too +options ISA_MIPS64 + +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +options NFSCLIENT #Network Filesystem Client +#options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options PSEUDOFS #Pseudo-filesystem framework +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions +#options ROOTDEVNAME=\"ufs:ad0s1a\" # Original +options NO_SWAPPING + + +options FFS #Berkeley Fast Filesystem +options SOFTUPDATES #Enable FFS soft updates support +options UFS_ACL #Support for access control lists +options UFS_DIRHASH #Improve performance on big directories + + +# Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver +options INVARIANTS #Enable calls of extra sanity checking +options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed + +#XXXimp device genclock +device loop +device ether +device md +device uart +nodevice uart_ns8250 +device rgmii +#options VERBOSE_SYSINIT + + +# +# Use the following for Compact Flash file-system +device cf +options ROOTDEVNAME = \"ufs:cf0s2\" # Unmask if compact flash is needed as RFS + +# +# Use the following for RFS in mem-device +#options MD_ROOT +#options ROOTDEVNAME = \"ufs:md0\" + +#options MD_ROOT_SIZE = 21264 +#XXX: Bring up UP first, then generalize. +#options SMP diff --git a/sys/mips/conf/OCTEON1-32 b/sys/mips/conf/OCTEON1-32 new file mode 100644 index 000000000000..7962a0662b51 --- /dev/null +++ b/sys/mips/conf/OCTEON1-32 @@ -0,0 +1,86 @@ +# OCTEON1 -- Configuration kernel for all Octeon1 SoCs from Cavium Networks +# +# For more information on this file, please read the handbook section on +# Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +machine mips +cpu CPU_MIPS4KC +ident OCTEON1 + +# Don't build any modules yet. +makeoptions MODULES_OVERRIDE="" +makeoptions TARGET_BIG_ENDIAN=defined +makeoptions LDSCRIPT_NAME=ldscript.mips.octeon1.32 + +makeoptions KERNLOADADDR=0x81000000 +include "../cavium/std.octeon1" + +hints "OCTEON1.hints" #Default places to look for devices. + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols + +options ISA_MIPS32 + +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +options NFSCLIENT #Network Filesystem Client +#options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options PSEUDOFS #Pseudo-filesystem framework +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions +#options ROOTDEVNAME=\"ufs:ad0s1a\" # Original +options NO_SWAPPING + + +options FFS #Berkeley Fast Filesystem +options SOFTUPDATES #Enable FFS soft updates support +options UFS_ACL #Support for access control lists +options UFS_DIRHASH #Improve performance on big directories + + +# Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver +options INVARIANTS #Enable calls of extra sanity checking +options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed + +#XXXimp device genclock +device loop +device ether +device md +device uart +nodevice uart_ns8250 +device rgmii +#options VERBOSE_SYSINIT + + +# +# Use the following for Compact Flash file-system +device cf +options ROOTDEVNAME = \"ufs:cf0s2a\" # Unmask if compact flash is needed as RFS + +# +# Use the following for RFS in mem-device +#options MD_ROOT +#options ROOTDEVNAME = \"ufs:md0\" + +#options MD_ROOT_SIZE = 21264 +#XXX: Bring up UP first, then generalize. +#options SMP diff --git a/sys/mips/conf/OCTEON1.hints b/sys/mips/conf/OCTEON1.hints new file mode 100644 index 000000000000..ed705a9252e9 --- /dev/null +++ b/sys/mips/conf/OCTEON1.hints @@ -0,0 +1,13 @@ +# $FreeBSD$ +# device.hints +# All these values are complete nonsense... +hw.uart.console="io:0x1" +hint.obio.0.at="nexus" +hint.obio.0.maddr="0x1" +hint.obio.0.msize="0x1" +hint.obio.0.flags="0x1" +hint.uart.0.at="obio" +hint.uart.0.maddr="0x1" +hint.uart.0.flags="0x1" +hint.pcib.0.at="nexus" +hint.pci.0.at="pcib" diff --git a/sys/mips/conf/QEMU b/sys/mips/conf/QEMU index 64a33aee57d6..ebb09f865762 100644 --- a/sys/mips/conf/QEMU +++ b/sys/mips/conf/QEMU @@ -27,11 +27,8 @@ makeoptions ARCH_FLAGS=-march=mips32 # Don't build any modules yet. makeoptions MODULES_OVERRIDE="" -options KERNVIRTADDR=0x80100000 include "../adm5120/std.adm5120" -#hints "GENERIC.hints" #Default places to look for devices. - makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols options DDB @@ -45,6 +42,7 @@ options PSEUDOFS #Pseudo-filesystem framework options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions # Debugging for use in -current +#options DEADLKRES #Enable the deadlock resolver #options INVARIANTS #Enable calls of extra sanity checking #options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS #Enable checks to detect deadlocks and cycles diff --git a/sys/mips/conf/SENTRY5 b/sys/mips/conf/SENTRY5 index bc2438a7228e..a4e32c07d837 100644 --- a/sys/mips/conf/SENTRY5 +++ b/sys/mips/conf/SENTRY5 @@ -26,9 +26,8 @@ ident SENTRY5 cpu CPU_MIPS4KC -options CPU_NOFPU options ISA_MIPS32 -options CPU_SENTRY5 # XXX should this be a +options CPU_SENTRY5 # XXX should this be a # sub-cpu option? # XXX only siba should be hardwired for now; we will use @@ -37,50 +36,44 @@ files "../sentry5/files.sentry5" hints "SENTRY5.hints" # sentry5 normally ships with cfe firmware; use the console for now -options CFE -options CFE_CONSOLE -options ALT_BREAK_TO_DEBUGGER - -# cfe loader expects kernel at 0x80001000 for mips32 w/o backwards -# offsets in the linked elf image (see ldscript hack) -# XXX can we conditionalize the linker stuff on options CFE? -options KERNVIRTADDR=0x80001000 - -makeoptions LDSCRIPT_NAME= ldscript.mips.cfe +options CFE +options CFE_CONSOLE +options ALT_BREAK_TO_DEBUGGER #makeoptions ARCH_FLAGS=-march=mips32 makeoptions MIPS_LITTLE_ENDIAN=defined makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols makeoptions MODULES_OVERRIDE="" -options DDB -options KDB +options DDB +options KDB -options SCHED_4BSD #4BSD scheduler -options INET #InterNETworking -options NFSCLIENT #Network Filesystem Client -options NFS_ROOT #NFS usable as /, requires NFSCLIENT -options PSEUDOFS #Pseudo-filesystem framework -options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +options NFSCLIENT #Network Filesystem Client +options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options PSEUDOFS #Pseudo-filesystem framework +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions # Debugging for use in -current -options INVARIANTS -options INVARIANT_SUPPORT +#options DEADLKRES +options INVARIANTS +options INVARIANT_SUPPORT -#options BUS_DEBUG +#options BUS_DEBUG #makeoptions BUS_DEBUG device siba # Sonics SiliconBackplane device pci # siba_pcib -device bfe # XXX will build both pci and siba -device miibus # attachments +# device bfe # XXX will build both pci and siba +# device miibus # attachments # pci devices # notyet: #device ath # in pci slot #device ath_hal # pci chip support -#options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors +#options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors device usb # USB Bus (required) device uhci # UHCI PCI->USB interface diff --git a/sys/mips/conf/SWARM b/sys/mips/conf/SWARM new file mode 100644 index 000000000000..3189bcbcb9c1 --- /dev/null +++ b/sys/mips/conf/SWARM @@ -0,0 +1,76 @@ +# +# $FreeBSD$ +# + +ident SWARM +options CPU_SB1 + +files "../sibyte/files.sibyte" +hints "SWARM.hints" + +# +# 32-bit kernel cannot deal with physical memory beyond 4GB +# XXX pmap assumes that all the memory can be mapped using KSEG0 +# +options MAXMEM=512*1024 + +options CFE +options CFE_CONSOLE +options CFE_ENV +options ALT_BREAK_TO_DEBUGGER + +makeoptions LDSCRIPT_NAME= ldscript.mips.cfe + +#cpu CPU_MIPS64 +#options ISA_MIPS64 +#makeoptions ARCH_FLAGS="-march=mips64 -mgp64 -mabi=o64" +cpu CPU_MIPS32 +options ISA_MIPS32 +makeoptions ARCH_FLAGS="-march=mips32" + +makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols +makeoptions MODULES_OVERRIDE="" + +options DDB +options KDB + +options SCHED_4BSD #4BSD scheduler +options INET #InterNETworking +options NFSCLIENT #Network Filesystem Client +options NFS_ROOT #NFS usable as /, requires NFSCLIENT +options PSEUDOFS #Pseudo-filesystem framework +options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions + +# Debugging for use in -current +#options DEADLKRES +options INVARIANTS +options INVARIANT_SUPPORT +options WITNESS + +options FFS #Fast filesystem + +options KTRACE + +device pci +device miibus +device bge +device loop +device ether +device md +device random + +options USB_DEBUG +device usb +device ohci +device uhci +device ehci + +device umass + +device scbus +device da + +device ata +device atadisk +device atapicd +options ATA_STATIC_ID diff --git a/sys/mips/conf/SWARM.hints b/sys/mips/conf/SWARM.hints new file mode 100644 index 000000000000..00465ad41be9 --- /dev/null +++ b/sys/mips/conf/SWARM.hints @@ -0,0 +1,17 @@ +# $FreeBSD$ +hint.zbbus.0.at="nexus0" +hint.zbpci.0.at="zbbus0" +hint.scd.0.at="zbbus0" + +# +# SWARM IDE interface is on the generic bus at chip select 4. +# The CS4 region is 64KB in size and starts at 0x100B0000. +# The IDE interrupt is wired to GPIO4 (intsrc 36 to the interrupt mapper) +# +hint.ata.0.at="zbbus0" +hint.ata.0.maddr=0x100B0000 +hint.ata.0.msize=0x10000 +hint.ata.0.irq=36 +#hint.ata.0.disabled=0 +#hint.ata.0.regoffset=0x1F0 +#hint.ata.0.regshift=5 diff --git a/sys/mips/conf/SWARM_SMP b/sys/mips/conf/SWARM_SMP new file mode 100644 index 000000000000..ec76ce4ac173 --- /dev/null +++ b/sys/mips/conf/SWARM_SMP @@ -0,0 +1,7 @@ +# +# $FreeBSD$ +# +options SMP +options PRINTF_BUFR_SIZE=128 + +include SWARM diff --git a/sys/mips/conf/XLR b/sys/mips/conf/XLR new file mode 100644 index 000000000000..d743c1b33f0d --- /dev/null +++ b/sys/mips/conf/XLR @@ -0,0 +1,158 @@ +#################################RMI_BSD##################################### +# Copyright (c) 2003-2009 RMI Corporation +# 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. +# 3. Neither the name of RMI Corporation, 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 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. +#################################RMI_BSD##################################### +# XLR -- Generic kernel configuration file for FreeBSD/mips +# +# For more information on this file, please read the handbook section on +# Kernel Configuration Files: +# +# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html +# +# The handbook is also available locally in /usr/share/doc/handbook +# if you've installed the doc distribution, otherwise always see the +# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the +# latest information. +# +# An exhaustive list of options and more detailed explanations of the +# device lines is also present in the ../../conf/NOTES and NOTES files. +# If you are in doubt as to the purpose or necessity of a line, check first +# in NOTES. +# +# $FreeBSD$ + +machine mips +cpu CPU_MIPS4KC +ident XLR + +makeoptions MODULES_OVERRIDE="" +makeoptions TARGET_BIG_ENDIAN +# + +include "../rmi/std.xlr" + + +makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols +#profile 2 + +#options SCHED_ULE # ULE scheduler +#options VERBOSE_SYSINIT +options SCHED_4BSD # 4BSD scheduler +#options PREEMPTION # Enable kernel thread preemption +#options FULL_PREEMPTION # Enable kernel thread preemption +options INET # InterNETworking +options INET6 # IPv6 communications protocols +options FFS # Berkeley Fast Filesystem +#options SOFTUPDATES # Enable FFS soft updates support +options UFS_ACL # Support for access control lists +options UFS_DIRHASH # Improve performance on big directories +options NFSCLIENT +options NFS_ROOT +# +options BOOTP +options BOOTP_NFSROOT +options BOOTP_NFSV3 +options BOOTP_WIRED_TO=rge0 +options BOOTP_COMPAT +options ROOTDEVNAME=\"nfs:10.1.1.8:/usr/extra/nfsroot\" +# +#options MD_ROOT # MD is a potential root device +#options MD_ROOT_SIZE=27000 +#options MD_ROOT_SIZE=5120 +#options ROOTDEVNAME=\"ufs:md0\" +options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions +options HZ=1000 +options NO_SWAPPING + +#Debugging options +options KTRACE # ktrace(1) support +options DDB +options KDB +options GDB +options ALT_BREAK_TO_DEBUGGER +#options DEADLKRES #Enable the deadlock resolver +options INVARIANTS #Enable calls of extra sanity checking +options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS #Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN #Don't run witness on spinlocks for speed +#options KTR # ktr(4) and ktrdump(8) support +#options KTR_COMPILE=(KTR_LOCK|KTR_PROC|KTR_INTR|KTR_CALLOUT|KTR_UMA|KTR_SYSC|KTR_CRITICAL) +#options KTR_ENTRIES=131072 +#options MUTEX_DEBUG +#options MUTEX_PROFILING + +device pci +#device ata +#device atadisk +#options XLR_PERFMON # Enable XLR processor activity monitoring +options BREAK_TO_DEBUGGER +#device genclock +device uart +# Pseudo +device loop +device random +device md +device mem +device pty +device bpf + +# Network +device miibus +device rge +device ether +device re +device msk + +device da +device scbus +#device ohci # OHCI PCI->USB interface +device ehci # EHCI PCI->USB interface (USB 2.0) +device usb # USB Bus (required) +#device udbp # USB Double Bulk Pipe devices +#device ugen # Generic +#device uhid # "Human Interface Devices" +device umass # Disks/Mass storage - Requires scbus and da + +#device cfi + +#i2c +# Not yet +#device ic +#device iic +#device iicbb +#device iicbus +#device xlr_rtc +#device xlr_temperature +#device xlr_eeprom + +#crypto +# Not yet +#device cryptodev +#device crypto +#device rmisec +options ISA_MIPS32 +makeoptions KERNLOADADDR=0x80100000 diff --git a/sys/mips/idt/files.idt b/sys/mips/idt/files.idt index 4148ac4a6aa6..09b9959c1226 100644 --- a/sys/mips/idt/files.idt +++ b/sys/mips/idt/files.idt @@ -6,3 +6,5 @@ mips/idt/if_kr.c optional kr mips/idt/obio.c standard mips/idt/uart_cpu_rc32434.c optional uart mips/idt/uart_bus_rc32434.c optional uart +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard diff --git a/sys/mips/idt/idt_machdep.c b/sys/mips/idt/idt_machdep.c index 040c3f90a042..0dfee6633341 100644 --- a/sys/mips/idt/idt_machdep.c +++ b/sys/mips/idt/idt_machdep.c @@ -75,6 +75,12 @@ __FBSDID("$FreeBSD$"); extern int *edata; extern int *end; +void +platform_cpu_init() +{ + /* Nothing special */ +} + void platform_halt(void) { @@ -128,9 +134,14 @@ platform_start(__register_t a0, __register_t a1, /* clear the BSS and SBSS segments */ - kernend = round_page((vm_offset_t)&end); + kernend = (vm_offset_t)&end; memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + mips_postboot_fixup(); + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + /* * Looking for mem=XXM argument */ @@ -153,7 +164,7 @@ platform_start(__register_t a0, __register_t a1, } /* phys_avail regions are in bytes */ - phys_avail[0] = MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); + phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); physmem = realmem; @@ -182,7 +193,9 @@ platform_start(__register_t a0, __register_t a1, pmap_bootstrap(); mips_proc0_init(); mutex_init(); -#ifdef DDB kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); #endif } diff --git a/sys/mips/idt/obio.c b/sys/mips/idt/obio.c index 893e88321bdd..44e9bfa6ea44 100644 --- a/sys/mips/idt/obio.c +++ b/sys/mips/idt/obio.c @@ -76,8 +76,10 @@ static int obio_setup_intr(device_t, device_t, struct resource *, int, static int obio_teardown_intr(device_t, device_t, struct resource *, void *); -static void obio_mask_irq(unsigned int irq) +static void +obio_mask_irq(void *arg) { + unsigned int irq = (unsigned int)arg; int ip_bit, mask, mask_register; /* mask IRQ */ @@ -88,8 +90,10 @@ static void obio_mask_irq(unsigned int irq) ICU_REG_WRITE(mask_register, mask | ip_bit); } -static void obio_unmask_irq(unsigned int irq) +static void +obio_unmask_irq(void *arg) { + unsigned int irq = (unsigned int)arg; int ip_bit, mask, mask_register; /* unmask IRQ */ @@ -274,7 +278,7 @@ obio_setup_intr(device_t dev, device_t child, struct resource *ires, event = sc->sc_eventstab[irq]; if (event == NULL) { error = intr_event_create(&event, (void *)irq, 0, irq, - (mask_fn)obio_mask_irq, (mask_fn)obio_unmask_irq, + obio_mask_irq, obio_unmask_irq, NULL, NULL, "obio intr%d:", irq); diff --git a/sys/mips/idt/uart_bus_rc32434.c b/sys/mips/idt/uart_bus_rc32434.c index 35e937d6ce70..40e47705fc07 100644 --- a/sys/mips/idt/uart_bus_rc32434.c +++ b/sys/mips/idt/uart_bus_rc32434.c @@ -88,10 +88,10 @@ uart_rc32434_probe(device_t dev) sc->sc_class = &uart_ns8250_class; bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); sc->sc_sysdev->bas.regshft = 2; - sc->sc_sysdev->bas.bst = 0; + sc->sc_sysdev->bas.bst = mips_bus_space_generic; sc->sc_sysdev->bas.bsh = MIPS_PHYS_TO_KSEG1(IDT_BASE_UART0); sc->sc_bas.regshft = 2; - sc->sc_bas.bst = 0; + sc->sc_bas.bst = mips_bus_space_generic; sc->sc_bas.bsh = MIPS_PHYS_TO_KSEG1(IDT_BASE_UART0); return (uart_bus_probe(dev, 2, 330000000UL/2, 0, 0)); diff --git a/sys/mips/idt/uart_cpu_rc32434.c b/sys/mips/idt/uart_cpu_rc32434.c index 6bbc5bd04eb1..51be944df7e3 100644 --- a/sys/mips/idt/uart_cpu_rc32434.c +++ b/sys/mips/idt/uart_cpu_rc32434.c @@ -71,7 +71,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) /* Got it. Fill in the instance and return it. */ di->ops = uart_getops(&uart_ns8250_class); di->bas.chan = 0; - di->bas.bst = 0; + di->bas.bst = mips_bus_space_generic; di->bas.regshft = 2; di->bas.rclk = 330000000UL/2; /* IPbus clock */ di->baudrate = 115200; @@ -79,7 +79,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) di->stopbits = 1; di->parity = UART_PARITY_NONE; uart_bus_space_io = 0; - uart_bus_space_mem = 0; + uart_bus_space_mem = mips_bus_space_generic; di->bas.bsh = MIPS_PHYS_TO_KSEG1(maddr); return (0); } diff --git a/sys/mips/include/_align.h b/sys/mips/include/_align.h index 4484a28aa0b1..f945164d260c 100644 --- a/sys/mips/include/_align.h +++ b/sys/mips/include/_align.h @@ -44,10 +44,10 @@ /* * Round p (pointer or byte index) up to a correctly-aligned value for all - * data types (int, long, ...). The result is u_int and must be cast to + * data types (int, long, ...). The result is u_long and must be cast to * any desired pointer type. */ #define _ALIGNBYTES 7 -#define _ALIGN(p) (((u_int)(p) + _ALIGNBYTES) &~ _ALIGNBYTES) +#define _ALIGN(p) (((u_long)(p) + _ALIGNBYTES) &~ _ALIGNBYTES) #endif /* !_MIPS_INCLUDE__ALIGN_H_ */ diff --git a/sys/mips/include/_bus.h b/sys/mips/include/_bus.h index 74865da17dbc..54b0cbb65636 100644 --- a/sys/mips/include/_bus.h +++ b/sys/mips/include/_bus.h @@ -31,19 +31,20 @@ #ifndef MIPS_INCLUDE__BUS_H #define MIPS_INCLUDE__BUS_H -#ifdef TARGET_OCTEON -#include "_bus_octeon.h" -#else /* * Bus address and size types */ +#include "opt_cputype.h" +#if !(defined(TARGET_OCTEON) && defined(ISA_MIPS32)) typedef uintptr_t bus_addr_t; +#else +typedef uint64_t bus_addr_t; +#endif typedef uintptr_t bus_size_t; /* * Access methods for bus resources and address space. */ -typedef long bus_space_tag_t; -typedef u_long bus_space_handle_t; -#endif +typedef struct bus_space *bus_space_tag_t; +typedef bus_addr_t bus_space_handle_t; #endif /* MIPS_INCLUDE__BUS_H */ diff --git a/sys/mips/include/_types.h b/sys/mips/include/_types.h index ec94439f40c9..1fd760f9cb50 100644 --- a/sys/mips/include/_types.h +++ b/sys/mips/include/_types.h @@ -54,7 +54,7 @@ typedef unsigned short __uint16_t; typedef int __int32_t; typedef unsigned int __uint32_t; -#ifdef __mips64 +#ifdef __mips_n64 typedef long __int64_t; typedef unsigned long __uint64_t; #else @@ -79,14 +79,14 @@ typedef unsigned long long __uint64_t; */ typedef __int32_t __clock_t; /* clock()... */ typedef unsigned int __cpumask_t; -#ifdef __mips64 +#ifdef __mips_n64 typedef __int64_t __critical_t; #else typedef __int32_t __critical_t; #endif typedef double __double_t; typedef double __float_t; -#ifdef __mips64 +#ifdef __mips_n64 typedef __int64_t __intfptr_t; typedef __int64_t __intptr_t; #else @@ -102,14 +102,14 @@ typedef __int8_t __int_least8_t; typedef __int16_t __int_least16_t; typedef __int32_t __int_least32_t; typedef __int64_t __int_least64_t; -#if defined(__mips64) || defined(ISA_MIPS64) +#if defined(__mips_n64) || defined(__mips_n32) typedef __int64_t __register_t; typedef __int64_t f_register_t; #else typedef __int32_t __register_t; typedef __int32_t f_register_t; #endif -#ifdef __mips64 +#ifdef __mips_n64 typedef __int64_t __ptrdiff_t; typedef __int64_t __segsz_t; typedef __uint64_t __size_t; @@ -134,13 +134,16 @@ typedef __uint8_t __uint_least8_t; typedef __uint16_t __uint_least16_t; typedef __uint32_t __uint_least32_t; typedef __uint64_t __uint_least64_t; -#if defined(__mips64) || defined(ISA_MIPS64) +#if defined(__mips_n64) || defined(__mips_n32) typedef __uint64_t __u_register_t; +#else +typedef __uint32_t __u_register_t; +#endif +#if defined(__mips_n64) typedef __uint64_t __vm_offset_t; typedef __uint64_t __vm_paddr_t; typedef __uint64_t __vm_size_t; #else -typedef __uint32_t __u_register_t; typedef __uint32_t __vm_offset_t; typedef __uint32_t __vm_paddr_t; typedef __uint32_t __vm_size_t; @@ -162,8 +165,4 @@ typedef char * __va_list; typedef __va_list __gnuc_va_list; /* compatibility w/GNU headers*/ #endif -typedef struct label_t { - __register_t val[13]; -} label_t; - #endif /* !_MACHINE__TYPES_H_ */ diff --git a/sys/mips/include/asm.h b/sys/mips/include/asm.h index 0df221e26d51..0a9c518e9295 100644 --- a/sys/mips/include/asm.h +++ b/sys/mips/include/asm.h @@ -60,6 +60,7 @@ #include #endif #include +#include #undef __FBSDID #if !defined(lint) && !defined(STRIP_FBSDID) @@ -281,7 +282,7 @@ _C_LABEL(x): * Macros to panic and printf from assembly language. */ #define PANIC(msg) \ - la a0, 9f; \ + PTR_LA a0, 9f; \ jal _C_LABEL(panic); \ nop; \ MSG(msg) @@ -289,7 +290,7 @@ _C_LABEL(x): #define PANIC_KSEG0(msg, reg) PANIC(msg) #define PRINTF(msg) \ - la a0, 9f; \ + PTR_LA a0, 9f; \ jal _C_LABEL(printf); \ nop; \ MSG(msg) @@ -308,23 +309,24 @@ _C_LABEL(x): */ #define DO_AST \ 44: \ - la s0, _C_LABEL(disableintr) ;\ + PTR_LA s0, _C_LABEL(disableintr) ;\ jalr s0 ;\ nop ;\ + move a0, v0 ;\ GET_CPU_PCPU(s1) ;\ lw s3, PC_CURPCB(s1) ;\ lw s1, PC_CURTHREAD(s1) ;\ lw s2, TD_FLAGS(s1) ;\ li s0, TDF_ASTPENDING | TDF_NEEDRESCHED;\ and s2, s0 ;\ - la s0, _C_LABEL(enableintr) ;\ + PTR_LA s0, _C_LABEL(restoreintr) ;\ jalr s0 ;\ nop ;\ beq s2, zero, 4f ;\ nop ;\ - la s0, _C_LABEL(ast) ;\ + PTR_LA s0, _C_LABEL(ast) ;\ jalr s0 ;\ - addu a0, s3, U_PCB_REGS ;\ + PTR_ADDU a0, s3, U_PCB_REGS ;\ j 44b ;\ nop ;\ 4: @@ -338,17 +340,47 @@ _C_LABEL(x): #define NON_LEAF(x, fsize, retpc) NESTED(x, fsize, retpc) #define NNON_LEAF(x, fsize, retpc) NESTED_NOPROFILE(x, fsize, retpc) +#if defined(__mips_o32) +#define SZREG 4 +#else +#define SZREG 8 +#endif + +#if defined(__mips_o32) || defined(__mips_o64) +#define ALSK 7 /* stack alignment */ +#define ALMASK -7 /* stack alignment */ +#define SZFPREG 4 +#define FP_L lwc1 +#define FP_S swc1 +#else +#define ALSK 15 /* stack alignment */ +#define ALMASK -15 /* stack alignment */ +#define SZFPREG 8 +#define FP_L ldc1 +#define FP_S sdc1 +#endif + /* * standard callframe { - * register_t cf_args[4]; arg0 - arg3 + * register_t cf_pad[N]; o32/64 (N=0), n32 (N=1) n64 (N=1) + * register_t cf_args[4]; arg0 - arg3 (only on o32 and o64) + * register_t cf_gp; global pointer (only on n32 and n64) * register_t cf_sp; frame pointer * register_t cf_ra; return address * }; */ -#define CALLFRAME_SIZ (4 * (4 + 2)) -#define CALLFRAME_SP (4 * 4) -#define CALLFRAME_RA (4 * 5) -#define START_FRAME CALLFRAME_SIZ +#if defined(__mips_o32) || defined(__mips_o64) +#define CALLFRAME_SIZ (SZREG * (4 + 2)) +#define CALLFRAME_S0 0 +#elif defined(__mips_n32) || defined(__mips_n64) +#define CALLFRAME_SIZ (SZREG * 4) +#define CALLFRAME_S0 (CALLFRAME_SIZ - 4 * SZREG) +#endif +#ifndef _KERNEL +#define CALLFRAME_GP (CALLFRAME_SIZ - 3 * SZREG) +#endif +#define CALLFRAME_SP (CALLFRAME_SIZ - 2 * SZREG) +#define CALLFRAME_RA (CALLFRAME_SIZ - 1 * SZREG) /* * While it would be nice to be compatible with the SGI @@ -359,22 +391,264 @@ _C_LABEL(x): * assembler to prevent the assembler from generating 64-bit style * ABI calls. */ +#if _MIPS_SZPTR == 32 +#define PTR_ADD add +#define PTR_ADDI addi +#define PTR_ADDU addu +#define PTR_ADDIU addiu +#define PTR_SUB add +#define PTR_SUBI subi +#define PTR_SUBU subu +#define PTR_SUBIU subu +#define PTR_L lw +#define PTR_LA la +#define PTR_S sw +#define PTR_SLL sll +#define PTR_SLLV sllv +#define PTR_SRL srl +#define PTR_SRLV srlv +#define PTR_SRA sra +#define PTR_SRAV srav +#define PTR_LL ll +#define PTR_SC sc +#define PTR_WORD .word +#define PTR_SCALESHIFT 2 +#else /* _MIPS_SZPTR == 64 */ +#define PTR_ADD dadd +#define PTR_ADDI daddi +#define PTR_ADDU daddu +#define PTR_ADDIU daddiu +#define PTR_SUB dadd +#define PTR_SUBI dsubi +#define PTR_SUBU dsubu +#define PTR_SUBIU dsubu +#define PTR_L ld +#define PTR_LA dla +#define PTR_S sd +#define PTR_SLL dsll +#define PTR_SLLV dsllv +#define PTR_SRL dsrl +#define PTR_SRLV dsrlv +#define PTR_SRA dsra +#define PTR_SRAV dsrav +#define PTR_LL lld +#define PTR_SC scd +#define PTR_WORD .dword +#define PTR_SCALESHIFT 3 +#endif /* _MIPS_SZPTR == 64 */ -#if !defined(_MIPS_BSD_API) || _MIPS_BSD_API == _MIPS_BSD_API_LP32 +#if _MIPS_SZINT == 32 +#define INT_ADD add +#define INT_ADDI addi +#define INT_ADDU addu +#define INT_ADDIU addiu +#define INT_SUB add +#define INT_SUBI subi +#define INT_SUBU subu +#define INT_SUBIU subu +#define INT_L lw +#define INT_LA la +#define INT_S sw +#define INT_SLL sll +#define INT_SLLV sllv +#define INT_SRL srl +#define INT_SRLV srlv +#define INT_SRA sra +#define INT_SRAV srav +#define INT_LL ll +#define INT_SC sc +#define INT_WORD .word +#define INT_SCALESHIFT 2 +#else +#define INT_ADD dadd +#define INT_ADDI daddi +#define INT_ADDU daddu +#define INT_ADDIU daddiu +#define INT_SUB dadd +#define INT_SUBI dsubi +#define INT_SUBU dsubu +#define INT_SUBIU dsubu +#define INT_L ld +#define INT_LA dla +#define INT_S sd +#define INT_SLL dsll +#define INT_SLLV dsllv +#define INT_SRL dsrl +#define INT_SRLV dsrlv +#define INT_SRA dsra +#define INT_SRAV dsrav +#define INT_LL lld +#define INT_SC scd +#define INT_WORD .dword +#define INT_SCALESHIFT 3 +#endif + +#if _MIPS_SZLONG == 32 +#define LONG_ADD add +#define LONG_ADDI addi +#define LONG_ADDU addu +#define LONG_ADDIU addiu +#define LONG_SUB add +#define LONG_SUBI subi +#define LONG_SUBU subu +#define LONG_SUBIU subu +#define LONG_L lw +#define LONG_LA la +#define LONG_S sw +#define LONG_SLL sll +#define LONG_SLLV sllv +#define LONG_SRL srl +#define LONG_SRLV srlv +#define LONG_SRA sra +#define LONG_SRAV srav +#define LONG_LL ll +#define LONG_SC sc +#define LONG_WORD .word +#define LONG_SCALESHIFT 2 +#else +#define LONG_ADD dadd +#define LONG_ADDI daddi +#define LONG_ADDU daddu +#define LONG_ADDIU daddiu +#define LONG_SUB dadd +#define LONG_SUBI dsubi +#define LONG_SUBU dsubu +#define LONG_SUBIU dsubu +#define LONG_L ld +#define LONG_LA dla +#define LONG_S sd +#define LONG_SLL dsll +#define LONG_SLLV dsllv +#define LONG_SRL dsrl +#define LONG_SRLV dsrlv +#define LONG_SRA dsra +#define LONG_SRAV dsrav +#define LONG_LL lld +#define LONG_SC scd +#define LONG_WORD .dword +#define LONG_SCALESHIFT 3 +#endif + +#if SZREG == 4 #define REG_L lw #define REG_S sw #define REG_LI li -#define REG_PROLOGUE .set push -#define REG_EPILOGUE .set pop -#define SZREG 4 +#define REG_ADDU addu +#define REG_SLL sll +#define REG_SLLV sllv +#define REG_SRL srl +#define REG_SRLV srlv +#define REG_SRA sra +#define REG_SRAV srav +#define REG_LL ll +#define REG_SC sc +#define REG_SCALESHIFT 2 #else #define REG_L ld #define REG_S sd #define REG_LI dli +#define REG_ADDU daddu +#define REG_SLL dsll +#define REG_SLLV dsllv +#define REG_SRL dsrl +#define REG_SRLV dsrlv +#define REG_SRA dsra +#define REG_SRAV dsrav +#define REG_LL lld +#define REG_SC scd +#define REG_SCALESHIFT 3 +#endif + +#if _MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2 || \ + _MIPS_ISA == _MIPS_ISA_MIPS32 +#define MFC0 mfc0 +#define MTC0 mtc0 +#endif +#if _MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4 || \ + _MIPS_ISA == _MIPS_ISA_MIPS64 +#define MFC0 dmfc0 +#define MTC0 dmtc0 +#endif + +#if defined(__mips_o32) || defined(__mips_o64) + +#ifdef __ABICALLS__ +#define CPRESTORE(r) .cprestore r +#define CPLOAD(r) .cpload r +#else +#define CPRESTORE(r) /* not needed */ +#define CPLOAD(r) /* not needed */ +#endif + +#define SETUP_GP \ + .set push; \ + .set noreorder; \ + .cpload t9; \ + .set pop +#define SETUP_GPX(r) \ + .set push; \ + .set noreorder; \ + move r,ra; /* save old ra */ \ + bal 7f; \ + nop; \ + 7: .cpload ra; \ + move ra,r; \ + .set pop +#define SETUP_GPX_L(r,lbl) \ + .set push; \ + .set noreorder; \ + move r,ra; /* save old ra */ \ + bal lbl; \ + nop; \ + lbl: .cpload ra; \ + move ra,r; \ + .set pop +#define SAVE_GP(x) .cprestore x + +#define SETUP_GP64(a,b) /* n32/n64 specific */ +#define SETUP_GP64_R(a,b) /* n32/n64 specific */ +#define SETUP_GPX64(a,b) /* n32/n64 specific */ +#define SETUP_GPX64_L(a,b,c) /* n32/n64 specific */ +#define RESTORE_GP64 /* n32/n64 specific */ +#define USE_ALT_CP(a) /* n32/n64 specific */ +#endif /* __mips_o32 || __mips_o64 */ + +#if defined(__mips_o32) || defined(__mips_o64) +#define REG_PROLOGUE .set push +#define REG_EPILOGUE .set pop +#endif +#if defined(__mips_n32) || defined(__mips_n64) #define REG_PROLOGUE .set push ; .set mips3 #define REG_EPILOGUE .set pop -#define SZREG 8 -#endif /* _MIPS_BSD_API */ +#endif + +#if defined(__mips_n32) || defined(__mips_n64) +#define SETUP_GP /* o32 specific */ +#define SETUP_GPX(r) /* o32 specific */ +#define SETUP_GPX_L(r,lbl) /* o32 specific */ +#define SAVE_GP(x) /* o32 specific */ +#define SETUP_GP64(a,b) .cpsetup $25, a, b +#define SETUP_GPX64(a,b) \ + .set push; \ + move b,ra; \ + .set noreorder; \ + bal 7f; \ + nop; \ + 7: .set pop; \ + .cpsetup ra, a, 7b; \ + move ra,b +#define SETUP_GPX64_L(a,b,c) \ + .set push; \ + move b,ra; \ + .set noreorder; \ + bal c; \ + nop; \ + c: .set pop; \ + .cpsetup ra, a, c; \ + move ra,b +#define RESTORE_GP64 .cpreturn +#define USE_ALT_CP(a) .cplocal a +#endif /* __mips_n32 || __mips_n64 */ #define mfc0_macro(data, spr) \ __asm __volatile ("mfc0 %0, $%1" \ @@ -490,17 +764,8 @@ _C_LABEL(x): #define DYNAMIC_STATUS_MASK_TOUSER(sr,scratch1) #endif -#ifdef SMP - /* - * FREEBSD_DEVELOPERS_FIXME - * In multiprocessor case, store/retrieve the pcpu structure - * address for current CPU in scratch register for fast access. - */ -#error "Write GET_CPU_PCPU for SMP" -#else #define GET_CPU_PCPU(reg) \ lw reg, _C_LABEL(pcpup); -#endif /* * Description of the setjmp buffer diff --git a/sys/mips/include/atomic.h b/sys/mips/include/atomic.h index 9f800cd1d211..4b87738cf90e 100644 --- a/sys/mips/include/atomic.h +++ b/sys/mips/include/atomic.h @@ -34,6 +34,17 @@ #error this file needs sys/cdefs.h as a prerequisite #endif +/* + * Note: All the 64-bit atomic operations are only atomic when running + * in 64-bit mode. It is assumed that code compiled for n32 and n64 + * fits into this definition and no further safeties are needed. + * + * It is also assumed that the add, subtract and other arithmetic is + * done on numbers not pointers. The special rules for n32 pointers + * do not have atomic operations defined for them, but generally shouldn't + * need atomic operations. + */ + static __inline void mips_sync(void) { @@ -126,7 +137,7 @@ atomic_subtract_32(__volatile uint32_t *p, uint32_t v) "1:\tll %0, %3\n\t" /* load old value */ "subu %0, %2\n\t" /* calculate new value */ "sc %0, %1\n\t" /* attempt to store */ - "beqz %0, 1b\n\t" /* spin if failed */ + "beqz %0, 1b\n\t" /* spin if failed */ : "=&r" (temp), "=m" (*p) : "r" (v), "m" (*p) : "memory"); @@ -166,6 +177,110 @@ atomic_readandset_32(__volatile uint32_t *addr, uint32_t value) return result; } +#if defined(__mips_n64) || defined(__mips_n32) +static __inline void +atomic_set_64(__volatile uint64_t *p, uint64_t v) +{ + uint64_t temp; + + __asm __volatile ( + "1:\n\t" + "lld %0, %3\n\t" /* load old value */ + "or %0, %2, %0\n\t" /* calculate new value */ + "scd %0, %1\n\t" /* attempt to store */ + "beqz %0, 1b\n\t" /* spin if failed */ + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) + : "memory"); + +} + +static __inline void +atomic_clear_64(__volatile uint64_t *p, uint64_t v) +{ + uint64_t temp; + v = ~v; + + __asm __volatile ( + "1:\n\t" + "lld %0, %3\n\t" /* load old value */ + "and %0, %2, %0\n\t" /* calculate new value */ + "scd %0, %1\n\t" /* attempt to store */ + "beqz %0, 1b\n\t" /* spin if failed */ + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) + : "memory"); +} + +static __inline void +atomic_add_64(__volatile uint64_t *p, uint64_t v) +{ + uint64_t temp; + + __asm __volatile ( + "1:\n\t" + "lld %0, %3\n\t" /* load old value */ + "daddu %0, %2, %0\n\t" /* calculate new value */ + "scd %0, %1\n\t" /* attempt to store */ + "beqz %0, 1b\n\t" /* spin if failed */ + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) + : "memory"); +} + +static __inline void +atomic_subtract_64(__volatile uint64_t *p, uint64_t v) +{ + uint64_t temp; + + __asm __volatile ( + "1:\n\t" + "lld %0, %3\n\t" /* load old value */ + "dsubu %0, %2\n\t" /* calculate new value */ + "scd %0, %1\n\t" /* attempt to store */ + "beqz %0, 1b\n\t" /* spin if failed */ + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) + : "memory"); +} + +static __inline uint64_t +atomic_readandclear_64(__volatile uint64_t *addr) +{ + uint64_t result,temp; + + __asm __volatile ( + "1:\n\t" + "lld %0, %3\n\t" /* load old value */ + "li %1, 0\n\t" /* value to store */ + "scd %1, %2\n\t" /* attempt to store */ + "beqz %1, 1b\n\t" /* if the store failed, spin */ + : "=&r"(result), "=&r"(temp), "=m" (*addr) + : "m" (*addr) + : "memory"); + + return result; +} + +static __inline uint64_t +atomic_readandset_64(__volatile uint64_t *addr, uint64_t value) +{ + uint64_t result,temp; + + __asm __volatile ( + "1:\n\t" + "lld %0,%3\n\t" /* Load old value*/ + "or %1,$0,%4\n\t" + "scd %1,%2\n\t" /* attempt to store */ + "beqz %1, 1b\n\t" /* if the store failed, spin */ + : "=&r"(result), "=&r"(temp), "=m" (*addr) + : "m" (*addr), "r" (value) + : "memory"); + + return result; +} +#endif + #define ATOMIC_ACQ_REL(NAME, WIDTH) \ static __inline void \ atomic_##NAME##_acq_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ @@ -194,7 +309,7 @@ ATOMIC_ACQ_REL(set, 32) ATOMIC_ACQ_REL(clear, 32) ATOMIC_ACQ_REL(add, 32) ATOMIC_ACQ_REL(subtract, 32) -#if 0 +#if defined(__mips_n64) || defined(__mips_n32) ATOMIC_ACQ_REL(set, 64) ATOMIC_ACQ_REL(clear, 64) ATOMIC_ACQ_REL(add, 64) @@ -226,8 +341,22 @@ atomic_store_rel_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ ATOMIC_STORE_LOAD(32) ATOMIC_STORE_LOAD(64) -void atomic_store_64 (__volatile uint64_t *, uint64_t *); -void atomic_load_64 (__volatile uint64_t *, uint64_t *); +#if !defined(__mips_n64) && !defined(__mips_n32) +void atomic_store_64(__volatile uint64_t *, uint64_t *); +void atomic_load_64(__volatile uint64_t *, uint64_t *); +#else +static __inline void +atomic_store_64(__volatile uint64_t *p, uint64_t *v) +{ + *p = *v; +} + +static __inline void +atomic_load_64(__volatile uint64_t *p, uint64_t *v) +{ + *v = *p; +} +#endif #undef ATOMIC_STORE_LOAD @@ -294,11 +423,83 @@ atomic_fetchadd_32(__volatile uint32_t *p, uint32_t v) "addu %2, %3, %0\n\t" /* calculate new value */ "sc %2, %1\n\t" /* attempt to store */ "beqz %2, 1b\n\t" /* spin if failed */ - : "=&r" (value), "=m" (*p), "=r" (temp) + : "=&r" (value), "=m" (*p), "=&r" (temp) : "r" (v), "m" (*p)); return (value); } +#if defined(__mips_n64) || defined(__mips_n32) +/* + * Atomically compare the value stored at *p with cmpval and if the + * two values are equal, update the value of *p with newval. Returns + * zero if the compare failed, nonzero otherwise. + */ +static __inline uint64_t +atomic_cmpset_64(__volatile uint64_t* p, uint64_t cmpval, uint64_t newval) +{ + uint64_t ret; + + __asm __volatile ( + "1:\n\t" + "lld %0, %4\n\t" /* load old value */ + "bne %0, %2, 2f\n\t" /* compare */ + "move %0, %3\n\t" /* value to store */ + "scd %0, %1\n\t" /* attempt to store */ + "beqz %0, 1b\n\t" /* if it failed, spin */ + "j 3f\n\t" + "2:\n\t" + "li %0, 0\n\t" + "3:\n" + : "=&r" (ret), "=m" (*p) + : "r" (cmpval), "r" (newval), "m" (*p) + : "memory"); + + return ret; +} + +/* + * Atomically compare the value stored at *p with cmpval and if the + * two values are equal, update the value of *p with newval. Returns + * zero if the compare failed, nonzero otherwise. + */ +static __inline uint64_t +atomic_cmpset_acq_64(__volatile uint64_t *p, uint64_t cmpval, uint64_t newval) +{ + int retval; + + retval = atomic_cmpset_64(p, cmpval, newval); + mips_sync(); + return (retval); +} + +static __inline uint64_t +atomic_cmpset_rel_64(__volatile uint64_t *p, uint64_t cmpval, uint64_t newval) +{ + mips_sync(); + return (atomic_cmpset_64(p, cmpval, newval)); +} + +/* + * Atomically add the value of v to the integer pointed to by p and return + * the previous value of *p. + */ +static __inline uint64_t +atomic_fetchadd_64(__volatile uint64_t *p, uint64_t v) +{ + uint64_t value, temp; + + __asm __volatile ( + "1:\n\t" + "lld %0, %1\n\t" /* load old value */ + "daddu %2, %3, %0\n\t" /* calculate new value */ + "scd %2, %1\n\t" /* attempt to store */ + "beqz %2, 1b\n\t" /* spin if failed */ + : "=&r" (value), "=m" (*p), "=&r" (temp) + : "r" (v), "m" (*p)); + return (value); +} +#endif + /* Operations on chars. */ #define atomic_set_char atomic_set_8 #define atomic_set_acq_char atomic_set_acq_8 @@ -349,7 +550,13 @@ atomic_fetchadd_32(__volatile uint32_t *p, uint32_t v) #define atomic_readandset_int atomic_readandset_32 #define atomic_fetchadd_int atomic_fetchadd_32 -#ifdef __mips64 +/* + * I think the following is right, even for n32. For n32 the pointers + * are still 32-bits, so we need to operate on them as 32-bit quantities, + * even though they are sign extended in operation. For longs, there's + * no question because they are always 32-bits. + */ +#ifdef __mips_n64 /* Operations on longs. */ #define atomic_set_long atomic_set_64 #define atomic_set_acq_long atomic_set_acq_64 @@ -371,27 +578,7 @@ atomic_fetchadd_32(__volatile uint32_t *p, uint32_t v) #define atomic_fetchadd_long atomic_fetchadd_64 #define atomic_readandclear_long atomic_readandclear_64 -/* Operations on pointers. */ -#define atomic_set_ptr atomic_set_64 -#define atomic_set_acq_ptr atomic_set_acq_64 -#define atomic_set_rel_ptr atomic_set_rel_64 -#define atomic_clear_ptr atomic_clear_64 -#define atomic_clear_acq_ptr atomic_clear_acq_64 -#define atomic_clear_rel_ptr atomic_clear_rel_64 -#define atomic_add_ptr atomic_add_64 -#define atomic_add_acq_ptr atomic_add_acq_64 -#define atomic_add_rel_ptr atomic_add_rel_64 -#define atomic_subtract_ptr atomic_subtract_64 -#define atomic_subtract_acq_ptr atomic_subtract_acq_64 -#define atomic_subtract_rel_ptr atomic_subtract_rel_64 -#define atomic_cmpset_ptr atomic_cmpset_64 -#define atomic_cmpset_acq_ptr atomic_cmpset_acq_64 -#define atomic_cmpset_rel_ptr atomic_cmpset_rel_64 -#define atomic_load_acq_ptr atomic_load_acq_64 -#define atomic_store_rel_ptr atomic_store_rel_64 -#define atomic_readandclear_ptr atomic_readandclear_64 - -#else /* __mips64 */ +#else /* !__mips_n64 */ /* Operations on longs. */ #define atomic_set_long atomic_set_32 @@ -421,25 +608,26 @@ atomic_fetchadd_32(__volatile uint32_t *p, uint32_t v) atomic_fetchadd_32((volatile u_int *)(p), (u_int)(v)) #define atomic_readandclear_long atomic_readandclear_32 +#endif /* __mips_n64 */ + /* Operations on pointers. */ -#define atomic_set_ptr atomic_set_32 -#define atomic_set_acq_ptr atomic_set_acq_32 -#define atomic_set_rel_ptr atomic_set_rel_32 -#define atomic_clear_ptr atomic_clear_32 -#define atomic_clear_acq_ptr atomic_clear_acq_32 -#define atomic_clear_rel_ptr atomic_clear_rel_32 -#define atomic_add_ptr atomic_add_32 -#define atomic_add_acq_ptr atomic_add_acq_32 -#define atomic_add_rel_ptr atomic_add_rel_32 -#define atomic_subtract_ptr atomic_subtract_32 -#define atomic_subtract_acq_ptr atomic_subtract_acq_32 -#define atomic_subtract_rel_ptr atomic_subtract_rel_32 -#define atomic_cmpset_ptr atomic_cmpset_32 -#define atomic_cmpset_acq_ptr atomic_cmpset_acq_32 -#define atomic_cmpset_rel_ptr atomic_cmpset_rel_32 -#define atomic_load_acq_ptr atomic_load_acq_32 -#define atomic_store_rel_ptr atomic_store_rel_32 -#define atomic_readandclear_ptr atomic_readandclear_32 -#endif /* __mips64 */ +#define atomic_set_ptr atomic_set_long +#define atomic_set_acq_ptr atomic_set_acq_long +#define atomic_set_rel_ptr atomic_set_rel_long +#define atomic_clear_ptr atomic_clear_long +#define atomic_clear_acq_ptr atomic_clear_acq_long +#define atomic_clear_rel_ptr atomic_clear_rel_long +#define atomic_add_ptr atomic_add_long +#define atomic_add_acq_ptr atomic_add_acq_long +#define atomic_add_rel_ptr atomic_add_rel_long +#define atomic_subtract_ptr atomic_subtract_long +#define atomic_subtract_acq_ptr atomic_subtract_acq_long +#define atomic_subtract_rel_ptr atomic_subtract_rel_long +#define atomic_cmpset_ptr atomic_cmpset_long +#define atomic_cmpset_acq_ptr atomic_cmpset_acq_long +#define atomic_cmpset_rel_ptr atomic_cmpset_rel_long +#define atomic_load_acq_ptr atomic_load_acq_long +#define atomic_store_rel_ptr atomic_store_rel_long +#define atomic_readandclear_ptr atomic_readandclear_long #endif /* ! _MACHINE_ATOMIC_H_ */ diff --git a/sys/mips/include/bus.h b/sys/mips/include/bus.h index 92557d7cbd3c..ccaeb34b186d 100644 --- a/sys/mips/include/bus.h +++ b/sys/mips/include/bus.h @@ -1,8 +1,7 @@ -/* $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $ */ +/* $NetBSD: bus.h,v 1.11 2003/07/28 17:35:54 thorpej Exp $ */ + /*- - * $Id: bus.h,v 1.6 2007/08/09 11:23:32 katta Exp $ - * - * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. + * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -38,7 +37,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -/* +/*- * Copyright (c) 1996 Charles M. Hannum. All rights reserved. * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. * @@ -68,843 +67,663 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * from: src/sys/alpha/include/bus.h,v 1.5 1999/08/28 00:38:40 peter * $FreeBSD$ -*/ + */ #ifndef _MACHINE_BUS_H_ -#define _MACHINE_BUS_H_ +#define _MACHINE_BUS_H_ -#ifdef TARGET_OCTEON -#include -#else #include -#include + +struct bus_space { + /* cookie */ + void *bs_cookie; + + /* mapping/unmapping */ + int (*bs_map) (void *, bus_addr_t, bus_size_t, + int, bus_space_handle_t *); + void (*bs_unmap) (void *, bus_space_handle_t, bus_size_t); + int (*bs_subregion) (void *, bus_space_handle_t, + bus_size_t, bus_size_t, bus_space_handle_t *); + + /* allocation/deallocation */ + int (*bs_alloc) (void *, bus_addr_t, bus_addr_t, + bus_size_t, bus_size_t, bus_size_t, int, + bus_addr_t *, bus_space_handle_t *); + void (*bs_free) (void *, bus_space_handle_t, + bus_size_t); + + /* get kernel virtual address */ + /* barrier */ + void (*bs_barrier) (void *, bus_space_handle_t, + bus_size_t, bus_size_t, int); + + /* read (single) */ + u_int8_t (*bs_r_1) (void *, bus_space_handle_t, bus_size_t); + u_int16_t (*bs_r_2) (void *, bus_space_handle_t, bus_size_t); + u_int32_t (*bs_r_4) (void *, bus_space_handle_t, bus_size_t); + u_int64_t (*bs_r_8) (void *, bus_space_handle_t, bus_size_t); + + /* read multiple */ + void (*bs_rm_1) (void *, bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); + void (*bs_rm_2) (void *, bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); + void (*bs_rm_4) (void *, bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t); + void (*bs_rm_8) (void *, bus_space_handle_t, + bus_size_t, u_int64_t *, bus_size_t); + + /* read region */ + void (*bs_rr_1) (void *, bus_space_handle_t, + bus_size_t, u_int8_t *, bus_size_t); + void (*bs_rr_2) (void *, bus_space_handle_t, + bus_size_t, u_int16_t *, bus_size_t); + void (*bs_rr_4) (void *, bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t); + void (*bs_rr_8) (void *, bus_space_handle_t, + bus_size_t, u_int64_t *, bus_size_t); + + /* write (single) */ + void (*bs_w_1) (void *, bus_space_handle_t, + bus_size_t, u_int8_t); + void (*bs_w_2) (void *, bus_space_handle_t, + bus_size_t, u_int16_t); + void (*bs_w_4) (void *, bus_space_handle_t, + bus_size_t, u_int32_t); + void (*bs_w_8) (void *, bus_space_handle_t, + bus_size_t, u_int64_t); + + /* write multiple */ + void (*bs_wm_1) (void *, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); + void (*bs_wm_2) (void *, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); + void (*bs_wm_4) (void *, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + void (*bs_wm_8) (void *, bus_space_handle_t, + bus_size_t, const u_int64_t *, bus_size_t); + + /* write region */ + void (*bs_wr_1) (void *, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); + void (*bs_wr_2) (void *, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); + void (*bs_wr_4) (void *, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + void (*bs_wr_8) (void *, bus_space_handle_t, + bus_size_t, const u_int64_t *, bus_size_t); + + /* set multiple */ + void (*bs_sm_1) (void *, bus_space_handle_t, + bus_size_t, u_int8_t, bus_size_t); + void (*bs_sm_2) (void *, bus_space_handle_t, + bus_size_t, u_int16_t, bus_size_t); + void (*bs_sm_4) (void *, bus_space_handle_t, + bus_size_t, u_int32_t, bus_size_t); + void (*bs_sm_8) (void *, bus_space_handle_t, + bus_size_t, u_int64_t, bus_size_t); + + /* set region */ + void (*bs_sr_1) (void *, bus_space_handle_t, + bus_size_t, u_int8_t, bus_size_t); + void (*bs_sr_2) (void *, bus_space_handle_t, + bus_size_t, u_int16_t, bus_size_t); + void (*bs_sr_4) (void *, bus_space_handle_t, + bus_size_t, u_int32_t, bus_size_t); + void (*bs_sr_8) (void *, bus_space_handle_t, + bus_size_t, u_int64_t, bus_size_t); + + /* copy */ + void (*bs_c_1) (void *, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); + void (*bs_c_2) (void *, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); + void (*bs_c_4) (void *, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); + void (*bs_c_8) (void *, bus_space_handle_t, bus_size_t, + bus_space_handle_t, bus_size_t, bus_size_t); + + /* read stream (single) */ + u_int8_t (*bs_r_1_s) (void *, bus_space_handle_t, bus_size_t); + u_int16_t (*bs_r_2_s) (void *, bus_space_handle_t, bus_size_t); + u_int32_t (*bs_r_4_s) (void *, bus_space_handle_t, bus_size_t); + u_int64_t (*bs_r_8_s) (void *, bus_space_handle_t, bus_size_t); + + /* read multiple stream */ + void (*bs_rm_1_s) (void *, bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); + void (*bs_rm_2_s) (void *, bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); + void (*bs_rm_4_s) (void *, bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t); + void (*bs_rm_8_s) (void *, bus_space_handle_t, + bus_size_t, u_int64_t *, bus_size_t); + + /* read region stream */ + void (*bs_rr_1_s) (void *, bus_space_handle_t, + bus_size_t, u_int8_t *, bus_size_t); + void (*bs_rr_2_s) (void *, bus_space_handle_t, + bus_size_t, u_int16_t *, bus_size_t); + void (*bs_rr_4_s) (void *, bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t); + void (*bs_rr_8_s) (void *, bus_space_handle_t, + bus_size_t, u_int64_t *, bus_size_t); + + /* write stream (single) */ + void (*bs_w_1_s) (void *, bus_space_handle_t, + bus_size_t, u_int8_t); + void (*bs_w_2_s) (void *, bus_space_handle_t, + bus_size_t, u_int16_t); + void (*bs_w_4_s) (void *, bus_space_handle_t, + bus_size_t, u_int32_t); + void (*bs_w_8_s) (void *, bus_space_handle_t, + bus_size_t, u_int64_t); + + /* write multiple stream */ + void (*bs_wm_1_s) (void *, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); + void (*bs_wm_2_s) (void *, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); + void (*bs_wm_4_s) (void *, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + void (*bs_wm_8_s) (void *, bus_space_handle_t, + bus_size_t, const u_int64_t *, bus_size_t); + + /* write region stream */ + void (*bs_wr_1_s) (void *, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); + void (*bs_wr_2_s) (void *, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); + void (*bs_wr_4_s) (void *, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + void (*bs_wr_8_s) (void *, bus_space_handle_t, + bus_size_t, const u_int64_t *, bus_size_t); +}; + /* - * Values for the mips bus space tag, not to be used directly by MI code. + * Utility macros; INTERNAL USE ONLY. */ -#define MIPS_BUS_SPACE_IO 0 /* space is i/o space */ -#define MIPS_BUS_SPACE_MEM 1 /* space is mem space */ +#define __bs_c(a,b) __CONCAT(a,b) +#define __bs_opname(op,size) __bs_c(__bs_c(__bs_c(bs_,op),_),size) +#define __bs_rs(sz, t, h, o) \ + (*(t)->__bs_opname(r,sz))((t)->bs_cookie, h, o) +#define __bs_ws(sz, t, h, o, v) \ + (*(t)->__bs_opname(w,sz))((t)->bs_cookie, h, o, v) +#define __bs_nonsingle(type, sz, t, h, o, a, c) \ + (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, a, c) +#define __bs_set(type, sz, t, h, o, v, c) \ + (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, v, c) +#define __bs_copy(sz, t, h1, o1, h2, o2, cnt) \ + (*(t)->__bs_opname(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt) -#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF -#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXSIZE 0xFFFFFFFF /* Maximum supported size */ -#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF -#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXADDR 0xFFFFFFFF +#define __bs_opname_s(op,size) __bs_c(__bs_c(__bs_c(__bs_c(bs_,op),_),size),_s) +#define __bs_rs_s(sz, t, h, o) \ + (*(t)->__bs_opname_s(r,sz))((t)->bs_cookie, h, o) +#define __bs_ws_s(sz, t, h, o, v) \ + (*(t)->__bs_opname_s(w,sz))((t)->bs_cookie, h, o, v) +#define __bs_nonsingle_s(type, sz, t, h, o, a, c) \ + (*(t)->__bs_opname_s(type,sz))((t)->bs_cookie, h, o, a, c) -#define BUS_SPACE_UNRESTRICTED (~0) /* - * Map a region of device bus space into CPU virtual address space. + * Mapping and unmapping operations. */ +#define bus_space_map(t, a, s, c, hp) \ + (*(t)->bs_map)((t)->bs_cookie, (a), (s), (c), (hp)) +#define bus_space_unmap(t, h, s) \ + (*(t)->bs_unmap)((t)->bs_cookie, (h), (s)) +#define bus_space_subregion(t, h, o, s, hp) \ + (*(t)->bs_subregion)((t)->bs_cookie, (h), (o), (s), (hp)) -static __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr, - bus_size_t size, int flags, - bus_space_handle_t *bshp); - -static __inline int -bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr, - bus_size_t size __unused, int flags __unused, - bus_space_handle_t *bshp) -{ - - *bshp = addr; - return (0); -} /* - * Unmap a region of device bus space. + * Allocation and deallocation operations. + */ +#define bus_space_alloc(t, rs, re, s, a, b, c, ap, hp) \ + (*(t)->bs_alloc)((t)->bs_cookie, (rs), (re), (s), (a), (b), \ + (c), (ap), (hp)) +#define bus_space_free(t, h, s) \ + (*(t)->bs_free)((t)->bs_cookie, (h), (s)) + +/* + * Bus barrier operations. + */ +#define bus_space_barrier(t, h, o, l, f) \ + (*(t)->bs_barrier)((t)->bs_cookie, (h), (o), (l), (f)) + +#define BUS_SPACE_BARRIER_READ 0x01 +#define BUS_SPACE_BARRIER_WRITE 0x02 + +/* + * Bus read (single) operations. + */ +#define bus_space_read_1(t, h, o) __bs_rs(1,(t),(h),(o)) +#define bus_space_read_2(t, h, o) __bs_rs(2,(t),(h),(o)) +#define bus_space_read_4(t, h, o) __bs_rs(4,(t),(h),(o)) +#define bus_space_read_8(t, h, o) __bs_rs(8,(t),(h),(o)) + +#define bus_space_read_stream_1(t, h, o) __bs_rs_s(1,(t), (h), (o)) +#define bus_space_read_stream_2(t, h, o) __bs_rs_s(2,(t), (h), (o)) +#define bus_space_read_stream_4(t, h, o) __bs_rs_s(4,(t), (h), (o)) +#define bus_space_read_stream_8(t, h, o) __bs_rs_s(8,8,(t),(h),(o)) + +/* + * Bus read multiple operations. + */ +#define bus_space_read_multi_1(t, h, o, a, c) \ + __bs_nonsingle(rm,1,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_2(t, h, o, a, c) \ + __bs_nonsingle(rm,2,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_4(t, h, o, a, c) \ + __bs_nonsingle(rm,4,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_8(t, h, o, a, c) \ + __bs_nonsingle(rm,8,(t),(h),(o),(a),(c)) + +#define bus_space_read_multi_stream_1(t, h, o, a, c) \ + __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_stream_2(t, h, o, a, c) \ + __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_stream_4(t, h, o, a, c) \ + __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_stream_8(t, h, o, a, c) \ + __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c)) + + +/* + * Bus read region operations. + */ +#define bus_space_read_region_1(t, h, o, a, c) \ + __bs_nonsingle(rr,1,(t),(h),(o),(a),(c)) +#define bus_space_read_region_2(t, h, o, a, c) \ + __bs_nonsingle(rr,2,(t),(h),(o),(a),(c)) +#define bus_space_read_region_4(t, h, o, a, c) \ + __bs_nonsingle(rr,4,(t),(h),(o),(a),(c)) +#define bus_space_read_region_8(t, h, o, a, c) \ + __bs_nonsingle(rr,8,(t),(h),(o),(a),(c)) + +#define bus_space_read_region_stream_1(t, h, o, a, c) \ + __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c)) +#define bus_space_read_region_stream_2(t, h, o, a, c) \ + __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c)) +#define bus_space_read_region_stream_4(t, h, o, a, c) \ + __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c)) +#define bus_space_read_region_stream_8(t, h, o, a, c) \ + __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c)) + + +/* + * Bus write (single) operations. + */ +#define bus_space_write_1(t, h, o, v) __bs_ws(1,(t),(h),(o),(v)) +#define bus_space_write_2(t, h, o, v) __bs_ws(2,(t),(h),(o),(v)) +#define bus_space_write_4(t, h, o, v) __bs_ws(4,(t),(h),(o),(v)) +#define bus_space_write_8(t, h, o, v) __bs_ws(8,(t),(h),(o),(v)) + +#define bus_space_write_stream_1(t, h, o, v) __bs_ws_s(1,(t),(h),(o),(v)) +#define bus_space_write_stream_2(t, h, o, v) __bs_ws_s(2,(t),(h),(o),(v)) +#define bus_space_write_stream_4(t, h, o, v) __bs_ws_s(4,(t),(h),(o),(v)) +#define bus_space_write_stream_8(t, h, o, v) __bs_ws_s(8,(t),(h),(o),(v)) + + +/* + * Bus write multiple operations. + */ +#define bus_space_write_multi_1(t, h, o, a, c) \ + __bs_nonsingle(wm,1,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_2(t, h, o, a, c) \ + __bs_nonsingle(wm,2,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_4(t, h, o, a, c) \ + __bs_nonsingle(wm,4,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_8(t, h, o, a, c) \ + __bs_nonsingle(wm,8,(t),(h),(o),(a),(c)) + +#define bus_space_write_multi_stream_1(t, h, o, a, c) \ + __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_stream_2(t, h, o, a, c) \ + __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_stream_4(t, h, o, a, c) \ + __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_stream_8(t, h, o, a, c) \ + __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c)) + + +/* + * Bus write region operations. + */ +#define bus_space_write_region_1(t, h, o, a, c) \ + __bs_nonsingle(wr,1,(t),(h),(o),(a),(c)) +#define bus_space_write_region_2(t, h, o, a, c) \ + __bs_nonsingle(wr,2,(t),(h),(o),(a),(c)) +#define bus_space_write_region_4(t, h, o, a, c) \ + __bs_nonsingle(wr,4,(t),(h),(o),(a),(c)) +#define bus_space_write_region_8(t, h, o, a, c) \ + __bs_nonsingle(wr,8,(t),(h),(o),(a),(c)) + +#define bus_space_write_region_stream_1(t, h, o, a, c) \ + __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c)) +#define bus_space_write_region_stream_2(t, h, o, a, c) \ + __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c)) +#define bus_space_write_region_stream_4(t, h, o, a, c) \ + __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c)) +#define bus_space_write_region_stream_8(t, h, o, a, c) \ + __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c)) + + +/* + * Set multiple operations. + */ +#define bus_space_set_multi_1(t, h, o, v, c) \ + __bs_set(sm,1,(t),(h),(o),(v),(c)) +#define bus_space_set_multi_2(t, h, o, v, c) \ + __bs_set(sm,2,(t),(h),(o),(v),(c)) +#define bus_space_set_multi_4(t, h, o, v, c) \ + __bs_set(sm,4,(t),(h),(o),(v),(c)) +#define bus_space_set_multi_8(t, h, o, v, c) \ + __bs_set(sm,8,(t),(h),(o),(v),(c)) + + +/* + * Set region operations. + */ +#define bus_space_set_region_1(t, h, o, v, c) \ + __bs_set(sr,1,(t),(h),(o),(v),(c)) +#define bus_space_set_region_2(t, h, o, v, c) \ + __bs_set(sr,2,(t),(h),(o),(v),(c)) +#define bus_space_set_region_4(t, h, o, v, c) \ + __bs_set(sr,4,(t),(h),(o),(v),(c)) +#define bus_space_set_region_8(t, h, o, v, c) \ + __bs_set(sr,8,(t),(h),(o),(v),(c)) + + +/* + * Copy operations. + */ +#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \ + __bs_copy(1, t, h1, o1, h2, o2, c) +#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \ + __bs_copy(2, t, h1, o1, h2, o2, c) +#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \ + __bs_copy(4, t, h1, o1, h2, o2, c) +#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \ + __bs_copy(8, t, h1, o1, h2, o2, c) + +/* + * Macros to provide prototypes for all the functions used in the + * bus_space structure */ -void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, +#define bs_map_proto(f) \ +int __bs_c(f,_bs_map) (void *t, bus_addr_t addr, \ + bus_size_t size, int cacheable, bus_space_handle_t *bshp); + +#define bs_unmap_proto(f) \ +void __bs_c(f,_bs_unmap) (void *t, bus_space_handle_t bsh, \ bus_size_t size); -/* - * Get a new handle for a subregion of an already-mapped area of bus space. - */ +#define bs_subregion_proto(f) \ +int __bs_c(f,_bs_subregion) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, bus_size_t size, \ + bus_space_handle_t *nbshp); -int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp); - -/* - * Allocate a region of memory that is accessible to devices in bus space. - */ - -int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, - bus_addr_t rend, bus_size_t size, bus_size_t align, - bus_size_t boundary, int flags, bus_addr_t *addrp, +#define bs_alloc_proto(f) \ +int __bs_c(f,_bs_alloc) (void *t, bus_addr_t rstart, \ + bus_addr_t rend, bus_size_t size, bus_size_t align, \ + bus_size_t boundary, int cacheable, bus_addr_t *addrp, \ bus_space_handle_t *bshp); -/* - * Free a region of bus space accessible memory. - */ - -void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, +#define bs_free_proto(f) \ +void __bs_c(f,_bs_free) (void *t, bus_space_handle_t bsh, \ bus_size_t size); +#define bs_barrier_proto(f) \ +void __bs_c(f,_bs_barrier) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, bus_size_t len, int flags); -/* - * Read a 1, 2, 4, or 8 byte quantity from bus space - * described by tag/handle/offset. +#define bs_r_1_proto(f) \ +u_int8_t __bs_c(f,_bs_r_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset); + +#define bs_r_2_proto(f) \ +u_int16_t __bs_c(f,_bs_r_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset); + +#define bs_r_4_proto(f) \ +u_int32_t __bs_c(f,_bs_r_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset); + +#define bs_r_8_proto(f) \ +u_int64_t __bs_c(f,_bs_r_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset); + +#define bs_r_1_s_proto(f) \ +u_int8_t __bs_c(f,_bs_r_1_s) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset); + +#define bs_r_2_s_proto(f) \ +u_int16_t __bs_c(f,_bs_r_2_s) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset); + +#define bs_r_4_s_proto(f) \ +u_int32_t __bs_c(f,_bs_r_4_s) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset); + +#define bs_w_1_proto(f) \ +void __bs_c(f,_bs_w_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int8_t value); + +#define bs_w_2_proto(f) \ +void __bs_c(f,_bs_w_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int16_t value); + +#define bs_w_4_proto(f) \ +void __bs_c(f,_bs_w_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int32_t value); + +#define bs_w_8_proto(f) \ +void __bs_c(f,_bs_w_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int64_t value); + +#define bs_w_1_s_proto(f) \ +void __bs_c(f,_bs_w_1_s) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int8_t value); + +#define bs_w_2_s_proto(f) \ +void __bs_c(f,_bs_w_2_s) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int16_t value); + +#define bs_w_4_s_proto(f) \ +void __bs_c(f,_bs_w_4_s) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int32_t value); + +#define bs_rm_1_proto(f) \ +void __bs_c(f,_bs_rm_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int8_t *addr, bus_size_t count); + +#define bs_rm_2_proto(f) \ +void __bs_c(f,_bs_rm_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int16_t *addr, bus_size_t count); + +#define bs_rm_4_proto(f) \ +void __bs_c(f,_bs_rm_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int32_t *addr, bus_size_t count); + +#define bs_rm_8_proto(f) \ +void __bs_c(f,_bs_rm_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int64_t *addr, bus_size_t count); + +#define bs_wm_1_proto(f) \ +void __bs_c(f,_bs_wm_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int8_t *addr, bus_size_t count); + +#define bs_wm_2_proto(f) \ +void __bs_c(f,_bs_wm_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int16_t *addr, bus_size_t count); + +#define bs_wm_4_proto(f) \ +void __bs_c(f,_bs_wm_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int32_t *addr, bus_size_t count); + +#define bs_wm_8_proto(f) \ +void __bs_c(f,_bs_wm_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int64_t *addr, bus_size_t count); + +#define bs_rr_1_proto(f) \ +void __bs_c(f, _bs_rr_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int8_t *addr, bus_size_t count); + +#define bs_rr_2_proto(f) \ +void __bs_c(f, _bs_rr_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int16_t *addr, bus_size_t count); + +#define bs_rr_4_proto(f) \ +void __bs_c(f, _bs_rr_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int32_t *addr, bus_size_t count); + +#define bs_rr_8_proto(f) \ +void __bs_c(f, _bs_rr_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int64_t *addr, bus_size_t count); + +#define bs_wr_1_proto(f) \ +void __bs_c(f, _bs_wr_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int8_t *addr, bus_size_t count); + +#define bs_wr_2_proto(f) \ +void __bs_c(f, _bs_wr_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int16_t *addr, bus_size_t count); + +#define bs_wr_4_proto(f) \ +void __bs_c(f, _bs_wr_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int32_t *addr, bus_size_t count); + +#define bs_wr_8_proto(f) \ +void __bs_c(f, _bs_wr_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, const u_int64_t *addr, bus_size_t count); + +#define bs_sm_1_proto(f) \ +void __bs_c(f,_bs_sm_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int8_t value, bus_size_t count); + +#define bs_sm_2_proto(f) \ +void __bs_c(f,_bs_sm_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int16_t value, bus_size_t count); + +#define bs_sm_4_proto(f) \ +void __bs_c(f,_bs_sm_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int32_t value, bus_size_t count); + +#define bs_sm_8_proto(f) \ +void __bs_c(f,_bs_sm_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int64_t value, bus_size_t count); + +#define bs_sr_1_proto(f) \ +void __bs_c(f,_bs_sr_1) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int8_t value, bus_size_t count); + +#define bs_sr_2_proto(f) \ +void __bs_c(f,_bs_sr_2) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int16_t value, bus_size_t count); + +#define bs_sr_4_proto(f) \ +void __bs_c(f,_bs_sr_4) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int32_t value, bus_size_t count); + +#define bs_sr_8_proto(f) \ +void __bs_c(f,_bs_sr_8) (void *t, bus_space_handle_t bsh, \ + bus_size_t offset, u_int64_t value, bus_size_t count); + +#define bs_c_1_proto(f) \ +void __bs_c(f,_bs_c_1) (void *t, bus_space_handle_t bsh1, \ + bus_size_t offset1, bus_space_handle_t bsh2, \ + bus_size_t offset2, bus_size_t count); + +#define bs_c_2_proto(f) \ +void __bs_c(f,_bs_c_2) (void *t, bus_space_handle_t bsh1, \ + bus_size_t offset1, bus_space_handle_t bsh2, \ + bus_size_t offset2, bus_size_t count); + +#define bs_c_4_proto(f) \ +void __bs_c(f,_bs_c_4) (void *t, bus_space_handle_t bsh1, \ + bus_size_t offset1, bus_space_handle_t bsh2, \ + bus_size_t offset2, bus_size_t count); + +#define bs_c_8_proto(f) \ +void __bs_c(f,_bs_c_8) (void *t, bus_space_handle_t bsh1, \ + bus_size_t offset1, bus_space_handle_t bsh2, \ + bus_size_t offset2, bus_size_t count); + +#define DECLARE_BUS_SPACE_PROTOTYPES(f) \ + bs_map_proto(f); \ + bs_unmap_proto(f); \ + bs_subregion_proto(f); \ + bs_alloc_proto(f); \ + bs_free_proto(f); \ + bs_barrier_proto(f); \ + bs_r_1_proto(f); \ + bs_r_2_proto(f); \ + bs_r_4_proto(f); \ + bs_r_8_proto(f); \ + bs_r_1_s_proto(f); \ + bs_r_2_s_proto(f); \ + bs_r_4_s_proto(f); \ + bs_w_1_proto(f); \ + bs_w_2_proto(f); \ + bs_w_4_proto(f); \ + bs_w_8_proto(f); \ + bs_w_1_s_proto(f); \ + bs_w_2_s_proto(f); \ + bs_w_4_s_proto(f); \ + bs_rm_1_proto(f); \ + bs_rm_2_proto(f); \ + bs_rm_4_proto(f); \ + bs_rm_8_proto(f); \ + bs_wm_1_proto(f); \ + bs_wm_2_proto(f); \ + bs_wm_4_proto(f); \ + bs_wm_8_proto(f); \ + bs_rr_1_proto(f); \ + bs_rr_2_proto(f); \ + bs_rr_4_proto(f); \ + bs_rr_8_proto(f); \ + bs_wr_1_proto(f); \ + bs_wr_2_proto(f); \ + bs_wr_4_proto(f); \ + bs_wr_8_proto(f); \ + bs_sm_1_proto(f); \ + bs_sm_2_proto(f); \ + bs_sm_4_proto(f); \ + bs_sm_8_proto(f); \ + bs_sr_1_proto(f); \ + bs_sr_2_proto(f); \ + bs_sr_4_proto(f); \ + bs_sr_8_proto(f); \ + bs_c_1_proto(f); \ + bs_c_2_proto(f); \ + bs_c_4_proto(f); \ + bs_c_8_proto(f); + +#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t) + +#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF +#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF +#define BUS_SPACE_MAXADDR 0xFFFFFFFF +#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF +#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF +#define BUS_SPACE_MAXSIZE 0xFFFFFFFF + +/* + * declare generic bus space, it suits all needs in */ -static __inline u_int8_t bus_space_read_1(bus_space_tag_t tag, - bus_space_handle_t handle, - bus_size_t offset); - -static __inline u_int16_t bus_space_read_2(bus_space_tag_t tag, - bus_space_handle_t handle, - bus_size_t offset); - -static __inline u_int32_t bus_space_read_4(bus_space_tag_t tag, - bus_space_handle_t handle, - bus_size_t offset); - -static __inline u_int8_t -bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle, - bus_size_t offset) -{ - - if (tag == MIPS_BUS_SPACE_IO) - return (inb(handle + offset)); - return (readb(handle + offset)); -} - -static __inline u_int16_t -bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle, - bus_size_t offset) -{ - - if (tag == MIPS_BUS_SPACE_IO) - return (inw(handle + offset)); - return (readw(handle + offset)); -} - -static __inline u_int32_t -bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle, - bus_size_t offset) -{ - - if (tag == MIPS_BUS_SPACE_IO) - return (inl(handle + offset)); - return (readl(handle + offset)); -} - -#if 0 /* Cause a link error for bus_space_read_8 */ -#define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!! -#endif - -/* - * Read `count' 1, 2, 4, or 8 byte quantities from bus space - * described by tag/handle/offset and copy into buffer provided. - */ -static __inline void bus_space_read_multi_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, - size_t count); - -static __inline void bus_space_read_multi_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, - size_t count); - -static __inline void bus_space_read_multi_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, - size_t count); - -static __inline void -bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, size_t count) -{ - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - *addr++ = inb(bsh + offset); - else - while (count--) - *addr++ = readb(bsh + offset); -} - -static __inline void -bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - *addr++ = inw(baddr); - else - while (count--) - *addr++ = readw(baddr); -} - -static __inline void -bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - *addr++ = inl(baddr); - else - while (count--) - *addr++ = readl(baddr); -} - -#if 0 /* Cause a link error for bus_space_read_multi_8 */ -#define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! -#endif - -/* - * Read `count' 1, 2, 4, or 8 byte quantities from bus space - * described by tag/handle and starting at `offset' and copy into - * buffer provided. - */ -static __inline void bus_space_read_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, - size_t count); - -static __inline void bus_space_read_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, - size_t count); - -static __inline void bus_space_read_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, - size_t count); - - -static __inline void -bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) { - *addr++ = inb(baddr); - baddr += 1; - } - else - while (count--) { - *addr++ = readb(baddr); - baddr += 1; - } -} - -static __inline void -bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) { - *addr++ = inw(baddr); - baddr += 2; - } - else - while (count--) { - *addr++ = readw(baddr); - baddr += 2; - } -} - -static __inline void -bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) { - *addr++ = inl(baddr); - baddr += 4; - } - else - while (count--) { - *addr++ = readb(baddr); - baddr += 4; - } -} - -#if 0 /* Cause a link error for bus_space_read_region_8 */ -#define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! -#endif - -/* - * Write the 1, 2, 4, or 8 byte value `value' to bus space - * described by tag/handle/offset. - */ - -static __inline void bus_space_write_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value); - -static __inline void bus_space_write_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value); - -static __inline void bus_space_write_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value); - -static __inline void -bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value) -{ - - if (tag == MIPS_BUS_SPACE_IO) - outb(bsh + offset, value); - else - writeb(bsh + offset, value); -} - -static __inline void -bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value) -{ - - if (tag == MIPS_BUS_SPACE_IO) - outw(bsh + offset, value); - else - writew(bsh + offset, value); -} - -static __inline void -bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value) -{ - - if (tag == MIPS_BUS_SPACE_IO) - outl(bsh + offset, value); - else - writel(bsh + offset, value); -} - -#if 0 /* Cause a link error for bus_space_write_8 */ -#define bus_space_write_8 !!! bus_space_write_8 not implemented !!! -#endif - -/* - * Write `count' 1, 2, 4, or 8 byte quantities from the buffer - * provided to bus space described by tag/handle/offset. - */ - -static __inline void bus_space_write_multi_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int8_t *addr, - size_t count); -static __inline void bus_space_write_multi_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int16_t *addr, - size_t count); - -static __inline void bus_space_write_multi_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int32_t *addr, - size_t count); - -static __inline void -bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int8_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - outb(baddr, *addr++); - else - while (count--) - writeb(baddr, *addr++); -} - -static __inline void -bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int16_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - outw(baddr, *addr++); - else - while (count--) - writew(baddr, *addr++); -} - -static __inline void -bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int32_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - outl(baddr, *addr++); - else - while (count--) - writel(baddr, *addr++); -} - -#if 0 /* Cause a link error for bus_space_write_multi_8 */ -#define bus_space_write_multi_8(t, h, o, a, c) \ - !!! bus_space_write_multi_8 unimplemented !!! -#endif - -/* - * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided - * to bus space described by tag/handle starting at `offset'. - */ - -static __inline void bus_space_write_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int8_t *addr, - size_t count); -static __inline void bus_space_write_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int16_t *addr, - size_t count); -static __inline void bus_space_write_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int32_t *addr, - size_t count); - -static __inline void -bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int8_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) { - outb(baddr, *addr++); - baddr += 1; - } - else - while (count--) { - writeb(baddr, *addr++); - baddr += 1; - } -} - -static __inline void -bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int16_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) { - outw(baddr, *addr++); - baddr += 2; - } - else - while (count--) { - writew(baddr, *addr++); - baddr += 2; - } -} - -static __inline void -bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int32_t *addr, size_t count) -{ - bus_addr_t baddr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) { - outl(baddr, *addr++); - baddr += 4; - } - else - while (count--) { - writel(baddr, *addr++); - baddr += 4; - } -} - -#if 0 /* Cause a link error for bus_space_write_region_8 */ -#define bus_space_write_region_8 \ - !!! bus_space_write_region_8 unimplemented !!! -#endif - -/* - * Write the 1, 2, 4, or 8 byte value `val' to bus space described - * by tag/handle/offset `count' times. - */ - -static __inline void bus_space_set_multi_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - u_int8_t value, size_t count); -static __inline void bus_space_set_multi_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - u_int16_t value, size_t count); -static __inline void bus_space_set_multi_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - u_int32_t value, size_t count); - -static __inline void -bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value, size_t count) -{ - bus_addr_t addr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - outb(addr, value); - else - while (count--) - writeb(addr, value); -} - -static __inline void -bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value, size_t count) -{ - bus_addr_t addr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - outw(addr, value); - else - while (count--) - writew(addr, value); -} - -static __inline void -bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value, size_t count) -{ - bus_addr_t addr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - while (count--) - outl(addr, value); - else - while (count--) - writel(addr, value); -} - -#if 0 /* Cause a link error for bus_space_set_multi_8 */ -#define bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!! -#endif - -/* - * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described - * by tag/handle starting at `offset'. - */ - -static __inline void bus_space_set_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value, - size_t count); -static __inline void bus_space_set_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value, - size_t count); -static __inline void bus_space_set_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value, - size_t count); - -static __inline void -bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value, size_t count) -{ - bus_addr_t addr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - for (; count != 0; count--, addr++) - outb(addr, value); - else - for (; count != 0; count--, addr++) - writeb(addr, value); -} - -static __inline void -bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value, size_t count) -{ - bus_addr_t addr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - for (; count != 0; count--, addr += 2) - outw(addr, value); - else - for (; count != 0; count--, addr += 2) - writew(addr, value); -} - -static __inline void -bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value, size_t count) -{ - bus_addr_t addr = bsh + offset; - - if (tag == MIPS_BUS_SPACE_IO) - for (; count != 0; count--, addr += 4) - outl(addr, value); - else - for (; count != 0; count--, addr += 4) - writel(addr, value); -} - -#if 0 /* Cause a link error for bus_space_set_region_8 */ -#define bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!! -#endif - -/* - * Copy `count' 1, 2, 4, or 8 byte values from bus space starting - * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. - */ - -static __inline void bus_space_copy_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh1, - bus_size_t off1, - bus_space_handle_t bsh2, - bus_size_t off2, size_t count); - -static __inline void bus_space_copy_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh1, - bus_size_t off1, - bus_space_handle_t bsh2, - bus_size_t off2, size_t count); - -static __inline void bus_space_copy_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh1, - bus_size_t off1, - bus_space_handle_t bsh2, - bus_size_t off2, size_t count); - -static __inline void -bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1, - bus_size_t off1, bus_space_handle_t bsh2, - bus_size_t off2, size_t count) -{ - bus_addr_t addr1 = bsh1 + off1; - bus_addr_t addr2 = bsh2 + off2; - - if (tag == MIPS_BUS_SPACE_IO) - { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; count != 0; count--, addr1++, addr2++) - outb(addr2, inb(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += (count - 1), addr2 += (count - 1); - count != 0; count--, addr1--, addr2--) - outb(addr2, inb(addr1)); - } - } else { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; count != 0; count--, addr1++, addr2++) - writeb(addr2, readb(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += (count - 1), addr2 += (count - 1); - count != 0; count--, addr1--, addr2--) - writeb(addr2, readb(addr1)); - } - } -} - -static __inline void -bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1, - bus_size_t off1, bus_space_handle_t bsh2, - bus_size_t off2, size_t count) -{ - bus_addr_t addr1 = bsh1 + off1; - bus_addr_t addr2 = bsh2 + off2; - - if (tag == MIPS_BUS_SPACE_IO) - { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; count != 0; count--, addr1 += 2, addr2 += 2) - outw(addr2, inw(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1); - count != 0; count--, addr1 -= 2, addr2 -= 2) - outw(addr2, inw(addr1)); - } - } else { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; count != 0; count--, addr1 += 2, addr2 += 2) - writew(addr2, readw(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1); - count != 0; count--, addr1 -= 2, addr2 -= 2) - writew(addr2, readw(addr1)); - } - } -} - -static __inline void -bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1, - bus_size_t off1, bus_space_handle_t bsh2, - bus_size_t off2, size_t count) -{ - bus_addr_t addr1 = bsh1 + off1; - bus_addr_t addr2 = bsh2 + off2; - - if (tag == MIPS_BUS_SPACE_IO) - { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; count != 0; count--, addr1 += 4, addr2 += 4) - outl(addr2, inl(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1); - count != 0; count--, addr1 -= 4, addr2 -= 4) - outl(addr2, inl(addr1)); - } - } else { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; count != 0; count--, addr1 += 4, addr2 += 4) - writel(addr2, readl(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1); - count != 0; count--, addr1 -= 4, addr2 -= 4) - writel(addr2, readl(addr1)); - } - } -} - - -#if 0 /* Cause a link error for bus_space_copy_8 */ -#define bus_space_copy_region_8 !!! bus_space_copy_region_8 unimplemented !!! -#endif - - -/* - * Bus read/write barrier methods. - * - * void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, - * bus_size_t offset, bus_size_t len, int flags); - * - * - * Note that BUS_SPACE_BARRIER_WRITE doesn't do anything other than - * prevent reordering by the compiler; all Intel x86 processors currently - * retire operations outside the CPU in program order. - */ -#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ -#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ - -static __inline void -bus_space_barrier(bus_space_tag_t tag __unused, bus_space_handle_t bsh __unused, - bus_size_t offset __unused, bus_size_t len __unused, int flags) -{ -#if 0 -#ifdef __GNUCLIKE_ASM - if (flags & BUS_SPACE_BARRIER_READ) - __asm __volatile("lock; addl $0,0(%%rsp)" : : : "memory"); - else - __asm __volatile("" : : : "memory"); -#endif -#endif -} - -#ifdef BUS_SPACE_NO_LEGACY -#undef inb -#undef outb -#define inb(a) compiler_error -#define inw(a) compiler_error -#define inl(a) compiler_error -#define outb(a, b) compiler_error -#define outw(a, b) compiler_error -#define outl(a, b) compiler_error +DECLARE_BUS_SPACE_PROTOTYPES(generic); +extern bus_space_tag_t mips_bus_space_generic; +/* Special bus space for RMI processors */ +#ifdef TARGET_XLR_XLS +extern bus_space_tag_t rmi_bus_space; +extern bus_space_tag_t rmi_pci_bus_space; #endif #include -/* - * Stream accesses are the same as normal accesses on amd64; there are no - * supported bus systems with an endianess different from the host one. - */ -#define bus_space_read_stream_1(t, h, o) bus_space_read_1((t), (h), (o)) -#define bus_space_read_stream_2(t, h, o) bus_space_read_2((t), (h), (o)) -#define bus_space_read_stream_4(t, h, o) bus_space_read_4((t), (h), (o)) - -#define bus_space_read_multi_stream_1(t, h, o, a, c) \ - bus_space_read_multi_1((t), (h), (o), (a), (c)) -#define bus_space_read_multi_stream_2(t, h, o, a, c) \ - bus_space_read_multi_2((t), (h), (o), (a), (c)) -#define bus_space_read_multi_stream_4(t, h, o, a, c) \ - bus_space_read_multi_4((t), (h), (o), (a), (c)) - -#define bus_space_write_stream_1(t, h, o, v) \ - bus_space_write_1((t), (h), (o), (v)) -#define bus_space_write_stream_2(t, h, o, v) \ - bus_space_write_2((t), (h), (o), (v)) -#define bus_space_write_stream_4(t, h, o, v) \ - bus_space_write_4((t), (h), (o), (v)) - -#define bus_space_write_multi_stream_1(t, h, o, a, c) \ - bus_space_write_multi_1((t), (h), (o), (a), (c)) -#define bus_space_write_multi_stream_2(t, h, o, a, c) \ - bus_space_write_multi_2((t), (h), (o), (a), (c)) -#define bus_space_write_multi_stream_4(t, h, o, a, c) \ - bus_space_write_multi_4((t), (h), (o), (a), (c)) - -#define bus_space_set_multi_stream_1(t, h, o, v, c) \ - bus_space_set_multi_1((t), (h), (o), (v), (c)) -#define bus_space_set_multi_stream_2(t, h, o, v, c) \ - bus_space_set_multi_2((t), (h), (o), (v), (c)) -#define bus_space_set_multi_stream_4(t, h, o, v, c) \ - bus_space_set_multi_4((t), (h), (o), (v), (c)) - -#define bus_space_read_region_stream_1(t, h, o, a, c) \ - bus_space_read_region_1((t), (h), (o), (a), (c)) -#define bus_space_read_region_stream_2(t, h, o, a, c) \ - bus_space_read_region_2((t), (h), (o), (a), (c)) -#define bus_space_read_region_stream_4(t, h, o, a, c) \ - bus_space_read_region_4((t), (h), (o), (a), (c)) - -#define bus_space_write_region_stream_1(t, h, o, a, c) \ - bus_space_write_region_1((t), (h), (o), (a), (c)) -#define bus_space_write_region_stream_2(t, h, o, a, c) \ - bus_space_write_region_2((t), (h), (o), (a), (c)) -#define bus_space_write_region_stream_4(t, h, o, a, c) \ - bus_space_write_region_4((t), (h), (o), (a), (c)) - -#define bus_space_set_region_stream_1(t, h, o, v, c) \ - bus_space_set_region_1((t), (h), (o), (v), (c)) -#define bus_space_set_region_stream_2(t, h, o, v, c) \ - bus_space_set_region_2((t), (h), (o), (v), (c)) -#define bus_space_set_region_stream_4(t, h, o, v, c) \ - bus_space_set_region_4((t), (h), (o), (v), (c)) - -#define bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_1((t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_2((t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_4((t), (h1), (o1), (h2), (o2), (c)) - -#endif /* !TARGET_OCTEON */ -#endif /* !_MACHINE_BUS_H_ */ +#endif /* _MACHINE_BUS_H_ */ diff --git a/sys/mips/include/bus_octeon.h b/sys/mips/include/bus_octeon.h deleted file mode 100644 index be538ba825c1..000000000000 --- a/sys/mips/include/bus_octeon.h +++ /dev/null @@ -1,883 +0,0 @@ -/*- - * Copyright (c) 2006 Oleksandr Tymoshenko. - * Copyright (c) KATO Takenori, 1999. - * - * All rights reserved. Unpublished rights reserved under the copyright - * laws of Japan. - * - * 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 as - * the first lines of this file unmodified. - * 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 ``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 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$ - */ - -/* $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $ */ - -/*- - * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, - * NASA Ames Research Center. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -/*- - * Copyright (c) 1996 Charles M. Hannum. All rights reserved. - * Copyright (c) 1996 Christopher G. Demetriou. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Christopher G. Demetriou - * for the NetBSD Project. - * 4. 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 ``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 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 _MIPS_BUS_OCTEON_H_ -#define _MIPS_BUS_OCTEON_H_ - -#include "../../mips32/octeon32/octeon_pcmap_regs.h" -#include -#include - -/* - * Values for the mips64 bus space tag, not to be used directly by MI code. - */ -#define MIPS_BUS_SPACE_IO 0 /* space is i/o space */ -#define MIPS_BUS_SPACE_MEM 1 /* space is mem space */ - -#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF -#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXSIZE 0xFFFFFFFF -#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF -#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXADDR 0xFFFFFFFF - -#define BUS_SPACE_UNRESTRICTED (~0) - -/* - * Map a region of device bus space into CPU virtual address space. - */ - -static __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr, - bus_size_t size, int flags, - bus_space_handle_t *bshp); - -static __inline int -bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr, - bus_size_t size __unused, int flags __unused, - bus_space_handle_t *bshp) -{ - - *bshp = addr; - return (0); -} - -/* - * Unmap a region of device bus space. - */ - -static __inline void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t size); - -static __inline void -bus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused, - bus_size_t size __unused) -{ -} - -/* - * Get a new handle for a subregion of an already-mapped area of bus space. - */ - -static __inline int bus_space_subregion(bus_space_tag_t t, - bus_space_handle_t bsh, - bus_size_t offset, bus_size_t size, - bus_space_handle_t *nbshp); - -static __inline int -bus_space_subregion(bus_space_tag_t t __unused, bus_space_handle_t bsh, - bus_size_t offset, bus_size_t size __unused, - bus_space_handle_t *nbshp) -{ - *nbshp = bsh + offset; - return (0); -} - -/* - * Allocate a region of memory that is accessible to devices in bus space. - */ - -int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart, - bus_addr_t rend, bus_size_t size, bus_size_t align, - bus_size_t boundary, int flags, bus_addr_t *addrp, - bus_space_handle_t *bshp); - -/* - * Free a region of bus space accessible memory. - */ - -static __inline void bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t size); - -static __inline void -bus_space_free(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused, - bus_size_t size __unused) -{ -} - - -/* - * Read a 1, 2, 4, or 8 byte quantity from bus space - * described by tag/handle/offset. - */ -static __inline u_int8_t bus_space_read_1(bus_space_tag_t tag, - bus_space_handle_t handle, - bus_size_t offset); - -static __inline u_int16_t bus_space_read_2(bus_space_tag_t tag, - bus_space_handle_t handle, - bus_size_t offset); - -static __inline u_int32_t bus_space_read_4(bus_space_tag_t tag, - bus_space_handle_t handle, - bus_size_t offset); - -static __inline u_int8_t -bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle, - bus_size_t offset) -{ - uint64_t ret_val; - uint64_t oct64_addr; - - oct64_addr = handle + offset; - ret_val = oct_read8(oct64_addr); - return ((u_int8_t) ret_val); -} - -static __inline u_int16_t -bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle, - bus_size_t offset) -{ - uint64_t ret_val; - uint64_t oct64_addr; - - oct64_addr = handle + offset; - ret_val = oct_read16(oct64_addr); - return ((u_int16_t) ret_val); -} - -static __inline u_int32_t -bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle, - bus_size_t offset) -{ - uint64_t ret_val; - uint64_t oct64_addr; - - oct64_addr = handle + offset; - ret_val = oct_read32(oct64_addr); - return ((u_int32_t) ret_val); -} - - -static __inline u_int64_t -bus_space_read_8(bus_space_tag_t tag, bus_space_handle_t handle, - bus_size_t offset) -{ - uint64_t ret_val; - uint64_t oct64_addr; - - oct64_addr = handle + offset; - ret_val = oct_read64(oct64_addr); - return (ret_val); -} - - -/* - * Read `count' 1, 2, 4, or 8 byte quantities from bus space - * described by tag/handle/offset and copy into buffer provided. - */ -static __inline void bus_space_read_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, - size_t count); - -static __inline void bus_space_read_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, - size_t count); - -static __inline void bus_space_read_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, - size_t count); - -static __inline void -bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr++) { - *addr = oct_read8(ptr); - } -} - -static __inline void -bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr+=2) { - *addr = oct_read16(ptr); - } -} - -static __inline void -bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr+=4) { - *addr = oct_read32(ptr); - } -} - -static __inline void -bus_space_read_region_8(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int64_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr+=4) { - *addr = oct_read64(ptr); - } -} - -/* - * Read `count' 1, 2, 4, or 8 byte quantities from bus space - * described by tag/handle and starting at `offset' and copy into - * buffer provided. - */ -static __inline void bus_space_read_multi_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, - size_t count); - -static __inline void bus_space_read_multi_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, - size_t count); - -static __inline void bus_space_read_multi_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, - size_t count); - - -static __inline void -bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - *addr = oct_read8(ptr); - } -} - -static __inline void -bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - *addr = oct_read16(ptr); - } -} - -static __inline void -bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - *addr = oct_read32(ptr); - } -} - -static __inline void -bus_space_read_multi_8(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int64_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - *addr = oct_read64(ptr); - } -} - - -/* - * Write the 1, 2, 4, or 8 byte value `value' to bus space - * described by tag/handle/offset. - */ - -static __inline void bus_space_write_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value); - -static __inline void bus_space_write_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value); - -static __inline void bus_space_write_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value); - -static __inline void -bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value) -{ - oct_write8(bsh+offset, value); -} - -static __inline void -bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value) -{ - oct_write16(bsh+offset, value); -} - -static __inline void -bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value) -{ - oct_write32(bsh+offset, value); -} - -static __inline void -bus_space_write_8(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int64_t value) -{ - oct_write64(bsh+offset, value); -} - -/* - * Write `count' 1, 2, 4, or 8 byte quantities from the buffer - * provided to bus space described by tag/handle/offset. - */ - -static __inline void bus_space_write_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int8_t *addr, - size_t count); -static __inline void bus_space_write_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int16_t *addr, - size_t count); - -static __inline void bus_space_write_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int32_t *addr, - size_t count); - -static __inline void -bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int8_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr++) { - oct_write8(ptr, *addr); - } -} - -static __inline void -bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int16_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr++) { - oct_write16(ptr, *addr); - } -} - -static __inline void -bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int32_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr++) { - oct_write32(ptr, *addr); - } -} - -static __inline void -bus_space_write_region_8(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int64_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++, ptr++) { - oct_write64(ptr, *addr); - } -} - -/* - * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided - * to bus space described by tag/handle starting at `offset'. - */ - -static __inline void bus_space_write_multi_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int8_t *addr, - size_t count); -static __inline void bus_space_write_multi_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int16_t *addr, - size_t count); -static __inline void bus_space_write_multi_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - const u_int32_t *addr, - size_t count); - -static __inline void -bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int8_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - oct_write8(ptr, *addr); - } -} - -static __inline void -bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int16_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - oct_write16(ptr, *addr); - } -} - -static __inline void -bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int32_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - oct_write32(ptr, *addr); - } -} - -static __inline void -bus_space_write_multi_8(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, const u_int64_t *addr, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, addr++) { - oct_write64(ptr, *addr); - } -} - -/* - * Write the 1, 2, 4, or 8 byte value `val' to bus space described - * by tag/handle/offset `count' times. - */ - -static __inline void bus_space_set_multi_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - u_int8_t value, size_t count); -static __inline void bus_space_set_multi_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - u_int16_t value, size_t count); -static __inline void bus_space_set_multi_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, - u_int32_t value, size_t count); - -static __inline void -bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--) { - oct_write8(ptr, value); - } -} - -static __inline void -bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--) { - oct_write16(ptr, value); - } -} - -static __inline void -bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--) { - oct_write32(ptr, value); - } -} - -static __inline void -bus_space_set_multi_8(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int64_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--) { - oct_write64(ptr, value); - } -} - -/* - * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described - * by tag/handle starting at `offset'. - */ - -static __inline void bus_space_set_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value, - size_t count); -static __inline void bus_space_set_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value, - size_t count); -static __inline void bus_space_set_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value, - size_t count); - -static __inline void -bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int8_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, ptr++) { - oct_write8(ptr, value); - } -} - -static __inline void -bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int16_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, ptr++) { - oct_write16(ptr, value); - } -} - -static __inline void -bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int32_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, ptr++) { - oct_write32(ptr, value); - } -} - -static __inline void -bus_space_set_region_8(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, u_int64_t value, size_t count) -{ - uint64_t ptr = ((uint64_t) bsh + (uint64_t) offset); - - for(; count > 0; count--, ptr++) { - oct_write64(ptr, value); - } -} - -/* - * Copy `count' 1, 2, 4, or 8 byte values from bus space starting - * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. - */ - -static __inline void bus_space_copy_region_1(bus_space_tag_t tag, - bus_space_handle_t bsh1, - bus_size_t off1, - bus_space_handle_t bsh2, - bus_size_t off2, size_t count); - -static __inline void bus_space_copy_region_2(bus_space_tag_t tag, - bus_space_handle_t bsh1, - bus_size_t off1, - bus_space_handle_t bsh2, - bus_size_t off2, size_t count); - -static __inline void bus_space_copy_region_4(bus_space_tag_t tag, - bus_space_handle_t bsh1, - bus_size_t off1, - bus_space_handle_t bsh2, - bus_size_t off2, size_t count); - -static __inline void -bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1, - bus_size_t off1, bus_space_handle_t bsh2, - bus_size_t off2, size_t count) -{ - uint64_t ptr1 = ((uint64_t) bsh1 + (uint64_t) off1); - uint64_t ptr2 = ((uint64_t) bsh2 + (uint64_t) off2); - uint8_t val; - - for(; count > 0; count--, ptr1++, ptr2++) { - val = oct_read8(ptr1); - oct_write8(ptr2, val); - } -} - -static __inline void -bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1, - bus_size_t off1, bus_space_handle_t bsh2, - bus_size_t off2, size_t count) -{ - uint64_t ptr1 = ((uint64_t) bsh1 + (uint64_t) off1); - uint64_t ptr2 = ((uint64_t) bsh2 + (uint64_t) off2); - uint16_t val; - - for(; count > 0; count--, ptr1++, ptr2++) { - val = oct_read16(ptr1); - oct_write16(ptr2, val); - } -} - -static __inline void -bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1, - bus_size_t off1, bus_space_handle_t bsh2, - bus_size_t off2, size_t count) -{ - uint64_t ptr1 = ((uint64_t) bsh1 + (uint64_t) off1); - uint64_t ptr2 = ((uint64_t) bsh2 + (uint64_t) off2); - uint32_t val; - - for(; count > 0; count--, ptr1++, ptr2++) { - val = oct_read32(ptr1); - oct_write32(ptr2, val); - } -} - -static __inline void -bus_space_copy_region_8(bus_space_tag_t tag, bus_space_handle_t bsh1, - bus_size_t off1, bus_space_handle_t bsh2, - bus_size_t off2, size_t count) -{ - uint64_t ptr1 = ((uint64_t) bsh1 + (uint64_t) off1); - uint64_t ptr2 = ((uint64_t) bsh2 + (uint64_t) off2); - uint64_t val; - - for(; count > 0; count--, ptr1++, ptr2++) { - val = oct_read64(ptr1); - oct_write64(ptr2, val); - } -} - -/* - * Bus read/write barrier methods. - * - * void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, - * bus_size_t offset, bus_size_t len, int flags); - * - * - * Note that BUS_SPACE_BARRIER_WRITE doesn't do anything other than - * prevent reordering by the compiler; all Intel x86 processors currently - * retire operations outside the CPU in program order. - */ -#define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ -#define BUS_SPACE_BARRIER_WRITE 0x02 /* force write barrier */ - -static __inline void -bus_space_barrier(bus_space_tag_t tag __unused, bus_space_handle_t bsh __unused, - bus_size_t offset __unused, bus_size_t len __unused, int flags) -{ -#if 0 -#ifdef __GNUCLIKE_ASM - if (flags & BUS_SPACE_BARRIER_READ) - __asm __volatile("lock; addl $0,0(%%rsp)" : : : "memory"); - else - __asm __volatile("" : : : "memory"); -#endif -#endif - oct_read64(OCTEON_MIO_BOOT_BIST_STAT); -} - -#ifdef BUS_SPACE_NO_LEGACY -#undef inb -#undef outb -#define inb(a) compiler_error -#define inw(a) compiler_error -#define inl(a) compiler_error -#define outb(a, b) compiler_error -#define outw(a, b) compiler_error -#define outl(a, b) compiler_error -#endif - -#include - -/* - * Stream accesses are the same as normal accesses on amd64; there are no - * supported bus systems with an endianess different from the host one. - */ -#define bus_space_read_stream_1(t, h, o) bus_space_read_1((t), (h), (o)) -#define bus_space_read_stream_2(t, h, o) bus_space_read_2((t), (h), (o)) -#define bus_space_read_stream_4(t, h, o) bus_space_read_4((t), (h), (o)) - -#define bus_space_read_multi_stream_1(t, h, o, a, c) \ - bus_space_read_multi_1((t), (h), (o), (a), (c)) -#define bus_space_read_multi_stream_2(t, h, o, a, c) \ - bus_space_read_multi_2((t), (h), (o), (a), (c)) -#define bus_space_read_multi_stream_4(t, h, o, a, c) \ - bus_space_read_multi_4((t), (h), (o), (a), (c)) - -#define bus_space_write_stream_1(t, h, o, v) \ - bus_space_write_1((t), (h), (o), (v)) -#define bus_space_write_stream_2(t, h, o, v) \ - bus_space_write_2((t), (h), (o), (v)) -#define bus_space_write_stream_4(t, h, o, v) \ - bus_space_write_4((t), (h), (o), (v)) - -#define bus_space_write_multi_stream_1(t, h, o, a, c) \ - bus_space_write_multi_1((t), (h), (o), (a), (c)) -#define bus_space_write_multi_stream_2(t, h, o, a, c) \ - bus_space_write_multi_2((t), (h), (o), (a), (c)) -#define bus_space_write_multi_stream_4(t, h, o, a, c) \ - bus_space_write_multi_4((t), (h), (o), (a), (c)) - -#define bus_space_set_multi_stream_1(t, h, o, v, c) \ - bus_space_set_multi_1((t), (h), (o), (v), (c)) -#define bus_space_set_multi_stream_2(t, h, o, v, c) \ - bus_space_set_multi_2((t), (h), (o), (v), (c)) -#define bus_space_set_multi_stream_4(t, h, o, v, c) \ - bus_space_set_multi_4((t), (h), (o), (v), (c)) - -#define bus_space_read_region_stream_1(t, h, o, a, c) \ - bus_space_read_region_1((t), (h), (o), (a), (c)) -#define bus_space_read_region_stream_2(t, h, o, a, c) \ - bus_space_read_region_2((t), (h), (o), (a), (c)) -#define bus_space_read_region_stream_4(t, h, o, a, c) \ - bus_space_read_region_4((t), (h), (o), (a), (c)) - -#define bus_space_write_region_stream_1(t, h, o, a, c) \ - bus_space_write_region_1((t), (h), (o), (a), (c)) -#define bus_space_write_region_stream_2(t, h, o, a, c) \ - bus_space_write_region_2((t), (h), (o), (a), (c)) -#define bus_space_write_region_stream_4(t, h, o, a, c) \ - bus_space_write_region_4((t), (h), (o), (a), (c)) - -#define bus_space_set_region_stream_1(t, h, o, v, c) \ - bus_space_set_region_1((t), (h), (o), (v), (c)) -#define bus_space_set_region_stream_2(t, h, o, v, c) \ - bus_space_set_region_2((t), (h), (o), (v), (c)) -#define bus_space_set_region_stream_4(t, h, o, v, c) \ - bus_space_set_region_4((t), (h), (o), (v), (c)) - -#define bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_1((t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_2((t), (h1), (o1), (h2), (o2), (c)) -#define bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \ - bus_space_copy_region_4((t), (h1), (o1), (h2), (o2), (c)) - -#endif /* _MIPS_BUS_OCTEON_H_ */ diff --git a/sys/mips/include/cache.h b/sys/mips/include/cache.h index 8f22cdb381a3..d73daa211d1e 100644 --- a/sys/mips/include/cache.h +++ b/sys/mips/include/cache.h @@ -37,6 +37,9 @@ * $FreeBSD$ */ +#ifndef _MACHINE_CACHE_H_ +#define _MACHINE_CACHE_H_ + /* * Cache operations. * @@ -156,50 +159,8 @@ struct mips_cache_ops { extern struct mips_cache_ops mips_cache_ops; /* PRIMARY CACHE VARIABLES */ -extern u_int mips_picache_size; -extern u_int mips_picache_line_size; -extern u_int mips_picache_ways; -extern u_int mips_picache_way_size; -extern u_int mips_picache_way_mask; - -extern u_int mips_pdcache_size; /* and unified */ -extern u_int mips_pdcache_line_size; -extern u_int mips_pdcache_ways; -extern u_int mips_pdcache_way_size; -extern u_int mips_pdcache_way_mask; -extern int mips_pdcache_write_through; - -extern int mips_pcache_unified; - -/* SECONDARY CACHE VARIABLES */ -extern u_int mips_sicache_size; -extern u_int mips_sicache_line_size; -extern u_int mips_sicache_ways; -extern u_int mips_sicache_way_size; -extern u_int mips_sicache_way_mask; - -extern u_int mips_sdcache_size; /* and unified */ -extern u_int mips_sdcache_line_size; -extern u_int mips_sdcache_ways; -extern u_int mips_sdcache_way_size; -extern u_int mips_sdcache_way_mask; -extern int mips_sdcache_write_through; - -extern int mips_scache_unified; - -/* TERTIARY CACHE VARIABLES */ -extern u_int mips_tcache_size; /* always unified */ -extern u_int mips_tcache_line_size; -extern u_int mips_tcache_ways; -extern u_int mips_tcache_way_size; -extern u_int mips_tcache_way_mask; -extern int mips_tcache_write_through; - -extern u_int mips_dcache_align; -extern u_int mips_dcache_align_mask; - -extern u_int mips_cache_alias_mask; -extern u_int mips_cache_prefer_mask; +extern int mips_picache_linesize; +extern int mips_pdcache_linesize; #define __mco_noargs(prefix, x) \ do { \ @@ -259,3 +220,4 @@ void mips_config_cache(struct mips_cpuinfo *); void mips_dcache_compute_align(void); #include +#endif /* _MACHINE_CACHE_H_ */ diff --git a/sys/mips/include/cache_mipsNN.h b/sys/mips/include/cache_mipsNN.h index e44746a25238..9933e74b452c 100644 --- a/sys/mips/include/cache_mipsNN.h +++ b/sys/mips/include/cache_mipsNN.h @@ -36,6 +36,8 @@ * * $FreeBSD$ */ +#ifndef _MACHINE_CACHE_MIPSNN_H_ +#define _MACHINE_CACHE_MIPSNN_H_ void mipsNN_cache_init(struct mips_cpuinfo *); @@ -65,3 +67,5 @@ void mipsNN_pdcache_wbinv_range_index_128(vm_offset_t, vm_size_t); void mipsNN_pdcache_inv_range_128(vm_offset_t, vm_size_t); void mipsNN_pdcache_wb_range_128(vm_offset_t, vm_size_t); #endif + +#endif /* _MACHINE_CACHE_MIPSNN_H_ */ diff --git a/sys/mips/include/cdefs.h b/sys/mips/include/cdefs.h new file mode 100644 index 000000000000..181d6ee618c7 --- /dev/null +++ b/sys/mips/include/cdefs.h @@ -0,0 +1,76 @@ +/* $NetBSD: cdefs.h,v 1.12 2006/08/27 19:04:30 matt Exp $ */ + +/* + * Copyright (c) 1995 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + * + * $FreeBSD$ + */ + +#ifndef _MIPS_CDEFS_H_ +#define _MIPS_CDEFS_H_ + +/* + * These are depreciated. Use __mips_{o32,o64,n32,n64} instead. + */ +/* MIPS Subprogram Interface Model */ +#define _MIPS_SIM_ABIX32 4 /* 64 bit safe, ILP32 o32 model */ +#define _MIPS_SIM_ABI64 3 +#define _MIPS_SIM_NABI32 2 /* 64bit safe, ILP32 n32 model */ +#define _MIPS_SIM_ABI32 1 + +#define _MIPS_BSD_API_LP32 _MIPS_SIM_ABI32 +#define _MIPS_BSD_API_LP32_64CLEAN _MIPS_SIM_ABIX32 +#define _MIPS_BSD_API_LP64 _MIPS_SIM_ABI64 + +#define _MIPS_BSD_API_O32 _MIPS_SIM_ABI32 +#define _MIPS_BSD_API_O64 _MIPS_SIM_ABIX32 +#define _MIPS_BSD_API_N32 _MIPS_SIM_NABI32 +#define _MIPS_BSD_API_N64 _MIPS_SIM_ABI64 + +#define _MIPS_SIM_NEWABI_P(abi) ((abi) == _MIPS_SIM_NABI32 || \ + (abi) == _MIPS_SIM_ABI64) + +#define _MIPS_SIM_LP64_P(abi) ((abi) == _MIPS_SIM_ABIX32 || \ + (abi) == _MIPS_SIM_ABI64) + +#if defined(__mips_n64) +#define _MIPS_BSD_API _MIPS_BSD_API_N64 +#elif defined(__mips_n32) +#define _MIPS_BSD_API _MIPS_BSD_API_N32 +#elif defined(__mips_o64) +#define _MIPS_BSD_API _MIPS_BSD_API_O64 +#else +#define _MIPS_BSD_API _MIPS_BSD_API_O32 +#endif + +#define _MIPS_ISA_MIPS1 1 +#define _MIPS_ISA_MIPS2 2 +#define _MIPS_ISA_MIPS3 3 +#define _MIPS_ISA_MIPS4 4 +#define _MIPS_ISA_MIPS32 5 +#define _MIPS_ISA_MIPS64 6 + +#endif /* !_MIPS_CDEFS_H_ */ diff --git a/sys/mips/include/cpu.h b/sys/mips/include/cpu.h index 20b41e2a0271..5a1cb9da1ce4 100644 --- a/sys/mips/include/cpu.h +++ b/sys/mips/include/cpu.h @@ -56,21 +56,30 @@ #define MIPS_RESERVED_ADDR 0xbfc80000 #define MIPS_KSEG0_LARGEST_PHYS 0x20000000 -#define MIPS_CACHED_TO_PHYS(x) ((unsigned)(x) & 0x1fffffff) -#define MIPS_PHYS_TO_CACHED(x) ((unsigned)(x) | MIPS_CACHED_MEMORY_ADDR) -#define MIPS_UNCACHED_TO_PHYS(x) ((unsigned)(x) & 0x1fffffff) -#define MIPS_PHYS_TO_UNCACHED(x) ((unsigned)(x) | MIPS_UNCACHED_MEMORY_ADDR) +#define MIPS_CACHED_TO_PHYS(x) ((uintptr_t)(x) & 0x1fffffff) +#define MIPS_PHYS_TO_CACHED(x) ((uintptr_t)(x) | MIPS_CACHED_MEMORY_ADDR) +#define MIPS_UNCACHED_TO_PHYS(x) ((uintptr_t)(x) & 0x1fffffff) +#define MIPS_PHYS_TO_UNCACHED(x) ((uintptr_t)(x) | MIPS_UNCACHED_MEMORY_ADDR) #define MIPS_PHYS_MASK (0x1fffffff) #define MIPS_PA_2_K1VA(x) (MIPS_KSEG1_START | ((x) & MIPS_PHYS_MASK)) -#define MIPS_VA_TO_CINDEX(x) ((unsigned)(x) & 0xffffff | MIPS_CACHED_MEMORY_ADDR) +#define MIPS_VA_TO_CINDEX(x) ((uintptr_t)(x) & 0xffffff | MIPS_CACHED_MEMORY_ADDR) #define MIPS_CACHED_TO_UNCACHED(x) (MIPS_PHYS_TO_UNCACHED(MIPS_CACHED_TO_PHYS(x))) -#define MIPS_PHYS_TO_KSEG0(x) ((unsigned)(x) | MIPS_KSEG0_START) -#define MIPS_PHYS_TO_KSEG1(x) ((unsigned)(x) | MIPS_KSEG1_START) -#define MIPS_KSEG0_TO_PHYS(x) ((unsigned)(x) & MIPS_PHYS_MASK) -#define MIPS_KSEG1_TO_PHYS(x) ((unsigned)(x) & MIPS_PHYS_MASK) +#define MIPS_PHYS_TO_KSEG0(x) ((uintptr_t)(x) | MIPS_KSEG0_START) +#define MIPS_PHYS_TO_KSEG1(x) ((uintptr_t)(x) | MIPS_KSEG1_START) +#define MIPS_KSEG0_TO_PHYS(x) ((uintptr_t)(x) & MIPS_PHYS_MASK) +#define MIPS_KSEG1_TO_PHYS(x) ((uintptr_t)(x) & MIPS_PHYS_MASK) + +#define MIPS_IS_KSEG0_ADDR(x) \ + (((vm_offset_t)(x) >= MIPS_KSEG0_START) && \ + ((vm_offset_t)(x) <= MIPS_KSEG0_END)) +#define MIPS_IS_KSEG1_ADDR(x) \ + (((vm_offset_t)(x) >= MIPS_KSEG1_START) && \ + ((vm_offset_t)(x) <= MIPS_KSEG1_END)) +#define MIPS_IS_VALID_PTR(x) (MIPS_IS_KSEG0_ADDR(x) || \ + MIPS_IS_KSEG1_ADDR(x)) /* * Status register. @@ -113,6 +122,8 @@ #define SOFT_INT_MASK (SOFT_INT_MASK_0 | SOFT_INT_MASK_1) #define HW_INT_MASK (ALL_INT_MASK & ~SOFT_INT_MASK) +#define soft_int_mask(softintr) (1 << ((softintr) + 8)) +#define hard_int_mask(hardintr) (1 << ((hardintr) + 10)) /* * The bits in the cause register. @@ -155,6 +166,7 @@ */ #define CFG_K0_UNCACHED 2 #define CFG_K0_CACHED 3 +#define CFG_K0_MASK 0x7 /* * The bits in the context register. @@ -299,8 +311,16 @@ /* * The first TLB entry that write random hits. + * TLB entry 0 maps the kernel stack of the currently running thread + * TLB entry 1 maps the pcpu area of processor (only for SMP builds) */ +#define KSTACK_TLB_ENTRY 0 +#ifdef SMP +#define PCPU_TLB_ENTRY 1 +#define VMWIRED_ENTRIES 2 +#else #define VMWIRED_ENTRIES 1 +#endif /* SMP */ /* * The number of process id entries. diff --git a/sys/mips/include/cpufunc.h b/sys/mips/include/cpufunc.h index f3aa5a4c1207..cd4d3e5e6955 100644 --- a/sys/mips/include/cpufunc.h +++ b/sys/mips/include/cpufunc.h @@ -183,20 +183,46 @@ mips_wr_ ## n (uint32_t a0) \ mips_barrier(); \ } struct __hack +#define MIPS_RDRW32_COP0_SEL(n,r,s) \ +static __inline uint32_t \ +mips_rd_ ## n ## s(void) \ +{ \ + int v0; \ + __asm __volatile ("mfc0 %[v0], $"__XSTRING(r)", "__XSTRING(s)";" \ + : [v0] "=&r"(v0)); \ + mips_barrier(); \ + return (v0); \ +} \ +static __inline void \ +mips_wr_ ## n ## s(uint32_t a0) \ +{ \ + __asm __volatile ("mtc0 %[a0], $"__XSTRING(r)", "__XSTRING(s)";" \ + __XSTRING(COP0_SYNC)";" \ + "nop;" \ + "nop;" \ + : \ + : [a0] "r"(a0)); \ + mips_barrier(); \ +} struct __hack + #ifdef TARGET_OCTEON static __inline void mips_sync_icache (void) { - __asm __volatile ( - ".set mips64\n" - ".word 0x041f0000\n" - "nop\n" - ".set mips0\n" - : : ); + __asm __volatile ( + ".set push\n" + ".set mips64\n" + ".word 0x041f0000\n" /* xxx ICACHE */ + "nop\n" + ".set pop\n" + : : ); } #endif MIPS_RDRW32_COP0(compare, MIPS_COP_0_COMPARE); MIPS_RDRW32_COP0(config, MIPS_COP_0_CONFIG); +MIPS_RDRW32_COP0_SEL(config, MIPS_COP_0_CONFIG, 1); +MIPS_RDRW32_COP0_SEL(config, MIPS_COP_0_CONFIG, 2); +MIPS_RDRW32_COP0_SEL(config, MIPS_COP_0_CONFIG, 3); MIPS_RDRW32_COP0(count, MIPS_COP_0_COUNT); MIPS_RDRW32_COP0(index, MIPS_COP_0_TLB_INDEX); MIPS_RDRW32_COP0(wired, MIPS_COP_0_TLB_WIRED); @@ -211,18 +237,13 @@ MIPS_RDRW32_COP0(entryhi, MIPS_COP_0_TLB_HI); MIPS_RDRW32_COP0(pagemask, MIPS_COP_0_TLB_PG_MASK); MIPS_RDRW32_COP0(prid, MIPS_COP_0_PRID); MIPS_RDRW32_COP0(watchlo, MIPS_COP_0_WATCH_LO); +MIPS_RDRW32_COP0_SEL(watchlo, MIPS_COP_0_WATCH_LO, 1); +MIPS_RDRW32_COP0_SEL(watchlo, MIPS_COP_0_WATCH_LO, 2); +MIPS_RDRW32_COP0_SEL(watchlo, MIPS_COP_0_WATCH_LO, 3); MIPS_RDRW32_COP0(watchhi, MIPS_COP_0_WATCH_HI); - -static __inline uint32_t -mips_rd_config_sel1(void) -{ - int v0; - __asm __volatile("mfc0 %[v0], $16, 1 ;" - : [v0] "=&r" (v0)); - mips_barrier(); - return (v0); -} - +MIPS_RDRW32_COP0_SEL(watchhi, MIPS_COP_0_WATCH_HI, 1); +MIPS_RDRW32_COP0_SEL(watchhi, MIPS_COP_0_WATCH_HI, 2); +MIPS_RDRW32_COP0_SEL(watchhi, MIPS_COP_0_WATCH_HI, 3); #undef MIPS_RDRW32_COP0 static __inline register_t diff --git a/sys/mips/include/cpuinfo.h b/sys/mips/include/cpuinfo.h index bf3208626d3c..4378c6af2f2a 100644 --- a/sys/mips/include/cpuinfo.h +++ b/sys/mips/include/cpuinfo.h @@ -57,11 +57,11 @@ struct mips_cpuinfo { u_int16_t tlb_nentries; u_int8_t icache_virtual; struct { - u_int8_t ic_size; + u_int32_t ic_size; u_int8_t ic_linesize; u_int8_t ic_nways; u_int16_t ic_nsets; - u_int8_t dc_size; + u_int32_t dc_size; u_int8_t dc_linesize; u_int8_t dc_nways; u_int16_t dc_nsets; diff --git a/sys/mips/include/cpuregs.h b/sys/mips/include/cpuregs.h index e590c9de4fe8..f1f2485e2c99 100644 --- a/sys/mips/include/cpuregs.h +++ b/sys/mips/include/cpuregs.h @@ -103,8 +103,14 @@ /* CPU dependent mtc0 hazard hook */ #ifdef TARGET_OCTEON #define COP0_SYNC nop; nop; nop; nop; nop; +#elif defined(CPU_SB1) +#define COP0_SYNC ssnop; ssnop; ssnop; ssnop; ssnop; ssnop; ssnop; ssnop; ssnop #else -#define COP0_SYNC /* nothing */ +/* + * Pick a reasonable default based on the "typical" spacing described in the + * "CP0 Hazards" chapter of MIPS Architecture Book Vol III. + */ +#define COP0_SYNC ssnop; ssnop; ssnop; ssnop; ssnop #endif #define COP0_HAZARD_FPUENABLE nop; nop; nop; nop; @@ -848,6 +854,10 @@ #define MIPS_4KEc_R2 0x90 /* MIPS 4KEc_R2 ISA 32 Rel 2 */ #define MIPS_4KEmp_R2 0x91 /* MIPS 4KEm/4KEp_R2 ISA 32 Rel 2 */ #define MIPS_4KSd 0x92 /* MIPS 4KSd ISA 32 Rel 2 */ +#define MIPS_24K 0x93 /* MIPS 24Kc/24Kf ISA 32 Rel 2 */ +#define MIPS_34K 0x95 /* MIPS 34K ISA 32 R2 MT */ +#define MIPS_24KE 0x96 /* MIPS 24KEc ISA 32 Rel 2 */ +#define MIPS_74K 0x97 /* MIPS 74Kc/74Kf ISA 32 Rel 2 */ /* * AMD (company ID 3) use the processor ID field to donote the CPU core diff --git a/sys/mips/include/db_machdep.h b/sys/mips/include/db_machdep.h index 989f05c61af7..ea9712005f92 100644 --- a/sys/mips/include/db_machdep.h +++ b/sys/mips/include/db_machdep.h @@ -46,7 +46,7 @@ typedef struct trapframe db_regs_t; extern db_regs_t ddb_regs; /* register state */ typedef vm_offset_t db_addr_t; /* address - unsigned */ -typedef int db_expr_t; /* expression - signed */ +typedef register_t db_expr_t; /* expression - signed */ #if BYTE_ORDER == _BIG_ENDIAN #define BYTE_MSF (1) @@ -94,6 +94,7 @@ db_addr_t next_instr_address(db_addr_t, boolean_t); int db_inst_type(int); void db_dump_tlb(int, int); db_addr_t branch_taken(int inst, db_addr_t pc); -void stacktrace_subr(db_regs_t *, int (*)(const char *, ...)); +void stacktrace_subr(register_t pc, register_t sp, register_t ra, int (*)(const char *, ...)); +int kdbpeek(int *); #endif /* !_MIPS_DB_MACHDEP_H_ */ diff --git a/sys/mips/include/elf.h b/sys/mips/include/elf.h index 3a31daa0bd1a..2d6ca3e90385 100644 --- a/sys/mips/include/elf.h +++ b/sys/mips/include/elf.h @@ -41,8 +41,12 @@ /* Information taken from MIPS ABI supplemental */ #ifndef __ELF_WORD_SIZE +#if defined(__mips_n64) +#define __ELF_WORD_SIZE 64 /* Used by */ +#else #define __ELF_WORD_SIZE 32 /* Used by */ #endif +#endif #include /* Definitions common to all 32 bit architectures. */ #include /* Definitions common to all 64 bit architectures. */ #include @@ -250,4 +254,11 @@ __ElfType(Auxinfo); #define AT_COUNT 16 /* Count of defined aux entry types. */ +#define ET_DYN_LOAD_ADDR 0x0120000 + +/* + * Constant to mark start of symtab/strtab saved by trampoline + */ +#define SYMTAB_MAGIC 0x64656267 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/mips/include/endian.h b/sys/mips/include/endian.h index 1d2b4fe024ff..b43b1e9bf6da 100644 --- a/sys/mips/include/endian.h +++ b/sys/mips/include/endian.h @@ -108,12 +108,12 @@ __bswap64_var(__uint64_t _x) ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56))); } -#define __bswap16(x) (__uint16_t)(__is_constant(x) ? __bswap16_const(x) : \ - __bswap16_var(x)) -#define __bswap32(x) (__uint32_t)(__is_constant(x) ? __bswap32_const(x) : \ - __bswap32_var(x)) -#define __bswap64(x) (__uint64_t)(__is_constant(x) ? __bswap64_const(x) : \ - __bswap64_var(x)) +#define __bswap16(x) (__uint16_t)(__is_constant(x) ? \ + __bswap16_const((__uint16_t)x) : __bswap16_var((__uint16_t)x)) +#define __bswap32(x) (__uint32_t)(__is_constant(x) ? \ + __bswap32_const((__uint32_t)x) : __bswap32_var((__uint32_t)x)) +#define __bswap64(x) (__uint64_t)(__is_constant(x) ? \ + __bswap64_const((__uint64_t)x) : __bswap64_var((__uint64_t)x)) #ifdef __MIPSEB__ #define __htonl(x) ((__uint32_t)(x)) diff --git a/sys/mips/include/float.h b/sys/mips/include/float.h index 750feb0886f7..ff7e65cf1dbd 100644 --- a/sys/mips/include/float.h +++ b/sys/mips/include/float.h @@ -42,10 +42,10 @@ extern int __flt_rounds(void); __END_DECLS #define FLT_RADIX 2 /* b */ -#ifdef SOFTFLOAT -#define FLT_ROUNDS -1 -#else +#ifdef CPU_HAVEFPU #define FLT_ROUNDS __flt_rounds() /* FP addition rounds to nearest */ +#else +#define FLT_ROUNDS -1 #endif /* * XXXMIPS: MIPS32 has both float and double type, so set FLT_EVAL_METHOD diff --git a/sys/amd64/isa/icu.h b/sys/mips/include/fls64.h similarity index 65% rename from sys/amd64/isa/icu.h rename to sys/mips/include/fls64.h index c484eccdfc3e..e49c087c995d 100644 --- a/sys/amd64/isa/icu.h +++ b/sys/mips/include/fls64.h @@ -1,10 +1,7 @@ /*- - * Copyright (c) 1990 The Regents of the University of California. + * Copyright (c) 2003-2009 RMI Corporation * All rights reserved. * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -13,14 +10,14 @@ * 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 + * 3. Neither the name of RMI Corporation, 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 + * 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 REGENTS OR CONTRIBUTORS BE LIABLE + * 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) @@ -29,21 +26,22 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * from: @(#)icu.h 5.6 (Berkeley) 5/9/91 - * $FreeBSD$ - */ + * RMI_BSD */ +#ifndef _MIPS_FLS64_H_ +#define _MIPS_FLS64_H_ /* - * AT/386 Interrupt Control constants - * W. Jolitz 8/89 + * Find Last Set bit (64 bit) */ +static inline int +fls64(__uint64_t mask) +{ + int bit; -#ifndef _AMD64_ISA_ICU_H_ -#define _AMD64_ISA_ICU_H_ - -#define ICU_IMR_OFFSET 1 - -void atpic_handle_intr(u_int vector, struct trapframe *frame); -void atpic_startup(void); - -#endif /* !_AMD64_ISA_ICU_H_ */ + if (mask == 0) + return (0); + for (bit = 1; ((mask & 0x1ULL) == 0); bit++) + mask = mask >> 1; + return (bit); +} +#endif diff --git a/sys/mips/include/hwfunc.h b/sys/mips/include/hwfunc.h index ef5088cb8d8a..bbf3086439a9 100644 --- a/sys/mips/include/hwfunc.h +++ b/sys/mips/include/hwfunc.h @@ -29,7 +29,7 @@ #define _MACHINE_HWFUNC_H_ struct trapframe; - +struct timecounter; /* * Hooks downward into hardware functionality. */ @@ -39,4 +39,59 @@ void platform_intr(struct trapframe *); void platform_reset(void); void platform_start(__register_t, __register_t, __register_t, __register_t); +/* For clocks and ticks and such */ +void platform_initclocks(void); +uint64_t platform_get_frequency(void); +unsigned platform_get_timecount(struct timecounter *); + +/* For hardware specific CPU initialization */ +void platform_cpu_init(void); +void platform_secondary_init(void); + +#ifdef SMP + +/* + * Spin up the AP so that it starts executing MP bootstrap entry point: mpentry + * + * Returns 0 on sucess and non-zero on failure. + */ +int platform_start_ap(int processor_id); + +/* + * Platform-specific initialization that needs to be done when an AP starts + * running. This function is called from the MP bootstrap code in mpboot.S + */ +void platform_init_ap(int processor_id); + +/* + * Return a plaform-specific interrrupt number that is used to deliver IPIs. + * + * This hardware interrupt is used to deliver IPIs exclusively and must + * not be used for any other interrupt source. + */ +int platform_ipi_intrnum(void); + +/* + * Trigger a IPI interrupt on 'cpuid'. + */ +void platform_ipi_send(int cpuid); + +/* + * Quiesce the IPI interrupt source on the current cpu. + */ +void platform_ipi_clear(void); + +/* + * Return the processor id. + * + * Note that this function is called in early boot when stack is not available. + */ +extern int platform_processor_id(void); + +/* + * Return the number of processors available on this platform. + */ +extern int platform_num_processors(void); + +#endif /* SMP */ #endif /* !_MACHINE_HWFUNC_H_ */ diff --git a/sys/mips/include/intr.h b/sys/mips/include/intr.h deleted file mode 100644 index c406379f012e..000000000000 --- a/sys/mips/include/intr.h +++ /dev/null @@ -1,94 +0,0 @@ -/* $NetBSD: intr.h,v 1.5 1996/05/13 06:11:28 mycroft Exp $ */ - -/*- - * Copyright (c) 1996 Charles M. Hannum. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Charles M. Hannum. - * 4. 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 ``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 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. - * - * JNPR: intr.h,v 1.4 2007/08/09 11:23:32 katta - * $FreeBSD$ - */ - -#ifndef _MACHINE_INTR_H_ -#define _MACHINE_INTR_H_ - -/* Interrupt sharing types. */ -#define IST_NONE 0 /* none */ -#define IST_PULSE 1 /* pulsed */ -#define IST_EDGE 2 /* edge-triggered */ -#define IST_LEVEL 3 /* level-triggered */ - -#ifndef _LOCORE - -/* - * Index into intrcnt[], which is defined in exceptions.S - * Index # = irq # - 1 - */ -#define INTRCNT_HARDCLOCK 0 -#define INTRCNT_RTC 1 -#define INTRCNT_SIO 2 /* irq 3 */ -#define INTRCNT_PE 3 /* irq 4 */ -#define INTRCNT_PICNIC 4 /* irq 5 */ - -extern uint32_t idle_mask; -extern void (*mips_ack_interrupt)(int, uint32_t); - -typedef int ih_func_t(void *); - -struct intr_event; - -struct mips_intr_handler { - int (*ih_func) (void *); - void *ih_arg; - struct intr_event *ih_event; - u_int ih_flags; - volatile long *ih_count; - int ih_level; - int ih_irq; - void *frame; -}; - -extern struct mips_intr_handler intr_handlers[]; - -typedef void (*mask_fn)(void *); - -void mips_mask_irq(void); -void mips_unmask_irq(void); - -struct trapframe; -void mips_set_intr(int pri, uint32_t mask, - uint32_t (*int_hand)(uint32_t, struct trapframe *)); -uint32_t mips_handle_interrupts(uint32_t pending, struct trapframe *cf); -void intr_enable_source(uintptr_t irq); -struct trapframe * mips_get_trapframe(void *ih_arg); -int inthand_add(const char *name, u_int irq, void (*handler)(void *), - void *arg, int flags, void **cookiep); -int inthand_remove(u_int irq, void *cookie); -void bvif_attach(void); - -#endif /* _LOCORE */ - -#endif /* !_MACHINE_INTR_H_ */ diff --git a/sys/mips/include/intr_machdep.h b/sys/mips/include/intr_machdep.h index d5f26d9296b6..575bba49d311 100644 --- a/sys/mips/include/intr_machdep.h +++ b/sys/mips/include/intr_machdep.h @@ -29,15 +29,44 @@ #ifndef _MACHINE_INTR_MACHDEP_H_ #define _MACHINE_INTR_MACHDEP_H_ +#ifdef TARGET_XLR_XLS +#define XLR_MAX_INTR 64 +#else #define NHARD_IRQS 6 #define NSOFT_IRQS 2 +#endif struct trapframe; -void cpu_establish_hardintr(const char *, int (*)(void*), void (*)(void*), +void cpu_init_interrupts(void); +void cpu_establish_hardintr(const char *, driver_filter_t *, driver_intr_t *, void *, int, int, void **); -void cpu_establish_softintr(const char *, int (*)(void*), void (*)(void*), +void cpu_establish_softintr(const char *, driver_filter_t *, void (*)(void*), void *, int, int, void **); void cpu_intr(struct trapframe *); +/* + * Allow a platform to override the default hard interrupt mask and unmask + * functions. The 'arg' can be cast safely to an 'int' and holds the mips + * hard interrupt number to mask or unmask. + */ +typedef void (*cpu_intr_mask_t)(void *arg); +typedef void (*cpu_intr_unmask_t)(void *arg); +void cpu_set_hardintr_mask_func(cpu_intr_mask_t func); +void cpu_set_hardintr_unmask_func(cpu_intr_unmask_t func); + +/* + * Opaque datatype that represents intr counter + */ +typedef unsigned long* mips_intrcnt_t; + +mips_intrcnt_t mips_intrcnt_create(const char *); +void mips_intrcnt_setname(mips_intrcnt_t, const char *); + +static __inline void +mips_intrcnt_inc(mips_intrcnt_t counter) +{ + if (counter) + atomic_add_long(counter, 1); +} #endif /* !_MACHINE_INTR_MACHDEP_H_ */ diff --git a/sys/mips/include/kdb.h b/sys/mips/include/kdb.h index 7be4ecb5ef36..cd8c61858556 100644 --- a/sys/mips/include/kdb.h +++ b/sys/mips/include/kdb.h @@ -47,4 +47,8 @@ kdb_cpu_trap(int vector, int _) { } +static __inline void +kdb_cpu_sync_icache(unsigned char *addr, size_t size) +{ +} #endif /* _MACHINE_KDB_H_ */ diff --git a/sys/mips/include/locore.h b/sys/mips/include/locore.h index ce60353196a6..b1b9f5905896 100644 --- a/sys/mips/include/locore.h +++ b/sys/mips/include/locore.h @@ -60,6 +60,7 @@ typedef int mips_prid_t; /* 0x09 unannounced */ /* 0x0a unannounced */ #define MIPS_PRID_CID_LEXRA 0x0b /* Lexra */ +#define MIPS_PRID_CID_CAVIUM 0x0d /* Cavium */ #define MIPS_PRID_COPTS(x) (((x) >> 24) & 0x00ff) /* Company Options */ #ifdef _KERNEL diff --git a/sys/mips/include/md_var.h b/sys/mips/include/md_var.h index 3b8d0a7e82c9..ab3c3e6cf723 100644 --- a/sys/mips/include/md_var.h +++ b/sys/mips/include/md_var.h @@ -39,19 +39,23 @@ /* * Miscellaneous machine-dependent declarations. */ -extern int Maxmem; +extern long Maxmem; extern char sigcode[]; extern int szsigcode, szosigcode; extern vm_offset_t kstack0; +extern vm_offset_t kernel_kseg0_end; void MipsSaveCurFPState(struct thread *); void fork_trampoline(void); void cpu_swapin(struct proc *); -u_int MipsEmulateBranch(struct trapframe *, int, int, u_int); +uintptr_t MipsEmulateBranch(struct trapframe *, uintptr_t, int, uintptr_t); +void MipsSwitchFPState(struct thread *, struct trapframe *); u_long kvtop(void *addr); int is_physical_memory(vm_offset_t addr); -int is_cacheable_mem(vm_offset_t pa); +void mips_generic_reset(void); + +#define is_cacheable_mem(pa) is_physical_memory((pa)) #define MIPS_DEBUG 0 @@ -64,9 +68,14 @@ int is_cacheable_mem(vm_offset_t pa); void mips_vector_init(void); void cpu_identify(void); void mips_cpu_init(void); +void mips_pcpu0_init(void); void mips_proc0_init(void); +void mips_postboot_fixup(void); /* Platform call-downs. */ void platform_identify(void); +extern int busdma_swi_pending; +void busdma_swi(void); + #endif /* !_MACHINE_MD_VAR_H_ */ diff --git a/sys/mips/include/param.h b/sys/mips/include/param.h index b81864940467..8edd48ece16a 100644 --- a/sys/mips/include/param.h +++ b/sys/mips/include/param.h @@ -93,7 +93,7 @@ * This does not reflect the optimal alignment, just the possibility * (within reasonable limits). */ -#define ALIGNED_POINTER(p, t) ((((unsigned)(p)) & (sizeof (t) - 1)) == 0) +#define ALIGNED_POINTER(p, t) ((((unsigned long)(p)) & (sizeof (t) - 1)) == 0) /* * CACHE_LINE_SIZE is the compile-time maximum cache line size for an @@ -154,10 +154,10 @@ /* * Conversion macros */ -#define mips_round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1)) -#define mips_trunc_page(x) ((unsigned)(x) & ~(NBPG-1)) -#define mips_btop(x) ((unsigned)(x) >> PGSHIFT) -#define mips_ptob(x) ((unsigned)(x) << PGSHIFT) +#define mips_round_page(x) ((((unsigned long)(x)) + NBPG - 1) & ~(NBPG-1)) +#define mips_trunc_page(x) ((unsigned long)(x) & ~(NBPG-1)) +#define mips_btop(x) ((unsigned long)(x) >> PGSHIFT) +#define mips_ptob(x) ((unsigned long)(x) << PGSHIFT) #define round_page mips_round_page #define trunc_page mips_trunc_page #define atop(x) ((unsigned long)(x) >> PAGE_SHIFT) diff --git a/sys/mips/include/pcb.h b/sys/mips/include/pcb.h index 16d274dbf411..f95ef4d8d4a5 100644 --- a/sys/mips/include/pcb.h +++ b/sys/mips/include/pcb.h @@ -50,8 +50,9 @@ struct pcb { struct trapframe pcb_regs; /* saved CPU and registers */ - label_t pcb_context; /* kernel context for resume */ + __register_t pcb_context[14]; /* kernel context for resume */ int pcb_onfault; /* for copyin/copyout faults */ + register_t pcb_tpc; }; /* these match the regnum's in regnum.h @@ -70,6 +71,7 @@ struct pcb #define PCB_REG_RA 10 #define PCB_REG_SR 11 #define PCB_REG_GP 12 +#define PCB_REG_PC 13 #ifdef _KERNEL diff --git a/sys/mips/include/pcpu.h b/sys/mips/include/pcpu.h index 5fe2b22a81c0..b8928a1171a9 100644 --- a/sys/mips/include/pcpu.h +++ b/sys/mips/include/pcpu.h @@ -38,35 +38,15 @@ struct pmap *pc_curpmap; /* pmap of curthread */ \ u_int32_t pc_next_asid; /* next ASID to alloc */ \ u_int32_t pc_asid_generation; /* current ASID generation */ \ - u_int pc_pending_ipis; /* the IPIs pending to this CPU */ \ - void *pc_boot_stack; + u_int pc_pending_ipis; /* IPIs pending to this CPU */ #ifdef _KERNEL -#ifdef SMP -static __inline struct pcpu* -get_pcpup(void) -{ - /* - * FREEBSD_DEVELOPERS_FIXME - * In multiprocessor case, store/retrieve the pcpu structure - * address for current CPU in scratch register for fast access. - * - * In this routine, read the scratch register to retrieve the PCPU - * structure for this CPU - */ - struct pcpu *ret; +extern char pcpu_space[MAXCPU][PAGE_SIZE * 2]; +#define PCPU_ADDR(cpu) (struct pcpu *)(pcpu_space[(cpu)]) - /* ret should contain the pointer to the PCPU structure for this CPU */ - return(ret); -} - -#define PCPUP ((struct pcpu *)get_pcpup()) -#else -/* Uni processor systems */ extern struct pcpu *pcpup; #define PCPUP pcpup -#endif /* SMP */ #define PCPU_ADD(member, value) (PCPUP->pc_ ## member += (value)) #define PCPU_GET(member) (PCPUP->pc_ ## member) @@ -75,6 +55,13 @@ extern struct pcpu *pcpup; #define PCPU_SET(member,value) (PCPUP->pc_ ## member = (value)) #define PCPU_LAZY_INC(member) (++PCPUP->pc_ ## member) +#ifdef SMP +/* + * Instantiate the wired TLB entry at PCPU_TLB_ENTRY to map 'pcpu' at 'pcpup'. + */ +void mips_pcpu_tlb_init(struct pcpu *pcpu); +#endif + #endif /* _KERNEL */ #endif /* !_MACHINE_PCPU_H_ */ diff --git a/sys/mips/include/pltfm.h b/sys/mips/include/pltfm.h deleted file mode 100644 index e3f118b8101c..000000000000 --- a/sys/mips/include/pltfm.h +++ /dev/null @@ -1,29 +0,0 @@ -/*- - * JNPR: pltfm.h,v 1.5.2.1 2007/09/10 05:56:11 girish - * $FreeBSD$ - */ - -#ifndef _MACHINE_PLTFM_H_ -#define _MACHINE_PLTFM_H_ - -/* - * This files contains platform-specific definitions. - */ -#define SDRAM_ADDR_START 0 /* SDRAM addr space */ -#define SDRAM_ADDR_END (SDRAM_ADDR_START + (1024*0x100000)) -#define SDRAM_MEM_SIZE (SDRAM_ADDR_END - SDRAM_ADDR_START) - -#define UART_ADDR_START 0x1ef14000 /* UART */ -#define UART_ADDR_END 0x1ef14fff -#define UART_MEM_SIZE (UART_ADDR_END-UART_ADDR_START) - -/* - * NS16550 UART address - */ -#ifdef ADDR_NS16550_UART1 -#undef ADDR_NS16550_UART1 -#endif -#define ADDR_NS16550_UART1 0x1ef14000 /* UART */ -#define VADDR_NS16550_UART1 0xbef14000 /* UART */ - -#endif /* !_MACHINE_PLTFM_H_ */ diff --git a/sys/mips/include/pmap.h b/sys/mips/include/pmap.h index 4546cffd0a79..eedd4f3f801a 100644 --- a/sys/mips/include/pmap.h +++ b/sys/mips/include/pmap.h @@ -145,7 +145,21 @@ typedef struct pv_entry { #define PMAP_DIAGNOSTIC #endif -extern vm_offset_t phys_avail[]; +/* + * physmem_desc[] is a superset of phys_avail[] and describes all the + * memory present in the system. + * + * phys_avail[] is similar but does not include the memory stolen by + * pmap_steal_memory(). + * + * Each memory region is described by a pair of elements in the array + * so we can describe up to (PHYS_AVAIL_ENTRIES / 2) distinct memory + * regions. + */ +#define PHYS_AVAIL_ENTRIES 10 +extern vm_offset_t phys_avail[PHYS_AVAIL_ENTRIES + 2]; +extern vm_offset_t physmem_desc[PHYS_AVAIL_ENTRIES + 2]; + extern char *ptvmmap; /* poor name! */ extern vm_offset_t virtual_avail; extern vm_offset_t virtual_end; @@ -172,6 +186,7 @@ void *pmap_kenter_temporary(vm_paddr_t pa, int i); void pmap_kenter_temporary_free(vm_paddr_t pa); int pmap_compute_pages_to_dump(void); void pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte); +void pmap_flush_pvcache(vm_page_t m); /* * floating virtual pages (FPAGES) diff --git a/sys/mips/include/proc.h b/sys/mips/include/proc.h index 6a0ce7dc0774..99dab78e165e 100644 --- a/sys/mips/include/proc.h +++ b/sys/mips/include/proc.h @@ -44,7 +44,7 @@ */ struct mdthread { int md_flags; /* machine-dependent flags */ - int md_upte[KSTACK_PAGES]; /* ptes for mapping u pcb */ + int md_upte[KSTACK_PAGES - 1]; /* ptes for mapping u pcb */ int md_ss_addr; /* single step address for ptrace */ int md_ss_instr; /* single step instruction for ptrace */ register_t md_saved_intr; @@ -54,6 +54,7 @@ struct mdthread { int md_pc_count; /* performance counter */ int md_pc_spill; /* performance counter spill */ vm_offset_t md_realstack; + void *md_tls; }; /* md_flags */ diff --git a/sys/mips/include/profile.h b/sys/mips/include/profile.h index 9659d1fa87d8..728a468dbf4c 100644 --- a/sys/mips/include/profile.h +++ b/sys/mips/include/profile.h @@ -41,6 +41,8 @@ /*XXX The cprestore instruction is a "dummy" to shut up as(1). */ +/*XXX This is not MIPS64 safe. */ + #define MCOUNT \ __asm(".globl _mcount;" \ ".type _mcount,@function;" \ diff --git a/sys/mips/include/psl.h b/sys/mips/include/psl.h index 9d05d133ee2e..f02a1a95fa96 100644 --- a/sys/mips/include/psl.h +++ b/sys/mips/include/psl.h @@ -47,8 +47,4 @@ #define USERMODE(ps) (((ps) & SR_KSU_MASK) == SR_KSU_USER) #define BASEPRI(ps) (((ps) & (INT_MASK | SR_INT_ENA_PREV)) \ == (INT_MASK | SR_INT_ENA_PREV)) - -#ifdef _KERNEL -#include -#endif #endif /* _MACHINE_PSL_H_ */ diff --git a/sys/mips/include/pte.h b/sys/mips/include/pte.h index aa7e839c4393..db26cbb0929d 100644 --- a/sys/mips/include/pte.h +++ b/sys/mips/include/pte.h @@ -105,7 +105,11 @@ typedef pt_entry_t *pd_entry_t; #define PTE_ODDPG 0x00001000 /*#define PG_ATTR 0x0000003f Not Used */ #define PTE_UNCACHED 0x00000010 +#ifdef CPU_SB1 +#define PTE_CACHE 0x00000028 /* cacheable coherent */ +#else #define PTE_CACHE 0x00000018 +#endif /*#define PG_CACHEMODE 0x00000038 Not Used*/ #define PTE_ROPAGE (PTE_V | PTE_RO | PTE_CACHE) /* Write protected */ #define PTE_RWPAGE (PTE_V | PTE_M | PTE_CACHE) /* Not wr-prot not clean */ diff --git a/sys/mips/include/regdef.h b/sys/mips/include/regdef.h index bb9eb3d9f811..7efdd95f7ac8 100644 --- a/sys/mips/include/regdef.h +++ b/sys/mips/include/regdef.h @@ -12,6 +12,8 @@ #ifndef _MACHINE_REGDEF_H_ #define _MACHINE_REGDEF_H_ +#include /* For API selection */ + #if defined(__ASSEMBLER__) /* General purpose CPU register names */ #define zero $0 /* wired zero */ @@ -22,6 +24,16 @@ #define a1 $5 #define a2 $6 #define a3 $7 +#if defined(__mips_n32) || defined(__mips_n64) +#define a4 $8 +#define a5 $9 +#define a6 $10 +#define a7 $11 +#define t0 $12 /* Temp regs, not saved accross subroutine calls */ +#define t1 $13 +#define t2 $14 +#define t3 $15 +#else #define t0 $8 /* caller saved */ #define t1 $9 #define t2 $10 @@ -30,6 +42,7 @@ #define t5 $13 #define t6 $14 #define t7 $15 +#endif #define s0 $16 /* callee saved */ #define s1 $17 #define s2 $18 @@ -48,6 +61,26 @@ #define s8 $30 /* callee saved */ #define ra $31 /* return address */ +/* + * These are temp registers whose names can be used in either the old + * or new ABI, although they map to different physical registers. In + * the old ABI, they map to t4-t7, and in the new ABI, they map to a4-a7. + * + * Because they overlap with the last 4 arg regs in the new ABI, ta0-ta3 + * should be used only when we need more than t0-t3. + */ +#if defined(__mips_n32) || defined(__mips_n64) +#define ta0 $8 +#define ta1 $9 +#define ta2 $10 +#define ta3 $11 +#else +#define ta0 $12 +#define ta1 $13 +#define ta2 $14 +#define ta3 $15 +#endif /* __mips_n32 || __mips_n64 */ + #endif /* __ASSEMBLER__ */ #endif /* !_MACHINE_REGDEF_H_ */ diff --git a/sys/mips/include/regnum.h b/sys/mips/include/regnum.h index 1e3f2c875b9b..baa60bd8b86d 100644 --- a/sys/mips/include/regnum.h +++ b/sys/mips/include/regnum.h @@ -63,8 +63,7 @@ #define PREG_RA 10 #define PREG_SR 11 #define PREG_GP 12 - - +#define PREG_PC 13 /* * Location of the saved registers relative to ZERO. @@ -82,10 +81,10 @@ #define T1 9 #define T2 10 #define T3 11 -#define T4 12 -#define T5 13 -#define T6 14 -#define T7 15 +#define TA0 12 +#define TA1 13 +#define TA2 14 +#define TA3 15 #define S0 16 #define S1 17 #define S2 18 diff --git a/sys/mips/include/smp.h b/sys/mips/include/smp.h index d614dd3dbf97..346c863437eb 100644 --- a/sys/mips/include/smp.h +++ b/sys/mips/include/smp.h @@ -20,7 +20,6 @@ /* * Interprocessor interrupts for SMP. */ -#define IPI_INVLTLB 0x0001 #define IPI_RENDEZVOUS 0x0002 #define IPI_AST 0x0004 #define IPI_STOP 0x0008 @@ -28,13 +27,9 @@ #ifndef LOCORE -extern u_int32_t boot_cpu_id; - -void ipi_selected(u_int cpus, u_int32_t ipi); -void ipi_all_but_self(u_int32_t ipi); -intrmask_t smp_handle_ipi(struct trapframe *frame); +void ipi_selected(cpumask_t cpus, int ipi); void smp_init_secondary(u_int32_t cpuid); -void mips_ipi_send(int thread_id); +void mpentry(void); #endif /* !LOCORE */ #endif /* _KERNEL */ diff --git a/sys/mips/include/sysarch.h b/sys/mips/include/sysarch.h index acb30713a469..350ad9583eec 100644 --- a/sys/mips/include/sysarch.h +++ b/sys/mips/include/sysarch.h @@ -35,16 +35,12 @@ #ifndef _MACHINE_SYSARCH_H_ #define _MACHINE_SYSARCH_H_ +#define MIPS_SET_TLS 1 +#define MIPS_GET_TLS 2 + #ifndef _KERNEL #include -#if 0 -/* Something useful for each MIPS platform. */ -#else -#define mips_tcb_set(tcb) do {} while (0) -#define mips_tcb_get() NULL -#endif /* _MIPS_ARCH_XLR */ - __BEGIN_DECLS int sysarch(int, void *); __END_DECLS diff --git a/sys/mips/include/trap.h b/sys/mips/include/trap.h index a00ca908f2f9..1c6be308ef00 100644 --- a/sys/mips/include/trap.h +++ b/sys/mips/include/trap.h @@ -108,6 +108,17 @@ void trapDump(char *msg); #endif +void MipsFPTrap(u_int, u_int, u_int); +void MipsKernGenException(void); +void MipsKernIntr(void); +void MipsKernTLBInvalidException(void); +void MipsTLBMissException(void); +void MipsUserGenException(void); +void MipsUserIntr(void); +void MipsUserTLBInvalidException(void); + +u_int trap(struct trapframe *); + #ifndef LOCORE /* XXX */ int check_address(void *); void platform_trap_enter(void); diff --git a/sys/mips/include/ucontext.h b/sys/mips/include/ucontext.h index d9dfe4ea09f4..7d4c2e46d4a3 100644 --- a/sys/mips/include/ucontext.h +++ b/sys/mips/include/ucontext.h @@ -53,14 +53,21 @@ typedef struct __mcontext { int mc_fpused; /* fp has been used */ f_register_t mc_fpregs[33]; /* fp regs 0 to 31 and csr */ register_t mc_fpc_eir; /* fp exception instruction reg */ + void *mc_tls; /* pointer to TLS area */ int __spare__[8]; /* XXX reserved */ } mcontext_t; #endif -#define SZREG 4 +#ifndef SZREG +#if defined(__mips_o32) +#define SZREG 4 +#else +#define SZREG 8 +#endif +#endif /* offsets into mcontext_t */ -#define UCTX_REG(x) (8 + (x)*SZREG) +#define UCTX_REG(x) (4 + SZREG + (x)*SZREG) #define UCR_ZERO UCTX_REG(0) #define UCR_AT UCTX_REG(1) diff --git a/sys/mips/malta/files.malta b/sys/mips/malta/files.malta index 6ade95f4e36b..82d9ca49b982 100644 --- a/sys/mips/malta/files.malta +++ b/sys/mips/malta/files.malta @@ -7,3 +7,5 @@ mips/malta/uart_bus_maltausart.c optional uart dev/uart/uart_dev_ns8250.c optional uart mips/malta/malta_machdep.c standard mips/malta/yamon.c standard +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard diff --git a/sys/mips/malta/gt_pci.c b/sys/mips/malta/gt_pci.c index f0180f6e6667..2f0eadaba4ea 100644 --- a/sys/mips/malta/gt_pci.c +++ b/sys/mips/malta/gt_pci.c @@ -91,11 +91,16 @@ __FBSDID("$FreeBSD$"); #define OCW3_POLL_IRQ(x) ((x) & 0x7f) #define OCW3_POLL_PENDING (1U << 7) +struct gt_pci_softc; + +struct gt_pci_intr_cookie { + int irq; + struct gt_pci_softc *sc; +}; + struct gt_pci_softc { device_t sc_dev; bus_space_tag_t sc_st; - bus_space_tag_t sc_pciio; - bus_space_tag_t sc_pcimem; bus_space_handle_t sc_ioh_icu1; bus_space_handle_t sc_ioh_icu2; bus_space_handle_t sc_ioh_elcr; @@ -109,6 +114,7 @@ struct gt_pci_softc { struct resource *sc_irq; struct intr_event *sc_eventstab[ICU_LEN]; + struct gt_pci_intr_cookie sc_intr_cookies[ICU_LEN]; uint16_t sc_imask; uint16_t sc_elcr; @@ -117,6 +123,52 @@ struct gt_pci_softc { void *sc_ih; }; +static void gt_pci_set_icus(struct gt_pci_softc *); +static int gt_pci_intr(void *v); +static int gt_pci_probe(device_t); +static int gt_pci_attach(device_t); +static int gt_pci_activate_resource(device_t, device_t, int, int, + struct resource *); +static int gt_pci_setup_intr(device_t, device_t, struct resource *, + int, driver_filter_t *, driver_intr_t *, void *, void **); +static int gt_pci_teardown_intr(device_t, device_t, struct resource *, void*); +static int gt_pci_maxslots(device_t ); +static int gt_pci_conf_setup(struct gt_pci_softc *, int, int, int, int, + uint32_t *); +static uint32_t gt_pci_read_config(device_t, u_int, u_int, u_int, u_int, int); +static void gt_pci_write_config(device_t, u_int, u_int, u_int, u_int, + uint32_t, int); +static int gt_pci_route_interrupt(device_t pcib, device_t dev, int pin); +static struct resource * gt_pci_alloc_resource(device_t, device_t, int, + int *, u_long, u_long, u_long, u_int); + +static void +gt_pci_mask_irq(void *source) +{ + struct gt_pci_intr_cookie *cookie = source; + struct gt_pci_softc *sc = cookie->sc; + int irq = cookie->irq; + + sc->sc_imask |= (1 << irq); + sc->sc_elcr |= (1 << irq); + + gt_pci_set_icus(sc); +} + +static void +gt_pci_unmask_irq(void *source) +{ + struct gt_pci_intr_cookie *cookie = source; + struct gt_pci_softc *sc = cookie->sc; + int irq = cookie->irq; + + /* Enable it, set trigger mode. */ + sc->sc_imask &= ~(1 << irq); + sc->sc_elcr &= ~(1 << irq); + + gt_pci_set_icus(sc); +} + static void gt_pci_set_icus(struct gt_pci_softc *sc) { @@ -126,14 +178,14 @@ gt_pci_set_icus(struct gt_pci_softc *sc) else sc->sc_imask |= (1U << 2); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW1, sc->sc_imask & 0xff); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, PIC_OCW1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, PIC_OCW1, (sc->sc_imask >> 8) & 0xff); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 0, + bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 0, sc->sc_elcr & 0xff); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 1, (sc->sc_elcr >> 8) & 0xff); } @@ -145,9 +197,9 @@ gt_pci_intr(void *v) int irq; for (;;) { - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW3, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW3, OCW3_SEL | OCW3_P); - irq = bus_space_read_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW3); + irq = bus_space_read_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW3); if ((irq & OCW3_POLL_PENDING) == 0) { return FILTER_HANDLED; @@ -156,9 +208,9 @@ gt_pci_intr(void *v) irq = OCW3_POLL_IRQ(irq); if (irq == 2) { - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, PIC_OCW3, OCW3_SEL | OCW3_P); - irq = bus_space_read_1(sc->sc_pciio, sc->sc_ioh_icu2, + irq = bus_space_read_1(sc->sc_st, sc->sc_ioh_icu2, PIC_OCW3); if (irq & OCW3_POLL_PENDING) irq = OCW3_POLL_IRQ(irq) + 8; @@ -177,13 +229,13 @@ gt_pci_intr(void *v) /* Send a specific EOI to the 8259. */ if (irq > 7) { - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, PIC_OCW2, OCW2_SELECT | OCW2_EOI | OCW2_SL | OCW2_ILS(irq & 7)); irq = 2; } - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW2, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW2, OCW2_SELECT | OCW2_EOI | OCW2_SL | OCW2_ILS(irq)); } @@ -208,8 +260,7 @@ gt_pci_attach(device_t dev) busno = 0; sc->sc_dev = dev; sc->sc_busno = busno; - sc->sc_pciio = MIPS_BUS_SPACE_IO; - sc->sc_pcimem = MIPS_BUS_SPACE_MEM; + sc->sc_st = mips_bus_space_generic; /* Use KSEG1 to access IO ports for it is uncached */ sc->sc_io = MIPS_PHYS_TO_KSEG1(MALTA_PCI0_IO_BASE); @@ -239,11 +290,11 @@ gt_pci_attach(device_t dev) * Map the PIC/ELCR registers. */ #if 0 - if (bus_space_map(sc->sc_pciio, 0x4d0, 2, 0, &sc->sc_ioh_elcr) != 0) + if (bus_space_map(sc->sc_st, 0x4d0, 2, 0, &sc->sc_ioh_elcr) != 0) device_printf(dev, "unable to map ELCR registers\n"); - if (bus_space_map(sc->sc_pciio, IO_ICU1, 2, 0, &sc->sc_ioh_icu1) != 0) + if (bus_space_map(sc->sc_st, IO_ICU1, 2, 0, &sc->sc_ioh_icu1) != 0) device_printf(dev, "unable to map ICU1 registers\n"); - if (bus_space_map(sc->sc_pciio, IO_ICU2, 2, 0, &sc->sc_ioh_icu2) != 0) + if (bus_space_map(sc->sc_st, IO_ICU2, 2, 0, &sc->sc_ioh_icu2) != 0) device_printf(dev, "unable to map ICU2 registers\n"); #else sc->sc_ioh_elcr = sc->sc_io + 0x4d0; @@ -262,58 +313,58 @@ gt_pci_attach(device_t dev) * Initialize the 8259s. */ /* reset, program device, 4 bytes */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 0, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0, ICW1_RESET | ICW1_IC4); /* * XXX: values from NetBSD's */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1, 0/*XXX*/); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1, 1 << 2); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1, ICW4_8086); /* mask all interrupts */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 0, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0, sc->sc_imask & 0xff); /* enable special mask mode */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1, OCW3_SEL | OCW3_ESMM | OCW3_SMM); /* read IRR by default */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1, OCW3_SEL | OCW3_RR); /* reset, program device, 4 bytes */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 0, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0, ICW1_RESET | ICW1_IC4); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1, 0/*XXX*/); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1, 1 << 2); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1, ICW4_8086); /* mask all interrupts */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 0, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0, sc->sc_imask & 0xff); /* enable special mask mode */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1, OCW3_SEL | OCW3_ESMM | OCW3_SMM); /* read IRR by default */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1, OCW3_SEL | OCW3_RR); /* * Default all interrupts to edge-triggered. */ - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 0, + bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 0, sc->sc_elcr & 0xff); - bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 1, + bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 1, (sc->sc_elcr >> 8) & 0xff); /* @@ -570,12 +621,12 @@ gt_pci_alloc_resource(device_t bus, device_t child, int type, int *rid, break; case SYS_RES_MEMORY: rm = &sc->sc_mem_rman; - bt = sc->sc_pcimem; + bt = sc->sc_st; bh = sc->sc_mem; break; case SYS_RES_IOPORT: rm = &sc->sc_io_rman; - bt = sc->sc_pciio; + bt = sc->sc_st; bh = sc->sc_io; break; default: @@ -632,10 +683,13 @@ gt_pci_setup_intr(device_t dev, device_t child, struct resource *ires, panic("%s: bad irq or type", __func__); event = sc->sc_eventstab[irq]; + sc->sc_intr_cookies[irq].irq = irq; + sc->sc_intr_cookies[irq].sc = sc; if (event == NULL) { - error = intr_event_create(&event, (void *)irq, 0, irq, - (mask_fn)mips_mask_irq, (mask_fn)mips_unmask_irq, - (mask_fn)mips_unmask_irq, NULL, "gt_pci intr%d:", irq); + error = intr_event_create(&event, + (void *)&sc->sc_intr_cookies[irq], 0, irq, + gt_pci_mask_irq, gt_pci_unmask_irq, + NULL, NULL, "gt_pci intr%d:", irq); if (error) return 0; sc->sc_eventstab[irq] = event; @@ -644,12 +698,7 @@ gt_pci_setup_intr(device_t dev, device_t child, struct resource *ires, intr_event_add_handler(event, device_get_nameunit(child), filt, handler, arg, intr_priority(flags), flags, cookiep); - /* Enable it, set trigger mode. */ - sc->sc_imask &= ~(1 << irq); - sc->sc_elcr &= ~(1 << irq); - - gt_pci_set_icus(sc); - + gt_pci_unmask_irq((void *)&sc->sc_intr_cookies[irq]); return 0; } @@ -657,6 +706,12 @@ static int gt_pci_teardown_intr(device_t dev, device_t child, struct resource *res, void *cookie) { + struct gt_pci_softc *sc = device_get_softc(dev); + int irq; + + irq = rman_get_start(res); + gt_pci_mask_irq((void *)&sc->sc_intr_cookies[irq]); + return (intr_event_remove_handler(cookie)); } diff --git a/sys/mips/malta/malta_machdep.c b/sys/mips/malta/malta_machdep.c index c5c28af8b639..6cbdcd82bc18 100644 --- a/sys/mips/malta/malta_machdep.c +++ b/sys/mips/malta/malta_machdep.c @@ -97,6 +97,12 @@ static int malta_lcd_offs[] = { MALTA_ASCIIPOS7 }; +void +platform_cpu_init() +{ + /* Nothing special */ +} + /* * Put character to Malta LCD at given position. */ @@ -172,7 +178,7 @@ mips_init(void) } /* phys_avail regions are in bytes */ - phys_avail[0] = MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); + phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); phys_avail[1] = ctob(realmem); physmem = realmem; @@ -183,8 +189,10 @@ mips_init(void) pmap_bootstrap(); mips_proc0_init(); mutex_init(); -#ifdef DDB kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); #endif } @@ -226,6 +234,52 @@ platform_trap_exit(void) } +static uint64_t +malta_cpu_freq(void) +{ + uint64_t platform_counter_freq = 0; + +#if defined(TICK_USE_YAMON_FREQ) + /* + * If we are running on a board which uses YAMON firmware, + * then query CPU pipeline clock from the syscon object. + * If unsuccessful, use hard-coded default. + */ + platform_counter_freq = yamon_getcpufreq(); + +#elif defined(TICK_USE_MALTA_RTC) + /* + * If we are running on a board with the MC146818 RTC, + * use it to determine CPU pipeline clock frequency. + */ + u_int64_t counterval[2]; + + /* Set RTC to binary mode. */ + writertc(RTC_STATUSB, (rtcin(RTC_STATUSB) | RTCSB_BCD)); + + /* Busy-wait for falling edge of RTC update. */ + while (((rtcin(RTC_STATUSA) & RTCSA_TUP) == 0)) + ; + while (((rtcin(RTC_STATUSA)& RTCSA_TUP) != 0)) + ; + counterval[0] = mips_rd_count(); + + /* Busy-wait for falling edge of RTC update. */ + while (((rtcin(RTC_STATUSA) & RTCSA_TUP) == 0)) + ; + while (((rtcin(RTC_STATUSA)& RTCSA_TUP) != 0)) + ; + counterval[1] = mips_rd_count(); + + platform_counter_freq = counterval[1] - counterval[0]; +#endif + + if (platform_counter_freq == 0) + platform_counter_freq = MIPS_DEFAULT_HZ; + + return (platform_counter_freq); +} + void platform_start(__register_t a0, __register_t a1, __register_t a2, __register_t a3) @@ -239,9 +293,15 @@ platform_start(__register_t a0, __register_t a1, __register_t a2, int i; /* clear the BSS and SBSS segments */ - kernend = round_page((vm_offset_t)&end); + kernend = (vm_offset_t)&end; memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + mips_postboot_fixup(); + + mips_pcpu0_init(); + platform_counter_freq = malta_cpu_freq(); + mips_timer_early_init(platform_counter_freq); + cninit(); printf("entry: platform_start()\n"); @@ -262,44 +322,5 @@ platform_start(__register_t a0, __register_t a1, __register_t a2, realmem = btoc(memsize); mips_init(); - do { -#if defined(TICK_USE_YAMON_FREQ) - /* - * If we are running on a board which uses YAMON firmware, - * then query CPU pipeline clock from the syscon object. - * If unsuccessful, use hard-coded default. - */ - platform_counter_freq = yamon_getcpufreq(); - if (platform_counter_freq == 0) - platform_counter_freq = MIPS_DEFAULT_HZ; - -#elif defined(TICK_USE_MALTA_RTC) - /* - * If we are running on a board with the MC146818 RTC, - * use it to determine CPU pipeline clock frequency. - */ - u_int64_t counterval[2]; - - /* Set RTC to binary mode. */ - writertc(RTC_STATUSB, (rtcin(RTC_STATUSB) | RTCSB_BCD)); - - /* Busy-wait for falling edge of RTC update. */ - while (((rtcin(RTC_STATUSA) & RTCSA_TUP) == 0)) - ; - while (((rtcin(RTC_STATUSA)& RTCSA_TUP) != 0)) - ; - counterval[0] = mips_rd_count(); - - /* Busy-wait for falling edge of RTC update. */ - while (((rtcin(RTC_STATUSA) & RTCSA_TUP) == 0)) - ; - while (((rtcin(RTC_STATUSA)& RTCSA_TUP) != 0)) - ; - counterval[1] = mips_rd_count(); - - platform_counter_freq = counterval[1] - counterval[0]; -#endif - } while(0); - mips_timer_init_params(platform_counter_freq, 0); } diff --git a/sys/mips/malta/maltareg.h b/sys/mips/malta/maltareg.h index f2a7d083bbb7..c311d30885bb 100644 --- a/sys/mips/malta/maltareg.h +++ b/sys/mips/malta/maltareg.h @@ -94,37 +94,37 @@ 15 Secondary IDE Secondary IDE slot/Compact flash connector */ -#define MALTA_SYSTEMRAM_BASE 0x00000000 /* System RAM: */ +#define MALTA_SYSTEMRAM_BASE 0x00000000ul /* System RAM: */ #define MALTA_SYSTEMRAM_SIZE 0x08000000 /* 128 MByte */ -#define MALTA_PCIMEM1_BASE 0x08000000 /* PCI 1 memory: */ +#define MALTA_PCIMEM1_BASE 0x08000000ul /* PCI 1 memory: */ #define MALTA_PCIMEM1_SIZE 0x08000000 /* 128 MByte */ -#define MALTA_PCIMEM2_BASE 0x10000000 /* PCI 2 memory: */ +#define MALTA_PCIMEM2_BASE 0x10000000ul /* PCI 2 memory: */ #define MALTA_PCIMEM2_SIZE 0x08000000 /* 128 MByte */ -#define MALTA_PCIMEM3_BASE 0x18000000 /* PCI 3 memory */ +#define MALTA_PCIMEM3_BASE 0x18000000ul /* PCI 3 memory */ #define MALTA_PCIMEM3_SIZE 0x03e00000 /* 62 MByte */ -#define MALTA_CORECTRL_BASE 0x1be00000 /* Core control: */ +#define MALTA_CORECTRL_BASE 0x1be00000ul /* Core control: */ #define MALTA_CORECTRL_SIZE 0x00200000 /* 2 MByte */ -#define MALTA_RESERVED_BASE1 0x1c000000 /* Reserved: */ +#define MALTA_RESERVED_BASE1 0x1c000000ul /* Reserved: */ #define MALTA_RESERVED_SIZE1 0x02000000 /* 32 MByte */ -#define MALTA_MONITORFLASH_BASE 0x1e000000 /* Monitor Flash: */ +#define MALTA_MONITORFLASH_BASE 0x1e000000ul /* Monitor Flash: */ #define MALTA_MONITORFLASH_SIZE 0x003e0000 /* 4 MByte */ #define MALTA_MONITORFLASH_SECTORSIZE 0x00010000 /* Sect. = 64 KB */ -#define MALTA_FILEFLASH_BASE 0x1e3e0000 /* File Flash (for monitor): */ +#define MALTA_FILEFLASH_BASE 0x1e3e0000ul /* File Flash (for monitor): */ #define MALTA_FILEFLASH_SIZE 0x00020000 /* 128 KByte */ #define MALTA_FILEFLASH_SECTORSIZE 0x00010000 /* Sect. = 64 KB */ -#define MALTA_RESERVED_BASE2 0x1e400000 /* Reserved: */ +#define MALTA_RESERVED_BASE2 0x1e400000ul /* Reserved: */ #define MALTA_RESERVED_SIZE2 0x00c00000 /* 12 MByte */ -#define MALTA_FPGA_BASE 0x1f000000 /* FPGA: */ +#define MALTA_FPGA_BASE 0x1f000000ul /* FPGA: */ #define MALTA_FPGA_SIZE 0x00c00000 /* 12 MByte */ #define MALTA_NMISTATUS (MALTA_FPGA_BASE + 0x24) @@ -191,10 +191,10 @@ #define MALTA_I2COUT 0x10 #define MALTA_I2CSEL 0x18 -#define MALTA_BOOTROM_BASE 0x1fc00000 /* Boot ROM: */ +#define MALTA_BOOTROM_BASE 0x1fc00000ul /* Boot ROM: */ #define MALTA_BOOTROM_SIZE 0x00400000 /* 4 MByte */ -#define MALTA_REVISION 0x1fc00010 +#define MALTA_REVISION 0x1fc00010ul #define MALTA_REV_FPGRV 0xff0000 /* CBUS FPGA revision */ #define MALTA_REV_CORID 0x00fc00 /* Core Board ID */ #define MALTA_REV_CORRV 0x000300 /* Core Board Revision */ diff --git a/sys/mips/malta/obio.c b/sys/mips/malta/obio.c index ae486edc97c3..21958375fa65 100644 --- a/sys/mips/malta/obio.c +++ b/sys/mips/malta/obio.c @@ -63,20 +63,18 @@ int obio_attach(device_t); * A bit tricky and hackish. Since we need OBIO to rely * on PCI we make it pseudo-pci device. But there should * be only one such device, so we use this static flag - * to prevent false positives on every realPCI device probe. + * to prevent false positives on every real PCI device probe. */ static int have_one = 0; int obio_probe(device_t dev) { - if(!have_one) - { + if (!have_one) { have_one = 1; return 0; } - else - return (ENXIO); + return (ENXIO); } int @@ -84,7 +82,7 @@ obio_attach(device_t dev) { struct obio_softc *sc = device_get_softc(dev); - sc->oba_st = MIPS_BUS_SPACE_IO; + sc->oba_st = mips_bus_space_generic; sc->oba_addr = MIPS_PHYS_TO_KSEG1(MALTA_UART0ADR); sc->oba_size = MALTA_PCIMEM3_SIZE; sc->oba_rman.rm_type = RMAN_ARRAY; diff --git a/sys/mips/malta/std.malta b/sys/mips/malta/std.malta index ca67e5628268..6035c3294d89 100644 --- a/sys/mips/malta/std.malta +++ b/sys/mips/malta/std.malta @@ -2,8 +2,7 @@ files "../malta/files.malta" cpu CPU_MIPS4KC -options ISA_MIPS32 -options SOFTFLOAT +#options ISA_MIPS32 device pci device ata device atadisk diff --git a/sys/mips/malta/uart_bus_maltausart.c b/sys/mips/malta/uart_bus_maltausart.c index da266a8d54fd..e075fff62e53 100644 --- a/sys/mips/malta/uart_bus_maltausart.c +++ b/sys/mips/malta/uart_bus_maltausart.c @@ -28,10 +28,6 @@ * code written by Olivier Houchard. */ -/* - * XXXMIPS: This file is hacked from arm/... . XXXMIPS here means this file is - * experimental and was written for MIPS32 port. - */ #include "opt_uart.h" #include @@ -53,9 +49,6 @@ __FBSDID("$FreeBSD$"); #include #include -/* - * XXXMIPS: - */ #include #include "uart_if.h" @@ -88,9 +81,9 @@ uart_malta_probe(device_t dev) sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs); sc->sc_class = &uart_ns8250_class; bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); - sc->sc_sysdev->bas.bst = 0; + sc->sc_sysdev->bas.bst = mips_bus_space_generic; sc->sc_sysdev->bas.bsh = MIPS_PHYS_TO_KSEG1(MALTA_UART0ADR); - sc->sc_bas.bst = 0; + sc->sc_bas.bst = mips_bus_space_generic; sc->sc_bas.bsh = MIPS_PHYS_TO_KSEG1(MALTA_UART0ADR); return(uart_bus_probe(dev, 0, 0, 0, 0)); } diff --git a/sys/mips/malta/uart_cpu_maltausart.c b/sys/mips/malta/uart_cpu_maltausart.c index 758d9a7fedbe..07ea548a0a1f 100644 --- a/sys/mips/malta/uart_cpu_maltausart.c +++ b/sys/mips/malta/uart_cpu_maltausart.c @@ -29,10 +29,6 @@ * Skeleton of this file was based on respective code for ARM * code written by Olivier Houchard. */ -/* - * XXXMIPS: This file is hacked from arm/... . XXXMIPS here means this file is - * experimental and was written for MIPS32 port. - */ #include "opt_uart.h" #include @@ -67,16 +63,16 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) { di->ops = uart_getops(&uart_ns8250_class); di->bas.chan = 0; - di->bas.bst = 0; + di->bas.bst = mips_bus_space_generic; + di->bas.bsh = MIPS_PHYS_TO_KSEG1(MALTA_UART0ADR); di->bas.regshft = 0; di->bas.rclk = 0; - di->baudrate = 115200; + di->baudrate = 0; /* retain the baudrate configured by YAMON */ di->databits = 8; di->stopbits = 1; di->parity = UART_PARITY_NONE; - uart_bus_space_io = MIPS_PHYS_TO_KSEG1(MALTA_UART0ADR); - uart_bus_space_mem = MIPS_PHYS_TO_KSEG1(MALTA_UART0ADR); - di->bas.bsh = MIPS_PHYS_TO_KSEG1(MALTA_UART0ADR); + uart_bus_space_io = NULL; + uart_bus_space_mem = mips_bus_space_generic; return (0); } diff --git a/sys/mips/malta/yamon.h b/sys/mips/malta/yamon.h index 69705103a408..f039ae8342d7 100644 --- a/sys/mips/malta/yamon.h +++ b/sys/mips/malta/yamon.h @@ -38,7 +38,7 @@ #ifndef _MALTA_YAMON_H_ #define _MALTA_YAMON_H_ -#define YAMON_FUNCTION_BASE 0x1fc00500 +#define YAMON_FUNCTION_BASE 0x1fc00500ul #define YAMON_PRINT_COUNT_OFS (YAMON_FUNCTION_BASE + 0x04) #define YAMON_EXIT_OFS (YAMON_FUNCTION_BASE + 0x20) @@ -53,7 +53,7 @@ #define YAMON_GETCHAR_OFS (YAMON_FUNCTION_BASE + 0x50) #define YAMON_SYSCON_READ_OFS (YAMON_FUNCTION_BASE + 0x54) -#define YAMON_FUNC(ofs) (*(uint32_t *)(MIPS_PHYS_TO_KSEG0(ofs))) +#define YAMON_FUNC(ofs) ((long)(*(int32_t *)(MIPS_PHYS_TO_KSEG0(ofs)))) typedef void (*t_yamon_print_count)(uint32_t port, char *s, uint32_t count); #define YAMON_PRINT_COUNT(s, count) \ diff --git a/sys/mips/mips/bus_space_generic.c b/sys/mips/mips/bus_space_generic.c new file mode 100644 index 000000000000..b934ec42ad13 --- /dev/null +++ b/sys/mips/mips/bus_space_generic.c @@ -0,0 +1,598 @@ +/* $NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $ */ +/*- + * $Id: bus.h,v 1.6 2007/08/09 11:23:32 katta Exp $ + * + * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +/* + * Copyright (c) 1996 Charles M. Hannum. All rights reserved. + * Copyright (c) 1996 Christopher G. Demetriou. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christopher G. Demetriou + * for the NetBSD Project. + * 4. 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 ``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 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. + * + * from: src/sys/alpha/include/bus.h,v 1.5 1999/08/28 00:38:40 peter + * $FreeBSD$ + */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +static struct bus_space generic_space = { + /* cookie */ + (void *) 0, + + /* mapping/unmapping */ + generic_bs_map, + generic_bs_unmap, + generic_bs_subregion, + + /* allocation/deallocation */ + NULL, + NULL, + + /* barrier */ + generic_bs_barrier, + + /* read (single) */ + generic_bs_r_1, + generic_bs_r_2, + generic_bs_r_4, + NULL, + + /* read multiple */ + generic_bs_rm_1, + generic_bs_rm_2, + generic_bs_rm_4, + NULL, + + /* read region */ + generic_bs_rr_1, + generic_bs_rr_2, + generic_bs_rr_4, + NULL, + + /* write (single) */ + generic_bs_w_1, + generic_bs_w_2, + generic_bs_w_4, + NULL, + + /* write multiple */ + generic_bs_wm_1, + generic_bs_wm_2, + generic_bs_wm_4, + NULL, + + /* write region */ + NULL, + generic_bs_wr_2, + generic_bs_wr_4, + NULL, + + /* set multiple */ + NULL, + NULL, + NULL, + NULL, + + /* set region */ + NULL, + generic_bs_sr_2, + generic_bs_sr_4, + NULL, + + /* copy */ + NULL, + generic_bs_c_2, + NULL, + NULL, + + /* read (single) stream */ + generic_bs_r_1, + generic_bs_r_2, + generic_bs_r_4, + NULL, + + /* read multiple stream */ + generic_bs_rm_1, + generic_bs_rm_2, + generic_bs_rm_4, + NULL, + + /* read region stream */ + generic_bs_rr_1, + generic_bs_rr_2, + generic_bs_rr_4, + NULL, + + /* write (single) stream */ + generic_bs_w_1, + generic_bs_w_2, + generic_bs_w_4, + NULL, + + /* write multiple stream */ + generic_bs_wm_1, + generic_bs_wm_2, + generic_bs_wm_4, + NULL, + + /* write region stream */ + NULL, + generic_bs_wr_2, + generic_bs_wr_4, + NULL, +}; + +/* Ultra-gross kludge */ +#include "opt_cputype.h" +#if defined(TARGET_OCTEON) && defined(ISA_MIPS32) +#include +#define rd8(a) oct_read8(a) +#define rd16(a) oct_read16(a) +#define rd32(a) oct_read32(a) +#define wr8(a, v) oct_write8(a, v) +#define wr16(a, v) oct_write16(a, v) +#define wr32(a, v) oct_write32(a, v) +#elif defined(CPU_SB1) && _BYTE_ORDER == _BIG_ENDIAN +#include +#define rd8(a) sb_big_endian_read8(a) +#define rd16(a) sb_big_endian_read16(a) +#define rd32(a) sb_big_endian_read32(a) +#define wr8(a, v) sb_big_endian_write8(a, v) +#define wr16(a, v) sb_big_endian_write16(a, v) +#define wr32(a, v) sb_big_endian_write32(a, v) +#else +#define rd8(a) readb(a) +#define rd16(a) readw(a) +#define rd32(a) readl(a) +#define wr8(a, v) writeb(a, v) +#define wr16(a, v) writew(a, v) +#define wr32(a, v) writel(a, v) +#endif + +/* generic bus_space tag */ +bus_space_tag_t mips_bus_space_generic = &generic_space; + +int +generic_bs_map(void *t __unused, bus_addr_t addr, + bus_size_t size __unused, int flags __unused, + bus_space_handle_t *bshp) +{ + + *bshp = addr; + return (0); +} + +void +generic_bs_unmap(void *t __unused, bus_space_handle_t bh __unused, + bus_size_t size __unused) +{ + + /* Do nothing */ +} + +int +generic_bs_subregion(void *t __unused, bus_space_handle_t handle __unused, + bus_size_t offset __unused, bus_size_t size __unused, + bus_space_handle_t *nhandle __unused) +{ + + printf("SUBREGION?!?!?!\n"); + /* Do nothing */ + return (0); +} + +uint8_t +generic_bs_r_1(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + + return (rd8(handle + offset)); +} + +uint16_t +generic_bs_r_2(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + + return (rd16(handle + offset)); +} + +uint32_t +generic_bs_r_4(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + + return (rd32(handle + offset)); +} + + +void +generic_bs_rm_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint8_t *addr, size_t count) +{ + + while (count--) + *addr++ = rd8(bsh + offset); +} + +void +generic_bs_rm_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint16_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) + *addr++ = rd16(baddr); +} + +void +generic_bs_rm_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint32_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) + *addr++ = rd32(baddr); +} + + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle and starting at `offset' and copy into + * buffer provided. + */ +void +generic_bs_rr_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint8_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = rd8(baddr); + baddr += 1; + } +} + +void +generic_bs_rr_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint16_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = rd16(baddr); + baddr += 2; + } +} + +void +generic_bs_rr_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint32_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = rd32(baddr); + baddr += 4; + } +} + +/* + * Write the 1, 2, 4, or 8 byte value `value' to bus space + * described by tag/handle/offset. + */ +void +generic_bs_w_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint8_t value) +{ + + wr8(bsh + offset, value); +} + +void +generic_bs_w_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint16_t value) +{ + + wr16(bsh + offset, value); +} + +void +generic_bs_w_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint32_t value) +{ + + wr32(bsh + offset, value); +} + +/* + * Write `count' 1, 2, 4, or 8 byte quantities from the buffer + * provided to bus space described by tag/handle/offset. + */ +void +generic_bs_wm_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, const uint8_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) + wr8(baddr, *addr++); +} + +void +generic_bs_wm_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, const uint16_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) + wr16(baddr, *addr++); +} + +void +generic_bs_wm_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, const uint32_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) + wr32(baddr, *addr++); +} + +/* + * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided + * to bus space described by tag/handle starting at `offset'. + */ +void +generic_bs_wr_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, const uint8_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + wr8(baddr, *addr++); + baddr += 1; + } +} + +void +generic_bs_wr_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, const uint16_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + wr16(baddr, *addr++); + baddr += 2; + } +} + +void +generic_bs_wr_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, const uint32_t *addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + wr32(baddr, *addr++); + baddr += 4; + } +} + +/* + * Write the 1, 2, 4, or 8 byte value `val' to bus space described + * by tag/handle/offset `count' times. + */ +void +generic_bs_sm_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint8_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + while (count--) + wr8(addr, value); +} + +void +generic_bs_sm_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint16_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + while (count--) + wr16(addr, value); +} + +void +generic_bs_sm_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint32_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + while (count--) + wr32(addr, value); +} + +/* + * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described + * by tag/handle starting at `offset'. + */ +void +generic_bs_sr_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint8_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr++) + wr8(addr, value); +} + +void +generic_bs_sr_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint16_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 2) + wr16(addr, value); +} + +void +generic_bs_sr_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, uint32_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 4) + wr32(addr, value); +} + +/* + * Copy `count' 1, 2, 4, or 8 byte values from bus space starting + * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. + */ +void +generic_bs_c_1(void *t, bus_space_handle_t bsh1, + bus_size_t off1, bus_space_handle_t bsh2, + bus_size_t off2, size_t count) +{ + bus_addr_t addr1 = bsh1 + off1; + bus_addr_t addr2 = bsh2 + off2; + + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; count != 0; count--, addr1++, addr2++) + wr8(addr2, rd8(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += (count - 1), addr2 += (count - 1); + count != 0; count--, addr1--, addr2--) + wr8(addr2, rd8(addr1)); + } +} + +void +generic_bs_c_2(void *t, bus_space_handle_t bsh1, + bus_size_t off1, bus_space_handle_t bsh2, + bus_size_t off2, size_t count) +{ + bus_addr_t addr1 = bsh1 + off1; + bus_addr_t addr2 = bsh2 + off2; + + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; count != 0; count--, addr1 += 2, addr2 += 2) + wr16(addr2, rd16(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1); + count != 0; count--, addr1 -= 2, addr2 -= 2) + wr16(addr2, rd16(addr1)); + } +} + +void +generic_bs_c_4(void *t, bus_space_handle_t bsh1, + bus_size_t off1, bus_space_handle_t bsh2, + bus_size_t off2, size_t count) +{ + bus_addr_t addr1 = bsh1 + off1; + bus_addr_t addr2 = bsh2 + off2; + + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; count != 0; count--, addr1 += 4, addr2 += 4) + wr32(addr2, rd32(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1); + count != 0; count--, addr1 -= 4, addr2 -= 4) + wr32(addr2, rd32(addr1)); + } +} + +void +generic_bs_barrier(void *t __unused, + bus_space_handle_t bsh __unused, + bus_size_t offset __unused, bus_size_t len __unused, + int flags) +{ +#if 0 + if (flags & BUS_SPACE_BARRIER_WRITE) + mips_dcache_wbinv_all(); +#endif +} diff --git a/sys/mips/mips/busdma_machdep.c b/sys/mips/mips/busdma_machdep.c index 13c45b84b001..4e7b45f516cc 100644 --- a/sys/mips/mips/busdma_machdep.c +++ b/sys/mips/mips/busdma_machdep.c @@ -23,50 +23,16 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * From i386/busdma_machdep.c,v 1.26 2002/04/19 22:58:09 alfred */ -/*- - * Copyright (c) 1997, 1998, 2001 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, - * NASA Ames Research Center. - * - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. - */ - -/* $NetBSD: bus_dma.c,v 1.17 2006/03/01 12:38:11 yamt Exp $ */ - #include __FBSDID("$FreeBSD$"); +/* + * MIPS bus dma support routines + */ + #include #include #include @@ -79,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -88,6 +55,13 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include + +#define MAX_BPAGES 64 +#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 +#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4 + +struct bounce_zone; struct bus_dma_tag { bus_dma_tag_t parent; @@ -105,19 +79,59 @@ struct bus_dma_tag { int map_count; bus_dma_lock_t *lockfunc; void *lockfuncarg; - /* XXX: machine-dependent fields */ - vm_offset_t _physbase; - vm_offset_t _wbase; - vm_offset_t _wsize; + struct bounce_zone *bounce_zone; }; +struct bounce_page { + vm_offset_t vaddr; /* kva of bounce buffer */ + vm_offset_t vaddr_nocache; /* kva of bounce buffer uncached */ + bus_addr_t busaddr; /* Physical address */ + vm_offset_t datavaddr; /* kva of client data */ + bus_size_t datacount; /* client data count */ + STAILQ_ENTRY(bounce_page) links; +}; + +int busdma_swi_pending; + +struct bounce_zone { + STAILQ_ENTRY(bounce_zone) links; + STAILQ_HEAD(bp_list, bounce_page) bounce_page_list; + int total_bpages; + int free_bpages; + int reserved_bpages; + int active_bpages; + int total_bounced; + int total_deferred; + int map_count; + bus_size_t alignment; + bus_addr_t lowaddr; + char zoneid[8]; + char lowaddrid[20]; + struct sysctl_ctx_list sysctl_tree; + struct sysctl_oid *sysctl_tree_top; +}; + +static struct mtx bounce_lock; +static int total_bpages; +static int busdma_zonecount; +static STAILQ_HEAD(, bounce_zone) bounce_zone_list; + +SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD, 0, "Busdma parameters"); +SYSCTL_INT(_hw_busdma, OID_AUTO, total_bpages, CTLFLAG_RD, &total_bpages, 0, + "Total bounce pages"); + #define DMAMAP_LINEAR 0x1 #define DMAMAP_MBUF 0x2 #define DMAMAP_UIO 0x4 -#define DMAMAP_ALLOCATED 0x10 #define DMAMAP_TYPE_MASK (DMAMAP_LINEAR|DMAMAP_MBUF|DMAMAP_UIO) #define DMAMAP_COHERENT 0x8 +#define DMAMAP_ALLOCATED 0x10 +#define DMAMAP_MALLOCUSED 0x20 + struct bus_dmamap { + struct bp_list bpages; + int pagesneeded; + int pagesreserved; bus_dma_tag_t dmat; int flags; void *buffer; @@ -125,8 +139,15 @@ struct bus_dmamap { void *allocbuffer; TAILQ_ENTRY(bus_dmamap) freelist; int len; + STAILQ_ENTRY(bus_dmamap) links; + bus_dmamap_callback_t *callback; + void *callback_arg; + }; +static STAILQ_HEAD(, bus_dmamap) bounce_map_waitinglist; +static STAILQ_HEAD(, bus_dmamap) bounce_map_callbacklist; + static TAILQ_HEAD(,bus_dmamap) dmamap_freelist = TAILQ_HEAD_INITIALIZER(dmamap_freelist); @@ -137,6 +158,45 @@ static struct mtx busdma_mtx; MTX_SYSINIT(busdma_mtx, &busdma_mtx, "busdma lock", MTX_DEF); +static void init_bounce_pages(void *dummy); +static int alloc_bounce_zone(bus_dma_tag_t dmat); +static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages); +static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, + int commit); +static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, + vm_offset_t vaddr, bus_size_t size); +static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); + +/* Default tag, as most drivers provide no parent tag. */ +bus_dma_tag_t mips_root_dma_tag; + +/* + * Return true if a match is made. + * + * To find a match walk the chain of bus_dma_tag_t's looking for 'paddr'. + * + * If paddr is within the bounds of the dma tag then call the filter callback + * to check for a match, if there is no filter callback then assume a match. + */ +static int +run_filter(bus_dma_tag_t dmat, bus_addr_t paddr) +{ + int retval; + + retval = 0; + + do { + if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr) + || ((paddr & (dmat->alignment - 1)) != 0)) + && (dmat->filter == NULL + || (*dmat->filter)(dmat->filterarg, paddr) != 0)) + retval = 1; + + dmat = dmat->parent; + } while (retval == 0 && dmat != NULL); + return (retval); +} + static void mips_dmamap_freelist_init(void *dummy) { @@ -157,6 +217,19 @@ bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap, int flags, vm_offset_t *lastaddrp, int *segp); +static __inline int +_bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr) +{ + int i; + for (i = 0; phys_avail[i] && phys_avail[i + 1]; i += 2) { + if ((lowaddr >= phys_avail[i] && lowaddr <= phys_avail[i + 1]) + || (lowaddr < phys_avail[i] && + highaddr > phys_avail[i])) + return (1); + } + return (0); +} + /* * Convenience function for manipulating driver locks from busdma (during * busdma_swi, for example). Drivers that don't provide their own locks @@ -213,6 +286,7 @@ _busdma_alloc_dmamap(void) map->flags = DMAMAP_ALLOCATED; } else map->flags = 0; + STAILQ_INIT(&map->bpages); return (map); } @@ -228,6 +302,11 @@ _busdma_free_dmamap(bus_dmamap_t map) } } +/* + * Allocate a device specific dma_tag. + */ +#define SEG_NB 1024 + int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, bus_size_t boundary, bus_addr_t lowaddr, @@ -238,16 +317,12 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, { bus_dma_tag_t newtag; int error = 0; - - /* Basic sanity checking */ - if (boundary != 0 && boundary < maxsegsz) - maxsegsz = boundary; - /* Return a NULL tag on failure */ *dmat = NULL; + if (!parent) + parent = mips_root_dma_tag; - newtag = (bus_dma_tag_t)malloc(sizeof(*newtag), M_DEVBUF, - M_ZERO | M_NOWAIT); + newtag = (bus_dma_tag_t)malloc(sizeof(*newtag), M_DEVBUF, M_NOWAIT); if (newtag == NULL) { CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", __func__, newtag, 0, error); @@ -257,21 +332,16 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, newtag->parent = parent; newtag->alignment = alignment; newtag->boundary = boundary; - newtag->lowaddr = trunc_page((vm_paddr_t)lowaddr) + (PAGE_SIZE - 1); - newtag->highaddr = trunc_page((vm_paddr_t)highaddr) + - (PAGE_SIZE - 1); + newtag->lowaddr = trunc_page((vm_offset_t)lowaddr) + (PAGE_SIZE - 1); + newtag->highaddr = trunc_page((vm_offset_t)highaddr) + (PAGE_SIZE - 1); newtag->filter = filter; newtag->filterarg = filterarg; - newtag->maxsize = maxsize; - newtag->nsegments = nsegments; + newtag->maxsize = maxsize; + newtag->nsegments = nsegments; newtag->maxsegsz = maxsegsz; newtag->flags = flags; newtag->ref_count = 1; /* Count ourself */ newtag->map_count = 0; - newtag->_wbase = 0; - newtag->_physbase = 0; - /* XXXMIPS: Should we limit window size to amount of physical memory */ - newtag->_wsize = MIPS_KSEG1_START - MIPS_KSEG0_START; if (lockfunc != NULL) { newtag->lockfunc = lockfunc; newtag->lockfuncarg = lockfuncarg; @@ -279,36 +349,68 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, newtag->lockfunc = dflt_lock; newtag->lockfuncarg = NULL; } - - /* Take into account any restrictions imposed by our parent tag */ - if (parent != NULL) { - newtag->lowaddr = MIN(parent->lowaddr, newtag->lowaddr); - newtag->highaddr = MAX(parent->highaddr, newtag->highaddr); + /* + * Take into account any restrictions imposed by our parent tag + */ + if (parent != NULL) { + newtag->lowaddr = min(parent->lowaddr, newtag->lowaddr); + newtag->highaddr = max(parent->highaddr, newtag->highaddr); if (newtag->boundary == 0) newtag->boundary = parent->boundary; else if (parent->boundary != 0) - newtag->boundary = MIN(parent->boundary, + newtag->boundary = min(parent->boundary, newtag->boundary); - if (newtag->filter == NULL) { - /* - * Short circuit looking at our parent directly - * since we have encapsulated all of its information - */ - newtag->filter = parent->filter; - newtag->filterarg = parent->filterarg; - newtag->parent = parent->parent; + if ((newtag->filter != NULL) || + ((parent->flags & BUS_DMA_COULD_BOUNCE) != 0)) + newtag->flags |= BUS_DMA_COULD_BOUNCE; + if (newtag->filter == NULL) { + /* + * Short circuit looking at our parent directly + * since we have encapsulated all of its information + */ + newtag->filter = parent->filter; + newtag->filterarg = parent->filterarg; + newtag->parent = parent->parent; } if (newtag->parent != NULL) atomic_add_int(&parent->ref_count, 1); } + if (_bus_dma_can_bounce(newtag->lowaddr, newtag->highaddr) + || newtag->alignment > 1) + newtag->flags |= BUS_DMA_COULD_BOUNCE; - if (error != 0) { + if (((newtag->flags & BUS_DMA_COULD_BOUNCE) != 0) && + (flags & BUS_DMA_ALLOCNOW) != 0) { + struct bounce_zone *bz; + + /* Must bounce */ + + if ((error = alloc_bounce_zone(newtag)) != 0) { + free(newtag, M_DEVBUF); + return (error); + } + bz = newtag->bounce_zone; + + if (ptoa(bz->total_bpages) < maxsize) { + int pages; + + pages = atop(maxsize) - bz->total_bpages; + + /* Add pages to our bounce pool */ + if (alloc_bounce_pages(newtag, pages) < pages) + error = ENOMEM; + } + /* Performed initial allocation */ + newtag->flags |= BUS_DMA_MIN_ALLOC_COMP; + } else + newtag->bounce_zone = NULL; + if (error != 0) free(newtag, M_DEVBUF); - } else { + else *dmat = newtag; - } CTR4(KTR_BUSDMA, "%s returned tag %p tag flags 0x%x error %d", __func__, newtag, (newtag != NULL ? newtag->flags : 0), error); + return (error); } @@ -346,6 +448,7 @@ bus_dma_tag_destroy(bus_dma_tag_t dmat) return (0); } +#include /* * Allocate a handle for mapping from kva/uva/physical * address space into bus device space. @@ -354,9 +457,7 @@ int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) { bus_dmamap_t newmap; -#ifdef KTR int error = 0; -#endif newmap = _busdma_alloc_dmamap(); if (newmap == NULL) { @@ -365,13 +466,64 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) } *mapp = newmap; newmap->dmat = dmat; + newmap->allocbuffer = NULL; dmat->map_count++; + /* + * Bouncing might be required if the driver asks for an active + * exclusion region, a data alignment that is stricter than 1, and/or + * an active address boundary. + */ + if (dmat->flags & BUS_DMA_COULD_BOUNCE) { + + /* Must bounce */ + struct bounce_zone *bz; + int maxpages; + + if (dmat->bounce_zone == NULL) { + if ((error = alloc_bounce_zone(dmat)) != 0) { + _busdma_free_dmamap(newmap); + *mapp = NULL; + return (error); + } + } + bz = dmat->bounce_zone; + + /* Initialize the new map */ + STAILQ_INIT(&((*mapp)->bpages)); + + /* + * Attempt to add pages to our pool on a per-instance + * basis up to a sane limit. + */ + maxpages = MAX_BPAGES; + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0 + || (bz->map_count > 0 && bz->total_bpages < maxpages)) { + int pages; + + pages = MAX(atop(dmat->maxsize), 1); + pages = MIN(maxpages - bz->total_bpages, pages); + pages = MAX(pages, 1); + if (alloc_bounce_pages(dmat, pages) < pages) + error = ENOMEM; + + if ((dmat->flags & BUS_DMA_MIN_ALLOC_COMP) == 0) { + if (error == 0) + dmat->flags |= BUS_DMA_MIN_ALLOC_COMP; + } else { + error = 0; + } + } + bz->map_count++; + } + + if (flags & BUS_DMA_COHERENT) + newmap->flags |= DMAMAP_COHERENT; + CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", __func__, dmat, dmat->flags, error); return (0); - } /* @@ -381,7 +533,15 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) { + _busdma_free_dmamap(map); + if (STAILQ_FIRST(&map->bpages) != NULL) { + CTR3(KTR_BUSDMA, "%s: tag %p error %d", + __func__, dmat, EBUSY); + return (EBUSY); + } + if (dmat->bounce_zone) + dmat->bounce_zone->map_count--; dmat->map_count--; CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); return (0); @@ -416,9 +576,16 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, dmat->map_count++; *mapp = newmap; newmap->dmat = dmat; + + if (flags & BUS_DMA_COHERENT) + newmap->flags |= DMAMAP_COHERENT; - if (dmat->maxsize <= PAGE_SIZE) { + if (dmat->maxsize <= PAGE_SIZE && + (dmat->alignment < dmat->maxsize) && + !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr) && + !(flags & BUS_DMA_COHERENT)) { *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags); + newmap->flags |= DMAMAP_MALLOCUSED; } else { /* * XXX Use Contigmalloc until it is merged into this facility @@ -440,7 +607,7 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, maxphys = dmat->lowaddr; } *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags, - 0ul, maxphys, dmat->alignment? dmat->alignment : 1ul, + 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, dmat->boundary); } if (*vaddr == NULL) { @@ -451,6 +618,7 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, *mapp = NULL; return (ENOMEM); } + if (flags & BUS_DMA_COHERENT) { void *tmpaddr = (void *)*vaddr; @@ -463,10 +631,10 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, *vaddr = tmpaddr; } else newmap->origbuffer = newmap->allocbuffer = NULL; - } else + } else newmap->origbuffer = newmap->allocbuffer = NULL; - return (0); + return (0); } /* @@ -481,15 +649,69 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) ("Trying to freeing the wrong DMA buffer")); vaddr = map->origbuffer; } - if (dmat->maxsize <= PAGE_SIZE) + + if (map->flags & DMAMAP_MALLOCUSED) free(vaddr, M_DEVBUF); - else { + else contigfree(vaddr, dmat->maxsize, M_DEVBUF); - } + dmat->map_count--; _busdma_free_dmamap(map); CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, dmat->flags); +} +static int +_bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, + void *buf, bus_size_t buflen, int flags) +{ + vm_offset_t vaddr; + vm_offset_t vendaddr; + bus_addr_t paddr; + + if ((map->pagesneeded == 0)) { + CTR3(KTR_BUSDMA, "lowaddr= %d, boundary= %d, alignment= %d", + dmat->lowaddr, dmat->boundary, dmat->alignment); + CTR2(KTR_BUSDMA, "map= %p, pagesneeded= %d", + map, map->pagesneeded); + /* + * Count the number of bounce pages + * needed in order to complete this transfer + */ + vaddr = trunc_page((vm_offset_t)buf); + vendaddr = (vm_offset_t)buf + buflen; + + while (vaddr < vendaddr) { + KASSERT(kernel_pmap == pmap, ("pmap is not kernel pmap")); + paddr = pmap_kextract(vaddr); + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + run_filter(dmat, paddr) != 0) + map->pagesneeded++; + vaddr += PAGE_SIZE; + } + CTR1(KTR_BUSDMA, "pagesneeded= %d\n", map->pagesneeded); + } + + /* Reserve Necessary Bounce Pages */ + if (map->pagesneeded != 0) { + mtx_lock(&bounce_lock); + if (flags & BUS_DMA_NOWAIT) { + if (reserve_bounce_pages(dmat, map, 0) != 0) { + mtx_unlock(&bounce_lock); + return (ENOMEM); + } + } else { + if (reserve_bounce_pages(dmat, map, 1) != 0) { + /* Queue us for resources */ + STAILQ_INSERT_TAIL(&bounce_map_waitinglist, + map, links); + mtx_unlock(&bounce_lock); + return (EINPROGRESS); + } + } + mtx_unlock(&bounce_lock); + } + + return (0); } /* @@ -504,8 +726,7 @@ bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, int flags, vm_offset_t *lastaddrp, int *segp) { bus_size_t sgsize; - bus_size_t bmask; - vm_offset_t curaddr, lastaddr; + bus_addr_t curaddr, lastaddr, baddr, bmask; vm_offset_t vaddr = (vm_offset_t)buf; int seg; int error = 0; @@ -513,35 +734,47 @@ bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs, lastaddr = *lastaddrp; bmask = ~(dmat->boundary - 1); + if ((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) { + error = _bus_dmamap_count_pages(dmat, map, pmap, buf, buflen, + flags); + if (error) + return (error); + } + CTR3(KTR_BUSDMA, "lowaddr= %d boundary= %d, " + "alignment= %d", dmat->lowaddr, dmat->boundary, dmat->alignment); + for (seg = *segp; buflen > 0 ; ) { /* * Get the physical address for this segment. + * + * XXX Don't support checking for coherent mappings + * XXX in user address space. */ KASSERT(kernel_pmap == pmap, ("pmap is not kernel pmap")); curaddr = pmap_kextract(vaddr); - /* - * If we're beyond the current DMA window, indicate - * that and try to fall back onto something else. - */ - if (curaddr < dmat->_physbase || - curaddr >= (dmat->_physbase + dmat->_wsize)) - return (EINVAL); - - /* - * In a valid DMA range. Translate the physical - * memory address to an address in the DMA window. - */ - curaddr = (curaddr - dmat->_physbase) + dmat->_wbase; - - /* * Compute the segment size, and adjust counts. */ sgsize = PAGE_SIZE - ((u_long)curaddr & PAGE_MASK); + if (sgsize > dmat->maxsegsz) + sgsize = dmat->maxsegsz; if (buflen < sgsize) sgsize = buflen; + /* + * Make sure we don't cross any boundaries. + */ + if (dmat->boundary > 0) { + baddr = (curaddr + dmat->boundary) & bmask; + if (sgsize > (baddr - curaddr)) + sgsize = (baddr - curaddr); + } + if (((dmat->flags & BUS_DMA_COULD_BOUNCE) != 0) && + map->pagesneeded != 0 && run_filter(dmat, curaddr)) { + curaddr = add_bounce_page(dmat, map, vaddr, sgsize); + } + /* * Insert chunk into a segment, coalescing with * the previous segment if possible. @@ -574,9 +807,8 @@ segdone: * Did we fit? */ if (buflen != 0) - error = EFBIG; - - return error; + error = EFBIG; /* XXX better return value here? */ + return (error); } /* @@ -597,14 +829,17 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, KASSERT(dmat != NULL, ("dmatag is NULL")); KASSERT(map != NULL, ("dmamap is NULL")); + map->callback = callback; + map->callback_arg = callback_arg; map->flags &= ~DMAMAP_TYPE_MASK; - map->flags |= DMAMAP_LINEAR|DMAMAP_COHERENT; + map->flags |= DMAMAP_LINEAR; map->buffer = buf; map->len = buflen; error = bus_dmamap_load_buffer(dmat, dm_segments, map, buf, buflen, kernel_pmap, flags, &lastaddr, &nsegs); - + if (error == EINPROGRESS) + return (error); if (error) (*callback)(callback_arg, NULL, 0, error); else @@ -613,8 +848,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, dmat->flags, nsegs + 1, error); - return (0); - + return (error); } /* @@ -635,10 +869,9 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0, M_ASSERTPKTHDR(m0); map->flags &= ~DMAMAP_TYPE_MASK; - map->flags |= DMAMAP_MBUF | DMAMAP_COHERENT; + map->flags |= DMAMAP_MBUF; map->buffer = m0; map->len = 0; - if (m0->m_pkthdr.len <= dmat->maxsize) { vm_offset_t lastaddr = 0; struct mbuf *m; @@ -676,16 +909,14 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, int flags) { int error = 0; - M_ASSERTPKTHDR(m0); flags |= BUS_DMA_NOWAIT; *nsegs = -1; map->flags &= ~DMAMAP_TYPE_MASK; - map->flags |= DMAMAP_MBUF | DMAMAP_COHERENT; - map->buffer = m0; + map->flags |= DMAMAP_MBUF; + map->buffer = m0; map->len = 0; - if (m0->m_pkthdr.len <= dmat->maxsize) { vm_offset_t lastaddr = 0; struct mbuf *m; @@ -693,8 +924,9 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = bus_dmamap_load_buffer(dmat, segs, map, - m->m_data, m->m_len, - kernel_pmap, flags, &lastaddr, nsegs); + m->m_data, m->m_len, + kernel_pmap, flags, &lastaddr, + nsegs); map->len += m->m_len; } } @@ -702,12 +934,11 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dmat, bus_dmamap_t map, error = EINVAL; } + /* XXX FIXME: Having to increment nsegs is really annoying */ ++*nsegs; CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", __func__, dmat, dmat->flags, error, *nsegs); - return (error); - } /* @@ -718,9 +949,65 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, struct uio *uio, bus_dmamap_callback2_t *callback, void *callback_arg, int flags) { + vm_offset_t lastaddr = 0; +#ifdef __CC_SUPPORTS_DYNAMIC_ARRAY_INIT + bus_dma_segment_t dm_segments[dmat->nsegments]; +#else + bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; +#endif + int nsegs, i, error; + bus_size_t resid; + struct iovec *iov; + struct pmap *pmap; - panic("Unimplemented %s at %s:%d\n", __func__, __FILE__, __LINE__); - return (0); + resid = uio->uio_resid; + iov = uio->uio_iov; + map->flags &= ~DMAMAP_TYPE_MASK; + map->flags |= DMAMAP_UIO; + map->buffer = uio; + map->len = 0; + + if (uio->uio_segflg == UIO_USERSPACE) { + KASSERT(uio->uio_td != NULL, + ("bus_dmamap_load_uio: USERSPACE but no proc")); + /* XXX: pmap = vmspace_pmap(uio->uio_td->td_proc->p_vmspace); */ + panic("can't do it yet"); + } else + pmap = kernel_pmap; + + error = 0; + nsegs = -1; + for (i = 0; i < uio->uio_iovcnt && resid != 0 && !error; i++) { + /* + * Now at the first iovec to load. Load each iovec + * until we have exhausted the residual count. + */ + bus_size_t minlen = + resid < iov[i].iov_len ? resid : iov[i].iov_len; + caddr_t addr = (caddr_t) iov[i].iov_base; + + if (minlen > 0) { + error = bus_dmamap_load_buffer(dmat, dm_segments, map, + addr, minlen, pmap, flags, &lastaddr, &nsegs); + + map->len += minlen; + resid -= minlen; + } + } + + if (error) { + /* + * force "no valid mappings" on error in callback. + */ + (*callback)(callback_arg, dm_segments, 0, 0, error); + } else { + (*callback)(callback_arg, dm_segments, nsegs+1, + uio->uio_resid, error); + } + + CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d", + __func__, dmat, dmat->flags, error, nsegs + 1); + return (error); } /* @@ -729,25 +1016,102 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, struct uio *uio, void _bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) { + struct bounce_page *bpage; + map->flags &= ~DMAMAP_TYPE_MASK; + while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) { + STAILQ_REMOVE_HEAD(&map->bpages, links); + free_bounce_page(dmat, bpage); + } return; } -static __inline void +static void bus_dmamap_sync_buf(void *buf, int len, bus_dmasync_op_t op) { + char tmp_cl[mips_pdcache_linesize], tmp_clend[mips_pdcache_linesize]; + vm_offset_t buf_cl, buf_clend; + vm_size_t size_cl, size_clend; + int cache_linesize_mask = mips_pdcache_linesize - 1; + + /* + * dcache invalidation operates on cache line aligned addresses + * and could modify areas of memory that share the same cache line + * at the beginning and the ending of the buffer. In order to + * prevent a data loss we save these chunks in temporary buffer + * before invalidation and restore them afer it + */ + buf_cl = (vm_offset_t)buf & ~cache_linesize_mask; + size_cl = (vm_offset_t)buf & cache_linesize_mask; + buf_clend = (vm_offset_t)buf + len; + size_clend = (mips_pdcache_linesize - + (buf_clend & cache_linesize_mask)) & cache_linesize_mask; switch (op) { + case BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE: + case BUS_DMASYNC_POSTREAD: + + /* + * Save buffers that might be modified by invalidation + */ + if (size_cl) + memcpy (tmp_cl, (void*)buf_cl, size_cl); + if (size_clend) + memcpy (tmp_clend, (void*)buf_clend, size_clend); + mips_dcache_inv_range((vm_offset_t)buf, len); + /* + * Restore them + */ + if (size_cl) + memcpy ((void*)buf_cl, tmp_cl, size_cl); + if (size_clend) + memcpy ((void*)buf_clend, tmp_clend, size_clend); + /* + * Copies above have brought corresponding memory + * cache lines back into dirty state. Write them back + * out and invalidate affected cache lines again if + * necessary. + */ + if (size_cl) + mips_dcache_wbinv_range((vm_offset_t)buf_cl, size_cl); + if (size_clend && (size_cl == 0 || + buf_clend - buf_cl > mips_pdcache_linesize)) + mips_dcache_wbinv_range((vm_offset_t)buf_clend, + size_clend); + break; + case BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE: - mips_dcache_wbinv_range((vm_offset_t)buf, len); + mips_dcache_wbinv_range((vm_offset_t)buf_cl, len); break; case BUS_DMASYNC_PREREAD: -#if 1 - mips_dcache_wbinv_range((vm_offset_t)buf, len); -#else + /* + * Save buffers that might be modified by invalidation + */ + if (size_cl) + memcpy (tmp_cl, (void *)buf_cl, size_cl); + if (size_clend) + memcpy (tmp_clend, (void *)buf_clend, size_clend); mips_dcache_inv_range((vm_offset_t)buf, len); -#endif + /* + * Restore them + */ + if (size_cl) + memcpy ((void *)buf_cl, tmp_cl, size_cl); + if (size_clend) + memcpy ((void *)buf_clend, tmp_clend, size_clend); + /* + * Copies above have brought corresponding memory + * cache lines back into dirty state. Write them back + * out and invalidate affected cache lines again if + * necessary. + */ + if (size_cl) + mips_dcache_wbinv_range((vm_offset_t)buf_cl, size_cl); + if (size_clend && (size_cl == 0 || + buf_clend - buf_cl > mips_pdcache_linesize)) + mips_dcache_wbinv_range((vm_offset_t)buf_clend, + size_clend); break; case BUS_DMASYNC_PREWRITE: @@ -756,6 +1120,51 @@ bus_dmamap_sync_buf(void *buf, int len, bus_dmasync_op_t op) } } +static void +_bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) +{ + struct bounce_page *bpage; + + STAILQ_FOREACH(bpage, &map->bpages, links) { + if (op & BUS_DMASYNC_PREWRITE) { + bcopy((void *)bpage->datavaddr, + (void *)(bpage->vaddr_nocache != 0 ? + bpage->vaddr_nocache : bpage->vaddr), + bpage->datacount); + if (bpage->vaddr_nocache == 0) { + mips_dcache_wb_range(bpage->vaddr, + bpage->datacount); + } + dmat->bounce_zone->total_bounced++; + } + if (op & BUS_DMASYNC_POSTREAD) { + if (bpage->vaddr_nocache == 0) { + mips_dcache_inv_range(bpage->vaddr, + bpage->datacount); + } + bcopy((void *)(bpage->vaddr_nocache != 0 ? + bpage->vaddr_nocache : bpage->vaddr), + (void *)bpage->datavaddr, bpage->datacount); + dmat->bounce_zone->total_bounced++; + } + } +} + +static __inline int +_bus_dma_buf_is_in_bp(bus_dmamap_t map, void *buf, int len) +{ + struct bounce_page *bpage; + + STAILQ_FOREACH(bpage, &map->bpages, links) { + if ((vm_offset_t)buf >= bpage->datavaddr && + (vm_offset_t)buf + len <= bpage->datavaddr + + bpage->datacount) + return (1); + } + return (0); + +} + void _bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { @@ -764,51 +1173,23 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) int resid; struct iovec *iov; - - /* - * Mixing PRE and POST operations is not allowed. - */ - if ((op & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)) != 0 && - (op & (BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)) != 0) - panic("_bus_dmamap_sync: mix PRE and POST"); - - /* - * Since we're dealing with a virtually-indexed, write-back - * cache, we need to do the following things: - * - * PREREAD -- Invalidate D-cache. Note we might have - * to also write-back here if we have to use an Index - * op, or if the buffer start/end is not cache-line aligned. - * - * PREWRITE -- Write-back the D-cache. If we have to use - * an Index op, we also have to invalidate. Note that if - * we are doing PREREAD|PREWRITE, we can collapse everything - * into a single op. - * - * POSTREAD -- Nothing. - * - * POSTWRITE -- Nothing. - */ - - /* - * Flush the write buffer. - * XXX Is this always necessary? - */ - mips_wbflush(); - - op &= (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); - if (op == 0) + if (op == BUS_DMASYNC_POSTWRITE) + return; + if (STAILQ_FIRST(&map->bpages)) + _bus_dmamap_sync_bp(dmat, map, op); + if (map->flags & DMAMAP_COHERENT) return; - CTR3(KTR_BUSDMA, "%s: op %x flags %x", __func__, op, map->flags); switch(map->flags & DMAMAP_TYPE_MASK) { case DMAMAP_LINEAR: - bus_dmamap_sync_buf(map->buffer, map->len, op); + if (!(_bus_dma_buf_is_in_bp(map, map->buffer, map->len))) + bus_dmamap_sync_buf(map->buffer, map->len, op); break; case DMAMAP_MBUF: m = map->buffer; while (m) { - if (m->m_len > 0) + if (m->m_len > 0 && + !(_bus_dma_buf_is_in_bp(map, m->m_data, m->m_len))) bus_dmamap_sync_buf(m->m_data, m->m_len, op); m = m->m_next; } @@ -821,7 +1202,10 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) bus_size_t minlen = resid < iov[i].iov_len ? resid : iov[i].iov_len; if (minlen > 0) { - bus_dmamap_sync_buf(iov[i].iov_base, minlen, op); + if (!_bus_dma_buf_is_in_bp(map, iov[i].iov_base, + minlen)) + bus_dmamap_sync_buf(iov[i].iov_base, + minlen, op); resid -= minlen; } } @@ -830,3 +1214,256 @@ _bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) break; } } + +static void +init_bounce_pages(void *dummy __unused) +{ + + total_bpages = 0; + STAILQ_INIT(&bounce_zone_list); + STAILQ_INIT(&bounce_map_waitinglist); + STAILQ_INIT(&bounce_map_callbacklist); + mtx_init(&bounce_lock, "bounce pages lock", NULL, MTX_DEF); +} +SYSINIT(bpages, SI_SUB_LOCK, SI_ORDER_ANY, init_bounce_pages, NULL); + +static struct sysctl_ctx_list * +busdma_sysctl_tree(struct bounce_zone *bz) +{ + return (&bz->sysctl_tree); +} + +static struct sysctl_oid * +busdma_sysctl_tree_top(struct bounce_zone *bz) +{ + return (bz->sysctl_tree_top); +} + +static int +alloc_bounce_zone(bus_dma_tag_t dmat) +{ + struct bounce_zone *bz; + + /* Check to see if we already have a suitable zone */ + STAILQ_FOREACH(bz, &bounce_zone_list, links) { + if ((dmat->alignment <= bz->alignment) + && (dmat->lowaddr >= bz->lowaddr)) { + dmat->bounce_zone = bz; + return (0); + } + } + + if ((bz = (struct bounce_zone *)malloc(sizeof(*bz), M_DEVBUF, + M_NOWAIT | M_ZERO)) == NULL) + return (ENOMEM); + + STAILQ_INIT(&bz->bounce_page_list); + bz->free_bpages = 0; + bz->reserved_bpages = 0; + bz->active_bpages = 0; + bz->lowaddr = dmat->lowaddr; + bz->alignment = MAX(dmat->alignment, PAGE_SIZE); + bz->map_count = 0; + snprintf(bz->zoneid, 8, "zone%d", busdma_zonecount); + busdma_zonecount++; + snprintf(bz->lowaddrid, 18, "%#jx", (uintmax_t)bz->lowaddr); + STAILQ_INSERT_TAIL(&bounce_zone_list, bz, links); + dmat->bounce_zone = bz; + + sysctl_ctx_init(&bz->sysctl_tree); + bz->sysctl_tree_top = SYSCTL_ADD_NODE(&bz->sysctl_tree, + SYSCTL_STATIC_CHILDREN(_hw_busdma), OID_AUTO, bz->zoneid, + CTLFLAG_RD, 0, ""); + if (bz->sysctl_tree_top == NULL) { + sysctl_ctx_free(&bz->sysctl_tree); + return (0); /* XXX error code? */ + } + + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "total_bpages", CTLFLAG_RD, &bz->total_bpages, 0, + "Total bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "free_bpages", CTLFLAG_RD, &bz->free_bpages, 0, + "Free bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "reserved_bpages", CTLFLAG_RD, &bz->reserved_bpages, 0, + "Reserved bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "active_bpages", CTLFLAG_RD, &bz->active_bpages, 0, + "Active bounce pages"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "total_bounced", CTLFLAG_RD, &bz->total_bounced, 0, + "Total bounce requests"); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "total_deferred", CTLFLAG_RD, &bz->total_deferred, 0, + "Total bounce requests that were deferred"); + SYSCTL_ADD_STRING(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "lowaddr", CTLFLAG_RD, bz->lowaddrid, 0, ""); + SYSCTL_ADD_INT(busdma_sysctl_tree(bz), + SYSCTL_CHILDREN(busdma_sysctl_tree_top(bz)), OID_AUTO, + "alignment", CTLFLAG_RD, &bz->alignment, 0, ""); + + return (0); +} + +static int +alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) +{ + struct bounce_zone *bz; + int count; + + bz = dmat->bounce_zone; + count = 0; + while (numpages > 0) { + struct bounce_page *bpage; + + bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF, + M_NOWAIT | M_ZERO); + + if (bpage == NULL) + break; + bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, + M_NOWAIT, 0ul, + bz->lowaddr, + PAGE_SIZE, + 0); + if (bpage->vaddr == 0) { + free(bpage, M_DEVBUF); + break; + } + bpage->busaddr = pmap_kextract(bpage->vaddr); + bpage->vaddr_nocache = + (vm_offset_t)MIPS_PHYS_TO_KSEG1(bpage->busaddr); + mtx_lock(&bounce_lock); + STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); + total_bpages++; + bz->total_bpages++; + bz->free_bpages++; + mtx_unlock(&bounce_lock); + count++; + numpages--; + } + return (count); +} + +static int +reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit) +{ + struct bounce_zone *bz; + int pages; + + mtx_assert(&bounce_lock, MA_OWNED); + bz = dmat->bounce_zone; + pages = MIN(bz->free_bpages, map->pagesneeded - map->pagesreserved); + if (commit == 0 && map->pagesneeded > (map->pagesreserved + pages)) + return (map->pagesneeded - (map->pagesreserved + pages)); + bz->free_bpages -= pages; + bz->reserved_bpages += pages; + map->pagesreserved += pages; + pages = map->pagesneeded - map->pagesreserved; + + return (pages); +} + +static bus_addr_t +add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, + bus_size_t size) +{ + struct bounce_zone *bz; + struct bounce_page *bpage; + + KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); + KASSERT(map != NULL, ("add_bounce_page: bad map %p", map)); + + bz = dmat->bounce_zone; + if (map->pagesneeded == 0) + panic("add_bounce_page: map doesn't need any pages"); + map->pagesneeded--; + + if (map->pagesreserved == 0) + panic("add_bounce_page: map doesn't need any pages"); + map->pagesreserved--; + + mtx_lock(&bounce_lock); + bpage = STAILQ_FIRST(&bz->bounce_page_list); + if (bpage == NULL) + panic("add_bounce_page: free page list is empty"); + + STAILQ_REMOVE_HEAD(&bz->bounce_page_list, links); + bz->reserved_bpages--; + bz->active_bpages++; + mtx_unlock(&bounce_lock); + + if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { + /* Page offset needs to be preserved. */ + bpage->vaddr |= vaddr & PAGE_MASK; + bpage->busaddr |= vaddr & PAGE_MASK; + } + bpage->datavaddr = vaddr; + bpage->datacount = size; + STAILQ_INSERT_TAIL(&(map->bpages), bpage, links); + return (bpage->busaddr); +} + +static void +free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) +{ + struct bus_dmamap *map; + struct bounce_zone *bz; + + bz = dmat->bounce_zone; + bpage->datavaddr = 0; + bpage->datacount = 0; + if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) { + /* + * Reset the bounce page to start at offset 0. Other uses + * of this bounce page may need to store a full page of + * data and/or assume it starts on a page boundary. + */ + bpage->vaddr &= ~PAGE_MASK; + bpage->busaddr &= ~PAGE_MASK; + } + + mtx_lock(&bounce_lock); + STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links); + bz->free_bpages++; + bz->active_bpages--; + if ((map = STAILQ_FIRST(&bounce_map_waitinglist)) != NULL) { + if (reserve_bounce_pages(map->dmat, map, 1) == 0) { + STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links); + STAILQ_INSERT_TAIL(&bounce_map_callbacklist, + map, links); + busdma_swi_pending = 1; + bz->total_deferred++; + swi_sched(vm_ih, 0); + } + } + mtx_unlock(&bounce_lock); +} + +void +busdma_swi(void) +{ + bus_dma_tag_t dmat; + struct bus_dmamap *map; + + mtx_lock(&bounce_lock); + while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { + STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); + mtx_unlock(&bounce_lock); + dmat = map->dmat; + (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_LOCK); + bus_dmamap_load(map->dmat, map, map->buffer, map->len, + map->callback, map->callback_arg, /*flags*/0); + (dmat->lockfunc)(dmat->lockfuncarg, BUS_DMA_UNLOCK); + mtx_lock(&bounce_lock); + } + mtx_unlock(&bounce_lock); +} diff --git a/sys/mips/mips/cache.c b/sys/mips/mips/cache.c index 64e03c9544e2..087e22c0c6eb 100644 --- a/sys/mips/mips/cache.c +++ b/sys/mips/mips/cache.c @@ -73,6 +73,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include "opt_cputype.h" + #include #include @@ -81,6 +83,7 @@ struct mips_cache_ops mips_cache_ops; void mips_config_cache(struct mips_cpuinfo * cpuinfo) { + switch (cpuinfo->l1.ic_linesize) { case 16: mips_cache_ops.mco_icache_sync_all = mipsNN_icache_sync_all_16; @@ -223,7 +226,9 @@ mips_config_cache(struct mips_cpuinfo * cpuinfo) #endif /* Check that all cache ops are set up. */ - if (mips_picache_size || 1) { /* XXX- must have primary Icache */ + /* must have primary Icache */ + if (cpuinfo->l1.ic_size) { + if (!mips_cache_ops.mco_icache_sync_all) panic("no icache_sync_all cache op"); if (!mips_cache_ops.mco_icache_sync_range) @@ -231,7 +236,8 @@ mips_config_cache(struct mips_cpuinfo * cpuinfo) if (!mips_cache_ops.mco_icache_sync_range_index) panic("no icache_sync_range_index cache op"); } - if (mips_pdcache_size || 1) { /* XXX- must have primary Icache */ + /* must have primary Dcache */ + if (cpuinfo->l1.dc_size) { if (!mips_cache_ops.mco_pdcache_wbinv_all) panic("no pdcache_wbinv_all"); if (!mips_cache_ops.mco_pdcache_wbinv_range) diff --git a/sys/mips/mips/cache_mipsNN.c b/sys/mips/mips/cache_mipsNN.c index 4037885b73e3..e2d3ffb2e368 100644 --- a/sys/mips/mips/cache_mipsNN.c +++ b/sys/mips/mips/cache_mipsNN.c @@ -38,6 +38,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_cputype.h" + #include #include #include @@ -65,8 +67,11 @@ __FBSDID("$FreeBSD$"); #define SYNCI #endif - -__asm(".set mips32"); +/* + * Exported variables for consumers like bus_dma code + */ +int mips_picache_linesize; +int mips_pdcache_linesize; static int picache_size; static int picache_stride; @@ -109,12 +114,18 @@ mipsNN_cache_init(struct mips_cpuinfo * cpuinfo) pdcache_loopcount = (cpuinfo->l1.dc_nsets * cpuinfo->l1.dc_linesize / PAGE_SIZE) * cpuinfo->l1.dc_nways; } + + mips_picache_linesize = cpuinfo->l1.ic_linesize; + mips_pdcache_linesize = cpuinfo->l1.dc_linesize; + picache_size = cpuinfo->l1.ic_size; picache_way_mask = cpuinfo->l1.ic_nways - 1; pdcache_size = cpuinfo->l1.dc_size; pdcache_way_mask = cpuinfo->l1.dc_nways - 1; + #define CACHE_DEBUG #ifdef CACHE_DEBUG + printf("Cache info:\n"); if (cpuinfo->icache_virtual) printf(" icache is virtual\n"); printf(" picache_stride = %d\n", picache_stride); diff --git a/sys/mips/mips/copystr.S b/sys/mips/mips/copystr.S index 4d5d921c4945..35e79057a537 100644 --- a/sys/mips/mips/copystr.S +++ b/sys/mips/mips/copystr.S @@ -67,13 +67,13 @@ ENTRY(copystr) move v0, zero beqz a2, 2f move t1, zero -1: subu a2, 1 +1: subu a2, 1 /*XXX mips64 unsafe -- long */ lbu t0, 0(a0) - addu a0, 1 + PTR_ADDU a0, 1 sb t0, 0(a1) - addu a1, 1 + PTR_ADDU a1, 1 beqz t0, 3f /* NULL - end of string*/ - addu t1, 1 + addu t1, 1 /*XXX mips64 unsafe -- long */ bnez a2, 1b nop 2: /* ENAMETOOLONG */ @@ -81,7 +81,7 @@ ENTRY(copystr) 3: /* done != NULL -> how many bytes were copied */ beqz a3, 4f nop - sw t1, 0(a3) + sw t1, 0(a3) /*XXX mips64 unsafe -- long */ 4: jr ra nop .set reorder @@ -100,25 +100,25 @@ LEAF(copyinstr) .set noat lw t2, pcpup lw v1, PC_CURPCB(t2) - la v0, _C_LABEL(copystrerr) + PTR_LA v0, _C_LABEL(copystrerr) blt a0, zero, _C_LABEL(copystrerr) sw v0, PCB_ONFAULT(v1) move t0, a2 beq a2, zero, 4f 1: lbu v0, 0(a0) - subu a2, a2, 1 + subu a2, a2, 1 /*xxx mips64 unsafe -- long */ beq v0, zero, 2f sb v0, 0(a1) - addu a0, a0, 1 + PTR_ADDU a0, a0, 1 bne a2, zero, 1b - addu a1, a1, 1 + PTR_ADDU a1, a1, 1 4: li v0, ENAMETOOLONG 2: beq a3, zero, 3f - subu a2, t0, a2 - sw a2, 0(a3) + subu a2, t0, a2 /*xxx mips64 unsafe -- long */ + sw a2, 0(a3) /*xxx mips64 unsafe -- long */ 3: j ra # v0 is 0 or ENAMETOOLONG sw zero, PCB_ONFAULT(v1) @@ -138,25 +138,25 @@ LEAF(copyoutstr) .set noat lw t2, pcpup lw v1, PC_CURPCB(t2) - la v0, _C_LABEL(copystrerr) + PTR_LA v0, _C_LABEL(copystrerr) blt a1, zero, _C_LABEL(copystrerr) sw v0, PCB_ONFAULT(v1) move t0, a2 beq a2, zero, 4f 1: lbu v0, 0(a0) - subu a2, a2, 1 + subu a2, a2, 1 /*xxx mips64 unsafe -- long */ beq v0, zero, 2f sb v0, 0(a1) - addu a0, a0, 1 + PTR_ADDU a0, a0, 1 bne a2, zero, 1b - addu a1, a1, 1 + PTR_ADDU a1, a1, 1 4: li v0, ENAMETOOLONG 2: beq a3, zero, 3f - subu a2, t0, a2 - sw a2, 0(a3) + subu a2, t0, a2 /*xxx mips64 unsafe -- long */ + sw a2, 0(a3) /*xxx mips64 unsafe -- long */ 3: j ra # v0 is 0 or ENAMETOOLONG sw zero, PCB_ONFAULT(v1) diff --git a/sys/mips/mips/cpu.c b/sys/mips/mips/cpu.c index f9596e2ba8b0..1b490e6b591f 100644 --- a/sys/mips/mips/cpu.c +++ b/sys/mips/mips/cpu.c @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_cputype.h" + #include #include #include @@ -47,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include static struct mips_cpuinfo cpuinfo; @@ -64,66 +67,72 @@ union cpuprid fpu_id; static void mips_get_identity(struct mips_cpuinfo *cpuinfo) { - u_int32_t prid; - u_int32_t cfg0; - u_int32_t cfg1; - u_int32_t tmp; + u_int32_t prid; + u_int32_t cfg0; + u_int32_t cfg1; + u_int32_t tmp; - memset(cpuinfo, 0, sizeof(struct mips_cpuinfo)); + memset(cpuinfo, 0, sizeof(struct mips_cpuinfo)); - /* Read and store the PrID ID for CPU identification. */ - prid = mips_rd_prid(); - cpuinfo->cpu_vendor = MIPS_PRID_CID(prid); - cpuinfo->cpu_rev = MIPS_PRID_REV(prid); - cpuinfo->cpu_impl = MIPS_PRID_IMPL(prid); + /* Read and store the PrID ID for CPU identification. */ + prid = mips_rd_prid(); + cpuinfo->cpu_vendor = MIPS_PRID_CID(prid); + cpuinfo->cpu_rev = MIPS_PRID_REV(prid); + cpuinfo->cpu_impl = MIPS_PRID_IMPL(prid); - /* Read config register selection 0 to learn TLB type. */ - cfg0 = mips_rd_config(); + /* Read config register selection 0 to learn TLB type. */ + cfg0 = mips_rd_config(); - cpuinfo->tlb_type = ((cfg0 & MIPS_CONFIG0_MT_MASK) >> MIPS_CONFIG0_MT_SHIFT); - cpuinfo->icache_virtual = cfg0 & MIPS_CONFIG0_VI; + cpuinfo->tlb_type = + ((cfg0 & MIPS_CONFIG0_MT_MASK) >> MIPS_CONFIG0_MT_SHIFT); + cpuinfo->icache_virtual = cfg0 & MIPS_CONFIG0_VI; - /* If config register selection 1 does not exist, exit. */ - if (!(cfg0 & MIPS3_CONFIG_CM)) - return; + /* If config register selection 1 does not exist, exit. */ + if (!(cfg0 & MIPS3_CONFIG_CM)) + return; - /* Learn TLB size and L1 cache geometry. */ - cfg1 = mips_rd_config_sel1(); - cpuinfo->tlb_nentries = ((cfg1 & MIPS_CONFIG1_TLBSZ_MASK) >> MIPS_CONFIG1_TLBSZ_SHIFT) + 1; + /* Learn TLB size and L1 cache geometry. */ + cfg1 = mips_rd_config1(); + cpuinfo->tlb_nentries = + ((cfg1 & MIPS_CONFIG1_TLBSZ_MASK) >> MIPS_CONFIG1_TLBSZ_SHIFT) + 1; - /* L1 instruction cache. */ - tmp = 1 << (((cfg1 & MIPS_CONFIG1_IL_MASK) >> MIPS_CONFIG1_IL_SHIFT) + 1); - if (tmp != 0) { - cpuinfo->l1.ic_linesize = tmp; - cpuinfo->l1.ic_nways = (((cfg1 & MIPS_CONFIG1_IA_MASK) >> MIPS_CONFIG1_IA_SHIFT)) + 1; - cpuinfo->l1.ic_nsets = 1 << (((cfg1 & MIPS_CONFIG1_IS_MASK) >> MIPS_CONFIG1_IS_SHIFT) + 6); - cpuinfo->l1.ic_size = cpuinfo->l1.ic_linesize * cpuinfo->l1.ic_nsets - * cpuinfo->l1.ic_nways; - } + /* L1 instruction cache. */ + tmp = (cfg1 & MIPS_CONFIG1_IL_MASK) >> MIPS_CONFIG1_IL_SHIFT; + if (tmp != 0) { + cpuinfo->l1.ic_linesize = 1 << (tmp + 1); + cpuinfo->l1.ic_nways = (((cfg1 & MIPS_CONFIG1_IA_MASK) >> MIPS_CONFIG1_IA_SHIFT)) + 1; + cpuinfo->l1.ic_nsets = + 1 << (((cfg1 & MIPS_CONFIG1_IS_MASK) >> MIPS_CONFIG1_IS_SHIFT) + 6); + cpuinfo->l1.ic_size = + cpuinfo->l1.ic_linesize * cpuinfo->l1.ic_nsets * cpuinfo->l1.ic_nways; + } - /* L1 data cache. */ - tmp = 1 << (((cfg1 & MIPS_CONFIG1_DL_MASK) >> MIPS_CONFIG1_DL_SHIFT) + 1); - if (tmp != 0) { - cpuinfo->l1.dc_linesize = tmp; - cpuinfo->l1.dc_nways = (((cfg1 & MIPS_CONFIG1_DA_MASK) >> MIPS_CONFIG1_DA_SHIFT)) + 1; - cpuinfo->l1.dc_nsets = 1 << (((cfg1 & MIPS_CONFIG1_DS_MASK) >> MIPS_CONFIG1_DS_SHIFT) + 6); + /* L1 data cache. */ + tmp = (cfg1 & MIPS_CONFIG1_DL_MASK) >> MIPS_CONFIG1_DL_SHIFT; + if (tmp != 0) { + cpuinfo->l1.dc_linesize = 1 << (tmp + 1); + cpuinfo->l1.dc_nways = + (((cfg1 & MIPS_CONFIG1_DA_MASK) >> MIPS_CONFIG1_DA_SHIFT)) + 1; + cpuinfo->l1.dc_nsets = + 1 << (((cfg1 & MIPS_CONFIG1_DS_MASK) >> MIPS_CONFIG1_DS_SHIFT) + 6); + } #ifdef TARGET_OCTEON - /* - * Octeon does 128 byte line-size. But Config-Sel1 doesn't show - * 128 line-size, 1 Set, 64 ways. - */ + /* + * Octeon does 128 byte line-size. But Config-Sel1 doesn't show + * 128 line-size, 1 Set, 64 ways. + */ cpuinfo->l1.dc_linesize = 128; cpuinfo->l1.dc_nsets = 1; cpuinfo->l1.dc_nways = 64; #endif - cpuinfo->l1.dc_size = cpuinfo->l1.dc_linesize * cpuinfo->l1.dc_nsets - * cpuinfo->l1.dc_nways; - } + cpuinfo->l1.dc_size = cpuinfo->l1.dc_linesize + * cpuinfo->l1.dc_nsets * cpuinfo->l1.dc_nways; } void mips_cpu_init(void) { + platform_cpu_init(); mips_get_identity(&cpuinfo); num_tlbentries = cpuinfo.tlb_nentries; Mips_SetWIRED(0); @@ -141,77 +150,110 @@ mips_cpu_init(void) void cpu_identify(void) { - printf("cpu%d: ", 0); /* XXX per-cpu */ - switch (cpuinfo.cpu_vendor) { - case MIPS_PRID_CID_MTI: - printf("MIPS Technologies"); - break; - case MIPS_PRID_CID_BROADCOM: - case MIPS_PRID_CID_SIBYTE: - printf("Broadcom"); - break; - case MIPS_PRID_CID_ALCHEMY: - printf("AMD"); - break; - case MIPS_PRID_CID_SANDCRAFT: - printf("Sandcraft"); - break; - case MIPS_PRID_CID_PHILIPS: - printf("Philips"); - break; - case MIPS_PRID_CID_TOSHIBA: - printf("Toshiba"); - break; - case MIPS_PRID_CID_LSI: - printf("LSI"); - break; - case MIPS_PRID_CID_LEXRA: - printf("Lexra"); - break; - case MIPS_PRID_CID_PREHISTORIC: - default: - printf("Unknown"); - break; - } - printf(" processor v%d.%d\n", cpuinfo.cpu_rev, cpuinfo.cpu_impl); - - printf(" MMU: "); - if (cpuinfo.tlb_type == MIPS_MMU_NONE) { - printf("none present\n"); - } else { - if (cpuinfo.tlb_type == MIPS_MMU_TLB) { - printf("Standard TLB"); - } else if (cpuinfo.tlb_type == MIPS_MMU_BAT) { - printf("Standard BAT"); - } else if (cpuinfo.tlb_type == MIPS_MMU_FIXED) { - printf("Fixed mapping"); + uint32_t cfg0, cfg1, cfg2, cfg3; + printf("cpu%d: ", 0); /* XXX per-cpu */ + switch (cpuinfo.cpu_vendor) { + case MIPS_PRID_CID_MTI: + printf("MIPS Technologies"); + break; + case MIPS_PRID_CID_BROADCOM: + case MIPS_PRID_CID_SIBYTE: + printf("Broadcom"); + break; + case MIPS_PRID_CID_ALCHEMY: + printf("AMD"); + break; + case MIPS_PRID_CID_SANDCRAFT: + printf("Sandcraft"); + break; + case MIPS_PRID_CID_PHILIPS: + printf("Philips"); + break; + case MIPS_PRID_CID_TOSHIBA: + printf("Toshiba"); + break; + case MIPS_PRID_CID_LSI: + printf("LSI"); + break; + case MIPS_PRID_CID_LEXRA: + printf("Lexra"); + break; + case MIPS_PRID_CID_CAVIUM: + printf("Cavium"); + break; + case MIPS_PRID_CID_PREHISTORIC: + default: + printf("Unknown cid %#x", cpuinfo.cpu_vendor); + break; } - printf(", %d entries\n", cpuinfo.tlb_nentries); - } + printf(" processor v%d.%d\n", cpuinfo.cpu_rev, cpuinfo.cpu_impl); - printf(" L1 i-cache: "); - if (cpuinfo.l1.ic_linesize == 0) { - printf("disabled"); - } else { - if (cpuinfo.l1.ic_nways == 1) { - printf("direct-mapped with"); + printf(" MMU: "); + if (cpuinfo.tlb_type == MIPS_MMU_NONE) { + printf("none present\n"); } else { - printf ("%d ways of", cpuinfo.l1.ic_nways); + if (cpuinfo.tlb_type == MIPS_MMU_TLB) { + printf("Standard TLB"); + } else if (cpuinfo.tlb_type == MIPS_MMU_BAT) { + printf("Standard BAT"); + } else if (cpuinfo.tlb_type == MIPS_MMU_FIXED) { + printf("Fixed mapping"); + } + printf(", %d entries\n", cpuinfo.tlb_nentries); } - printf(" %d sets, %d bytes per line\n", cpuinfo.l1.ic_nsets, cpuinfo.l1.ic_linesize); - } - printf(" L1 d-cache: "); - if (cpuinfo.l1.dc_linesize == 0) { - printf("disabled"); - } else { - if (cpuinfo.l1.dc_nways == 1) { - printf("direct-mapped with"); + printf(" L1 i-cache: "); + if (cpuinfo.l1.ic_linesize == 0) { + printf("disabled"); } else { - printf ("%d ways of", cpuinfo.l1.dc_nways); + if (cpuinfo.l1.ic_nways == 1) { + printf("direct-mapped with"); + } else { + printf ("%d ways of", cpuinfo.l1.ic_nways); + } + printf(" %d sets, %d bytes per line\n", + cpuinfo.l1.ic_nsets, cpuinfo.l1.ic_linesize); } - printf(" %d sets, %d bytes per line\n", cpuinfo.l1.dc_nsets, cpuinfo.l1.dc_linesize); - } + + printf(" L1 d-cache: "); + if (cpuinfo.l1.dc_linesize == 0) { + printf("disabled"); + } else { + if (cpuinfo.l1.dc_nways == 1) { + printf("direct-mapped with"); + } else { + printf ("%d ways of", cpuinfo.l1.dc_nways); + } + printf(" %d sets, %d bytes per line\n", + cpuinfo.l1.dc_nsets, cpuinfo.l1.dc_linesize); + } + + cfg0 = mips_rd_config(); + /* If config register selection 1 does not exist, exit. */ + if (!(cfg0 & MIPS3_CONFIG_CM)) + return; + + cfg1 = mips_rd_config1(); + printf(" Config1=0x%b\n", cfg1, + "\20\7COP2\6MDMX\5PerfCount\4WatchRegs\3MIPS16\2EJTAG\1FPU"); + + /* If config register selection 2 does not exist, exit. */ + if (!(cfg1 & MIPS3_CONFIG_CM)) + return; + cfg2 = mips_rd_config2(); + /* + * Config2 contains no useful information other then Config3 + * existence flag + */ + + /* If config register selection 3 does not exist, exit. */ + if (!(cfg2 & MIPS3_CONFIG_CM)) + return; + cfg3 = mips_rd_config3(); + + /* Print Config3 if it contains any useful info */ + if (cfg3 & ~(0x80000000)) + printf(" Config3=0x%b\n", cfg3, "\20\2SmartMIPS\1TraceLogic"); } static struct rman cpu_hardirq_rman; diff --git a/sys/mips/mips/db_trace.c b/sys/mips/mips/db_trace.c index fe2aa6e2442e..4eadc25a835a 100644 --- a/sys/mips/mips/db_trace.c +++ b/sys/mips/mips/db_trace.c @@ -17,9 +17,353 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include +#include #include +#include + +extern char _locore[]; +extern char _locoreEnd[]; +extern char edata[]; + +/* + * A function using a stack frame has the following instruction as the first + * one: addiu sp,sp,- + * + * We make use of this to detect starting address of a function. This works + * better than using 'j ra' instruction to signify end of the previous + * function (for e.g. functions like boot() or panic() do not actually + * emit a 'j ra' instruction). + * + * XXX the abi does not require that the addiu instruction be the first one. + */ +#define MIPS_START_OF_FUNCTION(ins) (((ins) & 0xffff8000) == 0x27bd8000) + +/* + * MIPS ABI 3.0 requires that all functions return using the 'j ra' instruction + * + * XXX gcc doesn't do this for functions with __noreturn__ attribute. + */ +#define MIPS_END_OF_FUNCTION(ins) ((ins) == 0x03e00008) + +/* + * kdbpeekD(addr) - skip one word starting at 'addr', then read the second word + */ +#define kdbpeekD(addr) kdbpeek(((int *)(addr)) + 1) + +/* + * Functions ``special'' enough to print by name + */ +#ifdef __STDC__ +#define Name(_fn) { (void*)_fn, # _fn } +#else +#define Name(_fn) { _fn, "_fn"} +#endif +static struct { + void *addr; + char *name; +} names[] = { + + Name(trap), + Name(MipsKernGenException), + Name(MipsUserGenException), + Name(MipsKernIntr), + Name(MipsUserIntr), + Name(cpu_switch), + { + 0, 0 + } +}; + +/* + * Map a function address to a string name, if known; or a hex string. + */ +static char * +fn_name(uintptr_t addr) +{ + static char buf[17]; + int i = 0; + + db_expr_t diff; + c_db_sym_t sym; + char *symname; + + diff = 0; + symname = NULL; + sym = db_search_symbol((db_addr_t)addr, DB_STGY_ANY, &diff); + db_symbol_values(sym, (const char **)&symname, (db_expr_t *)0); + if (symname && diff == 0) + return (symname); + + for (i = 0; names[i].name; i++) + if (names[i].addr == (void *)addr) + return (names[i].name); + sprintf(buf, "%jx", (uintmax_t)addr); + return (buf); +} + +void +stacktrace_subr(register_t pc, register_t sp, register_t ra, + int (*printfn) (const char *,...)) +{ + InstFmt i; + /* + * Arrays for a0..a3 registers and flags if content + * of these registers is valid, e.g. obtained from the stack + */ + int valid_args[4]; + uintptr_t args[4]; + uintptr_t va, subr; + unsigned instr, mask; + unsigned int frames = 0; + int more, stksize, j; + +/* Jump here when done with a frame, to start a new one */ +loop: + + /* + * Invalidate arguments values + */ + valid_args[0] = 0; + valid_args[1] = 0; + valid_args[2] = 0; + valid_args[3] = 0; +/* Jump here after a nonstandard (interrupt handler) frame */ + stksize = 0; + subr = 0; + if (frames++ > 100) { + (*printfn) ("\nstackframe count exceeded\n"); + /* return breaks stackframe-size heuristics with gcc -O2 */ + goto finish; /* XXX */ + } + /* check for bad SP: could foul up next frame */ + /*XXX MIPS64 bad: this hard-coded SP is lame */ + if (sp & 3 || sp < 0x80000000) { + (*printfn) ("SP 0x%x: not in kernel\n", sp); + ra = 0; + subr = 0; + goto done; + } +#define Between(x, y, z) \ + ( ((x) <= (y)) && ((y) < (z)) ) +#define pcBetween(a,b) \ + Between((uintptr_t)a, pc, (uintptr_t)b) + + /* + * Check for current PC in exception handler code that don't have a + * preceding "j ra" at the tail of the preceding function. Depends + * on relative ordering of functions in exception.S, swtch.S. + */ + if (pcBetween(MipsKernGenException, MipsUserGenException)) + subr = (uintptr_t)MipsKernGenException; + else if (pcBetween(MipsUserGenException, MipsKernIntr)) + subr = (uintptr_t)MipsUserGenException; + else if (pcBetween(MipsKernIntr, MipsUserIntr)) + subr = (uintptr_t)MipsKernIntr; + else if (pcBetween(MipsUserIntr, MipsKernTLBInvalidException)) + subr = (uintptr_t)MipsUserIntr; + else if (pcBetween(MipsKernTLBInvalidException, + MipsUserTLBInvalidException)) + subr = (uintptr_t)MipsKernTLBInvalidException; + else if (pcBetween(MipsUserTLBInvalidException, MipsTLBMissException)) + subr = (uintptr_t)MipsUserTLBInvalidException; + else if (pcBetween(cpu_switch, MipsSwitchFPState)) + subr = (uintptr_t)cpu_switch; + else if (pcBetween(_locore, _locoreEnd)) { + subr = (uintptr_t)_locore; + ra = 0; + goto done; + } + /* check for bad PC */ + /*XXX MIPS64 bad: These hard coded constants are lame */ + if (pc & 3 || pc < (uintptr_t)0x80000000 || pc >= (uintptr_t)edata) { + (*printfn) ("PC 0x%x: not in kernel\n", pc); + ra = 0; + goto done; + } + /* + * Find the beginning of the current subroutine by scanning + * backwards from the current PC for the end of the previous + * subroutine. + */ + if (!subr) { + va = pc - sizeof(int); + while (1) { + instr = kdbpeek((int *)va); + + if (MIPS_START_OF_FUNCTION(instr)) + break; + + if (MIPS_END_OF_FUNCTION(instr)) { + /* skip over branch-delay slot instruction */ + va += 2 * sizeof(int); + break; + } + + va -= sizeof(int); + } + + /* skip over nulls which might separate .o files */ + while ((instr = kdbpeek((int *)va)) == 0) + va += sizeof(int); + subr = va; + } + /* scan forwards to find stack size and any saved registers */ + stksize = 0; + more = 3; + mask = 0; + for (va = subr; more; va += sizeof(int), + more = (more == 3) ? 3 : more - 1) { + /* stop if hit our current position */ + if (va >= pc) + break; + instr = kdbpeek((int *)va); + i.word = instr; + switch (i.JType.op) { + case OP_SPECIAL: + switch (i.RType.func) { + case OP_JR: + case OP_JALR: + more = 2; /* stop after next instruction */ + break; + + case OP_SYSCALL: + case OP_BREAK: + more = 1; /* stop now */ + }; + break; + + case OP_BCOND: + case OP_J: + case OP_JAL: + case OP_BEQ: + case OP_BNE: + case OP_BLEZ: + case OP_BGTZ: + more = 2; /* stop after next instruction */ + break; + + case OP_COP0: + case OP_COP1: + case OP_COP2: + case OP_COP3: + switch (i.RType.rs) { + case OP_BCx: + case OP_BCy: + more = 2; /* stop after next instruction */ + }; + break; + + case OP_SW: + /* look for saved registers on the stack */ + if (i.IType.rs != 29) + break; + /* only restore the first one */ + if (mask & (1 << i.IType.rt)) + break; + mask |= (1 << i.IType.rt); + switch (i.IType.rt) { + case 4:/* a0 */ + args[0] = kdbpeek((int *)(sp + (short)i.IType.imm)); + valid_args[0] = 1; + break; + + case 5:/* a1 */ + args[1] = kdbpeek((int *)(sp + (short)i.IType.imm)); + valid_args[1] = 1; + break; + + case 6:/* a2 */ + args[2] = kdbpeek((int *)(sp + (short)i.IType.imm)); + valid_args[2] = 1; + break; + + case 7:/* a3 */ + args[3] = kdbpeek((int *)(sp + (short)i.IType.imm)); + valid_args[3] = 1; + break; + + case 31: /* ra */ + ra = kdbpeek((int *)(sp + (short)i.IType.imm)); + } + break; + + case OP_SD: + /* look for saved registers on the stack */ + if (i.IType.rs != 29) + break; + /* only restore the first one */ + if (mask & (1 << i.IType.rt)) + break; + mask |= (1 << i.IType.rt); + switch (i.IType.rt) { + case 4:/* a0 */ + args[0] = kdbpeekD((int *)(sp + (short)i.IType.imm)); + valid_args[0] = 1; + break; + + case 5:/* a1 */ + args[1] = kdbpeekD((int *)(sp + (short)i.IType.imm)); + valid_args[1] = 1; + break; + + case 6:/* a2 */ + args[2] = kdbpeekD((int *)(sp + (short)i.IType.imm)); + valid_args[2] = 1; + break; + + case 7:/* a3 */ + args[3] = kdbpeekD((int *)(sp + (short)i.IType.imm)); + valid_args[3] = 1; + break; + + case 31: /* ra */ + ra = kdbpeekD((int *)(sp + (short)i.IType.imm)); + } + break; + + case OP_ADDI: + case OP_ADDIU: + /* look for stack pointer adjustment */ + if (i.IType.rs != 29 || i.IType.rt != 29) + break; + stksize = -((short)i.IType.imm); + } + } + +done: + (*printfn) ("%s+%x (", fn_name(subr), pc - subr); + for (j = 0; j < 4; j ++) { + if (j > 0) + (*printfn)(","); + if (valid_args[j]) + (*printfn)("%x", args[j]); + else + (*printfn)("?"); + } + + (*printfn) (") ra %x sp %x sz %d\n", ra, sp, stksize); + + if (ra) { + if (pc == ra && stksize == 0) + (*printfn) ("stacktrace: loop!\n"); + else { + pc = ra; + sp += stksize; + ra = 0; + goto loop; + } + } else { +finish: + if (curproc) + (*printfn) ("pid %d\n", curproc->p_pid); + else + (*printfn) ("curproc NULL\n"); + } +} + int db_md_set_watchpoint(db_expr_t addr, db_expr_t size) @@ -42,14 +386,6 @@ db_md_list_watchpoints() { } -static int -db_backtrace(struct thread *td, db_addr_t frame, int count) -{ - stacktrace_subr((struct trapframe *)frame, - (int (*) (const char *, ...))db_printf); - return (0); -} - void db_trace_self(void) { @@ -60,10 +396,35 @@ db_trace_self(void) int db_trace_thread(struct thread *thr, int count) { + register_t pc, ra, sp; struct pcb *ctx; - ctx = kdb_thr_ctx(thr); - return (db_backtrace(thr, (db_addr_t) &ctx->pcb_regs, count)); + if (thr == curthread) { + sp = (register_t)__builtin_frame_address(0); + ra = (register_t)__builtin_return_address(0); + + __asm __volatile( + "jal 99f\n" + "nop\n" + "99:\n" + "move %0, $31\n" /* get ra */ + "move $31, %1\n" /* restore ra */ + : "=r" (pc) + : "r" (ra)); + + } + + else { + ctx = thr->td_pcb; + sp = (register_t)ctx->pcb_context[PREG_SP]; + pc = (register_t)ctx->pcb_context[PREG_PC]; + ra = (register_t)ctx->pcb_context[PREG_RA]; + } + + stacktrace_subr(pc, sp, ra, + (int (*) (const char *, ...))db_printf); + + return (0); } void diff --git a/sys/mips/mips/elf64_machdep.c b/sys/mips/mips/elf64_machdep.c index c10fb5f280a9..d63fdbccb435 100644 --- a/sys/mips/mips/elf64_machdep.c +++ b/sys/mips/mips/elf64_machdep.c @@ -108,7 +108,7 @@ static Elf64_Brandinfo freebsd_brand_info64 = { .flags = BI_BRAND_NOTE }; -SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t) elf64_insert_brand_entry, &freebsd_brand_info64); diff --git a/sys/mips/mips/elf_machdep.c b/sys/mips/mips/elf_machdep.c index 974f29608134..90e3dacade65 100644 --- a/sys/mips/mips/elf_machdep.c +++ b/sys/mips/mips/elf_machdep.c @@ -46,7 +46,61 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#ifdef __mips_n64 +struct sysentvec elf64_freebsd_sysvec = { + .sv_size = SYS_MAXSYSCALL, + .sv_table = sysent, + .sv_mask = 0, + .sv_sigsize = 0, + .sv_sigtbl = NULL, + .sv_errsize = 0, + .sv_errtbl = NULL, + .sv_transtrap = NULL, + .sv_fixup = __elfN(freebsd_fixup), + .sv_sendsig = sendsig, + .sv_sigcode = sigcode, + .sv_szsigcode = &szsigcode, + .sv_prepsyscall = NULL, + .sv_name = "FreeBSD ELF64", + .sv_coredump = __elfN(coredump), + .sv_imgact_try = NULL, + .sv_minsigstksz = MINSIGSTKSZ, + .sv_pagesize = PAGE_SIZE, + .sv_minuser = VM_MIN_ADDRESS, + .sv_maxuser = VM_MAXUSER_ADDRESS, + .sv_usrstack = USRSTACK, + .sv_psstrings = PS_STRINGS, + .sv_stackprot = VM_PROT_ALL, + .sv_copyout_strings = exec_copyout_strings, + .sv_setregs = exec_setregs, + .sv_fixlimit = NULL, + .sv_maxssiz = NULL, + .sv_flags = SV_ABI_FREEBSD | SV_LP64 +}; + +static Elf64_Brandinfo freebsd_brand_info = { + .brand = ELFOSABI_FREEBSD, + .machine = EM_MIPS, + .compat_3_brand = "FreeBSD", + .emul_path = NULL, + .interp_path = "/libexec/ld-elf.so.1", + .sysvec = &elf64_freebsd_sysvec, + .interp_newpath = NULL, + .flags = 0 +}; + +SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY, + (sysinit_cfunc_t) elf64_insert_brand_entry, + &freebsd_brand_info); + +void +elf64_dump_thread(struct thread *td __unused, void *dst __unused, + size_t *off __unused) +{ +} +#else struct sysentvec elf32_freebsd_sysvec = { .sv_size = SYS_MAXSYSCALL, .sv_table = sysent, @@ -86,11 +140,10 @@ static Elf32_Brandinfo freebsd_brand_info = { .interp_path = "/libexec/ld-elf.so.1", .sysvec = &elf32_freebsd_sysvec, .interp_newpath = NULL, - .brand_note = &elf32_freebsd_brandnote, - .flags = BI_BRAND_NOTE + .flags = 0 }; -SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t) elf32_insert_brand_entry, &freebsd_brand_info); @@ -99,6 +152,7 @@ elf32_dump_thread(struct thread *td __unused, void *dst __unused, size_t *off __unused) { } +#endif /* Process one elf relocation with addend. */ static int @@ -110,7 +164,12 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data, Elf_Addr addend = (Elf_Addr)0; Elf_Word rtype = (Elf_Word)0, symidx; const Elf_Rel *rel; - const Elf_Rela *rela; + + /* + * Stash R_MIPS_HI16 info so we can use it when processing R_MIPS_LO16 + */ + static Elf_Addr ahl; + static Elf_Addr *where_hi16; switch (type) { case ELF_RELOC_REL: @@ -120,108 +179,63 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data, rtype = ELF_R_TYPE(rel->r_info); symidx = ELF_R_SYM(rel->r_info); break; - case ELF_RELOC_RELA: - rela = (const Elf_Rela *)data; - where = (Elf_Addr *) (relocbase + rela->r_offset); - addend = rela->r_addend; - rtype = ELF_R_TYPE(rela->r_info); - symidx = ELF_R_SYM(rela->r_info); - break; default: panic("unknown reloc type %d\n", type); } - if (local) { -#if 0 /* TBD */ - if (rtype == R_386_RELATIVE) { /* A + B */ - addr = elf_relocaddr(lf, relocbase + addend); - if (*where != addr) - *where = addr; - } - return (0); -#endif - } - switch (rtype) { + case R_MIPS_NONE: /* none */ + break; - case R_MIPS_NONE: /* none */ - break; - - case R_MIPS_16: /* S + sign-extend(A) */ - /* - * There shouldn't be R_MIPS_16 relocs in kernel objects. - */ - printf("kldload: unexpected R_MIPS_16 relocation\n"); - return -1; - break; - - case R_MIPS_32: /* S + A - P */ - addr = lookup(lf, symidx, 1); - if (addr == 0) - return -1; - addr += addend; - if (*where != addr) - *where = addr; - break; - - case R_MIPS_REL32: /* A - EA + S */ - /* - * There shouldn't be R_MIPS_REL32 relocs in kernel objects? - */ - printf("kldload: unexpected R_MIPS_REL32 relocation\n"); - return -1; - break; - - case R_MIPS_26: /* ((A << 2) | (P & 0xf0000000) + S) >> 2 */ - break; - - case R_MIPS_HI16: - /* extern/local: ((AHL + S) - ((short)(AHL + S)) >> 16 */ - /* _gp_disp: ((AHL + GP - P) - (short)(AHL + GP - P)) >> 16 */ - break; - - case R_MIPS_LO16: - /* extern/local: AHL + S */ - /* _gp_disp: AHL + GP - P + 4 */ - break; - - case R_MIPS_GPREL16: - /* extern/local: ((AHL + S) - ((short)(AHL + S)) >> 16 */ - /* _gp_disp: ((AHL + GP - P) - (short)(AHL + GP - P)) >> 16 */ - break; - - case R_MIPS_LITERAL: /* sign-extend(A) + L */ - break; - - case R_MIPS_GOT16: /* external: G */ - /* local: tbd */ - break; - - case R_MIPS_PC16: /* sign-extend(A) + S - P */ - break; - - case R_MIPS_CALL16: /* G */ - break; - - case R_MIPS_GPREL32: /* A + S + GP0 - GP */ - break; - - case R_MIPS_GOTHI16: /* (G - (short)G) >> 16 + A */ - break; - - case R_MIPS_GOTLO16: /* G & 0xffff */ - break; - - case R_MIPS_CALLHI16: /* (G - (short)G) >> 16 + A */ - break; - - case R_MIPS_CALLLO16: /* G & 0xffff */ - break; - - default: - printf("kldload: unexpected relocation type %d\n", - rtype); + case R_MIPS_32: /* S + A */ + addr = lookup(lf, symidx, 1); + if (addr == 0) return (-1); + addr += addend; + if (*where != addr) + *where = addr; + break; + + case R_MIPS_26: /* ((A << 2) | (P & 0xf0000000) + S) >> 2 */ + addr = lookup(lf, symidx, 1); + if (addr == 0) + return (-1); + + addend &= 0x03ffffff; + addend <<= 2; + + addr += ((Elf_Addr)where & 0xf0000000) | addend; + addr >>= 2; + + *where &= ~0x03ffffff; + *where |= addr & 0x03ffffff; + break; + + case R_MIPS_HI16: /* ((AHL + S) - ((short)(AHL + S)) >> 16 */ + ahl = addend << 16; + where_hi16 = where; + break; + + case R_MIPS_LO16: /* AHL + S */ + ahl += (int16_t)addend; + addr = lookup(lf, symidx, 1); + if (addr == 0) + return (-1); + + addend &= 0xffff0000; + addend |= (uint16_t)(ahl + addr); + *where = addend; + + addend = *where_hi16; + addend &= 0xffff0000; + addend |= ((ahl + addr) - (int16_t)(ahl + addr)) >> 16; + *where_hi16 = addend; + break; + + default: + printf("kldload: unexpected relocation type %d\n", + rtype); + return (-1); } return(0); } @@ -246,6 +260,11 @@ int elf_cpu_load_file(linker_file_t lf __unused) { + /* + * Sync the I and D caches to make sure our relocations are visible. + */ + mips_icache_sync_all(); + return (0); } diff --git a/sys/mips/mips/elf_trampoline.c b/sys/mips/mips/elf_trampoline.c new file mode 100644 index 000000000000..4b387616c7ce --- /dev/null +++ b/sys/mips/mips/elf_trampoline.c @@ -0,0 +1,205 @@ +/*- + * Copyright (c) 2005 Olivier Houchard. 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 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 +__FBSDID("$FreeBSD$"); +#include +#include + +#ifdef __mips_n64 +#include +#else +#include +#endif +#include +#include +#include +#include + +/* + * Since we are compiled outside of the normal kernel build process, we + * need to include opt_global.h manually. + */ +#include "opt_global.h" +#include "opt_kernname.h" + +extern char kernel_start[]; +extern char kernel_end[]; + +static __inline void * +memcpy(void *dst, const void *src, size_t len) +{ + const char *s = src; + char *d = dst; + + while (len) { + if (0 && len >= 4 && !((vm_offset_t)d & 3) && + !((vm_offset_t)s & 3)) { + *(uint32_t *)d = *(uint32_t *)s; + s += 4; + d += 4; + len -= 4; + } else { + *d++ = *s++; + len--; + } + } + return (dst); +} + +static __inline void +bzero(void *addr, size_t count) +{ + char *tmp = (char *)addr; + + while (count > 0) { + if (count >= 4 && !((vm_offset_t)tmp & 3)) { + *(uint32_t *)tmp = 0; + tmp += 4; + count -= 4; + } else { + *tmp = 0; + tmp++; + count--; + } + } +} + +/* + * Relocate PT_LOAD segements of kernel ELF image to their respective + * virtual addresses and return entry point + */ +void * +load_kernel(void * kstart) +{ +#ifdef __mips_n64 + Elf64_Ehdr *eh; + Elf64_Phdr phdr[64] /* XXX */; + Elf64_Shdr shdr[64] /* XXX */; +#else + Elf32_Ehdr *eh; + Elf32_Phdr phdr[64] /* XXX */; + Elf32_Shdr shdr[64] /* XXX */; +#endif + int i, j; + void *entry_point; + vm_offset_t lastaddr = 0; + int symtabindex = -1; + int symstrindex = -1; + +#ifdef __mips_n64 + eh = (Elf64_Ehdr *)kstart; +#else + eh = (Elf32_Ehdr *)kstart; +#endif + entry_point = (void*)eh->e_entry; + memcpy(phdr, (void *)(kstart + eh->e_phoff ), + eh->e_phnum * sizeof(phdr[0])); + + memcpy(shdr, (void *)(kstart + eh->e_shoff), + sizeof(*shdr) * eh->e_shnum); + + if (eh->e_shnum * eh->e_shentsize != 0 && eh->e_shoff != 0) { + for (i = 0; i < eh->e_shnum; i++) { + if (shdr[i].sh_type == SHT_SYMTAB) { + /* + * XXX: check if .symtab is in PT_LOAD? + */ + if (shdr[i].sh_offset != 0 && + shdr[i].sh_size != 0) { + symtabindex = i; + symstrindex = shdr[i].sh_link; + } + } + } + } + + /* + * Copy loadable segments + */ + for (i = 0; i < eh->e_phnum; i++) { + volatile char c; + + if (phdr[i].p_type != PT_LOAD) + continue; + + memcpy((void *)(phdr[i].p_vaddr), + (void*)(kstart + phdr[i].p_offset), phdr[i].p_filesz); + + /* Clean space from oversized segments, eg: bss. */ + if (phdr[i].p_filesz < phdr[i].p_memsz) + bzero((void *)(phdr[i].p_vaddr + phdr[i].p_filesz), + phdr[i].p_memsz - phdr[i].p_filesz); + + if (lastaddr < phdr[i].p_vaddr + phdr[i].p_memsz) + lastaddr = phdr[i].p_vaddr + phdr[i].p_memsz; + } + + /* Now grab the symbol tables. */ + if (symtabindex >= 0 && symstrindex >= 0) { + *(Elf_Size *)lastaddr = SYMTAB_MAGIC; + lastaddr += sizeof(Elf_Size); + *(Elf_Size *)lastaddr = shdr[symtabindex].sh_size + + shdr[symstrindex].sh_size + 2*sizeof(Elf_Size); + lastaddr += sizeof(Elf_Size); + /* .symtab size */ + *(Elf_Size *)lastaddr = shdr[symtabindex].sh_size; + lastaddr += sizeof(shdr[symtabindex].sh_size); + /* .symtab data */ + memcpy((void*)lastaddr, + shdr[symtabindex].sh_offset + kstart, + shdr[symtabindex].sh_size); + lastaddr += shdr[symtabindex].sh_size; + + /* .strtab size */ + *(Elf_Size *)lastaddr = shdr[symstrindex].sh_size; + lastaddr += sizeof(shdr[symstrindex].sh_size); + + /* .strtab data */ + memcpy((void*)lastaddr, + shdr[symstrindex].sh_offset + kstart, + shdr[symstrindex].sh_size); + } else + /* Do not take any chances */ + *(Elf_Size *)lastaddr = 0; + + return entry_point; +} + +void +_startC(register_t a0, register_t a1, register_t a2, register_t a3) +{ + unsigned int * code; + int i; + void (*entry_point)(register_t, register_t, register_t, register_t); + + /* + * Relocate segment to the predefined memory location + * Most likely it will be KSEG0/KSEG1 address + */ + entry_point = load_kernel(kernel_start); + + /* Pass saved registers to original _start */ + entry_point(a0, a1, a2, a3); +} diff --git a/sys/mips/mips/exception.S b/sys/mips/mips/exception.S index fb7614df9708..eff484a73bc3 100644 --- a/sys/mips/mips/exception.S +++ b/sys/mips/mips/exception.S @@ -62,6 +62,8 @@ #include #include +#include "opt_cputype.h" + #include "assym.s" #if defined(ISA_MIPS32) @@ -96,6 +98,11 @@ .set mips3 #endif +/* + * Reasonable limit + */ +#define INTRCNT_COUNT 128 + /* * Assume that w alaways need nops to escape CP0 hazard * TODO: Make hazard delays configurable. Stuck with 5 cycles on the moment @@ -139,20 +146,14 @@ VECTOR_END(MipsTLBMiss) *---------------------------------------------------------------------------- */ MipsDoTLBMiss: -#ifndef SMP - lui k1, %hi(_C_LABEL(pcpup)) -#endif #k0 already has BadVA bltz k0, 1f #02: k0<0 -> 1f (kernel fault) srl k0, k0, SEGSHIFT - 2 #03: k0=seg offset (almost) -#ifdef SMP GET_CPU_PCPU(k1) -#else - lw k1, %lo(_C_LABEL(pcpup))(k1) -#endif lw k1, PC_SEGBASE(k1) beqz k1, 2f #05: make sure segbase is not null andi k0, k0, 0x7fc #06: k0=seg offset (mask 0x3) +#xxx mips64 unsafe? addu k1, k0, k1 #07: k1=seg entry address lw k1, 0(k1) #08: k1=seg entry mfc0 k0, COP_0_BAD_VADDR #09: k0=bad address (again) @@ -160,6 +161,7 @@ MipsDoTLBMiss: srl k0, PGSHIFT - 2 #0b: k0=VPN (aka va>>10) andi k0, k0, ((NPTEPG/2) - 1) << 3 #0c: k0=page tab offset +#xxx mips64 unsafe? addu k1, k1, k0 #0d: k1=pte address lw k0, 0(k1) #0e: k0=lo0 pte lw k1, 4(k1) #0f: k1=lo1 pte @@ -199,8 +201,8 @@ VECTOR(MipsException, unknown) and k1, k1, CR_EXC_CODE # Mask out the cause bits. or k1, k1, k0 # change index to user table 1: - la k0, _C_LABEL(machExceptionTable) # get base of the jump table - addu k0, k0, k1 # Get the address of the + PTR_LA k0, _C_LABEL(machExceptionTable) # get base of the jump table + PTR_ADDU k0, k0, k1 # Get the address of the # function entry. Note that # the cause is already # shifted left by 2 bits so @@ -272,7 +274,16 @@ SlowFault: and a0, a0, a2 ; \ mtc0 a0, COP_0_STATUS_REG #endif - + +/* + * Save CPU and CP0 register state. + * + * This is straightforward except for saving the exception program + * counter. The ddb backtrace code looks for the first instruction + * matching the form "sw ra, (off)sp" to figure out the address of the + * calling function. So we must make sure that we save the exception + * PC by staging it through 'ra' as opposed to any other register. + */ #define SAVE_CPU \ SAVE_REG(AT, AST, sp) ;\ .set at ; \ @@ -286,10 +297,10 @@ SlowFault: SAVE_REG(t1, T1, sp) ;\ SAVE_REG(t2, T2, sp) ;\ SAVE_REG(t3, T3, sp) ;\ - SAVE_REG(t4, T4, sp) ;\ - SAVE_REG(t5, T5, sp) ;\ - SAVE_REG(t6, T6, sp) ;\ - SAVE_REG(t7, T7, sp) ;\ + SAVE_REG(ta0, TA0, sp) ;\ + SAVE_REG(ta1, TA1, sp) ;\ + SAVE_REG(ta2, TA2, sp) ;\ + SAVE_REG(ta3, TA3, sp) ;\ SAVE_REG(t8, T8, sp) ;\ SAVE_REG(t9, T9, sp) ;\ SAVE_REG(gp, GP, sp) ;\ @@ -312,13 +323,16 @@ SlowFault: SAVE_REG(v1, MULHI, sp) ;\ SAVE_REG(a0, SR, sp) ;\ SAVE_REG(a1, CAUSE, sp) ;\ - SAVE_REG(ra, RA, sp) ;\ SAVE_REG(a2, BADVADDR, sp) ;\ - SAVE_REG(a3, PC, sp) ;\ - addu v0, sp, KERN_EXC_FRAME_SIZE ;\ + move t0, ra ;\ + move ra, a3 ;\ + SAVE_REG(ra, PC, sp) ;\ + move ra, t0 ;\ + SAVE_REG(ra, RA, sp) ;\ + PTR_ADDU v0, sp, KERN_EXC_FRAME_SIZE ;\ SAVE_REG(v0, SP, sp) ;\ CLEAR_STATUS ;\ - addu a0, sp, STAND_ARG_SIZE ;\ + PTR_ADDU a0, sp, STAND_ARG_SIZE ;\ ITLBNOPFIX #define RESTORE_REG(reg, offs, base) \ @@ -326,14 +340,13 @@ SlowFault: #define RESTORE_CPU \ mtc0 zero,COP_0_STATUS_REG ;\ - RESTORE_REG(a0, SR, sp) ;\ + RESTORE_REG(k0, SR, sp) ;\ RESTORE_REG(t0, MULLO, sp) ;\ RESTORE_REG(t1, MULHI, sp) ;\ - mtc0 a0, COP_0_STATUS_REG ;\ mtlo t0 ;\ mthi t1 ;\ _MTC0 v0, COP_0_EXC_PC ;\ - .set noat ; \ + .set noat ;\ RESTORE_REG(AT, AST, sp) ;\ RESTORE_REG(v0, V0, sp) ;\ RESTORE_REG(v1, V1, sp) ;\ @@ -345,10 +358,10 @@ SlowFault: RESTORE_REG(t1, T1, sp) ;\ RESTORE_REG(t2, T2, sp) ;\ RESTORE_REG(t3, T3, sp) ;\ - RESTORE_REG(t4, T4, sp) ;\ - RESTORE_REG(t5, T5, sp) ;\ - RESTORE_REG(t6, T6, sp) ;\ - RESTORE_REG(t7, T7, sp) ;\ + RESTORE_REG(ta0, TA0, sp) ;\ + RESTORE_REG(ta1, TA1, sp) ;\ + RESTORE_REG(ta2, TA2, sp) ;\ + RESTORE_REG(ta3, TA3, sp) ;\ RESTORE_REG(t8, T8, sp) ;\ RESTORE_REG(t9, T9, sp) ;\ RESTORE_REG(s0, S0, sp) ;\ @@ -362,7 +375,8 @@ SlowFault: RESTORE_REG(s8, S8, sp) ;\ RESTORE_REG(gp, GP, sp) ;\ RESTORE_REG(ra, RA, sp) ;\ - addu sp, sp, KERN_EXC_FRAME_SIZE + PTR_ADDU sp, sp, KERN_EXC_FRAME_SIZE;\ + mtc0 k0, COP_0_STATUS_REG /* @@ -384,11 +398,24 @@ NNON_LEAF(MipsKernGenException, KERN_EXC_FRAME_SIZE, ra) /* * Call the exception handler. a0 points at the saved frame. */ - la gp, _C_LABEL(_gp) - la k0, _C_LABEL(trap) + PTR_LA gp, _C_LABEL(_gp) + PTR_LA k0, _C_LABEL(trap) jalr k0 sw a3, STAND_RA_OFFSET + KERN_REG_SIZE(sp) # for debugging + /* + * Update interrupt mask in saved status register + * Some of interrupts could be disabled by + * intr filters if interrupts are enabled later + * in trap handler + */ + mfc0 a0, COP_0_STATUS_REG + mtc0 zero, COP_0_STATUS_REG + and a0, a0, SR_INT_MASK + RESTORE_REG(a1, SR, sp) + and a1, a1, ~SR_INT_MASK + or a1, a1, a0 + SAVE_REG(a1, SR, sp) RESTORE_CPU # v0 contains the return address. sync eret @@ -438,11 +465,11 @@ NNON_LEAF(MipsUserGenException, STAND_FRAME_SIZE, ra) SAVE_U_PCB_REG(t1, T1, k1) SAVE_U_PCB_REG(t2, T2, k1) SAVE_U_PCB_REG(t3, T3, k1) - SAVE_U_PCB_REG(t4, T4, k1) + SAVE_U_PCB_REG(ta0, TA0, k1) mfc0 a0, COP_0_STATUS_REG # First arg is the status reg. - SAVE_U_PCB_REG(t5, T5, k1) - SAVE_U_PCB_REG(t6, T6, k1) - SAVE_U_PCB_REG(t7, T7, k1) + SAVE_U_PCB_REG(ta1, TA1, k1) + SAVE_U_PCB_REG(ta2, TA2, k1) + SAVE_U_PCB_REG(ta3, TA3, k1) SAVE_U_PCB_REG(s0, S0, k1) mfc0 a1, COP_0_CAUSE_REG # Second arg is the cause reg. SAVE_U_PCB_REG(s1, S1, k1) @@ -468,32 +495,32 @@ NNON_LEAF(MipsUserGenException, STAND_FRAME_SIZE, ra) SAVE_U_PCB_REG(a2, BADVADDR, k1) SAVE_U_PCB_REG(a3, PC, k1) sw a3, STAND_RA_OFFSET(sp) # for debugging - la gp, _C_LABEL(_gp) # switch to kernel GP + PTR_LA gp, _C_LABEL(_gp) # switch to kernel GP # Turn off fpu and enter kernel mode and t0, a0, ~(SR_COP_1_BIT | SR_EXL | SR_KSU_MASK | SR_INT_ENAB) #ifdef TARGET_OCTEON or t0, t0, (MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX) #endif mtc0 t0, COP_0_STATUS_REG - addu a0, k1, U_PCB_REGS + PTR_ADDU a0, k1, U_PCB_REGS ITLBNOPFIX /* * Call the exception handler. */ - la k0, _C_LABEL(trap) + PTR_LA k0, _C_LABEL(trap) jalr k0 nop + /* * Restore user registers and return. * First disable interrupts and set exeption level. */ DO_AST - mtc0 zero, COP_0_STATUS_REG # disable int - ITLBNOPFIX - li v0, SR_EXL - mtc0 v0, COP_0_STATUS_REG # set exeption level + mfc0 t0, COP_0_STATUS_REG # disable int + and t0, t0, ~(MIPS_SR_INT_IE) + mtc0 t0, COP_0_STATUS_REG ITLBNOPFIX /* @@ -504,6 +531,18 @@ NNON_LEAF(MipsUserGenException, STAND_FRAME_SIZE, ra) GET_CPU_PCPU(k1) lw k1, PC_CURPCB(k1) + /* + * Update interrupt mask in saved status register + * Some of interrupts could be enabled by ithread + * scheduled by ast() + */ + mfc0 a0, COP_0_STATUS_REG + and a0, a0, SR_INT_MASK + RESTORE_U_PCB_REG(a1, SR, k1) + and a1, a1, ~SR_INT_MASK + or a1, a1, a0 + SAVE_U_PCB_REG(a1, SR, k1) + RESTORE_U_PCB_REG(t0, MULLO, k1) RESTORE_U_PCB_REG(t1, MULHI, k1) mtlo t0 @@ -520,10 +559,10 @@ NNON_LEAF(MipsUserGenException, STAND_FRAME_SIZE, ra) RESTORE_U_PCB_REG(t1, T1, k1) RESTORE_U_PCB_REG(t2, T2, k1) RESTORE_U_PCB_REG(t3, T3, k1) - RESTORE_U_PCB_REG(t4, T4, k1) - RESTORE_U_PCB_REG(t5, T5, k1) - RESTORE_U_PCB_REG(t6, T6, k1) - RESTORE_U_PCB_REG(t7, T7, k1) + RESTORE_U_PCB_REG(ta0, TA0, k1) + RESTORE_U_PCB_REG(ta1, TA1, k1) + RESTORE_U_PCB_REG(ta2, TA2, k1) + RESTORE_U_PCB_REG(ta3, TA3, k1) RESTORE_U_PCB_REG(s0, S0, k1) RESTORE_U_PCB_REG(s1, S1, k1) RESTORE_U_PCB_REG(s2, S2, k1) @@ -542,16 +581,10 @@ NNON_LEAF(MipsUserGenException, STAND_FRAME_SIZE, ra) #ifdef TARGET_OCTEON and k0, k0, ~(MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX) #endif - or k0, k0, (MIPS_SR_INT_IE) .set noat RESTORE_U_PCB_REG(AT, AST, k1) -/* - * The restoration of the user SR must be done only after - * k1 is no longer needed. Otherwise, k1 will get clobbered after - * interrupts are enabled. - */ - mtc0 k0, COP_0_STATUS_REG # still exeption level + mtc0 k0, COP_0_STATUS_REG # still exception level ITLBNOPFIX sync eret @@ -587,12 +620,25 @@ NNON_LEAF(MipsKernIntr, KERN_EXC_FRAME_SIZE, ra) /* * Call the interrupt handler. */ - la gp, _C_LABEL(_gp) - addu a0, sp, STAND_ARG_SIZE - la k0, _C_LABEL(cpu_intr) + PTR_LA gp, _C_LABEL(_gp) + PTR_ADDU a0, sp, STAND_ARG_SIZE + PTR_LA k0, _C_LABEL(cpu_intr) jalr k0 sw a3, STAND_RA_OFFSET + KERN_REG_SIZE(sp) /* Why no AST processing here? */ + + /* + * Update interrupt mask in saved status register + * Some of interrupts could be disabled by + * intr filters + */ + mfc0 a0, COP_0_STATUS_REG + and a0, a0, SR_INT_MASK + RESTORE_REG(a1, SR, sp) + and a1, a1, ~SR_INT_MASK + or a1, a1, a0 + SAVE_REG(a1, SR, sp) + /* * Restore registers and return from the interrupt. */ @@ -643,10 +689,10 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE, ra) SAVE_U_PCB_REG(t1, T1, k1) SAVE_U_PCB_REG(t2, T2, k1) SAVE_U_PCB_REG(t3, T3, k1) - SAVE_U_PCB_REG(t4, T4, k1) - SAVE_U_PCB_REG(t5, T5, k1) - SAVE_U_PCB_REG(t6, T6, k1) - SAVE_U_PCB_REG(t7, T7, k1) + SAVE_U_PCB_REG(ta0, TA0, k1) + SAVE_U_PCB_REG(ta1, TA1, k1) + SAVE_U_PCB_REG(ta2, TA2, k1) + SAVE_U_PCB_REG(ta3, TA3, k1) SAVE_U_PCB_REG(t8, T8, k1) SAVE_U_PCB_REG(t9, T9, k1) SAVE_U_PCB_REG(gp, GP, k1) @@ -676,7 +722,7 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE, ra) SAVE_U_PCB_REG(a1, CAUSE, k1) SAVE_U_PCB_REG(a3, PC, k1) # PC in a3, note used later! subu sp, k1, STAND_FRAME_SIZE # switch to kernel SP - la gp, _C_LABEL(_gp) # switch to kernel GP + PTR_LA gp, _C_LABEL(_gp) # switch to kernel GP # Turn off fpu, disable interrupts, set kernel mode kernel mode, clear exception level. and t0, a0, ~(SR_COP_1_BIT | SR_EXL | SR_INT_ENAB | SR_KSU_MASK) @@ -685,40 +731,54 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE, ra) #endif mtc0 t0, COP_0_STATUS_REG ITLBNOPFIX - addu a0, k1, U_PCB_REGS + PTR_ADDU a0, k1, U_PCB_REGS /* * Call the interrupt handler. */ - la k0, _C_LABEL(cpu_intr) + PTR_LA k0, _C_LABEL(cpu_intr) jalr k0 sw a3, STAND_RA_OFFSET(sp) # for debugging + /* - * Since interrupts are enabled at this point, we use a1 instead of - * k0 or k1 to store the PCB pointer. This is because k0 and k1 - * are not preserved across interrupts. ** RRS - And how did the - * get enabled? cpu_intr clears the cause register but it does - * not touch the sr as far as I can see thus intr are still - * disabled. + * Enable interrupts before doing ast(). + * + * On SMP kernels the AST processing might trigger IPI to other processors. + * If that processor is also doing AST processing with interrupts disabled + * then we may deadlock. + */ + mfc0 a0, COP_0_STATUS_REG + or a0, a0, SR_INT_ENAB + mtc0 a0, COP_0_STATUS_REG + ITLBNOPFIX + +/* + * DO_AST enabled interrupts */ DO_AST /* - * Restore user registers and return. NOTE: interrupts are enabled. + * Restore user registers and return. */ - -/* - * Since interrupts are enabled at this point, we use a1 instead of - * k0 or k1 to store the PCB pointer. This is because k0 and k1 - * are not preserved across interrupts. - */ - mtc0 zero, COP_0_STATUS_REG - ITLBNOPFIX - li v0, SR_EXL - mtc0 v0, COP_0_STATUS_REG # set exeption level bit. + mfc0 t0, COP_0_STATUS_REG # disable int + and t0, t0, ~(MIPS_SR_INT_IE) + mtc0 t0, COP_0_STATUS_REG ITLBNOPFIX GET_CPU_PCPU(k1) - lw a1, PC_CURPCB(k1) + lw k1, PC_CURPCB(k1) + + /* + * Update interrupt mask in saved status register + * Some of interrupts could be disabled by + * intr filters + */ + mfc0 a0, COP_0_STATUS_REG + and a0, a0, SR_INT_MASK + RESTORE_U_PCB_REG(a1, SR, k1) + and a1, a1, ~SR_INT_MASK + or a1, a1, a0 + SAVE_U_PCB_REG(a1, SR, k1) + RESTORE_U_PCB_REG(s0, S0, k1) RESTORE_U_PCB_REG(s1, S1, k1) RESTORE_U_PCB_REG(s2, S2, k1) @@ -744,10 +804,10 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE, ra) RESTORE_U_PCB_REG(t1, T1, k1) RESTORE_U_PCB_REG(t2, T2, k1) RESTORE_U_PCB_REG(t3, T3, k1) - RESTORE_U_PCB_REG(t4, T4, k1) - RESTORE_U_PCB_REG(t5, T5, k1) - RESTORE_U_PCB_REG(t6, T6, k1) - RESTORE_U_PCB_REG(t7, T7, k1) + RESTORE_U_PCB_REG(ta0, TA0, k1) + RESTORE_U_PCB_REG(ta1, TA1, k1) + RESTORE_U_PCB_REG(ta2, TA2, k1) + RESTORE_U_PCB_REG(ta3, TA3, k1) RESTORE_U_PCB_REG(t8, T8, k1) RESTORE_U_PCB_REG(t9, T9, k1) RESTORE_U_PCB_REG(gp, GP, k1) @@ -757,15 +817,9 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE, ra) #ifdef TARGET_OCTEON and k0, k0, ~(MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX) #endif - or k0, k0, (MIPS_SR_INT_IE|SR_EXL) .set noat RESTORE_U_PCB_REG(AT, AST, k1) -/* - * The restoration of the user SR must be done only after - * k1 is no longer needed. Otherwise, k1 will get clobbered after - * interrupts are enabled. - */ mtc0 k0, COP_0_STATUS_REG # SR with EXL set. ITLBNOPFIX sync @@ -773,35 +827,6 @@ NNON_LEAF(MipsUserIntr, STAND_FRAME_SIZE, ra) .set at END(MipsUserIntr) -/*---------------------------------------------------------------------------- - * - * MipsTLBInvalidException -- - * - * Handle a TLB invalid exception. - * The BaddVAddr, Context, and EntryHi registers contain the failed - * virtual address. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------------- - */ -NLEAF(MipsTLBInvalidException) - .set noat - mfc0 k0, COP_0_STATUS_REG - nop - and k0, k0, SR_KSU_USER - bne k0, zero, _C_LABEL(MipsUserTLBInvalidException) - nop - .set at -END(MipsTLBInvalidException) -/* - * Fall through ... - */ - NLEAF(MipsKernTLBInvalidException) .set noat mfc0 k0, COP_0_BAD_VADDR # get the fault address @@ -811,12 +836,7 @@ NLEAF(MipsKernTLBInvalidException) sltu k1, k0, k1 beqz k1, 1f nop -#ifdef SMP GET_CPU_PCPU(k1) -#else - lui k1, %hi(_C_LABEL(pcpup)) - lw k1, %lo(_C_LABEL(pcpup))(k1) -#endif lw k1, PC_SEGBASE(k1) # works for single cpu???? beqz k1, _C_LABEL(MipsKernGenException) # seg tab is null nop @@ -833,6 +853,7 @@ NLEAF(MipsKernTLBInvalidException) 2: srl k0, 20 # k0=seg offset (almost) andi k0, k0, 0xffc # k0=seg offset (mask 0x3) +#xxx mips64 unsafe? addu k1, k0, k1 # k1=seg entry address lw k1, 0(k1) # k1=seg entry mfc0 k0, COP_0_BAD_VADDR # k0=bad address (again) @@ -840,6 +861,7 @@ NLEAF(MipsKernTLBInvalidException) srl k0, k0, PGSHIFT-2 andi k0, k0, 0xffc # compute offset from index tlbp # Probe the invalid entry +#xxx mips64 unsafe? addu k1, k1, k0 and k0, k0, 4 # check even/odd page nop # required for QED 5230 @@ -905,18 +927,14 @@ NLEAF(MipsUserTLBInvalidException) sltu k1, k0, k1 beqz k1, _C_LABEL(MipsUserGenException) nop -#ifdef SMP GET_CPU_PCPU(k1) -#else - lui k1, %hi(_C_LABEL(pcpup)) - lw k1, %lo(_C_LABEL(pcpup))(k1) -#endif lw k1, PC_SEGBASE(k1) # works for single cpu???? beqz k1, _C_LABEL(MipsUserGenException) # seg tab is null nop 2: srl k0, 20 # k0=seg offset (almost) andi k0, k0, 0xffc # k0=seg offset (mask 0x3) +#xxx mips64 unsafe? addu k1, k0, k1 # k1=seg entry address lw k1, 0(k1) # k1=seg entry mfc0 k0, COP_0_BAD_VADDR # k0=bad address (again) @@ -924,6 +942,7 @@ NLEAF(MipsUserTLBInvalidException) srl k0, k0, PGSHIFT-2 andi k0, k0, 0xffc # compute offset from index tlbp # Probe the invalid entry +#xxx mips64 unsafe? addu k1, k1, k0 and k0, k0, 4 # check even/odd page nop # required for QED 5230 @@ -1007,12 +1026,14 @@ NLEAF(MipsTLBMissException) lw k1, %lo(_C_LABEL(kernel_segmap))(k1) # k1=segment tab base beq k1, zero, _C_LABEL(MipsKernGenException) # ==0 -- no seg tab andi k0, k0, 0xffc # k0=seg offset (mask 0x3) +#xxx mips64 unsafe addu k1, k0, k1 # k1=seg entry address lw k1, 0(k1) # k1=seg entry mfc0 k0, COP_0_BAD_VADDR # k0=bad address (again) beq k1, zero, _C_LABEL(MipsKernGenException) # ==0 -- no page table srl k0, 10 # k0=VPN (aka va>>10) andi k0, k0, 0xff8 # k0=page tab offset +#xxx mips64 unsafe addu k1, k1, k0 # k1=pte address lw k0, 0(k1) # k0=lo0 pte lw k1, 4(k1) # k1=lo1 pte @@ -1037,31 +1058,31 @@ sys_stk_chk: nop # stack overflow - la a0, _C_LABEL(_start) - START_FRAME - 8 # set sp to a valid place + PTR_LA a0, _C_LABEL(_start) - START_FRAME - 8 # set sp to a valid place sw sp, 24(a0) move sp, a0 - la a0, 1f + PTR_LA a0, 1f mfc0 a2, COP_0_STATUS_REG mfc0 a3, COP_0_CAUSE_REG _MFC0 a1, COP_0_EXC_PC sw a2, 16(sp) sw a3, 20(sp) move a2, ra - la k0, _C_LABEL(printf) + PTR_LA k0, _C_LABEL(printf) jalr k0 mfc0 a3, COP_0_BAD_VADDR - la sp, _C_LABEL(_start) - START_FRAME # set sp to a valid place + PTR_LA sp, _C_LABEL(_start) - START_FRAME # set sp to a valid place #if !defined(SMP) && defined(DDB) - la a0, 2f - la k0, _C_LABEL(trapDump) + PTR_LA a0, 2f + PTR_LA k0, _C_LABEL(trapDump) jalr k0 nop li a0, 0 lw a1, _C_LABEL(num_tlbentries) - la k0, _C_LABEL(db_dump_tlb) + PTR_LA k0, _C_LABEL(db_dump_tlb) jalr k0 addu a1, -1 @@ -1138,11 +1159,12 @@ NON_LEAF(MipsFPTrap, STAND_FRAME_SIZE, ra) */ sw a2, STAND_FRAME_SIZE + 8(sp) GET_CPU_PCPU(a0) +#mips64 unsafe? lw a0, PC_CURPCB(a0) - addu a0, a0, U_PCB_REGS # first arg is ptr to CPU registers + PTR_ADDU a0, a0, U_PCB_REGS # first arg is ptr to CPU registers move a1, a2 # second arg is instruction PC move a2, t1 # third arg is floating point CSR - la t3, _C_LABEL(MipsEmulateBranch) # compute PC after branch + PTR_LA t3, _C_LABEL(MipsEmulateBranch) # compute PC after branch jalr t3 # compute PC after branch move a3, zero # fourth arg is FALSE /* @@ -1158,6 +1180,7 @@ NON_LEAF(MipsFPTrap, STAND_FRAME_SIZE, ra) */ 1: lw a0, 0(a2) # a0 = coproc instruction +#xxx mips64 unsafe? addu v0, a2, 4 # v0 = next pc 2: GET_CPU_PCPU(t2) @@ -1178,7 +1201,7 @@ NON_LEAF(MipsFPTrap, STAND_FRAME_SIZE, ra) lw a0, PC_CURTHREAD(a0) # get current thread cfc1 a2, FPC_CSR # code = FP execptions ctc1 zero, FPC_CSR # Clear exceptions - la t3, _C_LABEL(trapsignal) + PTR_LA t3, _C_LABEL(trapsignal) jalr t3 li a1, SIGFPE b FPReturn @@ -1188,7 +1211,7 @@ NON_LEAF(MipsFPTrap, STAND_FRAME_SIZE, ra) * Finally, we can call MipsEmulateFP() where a0 is the instruction to emulate. */ 4: - la t3, _C_LABEL(MipsEmulateFP) + PTR_LA t3, _C_LABEL(MipsEmulateFP) jalr t3 nop @@ -1202,26 +1225,9 @@ FPReturn: mtc0 t0, COP_0_STATUS_REG ITLBNOPFIX j ra - addu sp, sp, STAND_FRAME_SIZE + PTR_ADDU sp, sp, STAND_FRAME_SIZE END(MipsFPTrap) - -#if 0 -/* - * Atomic ipending update - */ -LEAF(set_sint) - la v1, ipending -1: - ll v0, 0(v1) - or v0, a0 - sc v0, 0(v1) - beqz v0, 1b - j ra - nop -END(set_sint) -#endif - /* * Interrupt counters for vmstat. */ @@ -1231,15 +1237,11 @@ END(set_sint) .globl intrnames .globl eintrnames intrnames: - .asciiz "clock" - .asciiz "rtc" - .asciiz "sio" - .asciiz "pe" - .asciiz "pic-nic" + .space INTRCNT_COUNT * (MAXCOMLEN + 1) * 2 eintrnames: - .align 2 + .align 4 intrcnt: - .word 0,0,0,0,0 + .space INTRCNT_COUNT * 4 * 2 eintrcnt: @@ -1248,7 +1250,7 @@ eintrcnt: */ .text VECTOR(MipsCache, unknown) - la k0, _C_LABEL(MipsCacheException) + PTR_LA k0, _C_LABEL(MipsCacheException) li k1, MIPS_PHYS_MASK and k0, k1 li k1, MIPS_UNCACHED_MEMORY_ADDR @@ -1267,8 +1269,8 @@ VECTOR_END(MipsCache) NESTED_NOPROFILE(MipsCacheException, KERN_EXC_FRAME_SIZE, ra) .set noat .mask 0x80000000, -4 - la k0, _C_LABEL(panic) # return to panic - la a0, 9f # panicstr + PTR_LA k0, _C_LABEL(panic) # return to panic + PTR_LA a0, 9f # panicstr _MFC0 a1, COP_0_ERROR_PC mfc0 a2, COP_0_CACHE_ERR # 3rd arg cache error diff --git a/sys/mips/mips/fp.S b/sys/mips/mips/fp.S index b211c12fb15c..afe9f03d1e00 100644 --- a/sys/mips/mips/fp.S +++ b/sys/mips/mips/fp.S @@ -634,7 +634,7 @@ func_fmt_tbl: */ sub_s: jal get_ft_fs_s - xor t4, t4, 1 # negate FT sign bit + xor ta0, ta0, 1 # negate FT sign bit b add_sub_s /* * Single precision add. @@ -643,38 +643,38 @@ add_s: jal get_ft_fs_s add_sub_s: bne t1, SEXP_INF, 1f # is FS an infinity? - bne t5, SEXP_INF, result_fs_s # if FT is not inf, result=FS + bne ta1, SEXP_INF, result_fs_s # if FT is not inf, result=FS bne t2, zero, result_fs_s # if FS is NAN, result is FS - bne t6, zero, result_ft_s # if FT is NAN, result is FT - bne t0, t4, invalid_s # both infinities same sign? + bne ta2, zero, result_ft_s # if FT is NAN, result is FT + bne t0, ta0, invalid_s # both infinities same sign? b result_fs_s # result is in FS 1: - beq t5, SEXP_INF, result_ft_s # if FT is inf, result=FT + beq ta1, SEXP_INF, result_ft_s # if FT is inf, result=FT bne t1, zero, 4f # is FS a denormalized num? beq t2, zero, 3f # is FS zero? - bne t5, zero, 2f # is FT a denormalized num? - beq t6, zero, result_fs_s # FT is zero, result=FS + bne ta1, zero, 2f # is FT a denormalized num? + beq ta2, zero, result_fs_s # FT is zero, result=FS jal renorm_fs_s jal renorm_ft_s b 5f 2: jal renorm_fs_s - subu t5, t5, SEXP_BIAS # unbias FT exponent - or t6, t6, SIMPL_ONE # set implied one bit + subu ta1, ta1, SEXP_BIAS # unbias FT exponent + or ta2, ta2, SIMPL_ONE # set implied one bit b 5f 3: - bne t5, zero, result_ft_s # if FT != 0, result=FT - bne t6, zero, result_ft_s + bne ta1, zero, result_ft_s # if FT != 0, result=FT + bne ta2, zero, result_ft_s and v0, a1, FPC_ROUNDING_BITS # get rounding mode bne v0, FPC_ROUND_RM, 1f # round to -infinity? - or t0, t0, t4 # compute result sign + or t0, t0, ta0 # compute result sign b result_fs_s 1: - and t0, t0, t4 # compute result sign + and t0, t0, ta0 # compute result sign b result_fs_s 4: - bne t5, zero, 2f # is FT a denormalized num? - beq t6, zero, result_fs_s # FT is zero, result=FS + bne ta1, zero, 2f # is FT a denormalized num? + beq ta2, zero, result_fs_s # FT is zero, result=FS subu t1, t1, SEXP_BIAS # unbias FS exponent or t2, t2, SIMPL_ONE # set implied one bit jal renorm_ft_s @@ -682,15 +682,15 @@ add_sub_s: 2: subu t1, t1, SEXP_BIAS # unbias FS exponent or t2, t2, SIMPL_ONE # set implied one bit - subu t5, t5, SEXP_BIAS # unbias FT exponent - or t6, t6, SIMPL_ONE # set implied one bit + subu ta1, ta1, SEXP_BIAS # unbias FT exponent + or ta2, ta2, SIMPL_ONE # set implied one bit /* * Perform the addition. */ 5: move t8, zero # no shifted bits (sticky reg) - beq t1, t5, 4f # no shift needed - subu v0, t1, t5 # v0 = difference of exponents + beq t1, ta1, 4f # no shift needed + subu v0, t1, ta1 # v0 = difference of exponents move v1, v0 # v1 = abs(difference) bge v0, zero, 1f negu v1 @@ -698,50 +698,50 @@ add_sub_s: ble v1, SFRAC_BITS+2, 2f # is difference too great? li t8, STICKYBIT # set the sticky bit bge v0, zero, 1f # check which exp is larger - move t1, t5 # result exp is FTs + move t1, ta1 # result exp is FTs move t2, zero # FSs fraction shifted is zero b 4f 1: - move t6, zero # FTs fraction shifted is zero + move ta2, zero # FTs fraction shifted is zero b 4f 2: li t9, 32 # compute 32 - abs(exp diff) subu t9, t9, v1 bgt v0, zero, 3f # if FS > FT, shift FTs frac - move t1, t5 # FT > FS, result exp is FTs + move t1, ta1 # FT > FS, result exp is FTs sll t8, t2, t9 # save bits shifted out srl t2, t2, v1 # shift FSs fraction b 4f 3: - sll t8, t6, t9 # save bits shifted out - srl t6, t6, v1 # shift FTs fraction + sll t8, ta2, t9 # save bits shifted out + srl ta2, ta2, v1 # shift FTs fraction 4: - bne t0, t4, 1f # if signs differ, subtract - addu t2, t2, t6 # add fractions + bne t0, ta0, 1f # if signs differ, subtract + addu t2, t2, ta2 # add fractions b norm_s 1: - blt t2, t6, 3f # subtract larger from smaller - bne t2, t6, 2f # if same, result=0 + blt t2, ta2, 3f # subtract larger from smaller + bne t2, ta2, 2f # if same, result=0 move t1, zero # result=0 move t2, zero and v0, a1, FPC_ROUNDING_BITS # get rounding mode - bne v0, FPC_ROUND_RM, 1f # round to -infinity? - or t0, t0, t4 # compute result sign + bne v0, FPC_ROUND_RM, 1f # round to -infinity? + or t0, t0, ta0 # compute result sign b result_fs_s 1: - and t0, t0, t4 # compute result sign + and t0, t0, ta0 # compute result sign b result_fs_s 2: - sltu t9, zero, t8 # compute t2:zero - t6:t8 + sltu t9, zero, t8 # compute t2:zero - ta2:t8 subu t8, zero, t8 - subu t2, t2, t6 # subtract fractions + subu t2, t2, ta2 # subtract fractions subu t2, t2, t9 # subtract barrow b norm_s 3: - move t0, t4 # sign of result = FTs - sltu t9, zero, t8 # compute t6:zero - t2:t8 + move t0, ta0 # sign of result = FTs + sltu t9, zero, t8 # compute ta2:zero - t2:t8 subu t8, zero, t8 - subu t2, t6, t2 # subtract fractions + subu t2, ta2, t2 # subtract fractions subu t2, t2, t9 # subtract barrow b norm_s @@ -750,7 +750,7 @@ add_sub_s: */ sub_d: jal get_ft_fs_d - xor t4, t4, 1 # negate sign bit + xor ta0, ta0, 1 # negate sign bit b add_sub_d /* * Double precision add. @@ -759,46 +759,46 @@ add_d: jal get_ft_fs_d add_sub_d: bne t1, DEXP_INF, 1f # is FS an infinity? - bne t5, DEXP_INF, result_fs_d # if FT is not inf, result=FS + bne ta1, DEXP_INF, result_fs_d # if FT is not inf, result=FS bne t2, zero, result_fs_d # if FS is NAN, result is FS bne t3, zero, result_fs_d - bne t6, zero, result_ft_d # if FT is NAN, result is FT - bne t7, zero, result_ft_d - bne t0, t4, invalid_d # both infinities same sign? + bne ta2, zero, result_ft_d # if FT is NAN, result is FT + bne ta3, zero, result_ft_d + bne t0, ta0, invalid_d # both infinities same sign? b result_fs_d # result is in FS 1: - beq t5, DEXP_INF, result_ft_d # if FT is inf, result=FT + beq ta1, DEXP_INF, result_ft_d # if FT is inf, result=FT bne t1, zero, 4f # is FS a denormalized num? bne t2, zero, 1f # is FS zero? beq t3, zero, 3f 1: - bne t5, zero, 2f # is FT a denormalized num? - bne t6, zero, 1f - beq t7, zero, result_fs_d # FT is zero, result=FS + bne ta1, zero, 2f # is FT a denormalized num? + bne ta2, zero, 1f + beq ta3, zero, result_fs_d # FT is zero, result=FS 1: jal renorm_fs_d jal renorm_ft_d b 5f 2: jal renorm_fs_d - subu t5, t5, DEXP_BIAS # unbias FT exponent - or t6, t6, DIMPL_ONE # set implied one bit + subu ta1, ta1, DEXP_BIAS # unbias FT exponent + or ta2, ta2, DIMPL_ONE # set implied one bit b 5f 3: - bne t5, zero, result_ft_d # if FT != 0, result=FT - bne t6, zero, result_ft_d - bne t7, zero, result_ft_d + bne ta1, zero, result_ft_d # if FT != 0, result=FT + bne ta2, zero, result_ft_d + bne ta3, zero, result_ft_d and v0, a1, FPC_ROUNDING_BITS # get rounding mode - bne v0, FPC_ROUND_RM, 1f # round to -infinity? - or t0, t0, t4 # compute result sign + bne v0, FPC_ROUND_RM, 1f # round to -infinity? + or t0, t0, ta0 # compute result sign b result_fs_d 1: - and t0, t0, t4 # compute result sign + and t0, t0, ta0 # compute result sign b result_fs_d 4: - bne t5, zero, 2f # is FT a denormalized num? - bne t6, zero, 1f - beq t7, zero, result_fs_d # FT is zero, result=FS + bne ta1, zero, 2f # is FT a denormalized num? + bne ta2, zero, 1f + beq ta3, zero, result_fs_d # FT is zero, result=FS 1: subu t1, t1, DEXP_BIAS # unbias FS exponent or t2, t2, DIMPL_ONE # set implied one bit @@ -807,15 +807,15 @@ add_sub_d: 2: subu t1, t1, DEXP_BIAS # unbias FS exponent or t2, t2, DIMPL_ONE # set implied one bit - subu t5, t5, DEXP_BIAS # unbias FT exponent - or t6, t6, DIMPL_ONE # set implied one bit + subu ta1, ta1, DEXP_BIAS # unbias FT exponent + or ta2, ta2, DIMPL_ONE # set implied one bit /* * Perform the addition. */ 5: move t8, zero # no shifted bits (sticky reg) - beq t1, t5, 4f # no shift needed - subu v0, t1, t5 # v0 = difference of exponents + beq t1, ta1, 4f # no shift needed + subu v0, t1, ta1 # v0 = difference of exponents move v1, v0 # v1 = abs(difference) bge v0, zero, 1f negu v1 @@ -823,18 +823,18 @@ add_sub_d: ble v1, DFRAC_BITS+2, 2f # is difference too great? li t8, STICKYBIT # set the sticky bit bge v0, zero, 1f # check which exp is larger - move t1, t5 # result exp is FTs + move t1, ta1 # result exp is FTs move t2, zero # FSs fraction shifted is zero move t3, zero b 4f 1: - move t6, zero # FTs fraction shifted is zero - move t7, zero + move ta2, zero # FTs fraction shifted is zero + move ta3, zero b 4f 2: li t9, 32 bge v0, zero, 3f # if FS > FT, shift FTs frac - move t1, t5 # FT > FS, result exp is FTs + move t1, ta1 # FT > FS, result exp is FTs blt v1, t9, 1f # shift right by < 32? subu v1, v1, t9 subu t9, t9, v1 @@ -856,62 +856,62 @@ add_sub_d: blt v1, t9, 1f # shift right by < 32? subu v1, v1, t9 subu t9, t9, v1 - sll t8, t6, t9 # save bits shifted out - srl t7, t6, v1 # shift FTs fraction - move t6, zero + sll t8, ta2, t9 # save bits shifted out + srl ta3, ta2, v1 # shift FTs fraction + move ta2, zero b 4f 1: subu t9, t9, v1 - sll t8, t7, t9 # save bits shifted out - srl t7, t7, v1 # shift FTs fraction - sll t9, t6, t9 # save bits shifted out of t2 - or t7, t7, t9 # and put into t3 - srl t6, t6, v1 + sll t8, ta3, t9 # save bits shifted out + srl ta3, ta3, v1 # shift FTs fraction + sll t9, ta2, t9 # save bits shifted out of t2 + or ta3, ta3, t9 # and put into t3 + srl ta2, ta2, v1 4: - bne t0, t4, 1f # if signs differ, subtract - addu t3, t3, t7 # add fractions - sltu t9, t3, t7 # compute carry - addu t2, t2, t6 # add fractions + bne t0, ta0, 1f # if signs differ, subtract + addu t3, t3, ta3 # add fractions + sltu t9, t3, ta3 # compute carry + addu t2, t2, ta2 # add fractions addu t2, t2, t9 # add carry b norm_d 1: - blt t2, t6, 3f # subtract larger from smaller - bne t2, t6, 2f - bltu t3, t7, 3f - bne t3, t7, 2f # if same, result=0 + blt t2, ta2, 3f # subtract larger from smaller + bne t2, ta2, 2f + bltu t3, ta3, 3f + bne t3, ta3, 2f # if same, result=0 move t1, zero # result=0 move t2, zero move t3, zero and v0, a1, FPC_ROUNDING_BITS # get rounding mode bne v0, FPC_ROUND_RM, 1f # round to -infinity? - or t0, t0, t4 # compute result sign + or t0, t0, ta0 # compute result sign b result_fs_d 1: - and t0, t0, t4 # compute result sign + and t0, t0, ta0 # compute result sign b result_fs_d 2: - beq t8, zero, 1f # compute t2:t3:zero - t6:t7:t8 + beq t8, zero, 1f # compute t2:t3:zero - ta2:ta3:t8 subu t8, zero, t8 sltu v0, t3, 1 # compute barrow out subu t3, t3, 1 # subtract barrow subu t2, t2, v0 1: - sltu v0, t3, t7 - subu t3, t3, t7 # subtract fractions - subu t2, t2, t6 # subtract fractions + sltu v0, t3, ta3 + subu t3, t3, ta3 # subtract fractions + subu t2, t2, ta2 # subtract fractions subu t2, t2, v0 # subtract barrow b norm_d 3: - move t0, t4 # sign of result = FTs - beq t8, zero, 1f # compute t6:t7:zero - t2:t3:t8 + move t0, ta0 # sign of result = FTs + beq t8, zero, 1f # compute ta2:ta3:zero - t2:t3:t8 subu t8, zero, t8 - sltu v0, t7, 1 # compute barrow out - subu t7, t7, 1 # subtract barrow - subu t6, t6, v0 + sltu v0, ta3, 1 # compute barrow out + subu ta3, ta3, 1 # subtract barrow + subu ta2, ta2, v0 1: - sltu v0, t7, t3 - subu t3, t7, t3 # subtract fractions - subu t2, t6, t2 # subtract fractions + sltu v0, ta3, t3 + subu t3, ta3, t3 # subtract fractions + subu t2, ta2, t2 # subtract fractions subu t2, t2, v0 # subtract barrow b norm_d @@ -920,22 +920,22 @@ add_sub_d: */ mul_s: jal get_ft_fs_s - xor t0, t0, t4 # compute sign of result - move t4, t0 + xor t0, t0, ta0 # compute sign of result + move ta0, t0 bne t1, SEXP_INF, 2f # is FS an infinity? bne t2, zero, result_fs_s # if FS is a NAN, result=FS - bne t5, SEXP_INF, 1f # FS is inf, is FT an infinity? - bne t6, zero, result_ft_s # if FT is a NAN, result=FT + bne ta1, SEXP_INF, 1f # FS is inf, is FT an infinity? + bne ta2, zero, result_ft_s # if FT is a NAN, result=FT b result_fs_s # result is infinity 1: - bne t5, zero, result_fs_s # inf * zero? if no, result=FS - bne t6, zero, result_fs_s + bne ta1, zero, result_fs_s # inf * zero? if no, result=FS + bne ta2, zero, result_fs_s b invalid_s # infinity * zero is invalid 2: - bne t5, SEXP_INF, 1f # FS != inf, is FT an infinity? + bne ta1, SEXP_INF, 1f # FS != inf, is FT an infinity? bne t1, zero, result_ft_s # zero * inf? if no, result=FT bne t2, zero, result_ft_s - bne t6, zero, result_ft_s # if FT is a NAN, result=FT + bne ta2, zero, result_ft_s # if FT is a NAN, result=FT b invalid_s # zero * infinity is invalid 1: bne t1, zero, 1f # is FS zero? @@ -946,17 +946,17 @@ mul_s: subu t1, t1, SEXP_BIAS # unbias FS exponent or t2, t2, SIMPL_ONE # set implied one bit 2: - bne t5, zero, 1f # is FT zero? - beq t6, zero, result_ft_s # result is zero + bne ta1, zero, 1f # is FT zero? + beq ta2, zero, result_ft_s # result is zero jal renorm_ft_s b 2f 1: - subu t5, t5, SEXP_BIAS # unbias FT exponent - or t6, t6, SIMPL_ONE # set implied one bit + subu ta1, ta1, SEXP_BIAS # unbias FT exponent + or ta2, ta2, SIMPL_ONE # set implied one bit 2: - addu t1, t1, t5 # compute result exponent + addu t1, t1, ta1 # compute result exponent addu t1, t1, 9 # account for binary point - multu t2, t6 # multiply fractions + multu t2, ta2 # multiply fractions mflo t8 mfhi t2 b norm_s @@ -966,27 +966,27 @@ mul_s: */ mul_d: jal get_ft_fs_d - xor t0, t0, t4 # compute sign of result - move t4, t0 + xor t0, t0, ta0 # compute sign of result + move ta0, t0 bne t1, DEXP_INF, 2f # is FS an infinity? bne t2, zero, result_fs_d # if FS is a NAN, result=FS bne t3, zero, result_fs_d - bne t5, DEXP_INF, 1f # FS is inf, is FT an infinity? - bne t6, zero, result_ft_d # if FT is a NAN, result=FT - bne t7, zero, result_ft_d + bne ta1, DEXP_INF, 1f # FS is inf, is FT an infinity? + bne ta2, zero, result_ft_d # if FT is a NAN, result=FT + bne ta3, zero, result_ft_d b result_fs_d # result is infinity 1: - bne t5, zero, result_fs_d # inf * zero? if no, result=FS - bne t6, zero, result_fs_d - bne t7, zero, result_fs_d + bne ta1, zero, result_fs_d # inf * zero? if no, result=FS + bne ta2, zero, result_fs_d + bne ta3, zero, result_fs_d b invalid_d # infinity * zero is invalid 2: - bne t5, DEXP_INF, 1f # FS != inf, is FT an infinity? + bne ta1, DEXP_INF, 1f # FS != inf, is FT an infinity? bne t1, zero, result_ft_d # zero * inf? if no, result=FT bne t2, zero, result_ft_d # if FS is a NAN, result=FS bne t3, zero, result_ft_d - bne t6, zero, result_ft_d # if FT is a NAN, result=FT - bne t7, zero, result_ft_d + bne ta2, zero, result_ft_d # if FT is a NAN, result=FT + bne ta3, zero, result_ft_d b invalid_d # zero * infinity is invalid 1: bne t1, zero, 2f # is FS zero? @@ -999,37 +999,37 @@ mul_d: subu t1, t1, DEXP_BIAS # unbias FS exponent or t2, t2, DIMPL_ONE # set implied one bit 3: - bne t5, zero, 2f # is FT zero? - bne t6, zero, 1f - beq t7, zero, result_ft_d # result is zero + bne ta1, zero, 2f # is FT zero? + bne ta2, zero, 1f + beq ta3, zero, result_ft_d # result is zero 1: jal renorm_ft_d b 3f 2: - subu t5, t5, DEXP_BIAS # unbias FT exponent - or t6, t6, DIMPL_ONE # set implied one bit + subu ta1, ta1, DEXP_BIAS # unbias FT exponent + or ta2, ta2, DIMPL_ONE # set implied one bit 3: - addu t1, t1, t5 # compute result exponent + addu t1, t1, ta1 # compute result exponent addu t1, t1, 12 # ??? - multu t3, t7 # multiply fractions (low * low) - move t4, t2 # free up t2,t3 for result - move t5, t3 + multu t3, ta3 # multiply fractions (low * low) + move ta0, t2 # free up t2,t3 for result + move ta1, t3 mflo a3 # save low order bits mfhi t8 not v0, t8 - multu t4, t7 # multiply FS(high) * FT(low) + multu ta0, ta3 # multiply FS(high) * FT(low) mflo v1 mfhi t3 # init low result sltu v0, v0, v1 # compute carry addu t8, v1 - multu t5, t6 # multiply FS(low) * FT(high) + multu ta1, ta2 # multiply FS(low) * FT(high) addu t3, t3, v0 # add carry not v0, t8 mflo v1 mfhi t2 sltu v0, v0, v1 addu t8, v1 - multu t4, t6 # multiply FS(high) * FT(high) + multu ta0, ta2 # multiply FS(high) * FT(high) addu t3, v0 not v1, t3 sltu v1, v1, t2 @@ -1050,24 +1050,24 @@ mul_d: */ div_s: jal get_ft_fs_s - xor t0, t0, t4 # compute sign of result - move t4, t0 + xor t0, t0, ta0 # compute sign of result + move ta0, t0 bne t1, SEXP_INF, 1f # is FS an infinity? bne t2, zero, result_fs_s # if FS is NAN, result is FS - bne t5, SEXP_INF, result_fs_s # is FT an infinity? - bne t6, zero, result_ft_s # if FT is NAN, result is FT + bne ta1, SEXP_INF, result_fs_s # is FT an infinity? + bne ta2, zero, result_ft_s # if FT is NAN, result is FT b invalid_s # infinity/infinity is invalid 1: - bne t5, SEXP_INF, 1f # is FT an infinity? - bne t6, zero, result_ft_s # if FT is NAN, result is FT + bne ta1, SEXP_INF, 1f # is FT an infinity? + bne ta2, zero, result_ft_s # if FT is NAN, result is FT move t1, zero # x / infinity is zero move t2, zero b result_fs_s 1: bne t1, zero, 2f # is FS zero? bne t2, zero, 1f - bne t5, zero, result_fs_s # FS=zero, is FT zero? - beq t6, zero, invalid_s # 0 / 0 + bne ta1, zero, result_fs_s # FS=zero, is FT zero? + beq ta2, zero, invalid_s # 0 / 0 b result_fs_s # result = zero 1: jal renorm_fs_s @@ -1076,8 +1076,8 @@ div_s: subu t1, t1, SEXP_BIAS # unbias FS exponent or t2, t2, SIMPL_ONE # set implied one bit 3: - bne t5, zero, 2f # is FT zero? - bne t6, zero, 1f + bne ta1, zero, 2f # is FT zero? + bne ta2, zero, 1f or a1, a1, FPC_EXCEPTION_DIV0 | FPC_STICKY_DIV0 and v0, a1, FPC_ENABLE_DIV0 # trap enabled? bne v0, zero, fpe_trap @@ -1089,18 +1089,18 @@ div_s: jal renorm_ft_s b 3f 2: - subu t5, t5, SEXP_BIAS # unbias FT exponent - or t6, t6, SIMPL_ONE # set implied one bit + subu ta1, ta1, SEXP_BIAS # unbias FT exponent + or ta2, ta2, SIMPL_ONE # set implied one bit 3: - subu t1, t1, t5 # compute exponent + subu t1, t1, ta1 # compute exponent subu t1, t1, 3 # compensate for result position li v0, SFRAC_BITS+3 # number of bits to divide move t8, t2 # init dividend move t2, zero # init result 1: - bltu t8, t6, 3f # is dividend >= divisor? + bltu t8, ta2, 3f # is dividend >= divisor? 2: - subu t8, t8, t6 # subtract divisor from dividend + subu t8, t8, ta2 # subtract divisor from dividend or t2, t2, 1 # remember that we did bne t8, zero, 3f # if not done, continue sll t2, t2, v0 # shift result to final position @@ -1117,19 +1117,19 @@ div_s: */ div_d: jal get_ft_fs_d - xor t0, t0, t4 # compute sign of result - move t4, t0 + xor t0, t0, ta0 # compute sign of result + move ta0, t0 bne t1, DEXP_INF, 1f # is FS an infinity? bne t2, zero, result_fs_d # if FS is NAN, result is FS bne t3, zero, result_fs_d - bne t5, DEXP_INF, result_fs_d # is FT an infinity? - bne t6, zero, result_ft_d # if FT is NAN, result is FT - bne t7, zero, result_ft_d + bne ta1, DEXP_INF, result_fs_d # is FT an infinity? + bne ta2, zero, result_ft_d # if FT is NAN, result is FT + bne ta3, zero, result_ft_d b invalid_d # infinity/infinity is invalid 1: - bne t5, DEXP_INF, 1f # is FT an infinity? - bne t6, zero, result_ft_d # if FT is NAN, result is FT - bne t7, zero, result_ft_d + bne ta1, DEXP_INF, 1f # is FT an infinity? + bne ta2, zero, result_ft_d # if FT is NAN, result is FT + bne ta3, zero, result_ft_d move t1, zero # x / infinity is zero move t2, zero move t3, zero @@ -1138,9 +1138,9 @@ div_d: bne t1, zero, 2f # is FS zero? bne t2, zero, 1f bne t3, zero, 1f - bne t5, zero, result_fs_d # FS=zero, is FT zero? - bne t6, zero, result_fs_d - beq t7, zero, invalid_d # 0 / 0 + bne ta1, zero, result_fs_d # FS=zero, is FT zero? + bne ta2, zero, result_fs_d + beq ta3, zero, invalid_d # 0 / 0 b result_fs_d # result = zero 1: jal renorm_fs_d @@ -1149,9 +1149,9 @@ div_d: subu t1, t1, DEXP_BIAS # unbias FS exponent or t2, t2, DIMPL_ONE # set implied one bit 3: - bne t5, zero, 2f # is FT zero? - bne t6, zero, 1f - bne t7, zero, 1f + bne ta1, zero, 2f # is FT zero? + bne ta2, zero, 1f + bne ta3, zero, 1f or a1, a1, FPC_EXCEPTION_DIV0 | FPC_STICKY_DIV0 and v0, a1, FPC_ENABLE_DIV0 # trap enabled? bne v0, zero, fpe_trap @@ -1164,10 +1164,10 @@ div_d: jal renorm_ft_d b 3f 2: - subu t5, t5, DEXP_BIAS # unbias FT exponent - or t6, t6, DIMPL_ONE # set implied one bit + subu ta1, ta1, DEXP_BIAS # unbias FT exponent + or ta2, ta2, DIMPL_ONE # set implied one bit 3: - subu t1, t1, t5 # compute exponent + subu t1, t1, ta1 # compute exponent subu t1, t1, 3 # compensate for result position li v0, DFRAC_BITS+3 # number of bits to divide move t8, t2 # init dividend @@ -1175,13 +1175,13 @@ div_d: move t2, zero # init result move t3, zero 1: - bltu t8, t6, 3f # is dividend >= divisor? - bne t8, t6, 2f - bltu t9, t7, 3f + bltu t8, ta2, 3f # is dividend >= divisor? + bne t8, ta2, 2f + bltu t9, ta3, 3f 2: - sltu v1, t9, t7 # subtract divisor from dividend - subu t9, t9, t7 - subu t8, t8, t6 + sltu v1, t9, ta3 # subtract divisor from dividend + subu t9, t9, ta3 + subu t8, t8, ta2 subu t8, t8, v1 or t3, t3, 1 # remember that we did bne t8, zero, 3f # if not done, continue @@ -1576,23 +1576,23 @@ cmp_s: bne t1, SEXP_INF, 1f # is FS an infinity? bne t2, zero, unordered # FS is a NAN 1: - bne t5, SEXP_INF, 2f # is FT an infinity? - bne t6, zero, unordered # FT is a NAN + bne ta1, SEXP_INF, 2f # is FT an infinity? + bne ta2, zero, unordered # FT is a NAN 2: sll t1, t1, 23 # reassemble exp & frac or t1, t1, t2 - sll t5, t5, 23 # reassemble exp & frac - or t5, t5, t6 + sll ta1, ta1, 23 # reassemble exp & frac + or ta1, ta1, ta2 beq t0, zero, 1f # is FS positive? negu t1 1: - beq t4, zero, 1f # is FT positive? - negu t5 + beq ta0, zero, 1f # is FT positive? + negu ta1 1: li v0, COND_LESS - blt t1, t5, test_cond # is FS < FT? + blt t1, ta1, test_cond # is FS < FT? li v0, COND_EQUAL - beq t1, t5, test_cond # is FS == FT? + beq t1, ta1, test_cond # is FS == FT? move v0, zero # FS > FT b test_cond @@ -1605,14 +1605,14 @@ cmp_d: bne t2, zero, unordered bne t3, zero, unordered # FS is a NAN 1: - bne t5, DEXP_INF, 2f # is FT an infinity? - bne t6, zero, unordered - bne t7, zero, unordered # FT is a NAN + bne ta1, DEXP_INF, 2f # is FT an infinity? + bne ta2, zero, unordered + bne ta3, zero, unordered # FT is a NAN 2: sll t1, t1, 20 # reassemble exp & frac or t1, t1, t2 - sll t5, t5, 20 # reassemble exp & frac - or t5, t5, t6 + sll ta1, ta1, 20 # reassemble exp & frac + or ta1, ta1, ta2 beq t0, zero, 1f # is FS positive? not t3 # negate t1,t3 not t1 @@ -1620,21 +1620,21 @@ cmp_d: seq v0, t3, zero # compute carry addu t1, t1, v0 1: - beq t4, zero, 1f # is FT positive? - not t7 # negate t5,t7 - not t5 - addu t7, t7, 1 - seq v0, t7, zero # compute carry - addu t5, t5, v0 + beq ta0, zero, 1f # is FT positive? + not ta3 # negate ta1,ta3 + not ta1 + addu ta3, ta3, 1 + seq v0, ta3, zero # compute carry + addu ta1, ta1, v0 1: li v0, COND_LESS - blt t1, t5, test_cond # is FS(MSW) < FT(MSW)? + blt t1, ta1, test_cond # is FS(MSW) < FT(MSW)? move v0, zero - bne t1, t5, test_cond # is FS(MSW) > FT(MSW)? + bne t1, ta1, test_cond # is FS(MSW) > FT(MSW)? li v0, COND_LESS - bltu t3, t7, test_cond # is FS(LSW) < FT(LSW)? + bltu t3, ta3, test_cond # is FS(LSW) < FT(LSW)? li v0, COND_EQUAL - beq t3, t7, test_cond # is FS(LSW) == FT(LSW)? + beq t3, ta3, test_cond # is FS(LSW) == FT(LSW)? move v0, zero # FS > FT test_cond: and v0, v0, a0 # condition match instruction? @@ -1725,8 +1725,8 @@ norm_s: or t8, t8, v0 srl t2, t2, t9 norm_noshift_s: - move t5, t1 # save unrounded exponent - move t6, t2 # save unrounded fraction + move ta1, t1 # save unrounded exponent + move ta2, t2 # save unrounded fraction and v0, a1, FPC_ROUNDING_BITS # get rounding mode beq v0, FPC_ROUND_RN, 3f # round to nearest beq v0, FPC_ROUND_RZ, 5f # round to zero (truncate) @@ -1826,8 +1826,8 @@ underflow_s: * signal inexact result (if it is) and trap (if enabled). */ 1: - move t1, t5 # get unrounded exponent - move t2, t6 # get unrounded fraction + move t1, ta1 # get unrounded exponent + move t2, ta2 # get unrounded fraction li t9, SEXP_MIN # compute shift amount subu t9, t9, t1 # shift t2,t8 right by t9 blt t9, SFRAC_BITS+2, 3f # shift all the bits out? @@ -1841,7 +1841,7 @@ underflow_s: and v0, a1, FPC_ROUNDING_BITS # get rounding mode beq v0, FPC_ROUND_RN, inexact_nobias_s # round to nearest beq v0, FPC_ROUND_RZ, inexact_nobias_s # round to zero - beq v0, FPC_ROUND_RP, 1f # round to +infinity + beq v0, FPC_ROUND_RP, 1f # round to +infinity beq t0, zero, inexact_nobias_s # if sign is positive, truncate b 2f 1: @@ -1970,9 +1970,9 @@ norm_d: or t3, t3, v0 srl t2, t2, t9 norm_noshift_d: - move t5, t1 # save unrounded exponent - move t6, t2 # save unrounded fraction (MS) - move t7, t3 # save unrounded fraction (LS) + move ta1, t1 # save unrounded exponent + move ta2, t2 # save unrounded fraction (MS) + move ta3, t3 # save unrounded fraction (LS) and v0, a1, FPC_ROUNDING_BITS # get rounding mode beq v0, FPC_ROUND_RN, 3f # round to nearest beq v0, FPC_ROUND_RZ, 5f # round to zero (truncate) @@ -2078,9 +2078,9 @@ underflow_d: * signal inexact result (if it is) and trap (if enabled). */ 1: - move t1, t5 # get unrounded exponent - move t2, t6 # get unrounded fraction (MS) - move t3, t7 # get unrounded fraction (LS) + move t1, ta1 # get unrounded exponent + move t2, ta2 # get unrounded fraction (MS) + move t3, ta3 # get unrounded fraction (LS) li t9, DEXP_MIN # compute shift amount subu t9, t9, t1 # shift t2,t8 right by t9 blt t9, DFRAC_BITS+2, 3f # shift all the bits out? @@ -2095,7 +2095,7 @@ underflow_d: and v0, a1, FPC_ROUNDING_BITS # get rounding mode beq v0, FPC_ROUND_RN, inexact_nobias_d # round to nearest beq v0, FPC_ROUND_RZ, inexact_nobias_d # round to zero - beq v0, FPC_ROUND_RP, 1f # round to +infinity + beq v0, FPC_ROUND_RP, 1f # round to +infinity beq t0, zero, inexact_nobias_d # if sign is positive, truncate b 2f 1: @@ -2128,9 +2128,9 @@ underflow_d: */ 2: and v0, a1, FPC_ROUNDING_BITS # get rounding mode - beq v0, FPC_ROUND_RN, 3f # round to nearest - beq v0, FPC_ROUND_RZ, 5f # round to zero (truncate) - beq v0, FPC_ROUND_RP, 1f # round to +infinity + beq v0, FPC_ROUND_RN, 3f # round to nearest + beq v0, FPC_ROUND_RZ, 5f # round to zero (truncate) + beq v0, FPC_ROUND_RP, 1f # round to +infinity beq t0, zero, 5f # if sign is positive, truncate b 2f 1: @@ -2227,9 +2227,9 @@ ill: break 0 result_ft_s: - move t0, t4 # result is FT - move t1, t5 - move t2, t6 + move t0, ta0 # result is FT + move t1, ta1 + move t2, ta2 result_fs_s: # result is FS jal set_fd_s # save result (in t0,t1,t2) b done @@ -2239,10 +2239,10 @@ result_fs_w: b done result_ft_d: - move t0, t4 # result is FT - move t1, t5 - move t2, t6 - move t3, t7 + move t0, ta0 # result is FT + move t1, ta1 + move t2, ta2 + move t3, ta3 result_fs_d: # result is FS jal set_fd_d # save result (in t0,t1,t2,t3) @@ -2356,9 +2356,9 @@ END(get_fs_int) * t0 contains the FS sign * t1 contains the FS (biased) exponent * t2 contains the FS fraction - * t4 contains the FT sign - * t5 contains the FT (biased) exponent - * t6 contains the FT fraction + * ta0 contains the FT sign + * ta1 contains the FT (biased) exponent + * ta2 contains the FT fraction * *---------------------------------------------------------------------------- */ @@ -2389,59 +2389,59 @@ get_ft_s_tbl: .text get_ft_s_f0: - mfc1 t4, $f0 + mfc1 ta0, $f0 b get_ft_s_done get_ft_s_f2: - mfc1 t4, $f2 + mfc1 ta0, $f2 b get_ft_s_done get_ft_s_f4: - mfc1 t4, $f4 + mfc1 ta0, $f4 b get_ft_s_done get_ft_s_f6: - mfc1 t4, $f6 + mfc1 ta0, $f6 b get_ft_s_done get_ft_s_f8: - mfc1 t4, $f8 + mfc1 ta0, $f8 b get_ft_s_done get_ft_s_f10: - mfc1 t4, $f10 + mfc1 ta0, $f10 b get_ft_s_done get_ft_s_f12: - mfc1 t4, $f12 + mfc1 ta0, $f12 b get_ft_s_done get_ft_s_f14: - mfc1 t4, $f14 + mfc1 ta0, $f14 b get_ft_s_done get_ft_s_f16: - mfc1 t4, $f16 + mfc1 ta0, $f16 b get_ft_s_done get_ft_s_f18: - mfc1 t4, $f18 + mfc1 ta0, $f18 b get_ft_s_done get_ft_s_f20: - mfc1 t4, $f20 + mfc1 ta0, $f20 b get_ft_s_done get_ft_s_f22: - mfc1 t4, $f22 + mfc1 ta0, $f22 b get_ft_s_done get_ft_s_f24: - mfc1 t4, $f24 + mfc1 ta0, $f24 b get_ft_s_done get_ft_s_f26: - mfc1 t4, $f26 + mfc1 ta0, $f26 b get_ft_s_done get_ft_s_f28: - mfc1 t4, $f28 + mfc1 ta0, $f28 b get_ft_s_done get_ft_s_f30: - mfc1 t4, $f30 + mfc1 ta0, $f30 get_ft_s_done: - srl t5, t4, 23 # get exponent - and t5, t5, 0xFF - and t6, t4, 0x7FFFFF # get fraction - srl t4, t4, 31 # get sign - bne t5, SEXP_INF, 1f # is it a signaling NAN? - and v0, t6, SSIGNAL_NAN + srl ta1, ta0, 23 # get exponent + and ta1, ta1, 0xFF + and ta2, ta0, 0x7FFFFF # get fraction + srl ta0, ta0, 31 # get sign + bne ta1, SEXP_INF, 1f # is it a signaling NAN? + and v0, ta2, SSIGNAL_NAN bne v0, zero, invalid_s 1: /* fall through to get FS */ @@ -2557,10 +2557,10 @@ END(get_ft_fs_s) * t1 contains the FS (biased) exponent * t2 contains the FS fraction * t3 contains the FS remaining fraction - * t4 contains the FT sign - * t5 contains the FT (biased) exponent - * t6 contains the FT fraction - * t7 contains the FT remaining fraction + * ta0 contains the FT sign + * ta1 contains the FT (biased) exponent + * ta2 contains the FT fraction + * ta3 contains the FT remaining fraction * *---------------------------------------------------------------------------- */ @@ -2591,75 +2591,75 @@ get_ft_d_tbl: .text get_ft_d_f0: - mfc1 t7, $f0 - mfc1 t4, $f1 + mfc1 ta3, $f0 + mfc1 ta0, $f1 b get_ft_d_done get_ft_d_f2: - mfc1 t7, $f2 - mfc1 t4, $f3 + mfc1 ta3, $f2 + mfc1 ta0, $f3 b get_ft_d_done get_ft_d_f4: - mfc1 t7, $f4 - mfc1 t4, $f5 + mfc1 ta3, $f4 + mfc1 ta0, $f5 b get_ft_d_done get_ft_d_f6: - mfc1 t7, $f6 - mfc1 t4, $f7 + mfc1 ta3, $f6 + mfc1 ta0, $f7 b get_ft_d_done get_ft_d_f8: - mfc1 t7, $f8 - mfc1 t4, $f9 + mfc1 ta3, $f8 + mfc1 ta0, $f9 b get_ft_d_done get_ft_d_f10: - mfc1 t7, $f10 - mfc1 t4, $f11 + mfc1 ta3, $f10 + mfc1 ta0, $f11 b get_ft_d_done get_ft_d_f12: - mfc1 t7, $f12 - mfc1 t4, $f13 + mfc1 ta3, $f12 + mfc1 ta0, $f13 b get_ft_d_done get_ft_d_f14: - mfc1 t7, $f14 - mfc1 t4, $f15 + mfc1 ta3, $f14 + mfc1 ta0, $f15 b get_ft_d_done get_ft_d_f16: - mfc1 t7, $f16 - mfc1 t4, $f17 + mfc1 ta3, $f16 + mfc1 ta0, $f17 b get_ft_d_done get_ft_d_f18: - mfc1 t7, $f18 - mfc1 t4, $f19 + mfc1 ta3, $f18 + mfc1 ta0, $f19 b get_ft_d_done get_ft_d_f20: - mfc1 t7, $f20 - mfc1 t4, $f21 + mfc1 ta3, $f20 + mfc1 ta0, $f21 b get_ft_d_done get_ft_d_f22: - mfc1 t7, $f22 - mfc1 t4, $f23 + mfc1 ta3, $f22 + mfc1 ta0, $f23 b get_ft_d_done get_ft_d_f24: - mfc1 t7, $f24 - mfc1 t4, $f25 + mfc1 ta3, $f24 + mfc1 ta0, $f25 b get_ft_d_done get_ft_d_f26: - mfc1 t7, $f26 - mfc1 t4, $f27 + mfc1 ta3, $f26 + mfc1 ta0, $f27 b get_ft_d_done get_ft_d_f28: - mfc1 t7, $f28 - mfc1 t4, $f29 + mfc1 ta3, $f28 + mfc1 ta0, $f29 b get_ft_d_done get_ft_d_f30: - mfc1 t7, $f30 - mfc1 t4, $f31 + mfc1 ta3, $f30 + mfc1 ta0, $f31 get_ft_d_done: - srl t5, t4, 20 # get exponent - and t5, t5, 0x7FF - and t6, t4, 0xFFFFF # get fraction - srl t4, t4, 31 # get sign - bne t5, DEXP_INF, 1f # is it a signaling NAN? - and v0, t6, DSIGNAL_NAN + srl ta1, ta0, 20 # get exponent + and ta1, ta1, 0x7FF + and ta2, ta0, 0xFFFFF # get fraction + srl ta0, ta0, 31 # get sign + bne ta1, DEXP_INF, 1f # is it a signaling NAN? + and v0, ta2, DSIGNAL_NAN bne v0, zero, invalid_d 1: /* fall through to get FS */ @@ -2791,9 +2791,9 @@ END(get_ft_fs_d) * t0 contains the sign * t1 contains the (biased) exponent * t2 contains the fraction - * t4 contains the sign - * t5 contains the (biased) exponent - * t6 contains the fraction + * ta0 contains the sign + * ta1 contains the (biased) exponent + * ta2 contains the fraction * *---------------------------------------------------------------------------- */ @@ -2902,57 +2902,57 @@ cmp_ft_s_tbl: .text cmp_ft_s_f0: - mfc1 t4, $f0 + mfc1 ta0, $f0 b cmp_ft_s_done cmp_ft_s_f2: - mfc1 t4, $f2 + mfc1 ta0, $f2 b cmp_ft_s_done cmp_ft_s_f4: - mfc1 t4, $f4 + mfc1 ta0, $f4 b cmp_ft_s_done cmp_ft_s_f6: - mfc1 t4, $f6 + mfc1 ta0, $f6 b cmp_ft_s_done cmp_ft_s_f8: - mfc1 t4, $f8 + mfc1 ta0, $f8 b cmp_ft_s_done cmp_ft_s_f10: - mfc1 t4, $f10 + mfc1 ta0, $f10 b cmp_ft_s_done cmp_ft_s_f12: - mfc1 t4, $f12 + mfc1 ta0, $f12 b cmp_ft_s_done cmp_ft_s_f14: - mfc1 t4, $f14 + mfc1 ta0, $f14 b cmp_ft_s_done cmp_ft_s_f16: - mfc1 t4, $f16 + mfc1 ta0, $f16 b cmp_ft_s_done cmp_ft_s_f18: - mfc1 t4, $f18 + mfc1 ta0, $f18 b cmp_ft_s_done cmp_ft_s_f20: - mfc1 t4, $f20 + mfc1 ta0, $f20 b cmp_ft_s_done cmp_ft_s_f22: - mfc1 t4, $f22 + mfc1 ta0, $f22 b cmp_ft_s_done cmp_ft_s_f24: - mfc1 t4, $f24 + mfc1 ta0, $f24 b cmp_ft_s_done cmp_ft_s_f26: - mfc1 t4, $f26 + mfc1 ta0, $f26 b cmp_ft_s_done cmp_ft_s_f28: - mfc1 t4, $f28 + mfc1 ta0, $f28 b cmp_ft_s_done cmp_ft_s_f30: - mfc1 t4, $f30 + mfc1 ta0, $f30 cmp_ft_s_done: - srl t5, t4, 23 # get exponent - and t5, t5, 0xFF - and t6, t4, 0x7FFFFF # get fraction - srl t4, t4, 31 # get sign + srl ta1, ta0, 23 # get exponent + and ta1, ta1, 0xFF + and ta2, ta0, 0x7FFFFF # get fraction + srl ta0, ta0, 31 # get sign j ra END(get_cmp_s) @@ -2968,10 +2968,10 @@ END(get_cmp_s) * t1 contains the (biased) exponent * t2 contains the fraction * t3 contains the remaining fraction - * t4 contains the sign - * t5 contains the (biased) exponent - * t6 contains the fraction - * t7 contains the remaining fraction + * ta0 contains the sign + * ta1 contains the (biased) exponent + * ta2 contains the fraction + * ta3 contains the remaining fraction * *---------------------------------------------------------------------------- */ @@ -3096,73 +3096,73 @@ cmp_ft_d_tbl: .text cmp_ft_d_f0: - mfc1 t7, $f0 - mfc1 t4, $f1 + mfc1 ta3, $f0 + mfc1 ta0, $f1 b cmp_ft_d_done cmp_ft_d_f2: - mfc1 t7, $f2 - mfc1 t4, $f3 + mfc1 ta3, $f2 + mfc1 ta0, $f3 b cmp_ft_d_done cmp_ft_d_f4: - mfc1 t7, $f4 - mfc1 t4, $f5 + mfc1 ta3, $f4 + mfc1 ta0, $f5 b cmp_ft_d_done cmp_ft_d_f6: - mfc1 t7, $f6 - mfc1 t4, $f7 + mfc1 ta3, $f6 + mfc1 ta0, $f7 b cmp_ft_d_done cmp_ft_d_f8: - mfc1 t7, $f8 - mfc1 t4, $f9 + mfc1 ta3, $f8 + mfc1 ta0, $f9 b cmp_ft_d_done cmp_ft_d_f10: - mfc1 t7, $f10 - mfc1 t4, $f11 + mfc1 ta3, $f10 + mfc1 ta0, $f11 b cmp_ft_d_done cmp_ft_d_f12: - mfc1 t7, $f12 - mfc1 t4, $f13 + mfc1 ta3, $f12 + mfc1 ta0, $f13 b cmp_ft_d_done cmp_ft_d_f14: - mfc1 t7, $f14 - mfc1 t4, $f15 + mfc1 ta3, $f14 + mfc1 ta0, $f15 b cmp_ft_d_done cmp_ft_d_f16: - mfc1 t7, $f16 - mfc1 t4, $f17 + mfc1 ta3, $f16 + mfc1 ta0, $f17 b cmp_ft_d_done cmp_ft_d_f18: - mfc1 t7, $f18 - mfc1 t4, $f19 + mfc1 ta3, $f18 + mfc1 ta0, $f19 b cmp_ft_d_done cmp_ft_d_f20: - mfc1 t7, $f20 - mfc1 t4, $f21 + mfc1 ta3, $f20 + mfc1 ta0, $f21 b cmp_ft_d_done cmp_ft_d_f22: - mfc1 t7, $f22 - mfc1 t4, $f23 + mfc1 ta3, $f22 + mfc1 ta0, $f23 b cmp_ft_d_done cmp_ft_d_f24: - mfc1 t7, $f24 - mfc1 t4, $f25 + mfc1 ta3, $f24 + mfc1 ta0, $f25 b cmp_ft_d_done cmp_ft_d_f26: - mfc1 t7, $f26 - mfc1 t4, $f27 + mfc1 ta3, $f26 + mfc1 ta0, $f27 b cmp_ft_d_done cmp_ft_d_f28: - mfc1 t7, $f28 - mfc1 t4, $f29 + mfc1 ta3, $f28 + mfc1 ta0, $f29 b cmp_ft_d_done cmp_ft_d_f30: - mfc1 t7, $f30 - mfc1 t4, $f31 + mfc1 ta3, $f30 + mfc1 ta0, $f31 cmp_ft_d_done: - srl t5, t4, 20 # get exponent - and t5, t5, 0x7FF - and t6, t4, 0xFFFFF # get fraction - srl t4, t4, 31 # get sign + srl ta1, ta0, 20 # get exponent + and ta1, ta1, 0x7FF + and ta2, ta0, 0xFFFFF # get fraction + srl ta0, ta0, 31 # get sign j ra END(get_cmp_d) @@ -3498,16 +3498,16 @@ END(renorm_fs_d) * renorm_ft_s -- * * Results: - * t5 unbiased exponent - * t6 normalized fraction + * ta1 unbiased exponent + * ta2 normalized fraction * *---------------------------------------------------------------------------- */ LEAF(renorm_ft_s) /* - * Find out how many leading zero bits are in t6 and put in t9. + * Find out how many leading zero bits are in ta2 and put in t9. */ - move v0, t6 + move v0, ta2 move t9, zero srl v1, v0, 16 bne v1, zero, 1f @@ -3533,13 +3533,13 @@ LEAF(renorm_ft_s) bne v1, zero, 1f addu t9, 1 /* - * Now shift t6 the correct number of bits. + * Now shift ta2 the correct number of bits. */ 1: subu t9, t9, SLEAD_ZEROS # dont count normal leading zeros - li t5, SEXP_MIN - subu t5, t5, t9 # adjust exponent - sll t6, t6, t9 + li ta1, SEXP_MIN + subu ta1, ta1, t9 # adjust exponent + sll ta2, ta2, t9 j ra END(renorm_ft_s) @@ -3547,19 +3547,19 @@ END(renorm_ft_s) * renorm_ft_d -- * * Results: - * t5 unbiased exponent - * t6,t7 normalized fraction + * ta1 unbiased exponent + * ta2,ta3 normalized fraction * *---------------------------------------------------------------------------- */ LEAF(renorm_ft_d) /* - * Find out how many leading zero bits are in t6,t7 and put in t9. + * Find out how many leading zero bits are in ta2,ta3 and put in t9. */ - move v0, t6 + move v0, ta2 move t9, zero - bne t6, zero, 1f - move v0, t7 + bne ta2, zero, 1f + move v0, ta3 addu t9, 32 1: srl v1, v0, 16 @@ -3586,23 +3586,23 @@ LEAF(renorm_ft_d) bne v1, zero, 1f addu t9, 1 /* - * Now shift t6,t7 the correct number of bits. + * Now shift ta2,ta3 the correct number of bits. */ 1: subu t9, t9, DLEAD_ZEROS # dont count normal leading zeros - li t5, DEXP_MIN - subu t5, t5, t9 # adjust exponent + li ta1, DEXP_MIN + subu ta1, ta1, t9 # adjust exponent li v0, 32 blt t9, v0, 1f subu t9, t9, v0 # shift fraction left >= 32 bits - sll t6, t7, t9 - move t7, zero + sll ta2, ta3, t9 + move ta3, zero j ra 1: subu v0, v0, t9 # shift fraction left < 32 bits - sll t6, t6, t9 - srl v1, t7, v0 - or t6, t6, v1 - sll t7, t7, t9 + sll ta2, ta2, t9 + srl v1, ta3, v0 + or ta2, ta2, v1 + sll ta3, ta3, t9 j ra END(renorm_ft_d) diff --git a/sys/mips/mips/gdb_machdep.c b/sys/mips/mips/gdb_machdep.c index ae77e6bc6067..0f5b5ed2a206 100644 --- a/sys/mips/mips/gdb_machdep.c +++ b/sys/mips/mips/gdb_machdep.c @@ -126,17 +126,17 @@ gdb_cpu_getreg(int regnum, size_t *regsz) } } switch (regnum) { - case 16: return (&kdb_thrctx->pcb_context.val[0]); - case 17: return (&kdb_thrctx->pcb_context.val[1]); - case 18: return (&kdb_thrctx->pcb_context.val[2]); - case 19: return (&kdb_thrctx->pcb_context.val[3]); - case 20: return (&kdb_thrctx->pcb_context.val[4]); - case 21: return (&kdb_thrctx->pcb_context.val[5]); - case 22: return (&kdb_thrctx->pcb_context.val[6]); - case 23: return (&kdb_thrctx->pcb_context.val[7]); - case 29: return (&kdb_thrctx->pcb_context.val[8]); - case 30: return (&kdb_thrctx->pcb_context.val[9]); - case 31: return (&kdb_thrctx->pcb_context.val[10]); + case 16: return (&kdb_thrctx->pcb_context[0]); + case 17: return (&kdb_thrctx->pcb_context[1]); + case 18: return (&kdb_thrctx->pcb_context[2]); + case 19: return (&kdb_thrctx->pcb_context[3]); + case 20: return (&kdb_thrctx->pcb_context[4]); + case 21: return (&kdb_thrctx->pcb_context[5]); + case 22: return (&kdb_thrctx->pcb_context[6]); + case 23: return (&kdb_thrctx->pcb_context[7]); + case 29: return (&kdb_thrctx->pcb_context[8]); + case 30: return (&kdb_thrctx->pcb_context[9]); + case 31: return (&kdb_thrctx->pcb_context[10]); } return (NULL); } @@ -146,7 +146,7 @@ gdb_cpu_setreg(int regnum, void *val) { switch (regnum) { case GDB_REG_PC: - kdb_thrctx->pcb_context.val[10] = *(register_t *)val; + kdb_thrctx->pcb_context[10] = *(register_t *)val; if (kdb_thread == PCPU_GET(curthread)) kdb_frame->pc = *(register_t *)val; } diff --git a/sys/mips/mips/genassym.c b/sys/mips/mips/genassym.c index 90974c7bcff5..62da8f1f5019 100644 --- a/sys/mips/mips/genassym.c +++ b/sys/mips/mips/genassym.c @@ -69,6 +69,7 @@ ASSYM(TD_REALKSTACK, offsetof(struct thread, td_md.md_realstack)); ASSYM(TD_FLAGS, offsetof(struct thread, td_flags)); ASSYM(TD_LOCK, offsetof(struct thread, td_lock)); ASSYM(TD_FRAME, offsetof(struct thread, td_frame)); +ASSYM(TD_TLS, offsetof(struct thread, td_md.md_tls)); ASSYM(TF_REG_SR, offsetof(struct trapframe, sr)); @@ -81,7 +82,6 @@ ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb)); ASSYM(PC_SEGBASE, offsetof(struct pcpu, pc_segbase)); ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread)); ASSYM(PC_FPCURTHREAD, offsetof(struct pcpu, pc_fpcurthread)); -ASSYM(PC_BOOT_STACK, offsetof(struct pcpu, pc_boot_stack)); ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid)); ASSYM(PC_CURPMAP, offsetof(struct pcpu, pc_curpmap)); @@ -90,6 +90,7 @@ ASSYM(VM_MAXUSER_ADDRESS, VM_MAXUSER_ADDRESS); ASSYM(VM_KERNEL_ALLOC_OFFSET, VM_KERNEL_ALLOC_OFFSET); ASSYM(SIGF_UC, offsetof(struct sigframe, sf_uc)); ASSYM(SIGFPE, SIGFPE); +ASSYM(PAGE_SHIFT, PAGE_SHIFT); ASSYM(PGSHIFT, PGSHIFT); ASSYM(NBPG, NBPG); ASSYM(SEGSHIFT, SEGSHIFT); @@ -97,3 +98,4 @@ ASSYM(NPTEPG, NPTEPG); ASSYM(TDF_NEEDRESCHED, TDF_NEEDRESCHED); ASSYM(TDF_ASTPENDING, TDF_ASTPENDING); ASSYM(PCPU_SIZE, sizeof(struct pcpu)); +ASSYM(MAXCOMLEN, MAXCOMLEN); diff --git a/sys/mips/mips/in_cksum.c b/sys/mips/mips/in_cksum.c index f0c95d9064b9..31bcd3ebdd0a 100644 --- a/sys/mips/mips/in_cksum.c +++ b/sys/mips/mips/in_cksum.c @@ -226,7 +226,7 @@ skip_start: if (len < mlen) mlen = len; - if ((clen ^ (int) addr) & 1) + if ((clen ^ (uintptr_t) addr) & 1) sum += in_cksumdata(addr, mlen) << 8; else sum += in_cksumdata(addr, mlen); diff --git a/sys/mips/mips/inckern.S b/sys/mips/mips/inckern.S new file mode 100644 index 000000000000..8610196d2046 --- /dev/null +++ b/sys/mips/mips/inckern.S @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2005 Olivier Houchard. 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 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 "opt_kernname.h" + +#include +__FBSDID("$FreeBSD$") +.section ".real_kernel","aw" +.globl kernel_start; +kernel_start: +.incbin KERNNAME +.globl kernel_end; +kernel_end: diff --git a/sys/mips/mips/intr_machdep.c b/sys/mips/mips/intr_machdep.c index cca27ba46f4b..2dc302ad1eb9 100644 --- a/sys/mips/mips/intr_machdep.c +++ b/sys/mips/mips/intr_machdep.c @@ -46,23 +46,102 @@ __FBSDID("$FreeBSD$"); static struct intr_event *hardintr_events[NHARD_IRQS]; static struct intr_event *softintr_events[NSOFT_IRQS]; +static mips_intrcnt_t mips_intr_counters[NSOFT_IRQS + NHARD_IRQS]; -#ifdef notyet -static int intrcnt_tab[NHARD_IRQS + NSOFT_IRQS]; -static int intrcnt_index = 0; -static int last_printed = 0; -#endif +static int intrcnt_index; -void -mips_mask_irq(void) +static cpu_intr_mask_t hardintr_mask_func; +static cpu_intr_unmask_t hardintr_unmask_func; + +mips_intrcnt_t +mips_intrcnt_create(const char* name) { + mips_intrcnt_t counter = &intrcnt[intrcnt_index++]; + mips_intrcnt_setname(counter, name); + return counter; } void -mips_unmask_irq(void) +mips_intrcnt_setname(mips_intrcnt_t counter, const char *name) +{ + int idx = counter - intrcnt; + + KASSERT(counter != NULL, ("mips_intrcnt_setname: NULL counter")); + + snprintf(intrnames + (MAXCOMLEN + 1) * idx, + MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name); +} + +static void +mips_mask_hard_irq(void *source) +{ + uintptr_t irq = (uintptr_t)source; + + mips_wr_status(mips_rd_status() & ~(((1 << irq) << 8) << 2)); +} + +static void +mips_unmask_hard_irq(void *source) +{ + uintptr_t irq = (uintptr_t)source; + + mips_wr_status(mips_rd_status() | (((1 << irq) << 8) << 2)); +} + +static void +mips_mask_soft_irq(void *source) +{ + uintptr_t irq = (uintptr_t)source; + + mips_wr_status(mips_rd_status() & ~((1 << irq) << 8)); +} + +static void +mips_unmask_soft_irq(void *source) +{ + uintptr_t irq = (uintptr_t)source; + + mips_wr_status(mips_rd_status() | ((1 << irq) << 8)); +} + +/* + * Perform initialization of interrupts prior to setting + * handlings + */ +void +cpu_init_interrupts() +{ + int i; + char name[MAXCOMLEN + 1]; + + /* + * Initialize all available vectors so spare IRQ + * would show up in systat output + */ + for (i = 0; i < NSOFT_IRQS; i++) { + snprintf(name, MAXCOMLEN + 1, "sint%d:", i); + mips_intr_counters[i] = mips_intrcnt_create(name); + } + + for (i = 0; i < NHARD_IRQS; i++) { + snprintf(name, MAXCOMLEN + 1, "int%d:", i); + mips_intr_counters[NSOFT_IRQS + i] = mips_intrcnt_create(name); + } +} + +void +cpu_set_hardintr_mask_func(cpu_intr_mask_t func) { + hardintr_mask_func = func; +} + +void +cpu_set_hardintr_unmask_func(cpu_intr_unmask_t func) +{ + + hardintr_unmask_func = func; } void @@ -72,36 +151,34 @@ cpu_establish_hardintr(const char *name, driver_filter_t *filt, struct intr_event *event; int error; - printf("Establish HARD IRQ %d: filt %p handler %p arg %p\n", - irq, filt, handler, arg); /* * We have 6 levels, but thats 0 - 5 (not including 6) */ if (irq < 0 || irq >= NHARD_IRQS) panic("%s called for unknown hard intr %d", __func__, irq); + if (hardintr_mask_func == NULL) + hardintr_mask_func = mips_mask_hard_irq; + + if (hardintr_unmask_func == NULL) + hardintr_unmask_func = mips_unmask_hard_irq; + event = hardintr_events[irq]; if (event == NULL) { - error = intr_event_create(&event, (void *)irq, 0, irq, - (mask_fn)mips_mask_irq, (mask_fn)mips_unmask_irq, - NULL, NULL, "hard intr%d:", irq); + error = intr_event_create(&event, (void *)(uintptr_t)irq, 0, + irq, hardintr_mask_func, hardintr_unmask_func, + NULL, NULL, "int%d", irq); if (error) return; hardintr_events[irq] = event; -#ifdef notyet - last_printed += snprintf(intrnames + last_printed, - MAXCOMLEN + 1, "hard irq%d: %s", irq, name); - last_printed++; - intrcnt_tab[irq] = intrcnt_index; - intrcnt_index++; -#endif - + mips_unmask_hard_irq((void*)(uintptr_t)irq); } intr_event_add_handler(event, name, filt, handler, arg, intr_priority(flags), flags, cookiep); - mips_wr_status(mips_rd_status() | (((1 << irq) << 8) << 2)); + mips_intrcnt_setname(mips_intr_counters[NSOFT_IRQS + irq], + event->ie_fullname); } void @@ -112,40 +189,48 @@ cpu_establish_softintr(const char *name, driver_filter_t *filt, struct intr_event *event; int error; +#if 0 printf("Establish SOFT IRQ %d: filt %p handler %p arg %p\n", irq, filt, handler, arg); +#endif if (irq < 0 || irq > NSOFT_IRQS) panic("%s called for unknown hard intr %d", __func__, irq); event = softintr_events[irq]; if (event == NULL) { - error = intr_event_create(&event, (void *)irq, 0, irq, - (mask_fn)mips_mask_irq, (mask_fn)mips_unmask_irq, - NULL, NULL, "intr%d:", irq); + error = intr_event_create(&event, (void *)(uintptr_t)irq, 0, + irq, mips_mask_soft_irq, mips_unmask_soft_irq, + NULL, NULL, "sint%d:", irq); if (error) return; softintr_events[irq] = event; + mips_unmask_soft_irq((void*)(uintptr_t)irq); } intr_event_add_handler(event, name, filt, handler, arg, intr_priority(flags), flags, cookiep); - mips_wr_status(mips_rd_status() | (((1<< irq) << 8))); + mips_intrcnt_setname(mips_intr_counters[irq], event->ie_fullname); } void cpu_intr(struct trapframe *tf) { struct intr_event *event; - register_t cause; + register_t cause, status; int hard, i, intr; critical_enter(); cause = mips_rd_cause(); + status = mips_rd_status(); intr = (cause & MIPS_INT_MASK) >> 8; - cause &= ~MIPS_INT_MASK; - mips_wr_cause(cause); + /* + * Do not handle masked interrupts. They were masked by + * pre_ithread function (mips_mask_XXX_intr) and will be + * unmasked once ithread is through with handler + */ + intr &= (status & MIPS_INT_MASK) >> 8; while ((i = fls(intr)) != 0) { intr &= ~(1 << (i - 1)); switch (i) { @@ -154,6 +239,7 @@ cpu_intr(struct trapframe *tf) i--; /* Get a 0-offset interrupt. */ hard = 0; event = softintr_events[i]; + mips_intrcnt_inc(mips_intr_counters[i]); break; default: /* Hardware interrupt. */ @@ -161,6 +247,7 @@ cpu_intr(struct trapframe *tf) i--; /* Get a 0-offset interrupt. */ hard = 1; event = hardintr_events[i]; + mips_intrcnt_inc(mips_intr_counters[NSOFT_IRQS + i]); break; } diff --git a/sys/mips/mips/locore.S b/sys/mips/mips/locore.S index afcabd41db7b..1365e8ea8c06 100644 --- a/sys/mips/mips/locore.S +++ b/sys/mips/mips/locore.S @@ -77,24 +77,9 @@ GLOBAL(fenvp) .space 4 # Assumes mips32? Is that OK? #endif -#ifdef CFE /* Assumes MIPS32, bad? */ -GLOBAL(cfe_handle) - .space 4 -GLOBAL(cfe_vector) - .space 4 -#endif -#if defined(TARGET_OCTEON) -GLOBAL(app_descriptor_addr) - .space 8 -#endif -GLOBAL(stackspace) - .space NBPG /* Smaller than it should be since it's temp. */ - .align 8 -GLOBAL(topstack) - .set noreorder - + .text GLOBAL(btext) @@ -114,6 +99,12 @@ VECTOR(_locore, unknown) /* Reset these bits */ li t0, ~(MIPS_SR_DE | MIPS_SR_SOFT_RESET | MIPS_SR_ERL | MIPS_SR_EXL | MIPS_SR_INT_IE) +#elif defined (CPU_XLR) + /* Set these bits */ + li t1, (MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT | MIPS_SR_KX) + + /* Reset these bits */ + li t0, ~(MIPS_SR_BEV | MIPS_SR_SOFT_RESET | MIPS_SR_INT_IE) #else /* * t0: Bits to preserve if set: @@ -137,6 +128,7 @@ VECTOR(_locore, unknown) or t2, t1 mtc0 t2, COP_0_STATUS_REG COP0_SYNC + /* Make sure KSEG0 is cached */ li t0, CFG_K0_CACHED mtc0 t0, MIPS_COP_0_CONFIG @@ -145,7 +137,7 @@ VECTOR(_locore, unknown) /* Read and store the PrID FPU ID for CPU identification, if any. */ mfc0 t2, COP_0_STATUS_REG mfc0 t0, MIPS_COP_0_PRID -#ifndef CPU_NOFPU +#ifdef CPU_HAVEFPU and t2, MIPS_SR_COP_1_BIT beqz t2, 1f move t1, zero @@ -161,13 +153,6 @@ VECTOR(_locore, unknown) sw t0, _C_LABEL(cpu_id) sw t1, _C_LABEL(fpu_id) -/* - * Initialize stack and call machine startup. - */ - la sp, _C_LABEL(topstack) - START_FRAME - la gp, _C_LABEL(_gp) - sw zero, START_FRAME - 4(sp) # Zero out old ra for debugger - /*xxximp * now that we pass a0...a3 to the platform_init routine, do we need * to stash this stuff here? @@ -176,75 +161,23 @@ VECTOR(_locore, unknown) /* Save YAMON boot environment pointer */ sw a2, _C_LABEL(fenvp) #endif -#ifdef CFE - /* - * Save the CFE context passed to us by the loader. - */ - li t1, 0x43464531 - bne a3, t1, no_cfe /* Check for "CFE1" signature */ - sw a0, _C_LABEL(cfe_handle)/* Firmware data segment */ - sw a2, _C_LABEL(cfe_vector)/* Firmware entry vector */ -no_cfe: -#endif -#if defined(TARGET_OCTEON) - la a0, app_descriptor_addr - sw a3, 0(a0) /* Store app descriptor ptr */ -#endif /* - * The following needs to be done differently for each platform and - * there needs to be a good way to plug this in. + * Initialize stack and call machine startup. */ -#if defined(SMP) && defined(CPU_XLR) -/* - * Block all the slave CPUs - */ - /* - * Read the cpu id from the cp0 config register - * cpuid[9:4], thrid[3: 0] - */ - mfc0 a0, COP_0_CONFIG, 7 - srl a1, a0, 4 - andi a1, a1, 0x3f - andi a0, a0, 0xf + PTR_LA sp, _C_LABEL(pcpu_space) + addiu sp, (NBPG * 2) - START_FRAME - /* calculate linear cpuid */ - sll t0, a1, 2 - addu a2, t0, a0 -/* Initially, disable all hardware threads on each core except thread0 */ - li t1, VCPU_ID_0 - li t2, XLR_THREAD_ENABLE_IND - mtcr t1, t2 -#endif + sw zero, START_FRAME - 4(sp) # Zero out old ra for debugger + sw zero, START_FRAME - 8(sp) # Zero out old fp for debugger - -#if defined(TARGET_OCTEON) /* Maybe this is mips32/64 generic? */ - .set push - .set mips32r2 - rdhwr t0, $0 - .set pop -#else - move t0, zero -#endif - - /* Stage the secondary cpu start until later */ - bne t0, zero, start_secondary - nop - -#ifdef SMP - la t0, _C_LABEL(__pcpu) - SET_CPU_PCPU(t0) - /* If not master cpu, jump... */ -/*XXX this assumes the above #if 0'd code runs */ - bne a2, zero, start_secondary - nop -#endif + PTR_LA gp, _C_LABEL(_gp) /* Call the platform-specific startup code. */ jal _C_LABEL(platform_start) - sw zero, START_FRAME - 8(sp) # Zero out old fp for debugger + nop - la sp, _C_LABEL(thread0) + PTR_LA sp, _C_LABEL(thread0) lw a0, TD_PCB(sp) li t0, ~7 and a0, a0, t0 @@ -255,25 +188,4 @@ no_cfe: PANIC("Startup failed!") -#ifdef SMP -start_secondary: - move a0, a1 -2: - addiu t0, PCPU_SIZE - subu a1, 1 - bne a1, zero, 2b - nop - SET_CPU_PCPU(t0) -smp_wait: - lw sp, PC_BOOT_STACK(t0) - beqz sp, smp_wait - nop - jal _C_LABEL(smp_init_secondary) - nop -#else -start_secondary: - b start_secondary - nop -#endif - VECTOR_END(_locore) diff --git a/sys/mips/mips/machdep.c b/sys/mips/mips/machdep.c index 6bd518018e7c..ad1dab522068 100644 --- a/sys/mips/mips/machdep.c +++ b/sys/mips/mips/machdep.c @@ -42,6 +42,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_cputype.h" #include "opt_ddb.h" #include "opt_md.h" #include "opt_msgbuf.h" @@ -75,17 +76,19 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include -#include -#include -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#include #include +#include +#include #ifdef DDB #include #include @@ -104,6 +107,7 @@ SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD, cpu_model, 0, "Machine model"); int cold = 1; long realmem = 0; +long Maxmem = 0; int cpu_clock = MIPS_DEFAULT_HZ; SYSCTL_INT(_hw, OID_AUTO, clockrate, CTLFLAG_RD, &cpu_clock, 0, "CPU instruction clock rate"); @@ -111,15 +115,29 @@ int clocks_running = 0; vm_offset_t kstack0; -#ifdef SMP -struct pcpu __pcpu[32]; -char pcpu_boot_stack[KSTACK_PAGES * PAGE_SIZE * (MAXCPU-1)]; -#else -struct pcpu pcpu; -struct pcpu *pcpup = &pcpu; -#endif +/* + * Each entry in the pcpu_space[] array is laid out in the following manner: + * struct pcpu for cpu 'n' pcpu_space[n] + * boot stack for cpu 'n' pcpu_space[n] + PAGE_SIZE * 2 - START_FRAME + * + * Note that the boot stack grows downwards and we assume that we never + * use enough stack space to trample over the 'struct pcpu' that is at + * the beginning of the array. + * + * The array is aligned on a (PAGE_SIZE * 2) boundary so that the 'struct pcpu' + * is always in the even page frame of the wired TLB entry on SMP kernels. + * + * The array is in the .data section so that the stack does not get zeroed out + * when the .bss section is zeroed. + */ +char pcpu_space[MAXCPU][PAGE_SIZE * 2] \ + __aligned(PAGE_SIZE * 2) __section(".data"); + +struct pcpu *pcpup = (struct pcpu *)pcpu_space; + +vm_offset_t phys_avail[PHYS_AVAIL_ENTRIES + 2]; +vm_offset_t physmem_desc[PHYS_AVAIL_ENTRIES + 2]; -vm_offset_t phys_avail[10]; #ifdef UNIMPLEMENTED struct platform platform; #endif @@ -146,10 +164,18 @@ extern char MipsTLBMiss[], MipsTLBMissEnd[]; extern char MipsCache[], MipsCacheEnd[]; extern char edata[], end[]; +#ifdef DDB +extern vm_offset_t ksym_start, ksym_end; +#endif u_int32_t bootdev; struct bootinfo bootinfo; - +/* + * First kseg0 address available for use. By default it's equal to &end. + * But in some cases there might be additional data placed right after + * _end by loader or ELF trampoline. + */ +vm_offset_t kernel_kseg0_end = (vm_offset_t)&end; static void cpu_startup(void *dummy) @@ -158,7 +184,6 @@ cpu_startup(void *dummy) if (boothowto & RB_VERBOSE) bootverbose++; - bootverbose++; printf("real memory = %lu (%luK bytes)\n", ptoa(realmem), ptoa(realmem) / 1024); @@ -170,11 +195,13 @@ cpu_startup(void *dummy) printf("Physical memory chunk(s):\n"); for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) { - int size1 = phys_avail[indx + 1] - phys_avail[indx]; + uintptr_t size1 = phys_avail[indx + 1] - phys_avail[indx]; - printf("0x%08x - 0x%08x, %u bytes (%u pages)\n", - phys_avail[indx], phys_avail[indx + 1] - 1, size1, - size1 / PAGE_SIZE); + printf("0x%08llx - 0x%08llx, %llu bytes (%llu pages)\n", + (unsigned long long)phys_avail[indx], + (unsigned long long)phys_avail[indx + 1] - 1, + (unsigned long long)size1, + (unsigned long long)size1 / PAGE_SIZE); } } @@ -182,6 +209,7 @@ cpu_startup(void *dummy) printf("avail memory = %lu (%luMB)\n", ptoa(cnt.v_free_count), ptoa(cnt.v_free_count) / 1048576); + cpu_init_interrupts(); /* * Set up buffers, so they can be used to read disk labels. @@ -246,25 +274,35 @@ SYSCTL_INT(_machdep, CPU_WALLCLOCK, wall_cmos_clock, CTLFLAG_RW, &wall_cmos_clock, 0, "Wall CMOS clock assumed"); #endif /* PORT_TO_JMIPS */ +/* + * Initialize per cpu data structures, include curthread. + */ +void +mips_pcpu0_init() +{ + /* Initialize pcpu info of cpu-zero */ + pcpu_init(PCPU_ADDR(0), 0, sizeof(struct pcpu)); + PCPU_SET(curthread, &thread0); +} + /* * Initialize mips and configure to run kernel */ void mips_proc0_init(void) { - proc_linkup(&proc0, &thread0); - thread0.td_kstack = kstack0; - thread0.td_kstack_pages = KSTACK_PAGES - 1; - if (thread0.td_kstack & (1 << PAGE_SHIFT)) - thread0.td_md.md_realstack = thread0.td_kstack + PAGE_SIZE; - else - thread0.td_md.md_realstack = thread0.td_kstack; - /* Initialize pcpu info of cpu-zero */ #ifdef SMP - pcpu_init(&__pcpu[0], 0, sizeof(struct pcpu)); -#else - pcpu_init(pcpup, 0, sizeof(struct pcpu)); + if (platform_processor_id() != 0) + panic("BSP must be processor number 0"); #endif + proc_linkup0(&proc0, &thread0); + + KASSERT((kstack0 & PAGE_MASK) == 0, + ("kstack0 is not aligned on a page boundary: 0x%0lx", + (long)kstack0)); + thread0.td_kstack = kstack0; + thread0.td_kstack_pages = KSTACK_PAGES; + thread0.td_md.md_realstack = roundup2(thread0.td_kstack, PAGE_SIZE * 2); /* * Do not use cpu_thread_alloc to initialize these fields * thread0 is the only thread that has kstack located in KSEG0 @@ -274,14 +312,21 @@ mips_proc0_init(void) (thread0.td_kstack_pages - 1) * PAGE_SIZE) - 1; thread0.td_frame = &thread0.td_pcb->pcb_regs; + /* Steal memory for the dynamic per-cpu area. */ + dpcpu_init((void *)pmap_steal_memory(DPCPU_SIZE), 0); + + PCPU_SET(curpcb, thread0.td_pcb); /* * There is no need to initialize md_upte array for thread0 as it's * located in .bss section and should be explicitly zeroed during * kernel initialization. */ +} - PCPU_SET(curthread, &thread0); - PCPU_SET(curpcb, thread0.td_pcb); +void +cpu_initclocks(void) +{ + platform_initclocks(); } struct msgbuf *msgbufp=0; @@ -328,31 +373,83 @@ mips_vector_init(void) * Mask all interrupts. Each interrupt will be enabled * when handler is installed for it */ - set_intr_mask (ALL_INT_MASK); + set_intr_mask(ALL_INT_MASK); + enableintr(); + /* Clear BEV in SR so we start handling our own exceptions */ mips_cp0_status_write(mips_cp0_status_read() & ~SR_BOOT_EXC_VEC); } +/* + * Fix kernel_kseg0_end address in case trampoline placed debug sympols + * data there + */ +void +mips_postboot_fixup(void) +{ +#ifdef DDB + Elf_Size *trampoline_data = (Elf_Size*)kernel_kseg0_end; + Elf_Size symtabsize = 0; + + if (trampoline_data[0] == SYMTAB_MAGIC) { + symtabsize = trampoline_data[1]; + kernel_kseg0_end += 2 * sizeof(Elf_Size); + /* start of .symtab */ + ksym_start = kernel_kseg0_end; + kernel_kseg0_end += symtabsize; + /* end of .strtab */ + ksym_end = kernel_kseg0_end; + } +#endif +} + +/* + * Many SoCs have a means to reset the core itself. Others do not, or + * the method is unknown to us. For those cases, we jump to the mips + * reset vector and hope for the best. This works well in practice. + */ +void +mips_generic_reset() +{ + ((void(*)(void))(intptr_t)MIPS_VEC_RESET)(); +} + +#ifdef SMP +void +mips_pcpu_tlb_init(struct pcpu *pcpu) +{ + vm_paddr_t pa; + struct tlb tlb; + int lobits; + + /* + * Map the pcpu structure at the virtual address 'pcpup'. + * We use a wired tlb index to do this one-time mapping. + */ + memset(&tlb, 0, sizeof(tlb)); + pa = vtophys(pcpu); + lobits = PTE_RW | PTE_V | PTE_G | PTE_CACHE; + tlb.tlb_hi = (vm_offset_t)pcpup; + tlb.tlb_lo0 = mips_paddr_to_tlbpfn(pa) | lobits; + tlb.tlb_lo1 = mips_paddr_to_tlbpfn(pa + PAGE_SIZE) | lobits; + Mips_TLBWriteIndexed(PCPU_TLB_ENTRY, &tlb); +} +#endif + /* * Initialise a struct pcpu. */ void cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size) { -#ifdef SMP - if (cpuid != 0) - pcpu->pc_boot_stack = (void *)(pcpu_boot_stack + cpuid * - (KSTACK_PAGES * PAGE_SIZE)); -#endif + pcpu->pc_next_asid = 1; pcpu->pc_asid_generation = 1; -} - -int -sysarch(struct thread *td, register struct sysarch_args *uap) -{ - return (ENOSYS); +#ifdef SMP + if ((vm_offset_t)pcpup >= VM_MIN_KERNEL_ADDRESS) + mips_pcpu_tlb_init(pcpu); +#endif } int @@ -429,3 +526,16 @@ cpu_idle_wakeup(int cpu) return (0); } + +int +is_physical_memory(vm_offset_t addr) +{ + int i; + + for (i = 0; physmem_desc[i + 1] != 0; i += 2) { + if (addr >= physmem_desc[i] && addr < physmem_desc[i + 1]) + return (1); + } + + return (0); +} diff --git a/sys/mips/mips/mainbus.c b/sys/mips/mips/mainbus.c index d1571e4cdba6..abee72b6d366 100644 --- a/sys/mips/mips/mainbus.c +++ b/sys/mips/mips/mainbus.c @@ -44,6 +44,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_cputype.h" + #include #include #include @@ -265,7 +267,6 @@ mainbus_activate_resource(device_t bus, device_t child, int type, int rid, + poffs; } rman_set_virtual(r, vaddr); - /* IBM-PC: the type of bus_space_handle_t is u_int */ #ifdef TARGET_OCTEON temp = 0x0000000000000000; temp |= (uint32_t)vaddr; diff --git a/sys/mips/mips/mem.c b/sys/mips/mips/mem.c index 53fe634418ea..c0e88e08e0c2 100644 --- a/sys/mips/mips/mem.c +++ b/sys/mips/mips/mem.c @@ -65,7 +65,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include @@ -101,10 +100,8 @@ memrw(dev, uio, flags) vm_paddr_t pa; register int o; - if (v + c > (SDRAM_ADDR_START + ctob(physmem))) - return (EFAULT); - - if (is_cacheable_mem(v) && is_cacheable_mem(v + c)) { + if (is_cacheable_mem(v) && + is_cacheable_mem(v + c - 1)) { struct fpage *fp; struct sysmaps *sysmaps; @@ -117,7 +114,7 @@ memrw(dev, uio, flags) va = pmap_map_fpage(pa, fp, FALSE); o = (int)uio->uio_offset & PAGE_MASK; c = (u_int)(PAGE_SIZE - - ((int)iov->iov_base & PAGE_MASK)); + ((uintptr_t)iov->iov_base & PAGE_MASK)); c = min(c, (u_int)(PAGE_SIZE - o)); c = min(c, (u_int)iov->iov_len); error = uiomove((caddr_t)(va + o), (int)c, uio); @@ -133,6 +130,7 @@ memrw(dev, uio, flags) else if (dev2unit(dev) == CDEV_MINOR_KMEM) { v = uio->uio_offset; c = min(iov->iov_len, MAXPHYS); + vm_offset_t addr, eaddr; vm_offset_t wired_tlb_virtmem_end; @@ -143,25 +141,37 @@ memrw(dev, uio, flags) addr = trunc_page(uio->uio_offset); eaddr = round_page(uio->uio_offset + c); - if (addr < (vm_offset_t) VM_MIN_KERNEL_ADDRESS) - return EFAULT; + if (addr > (vm_offset_t) VM_MIN_KERNEL_ADDRESS) { + wired_tlb_virtmem_end = VM_MIN_KERNEL_ADDRESS + + VM_KERNEL_ALLOC_OFFSET; + if ((addr < wired_tlb_virtmem_end) && + (eaddr >= wired_tlb_virtmem_end)) + addr = wired_tlb_virtmem_end; - wired_tlb_virtmem_end = VM_MIN_KERNEL_ADDRESS + - VM_KERNEL_ALLOC_OFFSET; - if ((addr < wired_tlb_virtmem_end) && - (eaddr >= wired_tlb_virtmem_end)) - addr = wired_tlb_virtmem_end; + if (addr >= wired_tlb_virtmem_end) { + for (; addr < eaddr; addr += PAGE_SIZE) + if (pmap_extract(kernel_pmap, + addr) == 0) + return EFAULT; - if (addr >= wired_tlb_virtmem_end) { - for (; addr < eaddr; addr += PAGE_SIZE) - if (pmap_extract(kernel_pmap,addr) == 0) - return EFAULT; - - if (!kernacc((caddr_t)(int)uio->uio_offset, c, - uio->uio_rw == UIO_READ ? - VM_PROT_READ : VM_PROT_WRITE)) + if (!kernacc( + (caddr_t)(uintptr_t)uio->uio_offset, c, + uio->uio_rw == UIO_READ ? + VM_PROT_READ : VM_PROT_WRITE)) + return (EFAULT); + } + } + else if (MIPS_IS_KSEG0_ADDR(v)) { + if (MIPS_KSEG0_TO_PHYS(v + c) >= ctob(physmem)) return (EFAULT); } + else if (MIPS_IS_KSEG1_ADDR(v)) { + if (MIPS_KSEG1_TO_PHYS(v + c) >= ctob(physmem)) + return (EFAULT); + } + else + return (EFAULT); + error = uiomove((caddr_t)v, c, uio); continue; @@ -173,7 +183,8 @@ memrw(dev, uio, flags) /*ARGSUSED*/ int -memmmap(struct cdev *dev, vm_offset_t off, vm_paddr_t *paddr, int prot) +memmmap(struct cdev *dev, vm_ooffset_t off, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { return (EOPNOTSUPP); diff --git a/sys/mips/mips/mp_machdep.c b/sys/mips/mips/mp_machdep.c index bf323922d72f..d8520ccfa5cb 100644 --- a/sys/mips/mips/mp_machdep.c +++ b/sys/mips/mips/mp_machdep.c @@ -1,124 +1,110 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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. + */ + #include __FBSDID("$FreeBSD$"); -#include "opt_kstack_pages.h" - #include #include #include #include -#include #include -#include #include #include #include #include -#include +#include #include #include #include -#include +#include +#include -#include #include -#include -#include -#include #include +#include +#include +#include +static void *dpcpu; static struct mtx ap_boot_mtx; -extern struct pcpu __pcpu[]; -extern int num_tlbentries; -void mips_start_timer(void); -static volatile int aps_ready = 0; -u_int32_t boot_cpu_id; +static volatile int aps_ready; +static volatile int mp_naps; - -void -cpu_mp_announce(void) +static void +ipi_send(struct pcpu *pc, int ipi) { + + CTR3(KTR_SMP, "%s: cpu=%d, ipi=%x", __func__, pc->pc_cpuid, ipi); + + atomic_set_32(&pc->pc_pending_ipis, ipi); + platform_ipi_send(pc->pc_cpuid); + + CTR1(KTR_SMP, "%s: sent", __func__); } -/* - * To implement IPIs on MIPS CPU, we use the Interrupt Line 2 ( bit 4 of cause - * register) and a bitmap to avoid redundant IPI interrupts. To interrupt a - * set of CPUs, the sender routine runs in a ' loop ' sending interrupts to - * all the specified CPUs. A single Mutex (smp_ipi_mtx) is used for all IPIs - * that spinwait for delivery. This includes the following IPIs - * IPI_RENDEZVOUS - * IPI_INVLPG - * IPI_INVLTLB - * IPI_INVLRNG - */ - -/* - * send an IPI to a set of cpus. - */ +/* Send an IPI to a set of cpus. */ void -ipi_selected(u_int32_t cpus, u_int ipi) +ipi_selected(cpumask_t cpus, int ipi) { - struct pcpu *pcpu; - u_int cpuid, new_pending, old_pending; + struct pcpu *pc; CTR3(KTR_SMP, "%s: cpus: %x, ipi: %x\n", __func__, cpus, ipi); - while ((cpuid = ffs(cpus)) != 0) { - cpuid--; - cpus &= ~(1 << cpuid); - pcpu = pcpu_find(cpuid); - - if (pcpu) { - do { - old_pending = pcpu->pc_pending_ipis; - new_pending = old_pending | ipi; - } while (!atomic_cmpset_int(&pcpu->pc_pending_ipis, - old_pending, new_pending)); - - if (old_pending) - continue; - - mips_ipi_send (cpuid); - } + SLIST_FOREACH(pc, &cpuhead, pc_allcpu) { + if ((cpus & pc->pc_cpumask) != 0) + ipi_send(pc, ipi); } } -/* - * send an IPI to all CPUs EXCEPT myself - */ -void -ipi_all_but_self(u_int ipi) -{ - - ipi_selected(PCPU_GET(other_cpus), ipi); -} - /* * Handle an IPI sent to this processor. */ -intrmask_t -smp_handle_ipi(struct trapframe *frame) +static int +mips_ipi_handler(void *arg) { - cpumask_t cpumask; /* This cpu mask */ + cpumask_t cpumask; u_int ipi, ipi_bitmap; + int bit; + + platform_ipi_clear(); /* quiesce the pending ipi interrupt */ ipi_bitmap = atomic_readandclear_int(PCPU_PTR(pending_ipis)); - cpumask = PCPU_GET(cpumask); + if (ipi_bitmap == 0) + return (FILTER_STRAY); CTR1(KTR_SMP, "smp_handle_ipi(), ipi_bitmap=%x", ipi_bitmap); - while (ipi_bitmap) { - /* - * Find the lowest set bit. - */ - ipi = ipi_bitmap & ~(ipi_bitmap - 1); + + while ((bit = ffs(ipi_bitmap))) { + bit = bit - 1; + ipi = 1 << bit; ipi_bitmap &= ~ipi; switch (ipi) { - case IPI_INVLTLB: - CTR0(KTR_SMP, "IPI_INVLTLB"); - break; - case IPI_RENDEZVOUS: CTR0(KTR_SMP, "IPI_RENDEZVOUS"); smp_rendezvous_action(); @@ -129,51 +115,136 @@ smp_handle_ipi(struct trapframe *frame) break; case IPI_STOP: - /* * IPI_STOP_HARD is mapped to IPI_STOP so it is not * necessary to add it in the switch. */ CTR0(KTR_SMP, "IPI_STOP or IPI_STOP_HARD"); + cpumask = PCPU_GET(cpumask); atomic_set_int(&stopped_cpus, cpumask); - while ((started_cpus & cpumask) == 0) - ; + cpu_spinwait(); atomic_clear_int(&started_cpus, cpumask); atomic_clear_int(&stopped_cpus, cpumask); + CTR0(KTR_SMP, "IPI_STOP (restart)"); break; + default: + panic("Unknown IPI 0x%0x on cpu %d", ipi, curcpu); } } - return CR_INT_IPI; + + return (FILTER_HANDLED); +} + +static int +start_ap(int cpuid) +{ + int cpus, ms; + + cpus = mp_naps; + dpcpu = (void *)kmem_alloc(kernel_map, DPCPU_SIZE); + + if (platform_start_ap(cpuid) != 0) + return (-1); /* could not start AP */ + + for (ms = 0; ms < 5000; ++ms) { + if (mp_naps > cpus) + return (0); /* success */ + else + DELAY(1000); + } + + return (-2); /* timeout initializing AP */ } void cpu_mp_setmaxid(void) { - mp_maxid = MAXCPU - 1; + mp_ncpus = platform_num_processors(); + if (mp_ncpus <= 0) + mp_ncpus = 1; + + mp_maxid = min(mp_ncpus, MAXCPU) - 1; +} + +void +cpu_mp_announce(void) +{ + /* NOTHING */ +} + +struct cpu_group * +cpu_topo(void) +{ + + return (smp_topo_none()); +} + +int +cpu_mp_probe(void) +{ + + return (mp_ncpus > 1); +} + +void +cpu_mp_start(void) +{ + int error, cpuid; + + mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN); + + all_cpus = 1; /* BSP */ + for (cpuid = 1; cpuid < platform_num_processors(); ++cpuid) { + if (cpuid >= MAXCPU) { + printf("cpu_mp_start: ignoring AP #%d.\n", cpuid); + continue; + } + + if ((error = start_ap(cpuid)) != 0) { + printf("AP #%d failed to start: %d\n", cpuid, error); + continue; + } + + if (bootverbose) + printf("AP #%d started!\n", cpuid); + + all_cpus |= 1 << cpuid; + } + + PCPU_SET(other_cpus, all_cpus & ~PCPU_GET(cpumask)); } void smp_init_secondary(u_int32_t cpuid) { + int ipi_int_mask, clock_int_mask; - if (cpuid >= MAXCPU) - panic ("cpu id exceeds MAXCPU\n"); + /* TLB */ + Mips_SetWIRED(0); + Mips_TLBFlush(num_tlbentries); + Mips_SetWIRED(VMWIRED_ENTRIES); + + /* + * We assume that the L1 cache on the APs is identical to the one + * on the BSP. + */ + mips_dcache_wbinv_all(); + mips_icache_sync_all(); - /* tlb init */ - R4K_SetWIRED(0); - R4K_TLBFlush(num_tlbentries); - R4K_SetWIRED(VMWIRED_ENTRIES); MachSetPID(0); - Mips_SyncCache(); + pcpu_init(PCPU_ADDR(cpuid), cpuid, sizeof(struct pcpu)); + dpcpu_init(dpcpu, cpuid); - mips_cp0_status_write(0); + /* The AP has initialized successfully - allow the BSP to proceed */ + ++mp_naps; + + /* Spin until the BSP is ready to release the APs */ while (!aps_ready) ; - mips_sync(); mips_sync(); /* Initialize curthread. */ KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread")); PCPU_SET(curthread, PCPU_GET(idlethread)); @@ -182,15 +253,16 @@ smp_init_secondary(u_int32_t cpuid) smp_cpus++; - CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", PCPU_GET(cpuid)); + CTR1(KTR_SMP, "SMP: AP CPU #%d launched", PCPU_GET(cpuid)); /* Build our map of 'other' CPUs. */ PCPU_SET(other_cpus, all_cpus & ~PCPU_GET(cpumask)); - printf("SMP: AP CPU #%d Launched!\n", PCPU_GET(cpuid)); + if (bootverbose) + printf("SMP: AP CPU #%d launched.\n", PCPU_GET(cpuid)); if (smp_cpus == mp_ncpus) { - smp_started = 1; + atomic_store_rel_int(&smp_started, 1); smp_active = 1; } @@ -198,103 +270,46 @@ smp_init_secondary(u_int32_t cpuid) while (smp_started == 0) ; /* nothing */ - /* Enable Interrupt */ - mips_cp0_status_write(SR_INT_ENAB); - /* ok, now grab sched_lock and enter the scheduler */ - mtx_lock_spin(&sched_lock); /* - * Correct spinlock nesting. The idle thread context that we are - * borrowing was created so that it would start out with a single - * spin lock (sched_lock) held in fork_trampoline(). Since we've - * explicitly acquired locks in this function, the nesting count - * is now 2 rather than 1. Since we are nested, calling - * spinlock_exit() will simply adjust the counts without allowing - * spin lock using code to interrupt us. + * Unmask the clock and ipi interrupts. */ - spinlock_exit(); - KASSERT(curthread->td_md.md_spinlock_count == 1, ("invalid count")); + clock_int_mask = hard_int_mask(5); + ipi_int_mask = hard_int_mask(platform_ipi_intrnum()); + set_intr_mask(ALL_INT_MASK & ~(ipi_int_mask | clock_int_mask)); - binuptime(PCPU_PTR(switchtime)); - PCPU_SET(switchticks, ticks); + /* + * Bootstrap the compare register. + */ + mips_wr_compare(mips_rd_count() + counter_freq / hz); - /* kick off the clock on this cpu */ - mips_start_timer(); - cpu_throw(NULL, choosethread()); /* doesn't return */ + enableintr(); + + /* enter the scheduler */ + sched_throw(NULL); panic("scheduler returned us to %s", __func__); -} - -static int -smp_start_secondary(int cpuid) -{ - struct pcpu *pcpu; - void *dpcpu; - int i; - - if (bootverbose) - printf("smp_start_secondary: starting cpu %d\n", cpuid); - - dpcpu = (void *)kmem_alloc(kernel_map, DPCPU_SIZE); - pcpu_init(&__pcpu[cpuid], cpuid, sizeof(struct pcpu)); - dpcpu_init(dpcpu, cpuid); - - if (bootverbose) - printf("smp_start_secondary: cpu %d started\n", cpuid); - - return 1; -} - -int -cpu_mp_probe(void) -{ - int i, cpus; - - /* XXX: Need to check for valid platforms here. */ - - boot_cpu_id = PCPU_GET(cpuid); - KASSERT(boot_cpu_id == 0, ("cpu_mp_probe() called on non-primary CPU")); - all_cpus = PCPU_GET(cpumask); - mp_ncpus = 1; - - /* Make sure we have at least one secondary CPU. */ - cpus = 0; - for (i = 0; i < MAXCPU; i++) { - cpus++; - } - return (cpus); -} - -void -cpu_mp_start(void) -{ - int i, cpuid; - - mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN); - - cpuid = 1; - for (i = 0; i < MAXCPU; i++) { - - if (i == boot_cpu_id) - continue; - if (smp_start_secondary(i)) { - all_cpus |= (1 << cpuid); - mp_ncpus++; - cpuid++; - } - } - idle_mask |= CR_INT_IPI; - PCPU_SET(other_cpus, all_cpus & ~PCPU_GET(cpumask)); + /* NOTREACHED */ } static void release_aps(void *dummy __unused) { - if (bootverbose && mp_ncpus > 1) - printf("%s: releasing secondary CPUs\n", __func__); + int ipi_irq; + + if (mp_ncpus == 1) + return; + + /* + * IPI handler + */ + ipi_irq = platform_ipi_intrnum(); + cpu_establish_hardintr("ipi", mips_ipi_handler, NULL, NULL, ipi_irq, + INTR_TYPE_MISC | INTR_EXCL | INTR_FAST, NULL); + atomic_store_rel_int(&aps_ready, 1); - while (mp_ncpus > 1 && smp_started == 0) + while (smp_started == 0) ; /* nothing */ } diff --git a/sys/mips/mips/mpboot.S b/sys/mips/mips/mpboot.S new file mode 100644 index 000000000000..682884774616 --- /dev/null +++ b/sys/mips/mips/mpboot.S @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2010 Neelkanth Natu + * 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 +#include +#include + +#include "assym.s" + + .text + .set noat + .set noreorder + +GLOBAL(mpentry) + mtc0 zero, COP_0_STATUS_REG /* disable interrupts */ + + mtc0 zero, COP_0_CAUSE_REG /* clear soft interrupts */ + + li t0, CFG_K0_CACHED /* make sure kseg0 is cached */ + mtc0 t0, MIPS_COP_0_CONFIG + COP0_SYNC + + jal platform_processor_id /* get the processor number */ + nop + move s0, v0 + + /* + * Initialize stack and call machine startup + */ + PTR_LA sp, _C_LABEL(pcpu_space) + addiu sp, (NBPG * 2) - START_FRAME + sll t0, s0, PAGE_SHIFT + 1 + addu sp, sp, t0 + + /* Zero out old ra and old fp for debugger */ + sw zero, START_FRAME - 4(sp) + sw zero, START_FRAME - 8(sp) + + PTR_LA gp, _C_LABEL(_gp) + + jal platform_init_ap + move a0, s0 + + jal smp_init_secondary + move a0, s0 + + PANIC("AP startup failed!") diff --git a/sys/mips/mips/nexus.c b/sys/mips/mips/nexus.c index 64cba66d1816..7d3f1902fe3c 100644 --- a/sys/mips/mips/nexus.c +++ b/sys/mips/mips/nexus.c @@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$"); #include #include +#undef NEXUS_DEBUG #ifdef NEXUS_DEBUG #define dprintf printf #else @@ -77,20 +78,6 @@ struct nexus_device { static struct rman irq_rman; static struct rman mem_rman; -#ifdef notyet -/* - * XXX: TODO: Implement bus space barrier functions. - * Currently tag and handle are set when memory resources - * are activated. - */ -struct bus_space_tag nexus_bustag = { - NULL, /* cookie */ - NULL, /* parent bus tag */ - NEXUS_BUS_SPACE, /* type */ - nexus_bus_barrier, /* bus_space_barrier */ -}; -#endif - static struct resource * nexus_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); @@ -182,14 +169,14 @@ nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, { int irq; - register_t sr = intr_disable(); + intrmask_t s = disableintr(); irq = rman_get_start(res); if (irq >= NUM_MIPS_IRQS) return (0); cpu_establish_hardintr(device_get_nameunit(child), filt, intr, arg, irq, flags, cookiep); - intr_restore(sr); + restoreintr(s); return (0); } @@ -249,24 +236,46 @@ nexus_hinted_child(device_t bus, const char *dname, int dunit) long maddr; int msize; int result; + int irq; + int mem_hints_count; child = BUS_ADD_CHILD(bus, 0, dname, dunit); + if (child == NULL) + return; /* * Set hard-wired resources for hinted child using * specific RIDs. */ - resource_long_value(dname, dunit, "maddr", &maddr); - resource_int_value(dname, dunit, "msize", &msize); + mem_hints_count = 0; + if (resource_long_value(dname, dunit, "maddr", &maddr) == 0) + mem_hints_count++; + if (resource_int_value(dname, dunit, "msize", &msize) == 0) + mem_hints_count++; - dprintf("%s: discovered hinted child %s at maddr %p(%d)\n", - __func__, device_get_nameunit(child), - (void *)(intptr_t)maddr, msize); + /* check if all info for mem resource has been provided */ + if ((mem_hints_count > 0) && (mem_hints_count < 2)) { + printf("Either maddr or msize hint is missing for %s%d\n", + dname, dunit); + } + else if (mem_hints_count) { + dprintf("%s: discovered hinted child %s at maddr %p(%d)\n", + __func__, device_get_nameunit(child), + (void *)(intptr_t)maddr, msize); - result = bus_set_resource(child, SYS_RES_MEMORY, MIPS_MEM_RID, - maddr, msize); - if (result != 0) { - device_printf(bus, "warning: bus_set_resource() failed\n"); + result = bus_set_resource(child, SYS_RES_MEMORY, 0, maddr, + msize); + if (result != 0) { + device_printf(bus, + "warning: bus_set_resource() failed\n"); + } + } + + if (resource_int_value(dname, dunit, "irq", &irq) == 0) { + result = bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1); + if (result != 0) + device_printf(bus, + "warning: bus_set_resource() failed\n"); } } @@ -282,6 +291,10 @@ nexus_add_child(device_t bus, int order, const char *name, int unit) resource_list_init(&ndev->nx_resources); child = device_add_child_ordered(bus, order, name, unit); + if (child == NULL) { + device_printf(bus, "failed to add child: %s%d\n", name, unit); + return (0); + } /* should we free this in nexus_child_detached? */ device_set_ivars(child, ndev); @@ -345,7 +358,8 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid, rv = rman_reserve_resource(rm, start, end, count, flags, child); if (rv == 0) { - printf("%s: could not reserve resource\n", __func__); + printf("%s: could not reserve resource for %s\n", __func__, + device_get_nameunit(child)); return (0); } @@ -366,33 +380,21 @@ static int nexus_activate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { -#ifdef TARGET_OCTEON - uint64_t temp; -#endif + void *vaddr; + u_int32_t paddr, psize; + /* * If this is a memory resource, track the direct mapping * in the uncached MIPS KSEG1 segment. */ - if ((type == SYS_RES_MEMORY) || (type == SYS_RES_IOPORT)) { - caddr_t vaddr = 0; - u_int32_t paddr; - u_int32_t psize; - u_int32_t poffs; - - paddr = rman_get_start(r); - psize = rman_get_size(r); - poffs = paddr - trunc_page(paddr); - vaddr = (caddr_t) pmap_mapdev(paddr-poffs, psize+poffs) + poffs; + if (type == SYS_RES_MEMORY) { + paddr = rman_get_start(r); + psize = rman_get_size(r); + vaddr = pmap_mapdev(paddr, psize); rman_set_virtual(r, vaddr); - rman_set_bustag(r, MIPS_BUS_SPACE_MEM); -#ifdef TARGET_OCTEON - temp = 0x0000000000000000; - temp |= (uint32_t)vaddr; - rman_set_bushandle(r, (bus_space_handle_t)temp); -#else - rman_set_bushandle(r, (bus_space_handle_t)vaddr); -#endif + rman_set_bustag(r, mips_bus_space_generic); + rman_set_bushandle(r, (bus_space_handle_t)(uintptr_t)vaddr); } return (rman_activate_resource(r)); @@ -473,6 +475,12 @@ static int nexus_deactivate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { + vm_offset_t va; + + if (type == SYS_RES_MEMORY) { + va = (vm_offset_t)rman_get_virtual(r); + pmap_unmapdev(va, rman_get_size(r)); + } return (rman_deactivate_resource(r)); } diff --git a/sys/mips/mips/pm_machdep.c b/sys/mips/mips/pm_machdep.c index 9fb1feca3fb6..712763b1020b 100644 --- a/sys/mips/mips/pm_machdep.c +++ b/sys/mips/mips/pm_machdep.c @@ -39,6 +39,8 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_cputype.h" + #include #include #include @@ -213,13 +215,11 @@ int sigreturn(struct thread *td, struct sigreturn_args *uap) { struct trapframe *regs; - const ucontext_t *ucp; - struct proc *p; + ucontext_t *ucp; ucontext_t uc; int error; ucp = &uc; - p = td->td_proc; error = copyin(uap->sigcntxp, &uc, sizeof(uc)); if (error != 0) @@ -229,14 +229,14 @@ sigreturn(struct thread *td, struct sigreturn_args *uap) /* #ifdef DEBUG */ if (ucp->uc_mcontext.mc_regs[ZERO] != UCONTEXT_MAGIC) { - printf("sigreturn: pid %d, ucp %p\n", p->p_pid, ucp); - printf(" old sp %x ra %x pc %x\n", - regs->sp, regs->ra, regs->pc); - printf(" new sp %x ra %x pc %x z %x\n", - ucp->uc_mcontext.mc_regs[SP], - ucp->uc_mcontext.mc_regs[RA], - ucp->uc_mcontext.mc_regs[PC], - ucp->uc_mcontext.mc_regs[ZERO]); + printf("sigreturn: pid %d, ucp %p\n", td->td_proc->p_pid, ucp); + printf(" old sp %p ra %p pc %p\n", + (void *)regs->sp, (void *)regs->ra, (void *)regs->pc); + printf(" new sp %p ra %p pc %p z %p\n", + (void *)ucp->uc_mcontext.mc_regs[SP], + (void *)ucp->uc_mcontext.mc_regs[RA], + (void *)ucp->uc_mcontext.mc_regs[PC], + (void *)ucp->uc_mcontext.mc_regs[ZERO]); return EINVAL; } /* #endif */ @@ -253,11 +253,8 @@ sigreturn(struct thread *td, struct sigreturn_args *uap) regs->mullo = ucp->uc_mcontext.mullo; regs->mulhi = ucp->uc_mcontext.mulhi; - PROC_LOCK(p); - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); + return(EJUSTRETURN); } @@ -327,7 +324,7 @@ ptrace_single_step(struct thread *td) /* compute next address after current location */ if(curinstr != 0) { va = MipsEmulateBranch(locr0, locr0->pc, locr0->fsr, - (u_int)&curinstr); + (uintptr_t)&curinstr); } else { va = locr0->pc + 4; } @@ -413,9 +410,16 @@ get_mcontext(struct thread *td, mcontext_t *mcp, int flags) bcopy((void *)&td->td_frame->f0, (void *)&mcp->mc_fpregs, sizeof(mcp->mc_fpregs)); } + if (flags & GET_MC_CLEAR_RET) { + mcp->mc_regs[V0] = 0; + mcp->mc_regs[V1] = 0; + mcp->mc_regs[A3] = 0; + } + mcp->mc_pc = td->td_frame->pc; mcp->mullo = td->td_frame->mullo; mcp->mulhi = td->td_frame->mulhi; + mcp->mc_tls = td->td_md.md_tls; return (0); } @@ -436,6 +440,7 @@ set_mcontext(struct thread *td, const mcontext_t *mcp) td->td_frame->pc = mcp->mc_pc; td->td_frame->mullo = mcp->mullo; td->td_frame->mulhi = mcp->mulhi; + td->td_md.md_tls = mcp->mc_tls; /* Dont let user to set any bits in Status and casue registers */ return (0); @@ -482,7 +487,8 @@ exec_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings) // td->td_frame->sr = SR_KSU_USER | SR_EXL | SR_INT_ENAB; //? td->td_frame->sr |= idle_mask & ALL_INT_MASK; #else - td->td_frame->sr = SR_KSU_USER | SR_EXL;// mips2 also did COP_0_BIT + td->td_frame->sr = SR_KSU_USER | SR_EXL | SR_INT_ENAB | + (mips_rd_status() & ALL_INT_MASK); #endif #ifdef TARGET_OCTEON td->td_frame->sr |= MIPS_SR_COP_2_BIT | MIPS32_SR_PX | MIPS_SR_UX | diff --git a/sys/mips/mips/pmap.c b/sys/mips/mips/pmap.c index 7b106dc4a4ac..4a267dc36cdc 100644 --- a/sys/mips/mips/pmap.c +++ b/sys/mips/mips/pmap.c @@ -96,7 +96,6 @@ __FBSDID("$FreeBSD$"); #endif #include -#include #include #if defined(DIAGNOSTIC) @@ -292,9 +291,14 @@ pmap_bootstrap(void) /* Sort. */ again: for (i = 0; phys_avail[i + 1] != 0; i += 2) { - if (phys_avail[i + 1] >= MIPS_KSEG0_LARGEST_PHYS) { + /* + * Keep the memory aligned on page boundary. + */ + phys_avail[i] = round_page(phys_avail[i]); + phys_avail[i + 1] = trunc_page(phys_avail[i + 1]); + + if (phys_avail[i + 1] >= MIPS_KSEG0_LARGEST_PHYS) memory_larger_than_512meg++; - } if (i < 2) continue; if (phys_avail[i - 2] > phys_avail[i]) { @@ -313,6 +317,16 @@ again: } } + /* + * Copy the phys_avail[] array before we start stealing memory from it. + */ + for (i = 0; phys_avail[i + 1] != 0; i += 2) { + physmem_desc[i] = phys_avail[i]; + physmem_desc[i + 1] = phys_avail[i + 1]; + } + + Maxmem = atop(phys_avail[i - 1]); + if (bootverbose) { printf("Physical memory chunk(s):\n"); for (i = 0; phys_avail[i + 1] != 0; i += 2) { @@ -324,6 +338,7 @@ again: (uintmax_t) phys_avail[i + 1] - 1, (uintmax_t) size, (uintmax_t) size / PAGE_SIZE); } + printf("Maxmem is 0x%0lx\n", ptoa(Maxmem)); } /* * Steal the message buffer from the beginning of memory. @@ -331,9 +346,6 @@ again: msgbufp = (struct msgbuf *)pmap_steal_memory(MSGBUF_SIZE); msgbufinit(msgbufp, MSGBUF_SIZE); - /* Steal memory for the dynamic per-cpu area. */ - dpcpu_init((void *)pmap_steal_memory(DPCPU_SIZE), 0); - /* * Steal thread0 kstack. */ @@ -343,6 +355,26 @@ again: virtual_avail = VM_MIN_KERNEL_ADDRESS + VM_KERNEL_ALLOC_OFFSET; virtual_end = VM_MAX_KERNEL_ADDRESS; +#ifdef SMP + /* + * Steal some virtual address space to map the pcpu area. + */ + virtual_avail = roundup2(virtual_avail, PAGE_SIZE * 2); + pcpup = (struct pcpu *)virtual_avail; + virtual_avail += PAGE_SIZE * 2; + + /* + * Initialize the wired TLB entry mapping the pcpu region for + * the BSP at 'pcpup'. Up until this point we were operating + * with the 'pcpup' for the BSP pointing to a virtual address + * in KSEG0 so there was no need for a TLB mapping. + */ + mips_pcpu_tlb_init(PCPU_ADDR(0)); + + if (bootverbose) + printf("pcpu is available at virtual address %p.\n", pcpup); +#endif + /* * Steal some virtual space that will not be in kernel_segmap. This * va memory space will be used to map in kernel pages that are @@ -400,22 +432,13 @@ again: for (i = 0, pte = pgtab; i < (nkpt * NPTEPG); i++, pte++) *pte = PTE_G; - printf("Va=0x%x Ve=%x\n", virtual_avail, virtual_end); /* * The segment table contains the KVA of the pages in the second * level page table. */ - printf("init kernel_segmap va >> = %d nkpt:%d\n", - (virtual_avail >> SEGSHIFT), - nkpt); for (i = 0, j = (virtual_avail >> SEGSHIFT); i < nkpt; i++, j++) kernel_segmap[j] = (pd_entry_t)(pgtab + (i * NPTEPG)); - for (i = 0; phys_avail[i + 2]; i += 2) - continue; - printf("avail_start:0x%x avail_end:0x%x\n", - phys_avail[0], phys_avail[i + 1]); - /* * The kernel's pmap is statically allocated so we don't have to use * pmap_create, which is unlikely to work correctly at this part of @@ -425,8 +448,8 @@ again: kernel_pmap->pm_segtab = kernel_segmap; kernel_pmap->pm_active = ~0; TAILQ_INIT(&kernel_pmap->pm_pvlist); - kernel_pmap->pm_asid[PCPU_GET(cpuid)].asid = PMAP_ASID_RESERVED; - kernel_pmap->pm_asid[PCPU_GET(cpuid)].gen = 0; + kernel_pmap->pm_asid[0].asid = PMAP_ASID_RESERVED; + kernel_pmap->pm_asid[0].gen = 0; pmap_max_asid = VMNUM_PIDS; MachSetPID(0); } @@ -697,6 +720,11 @@ pmap_kremove(vm_offset_t va) { register pt_entry_t *pte; + /* + * Write back all caches from the page being destroyed + */ + mips_dcache_wbinv_range_index(va, NBPG); + pte = pmap_pte(kernel_pmap, va); *pte = PTE_G; pmap_invalidate_page(kernel_pmap, va); @@ -741,11 +769,15 @@ void pmap_qenter(vm_offset_t va, vm_page_t *m, int count) { int i; + vm_offset_t origva = va; for (i = 0; i < count; i++) { + pmap_flush_pvcache(m[i]); pmap_kenter(va, VM_PAGE_TO_PHYS(m[i])); va += PAGE_SIZE; } + + mips_dcache_wbinv_range_index(origva, PAGE_SIZE*count); } /* @@ -755,6 +787,11 @@ pmap_qenter(vm_offset_t va, vm_page_t *m, int count) void pmap_qremove(vm_offset_t va, int count) { + /* + * No need to wb/inv caches here, + * pmap_kremove will do it for us + */ + while (count-- > 0) { pmap_kremove(va); va += PAGE_SIZE; @@ -1533,6 +1570,12 @@ pmap_remove_page(struct pmap *pmap, vm_offset_t va) if (!ptq || !pmap_pte_v(ptq)) { return; } + + /* + * Write back all caches from the page being destroyed + */ + mips_dcache_wbinv_range_index(va, NBPG); + /* * get a local va for mappings for this pmap. */ @@ -1612,6 +1655,14 @@ pmap_remove_all(vm_page_t m) while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { PMAP_LOCK(pv->pv_pmap); + + /* + * If it's last mapping writeback all caches from + * the page being destroyed + */ + if (m->md.pv_list_count == 1) + mips_dcache_wbinv_range_index(pv->pv_va, NBPG); + pv->pv_pmap->pm_stats.resident_count--; pte = pmap_pte(pv->pv_pmap, pv->pv_va); @@ -1768,8 +1819,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, * Page Directory table entry not valid, we need a new PT page */ if (pte == NULL) { - panic("pmap_enter: invalid page directory, pdir=%p, va=0x%x\n", - (void *)pmap->pm_segtab, va); + panic("pmap_enter: invalid page directory, pdir=%p, va=%p\n", + (void *)pmap->pm_segtab, (void *)va); } pa = VM_PAGE_TO_PHYS(m); om = NULL; @@ -1830,7 +1881,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m, mpte->wire_count--; KASSERT(mpte->wire_count > 0, ("pmap_enter: missing reference to page table page," - " va: 0x%x", va)); + " va: %p", (void *)va)); } } else pmap->pm_stats.resident_count++; @@ -1892,7 +1943,7 @@ validate: if (origpte & PTE_M) { KASSERT((origpte & PTE_RW), ("pmap_enter: modified page not writable:" - " va: 0x%x, pte: 0x%lx", va, origpte)); + " va: %p, pte: 0x%lx", (void *)va, origpte)); if (page_is_managed(opa)) vm_page_dirty(om); } @@ -2054,7 +2105,7 @@ void * pmap_kenter_temporary(vm_paddr_t pa, int i) { vm_offset_t va; - + int int_level; if (i != 0) printf("%s: ERROR!!! More than one page of virtual address mapping not supported\n", __func__); @@ -2070,14 +2121,20 @@ pmap_kenter_temporary(vm_paddr_t pa, int i) } else { int cpu; struct local_sysmaps *sysm; - + /* If this is used other than for dumps, we may need to leave + * interrupts disasbled on return. If crash dumps don't work when + * we get to this point, we might want to consider this (leaving things + * disabled as a starting point ;-) + */ + int_level = disableintr(); cpu = PCPU_GET(cpuid); sysm = &sysmap_lmem[cpu]; /* Since this is for the debugger, no locks or any other fun */ sysm->CMAP1 = mips_paddr_to_tlbpfn(pa) | PTE_RW | PTE_V | PTE_G | PTE_W | PTE_CACHE; - pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); sysm->valid1 = 1; + pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); va = (vm_offset_t)sysm->CADDR1; + restoreintr(int_level); } return ((void *)va); } @@ -2086,6 +2143,7 @@ void pmap_kenter_temporary_free(vm_paddr_t pa) { int cpu; + int int_level; struct local_sysmaps *sysm; if (pa < MIPS_KSEG0_LARGEST_PHYS) { @@ -2095,7 +2153,9 @@ pmap_kenter_temporary_free(vm_paddr_t pa) cpu = PCPU_GET(cpuid); sysm = &sysmap_lmem[cpu]; if (sysm->valid1) { + int_level = disableintr(); pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1); + restoreintr(int_level); sysm->CMAP1 = 0; sysm->valid1 = 0; } @@ -2206,7 +2266,7 @@ pmap_zero_page(vm_page_t m) { vm_offset_t va; vm_paddr_t phys = VM_PAGE_TO_PHYS(m); - + int int_level; #ifdef VM_ALLOC_WIRED_TLB_PG_POOL if (need_wired_tlb_page_pool) { struct fpage *fp1; @@ -2229,7 +2289,7 @@ pmap_zero_page(vm_page_t m) #endif if (phys < MIPS_KSEG0_LARGEST_PHYS) { - va = MIPS_PHYS_TO_UNCACHED(phys); + va = MIPS_PHYS_TO_CACHED(phys); bzero((caddr_t)va, PAGE_SIZE); mips_dcache_wbinv_range(va, PAGE_SIZE); @@ -2241,11 +2301,13 @@ pmap_zero_page(vm_page_t m) sysm = &sysmap_lmem[cpu]; PMAP_LGMEM_LOCK(sysm); sched_pin(); + int_level = disableintr(); sysm->CMAP1 = mips_paddr_to_tlbpfn(phys) | PTE_RW | PTE_V | PTE_G | PTE_W | PTE_CACHE; - pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); sysm->valid1 = 1; + pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); bzero(sysm->CADDR1, PAGE_SIZE); pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1); + restoreintr(int_level); sysm->CMAP1 = 0; sysm->valid1 = 0; sched_unpin(); @@ -2265,7 +2327,7 @@ pmap_zero_page_area(vm_page_t m, int off, int size) { vm_offset_t va; vm_paddr_t phys = VM_PAGE_TO_PHYS(m); - + int int_level; #ifdef VM_ALLOC_WIRED_TLB_PG_POOL if (need_wired_tlb_page_pool) { struct fpage *fp1; @@ -2285,7 +2347,7 @@ pmap_zero_page_area(vm_page_t m, int off, int size) } else #endif if (phys < MIPS_KSEG0_LARGEST_PHYS) { - va = MIPS_PHYS_TO_UNCACHED(phys); + va = MIPS_PHYS_TO_CACHED(phys); bzero((char *)(caddr_t)va + off, size); mips_dcache_wbinv_range(va + off, size); } else { @@ -2295,12 +2357,14 @@ pmap_zero_page_area(vm_page_t m, int off, int size) cpu = PCPU_GET(cpuid); sysm = &sysmap_lmem[cpu]; PMAP_LGMEM_LOCK(sysm); + int_level = disableintr(); sched_pin(); sysm->CMAP1 = mips_paddr_to_tlbpfn(phys) | PTE_RW | PTE_V | PTE_G | PTE_W | PTE_CACHE; - pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); sysm->valid1 = 1; + pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); bzero((char *)sysm->CADDR1 + off, size); pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1); + restoreintr(int_level); sysm->CMAP1 = 0; sysm->valid1 = 0; sched_unpin(); @@ -2313,7 +2377,7 @@ pmap_zero_page_idle(vm_page_t m) { vm_offset_t va; vm_paddr_t phys = VM_PAGE_TO_PHYS(m); - + int int_level; #ifdef VM_ALLOC_WIRED_TLB_PG_POOL if (need_wired_tlb_page_pool) { sched_pin(); @@ -2324,7 +2388,7 @@ pmap_zero_page_idle(vm_page_t m) } else #endif if (phys < MIPS_KSEG0_LARGEST_PHYS) { - va = MIPS_PHYS_TO_UNCACHED(phys); + va = MIPS_PHYS_TO_CACHED(phys); bzero((caddr_t)va, PAGE_SIZE); mips_dcache_wbinv_range(va, PAGE_SIZE); } else { @@ -2334,12 +2398,14 @@ pmap_zero_page_idle(vm_page_t m) cpu = PCPU_GET(cpuid); sysm = &sysmap_lmem[cpu]; PMAP_LGMEM_LOCK(sysm); + int_level = disableintr(); sched_pin(); sysm->CMAP1 = mips_paddr_to_tlbpfn(phys) | PTE_RW | PTE_V | PTE_G | PTE_W | PTE_CACHE; - pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); sysm->valid1 = 1; + pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR1, sysm->CMAP1); bzero(sysm->CADDR1, PAGE_SIZE); pmap_TLB_invalidate_kernel((vm_offset_t)sysm->CADDR1); + restoreintr(int_level); sysm->CMAP1 = 0; sysm->valid1 = 0; sched_unpin(); @@ -2360,8 +2426,7 @@ pmap_copy_page(vm_page_t src, vm_page_t dst) vm_offset_t va_src, va_dst; vm_paddr_t phy_src = VM_PAGE_TO_PHYS(src); vm_paddr_t phy_dst = VM_PAGE_TO_PHYS(dst); - - + int int_level; #ifdef VM_ALLOC_WIRED_TLB_PG_POOL if (need_wired_tlb_page_pool) { struct fpage *fp1, *fp2; @@ -2392,9 +2457,17 @@ pmap_copy_page(vm_page_t src, vm_page_t dst) { if ((phy_src < MIPS_KSEG0_LARGEST_PHYS) && (phy_dst < MIPS_KSEG0_LARGEST_PHYS)) { /* easy case, all can be accessed via KSEG0 */ + /* + * Flush all caches for VA that are mapped to this page + * to make sure that data in SDRAM is up to date + */ + pmap_flush_pvcache(src); + mips_dcache_wbinv_range_index( + MIPS_PHYS_TO_CACHED(phy_dst), NBPG); va_src = MIPS_PHYS_TO_CACHED(phy_src); va_dst = MIPS_PHYS_TO_CACHED(phy_dst); bcopy((caddr_t)va_src, (caddr_t)va_dst, PAGE_SIZE); + mips_dcache_wbinv_range(va_dst, PAGE_SIZE); } else { int cpu; struct local_sysmaps *sysm; @@ -2403,12 +2476,13 @@ pmap_copy_page(vm_page_t src, vm_page_t dst) sysm = &sysmap_lmem[cpu]; PMAP_LGMEM_LOCK(sysm); sched_pin(); + int_level = disableintr(); if (phy_src < MIPS_KSEG0_LARGEST_PHYS) { /* one side needs mapping - dest */ va_src = MIPS_PHYS_TO_CACHED(phy_src); sysm->CMAP2 = mips_paddr_to_tlbpfn(phy_dst) | PTE_RW | PTE_V | PTE_G | PTE_W | PTE_CACHE; pmap_TLB_update_kernel((vm_offset_t)sysm->CADDR2, sysm->CMAP2); - sysm->valid2 = 2; + sysm->valid2 = 1; va_dst = (vm_offset_t)sysm->CADDR2; } else if (phy_dst < MIPS_KSEG0_LARGEST_PHYS) { /* one side needs mapping - src */ @@ -2438,6 +2512,7 @@ pmap_copy_page(vm_page_t src, vm_page_t dst) sysm->CMAP2 = 0; sysm->valid2 = 0; } + restoreintr(int_level); sched_unpin(); PMAP_LGMEM_UNLOCK(sysm); } @@ -2495,9 +2570,7 @@ pmap_remove_pages(pmap_t pmap) PMAP_LOCK(pmap); sched_pin(); //XXX need to be TAILQ_FOREACH_SAFE ? - for (pv = TAILQ_FIRST(&pmap->pm_pvlist); - pv; - pv = npv) { + for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) { pte = pmap_pte(pv->pv_pmap, pv->pv_va); if (!pmap_pte_v(pte)) @@ -2802,15 +2875,16 @@ pmap_mapdev(vm_offset_t pa, vm_size_t size) * KSEG1 maps only first 512M of phys address space. For * pa > 0x20000000 we should make proper mapping * using pmap_kenter. */ - if (pa + size < MIPS_KSEG0_LARGEST_PHYS) + if ((pa + size - 1) < MIPS_KSEG0_LARGEST_PHYS) return (void *)MIPS_PHYS_TO_KSEG1(pa); else { offset = pa & PAGE_MASK; - size = roundup(size, PAGE_SIZE); + size = roundup(size + offset, PAGE_SIZE); va = kmem_alloc_nofault(kernel_map, size); if (!va) panic("pmap_mapdev: Couldn't alloc kernel virtual memory"); + pa = trunc_page(pa); for (tmpva = va; size > 0;) { pmap_kenter(tmpva, pa); size -= PAGE_SIZE; @@ -2825,6 +2899,18 @@ pmap_mapdev(vm_offset_t pa, vm_size_t size) void pmap_unmapdev(vm_offset_t va, vm_size_t size) { + vm_offset_t base, offset, tmpva; + + /* If the address is within KSEG1 then there is nothing to do */ + if (va >= MIPS_KSEG1_START && va <= MIPS_KSEG1_END) + return; + + base = trunc_page(va); + offset = va & PAGE_MASK; + size = roundup(size + offset, PAGE_SIZE); + for (tmpva = base; tmpva < base + size; tmpva += PAGE_SIZE) + pmap_kremove(tmpva); + kmem_free(kernel_map, base, size); } /* @@ -2899,10 +2985,16 @@ pmap_activate(struct thread *td) PCPU_SET(segbase, pmap->pm_segtab); MachSetPID(pmap->pm_asid[PCPU_GET(cpuid)].asid); } + PCPU_SET(curpmap, pmap); critical_exit(); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. @@ -2960,7 +3052,7 @@ pmap_pid_dump(int pid) pde = &pmap->pm_segtab[i]; if (pde && pmap_pde_v(pde)) { for (j = 0; j < 1024; j++) { - unsigned va = base + + vm_offset_t va = base + (j << PAGE_SHIFT); pte = pmap_pte(pmap, va); @@ -2970,8 +3062,9 @@ pmap_pid_dump(int pid) pa = mips_tlbpfn_to_paddr(*pte); m = PHYS_TO_VM_PAGE(pa); - printf("va: 0x%x, pt: 0x%x, h: %d, w: %d, f: 0x%x", - va, pa, + printf("va: %p, pt: %p, h: %d, w: %d, f: 0x%x", + (void *)va, + (void *)pa, m->hold_count, m->wire_count, m->flags); @@ -3271,3 +3364,16 @@ pmap_kextract(vm_offset_t va) } return pa; } + +void +pmap_flush_pvcache(vm_page_t m) +{ + pv_entry_t pv; + + if (m != NULL) { + for (pv = TAILQ_FIRST(&m->md.pv_list); pv; + pv = TAILQ_NEXT(pv, pv_list)) { + mips_dcache_wbinv_range_index(pv->pv_va, NBPG); + } + } +} diff --git a/sys/mips/mips/psraccess.S b/sys/mips/mips/psraccess.S index 003c1d534eca..0bcb04d3d337 100644 --- a/sys/mips/mips/psraccess.S +++ b/sys/mips/mips/psraccess.S @@ -41,6 +41,8 @@ #include #include +#include "opt_cputype.h" + #include "assym.s" /* diff --git a/sys/mips/mips/ptrace_machdep.c b/sys/mips/mips/ptrace_machdep.c new file mode 100644 index 000000000000..2c268d8b12b9 --- /dev/null +++ b/sys/mips/mips/ptrace_machdep.c @@ -0,0 +1,37 @@ +/*- + * Copyright (c) 2009 M. Warner Losh. + * 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. + * + */ + +#if 0 +#include +__FBSDID("$FreeBSD$"); + +/* + * This file is a place holder for MIPS. Some models of MIPS may need special + * functions here, but for now nothing is needed. The MI parts of ptrace + * suffice. + */ +#endif diff --git a/sys/mips/mips/support.S b/sys/mips/mips/support.S index d8213618108b..526f95776f1f 100644 --- a/sys/mips/mips/support.S +++ b/sys/mips/mips/support.S @@ -55,6 +55,7 @@ * assembly language support routines. */ +#include "opt_cputype.h" #include "opt_ddb.h" #include #include @@ -460,8 +461,10 @@ ALEAF(fuibyte) sw zero, U_PCB_ONFAULT(v1) END(fubyte) -LEAF(suword) -XLEAF(suword32) +LEAF(suword32) +#ifndef __mips_n64 +XLEAF(suword) +#endif blt a0, zero, fswberr # make sure address is in user space li v0, FSWBERR GET_CPU_PCPU(v1) @@ -471,31 +474,86 @@ XLEAF(suword32) sw zero, U_PCB_ONFAULT(v1) j ra move v0, zero -END(suword) +END(suword32) + +#ifdef __mips_n64 +LEAF(suword64) +XLEAF(suword) + blt a0, zero, fswberr # make sure address is in user space + li v0, FSWBERR + GET_CPU_PCPU(v1) + lw v1, PC_CURPCB(v1) + sw v0, U_PCB_ONFAULT(v1) + sd a1, 0(a0) # store word + sw zero, U_PCB_ONFAULT(v1) + j ra + move v0, zero +END(suword64) +#endif /* * casuword(9) * u_long casuword(u_long *p, u_long oldval, u_long newval) */ -ENTRY(casuword) - break - li v0, -1 - jr ra - nop -END(casuword) - /* * casuword32(9) * uint32_t casuword(uint32_t *p, uint32_t oldval, * uint32_t newval) */ -ENTRY(casuword32) - break +LEAF(casuword32) +#ifndef __mips_n64 +XLEAF(casuword) +#endif + blt a0, zero, fswberr # make sure address is in user space + li v0, FSWBERR + GET_CPU_PCPU(v1) + lw v1, PC_CURPCB(v1) + sw v0, U_PCB_ONFAULT(v1) +1: + move t0, a2 + ll v0, 0(a0) + bne a1, v0, 2f + nop + sc t0, 0(a0) # store word + beqz t0, 1b + nop + j 3f + nop +2: li v0, -1 +3: + sw zero, U_PCB_ONFAULT(v1) jr ra nop END(casuword32) +#ifdef __mips_n64 +LEAF(casuword64) +XLEAF(casuword) + blt a0, zero, fswberr # make sure address is in user space + li v0, FSWBERR + GET_CPU_PCPU(v1) + lw v1, PC_CURPCB(v1) + sw v0, U_PCB_ONFAULT(v1) +1: + move t0, a2 + lld v0, 0(a0) + bne a1, v0, 2f + nop + scd t0, 0(a0) # store double word + beqz t0, 1b + nop + j 3f + nop +2: + li v0, -1 +3: + sw zero, U_PCB_ONFAULT(v1) + jr ra + nop +END(casuword64) +#endif + #if 0 /* unused in FreeBSD */ /* @@ -1280,17 +1338,11 @@ END(atomic_subtract_8) .set mips3 #endif -LEAF(atomic_readandclear_64) -1: - lld v0, 0(a0) - li t0, 0 - scd t0, 0(a0) - beqz t0, 1b - nop - j ra - nop -END(atomic_readandclear_64) - +#if !defined(__mips_n64) && !defined(__mips_n32) + /* + * I don't know if these routines have the right number of + * NOPs in it for all processors. XXX + */ LEAF(atomic_store_64) mfc0 t1, COP_0_STATUS_REG and t2, t1, ~SR_INT_ENAB @@ -1336,6 +1388,7 @@ LEAF(atomic_load_64) j ra nop END(atomic_load_64) +#endif #if defined(DDB) || defined(DEBUG) diff --git a/sys/mips/mips/swtch.S b/sys/mips/mips/swtch.S index 84585cb36c52..124827610add 100644 --- a/sys/mips/mips/swtch.S +++ b/sys/mips/mips/swtch.S @@ -81,14 +81,12 @@ #define _MFC0 dmfc0 #define _MTC0 dmtc0 #define WIRED_SHIFT 34 -#define PAGE_SHIFT 34 #else #define _SLL sll #define _SRL srl #define _MFC0 mfc0 #define _MTC0 mtc0 #define WIRED_SHIFT 2 -#define PAGE_SHIFT 2 #endif .set noreorder # Noreorder is default style! #if defined(ISA_MIPS32) @@ -163,25 +161,19 @@ LEAF(fork_trampoline) DO_AST -/* - * Since interrupts are enabled at this point, we use a1 instead of - * k0 or k1 to store the PCB pointer. This is because k0 and k1 - * are not preserved across interrupts. - */ - GET_CPU_PCPU(a1) - lw a1, PC_CURPCB(a1) -1: - - mfc0 v0, COP_0_STATUS_REG # set exeption level bit. - or v0, SR_EXL + mfc0 v0, COP_0_STATUS_REG and v0, ~(SR_INT_ENAB) - mtc0 v0, COP_0_STATUS_REG # set exeption level bit. - nop - nop - nop - nop + mtc0 v0, COP_0_STATUS_REG # disable interrupts + COP0_SYNC +/* + * The use of k1 for storing the PCB pointer must be done only + * after interrupts are disabled. Otherwise it will get overwritten + * by the interrupt code. + */ .set noat - move k1, a1 + GET_CPU_PCPU(k1) + lw k1, PC_CURPCB(k1) + RESTORE_U_PCB_REG(t0, MULLO, k1) RESTORE_U_PCB_REG(t1, MULHI, k1) mtlo t0 @@ -191,11 +183,6 @@ LEAF(fork_trampoline) RESTORE_U_PCB_REG(v0, V0, k1) _MTC0 a0, COP_0_EXC_PC # set return address -/* - * The use of k1 for storing the PCB pointer must be done only - * after interrupts are disabled. Otherwise it will get overwritten - * by the interrupt code. - */ RESTORE_U_PCB_REG(v1, V1, k1) RESTORE_U_PCB_REG(a0, A0, k1) RESTORE_U_PCB_REG(a1, A1, k1) @@ -205,10 +192,10 @@ LEAF(fork_trampoline) RESTORE_U_PCB_REG(t1, T1, k1) RESTORE_U_PCB_REG(t2, T2, k1) RESTORE_U_PCB_REG(t3, T3, k1) - RESTORE_U_PCB_REG(t4, T4, k1) - RESTORE_U_PCB_REG(t5, T5, k1) - RESTORE_U_PCB_REG(t6, T6, k1) - RESTORE_U_PCB_REG(t7, T7, k1) + RESTORE_U_PCB_REG(ta0, TA0, k1) + RESTORE_U_PCB_REG(ta1, TA1, k1) + RESTORE_U_PCB_REG(ta2, TA2, k1) + RESTORE_U_PCB_REG(ta3, TA3, k1) RESTORE_U_PCB_REG(s0, S0, k1) RESTORE_U_PCB_REG(s1, S1, k1) RESTORE_U_PCB_REG(s2, S2, k1) @@ -224,6 +211,11 @@ LEAF(fork_trampoline) RESTORE_U_PCB_REG(s8, S8, k1) RESTORE_U_PCB_REG(ra, RA, k1) RESTORE_U_PCB_REG(sp, SP, k1) + li k1, ~SR_INT_MASK + and k0, k0, k1 + mfc0 k1, COP_0_STATUS_REG + and k1, k1, SR_INT_MASK + or k0, k0, k1 mtc0 k0, COP_0_STATUS_REG # switch to user mode (when eret...) HAZARD_DELAY sync @@ -279,9 +271,10 @@ NON_LEAF(mips_cpu_throw, STAND_FRAME_SIZE, ra) END(mips_cpu_throw) /* - *XXX Fixme: should be written to new interface that requires lock - * storage. We fake it for now. - * cpu_switch(struct thread *old, struct thread *new); + * cpu_switch(struct thread *old, struct thread *new, struct mutex *mtx); + * a0 - old + * a1 - new + * a2 - mtx * Find the highest priority process and resume it. */ NON_LEAF(cpu_switch, STAND_FRAME_SIZE, ra) @@ -310,17 +303,21 @@ NON_LEAF(cpu_switch, STAND_FRAME_SIZE, ra) SAVE_U_PCB_CONTEXT(ra, PREG_RA, a0) # save return address SAVE_U_PCB_CONTEXT(t0, PREG_SR, a0) # save status register SAVE_U_PCB_CONTEXT(gp, PREG_GP, a0) + jal getpc + nop +getpc: + SAVE_U_PCB_CONTEXT(ra, PREG_PC, a0) # save return address /* * FREEBSD_DEVELOPERS_FIXME: * In case there are CPU-specific registers that need * to be saved with the other registers do so here. */ - sw a3, TD_LOCK(a0) # Switchout td_lock + sw a2, TD_LOCK(a3) # Switchout td_lock mips_sw1: #if defined(SMP) && defined(SCHED_ULE) - la t0, _C_LABEL(blocked_lock) + PTR_LA t0, _C_LABEL(blocked_lock) blocked_loop: lw t1, TD_LOCK(a1) beq t0, t1, blocked_loop @@ -361,7 +358,7 @@ entry0: nop pgm: bltz s0, entry0set - li t1, MIPS_KSEG0_START + 0x0fff0000 # invalidate tlb entry + li t1, MIPS_KSEG0_START # invalidate tlb entry sll s0, PAGE_SHIFT + 1 addu t1, s0 mtc0 t1, COP_0_TLB_HI @@ -385,7 +382,7 @@ entry0set: * Now running on new u struct. */ sw2: - la t1, _C_LABEL(pmap_activate) # s7 = new proc pointer + PTR_LA t1, _C_LABEL(pmap_activate) # s7 = new proc pointer jalr t1 # s7 = new proc pointer move a0, s7 # BDSLOT /* @@ -410,6 +407,10 @@ sw2: * In case there are CPU-specific registers that need * to be restored with the other registers do so here. */ + mfc0 t0, COP_0_STATUS_REG + and t0, t0, SR_INT_MASK + and v0, v0, ~SR_INT_MASK + or v0, v0, t0 mtc0 v0, COP_0_STATUS_REG ITLBNOPFIX diff --git a/lib/libutil/logout.c b/sys/mips/mips/sys_machdep.c similarity index 61% rename from lib/libutil/logout.c rename to sys/mips/mips/sys_machdep.c index fe907e56f720..c316db33a722 100644 --- a/lib/libutil/logout.c +++ b/sys/mips/mips/sys_machdep.c @@ -1,6 +1,6 @@ /*- - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. + * Copyright (c) 1990 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 @@ -10,6 +10,10 @@ * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. * 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. @@ -25,50 +29,49 @@ * 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. + * + * from: @(#)sys_machdep.c 5.5 (Berkeley) 1/19/91 */ #include __FBSDID("$FreeBSD$"); -#if defined(LIBC_SCCS) && !defined(lint) -#if 0 -static char sccsid[] = "@(#)logout.c 8.1 (Berkeley) 6/4/93"; +#include +#include +#include +#include +#include +#include + +#include + +#ifndef _SYS_SYSPROTO_H_ +struct sysarch_args { + int op; + char *parms; +}; #endif -#endif /* LIBC_SCCS and not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -typedef struct utmp UTMP; int -logout(const char *line) +sysarch(td, uap) + struct thread *td; + register struct sysarch_args *uap; { - int fd; - UTMP ut; - int rval; + int error; + void *tlsbase; - if ((fd = open(_PATH_UTMP, O_RDWR, 0)) < 0) - return(0); - rval = 0; - while (read(fd, &ut, sizeof(UTMP)) == sizeof(UTMP)) { - if (!ut.ut_name[0] || strncmp(ut.ut_line, line, UT_LINESIZE)) - continue; - bzero(ut.ut_name, UT_NAMESIZE); - bzero(ut.ut_host, UT_HOSTSIZE); - ut.ut_time = _time_to_time32(time(NULL)); - (void)lseek(fd, -(off_t)sizeof(UTMP), L_INCR); - (void)write(fd, &ut, sizeof(UTMP)); - rval = 1; + switch (uap->op) { + case MIPS_SET_TLS : + td->td_md.md_tls = (void*)uap->parms; + error = 0; + break; + + case MIPS_GET_TLS : + tlsbase = td->td_md.md_tls; + error = copyout(&tlsbase, uap->parms, sizeof(tlsbase)); + break; + default: + error = EINVAL; } - (void)close(fd); - return(rval); + return (error); } diff --git a/sys/mips/mips/tick.c b/sys/mips/mips/tick.c index faae90ed57bc..bf147c53901f 100644 --- a/sys/mips/mips/tick.c +++ b/sys/mips/mips/tick.c @@ -33,6 +33,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_cputype.h" + #include #include #include @@ -45,19 +47,19 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include uint64_t counter_freq; -uint64_t cycles_per_tick; -uint64_t cycles_per_usec; -uint64_t cycles_per_sec; -uint64_t cycles_per_hz; -u_int32_t counter_upper = 0; -u_int32_t counter_lower_last = 0; -int tick_started = 0; +static uint64_t cycles_per_tick; +static uint64_t cycles_per_usec; +static uint64_t cycles_per_hz, cycles_per_stathz, cycles_per_profhz; + +static u_int32_t counter_upper = 0; +static u_int32_t counter_lower_last = 0; struct clk_ticks { @@ -97,13 +99,10 @@ mips_timer_early_init(uint64_t clock_hz) } void -cpu_initclocks(void) +platform_initclocks(void) { - if (!tick_started) { - tc_init(&counter_timecounter); - tick_started++; - } + tc_init(&counter_timecounter); } static uint64_t @@ -133,38 +132,38 @@ void mips_timer_init_params(uint64_t platform_counter_freq, int double_count) { + stathz = hz; + profhz = hz; + /* * XXX: Do not use printf here: uart code 8250 may use DELAY so this * function should be called before cninit. */ counter_freq = platform_counter_freq; - cycles_per_tick = counter_freq / 1000; - if (double_count) - cycles_per_tick *= 2; - cycles_per_hz = counter_freq / hz; - cycles_per_usec = counter_freq / (1 * 1000 * 1000); - cycles_per_sec = counter_freq ; - - counter_timecounter.tc_frequency = counter_freq; /* * XXX: Some MIPS32 cores update the Count register only every two * pipeline cycles. - * XXX2: We can read this from the hardware register on some - * systems. Need to investigate. + * We know this because of status registers in CP0, make it automatic. */ - if (double_count != 0) { - cycles_per_hz /= 2; - cycles_per_usec /= 2; - cycles_per_sec /= 2; - } - printf("hz=%d cyl_per_hz:%jd cyl_per_usec:%jd freq:%jd cyl_per_hz:%jd cyl_per_sec:%jd\n", + if (double_count != 0) + counter_freq /= 2; + + cycles_per_tick = counter_freq / 1000; + cycles_per_hz = counter_freq / hz; + cycles_per_stathz = counter_freq / stathz; + cycles_per_profhz = counter_freq / profhz; + cycles_per_usec = counter_freq / (1 * 1000 * 1000); + + counter_timecounter.tc_frequency = counter_freq; + printf("hz=%d cyl_per_tick:%jd cyl_per_usec:%jd freq:%jd " + "cyl_per_hz:%jd cyl_per_stathz:%jd cyl_per_profhz:%jd\n", hz, cycles_per_tick, cycles_per_usec, counter_freq, cycles_per_hz, - cycles_per_sec - ); + cycles_per_stathz, + cycles_per_profhz); set_cputicker(tick_ticker, counter_freq, 1); } @@ -229,9 +228,9 @@ DELAY(int n) /* Check to see if the timer has wrapped around. */ if (cur < last) - delta += (cur + (cycles_per_hz - last)); + delta += cur + (0xffffffff - last) + 1; else - delta += (cur - last); + delta += cur - last; last = cur; @@ -242,10 +241,10 @@ DELAY(int n) } } -#ifdef TARGET_OCTEON +#if 0 /* TARGET_OCTEON */ int64_t wheel_run = 0; -void octeon_led_run_wheel(void); +void octeon_led_run_wheel(); #endif /* @@ -282,25 +281,26 @@ clock_intr(void *arg) else hardclock_cpu(USERMODE(tf->sr)); } + /* Fire statclock at stathz. */ - cpu_ticks->stat_ticks += stathz; - if (cpu_ticks->stat_ticks >= cycles_per_hz) { - cpu_ticks->stat_ticks -= cycles_per_hz; + cpu_ticks->stat_ticks += cycles_per_tick; + if (cpu_ticks->stat_ticks >= cycles_per_stathz) { + cpu_ticks->stat_ticks -= cycles_per_stathz; statclock(USERMODE(tf->sr)); } /* Fire profclock at profhz, but only when needed. */ - cpu_ticks->prof_ticks += profhz; - if (cpu_ticks->prof_ticks >= cycles_per_hz) { - cpu_ticks->prof_ticks -= cycles_per_hz; + cpu_ticks->prof_ticks += cycles_per_tick; + if (cpu_ticks->prof_ticks >= cycles_per_profhz) { + cpu_ticks->prof_ticks -= cycles_per_profhz; if (profprocs != 0) profclock(USERMODE(tf->sr), tf->pc); } critical_exit(); -#ifdef TARGET_OCTEON +#if 0 /* TARGET_OCTEON */ /* Run the FreeBSD display once every hz ticks */ wheel_run += cycles_per_tick; - if (wheel_run >= cycles_per_sec) { + if (wheel_run >= cycles_per_usec * 1000000ULL) { wheel_run = 0; octeon_led_run_wheel(); } @@ -346,6 +346,7 @@ clock_attach(device_t dev) device_printf(dev, "bus_setup_intr returned %d\n", error); return (error); } + mips_wr_compare(mips_rd_count() + counter_freq / hz); return (0); } diff --git a/sys/mips/mips/tlb.S b/sys/mips/mips/tlb.S index 28636b125e75..46a15f81ca46 100644 --- a/sys/mips/mips/tlb.S +++ b/sys/mips/mips/tlb.S @@ -81,14 +81,12 @@ #define _MFC0 dmfc0 #define _MTC0 dmtc0 #define WIRED_SHIFT 34 -#define PAGE_SHIFT 34 #else #define _SLL sll #define _SRL srl #define _MFC0 mfc0 #define _MTC0 mtc0 #define WIRED_SHIFT 2 -#define PAGE_SHIFT 2 #endif .set noreorder # Noreorder is default style! #if defined(ISA_MIPS32) @@ -232,28 +230,33 @@ LEAF(Mips_TLBFlush) mtc0 zero, COP_0_STATUS_REG # Disable interrupts ITLBNOPFIX mfc0 t1, COP_0_TLB_WIRED - li v0, MIPS_KSEG3_START + 0x0fff0000 # invalid address _MFC0 t0, COP_0_TLB_HI # Save the PID - - _MTC0 v0, COP_0_TLB_HI # Mark entry high as invalid _MTC0 zero, COP_0_TLB_LO0 # Zero out low entry0. _MTC0 zero, COP_0_TLB_LO1 # Zero out low entry1. mtc0 zero, COP_0_TLB_PG_MASK # Zero out mask entry. + # + # Load invalid entry, each TLB entry should have it's own bogus + # address calculated by following expression: + # MIPS_KSEG0_START + 2 * i * PAGE_SIZE; + # One bogus value for every TLB entry might cause MCHECK exception + # + sll t3, t1, PGSHIFT + 1 + li v0, MIPS_KSEG0_START # invalid address + addu v0, t3 /* * Align the starting value (t1) and the upper bound (a0). */ 1: mtc0 t1, COP_0_TLB_INDEX # Set the index register. ITLBNOPFIX - _MTC0 t0, COP_0_TLB_HI # Restore the PID + _MTC0 v0, COP_0_TLB_HI # Mark entry high as invalid addu t1, t1, 1 # Increment index. - addu t0, t0, 8 * 1024 + addu v0, v0, 8 * 1024 MIPS_CPU_NOP_DELAY tlbwi # Write the TLB entry. MIPS_CPU_NOP_DELAY bne t1, a0, 1b nop - _MTC0 t0, COP_0_TLB_HI # Restore the PID mtc0 v1, COP_0_STATUS_REG # Restore the status register ITLBNOPFIX @@ -289,14 +292,14 @@ LEAF(Mips_TLBFlushAddr) tlbp # Probe for the entry. MIPS_CPU_NOP_DELAY mfc0 v0, COP_0_TLB_INDEX # See what we got - li t1, MIPS_KSEG0_START + 0x0fff0000 + li t1, MIPS_KSEG0_START bltz v0, 1f # index < 0 => !found nop # Load invalid entry, each TLB entry should have it's own bogus # address calculated by following expression: - # MIPS_KSEG0_START + 0x0fff0000 + 2 * i * PAGE_SIZE; + # MIPS_KSEG0_START + 2 * i * PAGE_SIZE; # One bogus value for every TLB entry might cause MCHECK exception - sll v0, PAGE_SHIFT + 1 + sll v0, PGSHIFT + 1 addu t1, v0 _MTC0 t1, COP_0_TLB_HI # Mark entry high as invalid @@ -424,17 +427,17 @@ LEAF(Mips_TLBRead) MIPS_CPU_NOP_DELAY mfc0 t2, COP_0_TLB_PG_MASK # fetch the hi entry _MFC0 t3, COP_0_TLB_HI # fetch the hi entry - _MFC0 t4, COP_0_TLB_LO0 # See what we got - _MFC0 t5, COP_0_TLB_LO1 # See what we got + _MFC0 ta0, COP_0_TLB_LO0 # See what we got + _MFC0 ta1, COP_0_TLB_LO1 # See what we got _MTC0 t0, COP_0_TLB_HI # restore PID MIPS_CPU_NOP_DELAY mtc0 v1, COP_0_STATUS_REG # Restore the status register ITLBNOPFIX sw t2, 0(a1) sw t3, 4(a1) - sw t4, 8(a1) + sw ta0, 8(a1) j ra - sw t5, 12(a1) + sw ta1, 12(a1) END(Mips_TLBRead) /*-------------------------------------------------------------------------- @@ -470,10 +473,19 @@ LEAF(mips_TBIAP) mfc0 v1, COP_0_STATUS_REG # save status register mtc0 zero, COP_0_STATUS_REG # disable interrupts - _MFC0 t4, COP_0_TLB_HI # Get current PID + _MFC0 ta0, COP_0_TLB_HI # Get current PID move t2, a0 mfc0 t1, COP_0_TLB_WIRED - li v0, MIPS_KSEG0_START + 0x0fff0000 # invalid address + # + # Load invalid entry, each TLB entry should have it's own bogus + # address calculated by following expression: + # MIPS_KSEG0_START + 2 * i * PAGE_SIZE; + # One bogus value for every TLB entry might cause MCHECK exception + # + sll t3, t1, PGSHIFT + 1 + li v0, MIPS_KSEG0_START # invalid address + addu v0, t3 + mfc0 t3, COP_0_TLB_PG_MASK # save current pgMask # do {} while (t1 < t2) @@ -495,11 +507,11 @@ LEAF(mips_TBIAP) tlbwi # invalidate the TLB entry 2: addu t1, t1, 1 - addu v0, 1 << (PAGE_SHIFT + 1) + addu v0, 1 << (PGSHIFT + 1) bne t1, t2, 1b nop - _MTC0 t4, COP_0_TLB_HI # restore PID + _MTC0 ta0, COP_0_TLB_HI # restore PID mtc0 t3, COP_0_TLB_PG_MASK # restore pgMask MIPS_CPU_NOP_DELAY mtc0 v1, COP_0_STATUS_REG # restore status register diff --git a/sys/mips/mips/trap.c b/sys/mips/mips/trap.c index 6d047ccdda22..5fdfabdb33ba 100644 --- a/sys/mips/mips/trap.c +++ b/sys/mips/mips/trap.c @@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$"); #include "opt_ddb.h" #include "opt_global.h" +#include "opt_ktrace.h" #define NO_REG_DEFS 1 /* Prevent asm.h from including regdef.h */ #include @@ -76,9 +77,9 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include +#include #include #include #include @@ -99,28 +100,17 @@ __FBSDID("$FreeBSD$"); #ifdef TRAP_DEBUG int trap_debug = 1; - #endif extern unsigned onfault_table[]; -extern void MipsKernGenException(void); -extern void MipsUserGenException(void); -extern void MipsKernIntr(void); -extern void MipsUserIntr(void); -extern void MipsTLBInvalidException(void); -extern void MipsKernTLBInvalidException(void); -extern void MipsUserTLBInvalidException(void); -extern void MipsTLBMissException(void); static void log_bad_page_fault(char *, struct trapframe *, int); static void log_frame_dump(struct trapframe *frame); static void get_mapping_info(vm_offset_t, pd_entry_t **, pt_entry_t **); #ifdef TRAP_DEBUG static void trap_frame_dump(struct trapframe *frame); - #endif -extern char edata[]; void (*machExceptionTable[]) (void)= { /* @@ -232,37 +222,16 @@ char *trap_type[] = { #if !defined(SMP) && (defined(DDB) || defined(DEBUG)) struct trapdebug trapdebug[TRAPSIZE], *trp = trapdebug; - #endif #if defined(DDB) || defined(DEBUG) void stacktrace(struct trapframe *); void logstacktrace(struct trapframe *); -int kdbpeek(int *); - -/* extern functions printed by name in stack backtraces */ -extern void MipsTLBMiss(void); -extern void MipsUserSyscallException(void); -extern char _locore[]; -extern char _locoreEnd[]; - -#endif /* DDB || DEBUG */ - -extern void MipsSwitchFPState(struct thread *, struct trapframe *); -extern void MipsFPTrap(u_int, u_int, u_int); - -u_int trap(struct trapframe *); -u_int MipsEmulateBranch(struct trapframe *, int, int, u_int); +#endif #define KERNLAND(x) ((int)(x) < 0) #define DELAYBRANCH(x) ((int)(x) < 0) -/* - * kdbpeekD(addr) - skip one word starting at 'addr', then read the second word - */ -#define kdbpeekD(addr) kdbpeek(((int *)(addr)) + 1) -int rrs_debug = 0; - /* * MIPS load/store access type */ @@ -306,8 +275,7 @@ extern char *syscallnames[]; * p->p_addr->u_pcb.pcb_onfault is set, otherwise, return old pc. */ u_int -trap(trapframe) - struct trapframe *trapframe; +trap(struct trapframe *trapframe) { int type, usermode; int i = 0; @@ -365,7 +333,7 @@ trap(trapframe) printf("cpuid = %d\n", PCPU_GET(cpuid)); #endif MachTLBGetPID(pid); - printf("badaddr = %p, pc = %p, ra = %p, sp = %p, sr = 0x%x, pid = %d, ASID = 0x%x\n", + printf("badaddr = 0x%0x, pc = 0x%0x, ra = 0x%0x, sp = 0x%0x, sr = 0x%x, pid = %d, ASID = 0x%x\n", trapframe->badvaddr, trapframe->pc, trapframe->ra, trapframe->sp, trapframe->sr, (curproc ? curproc->p_pid : -1), pid); @@ -389,7 +357,7 @@ trap(trapframe) ((type & ~T_USER) != T_SYSCALL)) { if (++count == 3) { trap_frame_dump(trapframe); - panic("too many faults at %p\n", last_badvaddr); + panic("too many faults at %x\n", last_badvaddr); } } else { last_badvaddr = this_badvaddr; @@ -538,17 +506,11 @@ dofault: struct vmspace *vm; vm_map_t map; int rv = 0; - int flag; vm = p->p_vmspace; map = &vm->vm_map; va = trunc_page((vm_offset_t)trapframe->badvaddr); - if ((vm_offset_t)trapframe->badvaddr < VM_MIN_KERNEL_ADDRESS) { - if (ftype & VM_PROT_WRITE) - flag = VM_FAULT_DIRTY; - else - flag = VM_FAULT_NORMAL; - } else { + if ((vm_offset_t)trapframe->badvaddr >= VM_MIN_KERNEL_ADDRESS) { /* * Don't allow user-mode faults in kernel * address space. @@ -564,14 +526,14 @@ dofault: ++p->p_lock; PROC_UNLOCK(p); - rv = vm_fault(map, va, ftype, flag); + rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); PROC_LOCK(p); --p->p_lock; PROC_UNLOCK(p); #ifdef VMFAULT_TRACE - printf("vm_fault(%x (pmap %x), %x (%x), %x, %d) -> %x at pc %x\n", - map, &vm->vm_pmap, va, trapframe->badvaddr, ftype, flag, + printf("vm_fault(%p (pmap %p), %x (%x), %x, %d) -> %x at pc %x\n", + map, &vm->vm_pmap, va, trapframe->badvaddr, ftype, VM_FAULT_NORMAL, rv, trapframe->pc); #endif @@ -644,7 +606,6 @@ dofault: struct trapframe *locr0 = td->td_frame; struct sysent *callp; unsigned int code; - unsigned int tpc; int nargs, nsaved; register_t args[8]; @@ -660,7 +621,7 @@ dofault: thread_user_enter(td); #endif /* compute next PC after syscall instruction */ - tpc = trapframe->pc; /* Remember if restart */ + td->td_pcb->pcb_tpc = trapframe->pc; /* Remember if restart */ if (DELAYBRANCH(trapframe->cause)) { /* Check BD bit */ locr0->pc = MipsEmulateBranch(locr0, trapframe->pc, 0, 0); @@ -761,44 +722,7 @@ dofault: locr0 = td->td_frame; #endif trapdebug_enter(locr0, -code); - switch (i) { - case 0: - if (quad_syscall && code != SYS_lseek) { - /* - * System call invoked through the - * SYS___syscall interface but the - * return value is really just 32 - * bits. - */ - locr0->v0 = td->td_retval[0]; - if (_QUAD_LOWWORD) - locr0->v1 = td->td_retval[0]; - locr0->a3 = 0; - } else { - locr0->v0 = td->td_retval[0]; - locr0->v1 = td->td_retval[1]; - locr0->a3 = 0; - } - break; - - case ERESTART: - locr0->pc = tpc; - break; - - case EJUSTRETURN: - break; /* nothing to do */ - - default: - if (quad_syscall && code != SYS_lseek) { - locr0->v0 = i; - if (_QUAD_LOWWORD) - locr0->v1 = i; - locr0->a3 = 1; - } else { - locr0->v0 = i; - locr0->a3 = 1; - } - } + cpu_set_syscall_retval(td, i); /* * The sync'ing of I & D caches for SYS_ptrace() is @@ -824,7 +748,7 @@ dofault: td->td_locks)); userret(td, trapframe); #ifdef KTRACE - if (KTRPOINT(p, KTR_SYSRET)) + if (KTRPOINT(td, KTR_SYSRET)) ktrsysret(code, i, td->td_retval[0]); #endif /* @@ -849,7 +773,7 @@ dofault: case T_BREAK + T_USER: { - unsigned int va, instr; + uintptr_t va, instr; /* compute address of break instruction */ va = trapframe->pc; @@ -882,13 +806,13 @@ dofault: case T_IWATCH + T_USER: case T_DWATCH + T_USER: { - unsigned int va; + uintptr_t va; /* compute address of trapped instruction */ va = trapframe->pc; if (DELAYBRANCH(trapframe->cause)) va += sizeof(int); - printf("watch exception @ 0x%x\n", va); + printf("watch exception @ %p\n", (void *)va); i = SIGTRAP; addr = va; break; @@ -896,7 +820,7 @@ dofault: case T_TRAP + T_USER: { - unsigned int va, instr; + uintptr_t va, instr; struct trapframe *locr0 = td->td_frame; /* compute address of trap instruction */ @@ -929,7 +853,7 @@ dofault: goto err; break; case T_COP_UNUSABLE + T_USER: -#if defined(SOFTFLOAT) +#if !defined(CPU_HAVEFPU) /* FP (COP1) instruction */ if ((trapframe->cause & CR_COP_ERR) == 0x10000000) { i = SIGILL; @@ -1090,27 +1014,27 @@ trapDump(char *msg) /* * Return the resulting PC as if the branch was executed. */ -u_int -MipsEmulateBranch(struct trapframe *framePtr, int instPC, int fpcCSR, - u_int instptr) +uintptr_t +MipsEmulateBranch(struct trapframe *framePtr, uintptr_t instPC, int fpcCSR, + uintptr_t instptr) { InstFmt inst; register_t *regsPtr = (register_t *) framePtr; - unsigned retAddr = 0; + uintptr_t retAddr = 0; int condition; #define GetBranchDest(InstPtr, inst) \ - ((unsigned)InstPtr + 4 + ((short)inst.IType.imm << 2)) + (InstPtr + 4 + ((short)inst.IType.imm << 2)) if (instptr) { if (instptr < MIPS_KSEG0_START) - inst.word = fuword((void *)instptr); + inst.word = fuword32((void *)instptr); else inst = *(InstFmt *) instptr; } else { if ((vm_offset_t)instPC < MIPS_KSEG0_START) - inst.word = fuword((void *)instPC); + inst.word = fuword32((void *)instPC); else inst = *(InstFmt *) instPC; } @@ -1168,7 +1092,7 @@ MipsEmulateBranch(struct trapframe *framePtr, int instPC, int fpcCSR, case OP_J: case OP_JAL: retAddr = (inst.JType.target << 2) | - ((unsigned)instPC & 0xF0000000); + ((unsigned)(instPC + 4) & 0xF0000000); break; case OP_BEQ: @@ -1230,348 +1154,53 @@ MipsEmulateBranch(struct trapframe *framePtr, int instPC, int fpcCSR, #if defined(DDB) || defined(DEBUG) -#define MIPS_JR_RA 0x03e00008 /* instruction code for jr ra */ - -/* forward */ -char *fn_name(unsigned addr); - /* * Print a stack backtrace. */ void stacktrace(struct trapframe *regs) { - stacktrace_subr(regs, printf); + stacktrace_subr(regs->pc, regs->sp, regs->ra, printf); } - -void -stacktrace_subr(struct trapframe *regs, int (*printfn) (const char *,...)) -{ - InstFmt i; - unsigned a0, a1, a2, a3, pc, sp, fp, ra, va, subr; - unsigned instr, mask; - unsigned int frames = 0; - int more, stksize; - - /* get initial values from the exception frame */ - sp = regs->sp; - pc = regs->pc; - fp = regs->s8; - ra = regs->ra; /* May be a 'leaf' function */ - a0 = regs->a0; - a1 = regs->a1; - a2 = regs->a2; - a3 = regs->a3; - -/* Jump here when done with a frame, to start a new one */ -loop: - -/* Jump here after a nonstandard (interrupt handler) frame */ - stksize = 0; - subr = 0; - if (frames++ > 100) { - (*printfn) ("\nstackframe count exceeded\n"); - /* return breaks stackframe-size heuristics with gcc -O2 */ - goto finish; /* XXX */ - } - /* check for bad SP: could foul up next frame */ - if (sp & 3 || sp < 0x80000000) { - (*printfn) ("SP 0x%x: not in kernel\n", sp); - ra = 0; - subr = 0; - goto done; - } -#define Between(x, y, z) \ - ( ((x) <= (y)) && ((y) < (z)) ) -#define pcBetween(a,b) \ - Between((unsigned)a, pc, (unsigned)b) - - /* - * Check for current PC in exception handler code that don't have a - * preceding "j ra" at the tail of the preceding function. Depends - * on relative ordering of functions in exception.S, swtch.S. - */ - if (pcBetween(MipsKernGenException, MipsUserGenException)) - subr = (unsigned)MipsKernGenException; - else if (pcBetween(MipsUserGenException, MipsKernIntr)) - subr = (unsigned)MipsUserGenException; - else if (pcBetween(MipsKernIntr, MipsUserIntr)) - subr = (unsigned)MipsKernIntr; - else if (pcBetween(MipsUserIntr, MipsTLBInvalidException)) - subr = (unsigned)MipsUserIntr; - else if (pcBetween(MipsTLBInvalidException, - MipsKernTLBInvalidException)) - subr = (unsigned)MipsTLBInvalidException; - else if (pcBetween(MipsKernTLBInvalidException, - MipsUserTLBInvalidException)) - subr = (unsigned)MipsKernTLBInvalidException; - else if (pcBetween(MipsUserTLBInvalidException, MipsTLBMissException)) - subr = (unsigned)MipsUserTLBInvalidException; - else if (pcBetween(cpu_switch, MipsSwitchFPState)) - subr = (unsigned)cpu_switch; - else if (pcBetween(_locore, _locoreEnd)) { - subr = (unsigned)_locore; - ra = 0; - goto done; - } - /* check for bad PC */ - if (pc & 3 || pc < (unsigned)0x80000000 || pc >= (unsigned)edata) { - (*printfn) ("PC 0x%x: not in kernel\n", pc); - ra = 0; - goto done; - } - /* - * Find the beginning of the current subroutine by scanning - * backwards from the current PC for the end of the previous - * subroutine. - */ - if (!subr) { - va = pc - sizeof(int); - while ((instr = kdbpeek((int *)va)) != MIPS_JR_RA) - va -= sizeof(int); - va += 2 * sizeof(int); /* skip back over branch & delay slot */ - /* skip over nulls which might separate .o files */ - while ((instr = kdbpeek((int *)va)) == 0) - va += sizeof(int); - subr = va; - } - /* scan forwards to find stack size and any saved registers */ - stksize = 0; - more = 3; - mask = 0; - for (va = subr; more; va += sizeof(int), - more = (more == 3) ? 3 : more - 1) { - /* stop if hit our current position */ - if (va >= pc) - break; - instr = kdbpeek((int *)va); - i.word = instr; - switch (i.JType.op) { - case OP_SPECIAL: - switch (i.RType.func) { - case OP_JR: - case OP_JALR: - more = 2; /* stop after next instruction */ - break; - - case OP_SYSCALL: - case OP_BREAK: - more = 1; /* stop now */ - }; - break; - - case OP_BCOND: - case OP_J: - case OP_JAL: - case OP_BEQ: - case OP_BNE: - case OP_BLEZ: - case OP_BGTZ: - more = 2; /* stop after next instruction */ - break; - - case OP_COP0: - case OP_COP1: - case OP_COP2: - case OP_COP3: - switch (i.RType.rs) { - case OP_BCx: - case OP_BCy: - more = 2; /* stop after next instruction */ - }; - break; - - case OP_SW: - /* look for saved registers on the stack */ - if (i.IType.rs != 29) - break; - /* only restore the first one */ - if (mask & (1 << i.IType.rt)) - break; - mask |= (1 << i.IType.rt); - switch (i.IType.rt) { - case 4:/* a0 */ - a0 = kdbpeek((int *)(sp + (short)i.IType.imm)); - break; - - case 5:/* a1 */ - a1 = kdbpeek((int *)(sp + (short)i.IType.imm)); - break; - - case 6:/* a2 */ - a2 = kdbpeek((int *)(sp + (short)i.IType.imm)); - break; - - case 7:/* a3 */ - a3 = kdbpeek((int *)(sp + (short)i.IType.imm)); - break; - - case 30: /* fp */ - fp = kdbpeek((int *)(sp + (short)i.IType.imm)); - break; - - case 31: /* ra */ - ra = kdbpeek((int *)(sp + (short)i.IType.imm)); - } - break; - - case OP_SD: - /* look for saved registers on the stack */ - if (i.IType.rs != 29) - break; - /* only restore the first one */ - if (mask & (1 << i.IType.rt)) - break; - mask |= (1 << i.IType.rt); - switch (i.IType.rt) { - case 4:/* a0 */ - a0 = kdbpeekD((int *)(sp + (short)i.IType.imm)); - break; - - case 5:/* a1 */ - a1 = kdbpeekD((int *)(sp + (short)i.IType.imm)); - break; - - case 6:/* a2 */ - a2 = kdbpeekD((int *)(sp + (short)i.IType.imm)); - break; - - case 7:/* a3 */ - a3 = kdbpeekD((int *)(sp + (short)i.IType.imm)); - break; - - case 30: /* fp */ - fp = kdbpeekD((int *)(sp + (short)i.IType.imm)); - break; - - case 31: /* ra */ - ra = kdbpeekD((int *)(sp + (short)i.IType.imm)); - } - break; - - case OP_ADDI: - case OP_ADDIU: - /* look for stack pointer adjustment */ - if (i.IType.rs != 29 || i.IType.rt != 29) - break; - stksize = -((short)i.IType.imm); - } - } - -done: - (*printfn) ("%s+%x (%x,%x,%x,%x) ra %x sz %d\n", - fn_name(subr), pc - subr, a0, a1, a2, a3, ra, stksize); - - if (ra) { - if (pc == ra && stksize == 0) - (*printfn) ("stacktrace: loop!\n"); - else { - pc = ra; - sp += stksize; - ra = 0; - goto loop; - } - } else { -finish: - if (curproc) - (*printfn) ("pid %d\n", curproc->p_pid); - else - (*printfn) ("curproc NULL\n"); - } -} - -/* - * Functions ``special'' enough to print by name - */ -#ifdef __STDC__ -#define Name(_fn) { (void*)_fn, # _fn } -#else -#define Name(_fn) { _fn, "_fn"} #endif -static struct { - void *addr; - char *name; -} names[] = { - - Name(trap), - Name(MipsKernGenException), - Name(MipsUserGenException), - Name(MipsKernIntr), - Name(MipsUserIntr), - Name(cpu_switch), - { - 0, 0 - } -}; - -/* - * Map a function address to a string name, if known; or a hex string. - */ -char * -fn_name(unsigned addr) -{ - static char buf[17]; - int i = 0; - -#ifdef DDB - db_expr_t diff; - c_db_sym_t sym; - char *symname; - - diff = 0; - symname = NULL; - sym = db_search_symbol((db_addr_t)addr, DB_STGY_ANY, &diff); - db_symbol_values(sym, (const char **)&symname, (db_expr_t *)0); - if (symname && diff == 0) - return (symname); -#endif - - for (i = 0; names[i].name; i++) - if (names[i].addr == (void *)addr) - return (names[i].name); - sprintf(buf, "%x", addr); - return (buf); -} - -#endif /* DDB */ static void log_frame_dump(struct trapframe *frame) { log(LOG_ERR, "Trapframe Register Dump:\n"); - log(LOG_ERR, "\tzero: %08x\tat: %08x\tv0: %08x\tv1: %08x\n", - 0, frame->ast, frame->v0, frame->v1); + log(LOG_ERR, "\tzero: %p\tat: %p\tv0: %p\tv1: %p\n", + (void *)0, (void *)frame->ast, (void *)frame->v0, (void *)frame->v1); - log(LOG_ERR, "\ta0: %08x\ta1: %08x\ta2: %08x\ta3: %08x\n", - frame->a0, frame->a1, frame->a2, frame->a3); + log(LOG_ERR, "\ta0: %p\ta1: %p\ta2: %p\ta3: %p\n", + (void *)frame->a0, (void *)frame->a1, (void *)frame->a2, (void *)frame->a3); - log(LOG_ERR, "\tt0: %08x\tt1: %08x\tt2: %08x\tt3: %08x\n", - frame->t0, frame->t1, frame->t2, frame->t3); + log(LOG_ERR, "\tt0: %p\tt1: %p\tt2: %p\tt3: %p\n", + (void *)frame->t0, (void *)frame->t1, (void *)frame->t2, (void *)frame->t3); - log(LOG_ERR, "\tt4: %08x\tt5: %08x\tt6: %08x\tt7: %08x\n", - frame->t4, frame->t5, frame->t6, frame->t7); + log(LOG_ERR, "\tt4: %p\tt5: %p\tt6: %p\tt7: %p\n", + (void *)frame->t4, (void *)frame->t5, (void *)frame->t6, (void *)frame->t7); - log(LOG_ERR, "\tt8: %08x\tt9: %08x\ts0: %08x\ts1: %08x\n", - frame->t8, frame->t9, frame->s0, frame->s1); + log(LOG_ERR, "\tt8: %p\tt9: %p\ts0: %p\ts1: %p\n", + (void *)frame->t8, (void *)frame->t9, (void *)frame->s0, (void *)frame->s1); - log(LOG_ERR, "\ts2: %08x\ts3: %08x\ts4: %08x\ts5: %08x\n", - frame->s2, frame->s3, frame->s4, frame->s5); + log(LOG_ERR, "\ts2: %p\ts3: %p\ts4: %p\ts5: %p\n", + (void *)frame->s2, (void *)frame->s3, (void *)frame->s4, (void *)frame->s5); - log(LOG_ERR, "\ts6: %08x\ts7: %08x\tk0: %08x\tk1: %08x\n", - frame->s6, frame->s7, frame->k0, frame->k1); + log(LOG_ERR, "\ts6: %p\ts7: %p\tk0: %p\tk1: %p\n", + (void *)frame->s6, (void *)frame->s7, (void *)frame->k0, (void *)frame->k1); - log(LOG_ERR, "\tgp: %08x\tsp: %08x\ts8: %08x\tra: %08x\n", - frame->gp, frame->sp, frame->s8, frame->ra); + log(LOG_ERR, "\tgp: %p\tsp: %p\ts8: %p\tra: %p\n", + (void *)frame->gp, (void *)frame->sp, (void *)frame->s8, (void *)frame->ra); - log(LOG_ERR, "\tsr: %08x\tmullo: %08x\tmulhi: %08x\tbadvaddr: %08x\n", - frame->sr, frame->mullo, frame->mulhi, frame->badvaddr); + log(LOG_ERR, "\tsr: %p\tmullo: %p\tmulhi: %p\tbadvaddr: %p\n", + (void *)frame->sr, (void *)frame->mullo, (void *)frame->mulhi, (void *)frame->badvaddr); #ifdef IC_REG - log(LOG_ERR, "\tcause: %08x\tpc: %08x\tic: %08x\n", - frame->cause, frame->pc, frame->ic); + log(LOG_ERR, "\tcause: %p\tpc: %p\tic: %p\n", + (void *)frame->cause, (void *)frame->pc, (void *)frame->ic); #else - log(LOG_ERR, "\tcause: %08x\tpc: %08x\n", - frame->cause, frame->pc); + log(LOG_ERR, "\tcause: %p\tpc: %p\n", + (void *)frame->cause, (void *)frame->pc); #endif } @@ -1580,39 +1209,39 @@ static void trap_frame_dump(struct trapframe *frame) { printf("Trapframe Register Dump:\n"); - printf("\tzero: %08x\tat: %08x\tv0: %08x\tv1: %08x\n", - 0, frame->ast, frame->v0, frame->v1); + printf("\tzero: %p\tat: %p\tv0: %p\tv1: %p\n", + (void *)0, (void *)frame->ast, (void *)frame->v0, (void *)frame->v1); - printf("\ta0: %08x\ta1: %08x\ta2: %08x\ta3: %08x\n", - frame->a0, frame->a1, frame->a2, frame->a3); + printf("\ta0: %p\ta1: %p\ta2: %p\ta3: %p\n", + (void *)frame->a0, (void *)frame->a1, (void *)frame->a2, (void *)frame->a3); - printf("\tt0: %08x\tt1: %08x\tt2: %08x\tt3: %08x\n", - frame->t0, frame->t1, frame->t2, frame->t3); + printf("\tt0: %p\tt1: %p\tt2: %p\tt3: %p\n", + (void *)frame->t0, (void *)frame->t1, (void *)frame->t2, (void *)frame->t3); - printf("\tt4: %08x\tt5: %08x\tt6: %08x\tt7: %08x\n", - frame->t4, frame->t5, frame->t6, frame->t7); + printf("\tt4: %p\tt5: %p\tt6: %p\tt7: %p\n", + (void *)frame->t4, (void *)frame->t5, (void *)frame->t6, (void *)frame->t7); - printf("\tt8: %08x\tt9: %08x\ts0: %08x\ts1: %08x\n", - frame->t8, frame->t9, frame->s0, frame->s1); + printf("\tt8: %p\tt9: %p\ts0: %p\ts1: %p\n", + (void *)frame->t8, (void *)frame->t9, (void *)frame->s0, (void *)frame->s1); - printf("\ts2: %08x\ts3: %08x\ts4: %08x\ts5: %08x\n", - frame->s2, frame->s3, frame->s4, frame->s5); + printf("\ts2: %p\ts3: %p\ts4: %p\ts5: %p\n", + (void *)frame->s2, (void *)frame->s3, (void *)frame->s4, (void *)frame->s5); - printf("\ts6: %08x\ts7: %08x\tk0: %08x\tk1: %08x\n", - frame->s6, frame->s7, frame->k0, frame->k1); + printf("\ts6: %p\ts7: %p\tk0: %p\tk1: %p\n", + (void *)frame->s6, (void *)frame->s7, (void *)frame->k0, (void *)frame->k1); - printf("\tgp: %08x\tsp: %08x\ts8: %08x\tra: %08x\n", - frame->gp, frame->sp, frame->s8, frame->ra); + printf("\tgp: %p\tsp: %p\ts8: %p\tra: %p\n", + (void *)frame->gp, (void *)frame->sp, (void *)frame->s8, (void *)frame->ra); - printf("\tsr: %08x\tmullo: %08x\tmulhi: %08x\tbadvaddr: %08x\n", - frame->sr, frame->mullo, frame->mulhi, frame->badvaddr); + printf("\tsr: %p\tmullo: %p\tmulhi: %p\tbadvaddr: %p\n", + (void *)frame->sr, (void *)frame->mullo, (void *)frame->mulhi, (void *)frame->badvaddr); #ifdef IC_REG - printf("\tcause: %08x\tpc: %08x\tic: %08x\n", - frame->cause, frame->pc, frame->ic); + printf("\tcause: %p\tpc: %p\tic: %p\n", + (void *)frame->cause, (void *)frame->pc, (void *)frame->ic); #else - printf("\tcause: %08x\tpc: %08x\n", - frame->cause, frame->pc); + printf("\tcause: %p\tpc: %p\n", + (void *)frame->cause, (void *)frame->pc); #endif } @@ -1667,12 +1296,12 @@ log_bad_page_fault(char *msg, struct trapframe *frame, int trap_type) } pc = frame->pc + (DELAYBRANCH(frame->cause) ? 4 : 0); - log(LOG_ERR, "%s: pid %d (%s), uid %d: pc 0x%x got a %s fault at 0x%x\n", + log(LOG_ERR, "%s: pid %d (%s), uid %d: pc %p got a %s fault at %p\n", msg, p->p_pid, p->p_comm, p->p_ucred ? p->p_ucred->cr_uid : -1, - pc, + (void *)pc, read_or_write, - frame->badvaddr); + (void *)frame->badvaddr); /* log registers in trap frame */ log_frame_dump(frame); @@ -1687,8 +1316,8 @@ log_bad_page_fault(char *msg, struct trapframe *frame, int trap_type) (trap_type != T_BUS_ERR_IFETCH) && useracc((caddr_t)pc, sizeof(int) * 4, VM_PROT_READ)) { /* dump page table entry for faulting instruction */ - log(LOG_ERR, "Page table info for pc address 0x%x: pde = %p, pte = 0x%lx\n", - pc, *pdep, ptep ? *ptep : 0); + log(LOG_ERR, "Page table info for pc address %p: pde = %p, pte = 0x%lx\n", + (void *)pc, *pdep, ptep ? *ptep : 0); addr = (unsigned int *)pc; log(LOG_ERR, "Dumping 4 words starting at pc address %p: \n", @@ -1696,8 +1325,8 @@ log_bad_page_fault(char *msg, struct trapframe *frame, int trap_type) log(LOG_ERR, "%08x %08x %08x %08x\n", addr[0], addr[1], addr[2], addr[3]); } else { - log(LOG_ERR, "pc address 0x%x is inaccessible, pde = 0x%p, pte = 0x%lx\n", - pc, *pdep, ptep ? *ptep : 0); + log(LOG_ERR, "pc address %p is inaccessible, pde = 0x%p, pte = 0x%lx\n", + (void *)pc, *pdep, ptep ? *ptep : 0); } /* panic("Bad trap");*/ } @@ -1806,8 +1435,9 @@ emulate_unaligned_access(struct trapframe *frame) else frame->pc += 4; - log(LOG_INFO, "Unaligned %s: pc=0x%x, badvaddr=0x%x\n", - access_name[access_type - 1], pc, frame->badvaddr); + log(LOG_INFO, "Unaligned %s: pc=%p, badvaddr=%p\n", + access_name[access_type - 1], (void *)pc, + (void *)frame->badvaddr); } } return access_type; diff --git a/sys/mips/mips/vm_machdep.c b/sys/mips/mips/vm_machdep.c index 26b64778b8cb..f76dc4d74f0a 100644 --- a/sys/mips/mips/vm_machdep.c +++ b/sys/mips/mips/vm_machdep.c @@ -41,10 +41,14 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_cputype.h" +#include "opt_ddb.h" + #include #include #include #include +#include #include #include #include @@ -52,11 +56,11 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include -#include #include #include @@ -141,14 +145,14 @@ cpu_fork(register struct thread *td1,register struct proc *p2, if (td1 == PCPU_GET(fpcurthread)) MipsSaveCurFPState(td1); - pcb2->pcb_context.val[PCB_REG_RA] = (register_t)fork_trampoline; + pcb2->pcb_context[PCB_REG_RA] = (register_t)fork_trampoline; /* Make sp 64-bit aligned */ - pcb2->pcb_context.val[PCB_REG_SP] = (register_t)(((vm_offset_t)td2->td_pcb & + pcb2->pcb_context[PCB_REG_SP] = (register_t)(((vm_offset_t)td2->td_pcb & ~(sizeof(__int64_t) - 1)) - STAND_FRAME_SIZE); - pcb2->pcb_context.val[PCB_REG_S0] = (register_t)fork_return; - pcb2->pcb_context.val[PCB_REG_S1] = (register_t)td2; - pcb2->pcb_context.val[PCB_REG_S2] = (register_t)td2->td_frame; - pcb2->pcb_context.val[PCB_REG_SR] = SR_INT_MASK; + pcb2->pcb_context[PCB_REG_S0] = (register_t)fork_return; + pcb2->pcb_context[PCB_REG_S1] = (register_t)td2; + pcb2->pcb_context[PCB_REG_S2] = (register_t)td2->td_frame; + pcb2->pcb_context[PCB_REG_SR] = SR_INT_MASK & mips_rd_status(); /* * FREEBSD_DEVELOPERS_FIXME: * Setup any other CPU-Specific registers (Not MIPS Standard) @@ -156,10 +160,11 @@ cpu_fork(register struct thread *td1,register struct proc *p2, * that are needed. */ + td2->td_md.md_tls = td1->td_md.md_tls; td2->td_md.md_saved_intr = MIPS_SR_INT_IE; td2->td_md.md_spinlock_count = 1; #ifdef TARGET_OCTEON - pcb2->pcb_context.val[PCB_REG_SR] |= MIPS_SR_COP_2_BIT | MIPS32_SR_PX | MIPS_SR_UX | MIPS_SR_KX | MIPS_SR_SX; + pcb2->pcb_context[PCB_REG_SR] |= MIPS_SR_COP_2_BIT | MIPS32_SR_PX | MIPS_SR_UX | MIPS_SR_KX | MIPS_SR_SX; #endif } @@ -177,8 +182,8 @@ cpu_set_fork_handler(struct thread *td, void (*func) __P((void *)), void *arg) * Note that the trap frame follows the args, so the function * is really called like this: func(arg, frame); */ - td->td_pcb->pcb_context.val[PCB_REG_S0] = (register_t) func; - td->td_pcb->pcb_context.val[PCB_REG_S1] = (register_t) arg; + td->td_pcb->pcb_context[PCB_REG_S0] = (register_t) func; + td->td_pcb->pcb_context[PCB_REG_S1] = (register_t) arg; } void @@ -256,6 +261,62 @@ cpu_thread_alloc(struct thread *td) } } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + struct trapframe *locr0 = td->td_frame; + unsigned int code; + int quad_syscall; + + code = locr0->v0; + quad_syscall = 0; + if (code == SYS_syscall) + code = locr0->a0; + else if (code == SYS___syscall) { + code = _QUAD_LOWWORD ? locr0->a1 : locr0->a0; + quad_syscall = 1; + } + + switch (error) { + case 0: + if (quad_syscall && code != SYS_lseek) { + /* + * System call invoked through the + * SYS___syscall interface but the + * return value is really just 32 + * bits. + */ + locr0->v0 = td->td_retval[0]; + if (_QUAD_LOWWORD) + locr0->v1 = td->td_retval[0]; + locr0->a3 = 0; + } else { + locr0->v0 = td->td_retval[0]; + locr0->v1 = td->td_retval[1]; + locr0->a3 = 0; + } + break; + + case ERESTART: + locr0->pc = td->td_pcb->pcb_tpc; + break; + + case EJUSTRETURN: + break; /* nothing to do */ + + default: + if (quad_syscall && code != SYS_lseek) { + locr0->v0 = error; + if (_QUAD_LOWWORD) + locr0->v1 = error; + locr0->a3 = 1; + } else { + locr0->v0 = error; + locr0->a3 = 1; + } + } +} + /* * Initialize machine state (pcb and trap frame) for a new thread about to * upcall. Put enough state in the new thread's PCB to get it to go back @@ -291,20 +352,18 @@ cpu_set_upcall(struct thread *td, struct thread *td0) * Set registers for trampoline to user mode. */ - pcb2->pcb_context.val[PCB_REG_RA] = (register_t)fork_trampoline; + pcb2->pcb_context[PCB_REG_RA] = (register_t)fork_trampoline; /* Make sp 64-bit aligned */ - pcb2->pcb_context.val[PCB_REG_SP] = (register_t)(((vm_offset_t)td->td_pcb & + pcb2->pcb_context[PCB_REG_SP] = (register_t)(((vm_offset_t)td->td_pcb & ~(sizeof(__int64_t) - 1)) - STAND_FRAME_SIZE); - pcb2->pcb_context.val[PCB_REG_S0] = (register_t)fork_return; - pcb2->pcb_context.val[PCB_REG_S1] = (register_t)td; - pcb2->pcb_context.val[PCB_REG_S2] = (register_t)td->td_frame; - - + pcb2->pcb_context[PCB_REG_S0] = (register_t)fork_return; + pcb2->pcb_context[PCB_REG_S1] = (register_t)td; + pcb2->pcb_context[PCB_REG_S2] = (register_t)td->td_frame; /* Dont set IE bit in SR. sched lock release will take care of it */ -/* idle_mask is jmips pcb2->pcb_context.val[11] = (ALL_INT_MASK & idle_mask); */ - pcb2->pcb_context.val[PCB_REG_SR] = SR_INT_MASK; + pcb2->pcb_context[PCB_REG_SR] = SR_INT_MASK & mips_rd_status(); + #ifdef TARGET_OCTEON - pcb2->pcb_context.val[PCB_REG_SR] |= MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT | + pcb2->pcb_context[PCB_REG_SR] |= MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT | MIPS32_SR_PX | MIPS_SR_UX | MIPS_SR_KX | MIPS_SR_SX; #endif @@ -335,14 +394,14 @@ cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg, stack_t *stack) { struct trapframe *tf; - u_int32_t sp; + register_t sp; /* * At the point where a function is called, sp must be 8 * byte aligned[for compatibility with 64-bit CPUs] * in ``See MIPS Run'' by D. Sweetman, p. 269 * align stack */ - sp = ((uint32_t)(stack->ss_sp + stack->ss_size) & ~0x7) - + sp = ((register_t)(stack->ss_sp + stack->ss_size) & ~0x7) - STAND_FRAME_SIZE; /* @@ -353,9 +412,18 @@ cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg, bzero(tf, sizeof(struct trapframe)); tf->sp = (register_t)sp; tf->pc = (register_t)entry; + /* + * MIPS ABI requires T9 to be the same as PC + * in subroutine entry point + */ + tf->t9 = (register_t)entry; tf->a0 = (register_t)arg; - tf->sr = SR_KSU_USER | SR_EXL; + /* + * Keep interrupt mask + */ + tf->sr = SR_KSU_USER | SR_EXL | (SR_INT_MASK & mips_rd_status()) | + MIPS_SR_INT_IE; #ifdef TARGET_OCTEON tf->sr |= MIPS_SR_INT_IE | MIPS_SR_COP_0_BIT | MIPS_SR_UX | MIPS_SR_KX; @@ -390,34 +458,6 @@ kvtop(void *addr) #define ZIDLE_LO(v) ((v) * 2 / 3) #define ZIDLE_HI(v) ((v) * 4 / 5) -/* - * Tell whether this address is in some physical memory region. - * Currently used by the kernel coredump code in order to avoid - * dumping non-memory physical address space. - */ -int -is_physical_memory(vm_offset_t addr) -{ - if (addr >= SDRAM_ADDR_START && addr <= SDRAM_ADDR_END) - return 1; - else - return 0; -} - -int -is_cacheable_mem(vm_offset_t pa) -{ - if ((pa >= SDRAM_ADDR_START && pa <= SDRAM_ADDR_END) || -#ifdef FLASH_ADDR_START - (pa >= FLASH_ADDR_START && pa <= FLASH_ADDR_END)) -#else - 0) -#endif - return 1; - else - return 0; -} - /* * Allocate a pool of sf_bufs (sendfile(2) or "super-fast" if you prefer. :-)) */ @@ -466,6 +506,12 @@ sf_buf_alloc(struct vm_page *m, int flags) nsfbufsused++; nsfbufspeak = imax(nsfbufspeak, nsfbufsused); } + /* + * Flush all mappings in order to have up to date + * physycal memory + */ + pmap_flush_pvcache(sf->m); + mips_dcache_inv_range(sf->kva, PAGE_SIZE); goto done; } } @@ -507,6 +553,10 @@ sf_buf_free(struct sf_buf *sf) { mtx_lock(&sf_buf_lock); sf->ref_count--; + /* + * Make sure all changes in KVA end up in physical memory + */ + mips_dcache_wbinv_range(sf->kva, PAGE_SIZE); if (sf->ref_count == 0) { TAILQ_INSERT_TAIL(&sf_buf_freelist, sf, free_entry); nsfbufsused--; @@ -528,7 +578,7 @@ int cpu_set_user_tls(struct thread *td, void *tls_base) { - /* TBD */ + td->td_md.md_tls = tls_base; return (0); } @@ -539,3 +589,119 @@ cpu_throw(struct thread *old, struct thread *new) func_2args_asmmacro(&mips_cpu_throw, old, new); panic("mips_cpu_throw() returned"); } + +#ifdef DDB +#include + +#define DB_PRINT_REG(ptr, regname) \ + db_printf(" %-12s 0x%lx\n", #regname, (long)((ptr)->regname)) + +#define DB_PRINT_REG_ARRAY(ptr, arrname, regname) \ + db_printf(" %-12s 0x%lx\n", #regname, (long)((ptr)->arrname[regname])) + +static void +dump_trapframe(struct trapframe *trapframe) +{ + + db_printf("Trapframe at %p\n", trapframe); + + DB_PRINT_REG(trapframe, zero); + DB_PRINT_REG(trapframe, ast); + DB_PRINT_REG(trapframe, v0); + DB_PRINT_REG(trapframe, v1); + DB_PRINT_REG(trapframe, a0); + DB_PRINT_REG(trapframe, a1); + DB_PRINT_REG(trapframe, a2); + DB_PRINT_REG(trapframe, a3); + DB_PRINT_REG(trapframe, t0); + DB_PRINT_REG(trapframe, t1); + DB_PRINT_REG(trapframe, t2); + DB_PRINT_REG(trapframe, t3); + DB_PRINT_REG(trapframe, t4); + DB_PRINT_REG(trapframe, t5); + DB_PRINT_REG(trapframe, t6); + DB_PRINT_REG(trapframe, t7); + DB_PRINT_REG(trapframe, s0); + DB_PRINT_REG(trapframe, s1); + DB_PRINT_REG(trapframe, s2); + DB_PRINT_REG(trapframe, s3); + DB_PRINT_REG(trapframe, s4); + DB_PRINT_REG(trapframe, s5); + DB_PRINT_REG(trapframe, s6); + DB_PRINT_REG(trapframe, s7); + DB_PRINT_REG(trapframe, t8); + DB_PRINT_REG(trapframe, t9); + DB_PRINT_REG(trapframe, k0); + DB_PRINT_REG(trapframe, k1); + DB_PRINT_REG(trapframe, gp); + DB_PRINT_REG(trapframe, sp); + DB_PRINT_REG(trapframe, s8); + DB_PRINT_REG(trapframe, ra); + DB_PRINT_REG(trapframe, sr); + DB_PRINT_REG(trapframe, mullo); + DB_PRINT_REG(trapframe, mulhi); + DB_PRINT_REG(trapframe, badvaddr); + DB_PRINT_REG(trapframe, cause); + DB_PRINT_REG(trapframe, pc); +} + +DB_SHOW_COMMAND(pcb, ddb_dump_pcb) +{ + struct thread *td; + struct pcb *pcb; + struct trapframe *trapframe; + + /* Determine which thread to examine. */ + if (have_addr) + td = db_lookup_thread(addr, TRUE); + else + td = curthread; + + pcb = td->td_pcb; + + db_printf("Thread %d at %p\n", td->td_tid, td); + + db_printf("PCB at %p\n", pcb); + + trapframe = &pcb->pcb_regs; + dump_trapframe(trapframe); + + db_printf("PCB Context:\n"); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S0); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S1); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S2); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S3); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S4); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S5); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S6); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S7); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_SP); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S8); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_RA); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_SR); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_GP); + DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_PC); + + db_printf("PCB onfault = %d\n", pcb->pcb_onfault); + db_printf("md_saved_intr = 0x%0lx\n", (long)td->td_md.md_saved_intr); + db_printf("md_spinlock_count = %d\n", td->td_md.md_spinlock_count); + + if (td->td_frame != trapframe) { + db_printf("td->td_frame %p is not the same as pcb_regs %p\n", + td->td_frame, trapframe); + } +} + +/* + * Dump the trapframe beginning at address specified by first argument. + */ +DB_SHOW_COMMAND(trapframe, ddb_dump_trapframe) +{ + + if (!have_addr) + return; + + dump_trapframe((struct trapframe *)addr); +} + +#endif /* DDB */ diff --git a/sys/mips/rmi/Makefile.msgring b/sys/mips/rmi/Makefile.msgring new file mode 100644 index 000000000000..d04978e5d1f7 --- /dev/null +++ b/sys/mips/rmi/Makefile.msgring @@ -0,0 +1,14 @@ +RM = rm +MSGRNG_CFG = msgring.cfg + +MSGRNG_CFG_C = $(patsubst %.cfg,%.c,$(MSGRNG_CFG)) + +#all: msgring.l msgring.y msgring.cfg +all: $(MSGRNG_CFG) + flex -omsgring.lex.c msgring.l + bison -d -omsgring.yacc.c msgring.y + gcc -g3 msgring.lex.c msgring.yacc.c -o msgring + ./msgring -i $(MSGRNG_CFG) -o $(MSGRNG_CFG_C) + +clean: + $(RM) -f msgring.lex.c msgring.yacc.c msgring.yacc.h msgring msgring.o* diff --git a/sys/mips/rmi/board.c b/sys/mips/rmi/board.c new file mode 100644 index 000000000000..ae7b43fb9a9a --- /dev/null +++ b/sys/mips/rmi/board.c @@ -0,0 +1,195 @@ +/********************************************************************* + * + * Copyright 2003-2006 Raza Microelectronics, Inc. (RMI). 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 Raza Microelectronics, Inc. ``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 RMI 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. + * + * *****************************RMI_2**********************************/ +#include /* RCS ID & Copyright macro defns */ +__FBSDID("$FreeBSD$"); +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static int xlr_rxstn_to_txstn_map[128] = { + [0 ... 7] = TX_STN_CPU_0, + [8 ... 15] = TX_STN_CPU_1, + [16 ... 23] = TX_STN_CPU_2, + [24 ... 31] = TX_STN_CPU_3, + [32 ... 39] = TX_STN_CPU_4, + [40 ... 47] = TX_STN_CPU_5, + [48 ... 55] = TX_STN_CPU_6, + [56 ... 63] = TX_STN_CPU_7, + [64 ... 95] = TX_STN_INVALID, + [96 ... 103] = TX_STN_GMAC, + [104 ... 107] = TX_STN_DMA, + [108 ... 111] = TX_STN_INVALID, + [112 ... 113] = TX_STN_XGS_0, + [114 ... 115] = TX_STN_XGS_1, + [116 ... 119] = TX_STN_INVALID, + [120 ... 127] = TX_STN_SAE +}; + +static int xls_rxstn_to_txstn_map[128] = { + [0 ... 7] = TX_STN_CPU_0, + [8 ... 15] = TX_STN_CPU_1, + [16 ... 23] = TX_STN_CPU_2, + [24 ... 31] = TX_STN_CPU_3, + [32 ... 63] = TX_STN_INVALID, + [64 ... 71] = TX_STN_PCIE, + [72 ... 79] = TX_STN_INVALID, + [80 ... 87] = TX_STN_GMAC1, + [88 ... 95] = TX_STN_INVALID, + [96 ... 103] = TX_STN_GMAC0, + [104 ... 107] = TX_STN_DMA, + [108 ... 111] = TX_STN_CDE, + [112 ... 119] = TX_STN_INVALID, + [120 ... 127] = TX_STN_SAE +}; + +struct stn_cc *xlr_core_cc_configs[] = {&cc_table_cpu_0, &cc_table_cpu_1, + &cc_table_cpu_2, &cc_table_cpu_3, + &cc_table_cpu_4, &cc_table_cpu_5, +&cc_table_cpu_6, &cc_table_cpu_7}; + +struct stn_cc *xls_core_cc_configs[] = {&xls_cc_table_cpu_0, &xls_cc_table_cpu_1, +&xls_cc_table_cpu_2, &xls_cc_table_cpu_3}; + +struct xlr_board_info xlr_board_info; + +/* + * All our knowledge of chip and board that cannot be detected by probing + * at run-time goes here + */ +int +xlr_board_info_setup() +{ + + if (xlr_is_xls()) { + xlr_board_info.is_xls = 1; + xlr_board_info.nr_cpus = 8; + xlr_board_info.usb = 1; + xlr_board_info.cfi = + (xlr_boot1_info.board_major_version != RMI_XLR_BOARD_ARIZONA_VIII); + xlr_board_info.pci_irq = 0; + xlr_board_info.credit_configs = xls_core_cc_configs; + xlr_board_info.bucket_sizes = &xls_bucket_sizes; + xlr_board_info.msgmap = xls_rxstn_to_txstn_map; + xlr_board_info.gmacports = 8; + + /* network block 0 */ + xlr_board_info.gmac_block[0].type = XLR_GMAC; + xlr_board_info.gmac_block[0].enabled = 0xf; + xlr_board_info.gmac_block[0].credit_config = &xls_cc_table_gmac0; + xlr_board_info.gmac_block[0].station_txbase = MSGRNG_STNID_GMACTX0; + xlr_board_info.gmac_block[0].station_rfr = MSGRNG_STNID_GMACRFR_0; + if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI) + xlr_board_info.gmac_block[0].mode = XLR_PORT0_RGMII; + else + xlr_board_info.gmac_block[0].mode = XLR_SGMII; + xlr_board_info.gmac_block[0].baseaddr = XLR_IO_GMAC_0_OFFSET; + xlr_board_info.gmac_block[0].baseirq = PIC_GMAC_0_IRQ; + xlr_board_info.gmac_block[0].baseinst = 0; + + /* network block 1 */ + xlr_board_info.gmac_block[1].type = XLR_GMAC; + xlr_board_info.gmac_block[1].enabled = 0xf; + if (xlr_is_xls4xx()) { + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_GPIO_OFFSET); + uint32_t tmp; + + /* some ports are not enabled on 4xx, figure this out + from the GPIO fuse bank */ + tmp = xlr_read_reg(mmio, 35); + if (tmp & (1<<28)) + xlr_board_info.gmac_block[1].enabled &= ~0x8; + if (tmp & (1<<29)) + xlr_board_info.gmac_block[1].enabled &= ~0x4; + } + xlr_board_info.gmac_block[1].credit_config = &xls_cc_table_gmac1; + xlr_board_info.gmac_block[1].station_txbase = MSGRNG_STNID_GMAC1_TX0; + xlr_board_info.gmac_block[1].station_rfr = MSGRNG_STNID_GMAC1_FR_0; + xlr_board_info.gmac_block[1].mode = XLR_SGMII; + xlr_board_info.gmac_block[1].baseaddr = XLR_IO_GMAC_4_OFFSET; + xlr_board_info.gmac_block[1].baseirq = PIC_XGS_0_IRQ; + xlr_board_info.gmac_block[1].baseinst = 4; + + /* network block 2 */ + xlr_board_info.gmac_block[2].enabled = 0; /* disabled on XLS */ + } else { + xlr_board_info.is_xls = 0; + xlr_board_info.nr_cpus = 32; + xlr_board_info.usb = 0; + xlr_board_info.cfi = 1; + xlr_board_info.pci_irq = 0; + xlr_board_info.credit_configs = xlr_core_cc_configs; + xlr_board_info.bucket_sizes = &bucket_sizes; + xlr_board_info.msgmap = xlr_rxstn_to_txstn_map; + xlr_board_info.gmacports = 4; + + /* GMAC0 */ + xlr_board_info.gmac_block[0].type = XLR_GMAC; + xlr_board_info.gmac_block[0].enabled = 0xf; + xlr_board_info.gmac_block[0].credit_config = &cc_table_gmac; + xlr_board_info.gmac_block[0].station_txbase = MSGRNG_STNID_GMACTX0; + xlr_board_info.gmac_block[0].station_rfr = MSGRNG_STNID_GMACRFR_0; + xlr_board_info.gmac_block[0].mode = XLR_RGMII; + xlr_board_info.gmac_block[0].baseaddr = XLR_IO_GMAC_0_OFFSET; + xlr_board_info.gmac_block[0].baseirq = PIC_GMAC_0_IRQ; + xlr_board_info.gmac_block[0].baseinst = 0; + + /* XGMAC0 */ + xlr_board_info.gmac_block[1].type = XLR_XGMAC; + xlr_board_info.gmac_block[1].enabled = 1; + xlr_board_info.gmac_block[1].credit_config = &cc_table_xgs_0; + xlr_board_info.gmac_block[1].station_txbase = MSGRNG_STNID_XGS0_TX; + xlr_board_info.gmac_block[1].station_rfr = MSGRNG_STNID_XGS0FR; + xlr_board_info.gmac_block[1].mode = -1; + xlr_board_info.gmac_block[1].baseaddr = XLR_IO_XGMAC_0_OFFSET; + xlr_board_info.gmac_block[1].baseirq = PIC_XGS_0_IRQ; + xlr_board_info.gmac_block[1].baseinst = 4; + + /* XGMAC1 */ + xlr_board_info.gmac_block[2].type = XLR_XGMAC; + xlr_board_info.gmac_block[2].enabled = 1; + xlr_board_info.gmac_block[2].credit_config = &cc_table_xgs_1; + xlr_board_info.gmac_block[2].station_txbase = MSGRNG_STNID_XGS1_TX; + xlr_board_info.gmac_block[2].station_rfr = MSGRNG_STNID_XGS1FR; + xlr_board_info.gmac_block[2].mode = -1; + xlr_board_info.gmac_block[2].baseaddr = XLR_IO_XGMAC_1_OFFSET; + xlr_board_info.gmac_block[2].baseirq = PIC_XGS_1_IRQ; + xlr_board_info.gmac_block[2].baseinst = 5; + } + return 0; +} diff --git a/sys/mips/rmi/board.h b/sys/mips/rmi/board.h new file mode 100644 index 000000000000..f47654e2a6cf --- /dev/null +++ b/sys/mips/rmi/board.h @@ -0,0 +1,282 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _RMI_BOARD_H_ +#define _RMI_BOARD_H_ + +#define RMI_XLR_BOARD_ARIZONA_I 1 +#define RMI_XLR_BOARD_ARIZONA_II 2 +#define RMI_XLR_BOARD_ARIZONA_III 3 +#define RMI_XLR_BOARD_ARIZONA_IV 4 +#define RMI_XLR_BOARD_ARIZONA_V 5 +#define RMI_XLR_BOARD_ARIZONA_VI 6 +#define RMI_XLR_BOARD_ARIZONA_VII 7 +#define RMI_XLR_BOARD_ARIZONA_VIII 8 + +#define RMI_CHIP_XLR308_A0 0x0c0600 +#define RMI_CHIP_XLR508_A0 0x0c0700 +#define RMI_CHIP_XLR516_A0 0x0c0800 +#define RMI_CHIP_XLR532_A0 0x0c0900 +#define RMI_CHIP_XLR716_A0 0x0c0a00 +#define RMI_CHIP_XLR732_A0 0x0c0b00 + +#define RMI_CHIP_XLR308_A1 0x0c0601 +#define RMI_CHIP_XLR508_A1 0x0c0701 +#define RMI_CHIP_XLR516_A1 0x0c0801 +#define RMI_CHIP_XLR532_A1 0x0c0901 +#define RMI_CHIP_XLR716_A1 0x0c0a01 +#define RMI_CHIP_XLR732_A1 0x0c0b01 + +#define RMI_CHIP_XLR308_B0 0x0c0602 +#define RMI_CHIP_XLR508_B0 0x0c0702 +#define RMI_CHIP_XLR516_B0 0x0c0802 +#define RMI_CHIP_XLR532_B0 0x0c0902 +#define RMI_CHIP_XLR716_B0 0x0c0a02 +#define RMI_CHIP_XLR732_B0 0x0c0b02 + +#define RMI_CHIP_XLR308_B1 0x0c0603 +#define RMI_CHIP_XLR508_B1 0x0c0703 +#define RMI_CHIP_XLR516_B1 0x0c0803 +#define RMI_CHIP_XLR532_B1 0x0c0903 +#define RMI_CHIP_XLR716_B1 0x0c0a03 +#define RMI_CHIP_XLR732_B1 0x0c0b03 + +#define RMI_CHIP_XLR308_B2 0x0c0604 +#define RMI_CHIP_XLR508_B2 0x0c0704 +#define RMI_CHIP_XLR516_B2 0x0c0804 +#define RMI_CHIP_XLR532_B2 0x0c0904 +#define RMI_CHIP_XLR716_B2 0x0c0a04 +#define RMI_CHIP_XLR732_B2 0x0c0b04 + +#define RMI_CHIP_XLR308_C0 0x0c0705 +#define RMI_CHIP_XLR508_C0 0x0c0b05 +#define RMI_CHIP_XLR516_C0 0x0c0a05 +#define RMI_CHIP_XLR532_C0 0x0c0805 +#define RMI_CHIP_XLR716_C0 0x0c0205 +#define RMI_CHIP_XLR732_C0 0x0c0005 + +#define RMI_CHIP_XLR308_C1 0x0c0706 +#define RMI_CHIP_XLR508_C1 0x0c0b06 +#define RMI_CHIP_XLR516_C1 0x0c0a06 +#define RMI_CHIP_XLR532_C1 0x0c0806 +#define RMI_CHIP_XLR716_C1 0x0c0206 +#define RMI_CHIP_XLR732_C1 0x0c0006 + +#define RMI_CHIP_XLR308_C2 0x0c0707 +#define RMI_CHIP_XLR508_C2 0x0c0b07 +#define RMI_CHIP_XLR516_C2 0x0c0a07 +#define RMI_CHIP_XLR532_C2 0x0c0807 +#define RMI_CHIP_XLR716_C2 0x0c0207 +#define RMI_CHIP_XLR732_C2 0x0c0007 + +#define RMI_CHIP_XLR308_C3 0x0c0708 +#define RMI_CHIP_XLR508_C3 0x0c0b08 +#define RMI_CHIP_XLR516_C3 0x0c0a08 +#define RMI_CHIP_XLR532_C3 0x0c0808 +#define RMI_CHIP_XLR716_C3 0x0c0208 +#define RMI_CHIP_XLR732_C3 0x0c0008 + +#define RMI_CHIP_XLR308_C4 0x0c0709 +#define RMI_CHIP_XLR508_C4 0x0c0b09 +#define RMI_CHIP_XLR516_C4 0x0c0a09 +#define RMI_CHIP_XLR532_C4 0x0c0809 +#define RMI_CHIP_XLR716_C4 0x0c0209 +#define RMI_CHIP_XLR732_C4 0x0c0009 + +#define RMI_CHIP_XLS608_A0 0x0c8000 +#define RMI_CHIP_XLS408_A0 0x0c8800 +#define RMI_CHIP_XLS404_A0 0x0c8c00 +#define RMI_CHIP_XLS208_A0 0x0c8e00 +#define RMI_CHIP_XLS204_A0 0x0c8f00 + +#define RMI_CHIP_XLS608_A1 0x0c8001 +#define RMI_CHIP_XLS408_A1 0x0c8801 +#define RMI_CHIP_XLS404_A1 0x0c8c01 +#define RMI_CHIP_XLS208_A1 0x0c8e01 +#define RMI_CHIP_XLS204_A1 0x0c8f01 + +static __inline__ unsigned int +xlr_revision(void) +{ + return mips_rd_prid() & 0xff00ff; +} + +static __inline__ unsigned int +xlr_is_xls(void) +{ + uint32_t prid = mips_rd_prid(); + + return (prid & 0xf000) == 0x8000 || (prid & 0xf000) == 0x4000; +} + +static __inline__ int +xlr_revision_a0(void) +{ + return xlr_revision() == 0x0c0000; +} + +static __inline__ int +xlr_revision_b0(void) +{ + return xlr_revision() == 0x0c0002; +} + +static __inline__ int +xlr_revision_b1(void) +{ + return xlr_revision() == 0x0c0003; +} + +static __inline__ int +xlr_board_atx_i(void) +{ + return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_I; +} + +static __inline__ int +xlr_board_atx_ii(void) +{ + return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_II; +} + +static __inline__ int +xlr_board_atx_ii_b(void) +{ + return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_II) + && (xlr_boot1_info.board_minor_version == 1); +} + +static __inline__ int +xlr_board_atx_iii(void) +{ + return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_III; +} + +static __inline__ int +xlr_board_atx_iv(void) +{ + return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_IV) + && (xlr_boot1_info.board_minor_version == 0); +} +static __inline__ int +xlr_board_atx_iv_b(void) +{ + return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_IV) + && (xlr_boot1_info.board_minor_version == 1); +} +static __inline__ int +xlr_board_atx_v(void) +{ + return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_V; +} +static __inline__ int +xlr_board_atx_vi(void) +{ + return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI; +} + +static __inline__ int +xlr_board_atx_iii_256(void) +{ + return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_III) + && (xlr_boot1_info.board_minor_version == 0); +} + +static __inline__ int +xlr_board_atx_iii_512(void) +{ + return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_III) + && (xlr_boot1_info.board_minor_version == 1); +} + +static __inline__ int +xlr_board_atx_v_512(void) +{ + return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_V) + && (xlr_boot1_info.board_minor_version == 1); +} + +static __inline__ int +xlr_board_pci(void) +{ + return (xlr_board_atx_iii_256() || xlr_board_atx_iii_512() + || xlr_board_atx_v_512()); +} +static __inline__ int +xlr_is_xls2xx(void) +{ + uint32_t chipid = mips_rd_prid() & 0xffffff00U; + + return chipid == 0x0c8e00 || chipid == 0x0c8f00; +} + +static __inline__ int +xlr_is_xls4xx(void) +{ + uint32_t chipid = mips_rd_prid() & 0xffffff00U; + + return chipid == 0x0c8800 || chipid == 0x0c8c00; +} + +/* all our knowledge of chip and board that cannot be detected run-time goes here */ +enum gmac_block_types { + XLR_GMAC, XLR_XGMAC, XLR_SPI4 +}; +enum gmac_block_modes { + XLR_RGMII, XLR_SGMII, XLR_PORT0_RGMII +}; +struct xlr_board_info { + int is_xls; + int nr_cpus; + int usb; /* usb enabled ? */ + int cfi; /* compact flash driver for NOR? */ + int pci_irq; + struct stn_cc **credit_configs; /* pointer to Core station credits */ + struct bucket_size *bucket_sizes; /* pointer to Core station + * bucket */ + int *msgmap; /* mapping of message station to devices */ + int gmacports; /* number of gmac ports on the board */ + struct xlr_gmac_block_t { + int type; /* see enum gmac_block_types */ + unsigned int enabled; /* mask of ports enabled */ + struct stn_cc *credit_config; /* credit configuration */ + int station_txbase; /* station id for tx */ + int station_rfr;/* free desc bucket */ + int mode; /* see gmac_block_modes */ + uint32_t baseaddr; /* IO base */ + int baseirq; /* first irq for this block, the rest are in + * sequence */ + int baseinst; /* the first rge unit for this block */ + } gmac_block[3]; +}; + +extern struct xlr_board_info xlr_board_info; +int xlr_board_info_setup(void); + +#endif diff --git a/sys/mips/rmi/bus_space_rmi.c b/sys/mips/rmi/bus_space_rmi.c new file mode 100644 index 000000000000..b2daeb4ddcf9 --- /dev/null +++ b/sys/mips/rmi/bus_space_rmi.c @@ -0,0 +1,686 @@ +/*- + * Copyright (c) 2009 RMI Corporation + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +static int +rmi_bus_space_map(void *t, bus_addr_t addr, + bus_size_t size, int flags, + bus_space_handle_t * bshp); + +static void +rmi_bus_space_unmap(void *t, bus_space_handle_t bsh, + bus_size_t size); + +static int +rmi_bus_space_subregion(void *t, + bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size, + bus_space_handle_t * nbshp); + +static u_int8_t +rmi_bus_space_read_1(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static u_int16_t +rmi_bus_space_read_2(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static u_int32_t +rmi_bus_space_read_4(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static void +rmi_bus_space_read_multi_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_bus_space_read_multi_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_bus_space_read_multi_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, + size_t count); + +static void +rmi_bus_space_read_region_1(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_bus_space_read_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_bus_space_read_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int32_t * addr, + size_t count); + +static void +rmi_bus_space_write_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t value); + +static void +rmi_bus_space_write_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t value); + +static void +rmi_bus_space_write_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t value); + +static void +rmi_bus_space_write_multi_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int8_t * addr, + size_t count); + +static void +rmi_bus_space_write_multi_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_bus_space_write_multi_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + +static void +rmi_bus_space_write_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_bus_space_write_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + + +static void +rmi_bus_space_set_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int16_t value, + size_t count); +static void +rmi_bus_space_set_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int32_t value, + size_t count); + +static void +rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, + bus_size_t offset __unused, bus_size_t len __unused, int flags); + +static void +rmi_bus_space_copy_region_2(void *t, + bus_space_handle_t bsh1, + bus_size_t off1, + bus_space_handle_t bsh2, + bus_size_t off2, size_t count); + +u_int8_t +rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset); + +static u_int16_t +rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset); + +static u_int32_t +rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset); +static void +rmi_bus_space_read_multi_stream_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_bus_space_read_multi_stream_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_bus_space_read_multi_stream_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, + size_t count); + +void +rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int8_t value); +static void +rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value); + +static void +rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value); + +static void +rmi_bus_space_write_multi_stream_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int8_t * addr, + size_t count); +static void +rmi_bus_space_write_multi_stream_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_bus_space_write_multi_stream_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + +#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) + +static struct bus_space local_rmi_bus_space = { + /* cookie */ + (void *)0, + + /* mapping/unmapping */ + rmi_bus_space_map, + rmi_bus_space_unmap, + rmi_bus_space_subregion, + + /* allocation/deallocation */ + NULL, + NULL, + + /* barrier */ + rmi_bus_space_barrier, + + /* read (single) */ + rmi_bus_space_read_1, + rmi_bus_space_read_2, + rmi_bus_space_read_4, + NULL, + + /* read multiple */ + rmi_bus_space_read_multi_1, + rmi_bus_space_read_multi_2, + rmi_bus_space_read_multi_4, + NULL, + + /* read region */ + rmi_bus_space_read_region_1, + rmi_bus_space_read_region_2, + rmi_bus_space_read_region_4, + NULL, + + /* write (single) */ + rmi_bus_space_write_1, + rmi_bus_space_write_2, + rmi_bus_space_write_4, + NULL, + + /* write multiple */ + rmi_bus_space_write_multi_1, + rmi_bus_space_write_multi_2, + rmi_bus_space_write_multi_4, + NULL, + + /* write region */ + NULL, + rmi_bus_space_write_region_2, + rmi_bus_space_write_region_4, + NULL, + + /* set multiple */ + NULL, + NULL, + NULL, + NULL, + + /* set region */ + NULL, + rmi_bus_space_set_region_2, + rmi_bus_space_set_region_4, + NULL, + + /* copy */ + NULL, + rmi_bus_space_copy_region_2, + NULL, + NULL, + + /* read (single) stream */ + rmi_bus_space_read_stream_1, + rmi_bus_space_read_stream_2, + rmi_bus_space_read_stream_4, + NULL, + + /* read multiple stream */ + rmi_bus_space_read_multi_stream_1, + rmi_bus_space_read_multi_stream_2, + rmi_bus_space_read_multi_stream_4, + NULL, + + /* read region stream */ + rmi_bus_space_read_region_1, + rmi_bus_space_read_region_2, + rmi_bus_space_read_region_4, + NULL, + + /* write (single) stream */ + rmi_bus_space_write_stream_1, + rmi_bus_space_write_stream_2, + rmi_bus_space_write_stream_4, + NULL, + + /* write multiple stream */ + rmi_bus_space_write_multi_stream_1, + rmi_bus_space_write_multi_stream_2, + rmi_bus_space_write_multi_stream_4, + NULL, + + /* write region stream */ + NULL, + rmi_bus_space_write_region_2, + rmi_bus_space_write_region_4, + NULL, +}; + +/* generic bus_space tag */ +bus_space_tag_t rmi_bus_space = &local_rmi_bus_space; + +/* + * Map a region of device bus space into CPU virtual address space. + */ +static int +rmi_bus_space_map(void *t __unused, bus_addr_t addr, + bus_size_t size __unused, int flags __unused, + bus_space_handle_t * bshp) +{ + + *bshp = addr; + return (0); +} + +/* + * Unmap a region of device bus space. + */ +static void +rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, + bus_size_t size __unused) +{ +} + +/* + * Get a new handle for a subregion of an already-mapped area of bus space. + */ + +static int +rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size __unused, + bus_space_handle_t * nbshp) +{ + *nbshp = bsh + offset; + return (0); +} + +/* + * Read a 1, 2, 4, or 8 byte quantity from bus space + * described by tag/handle/offset. + */ + +static u_int8_t +rmi_bus_space_read_1(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return (u_int8_t) (*(volatile u_int32_t *)(handle + offset)); +} + +static u_int16_t +rmi_bus_space_read_2(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return (u_int16_t)(*(volatile u_int32_t *)(handle + offset)); +} + +static u_int32_t +rmi_bus_space_read_4(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return (*(volatile u_int32_t *)(handle + offset)); +} + + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle/offset and copy into buffer provided. + */ +static void +rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + TODO(); +} + +/* + * Write the 1, 2, 4, or 8 byte value `value' to bus space + * described by tag/handle/offset. + */ + +static void +rmi_bus_space_write_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value; +} + +static void +rmi_bus_space_write_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value) +{ + *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value; +} + +static void +rmi_bus_space_write_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value) +{ + *(volatile u_int32_t *)(handle + offset) = value; +} + + +/* + * Write `count' 1, 2, 4, or 8 byte quantities from the buffer + * provided to bus space described by tag/handle/offset. + */ + + +static void +rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + TODO(); +} + +/* + * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described + * by tag/handle starting at `offset'. + */ + +static void +rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int16_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 2) + (*(volatile u_int32_t *)(addr)) = value; +} + +static void +rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int32_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 4) + (*(volatile u_int32_t *)(addr)) = value; +} + + +/* + * Copy `count' 1, 2, 4, or 8 byte values from bus space starting + * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. + */ +static void +rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, + bus_size_t off1, bus_space_handle_t bsh2, + bus_size_t off2, size_t count) +{ + printf("bus_space_copy_region_2 - unimplemented\n"); +} + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle/offset and copy into buffer provided. + */ + +u_int8_t +rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + + return *((volatile u_int8_t *)(handle + offset)); +} + + +static u_int16_t +rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + return *(volatile u_int16_t *)(handle + offset); +} + + +static u_int32_t +rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + return (*(volatile u_int32_t *)(handle + offset)); +} + + +static void +rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + TODO(); +} + + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle and starting at `offset' and copy into + * buffer provided. + */ +void +rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + TODO(); +} + +void +rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + TODO(); +} + +void +rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = (*(volatile u_int32_t *)(baddr)); + baddr += 4; + } +} + +void +rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + TODO(); +} + + +static void +rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value) +{ + TODO(); +} + + +static void +rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value) +{ + TODO(); +} + + +static void +rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + TODO(); +} + +void +rmi_bus_space_write_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int16_t * addr, + size_t count) +{ + TODO(); +} + +void +rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + TODO(); +} + +static void +rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, + bus_size_t offset __unused, bus_size_t len __unused, int flags) +{ +} diff --git a/sys/mips/rmi/bus_space_rmi_pci.c b/sys/mips/rmi/bus_space_rmi_pci.c new file mode 100644 index 000000000000..ebd70c1d10b4 --- /dev/null +++ b/sys/mips/rmi/bus_space_rmi_pci.c @@ -0,0 +1,761 @@ +/*- + * Copyright (c) 2009 RMI Corporation + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +static int +rmi_pci_bus_space_map(void *t, bus_addr_t addr, + bus_size_t size, int flags, + bus_space_handle_t * bshp); + +static void +rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh, + bus_size_t size); + +static int +rmi_pci_bus_space_subregion(void *t, + bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size, + bus_space_handle_t * nbshp); + +static u_int8_t +rmi_pci_bus_space_read_1(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static u_int16_t +rmi_pci_bus_space_read_2(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static u_int32_t +rmi_pci_bus_space_read_4(void *t, + bus_space_handle_t handle, + bus_size_t offset); + +static void +rmi_pci_bus_space_read_multi_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_region_1(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int32_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t value); + +static void +rmi_pci_bus_space_write_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t value); + +static void +rmi_pci_bus_space_write_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t value); + +static void +rmi_pci_bus_space_write_multi_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_multi_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_multi_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + + +static void +rmi_pci_bus_space_set_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int16_t value, + size_t count); +static void +rmi_pci_bus_space_set_region_4(void *t, + bus_space_handle_t bsh, + bus_size_t offset, u_int32_t value, + size_t count); + +static void +rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, + bus_size_t offset __unused, bus_size_t len __unused, int flags); + +static void +rmi_pci_bus_space_copy_region_2(void *t, + bus_space_handle_t bsh1, + bus_size_t off1, + bus_space_handle_t bsh2, + bus_size_t off2, size_t count); + +u_int8_t +rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset); + +static u_int16_t +rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset); + +static u_int32_t +rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset); +static void +rmi_pci_bus_space_read_multi_stream_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_stream_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_read_multi_stream_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, + size_t count); + +void +rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int8_t value); +static void +rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value); + +static void +rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value); + +static void +rmi_pci_bus_space_write_multi_stream_1(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int8_t * addr, + size_t count); +static void +rmi_pci_bus_space_write_multi_stream_2(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int16_t * addr, + size_t count); + +static void +rmi_pci_bus_space_write_multi_stream_4(void *t, + bus_space_handle_t handle, + bus_size_t offset, + const u_int32_t * addr, + size_t count); + +#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__) + +static struct bus_space local_rmi_pci_bus_space = { + /* cookie */ + (void *)0, + + /* mapping/unmapping */ + rmi_pci_bus_space_map, + rmi_pci_bus_space_unmap, + rmi_pci_bus_space_subregion, + + /* allocation/deallocation */ + NULL, + NULL, + + /* barrier */ + rmi_pci_bus_space_barrier, + + /* read (single) */ + rmi_pci_bus_space_read_1, + rmi_pci_bus_space_read_2, + rmi_pci_bus_space_read_4, + NULL, + + /* read multiple */ + rmi_pci_bus_space_read_multi_1, + rmi_pci_bus_space_read_multi_2, + rmi_pci_bus_space_read_multi_4, + NULL, + + /* read region */ + rmi_pci_bus_space_read_region_1, + rmi_pci_bus_space_read_region_2, + rmi_pci_bus_space_read_region_4, + NULL, + + /* write (single) */ + rmi_pci_bus_space_write_1, + rmi_pci_bus_space_write_2, + rmi_pci_bus_space_write_4, + NULL, + + /* write multiple */ + rmi_pci_bus_space_write_multi_1, + rmi_pci_bus_space_write_multi_2, + rmi_pci_bus_space_write_multi_4, + NULL, + + /* write region */ + NULL, + rmi_pci_bus_space_write_region_2, + rmi_pci_bus_space_write_region_4, + NULL, + + /* set multiple */ + NULL, + NULL, + NULL, + NULL, + + /* set region */ + NULL, + rmi_pci_bus_space_set_region_2, + rmi_pci_bus_space_set_region_4, + NULL, + + /* copy */ + NULL, + rmi_pci_bus_space_copy_region_2, + NULL, + NULL, + + /* read (single) stream */ + rmi_pci_bus_space_read_stream_1, + rmi_pci_bus_space_read_stream_2, + rmi_pci_bus_space_read_stream_4, + NULL, + + /* read multiple stream */ + rmi_pci_bus_space_read_multi_stream_1, + rmi_pci_bus_space_read_multi_stream_2, + rmi_pci_bus_space_read_multi_stream_4, + NULL, + + /* read region stream */ + rmi_pci_bus_space_read_region_1, + rmi_pci_bus_space_read_region_2, + rmi_pci_bus_space_read_region_4, + NULL, + + /* write (single) stream */ + rmi_pci_bus_space_write_stream_1, + rmi_pci_bus_space_write_stream_2, + rmi_pci_bus_space_write_stream_4, + NULL, + + /* write multiple stream */ + rmi_pci_bus_space_write_multi_stream_1, + rmi_pci_bus_space_write_multi_stream_2, + rmi_pci_bus_space_write_multi_stream_4, + NULL, + + /* write region stream */ + NULL, + rmi_pci_bus_space_write_region_2, + rmi_pci_bus_space_write_region_4, + NULL, +}; + +/* generic bus_space tag */ +bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space; + +/* + * Map a region of device bus space into CPU virtual address space. + */ +static int +rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr, + bus_size_t size __unused, int flags __unused, + bus_space_handle_t * bshp) +{ + *bshp = addr; + return (0); +} + +/* + * Unmap a region of device bus space. + */ +static void +rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused, + bus_size_t size __unused) +{ +} + +/* + * Get a new handle for a subregion of an already-mapped area of bus space. + */ + +static int +rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size __unused, + bus_space_handle_t * nbshp) +{ + *nbshp = bsh + offset; + return (0); +} + +/* + * Read a 1, 2, 4, or 8 byte quantity from bus space + * described by tag/handle/offset. + */ + +static u_int8_t +rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return (u_int8_t) (*(volatile u_int8_t *)(handle + offset)); +} + +static u_int16_t +rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return bswap16((u_int16_t) (*(volatile u_int16_t *)(handle + offset))); +} + +static u_int32_t +rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle, + bus_size_t offset) +{ + return bswap32((*(volatile u_int32_t *)(handle + offset))); +} + + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle/offset and copy into buffer provided. + */ +static void +rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + while (count--) { + *addr = (*(volatile u_int8_t *)(handle + offset)); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + + while (count--) { + *addr = *(volatile u_int16_t *)(handle + offset); + *addr = bswap16(*addr); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + + while (count--) { + *addr = *(volatile u_int32_t *)(handle + offset); + *addr = bswap32(*addr); + addr++; + } +} + +/* + * Write the 1, 2, 4, or 8 byte value `value' to bus space + * described by tag/handle/offset. + */ + +static void +rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + mips_sync(); + *(volatile u_int8_t *)(handle + offset) = value; +} + +static void +rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value) +{ + mips_sync(); + *(volatile u_int16_t *)(handle + offset) = bswap16(value); +} + + +static void +rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value) +{ + mips_sync(); + *(volatile u_int32_t *)(handle + offset) = bswap32(value); +} + +/* + * Write `count' 1, 2, 4, or 8 byte quantities from the buffer + * provided to bus space described by tag/handle/offset. + */ + + +static void +rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int8_t *)(handle + offset)) = *addr; + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr); + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr); + addr++; + } +} + +/* + * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described + * by tag/handle starting at `offset'. + */ + +static void +rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int16_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 2) + (*(volatile u_int16_t *)(addr)) = value; +} + +static void +rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int32_t value, size_t count) +{ + bus_addr_t addr = bsh + offset; + + for (; count != 0; count--, addr += 4) + (*(volatile u_int32_t *)(addr)) = value; +} + + +/* + * Copy `count' 1, 2, 4, or 8 byte values from bus space starting + * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. + */ +static void +rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1, + bus_size_t off1, bus_space_handle_t bsh2, + bus_size_t off2, size_t count) +{ + TODO(); +} + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle/offset and copy into buffer provided. + */ + +u_int8_t +rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + + return *((volatile u_int8_t *)(handle + offset)); +} + + +static u_int16_t +rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + return *(volatile u_int16_t *)(handle + offset); +} + + +static u_int32_t +rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset) +{ + return (*(volatile u_int32_t *)(handle + offset)); +} + + +static void +rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + while (count--) { + *addr = (*(volatile u_int8_t *)(handle + offset)); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + while (count--) { + *addr = (*(volatile u_int16_t *)(handle + offset)); + addr++; + } +} + +static void +rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + while (count--) { + *addr = (*(volatile u_int32_t *)(handle + offset)); + addr++; + } +} + + + +/* + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle and starting at `offset' and copy into + * buffer provided. + */ +void +rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int8_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = (*(volatile u_int8_t *)(baddr)); + baddr += 1; + } +} + +void +rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int16_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = (*(volatile u_int16_t *)(baddr)); + baddr += 2; + } +} + +void +rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, u_int32_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + *addr++ = (*(volatile u_int32_t *)(baddr)); + baddr += 4; + } +} + + +void +rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int8_t value) +{ + mips_sync(); + *(volatile u_int8_t *)(handle + offset) = value; +} + +static void +rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int16_t value) +{ + mips_sync(); + *(volatile u_int16_t *)(handle + offset) = value; +} + + +static void +rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle, + bus_size_t offset, u_int32_t value) +{ + mips_sync(); + *(volatile u_int32_t *)(handle + offset) = value; +} + + +static void +rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int8_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int8_t *)(handle + offset)) = *addr; + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int16_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int16_t *)(handle + offset)) = *addr; + addr++; + } +} + +static void +rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + mips_sync(); + while (count--) { + (*(volatile u_int32_t *)(handle + offset)) = *addr; + addr++; + } +} + +void +rmi_pci_bus_space_write_region_2(void *t, + bus_space_handle_t bsh, + bus_size_t offset, + const u_int16_t * addr, + size_t count) +{ + bus_addr_t baddr = (bus_addr_t) bsh + offset; + + while (count--) { + (*(volatile u_int16_t *)(baddr)) = *addr; + addr++; + baddr += 2; + } +} + +void +rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh, + bus_size_t offset, const u_int32_t * addr, size_t count) +{ + bus_addr_t baddr = bsh + offset; + + while (count--) { + (*(volatile u_int32_t *)(baddr)) = *addr; + addr++; + baddr += 4; + } +} + +static void +rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused, + bus_size_t offset __unused, bus_size_t len __unused, int flags) +{ + +} diff --git a/sys/mips/rmi/clock.c b/sys/mips/rmi/clock.c new file mode 100644 index 000000000000..6964522e9c92 --- /dev/null +++ b/sys/mips/rmi/clock.c @@ -0,0 +1,356 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD + */ + +#include /* RCS ID & Copyright macro defns */ +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef XLR_PERFMON +#include +#endif + +uint64_t counter_freq; +uint64_t cycles_per_tick; +uint64_t cycles_per_usec; +uint64_t cycles_per_sec; +uint64_t cycles_per_hz; + +u_int32_t counter_upper = 0; +u_int32_t counter_lower_last = 0; + +#define STAT_PROF_CLOCK_SCALE_FACTOR 8 + +static int scale_factor; +static int count_scale_factor[32]; + +uint64_t +platform_get_frequency() +{ + return XLR_PIC_HZ; +} + +void +mips_timer_early_init(uint64_t clock_hz) +{ + /* Initialize clock early so that we can use DELAY sooner */ + counter_freq = clock_hz; + cycles_per_usec = (clock_hz / (1000 * 1000)); + +} + +/* +* count_compare_clockhandler: +* +* Handle the clock interrupt when count becomes equal to +* compare. +*/ +int +count_compare_clockhandler(struct trapframe *tf) +{ + int cpu = PCPU_GET(cpuid); + uint32_t cycles; + + critical_enter(); + + if (cpu == 0) { + mips_wr_compare(0); + } else { + count_scale_factor[cpu]++; + cycles = mips_rd_count(); + cycles += XLR_CPU_HZ / hz; + mips_wr_compare(cycles); + + hardclock_cpu(USERMODE(tf->sr)); + if (count_scale_factor[cpu] == STAT_PROF_CLOCK_SCALE_FACTOR) { + statclock(USERMODE(tf->sr)); + if (profprocs != 0) { + profclock(USERMODE(tf->sr), tf->pc); + } + count_scale_factor[cpu] = 0; + } + /* If needed , handle count compare tick skew here */ + } + + critical_exit(); + return (FILTER_HANDLED); +} + +unsigned long clock_tick_foo=0; + +int +pic_hardclockhandler(struct trapframe *tf) +{ + int cpu = PCPU_GET(cpuid); + + critical_enter(); + + if (cpu == 0) { + scale_factor++; + clock_tick_foo++; +/* + if ((clock_tick_foo % 10000) == 0) { + printf("Clock tick foo at %ld\n", clock_tick_foo); + } +*/ + hardclock(USERMODE(tf->sr), tf->pc); + if (scale_factor == STAT_PROF_CLOCK_SCALE_FACTOR) { + statclock(USERMODE(tf->sr)); + if (profprocs != 0) { + profclock(USERMODE(tf->sr), tf->pc); + } + scale_factor = 0; + } +#ifdef XLR_PERFMON + if (xlr_perfmon_started) + xlr_perfmon_clockhandler(); +#endif + + } else { + /* If needed , handle count compare tick skew here */ + } + critical_exit(); + return (FILTER_HANDLED); +} + +int +pic_timecounthandler(struct trapframe *tf) +{ + return (FILTER_HANDLED); +} + +void +rmi_early_counter_init() +{ + int cpu = PCPU_GET(cpuid); + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + /* + * We do this to get the PIC time counter running right after system + * start. Otherwise the DELAY() function will not be able to work + * since it won't have a TC to read. + */ + xlr_write_reg(mmio, PIC_TIMER_6_MAXVAL_0, (0xffffffff & 0xffffffff)); + xlr_write_reg(mmio, PIC_TIMER_6_MAXVAL_1, (0xffffffff & 0xffffffff)); + xlr_write_reg(mmio, PIC_IRT_0_TIMER_6, (1 << cpu)); + xlr_write_reg(mmio, PIC_IRT_1_TIMER_6, (1 << 31) | (0 << 30) | (1 << 6) | (PIC_TIMER_6_IRQ)); + pic_update_control(1 << (8 + 6), 0); +} + +void tick_init(void); + +void +platform_initclocks(void) +{ + int cpu = PCPU_GET(cpuid); + void *cookie; + + /* + * Note: Passing #3 as NULL ensures that clockhandler gets called + * with trapframe + */ + /* profiling/process accounting timer interrupt for non-zero cpus */ + cpu_establish_hardintr("compare", + (driver_filter_t *) count_compare_clockhandler, + NULL, + NULL, + IRQ_TIMER, + INTR_TYPE_CLK | INTR_FAST, &cookie); + + /* timekeeping timer interrupt for cpu 0 */ + cpu_establish_hardintr("hardclk", + (driver_filter_t *) pic_hardclockhandler, + NULL, + NULL, + PIC_TIMER_7_IRQ, + INTR_TYPE_CLK | INTR_FAST, + &cookie); + + /* this is used by timecounter */ + cpu_establish_hardintr("timecount", + (driver_filter_t *) pic_timecounthandler, NULL, + NULL, PIC_TIMER_6_IRQ, INTR_TYPE_CLK | INTR_FAST, + &cookie); + + if (cpu == 0) { + __uint64_t maxval = XLR_PIC_HZ / hz; + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + stathz = hz / STAT_PROF_CLOCK_SCALE_FACTOR; + profhz = stathz; + + /* Setup PIC Interrupt */ + + if (rmi_spin_mutex_safe) + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_TIMER_7_MAXVAL_0, (maxval & 0xffffffff)); /* 0x100 + 7 */ + xlr_write_reg(mmio, PIC_TIMER_7_MAXVAL_1, (maxval >> 32) & 0xffffffff); /* 0x110 + 7 */ + /* 0x40 + 8 */ + /* reg 40 is lower bits 31-0 and holds CPU mask */ + xlr_write_reg(mmio, PIC_IRT_0_TIMER_7, (1 << cpu)); + /* 0x80 + 8 */ + /* Reg 80 is upper bits 63-32 and holds */ + /* Valid Edge Local IRQ */ + xlr_write_reg(mmio, PIC_IRT_1_TIMER_7, (1 << 31) | (0 << 30) | (1 << 6) | (PIC_TIMER_7_IRQ)); + + pic_update_control(1 << (8 + 7), 1); + xlr_write_reg(mmio, PIC_TIMER_6_MAXVAL_0, (0xffffffff & 0xffffffff)); + xlr_write_reg(mmio, PIC_TIMER_6_MAXVAL_1, (0xffffffff & 0xffffffff)); + xlr_write_reg(mmio, PIC_IRT_0_TIMER_6, (1 << cpu)); + xlr_write_reg(mmio, PIC_IRT_1_TIMER_6, (1 << 31) | (0 << 30) | (1 << 6) | (PIC_TIMER_6_IRQ)); + pic_update_control(1 << (8 + 6), 1); + if (rmi_spin_mutex_safe) + mtx_unlock_spin(&xlr_pic_lock); + } else { + /* Setup count-compare interrupt for vcpu[1-31] */ + mips_wr_compare((xlr_boot1_info.cpu_frequency) / hz); + } + tick_init(); +} + +unsigned +__attribute__((no_instrument_function)) +platform_get_timecount(struct timecounter *tc __unused) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + return 0xffffffffU - xlr_read_reg(mmio, PIC_TIMER_6_COUNTER_0); +} + +void +DELAY(int n) +{ + uint32_t cur, last, delta, usecs; + + /* + * This works by polling the timer and counting the number of + * microseconds that go by. + */ + last = platform_get_timecount(NULL); + delta = usecs = 0; + + while (n > usecs) { + cur = platform_get_timecount(NULL); + + /* Check to see if the timer has wrapped around. */ + if (cur < last) + delta += (cur + (cycles_per_hz - last)); + else + delta += (cur - last); + + last = cur; + + if (delta >= cycles_per_usec) { + usecs += delta / cycles_per_usec; + delta %= cycles_per_usec; + } + } +} + +static +uint64_t +read_pic_counter(void) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + uint32_t lower, upper; + uint64_t tc; + + /* + * Pull the value of the 64 bit counter which is stored in PIC + * register 120+N and 130+N + */ + upper = 0xffffffffU - xlr_read_reg(mmio, PIC_TIMER_6_COUNTER_1); + lower = 0xffffffffU - xlr_read_reg(mmio, PIC_TIMER_6_COUNTER_0); + tc = (((uint64_t) upper << 32) | (uint64_t) lower); + return (tc); +} + +extern struct timecounter counter_timecounter; + +void +mips_timer_init_params(uint64_t platform_counter_freq, int double_count) +{ + + /* + * XXX: Do not use printf here: uart code 8250 may use DELAY so this + * function should be called before cninit. + */ + counter_freq = platform_counter_freq; + /* + * XXX: Some MIPS32 cores update the Count register only every two + * pipeline cycles. + */ + if (double_count != 0) + counter_freq /= 2; + + cycles_per_tick = counter_freq / 1000; + cycles_per_hz = counter_freq / hz; + cycles_per_usec = counter_freq / (1 * 1000 * 1000); + cycles_per_sec = counter_freq; + + counter_timecounter.tc_frequency = counter_freq; + printf("hz=%d cyl_per_hz:%jd cyl_per_usec:%jd freq:%jd cyl_per_hz:%jd cyl_per_sec:%jd\n", + hz, + cycles_per_tick, + cycles_per_usec, + counter_freq, + cycles_per_hz, + cycles_per_sec + ); + set_cputicker(read_pic_counter, counter_freq, 1); +} diff --git a/sys/mips/rmi/clock.h b/sys/mips/rmi/clock.h new file mode 100644 index 000000000000..c0675810fc8d --- /dev/null +++ b/sys/mips/rmi/clock.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _RMI_CLOCK_H_ +#define _RMI_CLOCK_H_ + +#define XLR_PIC_HZ 66000000U +#define XLR_CPU_HZ (xlr_boot1_info.cpu_frequency) + +int count_compare_clockhandler(struct trapframe *); +int pic_hardclockhandler(struct trapframe *); +int pic_timecounthandler(struct trapframe *); +void rmi_early_counter_init(void); + +#endif /* _RMI_CLOCK_H_ */ diff --git a/sys/mips/rmi/debug.h b/sys/mips/rmi/debug.h new file mode 100755 index 000000000000..b5ec144cc2c6 --- /dev/null +++ b/sys/mips/rmi/debug.h @@ -0,0 +1,103 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _RMI_DEBUG_H_ +#define _RMI_DEBUG_H_ + +#include + +enum { + //cacheline 0 + MSGRNG_INT, + MSGRNG_PIC_INT, + MSGRNG_MSG, + MSGRNG_EXIT_STATUS, + MSGRNG_MSG_CYCLES, + //cacheline 1 + NETIF_TX = 8, + NETIF_RX, + NETIF_TX_COMPLETE, + NETIF_TX_COMPLETE_TX, + NETIF_RX_CYCLES, + NETIF_TX_COMPLETE_CYCLES, + NETIF_TX_CYCLES, + NETIF_TIMER_START_Q, + //NETIF_REG_FRIN, + //NETIF_INT_REG, + //cacheline 2 + REPLENISH_ENTER = 16, + REPLENISH_ENTER_COUNT, + REPLENISH_CPU, + REPLENISH_FRIN, + REPLENISH_CYCLES, + NETIF_STACK_TX, + NETIF_START_Q, + NETIF_STOP_Q, + //cacheline 3 + USER_MAC_START = 24, + USER_MAC_INT = 24, + USER_MAC_TX_COMPLETE, + USER_MAC_RX, + USER_MAC_POLL, + USER_MAC_TX, + USER_MAC_TX_FAIL, + USER_MAC_TX_COUNT, + USER_MAC_FRIN, + //cacheline 4 + USER_MAC_TX_FAIL_GMAC_CREDITS = 32, + USER_MAC_DO_PAGE_FAULT, + USER_MAC_UPDATE_TLB, + USER_MAC_UPDATE_BIGTLB, + USER_MAC_UPDATE_TLB_PFN0, + USER_MAC_UPDATE_TLB_PFN1, + + XLR_MAX_COUNTERS = 40 +}; +extern int xlr_counters[MAXCPU][XLR_MAX_COUNTERS]; +extern __uint32_t msgrng_msg_cycles; + +#ifdef ENABLE_DEBUG +#define xlr_inc_counter(x) atomic_add_int(&xlr_counters[PCPU_GET(cpuid)][(x)], 1) +#define xlr_dec_counter(x) atomic_subtract_int(&xlr_counters[PCPU_GET(cpuid)][(x)], 1) +#define xlr_set_counter(x, value) atomic_set_int(&xlr_counters[PCPU_GET(cpuid)][(x)], (value)) +#define xlr_get_counter(x) (&xlr_counters[0][(x)]) + +#else /* default mode */ + +#define xlr_inc_counter(x) +#define xlr_dec_counter(x) +#define xlr_set_counter(x, value) +#define xlr_get_counter(x) + +#endif + +#define dbg_msg(fmt, args...) printf(fmt, ##args) +#define dbg_panic(fmt, args...) panic(fmt, ##args) + +#endif diff --git a/sys/mips/rmi/dev/sec/desc.h b/sys/mips/rmi/dev/sec/desc.h new file mode 100755 index 000000000000..5757e13a7654 --- /dev/null +++ b/sys/mips/rmi/dev/sec/desc.h @@ -0,0 +1,3067 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _DESC_H_ +#define _DESC_H_ + + +#define ONE_BIT 0x0000000000000001ULL +#define TWO_BITS 0x0000000000000003ULL +#define THREE_BITS 0x0000000000000007ULL +#define FOUR_BITS 0x000000000000000fULL +#define FIVE_BITS 0x000000000000001fULL +#define SIX_BITS 0x000000000000003fULL +#define SEVEN_BITS 0x000000000000007fULL +#define EIGHT_BITS 0x00000000000000ffULL +#define NINE_BITS 0x00000000000001ffULL +#define ELEVEN_BITS 0x00000000000007ffULL +#define TWELVE_BITS 0x0000000000000fffULL +#define FOURTEEN_BITS 0x0000000000003fffULL +#define TWENTYFOUR_BITS 0x0000000000ffffffULL +#define THIRTY_TWO_BITS 0x00000000ffffffffULL +#define THIRTY_FIVE_BITS 0x00000007ffffffffULL +#define FOURTY_BITS 0x000000ffffffffffULL + +#define MSG_IN_CTL_LEN_BASE 40 +#define MSG_IN_CTL_ADDR_BASE 0 + +#define GET_FIELD(word,field) \ + ((word) & (field ## _MASK)) >> (field ## _LSB) + +#define FIELD_VALUE(field,value) (((value) & (field ## _BITS)) << (field ## _LSB)) + +/* + * NOTE: this macro expects 'word' to be uninitialized (i.e. zeroed) + */ +#define SET_FIELD(word,field,value) \ + { (word) |= (((value) & (field ## _BITS)) << (field ## _LSB)); } + +/* + * This macro clears 'word', then sets the value + */ +#define CLEAR_SET_FIELD(word,field,value) \ + { (word) &= ~((field ## _BITS) << (field ## _LSB)); \ + (word) |= (((value) & (field ## _BITS)) << (field ## _LSB)); } + +/* + * NOTE: May be used to build value specific mask + * (e.g. GEN_MASK(CTL_DSC_CPHR_3DES,CTL_DSC_CPHR_LSB) + */ +#define GEN_MASK(bits,lsb) ((bits) << (lsb)) + + + + +/* + * Security block data and control exchange + * + * A 2-word message ring descriptor is used to pass a pointer to the control descriptor data structure + * and a pointer to the packet descriptor data structure: + * + * 63 61 60 54 53 52 49 48 45 44 40 + * 39 5 4 0 + * --------------------------------------------------------------------------------------------------------------------------------------------------------- + * | Ctrl | Resp Dest Id Entry0 | IF_L2ALLOC | UNUSED | Control Length | UNUSED + * | 35 MSB of address of control descriptor data structure | Software Scratch0 + * | + * --------------------------------------------------------------------------------------------------------------------------------------------------------- + * 3 7 1 4 4 5 + * 35 5 + * + * 63 61 60 54 53 52 51 50 46 45 44 40 39 5 4 0 + * --------------------------------------------------------------------------------------------------------------------------------------------------------- + * | Ctrl | UNUSED | WRB_COH | WRB_L2ALLOC | DF_PTR_L2ALLOC | UNUSED | Data Length | UNUSED | 35 MSB of address of packet descriptor data structure | UNUSED | + * --------------------------------------------------------------------------------------------------------------------------------------------------------- + * 3 7 1 1 1 5 1 5 35 5 + * + * Addresses assumed to be cache-line aligned, i.e., Address[4:0] ignored (using 5'h00 instead) + * + * Control length is the number of control cachelines to be read so user needs + * to round up + * the control length to closest integer multiple of 32 bytes. Note that at + * present (08/12/04) + * the longest (sensical) ctrl structure is <= 416 bytes, i.e., 13 cachelines. + * + * The packet descriptor data structure size is fixed at 1 cacheline (32 bytes). + * This effectively makes "Data Length" a Load/NoLoad bit. NoLoad causes an abort. + * + * + * Upon completion of operation, the security block returns a 2-word free descriptor + * in the following format: + * + * 63 61 60 54 53 52 51 49 48 47 40 39 0 + * ---------------------------------------------------------------------------------------------------------------------------- + * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | 1'b0 | Instruction Error | Address of control descriptor data structure | + * ---------------------------------------------------------------------------------------------------------------------------- + * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | 1'b0 | Data Error | Address of packet descriptor data structure | + * ---------------------------------------------------------------------------------------------------------------------------- + * + * The Instruction and Data Error codes are enumerated in the + * ControlDescriptor and PacketDescriptor sections below + * + */ + + +/* + * Operating assumptions + * ===================== + * + * + * -> For all IpSec ops, I assume that all the IP/IPSec/TCP headers + * and the data are present at the specified source addresses. + * I also assume that all necessary header data already exists + * at the destination. Additionally, in AH I assume that all + * mutable fields (IP.{TOS, Flags, Offset, TTL, Header_Checksum}) + * and the AH.Authentication_Data have been zeroed by the client. + * + * + * -> In principle, the HW can calculate TCP checksums on both + * incoming and outgoing data; however, since the TCP header + * contains the TCP checksum of the plain payload and the header + * is encrypted, two passes would be necessary to do checksum + encryption + * for outgoing messages; + * therefore the checksum engine will likely only be used during decryption + * (incoming). + * + * + * -> For all operations involving TCP checksum, I assume the client has filled + * the TCP checksum field with the appropriate value: + * + * - 0 for generation phase + * - actual value for verification phase (expecting 0 result) + * + * + * -> For ESP tunnel, the original IP header exists between the end of the + * ESP header and the beginning of the TCP header; it is assumed that the + * maximum length of this header is 16 k(32bit)words (used in CkSum_Offset). + * + * + * -> The authentication data is merely written to the destination address; + * the client is left with the task of comparing to the data in packet + * in decrypt. + * + * -> PacketDescriptor_t.dstLLWMask relevant to AES CTR mode only but it will + * affect all AES-related operations. It will not affect DES/3DES/bypass ops. + * The mask is applied to data as it emerges from the AES engine for the sole + * purpose of providing the authenticator and cksum engines with correct data. + * CAVEAT: the HW does not mask the incoming data. It is the user's responsibility + * to set to 0 the corresponding data in memory. If the surplus data is not masked + * in memory, cksum/auth results will be incorrect if those engines receive data + * straight from memory (i.e., not from cipher, as it happens while decoding) + */ + +/* + * Fragmentation and offset related notes + * ====================================== + * + * + * A) Rebuilding packets from fragments on dword boundaries. The discussion + * below is exemplified by tests memcpy_all_off_frags and memcpy_same_off_frags + * + * 1) The Offset before data/iv on first fragment is ALWAYS written back + * Non-zero dst dword or global offsets may cause more data to be + * written than the user-specified length. + * + * + * Example: + * -------- + * + * Below is a source (first fragment) packet (@ ADD0 cache-aligned address). + * Assume we just copy it and relevant data starts on + * dword 3 so Cipher_Offset = IV_Offset = 3 (dwords). + * D0X denotes relevant data and G denotes dont care data. + * Offset data is also copied so Packet_Legth = 9 (dwords) * 8 = 72 (bytes) + * Segment_src_address = ADD0 + * + * If we want to, e.g., copy so that the relevant (i.e., D0X) data + * starts at (cache-aligned address) ADD1, we need to specify + * Dst_dword_offset = 1 so D00 is moved from dword position 3 to 0 on next cache-line + * Cipher_dst_address = ADD1 - 0x20 so D00 is written to ADD1 + * + * Note that the security engine always writes full cachelines + * therefore, data written to dword0 0 of ADD1 (denoted w/ ?) is what the sec pipe + * write back buffer contained from previous op. + * + * + * SOURCE: DESTINATION: + * ------- ------------ + * + * Segment_src_address = ADD0 Cipher_dst_address = ADD1 - 0x20 + * Packet_Legth = 72 Dst_dword_offset = 1 + * Cipher_Offset = 3 + * IV_Offset = 3 + * Use_IV = ANY + * + * + * + * 3 2 1 0 3 2 1 0 + * ----------------------- ----------------------- + * | D00 | G | G | G | <- ADD0 | G | G | G | ? | <- ADD1 - 0x20 + * ----------------------- ----------------------- + * | D04 | D03 | D02 | D01 | | D03 | D02 | D01 | D00 | <- ADD1 + * ----------------------- ----------------------- + * | | | | D05 | | | | D05 | D04 | + * ----------------------- ----------------------- + * + * 2) On fragments following the first, IV_Offset is overloaded to mean data offset + * (number of dwords to skip from beginning of cacheline before starting processing) + * and Use_IV is overloaded to mean do writeback the offset (in the clear). + * These fields in combination with Dst_dword_offset allow packet fragments with + * arbitrary boundaries/lengthd to be reasembled. + * + * + * Example: + * -------- + * + * Assume data above was first fragment of a packet we'd like to merge to + * (second) fragment below located at ADD2. The written data should follow + * the previous data without gaps or overwrites. To achieve this, one should + * assert the "Next" field on the previous fragment and use self-explanatory + * set of parameters below + * + * + * SOURCE: DESTINATION: + * ------- ------------ + * + * Segment_src_address = ADD2 Cipher_dst_address = ADD1 + 0x20 + * Packet_Legth = 104 Dst_dword_offset = 1 + * IV_Offset = 1 + * Use_IV = 0 + * + * + * + * 3 2 1 0 3 2 1 0 + * ----------------------- ----------------------- + * | D12 | D11 | D10 | G | <- ADD2 | G | G | G | ? | <- ADD1 - 0x20 + * ----------------------- ----------------------- + * | D16 | D15 | D14 | D13 | | D03 | D02 | D01 | D00 | <- ADD1 + * ----------------------- ----------------------- + * | D1a | D19 | D18 | D17 | | D11 | D10 | D05 | D04 | <- ADD1 + 0x20 + * ----------------------- ----------------------- + * | | | | D1b | | D15 | D14 | D13 | D12 | + * ----------------------- ----------------------- + * | D19 | D18 | D17 | D16 | + * ----------------------- + * | | | D1b | D1a | + * ----------------------- + * + * It is note-worthy that the merging can only be achieved if Use_IV is 0. Indeed, the security + * engine always writes full lines, therefore ADD1 + 0x20 will be re-written. Setting Use_IV to 0 + * will allow the sec pipe write back buffer to preserve D04, D05 from previous frag and only + * receive D10, D11 thereby preserving the integrity of the previous data. + * + * 3) On fragments following the first, !UseIV in combination w/ Dst_dword_offset >= (4 - IV_Offset) + * will cause a wraparound of the write thus achieving all 16 possible (Initial_Location, Final_Location) + * combinations for the data. + * + * + * Example: + * -------- + * + * Contiguously merging 2 data sets above with a third located at ADD3. If this is the last fragment, + * reset its Next bit. + * + * + * SOURCE: DESTINATION: + * ------- ------------ + * + * Segment_src_address = ADD3 Cipher_dst_address = ADD1 + 0x80 + * Packet_Legth = 152 Dst_dword_offset = 3 + * IV_Offset = 3 + * Use_IV = 0 + * + * + * + * 3 2 1 0 3 2 1 0 + * ----------------------- ----------------------- + * | D20 | G | G | G | <- ADD2 | G | G | G | ? | <- ADD1 - 0x20 + * ----------------------- ----------------------- + * | D24 | D23 | D22 | D21 | | D03 | D02 | D01 | D00 | <- ADD1 + * ----------------------- ----------------------- + * | D28 | D27 | D26 | D25 | | D11 | D10 | D05 | D04 | <- ADD1 + 0x20 + * ----------------------- ----------------------- + * | D2c | D2b | D2a | D29 | | D15 | D14 | D13 | D12 | + * ----------------------- ----------------------- + * | | D2f | D2e | D2d | | D19 | D18 | D17 | D16 | + * ----------------------- ----------------------- + * | D21 | D20 | D1b | D1a | <- ADD1 + 0x80 + * ----------------------- + * | D25 | D24 | D23 | D22 | + * ----------------------- + * | D29 | D28 | D27 | D26 | + * ----------------------- + * | D2d | D2c | D2b | D2a | + * ----------------------- + * |(D2d)|(D2c)| D2f | D2e | + * ----------------------- + * + * It is worth noticing that always writing full-lines causes the last 2 dwords in the reconstituted + * packet to be unnecessarily written: (D2d) and (D2c) + * + * + * + * B) Implications of fragmentation on AES + * + * 1) AES is a 128 bit block cipher; therefore it requires an even dword total data length + * Data fragments (provided there are more than 1) are allowed to have odd dword + * data lengths provided the total length (cumulated over fragments) is an even dword + * count; an error will be generated otherwise, upon receiving the last fragment descriptor + * (see error conditions below). + * + * 2) While using fragments with AES, a fragment (other than first) starting with a != 0 (IV) offset + * while the subsequent total dword count given to AES is odd may not be required to write + * its offset (UseIV). Doing so will cause an error (see error conditions below). + * + * + * Example: + * -------- + * + * Suppose the first fragment has an odd DATA dword count and USES AES (as seen below) + * + * SOURCE: DESTINATION: + * ------- ------------ + * + * Segment_src_address = ADD0 Cipher_dst_address = ADD1 + * Packet_Legth = 64 Dst_dword_offset = 1 + * Cipher_Offset = 3 + * IV_Offset = 1 + * Use_IV = 1 + * Cipher = Any AES + * Next = 1 + * + * + * + * + * 3 2 1 0 3 2 1 0 + * ----------------------- ----------------------- + * | D00 | IV1 | IV0 | G | <- ADD0 | E00 | IV1 | IV0 | G | <- ADD1 + * ----------------------- ----------------------- + * | D04 | D03 | D02 | D01 | | X | E03 | E02 | E01 | + * ----------------------- ----------------------- + * + * At the end of processing of the previous fragment, the AES engine input buffer has D04 + * and waits for next dword, therefore the writeback buffer cannot finish writing the fragment + * to destination (X instead of E04). + * + * If a second fragment now arrives with a non-0 offset and requires the offset data to be + * written to destination, the previous write (still needing the arrival of the last dword + * required by the AES to complete the previous operation) cannot complete before the present + * should start causing a deadlock. + */ + +/* + * Command Control Word for Message Ring Descriptor + */ + +/* #define MSG_CMD_CTL_CTL */ +#define MSG_CMD_CTL_CTL_LSB 61 +#define MSG_CMD_CTL_CTL_BITS THREE_BITS +#define MSG_CMD_CTL_CTL_MASK (MSG_CMD_CTL_CTL_BITS << MSG_CMD_CTL_CTL_LSB) + +/* #define MSG_CMD_CTL_ID */ +#define MSG_CMD_CTL_ID_LSB 54 +#define MSG_CMD_CTL_ID_BITS SEVEN_BITS +#define MSG_CMD_CTL_ID_MASK (MSG_CMD_CTL_ID_BITS << MSG_CMD_CTL_ID_LSB) + +/* #define MSG_CMD_CTL_LEN */ +#define MSG_CMD_CTL_LEN_LSB 45 +#define MSG_CMD_CTL_LEN_BITS FOUR_BITS +#define MSG_CMD_CTL_LEN_MASK (MSG_CMD_CTL_LEN_BITS << MSG_CMD_CTL_LEN_LSB) + + +/* #define MSG_CMD_CTL_ADDR */ +#define MSG_CMD_CTL_ADDR_LSB 0 +#define MSG_CMD_CTL_ADDR_BITS FOURTY_BITS +#define MSG_CMD_CTL_ADDR_MASK (MSG_CMD_CTL_ADDR_BITS << MSG_CMD_CTL_ADDR_LSB) + +#define MSG_CMD_CTL_MASK (MSG_CMD_CTL_CTL_MASK | \ + MSG_CMD_CTL_LEN_MASK | MSG_CMD_CTL_ADDR_MASK) + +/* + * Command Data Word for Message Ring Descriptor + */ + +/* #define MSG_IN_DATA_CTL */ +#define MSG_CMD_DATA_CTL_LSB 61 +#define MSG_CMD_DATA_CTL_BITS THREE_BITS +#define MSG_CMD_DATA_CTL_MASK (MSG_CMD_DATA_CTL_BITS << MSG_CMD_DATA_CTL_LSB) + +/* #define MSG_CMD_DATA_LEN */ +#define MSG_CMD_DATA_LEN_LOAD 1 +#define MSG_CMD_DATA_LEN_LSB 45 +#define MSG_CMD_DATA_LEN_BITS ONE_BIT +#define MSG_CMD_DATA_LEN_MASK (MSG_CMD_DATA_LEN_BITS << MSG_CMD_DATA_LEN_LSB) + +/* #define MSG_CMD_DATA_ADDR */ +#define MSG_CMD_DATA_ADDR_LSB 0 +#define MSG_CMD_DATA_ADDR_BITS FOURTY_BITS +#define MSG_CMD_DATA_ADDR_MASK (MSG_CMD_DATA_ADDR_BITS << MSG_CMD_DATA_ADDR_LSB) + +#define MSG_CMD_DATA_MASK (MSG_CMD_DATA_CTL_MASK | \ + MSG_CMD_DATA_LEN_MASK | MSG_CMD_DATA_ADDR_MASK) + + +/* + * Upon completion of operation, the Sec block returns a 2-word free descriptor + * in the following format: + * + * 63 61 60 54 53 52 51 49 48 40 39 0 + * ---------------------------------------------------------------------------- + * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | Control Error | Source Address | + * ---------------------------------------------------------------------------- + * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | Data Error | Dest Address | + * ---------------------------------------------------------------------------- + * + * The Control and Data Error codes are enumerated below + * + * Error conditions + * ================ + * + * Control Error Code Control Error Condition + * ------------------ --------------------------- + * 9'h000 No Error + * 9'h001 Unknown Cipher Op ( Cipher == 3'h{6,7}) + * 9'h002 Unknown or Illegal Mode ((Mode == 3'h{2,3,4} & !AES) | (Mode == 3'h{5,6,7})) + * 9'h004 Unsupported CkSum Src (CkSum_Src == 2'h{2,3} & CKSUM) + * 9'h008 Forbidden CFB Mask (AES & CFBMode & UseNewKeysCFBMask & CFBMask[7] & (| CFBMask[6:0])) + * 9'h010 Unknown Ctrl Op ((| Ctrl[63:37]) | (| Ctrl[15:14])) + * 9'h020 UNUSED + * 9'h040 UNUSED + * 9'h080 Data Read Error + * 9'h100 Descriptor Ctrl Field Error (D0.Ctrl != SOP || D1.Ctrl != EOP) + * + * Data Error Code Data Error Condition + * --------------- -------------------- + * 9'h000 No Error + * 9'h001 Insufficient Data To Cipher (Packet_Length <= (Cipher_Offset or IV_Offset)) + * 9'h002 Illegal IV Location ((Cipher_Offset < IV_Offset) | (Cipher_Offset <= IV_Offset & AES & ~CTR)) + * 9'h004 Illegal Wordcount To AES (Packet_Length[3] != Cipher_Offset[0] & AES) + * 9'h008 Illegal Pad And ByteCount Spec (Hash_Byte_Count != 0 & !Pad_Hash) + * 9'h010 Insufficient Data To CkSum ({Packet_Length, 1'b0} <= CkSum_Offset) + * 9'h020 Unknown Data Op ((| dstLLWMask[63:60]) | (| dstLLWMask[57:40]) | (| authDst[63:40]) | (| ckSumDst[63:40])) + * 9'h040 Insufficient Data To Auth ({Packet_Length} <= Auth_Offset) + * 9'h080 Data Read Error + * 9'h100 UNUSED + */ + +/* + * Result Control Word for Message Ring Descriptor + */ + +/* #define MSG_RSLT_CTL_CTL */ +#define MSG_RSLT_CTL_CTL_LSB 61 +#define MSG_RSLT_CTL_CTL_BITS THREE_BITS +#define MSG_RSLT_CTL_CTL_MASK \ + (MSG_RSLT_CTL_CTL_BITS << MSG_RSLT_CTL_CTL_LSB) + +/* #define MSG_RSLT_CTL_DST_ID */ +#define MSG_RSLT_CTL_DST_ID_LSB 54 +#define MSG_RSLT_CTL_DST_ID_BITS SEVEN_BITS +#define MSG_RSLT_CTL_DST_ID_MASK \ + (MSG_RSLT_CTL_DST_ID_BITS << MSG_RSLT_CTL_DST_ID_LSB) + +/* #define MSG_RSLT_CTL_DSC_CTL */ +#define MSG_RSLT_CTL_DSC_CTL_LSB 49 +#define MSG_RSLT_CTL_DSC_CTL_BITS THREE_BITS +#define MSG_RSLT_CTL_DSC_CTL_MASK \ + (MSG_RSLT_CTL_DSC_CTL_BITS << MSG_RSLT_CTL_DSC_CTL_LSB) + +/* #define MSG_RSLT_CTL_INST_ERR */ +#define MSG_RSLT_CTL_INST_ERR_LSB 40 +#define MSG_RSLT_CTL_INST_ERR_BITS NINE_BITS +#define MSG_RSLT_CTL_INST_ERR_MASK \ + (MSG_RSLT_CTL_INST_ERR_BITS << MSG_RSLT_CTL_INST_ERR_LSB) + +/* #define MSG_RSLT_CTL_DSC_ADDR */ +#define MSG_RSLT_CTL_DSC_ADDR_LSB 0 +#define MSG_RSLT_CTL_DSC_ADDR_BITS FOURTY_BITS +#define MSG_RSLT_CTL_DSC_ADDR_MASK \ + (MSG_RSLT_CTL_DSC_ADDR_BITS << MSG_RSLT_CTL_DSC_ADDR_LSB) + +/* #define MSG_RSLT_CTL_MASK */ +#define MSG_RSLT_CTL_MASK \ + (MSG_RSLT_CTL_CTRL_MASK | MSG_RSLT_CTL_DST_ID_MASK | \ + MSG_RSLT_CTL_DSC_CTL_MASK | MSG_RSLT_CTL_INST_ERR_MASK | \ + MSG_RSLT_CTL_DSC_ADDR_MASK) + +/* + * Result Data Word for Message Ring Descriptor + */ +/* #define MSG_RSLT_DATA_CTL */ +#define MSG_RSLT_DATA_CTL_LSB 61 +#define MSG_RSLT_DATA_CTL_BITS THREE_BITS +#define MSG_RSLT_DATA_CTL_MASK \ + (MSG_RSLT_DATA_CTL_BITS << MSG_RSLT_DATA_CTL_LSB) + +/* #define MSG_RSLT_DATA_DST_ID */ +#define MSG_RSLT_DATA_DST_ID_LSB 54 +#define MSG_RSLT_DATA_DST_ID_BITS SEVEN_BITS +#define MSG_RSLT_DATA_DST_ID_MASK \ + (MSG_RSLT_DATA_DST_ID_BITS << MSG_RSLT_DATA_DST_ID_LSB) + +/* #define MSG_RSLT_DATA_DSC_CTL */ +#define MSG_RSLT_DATA_DSC_CTL_LSB 49 +#define MSG_RSLT_DATA_DSC_CTL_BITS THREE_BITS +#define MSG_RSLT_DATA_DSC_CTL_MASK \ + (MSG_RSLT_DATA_DSC_CTL_BITS << MSG_RSLT_DATA_DSC_CTL_LSB) + +/* #define MSG_RSLT_DATA_INST_ERR */ +#define MSG_RSLT_DATA_INST_ERR_LSB 40 +#define MSG_RSLT_DATA_INST_ERR_BITS NINE_BITS +#define MSG_RSLT_DATA_INST_ERR_MASK \ + (MSG_RSLT_DATA_INST_ERR_BITS << MSG_RSLT_DATA_INST_ERR_LSB) + +/* #define MSG_RSLT_DATA_DSC_ADDR */ +#define MSG_RSLT_DATA_DSC_ADDR_LSB 0 +#define MSG_RSLT_DATA_DSC_ADDR_BITS FOURTY_BITS +#define MSG_RSLT_DATA_DSC_ADDR_MASK \ + (MSG_RSLT_DATA_DSC_ADDR_BITS << MSG_RSLT_DATA_DSC_ADDR_LSB) + +#define MSG_RSLT_DATA_MASK \ + (MSG_RSLT_DATA_CTRL_MASK | MSG_RSLT_DATA_DST_ID_MASK | \ + MSG_RSLT_DATA_DSC_CTL_MASK | MSG_RSLT_DATA_INST_ERR_MASK | \ + MSG_RSLT_DATA_DSC_ADDR_MASK) + + +/* + * Common Message Definitions + * + */ + +/* #define MSG_CTL_OP_ADDR */ +#define MSG_CTL_OP_ADDR_LSB 0 +#define MSG_CTL_OP_ADDR_BITS FOURTY_BITS +#define MSG_CTL_OP_ADDR_MASK (MSG_CTL_OP_ADDR_BITS << MSG_CTL_OP_ADDR_LSB) + +#define MSG_CTL_OP_TYPE +#define MSG_CTL_OP_TYPE_LSB 3 +#define MSG_CTL_OP_TYPE_BITS TWO_BITS +#define MSG_CTL_OP_TYPE_MASK \ + (MSG_CTL_OP_TYPE_BITS << MSG_CTL_OP_TYPE_LSB) + +#define MSG0_CTL_OP_ENGINE_SYMKEY 0x01 +#define MSG0_CTL_OP_ENGINE_PUBKEY 0x02 + +#define MSG1_CTL_OP_SYMKEY_PIPE0 0x00 +#define MSG1_CTL_OP_SYMKEY_PIPE1 0x01 +#define MSG1_CTL_OP_SYMKEY_PIPE2 0x02 +#define MSG1_CTL_OP_SYMKEY_PIPE3 0x03 + +#define MSG1_CTL_OP_PUBKEY_PIPE0 0x00 +#define MSG1_CTL_OP_PUBKEY_PIPE1 0x01 +#define MSG1_CTL_OP_PUBKEY_PIPE2 0x02 +#define MSG1_CTL_OP_PUBKEY_PIPE3 0x03 + + +/* /----------------------------------------\ + * | | + * | ControlDescriptor_s datastructure | + * | | + * \----------------------------------------/ + * + * + * ControlDescriptor_t.Instruction + * ------------------------------- + * + * 63 44 43 42 41 40 39 35 34 32 31 29 28 + * -------------------------------------------------------------------------------------------------------------------- + * || UNUSED || OverrideCipher | Arc4Wait4Save | SaveArc4State | LoadArc4State | Arc4KeyLen | Cipher | Mode | InCp_Key || ... CONT ... + * -------------------------------------------------------------------------------------------------------------------- + * 20 1 1 1 1 5 3 3 1 + * <-----------------------------------------------CIPHER---------------------------------------------------> + * + * 27 25 24 23 22 21 20 19 17 16 15 0 + * ----------------------------------------------------------------------------- + * || UNUSED | Hash_Hi | HMAC | Hash_Lo | InHs_Key || UNUSED || CkSum || UNUSED || + * ----------------------------------------------------------------------------- + * 3 1 1 2 1 3 1 16 + * <---------------------HASH---------------------><-----------CKSUM-----------> + * + * X0 CIPHER.Arc4Wait4Save = If op is Arc4 and it requires state saving, then + * setting this bit will cause the current op to + * delay subsequent op loading until saved state data + * becomes visible. + * CIPHER.OverrideCipher = Override encryption if PacketDescriptor_t.dstDataSettings.CipherPrefix + * is set; data will be copied out (and optionally auth/cksum) + * in the clear. This is used in GCM mode if auth only as we + * still need E(K, 0) calculated by cipher. Engine behavior is + * undefined if this bit is set and CipherPrefix is not. + * X0 SaveArc4State = Save Arc4 state at the end of Arc4 operation + * X0 LoadArc4State = Load Arc4 state at the beginning of an Arc4 operation + * This overriden by the InCp_Key setting for Arc4 + * Arc4KeyLen = Length in bytes of Arc4 key (0 is interpreted as 32) + * Ignored for other ciphers + * For ARC4, IFetch/IDecode will always read exactly 4 + * consecutive dwords into its CipherKey{0,3} regardless + * of this quantity; it will however only use the specified + * number of bytes. + * Cipher = 3'b000 Bypass + * 3'b001 DES + * 3'b010 3DES + * 3'b011 AES 128-bit key + * 3'b100 AES 192-bit key + * 3'b101 AES 256-bit key + * 3'b110 ARC4 + * 3'b111 Kasumi f8 + * Remainder UNDEFINED + * Mode = 3'b000 ECB + * 3'b001 CBC + * 3'b010 CFB (AES only, otherwise undefined) + * 3'b011 OFB (AES only, otherwise undefined) + * 3'b100 CTR (AES only, otherwise undefined) + * 3'b101 F8 (AES only, otherwise undefined) + * Remainder UNDEFINED + * InCp_Key = 1'b0 Preserve old Cipher Keys + * 1'b1 Load new Cipher Keys from memory to local registers + * and recalculate the Arc4 Sbox if Arc4 Cipher chosen; + * This overrides LoadArc4State setting. + * HASH.HMAC = 1'b0 Hash without HMAC + * 1'b1 Hash with HMAC + * Needs to be set to 0 for GCM and Kasumi F9 authenticators + * otherwise unpredictable results will be generated + * Hash = 2'b00 Hash NOP + * 2'b01 MD5 + * 2'b10 SHA-1 + * 2'b11 SHA-256 + * 3'b100 SHA-384 + * 3'b101 SHA-512 + * 3'b110 GCM + * 3'b111 Kasumi f9 + * InHs_Key = 1'b0 Preserve old HMAC Keys + * If GCM is selected as authenticator, leaving this bit + * at 0 will cause the engine to use the old H value. + * It will use the old SCI inside the decoder if + * CFBMask[1:0] == 2'b11. + * If Kasumi F9 authenticator, using 0 preserves + * old keys (IK) in decoder. + * 1'b1 Load new HMAC Keys from memory to local registers + * Setting this bit while Cipher=Arc4 and LoadArc4State=1 + * causes the decoder to load the Arc4 state from the + * cacheline following the HMAC keys (Whether HASH.HMAC + * is set or not). + * If GCM is selected as authenticator, setting this bit + * causes both H (16 bytes) and SCI (8 bytes) to be loaded + * from memory to the decoder. H will be loaded to the engine + * but SCI is only loaded to the engine if CFBMask[1:0] == 2'b11. + * If Kasumi F9 authenticator, using 1 loads new keys (IK) + * from memory to decoder. + * CHECKSUM.CkSum = 1'b0 CkSum NOP + * 1'b1 INTERNET_CHECKSUM + * + * + * + */ + + /* #define CTRL_DSC_OVERRIDECIPHER */ +#define CTL_DSC_OVERRIDECIPHER_OFF 0 +#define CTL_DSC_OVERRIDECIPHER_ON 1 +#define CTL_DSC_OVERRIDECIPHER_LSB 43 +#define CTL_DSC_OVERRIDECIPHER_BITS ONE_BIT +#define CTL_DSC_OVERRIDECIPHER_MASK (CTL_DSC_OVERRIDECIPHER_BITS << CTL_DSC_OVERRIDECIPHER_LSB) + +/* #define CTRL_DSC_ARC4_WAIT4SAVE */ +#define CTL_DSC_ARC4_WAIT4SAVE_OFF 0 +#define CTL_DSC_ARC4_WAIT4SAVE_ON 1 +#define CTL_DSC_ARC4_WAIT4SAVE_LSB 42 +#define CTL_DSC_ARC4_WAIT4SAVE_BITS ONE_BIT +#define CTL_DSC_ARC4_WAIT4SAVE_MASK (CTL_DSC_ARC4_WAIT4SAVE_BITS << CTL_DSC_ARC4_WAIT4SAVE_LSB) + +/* #define CTRL_DSC_ARC4_SAVESTATE */ +#define CTL_DSC_ARC4_SAVESTATE_OFF 0 +#define CTL_DSC_ARC4_SAVESTATE_ON 1 +#define CTL_DSC_ARC4_SAVESTATE_LSB 41 +#define CTL_DSC_ARC4_SAVESTATE_BITS ONE_BIT +#define CTL_DSC_ARC4_SAVESTATE_MASK (CTL_DSC_ARC4_SAVESTATE_BITS << CTL_DSC_ARC4_SAVESTATE_LSB) + +/* #define CTRL_DSC_ARC4_LOADSTATE */ +#define CTL_DSC_ARC4_LOADSTATE_OFF 0 +#define CTL_DSC_ARC4_LOADSTATE_ON 1 +#define CTL_DSC_ARC4_LOADSTATE_LSB 40 +#define CTL_DSC_ARC4_LOADSTATE_BITS ONE_BIT +#define CTL_DSC_ARC4_LOADSTATE_MASK (CTL_DSC_ARC4_LOADSTATE_BITS << CTL_DSC_ARC4_LOADSTATE_LSB) + +/* #define CTRL_DSC_ARC4_KEYLEN */ +#define CTL_DSC_ARC4_KEYLEN_LSB 35 +#define CTL_DSC_ARC4_KEYLEN_BITS FIVE_BITS +#define CTL_DSC_ARC4_KEYLEN_MASK (CTL_DSC_ARC4_KEYLEN_BITS << CTL_DSC_ARC4_KEYLEN_LSB) + +/* #define CTL_DSC_CPHR (cipher) */ +#define CTL_DSC_CPHR_BYPASS 0 /* undefined */ +#define CTL_DSC_CPHR_DES 1 +#define CTL_DSC_CPHR_3DES 2 +#define CTL_DSC_CPHR_AES128 3 +#define CTL_DSC_CPHR_AES192 4 +#define CTL_DSC_CPHR_AES256 5 +#define CTL_DSC_CPHR_ARC4 6 +#define CTL_DSC_CPHR_KASUMI_F8 7 +#define CTL_DSC_CPHR_LSB 32 +#define CTL_DSC_CPHR_BITS THREE_BITS +#define CTL_DSC_CPHR_MASK (CTL_DSC_CPHR_BITS << CTL_DSC_CPHR_LSB) + +/* #define CTL_DSC_MODE */ +#define CTL_DSC_MODE_ECB 0 +#define CTL_DSC_MODE_CBC 1 +#define CTL_DSC_MODE_CFB 2 +#define CTL_DSC_MODE_OFB 3 +#define CTL_DSC_MODE_CTR 4 +#define CTL_DSC_MODE_F8 5 +#define CTL_DSC_MODE_LSB 29 +#define CTL_DSC_MODE_BITS THREE_BITS +#define CTL_DSC_MODE_MASK (CTL_DSC_MODE_BITS << CTL_DSC_MODE_LSB) + +/* #define CTL_DSC_ICPHR */ +#define CTL_DSC_ICPHR_OKY 0 /* Old Keys */ +#define CTL_DSC_ICPHR_NKY 1 /* New Keys */ +#define CTL_DSC_ICPHR_LSB 28 +#define CTL_DSC_ICPHR_BITS ONE_BIT +#define CTL_DSC_ICPHR_MASK (CTL_DSC_ICPHR_BITS << CTL_DSC_ICPHR_LSB) + +/* #define CTL_DSC_HASHHI */ +#define CTL_DSC_HASHHI_LSB 24 +#define CTL_DSC_HASHHI_BITS ONE_BIT +#define CTL_DSC_HASHHI_MASK (CTL_DSC_HASHHI_BITS << CTL_DSC_HASHHI_LSB) + +/* #define CTL_DSC_HMAC */ +#define CTL_DSC_HMAC_OFF 0 +#define CTL_DSC_HMAC_ON 1 +#define CTL_DSC_HMAC_LSB 23 +#define CTL_DSC_HMAC_BITS ONE_BIT +#define CTL_DSC_HMAC_MASK (CTL_DSC_HMAC_BITS << CTL_DSC_HMAC_LSB) + +/* #define CTL_DSC_HASH */ +#define CTL_DSC_HASH_NOP 0 +#define CTL_DSC_HASH_MD5 1 +#define CTL_DSC_HASH_SHA1 2 +#define CTL_DSC_HASH_SHA256 3 +#define CTL_DSC_HASH_SHA384 4 +#define CTL_DSC_HASH_SHA512 5 +#define CTL_DSC_HASH_GCM 6 +#define CTL_DSC_HASH_KASUMI_F9 7 +#define CTL_DSC_HASH_LSB 21 +#define CTL_DSC_HASH_BITS TWO_BITS +#define CTL_DSC_HASH_MASK (CTL_DSC_HASH_BITS << CTL_DSC_HASH_LSB) + +/* #define CTL_DSC_IHASH */ +#define CTL_DSC_IHASH_OLD 0 +#define CTL_DSC_IHASH_NEW 1 +#define CTL_DSC_IHASH_LSB 20 +#define CTL_DSC_IHASH_BITS ONE_BIT +#define CTL_DSC_IHASH_MASK (CTL_DSC_IHASH_BITS << CTL_DSC_IHASH_LSB) + +/* #define CTL_DSC_CKSUM */ +#define CTL_DSC_CKSUM_NOP 0 +#define CTL_DSC_CKSUM_IP 1 +#define CTL_DSC_CKSUM_LSB 16 +#define CTL_DSC_CKSUM_BITS ONE_BIT +#define CTL_DSC_CKSUM_MASK (CTL_DSC_CKSUM_BITS << CTL_DSC_CKSUM_LSB) + + +/* + * Component strcts and unions defining CipherHashInfo_u + */ + +/* AES256, (ECB, CBC, OFB, CTR, CFB), HMAC (MD5, SHA-1, SHA-256) - 96 bytes */ +typedef struct AES256HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} AES256HMAC_t, *AES256HMAC_pt; + +/* AES256, (ECB, CBC, OFB, CTR, CFB), HMAC (SHA-384, SHA-512) - 160 bytes */ +typedef struct AES256HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} AES256HMAC2_t, *AES256HMAC2_pt; + +/* AES256, (ECB, CBC, OFB, CTR, CFB), GCM - 56 bytes */ +typedef struct AES256GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} AES256GCM_t, *AES256GCM_pt; + +/* AES256, (ECB, CBC, OFB, CTR, CFB), F9 - 56 bytes */ +typedef struct AES256F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t authKey0; + uint64_t authKey1; +} AES256F9_t, *AES256F9_pt; + +/* AES256, (ECB, CBC, OFB, CTR, CFB), Non-HMAC (MD5, SHA-1, SHA-256) - 32 bytes */ +typedef struct AES256_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; +} AES256_t, *AES256_pt; + + +/* All AES192 possibilities */ + +/* AES192, (ECB, CBC, OFB, CTR, CFB), HMAC (MD5, SHA-1, SHA-192) - 88 bytes */ +typedef struct AES192HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} AES192HMAC_t, *AES192HMAC_pt; + +/* AES192, (ECB, CBC, OFB, CTR, CFB), HMAC (SHA-384, SHA-512) - 152 bytes */ +typedef struct AES192HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} AES192HMAC2_t, *AES192HMAC2_pt; + +/* AES192, (ECB, CBC, OFB, CTR, CFB), GCM - 48 bytes */ +typedef struct AES192GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} AES192GCM_t, *AES192GCM_pt; + +/* AES192, (ECB, CBC, OFB, CTR, CFB), F9 - 48 bytes */ +typedef struct AES192F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t authKey0; + uint64_t authKey1; +} AES192F9_t, *AES192F9_pt; + +/* AES192, (ECB, CBC, OFB, CTR, CFB), Non-HMAC (MD5, SHA-1, SHA-192) - 24 bytes */ +typedef struct AES192_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; +} AES192_t, *AES192_pt; + + +/* All AES128 possibilities */ + +/* AES128, (ECB, CBC, OFB, CTR, CFB), HMAC (MD5, SHA-1, SHA-128) - 80 bytes */ +typedef struct AES128HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} AES128HMAC_t, *AES128HMAC_pt; + +/* AES128, (ECB, CBC, OFB, CTR, CFB), HMAC (SHA-384, SHA-612) - 144 bytes */ +typedef struct AES128HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} AES128HMAC2_t, *AES128HMAC2_pt; + +/* AES128, (ECB, CBC, OFB, CTR, CFB), GCM - 40 bytes */ +typedef struct AES128GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} AES128GCM_t, *AES128GCM_pt; + +/* AES128, (ECB, CBC, OFB, CTR, CFB), F9 - 48 bytes */ +typedef struct AES128F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t authKey0; + uint64_t authKey1; +} AES128F9_t, *AES128F9_pt; + +/* AES128, (ECB, CBC, OFB, CTR, CFB), Non-HMAC (MD5, SHA-1, SHA-128) - 16 bytes */ +typedef struct AES128_s { + uint64_t cipherKey0; + uint64_t cipherKey1; +} AES128_t, *AES128_pt; + +/* AES128, (OFB F8), Non-HMAC (MD5, SHA-1, SHA-256) - 32 bytes */ +typedef struct AES128F8_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; +} AES128F8_t, *AES128F8_pt; + +/* AES128, (OFB F8), HMAC (MD5, SHA-1, SHA-256) - 96 bytes */ +typedef struct AES128F8HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} AES128F8HMAC_t, *AES128F8HMAC_pt; + +/* AES128, (OFB F8), HMAC (SHA-384, SHA-512) - 160 bytes */ +typedef struct AES128F8HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} AES128F8HMAC2_t, *AES128F8HMAC2_pt; + +/* AES192, (OFB F8), Non-HMAC (MD5, SHA-1, SHA-256) - 48 bytes */ +typedef struct AES192F8_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t cipherKeyMask2; +} AES192F8_t, *AES192F8_pt; + +/* AES192, (OFB F8), HMAC (MD5, SHA-1, SHA-256) - 112 bytes */ +typedef struct AES192F8HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t cipherKeyMask2; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} AES192F8HMAC_t, *AES192F8HMAC_pt; + +/* AES192, (OFB F8), HMAC (SHA-384, SHA-512) - 176 bytes */ +typedef struct AES192F8HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t cipherKeyMask2; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} AES192F8HMAC2_t, *AES192F8HMAC2_pt; + +/* AES256, (OFB F8), Non-HMAC (MD5, SHA-1, SHA-256) - 64 bytes */ +typedef struct AES256F8_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t cipherKeyMask2; + uint64_t cipherKeyMask3; +} AES256F8_t, *AES256F8_pt; + +/* AES256, (OFB F8), HMAC (MD5, SHA-1, SHA-256) - 128 bytes */ +typedef struct AES256F8HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t cipherKeyMask2; + uint64_t cipherKeyMask3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} AES256F8HMAC_t, *AES256F8HMAC_pt; + +/* AES256, (OFB F8), HMAC (SHA-384, SHA-512) - 192 bytes */ +typedef struct AES256F8HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t cipherKeyMask0; + uint64_t cipherKeyMask1; + uint64_t cipherKeyMask2; + uint64_t cipherKeyMask3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} AES256F8HMAC2_t, *AES256F8HMAC2_pt; + +/* AES256, (F8), GCM - 40 bytes */ +typedef struct AES128F8GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey2; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} AES128F8GCM_t, *AES128F8GCM_pt; + +/* AES256, (F8), GCM - 48 bytes */ +typedef struct AES192F8GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} AES192F8GCM_t, *AES192F8GCM_pt; + +/* AES256, (F8), GCM - 56 bytes */ +typedef struct AES256F8GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} AES256F8GCM_t, *AES256F8GCM_pt; + +/* AES256, (F8), F9 - 40 bytes */ +typedef struct AES128F8F9_s { + uint64_t cipherKey0; + uint64_t cipherKey2; + uint64_t authKey0; + uint64_t authKey1; +} AES128F8F9_t, *AES128F8F9_pt; + +/* AES256, (F8), F9 - 48 bytes */ +typedef struct AES192F8F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t authKey0; + uint64_t authKey1; +} AES192F8F9_t, *AES192F8F9_pt; + +/* AES256F8, (F8), F9 - 56 bytes */ +typedef struct AES256F8F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t authKey0; + uint64_t authKey1; +} AES256F8F9_t, *AES256F8F9_pt; + +/* All DES possibilities */ + +/* DES, (ECB, CBC), HMAC (MD5, SHA-1, SHA-128) - 72 bytes */ +typedef struct DESHMAC_s { + uint64_t cipherKey0; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} DESHMAC_t, *DESHMAC_pt; + +/* DES, (ECB, CBC), HMAC (SHA-384, SHA-512) - 136 bytes */ +typedef struct DESHMAC2_s { + uint64_t cipherKey0; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} DESHMAC2_t, *DESHMAC2_pt; + +/* DES, (ECB, CBC), GCM - 32 bytes */ +typedef struct DESGCM_s { + uint64_t cipherKey0; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} DESGCM_t, *DESGCM_pt; + +/* DES, (ECB, CBC), F9 - 32 bytes */ +typedef struct DESF9_s { + uint64_t cipherKey0; + uint64_t authKey0; + uint64_t authKey1; +} DESF9_t, *DESF9_pt; + +/* DES, (ECB, CBC), Non-HMAC (MD5, SHA-1, SHA-128) - 9 bytes */ +typedef struct DES_s { + uint64_t cipherKey0; +} DES_t, *DES_pt; + + +/* All 3DES possibilities */ + +/* 3DES, (ECB, CBC), HMAC (MD5, SHA-1, SHA-128) - 88 bytes */ +typedef struct DES3HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} DES3HMAC_t, *DES3HMAC_pt; + +/* 3DES, (ECB, CBC), HMAC (SHA-384, SHA-512) - 152 bytes */ +typedef struct DES3HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} DES3HMAC2_t, *DES3HMAC2_pt; + +/* 3DES, (ECB, CBC), GCM - 48 bytes */ +typedef struct DES3GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} DES3GCM_t, *DES3GCM_pt; + +/* 3DES, (ECB, CBC), GCM - 48 bytes */ +typedef struct DES3F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t authKey0; + uint64_t authKey1; +} DES3F9_t, *DES3F9_pt; + +/* 3DES, (ECB, CBC), Non-HMAC (MD5, SHA-1, SHA-128) - 24 bytes */ +typedef struct DES3_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; +} DES3_t, *DES3_pt; + + +/* HMAC only - no cipher */ + +/* HMAC (MD5, SHA-1, SHA-128) - 64 bytes */ +typedef struct HMAC_s { + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} HMAC_t, *HMAC_pt; + +/* HMAC (SHA-384, SHA-512) - 128 bytes */ +typedef struct HMAC2_s { + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} HMAC2_t, *HMAC2_pt; + +/* GCM - 24 bytes */ +typedef struct GCM_s { + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} GCM_t, *GCM_pt; + +/* F9 - 24 bytes */ +typedef struct F9_s { + uint64_t authKey0; + uint64_t authKey1; +} F9_t, *F9_pt; + +/* All ARC4 possibilities */ +/* ARC4, HMAC (MD5, SHA-1, SHA-256) - 96 bytes */ +typedef struct ARC4HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} ARC4HMAC_t, *ARC4HMAC_pt; + +/* ARC4, HMAC (SHA-384, SHA-512) - 160 bytes */ +typedef struct ARC4HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} ARC4HMAC2_t, *ARC4HMAC2_pt; + +/* ARC4, GCM - 56 bytes */ +typedef struct ARC4GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} ARC4GCM_t, *ARC4GCM_pt; + +/* ARC4, F9 - 56 bytes */ +typedef struct ARC4F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t authKey0; + uint64_t authKey1; +} ARC4F9_t, *ARC4F9_pt; + +/* ARC4, HMAC (MD5, SHA-1, SHA-256) - 408 bytes (not including 8 bytes from instruction) */ +typedef struct ARC4StateHMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t PAD0; + uint64_t PAD1; + uint64_t PAD2; + uint64_t Arc4SboxData0; + uint64_t Arc4SboxData1; + uint64_t Arc4SboxData2; + uint64_t Arc4SboxData3; + uint64_t Arc4SboxData4; + uint64_t Arc4SboxData5; + uint64_t Arc4SboxData6; + uint64_t Arc4SboxData7; + uint64_t Arc4SboxData8; + uint64_t Arc4SboxData9; + uint64_t Arc4SboxData10; + uint64_t Arc4SboxData11; + uint64_t Arc4SboxData12; + uint64_t Arc4SboxData13; + uint64_t Arc4SboxData14; + uint64_t Arc4SboxData15; + uint64_t Arc4SboxData16; + uint64_t Arc4SboxData17; + uint64_t Arc4SboxData18; + uint64_t Arc4SboxData19; + uint64_t Arc4SboxData20; + uint64_t Arc4SboxData21; + uint64_t Arc4SboxData22; + uint64_t Arc4SboxData23; + uint64_t Arc4SboxData24; + uint64_t Arc4SboxData25; + uint64_t Arc4SboxData26; + uint64_t Arc4SboxData27; + uint64_t Arc4SboxData28; + uint64_t Arc4SboxData29; + uint64_t Arc4SboxData30; + uint64_t Arc4SboxData31; + uint64_t Arc4IJData; + uint64_t PAD3; + uint64_t PAD4; + uint64_t PAD5; +} ARC4StateHMAC_t, *ARC4StateHMAC_pt; + +/* ARC4, HMAC (SHA-384, SHA-512) - 480 bytes (not including 8 bytes from instruction) */ +typedef struct ARC4StateHMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; + uint64_t PAD0; + uint64_t PAD1; + uint64_t PAD2; + uint64_t Arc4SboxData0; + uint64_t Arc4SboxData1; + uint64_t Arc4SboxData2; + uint64_t Arc4SboxData3; + uint64_t Arc4SboxData4; + uint64_t Arc4SboxData5; + uint64_t Arc4SboxData6; + uint64_t Arc4SboxData7; + uint64_t Arc4SboxData8; + uint64_t Arc4SboxData9; + uint64_t Arc4SboxData10; + uint64_t Arc4SboxData11; + uint64_t Arc4SboxData12; + uint64_t Arc4SboxData13; + uint64_t Arc4SboxData14; + uint64_t Arc4SboxData15; + uint64_t Arc4SboxData16; + uint64_t Arc4SboxData17; + uint64_t Arc4SboxData18; + uint64_t Arc4SboxData19; + uint64_t Arc4SboxData20; + uint64_t Arc4SboxData21; + uint64_t Arc4SboxData22; + uint64_t Arc4SboxData23; + uint64_t Arc4SboxData24; + uint64_t Arc4SboxData25; + uint64_t Arc4SboxData26; + uint64_t Arc4SboxData27; + uint64_t Arc4SboxData28; + uint64_t Arc4SboxData29; + uint64_t Arc4SboxData30; + uint64_t Arc4SboxData31; + uint64_t Arc4IJData; + uint64_t PAD3; + uint64_t PAD4; + uint64_t PAD5; +} ARC4StateHMAC2_t, *ARC4StateHMAC2_pt; + +/* ARC4, GCM - 408 bytes (not including 8 bytes from instruction) */ +typedef struct ARC4StateGCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; + uint64_t PAD0; + uint64_t PAD1; + uint64_t PAD2; + uint64_t PAD3; + uint64_t PAD4; + uint64_t PAD5; + uint64_t PAD6; + uint64_t PAD7; + uint64_t Arc4SboxData0; + uint64_t Arc4SboxData1; + uint64_t Arc4SboxData2; + uint64_t Arc4SboxData3; + uint64_t Arc4SboxData4; + uint64_t Arc4SboxData5; + uint64_t Arc4SboxData6; + uint64_t Arc4SboxData7; + uint64_t Arc4SboxData8; + uint64_t Arc4SboxData9; + uint64_t Arc4SboxData10; + uint64_t Arc4SboxData11; + uint64_t Arc4SboxData12; + uint64_t Arc4SboxData13; + uint64_t Arc4SboxData14; + uint64_t Arc4SboxData15; + uint64_t Arc4SboxData16; + uint64_t Arc4SboxData17; + uint64_t Arc4SboxData18; + uint64_t Arc4SboxData19; + uint64_t Arc4SboxData20; + uint64_t Arc4SboxData21; + uint64_t Arc4SboxData22; + uint64_t Arc4SboxData23; + uint64_t Arc4SboxData24; + uint64_t Arc4SboxData25; + uint64_t Arc4SboxData26; + uint64_t Arc4SboxData27; + uint64_t Arc4SboxData28; + uint64_t Arc4SboxData29; + uint64_t Arc4SboxData30; + uint64_t Arc4SboxData31; + uint64_t Arc4IJData; + uint64_t PAD8; + uint64_t PAD9; + uint64_t PAD10; +} ARC4StateGCM_t, *ARC4StateGCM_pt; + +/* ARC4, F9 - 408 bytes (not including 8 bytes from instruction) */ +typedef struct ARC4StateF9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t authKey0; + uint64_t authKey1; + uint64_t PAD0; + uint64_t PAD1; + uint64_t PAD2; + uint64_t PAD3; + uint64_t PAD4; + uint64_t PAD5; + uint64_t PAD6; + uint64_t PAD7; + uint64_t PAD8; + uint64_t Arc4SboxData0; + uint64_t Arc4SboxData1; + uint64_t Arc4SboxData2; + uint64_t Arc4SboxData3; + uint64_t Arc4SboxData4; + uint64_t Arc4SboxData5; + uint64_t Arc4SboxData6; + uint64_t Arc4SboxData7; + uint64_t Arc4SboxData8; + uint64_t Arc4SboxData9; + uint64_t Arc4SboxData10; + uint64_t Arc4SboxData11; + uint64_t Arc4SboxData12; + uint64_t Arc4SboxData13; + uint64_t Arc4SboxData14; + uint64_t Arc4SboxData15; + uint64_t Arc4SboxData16; + uint64_t Arc4SboxData17; + uint64_t Arc4SboxData18; + uint64_t Arc4SboxData19; + uint64_t Arc4SboxData20; + uint64_t Arc4SboxData21; + uint64_t Arc4SboxData22; + uint64_t Arc4SboxData23; + uint64_t Arc4SboxData24; + uint64_t Arc4SboxData25; + uint64_t Arc4SboxData26; + uint64_t Arc4SboxData27; + uint64_t Arc4SboxData28; + uint64_t Arc4SboxData29; + uint64_t Arc4SboxData30; + uint64_t Arc4SboxData31; + uint64_t Arc4IJData; + uint64_t PAD9; + uint64_t PAD10; + uint64_t PAD11; +} ARC4StateF9_t, *ARC4StateF9_pt; + +/* ARC4, Non-HMAC (MD5, SHA-1, SHA-256) - 32 bytes */ +typedef struct ARC4_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; +} ARC4_t, *ARC4_pt; + +/* ARC4, Non-HMAC (MD5, SHA-1, SHA-256) - 344 bytes (not including 8 bytes from instruction) */ +typedef struct ARC4State_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t cipherKey2; + uint64_t cipherKey3; + uint64_t PAD0; + uint64_t PAD1; + uint64_t PAD2; + uint64_t Arc4SboxData0; + uint64_t Arc4SboxData1; + uint64_t Arc4SboxData2; + uint64_t Arc4SboxData3; + uint64_t Arc4SboxData4; + uint64_t Arc4SboxData5; + uint64_t Arc4SboxData6; + uint64_t Arc4SboxData7; + uint64_t Arc4SboxData8; + uint64_t Arc4SboxData9; + uint64_t Arc4SboxData10; + uint64_t Arc4SboxData11; + uint64_t Arc4SboxData12; + uint64_t Arc4SboxData13; + uint64_t Arc4SboxData14; + uint64_t Arc4SboxData15; + uint64_t Arc4SboxData16; + uint64_t Arc4SboxData17; + uint64_t Arc4SboxData18; + uint64_t Arc4SboxData19; + uint64_t Arc4SboxData20; + uint64_t Arc4SboxData21; + uint64_t Arc4SboxData22; + uint64_t Arc4SboxData23; + uint64_t Arc4SboxData24; + uint64_t Arc4SboxData25; + uint64_t Arc4SboxData26; + uint64_t Arc4SboxData27; + uint64_t Arc4SboxData28; + uint64_t Arc4SboxData29; + uint64_t Arc4SboxData30; + uint64_t Arc4SboxData31; + uint64_t Arc4IJData; + uint64_t PAD3; + uint64_t PAD4; + uint64_t PAD5; +} ARC4State_t, *ARC4State_pt; + +/* Kasumi f8 - 32 bytes */ +typedef struct KASUMIF8_s { + uint64_t cipherKey0; + uint64_t cipherKey1; +} KASUMIF8_t, *KASUMIF8_pt; + +/* Kasumi f8 + HMAC (MD5, SHA-1, SHA-256) - 80 bytes */ +typedef struct KASUMIF8HMAC_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; +} KASUMIF8HMAC_t, *KASUMIF8HMAC_pt; + +/* Kasumi f8 + HMAC (SHA-384, SHA-512) - 144 bytes */ +typedef struct KASUMIF8HMAC2_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t hmacKey0; + uint64_t hmacKey1; + uint64_t hmacKey2; + uint64_t hmacKey3; + uint64_t hmacKey4; + uint64_t hmacKey5; + uint64_t hmacKey6; + uint64_t hmacKey7; + uint64_t hmacKey8; + uint64_t hmacKey9; + uint64_t hmacKey10; + uint64_t hmacKey11; + uint64_t hmacKey12; + uint64_t hmacKey13; + uint64_t hmacKey14; + uint64_t hmacKey15; +} KASUMIF8HMAC2_t, *KASUMIF8HMAC2_pt; + +/* Kasumi f8 + GCM - 144 bytes */ +typedef struct KASUMIF8GCM_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t GCMH0; + uint64_t GCMH1; + uint64_t GCMSCI; +} KASUMIF8GCM_t, *KASUMIF8GCM_pt; + +/* Kasumi f8 + f9 - 32 bytes */ +typedef struct KASUMIF8F9_s { + uint64_t cipherKey0; + uint64_t cipherKey1; + uint64_t authKey0; + uint64_t authKey1; +} KASUMIF8F9_t, *KASUMIF8F9_pt; + +typedef union CipherHashInfo_u { + AES256HMAC_t infoAES256HMAC; + AES256_t infoAES256; + AES192HMAC_t infoAES192HMAC; + AES192_t infoAES192; + AES128HMAC_t infoAES128HMAC; + AES128_t infoAES128; + DESHMAC_t infoDESHMAC; + DES_t infoDES; + DES3HMAC_t info3DESHMAC; + DES3_t info3DES; + HMAC_t infoHMAC; + /* ARC4 */ + ARC4HMAC_t infoARC4HMAC; + ARC4StateHMAC_t infoARC4StateHMAC; + ARC4_t infoARC4; + ARC4State_t infoARC4State; + /* AES mode F8 */ + AES256F8HMAC_t infoAES256F8HMAC; + AES256F8_t infoAES256F8; + AES192F8HMAC_t infoAES192F8HMAC; + AES192F8_t infoAES192F8; + AES128F8HMAC_t infoAES128F8HMAC; + AES128F8_t infoAES128F8; + /* KASUMI F8 */ + KASUMIF8HMAC_t infoKASUMIF8HMAC; + KASUMIF8_t infoKASUMIF8; + /* GCM */ + GCM_t infoGCM; + AES256F8GCM_t infoAES256F8GCM; + AES192F8GCM_t infoAES192F8GCM; + AES128F8GCM_t infoAES128F8GCM; + AES256GCM_t infoAES256GCM; + AES192GCM_t infoAES192GCM; + AES128GCM_t infoAES128GCM; + DESGCM_t infoDESGCM; + DES3GCM_t info3DESGCM; + ARC4GCM_t infoARC4GCM; + ARC4StateGCM_t infoARC4StateGCM; + KASUMIF8GCM_t infoKASUMIF8GCM; + /* HMAC2 */ + HMAC2_t infoHMAC2; + AES256F8HMAC2_t infoAES256F8HMAC2; + AES192F8HMAC2_t infoAES192F8HMAC2; + AES128F8HMAC2_t infoAES128F8HMAC2; + AES256HMAC2_t infoAES256HMAC2; + AES192HMAC2_t infoAES192HMAC2; + AES128HMAC2_t infoAES128HMAC2; + DESHMAC2_t infoDESHMAC2; + DES3HMAC2_t info3DESHMAC2; + ARC4HMAC2_t infoARC4HMAC2; + ARC4StateHMAC2_t infoARC4StateHMAC2; + KASUMIF8HMAC2_t infoKASUMIF8HMAC2; + /* F9 */ + F9_t infoF9; + AES256F8F9_t infoAES256F8F9; + AES192F8F9_t infoAES192F8F9; + AES128F8F9_t infoAES128F8F9; + AES256F9_t infoAES256F9; + AES192F9_t infoAES192F9; + AES128F9_t infoAES128F9; + DESF9_t infoDESF9; + DES3F9_t info3DESF9; + ARC4F9_t infoARC4F9; + ARC4StateF9_t infoARC4StateF9; + KASUMIF8F9_t infoKASUMIF8F9; +} CipherHashInfo_t, *CipherHashInfo_pt; + + +/* + * + * ControlDescriptor_s datastructure + * + */ + +typedef struct ControlDescriptor_s { + uint64_t instruction; + CipherHashInfo_t cipherHashInfo; +} ControlDescriptor_t, *ControlDescriptor_pt; + + + + +/* ********************************************************************** + * PacketDescriptor_t + * ********************************************************************** + */ + +/* /--------------------------------------------\ + * | | + * | New PacketDescriptor_s datastructure | + * | | + * \--------------------------------------------/ + * + * + * + * PacketDescriptor_t.srcLengthIVOffUseIVNext + * ------------------------------------------ + * + * 63 62 61 59 58 57 56 54 53 43 + * ------------------------------------------------------------------------------------------------ + * || Load HMAC key || Pad Hash || Hash Byte Count || Next || Use IV || IV Offset || Packet length || ... CONT ... + * ------------------------------------------------------------------------------------------------ + * 1 1 3 1 1 3 11 + * + * + * 42 41 40 39 5 4 3 2 + * 0 + * ---------------------------------------------------------------------------------------------------- + * || NLHMAC || Break || Wait || Segment src address || SRTCP || Reserved || Global src data offset || + * ---------------------------------------------------------------------------------------------------- + * 1 1 1 35 1 1 3 + * + * + * + * Load HMAC key = 1'b0 Preserve old HMAC key stored in Auth engine (moot if HASH.HMAC == 0) + * 1'b1 Load HMAC key from ID registers at beginning of op + * If GCM is selected as authenticator, setting this bit + * will cause the H value from ID to be loaded to the engine + * If Kasumi F9 is selected as authenticator, setting this bit + * will cause the IK value from ID to be loaded to the engine. + * Pad Hash = 1'b0 HASH will assume the data was padded to be a multiple + * of 512 bits in length and that the last 64 bit word + * expresses the total datalength in bits seen by HASH engine + * 1'b1 The data was not padded to be a multiple of 512 bits in length; + * The Hash engine will do its own padding to generate the correct digest. + * Ignored by GCM (always does its own padding) + * Hash Byte Count Number of BYTES on last 64-bit data word to use in digest calculation RELEVANT ONLY IF Pad Hash IS SET + * 3'b000 Use all 8 + * 3'b001 Use first (MS) byte only (0-out rest), i.e., 0xddXXXXXXXXXXXXXX + * 3'b010 Use first 2 bytes only (0-out rest), i.e., 0xddddXXXXXXXXXXXX ... etc + * Next = 1'b0 Finish (return msg descriptor) at end of operation + * 1'b1 Grab the next PacketDescriptor (i.e. next cache-line) when the current is complete. + * This allows for fragmentation/defragmentation and processing of large (>16kB) packets. + * The sequence of adjacent PacketDescriptor acts as a contiguous linked list of + * pointers to the actual packets with Next==0 on the last PacketDescriptor to end processing. + * Use IV = 1'b0 On first frag: Use old IV + * On subsequent frags: Do not write out to DST the (dword) offset data + * 1'b1 On first frag: Use data @ Segment_address + IV_Offset as IV + * On subsequent frags: Do write out to DST the (dword) offset data + * IV Offset = On first frag: Offset IN NB OF 8 BYTE WORDS (dwords) from beginning of packet + * (i.e. (Potentially byte-shifted) Segment address) to cipher IV + * On subsequent frags: Offset to beginning of data to process; data to offset won't + * be given to engines and will be written out to dst in the clear. + * ON SUBSEQUENT FRAGS, IV_Offset MAY NOT EXCEED 3; LARGER VALUES WILL CAUSE AN ERROR + * SEE ERROR CONDITIONS BELOW + * Packet length = Nb double words to stream in (Including Segment address->CP/IV/Auth/CkSum offsets) + * This is the total amount of data (x8 in bytes) read (+1 dword if "Global src data offset" != 0) + * This is the total amount of data (x8 in bytes) written (+1 dword if "Global dst data offset" != 0, if Dst dword offset == 0) + * If Packet length == 11'h7ff and (Global src data offset != 0 or Global dst data offset != 0) + * the operation is aborted (no mem writes occur) + * and the "Insufficient Data To Cipher" error flag is raised + * NLHMAC = No last to hmac. Setting this to 1 will prevent the transmission of the last DWORD + * to the authenticator, i.e., the DWORD before last will be designated as last for the purposes of authentication. + * Break = Break a wait (see below) state - causes the operation to be flushed and free descriptor to be returned. + * Activated if DFetch blocked by Wait and Wait still active. + * AS OF 02/10/2005 THIS FEATURE IS EXPERIMENTAL + * Wait = Setting that bit causes the operation to block in DFetch stage. + * DFetch will keep polling the memory location until the bit is reset at which time + * the pipe resumes normal operation. This feature is convenient for software dealing with fragmented packets. + * AS OF 02/10/2005 THIS FEATURE IS EXPERIMENTAL + * Segment src address = 35 MSB of pointer to src data (i.e., cache-line aligned) + * SRTCP = Bypass the cipher for the last 4 bytes of data, i.e. the last 4 bytes will be sent to memory + * and the authenticator in the clear. Applicable to last packet descriptor andlast frag only. + * This accommodates a requirement of SRTCP. + * Global src data offset = Nb BYTES to right-shift data by before presenting it to engines + * (0-7); allows realignment of byte-aligned, non-double-word aligned data + * + * PacketDescriptor_t.dstDataSettings + * ---------------------------------- + * + * + * 63 62 60 59 58 56 55 54 53 52 41 40 + * ------------------------------------------------------------------------------------------------------------ + * || CipherPrefix | Arc4ByteCount | E/D | Cipher_Offset || Hash_Offset | Hash_Src || CkSum_Offset | CkSum_Src || ... CONT ... + * ------------------------------------------------------------------------------------------------------------ + * 1 3 1 3 2 1 12 1 + * <-----------------------CIPHER-----------------------><---------HASH-----------><-------CHECKSUM-----------> + * + * + * CipherPrefix = 128'b0 will be sent to the selected cipher + * KEEP VALUE ON ALL FRAGS after the IV is loaded, before the actual data goes in. + * The result of that encryption (aka E(K, 0))will be stored + * locally and XOR-ed with the auth digest to create the final + * digest at the end of the auth OP: + * This is covered by the GCM spec + * AesPrefix = 1'b1 -> Force E=Cipher(K,0) before start of data encr. + * -> Digest ^= E + * AesPrefix = 1'b0 -> Regular digest + * This flag is ignored if no cipher is chosen (Bypass condition) + * X0 Arc4ByteCount = Number of BYTES on last 64-bit data word to encrypt + * 3'b000 Encrypt all 8 + * 3'b001 Encrypt first (MS) byte only i.e., 0xddXXXXXXXXXXXXXX + * 3'b010 Encrypt first 2 bytes only i.e., 0xddddXXXXXXXXXXXX ... etc + * In reality, all are encrypted, however, the SBOX + * is not written past the last byte to encrypt + * E/D = 1'b0 Decrypt + * 1'b1 Encrypt + * Overloaded to also mean IV byte offset for first frag + * Cipher_Offset = Nb of words between the first data segment + * and word on which to start cipher operation + * (64 BIT WORDS !!!) + * Hash_Offset = Nb of words between the first data segment + * and word on which to start hashing + * (64 bit words) + * Hash_Src = 1'b0 DMA channel + * 1'b1 Cipher if word count exceeded Cipher_Offset; + * DMA channel otherwise + * CkSum_Offset = Nb of words between the first data segment + * and word on which to start + * checksum calculation (32 BIT WORDS !!!) + * CkSum_Src = 1'b0 DMA channel + * 1'b1 Cipher if word count exceeded Cipher_Offset + * DMA channel otherwise + * Cipher dst address = 35 MSB of pointer to dst location (i.e., cache-line aligned) + * Dst dword offset = Nb of double-words to left-shift data from spec'ed Cipher dst address before writing it to memory + * Global dst data offset = Nb BYTES to left-shift (double-word boundary aligned) data by before writing it to memory + * + * + * PacketDescriptor_t.authDstNonceLow + * ---------------------------------- + * + * 63 40 39 5 4 0 + * ----------------------------------------------------- + * || Nonce_Low || Auth_dst_address || Cipher_Offset_Hi || + * ----------------------------------------------------- + * 24 35 5 + * + * + * + * Nonce_Low = Nonce[23:0] 24 least significant bits of 32-bit long nonce + * Used by AES in counter mode + * Auth_dst_address = 35 MSB of pointer to authentication dst location (i.e., cache-line aligned) + * X0 Cipher_Offset_Hi = On first frag: 5 MSB of 8-bit Cipher_offset; will be concatenated to + * the top of PacketDescriptor_t.dstDataSettings.Cipher_Offset + * On subsequent frags: Ignored + * + * + * PacketDescriptor_t.ckSumDstNonceHiCFBMaskLLWMask + * ------------------------------------------------ + * + * + * 63 61 60 58 57 56 55 48 47 40 39 5 4 0 + * ------------------------------------------------------------------------------------------------------------------- + * || Hash_Byte_Offset || Packet length bytes || LLWMask || CFB_Mask || Nonce_Hi || CkSum_dst_address || IV_Offset_Hi || + * ------------------------------------------------------------------------------------------------------------------- + * 3 3 2 8 8 35 5 + * + * + * Hash_Byte_Offset = On first frag: Additional offset in bytes to be added to Hash_Offset + * to obtain the full offset applied to the data before + * submitting it to authenticator + * On subsequent frags: Same + * Packet length bytes = On one fragment payloads: Ignored (i.e. assumed to be 0, last dword used in its entirety) + * On fragments before last: Number of bytes on last fragment dword + * On last fragment: Ignored (i.e. assumed to be 0, last dword used in its entirety) + * LLWMask, aka, Last_long_word_mask = 2'b00 Give last 128 bit word from AES engine to auth/cksum/wrbbufer as is - applicable in AES CTR only + * 2'b11 Mask (zero-out) 32 least significant bits + * 2'b10 Mask 64 LSBs + * 2'b01 Mask 96 LSBs + * If the GCM authenticator is used, setting LLWMask to 2'b10 or 2'b01 + * will also prevent the transmission of the last DWORD + * to the authenticator, i.e., the DWORD before last will + * be designated as last for the purposes of authentication. + * CFB_Mask = 8 bit mask used by AES in CFB mode + * In CTR mode: + * CFB_Mask[1:0] = 2'b00 -> Counter[127:0] = {Nonce[31:0], IV0[63:0], 4'h00000001} (only 1 IV exp +ected) regular CTR + * 2'b01 -> Counter[127:0] = {Nonce[31:0], IV0[63:0], IV1[31:0]} (2 IV expected +) CCMP + * 2'b10 -> Counter[127:0] = {IV1[63:0], IV0[31:0], Nonce[31:0]} (2 IV expected +) GCM with SCI + * 2'b11 -> Counter[127:0] = {IDecode.SCI[63:0], IV0[31:0], Nonce[31:0]} (1 IV expected +) GCM w/o SCI + * Nonce_Hi = Nonce[31:24] 8 most significant bits of 32-bit long nonce + * Used by AES in counter mode + * CkSum_dst_address = 35 MSB of pointer to cksum dst location (i.e., cache-line aligned) + * X0 IV_Offset_Hi = On first frag: 5 MSB of 8-bit IV offset; will be concatenated to + * the top of PacketDescriptor_t.srcLengthIVOffUseIVNext.IV_Offset + * On subsequent frags: Ignored + */ + +/* #define PKT_DSC_LOADHMACKEY */ +#define PKT_DSC_LOADHMACKEY_OLD 0 +#define PKT_DSC_LOADHMACKEY_LOAD 1 +#define PKT_DSC_LOADHMACKEY_LSB 63 +#define PKT_DSC_LOADHMACKEY_BITS ONE_BIT +#define PKT_DSC_LOADHMACKEY_MASK \ + (PKT_DSC_LOADHMACKEY_BITS << PKT_DSC_LOADHMACKEY_LSB) + +/* #define PKT_DSC_PADHASH */ +#define PKT_DSC_PADHASH_PADDED 0 +#define PKT_DSC_PADHASH_PAD 1 /* requires padding */ +#define PKT_DSC_PADHASH_LSB 62 +#define PKT_DSC_PADHASH_BITS ONE_BIT +#define PKT_DSC_PADHASH_MASK (PKT_DSC_PADHASH_BITS << PKT_DSC_PADHASH_LSB) + +/* #define PKT_DSC_HASHBYTES */ +#define PKT_DSC_HASHBYTES_ALL8 0 +#define PKT_DSC_HASHBYTES_MSB 1 +#define PKT_DSC_HASHBYTES_MSW 2 +#define PKT_DSC_HASHBYTES_LSB 59 +#define PKT_DSC_HASHBYTES_BITS THREE_BITS +#define PKT_DSC_HASHBYTES_MASK \ + (PKT_DSC_HASHBYTES_BITS << PKT_DSC_HASHBYTES_LSB) + +/* #define PKT_DSC_NEXT */ +#define PKT_DSC_NEXT_FINISH 0 +#define PKT_DSC_NEXT_DO 1 +#define PKT_DSC_NEXT_LSB 58 +#define PKT_DSC_NEXT_BITS ONE_BIT +#define PKT_DSC_NEXT_MASK (PKT_DSC_NEXT_BITS << PKT_DSC_NEXT_LSB) + +/* #define PKT_DSC_IV */ +#define PKT_DSC_IV_OLD 0 +#define PKT_DSC_IV_NEW 1 +#define PKT_DSC_IV_LSB 57 +#define PKT_DSC_IV_BITS ONE_BIT +#define PKT_DSC_IV_MASK (PKT_DSC_IV_BITS << PKT_DSC_IV_LSB) + +/* #define PKT_DSC_IVOFF */ +#define PKT_DSC_IVOFF_LSB 54 +#define PKT_DSC_IVOFF_BITS THREE_BITS +#define PKT_DSC_IVOFF_MASK (PKT_DSC_IVOFF_BITS << PKT_DSC_IVOFF_LSB) + +/* #define PKT_DSC_PKTLEN */ +#define PKT_DSC_PKTLEN_LSB 43 +#define PKT_DSC_PKTLEN_BITS ELEVEN_BITS +#define PKT_DSC_PKTLEN_MASK (PKT_DSC_PKTLEN_BITS << PKT_DSC_PKTLEN_LSB) + +/* #define PKT_DSC_NLHMAC */ +#define PKT_DSC_NLHMAC_LSB 42 +#define PKT_DSC_NLHMAC_BITS ONE_BIT +#define PKT_DSC_NLHMAC_MASK (PKT_DSC_NLHMAC_BITS << PKT_DSC_NLHMAC_LSB) + +/* #define PKT_DSC_BREAK */ +#define PKT_DSC_BREAK_OLD 0 +#define PKT_DSC_BREAK_NEW 1 +#define PKT_DSC_BREAK_LSB 41 +#define PKT_DSC_BREAK_BITS ONE_BIT +#define PKT_DSC_BREAK_MASK (PKT_DSC_BREAK_BITS << PKT_DSC_BREAK_LSB) + +/* #define PKT_DSC_WAIT */ +#define PKT_DSC_WAIT_OLD 0 +#define PKT_DSC_WAIT_NEW 1 +#define PKT_DSC_WAIT_LSB 40 +#define PKT_DSC_WAIT_BITS ONE_BIT +#define PKT_DSC_WAIT_MASK (PKT_DSC_WAIT_BITS << PKT_DSC_WAIT_LSB) + +/* #define PKT_DSC_SEGADDR */ +#define PKT_DSC_SEGADDR_LSB 5 +#define PKT_DSC_SEGADDR_BITS FOURTY_BITS +#define PKT_DSC_SEGADDR_MASK \ + (PKT_DSC_SEGADDR_BITS << PKT_DSC_SEGADDR_LSB) + +/* #define PKT_DSC_SRTCP */ +#define PKT_DSC_SRTCP_OFF 0 +#define PKT_DSC_SRTCP_ON 1 +#define PKT_DSC_SRTCP_LSB 4 +#define PKT_DSC_SRTCP_BITS ONE_BIT +#define PKT_DSC_SRTCP_MASK (PKT_DSC_SRTCP_BITS << PKT_DSC_SRTCP_LSB) + +#define PKT_DSC_SEGOFFSET_LSB 0 +#define PKT_DSC_SEGOFFSET_BITS THREE_BITS +#define PKT_DSC_SEGOFFSET_MASK \ + (PKT_DSC_SEGOFFSET_BITS << PKT_DSC_SEGOFFSET_LSB) + +/* ********************************************************************** + * PacketDescriptor_t.dstDataSettings + * ********************************************************************** + */ +/* #define PKT_DSC_ARC4BYTECOUNT */ +#define PKT_DSC_ARC4BYTECOUNT_ALL8 0 +#define PKT_DSC_ARC4BYTECOUNT_MSB 1 +#define PKT_DSC_ARC4BYTECOUNT_MSW 2 +#define PKT_DSC_ARC4BYTECOUNT_LSB 60 +#define PKT_DSC_ARC4BYTECOUNT_BITS THREE_BITS +#define PKT_DSC_ARC4BYTECOUNT_MASK (PKT_DSC_ARC4BYTECOUNT_BITS << PKT_DSC_ARC4BYTECOUNT_LSB) + +/* #define PKT_DSC_SYM_OP (symmetric key operation) */ +#define PKT_DSC_SYM_OP_DECRYPT 0 +#define PKT_DSC_SYM_OP_ENCRYPT 1 +#define PKT_DSC_SYM_OP_LSB 59 +#define PKT_DSC_SYM_OP_BITS ONE_BIT +#define PKT_DSC_SYM_OP_MASK (PKT_DSC_SYM_OP_BITS << PKT_DSC_SYM_OP_LSB) + +/* #define PKT_DSC_CPHROFF */ +#define PKT_DSC_CPHROFF_LSB 56 +#define PKT_DSC_CPHROFF_BITS THREE_BITS +#define PKT_DSC_CPHROFF_MASK (PKT_DSC_CPHROFF_BITS << PKT_DSC_CPHROFF_LSB) + +/* #define PKT_DSC_HASHOFF */ +#define PKT_DSC_HASHOFF_LSB 54 +#define PKT_DSC_HASHOFF_BITS TWO_BITS +#define PKT_DSC_HASHOFF_MASK (PKT_DSC_HASHOFF_BITS << PKT_DSC_HASHOFF_LSB) + +/* #define PKT_DSC_HASHSRC */ +#define PKT_DSC_HASHSRC_DMA 0 +#define PKT_DSC_HASHSRC_CIPHER 1 +#define PKT_DSC_HASHSRC_LSB 53 +#define PKT_DSC_HASHSRC_BITS ONE_BIT +#define PKT_DSC_HASHSRC_MASK (PKT_DSC_HASHSRC_BITS << PKT_DSC_HASHSRC_LSB) + +/* #define PKT_DSC_CKSUMOFF */ +#define PKT_DSC_CKSUMOFF_LSB 41 +#define PKT_DSC_CKSUMOFF_BITS TWELVE_BITS +#define PKT_DSC_CKSUMOFF_MASK (PKT_DSC_CKSUMOFF_BITS << PKT_DSC_CKSUMOFF_LSB) + +/* #define PKT_DSC_CKSUMSRC */ +#define PKT_DSC_CKSUMSRC_DMA 0 +#define PKT_DSC_CKSUMSRC_CIPHER 1 +#define PKT_DSC_CKSUMSRC_LSB 40 +#define PKT_DSC_CKSUMSRC_BITS ONE_BIT +#define PKT_DSC_CKSUMSRC_MASK (PKT_DSC_CKSUMSRC_BITS << PKT_DSC_CKSUMSRC_LSB) + +/* #define PKT_DSC_CPHR_DST_ADDR */ +#define PKT_DSC_CPHR_DST_ADDR_LSB 0 +#define PKT_DSC_CPHR_DST_ADDR_BITS FOURTY_BITS +#define PKT_DSC_CPHR_DST_ADDR_MASK \ + (PKT_DSC_CPHR_DST_ADDR_BITS << PKT_DSC_CPHR_DST_ADDR_LSB) + +/* #define PKT_DSC_CPHR_DST_DWOFFSET */ +#define PKT_DSC_CPHR_DST_DWOFFSET_LSB 3 +#define PKT_DSC_CPHR_DST_DWOFFSET_BITS TWO_BITS +#define PKT_DSC_CPHR_DST_DWOFFSET_MASK \ + (PKT_DSC_CPHR_DST_DWOFFSET_BITS << PKT_DSC_CPHR_DST_DWOFFSET_LSB) + + /* #define PKT_DSC_CPHR_DST_OFFSET */ +#define PKT_DSC_CPHR_DST_OFFSET_LSB 0 +#define PKT_DSC_CPHR_DST_OFFSET_BITS THREE_BITS +#define PKT_DSC_CPHR_DST_OFFSET_MASK \ + (PKT_DSC_CPHR_DST_OFFSET_BITS << PKT_DSC_CPHR_DST_OFFSET_LSB) + +/* ********************************************************************** + * PacketDescriptor_t.authDstNonceLow + * ********************************************************************** + */ +/* #define PKT_DSC_NONCE_LOW */ +#define PKT_DSC_NONCE_LOW_LSB 40 +#define PKT_DSC_NONCE_LOW_BITS TWENTYFOUR_BITS +#define PKT_DSC_NONCE_LOW_MASK \ + (PKT_DSC_NONCE_LOW_BITS << PKT_DSC_NONCE_LOW_LSB) + +/* #define PKT_DSC_AUTH_DST_ADDR */ +#define PKT_DSC_AUTH_DST_ADDR_LSB 0 +#define PKT_DSC_AUTH_DST_ADDR_BITS FOURTY_BITS +#define PKT_DSC_AUTH_DST_ADDR_MASK \ + (PKT_DSC_AUTH_DST_ADDR_BITS << PKT_DSC_AUTH_DST_ADDR_LSB) + +/* #define PKT_DSC_CIPH_OFF_HI */ +#define PKT_DSC_CIPH_OFF_HI_LSB 0 +#define PKT_DSC_CIPH_OFF_HI_BITS FIVE_BITS +#define PKT_DSC_CIPH_OFF_HI_MASK (PKT_DSC_CIPH_OFF_HI_BITS << PKT_DSC_CIPH_OFF_HI_LSB) + +/* ********************************************************************** + * PacketDescriptor_t.ckSumDstNonceHiCFBMaskLLWMask + * ********************************************************************** + */ +/* #define PKT_DSC_HASH_BYTE_OFF */ +#define PKT_DSC_HASH_BYTE_OFF_LSB 61 +#define PKT_DSC_HASH_BYTE_OFF_BITS THREE_BITS +#define PKT_DSC_HASH_BYTE_OFF_MASK (PKT_DSC_HASH_BYTE_OFF_BITS << PKT_DSC_HASH_BYTE_OFF_LSB) + +/* #define PKT_DSC_PKTLEN_BYTES */ +#define PKT_DSC_PKTLEN_BYTES_LSB 58 +#define PKT_DSC_PKTLEN_BYTES_BITS THREE_BITS +#define PKT_DSC_PKTLEN_BYTES_MASK (PKT_DSC_PKTLEN_BYTES_BITS << PKT_DSC_PKTLEN_BYTES_LSB) + +/* #define PKT_DSC_LASTWORD */ +#define PKT_DSC_LASTWORD_128 0 +#define PKT_DSC_LASTWORD_96MASK 1 +#define PKT_DSC_LASTWORD_64MASK 2 +#define PKT_DSC_LASTWORD_32MASK 3 +#define PKT_DSC_LASTWORD_LSB 56 +#define PKT_DSC_LASTWORD_BITS TWO_BITS +#define PKT_DSC_LASTWORD_MASK (PKT_DSC_LASTWORD_BITS << PKT_DSC_LASTWORD_LSB) + +/* #define PKT_DSC_CFB_MASK */ +#define PKT_DSC_CFB_MASK_LSB 48 +#define PKT_DSC_CFB_MASK_BITS EIGHT_BITS +#define PKT_DSC_CFB_MASK_MASK (PKT_DSC_CFB_MASK_BITS << PKT_DSC_CFB_MASK_LSB) + +/* #define PKT_DSC_NONCE_HI */ +#define PKT_DSC_NONCE_HI_LSB 40 +#define PKT_DSC_NONCE_HI_BITS EIGHT_BITS +#define PKT_DSC_NONCE_HI_MASK (PKT_DSC_NONCE_HI_BITS << PKT_DSC_NONCE_HI_LSB) + +/* #define PKT_DSC_CKSUM_DST_ADDR */ +#define PKT_DSC_CKSUM_DST_ADDR_LSB 5 +#define PKT_DSC_CKSUM_DST_ADDR_BITS THIRTY_FIVE_BITS +#define PKT_DSC_CKSUM_DST_ADDR_MASK (PKT_DSC_CKSUM_DST_ADDR_BITS << PKT_DSC_CKSUM_DST_ADDR_LSB) + +/* #define PKT_DSC_IV_OFF_HI */ +#define PKT_DSC_IV_OFF_HI_LSB 0 +#define PKT_DSC_IV_OFF_HI_BITS FIVE_BITS +#define PKT_DSC_IV_OFF_HI_MASK (PKT_DSC_IV_OFF_HI_BITS << PKT_DSC_IV_OFF_HI_LSB) + + +/* ****************************************************************** + * Control Error Code and Conditions + * ****************************************************************** + */ +#define CTL_ERR_NONE 0x0000 /* No Error */ +#define CTL_ERR_CIPHER_OP 0x0001 /* Unknown Cipher Op */ +#define CTL_ERR_MODE 0x0002 /* Unknown or Not Allowed Mode */ +#define CTL_ERR_CHKSUM_SRC 0x0004 /* Unknown CkSum Src - UNUSED */ +#define CTL_ERR_CFB_MASK 0x0008 /* Forbidden CFB Mask - UNUSED */ +#define CTL_ERR_OP 0x0010 /* Unknown Ctrl Op - UNUSED */ +#define CTL_ERR_UNDEF1 0x0020 /* UNUSED */ +#define CTL_ERR_UNDEF2 0x0040 /* UNUSED */ +#define CTL_ERR_DATA_READ 0x0080 /* Data Read Error */ +#define CTL_ERR_DESC_CTRL 0x0100 /* Descriptor Ctrl Field Error */ + +#define CTL_ERR_TIMEOUT 0x1000 /* Message Response Timeout */ + +/* ****************************************************************** + * Data Error Code and Conditions + * ****************************************************************** + */ +#define DATA_ERR_NONE 0x0000 /* No Error */ +#define DATA_ERR_LEN_CIPHER 0x0001 /* Not Enough Data To Cipher */ +#define DATA_ERR_IV_ADDR 0x0002 /* Illegal IV Loacation */ +#define DATA_ERR_WD_LEN_AES 0x0004 /* Illegal Nb Words To AES */ +#define DATA_ERR_BYTE_COUNT 0x0008 /* Illegal Pad And ByteCount Spec */ +#define DATA_ERR_LEN_CKSUM 0x0010 /* Not Enough Data To CkSum */ +#define DATA_ERR_OP 0x0020 /* Unknown Data Op */ +#define DATA_ERR_UNDEF1 0x0040 /* UNUSED */ +#define DATA_ERR_READ 0x0080 /* Data Read Error */ +#define DATA_ERR_WRITE 0x0100 /* Data Write Error */ + + +/* + * Common Descriptor + * NOTE: Size of struct is size of cacheline. + */ + +typedef struct OperationDescriptor_s { + uint64_t phys_self; + uint32_t stn_id; + uint32_t flags; + uint32_t cpu; + uint32_t seq_num; + uint64_t reserved; +} OperationDescriptor_t, *OperationDescriptor_pt; + + +/* + * This defines the security data descriptor format + */ +typedef struct PacketDescriptor_s { + uint64_t srcLengthIVOffUseIVNext; + uint64_t dstDataSettings; + uint64_t authDstNonceLow; + uint64_t ckSumDstNonceHiCFBMaskLLWMask; +} PacketDescriptor_t, *PacketDescriptor_pt; + +typedef struct { + uint8_t *user_auth; + uint8_t *user_src; + uint8_t *user_dest; + uint8_t *user_state; + uint8_t *kern_auth; + uint8_t *kern_src; + uint8_t *kern_dest; + uint8_t *kern_state; + uint8_t *aligned_auth; + uint8_t *aligned_src; + uint8_t *aligned_dest; + uint8_t *aligned_state; +} xlr_sec_drv_user_t, *xlr_sec_drv_user_pt; + +typedef struct symkey_desc { + OperationDescriptor_t op_ctl; /* size is cacheline */ + PacketDescriptor_t pkt_desc[2]; /* size is cacheline */ + ControlDescriptor_t ctl_desc; /* makes this aligned */ + uint64_t control; /* message word0 */ + uint64_t data; /* message word1 */ + uint64_t ctl_result; + uint64_t data_result; + struct symkey_desc *alloc; /* real allocated addr */ + xlr_sec_drv_user_t user; + //volatile atomic_t flag_complete; + //struct semaphore sem_complete; + //wait_queue_t submit_wait; + + uint8_t *next_src_buf; + uint32_t next_src_len; + + uint8_t *next_dest_buf; + uint32_t next_dest_len; + + uint8_t *next_auth_dest; + uint8_t *next_cksum_dest; + + void *ses; +} symkey_desc_t, *symkey_desc_pt; + + +/* + * ************************************************************************** + * RSA Block + * ************************************************************************** + */ + +/* + * RSA and ECC Block + * ================= + * + * A 2-word message ring descriptor is used to pass all information + * pertaining to the RSA or ECC operation: + * + * 63 61 60 54 53 52 40 39 5 4 3 2 0 + * ----------------------------------------------------------------------------------------------------- + * | Ctrl | Op Class | Valid Op | Op Ctrl0 | Source Addr | Software Scratch0 | Global src data offset | + * ----------------------------------------------------------------------------------------------------- + * 3 7 1 13 35 2 3 + * + * + * 63 61 60 54 53 52 51 50 40 39 5 4 3 2 0 + * -------------------------------------------------------------------------------------------------------------------------------- + * | Ctrl | Destination Id | WRB_COH | WRB_L2ALLOC | DF_L2ALLOC | Op Ctrl1 | Dest Addr | Software Scratch1 | Global dst data offset | + * -------------------------------------------------------------------------------------------------------------------------------- + * 3 7 1 1 1 11 35 2 3 + * + * + * Op Class = 7'h0_0 Modular exponentiation + * 7'h0_1 ECC (including prime modular ops and binary GF ops) + * REMAINDER UNDEF + * + * Valid Op = 1'b1 Will cause operation to start; descriptors sent back at end of operation + * 1'b0 No operation performed; descriptors sent back right away + * + * RSA ECC + * === === + * Op Ctrl0 = BlockWidth[1] {TYPE[6:0], FUNCTION[5:0]} + * LoadConstant[1] + * ExponentWidth[10:0] + * RSA Only + * ======== + * Block Width = 1'b1 1024 bit op + * = 1'b0 512 bit op + * Load Constant = 1'b1 Load constant from data structure + * 1'b0 Preserve old constant (this assumes + * Source Addr points to RSAData_pt->Exponent + * or that the length of Constant is 0) + * Exponent Width = 11-bit expression of exponent width EXPRESSED IN NUMBER OF BITS + * + * ECC Only + * ======== + * + * TYPE = 7'h0_0 ECC prime 160 + * 7'h0_1 ECC prime 192 + * 7'h0_2 ECC prime 224 + * 7'h0_3 ECC prime 256 + * 7'h0_4 ECC prime 384 + * 7'h0_5 ECC prime 512 + * + * 7'h0_6 through 7'h1_f UNDEF + * + * 7'h2_0 ECC bin 163 + * 7'h2_1 ECC bin 191 + * 7'h2_2 ECC bin 233 + * + * 7'h2_3 through 7'h6_f UNDEF + * + * 7'h7_0 ECC UC load + * + * 7'b7_1 through 7'b7_f UNDEF + * + * Prime field Binary field + * =========== ============ + * FUNCTION = 6'h0_0 Point multiplication R = k.P Point multiplication R = k.P + * 6'h0_1 Point addition R = P + Q Binary GF inversion C(x) = 1 / A(x) mod F(x) + * 6'h0_2 Point double R = 2 x P Binary GF multiplication C(x) = B(x) * A(x) mod F(x) + * 6'h0_3 Point verification R ? Binary GF addition C(x) = B(x) + A(x) mod F(x) + * 6'h0_4 Modular addition c = x + y mod m UNDEF + * 6'h0_5 Modular substraction c = x - y mod m UNDEF + * 6'h0_6 Modular multiplication c = x * y mod m UNDEF + * 6'h0_7 Modular division c = x / y mod m UNDEF + * 6'h0_8 Modular inversion c = 1 / y mod m UNDEF + * 6'h0_9 Modular reduction c = x mod m UNDEF + * + * 6'h0_a + * through UNDEF UNDEF + * 6'h3_f + * + * Source Addr = 35 MSB of pointer to source address (i.e., cache-line aligned) + * + * Software Scratch0 = Two bit field ignored by engine and returned as is in free descriptor + * + * Global src data offset = Nb BYTES to right-shift data by before presenting it to engines + * (0-7); allows realignment of byte-aligned, non-double-word aligned data + * + * RSA ECC + * === === + * OpCtrl1 = ModulusWidth[10:0] Not used + * RSA Only + * ======== + * Modulus Width = 11-bit expression of modulus width EXPRESSED IN NUMBER OF BITS + * + * Dest Addr = 35 MSB of pointer to destination address (i.e., cache-line aligned) + * + * Software Scratch1 = Two bit field ignored by engine and returned as is in free descriptor + * + * Global dst data offset = Nb BYTES to left-shift (double-word boundary aligned) data by before writing it to memory + * + * + */ + +/* + * ECC data formats + */ + +/********************************************************** + * * + * ECC prime data formats * + * * + ********************************************************** + * + * + * The size of all quantities below is that of the precision + * of the chosen op (160, 192, ...) ROUNDED UP to a multiple + * of 8 bytes, i.e., 3 dwords (160, 192), 4 dwords (224, 256) + * 6 dwords (384) and 8 dwords (512) and padded with zeroes + * when necessary. + * + * The only exception to this is the key quantity (k) which + * needs to be rounded up to 32 bytes in all cases and padded + * with zeroes; therefore the key needs to be 4 dwords (160, 192, + * 224, 256) or 8 dwords (384, 512) + * + * The total lengths in dwords that are read and in + * bytes that are written, for each operation and + * length group, are specified at the bottom of each + * datastructure. + * + * In all that follows, m is the modulus and cst is the constant, + * cst = 2 ^ (2*length + 4) mod m . a and b are the curve + * parameters. + * + * 0) UC load + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> Dword_0 N/A + * . + * . + * . + * Dword_331 + * 332 dw + * + * 1) Point multiplication R(x_r, y_r) = k . P(x_p, y_p) + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x_p dst+glb_off-> x_r + * x_p y_r + * y_p 2x(3/4/6/8)= + * y_p 6/8/12/16 dw + * a + * k + * m + * cst + * 7x(3/4/6/8)+(4/4/8/8)= + * 25/32/50/64 dw + * + * 2) Point addition R(x_r, y_r) = P(x_p, y_p) + Q(x_q, y_q) + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x_p dst+glb_off-> x_r + * y_p y_r + * x_q 2x(3/4/6/8)= + * y_q 6/8/12/16 dw + * a + * m + * cst + * 7x(3/4/6/8)= + * 21/28/42/56 dw + * + * 3) Point double R(x_r, y_r) = 2 . P(x_p, y_p) + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x_p dst+glb_off-> x_r + * y_p y_r + * a 2x(3/4/6/8)= + * m 6/8/12/16 dw + * cst + * 5x(3/4/6/8)= + * 15/20/30/40 dw + * + * 4) Point verification Is_On_Curve = P(x_p, y_p) on curve ? 1 : 0 + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x_p dst+glb_off-> Is_On_Curve + * y_p 1 dw + * a + * b + * m + * cst + * 6x(3/4/6/8)= + * 18/24/36/48 dw + * + * 5) Modular addition c = x + y mod m + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x dst+glb_off-> c + * y 3/4/6/8 dw + * m + * 3x(3/4/6/8)= + * 9/12/18/24 dw + * + * 6) Modular substraction c = x - y mod m + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x dst+glb_off-> c + * y 3/4/6/8 dw + * m + * 3x(3/4/6/8)= + * 9/12/18/24 dw + * + * 7) Modular multiplication c = x * y mod m + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x dst+glb_off-> c + * y 3/4/6/8 dw + * m + * cst + * 4x(3/4/6/8)= + * 12/16/24/32 dw + * + * 8) Modular division c = x / y mod m + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> y dst+glb_off-> c + * x 3/4/6/8 dw + * m + * 3x(3/4/6/8)= + * 9/12/18/24 dw + * + * 9) Modular inversion c = 1 / y mod m + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> y dst+glb_off-> c + * m 3/4/6/8 dw + * 2x(3/4/6/8)= + * 6/8/12/16 dw + * + * 10) Modular reduction c = x mod m + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> x dst+glb_off-> c + * m 3/4/6/8 dw + * 2x(3/4/6/8)= + * 6/8/12/16 dw + * + */ + +/********************************************************** + * * + * ECC binary data formats * + * * + ********************************************************** + * + * + * The size of all quantities below is that of the precision + * of the chosen op (163, 191, 233) ROUNDED UP to a multiple + * of 8 bytes, i.e. 3 dwords for (163, 191) and 4 dwords for + * (233), padded with zeroes as necessary. + * + * The total lengths in dwords that are read and written, + * for each operation and length group, are specified + * at the bottom of each datastructure. + * In all that follows, b is the curve parameter. + * + * 1) Point multiplication R(x_r, y_r) = k . P(x_p, y_p) + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> b dst+glb_off-> x_r + * k y_r + * x_p 2x(3/4) + * y_p 6/8 dw + * 4x(3/4)= + * 12/16 dw + * + * 2) Binary GF inversion C(x) = 1 / A(x) mod F(x) + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> A dst+glb_off-> C + * 1x(3/4)= 1x(3/4) + * 3/4 dw 3/4 dw + * + * 3) Binary GF multiplication C(x) = B(x) * A(x) mod F(x) + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> A dst+glb_off-> C + * B 1x(3/4) + * 2x(3/4)= 3/4 dw + * 6/8 dw + * + * 4) Binary GF addition C(x) = B(x) + A(x) mod F(x) + * + * DATA IN DATA OUT + * ======= ======== + * src+glb_off-> A dst+glb_off-> C + * B 1x(3/4) + * 2x(3/4)= 3/4 dw + * 6/8dw + * + */ + +/* + * RSA data format + */ + +/* + * IMPORTANT NOTE: + * + * As specified in the datastructures below, + * the engine assumes all data (including + * exponent and modulus) to be adjacent on + * dword boundaries, e.g., + * + * Operation length = 512 bits + * Exponent length = 16 bits + * Modulus length = 512 bits + * + * The engine expects to read: + * + * 63 0 + * ----------------------- + * | | Constant0 + * ----------------------- + * | | Constant1 + * ----------------------- + * | | Constant2 + * ----------------------- + * | | Constant3 + * ----------------------- + * | | Constant4 + * ----------------------- + * | | Constant5 + * ----------------------- + * | | Constant6 + * ----------------------- + * | | Constant7 + * ----------------------- + * | IGNORED |B1|B0| Exponent0 (Exponent length = 16 bits = 2 bytes, so only 2 least significant bytes of exponent used) + * ----------------------- + * | | Modulus0 + * ----------------------- + * | | Modulus1 + * ----------------------- + * | | Modulus2 + * ----------------------- + * | | Modulus3 + * ----------------------- + * | | Modulus4 + * ----------------------- + * | | Modulus5 + * ----------------------- + * | | Modulus6 + * ----------------------- + * | | Modulus7 + * ----------------------- + * | | Message0 + * ----------------------- + * | | Message1 + * ----------------------- + * | | Message2 + * ----------------------- + * | | Message3 + * ----------------------- + * | | Message4 + * ----------------------- + * | | Message5 + * ----------------------- + * | | Message6 + * ----------------------- + * | | Message7 + * ----------------------- + * + */ + +/* #define PUBKEY_CTL_CTL */ +#define PUBKEY_CTL_CTL_LSB 61 +#define PUBKEY_CTL_CTL_BITS THREE_BITS +#define PUBKEY_CTL_CTL_MASK (PUBKEY_CTL_CTL_BITS << PUBKEY_CTL_CTL_LSB) + +/* #define PUBKEY_CTL_OP_CLASS */ +#define PUBKEY_CTL_OP_CLASS_RSA 0 +#define PUBKEY_CTL_OP_CLASS_ECC 1 +#define PUBKEY_CTL_OP_CLASS_LSB 54 +#define PUBKEY_CTL_OP_CLASS_BITS SEVEN_BITS +#define PUBKEY_CTL_OP_CLASS_MASK (PUBKEY_CTL_OP_CLASS_BITS << PUBKEY_CTL_OP_CLASS_LSB) + +/* #define PUBKEY_CTL_VALID */ +#define PUBKEY_CTL_VALID_FALSE 0 +#define PUBKEY_CTL_VALID_TRUE 1 +#define PUBKEY_CTL_VALID_LSB 53 +#define PUBKEY_CTL_VALID_BITS ONE_BIT +#define PUBKEY_CTL_VALID_MASK \ + (PUBKEY_CTL_VALID_BITS << PUBKEY_CTL_VALID_LSB) + +/* #define PUBKEY_CTL_ECC_TYPE */ +#define PUBKEY_CTL_ECC_TYPE_PRIME_160 0 +#define PUBKEY_CTL_ECC_TYPE_PRIME_192 1 +#define PUBKEY_CTL_ECC_TYPE_PRIME_224 2 +#define PUBKEY_CTL_ECC_TYPE_PRIME_256 3 +#define PUBKEY_CTL_ECC_TYPE_PRIME_384 4 +#define PUBKEY_CTL_ECC_TYPE_PRIME_512 5 +#define PUBKEY_CTL_ECC_TYPE_BIN_163 0x20 +#define PUBKEY_CTL_ECC_TYPE_BIN_191 0x21 +#define PUBKEY_CTL_ECC_TYPE_BIN_233 0x22 +#define PUBKEY_CTL_ECC_TYPE_UC_LOAD 0x70 +#define PUBKEY_CTL_ECC_TYPE_LSB 46 +#define PUBKEY_CTL_ECC_TYPE_BITS SEVEN_BITS +#define PUBKEY_CTL_ECC_TYPE_MASK (PUBKEY_CTL_ECC_TYPE_BITS << PUBKEY_CTL_ECC_TYPE_LSB) + +/* #define PUBKEY_CTL_ECC_FUNCTION */ +#define PUBKEY_CTL_ECC_FUNCTION_NOP 0 +#define PUBKEY_CTL_ECC_FUNCTION_POINT_MUL 0 +#define PUBKEY_CTL_ECC_FUNCTION_POINT_ADD 1 +#define PUBKEY_CTL_ECC_FUNCTION_POINT_DBL 2 +#define PUBKEY_CTL_ECC_FUNCTION_POINT_VFY 3 +#define PUBKEY_CTL_ECC_FUNCTION_MODULAR_ADD 4 +#define PUBKEY_CTL_ECC_FUNCTION_MODULAR_SUB 5 +#define PUBKEY_CTL_ECC_FUNCTION_MODULAR_MUL 6 +#define PUBKEY_CTL_ECC_FUNCTION_MODULAR_DIV 7 +#define PUBKEY_CTL_ECC_FUNCTION_MODULAR_INV 8 +#define PUBKEY_CTL_ECC_FUNCTION_MODULAR_RED 9 +#define PUBKEY_CTL_ECC_FUNCTION_LSB 40 +#define PUBKEY_CTL_ECC_FUNCTION_BITS SIX_BITS +#define PUBKEY_CTL_ECC_FUNCTION_MASK (PUBKEY_CTL_ECC_FUNCTION_BITS << PUBKEY_CTL_ECC_FUNCTION_LSB) + +/* #define PUBKEY_CTL_BLKWIDTH */ +#define PUBKEY_CTL_BLKWIDTH_512 0 +#define PUBKEY_CTL_BLKWIDTH_1024 1 +#define PUBKEY_CTL_BLKWIDTH_LSB 52 +#define PUBKEY_CTL_BLKWIDTH_BITS ONE_BIT +#define PUBKEY_CTL_BLKWIDTH_MASK \ + (PUBKEY_CTL_BLKWIDTH_BITS << PUBKEY_CTL_BLKWIDTH_LSB) + +/* #define PUBKEY_CTL_LD_CONST */ +#define PUBKEY_CTL_LD_CONST_OLD 0 +#define PUBKEY_CTL_LD_CONST_NEW 1 +#define PUBKEY_CTL_LD_CONST_LSB 51 +#define PUBKEY_CTL_LD_CONST_BITS ONE_BIT +#define PUBKEY_CTL_LD_CONST_MASK \ + (PUBKEY_CTL_LD_CONST_BITS << PUBKEY_CTL_LD_CONST_LSB) + +/* #define PUBKEY_CTL_EXPWIDTH */ +#define PUBKEY_CTL_EXPWIDTH_LSB 40 +#define PUBKEY_CTL_EXPWIDTH_BITS ELEVEN_BITS +#define PUBKEY_CTL_EXPWIDTH_MASK \ + (PUBKEY_CTL_EXPWIDTH_BITS << PUBKEY_CTL_EXPWIDTH_LSB) + +/* #define PUBKEY_CTL_SRCADDR */ +#define PUBKEY_CTL_SRCADDR_LSB 0 +#define PUBKEY_CTL_SRCADDR_BITS FOURTY_BITS +#define PUBKEY_CTL_SRCADDR_MASK \ + (PUBKEY_CTL_SRCADDR_BITS << PUBKEY_CTL_SRCADDR_LSB) + +/* #define PUBKEY_CTL_SRC_OFFSET */ +#define PUBKEY_CTL_SRC_OFFSET_LSB 0 +#define PUBKEY_CTL_SRC_OFFSET_BITS THREE_BITS +#define PUBKEY_CTL_SRC_OFFSET_MASK \ + (PUBKEY_CTL_SRC_OFFSET_BITS << PUBKEY_CTL_SRC_OFFSET_LSB) + + +/* #define PUBKEY_CTL1_CTL */ +#define PUBKEY_CTL1_CTL_LSB 61 +#define PUBKEY_CTL1_CTL_BITS THREE_BITS +#define PUBKEY_CTL1_CTL_MASK (PUBKEY_CTL_CTL_BITS << PUBKEY_CTL_CTL_LSB) + +/* #define PUBKEY_CTL1_MODWIDTH */ +#define PUBKEY_CTL1_MODWIDTH_LSB 40 +#define PUBKEY_CTL1_MODWIDTH_BITS ELEVEN_BITS +#define PUBKEY_CTL1_MODWIDTH_MASK \ + (PUBKEY_CTL1_MODWIDTH_BITS << PUBKEY_CTL1_MODWIDTH_LSB) + +/* #define PUBKEY_CTL1_DSTADDR */ +#define PUBKEY_CTL1_DSTADDR_LSB 0 +#define PUBKEY_CTL1_DSTADDR_BITS FOURTY_BITS +#define PUBKEY_CTL1_DSTADDR_MASK \ + (PUBKEY_CTL1_DSTADDR_BITS << PUBKEY_CTL1_DSTADDR_LSB) + +/* #define PUBKEY_CTL1_DST_OFFSET */ +#define PUBKEY_CTL1_DST_OFFSET_LSB 0 +#define PUBKEY_CTL1_DST_OFFSET_BITS THREE_BITS +#define PUBKEY_CTL1_DST_OFFSET_MASK \ + (PUBKEY_CTL1_DST_OFFSET_BITS << PUBKEY_CTL1_DST_OFFSET_LSB) + +/* + * Upon completion of operation, the RSA block returns a 2-word free descriptor + * in the following format: + * + * 63 61 60 54 53 52 51 49 48 40 39 5 4 3 2 0 + * ------------------------------------------------------------------------------------------------------------------------- + * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | Control Error | Source Address | Software Scratch0 | Global src data offset | + * ------------------------------------------------------------------------------------------------------------------------- + * | Ctrl | Destination Id | 2'b00 | Desc Ctrl | Data Error | Dest Address | Software Scratch1 | Global dst data offset | + * ------------------------------------------------------------------------------------------------------------------------- + * + * The Control and Data Error codes are enumerated below + * + * Error conditions + * ================ + * + * Control Error Code Control Error Condition + * ------------------ ----------------------- + * 9'h000 No Error + * 9'h001 Undefined Op Class + * 9'h002 Undefined ECC TYPE (ECC only) + * 9'h004 Undefined ECC FUNCTION (ECC only) + * 9'h008 ECC timeout (ECC only) + * 9'h010 UNUSED + * 9'h020 UNUSED + * 9'h040 UNUSED + * 9'h080 Data Read Error + * 9'h100 Descriptor Ctrl Field Error (D0.Ctrl != SOP || D1.Ctrl != EOP) + * + * Data Error Code Data Error Condition + * --------------- -------------------- + * 9'h000 No Error + * 9'h001 Exponent Width > Block Width (RSA Only) + * 9'h002 Modulus Width > Block Width (RSA Only) + * 9'h004 UNUSED + * 9'h008 UNUSED + * 9'h010 UNUSED + * 9'h020 UNUSED + * 9'h040 UNUSED + * 9'h080 Data Read Error + * 9'h100 UNUSED + */ + +/* + * Result Data Word for Message Ring Descriptor + */ + +/* #define PUBKEY_RSLT_CTL_CTL */ +#define PUBKEY_RSLT_CTL_CTL_LSB 61 +#define PUBKEY_RSLT_CTL_CTL_BITS THREE_BITS +#define PUBKEY_RSLT_CTL_CTL_MASK \ + (PUBKEY_RSLT_CTL_CTL_BITS << PUBKEY_RSLT_CTL_CTL_LSB) + +/* #define PUBKEY_RSLT_CTL_DST_ID */ +#define PUBKEY_RSLT_CTL_DST_ID_LSB 54 +#define PUBKEY_RSLT_CTL_DST_ID_BITS SEVEN_BITS +#define PUBKEY_RSLT_CTL_DST_ID_MASK \ + (PUBKEY_RSLT_CTL_DST_ID_BITS << PUBKEY_RSLT_CTL_DST_ID_LSB) + +/* #define PUBKEY_RSLT_CTL_DESC_CTL */ +#define PUBKEY_RSLT_CTL_DESC_CTL_LSB 49 +#define PUBKEY_RSLT_CTL_DESC_CTL_BITS THREE_BITS +#define PUBKEY_RSLT_CTL_DESC_CTL_MASK \ + (PUBKEY_RSLT_CTL_DESC_CTL_BITS << PUBKEY_RSLT_CTL_DESC_CTL_LSB) + + +/* #define PUBKEY_RSLT_CTL_ERROR */ +#define PUBKEY_RSLT_CTL_ERROR_LSB 40 +#define PUBKEY_RSLT_CTL_ERROR_BITS NINE_BITS +#define PUBKEY_RSLT_CTL_ERROR_MASK \ + (PUBKEY_RSLT_CTL_ERROR_BITS << PUBKEY_RSLT_CTL_ERROR_LSB) + +/* #define PUBKEY_RSLT_CTL_SRCADDR */ +#define PUBKEY_RSLT_CTL_SRCADDR_LSB 0 +#define PUBKEY_RSLT_CTL_SRCADDR_BITS FOURTY_BITS +#define PUBKEY_RSLT_CTL_SRCADDR_MASK \ + (PUBKEY_RSLT_CTL_SRCADDR_BITS << PUBKEY_RSLT_CTL_SRCADDR_LSB) + + +/* #define PUBKEY_RSLT_DATA_CTL */ +#define PUBKEY_RSLT_DATA_CTL_LSB 61 +#define PUBKEY_RSLT_DATA_CTL_BITS THREE_BITS +#define PUBKEY_RSLT_DATA_CTL_MASK \ + (PUBKEY_RSLT_DATA_CTL_BITS << PUBKEY_RSLT_DATA_CTL_LSB) + +/* #define PUBKEY_RSLT_DATA_DST_ID */ +#define PUBKEY_RSLT_DATA_DST_ID_LSB 54 +#define PUBKEY_RSLT_DATA_DST_ID_BITS SEVEN_BITS +#define PUBKEY_RSLT_DATA_DST_ID_MASK \ + (PUBKEY_RSLT_DATA_DST_ID_BITS << PUBKEY_RSLT_DATA_DST_ID_LSB) + +/* #define PUBKEY_RSLT_DATA_DESC_CTL */ +#define PUBKEY_RSLT_DATA_DESC_CTL_LSB 49 +#define PUBKEY_RSLT_DATA_DESC_CTL_BITS THREE_BITS +#define PUBKEY_RSLT_DATA_DESC_CTL_MASK \ + (PUBKEY_RSLT_DATA_DESC_CTL_BITS << PUBKEY_RSLT_DATA_DESC_CTL_LSB) + +/* #define PUBKEY_RSLT_DATA_ERROR */ +#define PUBKEY_RSLT_DATA_ERROR_LSB 40 +#define PUBKEY_RSLT_DATA_ERROR_BITS NINE_BITS +#define PUBKEY_RSLT_DATA_ERROR_MASK \ + (PUBKEY_RSLT_DATA_ERROR_BITS << PUBKEY_RSLT_DATA_ERROR_LSB) + +/* #define PUBKEY_RSLT_DATA_DSTADDR */ +#define PUBKEY_RSLT_DATA_DSTADDR_LSB 40 +#define PUBKEY_RSLT_DATA_DSTADDR_BITS FOURTY_BITS +#define PUBKEY_RSLT_DATA_DSTADDR_MASK \ + (PUBKEY_RSLT_DATA_DSTADDR_BITS << PUBKEY_RSLT_DATA_DSTADDR_LSB) + +/* + * ****************************************************************** + * RSA Block - Data Error Code and Conditions + * ****************************************************************** + */ + +#define PK_CTL_ERR_NONE 0x0000 /* No Error */ +#define PK_CTL_ERR_OP_CLASS 0x0001 /* Undefined Op Class */ +#define PK_CTL_ERR_ECC_TYPE 0x0002 /* Undefined ECC TYPE (ECC only) */ +#define PK_CTL_ERR_ECC_FUNCT 0x0004 /* Undefined ECC FUNCTION (ECC only) */ +#define PK_CTL_ERR_ECC_TIMEOUT 0x0008 /* ECC timeout (ECC only) */ +#define PK_CTL_ERR_READ 0x0080 /* Data Read Error */ +#define PK_CTL_ERR_DESC 0x0100 /* Descriptor Ctrl Field Error + * (D0.Ctrl != SOP || D1.Ctrl != EOP) */ +#define PK_CTL_ERR_TIMEOUT 0x1000 /* Message Responce Timeout */ + +#define PK_DATA_ERR_NONE 0x0000 /* No Error */ +#define PK_DATA_ERR_EXP_WIDTH 0x0001 /* Exponent Width > Block Width */ +#define PK_DATA_ERR_MOD_WIDTH 0x0002 /* Modulus Width > Block Width */ +#define PK_DATA_ERR_READ 0x0080 /* Data Read Error */ + + +/* + * This defines the RSA data format + */ +/* + * typedef struct RSAData_s { + * uint64_t Constant; + * uint64_t Exponent; + * uint64_t Modulus; + * uint64_t Message; + *} RSAData_t, *RSAData_pt; + * + * typedef RSAData_t DHData_t; + * typedef RSAData_pt DHData_pt; + */ + +typedef struct UserPubData_s { + uint8_t *source; + uint8_t *user_result; + uint32_t result_length; +} UserPubData_t, *UserPubData_pt; + +typedef struct pubkey_desc { + OperationDescriptor_t op_ctl; /* size is cacheline */ + uint8_t source[1024]; + uint8_t dest[256]; /* 1024 makes cacheline-aligned */ + uint64_t control0; + uint64_t control1; + uint64_t ctl_result; + uint64_t data_result; + struct pubkey_desc *alloc; + UserPubData_t kern; /* ptrs for temp buffers */ + //volatile atomic_t flag_complete; + //struct semaphore sem_complete; + //wait_queue_t submit_wait; +} pubkey_desc_t, *pubkey_desc_pt; + +/* + * KASUMI F8 and F9 use the IV0/IV1 fields : + * + * 63 41 40 39 37 36 32 31 0 + * ---------------------------------------------------------------------------- + * | |FX/DIRECTION| | F8/BEARER | F8/COUNT | IV0 + * ---------------------------------------------------------------------------- + * 1 5 32 + * + * 63 32 31 0 + * ---------------------------------------------------------------------------- + * | F9/FRESH | F9/COUNT | IV1 + * ---------------------------------------------------------------------------- + * 32 32 + */ +#endif /* _XLR_SEC_DESC_H_ */ diff --git a/sys/mips/rmi/dev/sec/rmilib.c b/sys/mips/rmi/dev/sec/rmilib.c new file mode 100644 index 000000000000..6068e5d28522 --- /dev/null +++ b/sys/mips/rmi/dev/sec/rmilib.c @@ -0,0 +1,3174 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + + +#include +#include +#include +#include +#include +#include +#include +#include + + +// static int msgrng_stnid_pk0 = MSGRNG_STNID_PK0; + +/*#define RMI_SEC_DEBUG */ + +#define SMP_CACHE_BYTES XLR_CACHELINE_SIZE +#define NUM_CHUNKS(size, bits) ( ((size)>>(bits)) + (((size)&((1<<(bits))-1))?1:0) ) + +static const char nib2hex[] = "0123456789ABCDEF"; +symkey_desc_pt g_desc; +struct xlr_sec_command *g_cmd; + +#ifdef XLR_SEC_CMD_DEBUG +static void + decode_symkey_desc(symkey_desc_pt desc, uint32_t cfg_vector); + +#endif + +void print_buf(char *desc, void *data, int len); + +static int + xlr_sec_cipher_hash_command(xlr_sec_io_pt op, symkey_desc_pt desc, uint8_t); + +static xlr_sec_error_t +xlr_sec_setup_descriptor(xlr_sec_io_pt op, + unsigned int flags, + symkey_desc_pt desc, + uint32_t * cfg_vector); + +static +xlr_sec_error_t +xlr_sec_setup_packet(xlr_sec_io_pt op, + symkey_desc_pt desc, + unsigned int flags, + uint64_t * data, + PacketDescriptor_pt pkt_desc, + ControlDescriptor_pt ctl_desc, + uint32_t vector, + PacketDescriptor_pt next_pkt_desc, + uint8_t multi_frag_flag); + +static int + xlr_sec_submit_message(symkey_desc_pt desc, uint32_t cfg_vector); + +static +xlr_sec_error_t +xlr_sec_setup_cipher(xlr_sec_io_pt op, + ControlDescriptor_pt ctl_desc, + uint32_t * vector); + +static +xlr_sec_error_t +xlr_sec_setup_digest(xlr_sec_io_pt op, + ControlDescriptor_pt ctl_desc, + uint32_t * vector); + +static +xlr_sec_error_t +xlr_sec_setup_cksum(xlr_sec_io_pt op, + ControlDescriptor_pt ctl_desc); + +static +xlr_sec_error_t +xlr_sec_control_setup(xlr_sec_io_pt op, + unsigned int flags, + uint64_t * control, + ControlDescriptor_pt ctl_desc, + xlr_sec_drv_user_t * user, + uint32_t vector); + + +xlr_sec_error_t +xlr_sec_submit_op(symkey_desc_pt desc); + +static void xlr_sec_free_desc(symkey_desc_pt desc); + +void +xlr_sec_msgring_handler(int bucket, int size, int code, int stid, + struct msgrng_msg *msg, void *data); + + +void +xlr_sec_init(struct xlr_sec_softc *sc) +{ + unsigned int i; + xlr_reg_t *mmio; + + + mmio = sc->mmio = xlr_io_mmio(XLR_IO_SECURITY_OFFSET); + + xlr_write_reg(mmio, SEC_DMA_CREDIT, SEC_DMA_CREDIT_CONFIG); + + + xlr_write_reg(mmio, SEC_CONFIG2, SEC_CFG2_ROUND_ROBIN_ON); + + for (i = 0; i < 8; i++) + xlr_write_reg(mmio, + SEC_MSG_BUCKET0_SIZE + i, + xlr_is_xls() ? + xls_bucket_sizes.bucket[MSGRNG_STNID_SEC + i] : + bucket_sizes.bucket[MSGRNG_STNID_SEC + i]); + + for (i = 0; i < 128; i++) + xlr_write_reg(mmio, + SEC_CC_CPU0_0 + i, + xlr_is_xls() ? + xls_cc_table_sec.counters[i >> 3][i & 0x07] : + cc_table_sec.counters[i >> 3][i & 0x07]); + + + /* + * Register a bucket handler with the phoenix messaging subsystem + * For now, register handler for bucket 0->5 in msg stn 0 + */ + if (register_msgring_handler(TX_STN_SAE, xlr_sec_msgring_handler, NULL)) { + panic("Couldn't register msgring handler 0\n"); + } + return; +} + + + +int +xlr_sec_setup(struct xlr_sec_session *ses, + struct xlr_sec_command *cmd, + symkey_desc_pt desc +) +{ + xlr_sec_io_pt op; + int size, ret_val; + int iv_len; + + + desc->ses = ses; + op = &cmd->op; + if (op == NULL) + return (-ENOMEM); + + + + desc->ctl_desc.instruction = 0; + memset(&desc->ctl_desc.cipherHashInfo, 0, sizeof(CipherHashInfo_t)); + desc->control = 0; + + desc->pkt_desc[0].srcLengthIVOffUseIVNext = 0; + desc->pkt_desc[0].dstDataSettings = 0; + desc->pkt_desc[0].authDstNonceLow = 0; + desc->pkt_desc[0].ckSumDstNonceHiCFBMaskLLWMask = 0; + desc->pkt_desc[1].srcLengthIVOffUseIVNext = 0; + desc->pkt_desc[1].dstDataSettings = 0; + desc->pkt_desc[1].authDstNonceLow = 0; + desc->pkt_desc[1].ckSumDstNonceHiCFBMaskLLWMask = 0; + + desc->data = 0; + desc->ctl_result = 0; + desc->data_result = 0; + + + if (op->flags & XLR_SEC_FLAGS_HIGH_PRIORITY) + if (!xlr_is_xls()) + desc->op_ctl.stn_id++; + + desc->user.user_src = (uint8_t *) (unsigned long)op->source_buf; + desc->user.user_dest = (uint8_t *) (unsigned long)op->dest_buf; + desc->user.user_auth = (uint8_t *) (unsigned long)op->auth_dest; + + + if ((op->cipher_type == XLR_SEC_CIPHER_TYPE_ARC4) && + (!op->rc4_state && (op->rc4_loadstate || op->rc4_savestate))) { + printf(" ** Load/Save State and no State **"); + xlr_sec_free_desc(desc); + return (-EINVAL); + } + desc->user.user_state = (uint8_t *) (unsigned long)op->rc4_state; + + + switch (op->cipher_type) { + case XLR_SEC_CIPHER_TYPE_NONE: + iv_len = 0; + break; + case XLR_SEC_CIPHER_TYPE_DES: + case XLR_SEC_CIPHER_TYPE_3DES: + iv_len = XLR_SEC_DES_IV_LENGTH; + break; + case XLR_SEC_CIPHER_TYPE_AES128: + case XLR_SEC_CIPHER_TYPE_AES192: + case XLR_SEC_CIPHER_TYPE_AES256: + iv_len = XLR_SEC_AES_IV_LENGTH; + break; + case XLR_SEC_CIPHER_TYPE_ARC4: + iv_len = XLR_SEC_ARC4_IV_LENGTH; + break; + case XLR_SEC_CIPHER_TYPE_KASUMI_F8: + iv_len = XLR_SEC_KASUMI_F8_IV_LENGTH; + break; + + default: + printf(" ** Undefined Cipher Type **"); + xlr_sec_free_desc(desc); + return (-EINVAL); + } + + + + + size = op->source_buf_size + iv_len; + + /* + * make sure that there are enough bytes for aes based stream + * ciphers + */ + if (op->cipher_mode == XLR_SEC_CIPHER_MODE_F8 || + op->cipher_mode == XLR_SEC_CIPHER_MODE_CTR) + size += XLR_SEC_AES_BLOCK_SIZE - 1; + + if (op->cipher_type == XLR_SEC_CIPHER_TYPE_NONE) { + if (op->source_buf_size != 0) { + memcpy(desc->user.aligned_src, (uint8_t *) (unsigned long)op->source_buf, + op->source_buf_size); + } + } else { + if (ses->multi_frag_flag) { + /* copy IV into temporary kernel source buffer */ + memcpy(desc->user.aligned_src, &op->initial_vector[0], iv_len); + + /* copy input data to temporary kernel source buffer */ + memcpy((uint8_t *) (desc->user.aligned_src + iv_len), + (uint8_t *) (unsigned long)op->source_buf, SEC_MAX_FRAG_LEN); + + desc->next_src_len = op->source_buf_size - SEC_MAX_FRAG_LEN; + memcpy((uint8_t *) (desc->next_src_buf), + (uint8_t *) (unsigned long)(op->source_buf + SEC_MAX_FRAG_LEN), + desc->next_src_len); + + op->source_buf_size = SEC_MAX_FRAG_LEN; + op->source_buf_size += iv_len; + } else { + /* copy IV into temporary kernel source buffer */ + memcpy(desc->user.aligned_src, &op->initial_vector[0], iv_len); + + /* copy input data to temporary kernel source buffer */ + memcpy((uint8_t *) (desc->user.aligned_src + iv_len), + (uint8_t *) (unsigned long)op->source_buf, op->source_buf_size); + op->source_buf_size += iv_len; + } + } + + + + /* Set source to new kernel space */ + op->source_buf = (uint64_t) (unsigned long)desc->user.aligned_src; + + + /* + * Build new dest buffer, for Cipher output only + */ + if (op->cipher_type == XLR_SEC_CIPHER_TYPE_NONE) { + /* + * Digest Engine *NEEDS* this, otherwise it will write at + * 0[x] + */ + op->dest_buf = (uint64_t) (unsigned long)desc->user.aligned_src; + } else { + /* DEBUG -dpk */ + XLR_SEC_CMD_DIAG("dest_buf_size = %d \n", op->dest_buf_size); + + size = op->dest_buf_size + iv_len; + + /* + * make sure that there are enough bytes for aes based + * stream ciphers + */ + if (op->cipher_mode == XLR_SEC_CIPHER_MODE_F8 || + op->cipher_mode == XLR_SEC_CIPHER_MODE_CTR) + size += XLR_SEC_AES_BLOCK_SIZE - 1; + op->dest_buf = (uint64_t) (unsigned long)desc->user.aligned_dest; + + } + + ret_val = xlr_sec_cipher_hash_command(op, desc, ses->multi_frag_flag); + + return (ret_val); + +} + +static int +xlr_sec_cipher_hash_command(xlr_sec_io_pt op, symkey_desc_pt desc, + uint8_t multi_frag_flag) +{ + xlr_sec_error_t err; + uint32_t cfg_vector; + unsigned int setup_flags = 0; + + err = XLR_SEC_ERR_NONE; + cfg_vector = 0; + + if ((op->digest_type == XLR_SEC_DIGEST_TYPE_NONE) && + (op->cipher_type != XLR_SEC_CIPHER_TYPE_ARC4) && + (op->cipher_mode != XLR_SEC_CIPHER_MODE_F8) && + (op->cipher_type != XLR_SEC_CIPHER_TYPE_KASUMI_F8) && + (op->source_buf_size & 0x7)) { + printf("Invalid Cipher Block Size, data len=%d\n", + op->source_buf_size); + return (-EINVAL); + } + do { + + if ((op->cipher_type == XLR_SEC_CIPHER_TYPE_3DES) && + (op->cipher_op == XLR_SEC_CIPHER_OP_DECRYPT)) + setup_flags = XLR_SEC_SETUP_OP_FLIP_3DES_KEY; + + err = xlr_sec_setup_descriptor(op, + setup_flags, + desc, &cfg_vector); + if (err != XLR_SEC_ERR_NONE) + break; + + err = xlr_sec_setup_packet(op, + desc, + op->digest_type != XLR_SEC_DIGEST_TYPE_NONE ? + XLR_SEC_SETUP_OP_CIPHER_HMAC : 0, + &desc->data, + &desc->pkt_desc[0], + &desc->ctl_desc, + cfg_vector, + &desc->pkt_desc[1], + multi_frag_flag); + if (err != XLR_SEC_ERR_NONE) + break; + } while (0); + if (err != XLR_SEC_ERR_NONE) { + return (EINVAL); + } + err = xlr_sec_submit_message(desc, cfg_vector); + return err; +} + + +static xlr_sec_error_t +xlr_sec_setup_descriptor(xlr_sec_io_pt op, + unsigned int flags, + symkey_desc_pt desc, + uint32_t * cfg_vector) +{ + xlr_sec_error_t err; + + XLR_SEC_CMD_DIAG("xlr_sec_setup_descriptor: ENTER\n"); + + + if ((err = xlr_sec_setup_cipher(op, &desc->ctl_desc, cfg_vector)) != XLR_SEC_ERR_NONE) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_descriptor: xlr_sec_setup_cipher done err %d\n", + (int)err); + return err; + } + if (op->digest_type != XLR_SEC_DIGEST_TYPE_NONE) { + if ((err = xlr_sec_setup_digest(op, &desc->ctl_desc, cfg_vector)) != XLR_SEC_ERR_NONE) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_descriptor: xlr_sec_setup_digest done err %d\n", + (int)err); + return err; + } + } + if ((err = xlr_sec_setup_cksum(op, &desc->ctl_desc)) != XLR_SEC_ERR_NONE) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_descriptor: xlr_sec_setup_cksum done err %d\n", + (int)err); + return err; + } + if ((err = xlr_sec_control_setup(op, + flags, + &desc->control, + &desc->ctl_desc, + &desc->user, + *cfg_vector)) != XLR_SEC_ERR_NONE) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_descriptor: xlr_sec_control_setup done err %d\n", + (int)err); + return err; + } + XLR_SEC_CMD_DIAG("xlr_sec_setup_descriptor: DONE\n"); + return err; +} + + + +static +xlr_sec_error_t +xlr_sec_setup_packet(xlr_sec_io_pt op, + symkey_desc_pt desc, + unsigned int flags, + uint64_t * data, + PacketDescriptor_pt pkt_desc, + ControlDescriptor_pt ctl_desc, + uint32_t vector, + PacketDescriptor_pt next_pkt_desc, + uint8_t multi_frag_flag) +{ + uint32_t len, next_len = 0, len_dwords, last_u64_bytes; + uint64_t addr; + uint64_t seg_addr, next_seg_addr = 0; + uint64_t byte_offset, global_offset; + uint32_t cipher_offset_dwords; + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ENTER vector = %04x\n", vector); + + /* physical address of the source buffer */ + addr = (uint64_t) vtophys((void *)(unsigned long)op->source_buf); + /* cache-aligned base of the source buffer */ + seg_addr = (addr & ~(SMP_CACHE_BYTES - 1)); + /* offset in bytes to the source buffer start from the segment base */ + byte_offset = addr - seg_addr; + /* global offset: 0-7 bytes */ + global_offset = byte_offset & 0x7; + + + /* + * op->source_buf_size is expected to be the Nb double words to + * stream in (Including Segment address->CP/IV/Auth/CkSum offsets) + */ + + /* + * adjusted length of the whole thing, accounting for the added + * head, sans global_offset (per Paul S.) + */ + + len = op->source_buf_size + byte_offset - global_offset; + if (multi_frag_flag) { + next_seg_addr = (uint64_t) vtophys((void *)(unsigned long)(desc->next_src_buf)); + next_seg_addr = (next_seg_addr & ~(SMP_CACHE_BYTES - 1)); + next_len = desc->next_src_len; + } + /* length of the whole thing in dwords */ + len_dwords = NUM_CHUNKS(len, 3); + /* number of bytes in the last chunk (len % 8) */ + last_u64_bytes = len & 0x07; + + if (op->cipher_offset & 0x7) { + printf("** cipher_offset(%d) fails 64-bit word alignment **", + op->cipher_offset); + + return XLR_SEC_ERR_CIPHER_MODE; /* ! fix ! */ + } + /* + * global_offset is only three bits, so work the number of the whole + * 8-byte words into the global offset. both offset and + * cipher_offset are byte counts + */ + cipher_offset_dwords = (op->iv_offset + byte_offset) >> 3; + + + if (op->cipher_mode == XLR_SEC_CIPHER_MODE_F8 || + op->cipher_mode == XLR_SEC_CIPHER_MODE_CTR) { + if (multi_frag_flag) { + int nlhmac = ((op->source_buf_size + global_offset + 7 - op->cipher_offset) >> 3) & 1; + + pkt_desc->srcLengthIVOffUseIVNext = + + FIELD_VALUE(PKT_DSC_HASHBYTES, len & 7) | + FIELD_VALUE(PKT_DSC_IVOFF, cipher_offset_dwords) | + FIELD_VALUE(PKT_DSC_PKTLEN, nlhmac + ((len + 7) >> 3)) | + FIELD_VALUE(PKT_DSC_NLHMAC, nlhmac) | + FIELD_VALUE(PKT_DSC_BREAK, 0) | + FIELD_VALUE(PKT_DSC_WAIT, 1) | + FIELD_VALUE(PKT_DSC_NEXT, 1) | + FIELD_VALUE(PKT_DSC_SEGADDR, seg_addr >> (PKT_DSC_SEGADDR_LSB)) | + FIELD_VALUE(PKT_DSC_SEGOFFSET, global_offset); + } else { + int nlhmac = ((op->source_buf_size + global_offset + 7 - op->cipher_offset) >> 3) & 1; + + pkt_desc->srcLengthIVOffUseIVNext = + FIELD_VALUE(PKT_DSC_HASHBYTES, len & 7) | + FIELD_VALUE(PKT_DSC_IVOFF, cipher_offset_dwords) | + FIELD_VALUE(PKT_DSC_PKTLEN, nlhmac + ((len + 7) >> 3)) | + FIELD_VALUE(PKT_DSC_NLHMAC, nlhmac) | + FIELD_VALUE(PKT_DSC_BREAK, 0) | + FIELD_VALUE(PKT_DSC_WAIT, 0) | + FIELD_VALUE(PKT_DSC_SEGADDR, seg_addr >> (PKT_DSC_SEGADDR_LSB)) | + FIELD_VALUE(PKT_DSC_SEGOFFSET, global_offset); + + } + } else { + if (multi_frag_flag) { + pkt_desc->srcLengthIVOffUseIVNext = + + FIELD_VALUE(PKT_DSC_HASHBYTES, len & 7) | + FIELD_VALUE(PKT_DSC_IVOFF, cipher_offset_dwords) | + FIELD_VALUE(PKT_DSC_PKTLEN, (len + 7) >> 3) | + FIELD_VALUE(PKT_DSC_BREAK, 0) | + FIELD_VALUE(PKT_DSC_WAIT, 0) | + FIELD_VALUE(PKT_DSC_NEXT, 1) | + FIELD_VALUE(PKT_DSC_SEGADDR, seg_addr >> (PKT_DSC_SEGADDR_LSB)) | + FIELD_VALUE(PKT_DSC_SEGOFFSET, global_offset); + + + next_pkt_desc->srcLengthIVOffUseIVNext = + FIELD_VALUE(PKT_DSC_HASHBYTES, (next_len & 7)) | + FIELD_VALUE(PKT_DSC_IVOFF, 0) | + FIELD_VALUE(PKT_DSC_PKTLEN, (next_len + 7) >> 3) | + FIELD_VALUE(PKT_DSC_BREAK, 0) | + FIELD_VALUE(PKT_DSC_WAIT, 0) | + FIELD_VALUE(PKT_DSC_NEXT, 0) | + FIELD_VALUE(PKT_DSC_SEGADDR, next_seg_addr >> (PKT_DSC_SEGADDR_LSB)) | + FIELD_VALUE(PKT_DSC_SEGOFFSET, 0); + + + } else { + pkt_desc->srcLengthIVOffUseIVNext = + FIELD_VALUE(PKT_DSC_HASHBYTES, len & 7) | + FIELD_VALUE(PKT_DSC_IVOFF, cipher_offset_dwords) | + FIELD_VALUE(PKT_DSC_PKTLEN, (len + 7) >> 3) | + FIELD_VALUE(PKT_DSC_BREAK, 0) | + FIELD_VALUE(PKT_DSC_WAIT, 0) | + FIELD_VALUE(PKT_DSC_SEGADDR, seg_addr >> (PKT_DSC_SEGADDR_LSB)) | + FIELD_VALUE(PKT_DSC_SEGOFFSET, global_offset); + + + } + } + + switch (op->pkt_hmac) { + case XLR_SEC_LOADHMACKEY_MODE_OLD: + CLEAR_SET_FIELD(pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_LOADHMACKEY, PKT_DSC_LOADHMACKEY_OLD); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_LOADHMACKEY, PKT_DSC_LOADHMACKEY_OLD); + + } + break; + case XLR_SEC_LOADHMACKEY_MODE_LOAD: + CLEAR_SET_FIELD(pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_LOADHMACKEY, PKT_DSC_LOADHMACKEY_LOAD); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_LOADHMACKEY, PKT_DSC_LOADHMACKEY_LOAD); + + } + break; + default: + if (vector & (XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_F9)) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ERR_LOADHMACKEY_MODE EXIT\n"); + return XLR_SEC_ERR_LOADHMACKEY_MODE; + } + break; + } + + switch (op->pkt_hash) { + case XLR_SEC_PADHASH_PADDED: + CLEAR_SET_FIELD(pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_PADHASH, PKT_DSC_PADHASH_PADDED); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_PADHASH, PKT_DSC_PADHASH_PADDED); + } + break; + case XLR_SEC_PADHASH_PAD: + CLEAR_SET_FIELD(pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_PADHASH, PKT_DSC_PADHASH_PAD); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_PADHASH, PKT_DSC_PADHASH_PAD); + } + break; + default: + if (vector & (XLR_SEC_VECTOR_MAC | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_HMAC2)) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ERR_PADHASH_MODE EXIT\n"); + return XLR_SEC_ERR_PADHASH_MODE; + } + break; + } + + switch (op->pkt_iv) { + case XLR_SEC_PKT_IV_OLD: + CLEAR_SET_FIELD(pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_IV, PKT_DSC_IV_OLD); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_IV, PKT_DSC_IV_OLD); + + } + break; + case XLR_SEC_PKT_IV_NEW: + CLEAR_SET_FIELD(pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_IV, PKT_DSC_IV_NEW); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->srcLengthIVOffUseIVNext, + PKT_DSC_IV, PKT_DSC_IV_NEW); + + } + break; + default: + if (vector & XLR_SEC_VECTOR_CIPHER) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ERR_PKT_IV_MODE EXIT\n"); + return XLR_SEC_ERR_PKT_IV_MODE; + } + break; + } + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: src_buf=%llx phys_src_buf=%llx \n", + (unsigned long long)op->source_buf, (unsigned long long)addr); + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: seg_addr=%llx offset=%lld\n", + (unsigned long long)seg_addr, (unsigned long long)byte_offset); + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: global src offset: %d, iv_offset=%d\n", + cipher_offset_dwords, op->iv_offset); + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: src_buf_sz=%d PKT_LEN=%d\n", + op->source_buf_size, len_dwords); + + /* + * same operation with the destination. cipher offset affects this, + * as well + */ + if (multi_frag_flag) { + next_seg_addr = (uint64_t) vtophys((void *)(unsigned long)(desc->next_dest_buf)); + next_seg_addr = (next_seg_addr & ~(SMP_CACHE_BYTES - 1)); + } + addr = (uint64_t) vtophys((void *)(unsigned long)op->dest_buf); + seg_addr = (addr & ~(SMP_CACHE_BYTES - 1)); + byte_offset = addr - seg_addr; + global_offset = byte_offset & 0x7; + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: dest_buf=%llx phys_dest_buf=%llx \n", + (unsigned long long)op->dest_buf, (unsigned long long)addr); + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: seg_addr=%llx offset=%lld\n", + (unsigned long long)seg_addr, (unsigned long long)byte_offset); + + /* + * Dest Address = (Cipher Dest Address) + (Cipher Offset) + (Global + * Dest Data Offset) + * + * Cipher Dest Address - Cache-line (0xffffffffe0) Cipher Offset - + * Which (64-bit) Word in Cacheline (0-3) Global Dest Data Offset - + * Number of Bytes in (64-bit) Word before data + * + * It must be set for Digest-only Ops, since the Digest engine will + * write data to this address. + */ + cipher_offset_dwords = (op->cipher_offset + byte_offset) >> 3; + + + pkt_desc->dstDataSettings = + /* SYM_OP, HASHSRC */ + FIELD_VALUE(PKT_DSC_CPHROFF, cipher_offset_dwords) | + FIELD_VALUE(PKT_DSC_HASHOFF, (op->digest_offset + byte_offset) >> 3) | + FIELD_VALUE(PKT_DSC_CPHR_DST_ADDR, seg_addr) | + FIELD_VALUE(PKT_DSC_CPHR_DST_DWOFFSET, 0) | + FIELD_VALUE(PKT_DSC_CPHR_DST_OFFSET, global_offset); + + if (multi_frag_flag) { + next_pkt_desc->dstDataSettings = + /* SYM_OP, HASHSRC */ + FIELD_VALUE(PKT_DSC_CPHROFF, cipher_offset_dwords) | + FIELD_VALUE(PKT_DSC_HASHOFF, (op->digest_offset + byte_offset) >> 3) | + FIELD_VALUE(PKT_DSC_CPHR_DST_ADDR, next_seg_addr) | + FIELD_VALUE(PKT_DSC_CPHR_DST_DWOFFSET, 0) | + FIELD_VALUE(PKT_DSC_CPHR_DST_OFFSET, global_offset); + + } + if (op->cipher_type == XLR_SEC_CIPHER_TYPE_ARC4) + pkt_desc->dstDataSettings |= FIELD_VALUE(PKT_DSC_ARC4BYTECOUNT, last_u64_bytes); + + if (op->cipher_type != XLR_SEC_CIPHER_TYPE_NONE) { + switch (op->cipher_op) { + case XLR_SEC_CIPHER_OP_ENCRYPT: + CLEAR_SET_FIELD(pkt_desc->dstDataSettings, + PKT_DSC_SYM_OP, PKT_DSC_SYM_OP_ENCRYPT); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->dstDataSettings, + PKT_DSC_SYM_OP, PKT_DSC_SYM_OP_ENCRYPT); + + } + break; + case XLR_SEC_CIPHER_OP_DECRYPT: + CLEAR_SET_FIELD(pkt_desc->dstDataSettings, + PKT_DSC_SYM_OP, PKT_DSC_SYM_OP_DECRYPT); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->dstDataSettings, + PKT_DSC_SYM_OP, PKT_DSC_SYM_OP_DECRYPT); + + } + break; + default: + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ERR_CIPHER_OP EXIT\n"); + return XLR_SEC_ERR_CIPHER_OP; + } + } + if (flags & XLR_SEC_SETUP_OP_HMAC) { + switch (op->digest_src) { + case XLR_SEC_DIGEST_SRC_DMA: + CLEAR_SET_FIELD(pkt_desc->dstDataSettings, + PKT_DSC_HASHSRC, PKT_DSC_HASHSRC_DMA); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->dstDataSettings, + PKT_DSC_HASHSRC, PKT_DSC_HASHSRC_DMA); + + } + break; + case XLR_SEC_DIGEST_SRC_CPHR: + CLEAR_SET_FIELD(pkt_desc->dstDataSettings, + PKT_DSC_HASHSRC, PKT_DSC_HASHSRC_CIPHER); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->dstDataSettings, + PKT_DSC_HASHSRC, PKT_DSC_HASHSRC_CIPHER); + } + break; + default: + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ERR_DIGEST_SRC EXIT\n"); + return XLR_SEC_ERR_DIGEST_SRC; + } + } + if (op->cksum_type != XLR_SEC_CKSUM_TYPE_NOP) { + switch (op->cksum_src) { + case XLR_SEC_CKSUM_SRC_DMA: + CLEAR_SET_FIELD(pkt_desc->dstDataSettings, + PKT_DSC_CKSUMSRC, PKT_DSC_CKSUMSRC_DMA); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->dstDataSettings, + PKT_DSC_CKSUMSRC, PKT_DSC_CKSUMSRC_DMA); + } + break; + case XLR_SEC_CKSUM_SRC_CIPHER: + CLEAR_SET_FIELD(next_pkt_desc->dstDataSettings, + PKT_DSC_CKSUMSRC, PKT_DSC_CKSUMSRC_CIPHER); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->dstDataSettings, + PKT_DSC_CKSUMSRC, PKT_DSC_CKSUMSRC_CIPHER); + } + break; + default: + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ERR_CKSUM_SRC EXIT\n"); + return XLR_SEC_ERR_CKSUM_SRC; + } + } + pkt_desc->ckSumDstNonceHiCFBMaskLLWMask = + FIELD_VALUE(PKT_DSC_HASH_BYTE_OFF, (op->digest_offset & 0x7)) | + FIELD_VALUE(PKT_DSC_PKTLEN_BYTES, 0) | + /* NONCE_HI, PKT_DSC_LASTWORD, CFB_MASK, CKSUM_DST_ADDR */ + FIELD_VALUE(PKT_DSC_IV_OFF_HI, 0); + + if (multi_frag_flag) { + next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask = + FIELD_VALUE(PKT_DSC_HASH_BYTE_OFF, (op->digest_offset & 0x7)) | + FIELD_VALUE(PKT_DSC_PKTLEN_BYTES, 0) | + /* NONCE_HI, PKT_DSC_LASTWORD, CFB_MASK, CKSUM_DST_ADDR */ + FIELD_VALUE(PKT_DSC_IV_OFF_HI, 0); + + } + switch (op->pkt_lastword) { + case XLR_SEC_LASTWORD_128: + CLEAR_SET_FIELD(pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_128); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_128); + + } + break; + case XLR_SEC_LASTWORD_96MASK: + CLEAR_SET_FIELD(pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_96MASK); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_96MASK); + } + break; + case XLR_SEC_LASTWORD_64MASK: + CLEAR_SET_FIELD(pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_64MASK); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_64MASK); + } + break; + case XLR_SEC_LASTWORD_32MASK: + CLEAR_SET_FIELD(pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_32MASK); + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_LASTWORD, PKT_DSC_LASTWORD_32MASK); + } + break; + default: + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: ERR_LASTWORD_MODE EXIT\n"); + return XLR_SEC_ERR_LASTWORD_MODE; + } + CLEAR_SET_FIELD(pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_CFB_MASK, op->cfb_mask); + CLEAR_SET_FIELD(pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_NONCE_HI, htonl(op->nonce) >> 24); + CLEAR_SET_FIELD(pkt_desc->authDstNonceLow, + PKT_DSC_NONCE_LOW, htonl(op->nonce) & 0xffffff); + + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_CFB_MASK, op->cfb_mask); + CLEAR_SET_FIELD(next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_NONCE_HI, htonl(op->nonce) >> 24); + CLEAR_SET_FIELD(next_pkt_desc->authDstNonceLow, + PKT_DSC_NONCE_LOW, htonl(op->nonce) & 0xffffff); + + + } + /* Auth Dest Address must be Cacheline aligned on input */ + if (vector & (XLR_SEC_VECTOR_MAC | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_F9)) { + pkt_desc->authDstNonceLow |= + /* NONCE_LOW */ + FIELD_VALUE(PKT_DSC_AUTH_DST_ADDR, + (uint64_t) vtophys((void *)(unsigned long)op->auth_dest)) | + FIELD_VALUE(PKT_DSC_CIPH_OFF_HI, 0); + + + if (multi_frag_flag) { + next_pkt_desc->authDstNonceLow |= + /* NONCE_LOW */ + FIELD_VALUE(PKT_DSC_AUTH_DST_ADDR, + (uint64_t) vtophys((void *)(unsigned long)desc->next_auth_dest)) | + FIELD_VALUE(PKT_DSC_CIPH_OFF_HI, 0); + + + } + } + /* CkSum Dest Address must be Cacheline aligned on input */ + if (op->cksum_type == XLR_SEC_CKSUM_TYPE_IP) { + CLEAR_SET_FIELD(pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_CKSUM_DST_ADDR, + (uint64_t) vtophys((void *)(unsigned long)op->cksum_dest)); + + if (multi_frag_flag) { + CLEAR_SET_FIELD(next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask, + PKT_DSC_CKSUM_DST_ADDR, + (uint64_t) vtophys((void *)(unsigned long)desc->next_cksum_dest)); + + } + } + /* + * XLR_SEC_CMD_DIAG (" xlr_sec_setup_packet(): pkt_desc=%llx + * phys_pkt_desc=%llx \n", (unsigned long long)pkt_desc, (unsigned + * long long)virt_to_phys(pkt_desc)); (unsigned long long)pkt_desc, + * (unsigned long long)vtophys(pkt_desc)); + */ + XLR_SEC_CMD_DIAG(" xlr_sec_setup_packet(): pkt_desc=%p phys_pkt_desc=%llx \n", + pkt_desc, (unsigned long long)vtophys(pkt_desc)); + + + + CLEAR_SET_FIELD(*data, MSG_CMD_DATA_ADDR, ((uint64_t) vtophys(pkt_desc))); + CLEAR_SET_FIELD(*data, MSG_CMD_DATA_CTL, SEC_EOP); + CLEAR_SET_FIELD(*data, MSG_CMD_DATA_LEN, MSG_CMD_DATA_LEN_LOAD); + + + XLR_SEC_CMD_DIAG("xlr_sec_setup_packet: DONE\n"); + +#ifdef RMI_SEC_DEBUG + + { + printf("data desc\n"); + printf("srcLengthIVOffUseIVNext = 0x%llx\n", pkt_desc->srcLengthIVOffUseIVNext); + printf("dstDataSettings = 0x%llx\n", pkt_desc->dstDataSettings); + printf("authDstNonceLow = 0x%llx\n", pkt_desc->authDstNonceLow); + printf("ckSumDstNonceHiCFBMaskLLWMask = 0x%llx\n", pkt_desc->ckSumDstNonceHiCFBMaskLLWMask); + } + + if (multi_frag_flag) { + + printf("next data desc\n"); + printf("srcLengthIVOffUseIVNext = 0x%llx\n", next_pkt_desc->srcLengthIVOffUseIVNext); + printf("dstDataSettings = 0x%llx\n", next_pkt_desc->dstDataSettings); + printf("authDstNonceLow = 0x%llx\n", next_pkt_desc->authDstNonceLow); + printf("ckSumDstNonceHiCFBMaskLLWMask = 0x%llx\n", next_pkt_desc->ckSumDstNonceHiCFBMaskLLWMask); + } +#endif + +#ifdef SYMBOL + if (op->cipher_type == XLR_SEC_CIPHER_TYPE_ARC4) { + op->source_buf -= 0; + op->source_buf_size += 0; + op->dest_buf -= 0; + } +#endif + return XLR_SEC_ERR_NONE; +} + + +static int +identify_symkey_ctl_error(uint32_t code, xlr_sec_error_t err) +{ + int ret_val = EINVAL; + + switch (code) { + case CTL_ERR_NONE: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error: No Error\n"); + ret_val = 0; + break; + case CTL_ERR_CIPHER_OP: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error(CTL_ERR_CIPHER_OP) - Unknown Cipher Op \n"); + break; + case CTL_ERR_MODE: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error(CTL_ERR_MODE) - " + "Unknown or Not Allowed Mode \n"); + break; + case CTL_ERR_CHKSUM_SRC: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error(CTL_ERR_CHKSUM_SRC) - Unknown CkSum Src\n"); + break; + case CTL_ERR_CFB_MASK: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error(CTL_ERR_CFB_MASK) - Forbidden CFB Mask \n"); + break; + case CTL_ERR_OP: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error(CTL_ERR_OP) - Unknown Ctrl Op \n"); + break; + case CTL_ERR_DATA_READ: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error(CTL_ERR_DATA_READ) - Data Read Error\n"); + break; + case CTL_ERR_DESC_CTRL: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error(CTL_ERR_DESC_CTRL) - " + "Descriptor Ctrl Field Error \n"); + break; + case CTL_ERR_UNDEF1: + case CTL_ERR_UNDEF2: + default: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: CTL Error: UNKNOWN CODE=%d \n", code); + break; + } + return ret_val; +} + +static +int +identify_symkey_data_error(uint32_t code, xlr_sec_error_t err) +{ + int ret_val = -EINVAL; + + switch (code) { + case DATA_ERR_NONE: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error No Error\n"); + ret_val = 0; + break; + case DATA_ERR_LEN_CIPHER: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Not Enough Data To Cipher\n"); + break; + case DATA_ERR_IV_ADDR: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Illegal IV Loacation\n"); + break; + case DATA_ERR_WD_LEN_AES: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Illegal Nb Words To AES\n"); + break; + case DATA_ERR_BYTE_COUNT: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Illegal Pad And ByteCount Spec\n"); + break; + case DATA_ERR_LEN_CKSUM: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Not Enough Data To CkSum\n"); + break; + case DATA_ERR_OP: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Unknown Data Op \n"); + break; + case DATA_ERR_READ: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Data Read Error \n"); + break; + case DATA_ERR_WRITE: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error() - Data Write Error \n"); + break; + case DATA_ERR_UNDEF1: + default: + XLR_SEC_CMD_DIAG("XLR_SEC_SEC: DATA Error - UNKNOWN CODE=%d \n", code); + break; + } + return ret_val; +} + + +static int +xlr_sec_submit_message(symkey_desc_pt desc, uint32_t cfg_vector) +{ + xlr_sec_error_t err; + uint32_t ctl_error, data_error; + int ret_val = 0; + + XLR_SEC_CMD_DIAG("xlr_sec_submit_message: ENTER\n"); + + err = XLR_SEC_ERR_NONE; + + XLR_SEC_CMD_DIAG_SYM_DESC(desc, cfg_vector); + + do { + /* For now, send message and wait for response */ + err = xlr_sec_submit_op(desc); + + XLR_SEC_CMD_DIAG("xlr_sec_submit_message: err = %d \n", (uint32_t) err); + + if (err != XLR_SEC_ERR_NONE) { + ret_val = (EINVAL); + break; + } + ctl_error = desc->ctl_result; + data_error = desc->data_result; + + XLR_SEC_CMD_DIAG("xlr_sec_submit_message: ctl_error = %x data_error = %x\n", + ctl_error, data_error); + + if ((ret_val = identify_symkey_ctl_error(ctl_error, err)) == 0) + ret_val = identify_symkey_data_error(data_error, err); + + XLR_SEC_CMD_DIAG("xlr_sec_submit_message: identify error = %d \n", ret_val); + + } while (0); + + XLR_SEC_CMD_DIAG("xlr_sec_submit_message: DONE\n"); + return (ret_val); +} + + +static +xlr_sec_error_t +xlr_sec_setup_cipher(xlr_sec_io_pt op, + ControlDescriptor_pt ctl_desc, + uint32_t * vector) +{ + uint32_t aes_flag = 0; + uint32_t cipher_vector = 0; + + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ENTER vector = %04x\n", *vector); + + switch (op->cipher_type) { + case XLR_SEC_CIPHER_TYPE_NONE: + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_BYPASS); + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: CIPHER_TYPE_NONE EXIT\n"); + return XLR_SEC_ERR_NONE; + case XLR_SEC_CIPHER_TYPE_DES: + cipher_vector |= XLR_SEC_VECTOR_CIPHER_DES; + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_DES); + break; + case XLR_SEC_CIPHER_TYPE_3DES: + cipher_vector |= XLR_SEC_VECTOR_CIPHER_3DES; + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_3DES); + break; + case XLR_SEC_CIPHER_TYPE_AES128: + aes_flag = 1; + cipher_vector |= XLR_SEC_VECTOR_CIPHER_AES128; + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_AES128); + break; + case XLR_SEC_CIPHER_TYPE_AES192: + aes_flag = 1; + cipher_vector |= XLR_SEC_VECTOR_CIPHER_AES192; + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_AES192); + break; + case XLR_SEC_CIPHER_TYPE_AES256: + aes_flag = 1; + cipher_vector |= XLR_SEC_VECTOR_CIPHER_AES256; + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_AES256); + break; + case XLR_SEC_CIPHER_TYPE_ARC4: + cipher_vector |= XLR_SEC_VECTOR_CIPHER_ARC4; + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_ARC4); + SET_FIELD(ctl_desc->instruction, CTL_DSC_ARC4_KEYLEN, + op->rc4_key_len); + SET_FIELD(ctl_desc->instruction, CTL_DSC_ARC4_LOADSTATE, + op->rc4_loadstate); + SET_FIELD(ctl_desc->instruction, CTL_DSC_ARC4_SAVESTATE, + op->rc4_savestate); + if (op->rc4_loadstate || op->rc4_savestate) + cipher_vector |= XLR_SEC_VECTOR_STATE; + break; + case XLR_SEC_CIPHER_TYPE_KASUMI_F8: + aes_flag = 1; + cipher_vector |= XLR_SEC_VECTOR_CIPHER_KASUMI_F8; + SET_FIELD(ctl_desc->instruction, CTL_DSC_CPHR, CTL_DSC_CPHR_KASUMI_F8); + break; + default: + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ERR_CIPHER_TYPE EXIT\n"); + return XLR_SEC_ERR_CIPHER_TYPE; + } + + switch (op->cipher_mode) { + case XLR_SEC_CIPHER_MODE_ECB: + if (aes_flag == 1) + cipher_vector |= XLR_SEC_VECTOR_MODE_ECB_CBC_OFB; + else + cipher_vector |= XLR_SEC_VECTOR_MODE_ECB_CBC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_MODE, CTL_DSC_MODE_ECB); + break; + case XLR_SEC_CIPHER_MODE_CBC: + if (aes_flag == 1) + cipher_vector |= XLR_SEC_VECTOR_MODE_ECB_CBC_OFB; + else + cipher_vector |= XLR_SEC_VECTOR_MODE_ECB_CBC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_MODE, CTL_DSC_MODE_CBC); + break; + case XLR_SEC_CIPHER_MODE_OFB: + if (aes_flag == 0) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ERR_CIPHER_MODE EXIT\n"); + return XLR_SEC_ERR_CIPHER_MODE; + } + cipher_vector |= XLR_SEC_VECTOR_MODE_ECB_CBC_OFB; + SET_FIELD(ctl_desc->instruction, CTL_DSC_MODE, CTL_DSC_MODE_OFB); + break; + case XLR_SEC_CIPHER_MODE_CTR: + if (aes_flag == 0) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ERR_CIPHER_MODE EXIT\n"); + return XLR_SEC_ERR_CIPHER_MODE; + } + cipher_vector |= XLR_SEC_VECTOR_MODE_CTR_CFB; + SET_FIELD(ctl_desc->instruction, CTL_DSC_MODE, CTL_DSC_MODE_CTR); + break; + case XLR_SEC_CIPHER_MODE_CFB: + if (aes_flag == 0) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ERR_CIPHER_MODE EXIT\n"); + return XLR_SEC_ERR_CIPHER_MODE; + } + cipher_vector |= XLR_SEC_VECTOR_MODE_CTR_CFB; + SET_FIELD(ctl_desc->instruction, CTL_DSC_MODE, CTL_DSC_MODE_CFB); + break; + case XLR_SEC_CIPHER_MODE_F8: + if (aes_flag == 0) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ERR_CIPHER_MODE EXIT\n"); + return XLR_SEC_ERR_CIPHER_MODE; + } + cipher_vector |= XLR_SEC_VECTOR_MODE_F8; + SET_FIELD(ctl_desc->instruction, CTL_DSC_MODE, CTL_DSC_MODE_F8); + break; + default: + if (!(cipher_vector & (XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_CIPHER_KASUMI_F8))) { + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ERR_CIPHER_MODE EXIT\n"); + return XLR_SEC_ERR_CIPHER_MODE; + } + } + + switch (op->cipher_init) { + case XLR_SEC_CIPHER_INIT_OK: + SET_FIELD(ctl_desc->instruction, + CTL_DSC_ICPHR, CTL_DSC_ICPHR_OKY); + break; + + case XLR_SEC_CIPHER_INIT_NK: + SET_FIELD(ctl_desc->instruction, + CTL_DSC_ICPHR, CTL_DSC_ICPHR_NKY); + break; + default: + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: ERR_CIPHER_INIT EXIT\n"); + return XLR_SEC_ERR_CIPHER_INIT; + } + + *vector |= cipher_vector; + + XLR_SEC_CMD_DIAG("xlr_sec_setup_cipher: EXIT vector = %04x\n", *vector); + + return XLR_SEC_ERR_NONE; +} + + +static +xlr_sec_error_t +xlr_sec_setup_digest(xlr_sec_io_pt op, + ControlDescriptor_pt ctl_desc, + uint32_t * vector) +{ + uint32_t hash_flag = 0; + uint32_t hmac_flag = 0; + uint32_t digest_vector = 0; + + XLR_SEC_CMD_DIAG("xlr_sec_setup_digest: ENTER vector = %04x\n", *vector); + + switch (op->digest_type) { + case XLR_SEC_DIGEST_TYPE_MD5: + digest_vector |= XLR_SEC_VECTOR_MAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_MD5); + break; + case XLR_SEC_DIGEST_TYPE_SHA1: + digest_vector |= XLR_SEC_VECTOR_MAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA1); + break; + case XLR_SEC_DIGEST_TYPE_SHA256: + digest_vector |= XLR_SEC_VECTOR_MAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA256); + break; + case XLR_SEC_DIGEST_TYPE_SHA384: + digest_vector |= XLR_SEC_VECTOR_MAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASHHI, CTL_DSC_HASH_SHA384 >> 2); + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA384); + break; + case XLR_SEC_DIGEST_TYPE_SHA512: + digest_vector |= XLR_SEC_VECTOR_MAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASHHI, CTL_DSC_HASH_SHA512 >> 2); + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA512); + break; + case XLR_SEC_DIGEST_TYPE_GCM: + hash_flag = 1; + digest_vector |= XLR_SEC_VECTOR_GCM; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASHHI, CTL_DSC_HASH_GCM >> 2); + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_GCM); + break; + case XLR_SEC_DIGEST_TYPE_KASUMI_F9: + hash_flag = 1; + digest_vector |= XLR_SEC_VECTOR_F9; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASHHI, CTL_DSC_HASH_KASUMI_F9 >> 2); + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_KASUMI_F9); + break; + case XLR_SEC_DIGEST_TYPE_HMAC_MD5: + hmac_flag = 1; + digest_vector |= XLR_SEC_VECTOR_HMAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_MD5); + break; + case XLR_SEC_DIGEST_TYPE_HMAC_SHA1: + hmac_flag = 1; + digest_vector |= XLR_SEC_VECTOR_HMAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA1); + break; + case XLR_SEC_DIGEST_TYPE_HMAC_SHA256: + hmac_flag = 1; + digest_vector |= XLR_SEC_VECTOR_HMAC; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA256); + break; + case XLR_SEC_DIGEST_TYPE_HMAC_SHA384: + hmac_flag = 1; + digest_vector |= XLR_SEC_VECTOR_HMAC2; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASHHI, CTL_DSC_HASH_SHA384 >> 2); + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA384); + break; + case XLR_SEC_DIGEST_TYPE_HMAC_SHA512: + hmac_flag = 1; + digest_vector |= XLR_SEC_VECTOR_HMAC2; + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASHHI, CTL_DSC_HASH_SHA512 >> 2); + SET_FIELD(ctl_desc->instruction, CTL_DSC_HASH, CTL_DSC_HASH_SHA512); + break; + default: + return XLR_SEC_ERR_DIGEST_TYPE; + } + + if (hmac_flag == 1) { + SET_FIELD(ctl_desc->instruction, CTL_DSC_HMAC, CTL_DSC_HMAC_ON); + + } + if (hmac_flag || hash_flag) { + switch (op->digest_init) { + case XLR_SEC_DIGEST_INIT_OLDKEY: + SET_FIELD(ctl_desc->instruction, CTL_DSC_IHASH, CTL_DSC_IHASH_OLD); + break; + case XLR_SEC_DIGEST_INIT_NEWKEY: + SET_FIELD(ctl_desc->instruction, CTL_DSC_IHASH, CTL_DSC_IHASH_NEW); + break; + default: + return XLR_SEC_ERR_DIGEST_INIT; + } + } /* hmac_flag */ + *vector |= digest_vector; + + XLR_SEC_CMD_DIAG("xlr_sec_setup_digest: EXIT vector = %04x\n", *vector); + + return XLR_SEC_ERR_NONE; +} + +static +xlr_sec_error_t +xlr_sec_setup_cksum(xlr_sec_io_pt op, + ControlDescriptor_pt ctl_desc) +{ + switch (op->cksum_type) { + case XLR_SEC_CKSUM_TYPE_NOP: + SET_FIELD(ctl_desc->instruction, CTL_DSC_CKSUM, CTL_DSC_CKSUM_NOP); + return XLR_SEC_ERR_NONE; + case XLR_SEC_CKSUM_TYPE_IP: + SET_FIELD(ctl_desc->instruction, CTL_DSC_CKSUM, CTL_DSC_CKSUM_IP); + break; + default: + return XLR_SEC_ERR_CKSUM_TYPE; + } + + return XLR_SEC_ERR_NONE; +} + + +static +xlr_sec_error_t +xlr_sec_control_setup(xlr_sec_io_pt op, + unsigned int flags, + uint64_t * control, + ControlDescriptor_pt ctl_desc, + xlr_sec_drv_user_t * user, + uint32_t vector) +{ + uint64_t *hmac_key = NULL; + uint64_t *cipher_key = NULL; + uint64_t *cipher_state = NULL; + uint32_t ctl_size = 0; + uint64_t ctl_addr = 0; + uint32_t cipher_keylen = 0; + uint32_t hmac_keylen = 0; + uint32_t ctl_len; + +#ifdef SYM_DEBUG + XLR_SEC_CMD_DIAG(" ENTER vector = %04x\n", vector); +#endif + + + switch (vector) { + case XLR_SEC_VECTOR_MAC: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR_MAC \n"); + ctl_size = sizeof(HMAC_t); + break; + case XLR_SEC_VECTOR_HMAC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_HMAC \n"); + hmac_key = &ctl_desc->cipherHashInfo.infoHMAC.hmacKey0; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(HMAC_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4.cipherKey0; + cipher_keylen = op->rc4_key_len; + ctl_size = sizeof(ARC4_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__HMAC\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4HMAC.hmacKey0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(ARC4HMAC_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__STATE: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__STATE\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4State.cipherKey0; + cipher_state = + &ctl_desc->cipherHashInfo.infoARC4State.Arc4SboxData0; + cipher_keylen = op->rc4_key_len; + ctl_size = sizeof(ARC4State_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC__STATE: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__HMAC__STATE\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4StateHMAC.cipherKey0; + cipher_state = + &ctl_desc->cipherHashInfo.infoARC4StateHMAC.Arc4SboxData0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4StateHMAC.hmacKey0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(ARC4StateHMAC_t); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_KASUMI_F8\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoKASUMIF8.cipherKey0; + cipher_keylen = XLR_SEC_KASUMI_F8_KEY_LENGTH; + ctl_size = sizeof(KASUMIF8_t); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoKASUMIF8HMAC.cipherKey0; + cipher_keylen = XLR_SEC_KASUMI_F8_KEY_LENGTH; + hmac_key = &ctl_desc->cipherHashInfo.infoKASUMIF8HMAC.hmacKey0; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(KASUMIF8HMAC_t); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC2: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC2\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoKASUMIF8HMAC2.cipherKey0; + cipher_keylen = XLR_SEC_KASUMI_F8_KEY_LENGTH; + hmac_key = &ctl_desc->cipherHashInfo.infoKASUMIF8HMAC2.hmacKey0; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(KASUMIF8HMAC2_t); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__GCM: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__GCM\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoKASUMIF8GCM.cipherKey0; + cipher_keylen = XLR_SEC_KASUMI_F8_KEY_LENGTH; + hmac_key = &ctl_desc->cipherHashInfo.infoKASUMIF8GCM.GCMH0; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(KASUMIF8GCM_t); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__F9: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__F9\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoKASUMIF8F9.cipherKey0; + cipher_keylen = XLR_SEC_KASUMI_F8_KEY_LENGTH; + hmac_key = &ctl_desc->cipherHashInfo.infoKASUMIF8F9.authKey0; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(KASUMIF8F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_DES__HMAC__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_DES__HMAC__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoDESHMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoDESHMAC.hmacKey0; + hmac_keylen = sizeof(HMAC_t); + cipher_keylen = XLR_SEC_DES_KEY_LENGTH; + ctl_size = sizeof(DESHMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_DES__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_DES__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoDES.cipherKey0; + cipher_keylen = XLR_SEC_DES_KEY_LENGTH; + ctl_size = sizeof(DES_t); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__HMAC__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_3DES__HMAC__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.info3DESHMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.info3DESHMAC.hmacKey0; + cipher_keylen = XLR_SEC_3DES_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(DES3HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_3DES__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.info3DES.cipherKey0; + cipher_keylen = XLR_SEC_3DES_KEY_LENGTH; + ctl_size = sizeof(DES3_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES128HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128.cipherKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + ctl_size = sizeof(AES128_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES128HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128.cipherKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + ctl_size = sizeof(AES128_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128F8HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128F8HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES128F8_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES128F8HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128F8.cipherKey0; + cipher_keylen = XLR_SEC_AES128F8_KEY_LENGTH; + ctl_size = sizeof(AES128F8_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES192HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192.cipherKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + ctl_size = sizeof(AES192_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES192HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192.cipherKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + ctl_size = sizeof(AES192_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192F8HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192F8HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES192F8_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES192F8HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192F8.cipherKey0; + cipher_keylen = XLR_SEC_AES192F8_KEY_LENGTH; + ctl_size = sizeof(AES192F8_t); + break; + + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES256HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256.cipherKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + ctl_size = sizeof(AES256_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES256HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256.cipherKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + ctl_size = sizeof(AES256_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256F8HMAC.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256F8HMAC.hmacKey0; + cipher_keylen = XLR_SEC_AES256F8_KEY_LENGTH; + hmac_keylen = sizeof(HMAC_t); + ctl_size = sizeof(AES256F8HMAC_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256F8.cipherKey0; + cipher_keylen = XLR_SEC_AES256F8_KEY_LENGTH; + ctl_size = sizeof(AES256F8_t); + break; + case XLR_SEC_VECTOR_HMAC2: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_HMAC2 \n"); + hmac_key = &ctl_desc->cipherHashInfo.infoHMAC2.hmacKey0; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(HMAC2_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4HMAC2.hmacKey0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(ARC4HMAC2_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2__STATE: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2__STATE\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4StateHMAC2.cipherKey0; + cipher_state = + &ctl_desc->cipherHashInfo.infoARC4StateHMAC2.Arc4SboxData0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4StateHMAC2.hmacKey0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(ARC4StateHMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_DES__HMAC2__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_DES__HMAC2__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoDESHMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoDESHMAC2.hmacKey0; + hmac_keylen = sizeof(HMAC2_t); + cipher_keylen = XLR_SEC_DES_KEY_LENGTH; + ctl_size = sizeof(DESHMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__HMAC2__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_3DES__HMAC2__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.info3DESHMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.info3DESHMAC2.hmacKey0; + cipher_keylen = XLR_SEC_3DES_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(DES3HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES128HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES128HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128F8HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128F8HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES128F8_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES128F8HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES192HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES192HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192F8HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192F8HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES192F8_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES192F8HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES256HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES256HMAC2_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256F8HMAC2.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256F8HMAC2.hmacKey0; + cipher_keylen = XLR_SEC_AES256F8_KEY_LENGTH; + hmac_keylen = sizeof(HMAC2_t); + ctl_size = sizeof(AES256F8HMAC2_t); + break; + case XLR_SEC_VECTOR_GCM: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_GCM \n"); + hmac_key = &ctl_desc->cipherHashInfo.infoGCM.GCMH0; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(GCM_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__GCM: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__GCM\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4GCM.GCMH0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(ARC4GCM_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__GCM__STATE: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__GCM__STATE\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4StateGCM.cipherKey0; + cipher_state = + &ctl_desc->cipherHashInfo.infoARC4StateGCM.Arc4SboxData0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4StateGCM.GCMH0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(ARC4StateGCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_DES__GCM__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_DES__GCM__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoDESGCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoDESGCM.GCMH0; + hmac_keylen = sizeof(GCM_t); + cipher_keylen = XLR_SEC_DES_KEY_LENGTH; + ctl_size = sizeof(DESGCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__GCM__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_3DES__GCM__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.info3DESGCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.info3DESGCM.GCMH0; + cipher_keylen = XLR_SEC_3DES_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(DES3GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128GCM.GCMH0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES128GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128GCM.GCMH0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES128GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128F8GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128F8GCM.GCMH0; + cipher_keylen = XLR_SEC_AES128F8_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES128F8GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192GCM.GCMH0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES192GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192GCM.GCMH0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES192GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192F8GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192F8GCM.GCMH0; + cipher_keylen = XLR_SEC_AES192F8_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES192F8GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256GCM.GCMH0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES256GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256GCM.GCMH0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES256GCM_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256F8GCM.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256F8GCM.GCMH0; + cipher_keylen = XLR_SEC_AES256F8_KEY_LENGTH; + hmac_keylen = sizeof(GCM_t); + ctl_size = sizeof(AES256F8GCM_t); + break; + case XLR_SEC_VECTOR_F9: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_F9 \n"); + hmac_key = &ctl_desc->cipherHashInfo.infoF9.authKey0; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(F9_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__F9: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__F9\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4F9.authKey0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(ARC4F9_t); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__F9__STATE: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR_CIPHER_ARC4__F9__STATE\n"); + cipher_key = &ctl_desc->cipherHashInfo.infoARC4StateF9.cipherKey0; + cipher_state = + &ctl_desc->cipherHashInfo.infoARC4StateF9.Arc4SboxData0; + hmac_key = &ctl_desc->cipherHashInfo.infoARC4StateF9.authKey0; + cipher_keylen = op->rc4_key_len; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(ARC4StateF9_t); + break; + case XLR_SEC_VECTOR__CIPHER_DES__F9__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_DES__F9__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoDESF9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoDESF9.authKey0; + hmac_keylen = sizeof(F9_t); + cipher_keylen = XLR_SEC_DES_KEY_LENGTH; + ctl_size = sizeof(DESF9_t); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__F9__MODE_ECB_CBC: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_3DES__F9__MODE_ECB_CBC \n"); + cipher_key = &ctl_desc->cipherHashInfo.info3DESF9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.info3DESF9.authKey0; + cipher_keylen = XLR_SEC_3DES_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(DES3F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128F9.authKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES128F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG(" XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128F9.authKey0; + cipher_keylen = XLR_SEC_AES128_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES128F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES128F8F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES128F8F9.authKey0; + cipher_keylen = XLR_SEC_AES128F8_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES128F8F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192F9.authKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES192F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192F9.authKey0; + cipher_keylen = XLR_SEC_AES192_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES192F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES192F8F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES192F8F9.authKey0; + cipher_keylen = XLR_SEC_AES192F8_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES192F8F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_CTR_CFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_CTR_CFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256F9.authKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES256F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_ECB_CBC_OFB: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_ECB_CBC_OFB \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256F9.authKey0; + cipher_keylen = XLR_SEC_AES256_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES256F9_t); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_F8: + XLR_SEC_CMD_DIAG("XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_F8 \n"); + cipher_key = &ctl_desc->cipherHashInfo.infoAES256F8F9.cipherKey0; + hmac_key = &ctl_desc->cipherHashInfo.infoAES256F8F9.authKey0; + cipher_keylen = XLR_SEC_AES256F8_KEY_LENGTH; + hmac_keylen = sizeof(F9_t); + ctl_size = sizeof(AES256F8F9_t); + break; + + default: + XLR_SEC_CMD_DIAG("default \n"); + return XLR_SEC_ERR_CONTROL_VECTOR; + } + + if ((cipher_key != NULL) && !(flags & XLR_SEC_SETUP_OP_PRESERVE_CIPHER_KEY)) + memcpy(cipher_key, &op->crypt_key[0], cipher_keylen); + + if ((hmac_key != NULL) && !(flags & XLR_SEC_SETUP_OP_PRESERVE_HMAC_KEY)) + memcpy(hmac_key, &op->mac_key[0], hmac_keylen); + if (cipher_state) { + if (op->rc4_loadstate) + memcpy(cipher_state, (void *)(unsigned long)op->rc4_state, + XLR_SEC_MAX_RC4_STATE_SIZE); + if (op->rc4_savestate) + user->aligned_state = (char *)cipher_state; + } + if (flags & XLR_SEC_SETUP_OP_FLIP_3DES_KEY) { + uint64_t temp; + + temp = ctl_desc->cipherHashInfo.info3DES.cipherKey0; + ctl_desc->cipherHashInfo.info3DES.cipherKey0 = + ctl_desc->cipherHashInfo.info3DES.cipherKey2; + ctl_desc->cipherHashInfo.info3DES.cipherKey2 = temp; + } + /* + * Control length is the number of control cachelines to be read so + * user needs to round up the control length to closest integer + * multiple of 32 bytes. + */ + ctl_size += sizeof(ctl_desc->instruction); + ctl_len = NUM_CHUNKS(ctl_size, 5); + XLR_SEC_CMD_DIAG("ctl_size in bytes: %u, in cachelines: %u\n", ctl_size, ctl_len); + CLEAR_SET_FIELD(*control, MSG_CMD_CTL_LEN, ctl_len); + + ctl_addr = (uint64_t) vtophys(ctl_desc); + CLEAR_SET_FIELD(*control, MSG_CMD_CTL_ADDR, ctl_addr); + + XLR_SEC_CMD_DIAG(" xlr_sec_control_setup(): ctl_desc=%p ctl_addr=%llx \n", + ctl_desc, (unsigned long long)ctl_addr); + + CLEAR_SET_FIELD(*control, MSG_CMD_CTL_CTL, SEC_SOP); + + return XLR_SEC_ERR_NONE; +} + + +xlr_sec_error_t +xlr_sec_submit_op(symkey_desc_pt desc) +{ + struct msgrng_msg send_msg; + + int rsp_dest_id, cpu, hard_cpu, hard_thread; + int code, retries; + unsigned long msgrng_flags = 0; + + /* threads (0-3) are orthogonal to buckets 0-3 */ + cpu = xlr_cpu_id(); + + hard_cpu = cpu >> 2; + hard_thread = cpu & 0x3;/* thread id */ + rsp_dest_id = (hard_cpu << 3) + hard_thread; + + desc->op_ctl.cpu = hard_cpu; + desc->op_ctl.flags = 0; /* called from kernel thread */ + + XLR_SEC_CMD_DIAG("[%s]:%d: cpu=0x%x hard_cpu=0x%x hard_thrd=0x%x id=0x%x \n", + __FUNCTION__, __LINE__, cpu, hard_cpu, hard_thread, rsp_dest_id); + + /* + * Set DestId in Message Control Word. This tells the Security + * Engine which bucket to send the reply to for this CPU + */ + CLEAR_SET_FIELD(desc->control, MSG_CMD_CTL_ID, rsp_dest_id); + CLEAR_SET_FIELD(desc->data, MSG_CMD_CTL_ID, rsp_dest_id); + + CLEAR_SET_FIELD(desc->control, MSG_CTL_OP_TYPE, MSG0_CTL_OP_ENGINE_SYMKEY); + CLEAR_SET_FIELD(desc->data, MSG_CTL_OP_TYPE, MSG1_CTL_OP_SYMKEY_PIPE0); + + send_msg.msg0 = desc->control | (1ULL << 53); + send_msg.msg1 = desc->data | (1ULL << 53) | (1ULL << 52); + send_msg.msg2 = send_msg.msg3 = 0; + + desc->op_ctl.flags = 1; + //in_interrupt(); /* ipsec softirq ? */ + + XLR_SEC_CMD_DIAG("[%s]: IN_IRQ=%d msg0=0x%llx msg1=0x%llx \n", + __FUNCTION__, desc->op_ctl.flags, send_msg.msg0, send_msg.msg1); + + + + retries = 100; + + while (retries--) { + msgrng_flags_save(msgrng_flags); + + code = message_send_retry(SEC_MSGRING_WORDSIZE, + MSGRNG_CODE_SEC, + desc->op_ctl.stn_id, + &send_msg); + + + msgrng_flags_restore(msgrng_flags); + + if (code == 0) + break; + } + + + return (XLR_SEC_ERR_NONE); +} + + + +symkey_desc_pt +xlr_sec_allocate_desc(void *session_ptr) +{ + uint64_t addr; + symkey_desc_pt aligned, new; + + new = (symkey_desc_pt) malloc(sizeof(symkey_desc_t), + M_DEVBUF, M_NOWAIT | M_ZERO); + + if (new == NULL) + return (NULL); + + new->ses = session_ptr; + + new->user.kern_src = new->user.aligned_src = + (uint8_t *) contigmalloc(256 * 1024 + 1024, + M_DEVBUF, M_NOWAIT | M_ZERO, + 0, 0xffffffff, XLR_CACHELINE_SIZE, 0); + + if (new->user.kern_src == NULL) { + printf("ERROR - malloc failed for user.kern_src\n"); + return NULL; + } + new->user.aligned_dest = new->user.kern_dest = + (uint8_t *) contigmalloc(257 * 1024, + M_DEVBUF, M_NOWAIT | M_ZERO, + 0, 0xffffffff, XLR_CACHELINE_SIZE, 0); + + if (new->user.aligned_dest == NULL) { + printf("ERROR - malloc failed for user.aligned_dest\n"); + return NULL; + } + new->next_src_buf = (uint8_t *) contigmalloc(256 * 1024 + 1024, + M_DEVBUF, M_NOWAIT | M_ZERO, + 0, 0xffffffff, XLR_CACHELINE_SIZE, 0); + + if (new->next_src_buf == NULL) { + printf("ERROR - malloc failed for next_src_buf\n"); + return NULL; + } + new->next_dest_buf = + (uint8_t *) contigmalloc(257 * 1024, + M_DEVBUF, M_NOWAIT | M_ZERO, + 0, 0xffffffff, XLR_CACHELINE_SIZE, 0); + + if (new->next_dest_buf == NULL) { + printf("ERROR - malloc failed for next_dest_buf\n"); + return NULL; + } + new->user.kern_auth = new->user.user_auth = NULL; + new->user.aligned_auth = new->user.user_auth = NULL; + + + /* find cacheline alignment */ + aligned = new; + addr = (uint64_t) vtophys(new); + + /* save for free */ + aligned->alloc = new; + + /* setup common control info */ + aligned->op_ctl.phys_self = addr; + aligned->op_ctl.stn_id = MSGRNG_STNID_SEC0; + + return (aligned); +} + + +static void +xlr_sec_free_desc(symkey_desc_pt desc) +{ + if ((desc == NULL) || (desc->alloc == NULL)) { + printf("%s: NULL descriptor \n", __FUNCTION__); + return; + } + contigfree(desc, sizeof(symkey_desc_t), M_DEVBUF); + + + return; +} + +void +print_buf(char *desc, void *data, int len) +{ + uint8_t *dp; + int i; + + DPRINT("%s: ", desc); /* newline done in for-loop */ + dp = data; + for (i = 0; i < len; i++, dp++) { + if ((i % 16) == 0) + DPRINT("\n"); + DPRINT(" %c%c", + nib2hex[(((*dp) & 0xf0) >> 4)], + nib2hex[((*dp) & 0x0f)]); + } + DPRINT("\n"); +} + + +#ifdef XLR_SEC_CMD_DEBUG +static void +decode_symkey_desc(symkey_desc_pt desc, uint32_t cfg_vector) +{ + + unsigned long long word; + + /* uint8_t *info; */ + /* int i; */ + + DPRINT("MSG - CTL: \n"); + DPRINT("\t CTRL = %lld \n", + GET_FIELD(desc->control, MSG_CMD_CTL_CTL)); + DPRINT("\t CTRL LEN = %lld \n", + GET_FIELD(desc->control, MSG_CMD_CTL_LEN)); + DPRINT("\t CTRL ADDR = %llx \n\n", + GET_FIELD(desc->control, MSG_CMD_CTL_ADDR)); + + DPRINT("MSG - DATA: \n"); + DPRINT("\t CTRL = %lld \n", + GET_FIELD(desc->data, MSG_CMD_DATA_CTL)); + DPRINT("\t DATA LEN = %lld \n", + GET_FIELD(desc->data, MSG_CMD_DATA_LEN)); + DPRINT("\t DATA ADDR = %llx \n\n", + GET_FIELD(desc->data, MSG_CMD_DATA_ADDR)); + + DPRINT("CONTROL DESCRIPTOR: \n"); + word = desc->ctl_desc.instruction; + DPRINT("\tINSTRUCTION: %llx\n", word); + DPRINT("\t\tOVERRIDE CIPH = %lld \n", GET_FIELD(word, CTL_DSC_OVERRIDECIPHER)); + DPRINT("\t\tARC4 WAIT = %lld \n", GET_FIELD(word, CTL_DSC_ARC4_WAIT4SAVE)); + DPRINT("\t\tARC4 SAVE = %lld \n", GET_FIELD(word, CTL_DSC_ARC4_SAVESTATE)); + DPRINT("\t\tARC4 LOAD = %lld \n", GET_FIELD(word, CTL_DSC_ARC4_LOADSTATE)); + DPRINT("\t\tARC4 KEYLEN = %lld \n", GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + DPRINT("\t\tCIPHER = %lld \n", GET_FIELD(word, CTL_DSC_CPHR)); + DPRINT("\t\tCIPHER MODE = %lld \n", GET_FIELD(word, CTL_DSC_MODE)); + DPRINT("\t\tINIT CIPHER = %lld \n", GET_FIELD(word, CTL_DSC_ICPHR)); + DPRINT("\t\tHMAC = %lld \n", GET_FIELD(word, CTL_DSC_HMAC)); + DPRINT("\t\tHASH ALG = %lld \n", GET_FIELD(word, CTL_DSC_HASH) | (GET_FIELD(word, CTL_DSC_HASHHI) << 2)); + DPRINT("\t\tINIT HASH = %lld \n", GET_FIELD(word, CTL_DSC_IHASH)); + DPRINT("\t\tCHKSUM = %lld \n", GET_FIELD(word, CTL_DSC_CKSUM)); + DPRINT("\tCIPHER HASH INFO: \n"); +#if 0 + info = (uint8_t *) & desc->ctl_desc->cipherHashInfo; + for (i = 0; i < sizeof(CipherHashInfo_t); i++, info++) { + DPRINT(" %02x", *info); + if (i && (i % 16) == 0) + DPRINT("\n"); + } + DPRINT("\n\n"); +#endif + + switch (cfg_vector) { + case XLR_SEC_VECTOR_CIPHER_ARC4: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4 \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__HMAC \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4HMAC.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoARC4HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__STATE: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__STATE \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4State.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC__STATE: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__HMAC__STATE \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateHMAC.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateHMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_KASUMI_F8 \n"); + print_buf("KASUMI_F8 Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8.cipherKey0, + XLR_SEC_KASUMI_F8_KEY_LENGTH); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC: + DPRINT("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC\n"); + print_buf("KASUMI_F8 Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8HMAC.cipherKey0, + XLR_SEC_KASUMI_F8_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC2: + DPRINT("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC2\n"); + print_buf("KASUMI_F8 Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8HMAC2.cipherKey0, + XLR_SEC_KASUMI_F8_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__GCM: + DPRINT("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__GCM\n"); + print_buf("KASUMI_F8 Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8GCM.cipherKey0, + XLR_SEC_KASUMI_F8_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8GCM.GCMH0, + sizeof(GCM_t)); + break; + case XLR_SEC_VECTOR_CIPHER_KASUMI_F8__F9: + DPRINT("XLR_SEC_VECTOR_CIPHER_KASUMI_F8__F9\n"); + print_buf("KASUMI_F8 Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8F9.cipherKey0, + XLR_SEC_KASUMI_F8_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoKASUMIF8F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR_MAC: + DPRINT("VECTOR: XLR_SEC_VECTOR_MAC \n"); + DPRINT("MAC-ONLY - No Info\n"); + break; + case XLR_SEC_VECTOR_HMAC: + DPRINT("VECTOR: XLR_SEC_VECTOR_HMAC \n"); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoHMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_DES__HMAC__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_DES__HMAC__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoDESHMAC.cipherKey0, + XLR_SEC_DES_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoDESHMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_DES__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_DES__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoDES.cipherKey0, + XLR_SEC_DES_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__HMAC__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_3DES__HMAC__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.info3DESHMAC.cipherKey0, + XLR_SEC_3DES_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.info3DESHMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_3DES__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.info3DES.cipherKey0, + XLR_SEC_3DES_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__MODE_ECB_CBC_OFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__MODE_ECB_CBC_OFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + break; + + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_ECB_CBC_OFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__MODE_ECB_CBC_OFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2 \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4HMAC2.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2__STATE: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2__STATE \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateHMAC2.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateHMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR_HMAC2: + DPRINT("VECTOR: XLR_SEC_VECTOR_HMAC2 \n"); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoHMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_DES__HMAC2__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_DES__HMAC2__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoDESHMAC2.cipherKey0, + XLR_SEC_DES_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoDESHMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__HMAC2__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_3DES__HMAC2__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.info3DESHMAC2.cipherKey0, + XLR_SEC_3DES_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.info3DESHMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC2.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC2.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES128HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC2.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC2.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES192HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC2.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_ECB_CBC_OFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC2.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__GCM: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__GCM \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4GCM.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoARC4GCM.GCMH0, + sizeof(GCM_t)); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__GCM__STATE: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__GCM__STATE \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateGCM.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateGCM.GCMH0, + sizeof(GCM_t)); + break; + case XLR_SEC_VECTOR_GCM: + DPRINT("VECTOR: XLR_SEC_VECTOR_GCM \n"); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoGCM.GCMH0, + sizeof(GCM_t)); + break; + case XLR_SEC_VECTOR__CIPHER_DES__GCM__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_DES__GCM__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoDESGCM.cipherKey0, + XLR_SEC_DES_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoDESGCM.GCMH0, + sizeof(GCM_t)); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__GCM__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_3DES__GCM__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.info3DESGCM.cipherKey0, + XLR_SEC_3DES_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.info3DESGCM.GCMH0, + sizeof(GCM_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128GCM.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES128GCM.GCMH0, + XLR_SEC_AES128_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128GCM.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES128GCM.GCMH0, + XLR_SEC_AES128_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192GCM.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES192GCM.GCMH0, + XLR_SEC_AES192_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192GCM.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES192GCM.GCMH0, + XLR_SEC_AES192_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256GCM.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES256GCM.GCMH0, + XLR_SEC_AES256_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_ECB_CBC_OFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256GCM.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES256GCM.GCMH0, + XLR_SEC_AES256_KEY_LENGTH); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__F9: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__F9 \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4F9.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR_CIPHER_ARC4__F9__STATE: + DPRINT("VECTOR: XLR_SEC_VECTOR_CIPHER_ARC4__F9__STATE \n"); + print_buf("ARC4 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateF9.cipherKey0, + GET_FIELD(word, CTL_DSC_ARC4_KEYLEN)); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoARC4StateF9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR_F9: + DPRINT("VECTOR: XLR_SEC_VECTOR_F9 \n"); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoF9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_DES__F9__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_DES__F9__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoDESF9.cipherKey0, + XLR_SEC_DES_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoDESF9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_3DES__F9__MODE_ECB_CBC: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_3DES__F9__MODE_ECB_CBC \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.info3DESF9.cipherKey0, + XLR_SEC_3DES_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.info3DESF9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F9.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F9.cipherKey0, + XLR_SEC_AES128_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F9.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_ECB_CBC_OFB\n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F9.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_CTR_CFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_CTR_CFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F9.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_ECB_CBC_OFB: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_ECB_CBC_OFB \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F9.cipherKey0, + XLR_SEC_AES256_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8HMAC.cipherKey0, + XLR_SEC_AES128F8_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8.cipherKey0, + XLR_SEC_AES128F8_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8HMAC.cipherKey0, + XLR_SEC_AES192F8_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8.cipherKey0, + XLR_SEC_AES192F8_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8HMAC.cipherKey0, + XLR_SEC_AES256F8_KEY_LENGTH); + print_buf("HMAC Key", + &desc->ctl_desc.cipherHashInfo.infoAES256HMAC.hmacKey0, + sizeof(HMAC_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8.cipherKey0, + XLR_SEC_AES256F8_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8HMAC2.cipherKey0, + XLR_SEC_AES128F8_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8HMAC2.cipherKey0, + XLR_SEC_AES192F8_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8HMAC2.cipherKey0, + XLR_SEC_AES256F8_KEY_LENGTH); + print_buf("HMAC2 Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8HMAC2.hmacKey0, + sizeof(HMAC2_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8GCM.cipherKey0, + XLR_SEC_AES128F8_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES128GCM.GCMH0, + XLR_SEC_AES128_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8GCM.cipherKey0, + XLR_SEC_AES192_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8GCM.GCMH0, + XLR_SEC_AES192_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8GCM.cipherKey0, + XLR_SEC_AES256F8_KEY_LENGTH); + print_buf("GCM Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8GCM.GCMH0, + XLR_SEC_AES256_KEY_LENGTH); + break; + case XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8F9.cipherKey0, + XLR_SEC_AES128F8_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES128F8F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8F9.cipherKey0, + XLR_SEC_AES192F8_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES192F8F9.authKey0, + sizeof(F9_t)); + break; + case XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_F8: + DPRINT("VECTOR: XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_F8 \n"); + print_buf("CIPHER Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8F9.cipherKey0, + XLR_SEC_AES256F8_KEY_LENGTH); + print_buf("F9 Key", + &desc->ctl_desc.cipherHashInfo.infoAES256F8F9.authKey0, + sizeof(F9_t)); + break; + + default: + DPRINT("VECTOR: ???? \n"); + DPRINT(">>> WHAT THE HECK !!! <<< \n"); + break; + } + DPRINT("PACKET DESCRIPTOR: \n"); + word = desc->pkt_desc.srcLengthIVOffUseIVNext; + DPRINT("\tSrcLengthIVOffsetIVNext: %llx\n", word); + DPRINT("\t\tLoad HMAC = %lld \n", + GET_FIELD(word, PKT_DSC_LOADHMACKEY)); + DPRINT("\t\tPad Hash = %lld \n", + GET_FIELD(word, PKT_DSC_PADHASH)); + DPRINT("\t\tHash Byte Count = %lld \n", + GET_FIELD(word, PKT_DSC_HASHBYTES)); + DPRINT("\t\tNext = %lld \n", + GET_FIELD(word, PKT_DSC_NEXT)); + DPRINT("\t\tUse IV = %lld \n", + GET_FIELD(word, PKT_DSC_IV)); + DPRINT("\t\tIV Offset = %lld \n", + GET_FIELD(word, PKT_DSC_IVOFF)); + DPRINT("\t\tPacket Length = %lld \n", + GET_FIELD(word, PKT_DSC_PKTLEN)); + DPRINT("\t\tNLHMAC = %lld \n", GET_FIELD(word, PKT_DSC_NLHMAC)); + DPRINT("\t\tBreak = %lld \n", GET_FIELD(word, PKT_DSC_BREAK)); + DPRINT("\t\tWait = %lld \n", GET_FIELD(word, PKT_DSC_WAIT)); + DPRINT("\t\tSegment Src Addr = %llx \n", + (GET_FIELD(word, PKT_DSC_SEGADDR) << 5) & 0xffffffffffULL); + DPRINT("\t\tSRTCP = %lld \n", GET_FIELD(word, PKT_DSC_SRTCP)); + DPRINT("\t\tGlobal Src Offset = %lld \n", + GET_FIELD(word, PKT_DSC_SEGOFFSET)); + + word = desc->pkt_desc.dstDataSettings; + DPRINT("\tdstDataSettings: %llx \n", word); + DPRINT("\t\tArc4 Byte Count = %lld \n", GET_FIELD(word, + PKT_DSC_ARC4BYTECOUNT)); + DPRINT("\t\tSym Operation = %lld \n", GET_FIELD(word, PKT_DSC_SYM_OP)); + DPRINT("\t\tCipher Offset = %lld \n", GET_FIELD(word, PKT_DSC_CPHROFF)); + DPRINT("\t\tHash Offset = %lld \n", GET_FIELD(word, PKT_DSC_HASHOFF)); + DPRINT("\t\tHash Source = %lld \n", GET_FIELD(word, PKT_DSC_HASHSRC)); + DPRINT("\t\tChecksum Offset = %lld \n", GET_FIELD(word, + PKT_DSC_CKSUMOFF)); + DPRINT("\t\tChecksum Source = %lld \n", GET_FIELD(word, + PKT_DSC_CKSUMSRC)); + DPRINT("\t\tCipher Dest Addr = %llx \n", GET_FIELD(word, + PKT_DSC_CPHR_DST_ADDR)); + DPRINT("\t\tCipher Dest Dword = %lld \n", GET_FIELD(word, + PKT_DSC_CPHR_DST_DWOFFSET)); + DPRINT("\t\tCipher Dest Offset= %lld \n", GET_FIELD(word, + PKT_DSC_CPHR_DST_OFFSET)); + word = desc->pkt_desc.authDstNonceLow; + DPRINT("\tauthDstNonceLow: %llx \n", word); + DPRINT("\t\tNonce Low 24 = %lld \n", GET_FIELD(word, + PKT_DSC_NONCE_LOW)); + DPRINT("\t\tauthDst = %llx \n", GET_FIELD(word, + PKT_DSC_AUTH_DST_ADDR)); + DPRINT("\t\tCipher Offset High= %lld \n", GET_FIELD(word, + PKT_DSC_CIPH_OFF_HI)); + word = desc->pkt_desc.ckSumDstNonceHiCFBMaskLLWMask; + DPRINT("\tckSumDstNonceHiCFBMaskLLWMask: %llx \n", word); + DPRINT("\t\tHash Byte off = %lld \n", GET_FIELD(word, PKT_DSC_HASH_BYTE_OFF)); + DPRINT("\t\tPacket Len bytes = %lld \n", GET_FIELD(word, PKT_DSC_PKTLEN_BYTES)); + DPRINT("\t\tLast Long Word Mask = %lld \n", GET_FIELD(word, + PKT_DSC_LASTWORD)); + DPRINT("\t\tCipher Dst Address = %llx \n", GET_FIELD(word, + PKT_DSC_CPHR_DST_ADDR)); + DPRINT("\t\tGlobal Dst Offset = %lld \n", GET_FIELD(word, + PKT_DSC_CPHR_DST_OFFSET)); + + DPRINT("CFG_VECTOR = %04x\n", cfg_vector); + DPRINT("\n\n"); +} + +#endif + + + +/* This function is called from an interrupt handler */ +void +xlr_sec_msgring_handler(int bucket, int size, int code, int stid, + struct msgrng_msg *msg, void *data) +{ + uint64_t error; + uint64_t addr, sec_eng, sec_pipe; + xlr_sec_io_pt op = NULL; + symkey_desc_pt desc = NULL; + struct xlr_sec_session *ses = NULL; + struct xlr_sec_command *cmd = NULL; + + + if (code != MSGRNG_CODE_SEC) { + panic("xlr_sec_msgring_handler: bad code = %d," + " expected code = %d\n", + code, MSGRNG_CODE_SEC); + } + if ((stid < MSGRNG_STNID_SEC0) || (stid > MSGRNG_STNID_PK0)) { + panic("xlr_sec_msgring_handler: bad stn id = %d, expect %d - %d\n", + stid, MSGRNG_STNID_SEC0, MSGRNG_STNID_PK0); + } + /* + * The Submit() operation encodes the engine and pipe in these two + * separate fields. This allows use to verify the result type with + * the submitted operation type. + */ + sec_eng = GET_FIELD(msg->msg0, MSG_CTL_OP_TYPE); + sec_pipe = GET_FIELD(msg->msg1, MSG_CTL_OP_TYPE); + + + error = msg->msg0 >> 40 & 0x1ff; + if (error) + printf("ctrl error = 0x%llx\n", error); + error = msg->msg1 >> 40 & 0x1ff; + if (error) + printf("data error = 0x%llx\n", error); + + + XLR_SEC_CMD_DIAG("[%s]: eng=%lld pipe=%lld\n", + __FUNCTION__, sec_eng, sec_pipe); + + /* Symmetric Key Operation ? */ + if (sec_eng == MSG0_CTL_OP_ENGINE_SYMKEY) { + + /* + * The data descriptor address allows us to associate the + * response with the submitted operation. Address is 40-bit + * cacheline aligned address. We need to zero bit 0-4 since + * they are used for the engine and pipe Id. + */ + addr = GET_FIELD(msg->msg1, MSG_RSLT_DATA_DSC_ADDR); + + addr = addr & ~((1 << 5) - 1); + if (!addr) { + panic("[%s:STNID_SEC]: NULL symkey addr!\n", __FUNCTION__); + + } + /* + * The adddress points to the data descriptor. The operation + * descriptor is defined with the 32-byte cacheline size in + * mind. It allows the code to use this address to + * reference the symkey descriptor. (ref: xlr_sec_desc.h) + */ + addr = addr - sizeof(OperationDescriptor_t); + desc = (symkey_desc_pt) MIPS_PHYS_TO_KSEG0(addr); + + if (!desc) { + printf("\nerror : not getting desc back correctly \n"); + panic("[%s:STNID_SEC]: NULL symkey data descriptor!\n", __FUNCTION__); + } + ses = (struct xlr_sec_session *)desc->ses; + if (!ses) { + printf("\n error : not getting ses back correctly \n"); + panic("[%s:STNID_SEC]: NULL symkey data descriptor!\n", __FUNCTION__); + } + cmd = &ses->cmd; + if (!cmd) { + printf("\n error : not getting cmd back correctly \n"); + panic("[%s:STNID_SEC]: NULL symkey data descriptor!\n", __FUNCTION__); + } + op = &cmd->op; + if (!op) { + printf("\n error : not getting op back correctly \n"); + panic("[%s:STNID_SEC]: NULL symkey data descriptor!\n", __FUNCTION__); + } + XLR_SEC_CMD_DIAG("[%s:STNID_SEC]: addr=0x%llx desc=%p alloc=%p \n", + __FUNCTION__, addr, desc, desc->alloc); + + XLR_SEC_CMD_DIAG("[%s:STNID_SEC]: op_ctl=%p phys_self=%llx stn_id=%d \n", + __FUNCTION__, &desc->op_ctl, desc->op_ctl.phys_self, + desc->op_ctl.stn_id); + + if (addr != desc->op_ctl.phys_self) { + XLR_SEC_CMD_DIAG("[%s:STNID_SEC]: Control Descriptor fails Self-Verify !\n", + __FUNCTION__); + printf("[%s:STNID_SEC]: Control Descriptor fails Self-Verify !\n", + __FUNCTION__); + printf("[%s:STNID_SEC]: addr=0x%llx desc=%p alloc=%p \n", + __FUNCTION__, (unsigned long long)addr, desc, desc->alloc); + printf("[%s:STNID_SEC]: op_ctl=%p phys_self=%llx stn_id=%d \n", + __FUNCTION__, &desc->op_ctl, (unsigned long long)desc->op_ctl.phys_self, + desc->op_ctl.stn_id); + + } + if (desc->op_ctl.stn_id != MSGRNG_STNID_SEC0 && + desc->op_ctl.stn_id != MSGRNG_STNID_SEC1) { + XLR_SEC_CMD_DIAG("[%s:STNID_SEC]: Operation Type Mismatch !\n", + __FUNCTION__); + printf("[%s:STNID_SEC]: Operation Type Mismatch !\n", + __FUNCTION__); + printf("[%s:STNID_SEC]: addr=0x%llx desc=%p alloc=%p \n", + __FUNCTION__, (unsigned long long)addr, desc, desc->alloc); + printf("[%s:STNID_SEC]: op_ctl=%p phys_self=%llx stn_id=%d \n", + __FUNCTION__, &desc->op_ctl, (unsigned long long)desc->op_ctl.phys_self, + desc->op_ctl.stn_id); + } + desc->ctl_result = GET_FIELD(msg->msg0, MSG_RSLT_CTL_INST_ERR); + desc->data_result = GET_FIELD(msg->msg1, MSG_RSLT_DATA_INST_ERR); + + XLR_SEC_CMD_DIAG("[%s:STNID_SEC]: cpu=%d ctl_result=0x%llx data_result=%llx\n", + __FUNCTION__, desc->op_ctl.cpu, + desc->ctl_result, desc->data_result); + + } +#if 0 + else if (sec_eng == MSG0_CTL_OP_ENGINE_PUBKEY) { + pubkey_desc_pt desc; + + if (sec_pipe != MSG1_CTL_OP_PUBKEY_PIPE0) { + /* response to uc load */ + /* + * XLR_SEC_CMD_DIAG("[%s:STNID_SEC]: ecc cpu=%d + * ctl_result=0x%llx data_result=%llx\n", + * __FUNCTION__, desc->op_ctl.cpu, desc->ctl_result, + * desc->data_result); + */ + return; + } + /* + * The data descriptor address allows us to associate the + * response with the submitted operation. Address is 40-bit + * cacheline aligned address. We need to zero bit 0-4 since + * they are used for the engine and pipe Id. + */ + addr = GET_FIELD(msg->msg0, PUBKEY_RSLT_CTL_SRCADDR); + addr = addr & ~((1 << 5) - 1); + if (!addr) { + panic("[%s:STNID_SEC]: NULL pubkey ctrl desc!\n", __FUNCTION__); + } + /* + * The adddress points to the data descriptor. The operation + * descriptor is defined with the 32-byte cacheline size in + * mind. It allows the code to use this address to + * reference the symkey descriptor. (ref: xlr_sec_desc.h) + */ + addr = addr - sizeof(OperationDescriptor_t); + + /* Get pointer to pubkey Descriptor */ + desc = (pubkey_desc_pt) (unsigned long)addr; + if (!desc) { + panic("[%s:STNID_SEC]: NULL pubkey data descriptor!\n", __FUNCTION__); + } + XLR_SEC_CMD_DIAG("[%s:STNID_PK0]: addr=0x%llx desc=%p alloc=%p \n", + __FUNCTION__, addr, desc, desc->alloc); + + XLR_SEC_CMD_DIAG("[%s:STNID_PK0]: op_ctl=%p phys_self=%llx stn_id=%d \n", + __FUNCTION__, &desc->op_ctl, desc->op_ctl.phys_self, + desc->op_ctl.stn_id); + + if (addr != desc->op_ctl.phys_self) { + XLR_SEC_CMD_DIAG("[%s:STNID_PK0]: Control Descriptor fails Self-Verify !\n", + __FUNCTION__); + } + if (desc->op_ctl.stn_id != msgrng_stnid_pk0) { + XLR_SEC_CMD_DIAG("[%s:STNID_PK0]: Operation Type Mismatch ! \n", + __FUNCTION__); + } + desc->ctl_result = GET_FIELD(msg->msg0, PUBKEY_RSLT_CTL_ERROR); + desc->data_result = GET_FIELD(msg->msg1, PUBKEY_RSLT_DATA_ERROR); + + XLR_SEC_CMD_DIAG("[%s:STNID_PK0]: ctl_result=0x%llx data_result=%llx\n", + __FUNCTION__, desc->ctl_result, desc->data_result); + + } +#endif + else { + printf("[%s]: HANDLER bad id = %d\n", __FUNCTION__, stid); + } +#ifdef RMI_SEC_DEBUG + if (ses->multi_frag_flag) { + int i; + char *ptr; + + printf("\n RETURNED DATA: \n"); + + ptr = (char *)(unsigned long)(desc->user.aligned_dest + cmd->op.cipher_offset); + for (i = 0; i < SEC_MAX_FRAG_LEN; i++) { + printf("%c ", (char)*ptr++); + if ((i % 10) == 0) + printf("\n"); + } + + printf("second desc\n"); + ptr = (char *)(unsigned long)(desc->next_dest_buf); + for (i = 0; i < desc->next_src_len; i++) { + printf("%c ", (char)*ptr++); + if ((i % 10) == 0) + printf("\n"); + } + } +#endif + + + /* Copy cipher-data to User-space */ + if (op->cipher_type != XLR_SEC_CIPHER_TYPE_NONE) { + + size = op->dest_buf_size; + + /* DEBUG -dpk */ + XLR_SEC_CMD_DIAG("cipher: to_addr=%p from_addr=%p size=%d \n", + desc->user.user_dest, desc->user.aligned_dest, size); + + if (ses->multi_frag_flag) { + crypto_copyback(cmd->crp->crp_flags, cmd->crp->crp_buf, 0, + SEC_MAX_FRAG_LEN, (caddr_t)(long)desc->user.aligned_dest + op->cipher_offset); + crypto_copyback(cmd->crp->crp_flags, cmd->crp->crp_buf + SEC_MAX_FRAG_LEN, 0, + desc->next_src_len, (caddr_t)(long)desc->next_dest_buf); + crypto_done(cmd->crp); + } else { + crypto_copyback(cmd->crp->crp_flags, cmd->crp->crp_buf, 0, + cmd->op.dest_buf_size, (caddr_t)(long)desc->user.aligned_dest + op->cipher_offset); + crypto_done(cmd->crp); + + } + + + } + /* Copy digest to User-space */ + if (op->digest_type != XLR_SEC_DIGEST_TYPE_NONE) { + + int offset = 0; + + switch (op->digest_type) { + case XLR_SEC_DIGEST_TYPE_MD5: + size = XLR_SEC_MD5_LENGTH; + break; + case XLR_SEC_DIGEST_TYPE_SHA1: + size = XLR_SEC_SHA1_LENGTH; + break; + case XLR_SEC_DIGEST_TYPE_SHA256: + size = XLR_SEC_SHA256_LENGTH; + break; + case XLR_SEC_DIGEST_TYPE_SHA384: + size = XLR_SEC_SHA384_LENGTH; + break; + case XLR_SEC_DIGEST_TYPE_SHA512: + size = XLR_SEC_SHA512_LENGTH; + break; + case XLR_SEC_DIGEST_TYPE_GCM: + size = XLR_SEC_GCM_LENGTH; + break; + case XLR_SEC_DIGEST_TYPE_KASUMI_F9: + offset = 4; + size = XLR_SEC_KASUMI_F9_RESULT_LENGTH; + break; + default: + size = 0; + } + + XLR_SEC_CMD_DIAG("digest: to_addr=%p from_addr=%p size=%d \n", + desc->user.user_auth, desc->user.aligned_auth, size); + memcpy(desc->user.user_auth, desc->user.aligned_auth + offset, size); + op->auth_dest = (uint64_t) (unsigned long)desc->user.user_auth; + } + if (op->cipher_type == XLR_SEC_CIPHER_TYPE_ARC4 && + op->rc4_savestate) { + + size = XLR_SEC_MAX_RC4_STATE_SIZE; + + XLR_SEC_CMD_DIAG("state: to_addr=%p from_addr=%p size=%d \n", + desc->user.user_state, desc->user.aligned_state, size); + op->rc4_state = (uint64_t) (unsigned long)desc->user.user_state; + } + return; +} diff --git a/sys/mips/rmi/dev/sec/rmilib.h b/sys/mips/rmi/dev/sec/rmilib.h new file mode 100644 index 000000000000..1f65c885c102 --- /dev/null +++ b/sys/mips/rmi/dev/sec/rmilib.h @@ -0,0 +1,1001 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD + */ + +#ifndef _RMILIB_H_ +#define _RMILIB_H_ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +/*#define XLR_SEC_CMD_DEBUG*/ + +#ifdef XLR_SEC_CMD_DEBUG +#define DPRINT printf +#define XLR_SEC_CMD_DIAG(fmt, args...) { \ + DPRINT(fmt, ##args); \ + } +#define XLR_SEC_CMD_DIAG_SYM_DESC(desc, vec) { \ + decode_symkey_desc ((desc), (vec)); \ + } +#else +#define DPRINT(fmt, args...) +#define XLR_SEC_CMD_DIAG(fmt, args...) +#define XLR_SEC_CMD_DIAG_SYM_DESC(desc, vec) +#endif + + + + + + +/* +#include + +#define OS_ALLOC_KERNEL(size) kmalloc((size), GFP_KERNEL) +#define virt_to_phys(x) vtophys((vm_offset_t)(x)) +*/ +/* + * Cryptographic parameter definitions + */ +#define XLR_SEC_DES_KEY_LENGTH 8 /* Bytes */ +#define XLR_SEC_3DES_KEY_LENGTH 24 /* Bytes */ +#define XLR_SEC_AES128_KEY_LENGTH 16 /* Bytes */ +#define XLR_SEC_AES192_KEY_LENGTH 24 /* Bytes */ +#define XLR_SEC_AES256_KEY_LENGTH 32 /* Bytes */ +#define XLR_SEC_AES128F8_KEY_LENGTH 32 /* Bytes */ +#define XLR_SEC_AES192F8_KEY_LENGTH 48 /* Bytes */ +#define XLR_SEC_AES256F8_KEY_LENGTH 64 /* Bytes */ +#define XLR_SEC_KASUMI_F8_KEY_LENGTH 16 /* Bytes */ +#define XLR_SEC_MAX_CRYPT_KEY_LENGTH XLR_SEC_AES256F8_KEY_LENGTH + + +#define XLR_SEC_DES_IV_LENGTH 8 /* Bytes */ +#define XLR_SEC_AES_IV_LENGTH 16 /* Bytes */ +#define XLR_SEC_ARC4_IV_LENGTH 0 /* Bytes */ +#define XLR_SEC_KASUMI_F8_IV_LENGTH 16 /* Bytes */ +#define XLR_SEC_MAX_IV_LENGTH 16 /* Bytes */ +#define XLR_SEC_IV_LENGTH_BYTES 8 /* Bytes */ + +#define XLR_SEC_AES_BLOCK_SIZE 16 /* Bytes */ +#define XLR_SEC_DES_BLOCK_SIZE 8 /* Bytes */ +#define XLR_SEC_3DES_BLOCK_SIZE 8 /* Bytes */ + +#define XLR_SEC_MD5_BLOCK_SIZE 64 /* Bytes */ +#define XLR_SEC_SHA1_BLOCK_SIZE 64 /* Bytes */ +#define XLR_SEC_SHA256_BLOCK_SIZE 64 /* Bytes */ +#define XLR_SEC_SHA384_BLOCK_SIZE 128 /* Bytes */ +#define XLR_SEC_SHA512_BLOCK_SIZE 128 /* Bytes */ +#define XLR_SEC_GCM_BLOCK_SIZE 16 /* XXX: Bytes */ +#define XLR_SEC_KASUMI_F9_BLOCK_SIZE 16 /* XXX: Bytes */ +#define XLR_SEC_MAX_BLOCK_SIZE 64 /* Max of MD5/SHA */ +#define XLR_SEC_MD5_LENGTH 16 /* Bytes */ +#define XLR_SEC_SHA1_LENGTH 20 /* Bytes */ +#define XLR_SEC_SHA256_LENGTH 32 /* Bytes */ +#define XLR_SEC_SHA384_LENGTH 64 /* Bytes */ +#define XLR_SEC_SHA512_LENGTH 64 /* Bytes */ +#define XLR_SEC_GCM_LENGTH 16 /* Bytes */ +#define XLR_SEC_KASUMI_F9_LENGTH 16 /* Bytes */ +#define XLR_SEC_KASUMI_F9_RESULT_LENGTH 4 /* Bytes */ +#define XLR_SEC_HMAC_LENGTH 64 /* Max of MD5/SHA/SHA256 */ +#define XLR_SEC_MAX_AUTH_KEY_LENGTH XLR_SEC_SHA512_BLOCK_SIZE +#define XLR_SEC_MAX_RC4_STATE_SIZE 264 /* char s[256], int i, int j */ + +/* Status code is used by the SRL to indicate status */ +typedef unsigned int xlr_sec_status_t; + +/* + * Status codes + */ +#define XLR_SEC_STATUS_SUCCESS 0 +#define XLR_SEC_STATUS_NO_DEVICE -1 +#define XLR_SEC_STATUS_TIMEOUT -2 +#define XLR_SEC_STATUS_INVALID_PARAMETER -3 +#define XLR_SEC_STATUS_DEVICE_FAILED -4 +#define XLR_SEC_STATUS_DEVICE_BUSY -5 +#define XLR_SEC_STATUS_NO_RESOURCE -6 +#define XLR_SEC_STATUS_CANCELLED -7 + +/* + * Flags + */ +#define XLR_SEC_FLAGS_HIGH_PRIORITY 1 + +/* Error code is used to indicate any errors */ +typedef int xlr_sec_error_t; + +/* + */ +#define XLR_SEC_ERR_NONE 0 +#define XLR_SEC_ERR_CIPHER_OP -1 +#define XLR_SEC_ERR_CIPHER_TYPE -2 +#define XLR_SEC_ERR_CIPHER_MODE -3 +#define XLR_SEC_ERR_CIPHER_INIT -4 +#define XLR_SEC_ERR_DIGEST_TYPE -5 +#define XLR_SEC_ERR_DIGEST_INIT -6 +#define XLR_SEC_ERR_DIGEST_SRC -7 +#define XLR_SEC_ERR_CKSUM_TYPE -8 +#define XLR_SEC_ERR_CKSUM_SRC -9 +#define XLR_SEC_ERR_ALLOC -10 +#define XLR_SEC_ERR_CONTROL_VECTOR -11 +#define XLR_SEC_ERR_LOADHMACKEY_MODE -12 +#define XLR_SEC_ERR_PADHASH_MODE -13 +#define XLR_SEC_ERR_HASHBYTES_MODE -14 +#define XLR_SEC_ERR_NEXT_MODE -15 +#define XLR_SEC_ERR_PKT_IV_MODE -16 +#define XLR_SEC_ERR_LASTWORD_MODE -17 +#define XLR_SEC_ERR_PUBKEY_OP -18 +#define XLR_SEC_ERR_SYMKEY_MSGSND -19 +#define XLR_SEC_ERR_PUBKEY_MSGSND -20 +#define XLR_SEC_ERR_SYMKEY_GETSEM -21 +#define XLR_SEC_ERR_PUBKEY_GETSEM -22 + +/* + * Descriptor Vector quantities + * (helps to identify descriptor type per operation) + */ +#define XLR_SEC_VECTOR_CIPHER_DES 0x0001 +#define XLR_SEC_VECTOR_CIPHER_3DES 0x0002 +#define XLR_SEC_VECTOR_CIPHER_AES128 0x0004 +#define XLR_SEC_VECTOR_CIPHER_AES192 0x0008 +#define XLR_SEC_VECTOR_CIPHER_AES256 0x0010 +#define XLR_SEC_VECTOR_CIPHER_ARC4 0x0020 +#define XLR_SEC_VECTOR_CIPHER_AES (XLR_SEC_VECTOR_CIPHER_AES128 | \ + XLR_SEC_VECTOR_CIPHER_AES192 | \ + XLR_SEC_VECTOR_CIPHER_AES256) +#define XLR_SEC_VECTOR_CIPHER (XLR_SEC_VECTOR_CIPHER_DES | \ + XLR_SEC_VECTOR_CIPHER_3DES | \ + XLR_SEC_VECTOR_CIPHER_AES128 | \ + XLR_SEC_VECTOR_CIPHER_AES192 | \ + XLR_SEC_VECTOR_CIPHER_AES256 | \ + XLR_SEC_VECTOR_CIPHER_ARC4) + +#define XLR_SEC_VECTOR_HMAC 0x0040 +#define XLR_SEC_VECTOR_MAC 0x0080 +#define XLR_SEC_VECTOR_MODE_CTR_CFB 0x0100 +#define XLR_SEC_VECTOR_MODE_ECB_CBC_OFB 0x0200 +#define XLR_SEC_VECTOR_MODE_ECB_CBC 0x0400 +#define XLR_SEC_VECTOR_STATE 0x0800 +#define XLR_SEC_VECTOR_CIPHER_KASUMI_F8 0x01000 +#define XLR_SEC_VECTOR_HMAC2 0x02000 +#define XLR_SEC_VECTOR_GCM 0x04000 +#define XLR_SEC_VECTOR_F9 0x08000 +#define XLR_SEC_VECTOR_MODE_F8 0x10000 + +#define XLR_SEC_VECTOR_CIPHER_ARC4__HMAC \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_HMAC) +#define XLR_SEC_VECTOR_CIPHER_ARC4__STATE \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_STATE) +#define XLR_SEC_VECTOR_CIPHER_ARC4__HMAC__STATE \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_STATE) + +#define XLR_SEC_VECTOR__CIPHER_DES__HMAC__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_DES | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_DES__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_DES | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_3DES__HMAC__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_3DES | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_3DES__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_3DES | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__HMAC__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES128__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES192__HMAC__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES192__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES256__HMAC__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_HMAC | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES256__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR_CIPHER_KASUMI_F8__F9 \ +(XLR_SEC_VECTOR_CIPHER_KASUMI_F8 | XLR_SEC_VECTOR_F9) + +#define XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC \ +(XLR_SEC_VECTOR_CIPHER_KASUMI_F8 | XLR_SEC_VECTOR_HMAC) + +#define XLR_SEC_VECTOR_CIPHER_KASUMI_F8__HMAC2 \ +(XLR_SEC_VECTOR_CIPHER_KASUMI_F8 | XLR_SEC_VECTOR_HMAC2) + +#define XLR_SEC_VECTOR_CIPHER_KASUMI_F8__GCM \ +(XLR_SEC_VECTOR_CIPHER_KASUMI_F8 | XLR_SEC_VECTOR_GCM) + +#define XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2 \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_HMAC2) + +#define XLR_SEC_VECTOR_CIPHER_ARC4__HMAC2__STATE \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_STATE) + +#define XLR_SEC_VECTOR__CIPHER_DES__HMAC2__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_DES | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_3DES__HMAC2__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_3DES | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__HMAC2__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES192__HMAC2__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES256__HMAC2__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_HMAC2 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR_CIPHER_ARC4__GCM \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_GCM) + +#define XLR_SEC_VECTOR_CIPHER_ARC4__GCM__STATE \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_STATE) + +#define XLR_SEC_VECTOR__CIPHER_DES__GCM__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_DES | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_3DES__GCM__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_3DES | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__GCM__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES192__GCM__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES256__GCM__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_GCM | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR_CIPHER_ARC4__F9 \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_F9) + +#define XLR_SEC_VECTOR_CIPHER_ARC4__F9__STATE \ +(XLR_SEC_VECTOR_CIPHER_ARC4 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_STATE) + +#define XLR_SEC_VECTOR__CIPHER_DES__F9__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_DES | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_3DES__F9__MODE_ECB_CBC \ +(XLR_SEC_VECTOR_CIPHER_3DES | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_ECB_CBC) + +#define XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_CTR_CFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_CTR_CFB) + +#define XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_ECB_CBC_OFB \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_ECB_CBC_OFB) + +#define XLR_SEC_VECTOR__CIPHER_AES128__F9__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES128 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES192__F9__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES192 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_F8) + +#define XLR_SEC_VECTOR__CIPHER_AES256__F9__MODE_F8 \ +(XLR_SEC_VECTOR_CIPHER_AES256 | XLR_SEC_VECTOR_F9 | XLR_SEC_VECTOR_MODE_F8) + +/* + * Cipher Modes + */ +typedef enum { + XLR_SEC_CIPHER_MODE_NONE = 0, + XLR_SEC_CIPHER_MODE_PASS = 1, + XLR_SEC_CIPHER_MODE_ECB, + XLR_SEC_CIPHER_MODE_CBC, + XLR_SEC_CIPHER_MODE_OFB, + XLR_SEC_CIPHER_MODE_CTR, + XLR_SEC_CIPHER_MODE_CFB, + XLR_SEC_CIPHER_MODE_F8 +} XLR_SEC_CIPHER_MODE; + +typedef enum { + XLR_SEC_CIPHER_OP_NONE = 0, + XLR_SEC_CIPHER_OP_ENCRYPT = 1, + XLR_SEC_CIPHER_OP_DECRYPT +} XLR_SEC_CIPHER_OP; + +typedef enum { + XLR_SEC_CIPHER_TYPE_UNSUPPORTED = -1, + XLR_SEC_CIPHER_TYPE_NONE = 0, + XLR_SEC_CIPHER_TYPE_DES, + XLR_SEC_CIPHER_TYPE_3DES, + XLR_SEC_CIPHER_TYPE_AES128, + XLR_SEC_CIPHER_TYPE_AES192, + XLR_SEC_CIPHER_TYPE_AES256, + XLR_SEC_CIPHER_TYPE_ARC4, + XLR_SEC_CIPHER_TYPE_KASUMI_F8 +} XLR_SEC_CIPHER_TYPE; + +typedef enum { + XLR_SEC_CIPHER_INIT_OK = 1, /* Preserve old Keys */ + XLR_SEC_CIPHER_INIT_NK /* Load new Keys */ +} XLR_SEC_CIPHER_INIT; + + +/* + * Hash Modes + */ +typedef enum { + XLR_SEC_DIGEST_TYPE_UNSUPPORTED = -1, + XLR_SEC_DIGEST_TYPE_NONE = 0, + XLR_SEC_DIGEST_TYPE_MD5, + XLR_SEC_DIGEST_TYPE_SHA1, + XLR_SEC_DIGEST_TYPE_SHA256, + XLR_SEC_DIGEST_TYPE_SHA384, + XLR_SEC_DIGEST_TYPE_SHA512, + XLR_SEC_DIGEST_TYPE_GCM, + XLR_SEC_DIGEST_TYPE_KASUMI_F9, + XLR_SEC_DIGEST_TYPE_HMAC_MD5, + XLR_SEC_DIGEST_TYPE_HMAC_SHA1, + XLR_SEC_DIGEST_TYPE_HMAC_SHA256, + XLR_SEC_DIGEST_TYPE_HMAC_SHA384, + XLR_SEC_DIGEST_TYPE_HMAC_SHA512, + XLR_SEC_DIGEST_TYPE_HMAC_AES_CBC, + XLR_SEC_DIGEST_TYPE_HMAC_AES_XCBC +} XLR_SEC_DIGEST_TYPE; + +typedef enum { + XLR_SEC_DIGEST_INIT_OLDKEY = 1, /* Preserve old key HMAC key stored in + * ID registers (moot if HASH.HMAC == + * 0) */ + XLR_SEC_DIGEST_INIT_NEWKEY /* Load new HMAC key from memory ctrl + * section to ID registers */ +} XLR_SEC_DIGEST_INIT; + +typedef enum { + XLR_SEC_DIGEST_SRC_DMA = 1, /* DMA channel */ + XLR_SEC_DIGEST_SRC_CPHR /* Cipher if word count exceeded + * Cipher_Offset; else DMA */ +} XLR_SEC_DIGEST_SRC; + +/* + * Checksum Modes + */ +typedef enum { + XLR_SEC_CKSUM_TYPE_NOP = 1, + XLR_SEC_CKSUM_TYPE_IP +} XLR_SEC_CKSUM_TYPE; + +typedef enum { + XLR_SEC_CKSUM_SRC_DMA = 1, + XLR_SEC_CKSUM_SRC_CIPHER +} XLR_SEC_CKSUM_SRC; + +/* + * Packet Modes + */ +typedef enum { + XLR_SEC_LOADHMACKEY_MODE_OLD = 1, + XLR_SEC_LOADHMACKEY_MODE_LOAD +} XLR_SEC_LOADHMACKEY_MODE; + +typedef enum { + XLR_SEC_PADHASH_PADDED = 1, + XLR_SEC_PADHASH_PAD +} XLR_SEC_PADHASH_MODE; + +typedef enum { + XLR_SEC_HASHBYTES_ALL8 = 1, + XLR_SEC_HASHBYTES_MSB, + XLR_SEC_HASHBYTES_MSW +} XLR_SEC_HASHBYTES_MODE; + +typedef enum { + XLR_SEC_NEXT_FINISH = 1, + XLR_SEC_NEXT_DO +} XLR_SEC_NEXT_MODE; + +typedef enum { + XLR_SEC_PKT_IV_OLD = 1, + XLR_SEC_PKT_IV_NEW +} XLR_SEC_PKT_IV_MODE; + +typedef enum { + XLR_SEC_LASTWORD_128 = 1, + XLR_SEC_LASTWORD_96MASK, + XLR_SEC_LASTWORD_64MASK, + XLR_SEC_LASTWORD_32MASK +} XLR_SEC_LASTWORD_MODE; + +typedef enum { + XLR_SEC_CFB_MASK_REGULAR_CTR = 0, + XLR_SEC_CFB_MASK_CCMP, + XLR_SEC_CFB_MASK_GCM_WITH_SCI, + XLR_SEC_CFB_MASK_GCM_WITHOUT_SCI +} XLR_SEC_CFB_MASK_MODE; + +/* + * Public Key + */ +typedef enum { + RMIPK_BLKWIDTH_512 = 1, + RMIPK_BLKWIDTH_1024 +} RMIPK_BLKWIDTH_MODE; + +typedef enum { + RMIPK_LDCONST_OLD = 1, + RMIPK_LDCONST_NEW +} RMIPK_LDCONST_MODE; + + +typedef struct xlr_sec_io_s { + unsigned int command; + unsigned int result_status; + unsigned int flags; + unsigned int session_num; + unsigned int use_callback; + unsigned int time_us; + unsigned int user_context[2]; /* usable for anything by caller */ + unsigned int command_context; /* Context (ID) of this command). */ + unsigned char initial_vector[XLR_SEC_MAX_IV_LENGTH]; + unsigned char crypt_key[XLR_SEC_MAX_CRYPT_KEY_LENGTH]; + unsigned char mac_key[XLR_SEC_MAX_AUTH_KEY_LENGTH]; + + XLR_SEC_CIPHER_OP cipher_op; + XLR_SEC_CIPHER_MODE cipher_mode; + XLR_SEC_CIPHER_TYPE cipher_type; + XLR_SEC_CIPHER_INIT cipher_init; + unsigned int cipher_offset; + + XLR_SEC_DIGEST_TYPE digest_type; + XLR_SEC_DIGEST_INIT digest_init; + XLR_SEC_DIGEST_SRC digest_src; + unsigned int digest_offset; + + XLR_SEC_CKSUM_TYPE cksum_type; + XLR_SEC_CKSUM_SRC cksum_src; + unsigned int cksum_offset; + + XLR_SEC_LOADHMACKEY_MODE pkt_hmac; + XLR_SEC_PADHASH_MODE pkt_hash; + XLR_SEC_HASHBYTES_MODE pkt_hashbytes; + XLR_SEC_NEXT_MODE pkt_next; + XLR_SEC_PKT_IV_MODE pkt_iv; + XLR_SEC_LASTWORD_MODE pkt_lastword; + + unsigned int nonce; + unsigned int cfb_mask; + + unsigned int iv_offset; + unsigned short pad_type; + unsigned short rc4_key_len; + + unsigned int num_packets; + unsigned int num_fragments; + + uint64_t source_buf; + unsigned int source_buf_size; + uint64_t dest_buf; + unsigned int dest_buf_size; + + uint64_t auth_dest; + uint64_t cksum_dest; + + unsigned short rc4_loadstate; + unsigned short rc4_savestate; + uint64_t rc4_state; + +} xlr_sec_io_t, *xlr_sec_io_pt; + + +#define XLR_SEC_SESSION(sid) ((sid) & 0x000007ff) +#define XLR_SEC_SID(crd,ses) (((crd) << 28) | ((ses) & 0x7ff)) + +/* + * Length values for cryptography + */ +/* +#define XLR_SEC_DES_KEY_LENGTH 8 +#define XLR_SEC_3DES_KEY_LENGTH 24 +#define XLR_SEC_MAX_CRYPT_KEY_LENGTH XLR_SEC_3DES_KEY_LENGTH +#define XLR_SEC_IV_LENGTH 8 +#define XLR_SEC_AES_IV_LENGTH 16 +#define XLR_SEC_MAX_IV_LENGTH XLR_SEC_AES_IV_LENGTH +*/ + +#define SEC_MAX_FRAG_LEN 16000 + +struct xlr_sec_command { + uint16_t session_num; + struct cryptop *crp; + struct cryptodesc *enccrd, *maccrd; + + xlr_sec_io_t op; +}; +struct xlr_sec_session { + uint32_t sessionid; + int hs_used; + int hs_mlen; + struct xlr_sec_command cmd; + void *desc_ptr; + uint8_t multi_frag_flag; +}; + +/* + * Holds data specific to rmi security accelerators + */ +struct xlr_sec_softc { + device_t sc_dev; /* device backpointer */ + struct mtx sc_mtx; /* per-instance lock */ + + int32_t sc_cid; + struct xlr_sec_session *sc_sessions; + int sc_nsessions; + xlr_reg_t *mmio; +}; + + +/* + +union xlr_sec_operand_t { + struct mbuf *m; + struct uio *io; + void *buf; +}xlr_sec_operand; +*/ + + + + + +/* this is passed to packet setup to optimize */ +#define XLR_SEC_SETUP_OP_CIPHER 0x00000001 +#define XLR_SEC_SETUP_OP_HMAC 0x00000002 +#define XLR_SEC_SETUP_OP_CIPHER_HMAC (XLR_SEC_SETUP_OP_CIPHER | XLR_SEC_SETUP_OP_HMAC) +/* this is passed to control_setup to update w/preserving existing keys */ +#define XLR_SEC_SETUP_OP_PRESERVE_HMAC_KEY 0x80000000 +#define XLR_SEC_SETUP_OP_PRESERVE_CIPHER_KEY 0x40000000 +#define XLR_SEC_SETUP_OP_UPDATE_KEYS 0x00000010 +#define XLR_SEC_SETUP_OP_FLIP_3DES_KEY 0x00000020 + + + + + +/* + * Message Ring Specifics + */ + +#define SEC_MSGRING_WORDSIZE 2 + + +/* + * + * + * rwR 31 30 29 27 26 24 23 21 20 18 + * | NA | RSA0Out | Rsa0In | Pipe3Out | Pipe3In | ... + * + * 17 15 14 12 11 9 8 6 5 3 2 0 + * | Pipe2Out | Pipe2In | Pipe1In | Pipe1In | Pipe0Out | Pipe0In | + * + * DMA CREDIT REG - + * NUMBER OF CREDITS PER PIPE + */ + +#define SEC_DMA_CREDIT_RSA0_OUT_FOUR 0x20000000 +#define SEC_DMA_CREDIT_RSA0_OUT_TWO 0x10000000 +#define SEC_DMA_CREDIT_RSA0_OUT_ONE 0x08000000 + +#define SEC_DMA_CREDIT_RSA0_IN_FOUR 0x04000000 +#define SEC_DMA_CREDIT_RSA0_IN_TWO 0x02000000 +#define SEC_DMA_CREDIT_RSA0_IN_ONE 0x01000000 + +#define SEC_DMA_CREDIT_PIPE3_OUT_FOUR 0x00800000 +#define SEC_DMA_CREDIT_PIPE3_OUT_TWO 0x00400000 +#define SEC_DMA_CREDIT_PIPE3_OUT_ONE 0x00200000 + +#define SEC_DMA_CREDIT_PIPE3_IN_FOUR 0x00100000 +#define SEC_DMA_CREDIT_PIPE3_IN_TWO 0x00080000 +#define SEC_DMA_CREDIT_PIPE3_IN_ONE 0x00040000 + +#define SEC_DMA_CREDIT_PIPE2_OUT_FOUR 0x00020000 +#define SEC_DMA_CREDIT_PIPE2_OUT_TWO 0x00010000 +#define SEC_DMA_CREDIT_PIPE2_OUT_ONE 0x00008000 + +#define SEC_DMA_CREDIT_PIPE2_IN_FOUR 0x00004000 +#define SEC_DMA_CREDIT_PIPE2_IN_TWO 0x00002000 +#define SEC_DMA_CREDIT_PIPE2_IN_ONE 0x00001000 + +#define SEC_DMA_CREDIT_PIPE1_OUT_FOUR 0x00000800 +#define SEC_DMA_CREDIT_PIPE1_OUT_TWO 0x00000400 +#define SEC_DMA_CREDIT_PIPE1_OUT_ONE 0x00000200 + +#define SEC_DMA_CREDIT_PIPE1_IN_FOUR 0x00000100 +#define SEC_DMA_CREDIT_PIPE1_IN_TWO 0x00000080 +#define SEC_DMA_CREDIT_PIPE1_IN_ONE 0x00000040 + +#define SEC_DMA_CREDIT_PIPE0_OUT_FOUR 0x00000020 +#define SEC_DMA_CREDIT_PIPE0_OUT_TWO 0x00000010 +#define SEC_DMA_CREDIT_PIPE0_OUT_ONE 0x00000008 + +#define SEC_DMA_CREDIT_PIPE0_IN_FOUR 0x00000004 +#define SEC_DMA_CREDIT_PIPE0_IN_TWO 0x00000002 +#define SEC_DMA_CREDIT_PIPE0_IN_ONE 0x00000001 + + +/* + * Currently, FOUR credits per PIPE + * 0x24924924 + */ +#define SEC_DMA_CREDIT_CONFIG SEC_DMA_CREDIT_RSA0_OUT_FOUR | \ + SEC_DMA_CREDIT_RSA0_IN_FOUR | \ + SEC_DMA_CREDIT_PIPE3_OUT_FOUR | \ + SEC_DMA_CREDIT_PIPE3_IN_FOUR | \ + SEC_DMA_CREDIT_PIPE2_OUT_FOUR | \ + SEC_DMA_CREDIT_PIPE2_IN_FOUR | \ + SEC_DMA_CREDIT_PIPE1_OUT_FOUR | \ + SEC_DMA_CREDIT_PIPE1_IN_FOUR | \ + SEC_DMA_CREDIT_PIPE0_OUT_FOUR | \ + SEC_DMA_CREDIT_PIPE0_IN_FOUR + + + + +/* + * CONFIG2 + * 31 5 4 3 + * | NA | PIPE3_DEF_DBL_ISS | PIPE2_DEF_DBL_ISS | ... + * + * 2 1 0 + * ... | PIPE1_DEF_DBL_ISS | PIPE0_DEF_DBL_ISS | ROUND_ROBIN_MODE | + * + * DBL_ISS - mode for SECENG and DMA controller which slows down transfers + * (to be conservativei; 0=Disable,1=Enable). + * ROUND_ROBIN - mode where SECENG dispatches operations to PIPE0-PIPE3 + * and all messages are sent to PIPE0. + * + */ + +#define SEC_CFG2_PIPE3_DBL_ISS_ON 0x00000010 +#define SEC_CFG2_PIPE3_DBL_ISS_OFF 0x00000000 +#define SEC_CFG2_PIPE2_DBL_ISS_ON 0x00000008 +#define SEC_CFG2_PIPE2_DBL_ISS_OFF 0x00000000 +#define SEC_CFG2_PIPE1_DBL_ISS_ON 0x00000004 +#define SEC_CFG2_PIPE1_DBL_ISS_OFF 0x00000000 +#define SEC_CFG2_PIPE0_DBL_ISS_ON 0x00000002 +#define SEC_CFG2_PIPE0_DBL_ISS_OFF 0x00000000 +#define SEC_CFG2_ROUND_ROBIN_ON 0x00000001 +#define SEC_CFG2_ROUND_ROBIN_OFF 0x00000000 + + +enum sec_pipe_config { + + SEC_PIPE_CIPHER_KEY0_L0 = 0x00, + SEC_PIPE_CIPHER_KEY0_HI, + SEC_PIPE_CIPHER_KEY1_LO, + SEC_PIPE_CIPHER_KEY1_HI, + SEC_PIPE_CIPHER_KEY2_LO, + SEC_PIPE_CIPHER_KEY2_HI, + SEC_PIPE_CIPHER_KEY3_LO, + SEC_PIPE_CIPHER_KEY3_HI, + SEC_PIPE_HMAC_KEY0_LO, + SEC_PIPE_HMAC_KEY0_HI, + SEC_PIPE_HMAC_KEY1_LO, + SEC_PIPE_HMAC_KEY1_HI, + SEC_PIPE_HMAC_KEY2_LO, + SEC_PIPE_HMAC_KEY2_HI, + SEC_PIPE_HMAC_KEY3_LO, + SEC_PIPE_HMAC_KEY3_HI, + SEC_PIPE_HMAC_KEY4_LO, + SEC_PIPE_HMAC_KEY4_HI, + SEC_PIPE_HMAC_KEY5_LO, + SEC_PIPE_HMAC_KEY5_HI, + SEC_PIPE_HMAC_KEY6_LO, + SEC_PIPE_HMAC_KEY6_HI, + SEC_PIPE_HMAC_KEY7_LO, + SEC_PIPE_HMAC_KEY7_HI, + SEC_PIPE_NCFBM_LO, + SEC_PIPE_NCFBM_HI, + SEC_PIPE_INSTR_LO, + SEC_PIPE_INSTR_HI, + SEC_PIPE_RSVD0, + SEC_PIPE_RSVD1, + SEC_PIPE_RSVD2, + SEC_PIPE_RSVD3, + + SEC_PIPE_DF_PTRS0, + SEC_PIPE_DF_PTRS1, + SEC_PIPE_DF_PTRS2, + SEC_PIPE_DF_PTRS3, + SEC_PIPE_DF_PTRS4, + SEC_PIPE_DF_PTRS5, + SEC_PIPE_DF_PTRS6, + SEC_PIPE_DF_PTRS7, + + SEC_PIPE_DU_DATA_IN_LO, + SEC_PIPE_DU_DATA_IN_HI, + SEC_PIPE_DU_DATA_IN_CTRL, + SEC_PIPE_DU_DATA_OUT_LO, + SEC_PIPE_DU_DATA_OUT_HI, + SEC_PIPE_DU_DATA_OUT_CTRL, + + SEC_PIPE_STATE0, + SEC_PIPE_STATE1, + SEC_PIPE_STATE2, + SEC_PIPE_STATE3, + SEC_PIPE_STATE4, + SEC_PIPE_INCLUDE_MASK0, + SEC_PIPE_INCLUDE_MASK1, + SEC_PIPE_INCLUDE_MASK2, + SEC_PIPE_INCLUDE_MASK3, + SEC_PIPE_INCLUDE_MASK4, + SEC_PIPE_EXCLUDE_MASK0, + SEC_PIPE_EXCLUDE_MASK1, + SEC_PIPE_EXCLUDE_MASK2, + SEC_PIPE_EXCLUDE_MASK3, + SEC_PIPE_EXCLUDE_MASK4, +}; + + +enum sec_pipe_base_config { + + SEC_PIPE0_BASE = 0x00, + SEC_PIPE1_BASE = 0x40, + SEC_PIPE2_BASE = 0x80, + SEC_PIPE3_BASE = 0xc0 + +}; + +enum sec_rsa_config { + + SEC_RSA_PIPE0_DU_DATA_IN_LO = 0x100, + SEC_RSA_PIPE0_DU_DATA_IN_HI, + SEC_RSA_PIPE0_DU_DATA_IN_CTRL, + SEC_RSA_PIPE0_DU_DATA_OUT_LO, + SEC_RSA_PIPE0_DU_DATA_OUT_HI, + SEC_RSA_PIPE0_DU_DATA_OUT_CTRL, + SEC_RSA_RSVD0, + SEC_RSA_RSVD1, + + SEC_RSA_PIPE0_STATE0, + SEC_RSA_PIPE0_STATE1, + SEC_RSA_PIPE0_STATE2, + SEC_RSA_PIPE0_INCLUDE_MASK0, + SEC_RSA_PIPE0_INCLUDE_MASK1, + SEC_RSA_PIPE0_INCLUDE_MASK2, + SEC_RSA_PIPE0_EXCLUDE_MASK0, + SEC_RSA_PIPE0_EXCLUDE_MASK1, + SEC_RSA_PIPE0_EXCLUDE_MASK2, + SEC_RSA_PIPE0_EVENT_CTR + +}; + + + + +enum sec_config { + + SEC_DMA_CREDIT = 0x140, + SEC_CONFIG1, + SEC_CONFIG2, + SEC_CONFIG3, + +}; + + + +enum sec_debug_config { + + SEC_DW0_DESCRIPTOR0_LO = 0x180, + SEC_DW0_DESCRIPTOR0_HI, + SEC_DW0_DESCRIPTOR1_LO, + SEC_DW0_DESCRIPTOR1_HI, + SEC_DW1_DESCRIPTOR0_LO, + SEC_DW1_DESCRIPTOR0_HI, + SEC_DW1_DESCRIPTOR1_LO, + SEC_DW1_DESCRIPTOR1_HI, + SEC_DW2_DESCRIPTOR0_LO, + SEC_DW2_DESCRIPTOR0_HI, + SEC_DW2_DESCRIPTOR1_LO, + SEC_DW2_DESCRIPTOR1_HI, + SEC_DW3_DESCRIPTOR0_LO, + SEC_DW3_DESCRIPTOR0_HI, + SEC_DW3_DESCRIPTOR1_LO, + SEC_DW3_DESCRIPTOR1_HI, + + SEC_STATE0, + SEC_STATE1, + SEC_STATE2, + SEC_INCLUDE_MASK0, + SEC_INCLUDE_MASK1, + SEC_INCLUDE_MASK2, + SEC_EXCLUDE_MASK0, + SEC_EXCLUDE_MASK1, + SEC_EXCLUDE_MASK2, + SEC_EVENT_CTR + +}; + + +enum sec_msgring_bucket_config { + + SEC_BIU_CREDITS = 0x308, + + SEC_MSG_BUCKET0_SIZE = 0x320, + SEC_MSG_BUCKET1_SIZE, + SEC_MSG_BUCKET2_SIZE, + SEC_MSG_BUCKET3_SIZE, + SEC_MSG_BUCKET4_SIZE, + SEC_MSG_BUCKET5_SIZE, + SEC_MSG_BUCKET6_SIZE, + SEC_MSG_BUCKET7_SIZE, +}; + +enum sec_msgring_credit_config { + + SEC_CC_CPU0_0 = 0x380, + SEC_CC_CPU1_0 = 0x388, + SEC_CC_CPU2_0 = 0x390, + SEC_CC_CPU3_0 = 0x398, + SEC_CC_CPU4_0 = 0x3a0, + SEC_CC_CPU5_0 = 0x3a8, + SEC_CC_CPU6_0 = 0x3b0, + SEC_CC_CPU7_0 = 0x3b8 + +}; + +enum sec_engine_id { + SEC_PIPE0, + SEC_PIPE1, + SEC_PIPE2, + SEC_PIPE3, + SEC_RSA +}; + +enum sec_cipher { + SEC_AES256_MODE_HMAC, + SEC_AES256_MODE, + SEC_AES256_HMAC, + SEC_AES256, + SEC_AES192_MODE_HMAC, + SEC_AES192_MODE, + SEC_AES192_HMAC, + SEC_AES192, + SEC_AES128_MODE_HMAC, + SEC_AES128_MODE, + SEC_AES128_HMAC, + SEC_AES128, + SEC_DES_HMAC, + SEC_DES, + SEC_3DES, + SEC_3DES_HMAC, + SEC_HMAC +}; + +enum sec_msgrng_msg_ctrl_config { + SEC_EOP = 5, + SEC_SOP = 6, +}; + + + +void +xlr_sec_init(struct xlr_sec_softc *sc); + +int +xlr_sec_setup(struct xlr_sec_session *ses, + struct xlr_sec_command *cmd, symkey_desc_pt desc); + +symkey_desc_pt xlr_sec_allocate_desc(void *); + +#endif diff --git a/sys/mips/rmi/dev/sec/rmisec.c b/sys/mips/rmi/dev/sec/rmisec.c new file mode 100644 index 000000000000..acced4ac1306 --- /dev/null +++ b/sys/mips/rmi/dev/sec/rmisec.c @@ -0,0 +1,606 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +/*#define RMI_SEC_DEBUG */ + + +void xlr_sec_print_data(struct cryptop *crp); + +static int xlr_sec_newsession(void *arg, uint32_t * sidp, struct cryptoini *cri); +static int xlr_sec_freesession(void *arg, uint64_t tid); +static int xlr_sec_process(void *arg, struct cryptop *crp, int hint); + + +static int xlr_sec_probe(device_t); +static int xlr_sec_attach(device_t); +static int xlr_sec_detach(device_t); + + +static device_method_t xlr_sec_methods[] = { + /* device interface */ + DEVMETHOD(device_probe, xlr_sec_probe), + DEVMETHOD(device_attach, xlr_sec_attach), + DEVMETHOD(device_detach, xlr_sec_detach), + + /* bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_driver_added, bus_generic_driver_added), + + {0, 0} +}; + +static driver_t xlr_sec_driver = { + "rmisec", + xlr_sec_methods, + sizeof(struct xlr_sec_softc) +}; +static devclass_t xlr_sec_devclass; + +DRIVER_MODULE(rmisec, iodi, xlr_sec_driver, xlr_sec_devclass, 0, 0); +MODULE_DEPEND(rmisec, crypto, 1, 1, 1); + + + +static int +xlr_sec_probe(device_t dev) +{ + return (BUS_PROBE_DEFAULT); + +} + + +/* + * Attach an interface that successfully probed. + */ +static int +xlr_sec_attach(device_t dev) +{ + + struct xlr_sec_softc *sc = device_get_softc(dev); + + bzero(sc, sizeof(*sc)); + sc->sc_dev = dev; + + + mtx_init(&sc->sc_mtx, device_get_nameunit(dev), "rmi crypto driver", MTX_DEF); + + sc->sc_cid = crypto_get_driverid(0); + if (sc->sc_cid < 0) { + printf("xlr_sec - error : could not get the driver id\n"); + goto error_exit; + } + if (crypto_register(sc->sc_cid, CRYPTO_DES_CBC, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_DES_CBC\n"); + + if (crypto_register(sc->sc_cid, CRYPTO_3DES_CBC, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_3DES_CBC\n"); + + if (crypto_register(sc->sc_cid, CRYPTO_AES_CBC, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, + xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_AES_CBC\n"); + + if (crypto_register(sc->sc_cid, CRYPTO_ARC4, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_ARC4\n"); + + + if (crypto_register(sc->sc_cid, CRYPTO_MD5, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_MD5\n"); + + if (crypto_register(sc->sc_cid, CRYPTO_SHA1, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_SHA1\n"); + + if (crypto_register(sc->sc_cid, CRYPTO_MD5_HMAC, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_MD5_HMAC\n"); + + if (crypto_register(sc->sc_cid, CRYPTO_SHA1_HMAC, 0, 0, + xlr_sec_newsession, xlr_sec_freesession, xlr_sec_process, sc) != 0) + printf("register failed for CRYPTO_SHA1_HMAC\n"); + + + xlr_sec_init(sc); + return (0); + + +error_exit: + return (ENXIO); + +} + + +/* + * Detach an interface that successfully probed. + */ +static int +xlr_sec_detach(device_t dev) +{ + int sesn; + struct xlr_sec_softc *sc = device_get_softc(dev); + struct xlr_sec_session *ses = NULL; + symkey_desc_pt desc; + + for (sesn = 0; sesn < sc->sc_nsessions; sesn++) { + ses = &sc->sc_sessions[sesn]; + desc = (symkey_desc_pt) ses->desc_ptr; + free(desc->user.kern_src, M_DEVBUF); + free(desc->user.kern_dest, M_DEVBUF); + free(desc->next_src_buf, M_DEVBUF); + free(desc->next_dest_buf, M_DEVBUF); + free(ses->desc_ptr, M_DEVBUF); + } + + return (0); +} + + + + +/* + * Allocate a new 'session' and return an encoded session id. 'sidp' + * contains our registration id, and should contain an encoded session + * id on successful allocation. + */ +static int +xlr_sec_newsession(void *arg, u_int32_t * sidp, struct cryptoini *cri) +{ + struct cryptoini *c; + struct xlr_sec_softc *sc = arg; + int mac = 0, cry = 0, sesn; + struct xlr_sec_session *ses = NULL; + + + if (sidp == NULL || cri == NULL || sc == NULL) + return (EINVAL); + + + if (sc->sc_sessions == NULL) { + ses = sc->sc_sessions = (struct xlr_sec_session *)malloc( + sizeof(struct xlr_sec_session), M_DEVBUF, M_NOWAIT); + if (ses == NULL) + return (ENOMEM); + + ses->desc_ptr = (void *)xlr_sec_allocate_desc((void *)ses); + if (ses->desc_ptr == NULL) + return (ENOMEM); + + sesn = 0; + ses->sessionid = sesn; + sc->sc_nsessions = 1; + } else { + for (sesn = 0; sesn < sc->sc_nsessions; sesn++) { + if (!sc->sc_sessions[sesn].hs_used) { + ses = &sc->sc_sessions[sesn]; + break; + } + } + + if (ses == NULL) { + sesn = sc->sc_nsessions; + ses = (struct xlr_sec_session *)malloc((sesn + 1) * + sizeof(struct xlr_sec_session), M_DEVBUF, M_NOWAIT); + if (ses == NULL) + return (ENOMEM); + bcopy(sc->sc_sessions, ses, sesn * sizeof(struct xlr_sec_session)); + bzero(sc->sc_sessions, sesn * sizeof(struct xlr_sec_session)); + free(sc->sc_sessions, M_DEVBUF); + sc->sc_sessions = ses; + ses = &sc->sc_sessions[sesn]; + ses->sessionid = sesn; + ses->desc_ptr = (void *)xlr_sec_allocate_desc((void *)ses); + if (ses->desc_ptr == NULL) + return (ENOMEM); + sc->sc_nsessions++; + } + } + ses->hs_used = 1; + + + for (c = cri; c != NULL; c = c->cri_next) { + + switch (c->cri_alg) { + case CRYPTO_MD5: + case CRYPTO_SHA1: + case CRYPTO_MD5_HMAC: + case CRYPTO_SHA1_HMAC: + if (mac) + return (EINVAL); + mac = 1; + ses->hs_mlen = c->cri_mlen; + if (ses->hs_mlen == 0) { + switch (c->cri_alg) { + case CRYPTO_MD5: + case CRYPTO_MD5_HMAC: + ses->hs_mlen = 16; + break; + case CRYPTO_SHA1: + case CRYPTO_SHA1_HMAC: + ses->hs_mlen = 20; + break; + } + } + break; + case CRYPTO_DES_CBC: + case CRYPTO_3DES_CBC: + case CRYPTO_AES_CBC: + /* XXX this may read fewer, does it matter? */ + /* + * read_random(ses->hs_iv, c->cri_alg == + * CRYPTO_AES_CBC ? XLR_SEC_AES_IV_LENGTH : + * XLR_SEC_IV_LENGTH); + */ + /* FALLTHROUGH */ + case CRYPTO_ARC4: + if (cry) + return (EINVAL); + cry = 1; + break; + default: + return (EINVAL); + } + } + if (mac == 0 && cry == 0) + return (EINVAL); + + *sidp = XLR_SEC_SID(device_get_unit(sc->sc_dev), sesn); + return (0); +} + +/* + * Deallocate a session. + * XXX this routine should run a zero'd mac/encrypt key into context ram. + * XXX to blow away any keys already stored there. + */ +static int +xlr_sec_freesession(void *arg, u_int64_t tid) +{ + struct xlr_sec_softc *sc = arg; + int session; + u_int32_t sid = CRYPTO_SESID2LID(tid); + + if (sc == NULL) + return (EINVAL); + + session = XLR_SEC_SESSION(sid); + if (session >= sc->sc_nsessions) + return (EINVAL); + + sc->sc_sessions[session].hs_used = 0; + + return (0); +} + +#ifdef RMI_SEC_DEBUG + +void +xlr_sec_print_data(struct cryptop *crp) +{ + int i, key_len; + struct cryptodesc *crp_desc; + + printf("session id = 0x%llx, crp_ilen = %d, crp_olen=%d \n", + crp->crp_sid, crp->crp_ilen, crp->crp_olen); + + printf("crp_flags = 0x%x\n", crp->crp_flags); + + + printf("crp buf:\n"); + for (i = 0; i < crp->crp_ilen; i++) { + printf("%c ", crp->crp_buf[i]); + if (i % 10 == 0) + printf("\n"); + } + + printf("\n"); + printf("****************** desc ****************\n"); + crp_desc = crp->crp_desc; + printf("crd_skip=%d, crd_len=%d, crd_flags=0x%x, crd_alg=%d\n", + crp_desc->crd_skip, crp_desc->crd_len, crp_desc->crd_flags, crp_desc->crd_alg); + + key_len = crp_desc->crd_klen / 8; + printf("key(%d) :\n", key_len); + for (i = 0; i < key_len; i++) + printf("%d", crp_desc->crd_key[i]); + printf("\n"); + + printf(" IV : \n"); + for (i = 0; i < EALG_MAX_BLOCK_LEN; i++) + printf("%d", crp_desc->crd_iv[i]); + printf("\n"); + + printf("crd_next=%p\n", crp_desc->crd_next); + return; +} + +#endif + + +static int +xlr_sec_process(void *arg, struct cryptop *crp, int hint) +{ + struct xlr_sec_softc *sc = arg; + struct xlr_sec_command *cmd = NULL; + int session, err; + struct cryptodesc *crd1, *crd2, *maccrd, *enccrd; + struct xlr_sec_session *ses; + + if (crp == NULL || crp->crp_callback == NULL) { + return (EINVAL); + } + session = XLR_SEC_SESSION(crp->crp_sid); + if (sc == NULL || session >= sc->sc_nsessions) { + err = EINVAL; + goto errout; + } + ses = &sc->sc_sessions[session]; + + cmd = &ses->cmd; + if (cmd == NULL) { + err = ENOMEM; + goto errout; + } + crd1 = crp->crp_desc; + if (crd1 == NULL) { + err = EINVAL; + goto errout; + } + crd2 = crd1->crd_next; + + if (crd2 == NULL) { + if (crd1->crd_alg == CRYPTO_MD5_HMAC || + crd1->crd_alg == CRYPTO_SHA1_HMAC || + crd1->crd_alg == CRYPTO_SHA1 || + crd1->crd_alg == CRYPTO_MD5) { + maccrd = crd1; + enccrd = NULL; + } else if (crd1->crd_alg == CRYPTO_DES_CBC || + crd1->crd_alg == CRYPTO_3DES_CBC || + crd1->crd_alg == CRYPTO_AES_CBC || + crd1->crd_alg == CRYPTO_ARC4) { + maccrd = NULL; + enccrd = crd1; + } else { + err = EINVAL; + goto errout; + } + } else { + if ((crd1->crd_alg == CRYPTO_MD5_HMAC || + crd1->crd_alg == CRYPTO_SHA1_HMAC || + crd1->crd_alg == CRYPTO_MD5 || + crd1->crd_alg == CRYPTO_SHA1) && + (crd2->crd_alg == CRYPTO_DES_CBC || + crd2->crd_alg == CRYPTO_3DES_CBC || + crd2->crd_alg == CRYPTO_AES_CBC || + crd2->crd_alg == CRYPTO_ARC4)) { + maccrd = crd1; + enccrd = crd2; + } else if ((crd1->crd_alg == CRYPTO_DES_CBC || + crd1->crd_alg == CRYPTO_ARC4 || + crd1->crd_alg == CRYPTO_3DES_CBC || + crd1->crd_alg == CRYPTO_AES_CBC) && + (crd2->crd_alg == CRYPTO_MD5_HMAC || + crd2->crd_alg == CRYPTO_SHA1_HMAC || + crd2->crd_alg == CRYPTO_MD5 || + crd2->crd_alg == CRYPTO_SHA1) && + (crd1->crd_flags & CRD_F_ENCRYPT)) { + enccrd = crd1; + maccrd = crd2; + } else { + err = EINVAL; + goto errout; + } + } + + bzero(&cmd->op, sizeof(xlr_sec_io_t)); + + cmd->op.source_buf = (uint64_t) (unsigned long)crp->crp_buf; + cmd->op.source_buf_size = crp->crp_ilen; + if (crp->crp_flags & CRYPTO_F_REL) { + cmd->op.dest_buf = (uint64_t) (unsigned long)crp->crp_buf; + cmd->op.dest_buf_size = crp->crp_ilen; + } else { + cmd->op.dest_buf = (uint64_t) (unsigned long)crp->crp_buf; + cmd->op.dest_buf_size = crp->crp_ilen; + } + cmd->op.num_packets = 1; + cmd->op.num_fragments = 1; + + + if (cmd->op.source_buf_size > SEC_MAX_FRAG_LEN) { + ses->multi_frag_flag = 1; + } else { + ses->multi_frag_flag = 0; + } + + if (maccrd) { + cmd->maccrd = maccrd; + cmd->op.cipher_op = XLR_SEC_CIPHER_MODE_PASS; + cmd->op.cipher_mode = XLR_SEC_CIPHER_MODE_NONE; + cmd->op.cipher_type = XLR_SEC_CIPHER_TYPE_NONE; + cmd->op.cipher_init = 0; + cmd->op.cipher_offset = 0; + + switch (maccrd->crd_alg) { + case CRYPTO_MD5: + cmd->op.digest_type = XLR_SEC_DIGEST_TYPE_MD5; + cmd->op.digest_init = XLR_SEC_DIGEST_INIT_NEWKEY; + cmd->op.digest_src = XLR_SEC_DIGEST_SRC_DMA; + cmd->op.digest_offset = 0; + + cmd->op.cksum_type = XLR_SEC_CKSUM_TYPE_NOP; + cmd->op.cksum_src = XLR_SEC_CKSUM_SRC_CIPHER; + cmd->op.cksum_offset = 0; + + cmd->op.pkt_hmac = XLR_SEC_LOADHMACKEY_MODE_OLD; + cmd->op.pkt_hash = XLR_SEC_PADHASH_PAD; + cmd->op.pkt_hashbytes = XLR_SEC_HASHBYTES_ALL8; + cmd->op.pkt_next = XLR_SEC_NEXT_FINISH; + cmd->op.pkt_iv = XLR_SEC_PKT_IV_OLD; + cmd->op.pkt_lastword = XLR_SEC_LASTWORD_128; + + + default: + printf("currently not handled\n"); + } + } + if (enccrd) { + cmd->enccrd = enccrd; + +#ifdef RMI_SEC_DEBUG + xlr_sec_print_data(crp); +#endif + + if (enccrd->crd_flags & CRD_F_ENCRYPT) { + cmd->op.cipher_op = XLR_SEC_CIPHER_OP_ENCRYPT; + } else + cmd->op.cipher_op = XLR_SEC_CIPHER_OP_DECRYPT; + + switch (enccrd->crd_alg) { + case CRYPTO_DES_CBC: + case CRYPTO_3DES_CBC: + if (enccrd->crd_alg == CRYPTO_DES_CBC) { + cmd->op.cipher_type = XLR_SEC_CIPHER_TYPE_DES; + memcpy(&cmd->op.crypt_key[0], enccrd->crd_key, XLR_SEC_DES_KEY_LENGTH); + } else { + cmd->op.cipher_type = XLR_SEC_CIPHER_TYPE_3DES; + //if (enccrd->crd_flags & CRD_F_KEY_EXPLICIT) { + memcpy(&cmd->op.crypt_key[0], enccrd->crd_key, XLR_SEC_3DES_KEY_LENGTH); + } + } + + cmd->op.cipher_mode = XLR_SEC_CIPHER_MODE_CBC; + cmd->op.cipher_init = XLR_SEC_CIPHER_INIT_NK; + cmd->op.cipher_offset = XLR_SEC_DES_IV_LENGTH; + + cmd->op.digest_type = XLR_SEC_DIGEST_TYPE_NONE; + cmd->op.digest_init = XLR_SEC_DIGEST_INIT_OLDKEY; + cmd->op.digest_src = XLR_SEC_DIGEST_SRC_DMA; + cmd->op.digest_offset = 0; + + cmd->op.cksum_type = XLR_SEC_CKSUM_TYPE_NOP; + cmd->op.cksum_src = XLR_SEC_CKSUM_SRC_CIPHER; + cmd->op.cksum_offset = 0; + + cmd->op.pkt_hmac = XLR_SEC_LOADHMACKEY_MODE_OLD; + cmd->op.pkt_hash = XLR_SEC_PADHASH_PAD; + cmd->op.pkt_hashbytes = XLR_SEC_HASHBYTES_ALL8; + cmd->op.pkt_next = XLR_SEC_NEXT_FINISH; + cmd->op.pkt_iv = XLR_SEC_PKT_IV_NEW; + cmd->op.pkt_lastword = XLR_SEC_LASTWORD_128; + + //if ((!(enccrd->crd_flags & CRD_F_IV_PRESENT)) && + if ((enccrd->crd_flags & CRD_F_IV_EXPLICIT)) { + memcpy(&cmd->op.initial_vector[0], enccrd->crd_iv, XLR_SEC_DES_IV_LENGTH); + } + break; + + case CRYPTO_AES_CBC: + if (enccrd->crd_alg == CRYPTO_AES_CBC) { + cmd->op.cipher_type = XLR_SEC_CIPHER_TYPE_AES128; + //if (enccrd->crd_flags & CRD_F_KEY_EXPLICIT) { + memcpy(&cmd->op.crypt_key[0], enccrd->crd_key, XLR_SEC_AES128_KEY_LENGTH); + } + } + cmd->op.cipher_mode = XLR_SEC_CIPHER_MODE_CBC; + cmd->op.cipher_init = XLR_SEC_CIPHER_INIT_NK; + cmd->op.cipher_offset = XLR_SEC_AES_BLOCK_SIZE; + + cmd->op.digest_type = XLR_SEC_DIGEST_TYPE_NONE; + cmd->op.digest_init = XLR_SEC_DIGEST_INIT_OLDKEY; + cmd->op.digest_src = XLR_SEC_DIGEST_SRC_DMA; + cmd->op.digest_offset = 0; + + cmd->op.cksum_type = XLR_SEC_CKSUM_TYPE_NOP; + cmd->op.cksum_src = XLR_SEC_CKSUM_SRC_CIPHER; + cmd->op.cksum_offset = 0; + + cmd->op.pkt_hmac = XLR_SEC_LOADHMACKEY_MODE_OLD; + cmd->op.pkt_hash = XLR_SEC_PADHASH_PAD; + cmd->op.pkt_hashbytes = XLR_SEC_HASHBYTES_ALL8; + cmd->op.pkt_next = XLR_SEC_NEXT_FINISH; + cmd->op.pkt_iv = XLR_SEC_PKT_IV_NEW; + cmd->op.pkt_lastword = XLR_SEC_LASTWORD_128; + + //if (!(enccrd->crd_flags & CRD_F_IV_PRESENT)) { + if ((enccrd->crd_flags & CRD_F_IV_EXPLICIT)) { + memcpy(&cmd->op.initial_vector[0], enccrd->crd_iv, XLR_SEC_AES_BLOCK_SIZE); + } + // + } + break; + } + } + cmd->crp = crp; + cmd->session_num = session; + xlr_sec_setup(ses, cmd, (symkey_desc_pt) ses->desc_ptr); + + return (0); + +errout: + if (cmd != NULL) + free(cmd, M_DEVBUF); + crp->crp_etype = err; + crypto_done(crp); + return (err); +} diff --git a/sys/mips/rmi/dev/sec/stats.h b/sys/mips/rmi/dev/sec/stats.h new file mode 100644 index 000000000000..276f7e9b9991 --- /dev/null +++ b/sys/mips/rmi/dev/sec/stats.h @@ -0,0 +1,469 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ + +#ifndef _STATS_H_ +#define _STATS_H_ + +typedef struct hmac_stats +{ + unsigned long md5_count; + unsigned long long md5_bytes; + unsigned long sha1_count; + unsigned long long sha1_bytes; + unsigned long sha256_count; + unsigned long long sha256_bytes; + unsigned long sha384_count; + unsigned long long sha384_bytes; + unsigned long sha512_count; + unsigned long long sha512_bytes; + unsigned long gcm_count; + unsigned long long gcm_bytes; + unsigned long kasumi_f9_count; + unsigned long long kasumi_f9_bytes; + unsigned long reverts; + unsigned long long reverts_bytes; +} hmac_stats_t, *hmac_stats_pt; + +typedef struct cipher_stats +{ + unsigned long des_encrypts; + unsigned long long des_encrypt_bytes; + unsigned long des_decrypts; + unsigned long long des_decrypt_bytes; + unsigned long des3_encrypts; + unsigned long long des3_encrypt_bytes; + unsigned long des3_decrypts; + unsigned long long des3_decrypt_bytes; + unsigned long aes_encrypts; + unsigned long long aes_encrypt_bytes; + unsigned long aes_decrypts; + unsigned long long aes_decrypt_bytes; + unsigned long arc4_encrypts; + unsigned long long arc4_encrypt_bytes; + unsigned long arc4_decrypts; + unsigned long long arc4_decrypt_bytes; + unsigned long kasumi_f8_encrypts; + unsigned long long kasumi_f8_encrypt_bytes; + unsigned long kasumi_f8_decrypts; + unsigned long long kasumi_f8_decrypt_bytes; + unsigned long reverts; + unsigned long long reverts_bytes; +} cipher_stats_t, *cipher_stats_pt; + + +typedef struct modexp_stats +{ + unsigned long modexp_512s; + unsigned long modexp_1024s; +} modexp_stats_t, *modexp_stats_pt; + +typedef struct ecc_stats +{ + unsigned long ecc_mul; + unsigned long ecc_add; + unsigned long ecc_dbl; + unsigned long ecc_vfy; + unsigned long ecc_bin_mul; + unsigned long ecc_field_bin_inv; + unsigned long ecc_field_bin_mul; + unsigned long ecc_field_bin_add; + unsigned long ecc_field_add; + unsigned long ecc_field_sub; + unsigned long ecc_field_mul; + unsigned long ecc_field_inv; + unsigned long ecc_field_div; + unsigned long ecc_field_red; +} ecc_stats_t, *ecc_stats_pt; + + +typedef struct opt_stats +{ + unsigned long combined; + unsigned long unaligned_auth_dest; + unsigned long sym_failed; + unsigned long modexp_failed; + unsigned long ecc_failed; +} opt_stats_t, *opt_stats_pt; + +typedef struct rmisec_stats +{ + uint32_t sent; + uint32_t received; + uint32_t stats_mask; + uint32_t control_mask; + rwlock_t rmisec_control_lock; + rwlock_t rmisec_stats_lock; + char clear_start[0]; + uint64_t wait_time; + uint32_t max_wait_time; + uint32_t maxsnd_wait_time; + uint32_t wait_count; + hmac_stats_t hmac; + cipher_stats_t cipher; + modexp_stats_t modexp; + ecc_stats_t ecc; + opt_stats_t opt; +} rmisec_stats_t, *rmisec_stats_pt; + + +/* stats routines */ + +static void inline phxdrv_record_sent(rmisec_stats_pt stats) +{ + write_lock(&stats->rmisec_stats_lock); + stats->sent++; + write_unlock(&stats->rmisec_stats_lock); +} + +static void inline phxdrv_record_received(rmisec_stats_pt stats) +{ + write_lock(&stats->rmisec_stats_lock); + stats->received++; + write_unlock(&stats->rmisec_stats_lock); +} + + +static void inline phxdrv_record_des(rmisec_stats_pt stats, int enc, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_DES) { + write_lock(&stats->rmisec_stats_lock); + if (enc) { + stats->cipher.des_encrypts++; + stats->cipher.des_encrypt_bytes += nbytes; + } + else { + stats->cipher.des_decrypts++; + stats->cipher.des_decrypt_bytes += nbytes; + } + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_3des(rmisec_stats_pt stats, int enc, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_3DES) { + write_lock(&stats->rmisec_stats_lock); + if (enc) { + stats->cipher.des3_encrypts++; + stats->cipher.des3_encrypt_bytes += nbytes; + } + else { + stats->cipher.des3_decrypts++; + stats->cipher.des3_decrypt_bytes += nbytes; + } + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_aes(rmisec_stats_pt stats, int enc, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_AES) { + write_lock(&stats->rmisec_stats_lock); + if (enc) { + stats->cipher.aes_encrypts++; + stats->cipher.aes_encrypt_bytes += nbytes; + } + else { + stats->cipher.aes_decrypts++; + stats->cipher.aes_decrypt_bytes += nbytes; + } + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_arc4(rmisec_stats_pt stats, int enc, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_ARC4) { + write_lock(&stats->rmisec_stats_lock); + if (enc) { + stats->cipher.arc4_encrypts++; + stats->cipher.arc4_encrypt_bytes += nbytes; + } + else { + stats->cipher.arc4_decrypts++; + stats->cipher.arc4_decrypt_bytes += nbytes; + } + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_kasumi_f8(rmisec_stats_pt stats, int enc, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_KASUMI_F8) { + write_lock(&stats->rmisec_stats_lock); + if (enc) { + stats->cipher.kasumi_f8_encrypts++; + stats->cipher.kasumi_f8_encrypt_bytes += nbytes; + } + else { + stats->cipher.kasumi_f8_decrypts++; + stats->cipher.kasumi_f8_decrypt_bytes += nbytes; + } + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_modexp(rmisec_stats_pt stats, + int blksize) +{ + if (stats->stats_mask & PHXDRV_PROFILE_MODEXP) { + write_lock(&stats->rmisec_stats_lock); + if (blksize == 512) { + stats->modexp.modexp_512s++; + } + if (blksize == 1024) { + stats->modexp.modexp_1024s++; + } + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_ecc(rmisec_stats_pt stats, PHX_ECC_OP op) +{ + if (stats->stats_mask & PHXDRV_PROFILE_ECC) { + write_lock(&stats->rmisec_stats_lock); + switch (op) { + case PHX_ECC_NOP: + break; + case PHX_ECC_MUL: + stats->ecc.ecc_mul++; + break; + case PHX_ECC_BIN_MUL: + stats->ecc.ecc_bin_mul++; + break; + case PHX_ECC_ADD: + stats->ecc.ecc_add++; + break; + case PHX_ECC_DBL: + stats->ecc.ecc_dbl++; + break; + case PHX_ECC_VFY: + stats->ecc.ecc_vfy++; + break; + case PHX_ECC_FIELD_BIN_INV: + stats->ecc.ecc_field_bin_inv++; + break; + case PHX_ECC_FIELD_BIN_MUL: + stats->ecc.ecc_field_bin_mul++; + break; + case PHX_ECC_FIELD_BIN_ADD: + stats->ecc.ecc_field_bin_add++; + break; + case PHX_ECC_FIELD_ADD: + stats->ecc.ecc_field_add++; + break; + case PHX_ECC_FIELD_SUB: + stats->ecc.ecc_field_sub++; + break; + case PHX_ECC_FIELD_MUL: + stats->ecc.ecc_field_mul++; + break; + case PHX_ECC_FIELD_INV: + stats->ecc.ecc_field_inv++; + break; + case PHX_ECC_FIELD_DIV: + stats->ecc.ecc_field_div++; + break; + case PHX_ECC_FIELD_RED: + stats->ecc.ecc_field_red++; + break; + case PHX_ECC_FIELD: + case PHX_ECC_BIN: + break; + } + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_cipher_revert(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_CPHR_REVERTS) { + write_lock(&stats->rmisec_stats_lock); + stats->cipher.reverts++; + stats->cipher.reverts_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_hmac_revert(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_HMAC_REVERTS) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.reverts++; + stats->hmac.reverts_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_md5(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_MD5) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.md5_count++; + stats->hmac.md5_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_sha1(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_SHA1) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.sha1_count++; + stats->hmac.sha1_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_sha256(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_SHA256) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.sha256_count++; + stats->hmac.sha256_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_sha384(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_SHA384) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.sha384_count++; + stats->hmac.sha384_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_sha512(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_SHA512) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.sha512_count++; + stats->hmac.sha512_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_gcm(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_GCM) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.gcm_count++; + stats->hmac.gcm_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_kasumi_f9(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_KASUMI_F9) { + write_lock(&stats->rmisec_stats_lock); + stats->hmac.kasumi_f9_count++; + stats->hmac.kasumi_f9_bytes += nbytes; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_unaligned_auth_dest(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_UNALIGNED_AUTH_DEST) { + write_lock(&stats->rmisec_stats_lock); + stats->opt.unaligned_auth_dest++; + write_unlock(&stats->rmisec_stats_lock); + } +} + + +static void inline phxdrv_record_combined(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_COMBINED) { + write_lock(&stats->rmisec_stats_lock); + stats->opt.combined++; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_sym_failed(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_COMBINED) { + write_lock(&stats->rmisec_stats_lock); + stats->opt.sym_failed++; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_modexp_failed(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_COMBINED) { + write_lock(&stats->rmisec_stats_lock); + stats->opt.modexp_failed++; + write_unlock(&stats->rmisec_stats_lock); + } +} + +static void inline phxdrv_record_ecc_failed(rmisec_stats_pt stats, + int nbytes) +{ + if (stats->stats_mask & PHXDRV_PROFILE_COMBINED) { + write_lock(&stats->rmisec_stats_lock); + stats->opt.ecc_failed++; + write_unlock(&stats->rmisec_stats_lock); + } +} + +#endif diff --git a/sys/mips/rmi/dev/xlr/atx_cpld.h b/sys/mips/rmi/dev/xlr/atx_cpld.h new file mode 100644 index 000000000000..157e43ed1d7b --- /dev/null +++ b/sys/mips/rmi/dev/xlr/atx_cpld.h @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _RMI_ATX_CPLD_H_ +#define _RMI_ATX_CPLD_H_ + +/* + * bit_0 : xgs0 phy reset, bit_1 : xgs1 phy reset, bit_2 : HT reset, bit_3 : + * RTC reset, bit_4 : gmac phy soft reset, bit_5 : gmac phy hard reset, bit_6 + * : board reset, bit_7 : reserved + */ +#define ATX_CPLD_RESET_1 2 + +/* + * bit_0_2 : reserved, bit_3 : turn off xpak_0 tx, bit_4 : turn off xpak_1 + * tx, bit_5 : HT stop (active low), bit_6 : flash program enable, bit_7 : + * compact flash io mode + */ +#define ATX_CPLD_MISC_CTRL 8 + +/* + * bit_0 : reset tcam, bit_1 : reset xpak_0 module, bit_2 : reset xpak_1 + * module, bit_3_7 : reserved + */ +#define ATX_CPLD_RESET_2 9 + +#endif /* _RMI_ATX_CPLD_H_ */ diff --git a/sys/mips/rmi/dev/xlr/rge.c b/sys/mips/rmi/dev/xlr/rge.c new file mode 100644 index 000000000000..c62c0de99b47 --- /dev/null +++ b/sys/mips/rmi/dev/xlr/rge.c @@ -0,0 +1,2747 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_KERNEL_OPTION_HEADERS +#include "opt_device_polling.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define __RMAN_RESOURCE_VISIBLE +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include /* for DELAY */ +#include /* */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +/* #include "opt_rge.h" */ + +#include "miibus_if.h" + +MODULE_DEPEND(rge, ether, 1, 1, 1); +MODULE_DEPEND(rge, miibus, 1, 1, 1); + +/* #define DEBUG */ +/*#define RX_COPY */ + +#define RGE_TX_THRESHOLD 1024 +#define RGE_TX_Q_SIZE 1024 + +#ifdef DEBUG +#undef dbg_msg +int mac_debug = 1; + +#define dbg_msg(fmt, args...) \ + do {\ + if (mac_debug) {\ + printf("[%s@%d|%s]: cpu_%d: " fmt, \ + __FILE__, __LINE__, __FUNCTION__, PCPU_GET(cpuid), ##args);\ + }\ + } while(0); + +#define DUMP_PACKETS +#else +#undef dbg_msg +#define dbg_msg(fmt, args...) +int mac_debug = 0; + +#endif + +#define MAC_B2B_IPG 88 + +/* frame sizes need to be cacheline aligned */ +#define MAX_FRAME_SIZE 1536 +#define MAX_FRAME_SIZE_JUMBO 9216 + +#define MAC_SKB_BACK_PTR_SIZE SMP_CACHE_BYTES +#define MAC_PREPAD 0 +#define BYTE_OFFSET 2 +#define XLR_RX_BUF_SIZE (MAX_FRAME_SIZE+BYTE_OFFSET+MAC_PREPAD+MAC_SKB_BACK_PTR_SIZE+SMP_CACHE_BYTES) +#define MAC_CRC_LEN 4 +#define MAX_NUM_MSGRNG_STN_CC 128 + +#define MAX_NUM_DESC 1024 +#define MAX_SPILL_SIZE (MAX_NUM_DESC + 128) + +#define MAC_FRIN_TO_BE_SENT_THRESHOLD 16 + +#define MAX_FRIN_SPILL (MAX_SPILL_SIZE << 2) +#define MAX_FROUT_SPILL (MAX_SPILL_SIZE << 2) +#define MAX_CLASS_0_SPILL (MAX_SPILL_SIZE << 2) +#define MAX_CLASS_1_SPILL (MAX_SPILL_SIZE << 2) +#define MAX_CLASS_2_SPILL (MAX_SPILL_SIZE << 2) +#define MAX_CLASS_3_SPILL (MAX_SPILL_SIZE << 2) + +/***************************************************************** + * Phoenix Generic Mac driver + *****************************************************************/ + +extern uint32_t cpu_ltop_map[32]; + +#ifdef ENABLED_DEBUG +static int port_counters[4][8] __aligned(XLR_CACHELINE_SIZE); + +#define port_inc_counter(port, counter) atomic_add_int(&port_counters[port][(counter)], 1) +#define port_set_counter(port, counter, value) atomic_set_int(&port_counters[port][(counter)], (value)) +#else +#define port_inc_counter(port, counter) /* Nothing */ +#define port_set_counter(port, counter, value) /* Nothing */ +#endif + +int xlr_rge_tx_prepend[MAXCPU]; +int xlr_rge_tx_done[MAXCPU]; +int xlr_rge_get_p2d_failed[MAXCPU]; +int xlr_rge_msg_snd_failed[MAXCPU]; +int xlr_rge_tx_ok_done[MAXCPU]; +int xlr_rge_rx_done[MAXCPU]; +int xlr_rge_repl_done[MAXCPU]; + +static __inline__ unsigned int +ldadd_wu(unsigned int value, unsigned long *addr) +{ + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "move $8, %2\n" + "move $9, %3\n" + /* "ldaddwu $8, $9\n" */ + ".word 0x71280011\n" + "move %0, $8\n" + ".set pop\n" + : "=&r"(value), "+m"(*addr) + : "0"(value), "r"((unsigned long)addr) + : "$8", "$9"); + + return value; +} + +/* #define mac_stats_add(x, val) ({(x) += (val);}) */ +#define mac_stats_add(x, val) ldadd_wu(val, &x) + + +#define XLR_MAX_CORE 8 +#define RGE_LOCK_INIT(_sc, _name) \ + mtx_init(&(_sc)->rge_mtx, _name, MTX_NETWORK_LOCK, MTX_DEF) +#define RGE_LOCK(_sc) mtx_lock(&(_sc)->rge_mtx) +#define RGE_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->rge_mtx, MA_OWNED) +#define RGE_UNLOCK(_sc) mtx_unlock(&(_sc)->rge_mtx) +#define RGE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rge_mtx) + +#define XLR_MAX_MACS 8 +#define XLR_MAX_TX_FRAGS 14 +#define MAX_P2D_DESC_PER_PORT 512 +struct p2d_tx_desc { + uint64_t frag[XLR_MAX_TX_FRAGS + 2]; +}; + +#define MAX_TX_RING_SIZE (XLR_MAX_MACS * MAX_P2D_DESC_PER_PORT * sizeof(struct p2d_tx_desc)) + +struct rge_softc *dev_mac[XLR_MAX_MACS]; +static int dev_mac_xgs0; +static int dev_mac_gmac0; + +static int gmac_common_init_done; + + +static int rge_probe(device_t); +static int rge_attach(device_t); +static int rge_detach(device_t); +static int rge_suspend(device_t); +static int rge_resume(device_t); +static void rge_release_resources(struct rge_softc *); +static void rge_rx(struct rge_softc *, vm_paddr_t paddr, int); +static void rge_intr(void *); +static void rge_start_locked(struct ifnet *, int); +static void rge_start(struct ifnet *); +static int rge_ioctl(struct ifnet *, u_long, caddr_t); +static void rge_init(void *); +static void rge_stop(struct rge_softc *); +static int rge_shutdown(device_t); +static void rge_reset(struct rge_softc *); + +static struct mbuf *get_mbuf(void); +static void free_buf(vm_paddr_t paddr); +static void *get_buf(void); + +static void xlr_mac_get_hwaddr(struct rge_softc *); +static void xlr_mac_setup_hwaddr(struct driver_data *); +static void rmi_xlr_mac_set_enable(struct driver_data *priv, int flag); +static void rmi_xlr_xgmac_init(struct driver_data *priv); +static void rmi_xlr_gmac_init(struct driver_data *priv); +static void mac_common_init(void); +static int rge_mii_write(device_t, int, int, int); +static int rge_mii_read(device_t, int, int); +static void rmi_xlr_mac_mii_statchg(device_t); +static int rmi_xlr_mac_mediachange(struct ifnet *); +static void rmi_xlr_mac_mediastatus(struct ifnet *, struct ifmediareq *); +static void xlr_mac_set_rx_mode(struct rge_softc *sc); +void +rmi_xlr_mac_msgring_handler(int bucket, int size, int code, + int stid, struct msgrng_msg *msg, + void *data); +static void mac_frin_replenish(void *); +static int rmi_xlr_mac_open(struct rge_softc *); +static int rmi_xlr_mac_close(struct rge_softc *); +static int +mac_xmit(struct mbuf *, struct rge_softc *, + struct driver_data *, int, struct p2d_tx_desc *); +static int rmi_xlr_mac_xmit(struct mbuf *, struct rge_softc *, int, struct p2d_tx_desc *); +static struct rge_softc_stats *rmi_xlr_mac_get_stats(struct rge_softc *sc); +static void rmi_xlr_mac_set_multicast_list(struct rge_softc *sc); +static int rmi_xlr_mac_change_mtu(struct rge_softc *sc, int new_mtu); +static int rmi_xlr_mac_fill_rxfr(struct rge_softc *sc); +static void rmi_xlr_config_spill_area(struct driver_data *priv); +static int rmi_xlr_mac_set_speed(struct driver_data *s, xlr_mac_speed_t speed); +static int +rmi_xlr_mac_set_duplex(struct driver_data *s, + xlr_mac_duplex_t duplex, xlr_mac_fc_t fc); +static void serdes_regs_init(struct driver_data *priv); +static int rmi_xlr_gmac_reset(struct driver_data *priv); + +/*Statistics...*/ +static int get_p2d_desc_failed = 0; +static int msg_snd_failed = 0; + +SYSCTL_INT(_hw, OID_AUTO, get_p2d_failed, CTLFLAG_RW, + &get_p2d_desc_failed, 0, "p2d desc failed"); +SYSCTL_INT(_hw, OID_AUTO, msg_snd_failed, CTLFLAG_RW, + &msg_snd_failed, 0, "msg snd failed"); + +struct callout xlr_tx_stop_bkp; + +static device_method_t rge_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, rge_probe), + DEVMETHOD(device_attach, rge_attach), + DEVMETHOD(device_detach, rge_detach), + DEVMETHOD(device_shutdown, rge_shutdown), + DEVMETHOD(device_suspend, rge_suspend), + DEVMETHOD(device_resume, rge_resume), + + /* MII interface */ + DEVMETHOD(miibus_readreg, rge_mii_read), + DEVMETHOD(miibus_statchg, rmi_xlr_mac_mii_statchg), + DEVMETHOD(miibus_writereg, rge_mii_write), + {0, 0} +}; + +static driver_t rge_driver = { + "rge", + rge_methods, + sizeof(struct rge_softc) +}; + +static devclass_t rge_devclass; + +DRIVER_MODULE(rge, iodi, rge_driver, rge_devclass, 0, 0); +DRIVER_MODULE(miibus, rge, miibus_driver, miibus_devclass, 0, 0); + +#ifndef __STR +#define __STR(x) #x +#endif +#ifndef STR +#define STR(x) __STR(x) +#endif + +#define XKPHYS 0x8000000000000000 +/* -- No longer needed RRS +static __inline__ uint32_t +lw_40bit_phys(uint64_t phys, int cca) +{ + uint64_t addr; + uint32_t value = 0; + unsigned long flags; + + addr = XKPHYS | ((uint64_t) cca << 59) | (phys & 0xfffffffffcULL); + + enable_KX(flags); + __asm__ __volatile__( + ".set push\n" + ".set noreorder\n" + ".set mips64\n" + "lw %0, 0(%1) \n" + ".set pop\n" + : "=r"(value) + : "r"(addr)); + + disable_KX(flags); + return value; +} +*/ +/* -- No longer used RRS +static __inline__ uint64_t +ld_40bit_phys(uint64_t phys, int cca) +{ + uint64_t addr; + uint64_t value = 0; + unsigned long flags; + + + addr = XKPHYS | ((uint64_t) cca << 59) | (phys & 0xfffffffffcULL); + enable_KX(flags); + __asm__ __volatile__( + ".set push\n" + ".set noreorder\n" + ".set mips64\n" + "ld %0, 0(%1) \n" + ".set pop\n" + : "=r"(value) + : "r"(addr)); + + disable_KX(flags); + return value; +} +*/ + +void *xlr_tx_ring_mem; + +struct tx_desc_node { + struct p2d_tx_desc *ptr; + TAILQ_ENTRY(tx_desc_node) list; +}; + +#define XLR_MAX_TX_DESC_NODES (XLR_MAX_MACS * MAX_P2D_DESC_PER_PORT) +struct tx_desc_node tx_desc_nodes[XLR_MAX_TX_DESC_NODES]; +static volatile int xlr_tot_avail_p2d[XLR_MAX_CORE]; +static int xlr_total_active_core = 0; + +/* + * This should contain the list of all free tx frag desc nodes pointing to tx + * p2d arrays + */ +static +TAILQ_HEAD(, tx_desc_node) tx_frag_desc[XLR_MAX_CORE] = +{ + TAILQ_HEAD_INITIALIZER(tx_frag_desc[0]), + TAILQ_HEAD_INITIALIZER(tx_frag_desc[1]), + TAILQ_HEAD_INITIALIZER(tx_frag_desc[2]), + TAILQ_HEAD_INITIALIZER(tx_frag_desc[3]), + TAILQ_HEAD_INITIALIZER(tx_frag_desc[4]), + TAILQ_HEAD_INITIALIZER(tx_frag_desc[5]), + TAILQ_HEAD_INITIALIZER(tx_frag_desc[6]), + TAILQ_HEAD_INITIALIZER(tx_frag_desc[7]), +}; + +/* This contains a list of free tx frag node descriptors */ +static +TAILQ_HEAD(, tx_desc_node) free_tx_frag_desc[XLR_MAX_CORE] = +{ + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[0]), + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[1]), + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[2]), + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[3]), + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[4]), + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[5]), + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[6]), + TAILQ_HEAD_INITIALIZER(free_tx_frag_desc[7]), +}; + +static struct mtx tx_desc_lock[XLR_MAX_CORE]; + +static inline void +mac_make_desc_rfr(struct msgrng_msg *msg, + vm_paddr_t addr) +{ + msg->msg0 = (uint64_t) addr & 0xffffffffe0ULL; + msg->msg1 = msg->msg2 = msg->msg3 = 0; +} + +#define MAC_TX_DESC_ALIGNMENT (XLR_CACHELINE_SIZE - 1) + +static void +init_p2d_allocation(void) +{ + int active_core[8] = {0}; + int i = 0; + uint32_t cpumask; + int cpu; + + cpumask = PCPU_GET(cpumask) | PCPU_GET(other_cpus); + + for (i = 0; i < 32; i++) { + if (cpumask & (1 << i)) { + cpu = cpu_ltop_map[i]; + if (!active_core[cpu / 4]) { + active_core[cpu / 4] = 1; + xlr_total_active_core++; + } + } + } + for (i = 0; i < XLR_MAX_CORE; i++) { + if (active_core[i]) + xlr_tot_avail_p2d[i] = XLR_MAX_TX_DESC_NODES / xlr_total_active_core; + } + printf("Total Active Core %d\n", xlr_total_active_core); +} + + +static void +init_tx_ring(void) +{ + int i; + int j = 0; + struct tx_desc_node *start, *node; + struct p2d_tx_desc *tx_desc; + vm_paddr_t paddr; + vm_offset_t unmapped_addr; + + for (i = 0; i < XLR_MAX_CORE; i++) + mtx_init(&tx_desc_lock[i], "xlr tx_desc", NULL, MTX_SPIN); + + start = &tx_desc_nodes[0]; + /* TODO: try to get this from KSEG0 */ + xlr_tx_ring_mem = contigmalloc((MAX_TX_RING_SIZE + XLR_CACHELINE_SIZE), + M_DEVBUF, M_NOWAIT | M_ZERO, 0, + 0x10000000, XLR_CACHELINE_SIZE, 0); + + if (xlr_tx_ring_mem == NULL) { + panic("TX ring memory allocation failed"); + } + paddr = vtophys((vm_offset_t)xlr_tx_ring_mem); + + unmapped_addr = MIPS_PHYS_TO_KSEG0(paddr); + + + tx_desc = (struct p2d_tx_desc *)unmapped_addr; + + for (i = 0; i < XLR_MAX_TX_DESC_NODES; i++) { + node = start + i; + node->ptr = tx_desc; + tx_desc++; + TAILQ_INSERT_HEAD(&tx_frag_desc[j], node, list); + j = (i / (XLR_MAX_TX_DESC_NODES / xlr_total_active_core)); + } +} + +static inline struct p2d_tx_desc * +get_p2d_desc(void) +{ + struct tx_desc_node *node; + struct p2d_tx_desc *tx_desc = NULL; + int cpu = xlr_cpu_id(); + + mtx_lock_spin(&tx_desc_lock[cpu]); + node = TAILQ_FIRST(&tx_frag_desc[cpu]); + if (node) { + xlr_tot_avail_p2d[cpu]--; + TAILQ_REMOVE(&tx_frag_desc[cpu], node, list); + tx_desc = node->ptr; + TAILQ_INSERT_HEAD(&free_tx_frag_desc[cpu], node, list); + } else { + /* Increment p2d desc fail count */ + get_p2d_desc_failed++; + } + mtx_unlock_spin(&tx_desc_lock[cpu]); + return tx_desc; +} +static void +free_p2d_desc(struct p2d_tx_desc *tx_desc) +{ + struct tx_desc_node *node; + int cpu = xlr_cpu_id(); + + mtx_lock_spin(&tx_desc_lock[cpu]); + node = TAILQ_FIRST(&free_tx_frag_desc[cpu]); + KASSERT((node != NULL), ("Free TX frag node list is empty\n")); + + TAILQ_REMOVE(&free_tx_frag_desc[cpu], node, list); + node->ptr = tx_desc; + TAILQ_INSERT_HEAD(&tx_frag_desc[cpu], node, list); + xlr_tot_avail_p2d[cpu]++; + mtx_unlock_spin(&tx_desc_lock[cpu]); + +} + +static int +build_frag_list(struct mbuf *m_head, struct msgrng_msg *p2p_msg, struct p2d_tx_desc *tx_desc) +{ + struct mbuf *m; + vm_paddr_t paddr; + uint64_t p2d_len; + int nfrag; + vm_paddr_t p1, p2; + uint32_t len1, len2; + vm_offset_t taddr; + uint64_t fr_stid; + + fr_stid = (xlr_cpu_id() << 3) + xlr_thr_id() + 4; + + if (tx_desc == NULL) + return 1; + + nfrag = 0; + for (m = m_head; m != NULL; m = m->m_next) { + if ((nfrag + 1) >= XLR_MAX_TX_FRAGS) { + free_p2d_desc(tx_desc); + return 1; + } + if (m->m_len != 0) { + paddr = vtophys(mtod(m, vm_offset_t)); + p1 = paddr + m->m_len; + p2 = vtophys(((vm_offset_t)m->m_data + m->m_len)); + if (p1 != p2) { + len1 = (uint32_t) + (PAGE_SIZE - (paddr & PAGE_MASK)); + tx_desc->frag[nfrag] = (127ULL << 54) | + ((uint64_t) len1 << 40) | paddr; + nfrag++; + taddr = (vm_offset_t)m->m_data + len1; + p2 = vtophys(taddr); + len2 = m->m_len - len1; + if (len2 == 0) + continue; + if (nfrag >= XLR_MAX_TX_FRAGS) + panic("TX frags exceeded"); + + tx_desc->frag[nfrag] = (127ULL << 54) | + ((uint64_t) len2 << 40) | p2; + + taddr += len2; + p1 = vtophys(taddr); + + if ((p2 + len2) != p1) { + printf("p1 = %p p2 = %p\n", (void *)p1, (void *)p2); + printf("len1 = %x len2 = %x\n", len1, + len2); + printf("m_data %p\n", m->m_data); + DELAY(1000000); + panic("Multiple Mbuf segment discontiguous\n"); + } + } else { + tx_desc->frag[nfrag] = (127ULL << 54) | + ((uint64_t) m->m_len << 40) | paddr; + } + nfrag++; + } + } + /* set eop in the last tx p2d desc */ + tx_desc->frag[nfrag - 1] |= (1ULL << 63); + paddr = vtophys((vm_offset_t)tx_desc); + tx_desc->frag[nfrag] = (1ULL << 63) | (fr_stid << 54) | paddr; + nfrag++; + tx_desc->frag[XLR_MAX_TX_FRAGS] = (uint64_t) (vm_offset_t)tx_desc; + tx_desc->frag[XLR_MAX_TX_FRAGS + 1] = (uint64_t) (vm_offset_t)m_head; + + p2d_len = (nfrag * 8); + p2p_msg->msg0 = (1ULL << 63) | (1ULL << 62) | (127ULL << 54) | + (p2d_len << 40) | paddr; + + return 0; +} +static void +release_tx_desc(struct msgrng_msg *msg, int rel_buf) +{ + /* + * OLD code: vm_paddr_t paddr = msg->msg0 & 0xffffffffffULL; + * uint64_t temp; struct p2d_tx_desc *tx_desc; struct mbuf *m; + * + * paddr += (XLR_MAX_TX_FRAGS * sizeof(uint64_t)); *** In o32 we will + * crash here ****** temp = ld_40bit_phys(paddr, 3); tx_desc = + * (struct p2d_tx_desc *)((vm_offset_t)temp); + * + * if (rel_buf) { paddr += sizeof(uint64_t); + * + * temp = ld_40bit_phys(paddr, 3); + * + * m = (struct mbuf *)((vm_offset_t)temp); m_freem(m); } printf("Call + * fre_p2d_desc\n"); free_p2d_desc(tx_desc); + */ + struct p2d_tx_desc *tx_desc, *chk_addr; + struct mbuf *m; + + tx_desc = (struct p2d_tx_desc *)MIPS_PHYS_TO_KSEG0(msg->msg0); + chk_addr = (struct p2d_tx_desc *)(uint32_t) (tx_desc->frag[XLR_MAX_TX_FRAGS] & 0x00000000ffffffff); + if (tx_desc != chk_addr) { + printf("Address %p does not match with stored addr %p - we leaked a descriptor\n", + tx_desc, chk_addr); + return; + } + if (rel_buf) { + m = (struct mbuf *)(uint32_t) (tx_desc->frag[XLR_MAX_TX_FRAGS + 1] & 0x00000000ffffffff); + m_freem(m); + } + free_p2d_desc(tx_desc); +} + +#ifdef RX_COPY +#define RGE_MAX_NUM_DESC (6 * MAX_NUM_DESC) +uint8_t *rge_rx_buffers[RGE_MAX_NUM_DESC]; +static struct mtx rge_rx_mtx; +int g_rx_buf_head; + +static void +init_rx_buf(void) +{ + int i; + uint8_t *buf, *start; + uint32_t size, *ptr; + + mtx_init(&rge_rx_mtx, "xlr rx_desc", NULL, MTX_SPIN); + + size = (RGE_MAX_NUM_DESC * (MAX_FRAME_SIZE + XLR_CACHELINE_SIZE)); + + start = (uint8_t *) contigmalloc(size, M_DEVBUF, M_NOWAIT | M_ZERO, + 0, 0xffffffff, XLR_CACHELINE_SIZE, 0); + if (start == NULL) + panic("NO RX BUFFERS"); + buf = start; + size = (MAX_FRAME_SIZE + XLR_CACHELINE_SIZE); + for (i = 0; i < RGE_MAX_NUM_DESC; i++) { + buf = start + (i * size); + ptr = (uint32_t *) buf; + *ptr = (uint32_t) buf; + rge_rx_buffers[i] = buf + XLR_CACHELINE_SIZE; + } +} + +static void * +get_rx_buf(void) +{ + void *ptr = NULL; + + mtx_lock_spin(&rge_rx_mtx); + if (g_rx_buf_head < RGE_MAX_NUM_DESC) { + ptr = (void *)rge_rx_buffers[g_rx_buf_head]; + g_rx_buf_head++; + } + mtx_unlock_spin(&rge_rx_mtx); + return ptr; +} + +#endif + +static struct mbuf * +get_mbuf(void) +{ + struct mbuf *m_new = NULL; + + if ((m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR)) == NULL) + return NULL; + + m_new->m_len = MCLBYTES; + m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; + return m_new; +} + +static void +free_buf(vm_paddr_t paddr) +{ + struct mbuf *m; + uint32_t *temp; + uint32_t mag, um; + + /* + * This will crash I think. RRS temp = lw_40bit_phys((paddr - + * XLR_CACHELINE_SIZE), 3); m = (struct mbuf *)temp; + */ + /* + * This gets us a kseg0 address for the mbuf/magic on the ring but + * we need to get the va to free the mbuf. This is stored at *temp; + */ + temp = (uint32_t *) MIPS_PHYS_TO_KSEG0(paddr - XLR_CACHELINE_SIZE); + um = temp[0]; + mag = temp[1]; + if (mag != 0xf00bad) { + printf("Something is wrong kseg:%p found mag:%x not 0xf00bad\n", + temp, mag); + return; + } + m = (struct mbuf *)um; + if (m != NULL) + m_freem(m); +} + +static void * +get_buf(void) +{ +#ifdef RX_COPY + return get_rx_buf(); +#else + struct mbuf *m_new = NULL; + +#ifdef INVARIANTS + vm_paddr_t temp1, temp2; + +#endif + unsigned int *md; + + m_new = get_mbuf(); + + if (m_new == NULL) + return NULL; + + m_adj(m_new, XLR_CACHELINE_SIZE - ((unsigned int)m_new->m_data & 0x1f)); + md = (unsigned int *)m_new->m_data; + md[0] = (unsigned int)m_new; /* Back Ptr */ + md[1] = 0xf00bad; + m_adj(m_new, XLR_CACHELINE_SIZE); + + + /* return (void *)m_new; */ +#ifdef INVARIANTS + temp1 = vtophys((vm_offset_t)m_new->m_data); + temp2 = vtophys((vm_offset_t)m_new->m_data + 1536); + if ((temp1 + 1536) != temp2) + panic("ALLOCED BUFFER IS NOT CONTIGUOUS\n"); +#endif + return (void *)m_new->m_data; +#endif +} + +/********************************************************************** + **********************************************************************/ +static void +rmi_xlr_mac_set_enable(struct driver_data *priv, int flag) +{ + uint32_t regval; + int tx_threshold = 1518; + + if (flag) { + regval = xlr_read_reg(priv->mmio, R_TX_CONTROL); + regval |= (1 << O_TX_CONTROL__TxEnable) | + (tx_threshold << O_TX_CONTROL__TxThreshold); + + xlr_write_reg(priv->mmio, R_TX_CONTROL, regval); + + regval = xlr_read_reg(priv->mmio, R_RX_CONTROL); + regval |= 1 << O_RX_CONTROL__RxEnable; + if (priv->mode == XLR_PORT0_RGMII) + regval |= 1 << O_RX_CONTROL__RGMII; + xlr_write_reg(priv->mmio, R_RX_CONTROL, regval); + + regval = xlr_read_reg(priv->mmio, R_MAC_CONFIG_1); + regval |= (O_MAC_CONFIG_1__txen | O_MAC_CONFIG_1__rxen); + xlr_write_reg(priv->mmio, R_MAC_CONFIG_1, regval); + } else { + regval = xlr_read_reg(priv->mmio, R_TX_CONTROL); + regval &= ~((1 << O_TX_CONTROL__TxEnable) | + (tx_threshold << O_TX_CONTROL__TxThreshold)); + + xlr_write_reg(priv->mmio, R_TX_CONTROL, regval); + + regval = xlr_read_reg(priv->mmio, R_RX_CONTROL); + regval &= ~(1 << O_RX_CONTROL__RxEnable); + xlr_write_reg(priv->mmio, R_RX_CONTROL, regval); + + regval = xlr_read_reg(priv->mmio, R_MAC_CONFIG_1); + regval &= ~(O_MAC_CONFIG_1__txen | O_MAC_CONFIG_1__rxen); + xlr_write_reg(priv->mmio, R_MAC_CONFIG_1, regval); + } +} + +/********************************************************************** + **********************************************************************/ +static __inline__ int +xlr_mac_send_fr(struct driver_data *priv, + vm_paddr_t addr, int len) +{ + int stid = priv->rfrbucket; + struct msgrng_msg msg; + int vcpu = (xlr_cpu_id() << 2) + xlr_thr_id(); + + mac_make_desc_rfr(&msg, addr); + + /* Send the packet to MAC */ + dbg_msg("mac_%d: Sending free packet %llx to stid %d\n", + priv->instance, addr, stid); + if (priv->type == XLR_XGMAC) { + while (message_send(1, MSGRNG_CODE_XGMAC, stid, &msg)); + } else { + while (message_send(1, MSGRNG_CODE_MAC, stid, &msg)); + xlr_rge_repl_done[vcpu]++; + } + + return 0; +} + +/**************************************************************/ + +static void +xgmac_mdio_setup(volatile unsigned int *_mmio) +{ + int i; + uint32_t rd_data; + + for (i = 0; i < 4; i++) { + rd_data = xmdio_read(_mmio, 1, 0x8000 + i); + rd_data = rd_data & 0xffffdfff; /* clear isolate bit */ + xmdio_write(_mmio, 1, 0x8000 + i, rd_data); + } +} + +/********************************************************************** + * Init MII interface + * + * Input parameters: + * s - priv structure + ********************************************************************* */ +#define PHY_STATUS_RETRIES 25000 + +static void +rmi_xlr_mac_mii_init(struct driver_data *priv) +{ + xlr_reg_t *mii_mmio = priv->mii_mmio; + + /* use the lowest clock divisor - divisor 28 */ + xlr_write_reg(mii_mmio, R_MII_MGMT_CONFIG, 0x07); +} + +/********************************************************************** + * Read a PHY register. + * + * Input parameters: + * s - priv structure + * phyaddr - PHY's address + * regidx = index of register to read + * + * Return value: + * value read, or 0 if an error occurred. + ********************************************************************* */ + +static int +rge_mii_read_internal(xlr_reg_t * mii_mmio, int phyaddr, int regidx) +{ + int i = 0; + + /* setup the phy reg to be used */ + xlr_write_reg(mii_mmio, R_MII_MGMT_ADDRESS, + (phyaddr << 8) | (regidx << 0)); + /* Issue the read command */ + xlr_write_reg(mii_mmio, R_MII_MGMT_COMMAND, + (1 << O_MII_MGMT_COMMAND__rstat)); + + /* poll for the read cycle to complete */ + for (i = 0; i < PHY_STATUS_RETRIES; i++) { + if (xlr_read_reg(mii_mmio, R_MII_MGMT_INDICATORS) == 0) + break; + } + + /* clear the read cycle */ + xlr_write_reg(mii_mmio, R_MII_MGMT_COMMAND, 0); + + if (i == PHY_STATUS_RETRIES) { + return 0xffffffff; + } + /* Read the data back */ + return xlr_read_reg(mii_mmio, R_MII_MGMT_STATUS); +} + +static int +rge_mii_read(device_t dev, int phyaddr, int regidx) +{ + struct rge_softc *sc = device_get_softc(dev); + + return rge_mii_read_internal(sc->priv.mii_mmio, phyaddr, regidx); +} + +/********************************************************************** + * Set MII hooks to newly selected media + * + * Input parameters: + * ifp - Interface Pointer + * + * Return value: + * nothing + ********************************************************************* */ +static int +rmi_xlr_mac_mediachange(struct ifnet *ifp) +{ + struct rge_softc *sc = ifp->if_softc; + + if (ifp->if_flags & IFF_UP) + mii_mediachg(&sc->rge_mii); + + return 0; +} + +/********************************************************************** + * Get the current interface media status + * + * Input parameters: + * ifp - Interface Pointer + * ifmr - Interface media request ptr + * + * Return value: + * nothing + ********************************************************************* */ +static void +rmi_xlr_mac_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + struct rge_softc *sc = ifp->if_softc; + + /* Check whether this is interface is active or not. */ + ifmr->ifm_status = IFM_AVALID; + if (sc->link_up) { + ifmr->ifm_status |= IFM_ACTIVE; + } else { + ifmr->ifm_active = IFM_ETHER; + } +} + +/********************************************************************** + * Write a value to a PHY register. + * + * Input parameters: + * s - priv structure + * phyaddr - PHY to use + * regidx - register within the PHY + * regval - data to write to register + * + * Return value: + * nothing + ********************************************************************* */ +static void +rge_mii_write_internal(xlr_reg_t * mii_mmio, int phyaddr, int regidx, int regval) +{ + int i = 0; + + xlr_write_reg(mii_mmio, R_MII_MGMT_ADDRESS, + (phyaddr << 8) | (regidx << 0)); + + /* Write the data which starts the write cycle */ + xlr_write_reg(mii_mmio, R_MII_MGMT_WRITE_DATA, regval); + + /* poll for the write cycle to complete */ + for (i = 0; i < PHY_STATUS_RETRIES; i++) { + if (xlr_read_reg(mii_mmio, R_MII_MGMT_INDICATORS) == 0) + break; + } + + return; +} + +static int +rge_mii_write(device_t dev, int phyaddr, int regidx, int regval) +{ + struct rge_softc *sc = device_get_softc(dev); + + rge_mii_write_internal(sc->priv.mii_mmio, phyaddr, regidx, regval); + return (0); +} + +static void +rmi_xlr_mac_mii_statchg(struct device *dev) +{ +} + +static void +serdes_regs_init(struct driver_data *priv) +{ + xlr_reg_t *mmio_gpio = (xlr_reg_t *) (xlr_io_base + XLR_IO_GPIO_OFFSET); + int i; + + /* Initialize SERDES CONTROL Registers */ + rge_mii_write_internal(priv->serdes_mmio, 26, 0, 0x6DB0); + rge_mii_write_internal(priv->serdes_mmio, 26, 1, 0xFFFF); + rge_mii_write_internal(priv->serdes_mmio, 26, 2, 0xB6D0); + rge_mii_write_internal(priv->serdes_mmio, 26, 3, 0x00FF); + rge_mii_write_internal(priv->serdes_mmio, 26, 4, 0x0000); + rge_mii_write_internal(priv->serdes_mmio, 26, 5, 0x0000); + rge_mii_write_internal(priv->serdes_mmio, 26, 6, 0x0005); + rge_mii_write_internal(priv->serdes_mmio, 26, 7, 0x0001); + rge_mii_write_internal(priv->serdes_mmio, 26, 8, 0x0000); + rge_mii_write_internal(priv->serdes_mmio, 26, 9, 0x0000); + rge_mii_write_internal(priv->serdes_mmio, 26, 10, 0x0000); + + /* + * For loop delay and GPIO programming crud from Linux driver, + */ + for (i = 0; i < 10000000; i++) { + } + mmio_gpio[0x20] = 0x7e6802; + mmio_gpio[0x10] = 0x7104; + for (i = 0; i < 100000000; i++) { + } + return; +} + +static void +serdes_autoconfig(struct driver_data *priv) +{ + int delay = 100000; + + /* Enable Auto negotiation in the PCS Layer */ + rge_mii_write_internal(priv->pcs_mmio, 27, 0, 0x1000); + DELAY(delay); + rge_mii_write_internal(priv->pcs_mmio, 27, 0, 0x0200); + DELAY(delay); + + rge_mii_write_internal(priv->pcs_mmio, 28, 0, 0x1000); + DELAY(delay); + rge_mii_write_internal(priv->pcs_mmio, 28, 0, 0x0200); + DELAY(delay); + + rge_mii_write_internal(priv->pcs_mmio, 29, 0, 0x1000); + DELAY(delay); + rge_mii_write_internal(priv->pcs_mmio, 29, 0, 0x0200); + DELAY(delay); + + rge_mii_write_internal(priv->pcs_mmio, 30, 0, 0x1000); + DELAY(delay); + rge_mii_write_internal(priv->pcs_mmio, 30, 0, 0x0200); + DELAY(delay); + +} + +/***************************************************************** + * Initialize GMAC + *****************************************************************/ +static void +rmi_xlr_config_pde(struct driver_data *priv) +{ + int i = 0, cpu = 0, bucket = 0; + uint64_t bucket_map = 0; + + /* uint32_t desc_pack_ctrl = 0; */ + uint32_t cpumask; + + cpumask = PCPU_GET(cpumask) | PCPU_GET(other_cpus); + + for (i = 0; i < 32; i++) { + if (cpumask & (1 << i)) { + cpu = cpu_ltop_map[i]; + bucket = ((cpu >> 2) << 3); + //|(cpu & 0x03); + bucket_map |= (1ULL << bucket); + dbg_msg("i=%d, cpu=%d, bucket = %d, bucket_map=%llx\n", + i, cpu, bucket, bucket_map); + } + } + + /* bucket_map = 0x1; */ + xlr_write_reg(priv->mmio, R_PDE_CLASS_0, (bucket_map & 0xffffffff)); + xlr_write_reg(priv->mmio, R_PDE_CLASS_0 + 1, + ((bucket_map >> 32) & 0xffffffff)); + + xlr_write_reg(priv->mmio, R_PDE_CLASS_1, (bucket_map & 0xffffffff)); + xlr_write_reg(priv->mmio, R_PDE_CLASS_1 + 1, + ((bucket_map >> 32) & 0xffffffff)); + + xlr_write_reg(priv->mmio, R_PDE_CLASS_2, (bucket_map & 0xffffffff)); + xlr_write_reg(priv->mmio, R_PDE_CLASS_2 + 1, + ((bucket_map >> 32) & 0xffffffff)); + + xlr_write_reg(priv->mmio, R_PDE_CLASS_3, (bucket_map & 0xffffffff)); + xlr_write_reg(priv->mmio, R_PDE_CLASS_3 + 1, + ((bucket_map >> 32) & 0xffffffff)); +} + +static void +rmi_xlr_config_parser(struct driver_data *priv) +{ + /* + * Mark it as no classification The parser extract is gauranteed to + * be zero with no classfication + */ + xlr_write_reg(priv->mmio, R_L2TYPE_0, 0x00); + + xlr_write_reg(priv->mmio, R_L2TYPE_0, 0x01); + + /* configure the parser : L2 Type is configured in the bootloader */ + /* extract IP: src, dest protocol */ + xlr_write_reg(priv->mmio, R_L3CTABLE, + (9 << 20) | (1 << 19) | (1 << 18) | (0x01 << 16) | + (0x0800 << 0)); + xlr_write_reg(priv->mmio, R_L3CTABLE + 1, + (12 << 25) | (4 << 21) | (16 << 14) | (4 << 10)); + +} + +static void +rmi_xlr_config_classifier(struct driver_data *priv) +{ + int i = 0; + + if (priv->type == XLR_XGMAC) { + /* xgmac translation table doesn't have sane values on reset */ + for (i = 0; i < 64; i++) + xlr_write_reg(priv->mmio, R_TRANSLATETABLE + i, 0x0); + + /* + * use upper 7 bits of the parser extract to index the + * translate table + */ + xlr_write_reg(priv->mmio, R_PARSERCONFIGREG, 0x0); + } +} + +enum { + SGMII_SPEED_10 = 0x00000000, + SGMII_SPEED_100 = 0x02000000, + SGMII_SPEED_1000 = 0x04000000, +}; + +static void +rmi_xlr_gmac_config_speed(struct driver_data *priv) +{ + int phy_addr = priv->phy_addr; + xlr_reg_t *mmio = priv->mmio; + struct rge_softc *sc = priv->sc; + + priv->speed = rge_mii_read_internal(priv->mii_mmio, phy_addr, 28); + priv->link = rge_mii_read_internal(priv->mii_mmio, phy_addr, 1) & 0x4; + priv->speed = (priv->speed >> 3) & 0x03; + + if (priv->speed == xlr_mac_speed_10) { + if (priv->mode != XLR_RGMII) + xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_10); + xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7137); + xlr_write_reg(mmio, R_CORECONTROL, 0x02); + printf("%s: [10Mbps]\n", device_get_nameunit(sc->rge_dev)); + sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_10_T | IFM_FDX; + sc->rge_mii.mii_media.ifm_cur->ifm_media = IFM_ETHER | IFM_AUTO | IFM_10_T | IFM_FDX; + sc->rge_mii.mii_media_active = IFM_ETHER | IFM_AUTO | IFM_10_T | IFM_FDX; + } else if (priv->speed == xlr_mac_speed_100) { + if (priv->mode != XLR_RGMII) + xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_100); + xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7137); + xlr_write_reg(mmio, R_CORECONTROL, 0x01); + printf("%s: [100Mbps]\n", device_get_nameunit(sc->rge_dev)); + sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX; + sc->rge_mii.mii_media.ifm_cur->ifm_media = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX; + sc->rge_mii.mii_media_active = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX; + } else { + if (priv->speed != xlr_mac_speed_1000) { + if (priv->mode != XLR_RGMII) + xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_100); + printf("PHY reported unknown MAC speed, defaulting to 100Mbps\n"); + xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7137); + xlr_write_reg(mmio, R_CORECONTROL, 0x01); + sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX; + sc->rge_mii.mii_media.ifm_cur->ifm_media = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX; + sc->rge_mii.mii_media_active = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX; + } else { + if (priv->mode != XLR_RGMII) + xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_1000); + xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7237); + xlr_write_reg(mmio, R_CORECONTROL, 0x00); + printf("%s: [1000Mbps]\n", device_get_nameunit(sc->rge_dev)); + sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_1000_T | IFM_FDX; + sc->rge_mii.mii_media.ifm_cur->ifm_media = IFM_ETHER | IFM_AUTO | IFM_1000_T | IFM_FDX; + sc->rge_mii.mii_media_active = IFM_ETHER | IFM_AUTO | IFM_1000_T | IFM_FDX; + } + } + + if (!priv->link) { + sc->rge_mii.mii_media.ifm_cur->ifm_media = IFM_ETHER; + sc->link_up = 0; + } else { + sc->link_up = 1; + } +} + +/***************************************************************** + * Initialize XGMAC + *****************************************************************/ +static void +rmi_xlr_xgmac_init(struct driver_data *priv) +{ + int i = 0; + xlr_reg_t *mmio = priv->mmio; + int id = priv->instance; + struct rge_softc *sc = priv->sc; + volatile unsigned short *cpld; + + cpld = (volatile unsigned short *)0xBD840000; + + xlr_write_reg(priv->mmio, R_DESC_PACK_CTRL, + (MAX_FRAME_SIZE << O_DESC_PACK_CTRL__RegularSize) | (4 << 20)); + xlr_write_reg(priv->mmio, R_BYTEOFFSET0, BYTE_OFFSET); + rmi_xlr_config_pde(priv); + rmi_xlr_config_parser(priv); + rmi_xlr_config_classifier(priv); + + xlr_write_reg(priv->mmio, R_MSG_TX_THRESHOLD, 1); + + /* configure the XGMAC Registers */ + xlr_write_reg(mmio, R_XGMAC_CONFIG_1, 0x50000026); + + /* configure the XGMAC_GLUE Registers */ + xlr_write_reg(mmio, R_DMACR0, 0xffffffff); + xlr_write_reg(mmio, R_DMACR1, 0xffffffff); + xlr_write_reg(mmio, R_DMACR2, 0xffffffff); + xlr_write_reg(mmio, R_DMACR3, 0xffffffff); + xlr_write_reg(mmio, R_STATCTRL, 0x04); + xlr_write_reg(mmio, R_L2ALLOCCTRL, 0xffffffff); + + xlr_write_reg(mmio, R_XGMACPADCALIBRATION, 0x030); + xlr_write_reg(mmio, R_EGRESSFIFOCARVINGSLOTS, 0x0f); + xlr_write_reg(mmio, R_L2ALLOCCTRL, 0xffffffff); + xlr_write_reg(mmio, R_XGMAC_MIIM_CONFIG, 0x3e); + + /* + * take XGMII phy out of reset + */ + /* + * we are pulling everything out of reset because writing a 0 would + * reset other devices on the chip + */ + cpld[ATX_CPLD_RESET_1] = 0xffff; + cpld[ATX_CPLD_MISC_CTRL] = 0xffff; + cpld[ATX_CPLD_RESET_2] = 0xffff; + + xgmac_mdio_setup(mmio); + + rmi_xlr_config_spill_area(priv); + + if (id == 0) { + for (i = 0; i < 16; i++) { + xlr_write_reg(mmio, R_XGS_TX0_BUCKET_SIZE + i, + bucket_sizes. + bucket[MSGRNG_STNID_XGS0_TX + i]); + } + + xlr_write_reg(mmio, R_XGS_JFR_BUCKET_SIZE, + bucket_sizes.bucket[MSGRNG_STNID_XMAC0JFR]); + xlr_write_reg(mmio, R_XGS_RFR_BUCKET_SIZE, + bucket_sizes.bucket[MSGRNG_STNID_XMAC0RFR]); + + for (i = 0; i < MAX_NUM_MSGRNG_STN_CC; i++) { + xlr_write_reg(mmio, R_CC_CPU0_0 + i, + cc_table_xgs_0. + counters[i >> 3][i & 0x07]); + } + } else if (id == 1) { + for (i = 0; i < 16; i++) { + xlr_write_reg(mmio, R_XGS_TX0_BUCKET_SIZE + i, + bucket_sizes. + bucket[MSGRNG_STNID_XGS1_TX + i]); + } + + xlr_write_reg(mmio, R_XGS_JFR_BUCKET_SIZE, + bucket_sizes.bucket[MSGRNG_STNID_XMAC1JFR]); + xlr_write_reg(mmio, R_XGS_RFR_BUCKET_SIZE, + bucket_sizes.bucket[MSGRNG_STNID_XMAC1RFR]); + + for (i = 0; i < MAX_NUM_MSGRNG_STN_CC; i++) { + xlr_write_reg(mmio, R_CC_CPU0_0 + i, + cc_table_xgs_1. + counters[i >> 3][i & 0x07]); + } + } + sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_10G_SR | IFM_FDX; + sc->rge_mii.mii_media.ifm_media |= (IFM_AVALID | IFM_ACTIVE); + sc->rge_mii.mii_media.ifm_cur->ifm_media = IFM_ETHER | IFM_AUTO | IFM_10G_SR | IFM_FDX; + sc->rge_mii.mii_media_active = IFM_ETHER | IFM_AUTO | IFM_10G_SR | IFM_FDX; + sc->rge_mii.mii_media.ifm_cur->ifm_media |= (IFM_AVALID | IFM_ACTIVE); + + priv->init_frin_desc = 1; +} + +/******************************************************* + * Initialization gmac + *******************************************************/ +static int +rmi_xlr_gmac_reset(struct driver_data *priv) +{ + volatile uint32_t val; + xlr_reg_t *mmio = priv->mmio; + int i, maxloops = 100; + + /* Disable MAC RX */ + val = xlr_read_reg(mmio, R_MAC_CONFIG_1); + val &= ~0x4; + xlr_write_reg(mmio, R_MAC_CONFIG_1, val); + + /* Disable Core RX */ + val = xlr_read_reg(mmio, R_RX_CONTROL); + val &= ~0x1; + xlr_write_reg(mmio, R_RX_CONTROL, val); + + /* wait for rx to halt */ + for (i = 0; i < maxloops; i++) { + val = xlr_read_reg(mmio, R_RX_CONTROL); + if (val & 0x2) + break; + DELAY(1000); + } + if (i == maxloops) + return -1; + + /* Issue a soft reset */ + val = xlr_read_reg(mmio, R_RX_CONTROL); + val |= 0x4; + xlr_write_reg(mmio, R_RX_CONTROL, val); + + /* wait for reset to complete */ + for (i = 0; i < maxloops; i++) { + val = xlr_read_reg(mmio, R_RX_CONTROL); + if (val & 0x8) + break; + DELAY(1000); + } + if (i == maxloops) + return -1; + + /* Clear the soft reset bit */ + val = xlr_read_reg(mmio, R_RX_CONTROL); + val &= ~0x4; + xlr_write_reg(mmio, R_RX_CONTROL, val); + return 0; +} + +static void +rmi_xlr_gmac_init(struct driver_data *priv) +{ + int i = 0; + xlr_reg_t *mmio = priv->mmio; + int id = priv->instance; + struct stn_cc *gmac_cc_config; + uint32_t value = 0; + int blk = id / 4, port = id % 4; + + rmi_xlr_mac_set_enable(priv, 0); + + rmi_xlr_config_spill_area(priv); + + xlr_write_reg(mmio, R_DESC_PACK_CTRL, + (BYTE_OFFSET << O_DESC_PACK_CTRL__ByteOffset) | + (1 << O_DESC_PACK_CTRL__MaxEntry) | + (MAX_FRAME_SIZE << O_DESC_PACK_CTRL__RegularSize)); + + rmi_xlr_config_pde(priv); + rmi_xlr_config_parser(priv); + rmi_xlr_config_classifier(priv); + + xlr_write_reg(mmio, R_MSG_TX_THRESHOLD, 3); + xlr_write_reg(mmio, R_MAC_CONFIG_1, 0x35); + xlr_write_reg(mmio, R_RX_CONTROL, (0x7 << 6)); + + if (priv->mode == XLR_PORT0_RGMII) { + printf("Port 0 set in RGMII mode\n"); + value = xlr_read_reg(mmio, R_RX_CONTROL); + value |= 1 << O_RX_CONTROL__RGMII; + xlr_write_reg(mmio, R_RX_CONTROL, value); + } + rmi_xlr_mac_mii_init(priv); + + +#if 0 + priv->advertising = ADVERTISED_10baseT_Full | ADVERTISED_10baseT_Half | + ADVERTISED_100baseT_Full | ADVERTISED_100baseT_Half | + ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg | + ADVERTISED_MII; +#endif + + /* + * Enable all MDIO interrupts in the phy RX_ER bit seems to be get + * set about every 1 sec in GigE mode, ignore it for now... + */ + rge_mii_write_internal(priv->mii_mmio, priv->phy_addr, 25, 0xfffffffe); + + if (priv->mode != XLR_RGMII) { + serdes_regs_init(priv); + serdes_autoconfig(priv); + } + rmi_xlr_gmac_config_speed(priv); + + value = xlr_read_reg(mmio, R_IPG_IFG); + xlr_write_reg(mmio, R_IPG_IFG, ((value & ~0x7f) | MAC_B2B_IPG)); + xlr_write_reg(mmio, R_DMACR0, 0xffffffff); + xlr_write_reg(mmio, R_DMACR1, 0xffffffff); + xlr_write_reg(mmio, R_DMACR2, 0xffffffff); + xlr_write_reg(mmio, R_DMACR3, 0xffffffff); + xlr_write_reg(mmio, R_STATCTRL, 0x04); + xlr_write_reg(mmio, R_L2ALLOCCTRL, 0xffffffff); + xlr_write_reg(mmio, R_INTMASK, 0); + xlr_write_reg(mmio, R_FREEQCARVE, 0); + + xlr_write_reg(mmio, R_GMAC_TX0_BUCKET_SIZE + port, + xlr_board_info.bucket_sizes->bucket[priv->txbucket]); + xlr_write_reg(mmio, R_GMAC_JFR0_BUCKET_SIZE, + xlr_board_info.bucket_sizes->bucket[MSGRNG_STNID_GMACJFR_0]); + xlr_write_reg(mmio, R_GMAC_RFR0_BUCKET_SIZE, + xlr_board_info.bucket_sizes->bucket[MSGRNG_STNID_GMACRFR_0]); + xlr_write_reg(mmio, R_GMAC_JFR1_BUCKET_SIZE, + xlr_board_info.bucket_sizes->bucket[MSGRNG_STNID_GMACJFR_1]); + xlr_write_reg(mmio, R_GMAC_RFR1_BUCKET_SIZE, + xlr_board_info.bucket_sizes->bucket[MSGRNG_STNID_GMACRFR_1]); + + dbg_msg("Programming credit counter %d : %d -> %d\n", blk, R_GMAC_TX0_BUCKET_SIZE + port, + xlr_board_info.bucket_sizes->bucket[priv->txbucket]); + + gmac_cc_config = xlr_board_info.gmac_block[blk].credit_config; + for (i = 0; i < MAX_NUM_MSGRNG_STN_CC; i++) { + xlr_write_reg(mmio, R_CC_CPU0_0 + i, + gmac_cc_config->counters[i >> 3][i & 0x07]); + dbg_msg("%d: %d -> %d\n", priv->instance, + R_CC_CPU0_0 + i, gmac_cc_config->counters[i >> 3][i & 0x07]); + } + priv->init_frin_desc = 1; +} + +/********************************************************************** + * Set promiscuous mode + **********************************************************************/ +static void +xlr_mac_set_rx_mode(struct rge_softc *sc) +{ + struct driver_data *priv = &(sc->priv); + uint32_t regval; + + regval = xlr_read_reg(priv->mmio, R_MAC_FILTER_CONFIG); + + if (sc->flags & IFF_PROMISC) { + regval |= (1 << O_MAC_FILTER_CONFIG__BROADCAST_EN) | + (1 << O_MAC_FILTER_CONFIG__PAUSE_FRAME_EN) | + (1 << O_MAC_FILTER_CONFIG__ALL_MCAST_EN) | + (1 << O_MAC_FILTER_CONFIG__ALL_UCAST_EN); + } else { + regval &= ~((1 << O_MAC_FILTER_CONFIG__PAUSE_FRAME_EN) | + (1 << O_MAC_FILTER_CONFIG__ALL_UCAST_EN)); + } + + xlr_write_reg(priv->mmio, R_MAC_FILTER_CONFIG, regval); +} + +/********************************************************************** + * Configure LAN speed for the specified MAC. + ********************************************************************* */ +static int +rmi_xlr_mac_set_speed(struct driver_data *s, xlr_mac_speed_t speed) +{ + return 0; +} + +/********************************************************************** + * Set Ethernet duplex and flow control options for this MAC + ********************************************************************* */ +static int +rmi_xlr_mac_set_duplex(struct driver_data *s, + xlr_mac_duplex_t duplex, xlr_mac_fc_t fc) +{ + return 0; +} + +/***************************************************************** + * Kernel Net Stack <-> MAC Driver Interface + *****************************************************************/ +/********************************************************************** + **********************************************************************/ +#define MAC_TX_FAIL 2 +#define MAC_TX_PASS 0 +#define MAC_TX_RETRY 1 + +static __inline__ void +message_send_block(unsigned int size, unsigned int code, + unsigned int stid, struct msgrng_msg *msg) +{ + unsigned int dest = 0; + unsigned long long status = 0; + + msgrng_load_tx_msg0(msg->msg0); + msgrng_load_tx_msg1(msg->msg1); + msgrng_load_tx_msg2(msg->msg2); + msgrng_load_tx_msg3(msg->msg3); + + dest = ((size - 1) << 16) | (code << 8) | (stid); + + do { + msgrng_send(dest); + status = msgrng_read_status(); + } while (status & 0x6); + +} + +int xlr_dev_queue_xmit_hack = 0; + +static int +mac_xmit(struct mbuf *m, struct rge_softc *sc, + struct driver_data *priv, int len, struct p2d_tx_desc *tx_desc) +{ + struct msgrng_msg msg; + int stid = priv->txbucket; + uint32_t tx_cycles = 0; + unsigned long mflags = 0; + int vcpu = PCPU_GET(cpuid); + int rv; + + tx_cycles = mips_rd_count(); + + if (build_frag_list(m, &msg, tx_desc) != 0) + return MAC_TX_FAIL; + + else { + msgrng_access_enable(mflags); + if ((rv = message_send_retry(1, MSGRNG_CODE_MAC, stid, &msg)) != 0) { + msg_snd_failed++; + msgrng_access_disable(mflags); + release_tx_desc(&msg, 0); + xlr_rge_msg_snd_failed[vcpu]++; + dbg_msg("Failed packet to cpu %d, rv = %d, stid %d, msg0=%llx\n", + vcpu, rv, stid, msg.msg0); + return MAC_TX_FAIL; + } + msgrng_access_disable(mflags); + port_inc_counter(priv->instance, PORT_TX); + } + + /* Send the packet to MAC */ + dbg_msg("Sent tx packet to stid %d, msg0=%llx, msg1=%llx \n", stid, msg.msg0, msg.msg1); +#ifdef DUMP_PACKETS + { + int i = 0; + unsigned char *buf = (char *)m->m_data; + + printf("Tx Packet: length=%d\n", len); + for (i = 0; i < 64; i++) { + if (i && (i % 16) == 0) + printf("\n"); + printf("%02x ", buf[i]); + } + printf("\n"); + } +#endif + xlr_inc_counter(NETIF_TX); + return MAC_TX_PASS; +} + +static int +rmi_xlr_mac_xmit(struct mbuf *m, struct rge_softc *sc, int len, struct p2d_tx_desc *tx_desc) +{ + struct driver_data *priv = &(sc->priv); + int ret = -ENOSPC; + + dbg_msg("IN\n"); + + xlr_inc_counter(NETIF_STACK_TX); + +retry: + ret = mac_xmit(m, sc, priv, len, tx_desc); + + if (ret == MAC_TX_RETRY) + goto retry; + + dbg_msg("OUT, ret = %d\n", ret); + if (ret == MAC_TX_FAIL) { + /* FULL */ + dbg_msg("Msg Ring Full. Stopping upper layer Q\n"); + port_inc_counter(priv->instance, PORT_STOPQ); + } + return ret; +} + +static void +mac_frin_replenish(void *args /* ignored */ ) +{ +#ifdef RX_COPY + return; +#else + int cpu = xlr_cpu_id(); + int done = 0; + int i = 0; + + xlr_inc_counter(REPLENISH_ENTER); + /* + * xlr_set_counter(REPLENISH_ENTER_COUNT, + * atomic_read(frin_to_be_sent)); + */ + xlr_set_counter(REPLENISH_CPU, PCPU_GET(cpuid)); + + for (;;) { + + done = 0; + + for (i = 0; i < XLR_MAX_MACS; i++) { + /* int offset = 0; */ + unsigned long msgrng_flags; + void *m; + uint32_t cycles; + struct rge_softc *sc; + struct driver_data *priv; + int frin_to_be_sent; + + sc = dev_mac[i]; + if (!sc) + goto skip; + + priv = &(sc->priv); + frin_to_be_sent = priv->frin_to_be_sent[cpu]; + + /* if (atomic_read(frin_to_be_sent) < 0) */ + if (frin_to_be_sent < 0) { + panic("BUG?: [%s]: gmac_%d illegal value for frin_to_be_sent=%d\n", + __FUNCTION__, i, + frin_to_be_sent); + } + /* if (!atomic_read(frin_to_be_sent)) */ + if (!frin_to_be_sent) + goto skip; + + cycles = mips_rd_count(); + { + m = get_buf(); + if (!m) { + device_printf(sc->rge_dev, "No buffer\n"); + goto skip; + } + } + xlr_inc_counter(REPLENISH_FRIN); + msgrng_access_enable(msgrng_flags); + if (xlr_mac_send_fr(priv, vtophys(m), MAX_FRAME_SIZE)) { + free_buf(vtophys(m)); + printf("[%s]: rx free message_send failed!\n", __FUNCTION__); + msgrng_access_disable(msgrng_flags); + break; + } + msgrng_access_disable(msgrng_flags); + xlr_set_counter(REPLENISH_CYCLES, + (read_c0_count() - cycles)); + atomic_subtract_int((&priv->frin_to_be_sent[cpu]), 1); + + continue; + skip: + done++; + } + if (done == XLR_MAX_MACS) + break; + } +#endif +} + +static volatile uint32_t g_tx_frm_tx_ok=0; + +static void +rge_tx_bkp_func(void *arg, int npending) +{ + int i = 0; + + for (i = 0; i < xlr_board_info.gmacports; i++) { + if (!dev_mac[i] || !dev_mac[i]->active) + continue; + rge_start_locked(dev_mac[i]->rge_ifp, RGE_TX_THRESHOLD); + } + atomic_subtract_int(&g_tx_frm_tx_ok, 1); +} + +/* This function is called from an interrupt handler */ +void +rmi_xlr_mac_msgring_handler(int bucket, int size, int code, + int stid, struct msgrng_msg *msg, + void *data /* ignored */ ) +{ + uint64_t phys_addr = 0; + unsigned long addr = 0; + uint32_t length = 0; + int ctrl = 0, port = 0; + struct rge_softc *sc = NULL; + struct driver_data *priv = 0; + struct ifnet *ifp; + int cpu = xlr_cpu_id(); + int vcpu = (cpu << 2) + xlr_thr_id(); + + dbg_msg("mac: bucket=%d, size=%d, code=%d, stid=%d, msg0=%llx msg1=%llx\n", + bucket, size, code, stid, msg->msg0, msg->msg1); + + phys_addr = (uint64_t) (msg->msg0 & 0xffffffffe0ULL); + length = (msg->msg0 >> 40) & 0x3fff; + if (length == 0) { + ctrl = CTRL_REG_FREE; + port = (msg->msg0 >> 54) & 0x0f; + addr = 0; + } else { + ctrl = CTRL_SNGL; + length = length - BYTE_OFFSET - MAC_CRC_LEN; + port = msg->msg0 & 0x0f; + addr = 0; + } + + if (xlr_board_info.is_xls) { + if (stid == MSGRNG_STNID_GMAC1) + port += 4; + sc = dev_mac[dev_mac_gmac0 + port]; + } else { + if (stid == MSGRNG_STNID_XGS0FR) + sc = dev_mac[dev_mac_xgs0]; + else if (stid == MSGRNG_STNID_XGS1FR) + sc = dev_mac[dev_mac_xgs0 + 1]; + else + sc = dev_mac[dev_mac_gmac0 + port]; + } + if (sc == NULL) + return; + priv = &(sc->priv); + + dbg_msg("msg0 = %llx, stid = %d, port = %d, addr=%lx, length=%d, ctrl=%d\n", + msg->msg0, stid, port, addr, length, ctrl); + + if (ctrl == CTRL_REG_FREE || ctrl == CTRL_JUMBO_FREE) { + xlr_rge_tx_ok_done[vcpu]++; + release_tx_desc(msg, 1); + ifp = sc->rge_ifp; + if (ifp->if_drv_flags & IFF_DRV_OACTIVE) { + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + } + if (atomic_cmpset_int(&g_tx_frm_tx_ok, 0, 1)) + rge_tx_bkp_func(NULL, 0); + xlr_set_counter(NETIF_TX_COMPLETE_CYCLES, + (read_c0_count() - msgrng_msg_cycles)); + } else if (ctrl == CTRL_SNGL || ctrl == CTRL_START) { + /* Rx Packet */ + /* struct mbuf *m = 0; */ + /* int logical_cpu = 0; */ + + dbg_msg("Received packet, port = %d\n", port); + /* + * if num frins to be sent exceeds threshold, wake up the + * helper thread + */ + atomic_add_int(&(priv->frin_to_be_sent[cpu]), 1); + if ((priv->frin_to_be_sent[cpu]) > MAC_FRIN_TO_BE_SENT_THRESHOLD) { + mac_frin_replenish(NULL); + } + dbg_msg("gmac_%d: rx packet: phys_addr = %llx, length = %x\n", + priv->instance, phys_addr, length); + mac_stats_add(priv->stats.rx_packets, 1); + mac_stats_add(priv->stats.rx_bytes, length); + xlr_inc_counter(NETIF_RX); + xlr_set_counter(NETIF_RX_CYCLES, + (read_c0_count() - msgrng_msg_cycles)); + rge_rx(sc, phys_addr, length); + xlr_rge_rx_done[vcpu]++; + } else { + printf("[%s]: unrecognized ctrl=%d!\n", __FUNCTION__, ctrl); + } + +} + +/********************************************************************** + **********************************************************************/ +static int +rge_probe(dev) + device_t dev; +{ + /* Always return 0 */ + return 0; +} + +volatile unsigned long xlr_debug_enabled; +struct callout rge_dbg_count; +static void +xlr_debug_count(void *addr) +{ + struct driver_data *priv = &dev_mac[0]->priv; + + /* uint32_t crdt; */ + if (xlr_debug_enabled) { + printf("\nAvailRxIn %#x\n", xlr_read_reg(priv->mmio, 0x23e)); + } + callout_reset(&rge_dbg_count, hz, xlr_debug_count, NULL); +} + + +static void +xlr_tx_q_wakeup(void *addr) +{ + int i = 0; + int j = 0; + + for (i = 0; i < xlr_board_info.gmacports; i++) { + if (!dev_mac[i] || !dev_mac[i]->active) + continue; + if ((dev_mac[i]->rge_ifp->if_drv_flags) & IFF_DRV_OACTIVE) { + for (j = 0; j < XLR_MAX_CORE; j++) { + if (xlr_tot_avail_p2d[j]) { + dev_mac[i]->rge_ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + break; + } + } + } + } + if (atomic_cmpset_int(&g_tx_frm_tx_ok, 0, 1)) + rge_tx_bkp_func(NULL, 0); + callout_reset(&xlr_tx_stop_bkp, 5 * hz, xlr_tx_q_wakeup, NULL); +} + +static int +rge_attach(device_t dev) +{ + struct ifnet *ifp; + struct rge_softc *sc; + struct driver_data *priv = 0; + int ret = 0; + struct xlr_gmac_block_t *gmac_conf = device_get_ivars(dev); + + sc = device_get_softc(dev); + sc->rge_dev = dev; + + /* Initialize mac's */ + sc->unit = device_get_unit(dev); + + if (sc->unit > XLR_MAX_MACS) { + ret = ENXIO; + goto out; + } + RGE_LOCK_INIT(sc, device_get_nameunit(dev)); + + priv = &(sc->priv); + priv->sc = sc; + + sc->flags = 0; /* TODO : fix me up later */ + + priv->id = sc->unit; + if (gmac_conf->type == XLR_GMAC) { + priv->instance = priv->id; + priv->mmio = (xlr_reg_t *) (xlr_io_base + gmac_conf->baseaddr + + 0x1000 * (sc->unit % 4)); + if ((ret = rmi_xlr_gmac_reset(priv)) == -1) + goto out; + } else if (gmac_conf->type == XLR_XGMAC) { + priv->instance = priv->id - xlr_board_info.gmacports; + priv->mmio = (xlr_reg_t *) (xlr_io_base + gmac_conf->baseaddr); + } + if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI) { + dbg_msg("Arizona board - offset 4 \n"); + priv->mii_mmio = (xlr_reg_t *) (xlr_io_base + XLR_IO_GMAC_4_OFFSET); + } else + priv->mii_mmio = (xlr_reg_t *) (xlr_io_base + XLR_IO_GMAC_0_OFFSET); + + priv->pcs_mmio = (xlr_reg_t *) (xlr_io_base + gmac_conf->baseaddr); + priv->serdes_mmio = (xlr_reg_t *) (xlr_io_base + XLR_IO_GMAC_0_OFFSET); + + sc->base_addr = (unsigned long)priv->mmio; + sc->mem_end = (unsigned long)priv->mmio + XLR_IO_SIZE - 1; + + sc->xmit = rge_start; + sc->stop = rge_stop; + sc->get_stats = rmi_xlr_mac_get_stats; + sc->ioctl = rge_ioctl; + + /* Initialize the device specific driver data */ + mtx_init(&priv->lock, "rge", NULL, MTX_SPIN); + + priv->type = gmac_conf->type; + + priv->mode = gmac_conf->mode; + if (xlr_board_info.is_xls == 0) { + if (xlr_board_atx_ii() && !xlr_board_atx_ii_b()) + priv->phy_addr = priv->instance - 2; + else + priv->phy_addr = priv->instance; + priv->mode = XLR_RGMII; + } else { + if (gmac_conf->mode == XLR_PORT0_RGMII && + priv->instance == 0) { + priv->mode = XLR_PORT0_RGMII; + priv->phy_addr = 0; + } else { + priv->mode = XLR_SGMII; + priv->phy_addr = priv->instance + 16; + } + } + + priv->txbucket = gmac_conf->station_txbase + priv->instance % 4; + priv->rfrbucket = gmac_conf->station_rfr; + priv->spill_configured = 0; + + dbg_msg("priv->mmio=%p\n", priv->mmio); + + /* Set up ifnet structure */ + ifp = sc->rge_ifp = if_alloc(IFT_ETHER); + if (ifp == NULL) { + device_printf(sc->rge_dev, "failed to if_alloc()\n"); + rge_release_resources(sc); + ret = ENXIO; + RGE_LOCK_DESTROY(sc); + goto out; + } + ifp->if_softc = sc; + if_initname(ifp, device_get_name(dev), device_get_unit(dev)); + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_ioctl = rge_ioctl; + ifp->if_start = rge_start; + ifp->if_init = rge_init; + ifp->if_mtu = ETHERMTU; + ifp->if_snd.ifq_drv_maxlen = RGE_TX_Q_SIZE; + IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); + IFQ_SET_READY(&ifp->if_snd); + sc->active = 1; + ifp->if_hwassist = 0; + ifp->if_capabilities = IFCAP_TXCSUM | IFCAP_VLAN_HWTAGGING; + ifp->if_capenable = ifp->if_capabilities; + + /* Initialize the rge_softc */ + sc->irq = gmac_conf->baseirq + priv->instance % 4; + + /* Set the IRQ into the rid field */ + /* + * note this is a hack to pass the irq to the iodi interrupt setup + * routines + */ + sc->rge_irq.__r_i = (struct resource_i *)sc->irq; + + ret = bus_setup_intr(dev, &sc->rge_irq, INTR_FAST | INTR_TYPE_NET | INTR_MPSAFE, + NULL, rge_intr, sc, &sc->rge_intrhand); + + if (ret) { + rge_detach(dev); + device_printf(sc->rge_dev, "couldn't set up irq\n"); + RGE_LOCK_DESTROY(sc); + goto out; + } + xlr_mac_get_hwaddr(sc); + xlr_mac_setup_hwaddr(priv); + + dbg_msg("MMIO %08lx, MII %08lx, PCS %08lx, base %08lx PHY %d IRQ %d\n", + (u_long)priv->mmio, (u_long)priv->mii_mmio, (u_long)priv->pcs_mmio, + (u_long)sc->base_addr, priv->phy_addr, sc->irq); + dbg_msg("HWADDR %02x:%02x tx %d rfr %d\n", (u_int)sc->dev_addr[4], + (u_int)sc->dev_addr[5], priv->txbucket, priv->rfrbucket); + + /* + * Set up ifmedia support. + */ + /* + * Initialize MII/media info. + */ + sc->rge_mii.mii_ifp = ifp; + sc->rge_mii.mii_readreg = rge_mii_read; + sc->rge_mii.mii_writereg = (mii_writereg_t) rge_mii_write; + sc->rge_mii.mii_statchg = rmi_xlr_mac_mii_statchg; + ifmedia_init(&sc->rge_mii.mii_media, 0, rmi_xlr_mac_mediachange, + rmi_xlr_mac_mediastatus); + ifmedia_add(&sc->rge_mii.mii_media, IFM_ETHER | IFM_AUTO, 0, NULL); + ifmedia_set(&sc->rge_mii.mii_media, IFM_ETHER | IFM_AUTO); + sc->rge_mii.mii_media.ifm_media = sc->rge_mii.mii_media.ifm_cur->ifm_media; + + /* + * Call MI attach routine. + */ + ether_ifattach(ifp, sc->dev_addr); + + if (priv->type == XLR_GMAC) { + rmi_xlr_gmac_init(priv); + } else if (priv->type == XLR_XGMAC) { + rmi_xlr_xgmac_init(priv); + } + dbg_msg("rge_%d: Phoenix Mac at 0x%p (mtu=%d)\n", + sc->unit, priv->mmio, sc->mtu); + dev_mac[sc->unit] = sc; + if (priv->type == XLR_XGMAC && priv->instance == 0) + dev_mac_xgs0 = sc->unit; + if (priv->type == XLR_GMAC && priv->instance == 0) + dev_mac_gmac0 = sc->unit; + + if (!gmac_common_init_done) { + mac_common_init(); + gmac_common_init_done = 1; + callout_init(&xlr_tx_stop_bkp, CALLOUT_MPSAFE); + callout_reset(&xlr_tx_stop_bkp, hz, xlr_tx_q_wakeup, NULL); + callout_init(&rge_dbg_count, CALLOUT_MPSAFE); + //callout_reset(&rge_dbg_count, hz, xlr_debug_count, NULL); + } + if ((ret = rmi_xlr_mac_open(sc)) == -1) { + RGE_LOCK_DESTROY(sc); + goto out; + } +out: + if (ret < 0) { + device_printf(dev, "error - skipping\n"); + } + return ret; +} + +static void +rge_reset(struct rge_softc *sc) +{ +} + +static int +rge_detach(dev) + device_t dev; +{ +#ifdef FREEBSD_MAC_NOT_YET + struct rge_softc *sc; + struct ifnet *ifp; + + sc = device_get_softc(dev); + ifp = sc->rge_ifp; + + RGE_LOCK(sc); + rge_stop(sc); + rge_reset(sc); + RGE_UNLOCK(sc); + + ether_ifdetach(ifp); + + if (sc->rge_tbi) { + ifmedia_removeall(&sc->rge_ifmedia); + } else { + bus_generic_detach(dev); + device_delete_child(dev, sc->rge_miibus); + } + + rge_release_resources(sc); + +#endif /* FREEBSD_MAC_NOT_YET */ + return (0); +} +static int +rge_suspend(device_t dev) +{ + struct rge_softc *sc; + + sc = device_get_softc(dev); + RGE_LOCK(sc); + rge_stop(sc); + RGE_UNLOCK(sc); + + return 0; +} + +static int +rge_resume(device_t dev) +{ + panic("rge_resume(): unimplemented\n"); + return 0; +} + +static void +rge_release_resources(struct rge_softc *sc) +{ + + if (sc->rge_ifp != NULL) + if_free(sc->rge_ifp); + + if (mtx_initialized(&sc->rge_mtx)) /* XXX */ + RGE_LOCK_DESTROY(sc); +} +uint32_t gmac_rx_fail[32]; +uint32_t gmac_rx_pass[32]; + +#ifdef RX_COPY +static void +rge_rx(struct rge_softc *sc, vm_paddr_t paddr, int len) +{ + /* + * struct mbuf *m = (struct mbuf *)*(unsigned int *)((char *)addr - + * XLR_CACHELINE_SIZE); + */ + struct mbuf *m; + void *ptr; + uint32_t *temp; + struct ifnet *ifp = sc->rge_ifp; + unsigned long msgrng_flags; + int cpu = PCPU_GET(cpuid); + + + temp = (uint32_t *) MIPS_PHYS_TO_KSEG0(paddr - XLR_CACHELINE_SIZE); + + ptr = (void *)(temp + XLR_CACHELINE_SIZE); + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (m != NULL) { + m->m_len = m->m_pkthdr.len = MCLBYTES; + m_copyback(m, 0, len + BYTE_OFFSET, ptr); + /* align the data */ + m->m_data += BYTE_OFFSET; + m->m_pkthdr.len = m->m_len = len; + m->m_pkthdr.rcvif = ifp; + gmac_rx_pass[cpu]++; + } else { + gmac_rx_fail[cpu]++; + } + msgrng_access_enable(msgrng_flags); + xlr_mac_send_fr(&sc->priv, paddr, MAX_FRAME_SIZE); + msgrng_access_disable(msgrng_flags); + +#ifdef DUMP_PACKETS + { + int i = 0; + unsigned char *buf = (char *)m->m_data; + + printf("Rx Packet: length=%d\n", len); + for (i = 0; i < 64; i++) { + if (i && (i % 16) == 0) + printf("\n"); + printf("%02x ", buf[i]); + } + printf("\n"); + } +#endif + + + if (m) { + ifp->if_ipackets++; + (*ifp->if_input) (ifp, m); + } +} + +#else +static void +rge_rx(struct rge_softc *sc, vm_paddr_t paddr, int len) +{ + /* + * struct mbuf *m = (struct mbuf *)*(unsigned int *)((char *)addr - + * XLR_CACHELINE_SIZE); + */ + struct mbuf *m; + uint32_t *temp, tm, mag; + + struct ifnet *ifp = sc->rge_ifp; + + + temp = (uint32_t *) MIPS_PHYS_TO_KSEG0(paddr - XLR_CACHELINE_SIZE); + tm = temp[0]; + mag = temp[1]; + m = (struct mbuf *)tm; + if (mag != 0xf00bad) { + /* somebody else packet Error - FIXME in intialization */ + printf("cpu %d: *ERROR* Not my packet paddr %p\n", xlr_cpu_id(), (void *)paddr); + return; + } + /* align the data */ + m->m_data += BYTE_OFFSET; + m->m_pkthdr.len = m->m_len = len; + m->m_pkthdr.rcvif = ifp; + +#ifdef DUMP_PACKETS + { + int i = 0; + unsigned char *buf = (char *)m->m_data; + + printf("Rx Packet: length=%d\n", len); + for (i = 0; i < 64; i++) { + if (i && (i % 16) == 0) + printf("\n"); + printf("%02x ", buf[i]); + } + printf("\n"); + } +#endif + ifp->if_ipackets++; + (*ifp->if_input) (ifp, m); +} + +#endif + +static void +rge_intr(void *arg) +{ + struct rge_softc *sc = (struct rge_softc *)arg; + struct driver_data *priv = &(sc->priv); + xlr_reg_t *mmio = priv->mmio; + uint32_t intreg = xlr_read_reg(mmio, R_INTREG); + + if (intreg & (1 << O_INTREG__MDInt)) { + uint32_t phy_int_status = 0; + int i = 0; + + for (i = 0; i < XLR_MAX_MACS; i++) { + struct rge_softc *phy_dev = 0; + struct driver_data *phy_priv = 0; + + phy_dev = dev_mac[i]; + if (phy_dev == NULL) + continue; + + phy_priv = &phy_dev->priv; + + if (phy_priv->type == XLR_XGMAC) + continue; + + phy_int_status = rge_mii_read_internal(phy_priv->mii_mmio, + phy_priv->phy_addr, 26); + printf("rge%d: Phy addr %d, MII MMIO %lx status %x\n", phy_priv->instance, + (int)phy_priv->phy_addr, (u_long)phy_priv->mii_mmio, phy_int_status); + rmi_xlr_gmac_config_speed(phy_priv); + } + } else { + printf("[%s]: mac type = %d, instance %d error " + "interrupt: INTREG = 0x%08x\n", + __FUNCTION__, priv->type, priv->instance, intreg); + } + + /* clear all interrupts and hope to make progress */ + xlr_write_reg(mmio, R_INTREG, 0xffffffff); + + /* on A0 and B0, xgmac interrupts are routed only to xgs_1 irq */ + if ((xlr_revision_b0()) && (priv->type == XLR_XGMAC)) { + struct rge_softc *xgs0_dev = dev_mac[dev_mac_xgs0]; + struct driver_data *xgs0_priv = &xgs0_dev->priv; + xlr_reg_t *xgs0_mmio = xgs0_priv->mmio; + uint32_t xgs0_intreg = xlr_read_reg(xgs0_mmio, R_INTREG); + + if (xgs0_intreg) { + printf("[%s]: mac type = %d, instance %d error " + "interrupt: INTREG = 0x%08x\n", + __FUNCTION__, xgs0_priv->type, xgs0_priv->instance, xgs0_intreg); + + xlr_write_reg(xgs0_mmio, R_INTREG, 0xffffffff); + } + } +} + +static void +rge_start_locked(struct ifnet *ifp, int threshold) +{ + struct rge_softc *sc = ifp->if_softc; + struct mbuf *m = NULL; + int prepend_pkt = 0; + int i = 0; + struct p2d_tx_desc *tx_desc = NULL; + int cpu = xlr_cpu_id(); + uint32_t vcpu = (cpu << 2) + xlr_thr_id(); + + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) + return; + + for (i = 0; i < xlr_tot_avail_p2d[cpu]; i++) { + if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) + return; + tx_desc = get_p2d_desc(); + if (!tx_desc) { + xlr_rge_get_p2d_failed[vcpu]++; + return; + } + /* Grab a packet off the queue. */ + IFQ_DEQUEUE(&ifp->if_snd, m); + if (m == NULL) { + free_p2d_desc(tx_desc); + return; + } + prepend_pkt = rmi_xlr_mac_xmit(m, sc, 0, tx_desc); + + if (prepend_pkt) { + xlr_rge_tx_prepend[vcpu]++; + IF_PREPEND(&ifp->if_snd, m); + ifp->if_drv_flags |= IFF_DRV_OACTIVE; + return; + } else { + ifp->if_opackets++; + xlr_rge_tx_done[vcpu]++; + } + } +} + +static void +rge_start(struct ifnet *ifp) +{ + rge_start_locked(ifp, RGE_TX_Q_SIZE); +} + +static int +rge_ioctl(struct ifnet *ifp, u_long command, caddr_t data) +{ + struct rge_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *)data; + int mask, error = 0; + + /* struct mii_data *mii; */ + switch (command) { + case SIOCSIFMTU: + ifp->if_mtu = ifr->ifr_mtu; + error = rmi_xlr_mac_change_mtu(sc, ifr->ifr_mtu); + break; + case SIOCSIFFLAGS: + + RGE_LOCK(sc); + if (ifp->if_flags & IFF_UP) { + /* + * If only the state of the PROMISC flag changed, + * then just use the 'set promisc mode' command + * instead of reinitializing the entire NIC. Doing a + * full re-init means reloading the firmware and + * waiting for it to start up, which may take a + * second or two. Similarly for ALLMULTI. + */ + if (ifp->if_drv_flags & IFF_DRV_RUNNING && + ifp->if_flags & IFF_PROMISC && + !(sc->flags & IFF_PROMISC)) { + sc->flags |= IFF_PROMISC; + xlr_mac_set_rx_mode(sc); + } else if (ifp->if_drv_flags & IFF_DRV_RUNNING && + !(ifp->if_flags & IFF_PROMISC) && + sc->flags & IFF_PROMISC) { + sc->flags &= IFF_PROMISC; + xlr_mac_set_rx_mode(sc); + } else if (ifp->if_drv_flags & IFF_DRV_RUNNING && + (ifp->if_flags ^ sc->flags) & IFF_ALLMULTI) { + rmi_xlr_mac_set_multicast_list(sc); + } else + xlr_mac_set_rx_mode(sc); + } else { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + xlr_mac_set_rx_mode(sc); + } + } + sc->flags = ifp->if_flags; + RGE_UNLOCK(sc); + error = 0; + break; + case SIOCADDMULTI: + case SIOCDELMULTI: + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + RGE_LOCK(sc); + rmi_xlr_mac_set_multicast_list(sc); + RGE_UNLOCK(sc); + error = 0; + } + break; + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, + &sc->rge_mii.mii_media, command); + break; + case SIOCSIFCAP: + mask = ifr->ifr_reqcap ^ ifp->if_capenable; + ifp->if_hwassist = 0; + break; + default: + error = ether_ioctl(ifp, command, data); + break; + } + + return (error); +} + +static void +rge_init(void *addr) +{ + struct rge_softc *sc = (struct rge_softc *)addr; + struct ifnet *ifp; + struct driver_data *priv = &(sc->priv); + + ifp = sc->rge_ifp; + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + return; + ifp->if_drv_flags |= IFF_DRV_RUNNING; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + + rmi_xlr_mac_set_enable(priv, 1); +} + +static void +rge_stop(struct rge_softc *sc) +{ + rmi_xlr_mac_close(sc); +} + +static int +rge_shutdown(device_t dev) +{ + struct rge_softc *sc; + + sc = device_get_softc(dev); + + RGE_LOCK(sc); + rge_stop(sc); + rge_reset(sc); + RGE_UNLOCK(sc); + + return (0); +} + +static int +rmi_xlr_mac_open(struct rge_softc *sc) +{ + struct driver_data *priv = &(sc->priv); + int i; + + dbg_msg("IN\n"); + + if (rmi_xlr_mac_fill_rxfr(sc)) { + return -1; + } + mtx_lock_spin(&priv->lock); + + xlr_mac_set_rx_mode(sc); + + if (sc->unit == xlr_board_info.gmacports - 1) { + printf("Enabling MDIO interrupts\n"); + struct rge_softc *tmp = NULL; + + for (i = 0; i < xlr_board_info.gmacports; i++) { + tmp = dev_mac[i]; + if (tmp) + xlr_write_reg(tmp->priv.mmio, R_INTMASK, + ((tmp->priv.instance == 0) << O_INTMASK__MDInt)); + } + } + /* + * Configure the speed, duplex, and flow control + */ + rmi_xlr_mac_set_speed(priv, priv->speed); + rmi_xlr_mac_set_duplex(priv, priv->duplex, priv->flow_ctrl); + rmi_xlr_mac_set_enable(priv, 0); + + mtx_unlock_spin(&priv->lock); + + for (i = 0; i < 8; i++) { + atomic_set_int(&(priv->frin_to_be_sent[i]), 0); + } + + return 0; +} + +/********************************************************************** + **********************************************************************/ +static int +rmi_xlr_mac_close(struct rge_softc *sc) +{ + struct driver_data *priv = &(sc->priv); + + mtx_lock_spin(&priv->lock); + + /* + * There may have left over mbufs in the ring as well as in free in + * they will be reused next time open is called + */ + + rmi_xlr_mac_set_enable(priv, 0); + + xlr_inc_counter(NETIF_STOP_Q); + port_inc_counter(priv->instance, PORT_STOPQ); + + mtx_unlock_spin(&priv->lock); + + return 0; +} + +/********************************************************************** + **********************************************************************/ +static struct rge_softc_stats * +rmi_xlr_mac_get_stats(struct rge_softc *sc) +{ + struct driver_data *priv = &(sc->priv); + + /* unsigned long flags; */ + + mtx_lock_spin(&priv->lock); + + /* XXX update other stats here */ + + mtx_unlock_spin(&priv->lock); + + return &priv->stats; +} + +/********************************************************************** + **********************************************************************/ +static void +rmi_xlr_mac_set_multicast_list(struct rge_softc *sc) +{ +} + +/********************************************************************** + **********************************************************************/ +static int +rmi_xlr_mac_change_mtu(struct rge_softc *sc, int new_mtu) +{ + struct driver_data *priv = &(sc->priv); + + if ((new_mtu > 9500) || (new_mtu < 64)) { + return -EINVAL; + } + mtx_lock_spin(&priv->lock); + + sc->mtu = new_mtu; + + /* Disable MAC TX/RX */ + rmi_xlr_mac_set_enable(priv, 0); + + /* Flush RX FR IN */ + /* Flush TX IN */ + rmi_xlr_mac_set_enable(priv, 1); + + mtx_unlock_spin(&priv->lock); + return 0; +} + +/********************************************************************** + **********************************************************************/ +static int +rmi_xlr_mac_fill_rxfr(struct rge_softc *sc) +{ + struct driver_data *priv = &(sc->priv); + unsigned long msgrng_flags; + int i; + int ret = 0; + void *ptr; + + dbg_msg("\n"); + if (!priv->init_frin_desc) + return ret; + priv->init_frin_desc = 0; + + dbg_msg("\n"); + for (i = 0; i < MAX_NUM_DESC; i++) { + ptr = get_buf(); + if (!ptr) { + ret = -ENOMEM; + break; + } + /* Send the free Rx desc to the MAC */ + msgrng_access_enable(msgrng_flags); + xlr_mac_send_fr(priv, vtophys(ptr), MAX_FRAME_SIZE); + msgrng_access_disable(msgrng_flags); + } + + return ret; +} + +/********************************************************************** + **********************************************************************/ +static __inline__ void * +rmi_xlr_config_spill(xlr_reg_t * mmio, + int reg_start_0, int reg_start_1, + int reg_size, int size) +{ + uint32_t spill_size = size; + void *spill = NULL; + uint64_t phys_addr = 0; + + + spill = contigmalloc((spill_size + XLR_CACHELINE_SIZE), M_DEVBUF, + M_NOWAIT | M_ZERO, 0, 0xffffffff, XLR_CACHELINE_SIZE, 0); + if (!spill || ((vm_offset_t)spill & (XLR_CACHELINE_SIZE - 1))) { + panic("Unable to allocate memory for spill area!\n"); + } + phys_addr = vtophys(spill); + dbg_msg("Allocate spill %d bytes at %llx\n", size, phys_addr); + xlr_write_reg(mmio, reg_start_0, (phys_addr >> 5) & 0xffffffff); + xlr_write_reg(mmio, reg_start_1, (phys_addr >> 37) & 0x07); + xlr_write_reg(mmio, reg_size, spill_size); + + return spill; +} + +static void +rmi_xlr_config_spill_area(struct driver_data *priv) +{ + /* + * if driver initialization is done parallely on multiple cpus + * spill_configured needs synchronization + */ + if (priv->spill_configured) + return; + + if (priv->type == XLR_GMAC && priv->instance % 4 != 0) { + priv->spill_configured = 1; + return; + } + priv->spill_configured = 1; + + priv->frin_spill = + rmi_xlr_config_spill(priv->mmio, + R_REG_FRIN_SPILL_MEM_START_0, + R_REG_FRIN_SPILL_MEM_START_1, + R_REG_FRIN_SPILL_MEM_SIZE, + MAX_FRIN_SPILL * + sizeof(struct fr_desc)); + + priv->class_0_spill = + rmi_xlr_config_spill(priv->mmio, + R_CLASS0_SPILL_MEM_START_0, + R_CLASS0_SPILL_MEM_START_1, + R_CLASS0_SPILL_MEM_SIZE, + MAX_CLASS_0_SPILL * + sizeof(union rx_tx_desc)); + priv->class_1_spill = + rmi_xlr_config_spill(priv->mmio, + R_CLASS1_SPILL_MEM_START_0, + R_CLASS1_SPILL_MEM_START_1, + R_CLASS1_SPILL_MEM_SIZE, + MAX_CLASS_1_SPILL * + sizeof(union rx_tx_desc)); + + priv->frout_spill = + rmi_xlr_config_spill(priv->mmio, R_FROUT_SPILL_MEM_START_0, + R_FROUT_SPILL_MEM_START_1, + R_FROUT_SPILL_MEM_SIZE, + MAX_FROUT_SPILL * + sizeof(struct fr_desc)); + + priv->class_2_spill = + rmi_xlr_config_spill(priv->mmio, + R_CLASS2_SPILL_MEM_START_0, + R_CLASS2_SPILL_MEM_START_1, + R_CLASS2_SPILL_MEM_SIZE, + MAX_CLASS_2_SPILL * + sizeof(union rx_tx_desc)); + priv->class_3_spill = + rmi_xlr_config_spill(priv->mmio, + R_CLASS3_SPILL_MEM_START_0, + R_CLASS3_SPILL_MEM_START_1, + R_CLASS3_SPILL_MEM_SIZE, + MAX_CLASS_3_SPILL * + sizeof(union rx_tx_desc)); + priv->spill_configured = 1; +} + +/***************************************************************** + * Write the MAC address to the XLR registers + * All 4 addresses are the same for now + *****************************************************************/ +static void +xlr_mac_setup_hwaddr(struct driver_data *priv) +{ + struct rge_softc *sc = priv->sc; + + xlr_write_reg(priv->mmio, R_MAC_ADDR0, + ((sc->dev_addr[5] << 24) | (sc->dev_addr[4] << 16) + | (sc->dev_addr[3] << 8) | (sc->dev_addr[2])) + ); + + xlr_write_reg(priv->mmio, R_MAC_ADDR0 + 1, + ((sc->dev_addr[1] << 24) | (sc-> + dev_addr[0] << 16))); + + xlr_write_reg(priv->mmio, R_MAC_ADDR_MASK2, 0xffffffff); + + xlr_write_reg(priv->mmio, R_MAC_ADDR_MASK2 + 1, 0xffffffff); + + xlr_write_reg(priv->mmio, R_MAC_ADDR_MASK3, 0xffffffff); + + xlr_write_reg(priv->mmio, R_MAC_ADDR_MASK3 + 1, 0xffffffff); + + xlr_write_reg(priv->mmio, R_MAC_FILTER_CONFIG, + (1 << O_MAC_FILTER_CONFIG__BROADCAST_EN) | + (1 << O_MAC_FILTER_CONFIG__ALL_MCAST_EN) | + (1 << O_MAC_FILTER_CONFIG__MAC_ADDR0_VALID) + ); +} + +/***************************************************************** + * Read the MAC address from the XLR registers + * All 4 addresses are the same for now + *****************************************************************/ +static void +xlr_mac_get_hwaddr(struct rge_softc *sc) +{ + struct driver_data *priv = &(sc->priv); + + sc->dev_addr[0] = (xlr_boot1_info.mac_addr >> 40) & 0xff; + sc->dev_addr[1] = (xlr_boot1_info.mac_addr >> 32) & 0xff; + sc->dev_addr[2] = (xlr_boot1_info.mac_addr >> 24) & 0xff; + sc->dev_addr[3] = (xlr_boot1_info.mac_addr >> 16) & 0xff; + sc->dev_addr[4] = (xlr_boot1_info.mac_addr >> 8) & 0xff; + sc->dev_addr[5] = ((xlr_boot1_info.mac_addr >> 0) & 0xff) + priv->instance; +} + +/***************************************************************** + * Mac Module Initialization + *****************************************************************/ +static void +mac_common_init(void) +{ + init_p2d_allocation(); + init_tx_ring(); +#ifdef RX_COPY + init_rx_buf(); +#endif + + if (xlr_board_info.is_xls) { + if (register_msgring_handler(TX_STN_GMAC0, + rmi_xlr_mac_msgring_handler, NULL)) { + panic("Couldn't register msgring handler\n"); + } + if (register_msgring_handler(TX_STN_GMAC1, + rmi_xlr_mac_msgring_handler, NULL)) { + panic("Couldn't register msgring handler\n"); + } + } else { + if (register_msgring_handler(TX_STN_GMAC, + rmi_xlr_mac_msgring_handler, NULL)) { + panic("Couldn't register msgring handler\n"); + } + } + + /* + * Not yet if (xlr_board_atx_ii()) { if (register_msgring_handler + * (TX_STN_XGS_0, rmi_xlr_mac_msgring_handler, NULL)) { + * panic("Couldn't register msgring handler for TX_STN_XGS_0\n"); } + * if (register_msgring_handler (TX_STN_XGS_1, + * rmi_xlr_mac_msgring_handler, NULL)) { panic("Couldn't register + * msgring handler for TX_STN_XGS_1\n"); } } + */ +} diff --git a/sys/mips/rmi/dev/xlr/rge.h b/sys/mips/rmi/dev/xlr/rge.h new file mode 100644 index 000000000000..98b5847c6d81 --- /dev/null +++ b/sys/mips/rmi/dev/xlr/rge.h @@ -0,0 +1,1097 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _RMI_RGE_H_ +#define _RMI_RGE_H_ + +/* #define MAC_SPLIT_MODE */ + +#define MAC_SPACING 0x400 +#define XGMAC_SPACING 0x400 + +/* PE-MCXMAC register and bit field definitions */ +#define R_MAC_CONFIG_1 0x00 +#define O_MAC_CONFIG_1__srst 31 +#define O_MAC_CONFIG_1__simr 30 +#define O_MAC_CONFIG_1__hrrmc 18 +#define W_MAC_CONFIG_1__hrtmc 2 +#define O_MAC_CONFIG_1__hrrfn 16 +#define W_MAC_CONFIG_1__hrtfn 2 +#define O_MAC_CONFIG_1__intlb 8 +#define O_MAC_CONFIG_1__rxfc 5 +#define O_MAC_CONFIG_1__txfc 4 +#define O_MAC_CONFIG_1__srxen 3 +#define O_MAC_CONFIG_1__rxen 2 +#define O_MAC_CONFIG_1__stxen 1 +#define O_MAC_CONFIG_1__txen 0 +#define R_MAC_CONFIG_2 0x01 +#define O_MAC_CONFIG_2__prlen 12 +#define W_MAC_CONFIG_2__prlen 4 +#define O_MAC_CONFIG_2__speed 8 +#define W_MAC_CONFIG_2__speed 2 +#define O_MAC_CONFIG_2__hugen 5 +#define O_MAC_CONFIG_2__flchk 4 +#define O_MAC_CONFIG_2__crce 1 +#define O_MAC_CONFIG_2__fulld 0 +#define R_IPG_IFG 0x02 +#define O_IPG_IFG__ipgr1 24 +#define W_IPG_IFG__ipgr1 7 +#define O_IPG_IFG__ipgr2 16 +#define W_IPG_IFG__ipgr2 7 +#define O_IPG_IFG__mifg 8 +#define W_IPG_IFG__mifg 8 +#define O_IPG_IFG__ipgt 0 +#define W_IPG_IFG__ipgt 7 +#define R_HALF_DUPLEX 0x03 +#define O_HALF_DUPLEX__abebt 24 +#define W_HALF_DUPLEX__abebt 4 +#define O_HALF_DUPLEX__abebe 19 +#define O_HALF_DUPLEX__bpnb 18 +#define O_HALF_DUPLEX__nobo 17 +#define O_HALF_DUPLEX__edxsdfr 16 +#define O_HALF_DUPLEX__retry 12 +#define W_HALF_DUPLEX__retry 4 +#define O_HALF_DUPLEX__lcol 0 +#define W_HALF_DUPLEX__lcol 10 +#define R_MAXIMUM_FRAME_LENGTH 0x04 +#define O_MAXIMUM_FRAME_LENGTH__maxf 0 +#define W_MAXIMUM_FRAME_LENGTH__maxf 16 +#define R_TEST 0x07 +#define O_TEST__mbof 3 +#define O_TEST__rthdf 2 +#define O_TEST__tpause 1 +#define O_TEST__sstct 0 +#define R_MII_MGMT_CONFIG 0x08 +#define O_MII_MGMT_CONFIG__scinc 5 +#define O_MII_MGMT_CONFIG__spre 4 +#define O_MII_MGMT_CONFIG__clks 3 +#define W_MII_MGMT_CONFIG__clks 3 +#define R_MII_MGMT_COMMAND 0x09 +#define O_MII_MGMT_COMMAND__scan 1 +#define O_MII_MGMT_COMMAND__rstat 0 +#define R_MII_MGMT_ADDRESS 0x0A +#define O_MII_MGMT_ADDRESS__fiad 8 +#define W_MII_MGMT_ADDRESS__fiad 5 +#define O_MII_MGMT_ADDRESS__fgad 5 +#define W_MII_MGMT_ADDRESS__fgad 0 +#define R_MII_MGMT_WRITE_DATA 0x0B +#define O_MII_MGMT_WRITE_DATA__ctld 0 +#define W_MII_MGMT_WRITE_DATA__ctld 16 +#define R_MII_MGMT_STATUS 0x0C +#define R_MII_MGMT_INDICATORS 0x0D +#define O_MII_MGMT_INDICATORS__nvalid 2 +#define O_MII_MGMT_INDICATORS__scan 1 +#define O_MII_MGMT_INDICATORS__busy 0 +#define R_INTERFACE_CONTROL 0x0E +#define O_INTERFACE_CONTROL__hrstint 31 +#define O_INTERFACE_CONTROL__tbimode 27 +#define O_INTERFACE_CONTROL__ghdmode 26 +#define O_INTERFACE_CONTROL__lhdmode 25 +#define O_INTERFACE_CONTROL__phymod 24 +#define O_INTERFACE_CONTROL__hrrmi 23 +#define O_INTERFACE_CONTROL__rspd 16 +#define O_INTERFACE_CONTROL__hr100 15 +#define O_INTERFACE_CONTROL__frcq 10 +#define O_INTERFACE_CONTROL__nocfr 9 +#define O_INTERFACE_CONTROL__dlfct 8 +#define O_INTERFACE_CONTROL__enjab 0 +#define R_INTERFACE_STATUS 0x0F +#define O_INTERFACE_STATUS__xsdfr 9 +#define O_INTERFACE_STATUS__ssrr 8 +#define W_INTERFACE_STATUS__ssrr 5 +#define O_INTERFACE_STATUS__miilf 3 +#define O_INTERFACE_STATUS__locar 2 +#define O_INTERFACE_STATUS__sqerr 1 +#define O_INTERFACE_STATUS__jabber 0 +#define R_STATION_ADDRESS_LS 0x10 +#define R_STATION_ADDRESS_MS 0x11 + +/* A-XGMAC register and bit field definitions */ +#define R_XGMAC_CONFIG_0 0x00 +#define O_XGMAC_CONFIG_0__hstmacrst 31 +#define O_XGMAC_CONFIG_0__hstrstrctl 23 +#define O_XGMAC_CONFIG_0__hstrstrfn 22 +#define O_XGMAC_CONFIG_0__hstrsttctl 18 +#define O_XGMAC_CONFIG_0__hstrsttfn 17 +#define O_XGMAC_CONFIG_0__hstrstmiim 16 +#define O_XGMAC_CONFIG_0__hstloopback 8 +#define R_XGMAC_CONFIG_1 0x01 +#define O_XGMAC_CONFIG_1__hsttctlen 31 +#define O_XGMAC_CONFIG_1__hsttfen 30 +#define O_XGMAC_CONFIG_1__hstrctlen 29 +#define O_XGMAC_CONFIG_1__hstrfen 28 +#define O_XGMAC_CONFIG_1__tfen 26 +#define O_XGMAC_CONFIG_1__rfen 24 +#define O_XGMAC_CONFIG_1__hstrctlshrtp 12 +#define O_XGMAC_CONFIG_1__hstdlyfcstx 10 +#define W_XGMAC_CONFIG_1__hstdlyfcstx 2 +#define O_XGMAC_CONFIG_1__hstdlyfcsrx 8 +#define W_XGMAC_CONFIG_1__hstdlyfcsrx 2 +#define O_XGMAC_CONFIG_1__hstppen 7 +#define O_XGMAC_CONFIG_1__hstbytswp 6 +#define O_XGMAC_CONFIG_1__hstdrplt64 5 +#define O_XGMAC_CONFIG_1__hstprmscrx 4 +#define O_XGMAC_CONFIG_1__hstlenchk 3 +#define O_XGMAC_CONFIG_1__hstgenfcs 2 +#define O_XGMAC_CONFIG_1__hstpadmode 0 +#define W_XGMAC_CONFIG_1__hstpadmode 2 +#define R_XGMAC_CONFIG_2 0x02 +#define O_XGMAC_CONFIG_2__hsttctlfrcp 31 +#define O_XGMAC_CONFIG_2__hstmlnkflth 27 +#define O_XGMAC_CONFIG_2__hstalnkflth 26 +#define O_XGMAC_CONFIG_2__rflnkflt 24 +#define W_XGMAC_CONFIG_2__rflnkflt 2 +#define O_XGMAC_CONFIG_2__hstipgextmod 16 +#define W_XGMAC_CONFIG_2__hstipgextmod 5 +#define O_XGMAC_CONFIG_2__hstrctlfrcp 15 +#define O_XGMAC_CONFIG_2__hstipgexten 5 +#define O_XGMAC_CONFIG_2__hstmipgext 0 +#define W_XGMAC_CONFIG_2__hstmipgext 5 +#define R_XGMAC_CONFIG_3 0x03 +#define O_XGMAC_CONFIG_3__hstfltrfrm 31 +#define W_XGMAC_CONFIG_3__hstfltrfrm 16 +#define O_XGMAC_CONFIG_3__hstfltrfrmdc 15 +#define W_XGMAC_CONFIG_3__hstfltrfrmdc 16 +#define R_XGMAC_STATION_ADDRESS_LS 0x04 +#define O_XGMAC_STATION_ADDRESS_LS__hstmacadr0 0 +#define W_XGMAC_STATION_ADDRESS_LS__hstmacadr0 32 +#define R_XGMAC_STATION_ADDRESS_MS 0x05 +#define R_XGMAC_MAX_FRAME_LEN 0x08 +#define O_XGMAC_MAX_FRAME_LEN__hstmxfrmwctx 16 +#define W_XGMAC_MAX_FRAME_LEN__hstmxfrmwctx 14 +#define O_XGMAC_MAX_FRAME_LEN__hstmxfrmbcrx 0 +#define W_XGMAC_MAX_FRAME_LEN__hstmxfrmbcrx 16 +#define R_XGMAC_REV_LEVEL 0x0B +#define O_XGMAC_REV_LEVEL__revlvl 0 +#define W_XGMAC_REV_LEVEL__revlvl 15 +#define R_XGMAC_MIIM_COMMAND 0x10 +#define O_XGMAC_MIIM_COMMAND__hstldcmd 3 +#define O_XGMAC_MIIM_COMMAND__hstmiimcmd 0 +#define W_XGMAC_MIIM_COMMAND__hstmiimcmd 3 +#define R_XGMAC_MIIM_FILED 0x11 +#define O_XGMAC_MIIM_FILED__hststfield 30 +#define W_XGMAC_MIIM_FILED__hststfield 2 +#define O_XGMAC_MIIM_FILED__hstopfield 28 +#define W_XGMAC_MIIM_FILED__hstopfield 2 +#define O_XGMAC_MIIM_FILED__hstphyadx 23 +#define W_XGMAC_MIIM_FILED__hstphyadx 5 +#define O_XGMAC_MIIM_FILED__hstregadx 18 +#define W_XGMAC_MIIM_FILED__hstregadx 5 +#define O_XGMAC_MIIM_FILED__hsttafield 16 +#define W_XGMAC_MIIM_FILED__hsttafield 2 +#define O_XGMAC_MIIM_FILED__miimrddat 0 +#define W_XGMAC_MIIM_FILED__miimrddat 16 +#define R_XGMAC_MIIM_CONFIG 0x12 +#define O_XGMAC_MIIM_CONFIG__hstnopram 7 +#define O_XGMAC_MIIM_CONFIG__hstclkdiv 0 +#define W_XGMAC_MIIM_CONFIG__hstclkdiv 7 +#define R_XGMAC_MIIM_LINK_FAIL_VECTOR 0x13 +#define O_XGMAC_MIIM_LINK_FAIL_VECTOR__miimlfvec 0 +#define W_XGMAC_MIIM_LINK_FAIL_VECTOR__miimlfvec 32 +#define R_XGMAC_MIIM_INDICATOR 0x14 +#define O_XGMAC_MIIM_INDICATOR__miimphylf 4 +#define O_XGMAC_MIIM_INDICATOR__miimmoncplt 3 +#define O_XGMAC_MIIM_INDICATOR__miimmonvld 2 +#define O_XGMAC_MIIM_INDICATOR__miimmon 1 +#define O_XGMAC_MIIM_INDICATOR__miimbusy 0 + +/* Glue logic register and bit field definitions */ +#define R_MAC_ADDR0 0x50 +#define R_MAC_ADDR1 0x52 +#define R_MAC_ADDR2 0x54 +#define R_MAC_ADDR3 0x56 +#define R_MAC_ADDR_MASK2 0x58 +#define R_MAC_ADDR_MASK3 0x5A +#define R_MAC_FILTER_CONFIG 0x5C +#define O_MAC_FILTER_CONFIG__BROADCAST_EN 10 +#define O_MAC_FILTER_CONFIG__PAUSE_FRAME_EN 9 +#define O_MAC_FILTER_CONFIG__ALL_MCAST_EN 8 +#define O_MAC_FILTER_CONFIG__ALL_UCAST_EN 7 +#define O_MAC_FILTER_CONFIG__HASH_MCAST_EN 6 +#define O_MAC_FILTER_CONFIG__HASH_UCAST_EN 5 +#define O_MAC_FILTER_CONFIG__ADDR_MATCH_DISC 4 +#define O_MAC_FILTER_CONFIG__MAC_ADDR3_VALID 3 +#define O_MAC_FILTER_CONFIG__MAC_ADDR2_VALID 2 +#define O_MAC_FILTER_CONFIG__MAC_ADDR1_VALID 1 +#define O_MAC_FILTER_CONFIG__MAC_ADDR0_VALID 0 +#define R_HASH_TABLE_VECTOR 0x30 +#define R_TX_CONTROL 0x0A0 +#define O_TX_CONTROL__Tx15Halt 31 +#define O_TX_CONTROL__Tx14Halt 30 +#define O_TX_CONTROL__Tx13Halt 29 +#define O_TX_CONTROL__Tx12Halt 28 +#define O_TX_CONTROL__Tx11Halt 27 +#define O_TX_CONTROL__Tx10Halt 26 +#define O_TX_CONTROL__Tx9Halt 25 +#define O_TX_CONTROL__Tx8Halt 24 +#define O_TX_CONTROL__Tx7Halt 23 +#define O_TX_CONTROL__Tx6Halt 22 +#define O_TX_CONTROL__Tx5Halt 21 +#define O_TX_CONTROL__Tx4Halt 20 +#define O_TX_CONTROL__Tx3Halt 19 +#define O_TX_CONTROL__Tx2Halt 18 +#define O_TX_CONTROL__Tx1Halt 17 +#define O_TX_CONTROL__Tx0Halt 16 +#define O_TX_CONTROL__TxIdle 15 +#define O_TX_CONTROL__TxEnable 14 +#define O_TX_CONTROL__TxThreshold 0 +#define W_TX_CONTROL__TxThreshold 14 +#define R_RX_CONTROL 0x0A1 +#define O_RX_CONTROL__RGMII 10 +#define O_RX_CONTROL__RxHalt 1 +#define O_RX_CONTROL__RxEnable 0 +#define R_DESC_PACK_CTRL 0x0A2 +#define O_DESC_PACK_CTRL__ByteOffset 17 +#define W_DESC_PACK_CTRL__ByteOffset 3 +#define O_DESC_PACK_CTRL__PrePadEnable 16 +#define O_DESC_PACK_CTRL__MaxEntry 14 +#define W_DESC_PACK_CTRL__MaxEntry 2 +#define O_DESC_PACK_CTRL__RegularSize 0 +#define W_DESC_PACK_CTRL__RegularSize 14 +#define R_STATCTRL 0x0A3 +#define O_STATCTRL__OverFlowEn 4 +#define O_STATCTRL__GIG 3 +#define O_STATCTRL__Sten 2 +#define O_STATCTRL__ClrCnt 1 +#define O_STATCTRL__AutoZ 0 +#define R_L2ALLOCCTRL 0x0A4 +#define O_L2ALLOCCTRL__TxL2Allocate 9 +#define W_L2ALLOCCTRL__TxL2Allocate 9 +#define O_L2ALLOCCTRL__RxL2Allocate 0 +#define W_L2ALLOCCTRL__RxL2Allocate 9 +#define R_INTMASK 0x0A5 +#define O_INTMASK__Spi4TxError 28 +#define O_INTMASK__Spi4RxError 27 +#define O_INTMASK__RGMIIHalfDupCollision 27 +#define O_INTMASK__Abort 26 +#define O_INTMASK__Underrun 25 +#define O_INTMASK__DiscardPacket 24 +#define O_INTMASK__AsyncFifoFull 23 +#define O_INTMASK__TagFull 22 +#define O_INTMASK__Class3Full 21 +#define O_INTMASK__C3EarlyFull 20 +#define O_INTMASK__Class2Full 19 +#define O_INTMASK__C2EarlyFull 18 +#define O_INTMASK__Class1Full 17 +#define O_INTMASK__C1EarlyFull 16 +#define O_INTMASK__Class0Full 15 +#define O_INTMASK__C0EarlyFull 14 +#define O_INTMASK__RxDataFull 13 +#define O_INTMASK__RxEarlyFull 12 +#define O_INTMASK__RFreeEmpty 9 +#define O_INTMASK__RFEarlyEmpty 8 +#define O_INTMASK__P2PSpillEcc 7 +#define O_INTMASK__FreeDescFull 5 +#define O_INTMASK__FreeEarlyFull 4 +#define O_INTMASK__TxFetchError 3 +#define O_INTMASK__StatCarry 2 +#define O_INTMASK__MDInt 1 +#define O_INTMASK__TxIllegal 0 +#define R_INTREG 0x0A6 +#define O_INTREG__Spi4TxError 28 +#define O_INTREG__Spi4RxError 27 +#define O_INTREG__RGMIIHalfDupCollision 27 +#define O_INTREG__Abort 26 +#define O_INTREG__Underrun 25 +#define O_INTREG__DiscardPacket 24 +#define O_INTREG__AsyncFifoFull 23 +#define O_INTREG__TagFull 22 +#define O_INTREG__Class3Full 21 +#define O_INTREG__C3EarlyFull 20 +#define O_INTREG__Class2Full 19 +#define O_INTREG__C2EarlyFull 18 +#define O_INTREG__Class1Full 17 +#define O_INTREG__C1EarlyFull 16 +#define O_INTREG__Class0Full 15 +#define O_INTREG__C0EarlyFull 14 +#define O_INTREG__RxDataFull 13 +#define O_INTREG__RxEarlyFull 12 +#define O_INTREG__RFreeEmpty 9 +#define O_INTREG__RFEarlyEmpty 8 +#define O_INTREG__P2PSpillEcc 7 +#define O_INTREG__FreeDescFull 5 +#define O_INTREG__FreeEarlyFull 4 +#define O_INTREG__TxFetchError 3 +#define O_INTREG__StatCarry 2 +#define O_INTREG__MDInt 1 +#define O_INTREG__TxIllegal 0 +#define R_TXRETRY 0x0A7 +#define O_TXRETRY__CollisionRetry 6 +#define O_TXRETRY__BusErrorRetry 5 +#define O_TXRETRY__UnderRunRetry 4 +#define O_TXRETRY__Retries 0 +#define W_TXRETRY__Retries 4 +#define R_CORECONTROL 0x0A8 +#define O_CORECONTROL__ErrorThread 4 +#define W_CORECONTROL__ErrorThread 7 +#define O_CORECONTROL__Shutdown 2 +#define O_CORECONTROL__Speed 0 +#define W_CORECONTROL__Speed 2 +#define R_BYTEOFFSET0 0x0A9 +#define R_BYTEOFFSET1 0x0AA +#define R_L2TYPE_0 0x0F0 +#define O_L2TYPE__ExtraHdrProtoSize 26 +#define W_L2TYPE__ExtraHdrProtoSize 5 +#define O_L2TYPE__ExtraHdrProtoOffset 20 +#define W_L2TYPE__ExtraHdrProtoOffset 6 +#define O_L2TYPE__ExtraHeaderSize 14 +#define W_L2TYPE__ExtraHeaderSize 6 +#define O_L2TYPE__ProtoOffset 8 +#define W_L2TYPE__ProtoOffset 6 +#define O_L2TYPE__L2HdrOffset 2 +#define W_L2TYPE__L2HdrOffset 6 +#define O_L2TYPE__L2Proto 0 +#define W_L2TYPE__L2Proto 2 +#define R_L2TYPE_1 0xF0 +#define R_L2TYPE_2 0xF0 +#define R_L2TYPE_3 0xF0 +#define R_PARSERCONFIGREG 0x100 +#define O_PARSERCONFIGREG__CRCHashPoly 8 +#define W_PARSERCONFIGREG__CRCHashPoly 7 +#define O_PARSERCONFIGREG__PrePadOffset 4 +#define W_PARSERCONFIGREG__PrePadOffset 4 +#define O_PARSERCONFIGREG__UseCAM 2 +#define O_PARSERCONFIGREG__UseHASH 1 +#define O_PARSERCONFIGREG__UseProto 0 +#define R_L3CTABLE 0x140 +#define O_L3CTABLE__Offset0 25 +#define W_L3CTABLE__Offset0 7 +#define O_L3CTABLE__Len0 21 +#define W_L3CTABLE__Len0 4 +#define O_L3CTABLE__Offset1 14 +#define W_L3CTABLE__Offset1 7 +#define O_L3CTABLE__Len1 10 +#define W_L3CTABLE__Len1 4 +#define O_L3CTABLE__Offset2 4 +#define W_L3CTABLE__Offset2 6 +#define O_L3CTABLE__Len2 0 +#define W_L3CTABLE__Len2 4 +#define O_L3CTABLE__L3HdrOffset 26 +#define W_L3CTABLE__L3HdrOffset 6 +#define O_L3CTABLE__L4ProtoOffset 20 +#define W_L3CTABLE__L4ProtoOffset 6 +#define O_L3CTABLE__IPChksumCompute 19 +#define O_L3CTABLE__L4Classify 18 +#define O_L3CTABLE__L2Proto 16 +#define W_L3CTABLE__L2Proto 2 +#define O_L3CTABLE__L3ProtoKey 0 +#define W_L3CTABLE__L3ProtoKey 16 +#define R_L4CTABLE 0x160 +#define O_L4CTABLE__Offset0 21 +#define W_L4CTABLE__Offset0 6 +#define O_L4CTABLE__Len0 17 +#define W_L4CTABLE__Len0 4 +#define O_L4CTABLE__Offset1 11 +#define W_L4CTABLE__Offset1 6 +#define O_L4CTABLE__Len1 7 +#define W_L4CTABLE__Len1 4 +#define O_L4CTABLE__TCPChksumEnable 0 +#define R_CAM4X128TABLE 0x172 +#define O_CAM4X128TABLE__ClassId 7 +#define W_CAM4X128TABLE__ClassId 2 +#define O_CAM4X128TABLE__BucketId 1 +#define W_CAM4X128TABLE__BucketId 6 +#define O_CAM4X128TABLE__UseBucket 0 +#define R_CAM4X128KEY 0x180 +#define R_TRANSLATETABLE 0x1A0 +#define R_DMACR0 0x200 +#define O_DMACR0__Data0WrMaxCr 27 +#define W_DMACR0__Data0WrMaxCr 3 +#define O_DMACR0__Data0RdMaxCr 24 +#define W_DMACR0__Data0RdMaxCr 3 +#define O_DMACR0__Data1WrMaxCr 21 +#define W_DMACR0__Data1WrMaxCr 3 +#define O_DMACR0__Data1RdMaxCr 18 +#define W_DMACR0__Data1RdMaxCr 3 +#define O_DMACR0__Data2WrMaxCr 15 +#define W_DMACR0__Data2WrMaxCr 3 +#define O_DMACR0__Data2RdMaxCr 12 +#define W_DMACR0__Data2RdMaxCr 3 +#define O_DMACR0__Data3WrMaxCr 9 +#define W_DMACR0__Data3WrMaxCr 3 +#define O_DMACR0__Data3RdMaxCr 6 +#define W_DMACR0__Data3RdMaxCr 3 +#define O_DMACR0__Data4WrMaxCr 3 +#define W_DMACR0__Data4WrMaxCr 3 +#define O_DMACR0__Data4RdMaxCr 0 +#define W_DMACR0__Data4RdMaxCr 3 +#define R_DMACR1 0x201 +#define O_DMACR1__Data5WrMaxCr 27 +#define W_DMACR1__Data5WrMaxCr 3 +#define O_DMACR1__Data5RdMaxCr 24 +#define W_DMACR1__Data5RdMaxCr 3 +#define O_DMACR1__Data6WrMaxCr 21 +#define W_DMACR1__Data6WrMaxCr 3 +#define O_DMACR1__Data6RdMaxCr 18 +#define W_DMACR1__Data6RdMaxCr 3 +#define O_DMACR1__Data7WrMaxCr 15 +#define W_DMACR1__Data7WrMaxCr 3 +#define O_DMACR1__Data7RdMaxCr 12 +#define W_DMACR1__Data7RdMaxCr 3 +#define O_DMACR1__Data8WrMaxCr 9 +#define W_DMACR1__Data8WrMaxCr 3 +#define O_DMACR1__Data8RdMaxCr 6 +#define W_DMACR1__Data8RdMaxCr 3 +#define O_DMACR1__Data9WrMaxCr 3 +#define W_DMACR1__Data9WrMaxCr 3 +#define O_DMACR1__Data9RdMaxCr 0 +#define W_DMACR1__Data9RdMaxCr 3 +#define R_DMACR2 0x202 +#define O_DMACR2__Data10WrMaxCr 27 +#define W_DMACR2__Data10WrMaxCr 3 +#define O_DMACR2__Data10RdMaxCr 24 +#define W_DMACR2__Data10RdMaxCr 3 +#define O_DMACR2__Data11WrMaxCr 21 +#define W_DMACR2__Data11WrMaxCr 3 +#define O_DMACR2__Data11RdMaxCr 18 +#define W_DMACR2__Data11RdMaxCr 3 +#define O_DMACR2__Data12WrMaxCr 15 +#define W_DMACR2__Data12WrMaxCr 3 +#define O_DMACR2__Data12RdMaxCr 12 +#define W_DMACR2__Data12RdMaxCr 3 +#define O_DMACR2__Data13WrMaxCr 9 +#define W_DMACR2__Data13WrMaxCr 3 +#define O_DMACR2__Data13RdMaxCr 6 +#define W_DMACR2__Data13RdMaxCr 3 +#define O_DMACR2__Data14WrMaxCr 3 +#define W_DMACR2__Data14WrMaxCr 3 +#define O_DMACR2__Data14RdMaxCr 0 +#define W_DMACR2__Data14RdMaxCr 3 +#define R_DMACR3 0x203 +#define O_DMACR3__Data15WrMaxCr 27 +#define W_DMACR3__Data15WrMaxCr 3 +#define O_DMACR3__Data15RdMaxCr 24 +#define W_DMACR3__Data15RdMaxCr 3 +#define O_DMACR3__SpClassWrMaxCr 21 +#define W_DMACR3__SpClassWrMaxCr 3 +#define O_DMACR3__SpClassRdMaxCr 18 +#define W_DMACR3__SpClassRdMaxCr 3 +#define O_DMACR3__JumFrInWrMaxCr 15 +#define W_DMACR3__JumFrInWrMaxCr 3 +#define O_DMACR3__JumFrInRdMaxCr 12 +#define W_DMACR3__JumFrInRdMaxCr 3 +#define O_DMACR3__RegFrInWrMaxCr 9 +#define W_DMACR3__RegFrInWrMaxCr 3 +#define O_DMACR3__RegFrInRdMaxCr 6 +#define W_DMACR3__RegFrInRdMaxCr 3 +#define O_DMACR3__FrOutWrMaxCr 3 +#define W_DMACR3__FrOutWrMaxCr 3 +#define O_DMACR3__FrOutRdMaxCr 0 +#define W_DMACR3__FrOutRdMaxCr 3 +#define R_REG_FRIN_SPILL_MEM_START_0 0x204 +#define O_REG_FRIN_SPILL_MEM_START_0__RegFrInSpillMemStart0 0 +#define W_REG_FRIN_SPILL_MEM_START_0__RegFrInSpillMemStart0 32 +#define R_REG_FRIN_SPILL_MEM_START_1 0x205 +#define O_REG_FRIN_SPILL_MEM_START_1__RegFrInSpillMemStart1 0 +#define W_REG_FRIN_SPILL_MEM_START_1__RegFrInSpillMemStart1 3 +#define R_REG_FRIN_SPILL_MEM_SIZE 0x206 +#define O_REG_FRIN_SPILL_MEM_SIZE__RegFrInSpillMemSize 0 +#define W_REG_FRIN_SPILL_MEM_SIZE__RegFrInSpillMemSize 32 +#define R_FROUT_SPILL_MEM_START_0 0x207 +#define O_FROUT_SPILL_MEM_START_0__FrOutSpillMemStart0 0 +#define W_FROUT_SPILL_MEM_START_0__FrOutSpillMemStart0 32 +#define R_FROUT_SPILL_MEM_START_1 0x208 +#define O_FROUT_SPILL_MEM_START_1__FrOutSpillMemStart1 0 +#define W_FROUT_SPILL_MEM_START_1__FrOutSpillMemStart1 3 +#define R_FROUT_SPILL_MEM_SIZE 0x209 +#define O_FROUT_SPILL_MEM_SIZE__FrOutSpillMemSize 0 +#define W_FROUT_SPILL_MEM_SIZE__FrOutSpillMemSize 32 +#define R_CLASS0_SPILL_MEM_START_0 0x20A +#define O_CLASS0_SPILL_MEM_START_0__Class0SpillMemStart0 0 +#define W_CLASS0_SPILL_MEM_START_0__Class0SpillMemStart0 32 +#define R_CLASS0_SPILL_MEM_START_1 0x20B +#define O_CLASS0_SPILL_MEM_START_1__Class0SpillMemStart1 0 +#define W_CLASS0_SPILL_MEM_START_1__Class0SpillMemStart1 3 +#define R_CLASS0_SPILL_MEM_SIZE 0x20C +#define O_CLASS0_SPILL_MEM_SIZE__Class0SpillMemSize 0 +#define W_CLASS0_SPILL_MEM_SIZE__Class0SpillMemSize 32 +#define R_JUMFRIN_SPILL_MEM_START_0 0x20D +#define O_JUMFRIN_SPILL_MEM_START_0__JumFrInSpillMemStar0 0 +#define W_JUMFRIN_SPILL_MEM_START_0__JumFrInSpillMemStar0 32 +#define R_JUMFRIN_SPILL_MEM_START_1 0x20E +#define O_JUMFRIN_SPILL_MEM_START_1__JumFrInSpillMemStart1 0 +#define W_JUMFRIN_SPILL_MEM_START_1__JumFrInSpillMemStart1 3 +#define R_JUMFRIN_SPILL_MEM_SIZE 0x20F +#define O_JUMFRIN_SPILL_MEM_SIZE__JumFrInSpillMemSize 0 +#define W_JUMFRIN_SPILL_MEM_SIZE__JumFrInSpillMemSize 32 +#define R_CLASS1_SPILL_MEM_START_0 0x210 +#define O_CLASS1_SPILL_MEM_START_0__Class1SpillMemStart0 0 +#define W_CLASS1_SPILL_MEM_START_0__Class1SpillMemStart0 32 +#define R_CLASS1_SPILL_MEM_START_1 0x211 +#define O_CLASS1_SPILL_MEM_START_1__Class1SpillMemStart1 0 +#define W_CLASS1_SPILL_MEM_START_1__Class1SpillMemStart1 3 +#define R_CLASS1_SPILL_MEM_SIZE 0x212 +#define O_CLASS1_SPILL_MEM_SIZE__Class1SpillMemSize 0 +#define W_CLASS1_SPILL_MEM_SIZE__Class1SpillMemSize 32 +#define R_CLASS2_SPILL_MEM_START_0 0x213 +#define O_CLASS2_SPILL_MEM_START_0__Class2SpillMemStart0 0 +#define W_CLASS2_SPILL_MEM_START_0__Class2SpillMemStart0 32 +#define R_CLASS2_SPILL_MEM_START_1 0x214 +#define O_CLASS2_SPILL_MEM_START_1__Class2SpillMemStart1 0 +#define W_CLASS2_SPILL_MEM_START_1__Class2SpillMemStart1 3 +#define R_CLASS2_SPILL_MEM_SIZE 0x215 +#define O_CLASS2_SPILL_MEM_SIZE__Class2SpillMemSize 0 +#define W_CLASS2_SPILL_MEM_SIZE__Class2SpillMemSize 32 +#define R_CLASS3_SPILL_MEM_START_0 0x216 +#define O_CLASS3_SPILL_MEM_START_0__Class3SpillMemStart0 0 +#define W_CLASS3_SPILL_MEM_START_0__Class3SpillMemStart0 32 +#define R_CLASS3_SPILL_MEM_START_1 0x217 +#define O_CLASS3_SPILL_MEM_START_1__Class3SpillMemStart1 0 +#define W_CLASS3_SPILL_MEM_START_1__Class3SpillMemStart1 3 +#define R_CLASS3_SPILL_MEM_SIZE 0x218 +#define O_CLASS3_SPILL_MEM_SIZE__Class3SpillMemSize 0 +#define W_CLASS3_SPILL_MEM_SIZE__Class3SpillMemSize 32 +#define R_REG_FRIN1_SPILL_MEM_START_0 0x219 +#define R_REG_FRIN1_SPILL_MEM_START_1 0x21a +#define R_REG_FRIN1_SPILL_MEM_SIZE 0x21b +#define R_SPIHNGY0 0x219 +#define O_SPIHNGY0__EG_HNGY_THRESH_0 24 +#define W_SPIHNGY0__EG_HNGY_THRESH_0 7 +#define O_SPIHNGY0__EG_HNGY_THRESH_1 16 +#define W_SPIHNGY0__EG_HNGY_THRESH_1 7 +#define O_SPIHNGY0__EG_HNGY_THRESH_2 8 +#define W_SPIHNGY0__EG_HNGY_THRESH_2 7 +#define O_SPIHNGY0__EG_HNGY_THRESH_3 0 +#define W_SPIHNGY0__EG_HNGY_THRESH_3 7 +#define R_SPIHNGY1 0x21A +#define O_SPIHNGY1__EG_HNGY_THRESH_4 24 +#define W_SPIHNGY1__EG_HNGY_THRESH_4 7 +#define O_SPIHNGY1__EG_HNGY_THRESH_5 16 +#define W_SPIHNGY1__EG_HNGY_THRESH_5 7 +#define O_SPIHNGY1__EG_HNGY_THRESH_6 8 +#define W_SPIHNGY1__EG_HNGY_THRESH_6 7 +#define O_SPIHNGY1__EG_HNGY_THRESH_7 0 +#define W_SPIHNGY1__EG_HNGY_THRESH_7 7 +#define R_SPIHNGY2 0x21B +#define O_SPIHNGY2__EG_HNGY_THRESH_8 24 +#define W_SPIHNGY2__EG_HNGY_THRESH_8 7 +#define O_SPIHNGY2__EG_HNGY_THRESH_9 16 +#define W_SPIHNGY2__EG_HNGY_THRESH_9 7 +#define O_SPIHNGY2__EG_HNGY_THRESH_10 8 +#define W_SPIHNGY2__EG_HNGY_THRESH_10 7 +#define O_SPIHNGY2__EG_HNGY_THRESH_11 0 +#define W_SPIHNGY2__EG_HNGY_THRESH_11 7 +#define R_SPIHNGY3 0x21C +#define O_SPIHNGY3__EG_HNGY_THRESH_12 24 +#define W_SPIHNGY3__EG_HNGY_THRESH_12 7 +#define O_SPIHNGY3__EG_HNGY_THRESH_13 16 +#define W_SPIHNGY3__EG_HNGY_THRESH_13 7 +#define O_SPIHNGY3__EG_HNGY_THRESH_14 8 +#define W_SPIHNGY3__EG_HNGY_THRESH_14 7 +#define O_SPIHNGY3__EG_HNGY_THRESH_15 0 +#define W_SPIHNGY3__EG_HNGY_THRESH_15 7 +#define R_SPISTRV0 0x21D +#define O_SPISTRV0__EG_STRV_THRESH_0 24 +#define W_SPISTRV0__EG_STRV_THRESH_0 7 +#define O_SPISTRV0__EG_STRV_THRESH_1 16 +#define W_SPISTRV0__EG_STRV_THRESH_1 7 +#define O_SPISTRV0__EG_STRV_THRESH_2 8 +#define W_SPISTRV0__EG_STRV_THRESH_2 7 +#define O_SPISTRV0__EG_STRV_THRESH_3 0 +#define W_SPISTRV0__EG_STRV_THRESH_3 7 +#define R_SPISTRV1 0x21E +#define O_SPISTRV1__EG_STRV_THRESH_4 24 +#define W_SPISTRV1__EG_STRV_THRESH_4 7 +#define O_SPISTRV1__EG_STRV_THRESH_5 16 +#define W_SPISTRV1__EG_STRV_THRESH_5 7 +#define O_SPISTRV1__EG_STRV_THRESH_6 8 +#define W_SPISTRV1__EG_STRV_THRESH_6 7 +#define O_SPISTRV1__EG_STRV_THRESH_7 0 +#define W_SPISTRV1__EG_STRV_THRESH_7 7 +#define R_SPISTRV2 0x21F +#define O_SPISTRV2__EG_STRV_THRESH_8 24 +#define W_SPISTRV2__EG_STRV_THRESH_8 7 +#define O_SPISTRV2__EG_STRV_THRESH_9 16 +#define W_SPISTRV2__EG_STRV_THRESH_9 7 +#define O_SPISTRV2__EG_STRV_THRESH_10 8 +#define W_SPISTRV2__EG_STRV_THRESH_10 7 +#define O_SPISTRV2__EG_STRV_THRESH_11 0 +#define W_SPISTRV2__EG_STRV_THRESH_11 7 +#define R_SPISTRV3 0x220 +#define O_SPISTRV3__EG_STRV_THRESH_12 24 +#define W_SPISTRV3__EG_STRV_THRESH_12 7 +#define O_SPISTRV3__EG_STRV_THRESH_13 16 +#define W_SPISTRV3__EG_STRV_THRESH_13 7 +#define O_SPISTRV3__EG_STRV_THRESH_14 8 +#define W_SPISTRV3__EG_STRV_THRESH_14 7 +#define O_SPISTRV3__EG_STRV_THRESH_15 0 +#define W_SPISTRV3__EG_STRV_THRESH_15 7 +#define R_TXDATAFIFO0 0x221 +#define O_TXDATAFIFO0__Tx0DataFifoStart 24 +#define W_TXDATAFIFO0__Tx0DataFifoStart 7 +#define O_TXDATAFIFO0__Tx0DataFifoSize 16 +#define W_TXDATAFIFO0__Tx0DataFifoSize 7 +#define O_TXDATAFIFO0__Tx1DataFifoStart 8 +#define W_TXDATAFIFO0__Tx1DataFifoStart 7 +#define O_TXDATAFIFO0__Tx1DataFifoSize 0 +#define W_TXDATAFIFO0__Tx1DataFifoSize 7 +#define R_TXDATAFIFO1 0x222 +#define O_TXDATAFIFO1__Tx2DataFifoStart 24 +#define W_TXDATAFIFO1__Tx2DataFifoStart 7 +#define O_TXDATAFIFO1__Tx2DataFifoSize 16 +#define W_TXDATAFIFO1__Tx2DataFifoSize 7 +#define O_TXDATAFIFO1__Tx3DataFifoStart 8 +#define W_TXDATAFIFO1__Tx3DataFifoStart 7 +#define O_TXDATAFIFO1__Tx3DataFifoSize 0 +#define W_TXDATAFIFO1__Tx3DataFifoSize 7 +#define R_TXDATAFIFO2 0x223 +#define O_TXDATAFIFO2__Tx4DataFifoStart 24 +#define W_TXDATAFIFO2__Tx4DataFifoStart 7 +#define O_TXDATAFIFO2__Tx4DataFifoSize 16 +#define W_TXDATAFIFO2__Tx4DataFifoSize 7 +#define O_TXDATAFIFO2__Tx5DataFifoStart 8 +#define W_TXDATAFIFO2__Tx5DataFifoStart 7 +#define O_TXDATAFIFO2__Tx5DataFifoSize 0 +#define W_TXDATAFIFO2__Tx5DataFifoSize 7 +#define R_TXDATAFIFO3 0x224 +#define O_TXDATAFIFO3__Tx6DataFifoStart 24 +#define W_TXDATAFIFO3__Tx6DataFifoStart 7 +#define O_TXDATAFIFO3__Tx6DataFifoSize 16 +#define W_TXDATAFIFO3__Tx6DataFifoSize 7 +#define O_TXDATAFIFO3__Tx7DataFifoStart 8 +#define W_TXDATAFIFO3__Tx7DataFifoStart 7 +#define O_TXDATAFIFO3__Tx7DataFifoSize 0 +#define W_TXDATAFIFO3__Tx7DataFifoSize 7 +#define R_TXDATAFIFO4 0x225 +#define O_TXDATAFIFO4__Tx8DataFifoStart 24 +#define W_TXDATAFIFO4__Tx8DataFifoStart 7 +#define O_TXDATAFIFO4__Tx8DataFifoSize 16 +#define W_TXDATAFIFO4__Tx8DataFifoSize 7 +#define O_TXDATAFIFO4__Tx9DataFifoStart 8 +#define W_TXDATAFIFO4__Tx9DataFifoStart 7 +#define O_TXDATAFIFO4__Tx9DataFifoSize 0 +#define W_TXDATAFIFO4__Tx9DataFifoSize 7 +#define R_TXDATAFIFO5 0x226 +#define O_TXDATAFIFO5__Tx10DataFifoStart 24 +#define W_TXDATAFIFO5__Tx10DataFifoStart 7 +#define O_TXDATAFIFO5__Tx10DataFifoSize 16 +#define W_TXDATAFIFO5__Tx10DataFifoSize 7 +#define O_TXDATAFIFO5__Tx11DataFifoStart 8 +#define W_TXDATAFIFO5__Tx11DataFifoStart 7 +#define O_TXDATAFIFO5__Tx11DataFifoSize 0 +#define W_TXDATAFIFO5__Tx11DataFifoSize 7 +#define R_TXDATAFIFO6 0x227 +#define O_TXDATAFIFO6__Tx12DataFifoStart 24 +#define W_TXDATAFIFO6__Tx12DataFifoStart 7 +#define O_TXDATAFIFO6__Tx12DataFifoSize 16 +#define W_TXDATAFIFO6__Tx12DataFifoSize 7 +#define O_TXDATAFIFO6__Tx13DataFifoStart 8 +#define W_TXDATAFIFO6__Tx13DataFifoStart 7 +#define O_TXDATAFIFO6__Tx13DataFifoSize 0 +#define W_TXDATAFIFO6__Tx13DataFifoSize 7 +#define R_TXDATAFIFO7 0x228 +#define O_TXDATAFIFO7__Tx14DataFifoStart 24 +#define W_TXDATAFIFO7__Tx14DataFifoStart 7 +#define O_TXDATAFIFO7__Tx14DataFifoSize 16 +#define W_TXDATAFIFO7__Tx14DataFifoSize 7 +#define O_TXDATAFIFO7__Tx15DataFifoStart 8 +#define W_TXDATAFIFO7__Tx15DataFifoStart 7 +#define O_TXDATAFIFO7__Tx15DataFifoSize 0 +#define W_TXDATAFIFO7__Tx15DataFifoSize 7 +#define R_RXDATAFIFO0 0x229 +#define O_RXDATAFIFO0__Rx0DataFifoStart 24 +#define W_RXDATAFIFO0__Rx0DataFifoStart 7 +#define O_RXDATAFIFO0__Rx0DataFifoSize 16 +#define W_RXDATAFIFO0__Rx0DataFifoSize 7 +#define O_RXDATAFIFO0__Rx1DataFifoStart 8 +#define W_RXDATAFIFO0__Rx1DataFifoStart 7 +#define O_RXDATAFIFO0__Rx1DataFifoSize 0 +#define W_RXDATAFIFO0__Rx1DataFifoSize 7 +#define R_RXDATAFIFO1 0x22A +#define O_RXDATAFIFO1__Rx2DataFifoStart 24 +#define W_RXDATAFIFO1__Rx2DataFifoStart 7 +#define O_RXDATAFIFO1__Rx2DataFifoSize 16 +#define W_RXDATAFIFO1__Rx2DataFifoSize 7 +#define O_RXDATAFIFO1__Rx3DataFifoStart 8 +#define W_RXDATAFIFO1__Rx3DataFifoStart 7 +#define O_RXDATAFIFO1__Rx3DataFifoSize 0 +#define W_RXDATAFIFO1__Rx3DataFifoSize 7 +#define R_RXDATAFIFO2 0x22B +#define O_RXDATAFIFO2__Rx4DataFifoStart 24 +#define W_RXDATAFIFO2__Rx4DataFifoStart 7 +#define O_RXDATAFIFO2__Rx4DataFifoSize 16 +#define W_RXDATAFIFO2__Rx4DataFifoSize 7 +#define O_RXDATAFIFO2__Rx5DataFifoStart 8 +#define W_RXDATAFIFO2__Rx5DataFifoStart 7 +#define O_RXDATAFIFO2__Rx5DataFifoSize 0 +#define W_RXDATAFIFO2__Rx5DataFifoSize 7 +#define R_RXDATAFIFO3 0x22C +#define O_RXDATAFIFO3__Rx6DataFifoStart 24 +#define W_RXDATAFIFO3__Rx6DataFifoStart 7 +#define O_RXDATAFIFO3__Rx6DataFifoSize 16 +#define W_RXDATAFIFO3__Rx6DataFifoSize 7 +#define O_RXDATAFIFO3__Rx7DataFifoStart 8 +#define W_RXDATAFIFO3__Rx7DataFifoStart 7 +#define O_RXDATAFIFO3__Rx7DataFifoSize 0 +#define W_RXDATAFIFO3__Rx7DataFifoSize 7 +#define R_RXDATAFIFO4 0x22D +#define O_RXDATAFIFO4__Rx8DataFifoStart 24 +#define W_RXDATAFIFO4__Rx8DataFifoStart 7 +#define O_RXDATAFIFO4__Rx8DataFifoSize 16 +#define W_RXDATAFIFO4__Rx8DataFifoSize 7 +#define O_RXDATAFIFO4__Rx9DataFifoStart 8 +#define W_RXDATAFIFO4__Rx9DataFifoStart 7 +#define O_RXDATAFIFO4__Rx9DataFifoSize 0 +#define W_RXDATAFIFO4__Rx9DataFifoSize 7 +#define R_RXDATAFIFO5 0x22E +#define O_RXDATAFIFO5__Rx10DataFifoStart 24 +#define W_RXDATAFIFO5__Rx10DataFifoStart 7 +#define O_RXDATAFIFO5__Rx10DataFifoSize 16 +#define W_RXDATAFIFO5__Rx10DataFifoSize 7 +#define O_RXDATAFIFO5__Rx11DataFifoStart 8 +#define W_RXDATAFIFO5__Rx11DataFifoStart 7 +#define O_RXDATAFIFO5__Rx11DataFifoSize 0 +#define W_RXDATAFIFO5__Rx11DataFifoSize 7 +#define R_RXDATAFIFO6 0x22F +#define O_RXDATAFIFO6__Rx12DataFifoStart 24 +#define W_RXDATAFIFO6__Rx12DataFifoStart 7 +#define O_RXDATAFIFO6__Rx12DataFifoSize 16 +#define W_RXDATAFIFO6__Rx12DataFifoSize 7 +#define O_RXDATAFIFO6__Rx13DataFifoStart 8 +#define W_RXDATAFIFO6__Rx13DataFifoStart 7 +#define O_RXDATAFIFO6__Rx13DataFifoSize 0 +#define W_RXDATAFIFO6__Rx13DataFifoSize 7 +#define R_RXDATAFIFO7 0x230 +#define O_RXDATAFIFO7__Rx14DataFifoStart 24 +#define W_RXDATAFIFO7__Rx14DataFifoStart 7 +#define O_RXDATAFIFO7__Rx14DataFifoSize 16 +#define W_RXDATAFIFO7__Rx14DataFifoSize 7 +#define O_RXDATAFIFO7__Rx15DataFifoStart 8 +#define W_RXDATAFIFO7__Rx15DataFifoStart 7 +#define O_RXDATAFIFO7__Rx15DataFifoSize 0 +#define W_RXDATAFIFO7__Rx15DataFifoSize 7 +#define R_XGMACPADCALIBRATION 0x231 +#define R_FREEQCARVE 0x233 +#define R_SPI4STATICDELAY0 0x240 +#define O_SPI4STATICDELAY0__DataLine7 28 +#define W_SPI4STATICDELAY0__DataLine7 4 +#define O_SPI4STATICDELAY0__DataLine6 24 +#define W_SPI4STATICDELAY0__DataLine6 4 +#define O_SPI4STATICDELAY0__DataLine5 20 +#define W_SPI4STATICDELAY0__DataLine5 4 +#define O_SPI4STATICDELAY0__DataLine4 16 +#define W_SPI4STATICDELAY0__DataLine4 4 +#define O_SPI4STATICDELAY0__DataLine3 12 +#define W_SPI4STATICDELAY0__DataLine3 4 +#define O_SPI4STATICDELAY0__DataLine2 8 +#define W_SPI4STATICDELAY0__DataLine2 4 +#define O_SPI4STATICDELAY0__DataLine1 4 +#define W_SPI4STATICDELAY0__DataLine1 4 +#define O_SPI4STATICDELAY0__DataLine0 0 +#define W_SPI4STATICDELAY0__DataLine0 4 +#define R_SPI4STATICDELAY1 0x241 +#define O_SPI4STATICDELAY1__DataLine15 28 +#define W_SPI4STATICDELAY1__DataLine15 4 +#define O_SPI4STATICDELAY1__DataLine14 24 +#define W_SPI4STATICDELAY1__DataLine14 4 +#define O_SPI4STATICDELAY1__DataLine13 20 +#define W_SPI4STATICDELAY1__DataLine13 4 +#define O_SPI4STATICDELAY1__DataLine12 16 +#define W_SPI4STATICDELAY1__DataLine12 4 +#define O_SPI4STATICDELAY1__DataLine11 12 +#define W_SPI4STATICDELAY1__DataLine11 4 +#define O_SPI4STATICDELAY1__DataLine10 8 +#define W_SPI4STATICDELAY1__DataLine10 4 +#define O_SPI4STATICDELAY1__DataLine9 4 +#define W_SPI4STATICDELAY1__DataLine9 4 +#define O_SPI4STATICDELAY1__DataLine8 0 +#define W_SPI4STATICDELAY1__DataLine8 4 +#define R_SPI4STATICDELAY2 0x242 +#define O_SPI4STATICDELAY0__TxStat1 8 +#define W_SPI4STATICDELAY0__TxStat1 4 +#define O_SPI4STATICDELAY0__TxStat0 4 +#define W_SPI4STATICDELAY0__TxStat0 4 +#define O_SPI4STATICDELAY0__RxControl 0 +#define W_SPI4STATICDELAY0__RxControl 4 +#define R_SPI4CONTROL 0x243 +#define O_SPI4CONTROL__StaticDelay 2 +#define O_SPI4CONTROL__LVDS_LVTTL 1 +#define O_SPI4CONTROL__SPI4Enable 0 +#define R_CLASSWATERMARKS 0x244 +#define O_CLASSWATERMARKS__Class0Watermark 24 +#define W_CLASSWATERMARKS__Class0Watermark 5 +#define O_CLASSWATERMARKS__Class1Watermark 16 +#define W_CLASSWATERMARKS__Class1Watermark 5 +#define O_CLASSWATERMARKS__Class3Watermark 0 +#define W_CLASSWATERMARKS__Class3Watermark 5 +#define R_RXWATERMARKS1 0x245 +#define O_RXWATERMARKS__Rx0DataWatermark 24 +#define W_RXWATERMARKS__Rx0DataWatermark 7 +#define O_RXWATERMARKS__Rx1DataWatermark 16 +#define W_RXWATERMARKS__Rx1DataWatermark 7 +#define O_RXWATERMARKS__Rx3DataWatermark 0 +#define W_RXWATERMARKS__Rx3DataWatermark 7 +#define R_RXWATERMARKS2 0x246 +#define O_RXWATERMARKS__Rx4DataWatermark 24 +#define W_RXWATERMARKS__Rx4DataWatermark 7 +#define O_RXWATERMARKS__Rx5DataWatermark 16 +#define W_RXWATERMARKS__Rx5DataWatermark 7 +#define O_RXWATERMARKS__Rx6DataWatermark 8 +#define W_RXWATERMARKS__Rx6DataWatermark 7 +#define O_RXWATERMARKS__Rx7DataWatermark 0 +#define W_RXWATERMARKS__Rx7DataWatermark 7 +#define R_RXWATERMARKS3 0x247 +#define O_RXWATERMARKS__Rx8DataWatermark 24 +#define W_RXWATERMARKS__Rx8DataWatermark 7 +#define O_RXWATERMARKS__Rx9DataWatermark 16 +#define W_RXWATERMARKS__Rx9DataWatermark 7 +#define O_RXWATERMARKS__Rx10DataWatermark 8 +#define W_RXWATERMARKS__Rx10DataWatermark 7 +#define O_RXWATERMARKS__Rx11DataWatermark 0 +#define W_RXWATERMARKS__Rx11DataWatermark 7 +#define R_RXWATERMARKS4 0x248 +#define O_RXWATERMARKS__Rx12DataWatermark 24 +#define W_RXWATERMARKS__Rx12DataWatermark 7 +#define O_RXWATERMARKS__Rx13DataWatermark 16 +#define W_RXWATERMARKS__Rx13DataWatermark 7 +#define O_RXWATERMARKS__Rx14DataWatermark 8 +#define W_RXWATERMARKS__Rx14DataWatermark 7 +#define O_RXWATERMARKS__Rx15DataWatermark 0 +#define W_RXWATERMARKS__Rx15DataWatermark 7 +#define R_FREEWATERMARKS 0x249 +#define O_FREEWATERMARKS__FreeOutWatermark 16 +#define W_FREEWATERMARKS__FreeOutWatermark 16 +#define O_FREEWATERMARKS__JumFrWatermark 8 +#define W_FREEWATERMARKS__JumFrWatermark 7 +#define O_FREEWATERMARKS__RegFrWatermark 0 +#define W_FREEWATERMARKS__RegFrWatermark 7 +#define R_EGRESSFIFOCARVINGSLOTS 0x24a + +#define CTRL_RES0 0 +#define CTRL_RES1 1 +#define CTRL_REG_FREE 2 +#define CTRL_JUMBO_FREE 3 +#define CTRL_CONT 4 +#define CTRL_EOP 5 +#define CTRL_START 6 +#define CTRL_SNGL 7 + +#define CTRL_B0_NOT_EOP 0 +#define CTRL_B0_EOP 1 + +#define R_ROUND_ROBIN_TABLE 0 +#define R_PDE_CLASS_0 0x300 +#define R_PDE_CLASS_1 0x302 +#define R_PDE_CLASS_2 0x304 +#define R_PDE_CLASS_3 0x306 + +#define R_MSG_TX_THRESHOLD 0x308 + +#define R_GMAC_JFR0_BUCKET_SIZE 0x320 +#define R_GMAC_RFR0_BUCKET_SIZE 0x321 +#define R_GMAC_TX0_BUCKET_SIZE 0x322 +#define R_GMAC_TX1_BUCKET_SIZE 0x323 +#define R_GMAC_TX2_BUCKET_SIZE 0x324 +#define R_GMAC_TX3_BUCKET_SIZE 0x325 +#define R_GMAC_JFR1_BUCKET_SIZE 0x326 +#define R_GMAC_RFR1_BUCKET_SIZE 0x327 + +#define R_XGS_TX0_BUCKET_SIZE 0x320 +#define R_XGS_TX1_BUCKET_SIZE 0x321 +#define R_XGS_TX2_BUCKET_SIZE 0x322 +#define R_XGS_TX3_BUCKET_SIZE 0x323 +#define R_XGS_TX4_BUCKET_SIZE 0x324 +#define R_XGS_TX5_BUCKET_SIZE 0x325 +#define R_XGS_TX6_BUCKET_SIZE 0x326 +#define R_XGS_TX7_BUCKET_SIZE 0x327 +#define R_XGS_TX8_BUCKET_SIZE 0x328 +#define R_XGS_TX9_BUCKET_SIZE 0x329 +#define R_XGS_TX10_BUCKET_SIZE 0x32A +#define R_XGS_TX11_BUCKET_SIZE 0x32B +#define R_XGS_TX12_BUCKET_SIZE 0x32C +#define R_XGS_TX13_BUCKET_SIZE 0x32D +#define R_XGS_TX14_BUCKET_SIZE 0x32E +#define R_XGS_TX15_BUCKET_SIZE 0x32F +#define R_XGS_JFR_BUCKET_SIZE 0x330 +#define R_XGS_RFR_BUCKET_SIZE 0x331 + +#define R_CC_CPU0_0 0x380 +#define R_CC_CPU1_0 0x388 +#define R_CC_CPU2_0 0x390 +#define R_CC_CPU3_0 0x398 +#define R_CC_CPU4_0 0x3a0 +#define R_CC_CPU5_0 0x3a8 +#define R_CC_CPU6_0 0x3b0 +#define R_CC_CPU7_0 0x3b8 + +typedef enum { + xlr_mac_speed_10, xlr_mac_speed_100, + xlr_mac_speed_1000, xlr_mac_speed_rsvd +} xlr_mac_speed_t; + +typedef enum { + xlr_mac_duplex_auto, xlr_mac_duplex_half, + xlr_mac_duplex_full +} xlr_mac_duplex_t; + +typedef enum { + xlr_mac_link_down, + xlr_mac_link_up, +} xlr_mac_link_t; + +typedef enum { + xlr_mac_fc_auto, xlr_mac_fc_disabled, xlr_mac_fc_frame, + xlr_mac_fc_collision, xlr_mac_fc_carrier +} xlr_mac_fc_t; + +/* static int mac_frin_to_be_sent_thr[8]; */ + +enum { + PORT_TX, + PORT_TX_COMPLETE, + PORT_STARTQ, + PORT_STOPQ, + PORT_START_DEV_STATE, + PORT_STOP_DEV_STATE, +}; + +struct rge_softc_stats { + unsigned long rx_frames; + unsigned long tx_frames; + unsigned long rx_packets; + unsigned long rx_bytes; + unsigned long tx_packets; + unsigned long tx_bytes; +}; + +struct driver_data { + + /* + * Let these be the first fields in this structure the structure is + * cacheline aligned when allocated in init_etherdev + */ + struct fr_desc *frin_spill; + struct fr_desc *frout_spill; + union rx_tx_desc *class_0_spill; + union rx_tx_desc *class_1_spill; + union rx_tx_desc *class_2_spill; + union rx_tx_desc *class_3_spill; + int spill_configured; + + struct rge_softc *sc; /* pointer to freebsd device soft-pointer */ + struct rge_softc_stats stats; + struct mtx lock; + + xlr_reg_t *mmio; + xlr_reg_t *mii_mmio; + xlr_reg_t *pcs_mmio; + xlr_reg_t *serdes_mmio; + + int txbucket; + int rfrbucket; + + int phy_oldbmsr; + int phy_oldanlpar; + int phy_oldk1stsr; + int phy_oldlinkstat; + unsigned char phys_addr[2]; + + xlr_mac_speed_t speed; /* current speed */ + xlr_mac_duplex_t duplex;/* current duplex */ + xlr_mac_link_t link; /* current link */ + xlr_mac_fc_t flow_ctrl; /* current flow control setting */ + int advertising; + + int id; + int type; + int mode; + int instance; + int phy_addr; + int frin_to_be_sent[8]; + int init_frin_desc; +}; + +struct rge_softc { + int unit; + int irq; + unsigned char dev_addr[6]; + unsigned long base_addr; + unsigned long mem_end; + struct ifnet *rge_ifp; /* interface info */ + device_t rge_dev; + int mtu; + int flags; + struct driver_data priv; + struct mtx rge_mtx; + device_t rge_miibus; + struct mii_data rge_mii;/* MII/media information */ + bus_space_handle_t rge_bhandle; + bus_space_tag_t rge_btag; + void *rge_intrhand; + struct resource rge_irq; + struct resource *rge_res; + struct ifmedia rge_ifmedia; /* TBI media info */ + int rge_if_flags; + int rge_link; /* link state */ + int rge_link_evt; /* pending link event */ + struct callout rge_stat_ch; + void (*xmit) (struct ifnet *); + void (*stop) (struct rge_softc *); + int (*ioctl) (struct ifnet *, u_long, caddr_t); + struct rge_softc_stats *(*get_stats) (struct rge_softc *); + int active; + int link_up; +}; + +struct size_1_desc { + uint64_t entry0; +}; + +struct size_2_desc { + uint64_t entry0; + uint64_t entry1; +}; + +struct size_3_desc { + uint64_t entry0; + uint64_t entry1; + uint64_t entry2; +}; + +struct size_4_desc { + uint64_t entry0; + uint64_t entry1; + uint64_t entry2; + uint64_t entry3; +}; + +struct fr_desc { + struct size_1_desc d1; +}; + +union rx_tx_desc { + struct size_2_desc d2; + /* struct size_3_desc d3; */ + /* struct size_4_desc d4; */ +}; + + +extern unsigned char xlr_base_mac_addr[]; + +#endif diff --git a/sys/mips/rmi/dev/xlr/xgmac_mdio.h b/sys/mips/rmi/dev/xlr/xgmac_mdio.h new file mode 100644 index 000000000000..5d0a3d0cd536 --- /dev/null +++ b/sys/mips/rmi/dev/xlr/xgmac_mdio.h @@ -0,0 +1,127 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +/* MDIO Low level Access routines */ +/* All Phy's accessed from GMAC0 base */ + +#ifndef _XGMAC_MDIO_H_ +#define _XGMAC_MDIO_H_ + +static inline int +xmdio_read(volatile unsigned int *_mmio, + uint32_t phy_addr, uint32_t address); +static inline void +xmdio_write(volatile unsigned int *_mmio, + uint32_t phy_addr, uint32_t address, uint32_t data); +static inline void +xmdio_address(volatile unsigned int *_mmio, + uint32_t phy_addr, uint32_t dev_ad, uint32_t address); + +static inline void +xmdio_address(volatile unsigned int *_mmio, + uint32_t phy_addr, uint32_t dev_ad, uint32_t address) +{ + uint32_t st_field = 0x0; + uint32_t op_type = 0x0; /* address operation */ + uint32_t ta_field = 0x2;/* ta field */ + + _mmio[0x11] = ((st_field & 0x3) << 30) | + ((op_type & 0x3) << 28) | + ((phy_addr & 0x1F) << 23) | + ((dev_ad & 0x1F) << 18) | + ((ta_field & 0x3) << 16) | + ((address & 0xffff) << 0); + + _mmio[0x10] = (0x0 << 3) | 0x5; + _mmio[0x10] = (0x1 << 3) | 0x5; + _mmio[0x10] = (0x0 << 3) | 0x5; + + /* wait for dev_ad cycle to complete */ + while (_mmio[0x14] & 0x1) { + }; + +} + +/* function prototypes */ +static inline int +xmdio_read(volatile unsigned int *_mmio, + uint32_t phy_addr, uint32_t address) +{ + uint32_t st_field = 0x0; + uint32_t op_type = 0x3; /* read operation */ + uint32_t ta_field = 0x2;/* ta field */ + uint32_t data = 0; + + xmdio_address(_mmio, phy_addr, 5, address); + _mmio[0x11] = ((st_field & 0x3) << 30) | + ((op_type & 0x3) << 28) | + ((phy_addr & 0x1F) << 23) | + ((5 & 0x1F) << 18) | + ((ta_field & 0x3) << 16) | + ((data & 0xffff) << 0); + + _mmio[0x10] = (0x0 << 3) | 0x5; + _mmio[0x10] = (0x1 << 3) | 0x5; + _mmio[0x10] = (0x0 << 3) | 0x5; + + /* wait for write cycle to complete */ + while (_mmio[0x14] & 0x1) { + }; + + data = _mmio[0x11] & 0xffff; + return (data); +} + +static inline void +xmdio_write(volatile unsigned int *_mmio, + uint32_t phy_addr, uint32_t address, uint32_t data) +{ + uint32_t st_field = 0x0; + uint32_t op_type = 0x1; /* write operation */ + uint32_t ta_field = 0x2;/* ta field */ + + xmdio_address(_mmio, phy_addr, 5, address); + _mmio[0x11] = ((st_field & 0x3) << 30) | + ((op_type & 0x3) << 28) | + ((phy_addr & 0x1F) << 23) | + ((5 & 0x1F) << 18) | + ((ta_field & 0x3) << 16) | + ((data & 0xffff) << 0); + + _mmio[0x10] = (0x0 << 3) | 0x5; + _mmio[0x10] = (0x1 << 3) | 0x5; + _mmio[0x10] = (0x0 << 3) | 0x5; + + /* wait for write cycle to complete */ + while (_mmio[0x14] & 0x1) { + }; + +} + +#endif diff --git a/sys/mips/rmi/ehcireg.h b/sys/mips/rmi/ehcireg.h new file mode 100644 index 000000000000..71af999ab214 --- /dev/null +++ b/sys/mips/rmi/ehcireg.h @@ -0,0 +1,309 @@ +/* $NetBSD: ehcireg.h,v 1.18 2004/10/22 10:38:17 augustss Exp $ */ +/* $FreeBSD$ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson (lennart@augustsson.net). + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +/* + * The EHCI 0.96 spec can be found at + * http://developer.intel.com/technology/usb/download/ehci-r096.pdf + * and the USB 2.0 spec at + * http://www.usb.org/developers/data/usb_20.zip + */ + +#ifndef _DEV_PCI_EHCIREG_H_ +#define _DEV_PCI_EHCIREG_H_ + +/*** PCI config registers ***/ + +#define PCI_CBMEM 0x10 /* configuration base MEM */ + +#define PCI_INTERFACE_EHCI 0x20 + +#define PCI_USBREV 0x60 /* RO USB protocol revision */ +#define PCI_USBREV_MASK 0xff +#define PCI_USBREV_PRE_1_0 0x00 +#define PCI_USBREV_1_0 0x10 +#define PCI_USBREV_1_1 0x11 +#define PCI_USBREV_2_0 0x20 + +#define PCI_EHCI_FLADJ 0x61 /* RW Frame len adj, SOF=59488+6*fladj */ + +#define PCI_EHCI_PORTWAKECAP 0x62 /* RW Port wake caps (opt) */ + +/* EHCI Extended Capabilities */ +#define EHCI_EC_LEGSUP 0x01 + +#define EHCI_EECP_NEXT(x) (((x) >> 8) & 0xff) +#define EHCI_EECP_ID(x) ((x) & 0xff) + +/* Legacy support extended capability */ +#define EHCI_LEGSUP_OS_SEM 0x03 /* OS owned semaphore */ +#define EHCI_LEGSUP_BIOS_SEM 0x02 /* BIOS owned semaphore */ +#define EHCI_LEGSUP_USBLEGCTLSTS 0x04 + +/*** EHCI capability registers ***/ + +#define EHCI_CAPLENGTH 0x00 /* RO Capability register length field */ +/* reserved 0x01 */ +#define EHCI_HCIVERSION 0x02 /* RO Interface version number */ + +#define EHCI_HCSPARAMS 0x04 /* RO Structural parameters */ +#define EHCI_HCS_DEBUGPORT(x) (((x) >> 20) & 0xf) +#define EHCI_HCS_P_INDICATOR(x) ((x) & 0x10000) +#define EHCI_HCS_N_CC(x) (((x) >> 12) & 0xf) /* # of companion ctlrs */ +#define EHCI_HCS_N_PCC(x) (((x) >> 8) & 0xf) /* # of ports per comp. */ +#define EHCI_HCS_PPC(x) ((x) & 0x10) /* port power control */ +#define EHCI_HCS_N_PORTS(x) ((x) & 0xf) /* # of ports */ + +#define EHCI_HCCPARAMS 0x08 /* RO Capability parameters */ +#define EHCI_HCC_EECP(x) (((x) >> 8) & 0xff) /* extended ports caps */ +#define EHCI_HCC_IST(x) (((x) >> 4) & 0xf) /* isoc sched threshold */ +#define EHCI_HCC_ASPC(x) ((x) & 0x4) /* async sched park cap */ +#define EHCI_HCC_PFLF(x) ((x) & 0x2) /* prog frame list flag */ +#define EHCI_HCC_64BIT(x) ((x) & 0x1) /* 64 bit address cap */ + +#define EHCI_HCSP_PORTROUTE 0x0c /* RO Companion port route description */ + +/* EHCI operational registers. Offset given by EHCI_CAPLENGTH register */ +#define EHCI_USBCMD 0x00 /* RO, RW, WO Command register */ +#define EHCI_CMD_ITC_M 0x00ff0000 /* RW interrupt threshold ctrl */ +#define EHCI_CMD_ITC_1 0x00010000 +#define EHCI_CMD_ITC_2 0x00020000 +#define EHCI_CMD_ITC_4 0x00040000 +#define EHCI_CMD_ITC_8 0x00080000 +#define EHCI_CMD_ITC_16 0x00100000 +#define EHCI_CMD_ITC_32 0x00200000 +#define EHCI_CMD_ITC_64 0x00400000 +#define EHCI_CMD_ASPME 0x00000800 /* RW/RO async park enable */ +#define EHCI_CMD_ASPMC 0x00000300 /* RW/RO async park count */ +#define EHCI_CMD_LHCR 0x00000080 /* RW light host ctrl reset */ +#define EHCI_CMD_IAAD 0x00000040 /* RW intr on async adv door + * bell */ +#define EHCI_CMD_ASE 0x00000020 /* RW async sched enable */ +#define EHCI_CMD_PSE 0x00000010 /* RW periodic sched enable */ +#define EHCI_CMD_FLS_M 0x0000000c /* RW/RO frame list size */ +#define EHCI_CMD_FLS(x) (((x) >> 2) & 3) /* RW/RO frame list size */ +#define EHCI_CMD_HCRESET 0x00000002 /* RW reset */ +#define EHCI_CMD_RS 0x00000001 /* RW run/stop */ + +#define EHCI_USBSTS 0x04 /* RO, RW, RWC Status register */ +#define EHCI_STS_ASS 0x00008000 /* RO async sched status */ +#define EHCI_STS_PSS 0x00004000 /* RO periodic sched status */ +#define EHCI_STS_REC 0x00002000 /* RO reclamation */ +#define EHCI_STS_HCH 0x00001000 /* RO host controller halted */ +#define EHCI_STS_IAA 0x00000020 /* RWC interrupt on async adv */ +#define EHCI_STS_HSE 0x00000010 /* RWC host system error */ +#define EHCI_STS_FLR 0x00000008 /* RWC frame list rollover */ +#define EHCI_STS_PCD 0x00000004 /* RWC port change detect */ +#define EHCI_STS_ERRINT 0x00000002 /* RWC error interrupt */ +#define EHCI_STS_INT 0x00000001 /* RWC interrupt */ +#define EHCI_STS_INTRS(x) ((x) & 0x3f) + +#define EHCI_NORMAL_INTRS (EHCI_STS_IAA | EHCI_STS_HSE | EHCI_STS_PCD | EHCI_STS_ERRINT | EHCI_STS_INT) + +#define EHCI_USBINTR 0x08 /* RW Interrupt register */ +#define EHCI_INTR_IAAE 0x00000020 /* interrupt on async advance + * ena */ +#define EHCI_INTR_HSEE 0x00000010 /* host system error ena */ +#define EHCI_INTR_FLRE 0x00000008 /* frame list rollover ena */ +#define EHCI_INTR_PCIE 0x00000004 /* port change ena */ +#define EHCI_INTR_UEIE 0x00000002 /* USB error intr ena */ +#define EHCI_INTR_UIE 0x00000001 /* USB intr ena */ + +#define EHCI_FRINDEX 0x0c /* RW Frame Index register */ + +#define EHCI_CTRLDSSEGMENT 0x10 /* RW Control Data Structure Segment */ + +#define EHCI_PERIODICLISTBASE 0x14 /* RW Periodic List Base */ +#define EHCI_ASYNCLISTADDR 0x18 /* RW Async List Base */ + +#define EHCI_CONFIGFLAG 0x40 /* RW Configure Flag register */ +#define EHCI_CONF_CF 0x00000001 /* RW configure flag */ + +#define EHCI_PORTSC(n) (0x40+4*(n)) /* RO, RW, RWC Port Status reg */ +#define EHCI_PS_WKOC_E 0x00400000 /* RW wake on over current ena */ +#define EHCI_PS_WKDSCNNT_E 0x00200000 /* RW wake on disconnect ena */ +#define EHCI_PS_WKCNNT_E 0x00100000 /* RW wake on connect ena */ +#define EHCI_PS_PTC 0x000f0000 /* RW port test control */ +#define EHCI_PS_PIC 0x0000c000 /* RW port indicator control */ +#define EHCI_PS_PO 0x00002000 /* RW port owner */ +#define EHCI_PS_PP 0x00001000 /* RW,RO port power */ +#define EHCI_PS_LS 0x00000c00 /* RO line status */ +#define EHCI_PS_IS_LOWSPEED(x) (((x) & EHCI_PS_LS) == 0x00000400) +#define EHCI_PS_PR 0x00000100 /* RW port reset */ +#define EHCI_PS_SUSP 0x00000080 /* RW suspend */ +#define EHCI_PS_FPR 0x00000040 /* RW force port resume */ +#define EHCI_PS_OCC 0x00000020 /* RWC over current change */ +#define EHCI_PS_OCA 0x00000010 /* RO over current active */ +#define EHCI_PS_PEC 0x00000008 /* RWC port enable change */ +#define EHCI_PS_PE 0x00000004 /* RW port enable */ +#define EHCI_PS_CSC 0x00000002 /* RWC connect status change */ +#define EHCI_PS_CS 0x00000001 /* RO connect status */ +#define EHCI_PS_CLEAR (EHCI_PS_OCC|EHCI_PS_PEC|EHCI_PS_CSC) + +#define EHCI_PORT_RESET_COMPLETE 2 /* ms */ + +#define EHCI_FLALIGN_ALIGN 0x1000 + +/* No data structure may cross a page boundary. */ +#define EHCI_PAGE_SIZE 0x1000 +#define EHCI_PAGE(x) ((x) &~ 0xfff) +#define EHCI_PAGE_OFFSET(x) ((x) & 0xfff) +#if defined(__FreeBSD__) +#define EHCI_PAGE_MASK(x) ((x) & 0xfff) +#endif + +typedef u_int32_t ehci_link_t; + +#define EHCI_LINK_TERMINATE 0x00000001 +#define EHCI_LINK_TYPE(x) ((x) & 0x00000006) +#define EHCI_LINK_ITD 0x0 +#define EHCI_LINK_QH 0x2 +#define EHCI_LINK_SITD 0x4 +#define EHCI_LINK_FSTN 0x6 +#define EHCI_LINK_ADDR(x) ((x) &~ 0x1f) + +typedef u_int32_t ehci_physaddr_t; + +/* Isochronous Transfer Descriptor */ +typedef struct { + ehci_link_t itd_next; + /* XXX many more */ +} ehci_itd_t; + +#define EHCI_ITD_ALIGN 32 + +/* Split Transaction Isochronous Transfer Descriptor */ +typedef struct { + ehci_link_t sitd_next; + /* XXX many more */ +} ehci_sitd_t; + +#define EHCI_SITD_ALIGN 32 + +/* Queue Element Transfer Descriptor */ +#define EHCI_QTD_NBUFFERS 5 +typedef struct { + ehci_link_t qtd_next; + ehci_link_t qtd_altnext; + u_int32_t qtd_status; +#define EHCI_QTD_GET_STATUS(x) (((x) >> 0) & 0xff) +#define EHCI_QTD_SET_STATUS(x) ((x) << 0) +#define EHCI_QTD_ACTIVE 0x80 +#define EHCI_QTD_HALTED 0x40 +#define EHCI_QTD_BUFERR 0x20 +#define EHCI_QTD_BABBLE 0x10 +#define EHCI_QTD_XACTERR 0x08 +#define EHCI_QTD_MISSEDMICRO 0x04 +#define EHCI_QTD_SPLITXSTATE 0x02 +#define EHCI_QTD_PINGSTATE 0x01 +#define EHCI_QTD_STATERRS 0x7c +#define EHCI_QTD_GET_PID(x) (((x) >> 8) & 0x3) +#define EHCI_QTD_SET_PID(x) ((x) << 8) +#define EHCI_QTD_PID_OUT 0x0 +#define EHCI_QTD_PID_IN 0x1 +#define EHCI_QTD_PID_SETUP 0x2 +#define EHCI_QTD_GET_CERR(x) (((x) >> 10) & 0x3) +#define EHCI_QTD_SET_CERR(x) ((x) << 10) +#define EHCI_QTD_GET_C_PAGE(x) (((x) >> 12) & 0x7) +#define EHCI_QTD_SET_C_PAGE(x) ((x) << 12) +#define EHCI_QTD_GET_IOC(x) (((x) >> 15) & 0x1) +#define EHCI_QTD_IOC 0x00008000 +#define EHCI_QTD_GET_BYTES(x) (((x) >> 16) & 0x7fff) +#define EHCI_QTD_SET_BYTES(x) ((x) << 16) +#define EHCI_QTD_GET_TOGGLE(x) (((x) >> 31) & 0x1) +#define EHCI_QTD_SET_TOGGLE(x) ((x) << 31) +#define EHCI_QTD_TOGGLE_MASK 0x80000000 + ehci_physaddr_t qtd_buffer[EHCI_QTD_NBUFFERS]; + ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]; +} ehci_qtd_t; + +#define EHCI_QTD_ALIGN 32 + +/* Queue Head */ +typedef struct { + ehci_link_t qh_link; + u_int32_t qh_endp; +#define EHCI_QH_GET_ADDR(x) (((x) >> 0) & 0x7f) /* endpoint addr */ +#define EHCI_QH_SET_ADDR(x) (x) +#define EHCI_QH_ADDRMASK 0x0000007f +#define EHCI_QH_GET_INACT(x) (((x) >> 7) & 0x01) /* inactivate on next */ +#define EHCI_QH_INACT 0x00000080 +#define EHCI_QH_GET_ENDPT(x) (((x) >> 8) & 0x0f) /* endpoint no */ +#define EHCI_QH_SET_ENDPT(x) ((x) << 8) +#define EHCI_QH_GET_EPS(x) (((x) >> 12) & 0x03) /* endpoint speed */ +#define EHCI_QH_SET_EPS(x) ((x) << 12) +#define EHCI_QH_SPEED_FULL 0x0 +#define EHCI_QH_SPEED_LOW 0x1 +#define EHCI_QH_SPEED_HIGH 0x2 +#define EHCI_QH_GET_DTC(x) (((x) >> 14) & 0x01) /* data toggle control */ +#define EHCI_QH_DTC 0x00004000 +#define EHCI_QH_GET_HRECL(x) (((x) >> 15) & 0x01) /* head of reclamation */ +#define EHCI_QH_HRECL 0x00008000 +#define EHCI_QH_GET_MPL(x) (((x) >> 16) & 0x7ff) /* max packet len */ +#define EHCI_QH_SET_MPL(x) ((x) << 16) +#define EHCI_QH_MPLMASK 0x07ff0000 +#define EHCI_QH_GET_CTL(x) (((x) >> 27) & 0x01) /* control endpoint */ +#define EHCI_QH_CTL 0x08000000 +#define EHCI_QH_GET_NRL(x) (((x) >> 28) & 0x0f) /* NAK reload */ +#define EHCI_QH_SET_NRL(x) ((x) << 28) + u_int32_t qh_endphub; +#define EHCI_QH_GET_SMASK(x) (((x) >> 0) & 0xff) /* intr sched mask */ +#define EHCI_QH_SET_SMASK(x) ((x) << 0) +#define EHCI_QH_GET_CMASK(x) (((x) >> 8) & 0xff) /* split completion mask */ +#define EHCI_QH_SET_CMASK(x) ((x) << 8) +#define EHCI_QH_GET_HUBA(x) (((x) >> 16) & 0x7f) /* hub address */ +#define EHCI_QH_SET_HUBA(x) ((x) << 16) +#define EHCI_QH_GET_PORT(x) (((x) >> 23) & 0x7f) /* hub port */ +#define EHCI_QH_SET_PORT(x) ((x) << 23) +#define EHCI_QH_GET_MULT(x) (((x) >> 30) & 0x03) /* pipe multiplier */ +#define EHCI_QH_SET_MULT(x) ((x) << 30) + ehci_link_t qh_curqtd; + ehci_qtd_t qh_qtd; +} ehci_qh_t; + +#define EHCI_QH_ALIGN 32 + +/* Periodic Frame Span Traversal Node */ +typedef struct { + ehci_link_t fstn_link; + ehci_link_t fstn_back; +} ehci_fstn_t; + +#define EHCI_FSTN_ALIGN 32 + +#endif /* _DEV_PCI_EHCIREG_H_ */ diff --git a/sys/mips/rmi/ehcivar.h b/sys/mips/rmi/ehcivar.h new file mode 100644 index 000000000000..09829d9b0110 --- /dev/null +++ b/sys/mips/rmi/ehcivar.h @@ -0,0 +1,195 @@ +/* $NetBSD: ehcivar.h,v 1.19 2005/04/29 15:04:29 augustss Exp $ */ +/* $FreeBSD$ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson (lennart@augustsson.net). + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +typedef struct ehci_soft_qtd { + ehci_qtd_t qtd; + struct ehci_soft_qtd *nextqtd; /* mirrors nextqtd in TD */ + ehci_physaddr_t physaddr; + usbd_xfer_handle xfer; + LIST_ENTRY(ehci_soft_qtd) hnext; + u_int16_t len; +} ehci_soft_qtd_t; + +#define EHCI_SQTD_SIZE ((sizeof (struct ehci_soft_qtd) + EHCI_QTD_ALIGN - 1) / EHCI_QTD_ALIGN * EHCI_QTD_ALIGN) +#define EHCI_SQTD_CHUNK (EHCI_PAGE_SIZE / EHCI_SQTD_SIZE) + +typedef struct ehci_soft_qh { + ehci_qh_t qh; + struct ehci_soft_qh *next; + struct ehci_soft_qh *prev; + struct ehci_soft_qtd *sqtd; + ehci_physaddr_t physaddr; + int islot; /* Interrupt list slot. */ +} ehci_soft_qh_t; + +#define EHCI_SQH_SIZE ((sizeof (struct ehci_soft_qh) + EHCI_QH_ALIGN - 1) / EHCI_QH_ALIGN * EHCI_QH_ALIGN) +#define EHCI_SQH_CHUNK (EHCI_PAGE_SIZE / EHCI_SQH_SIZE) + +struct ehci_xfer { + struct usbd_xfer xfer; + struct usb_task abort_task; + LIST_ENTRY(ehci_xfer) inext; /* list of active xfers */ + ehci_soft_qtd_t *sqtdstart; + ehci_soft_qtd_t *sqtdend; + u_int32_t ehci_xfer_flags; +#ifdef DIAGNOSTIC + int isdone; +#endif +}; + +#define EHCI_XFER_ABORTING 0x0001 /* xfer is aborting. */ +#define EHCI_XFER_ABORTWAIT 0x0002 /* abort completion is being awaited. */ + +#define EXFER(xfer) ((struct ehci_xfer *)(xfer)) + +/* + * Information about an entry in the interrupt list. + */ +struct ehci_soft_islot { + ehci_soft_qh_t *sqh; /* Queue Head. */ +}; + +#define EHCI_FRAMELIST_MAXCOUNT 1024 +#define EHCI_IPOLLRATES 8 /* Poll rates (1ms, 2, 4, 8 ... 128) */ +#define EHCI_INTRQHS ((1 << EHCI_IPOLLRATES) - 1) +#define EHCI_MAX_POLLRATE (1 << (EHCI_IPOLLRATES - 1)) +#define EHCI_IQHIDX(lev, pos) \ + ((((pos) & ((1 << (lev)) - 1)) | (1 << (lev))) - 1) +#define EHCI_ILEV_IVAL(lev) (1 << (lev)) + +#define EHCI_HASH_SIZE 128 +#define EHCI_COMPANION_MAX 8 + +#define EHCI_SCFLG_DONEINIT 0x0001 /* ehci_init() has been called. */ +#define EHCI_SCFLG_LOSTINTRBUG 0x0002 /* workaround for VIA / ATI chipsets */ + +typedef struct ehci_softc { + struct usbd_bus sc_bus; /* base device */ + int sc_flags; + bus_space_tag_t iot; + bus_space_handle_t ioh; + bus_size_t sc_size; +#if defined(__FreeBSD__) + void *ih; + + struct resource *io_res; + struct resource *irq_res; +#endif + u_int sc_offs; /* offset to operational regs */ + + char sc_vendor[32]; /* vendor string for root hub */ + int sc_id_vendor; /* vendor ID for root hub */ + + u_int32_t sc_cmd; /* shadow of cmd reg during suspend */ +#if defined(__NetBSD__) || defined(__OpenBSD__) + void *sc_powerhook; /* cookie from power hook */ + void *sc_shutdownhook; /* cookie from shutdown hook */ +#endif + + u_int sc_ncomp; + u_int sc_npcomp; + struct usbd_bus *sc_comps[EHCI_COMPANION_MAX]; + + usb_dma_t sc_fldma; + ehci_link_t *sc_flist; + u_int sc_flsize; +#ifndef __FreeBSD__ + u_int sc_rand; /* XXX need proper intr scheduling */ +#endif + + struct ehci_soft_islot sc_islots[EHCI_INTRQHS]; + + LIST_HEAD(, ehci_xfer) sc_intrhead; + + ehci_soft_qh_t *sc_freeqhs; + ehci_soft_qtd_t *sc_freeqtds; + + int sc_noport; + u_int8_t sc_addr; /* device address */ + u_int8_t sc_conf; /* device configuration */ + usbd_xfer_handle sc_intrxfer; + char sc_isreset; +#ifdef USB_USE_SOFTINTR + char sc_softwake; +#endif /* USB_USE_SOFTINTR */ + + u_int32_t sc_eintrs; + ehci_soft_qh_t *sc_async_head; + + SIMPLEQ_HEAD(, usbd_xfer) sc_free_xfers; /* free xfers */ + + struct lock sc_doorbell_lock; + + usb_callout_t sc_tmo_pcd; + usb_callout_t sc_tmo_intrlist; + +#if defined(__NetBSD__) || defined(__OpenBSD__) + device_ptr_t sc_child; /* /dev/usb# device */ +#endif + char sc_dying; +#if defined(__NetBSD__) + struct usb_dma_reserve sc_dma_reserve; +#endif +} ehci_softc_t; + +#define EREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (a)) +#define EREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (a)) +#define EREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (a)) +#define EWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (a), (x)) +#define EWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (a), (x)) +#define EWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (a), (x)) +#define EOREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a)) +#define EOREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a)) +#define EOREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a)) +#define EOWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x)) +#define EOWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x)) +#define EOWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x)) + +usbd_status ehci_init(ehci_softc_t *); +int ehci_intr(void *); +int ehci_detach(ehci_softc_t *, int); + +#if defined(__NetBSD__) || defined(__OpenBSD__) +int ehci_activate(device_ptr_t, enum devact); + +#endif +void ehci_power(int state, void *priv); +void ehci_shutdown(void *v); + +#define MS_TO_TICKS(ms) ((ms) * hz / 1000) diff --git a/sys/mips/rmi/files.xlr b/sys/mips/rmi/files.xlr new file mode 100644 index 000000000000..fdf5b2764763 --- /dev/null +++ b/sys/mips/rmi/files.xlr @@ -0,0 +1,26 @@ +# $FreeBSD$ +#mips/rmi/xlr_boot1_console.c standard +mips/rmi/xlr_machdep.c standard +mips/rmi/clock.c standard +mips/rmi/tick.c standard +mips/rmi/iodi.c standard +mips/rmi/msgring.c standard +mips/rmi/msgring_xls.c standard +mips/rmi/board.c standard +mips/rmi/on_chip.c standard +mips/rmi/intr_machdep.c standard +mips/rmi/xlr_i2c.c optional iic +mips/rmi/uart_bus_xlr_iodi.c optional uart +mips/rmi/uart_cpu_mips_xlr.c optional uart +mips/rmi/perfmon_kern.c optional xlr_perfmon +mips/rmi/perfmon_percpu.c optional xlr_perfmon +mips/rmi/xlr_pci.c optional pci +mips/rmi/xls_ehci.c optional usb ehci +mips/rmi/bus_space_rmi.c standard +mips/rmi/bus_space_rmi_pci.c optional pci +mips/rmi/dev/sec/rmisec.c optional rmisec +mips/rmi/dev/sec/rmilib.c optional rmisec +mips/rmi/dev/xlr/rge.c optional rge +dev/iicbus/xlr_rtc.c optional xlr_rtc +dev/iicbus/xlr_temperature.c optional xlr_temperature +dev/iicbus/xlr_eeprom.c optional xlr_eeprom diff --git a/sys/mips/rmi/interrupt.h b/sys/mips/rmi/interrupt.h new file mode 100644 index 000000000000..247dc9f22178 --- /dev/null +++ b/sys/mips/rmi/interrupt.h @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + *__FBSDID("$FreeBSD$") + * RMI_BSD */ +#ifndef _RMI_INTERRUPT_H_ +#define _RMI_INTERRUPT_H_ + +/* Defines for the IRQ numbers */ + +#define IRQ_DUMMY_UART 2 +#define IRQ_IPI_SMP_FUNCTION 3 +#define IRQ_IPI_SMP_RESCHEDULE 4 +#define IRQ_REMOTE_DEBUG 5 +#define IRQ_MSGRING 6 +#define IRQ_TIMER 7 + +/* + * XLR needs custom pre and post handlers for PCI/PCI-e interrupts + * XXX: maybe follow i386 intsrc model + */ +void xlr_cpu_establish_hardintr(const char *, driver_filter_t *, + driver_intr_t *, void *, int, int, void **, void (*)(void *), + void (*)(void *), void (*)(void *), int (*)(void *, u_char)); +void xlr_mask_hard_irq(void *); +void xlr_unmask_hard_irq(void *); + +#endif /* _RMI_INTERRUPT_H_ */ diff --git a/sys/mips/rmi/intr_machdep.c b/sys/mips/rmi/intr_machdep.c new file mode 100644 index 000000000000..8785ac7b2960 --- /dev/null +++ b/sys/mips/rmi/intr_machdep.c @@ -0,0 +1,231 @@ +/*- + * Copyright (c) 2006-2009 RMI Corporation + * Copyright (c) 2002-2004 Juli Mallett + * 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, + * without modification, immediately at the beginning of the file. + * 2. 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*#include */ +static mips_intrcnt_t mips_intr_counters[XLR_MAX_INTR]; +static struct intr_event *mips_intr_events[XLR_MAX_INTR]; +static int intrcnt_index; + +void +xlr_mask_hard_irq(void *source) +{ + uintptr_t irq = (uintptr_t) source; + + write_c0_eimr64(read_c0_eimr64() & ~(1ULL << irq)); +} + +void +xlr_unmask_hard_irq(void *source) +{ + uintptr_t irq = (uintptr_t) source; + + write_c0_eimr64(read_c0_eimr64() | (1ULL << irq)); +} + +void +xlr_cpu_establish_hardintr(const char *name, driver_filter_t * filt, + void (*handler) (void *), void *arg, int irq, int flags, void **cookiep, + void (*pre_ithread)(void *), void (*post_ithread)(void *), + void (*post_filter)(void *), int (*assign_cpu)(void *, u_char)) +{ + struct intr_event *ie; /* descriptor for the IRQ */ + int errcode; + + if (irq < 0 || irq > XLR_MAX_INTR) + panic("%s called for unknown hard intr %d", __func__, irq); + + /* + * FIXME locking - not needed now, because we do this only on + * startup from CPU0 + */ + ie = mips_intr_events[irq]; + /* mih->cntp = &intrcnt[irq]; */ + if (ie == NULL) { + errcode = intr_event_create(&ie, (void *)(uintptr_t) irq, 0, + irq, pre_ithread, post_ithread, post_filter, assign_cpu, + "hard intr%d:", irq); + + if (errcode) { + printf("Could not create event for intr %d\n", irq); + return; + } + mips_intr_events[irq] = ie; + } + + intr_event_add_handler(ie, name, filt, handler, arg, + intr_priority(flags), flags, cookiep); + xlr_unmask_hard_irq((void *)(uintptr_t) irq); +} + +void +cpu_establish_hardintr(const char *name, driver_filter_t * filt, + void (*handler) (void *), void *arg, int irq, int flags, void **cookiep) +{ + xlr_cpu_establish_hardintr(name, filt, handler, arg, irq, + flags, cookiep, xlr_mask_hard_irq, xlr_unmask_hard_irq, + NULL, NULL); +} + +void +cpu_establish_softintr(const char *name, driver_filter_t * filt, + void (*handler) (void *), void *arg, int irq, int flags, + void **cookiep) +{ + /* we don't separate them into soft/hard like other mips */ + xlr_cpu_establish_hardintr(name, filt, handler, arg, irq, + flags, cookiep, xlr_mask_hard_irq, xlr_unmask_hard_irq, + NULL, NULL); +} + +void +cpu_intr(struct trapframe *tf) +{ + struct intr_event *ie; + uint64_t eirr, eimr; + int i; + + critical_enter(); + + /* find a list of enabled interrupts */ + eirr = read_c0_eirr64(); + eimr = read_c0_eimr64(); + eirr &= eimr; + + if (eirr == 0) { + critical_exit(); + return; + } + /* + * No need to clear the EIRR here. the handler is gonna write to + * compare which clears eirr also + */ + if (eirr & (1 << IRQ_TIMER)) { + count_compare_clockhandler(tf); + critical_exit(); + return; + } + + /* FIXME sched pin >? LOCK>? */ + for (i = sizeof(eirr) * 8 - 1; i >= 0; i--) { + if ((eirr & (1ULL << i)) == 0) + continue; +#ifdef SMP + /* These are reserved interrupts */ + if ((i == IPI_AST) || (i == IPI_RENDEZVOUS) || (i == IPI_STOP) + || (i == IPI_SMP_CALL_FUNCTION)) { + write_c0_eirr64(1ULL << i); + pic_ack(i, 0); + smp_handle_ipi(tf, i); + pic_delayed_ack(i, 0); + continue; + } +#ifdef XLR_PERFMON + if (i == IPI_PERFMON) { + write_c0_eirr64(1ULL << i); + pic_ack(i, 0); + xlr_perfmon_sampler(NULL); + pic_delayed_ack(i, 0); + continue; + } +#endif +#endif + ie = mips_intr_events[i]; + /* atomic_add_long(mih->cntp, 1); */ + + write_c0_eirr64(1ULL << i); + pic_ack(i, 0); + if (!ie || TAILQ_EMPTY(&ie->ie_handlers)) { + printf("stray interrupt %d\n", i); + continue; + } + if (intr_event_handle(ie, tf) != 0) { + printf("stray interrupt %d\n", i); + } + pic_delayed_ack(i, 0); + } + critical_exit(); +} + +void +mips_intrcnt_setname(mips_intrcnt_t counter, const char *name) +{ + int idx = counter - intrcnt; + + KASSERT(counter != NULL, ("mips_intrcnt_setname: NULL counter")); + + snprintf(intrnames + (MAXCOMLEN + 1) * idx, + MAXCOMLEN + 1, "%-*s", MAXCOMLEN, name); +} + +mips_intrcnt_t +mips_intrcnt_create(const char* name) +{ + mips_intrcnt_t counter = &intrcnt[intrcnt_index++]; + + mips_intrcnt_setname(counter, name); + return counter; +} + +void +cpu_init_interrupts() +{ + int i; + char name[MAXCOMLEN + 1]; + + /* + * Initialize all available vectors so spare IRQ + * would show up in systat output + */ + for (i = 0; i < XLR_MAX_INTR; i++) { + snprintf(name, MAXCOMLEN + 1, "int%d:", i); + mips_intr_counters[i] = mips_intrcnt_create(name); + } +} diff --git a/sys/mips/rmi/iodi.c b/sys/mips/rmi/iodi.c new file mode 100644 index 000000000000..134de9b01ae0 --- /dev/null +++ b/sys/mips/rmi/iodi.c @@ -0,0 +1,296 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD + */ + +#include +__FBSDID("$FreeBSD$"); + +#define __RMAN_RESOURCE_VISIBLE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include /* for DELAY */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +extern bus_space_tag_t uart_bus_space_mem; + +static struct resource * +iodi_alloc_resource(device_t, device_t, int, int *, + u_long, u_long, u_long, u_int); + +static int +iodi_activate_resource(device_t, device_t, int, int, + struct resource *); +static int +iodi_setup_intr(device_t, device_t, struct resource *, int, + driver_filter_t *, driver_intr_t *, void *, void **); + +struct iodi_softc *iodi_softc; /* There can be only one. */ + +static int +iodi_setup_intr(device_t dev, device_t child, + struct resource *ires, int flags, driver_filter_t * filt, driver_intr_t * intr, void *arg, + void **cookiep) +{ + int level; + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + xlr_reg_t reg; + + /* FIXME is this the right place to fiddle with PIC? */ + if (strcmp(device_get_name(child), "uart") == 0) { + /* FIXME uart 1? */ + if (rmi_spin_mutex_safe) + mtx_lock_spin(&xlr_pic_lock); + level = PIC_IRQ_IS_EDGE_TRIGGERED(PIC_IRT_UART_0_INDEX); + xlr_write_reg(mmio, PIC_IRT_0_UART_0, 0x01); + xlr_write_reg(mmio, PIC_IRT_1_UART_0, ((1 << 31) | (level << 30) | (1 << 6) | (PIC_UART_0_IRQ))); + if (rmi_spin_mutex_safe) + mtx_unlock_spin(&xlr_pic_lock); + cpu_establish_hardintr("uart", filt, + (driver_intr_t *) intr, (void *)arg, PIC_UART_0_IRQ, flags, cookiep); + + } else if (strcmp(device_get_name(child), "rge") == 0) { + int irq; + + /* This is a hack to pass in the irq */ + irq = (int)ires->__r_i; + if (rmi_spin_mutex_safe) + mtx_lock_spin(&xlr_pic_lock); + reg = xlr_read_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE); + xlr_write_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE, reg | (1 << 6) | (1 << 30) | (1 << 31)); + if (rmi_spin_mutex_safe) + mtx_unlock_spin(&xlr_pic_lock); + cpu_establish_hardintr("rge", filt, (driver_intr_t *) intr, (void *)arg, irq, flags, cookiep); + + } else if (strcmp(device_get_name(child), "ehci") == 0) { + if (rmi_spin_mutex_safe) + mtx_lock_spin(&xlr_pic_lock); + reg = xlr_read_reg(mmio, PIC_IRT_1_BASE + PIC_USB_IRQ - PIC_IRQ_BASE); + xlr_write_reg(mmio, PIC_IRT_1_BASE + PIC_USB_IRQ - PIC_IRQ_BASE, reg | (1 << 6) | (1 << 30) | (1 << 31)); + if (rmi_spin_mutex_safe) + mtx_unlock_spin(&xlr_pic_lock); + cpu_establish_hardintr("ehci", filt, (driver_intr_t *) intr, (void *)arg, PIC_USB_IRQ, flags, cookiep); + } + /* + * This causes a panic and looks recursive to me (RRS). + * BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, filt, + * intr, arg, cookiep); + */ + + return (0); +} + +static struct resource * +iodi_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct resource *res = malloc(sizeof(*res), M_DEVBUF, M_WAITOK); + int unit; + +#ifdef DEBUG + switch (type) { + case SYS_RES_IRQ: + device_printf(bus, "IRQ resource - for %s %lx-%lx\n", + device_get_nameunit(child), start, end); + break; + + case SYS_RES_IOPORT: + device_printf(bus, "IOPORT resource - for %s %lx-%lx\n", + device_get_nameunit(child), start, end); + break; + + case SYS_RES_MEMORY: + device_printf(bus, "MEMORY resource - for %s %lx-%lx\n", + device_get_nameunit(child), start, end); + break; + } +#endif + + if (strcmp(device_get_name(child), "uart") == 0) { + if ((unit = device_get_unit(child)) == 0) { /* uart 0 */ + res->r_bushandle = (xlr_io_base + XLR_IO_UART_0_OFFSET); + } else if (unit == 1) { + res->r_bushandle = (xlr_io_base + XLR_IO_UART_1_OFFSET); + } else + printf("%s: Unknown uart unit\n", __FUNCTION__); + + res->r_bustag = uart_bus_space_mem; + } else if (strcmp(device_get_name(child), "ehci") == 0) { + res->r_bushandle = 0xbef24000; + res->r_bustag = rmi_pci_bus_space; + } else if (strcmp(device_get_name(child), "cfi") == 0) { + res->r_bushandle = 0xbc000000; + res->r_bustag = 0; + } + /* res->r_start = *rid; */ + return (res); +} + +static int +iodi_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (0); +} + +/* prototypes */ +static int iodi_probe(device_t); +static int iodi_attach(device_t); +static void iodi_identify(driver_t *, device_t); + +int +iodi_probe(device_t dev) +{ + return 0; +} + +void +iodi_identify(driver_t * driver, device_t parent) +{ + + BUS_ADD_CHILD(parent, 0, "iodi", 0); +} + +int +iodi_attach(device_t dev) +{ + device_t tmpd; + + /* + * Attach each devices + */ + device_add_child(dev, "uart", 0); + device_add_child(dev, "xlr_i2c", 0); + + if (xlr_board_info.usb) + device_add_child(dev, "ehci", 0); + + if (xlr_board_info.cfi) + device_add_child(dev, "cfi", 0); + + if (xlr_board_info.gmac_block[0].enabled) { + tmpd = device_add_child(dev, "rge", 0); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[0]); + + tmpd = device_add_child(dev, "rge", 1); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[0]); + + tmpd = device_add_child(dev, "rge", 2); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[0]); + + tmpd = device_add_child(dev, "rge", 3); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[0]); + } + if (xlr_board_info.gmac_block[1].enabled) { + if (xlr_board_info.gmac_block[1].type == XLR_GMAC) { + tmpd = device_add_child(dev, "rge", 4); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[1]); + + tmpd = device_add_child(dev, "rge", 5); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[1]); + + if (xlr_board_info.gmac_block[1].enabled & 0x4) { + tmpd = device_add_child(dev, "rge", 6); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[1]); + } + + if (xlr_board_info.gmac_block[1].enabled & 0x8) { + tmpd = device_add_child(dev, "rge", 7); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[1]); + } + } else if (xlr_board_info.gmac_block[1].type == XLR_XGMAC) { +#if 0 /* XGMAC not yet */ + tmpd = device_add_child(dev, "rge", 4); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[1]); + + tmpd = device_add_child(dev, "rge", 5); + device_set_ivars(tmpd, &xlr_board_info.gmac_block[1]); +#endif + } else + device_printf(dev, "Unknown type of gmac 1\n"); + } + bus_generic_probe(dev); + bus_generic_attach(dev); + return 0; +} + +static device_method_t iodi_methods[] = { + DEVMETHOD(device_probe, iodi_probe), + DEVMETHOD(device_attach, iodi_attach), + DEVMETHOD(device_identify, iodi_identify), + DEVMETHOD(bus_alloc_resource, iodi_alloc_resource), + DEVMETHOD(bus_activate_resource, iodi_activate_resource), + DEVMETHOD(bus_setup_intr, iodi_setup_intr), + {0, 0}, +}; + +static driver_t iodi_driver = { + "iodi", + iodi_methods, + 1 /* no softc */ +}; +static devclass_t iodi_devclass; + +DRIVER_MODULE(iodi, nexus, iodi_driver, iodi_devclass, 0, 0); diff --git a/sys/mips/rmi/iomap.h b/sys/mips/rmi/iomap.h new file mode 100644 index 000000000000..afc52bf712fa --- /dev/null +++ b/sys/mips/rmi/iomap.h @@ -0,0 +1,113 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _RMI_IOMAP_H_ +#define _RMI_IOMAP_H_ + +#include +#define XLR_DEVICE_REGISTER_BASE 0x1EF00000 +#define DEFAULT_XLR_IO_BASE 0xffffffffbef00000ULL +#define XLR_IO_SIZE 0x1000 + +#define XLR_IO_BRIDGE_OFFSET 0x00000 + +#define XLR_IO_DDR2_CHN0_OFFSET 0x01000 +#define XLR_IO_DDR2_CHN1_OFFSET 0x02000 +#define XLR_IO_DDR2_CHN2_OFFSET 0x03000 +#define XLR_IO_DDR2_CHN3_OFFSET 0x04000 + +#define XLR_IO_RLD2_CHN0_OFFSET 0x05000 +#define XLR_IO_RLD2_CHN1_OFFSET 0x06000 + +#define XLR_IO_SRAM_OFFSET 0x07000 + +#define XLR_IO_PIC_OFFSET 0x08000 +#define XLR_IO_PCIX_OFFSET 0x09000 +#define XLR_IO_HT_OFFSET 0x0A000 + +#define XLR_IO_SECURITY_OFFSET 0x0B000 + +#define XLR_IO_GMAC_0_OFFSET 0x0C000 +#define XLR_IO_GMAC_1_OFFSET 0x0D000 +#define XLR_IO_GMAC_2_OFFSET 0x0E000 +#define XLR_IO_GMAC_3_OFFSET 0x0F000 + +#define XLR_IO_SPI4_0_OFFSET 0x10000 +#define XLR_IO_XGMAC_0_OFFSET 0x11000 +#define XLR_IO_SPI4_1_OFFSET 0x12000 +#define XLR_IO_XGMAC_1_OFFSET 0x13000 + +#define XLR_IO_UART_0_OFFSET 0x14000 +#define XLR_IO_UART_1_OFFSET 0x15000 +#define XLR_UART0ADDR (XLR_IO_UART_0_OFFSET+XLR_DEVICE_REGISTER_BASE) + + + +#define XLR_IO_I2C_0_OFFSET 0x16000 +#define XLR_IO_I2C_1_OFFSET 0x17000 + +#define XLR_IO_GPIO_OFFSET 0x18000 + +#define XLR_IO_FLASH_OFFSET 0x19000 + +#define XLR_IO_TB_OFFSET 0x1C000 + +#define XLR_IO_GMAC_4_OFFSET 0x20000 +#define XLR_IO_GMAC_5_OFFSET 0x21000 +#define XLR_IO_GMAC_6_OFFSET 0x22000 +#define XLR_IO_GMAC_7_OFFSET 0x23000 + +#define XLR_IO_PCIE_0_OFFSET 0x1E000 +#define XLR_IO_PCIE_1_OFFSET 0x1F000 + +#define XLR_IO_USB_0_OFFSET 0x24000 +#define XLR_IO_USB_1_OFFSET 0x25000 + +#define XLR_IO_COMP_OFFSET 0x1d000 + +/* Base Address (Virtual) of the PCI Config address space + * For now, choose 256M phys in kseg1 = 0xA0000000 + (1<<28) + * Config space spans 256 (num of buses) * 256 (num functions) * 256 bytes + * ie 1<<24 = 16M + */ +#define DEFAULT_PCI_CONFIG_BASE 0x18000000 +#define DEFAULT_HT_TYPE0_CFG_BASE 0x16000000 +#define DEFAULT_HT_TYPE1_CFG_BASE 0x17000000 + +typedef volatile __uint32_t xlr_reg_t; +extern unsigned long xlr_io_base; + +#define xlr_io_mmio(offset) ((xlr_reg_t *)(xlr_io_base+(offset))) + +#define xlr_read_reg(base, offset) (__ntohl((base)[(offset)])) +#define xlr_write_reg(base, offset, value) ((base)[(offset)] = __htonl((value))) + +extern void on_chip_init(void); + +#endif /* _RMI_IOMAP_H_ */ diff --git a/sys/mips/rmi/msgring.c b/sys/mips/rmi/msgring.c new file mode 100644 index 000000000000..77d964c71b47 --- /dev/null +++ b/sys/mips/rmi/msgring.c @@ -0,0 +1,317 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +/********************************************************** + * -----------------DO NOT EDIT THIS FILE------------------ + * This file has been autogenerated by the build process + * from "msgring.cfg" + **********************************************************/ + +#include + +struct bucket_size bucket_sizes = { + { + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, + 32, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 0, + 0, 32, 32, 32, 32, 32, 0, 32, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 32, 0, 0, 0, 0, + 128, 0, 0, 0, 128, 0, 0, 0, + } +}; + +struct stn_cc cc_table_cpu_0 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 4, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 2, 4, 4, 4, 4, 0, 2}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 2, 0, 2, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_cpu_1 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 2, 4, 4, 4, 4, 0, 2}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 2, 0, 2, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_cpu_2 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 4, 4, 4, 4, 4, 0, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 4, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_cpu_3 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 4, 4, 4, 4, 4, 0, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 4, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_cpu_4 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 4, 4, 4, 4, 4, 0, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 4, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_cpu_5 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 4, 4, 4, 4, 4, 0, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 4, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_cpu_6 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 4, 4, 4, 4, 4, 0, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 4, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_cpu_7 = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {4, 2, 2, 2, 2, 2, 2, 2}, + {2, 2, 2, 2, 2, 2, 2, 0}, + {0, 4, 4, 4, 4, 4, 0, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 4, 0, 0, 0, 0}, + {16, 0, 0, 0, 16, 0, 0, 0}, +}}; + +struct stn_cc cc_table_xgs_0 = {{ + + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc cc_table_xgs_1 = {{ + + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 4, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc cc_table_gmac = {{ + + {8, 8, 8, 8, 16, 16, 16, 16}, + {8, 8, 8, 8, 16, 16, 16, 16}, + {8, 8, 8, 8, 16, 16, 16, 16}, + {8, 8, 8, 8, 16, 16, 16, 16}, + {8, 8, 8, 8, 16, 16, 16, 16}, + {8, 8, 8, 8, 16, 16, 16, 16}, + {8, 8, 8, 8, 16, 16, 16, 16}, + {8, 8, 8, 8, 16, 16, 16, 16}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 0, 0, 0, 0, 0, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc cc_table_dma = {{ + + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc cc_table_sec = {{ + + {8, 8, 8, 8, 0, 0, 0, 0}, + {8, 8, 8, 4, 0, 0, 0, 0}, + {8, 8, 8, 8, 0, 0, 0, 0}, + {8, 8, 8, 8, 0, 0, 0, 0}, + {8, 8, 8, 8, 0, 0, 0, 0}, + {8, 8, 8, 8, 0, 0, 0, 0}, + {8, 8, 8, 8, 0, 0, 0, 0}, + {8, 8, 8, 8, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; diff --git a/sys/mips/rmi/msgring.cfg b/sys/mips/rmi/msgring.cfg new file mode 100644 index 000000000000..cf9ea54bfe30 --- /dev/null +++ b/sys/mips/rmi/msgring.cfg @@ -0,0 +1,1182 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +/* + * This file defines the message ring configuration for phoenix-8. It tries to allow + * many different point-point communications between the message stations on the message ring + * and as result is _not_ the best configuration for performance + * + * The message ring on phoenix family of processors connects the cpus, gmacs, xgmac/spi4, + * security engine and the general purpose DMA engines. It provides a high bandwidth, + * low latency communication links. On traditional processors, this communication goes through + * which inherently does not scale very well with increasing number of cpus. + * + * Message ring has an in-built flow control mechanism. Every agent/station on the ring has to + * have software configured credits to send messages to any agent. Every receiving agent on the + * ring has a 256 entry FIFO that can divided into "buckets". All addressing on the ring is + * in terms of buckets. There are a total 128 buckets on the ring. The total number of credits + * across all sending agents should not exceed the bucket size. + * + * Below are the receiving agents and the max number of buckets they can have + * CPU 0 : 8 buckets + * CPU 1 : 8 buckets + * CPU 2 : 8 buckets + * CPU 3 : 8 buckets + * CPU 4 : 8 buckets + * CPU 5 : 8 buckets + * CPU 6 : 8 buckets + * CPU 7 : 8 buckets + * + * XGMAC 0 / SPI4 0 + * TX : 16 buckets + * FREE : 2 buckets + * XGMAC 1 / SPI4 1 + * TX : 16 buckets + * FREE : 2 buckets + * + * GMAC : 8 buckets + * + * SEC : 8 buckets + * + * DMA : 8 buckets + * + * The bucket size of a bucket should be aligned to the bucket's starting index in that + * receiving station's FIFO. For example, if sizes of bucket0 and bucket1 of a station + * are 32 and 32, bucket2's size has to be 64. bucket size 0 is valid. + * + * The format of the file is pretty straight forward. Each bucket definition has the size + * and the list of sending agents to that bucket with the number of credits to send. + * + * Undefined buckets have a size of 0 and Tx stations have 0 credits to send to that bucket. + * + * Following are the currently supported bucket names + * cpu_0_0 + * cpu_0_1 + * cpu_0_2 + * cpu_0_3 + * cpu_0_4 + * cpu_0_5 + * cpu_0_6 + * cpu_0_7 + * + * cpu_1_0 + * cpu_1_1 + * cpu_1_2 + * cpu_1_3 + * cpu_1_4 + * cpu_1_5 + * cpu_1_6 + * cpu_1_7 + * + * cpu_2_0 + * cpu_2_1 + * cpu_2_2 + * cpu_2_3 + * cpu_2_4 + * cpu_2_5 + * cpu_2_6 + * cpu_2_7 + * + * cpu_3_0 + * cpu_3_1 + * cpu_3_2 + * cpu_3_3 + * cpu_3_4 + * cpu_3_5 + * cpu_3_6 + * cpu_3_7 + * + * cpu_4_0 + * cpu_4_1 + * cpu_4_2 + * cpu_4_3 + * cpu_4_4 + * cpu_4_5 + * cpu_4_6 + * cpu_4_7 + * + * cpu_5_0 + * cpu_5_1 + * cpu_5_2 + * cpu_5_3 + * cpu_5_4 + * cpu_5_5 + * cpu_5_6 + * cpu_5_7 + * + * cpu_6_0 + * cpu_6_1 + * cpu_6_2 + * cpu_6_3 + * cpu_6_4 + * cpu_6_5 + * cpu_6_6 + * cpu_6_7 + * + * cpu_7_0 + * cpu_7_1 + * cpu_7_2 + * cpu_7_3 + * cpu_7_4 + * cpu_7_5 + * cpu_7_6 + * cpu_7_7 + * + * xgs_0_tx_0 + * xgs_0_tx_1 + * xgs_0_tx_2 + * xgs_0_tx_3 + * xgs_0_tx_4 + * xgs_0_tx_5 + * xgs_0_tx_6 + * xgs_0_tx_7 + * xgs_0_tx_8 + * xgs_0_tx_9 + * xgs_0_tx_10 + * xgs_0_tx_11 + * xgs_0_tx_12 + * xgs_0_tx_13 + * xgs_0_tx_14 + * xgs_0_tx_15 + * + * xgs_1_tx_0 + * xgs_1_tx_1 + * xgs_1_tx_2 + * xgs_1_tx_3 + * xgs_1_tx_4 + * xgs_1_tx_5 + * xgs_1_tx_6 + * xgs_1_tx_7 + * xgs_1_tx_8 + * xgs_1_tx_9 + * xgs_1_tx_10 + * xgs_1_tx_11 + * xgs_1_tx_12 + * xgs_1_tx_13 + * xgs_1_tx_14 + * xgs_1_tx_15 + * + * gmac_rsvd_0 + * gmac_rfr_0 + * gmac_tx_0 + * gmac_tx_1 + * gmac_tx_2 + * gmac_tx_3 + * gmac_rsvd_1 + * gmac_rfr_1 + * + * xgs_0_rsvd + * xgs_0_rfr + * + * xgs_1_rsvd + * xgs_1_rfr + * + * sec_pipe_0 + * sec_pipe_1 + * sec_pipe_2 + * sec_pipe_3 + * sec_rsa + * + * Following are the currently supported Tx Agent/Station names + * + * tx_stn_cpu_0 + * tx_stn_cpu_1 + * tx_stn_cpu_2 + * tx_stn_cpu_3 + * tx_stn_cpu_4 + * tx_stn_cpu_5 + * tx_stn_cpu_6 + * tx_stn_cpu_7 + * + * tx_stn_xgs_0 + * tx_stn_xgs_1 + * + * tx_stn_gmac + * + * tx_stn_dma + * + * tx_stn_sec + * + * + * + */ + +/*************************************************************/ +// CPU_0 Message Station + +bucket "cpu_0_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_0_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_0_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_0_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_0_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_0_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_0_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_0_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + +/*************************************************************/ +// CPU_1 Message Station + +bucket "cpu_1_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_1_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_1_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_1_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 4; + "tx_stn_cpu_0" 4; /* NEEDED BY RMIOS IPSEC */ +} +bucket "cpu_1_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_1_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_1_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_1_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + +/*************************************************************/ +// CPU_2 Message Station + +bucket "cpu_2_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_2_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_2_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_2_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_2_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_2_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_2_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_2_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + +/*************************************************************/ +// CPU_3 Message Station + +bucket "cpu_3_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_3_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_3_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_3_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_3_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_3_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_3_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_3_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + +/*************************************************************/ +// CPU_4 Message Station + +bucket "cpu_4_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_4_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_4_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_4_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_4_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_4_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_4_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_4_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + +/*************************************************************/ +// CPU_5 Message Station + +bucket "cpu_5_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_5_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_5_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_5_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_5_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_5_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_5_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_5_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + + +/*************************************************************/ +// CPU_6 Message Station + +bucket "cpu_6_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_6_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_6_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_6_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_6_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_6_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_6_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_6_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + + +/*************************************************************/ +// CPU_7 Message Station + +bucket "cpu_7_0" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_7_1" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_7_2" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_7_3" { + size 32; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; + "tx_stn_gmac" 8; + "tx_stn_sec" 8; +} +bucket "cpu_7_4" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_7_5" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_7_6" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} +bucket "cpu_7_7" { + size 32; + "tx_stn_gmac" 16; + "tx_stn_xgs_0" 8; + "tx_stn_xgs_1" 8; +} + + +/*************************************************************/ +// GMAC Message Station + +bucket "gmac_rfr_0" { + size 32; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; + "tx_stn_gmac" 4; +} + +bucket "gmac_tx_0" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; +} + +bucket "gmac_tx_1" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; +} + +bucket "gmac_tx_2" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; +} + +bucket "gmac_tx_3" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; +} + +bucket "gmac_rfr_1" { + size 32; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; + "tx_stn_gmac" 4; +} +/*********************************************/ +// xgmac +bucket "xgs_0_rfr" { + size 32; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; + "tx_stn_xgs_0" 4; +} + +bucket "xgs_0_tx_0" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; +} + +bucket "xgs_0_tx_1" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_2" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_3" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_4" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} +bucket "xgs_0_tx_5" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_6" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_7" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_8" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_9" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_10" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + + +bucket "xgs_0_tx_11" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_12" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_13" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_0_tx_14" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + + +bucket "xgs_1_rfr" { + size 32; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; + "tx_stn_xgs_1" 4; +} + +bucket "xgs_1_tx_0" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_cpu_4" 4; + "tx_stn_cpu_5" 4; + "tx_stn_cpu_6" 4; + "tx_stn_cpu_7" 4; +} + + +bucket "xgs_1_tx_1" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_2" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_3" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_4" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_5" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_6" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_7" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + + +bucket "xgs_1_tx_8" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + + +bucket "xgs_1_tx_9" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + + +bucket "xgs_1_tx_10" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_11" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_12" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_13" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + +bucket "xgs_1_tx_14" { + size 16; + "tx_stn_cpu_0" 2; + "tx_stn_cpu_1" 2; + "tx_stn_cpu_2" 2; + "tx_stn_cpu_3" 2; + "tx_stn_cpu_4" 2; + "tx_stn_cpu_5" 2; + "tx_stn_cpu_6" 2; + "tx_stn_cpu_7" 2; +} + + + + + + +/*************************************************************/ +// Security Message Station + +bucket "sec_pipe_0" { + size 128; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; + "tx_stn_cpu_2" 16; + "tx_stn_cpu_3" 16; + "tx_stn_cpu_4" 16; + "tx_stn_cpu_5" 16; + "tx_stn_cpu_6" 16; + "tx_stn_cpu_7" 16; +} + +bucket "sec_rsa" { + size 128; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; + "tx_stn_cpu_2" 16; + "tx_stn_cpu_3" 16; + "tx_stn_cpu_4" 16; + "tx_stn_cpu_5" 16; + "tx_stn_cpu_6" 16; + "tx_stn_cpu_7" 16; +} + diff --git a/sys/mips/rmi/msgring.h b/sys/mips/rmi/msgring.h new file mode 100755 index 000000000000..43be63899f84 --- /dev/null +++ b/sys/mips/rmi/msgring.h @@ -0,0 +1,529 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _RMI_MSGRING_H_ +#define _RMI_MSGRING_H_ + +#include + +#define MSGRNG_TX_BUF_REG 0 +#define MSGRNG_RX_BUF_REG 1 + +#define MSGRNG_MSG_STATUS_REG 2 +#define MSGRNG_MSG_CONFIG_REG 3 + +#define MSGRNG_MSG_BUCKSIZE_REG 4 + +#define MSGRNG_CC_0_REG 16 +#define MSGRNG_CC_1_REG 17 +#define MSGRNG_CC_2_REG 18 +#define MSGRNG_CC_3_REG 19 +#define MSGRNG_CC_4_REG 20 +#define MSGRNG_CC_5_REG 21 +#define MSGRNG_CC_6_REG 22 +#define MSGRNG_CC_7_REG 23 +#define MSGRNG_CC_8_REG 24 +#define MSGRNG_CC_9_REG 25 +#define MSGRNG_CC_10_REG 26 +#define MSGRNG_CC_11_REG 27 +#define MSGRNG_CC_12_REG 28 +#define MSGRNG_CC_13_REG 29 +#define MSGRNG_CC_14_REG 30 +#define MSGRNG_CC_15_REG 31 + +#define msgrng_read_status() read_c2_register32(MSGRNG_MSG_STATUS_REG, 0) + +#define msgrng_read_config() read_c2_register32(MSGRNG_MSG_CONFIG_REG, 0) +#define msgrng_write_config(value) write_c2_register32(MSGRNG_MSG_CONFIG_REG, 0, value) + +#define msgrng_read_bucksize(bucket) read_c2_register32(MSGRNG_MSG_BUCKSIZE_REG, bucket) +#define msgrng_write_bucksize(bucket, value) write_c2_register32(MSGRNG_MSG_BUCKSIZE_REG, bucket, value) + +#define msgrng_read_cc(reg, pri) read_c2_register32(reg, pri) +#define msgrng_write_cc(reg, value, pri) write_c2_register32(reg, pri, value) + +#define msgrng_load_rx_msg0() read_c2_register64(MSGRNG_RX_BUF_REG, 0) +#define msgrng_load_rx_msg1() read_c2_register64(MSGRNG_RX_BUF_REG, 1) +#define msgrng_load_rx_msg2() read_c2_register64(MSGRNG_RX_BUF_REG, 2) +#define msgrng_load_rx_msg3() read_c2_register64(MSGRNG_RX_BUF_REG, 3) + +#define msgrng_load_tx_msg0(value) write_c2_register64(MSGRNG_TX_BUF_REG, 0, value) +#define msgrng_load_tx_msg1(value) write_c2_register64(MSGRNG_TX_BUF_REG, 1, value) +#define msgrng_load_tx_msg2(value) write_c2_register64(MSGRNG_TX_BUF_REG, 2, value) +#define msgrng_load_tx_msg3(value) write_c2_register64(MSGRNG_TX_BUF_REG, 3, value) + +/* Station IDs */ +#define MSGRNG_STNID_CPU0 0x00 +#define MSGRNG_STNID_CPU1 0x08 +#define MSGRNG_STNID_CPU2 0x10 +#define MSGRNG_STNID_CPU3 0x18 +#define MSGRNG_STNID_CPU4 0x20 +#define MSGRNG_STNID_CPU5 0x28 +#define MSGRNG_STNID_CPU6 0x30 +#define MSGRNG_STNID_CPU7 0x38 +#define MSGRNG_STNID_XGS0_TX 64 +#define MSGRNG_STNID_XMAC0_00_TX 64 +#define MSGRNG_STNID_XMAC0_01_TX 65 +#define MSGRNG_STNID_XMAC0_02_TX 66 +#define MSGRNG_STNID_XMAC0_03_TX 67 +#define MSGRNG_STNID_XMAC0_04_TX 68 +#define MSGRNG_STNID_XMAC0_05_TX 69 +#define MSGRNG_STNID_XMAC0_06_TX 70 +#define MSGRNG_STNID_XMAC0_07_TX 71 +#define MSGRNG_STNID_XMAC0_08_TX 72 +#define MSGRNG_STNID_XMAC0_09_TX 73 +#define MSGRNG_STNID_XMAC0_10_TX 74 +#define MSGRNG_STNID_XMAC0_11_TX 75 +#define MSGRNG_STNID_XMAC0_12_TX 76 +#define MSGRNG_STNID_XMAC0_13_TX 77 +#define MSGRNG_STNID_XMAC0_14_TX 78 +#define MSGRNG_STNID_XMAC0_15_TX 79 + +#define MSGRNG_STNID_XGS1_TX 80 +#define MSGRNG_STNID_XMAC1_00_TX 80 +#define MSGRNG_STNID_XMAC1_01_TX 81 +#define MSGRNG_STNID_XMAC1_02_TX 82 +#define MSGRNG_STNID_XMAC1_03_TX 83 +#define MSGRNG_STNID_XMAC1_04_TX 84 +#define MSGRNG_STNID_XMAC1_05_TX 85 +#define MSGRNG_STNID_XMAC1_06_TX 86 +#define MSGRNG_STNID_XMAC1_07_TX 87 +#define MSGRNG_STNID_XMAC1_08_TX 88 +#define MSGRNG_STNID_XMAC1_09_TX 89 +#define MSGRNG_STNID_XMAC1_10_TX 90 +#define MSGRNG_STNID_XMAC1_11_TX 91 +#define MSGRNG_STNID_XMAC1_12_TX 92 +#define MSGRNG_STNID_XMAC1_13_TX 93 +#define MSGRNG_STNID_XMAC1_14_TX 94 +#define MSGRNG_STNID_XMAC1_15_TX 95 + +#define MSGRNG_STNID_GMAC 96 +#define MSGRNG_STNID_GMACJFR_0 96 +#define MSGRNG_STNID_GMACRFR_0 97 +#define MSGRNG_STNID_GMACTX0 98 +#define MSGRNG_STNID_GMACTX1 99 +#define MSGRNG_STNID_GMACTX2 100 +#define MSGRNG_STNID_GMACTX3 101 +#define MSGRNG_STNID_GMACJFR_1 102 +#define MSGRNG_STNID_GMACRFR_1 103 + +#define MSGRNG_STNID_DMA 104 +#define MSGRNG_STNID_DMA_0 104 +#define MSGRNG_STNID_DMA_1 105 +#define MSGRNG_STNID_DMA_2 106 +#define MSGRNG_STNID_DMA_3 107 + +#define MSGRNG_STNID_XGS0FR 112 +#define MSGRNG_STNID_XMAC0JFR 112 +#define MSGRNG_STNID_XMAC0RFR 113 + +#define MSGRNG_STNID_XGS1FR 114 +#define MSGRNG_STNID_XMAC1JFR 114 +#define MSGRNG_STNID_XMAC1RFR 115 +#define MSGRNG_STNID_SEC 120 +#define MSGRNG_STNID_SEC0 120 +#define MSGRNG_STNID_SEC1 121 +#define MSGRNG_STNID_SEC2 122 +#define MSGRNG_STNID_SEC3 123 +#define MSGRNG_STNID_PK0 124 +#define MSGRNG_STNID_SEC_RSA 124 +#define MSGRNG_STNID_SEC_RSVD0 125 +#define MSGRNG_STNID_SEC_RSVD1 126 +#define MSGRNG_STNID_SEC_RSVD2 127 + +#define MSGRNG_STNID_GMAC1 80 +#define MSGRNG_STNID_GMAC1_FR_0 81 +#define MSGRNG_STNID_GMAC1_TX0 82 +#define MSGRNG_STNID_GMAC1_TX1 83 +#define MSGRNG_STNID_GMAC1_TX2 84 +#define MSGRNG_STNID_GMAC1_TX3 85 +#define MSGRNG_STNID_GMAC1_FR_1 87 +#define MSGRNG_STNID_GMAC0 96 +#define MSGRNG_STNID_GMAC0_FR_0 97 +#define MSGRNG_STNID_GMAC0_TX0 98 +#define MSGRNG_STNID_GMAC0_TX1 99 +#define MSGRNG_STNID_GMAC0_TX2 100 +#define MSGRNG_STNID_GMAC0_TX3 101 +#define MSGRNG_STNID_GMAC0_FR_1 103 +#define MSGRNG_STNID_CMP_0 108 +#define MSGRNG_STNID_CMP_1 109 +#define MSGRNG_STNID_CMP_2 110 +#define MSGRNG_STNID_CMP_3 111 +#define MSGRNG_STNID_PCIE_0 116 +#define MSGRNG_STNID_PCIE_1 117 +#define MSGRNG_STNID_PCIE_2 118 +#define MSGRNG_STNID_PCIE_3 119 +#define MSGRNG_STNID_XLS_PK0 121 + +#define MSGRNG_CODE_MAC 0 +#define MSGRNG_CODE_XGMAC 2 +#define MSGRNG_CODE_SEC 0 +#define MSGRNG_CODE_BOOT_WAKEUP 200 +#define MSGRNG_CODE_SPI4 3 + +static inline int +msgrng_xgmac_stid_rfr(int id) +{ + return !id ? MSGRNG_STNID_XMAC0RFR : MSGRNG_STNID_XMAC1RFR; +} + +static inline int +msgrng_xgmac_stid_jfr(int id) +{ + return !id ? MSGRNG_STNID_XMAC0JFR : MSGRNG_STNID_XMAC1JFR; +} + +static inline int +msgrng_xgmac_stid_tx(int id) +{ + return !id ? MSGRNG_STNID_XMAC0_00_TX : MSGRNG_STNID_XMAC1_00_TX; +} + +static inline int +msgrng_gmac_stid_rfr(int id) +{ + return (MSGRNG_STNID_GMACRFR_0); +} + +static inline int +msgrng_gmac_stid_rfr_split_mode(int id) +{ + return ((id >> 1) ? MSGRNG_STNID_GMACRFR_1 : MSGRNG_STNID_GMACRFR_0); +} + +static inline int +msgrng_gmac_stid_jfr(int id) +{ + return MSGRNG_STNID_GMACJFR_0; +} + +static inline int +msgrng_gmac_stid_jfr_split_mode(int id) +{ + return ((id >> 1) ? MSGRNG_STNID_GMACJFR_1 : MSGRNG_STNID_GMACJFR_0); +} + +static inline int +msgrng_gmac_stid_tx(int id) +{ + return (MSGRNG_STNID_GMACTX0 + id); +} + +static inline void +msgrng_send(unsigned int stid) +{ + __asm__ volatile ( + ".set push\n" + ".set noreorder\n" + "sync\n" + // "msgsnd %0\n" + "move $8, %0\n" + "c2 0x80001\n" + ".set pop\n" + :: "r" (stid):"$8" + ); +} + +static inline void +msgrng_receive(unsigned int pri) +{ + __asm__ volatile ( + ".set push\n" + ".set noreorder\n" + // "msgld %0\n" + "move $8, %0\n" + "c2 0x80002\n" + ".set pop\n" + :: "r" (pri):"$8" + ); +} +static inline void +msgrng_wait(unsigned int mask) +{ + __asm__ volatile ( + ".set push\n" + ".set noreorder\n" + // "msgwait %0\n" + "move $8, %0\n" + "c2 0x80003\n" + ".set pop\n" + :: "r" (mask):"$8" + ); +} + +#define msgrng_enable(flags) \ +do { \ + __asm__ volatile ( \ + ".set push\n\t" \ + ".set reorder\n\t" \ + ".set noat\n\t" \ + "mfc0 %0, $12\n\t" \ + "li $8, 0x40000001\n\t" \ + "or $1, %0, $8\n\t" \ + "xori $1, 1\n\t" \ + ".set noreorder\n\t" \ + "mtc0 $1, $12\n\t" \ + ".set\tpop\n\t" \ + : "=r" (flags) \ + : \ + : "$8" \ + ); \ +} while (0) + +#define msgrng_disable(flags) __asm__ volatile ( \ + "mtc0 %0, $12" : : "r" (flags)) + +#define msgrng_flags_save(flags) msgrng_enable(flags) +#define msgrng_flags_restore(flags) msgrng_disable(flags) + +struct msgrng_msg { + __uint64_t msg0; + __uint64_t msg1; + __uint64_t msg2; + __uint64_t msg3; +}; + +static inline void +message_send_block_fast(int size, unsigned int code, unsigned int stid, + unsigned long long msg0, unsigned long long msg1, + unsigned long long msg2, unsigned long long msg3) +{ + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + ".set mips64\n" + "dmtc2 %1, $0, 0\n" + "dmtc2 %2, $0, 1\n" + "dmtc2 %3, $0, 2\n" + "dmtc2 %4, $0, 3\n" + "move $8, %0\n" + "1: c2 0x80001\n" + "mfc2 $8, $2\n" + "andi $8, $8, 0x6\n" + "bnez $8, 1b\n" + "move $8, %0\n" + ".set pop\n" + : + : "r"(((size - 1) << 16) | (code << 8) | stid), "r"(msg0), "r"(msg1), "r"(msg2), "r"(msg3) + : "$8" + ); +} + +#define message_receive_fast(bucket, size, code, stid, msg0, msg1, msg2, msg3) \ + ( { unsigned int _status=0, _tmp=0; \ + msgrng_receive(bucket); \ + while ( (_status=msgrng_read_status()) & 0x08) ; \ + _tmp = _status & 0x30; \ + if (__builtin_expect((!_tmp), 1)) { \ + (size)=((_status & 0xc0)>>6)+1; \ + (code)=(_status & 0xff00)>>8; \ + (stid)=(_status & 0x7f0000)>>16; \ + (msg0)=msgrng_load_rx_msg0(); \ + (msg1)=msgrng_load_rx_msg1(); \ + (msg2)=msgrng_load_rx_msg2(); \ + (msg3)=msgrng_load_rx_msg3(); \ + _tmp=0; \ + } \ + _tmp; \ + } ) + +static __inline__ int +message_send(unsigned int size, unsigned int code, + unsigned int stid, struct msgrng_msg *msg) +{ + unsigned int dest = 0; + unsigned long long status = 0; + int i = 0; + + msgrng_load_tx_msg0(msg->msg0); + msgrng_load_tx_msg1(msg->msg1); + msgrng_load_tx_msg2(msg->msg2); + msgrng_load_tx_msg3(msg->msg3); + + dest = ((size - 1) << 16) | (code << 8) | (stid); + + //dbg_msg("Sending msg<%Lx,%Lx,%Lx,%Lx> to dest = %x\n", + //msg->msg0, msg->msg1, msg->msg2, msg->msg3, dest); + + msgrng_send(dest); + + for (i = 0; i < 16; i++) { + status = msgrng_read_status(); + //dbg_msg("status = %Lx\n", status); + + if (status & 0x6) { + continue; + } else + break; + } + if (i == 16) { + if (dest == 0x61) + //dbg_msg("Processor %x: Unable to send msg to %llx\n", processor_id(), dest); + return status & 0x6; + } + return msgrng_read_status() & 0x06; +} + +static __inline__ int +message_send_retry(unsigned int size, unsigned int code, + unsigned int stid, struct msgrng_msg *msg) +{ + int res = 0; + int retry = 0; + + for (;;) { + res = message_send(size, code, stid, msg); + /* retry a pending fail */ + if (res & 0x02) + continue; + /* credit fail */ + if (res & 0x04) + retry++; + else + break; + if (retry == 4) + return res & 0x06; + } + + return 0; +} + +static __inline__ int +message_receive(int pri, int *size, int *code, int *src_id, + struct msgrng_msg *msg) +{ + int res = message_receive_fast(pri, *size, *code, *src_id, msg->msg0, msg->msg1, msg->msg2, msg->msg3); + +#ifdef MSGRING_DUMP_MESSAGES + if (!res) { + dbg_msg("Received msg <%llx, %llx, %llx, %llx> <%d,%d,%d>\n", + msg->msg0, msg->msg1, msg->msg2, msg->msg3, + *size, *code, *src_id); + } +#endif + + return res; +} + +#define MSGRNG_STN_RX_QSIZE 256 + +struct stn_cc { + unsigned short counters[16][8]; +}; + +struct bucket_size { + unsigned short bucket[128]; +}; + +extern struct bucket_size bucket_sizes; + +extern struct stn_cc cc_table_cpu_0; +extern struct stn_cc cc_table_cpu_1; +extern struct stn_cc cc_table_cpu_2; +extern struct stn_cc cc_table_cpu_3; +extern struct stn_cc cc_table_cpu_4; +extern struct stn_cc cc_table_cpu_5; +extern struct stn_cc cc_table_cpu_6; +extern struct stn_cc cc_table_cpu_7; +extern struct stn_cc cc_table_xgs_0; +extern struct stn_cc cc_table_xgs_1; +extern struct stn_cc cc_table_gmac; +extern struct stn_cc cc_table_dma; +extern struct stn_cc cc_table_sec; + +extern struct bucket_size xls_bucket_sizes; + +extern struct stn_cc xls_cc_table_cpu_0; +extern struct stn_cc xls_cc_table_cpu_1; +extern struct stn_cc xls_cc_table_cpu_2; +extern struct stn_cc xls_cc_table_cpu_3; +extern struct stn_cc xls_cc_table_gmac0; +extern struct stn_cc xls_cc_table_gmac1; +extern struct stn_cc xls_cc_table_cmp; +extern struct stn_cc xls_cc_table_pcie; +extern struct stn_cc xls_cc_table_dma; +extern struct stn_cc xls_cc_table_sec; + + +#define msgrng_access_save(lock, mflags) do { \ + if (rmi_spin_mutex_safe) mtx_lock_spin(lock); \ + msgrng_flags_save(mflags); \ + }while(0) + +#define msgrng_access_restore(lock, mflags) do { \ + msgrng_flags_restore(mflags); \ + if (rmi_spin_mutex_safe) mtx_unlock_spin(lock); \ + }while(0) + +#define msgrng_access_enable(mflags) do { \ + critical_enter(); \ + msgrng_flags_save(mflags); \ +} while(0) + +#define msgrng_access_disable(mflags) do { \ + msgrng_flags_restore(mflags); \ + critical_exit(); \ +} while(0) + +/* + * NOTE: this is not stationid/8, ie the station numbers below are just + * for internal use + */ +enum { + TX_STN_CPU_0, + TX_STN_CPU_1, + TX_STN_CPU_2, + TX_STN_CPU_3, + TX_STN_CPU_4, + TX_STN_CPU_5, + TX_STN_CPU_6, + TX_STN_CPU_7, + TX_STN_GMAC, + TX_STN_DMA, + TX_STN_XGS_0, + TX_STN_XGS_1, + TX_STN_SAE, + TX_STN_GMAC0, + TX_STN_GMAC1, + TX_STN_CDE, + TX_STN_PCIE, + TX_STN_INVALID, + MAX_TX_STNS +}; + +extern int +register_msgring_handler(int major, + void (*action) (int, int, int, int, struct msgrng_msg *, void *), + void *dev_id); + extern void xlr_msgring_cpu_init(void); + + extern void xlr_msgring_config(void); + +#define cpu_to_msgring_bucket(cpu) ((((cpu) >> 2)<<3)|((cpu) & 0x03)) + +#endif diff --git a/sys/mips/rmi/msgring_xls.c b/sys/mips/rmi/msgring_xls.c new file mode 100644 index 000000000000..bd86187f0c9d --- /dev/null +++ b/sys/mips/rmi/msgring_xls.c @@ -0,0 +1,217 @@ +/********************************************************** + * -----------------DO NOT EDIT THIS FILE------------------ + * This file has been autogenerated by the build process + * from "msgring_xls.cfg" + **********************************************************/ + +#include + +struct bucket_size xls_bucket_sizes = { + {32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 0, 0, + 64, 64, 64, 64, 32, 32, 32, 32, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 0, 0, 0, 0, 0, 0, + } +}; + +struct stn_cc xls_cc_table_cpu_0 = {{ + {1, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 8, 0, 0, 0, 0}, + {0, 0, 0, 8, 0, 0, 0, 0}, + {0, 0, 0, 8, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {32, 32, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_cpu_1 = {{ + {1, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {16, 16, 16, 16, 16, 16, 16, 16}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {32, 32, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_cpu_2 = {{ + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {16, 16, 16, 16, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {32, 32, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_cpu_3 = {{ + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 4, 8, 8, 8, 8, 0, 0}, + {16, 16, 16, 16, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {32, 32, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_gmac0 = {{ + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 8, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 8, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_gmac1 = {{ + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {8, 8, 8, 8, 8, 8, 8, 8}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 8, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 8, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_dma = {{ + {4, 4, 4, 4, 4, 4, 4, 4}, + {4, 4, 4, 2, 4, 4, 4, 4}, + {4, 4, 4, 2, 4, 4, 4, 4}, + {4, 4, 4, 2, 4, 4, 4, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_cmp = {{ + {4, 4, 4, 4, 4, 4, 4, 4}, + {4, 4, 4, 2, 4, 4, 4, 4}, + {4, 4, 4, 2, 4, 4, 4, 4}, + {4, 4, 4, 2, 4, 4, 4, 4}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_pcie = {{ + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; + +struct stn_cc xls_cc_table_sec = {{ + {6, 8, 8, 8, 0, 0, 0, 0}, + {8, 8, 8, 4, 0, 0, 0, 0}, + {8, 8, 8, 4, 0, 0, 0, 0}, + {8, 8, 8, 4, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0}, +}}; diff --git a/sys/mips/rmi/msgring_xls.cfg b/sys/mips/rmi/msgring_xls.cfg new file mode 100755 index 000000000000..35bfb17f4c46 --- /dev/null +++ b/sys/mips/rmi/msgring_xls.cfg @@ -0,0 +1,563 @@ +/********************************************************************* + * + * Copyright 2003-2006 Raza Microelectronics, Inc. (RMI). 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 Raza Microelectronics, Inc. ``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 RMI 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. + * + * *****************************RMI_2**********************************/ + + +/* + * This file defines the message ring configuration for XLS two core. It tries to allow + * many different point-point communications between the message stations on the message ring + * and as result is _not_ the best configuration for performance + * + * The message ring on phoenix family of processors connects the cpus, gmacs, xgmac/spi4, + * security engine and the general purpose DMA engines. It provides a high bandwidth, + * low latency communication links. On traditional processors, this communication goes through + * which inherently does not scale very well with increasing number of cpus. + * + * Message ring has an in-built flow control mechanism. Every agent/station on the ring has to + * have software configured credits to send messages to any agent. Every receiving agent on the + * ring has a 256 entry FIFO that can divided into "buckets". All addressing on the ring is + * in terms of buckets. There are a total 128 buckets on the ring. The total number of credits + * across all sending agents should not exceed the bucket size. + * + * Below are the receiving agents and the max number of buckets they can have + * CPU 0 : 8 buckets + * CPU 1 : 8 buckets + * + * GMAC : 8 buckets + * + * SEC : 8 buckets + * + * DMA : 8 buckets + * + * CMP : Currently disabled. + * + * The bucket size of a bucket should be aligned to the bucket's starting index in that + * receiving station's FIFO. For example, if sizes of bucket0 and bucket1 of a station + * are 32 and 32, bucket2's size has to be 64. bucket size 0 is valid. + * + * The format of the file is pretty straight forward. Each bucket definition has the size + * and the list of sending agents to that bucket with the number of credits to send. + * + * Undefined buckets have a size of 0 and Tx stations have 0 credits to send to that bucket. + * + * Following are the currently supported bucket names + * cpu_0_0 + * cpu_0_1 + * cpu_0_2 + * cpu_0_3 + * cpu_0_4 + * cpu_0_5 + * cpu_0_6 + * cpu_0_7 + * + * cpu_1_0 + * cpu_1_1 + * cpu_1_2 + * cpu_1_3 + * cpu_1_4 + * cpu_1_5 + * cpu_1_6 + * cpu_1_7 + * + * enabled only for xls-b0 + * cpu_2_0 + * cpu_2_1 + * cpu_2_2 + * cpu_2_3 + * cpu_2_4 + * cpu_2_5 + * cpu_2_6 + * cpu_2_7 + * + * enabled only for xls-b0 + * cpu_3_0 + * cpu_3_1 + * cpu_3_2 + * cpu_3_3 + * cpu_3_4 + * cpu_3_5 + * cpu_3_6 + * cpu_3_7 + * + * gmac0_rfr + * gmac0_tx_0 + * gmac0_tx_1 + * gmac0_tx_2 + * gmac0_tx_3 + * + * gmac1_rfr + * gmac1_tx_0 + * gmac1_tx_1 + * gmac1_tx_2 + * gmac1_tx_3 + * + * sec_pipe_0 + * sec_rsa + * + * Following are the currently supported Tx Agent/Station names + * + * tx_stn_cpu_0 + * tx_stn_cpu_1 + * + * tx_stn_gmac0 + * tx_stn_gmac1 + * + * tx_stn_dma + * + * tx_stn_sec + * + * + */ + +/*************************************************************/ +// CPU_0 Message Station + +bucket "cpu_0_0" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 6; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; + "tx_stn_cpu_0" 1; + "tx_stn_cpu_1" 1; /* NEEDED BY RMIOS IPSEC */ +} +bucket "cpu_0_1" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_0_2" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_0_3" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_0_4" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_0_5" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_0_6" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_0_7" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} + +/*************************************************************/ +// CPU_1 Message Station + +bucket "cpu_1_0" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_1_1" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_1_2" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_1_3" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 4; + "tx_stn_cpu_0" 8; /* NEEDED BY RMIOS IPSEC */ + "tx_stn_dma" 2; + "tx_stn_cmp" 2; +} +bucket "cpu_1_4" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_1_5" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_1_6" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_1_7" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} + +/*************************************************************/ +// CPU_2 Message Station + +bucket "cpu_2_0" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_2_1" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_2_2" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_2_3" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 4; + "tx_stn_cpu_0" 8; /* NEEDED BY RMIOS IPSEC */ + "tx_stn_dma" 2; + "tx_stn_cmp" 2; +} +bucket "cpu_2_4" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_2_5" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_2_6" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_2_7" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} + + +/*************************************************************/ +// CPU_3 Message Station +bucket "cpu_3_0" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_3_1" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_3_2" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_3_3" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_sec" 4; + "tx_stn_cpu_0" 8; /* NEEDED BY RMIOS IPSEC */ + "tx_stn_dma" 2; + "tx_stn_cmp" 2; +} +bucket "cpu_3_4" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_3_5" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_3_6" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} +bucket "cpu_3_7" { + size 32; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; + "tx_stn_dma" 4; + "tx_stn_cmp" 4; +} + +/*************************************************************/ + +// GMAC Message Station + +bucket "gmac0_rfr" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; +} + +bucket "gmac0_tx_0" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +bucket "gmac0_tx_1" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +bucket "gmac0_tx_2" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +bucket "gmac0_tx_3" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +bucket "gmac1_rfr" { + size 32; + "tx_stn_cpu_0" 4; + "tx_stn_cpu_1" 4; + "tx_stn_cpu_2" 4; + "tx_stn_cpu_3" 4; + "tx_stn_gmac0" 8; + "tx_stn_gmac1" 8; +} + +bucket "gmac1_tx_0" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +bucket "gmac1_tx_1" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +bucket "gmac1_tx_2" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +bucket "gmac1_tx_3" { + size 32; + "tx_stn_cpu_0" 8; + "tx_stn_cpu_1" 8; + "tx_stn_cpu_2" 8; + "tx_stn_cpu_3" 8; +} + +/*************************************************************/ +// Security Message Station + +bucket "sec_pipe_0" { + size 128; + "tx_stn_cpu_0" 32; + "tx_stn_cpu_1" 32; + "tx_stn_cpu_2" 32; + "tx_stn_cpu_3" 32; +} + +bucket "sec_rsa_ecc" { + size 128; + "tx_stn_cpu_0" 32; + "tx_stn_cpu_1" 32; + "tx_stn_cpu_2" 32; + "tx_stn_cpu_3" 32; +} + +bucket "dma_rsvd_0" { + size 64; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; + "tx_stn_cpu_2" 16; + "tx_stn_cpu_3" 16; +} +bucket "dma_rsvd_1" { + size 64; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; + "tx_stn_cpu_2" 16; + "tx_stn_cpu_3" 16; +} + +bucket "dma_rsvd_2" { + size 64; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; + "tx_stn_cpu_2" 16; + "tx_stn_cpu_3" 16; +} + +bucket "dma_rsvd_3" { + size 64; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; + "tx_stn_cpu_2" 16; + "tx_stn_cpu_3" 16; +} + +/*************************************************************/ +// Compression Message Station + +bucket "cmp_0" { + size 32; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; +} + +bucket "cmp_1" { + size 32; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; +} + +bucket "cmp_2" { + size 32; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; +} + +bucket "cmp_3" { + size 32; + "tx_stn_cpu_0" 16; + "tx_stn_cpu_1" 16; +} + diff --git a/sys/mips/rmi/on_chip.c b/sys/mips/rmi/on_chip.c new file mode 100644 index 000000000000..cfab1d173577 --- /dev/null +++ b/sys/mips/rmi/on_chip.c @@ -0,0 +1,332 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#include +__FBSDID("$FreeBSD$"); +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +void +disable_msgring_int(void *arg); +void +enable_msgring_int(void *arg); + +/* definitions */ +struct tx_stn_handler { + void (*action) (int, int, int, int, struct msgrng_msg *, void *); + void *dev_id; +}; + +/* globals */ +static struct tx_stn_handler tx_stn_handlers[MAX_TX_STNS]; + +#define MSGRNG_CC_INIT_CPU_DEST(dest, counter) \ +do { \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][0], 0 ); \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][1], 1 ); \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][2], 2 ); \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][3], 3 ); \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][4], 4 ); \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][5], 5 ); \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][6], 6 ); \ + msgrng_write_cc(MSGRNG_CC_##dest##_REG, counter[dest][7], 7 ); \ +} while(0) + + +/* make this a read/write spinlock */ +static struct mtx msgrng_lock; +static int msgring_int_enabled; +struct mtx xlr_pic_lock; + +static int msgring_pop_num_buckets; +static uint32_t msgring_pop_bucket_mask; +static int msgring_int_type; +static int msgring_watermark_count; +static uint32_t msgring_thread_mask; + +uint32_t msgrng_msg_cycles = 0; + +int xlr_counters[MAXCPU][XLR_MAX_COUNTERS] __aligned(XLR_CACHELINE_SIZE); + +void xlr_msgring_handler(struct trapframe *); + +void +xlr_msgring_cpu_init(void) +{ + struct stn_cc *cc_config; + struct bucket_size *bucket_sizes; + int id; + unsigned long flags; + + /* if not thread 0 */ + if (xlr_thr_id() != 0) + return; + id = xlr_cpu_id(); + + bucket_sizes = xlr_board_info.bucket_sizes; + cc_config = xlr_board_info.credit_configs[id]; + + msgrng_flags_save(flags); + + /* + * Message Stations are shared among all threads in a cpu core + * Assume, thread 0 on all cores are always active when more than 1 + * thread is active in a core + */ + msgrng_write_bucksize(0, bucket_sizes->bucket[id * 8 + 0]); + msgrng_write_bucksize(1, bucket_sizes->bucket[id * 8 + 1]); + msgrng_write_bucksize(2, bucket_sizes->bucket[id * 8 + 2]); + msgrng_write_bucksize(3, bucket_sizes->bucket[id * 8 + 3]); + msgrng_write_bucksize(4, bucket_sizes->bucket[id * 8 + 4]); + msgrng_write_bucksize(5, bucket_sizes->bucket[id * 8 + 5]); + msgrng_write_bucksize(6, bucket_sizes->bucket[id * 8 + 6]); + msgrng_write_bucksize(7, bucket_sizes->bucket[id * 8 + 7]); + + MSGRNG_CC_INIT_CPU_DEST(0, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(1, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(2, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(3, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(4, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(5, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(6, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(7, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(8, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(9, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(10, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(11, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(12, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(13, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(14, cc_config->counters); + MSGRNG_CC_INIT_CPU_DEST(15, cc_config->counters); + + msgrng_flags_restore(flags); +} + +void +xlr_msgring_config(void) +{ + msgring_int_type = 0x02; + msgring_pop_num_buckets = 8; + msgring_pop_bucket_mask = 0xff; + + msgring_watermark_count = 1; + msgring_thread_mask = 0x01; +/* printf("[%s]: int_type = 0x%x, pop_num_buckets=%d, pop_bucket_mask=%x" */ +/* "watermark_count=%d, thread_mask=%x\n", __FUNCTION__, */ +/* msgring_int_type, msgring_pop_num_buckets, msgring_pop_bucket_mask, */ +/* msgring_watermark_count, msgring_thread_mask); */ +} + +void +xlr_msgring_handler(struct trapframe *tf) +{ + unsigned long mflags; + int bucket = 0; + int size = 0, code = 0, rx_stid = 0, tx_stid = 0; + struct msgrng_msg msg; + unsigned int bucket_empty_bm = 0; + unsigned int status = 0; + + xlr_inc_counter(MSGRNG_INT); + /* TODO: not necessary to disable preemption */ + msgrng_flags_save(mflags); + + /* First Drain all the high priority messages */ + for (;;) { + bucket_empty_bm = (msgrng_read_status() >> 24) & msgring_pop_bucket_mask; + + /* all buckets empty, break */ + if (bucket_empty_bm == msgring_pop_bucket_mask) + break; + + for (bucket = 0; bucket < msgring_pop_num_buckets; bucket++) { + uint32_t cycles = 0; + + if ((bucket_empty_bm & (1 << bucket)) /* empty */ ) + continue; + + status = message_receive(bucket, &size, &code, &rx_stid, &msg); + if (status) + continue; + + xlr_inc_counter(MSGRNG_MSG); + msgrng_msg_cycles = mips_rd_count(); + cycles = msgrng_msg_cycles; + + tx_stid = xlr_board_info.msgmap[rx_stid]; + + if (!tx_stn_handlers[tx_stid].action) { + printf("[%s]: No Handler for message from stn_id=%d, bucket=%d, " + "size=%d, msg0=%llx, dropping message\n", + __FUNCTION__, tx_stid, bucket, size, msg.msg0); + } else { + //printf("[%s]: rx_stid = %d\n", __FUNCTION__, rx_stid); + msgrng_flags_restore(mflags); + (*tx_stn_handlers[tx_stid].action) (bucket, size, code, rx_stid, + &msg, tx_stn_handlers[tx_stid].dev_id); + msgrng_flags_save(mflags); + } + xlr_set_counter(MSGRNG_MSG_CYCLES, (read_c0_count() - cycles)); + } + } + + xlr_set_counter(MSGRNG_EXIT_STATUS, msgrng_read_status()); + + msgrng_flags_restore(mflags); + + //dbg_msg("OUT irq=%d\n", irq); + + /* Call the msg callback */ +} + +void +enable_msgring_int(void *arg) +{ + unsigned long mflags = 0; + + msgrng_access_save(&msgrng_lock, mflags); + /* enable the message ring interrupts */ + msgrng_write_config((msgring_watermark_count << 24) | (IRQ_MSGRING << 16) + | (msgring_thread_mask << 8) | msgring_int_type); + msgrng_access_restore(&msgrng_lock, mflags); +} + +void +disable_msgring_int(void *arg) +{ + unsigned long mflags = 0; + uint32_t config; + + msgrng_access_save(&msgrng_lock, mflags); + config = msgrng_read_config(); + config &= ~0x3; + msgrng_write_config(config); + msgrng_access_restore(&msgrng_lock, mflags); +} + +extern void platform_prep_smp_launch(void); +extern void msgring_process_fast_intr(void *arg); + +int +register_msgring_handler(int major, + void (*action) (int, int, int, int, struct msgrng_msg *, void *), + void *dev_id) +{ + void *cookie; /* FIXME - use? */ + + if (major >= MAX_TX_STNS) + return 1; + + //dbg_msg("major=%d, action=%p, dev_id=%p\n", major, action, dev_id); + + if (rmi_spin_mutex_safe) + mtx_lock_spin(&msgrng_lock); + tx_stn_handlers[major].action = action; + tx_stn_handlers[major].dev_id = dev_id; + if (rmi_spin_mutex_safe) + mtx_unlock_spin(&msgrng_lock); + + if (xlr_test_and_set(&msgring_int_enabled)) { + platform_prep_smp_launch(); + + cpu_establish_hardintr("msgring", (driver_filter_t *) msgring_process_fast_intr, + NULL, NULL, IRQ_MSGRING, + INTR_TYPE_NET | INTR_FAST, &cookie); + + /* configure the msgring interrupt on cpu 0 */ + enable_msgring_int(NULL); + } + return 0; +} + +static void +pic_init(void) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + int i = 0; + int level; + + dbg_msg("Initializing PIC...\n"); + for (i = 0; i < PIC_NUM_IRTS; i++) { + + level = PIC_IRQ_IS_EDGE_TRIGGERED(i); + + /* Bind all PIC irqs to cpu 0 */ + xlr_write_reg(mmio, PIC_IRT_0_BASE + i, 0x01); + + /* + * Use local scheduling and high polarity for all IRTs + * Invalidate all IRTs, by default + */ + xlr_write_reg(mmio, PIC_IRT_1_BASE + i, (level << 30) | (1 << 6) | (PIC_IRQ_BASE + i)); + } + dbg_msg("PIC init now done\n"); +} + +void +on_chip_init(void) +{ + int i = 0, j = 0; + + /* Set xlr_io_base to the run time value */ + mtx_init(&msgrng_lock, "msgring", NULL, MTX_SPIN | MTX_RECURSE); + mtx_init(&xlr_pic_lock, "pic", NULL, MTX_SPIN); + + xlr_board_info_setup(); + + msgring_int_enabled = 0; + + xlr_msgring_config(); + pic_init(); + + xlr_msgring_cpu_init(); + + for (i = 0; i < MAXCPU; i++) + for (j = 0; j < XLR_MAX_COUNTERS; j++) + atomic_set_int(&xlr_counters[i][j], 0); +} diff --git a/sys/mips/rmi/pcibus.c b/sys/mips/rmi/pcibus.c new file mode 100644 index 000000000000..c683d47936fb --- /dev/null +++ b/sys/mips/rmi/pcibus.c @@ -0,0 +1,357 @@ +/*- + * Copyright (c) 1997, Stefan Esser + * 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 unmodified, 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 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 +__FBSDID("$FreeBSD$"); + +#include "opt_isa.h" + +#define __RMAN_RESOURCE_VISIBLE +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +/* +static void bridge_pcix_ack(void *); +static void bridge_pcie_ack(void *); +static void pic_pcix_ack(void *); +static void pic_pcie_ack(void *); +*/ + +extern vm_map_t kernel_map; +vm_offset_t kmem_alloc_nofault(vm_map_t map, vm_size_t size); + + +int +mips_pci_route_interrupt(device_t bus, device_t dev, int pin) +{ + /* + * Validate requested pin number. + */ + if ((pin < 1) || (pin > 4)) + return (255); + + if (xlr_board_info.is_xls) { + switch (pin) { + case 1: + return PIC_PCIE_LINK0_IRQ; + case 2: + return PIC_PCIE_LINK1_IRQ; + case 3: + return PIC_PCIE_LINK2_IRQ; + case 4: + return PIC_PCIE_LINK3_IRQ; + } + } else { + if (pin == 1) { + return (16); + } + } + + return (255); +} + +static struct rman irq_rman, port_rman, mem_rman; + +/* +static void bridge_pcix_ack(void *arg) +{ + xlr_read_reg(xlr_io_mmio(XLR_IO_PCIX_OFFSET), 0x140 >> 2); + } +*/ +/* +static void bridge_pcie_ack(void *arg) +{ + int irq = (int)arg; + uint32_t reg; + xlr_reg_t *pcie_mmio_le = xlr_io_mmio(XLR_IO_PCIE_1_OFFSET); + + switch (irq) { + case PIC_PCIE_LINK0_IRQ : reg = PCIE_LINK0_MSI_STATUS; break; + case PIC_PCIE_LINK1_IRQ : reg = PCIE_LINK1_MSI_STATUS; break; + case PIC_PCIE_LINK2_IRQ : reg = PCIE_LINK2_MSI_STATUS; break; + case PIC_PCIE_LINK3_IRQ : reg = PCIE_LINK3_MSI_STATUS; break; + default: + return; + } + + xlr_write_reg(pcie_mmio_le, reg>>2, 0xffffffff); +} +*/ +/* +static void pic_pcix_ack(void *none) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_INT_ACK, (1 << PIC_IRT_PCIX_INDEX)); + mtx_unlock_spin(&xlr_pic_lock); +} +*/ +/* +static void pic_pcie_ack(void *arg) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + int irq = (int) arg; + + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_INT_ACK, (1 << (irq - PIC_IRQ_BASE))); + mtx_unlock_spin(&xlr_pic_lock); +} + +*/ + +int +mips_platform_pci_setup_intr(device_t dev, device_t child, + struct resource *irq, int flags, + driver_filter_t * filt, + driver_intr_t * intr, void *arg, + void **cookiep) +{ + int level; + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + int error = 0; + int xlrirq; + + error = rman_activate_resource(irq); + if (error) + return error; + if (rman_get_start(irq) != rman_get_end(irq)) { + device_printf(dev, "Interrupt allocation %lu != %lu\n", + rman_get_start(irq), rman_get_end(irq)); + return EINVAL; + } + xlrirq = rman_get_start(irq); + if (strcmp(device_get_name(dev), "pcib") != 0) + return 0; + + if (xlr_board_info.is_xls == 0) { + + if (rmi_spin_mutex_safe) mtx_lock_spin(&xlr_pic_lock); + level = PIC_IRQ_IS_EDGE_TRIGGERED(PIC_IRT_PCIX_INDEX); + xlr_write_reg(mmio, PIC_IRT_0_PCIX, 0x01); + xlr_write_reg(mmio, PIC_IRT_1_PCIX, ((1 << 31) | (level << 30) | + (1 << 6) | (PIC_PCIX_IRQ))); + if (rmi_spin_mutex_safe) mtx_unlock_spin(&xlr_pic_lock); + cpu_establish_hardintr(device_get_name(child), filt, + (driver_intr_t *) intr, (void *)arg, PIC_PCIX_IRQ, flags, cookiep); + + } else { + if (rmi_spin_mutex_safe) mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_IRT_0_BASE + xlrirq - PIC_IRQ_BASE, 0x01); + xlr_write_reg(mmio, PIC_IRT_1_BASE + xlrirq - PIC_IRQ_BASE, + ((1 << 31) | (1 << 30) | (1 << 6) | xlrirq)); + if (rmi_spin_mutex_safe) mtx_unlock_spin(&xlr_pic_lock); + + if (flags & INTR_FAST) + cpu_establish_hardintr(device_get_name(child), filt, + (driver_intr_t *) intr, (void *)arg, xlrirq, flags, cookiep); + else + cpu_establish_hardintr(device_get_name(child), filt, + (driver_intr_t *) intr, (void *)arg, xlrirq, flags, cookiep); + + + } + return bus_generic_setup_intr(dev, child, irq, flags, filt, intr, + arg, cookiep); +} + + +int +mips_platform_pci_teardown_intr(device_t dev, device_t child, + struct resource *irq, void *cookie); +int +mips_platform_pci_teardown_intr(device_t dev, device_t child, + struct resource *irq, void *cookie) +{ + if (strcmp(device_get_name(child), "pci") == 0) { + /* if needed reprogram the pic to clear pcix related entry */ + } + return bus_generic_teardown_intr(dev, child, irq, cookie); +} + +void +pci_init_resources(void) +{ + irq_rman.rm_start = 0; + irq_rman.rm_end = 255; + irq_rman.rm_type = RMAN_ARRAY; + irq_rman.rm_descr = "PCI Mapped Interrupts"; + if (rman_init(&irq_rman) + || rman_manage_region(&irq_rman, 0, 255)) + panic("pci_init_resources irq_rman"); + + port_rman.rm_start = 0; + port_rman.rm_end = ~0u; + port_rman.rm_type = RMAN_ARRAY; + port_rman.rm_descr = "I/O ports"; + if (rman_init(&port_rman) + || rman_manage_region(&port_rman, 0x10000000, 0x1fffffff)) + panic("pci_init_resources port_rman"); + + mem_rman.rm_start = 0; + mem_rman.rm_end = ~0u; + mem_rman.rm_type = RMAN_ARRAY; + mem_rman.rm_descr = "I/O memory"; + if (rman_init(&mem_rman) + || rman_manage_region(&mem_rman, 0xd0000000, 0xdfffffff)) + panic("pci_init_resources mem_rman"); +} + +/* hack from bus.h in mips/include/bus.h */ +#ifndef MIPS_BUS_SPACE_PCI +#define MIPS_BUS_SPACE_PCI 10 +#endif + +struct resource * +xlr_pci_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct rman *rm; + struct resource *rv; + vm_offset_t va; + int needactivate = flags & RF_ACTIVE; + +#if 0 + device_printf(bus, "xlr_pci_alloc_resource : child %s, type %d, start %lx end %lx, count %lx, flags %x\n", + device_get_nameunit(child), type, start, end, count, flags); +#endif + + switch (type) { + case SYS_RES_IRQ: + rm = &irq_rman; + break; + + case SYS_RES_IOPORT: + rm = &port_rman; + break; + + case SYS_RES_MEMORY: + rm = &mem_rman; + break; + + default: + return 0; + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + if (rv == 0) + return 0; + + rman_set_bustag(rv, (bus_space_tag_t) MIPS_BUS_SPACE_PCI); + rman_set_rid(rv, *rid); + + if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { + /* + * if ((start + count) > (2 << 28)) { va_start = + * kmem_alloc_nofault(kernel_map, count); } + */ + /* + * This called for pmap_map_uncached, but the pmap_map calls + * pmap_kenter which does a is_cacheable_mem() check and + * thus sets the PTE_UNCACHED bit. Hopefully this will work + * for this guy... RRS + */ + /* va = pmap_map(&va_start, start, start + count, 0); */ + va = (vm_offset_t)pmap_mapdev(start, start + count); + rman_set_bushandle(rv, va); + /* bushandle is same as virtual addr */ + rman_set_virtual(rv, (void *)va); + rman_set_bustag(rv, (bus_space_tag_t) MIPS_BUS_SPACE_PCI); + } + if (needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + return rv; +} + + +int +pci_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (rman_deactivate_resource(r)); +} + +/* now in pci.c +int +pci_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (rman_activate_resource(r)); +} + +int +pci_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (rman_release_resource(r)); +} +*/ + +struct rman * +pci_get_rman(device_t dev, int type) +{ + switch (type) { + case SYS_RES_IOPORT: + return &port_rman; + + case SYS_RES_MEMORY: + return &mem_rman; + + case SYS_RES_IRQ: + return &irq_rman; + } + + return 0; +} diff --git a/sys/mips/rmi/pcibus.h b/sys/mips/rmi/pcibus.h new file mode 100644 index 000000000000..7d1e9234c3ac --- /dev/null +++ b/sys/mips/rmi/pcibus.h @@ -0,0 +1,35 @@ +/*- + * Copyright (c) 1998 Doug Rabson + * 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$ + */ +#define DEFAULT_PCI_CONFIG_BASE 0x18000000 +#define MSI_MIPS_ADDR_BASE 0xfee00000 + +#define PCIE_LINK0_MSI_STATUS 0x90 +#define PCIE_LINK1_MSI_STATUS 0x94 +#define PCIE_LINK2_MSI_STATUS 0x190 +#define PCIE_LINK3_MSI_STATUS 0x194 + diff --git a/sys/mips/rmi/perfmon.h b/sys/mips/rmi/perfmon.h new file mode 100644 index 000000000000..555b1818cd32 --- /dev/null +++ b/sys/mips/rmi/perfmon.h @@ -0,0 +1,183 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ + +#ifndef PERFMON_H +#define PERFMON_H + +#include + +/* + * category events reported by the perfmon library + */ +enum event_category_t { + PERF_CP0_COUNTER = 1, PERF_CP2_CREDITS, PERF_L2_COUNTER, + PERF_SBC_COUNTER, PERF_SBC_CREDITS, PERF_GMAC0_COUNTER, PERF_GMAC1_COUNTER, + PERF_GMAC2_COUNTER, PERF_GMAC_STAT_COM, PERF_GMAC_STAT_TX, +PERF_GMAC_STAT_RX, PERF_DRAM_COUNTER, PERF_PARAMETER_CONF = 127}; + + +enum perf_param_t { + PERF_CPU_SAMPLING_INTERVAL, PERF_SYS_SAMPLING_INTERVAL, PERF_CC_SAMPLE_RATE, PERF_CP0_FLAGS +}; + +#define CPO_EVENTS_TEMPLATE 0x06 /* enable kernel and user events */ + +#define PERFMON_ACTIVE_MAGIC 0xc001 +#define PERFMON_ENABLED_MAGIC 0xb007 +#define PERFMON_INITIAL_GENERATION 0x0101 + +#define PERFMON_SERVER_PORT 7007 + +enum system_bridge_credits_t { + PCIX_CREDITS, HT_CREDITS, GIO_CREDITS, OTHER_CREDITS +}; + +struct perf_config_data { + uint16_t magic; /* monitor start when this is initialized */ + uint16_t generation; /* incremented when the config changes */ + uint16_t flags; + uint16_t cc_sample_rate;/* rate at which credit counters are sampled + * relative to sampling_rate */ + uint32_t sampling_rate; /* rate at which events are sampled */ + uint32_t cc_register_mask; /* credit counters registers to be + * sampled */ + uint64_t events[NTHREADS]; /* events bitmap for each thread */ +}; + +struct perf_sample { + uint32_t counter; + uint32_t timestamp; + uint32_t sample_tag; + uint32_t duration; +}; + +struct sample_q { + int32_t head, tail; + struct perf_sample samples[PERF_SAMPLE_BUFSZ]; + uint32_t overflows; +}; + +struct perf_area { + struct perf_config_data perf_config; + struct sample_q sample_fifo; +}; + +/* + * We have a shared location to keep a global tick counter for all the + * CPUS - TODO is this optimal? effect on cache? + */ +extern uint32_t *xlr_perfmon_timer_loc; + +#define PERFMON_TIMESTAMP_LOC (xlr_perfmon_timer_loc) + +static __inline__ uint32_t +perfmon_timestamp_get(void) +{ + return *PERFMON_TIMESTAMP_LOC; +} + +static __inline__ void +perfmon_timestamp_set(uint32_t val) +{ + *PERFMON_TIMESTAMP_LOC = val; +} + +static __inline__ void +perfmon_timestamp_incr(int val) +{ + (*PERFMON_TIMESTAMP_LOC) += val; +} + +static __inline__ void +send_sample_gts(uint32_t tag, uint32_t value, uint32_t td) +{ + xlr_send_sample(tag, value, perfmon_timestamp_get(), td); +} + +/* + * Simple FIFO, one producer - one consumer - circlar queue - no locking + */ + +static __inline__ void +init_fifo(struct sample_q *q) +{ + q->head = q->tail = 0; +} + +static __inline__ void +put_sample(struct sample_q *q, uint32_t sample_tag, uint32_t counter, + uint32_t duration) +{ + uint32_t timestamp = perfmon_timestamp_get(); + int new_tail = (q->tail + 1) % PERF_SAMPLE_BUFSZ; + + if (q->head == new_tail) { + q->overflows++; + return; + } + q->samples[new_tail].sample_tag = sample_tag; + q->samples[new_tail].counter = counter; + q->samples[new_tail].timestamp = timestamp; + q->samples[new_tail].duration = duration; + + q->tail = new_tail; +} + +static __inline__ int +get_sample(struct sample_q *q, uint32_t * sample_tag, uint32_t * counter, + uint32_t * timestamp, uint32_t * duration) +{ + int head = q->head; + + if (head == q->tail) + return 0; + *sample_tag = q->samples[head].sample_tag; + *counter = q->samples[head].counter; + *timestamp = q->samples[head].timestamp; + *duration = q->samples[head].duration; + + q->head = (head + 1) % PERF_SAMPLE_BUFSZ; + return 1; +} + +static __inline__ void +clear_queue(struct sample_q *q) +{ + q->head = q->tail; +} +void xlr_perfmon_init_cpu(void *); +void xlr_perfmon_sampler(void *); +void log_active_core(int core); +int get_start_generation(void); + +void xlr_perfmon_clockhandler(void); +extern int xlr_perfmon_started; + +#endif /* PERFMON_H */ diff --git a/sys/mips/rmi/perfmon_kern.c b/sys/mips/rmi/perfmon_kern.c new file mode 100644 index 000000000000..363bbb2037d5 --- /dev/null +++ b/sys/mips/rmi/perfmon_kern.c @@ -0,0 +1,163 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int xlr_perfmon_started = 0; +struct perf_area *xlr_shared_config_area = NULL; +uint32_t *xlr_perfmon_timer_loc; +uint32_t *xlr_cpu_sampling_interval; +uint32_t xlr_perfmon_kernel_version = 1; /* Future use */ +uint32_t xlr_perfmon_ticks; +extern int mips_cpu_online_mask; +extern uint32_t cpu_ltop_map[MAXCPU]; + +#ifdef SMP +static __inline__ void +pic_send_perfmon_ipi(int cpu) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + int tid, pid; + uint32_t ipi; + + tid = cpu & 0x3; + pid = (cpu >> 2) & 0x7; + ipi = (pid << 20) | (tid << 16) | IPI_PERFMON; + + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_IPI, ipi); + mtx_unlock_spin(&xlr_pic_lock); +} + +#endif + + +void +xlr_perfmon_clockhandler(void) +{ +#ifdef SMP + int cpu; + int i; + +#endif + + if (xlr_perfmon_ticks++ >= (*xlr_cpu_sampling_interval) / (XLR_PIC_HZ / (hz * 1024))) { + + /* update timer */ + *xlr_perfmon_timer_loc += *xlr_cpu_sampling_interval; + xlr_perfmon_ticks = 0; + xlr_perfmon_sampler(NULL); +#ifdef SMP + for (i = 0; i < NCPUS; i = i + NTHREADS) { /* oly thread 0 */ + cpu = cpu_ltop_map[i]; + if ((mips_cpu_online_mask & (1 << i)) && + xlr_shared_config_area[cpu / NTHREADS].perf_config.magic == + PERFMON_ACTIVE_MAGIC) + pic_send_perfmon_ipi(cpu); + } + +#endif + + } +} + +static void +xlr_perfmon_start(void) +{ + size_t size; + + size = (NCORES * sizeof(*xlr_shared_config_area)) + + sizeof(*xlr_perfmon_timer_loc) + + sizeof(*xlr_cpu_sampling_interval); + + xlr_shared_config_area = malloc(size, M_TEMP, M_WAITOK); + if (!xlr_shared_config_area) { + /* ERROR */ + return; + } + xlr_perfmon_timer_loc = (uint32_t *) (xlr_shared_config_area + NCORES); + xlr_cpu_sampling_interval = (uint32_t *) (xlr_perfmon_timer_loc + 1); + + *xlr_cpu_sampling_interval = DEFAULT_CPU_SAMPLING_INTERVAL; + *xlr_perfmon_timer_loc = 0; + xlr_perfmon_ticks = 0; + + xlr_perfmon_init_cpu(NULL); +#ifdef SMP + smp_call_function(xlr_perfmon_init_cpu, NULL, + PCPU_GET(other_cpus) & 0x11111111); +#endif + xlr_perfmon_started = 1; + +} + +static void +xlr_perfmon_stop(void) +{ + xlr_perfmon_started = 0; + free(xlr_shared_config_area, M_TEMP); + xlr_shared_config_area = NULL; +} + +static int +sysctl_xlr_perfmon_start_stop(SYSCTL_HANDLER_ARGS) +{ + int error, val = xlr_perfmon_started; + + error = sysctl_handle_int(oidp, &val, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + + if (!xlr_perfmon_started && val != 0) + xlr_perfmon_start(); + else if (xlr_perfmon_started && val == 0) + xlr_perfmon_stop(); + + return (0); +} + + +SYSCTL_NODE(_debug, OID_AUTO, xlrperf, CTLFLAG_RW, NULL, "XLR PERF Nodes"); +SYSCTL_PROC(_debug_xlrperf, OID_AUTO, start, CTLTYPE_INT | CTLFLAG_RW, + &xlr_perfmon_started, 0, sysctl_xlr_perfmon_start_stop, "I", "set/unset to start/stop " + "performance monitoring"); diff --git a/sys/mips/rmi/perfmon_percpu.c b/sys/mips/rmi/perfmon_percpu.c new file mode 100644 index 000000000000..fc0f06246bb1 --- /dev/null +++ b/sys/mips/rmi/perfmon_percpu.c @@ -0,0 +1,342 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CC_SAMPLE (PERF_CP2_CREDITS <<24) + +#define CC_REG0 16 +#define CC_REG1 17 +#define CC_REG2 18 +#define CC_REG3 19 +#define CC_REG4 20 +#define CC_REG5 21 +#define CC_REG6 22 +#define CC_REG7 23 +#define CC_REG8 24 +#define CC_REG9 25 +#define CC_REG10 26 +#define CC_REG11 27 +#define CC_REG12 28 +#define CC_REG13 29 +#define CC_REG14 30 +#define CC_REG15 31 + +extern uint32_t cpu_ltop_map[MAXCPU]; +extern struct perf_area *xlr_shared_config_area; + +static __inline__ uint32_t +make_cpu_tag(uint32_t val) +{ + return PERF_CP0_COUNTER << 24 | (val & 0xffff); +} + +static __inline__ uint32_t +make_cp0_perf_control(uint32_t flags, uint32_t thread, uint32_t event) +{ + return (flags & 0x1f) | (thread & 0x03) << 11 | (event & 0x3f) << 5 | 0x01; +} + +static __inline__ uint32_t +cp0_perf_control_get_thread(uint32_t control_word) +{ + return (control_word & 0x1800) >> 11; +} + +static __inline__ uint32_t +cp0_perf_control_get_event(uint32_t control_word) +{ + return (control_word & 0x7e0) >> 5; +} + +static __inline__ uint32_t +read_pic_6_timer_count(void) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + /* PIC counts down, convert it to count up */ + return 0xffffffffU - xlr_read_reg(mmio, PIC_TIMER_6_COUNTER_0); +} + + +static uint32_t +get_num_events(const uint64_t * events) +{ + int total = 0; + int thread; + + for (thread = 0; thread < NTHREADS; thread++) { + if (events[thread] == 0) + continue; + total += get_set_bit_count64(events[thread]); + } + return total; +} + +static uint32_t +get_first_control_word(uint32_t flags, const uint64_t * events) +{ + int thread, event; + + for (thread = 0; thread < NTHREADS; thread++) { + if (events[thread] != 0) + break; + } + if (thread == NTHREADS) + return -1; + + event = find_first_set_bit64(events[thread]); + return make_cp0_perf_control(flags, thread, event); +} + +static uint32_t +get_next_control_word(uint32_t current_control_word, const uint64_t * events) +{ + int thread = cp0_perf_control_get_thread(current_control_word); + int event = cp0_perf_control_get_event(current_control_word); + int i; + + event = find_next_set_bit64(events[thread], event); + for (i = 0; event == -1 && i < NTHREADS; i++) { + thread = (thread + 1) % NTHREADS; + if (events[thread] == 0) + continue; + event = find_first_set_bit64(events[thread]); + } + + ASSERT(event != -1); + return make_cp0_perf_control(current_control_word, thread, event); +} + +/* Global state per core */ +#define MY_CORE_NUM (cpu_ltop_map[PCPU_GET(cpuid)]/NTHREADS) +#define my_perf_area (&(xlr_shared_config_area[MY_CORE_NUM])) + +static int num_events_array[NCORES]; +static uint32_t saved_timestamp_array[NCORES]; +static struct perf_config_data saved_config_array[NCORES]; +static int cc_sample_array[NCORES]; + +#define num_events (num_events_array[MY_CORE_NUM]) +#define saved_timestamp (saved_timestamp_array[MY_CORE_NUM]) +#define saved_config (saved_config_array[MY_CORE_NUM]) +#define cc_sample (cc_sample_array[MY_CORE_NUM]) + +static void +do_sample_cc_registers(struct sample_q *q, uint32_t mask) +{ + unsigned long flags; + + DPRINT("Sample CC registers %x", mask); + msgrng_flags_save(flags); + if (mask & 0x00000001) + put_sample(q, CC_SAMPLE + 0, read_cc_registers_0123(CC_REG0), 0); + if (mask & 0x00000002) + put_sample(q, CC_SAMPLE + 1, read_cc_registers_4567(CC_REG0), 0); + if (mask & 0x00000004) + put_sample(q, CC_SAMPLE + 2, read_cc_registers_0123(CC_REG1), 0); + if (mask & 0x00000008) + put_sample(q, CC_SAMPLE + 3, read_cc_registers_4567(CC_REG1), 0); + if (mask & 0x00000010) + put_sample(q, CC_SAMPLE + 4, read_cc_registers_0123(CC_REG2), 0); + if (mask & 0x00000020) + put_sample(q, CC_SAMPLE + 5, read_cc_registers_4567(CC_REG2), 0); + if (mask & 0x00000040) + put_sample(q, CC_SAMPLE + 6, read_cc_registers_0123(CC_REG3), 0); + if (mask & 0x00000080) + put_sample(q, CC_SAMPLE + 7, read_cc_registers_4567(CC_REG3), 0); + if (mask & 0x00000100) + put_sample(q, CC_SAMPLE + 8, read_cc_registers_0123(CC_REG4), 0); + if (mask & 0x00000200) + put_sample(q, CC_SAMPLE + 9, read_cc_registers_4567(CC_REG4), 0); + if (mask & 0x00000400) + put_sample(q, CC_SAMPLE + 10, read_cc_registers_0123(CC_REG5), 0); + if (mask & 0x00000800) + put_sample(q, CC_SAMPLE + 11, read_cc_registers_4567(CC_REG5), 0); + if (mask & 0x00001000) + put_sample(q, CC_SAMPLE + 12, read_cc_registers_0123(CC_REG6), 0); + if (mask & 0x00002000) + put_sample(q, CC_SAMPLE + 13, read_cc_registers_4567(CC_REG6), 0); + if (mask & 0x00004000) + put_sample(q, CC_SAMPLE + 14, read_cc_registers_0123(CC_REG7), 0); + if (mask & 0x00008000) + put_sample(q, CC_SAMPLE + 15, read_cc_registers_4567(CC_REG7), 0); + if (mask & 0x00010000) + put_sample(q, CC_SAMPLE + 16, read_cc_registers_0123(CC_REG8), 0); + if (mask & 0x00020000) + put_sample(q, CC_SAMPLE + 17, read_cc_registers_4567(CC_REG8), 0); + if (mask & 0x00040000) + put_sample(q, CC_SAMPLE + 18, read_cc_registers_0123(CC_REG9), 0); + if (mask & 0x00080000) + put_sample(q, CC_SAMPLE + 19, read_cc_registers_4567(CC_REG9), 0); + if (mask & 0x00100000) + put_sample(q, CC_SAMPLE + 20, read_cc_registers_0123(CC_REG10), 0); + if (mask & 0x00200000) + put_sample(q, CC_SAMPLE + 21, read_cc_registers_4567(CC_REG10), 0); + if (mask & 0x00400000) + put_sample(q, CC_SAMPLE + 22, read_cc_registers_0123(CC_REG11), 0); + if (mask & 0x00800000) + put_sample(q, CC_SAMPLE + 23, read_cc_registers_4567(CC_REG11), 0); + if (mask & 0x01000000) + put_sample(q, CC_SAMPLE + 24, read_cc_registers_0123(CC_REG12), 0); + if (mask & 0x02000000) + put_sample(q, CC_SAMPLE + 24, read_cc_registers_4567(CC_REG12), 0); + if (mask & 0x04000000) + put_sample(q, CC_SAMPLE + 26, read_cc_registers_0123(CC_REG13), 0); + if (mask & 0x08000000) + put_sample(q, CC_SAMPLE + 27, read_cc_registers_4567(CC_REG13), 0); + if (mask & 0x10000000) + put_sample(q, CC_SAMPLE + 28, read_cc_registers_0123(CC_REG14), 0); + if (mask & 0x20000000) + put_sample(q, CC_SAMPLE + 29, read_cc_registers_4567(CC_REG14), 0); + if (mask & 0x40000000) + put_sample(q, CC_SAMPLE + 30, read_cc_registers_0123(CC_REG15), 0); + if (mask & 0x80000000) + put_sample(q, CC_SAMPLE + 31, read_cc_registers_4567(CC_REG15), 0); + msgrng_flags_restore(flags); +} + +static void +reconfigure(void) +{ + uint32_t cntr_cntrl; + + saved_config = my_perf_area->perf_config; + num_events = get_num_events(saved_config.events); + cc_sample = saved_config.cc_sample_rate; + + DPRINT("%d - reconfigure num_events = %d, events = %llx,%llx,%llx,%llx\n", + processor_id(), num_events, saved_config.events[0], + saved_config.events[1], saved_config.events[2], saved_config.events[3]); + + if (num_events == 0) + return; + + cntr_cntrl = get_first_control_word(saved_config.flags, saved_config.events); + write_c0_register(CP0_PERF_COUNTER, PERFCNTRCTL0, cntr_cntrl); + write_c0_register(CP0_PERF_COUNTER, PERFCNTR0, 0); /* reset count */ + if (num_events > 1) { + cntr_cntrl = get_next_control_word(cntr_cntrl, saved_config.events); + write_c0_register(CP0_PERF_COUNTER, PERFCNTRCTL1, cntr_cntrl); + write_c0_register(CP0_PERF_COUNTER, PERFCNTR1, 0); /* reset count */ + } + saved_timestamp = read_pic_6_timer_count(); +} + +int xlr_perfmon_no_event_count = 0; +int xlr_perfmon_sample_count; + +/* timer callback routine */ +void +xlr_perfmon_sampler(void *dummy) +{ + uint32_t current_ts; + uint32_t cntr_cntrl = 0; + + /* xlr_ack_interrupt(XLR_PERFMON_IPI_VECTOR); */ + + if (my_perf_area->perf_config.magic != PERFMON_ACTIVE_MAGIC) + return; + /* + * If there has been a change in configuation, update the + * configuration + */ + if (saved_config.generation != my_perf_area->perf_config.generation) { + reconfigure(); + return; + } + /* credit counter samples if reqd */ + if (saved_config.cc_register_mask && --cc_sample == 0) { + cc_sample = saved_config.cc_sample_rate; + do_sample_cc_registers(&my_perf_area->sample_fifo, + my_perf_area->perf_config.cc_register_mask); + } + if (num_events == 0) { + xlr_perfmon_no_event_count++; + return; + } + /* put samples in the queue */ + current_ts = read_pic_6_timer_count(); + cntr_cntrl = read_c0_register(CP0_PERF_COUNTER, PERFCNTRCTL0); + put_sample(&my_perf_area->sample_fifo, make_cpu_tag(cntr_cntrl), + read_c0_register(CP0_PERF_COUNTER, PERFCNTR0), current_ts - saved_timestamp); + xlr_perfmon_sample_count++; + write_c0_register(CP0_PERF_COUNTER, PERFCNTR0, 0); /* reset count */ + + if (num_events > 1) { + cntr_cntrl = read_c0_register(CP0_PERF_COUNTER, PERFCNTRCTL1); + put_sample(&my_perf_area->sample_fifo, make_cpu_tag(cntr_cntrl), + read_c0_register(CP0_PERF_COUNTER, PERFCNTR1), current_ts - saved_timestamp); + xlr_perfmon_sample_count++; + write_c0_register(CP0_PERF_COUNTER, PERFCNTR1, 0); /* reset count */ + + if (num_events > 2) { + /* multiplex events */ + cntr_cntrl = get_next_control_word(cntr_cntrl, saved_config.events); + write_c0_register(CP0_PERF_COUNTER, PERFCNTRCTL0, cntr_cntrl); + + cntr_cntrl = get_next_control_word(cntr_cntrl, saved_config.events); + write_c0_register(CP0_PERF_COUNTER, PERFCNTRCTL1, cntr_cntrl); + } + } + saved_timestamp = read_pic_6_timer_count(); +} + +/* + * Initializes time to gather CPU performance counters and credit counters + */ +void +xlr_perfmon_init_cpu(void *dummy) +{ + int processor = cpu_ltop_map[PCPU_GET(cpuid)]; + + /* run on just one thread per core */ + if (processor % 4) + return; + + DPRINT("%d : configure with %p", processor, my_perf_area); + memset(my_perf_area, 0, sizeof(*my_perf_area)); + init_fifo(&my_perf_area->sample_fifo); + my_perf_area->perf_config.magic = PERFMON_ENABLED_MAGIC; + my_perf_area->perf_config.generation = PERFMON_INITIAL_GENERATION; + DPRINT("%d : Initialize", processor); + + return; +} diff --git a/sys/mips/rmi/perfmon_utils.h b/sys/mips/rmi/perfmon_utils.h new file mode 100644 index 000000000000..bafcb5465260 --- /dev/null +++ b/sys/mips/rmi/perfmon_utils.h @@ -0,0 +1,126 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ + +#ifndef UTILS_H +#define UTILS_H + +#include /* variable args */ + +/* TODO optimize of mips, even i & (i-1) is better */ + +static int __inline__ +get_set_bit_count64(uint64_t value) +{ + int i, result = 0; + + for (i = 0; i < sizeof(value) * 8; i++) + if (value & (1ULL << i)) + result++; + + return result; +} + +static int __inline__ +find_first_set_bit64(uint64_t value) +{ + int i; + + for (i = 0; i < sizeof(value) * 8; i++) + if (value & (1ULL << i)) + return i; + + return -1; +} + +static int __inline__ +find_next_set_bit64(uint64_t value, int pos) +{ + int i; + + for (i = pos + 1; i < sizeof(value) * 8; i++) + if (value & (1ULL << i)) + return i; + + return -1; +} + +/** --- **/ + +static int __inline__ +get_set_bit_count(uint32_t value) +{ + int i, result = 0; + + for (i = 0; i < sizeof(value) * 8; i++) + if (value & (1U << i)) + result++; + + return result; +} + +static int __inline__ +find_first_set_bit(uint32_t value) +{ + int i; + + for (i = 0; i < sizeof(value) * 8; i++) + if (value & (1U << i)) + return i; + + return -1; +} + +static int __inline__ +find_next_set_bit(uint32_t value, int pos) +{ + int i; + + for (i = pos + 1; i < sizeof(value) * 8; i++) + if (value & (1U << i)) + return i; + + return -1; +} + +#ifdef DEBUG +void abort(); + +#define DPUTC(c) (putchar(c) && fflush(stdout)) +#define DPRINT(fmt, ...) printf(fmt "\n", __VA_ARGS__) +#define ASSERT(x) ((x) || ({ printf("%s failed at (%s:%d)", #x, __FILE__, __LINE__) ; abort(); 0; }) ) +#else +#define DPUTC(c) +#define DPRINT(fmt, ...) +#define ASSERT(x) +#endif + +void xlr_send_sample(uint32_t tag, uint32_t value, uint32_t ts, uint32_t td); + +#endif diff --git a/sys/mips/rmi/perfmon_xlrconfig.h b/sys/mips/rmi/perfmon_xlrconfig.h new file mode 100644 index 000000000000..e3966aeeb349 --- /dev/null +++ b/sys/mips/rmi/perfmon_xlrconfig.h @@ -0,0 +1,156 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ + +#ifdef XLR_PERFMON + +#ifndef XLRCONFIG_PERFMON_H +#define XLRCONFIG_PERFMON_H + +#include /* for DPRINT */ + +#define NCPUS 32 +#define NCORES 8 +#define NTHREADS 4 +#define PERF_SAMPLE_BUFSZ 32 +/*select timeout is 512*1024 microsecs */ +#define DEFAULT_SYS_SAMPLING_INTERVAL (512*1024) +/* default timer value programmed to PIC is 10*1024*1024 */ +#define DEFAULT_CPU_SAMPLING_INTERVAL (10*1024) +#define DEFAULT_CC_SAMPLE_RATE 16 +#define DEFAULT_CP0_FLAGS 0x0A +#define NUM_L2_BANKS 8 +#define NUM_DRAM_BANKS 4 + +/* CP0 register for timestamp */ +#define CP0_COUNT 9 +#define CP0_EIRR_REG 9 +#define CP0_EIRR_SEL 6 +#define CP0_EIMR_REG 9 +#define CP0_EIMR_SEL 7 + +/* CP0 register for perf counters */ +#define CP0_PERF_COUNTER 25 +/* selector values */ +#define PERFCNTRCTL0 0 +#define PERFCNTR0 1 +#define PERFCNTRCTL1 2 +#define PERFCNTR1 3 + +#define XLR_IO_PIC_OFFSET 0x08000 +#define PIC_SYS_TIMER_0_BASE 0x120 +#define PIC_SYS_TIMER_NUM_6 6 + +/* CP2 registers for reading credit counters */ +#define CC_REG0 16 + +#define read_c0_register(reg, sel) \ +({ unsigned int __rv; \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips32\n\t" \ + "mfc0\t%0,$%1,%2\n\t" \ + ".set\tpop" \ + : "=r" (__rv) : "i" (reg), "i" (sel) ); \ + __rv;}) + +#define write_c0_register(reg, sel, value) \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips32\n\t" \ + "mtc0\t%0,$%1,%2\n\t" \ + ".set\tpop" \ + : : "r" (value), "i" (reg), "i" (sel) ); + +#define read_c2_register(reg, sel) \ +({ unsigned int __rv; \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips32\n\t" \ + "mfc0\t%0,$%1,%2\n\t" \ + ".set\tpop" \ + : "=r" (__rv) : "i"(reg), "i" (sel) ); \ + __rv;}) + +/* + * We have 128 registers in C2 credit counters, reading them one at + * a time using bitmap will take a lot of code, so we have two functions + * to read registers sel0-3 and sel 4-7 into one 32 bit word. + */ + +#define read_cc_registers_0123(reg) \ +({ \ + unsigned int __rv; \ + \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set mips32\n\t" \ + ".set noreorder\n\t" \ + "mfc2 %0, $%1, 0\n\t" \ + "mfc2 $8, $%1, 1\n\t" \ + "sll %0, %0, 8\n\t" \ + "or %0, %0, $8\n\t" \ + "mfc2 $8, $%1, 2\n\t" \ + "sll %0, %0, 8\n\t" \ + "or %0, %0, $8\n\t" \ + "mfc2 $8, $%1, 3\n\t" \ + "sll %0, %0, 8\n\t" \ + "or %0, %0, $8\n\t" \ + ".set pop" \ + : "=r" (__rv) : "i"(reg) : "$8"); \ + \ + __rv; \ +}) + +#define read_cc_registers_4567(reg) \ +({ \ + unsigned int __rv; \ + \ + __asm__ __volatile__( \ + ".set push\n\t" \ + ".set mips32\n\t" \ + ".set noreorder\n\t" \ + "mfc2 %0, $%1, 4\n\t" \ + "mfc2 $8, $%1, 5\n\t" \ + "sll %0, %0, 8\n\t" \ + "or %0, %0, $8\n\t" \ + "mfc2 $8, $%1, 6\n\t" \ + "sll %0, %0, 8\n\t" \ + "or %0, %0, $8\n\t" \ + "mfc2 $8, $%1, 7\n\t" \ + "sll %0, %0, 8\n\t" \ + "or %0, %0, $8\n\t" \ + ".set pop" \ + : "=r" (__rv) :"i"(reg) : "$8"); \ + \ + __rv; \ +}) + +#endif +#endif diff --git a/sys/mips/rmi/pic.h b/sys/mips/rmi/pic.h new file mode 100644 index 000000000000..fd7ffc6b59d5 --- /dev/null +++ b/sys/mips/rmi/pic.h @@ -0,0 +1,284 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * __FBSDID("$FreeBSD$"); + * + * RMI_BSD */ +#ifndef _RMI_PIC_H_ +#define _RMI_PIC_H_ +#include + + + + +extern int rmi_spin_mutex_safe; + +#include +#include +#include + +#define PIC_IRT_WD_INDEX 0 +#define PIC_IRT_TIMER_0_INDEX 1 +#define PIC_IRT_TIMER_1_INDEX 2 +#define PIC_IRT_TIMER_2_INDEX 3 +#define PIC_IRT_TIMER_3_INDEX 4 +#define PIC_IRT_TIMER_4_INDEX 5 +#define PIC_IRT_TIMER_5_INDEX 6 +#define PIC_IRT_TIMER_6_INDEX 7 +#define PIC_IRT_TIMER_7_INDEX 8 +#define PIC_IRT_CLOCK_INDEX PIC_IRT_TIMER_7_INDEX +#define PIC_IRT_UART_0_INDEX 9 +#define PIC_IRT_UART_1_INDEX 10 +#define PIC_IRT_I2C_0_INDEX 11 +#define PIC_IRT_I2C_1_INDEX 12 +#define PIC_IRT_PCMCIA_INDEX 13 +#define PIC_IRT_GPIO_INDEX 14 +#define PIC_IRT_HYPER_INDEX 15 +#define PIC_IRT_PCIX_INDEX 16 +#define PIC_IRT_GMAC0_INDEX 17 +#define PIC_IRT_GMAC1_INDEX 18 +#define PIC_IRT_GMAC2_INDEX 19 +#define PIC_IRT_GMAC3_INDEX 20 +#define PIC_IRT_XGS0_INDEX 21 +#define PIC_IRT_XGS1_INDEX 22 +#define PIC_IRT_HYPER_FATAL_INDEX 23 +#define PIC_IRT_PCIX_FATAL_INDEX 24 +#define PIC_IRT_BRIDGE_AERR_INDEX 25 +#define PIC_IRT_BRIDGE_BERR_INDEX 26 +#define PIC_IRT_BRIDGE_TB_INDEX 27 +#define PIC_IRT_BRIDGE_AERR_NMI_INDEX 28 + +/* numbering for XLS */ +#define PIC_IRT_BRIDGE_ERR_INDEX 25 +#define PIC_IRT_PCIE_LINK0_INDEX 26 +#define PIC_IRT_PCIE_LINK1_INDEX 27 +#define PIC_IRT_PCIE_LINK2_INDEX 23 +#define PIC_IRT_PCIE_LINK3_INDEX 24 +#define PIC_IRT_PCIE_INT_INDEX 28 +#define PIC_IRT_PCIE_FATAL_INDEX 29 +#define PIC_IRT_GPIO_B_INDEX 30 +#define PIC_IRT_USB_INDEX 31 + +#define PIC_NUM_IRTS 32 + +#define PIC_SYS_TIMER_MAXVAL_0_BASE 0x100 +#define PIC_SYS_TIMER_MAXVAL_1_BASE 0x110 + +#define PIC_SYS_TIMER_0_BASE 0x120 +#define PIC_SYS_TIMER_1_BASE 0x130 + +#define PIC_CLOCK_TIMER 7 + +#define PIC_CTRL 0x00 +#define PIC_IPI 0x04 +#define PIC_INT_ACK 0x06 + +#define WD_MAX_VAL_0 0x08 +#define WD_MAX_VAL_1 0x09 +#define WD_MASK_0 0x0a +#define WD_MASK_1 0x0b +#define WD_HEARBEAT_0 0x0c +#define WD_HEARBEAT_1 0x0d + +#define PIC_IRT_0_BASE 0x40 +#define PIC_IRT_1_BASE 0x80 + +#define PIC_IRT_0_WD (PIC_IRT_0_BASE + PIC_IRT_WD_INDEX) +#define PIC_IRT_1_WD (PIC_IRT_1_BASE + PIC_IRT_WD_INDEX) +#define PIC_IRT_0_TIMER_0 (PIC_IRT_0_BASE + PIC_IRT_TIMER_0_INDEX) +#define PIC_IRT_1_TIMER_0 (PIC_IRT_1_BASE + PIC_IRT_TIMER_0_INDEX) +#define PIC_IRT_0_TIMER_1 (PIC_IRT_0_BASE + PIC_IRT_TIMER_1_INDEX) +#define PIC_IRT_1_TIMER_1 (PIC_IRT_1_BASE + PIC_IRT_TIMER_1_INDEX) +#define PIC_IRT_0_TIMER_2 (PIC_IRT_0_BASE + PIC_IRT_TIMER_2_INDEX) +#define PIC_IRT_1_TIMER_2 (PIC_IRT_1_BASE + PIC_IRT_TIMER_2_INDEX) +#define PIC_IRT_0_TIMER_3 (PIC_IRT_0_BASE + PIC_IRT_TIMER_3_INDEX) +#define PIC_IRT_1_TIMER_3 (PIC_IRT_1_BASE + PIC_IRT_TIMER_3_INDEX) +#define PIC_IRT_0_TIMER_4 (PIC_IRT_0_BASE + PIC_IRT_TIMER_4_INDEX) +#define PIC_IRT_1_TIMER_4 (PIC_IRT_1_BASE + PIC_IRT_TIMER_4_INDEX) +#define PIC_IRT_0_TIMER_5 (PIC_IRT_0_BASE + PIC_IRT_TIMER_5_INDEX) +#define PIC_IRT_1_TIMER_5 (PIC_IRT_1_BASE + PIC_IRT_TIMER_5_INDEX) +#define PIC_IRT_0_TIMER_6 (PIC_IRT_0_BASE + PIC_IRT_TIMER_6_INDEX) +#define PIC_IRT_1_TIMER_6 (PIC_IRT_1_BASE + PIC_IRT_TIMER_6_INDEX) +#define PIC_IRT_0_TIMER_7 (PIC_IRT_0_BASE + PIC_IRT_TIMER_7_INDEX) +#define PIC_IRT_1_TIMER_7 (PIC_IRT_1_BASE + PIC_IRT_TIMER_7_INDEX) +#define PIC_IRT_0_CLOCK (PIC_IRT_0_TIMER_7) +#define PIC_IRT_1_CLOCK (PIC_IRT_1_TIMER_7) +#define PIC_IRT_0_UART_0 (PIC_IRT_0_BASE + PIC_IRT_UART_0_INDEX) +#define PIC_IRT_1_UART_0 (PIC_IRT_1_BASE + PIC_IRT_UART_0_INDEX) +#define PIC_IRT_0_UART_1 (PIC_IRT_0_BASE + PIC_IRT_UART_1_INDEX) +#define PIC_IRT_1_UART_1 (PIC_IRT_1_BASE + PIC_IRT_UART_1_INDEX) +#define PIC_IRT_0_I2C_0 (PIC_IRT_0_BASE + PIC_IRT_I2C_0_INDEX) +#define PIC_IRT_1_I2C_0 (PIC_IRT_1_BASE + PIC_IRT_I2C_0_INDEX) +#define PIC_IRT_0_I2C_1 (PIC_IRT_0_BASE + PIC_IRT_I2C_1_INDEX) +#define PIC_IRT_1_I2C_1 (PIC_IRT_1_BASE + PIC_IRT_I2C_1_INDEX) +#define PIC_IRT_0_HYPER (PIC_IRT_0_BASE + PIC_IRT_HYPER_INDEX) +#define PIC_IRT_1_HYPER (PIC_IRT_1_BASE + PIC_IRT_HYPER_INDEX) +#define PIC_IRT_0_PCIX (PIC_IRT_0_BASE + PIC_IRT_PCIX_INDEX) +#define PIC_IRT_1_PCIX (PIC_IRT_1_BASE + PIC_IRT_PCIX_INDEX) + +#define PIC_TIMER_0_MAXVAL_0 (PIC_SYS_TIMER_MAXVAL_0_BASE + 0) +#define PIC_TIMER_0_MAXVAL_1 (PIC_SYS_TIMER_MAXVAL_1_BASE + 0) +#define PIC_TIMER_0_COUNTER_0 (PIC_SYS_TIMER_0_BASE + 0) +#define PIC_TIMER_0_COUNTER_1 (PIC_SYS_TIMER_1_BASE + 0) +#define PIC_TIMER_6_MAXVAL_0 (PIC_SYS_TIMER_MAXVAL_0_BASE + 6) +#define PIC_TIMER_6_MAXVAL_1 (PIC_SYS_TIMER_MAXVAL_1_BASE + 6) +#define PIC_TIMER_6_COUNTER_0 (PIC_SYS_TIMER_0_BASE + 6) +#define PIC_TIMER_6_COUNTER_1 (PIC_SYS_TIMER_1_BASE + 6) +#define PIC_TIMER_7_MAXVAL_0 (PIC_SYS_TIMER_MAXVAL_0_BASE + 7) +#define PIC_TIMER_7_MAXVAL_1 (PIC_SYS_TIMER_MAXVAL_1_BASE + 7) +#define PIC_TIMER_7_COUNTER_0 (PIC_SYS_TIMER_0_BASE + 7) +#define PIC_TIMER_7_COUNTER_1 (PIC_SYS_TIMER_1_BASE + 7) + +#define PIC_IRQ_BASE 8 +#define PIC_IRT_FIRST_IRQ PIC_IRQ_BASE +#define PIC_WD_IRQ (PIC_IRQ_BASE + PIC_IRT_WD_INDEX) +#define PIC_TIMER_0_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_0_INDEX) +#define PIC_TIMER_1_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_1_INDEX) +#define PIC_TIMER_2_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_2_INDEX) +#define PIC_TIMER_3_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_3_INDEX) +#define PIC_TIMER_4_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_4_INDEX) +#define PIC_TIMER_5_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_5_INDEX) +#define PIC_TIMER_6_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_6_INDEX) +#define PIC_TIMER_7_IRQ (PIC_IRQ_BASE + PIC_IRT_TIMER_7_INDEX) +#define PIC_CLOCK_IRQ (PIC_TIMER_7_IRQ) +#define PIC_UART_0_IRQ (PIC_IRQ_BASE + PIC_IRT_UART_0_INDEX) +#define PIC_UART_1_IRQ (PIC_IRQ_BASE + PIC_IRT_UART_1_INDEX) +#define PIC_I2C_0_IRQ (PIC_IRQ_BASE + PIC_IRT_I2C_0_INDEX) +#define PIC_I2C_1_IRQ (PIC_IRQ_BASE + PIC_IRT_I2C_1_INDEX) +#define PIC_PCMCIA_IRQ (PIC_IRQ_BASE + PIC_IRT_PCMCIA_INDEX) +#define PIC_GPIO_IRQ (PIC_IRQ_BASE + PIC_IRT_GPIO_INDEX) +#define PIC_HYPER_IRQ (PIC_IRQ_BASE + PIC_IRT_HYPER_INDEX) +#define PIC_PCIX_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIX_INDEX) +#define PIC_GMAC_0_IRQ (PIC_IRQ_BASE + PIC_IRT_GMAC0_INDEX) +#define PIC_GMAC_1_IRQ (PIC_IRQ_BASE + PIC_IRT_GMAC1_INDEX) +#define PIC_GMAC_2_IRQ (PIC_IRQ_BASE + PIC_IRT_GMAC2_INDEX) +#define PIC_GMAC_3_IRQ (PIC_IRQ_BASE + PIC_IRT_GMAC3_INDEX) +#define PIC_XGS_0_IRQ (PIC_IRQ_BASE + PIC_IRT_XGS0_INDEX) +#define PIC_XGS_1_IRQ (PIC_IRQ_BASE + PIC_IRT_XGS1_INDEX) +#define PIC_HYPER_FATAL_IRQ (PIC_IRQ_BASE + PIC_IRT_HYPER_FATAL_INDEX) +#define PIC_PCIX_FATAL_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIX_FATAL_INDEX) +#define PIC_BRIDGE_AERR_IRQ (PIC_IRQ_BASE + PIC_IRT_BRIDGE_AERR_INDEX) +#define PIC_BRIDGE_BERR_IRQ (PIC_IRQ_BASE + PIC_IRT_BRIDGE_BERR_INDEX) +#define PIC_BRIDGE_TB_IRQ (PIC_IRQ_BASE + PIC_IRT_BRIDGE_TB_INDEX) +#define PIC_BRIDGE_AERR_NMI_IRQ (PIC_IRQ_BASE + PIC_IRT_BRIDGE_AERR_NMI_INDEX) + +#define PIC_BRIDGE_ERR_IRQ (PIC_IRQ_BASE + PIC_IRT_BRIDGE_ERR_INDEX) +#define PIC_PCIE_LINK0_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIE_LINK0_INDEX) +#define PIC_PCIE_LINK1_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIE_LINK1_INDEX) +#define PIC_PCIE_LINK2_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIE_LINK2_INDEX) +#define PIC_PCIE_LINK3_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIE_LINK3_INDEX) +#define PIC_PCIE_INT_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIE_INT__INDEX) +#define PIC_PCIE_FATAL_IRQ (PIC_IRQ_BASE + PIC_IRT_PCIE_FATAL_INDEX) +#define PIC_GPIO_B_IRQ (PIC_IRQ_BASE + PIC_IRT_GPIO_B_INDEX) +#define PIC_USB_IRQ (PIC_IRQ_BASE + PIC_IRT_USB_INDEX) + +#define PIC_IRT_LAST_IRQ PIC_USB_IRQ + +#define PIC_IRQ_IS_EDGE_TRIGGERED(irq) ( ((irq)>=PIC_TIMER_0_IRQ) && ((irq)<=PIC_TIMER_7_IRQ) ) + +#define PIC_IRQ_IS_IRT(irq) ( ((irq)>=PIC_IRT_FIRST_IRQ) && ((irq)<=PIC_IRT_LAST_IRQ) ) + + +extern struct mtx xlr_pic_lock; + + +static __inline__ __uint32_t +pic_read_control(int haslock) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + __uint32_t reg; + + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_lock_spin(&xlr_pic_lock); + xlr_read_reg(mmio, PIC_CTRL); + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_unlock_spin(&xlr_pic_lock); + return reg; +} + +static __inline__ void +pic_write_control(__uint32_t control, int haslock) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_CTRL, control); + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_unlock_spin(&xlr_pic_lock); +} +static __inline__ void +pic_update_control(__uint32_t control, int haslock) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_CTRL, (control | xlr_read_reg(mmio, PIC_CTRL))); + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_unlock_spin(&xlr_pic_lock); +} + +static __inline__ void +pic_ack(int irq, int haslock) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + /* ack the pic, if needed */ + if (!PIC_IRQ_IS_IRT(irq)) + return; + + if (PIC_IRQ_IS_EDGE_TRIGGERED(irq)) { + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_INT_ACK, (1 << (irq - PIC_IRQ_BASE))); + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_unlock_spin(&xlr_pic_lock); + return; + } + return; +} + +static inline void +pic_delayed_ack(int irq, int haslock) +{ + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + + if (!PIC_IRQ_IS_IRT(irq)) + return; + + if (!PIC_IRQ_IS_EDGE_TRIGGERED(irq)) { + if ((rmi_spin_mutex_safe)&& (haslock == 0)) + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_INT_ACK, (1 << (irq - PIC_IRQ_BASE))); + if ((rmi_spin_mutex_safe) && (haslock == 0)) + mtx_unlock_spin(&xlr_pic_lock); + return; + } +} + +#endif /* _RMI_PIC_H_ */ diff --git a/sys/mips/rmi/rmi_mips_exts.h b/sys/mips/rmi/rmi_mips_exts.h new file mode 100644 index 000000000000..824381ac9062 --- /dev/null +++ b/sys/mips/rmi/rmi_mips_exts.h @@ -0,0 +1,144 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef __MIPS_EXTS_H__ +#define __MIPS_EXTS_H__ + +#define enable_KX(flags) __asm__ __volatile__ ( \ + ".set push\n" \ + ".set noat\n" \ + ".set noreorder\n" \ + "mfc0 %0, $12\n\t" \ + "ori $1, %0, 0x81\n\t" \ + "xori $1, 1\n\t" \ + "mtc0 $1, $12\n" \ + ".set pop\n" \ + : "=r"(flags) ) + +#define disable_KX(flags) __asm__ __volatile__ ( \ + ".set push\n" \ + "mtc0 %0, $12\n" \ + ".set pop\n" \ + : : "r"(flags) ) + +#define CPU_BLOCKID_IFU 0 +#define CPU_BLOCKID_ICU 1 +#define CPU_BLOCKID_IEU 2 +#define CPU_BLOCKID_LSU 3 +#define CPU_BLOCKID_MMU 4 +#define CPU_BLOCKID_PRF 5 + +#define LSU_CERRLOG_REGID 9 + +static __inline__ unsigned int read_32bit_phnx_ctrl_reg(int block, int reg) +{ + unsigned int __res; + + __asm__ __volatile__( + ".set\tpush\n\t" + ".set\tnoreorder\n\t" + "move $9, %1\n" + /* "mfcr\t$8, $9\n\t" */ + ".word 0x71280018\n" + "move %0, $8\n" + ".set\tpop" + : "=r" (__res) : "r"((block<<8)|reg) + : "$8", "$9" + ); + return __res; +} + +static __inline__ void write_32bit_phnx_ctrl_reg(int block, int reg, unsigned int value) +{ + __asm__ __volatile__( + ".set\tpush\n\t" + ".set\tnoreorder\n\t" + "move $8, %0\n" + "move $9, %1\n" + /* "mtcr\t$8, $9\n\t" */ + ".word 0x71280019\n" + ".set\tpop" + : + : "r" (value), "r"((block<<8)|reg) + : "$8", "$9" + ); +} + +static __inline__ unsigned long long read_64bit_phnx_ctrl_reg(int block, int reg) +{ + unsigned int high, low; + + __asm__ __volatile__( + ".set\tmips64\n\t" + "move $9, %2\n" + /* "mfcr $8, $9\n" */ + ".word 0x71280018\n" + "dsrl32 %0, $8, 0\n\t" + "dsll32 $8, $8, 0\n\t" + "dsrl32 %1, $8, 0\n\t" + ".set mips0" + : "=r" (high), "=r"(low) + : "r"((block<<8)|reg) + : "$8", "$9" + ); + + return ( (((unsigned long long)high)<<32) | low); +} + +static __inline__ void write_64bit_phnx_ctrl_reg(int block, int reg,unsigned long long value) +{ + __uint32_t low, high; + high = value >> 32; + low = value & 0xffffffff; + + __asm__ __volatile__( + ".set push\n" + ".set noreorder\n" + ".set mips4\n\t" + /* Set up "rs" */ + "move $9, %0\n" + + /* Store 64 bit value in "rt" */ + "dsll32 $10, %1, 0 \n\t" + "dsll32 $8, %2, 0 \n\t" + "dsrl32 $8, $8, 0 \n\t" + "or $10, $8, $8 \n\t" + + ".word 0x71280019\n" /* mtcr $8, $9 */ + + ".set pop\n" + + : /* No outputs */ + : "r"((block<<8)|reg), "r" (high), "r" (low) + : "$8", "$9", "$10" + ); +} + + +#endif diff --git a/sys/mips/rmi/rootfs_list.txt b/sys/mips/rmi/rootfs_list.txt new file mode 100644 index 000000000000..5cfd2e99a0bf --- /dev/null +++ b/sys/mips/rmi/rootfs_list.txt @@ -0,0 +1,676 @@ +# This is the list of files that +# should be in your rootfs (copy it from +# the build world nfsmount dir. When the rge0 +# driver gets fixed we should be able to start +# using nfs mount... for now we need to use MD_ROOT +./.cshrc +./.profile +./COPYRIGHT +./bin +./bin/cat +./bin/chflags +./bin/chio +./bin/chmod +./bin/cp +./bin/csh +./bin/tcsh +./bin/date +./bin/dd +./bin/df +./bin/domainname +./bin/echo +./bin/ed +./bin/red +./bin/expr +./bin/getfacl +./bin/hostname +./bin/kenv +./bin/kill +./bin/ln +./bin/link +./bin/ls +./bin/mkdir +./bin/mv +./bin/pax +./bin/pkill +./bin/pgrep +./bin/ps +./bin/pwd +./bin/rcp +./bin/realpath +./bin/rm +./bin/unlink +./bin/rmail +./bin/rmdir +./bin/setfacl +./bin/sh +./bin/sleep +./bin/stty +./bin/sync +./bin/test +./bin/[ +./bin/uuidgen +./etc +./etc/bluetooth +./etc/bluetooth/hcsecd.conf +./etc/bluetooth/hosts +./etc/bluetooth/protocols +./etc/defaults +./etc/defaults/bluetooth.device.conf +./etc/defaults/devfs.rules +./etc/defaults/periodic.conf +./etc/defaults/rc.conf +./etc/devd +./etc/devd/asus.conf +./etc/gnats +./etc/gnats/freefall +./etc/gss +./etc/gss/mech +./etc/gss/qop +./etc/mail +./etc/mail/mailer.conf +./etc/mail/freebsd.mc +./etc/mail/freebsd.cf +./etc/mail/freebsd.submit.mc +./etc/mail/freebsd.submit.cf +./etc/mail/helpfile +./etc/mail/sendmail.cf +./etc/mail/submit.cf +./etc/mail/Makefile +./etc/mail/README +./etc/mail/access.sample +./etc/mail/virtusertable.sample +./etc/mail/mailertable.sample +./etc/mail/aliases +./etc/mtree +./etc/mtree/BSD.include.dist +./etc/mtree/BSD.root.dist +./etc/mtree/BSD.usr.dist +./etc/mtree/BSD.var.dist +./etc/mtree/BSD.sendmail.dist +./etc/mtree/BIND.chroot.dist +./etc/pam.d +./etc/pam.d/README +./etc/pam.d/atrun +./etc/pam.d/cron +./etc/pam.d/ftpd +./etc/pam.d/imap +./etc/pam.d/kde +./etc/pam.d/login +./etc/pam.d/other +./etc/pam.d/passwd +./etc/pam.d/pop3 +./etc/pam.d/rsh +./etc/pam.d/sshd +./etc/pam.d/su +./etc/pam.d/system +./etc/pam.d/telnetd +./etc/pam.d/xdm +./etc/pam.d/ftp +./etc/periodic +./etc/periodic/daily +./etc/periodic/daily/100.clean-disks +./etc/periodic/daily/110.clean-tmps +./etc/periodic/daily/120.clean-preserve +./etc/periodic/daily/200.backup-passwd +./etc/periodic/daily/330.news +./etc/periodic/daily/400.status-disks +./etc/periodic/daily/404.status-zfs +./etc/periodic/daily/405.status-ata-raid +./etc/periodic/daily/406.status-gmirror +./etc/periodic/daily/407.status-graid3 +./etc/periodic/daily/408.status-gstripe +./etc/periodic/daily/409.status-gconcat +./etc/periodic/daily/420.status-network +./etc/periodic/daily/450.status-security +./etc/periodic/daily/999.local +./etc/periodic/daily/310.accounting +./etc/periodic/daily/470.status-named +./etc/periodic/daily/300.calendar +./etc/periodic/daily/130.clean-msgs +./etc/periodic/daily/480.status-ntpd +./etc/periodic/daily/140.clean-rwho +./etc/periodic/daily/430.status-rwho +./etc/periodic/daily/150.clean-hoststat +./etc/periodic/daily/210.backup-aliases +./etc/periodic/daily/440.status-mailq +./etc/periodic/daily/460.status-mail-rejects +./etc/periodic/daily/500.queuerun +./etc/periodic/monthly +./etc/periodic/monthly/999.local +./etc/periodic/monthly/200.accounting +./etc/periodic/security +./etc/periodic/security/100.chksetuid +./etc/periodic/security/200.chkmounts +./etc/periodic/security/300.chkuid0 +./etc/periodic/security/400.passwdless +./etc/periodic/security/410.logincheck +./etc/periodic/security/700.kernelmsg +./etc/periodic/security/800.loginfail +./etc/periodic/security/900.tcpwrap +./etc/periodic/security/security.functions +./etc/periodic/security/510.ipfdenied +./etc/periodic/security/500.ipfwdenied +./etc/periodic/security/550.ipfwlimit +./etc/periodic/security/520.pfdenied +./etc/periodic/weekly +./etc/periodic/weekly/340.noid +./etc/periodic/weekly/999.local +./etc/periodic/weekly/310.locate +./etc/periodic/weekly/320.whatis +./etc/periodic/weekly/330.catman +./etc/periodic/weekly/400.status-pkg +./etc/ppp +./etc/ppp/ppp.conf +./etc/rc.d +./etc/rc.d/DAEMON +./etc/rc.d/FILESYSTEMS +./etc/rc.d/LOGIN +./etc/rc.d/NETWORKING +./etc/rc.d/SERVERS +./etc/rc.d/abi +./etc/rc.d/accounting +./etc/rc.d/addswap +./etc/rc.d/adjkerntz +./etc/rc.d/amd +./etc/rc.d/apm +./etc/rc.d/apmd +./etc/rc.d/archdep +./etc/rc.d/atm1 +./etc/rc.d/atm2 +./etc/rc.d/atm3 +./etc/rc.d/auditd +./etc/rc.d/bgfsck +./etc/rc.d/bluetooth +./etc/rc.d/bootparams +./etc/rc.d/bridge +./etc/rc.d/bthidd +./etc/rc.d/ccd +./etc/rc.d/cleanvar +./etc/rc.d/cleartmp +./etc/rc.d/cron +./etc/rc.d/ddb +./etc/rc.d/defaultroute +./etc/rc.d/devd +./etc/rc.d/devfs +./etc/rc.d/dhclient +./etc/rc.d/dmesg +./etc/rc.d/dumpon +./etc/rc.d/encswap +./etc/rc.d/faith +./etc/rc.d/fsck +./etc/rc.d/ftp-proxy +./etc/rc.d/ftpd +./etc/rc.d/gbde +./etc/rc.d/geli +./etc/rc.d/geli2 +./etc/rc.d/gssd +./etc/rc.d/hcsecd +./etc/rc.d/hostapd +./etc/rc.d/hostid +./etc/rc.d/hostid_save +./etc/rc.d/hostname +./etc/rc.d/inetd +./etc/rc.d/initrandom +./etc/rc.d/ip6addrctl +./etc/rc.d/ip6fw +./etc/rc.d/ipfilter +./etc/rc.d/ipfs +./etc/rc.d/ipfw +./etc/rc.d/ipmon +./etc/rc.d/ipnat +./etc/rc.d/ipsec +./etc/rc.d/ipxrouted +./etc/rc.d/jail +./etc/rc.d/kadmind +./etc/rc.d/kerberos +./etc/rc.d/keyserv +./etc/rc.d/kldxref +./etc/rc.d/kpasswdd +./etc/rc.d/ldconfig +./etc/rc.d/local +./etc/rc.d/localpkg +./etc/rc.d/lockd +./etc/rc.d/lpd +./etc/rc.d/mixer +./etc/rc.d/motd +./etc/rc.d/mountcritlocal +./etc/rc.d/mountcritremote +./etc/rc.d/mountlate +./etc/rc.d/mdconfig +./etc/rc.d/mdconfig2 +./etc/rc.d/mountd +./etc/rc.d/moused +./etc/rc.d/mroute6d +./etc/rc.d/mrouted +./etc/rc.d/msgs +./etc/rc.d/named +./etc/rc.d/natd +./etc/rc.d/netif +./etc/rc.d/netoptions +./etc/rc.d/newsyslog +./etc/rc.d/pf +./etc/rc.d/nfscbd +./etc/rc.d/nfsclient +./etc/rc.d/nfsd +./etc/rc.d/nfsserver +./etc/rc.d/nfsuserd +./etc/rc.d/nisdomain +./etc/rc.d/nsswitch +./etc/rc.d/ntpd +./etc/rc.d/ntpdate +./etc/rc.d/othermta +./etc/rc.d/pflog +./etc/rc.d/pfsync +./etc/rc.d/powerd +./etc/rc.d/power_profile +./etc/rc.d/ppp +./etc/rc.d/pppoed +./etc/rc.d/pwcheck +./etc/rc.d/quota +./etc/rc.d/random +./etc/rc.d/rarpd +./etc/rc.d/resolv +./etc/rc.d/rfcomm_pppd_server +./etc/rc.d/root +./etc/rc.d/route6d +./etc/rc.d/routed +./etc/rc.d/routing +./etc/rc.d/rpcbind +./etc/rc.d/rtadvd +./etc/rc.d/rwho +./etc/rc.d/savecore +./etc/rc.d/sdpd +./etc/rc.d/securelevel +./etc/rc.d/sendmail +./etc/rc.d/serial +./etc/rc.d/sppp +./etc/rc.d/statd +./etc/rc.d/static_arp +./etc/rc.d/stf +./etc/rc.d/swap1 +./etc/rc.d/syscons +./etc/rc.d/sysctl +./etc/rc.d/syslogd +./etc/rc.d/timed +./etc/rc.d/tmp +./etc/rc.d/ugidfw +./etc/rc.d/var +./etc/rc.d/virecover +./etc/rc.d/watchdogd +./etc/rc.d/wpa_supplicant +./etc/rc.d/ypbind +./etc/rc.d/yppasswdd +./etc/rc.d/ypserv +./etc/rc.d/ypset +./etc/rc.d/ypupdated +./etc/rc.d/ypxfrd +./etc/rc.d/zfs +./etc/rc.d/zvol +./etc/rc.d/sshd +./etc/rc.d/nscd +./etc/security +./etc/security/audit_class +./etc/security/audit_event +./etc/security/audit_control +./etc/security/audit_user +./etc/security/audit_warn +./etc/ssh +./etc/ssh/ssh_config +./etc/ssh/sshd_config +./etc/ssh/moduli +./etc/ssl +./etc/ssl/openssl.cnf +./etc/auth.conf +./etc/crontab +./etc/devd.conf +./etc/devfs.conf +./etc/ddb.conf +./etc/dhclient.conf +./etc/disktab +./etc/fbtab +./etc/ftpusers +./etc/gettytab +./etc/group +./etc/hosts +./etc/hosts.allow +./etc/hosts.equiv +./etc/inetd.conf +./etc/libalias.conf +./etc/login.access +./etc/login.conf +./etc/mac.conf +./etc/motd +./etc/netconfig +./etc/network.subr +./etc/networks +./etc/newsyslog.conf +./etc/nsswitch.conf +./etc/phones +./etc/profile +./etc/protocols +./etc/rc +./etc/rc.bsdextended +./etc/rc.firewall +./etc/rc.firewall6 +./etc/rc.initdiskless +./etc/rc.sendmail +./etc/rc.shutdown +./etc/rc.subr +./etc/remote +./etc/rpc +./etc/services +./etc/shells +./etc/sysctl.conf +./etc/syslog.conf +./etc/ttys +./etc/amd.map +./etc/apmd.conf +./etc/freebsd-update.conf +./etc/locate.rc +./etc/hosts.lpd +./etc/printcap +./etc/mail.rc +./etc/manpath.config +./etc/ntp.conf +./etc/nscd.conf +./etc/portsnap.conf +./etc/pf.os +./etc/csh.cshrc +./etc/csh.login +./etc/csh.logout +./etc/regdomain.xml +./etc/login.conf.db +./etc/pwd.db +./etc/netstart +./etc/pccard_ether +./etc/rc.suspend +./etc/rc.resume +./etc/master.passwd +./etc/nsmb.conf +./etc/opieaccess +./etc/spwd.db +./etc/passwd +./etc/dumpdates +./etc/fstab +./etc/rc.conf +./etc/resolv.conf +./etc/termcap +./lib +./lib/geom +./lib/geom/geom_cache.so +./lib/geom/geom_concat.so +./lib/geom/geom_eli.so +./lib/geom/geom_journal.so +./lib/geom/geom_label.so +./lib/geom/geom_mirror.so +./lib/geom/geom_multipath.so +./lib/geom/geom_nop.so +./lib/geom/geom_part.so +./lib/geom/geom_raid3.so +./lib/geom/geom_shsec.so +./lib/geom/geom_stripe.so +./lib/geom/geom_virstor.so +./lib/libc.so.7 +./lib/libcrypt.so.5 +./lib/libkvm.so.5 +./lib/libm.so.5 +./lib/libmd.so.5 +./lib/libncurses.so.8 +./lib/libncursesw.so.8 +./lib/libsbuf.so.5 +./lib/libutil.so.8 +./lib/libalias.so.7 +./lib/libalias_cuseeme.so +./lib/libalias_dummy.so +./lib/libalias_ftp.so +./lib/libalias_irc.so +./lib/libalias_nbt.so +./lib/libalias_pptp.so +./lib/libalias_skinny.so +./lib/libalias_smedia.so +./lib/libbegemot.so.4 +./lib/libcam.so.5 +./lib/libdevstat.so.7 +./lib/libedit.so.7 +./lib/libbsdxml.so.4 +./lib/libgeom.so.5 +./lib/libipsec.so.4 +./lib/libipx.so.5 +./lib/libjail.so.1 +./lib/libkiconv.so.4 +./lib/libpcap.so.7 +./lib/libthr.so.3 +./lib/libufs.so.5 +./lib/libz.so.5 +./lib/libgcc_s.so.1 +./lib/libreadline.so.8 +./lib/libssp.so.0 +./lib/libcrypto.so.6 +./libexec +./libexec/ld-elf.so.1 +./libexec/ld-elf.so.1.old +./sbin +./sbin/adjkerntz +./sbin/atacontrol +./sbin/badsect +./sbin/bsdlabel +./sbin/camcontrol +./sbin/ccdconfig +./sbin/clri +./sbin/comcontrol +./sbin/conscontrol +./sbin/devd +./sbin/devfs +./sbin/dhclient +./sbin/dhclient-script +./sbin/dmesg +./sbin/dump +./sbin/rdump +./sbin/dumpfs +./sbin/dumpon +./sbin/fdisk +./sbin/ffsinfo +./sbin/fsck +./sbin/fsck_ffs +./sbin/fsck_ufs +./sbin/fsck_4.2bsd +./sbin/fsdb +./sbin/fsirand +./sbin/gbde +./sbin/fsck_msdosfs +./sbin/geom +./sbin/gcache +./sbin/gconcat +./sbin/geli +./sbin/gjournal +./sbin/glabel +./sbin/gmirror +./sbin/gmultipath +./sbin/gnop +./sbin/gpart +./sbin/graid3 +./sbin/gshsec +./sbin/gstripe +./sbin/gvirstor +./sbin/ggatec +./sbin/ggated +./sbin/ggatel +./sbin/growfs +./sbin/gvinum +./sbin/ifconfig +./sbin/init +./sbin/ipf +./sbin/ipfs +./sbin/ipfstat +./sbin/ipftest +./sbin/ipmon +./sbin/ipnat +./sbin/ippool +./sbin/md5 +./sbin/ipfw +./sbin/ipresend +./sbin/iscontrol +./sbin/kldconfig +./sbin/kldload +./sbin/kldstat +./sbin/kldunload +./sbin/ldconfig +./sbin/rmd160 +./sbin/sha1 +./sbin/sha256 +./sbin/mdconfig +./sbin/mdmfs +./sbin/mount_mfs +./sbin/mknod +./sbin/mksnap_ffs +./sbin/mount +./sbin/mount_cd9660 +./sbin/mount_msdosfs +./sbin/mount_nfs +./sbin/mount_newnfs +./sbin/mount_ntfs +./sbin/mount_nullfs +./sbin/mount_udf +./sbin/mount_unionfs +./sbin/natd +./sbin/ddb +./sbin/newfs +./sbin/newfs_msdos +./sbin/nfsiod +./sbin/nos-tun +./sbin/pfctl +./sbin/pflogd +./sbin/ping +./sbin/ping6 +./sbin/quotacheck +./sbin/rcorder +./sbin/reboot +./sbin/nextboot +./sbin/halt +./sbin/fastboot +./sbin/fasthalt +./sbin/recoverdisk +./sbin/restore +./sbin/rrestore +./sbin/route +./sbin/routed +./sbin/rtquery +./sbin/rtsol +./sbin/savecore +./sbin/setkey +./sbin/shutdown +./sbin/spppcontrol +./sbin/swapon +./sbin/swapoff +./sbin/swapctl +./sbin/sysctl +./sbin/tunefs +./sbin/umount +./sbin/init.bak +./var +./var/crash +./var/crash/minfree +./var/db +./var/db/locate.database +./var/log +./var/log/sendmail.st +./var/named +./var/named/etc +./var/named/etc/namedb +./var/named/etc/namedb/master +./var/named/etc/namedb/master/empty.db +./var/named/etc/namedb/master/localhost-forward.db +./var/named/etc/namedb/master/localhost-reverse.db +./var/named/etc/namedb/named.conf +./var/named/etc/namedb/named.root +./var/yp +./var/yp/Makefile.dist +./var/run +./var/cron +./var/cron/tabs +./root +./root/.k5login +./root/.profile +./root/.cshrc +./root/.login +./list +./dev +./usr +./usr/sbin +./usr/sbin/newsyslog +./usr/sbin/syslogd +./usr/sbin/ip6addrctl +./usr/sbin/sendmail +./usr/sbin/cron +./usr/lib +./usr/lib/libpam.so.5 +./usr/lib/libpam.so +./usr/lib/pam_opie.so.5 +./usr/lib/libbsm.so.3 +./usr/lib/libbsm.so +./usr/lib/pam_chroot.so.5 +./usr/lib/pam_tacplus.so.5 +./usr/lib/pam_ssh.so.5 +./usr/lib/pam_self.so.5 +./usr/lib/pam_securetty.so.5 +./usr/lib/pam_rootok.so.5 +./usr/lib/pam_rhosts.so.5 +./usr/lib/pam_radius.so.5 +./usr/lib/pam_permit.so.5 +./usr/lib/pam_passwdqc.so.5 +./usr/lib/libcom_err.so.5 +./usr/lib/libcom_err.so +./usr/lib/pam_opieaccess.so.5 +./usr/lib/pam_nologin.so.5 +./usr/lib/libc.so.7 +./usr/lib/pam_login_access.so.5 +./usr/lib/pam_lastlog.so.5 +./usr/lib/pam_ksu.so.5 +./usr/lib/pam_krb5.so.5 +./usr/lib/pam_guest.so.5 +./usr/lib/pam_group.so.5 +./usr/lib/pam_ftpusers.so.5 +./usr/lib/pam_exec.so.5 +./usr/lib/pam_echo.so.5 +./usr/lib/pam_deny.so.5 +./usr/lib/pam_unix.so.5 +./usr/lib/pam_chroot.so +./usr/lib/libopie.so +./usr/lib/pam_deny.so +./usr/lib/pam_echo.so +./usr/lib/pam_exec.so +./usr/lib/pam_ftpusers.so +./usr/lib/pam_group.so +./usr/lib/pam_guest.so +./usr/lib/pam_krb5.so +./usr/lib/pam_ksu.so +./usr/lib/pam_lastlog.so +./usr/lib/pam_login_access.so +./usr/lib/pam_nologin.so +./usr/lib/pam_opie.so +./usr/lib/pam_opieaccess.so +./usr/lib/pam_passwdqc.so +./usr/lib/pam_permit.so +./usr/lib/pam_radius.so +./usr/lib/pam_rhosts.so +./usr/lib/pam_rootok.so +./usr/lib/pam_securetty.so +./usr/lib/pam_self.so +./usr/lib/pam_ssh.so +./usr/lib/pam_tacplus.so +./usr/lib/pam_unix.so +./usr/lib/libmd.so.5 +./usr/lib/libbz2.so.4 +./usr/lib/libgnuregex.so.5 +./usr/lib/libypclnt.so.4 +./usr/bin +./usr/bin/mktemp +./usr/bin/login +./usr/bin/uname +./usr/bin/awk +./usr/bin/logger +./usr/bin/grep +./usr/bin/ftp +./usr/libexec +./usr/libexec/getty diff --git a/sys/mips/rmi/shared_structs.h b/sys/mips/rmi/shared_structs.h new file mode 100755 index 000000000000..6e5ecd43ceae --- /dev/null +++ b/sys/mips/rmi/shared_structs.h @@ -0,0 +1,110 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef _SHARED_STRUCTS_H +#define _SHARED_STRUCTS_H + +/* If you make any changes to the below structs, shared_structs_offsets.h + * should be regenerated + */ +#define BOOT1_INFO_VERSION 0x0001 + +struct boot1_info { + uint64_t boot_level; + uint64_t io_base; + uint64_t output_device; + uint64_t uart_print; + uint64_t led_output; + uint64_t init; + uint64_t exit; + uint64_t warm_reset; + uint64_t wakeup; + uint64_t cpu_online_map; + uint64_t master_reentry_sp; + uint64_t master_reentry_gp; + uint64_t master_reentry_fn; + uint64_t slave_reentry_fn; + uint64_t magic_dword; + uint64_t uart_putchar; + uint64_t size; + uint64_t uart_getchar; + uint64_t nmi_handler; + uint64_t psb_version; + uint64_t mac_addr; + uint64_t cpu_frequency; + uint64_t board_version; + uint64_t malloc; + uint64_t free; + uint64_t alloc_pbuf; + uint64_t free_pbuf; + uint64_t psb_os_cpu_map; + uint64_t userapp_cpu_map; + uint64_t wakeup_os; + uint64_t psb_mem_map; + uint64_t board_major_version; + uint64_t board_minor_version; + uint64_t board_manf_revision; + uint64_t board_serial_number; + uint64_t psb_physaddr_map; +}; + +extern struct boot1_info xlr_boot1_info; + + +/* This structure is passed to all applications launched from the linux + loader through K0 register + */ +#define XLR_LOADER_INFO_MAGIC 0x600ddeed +struct xlr_loader_info { + uint32_t magic; + /* xlr_loader_shared_struct_t for CPU 0 will start here */ + unsigned long sh_mem_start; + /* Size of the shared memory b/w linux apps and rmios apps */ + uint32_t app_sh_mem_size; +}; + +/* Boot loader uses the linux mips convention */ +#define BOOT1_MEMMAP_MAX 32 + +enum xlr_phys_memmap_t { + BOOT1_MEM_RAM = 1, BOOT1_MEM_ROM_DATA, BOOT1_MEM_RESERVED +}; + +struct xlr_boot1_mem_map { + uint32_t num_entries; + struct { + uint64_t addr; + uint64_t size; + uint32_t type; + uint32_t pad; + } physmem_map[BOOT1_MEMMAP_MAX]; +}; + + +#endif diff --git a/sys/mips/rmi/shared_structs_func.h b/sys/mips/rmi/shared_structs_func.h new file mode 100755 index 000000000000..be9641408353 --- /dev/null +++ b/sys/mips/rmi/shared_structs_func.h @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +/* DO NOT EDIT THIS FILE + * This file has been autogenerated by ./gen_struct_offsets + */ +#ifndef _SHARED_STRUCTS_FUNC_H +#define _SHARED_STRUCTS_FUNC_H + +/* struct boot1_info function prototypes */ +#define boot1_info_uart_print_func(info_ptr, ...) ((void (*)(const char *, ...))(unsigned long)(info_ptr->uart_print))( __VA_ARGS__ ) +#define boot1_info_led_output_func(info_ptr, ...) ((void (*)(int))(unsigned long)(info_ptr->led_output))( __VA_ARGS__ ) +#define boot1_info_init_func(info_ptr, ...) ((void (*)(void))(unsigned long)(info_ptr->init))( __VA_ARGS__ ) +#define boot1_info_exit_func(info_ptr, ...) ((void (*)(void))(unsigned long)(info_ptr->exit))( __VA_ARGS__ ) +#define boot1_info_warm_reset_func(info_ptr, ...) ((void (*)(void))(unsigned long)(info_ptr->warm_reset))( __VA_ARGS__ ) +#define boot1_info_wakeup_func(info_ptr, ...) ((int (*)(void *, void *, unsigned int))(unsigned long)(info_ptr->wakeup))( __VA_ARGS__ ) +#define boot1_info_master_reentry_fn_func(info_ptr, ...) ((void (*)(void *))(unsigned long)(info_ptr->master_reentry_fn))( __VA_ARGS__ ) +#define boot1_info_slave_reentry_fn_func(info_ptr, ...) ((void (*)(void *))(unsigned long)(info_ptr->slave_reentry_fn))( __VA_ARGS__ ) +#define boot1_info_uart_putchar_func(info_ptr, ...) ((void (*)(char))(unsigned long)(info_ptr->uart_putchar))( __VA_ARGS__ ) +#define boot1_info_uart_getchar_func(info_ptr, ...) ((char (*)(void))(unsigned long)(info_ptr->uart_getchar))( __VA_ARGS__ ) +#define boot1_info_malloc_func(info_ptr, ...) ((void *(*)(size_t))(unsigned long)(info_ptr->malloc))( __VA_ARGS__ ) +#define boot1_info_free_func(info_ptr, ...) ((void (*)(void *))(unsigned long)(info_ptr->free))( __VA_ARGS__ ) +#define boot1_info_alloc_pbuf_func(info_ptr, ...) ((struct packet *(*)(void))(unsigned long)(info_ptr->alloc_pbuf))( __VA_ARGS__ ) +#define boot1_info_free_pbuf_func(info_ptr, ...) ((void (*)(struct packet *))(unsigned long)(info_ptr->free_pbuf))( __VA_ARGS__ ) +#define boot1_info_wakeup_os_func(info_ptr, ...) ((int (*)(void *, void *, unsigned int))(unsigned long)(info_ptr->wakeup_os))( __VA_ARGS__ ) + + +#endif diff --git a/sys/mips/rmi/shared_structs_offsets.h b/sys/mips/rmi/shared_structs_offsets.h new file mode 100755 index 000000000000..605c735356cc --- /dev/null +++ b/sys/mips/rmi/shared_structs_offsets.h @@ -0,0 +1,76 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +/* DO NOT EDIT THIS FILE + * This file has been autogenerated by ./gen_struct_offsets + */ +#ifndef _SHARED_STRUCTS_OFFSETS_H +#define _SHARED_STRUCTS_OFFSETS_H + +/* struct boot1_info offsets */ +#define boot1_info_boot_level_off 0 +#define boot1_info_io_base_off 8 +#define boot1_info_output_device_off 16 +#define boot1_info_uart_print_off 24 +#define boot1_info_led_output_off 32 +#define boot1_info_init_off 40 +#define boot1_info_exit_off 48 +#define boot1_info_warm_reset_off 56 +#define boot1_info_wakeup_off 64 +#define boot1_info_cpu_online_map_off 72 +#define boot1_info_master_reentry_sp_off 80 +#define boot1_info_master_reentry_gp_off 88 +#define boot1_info_master_reentry_fn_off 96 +#define boot1_info_slave_reentry_fn_off 104 +#define boot1_info_magic_dword_off 112 +#define boot1_info_uart_putchar_off 120 +#define boot1_info_size_off 128 +#define boot1_info_uart_getchar_off 136 +#define boot1_info_nmi_handler_off 144 +#define boot1_info_psb_version_off 152 +#define boot1_info_mac_addr_off 160 +#define boot1_info_cpu_frequency_off 168 +#define boot1_info_board_version_off 176 +#define boot1_info_malloc_off 184 +#define boot1_info_free_off 192 +#define boot1_info_alloc_pbuf_off 200 +#define boot1_info_free_pbuf_off 208 +#define boot1_info_psb_os_cpu_map_off 216 +#define boot1_info_userapp_cpu_map_off 224 +#define boot1_info_wakeup_os_off 232 +#define boot1_info_psb_mem_map_off 240 + +/* struct boot1_info size */ +#define boot1_info_size 248 + +/* boot1_info version */ +#define boot1_info_version 1 + + +#endif diff --git a/sys/mips/rmi/std.xlr b/sys/mips/rmi/std.xlr new file mode 100644 index 000000000000..c6221b95f68d --- /dev/null +++ b/sys/mips/rmi/std.xlr @@ -0,0 +1,10 @@ +# $FreeBSD$ +files "../rmi/files.xlr" + +# +# XXXMIPS: It's a stub, isn't it? +# +cpu CPU_MIPS4KC +option NOFPU +# Kludge for now +options TARGET_XLR_XLS diff --git a/sys/mips/rmi/tick.c b/sys/mips/rmi/tick.c new file mode 100644 index 000000000000..aaeb0e94d603 --- /dev/null +++ b/sys/mips/rmi/tick.c @@ -0,0 +1,113 @@ +/*- + * Copyright (c) 2006-2009 RMI Corporation + * Copyright (c) 2006 Bruce M. Simpson + * 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. + */ + +/* + * Simple driver for the 32-bit interval counter built in to all + * MIPS32 CPUs. + * XXX: For calibration this either needs an external clock, or + * to be explicitly told what the frequency is. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +struct timecounter counter_timecounter = { + platform_get_timecount, /* get_timecount */ + 0, /* no poll_pps */ + ~0u, /* counter_mask */ + 0, /* frequency */ + "MIPS32", /* name */ + 800, /* quality (adjusted in code) */ +}; + +void tick_init(void); + + +void +tick_init(void) +{ + counter_freq = platform_get_frequency(); + if (bootverbose) + printf("MIPS32 clock: %u MHz", cpu_clock); + + counter_timecounter.tc_frequency = counter_freq; + tc_init(&counter_timecounter); +} + + +void +cpu_startprofclock(void) +{ + /* nothing to do */ +} + +void +cpu_stopprofclock(void) +{ + /* nothing to do */ +} + + +static int +sysctl_machdep_counter_freq(SYSCTL_HANDLER_ARGS) +{ + int error; + uint64_t freq; + + /* + * RRS wonders if this will really work. You don't change the req of + * the system here, it would require changes to the RMI PIC in order + * to get the TC to run at a differrent frequency. + */ + + if (counter_timecounter.tc_frequency == 0) + return (EOPNOTSUPP); + freq = counter_freq; + error = sysctl_handle_int(oidp, &freq, sizeof(freq), req); + if (error == 0 && req->newptr != NULL) { + counter_freq = freq; + counter_timecounter.tc_frequency = counter_freq; + } + return (error); +} + +SYSCTL_PROC(_machdep, OID_AUTO, counter_freq, CTLTYPE_QUAD | CTLFLAG_RW, + 0, sizeof(u_int), sysctl_machdep_counter_freq, "IU", ""); diff --git a/sys/mips/rmi/uart_bus_xlr_iodi.c b/sys/mips/rmi/uart_bus_xlr_iodi.c new file mode 100644 index 000000000000..8b87262f7426 --- /dev/null +++ b/sys/mips/rmi/uart_bus_xlr_iodi.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2006 Raza Microelectronics + * 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 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static int uart_iodi_probe(device_t dev); + +static device_method_t uart_iodi_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, uart_iodi_probe), + DEVMETHOD(device_attach, uart_bus_attach), + DEVMETHOD(device_detach, uart_bus_detach), + {0, 0} +}; + +static driver_t uart_iodi_driver = { + uart_driver_name, + uart_iodi_methods, + sizeof(struct uart_softc), +}; + + +extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs; +static int +uart_iodi_probe(device_t dev) +{ + struct uart_softc *sc; + sc = device_get_softc(dev); + sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs); + sc->sc_class = &uart_ns8250_class; + bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); + sc->sc_sysdev->bas.bst = rmi_bus_space; + sc->sc_sysdev->bas.bsh = MIPS_PHYS_TO_KSEG1(XLR_UART0ADDR); + sc->sc_bas.bst = rmi_bus_space; + sc->sc_bas.bsh = MIPS_PHYS_TO_KSEG1(XLR_UART0ADDR); + /* regshft = 2, rclk = 66000000, rid = 0, chan = 0 */ + return (uart_bus_probe(dev, 2, 66000000, 0, 0)); +} + +DRIVER_MODULE(uart, iodi, uart_iodi_driver, uart_devclass, 0, 0); diff --git a/sys/mips/rmi/uart_cpu_mips_xlr.c b/sys/mips/rmi/uart_cpu_mips_xlr.c new file mode 100644 index 000000000000..816dec2a2608 --- /dev/null +++ b/sys/mips/rmi/uart_cpu_mips_xlr.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2006 Wojciech A. Koszek + * 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. + * + * $Id: uart_cpu_mips_xlr.c,v 1.5 2008-07-16 20:22:39 jayachandranc Exp $ + */ +/* + * Skeleton of this file was based on respective code for ARM + * code written by Olivier Houchard. + */ +/* + * XLRMIPS: This file is hacked from arm/... + */ +#include "opt_uart.h" + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +bus_space_tag_t uart_bus_space_io; +bus_space_tag_t uart_bus_space_mem; + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + + +int +uart_cpu_getdev(int devtype, struct uart_devinfo *di) +{ + di->ops = uart_getops(&uart_ns8250_class); + di->bas.chan = 0; + di->bas.bst = rmi_bus_space; + di->bas.bsh = MIPS_PHYS_TO_KSEG1(XLR_UART0ADDR); + + di->bas.regshft = 2; + /* divisor = rclk / (baudrate * 16); */ + di->bas.rclk = 66000000; + di->baudrate = 0; + di->databits = 8; + di->stopbits = 1; + di->parity = UART_PARITY_NONE; + + uart_bus_space_io = NULL; + uart_bus_space_mem = rmi_bus_space; + return (0); +} diff --git a/sys/mips/rmi/xlr_boot1_console.c b/sys/mips/rmi/xlr_boot1_console.c new file mode 100644 index 000000000000..88cefcfa52db --- /dev/null +++ b/sys/mips/rmi/xlr_boot1_console.c @@ -0,0 +1,113 @@ +/*- + * Copyright (c) 2006 Wojciech A. Koszek + * 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. + * + * $Id: xlr_boot1_console.c,v 1.6 2008-07-16 20:22:49 jayachandranc Exp $ + */ +/* + * Adapted for XLR bootloader + * RMi + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_comconsole.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#if 0 +static cn_probe_t xlr_boot1_cnprobe; +static cn_init_t xlr_boot1_cninit; +static cn_term_t xlr_boot1_cnterm; +static cn_getc_t xlr_boot1_cngetc; +static cn_checkc_t xlr_boot1_cncheckc; +static cn_putc_t xlr_boot1_cnputc; + +CONS_DRIVER(xlrboot, xlr_boot1_cnprobe, xlr_boot1_cninit, xlr_boot1_cnterm, xlr_boot1_cngetc, + xlr_boot1_cncheckc, xlr_boot1_cnputc, NULL); + +/* + * Device gets probed. Firmwire should be checked here probably. + */ +static void +xlr_boot1_cnprobe(struct consdev *cp) +{ + cp->cn_pri = CN_NORMAL; + cp->cn_tp = NULL; + cp->cn_arg = NULL; /* softc */ + cp->cn_unit = -1; /* ? */ + cp->cn_flags = 0; +} + +/* + * Initialization. + */ +static void +xlr_boot1_cninit(struct consdev *cp) +{ + sprintf(cp->cn_name, "boot1"); +} + +static void +xlr_boot1_cnterm(struct consdev *cp) +{ + cp->cn_pri = CN_DEAD; + cp->cn_flags = 0; + return; +} + +static int +xlr_boot1_cngetc(struct consdev *cp) +{ + return boot1_info_uart_getchar_func(&xlr_boot1_info); +} + +static void +xlr_boot1_cnputc(struct consdev *cp, int c) +{ + boot1_info_uart_putchar_func(&xlr_boot1_info, c); +} + +static int +xlr_boot1_cncheckc(struct consdev *cp) +{ + return 0; +} + +#endif diff --git a/sys/mips/rmi/xlr_csum_nocopy.S b/sys/mips/rmi/xlr_csum_nocopy.S new file mode 100644 index 000000000000..8b51a7f10f1c --- /dev/null +++ b/sys/mips/rmi/xlr_csum_nocopy.S @@ -0,0 +1,217 @@ +#include + + +/* + * a0: source address + * a1: length of the area to checksum + * a2: partial checksum + * a3: dst + */ + +#define src a0 +#define dst a3 +#define sum v0 + + .text + .set noreorder + + .macro CSUM_BIGCHUNK_AND_COPY offset + pref 0, (\offset+0x0)(a0) + ld t0, (\offset+0x00)(a0) + ld t1, (\offset+0x08)(a0) + .word 0x70481038 /*daddwc v0, v0, t0 */ + .word 0x70491038 /*daddwc v0, v0, t1 */ + ld t0, (\offset + 0x10)(a0) + ld t1, (\offset + 0x18)(a0) + .word 0x70481038 /* daddwc v0, v0, t0 */ + .word 0x70491038 /*daddwc v0, v0, t1 */ + .endm + +small_csumcpy: /* unknown src alignment and < 8 bytes to go */ + move a1, t2 + + andi t0, a1, 4 + beqz t0, 1f + andi t0, a1, 2 + + ulw t1, (src) /* Still a full word to go */ + daddiu src, 4 + .word 0x70491038 /*daddwc v0, v0, t1 */ + +1: move t1, zero + beqz t0, 1f + andi t0, a1, 1 + + ulhu t1, (src) /* Still a halfword to go */ + daddiu src, 2 + +1: beqz t0, 1f + sll t1, t1, 16 + + lbu t2, (src) + nop + +#ifdef __MIPSEB__ + sll t2, t2, 8 +#endif + or t1, t2 + +1: .word 0x70491038 /*daddwc v0, v0, t1 */ + + .word 0x70461038 /*daddwc v0, v0, a2 */ + .word 0x70401038 /*daddwc v0, v0, $0 */ + + /* Ideally at this point of time the status flag must be cleared */ + + dsll32 v1, sum, 0 + .word 0x70431038 /*daddwc v0, v0, v1 */ + dsrl32 sum, sum, 0 + .word 0x70401038 /*daddwc v0, v0, zero */ + + /* fold the checksum */ + sll v1, sum, 16 + addu sum, v1 + sltu v1, sum, v1 + srl sum, sum, 16 + addu sum, v1 +1: + .set reorder + jr ra + .set noreorder + +/* ------------------------------------------------------------------ */ + + .align 5 +LEAF(xlr_csum_partial_nocopy) + move sum, zero + move t7, zero + + sltiu t8, a1, 0x8 + bnez t8, small_csumcpy /* < 8 bytes to copy */ + move t2, a1 + + beqz a1, out + andi t7, src, 0x1 /* odd buffer? */ + +hword_align: + beqz t7, word_align + andi t8, src, 0x2 + + lbu t0, (src) + dsubu a1, a1, 0x1 + .word 0x70481038 /*daddwc v0, v0, t0 */ + daddu src, src, 0x1 + andi t8, src, 0x2 + +word_align: + beqz t8, dword_align + sltiu t8, a1, 56 + + lhu t0, (src) + dsubu a1, a1, 0x2 + .word 0x70481038 /*daddwc v0, v0, t0 */ + sltiu t8, a1, 56 + daddu src, src, 0x2 + +dword_align: + bnez t8, do_end_words + move t8, a1 + + andi t8, src, 0x4 + beqz t8, qword_align + andi t8, src, 0x8 + + lw t0, 0x00(src) + dsubu a1, a1, 0x4 + .word 0x70481038 /*daddwc v0, v0, t0 */ + daddu src, src, 0x4 + andi t8, src, 0x8 + +qword_align: + beqz t8, oword_align + andi t8, src, 0x10 + + ld t0, 0x00(src) + dsubu a1, a1, 0x8 + .word 0x70481038 /*daddwc v0, v0, t0 */ + daddu src, src, 0x8 + andi t8, src, 0x10 + +oword_align: + beqz t8, begin_movement + dsrl t8, a1, 0x7 + + ld t3, 0x08(src) + ld t0, 0x00(src) + .word 0x704b1038 /*daddwc v0, v0, t3 */ + .word 0x70481038 /*daddwc v0, v0, t0 */ + dsubu a1, a1, 0x10 + daddu src, src, 0x10 + dsrl t8, a1, 0x7 + +begin_movement: + beqz t8, 1f + andi t2, a1, 0x40 + +move_128bytes: + pref 0, 0x20(a0) + pref 0, 0x40(a0) + pref 0, 0x60(a0) + CSUM_BIGCHUNK_AND_COPY(0x00) + CSUM_BIGCHUNK_AND_COPY(0x20) + CSUM_BIGCHUNK_AND_COPY(0x40) + CSUM_BIGCHUNK_AND_COPY(0x60) + dsubu t8, t8, 0x01 + bnez t8, move_128bytes /* flag */ + daddu src, src, 0x80 + +1: + beqz t2, 1f + andi t2, a1, 0x20 + +move_64bytes: + pref 0, 0x20(a0) + pref 0, 0x40(a0) + CSUM_BIGCHUNK_AND_COPY(0x00) + CSUM_BIGCHUNK_AND_COPY(0x20) + daddu src, src, 0x40 + +1: + beqz t2, do_end_words + andi t8, a1, 0x1c + +move_32bytes: + pref 0, 0x20(a0) + CSUM_BIGCHUNK_AND_COPY(0x00) + andi t8, a1, 0x1c + daddu src, src, 0x20 + +do_end_words: + beqz t8, maybe_end_cruft + dsrl t8, t8, 0x2 + +end_words: + lw t0, (src) + dsubu t8, t8, 0x1 + .word 0x70481038 /*daddwc v0, v0, t0 */ + bnez t8, end_words + daddu src, src, 0x4 + +maybe_end_cruft: + andi t2, a1, 0x3 + +small_memcpy: + j small_csumcpy; move a1, t2 + beqz t2, out + move a1, t2 + +end_bytes: + lb t0, (src) + dsubu a1, a1, 0x1 + bnez a2, end_bytes + daddu src, src, 0x1 + +out: + jr ra + move v0, sum + END(xlr_csum_partial_nocopy) diff --git a/sys/mips/rmi/xlr_i2c.c b/sys/mips/rmi/xlr_i2c.c new file mode 100644 index 000000000000..abd9439e2e8c --- /dev/null +++ b/sys/mips/rmi/xlr_i2c.c @@ -0,0 +1,455 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * I2C driver for the Palm-BK3220 I2C Host adapter on the RMI XLR. + */ + +#include +#include +#include +#include +#include +#include + + +#include +#include + +#include +#include + +#include "iicbus_if.h" + +#define DEVTOIICBUS(dev) ((struct iicbus_device*)device_get_ivars(dev)) + +#define I2C_PALM_CFG 0x00 +#define I2C_PALM_CLKDIV 0x01 +#define I2C_PALM_DEVADDR 0x02 +#define I2C_PALM_ADDR 0x03 +#define I2C_PALM_DATAOUT 0x04 +#define I2C_PALM_DATAIN 0x05 +#define I2C_PALM_STATUS 0x06 +#define I2C_PALM_STARTXFR 0x07 +#define I2C_PALM_BYTECNT 0x08 +#define I2C_PALM_HDSTATIM 0x09 + +/* TEST Values!! Change as required */ +#define I2C_PALM_CFG_DEF 0x000000F8 /* 8-Bit Addr + POR Values */ +#define I2C_PALM_CLKDIV_DEF 0x14A //0x00000052 +#define I2C_PALM_HDSTATIM_DEF 0x107 //0x00000000 + +#define I2C_PALM_STARTXFR_RD 0x00000001 +#define I2C_PALM_STARTXFR_WR 0x00000000 + + +#define PHOENIX_IO_I2C_0_OFFSET 0x16000 +#define PHOENIX_IO_I2C_1_OFFSET 0x17000 + +#define ARIZONA_I2c_BUS 1 + +int bus = 1; + + +uint8_t current_slave; +uint8_t read_address; +static xlr_reg_t *iobase_i2c_regs; + +static devclass_t xlr_i2c_devclass; + +/* + * Device methods + */ +static int xlr_i2c_probe(device_t); +static int xlr_i2c_attach(device_t); +static int xlr_i2c_detach(device_t); + +static int xlr_i2c_start(device_t dev, u_char slave, int timeout); +static int xlr_i2c_stop(device_t dev); +static int xlr_i2c_read(device_t dev, char *buf, int len, int *read, int last, int delay); +static int xlr_i2c_write(device_t dev, char *buf, int len, int *sent, int timeout); + + +struct xlr_i2c_softc { + device_t dev; /* Myself */ + struct resource *mem_res; /* Memory resource */ + volatile int flags; +#define RXRDY 4 +#define TXRDY 0x10 + int sc_started; + int twi_addr; + device_t iicbus; +}; + + +#define MDELAY(a){ \ + unsigned long local_loop = 0xfffff; \ + while(local_loop--); \ +}\ + +static void +get_i2c_base(void) +{ + if (bus == 0) + iobase_i2c_regs = xlr_io_mmio(PHOENIX_IO_I2C_0_OFFSET); + else + iobase_i2c_regs = xlr_io_mmio(PHOENIX_IO_I2C_1_OFFSET); + return; +} + +static void +palm_write(int reg, int value) +{ + get_i2c_base(); + xlr_write_reg(iobase_i2c_regs, reg, value); + return; +} + + +static int +palm_read(int reg) +{ + uint32_t val; + + get_i2c_base(); + val = xlr_read_reg(iobase_i2c_regs, reg); + return ((int)val); +} + +static int +palm_addr_only(uint8_t addr, uint8_t offset) +{ + volatile uint32_t regVal = 0x00; + + palm_write(I2C_PALM_ADDR, offset); + palm_write(I2C_PALM_DEVADDR, addr); + palm_write(I2C_PALM_CFG, 0xfa); + palm_write(I2C_PALM_STARTXFR, 0x02); + regVal = palm_read(I2C_PALM_STATUS); + if (regVal & 0x0008) { + printf("palm_addr_only: ACKERR. Aborting...\n"); + return -1; + } + return 0; +} + + +static int +palm_rx(uint8_t addr, uint8_t offset, uint8_t len, + uint8_t * buf) +{ + volatile uint32_t regVal = 0x00, ctr = 0x00; + int timeOut, numBytes = 0x00; + + palm_write(I2C_PALM_CFG, 0xfa); + palm_write(I2C_PALM_BYTECNT, len); + palm_write(I2C_PALM_DEVADDR, addr); + //DEVADDR = 0x4c, 0x68 + MDELAY(1); + + for (numBytes = 0x00; numBytes < len; numBytes++) { + palm_write(I2C_PALM_ADDR, offset + numBytes); +//I2C_PALM_ADDR:offset + MDELAY(1); + if (!ctr) { + /* Trigger a READ Transaction */ + palm_write(I2C_PALM_STARTXFR, I2C_PALM_STARTXFR_RD); + ctr++; + } + /* Error Conditions [Begin] */ + regVal = palm_read(I2C_PALM_STATUS); + MDELAY(1); + if (regVal & 0x0008) { + printf("palm_rx: ACKERR. Aborting...\n"); + return -1; + } + timeOut = 10; + while ((regVal & 0x0030) && timeOut--) { + palm_write(I2C_PALM_STARTXFR, I2C_PALM_STARTXFR_RD); + regVal = palm_read(I2C_PALM_STATUS); + } + if (timeOut == 0x00) { + printf("palm_rx: TimedOut on Valid STARTXFR/Arbitration\n"); + return -1; + } + timeOut = 10; + /* Do we have valid data from the device yet..? */ + regVal &= 0x0004; + while (!regVal && timeOut--) { + regVal = palm_read(I2C_PALM_STATUS) & 0x0004; + } + if (timeOut == 0x00) { + printf("palm_rx: TimedOut Waiting for Valid Data\n"); + return -1; + } + /* Error Conditions [End] */ + /* Read the data */ + buf[numBytes] = (uint8_t) palm_read(I2C_PALM_DATAIN); + } + return 0; +} + + + +static int +wait_for_idle(void) +{ + int timeOut = 0x1000; + volatile uint32_t regVal = 0x00; + + regVal = palm_read(I2C_PALM_STATUS) & 0x0001; + while (regVal && timeOut--) { + regVal = palm_read(I2C_PALM_STATUS) & 0x0001; + } + if (timeOut == 0x00) + return -1; /* Timed Out */ + else + return 0; +} + + +static int +palm_tx(uint8_t addr, uint8_t offset, uint8_t * buf, uint8_t len) +{ + volatile uint32_t regVal = 0x00; + int timeOut, ctr = 0x00, numBytes = len; + + for (ctr = 0x00; ctr < len; ctr++) { + if (wait_for_idle() < 0) { + printf("TimedOut on Waiting for I2C Bus Idle.\n"); + return -EIO; + } + palm_write(I2C_PALM_CFG, 0xF8); + palm_write(I2C_PALM_BYTECNT, 0x00); + palm_write(I2C_PALM_DEVADDR, addr); + //0x4c, 0x68 + palm_write(I2C_PALM_ADDR, offset + numBytes - 1); + //offset + palm_write(I2C_PALM_DATAOUT, buf[ctr]); + palm_write(I2C_PALM_STARTXFR, I2C_PALM_STARTXFR_WR); + MDELAY(1); + + regVal = palm_read(I2C_PALM_STATUS); + MDELAY(1); + if (regVal & 0x0008) { + printf("palm_tx: ACKERR. Aborting...\n"); + return -1; + } + timeOut = 0x1000; + while (!(regVal & 0x0002) && timeOut) { + regVal = palm_read(I2C_PALM_STATUS); + timeOut--; + } + if (timeOut == 0x00) { + printf("palm_tx: [TimeOut] SDOEMPTY Not Set\n"); + return -1; + } + timeOut = 1000; + while ((regVal & 0x0030) && timeOut) { + palm_write(I2C_PALM_STARTXFR, I2C_PALM_STARTXFR_WR); + regVal = palm_read(I2C_PALM_STATUS); + timeOut--; + } + if (timeOut == 0x00) { + printf("palm_rx: TimedOut on Valid STARTXFR/Arbitration\n"); + return -1; + } + numBytes--; + } + return 0; +} + + + + + +static int +xlr_i2c_probe(device_t dev) +{ + device_set_desc(dev, "I2C bus controller"); + + return (0); +} + + +/* + * We add all the devices which we know about. + * The generic attach routine will attach them if they are alive. + */ +static int +xlr_i2c_attach(device_t dev) +{ + struct xlr_i2c_softc *sc; + int rid; + + sc = device_get_softc(dev); + sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (sc->mem_res == NULL) { + printf("not able to allocate the bus resource\n"); + } + if ((sc->iicbus = device_add_child(dev, "iicbus", -1)) == NULL) + printf("could not allocate iicbus instance\n"); + + bus_generic_attach(dev); + + return (0); +} + +static int +xlr_i2c_detach(device_t dev) +{ + bus_generic_detach(dev); + + return (0); +} + +/* +static int +xlr_i2c_add_child(device_t dev, int order, const char *name, int unit) +{ + printf("********* %s ******** \n", __FUNCTION__); + device_add_child_ordered(dev, order, name, unit); + + bus_generic_attach(dev); + + return (0); +} +*/ + +static int +xlr_i2c_start(device_t dev, u_char slave, int timeout) +{ + int error = 0; + struct xlr_i2c_softc *sc; + + sc = device_get_softc(dev); + sc->sc_started = 1; + + current_slave = (slave >> 1); + return error; + +} + +static int +xlr_i2c_stop(device_t dev) +{ + int error = 0; + + return error; + +} + +static int +xlr_i2c_read(device_t dev, char *buf, int len, int *read, int last, + int delay) +{ + int error = 0; + + if (palm_addr_only(current_slave, read_address) == -1) { + printf("I2C ADDRONLY Phase Fail.\n"); + return -1; + } + if (palm_rx(current_slave, read_address, len, buf) == -1) { + printf("I2C Read Fail.\n"); + return -1; + } + *read = len; + return error; + +} + + +static int +xlr_i2c_write(device_t dev, char *buf, int len, int *sent, int timeout /* us */ ) +{ + + int error = 0; + uint8_t write_address; + + if (len == 1) { + /* address for the next read */ + read_address = buf[0]; + return error; + } + if (len < 2) + return (-1); + + write_address = buf[0]; + + /* + * for write operation, buf[0] contains the register offset and + * buf[1] onwards contains the value + */ + palm_tx(current_slave, write_address, &buf[1], len - 1); + + return error; + +} + +static int +xlr_i2c_callback(device_t dev, int index, caddr_t *data) +{ + return 0; +} + +static int +xlr_i2c_repeated_start(device_t dev, u_char slave, int timeout) +{ + return 0; +} + + +static device_method_t xlr_i2c_methods[] = { + /* device interface */ + DEVMETHOD(device_probe, xlr_i2c_probe), + DEVMETHOD(device_attach, xlr_i2c_attach), + DEVMETHOD(device_detach, xlr_i2c_detach), + + /* iicbus interface */ + DEVMETHOD(iicbus_callback, xlr_i2c_callback), + DEVMETHOD(iicbus_repeated_start, xlr_i2c_repeated_start), + DEVMETHOD(iicbus_start, xlr_i2c_start), + DEVMETHOD(iicbus_stop, xlr_i2c_stop), + DEVMETHOD(iicbus_write, xlr_i2c_write), + DEVMETHOD(iicbus_read, xlr_i2c_read), + {0, 0} +}; + +static driver_t xlr_i2c_driver = { + "xlr_i2c", + xlr_i2c_methods, + sizeof(struct xlr_i2c_softc), +}; + +DRIVER_MODULE(xlr_i2c, iodi, xlr_i2c_driver, xlr_i2c_devclass, 0, 0); diff --git a/sys/mips/rmi/xlr_machdep.c b/sys/mips/rmi/xlr_machdep.c new file mode 100644 index 000000000000..f66c1b0d9e7c --- /dev/null +++ b/sys/mips/rmi/xlr_machdep.c @@ -0,0 +1,725 @@ +/*- + * Copyright (c) 2006-2009 RMI Corporation + * Copyright (c) 2002-2004 Juli Mallett + * 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. + * + */ +#include +__FBSDID("$FreeBSD$"); + +#include "opt_ddb.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include /* cinit() */ +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifdef XLR_PERFMON +#include +#endif + + + +void platform_prep_smp_launch(void); + +unsigned long xlr_io_base = (unsigned long)(DEFAULT_XLR_IO_BASE); + +/* 4KB static data aread to keep a copy of the bootload env until + the dynamic kenv is setup */ +char boot1_env[4096]; +extern unsigned long _gp; +int rmi_spin_mutex_safe=0; +/* + * Parameters from boot loader + */ +struct boot1_info xlr_boot1_info; +struct xlr_loader_info xlr_loader_info; /* FIXME : Unused */ +int xlr_run_mode; +int xlr_argc; +char **xlr_argv, **xlr_envp; +uint64_t cpu_mask_info; +uint32_t xlr_online_cpumask; + +#ifdef SMP +static unsigned long xlr_secondary_gp[MAXCPU]; +static unsigned long xlr_secondary_sp[MAXCPU]; + +#endif +extern int mips_cpu_online_mask; +extern int mips_cpu_logical_mask; +uint32_t cpu_ltop_map[MAXCPU]; +uint32_t cpu_ptol_map[MAXCPU]; +uint32_t xlr_core_cpu_mask = 0x1; /* Core 0 thread 0 is always there */ + +void +platform_reset(void) +{ + /* FIXME : use proper define */ + u_int32_t *mmio = (u_int32_t *) 0xbef18000; + + printf("Rebooting the system now\n"); + mmio[8] = 0x1; +} + +void +platform_secondary_init(void) +{ +#ifdef SMP + xlr_msgring_cpu_init(); + + /* Setup interrupts for secondary CPUs here */ + mips_mask_hard_irq(IPI_SMP_CALL_FUNCTION); + mips_mask_hard_irq(IPI_STOP); + mips_mask_hard_irq(IPI_RENDEZVOUS); + mips_mask_hard_irq(IPI_AST); + mips_mask_hard_irq(IRQ_TIMER); +#ifdef XLR_PERFMON + mips_mask_hard_irq(IPI_PERFMON); +#endif + + return; +#endif +} + + +int xlr_asid_pcpu = 256; /* This the default */ +int xlr_shtlb_enabled = 0; + +/* This function sets up the number of tlb entries available + to the kernel based on the number of threads brought up. + The ASID range also gets divided similarly. + THE NUMBER OF THREADS BROUGHT UP IN EACH CORE MUST BE THE SAME +NOTE: This function will mark all 64TLB entries as available +to the threads brought up in the core. If kernel is brought with say mask +0x33333333, no TLBs will be available to the threads in each core. +*/ +static void +setup_tlb_resource(void) +{ + int mmu_setup; + int value = 0; + uint32_t cpu_map = xlr_boot1_info.cpu_online_map; + uint32_t thr_mask = cpu_map >> (xlr_cpu_id() << 2); + uint8_t core0 = xlr_boot1_info.cpu_online_map & 0xf; + uint8_t core_thr_mask; + int i = 0, count = 0; + + /* If CPU0 did not enable shared TLB, other cores need to follow */ + if ((xlr_cpu_id() != 0) && (xlr_shtlb_enabled == 0)) + return; + /* First check if each core is brought up with the same mask */ + for (i = 1; i < 8; i++) { + core_thr_mask = cpu_map >> (i << 2); + core_thr_mask &= 0xf; + if (core_thr_mask && core_thr_mask != core0) { + printf + ("Each core must be brought with same cpu mask\n"); + printf("Cannot enabled shared TLB. "); + printf("Falling back to split TLB mode\n"); + return; + } + } + + xlr_shtlb_enabled = 1; + for (i = 0; i < 4; i++) + if (thr_mask & (1 << i)) + count++; + switch (count) { + case 1: + xlr_asid_pcpu = 256; + break; + case 2: + xlr_asid_pcpu = 128; + value = 0x2; + break; + default: + xlr_asid_pcpu = 64; + value = 0x3; + break; + } + + mmu_setup = read_32bit_phnx_ctrl_reg(4, 0); + mmu_setup = mmu_setup & ~0x06; + mmu_setup |= (value << 1); + + /* turn on global mode */ + mmu_setup |= 0x01; + + write_32bit_phnx_ctrl_reg(4, 0, mmu_setup); + +} + +/* + * Platform specific register setup for CPUs + * XLR has control registers accessible with MFCR/MTCR instructions, this + * code initialized them from the environment variable xlr.cr of form: + * xlr.cr=reg:val[,reg:val]*, all values in hex. + * To enable shared TLB option use xlr.shtlb=1 + */ +void +platform_cpu_init() +{ + char *hw_env; + char *start, *end; + uint32_t reg, val; + int thr_id = xlr_thr_id(); + + if (thr_id == 0) { + if ((hw_env = getenv("xlr.shtlb")) != NULL) { + start = hw_env; + reg = strtoul(start, &end, 16); + if (start != end && reg != 0) + setup_tlb_resource(); + } else { + /* By default TLB entries are shared in a core */ + setup_tlb_resource(); + } + } + if ((hw_env = getenv("xlr.cr")) == NULL) + return; + + start = hw_env; + while (*start != '\0') { + reg = strtoul(start, &end, 16); + if (start == end) { + printf("Invalid value in xlr.cr %s, cannot read a hex value at %d\n", + hw_env, start - hw_env); + goto err_return; + } + if (*end != ':') { + printf("Invalid format in xlr.cr %s, ':' expected at pos %d\n", + hw_env, end - hw_env); + goto err_return; + } + start = end + 1;/* step over ':' */ + val = strtoul(start, &end, 16); + if (start == end) { + printf("Invalid value in xlr.cr %s, cannot read a hex value at pos %d\n", + hw_env, start - hw_env); + goto err_return; + } + if (*end != ',' && *end != '\0') { + printf("Invalid format in xlr.cr %s, ',' expected at pos %d\n", + hw_env, end - hw_env); + goto err_return; + } + xlr_mtcr(reg, val); + if (*end == ',') + start = end + 1; /* skip over ',' */ + else + start = end; + } + freeenv(hw_env); + return; + +err_return: + panic("Invalid xlr.cr setting!"); + return; +} + + +#ifdef SMP +extern void xlr_secondary_start(unsigned long, unsigned long, unsigned long); +static void +xlr_secondary_entry(void *data) +{ + unsigned long sp, gp; + unsigned int cpu = (xlr_cpu_id() << 2) + xlr_thr_id(); + + sp = xlr_secondary_sp[cpu]; + gp = xlr_secondary_gp[cpu]; + + xlr_secondary_start((unsigned long)mips_secondary_wait, sp, gp); +} + +#endif + +static void +xlr_set_boot_flags(void) +{ + char *p; + + for (p = getenv("boot_flags"); p && *p != '\0'; p++) { + switch (*p) { + case 'd': + case 'D': + boothowto |= RB_KDB; + break; + case 'g': + case 'G': + boothowto |= RB_GDB; + break; + case 'v': + case 'V': + boothowto |= RB_VERBOSE; + break; + + case 's': /* single-user (default, supported for sanity) */ + case 'S': + boothowto |= RB_SINGLE; + break; + + default: + printf("Unrecognized boot flag '%c'.\n", *p); + break; + } + } + + if (p) + freeenv(p); + + return; +} +extern uint32_t _end; + + +static void +mips_init(void) +{ + init_param1(); + init_param2(physmem); + + /* XXX: Catch 22. Something touches the tlb. */ + + mips_cpu_init(); + pmap_bootstrap(); +#ifdef DDB +#ifdef SMP + setup_nmi(); +#endif /* SMP */ + kdb_init(); + if (boothowto & RB_KDB) { + kdb_enter("Boot flags requested debugger", NULL); + } +#endif + mips_proc0_init(); + write_c0_register32(MIPS_COP_0_OSSCRATCH, 7, pcpup->pc_curthread); + mutex_init(); +} + +void +platform_start(__register_t a0 __unused, + __register_t a1 __unused, + __register_t a2 __unused, + __register_t a3 __unused) +{ + vm_size_t physsz = 0; + int i, j; + struct xlr_boot1_mem_map *boot_map; +#ifdef SMP + uint32_t tmp; + void (*wakeup) (void *, void *, unsigned int); + +#endif + /* XXX no zeroing of BSS? */ + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + + /* XXX FIXME the code below is not 64 bit clean */ + /* Save boot loader and other stuff from scratch regs */ + xlr_boot1_info = *(struct boot1_info *)read_c0_register32(MIPS_COP_0_OSSCRATCH, 0); + cpu_mask_info = read_c0_register64(MIPS_COP_0_OSSCRATCH, 1); + xlr_online_cpumask = read_c0_register32(MIPS_COP_0_OSSCRATCH, 2); + xlr_run_mode = read_c0_register32(MIPS_COP_0_OSSCRATCH, 3); + xlr_argc = read_c0_register32(MIPS_COP_0_OSSCRATCH, 4); + xlr_argv = (char **)read_c0_register32(MIPS_COP_0_OSSCRATCH, 5); + xlr_envp = (char **)read_c0_register32(MIPS_COP_0_OSSCRATCH, 6); + + /* TODO: Verify the magic number here */ + /* FIXMELATER: xlr_boot1_info.magic_number */ + + /* initialize console so that we have printf */ + boothowto |= (RB_SERIAL | RB_MULTIPLE); /* Use multiple consoles */ + + /* clockrate used by delay, so initialize it here */ + cpu_clock = xlr_boot1_info.cpu_frequency / 1000000; + + /* + * Note the time counter on CPU0 runs not at system clock speed, but + * at PIC time counter speed (which is returned by + * platform_get_frequency(). Thus we do not use + * xlr_boot1_info.cpu_frequency here. + */ + mips_timer_early_init(platform_get_frequency()); + + /* Init the time counter in the PIC and local putc routine*/ + rmi_early_counter_init(); + + /* Init console please */ + cninit(); + init_static_kenv(boot1_env, sizeof(boot1_env)); + printf("Environment (from %d args):\n", xlr_argc - 1); + if (xlr_argc == 1) + printf("\tNone\n"); + for (i = 1; i < xlr_argc; i++) { + char *n; + + printf("\t%s\n", xlr_argv[i]); + n = strsep(&xlr_argv[i], "="); + if (xlr_argv[i] == NULL) + setenv(n, "1"); + else + setenv(n, xlr_argv[i]); + } + + xlr_set_boot_flags(); + + /* get physical memory info from boot loader */ + boot_map = (struct xlr_boot1_mem_map *) + (unsigned long)xlr_boot1_info.psb_mem_map; + for (i = 0, j = 0; i < boot_map->num_entries; i++, j += 2) { + if (boot_map->physmem_map[i].type == BOOT1_MEM_RAM) { + if (j == 14) { + printf("*** ERROR *** memory map too large ***\n"); + break; + } + if (j == 0) { + /* TODO FIXME */ + /* start after kernel end */ + phys_avail[0] = (vm_paddr_t) + MIPS_KSEG0_TO_PHYS(&_end) + 0x20000; + /* boot loader start */ + /* HACK to Use bootloaders memory region */ + /* TODO FIXME */ + if (boot_map->physmem_map[0].size == 0x0c000000) { + boot_map->physmem_map[0].size = 0x0ff00000; + } + phys_avail[1] = boot_map->physmem_map[0].addr + + boot_map->physmem_map[0].size; + printf("First segment: addr:%p -> %p \n", + (void *)phys_avail[0], + (void *)phys_avail[1]); + + } else { +/* + * Can't use this code yet, because most of the fixed allocations happen from + * the biggest physical area. If we have more than 512M memory the kernel will try + * to map from the second are which is not in KSEG0 and not mapped + */ + phys_avail[j] = (vm_paddr_t) + boot_map->physmem_map[i].addr; + phys_avail[j + 1] = phys_avail[j] + + boot_map->physmem_map[i].size; + if (phys_avail[j + 1] < phys_avail[j] ) { + /* Houston we have an issue. Memory is + * larger than possible. Its probably in + * 64 bit > 4Gig and we are in 32 bit mode. + */ + phys_avail[j + 1] = 0xfffff000; + printf("boot map size was %llx\n", boot_map->physmem_map[i].size); + boot_map->physmem_map[i].size = phys_avail[j + 1] - phys_avail[j]; + printf("reduced to %llx\n", boot_map->physmem_map[i].size); + } + printf("Next segment : addr:%p -> %p \n", + (void *)phys_avail[j], + (void *)phys_avail[j+1]); + } + physsz += boot_map->physmem_map[i].size; + } + } + + /* FIXME XLR TODO */ + phys_avail[j] = phys_avail[j + 1] = 0; + realmem = physmem = btoc(physsz); + + /* Store pcpu in scratch 5 */ + write_c0_register32(MIPS_COP_0_OSSCRATCH, 5, pcpup); + + /* Set up hz, among others. */ + mips_init(); + +#ifdef SMP + /* + * If thread 0 of any core is not available then mark whole core as + * not available + */ + tmp = xlr_boot1_info.cpu_online_map; + for (i = 4; i < MAXCPU; i += 4) { + if ((tmp & (0xf << i)) && !(tmp & (0x1 << i))) { + /* + * Oopps.. thread 0 is not available. Disable whole + * core + */ + tmp = tmp & ~(0xf << i); + printf("WARNING: Core %d is disabled because thread 0" + " of this core is not enabled.\n", i / 4); + } + } + xlr_boot1_info.cpu_online_map = tmp; + + /* Wakeup Other cpus, and put them in bsd park code. */ + for (i = 1, j = 1; i < 32; i++) { + /* Allocate stack for all other cpus from fbsd kseg0 memory. */ + if ((1U << i) & xlr_boot1_info.cpu_online_map) { + xlr_secondary_gp[i] = + pmap_steal_memory(PAGE_SIZE); + if (!xlr_secondary_gp[i]) + panic("Allocation failed for secondary cpu stacks"); + xlr_secondary_sp[i] = + xlr_secondary_gp[i] + PAGE_SIZE - CALLFRAME_SIZ; + xlr_secondary_gp[i] = (unsigned long)&_gp; + /* Build ltop and ptol cpu map. */ + cpu_ltop_map[j] = i; + cpu_ptol_map[i] = j; + if ((i & 0x3) == 0) /* store thread0 of each core */ + xlr_core_cpu_mask |= (1 << j); + mips_cpu_logical_mask |= (1 << j); + j++; + } + } + + mips_cpu_online_mask |= xlr_boot1_info.cpu_online_map; + wakeup = ((void (*) (void *, void *, unsigned int)) + (unsigned long)(xlr_boot1_info.wakeup)); + printf("Waking up CPUs 0x%llx.\n", xlr_boot1_info.cpu_online_map & ~(0x1U)); + if (xlr_boot1_info.cpu_online_map & ~(0x1U)) + wakeup(xlr_secondary_entry, 0, + (unsigned int)xlr_boot1_info.cpu_online_map); +#endif + + /* xlr specific post initialization */ + /* + * The expectation is that mutex_init() is already done in + * mips_init() XXX NOTE: We may need to move this to SMP based init + * code for each CPU, later. + */ + rmi_spin_mutex_safe = 1; + on_chip_init(); + mips_timer_init_params(platform_get_frequency(), 0); + printf("Platform specific startup now completes\n"); +} + +void +platform_identify(void) +{ + printf("Board [%d:%d], processor 0x%08x\n", (int)xlr_boot1_info.board_major_version, + (int)xlr_boot1_info.board_minor_version, mips_rd_prid()); + + +} + +/* + * XXX Maybe return the state of the watchdog in enter, and pass it to + * exit? Like spl(). + */ +void +platform_trap_enter(void) +{ +} + +void +platform_trap_exit(void) +{ +} + + +/* + void + platform_update_intrmask(int intr) + { + write_c0_eimr64(read_c0_eimr64() | (1ULL<i_thread; + + /* + * Interrupt thread will enable the interrupts after processing all + * messages + */ + disable_msgring_int(NULL); + atomic_store_rel_int(&it->i_pending, 1); + thread_lock(td); + if (TD_AWAITING_INTR(td)) { + TD_CLR_IWAIT(td); + sched_add(td, SRQ_INTR); + } + thread_unlock(td); + return FILTER_HANDLED; +} + +static void +msgring_process(void *arg) +{ + volatile struct msgring_ithread *ithd; + struct thread *td; + struct proc *p; + + td = curthread; + p = td->td_proc; + ithd = (volatile struct msgring_ithread *)arg; + KASSERT(ithd->i_thread == td, + ("%s:msg_ithread and proc linkage out of sync", __func__)); + + /* First bind this thread to the right CPU */ + thread_lock(td); + sched_bind(td, ithd->i_cpu); + thread_unlock(td); + + //printf("Started %s on CPU %d\n", __FUNCTION__, ithd->i_cpu); + + while (1) { + while (ithd->i_pending) { + /* + * This might need a full read and write barrier to + * make sure that this write posts before any of the + * memory or device accesses in the handlers. + */ + xlr_msgring_handler(NULL); + atomic_store_rel_int(&ithd->i_pending, 0); + enable_msgring_int(NULL); + } + if (!ithd->i_pending) { + thread_lock(td); + if (ithd->i_pending) { + thread_unlock(td); + continue; + } + sched_class(td, PRI_ITHD); + TD_SET_IWAIT(td); + mi_switch(SW_VOL, NULL); + thread_unlock(td); + } + } + +} +void +platform_prep_smp_launch(void) +{ + int cpu; + uint32_t cpu_mask; + struct msgring_ithread *ithd; + struct thread *td; + struct proc *p; + int error; + + cpu_mask = PCPU_GET(cpumask) | PCPU_GET(other_cpus); + + /* Create kernel threads for message ring interrupt processing */ + /* Currently create one task for thread 0 of each core */ + for (cpu = 0; cpu < MAXCPU; cpu += 1) { + + if (!((1 << cpu) & cpu_mask)) + continue; + + if ((cpu_ltop_map[cpu] % 4) != 0) + continue; + + ithd = &msgring_ithreads[cpu]; + sprintf(ithd_name[cpu], "msg_intr%d", cpu); + error = kproc_create(msgring_process, + (void *)ithd, + &p, + (RFSTOPPED | RFHIGHPID), + 2, + ithd_name[cpu]); + + if (error) + panic("kproc_create() failed with %d", error); + td = FIRST_THREAD_IN_PROC(p); /* XXXKSE */ + + thread_lock(td); + sched_class(td, PRI_ITHD); + TD_SET_IWAIT(td); + thread_unlock(td); + ithd->i_thread = td; + ithd->i_pending = 0; + ithd->i_cpu = cpu; + CTR2(KTR_INTR, "%s: created %s", __func__, ithd_name[cpu]); + } +} diff --git a/sys/mips/rmi/xlr_pci.c b/sys/mips/rmi/xlr_pci.c new file mode 100644 index 000000000000..5f52e9ea5436 --- /dev/null +++ b/sys/mips/rmi/xlr_pci.c @@ -0,0 +1,639 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "pcib_if.h" + +#define pci_cfg_offset(bus,slot,devfn,where) (((bus)<<16) + ((slot) << 11)+((devfn)<<8)+(where)) +#define PCIE_LINK_STATE 0x4000 + +#define LSU_CFG0_REGID 0 +#define LSU_CERRLOG_REGID 9 +#define LSU_CERROVF_REGID 10 +#define LSU_CERRINT_REGID 11 + +/* MSI support */ +#define MSI_MIPS_ADDR_DEST 0x000ff000 +#define MSI_MIPS_ADDR_RH 0x00000008 +#define MSI_MIPS_ADDR_RH_OFF 0x00000000 +#define MSI_MIPS_ADDR_RH_ON 0x00000008 +#define MSI_MIPS_ADDR_DM 0x00000004 +#define MSI_MIPS_ADDR_DM_PHYSICAL 0x00000000 +#define MSI_MIPS_ADDR_DM_LOGICAL 0x00000004 + +/* Fields in data for Intel MSI messages. */ +#define MSI_MIPS_DATA_TRGRMOD 0x00008000 /* Trigger mode */ +#define MSI_MIPS_DATA_TRGREDG 0x00000000 /* edge */ +#define MSI_MIPS_DATA_TRGRLVL 0x00008000 /* level */ + +#define MSI_MIPS_DATA_LEVEL 0x00004000 /* Polarity. */ +#define MSI_MIPS_DATA_DEASSERT 0x00000000 +#define MSI_MIPS_DATA_ASSERT 0x00004000 + +#define MSI_MIPS_DATA_DELMOD 0x00000700 /* Delivery Mode */ +#define MSI_MIPS_DATA_DELFIXED 0x00000000 /* fixed */ +#define MSI_MIPS_DATA_DELLOPRI 0x00000100 /* lowest priority */ + +#define MSI_MIPS_DATA_INTVEC 0x000000ff + +/* + * Build Intel MSI message and data values from a source. AMD64 systems + * seem to be compatible, so we use the same function for both. + */ +#define MIPS_MSI_ADDR(cpu) \ + (MSI_MIPS_ADDR_BASE | (cpu) << 12 | \ + MSI_MIPS_ADDR_RH_OFF | MSI_MIPS_ADDR_DM_PHYSICAL) + +#define MIPS_MSI_DATA(irq) \ + (MSI_MIPS_DATA_TRGRLVL | MSI_MIPS_DATA_DELFIXED | \ + MSI_MIPS_DATA_ASSERT | (irq)) + +#define DEBUG +#ifdef DEBUG +#define dbg_devprintf device_printf +#else +#define dbg_devprintf(dev, fmt, ...) +#endif + +struct xlr_pcib_softc { + int junk; /* no softc */ +}; + +static devclass_t pcib_devclass; +static void *xlr_pci_config_base; +static struct rman irq_rman, port_rman, mem_rman; + +static void +xlr_pci_init_resources(void) +{ + irq_rman.rm_start = 0; + irq_rman.rm_end = 255; + irq_rman.rm_type = RMAN_ARRAY; + irq_rman.rm_descr = "PCI Mapped Interrupts"; + if (rman_init(&irq_rman) + || rman_manage_region(&irq_rman, 0, 255)) + panic("pci_init_resources irq_rman"); + + port_rman.rm_start = 0; + port_rman.rm_end = ~0u; + port_rman.rm_type = RMAN_ARRAY; + port_rman.rm_descr = "I/O ports"; + if (rman_init(&port_rman) + || rman_manage_region(&port_rman, 0x10000000, 0x1fffffff)) + panic("pci_init_resources port_rman"); + + mem_rman.rm_start = 0; + mem_rman.rm_end = ~0u; + mem_rman.rm_type = RMAN_ARRAY; + mem_rman.rm_descr = "I/O memory"; + if (rman_init(&mem_rman) + || rman_manage_region(&mem_rman, 0xd0000000, 0xdfffffff)) + panic("pci_init_resources mem_rman"); +} + +static int +xlr_pcib_probe(device_t dev) +{ + if (xlr_board_info.is_xls) + device_set_desc(dev, "XLS PCIe bus"); + else + device_set_desc(dev, "XLR PCI bus"); + + xlr_pci_init_resources(); + xlr_pci_config_base = (void *)MIPS_PHYS_TO_KSEG1(DEFAULT_PCI_CONFIG_BASE); + + return 0; +} + +static int +xlr_pcib_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) +{ + switch (which) { + case PCIB_IVAR_DOMAIN: + *result = 0; + return (0); + case PCIB_IVAR_BUS: + *result = 0; + return (0); + } + return (ENOENT); +} + +static int +xlr_pcib_write_ivar(device_t dev, device_t child, int which, uintptr_t result) +{ + switch (which) { + case PCIB_IVAR_DOMAIN: + return (EINVAL); + case PCIB_IVAR_BUS: + return (EINVAL); + } + return (ENOENT); +} + +static int +xlr_pcib_maxslots(device_t dev) +{ + return (PCI_SLOTMAX); +} + +static __inline__ void +disable_and_clear_cache_error(void) +{ + uint64_t lsu_cfg0 = read_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CFG0_REGID); + + lsu_cfg0 = lsu_cfg0 & ~0x2e; + write_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CFG0_REGID, lsu_cfg0); + /* Clear cache error log */ + write_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CERRLOG_REGID, 0); +} + +static __inline__ void +clear_and_enable_cache_error(void) +{ + uint64_t lsu_cfg0 = 0; + + /* first clear the cache error logging register */ + write_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CERRLOG_REGID, 0); + write_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CERROVF_REGID, 0); + write_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CERRINT_REGID, 0); + + lsu_cfg0 = read_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CFG0_REGID); + lsu_cfg0 = lsu_cfg0 | 0x2e; + write_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CFG0_REGID, lsu_cfg0); +} + +static uint32_t +pci_cfg_read_32bit(uint32_t addr) +{ + uint32_t temp = 0; + uint32_t *p = (uint32_t *) ((uint32_t) xlr_pci_config_base + (addr & ~3)); + uint64_t cerr_cpu_log = 0; + + disable_and_clear_cache_error(); + + temp = bswap32(*p); + + /* Read cache err log */ + cerr_cpu_log = read_64bit_phnx_ctrl_reg(CPU_BLOCKID_LSU, LSU_CERRLOG_REGID); + if (cerr_cpu_log) { + /* Device don't exist. */ + temp = ~0x0; + } + clear_and_enable_cache_error(); + return temp; +} + +static u_int32_t +xlr_pcib_read_config(device_t dev, u_int b, u_int s, u_int f, + u_int reg, int width) +{ + uint32_t data = 0; + + if ((width == 2) && (reg & 1)) + return 0xFFFFFFFF; + else if ((width == 4) && (reg & 3)) + return 0xFFFFFFFF; + + data = pci_cfg_read_32bit(pci_cfg_offset(b, s, f, reg)); + + if (width == 1) + return ((data >> ((reg & 3) << 3)) & 0xff); + else if (width == 2) + return ((data >> ((reg & 3) << 3)) & 0xffff); + else + return data; +} + +static void +xlr_pcib_write_config(device_t dev, u_int b, u_int s, u_int f, + u_int reg, u_int32_t val, int width) +{ + uint32_t cfgaddr = pci_cfg_offset(b, s, f, reg); + uint32_t data = 0, *p; + + if ((width == 2) && (reg & 1)) + return; + else if ((width == 4) && (reg & 3)) + return; + + if (width == 1) { + data = pci_cfg_read_32bit(cfgaddr); + data = (data & ~(0xff << ((reg & 3) << 3))) | + (val << ((reg & 3) << 3)); + } else if (width == 2) { + data = pci_cfg_read_32bit(cfgaddr); + data = (data & ~(0xffff << ((reg & 3) << 3))) | + (val << ((reg & 3) << 3)); + } else { + data = val; + } + + p = (uint32_t *)((uint32_t) xlr_pci_config_base + (cfgaddr & ~3)); + *p = bswap32(data); + + return; +} + +static int +xlr_pcib_attach(device_t dev) +{ + device_add_child(dev, "pci", 0); + bus_generic_attach(dev); + return 0; +} + +static void +xlr_pcib_identify(driver_t * driver, device_t parent) +{ + if (xlr_board_info.is_xls) { + xlr_reg_t *pcie_mmio_le = xlr_io_mmio(XLR_IO_PCIE_1_OFFSET); + xlr_reg_t reg_link0 = xlr_read_reg(pcie_mmio_le, (0x80 >> 2)); + xlr_reg_t reg_link1 = xlr_read_reg(pcie_mmio_le, (0x84 >> 2)); + + if ((uint16_t) reg_link0 & PCIE_LINK_STATE) { + device_printf(parent, "Link 0 up\n"); + } + if ((uint16_t) reg_link1 & PCIE_LINK_STATE) { + device_printf(parent, "Link 1 up\n"); + } + } + + BUS_ADD_CHILD(parent, 0, "pcib", 0); +} + +static int +xlr_alloc_msi(device_t pcib, device_t dev, int count, int maxcount, int *irqs) +{ + int pciirq; + int i; + device_t parent, tmp; + + + /* find the lane on which the slot is connected to */ + tmp = dev; + while (1) { + parent = device_get_parent(tmp); + if (parent == NULL || parent == pcib) { + device_printf(dev, "Cannot find parent bus\n"); + return ENXIO; + } + if (strcmp(device_get_nameunit(parent), "pci0") == 0) + break; + tmp = parent; + } + + switch (pci_get_slot(tmp)) { + case 0: + pciirq = PIC_PCIE_LINK0_IRQ; + break; + case 1: + pciirq = PIC_PCIE_LINK1_IRQ; + break; + case 2: + pciirq = PIC_PCIE_LINK2_IRQ; + break; + case 3: + pciirq = PIC_PCIE_LINK3_IRQ; + break; + default: + return ENXIO; + } + + irqs[0] = pciirq; + /* + * For now put in some fixed values for the other requested MSI, + * TODO handle multiple messages + */ + for (i = 1; i < count; i++) + irqs[i] = pciirq + 64 * i; + + return 0; +} + +static int +xlr_release_msi(device_t pcib, device_t dev, int count, int *irqs) +{ + device_printf(dev, "%s: msi release %d\n", device_get_nameunit(pcib), count); + return 0; +} + +static int +xlr_map_msi(device_t pcib, device_t dev, int irq, uint64_t * addr, uint32_t * data) +{ + switch (irq) { + case PIC_PCIE_LINK0_IRQ: + case PIC_PCIE_LINK1_IRQ: + case PIC_PCIE_LINK2_IRQ: + case PIC_PCIE_LINK3_IRQ: + *addr = MIPS_MSI_ADDR(0); + *data = MIPS_MSI_DATA(irq); + return 0; + + default: + device_printf(dev, "%s: map_msi for irq %d - ignored", device_get_nameunit(pcib), + irq); + return (ENXIO); + } + +} + +static void +bridge_pcix_ack(void *arg) +{ + xlr_read_reg(xlr_io_mmio(XLR_IO_PCIX_OFFSET), 0x140 >> 2); +} + +static void +bridge_pcix_mask_ack(void *arg) +{ + xlr_mask_hard_irq(arg); + bridge_pcix_ack(arg); +} + +static void +bridge_pcie_ack(void *arg) +{ + int irq = (int)arg; + uint32_t reg; + xlr_reg_t *pcie_mmio_le = xlr_io_mmio(XLR_IO_PCIE_1_OFFSET); + + switch (irq) { + case PIC_PCIE_LINK0_IRQ : reg = PCIE_LINK0_MSI_STATUS; break; + case PIC_PCIE_LINK1_IRQ : reg = PCIE_LINK1_MSI_STATUS; break; + case PIC_PCIE_LINK2_IRQ : reg = PCIE_LINK2_MSI_STATUS; break; + case PIC_PCIE_LINK3_IRQ : reg = PCIE_LINK3_MSI_STATUS; break; + default: + return; + } + + xlr_write_reg(pcie_mmio_le, reg>>2, 0xffffffff); +} + +static void +bridge_pcie_mask_ack(void *arg) +{ + xlr_mask_hard_irq(arg); + bridge_pcie_ack(arg); +} + +static int +mips_platform_pci_setup_intr(device_t dev, device_t child, + struct resource *irq, int flags, + driver_filter_t * filt, + driver_intr_t * intr, void *arg, + void **cookiep) +{ + int level; + xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_PIC_OFFSET); + int error = 0; + int xlrirq; + + error = rman_activate_resource(irq); + if (error) + return error; + if (rman_get_start(irq) != rman_get_end(irq)) { + device_printf(dev, "Interrupt allocation %lu != %lu\n", + rman_get_start(irq), rman_get_end(irq)); + return EINVAL; + } + xlrirq = rman_get_start(irq); + + if (strcmp(device_get_name(dev), "pcib") != 0) + return 0; + + if (xlr_board_info.is_xls == 0) { + if (rmi_spin_mutex_safe) + mtx_lock_spin(&xlr_pic_lock); + level = PIC_IRQ_IS_EDGE_TRIGGERED(PIC_IRT_PCIX_INDEX); + xlr_write_reg(mmio, PIC_IRT_0_PCIX, 0x01); + xlr_write_reg(mmio, PIC_IRT_1_PCIX, ((1 << 31) | (level << 30) | + (1 << 6) | (PIC_PCIX_IRQ))); + if (rmi_spin_mutex_safe) + mtx_unlock_spin(&xlr_pic_lock); + xlr_cpu_establish_hardintr(device_get_name(child), filt, + intr, arg, PIC_PCIX_IRQ, flags, cookiep, + bridge_pcix_mask_ack, xlr_unmask_hard_irq, + bridge_pcix_ack, NULL); + } else { + if (rmi_spin_mutex_safe) + mtx_lock_spin(&xlr_pic_lock); + xlr_write_reg(mmio, PIC_IRT_0_BASE + xlrirq - PIC_IRQ_BASE, 0x01); + xlr_write_reg(mmio, PIC_IRT_1_BASE + xlrirq - PIC_IRQ_BASE, + ((1 << 31) | (1 << 30) | (1 << 6) | xlrirq)); + if (rmi_spin_mutex_safe) + mtx_unlock_spin(&xlr_pic_lock); + + xlr_cpu_establish_hardintr(device_get_name(child), filt, + intr, arg, xlrirq, flags, cookiep, + bridge_pcie_mask_ack, xlr_unmask_hard_irq, + bridge_pcie_ack, NULL); + } + + return bus_generic_setup_intr(dev, child, irq, flags, filt, intr, + arg, cookiep); +} + +static int +mips_platform_pci_teardown_intr(device_t dev, device_t child, + struct resource *irq, void *cookie) +{ + if (strcmp(device_get_name(child), "pci") == 0) { + /* if needed reprogram the pic to clear pcix related entry */ + device_printf(dev, "teardown intr\n"); + } + return bus_generic_teardown_intr(dev, child, irq, cookie); +} + +static struct resource * +xlr_pci_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct rman *rm; + struct resource *rv; + vm_offset_t va; + int needactivate = flags & RF_ACTIVE; + + switch (type) { + case SYS_RES_IRQ: + rm = &irq_rman; + break; + + case SYS_RES_IOPORT: + rm = &port_rman; + break; + + case SYS_RES_MEMORY: + rm = &mem_rman; + break; + + default: + return 0; + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + if (rv == 0) + return 0; + + rman_set_rid(rv, *rid); + + if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { + va = (vm_offset_t)pmap_mapdev(start, count); + rman_set_bushandle(rv, va); + /* bushandle is same as virtual addr */ + rman_set_virtual(rv, (void *)va); + rman_set_bustag(rv, rmi_pci_bus_space); + } + + if (needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + return rv; +} + +static int +xlr_pci_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (rman_release_resource(r)); +} + +static int +xlr_pci_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (rman_activate_resource(r)); +} + +static int +xlr_pci_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + return (rman_deactivate_resource(r)); +} + +static int +mips_pci_route_interrupt(device_t bus, device_t dev, int pin) +{ + /* + * Validate requested pin number. + */ + if ((pin < 1) || (pin > 4)) + return (255); + + if (xlr_board_info.is_xls) { + switch (pin) { + case 1: + return PIC_PCIE_LINK0_IRQ; + case 2: + return PIC_PCIE_LINK1_IRQ; + case 3: + return PIC_PCIE_LINK2_IRQ; + case 4: + return PIC_PCIE_LINK3_IRQ; + } + } else { + if (pin == 1) { + return (16); + } + } + + return (255); +} + +static device_method_t xlr_pcib_methods[] = { + /* Device interface */ + DEVMETHOD(device_identify, xlr_pcib_identify), + DEVMETHOD(device_probe, xlr_pcib_probe), + DEVMETHOD(device_attach, xlr_pcib_attach), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_read_ivar, xlr_pcib_read_ivar), + DEVMETHOD(bus_write_ivar, xlr_pcib_write_ivar), + DEVMETHOD(bus_alloc_resource, xlr_pci_alloc_resource), + DEVMETHOD(bus_release_resource, xlr_pci_release_resource), + DEVMETHOD(bus_activate_resource, xlr_pci_activate_resource), + DEVMETHOD(bus_deactivate_resource, xlr_pci_deactivate_resource), + DEVMETHOD(bus_setup_intr, mips_platform_pci_setup_intr), + DEVMETHOD(bus_teardown_intr, mips_platform_pci_teardown_intr), + + /* pcib interface */ + DEVMETHOD(pcib_maxslots, xlr_pcib_maxslots), + DEVMETHOD(pcib_read_config, xlr_pcib_read_config), + DEVMETHOD(pcib_write_config, xlr_pcib_write_config), + DEVMETHOD(pcib_route_interrupt, mips_pci_route_interrupt), + + DEVMETHOD(pcib_alloc_msi, xlr_alloc_msi), + DEVMETHOD(pcib_release_msi, xlr_release_msi), + DEVMETHOD(pcib_map_msi, xlr_map_msi), + + {0, 0} +}; + +static driver_t xlr_pcib_driver = { + "pcib", + xlr_pcib_methods, + sizeof(struct xlr_pcib_softc), +}; + +DRIVER_MODULE(pcib, nexus, xlr_pcib_driver, pcib_devclass, 0, 0); diff --git a/sys/mips/rmi/xlrconfig.h b/sys/mips/rmi/xlrconfig.h new file mode 100644 index 000000000000..3ba96eb1a8c5 --- /dev/null +++ b/sys/mips/rmi/xlrconfig.h @@ -0,0 +1,336 @@ +/*- + * Copyright (c) 2003-2009 RMI Corporation + * 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. + * 3. Neither the name of RMI Corporation, 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 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. + * + * RMI_BSD */ +#ifndef XLRCONFIG_H +#define XLRCONFIG_H + +#include +#include +#include + +#define read_c0_register32(reg, sel) \ +({ unsigned int __rv; \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips32\n\t" \ + "mfc0\t%0,$%1,%2\n\t" \ + ".set\tpop" \ + : "=r" (__rv) : "i" (reg), "i" (sel) ); \ + __rv;}) + +#define write_c0_register32(reg, sel, value) \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips32\n\t" \ + "mtc0\t%0,$%1,%2\n\t" \ + ".set\tpop" \ + : : "r" (value), "i" (reg), "i" (sel) ); + +#define read_c0_register64(reg, sel) \ + ({ unsigned int __high, __low; \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips64\n\t" \ + "dmfc0\t $8, $%2, %3\n\t" \ + "dsrl32\t%0, $8, 0\n\t" \ + "dsll32\t$8, $8, 0\n\t" \ + "dsrl32\t%1, $8, 0\n\t" \ + ".set\tpop" \ + : "=r"(__high), "=r"(__low): "i"(reg), "i"(sel): "$8" );\ + (((unsigned long long)__high << 32) | __low);}) + +#define write_c0_register64(reg, sel, value) \ + do{ \ + unsigned int __high = val>>32; \ + unsigned int __low = val & 0xffffffff; \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips64\n\t" \ + "dsll32\t$8, %1, 0\n\t" \ + "dsll32\t$9, %0, 0\n\t" \ + "or\t $8, $8, $9\n\t" \ + "dmtc0\t $8, $%2, %3\n\t" \ + ".set\tpop" \ + :: "r"(high), "r"(low), "i"(reg), "i"(sel):"$8", "$9");\ + } while(0) + +#define read_c2_register32(reg, sel) \ +({ unsigned int __rv; \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips32\n\t" \ + "mfc2\t%0,$%1,%2\n\t" \ + ".set\tpop" \ + : "=r" (__rv) : "i" (reg), "i" (sel) ); \ + __rv;}) + +#define write_c2_register32(reg, sel, value) \ + __asm__ __volatile__( \ + ".set\tpush\n\t" \ + ".set mips32\n\t" \ + "mtc2\t%0,$%1,%2\n\t" \ + ".set\tpop" \ + : : "r" (value), "i" (reg), "i" (sel) ); + +#define read_c2_register64(reg, sel) \ + ({ unsigned int __high, __low; \ + __asm__ __volatile__( \ + ".set mips64\n\t" \ + "dmfc2\t $8, $%2, %3\n\t" \ + "dsrl32\t%0, $8, 0\n\t" \ + "dsll32\t$8, $8, 0\n\t" \ + "dsrl32\t%1, $8, 0\n\t" \ + ".set\tmips0" \ + : "=r"(__high), "=r"(__low): "i"(reg), "i"(sel): "$8" );\ + (((unsigned long long)__high << 32) | __low);}) + +#define write_c2_register64(reg, sel, value) \ + do{ \ + unsigned int __high = value>>32; \ + unsigned int __low = value & 0xffffffff; \ + __asm__ __volatile__( \ + ".set mips64\n\t" \ + "dsll32\t$8, %1, 0\n\t" \ + "dsll32\t$9, %0, 0\n\t" \ + "dsrl32\t$8, $8, 0\n\t" \ + "or\t $8, $8, $9\n\t" \ + "dmtc2\t $8, $%2, %3\n\t" \ + ".set\tmips0" \ + :: "r"(__high), "r"(__low), \ + "i"(reg), "i"(sel) \ + :"$8", "$9"); \ + } while(0) + +#if 0 +#define xlr_processor_id() \ +({int __id; \ + __asm__ __volatile__ ( \ + ".set push\n" \ + ".set noreorder\n" \ + ".word 0x40088007\n" \ + "srl $8, $8, 10\n" \ + "andi %0, $8, 0x3f\n" \ + ".set pop\n" \ + : "=r" (__id) : : "$8"); \ + __id;}) +#endif + +#define xlr_cpu_id() \ +({int __id; \ + __asm__ __volatile__ ( \ + ".set push\n" \ + ".set noreorder\n" \ + ".word 0x40088007\n" \ + "srl $8, $8, 4\n" \ + "andi %0, $8, 0x7\n" \ + ".set pop\n" \ + : "=r" (__id) : : "$8"); \ + __id;}) + +#define xlr_thr_id() \ +({int __id; \ + __asm__ __volatile__ ( \ + ".set push\n" \ + ".set noreorder\n" \ + ".word 0x40088007\n" \ + "andi %0, $8, 0x03\n" \ + ".set pop\n" \ + : "=r" (__id) : : "$8"); \ + __id;}) + + +/* Additional registers on the XLR */ +#define MIPS_COP_0_OSSCRATCH 22 + +#define XLR_CACHELINE_SIZE 32 + +#define XLR_MAX_CORES 8 + +/* functions to write to and read from the extended + * cp0 registers. + * EIRR : Extended Interrupt Request Register + * cp0 register 9 sel 6 + * bits 0...7 are same as cause register 8...15 + * EIMR : Extended Interrupt Mask Register + * cp0 register 9 sel 7 + * bits 0...7 are same as status register 8...15 + */ + +static inline uint64_t +read_c0_eirr64(void) +{ + __uint32_t high, low; + + __asm__ __volatile__( + ".set push\n" + ".set noreorder\n" + ".set noat\n" + ".set mips4\n" + + ".word 0x40214806 \n\t" + "nop \n\t" + "dsra32 %0, $1, 0 \n\t" + "sll %1, $1, 0 \n\t" + + ".set pop\n" + + : "=r"(high), "=r"(low) + ); + + return (((__uint64_t) high) << 32) | low; +} + +static inline __uint64_t +read_c0_eimr64(void) +{ + __uint32_t high, low; + + __asm__ __volatile__( + ".set push\n" + ".set noreorder\n" + ".set noat\n" + ".set mips4\n" + + ".word 0x40214807 \n\t" + "nop \n\t" + "dsra32 %0, $1, 0 \n\t" + "sll %1, $1, 0 \n\t" + + ".set pop\n" + + : "=r"(high), "=r"(low) + ); + + return (((__uint64_t) high) << 32) | low; +} + +static inline void +write_c0_eirr64(__uint64_t value) +{ + __uint32_t low, high; + + high = value >> 32; + low = value & 0xffffffff; + + __asm__ __volatile__( + ".set push\n" + ".set noreorder\n" + ".set noat\n" + ".set mips4\n\t" + + "dsll32 $2, %1, 0 \n\t" + "dsll32 $1, %0, 0 \n\t" + "dsrl32 $2, $2, 0 \n\t" + "or $1, $1, $2 \n\t" + ".word 0x40a14806 \n\t" + "nop \n\t" + + ".set pop\n" + + : + : "r"(high), "r"(low) + : "$1", "$2"); +} + +static inline void +write_c0_eimr64(__uint64_t value) +{ + __uint32_t low, high; + + high = value >> 32; + low = value & 0xffffffff; + + __asm__ __volatile__( + ".set push\n" + ".set noreorder\n" + ".set noat\n" + ".set mips4\n\t" + + "dsll32 $2, %1, 0 \n\t" + "dsll32 $1, %0, 0 \n\t" + "dsrl32 $2, $2, 0 \n\t" + "or $1, $1, $2 \n\t" + ".word 0x40a14807 \n\t" + "nop \n\t" + + ".set pop\n" + + : + : "r"(high), "r"(low) + : "$1", "$2"); +} + +static __inline__ int +xlr_test_and_set(int *lock) +{ + int oldval = 0; + + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "move $9, %2\n" + "li $8, 1\n" + // "swapw $8, $9\n" + ".word 0x71280014\n" + "move %1, $8\n" + ".set pop\n" + : "+m"(*lock), "=r"(oldval) + : "r"((unsigned long)lock) + : "$8", "$9" + ); + + return (oldval == 0 ? 1 /* success */ : 0 /* failure */ ); +} + +static __inline__ uint32_t +xlr_mfcr(uint32_t reg) +{ + uint32_t val; + + __asm__ __volatile__( + "move $8, %1\n" + ".word 0x71090018\n" + "move %0, $9\n" + : "=r"(val) + : "r"(reg):"$8", "$9"); + + return val; +} + +static __inline__ void +xlr_mtcr(uint32_t reg, uint32_t val) +{ + __asm__ __volatile__( + "move $8, %1\n" + "move $9, %0\n" + ".word 0x71090019\n" + :: "r"(val), "r"(reg) + : "$8", "$9"); +} + +#endif diff --git a/sys/mips/rmi/xls_ehci.c b/sys/mips/rmi/xls_ehci.c new file mode 100644 index 000000000000..b90f31724aff --- /dev/null +++ b/sys/mips/rmi/xls_ehci.c @@ -0,0 +1,285 @@ +/*- + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson (augustss@carlstedt.se) at + * Carlstedt Research & Technology. + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 +__FBSDID("$FreeBSD$"); + +#include "opt_bus.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static int ehci_xls_attach(device_t self); +static int ehci_xls_detach(device_t self); +static int ehci_xls_shutdown(device_t self); +static int ehci_xls_suspend(device_t self); +static int ehci_xls_resume(device_t self); + +static int +ehci_xls_suspend(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + int err; + + err = bus_generic_suspend(self); + if (err) + return (err); + ehci_suspend(sc); + return (0); +} + +static int +ehci_xls_resume(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + + ehci_resume(sc); + + bus_generic_resume(self); + + return (0); +} + +static int +ehci_xls_shutdown(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + int err; + + err = bus_generic_shutdown(self); + if (err) + return (err); + ehci_shutdown(sc); + + return (0); +} + +static const char *xlr_usb_dev_desc = "RMI XLR USB 2.0 controller"; +static const char *xlr_vendor_desc = "RMI Corp"; + +static int +ehci_xls_probe(device_t self) +{ + /* TODO see if usb is enabled on the board */ + device_set_desc(self, xlr_usb_dev_desc); + return BUS_PROBE_DEFAULT; +} + +static int +ehci_xls_attach(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + int err; + int rid; + + sc->sc_bus.parent = self; + sc->sc_bus.devices = sc->sc_devices; + sc->sc_bus.devices_max = EHCI_MAX_DEVICES; + + /* get all DMA memory */ + if (usb_bus_mem_alloc_all(&sc->sc_bus, + USB_GET_DMA_TAG(self), &ehci_iterate_hw_softc)) { + return (ENOMEM); + } + + rid = 0; + sc->sc_io_res = bus_alloc_resource_any(self, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (!sc->sc_io_res) { + device_printf(self, "Could not map memory\n"); + goto error; + } + sc->sc_io_tag = rman_get_bustag(sc->sc_io_res); + sc->sc_io_hdl = rman_get_bushandle(sc->sc_io_res); + printf("IO Resource tag %lx, hdl %lx, size %lx\n", + (u_long)sc->sc_io_tag, (u_long)sc->sc_io_hdl, + (u_long)sc->sc_io_size); + + rid = 0; + sc->sc_irq_res = bus_alloc_resource(self, SYS_RES_IRQ, &rid, + PIC_USB_IRQ, PIC_USB_IRQ, 1, RF_SHAREABLE | RF_ACTIVE); + if (sc->sc_irq_res == NULL) { + device_printf(self, "Could not allocate irq\n"); + goto error; + } + + sc->sc_bus.bdev = device_add_child(self, "usbus", -1); + if (!sc->sc_bus.bdev) { + device_printf(self, "Could not add USB device\n"); + goto error; + } + device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus); + device_set_desc(sc->sc_bus.bdev, xlr_usb_dev_desc); + + sprintf(sc->sc_vendor, xlr_vendor_desc); + + err = bus_setup_intr(self, sc->sc_irq_res, + INTR_TYPE_BIO | INTR_MPSAFE, NULL, + (driver_intr_t *) ehci_interrupt, sc, &sc->sc_intr_hdl); + if (err) { + device_printf(self, "Could not setup irq, %d\n", err); + sc->sc_intr_hdl = NULL; + goto error; + } + + err = ehci_init(sc); + if (err) { + device_printf(self, "USB init failed err=%d\n", err); + goto error; + } + + err = device_probe_and_attach(sc->sc_bus.bdev); + if (err) { + device_printf(self, "USB probe and attach failed err=%d\n", err); + goto error; + } + + return (0); + +error: + ehci_xls_detach(self); + return (ENXIO); +} + +static int +ehci_xls_detach(device_t self) +{ + ehci_softc_t *sc = device_get_softc(self); + device_t bdev; + int err; + + if (sc->sc_bus.bdev) { + bdev = sc->sc_bus.bdev; + device_detach(bdev); + device_delete_child(self, bdev); + } + /* during module unload there are lots of children leftover */ + device_delete_all_children(self); + + /* + * disable interrupts that might have been switched on in ehci_init + */ + if (sc->sc_io_res) { + EWRITE4(sc, EHCI_USBINTR, 0); + } + + if (sc->sc_irq_res && sc->sc_intr_hdl) { + ehci_detach(sc); + + err = bus_teardown_intr(self, sc->sc_irq_res, sc->sc_intr_hdl); + if (err) + device_printf(self, "Could not tear down irq, %d\n", + err); + sc->sc_intr_hdl = 0; + } + + if (sc->sc_irq_res) { + bus_release_resource(self, SYS_RES_IRQ, 0, sc->sc_irq_res); + sc->sc_irq_res = NULL; + } + if (sc->sc_io_res) { + bus_release_resource(self, SYS_RES_MEMORY, 0, + sc->sc_io_res); + sc->sc_io_res = NULL; + sc->sc_io_tag = 0; + sc->sc_io_hdl = 0; + } + + usb_bus_mem_free_all(&sc->sc_bus, &ehci_iterate_hw_softc); + + return (0); +} + +static device_method_t ehci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ehci_xls_probe), + DEVMETHOD(device_attach, ehci_xls_attach), + DEVMETHOD(device_detach, ehci_xls_detach), + DEVMETHOD(device_suspend, ehci_xls_suspend), + DEVMETHOD(device_resume, ehci_xls_resume), + DEVMETHOD(device_shutdown, ehci_xls_shutdown), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + + {0, 0} +}; + +static driver_t ehci_driver = { + "ehci", + ehci_methods, + sizeof(struct ehci_softc), +}; + +static devclass_t ehci_devclass; + +DRIVER_MODULE(ehci, iodi, ehci_driver, ehci_devclass, 0, 0); +MODULE_DEPEND(ehci, usb, 1, 1, 1); diff --git a/sys/mips/sentry5/files.sentry5 b/sys/mips/sentry5/files.sentry5 index 61038e035df9..73907f4219d8 100644 --- a/sys/mips/sentry5/files.sentry5 +++ b/sys/mips/sentry5/files.sentry5 @@ -4,11 +4,6 @@ # for USB 1.1 OHCI, Ethernet and IPSEC cores # which are believed to be devices we have drivers for # which just need to be tweaked for attachment to an SSB system bus. - mips/sentry5/s5_machdep.c standard -dev/siba/siba.c optional siba -dev/siba/siba_pcib.c optional siba pci -mips/sentry5/siba_cc.c optional siba - -# notyet -#mips/sentry5/siba_mips.c optional siba +mips/mips/intr_machdep.c standard +mips/mips/tick.c standard diff --git a/sys/mips/sentry5/obio.c b/sys/mips/sentry5/obio.c index 073035800ff6..51eaa9d4e9a3 100644 --- a/sys/mips/sentry5/obio.c +++ b/sys/mips/sentry5/obio.c @@ -72,13 +72,11 @@ static int have_one = 0; int obio_probe(device_t dev) { - if(!have_one) - { + if (!have_one) { have_one = 1; return 0; } - else - return (ENXIO); + return (ENXIO); } int @@ -119,7 +117,6 @@ obio_alloc_resource(device_t bus, device_t child, int type, int *rid, { struct resource *rv; struct rman *rm; - bus_space_tag_t bt = 0; bus_space_handle_t bh = 0; struct obio_softc *sc = device_get_softc(bus); @@ -131,7 +128,6 @@ obio_alloc_resource(device_t bus, device_t child, int type, int *rid, return (NULL); case SYS_RES_IOPORT: rm = &sc->oba_rman; - bt = sc->oba_st; bh = sc->oba_addr; start = bh; break; @@ -146,7 +142,7 @@ obio_alloc_resource(device_t bus, device_t child, int type, int *rid, if (type == SYS_RES_IRQ) return (rv); rman_set_rid(rv, *rid); - rman_set_bustag(rv, bt); + rman_set_bustag(rv, mips_bus_space_generic); rman_set_bushandle(rv, bh); if (0) { diff --git a/sys/mips/sentry5/s5_machdep.c b/sys/mips/sentry5/s5_machdep.c index 0923402d6792..00e6231cdae9 100644 --- a/sys/mips/sentry5/s5_machdep.c +++ b/sys/mips/sentry5/s5_machdep.c @@ -79,14 +79,15 @@ __FBSDID("$FreeBSD$"); #include #endif -#ifdef CFE -extern uint32_t cfe_handle; -extern uint32_t cfe_vector; -#endif - extern int *edata; extern int *end; +void +platform_cpu_init() +{ + /* Nothing special */ +} + static void mips_init(void) { @@ -118,7 +119,7 @@ mips_init(void) * from CFE, omit the region at the start of physical * memory where the kernel has been loaded. */ - phys_avail[i] += MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); + phys_avail[i] += MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); } phys_avail[i + 1] = addr + len; physmem += len; @@ -135,8 +136,10 @@ mips_init(void) pmap_bootstrap(); mips_proc0_init(); mutex_init(); -#ifdef DDB kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); #endif } @@ -177,30 +180,36 @@ platform_trap_exit(void) } void -platform_start(__register_t a0 __unused, __register_t a1 __unused, - __register_t a2 __unused, __register_t a3 __unused) +platform_start(__register_t a0, __register_t a1, __register_t a2, + __register_t a3) { vm_offset_t kernend; uint64_t platform_counter_freq; /* clear the BSS and SBSS segments */ - kernend = round_page((vm_offset_t)&end); + kernend = (vm_offset_t)&end; memset(&edata, 0, kernend - (vm_offset_t)(&edata)); + mips_postboot_fixup(); + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + #ifdef CFE /* * Initialize CFE firmware trampolines before * we initialize the low-level console. + * + * CFE passes the following values in registers: + * a0: firmware handle + * a2: firmware entry point + * a3: entry point seal */ - if (cfe_handle != 0) - cfe_init(cfe_handle, cfe_vector); + if (a3 == CFE_EPTSEAL) + cfe_init(a0, a2); #endif cninit(); -#ifdef CFE - if (cfe_handle == 0) - panic("CFE was not detected by locore.\n"); -#endif mips_init(); # if 0 diff --git a/sys/mips/sentry5/siba_sdram.c b/sys/mips/sentry5/siba_sdram.c deleted file mode 100644 index 8e74e53d7f94..000000000000 --- a/sys/mips/sentry5/siba_sdram.c +++ /dev/null @@ -1,114 +0,0 @@ -/*- - * Copyright (c) 2007 Bruce M. Simpson. - * 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. - */ - -/* - * Child driver for SDRAM/DDR controller core. - * Generally the OS should not need to access this device unless the - * firmware has not configured the SDRAM controller. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -static int siba_sdram_attach(device_t); -static int siba_sdram_probe(device_t); - -static int -siba_sdram_probe(device_t dev) -{ - - if (siba_get_vendor(dev) == SIBA_VID_BROADCOM && - siba_get_device(dev) == SIBA_DEVID_SDRAMDDR) { - device_set_desc(dev, "SDRAM/DDR core"); - return (BUS_PROBE_DEFAULT); - } - - return (ENXIO); -} - -struct siba_sdram_softc { - void *notused; -}; - -static int -siba_sdram_attach(device_t dev) -{ - //struct siba_sdram_softc *sc = device_get_softc(dev); - struct resource *mem; - int rid; - - /* - * Allocate the resources which the parent bus has already - * determined for us. - * TODO: interrupt routing - */ -#define MIPS_MEM_RID 0x20 - rid = MIPS_MEM_RID; - mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, - RF_ACTIVE); - if (mem == NULL) { - device_printf(dev, "unable to allocate memory\n"); - return (ENXIO); - } - -#if 0 - device_printf(dev, "start %08lx size %04lx\n", - rman_get_start(mem), rman_get_size(mem)); -#endif - - return (0); -} - -static device_method_t siba_sdram_methods[] = { - /* Device interface */ - DEVMETHOD(device_attach, siba_sdram_attach), - DEVMETHOD(device_probe, siba_sdram_probe), - - {0, 0}, -}; - -static driver_t siba_sdram_driver = { - "siba_sdram", - siba_sdram_methods, - sizeof(struct siba_softc), -}; -static devclass_t siba_sdram_devclass; - -DRIVER_MODULE(siba_sdram, siba, siba_sdram_driver, siba_sdram_devclass, 0, 0); diff --git a/sys/mips/sentry5/uart_bus_sbusart.c b/sys/mips/sentry5/uart_bus_sbusart.c index 21a6f58c019e..c6c4c8d13a9a 100644 --- a/sys/mips/sentry5/uart_bus_sbusart.c +++ b/sys/mips/sentry5/uart_bus_sbusart.c @@ -85,9 +85,9 @@ uart_malta_probe(device_t dev) sc->sc_sysdev = SLIST_FIRST(&uart_sysdevs); sc->sc_class = &uart_ns8250_class; bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas)); - sc->sc_sysdev->bas.bst = 0; + sc->sc_sysdev->bas.bst = mips_bus_space_generic; sc->sc_sysdev->bas.bsh = MIPS_PHYS_TO_KSEG1(SENTRY5_UART1ADR); - sc->sc_bas.bst = 0; + sc->sc_bas.bst = mips_bus_space_generic; sc->sc_bas.bsh = MIPS_PHYS_TO_KSEG1(SENTRY5_UART1ADR); return(uart_bus_probe(dev, 0, 0, 0, 0)); } diff --git a/sys/mips/sentry5/uart_cpu_sbusart.c b/sys/mips/sentry5/uart_cpu_sbusart.c index 10ee7be94462..68b761d9d745 100644 --- a/sys/mips/sentry5/uart_cpu_sbusart.c +++ b/sys/mips/sentry5/uart_cpu_sbusart.c @@ -76,7 +76,7 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) di->parity = UART_PARITY_NONE; uart_bus_space_io = MIPS_PHYS_TO_KSEG1(SENTRY5_UART1ADR); - uart_bus_space_mem = MIPS_PHYS_TO_KSEG1(SENTRY5_UART1ADR); + uart_bus_space_mem = mips_bus_space_generic; di->bas.bsh = MIPS_PHYS_TO_KSEG1(SENTRY5_UART1ADR); return (0); } diff --git a/sys/mips/sibyte/ata_zbbus.c b/sys/mips/sibyte/ata_zbbus.c new file mode 100644 index 000000000000..87a2a42943e9 --- /dev/null +++ b/sys/mips/sibyte/ata_zbbus.c @@ -0,0 +1,170 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include + +__FBSDID("$FreeBSD$"); + +static int +ata_zbbus_probe(device_t dev) +{ + + return (ata_probe(dev)); +} + +static int +ata_zbbus_attach(device_t dev) +{ + int i, rid, regshift, regoffset; + struct ata_channel *ch; + struct resource *io; + + ch = device_get_softc(dev); + + if (ch->attached) + return (0); + ch->attached = 1; + + rid = 0; + io = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0, ~0, 1, RF_ACTIVE); + if (io == NULL) + return (ENXIO); + + /* + * SWARM needs an address shift of 5 when accessing ATA registers. + * + * For e.g. an access to register 4 actually needs an address + * of (4 << 5) to be output on the generic bus. + */ + regshift = 5; + resource_int_value(device_get_name(dev), device_get_unit(dev), + "regshift", ®shift); + if (regshift && bootverbose) + device_printf(dev, "using a register shift of %d\n", regshift); + + regoffset = 0x1F0; + resource_int_value(device_get_name(dev), device_get_unit(dev), + "regoffset", ®offset); + if (regoffset && bootverbose) { + device_printf(dev, "using a register offset of 0x%0x\n", + regoffset); + } + + /* setup the ata register addresses */ + for (i = ATA_DATA; i <= ATA_COMMAND; ++i) { + ch->r_io[i].res = io; + ch->r_io[i].offset = (regoffset + i) << regshift; + } + + ch->r_io[ATA_CONTROL].res = io; + ch->r_io[ATA_CONTROL].offset = (regoffset + ATA_CTLOFFSET) << regshift; + ch->r_io[ATA_IDX_ADDR].res = io; /* XXX what is this used for */ + ata_default_registers(dev); + + /* initialize softc for this channel */ + ch->unit = 0; + ch->flags |= ATA_USE_16BIT; + ata_generic_hw(dev); + + return (ata_attach(dev)); +} + +static int +ata_zbbus_detach(device_t dev) +{ + int error; + struct ata_channel *ch = device_get_softc(dev); + + if (!ch->attached) + return (0); + ch->attached = 0; + + error = ata_detach(dev); + + bus_release_resource(dev, SYS_RES_MEMORY, 0, + ch->r_io[ATA_IDX_ADDR].res); + + return (error); +} + +static int +ata_zbbus_suspend(device_t dev) +{ + struct ata_channel *ch = device_get_softc(dev); + + if (!ch->attached) + return (0); + + return (ata_suspend(dev)); +} + +static int +ata_zbbus_resume(device_t dev) +{ + struct ata_channel *ch = device_get_softc(dev); + + if (!ch->attached) + return (0); + + return (ata_resume(dev)); +} + +static device_method_t ata_zbbus_methods[] = { + /* device interface */ + DEVMETHOD(device_probe, ata_zbbus_probe), + DEVMETHOD(device_attach, ata_zbbus_attach), + DEVMETHOD(device_detach, ata_zbbus_detach), + DEVMETHOD(device_suspend, ata_zbbus_suspend), + DEVMETHOD(device_resume, ata_zbbus_resume), + + { 0, 0 } +}; + +static driver_t ata_zbbus_driver = { + "ata", + ata_zbbus_methods, + sizeof(struct ata_channel) +}; + +DRIVER_MODULE(ata, zbbus, ata_zbbus_driver, ata_devclass, 0, 0); diff --git a/sys/mips/sibyte/files.sibyte b/sys/mips/sibyte/files.sibyte new file mode 100644 index 000000000000..4c5c9c030830 --- /dev/null +++ b/sys/mips/sibyte/files.sibyte @@ -0,0 +1,10 @@ +# $FreeBSD$ + +mips/sibyte/sb_machdep.c standard +mips/sibyte/sb_zbbus.c standard +mips/sibyte/sb_zbpci.c standard +mips/sibyte/sb_scd.c standard +mips/sibyte/ata_zbbus.c standard +mips/mips/intr_machdep.c standard +mips/sibyte/sb_asm.S standard +mips/mips/tick.c standard diff --git a/sys/mips/sibyte/sb_asm.S b/sys/mips/sibyte/sb_asm.S new file mode 100644 index 000000000000..a822d79d8213 --- /dev/null +++ b/sys/mips/sibyte/sb_asm.S @@ -0,0 +1,101 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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 +#include +#include + +/* + * We compile a 32-bit kernel to run on the SB-1 processor which is a 64-bit + * processor. It has some registers that must be accessed using 64-bit load + * and store instructions. + * + * So we have to resort to assembly because the compiler does not emit the + * 'ld' and 'sd' instructions since it thinks that it is compiling for a + * 32-bit mips processor. + */ + +.set mips64 +.set noat +.set noreorder + +/* + * Parameters: uint32_t ptr + * Return value: *(uint64_t *)ptr + */ +LEAF(sb_load64) + ld v1, 0(a0) /* result = *(uint64_t *)ptr */ + move v0, v1 +#if _BYTE_ORDER == _BIG_ENDIAN + dsll32 v1, v1, 0 + dsrl32 v1, v1, 0 /* v1 = lower_uint32(result) */ + jr ra + dsrl32 v0, v0, 0 /* v0 = upper_uint32(result) */ +#else + dsll32 v0, v0, 0 + dsrl32 v0, v0, 0 /* v0 = lower_uint32(result) */ + jr ra + dsrl32 v1, v1, 0 /* v1 = upper_uint32(result) */ +#endif +END(sb_load64) + +/* + * Parameters: uint32_t ptr, uint64_t val + * Return value: void + */ +LEAF(sb_store64) +#if _BYTE_ORDER == _BIG_ENDIAN + dsll32 a2, a2, 0 /* a2 = upper_uint32(val) */ + dsll32 a3, a3, 0 /* a3 = lower_uint32(val) */ + dsrl32 a3, a3, 0 +#else + dsll32 a3, a3, 0 /* a3 = upper_uint32(val) */ + dsll32 a2, a2, 0 /* a2 = lower_uint32(val) */ + dsrl32 a2, a2, 0 +#endif + or t0, a2, a3 + jr ra + sd t0, 0(a0) +END(sb_store64) + +#ifdef SMP +/* + * This function must be implemented in assembly because it is called early + * in AP boot without a valid stack. + * + * This cpu number is available in bits 25 to 27 of the coprocessor 0 PRID + * register. This is not documented in the BCM1250 user manual but can be + * gleaned from the CFE source code - see sb1250_altcpu.S + */ +LEAF(platform_processor_id) + mfc0 v0, MIPS_COP_0_PRID + srl v0, v0, 25 + jr ra + and v0, v0, 7 +END(platform_processor_id) +#endif /* SMP */ diff --git a/sys/mips/sibyte/sb_bus_space.h b/sys/mips/sibyte/sb_bus_space.h new file mode 100644 index 000000000000..f3364f07a29a --- /dev/null +++ b/sys/mips/sibyte/sb_bus_space.h @@ -0,0 +1,43 @@ +/*- + * Copyright (c) 2010 Neelkanth Natu + * 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$ + */ + +#ifndef _SB_BUS_SPACE_H_ +#define _SB_BUS_SPACE_H_ + +#include + +#if _BYTE_ORDER == _BIG_ENDIAN +uint8_t sb_big_endian_read8(bus_addr_t addr); +uint16_t sb_big_endian_read16(bus_addr_t addr); +uint32_t sb_big_endian_read32(bus_addr_t addr); +void sb_big_endian_write8(bus_addr_t addr, uint8_t val); +void sb_big_endian_write16(bus_addr_t addr, uint16_t val); +void sb_big_endian_write32(bus_addr_t addr, uint32_t val); +#endif + +#endif diff --git a/sys/mips/sibyte/sb_machdep.c b/sys/mips/sibyte/sb_machdep.c new file mode 100644 index 000000000000..c6043b8514a3 --- /dev/null +++ b/sys/mips/sibyte/sb_machdep.c @@ -0,0 +1,396 @@ +/*- + * Copyright (c) 2007 Bruce M. Simpson. + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include "opt_ddb.h" +#include "opt_kdb.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef SMP +#include +#endif + +#ifdef CFE +#include +#endif + +#include "sb_scd.h" + +#ifdef DDB +#ifndef KDB +#error KDB must be enabled in order for DDB to work! +#endif +#endif + +#ifdef CFE_ENV +extern void cfe_env_init(void); +#endif + +extern int *edata; +extern int *end; + +extern char MipsTLBMiss[], MipsTLBMissEnd[]; + +void +platform_cpu_init() +{ + /* Nothing special */ +} + +static void +sb_intr_init(int cpuid) +{ + int intrnum, intsrc; + + /* + * Disable all sources to the interrupt mapper and setup the mapping + * between an interrupt source and the mips hard interrupt number. + */ + for (intsrc = 0; intsrc < NUM_INTSRC; ++intsrc) { + intrnum = sb_route_intsrc(intsrc); + sb_disable_intsrc(cpuid, intsrc); + sb_write_intmap(cpuid, intsrc, intrnum); +#ifdef SMP + /* + * Set up the mailbox interrupt mapping. + * + * The mailbox interrupt is "special" in that it is not shared + * with any other interrupt source. + */ + if (intsrc == INTSRC_MAILBOX3) { + intrnum = platform_ipi_intrnum(); + sb_write_intmap(cpuid, INTSRC_MAILBOX3, intrnum); + sb_enable_intsrc(cpuid, INTSRC_MAILBOX3); + } +#endif + } +} + +static void +mips_init(void) +{ + int i, cfe_mem_idx, tmp; + uint64_t maxmem; + +#ifdef CFE_ENV + cfe_env_init(); +#endif + + TUNABLE_INT_FETCH("boothowto", &boothowto); + + if (boothowto & RB_VERBOSE) + bootverbose++; + +#ifdef MAXMEM + tmp = MAXMEM; +#else + tmp = 0; +#endif + TUNABLE_INT_FETCH("hw.physmem", &tmp); + maxmem = (uint64_t)tmp * 1024; + +#ifdef CFE + /* + * Query DRAM memory map from CFE. + */ + physmem = 0; + cfe_mem_idx = 0; + for (i = 0; i < 10; i += 2) { + int result; + uint64_t addr, len, type; + + result = cfe_enummem(cfe_mem_idx++, 0, &addr, &len, &type); + if (result < 0) { + phys_avail[i] = phys_avail[i + 1] = 0; + break; + } + + KASSERT(type == CFE_MI_AVAILABLE, + ("CFE DRAM region is not available?")); + + if (bootverbose) + printf("cfe_enummem: 0x%016jx/%llu.\n", addr, len); + + if (maxmem != 0) { + if (addr >= maxmem) { + printf("Ignoring %llu bytes of memory at 0x%jx " + "that is above maxmem %dMB\n", + len, addr, + (int)(maxmem / (1024 * 1024))); + continue; + } + + if (addr + len > maxmem) { + printf("Ignoring %llu bytes of memory " + "that is above maxmem %dMB\n", + (addr + len) - maxmem, + (int)(maxmem / (1024 * 1024))); + len = maxmem - addr; + } + } + + phys_avail[i] = addr; + if (i == 0 && addr == 0) { + /* + * If this is the first physical memory segment probed + * from CFE, omit the region at the start of physical + * memory where the kernel has been loaded. + */ + phys_avail[i] += MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); + } + phys_avail[i + 1] = addr + len; + physmem += len; + } + + realmem = btoc(physmem); +#endif + + physmem = realmem; + + init_param1(); + init_param2(physmem); + mips_cpu_init(); + + /* + * XXX + * The kernel is running in 32-bit mode but the CFE is running in + * 64-bit mode. So the SR_KX bit in the status register is turned + * on by the CFE every time we call into it - for e.g. CFE_CONSOLE. + * + * This means that if get a TLB miss for any address above 0xc0000000 + * and the SR_KX bit is set then we will end up in the XTLB exception + * vector. + * + * For now work around this by copying the TLB exception handling + * code to the XTLB exception vector. + */ + { + bcopy(MipsTLBMiss, (void *)XTLB_MISS_EXC_VEC, + MipsTLBMissEnd - MipsTLBMiss); + + mips_icache_sync_all(); + mips_dcache_wbinv_all(); + } + + pmap_bootstrap(); + mips_proc0_init(); + mutex_init(); + + kdb_init(); +#ifdef KDB + if (boothowto & RB_KDB) + kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); +#endif +} + +void +platform_halt(void) +{ + +} + + +void +platform_identify(void) +{ + +} + +void +platform_reset(void) +{ + + /* + * XXX SMP + * XXX flush data caches + */ + sb_system_reset(); +} + +void +platform_trap_enter(void) +{ + +} + +void +platform_trap_exit(void) +{ + +} + +static void +kseg0_map_coherent(void) +{ + uint32_t config; + const int CFG_K0_COHERENT = 5; + + config = mips_rd_config(); + config &= ~CFG_K0_MASK; + config |= CFG_K0_COHERENT; + mips_wr_config(config); +} + +#ifdef SMP +void +platform_ipi_send(int cpuid) +{ + KASSERT(cpuid == 0 || cpuid == 1, + ("platform_ipi_send: invalid cpuid %d", cpuid)); + + sb_set_mailbox(cpuid, 1ULL); +} + +void +platform_ipi_clear(void) +{ + int cpuid; + + cpuid = PCPU_GET(cpuid); + sb_clear_mailbox(cpuid, 1ULL); +} + +int +platform_ipi_intrnum(void) +{ + + return (4); +} + +void +platform_init_ap(int cpuid) +{ + + KASSERT(cpuid == 1, ("AP has an invalid cpu id %d", cpuid)); + + /* + * Make sure that kseg0 is mapped cacheable-coherent + */ + kseg0_map_coherent(); + + sb_intr_init(cpuid); +} + +int +platform_start_ap(int cpuid) +{ +#ifdef CFE + int error; + + if ((error = cfe_cpu_start(cpuid, mpentry, 0, 0, 0))) { + printf("cfe_cpu_start error: %d\n", error); + return (-1); + } else { + return (0); + } +#else + return (-1); +#endif /* CFE */ +} +#endif /* SMP */ + +void +platform_start(__register_t a0, __register_t a1, __register_t a2, + __register_t a3) +{ + /* + * Make sure that kseg0 is mapped cacheable-coherent + */ + kseg0_map_coherent(); + + /* clear the BSS and SBSS segments */ + memset(&edata, 0, (vm_offset_t)&end - (vm_offset_t)&edata); + mips_postboot_fixup(); + + sb_intr_init(0); + + /* Initialize pcpu stuff */ + mips_pcpu0_init(); + +#ifdef CFE + /* + * Initialize CFE firmware trampolines before + * we initialize the low-level console. + * + * CFE passes the following values in registers: + * a0: firmware handle + * a2: firmware entry point + * a3: entry point seal + */ + if (a3 == CFE_EPTSEAL) + cfe_init(a0, a2); +#endif + cninit(); + + mips_init(); + + mips_timer_init_params(sb_cpu_speed(), 0); +} diff --git a/sys/mips/sibyte/sb_scd.c b/sys/mips/sibyte/sb_scd.c new file mode 100644 index 000000000000..007e1499c7b3 --- /dev/null +++ b/sys/mips/sibyte/sb_scd.c @@ -0,0 +1,285 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include + +#include +#include + +#include "sb_scd.h" + +extern void sb_store64(uint32_t addr, uint64_t val); +extern uint64_t sb_load64(uint32_t addr); + +/* + * System Control and Debug (SCD) unit on the Sibyte ZBbus. + */ + +/* + * Extract the value starting at bit position 'b' for 'n' bits from 'x'. + */ +#define GET_VAL_64(x, b, n) (((x) >> (b)) & ((1ULL << (n)) - 1)) + +#define SYSREV_ADDR MIPS_PHYS_TO_KSEG1(0x10020000) +#define SYSREV_NUM_PROCESSORS(x) GET_VAL_64((x), 24, 4) + +#define SYSCFG_ADDR MIPS_PHYS_TO_KSEG1(0x10020008) +#define SYSCFG_PLLDIV(x) GET_VAL_64((x), 7, 5) + +#define INTSRC_MASK_ADDR(cpu) \ + (MIPS_PHYS_TO_KSEG1(0x10020028) | ((cpu) << 13)) + +#define INTSRC_MAP_ADDR(cpu, intsrc) \ + (MIPS_PHYS_TO_KSEG1(0x10020200) | ((cpu) << 13)) + (intsrc * 8) + +#define MAILBOX_SET_ADDR(cpu) \ + (MIPS_PHYS_TO_KSEG1(0x100200C8) | ((cpu) << 13)) + +#define MAILBOX_CLEAR_ADDR(cpu) \ + (MIPS_PHYS_TO_KSEG1(0x100200D0) | ((cpu) << 13)) + +static uint64_t +sb_read_syscfg(void) +{ + + return (sb_load64(SYSCFG_ADDR)); +} + +static void +sb_write_syscfg(uint64_t val) +{ + + sb_store64(SYSCFG_ADDR, val); +} + +uint64_t +sb_cpu_speed(void) +{ + int plldiv; + const uint64_t MHZ = 1000000; + + plldiv = SYSCFG_PLLDIV(sb_read_syscfg()); + if (plldiv == 0) { + printf("PLL_DIV is 0 - assuming 6 (300MHz).\n"); + plldiv = 6; + } + + return (plldiv * 50 * MHZ); +} + +void +sb_system_reset(void) +{ + uint64_t syscfg; + + const uint64_t SYSTEM_RESET = 1ULL << 60; + const uint64_t EXT_RESET = 1ULL << 59; + const uint64_t SOFT_RESET = 1ULL << 58; + + syscfg = sb_read_syscfg(); + syscfg &= ~SOFT_RESET; + syscfg |= SYSTEM_RESET | EXT_RESET; + sb_write_syscfg(syscfg); +} + +void +sb_disable_intsrc(int cpu, int src) +{ + uint32_t regaddr; + uint64_t val; + + regaddr = INTSRC_MASK_ADDR(cpu); + + val = sb_load64(regaddr); + val |= 1ULL << src; + sb_store64(regaddr, val); +} + +void +sb_enable_intsrc(int cpu, int src) +{ + uint32_t regaddr; + uint64_t val; + + regaddr = INTSRC_MASK_ADDR(cpu); + + val = sb_load64(regaddr); + val &= ~(1ULL << src); + sb_store64(regaddr, val); +} + +void +sb_write_intsrc_mask(int cpu, uint64_t val) +{ + uint32_t regaddr; + + regaddr = INTSRC_MASK_ADDR(cpu); + sb_store64(regaddr, val); +} + +uint64_t +sb_read_intsrc_mask(int cpu) +{ + uint32_t regaddr; + uint64_t val; + + regaddr = INTSRC_MASK_ADDR(cpu); + val = sb_load64(regaddr); + + return (val); +} + +void +sb_write_intmap(int cpu, int intsrc, int intrnum) +{ + uint32_t regaddr; + + regaddr = INTSRC_MAP_ADDR(cpu, intsrc); + sb_store64(regaddr, intrnum); +} + +int +sb_read_intmap(int cpu, int intsrc) +{ + uint32_t regaddr; + + regaddr = INTSRC_MAP_ADDR(cpu, intsrc); + return (sb_load64(regaddr) & 0x7); +} + +int +sb_route_intsrc(int intsrc) +{ + int intrnum; + + KASSERT(intsrc >= 0 && intsrc < NUM_INTSRC, + ("Invalid interrupt source number (%d)", intsrc)); + + /* + * Interrupt 5 is used by sources internal to the CPU (e.g. timer). + * Use a deterministic mapping for the remaining sources. + */ +#ifdef SMP + KASSERT(platform_ipi_intrnum() == 4, + ("Unexpected interrupt number used for IPI")); + intrnum = intsrc % 4; +#else + intrnum = intsrc % 5; +#endif + + return (intrnum); +} + +#ifdef SMP +static uint64_t +sb_read_sysrev(void) +{ + + return (sb_load64(SYSREV_ADDR)); +} + +void +sb_set_mailbox(int cpu, uint64_t val) +{ + uint32_t regaddr; + + regaddr = MAILBOX_SET_ADDR(cpu); + sb_store64(regaddr, val); +} + +void +sb_clear_mailbox(int cpu, uint64_t val) +{ + uint32_t regaddr; + + regaddr = MAILBOX_CLEAR_ADDR(cpu); + sb_store64(regaddr, val); +} + +int +platform_num_processors(void) +{ + + return (SYSREV_NUM_PROCESSORS(sb_read_sysrev())); +} +#endif /* SMP */ + +#define SCD_PHYSADDR 0x10000000 +#define SCD_SIZE 0x00060000 + +static int +scd_probe(device_t dev) +{ + + device_set_desc(dev, "Broadcom/Sibyte System Control and Debug"); + return (0); +} + +static int +scd_attach(device_t dev) +{ + int rid; + struct resource *res; + + if (bootverbose) + device_printf(dev, "attached.\n"); + + rid = 0; + res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, SCD_PHYSADDR, + SCD_PHYSADDR + SCD_SIZE - 1, SCD_SIZE, 0); + if (res == NULL) + panic("Cannot allocate resource for system control and debug."); + + return (0); +} + +static device_method_t scd_methods[] ={ + /* Device interface */ + DEVMETHOD(device_probe, scd_probe), + DEVMETHOD(device_attach, scd_attach), + DEVMETHOD(device_detach, bus_generic_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + { 0, 0 } +}; + +static driver_t scd_driver = { + "scd", + scd_methods +}; + +static devclass_t scd_devclass; + +DRIVER_MODULE(scd, zbbus, scd_driver, scd_devclass, 0, 0); diff --git a/sys/mips/sibyte/sb_scd.h b/sys/mips/sibyte/sb_scd.h new file mode 100644 index 000000000000..03d26811db63 --- /dev/null +++ b/sys/mips/sibyte/sb_scd.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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$ + */ + +#ifndef _SB_SCD_H_ +#define _SB_SCD_H_ + +#define NUM_INTSRC 64 /* total number of interrupt sources */ + +uint64_t sb_cpu_speed(void); +void sb_system_reset(void); + +int sb_route_intsrc(int src); +void sb_enable_intsrc(int cpu, int src); +void sb_disable_intsrc(int cpu, int src); +uint64_t sb_read_intsrc_mask(int cpu); +void sb_write_intsrc_mask(int cpu, uint64_t mask); +void sb_write_intmap(int cpu, int intsrc, int intrnum); +int sb_read_intmap(int cpu, int intsrc); + +#ifdef SMP +#define INTSRC_MAILBOX3 29 +void sb_set_mailbox(int cpuid, uint64_t val); +void sb_clear_mailbox(int cpuid, uint64_t val); +#endif + +#endif /* _SB_SCD_H_ */ diff --git a/sys/mips/sibyte/sb_zbbus.c b/sys/mips/sibyte/sb_zbbus.c new file mode 100644 index 000000000000..cd1685648968 --- /dev/null +++ b/sys/mips/sibyte/sb_zbbus.c @@ -0,0 +1,462 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "sb_scd.h" + +static MALLOC_DEFINE(M_INTMAP, "sb1250 intmap", "Sibyte 1250 Interrupt Mapper"); + +static struct mtx zbbus_intr_mtx; +MTX_SYSINIT(zbbus_intr_mtx, &zbbus_intr_mtx, "zbbus_intr_mask/unmask lock", + MTX_SPIN); + +/* + * This array holds the mapping between a MIPS hard interrupt and the + * interrupt sources that feed into that it. + */ +static uint64_t hardint_to_intsrc_mask[NHARD_IRQS]; + +struct sb_intmap { + int intsrc; /* interrupt mapper register number (0 - 63) */ + int hardint; /* cpu interrupt from 0 to NHARD_IRQS - 1 */ + + /* + * The device that the interrupt belongs to. Note that multiple + * devices may share an interrupt. For e.g. PCI_INT_x lines. + * + * The device 'dev' in combination with the 'rid' uniquely + * identify this interrupt source. + */ + device_t dev; + int rid; + + SLIST_ENTRY(sb_intmap) next; +}; + +static SLIST_HEAD(, sb_intmap) sb_intmap_head; + +static struct sb_intmap * +sb_intmap_lookup(int intrnum, device_t dev, int rid) +{ + struct sb_intmap *map; + + SLIST_FOREACH(map, &sb_intmap_head, next) { + if (dev == map->dev && rid == map->rid && + intrnum == map->hardint) + break; + } + return (map); +} + +/* + * Keep track of which (dev,rid,hardint) tuple is using the interrupt source. + * + * We don't actually unmask the interrupt source until the device calls + * a bus_setup_intr() on the resource. + */ +static void +sb_intmap_add(int intrnum, device_t dev, int rid, int intsrc) +{ + struct sb_intmap *map; + + KASSERT(intrnum >= 0 && intrnum < NHARD_IRQS, + ("intrnum is out of range: %d", intrnum)); + + map = sb_intmap_lookup(intrnum, dev, rid); + if (map) { + KASSERT(intsrc == map->intsrc, + ("%s%d allocating SYS_RES_IRQ resource with rid %d " + "with a different intsrc (%d versus %d)", + device_get_name(dev), device_get_unit(dev), rid, + intsrc, map->intsrc)); + return; + } + + map = malloc(sizeof(*map), M_INTMAP, M_WAITOK | M_ZERO); + map->intsrc = intsrc; + map->hardint = intrnum; + map->dev = dev; + map->rid = rid; + + SLIST_INSERT_HEAD(&sb_intmap_head, map, next); +} + +static void +sb_intmap_activate(int intrnum, device_t dev, int rid) +{ + struct sb_intmap *map; + + KASSERT(intrnum >= 0 && intrnum < NHARD_IRQS, + ("intrnum is out of range: %d", intrnum)); + + map = sb_intmap_lookup(intrnum, dev, rid); + if (map) { + /* + * Deliver all interrupts to CPU0. + */ + mtx_lock_spin(&zbbus_intr_mtx); + hardint_to_intsrc_mask[intrnum] |= 1ULL << map->intsrc; + sb_enable_intsrc(0, map->intsrc); + mtx_unlock_spin(&zbbus_intr_mtx); + } else { + /* + * In zbbus_setup_intr() we blindly call sb_intmap_activate() + * for every interrupt activation that comes our way. + * + * We might end up here if we did not "hijack" the SYS_RES_IRQ + * resource in zbbus_alloc_resource(). + */ + printf("sb_intmap_activate: unable to activate interrupt %d " + "for device %s%d rid %d.\n", intrnum, + device_get_name(dev), device_get_unit(dev), rid); + } +} + +/* + * Replace the default interrupt mask and unmask routines in intr_machdep.c + * with routines that are SMP-friendly. In contrast to the default mask/unmask + * routines in intr_machdep.c these routines do not change the SR.int_mask bits. + * + * Instead they use the interrupt mapper to either mask or unmask all + * interrupt sources feeding into a particular interrupt line of the processor. + * + * This means that these routines have an identical effect irrespective of + * which cpu is executing them. This is important because the ithread may + * be scheduled to run on either of the cpus. + */ +static void +zbbus_intr_mask(void *arg) +{ + uint64_t mask; + int irq; + + irq = (uintptr_t)arg; + + mtx_lock_spin(&zbbus_intr_mtx); + + mask = sb_read_intsrc_mask(0); + mask |= hardint_to_intsrc_mask[irq]; + sb_write_intsrc_mask(0, mask); + + mtx_unlock_spin(&zbbus_intr_mtx); +} + +static void +zbbus_intr_unmask(void *arg) +{ + uint64_t mask; + int irq; + + irq = (uintptr_t)arg; + + mtx_lock_spin(&zbbus_intr_mtx); + + mask = sb_read_intsrc_mask(0); + mask &= ~hardint_to_intsrc_mask[irq]; + sb_write_intsrc_mask(0, mask); + + mtx_unlock_spin(&zbbus_intr_mtx); +} + +struct zbbus_devinfo { + struct resource_list resources; +}; + +static MALLOC_DEFINE(M_ZBBUSDEV, "zbbusdev", "zbbusdev"); + +static int +zbbus_probe(device_t dev) +{ + + device_set_desc(dev, "Broadcom/Sibyte ZBbus"); + return (0); +} + +static int +zbbus_attach(device_t dev) +{ + + if (bootverbose) { + device_printf(dev, "attached.\n"); + } + + cpu_set_hardintr_mask_func(zbbus_intr_mask); + cpu_set_hardintr_unmask_func(zbbus_intr_unmask); + + bus_generic_probe(dev); + bus_enumerate_hinted_children(dev); + bus_generic_attach(dev); + + return (0); +} + +static void +zbbus_hinted_child(device_t bus, const char *dname, int dunit) +{ + device_t child; + long maddr, msize; + int err, irq; + + if (resource_disabled(dname, dunit)) + return; + + child = BUS_ADD_CHILD(bus, 0, dname, dunit); + if (child == NULL) { + panic("zbbus: could not add child %s unit %d\n", dname, dunit); + } + + if (bootverbose) + device_printf(bus, "Adding hinted child %s%d\n", dname, dunit); + + /* + * Assign any pre-defined resources to the child. + */ + if (resource_long_value(dname, dunit, "msize", &msize) == 0 && + resource_long_value(dname, dunit, "maddr", &maddr) == 0) { + if (bootverbose) { + device_printf(bus, "Assigning memory resource " + "0x%0lx/%ld to child %s%d\n", + maddr, msize, dname, dunit); + } + err = bus_set_resource(child, SYS_RES_MEMORY, 0, maddr, msize); + if (err) { + device_printf(bus, "Unable to set memory resource " + "0x%0lx/%ld for child %s%d: %d\n", + maddr, msize, dname, dunit, err); + } + } + + if (resource_int_value(dname, dunit, "irq", &irq) == 0) { + if (bootverbose) { + device_printf(bus, "Assigning irq resource %d to " + "child %s%d\n", irq, dname, dunit); + } + err = bus_set_resource(child, SYS_RES_IRQ, 0, irq, 1); + if (err) { + device_printf(bus, "Unable to set irq resource %d" + "for child %s%d: %d\n", + irq, dname, dunit, err); + } + } +} + +static struct resource * +zbbus_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct resource *res; + int intrnum, intsrc, isdefault; + struct resource_list *rl; + struct resource_list_entry *rle; + struct zbbus_devinfo *dinfo; + + isdefault = (start == 0UL && end == ~0UL && count == 1); + + /* + * Our direct child is asking for a default resource allocation. + */ + if (device_get_parent(child) == bus) { + dinfo = device_get_ivars(child); + rl = &dinfo->resources; + rle = resource_list_find(rl, type, *rid); + if (rle) { + if (rle->res) + panic("zbbus_alloc_resource: resource is busy"); + if (isdefault) { + start = rle->start; + count = ulmax(count, rle->count); + end = ulmax(rle->end, start + count - 1); + } + } else { + if (isdefault) { + /* + * Our child is requesting a default + * resource allocation but we don't have the + * 'type/rid' tuple in the resource list. + * + * We have to fail the resource allocation. + */ + return (NULL); + } else { + /* + * The child is requesting a non-default + * resource. We just pass the request up + * to our parent. If the resource allocation + * succeeds we will create a resource list + * entry corresponding to that resource. + */ + } + } + } else { + rl = NULL; + rle = NULL; + } + + /* + * nexus doesn't know about the interrupt mapper and only wants to + * see the hard irq numbers [0-6]. We translate from the interrupt + * source presented to the mapper to the interrupt number presented + * to the cpu. + */ + if ((count == 1) && (type == SYS_RES_IRQ)) { + intsrc = start; + intrnum = sb_route_intsrc(intsrc); + start = end = intrnum; + } else { + intsrc = -1; /* satisfy gcc */ + intrnum = -1; + } + + res = bus_generic_alloc_resource(bus, child, type, rid, + start, end, count, flags); + + /* + * Keep track of the input into the interrupt mapper that maps + * to the resource allocated by 'child' with resource id 'rid'. + * + * If we don't record the mapping here then we won't be able to + * locate the interrupt source when bus_setup_intr(child,rid) is + * called. + */ + if (res != NULL && intrnum != -1) + sb_intmap_add(intrnum, child, rman_get_rid(res), intsrc); + + /* + * If a non-default resource allocation by our child was successful + * then keep track of the resource in the resource list associated + * with the child. + */ + if (res != NULL && rle == NULL && device_get_parent(child) == bus) { + resource_list_add(rl, type, *rid, start, end, count); + rle = resource_list_find(rl, type, *rid); + if (rle == NULL) + panic("zbbus_alloc_resource: cannot find resource"); + } + + if (rle != NULL) { + KASSERT(device_get_parent(child) == bus, + ("rle should be NULL for passthru device")); + rle->res = res; + if (rle->res) { + rle->start = rman_get_start(rle->res); + rle->end = rman_get_end(rle->res); + rle->count = count; + } + } + + return (res); +} + +static int +zbbus_setup_intr(device_t dev, device_t child, struct resource *irq, int flags, + driver_filter_t *filter, driver_intr_t *intr, void *arg, + void **cookiep) +{ + int error; + + error = bus_generic_setup_intr(dev, child, irq, flags, + filter, intr, arg, cookiep); + if (error == 0) + sb_intmap_activate(rman_get_start(irq), child, + rman_get_rid(irq)); + + return (error); +} + +static device_t +zbbus_add_child(device_t bus, int order, const char *name, int unit) +{ + device_t child; + struct zbbus_devinfo *dinfo; + + child = device_add_child_ordered(bus, order, name, unit); + if (child != NULL) { + dinfo = malloc(sizeof(struct zbbus_devinfo), M_ZBBUSDEV, + M_WAITOK | M_ZERO); + resource_list_init(&dinfo->resources); + device_set_ivars(child, dinfo); + } + + return (child); +} + +static struct resource_list * +zbbus_get_resource_list(device_t dev, device_t child) +{ + struct zbbus_devinfo *dinfo = device_get_ivars(child); + + return (&dinfo->resources); +} + +static device_method_t zbbus_methods[] ={ + /* Device interface */ + DEVMETHOD(device_probe, zbbus_probe), + DEVMETHOD(device_attach, zbbus_attach), + DEVMETHOD(device_detach, bus_generic_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + /* Bus interface */ + DEVMETHOD(bus_alloc_resource, zbbus_alloc_resource), + DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), + DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_release_resource, bus_generic_release_resource), + DEVMETHOD(bus_get_resource_list,zbbus_get_resource_list), + DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), + DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), + DEVMETHOD(bus_delete_resource, bus_generic_rl_delete_resource), + DEVMETHOD(bus_setup_intr, zbbus_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_add_child, zbbus_add_child), + DEVMETHOD(bus_hinted_child, zbbus_hinted_child), + + { 0, 0 } +}; + +static driver_t zbbus_driver = { + "zbbus", + zbbus_methods +}; + +static devclass_t zbbus_devclass; + +DRIVER_MODULE(zbbus, nexus, zbbus_driver, zbbus_devclass, 0, 0); diff --git a/sys/mips/sibyte/sb_zbpci.c b/sys/mips/sibyte/sb_zbpci.c new file mode 100644 index 000000000000..42fed5e161f2 --- /dev/null +++ b/sys/mips/sibyte/sb_zbpci.c @@ -0,0 +1,544 @@ +/*- + * Copyright (c) 2009 Neelkanth Natu + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "pcib_if.h" + +#include "sb_bus_space.h" +#include "sb_scd.h" + +__FBSDID("$FreeBSD$"); + +static struct { + vm_offset_t vaddr; + vm_paddr_t paddr; +} zbpci_config_space[MAXCPU]; + +static const vm_paddr_t CFG_PADDR_BASE = 0xFE000000; +static const u_long PCI_IOSPACE_ADDR = 0xFC000000; +static const u_long PCI_IOSPACE_SIZE = 0x02000000; + +#define PCI_MATCH_BYTE_LANES_START 0x40000000 +#define PCI_MATCH_BYTE_LANES_END 0x5FFFFFFF +#define PCI_MATCH_BYTE_LANES_SIZE 0x20000000 + +#define PCI_MATCH_BIT_LANES_MASK (1 << 29) +#define PCI_MATCH_BIT_LANES_START 0x60000000 +#define PCI_MATCH_BIT_LANES_END 0x7FFFFFFF +#define PCI_MATCH_BIT_LANES_SIZE 0x20000000 + +static struct rman port_rman; + +static int +zbpci_probe(device_t dev) +{ + + device_set_desc(dev, "Broadcom/Sibyte PCI I/O Bridge"); + return (0); +} + +static int +zbpci_attach(device_t dev) +{ + int n, rid, size; + vm_offset_t va; + struct resource *res; + + /* + * Reserve the physical memory window used to map PCI I/O space. + */ + rid = 0; + res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + PCI_IOSPACE_ADDR, + PCI_IOSPACE_ADDR + PCI_IOSPACE_SIZE - 1, + PCI_IOSPACE_SIZE, 0); + if (res == NULL) + panic("Cannot allocate resource for PCI I/O space mapping."); + + port_rman.rm_start = 0; + port_rman.rm_end = PCI_IOSPACE_SIZE - 1; + port_rman.rm_type = RMAN_ARRAY; + port_rman.rm_descr = "PCI I/O ports"; + if (rman_init(&port_rman) != 0 || + rman_manage_region(&port_rman, 0, PCI_IOSPACE_SIZE - 1) != 0) + panic("%s: port_rman", __func__); + + /* + * Reserve the the physical memory that is used to read/write to the + * pci config space but don't activate it. We are using a page worth + * of KVA as a window over this region. + */ + rid = 1; + size = (PCI_BUSMAX + 1) * (PCI_SLOTMAX + 1) * (PCI_FUNCMAX + 1) * 256; + res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, CFG_PADDR_BASE, + CFG_PADDR_BASE + size - 1, size, 0); + if (res == NULL) + panic("Cannot allocate resource for config space accesses."); + + /* + * Allocate the entire "match bit lanes" address space. + */ +#if _BYTE_ORDER == _BIG_ENDIAN + rid = 2; + res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, + PCI_MATCH_BIT_LANES_START, + PCI_MATCH_BIT_LANES_END, + PCI_MATCH_BIT_LANES_SIZE, 0); + if (res == NULL) + panic("Cannot allocate resource for pci match bit lanes."); +#endif /* _BYTE_ORDER ==_BIG_ENDIAN */ + + /* + * Allocate KVA for accessing PCI config space. + */ + va = kmem_alloc_nofault(kernel_map, PAGE_SIZE * mp_ncpus); + if (va == 0) { + device_printf(dev, "Cannot allocate virtual addresses for " + "config space access.\n"); + return (ENOMEM); + } + + for (n = 0; n < mp_ncpus; ++n) + zbpci_config_space[n].vaddr = va + n * PAGE_SIZE; + + /* + * Sibyte has the PCI bus hierarchy rooted at bus 0 and HT-PCI + * hierarchy rooted at bus 1. + */ + if (device_add_child(dev, "pci", 0) == NULL) + panic("zbpci_attach: could not add pci bus 0.\n"); + + if (device_add_child(dev, "pci", 1) == NULL) + panic("zbpci_attach: could not add pci bus 1.\n"); + + if (bootverbose) + device_printf(dev, "attached.\n"); + + return (bus_generic_attach(dev)); +} + +static struct resource * +zbpci_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct resource *res; + + /* + * Handle PCI I/O port resources here and pass everything else to nexus. + */ + if (type != SYS_RES_IOPORT) { + res = bus_generic_alloc_resource(bus, child, type, rid, + start, end, count, flags); + return (res); + } + + res = rman_reserve_resource(&port_rman, start, end, count, + flags, child); + if (res == NULL) + return (NULL); + + rman_set_rid(res, *rid); + + /* Activate the resource is requested */ + if (flags & RF_ACTIVE) { + if (bus_activate_resource(child, type, *rid, res) != 0) { + rman_release_resource(res); + return (NULL); + } + } + + return (res); +} + +static int +zbpci_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *res) +{ + int error; + void *vaddr; + u_long orig_paddr, paddr, psize; + + paddr = rman_get_start(res); + psize = rman_get_size(res); + orig_paddr = paddr; + +#if _BYTE_ORDER == _BIG_ENDIAN + /* + * The CFE allocates PCI memory resources that map to the + * "match byte lanes" address space. This address space works + * best for DMA transfers because it does not do any automatic + * byte swaps when data crosses the pci-cpu interface. + * + * This also makes it sub-optimal for accesses to PCI device + * registers because it exposes the little-endian nature of + * the PCI bus to the big-endian CPU. The Sibyte has another + * address window called the "match bit lanes" window which + * automatically swaps bytes when data crosses the pci-cpu + * interface. + * + * We "assume" that any bus_space memory accesses done by the + * CPU to a PCI device are register/configuration accesses and + * are done through the "match bit lanes" window. Any DMA + * transfers will continue to be through the "match byte lanes" + * window because the PCI BAR registers will not be changed. + */ + if (type == SYS_RES_MEMORY) { + if (paddr >= PCI_MATCH_BYTE_LANES_START && + paddr + psize - 1 <= PCI_MATCH_BYTE_LANES_END) { + paddr |= PCI_MATCH_BIT_LANES_MASK; + rman_set_start(res, paddr); + rman_set_end(res, paddr + psize - 1); + } + } +#endif + + if (type != SYS_RES_IOPORT) { + error = bus_generic_activate_resource(bus, child, type, + rid, res); +#if _BYTE_ORDER == _BIG_ENDIAN + if (type == SYS_RES_MEMORY) { + rman_set_start(res, orig_paddr); + rman_set_end(res, orig_paddr + psize - 1); + } +#endif + return (error); + } + + /* + * Map the I/O space resource through the memory window starting + * at PCI_IOSPACE_ADDR. + */ + vaddr = pmap_mapdev(paddr + PCI_IOSPACE_ADDR, psize); + + rman_set_virtual(res, vaddr); + rman_set_bustag(res, mips_bus_space_generic); + rman_set_bushandle(res, (bus_space_handle_t)vaddr); + + return (rman_activate_resource(res)); +} + +static int +zbpci_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + int error; + + if (type != SYS_RES_IOPORT) + return (bus_generic_release_resource(bus, child, type, rid, r)); + + if (rman_get_flags(r) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, r); + if (error) + return (error); + } + + return (rman_release_resource(r)); +} + +static int +zbpci_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + vm_offset_t va; + + if (type != SYS_RES_IOPORT) { + return (bus_generic_deactivate_resource(bus, child, type, + rid, r)); + } + + va = (vm_offset_t)rman_get_virtual(r); + pmap_unmapdev(va, rman_get_size(r)); + + return (rman_deactivate_resource(r)); +} + +static int +zbpci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) +{ + + switch (which) { + case PCIB_IVAR_DOMAIN: + *result = 0; /* single PCI domain */ + return (0); + case PCIB_IVAR_BUS: + *result = device_get_unit(child); /* PCI bus 0 or 1 */ + return (0); + default: + return (ENOENT); + } +} + +/* + * We rely on the CFE to have configured the intline correctly to point to + * one of PCI-A/PCI-B/PCI-C/PCI-D in the interupt mapper. + */ +static int +zbpci_route_interrupt(device_t pcib, device_t dev, int pin) +{ + + return (PCI_INVALID_IRQ); +} + +/* + * This function is expected to be called in a critical section since it + * changes the per-cpu pci config space va-to-pa mappings. + */ +static vm_offset_t +zbpci_config_space_va(int bus, int slot, int func, int reg, int bytes) +{ + int cpu; + vm_offset_t va_page; + vm_paddr_t pa, pa_page; + + if (bus <= PCI_BUSMAX && slot <= PCI_SLOTMAX && func <= PCI_FUNCMAX && + reg <= PCI_REGMAX && (bytes == 1 || bytes == 2 || bytes == 4) && + ((reg & (bytes - 1)) == 0)) { + cpu = PCPU_GET(cpuid); + va_page = zbpci_config_space[cpu].vaddr; + pa = CFG_PADDR_BASE | + (bus << 16) | (slot << 11) | (func << 8) | reg; +#if _BYTE_ORDER == _BIG_ENDIAN + pa = pa ^ (4 - bytes); +#endif + pa_page = pa & ~(PAGE_SIZE - 1); + if (zbpci_config_space[cpu].paddr != pa_page) { + pmap_kremove(va_page); + pmap_kenter(va_page, pa_page); + zbpci_config_space[cpu].paddr = pa_page; + } + return (va_page + (pa - pa_page)); + } else { + return (0); + } +} + +static uint32_t +zbpci_read_config(device_t dev, u_int b, u_int s, u_int f, u_int r, int w) +{ + uint32_t data; + vm_offset_t va; + + critical_enter(); + + va = zbpci_config_space_va(b, s, f, r, w); + if (va == 0) { + panic("zbpci_read_config: invalid %d/%d/%d[%d] %d\n", + b, s, f, r, w); + } + + switch (w) { + case 4: + data = *(uint32_t *)va; + break; + case 2: + data = *(uint16_t *)va; + break; + case 1: + data = *(uint8_t *)va; + break; + default: + panic("zbpci_read_config: invalid width %d\n", w); + } + + critical_exit(); + + return (data); +} + +static void +zbpci_write_config(device_t d, u_int b, u_int s, u_int f, u_int r, + uint32_t data, int w) +{ + vm_offset_t va; + + critical_enter(); + + va = zbpci_config_space_va(b, s, f, r, w); + if (va == 0) { + panic("zbpci_write_config: invalid %d/%d/%d[%d] %d/%d\n", + b, s, f, r, data, w); + } + + switch (w) { + case 4: + *(uint32_t *)va = data; + break; + case 2: + *(uint16_t *)va = data; + break; + case 1: + *(uint8_t *)va = data; + break; + default: + panic("zbpci_write_config: invalid width %d\n", w); + } + + critical_exit(); +} + +static device_method_t zbpci_methods[] ={ + /* Device interface */ + DEVMETHOD(device_probe, zbpci_probe), + DEVMETHOD(device_attach, zbpci_attach), + DEVMETHOD(device_detach, bus_generic_detach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + /* Bus interface */ + DEVMETHOD(bus_read_ivar, zbpci_read_ivar), + DEVMETHOD(bus_write_ivar, bus_generic_write_ivar), + DEVMETHOD(bus_alloc_resource, zbpci_alloc_resource), + DEVMETHOD(bus_activate_resource, zbpci_activate_resource), + DEVMETHOD(bus_deactivate_resource, zbpci_deactivate_resource), + DEVMETHOD(bus_release_resource, zbpci_release_resource), + DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_add_child, bus_generic_add_child), + + /* pcib interface */ + DEVMETHOD(pcib_maxslots, pcib_maxslots), + DEVMETHOD(pcib_read_config, zbpci_read_config), + DEVMETHOD(pcib_write_config, zbpci_write_config), + DEVMETHOD(pcib_route_interrupt, zbpci_route_interrupt), + + { 0, 0 } +}; + +/* + * The "zbpci" class inherits from the "pcib" base class. Therefore in + * addition to drivers that belong to the "zbpci" class we will also + * consider drivers belonging to the "pcib" when probing children of + * "zbpci". + */ +DECLARE_CLASS(pcib_driver); +DEFINE_CLASS_1(zbpci, zbpci_driver, zbpci_methods, 0, pcib_driver); + +static devclass_t zbpci_devclass; + +DRIVER_MODULE(zbpci, zbbus, zbpci_driver, zbpci_devclass, 0, 0); + +/* + * Big endian bus space routines + */ +#if _BYTE_ORDER == _BIG_ENDIAN + +/* + * The CPU correctly deals with the big-endian to little-endian swap if + * we are accessing 4 bytes at a time. However if we want to read 1 or 2 + * bytes then we need to fudge the address generated by the CPU such that + * it generates the right byte enables on the PCI bus. + */ +static bus_addr_t +sb_match_bit_lane_addr(bus_addr_t addr, int bytes) +{ + vm_offset_t pa; + + pa = vtophys(addr); + + if (pa >= PCI_MATCH_BIT_LANES_START && pa <= PCI_MATCH_BIT_LANES_END) + return (addr ^ (4 - bytes)); + else + return (addr); +} + +uint8_t +sb_big_endian_read8(bus_addr_t addr) +{ + bus_addr_t addr2; + + addr2 = sb_match_bit_lane_addr(addr, 1); + return (readb(addr2)); +} + +uint16_t +sb_big_endian_read16(bus_addr_t addr) +{ + bus_addr_t addr2; + + addr2 = sb_match_bit_lane_addr(addr, 2); + return (readw(addr2)); +} + +uint32_t +sb_big_endian_read32(bus_addr_t addr) +{ + bus_addr_t addr2; + + addr2 = sb_match_bit_lane_addr(addr, 4); + return (readl(addr2)); +} + +void +sb_big_endian_write8(bus_addr_t addr, uint8_t val) +{ + bus_addr_t addr2; + + addr2 = sb_match_bit_lane_addr(addr, 1); + writeb(addr2, val); +} + +void +sb_big_endian_write16(bus_addr_t addr, uint16_t val) +{ + bus_addr_t addr2; + + addr2 = sb_match_bit_lane_addr(addr, 2); + writew(addr2, val); +} + +void +sb_big_endian_write32(bus_addr_t addr, uint32_t val) +{ + bus_addr_t addr2; + + addr2 = sb_match_bit_lane_addr(addr, 4); + writel(addr2, val); +} +#endif /* _BIG_ENDIAN */ diff --git a/sys/modules/Makefile b/sys/modules/Makefile index 88d02997814d..0934772573d8 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -18,10 +18,11 @@ SUBDIR= ${_3dfx} \ ${_aic} \ aic7xxx \ aio \ - ${_amd} \ - ${_amdtemp} \ alc \ ale \ + ${_amd} \ + ${_amdsbwd} \ + ${_amdtemp} \ amr \ ${_an} \ ${_aout} \ @@ -41,6 +42,7 @@ SUBDIR= ${_3dfx} \ ${_bm} \ bridgestp \ bwi \ + bwn \ cam \ ${_canbepm} \ ${_canbus} \ @@ -80,6 +82,7 @@ SUBDIR= ${_3dfx} \ ${_em} \ en \ ${_ep} \ + ${_epic} \ ${_et} \ ${_ex} \ ${_exca} \ @@ -190,8 +193,9 @@ SUBDIR= ${_3dfx} \ ${_ncp} \ ${_ncv} \ ${_ndis} \ - netgraph \ + ${_netgraph} \ ${_nfe} \ + nfs_common \ nfscl \ nfsclient \ nfscommon \ @@ -237,6 +241,7 @@ SUBDIR= ${_3dfx} \ re \ reiserfs \ rl \ + runfw \ ${_s3} \ ${_safe} \ ${_sbni} \ @@ -246,6 +251,7 @@ SUBDIR= ${_3dfx} \ sdhci \ sem \ sf \ + siba_bwn \ siis \ sis \ sk \ @@ -325,6 +331,10 @@ _random= random _ipfilter= ipfilter .endif +.if ${MK_NETGRAPH} != "no" || defined(ALL_MODULES) +_netgraph= netgraph +.endif + .if ${MK_PF} != "no" || defined(ALL_MODULES) _pf= pf _pflog= pflog @@ -416,6 +426,7 @@ _zfs= zfs _aac= aac _acpi= acpi _ahb= ahb +_amdsbwd= amdsbwd _amdtemp= amdtemp _arcmsr= arcmsr _asmc= asmc @@ -472,6 +483,7 @@ _aac= aac _acpi= acpi _agp= agp _an= an +_amdsbwd= amdsbwd _amdtemp= amdtemp _arcmsr= arcmsr _asmc= asmc @@ -509,6 +521,8 @@ _ipmi= ipmi _ips= ips _ipw= ipw _ipwfw= ipwfw +_iwi= iwi +_iwifw= iwifw _iwn= iwn _iwnfw= iwnfw _ixgb= ixgb @@ -599,11 +613,13 @@ _sound= sound .if ${MACHINE_ARCH} == "sparc64" _auxio= auxio _em= em +_epic= epic _i2c= i2c _igb= igb .if ${MK_CDDL} != "no" || defined(ALL_MODULES) _opensolaris= opensolaris .endif +_smbfs= smbfs _sound= sound .if ${MK_ZFS} != "no" || defined(ALL_MODULES) _zfs= zfs diff --git a/sys/modules/acpi/acpi/Makefile b/sys/modules/acpi/acpi/Makefile index 24e688d7ceab..992c59c09a6a 100644 --- a/sys/modules/acpi/acpi/Makefile +++ b/sys/modules/acpi/acpi/Makefile @@ -27,6 +27,10 @@ KMOD= acpi # ACPI CA sources +SRCS+= dbcmds.c dbdisply.c dbexec.c dbfileio.c dbhistry.c dbinput.c dbstats.c +SRCS+= dbutils.c dbxface.c +SRCS+= dmbuffer.c dmnames.c dmopcode.c dmobject.c dmresrc.c dmresrcl.c +SRCS+= dmresrcs.c dmutils.c dmwalk.c SRCS+= dsfield.c dsinit.c dsmethod.c dsmthdat.c dsobject.c dsopcode.c SRCS+= dsutils.c dswexec.c dswload.c dswscope.c dswstate.c SRCS+= evevent.c evgpe.c evgpeblk.c evmisc.c evregion.c evrgnini.c evsci.c @@ -37,8 +41,8 @@ SRCS+= exprep.c exregion.c exresnte.c exresolv.c exresop.c exstore.c SRCS+= exstoren.c exstorob.c exsystem.c exutils.c SRCS+= hwacpi.c hwgpe.c hwregs.c hwsleep.c hwtimer.c hwvalid.c hwxface.c SRCS+= nsaccess.c nsalloc.c nsdump.c nseval.c nsinit.c nsload.c nsnames.c -SRCS+= nsobject.c nsparse.c nspredef.c nsrepair.c nssearch.c nsutils.c -SRCS+= nswalk.c nsxfeval.c nsxfname.c nsxfobj.c +SRCS+= nsobject.c nsparse.c nspredef.c nsrepair.c nsrepair2.c nssearch.c +SRCS+= nsutils.c nswalk.c nsxfeval.c nsxfname.c nsxfobj.c SRCS+= psargs.c psloop.c psopcode.c psparse.c psscope.c pstree.c psutils.c SRCS+= pswalk.c psxface.c SRCS+= rsaddr.c rscalc.c rscreate.c rsdump.c rsinfo.c rsio.c rsirq.c rslist.c @@ -69,12 +73,6 @@ SRCS+= cpufreq_if.h device_if.h isa_if.h pci_if.h pcib_if.h # This obviously needs a better and more structural fix. SRCS+= opt_kstack_pages.h opt_nfs.h opt_apic.h opt_compat.h opt_hwpmc_hooks.h -# Debugging support -DBSRC= dbcmds.c dbdisply.c dbexec.c dbfileio.c dbhistry.c dbinput.c dbstats.c -DBSRC+= dbutils.c dbxface.c -DBSRC+= dmbuffer.c dmnames.c dmopcode.c dmobject.c dmresrc.c dmresrcl.c -DBSRC+= dmresrcs.c dmutils.c dmwalk.c - .if !defined(KERNBUILDDIR) .if KTR CFLAGS+=-DKTR @@ -87,7 +85,6 @@ CFLAGS+=-DACPI_MAX_THREADS=${ACPI_MAX_THREADS} .endif .if ACPI_DEBUG CFLAGS+=-DACPI_DEBUG -SRCS+= ${DBSRC} opt_ddb.h: Makefile echo "#define DDB 1" > ${.TARGET} .else @@ -98,10 +95,12 @@ opt_ddb.h: Makefile # Machine-specific code such as sleep/wakeup SRCS+= acpi_machdep.c acpi_wakecode.h acpi_wakeup.c -.if ${MACHINE} == "i386" -SRCS+= madt.c assym.s +SRCS+= assym.s madt.c +CLEANFILES+= acpi_wakecode.bin acpi_wakecode.h acpi_wakecode.o +.if ${MACHINE_ARCH} == "amd64" +SRCS+= opt_global.h +CLEANFILES+= acpi_wakedata.h .endif -CLEANFILES+= acpi_wakecode.h acpi_wakecode.o acpi_wakecode.bin ${DBSRC:.c=.o} acpi_wakecode.h: acpi_wakecode.S assym.s ${MAKE} -f ${.CURDIR}/../../../${MACHINE_ARCH}/acpica/Makefile \ diff --git a/sys/modules/amdsbwd/Makefile b/sys/modules/amdsbwd/Makefile new file mode 100644 index 000000000000..56f9ab79b873 --- /dev/null +++ b/sys/modules/amdsbwd/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../dev/amdsbwd +KMOD = amdsbwd +SRCS = amdsbwd.c +SRCS += device_if.h bus_if.h pci_if.h isa_if.h + +.include diff --git a/sys/modules/ata/atausb/Makefile b/sys/modules/ata/atausb/Makefile deleted file mode 100644 index 714adfee5d4f..000000000000 --- a/sys/modules/ata/atausb/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../../../dev/ata - -KMOD= atausb -SRCS= ata-usb.c -SRCS+= opt_bus.h opt_usb.h opt_ata.h usbdevs.h -SRCS+= ata_if.h device_if.h bus_if.h pci_if.h usb_if.h - -.include diff --git a/sys/modules/ath/Makefile b/sys/modules/ath/Makefile index d494c45634c5..a8bb5eabf961 100644 --- a/sys/modules/ath/Makefile +++ b/sys/modules/ath/Makefile @@ -82,15 +82,17 @@ SRCS+= ar5413.c # NB: 9160 depends on 5416 but 5416 does not require 9160 # .PATH: ${.CURDIR}/../../dev/ath/ath_hal/ar5416 -SRCS+= ah_eeprom_v14.c \ +SRCS+= ah_eeprom_v14.c ah_eeprom_v4k.c \ ar5416_ani.c ar5416_attach.c ar5416_beacon.c ar5416_cal.c \ ar5416_cal_iq.c ar5416_cal_adcgain.c ar5416_cal_adcdc.c \ ar5416_eeprom.c ar5416_gpio.c ar5416_interrupts.c ar5416_keycache.c \ ar5416_misc.c ar5416_phy.c ar5416_power.c ar5416_recv.c \ ar5416_reset.c ar5416_xmit.c SRCS+= ar9160_attach.c +SRCS+= ar9280.c ar9280_attach.c # RF backend for 5416 and 9160 SRCS+= ar2133.c +SRCS+= ar9285.c ar9285_attach.c # NB: rate control is bound to the driver by symbol names so only pick one .if ${ATH_RATE} == "sample" diff --git a/sys/modules/bios/smbios/Makefile b/sys/modules/bios/smbios/Makefile index 40df8e80db47..b7bdf4819b72 100644 --- a/sys/modules/bios/smbios/Makefile +++ b/sys/modules/bios/smbios/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ # -.PATH: ${.CURDIR}/../../../i386/bios +.PATH: ${.CURDIR}/../../../x86/bios KMOD= smbios SRCS= smbios.c \ diff --git a/sys/modules/bios/vpd/Makefile b/sys/modules/bios/vpd/Makefile index d1dd8f1d9215..093ac81f59b8 100644 --- a/sys/modules/bios/vpd/Makefile +++ b/sys/modules/bios/vpd/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ # -.PATH: ${.CURDIR}/../../../i386/bios +.PATH: ${.CURDIR}/../../../x86/bios KMOD= vpd SRCS= vpd.c \ diff --git a/sys/modules/bwn/Makefile b/sys/modules/bwn/Makefile new file mode 100644 index 000000000000..a5b18aa231aa --- /dev/null +++ b/sys/modules/bwn/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../dev/bwn + +KMOD= if_bwn +SRCS= if_bwn.c if_bwnreg.h if_bwnvar.h +SRCS+= device_if.h bus_if.h pci_if.h + +.include diff --git a/sys/modules/cam/Makefile b/sys/modules/cam/Makefile index ca5c56a7b1ae..30f1f8936baf 100644 --- a/sys/modules/cam/Makefile +++ b/sys/modules/cam/Makefile @@ -28,6 +28,7 @@ SRCS+= scsi_xpt.c SRCS+= ata_all.c SRCS+= ata_xpt.c SRCS+= ata_da.c +SRCS+= ata_pmp.c EXPORT_SYMS= YES # XXX evaluate diff --git a/sys/modules/cpufreq/Makefile b/sys/modules/cpufreq/Makefile index 75b5c86b2a3d..894096ff14aa 100644 --- a/sys/modules/cpufreq/Makefile +++ b/sys/modules/cpufreq/Makefile @@ -8,7 +8,7 @@ SRCS= ichss.c SRCS+= bus_if.h cpufreq_if.h device_if.h pci_if.h .if ${MACHINE} == "i386" || ${MACHINE} == "amd64" -.PATH: ${.CURDIR}/../../i386/cpufreq +.PATH: ${.CURDIR}/../../x86/cpufreq SRCS+= acpi_if.h opt_acpi.h SRCS+= est.c hwpstate.c p4tcc.c powernow.c diff --git a/sys/modules/crypto/Makefile b/sys/modules/crypto/Makefile index 891f7e473474..be801db598d4 100644 --- a/sys/modules/crypto/Makefile +++ b/sys/modules/crypto/Makefile @@ -16,6 +16,6 @@ SRCS += skipjack.c bf_enc.c bf_skey.c SRCS += des_ecb.c des_enc.c des_setkey.c SRCS += sha1.c sha2.c SRCS += opt_param.h cryptodev_if.h bus_if.h device_if.h -SRCS += opt_ddb.h +SRCS += opt_ddb.h opt_kdtrace.h SRCS += camellia.c camellia-api.c .include diff --git a/sys/modules/cxgb/cxgb/Makefile b/sys/modules/cxgb/cxgb/Makefile index 8a5791c358f1..9a433b200bc0 100644 --- a/sys/modules/cxgb/cxgb/Makefile +++ b/sys/modules/cxgb/cxgb/Makefile @@ -5,20 +5,12 @@ CXGB = ${.CURDIR}/../../../dev/cxgb KMOD= if_cxgb SRCS= cxgb_mc5.c cxgb_vsc8211.c cxgb_ael1002.c cxgb_mv88e1xxx.c -SRCS+= cxgb_xgmac.c cxgb_vsc7323.c cxgb_t3_hw.c cxgb_main.c +SRCS+= cxgb_xgmac.c cxgb_vsc7323.c cxgb_t3_hw.c cxgb_main.c cxgb_aq100x.c SRCS+= cxgb_sge.c cxgb_offload.c cxgb_tn1010.c SRCS+= device_if.h bus_if.h pci_if.h SRCS+= opt_inet.h opt_zero.h opt_sched.h SRCS+= uipc_mvec.c CFLAGS+= -g -DDEFAULT_JUMBO -I${CXGB} -CFLAGS+= -DDISABLE_MBUF_IOVEC -#CFLAGS+= -DIFNET_MULTIQUEUE -#CFLAGS+= -DDISABLE_MBUF_IOVEC -#CFLAGS+= -DDEBUG -DDEBUG_PRINT -#CFLAGS+= -DINVARIANT_SUPPORT -DINVARIANTS -#CFLAGS+= -DWITNESS -#CFLAGS += -DLOCK_PROFILING -#CFLAGS+= -DWITNESS .include diff --git a/sys/modules/dpms/Makefile b/sys/modules/dpms/Makefile index d1d58ffe607c..4eabf14fc98b 100644 --- a/sys/modules/dpms/Makefile +++ b/sys/modules/dpms/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ KMOD= dpms -SRCS= bus_if.h device_if.h +SRCS= bus_if.h device_if.h pci_if.h .PATH: ${.CURDIR}/../../dev/dpms SRCS+= dpms.c diff --git a/sys/modules/drm/Makefile b/sys/modules/drm/Makefile index a953b3700ebb..c2c74a522056 100644 --- a/sys/modules/drm/Makefile +++ b/sys/modules/drm/Makefile @@ -9,6 +9,7 @@ SUBDIR = \ radeon \ savage \ sis \ - tdfx + tdfx \ + via .include diff --git a/sys/modules/drm/drm/Makefile b/sys/modules/drm/drm/Makefile index faa30097553d..938186610b22 100644 --- a/sys/modules/drm/drm/Makefile +++ b/sys/modules/drm/drm/Makefile @@ -12,12 +12,15 @@ SRCS = \ drm_drawable.c \ drm_drv.c \ drm_fops.c \ + drm_hashtab.c \ drm_ioctl.c \ drm_irq.c \ drm_lock.c \ drm_memory.c \ + drm_mm.c \ drm_pci.c \ drm_scatter.c \ + drm_sman.c \ drm_sysctl.c \ drm_vm.c diff --git a/sys/modules/drm/via/Makefile b/sys/modules/drm/via/Makefile new file mode 100644 index 000000000000..96d9fd71abd4 --- /dev/null +++ b/sys/modules/drm/via/Makefile @@ -0,0 +1,22 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../dev/drm +KMOD = via +SRCS = via_dma.c via_dmablit.c via_drv.c via_irq.c via_map.c via_mm.c \ + via_verifier.c via_video.c +SRCS += device_if.h bus_if.h pci_if.h opt_drm.h + +.if defined(DRM_DEBUG) +DRM_DEBUG_OPT= "\#define DRM_DEBUG 1" +.endif + +.if !defined(DRM_NOLINUX) +DRM_LINUX_OPT= "\#define DRM_LINUX 1" +.endif + +opt_drm.h: + touch opt_drm.h + echo $(DRM_DEBUG_OPT) >> opt_drm.h + echo $(DRM_LINUX_OPT) >> opt_drm.h + +.include diff --git a/sys/modules/epic/Makefile b/sys/modules/epic/Makefile new file mode 100644 index 000000000000..8c2212b5e426 --- /dev/null +++ b/sys/modules/epic/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../sparc64/ebus + +KMOD= epic +SRCS= device_if.h epic.c bus_if.h ofw_bus_if.h + +.include diff --git a/sys/modules/ext2fs/Makefile b/sys/modules/ext2fs/Makefile index 1ce8ab87aa28..d9ab969d4dad 100644 --- a/sys/modules/ext2fs/Makefile +++ b/sys/modules/ext2fs/Makefile @@ -1,10 +1,10 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/../../gnu/fs/ext2fs +.PATH: ${.CURDIR}/../../fs/ext2fs KMOD= ext2fs SRCS= opt_ddb.h opt_quota.h opt_suiddir.h vnode_if.h \ ext2_alloc.c ext2_balloc.c ext2_bmap.c ext2_inode.c \ - ext2_inode_cnv.c ext2_linux_balloc.c ext2_linux_ialloc.c \ - ext2_lookup.c ext2_subr.c ext2_vfsops.c ext2_vnops.c + ext2_inode_cnv.c ext2_lookup.c ext2_subr.c ext2_vfsops.c \ + ext2_vnops.c .include diff --git a/sys/modules/geom/Makefile b/sys/modules/geom/Makefile index 183e46e94204..abce379c7391 100644 --- a/sys/modules/geom/Makefile +++ b/sys/modules/geom/Makefile @@ -13,6 +13,7 @@ SUBDIR= geom_bde \ geom_linux_lvm \ geom_mbr \ geom_mirror \ + geom_mountver \ geom_multipath \ geom_nop \ geom_part \ diff --git a/sys/modules/geom/geom_mountver/Makefile b/sys/modules/geom/geom_mountver/Makefile new file mode 100644 index 000000000000..8e89c9ab5dec --- /dev/null +++ b/sys/modules/geom/geom_mountver/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../../geom/mountver + +KMOD= geom_mountver +SRCS= g_mountver.c + +.include diff --git a/sys/modules/ichwd/Makefile b/sys/modules/ichwd/Makefile index 880ec82a28ef..21c143073cf3 100644 --- a/sys/modules/ichwd/Makefile +++ b/sys/modules/ichwd/Makefile @@ -3,6 +3,6 @@ .PATH: ${.CURDIR}/../../dev/ichwd KMOD= ichwd -SRCS= ichwd.c device_if.h bus_if.h pci_if.h +SRCS= ichwd.c device_if.h bus_if.h pci_if.h isa_if.h .include diff --git a/sys/modules/ipfw/Makefile b/sys/modules/ipfw/Makefile index dd31d7e053ff..b48d5c598823 100644 --- a/sys/modules/ipfw/Makefile +++ b/sys/modules/ipfw/Makefile @@ -6,6 +6,8 @@ KMOD= ipfw SRCS= ip_fw2.c ip_fw_pfil.c +SRCS+= ip_fw_dynamic.c ip_fw_log.c ip_fw_nat.c +SRCS+= ip_fw_sockopt.c ip_fw_table.c SRCS+= opt_inet6.h opt_ipsec.h CFLAGS+= -DIPFIREWALL diff --git a/sys/modules/iwnfw/Makefile b/sys/modules/iwnfw/Makefile index 498afcf19eb5..41556df8c59b 100644 --- a/sys/modules/iwnfw/Makefile +++ b/sys/modules/iwnfw/Makefile @@ -1,13 +1,5 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/../../contrib/dev/iwn +SUBDIR= iwn1000 iwn4965 iwn5000 iwn5150 iwn6000 -KMOD= iwnfw -FIRMWS= iwlwifi-4965-4.44.17.fw:iwnfw:44417 - -CLEANFILES= iwlwifi-4965-4.44.17.fw - -iwlwifi-4965-4.44.17.fw: ${.CURDIR}/../../contrib/dev/iwn/iwlwifi-4965-4.44.17.fw.uu - uudecode -p ${.CURDIR}/../../contrib/dev/iwn/iwlwifi-4965-4.44.17.fw.uu > ${.TARGET} - -.include +.include diff --git a/sys/modules/iwnfw/Makefile.inc b/sys/modules/iwnfw/Makefile.inc new file mode 100644 index 000000000000..73fe67e355d2 --- /dev/null +++ b/sys/modules/iwnfw/Makefile.inc @@ -0,0 +1,13 @@ +# $FreeBSD$ +# +# Common rules for building firmware. Note this gets auto-included +# by the subdir Makefile's as a consequence of included bsd.kmod.mk. + +_FIRM= ${IMG}.fw + +CLEANFILES+= ${_FIRM} + +FIRMWS= ${_FIRM}:${KMOD} + +${_FIRM}: ${.CURDIR}/../../../contrib/dev/iwn/${_FIRM}.uu + uudecode -p $? > ${.TARGET} diff --git a/sys/modules/iwnfw/iwn1000/Makefile b/sys/modules/iwnfw/iwn1000/Makefile new file mode 100644 index 000000000000..68b343e08839 --- /dev/null +++ b/sys/modules/iwnfw/iwn1000/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= iwn1000fw +IMG= iwlwifi-1000-128.50.3.1 + +.include diff --git a/sys/modules/iwnfw/iwn4965/Makefile b/sys/modules/iwnfw/iwn4965/Makefile new file mode 100644 index 000000000000..c1cc961342e5 --- /dev/null +++ b/sys/modules/iwnfw/iwn4965/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= iwn4965fw +IMG= iwlwifi-4965-228.61.2.24 + +.include diff --git a/sys/modules/iwnfw/iwn5000/Makefile b/sys/modules/iwnfw/iwn5000/Makefile new file mode 100644 index 000000000000..a1031d2aa165 --- /dev/null +++ b/sys/modules/iwnfw/iwn5000/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= iwn5000fw +IMG= iwlwifi-5000-8.24.2.12 + +.include diff --git a/sys/modules/iwnfw/iwn5150/Makefile b/sys/modules/iwnfw/iwn5150/Makefile new file mode 100644 index 000000000000..5eeea79490b0 --- /dev/null +++ b/sys/modules/iwnfw/iwn5150/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= iwn5150fw +IMG= iwlwifi-5150-8.24.2.2 + +.include diff --git a/sys/modules/iwnfw/iwn6000/Makefile b/sys/modules/iwnfw/iwn6000/Makefile new file mode 100644 index 000000000000..c0295a92cf16 --- /dev/null +++ b/sys/modules/iwnfw/iwn6000/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +KMOD= iwn6000fw +IMG= iwlwifi-6000-9.176.4.1 + +.include diff --git a/sys/modules/nfs_common/Makefile b/sys/modules/nfs_common/Makefile new file mode 100644 index 000000000000..8f51f185d8d5 --- /dev/null +++ b/sys/modules/nfs_common/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../nfs + +KMOD= nfs_common +SRCS= nfs_common.c opt_nfs.h vnode_if.h + +.include diff --git a/sys/modules/nfsclient/Makefile b/sys/modules/nfsclient/Makefile index c53e3d5f98a9..5cd3556821fb 100644 --- a/sys/modules/nfsclient/Makefile +++ b/sys/modules/nfsclient/Makefile @@ -1,11 +1,11 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/../../nfsclient ${.CURDIR}/../../nfs ${.CURDIR}/../../rpc +.PATH: ${.CURDIR}/../../nfsclient ${.CURDIR}/../../rpc KMOD= nfsclient SRCS= vnode_if.h \ nfs_bio.c nfs_lock.c nfs_node.c nfs_subs.c nfs_nfsiod.c \ - nfs_vfsops.c nfs_vnops.c nfs_common.c nfs_krpc.c \ + nfs_vfsops.c nfs_vnops.c nfs_krpc.c \ opt_inet.h opt_nfs.h opt_bootp.h opt_nfsroot.h SRCS+= opt_inet6.h opt_kdtrace.h opt_kgssapi.h diff --git a/sys/modules/nfslockd/Makefile b/sys/modules/nfslockd/Makefile index c76c2dd5c39b..337314470d4e 100644 --- a/sys/modules/nfslockd/Makefile +++ b/sys/modules/nfslockd/Makefile @@ -19,6 +19,7 @@ NFS_INET6?= 1 # 0/1 - requires INET6 to be configured in kernel opt_inet6.h: echo "#define INET6 1" > ${.TARGET} .endif + .endif .include diff --git a/sys/modules/nfsserver/Makefile b/sys/modules/nfsserver/Makefile index 692179b916cb..58ab2bc8fbbb 100644 --- a/sys/modules/nfsserver/Makefile +++ b/sys/modules/nfsserver/Makefile @@ -1,9 +1,9 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/../../nfsserver ${.CURDIR}/../../nfs +.PATH: ${.CURDIR}/../../nfsserver KMOD= nfsserver SRCS= vnode_if.h \ - nfs_fha.c nfs_serv.c nfs_srvkrpc.c nfs_srvsubs.c nfs_common.c \ + nfs_fha.c nfs_serv.c nfs_srvkrpc.c nfs_srvsubs.c \ opt_mac.h \ opt_kgssapi.h \ opt_nfs.h diff --git a/sys/modules/pf/Makefile b/sys/modules/pf/Makefile index c921f806a666..78aa564576b6 100644 --- a/sys/modules/pf/Makefile +++ b/sys/modules/pf/Makefile @@ -28,7 +28,7 @@ opt_bpf.h: # pflog can be loaded as a module, have the additional checks turned on opt_pf.h: echo "#define DEV_PF 1" > ${.TARGET} - echo "#define DEF_PFLOG 1" >> ${.TARGET} + echo "#define DEV_PFLOG 1" >> ${.TARGET} .endif .include diff --git a/sys/modules/runfw/Makefile b/sys/modules/runfw/Makefile new file mode 100644 index 000000000000..320a62485662 --- /dev/null +++ b/sys/modules/runfw/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +KMOD= runfw +FIRMWS= runfw:runfw:1 + +CLEANFILES= runfw + +runfw: ${.CURDIR}/../../contrib/dev/run/rt2870.fw.uu + uudecode -p ${.CURDIR}/../../contrib/dev/run/rt2870.fw.uu > ${.TARGET} + +.include diff --git a/sys/modules/siba_bwn/Makefile b/sys/modules/siba_bwn/Makefile new file mode 100644 index 000000000000..433d37fe2619 --- /dev/null +++ b/sys/modules/siba_bwn/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../dev/siba + +KMOD= siba_bwn +SRCS= siba_core.c siba_bwn.c sibareg.h sibavar.h +SRCS+= device_if.h bus_if.h pci_if.h + +.include diff --git a/sys/modules/ubser/Makefile b/sys/modules/ubser/Makefile index 41a0bc3f01d2..8807bed8b915 100644 --- a/sys/modules/ubser/Makefile +++ b/sys/modules/ubser/Makefile @@ -1,9 +1,9 @@ # $FreeBSD$ S= ${.CURDIR}/../.. -.PATH: $S/dev/usb +.PATH: $S/dev/usb/serial KMOD= ubser -SRCS= ubser.c ubser.h opt_usb.h device_if.h bus_if.h usbdevs.h +SRCS= ubser.c opt_usb.h device_if.h bus_if.h usbdevs.h .include diff --git a/sys/modules/usb/Makefile b/sys/modules/usb/Makefile index 2555b83c65b9..7f43e2bcc08d 100644 --- a/sys/modules/usb/Makefile +++ b/sys/modules/usb/Makefile @@ -27,11 +27,11 @@ SUBDIR = usb SUBDIR += ehci musb ohci uhci uss820dci ${_at91dci} ${_atmegadci} -SUBDIR += rum uath upgt ural zyd ${_urtw} -SUBDIR += uhid ukbd ums udbp ufm +SUBDIR += rum run uath upgt ural zyd ${_urtw} +SUBDIR += atp uhid ukbd ums udbp ufm SUBDIR += ucom u3g uark ubsa ubser uchcom ucycom ufoma uftdi ugensa uipaq ulpt \ umct umodem umoscom uplcom uslcom uvisor uvscom -SUBDIR += uether aue axe cdce cue kue rue udav +SUBDIR += uether aue axe cdce cue kue rue udav uhso SUBDIR += usfs umass urio SUBDIR += quirk template diff --git a/sys/modules/usb/atp/Makefile b/sys/modules/usb/atp/Makefile new file mode 100644 index 000000000000..8e68d1c48715 --- /dev/null +++ b/sys/modules/usb/atp/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD$ + +S= ${.CURDIR}/../../.. + +.PATH: $S/dev/usb/input + +KMOD= atp +SRCS= opt_bus.h opt_usb.h device_if.h bus_if.h usb_if.h vnode_if.h usbdevs.h \ + atp.c + +.include diff --git a/sys/modules/usb/run/Makefile b/sys/modules/usb/run/Makefile new file mode 100644 index 000000000000..5acada486ff6 --- /dev/null +++ b/sys/modules/usb/run/Makefile @@ -0,0 +1,36 @@ +# +# $FreeBSD$ +# +# Copyright (c) 2010 Hans Petter Selasky. 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. +# + +S= ${.CURDIR}/../../.. + +.PATH: $S/dev/usb/wlan + +KMOD= if_run +SRCS= opt_bus.h opt_usb.h device_if.h bus_if.h usb_if.h usbdevs.h \ + if_run.c + +.include diff --git a/sys/modules/usb/ucom/Makefile b/sys/modules/usb/ucom/Makefile index bda903c94b1c..b7836a83aab3 100644 --- a/sys/modules/usb/ucom/Makefile +++ b/sys/modules/usb/ucom/Makefile @@ -30,7 +30,7 @@ S= ${.CURDIR}/../../.. .PATH: $S/dev/usb/serial KMOD= ucom -SRCS= opt_bus.h opt_usb.h device_if.h bus_if.h usb_if.h usbdevs.h \ +SRCS= opt_bus.h opt_usb.h opt_gdb.h device_if.h bus_if.h usb_if.h usbdevs.h \ usb_serial.c .include diff --git a/sys/modules/usb/uhso/Makefile b/sys/modules/usb/uhso/Makefile new file mode 100644 index 000000000000..b08dc42136cf --- /dev/null +++ b/sys/modules/usb/uhso/Makefile @@ -0,0 +1,37 @@ +# +# $FreeBSD$ +# +# Copyright (c) 2010 Andrew Thompson. 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. +# + +S= ${.CURDIR}/../../.. + +.PATH: $S/dev/usb/net + +KMOD= uhso +SRCS= opt_bus.h opt_usb.h device_if.h bus_if.h usb_if.h usbdevs.h \ + opt_inet.h \ + uhso.c + +.include diff --git a/sys/modules/vesa/Makefile b/sys/modules/vesa/Makefile index 8b459159de5b..69a0c330688b 100644 --- a/sys/modules/vesa/Makefile +++ b/sys/modules/vesa/Makefile @@ -2,6 +2,7 @@ KMOD= vesa SRCS= opt_vga.h opt_vesa.h +SRCS+= bus_if.h device_if.h pci_if.h .PATH: ${.CURDIR}/../../dev/fb SRCS+= vesa.c diff --git a/sys/modules/x86bios/Makefile b/sys/modules/x86bios/Makefile index 8b5fa302a78f..3cab28531722 100644 --- a/sys/modules/x86bios/Makefile +++ b/sys/modules/x86bios/Makefile @@ -2,9 +2,10 @@ KMOD= x86bios SRCS= opt_x86bios.h +SRCS+= bus_if.h device_if.h pci_if.h .PATH: ${.CURDIR}/../../contrib/x86emu .PATH: ${.CURDIR}/../../compat/x86bios -SRCS+= x86bios.c x86bios_alloc.c x86emu.c x86emu_util.c +SRCS+= x86bios.c x86emu.c .include diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 2b62f037e374..65e3f2bc7949 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -664,8 +664,9 @@ static int bpfread(struct cdev *dev, struct uio *uio, int ioflag) { struct bpf_d *d; - int timed_out; int error; + int non_block; + int timed_out; error = devfs_get_cdevpriv((void **)&d); if (error != 0) @@ -678,6 +679,8 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) if (uio->uio_resid != d->bd_bufsize) return (EINVAL); + non_block = ((ioflag & O_NONBLOCK) != 0); + BPFD_LOCK(d); d->bd_pid = curthread->td_proc->p_pid; if (d->bd_bufmode != BPF_BUFMODE_BUFFER) { @@ -694,14 +697,20 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) * have arrived to fill the store buffer. */ while (d->bd_hbuf == NULL) { - if ((d->bd_immediate || timed_out) && d->bd_slen != 0) { + if (d->bd_slen != 0) { /* * A packet(s) either arrived since the previous * read or arrived while we were asleep. - * Rotate the buffers and return what's here. */ - ROTATE_BUFFERS(d); - break; + if (d->bd_immediate || non_block || timed_out) { + /* + * Rotate the buffers and return what's here + * if we are in immediate mode, non-blocking + * flag is set, or this descriptor timed out. + */ + ROTATE_BUFFERS(d); + break; + } } /* @@ -715,7 +724,7 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag) return (ENXIO); } - if (ioflag & O_NONBLOCK) { + if (non_block) { BPFD_UNLOCK(d); return (EWOULDBLOCK); } @@ -2038,7 +2047,6 @@ bpf_drvinit(void *unused) dev = make_dev(&bpf_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "bpf"); /* For compatibility */ make_dev_alias(dev, "bpf0"); - } /* diff --git a/sys/net/bpf_jitter.c b/sys/net/bpf_jitter.c index cb644f4d95ea..d024047582bd 100644 --- a/sys/net/bpf_jitter.c +++ b/sys/net/bpf_jitter.c @@ -1,6 +1,6 @@ /*- * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (C) 2005-2008 Jung-uk Kim + * Copyright (C) 2005-2009 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,14 +42,15 @@ __FBSDID("$FreeBSD$"); #include #else #include -#include +#include +#include #include #endif #include #include -bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, int *); +bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, size_t *); static u_int bpf_jit_accept_all(u_char *, u_int, u_int); @@ -60,27 +61,36 @@ SYSCTL_NODE(_net, OID_AUTO, bpf_jitter, CTLFLAG_RW, 0, "BPF JIT compiler"); int bpf_jitter_enable = 1; SYSCTL_INT(_net_bpf_jitter, OID_AUTO, enable, CTLFLAG_RW, &bpf_jitter_enable, 0, "enable BPF JIT compiler"); +#endif bpf_jit_filter * bpf_jitter(struct bpf_insn *fp, int nins) { bpf_jit_filter *filter; - /* Allocate the filter structure */ + /* Allocate the filter structure. */ +#ifdef _KERNEL filter = (struct bpf_jit_filter *)malloc(sizeof(*filter), - M_BPFJIT, M_NOWAIT | M_ZERO); + M_BPFJIT, M_NOWAIT); +#else + filter = (struct bpf_jit_filter *)malloc(sizeof(*filter)); +#endif if (filter == NULL) return (NULL); - /* No filter means accept all */ + /* No filter means accept all. */ if (fp == NULL || nins == 0) { filter->func = bpf_jit_accept_all; return (filter); } - /* Create the binary */ - if ((filter->func = bpf_jit_compile(fp, nins, filter->mem)) == NULL) { + /* Create the binary. */ + if ((filter->func = bpf_jit_compile(fp, nins, &filter->size)) == NULL) { +#ifdef _KERNEL free(filter, M_BPFJIT); +#else + free(filter); +#endif return (NULL); } @@ -91,46 +101,16 @@ void bpf_destroy_jit_filter(bpf_jit_filter *filter) { +#ifdef _KERNEL if (filter->func != bpf_jit_accept_all) free(filter->func, M_BPFJIT); free(filter, M_BPFJIT); -} #else -bpf_jit_filter * -bpf_jitter(struct bpf_insn *fp, int nins) -{ - bpf_jit_filter *filter; - - /* Allocate the filter structure */ - filter = (struct bpf_jit_filter *)malloc(sizeof(*filter)); - if (filter == NULL) - return (NULL); - memset(filter, 0, sizeof(*filter)); - - /* No filter means accept all */ - if (fp == NULL || nins == 0) { - filter->func = bpf_jit_accept_all; - return (filter); - } - - /* Create the binary */ - if ((filter->func = bpf_jit_compile(fp, nins, filter->mem)) == NULL) { - free(filter); - return (NULL); - } - - return (filter); -} - -void -bpf_destroy_jit_filter(bpf_jit_filter *filter) -{ - if (filter->func != bpf_jit_accept_all) - free(filter->func); + munmap(filter->func, filter->size); free(filter); -} #endif +} static u_int bpf_jit_accept_all(__unused u_char *p, __unused u_int wirelen, diff --git a/sys/net/bpf_jitter.h b/sys/net/bpf_jitter.h index 04491b01ef07..90a1ff5fbb07 100644 --- a/sys/net/bpf_jitter.h +++ b/sys/net/bpf_jitter.h @@ -1,6 +1,6 @@ /*- * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (C) 2005-2008 Jung-uk Kim + * Copyright (C) 2005-2009 Jung-uk Kim * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,8 +53,7 @@ typedef u_int (*bpf_filter_func)(u_char *, u_int, u_int); typedef struct bpf_jit_filter { /* The native filtering binary, in the form of a bpf_filter_func. */ bpf_filter_func func; - - int mem[BPF_MEMWORDS]; /* Scratch memory */ + size_t size; } bpf_jit_filter; /* diff --git a/sys/net/flowtable.c b/sys/net/flowtable.c index 22cab54e47aa..ab42e685d5f3 100644 --- a/sys/net/flowtable.c +++ b/sys/net/flowtable.c @@ -404,7 +404,7 @@ ipv4_flow_lookup_hash_internal(struct mbuf *m, struct route *ro, if (*flags & FL_HASH_PORTS) goto noop; /* no port - hence not a protocol we care about */ - break;; + break; } *protop = proto; @@ -830,7 +830,7 @@ fle_free(struct flentry *fle) } static void -flowtable_free_stale(struct flowtable *ft) +flowtable_free_stale(struct flowtable *ft, struct rtentry *rt) { int curbit = 0, count; struct flentry *fle, **flehead, *fleprev; @@ -866,8 +866,14 @@ flowtable_free_stale(struct flowtable *ft) curbit); } #endif - while (fle != NULL) { - if (!flow_stale(ft, fle)) { + while (fle != NULL) { + if (rt != NULL) { + if (__DEVOLATILE(struct rtentry *, fle->f_rt) != rt) { + fleprev = fle; + fle = fle->f_next; + continue; + } + } else if (!flow_stale(ft, fle)) { fleprev = fle; fle = fle->f_next; continue; @@ -916,6 +922,34 @@ flowtable_free_stale(struct flowtable *ft) log(LOG_DEBUG, "freed %d flow entries\n", count); } +void +flowtable_route_flush(struct flowtable *ft, struct rtentry *rt) +{ + int i; + if (ft->ft_flags & FL_PCPU) { + for (i = 0; i <= mp_maxid; i++) { + if (CPU_ABSENT(i)) + continue; + + if (smp_started == 1) { + thread_lock(curthread); + sched_bind(curthread, i); + thread_unlock(curthread); + } + + flowtable_free_stale(ft, rt); + + if (smp_started == 1) { + thread_lock(curthread); + sched_unbind(curthread); + thread_unlock(curthread); + } + } + } else { + flowtable_free_stale(ft, rt); + } +} + static void flowtable_clean_vnet(void) { @@ -929,18 +963,22 @@ flowtable_clean_vnet(void) if (CPU_ABSENT(i)) continue; - thread_lock(curthread); - sched_bind(curthread, i); - thread_unlock(curthread); + if (smp_started == 1) { + thread_lock(curthread); + sched_bind(curthread, i); + thread_unlock(curthread); + } - flowtable_free_stale(ft); + flowtable_free_stale(ft, NULL); - thread_lock(curthread); - sched_unbind(curthread); - thread_unlock(curthread); + if (smp_started == 1) { + thread_lock(curthread); + sched_unbind(curthread); + thread_unlock(curthread); + } } } else { - flowtable_free_stale(ft); + flowtable_free_stale(ft, NULL); } ft = ft->ft_next; } diff --git a/sys/net/flowtable.h b/sys/net/flowtable.h index afc8fb77a03c..7d7abdfad15b 100644 --- a/sys/net/flowtable.h +++ b/sys/net/flowtable.h @@ -51,5 +51,7 @@ struct flowtable *flowtable_alloc(int nentry, int flags); int flowtable_lookup(struct flowtable *ft, struct mbuf *m, struct route *ro, uint32_t fibnum); +void flowtable_route_flush(struct flowtable *ft, struct rtentry *rt); + #endif /* _KERNEL */ #endif diff --git a/sys/net/if.c b/sys/net/if.c index 55de666a6360..38b1d5013eb9 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -34,6 +34,7 @@ #include "opt_inet6.h" #include "opt_inet.h" #include "opt_carp.h" +#include "opt_ddb.h" #include #include @@ -62,6 +63,10 @@ #include #include +#ifdef DDB +#include +#endif + #include #include #include @@ -96,8 +101,6 @@ struct ifindex_entry { struct ifnet *ife_ifnet; }; -static int slowtimo_started; - SYSCTL_NODE(_net, PF_LINK, link, CTLFLAG_RW, 0, "Link layers"); SYSCTL_NODE(_net_link, 0, generic, CTLFLAG_RW, 0, "Generic link-management"); @@ -108,6 +111,18 @@ SYSCTL_INT(_net_link, OID_AUTO, log_link_state_change, CTLFLAG_RW, &log_link_state_change, 0, "log interface link state change events"); +/* Interface description */ +static unsigned int ifdescr_maxlen = 1024; +SYSCTL_UINT(_net, OID_AUTO, ifdescr_maxlen, CTLFLAG_RW, + &ifdescr_maxlen, 0, + "administrative maximum length for interface description"); + +MALLOC_DEFINE(M_IFDESCR, "ifdescr", "ifnet descriptions"); + +/* global sx for non-critical path ifdescr */ +static struct sx ifdescr_sx; +SX_SYSINIT(ifdescr_sx, &ifdescr_sx, "ifnet descr"); + void (*bstp_linkstate_p)(struct ifnet *ifp, int state); void (*ng_ether_link_state_p)(struct ifnet *ifp, int state); void (*lagg_linkstate_p)(struct ifnet *ifp, int state); @@ -125,10 +140,8 @@ static int ifconf(u_long, caddr_t); static void if_freemulti(struct ifmultiaddr *); static void if_init(void *); static void if_grow(void); -static void if_check(void *); static void if_route(struct ifnet *, int flag, int fam); static int if_setflag(struct ifnet *, int, int, int *, int); -static void if_slowtimo(void *); static int if_transmit(struct ifnet *ifp, struct mbuf *m); static void if_unroute(struct ifnet *, int flag, int fam); static void link_rtrequest(int, struct rtentry *, struct rt_addrinfo *); @@ -185,11 +198,6 @@ struct sx ifnet_sxlock; static if_com_alloc_t *if_com_alloc[256]; static if_com_free_t *if_com_free[256]; -/* - * System initialization - */ -SYSINIT(interface_check, SI_SUB_PROTO_IF, SI_ORDER_FIRST, if_check, NULL); - MALLOC_DEFINE(M_IFNET, "ifnet", "interface internals"); MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address"); MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address"); @@ -375,18 +383,6 @@ if_grow(void) V_ifindex_table = e; } -static void -if_check(void *dummy __unused) -{ - - /* - * If at least one interface added during boot uses - * if_watchdog then start the timer. - */ - if (slowtimo_started) - if_slowtimo(0); -} - /* * Allocate a struct ifnet and an index for an interface. A layer 2 * common structure will also be allocated if an allocation routine is @@ -463,6 +459,8 @@ if_free_internal(struct ifnet *ifp) #ifdef MAC mac_ifnet_destroy(ifp); #endif /* MAC */ + if (ifp->if_description != NULL) + free(ifp->if_description, M_IFDESCR); IF_AFDATA_DESTROY(ifp); IF_ADDR_LOCK_DESTROY(ifp); ifq_delete(&ifp->if_snd); @@ -670,18 +668,6 @@ if_attach_internal(struct ifnet *ifp, int vmove) /* Announce the interface. */ rt_ifannouncemsg(ifp, IFAN_ARRIVAL); - - if (!vmove && ifp->if_watchdog != NULL) { - if_printf(ifp, - "WARNING: using obsoleted if_watchdog interface\n"); - - /* - * Note that we need if_slowtimo(). If this happens after - * boot, then call if_slowtimo() directly. - */ - if (atomic_cmpset_int(&slowtimo_started, 0, 1) && !cold) - if_slowtimo(0); - } } static void @@ -773,9 +759,10 @@ if_purgeaddrs(struct ifnet *ifp) } /* - * Remove any multicast network addresses from an interface. + * Remove any multicast network addresses from an interface when an ifnet + * is going away. */ -void +static void if_purgemaddrs(struct ifnet *ifp) { struct ifmultiaddr *ifma; @@ -827,7 +814,8 @@ if_detach_internal(struct ifnet *ifp, int vmove) IFNET_WUNLOCK(); if (!found) { if (vmove) - panic("interface not in it's own ifnet list"); + panic("%s: ifp=%p not on the ifnet tailq %p", + __func__, ifp, &V_ifnet); else return; /* XXX this should panic as well? */ } @@ -1852,7 +1840,7 @@ if_route(struct ifnet *ifp, int flag, int fam) #endif } -void (*vlan_link_state_p)(struct ifnet *, int); /* XXX: private from if_vlan */ +void (*vlan_link_state_p)(struct ifnet *); /* XXX: private from if_vlan */ void (*vlan_trunk_cap_p)(struct ifnet *); /* XXX: private from if_vlan */ /* @@ -1878,19 +1866,12 @@ do_link_state_change(void *arg, int pending) { struct ifnet *ifp = (struct ifnet *)arg; int link_state = ifp->if_link_state; - int link; CURVNET_SET(ifp->if_vnet); /* Notify that the link state has changed. */ rt_ifmsg(ifp); - if (link_state == LINK_STATE_UP) - link = NOTE_LINKUP; - else if (link_state == LINK_STATE_DOWN) - link = NOTE_LINKDOWN; - else - link = NOTE_LINKINV; if (ifp->if_vlantrunk != NULL) - (*vlan_link_state_p)(ifp, link); + (*vlan_link_state_p)(ifp); if ((ifp->if_type == IFT_ETHER || ifp->if_type == IFT_L2VLAN) && IFP2AC(ifp)->ac_netgraph != NULL) @@ -1972,39 +1953,6 @@ if_qflush(struct ifnet *ifp) IFQ_UNLOCK(ifq); } -/* - * Handle interface watchdog timer routines. Called - * from softclock, we decrement timers (if set) and - * call the appropriate interface routine on expiration. - * - * XXXRW: Note that because timeouts run with Giant, if_watchdog() is called - * holding Giant. - */ -static void -if_slowtimo(void *arg) -{ - VNET_ITERATOR_DECL(vnet_iter); - struct ifnet *ifp; - int s = splimp(); - - VNET_LIST_RLOCK_NOSLEEP(); - IFNET_RLOCK_NOSLEEP(); - VNET_FOREACH(vnet_iter) { - CURVNET_SET(vnet_iter); - TAILQ_FOREACH(ifp, &V_ifnet, if_link) { - if (ifp->if_timer == 0 || --ifp->if_timer) - continue; - if (ifp->if_watchdog) - (*ifp->if_watchdog)(ifp); - } - CURVNET_RESTORE(); - } - IFNET_RUNLOCK_NOSLEEP(); - VNET_LIST_RUNLOCK_NOSLEEP(); - splx(s); - timeout(if_slowtimo, (void *)0, hz / IFNET_SLOWHZ); -} - /* * Map interface name to interface structure pointer, with or without * returning a reference. @@ -2051,6 +1999,8 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) int error = 0; int new_flags, temp_flags; size_t namelen, onamelen; + size_t descrlen; + char *descrbuf, *odescrbuf; char new_name[IFNAMSIZ]; struct ifaddr *ifa; struct sockaddr_dl *sdl; @@ -2090,6 +2040,60 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) ifr->ifr_phys = ifp->if_physical; break; + case SIOCGIFDESCR: + error = 0; + sx_slock(&ifdescr_sx); + if (ifp->if_description == NULL) { + ifr->ifr_buffer.length = 0; + error = ENOMSG; + } else { + /* space for terminating nul */ + descrlen = strlen(ifp->if_description) + 1; + if (ifr->ifr_buffer.length < descrlen) + error = ENAMETOOLONG; + else + error = copyout(ifp->if_description, + ifr->ifr_buffer.buffer, descrlen); + ifr->ifr_buffer.length = descrlen; + } + sx_sunlock(&ifdescr_sx); + break; + + case SIOCSIFDESCR: + error = priv_check(td, PRIV_NET_SETIFDESCR); + if (error) + return (error); + + /* + * Copy only (length-1) bytes to make sure that + * if_description is always nul terminated. The + * length parameter is supposed to count the + * terminating nul in. + */ + if (ifr->ifr_buffer.length > ifdescr_maxlen) + return (ENAMETOOLONG); + else if (ifr->ifr_buffer.length == 0) + descrbuf = NULL; + else { + descrbuf = malloc(ifr->ifr_buffer.length, M_IFDESCR, + M_WAITOK | M_ZERO); + error = copyin(ifr->ifr_buffer.buffer, descrbuf, + ifr->ifr_buffer.length - 1); + if (error) { + free(descrbuf, M_IFDESCR); + break; + } + } + + sx_xlock(&ifdescr_sx); + odescrbuf = ifp->if_description; + ifp->if_description = descrbuf; + sx_xunlock(&ifdescr_sx); + + getmicrotime(&ifp->if_lastchange); + free(odescrbuf, M_IFDESCR); + break; + case SIOCSIFFLAGS: error = priv_check(td, PRIV_NET_SETIFFLAGS); if (error) @@ -2161,6 +2165,14 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) return (EINVAL); if (ifunit(new_name) != NULL) return (EEXIST); + + /* + * XXX: Locking. Nothing else seems to lock if_flags, + * and there are numerous other races with the + * ifunit() checks not being atomic with namespace + * changes (renames, vmoves, if_attach, etc). + */ + ifp->if_flags |= IFF_RENAMING; /* Announce the departure of the interface. */ rt_ifannouncemsg(ifp, IFAN_DEPARTURE); @@ -2195,6 +2207,8 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp); /* Announce the return of the interface. */ rt_ifannouncemsg(ifp, IFAN_ARRIVAL); + + ifp->if_flags &= ~IFF_RENAMING; break; #ifdef VIMAGE @@ -2331,6 +2345,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td) return (error); error = if_setlladdr(ifp, ifr->ifr_addr.sa_data, ifr->ifr_addr.sa_len); + EVENTHANDLER_INVOKE(iflladdr_event, ifp); break; case SIOCAIFGROUP: @@ -3001,6 +3016,22 @@ if_delmulti(struct ifnet *ifp, struct sockaddr *sa) return (0); } +/* + * Delete all multicast group membership for an interface. + * Should be used to quickly flush all multicast filters. + */ +void +if_delallmulti(struct ifnet *ifp) +{ + struct ifmultiaddr *ifma; + struct ifmultiaddr *next; + + IF_ADDR_LOCK(ifp); + TAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next) + if_delmulti_locked(ifp, ifma, 0); + IF_ADDR_UNLOCK(ifp); +} + /* * Delete a multicast group membership by group membership pointer. * Network-layer protocol domains must use this routine. @@ -3305,3 +3336,79 @@ if_deregister_com_alloc(u_char type) if_com_alloc[type] = NULL; if_com_free[type] = NULL; } + +#ifdef DDB +static void +if_show_ifnet(struct ifnet *ifp) +{ + + if (ifp == NULL) + return; + db_printf("%s:\n", ifp->if_xname); +#define IF_DB_PRINTF(f, e) db_printf(" %s = " f "\n", #e, ifp->e); + IF_DB_PRINTF("%s", if_dname); + IF_DB_PRINTF("%d", if_dunit); + IF_DB_PRINTF("%s", if_description); + IF_DB_PRINTF("%u", if_index); + IF_DB_PRINTF("%u", if_refcount); + IF_DB_PRINTF("%d", if_index_reserved); + IF_DB_PRINTF("%p", if_softc); + IF_DB_PRINTF("%p", if_l2com); + IF_DB_PRINTF("%p", if_vnet); + IF_DB_PRINTF("%p", if_home_vnet); + IF_DB_PRINTF("%p", if_addr); + IF_DB_PRINTF("%p", if_llsoftc); + IF_DB_PRINTF("%p", if_label); + IF_DB_PRINTF("%u", if_pcount); + IF_DB_PRINTF("0x%08x", if_flags); + IF_DB_PRINTF("0x%08x", if_drv_flags); + IF_DB_PRINTF("0x%08x", if_capabilities); + IF_DB_PRINTF("0x%08x", if_capenable); + IF_DB_PRINTF("%p", if_snd.ifq_head); + IF_DB_PRINTF("%p", if_snd.ifq_tail); + IF_DB_PRINTF("%d", if_snd.ifq_len); + IF_DB_PRINTF("%d", if_snd.ifq_maxlen); + IF_DB_PRINTF("%d", if_snd.ifq_drops); + IF_DB_PRINTF("%p", if_snd.ifq_drv_head); + IF_DB_PRINTF("%p", if_snd.ifq_drv_tail); + IF_DB_PRINTF("%d", if_snd.ifq_drv_len); + IF_DB_PRINTF("%d", if_snd.ifq_drv_maxlen); + IF_DB_PRINTF("%d", if_snd.altq_type); + IF_DB_PRINTF("%x", if_snd.altq_flags); +#undef IF_DB_PRINTF +} + +DB_SHOW_COMMAND(ifnet, db_show_ifnet) +{ + + if (!have_addr) { + db_printf("usage: show ifnet \n"); + return; + } + + if_show_ifnet((struct ifnet *)addr); +} + +DB_SHOW_ALL_COMMAND(ifnets, db_show_all_ifnets) +{ + VNET_ITERATOR_DECL(vnet_iter); + struct ifnet *ifp; + u_short idx; + + VNET_FOREACH(vnet_iter) { + CURVNET_SET_QUIET(vnet_iter); +#ifdef VIMAGE + db_printf("vnet=%p\n", curvnet); +#endif + for (idx = 1; idx <= V_if_index; idx++) { + ifp = V_ifindex_table[idx].ife_ifnet; + if (ifp == NULL) + continue; + db_printf( "%20s ifp=%p\n", ifp->if_xname, ifp); + if (db_pager_quit) + break; + } + CURVNET_RESTORE(); + } +} +#endif diff --git a/sys/net/if.h b/sys/net/if.h index 857ab7fb460b..e226654b34b7 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -150,6 +150,7 @@ struct if_data { #define IFF_MONITOR 0x40000 /* (n) user-requested monitor mode */ #define IFF_STATICARP 0x80000 /* (n) static ARP */ #define IFF_DYING 0x200000 /* (n) interface is winding down */ +#define IFF_RENAMING 0x400000 /* (n) interface is being renamed */ /* * Old names for driver flags so that user space tools can continue to use @@ -217,6 +218,7 @@ struct if_data { #define IFCAP_TOE6 0x08000 /* interface can offload TCP6 */ #define IFCAP_VLAN_HWFILTER 0x10000 /* interface hw can filter vlan tag */ #define IFCAP_POLLING_NOCOUNT 0x20000 /* polling ticks cannot be fragmented */ +#define IFCAP_VLAN_HWTSO 0x40000 /* can do IFCAP_TSO on VLANs */ #define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM) #define IFCAP_TSO (IFCAP_TSO4 | IFCAP_TSO6) @@ -282,6 +284,14 @@ struct if_announcemsghdr { #define IFAN_ARRIVAL 0 /* interface arrival */ #define IFAN_DEPARTURE 1 /* interface departure */ +/* + * Buffer with length to be used in SIOCGIFDESCR/SIOCSIFDESCR requests + */ +struct ifreq_buffer { + size_t length; + void *buffer; +}; + /* * Interface request structure used for socket * ioctl's. All interface ioctl's must have parameter @@ -294,6 +304,7 @@ struct ifreq { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; + struct ifreq_buffer ifru_buffer; short ifru_flags[2]; short ifru_index; int ifru_jid; @@ -307,6 +318,7 @@ struct ifreq { #define ifr_addr ifr_ifru.ifru_addr /* address */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_buffer ifr_ifru.ifru_buffer /* user supplied buffer with its length */ #define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */ #define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */ #define ifr_jid ifr_ifru.ifru_jid /* jail/vnet */ diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c index d3a55fd15afc..d985e987abdc 100644 --- a/sys/net/if_bridge.c +++ b/sys/net/if_bridge.c @@ -109,6 +109,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include /* for struct arpcom */ #include @@ -133,6 +134,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include /* @@ -681,6 +683,8 @@ static int bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { struct bridge_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *)data; + struct bridge_iflist *bif; struct thread *td = curthread; union { struct ifbreq ifbreq; @@ -770,10 +774,29 @@ bridge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; case SIOCSIFMTU: - /* Do not allow the MTU to be changed on the bridge */ - error = EINVAL; + if (ifr->ifr_mtu < 576) { + error = EINVAL; + break; + } + if (LIST_EMPTY(&sc->sc_iflist)) { + sc->sc_ifp->if_mtu = ifr->ifr_mtu; + break; + } + BRIDGE_LOCK(sc); + LIST_FOREACH(bif, &sc->sc_iflist, bif_next) { + if (bif->bif_ifp->if_mtu != ifr->ifr_mtu) { + log(LOG_NOTICE, "%s: invalid MTU: %lu(%s)" + " != %d\n", sc->sc_ifp->if_xname, + bif->bif_ifp->if_mtu, + bif->bif_ifp->if_xname, ifr->ifr_mtu); + error = EINVAL; + break; + } + } + if (!error) + sc->sc_ifp->if_mtu = ifr->ifr_mtu; + BRIDGE_UNLOCK(sc); break; - default: /* * drop the lock as ether_ioctl() will call bridge_start() and @@ -915,6 +938,7 @@ bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif, IF_LLADDR(sc->sc_ifp), ETHER_ADDR_LEN); sc->sc_ifaddr = fif; } + EVENTHANDLER_INVOKE(iflladdr_event, sc->sc_ifp); } bridge_mutecaps(sc); /* recalcuate now this interface is removed */ @@ -986,17 +1010,6 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) if (ifs == bif->bif_ifp) return (EBUSY); - /* Allow the first Ethernet member to define the MTU */ - if (ifs->if_type != IFT_GIF) { - if (LIST_EMPTY(&sc->sc_iflist)) - sc->sc_ifp->if_mtu = ifs->if_mtu; - else if (sc->sc_ifp->if_mtu != ifs->if_mtu) { - if_printf(sc->sc_ifp, "invalid MTU for %s\n", - ifs->if_xname); - return (EINVAL); - } - } - if (ifs->if_bridge == sc) return (EEXIST); @@ -1022,6 +1035,16 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) goto out; } + /* Allow the first Ethernet member to define the MTU */ + if (LIST_EMPTY(&sc->sc_iflist)) + sc->sc_ifp->if_mtu = ifs->if_mtu; + else if (sc->sc_ifp->if_mtu != ifs->if_mtu) { + if_printf(sc->sc_ifp, "invalid MTU: %lu(%s) != %lu\n", + ifs->if_mtu, ifs->if_xname, sc->sc_ifp->if_mtu); + error = EINVAL; + goto out; + } + /* * Assign the interface's MAC address to the bridge if it's the first * member and the MAC address of the bridge has not been changed from @@ -1031,6 +1054,7 @@ bridge_ioctl_add(struct bridge_softc *sc, void *arg) !memcmp(IF_LLADDR(sc->sc_ifp), sc->sc_defaddr, ETHER_ADDR_LEN)) { bcopy(IF_LLADDR(ifs), IF_LLADDR(sc->sc_ifp), ETHER_ADDR_LEN); sc->sc_ifaddr = ifs; + EVENTHANDLER_INVOKE(iflladdr_event, sc->sc_ifp); } ifs->if_bridge = sc; @@ -1800,9 +1824,9 @@ bridge_dummynet(struct mbuf *m, struct ifnet *ifp) return; } - if (PFIL_HOOKED(&inet_pfil_hook) + if (PFIL_HOOKED(&V_inet_pfil_hook) #ifdef INET6 - || PFIL_HOOKED(&inet6_pfil_hook) + || PFIL_HOOKED(&V_inet6_pfil_hook) #endif ) { if (bridge_pfil(&m, sc->sc_ifp, ifp, PFIL_OUT) != 0) @@ -2062,9 +2086,9 @@ bridge_forward(struct bridge_softc *sc, struct bridge_iflist *sbif, ETHER_BPF_MTAP(ifp, m); /* run the packet filter */ - if (PFIL_HOOKED(&inet_pfil_hook) + if (PFIL_HOOKED(&V_inet_pfil_hook) #ifdef INET6 - || PFIL_HOOKED(&inet6_pfil_hook) + || PFIL_HOOKED(&V_inet6_pfil_hook) #endif ) { BRIDGE_UNLOCK(sc); @@ -2102,9 +2126,9 @@ bridge_forward(struct bridge_softc *sc, struct bridge_iflist *sbif, BRIDGE_UNLOCK(sc); - if (PFIL_HOOKED(&inet_pfil_hook) + if (PFIL_HOOKED(&V_inet_pfil_hook) #ifdef INET6 - || PFIL_HOOKED(&inet6_pfil_hook) + || PFIL_HOOKED(&V_inet6_pfil_hook) #endif ) { if (bridge_pfil(&m, ifp, dst_if, PFIL_OUT) != 0) @@ -2243,7 +2267,7 @@ bridge_input(struct ifnet *ifp, struct mbuf *m) #ifdef INET6 # define OR_PFIL_HOOKED_INET6 \ - || PFIL_HOOKED(&inet6_pfil_hook) + || PFIL_HOOKED(&V_inet6_pfil_hook) #else # define OR_PFIL_HOOKED_INET6 #endif @@ -2260,7 +2284,7 @@ bridge_input(struct ifnet *ifp, struct mbuf *m) iface->if_ipackets++; \ /* Filter on the physical interface. */ \ if (pfil_local_phys && \ - (PFIL_HOOKED(&inet_pfil_hook) \ + (PFIL_HOOKED(&V_inet_pfil_hook) \ OR_PFIL_HOOKED_INET6)) { \ if (bridge_pfil(&m, NULL, ifp, \ PFIL_IN) != 0 || m == NULL) { \ @@ -2349,9 +2373,9 @@ bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if, } /* Filter on the bridge interface before broadcasting */ - if (runfilt && (PFIL_HOOKED(&inet_pfil_hook) + if (runfilt && (PFIL_HOOKED(&V_inet_pfil_hook) #ifdef INET6 - || PFIL_HOOKED(&inet6_pfil_hook) + || PFIL_HOOKED(&V_inet6_pfil_hook) #endif )) { if (bridge_pfil(&m, sc->sc_ifp, NULL, PFIL_OUT) != 0) @@ -2396,9 +2420,9 @@ bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if, * pointer so we do not redundantly filter on the bridge for * each interface we broadcast on. */ - if (runfilt && (PFIL_HOOKED(&inet_pfil_hook) + if (runfilt && (PFIL_HOOKED(&V_inet_pfil_hook) #ifdef INET6 - || PFIL_HOOKED(&inet6_pfil_hook) + || PFIL_HOOKED(&V_inet6_pfil_hook) #endif )) { if (used == 0) { @@ -3037,27 +3061,35 @@ bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir) goto bad; } - if (ip_fw_chk_ptr && pfil_ipfw != 0 && dir == PFIL_OUT && ifp != NULL) { - struct dn_pkt_tag *dn_tag; + /* XXX this section is also in if_ethersubr.c */ + // XXX PFIL_OUT or DIR_OUT ? + if (V_ip_fw_chk_ptr && pfil_ipfw != 0 && + dir == PFIL_OUT && ifp != NULL) { + struct m_tag *mtag; error = -1; - dn_tag = ip_dn_claim_tag(*mp); - if (dn_tag != NULL) { - if (dn_tag->rule != NULL && V_fw_one_pass) - /* packet already partially processed */ + /* fetch the start point from existing tags, if any */ + mtag = m_tag_locate(*mp, MTAG_IPFW_RULE, 0, NULL); + if (mtag == NULL) { + args.rule.slot = 0; + } else { + struct dn_pkt_tag *dn_tag; + + /* XXX can we free the tag after use ? */ + mtag->m_tag_id = PACKET_TAG_NONE; + dn_tag = (struct dn_pkt_tag *)(mtag + 1); + /* packet already partially processed ? */ + if (dn_tag->rule.slot != 0 && V_fw_one_pass) goto ipfwpass; - args.rule = dn_tag->rule; /* matching rule to restart */ - args.rule_id = dn_tag->rule_id; - args.chain_id = dn_tag->chain_id; - } else - args.rule = NULL; + args.rule = dn_tag->rule; + } args.m = *mp; args.oif = ifp; args.next_hop = NULL; args.eh = &eh2; args.inp = NULL; /* used by ipfw uid/gid/jail rules */ - i = ip_fw_chk_ptr(&args); + i = V_ip_fw_chk_ptr(&args); *mp = args.m; if (*mp == NULL) @@ -3076,7 +3108,7 @@ bridge_pfil(struct mbuf **mp, struct ifnet *bifp, struct ifnet *ifp, int dir) * packet will return to us via bridge_dummynet(). */ args.oif = ifp; - ip_dn_io_ptr(mp, DN_TO_IFB_FWD, &args); + ip_dn_io_ptr(mp, DIR_FWD | PROTO_IFB, &args); return (error); } @@ -3109,21 +3141,21 @@ ipfwpass: * in_if -> bridge_if -> out_if */ if (pfil_bridge && dir == PFIL_OUT && bifp != NULL) - error = pfil_run_hooks(&inet_pfil_hook, mp, bifp, + error = pfil_run_hooks(&V_inet_pfil_hook, mp, bifp, dir, NULL); if (*mp == NULL || error != 0) /* filter may consume */ break; if (pfil_member && ifp != NULL) - error = pfil_run_hooks(&inet_pfil_hook, mp, ifp, + error = pfil_run_hooks(&V_inet_pfil_hook, mp, ifp, dir, NULL); if (*mp == NULL || error != 0) /* filter may consume */ break; if (pfil_bridge && dir == PFIL_IN && bifp != NULL) - error = pfil_run_hooks(&inet_pfil_hook, mp, bifp, + error = pfil_run_hooks(&V_inet_pfil_hook, mp, bifp, dir, NULL); if (*mp == NULL || error != 0) /* filter may consume */ @@ -3163,21 +3195,21 @@ ipfwpass: #ifdef INET6 case ETHERTYPE_IPV6: if (pfil_bridge && dir == PFIL_OUT && bifp != NULL) - error = pfil_run_hooks(&inet6_pfil_hook, mp, bifp, + error = pfil_run_hooks(&V_inet6_pfil_hook, mp, bifp, dir, NULL); if (*mp == NULL || error != 0) /* filter may consume */ break; if (pfil_member && ifp != NULL) - error = pfil_run_hooks(&inet6_pfil_hook, mp, ifp, + error = pfil_run_hooks(&V_inet6_pfil_hook, mp, ifp, dir, NULL); if (*mp == NULL || error != 0) /* filter may consume */ break; if (pfil_bridge && dir == PFIL_IN && bifp != NULL) - error = pfil_run_hooks(&inet6_pfil_hook, mp, bifp, + error = pfil_run_hooks(&V_inet6_pfil_hook, mp, bifp, dir, NULL); break; #endif diff --git a/sys/net/if_dead.c b/sys/net/if_dead.c index b28ffc2c4d0c..7c941d830522 100644 --- a/sys/net/if_dead.c +++ b/sys/net/if_dead.c @@ -70,12 +70,6 @@ ifdead_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) return (ENXIO); } -static void -ifdead_watchdog(struct ifnet *ifp) -{ - -} - static int ifdead_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, struct sockaddr *sa) @@ -107,7 +101,6 @@ if_dead(struct ifnet *ifp) ifp->if_input = ifdead_input; ifp->if_start = ifdead_start; ifp->if_ioctl = ifdead_ioctl; - ifp->if_watchdog = ifdead_watchdog; ifp->if_resolvemulti = ifdead_resolvemulti; ifp->if_qflush = ifdead_qflush; ifp->if_transmit = ifdead_transmit; diff --git a/sys/net/if_ef.c b/sys/net/if_ef.c index 2af3a177204c..94fb03d13a45 100644 --- a/sys/net/if_ef.c +++ b/sys/net/if_ef.c @@ -128,7 +128,6 @@ ef_attach(struct efnet *sc) struct ifnet *ifp = sc->ef_ifp; ifp->if_start = ef_start; - ifp->if_watchdog = NULL; ifp->if_init = ef_init; ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); diff --git a/sys/net/if_enc.c b/sys/net/if_enc.c index a49c5dc5b236..b1fc0383a461 100644 --- a/sys/net/if_enc.c +++ b/sys/net/if_enc.c @@ -243,9 +243,9 @@ ipsec_filter(struct mbuf **mp, int dir, int flags) } /* Skip pfil(9) if no filters are loaded */ - if (!(PFIL_HOOKED(&inet_pfil_hook) + if (!(PFIL_HOOKED(&V_inet_pfil_hook) #ifdef INET6 - || PFIL_HOOKED(&inet6_pfil_hook) + || PFIL_HOOKED(&V_inet6_pfil_hook) #endif )) { return (0); @@ -271,7 +271,7 @@ ipsec_filter(struct mbuf **mp, int dir, int flags) ip->ip_len = ntohs(ip->ip_len); ip->ip_off = ntohs(ip->ip_off); - error = pfil_run_hooks(&inet_pfil_hook, mp, + error = pfil_run_hooks(&V_inet_pfil_hook, mp, encif, dir, NULL); if (*mp == NULL || error != 0) @@ -285,7 +285,7 @@ ipsec_filter(struct mbuf **mp, int dir, int flags) #ifdef INET6 case 6: - error = pfil_run_hooks(&inet6_pfil_hook, mp, + error = pfil_run_hooks(&V_inet6_pfil_hook, mp, encif, dir, NULL); break; #endif diff --git a/sys/net/if_epair.c b/sys/net/if_epair.c index 00f99fdfa5c0..a6b7a7c86cf5 100644 --- a/sys/net/if_epair.c +++ b/sys/net/if_epair.c @@ -323,7 +323,7 @@ epair_add_ifp_for_draining(struct ifnet *ifp) STAILQ_FOREACH(elm, &epair_dpcpu->epair_ifp_drain_list, ifp_next) if (elm->ifp == ifp) break; - /* If the ipf is there already, return success. */ + /* If the ifp is there already, return success. */ if (elm != NULL) return (0); diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index bac204449230..ac2ab05f64b5 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -70,9 +70,10 @@ #include #include #include -#include -#include #include +#include +#include +#include #endif #ifdef INET6 #include @@ -434,7 +435,7 @@ ether_output_frame(struct ifnet *ifp, struct mbuf *m) { #if defined(INET) || defined(INET6) - if (ip_fw_chk_ptr && V_ether_ipfw != 0) { + if (V_ip_fw_chk_ptr && V_ether_ipfw != 0) { if (ether_ipfw_chk(&m, ifp, 0) == 0) { if (m) { m_freem(m); @@ -466,19 +467,23 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, int shared) struct mbuf *m; int i; struct ip_fw_args args; - struct dn_pkt_tag *dn_tag; + struct m_tag *mtag; - dn_tag = ip_dn_claim_tag(*m0); + /* fetch start point from rule, if any */ + mtag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL); + if (mtag == NULL) { + args.rule.slot = 0; + } else { + struct dn_pkt_tag *dn_tag; - if (dn_tag != NULL) { - if (dn_tag->rule != NULL && V_fw_one_pass) + /* XXX can we free it after use ? */ + mtag->m_tag_id = PACKET_TAG_NONE; + dn_tag = (struct dn_pkt_tag *)(mtag + 1); + if (dn_tag->rule.slot != 0 && V_fw_one_pass) /* dummynet packet, already partially processed */ return (1); - args.rule = dn_tag->rule; /* matching rule to restart */ - args.rule_id = dn_tag->rule_id; - args.chain_id = dn_tag->chain_id; - } else - args.rule = NULL; + args.rule = dn_tag->rule; + } /* * I need some amt of data to be contiguous, and in case others need @@ -502,7 +507,7 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, int shared) args.next_hop = NULL; /* we do not support forward yet */ args.eh = &save_eh; /* MAC header for bridged/MAC packets */ args.inp = NULL; /* used by ipfw uid/gid/jail rules */ - i = ip_fw_chk_ptr(&args); + i = V_ip_fw_chk_ptr(&args); m = args.m; if (m != NULL) { /* @@ -529,6 +534,7 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, int shared) return 1; if (ip_dn_io_ptr && (i == IP_FW_DUMMYNET)) { + int dir; /* * Pass the pkt to dummynet, which consumes it. * If shared, make a copy and keep the original. @@ -544,7 +550,8 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, int shared) */ *m0 = NULL ; } - ip_dn_io_ptr(&m, dst ? DN_TO_ETH_OUT: DN_TO_ETH_DEMUX, &args); + dir = PROTO_LAYER2 | (dst ? DIR_OUT : DIR_IN); + ip_dn_io_ptr(&m, dir, &args); return 0; } /* @@ -775,7 +782,7 @@ ether_demux(struct ifnet *ifp, struct mbuf *m) * Allow dummynet and/or ipfw to claim the frame. * Do not do this for PROMISC frames in case we are re-entered. */ - if (ip_fw_chk_ptr && V_ether_ipfw != 0 && !(m->m_flags & M_PROMISC)) { + if (V_ip_fw_chk_ptr && V_ether_ipfw != 0 && !(m->m_flags & M_PROMISC)) { if (ether_ipfw_chk(&m, NULL, 0) == 0) { if (m) m_freem(m); /* dropped; free mbuf chain */ diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c index 6abc8071e021..22ef6abc8eea 100644 --- a/sys/net/if_gif.c +++ b/sys/net/if_gif.c @@ -507,7 +507,7 @@ gif_input(m, af, ifp) struct ifnet *ifp; { int isr, n; - struct gif_softc *sc = ifp->if_softc; + struct gif_softc *sc; struct etherip_header *eip; struct ether_header *eh; struct ifnet *oldifp; @@ -517,7 +517,7 @@ gif_input(m, af, ifp) m_freem(m); return; } - + sc = ifp->if_softc; m->m_pkthdr.rcvif = ifp; #ifdef MAC diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c index 2b283d69e3d7..bac3d7954fa1 100644 --- a/sys/net/if_gre.c +++ b/sys/net/if_gre.c @@ -18,13 +18,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/net/if_gre.h b/sys/net/if_gre.h index 186d4cc6ccd1..e23daefd51c6 100644 --- a/sys/net/if_gre.h +++ b/sys/net/if_gre.h @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c index 583cc4135ad7..4728780d91be 100644 --- a/sys/net/if_lagg.c +++ b/sys/net/if_lagg.c @@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -95,7 +96,9 @@ static int lagg_port_ioctl(struct ifnet *, u_long, caddr_t); static int lagg_port_output(struct ifnet *, struct mbuf *, struct sockaddr *, struct route *); static void lagg_port_ifdetach(void *arg __unused, struct ifnet *); +#ifdef LAGG_PORT_STACKING static int lagg_port_checkstacking(struct lagg_softc *); +#endif static void lagg_port2req(struct lagg_port *, struct lagg_reqport *); static void lagg_init(void *); static void lagg_stop(struct lagg_softc *); @@ -196,6 +199,50 @@ static moduledata_t lagg_mod = { DECLARE_MODULE(if_lagg, lagg_mod, SI_SUB_PSEUDO, SI_ORDER_ANY); +#if __FreeBSD_version >= 800000 +/* + * This routine is run via an vlan + * config EVENT + */ +static void +lagg_register_vlan(void *arg, struct ifnet *ifp, u_int16_t vtag) +{ + struct lagg_softc *sc = ifp->if_softc; + struct lagg_port *lp; + + if (ifp->if_softc != arg) /* Not our event */ + return; + + LAGG_RLOCK(sc); + if (!SLIST_EMPTY(&sc->sc_ports)) { + SLIST_FOREACH(lp, &sc->sc_ports, lp_entries) + EVENTHANDLER_INVOKE(vlan_config, lp->lp_ifp, vtag); + } + LAGG_RUNLOCK(sc); +} + +/* + * This routine is run via an vlan + * unconfig EVENT + */ +static void +lagg_unregister_vlan(void *arg, struct ifnet *ifp, u_int16_t vtag) +{ + struct lagg_softc *sc = ifp->if_softc; + struct lagg_port *lp; + + if (ifp->if_softc != arg) /* Not our event */ + return; + + LAGG_RLOCK(sc); + if (!SLIST_EMPTY(&sc->sc_ports)) { + SLIST_FOREACH(lp, &sc->sc_ports, lp_entries) + EVENTHANDLER_INVOKE(vlan_unconfig, lp->lp_ifp, vtag); + } + LAGG_RUNLOCK(sc); +} +#endif + static int lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params) { @@ -251,6 +298,13 @@ lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params) */ ether_ifattach(ifp, eaddr); +#if __FreeBSD_version >= 800000 + sc->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, + lagg_register_vlan, sc, EVENTHANDLER_PRI_FIRST); + sc->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, + lagg_unregister_vlan, sc, EVENTHANDLER_PRI_FIRST); +#endif + /* Insert into the global list of laggs */ mtx_lock(&lagg_list_mtx); SLIST_INSERT_HEAD(&lagg_list, sc, sc_entries); @@ -270,6 +324,11 @@ lagg_clone_destroy(struct ifnet *ifp) lagg_stop(sc); ifp->if_flags &= ~IFF_UP; +#if __FreeBSD_version >= 800000 + EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach); + EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach); +#endif + /* Shutdown and remove lagg ports */ while ((lp = SLIST_FIRST(&sc->sc_ports)) != NULL) lagg_port_destroy(lp, 1); @@ -303,6 +362,7 @@ lagg_lladdr(struct lagg_softc *sc, uint8_t *lladdr) /* Let the protocol know the MAC has changed */ if (sc->sc_lladdr != NULL) (*sc->sc_lladdr)(sc); + EVENTHANDLER_INVOKE(iflladdr_event, ifp); } static void @@ -456,7 +516,8 @@ lagg_port_create(struct lagg_softc *sc, struct ifnet *ifp) mtx_unlock(&lagg_list_mtx); free(lp, M_DEVBUF); return (EINVAL); - /* XXX disable stacking for the moment, its untested + /* XXX disable stacking for the moment, its untested */ +#ifdef LAGG_PORT_STACKING lp->lp_flags |= LAGG_PORT_STACK; if (lagg_port_checkstacking(sc_ptr) >= LAGG_MAX_STACKING) { @@ -464,7 +525,7 @@ lagg_port_create(struct lagg_softc *sc, struct ifnet *ifp) free(lp, M_DEVBUF); return (E2BIG); } - */ +#endif } } mtx_unlock(&lagg_list_mtx); @@ -515,6 +576,7 @@ lagg_port_create(struct lagg_softc *sc, struct ifnet *ifp) return (error); } +#ifdef LAGG_PORT_STACKING static int lagg_port_checkstacking(struct lagg_softc *sc) { @@ -533,6 +595,7 @@ lagg_port_checkstacking(struct lagg_softc *sc) return (m + 1); } +#endif static int lagg_port_destroy(struct lagg_port *lp, int runpd) diff --git a/sys/net/if_lagg.h b/sys/net/if_lagg.h index 896f5b310801..0034c61799b1 100644 --- a/sys/net/if_lagg.h +++ b/sys/net/if_lagg.h @@ -198,6 +198,10 @@ struct lagg_softc { void (*sc_lladdr)(struct lagg_softc *); void (*sc_req)(struct lagg_softc *, caddr_t); void (*sc_portreq)(struct lagg_port *, caddr_t); +#if __FreeBSD_version >= 800000 + eventhandler_tag vlan_attach; + eventhandler_tag vlan_detach; +#endif }; struct lagg_port { diff --git a/sys/net/if_llatbl.c b/sys/net/if_llatbl.c index 4991c81d92c6..5992f6d82e0c 100644 --- a/sys/net/if_llatbl.c +++ b/sys/net/if_llatbl.c @@ -274,7 +274,9 @@ lla_rt_output(struct rt_msghdr *rtm, struct rt_addrinfo *info) #ifdef INET if (dst->sa_family == AF_INET && ((struct sockaddr_inarp *)dst)->sin_other != 0) { - struct rtentry *rt = rtalloc1(dst, 0, 0); + struct rtentry *rt; + ((struct sockaddr_inarp *)dst)->sin_other = 0; + rt = rtalloc1(dst, 0, 0); if (rt == NULL || !(rt->rt_flags & RTF_HOST)) { log(LOG_INFO, "%s: RTM_ADD publish " "(proxy only) is invalid\n", diff --git a/sys/net/if_llatbl.h b/sys/net/if_llatbl.h index f54c78ad8a28..21357ebaef6e 100644 --- a/sys/net/if_llatbl.h +++ b/sys/net/if_llatbl.h @@ -159,7 +159,7 @@ struct lltable { const struct sockaddr *mask); struct llentry * (*llt_lookup)(struct lltable *, u_int flags, const struct sockaddr *l3addr); - int (*llt_rtcheck)(struct ifnet *, + int (*llt_rtcheck)(struct ifnet *, u_int flags, const struct sockaddr *); int (*llt_dump)(struct lltable *, struct sysctl_req *); diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c index 056b2f93a353..78d2de21e523 100644 --- a/sys/net/if_loop.c +++ b/sys/net/if_loop.c @@ -200,12 +200,12 @@ loop_modevent(module_t mod, int type, void *data) } static moduledata_t loop_mod = { - "loop", + "if_lo", loop_modevent, 0 }; -DECLARE_MODULE(loop, loop_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); +DECLARE_MODULE(if_lo, loop_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); int looutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index 950e96ca9d23..93801f10412b 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -192,10 +192,6 @@ tap_clone_create(struct if_clone *ifc, int unit, caddr_t params) if (i) { dev = make_dev(&tap_cdevsw, unit | extra, UID_ROOT, GID_WHEEL, 0600, "%s%d", ifc->ifc_name, unit); - if (dev != NULL) { - dev_ref(dev); - dev->si_flags |= SI_CHEAPCLONE; - } } tapcreate(dev); @@ -300,6 +296,7 @@ tapmodevent(module_t mod, int type, void *data) EVENTHANDLER_DEREGISTER(dev_clone, eh_tag); if_clone_detach(&tap_cloner); if_clone_detach(&vmnet_cloner); + drain_dev_clone_events(); mtx_lock(&tapmtx); while ((tp = SLIST_FIRST(&taphead)) != NULL) { @@ -381,12 +378,8 @@ tapclone(void *arg, struct ucred *cred, char *name, int namelen, struct cdev **d name = devname; } - *dev = make_dev(&tap_cdevsw, unit | extra, - UID_ROOT, GID_WHEEL, 0600, "%s", name); - if (*dev != NULL) { - dev_ref(*dev); - (*dev)->si_flags |= SI_CHEAPCLONE; - } + *dev = make_dev_credf(MAKEDEV_REF, &tap_cdevsw, unit | extra, + cred, UID_ROOT, GID_WHEEL, 0600, "%s", name); } if_clone_create(name, namelen, NULL); diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c index 37b5e70302c1..1fa02ac9f11e 100644 --- a/sys/net/if_tun.c +++ b/sys/net/if_tun.c @@ -188,10 +188,6 @@ tun_clone_create(struct if_clone *ifc, int unit, caddr_t params) /* No preexisting struct cdev *, create one */ dev = make_dev(&tun_cdevsw, unit, UID_UUCP, GID_DIALER, 0600, "%s%d", ifc->ifc_name, unit); - if (dev != NULL) { - dev_ref(dev); - dev->si_flags |= SI_CHEAPCLONE; - } } tuncreate(ifc->ifc_name, dev); @@ -237,12 +233,8 @@ tunclone(void *arg, struct ucred *cred, char *name, int namelen, name = devname; } /* No preexisting struct cdev *, create one */ - *dev = make_dev(&tun_cdevsw, u, + *dev = make_dev_credf(MAKEDEV_REF, &tun_cdevsw, u, cred, UID_UUCP, GID_DIALER, 0600, "%s", name); - if (*dev != NULL) { - dev_ref(*dev); - (*dev)->si_flags |= SI_CHEAPCLONE; - } } if_clone_create(name, namelen, NULL); @@ -303,6 +295,7 @@ tunmodevent(module_t mod, int type, void *data) case MOD_UNLOAD: if_clone_detach(&tun_cloner); EVENTHANDLER_DEREGISTER(dev_clone, tag); + drain_dev_clone_events(); mtx_lock(&tunmtx); while ((tp = TAILQ_FIRST(&tunhead)) != NULL) { diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 523b9e8a8137..4127069641a4 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -141,7 +141,7 @@ struct ifnet { struct carp_if *if_carp; /* carp interface structure */ struct bpf_if *if_bpf; /* packet filter structure */ u_short if_index; /* numeric abbreviation for this if */ - short if_timer; /* time 'til if_watchdog called */ + short if_index_reserved; /* spare space to grow if_index */ struct ifvlantrunk *if_vlantrunk; /* pointer to 802.1q data */ int if_flags; /* up/down, broadcast, etc. */ int if_capabilities; /* interface features & capabilities */ @@ -161,8 +161,6 @@ struct ifnet { (struct ifnet *); int (*if_ioctl) /* ioctl routine */ (struct ifnet *, u_long, caddr_t); - void (*if_watchdog) /* timer routine */ - (struct ifnet *); void (*if_init) /* Init routine */ (void *); int (*if_resolvemulti) /* validate/resolve multicast */ @@ -205,7 +203,8 @@ struct ifnet { * be used with care where binary compatibility is required. */ char if_cspare[3]; - void *if_pspare[8]; + char *if_description; /* interface description */ + void *if_pspare[7]; int if_ispare[4]; }; @@ -341,6 +340,9 @@ void if_maddr_runlock(struct ifnet *ifp); /* if_multiaddrs */ } while(0) #ifdef _KERNEL +/* interface link layer address change event */ +typedef void (*iflladdr_event_handler_t)(void *, struct ifnet *); +EVENTHANDLER_DECLARE(iflladdr_event, iflladdr_event_handler_t); /* interface address change event */ typedef void (*ifaddr_event_handler_t)(void *, struct ifnet *); EVENTHANDLER_DECLARE(ifaddr_event, ifaddr_event_handler_t); @@ -601,12 +603,8 @@ drbr_flush(struct ifnet *ifp, struct buf_ring *br) struct mbuf *m; #ifdef ALTQ - if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd)) { - while (!IFQ_IS_EMPTY(&ifp->if_snd)) { - IFQ_DRV_DEQUEUE(&ifp->if_snd, m); - m_freem(m); - } - } + if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd)) + IFQ_PURGE(&ifp->if_snd); #endif while ((m = buf_ring_dequeue_sc(br)) != NULL) m_freem(m); @@ -627,7 +625,7 @@ drbr_dequeue(struct ifnet *ifp, struct buf_ring *br) struct mbuf *m; if (ALTQ_IS_ENABLED(&ifp->if_snd)) { - IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + IFQ_DEQUEUE(&ifp->if_snd, m); return (m); } #endif @@ -640,11 +638,15 @@ drbr_dequeue_cond(struct ifnet *ifp, struct buf_ring *br, { struct mbuf *m; #ifdef ALTQ - /* - * XXX need to evaluate / requeue - */ - if (ALTQ_IS_ENABLED(&ifp->if_snd)) { - IFQ_DRV_DEQUEUE(&ifp->if_snd, m); + if (ALTQ_IS_ENABLED(&ifp->if_snd)) { + IFQ_LOCK(&ifp->if_snd); + IFQ_POLL_NOLOCK(&ifp->if_snd, m); + if (m != NULL && func(m, arg) == 0) { + IFQ_UNLOCK(&ifp->if_snd); + return (NULL); + } + IFQ_DEQUEUE(&ifp->if_snd, m); + IFQ_UNLOCK(&ifp->if_snd); return (m); } #endif @@ -660,11 +662,21 @@ drbr_empty(struct ifnet *ifp, struct buf_ring *br) { #ifdef ALTQ if (ALTQ_IS_ENABLED(&ifp->if_snd)) - return (IFQ_DRV_IS_EMPTY(&ifp->if_snd)); + return (IFQ_IS_EMPTY(&ifp->if_snd)); #endif return (buf_ring_empty(br)); } +static __inline int +drbr_needs_enqueue(struct ifnet *ifp, struct buf_ring *br) +{ +#ifdef ALTQ + if (ALTQ_IS_ENABLED(&ifp->if_snd)) + return (1); +#endif + return (!buf_ring_empty(br)); +} + static __inline int drbr_inuse(struct ifnet *ifp, struct buf_ring *br) { @@ -712,6 +724,7 @@ struct ifaddr { struct mtx ifa_mtx; }; #define IFA_ROUTE RTF_UP /* route installed */ +#define IFA_RTSELF RTF_HOST /* loopback route to self installed */ /* for compatibility with other BSDs */ #define ifa_list ifa_link @@ -831,7 +844,7 @@ void if_delmulti_ifma(struct ifmultiaddr *); void if_detach(struct ifnet *); void if_vmove(struct ifnet *, struct vnet *); void if_purgeaddrs(struct ifnet *); -void if_purgemaddrs(struct ifnet *); +void if_delallmulti(struct ifnet *); void if_down(struct ifnet *); struct ifmultiaddr * if_findmulti(struct ifnet *, struct sockaddr *); @@ -845,7 +858,6 @@ void if_ref(struct ifnet *); void if_rele(struct ifnet *); int if_setlladdr(struct ifnet *, const u_char *, int); void if_up(struct ifnet *); -/*void ifinit(void);*/ /* declared in systm.h for main() */ int ifioctl(struct socket *, u_long, caddr_t, struct thread *); int ifpromisc(struct ifnet *, int); struct ifnet *ifunit(const char *); diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c index bb9068284bf0..f66504799a7b 100644 --- a/sys/net/if_vlan.c +++ b/sys/net/if_vlan.c @@ -25,8 +25,6 @@ * 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$ */ /* @@ -41,6 +39,9 @@ * and ask it to send them. */ +#include +__FBSDID("$FreeBSD$"); + #include "opt_vlan.h" #include @@ -138,6 +139,7 @@ SYSCTL_INT(_net_link_vlan, OID_AUTO, soft_pad, CTLFLAG_RW, &soft_pad, 0, static MALLOC_DEFINE(M_VLAN, VLANNAME, "802.1Q Virtual LAN Interface"); static eventhandler_tag ifdetach_tag; +static eventhandler_tag iflladdr_tag; /* * We have a global mutex, that is used to serialize configuration @@ -188,7 +190,7 @@ static int vlan_setmulti(struct ifnet *ifp); static int vlan_unconfig(struct ifnet *ifp); static int vlan_unconfig_locked(struct ifnet *ifp); static int vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag); -static void vlan_link_state(struct ifnet *ifp, int link); +static void vlan_link_state(struct ifnet *ifp); static void vlan_capabilities(struct ifvlan *ifv); static void vlan_trunk_capabilities(struct ifnet *ifp); @@ -199,6 +201,7 @@ static int vlan_clone_create(struct if_clone *, char *, size_t, caddr_t); static int vlan_clone_destroy(struct if_clone *, struct ifnet *); static void vlan_ifdetach(void *arg, struct ifnet *ifp); +static void vlan_iflladdr(void *arg, struct ifnet *ifp); static struct if_clone vlan_cloner = IFC_CLONE_INITIALIZER(VLANNAME, NULL, IF_MAXUNIT, NULL, vlan_clone_match, vlan_clone_create, vlan_clone_destroy); @@ -462,11 +465,52 @@ vlan_setmulti(struct ifnet *ifp) return (0); } +/* + * A handler for parent interface link layer address changes. + * If the parent interface link layer address is changed we + * should also change it on all children vlans. + */ +static void +vlan_iflladdr(void *arg __unused, struct ifnet *ifp) +{ + struct ifvlan *ifv; +#ifndef VLAN_ARRAY + struct ifvlan *next; +#endif + int i; + + /* + * Check if it's a trunk interface first of all + * to avoid needless locking. + */ + if (ifp->if_vlantrunk == NULL) + return; + + VLAN_LOCK(); + /* + * OK, it's a trunk. Loop over and change all vlan's lladdrs on it. + */ +#ifdef VLAN_ARRAY + for (i = 0; i < VLAN_ARRAY_SIZE; i++) + if ((ifv = ifp->if_vlantrunk->vlans[i])) { +#else /* VLAN_ARRAY */ + for (i = 0; i < (1 << ifp->if_vlantrunk->hwidth); i++) + LIST_FOREACH_SAFE(ifv, &ifp->if_vlantrunk->hash[i], ifv_list, next) { +#endif /* VLAN_ARRAY */ + VLAN_UNLOCK(); + if_setlladdr(ifv->ifv_ifp, IF_LLADDR(ifp), ETHER_ADDR_LEN); + VLAN_LOCK(); + } + VLAN_UNLOCK(); + +} + /* * A handler for network interface departure events. * Track departure of trunks here so that we don't access invalid * pointers or whatever if a trunk is ripped from under us, e.g., - * by ejecting its hot-plug card. + * by ejecting its hot-plug card. However, if an ifnet is simply + * being renamed, then there's no need to tear down the state. */ static void vlan_ifdetach(void *arg __unused, struct ifnet *ifp) @@ -481,6 +525,10 @@ vlan_ifdetach(void *arg __unused, struct ifnet *ifp) if (ifp->if_vlantrunk == NULL) return; + /* If the ifnet is just being renamed, don't do anything. */ + if (ifp->if_flags & IFF_RENAMING) + return; + VLAN_LOCK(); /* * OK, it's a trunk. Loop over and detach all vlan's on it. @@ -520,7 +568,7 @@ restart: extern void (*vlan_input_p)(struct ifnet *, struct mbuf *); /* For if_link_state_change() eyes only... */ -extern void (*vlan_link_state_p)(struct ifnet *, int); +extern void (*vlan_link_state_p)(struct ifnet *); static int vlan_modevent(module_t mod, int type, void *data) @@ -532,6 +580,10 @@ vlan_modevent(module_t mod, int type, void *data) vlan_ifdetach, NULL, EVENTHANDLER_PRI_ANY); if (ifdetach_tag == NULL) return (ENOMEM); + iflladdr_tag = EVENTHANDLER_REGISTER(iflladdr_event, + vlan_iflladdr, NULL, EVENTHANDLER_PRI_ANY); + if (iflladdr_tag == NULL) + return (ENOMEM); VLAN_LOCK_INIT(); vlan_input_p = vlan_input; vlan_link_state_p = vlan_link_state; @@ -550,6 +602,7 @@ vlan_modevent(module_t mod, int type, void *data) case MOD_UNLOAD: if_clone_detach(&vlan_cloner); EVENTHANDLER_DEREGISTER(ifnet_departure_event, ifdetach_tag); + EVENTHANDLER_DEREGISTER(iflladdr_event, iflladdr_tag); vlan_input_p = NULL; vlan_link_state_p = NULL; vlan_trunk_cap_p = NULL; @@ -577,7 +630,7 @@ vlan_clone_match_ethertag(struct if_clone *ifc, const char *name, int *tag) { const char *cp; struct ifnet *ifp; - int t = 0; + int t; /* Check for . style interface names. */ IFNET_RLOCK_NOSLEEP(); @@ -587,13 +640,15 @@ vlan_clone_match_ethertag(struct if_clone *ifc, const char *name, int *tag) if (strncmp(ifp->if_xname, name, strlen(ifp->if_xname)) != 0) continue; cp = name + strlen(ifp->if_xname); - if (*cp != '.') + if (*cp++ != '.') continue; - for(; *cp != '\0'; cp++) { - if (*cp < '0' || *cp > '9') - continue; + if (*cp == '\0') + continue; + t = 0; + for(; *cp >= '0' && *cp <= '9'; cp++) t = (t * 10) + (*cp - '0'); - } + if (*cp != '\0') + continue; if (tag != NULL) *tag = t; break; @@ -1226,7 +1281,7 @@ vlan_setflags(struct ifnet *ifp, int status) /* Inform all vlans that their parent has changed link state */ static void -vlan_link_state(struct ifnet *ifp, int link) +vlan_link_state(struct ifnet *ifp) { struct ifvlantrunk *trunk = ifp->if_vlantrunk; struct ifvlan *ifv; @@ -1268,11 +1323,26 @@ vlan_capabilities(struct ifvlan *ifv) if (p->if_capenable & IFCAP_VLAN_HWCSUM && p->if_capenable & IFCAP_VLAN_HWTAGGING) { ifp->if_capenable = p->if_capenable & IFCAP_HWCSUM; - ifp->if_hwassist = p->if_hwassist; + ifp->if_hwassist = p->if_hwassist & (CSUM_IP | CSUM_TCP | + CSUM_UDP | CSUM_SCTP | CSUM_IP_FRAGS | CSUM_FRAGMENT); } else { ifp->if_capenable = 0; ifp->if_hwassist = 0; } + /* + * If the parent interface can do TSO on VLANs then + * propagate the hardware-assisted flag. TSO on VLANs + * does not necessarily require hardware VLAN tagging. + */ + if (p->if_capabilities & IFCAP_VLAN_HWTSO) + ifp->if_capabilities |= p->if_capabilities & IFCAP_TSO; + if (p->if_capenable & IFCAP_VLAN_HWTSO) { + ifp->if_capenable |= p->if_capenable & IFCAP_TSO; + ifp->if_hwassist |= p->if_hwassist & CSUM_TSO; + } else { + ifp->if_capenable &= ~(p->if_capenable & IFCAP_TSO); + ifp->if_hwassist &= ~(p->if_hwassist & CSUM_TSO); + } } static void diff --git a/sys/net/netisr.c b/sys/net/netisr.c index c8da579834e3..4ac1fae4db72 100644 --- a/sys/net/netisr.c +++ b/sys/net/netisr.c @@ -1,7 +1,11 @@ /*- * Copyright (c) 2007-2009 Robert N. M. Watson + * Copyright (c) 2010 Juniper Networks, Inc. * All rights reserved. * + * This software was developed by Robert N. M. Watson under contract + * to Juniper Networks, Inc. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -32,13 +36,13 @@ __FBSDID("$FreeBSD$"); * dispatched) and asynchronous (deferred dispatch) processing of packets by * registered protocol handlers. Callers pass a protocol identifier and * packet to netisr, along with a direct dispatch hint, and work will either - * be immediately processed with the registered handler, or passed to a - * kernel software interrupt (SWI) thread for deferred dispatch. Callers - * will generally select one or the other based on: + * be immediately processed by the registered handler, or passed to a + * software interrupt (SWI) thread for deferred dispatch. Callers will + * generally select one or the other based on: * - * - Might directly dispatching a netisr handler lead to code reentrance or + * - Whether directly dispatching a netisr handler lead to code reentrance or * lock recursion, such as entering the socket code from the socket code. - * - Might directly dispatching a netisr handler lead to recursive + * - Whether directly dispatching a netisr handler lead to recursive * processing, such as when decapsulating several wrapped layers of tunnel * information (IPSEC within IPSEC within ...). * @@ -54,9 +58,9 @@ __FBSDID("$FreeBSD$"); * more than one flow. * * netisr supports several policy variations, represented by the - * NETISR_POLICY_* constants, allowing protocols to play a varying role in + * NETISR_POLICY_* constants, allowing protocols to play various roles in * identifying flows, assigning work to CPUs, etc. These are described in - * detail in netisr.h. + * netisr.h. */ #include "opt_ddb.h" @@ -83,9 +87,11 @@ __FBSDID("$FreeBSD$"); #include #endif +#define _WANT_NETISR_INTERNAL /* Enable definitions from netisr_internal.h */ #include #include #include +#include #include /*- @@ -95,13 +101,13 @@ __FBSDID("$FreeBSD$"); * * The following data structures and fields are protected by this lock: * - * - The np array, including all fields of struct netisr_proto. + * - The netisr_proto array, including all fields of struct netisr_proto. * - The nws array, including all fields of struct netisr_worker. * - The nws_array array. * * Note: the NETISR_LOCKING define controls whether read locks are acquired * in packet processing paths requiring netisr registration stability. This - * is disabled by default as it can lead to a measurable performance + * is disabled by default as it can lead to measurable performance * degradation even with rmlocks (3%-6% for loopback ping-pong traffic), and * because netisr registration and unregistration is extremely rare at * runtime. If it becomes more common, this decision should be revisited. @@ -156,110 +162,57 @@ SYSCTL_INT(_net_isr, OID_AUTO, direct, CTLFLAG_RW, */ static int netisr_maxthreads = -1; /* Max number of threads. */ TUNABLE_INT("net.isr.maxthreads", &netisr_maxthreads); -SYSCTL_INT(_net_isr, OID_AUTO, maxthreads, CTLFLAG_RD, +SYSCTL_INT(_net_isr, OID_AUTO, maxthreads, CTLFLAG_RDTUN, &netisr_maxthreads, 0, "Use at most this many CPUs for netisr processing"); static int netisr_bindthreads = 0; /* Bind threads to CPUs. */ TUNABLE_INT("net.isr.bindthreads", &netisr_bindthreads); -SYSCTL_INT(_net_isr, OID_AUTO, bindthreads, CTLFLAG_RD, +SYSCTL_INT(_net_isr, OID_AUTO, bindthreads, CTLFLAG_RDTUN, &netisr_bindthreads, 0, "Bind netisr threads to CPUs."); /* - * Limit per-workstream queues to at most net.isr.maxqlimit, both for initial - * configuration and later modification using netisr_setqlimit(). + * Limit per-workstream mbuf queue limits s to at most net.isr.maxqlimit, + * both for initial configuration and later modification using + * netisr_setqlimit(). */ #define NETISR_DEFAULT_MAXQLIMIT 10240 static u_int netisr_maxqlimit = NETISR_DEFAULT_MAXQLIMIT; TUNABLE_INT("net.isr.maxqlimit", &netisr_maxqlimit); -SYSCTL_INT(_net_isr, OID_AUTO, maxqlimit, CTLFLAG_RD, +SYSCTL_INT(_net_isr, OID_AUTO, maxqlimit, CTLFLAG_RDTUN, &netisr_maxqlimit, 0, "Maximum netisr per-protocol, per-CPU queue depth."); /* - * The default per-workstream queue limit for protocols that don't initialize - * the nh_qlimit field of their struct netisr_handler. If this is set above - * netisr_maxqlimit, we truncate it to the maximum during boot. + * The default per-workstream mbuf queue limit for protocols that don't + * initialize the nh_qlimit field of their struct netisr_handler. If this is + * set above netisr_maxqlimit, we truncate it to the maximum during boot. */ #define NETISR_DEFAULT_DEFAULTQLIMIT 256 static u_int netisr_defaultqlimit = NETISR_DEFAULT_DEFAULTQLIMIT; TUNABLE_INT("net.isr.defaultqlimit", &netisr_defaultqlimit); -SYSCTL_INT(_net_isr, OID_AUTO, defaultqlimit, CTLFLAG_RD, +SYSCTL_INT(_net_isr, OID_AUTO, defaultqlimit, CTLFLAG_RDTUN, &netisr_defaultqlimit, 0, "Default netisr per-protocol, per-CPU queue limit if not set by protocol"); /* - * Each protocol is described by a struct netisr_proto, which holds all - * global per-protocol information. This data structure is set up by - * netisr_register(), and derived from the public struct netisr_handler. + * Store and export the compile-time constant NETISR_MAXPROT limit on the + * number of protocols that can register with netisr at a time. This is + * required for crashdump analysis, as it sizes netisr_proto[]. */ -struct netisr_proto { - const char *np_name; /* Character string protocol name. */ - netisr_handler_t *np_handler; /* Protocol handler. */ - netisr_m2flow_t *np_m2flow; /* Query flow for untagged packet. */ - netisr_m2cpuid_t *np_m2cpuid; /* Query CPU to process packet on. */ - netisr_drainedcpu_t *np_drainedcpu; /* Callback when drained a queue. */ - u_int np_qlimit; /* Maximum per-CPU queue depth. */ - u_int np_policy; /* Work placement policy. */ -}; - -#define NETISR_MAXPROT 16 /* Compile-time limit. */ +static u_int netisr_maxprot = NETISR_MAXPROT; +SYSCTL_INT(_net_isr, OID_AUTO, maxprot, CTLFLAG_RD, + &netisr_maxprot, 0, + "Compile-time limit on the number of protocols supported by netisr."); /* - * The np array describes all registered protocols, indexed by protocol - * number. + * The netisr_proto array describes all registered protocols, indexed by + * protocol number. See netisr_internal.h for more details. */ -static struct netisr_proto np[NETISR_MAXPROT]; +static struct netisr_proto netisr_proto[NETISR_MAXPROT]; /* - * Protocol-specific work for each workstream is described by struct - * netisr_work. Each work descriptor consists of an mbuf queue and - * statistics. - */ -struct netisr_work { - /* - * Packet queue, linked by m_nextpkt. - */ - struct mbuf *nw_head; - struct mbuf *nw_tail; - u_int nw_len; - u_int nw_qlimit; - u_int nw_watermark; - - /* - * Statistics -- written unlocked, but mostly from curcpu. - */ - u_int64_t nw_dispatched; /* Number of direct dispatches. */ - u_int64_t nw_hybrid_dispatched; /* "" hybrid dispatches. */ - u_int64_t nw_qdrops; /* "" drops. */ - u_int64_t nw_queued; /* "" enqueues. */ - u_int64_t nw_handled; /* "" handled in worker. */ -}; - -/* - * Workstreams hold a set of ordered work across each protocol, and are - * described by netisr_workstream. Each workstream is associated with a - * worker thread, which in turn is pinned to a CPU. Work associated with a - * workstream can be processd in other threads during direct dispatch; - * concurrent processing is prevented by the NWS_RUNNING flag, which - * indicates that a thread is already processing the work queue. - */ -struct netisr_workstream { - struct intr_event *nws_intr_event; /* Handler for stream. */ - void *nws_swi_cookie; /* swi(9) cookie for stream. */ - struct mtx nws_mtx; /* Synchronize work. */ - u_int nws_cpu; /* CPU pinning. */ - u_int nws_flags; /* Wakeup flags. */ - u_int nws_pendingbits; /* Scheduled protocols. */ - - /* - * Each protocol has per-workstream data. - */ - struct netisr_work nws_work[NETISR_MAXPROT]; -} __aligned(CACHE_LINE_SIZE); - -/* - * Per-CPU workstream data. + * Per-CPU workstream data. See netisr_internal.h for more details. */ DPCPU_DEFINE(struct netisr_workstream, nws); @@ -278,13 +231,6 @@ static u_int nws_count; SYSCTL_INT(_net_isr, OID_AUTO, numthreads, CTLFLAG_RD, &nws_count, 0, "Number of extant netisr threads."); -/* - * Per-workstream flags. - */ -#define NWS_RUNNING 0x00000001 /* Currently running in a thread. */ -#define NWS_DISPATCHING 0x00000002 /* Currently being direct-dispatched. */ -#define NWS_SCHEDULED 0x00000004 /* Signal issued. */ - /* * Synchronization for each workstream: a mutex protects all mutable fields * in each stream, including per-protocol state (mbuf queues). The SWI is @@ -317,7 +263,7 @@ netisr_get_cpuid(u_int cpunumber) } /* - * The default implementation of -> CPU ID mapping. + * The default implementation of flow -> CPU ID mapping. * * Non-static so that protocols can use it to map their own work to specific * CPUs in a manner consistent to netisr for affinity purposes. @@ -373,32 +319,32 @@ netisr_register(const struct netisr_handler *nhp) * Test that no existing registration exists for this protocol. */ NETISR_WLOCK(); - KASSERT(np[proto].np_name == NULL, + KASSERT(netisr_proto[proto].np_name == NULL, ("%s(%u, %s): name present", __func__, proto, name)); - KASSERT(np[proto].np_handler == NULL, + KASSERT(netisr_proto[proto].np_handler == NULL, ("%s(%u, %s): handler present", __func__, proto, name)); - np[proto].np_name = name; - np[proto].np_handler = nhp->nh_handler; - np[proto].np_m2flow = nhp->nh_m2flow; - np[proto].np_m2cpuid = nhp->nh_m2cpuid; - np[proto].np_drainedcpu = nhp->nh_drainedcpu; + netisr_proto[proto].np_name = name; + netisr_proto[proto].np_handler = nhp->nh_handler; + netisr_proto[proto].np_m2flow = nhp->nh_m2flow; + netisr_proto[proto].np_m2cpuid = nhp->nh_m2cpuid; + netisr_proto[proto].np_drainedcpu = nhp->nh_drainedcpu; if (nhp->nh_qlimit == 0) - np[proto].np_qlimit = netisr_defaultqlimit; + netisr_proto[proto].np_qlimit = netisr_defaultqlimit; else if (nhp->nh_qlimit > netisr_maxqlimit) { printf("%s: %s requested queue limit %u capped to " "net.isr.maxqlimit %u\n", __func__, name, nhp->nh_qlimit, netisr_maxqlimit); - np[proto].np_qlimit = netisr_maxqlimit; + netisr_proto[proto].np_qlimit = netisr_maxqlimit; } else - np[proto].np_qlimit = nhp->nh_qlimit; - np[proto].np_policy = nhp->nh_policy; + netisr_proto[proto].np_qlimit = nhp->nh_qlimit; + netisr_proto[proto].np_policy = nhp->nh_policy; for (i = 0; i <= mp_maxid; i++) { if (CPU_ABSENT(i)) continue; npwp = &(DPCPU_ID_PTR(i, nws))->nws_work[proto]; bzero(npwp, sizeof(*npwp)); - npwp->nw_qlimit = np[proto].np_qlimit; + npwp->nw_qlimit = netisr_proto[proto].np_qlimit; } NETISR_WUNLOCK(); } @@ -423,7 +369,7 @@ netisr_clearqdrops(const struct netisr_handler *nhp) ("%s(%u): protocol too big for %s", __func__, proto, name)); NETISR_WLOCK(); - KASSERT(np[proto].np_handler != NULL, + KASSERT(netisr_proto[proto].np_handler != NULL, ("%s(%u): protocol not registered for %s", __func__, proto, name)); @@ -437,7 +383,7 @@ netisr_clearqdrops(const struct netisr_handler *nhp) } /* - * Query the current drop counters across all workstreams for a protocol. + * Query current drop counters across all workstreams for a protocol. */ void netisr_getqdrops(const struct netisr_handler *nhp, u_int64_t *qdropp) @@ -458,7 +404,7 @@ netisr_getqdrops(const struct netisr_handler *nhp, u_int64_t *qdropp) ("%s(%u): protocol too big for %s", __func__, proto, name)); NETISR_RLOCK(&tracker); - KASSERT(np[proto].np_handler != NULL, + KASSERT(netisr_proto[proto].np_handler != NULL, ("%s(%u): protocol not registered for %s", __func__, proto, name)); @@ -472,7 +418,7 @@ netisr_getqdrops(const struct netisr_handler *nhp, u_int64_t *qdropp) } /* - * Query the current queue limit for per-workstream queues for a protocol. + * Query current per-workstream queue limit for a protocol. */ void netisr_getqlimit(const struct netisr_handler *nhp, u_int *qlimitp) @@ -491,10 +437,10 @@ netisr_getqlimit(const struct netisr_handler *nhp, u_int *qlimitp) ("%s(%u): protocol too big for %s", __func__, proto, name)); NETISR_RLOCK(&tracker); - KASSERT(np[proto].np_handler != NULL, + KASSERT(netisr_proto[proto].np_handler != NULL, ("%s(%u): protocol not registered for %s", __func__, proto, name)); - *qlimitp = np[proto].np_qlimit; + *qlimitp = netisr_proto[proto].np_qlimit; NETISR_RUNLOCK(&tracker); } @@ -523,11 +469,11 @@ netisr_setqlimit(const struct netisr_handler *nhp, u_int qlimit) ("%s(%u): protocol too big for %s", __func__, proto, name)); NETISR_WLOCK(); - KASSERT(np[proto].np_handler != NULL, + KASSERT(netisr_proto[proto].np_handler != NULL, ("%s(%u): protocol not registered for %s", __func__, proto, name)); - np[proto].np_qlimit = qlimit; + netisr_proto[proto].np_qlimit = qlimit; for (i = 0; i <= mp_maxid; i++) { if (CPU_ABSENT(i)) continue; @@ -584,16 +530,16 @@ netisr_unregister(const struct netisr_handler *nhp) ("%s(%u): protocol too big for %s", __func__, proto, name)); NETISR_WLOCK(); - KASSERT(np[proto].np_handler != NULL, + KASSERT(netisr_proto[proto].np_handler != NULL, ("%s(%u): protocol not registered for %s", __func__, proto, name)); - np[proto].np_name = NULL; - np[proto].np_handler = NULL; - np[proto].np_m2flow = NULL; - np[proto].np_m2cpuid = NULL; - np[proto].np_qlimit = 0; - np[proto].np_policy = 0; + netisr_proto[proto].np_name = NULL; + netisr_proto[proto].np_handler = NULL; + netisr_proto[proto].np_m2flow = NULL; + netisr_proto[proto].np_m2cpuid = NULL; + netisr_proto[proto].np_qlimit = 0; + netisr_proto[proto].np_policy = 0; for (i = 0; i <= mp_maxid; i++) { if (CPU_ABSENT(i)) continue; @@ -713,20 +659,20 @@ netisr_process_workstream_proto(struct netisr_workstream *nwsp, u_int proto) local_npw.nw_len--; VNET_ASSERT(m->m_pkthdr.rcvif != NULL); CURVNET_SET(m->m_pkthdr.rcvif->if_vnet); - np[proto].np_handler(m); + netisr_proto[proto].np_handler(m); CURVNET_RESTORE(); } KASSERT(local_npw.nw_len == 0, ("%s(%u): len %u", __func__, proto, local_npw.nw_len)); - if (np[proto].np_drainedcpu) - np[proto].np_drainedcpu(nwsp->nws_cpu); + if (netisr_proto[proto].np_drainedcpu) + netisr_proto[proto].np_drainedcpu(nwsp->nws_cpu); NWS_LOCK(nwsp); npwp->nw_handled += handled; return (handled); } /* - * SWI handler for netisr -- processes prackets in a set of workstreams that + * SWI handler for netisr -- processes packets in a set of workstreams that * it owns, woken up by calls to NWS_SIGNAL(). If this workstream is already * being direct dispatched, go back to sleep and wait for the dispatching * thread to wake us up again. @@ -794,6 +740,11 @@ netisr_queue_workstream(struct netisr_workstream *nwsp, u_int proto, npwp->nw_len++; if (npwp->nw_len > npwp->nw_watermark) npwp->nw_watermark = npwp->nw_len; + + /* + * We must set the bit regardless of NWS_RUNNING, so that + * swi_net() keeps calling netisr_process_workstream_proto(). + */ nwsp->nws_pendingbits |= (1 << proto); if (!(nwsp->nws_flags & (NWS_RUNNING | NWS_DISPATCHING | NWS_SCHEDULED))) { @@ -850,10 +801,10 @@ netisr_queue_src(u_int proto, uintptr_t source, struct mbuf *m) #ifdef NETISR_LOCKING NETISR_RLOCK(&tracker); #endif - KASSERT(np[proto].np_handler != NULL, + KASSERT(netisr_proto[proto].np_handler != NULL, ("%s: invalid proto %u", __func__, proto)); - m = netisr_select_cpuid(&np[proto], source, m, &cpuid); + m = netisr_select_cpuid(&netisr_proto[proto], source, m, &cpuid); if (m != NULL) { KASSERT(!CPU_ABSENT(cpuid), ("%s: CPU %u absent", __func__, cpuid)); @@ -874,7 +825,7 @@ netisr_queue(u_int proto, struct mbuf *m) } /* - * Dispatch a packet for netisr processing, direct dispatch permitted by + * Dispatch a packet for netisr processing; direct dispatch is permitted by * calling context. */ int @@ -899,7 +850,7 @@ netisr_dispatch_src(u_int proto, uintptr_t source, struct mbuf *m) #ifdef NETISR_LOCKING NETISR_RLOCK(&tracker); #endif - KASSERT(np[proto].np_handler != NULL, + KASSERT(netisr_proto[proto].np_handler != NULL, ("%s: invalid proto %u", __func__, proto)); /* @@ -914,7 +865,7 @@ netisr_dispatch_src(u_int proto, uintptr_t source, struct mbuf *m) npwp = &nwsp->nws_work[proto]; npwp->nw_dispatched++; npwp->nw_handled++; - np[proto].np_handler(m); + netisr_proto[proto].np_handler(m); error = 0; goto out_unlock; } @@ -924,7 +875,7 @@ netisr_dispatch_src(u_int proto, uintptr_t source, struct mbuf *m) * dispatch if we're on the right CPU and the netisr worker isn't * already running. */ - m = netisr_select_cpuid(&np[proto], source, m, &cpuid); + m = netisr_select_cpuid(&netisr_proto[proto], source, m, &cpuid); if (m == NULL) { error = ENOBUFS; goto out_unlock; @@ -961,7 +912,7 @@ netisr_dispatch_src(u_int proto, uintptr_t source, struct mbuf *m) */ nwsp->nws_flags |= NWS_DISPATCHING; NWS_UNLOCK(nwsp); - np[proto].np_handler(m); + netisr_proto[proto].np_handler(m); NWS_LOCK(nwsp); nwsp->nws_flags &= ~NWS_DISPATCHING; npwp->nw_handled++; @@ -1068,12 +1019,12 @@ netisr_init(void *arg) if (netisr_maxthreads < 1) netisr_maxthreads = 1; if (netisr_maxthreads > mp_ncpus) { - printf("netisr2: forcing maxthreads from %d to %d\n", + printf("netisr_init: forcing maxthreads from %d to %d\n", netisr_maxthreads, mp_ncpus); netisr_maxthreads = mp_ncpus; } if (netisr_defaultqlimit > netisr_maxqlimit) { - printf("netisr2: forcing defaultqlimit from %d to %d\n", + printf("netisr_init: forcing defaultqlimit from %d to %d\n", netisr_defaultqlimit, netisr_maxqlimit); netisr_defaultqlimit = netisr_maxqlimit; } @@ -1084,8 +1035,8 @@ netisr_init(void *arg) * polling disables parallel netisr workers. */ if (netisr_maxthreads != 1 || netisr_bindthreads != 0) { - printf("netisr2: forcing maxthreads to 1 and bindthreads to " - "0 for device polling\n"); + printf("netisr_init: forcing maxthreads to 1 and " + "bindthreads to 0 for device polling\n"); netisr_maxthreads = 1; netisr_bindthreads = 0; } @@ -1118,6 +1069,170 @@ netisr_start(void *arg) } SYSINIT(netisr_start, SI_SUB_SMP, SI_ORDER_MIDDLE, netisr_start, NULL); +/* + * Sysctl monitoring for netisr: query a list of registered protocols. + */ +static int +sysctl_netisr_proto(SYSCTL_HANDLER_ARGS) +{ + struct rm_priotracker tracker; + struct sysctl_netisr_proto *snpp, *snp_array; + struct netisr_proto *npp; + u_int counter, proto; + int error; + + if (req->newptr != NULL) + return (EINVAL); + snp_array = malloc(sizeof(*snp_array) * NETISR_MAXPROT, M_TEMP, + M_ZERO | M_WAITOK); + counter = 0; + NETISR_RLOCK(&tracker); + for (proto = 0; proto < NETISR_MAXPROT; proto++) { + npp = &netisr_proto[proto]; + if (npp->np_name == NULL) + continue; + snpp = &snp_array[counter]; + snpp->snp_version = sizeof(*snpp); + strlcpy(snpp->snp_name, npp->np_name, NETISR_NAMEMAXLEN); + snpp->snp_proto = proto; + snpp->snp_qlimit = npp->np_qlimit; + snpp->snp_policy = npp->np_policy; + if (npp->np_m2flow != NULL) + snpp->snp_flags |= NETISR_SNP_FLAGS_M2FLOW; + if (npp->np_m2cpuid != NULL) + snpp->snp_flags |= NETISR_SNP_FLAGS_M2CPUID; + if (npp->np_drainedcpu != NULL) + snpp->snp_flags |= NETISR_SNP_FLAGS_DRAINEDCPU; + counter++; + } + NETISR_RUNLOCK(&tracker); + KASSERT(counter <= NETISR_MAXPROT, + ("sysctl_netisr_proto: counter too big (%d)", counter)); + error = SYSCTL_OUT(req, snp_array, sizeof(*snp_array) * counter); + free(snp_array, M_TEMP); + return (error); +} + +SYSCTL_PROC(_net_isr, OID_AUTO, proto, + CTLFLAG_RD|CTLTYPE_STRUCT|CTLFLAG_MPSAFE, 0, 0, sysctl_netisr_proto, + "S,sysctl_netisr_proto", + "Return list of protocols registered with netisr"); + +/* + * Sysctl monitoring for netisr: query a list of workstreams. + */ +static int +sysctl_netisr_workstream(SYSCTL_HANDLER_ARGS) +{ + struct rm_priotracker tracker; + struct sysctl_netisr_workstream *snwsp, *snws_array; + struct netisr_workstream *nwsp; + u_int counter, cpuid; + int error; + + if (req->newptr != NULL) + return (EINVAL); + snws_array = malloc(sizeof(*snws_array) * MAXCPU, M_TEMP, + M_ZERO | M_WAITOK); + counter = 0; + NETISR_RLOCK(&tracker); + for (cpuid = 0; cpuid < MAXCPU; cpuid++) { + if (CPU_ABSENT(cpuid)) + continue; + nwsp = DPCPU_ID_PTR(cpuid, nws); + if (nwsp->nws_intr_event == NULL) + continue; + NWS_LOCK(nwsp); + snwsp = &snws_array[counter]; + snwsp->snws_version = sizeof(*snwsp); + + /* + * For now, we equate workstream IDs and CPU IDs in the + * kernel, but expose them independently to userspace in case + * that assumption changes in the future. + */ + snwsp->snws_wsid = cpuid; + snwsp->snws_cpu = cpuid; + if (nwsp->nws_intr_event != NULL) + snwsp->snws_flags |= NETISR_SNWS_FLAGS_INTR; + NWS_UNLOCK(nwsp); + counter++; + } + NETISR_RUNLOCK(&tracker); + KASSERT(counter <= MAXCPU, + ("sysctl_netisr_workstream: counter too big (%d)", counter)); + error = SYSCTL_OUT(req, snws_array, sizeof(*snws_array) * counter); + free(snws_array, M_TEMP); + return (error); +} + +SYSCTL_PROC(_net_isr, OID_AUTO, workstream, + CTLFLAG_RD|CTLTYPE_STRUCT|CTLFLAG_MPSAFE, 0, 0, sysctl_netisr_workstream, + "S,sysctl_netisr_workstream", + "Return list of workstreams implemented by netisr"); + +/* + * Sysctl monitoring for netisr: query per-protocol data across all + * workstreams. + */ +static int +sysctl_netisr_work(SYSCTL_HANDLER_ARGS) +{ + struct rm_priotracker tracker; + struct sysctl_netisr_work *snwp, *snw_array; + struct netisr_workstream *nwsp; + struct netisr_proto *npp; + struct netisr_work *nwp; + u_int counter, cpuid, proto; + int error; + + if (req->newptr != NULL) + return (EINVAL); + snw_array = malloc(sizeof(*snw_array) * MAXCPU * NETISR_MAXPROT, + M_TEMP, M_ZERO | M_WAITOK); + counter = 0; + NETISR_RLOCK(&tracker); + for (cpuid = 0; cpuid < MAXCPU; cpuid++) { + if (CPU_ABSENT(cpuid)) + continue; + nwsp = DPCPU_ID_PTR(cpuid, nws); + if (nwsp->nws_intr_event == NULL) + continue; + NWS_LOCK(nwsp); + for (proto = 0; proto < NETISR_MAXPROT; proto++) { + npp = &netisr_proto[proto]; + if (npp->np_name == NULL) + continue; + nwp = &nwsp->nws_work[proto]; + snwp = &snw_array[counter]; + snwp->snw_version = sizeof(*snwp); + snwp->snw_wsid = cpuid; /* See comment above. */ + snwp->snw_proto = proto; + snwp->snw_len = nwp->nw_len; + snwp->snw_watermark = nwp->nw_watermark; + snwp->snw_dispatched = nwp->nw_dispatched; + snwp->snw_hybrid_dispatched = + nwp->nw_hybrid_dispatched; + snwp->snw_qdrops = nwp->nw_qdrops; + snwp->snw_queued = nwp->nw_queued; + snwp->snw_handled = nwp->nw_handled; + counter++; + } + NWS_UNLOCK(nwsp); + } + KASSERT(counter <= MAXCPU * NETISR_MAXPROT, + ("sysctl_netisr_work: counter too big (%d)", counter)); + NETISR_RUNLOCK(&tracker); + error = SYSCTL_OUT(req, snw_array, sizeof(*snw_array) * counter); + free(snw_array, M_TEMP); + return (error); +} + +SYSCTL_PROC(_net_isr, OID_AUTO, work, + CTLFLAG_RD|CTLTYPE_STRUCT|CTLFLAG_MPSAFE, 0, 0, sysctl_netisr_work, + "S,sysctl_netisr_work", + "Return list of per-workstream, per-protocol work in netisr"); + #ifdef DDB DB_SHOW_COMMAND(netisr, db_show_netisr) { @@ -1136,7 +1251,7 @@ DB_SHOW_COMMAND(netisr, db_show_netisr) continue; first = 1; for (proto = 0; proto < NETISR_MAXPROT; proto++) { - if (np[proto].np_handler == NULL) + if (netisr_proto[proto].np_handler == NULL) continue; nwp = &nwsp->nws_work[proto]; if (first) { @@ -1146,7 +1261,7 @@ DB_SHOW_COMMAND(netisr, db_show_netisr) db_printf("%3s ", ""); db_printf( "%6s %5d %5d %5d %8ju %8ju %8ju %8ju\n", - np[proto].np_name, nwp->nw_len, + netisr_proto[proto].np_name, nwp->nw_len, nwp->nw_watermark, nwp->nw_qlimit, nwp->nw_dispatched, nwp->nw_hybrid_dispatched, nwp->nw_qdrops, nwp->nw_queued); diff --git a/sys/net/netisr.h b/sys/net/netisr.h index 0ab424fe5221..cd692f6d601d 100644 --- a/sys/net/netisr.h +++ b/sys/net/netisr.h @@ -1,7 +1,11 @@ /*- * Copyright (c) 2007-2009 Robert N. M. Watson + * Copyright (c) 2010 Juniper Networks, Inc. * All rights reserved. * + * This software was developed by Robert N. M. Watson under contract + * to Juniper Networks, Inc. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -28,7 +32,6 @@ #ifndef _NET_NETISR_H_ #define _NET_NETISR_H_ -#ifdef _KERNEL /* * The netisr (network interrupt service routine) provides a deferred @@ -39,6 +42,13 @@ * Historically, this was implemented by the BSD software ISR facility; it is * now implemented via a software ithread (SWI). */ + +/* + * Protocol numbers, which are encoded in monitoring applications and kernel + * modules. Internally, these are used in bit shift operations so must have + * a value 0 < proto < 32; we currently further limit at compile-time to 16 + * for array-sizing purposes. + */ #define NETISR_IP 1 #define NETISR_IGMP 2 /* IGMPv3 output queue */ #define NETISR_ROUTE 3 /* routing socket */ @@ -52,6 +62,78 @@ #define NETISR_NATM 11 #define NETISR_EPAIR 12 /* if_epair(4) */ +/* + * Protocol ordering and affinity policy constants. See the detailed + * discussion of policies later in the file. + */ +#define NETISR_POLICY_SOURCE 1 /* Maintain source ordering. */ +#define NETISR_POLICY_FLOW 2 /* Maintain flow ordering. */ +#define NETISR_POLICY_CPU 3 /* Protocol determines CPU placement. */ + +/* + * Monitoring data structures, exported by sysctl(2). + * + * Three sysctls are defined. First, a per-protocol structure exported by + * net.isr.proto. + */ +#define NETISR_NAMEMAXLEN 32 +struct sysctl_netisr_proto { + u_int snp_version; /* Length of struct. */ + char snp_name[NETISR_NAMEMAXLEN]; /* nh_name */ + u_int snp_proto; /* nh_proto */ + u_int snp_qlimit; /* nh_qlimit */ + u_int snp_policy; /* nh_policy */ + u_int snp_flags; /* Various flags. */ + u_int _snp_ispare[7]; +}; + +/* + * Flags for sysctl_netisr_proto.snp_flags. + */ +#define NETISR_SNP_FLAGS_M2FLOW 0x00000001 /* nh_m2flow */ +#define NETISR_SNP_FLAGS_M2CPUID 0x00000002 /* nh_m2cpuid */ +#define NETISR_SNP_FLAGS_DRAINEDCPU 0x00000004 /* nh_drainedcpu */ + +/* + * Next, a structure per-workstream, with per-protocol data, exported as + * net.isr.workstream. + */ +struct sysctl_netisr_workstream { + u_int snws_version; /* Length of struct. */ + u_int snws_flags; /* Various flags. */ + u_int snws_wsid; /* Workstream ID. */ + u_int snws_cpu; /* nws_cpu */ + u_int _snws_ispare[12]; +}; + +/* + * Flags for sysctl_netisr_workstream.snws_flags + */ +#define NETISR_SNWS_FLAGS_INTR 0x00000001 /* nws_intr_event */ + +/* + * Finally, a per-workstream-per-protocol structure, exported as + * net.isr.work. + */ +struct sysctl_netisr_work { + u_int snw_version; /* Length of struct. */ + u_int snw_wsid; /* Workstream ID. */ + u_int snw_proto; /* Protocol number. */ + u_int snw_len; /* nw_len */ + u_int snw_watermark; /* nw_watermark */ + u_int _snw_ispare[3]; + + uint64_t snw_dispatched; /* nw_dispatched */ + uint64_t snw_hybrid_dispatched; /* nw_hybrid_dispatched */ + uint64_t snw_qdrops; /* nw_qdrops */ + uint64_t snw_queued; /* nw_queued */ + uint64_t snw_handled; /* nw_handled */ + + uint64_t _snw_llspare[7]; +}; + +#ifdef _KERNEL + /*- * Protocols express ordering constraints and affinity preferences by * implementing one or neither of nh_m2flow and nh_m2cpuid, which are used by @@ -85,16 +167,12 @@ * can rebalance work. */ struct mbuf; -typedef void netisr_handler_t (struct mbuf *m); +typedef void netisr_handler_t(struct mbuf *m); typedef struct mbuf *netisr_m2cpuid_t(struct mbuf *m, uintptr_t source, u_int *cpuid); typedef struct mbuf *netisr_m2flow_t(struct mbuf *m, uintptr_t source); typedef void netisr_drainedcpu_t(u_int cpuid); -#define NETISR_POLICY_SOURCE 1 /* Maintain source ordering. */ -#define NETISR_POLICY_FLOW 2 /* Maintain flow ordering. */ -#define NETISR_POLICY_CPU 3 /* Protocol determines CPU placement. */ - /* * Data structure describing a protocol handler. */ diff --git a/sys/net/netisr_internal.h b/sys/net/netisr_internal.h new file mode 100644 index 000000000000..40afaf16d839 --- /dev/null +++ b/sys/net/netisr_internal.h @@ -0,0 +1,127 @@ +/*- + * Copyright (c) 2007-2009 Robert N. M. Watson + * Copyright (c) 2010 Juniper Networks, Inc. + * All rights reserved. + * + * This software was developed by Robert N. M. Watson under contract + * to Juniper Networks, Inc. + * + * 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$ + */ + +#ifndef _NET_NETISR_INTERNAL_H_ +#define _NET_NETISR_INTERNAL_H_ + +#ifndef _WANT_NETISR_INTERNAL +#error "no user-serviceable parts inside" +#endif + +/* + * These definitions are private to the netisr implementation, but provided + * here for use by post-mortem crashdump analysis tools. They should not be + * used in any other context as they can and will change. Public definitions + * may be found in netisr.h. + */ + +#ifndef _KERNEL +typedef void *netisr_handler_t; +typedef void *netisr_m2flow_t; +typedef void *netisr_m2cpuid_t; +typedef void *netisr_drainedcpu_t; +#endif + +/* + * Each protocol is described by a struct netisr_proto, which holds all + * global per-protocol information. This data structure is set up by + * netisr_register(), and derived from the public struct netisr_handler. + */ +struct netisr_proto { + const char *np_name; /* Character string protocol name. */ + netisr_handler_t *np_handler; /* Protocol handler. */ + netisr_m2flow_t *np_m2flow; /* Query flow for untagged packet. */ + netisr_m2cpuid_t *np_m2cpuid; /* Query CPU to process packet on. */ + netisr_drainedcpu_t *np_drainedcpu; /* Callback when drained a queue. */ + u_int np_qlimit; /* Maximum per-CPU queue depth. */ + u_int np_policy; /* Work placement policy. */ +}; + +#define NETISR_MAXPROT 16 /* Compile-time limit. */ + +/* + * Protocol-specific work for each workstream is described by struct + * netisr_work. Each work descriptor consists of an mbuf queue and + * statistics. + */ +struct netisr_work { + /* + * Packet queue, linked by m_nextpkt. + */ + struct mbuf *nw_head; + struct mbuf *nw_tail; + u_int nw_len; + u_int nw_qlimit; + u_int nw_watermark; + + /* + * Statistics -- written unlocked, but mostly from curcpu. + */ + u_int64_t nw_dispatched; /* Number of direct dispatches. */ + u_int64_t nw_hybrid_dispatched; /* "" hybrid dispatches. */ + u_int64_t nw_qdrops; /* "" drops. */ + u_int64_t nw_queued; /* "" enqueues. */ + u_int64_t nw_handled; /* "" handled in worker. */ +}; + +/* + * Workstreams hold a queue of ordered work across each protocol, and are + * described by netisr_workstream. Each workstream is associated with a + * worker thread, which in turn is pinned to a CPU. Work associated with a + * workstream can be processd in other threads during direct dispatch; + * concurrent processing is prevented by the NWS_RUNNING flag, which + * indicates that a thread is already processing the work queue. It is + * important to prevent a directly dispatched packet from "skipping ahead" of + * work already in the workstream queue. + */ +struct netisr_workstream { + struct intr_event *nws_intr_event; /* Handler for stream. */ + void *nws_swi_cookie; /* swi(9) cookie for stream. */ + struct mtx nws_mtx; /* Synchronize work. */ + u_int nws_cpu; /* CPU pinning. */ + u_int nws_flags; /* Wakeup flags. */ + u_int nws_pendingbits; /* Scheduled protocols. */ + + /* + * Each protocol has per-workstream data. + */ + struct netisr_work nws_work[NETISR_MAXPROT]; +} __aligned(CACHE_LINE_SIZE); + +/* + * Per-workstream flags. + */ +#define NWS_RUNNING 0x00000001 /* Currently running in a thread. */ +#define NWS_DISPATCHING 0x00000002 /* Currently being direct-dispatched. */ +#define NWS_SCHEDULED 0x00000004 /* Signal issued. */ + +#endif /* !_NET_NETISR_INTERNAL_H_ */ diff --git a/sys/net/pfil.c b/sys/net/pfil.c index 3018eb9a5787..a11950f64800 100644 --- a/sys/net/pfil.c +++ b/sys/net/pfil.c @@ -49,15 +49,18 @@ static struct mtx pfil_global_lock; -MTX_SYSINIT(pfil_heads_lock, &pfil_global_lock, "pfil_head_list lock", MTX_DEF); +MTX_SYSINIT(pfil_heads_lock, &pfil_global_lock, "pfil_head_list lock", + MTX_DEF); static int pfil_list_add(pfil_list_t *, struct packet_filter_hook *, int); static int pfil_list_remove(pfil_list_t *, - int (*)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *), void *); + int (*)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *), + void *); -LIST_HEAD(, pfil_head) pfil_head_list = - LIST_HEAD_INITIALIZER(&pfil_head_list); +LIST_HEAD(pfilheadhead, pfil_head); +VNET_DEFINE(struct pfilheadhead, pfil_head_list); +#define V_pfil_head_list VNET(pfil_head_list) /* * pfil_run_hooks() runs the specified packet filter hooks. @@ -76,20 +79,20 @@ pfil_run_hooks(struct pfil_head *ph, struct mbuf **mp, struct ifnet *ifp, for (pfh = pfil_hook_get(dir, ph); pfh != NULL; pfh = TAILQ_NEXT(pfh, pfil_link)) { if (pfh->pfil_func != NULL) { - rv = (*pfh->pfil_func)(pfh->pfil_arg, &m, ifp, dir, inp); + rv = (*pfh->pfil_func)(pfh->pfil_arg, &m, ifp, dir, + inp); if (rv != 0 || m == NULL) break; } } PFIL_RUNLOCK(ph, &rmpt); - *mp = m; return (rv); } /* - * pfil_head_register() registers a pfil_head with the packet filter - * hook mechanism. + * pfil_head_register() registers a pfil_head with the packet filter hook + * mechanism. */ int pfil_head_register(struct pfil_head *ph) @@ -97,18 +100,18 @@ pfil_head_register(struct pfil_head *ph) struct pfil_head *lph; PFIL_LIST_LOCK(); - LIST_FOREACH(lph, &pfil_head_list, ph_list) { + LIST_FOREACH(lph, &V_pfil_head_list, ph_list) { if (ph->ph_type == lph->ph_type && ph->ph_un.phu_val == lph->ph_un.phu_val) { PFIL_LIST_UNLOCK(); - return EEXIST; + return (EEXIST); } } PFIL_LOCK_INIT(ph); ph->ph_nhooks = 0; TAILQ_INIT(&ph->ph_in); TAILQ_INIT(&ph->ph_out); - LIST_INSERT_HEAD(&pfil_head_list, ph, ph_list); + LIST_INSERT_HEAD(&V_pfil_head_list, ph, ph_list); PFIL_LIST_UNLOCK(); return (0); } @@ -143,11 +146,10 @@ pfil_head_get(int type, u_long val) struct pfil_head *ph; PFIL_LIST_LOCK(); - LIST_FOREACH(ph, &pfil_head_list, ph_list) + LIST_FOREACH(ph, &V_pfil_head_list, ph_list) if (ph->ph_type == type && ph->ph_un.phu_val == val) break; PFIL_LIST_UNLOCK(); - return (ph); } @@ -204,7 +206,7 @@ pfil_add_hook(int (*func)(void *, struct mbuf **, struct ifnet *, int, ph->ph_nhooks++; } PFIL_WUNLOCK(ph); - return 0; + return (0); locked_error: PFIL_WUNLOCK(ph); error: @@ -212,21 +214,20 @@ error: free(pfh1, M_IFADDR); if (pfh2 != NULL) free(pfh2, M_IFADDR); - return err; + return (err); } /* - * pfil_remove_hook removes a specific function from the packet filter - * hook list. + * pfil_remove_hook removes a specific function from the packet filter hook + * list. */ int -pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *), - void *arg, int flags, struct pfil_head *ph) +pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *, int, + struct inpcb *), void *arg, int flags, struct pfil_head *ph) { int err = 0; PFIL_WLOCK(ph); - if (flags & PFIL_IN) { err = pfil_list_remove(&ph->ph_in, func, arg); if (err == 0) @@ -238,8 +239,7 @@ pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *, int, struct ph->ph_nhooks--; } PFIL_WUNLOCK(ph); - - return err; + return (err); } static int @@ -253,17 +253,17 @@ pfil_list_add(pfil_list_t *list, struct packet_filter_hook *pfh1, int flags) TAILQ_FOREACH(pfh, list, pfil_link) if (pfh->pfil_func == pfh1->pfil_func && pfh->pfil_arg == pfh1->pfil_arg) - return EEXIST; + return (EEXIST); + /* - * insert the input list in reverse order of the output list - * so that the same path is followed in or out of the kernel. + * Insert the input list in reverse order of the output list so that + * the same path is followed in or out of the kernel. */ if (flags & PFIL_IN) TAILQ_INSERT_HEAD(list, pfh1, pfil_link); else TAILQ_INSERT_TAIL(list, pfh1, pfil_link); - - return 0; + return (0); } /* @@ -272,7 +272,8 @@ pfil_list_add(pfil_list_t *list, struct packet_filter_hook *pfh1, int flags) */ static int pfil_list_remove(pfil_list_t *list, - int (*func)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *), void *arg) + int (*func)(void *, struct mbuf **, struct ifnet *, int, struct inpcb *), + void *arg) { struct packet_filter_hook *pfh; @@ -280,7 +281,51 @@ pfil_list_remove(pfil_list_t *list, if (pfh->pfil_func == func && pfh->pfil_arg == arg) { TAILQ_REMOVE(list, pfh, pfil_link); free(pfh, M_IFADDR); - return 0; + return (0); } - return ENOENT; + return (ENOENT); } + +/* + * Stuff that must be initialized for every instance (including the first of + * course). + */ +static int +vnet_pfil_init(const void *unused) +{ + + LIST_INIT(&V_pfil_head_list); + return (0); +} + +/* + * Called for the removal of each instance. + */ +static int +vnet_pfil_uninit(const void *unused) +{ + + /* XXX should panic if list is not empty */ + return (0); +} + +/* Define startup order. */ +#define PFIL_SYSINIT_ORDER SI_SUB_PROTO_BEGIN +#define PFIL_MODEVENT_ORDER (SI_ORDER_FIRST) /* On boot slot in here. */ +#define PFIL_VNET_ORDER (PFIL_MODEVENT_ORDER + 2) /* Later still. */ + +/* + * Starting up. + * + * VNET_SYSINIT is called for each existing vnet and each new vnet. + */ +VNET_SYSINIT(vnet_pfil_init, PFIL_SYSINIT_ORDER, PFIL_VNET_ORDER, + vnet_pfil_init, NULL); + +/* + * Closing up shop. These are done in REVERSE ORDER. Not called on reboot. + * + * VNET_SYSUNINIT is called for each exiting vnet as it exits. + */ +VNET_SYSUNINIT(vnet_pfil_uninit, PFIL_SYSINIT_ORDER, PFIL_VNET_ORDER, + vnet_pfil_uninit, NULL); diff --git a/sys/net/pfil.h b/sys/net/pfil.h index 48b1db860b65..6ac750ab129e 100644 --- a/sys/net/pfil.h +++ b/sys/net/pfil.h @@ -50,9 +50,8 @@ struct inpcb; struct packet_filter_hook { TAILQ_ENTRY(packet_filter_hook) pfil_link; int (*pfil_func)(void *, struct mbuf **, struct ifnet *, int, - struct inpcb *); + struct inpcb *); void *pfil_arg; - int pfil_flags; }; #define PFIL_IN 0x00000001 @@ -80,14 +79,13 @@ struct pfil_head { LIST_ENTRY(pfil_head) ph_list; }; +int pfil_add_hook(int (*func)(void *, struct mbuf **, struct ifnet *, + int, struct inpcb *), void *, int, struct pfil_head *); +int pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *, + int, struct inpcb *), void *, int, struct pfil_head *); int pfil_run_hooks(struct pfil_head *, struct mbuf **, struct ifnet *, int, struct inpcb *inp); -int pfil_add_hook(int (*func)(void *, struct mbuf **, - struct ifnet *, int, struct inpcb *), void *, int, struct pfil_head *); -int pfil_remove_hook(int (*func)(void *, struct mbuf **, - struct ifnet *, int, struct inpcb *), void *, int, struct pfil_head *); - int pfil_head_register(struct pfil_head *); int pfil_head_unregister(struct pfil_head *); @@ -107,6 +105,7 @@ struct pfil_head *pfil_head_get(int, u_long); static __inline struct packet_filter_hook * pfil_hook_get(int dir, struct pfil_head *ph) { + if (dir == PFIL_IN) return (TAILQ_FIRST(&ph->ph_in)); else if (dir == PFIL_OUT) diff --git a/sys/net/radix.c b/sys/net/radix.c index 39b198eaf49e..f092aa143c95 100644 --- a/sys/net/radix.c +++ b/sys/net/radix.c @@ -33,7 +33,6 @@ /* * Routines to build and maintain radix trees for routing lookups. */ -#ifndef _RADIX_H_ #include #ifdef _KERNEL #include @@ -41,20 +40,21 @@ #include #include #include -#include -#else -#include -#endif #include #include -#endif - #include "opt_mpath.h" - #ifdef RADIX_MPATH #include #endif - +#else /* !_KERNEL */ +#include +#include +#include +#define log(x, arg...) fprintf(stderr, ## arg) +#define panic(x) fprintf(stderr, "PANIC: %s", x), exit(1) +#define min(a, b) ((a) < (b) ? (a) : (b) ) +#include +#endif /* !_KERNEL */ static int rn_walktree_from(struct radix_node_head *h, void *a, void *m, walktree_f_t *f, void *w); @@ -72,6 +72,8 @@ static struct radix_node_head *mask_rnhead; /* * Work area -- the following point to 3 buffers of size max_keylen, * allocated in this order in a block of memory malloc'ed by rn_init. + * rn_zeros, rn_ones are set in rn_init and used in readonly afterwards. + * addmask_key is used in rn_addmask in rw mode and not thread-safe. */ static char *rn_zeros, *rn_ones, *addmask_key; @@ -135,8 +137,9 @@ static int rn_satisfies_leaf(char *trial, struct radix_node *leaf, * To make the assumption more explicit, we use the LEN() macro to access * this field. It is safe to pass an expression with side effects * to LEN() as the argument is evaluated only once. + * We cast the result to int as this is the dominant usage. */ -#define LEN(x) (*(const u_char *)(x)) +#define LEN(x) ( (int) (*(const u_char *)(x)) ) /* * XXX THIS NEEDS TO BE FIXED @@ -197,7 +200,7 @@ rn_refines(m_arg, n_arg) { register caddr_t m = m_arg, n = n_arg; register caddr_t lim, lim2 = lim = n + LEN(n); - int longer = LEN(n++) - (int)LEN(m++); + int longer = LEN(n++) - LEN(m++); int masks_are_equal = 1; if (longer > 0) @@ -250,10 +253,10 @@ rn_satisfies_leaf(trial, leaf, skip) char *cplim; int length = min(LEN(cp), LEN(cp2)); - if (cp3 == 0) + if (cp3 == NULL) cp3 = rn_ones; else - length = min(length, *(u_char *)cp3); + length = min(length, LEN(cp3)); cplim = cp + length; cp3 += skip; cp2 += skip; for (cp += skip; cp < cplim; cp++, cp2++, cp3++) if ((*cp ^ *cp2) & *cp3) @@ -424,7 +427,7 @@ rn_insert(v_arg, head, dupentry, nodes) { caddr_t v = v_arg; struct radix_node *top = head->rnh_treetop; - int head_off = top->rn_offset, vlen = (int)LEN(v); + int head_off = top->rn_offset, vlen = LEN(v); register struct radix_node *t = rn_search(v_arg, top); register caddr_t cp = v + head_off; register int b; @@ -1159,16 +1162,11 @@ rn_inithead(head, off) } void -rn_init() +rn_init(int maxk) { char *cp, *cplim; -#ifdef _KERNEL - struct domain *dom; - for (dom = domains; dom; dom = dom->dom_next) - if (dom->dom_maxrtkey > max_keylen) - max_keylen = dom->dom_maxrtkey; -#endif + max_keylen = maxk; if (max_keylen == 0) { log(LOG_ERR, "rn_init: radix functions require max_keylen be set\n"); diff --git a/sys/net/radix.h b/sys/net/radix.h index e84072fb9ef0..aa341b6caead 100644 --- a/sys/net/radix.h +++ b/sys/net/radix.h @@ -160,7 +160,7 @@ struct radix_node_head { #define RADIX_NODE_HEAD_WLOCK_ASSERT(rnh) rw_assert(&(rnh)->rnh_lock, RA_WLOCKED) #endif /* _KERNEL */ -void rn_init(void); +void rn_init(int); int rn_inithead(void **, int); int rn_refines(void *, void *); struct radix_node diff --git a/sys/net/route.c b/sys/net/route.c index fc76c924c66e..a938c9c1b7fb 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -56,6 +56,7 @@ #include #include #include +#include #ifdef RADIX_MPATH #include @@ -97,8 +98,6 @@ VNET_DEFINE(struct rtstat, rtstat); #define V_rttrash VNET(rttrash) #define V_rtstat VNET(rtstat) -static void rt_maskedcopy(struct sockaddr *, - struct sockaddr *, struct sockaddr *); /* compare two sockaddr structures */ #define sa_equal(a1, a2) (bcmp((a1), (a2), (a1)->sa_len) == 0) @@ -170,13 +169,20 @@ rt_tables_get_rnh(int table, int fam) static void route_init(void) { + struct domain *dom; + int max_keylen = 0; /* whack the tunable ints into line. */ if (rt_numfibs > RT_MAXFIBS) rt_numfibs = RT_MAXFIBS; if (rt_numfibs == 0) rt_numfibs = 1; - rn_init(); /* initialize all zeroes, all ones, mask table */ + + for (dom = domains; dom; dom = dom->dom_next) + if (dom->dom_maxrtkey > max_keylen) + max_keylen = dom->dom_maxrtkey; + + rn_init(max_keylen); /* init all zeroes, all ones, mask table */ } SYSINIT(route_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, route_init, 0); @@ -996,6 +1002,9 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt, { int error = 0, needlock = 0; register struct rtentry *rt; +#ifdef FLOWTABLE + register struct rtentry *rt0; +#endif register struct radix_node *rn; register struct radix_node_head *rnh; struct ifaddr *ifa; @@ -1153,6 +1162,55 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt, } #endif +#ifdef FLOWTABLE + rt0 = NULL; + /* XXX + * "flow-table" only support IPv4 at the moment. + */ +#ifdef INET + if (dst->sa_family == AF_INET) { + rn = rnh->rnh_matchaddr(dst, rnh); + if (rn && ((rn->rn_flags & RNF_ROOT) == 0)) { + struct sockaddr *mask; + u_char *m, *n; + int len; + + /* + * compare mask to see if the new route is + * more specific than the existing one + */ + rt0 = RNTORT(rn); + RT_LOCK(rt0); + RT_ADDREF(rt0); + RT_UNLOCK(rt0); + /* + * A host route is already present, so + * leave the flow-table entries as is. + */ + if (rt0->rt_flags & RTF_HOST) { + RTFREE(rt0); + rt0 = NULL; + } else if (!(flags & RTF_HOST) && netmask) { + mask = rt_mask(rt0); + len = mask->sa_len; + m = (u_char *)mask; + n = (u_char *)netmask; + while (len-- > 0) { + if (*n != *m) + break; + n++; + m++; + } + if (len == 0 || (*n < *m)) { + RTFREE(rt0); + rt0 = NULL; + } + } + } + } +#endif +#endif + /* XXX mtu manipulation will be done in rnh_addaddr -- itojun */ rn = rnh->rnh_addaddr(ndst, netmask, rnh, rt->rt_nodes); /* @@ -1165,8 +1223,20 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt, Free(rt_key(rt)); RT_LOCK_DESTROY(rt); uma_zfree(V_rtzone, rt); +#ifdef FLOWTABLE + if (rt0 != NULL) + RTFREE(rt0); +#endif senderr(EEXIST); + } +#ifdef FLOWTABLE + else if (rt0 != NULL) { +#ifdef INET + flowtable_route_flush(V_ip_ft, rt0); +#endif + RTFREE(rt0); } +#endif /* * If this protocol has something to add to this then @@ -1250,7 +1320,7 @@ rt_setgate(struct rtentry *rt, struct sockaddr *dst, struct sockaddr *gate) return (0); } -static void +void rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst, struct sockaddr *netmask) { register u_char *cp1 = (u_char *)src; @@ -1432,7 +1502,11 @@ rtinit1(struct ifaddr *ifa, int cmd, int flags, int fibnum) ((struct sockaddr_dl *)rt->rt_gateway)->sdl_index = rt->rt_ifp->if_index; } + RT_ADDREF(rt); + RT_UNLOCK(rt); rt_newaddrmsg(cmd, ifa, error, rt); + RT_LOCK(rt); + RT_REMREF(rt); if (cmd == RTM_DELETE) { /* * If we are deleting, and we found an entry, diff --git a/sys/net/route.h b/sys/net/route.h index 9a0bc63b69ad..a8ae867f526e 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -384,6 +384,7 @@ void rt_missmsg(int, struct rt_addrinfo *, int, int); void rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *); void rt_newmaddrmsg(int, struct ifmultiaddr *); int rt_setgate(struct rtentry *, struct sockaddr *, struct sockaddr *); +void rt_maskedcopy(struct sockaddr *, struct sockaddr *, struct sockaddr *); /* * Note the following locking behavior: diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 4bbd6e32fa9c..df4f9ae762b6 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -60,6 +60,7 @@ #include #include +#include #ifdef INET6 #include #endif @@ -622,6 +623,27 @@ route_output(struct mbuf *m, struct socket *so) } } #endif + /* + * If performing proxied L2 entry insertion, and + * the actual PPP host entry is found, perform + * another search to retrieve the prefix route of + * the local end point of the PPP link. + */ + if ((rtm->rtm_flags & RTF_ANNOUNCE) && + (rt->rt_ifp->if_flags & IFF_POINTOPOINT)) { + struct sockaddr laddr; + rt_maskedcopy(rt->rt_ifa->ifa_addr, + &laddr, + rt->rt_ifa->ifa_netmask); + /* + * refactor rt and no lock operation necessary + */ + rt = (struct rtentry *)rnh->rnh_matchaddr(&laddr, rnh); + if (rt == NULL) { + RADIX_NODE_HEAD_RUNLOCK(rnh); + senderr(ESRCH); + } + } RT_LOCK(rt); RT_ADDREF(rt); RADIX_NODE_HEAD_RUNLOCK(rnh); @@ -651,7 +673,7 @@ route_output(struct mbuf *m, struct socket *so) report: RT_LOCK_ASSERT(rt); if ((rt->rt_flags & RTF_HOST) == 0 - ? jailed(curthread->td_ucred) + ? jailed_without_vnet(curthread->td_ucred) : prison_if(curthread->td_ucred, rt_key(rt)) != 0) { RT_UNLOCK(rt); @@ -1312,7 +1334,7 @@ sysctl_dumpentry(struct radix_node *rn, void *vw) if (w->w_op == NET_RT_FLAGS && !(rt->rt_flags & w->w_arg)) return 0; if ((rt->rt_flags & RTF_HOST) == 0 - ? jailed(w->w_req->td->td_ucred) + ? jailed_without_vnet(w->w_req->td->td_ucred) : prison_if(w->w_req->td->td_ucred, rt_key(rt)) != 0) return (0); bzero((caddr_t)&info, sizeof(info)); diff --git a/sys/net/vnet.c b/sys/net/vnet.c index 298ffb28457f..323ed0855630 100644 --- a/sys/net/vnet.c +++ b/sys/net/vnet.c @@ -37,10 +37,14 @@ __FBSDID("$FreeBSD$"); #include "opt_ddb.h" +#include "opt_kdb.h" +#include "opt_kdtrace.h" #include +#include #include #include +#include #include #include #include @@ -53,6 +57,7 @@ __FBSDID("$FreeBSD$"); #ifdef DDB #include +#include #endif #include @@ -208,6 +213,17 @@ static TAILQ_HEAD(, vnet_data_free) vnet_data_free_head = TAILQ_HEAD_INITIALIZER(vnet_data_free_head); static struct sx vnet_data_free_lock; +SDT_PROVIDER_DEFINE(vnet); +SDT_PROBE_DEFINE1(vnet, functions, vnet_alloc, entry, "int"); +SDT_PROBE_DEFINE2(vnet, functions, vnet_alloc, alloc, "int", "struct vnet *"); +SDT_PROBE_DEFINE2(vnet, functions, vnet_alloc, return, "int", "struct vnet *"); +SDT_PROBE_DEFINE2(vnet, functions, vnet_destroy, entry, "int", "struct vnet *"); +SDT_PROBE_DEFINE1(vnet, functions, vnet_destroy, return, "int"); + +#ifdef DDB +static void db_show_vnet_print_vs(struct vnet_sysinit *, int); +#endif + /* * Allocate a virtual network stack. */ @@ -216,8 +232,10 @@ vnet_alloc(void) { struct vnet *vnet; + SDT_PROBE1(vnet, functions, vnet_alloc, entry, __LINE__); vnet = malloc(sizeof(struct vnet), M_VNET, M_WAITOK | M_ZERO); vnet->vnet_magic_n = VNET_MAGIC_N; + SDT_PROBE2(vnet, functions, vnet_alloc, alloc, __LINE__, vnet); /* * Allocate storage for virtualized global variables and copy in @@ -242,6 +260,7 @@ vnet_alloc(void) LIST_INSERT_HEAD(&vnet_head, vnet, vnet_le); VNET_LIST_WUNLOCK(); + SDT_PROBE2(vnet, functions, vnet_alloc, return, __LINE__, vnet); return (vnet); } @@ -253,6 +272,7 @@ vnet_destroy(struct vnet *vnet) { struct ifnet *ifp, *nifp; + SDT_PROBE2(vnet, functions, vnet_destroy, entry, __LINE__, vnet); KASSERT(vnet->vnet_sockcnt == 0, ("%s: vnet still has sockets", __func__)); @@ -279,6 +299,7 @@ vnet_destroy(struct vnet *vnet) vnet->vnet_data_base = 0; vnet->vnet_magic_n = 0xdeadbeef; free(vnet, M_VNET); + SDT_PROBE1(vnet, functions, vnet_destroy, return, __LINE__); } /* @@ -616,6 +637,65 @@ vnet_sysuninit(void) VNET_SYSINIT_RUNLOCK(); } +#ifdef VNET_DEBUG +struct vnet_recursion { + SLIST_ENTRY(vnet_recursion) vnr_le; + const char *prev_fn; + const char *where_fn; + int where_line; + struct vnet *old_vnet; + struct vnet *new_vnet; +}; + +static SLIST_HEAD(, vnet_recursion) vnet_recursions = + SLIST_HEAD_INITIALIZER(vnet_recursions); + +static void +vnet_print_recursion(struct vnet_recursion *vnr, int brief) +{ + + if (!brief) + printf("CURVNET_SET() recursion in "); + printf("%s() line %d, prev in %s()", vnr->where_fn, vnr->where_line, + vnr->prev_fn); + if (brief) + printf(", "); + else + printf("\n "); + printf("%p -> %p\n", vnr->old_vnet, vnr->new_vnet); +} + +void +vnet_log_recursion(struct vnet *old_vnet, const char *old_fn, int line) +{ + struct vnet_recursion *vnr; + + /* Skip already logged recursion events. */ + SLIST_FOREACH(vnr, &vnet_recursions, vnr_le) + if (vnr->prev_fn == old_fn && + vnr->where_fn == curthread->td_vnet_lpush && + vnr->where_line == line && + (vnr->old_vnet == vnr->new_vnet) == (curvnet == old_vnet)) + return; + + vnr = malloc(sizeof(*vnr), M_VNET, M_NOWAIT | M_ZERO); + if (vnr == NULL) + panic("%s: malloc failed", __func__); + vnr->prev_fn = old_fn; + vnr->where_fn = curthread->td_vnet_lpush; + vnr->where_line = line; + vnr->old_vnet = old_vnet; + vnr->new_vnet = curvnet; + + SLIST_INSERT_HEAD(&vnet_recursions, vnr, vnr_le); + + vnet_print_recursion(vnr, 0); +#ifdef KDB + kdb_backtrace(); +#endif +} +#endif /* VNET_DEBUG */ + #ifdef DDB DB_SHOW_COMMAND(vnets, db_show_vnets) { @@ -637,4 +717,72 @@ DB_SHOW_COMMAND(vnets, db_show_vnets) break; } } + +static void +db_show_vnet_print_vs(struct vnet_sysinit *vs, int ddb) +{ + const char *vsname, *funcname; + c_db_sym_t sym; + db_expr_t offset; + +#define xprint(...) \ + if (ddb) \ + db_printf(__VA_ARGS__); \ + else \ + printf(__VA_ARGS__) + + if (vs == NULL) { + xprint("%s: no vnet_sysinit * given\n", __func__); + return; + } + + sym = db_search_symbol((vm_offset_t)vs, DB_STGY_ANY, &offset); + db_symbol_values(sym, &vsname, NULL); + sym = db_search_symbol((vm_offset_t)vs->func, DB_STGY_PROC, &offset); + db_symbol_values(sym, &funcname, NULL); + xprint("%s(%p)\n", (vsname != NULL) ? vsname : "", vs); + xprint(" 0x%08x 0x%08x\n", vs->subsystem, vs->order); + xprint(" %p(%s)(%p)\n", + vs->func, (funcname != NULL) ? funcname : "", vs->arg); +#undef xprint +} + +DB_SHOW_COMMAND(vnet_sysinit, db_show_vnet_sysinit) +{ + struct vnet_sysinit *vs; + + db_printf("VNET_SYSINIT vs Name(Ptr)\n"); + db_printf(" Subsystem Order\n"); + db_printf(" Function(Name)(Arg)\n"); + TAILQ_FOREACH(vs, &vnet_constructors, link) { + db_show_vnet_print_vs(vs, 1); + if (db_pager_quit) + break; + } +} + +DB_SHOW_COMMAND(vnet_sysuninit, db_show_vnet_sysuninit) +{ + struct vnet_sysinit *vs; + + db_printf("VNET_SYSUNINIT vs Name(Ptr)\n"); + db_printf(" Subsystem Order\n"); + db_printf(" Function(Name)(Arg)\n"); + TAILQ_FOREACH_REVERSE(vs, &vnet_destructors, vnet_sysuninit_head, + link) { + db_show_vnet_print_vs(vs, 1); + if (db_pager_quit) + break; + } +} + +#ifdef VNET_DEBUG +DB_SHOW_COMMAND(vnetrcrs, db_show_vnetrcrs) +{ + struct vnet_recursion *vnr; + + SLIST_FOREACH(vnr, &vnet_recursions, vnr_le) + vnet_print_recursion(vnr, 1); +} #endif +#endif /* DDB */ diff --git a/sys/net/vnet.h b/sys/net/vnet.h index 116d7af3288f..d9a1ee0b6793 100644 --- a/sys/net/vnet.h +++ b/sys/net/vnet.h @@ -108,6 +108,8 @@ void vnet_destroy(struct vnet *vnet); * assertions. */ #ifdef VNET_DEBUG +void vnet_log_recursion(struct vnet *, const char *, int); + #define VNET_ASSERT(condition) \ if (!(condition)) { \ printf("VNET_ASSERT @ %s:%d %s():\n", \ @@ -125,9 +127,7 @@ void vnet_destroy(struct vnet *vnet); #define CURVNET_SET_VERBOSE(arg) \ CURVNET_SET_QUIET(arg) \ if (saved_vnet) \ - printf("CURVNET_SET(%p) in %s() on cpu %d, prev %p in %s()\n", \ - curvnet, curthread->td_vnet_lpush, curcpu, \ - saved_vnet, saved_vnet_lpush); + vnet_log_recursion(saved_vnet, saved_vnet_lpush, __LINE__); #define CURVNET_SET(arg) CURVNET_SET_VERBOSE(arg) diff --git a/sys/net/zlib.h b/sys/net/zlib.h index 9529e43b8be7..85db8d405c68 100644 --- a/sys/net/zlib.h +++ b/sys/net/zlib.h @@ -1010,6 +1010,13 @@ extern int EXPORT inflateInit2_ OF((z_streamp strm, int windowBits, uLongf *get_crc_table OF((void)); /* can be used by asm versions of crc32() */ +#ifdef _KERNEL +struct vnode; +extern gzFile gz_open OF((const char *path, const char *mode, + struct vnode *vp)); +#endif + + #ifdef __cplusplus } #endif diff --git a/sys/net/zutil.h b/sys/net/zutil.h new file mode 100644 index 000000000000..74f022181e28 --- /dev/null +++ b/sys/net/zutil.h @@ -0,0 +1,231 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-1996 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* From: zutil.h,v 1.16 1996/07/24 13:41:13 me Exp $ */ +/* $FreeBSD$ */ + +#ifndef _Z_UTIL_H +#define _Z_UTIL_H + +#define ZEXPORT + +#ifdef _KERNEL +#include +#else +#include "zlib.h" +#endif + +#ifdef _KERNEL +/* Assume this is a *BSD or SVR4 kernel */ +#include +#include +#include +#include +#include +#include +#include +# define HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# define memset(d, v, n) bzero((d), (n)) +# define memcmp bcmp + +#else +#if defined(__KERNEL__) +/* Assume this is a Linux kernel */ +#include +#define HAVE_MEMCPY + +#else /* not kernel */ + +#if defined(MSDOS)||defined(VMS)||defined(CRAY)||defined(WIN32)||defined(RISCOS) +# include +# include +#else + extern int errno; +#endif +#ifdef STDC +# include +# include +#endif +#endif /* __KERNEL__ */ +#endif /* _KERNEL */ + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (const char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#ifdef MSDOS +# define OS_CODE 0x00 +# ifdef __TURBOC__ +# include +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +#endif + +#ifdef WIN32 /* Window 95 & Windows NT */ +# define OS_CODE 0x0b +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define FOPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef MACOS +# define OS_CODE 0x07 +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0F +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + + /* Common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef FOPEN +# define FOPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#ifdef HAVE_STRERROR + extern char *strerror OF((int)); +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(_MSC_VER) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, Bytef* source, uInt len)); + extern int zmemcmp OF((Bytef* s1, Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG_ZLIB +# include +# ifndef verbose +# define verbose 0 +# endif + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) fprintf x +# define Tracev(x) {if (verbose) fprintf x ;} +# define Tracevv(x) {if (verbose>1) fprintf x ;} +# define Tracec(c,x) {if (verbose && (c)) fprintf x ;} +# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +typedef uLong (*check_func) OF((uLong check, const Bytef *buf, uInt len)); + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* _Z_UTIL_H */ diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c index b14f13f90fe1..f72e10b84144 100644 --- a/sys/net80211/ieee80211.c +++ b/sys/net80211/ieee80211.c @@ -391,7 +391,6 @@ ieee80211_vap_setup(struct ieee80211com *ic, struct ieee80211vap *vap, ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST; ifp->if_start = ieee80211_start; ifp->if_ioctl = ieee80211_ioctl; - ifp->if_watchdog = NULL; /* NB: no watchdog routine */ ifp->if_init = ieee80211_init; /* NB: input+output filled in by ether_ifattach */ IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); @@ -441,6 +440,9 @@ ieee80211_vap_setup(struct ieee80211com *ic, struct ieee80211vap *vap, /* auto-enable s/w beacon miss support */ if (flags & IEEE80211_CLONE_NOBEACONS) vap->iv_flags_ext |= IEEE80211_FEXT_SWBMISS; + /* auto-generated or user supplied MAC address */ + if (flags & (IEEE80211_CLONE_BSSID|IEEE80211_CLONE_MACADDR)) + vap->iv_flags_ext |= IEEE80211_FEXT_UNIQMAC; /* * Enable various functionality by default if we're * capable; the driver can override us if it knows better. diff --git a/sys/net80211/ieee80211_action.c b/sys/net80211/ieee80211_action.c index 5371f6e975d0..8c11471c89a9 100644 --- a/sys/net80211/ieee80211_action.c +++ b/sys/net80211/ieee80211_action.c @@ -105,7 +105,7 @@ ieee80211_send_action_register(int cat, int act, ieee80211_send_action_func *f) meshlm_send_action[act] = f; return 0; case IEEE80211_ACTION_CAT_MESHPATH: - if (act > N(hwmp_send_action)) + if (act >= N(hwmp_send_action)) break; hwmp_send_action[act] = f; return 0; diff --git a/sys/net80211/ieee80211_adhoc.c b/sys/net80211/ieee80211_adhoc.c index 805589016d50..d3b43bd572df 100644 --- a/sys/net80211/ieee80211_adhoc.c +++ b/sys/net80211/ieee80211_adhoc.c @@ -293,7 +293,7 @@ adhoc_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) struct ieee80211_frame *wh; struct ieee80211_key *key; struct ether_header *eh; - int hdrspace, need_tap; + int hdrspace, need_tap = 1; /* mbuf need to be tapped. */ uint8_t dir, type, subtype, qos; uint8_t *bssid; uint16_t rxseq; @@ -318,7 +318,6 @@ adhoc_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) KASSERT(ni != NULL, ("null node")); ni->ni_inact = ni->ni_inact_reload; - need_tap = 1; /* mbuf need to be tapped. */ type = -1; /* undefined */ if (m->m_pkthdr.len < sizeof(struct ieee80211_frame_min)) { diff --git a/sys/net80211/ieee80211_crypto_tkip.c b/sys/net80211/ieee80211_crypto_tkip.c index f949255b9c68..6e1fda1fc9d2 100644 --- a/sys/net80211/ieee80211_crypto_tkip.c +++ b/sys/net80211/ieee80211_crypto_tkip.c @@ -144,6 +144,7 @@ tkip_setkey(struct ieee80211_key *k) return 0; } k->wk_keytsc = 1; /* TSC starts at 1 */ + ctx->rx_phase1_done = 0; return 1; } diff --git a/sys/net80211/ieee80211_freebsd.c b/sys/net80211/ieee80211_freebsd.c index 22800fb6c768..1de580023428 100644 --- a/sys/net80211/ieee80211_freebsd.c +++ b/sys/net80211/ieee80211_freebsd.c @@ -730,6 +730,7 @@ ieee80211_load_module(const char *modname) } static eventhandler_tag wlan_bpfevent; +static eventhandler_tag wlan_ifllevent; static void bpf_track(void *arg, struct ifnet *ifp, int dlt, int attach) @@ -756,6 +757,33 @@ bpf_track(void *arg, struct ifnet *ifp, int dlt, int attach) } } +static void +wlan_iflladdr(void *arg __unused, struct ifnet *ifp) +{ + struct ieee80211com *ic = ifp->if_l2com; + struct ieee80211vap *vap, *next; + + if (ifp->if_type != IFT_IEEE80211 || ic == NULL) + return; + + IEEE80211_LOCK(ic); + TAILQ_FOREACH_SAFE(vap, &ic->ic_vaps, iv_next, next) { + /* + * If the MAC address has changed on the parent and it was + * copied to the vap on creation then re-sync. + */ + if (vap->iv_ic == ic && + (vap->iv_flags_ext & IEEE80211_FEXT_UNIQMAC) == 0) { + IEEE80211_ADDR_COPY(vap->iv_myaddr, IF_LLADDR(ifp)); + IEEE80211_UNLOCK(ic); + if_setlladdr(vap->iv_ifp, IF_LLADDR(ifp), + IEEE80211_ADDR_LEN); + IEEE80211_LOCK(ic); + } + } + IEEE80211_UNLOCK(ic); +} + /* * Module glue. * @@ -772,6 +800,12 @@ wlan_modevent(module_t mod, int type, void *unused) bpf_track, 0, EVENTHANDLER_PRI_ANY); if (wlan_bpfevent == NULL) return ENOMEM; + wlan_ifllevent = EVENTHANDLER_REGISTER(iflladdr_event, + wlan_iflladdr, NULL, EVENTHANDLER_PRI_ANY); + if (wlan_ifllevent == NULL) { + EVENTHANDLER_DEREGISTER(bpf_track, wlan_bpfevent); + return ENOMEM; + } if_clone_attach(&wlan_cloner); if_register_com_alloc(IFT_IEEE80211, wlan_alloc, wlan_free); return 0; @@ -779,6 +813,7 @@ wlan_modevent(module_t mod, int type, void *unused) if_deregister_com_alloc(IFT_IEEE80211); if_clone_detach(&wlan_cloner); EVENTHANDLER_DEREGISTER(bpf_track, wlan_bpfevent); + EVENTHANDLER_DEREGISTER(iflladdr_event, wlan_ifllevent); return 0; } return EINVAL; diff --git a/sys/net80211/ieee80211_hostap.c b/sys/net80211/ieee80211_hostap.c index 240ea7cb30f7..8405b4f646b4 100644 --- a/sys/net80211/ieee80211_hostap.c +++ b/sys/net80211/ieee80211_hostap.c @@ -480,7 +480,7 @@ hostap_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) struct ieee80211_frame *wh; struct ieee80211_key *key; struct ether_header *eh; - int hdrspace, need_tap; + int hdrspace, need_tap = 1; /* mbuf need to be tapped. */ uint8_t dir, type, subtype, qos; uint8_t *bssid; uint16_t rxseq; @@ -505,7 +505,6 @@ hostap_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) KASSERT(ni != NULL, ("null node")); ni->ni_inact = ni->ni_inact_reload; - need_tap = 1; /* mbuf need to be tapped. */ type = -1; /* undefined */ if (m->m_pkthdr.len < sizeof(struct ieee80211_frame_min)) { @@ -1252,7 +1251,7 @@ ieee80211_parse_wpa(struct ieee80211vap *vap, const uint8_t *frm, return IEEE80211_REASON_IE_INVALID; } frm += 6, len -= 4; /* NB: len is payload only */ - /* NB: iswapoui already validated the OUI and type */ + /* NB: iswpaoui already validated the OUI and type */ w = LE_READ_2(frm); if (w != WPA_VERSION) { IEEE80211_DISCARD_IE(vap, diff --git a/sys/net80211/ieee80211_hwmp.c b/sys/net80211/ieee80211_hwmp.c index 2468169122ab..66055d712555 100644 --- a/sys/net80211/ieee80211_hwmp.c +++ b/sys/net80211/ieee80211_hwmp.c @@ -148,7 +148,7 @@ typedef uint32_t ieee80211_hwmp_seq; struct ieee80211_hwmp_route { ieee80211_hwmp_seq hr_seq; /* last HWMP seq seen from dst*/ ieee80211_hwmp_seq hr_preqid; /* last PREQ ID seen from dst */ - ieee80211_hwmp_seq hr_targetseq; /* seq. no. on our latest PREQ*/ + ieee80211_hwmp_seq hr_origseq; /* seq. no. on our latest PREQ*/ int hr_preqretries; }; struct ieee80211_hwmp_state { @@ -192,7 +192,7 @@ static ieee80211_recv_action_func hwmp_recv_action_meshpath; static struct ieee80211_mesh_proto_path mesh_proto_hwmp = { .mpp_descr = "HWMP", - .mpp_ie = IEEE80211_MESHCONF_HWMP, + .mpp_ie = IEEE80211_MESHCONF_PATH_HWMP, .mpp_discover = hwmp_discover, .mpp_peerdown = hwmp_peerdown, .mpp_vattach = hwmp_vattach, @@ -548,7 +548,7 @@ hwmp_add_meshperr(uint8_t *frm, const struct ieee80211_meshperr_ie *perr) *frm++ = perr->perr_ttl; *frm++ = perr->perr_ndests; for (i = 0; i < perr->perr_ndests; i++) { - *frm += perr->perr_dests[i].dest_flags; + *frm++ = perr->perr_dests[i].dest_flags; IEEE80211_ADDR_COPY(frm, perr->perr_dests[i].dest_addr); frm += 6; ADDWORD(frm, perr->perr_dests[i].dest_seq); @@ -653,6 +653,7 @@ hwmp_rootmode_rann_cb(void *arg) IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, vap->iv_bss, "%s", "send broadcast RANN"); + rann.rann_flags = 0; if (ms->ms_flags & IEEE80211_MESHFLAGS_PORTAL) rann.rann_flags |= IEEE80211_MESHRANN_FLAGS_PR; rann.rann_hopcount = 0; @@ -733,12 +734,12 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, prep.prep_flags = 0; prep.prep_hopcount = 0; prep.prep_ttl = ms->ms_ttl; - IEEE80211_ADDR_COPY(prep.prep_targetaddr, preq->preq_origaddr); - prep.prep_targetseq = preq->preq_origseq; + IEEE80211_ADDR_COPY(prep.prep_targetaddr, vap->iv_myaddr); + prep.prep_targetseq = ++hs->hs_seq; prep.prep_lifetime = preq->preq_lifetime; prep.prep_metric = IEEE80211_MESHLMETRIC_INITIALVAL; - IEEE80211_ADDR_COPY(prep.prep_origaddr, vap->iv_myaddr); - prep.prep_origseq = ++hs->hs_seq; + IEEE80211_ADDR_COPY(prep.prep_origaddr, preq->preq_origaddr); + prep.prep_origseq = preq->preq_origseq; hwmp_send_prep(ni, vap->iv_myaddr, wh->i_addr2, &prep); /* * Build the reverse path, if we don't have it already. @@ -784,13 +785,13 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, prep.prep_flags = 0; prep.prep_hopcount = 0; prep.prep_ttl = ms->ms_ttl; - IEEE80211_ADDR_COPY(prep.prep_origaddr, vap->iv_myaddr); + IEEE80211_ADDR_COPY(prep.prep_origaddr, rootmac); prep.prep_origseq = preq->preq_origseq; - prep.prep_targetseq = ++hs->hs_seq; prep.prep_lifetime = preq->preq_lifetime; prep.prep_metric = IEEE80211_MESHLMETRIC_INITIALVAL; - IEEE80211_ADDR_COPY(prep.prep_targetaddr, rootmac); - prep.prep_targetseq = PREQ_TSEQ(0); + IEEE80211_ADDR_COPY(prep.prep_targetaddr, + vap->iv_myaddr); + prep.prep_targetseq = ++hs->hs_seq; hwmp_send_prep(vap->iv_bss, vap->iv_myaddr, broadcastaddr, &prep); } @@ -848,13 +849,13 @@ hwmp_recv_preq(struct ieee80211vap *vap, struct ieee80211_node *ni, prep.prep_hopcount = rt->rt_nhops + 1; prep.prep_ttl = ms->ms_ttl; IEEE80211_ADDR_COPY(&prep.prep_targetaddr, - preq->preq_origaddr); + PREQ_TADDR(0)); prep.prep_targetseq = hrorig->hr_seq; prep.prep_lifetime = preq->preq_lifetime; prep.prep_metric = rt->rt_metric + ms->ms_pmetric->mpm_metric(ni); IEEE80211_ADDR_COPY(&prep.prep_origaddr, - PREQ_TADDR(0)); + preq->preq_origaddr); prep.prep_origseq = hrorig->hr_seq; hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr, &prep); @@ -951,19 +952,19 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, return; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, - "received PREP from %s", ether_sprintf(prep->prep_origaddr)); + "received PREP from %s", ether_sprintf(prep->prep_targetaddr)); - rt = ieee80211_mesh_rt_find(vap, prep->prep_origaddr); + rt = ieee80211_mesh_rt_find(vap, prep->prep_targetaddr); if (rt == NULL) { /* * If we have no entry this could be a reply to a root PREQ. */ if (hs->hs_rootmode != IEEE80211_HWMP_ROOTMODE_DISABLED) { - rt = ieee80211_mesh_rt_add(vap, prep->prep_origaddr); + rt = ieee80211_mesh_rt_add(vap, prep->prep_targetaddr); if (rt == NULL) { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "unable to add PREP path to %s", - ether_sprintf(prep->prep_origaddr)); + ether_sprintf(prep->prep_targetaddr)); vap->iv_stats.is_mesh_rtaddfailed++; return; } @@ -974,7 +975,7 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, rt->rt_flags |= IEEE80211_MESHRT_FLAGS_VALID; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "add root path to %s nhops %d metric %d (PREP)", - ether_sprintf(prep->prep_origaddr), + ether_sprintf(prep->prep_targetaddr), rt->rt_nhops, rt->rt_metric); return; } @@ -984,30 +985,30 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, * Sequence number validation. */ hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); - if (HWMP_SEQ_LEQ(prep->prep_origseq, hr->hr_seq)) { + if (HWMP_SEQ_LEQ(prep->prep_targetseq, hr->hr_seq)) { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "discard PREP from %s, old seq no %u <= %u", - ether_sprintf(prep->prep_origaddr), - prep->prep_origseq, hr->hr_seq); + ether_sprintf(prep->prep_targetaddr), + prep->prep_targetseq, hr->hr_seq); return; } - hr->hr_seq = prep->prep_origseq; + hr->hr_seq = prep->prep_targetseq; /* * If it's NOT for us, propagate the PREP. */ - if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, prep->prep_targetaddr) && + if (!IEEE80211_ADDR_EQ(vap->iv_myaddr, prep->prep_origaddr) && prep->prep_ttl > 1 && prep->prep_hopcount < hs->hs_maxhops) { struct ieee80211_meshprep_ie pprep; /* propagated PREP */ IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "propagate PREP from %s", - ether_sprintf(prep->prep_origaddr)); + ether_sprintf(prep->prep_targetaddr)); memcpy(&pprep, prep, sizeof(pprep)); pprep.prep_hopcount += 1; pprep.prep_ttl -= 1; pprep.prep_metric += ms->ms_pmetric->mpm_metric(ni); - IEEE80211_ADDR_COPY(pprep.prep_origaddr, vap->iv_myaddr); + IEEE80211_ADDR_COPY(pprep.prep_targetaddr, vap->iv_myaddr); hwmp_send_prep(ni, vap->iv_myaddr, broadcastaddr, &pprep); } hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); @@ -1015,9 +1016,9 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, /* NB: never clobber a proxy entry */; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "discard PREP for %s, route is marked PROXY", - ether_sprintf(prep->prep_origaddr)); + ether_sprintf(prep->prep_targetaddr)); vap->iv_stats.is_hwmp_proxy++; - } else if (prep->prep_targetseq == hr->hr_targetseq) { + } else if (prep->prep_origseq == hr->hr_origseq) { /* * Check if we already have a path to this node. * If we do, check if this path reply contains a @@ -1041,14 +1042,14 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni, } else { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "ignore PREP for %s, hopcount %d:%d metric %d:%d", - ether_sprintf(prep->prep_origaddr), + ether_sprintf(prep->prep_targetaddr), rt->rt_nhops, prep->prep_hopcount, rt->rt_metric, prep->prep_metric); } } else { IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "discard PREP for %s, wrong seqno %u != %u", - ether_sprintf(prep->prep_origaddr), prep->prep_targetseq, + ether_sprintf(prep->prep_targetaddr), prep->prep_origseq, hr->hr_seq); vap->iv_stats.is_hwmp_wrongseq++; } @@ -1114,6 +1115,7 @@ hwmp_peerdown(struct ieee80211_node *ni) "%s", "delete route entry"); perr.perr_ttl = ms->ms_ttl; perr.perr_ndests = 1; + PERR_DFLAGS(0) = 0; if (hr->hr_seq == 0) PERR_DFLAGS(0) |= IEEE80211_MESHPERR_DFLAGS_USN; PERR_DFLAGS(0) |= IEEE80211_MESHPERR_DFLAGS_RC; @@ -1223,7 +1225,8 @@ hwmp_recv_rann(struct ieee80211vap *vap, struct ieee80211_node *ni, struct ieee80211_meshrann_ie prann; if (ni == vap->iv_bss || - ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) + ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED || + IEEE80211_ADDR_EQ(rann->rann_addr, vap->iv_myaddr)) return; rt = ieee80211_mesh_rt_find(vap, rann->rann_addr); @@ -1236,15 +1239,18 @@ hwmp_recv_rann(struct ieee80211vap *vap, struct ieee80211_node *ni, return; } hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); - if (HWMP_SEQ_GT(rann->rann_seq, hr->hr_seq) && rann->rann_ttl > 1 && - rann->rann_hopcount < hs->hs_maxhops && - (ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) { - memcpy(&prann, rann, sizeof(prann)); - prann.rann_hopcount += 1; - prann.rann_ttl -= 1; - prann.rann_metric += ms->ms_pmetric->mpm_metric(ni); - hwmp_send_rann(vap->iv_bss, vap->iv_myaddr, broadcastaddr, - &prann); + if (HWMP_SEQ_GT(rann->rann_seq, hr->hr_seq)) { + hr->hr_seq = rann->rann_seq; + if (rann->rann_ttl > 1 && + rann->rann_hopcount < hs->hs_maxhops && + (ms->ms_flags & IEEE80211_MESHFLAGS_FWD)) { + memcpy(&prann, rann, sizeof(prann)); + prann.rann_hopcount += 1; + prann.rann_ttl -= 1; + prann.rann_metric += ms->ms_pmetric->mpm_metric(ni); + hwmp_send_rann(vap->iv_bss, vap->iv_myaddr, + broadcastaddr, &prann); + } } } @@ -1305,8 +1311,8 @@ hwmp_discover(struct ieee80211vap *vap, hr = IEEE80211_MESH_ROUTE_PRIV(rt, struct ieee80211_hwmp_route); if ((rt->rt_flags & IEEE80211_MESHRT_FLAGS_VALID) == 0) { - if (hr->hr_targetseq == 0) - hr->hr_targetseq = ++hs->hs_seq; + if (hr->hr_origseq == 0) + hr->hr_origseq = ++hs->hs_seq; rt->rt_metric = IEEE80211_MESHLMETRIC_INITIALVAL; rt->rt_lifetime = ticks_to_msecs(ieee80211_hwmp_pathtimeout); @@ -1324,7 +1330,7 @@ hwmp_discover(struct ieee80211vap *vap, preq.preq_ttl = ms->ms_ttl; preq.preq_id = ++hs->hs_preqid; IEEE80211_ADDR_COPY(preq.preq_origaddr, vap->iv_myaddr); - preq.preq_origseq = hr->hr_targetseq; + preq.preq_origseq = hr->hr_origseq; preq.preq_lifetime = rt->rt_lifetime; preq.preq_metric = rt->rt_metric; preq.preq_tcount = 1; diff --git a/sys/net80211/ieee80211_ioctl.c b/sys/net80211/ieee80211_ioctl.c index 35c79819bdfa..237e556f30c5 100644 --- a/sys/net80211/ieee80211_ioctl.c +++ b/sys/net80211/ieee80211_ioctl.c @@ -3199,15 +3199,18 @@ ieee80211_ioctl_updatemulti(struct ieee80211com *ic) void *ioctl; IEEE80211_LOCK(ic); - if_purgemaddrs(parent); + if_delallmulti(parent); ioctl = parent->if_ioctl; /* XXX WAR if_allmulti */ parent->if_ioctl = NULL; TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { struct ifnet *ifp = vap->iv_ifp; struct ifmultiaddr *ifma; - TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) + TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { + if (ifma->ifma_addr->sa_family != AF_LINK) + continue; (void) if_addmulti(parent, ifma->ifma_addr, NULL); + } } parent->if_ioctl = ioctl; ieee80211_runtask(ic, &ic->ic_mcast_task); diff --git a/sys/net80211/ieee80211_ioctl.h b/sys/net80211/ieee80211_ioctl.h index 89d8fe53fcf6..7215a5edd9f9 100644 --- a/sys/net80211/ieee80211_ioctl.h +++ b/sys/net80211/ieee80211_ioctl.h @@ -790,7 +790,7 @@ struct ieee80211req_scan_result { uint16_t isr_flags; /* channel flags */ int8_t isr_noise; int8_t isr_rssi; - uint8_t isr_intval; /* beacon interval */ + uint16_t isr_intval; /* beacon interval */ uint8_t isr_capinfo; /* capabilities */ uint8_t isr_erp; /* ERP element */ uint8_t isr_bssid[IEEE80211_ADDR_LEN]; diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c index b0bfe8892d07..417337b0e519 100644 --- a/sys/net80211/ieee80211_mesh.c +++ b/sys/net80211/ieee80211_mesh.c @@ -132,7 +132,7 @@ static ieee80211_send_action_func mesh_send_action_meshlink_reply; static const struct ieee80211_mesh_proto_metric mesh_metric_airtime = { .mpm_descr = "AIRTIME", - .mpm_ie = IEEE80211_MESHCONF_AIRTIME, + .mpm_ie = IEEE80211_MESHCONF_METRIC_AIRTIME, .mpm_metric = mesh_airtime_calc, }; @@ -344,18 +344,18 @@ int ieee80211_mesh_register_proto_path(const struct ieee80211_mesh_proto_path *mpp) { int i, firstempty = -1; - static const uint8_t emptyie[4] = { 0, 0, 0, 0 }; for (i = 0; i < N(mesh_proto_paths); i++) { - if (memcmp(mpp->mpp_ie, mesh_proto_paths[i].mpp_ie, 4) == 0) + if (strncmp(mpp->mpp_descr, mesh_proto_paths[i].mpp_descr, + IEEE80211_MESH_PROTO_DSZ) == 0) return EEXIST; - if (memcmp(mesh_proto_paths[i].mpp_ie, emptyie, 4) == 0 && - firstempty == -1) + if (!mesh_proto_paths[i].mpp_active && firstempty == -1) firstempty = i; } if (firstempty < 0) return ENOSPC; memcpy(&mesh_proto_paths[firstempty], mpp, sizeof(*mpp)); + mesh_proto_paths[firstempty].mpp_active = 1; return 0; } @@ -364,18 +364,18 @@ ieee80211_mesh_register_proto_metric(const struct ieee80211_mesh_proto_metric *mpm) { int i, firstempty = -1; - static const uint8_t emptyie[4] = { 0, 0, 0, 0 }; for (i = 0; i < N(mesh_proto_metrics); i++) { - if (memcmp(mpm->mpm_ie, mesh_proto_metrics[i].mpm_ie, 4) == 0) + if (strncmp(mpm->mpm_descr, mesh_proto_metrics[i].mpm_descr, + IEEE80211_MESH_PROTO_DSZ) == 0) return EEXIST; - if (memcmp(mesh_proto_metrics[i].mpm_ie, emptyie, 4) == 0 && - firstempty == -1) + if (!mesh_proto_metrics[i].mpm_active && firstempty == -1) firstempty = i; } if (firstempty < 0) return ENOSPC; memcpy(&mesh_proto_metrics[firstempty], mpm, sizeof(*mpm)); + mesh_proto_metrics[firstempty].mpm_active = 1; return 0; } @@ -388,8 +388,6 @@ mesh_select_proto_path(struct ieee80211vap *vap, const char *name) for (i = 0; i < N(mesh_proto_paths); i++) { if (strcasecmp(mesh_proto_paths[i].mpp_descr, name) == 0) { ms->ms_ppath = &mesh_proto_paths[i]; - if (vap->iv_state == IEEE80211_S_RUN) - vap->iv_newstate(vap, IEEE80211_S_INIT, 0); return 0; } } @@ -405,8 +403,6 @@ mesh_select_proto_metric(struct ieee80211vap *vap, const char *name) for (i = 0; i < N(mesh_proto_metrics); i++) { if (strcasecmp(mesh_proto_metrics[i].mpm_descr, name) == 0) { ms->ms_pmetric = &mesh_proto_metrics[i]; - if (vap->iv_state == IEEE80211_S_RUN) - vap->iv_newstate(vap, IEEE80211_S_INIT, 0); return 0; } } @@ -739,10 +735,12 @@ mesh_linkchange(struct ieee80211_node *ni, enum ieee80211_mesh_mlstate state) ni->ni_mlstate != IEEE80211_NODE_MESH_ESTABLISHED) { KASSERT(ms->ms_neighbors < 65535, ("neighbor count overflow")); ms->ms_neighbors++; + ieee80211_beacon_notify(vap, IEEE80211_BEACON_MESHCONF); } else if (ni->ni_mlstate == IEEE80211_NODE_MESH_ESTABLISHED && state != IEEE80211_NODE_MESH_ESTABLISHED) { KASSERT(ms->ms_neighbors > 0, ("neighbor count 0")); ms->ms_neighbors--; + ieee80211_beacon_notify(vap, IEEE80211_BEACON_MESHCONF); } ni->ni_mlstate = state; switch (state) { @@ -1470,11 +1468,12 @@ mesh_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m0, int subtype, if (xrates != NULL) IEEE80211_VERIFY_ELEMENT(xrates, IEEE80211_RATE_MAXSIZE - rates[1], return); - if (meshid != NULL) + if (meshid != NULL) { IEEE80211_VERIFY_ELEMENT(meshid, IEEE80211_MESHID_LEN, return); - /* NB: meshid, not ssid */ - IEEE80211_VERIFY_SSID(vap->iv_bss, meshid, return); + /* NB: meshid, not ssid */ + IEEE80211_VERIFY_SSID(vap->iv_bss, meshid, return); + } /* XXX find a better class or define it's own */ IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_INPUT, wh->i_addr2, @@ -2282,55 +2281,47 @@ mesh_verify_meshid(struct ieee80211vap *vap, const uint8_t *ie) static int mesh_verify_meshconf(struct ieee80211vap *vap, const uint8_t *ie) { - static const uint8_t null[4] = IEEE80211_MESHCONF_NULL; const struct ieee80211_meshconf_ie *meshconf = (const struct ieee80211_meshconf_ie *) ie; const struct ieee80211_mesh_state *ms = vap->iv_mesh; + uint16_t cap; if (meshconf == NULL) return 1; - if (meshconf->conf_ver != IEEE80211_MESHCONF_VERSION) { + if (meshconf->conf_pselid != ms->ms_ppath->mpp_ie) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MESH, - "wrong mesh conf version: %d\n", meshconf->conf_ver); + "unknown path selection algorithm: 0x%x\n", + meshconf->conf_pselid); return 1; } - if (memcmp(meshconf->conf_pselid, ms->ms_ppath->mpp_ie, 4) != 0) { + if (meshconf->conf_pmetid != ms->ms_pmetric->mpm_ie) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MESH, - "unknown path selection algorithm: 0x%x%x%x%x\n", - meshconf->conf_pselid[0], meshconf->conf_pselid[1], - meshconf->conf_pselid[2], meshconf->conf_pselid[3]); + "unknown path metric algorithm: 0x%x\n", + meshconf->conf_pmetid); return 1; } - if (memcmp(meshconf->conf_pmetid, ms->ms_pmetric->mpm_ie, 4) != 0) { + if (meshconf->conf_ccid != 0) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MESH, - "unknown path metric algorithm: 0x%x%x%x%x\n", - meshconf->conf_pmetid[0], meshconf->conf_pmetid[1], - meshconf->conf_pmetid[2], meshconf->conf_pmetid[3]); + "unknown congestion control algorithm: 0x%x\n", + meshconf->conf_ccid); return 1; } - if (memcmp(meshconf->conf_ccid, null, 4) != 0) { + if (meshconf->conf_syncid != IEEE80211_MESHCONF_SYNC_NEIGHOFF) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MESH, - "unknown congestion sig algorithm: 0x%x%x%x%x\n", - meshconf->conf_ccid[0], meshconf->conf_ccid[1], - meshconf->conf_ccid[2], meshconf->conf_ccid[3]); + "unknown sync algorithm: 0x%x\n", + meshconf->conf_syncid); return 1; } - if (memcmp(meshconf->conf_syncid, null, 4) != 0) { + if (meshconf->conf_authid != 0) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MESH, - "unknown sync algorithm: 0x%x%x%x%x\n", - meshconf->conf_syncid[0], meshconf->conf_syncid[1], - meshconf->conf_syncid[2], meshconf->conf_syncid[3]); - return 1; - } - if (memcmp(meshconf->conf_authid, null, 4) != 0) { - IEEE80211_DPRINTF(vap, IEEE80211_MSG_MESH, - "unknown auth auth algorithm: 0x%x%x%x%x\n", - meshconf->conf_pselid[0], meshconf->conf_pselid[1], - meshconf->conf_pselid[2], meshconf->conf_pselid[3]); + "unknown auth auth algorithm: 0x%x\n", + meshconf->conf_pselid); return 1; } + /* NB: conf_cap is only read correctly here */ + cap = LE_READ_2(&meshconf->conf_cap); /* Not accepting peers */ - if (!(meshconf->conf_cap & IEEE80211_MESHCONF_CAP_AP)) { + if (!(cap & IEEE80211_MESHCONF_CAP_AP)) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_MESH, "not accepting peers: 0x%x\n", meshconf->conf_cap); return 1; @@ -2394,34 +2385,28 @@ uint8_t * ieee80211_add_meshconf(uint8_t *frm, struct ieee80211vap *vap) { const struct ieee80211_mesh_state *ms = vap->iv_mesh; - static const uint8_t null[4] = IEEE80211_MESHCONF_NULL; + uint16_t caps; KASSERT(vap->iv_opmode == IEEE80211_M_MBSS, ("not a MBSS vap")); *frm++ = IEEE80211_ELEMID_MESHCONF; *frm++ = sizeof(struct ieee80211_meshconf_ie) - 2; - *frm++ = IEEE80211_MESHCONF_VERSION; - memcpy(frm, ms->ms_ppath->mpp_ie, 4); /* path selection */ - frm += 4; - memcpy(frm, ms->ms_pmetric->mpm_ie, 4); /* link metric */ - frm += 4; - /* XXX null for now */ - memcpy(frm, null, 4); /* congestion control */ - frm += 4; - memcpy(frm, null, 4); /* sync */ - frm += 4; - memcpy(frm, null, 4); /* auth */ - frm += 4; + *frm++ = ms->ms_ppath->mpp_ie; /* path selection */ + *frm++ = ms->ms_pmetric->mpm_ie; /* link metric */ + *frm++ = IEEE80211_MESHCONF_CC_DISABLED; + *frm++ = IEEE80211_MESHCONF_SYNC_NEIGHOFF; + *frm++ = IEEE80211_MESHCONF_AUTH_DISABLED; /* NB: set the number of neighbors before the rest */ *frm = (ms->ms_neighbors > 15 ? 15 : ms->ms_neighbors) << 1; if (ms->ms_flags & IEEE80211_MESHFLAGS_PORTAL) *frm |= IEEE80211_MESHCONF_FORM_MP; frm += 1; + caps = 0; if (ms->ms_flags & IEEE80211_MESHFLAGS_AP) - *frm |= IEEE80211_MESHCONF_CAP_AP; + caps |= IEEE80211_MESHCONF_CAP_AP; if (ms->ms_flags & IEEE80211_MESHFLAGS_FWD) - *frm |= IEEE80211_MESHCONF_CAP_FWRD; - frm += 1; + caps |= IEEE80211_MESHCONF_CAP_FWRD; + ADDSHORT(frm, caps); return frm; } @@ -2571,6 +2556,18 @@ ieee80211_mesh_init_neighbor(struct ieee80211_node *ni, ieee80211_parse_meshid(ni, sp->meshid); } +void +ieee80211_mesh_update_beacon(struct ieee80211vap *vap, + struct ieee80211_beacon_offsets *bo) +{ + KASSERT(vap->iv_opmode == IEEE80211_M_MBSS, ("not a MBSS vap")); + + if (isset(bo->bo_flags, IEEE80211_BEACON_MESHCONF)) { + (void)ieee80211_add_meshconf(bo->bo_meshconf, vap); + clrbit(bo->bo_flags, IEEE80211_BEACON_MESHCONF); + } +} + static int mesh_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq) { diff --git a/sys/net80211/ieee80211_mesh.h b/sys/net80211/ieee80211_mesh.h index e3ce79a4945e..ad1b02afbb1a 100644 --- a/sys/net80211/ieee80211_mesh.h +++ b/sys/net80211/ieee80211_mesh.h @@ -43,47 +43,27 @@ struct ieee80211_meshconf_ie { uint8_t conf_ie; /* IEEE80211_ELEMID_MESHCONF */ uint8_t conf_len; - uint8_t conf_ver; - uint8_t conf_pselid[4]; /* Active Path Sel. Proto. ID */ - uint8_t conf_pmetid[4]; /* APS Metric Identifier */ - uint8_t conf_ccid[4]; /* Congestion Control Mode ID */ - uint8_t conf_syncid[4]; /* Sync. Protocol ID */ - uint8_t conf_authid[4]; /* Auth. Protocol ID */ + uint8_t conf_pselid; /* Active Path Sel. Proto. ID */ + uint8_t conf_pmetid; /* Active Metric Identifier */ + uint8_t conf_ccid; /* Congestion Control Mode ID */ + uint8_t conf_syncid; /* Sync. Protocol ID */ + uint8_t conf_authid; /* Auth. Protocol ID */ uint8_t conf_form; /* Formation Information */ - uint8_t conf_cap; + uint16_t conf_cap; } __packed; -#define IEEE80211_MESHCONF_VERSION 1 -/* Null Protocol */ -#define IEEE80211_MESHCONF_NULL_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESHCONF_NULL_VALUE 0xff -#define IEEE80211_MESHCONF_NULL { IEEE80211_MESHCONF_NULL_OUI, \ - IEEE80211_MESHCONF_NULL_VALUE } /* Hybrid Wireless Mesh Protocol */ -#define IEEE80211_MESHCONF_HWMP_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESHCONF_HWMP_VALUE 0x00 -#define IEEE80211_MESHCONF_HWMP { IEEE80211_MESHCONF_HWMP_OUI, \ - IEEE80211_MESHCONF_HWMP_VALUE } +#define IEEE80211_MESHCONF_PATH_HWMP 0x00 /* Airtime Link Metric */ -#define IEEE80211_MESHCONF_AIRTIME_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESHCONF_AIRTIME_VALUE 0x00 -#define IEEE80211_MESHCONF_AIRTIME { IEEE80211_MESHCONF_AIRTIME_OUI, \ - IEEE80211_MESHCONF_AIRTIME_VALUE } -/* Congestion Control Signaling */ -#define IEEE80211_MESHCONF_CCSIG_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESHCONF_CCSIG_VALUE 0x00 -#define IEEE80211_MESHCONF_CCSIG { IEEE80211_MESHCONF_CCSIG_OUI,\ - IEEE80211_MESHCONF_CCSIG_VALUE } +#define IEEE80211_MESHCONF_METRIC_AIRTIME 0x00 +/* Congestion Control */ +#define IEEE80211_MESHCONF_CC_DISABLED 0x00 +#define IEEE80211_MESHCONF_CC_SIG 0x01 /* Neighbour Offset */ -#define IEEE80211_MESHCONF_NEIGHOFF_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESHCONF_NEIGHOFF_VALUE 0x00 -#define IEEE80211_MESHCONF_NEIGHOFF { IEEE80211_MESHCONF_NEIGHOFF_OUI, \ - IEEE80211_MESHCONF_NEIGHOFF_VALUE } +#define IEEE80211_MESHCONF_SYNC_NEIGHOFF 0x00 +#define IEEE80211_MESHCONF_AUTH_DISABLED 0x00 /* Simultaneous Authenticaction of Equals */ -#define IEEE80211_MESHCONF_SAE_OUI 0x00, 0x0f, 0xac -#define IEEE80211_MESHCONF_SAE_VALUE 0x01 -#define IEEE80211_MESHCONF_SAE { IEEE80211_MESHCONF_SAE_OUI, \ - IEEE80211_MESHCONF_SAE_VALUE } +#define IEEE80211_MESHCONF_AUTH_SAE 0x01 #define IEEE80211_MESHCONF_FORM_MP 0x01 /* Connected to Portal */ #define IEEE80211_MESHCONF_FORM_NNEIGH_MASK 0x04 /* Number of Neighbours */ #define IEEE80211_MESHCONF_CAP_AP 0x01 /* Accepting Peers */ @@ -92,7 +72,8 @@ struct ieee80211_meshconf_ie { #define IEEE80211_MESHCONF_CAP_FWRD 0x08 /* forwarding enabled */ #define IEEE80211_MESHCONF_CAP_BTR 0x10 /* Beacon Timing Report Enab */ #define IEEE80211_MESHCONF_CAP_TBTTA 0x20 /* TBTT Adj. Enabled */ -#define IEEE80211_MESHCONF_CAP_PSL 0x40 /* Power Save Level */ +#define IEEE80211_MESHCONF_CAP_TBTT 0x40 /* TBTT Adjusting */ +#define IEEE80211_MESHCONF_CAP_PSL 0x80 /* Power Save Level */ /* Mesh Identifier */ struct ieee80211_meshid_ie { @@ -390,8 +371,9 @@ struct ieee80211_mesh_route { */ enum ieee80211_state; struct ieee80211_mesh_proto_path { + uint8_t mpp_active; char mpp_descr[IEEE80211_MESH_PROTO_DSZ]; - uint8_t mpp_ie[4]; + uint8_t mpp_ie; struct ieee80211_node * (*mpp_discover)(struct ieee80211vap *, const uint8_t [IEEE80211_ADDR_LEN], @@ -411,8 +393,9 @@ struct ieee80211_mesh_proto_path { * Mesh Link Metric Report Protocol. */ struct ieee80211_mesh_proto_metric { + uint8_t mpm_active; char mpm_descr[IEEE80211_MESH_PROTO_DSZ]; - uint8_t mpm_ie[4]; + uint8_t mpm_ie; uint32_t (*mpm_metric)(struct ieee80211_node *); }; @@ -488,6 +471,8 @@ struct ieee80211_scanparams; void ieee80211_mesh_init_neighbor(struct ieee80211_node *, const struct ieee80211_frame *, const struct ieee80211_scanparams *); +void ieee80211_mesh_update_beacon(struct ieee80211vap *, + struct ieee80211_beacon_offsets *); /* * Return non-zero if proxy operation is enabled. diff --git a/sys/net80211/ieee80211_node.c b/sys/net80211/ieee80211_node.c index 30508d963e7d..bccb6d5bdd91 100644 --- a/sys/net80211/ieee80211_node.c +++ b/sys/net80211/ieee80211_node.c @@ -1739,7 +1739,7 @@ ieee80211_node_delucastkey(struct ieee80211_node *ni) status = ieee80211_crypto_delkey(ni->ni_vap, &ni->ni_ucastkey); if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax) { nikey = nt->nt_keyixmap[keyix]; - nt->nt_keyixmap[keyix] = NULL;; + nt->nt_keyixmap[keyix] = NULL; } } if (!isowned) diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index f1a21bce8f2a..9b532c32e212 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -2658,6 +2658,7 @@ ieee80211_beacon_construct(struct mbuf *m, uint8_t *frm, #ifdef IEEE80211_SUPPORT_MESH if (vap->iv_opmode == IEEE80211_M_MBSS) { frm = ieee80211_add_meshid(frm, vap); + bo->bo_meshconf = frm; frm = ieee80211_add_meshconf(frm, vap); } #endif @@ -2763,13 +2764,7 @@ ieee80211_beacon_alloc(struct ieee80211_node *ni, *(uint16_t *)wh->i_dur = 0; IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr); IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); -#ifdef IEEE80211_SUPPORT_MESH - if (vap->iv_opmode == IEEE80211_M_MBSS) { - static const uint8_t zerobssid[IEEE80211_ADDR_LEN]; - IEEE80211_ADDR_COPY(wh->i_addr3, zerobssid); - } else -#endif - IEEE80211_ADDR_COPY(wh->i_addr3, ni->ni_bssid); + IEEE80211_ADDR_COPY(wh->i_addr3, ni->ni_bssid); *(uint16_t *)wh->i_seq = 0; return m; @@ -2874,6 +2869,11 @@ ieee80211_beacon_update(struct ieee80211_node *ni, ieee80211_tdma_update_beacon(vap, bo); } #endif +#ifdef IEEE80211_SUPPORT_MESH + if (vap->iv_opmode == IEEE80211_M_MBSS) + ieee80211_mesh_update_beacon(vap, bo); +#endif + if (vap->iv_opmode == IEEE80211_M_HOSTAP || vap->iv_opmode == IEEE80211_M_MBSS) { /* NB: no IBSS support*/ struct ieee80211_tim_ie *tie = @@ -2927,6 +2927,9 @@ ieee80211_beacon_update(struct ieee80211_node *ni, #endif #ifdef IEEE80211_TDMA_SUPPORT bo->bo_tdma += adjust; +#endif +#ifdef IEEE80211_MESH_SUPPORT + bo->bo_meshconf += adjust; #endif bo->bo_appie += adjust; bo->bo_wme += adjust; @@ -2978,6 +2981,9 @@ ieee80211_beacon_update(struct ieee80211_node *ni, #endif #ifdef IEEE80211_TDMA_SUPPORT bo->bo_tdma += sizeof(*csa); +#endif +#ifdef IEEE80211_MESH_SUPPORT + bo->bo_meshconf += sizeof(*csa); #endif bo->bo_appie += sizeof(*csa); bo->bo_csa_trailer_len += sizeof(*csa); diff --git a/sys/net80211/ieee80211_proto.h b/sys/net80211/ieee80211_proto.h index 9bfbc61715fa..c280847763b2 100644 --- a/sys/net80211/ieee80211_proto.h +++ b/sys/net80211/ieee80211_proto.h @@ -315,9 +315,10 @@ struct ieee80211_beacon_offsets { uint8_t *bo_ath; /* start of ATH parameters */ uint8_t *bo_appie; /* start of AppIE element */ uint16_t bo_appie_len; /* AppIE length in bytes */ - uint16_t bo_csa_trailer_len;; + uint16_t bo_csa_trailer_len; uint8_t *bo_csa; /* start of CSA element */ - uint8_t *bo_spare[4]; + uint8_t *bo_meshconf; /* start of MESHCONF element */ + uint8_t *bo_spare[3]; }; struct mbuf *ieee80211_beacon_alloc(struct ieee80211_node *, struct ieee80211_beacon_offsets *); @@ -345,6 +346,7 @@ enum { IEEE80211_BEACON_CSA = 7, /* Channel Switch Announcement */ IEEE80211_BEACON_TDMA = 9, /* TDMA Info */ IEEE80211_BEACON_ATH = 10, /* ATH parameters */ + IEEE80211_BEACON_MESHCONF = 11, /* Mesh Configuration */ }; int ieee80211_beacon_update(struct ieee80211_node *, struct ieee80211_beacon_offsets *, struct mbuf *, int mcast); diff --git a/sys/net80211/ieee80211_sta.c b/sys/net80211/ieee80211_sta.c index a4f538dbdfb6..743fe4822681 100644 --- a/sys/net80211/ieee80211_sta.c +++ b/sys/net80211/ieee80211_sta.c @@ -517,7 +517,7 @@ sta_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) struct ieee80211_frame *wh; struct ieee80211_key *key; struct ether_header *eh; - int hdrspace, need_tap; + int hdrspace, need_tap = 1; /* mbuf need to be tapped. */ uint8_t dir, type, subtype, qos; uint8_t *bssid; uint16_t rxseq; @@ -542,7 +542,6 @@ sta_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) KASSERT(ni != NULL, ("null node")); ni->ni_inact = ni->ni_inact_reload; - need_tap = 1; /* mbuf need to be tapped. */ type = -1; /* undefined */ if (m->m_pkthdr.len < sizeof(struct ieee80211_frame_min)) { @@ -759,7 +758,7 @@ sta_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) /* copy to listener after decrypt */ if (ieee80211_radiotap_active_vap(vap)) - ieee80211_radiotap_tx(vap, m); + ieee80211_radiotap_rx(vap, m); need_tap = 0; /* diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h index 3d23f4780d08..d6f3e6669ec9 100644 --- a/sys/net80211/ieee80211_var.h +++ b/sys/net80211/ieee80211_var.h @@ -32,11 +32,11 @@ * Definitions for IEEE 802.11 drivers. */ /* NB: portability glue must go first */ -#ifdef __NetBSD__ +#if defined(__NetBSD__) #include -#elif __FreeBSD__ +#elif defined(__FreeBSD__) #include -#elif __linux__ +#elif defined(__linux__) #include #else #error "No support for your operating system!" @@ -545,11 +545,12 @@ MALLOC_DECLARE(M_80211_VAP); /* NB: immutable: should be set only when creating a vap */ #define IEEE80211_FEXT_WDSLEGACY 0x00010000 /* CONF: legacy WDS operation */ #define IEEE80211_FEXT_PROBECHAN 0x00020000 /* CONF: probe passive channel*/ +#define IEEE80211_FEXT_UNIQMAC 0x00040000 /* CONF: user or computed mac */ #define IEEE80211_FEXT_BITS \ "\20\2INACT\3SCANWAIT\4BGSCAN\5WPS\6TSN\7SCANREQ\10RESUME" \ "\0114ADDR\12NONEPR_PR\13SWBMISS\14DFS\15DOTD\16STATEWAIT\17REINIT" \ - "\20BPF\21WDSLEGACY\22PROBECHAN" + "\20BPF\21WDSLEGACY\22PROBECHAN\23UNIQMAC" /* ic_flags_ht/iv_flags_ht */ #define IEEE80211_FHT_NONHT_PR 0x00000001 /* STATUS: non-HT sta present */ diff --git a/sys/net80211/ieee80211_wds.c b/sys/net80211/ieee80211_wds.c index 807648c6f462..15518d818120 100644 --- a/sys/net80211/ieee80211_wds.c +++ b/sys/net80211/ieee80211_wds.c @@ -414,7 +414,7 @@ wds_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) struct ieee80211_frame *wh; struct ieee80211_key *key; struct ether_header *eh; - int hdrspace, need_tap; + int hdrspace, need_tap = 1; /* mbuf need to be tapped. */ uint8_t dir, type, subtype, qos; uint16_t rxseq; @@ -437,7 +437,6 @@ wds_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf) KASSERT(ni != NULL, ("null node")); - need_tap = 1; /* mbuf need to be tapped. */ type = -1; /* undefined */ if (m->m_pkthdr.len < sizeof(struct ieee80211_frame_min)) { diff --git a/sys/netgraph/NOTES b/sys/netgraph/NOTES index 0ddc02f5a663..eb3a54c56145 100644 --- a/sys/netgraph/NOTES +++ b/sys/netgraph/NOTES @@ -76,10 +76,10 @@ Archie's suggestions... :-) be careful with things like #ifdef INET. - All nodes assume that all data mbufs have the M_PKTHDR flag set! The ng_send_data() and related functions should have an - #ifdef DIAGNOSTICS check to check this assumption for every mbuf. + #ifdef DIAGNOSTIC check to check this assumption for every mbuf. -DONE with INVARIANTS. Framework should test this more. - More generally, netgraph code should make liberal use of the - #ifdef DIAGNOSTICS definition. + #ifdef DIAGNOSTIC definition. -INVARIANTS. - Since data and messages are sent functionally, programmers need to watch out for infinite feedback loops. Should ng_base.c detect diff --git a/sys/netgraph/atm/uni/ng_uni.c b/sys/netgraph/atm/uni/ng_uni.c index e6fa04ba55a3..5b2a7ff712af 100644 --- a/sys/netgraph/atm/uni/ng_uni.c +++ b/sys/netgraph/atm/uni/ng_uni.c @@ -771,18 +771,18 @@ struct unimem_debug { LIST_HEAD(unimem_debug_list, unimem_debug); static struct unimem_debug_list nguni_freemem[UNIMEM_TYPES] = { - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), + LIST_HEAD_INITIALIZER(nguni_freemem[0]), + LIST_HEAD_INITIALIZER(nguni_freemem[1]), + LIST_HEAD_INITIALIZER(nguni_freemem[2]), + LIST_HEAD_INITIALIZER(nguni_freemem[3]), + LIST_HEAD_INITIALIZER(nguni_freemem[4]), }; static struct unimem_debug_list nguni_usedmem[UNIMEM_TYPES] = { - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), - LIST_HEAD_INITIALIZER(unimem_debug), + LIST_HEAD_INITIALIZER(nguni_usedmem[0]), + LIST_HEAD_INITIALIZER(nguni_usedmem[1]), + LIST_HEAD_INITIALIZER(nguni_usedmem[2]), + LIST_HEAD_INITIALIZER(nguni_usedmem[3]), + LIST_HEAD_INITIALIZER(nguni_usedmem[4]), }; static struct mtx nguni_unilist_mtx; diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c index 65707b20914c..fdfe878dbc9d 100644 --- a/sys/netgraph/ng_base.c +++ b/sys/netgraph/ng_base.c @@ -120,7 +120,7 @@ struct ng_node ng_deadnode = { 0, /* numhooks */ NULL, /* private */ 0, /* ID */ - LIST_HEAD_INITIALIZER(ng_deadnode.hooks), + LIST_HEAD_INITIALIZER(ng_deadnode.nd_hooks), {}, /* all_nodes list entry */ {}, /* id hashtable list entry */ { 0, diff --git a/sys/netgraph/ng_bridge.c b/sys/netgraph/ng_bridge.c index e42b5a547f03..35e139278126 100644 --- a/sys/netgraph/ng_bridge.c +++ b/sys/netgraph/ng_bridge.c @@ -75,8 +75,9 @@ #include #include +#if 0 /* not used yet */ #include - +#endif #include #include #include @@ -634,7 +635,7 @@ ng_bridge_rcvdata(hook_p hook, item_p item) /* Run packet through ipfw processing, if enabled */ #if 0 - if (priv->conf.ipfw[linkNum] && V_fw_enable && ip_fw_chk_ptr != NULL) { + if (priv->conf.ipfw[linkNum] && V_fw_enable && V_ip_fw_chk_ptr != NULL) { /* XXX not implemented yet */ } #endif diff --git a/sys/netgraph/ng_eiface.c b/sys/netgraph/ng_eiface.c index ce23683c59b7..72cc55caae22 100644 --- a/sys/netgraph/ng_eiface.c +++ b/sys/netgraph/ng_eiface.c @@ -369,7 +369,6 @@ ng_eiface_constructor(node_p node) ifp->if_output = ether_output; ifp->if_start = ng_eiface_start; ifp->if_ioctl = ng_eiface_ioctl; - ifp->if_watchdog = NULL; ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; ifp->if_flags = (IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST); @@ -432,6 +431,7 @@ ng_eiface_rcvmsg(node_p node, item_p item, hook_p lasthook) } error = if_setlladdr(priv->ifp, (u_char *)msg->data, ETHER_ADDR_LEN); + EVENTHANDLER_INVOKE(iflladdr_event, priv->ifp); break; } diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c index fab06226610a..5abc5aaebcba 100644 --- a/sys/netgraph/ng_ether.c +++ b/sys/netgraph/ng_ether.c @@ -359,9 +359,6 @@ ng_ether_link_state(struct ifnet *ifp, int state) struct ng_mesg *msg; int cmd, dummy_error = 0; - if (priv->lower == NULL) - return; - if (state == LINK_STATE_UP) cmd = NGM_LINK_IS_UP; else if (state == LINK_STATE_DOWN) @@ -369,9 +366,16 @@ ng_ether_link_state(struct ifnet *ifp, int state) else return; - NG_MKMESSAGE(msg, NGM_FLOW_COOKIE, cmd, 0, M_NOWAIT); - if (msg != NULL) - NG_SEND_MSG_HOOK(dummy_error, node, msg, priv->lower, 0); + if (priv->lower != NULL) { + NG_MKMESSAGE(msg, NGM_FLOW_COOKIE, cmd, 0, M_NOWAIT); + if (msg != NULL) + NG_SEND_MSG_HOOK(dummy_error, node, msg, priv->lower, 0); + } + if (priv->orphan != NULL) { + NG_MKMESSAGE(msg, NGM_FLOW_COOKIE, cmd, 0, M_NOWAIT); + if (msg != NULL) + NG_SEND_MSG_HOOK(dummy_error, node, msg, priv->orphan, 0); + } } /****************************************************************** @@ -477,6 +481,7 @@ ng_ether_rcvmsg(node_p node, item_p item, hook_p lasthook) } error = if_setlladdr(priv->ifp, (u_char *)msg->data, ETHER_ADDR_LEN); + EVENTHANDLER_INVOKE(iflladdr_event, priv->ifp); break; } case NGM_ETHER_GET_PROMISC: diff --git a/sys/netgraph/ng_fec.c b/sys/netgraph/ng_fec.c index e694dd8de1d9..919947acab42 100644 --- a/sys/netgraph/ng_fec.c +++ b/sys/netgraph/ng_fec.c @@ -433,6 +433,7 @@ ng_fec_addport(struct ng_fec_private *priv, char *iface) /* Set up phony MAC address. */ if_setlladdr(bifp, IF_LLADDR(ifp), ETHER_ADDR_LEN); + EVENTHANDLER_INVOKE(iflladdr_event, bifp); /* Save original input vector */ new->fec_if_input = bifp->if_input; @@ -1226,7 +1227,6 @@ ng_fec_constructor(node_p node) ifp->if_start = ng_fec_start; ifp->if_ioctl = ng_fec_ioctl; ifp->if_init = ng_fec_init; - ifp->if_watchdog = NULL; ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; ifp->if_mtu = NG_FEC_MTU_DEFAULT; ifp->if_flags = (IFF_SIMPLEX|IFF_BROADCAST|IFF_MULTICAST); diff --git a/sys/netgraph/ng_iface.c b/sys/netgraph/ng_iface.c index 209ac77fbd35..d53bf768b10d 100644 --- a/sys/netgraph/ng_iface.c +++ b/sys/netgraph/ng_iface.c @@ -558,7 +558,6 @@ ng_iface_constructor(node_p node) ifp->if_output = ng_iface_output; ifp->if_start = ng_iface_start; ifp->if_ioctl = ng_iface_ioctl; - ifp->if_watchdog = NULL; ifp->if_mtu = NG_IFACE_MTU_DEFAULT; ifp->if_flags = (IFF_SIMPLEX|IFF_POINTOPOINT|IFF_NOARP|IFF_MULTICAST); ifp->if_type = IFT_PROPVIRTUAL; /* XXX */ diff --git a/sys/netgraph/ng_ipfw.c b/sys/netgraph/ng_ipfw.c index 46bac8eb9bcf..537040a8ff82 100644 --- a/sys/netgraph/ng_ipfw.c +++ b/sys/netgraph/ng_ipfw.c @@ -43,9 +43,10 @@ #include #include #include -#include -#include #include +#include +#include +#include #include #include @@ -220,21 +221,23 @@ ng_ipfw_findhook1(node_p node, u_int16_t rulenum) static int ng_ipfw_rcvdata(hook_p hook, item_p item) { - struct ng_ipfw_tag *ngit; + struct ipfw_rule_ref *tag; struct mbuf *m; NGI_GET_M(item, m); NG_FREE_ITEM(item); - if ((ngit = (struct ng_ipfw_tag *)m_tag_locate(m, NGM_IPFW_COOKIE, 0, - NULL)) == NULL) { + tag = (struct ipfw_rule_ref *) + m_tag_locate(m, MTAG_IPFW_RULE, 0, NULL); + if (tag == NULL) { NG_FREE_M(m); return (EINVAL); /* XXX: find smth better */ }; - switch (ngit->dir) { - case NG_IPFW_OUT: - { + if (tag->info & IPFW_INFO_IN) { + ip_input(m); + return (0); + } else { struct ip *ip; if (m->m_len < sizeof(struct ip) && @@ -243,27 +246,16 @@ ng_ipfw_rcvdata(hook_p hook, item_p item) ip = mtod(m, struct ip *); - ip->ip_len = ntohs(ip->ip_len); - ip->ip_off = ntohs(ip->ip_off); + SET_HOST_IPLEN(ip); return ip_output(m, NULL, NULL, IP_FORWARDING, NULL, NULL); - } - case NG_IPFW_IN: - ip_input(m); - return (0); - default: - panic("ng_ipfw_rcvdata: bad dir %u", ngit->dir); } - - /* not reached */ - return (0); } static int ng_ipfw_input(struct mbuf **m0, int dir, struct ip_fw_args *fwa, int tee) { struct mbuf *m; - struct ng_ipfw_tag *ngit; struct ip *ip; hook_p hook; int error = 0; @@ -272,7 +264,7 @@ ng_ipfw_input(struct mbuf **m0, int dir, struct ip_fw_args *fwa, int tee) * Node must be loaded and corresponding hook must be present. */ if (fw_node == NULL || - (hook = ng_ipfw_findhook1(fw_node, fwa->cookie)) == NULL) { + (hook = ng_ipfw_findhook1(fw_node, fwa->rule.info)) == NULL) { if (tee == 0) m_freem(*m0); return (ESRCH); /* no hook associated with this rule */ @@ -284,20 +276,21 @@ ng_ipfw_input(struct mbuf **m0, int dir, struct ip_fw_args *fwa, int tee) * a copy of a packet and forward it into netgraph without a tag. */ if (tee == 0) { + struct m_tag *tag; + struct ipfw_rule_ref *r; m = *m0; *m0 = NULL; /* it belongs now to netgraph */ - if ((ngit = (struct ng_ipfw_tag *)m_tag_alloc(NGM_IPFW_COOKIE, - 0, TAGSIZ, M_NOWAIT|M_ZERO)) == NULL) { + tag = m_tag_alloc(MTAG_IPFW_RULE, 0, sizeof(*r), + M_NOWAIT|M_ZERO); + if (tag == NULL) { m_freem(m); return (ENOMEM); } - ngit->rule = fwa->rule; - ngit->rule_id = fwa->rule_id; - ngit->chain_id = fwa->chain_id; - ngit->dir = dir; - ngit->ifp = fwa->oif; - m_tag_prepend(m, &ngit->mt); + r = (struct ipfw_rule_ref *)(tag + 1); + *r = fwa->rule; + r->info = dir ? IPFW_INFO_IN : IPFW_INFO_OUT; + m_tag_prepend(m, tag); } else if ((m = m_dup(*m0, M_DONTWAIT)) == NULL) @@ -308,8 +301,6 @@ ng_ipfw_input(struct mbuf **m0, int dir, struct ip_fw_args *fwa, int tee) return (EINVAL); ip = mtod(m, struct ip *); - ip->ip_len = htons(ip->ip_len); - ip->ip_off = htons(ip->ip_off); NG_SEND_DATA_ONLY(error, hook, m); diff --git a/sys/netgraph/ng_ipfw.h b/sys/netgraph/ng_ipfw.h index 29039f2f7a60..c2cab6a03960 100644 --- a/sys/netgraph/ng_ipfw.h +++ b/sys/netgraph/ng_ipfw.h @@ -26,26 +26,8 @@ * $FreeBSD$ */ +#ifndef _NG_IPFW_H +#define _NG_IPFW_H #define NG_IPFW_NODE_TYPE "ipfw" #define NGM_IPFW_COOKIE 1105988990 - -#ifdef _KERNEL - -typedef int ng_ipfw_input_t(struct mbuf **, int, struct ip_fw_args *, int); -extern ng_ipfw_input_t *ng_ipfw_input_p; -#define NG_IPFW_LOADED (ng_ipfw_input_p != NULL) - -struct ng_ipfw_tag { - struct m_tag mt; /* tag header */ - struct ip_fw *rule; /* matching rule */ - uint32_t rule_id; /* matching rule id */ - uint32_t chain_id; /* ruleset id */ - struct ifnet *ifp; /* interface, for ip_output */ - int dir; -#define NG_IPFW_OUT 0 -#define NG_IPFW_IN 1 -}; - -#define TAGSIZ (sizeof(struct ng_ipfw_tag) - sizeof(struct m_tag)) - -#endif /* _KERNEL */ +#endif /* _NG_IPFW_H */ diff --git a/sys/netgraph/ng_sppp.c b/sys/netgraph/ng_sppp.c index 5276f4f9becd..6b30ed61f8ed 100644 --- a/sys/netgraph/ng_sppp.c +++ b/sys/netgraph/ng_sppp.c @@ -279,7 +279,6 @@ ng_sppp_constructor (node_p node) if_initname (SP2IFP(pp), NG_SPPP_IFACE_NAME, priv->unit); ifp->if_start = ng_sppp_start; ifp->if_ioctl = ng_sppp_ioctl; - ifp->if_watchdog = NULL; ifp->if_flags = (IFF_POINTOPOINT|IFF_MULTICAST); /* Give this node the same name as the interface (if possible) */ diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index be6292161c2f..97152a72dbe2 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -88,11 +88,14 @@ VNET_DEFINE(int, useloopback) = 1; /* use loopback interface for /* timer values */ static VNET_DEFINE(int, arpt_keep) = (20*60); /* once resolved, good for 20 * minutes */ +static VNET_DEFINE(int, arpt_down) = 20; /* keep incomplete entries for + * 20 seconds */ static VNET_DEFINE(int, arp_maxtries) = 5; static VNET_DEFINE(int, arp_proxyall); static VNET_DEFINE(struct arpstat, arpstat); /* ARP statistics, see if_arp.h */ #define V_arpt_keep VNET(arpt_keep) +#define V_arpt_down VNET(arpt_down) #define V_arp_maxtries VNET(arp_maxtries) #define V_arp_proxyall VNET(arp_proxyall) #define V_arpstat VNET(arpstat) @@ -172,17 +175,23 @@ arptimer(void *arg) CURVNET_SET(ifp->if_vnet); IF_AFDATA_LOCK(ifp); LLE_WLOCK(lle); - if (((lle->la_flags & LLE_DELETED) || - (time_second >= lle->la_expire)) && - (!callout_pending(&lle->la_timer) && - callout_active(&lle->la_timer))) { - (void) llentry_free(lle); - ARPSTAT_INC(timeouts); - } else { - /* - * Still valid, just drop our reference - */ - LLE_FREE_LOCKED(lle); + if (lle->la_flags & LLE_STATIC) + LLE_WUNLOCK(lle); + else { + if (!callout_pending(&lle->la_timer) && + callout_active(&lle->la_timer)) { + (void) llentry_free(lle); + ARPSTAT_INC(timeouts); + } +#ifdef DIAGNOSTIC + else { + struct sockaddr *l3addr = L3_ADDR(lle); + log(LOG_INFO, + "arptimer issue: %p, IPv4 address: \"%s\"\n", lle, + inet_ntoa( + ((const struct sockaddr_in *)l3addr)->sin_addr)); + } +#endif } IF_AFDATA_UNLOCK(ifp); CURVNET_RESTORE(); @@ -309,7 +318,7 @@ retry: } if ((la->la_flags & LLE_VALID) && - ((la->la_flags & LLE_STATIC) || la->la_expire > time_uptime)) { + ((la->la_flags & LLE_STATIC) || la->la_expire > time_second)) { bcopy(&la->ll_addr, desten, ifp->if_addrlen); /* * If entry has an expiry time and it is approaching, @@ -317,7 +326,7 @@ retry: * arpt_down interval. */ if (!(la->la_flags & LLE_STATIC) && - time_uptime + la->la_preempt > la->la_expire) { + time_second + la->la_preempt > la->la_expire) { arprequest(ifp, NULL, &SIN(dst)->sin_addr, IF_LLADDR(ifp)); @@ -337,7 +346,7 @@ retry: goto done; } - renew = (la->la_asked == 0 || la->la_expire != time_uptime); + renew = (la->la_asked == 0 || la->la_expire != time_second); if ((renew || m != NULL) && (flags & LLE_EXCLUSIVE) == 0) { flags |= LLE_EXCLUSIVE; LLE_RUNLOCK(la); @@ -369,13 +378,13 @@ retry: if (la->la_asked < V_arp_maxtries) error = EWOULDBLOCK; /* First request. */ else - error = - (rt0->rt_flags & RTF_GATEWAY) ? EHOSTDOWN : EHOSTUNREACH; + error = rt0 != NULL && (rt0->rt_flags & RTF_GATEWAY) ? + EHOSTUNREACH : EHOSTDOWN; if (renew) { LLE_ADDREF(la); - la->la_expire = time_uptime; - callout_reset(&la->la_timer, hz, arptimer, la); + la->la_expire = time_second + V_arpt_down; + callout_reset(&la->la_timer, hz * V_arpt_down, arptimer, la); la->la_asked++; LLE_WUNLOCK(la); arprequest(ifp, NULL, &SIN(dst)->sin_addr, @@ -687,7 +696,7 @@ match: EVENTHANDLER_INVOKE(arp_update_event, la); if (!(la->la_flags & LLE_STATIC)) { - la->la_expire = time_uptime + V_arpt_keep; + la->la_expire = time_second + V_arpt_keep; callout_reset(&la->la_timer, hz * V_arpt_keep, arptimer, la); } diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 11e098ed0cf4..b1c51a21f409 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -562,7 +562,7 @@ in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp, (hostIsNew || maskIsNew)) error = in_ifinit(ifp, ia, &ifra->ifra_addr, 0); if (error != 0 && iaIsNew) - goto out; + break; if ((ifp->if_flags & IFF_BROADCAST) && (ifra->ifra_broadaddr.sin_family == AF_INET)) @@ -921,12 +921,34 @@ in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct sockaddr_in *sin, if (ia->ia_addr.sin_addr.s_addr == INADDR_ANY) return (0); + if (ifp->if_flags & IFF_POINTOPOINT) { + if (ia->ia_dstaddr.sin_addr.s_addr == ia->ia_addr.sin_addr.s_addr) + return (0); + } + + /* * add a loopback route to self */ - if (V_useloopback && !(ifp->if_flags & IFF_LOOPBACK)) - error = ifa_add_loopback_route((struct ifaddr *)ia, + if (V_useloopback && !(ifp->if_flags & IFF_LOOPBACK)) { + struct route ia_ro; + + bzero(&ia_ro, sizeof(ia_ro)); + *((struct sockaddr_in *)(&ia_ro.ro_dst)) = ia->ia_addr; + rtalloc_ign_fib(&ia_ro, 0, 0); + if ((ia_ro.ro_rt != NULL) && (ia_ro.ro_rt->rt_ifp != NULL) && + (ia_ro.ro_rt->rt_ifp == V_loif)) { + RT_LOCK(ia_ro.ro_rt); + RT_ADDREF(ia_ro.ro_rt); + RTFREE_LOCKED(ia_ro.ro_rt); + } else + error = ifa_add_loopback_route((struct ifaddr *)ia, (struct sockaddr *)&ia->ia_addr); + if (error == 0) + ia->ia_flags |= IFA_RTSELF; + if (ia_ro.ro_rt != NULL) + RTFREE(ia_ro.ro_rt); + } return (error); } @@ -934,6 +956,49 @@ in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct sockaddr_in *sin, #define rtinitflags(x) \ ((((x)->ia_ifp->if_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) != 0) \ ? RTF_HOST : 0) + +/* + * Generate a routing message when inserting or deleting + * an interface address alias. + */ +static void in_addralias_rtmsg(int cmd, struct in_addr *prefix, + struct in_ifaddr *target) +{ + struct route pfx_ro; + struct sockaddr_in *pfx_addr; + struct rtentry msg_rt; + + /* QL: XXX + * This is a bit questionable because there is no + * additional route entry added/deleted for an address + * alias. Therefore this route report is inaccurate. + */ + bzero(&pfx_ro, sizeof(pfx_ro)); + pfx_addr = (struct sockaddr_in *)(&pfx_ro.ro_dst); + pfx_addr->sin_len = sizeof(*pfx_addr); + pfx_addr->sin_family = AF_INET; + pfx_addr->sin_addr = *prefix; + rtalloc_ign_fib(&pfx_ro, 0, 0); + if (pfx_ro.ro_rt != NULL) { + msg_rt = *pfx_ro.ro_rt; + + /* QL: XXX + * Point the gateway to the new interface + * address as if a new prefix route entry has + * been added through the new address alias. + * All other parts of the rtentry is accurate, + * e.g., rt_key, rt_mask, rt_ifp etc. + */ + msg_rt.rt_gateway = + (struct sockaddr *)&target->ia_addr; + rt_newaddrmsg(cmd, + (struct ifaddr *)target, + 0, &msg_rt); + RTFREE(pfx_ro.ro_rt); + } + return; +} + /* * Check if we have a route for the given prefix already or add one accordingly. */ @@ -981,40 +1046,7 @@ in_addprefix(struct in_ifaddr *target, int flags) IN_IFADDR_RUNLOCK(); return (EEXIST); } else { - struct route pfx_ro; - struct sockaddr_in *pfx_addr; - struct rtentry msg_rt; - - /* QL: XXX - * This is a bit questionable because there is no - * additional route entry added for an address alias. - * Therefore this route report is inaccurate. Perhaps - * it's better to supply a empty rtentry as how it - * is done in in_scrubprefix(). - */ - bzero(&pfx_ro, sizeof(pfx_ro)); - pfx_addr = (struct sockaddr_in *)(&pfx_ro.ro_dst); - pfx_addr->sin_len = sizeof(*pfx_addr); - pfx_addr->sin_family = AF_INET; - pfx_addr->sin_addr = prefix; - rtalloc_ign_fib(&pfx_ro, 0, 0); - if (pfx_ro.ro_rt != NULL) { - msg_rt = *pfx_ro.ro_rt; - /* QL: XXX - * Point the gateway to the given interface - * address as if a new prefix route entry has - * been added through the new address alias. - * All other parts of the rtentry is accurate, - * e.g., rt_key, rt_mask, rt_ifp etc. - */ - msg_rt.rt_gateway = - (struct sockaddr *)&ia->ia_addr; - rt_newaddrmsg(RTM_ADD, - (struct ifaddr *)target, - 0, &msg_rt); - RTFREE(pfx_ro.ro_rt); - } - + in_addralias_rtmsg(RTM_ADD, &prefix, target); IN_IFADDR_RUNLOCK(); return (0); } @@ -1043,7 +1075,7 @@ in_scrubprefix(struct in_ifaddr *target) { struct in_ifaddr *ia; struct in_addr prefix, mask, p; - int error; + int error = 0; struct sockaddr_in prefix0, mask0; /* @@ -1057,23 +1089,30 @@ in_scrubprefix(struct in_ifaddr *target) * deletion is unconditional. */ if ((target->ia_addr.sin_addr.s_addr != INADDR_ANY) && - !(target->ia_ifp->if_flags & IFF_LOOPBACK)) { - error = ifa_del_loopback_route((struct ifaddr *)target, + !(target->ia_ifp->if_flags & IFF_LOOPBACK) && + (target->ia_flags & IFA_RTSELF)) { + struct route ia_ro; + int freeit = 0; + + bzero(&ia_ro, sizeof(ia_ro)); + *((struct sockaddr_in *)(&ia_ro.ro_dst)) = target->ia_addr; + rtalloc_ign_fib(&ia_ro, 0, 0); + if ((ia_ro.ro_rt != NULL) && (ia_ro.ro_rt->rt_ifp != NULL) && + (ia_ro.ro_rt->rt_ifp == V_loif)) { + RT_LOCK(ia_ro.ro_rt); + if (ia_ro.ro_rt->rt_refcnt <= 1) + freeit = 1; + else + RT_REMREF(ia_ro.ro_rt); + RTFREE_LOCKED(ia_ro.ro_rt); + } + if (freeit) + error = ifa_del_loopback_route((struct ifaddr *)target, (struct sockaddr *)&target->ia_addr); - } - - if ((target->ia_flags & IFA_ROUTE) == 0) { - struct rtentry rt; - - /* QL: XXX - * Report a blank rtentry when a route has not been - * installed for the given interface address. - */ - bzero(&rt, sizeof(rt)); - rt_newaddrmsg(RTM_DELETE, - (struct ifaddr *)target, - 0, &rt); - return (0); + if (error == 0) + target->ia_flags &= ~IFA_RTSELF; + /* remove arp cache */ + arp_ifscrub(target->ia_ifp, IA_SIN(target)->sin_addr.s_addr); } if (rtinitflags(target)) @@ -1082,8 +1121,11 @@ in_scrubprefix(struct in_ifaddr *target) prefix = target->ia_addr.sin_addr; mask = target->ia_sockmask.sin_addr; prefix.s_addr &= mask.s_addr; - /* remove arp cache */ - arp_ifscrub(target->ia_ifp, IA_SIN(target)->sin_addr.s_addr); + } + + if ((target->ia_flags & IFA_ROUTE) == 0) { + in_addralias_rtmsg(RTM_DELETE, &prefix, target); + return (0); } IN_IFADDR_RLOCK(); @@ -1317,7 +1359,7 @@ in_lltable_prefix_free(struct lltable *llt, static int -in_lltable_rtcheck(struct ifnet *ifp, const struct sockaddr *l3addr) +in_lltable_rtcheck(struct ifnet *ifp, u_int flags, const struct sockaddr *l3addr) { struct rtentry *rt; @@ -1326,9 +1368,12 @@ in_lltable_rtcheck(struct ifnet *ifp, const struct sockaddr *l3addr) /* XXX rtalloc1 should take a const param */ rt = rtalloc1(__DECONST(struct sockaddr *, l3addr), 0, 0); - if (rt == NULL || (rt->rt_flags & RTF_GATEWAY) || rt->rt_ifp != ifp) { + if (rt == NULL || (rt->rt_flags & RTF_GATEWAY) || + ((rt->rt_ifp != ifp) && !(flags & LLE_PUB))) { +#ifdef DIAGNOSTIC log(LOG_INFO, "IPv4 address: \"%s\" is not on the network\n", inet_ntoa(((const struct sockaddr_in *)l3addr)->sin_addr)); +#endif if (rt != NULL) RTFREE_LOCKED(rt); return (EINVAL); @@ -1364,7 +1409,7 @@ in_lltable_lookup(struct lltable *llt, u_int flags, const struct sockaddr *l3add break; } if (lle == NULL) { -#ifdef DIAGNOSTICS +#ifdef DIAGNOSTIC if (flags & LLE_DELETE) log(LOG_INFO, "interface address is missing from cache = %p in delete\n", lle); #endif @@ -1376,7 +1421,7 @@ in_lltable_lookup(struct lltable *llt, u_int flags, const struct sockaddr *l3add * verify this. */ if (!(flags & LLE_IFADDR) && - in_lltable_rtcheck(ifp, l3addr) != 0) + in_lltable_rtcheck(ifp, flags, l3addr) != 0) goto done; lle = in_lltable_new(l3addr, flags); @@ -1399,7 +1444,7 @@ in_lltable_lookup(struct lltable *llt, u_int flags, const struct sockaddr *l3add lle->la_flags = LLE_DELETED; EVENTHANDLER_INVOKE(arp_update_event, lle); LLE_WUNLOCK(lle); -#ifdef DIAGNOSTICS +#ifdef DIAGNOSTIC log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); #endif } @@ -1438,7 +1483,7 @@ in_lltable_dump(struct lltable *llt, struct sysctl_req *wr) struct sockaddr_dl *sdl; /* skip deleted entries */ - if ((lle->la_flags & (LLE_DELETED|LLE_VALID)) != LLE_VALID) + if ((lle->la_flags & LLE_DELETED) == LLE_DELETED) continue; /* Skip if jailed and not a valid IP of the prison. */ if (prison_if(wr->td->td_ucred, L3_ADDR(lle)) != 0) @@ -1470,10 +1515,15 @@ in_lltable_dump(struct lltable *llt, struct sysctl_req *wr) sdl = &arpc.sdl; sdl->sdl_family = AF_LINK; sdl->sdl_len = sizeof(*sdl); - sdl->sdl_alen = ifp->if_addrlen; sdl->sdl_index = ifp->if_index; sdl->sdl_type = ifp->if_type; - bcopy(&lle->ll_addr, LLADDR(sdl), ifp->if_addrlen); + if ((lle->la_flags & LLE_VALID) == LLE_VALID) { + sdl->sdl_alen = ifp->if_addrlen; + bcopy(&lle->ll_addr, LLADDR(sdl), ifp->if_addrlen); + } else { + sdl->sdl_alen = 0; + bzero(LLADDR(sdl), ifp->if_addrlen); + } arpc.rtm.rtm_rmx.rmx_expire = lle->la_flags & LLE_STATIC ? 0 : lle->la_expire; diff --git a/sys/netinet/in.h b/sys/netinet/in.h index 1f60bce04a2e..4f4765819d2f 100644 --- a/sys/netinet/in.h +++ b/sys/netinet/in.h @@ -423,12 +423,20 @@ __END_DECLS #define IP_ONESBCAST 23 /* bool: send all-ones broadcast */ #define IP_BINDANY 24 /* bool: allow bind to any address */ +/* + * Options for controlling the firewall and dummynet. + * Historical options (from 40 to 64) will eventually be + * replaced by only two options, IP_FW3 and IP_DUMMYNET3. + */ #define IP_FW_TABLE_ADD 40 /* add entry */ #define IP_FW_TABLE_DEL 41 /* delete entry */ #define IP_FW_TABLE_FLUSH 42 /* flush table */ #define IP_FW_TABLE_GETSIZE 43 /* get table size */ #define IP_FW_TABLE_LIST 44 /* list table contents */ +#define IP_FW3 48 /* generic ipfw v.3 sockopts */ +#define IP_DUMMYNET3 49 /* generic dummynet v.3 sockopts */ + #define IP_FW_ADD 50 /* add a firewall rule to chain */ #define IP_FW_DEL 51 /* delete a firewall rule from chain */ #define IP_FW_FLUSH 52 /* flush firewall rule chain */ @@ -713,6 +721,7 @@ int in_broadcast(struct in_addr, struct ifnet *); int in_canforward(struct in_addr); int in_localaddr(struct in_addr); int in_localip(struct in_addr); +int inet_aton(const char *, struct in_addr *); /* in libkern */ char *inet_ntoa(struct in_addr); /* in libkern */ char *inet_ntoa_r(struct in_addr ina, char *buf); /* in libkern */ void in_ifdetach(struct ifnet *); @@ -725,6 +734,32 @@ void in_ifdetach(struct ifnet *); #define sintosa(sin) ((struct sockaddr *)(sin)) #define ifatoia(ifa) ((struct in_ifaddr *)(ifa)) +/* + * Historically, BSD keeps ip_len and ip_off in host format + * when doing layer 3 processing, and this often requires + * to translate the format back and forth. + * To make the process explicit, we define a couple of macros + * that also take into account the fact that at some point + * we may want to keep those fields always in net format. + */ + +#if (BYTE_ORDER == BIG_ENDIAN) || defined(HAVE_NET_IPLEN) +#define SET_NET_IPLEN(p) do {} while (0) +#define SET_HOST_IPLEN(p) do {} while (0) +#else +#define SET_NET_IPLEN(p) do { \ + struct ip *h_ip = (p); \ + h_ip->ip_len = htons(h_ip->ip_len); \ + h_ip->ip_off = htons(h_ip->ip_off); \ + } while (0) + +#define SET_HOST_IPLEN(p) do { \ + struct ip *h_ip = (p); \ + h_ip->ip_len = ntohs(h_ip->ip_len); \ + h_ip->ip_off = ntohs(h_ip->ip_off); \ + } while (0) +#endif /* !HAVE_NET_IPLEN */ + #endif /* _KERNEL */ /* INET6 stuff */ diff --git a/sys/netinet/in_mcast.c b/sys/netinet/in_mcast.c index 2ef6d3a4e571..1f658da6d838 100644 --- a/sys/netinet/in_mcast.c +++ b/sys/netinet/in_mcast.c @@ -1967,7 +1967,7 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt) imf = &imo->imo_mfilters[idx]; if (ssa->ss.ss_family != AF_UNSPEC) { /* - * MCAST_JOIN_SOURCE on an exclusive membership + * MCAST_JOIN_SOURCE_GROUP on an exclusive membership * is an error. On an existing inclusive membership, * it just adds the source to the filter list. */ diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 7a4ac10ad633..204d90453bd9 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -552,6 +552,13 @@ in_pcbladdr(struct inpcb *inp, struct in_addr *faddr, struct in_addr *laddr, KASSERT(laddr != NULL, ("%s: laddr NULL", __func__)); + /* + * Bypass source address selection and use the primary jail IP + * if requested. + */ + if (cred != NULL && !prison_saddrsel_ip4(cred, laddr)) + return (0); + error = 0; bzero(&sro, sizeof(sro)); diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c index 2bc6ca9632e8..d9cab845aee4 100644 --- a/sys/netinet/in_proto.c +++ b/sys/netinet/in_proto.c @@ -114,6 +114,9 @@ struct protosw inetsw[] = { .pr_domain = &inetdomain, .pr_protocol = IPPROTO_IP, .pr_init = ip_init, +#ifdef VIMAGE + .pr_destroy = ip_destroy, +#endif .pr_slowtimo = ip_slowtimo, .pr_drain = ip_drain, .pr_usrreqs = &nousrreqs diff --git a/sys/netinet/ip.h b/sys/netinet/ip.h index daee533ee681..4fab5cdf20dc 100644 --- a/sys/netinet/ip.h +++ b/sys/netinet/ip.h @@ -48,11 +48,11 @@ */ struct ip { #if BYTE_ORDER == LITTLE_ENDIAN - u_int ip_hl:4, /* header length */ + u_char ip_hl:4, /* header length */ ip_v:4; /* version */ #endif #if BYTE_ORDER == BIG_ENDIAN - u_int ip_v:4, /* version */ + u_char ip_v:4, /* version */ ip_hl:4; /* header length */ #endif u_char ip_tos; /* type of service */ @@ -142,11 +142,11 @@ struct ip_timestamp { u_char ipt_len; /* size of structure (variable) */ u_char ipt_ptr; /* index of current entry */ #if BYTE_ORDER == LITTLE_ENDIAN - u_int ipt_flg:4, /* flags, see below */ + u_char ipt_flg:4, /* flags, see below */ ipt_oflw:4; /* overflow counter */ #endif #if BYTE_ORDER == BIG_ENDIAN - u_int ipt_oflw:4, /* overflow counter */ + u_char ipt_oflw:4, /* overflow counter */ ipt_flg:4; /* flags, see below */ #endif union ipt_timestamp { diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c index e3ffe5a4a6d7..433c0f03dd54 100644 --- a/sys/netinet/ip_carp.c +++ b/sys/netinet/ip_carp.c @@ -550,7 +550,7 @@ carp_input(struct mbuf *m, int hlen) /* check if received on a valid carp interface */ if (m->m_pkthdr.rcvif->if_carp == NULL) { CARPSTATS_INC(carps_badif); - CARP_LOG("carp_input: packet received on non-carp " + CARP_DEBUG("carp_input: packet received on non-carp " "interface: %s\n", m->m_pkthdr.rcvif->if_xname); m_freem(m); @@ -560,7 +560,7 @@ carp_input(struct mbuf *m, int hlen) /* verify that the IP TTL is 255. */ if (ip->ip_ttl != CARP_DFLTTL) { CARPSTATS_INC(carps_badttl); - CARP_LOG("carp_input: received ttl %d != 255i on %s\n", + CARP_DEBUG("carp_input: received ttl %d != 255 on %s\n", ip->ip_ttl, m->m_pkthdr.rcvif->if_xname); m_freem(m); @@ -571,7 +571,7 @@ carp_input(struct mbuf *m, int hlen) if (m->m_pkthdr.len < iplen + sizeof(*ch)) { CARPSTATS_INC(carps_badlen); - CARP_LOG("carp_input: received len %zd < " + CARP_DEBUG("carp_input: received len %zd < " "sizeof(struct carp_header) on %s\n", m->m_len - sizeof(struct ip), m->m_pkthdr.rcvif->if_xname); @@ -582,7 +582,7 @@ carp_input(struct mbuf *m, int hlen) if (iplen + sizeof(*ch) < m->m_len) { if ((m = m_pullup(m, iplen + sizeof(*ch))) == NULL) { CARPSTATS_INC(carps_hdrops); - CARP_LOG("carp_input: pullup failed\n"); + CARP_DEBUG("carp_input: pullup failed\n"); return; } ip = mtod(m, struct ip *); @@ -596,7 +596,7 @@ carp_input(struct mbuf *m, int hlen) len = iplen + sizeof(*ch); if (len > m->m_pkthdr.len) { CARPSTATS_INC(carps_badlen); - CARP_LOG("carp_input: packet too short %d on %s\n", + CARP_DEBUG("carp_input: packet too short %d on %s\n", m->m_pkthdr.len, m->m_pkthdr.rcvif->if_xname); m_freem(m); @@ -614,7 +614,7 @@ carp_input(struct mbuf *m, int hlen) m->m_data += iplen; if (carp_cksum(m, len - iplen)) { CARPSTATS_INC(carps_badsum); - CARP_LOG("carp_input: checksum failed on %s\n", + CARP_DEBUG("carp_input: checksum failed on %s\n", m->m_pkthdr.rcvif->if_xname); m_freem(m); return; @@ -643,7 +643,7 @@ carp6_input(struct mbuf **mp, int *offp, int proto) /* check if received on a valid carp interface */ if (m->m_pkthdr.rcvif->if_carp == NULL) { CARPSTATS_INC(carps_badif); - CARP_LOG("carp6_input: packet received on non-carp " + CARP_DEBUG("carp6_input: packet received on non-carp " "interface: %s\n", m->m_pkthdr.rcvif->if_xname); m_freem(m); @@ -653,7 +653,7 @@ carp6_input(struct mbuf **mp, int *offp, int proto) /* verify that the IP TTL is 255 */ if (ip6->ip6_hlim != CARP_DFLTTL) { CARPSTATS_INC(carps_badttl); - CARP_LOG("carp6_input: received ttl %d != 255 on %s\n", + CARP_DEBUG("carp6_input: received ttl %d != 255 on %s\n", ip6->ip6_hlim, m->m_pkthdr.rcvif->if_xname); m_freem(m); @@ -665,7 +665,7 @@ carp6_input(struct mbuf **mp, int *offp, int proto) IP6_EXTHDR_GET(ch, struct carp_header *, m, *offp, sizeof(*ch)); if (ch == NULL) { CARPSTATS_INC(carps_badlen); - CARP_LOG("carp6_input: packet size %u too small\n", len); + CARP_DEBUG("carp6_input: packet size %u too small\n", len); return (IPPROTO_DONE); } @@ -674,7 +674,7 @@ carp6_input(struct mbuf **mp, int *offp, int proto) m->m_data += *offp; if (carp_cksum(m, sizeof(*ch))) { CARPSTATS_INC(carps_badsum); - CARP_LOG("carp6_input: checksum failed, on %s\n", + CARP_DEBUG("carp6_input: checksum failed, on %s\n", m->m_pkthdr.rcvif->if_xname); m_freem(m); return (IPPROTO_DONE); @@ -727,7 +727,7 @@ carp_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af) CARPSTATS_INC(carps_badver); SC2IFP(sc)->if_ierrors++; CARP_UNLOCK(ifp->if_carp); - CARP_LOG("%s; invalid version %d\n", + CARP_DEBUG("%s; invalid version %d\n", SC2IFP(sc)->if_xname, ch->carp_version); m_freem(m); @@ -739,7 +739,7 @@ carp_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af) CARPSTATS_INC(carps_badauth); SC2IFP(sc)->if_ierrors++; CARP_UNLOCK(ifp->if_carp); - CARP_LOG("%s: incorrect hash\n", SC2IFP(sc)->if_xname); + CARP_DEBUG("%s: incorrect hash\n", SC2IFP(sc)->if_xname); m_freem(m); return; } @@ -772,7 +772,7 @@ carp_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af) if (timevalcmp(&sc_tv, &ch_tv, >) || timevalcmp(&sc_tv, &ch_tv, ==)) { callout_stop(&sc->sc_ad_tmo); - CARP_DEBUG("%s: MASTER -> BACKUP " + CARP_LOG("%s: MASTER -> BACKUP " "(more frequent advertisement received)\n", SC2IFP(sc)->if_xname); carp_set_state(sc, BACKUP); @@ -787,7 +787,7 @@ carp_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af) */ if (carp_opts[CARPCTL_PREEMPT] && timevalcmp(&sc_tv, &ch_tv, <)) { - CARP_DEBUG("%s: BACKUP -> MASTER " + CARP_LOG("%s: BACKUP -> MASTER " "(preempting a slower master)\n", SC2IFP(sc)->if_xname); carp_master_down_locked(sc); @@ -801,7 +801,7 @@ carp_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af) */ sc_tv.tv_sec = sc->sc_advbase * 3; if (timevalcmp(&sc_tv, &ch_tv, <)) { - CARP_DEBUG("%s: BACKUP -> MASTER " + CARP_LOG("%s: BACKUP -> MASTER " "(master timed out)\n", SC2IFP(sc)->if_xname); carp_master_down_locked(sc); @@ -1024,7 +1024,7 @@ carp_send_ad_locked(struct carp_softc *sc) if (in6_setscope(&ip6->ip6_dst, sc->sc_carpdev, NULL) != 0) { SC2IFP(sc)->if_oerrors++; m_freem(m); - CARP_LOG("%s: in6_setscope failed\n", __func__); + CARP_DEBUG("%s: in6_setscope failed\n", __func__); return; } @@ -1385,12 +1385,12 @@ carp_setrun(struct carp_softc *sc, sa_family_t af) #ifdef INET6 carp_send_na(sc); #endif /* INET6 */ - CARP_DEBUG("%s: INIT -> MASTER (preempting)\n", + CARP_LOG("%s: INIT -> MASTER (preempting)\n", SC2IFP(sc)->if_xname); carp_set_state(sc, MASTER); carp_setroute(sc, RTM_ADD); } else { - CARP_DEBUG("%s: INIT -> BACKUP\n", SC2IFP(sc)->if_xname); + CARP_LOG("%s: INIT -> BACKUP\n", SC2IFP(sc)->if_xname); carp_set_state(sc, BACKUP); carp_setroute(sc, RTM_DELETE); carp_setrun(sc, 0); diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index 401c0908de51..225dd467e1ab 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -32,14 +32,10 @@ __FBSDID("$FreeBSD$"); #if !defined(KLD_MODULE) #include "opt_inet.h" -#include "opt_ipfw.h" #include "opt_sctp.h" #ifndef INET #error "IPDIVERT requires INET." #endif -#ifndef IPFIREWALL -#error "IPDIVERT requires IPFIREWALL" -#endif #endif #include @@ -52,29 +48,20 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include #include #include -#include #include -#include - -#include +#include #include #include -#include -#include #include #include #include #include #include -#include #include -#include #ifdef SCTP #include #endif @@ -92,27 +79,29 @@ __FBSDID("$FreeBSD$"); #define DIVRCVQ (65536 + 100) /* - * Divert sockets work in conjunction with ipfw, see the divert(4) - * manpage for features. - * Internally, packets selected by ipfw in ip_input() or ip_output(), - * and never diverted before, are passed to the input queue of the - * divert socket with a given 'divert_port' number (as specified in - * the matching ipfw rule), and they are tagged with a 16 bit cookie - * (representing the rule number of the matching ipfw rule), which - * is passed to process reading from the socket. + * Divert sockets work in conjunction with ipfw or other packet filters, + * see the divert(4) manpage for features. + * Packets are selected by the packet filter and tagged with an + * MTAG_IPFW_RULE tag carrying the 'divert port' number (as set by + * the packet filter) and information on the matching filter rule for + * subsequent reinjection. The divert_port is used to put the packet + * on the corresponding divert socket, while the rule number is passed + * up (at least partially) as the sin_port in the struct sockaddr. * - * Packets written to the divert socket are again tagged with a cookie - * (usually the same as above) and a destination address. - * If the destination address is INADDR_ANY then the packet is - * treated as outgoing and sent to ip_output(), otherwise it is - * treated as incoming and sent to ip_input(). - * In both cases, the packet is tagged with the cookie. + * Packets written to the divert socket carry in sin_addr a + * destination address, and in sin_port the number of the filter rule + * after which to continue processing. + * If the destination address is INADDR_ANY, the packet is treated as + * as outgoing and sent to ip_output(); otherwise it is treated as + * incoming and sent to ip_input(). + * Further, sin_zero carries some information on the interface, + * which can be used in the reinject -- see comments in the code. * * On reinjection, processing in ip_input() and ip_output() * will be exactly the same as for the original packet, except that - * ipfw processing will start at the rule number after the one - * written in the cookie (so, tagging a packet with a cookie of 0 - * will cause it to be effectively considered as a standard packet). + * packet filter processing will start at the rule number after the one + * written in the sin_port (ipfw does not allow a rule #0, so sin_port=0 + * will apply the entire ruleset to the packet). */ /* Internal variables. */ @@ -193,7 +182,7 @@ div_destroy(void) * IPPROTO_DIVERT is not in the real IP protocol number space; this * function should never be called. Just in case, drop any packets. */ -void +static void div_input(struct mbuf *m, int off) { @@ -217,9 +206,8 @@ divert_packet(struct mbuf *m, int incoming) struct sockaddr_in divsrc; struct m_tag *mtag; - mtag = m_tag_find(m, PACKET_TAG_DIVERT, NULL); + mtag = m_tag_locate(m, MTAG_IPFW_RULE, 0, NULL); if (mtag == NULL) { - printf("%s: no divert tag\n", __func__); m_freem(m); return; } @@ -244,14 +232,15 @@ divert_packet(struct mbuf *m, int incoming) ip->ip_len = htons(ip->ip_len); } #endif + bzero(&divsrc, sizeof(divsrc)); + divsrc.sin_len = sizeof(divsrc); + divsrc.sin_family = AF_INET; + /* record matching rule, in host format */ + divsrc.sin_port = ((struct ipfw_rule_ref *)(mtag+1))->rulenum; /* * Record receive interface address, if any. * But only for incoming packets. */ - bzero(&divsrc, sizeof(divsrc)); - divsrc.sin_len = sizeof(divsrc); - divsrc.sin_family = AF_INET; - divsrc.sin_port = divert_cookie(mtag); /* record matching rule */ if (incoming) { struct ifaddr *ifa; struct ifnet *ifp; @@ -299,7 +288,7 @@ divert_packet(struct mbuf *m, int incoming) /* Put packet on socket queue, if any */ sa = NULL; - nport = htons((u_int16_t)divert_info(mtag)); + nport = htons((u_int16_t)(((struct ipfw_rule_ref *)(mtag+1))->info)); INP_INFO_RLOCK(&V_divcbinfo); LIST_FOREACH(inp, &V_divcb, inp_list) { /* XXX why does only one socket match? */ @@ -338,7 +327,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin, struct mbuf *control) { struct m_tag *mtag; - struct divert_tag *dt; + struct ipfw_rule_ref *dt; int error = 0; struct mbuf *options; @@ -353,23 +342,31 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin, if (control) m_freem(control); /* XXX */ - if ((mtag = m_tag_find(m, PACKET_TAG_DIVERT, NULL)) == NULL) { - mtag = m_tag_get(PACKET_TAG_DIVERT, sizeof(struct divert_tag), - M_NOWAIT | M_ZERO); + mtag = m_tag_locate(m, MTAG_IPFW_RULE, 0, NULL); + if (mtag == NULL) { + /* this should be normal */ + mtag = m_tag_alloc(MTAG_IPFW_RULE, 0, + sizeof(struct ipfw_rule_ref), M_NOWAIT | M_ZERO); if (mtag == NULL) { error = ENOBUFS; goto cantsend; } - dt = (struct divert_tag *)(mtag+1); m_tag_prepend(m, mtag); - } else - dt = (struct divert_tag *)(mtag+1); + } + dt = (struct ipfw_rule_ref *)(mtag+1); /* Loopback avoidance and state recovery */ if (sin) { int i; - dt->cookie = sin->sin_port; + /* set the starting point. We provide a non-zero slot, + * but a non_matching chain_id to skip that info and use + * the rulenum/rule_id. + */ + dt->slot = 1; /* dummy, chain_id is invalid */ + dt->chain_id = 0; + dt->rulenum = sin->sin_port+1; /* host format ? */ + dt->rule_id = 0; /* * Find receive interface with the given name, stuffed * (if it exists) in the sin_zero[] field. @@ -387,7 +384,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin, struct ip *const ip = mtod(m, struct ip *); struct inpcb *inp; - dt->info |= IP_FW_DIVERT_OUTPUT_FLAG; + dt->info |= IPFW_IS_DIVERT | IPFW_INFO_OUT; INP_INFO_WLOCK(&V_divcbinfo); inp = sotoinpcb(so); INP_RLOCK(inp); @@ -453,7 +450,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin, m_freem(options); } } else { - dt->info |= IP_FW_DIVERT_LOOPBACK_FLAG; + dt->info |= IPFW_IS_DIVERT | IPFW_INFO_IN; if (m->m_pkthdr.rcvif == NULL) { /* * No luck with the name, check by IP address. @@ -587,7 +584,7 @@ div_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, return div_output(so, m, (struct sockaddr_in *)nam, control); } -void +static void div_ctlinput(int cmd, struct sockaddr *sa, void *vip) { struct in_addr faddr; @@ -800,5 +797,5 @@ static moduledata_t ipdivertmod = { }; DECLARE_MODULE(ipdivert, ipdivertmod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); -MODULE_DEPEND(dummynet, ipfw, 2, 2, 2); +MODULE_DEPEND(ipdivert, ipfw, 2, 2, 2); MODULE_VERSION(ipdivert, 1); diff --git a/sys/netinet/ip_divert.h b/sys/netinet/ip_divert.h index 503635549825..b8bcf4fb675f 100644 --- a/sys/netinet/ip_divert.h +++ b/sys/netinet/ip_divert.h @@ -36,53 +36,20 @@ #define _NETINET_IP_DIVERT_H_ /* - * Sysctl declaration. + * divert has no custom kernel-userland API. + * + * All communication occurs through a sockaddr_in socket where + * + * kernel-->userland + * sin_port = matching rule, host format; + * sin_addr = IN: first address of the incoming interface; + * OUT: INADDR_ANY + * sin_zero = if fits, the interface name (max 7 bytes + NUL) + * + * userland->kernel + * sin_port = restart-rule - 1, host order + * (we restart at sin_port + 1) + * sin_addr = IN: address of the incoming interface; + * OUT: INADDR_ANY */ -#ifdef SYSCTL_DECL -SYSCTL_DECL(_net_inet_divert); -#endif - -/* - * Divert socket definitions. - */ -struct divert_tag { - u_int32_t info; /* port & flags */ - u_int16_t cookie; /* ipfw rule number */ -}; - -/* - * Return the divert cookie associated with the mbuf; if any. - */ -static __inline u_int16_t -divert_cookie(struct m_tag *mtag) -{ - return ((struct divert_tag *)(mtag+1))->cookie; -} -static __inline u_int16_t -divert_find_cookie(struct mbuf *m) -{ - struct m_tag *mtag = m_tag_find(m, PACKET_TAG_DIVERT, NULL); - return mtag ? divert_cookie(mtag) : 0; -} - -/* - * Return the divert info associated with the mbuf; if any. - */ -static __inline u_int32_t -divert_info(struct m_tag *mtag) -{ - return ((struct divert_tag *)(mtag+1))->info; -} -static __inline u_int32_t -divert_find_info(struct mbuf *m) -{ - struct m_tag *mtag = m_tag_find(m, PACKET_TAG_DIVERT, NULL); - return mtag ? divert_info(mtag) : 0; -} - -typedef void ip_divert_packet_t(struct mbuf *m, int incoming); -extern ip_divert_packet_t *ip_divert_ptr; - -extern void div_input(struct mbuf *, int); -extern void div_ctlinput(int, struct sockaddr *, void *); #endif /* _NETINET_IP_DIVERT_H_ */ diff --git a/sys/netinet/ip_dummynet.h b/sys/netinet/ip_dummynet.h index b5ef19e49a61..3a193e99c0c5 100644 --- a/sys/netinet/ip_dummynet.h +++ b/sys/netinet/ip_dummynet.h @@ -110,20 +110,15 @@ struct dn_heap { * them that carries their dummynet state. This is used within * the dummynet code as well as outside when checking for special * processing requirements. + * Note that the first part is the reinject info and is common to + * other forms of packet reinjection. */ struct dn_pkt_tag { - struct ip_fw *rule; /* matching rule */ - uint32_t rule_id; /* matching rule id */ - uint32_t chain_id; /* ruleset id */ + struct ipfw_rule_ref rule; /* matching rule */ + + /* second part, dummynet specific */ int dn_dir; /* action when packet comes out. */ -#define DN_TO_IP_OUT 1 -#define DN_TO_IP_IN 2 -/* Obsolete: #define DN_TO_BDG_FWD 3 */ -#define DN_TO_ETH_DEMUX 4 -#define DN_TO_ETH_OUT 5 -#define DN_TO_IP6_IN 6 -#define DN_TO_IP6_OUT 7 -#define DN_TO_IFB_FWD 8 + /* see ip_fw_private.h */ dn_key output_time; /* when the pkt is due for delivery */ struct ifnet *ifp; /* interface, for ip_output */ @@ -376,21 +371,4 @@ struct dn_pipe_max { SLIST_HEAD(dn_pipe_head, dn_pipe); -#ifdef _KERNEL - -/* - * Return the dummynet tag; if any. - * Make sure that the dummynet tag is not reused by lower layers. - */ -static __inline struct dn_pkt_tag * -ip_dn_claim_tag(struct mbuf *m) -{ - struct m_tag *mtag = m_tag_find(m, PACKET_TAG_DUMMYNET, NULL); - if (mtag != NULL) { - mtag->m_tag_id = PACKET_TAG_NONE; - return ((struct dn_pkt_tag *)(mtag + 1)); - } else - return (NULL); -} -#endif #endif /* _IP_DUMMYNET_H */ diff --git a/sys/netinet/ip_encap.c b/sys/netinet/ip_encap.c index 0efd22aaf0d9..ce1319d447ef 100644 --- a/sys/netinet/ip_encap.c +++ b/sys/netinet/ip_encap.c @@ -103,7 +103,7 @@ static void encap_fillarg(struct mbuf *, const struct encaptab *); */ static struct mtx encapmtx; MTX_SYSINIT(encapmtx, &encapmtx, "encapmtx", MTX_DEF); -LIST_HEAD(, encaptab) encaptab = LIST_HEAD_INITIALIZER(&encaptab); +LIST_HEAD(, encaptab) encaptab = LIST_HEAD_INITIALIZER(encaptab); /* * We currently keey encap_init() for source code compatibility reasons -- diff --git a/sys/netinet/ip_fastfwd.c b/sys/netinet/ip_fastfwd.c index 78b6d3046e2d..03993930f033 100644 --- a/sys/netinet/ip_fastfwd.c +++ b/sys/netinet/ip_fastfwd.c @@ -351,10 +351,11 @@ ip_fastforward(struct mbuf *m) /* * Run through list of ipfilter hooks for input packets */ - if (!PFIL_HOOKED(&inet_pfil_hook)) + if (!PFIL_HOOKED(&V_inet_pfil_hook)) goto passin; - if (pfil_run_hooks(&inet_pfil_hook, &m, m->m_pkthdr.rcvif, PFIL_IN, NULL) || + if (pfil_run_hooks( + &V_inet_pfil_hook, &m, m->m_pkthdr.rcvif, PFIL_IN, NULL) || m == NULL) goto drop; @@ -438,10 +439,10 @@ passin: /* * Run through list of hooks for output packets. */ - if (!PFIL_HOOKED(&inet_pfil_hook)) + if (!PFIL_HOOKED(&V_inet_pfil_hook)) goto passout; - if (pfil_run_hooks(&inet_pfil_hook, &m, ifp, PFIL_OUT, NULL) || m == NULL) { + if (pfil_run_hooks(&V_inet_pfil_hook, &m, ifp, PFIL_OUT, NULL) || m == NULL) { goto drop; } diff --git a/sys/netinet/ip_fw.h b/sys/netinet/ip_fw.h index 9967a29607b0..21a79ecdec36 100644 --- a/sys/netinet/ip_fw.h +++ b/sys/netinet/ip_fw.h @@ -237,7 +237,7 @@ enum ipfw_opcodes { /* arguments (4 byte each) */ * */ typedef struct _ipfw_insn { /* template for instructions */ - enum ipfw_opcodes opcode:8; + u_int8_t opcode; u_int8_t len; /* number of 32-bit words */ #define F_NOT 0x80 #define F_OR 0x40 @@ -461,7 +461,7 @@ typedef struct _ipfw_insn_icmp6 { */ struct ip_fw { - struct ip_fw *next; /* linked list of rules */ + struct ip_fw *x_next; /* linked list of rules */ struct ip_fw *next_rule; /* ptr to next [skipto] rule */ /* 'next_rule' is used to pass up 'set_disable' status */ @@ -571,133 +571,4 @@ typedef struct _ipfw_table { ipfw_table_entry ent[0]; /* entries */ } ipfw_table; -/* - * Main firewall chains definitions and global var's definitions. - */ -#ifdef _KERNEL - -#define MTAG_IPFW 1148380143 /* IPFW-tagged cookie */ - -/* Return values from ipfw_chk() */ -enum { - IP_FW_PASS = 0, - IP_FW_DENY, - IP_FW_DIVERT, - IP_FW_TEE, - IP_FW_DUMMYNET, - IP_FW_NETGRAPH, - IP_FW_NGTEE, - IP_FW_NAT, - IP_FW_REASS, -}; - -/* flags for divert mtag */ -#define IP_FW_DIVERT_LOOPBACK_FLAG 0x00080000 -#define IP_FW_DIVERT_OUTPUT_FLAG 0x00100000 - -/* - * Structure for collecting parameters to dummynet for ip6_output forwarding - */ -struct _ip6dn_args { - struct ip6_pktopts *opt_or; - struct route_in6 ro_or; - int flags_or; - struct ip6_moptions *im6o_or; - struct ifnet *origifp_or; - struct ifnet *ifp_or; - struct sockaddr_in6 dst_or; - u_long mtu_or; - struct route_in6 ro_pmtu_or; -}; - -/* - * Arguments for calling ipfw_chk() and dummynet_io(). We put them - * all into a structure because this way it is easier and more - * efficient to pass variables around and extend the interface. - */ -struct ip_fw_args { - struct mbuf *m; /* the mbuf chain */ - struct ifnet *oif; /* output interface */ - struct sockaddr_in *next_hop; /* forward address */ - struct ip_fw *rule; /* matching rule */ - uint32_t rule_id; /* matching rule id */ - uint32_t chain_id; /* ruleset id */ - struct ether_header *eh; /* for bridged packets */ - - struct ipfw_flow_id f_id; /* grabbed from IP header */ - uint32_t cookie; /* a cookie depending on rule action */ - struct inpcb *inp; - - struct _ip6dn_args dummypar; /* dummynet->ip6_output */ - struct sockaddr_in hopstore; /* store here if cannot use a pointer */ -}; - -/* - * Function definitions. - */ - -/* Firewall hooks */ -struct sockopt; -struct dn_flow_set; - -int ipfw_check_in(void *, struct mbuf **, struct ifnet *, int, struct inpcb *inp); -int ipfw_check_out(void *, struct mbuf **, struct ifnet *, int, struct inpcb *inp); - -int ipfw_chk(struct ip_fw_args *); - -int ipfw_hook(void); -int ipfw6_hook(void); -int ipfw_unhook(void); -int ipfw6_unhook(void); -#ifdef NOTYET -void ipfw_nat_destroy(void); -#endif - -VNET_DECLARE(int, fw_one_pass); -VNET_DECLARE(int, fw_enable); -#define V_fw_one_pass VNET(fw_one_pass) -#define V_fw_enable VNET(fw_enable) - -#ifdef INET6 -VNET_DECLARE(int, fw6_enable); -#define V_fw6_enable VNET(fw6_enable) -#endif - -struct ip_fw_chain { - struct ip_fw *rules; /* list of rules */ - struct ip_fw *reap; /* list of rules to reap */ - LIST_HEAD(, cfg_nat) nat; /* list of nat entries */ - struct radix_node_head *tables[IPFW_TABLES_MAX]; - struct rwlock rwmtx; - uint32_t id; /* ruleset id */ -}; - -#ifdef IPFW_INTERNAL - -#define IPFW_LOCK_INIT(_chain) \ - rw_init(&(_chain)->rwmtx, "IPFW static rules") -#define IPFW_LOCK_DESTROY(_chain) rw_destroy(&(_chain)->rwmtx) -#define IPFW_WLOCK_ASSERT(_chain) rw_assert(&(_chain)->rwmtx, RA_WLOCKED) - -#define IPFW_RLOCK(p) rw_rlock(&(p)->rwmtx) -#define IPFW_RUNLOCK(p) rw_runlock(&(p)->rwmtx) -#define IPFW_WLOCK(p) rw_wlock(&(p)->rwmtx) -#define IPFW_WUNLOCK(p) rw_wunlock(&(p)->rwmtx) - -#define LOOKUP_NAT(l, i, p) do { \ - LIST_FOREACH((p), &(l.nat), _next) { \ - if ((p)->id == (i)) { \ - break; \ - } \ - } \ - } while (0) - -typedef int ipfw_nat_t(struct ip_fw_args *, struct cfg_nat *, struct mbuf *); -typedef int ipfw_nat_cfg_t(struct sockopt *); -#endif - -VNET_DECLARE(struct ip_fw_chain, layer3_chain); -#define V_layer3_chain VNET(layer3_chain) - -#endif /* _KERNEL */ #endif /* _IPFW2_H */ diff --git a/sys/netinet/ip_gre.c b/sys/netinet/ip_gre.c index 218cc6e38cfb..ae85e9f0ad4e 100644 --- a/sys/netinet/ip_gre.c +++ b/sys/netinet/ip_gre.c @@ -17,13 +17,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/netinet/ip_gre.h b/sys/netinet/ip_gre.h index 1fb67d93b9ce..d2f3866ab97e 100644 --- a/sys/netinet/ip_gre.h +++ b/sys/netinet/ip_gre.h @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/sys/netinet/ip_icmp.c b/sys/netinet/ip_icmp.c index fcb9ca6ceaa2..b13bc7ca8277 100644 --- a/sys/netinet/ip_icmp.c +++ b/sys/netinet/ip_icmp.c @@ -367,7 +367,7 @@ icmp_input(struct mbuf *m, int off) goto freeit; } i = hlen + min(icmplen, ICMP_ADVLENMIN); - if (m->m_len < i && (m = m_pullup(m, i)) == 0) { + if (m->m_len < i && (m = m_pullup(m, i)) == NULL) { ICMPSTAT_INC(icps_tooshort); return; } diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index 7886fa737163..084bac069559 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -170,7 +170,7 @@ SYSCTL_VNET_INT(_net_inet_ip, OID_AUTO, check_interface, CTLFLAG_RW, &VNET_NAME(ip_checkinterface), 0, "Verify packet arrives on correct interface"); -struct pfil_head inet_pfil_hook; /* Packet filter hooks */ +VNET_DEFINE(struct pfil_head, inet_pfil_hook); /* Packet filter hooks */ static struct netisr_handler ip_nh = { .nh_name = "ip", @@ -199,6 +199,7 @@ static struct mtx ipqlock; static void maxnipq_update(void); static void ipq_zone_change(void *); +static void ip_drain_locked(void); SYSCTL_VNET_INT(_net_inet_ip, OID_AUTO, fragpackets, CTLFLAG_RD, &VNET_NAME(nipq), 0, @@ -318,6 +319,13 @@ ip_init(void) NULL, UMA_ALIGN_PTR, 0); maxnipq_update(); + /* Initialize packet filter hooks. */ + V_inet_pfil_hook.ph_type = PFIL_TYPE_AF; + V_inet_pfil_hook.ph_af = AF_INET; + if ((i = pfil_head_register(&V_inet_pfil_hook)) != 0) + printf("%s: WARNING: unable to register pfil hook, " + "error %d\n", __func__, i); + #ifdef FLOWTABLE TUNABLE_INT_FETCH("net.inet.ip.output_flowtable_size", &V_ip_output_flowtable_size); @@ -348,13 +356,6 @@ ip_init(void) ip_protox[pr->pr_protocol] = pr - inetsw; } - /* Initialize packet filter hooks. */ - inet_pfil_hook.ph_type = PFIL_TYPE_AF; - inet_pfil_hook.ph_af = AF_INET; - if ((i = pfil_head_register(&inet_pfil_hook)) != 0) - printf("%s: WARNING: unable to register pfil hook, " - "error %d\n", __func__, i); - /* Start ipport_tick. */ callout_init(&ipport_tick_callout, CALLOUT_MPSAFE); callout_reset(&ipport_tick_callout, 1, ipport_tick, NULL); @@ -368,6 +369,22 @@ ip_init(void) netisr_register(&ip_nh); } +#ifdef VIMAGE +void +ip_destroy(void) +{ + + /* Cleanup in_ifaddr hash table; should be empty. */ + hashdestroy(V_in_ifaddrhashtbl, M_IFADDR, V_in_ifaddrhmask); + + IPQ_LOCK(); + ip_drain_locked(); + IPQ_UNLOCK(); + + uma_zdestroy(V_ipq_zone); +} +#endif + void ip_fini(void *xtp) { @@ -510,11 +527,11 @@ tooshort: */ /* Jump over all PFIL processing if hooks are not active. */ - if (!PFIL_HOOKED(&inet_pfil_hook)) + if (!PFIL_HOOKED(&V_inet_pfil_hook)) goto passin; odst = ip->ip_dst; - if (pfil_run_hooks(&inet_pfil_hook, &m, ifp, PFIL_IN, NULL) != 0) + if (pfil_run_hooks(&V_inet_pfil_hook, &m, ifp, PFIL_IN, NULL) != 0) return; if (m == NULL) /* consumed by filter */ return; @@ -530,9 +547,9 @@ tooshort: } if ((dchg = (m_tag_find(m, PACKET_TAG_IPFORWARD, NULL) != NULL)) != 0) { /* - * Directly ship on the packet. This allows to forward packets - * that were destined for us to some other directly connected - * host. + * Directly ship the packet on. This allows forwarding + * packets originally destined to us to some other directly + * connected host. */ ip_forward(m, dchg); return; @@ -1237,23 +1254,32 @@ ip_slowtimo(void) /* * Drain off all datagram fragments. */ +static void +ip_drain_locked(void) +{ + int i; + + IPQ_LOCK_ASSERT(); + + for (i = 0; i < IPREASS_NHASH; i++) { + while(!TAILQ_EMPTY(&V_ipq[i])) { + IPSTAT_ADD(ips_fragdropped, + TAILQ_FIRST(&V_ipq[i])->ipq_nfrags); + ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i])); + } + } +} + void ip_drain(void) { VNET_ITERATOR_DECL(vnet_iter); - int i; VNET_LIST_RLOCK_NOSLEEP(); IPQ_LOCK(); VNET_FOREACH(vnet_iter) { CURVNET_SET(vnet_iter); - for (i = 0; i < IPREASS_NHASH; i++) { - while(!TAILQ_EMPTY(&V_ipq[i])) { - IPSTAT_ADD(ips_fragdropped, - TAILQ_FIRST(&V_ipq[i])->ipq_nfrags); - ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i])); - } - } + ip_drain_locked(); CURVNET_RESTORE(); } IPQ_UNLOCK(); diff --git a/sys/netinet/ip_ipsec.c b/sys/netinet/ip_ipsec.c index 0eb4673a0387..b49b620f3976 100644 --- a/sys/netinet/ip_ipsec.c +++ b/sys/netinet/ip_ipsec.c @@ -260,8 +260,7 @@ ip_ipsec_mtu(struct mbuf *m, int mtu) * -1 = packet was reinjected and stop processing packet */ int -ip_ipsec_output(struct mbuf **m, struct inpcb *inp, int *flags, int *error, - struct ifnet **ifp) +ip_ipsec_output(struct mbuf **m, struct inpcb *inp, int *flags, int *error) { #ifdef IPSEC struct secpolicy *sp = NULL; @@ -390,20 +389,6 @@ ip_ipsec_output(struct mbuf **m, struct inpcb *inp, int *flags, int *error, } else { /* No IPsec processing for this packet. */ } -#ifdef notyet - /* - * If deferred crypto processing is needed, check that - * the interface supports it. - */ - mtag = m_tag_find(*m, PACKET_TAG_IPSEC_OUT_CRYPTO_NEEDED, NULL); - if (mtag != NULL && ifp != NULL && - ((*ifp)->if_capenable & IFCAP_IPSEC) == 0) { - /* notify IPsec to do its own crypto */ - ipsp_skipcrypto_unmark((struct tdb_ident *)(mtag + 1)); - *error = EHOSTUNREACH; - goto bad; - } -#endif } done: if (sp != NULL) diff --git a/sys/netinet/ip_ipsec.h b/sys/netinet/ip_ipsec.h index 31bc86a17498..2870c1146eae 100644 --- a/sys/netinet/ip_ipsec.h +++ b/sys/netinet/ip_ipsec.h @@ -36,6 +36,5 @@ int ip_ipsec_filtertunnel(struct mbuf *); int ip_ipsec_fwd(struct mbuf *); int ip_ipsec_input(struct mbuf *); int ip_ipsec_mtu(struct mbuf *, int); -int ip_ipsec_output(struct mbuf **, struct inpcb *, int *, int *, - struct ifnet **); +int ip_ipsec_output(struct mbuf **, struct inpcb *, int *, int *); #endif diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c index f074fea9b0b5..19035d2abb71 100644 --- a/sys/netinet/ip_mroute.c +++ b/sys/netinet/ip_mroute.c @@ -114,8 +114,6 @@ __FBSDID("$FreeBSD$"); #include -#include - #ifndef KTR_IPMF #define KTR_IPMF KTR_INET #endif @@ -1386,6 +1384,15 @@ fail: rt->mfc_rp.s_addr = INADDR_ANY; rt->mfc_bw_meter = NULL; + /* initialize pkt counters per src-grp */ + rt->mfc_pkt_cnt = 0; + rt->mfc_byte_cnt = 0; + rt->mfc_wrong_if = 0; + timevalclear(&rt->mfc_last_assert); + + TAILQ_INIT(&rt->mfc_stall); + rt->mfc_nstall = 0; + /* link into table */ LIST_INSERT_HEAD(&mfchashtbl[hash], rt, mfc_hash); TAILQ_INSERT_HEAD(&rt->mfc_stall, rte, rte_link); diff --git a/sys/netinet/ip_options.c b/sys/netinet/ip_options.c index f95b3a04d35f..50dcff6e452d 100644 --- a/sys/netinet/ip_options.c +++ b/sys/netinet/ip_options.c @@ -65,8 +65,6 @@ __FBSDID("$FreeBSD$"); #include -#include - static int ip_dosourceroute = 0; SYSCTL_INT(_net_inet_ip, IPCTL_SOURCEROUTE, sourceroute, CTLFLAG_RW, &ip_dosourceroute, 0, "Enable forwarding source routed IP packets"); diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index e222cdaaa1fc..d6f361d6e88b 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -84,12 +84,6 @@ __FBSDID("$FreeBSD$"); #include -#define print_ip(x, a, y) printf("%s %d.%d.%d.%d%s",\ - x, (ntohl(a.s_addr)>>24)&0xFF,\ - (ntohl(a.s_addr)>>16)&0xFF,\ - (ntohl(a.s_addr)>>8)&0xFF,\ - (ntohl(a.s_addr))&0xFF, y); - VNET_DEFINE(u_short, ip_id); #ifdef MBUF_STRESS_TEST @@ -108,6 +102,7 @@ extern struct protosw inetsw[]; /* * IP output. The packet in mbuf chain m contains a skeletal IP * header (with len, off, ttl, proto, tos, src, dst). + * ip_len and ip_off are in host format. * The mbuf chain containing the packet will be freed. * The mbuf opt, if present, will not be freed. * In the IP forwarding case, the packet will arrive with options already @@ -122,12 +117,14 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, struct mbuf *m0; int hlen = sizeof (struct ip); int mtu; - int len, error = 0; + int n; /* scratchpad */ + int error = 0; int nortfree = 0; - struct sockaddr_in *dst = NULL; /* keep compiler happy */ + struct sockaddr_in *dst; struct in_ifaddr *ia = NULL; int isbroadcast, sw_csum; struct route iproute; + struct rtentry *rte; /* cache for ro->ro_rt */ struct in_addr odst; #ifdef IPFIREWALL_FORWARD struct m_tag *fwd_tag = NULL; @@ -163,10 +160,10 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, } if (opt) { - len = 0; + int len = 0; m = ip_insertoptions(m, opt, &len); if (len != 0) - hlen = len; + hlen = len; /* ip->ip_hl is updated above */ } ip = mtod(m, struct ip *); @@ -187,6 +184,7 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags, ip->ip_id = ip_newid(); IPSTAT_INC(ips_localout); } else { + /* Header already set, fetch hlen from there */ hlen = ip->ip_hl << 2; } @@ -199,18 +197,19 @@ again: * The address family should also be checked in case of sharing the * cache with IPv6. */ - if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 || + rte = ro->ro_rt; + if (rte && ((rte->rt_flags & RTF_UP) == 0 || dst->sin_family != AF_INET || dst->sin_addr.s_addr != ip->ip_dst.s_addr)) { if (!nortfree) - RTFREE(ro->ro_rt); - ro->ro_rt = (struct rtentry *)NULL; + RTFREE(rte); + rte = ro->ro_rt = (struct rtentry *)NULL; ro->ro_lle = (struct llentry *)NULL; } #ifdef IPFIREWALL_FORWARD - if (ro->ro_rt == NULL && fwd_tag == NULL) { + if (rte == NULL && fwd_tag == NULL) { #else - if (ro->ro_rt == NULL) { + if (rte == NULL) { #endif bzero(dst, sizeof(*dst)); dst->sin_family = AF_INET; @@ -260,7 +259,7 @@ again: * as this is probably required in all cases for correct * operation (as it is for ARP). */ - if (ro->ro_rt == NULL) + if (rte == NULL) { #ifdef RADIX_MPATH rtalloc_mpath_fib(ro, ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr), @@ -269,7 +268,9 @@ again: in_rtalloc_ign(ro, 0, inp ? inp->inp_inc.inc_fibnum : M_GETFIB(m)); #endif - if (ro->ro_rt == NULL) { + rte = ro->ro_rt; + } + if (rte == NULL) { #ifdef IPSEC /* * There is no route for this packet, but it is @@ -283,14 +284,14 @@ again: error = EHOSTUNREACH; goto bad; } - ia = ifatoia(ro->ro_rt->rt_ifa); + ia = ifatoia(rte->rt_ifa); ifa_ref(&ia->ia_ifa); - ifp = ro->ro_rt->rt_ifp; - ro->ro_rt->rt_rmx.rmx_pksent++; - if (ro->ro_rt->rt_flags & RTF_GATEWAY) - dst = (struct sockaddr_in *)ro->ro_rt->rt_gateway; - if (ro->ro_rt->rt_flags & RTF_HOST) - isbroadcast = (ro->ro_rt->rt_flags & RTF_BROADCAST); + ifp = rte->rt_ifp; + rte->rt_rmx.rmx_pksent++; + if (rte->rt_flags & RTF_GATEWAY) + dst = (struct sockaddr_in *)rte->rt_gateway; + if (rte->rt_flags & RTF_HOST) + isbroadcast = (rte->rt_flags & RTF_BROADCAST); else isbroadcast = in_broadcast(dst->sin_addr, ifp); } @@ -298,7 +299,7 @@ again: * Calculate MTU. If we have a route that is up, use that, * otherwise use the interface's MTU. */ - if (ro->ro_rt != NULL && (ro->ro_rt->rt_flags & (RTF_UP|RTF_HOST))) { + if (rte != NULL && (rte->rt_flags & (RTF_UP|RTF_HOST))) { /* * This case can happen if the user changed the MTU * of an interface after enabling IP on it. Because @@ -306,9 +307,9 @@ again: * them, there is no way for one to update all its * routes when the MTU is changed. */ - if (ro->ro_rt->rt_rmx.rmx_mtu > ifp->if_mtu) - ro->ro_rt->rt_rmx.rmx_mtu = ifp->if_mtu; - mtu = ro->ro_rt->rt_rmx.rmx_mtu; + if (rte->rt_rmx.rmx_mtu > ifp->if_mtu) + rte->rt_rmx.rmx_mtu = ifp->if_mtu; + mtu = rte->rt_rmx.rmx_mtu; } else { mtu = ifp->if_mtu; } @@ -425,18 +426,15 @@ again: * packet or packet fragments, unless ALTQ is enabled on the given * interface in which case packetdrop should be done by queueing. */ + n = ip->ip_len / mtu + 1; /* how many fragments ? */ + if ( #ifdef ALTQ - if ((!ALTQ_IS_ENABLED(&ifp->if_snd)) && - ((ifp->if_snd.ifq_len + ip->ip_len / mtu + 1) >= - ifp->if_snd.ifq_maxlen)) -#else - if ((ifp->if_snd.ifq_len + ip->ip_len / mtu + 1) >= - ifp->if_snd.ifq_maxlen) + (!ALTQ_IS_ENABLED(&ifp->if_snd)) && #endif /* ALTQ */ - { + (ifp->if_snd.ifq_len + n) >= ifp->if_snd.ifq_maxlen ) { error = ENOBUFS; IPSTAT_INC(ips_odropped); - ifp->if_snd.ifq_drops += (ip->ip_len / ifp->if_mtu + 1); + ifp->if_snd.ifq_drops += n; goto bad; } @@ -466,7 +464,7 @@ again: sendit: #ifdef IPSEC - switch(ip_ipsec_output(&m, inp, &flags, &error, &ifp)) { + switch(ip_ipsec_output(&m, inp, &flags, &error)) { case 1: goto bad; case -1: @@ -489,12 +487,12 @@ sendit: #endif /* IPSEC */ /* Jump over all PFIL processing if hooks are not active. */ - if (!PFIL_HOOKED(&inet_pfil_hook)) + if (!PFIL_HOOKED(&V_inet_pfil_hook)) goto passout; /* Run through list of hooks for output packets. */ odst.s_addr = ip->ip_dst.s_addr; - error = pfil_run_hooks(&inet_pfil_hook, &m, ifp, PFIL_OUT, inp); + error = pfil_run_hooks(&V_inet_pfil_hook, &m, ifp, PFIL_OUT, inp); if (error != 0 || m == NULL) goto done; diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h index 448ba3d79784..389ad6ee3169 100644 --- a/sys/netinet/ip_var.h +++ b/sys/netinet/ip_var.h @@ -212,6 +212,9 @@ int ip_fragment(struct ip *ip, struct mbuf **m_frag, int mtu, u_long if_hwassist_flags, int sw_csum); void ip_forward(struct mbuf *m, int srcrt); void ip_init(void); +#ifdef VIMAGE +void ip_destroy(void); +#endif extern int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *, struct ip_moptions *); @@ -244,17 +247,64 @@ extern int (*ip_rsvp_vif)(struct socket *, struct sockopt *); extern void (*ip_rsvp_force_done)(struct socket *); extern void (*rsvp_input_p)(struct mbuf *m, int off); -extern struct pfil_head inet_pfil_hook; /* packet filter hooks */ +VNET_DECLARE(struct pfil_head, inet_pfil_hook); /* packet filter hooks */ +#define V_inet_pfil_hook VNET(inet_pfil_hook) void in_delayed_cksum(struct mbuf *m); -/* ipfw and dummynet hooks. Most are declared in raw_ip.c */ +/* Hooks for ipfw, dummynet, divert etc. Most are declared in raw_ip.c */ +/* + * Reference to an ipfw or packet filter rule that can be carried + * outside critical sections. + * A rule is identified by rulenum:rule_id which is ordered. + * In version chain_id the rule can be found in slot 'slot', so + * we don't need a lookup if chain_id == chain->id. + * + * On exit from the firewall this structure refers to the rule after + * the matching one (slot points to the new rule; rulenum:rule_id-1 + * is the matching rule), and additional info (e.g. info often contains + * the insn argument or tablearg in the low 16 bits, in host format). + * On entry, the structure is valid if slot>0, and refers to the starting + * rules. 'info' contains the reason for reinject, e.g. divert port, + * divert direction, and so on. + */ +struct ipfw_rule_ref { + uint32_t slot; /* slot for matching rule */ + uint32_t rulenum; /* matching rule number */ + uint32_t rule_id; /* matching rule id */ + uint32_t chain_id; /* ruleset id */ + uint32_t info; /* see below */ +}; + +enum { + IPFW_INFO_MASK = 0x0000ffff, + IPFW_INFO_OUT = 0x00000000, /* outgoing, just for convenience */ + IPFW_INFO_IN = 0x80000000, /* incoming, overloads dir */ + IPFW_ONEPASS = 0x40000000, /* One-pass, do not reinject */ + IPFW_IS_MASK = 0x30000000, /* which source ? */ + IPFW_IS_DIVERT = 0x20000000, + IPFW_IS_DUMMYNET =0x10000000, + IPFW_IS_PIPE = 0x08000000, /* pip1=1, queue = 0 */ +}; +#define MTAG_IPFW 1148380143 /* IPFW-tagged cookie */ +#define MTAG_IPFW_RULE 1262273568 /* rule reference */ + struct ip_fw_args; -extern int (*ip_fw_chk_ptr)(struct ip_fw_args *args); -extern int (*ip_fw_ctl_ptr)(struct sockopt *); +typedef int (*ip_fw_chk_ptr_t)(struct ip_fw_args *args); +typedef int (*ip_fw_ctl_ptr_t)(struct sockopt *); +VNET_DECLARE(ip_fw_chk_ptr_t, ip_fw_chk_ptr); +VNET_DECLARE(ip_fw_ctl_ptr_t, ip_fw_ctl_ptr); +#define V_ip_fw_chk_ptr VNET(ip_fw_chk_ptr) +#define V_ip_fw_ctl_ptr VNET(ip_fw_ctl_ptr) + +/* Divert hooks. */ +extern void (*ip_divert_ptr)(struct mbuf *m, int incoming); +/* ng_ipfw hooks -- XXX make it the same as divert and dummynet */ +extern int (*ng_ipfw_input_p)(struct mbuf **, int, + struct ip_fw_args *, int); + extern int (*ip_dn_ctl_ptr)(struct sockopt *); -extern int (*ip_dn_io_ptr)(struct mbuf **m, int dir, struct ip_fw_args *fwa); -extern void (*ip_dn_ruledel_ptr)(void *); /* in ip_fw2.c */ +extern int (*ip_dn_io_ptr)(struct mbuf **, int, struct ip_fw_args *); VNET_DECLARE(int, ip_do_randomid); #define V_ip_do_randomid VNET(ip_do_randomid) diff --git a/sys/netinet/ipfw/ip_dummynet.c b/sys/netinet/ipfw/ip_dummynet.c index d5620997b3e9..267776f567a7 100644 --- a/sys/netinet/ipfw/ip_dummynet.c +++ b/sys/netinet/ipfw/ip_dummynet.c @@ -52,8 +52,6 @@ __FBSDID("$FreeBSD$"); * 000601: WF2Q support * 000106: large rewrite, use heaps to handle very many pipes. * 980513: initial release - * - * include files marked with XXX are probably not needed */ #include @@ -75,9 +73,10 @@ __FBSDID("$FreeBSD$"); #include #include #include /* ip_len, ip_off */ -#include -#include #include /* ip_output(), IP_FORWARDING */ +#include +#include +#include #include /* various ether_* routines */ @@ -104,7 +103,7 @@ static int red_lookup_depth = 256; /* RED - default lookup table depth */ static int red_avg_pkt_size = 512; /* RED - default medium packet size */ static int red_max_pkt_size = 1500; /* RED - default max packet size */ -static struct timeval prev_t, t; +static struct timeval prev_t; static long tick_last; /* Last tick duration (usec). */ static long tick_delta; /* Last vs standard tick diff (usec). */ static long tick_delta_sum; /* Accumulated tick difference (usec).*/ @@ -240,9 +239,19 @@ static int ip_dn_ctl(struct sockopt *sopt); static void dummynet(void *); static void dummynet_flush(void); static void dummynet_send(struct mbuf *); -void dummynet_drain(void); static int dummynet_io(struct mbuf **, int , struct ip_fw_args *); +/* + * Flow queue is idle if: + * 1) it's empty for at least 1 tick + * 2) it has invalid timestamp (WF2Q case) + * 3) parent pipe has no 'exhausted' burst. + */ +#define QUEUE_IS_IDLE(q) ((q)->head == NULL && (q)->S == (q)->F + 1 && \ + curr_time > (q)->idle_time + 1 && \ + ((q)->numbytes + (curr_time - (q)->idle_time - 1) * \ + (q)->fs->pipe->bandwidth >= (q)->fs->pipe->burst)) + /* * Heap management functions. * @@ -449,6 +458,22 @@ heap_free(struct dn_heap *h) * --- end of heap management functions --- */ +/* + * Dispose a list of packet. Use an inline functions so if we + * need to free extra state associated to a packet, this is a + * central point to do it. + */ + +static __inline void dn_free_pkts(struct mbuf *mnext) +{ + struct mbuf *m; + + while ((m = mnext) != NULL) { + mnext = m->m_nextpkt; + FREE_PKT(m); + } +} + /* * Return the mbuf tag holding the dummynet state. As an optimization * this is assumed to be the first tag on the list. If this turns out @@ -518,7 +543,6 @@ transmit_event(struct dn_pipe *pipe, struct mbuf **head, struct mbuf **tail) } #define div64(a, b) ((int64_t)(a) / (int64_t)(b)) -#define DN_TO_DROP 0xffff /* * Compute how many ticks we have to wait before being able to send * a packet. This is computed as the "wire time" for the packet @@ -533,13 +557,6 @@ set_ticks(struct mbuf *m, struct dn_flow_queue *q, struct dn_pipe *p) ret = div64( (m->m_pkthdr.len * 8 + q->extra_bits) * hz - q->numbytes + p->bandwidth - 1 , p->bandwidth); -#if 0 - printf("%s %d extra_bits %d numb %d ret %d\n", - __FUNCTION__, __LINE__, - (int)(q->extra_bits & 0xffffffff), - (int)(q->numbytes & 0xffffffff), - (int)(ret & 0xffffffff)); -#endif if (ret < 0) ret = 0; return ret; @@ -559,11 +576,11 @@ compute_extra_bits(struct mbuf *pkt, struct dn_pipe *p) if (!p->samples || p->samples_no == 0) return 0; index = random() % p->samples_no; - extra_bits = ((dn_key)p->samples[index] * p->bandwidth) / 1000; + extra_bits = div64((dn_key)p->samples[index] * p->bandwidth, 1000); if (index >= p->loss_level) { struct dn_pkt_tag *dt = dn_tag_get(pkt); if (dt) - dt->dn_dir = DN_TO_DROP; + dt->dn_dir = DIR_DROP; } return extra_bits; } @@ -685,11 +702,20 @@ ready_event_wfq(struct dn_pipe *p, struct mbuf **head, struct mbuf **tail) int p_was_empty = (p->head == NULL); struct dn_heap *sch = &(p->scheduler_heap); struct dn_heap *neh = &(p->not_eligible_heap); + int64_t p_numbytes = p->numbytes; + + /* + * p->numbytes is only 32bits in FBSD7, but we might need 64 bits. + * Use a local variable for the computations, and write back the + * results when done, saturating if needed. + * The local variable has no impact on performance and helps + * reducing diffs between the various branches. + */ DUMMYNET_LOCK_ASSERT(); if (p->if_name[0] == 0) /* tx clock is simulated */ - p->numbytes += (curr_time - p->sched_time) * p->bandwidth; + p_numbytes += (curr_time - p->sched_time) * p->bandwidth; else { /* * tx clock is for real, * the ifq must be empty or this is a NOP. @@ -706,7 +732,7 @@ ready_event_wfq(struct dn_pipe *p, struct mbuf **head, struct mbuf **tail) * While we have backlogged traffic AND credit, we need to do * something on the queue. */ - while (p->numbytes >= 0 && (sch->elements > 0 || neh->elements > 0)) { + while (p_numbytes >= 0 && (sch->elements > 0 || neh->elements > 0)) { if (sch->elements > 0) { /* Have some eligible pkts to send out. */ struct dn_flow_queue *q = sch->p[0].object; @@ -716,10 +742,10 @@ ready_event_wfq(struct dn_pipe *p, struct mbuf **head, struct mbuf **tail) int len_scaled = p->bandwidth ? len * 8 * hz : 0; heap_extract(sch, NULL); /* Remove queue from heap. */ - p->numbytes -= len_scaled; + p_numbytes -= len_scaled; move_pkt(pkt, q, p, len); - p->V += (len << MY_M) / p->sum; /* Update V. */ + p->V += div64((len << MY_M), p->sum); /* Update V. */ q->S = q->F; /* Update start time. */ if (q->len == 0) { /* Flow not backlogged any more. */ @@ -734,7 +760,7 @@ ready_event_wfq(struct dn_pipe *p, struct mbuf **head, struct mbuf **tail) * (we will fix this later). */ len = (q->head)->m_pkthdr.len; - q->F += (len << MY_M) / (uint64_t)fs->weight; + q->F += div64((len << MY_M), fs->weight); if (DN_KEY_LEQ(q->S, p->V)) heap_insert(neh, q->S, q); else @@ -757,11 +783,11 @@ ready_event_wfq(struct dn_pipe *p, struct mbuf **head, struct mbuf **tail) } if (p->if_name[0] != '\0') { /* Tx clock is from a real thing */ - p->numbytes = -1; /* Mark not ready for I/O. */ + p_numbytes = -1; /* Mark not ready for I/O. */ break; } } - if (sch->elements == 0 && neh->elements == 0 && p->numbytes >= 0) { + if (sch->elements == 0 && neh->elements == 0 && p_numbytes >= 0) { p->idle_time = curr_time; /* * No traffic and no events scheduled. @@ -787,11 +813,11 @@ ready_event_wfq(struct dn_pipe *p, struct mbuf **head, struct mbuf **tail) * If we are under credit, schedule the next ready event. * Also fix the delivery time of the last packet. */ - if (p->if_name[0]==0 && p->numbytes < 0) { /* This implies bw > 0. */ + if (p->if_name[0]==0 && p_numbytes < 0) { /* This implies bw > 0. */ dn_key t = 0; /* Number of ticks i have to wait. */ if (p->bandwidth > 0) - t = (p->bandwidth - 1 - p->numbytes) / p->bandwidth; + t = div64(p->bandwidth - 1 - p_numbytes, p->bandwidth); dn_tag_get(p->tail)->output_time += t; p->sched_time = curr_time; heap_insert(&wfq_ready_heap, curr_time + t, (void *)p); @@ -801,6 +827,9 @@ ready_event_wfq(struct dn_pipe *p, struct mbuf **head, struct mbuf **tail) */ } + /* Write back p_numbytes (adjust 64->32bit if necessary). */ + p->numbytes = p_numbytes; + /* * If the delay line was empty call transmit_event() now. * Otherwise, the scheduler will take care of it. @@ -821,7 +850,9 @@ dummynet(void * __unused unused) } /* - * The main dummynet processing function. + * The timer handler for dummynet. Time is computed in ticks, but + * but the code is tolerant to the actual rate at which this is called. + * Once complete, the function reschedules itself for the next tick. */ static void dummynet_task(void *context, int pending) @@ -832,6 +863,7 @@ dummynet_task(void *context, int pending) struct dn_heap *h; void *p; /* generic parameter to handler */ int i; + struct timeval t; DUMMYNET_LOCK(); @@ -900,8 +932,8 @@ dummynet_task(void *context, int pending) } /* Sweep pipes trying to expire idle flow_queues. */ - for (i = 0; i < HASHSIZE; i++) - SLIST_FOREACH(pipe, &pipehash[i], next) + for (i = 0; i < HASHSIZE; i++) { + SLIST_FOREACH(pipe, &pipehash[i], next) { if (pipe->idle_heap.elements > 0 && DN_KEY_LT(pipe->idle_heap.p[0].key, pipe->V)) { struct dn_flow_queue *q = @@ -912,6 +944,8 @@ dummynet_task(void *context, int pending) q->S = q->F + 1; pipe->sum -= q->fs->weight; } + } + } DUMMYNET_UNLOCK(); @@ -924,41 +958,56 @@ dummynet_task(void *context, int pending) static void dummynet_send(struct mbuf *m) { - struct dn_pkt_tag *pkt; struct mbuf *n; - struct ip *ip; for (; m != NULL; m = n) { + struct ifnet *ifp; + int dst; + struct m_tag *tag; + n = m->m_nextpkt; m->m_nextpkt = NULL; - pkt = dn_tag_get(m); - switch (pkt->dn_dir) { - case DN_TO_IP_OUT: + tag = m_tag_first(m); + if (tag == NULL) { + dst = DIR_DROP; + } else { + struct dn_pkt_tag *pkt = dn_tag_get(m); + /* extract the dummynet info, rename the tag */ + dst = pkt->dn_dir; + ifp = pkt->ifp; + /* rename the tag so it carries reinject info */ + tag->m_tag_cookie = MTAG_IPFW_RULE; + tag->m_tag_id = 0; + } + + switch (dst) { + case DIR_OUT: + SET_HOST_IPLEN(mtod(m, struct ip *)); ip_output(m, NULL, NULL, IP_FORWARDING, NULL, NULL); break ; - case DN_TO_IP_IN : - ip = mtod(m, struct ip *); - ip->ip_len = htons(ip->ip_len); - ip->ip_off = htons(ip->ip_off); + case DIR_IN : + /* put header in network format for ip_input() */ + //SET_NET_IPLEN(mtod(m, struct ip *)); netisr_dispatch(NETISR_IP, m); break; #ifdef INET6 - case DN_TO_IP6_IN: + case DIR_IN | PROTO_IPV6: netisr_dispatch(NETISR_IPV6, m); break; - case DN_TO_IP6_OUT: + case DIR_OUT | PROTO_IPV6: + SET_HOST_IPLEN(mtod(m, struct ip *)); ip6_output(m, NULL, NULL, IPV6_FORWARDING, NULL, NULL, NULL); break; #endif - case DN_TO_IFB_FWD: + case DIR_FWD | PROTO_IFB: /* DN_TO_IFB_FWD: */ if (bridge_dn_p != NULL) - ((*bridge_dn_p)(m, pkt->ifp)); + ((*bridge_dn_p)(m, ifp)); else printf("dummynet: if_bridge not loaded\n"); break; - case DN_TO_ETH_DEMUX: + case DIR_IN | PROTO_LAYER2: /* DN_TO_ETH_DEMUX: */ /* * The Ethernet code assumes the Ethernet header is * contiguous in the first mbuf header. @@ -972,18 +1021,18 @@ dummynet_send(struct mbuf *m) } ether_demux(m->m_pkthdr.rcvif, m); break; - case DN_TO_ETH_OUT: - ether_output_frame(pkt->ifp, m); + case DIR_OUT | PROTO_LAYER2: /* N_TO_ETH_OUT: */ + ether_output_frame(ifp, m); break; - case DN_TO_DROP: + case DIR_DROP: /* drop the packet after some time */ - m_freem(m); + FREE_PKT(m); break; default: - printf("dummynet: bad switch %d!\n", pkt->dn_dir); - m_freem(m); + printf("dummynet: bad switch %d!\n", dst); + FREE_PKT(m); break; } } @@ -1002,9 +1051,9 @@ expire_queues(struct dn_flow_set *fs) if (fs->last_expired == time_uptime) return 0 ; fs->last_expired = time_uptime ; - for (i = 0 ; i <= fs->rq_size ; i++) /* last one is overflow */ - for (prev=NULL, q = fs->rq[i] ; q != NULL ; ) - if (q->head != NULL || q->S != q->F+1) { + for (i = 0 ; i <= fs->rq_size ; i++) { /* last one is overflow */ + for (prev=NULL, q = fs->rq[i] ; q != NULL ; ) { + if (!QUEUE_IS_IDLE(q)) { prev = q ; q = q->next ; } else { /* entry is idle, expire it */ @@ -1017,6 +1066,8 @@ expire_queues(struct dn_flow_set *fs) fs->rq_elements-- ; free(old_q, M_DUMMYNET); } + } + } return initial_elements - fs->rq_elements ; } @@ -1134,7 +1185,7 @@ find_queue(struct dn_flow_set *fs, struct ipfw_flow_id *id) break ; /* found */ /* No match. Check if we can expire the entry */ - if (pipe_expire && q->head == NULL && q->S == q->F+1 ) { + if (pipe_expire && QUEUE_IS_IDLE(q)) { /* entry is idle and not in any heap, expire it */ struct dn_flow_queue *old_q = q ; @@ -1207,7 +1258,8 @@ red_drops(struct dn_flow_set *fs, struct dn_flow_queue *q, int len) * XXX check wraps... */ if (q->avg) { - u_int t = (curr_time - q->idle_time) / fs->lookup_step; + u_int t = div64(curr_time - q->idle_time, + fs->lookup_step); q->avg = (t < fs->lookup_depth) ? SCALE_MUL(q->avg, fs->w_q_lookup[t]) : 0; @@ -1247,7 +1299,7 @@ red_drops(struct dn_flow_set *fs, struct dn_flow_queue *q, int len) } if (fs->flags_fs & DN_QSIZE_IS_BYTES) - p_b = (p_b * len) / fs->max_pkt_size; + p_b = div64(p_b * len, fs->max_pkt_size); if (++q->count == 0) q->random = random() & 0xffff; else { @@ -1313,34 +1365,22 @@ dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa) struct dn_pipe *pipe; uint64_t len = m->m_pkthdr.len; struct dn_flow_queue *q = NULL; - int is_pipe; - ipfw_insn *cmd = ACTION_PTR(fwa->rule); + int is_pipe = fwa->rule.info & IPFW_IS_PIPE; KASSERT(m->m_nextpkt == NULL, ("dummynet_io: mbuf queue passed to dummynet")); - if (cmd->opcode == O_LOG) - cmd += F_LEN(cmd); - if (cmd->opcode == O_ALTQ) - cmd += F_LEN(cmd); - if (cmd->opcode == O_TAG) - cmd += F_LEN(cmd); - is_pipe = (cmd->opcode == O_PIPE); - DUMMYNET_LOCK(); io_pkt++; /* * This is a dummynet rule, so we expect an O_PIPE or O_QUEUE rule. - * - * XXXGL: probably the pipe->fs and fs->pipe logic here - * below can be simplified. */ if (is_pipe) { - pipe = locate_pipe(fwa->cookie); + pipe = locate_pipe(fwa->rule.info & IPFW_INFO_MASK); if (pipe != NULL) fs = &(pipe->fs); } else - fs = locate_flowset(fwa->cookie); + fs = locate_flowset(fwa->rule.info & IPFW_INFO_MASK); if (fs == NULL) goto dropit; /* This queue/pipe does not exist! */ @@ -1387,10 +1427,8 @@ dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa) * Build and enqueue packet + parameters. */ pkt->rule = fwa->rule; - pkt->rule_id = fwa->rule_id; - pkt->chain_id = fwa->chain_id; + pkt->rule.info &= IPFW_ONEPASS; /* only keep this info */ pkt->dn_dir = dir; - pkt->ifp = fwa->oif; if (q->head == NULL) @@ -1408,18 +1446,20 @@ dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa) if (q->idle_time < curr_time) { /* Calculate available burst size. */ q->numbytes += - (curr_time - q->idle_time) * pipe->bandwidth; + (curr_time - q->idle_time - 1) * pipe->bandwidth; if (q->numbytes > pipe->burst) q->numbytes = pipe->burst; if (io_fast) q->numbytes += pipe->bandwidth; } } else { /* WF2Q. */ - if (pipe->idle_time < curr_time) { + if (pipe->idle_time < curr_time && + pipe->scheduler_heap.elements == 0 && + pipe->not_eligible_heap.elements == 0) { /* Calculate available burst size. */ pipe->numbytes += - (curr_time - pipe->idle_time) * pipe->bandwidth; - if (pipe->numbytes > pipe->burst) + (curr_time - pipe->idle_time - 1) * pipe->bandwidth; + if (pipe->numbytes > 0 && pipe->numbytes > pipe->burst) pipe->numbytes = pipe->burst; if (io_fast) pipe->numbytes += pipe->bandwidth; @@ -1464,7 +1504,7 @@ dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa) heap_extract(&(pipe->idle_heap), q); q->S = MAX64(q->F, pipe->V); } - q->F = q->S + (len << MY_M) / (uint64_t)fs->weight; + q->F = q->S + div64(len << MY_M, fs->weight); if (pipe->not_eligible_heap.elements == 0 && pipe->scheduler_heap.elements == 0) @@ -1500,8 +1540,8 @@ dummynet_io(struct mbuf **m0, int dir, struct ip_fw_args *fwa) } } done: - if (head == m && dir != DN_TO_IFB_FWD && dir != DN_TO_ETH_DEMUX && - dir != DN_TO_ETH_OUT) { /* Fast io. */ + if (head == m && (dir & PROTO_LAYER2) == 0 ) { + /* Fast io. */ io_pkt_fast++; if (m->m_nextpkt != NULL) printf("dummynet: fast io: pkt chain detected!\n"); @@ -1519,19 +1559,11 @@ dropit: if (q) q->drops++; DUMMYNET_UNLOCK(); - m_freem(m); + FREE_PKT(m); *m0 = NULL; return ((fs && (fs->flags_fs & DN_NOERROR)) ? 0 : ENOBUFS); } -/* - * Below, the rt_unref is only needed when (pkt->dn_dir == DN_TO_IP_OUT) - * Doing this would probably save us the initial bzero of dn_pkt - */ -#define DN_FREE_PKT(_m) do { \ - m_freem(_m); \ -} while (0) - /* * Dispose all packets and flow_queues on a flow_set. * If all=1, also remove red lookup table and other storage, @@ -1548,13 +1580,7 @@ purge_flow_set(struct dn_flow_set *fs, int all) for (i = 0; i <= fs->rq_size; i++) { for (q = fs->rq[i]; q != NULL; q = qn) { - struct mbuf *m, *mnext; - - mnext = q->head; - while ((m = mnext) != NULL) { - mnext = m->m_nextpkt; - DN_FREE_PKT(m); - } + dn_free_pkts(q->head); qn = q->next; free(q, M_DUMMYNET); } @@ -1582,15 +1608,10 @@ purge_flow_set(struct dn_flow_set *fs, int all) static void purge_pipe(struct dn_pipe *pipe) { - struct mbuf *m, *mnext; purge_flow_set( &(pipe->fs), 1 ); - mnext = pipe->head; - while ((m = mnext) != NULL) { - mnext = m->m_nextpkt; - DN_FREE_PKT(m); - } + dn_free_pkts(pipe->head); heap_free( &(pipe->scheduler_heap) ); heap_free( &(pipe->not_eligible_heap) ); @@ -1785,13 +1806,15 @@ config_pipe(struct dn_pipe *p) pipe->idle_heap.size = pipe->idle_heap.elements = 0; pipe->idle_heap.offset = offsetof(struct dn_flow_queue, heap_pos); - } else + } else { /* Flush accumulated credit for all queues. */ - for (i = 0; i <= pipe->fs.rq_size; i++) + for (i = 0; i <= pipe->fs.rq_size; i++) { for (q = pipe->fs.rq[i]; q; q = q->next) { q->numbytes = p->burst + (io_fast ? p->bandwidth : 0); } + } + } pipe->bandwidth = p->bandwidth; pipe->burst = p->burst; @@ -1901,14 +1924,16 @@ config_pipe(struct dn_pipe *p) static void fs_remove_from_heap(struct dn_heap *h, struct dn_flow_set *fs) { - int i = 0, found = 0 ; - for (; i < h->elements ;) + int i, found; + + for (i = found = 0 ; i < h->elements ;) { if ( ((struct dn_flow_queue *)h->p[i].object)->fs == fs) { h->elements-- ; h->p[i] = h->p[h->elements] ; found++ ; } else i++ ; + } if (found) heapify(h); } @@ -1919,52 +1944,16 @@ fs_remove_from_heap(struct dn_heap *h, struct dn_flow_set *fs) static void pipe_remove_from_heap(struct dn_heap *h, struct dn_pipe *p) { - if (h->elements > 0) { - int i = 0 ; + int i; + for (i=0; i < h->elements ; i++ ) { - if (h->p[i].object == p) { /* found it */ - h->elements-- ; - h->p[i] = h->p[h->elements] ; - heapify(h); - break ; - } - } - } -} - -/* - * drain all queues. Called in case of severe mbuf shortage. - */ -void -dummynet_drain(void) -{ - struct dn_flow_set *fs; - struct dn_pipe *pipe; - struct mbuf *m, *mnext; - int i; - - DUMMYNET_LOCK_ASSERT(); - - heap_free(&ready_heap); - heap_free(&wfq_ready_heap); - heap_free(&extract_heap); - /* remove all references to this pipe from flow_sets */ - for (i = 0; i < HASHSIZE; i++) - SLIST_FOREACH(fs, &flowsethash[i], next) - purge_flow_set(fs, 0); - - for (i = 0; i < HASHSIZE; i++) { - SLIST_FOREACH(pipe, &pipehash[i], next) { - purge_flow_set(&(pipe->fs), 0); - - mnext = pipe->head; - while ((m = mnext) != NULL) { - mnext = m->m_nextpkt; - DN_FREE_PKT(m); + if (h->p[i].object == p) { /* found it */ + h->elements-- ; + h->p[i] = h->p[h->elements] ; + heapify(h); + break ; } - pipe->head = pipe->tail = NULL; } - } } /* @@ -1995,14 +1984,16 @@ delete_pipe(struct dn_pipe *p) SLIST_REMOVE(&pipehash[HASH(pipe->pipe_nr)], pipe, dn_pipe, next); /* Remove all references to this pipe from flow_sets. */ - for (i = 0; i < HASHSIZE; i++) - SLIST_FOREACH(fs, &flowsethash[i], next) + for (i = 0; i < HASHSIZE; i++) { + SLIST_FOREACH(fs, &flowsethash[i], next) { if (fs->pipe == pipe) { printf("dummynet: ++ ref to pipe %d from fs %d\n", p->pipe_nr, fs->fs_nr); fs->pipe = NULL ; purge_flow_set(fs, 0); } + } + } fs_remove_from_heap(&ready_heap, &(pipe->fs)); purge_pipe(pipe); /* remove all data associated to this pipe */ /* remove reference to here from extract_heap and wfq_ready_heap */ @@ -2051,7 +2042,7 @@ dn_copy_set(struct dn_flow_set *set, char *bp) DUMMYNET_LOCK_ASSERT(); - for (i = 0 ; i <= set->rq_size ; i++) + for (i = 0 ; i <= set->rq_size ; i++) { for (q = set->rq[i] ; q ; q = q->next, qp++ ) { if (q->hash_slot != i) printf("dummynet: ++ at %d: wrong slot (have %d, " @@ -2066,6 +2057,7 @@ dn_copy_set(struct dn_flow_set *set, char *bp) qp->head = qp->tail = NULL ; qp->fs = NULL ; } + } if (copied != set->rq_elements) printf("dummynet: ++ wrong count, have %d should be %d\n", copied, set->rq_elements); @@ -2115,7 +2107,7 @@ dummynet_get(struct sockopt *sopt) DUMMYNET_UNLOCK(); buf = malloc(size, M_TEMP, M_WAITOK); DUMMYNET_LOCK(); - if (size == dn_calc_size()) + if (size >= dn_calc_size()) break; free(buf, M_TEMP); buf = NULL; @@ -2125,7 +2117,7 @@ dummynet_get(struct sockopt *sopt) return ENOBUFS ; } bp = buf; - for (i = 0; i < HASHSIZE; i++) + for (i = 0; i < HASHSIZE; i++) { SLIST_FOREACH(pipe, &pipehash[i], next) { struct dn_pipe *pipe_bp = (struct dn_pipe *)bp; @@ -2136,7 +2128,7 @@ dummynet_get(struct sockopt *sopt) */ bcopy(pipe, bp, sizeof(*pipe)); pipe_bp->delay = (pipe_bp->delay * 1000) / hz; - pipe_bp->burst /= 8 * hz; + pipe_bp->burst = div64(pipe_bp->burst, 8 * hz); /* * XXX the following is a hack based on ->next being the * first field in dn_pipe and dn_flow_set. The correct @@ -2154,8 +2146,9 @@ dummynet_get(struct sockopt *sopt) bp += sizeof(*pipe) ; bp = dn_copy_set(&(pipe->fs), bp); } + } - for (i = 0; i < HASHSIZE; i++) + for (i = 0; i < HASHSIZE; i++) { SLIST_FOREACH(fs, &flowsethash[i], next) { struct dn_flow_set *fs_bp = (struct dn_flow_set *)bp; @@ -2167,6 +2160,7 @@ dummynet_get(struct sockopt *sopt) bp += sizeof(*fs); bp = dn_copy_set(fs, bp); } + } DUMMYNET_UNLOCK(); @@ -2234,8 +2228,10 @@ ip_dn_ctl(struct sockopt *sopt) error = delete_pipe(p); break ; } + if (p != NULL) free(p, M_TEMP); + return error ; } @@ -2332,3 +2328,4 @@ static moduledata_t dummynet_mod = { DECLARE_MODULE(dummynet, dummynet_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); MODULE_DEPEND(dummynet, ipfw, 2, 2, 2); MODULE_VERSION(dummynet, 1); +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index e35669dc3a26..724536c40e7d 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2002 Luigi Rizzo, Universita` di Pisa + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,11 +26,8 @@ #include __FBSDID("$FreeBSD$"); -#define DEB(x) -#define DDB(x) x - /* - * Implement IP packet firewall (new version) + * The FreeBSD IP packet firewall, main file */ #if !defined(KLD_MODULE) @@ -65,13 +62,10 @@ __FBSDID("$FreeBSD$"); #include #include /* for ETHERTYPE_IP */ #include -#include #include #include #include -#define IPFW_INTERNAL /* Access to protected data structures in ip_fw.h. */ - #include #include #include @@ -79,8 +73,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include +#include #include #include #include @@ -88,12 +81,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include - #include #include #ifdef INET6 #include +#include #endif #include /* XXX for in_cksum */ @@ -102,73 +94,61 @@ __FBSDID("$FreeBSD$"); #include #endif +/* + * static variables followed by global ones. + * All ipfw global variables are here. + */ + +/* ipfw_vnet_ready controls when we are open for business */ static VNET_DEFINE(int, ipfw_vnet_ready) = 0; #define V_ipfw_vnet_ready VNET(ipfw_vnet_ready) -/* - * set_disable contains one bit per set value (0..31). - * If the bit is set, all rules with the corresponding set - * are disabled. Set RESVD_SET(31) is reserved for the default rule - * and rules that are not deleted by the flush command, - * and CANNOT be disabled. - * Rules in set RESVD_SET can only be deleted explicitly. - */ -static VNET_DEFINE(u_int32_t, set_disable); -static VNET_DEFINE(int, fw_verbose); -static VNET_DEFINE(struct callout, ipfw_timeout); -static VNET_DEFINE(int, verbose_limit); -#define V_set_disable VNET(set_disable) -#define V_fw_verbose VNET(fw_verbose) -#define V_ipfw_timeout VNET(ipfw_timeout) -#define V_verbose_limit VNET(verbose_limit) +static VNET_DEFINE(int, fw_deny_unknown_exthdrs); +#define V_fw_deny_unknown_exthdrs VNET(fw_deny_unknown_exthdrs) #ifdef IPFIREWALL_DEFAULT_TO_ACCEPT static int default_to_accept = 1; #else static int default_to_accept; #endif -static uma_zone_t ipfw_dyn_rule_zone; -struct ip_fw *ip_fw_default_rule; +VNET_DEFINE(int, autoinc_step); /* - * list of rules for layer 3 + * Each rule belongs to one of 32 different sets (0..31). + * The variable set_disable contains one bit per set. + * If the bit is set, all rules in the corresponding set + * are disabled. Set RESVD_SET(31) is reserved for the default rule + * and rules that are not deleted by the flush command, + * and CANNOT be disabled. + * Rules in set RESVD_SET can only be deleted individually. */ +VNET_DEFINE(u_int32_t, set_disable); +#define V_set_disable VNET(set_disable) + +VNET_DEFINE(int, fw_verbose); +/* counter for ipfw_log(NULL...) */ +VNET_DEFINE(u_int64_t, norule_counter); +VNET_DEFINE(int, verbose_limit); + +/* layer3_chain contains the list of rules for layer 3 */ VNET_DEFINE(struct ip_fw_chain, layer3_chain); -MALLOC_DEFINE(M_IPFW, "IpFw/IpAcct", "IpFw/IpAcct chain's"); -MALLOC_DEFINE(M_IPFW_TBL, "ipfw_tbl", "IpFw tables"); -#define IPFW_NAT_LOADED (ipfw_nat_ptr != NULL) ipfw_nat_t *ipfw_nat_ptr = NULL; +struct cfg_nat *(*lookup_nat_ptr)(struct nat_list *, int); ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; ipfw_nat_cfg_t *ipfw_nat_del_ptr; ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; -struct table_entry { - struct radix_node rn[2]; - struct sockaddr_in addr, mask; - u_int32_t value; -}; - -static VNET_DEFINE(int, autoinc_step); -#define V_autoinc_step VNET(autoinc_step) -static VNET_DEFINE(int, fw_deny_unknown_exthdrs); -#define V_fw_deny_unknown_exthdrs VNET(fw_deny_unknown_exthdrs) - -extern int ipfw_chg_hook(SYSCTL_HANDLER_ARGS); - #ifdef SYSCTL_NODE SYSCTL_NODE(_net_inet_ip, OID_AUTO, fw, CTLFLAG_RW, 0, "Firewall"); -SYSCTL_VNET_PROC(_net_inet_ip_fw, OID_AUTO, enable, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_enable), 0, - ipfw_chg_hook, "I", "Enable ipfw"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, autoinc_step, - CTLFLAG_RW, &VNET_NAME(autoinc_step), 0, - "Rule number auto-increment step"); SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, one_pass, CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_one_pass), 0, "Only do a single pass through ipfw when using dummynet(4)"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, autoinc_step, + CTLFLAG_RW, &VNET_NAME(autoinc_step), 0, + "Rule number auto-increment step"); SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, verbose, CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_verbose), 0, "Log matches to ipfw rules"); @@ -185,153 +165,23 @@ SYSCTL_INT(_net_inet_ip_fw, OID_AUTO, default_to_accept, CTLFLAG_RDTUN, &default_to_accept, 0, "Make the default rule accept all packets."); TUNABLE_INT("net.inet.ip.fw.default_to_accept", &default_to_accept); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, static_count, + CTLFLAG_RD, &VNET_NAME(layer3_chain.n_rules), 0, + "Number of static rules"); + #ifdef INET6 SYSCTL_DECL(_net_inet6_ip6); SYSCTL_NODE(_net_inet6_ip6, OID_AUTO, fw, CTLFLAG_RW, 0, "Firewall"); -SYSCTL_VNET_PROC(_net_inet6_ip6_fw, OID_AUTO, enable, - CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw6_enable), 0, - ipfw_chg_hook, "I", "Enable ipfw+6"); SYSCTL_VNET_INT(_net_inet6_ip6_fw, OID_AUTO, deny_unknown_exthdrs, CTLFLAG_RW | CTLFLAG_SECURE, &VNET_NAME(fw_deny_unknown_exthdrs), 0, "Deny packets with unknown IPv6 Extension Headers"); -#endif -#endif +#endif /* INET6 */ -/* - * Description of dynamic rules. - * - * Dynamic rules are stored in lists accessed through a hash table - * (ipfw_dyn_v) whose size is curr_dyn_buckets. This value can - * be modified through the sysctl variable dyn_buckets which is - * updated when the table becomes empty. - * - * XXX currently there is only one list, ipfw_dyn. - * - * When a packet is received, its address fields are first masked - * with the mask defined for the rule, then hashed, then matched - * against the entries in the corresponding list. - * Dynamic rules can be used for different purposes: - * + stateful rules; - * + enforcing limits on the number of sessions; - * + in-kernel NAT (not implemented yet) - * - * The lifetime of dynamic rules is regulated by dyn_*_lifetime, - * measured in seconds and depending on the flags. - * - * The total number of dynamic rules is stored in dyn_count. - * The max number of dynamic rules is dyn_max. When we reach - * the maximum number of rules we do not create anymore. This is - * done to avoid consuming too much memory, but also too much - * time when searching on each packet (ideally, we should try instead - * to put a limit on the length of the list on each bucket...). - * - * Each dynamic rule holds a pointer to the parent ipfw rule so - * we know what action to perform. Dynamic rules are removed when - * the parent rule is deleted. XXX we should make them survive. - * - * There are some limitations with dynamic rules -- we do not - * obey the 'randomized match', and we do not do multiple - * passes through the firewall. XXX check the latter!!! - */ -static VNET_DEFINE(ipfw_dyn_rule **, ipfw_dyn_v); -static VNET_DEFINE(u_int32_t, dyn_buckets); -static VNET_DEFINE(u_int32_t, curr_dyn_buckets); - -#define V_ipfw_dyn_v VNET(ipfw_dyn_v) -#define V_dyn_buckets VNET(dyn_buckets) -#define V_curr_dyn_buckets VNET(curr_dyn_buckets) - -static struct mtx ipfw_dyn_mtx; /* mutex guarding dynamic rules */ -#define IPFW_DYN_LOCK_INIT() \ - mtx_init(&ipfw_dyn_mtx, "IPFW dynamic rules", NULL, MTX_DEF) -#define IPFW_DYN_LOCK_DESTROY() mtx_destroy(&ipfw_dyn_mtx) -#define IPFW_DYN_LOCK() mtx_lock(&ipfw_dyn_mtx) -#define IPFW_DYN_UNLOCK() mtx_unlock(&ipfw_dyn_mtx) -#define IPFW_DYN_LOCK_ASSERT() mtx_assert(&ipfw_dyn_mtx, MA_OWNED) - -/* - * Timeouts for various events in handing dynamic rules. - */ -static VNET_DEFINE(u_int32_t, dyn_ack_lifetime); -static VNET_DEFINE(u_int32_t, dyn_syn_lifetime); -static VNET_DEFINE(u_int32_t, dyn_fin_lifetime); -static VNET_DEFINE(u_int32_t, dyn_rst_lifetime); -static VNET_DEFINE(u_int32_t, dyn_udp_lifetime); -static VNET_DEFINE(u_int32_t, dyn_short_lifetime); - -#define V_dyn_ack_lifetime VNET(dyn_ack_lifetime) -#define V_dyn_syn_lifetime VNET(dyn_syn_lifetime) -#define V_dyn_fin_lifetime VNET(dyn_fin_lifetime) -#define V_dyn_rst_lifetime VNET(dyn_rst_lifetime) -#define V_dyn_udp_lifetime VNET(dyn_udp_lifetime) -#define V_dyn_short_lifetime VNET(dyn_short_lifetime) - -/* - * Keepalives are sent if dyn_keepalive is set. They are sent every - * dyn_keepalive_period seconds, in the last dyn_keepalive_interval - * seconds of lifetime of a rule. - * dyn_rst_lifetime and dyn_fin_lifetime should be strictly lower - * than dyn_keepalive_period. - */ - -static VNET_DEFINE(u_int32_t, dyn_keepalive_interval); -static VNET_DEFINE(u_int32_t, dyn_keepalive_period); -static VNET_DEFINE(u_int32_t, dyn_keepalive); - -#define V_dyn_keepalive_interval VNET(dyn_keepalive_interval) -#define V_dyn_keepalive_period VNET(dyn_keepalive_period) -#define V_dyn_keepalive VNET(dyn_keepalive) - -static VNET_DEFINE(u_int32_t, static_count); /* # of static rules */ -static VNET_DEFINE(u_int32_t, static_len); /* bytes of static rules */ -static VNET_DEFINE(u_int32_t, dyn_count); /* # of dynamic rules */ -static VNET_DEFINE(u_int32_t, dyn_max); /* max # of dynamic rules */ - -#define V_static_count VNET(static_count) -#define V_static_len VNET(static_len) -#define V_dyn_count VNET(dyn_count) -#define V_dyn_max VNET(dyn_max) - -#ifdef SYSCTL_NODE -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_buckets, - CTLFLAG_RW, &VNET_NAME(dyn_buckets), 0, - "Number of dyn. buckets"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, curr_dyn_buckets, - CTLFLAG_RD, &VNET_NAME(curr_dyn_buckets), 0, - "Current Number of dyn. buckets"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_count, - CTLFLAG_RD, &VNET_NAME(dyn_count), 0, - "Number of dyn. rules"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_max, - CTLFLAG_RW, &VNET_NAME(dyn_max), 0, - "Max number of dyn. rules"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, static_count, - CTLFLAG_RD, &VNET_NAME(static_count), 0, - "Number of static rules"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_ack_lifetime, - CTLFLAG_RW, &VNET_NAME(dyn_ack_lifetime), 0, - "Lifetime of dyn. rules for acks"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_syn_lifetime, - CTLFLAG_RW, &VNET_NAME(dyn_syn_lifetime), 0, - "Lifetime of dyn. rules for syn"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_fin_lifetime, - CTLFLAG_RW, &VNET_NAME(dyn_fin_lifetime), 0, - "Lifetime of dyn. rules for fin"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_rst_lifetime, - CTLFLAG_RW, &VNET_NAME(dyn_rst_lifetime), 0, - "Lifetime of dyn. rules for rst"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_udp_lifetime, - CTLFLAG_RW, &VNET_NAME(dyn_udp_lifetime), 0, - "Lifetime of dyn. rules for UDP"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_short_lifetime, - CTLFLAG_RW, &VNET_NAME(dyn_short_lifetime), 0, - "Lifetime of dyn. rules for other situations"); -SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_keepalive, - CTLFLAG_RW, &VNET_NAME(dyn_keepalive), 0, - "Enable keepalives for dyn. rules"); #endif /* SYSCTL_NODE */ + /* + * Some macros used in the various matching options. * L3HDR maps an ipv4 pointer into a layer3 header pointer of type T * Other macros just cast void * into the appropriate type */ @@ -517,19 +367,20 @@ iface_match(struct ifnet *ifp, ipfw_insn_if *cmd) * * The 'verrevpath' option checks that the interface that an IP packet * arrives on is the same interface that traffic destined for the - * packet's source address would be routed out of. The 'versrcreach' - * option just checks that the source address is reachable via any route - * (except default) in the routing table. These two are a measure to block - * forged packets. This is also commonly known as "anti-spoofing" or Unicast - * Reverse Path Forwarding (Unicast RFP) in Cisco-ese. The name of the knobs + * packet's source address would be routed out of. + * The 'versrcreach' option just checks that the source address is + * reachable via any route (except default) in the routing table. + * These two are a measure to block forged packets. This is also + * commonly known as "anti-spoofing" or Unicast Reverse Path + * Forwarding (Unicast RFP) in Cisco-ese. The name of the knobs * is purposely reminiscent of the Cisco IOS command, * * ip verify unicast reverse-path * ip verify unicast source reachable-via any * - * which implements the same functionality. But note that syntax is - * misleading. The check may be performed on all IP packets whether unicast, - * multicast, or broadcast. + * which implements the same functionality. But note that the syntax + * is misleading, and the check may be performed on all IP packets + * whether unicast, multicast, or broadcast. */ static int verify_path(struct in_addr src, struct ifnet *ifp, u_int fib) @@ -674,17 +525,6 @@ verify_path6(struct in6_addr *src, struct ifnet *ifp) return 1; } -static __inline int -hash_packet6(struct ipfw_flow_id *id) -{ - u_int32_t i; - i = (id->dst_ip6.__u6_addr.__u6_addr32[2]) ^ - (id->dst_ip6.__u6_addr.__u6_addr32[3]) ^ - (id->src_ip6.__u6_addr.__u6_addr32[2]) ^ - (id->src_ip6.__u6_addr.__u6_addr32[3]) ^ - (id->dst_port) ^ (id->src_port); - return i; -} static int is_icmp6_query(int icmp6_type) @@ -708,60 +548,18 @@ send_reject6(struct ip_fw_args *args, int code, u_int hlen, struct ip6_hdr *ip6) m = args->m; if (code == ICMP6_UNREACH_RST && args->f_id.proto == IPPROTO_TCP) { struct tcphdr *tcp; - tcp_seq ack, seq; - int flags; - struct { - struct ip6_hdr ip6; - struct tcphdr th; - } ti; tcp = (struct tcphdr *)((char *)ip6 + hlen); - if ((tcp->th_flags & TH_RST) != 0) { - m_freem(m); - args->m = NULL; - return; + if ((tcp->th_flags & TH_RST) == 0) { + struct mbuf *m0; + m0 = ipfw_send_pkt(args->m, &(args->f_id), + ntohl(tcp->th_seq), ntohl(tcp->th_ack), + tcp->th_flags | TH_RST); + if (m0 != NULL) + ip6_output(m0, NULL, NULL, 0, NULL, NULL, + NULL); } - - ti.ip6 = *ip6; - ti.th = *tcp; - ti.th.th_seq = ntohl(ti.th.th_seq); - ti.th.th_ack = ntohl(ti.th.th_ack); - ti.ip6.ip6_nxt = IPPROTO_TCP; - - if (ti.th.th_flags & TH_ACK) { - ack = 0; - seq = ti.th.th_ack; - flags = TH_RST; - } else { - ack = ti.th.th_seq; - if ((m->m_flags & M_PKTHDR) != 0) { - /* - * total new data to ACK is: - * total packet length, - * minus the header length, - * minus the tcp header length. - */ - ack += m->m_pkthdr.len - hlen - - (ti.th.th_off << 2); - } else if (ip6->ip6_plen) { - ack += ntohs(ip6->ip6_plen) + sizeof(*ip6) - - hlen - (ti.th.th_off << 2); - } else { - m_freem(m); - return; - } - if (tcp->th_flags & TH_SYN) - ack++; - seq = 0; - flags = TH_RST|TH_ACK; - } - bcopy(&ti, ip6, sizeof(ti)); - /* - * m is only used to recycle the mbuf - * The data in it is never read so we don't need - * to correct the offsets or anything - */ - tcp_respond(NULL, ip6, tcp, m, ack, seq, flags); + FREE_PKT(m); } else if (code != ICMP6_UNREACH_RST) { /* Send an ICMPv6 unreach. */ #if 0 /* @@ -777,965 +575,19 @@ send_reject6(struct ip_fw_args *args, int code, u_int hlen, struct ip6_hdr *ip6) #endif icmp6_error(m, ICMP6_DST_UNREACH, code, 0); } else - m_freem(m); + FREE_PKT(m); args->m = NULL; } #endif /* INET6 */ -/* counter for ipfw_log(NULL...) */ -static VNET_DEFINE(u_int64_t, norule_counter); -#define V_norule_counter VNET(norule_counter) - -#define SNPARGS(buf, len) buf + len, sizeof(buf) > len ? sizeof(buf) - len : 0 -#define SNP(buf) buf, sizeof(buf) - -/* - * We enter here when we have a rule with O_LOG. - * XXX this function alone takes about 2Kbytes of code! - */ -static void -ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, - struct mbuf *m, struct ifnet *oif, u_short offset, uint32_t tablearg, - struct ip *ip) -{ - struct ether_header *eh = args->eh; - char *action; - int limit_reached = 0; - char action2[40], proto[128], fragment[32]; - - fragment[0] = '\0'; - proto[0] = '\0'; - - if (f == NULL) { /* bogus pkt */ - if (V_verbose_limit != 0 && V_norule_counter >= V_verbose_limit) - return; - V_norule_counter++; - if (V_norule_counter == V_verbose_limit) - limit_reached = V_verbose_limit; - action = "Refuse"; - } else { /* O_LOG is the first action, find the real one */ - ipfw_insn *cmd = ACTION_PTR(f); - ipfw_insn_log *l = (ipfw_insn_log *)cmd; - - if (l->max_log != 0 && l->log_left == 0) - return; - l->log_left--; - if (l->log_left == 0) - limit_reached = l->max_log; - cmd += F_LEN(cmd); /* point to first action */ - if (cmd->opcode == O_ALTQ) { - ipfw_insn_altq *altq = (ipfw_insn_altq *)cmd; - - snprintf(SNPARGS(action2, 0), "Altq %d", - altq->qid); - cmd += F_LEN(cmd); - } - if (cmd->opcode == O_PROB) - cmd += F_LEN(cmd); - - if (cmd->opcode == O_TAG) - cmd += F_LEN(cmd); - - action = action2; - switch (cmd->opcode) { - case O_DENY: - action = "Deny"; - break; - - case O_REJECT: - if (cmd->arg1==ICMP_REJECT_RST) - action = "Reset"; - else if (cmd->arg1==ICMP_UNREACH_HOST) - action = "Reject"; - else - snprintf(SNPARGS(action2, 0), "Unreach %d", - cmd->arg1); - break; - - case O_UNREACH6: - if (cmd->arg1==ICMP6_UNREACH_RST) - action = "Reset"; - else - snprintf(SNPARGS(action2, 0), "Unreach %d", - cmd->arg1); - break; - - case O_ACCEPT: - action = "Accept"; - break; - case O_COUNT: - action = "Count"; - break; - case O_DIVERT: - snprintf(SNPARGS(action2, 0), "Divert %d", - cmd->arg1); - break; - case O_TEE: - snprintf(SNPARGS(action2, 0), "Tee %d", - cmd->arg1); - break; - case O_SETFIB: - snprintf(SNPARGS(action2, 0), "SetFib %d", - cmd->arg1); - break; - case O_SKIPTO: - snprintf(SNPARGS(action2, 0), "SkipTo %d", - cmd->arg1); - break; - case O_PIPE: - snprintf(SNPARGS(action2, 0), "Pipe %d", - cmd->arg1); - break; - case O_QUEUE: - snprintf(SNPARGS(action2, 0), "Queue %d", - cmd->arg1); - break; - case O_FORWARD_IP: { - ipfw_insn_sa *sa = (ipfw_insn_sa *)cmd; - int len; - struct in_addr dummyaddr; - if (sa->sa.sin_addr.s_addr == INADDR_ANY) - dummyaddr.s_addr = htonl(tablearg); - else - dummyaddr.s_addr = sa->sa.sin_addr.s_addr; - - len = snprintf(SNPARGS(action2, 0), "Forward to %s", - inet_ntoa(dummyaddr)); - - if (sa->sa.sin_port) - snprintf(SNPARGS(action2, len), ":%d", - sa->sa.sin_port); - } - break; - case O_NETGRAPH: - snprintf(SNPARGS(action2, 0), "Netgraph %d", - cmd->arg1); - break; - case O_NGTEE: - snprintf(SNPARGS(action2, 0), "Ngtee %d", - cmd->arg1); - break; - case O_NAT: - action = "Nat"; - break; - case O_REASS: - action = "Reass"; - break; - default: - action = "UNKNOWN"; - break; - } - } - - if (hlen == 0) { /* non-ip */ - snprintf(SNPARGS(proto, 0), "MAC"); - - } else { - int len; - char src[48], dst[48]; - struct icmphdr *icmp; - struct tcphdr *tcp; - struct udphdr *udp; -#ifdef INET6 - struct ip6_hdr *ip6 = NULL; - struct icmp6_hdr *icmp6; -#endif - src[0] = '\0'; - dst[0] = '\0'; -#ifdef INET6 - if (IS_IP6_FLOW_ID(&(args->f_id))) { - char ip6buf[INET6_ADDRSTRLEN]; - snprintf(src, sizeof(src), "[%s]", - ip6_sprintf(ip6buf, &args->f_id.src_ip6)); - snprintf(dst, sizeof(dst), "[%s]", - ip6_sprintf(ip6buf, &args->f_id.dst_ip6)); - - ip6 = (struct ip6_hdr *)ip; - tcp = (struct tcphdr *)(((char *)ip) + hlen); - udp = (struct udphdr *)(((char *)ip) + hlen); - } else -#endif - { - tcp = L3HDR(struct tcphdr, ip); - udp = L3HDR(struct udphdr, ip); - - inet_ntoa_r(ip->ip_src, src); - inet_ntoa_r(ip->ip_dst, dst); - } - - switch (args->f_id.proto) { - case IPPROTO_TCP: - len = snprintf(SNPARGS(proto, 0), "TCP %s", src); - if (offset == 0) - snprintf(SNPARGS(proto, len), ":%d %s:%d", - ntohs(tcp->th_sport), - dst, - ntohs(tcp->th_dport)); - else - snprintf(SNPARGS(proto, len), " %s", dst); - break; - - case IPPROTO_UDP: - len = snprintf(SNPARGS(proto, 0), "UDP %s", src); - if (offset == 0) - snprintf(SNPARGS(proto, len), ":%d %s:%d", - ntohs(udp->uh_sport), - dst, - ntohs(udp->uh_dport)); - else - snprintf(SNPARGS(proto, len), " %s", dst); - break; - - case IPPROTO_ICMP: - icmp = L3HDR(struct icmphdr, ip); - if (offset == 0) - len = snprintf(SNPARGS(proto, 0), - "ICMP:%u.%u ", - icmp->icmp_type, icmp->icmp_code); - else - len = snprintf(SNPARGS(proto, 0), "ICMP "); - len += snprintf(SNPARGS(proto, len), "%s", src); - snprintf(SNPARGS(proto, len), " %s", dst); - break; -#ifdef INET6 - case IPPROTO_ICMPV6: - icmp6 = (struct icmp6_hdr *)(((char *)ip) + hlen); - if (offset == 0) - len = snprintf(SNPARGS(proto, 0), - "ICMPv6:%u.%u ", - icmp6->icmp6_type, icmp6->icmp6_code); - else - len = snprintf(SNPARGS(proto, 0), "ICMPv6 "); - len += snprintf(SNPARGS(proto, len), "%s", src); - snprintf(SNPARGS(proto, len), " %s", dst); - break; -#endif - default: - len = snprintf(SNPARGS(proto, 0), "P:%d %s", - args->f_id.proto, src); - snprintf(SNPARGS(proto, len), " %s", dst); - break; - } - -#ifdef INET6 - if (IS_IP6_FLOW_ID(&(args->f_id))) { - if (offset & (IP6F_OFF_MASK | IP6F_MORE_FRAG)) - snprintf(SNPARGS(fragment, 0), - " (frag %08x:%d@%d%s)", - args->f_id.frag_id6, - ntohs(ip6->ip6_plen) - hlen, - ntohs(offset & IP6F_OFF_MASK) << 3, - (offset & IP6F_MORE_FRAG) ? "+" : ""); - } else -#endif - { - int ip_off, ip_len; - if (eh != NULL) { /* layer 2 packets are as on the wire */ - ip_off = ntohs(ip->ip_off); - ip_len = ntohs(ip->ip_len); - } else { - ip_off = ip->ip_off; - ip_len = ip->ip_len; - } - if (ip_off & (IP_MF | IP_OFFMASK)) - snprintf(SNPARGS(fragment, 0), - " (frag %d:%d@%d%s)", - ntohs(ip->ip_id), ip_len - (ip->ip_hl << 2), - offset << 3, - (ip_off & IP_MF) ? "+" : ""); - } - } - if (oif || m->m_pkthdr.rcvif) - log(LOG_SECURITY | LOG_INFO, - "ipfw: %d %s %s %s via %s%s\n", - f ? f->rulenum : -1, - action, proto, oif ? "out" : "in", - oif ? oif->if_xname : m->m_pkthdr.rcvif->if_xname, - fragment); - else - log(LOG_SECURITY | LOG_INFO, - "ipfw: %d %s %s [no if info]%s\n", - f ? f->rulenum : -1, - action, proto, fragment); - if (limit_reached) - log(LOG_SECURITY | LOG_NOTICE, - "ipfw: limit %d reached on entry %d\n", - limit_reached, f ? f->rulenum : -1); -} - -/* - * IMPORTANT: the hash function for dynamic rules must be commutative - * in source and destination (ip,port), because rules are bidirectional - * and we want to find both in the same bucket. - */ -static __inline int -hash_packet(struct ipfw_flow_id *id) -{ - u_int32_t i; - -#ifdef INET6 - if (IS_IP6_FLOW_ID(id)) - i = hash_packet6(id); - else -#endif /* INET6 */ - i = (id->dst_ip) ^ (id->src_ip) ^ (id->dst_port) ^ (id->src_port); - i &= (V_curr_dyn_buckets - 1); - return i; -} - -/** - * unlink a dynamic rule from a chain. prev is a pointer to - * the previous one, q is a pointer to the rule to delete, - * head is a pointer to the head of the queue. - * Modifies q and potentially also head. - */ -#define UNLINK_DYN_RULE(prev, head, q) { \ - ipfw_dyn_rule *old_q = q; \ - \ - /* remove a refcount to the parent */ \ - if (q->dyn_type == O_LIMIT) \ - q->parent->count--; \ - DEB(printf("ipfw: unlink entry 0x%08x %d -> 0x%08x %d, %d left\n",\ - (q->id.src_ip), (q->id.src_port), \ - (q->id.dst_ip), (q->id.dst_port), V_dyn_count-1 ); ) \ - if (prev != NULL) \ - prev->next = q = q->next; \ - else \ - head = q = q->next; \ - V_dyn_count--; \ - uma_zfree(ipfw_dyn_rule_zone, old_q); } - -#define TIME_LEQ(a,b) ((int)((a)-(b)) <= 0) - -/** - * Remove dynamic rules pointing to "rule", or all of them if rule == NULL. - * - * If keep_me == NULL, rules are deleted even if not expired, - * otherwise only expired rules are removed. - * - * The value of the second parameter is also used to point to identify - * a rule we absolutely do not want to remove (e.g. because we are - * holding a reference to it -- this is the case with O_LIMIT_PARENT - * rules). The pointer is only used for comparison, so any non-null - * value will do. - */ -static void -remove_dyn_rule(struct ip_fw *rule, ipfw_dyn_rule *keep_me) -{ - static u_int32_t last_remove = 0; - -#define FORCE (keep_me == NULL) - - ipfw_dyn_rule *prev, *q; - int i, pass = 0, max_pass = 0; - - IPFW_DYN_LOCK_ASSERT(); - - if (V_ipfw_dyn_v == NULL || V_dyn_count == 0) - return; - /* do not expire more than once per second, it is useless */ - if (!FORCE && last_remove == time_uptime) - return; - last_remove = time_uptime; - - /* - * because O_LIMIT refer to parent rules, during the first pass only - * remove child and mark any pending LIMIT_PARENT, and remove - * them in a second pass. - */ -next_pass: - for (i = 0 ; i < V_curr_dyn_buckets ; i++) { - for (prev=NULL, q = V_ipfw_dyn_v[i] ; q ; ) { - /* - * Logic can become complex here, so we split tests. - */ - if (q == keep_me) - goto next; - if (rule != NULL && rule != q->rule) - goto next; /* not the one we are looking for */ - if (q->dyn_type == O_LIMIT_PARENT) { - /* - * handle parent in the second pass, - * record we need one. - */ - max_pass = 1; - if (pass == 0) - goto next; - if (FORCE && q->count != 0 ) { - /* XXX should not happen! */ - printf("ipfw: OUCH! cannot remove rule," - " count %d\n", q->count); - } - } else { - if (!FORCE && - !TIME_LEQ( q->expire, time_uptime )) - goto next; - } - if (q->dyn_type != O_LIMIT_PARENT || !q->count) { - UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); - continue; - } -next: - prev=q; - q=q->next; - } - } - if (pass++ < max_pass) - goto next_pass; -} - - -/** - * lookup a dynamic rule. - */ -static ipfw_dyn_rule * -lookup_dyn_rule_locked(struct ipfw_flow_id *pkt, int *match_direction, - struct tcphdr *tcp) -{ - /* - * stateful ipfw extensions. - * Lookup into dynamic session queue - */ -#define MATCH_REVERSE 0 -#define MATCH_FORWARD 1 -#define MATCH_NONE 2 -#define MATCH_UNKNOWN 3 - int i, dir = MATCH_NONE; - ipfw_dyn_rule *prev, *q=NULL; - - IPFW_DYN_LOCK_ASSERT(); - - if (V_ipfw_dyn_v == NULL) - goto done; /* not found */ - i = hash_packet( pkt ); - for (prev=NULL, q = V_ipfw_dyn_v[i] ; q != NULL ; ) { - if (q->dyn_type == O_LIMIT_PARENT && q->count) - goto next; - if (TIME_LEQ( q->expire, time_uptime)) { /* expire entry */ - UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); - continue; - } - if (pkt->proto == q->id.proto && - q->dyn_type != O_LIMIT_PARENT) { - if (IS_IP6_FLOW_ID(pkt)) { - if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), - &(q->id.src_ip6)) && - IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), - &(q->id.dst_ip6)) && - pkt->src_port == q->id.src_port && - pkt->dst_port == q->id.dst_port ) { - dir = MATCH_FORWARD; - break; - } - if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), - &(q->id.dst_ip6)) && - IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), - &(q->id.src_ip6)) && - pkt->src_port == q->id.dst_port && - pkt->dst_port == q->id.src_port ) { - dir = MATCH_REVERSE; - break; - } - } else { - if (pkt->src_ip == q->id.src_ip && - pkt->dst_ip == q->id.dst_ip && - pkt->src_port == q->id.src_port && - pkt->dst_port == q->id.dst_port ) { - dir = MATCH_FORWARD; - break; - } - if (pkt->src_ip == q->id.dst_ip && - pkt->dst_ip == q->id.src_ip && - pkt->src_port == q->id.dst_port && - pkt->dst_port == q->id.src_port ) { - dir = MATCH_REVERSE; - break; - } - } - } -next: - prev = q; - q = q->next; - } - if (q == NULL) - goto done; /* q = NULL, not found */ - - if ( prev != NULL) { /* found and not in front */ - prev->next = q->next; - q->next = V_ipfw_dyn_v[i]; - V_ipfw_dyn_v[i] = q; - } - if (pkt->proto == IPPROTO_TCP) { /* update state according to flags */ - u_char flags = pkt->flags & (TH_FIN|TH_SYN|TH_RST); - -#define BOTH_SYN (TH_SYN | (TH_SYN << 8)) -#define BOTH_FIN (TH_FIN | (TH_FIN << 8)) - q->state |= (dir == MATCH_FORWARD ) ? flags : (flags << 8); - switch (q->state) { - case TH_SYN: /* opening */ - q->expire = time_uptime + V_dyn_syn_lifetime; - break; - - case BOTH_SYN: /* move to established */ - case BOTH_SYN | TH_FIN : /* one side tries to close */ - case BOTH_SYN | (TH_FIN << 8) : - if (tcp) { -#define _SEQ_GE(a,b) ((int)(a) - (int)(b) >= 0) - u_int32_t ack = ntohl(tcp->th_ack); - if (dir == MATCH_FORWARD) { - if (q->ack_fwd == 0 || _SEQ_GE(ack, q->ack_fwd)) - q->ack_fwd = ack; - else { /* ignore out-of-sequence */ - break; - } - } else { - if (q->ack_rev == 0 || _SEQ_GE(ack, q->ack_rev)) - q->ack_rev = ack; - else { /* ignore out-of-sequence */ - break; - } - } - } - q->expire = time_uptime + V_dyn_ack_lifetime; - break; - - case BOTH_SYN | BOTH_FIN: /* both sides closed */ - if (V_dyn_fin_lifetime >= V_dyn_keepalive_period) - V_dyn_fin_lifetime = V_dyn_keepalive_period - 1; - q->expire = time_uptime + V_dyn_fin_lifetime; - break; - - default: -#if 0 - /* - * reset or some invalid combination, but can also - * occur if we use keep-state the wrong way. - */ - if ( (q->state & ((TH_RST << 8)|TH_RST)) == 0) - printf("invalid state: 0x%x\n", q->state); -#endif - if (V_dyn_rst_lifetime >= V_dyn_keepalive_period) - V_dyn_rst_lifetime = V_dyn_keepalive_period - 1; - q->expire = time_uptime + V_dyn_rst_lifetime; - break; - } - } else if (pkt->proto == IPPROTO_UDP) { - q->expire = time_uptime + V_dyn_udp_lifetime; - } else { - /* other protocols */ - q->expire = time_uptime + V_dyn_short_lifetime; - } -done: - if (match_direction) - *match_direction = dir; - return q; -} - -static ipfw_dyn_rule * -lookup_dyn_rule(struct ipfw_flow_id *pkt, int *match_direction, - struct tcphdr *tcp) -{ - ipfw_dyn_rule *q; - - IPFW_DYN_LOCK(); - q = lookup_dyn_rule_locked(pkt, match_direction, tcp); - if (q == NULL) - IPFW_DYN_UNLOCK(); - /* NB: return table locked when q is not NULL */ - return q; -} - -static void -realloc_dynamic_table(void) -{ - IPFW_DYN_LOCK_ASSERT(); - - /* - * Try reallocation, make sure we have a power of 2 and do - * not allow more than 64k entries. In case of overflow, - * default to 1024. - */ - - if (V_dyn_buckets > 65536) - V_dyn_buckets = 1024; - if ((V_dyn_buckets & (V_dyn_buckets-1)) != 0) { /* not a power of 2 */ - V_dyn_buckets = V_curr_dyn_buckets; /* reset */ - return; - } - V_curr_dyn_buckets = V_dyn_buckets; - if (V_ipfw_dyn_v != NULL) - free(V_ipfw_dyn_v, M_IPFW); - for (;;) { - V_ipfw_dyn_v = malloc(V_curr_dyn_buckets * sizeof(ipfw_dyn_rule *), - M_IPFW, M_NOWAIT | M_ZERO); - if (V_ipfw_dyn_v != NULL || V_curr_dyn_buckets <= 2) - break; - V_curr_dyn_buckets /= 2; - } -} - -/** - * Install state of type 'type' for a dynamic session. - * The hash table contains two type of rules: - * - regular rules (O_KEEP_STATE) - * - rules for sessions with limited number of sess per user - * (O_LIMIT). When they are created, the parent is - * increased by 1, and decreased on delete. In this case, - * the third parameter is the parent rule and not the chain. - * - "parent" rules for the above (O_LIMIT_PARENT). - */ -static ipfw_dyn_rule * -add_dyn_rule(struct ipfw_flow_id *id, u_int8_t dyn_type, struct ip_fw *rule) -{ - ipfw_dyn_rule *r; - int i; - - IPFW_DYN_LOCK_ASSERT(); - - if (V_ipfw_dyn_v == NULL || - (V_dyn_count == 0 && V_dyn_buckets != V_curr_dyn_buckets)) { - realloc_dynamic_table(); - if (V_ipfw_dyn_v == NULL) - return NULL; /* failed ! */ - } - i = hash_packet(id); - - r = uma_zalloc(ipfw_dyn_rule_zone, M_NOWAIT | M_ZERO); - if (r == NULL) { - printf ("ipfw: sorry cannot allocate state\n"); - return NULL; - } - - /* increase refcount on parent, and set pointer */ - if (dyn_type == O_LIMIT) { - ipfw_dyn_rule *parent = (ipfw_dyn_rule *)rule; - if ( parent->dyn_type != O_LIMIT_PARENT) - panic("invalid parent"); - parent->count++; - r->parent = parent; - rule = parent->rule; - } - - r->id = *id; - r->expire = time_uptime + V_dyn_syn_lifetime; - r->rule = rule; - r->dyn_type = dyn_type; - r->pcnt = r->bcnt = 0; - r->count = 0; - - r->bucket = i; - r->next = V_ipfw_dyn_v[i]; - V_ipfw_dyn_v[i] = r; - V_dyn_count++; - DEB(printf("ipfw: add dyn entry ty %d 0x%08x %d -> 0x%08x %d, total %d\n", - dyn_type, - (r->id.src_ip), (r->id.src_port), - (r->id.dst_ip), (r->id.dst_port), - V_dyn_count ); ) - return r; -} - -/** - * lookup dynamic parent rule using pkt and rule as search keys. - * If the lookup fails, then install one. - */ -static ipfw_dyn_rule * -lookup_dyn_parent(struct ipfw_flow_id *pkt, struct ip_fw *rule) -{ - ipfw_dyn_rule *q; - int i; - - IPFW_DYN_LOCK_ASSERT(); - - if (V_ipfw_dyn_v) { - int is_v6 = IS_IP6_FLOW_ID(pkt); - i = hash_packet( pkt ); - for (q = V_ipfw_dyn_v[i] ; q != NULL ; q=q->next) - if (q->dyn_type == O_LIMIT_PARENT && - rule== q->rule && - pkt->proto == q->id.proto && - pkt->src_port == q->id.src_port && - pkt->dst_port == q->id.dst_port && - ( - (is_v6 && - IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), - &(q->id.src_ip6)) && - IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), - &(q->id.dst_ip6))) || - (!is_v6 && - pkt->src_ip == q->id.src_ip && - pkt->dst_ip == q->id.dst_ip) - ) - ) { - q->expire = time_uptime + V_dyn_short_lifetime; - DEB(printf("ipfw: lookup_dyn_parent found 0x%p\n",q);) - return q; - } - } - return add_dyn_rule(pkt, O_LIMIT_PARENT, rule); -} - -/** - * Install dynamic state for rule type cmd->o.opcode - * - * Returns 1 (failure) if state is not installed because of errors or because - * session limitations are enforced. - */ -static int -install_state(struct ip_fw *rule, ipfw_insn_limit *cmd, - struct ip_fw_args *args, uint32_t tablearg) -{ - static int last_log; - ipfw_dyn_rule *q; - struct in_addr da; - char src[48], dst[48]; - - src[0] = '\0'; - dst[0] = '\0'; - - DEB( - printf("ipfw: %s: type %d 0x%08x %u -> 0x%08x %u\n", - __func__, cmd->o.opcode, - (args->f_id.src_ip), (args->f_id.src_port), - (args->f_id.dst_ip), (args->f_id.dst_port)); - ) - - IPFW_DYN_LOCK(); - - q = lookup_dyn_rule_locked(&args->f_id, NULL, NULL); - - if (q != NULL) { /* should never occur */ - if (last_log != time_uptime) { - last_log = time_uptime; - printf("ipfw: %s: entry already present, done\n", - __func__); - } - IPFW_DYN_UNLOCK(); - return (0); - } - - if (V_dyn_count >= V_dyn_max) - /* Run out of slots, try to remove any expired rule. */ - remove_dyn_rule(NULL, (ipfw_dyn_rule *)1); - - if (V_dyn_count >= V_dyn_max) { - if (last_log != time_uptime) { - last_log = time_uptime; - printf("ipfw: %s: Too many dynamic rules\n", __func__); - } - IPFW_DYN_UNLOCK(); - return (1); /* cannot install, notify caller */ - } - - switch (cmd->o.opcode) { - case O_KEEP_STATE: /* bidir rule */ - add_dyn_rule(&args->f_id, O_KEEP_STATE, rule); - break; - - case O_LIMIT: { /* limit number of sessions */ - struct ipfw_flow_id id; - ipfw_dyn_rule *parent; - uint32_t conn_limit; - uint16_t limit_mask = cmd->limit_mask; - - conn_limit = (cmd->conn_limit == IP_FW_TABLEARG) ? - tablearg : cmd->conn_limit; - - DEB( - if (cmd->conn_limit == IP_FW_TABLEARG) - printf("ipfw: %s: O_LIMIT rule, conn_limit: %u " - "(tablearg)\n", __func__, conn_limit); - else - printf("ipfw: %s: O_LIMIT rule, conn_limit: %u\n", - __func__, conn_limit); - ) - - id.dst_ip = id.src_ip = id.dst_port = id.src_port = 0; - id.proto = args->f_id.proto; - id.addr_type = args->f_id.addr_type; - id.fib = M_GETFIB(args->m); - - if (IS_IP6_FLOW_ID (&(args->f_id))) { - if (limit_mask & DYN_SRC_ADDR) - id.src_ip6 = args->f_id.src_ip6; - if (limit_mask & DYN_DST_ADDR) - id.dst_ip6 = args->f_id.dst_ip6; - } else { - if (limit_mask & DYN_SRC_ADDR) - id.src_ip = args->f_id.src_ip; - if (limit_mask & DYN_DST_ADDR) - id.dst_ip = args->f_id.dst_ip; - } - if (limit_mask & DYN_SRC_PORT) - id.src_port = args->f_id.src_port; - if (limit_mask & DYN_DST_PORT) - id.dst_port = args->f_id.dst_port; - if ((parent = lookup_dyn_parent(&id, rule)) == NULL) { - printf("ipfw: %s: add parent failed\n", __func__); - IPFW_DYN_UNLOCK(); - return (1); - } - - if (parent->count >= conn_limit) { - /* See if we can remove some expired rule. */ - remove_dyn_rule(rule, parent); - if (parent->count >= conn_limit) { - if (V_fw_verbose && last_log != time_uptime) { - last_log = time_uptime; -#ifdef INET6 - /* - * XXX IPv6 flows are not - * supported yet. - */ - if (IS_IP6_FLOW_ID(&(args->f_id))) { - char ip6buf[INET6_ADDRSTRLEN]; - snprintf(src, sizeof(src), - "[%s]", ip6_sprintf(ip6buf, - &args->f_id.src_ip6)); - snprintf(dst, sizeof(dst), - "[%s]", ip6_sprintf(ip6buf, - &args->f_id.dst_ip6)); - } else -#endif - { - da.s_addr = - htonl(args->f_id.src_ip); - inet_ntoa_r(da, src); - da.s_addr = - htonl(args->f_id.dst_ip); - inet_ntoa_r(da, dst); - } - log(LOG_SECURITY | LOG_DEBUG, - "ipfw: %d %s %s:%u -> %s:%u, %s\n", - parent->rule->rulenum, - "drop session", - src, (args->f_id.src_port), - dst, (args->f_id.dst_port), - "too many entries"); - } - IPFW_DYN_UNLOCK(); - return (1); - } - } - add_dyn_rule(&args->f_id, O_LIMIT, (struct ip_fw *)parent); - break; - } - default: - printf("ipfw: %s: unknown dynamic rule type %u\n", - __func__, cmd->o.opcode); - IPFW_DYN_UNLOCK(); - return (1); - } - - /* XXX just set lifetime */ - lookup_dyn_rule_locked(&args->f_id, NULL, NULL); - - IPFW_DYN_UNLOCK(); - return (0); -} - -/* - * Generate a TCP packet, containing either a RST or a keepalive. - * When flags & TH_RST, we are sending a RST packet, because of a - * "reset" action matched the packet. - * Otherwise we are sending a keepalive, and flags & TH_ - * The 'replyto' mbuf is the mbuf being replied to, if any, and is required - * so that MAC can label the reply appropriately. - */ -static struct mbuf * -send_pkt(struct mbuf *replyto, struct ipfw_flow_id *id, u_int32_t seq, - u_int32_t ack, int flags) -{ - struct mbuf *m; - struct ip *ip; - struct tcphdr *tcp; - - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == 0) - return (NULL); - m->m_pkthdr.rcvif = (struct ifnet *)0; - - M_SETFIB(m, id->fib); -#ifdef MAC - if (replyto != NULL) - mac_netinet_firewall_reply(replyto, m); - else - mac_netinet_firewall_send(m); -#else - (void)replyto; /* don't warn about unused arg */ -#endif - - m->m_pkthdr.len = m->m_len = sizeof(struct ip) + sizeof(struct tcphdr); - m->m_data += max_linkhdr; - - ip = mtod(m, struct ip *); - bzero(ip, m->m_len); - tcp = (struct tcphdr *)(ip + 1); /* no IP options */ - ip->ip_p = IPPROTO_TCP; - tcp->th_off = 5; - /* - * Assume we are sending a RST (or a keepalive in the reverse - * direction), swap src and destination addresses and ports. - */ - ip->ip_src.s_addr = htonl(id->dst_ip); - ip->ip_dst.s_addr = htonl(id->src_ip); - tcp->th_sport = htons(id->dst_port); - tcp->th_dport = htons(id->src_port); - if (flags & TH_RST) { /* we are sending a RST */ - if (flags & TH_ACK) { - tcp->th_seq = htonl(ack); - tcp->th_ack = htonl(0); - tcp->th_flags = TH_RST; - } else { - if (flags & TH_SYN) - seq++; - tcp->th_seq = htonl(0); - tcp->th_ack = htonl(seq); - tcp->th_flags = TH_RST | TH_ACK; - } - } else { - /* - * We are sending a keepalive. flags & TH_SYN determines - * the direction, forward if set, reverse if clear. - * NOTE: seq and ack are always assumed to be correct - * as set by the caller. This may be confusing... - */ - if (flags & TH_SYN) { - /* - * we have to rewrite the correct addresses! - */ - ip->ip_dst.s_addr = htonl(id->dst_ip); - ip->ip_src.s_addr = htonl(id->src_ip); - tcp->th_dport = htons(id->dst_port); - tcp->th_sport = htons(id->src_port); - } - tcp->th_seq = htonl(seq); - tcp->th_ack = htonl(ack); - tcp->th_flags = TH_ACK; - } - /* - * set ip_len to the payload size so we can compute - * the tcp checksum on the pseudoheader - * XXX check this, could save a couple of words ? - */ - ip->ip_len = htons(sizeof(struct tcphdr)); - tcp->th_sum = in_cksum(m, m->m_pkthdr.len); - /* - * now fill fields left out earlier - */ - ip->ip_ttl = V_ip_defttl; - ip->ip_len = m->m_pkthdr.len; - m->m_flags |= M_SKIP_FIREWALL; - return (m); -} /* * sends a reject message, consuming the mbuf passed as an argument. */ static void -send_reject(struct ip_fw_args *args, int code, int ip_len, struct ip *ip) +send_reject(struct ip_fw_args *args, int code, int iplen, struct ip *ip) { #if 0 @@ -1750,263 +602,35 @@ send_reject(struct ip_fw_args *args, int code, int ip_len, struct ip *ip) #endif if (code != ICMP_REJECT_RST) { /* Send an ICMP unreach */ /* We need the IP header in host order for icmp_error(). */ - if (args->eh != NULL) { - ip->ip_len = ntohs(ip->ip_len); - ip->ip_off = ntohs(ip->ip_off); - } + SET_HOST_IPLEN(ip); icmp_error(args->m, ICMP_UNREACH, code, 0L, 0); } else if (args->f_id.proto == IPPROTO_TCP) { struct tcphdr *const tcp = L3HDR(struct tcphdr, mtod(args->m, struct ip *)); if ( (tcp->th_flags & TH_RST) == 0) { struct mbuf *m; - m = send_pkt(args->m, &(args->f_id), + m = ipfw_send_pkt(args->m, &(args->f_id), ntohl(tcp->th_seq), ntohl(tcp->th_ack), tcp->th_flags | TH_RST); if (m != NULL) ip_output(m, NULL, NULL, 0, NULL, NULL); } - m_freem(args->m); + FREE_PKT(args->m); } else - m_freem(args->m); + FREE_PKT(args->m); args->m = NULL; } -/** - * - * Given an ip_fw *, lookup_next_rule will return a pointer - * to the next rule, which can be either the jump - * target (for skipto instructions) or the next one in the list (in - * all other cases including a missing jump target). - * The result is also written in the "next_rule" field of the rule. - * Backward jumps are not allowed, so start looking from the next - * rule... - * - * This never returns NULL -- in case we do not have an exact match, - * the next rule is returned. When the ruleset is changed, - * pointers are flushed so we are always correct. +/* + * Support for uid/gid/jail lookup. These tests are expensive + * (because we may need to look into the list of active sockets) + * so we cache the results. ugid_lookupp is 0 if we have not + * yet done a lookup, 1 if we succeeded, and -1 if we tried + * and failed. The function always returns the match value. + * We could actually spare the variable and use *uc, setting + * it to '(void *)check_uidgid if we have no info, NULL if + * we tried and failed, or any other value if successful. */ - -static struct ip_fw * -lookup_next_rule(struct ip_fw *me, u_int32_t tablearg) -{ - struct ip_fw *rule = NULL; - ipfw_insn *cmd; - u_int16_t rulenum; - - /* look for action, in case it is a skipto */ - cmd = ACTION_PTR(me); - if (cmd->opcode == O_LOG) - cmd += F_LEN(cmd); - if (cmd->opcode == O_ALTQ) - cmd += F_LEN(cmd); - if (cmd->opcode == O_TAG) - cmd += F_LEN(cmd); - if (cmd->opcode == O_SKIPTO ) { - if (tablearg != 0) { - rulenum = (u_int16_t)tablearg; - } else { - rulenum = cmd->arg1; - } - for (rule = me->next; rule ; rule = rule->next) { - if (rule->rulenum >= rulenum) { - break; - } - } - } - if (rule == NULL) /* failure or not a skipto */ - rule = me->next; - me->next_rule = rule; - return rule; -} - -static int -add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, - uint8_t mlen, uint32_t value) -{ - struct radix_node_head *rnh; - struct table_entry *ent; - struct radix_node *rn; - - if (tbl >= IPFW_TABLES_MAX) - return (EINVAL); - rnh = ch->tables[tbl]; - ent = malloc(sizeof(*ent), M_IPFW_TBL, M_NOWAIT | M_ZERO); - if (ent == NULL) - return (ENOMEM); - ent->value = value; - ent->addr.sin_len = ent->mask.sin_len = 8; - ent->mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); - ent->addr.sin_addr.s_addr = addr & ent->mask.sin_addr.s_addr; - IPFW_WLOCK(ch); - rn = rnh->rnh_addaddr(&ent->addr, &ent->mask, rnh, (void *)ent); - if (rn == NULL) { - IPFW_WUNLOCK(ch); - free(ent, M_IPFW_TBL); - return (EEXIST); - } - IPFW_WUNLOCK(ch); - return (0); -} - -static int -del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, - uint8_t mlen) -{ - struct radix_node_head *rnh; - struct table_entry *ent; - struct sockaddr_in sa, mask; - - if (tbl >= IPFW_TABLES_MAX) - return (EINVAL); - rnh = ch->tables[tbl]; - sa.sin_len = mask.sin_len = 8; - mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); - sa.sin_addr.s_addr = addr & mask.sin_addr.s_addr; - IPFW_WLOCK(ch); - ent = (struct table_entry *)rnh->rnh_deladdr(&sa, &mask, rnh); - if (ent == NULL) { - IPFW_WUNLOCK(ch); - return (ESRCH); - } - IPFW_WUNLOCK(ch); - free(ent, M_IPFW_TBL); - return (0); -} - -static int -flush_table_entry(struct radix_node *rn, void *arg) -{ - struct radix_node_head * const rnh = arg; - struct table_entry *ent; - - ent = (struct table_entry *) - rnh->rnh_deladdr(rn->rn_key, rn->rn_mask, rnh); - if (ent != NULL) - free(ent, M_IPFW_TBL); - return (0); -} - -static int -flush_table(struct ip_fw_chain *ch, uint16_t tbl) -{ - struct radix_node_head *rnh; - - IPFW_WLOCK_ASSERT(ch); - - if (tbl >= IPFW_TABLES_MAX) - return (EINVAL); - rnh = ch->tables[tbl]; - KASSERT(rnh != NULL, ("NULL IPFW table")); - rnh->rnh_walktree(rnh, flush_table_entry, rnh); - return (0); -} - -static void -flush_tables(struct ip_fw_chain *ch) -{ - uint16_t tbl; - - IPFW_WLOCK_ASSERT(ch); - - for (tbl = 0; tbl < IPFW_TABLES_MAX; tbl++) - flush_table(ch, tbl); -} - -static int -init_tables(struct ip_fw_chain *ch) -{ - int i; - uint16_t j; - - for (i = 0; i < IPFW_TABLES_MAX; i++) { - if (!rn_inithead((void **)&ch->tables[i], 32)) { - for (j = 0; j < i; j++) { - (void) flush_table(ch, j); - } - return (ENOMEM); - } - } - return (0); -} - -static int -lookup_table(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, - uint32_t *val) -{ - struct radix_node_head *rnh; - struct table_entry *ent; - struct sockaddr_in sa; - - if (tbl >= IPFW_TABLES_MAX) - return (0); - rnh = ch->tables[tbl]; - sa.sin_len = 8; - sa.sin_addr.s_addr = addr; - ent = (struct table_entry *)(rnh->rnh_lookup(&sa, NULL, rnh)); - if (ent != NULL) { - *val = ent->value; - return (1); - } - return (0); -} - -static int -count_table_entry(struct radix_node *rn, void *arg) -{ - u_int32_t * const cnt = arg; - - (*cnt)++; - return (0); -} - -static int -count_table(struct ip_fw_chain *ch, uint32_t tbl, uint32_t *cnt) -{ - struct radix_node_head *rnh; - - if (tbl >= IPFW_TABLES_MAX) - return (EINVAL); - rnh = ch->tables[tbl]; - *cnt = 0; - rnh->rnh_walktree(rnh, count_table_entry, cnt); - return (0); -} - -static int -dump_table_entry(struct radix_node *rn, void *arg) -{ - struct table_entry * const n = (struct table_entry *)rn; - ipfw_table * const tbl = arg; - ipfw_table_entry *ent; - - if (tbl->cnt == tbl->size) - return (1); - ent = &tbl->ent[tbl->cnt]; - ent->tbl = tbl->tbl; - if (in_nullhost(n->mask.sin_addr)) - ent->masklen = 0; - else - ent->masklen = 33 - ffs(ntohl(n->mask.sin_addr.s_addr)); - ent->addr = n->addr.sin_addr.s_addr; - ent->value = n->value; - tbl->cnt++; - return (0); -} - -static int -dump_table(struct ip_fw_chain *ch, ipfw_table *tbl) -{ - struct radix_node_head *rnh; - - if (tbl->tbl >= IPFW_TABLES_MAX) - return (EINVAL); - rnh = ch->tables[tbl->tbl]; - tbl->cnt = 0; - rnh->rnh_walktree(rnh, dump_table_entry, tbl); - return (0); -} - static int check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, struct in_addr dst_ip, u_int16_t dst_port, struct in_addr src_ip, @@ -2065,10 +689,8 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, INP_INFO_RUNLOCK(pi); if (*ugid_lookupp == 0) { /* - * If the lookup did not yield any results, there - * is no sense in coming back and trying again. So - * we can set lookup to -1 and ensure that we wont - * bother the pcb system again. + * We tried and failed, set the variable to -1 + * so we will not try again on this packet. */ *ugid_lookupp = -1; return (0); @@ -2083,6 +705,21 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, return match; } +/* + * Helper function to set args with info on the rule after the matching + * one. slot is precise, whereas we guess rule_id as they are + * assigned sequentially. + */ +static inline void +set_match(struct ip_fw_args *args, int slot, + struct ip_fw_chain *chain) +{ + args->rule.chain_id = chain->id; + args->rule.slot = slot + 1; /* we use 0 as a marker */ + args->rule.rule_id = 1 + chain->map[slot]->id; + args->rule.rulenum = chain->map[slot]->rulenum; +} + /* * The main check routine for the firewall. * @@ -2093,10 +730,10 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, * * args->m (in/out) The packet; we set to NULL when/if we nuke it. * Starts with the IP header. - * args->eh (in) Mac header if present, or NULL for layer3 packet. + * args->eh (in) Mac header if present, NULL for layer3 packet. * args->L3offset Number of bytes bypassed if we came from L2. * e.g. often sizeof(eh) ** NOTYET ** - * args->oif Outgoing interface, or NULL if packet is incoming. + * args->oif Outgoing interface, NULL if packet is incoming. * The incoming interface is in the mbuf. (in) * args->divert_rule (in/out) * Skip up to the first rule past this rule number; @@ -2105,7 +742,7 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, * args->rule Pointer to the last matching rule (in/out) * args->next_hop Socket we are forwarding to (out). * args->f_id Addresses grabbed from the packet (out) - * args->cookie a cookie depending on rule action + * args->rule.info a cookie depending on rule action * * Return value: * @@ -2115,6 +752,8 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif, * IP_FW_TEE tee packet, port in m_tag * IP_FW_DUMMYNET to dummynet, pipe in args->cookie * IP_FW_NETGRAPH into netgraph, cookie args->cookie + * args->rule contains the matching rule, + * args->rule.info has additional information. * */ int @@ -2122,7 +761,7 @@ ipfw_chk(struct ip_fw_args *args) { /* - * Local variables holding state during the processing of a packet: + * Local variables holding state while processing a packet: * * IMPORTANT NOTE: to speed up the processing of rules, there * are some assumption on the values of the variables, which @@ -2158,14 +797,6 @@ ipfw_chk(struct ip_fw_args *args) struct ucred *ucred_cache = NULL; int ucred_lookup = 0; - /* - * divinput_flags If non-zero, set to the IP_FW_DIVERT_*_FLAG - * associated with a packet input on a divert socket. This - * will allow to distinguish traffic and its direction when - * it originates from a divert socket. - */ - u_int divinput_flags = 0; - /* * oif | args->oif If NULL, ipfw_chk has been called on the * inbound path (ether_input, ip_input). @@ -2174,7 +805,7 @@ ipfw_chk(struct ip_fw_args *args) */ struct ifnet *oif = args->oif; - struct ip_fw *f = NULL; /* matching rule */ + int f_pos = 0; /* index of current rule in the array */ int retval = 0; /* @@ -2209,12 +840,12 @@ ipfw_chk(struct ip_fw_args *args) * src_ip, dst_ip ip addresses, in NETWORK format. * Only valid for IPv4 packets. */ - u_int8_t proto; - u_int16_t src_port = 0, dst_port = 0; /* NOTE: host format */ + uint8_t proto; + uint16_t src_port = 0, dst_port = 0; /* NOTE: host format */ struct in_addr src_ip, dst_ip; /* NOTE: network format */ - u_int16_t ip_len=0; + uint16_t iplen=0; int pktlen; - u_int16_t etype = 0; /* Host order stored ether type */ + uint16_t etype = 0; /* Host order stored ether type */ /* * dyn_dir = MATCH_UNKNOWN when rules unchecked, @@ -2224,7 +855,6 @@ ipfw_chk(struct ip_fw_args *args) int dyn_dir = MATCH_UNKNOWN; ipfw_dyn_rule *q = NULL; struct ip_fw_chain *chain = &V_layer3_chain; - struct m_tag *mtag; /* * We store in ulp a pointer to the upper layer protocol header. @@ -2239,10 +869,13 @@ ipfw_chk(struct ip_fw_args *args) /* end of ipv6 variables */ int is_ipv4 = 0; + int done = 0; /* flag to exit the outer loop */ + if (m->m_flags & M_SKIP_FIREWALL || (! V_ipfw_vnet_ready)) return (IP_FW_PASS); /* accept */ dst_ip.s_addr = 0; /* make sure it is initialized */ + src_ip.s_addr = 0; /* make sure it is initialized */ pktlen = m->m_pkthdr.len; args->f_id.fib = M_GETFIB(m); /* note mbuf not altered) */ proto = args->f_id.proto = 0; /* mark f_id invalid */ @@ -2254,15 +887,15 @@ ipfw_chk(struct ip_fw_args *args) * pointer might become stale after other pullups (but we never use it * this way). */ -#define PULLUP_TO(len, p, T) \ -do { \ - int x = (len) + sizeof(T); \ - if ((m)->m_len < x) { \ - args->m = m = m_pullup(m, x); \ - if (m == NULL) \ - goto pullup_failed; \ - } \ - p = (mtod(m, char *) + (len)); \ +#define PULLUP_TO(_len, p, T) \ +do { \ + int x = (_len) + sizeof(T); \ + if ((m)->m_len < x) { \ + args->m = m = m_pullup(m, x); \ + if (m == NULL) \ + goto pullup_failed; \ + } \ + p = (mtod(m, char *) + (_len)); \ } while (0) /* @@ -2449,14 +1082,9 @@ do { \ proto = ip->ip_p; src_ip = ip->ip_src; dst_ip = ip->ip_dst; - if (args->eh != NULL) { /* layer 2 packets are as on the wire */ - offset = ntohs(ip->ip_off) & IP_OFFMASK; - ip_len = ntohs(ip->ip_len); - } else { - offset = ip->ip_off & IP_OFFMASK; - ip_len = ip->ip_len; - } - pktlen = ip_len < pktlen ? ip_len : pktlen; + offset = ntohs(ip->ip_off) & IP_OFFMASK; + iplen = ntohs(ip->ip_len); + pktlen = iplen < pktlen ? iplen : pktlen; if (offset == 0) { switch (proto) { @@ -2495,64 +1123,51 @@ do { \ } IPFW_RLOCK(chain); - mtag = m_tag_find(m, PACKET_TAG_DIVERT, NULL); - if (args->rule) { - /* - * Packet has already been tagged. Look for the next rule - * to restart processing. Make sure that args->rule still - * exists and not changed. - */ - if (chain->id != args->chain_id) { - for (f = chain->rules; f != NULL; f = f->next) - if (f == args->rule && f->id == args->rule_id) - break; - - if (f != NULL) - f = f->next_rule; - else - f = ip_fw_default_rule; - } else - f = args->rule->next_rule; - - if (f == NULL) - f = lookup_next_rule(args->rule, 0); - } else { - /* - * Find the starting rule. It can be either the first - * one, or the one after divert_rule if asked so. - */ - int skipto = mtag ? divert_cookie(mtag) : 0; - - f = chain->rules; - if (args->eh == NULL && skipto != 0) { - if (skipto >= IPFW_DEFAULT_RULE) { - IPFW_RUNLOCK(chain); - return (IP_FW_DENY); /* invalid */ - } - while (f && f->rulenum <= skipto) - f = f->next; - if (f == NULL) { /* drop packet */ - IPFW_RUNLOCK(chain); - return (IP_FW_DENY); - } - } + if (! V_ipfw_vnet_ready) { /* shutting down, leave NOW. */ + IPFW_RUNLOCK(chain); + return (IP_FW_PASS); /* accept */ } - /* reset divert rule to avoid confusion later */ - if (mtag) { - divinput_flags = divert_info(mtag) & - (IP_FW_DIVERT_OUTPUT_FLAG | IP_FW_DIVERT_LOOPBACK_FLAG); - m_tag_delete(m, mtag); + if (args->rule.slot) { + /* + * Packet has already been tagged as a result of a previous + * match on rule args->rule aka args->rule_id (PIPE, QUEUE, + * REASS, NETGRAPH, DIVERT/TEE...) + * Validate the slot and continue from the next one + * if still present, otherwise do a lookup. + */ + f_pos = (args->rule.chain_id == chain->id) ? + args->rule.slot : + ipfw_find_rule(chain, args->rule.rulenum, + args->rule.rule_id); + } else { + f_pos = 0; } /* * Now scan the rules, and parse microinstructions for each rule. + * We have two nested loops and an inner switch. Sometimes we + * need to break out of one or both loops, or re-enter one of + * the loops with updated variables. Loop variables are: + * + * f_pos (outer loop) points to the current rule. + * On output it points to the matching rule. + * done (outer loop) is used as a flag to break the loop. + * l (inner loop) residual length of current rule. + * cmd points to the current microinstruction. + * + * We break the inner loop by setting l=0 and possibly + * cmdlen=0 if we don't want to advance cmd. + * We break the outer loop by setting done=1 + * We can restart the inner loop by setting l>0 and f_pos, f, cmd + * as needed. */ - for (; f; f = f->next) { + for (; f_pos < chain->n_rules; f_pos++) { ipfw_insn *cmd; uint32_t tablearg = 0; int l, cmdlen, skip_or; /* skip rest of OR block */ + struct ip_fw *f; -again: + f = chain->map[f_pos]; if (V_set_disable & (1 << f->set) ) continue; @@ -2567,7 +1182,7 @@ again: * the target rule. */ -check_body: +/* check_body: */ cmdlen = F_LEN(cmd); /* * An OR block (insn_1 || .. || insn_n) has the @@ -2677,10 +1292,15 @@ check_body: break; case O_DIVERTED: - match = (cmd->arg1 & 1 && divinput_flags & - IP_FW_DIVERT_LOOPBACK_FLAG) || - (cmd->arg1 & 2 && divinput_flags & - IP_FW_DIVERT_OUTPUT_FLAG); + { + /* For diverted packets, args->rule.info + * contains the divert port (in host format) + * reason and direction. + */ + uint32_t i = args->rule.info; + match = (i&IPFW_IS_MASK) == IPFW_IS_DIVERT && + cmd->arg1 & ((i & IPFW_INFO_IN) ? 1 : 2); + } break; case O_PROTO: @@ -2700,13 +1320,46 @@ check_body: case O_IP_SRC_LOOKUP: case O_IP_DST_LOOKUP: if (is_ipv4) { - uint32_t a = + uint32_t key = (cmd->opcode == O_IP_DST_LOOKUP) ? dst_ip.s_addr : src_ip.s_addr; uint32_t v = 0; - match = lookup_table(chain, cmd->arg1, a, - &v); + if (cmdlen > F_INSN_SIZE(ipfw_insn_u32)) { + /* generic lookup. The key must be + * in 32bit big-endian format. + */ + v = ((ipfw_insn_u32 *)cmd)->d[1]; + if (v == 0) + key = dst_ip.s_addr; + else if (v == 1) + key = src_ip.s_addr; + else if (offset != 0) + break; + else if (proto != IPPROTO_TCP && + proto != IPPROTO_UDP) + break; + else if (v == 2) + key = htonl(dst_port); + else if (v == 3) + key = htonl(src_port); + else if (v == 4 || v == 5) { + check_uidgid( + (ipfw_insn_u32 *)cmd, + proto, oif, + dst_ip, dst_port, + src_ip, src_port, &ucred_cache, + &ucred_lookup, args->inp); + if (v == 4 /* O_UID */) + key = ucred_cache->cr_uid; + else if (v == 5 /* O_JAIL */) + key = ucred_cache->cr_prison->pr_id; + key = htonl(key); + } else + break; + } + match = ipfw_lookup_table(chain, + cmd->arg1, key, &v); if (!match) break; if (cmdlen == F_INSN_SIZE(ipfw_insn_u32)) @@ -2737,7 +1390,14 @@ check_body: INADDR_TO_IFP(src_ip, tif); match = (tif != NULL); + break; } + /* FALLTHROUGH */ +#ifdef INET6 + case O_IP6_SRC_ME: + match = is_ipv6 && + search_ip6_addr_net(&args->f_id.src_ip6); +#endif break; case O_IP_DST_SET: @@ -2770,7 +1430,14 @@ check_body: INADDR_TO_IFP(dst_ip, tif); match = (tif != NULL); + break; } + /* FALLTHROUGH */ +#ifdef INET6 + case O_IP6_DST_ME: + match = is_ipv6 && + search_ip6_addr_net(&args->f_id.dst_ip6); +#endif break; case O_IP_SRCPORT: @@ -2829,7 +1496,7 @@ check_body: int i; if (cmd->opcode == O_IPLEN) - x = ip_len; + x = iplen; else if (cmd->opcode == O_IPTTL) x = ip->ip_ttl; else /* must be IPID */ @@ -2864,7 +1531,7 @@ check_body: int i; tcp = TCP(ulp); - x = ip_len - + x = iplen - ((ip->ip_hl + tcp->th_off) << 2); if (cmdlen == 1) { match = (cmd->arg1 == x); @@ -2939,8 +1606,7 @@ check_body: } case O_LOG: - if (V_fw_verbose) - ipfw_log(f, hlen, args, m, + ipfw_log(f, hlen, args, m, oif, offset, tablearg, ip); match = 1; break; @@ -3039,14 +1705,6 @@ check_body: } break; - case O_IP6_SRC_ME: - match= is_ipv6 && search_ip6_addr_net(&args->f_id.src_ip6); - break; - - case O_IP6_DST_ME: - match= is_ipv6 && search_ip6_addr_net(&args->f_id.dst_ip6); - break; - case O_FLOW6ID: match = is_ipv6 && flow6id_match(args->f_id.flow_id6, @@ -3068,6 +1726,7 @@ check_body: break; case O_TAG: { + struct m_tag *mtag; uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; @@ -3084,12 +1743,13 @@ check_body: if (cmd->len & F_NOT) { /* `untag' action */ if (mtag != NULL) m_tag_delete(m, mtag); + match = 0; } else if (mtag == NULL) { if ((mtag = m_tag_alloc(MTAG_IPFW, tag, 0, M_NOWAIT)) != NULL) m_tag_prepend(m, mtag); + match = 1; } - match = (cmd->len & F_NOT) ? 0: 1; break; } @@ -3099,6 +1759,7 @@ check_body: break; case O_TAGGED: { + struct m_tag *mtag; uint32_t tag = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg : cmd->arg1; @@ -3138,14 +1799,13 @@ check_body: * * In general, here we set retval and terminate the * outer loop (would be a 'break 3' in some language, - * but we need to do a 'goto done'). + * but we need to set l=0, done=1) * * Exceptions: * O_COUNT and O_SKIPTO actions: * instead of terminating, we jump to the next rule - * ('goto next_rule', equivalent to a 'break 2'), - * or to the SKIPTO target ('goto again' after - * having set f, cmd and l), respectively. + * (setting l=0), or to the SKIPTO target (setting + * f/f_len, cmd and l as needed), respectively. * * O_TAG, O_LOG and O_ALTQ action parameters: * perform some action and set match = 1; @@ -3156,25 +1816,28 @@ check_body: * These opcodes try to install an entry in the * state tables; if successful, we continue with * the next opcode (match=1; break;), otherwise - * the packet * must be dropped - * ('goto done' after setting retval); + * the packet must be dropped (set retval, + * break loops with l=0, done=1) * * O_PROBE_STATE and O_CHECK_STATE: these opcodes * cause a lookup of the state table, and a jump * to the 'action' part of the parent rule - * ('goto check_body') if an entry is found, or + * if an entry is found, or * (CHECK_STATE only) a jump to the next rule if - * the entry is not found ('goto next_rule'). - * The result of the lookup is cached to make - * further instances of these opcodes are - * effectively NOPs. + * the entry is not found. + * The result of the lookup is cached so that + * further instances of these opcodes become NOPs. + * The jump to the next rule is done by setting + * l=0, cmdlen=0. */ case O_LIMIT: case O_KEEP_STATE: - if (install_state(f, + if (ipfw_install_state(f, (ipfw_insn_limit *)cmd, args, tablearg)) { + /* error or limit violation */ retval = IP_FW_DENY; - goto done; /* error/limit violation */ + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ } match = 1; break; @@ -3191,22 +1854,32 @@ check_body: * to be run first). */ if (dyn_dir == MATCH_UNKNOWN && - (q = lookup_dyn_rule(&args->f_id, + (q = ipfw_lookup_dyn_rule(&args->f_id, &dyn_dir, proto == IPPROTO_TCP ? TCP(ulp) : NULL)) != NULL) { /* * Found dynamic entry, update stats * and jump to the 'action' part of - * the parent rule. + * the parent rule by setting + * f, cmd, l and clearing cmdlen. */ q->pcnt++; q->bcnt += pktlen; + /* XXX we would like to have f_pos + * readily accessible in the dynamic + * rule, instead of having to + * lookup q->rule. + */ f = q->rule; + f_pos = ipfw_find_rule(chain, + f->rulenum, f->id); cmd = ACTION_PTR(f); l = f->cmd_len - f->act_ofs; - IPFW_DYN_UNLOCK(); - goto check_body; + ipfw_dyn_unlock(); + cmdlen = 0; + match = 1; + break; } /* * Dynamic entry not found. If CHECK_STATE, @@ -3214,70 +1887,96 @@ check_body: * ignore and continue with next opcode. */ if (cmd->opcode == O_CHECK_STATE) - goto next_rule; + l = 0; /* exit inner loop */ match = 1; break; case O_ACCEPT: retval = 0; /* accept */ - goto done; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; case O_PIPE: case O_QUEUE: - args->rule = f; /* report matching rule */ - args->rule_id = f->id; - args->chain_id = chain->id; - if (cmd->arg1 == IP_FW_TABLEARG) - args->cookie = tablearg; - else - args->cookie = cmd->arg1; + set_match(args, f_pos, chain); + args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + if (cmd->opcode == O_PIPE) + args->rule.info |= IPFW_IS_PIPE; + if (V_fw_one_pass) + args->rule.info |= IPFW_ONEPASS; retval = IP_FW_DUMMYNET; - goto done; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; case O_DIVERT: - case O_TEE: { - struct divert_tag *dt; - + case O_TEE: if (args->eh) /* not on layer 2 */ - break; - mtag = m_tag_get(PACKET_TAG_DIVERT, - sizeof(struct divert_tag), - M_NOWAIT); - if (mtag == NULL) { - /* XXX statistic */ - /* drop packet */ - IPFW_RUNLOCK(chain); - if (ucred_cache != NULL) - crfree(ucred_cache); - return (IP_FW_DENY); - } - dt = (struct divert_tag *)(mtag+1); - dt->cookie = f->rulenum; - if (cmd->arg1 == IP_FW_TABLEARG) - dt->info = tablearg; - else - dt->info = cmd->arg1; - m_tag_prepend(m, mtag); + break; + /* otherwise this is terminal */ + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ retval = (cmd->opcode == O_DIVERT) ? - IP_FW_DIVERT : IP_FW_TEE; - goto done; - } + IP_FW_DIVERT : IP_FW_TEE; + set_match(args, f_pos, chain); + args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + break; + case O_COUNT: - case O_SKIPTO: f->pcnt++; /* update stats */ f->bcnt += pktlen; f->timestamp = time_uptime; - if (cmd->opcode == O_COUNT) - goto next_rule; - /* handle skipto */ - if (cmd->arg1 == IP_FW_TABLEARG) { - f = lookup_next_rule(f, tablearg); - } else { - if (f->next_rule == NULL) - lookup_next_rule(f, 0); - f = f->next_rule; + l = 0; /* exit inner loop */ + break; + + case O_SKIPTO: + f->pcnt++; /* update stats */ + f->bcnt += pktlen; + f->timestamp = time_uptime; + /* If possible use cached f_pos (in f->next_rule), + * whose version is written in f->next_rule + * (horrible hacks to avoid changing the ABI). + */ + if (cmd->arg1 != IP_FW_TABLEARG && + (uintptr_t)f->x_next == chain->id) { + f_pos = (uintptr_t)f->next_rule; + } else { + int i = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + /* make sure we do not jump backward */ + if (i <= f->rulenum) + i = f->rulenum + 1; + f_pos = ipfw_find_rule(chain, i, 0); + /* update the cache */ + if (cmd->arg1 != IP_FW_TABLEARG) { + f->next_rule = + (void *)(uintptr_t)f_pos; + f->x_next = + (void *)(uintptr_t)chain->id; } - goto again; + } + /* + * Skip disabled rules, and re-enter + * the inner loop with the correct + * f_pos, f, l and cmd. + * Also clear cmdlen and skip_or + */ + for (; f_pos < chain->n_rules - 1 && + (V_set_disable & + (1 << chain->map[f_pos]->set)); + f_pos++) + ; + /* prepare to enter the inner loop */ + f = chain->map[f_pos]; + l = f->cmd_len; + cmd = f->cmd; + match = 1; + cmdlen = 0; + skip_or = 0; + break; case O_REJECT: /* @@ -3290,7 +1989,7 @@ check_body: is_icmp_query(ICMP(ulp))) && !(m->m_flags & (M_BCAST|M_MCAST)) && !IN_MULTICAST(ntohl(dst_ip.s_addr))) { - send_reject(args, cmd->arg1, ip_len, ip); + send_reject(args, cmd->arg1, iplen, ip); m = args->m; } /* FALLTHROUGH */ @@ -3311,41 +2010,41 @@ check_body: #endif case O_DENY: retval = IP_FW_DENY; - goto done; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; - case O_FORWARD_IP: { - struct sockaddr_in *sa; - sa = &(((ipfw_insn_sa *)cmd)->sa); + case O_FORWARD_IP: if (args->eh) /* not valid on layer2 pkts */ break; if (!q || dyn_dir == MATCH_FORWARD) { - if (sa->sin_addr.s_addr == INADDR_ANY) { - bcopy(sa, &args->hopstore, + struct sockaddr_in *sa; + sa = &(((ipfw_insn_sa *)cmd)->sa); + if (sa->sin_addr.s_addr == INADDR_ANY) { + bcopy(sa, &args->hopstore, sizeof(*sa)); - args->hopstore.sin_addr.s_addr = + args->hopstore.sin_addr.s_addr = htonl(tablearg); - args->next_hop = - &args->hopstore; - } else { - args->next_hop = sa; - } + args->next_hop = &args->hopstore; + } else { + args->next_hop = sa; + } } retval = IP_FW_PASS; - } - goto done; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; case O_NETGRAPH: case O_NGTEE: - args->rule = f; /* report matching rule */ - args->rule_id = f->id; - args->chain_id = chain->id; - if (cmd->arg1 == IP_FW_TABLEARG) - args->cookie = tablearg; - else - args->cookie = cmd->arg1; + set_match(args, f_pos, chain); + args->rule.info = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; retval = (cmd->opcode == O_NETGRAPH) ? IP_FW_NETGRAPH : IP_FW_NGTEE; - goto done; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; case O_SETFIB: f->pcnt++; /* update stats */ @@ -3353,88 +2052,86 @@ check_body: f->timestamp = time_uptime; M_SETFIB(m, cmd->arg1); args->f_id.fib = cmd->arg1; - goto next_rule; + l = 0; /* exit inner loop */ + break; - case O_NAT: { - struct cfg_nat *t; - int nat_id; + case O_NAT: + if (!IPFW_NAT_LOADED) { + retval = IP_FW_DENY; + } else { + struct cfg_nat *t; + int nat_id; + + set_match(args, f_pos, chain); + t = ((ipfw_insn_nat *)cmd)->nat; + if (t == NULL) { + nat_id = (cmd->arg1 == IP_FW_TABLEARG) ? + tablearg : cmd->arg1; + t = (*lookup_nat_ptr)(&chain->nat, nat_id); - if (IPFW_NAT_LOADED) { - args->rule = f; /* Report matching rule. */ - args->rule_id = f->id; - args->chain_id = chain->id; - t = ((ipfw_insn_nat *)cmd)->nat; if (t == NULL) { - nat_id = (cmd->arg1 == IP_FW_TABLEARG) ? - tablearg : cmd->arg1; - LOOKUP_NAT(V_layer3_chain, nat_id, t); - if (t == NULL) { - retval = IP_FW_DENY; - goto done; - } - if (cmd->arg1 != IP_FW_TABLEARG) - ((ipfw_insn_nat *)cmd)->nat = t; + retval = IP_FW_DENY; + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; } - retval = ipfw_nat_ptr(args, t, m); - } else - retval = IP_FW_DENY; - goto done; - } + if (cmd->arg1 != IP_FW_TABLEARG) + ((ipfw_insn_nat *)cmd)->nat = t; + } + retval = ipfw_nat_ptr(args, t, m); + } + l = 0; /* exit inner loop */ + done = 1; /* exit outer loop */ + break; case O_REASS: { int ip_off; f->pcnt++; f->bcnt += pktlen; - ip_off = (args->eh != NULL) ? ntohs(ip->ip_off) : ip->ip_off; - if (ip_off & (IP_MF | IP_OFFMASK)) { - /* - * ip_reass() expects len & off in host - * byte order: fix them in case we come - * from layer2. - */ - if (args->eh != NULL) { - ip->ip_len = ntohs(ip->ip_len); - ip->ip_off = ntohs(ip->ip_off); - } + l = 0; /* in any case exit inner loop */ + ip_off = ntohs(ip->ip_off); - m = ip_reass(m); - args->m = m; - - /* - * IP header checksum fixup after - * reassembly and leave header - * in network byte order. - */ - if (m != NULL) { - int hlen; - - ip = mtod(m, struct ip *); - hlen = ip->ip_hl << 2; - /* revert len & off for layer2 pkts */ - if (args->eh != NULL) - ip->ip_len = htons(ip->ip_len); - ip->ip_sum = 0; - if (hlen == sizeof(struct ip)) - ip->ip_sum = in_cksum_hdr(ip); - else - ip->ip_sum = in_cksum(m, hlen); - retval = IP_FW_REASS; - args->rule = f; - args->rule_id = f->id; - args->chain_id = chain->id; - goto done; - } else { - retval = IP_FW_DENY; - goto done; - } + /* if not fragmented, go to next rule */ + if ((ip_off & (IP_MF | IP_OFFMASK)) == 0) + break; + /* + * ip_reass() expects len & off in host + * byte order. + */ + SET_HOST_IPLEN(ip); + + args->m = m = ip_reass(m); + + /* + * do IP header checksum fixup. + */ + if (m == NULL) { /* fragment got swallowed */ + retval = IP_FW_DENY; + } else { /* good, packet complete */ + int hlen; + + ip = mtod(m, struct ip *); + hlen = ip->ip_hl << 2; + SET_NET_IPLEN(ip); + ip->ip_sum = 0; + if (hlen == sizeof(struct ip)) + ip->ip_sum = in_cksum_hdr(ip); + else + ip->ip_sum = in_cksum(m, hlen); + retval = IP_FW_REASS; + set_match(args, f_pos, chain); } - goto next_rule; + done = 1; /* exit outer loop */ + break; } default: panic("-- unknown opcode %d\n", cmd->opcode); } /* end of switch() on opcodes */ + /* + * if we get here with l=0, then match is irrelevant. + */ if (cmd->len & F_NOT) match = !match; @@ -3447,22 +2144,25 @@ check_body: break; /* try next rule */ } - } /* end of inner for, scan opcodes */ + } /* end of inner loop, scan opcodes */ -next_rule:; /* try next rule */ + if (done) + break; + +/* next_rule:; */ /* try next rule */ } /* end of outer for, scan rules */ - printf("ipfw: ouch!, skip past end of rules, denying packet\n"); - IPFW_RUNLOCK(chain); - if (ucred_cache != NULL) - crfree(ucred_cache); - return (IP_FW_DENY); -done: - /* Update statistics */ - f->pcnt++; - f->bcnt += pktlen; - f->timestamp = time_uptime; + if (done) { + struct ip_fw *rule = chain->map[f_pos]; + /* Update statistics */ + rule->pcnt++; + rule->bcnt += pktlen; + rule->timestamp = time_uptime; + } else { + retval = IP_FW_DENY; + printf("ipfw: ouch!, skip past end of rules, denying packet\n"); + } IPFW_RUNLOCK(chain); if (ucred_cache != NULL) crfree(ucred_cache); @@ -3475,1113 +2175,10 @@ pullup_failed: } /* - * When a rule is added/deleted, clear the next_rule pointers in all rules. - * These will be reconstructed on the fly as packets are matched. + * Module and VNET glue */ -static void -flush_rule_ptrs(struct ip_fw_chain *chain) -{ - struct ip_fw *rule; - - IPFW_WLOCK_ASSERT(chain); - - chain->id++; - - for (rule = chain->rules; rule; rule = rule->next) - rule->next_rule = NULL; -} /* - * Add a new rule to the list. Copy the rule into a malloc'ed area, then - * possibly create a rule number and add the rule to the list. - * Update the rule_number in the input struct so the caller knows it as well. - */ -static int -add_rule(struct ip_fw_chain *chain, struct ip_fw *input_rule) -{ - struct ip_fw *rule, *f, *prev; - int l = RULESIZE(input_rule); - - if (chain->rules == NULL && input_rule->rulenum != IPFW_DEFAULT_RULE) - return (EINVAL); - - rule = malloc(l, M_IPFW, M_NOWAIT | M_ZERO); - if (rule == NULL) - return (ENOSPC); - - bcopy(input_rule, rule, l); - - rule->next = NULL; - rule->next_rule = NULL; - - rule->pcnt = 0; - rule->bcnt = 0; - rule->timestamp = 0; - - IPFW_WLOCK(chain); - - if (chain->rules == NULL) { /* default rule */ - chain->rules = rule; - rule->id = ++chain->id; - goto done; - } - - /* - * If rulenum is 0, find highest numbered rule before the - * default rule, and add autoinc_step - */ - if (V_autoinc_step < 1) - V_autoinc_step = 1; - else if (V_autoinc_step > 1000) - V_autoinc_step = 1000; - if (rule->rulenum == 0) { - /* - * locate the highest numbered rule before default - */ - for (f = chain->rules; f; f = f->next) { - if (f->rulenum == IPFW_DEFAULT_RULE) - break; - rule->rulenum = f->rulenum; - } - if (rule->rulenum < IPFW_DEFAULT_RULE - V_autoinc_step) - rule->rulenum += V_autoinc_step; - input_rule->rulenum = rule->rulenum; - } - - /* - * Now insert the new rule in the right place in the sorted list. - */ - for (prev = NULL, f = chain->rules; f; prev = f, f = f->next) { - if (f->rulenum > rule->rulenum) { /* found the location */ - if (prev) { - rule->next = f; - prev->next = rule; - } else { /* head insert */ - rule->next = chain->rules; - chain->rules = rule; - } - break; - } - } - flush_rule_ptrs(chain); - /* chain->id incremented inside flush_rule_ptrs() */ - rule->id = chain->id; -done: - V_static_count++; - V_static_len += l; - IPFW_WUNLOCK(chain); - DEB(printf("ipfw: installed rule %d, static count now %d\n", - rule->rulenum, V_static_count);) - return (0); -} - -/** - * Remove a static rule (including derived * dynamic rules) - * and place it on the ``reap list'' for later reclamation. - * The caller is in charge of clearing rule pointers to avoid - * dangling pointers. - * @return a pointer to the next entry. - * Arguments are not checked, so they better be correct. - */ -static struct ip_fw * -remove_rule(struct ip_fw_chain *chain, struct ip_fw *rule, - struct ip_fw *prev) -{ - struct ip_fw *n; - int l = RULESIZE(rule); - - IPFW_WLOCK_ASSERT(chain); - - n = rule->next; - IPFW_DYN_LOCK(); - remove_dyn_rule(rule, NULL /* force removal */); - IPFW_DYN_UNLOCK(); - if (prev == NULL) - chain->rules = n; - else - prev->next = n; - V_static_count--; - V_static_len -= l; - - rule->next = chain->reap; - chain->reap = rule; - - return n; -} - -/* - * Reclaim storage associated with a list of rules. This is - * typically the list created using remove_rule. - * A NULL pointer on input is handled correctly. - */ -static void -reap_rules(struct ip_fw *head) -{ - struct ip_fw *rule; - - while ((rule = head) != NULL) { - head = head->next; - free(rule, M_IPFW); - } -} - -/* - * Remove all rules from a chain (except rules in set RESVD_SET - * unless kill_default = 1). The caller is responsible for - * reclaiming storage for the rules left in chain->reap. - */ -static void -free_chain(struct ip_fw_chain *chain, int kill_default) -{ - struct ip_fw *prev, *rule; - - IPFW_WLOCK_ASSERT(chain); - - chain->reap = NULL; - flush_rule_ptrs(chain); /* more efficient to do outside the loop */ - for (prev = NULL, rule = chain->rules; rule ; ) - if (kill_default || rule->set != RESVD_SET) - rule = remove_rule(chain, rule, prev); - else { - prev = rule; - rule = rule->next; - } -} - -/** - * Remove all rules with given number, and also do set manipulation. - * Assumes chain != NULL && *chain != NULL. - * - * The argument is an u_int32_t. The low 16 bit are the rule or set number, - * the next 8 bits are the new set, the top 8 bits are the command: - * - * 0 delete rules with given number - * 1 delete rules with given set number - * 2 move rules with given number to new set - * 3 move rules with given set number to new set - * 4 swap sets with given numbers - * 5 delete rules with given number and with given set number - */ -static int -del_entry(struct ip_fw_chain *chain, u_int32_t arg) -{ - struct ip_fw *prev = NULL, *rule; - u_int16_t rulenum; /* rule or old_set */ - u_int8_t cmd, new_set; - - rulenum = arg & 0xffff; - cmd = (arg >> 24) & 0xff; - new_set = (arg >> 16) & 0xff; - - if (cmd > 5 || new_set > RESVD_SET) - return EINVAL; - if (cmd == 0 || cmd == 2 || cmd == 5) { - if (rulenum >= IPFW_DEFAULT_RULE) - return EINVAL; - } else { - if (rulenum > RESVD_SET) /* old_set */ - return EINVAL; - } - - IPFW_WLOCK(chain); - rule = chain->rules; /* common starting point */ - chain->reap = NULL; /* prepare for deletions */ - switch (cmd) { - case 0: /* delete rules with given number */ - /* - * locate first rule to delete - */ - for (; rule->rulenum < rulenum; prev = rule, rule = rule->next) - ; - if (rule->rulenum != rulenum) { - IPFW_WUNLOCK(chain); - return EINVAL; - } - - /* - * flush pointers outside the loop, then delete all matching - * rules. prev remains the same throughout the cycle. - */ - flush_rule_ptrs(chain); - while (rule->rulenum == rulenum) - rule = remove_rule(chain, rule, prev); - break; - - case 1: /* delete all rules with given set number */ - flush_rule_ptrs(chain); - while (rule->rulenum < IPFW_DEFAULT_RULE) { - if (rule->set == rulenum) - rule = remove_rule(chain, rule, prev); - else { - prev = rule; - rule = rule->next; - } - } - break; - - case 2: /* move rules with given number to new set */ - for (; rule->rulenum < IPFW_DEFAULT_RULE; rule = rule->next) - if (rule->rulenum == rulenum) - rule->set = new_set; - break; - - case 3: /* move rules with given set number to new set */ - for (; rule->rulenum < IPFW_DEFAULT_RULE; rule = rule->next) - if (rule->set == rulenum) - rule->set = new_set; - break; - - case 4: /* swap two sets */ - for (; rule->rulenum < IPFW_DEFAULT_RULE; rule = rule->next) - if (rule->set == rulenum) - rule->set = new_set; - else if (rule->set == new_set) - rule->set = rulenum; - break; - - case 5: /* delete rules with given number and with given set number. - * rulenum - given rule number; - * new_set - given set number. - */ - for (; rule->rulenum < rulenum; prev = rule, rule = rule->next) - ; - if (rule->rulenum != rulenum) { - IPFW_WUNLOCK(chain); - return (EINVAL); - } - flush_rule_ptrs(chain); - while (rule->rulenum == rulenum) { - if (rule->set == new_set) - rule = remove_rule(chain, rule, prev); - else { - prev = rule; - rule = rule->next; - } - } - } - /* - * Look for rules to reclaim. We grab the list before - * releasing the lock then reclaim them w/o the lock to - * avoid a LOR with dummynet. - */ - rule = chain->reap; - IPFW_WUNLOCK(chain); - reap_rules(rule); - return 0; -} - -/* - * Clear counters for a specific rule. - * The enclosing "table" is assumed locked. - */ -static void -clear_counters(struct ip_fw *rule, int log_only) -{ - ipfw_insn_log *l = (ipfw_insn_log *)ACTION_PTR(rule); - - if (log_only == 0) { - rule->bcnt = rule->pcnt = 0; - rule->timestamp = 0; - } - if (l->o.opcode == O_LOG) - l->log_left = l->max_log; -} - -/** - * Reset some or all counters on firewall rules. - * The argument `arg' is an u_int32_t. The low 16 bit are the rule number, - * the next 8 bits are the set number, the top 8 bits are the command: - * 0 work with rules from all set's; - * 1 work with rules only from specified set. - * Specified rule number is zero if we want to clear all entries. - * log_only is 1 if we only want to reset logs, zero otherwise. - */ -static int -zero_entry(struct ip_fw_chain *chain, u_int32_t arg, int log_only) -{ - struct ip_fw *rule; - char *msg; - - uint16_t rulenum = arg & 0xffff; - uint8_t set = (arg >> 16) & 0xff; - uint8_t cmd = (arg >> 24) & 0xff; - - if (cmd > 1) - return (EINVAL); - if (cmd == 1 && set > RESVD_SET) - return (EINVAL); - - IPFW_WLOCK(chain); - if (rulenum == 0) { - V_norule_counter = 0; - for (rule = chain->rules; rule; rule = rule->next) { - /* Skip rules from another set. */ - if (cmd == 1 && rule->set != set) - continue; - clear_counters(rule, log_only); - } - msg = log_only ? "All logging counts reset" : - "Accounting cleared"; - } else { - int cleared = 0; - /* - * We can have multiple rules with the same number, so we - * need to clear them all. - */ - for (rule = chain->rules; rule; rule = rule->next) - if (rule->rulenum == rulenum) { - while (rule && rule->rulenum == rulenum) { - if (cmd == 0 || rule->set == set) - clear_counters(rule, log_only); - rule = rule->next; - } - cleared = 1; - break; - } - if (!cleared) { /* we did not find any matching rules */ - IPFW_WUNLOCK(chain); - return (EINVAL); - } - msg = log_only ? "logging count reset" : "cleared"; - } - IPFW_WUNLOCK(chain); - - if (V_fw_verbose) { - int lev = LOG_SECURITY | LOG_NOTICE; - - if (rulenum) - log(lev, "ipfw: Entry %d %s.\n", rulenum, msg); - else - log(lev, "ipfw: %s.\n", msg); - } - return (0); -} - -/* - * Check validity of the structure before insert. - * Fortunately rules are simple, so this mostly need to check rule sizes. - */ -static int -check_ipfw_struct(struct ip_fw *rule, int size) -{ - int l, cmdlen = 0; - int have_action=0; - ipfw_insn *cmd; - - if (size < sizeof(*rule)) { - printf("ipfw: rule too short\n"); - return (EINVAL); - } - /* first, check for valid size */ - l = RULESIZE(rule); - if (l != size) { - printf("ipfw: size mismatch (have %d want %d)\n", size, l); - return (EINVAL); - } - if (rule->act_ofs >= rule->cmd_len) { - printf("ipfw: bogus action offset (%u > %u)\n", - rule->act_ofs, rule->cmd_len - 1); - return (EINVAL); - } - /* - * Now go for the individual checks. Very simple ones, basically only - * instruction sizes. - */ - for (l = rule->cmd_len, cmd = rule->cmd ; - l > 0 ; l -= cmdlen, cmd += cmdlen) { - cmdlen = F_LEN(cmd); - if (cmdlen > l) { - printf("ipfw: opcode %d size truncated\n", - cmd->opcode); - return EINVAL; - } - DEB(printf("ipfw: opcode %d\n", cmd->opcode);) - switch (cmd->opcode) { - case O_PROBE_STATE: - case O_KEEP_STATE: - case O_PROTO: - case O_IP_SRC_ME: - case O_IP_DST_ME: - case O_LAYER2: - case O_IN: - case O_FRAG: - case O_DIVERTED: - case O_IPOPT: - case O_IPTOS: - case O_IPPRECEDENCE: - case O_IPVER: - case O_TCPWIN: - case O_TCPFLAGS: - case O_TCPOPTS: - case O_ESTAB: - case O_VERREVPATH: - case O_VERSRCREACH: - case O_ANTISPOOF: - case O_IPSEC: -#ifdef INET6 - case O_IP6_SRC_ME: - case O_IP6_DST_ME: - case O_EXT_HDR: - case O_IP6: -#endif - case O_IP4: - case O_TAG: - if (cmdlen != F_INSN_SIZE(ipfw_insn)) - goto bad_size; - break; - - case O_FIB: - if (cmdlen != F_INSN_SIZE(ipfw_insn)) - goto bad_size; - if (cmd->arg1 >= rt_numfibs) { - printf("ipfw: invalid fib number %d\n", - cmd->arg1); - return EINVAL; - } - break; - - case O_SETFIB: - if (cmdlen != F_INSN_SIZE(ipfw_insn)) - goto bad_size; - if (cmd->arg1 >= rt_numfibs) { - printf("ipfw: invalid fib number %d\n", - cmd->arg1); - return EINVAL; - } - goto check_action; - - case O_UID: - case O_GID: - case O_JAIL: - case O_IP_SRC: - case O_IP_DST: - case O_TCPSEQ: - case O_TCPACK: - case O_PROB: - case O_ICMPTYPE: - if (cmdlen != F_INSN_SIZE(ipfw_insn_u32)) - goto bad_size; - break; - - case O_LIMIT: - if (cmdlen != F_INSN_SIZE(ipfw_insn_limit)) - goto bad_size; - break; - - case O_LOG: - if (cmdlen != F_INSN_SIZE(ipfw_insn_log)) - goto bad_size; - - ((ipfw_insn_log *)cmd)->log_left = - ((ipfw_insn_log *)cmd)->max_log; - - break; - - case O_IP_SRC_MASK: - case O_IP_DST_MASK: - /* only odd command lengths */ - if ( !(cmdlen & 1) || cmdlen > 31) - goto bad_size; - break; - - case O_IP_SRC_SET: - case O_IP_DST_SET: - if (cmd->arg1 == 0 || cmd->arg1 > 256) { - printf("ipfw: invalid set size %d\n", - cmd->arg1); - return EINVAL; - } - if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + - (cmd->arg1+31)/32 ) - goto bad_size; - break; - - case O_IP_SRC_LOOKUP: - case O_IP_DST_LOOKUP: - if (cmd->arg1 >= IPFW_TABLES_MAX) { - printf("ipfw: invalid table number %d\n", - cmd->arg1); - return (EINVAL); - } - if (cmdlen != F_INSN_SIZE(ipfw_insn) && - cmdlen != F_INSN_SIZE(ipfw_insn_u32)) - goto bad_size; - break; - - case O_MACADDR2: - if (cmdlen != F_INSN_SIZE(ipfw_insn_mac)) - goto bad_size; - break; - - case O_NOP: - case O_IPID: - case O_IPTTL: - case O_IPLEN: - case O_TCPDATALEN: - case O_TAGGED: - if (cmdlen < 1 || cmdlen > 31) - goto bad_size; - break; - - case O_MAC_TYPE: - case O_IP_SRCPORT: - case O_IP_DSTPORT: /* XXX artificial limit, 30 port pairs */ - if (cmdlen < 2 || cmdlen > 31) - goto bad_size; - break; - - case O_RECV: - case O_XMIT: - case O_VIA: - if (cmdlen != F_INSN_SIZE(ipfw_insn_if)) - goto bad_size; - break; - - case O_ALTQ: - if (cmdlen != F_INSN_SIZE(ipfw_insn_altq)) - goto bad_size; - break; - - case O_PIPE: - case O_QUEUE: - if (cmdlen != F_INSN_SIZE(ipfw_insn)) - goto bad_size; - goto check_action; - - case O_FORWARD_IP: -#ifdef IPFIREWALL_FORWARD - if (cmdlen != F_INSN_SIZE(ipfw_insn_sa)) - goto bad_size; - goto check_action; -#else - return EINVAL; -#endif - - case O_DIVERT: - case O_TEE: - if (ip_divert_ptr == NULL) - return EINVAL; - else - goto check_size; - case O_NETGRAPH: - case O_NGTEE: - if (!NG_IPFW_LOADED) - return EINVAL; - else - goto check_size; - case O_NAT: - if (!IPFW_NAT_LOADED) - return EINVAL; - if (cmdlen != F_INSN_SIZE(ipfw_insn_nat)) - goto bad_size; - goto check_action; - case O_FORWARD_MAC: /* XXX not implemented yet */ - case O_CHECK_STATE: - case O_COUNT: - case O_ACCEPT: - case O_DENY: - case O_REJECT: -#ifdef INET6 - case O_UNREACH6: -#endif - case O_SKIPTO: - case O_REASS: -check_size: - if (cmdlen != F_INSN_SIZE(ipfw_insn)) - goto bad_size; -check_action: - if (have_action) { - printf("ipfw: opcode %d, multiple actions" - " not allowed\n", - cmd->opcode); - return EINVAL; - } - have_action = 1; - if (l != cmdlen) { - printf("ipfw: opcode %d, action must be" - " last opcode\n", - cmd->opcode); - return EINVAL; - } - break; -#ifdef INET6 - case O_IP6_SRC: - case O_IP6_DST: - if (cmdlen != F_INSN_SIZE(struct in6_addr) + - F_INSN_SIZE(ipfw_insn)) - goto bad_size; - break; - - case O_FLOW6ID: - if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + - ((ipfw_insn_u32 *)cmd)->o.arg1) - goto bad_size; - break; - - case O_IP6_SRC_MASK: - case O_IP6_DST_MASK: - if ( !(cmdlen & 1) || cmdlen > 127) - goto bad_size; - break; - case O_ICMP6TYPE: - if( cmdlen != F_INSN_SIZE( ipfw_insn_icmp6 ) ) - goto bad_size; - break; -#endif - - default: - switch (cmd->opcode) { -#ifndef INET6 - case O_IP6_SRC_ME: - case O_IP6_DST_ME: - case O_EXT_HDR: - case O_IP6: - case O_UNREACH6: - case O_IP6_SRC: - case O_IP6_DST: - case O_FLOW6ID: - case O_IP6_SRC_MASK: - case O_IP6_DST_MASK: - case O_ICMP6TYPE: - printf("ipfw: no IPv6 support in kernel\n"); - return EPROTONOSUPPORT; -#endif - default: - printf("ipfw: opcode %d, unknown opcode\n", - cmd->opcode); - return EINVAL; - } - } - } - if (have_action == 0) { - printf("ipfw: missing action\n"); - return EINVAL; - } - return 0; - -bad_size: - printf("ipfw: opcode %d size %d wrong\n", - cmd->opcode, cmdlen); - return EINVAL; -} - -/* - * Copy the static and dynamic rules to the supplied buffer - * and return the amount of space actually used. - */ -static size_t -ipfw_getrules(struct ip_fw_chain *chain, void *buf, size_t space) -{ - char *bp = buf; - char *ep = bp + space; - struct ip_fw *rule; - int i; - time_t boot_seconds; - - boot_seconds = boottime.tv_sec; - /* XXX this can take a long time and locking will block packet flow */ - IPFW_RLOCK(chain); - for (rule = chain->rules; rule ; rule = rule->next) { - /* - * Verify the entry fits in the buffer in case the - * rules changed between calculating buffer space and - * now. This would be better done using a generation - * number but should suffice for now. - */ - i = RULESIZE(rule); - if (bp + i <= ep) { - bcopy(rule, bp, i); - /* - * XXX HACK. Store the disable mask in the "next" - * pointer in a wild attempt to keep the ABI the same. - * Why do we do this on EVERY rule? - */ - bcopy(&V_set_disable, - &(((struct ip_fw *)bp)->next_rule), - sizeof(V_set_disable)); - if (((struct ip_fw *)bp)->timestamp) - ((struct ip_fw *)bp)->timestamp += boot_seconds; - bp += i; - } - } - IPFW_RUNLOCK(chain); - if (V_ipfw_dyn_v) { - ipfw_dyn_rule *p, *last = NULL; - - IPFW_DYN_LOCK(); - for (i = 0 ; i < V_curr_dyn_buckets; i++) - for (p = V_ipfw_dyn_v[i] ; p != NULL; p = p->next) { - if (bp + sizeof *p <= ep) { - ipfw_dyn_rule *dst = - (ipfw_dyn_rule *)bp; - bcopy(p, dst, sizeof *p); - bcopy(&(p->rule->rulenum), &(dst->rule), - sizeof(p->rule->rulenum)); - /* - * store set number into high word of - * dst->rule pointer. - */ - bcopy(&(p->rule->set), - (char *)&dst->rule + - sizeof(p->rule->rulenum), - sizeof(p->rule->set)); - /* - * store a non-null value in "next". - * The userland code will interpret a - * NULL here as a marker - * for the last dynamic rule. - */ - bcopy(&dst, &dst->next, sizeof(dst)); - last = dst; - dst->expire = - TIME_LEQ(dst->expire, time_uptime) ? - 0 : dst->expire - time_uptime ; - bp += sizeof(ipfw_dyn_rule); - } - } - IPFW_DYN_UNLOCK(); - if (last != NULL) /* mark last dynamic rule */ - bzero(&last->next, sizeof(last)); - } - return (bp - (char *)buf); -} - - -/** - * {set|get}sockopt parser. - */ -static int -ipfw_ctl(struct sockopt *sopt) -{ -#define RULE_MAXSIZE (256*sizeof(u_int32_t)) - int error; - size_t size; - struct ip_fw *buf, *rule; - u_int32_t rulenum[2]; - - error = priv_check(sopt->sopt_td, PRIV_NETINET_IPFW); - if (error) - return (error); - - /* - * Disallow modifications in really-really secure mode, but still allow - * the logging counters to be reset. - */ - if (sopt->sopt_name == IP_FW_ADD || - (sopt->sopt_dir == SOPT_SET && sopt->sopt_name != IP_FW_RESETLOG)) { - error = securelevel_ge(sopt->sopt_td->td_ucred, 3); - if (error) - return (error); - } - - error = 0; - - switch (sopt->sopt_name) { - case IP_FW_GET: - /* - * pass up a copy of the current rules. Static rules - * come first (the last of which has number IPFW_DEFAULT_RULE), - * followed by a possibly empty list of dynamic rule. - * The last dynamic rule has NULL in the "next" field. - * - * Note that the calculated size is used to bound the - * amount of data returned to the user. The rule set may - * change between calculating the size and returning the - * data in which case we'll just return what fits. - */ - size = V_static_len; /* size of static rules */ - if (V_ipfw_dyn_v) /* add size of dyn.rules */ - size += (V_dyn_count * sizeof(ipfw_dyn_rule)); - - if (size >= sopt->sopt_valsize) - break; - /* - * XXX todo: if the user passes a short length just to know - * how much room is needed, do not bother filling up the - * buffer, just jump to the sooptcopyout. - */ - buf = malloc(size, M_TEMP, M_WAITOK); - error = sooptcopyout(sopt, buf, - ipfw_getrules(&V_layer3_chain, buf, size)); - free(buf, M_TEMP); - break; - - case IP_FW_FLUSH: - /* - * Normally we cannot release the lock on each iteration. - * We could do it here only because we start from the head all - * the times so there is no risk of missing some entries. - * On the other hand, the risk is that we end up with - * a very inconsistent ruleset, so better keep the lock - * around the whole cycle. - * - * XXX this code can be improved by resetting the head of - * the list to point to the default rule, and then freeing - * the old list without the need for a lock. - */ - - IPFW_WLOCK(&V_layer3_chain); - free_chain(&V_layer3_chain, 0 /* keep default rule */); - rule = V_layer3_chain.reap; - IPFW_WUNLOCK(&V_layer3_chain); - reap_rules(rule); - break; - - case IP_FW_ADD: - rule = malloc(RULE_MAXSIZE, M_TEMP, M_WAITOK); - error = sooptcopyin(sopt, rule, RULE_MAXSIZE, - sizeof(struct ip_fw) ); - if (error == 0) - error = check_ipfw_struct(rule, sopt->sopt_valsize); - if (error == 0) { - error = add_rule(&V_layer3_chain, rule); - size = RULESIZE(rule); - if (!error && sopt->sopt_dir == SOPT_GET) - error = sooptcopyout(sopt, rule, size); - } - free(rule, M_TEMP); - break; - - case IP_FW_DEL: - /* - * IP_FW_DEL is used for deleting single rules or sets, - * and (ab)used to atomically manipulate sets. Argument size - * is used to distinguish between the two: - * sizeof(u_int32_t) - * delete single rule or set of rules, - * or reassign rules (or sets) to a different set. - * 2*sizeof(u_int32_t) - * atomic disable/enable sets. - * first u_int32_t contains sets to be disabled, - * second u_int32_t contains sets to be enabled. - */ - error = sooptcopyin(sopt, rulenum, - 2*sizeof(u_int32_t), sizeof(u_int32_t)); - if (error) - break; - size = sopt->sopt_valsize; - if (size == sizeof(u_int32_t)) /* delete or reassign */ - error = del_entry(&V_layer3_chain, rulenum[0]); - else if (size == 2*sizeof(u_int32_t)) /* set enable/disable */ - V_set_disable = - (V_set_disable | rulenum[0]) & ~rulenum[1] & - ~(1<sopt_val != 0) { - error = sooptcopyin(sopt, rulenum, - sizeof(u_int32_t), sizeof(u_int32_t)); - if (error) - break; - } - error = zero_entry(&V_layer3_chain, rulenum[0], - sopt->sopt_name == IP_FW_RESETLOG); - break; - - case IP_FW_TABLE_ADD: - { - ipfw_table_entry ent; - - error = sooptcopyin(sopt, &ent, - sizeof(ent), sizeof(ent)); - if (error) - break; - error = add_table_entry(&V_layer3_chain, ent.tbl, - ent.addr, ent.masklen, ent.value); - } - break; - - case IP_FW_TABLE_DEL: - { - ipfw_table_entry ent; - - error = sooptcopyin(sopt, &ent, - sizeof(ent), sizeof(ent)); - if (error) - break; - error = del_table_entry(&V_layer3_chain, ent.tbl, - ent.addr, ent.masklen); - } - break; - - case IP_FW_TABLE_FLUSH: - { - u_int16_t tbl; - - error = sooptcopyin(sopt, &tbl, - sizeof(tbl), sizeof(tbl)); - if (error) - break; - IPFW_WLOCK(&V_layer3_chain); - error = flush_table(&V_layer3_chain, tbl); - IPFW_WUNLOCK(&V_layer3_chain); - } - break; - - case IP_FW_TABLE_GETSIZE: - { - u_int32_t tbl, cnt; - - if ((error = sooptcopyin(sopt, &tbl, sizeof(tbl), - sizeof(tbl)))) - break; - IPFW_RLOCK(&V_layer3_chain); - error = count_table(&V_layer3_chain, tbl, &cnt); - IPFW_RUNLOCK(&V_layer3_chain); - if (error) - break; - error = sooptcopyout(sopt, &cnt, sizeof(cnt)); - } - break; - - case IP_FW_TABLE_LIST: - { - ipfw_table *tbl; - - if (sopt->sopt_valsize < sizeof(*tbl)) { - error = EINVAL; - break; - } - size = sopt->sopt_valsize; - tbl = malloc(size, M_TEMP, M_WAITOK); - error = sooptcopyin(sopt, tbl, size, sizeof(*tbl)); - if (error) { - free(tbl, M_TEMP); - break; - } - tbl->size = (size - sizeof(*tbl)) / - sizeof(ipfw_table_entry); - IPFW_RLOCK(&V_layer3_chain); - error = dump_table(&V_layer3_chain, tbl); - IPFW_RUNLOCK(&V_layer3_chain); - if (error) { - free(tbl, M_TEMP); - break; - } - error = sooptcopyout(sopt, tbl, size); - free(tbl, M_TEMP); - } - break; - - case IP_FW_NAT_CFG: - if (IPFW_NAT_LOADED) - error = ipfw_nat_cfg_ptr(sopt); - else { - printf("IP_FW_NAT_CFG: %s\n", - "ipfw_nat not present, please load it"); - error = EINVAL; - } - break; - - case IP_FW_NAT_DEL: - if (IPFW_NAT_LOADED) - error = ipfw_nat_del_ptr(sopt); - else { - printf("IP_FW_NAT_DEL: %s\n", - "ipfw_nat not present, please load it"); - error = EINVAL; - } - break; - - case IP_FW_NAT_GET_CONFIG: - if (IPFW_NAT_LOADED) - error = ipfw_nat_get_cfg_ptr(sopt); - else { - printf("IP_FW_NAT_GET_CFG: %s\n", - "ipfw_nat not present, please load it"); - error = EINVAL; - } - break; - - case IP_FW_NAT_GET_LOG: - if (IPFW_NAT_LOADED) - error = ipfw_nat_get_log_ptr(sopt); - else { - printf("IP_FW_NAT_GET_LOG: %s\n", - "ipfw_nat not present, please load it"); - error = EINVAL; - } - break; - - default: - printf("ipfw: ipfw_ctl invalid option %d\n", sopt->sopt_name); - error = EINVAL; - } - - return (error); -#undef RULE_MAXSIZE -} - - -/* - * This procedure is only used to handle keepalives. It is invoked - * every dyn_keepalive_period - */ -static void -ipfw_tick(void * vnetx) -{ - struct mbuf *m0, *m, *mnext, **mtailp; - int i; - ipfw_dyn_rule *q; -#ifdef VIMAGE - struct vnet *vp = vnetx; -#endif - - CURVNET_SET(vp); - if (V_dyn_keepalive == 0 || V_ipfw_dyn_v == NULL || V_dyn_count == 0) - goto done; - - /* - * We make a chain of packets to go out here -- not deferring - * until after we drop the IPFW dynamic rule lock would result - * in a lock order reversal with the normal packet input -> ipfw - * call stack. - */ - m0 = NULL; - mtailp = &m0; - IPFW_DYN_LOCK(); - for (i = 0 ; i < V_curr_dyn_buckets ; i++) { - for (q = V_ipfw_dyn_v[i] ; q ; q = q->next ) { - if (q->dyn_type == O_LIMIT_PARENT) - continue; - if (q->id.proto != IPPROTO_TCP) - continue; - if ( (q->state & BOTH_SYN) != BOTH_SYN) - continue; - if (TIME_LEQ(time_uptime + V_dyn_keepalive_interval, - q->expire)) - continue; /* too early */ - if (TIME_LEQ(q->expire, time_uptime)) - continue; /* too late, rule expired */ - - *mtailp = send_pkt(NULL, &(q->id), q->ack_rev - 1, - q->ack_fwd, TH_SYN); - if (*mtailp != NULL) - mtailp = &(*mtailp)->m_nextpkt; - *mtailp = send_pkt(NULL, &(q->id), q->ack_fwd - 1, - q->ack_rev, 0); - if (*mtailp != NULL) - mtailp = &(*mtailp)->m_nextpkt; - } - } - IPFW_DYN_UNLOCK(); - for (m = mnext = m0; m != NULL; m = mnext) { - mnext = m->m_nextpkt; - m->m_nextpkt = NULL; - ip_output(m, NULL, NULL, 0, NULL, NULL); - } -done: - callout_reset(&V_ipfw_timeout, V_dyn_keepalive_period * hz, - ipfw_tick, vnetx); - CURVNET_RESTORE(); -} - -/**************** * Stuff that must be initialised only on boot or module load */ static int @@ -4589,11 +2186,7 @@ ipfw_init(void) { int error = 0; - ipfw_dyn_rule_zone = uma_zcreate("IPFW dynamic rule", - sizeof(ipfw_dyn_rule), NULL, NULL, NULL, NULL, - UMA_ALIGN_PTR, 0); - - IPFW_DYN_LOCK_INIT(); + ipfw_dyn_attach(); /* * Only print out this stuff the first time around, * when called from the sysinit code. @@ -4637,30 +2230,23 @@ ipfw_init(void) printf("limited to %d packets/entry by default\n", V_verbose_limit); - /* - * Hook us up to pfil. - * Eventually pfil will be per vnet. - */ - if ((error = ipfw_hook()) != 0) { - printf("ipfw_hook() error\n"); - return (error); - } -#ifdef INET6 - if ((error = ipfw6_hook()) != 0) { - printf("ipfw6_hook() error\n"); - return (error); - } -#endif - /* - * Other things that are only done the first time. - * (now that we are guaranteed of success). - */ - ip_fw_ctl_ptr = ipfw_ctl; - ip_fw_chk_ptr = ipfw_chk; + ipfw_log_bpf(1); /* init */ return (error); } -/**************** +/* + * Called for the removal of the last instance only on module unload. + */ +static void +ipfw_destroy(void) +{ + + ipfw_log_bpf(0); /* uninit */ + ipfw_dyn_detach(); + printf("IP firewall unloaded\n"); +} + +/* * Stuff that must be initialized for every instance * (including the first of course). */ @@ -4668,119 +2254,121 @@ static int vnet_ipfw_init(const void *unused) { int error; - struct ip_fw default_rule; + struct ip_fw *rule = NULL; + struct ip_fw_chain *chain; + + chain = &V_layer3_chain; /* First set up some values that are compile time options */ + V_autoinc_step = 100; /* bounded to 1..1000 in add_rule() */ + V_fw_deny_unknown_exthdrs = 1; #ifdef IPFIREWALL_VERBOSE V_fw_verbose = 1; #endif #ifdef IPFIREWALL_VERBOSE_LIMIT V_verbose_limit = IPFIREWALL_VERBOSE_LIMIT; #endif +#ifdef IPFIREWALL_NAT + LIST_INIT(&chain->nat); +#endif - error = init_tables(&V_layer3_chain); + /* insert the default rule and create the initial map */ + chain->n_rules = 1; + chain->static_len = sizeof(struct ip_fw); + chain->map = malloc(sizeof(struct ip_fw *), M_IPFW, M_NOWAIT | M_ZERO); + if (chain->map) + rule = malloc(chain->static_len, M_IPFW, M_NOWAIT | M_ZERO); + if (rule == NULL) { + if (chain->map) + free(chain->map, M_IPFW); + printf("ipfw2: ENOSPC initializing default rule " + "(support disabled)\n"); + return (ENOSPC); + } + error = ipfw_init_tables(chain); if (error) { panic("init_tables"); /* XXX Marko fix this ! */ } -#ifdef IPFIREWALL_NAT - LIST_INIT(&V_layer3_chain.nat); -#endif - V_autoinc_step = 100; /* bounded to 1..1000 in add_rule() */ + /* fill and insert the default rule */ + rule->act_ofs = 0; + rule->rulenum = IPFW_DEFAULT_RULE; + rule->cmd_len = 1; + rule->set = RESVD_SET; + rule->cmd[0].len = 1; + rule->cmd[0].opcode = default_to_accept ? O_ACCEPT : O_DENY; + chain->rules = chain->default_rule = chain->map[0] = rule; + chain->id = rule->id = 1; - V_ipfw_dyn_v = NULL; - V_dyn_buckets = 256; /* must be power of 2 */ - V_curr_dyn_buckets = 256; /* must be power of 2 */ - - V_dyn_ack_lifetime = 300; - V_dyn_syn_lifetime = 20; - V_dyn_fin_lifetime = 1; - V_dyn_rst_lifetime = 1; - V_dyn_udp_lifetime = 10; - V_dyn_short_lifetime = 5; - - V_dyn_keepalive_interval = 20; - V_dyn_keepalive_period = 5; - V_dyn_keepalive = 1; /* do send keepalives */ - - V_dyn_max = 4096; /* max # of dynamic rules */ - - V_fw_deny_unknown_exthdrs = 1; - - V_layer3_chain.rules = NULL; - IPFW_LOCK_INIT(&V_layer3_chain); - callout_init(&V_ipfw_timeout, CALLOUT_MPSAFE); - - bzero(&default_rule, sizeof default_rule); - default_rule.act_ofs = 0; - default_rule.rulenum = IPFW_DEFAULT_RULE; - default_rule.cmd_len = 1; - default_rule.set = RESVD_SET; - default_rule.cmd[0].len = 1; - default_rule.cmd[0].opcode = default_to_accept ? O_ACCEPT : O_DENY; - error = add_rule(&V_layer3_chain, &default_rule); - - if (error != 0) { - printf("ipfw2: error %u initializing default rule " - "(support disabled)\n", error); - IPFW_LOCK_DESTROY(&V_layer3_chain); - printf("leaving ipfw_iattach (1) with error %d\n", error); - return (error); - } - - ip_fw_default_rule = V_layer3_chain.rules; - - if (error) { - IPFW_LOCK_DESTROY(&V_layer3_chain); - printf("leaving ipfw_iattach (2) with error %d\n", error); - return (error); - } -#ifdef VIMAGE /* want a better way to do this */ - callout_reset(&V_ipfw_timeout, hz, ipfw_tick, curvnet); -#else - callout_reset(&V_ipfw_timeout, hz, ipfw_tick, NULL); -#endif + IPFW_LOCK_INIT(chain); + ipfw_dyn_init(); /* First set up some values that are compile time options */ V_ipfw_vnet_ready = 1; /* Open for business */ - return (0); + + /* + * Hook the sockopt handler, and the layer2 (V_ip_fw_chk_ptr) + * and pfil hooks for ipv4 and ipv6. Even if the latter two fail + * we still keep the module alive because the sockopt and + * layer2 paths are still useful. + * ipfw[6]_hook return 0 on success, ENOENT on failure, + * so we can ignore the exact return value and just set a flag. + * + * Note that V_fw[6]_enable are manipulated by a SYSCTL_PROC so + * changes in the underlying (per-vnet) variables trigger + * immediate hook()/unhook() calls. + * In layer2 we have the same behaviour, except that V_ether_ipfw + * is checked on each packet because there are no pfil hooks. + */ + V_ip_fw_ctl_ptr = ipfw_ctl; + V_ip_fw_chk_ptr = ipfw_chk; + error = ipfw_attach_hooks(1); + return (error); } -/********************** - * Called for the removal of the last instance only on module unload. - */ -static void -ipfw_destroy(void) -{ - - uma_zdestroy(ipfw_dyn_rule_zone); - IPFW_DYN_LOCK_DESTROY(); - printf("IP firewall unloaded\n"); -} - -/*********************** +/* * Called for the removal of each instance. */ static int vnet_ipfw_uninit(const void *unused) { - struct ip_fw *reap; + struct ip_fw *reap, *rule; + struct ip_fw_chain *chain = &V_layer3_chain; + int i; V_ipfw_vnet_ready = 0; /* tell new callers to go away */ - callout_drain(&V_ipfw_timeout); - /* We wait on the wlock here until the last user leaves */ - IPFW_WLOCK(&V_layer3_chain); - flush_tables(&V_layer3_chain); - V_layer3_chain.reap = NULL; - free_chain(&V_layer3_chain, 1 /* kill default rule */); - reap = V_layer3_chain.reap; - V_layer3_chain.reap = NULL; - IPFW_WUNLOCK(&V_layer3_chain); + /* + * disconnect from ipv4, ipv6, layer2 and sockopt. + * Then grab, release and grab again the WLOCK so we make + * sure the update is propagated and nobody will be in. + */ + (void)ipfw_attach_hooks(0 /* detach */); + V_ip_fw_chk_ptr = NULL; + V_ip_fw_ctl_ptr = NULL; + IPFW_UH_WLOCK(chain); + IPFW_UH_WUNLOCK(chain); + IPFW_UH_WLOCK(chain); + + IPFW_WLOCK(chain); + IPFW_WUNLOCK(chain); + IPFW_WLOCK(chain); + + ipfw_dyn_uninit(0); /* run the callout_drain */ + ipfw_flush_tables(chain); + reap = NULL; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + rule->x_next = reap; + reap = rule; + } + if (chain->map) + free(chain->map, M_IPFW); + IPFW_WUNLOCK(chain); + IPFW_UH_WUNLOCK(chain); if (reap != NULL) - reap_rules(reap); - IPFW_LOCK_DESTROY(&V_layer3_chain); - if (V_ipfw_dyn_v != NULL) - free(V_ipfw_dyn_v, M_IPFW); + ipfw_reap_rules(reap); + IPFW_LOCK_DESTROY(chain); + ipfw_dyn_uninit(1); /* free the remaining parts */ return 0; } @@ -4803,21 +2391,10 @@ ipfw_modevent(module_t mod, int type, void *unused) /* Called once at module load or * system boot if compiled in. */ break; - case MOD_UNLOAD: - break; case MOD_QUIESCE: - /* Yes, the unhooks can return errors, we can safely ignore - * them. Eventually these will be done per jail as they - * shut down. We will wait on each vnet's l3 lock as existing - * callers go away. - */ - ipfw_unhook(); -#ifdef INET6 - ipfw6_unhook(); -#endif - /* layer2 and other entrypoints still come in this way. */ - ip_fw_chk_ptr = NULL; - ip_fw_ctl_ptr = NULL; + /* Called before unload. May veto unloading. */ + break; + case MOD_UNLOAD: /* Called during unload. */ break; case MOD_SHUTDOWN: @@ -4865,5 +2442,4 @@ SYSUNINIT(ipfw_destroy, IPFW_SI_SUB_FIREWALL, IPFW_MODULE_ORDER, ipfw_destroy, NULL); VNET_SYSUNINIT(vnet_ipfw_uninit, IPFW_SI_SUB_FIREWALL, IPFW_VNET_ORDER, vnet_ipfw_uninit, NULL); - - +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_dynamic.c b/sys/netinet/ipfw/ip_fw_dynamic.c new file mode 100644 index 000000000000..ad5599af43d1 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_dynamic.c @@ -0,0 +1,1230 @@ +/*- + * Copyright (c) 2002 Luigi Rizzo, Universita` di Pisa + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#define DEB(x) +#define DDB(x) x + +/* + * Dynamic rule support for ipfw + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for ETHERTYPE_IP */ +#include +#include + +#include +#include +#include /* ip_defttl */ +#include +#include +#include +#include + +#include /* IN6_ARE_ADDR_EQUAL */ +#ifdef INET6 +#include +#include +#endif + +#include /* XXX for in_cksum */ + +#ifdef MAC +#include +#endif + +/* + * Description of dynamic rules. + * + * Dynamic rules are stored in lists accessed through a hash table + * (ipfw_dyn_v) whose size is curr_dyn_buckets. This value can + * be modified through the sysctl variable dyn_buckets which is + * updated when the table becomes empty. + * + * XXX currently there is only one list, ipfw_dyn. + * + * When a packet is received, its address fields are first masked + * with the mask defined for the rule, then hashed, then matched + * against the entries in the corresponding list. + * Dynamic rules can be used for different purposes: + * + stateful rules; + * + enforcing limits on the number of sessions; + * + in-kernel NAT (not implemented yet) + * + * The lifetime of dynamic rules is regulated by dyn_*_lifetime, + * measured in seconds and depending on the flags. + * + * The total number of dynamic rules is stored in dyn_count. + * The max number of dynamic rules is dyn_max. When we reach + * the maximum number of rules we do not create anymore. This is + * done to avoid consuming too much memory, but also too much + * time when searching on each packet (ideally, we should try instead + * to put a limit on the length of the list on each bucket...). + * + * Each dynamic rule holds a pointer to the parent ipfw rule so + * we know what action to perform. Dynamic rules are removed when + * the parent rule is deleted. XXX we should make them survive. + * + * There are some limitations with dynamic rules -- we do not + * obey the 'randomized match', and we do not do multiple + * passes through the firewall. XXX check the latter!!! + */ + +/* + * Static variables followed by global ones + */ +static VNET_DEFINE(ipfw_dyn_rule **, ipfw_dyn_v); +static VNET_DEFINE(u_int32_t, dyn_buckets); +static VNET_DEFINE(u_int32_t, curr_dyn_buckets); +static VNET_DEFINE(struct callout, ipfw_timeout); +#define V_ipfw_dyn_v VNET(ipfw_dyn_v) +#define V_dyn_buckets VNET(dyn_buckets) +#define V_curr_dyn_buckets VNET(curr_dyn_buckets) +#define V_ipfw_timeout VNET(ipfw_timeout) + +static uma_zone_t ipfw_dyn_rule_zone; +static struct mtx ipfw_dyn_mtx; /* mutex guarding dynamic rules */ + +#define IPFW_DYN_LOCK_INIT() \ + mtx_init(&ipfw_dyn_mtx, "IPFW dynamic rules", NULL, MTX_DEF) +#define IPFW_DYN_LOCK_DESTROY() mtx_destroy(&ipfw_dyn_mtx) +#define IPFW_DYN_LOCK() mtx_lock(&ipfw_dyn_mtx) +#define IPFW_DYN_UNLOCK() mtx_unlock(&ipfw_dyn_mtx) +#define IPFW_DYN_LOCK_ASSERT() mtx_assert(&ipfw_dyn_mtx, MA_OWNED) + +void +ipfw_dyn_unlock(void) +{ + IPFW_DYN_UNLOCK(); +} + +/* + * Timeouts for various events in handing dynamic rules. + */ +static VNET_DEFINE(u_int32_t, dyn_ack_lifetime); +static VNET_DEFINE(u_int32_t, dyn_syn_lifetime); +static VNET_DEFINE(u_int32_t, dyn_fin_lifetime); +static VNET_DEFINE(u_int32_t, dyn_rst_lifetime); +static VNET_DEFINE(u_int32_t, dyn_udp_lifetime); +static VNET_DEFINE(u_int32_t, dyn_short_lifetime); + +#define V_dyn_ack_lifetime VNET(dyn_ack_lifetime) +#define V_dyn_syn_lifetime VNET(dyn_syn_lifetime) +#define V_dyn_fin_lifetime VNET(dyn_fin_lifetime) +#define V_dyn_rst_lifetime VNET(dyn_rst_lifetime) +#define V_dyn_udp_lifetime VNET(dyn_udp_lifetime) +#define V_dyn_short_lifetime VNET(dyn_short_lifetime) + +/* + * Keepalives are sent if dyn_keepalive is set. They are sent every + * dyn_keepalive_period seconds, in the last dyn_keepalive_interval + * seconds of lifetime of a rule. + * dyn_rst_lifetime and dyn_fin_lifetime should be strictly lower + * than dyn_keepalive_period. + */ + +static VNET_DEFINE(u_int32_t, dyn_keepalive_interval); +static VNET_DEFINE(u_int32_t, dyn_keepalive_period); +static VNET_DEFINE(u_int32_t, dyn_keepalive); + +#define V_dyn_keepalive_interval VNET(dyn_keepalive_interval) +#define V_dyn_keepalive_period VNET(dyn_keepalive_period) +#define V_dyn_keepalive VNET(dyn_keepalive) + +static VNET_DEFINE(u_int32_t, dyn_count); /* # of dynamic rules */ +static VNET_DEFINE(u_int32_t, dyn_max); /* max # of dynamic rules */ + +#define V_dyn_count VNET(dyn_count) +#define V_dyn_max VNET(dyn_max) + +#ifdef SYSCTL_NODE +SYSCTL_DECL(_net_inet_ip_fw); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_buckets, + CTLFLAG_RW, &VNET_NAME(dyn_buckets), 0, + "Number of dyn. buckets"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, curr_dyn_buckets, + CTLFLAG_RD, &VNET_NAME(curr_dyn_buckets), 0, + "Current Number of dyn. buckets"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_count, + CTLFLAG_RD, &VNET_NAME(dyn_count), 0, + "Number of dyn. rules"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_max, + CTLFLAG_RW, &VNET_NAME(dyn_max), 0, + "Max number of dyn. rules"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_ack_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_ack_lifetime), 0, + "Lifetime of dyn. rules for acks"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_syn_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_syn_lifetime), 0, + "Lifetime of dyn. rules for syn"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_fin_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_fin_lifetime), 0, + "Lifetime of dyn. rules for fin"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_rst_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_rst_lifetime), 0, + "Lifetime of dyn. rules for rst"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_udp_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_udp_lifetime), 0, + "Lifetime of dyn. rules for UDP"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_short_lifetime, + CTLFLAG_RW, &VNET_NAME(dyn_short_lifetime), 0, + "Lifetime of dyn. rules for other situations"); +SYSCTL_VNET_INT(_net_inet_ip_fw, OID_AUTO, dyn_keepalive, + CTLFLAG_RW, &VNET_NAME(dyn_keepalive), 0, + "Enable keepalives for dyn. rules"); +#endif /* SYSCTL_NODE */ + + +static __inline int +hash_packet6(struct ipfw_flow_id *id) +{ + u_int32_t i; + i = (id->dst_ip6.__u6_addr.__u6_addr32[2]) ^ + (id->dst_ip6.__u6_addr.__u6_addr32[3]) ^ + (id->src_ip6.__u6_addr.__u6_addr32[2]) ^ + (id->src_ip6.__u6_addr.__u6_addr32[3]) ^ + (id->dst_port) ^ (id->src_port); + return i; +} + +/* + * IMPORTANT: the hash function for dynamic rules must be commutative + * in source and destination (ip,port), because rules are bidirectional + * and we want to find both in the same bucket. + */ +static __inline int +hash_packet(struct ipfw_flow_id *id) +{ + u_int32_t i; + +#ifdef INET6 + if (IS_IP6_FLOW_ID(id)) + i = hash_packet6(id); + else +#endif /* INET6 */ + i = (id->dst_ip) ^ (id->src_ip) ^ (id->dst_port) ^ (id->src_port); + i &= (V_curr_dyn_buckets - 1); + return i; +} + +static __inline void +unlink_dyn_rule_print(struct ipfw_flow_id *id) +{ + struct in_addr da; +#ifdef INET6 + char src[INET6_ADDRSTRLEN], dst[INET6_ADDRSTRLEN]; +#else + char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; +#endif + +#ifdef INET6 + if (IS_IP6_FLOW_ID(id)) { + ip6_sprintf(src, &id->src_ip6); + ip6_sprintf(dst, &id->dst_ip6); + } else +#endif + { + da.s_addr = htonl(id->src_ip); + inet_ntoa_r(da, src); + da.s_addr = htonl(id->dst_ip); + inet_ntoa_r(da, dst); + } + printf("ipfw: unlink entry %s %d -> %s %d, %d left\n", + src, id->src_port, dst, id->dst_port, V_dyn_count - 1); +} + +/** + * unlink a dynamic rule from a chain. prev is a pointer to + * the previous one, q is a pointer to the rule to delete, + * head is a pointer to the head of the queue. + * Modifies q and potentially also head. + */ +#define UNLINK_DYN_RULE(prev, head, q) { \ + ipfw_dyn_rule *old_q = q; \ + \ + /* remove a refcount to the parent */ \ + if (q->dyn_type == O_LIMIT) \ + q->parent->count--; \ + DEB(unlink_dyn_rule_print(&q->id);) \ + if (prev != NULL) \ + prev->next = q = q->next; \ + else \ + head = q = q->next; \ + V_dyn_count--; \ + uma_zfree(ipfw_dyn_rule_zone, old_q); } + +#define TIME_LEQ(a,b) ((int)((a)-(b)) <= 0) + +/** + * Remove dynamic rules pointing to "rule", or all of them if rule == NULL. + * + * If keep_me == NULL, rules are deleted even if not expired, + * otherwise only expired rules are removed. + * + * The value of the second parameter is also used to point to identify + * a rule we absolutely do not want to remove (e.g. because we are + * holding a reference to it -- this is the case with O_LIMIT_PARENT + * rules). The pointer is only used for comparison, so any non-null + * value will do. + */ +static void +remove_dyn_rule(struct ip_fw *rule, ipfw_dyn_rule *keep_me) +{ + static u_int32_t last_remove = 0; + +#define FORCE (keep_me == NULL) + + ipfw_dyn_rule *prev, *q; + int i, pass = 0, max_pass = 0; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v == NULL || V_dyn_count == 0) + return; + /* do not expire more than once per second, it is useless */ + if (!FORCE && last_remove == time_uptime) + return; + last_remove = time_uptime; + + /* + * because O_LIMIT refer to parent rules, during the first pass only + * remove child and mark any pending LIMIT_PARENT, and remove + * them in a second pass. + */ +next_pass: + for (i = 0 ; i < V_curr_dyn_buckets ; i++) { + for (prev=NULL, q = V_ipfw_dyn_v[i] ; q ; ) { + /* + * Logic can become complex here, so we split tests. + */ + if (q == keep_me) + goto next; + if (rule != NULL && rule != q->rule) + goto next; /* not the one we are looking for */ + if (q->dyn_type == O_LIMIT_PARENT) { + /* + * handle parent in the second pass, + * record we need one. + */ + max_pass = 1; + if (pass == 0) + goto next; + if (FORCE && q->count != 0 ) { + /* XXX should not happen! */ + printf("ipfw: OUCH! cannot remove rule," + " count %d\n", q->count); + } + } else { + if (!FORCE && + !TIME_LEQ( q->expire, time_uptime )) + goto next; + } + if (q->dyn_type != O_LIMIT_PARENT || !q->count) { + UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); + continue; + } +next: + prev=q; + q=q->next; + } + } + if (pass++ < max_pass) + goto next_pass; +} + +void +ipfw_remove_dyn_children(struct ip_fw *rule) +{ + IPFW_DYN_LOCK(); + remove_dyn_rule(rule, NULL /* force removal */); + IPFW_DYN_UNLOCK(); +} + +/** + * lookup a dynamic rule, locked version + */ +static ipfw_dyn_rule * +lookup_dyn_rule_locked(struct ipfw_flow_id *pkt, int *match_direction, + struct tcphdr *tcp) +{ + /* + * stateful ipfw extensions. + * Lookup into dynamic session queue + */ +#define MATCH_REVERSE 0 +#define MATCH_FORWARD 1 +#define MATCH_NONE 2 +#define MATCH_UNKNOWN 3 + int i, dir = MATCH_NONE; + ipfw_dyn_rule *prev, *q=NULL; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v == NULL) + goto done; /* not found */ + i = hash_packet( pkt ); + for (prev=NULL, q = V_ipfw_dyn_v[i] ; q != NULL ; ) { + if (q->dyn_type == O_LIMIT_PARENT && q->count) + goto next; + if (TIME_LEQ( q->expire, time_uptime)) { /* expire entry */ + UNLINK_DYN_RULE(prev, V_ipfw_dyn_v[i], q); + continue; + } + if (pkt->proto == q->id.proto && + q->dyn_type != O_LIMIT_PARENT) { + if (IS_IP6_FLOW_ID(pkt)) { + if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), + &(q->id.src_ip6)) && + IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), + &(q->id.dst_ip6)) && + pkt->src_port == q->id.src_port && + pkt->dst_port == q->id.dst_port ) { + dir = MATCH_FORWARD; + break; + } + if (IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), + &(q->id.dst_ip6)) && + IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), + &(q->id.src_ip6)) && + pkt->src_port == q->id.dst_port && + pkt->dst_port == q->id.src_port ) { + dir = MATCH_REVERSE; + break; + } + } else { + if (pkt->src_ip == q->id.src_ip && + pkt->dst_ip == q->id.dst_ip && + pkt->src_port == q->id.src_port && + pkt->dst_port == q->id.dst_port ) { + dir = MATCH_FORWARD; + break; + } + if (pkt->src_ip == q->id.dst_ip && + pkt->dst_ip == q->id.src_ip && + pkt->src_port == q->id.dst_port && + pkt->dst_port == q->id.src_port ) { + dir = MATCH_REVERSE; + break; + } + } + } +next: + prev = q; + q = q->next; + } + if (q == NULL) + goto done; /* q = NULL, not found */ + + if ( prev != NULL) { /* found and not in front */ + prev->next = q->next; + q->next = V_ipfw_dyn_v[i]; + V_ipfw_dyn_v[i] = q; + } + if (pkt->proto == IPPROTO_TCP) { /* update state according to flags */ + u_char flags = pkt->flags & (TH_FIN|TH_SYN|TH_RST); + +#define BOTH_SYN (TH_SYN | (TH_SYN << 8)) +#define BOTH_FIN (TH_FIN | (TH_FIN << 8)) + q->state |= (dir == MATCH_FORWARD ) ? flags : (flags << 8); + switch (q->state) { + case TH_SYN: /* opening */ + q->expire = time_uptime + V_dyn_syn_lifetime; + break; + + case BOTH_SYN: /* move to established */ + case BOTH_SYN | TH_FIN : /* one side tries to close */ + case BOTH_SYN | (TH_FIN << 8) : + if (tcp) { +#define _SEQ_GE(a,b) ((int)(a) - (int)(b) >= 0) + u_int32_t ack = ntohl(tcp->th_ack); + if (dir == MATCH_FORWARD) { + if (q->ack_fwd == 0 || _SEQ_GE(ack, q->ack_fwd)) + q->ack_fwd = ack; + else { /* ignore out-of-sequence */ + break; + } + } else { + if (q->ack_rev == 0 || _SEQ_GE(ack, q->ack_rev)) + q->ack_rev = ack; + else { /* ignore out-of-sequence */ + break; + } + } + } + q->expire = time_uptime + V_dyn_ack_lifetime; + break; + + case BOTH_SYN | BOTH_FIN: /* both sides closed */ + if (V_dyn_fin_lifetime >= V_dyn_keepalive_period) + V_dyn_fin_lifetime = V_dyn_keepalive_period - 1; + q->expire = time_uptime + V_dyn_fin_lifetime; + break; + + default: +#if 0 + /* + * reset or some invalid combination, but can also + * occur if we use keep-state the wrong way. + */ + if ( (q->state & ((TH_RST << 8)|TH_RST)) == 0) + printf("invalid state: 0x%x\n", q->state); +#endif + if (V_dyn_rst_lifetime >= V_dyn_keepalive_period) + V_dyn_rst_lifetime = V_dyn_keepalive_period - 1; + q->expire = time_uptime + V_dyn_rst_lifetime; + break; + } + } else if (pkt->proto == IPPROTO_UDP) { + q->expire = time_uptime + V_dyn_udp_lifetime; + } else { + /* other protocols */ + q->expire = time_uptime + V_dyn_short_lifetime; + } +done: + if (match_direction) + *match_direction = dir; + return q; +} + +ipfw_dyn_rule * +ipfw_lookup_dyn_rule(struct ipfw_flow_id *pkt, int *match_direction, + struct tcphdr *tcp) +{ + ipfw_dyn_rule *q; + + IPFW_DYN_LOCK(); + q = lookup_dyn_rule_locked(pkt, match_direction, tcp); + if (q == NULL) + IPFW_DYN_UNLOCK(); + /* NB: return table locked when q is not NULL */ + return q; +} + +static void +realloc_dynamic_table(void) +{ + IPFW_DYN_LOCK_ASSERT(); + + /* + * Try reallocation, make sure we have a power of 2 and do + * not allow more than 64k entries. In case of overflow, + * default to 1024. + */ + + if (V_dyn_buckets > 65536) + V_dyn_buckets = 1024; + if ((V_dyn_buckets & (V_dyn_buckets-1)) != 0) { /* not a power of 2 */ + V_dyn_buckets = V_curr_dyn_buckets; /* reset */ + return; + } + V_curr_dyn_buckets = V_dyn_buckets; + if (V_ipfw_dyn_v != NULL) + free(V_ipfw_dyn_v, M_IPFW); + for (;;) { + V_ipfw_dyn_v = malloc(V_curr_dyn_buckets * sizeof(ipfw_dyn_rule *), + M_IPFW, M_NOWAIT | M_ZERO); + if (V_ipfw_dyn_v != NULL || V_curr_dyn_buckets <= 2) + break; + V_curr_dyn_buckets /= 2; + } +} + +/** + * Install state of type 'type' for a dynamic session. + * The hash table contains two type of rules: + * - regular rules (O_KEEP_STATE) + * - rules for sessions with limited number of sess per user + * (O_LIMIT). When they are created, the parent is + * increased by 1, and decreased on delete. In this case, + * the third parameter is the parent rule and not the chain. + * - "parent" rules for the above (O_LIMIT_PARENT). + */ +static ipfw_dyn_rule * +add_dyn_rule(struct ipfw_flow_id *id, u_int8_t dyn_type, struct ip_fw *rule) +{ + ipfw_dyn_rule *r; + int i; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v == NULL || + (V_dyn_count == 0 && V_dyn_buckets != V_curr_dyn_buckets)) { + realloc_dynamic_table(); + if (V_ipfw_dyn_v == NULL) + return NULL; /* failed ! */ + } + i = hash_packet(id); + + r = uma_zalloc(ipfw_dyn_rule_zone, M_NOWAIT | M_ZERO); + if (r == NULL) { + printf ("ipfw: sorry cannot allocate state\n"); + return NULL; + } + + /* increase refcount on parent, and set pointer */ + if (dyn_type == O_LIMIT) { + ipfw_dyn_rule *parent = (ipfw_dyn_rule *)rule; + if ( parent->dyn_type != O_LIMIT_PARENT) + panic("invalid parent"); + parent->count++; + r->parent = parent; + rule = parent->rule; + } + + r->id = *id; + r->expire = time_uptime + V_dyn_syn_lifetime; + r->rule = rule; + r->dyn_type = dyn_type; + r->pcnt = r->bcnt = 0; + r->count = 0; + + r->bucket = i; + r->next = V_ipfw_dyn_v[i]; + V_ipfw_dyn_v[i] = r; + V_dyn_count++; + DEB({ + struct in_addr da; +#ifdef INET6 + char src[INET6_ADDRSTRLEN]; + char dst[INET6_ADDRSTRLEN]; +#else + char src[INET_ADDRSTRLEN]; + char dst[INET_ADDRSTRLEN]; +#endif + +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(r->id))) { + ip6_sprintf(src, &r->id.src_ip6); + ip6_sprintf(dst, &r->id.dst_ip6); + } else +#endif + { + da.s_addr = htonl(r->id.src_ip); + inet_ntoa_r(da, src); + da.s_addr = htonl(r->id.dst_ip); + inet_ntoa_r(da, dst); + } + printf("ipfw: add dyn entry ty %d %s %d -> %s %d, total %d\n", + dyn_type, src, r->id.src_port, dst, r->id.dst_port, + V_dyn_count); + }) + return r; +} + +/** + * lookup dynamic parent rule using pkt and rule as search keys. + * If the lookup fails, then install one. + */ +static ipfw_dyn_rule * +lookup_dyn_parent(struct ipfw_flow_id *pkt, struct ip_fw *rule) +{ + ipfw_dyn_rule *q; + int i; + + IPFW_DYN_LOCK_ASSERT(); + + if (V_ipfw_dyn_v) { + int is_v6 = IS_IP6_FLOW_ID(pkt); + i = hash_packet( pkt ); + for (q = V_ipfw_dyn_v[i] ; q != NULL ; q=q->next) + if (q->dyn_type == O_LIMIT_PARENT && + rule== q->rule && + pkt->proto == q->id.proto && + pkt->src_port == q->id.src_port && + pkt->dst_port == q->id.dst_port && + ( + (is_v6 && + IN6_ARE_ADDR_EQUAL(&(pkt->src_ip6), + &(q->id.src_ip6)) && + IN6_ARE_ADDR_EQUAL(&(pkt->dst_ip6), + &(q->id.dst_ip6))) || + (!is_v6 && + pkt->src_ip == q->id.src_ip && + pkt->dst_ip == q->id.dst_ip) + ) + ) { + q->expire = time_uptime + V_dyn_short_lifetime; + DEB(printf("ipfw: lookup_dyn_parent found 0x%p\n",q);) + return q; + } + } + return add_dyn_rule(pkt, O_LIMIT_PARENT, rule); +} + +/** + * Install dynamic state for rule type cmd->o.opcode + * + * Returns 1 (failure) if state is not installed because of errors or because + * session limitations are enforced. + */ +int +ipfw_install_state(struct ip_fw *rule, ipfw_insn_limit *cmd, + struct ip_fw_args *args, uint32_t tablearg) +{ + static int last_log; + ipfw_dyn_rule *q; + struct in_addr da; +#ifdef INET6 + char src[INET6_ADDRSTRLEN + 2], dst[INET6_ADDRSTRLEN + 2]; +#else + char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; +#endif + + src[0] = '\0'; + dst[0] = '\0'; + + IPFW_DYN_LOCK(); + + DEB( +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(args->f_id))) { + ip6_sprintf(src, &args->f_id.src_ip6); + ip6_sprintf(dst, &args->f_id.dst_ip6); + } else +#endif + { + da.s_addr = htonl(args->f_id.src_ip); + inet_ntoa_r(da, src); + da.s_addr = htonl(args->f_id.dst_ip); + inet_ntoa_r(da, dst); + } + printf("ipfw: %s: type %d %s %u -> %s %u\n", + __func__, cmd->o.opcode, src, args->f_id.src_port, + dst, args->f_id.dst_port); + src[0] = '\0'; + dst[0] = '\0'; + ) + + q = lookup_dyn_rule_locked(&args->f_id, NULL, NULL); + + if (q != NULL) { /* should never occur */ + if (last_log != time_uptime) { + last_log = time_uptime; + printf("ipfw: %s: entry already present, done\n", + __func__); + } + IPFW_DYN_UNLOCK(); + return (0); + } + + if (V_dyn_count >= V_dyn_max) + /* Run out of slots, try to remove any expired rule. */ + remove_dyn_rule(NULL, (ipfw_dyn_rule *)1); + + if (V_dyn_count >= V_dyn_max) { + if (last_log != time_uptime) { + last_log = time_uptime; + printf("ipfw: %s: Too many dynamic rules\n", __func__); + } + IPFW_DYN_UNLOCK(); + return (1); /* cannot install, notify caller */ + } + + switch (cmd->o.opcode) { + case O_KEEP_STATE: /* bidir rule */ + add_dyn_rule(&args->f_id, O_KEEP_STATE, rule); + break; + + case O_LIMIT: { /* limit number of sessions */ + struct ipfw_flow_id id; + ipfw_dyn_rule *parent; + uint32_t conn_limit; + uint16_t limit_mask = cmd->limit_mask; + + conn_limit = (cmd->conn_limit == IP_FW_TABLEARG) ? + tablearg : cmd->conn_limit; + + DEB( + if (cmd->conn_limit == IP_FW_TABLEARG) + printf("ipfw: %s: O_LIMIT rule, conn_limit: %u " + "(tablearg)\n", __func__, conn_limit); + else + printf("ipfw: %s: O_LIMIT rule, conn_limit: %u\n", + __func__, conn_limit); + ) + + id.dst_ip = id.src_ip = id.dst_port = id.src_port = 0; + id.proto = args->f_id.proto; + id.addr_type = args->f_id.addr_type; + id.fib = M_GETFIB(args->m); + + if (IS_IP6_FLOW_ID (&(args->f_id))) { + if (limit_mask & DYN_SRC_ADDR) + id.src_ip6 = args->f_id.src_ip6; + if (limit_mask & DYN_DST_ADDR) + id.dst_ip6 = args->f_id.dst_ip6; + } else { + if (limit_mask & DYN_SRC_ADDR) + id.src_ip = args->f_id.src_ip; + if (limit_mask & DYN_DST_ADDR) + id.dst_ip = args->f_id.dst_ip; + } + if (limit_mask & DYN_SRC_PORT) + id.src_port = args->f_id.src_port; + if (limit_mask & DYN_DST_PORT) + id.dst_port = args->f_id.dst_port; + if ((parent = lookup_dyn_parent(&id, rule)) == NULL) { + printf("ipfw: %s: add parent failed\n", __func__); + IPFW_DYN_UNLOCK(); + return (1); + } + + if (parent->count >= conn_limit) { + /* See if we can remove some expired rule. */ + remove_dyn_rule(rule, parent); + if (parent->count >= conn_limit) { + if (V_fw_verbose && last_log != time_uptime) { + last_log = time_uptime; +#ifdef INET6 + /* + * XXX IPv6 flows are not + * supported yet. + */ + if (IS_IP6_FLOW_ID(&(args->f_id))) { + char ip6buf[INET6_ADDRSTRLEN]; + snprintf(src, sizeof(src), + "[%s]", ip6_sprintf(ip6buf, + &args->f_id.src_ip6)); + snprintf(dst, sizeof(dst), + "[%s]", ip6_sprintf(ip6buf, + &args->f_id.dst_ip6)); + } else +#endif + { + da.s_addr = + htonl(args->f_id.src_ip); + inet_ntoa_r(da, src); + da.s_addr = + htonl(args->f_id.dst_ip); + inet_ntoa_r(da, dst); + } + log(LOG_SECURITY | LOG_DEBUG, + "ipfw: %d %s %s:%u -> %s:%u, %s\n", + parent->rule->rulenum, + "drop session", + src, (args->f_id.src_port), + dst, (args->f_id.dst_port), + "too many entries"); + } + IPFW_DYN_UNLOCK(); + return (1); + } + } + add_dyn_rule(&args->f_id, O_LIMIT, (struct ip_fw *)parent); + break; + } + default: + printf("ipfw: %s: unknown dynamic rule type %u\n", + __func__, cmd->o.opcode); + IPFW_DYN_UNLOCK(); + return (1); + } + + /* XXX just set lifetime */ + lookup_dyn_rule_locked(&args->f_id, NULL, NULL); + + IPFW_DYN_UNLOCK(); + return (0); +} + +/* + * Generate a TCP packet, containing either a RST or a keepalive. + * When flags & TH_RST, we are sending a RST packet, because of a + * "reset" action matched the packet. + * Otherwise we are sending a keepalive, and flags & TH_ + * The 'replyto' mbuf is the mbuf being replied to, if any, and is required + * so that MAC can label the reply appropriately. + */ +struct mbuf * +ipfw_send_pkt(struct mbuf *replyto, struct ipfw_flow_id *id, u_int32_t seq, + u_int32_t ack, int flags) +{ + struct mbuf *m; + int len, dir; + struct ip *h = NULL; /* stupid compiler */ +#ifdef INET6 + struct ip6_hdr *h6 = NULL; +#endif + struct tcphdr *th = NULL; + + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (m == NULL) + return (NULL); + + M_SETFIB(m, id->fib); +#ifdef MAC + if (replyto != NULL) + mac_netinet_firewall_reply(replyto, m); + else + mac_netinet_firewall_send(m); +#else + (void)replyto; /* don't warn about unused arg */ +#endif + + switch (id->addr_type) { + case 4: + len = sizeof(struct ip) + sizeof(struct tcphdr); + break; +#ifdef INET6 + case 6: + len = sizeof(struct ip6_hdr) + sizeof(struct tcphdr); + break; +#endif + default: + /* XXX: log me?!? */ + FREE_PKT(m); + return (NULL); + } + dir = ((flags & (TH_SYN | TH_RST)) == TH_SYN); + + m->m_data += max_linkhdr; + m->m_flags |= M_SKIP_FIREWALL; + m->m_pkthdr.len = m->m_len = len; + m->m_pkthdr.rcvif = NULL; + bzero(m->m_data, len); + + switch (id->addr_type) { + case 4: + h = mtod(m, struct ip *); + + /* prepare for checksum */ + h->ip_p = IPPROTO_TCP; + h->ip_len = htons(sizeof(struct tcphdr)); + if (dir) { + h->ip_src.s_addr = htonl(id->src_ip); + h->ip_dst.s_addr = htonl(id->dst_ip); + } else { + h->ip_src.s_addr = htonl(id->dst_ip); + h->ip_dst.s_addr = htonl(id->src_ip); + } + + th = (struct tcphdr *)(h + 1); + break; +#ifdef INET6 + case 6: + h6 = mtod(m, struct ip6_hdr *); + + /* prepare for checksum */ + h6->ip6_nxt = IPPROTO_TCP; + h6->ip6_plen = htons(sizeof(struct tcphdr)); + if (dir) { + h6->ip6_src = id->src_ip6; + h6->ip6_dst = id->dst_ip6; + } else { + h6->ip6_src = id->dst_ip6; + h6->ip6_dst = id->src_ip6; + } + + th = (struct tcphdr *)(h6 + 1); + break; +#endif + } + + if (dir) { + th->th_sport = htons(id->src_port); + th->th_dport = htons(id->dst_port); + } else { + th->th_sport = htons(id->dst_port); + th->th_dport = htons(id->src_port); + } + th->th_off = sizeof(struct tcphdr) >> 2; + + if (flags & TH_RST) { + if (flags & TH_ACK) { + th->th_seq = htonl(ack); + th->th_flags = TH_RST; + } else { + if (flags & TH_SYN) + seq++; + th->th_ack = htonl(seq); + th->th_flags = TH_RST | TH_ACK; + } + } else { + /* + * Keepalive - use caller provided sequence numbers + */ + th->th_seq = htonl(seq); + th->th_ack = htonl(ack); + th->th_flags = TH_ACK; + } + + switch (id->addr_type) { + case 4: + th->th_sum = in_cksum(m, len); + + /* finish the ip header */ + h->ip_v = 4; + h->ip_hl = sizeof(*h) >> 2; + h->ip_tos = IPTOS_LOWDELAY; + h->ip_off = 0; + /* ip_len must be in host format for ip_output */ + h->ip_len = len; + h->ip_ttl = V_ip_defttl; + h->ip_sum = 0; + break; +#ifdef INET6 + case 6: + th->th_sum = in6_cksum(m, IPPROTO_TCP, sizeof(*h6), + sizeof(struct tcphdr)); + + /* finish the ip6 header */ + h6->ip6_vfc |= IPV6_VERSION; + h6->ip6_hlim = IPV6_DEFHLIM; + break; +#endif + } + + return (m); +} + +/* + * This procedure is only used to handle keepalives. It is invoked + * every dyn_keepalive_period + */ +static void +ipfw_tick(void * vnetx) +{ + struct mbuf *m0, *m, *mnext, **mtailp; +#ifdef INET6 + struct mbuf *m6, **m6_tailp; +#endif + int i; + ipfw_dyn_rule *q; +#ifdef VIMAGE + struct vnet *vp = vnetx; +#endif + + CURVNET_SET(vp); + if (V_dyn_keepalive == 0 || V_ipfw_dyn_v == NULL || V_dyn_count == 0) + goto done; + + /* + * We make a chain of packets to go out here -- not deferring + * until after we drop the IPFW dynamic rule lock would result + * in a lock order reversal with the normal packet input -> ipfw + * call stack. + */ + m0 = NULL; + mtailp = &m0; +#ifdef INET6 + m6 = NULL; + m6_tailp = &m6; +#endif + IPFW_DYN_LOCK(); + for (i = 0 ; i < V_curr_dyn_buckets ; i++) { + for (q = V_ipfw_dyn_v[i] ; q ; q = q->next ) { + if (q->dyn_type == O_LIMIT_PARENT) + continue; + if (q->id.proto != IPPROTO_TCP) + continue; + if ( (q->state & BOTH_SYN) != BOTH_SYN) + continue; + if (TIME_LEQ(time_uptime + V_dyn_keepalive_interval, + q->expire)) + continue; /* too early */ + if (TIME_LEQ(q->expire, time_uptime)) + continue; /* too late, rule expired */ + + m = ipfw_send_pkt(NULL, &(q->id), q->ack_rev - 1, + q->ack_fwd, TH_SYN); + mnext = ipfw_send_pkt(NULL, &(q->id), q->ack_fwd - 1, + q->ack_rev, 0); + + switch (q->id.addr_type) { + case 4: + if (m != NULL) { + *mtailp = m; + mtailp = &(*mtailp)->m_nextpkt; + } + if (mnext != NULL) { + *mtailp = mnext; + mtailp = &(*mtailp)->m_nextpkt; + } + break; +#ifdef INET6 + case 6: + if (m != NULL) { + *m6_tailp = m; + m6_tailp = &(*m6_tailp)->m_nextpkt; + } + if (mnext != NULL) { + *m6_tailp = mnext; + m6_tailp = &(*m6_tailp)->m_nextpkt; + } + break; +#endif + } + + m = mnext = NULL; + } + } + IPFW_DYN_UNLOCK(); + for (m = mnext = m0; m != NULL; m = mnext) { + mnext = m->m_nextpkt; + m->m_nextpkt = NULL; + ip_output(m, NULL, NULL, 0, NULL, NULL); + } +#ifdef INET6 + for (m = mnext = m6; m != NULL; m = mnext) { + mnext = m->m_nextpkt; + m->m_nextpkt = NULL; + ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL); + } +#endif +done: + callout_reset(&V_ipfw_timeout, V_dyn_keepalive_period * hz, + ipfw_tick, vnetx); + CURVNET_RESTORE(); +} + +void +ipfw_dyn_attach(void) +{ + ipfw_dyn_rule_zone = uma_zcreate("IPFW dynamic rule", + sizeof(ipfw_dyn_rule), NULL, NULL, NULL, NULL, + UMA_ALIGN_PTR, 0); + + IPFW_DYN_LOCK_INIT(); +} + +void +ipfw_dyn_detach(void) +{ + uma_zdestroy(ipfw_dyn_rule_zone); + IPFW_DYN_LOCK_DESTROY(); +} + +void +ipfw_dyn_init(void) +{ + V_ipfw_dyn_v = NULL; + V_dyn_buckets = 256; /* must be power of 2 */ + V_curr_dyn_buckets = 256; /* must be power of 2 */ + + V_dyn_ack_lifetime = 300; + V_dyn_syn_lifetime = 20; + V_dyn_fin_lifetime = 1; + V_dyn_rst_lifetime = 1; + V_dyn_udp_lifetime = 10; + V_dyn_short_lifetime = 5; + + V_dyn_keepalive_interval = 20; + V_dyn_keepalive_period = 5; + V_dyn_keepalive = 1; /* do send keepalives */ + + V_dyn_max = 4096; /* max # of dynamic rules */ + callout_init(&V_ipfw_timeout, CALLOUT_MPSAFE); + callout_reset(&V_ipfw_timeout, hz, ipfw_tick, curvnet); +} + +void +ipfw_dyn_uninit(int pass) +{ + if (pass == 0) + callout_drain(&V_ipfw_timeout); + else { + if (V_ipfw_dyn_v != NULL) + free(V_ipfw_dyn_v, M_IPFW); + } +} + +int +ipfw_dyn_len(void) +{ + return (V_ipfw_dyn_v == NULL) ? 0 : + (V_dyn_count * sizeof(ipfw_dyn_rule)); +} + +void +ipfw_get_dynamic(char **pbp, const char *ep) +{ + ipfw_dyn_rule *p, *last = NULL; + char *bp; + int i; + + if (V_ipfw_dyn_v == NULL) + return; + bp = *pbp; + + IPFW_DYN_LOCK(); + for (i = 0 ; i < V_curr_dyn_buckets; i++) + for (p = V_ipfw_dyn_v[i] ; p != NULL; p = p->next) { + if (bp + sizeof *p <= ep) { + ipfw_dyn_rule *dst = + (ipfw_dyn_rule *)bp; + bcopy(p, dst, sizeof *p); + bcopy(&(p->rule->rulenum), &(dst->rule), + sizeof(p->rule->rulenum)); + /* + * store set number into high word of + * dst->rule pointer. + */ + bcopy(&(p->rule->set), + (char *)&dst->rule + + sizeof(p->rule->rulenum), + sizeof(p->rule->set)); + /* + * store a non-null value in "next". + * The userland code will interpret a + * NULL here as a marker + * for the last dynamic rule. + */ + bcopy(&dst, &dst->next, sizeof(dst)); + last = dst; + dst->expire = + TIME_LEQ(dst->expire, time_uptime) ? + 0 : dst->expire - time_uptime ; + bp += sizeof(ipfw_dyn_rule); + } + } + IPFW_DYN_UNLOCK(); + if (last != NULL) /* mark last dynamic rule */ + bzero(&last->next, sizeof(last)); + *pbp = bp; +} +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_log.c b/sys/netinet/ipfw/ip_fw_log.c new file mode 100644 index 000000000000..a5178dbc5c76 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_log.c @@ -0,0 +1,433 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Logging support for ipfw + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include +#include +#include +#include +#include /* for ETHERTYPE_IP */ +#include +#include +#include /* for IFT_ETHER */ +#include /* for BPF */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#ifdef INET6 +#include /* ip6_sprintf() */ +#endif + +#ifdef MAC +#include +#endif + +/* + * L3HDR maps an ipv4 pointer into a layer3 header pointer of type T + * Other macros just cast void * into the appropriate type + */ +#define L3HDR(T, ip) ((T *)((u_int32_t *)(ip) + (ip)->ip_hl)) +#define TCP(p) ((struct tcphdr *)(p)) +#define SCTP(p) ((struct sctphdr *)(p)) +#define UDP(p) ((struct udphdr *)(p)) +#define ICMP(p) ((struct icmphdr *)(p)) +#define ICMP6(p) ((struct icmp6_hdr *)(p)) + +#define SNPARGS(buf, len) buf + len, sizeof(buf) > len ? sizeof(buf) - len : 0 +#define SNP(buf) buf, sizeof(buf) + +#ifdef WITHOUT_BPF +void +ipfw_log_bpf(int onoff) +{ +} +#else /* !WITHOUT_BPF */ +static struct ifnet *log_if; /* hook to attach to bpf */ + +/* we use this dummy function for all ifnet callbacks */ +static int +log_dummy(struct ifnet *ifp, u_long cmd, caddr_t addr) +{ + return EINVAL; +} + +void +ipfw_log_bpf(int onoff) +{ + struct ifnet *ifp; + + if (onoff) { + if (log_if) + return; + ifp = if_alloc(IFT_ETHER); + if (ifp == NULL) + return; + if_initname(ifp, "ipfw", 0); + ifp->if_mtu = 65536; + ifp->if_flags = IFF_UP | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_init = (void *)log_dummy; + ifp->if_ioctl = log_dummy; + ifp->if_start = (void *)log_dummy; + ifp->if_output = (void *)log_dummy; + ifp->if_addrlen = 6; + ifp->if_hdrlen = 14; + if_attach(ifp); + ifp->if_baudrate = IF_Mbps(10); + bpfattach(ifp, DLT_EN10MB, 14); + log_if = ifp; + } else { + if (log_if) { + ether_ifdetach(log_if); + if_free(log_if); + } + log_if = NULL; + } +} +#endif /* !WITHOUT_BPF */ + +/* + * We enter here when we have a rule with O_LOG. + * XXX this function alone takes about 2Kbytes of code! + */ +void +ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, + struct mbuf *m, struct ifnet *oif, u_short offset, uint32_t tablearg, + struct ip *ip) +{ + char *action; + int limit_reached = 0; + char action2[40], proto[128], fragment[32]; + + if (V_fw_verbose == 0) { +#ifndef WITHOUT_BPF + struct m_hdr mh; + + if (log_if == NULL || log_if->if_bpf == NULL) + return; + /* BPF treats the "mbuf" as read-only */ + mh.mh_next = m; + mh.mh_len = ETHER_HDR_LEN; + if (args->eh) { /* layer2, use orig hdr */ + mh.mh_data = (char *)args->eh; + } else { + /* add fake header. Later we will store + * more info in the header + */ + mh.mh_data = "DDDDDDSSSSSS\x08\x00"; + } + BPF_MTAP(log_if, (struct mbuf *)&mh); +#endif /* !WITHOUT_BPF */ + return; + } + /* the old 'log' function */ + fragment[0] = '\0'; + proto[0] = '\0'; + + if (f == NULL) { /* bogus pkt */ + if (V_verbose_limit != 0 && V_norule_counter >= V_verbose_limit) + return; + V_norule_counter++; + if (V_norule_counter == V_verbose_limit) + limit_reached = V_verbose_limit; + action = "Refuse"; + } else { /* O_LOG is the first action, find the real one */ + ipfw_insn *cmd = ACTION_PTR(f); + ipfw_insn_log *l = (ipfw_insn_log *)cmd; + + if (l->max_log != 0 && l->log_left == 0) + return; + l->log_left--; + if (l->log_left == 0) + limit_reached = l->max_log; + cmd += F_LEN(cmd); /* point to first action */ + if (cmd->opcode == O_ALTQ) { + ipfw_insn_altq *altq = (ipfw_insn_altq *)cmd; + + snprintf(SNPARGS(action2, 0), "Altq %d", + altq->qid); + cmd += F_LEN(cmd); + } + if (cmd->opcode == O_PROB) + cmd += F_LEN(cmd); + + if (cmd->opcode == O_TAG) + cmd += F_LEN(cmd); + + action = action2; + switch (cmd->opcode) { + case O_DENY: + action = "Deny"; + break; + + case O_REJECT: + if (cmd->arg1==ICMP_REJECT_RST) + action = "Reset"; + else if (cmd->arg1==ICMP_UNREACH_HOST) + action = "Reject"; + else + snprintf(SNPARGS(action2, 0), "Unreach %d", + cmd->arg1); + break; + + case O_UNREACH6: + if (cmd->arg1==ICMP6_UNREACH_RST) + action = "Reset"; + else + snprintf(SNPARGS(action2, 0), "Unreach %d", + cmd->arg1); + break; + + case O_ACCEPT: + action = "Accept"; + break; + case O_COUNT: + action = "Count"; + break; + case O_DIVERT: + snprintf(SNPARGS(action2, 0), "Divert %d", + cmd->arg1); + break; + case O_TEE: + snprintf(SNPARGS(action2, 0), "Tee %d", + cmd->arg1); + break; + case O_SETFIB: + snprintf(SNPARGS(action2, 0), "SetFib %d", + cmd->arg1); + break; + case O_SKIPTO: + snprintf(SNPARGS(action2, 0), "SkipTo %d", + cmd->arg1); + break; + case O_PIPE: + snprintf(SNPARGS(action2, 0), "Pipe %d", + cmd->arg1); + break; + case O_QUEUE: + snprintf(SNPARGS(action2, 0), "Queue %d", + cmd->arg1); + break; + case O_FORWARD_IP: { + ipfw_insn_sa *sa = (ipfw_insn_sa *)cmd; + int len; + struct in_addr dummyaddr; + if (sa->sa.sin_addr.s_addr == INADDR_ANY) + dummyaddr.s_addr = htonl(tablearg); + else + dummyaddr.s_addr = sa->sa.sin_addr.s_addr; + + len = snprintf(SNPARGS(action2, 0), "Forward to %s", + inet_ntoa(dummyaddr)); + + if (sa->sa.sin_port) + snprintf(SNPARGS(action2, len), ":%d", + sa->sa.sin_port); + } + break; + case O_NETGRAPH: + snprintf(SNPARGS(action2, 0), "Netgraph %d", + cmd->arg1); + break; + case O_NGTEE: + snprintf(SNPARGS(action2, 0), "Ngtee %d", + cmd->arg1); + break; + case O_NAT: + action = "Nat"; + break; + case O_REASS: + action = "Reass"; + break; + default: + action = "UNKNOWN"; + break; + } + } + + if (hlen == 0) { /* non-ip */ + snprintf(SNPARGS(proto, 0), "MAC"); + + } else { + int len; +#ifdef INET6 + char src[INET6_ADDRSTRLEN + 2], dst[INET6_ADDRSTRLEN + 2]; +#else + char src[INET_ADDRSTRLEN], dst[INET_ADDRSTRLEN]; +#endif + struct icmphdr *icmp; + struct tcphdr *tcp; + struct udphdr *udp; +#ifdef INET6 + struct ip6_hdr *ip6 = NULL; + struct icmp6_hdr *icmp6; +#endif + src[0] = '\0'; + dst[0] = '\0'; +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(args->f_id))) { + char ip6buf[INET6_ADDRSTRLEN]; + snprintf(src, sizeof(src), "[%s]", + ip6_sprintf(ip6buf, &args->f_id.src_ip6)); + snprintf(dst, sizeof(dst), "[%s]", + ip6_sprintf(ip6buf, &args->f_id.dst_ip6)); + + ip6 = (struct ip6_hdr *)ip; + tcp = (struct tcphdr *)(((char *)ip) + hlen); + udp = (struct udphdr *)(((char *)ip) + hlen); + } else +#endif + { + tcp = L3HDR(struct tcphdr, ip); + udp = L3HDR(struct udphdr, ip); + + inet_ntoa_r(ip->ip_src, src); + inet_ntoa_r(ip->ip_dst, dst); + } + + switch (args->f_id.proto) { + case IPPROTO_TCP: + len = snprintf(SNPARGS(proto, 0), "TCP %s", src); + if (offset == 0) + snprintf(SNPARGS(proto, len), ":%d %s:%d", + ntohs(tcp->th_sport), + dst, + ntohs(tcp->th_dport)); + else + snprintf(SNPARGS(proto, len), " %s", dst); + break; + + case IPPROTO_UDP: + len = snprintf(SNPARGS(proto, 0), "UDP %s", src); + if (offset == 0) + snprintf(SNPARGS(proto, len), ":%d %s:%d", + ntohs(udp->uh_sport), + dst, + ntohs(udp->uh_dport)); + else + snprintf(SNPARGS(proto, len), " %s", dst); + break; + + case IPPROTO_ICMP: + icmp = L3HDR(struct icmphdr, ip); + if (offset == 0) + len = snprintf(SNPARGS(proto, 0), + "ICMP:%u.%u ", + icmp->icmp_type, icmp->icmp_code); + else + len = snprintf(SNPARGS(proto, 0), "ICMP "); + len += snprintf(SNPARGS(proto, len), "%s", src); + snprintf(SNPARGS(proto, len), " %s", dst); + break; +#ifdef INET6 + case IPPROTO_ICMPV6: + icmp6 = (struct icmp6_hdr *)(((char *)ip) + hlen); + if (offset == 0) + len = snprintf(SNPARGS(proto, 0), + "ICMPv6:%u.%u ", + icmp6->icmp6_type, icmp6->icmp6_code); + else + len = snprintf(SNPARGS(proto, 0), "ICMPv6 "); + len += snprintf(SNPARGS(proto, len), "%s", src); + snprintf(SNPARGS(proto, len), " %s", dst); + break; +#endif + default: + len = snprintf(SNPARGS(proto, 0), "P:%d %s", + args->f_id.proto, src); + snprintf(SNPARGS(proto, len), " %s", dst); + break; + } + +#ifdef INET6 + if (IS_IP6_FLOW_ID(&(args->f_id))) { + if (offset & (IP6F_OFF_MASK | IP6F_MORE_FRAG)) + snprintf(SNPARGS(fragment, 0), + " (frag %08x:%d@%d%s)", + args->f_id.frag_id6, + ntohs(ip6->ip6_plen) - hlen, + ntohs(offset & IP6F_OFF_MASK) << 3, + (offset & IP6F_MORE_FRAG) ? "+" : ""); + } else +#endif + { + int ipoff, iplen; + ipoff = ntohs(ip->ip_off); + iplen = ntohs(ip->ip_len); + if (ipoff & (IP_MF | IP_OFFMASK)) + snprintf(SNPARGS(fragment, 0), + " (frag %d:%d@%d%s)", + ntohs(ip->ip_id), iplen - (ip->ip_hl << 2), + offset << 3, + (ipoff & IP_MF) ? "+" : ""); + } + } + if (oif || m->m_pkthdr.rcvif) + log(LOG_SECURITY | LOG_INFO, + "ipfw: %d %s %s %s via %s%s\n", + f ? f->rulenum : -1, + action, proto, oif ? "out" : "in", + oif ? oif->if_xname : m->m_pkthdr.rcvif->if_xname, + fragment); + else + log(LOG_SECURITY | LOG_INFO, + "ipfw: %d %s %s [no if info]%s\n", + f ? f->rulenum : -1, + action, proto, fragment); + if (limit_reached) + log(LOG_SECURITY | LOG_NOTICE, + "ipfw: limit %d reached on entry %d\n", + limit_reached, f ? f->rulenum : -1); +} +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_nat.c b/sys/netinet/ipfw/ip_fw_nat.c index cd6a1cfd7406..f30b754dc162 100644 --- a/sys/netinet/ipfw/ip_fw_nat.c +++ b/sys/netinet/ipfw/ip_fw_nat.c @@ -29,114 +29,80 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include -#include #include #include -#include #include -#include -#include #include -#include -#include -#include -#include -#include + +#define IPFW_INTERNAL /* Access to protected data structures in ip_fw.h. */ #include #include -#define IPFW_INTERNAL /* Access to protected data structures in ip_fw.h. */ - #include #include #include #include -#include #include +#include #include -#include -#include -#include #include -#include #include /* XXX for in_cksum */ -MALLOC_DECLARE(M_IPFW); - static VNET_DEFINE(eventhandler_tag, ifaddr_event_tag); #define V_ifaddr_event_tag VNET(ifaddr_event_tag) -extern ipfw_nat_t *ipfw_nat_ptr; -extern ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; -extern ipfw_nat_cfg_t *ipfw_nat_del_ptr; -extern ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; -extern ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; - -static void +static void ifaddr_change(void *arg __unused, struct ifnet *ifp) { struct cfg_nat *ptr; struct ifaddr *ifa; + struct ip_fw_chain *chain; - IPFW_WLOCK(&V_layer3_chain); + chain = &V_layer3_chain; + IPFW_WLOCK(chain); /* Check every nat entry... */ - LIST_FOREACH(ptr, &V_layer3_chain.nat, _next) { + LIST_FOREACH(ptr, &chain->nat, _next) { /* ...using nic 'ifp->if_xname' as dynamic alias address. */ - if (strncmp(ptr->if_name, ifp->if_xname, IF_NAMESIZE) == 0) { - if_addr_rlock(ifp); - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { - if (ifa->ifa_addr == NULL) - continue; - if (ifa->ifa_addr->sa_family != AF_INET) - continue; - ptr->ip = ((struct sockaddr_in *) - (ifa->ifa_addr))->sin_addr; - LibAliasSetAddress(ptr->lib, ptr->ip); - } - if_addr_runlock(ifp); + if (strncmp(ptr->if_name, ifp->if_xname, IF_NAMESIZE) != 0) + continue; + if_addr_rlock(ifp); + TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { + if (ifa->ifa_addr == NULL) + continue; + if (ifa->ifa_addr->sa_family != AF_INET) + continue; + ptr->ip = ((struct sockaddr_in *) + (ifa->ifa_addr))->sin_addr; + LibAliasSetAddress(ptr->lib, ptr->ip); } + if_addr_runlock(ifp); } - IPFW_WUNLOCK(&V_layer3_chain); + IPFW_WUNLOCK(chain); } +/* + * delete the pointers for nat entry ix, or all of them if ix < 0 + */ static void -flush_nat_ptrs(const int i) +flush_nat_ptrs(struct ip_fw_chain *chain, const int ix) { - struct ip_fw *rule; + int i; + ipfw_insn_nat *cmd; - IPFW_WLOCK_ASSERT(&V_layer3_chain); - for (rule = V_layer3_chain.rules; rule; rule = rule->next) { - ipfw_insn_nat *cmd = (ipfw_insn_nat *)ACTION_PTR(rule); - if (cmd->o.opcode != O_NAT) - continue; - if (cmd->nat != NULL && cmd->nat->id == i) + IPFW_WLOCK_ASSERT(chain); + for (i = 0; i < chain->n_rules; i++) { + cmd = (ipfw_insn_nat *)ACTION_PTR(chain->map[i]); + /* XXX skip log and the like ? */ + if (cmd->o.opcode == O_NAT && cmd->nat != NULL && + (ix < 0 || cmd->nat->id == ix)) cmd->nat = NULL; } } -#define HOOK_NAT(b, p) do { \ - IPFW_WLOCK_ASSERT(&V_layer3_chain); \ - LIST_INSERT_HEAD(b, p, _next); \ - } while (0) - -#define UNHOOK_NAT(p) do { \ - IPFW_WLOCK_ASSERT(&V_layer3_chain); \ - LIST_REMOVE(p, _next); \ - } while (0) - -#define HOOK_REDIR(b, p) do { \ - LIST_INSERT_HEAD(b, p, _next); \ - } while (0) - -#define HOOK_SPOOL(b, p) do { \ - LIST_INSERT_HEAD(b, p, _next); \ - } while (0) - static void del_redir_spool_cfg(struct cfg_nat *n, struct redir_chain *head) { @@ -165,9 +131,9 @@ del_redir_spool_cfg(struct cfg_nat *n, struct redir_chain *head) free(r, M_IPFW); break; default: - printf("unknown redirect mode: %u\n", r->mode); + printf("unknown redirect mode: %u\n", r->mode); /* XXX - panic?!?!? */ - break; + break; } } } @@ -178,7 +144,6 @@ add_redir_spool_cfg(char *buf, struct cfg_nat *ptr) struct cfg_redir *r, *ser_r; struct cfg_spool *s, *ser_s; int cnt, off, i; - char *panic_err; for (cnt = 0, off = 0; cnt < ptr->redir_cnt; cnt++) { ser_r = (struct cfg_redir *)&buf[off]; @@ -201,7 +166,7 @@ add_redir_spool_cfg(char *buf, struct cfg_nat *ptr) remotePortCopy = 0; r->alink[i] = LibAliasRedirectPort(ptr->lib, r->laddr, htons(r->lport + i), r->raddr, - htons(remotePortCopy), r->paddr, + htons(remotePortCopy), r->paddr, htons(r->pport + i), r->proto); if (r->alink[i] == NULL) { r->alink[0] = NULL; @@ -215,30 +180,26 @@ add_redir_spool_cfg(char *buf, struct cfg_nat *ptr) break; default: printf("unknown redirect mode: %u\n", r->mode); - break; + break; + } + /* XXX perhaps return an error instead of panic ? */ + if (r->alink[0] == NULL) + panic("LibAliasRedirect* returned NULL"); + /* LSNAT handling. */ + for (i = 0; i < r->spool_cnt; i++) { + ser_s = (struct cfg_spool *)&buf[off]; + s = malloc(SOF_REDIR, M_IPFW, M_WAITOK | M_ZERO); + memcpy(s, ser_s, SOF_SPOOL); + LibAliasAddServer(ptr->lib, r->alink[0], + s->addr, htons(s->port)); + off += SOF_SPOOL; + /* Hook spool entry. */ + LIST_INSERT_HEAD(&r->spool_chain, s, _next); } - if (r->alink[0] == NULL) { - panic_err = "LibAliasRedirect* returned NULL"; - goto bad; - } else /* LSNAT handling. */ - for (i = 0; i < r->spool_cnt; i++) { - ser_s = (struct cfg_spool *)&buf[off]; - s = malloc(SOF_REDIR, M_IPFW, - M_WAITOK | M_ZERO); - memcpy(s, ser_s, SOF_SPOOL); - LibAliasAddServer(ptr->lib, r->alink[0], - s->addr, htons(s->port)); - off += SOF_SPOOL; - /* Hook spool entry. */ - HOOK_SPOOL(&r->spool_chain, s); - } /* And finally hook this redir entry. */ - HOOK_REDIR(&ptr->redir_chain, r); + LIST_INSERT_HEAD(&ptr->redir_chain, r, _next); } return (1); -bad: - /* something really bad happened: panic! */ - panic("%s\n", panic_err); } static int @@ -252,101 +213,80 @@ ipfw_nat(struct ip_fw_args *args, struct cfg_nat *t, struct mbuf *m) ldt = 0; retval = 0; - if ((mcl = m_megapullup(m, m->m_pkthdr.len)) == - NULL) - goto badnat; - ip = mtod(mcl, struct ip *); - if (args->eh == NULL) { - ip->ip_len = htons(ip->ip_len); - ip->ip_off = htons(ip->ip_off); + mcl = m_megapullup(m, m->m_pkthdr.len); + if (mcl == NULL) { + args->m = NULL; + return (IP_FW_DENY); } + ip = mtod(mcl, struct ip *); - /* + /* * XXX - Libalias checksum offload 'duct tape': - * - * locally generated packets have only - * pseudo-header checksum calculated - * and libalias will screw it[1], so - * mark them for later fix. Moreover - * there are cases when libalias - * modify tcp packet data[2], mark it - * for later fix too. * - * [1] libalias was never meant to run - * in kernel, so it doesn't have any - * knowledge about checksum - * offloading, and it expects a packet - * with a full internet - * checksum. Unfortunately, packets - * generated locally will have just the - * pseudo header calculated, and when - * libalias tries to adjust the - * checksum it will actually screw it. + * locally generated packets have only pseudo-header checksum + * calculated and libalias will break it[1], so mark them for + * later fix. Moreover there are cases when libalias modifies + * tcp packet data[2], mark them for later fix too. * - * [2] when libalias modify tcp's data - * content, full TCP checksum has to - * be recomputed: the problem is that - * libalias doesn't have any idea - * about checksum offloading To - * workaround this, we do not do - * checksumming in LibAlias, but only - * mark the packets in th_x2 field. If - * we receive a marked packet, we - * calculate correct checksum for it - * aware of offloading. Why such a - * terrible hack instead of - * recalculating checksum for each - * packet? Because the previous - * checksum was not checked! - * Recalculating checksums for EVERY - * packet will hide ALL transmission - * errors. Yes, marked packets still - * suffer from this problem. But, - * sigh, natd(8) has this problem, - * too. + * [1] libalias was never meant to run in kernel, so it does + * not have any knowledge about checksum offloading, and + * expects a packet with a full internet checksum. + * Unfortunately, packets generated locally will have just the + * pseudo header calculated, and when libalias tries to adjust + * the checksum it will actually compute a wrong value. + * + * [2] when libalias modifies tcp's data content, full TCP + * checksum has to be recomputed: the problem is that + * libalias does not have any idea about checksum offloading. + * To work around this, we do not do checksumming in LibAlias, + * but only mark the packets in th_x2 field. If we receive a + * marked packet, we calculate correct checksum for it + * aware of offloading. Why such a terrible hack instead of + * recalculating checksum for each packet? + * Because the previous checksum was not checked! + * Recalculating checksums for EVERY packet will hide ALL + * transmission errors. Yes, marked packets still suffer from + * this problem. But, sigh, natd(8) has this problem, too. * * TODO: -make libalias mbuf aware (so * it can handle delayed checksum and tso) */ - if (mcl->m_pkthdr.rcvif == NULL && - mcl->m_pkthdr.csum_flags & - CSUM_DELAY_DATA) + if (mcl->m_pkthdr.rcvif == NULL && + mcl->m_pkthdr.csum_flags & CSUM_DELAY_DATA) ldt = 1; c = mtod(mcl, char *); if (args->oif == NULL) - retval = LibAliasIn(t->lib, c, + retval = LibAliasIn(t->lib, c, mcl->m_len + M_TRAILINGSPACE(mcl)); else - retval = LibAliasOut(t->lib, c, + retval = LibAliasOut(t->lib, c, mcl->m_len + M_TRAILINGSPACE(mcl)); if (retval == PKT_ALIAS_RESPOND) { - m->m_flags |= M_SKIP_FIREWALL; - retval = PKT_ALIAS_OK; + m->m_flags |= M_SKIP_FIREWALL; + retval = PKT_ALIAS_OK; } if (retval != PKT_ALIAS_OK && retval != PKT_ALIAS_FOUND_HEADER_FRAGMENT) { /* XXX - should i add some logging? */ m_free(mcl); - badnat: args->m = NULL; return (IP_FW_DENY); } - mcl->m_pkthdr.len = mcl->m_len = - ntohs(ip->ip_len); + mcl->m_pkthdr.len = mcl->m_len = ntohs(ip->ip_len); - /* - * XXX - libalias checksum offload - * 'duct tape' (see above) + /* + * XXX - libalias checksum offload + * 'duct tape' (see above) */ - if ((ip->ip_off & htons(IP_OFFMASK)) == 0 && + if ((ip->ip_off & htons(IP_OFFMASK)) == 0 && ip->ip_p == IPPROTO_TCP) { - struct tcphdr *th; + struct tcphdr *th; th = (struct tcphdr *)(ip + 1); - if (th->th_x2) + if (th->th_x2) ldt = 1; } @@ -355,82 +295,83 @@ ipfw_nat(struct ip_fw_args *args, struct cfg_nat *t, struct mbuf *m) struct udphdr *uh; u_short cksum; - ip->ip_len = ntohs(ip->ip_len); + /* XXX check if ip_len can stay in net format */ cksum = in_pseudo( ip->ip_src.s_addr, - ip->ip_dst.s_addr, - htons(ip->ip_p + ip->ip_len - (ip->ip_hl << 2)) + ip->ip_dst.s_addr, + htons(ip->ip_p + ntohs(ip->ip_len) - (ip->ip_hl << 2)) ); - + switch (ip->ip_p) { case IPPROTO_TCP: th = (struct tcphdr *)(ip + 1); - /* - * Maybe it was set in - * libalias... + /* + * Maybe it was set in + * libalias... */ th->th_x2 = 0; th->th_sum = cksum; - mcl->m_pkthdr.csum_data = + mcl->m_pkthdr.csum_data = offsetof(struct tcphdr, th_sum); break; case IPPROTO_UDP: uh = (struct udphdr *)(ip + 1); uh->uh_sum = cksum; - mcl->m_pkthdr.csum_data = + mcl->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum); - break; + break; } - /* - * No hw checksum offloading: do it - * by ourself. - */ - if ((mcl->m_pkthdr.csum_flags & - CSUM_DELAY_DATA) == 0) { + /* No hw checksum offloading: do it ourselves */ + if ((mcl->m_pkthdr.csum_flags & CSUM_DELAY_DATA) == 0) { in_delayed_cksum(mcl); - mcl->m_pkthdr.csum_flags &= - ~CSUM_DELAY_DATA; + mcl->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA; } - ip->ip_len = htons(ip->ip_len); } - - if (args->eh == NULL) { - ip->ip_len = ntohs(ip->ip_len); - ip->ip_off = ntohs(ip->ip_off); - } - args->m = mcl; return (IP_FW_NAT); } -static int +static struct cfg_nat * +lookup_nat(struct nat_list *l, int nat_id) +{ + struct cfg_nat *res; + + LIST_FOREACH(res, l, _next) { + if (res->id == nat_id) + break; + } + return res; +} + +static int ipfw_nat_cfg(struct sockopt *sopt) { struct cfg_nat *ptr, *ser_n; char *buf; + struct ip_fw_chain *chain = &V_layer3_chain; buf = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); - sooptcopyin(sopt, buf, NAT_BUF_LEN, - sizeof(struct cfg_nat)); + sooptcopyin(sopt, buf, NAT_BUF_LEN, sizeof(struct cfg_nat)); ser_n = (struct cfg_nat *)buf; - /* + /* check valid parameter ser_n->id > 0 ? */ + /* * Find/create nat rule. */ - IPFW_WLOCK(&V_layer3_chain); - LOOKUP_NAT(V_layer3_chain, ser_n->id, ptr); + IPFW_WLOCK(chain); + ptr = lookup_nat(&chain->nat, ser_n->id); if (ptr == NULL) { /* New rule: allocate and init new instance. */ - ptr = malloc(sizeof(struct cfg_nat), + ptr = malloc(sizeof(struct cfg_nat), M_IPFW, M_NOWAIT | M_ZERO); if (ptr == NULL) { - IPFW_WUNLOCK(&V_layer3_chain); + IPFW_WUNLOCK(chain); free(buf, M_IPFW); return (ENOSPC); } ptr->lib = LibAliasInit(NULL); if (ptr->lib == NULL) { - IPFW_WUNLOCK(&V_layer3_chain); + IPFW_WUNLOCK(chain); free(ptr, M_IPFW); free(buf, M_IPFW); return (EINVAL); @@ -438,18 +379,18 @@ ipfw_nat_cfg(struct sockopt *sopt) LIST_INIT(&ptr->redir_chain); } else { /* Entry already present: temporarly unhook it. */ - UNHOOK_NAT(ptr); - flush_nat_ptrs(ser_n->id); + LIST_REMOVE(ptr, _next); + flush_nat_ptrs(chain, ser_n->id); } - IPFW_WUNLOCK(&V_layer3_chain); + IPFW_WUNLOCK(chain); - /* + /* * Basic nat configuration. */ ptr->id = ser_n->id; - /* - * XXX - what if this rule doesn't nat any ip and just - * redirect? + /* + * XXX - what if this rule doesn't nat any ip and just + * redirect? * do we set aliasaddress to 0.0.0.0? */ ptr->ip = ser_n->ip; @@ -459,7 +400,7 @@ ipfw_nat_cfg(struct sockopt *sopt) LibAliasSetAddress(ptr->lib, ptr->ip); memcpy(ptr->if_name, ser_n->if_name, IF_NAMESIZE); - /* + /* * Redir and LSNAT configuration. */ /* Delete old cfgs. */ @@ -467,9 +408,9 @@ ipfw_nat_cfg(struct sockopt *sopt) /* Add new entries. */ add_redir_spool_cfg(&buf[(sizeof(struct cfg_nat))], ptr); free(buf, M_IPFW); - IPFW_WLOCK(&V_layer3_chain); - HOOK_NAT(&V_layer3_chain.nat, ptr); - IPFW_WUNLOCK(&V_layer3_chain); + IPFW_WLOCK(chain); + LIST_INSERT_HEAD(&chain->nat, ptr, _next); + IPFW_WUNLOCK(chain); return (0); } @@ -477,18 +418,20 @@ static int ipfw_nat_del(struct sockopt *sopt) { struct cfg_nat *ptr; + struct ip_fw_chain *chain = &V_layer3_chain; int i; - + sooptcopyin(sopt, &i, sizeof i, sizeof i); - IPFW_WLOCK(&V_layer3_chain); - LOOKUP_NAT(V_layer3_chain, i, ptr); + /* XXX validate i */ + IPFW_WLOCK(chain); + ptr = lookup_nat(&chain->nat, i); if (ptr == NULL) { - IPFW_WUNLOCK(&V_layer3_chain); + IPFW_WUNLOCK(chain); return (EINVAL); } - UNHOOK_NAT(ptr); - flush_nat_ptrs(i); - IPFW_WUNLOCK(&V_layer3_chain); + LIST_REMOVE(ptr, _next); + flush_nat_ptrs(chain, i); + IPFW_WUNLOCK(chain); del_redir_spool_cfg(ptr, &ptr->redir_chain); LibAliasUninit(ptr->lib); free(ptr, M_IPFW); @@ -497,56 +440,53 @@ ipfw_nat_del(struct sockopt *sopt) static int ipfw_nat_get_cfg(struct sockopt *sopt) -{ +{ uint8_t *data; struct cfg_nat *n; struct cfg_redir *r; struct cfg_spool *s; int nat_cnt, off; - + struct ip_fw_chain *chain; + int err = ENOSPC; + + chain = &V_layer3_chain; nat_cnt = 0; off = sizeof(nat_cnt); data = malloc(NAT_BUF_LEN, M_IPFW, M_WAITOK | M_ZERO); - IPFW_RLOCK(&V_layer3_chain); + IPFW_RLOCK(chain); /* Serialize all the data. */ - LIST_FOREACH(n, &V_layer3_chain.nat, _next) { + LIST_FOREACH(n, &chain->nat, _next) { nat_cnt++; - if (off + SOF_NAT < NAT_BUF_LEN) { - bcopy(n, &data[off], SOF_NAT); - off += SOF_NAT; - LIST_FOREACH(r, &n->redir_chain, _next) { - if (off + SOF_REDIR < NAT_BUF_LEN) { - bcopy(r, &data[off], - SOF_REDIR); - off += SOF_REDIR; - LIST_FOREACH(s, &r->spool_chain, - _next) { - if (off + SOF_SPOOL < - NAT_BUF_LEN) { - bcopy(s, &data[off], - SOF_SPOOL); - off += SOF_SPOOL; - } else - goto nospace; - } - } else - goto nospace; - } - } else + if (off + SOF_NAT >= NAT_BUF_LEN) goto nospace; + bcopy(n, &data[off], SOF_NAT); + off += SOF_NAT; + LIST_FOREACH(r, &n->redir_chain, _next) { + if (off + SOF_REDIR >= NAT_BUF_LEN) + goto nospace; + bcopy(r, &data[off], SOF_REDIR); + off += SOF_REDIR; + LIST_FOREACH(s, &r->spool_chain, _next) { + if (off + SOF_SPOOL >= NAT_BUF_LEN) + goto nospace; + bcopy(s, &data[off], SOF_SPOOL); + off += SOF_SPOOL; + } + } } - bcopy(&nat_cnt, data, sizeof(nat_cnt)); - IPFW_RUNLOCK(&V_layer3_chain); - sooptcopyout(sopt, data, NAT_BUF_LEN); - free(data, M_IPFW); - return (0); + err = 0; /* all good */ nospace: - IPFW_RUNLOCK(&V_layer3_chain); - printf("serialized data buffer not big enough:" - "please increase NAT_BUF_LEN\n"); + IPFW_RUNLOCK(chain); + if (err == 0) { + bcopy(&nat_cnt, data, sizeof(nat_cnt)); + sooptcopyout(sopt, data, NAT_BUF_LEN); + } else { + printf("serialized data buffer not big enough:" + "please increase NAT_BUF_LEN\n"); + } free(data, M_IPFW); - return (ENOSPC); + return (err); } static int @@ -554,30 +494,35 @@ ipfw_nat_get_log(struct sockopt *sopt) { uint8_t *data; struct cfg_nat *ptr; - int i, size, cnt, sof; + int i, size; + struct ip_fw_chain *chain; - data = NULL; - sof = LIBALIAS_BUF_SIZE; - cnt = 0; + chain = &V_layer3_chain; - IPFW_RLOCK(&V_layer3_chain); - size = i = 0; - LIST_FOREACH(ptr, &V_layer3_chain.nat, _next) { - if (ptr->lib->logDesc == NULL) + IPFW_RLOCK(chain); + /* one pass to count, one to copy the data */ + i = 0; + LIST_FOREACH(ptr, &chain->nat, _next) { + if (ptr->lib->logDesc == NULL) + continue; + i++; + } + size = i * (LIBALIAS_BUF_SIZE + sizeof(int)); + data = malloc(size, M_IPFW, M_NOWAIT | M_ZERO); + if (data == NULL) { + IPFW_RUNLOCK(chain); + return (ENOSPC); + } + i = 0; + LIST_FOREACH(ptr, &chain->nat, _next) { + if (ptr->lib->logDesc == NULL) continue; - cnt++; - size = cnt * (sof + sizeof(int)); - data = realloc(data, size, M_IPFW, M_NOWAIT | M_ZERO); - if (data == NULL) { - IPFW_RUNLOCK(&V_layer3_chain); - return (ENOSPC); - } bcopy(&ptr->id, &data[i], sizeof(int)); i += sizeof(int); - bcopy(ptr->lib->logDesc, &data[i], sof); - i += sof; + bcopy(ptr->lib->logDesc, &data[i], LIBALIAS_BUF_SIZE); + i += LIBALIAS_BUF_SIZE; } - IPFW_RUNLOCK(&V_layer3_chain); + IPFW_RUNLOCK(chain); sooptcopyout(sopt, data, size); free(data, M_IPFW); return(0); @@ -590,38 +535,41 @@ ipfw_nat_init(void) IPFW_WLOCK(&V_layer3_chain); /* init ipfw hooks */ ipfw_nat_ptr = ipfw_nat; + lookup_nat_ptr = lookup_nat; ipfw_nat_cfg_ptr = ipfw_nat_cfg; ipfw_nat_del_ptr = ipfw_nat_del; ipfw_nat_get_cfg_ptr = ipfw_nat_get_cfg; ipfw_nat_get_log_ptr = ipfw_nat_get_log; IPFW_WUNLOCK(&V_layer3_chain); - V_ifaddr_event_tag = EVENTHANDLER_REGISTER(ifaddr_event, ifaddr_change, + V_ifaddr_event_tag = EVENTHANDLER_REGISTER( + ifaddr_event, ifaddr_change, NULL, EVENTHANDLER_PRI_ANY); } static void ipfw_nat_destroy(void) { - struct ip_fw *rule; struct cfg_nat *ptr, *ptr_temp; - - IPFW_WLOCK(&V_layer3_chain); - LIST_FOREACH_SAFE(ptr, &V_layer3_chain.nat, _next, ptr_temp) { + struct ip_fw_chain *chain; + + chain = &V_layer3_chain; + IPFW_WLOCK(chain); + LIST_FOREACH_SAFE(ptr, &chain->nat, _next, ptr_temp) { LIST_REMOVE(ptr, _next); del_redir_spool_cfg(ptr, &ptr->redir_chain); LibAliasUninit(ptr->lib); free(ptr, M_IPFW); } EVENTHANDLER_DEREGISTER(ifaddr_event, V_ifaddr_event_tag); - /* flush all nat ptrs */ - for (rule = V_layer3_chain.rules; rule; rule = rule->next) { - ipfw_insn_nat *cmd = (ipfw_insn_nat *)ACTION_PTR(rule); - if (cmd->o.opcode == O_NAT) - cmd->nat = NULL; - } + flush_nat_ptrs(chain, -1 /* flush all */); /* deregister ipfw_nat */ ipfw_nat_ptr = NULL; - IPFW_WUNLOCK(&V_layer3_chain); + lookup_nat_ptr = NULL; + ipfw_nat_cfg_ptr = NULL; + ipfw_nat_del_ptr = NULL; + ipfw_nat_get_cfg_ptr = NULL; + ipfw_nat_get_log_ptr = NULL; + IPFW_WUNLOCK(chain); } static int @@ -655,3 +603,4 @@ DECLARE_MODULE(ipfw_nat, ipfw_nat_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY MODULE_DEPEND(ipfw_nat, libalias, 1, 1, 1); MODULE_DEPEND(ipfw_nat, ipfw, 2, 2, 2); MODULE_VERSION(ipfw_nat, 1); +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_pfil.c b/sys/netinet/ipfw/ip_fw_pfil.c index ffffb594546b..a7aa5aa4f3a0 100644 --- a/sys/netinet/ipfw/ip_fw_pfil.c +++ b/sys/netinet/ipfw/ip_fw_pfil.c @@ -46,9 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include -#include #include #include @@ -60,497 +58,347 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include -#include - +#include #include #include -VNET_DEFINE(int, fw_enable) = 1; +static VNET_DEFINE(int, fw_enable) = 1; +#define V_fw_enable VNET(fw_enable) + #ifdef INET6 -VNET_DEFINE(int, fw6_enable) = 1; +static VNET_DEFINE(int, fw6_enable) = 1; +#define V_fw6_enable VNET(fw6_enable) #endif int ipfw_chg_hook(SYSCTL_HANDLER_ARGS); -/* Divert hooks. */ -ip_divert_packet_t *ip_divert_ptr = NULL; - -/* ng_ipfw hooks. */ -ng_ipfw_input_t *ng_ipfw_input_p = NULL; - /* Forward declarations. */ -static int ipfw_divert(struct mbuf **, int, int); -#define DIV_DIR_IN 1 -#define DIV_DIR_OUT 0 +static int ipfw_divert(struct mbuf **, int, struct ipfw_rule_ref *, int); -int -ipfw_check_in(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, +#ifdef SYSCTL_NODE +SYSCTL_DECL(_net_inet_ip_fw); +SYSCTL_VNET_PROC(_net_inet_ip_fw, OID_AUTO, enable, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw_enable), 0, + ipfw_chg_hook, "I", "Enable ipfw"); +#ifdef INET6 +SYSCTL_DECL(_net_inet6_ip6_fw); +SYSCTL_VNET_PROC(_net_inet6_ip6_fw, OID_AUTO, enable, + CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE3, &VNET_NAME(fw6_enable), 0, + ipfw_chg_hook, "I", "Enable ipfw+6"); +#endif /* INET6 */ +#endif /* SYSCTL_NODE */ + +/* + * The pfilter hook to pass packets to ipfw_chk and then to + * dummynet, divert, netgraph or other modules. + * The packet may be consumed. + */ +static int +ipfw_check_hook(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, struct inpcb *inp) { struct ip_fw_args args; - struct ng_ipfw_tag *ng_tag; - struct m_tag *dn_tag; - int ipfw = 0; - int divert; - int tee; -#ifdef IPFIREWALL_FORWARD - struct m_tag *fwd_tag; -#endif + struct m_tag *tag; + int ipfw; + int ret; - KASSERT(dir == PFIL_IN, ("ipfw_check_in wrong direction!")); + /* all the processing now uses ip_len in net format */ + if (mtod(*m0, struct ip *)->ip_v == 4) + SET_NET_IPLEN(mtod(*m0, struct ip *)); + /* convert dir to IPFW values */ + dir = (dir == PFIL_IN) ? DIR_IN : DIR_OUT; bzero(&args, sizeof(args)); - ng_tag = (struct ng_ipfw_tag *)m_tag_locate(*m0, NGM_IPFW_COOKIE, 0, - NULL); - if (ng_tag != NULL) { - KASSERT(ng_tag->dir == NG_IPFW_IN, - ("ng_ipfw tag with wrong direction")); - args.rule = ng_tag->rule; - args.rule_id = ng_tag->rule_id; - args.chain_id = ng_tag->chain_id; - m_tag_delete(*m0, (struct m_tag *)ng_tag); - } - again: - dn_tag = m_tag_find(*m0, PACKET_TAG_DUMMYNET, NULL); - if (dn_tag != NULL){ - struct dn_pkt_tag *dt; - - dt = (struct dn_pkt_tag *)(dn_tag+1); - args.rule = dt->rule; - args.rule_id = dt->rule_id; - args.chain_id = dt->chain_id; - - m_tag_delete(*m0, dn_tag); - } - - args.m = *m0; - args.inp = inp; - tee = 0; - - if (V_fw_one_pass == 0 || args.rule == NULL) { - ipfw = ipfw_chk(&args); - *m0 = args.m; - } else - ipfw = IP_FW_PASS; - - KASSERT(*m0 != NULL || ipfw == IP_FW_DENY, ("%s: m0 is NULL", - __func__)); - - switch (ipfw) { - case IP_FW_PASS: - if (args.next_hop == NULL) - goto pass; - -#ifdef IPFIREWALL_FORWARD - fwd_tag = m_tag_get(PACKET_TAG_IPFORWARD, - sizeof(struct sockaddr_in), M_NOWAIT); - if (fwd_tag == NULL) - goto drop; - bcopy(args.next_hop, (fwd_tag+1), sizeof(struct sockaddr_in)); - m_tag_prepend(*m0, fwd_tag); - - if (in_localip(args.next_hop->sin_addr)) - (*m0)->m_flags |= M_FASTFWD_OURS; - goto pass; -#endif - break; /* not reached */ - - case IP_FW_DENY: - goto drop; - break; /* not reached */ - - case IP_FW_DUMMYNET: - if (ip_dn_io_ptr == NULL) - goto drop; - if (mtod(*m0, struct ip *)->ip_v == 4) - ip_dn_io_ptr(m0, DN_TO_IP_IN, &args); - else if (mtod(*m0, struct ip *)->ip_v == 6) - ip_dn_io_ptr(m0, DN_TO_IP6_IN, &args); - if (*m0 != NULL) - goto again; - return 0; /* packet consumed */ - - case IP_FW_TEE: - tee = 1; - /* fall through */ - - case IP_FW_DIVERT: - divert = ipfw_divert(m0, DIV_DIR_IN, tee); - if (divert) { - *m0 = NULL; - return 0; /* packet consumed */ - } else { - args.rule = NULL; - goto again; /* continue with packet */ + /* + * extract and remove the tag if present. If we are left + * with onepass, optimize the outgoing path. + */ + tag = m_tag_locate(*m0, MTAG_IPFW_RULE, 0, NULL); + if (tag != NULL) { + args.rule = *((struct ipfw_rule_ref *)(tag+1)); + m_tag_delete(*m0, tag); + if (args.rule.info & IPFW_ONEPASS) { + SET_HOST_IPLEN(mtod(*m0, struct ip *)); + return 0; } - - case IP_FW_NGTEE: - if (!NG_IPFW_LOADED) - goto drop; - (void)ng_ipfw_input_p(m0, NG_IPFW_IN, &args, 1); - goto again; /* continue with packet */ - - case IP_FW_NETGRAPH: - if (!NG_IPFW_LOADED) - goto drop; - return ng_ipfw_input_p(m0, NG_IPFW_IN, &args, 0); - - case IP_FW_NAT: - goto again; /* continue with packet */ - - case IP_FW_REASS: - goto again; - - default: - KASSERT(0, ("%s: unknown retval", __func__)); - } - -drop: - if (*m0) - m_freem(*m0); - *m0 = NULL; - return (EACCES); -pass: - return 0; /* not filtered */ -} - -int -ipfw_check_out(void *arg, struct mbuf **m0, struct ifnet *ifp, int dir, - struct inpcb *inp) -{ - struct ip_fw_args args; - struct ng_ipfw_tag *ng_tag; - struct m_tag *dn_tag; - int ipfw = 0; - int divert; - int tee; -#ifdef IPFIREWALL_FORWARD - struct m_tag *fwd_tag; -#endif - - KASSERT(dir == PFIL_OUT, ("ipfw_check_out wrong direction!")); - - bzero(&args, sizeof(args)); - - ng_tag = (struct ng_ipfw_tag *)m_tag_locate(*m0, NGM_IPFW_COOKIE, 0, - NULL); - if (ng_tag != NULL) { - KASSERT(ng_tag->dir == NG_IPFW_OUT, - ("ng_ipfw tag with wrong direction")); - args.rule = ng_tag->rule; - args.rule_id = ng_tag->rule_id; - args.chain_id = ng_tag->chain_id; - m_tag_delete(*m0, (struct m_tag *)ng_tag); - } - -again: - dn_tag = m_tag_find(*m0, PACKET_TAG_DUMMYNET, NULL); - if (dn_tag != NULL) { - struct dn_pkt_tag *dt; - - dt = (struct dn_pkt_tag *)(dn_tag+1); - args.rule = dt->rule; - args.rule_id = dt->rule_id; - args.chain_id = dt->chain_id; - - m_tag_delete(*m0, dn_tag); } args.m = *m0; - args.oif = ifp; + args.oif = dir == DIR_OUT ? ifp : NULL; args.inp = inp; - tee = 0; - if (V_fw_one_pass == 0 || args.rule == NULL) { - ipfw = ipfw_chk(&args); - *m0 = args.m; - } else - ipfw = IP_FW_PASS; + ipfw = ipfw_chk(&args); + *m0 = args.m; KASSERT(*m0 != NULL || ipfw == IP_FW_DENY, ("%s: m0 is NULL", __func__)); + /* breaking out of the switch means drop */ + ret = 0; /* default return value for pass */ switch (ipfw) { case IP_FW_PASS: + /* next_hop may be set by ipfw_chk */ if (args.next_hop == NULL) - goto pass; -#ifdef IPFIREWALL_FORWARD - /* Overwrite existing tag. */ - fwd_tag = m_tag_find(*m0, PACKET_TAG_IPFORWARD, NULL); - if (fwd_tag == NULL) { + break; /* pass */ +#ifndef IPFIREWALL_FORWARD + ret = EACCES; +#else + { + struct m_tag *fwd_tag; + + /* Incoming packets should not be tagged so we do not + * m_tag_find. Outgoing packets may be tagged, so we + * reuse the tag if present. + */ + fwd_tag = (dir == DIR_IN) ? NULL : + m_tag_find(*m0, PACKET_TAG_IPFORWARD, NULL); + if (fwd_tag != NULL) { + m_tag_unlink(*m0, fwd_tag); + } else { fwd_tag = m_tag_get(PACKET_TAG_IPFORWARD, sizeof(struct sockaddr_in), M_NOWAIT); - if (fwd_tag == NULL) - goto drop; - } else - m_tag_unlink(*m0, fwd_tag); + if (fwd_tag == NULL) { + ret = EACCES; + break; /* i.e. drop */ + } + } bcopy(args.next_hop, (fwd_tag+1), sizeof(struct sockaddr_in)); m_tag_prepend(*m0, fwd_tag); if (in_localip(args.next_hop->sin_addr)) (*m0)->m_flags |= M_FASTFWD_OURS; - goto pass; + } #endif - break; /* not reached */ + break; case IP_FW_DENY: - goto drop; - break; /* not reached */ + ret = EACCES; + break; /* i.e. drop */ case IP_FW_DUMMYNET: + ret = EACCES; if (ip_dn_io_ptr == NULL) - break; + break; /* i.e. drop */ if (mtod(*m0, struct ip *)->ip_v == 4) - ip_dn_io_ptr(m0, DN_TO_IP_OUT, &args); + ret = ip_dn_io_ptr(m0, dir, &args); else if (mtod(*m0, struct ip *)->ip_v == 6) - ip_dn_io_ptr(m0, DN_TO_IP6_OUT, &args); + ret = ip_dn_io_ptr(m0, dir | PROTO_IPV6, &args); + else + break; /* drop it */ + /* + * XXX should read the return value. + * dummynet normally eats the packet and sets *m0=NULL + * unless the packet can be sent immediately. In this + * case args is updated and we should re-run the + * check without clearing args. + */ if (*m0 != NULL) goto again; - return 0; /* packet consumed */ - break; case IP_FW_TEE: - tee = 1; - /* fall through */ - case IP_FW_DIVERT: - divert = ipfw_divert(m0, DIV_DIR_OUT, tee); - if (divert) { - *m0 = NULL; - return 0; /* packet consumed */ - } else { - args.rule = NULL; - goto again; /* continue with packet */ + if (ip_divert_ptr == NULL) { + ret = EACCES; + break; /* i.e. drop */ } + ret = ipfw_divert(m0, dir, &args.rule, + (ipfw == IP_FW_TEE) ? 1 : 0); + /* continue processing for the original packet (tee). */ + if (*m0) + goto again; + break; case IP_FW_NGTEE: - if (!NG_IPFW_LOADED) - goto drop; - (void)ng_ipfw_input_p(m0, NG_IPFW_OUT, &args, 1); - goto again; /* continue with packet */ - case IP_FW_NETGRAPH: - if (!NG_IPFW_LOADED) - goto drop; - return ng_ipfw_input_p(m0, NG_IPFW_OUT, &args, 0); + if (ng_ipfw_input_p == NULL) { + ret = EACCES; + break; /* i.e. drop */ + } + ret = ng_ipfw_input_p(m0, dir, &args, + (ipfw == IP_FW_NGTEE) ? 1 : 0); + if (ipfw == IP_FW_NGTEE) /* ignore errors for NGTEE */ + goto again; /* continue with packet */ + break; case IP_FW_NAT: - goto again; /* continue with packet */ - case IP_FW_REASS: - goto again; + goto again; /* continue with packet */ default: KASSERT(0, ("%s: unknown retval", __func__)); } -drop: - if (*m0) - m_freem(*m0); - *m0 = NULL; - return (EACCES); -pass: - return 0; /* not filtered */ + if (ret != 0) { + if (*m0) + FREE_PKT(*m0); + *m0 = NULL; + } + if (*m0 && mtod(*m0, struct ip *)->ip_v == 4) + SET_HOST_IPLEN(mtod(*m0, struct ip *)); + return ret; } +/* do the divert, return 1 on error 0 on success */ static int -ipfw_divert(struct mbuf **m, int incoming, int tee) +ipfw_divert(struct mbuf **m0, int incoming, struct ipfw_rule_ref *rule, + int tee) { /* * ipfw_chk() has already tagged the packet with the divert tag. * If tee is set, copy packet and return original. * If not tee, consume packet and send it to divert socket. */ - struct mbuf *clone, *reass; + struct mbuf *clone; struct ip *ip; - int hlen; - - reass = NULL; - - /* Is divert module loaded? */ - if (ip_divert_ptr == NULL) - goto nodivert; + struct m_tag *tag; /* Cloning needed for tee? */ - if (tee) - clone = m_dup(*m, M_DONTWAIT); - else - clone = *m; - - /* In case m_dup was unable to allocate mbufs. */ - if (clone == NULL) - goto teeout; + if (tee == 0) { + clone = *m0; /* use the original mbuf */ + *m0 = NULL; + } else { + clone = m_dup(*m0, M_DONTWAIT); + /* If we cannot duplicate the mbuf, we sacrifice the divert + * chain and continue with the tee-ed packet. + */ + if (clone == NULL) + return 1; + } /* - * Divert listeners can only handle non-fragmented packets. - * However when tee is set we will *not* de-fragment the packets; - * Doing do would put the reassembly into double-jeopardy. On top - * of that someone doing a tee will probably want to get the packet - * in its original form. + * Divert listeners can normally handle non-fragmented packets, + * but we can only reass in the non-tee case. + * This means that listeners on a tee rule may get fragments, + * and have to live with that. + * Note that we now have the 'reass' ipfw option so if we care + * we can do it before a 'tee'. */ ip = mtod(clone, struct ip *); - if (!tee && ip->ip_off & (IP_MF | IP_OFFMASK)) { - - /* Reassemble packet. */ - reass = ip_reass(clone); + if (!tee && ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)) { + int hlen; + struct mbuf *reass; + SET_HOST_IPLEN(ip); /* ip_reass wants host order */ + reass = ip_reass(clone); /* Reassemble packet. */ + if (reass == NULL) + return 0; /* not an error */ + /* if reass = NULL then it was consumed by ip_reass */ /* * IP header checksum fixup after reassembly and leave header * in network byte order. */ - if (reass != NULL) { - ip = mtod(reass, struct ip *); - hlen = ip->ip_hl << 2; - ip->ip_len = htons(ip->ip_len); - ip->ip_off = htons(ip->ip_off); - ip->ip_sum = 0; - if (hlen == sizeof(struct ip)) - ip->ip_sum = in_cksum_hdr(ip); - else - ip->ip_sum = in_cksum(reass, hlen); - clone = reass; - } else - clone = NULL; - } else { - /* Convert header to network byte order. */ - ip->ip_len = htons(ip->ip_len); - ip->ip_off = htons(ip->ip_off); + ip = mtod(reass, struct ip *); + hlen = ip->ip_hl << 2; + SET_NET_IPLEN(ip); + ip->ip_sum = 0; + if (hlen == sizeof(struct ip)) + ip->ip_sum = in_cksum_hdr(ip); + else + ip->ip_sum = in_cksum(reass, hlen); + clone = reass; } + /* attach a tag to the packet with the reinject info */ + tag = m_tag_alloc(MTAG_IPFW_RULE, 0, + sizeof(struct ipfw_rule_ref), M_NOWAIT); + if (tag == NULL) { + FREE_PKT(clone); + return 1; + } + *((struct ipfw_rule_ref *)(tag+1)) = *rule; + m_tag_prepend(clone, tag); /* Do the dirty job... */ - if (clone && ip_divert_ptr != NULL) - ip_divert_ptr(clone, incoming); - -teeout: - /* - * For tee we leave the divert tag attached to original packet. - * It will then continue rule evaluation after the tee rule. - */ - if (tee) - return 0; - - /* Packet diverted and consumed */ - return 1; - -nodivert: - m_freem(*m); - return 1; + ip_divert_ptr(clone, incoming); + return 0; } -int -ipfw_hook(void) +/* + * attach or detach hooks for a given protocol family + */ +static int +ipfw_hook(int onoff, int pf) { - struct pfil_head *pfh_inet; + struct pfil_head *pfh; - pfh_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET); - if (pfh_inet == NULL) + pfh = pfil_head_get(PFIL_TYPE_AF, pf); + if (pfh == NULL) return ENOENT; - (void)pfil_add_hook(ipfw_check_in, NULL, PFIL_IN | PFIL_WAITOK, - pfh_inet); - (void)pfil_add_hook(ipfw_check_out, NULL, PFIL_OUT | PFIL_WAITOK, - pfh_inet); + (void) (onoff ? pfil_add_hook : pfil_remove_hook) + (ipfw_check_hook, NULL, PFIL_IN | PFIL_OUT | PFIL_WAITOK, pfh); return 0; } int -ipfw_unhook(void) +ipfw_attach_hooks(int arg) { - struct pfil_head *pfh_inet; - - pfh_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET); - if (pfh_inet == NULL) - return ENOENT; - - (void)pfil_remove_hook(ipfw_check_in, NULL, PFIL_IN | PFIL_WAITOK, - pfh_inet); - (void)pfil_remove_hook(ipfw_check_out, NULL, PFIL_OUT | PFIL_WAITOK, - pfh_inet); - - return 0; -} + int error = 0; + if (arg == 0) /* detach */ + ipfw_hook(0, AF_INET); + else if (V_fw_enable && ipfw_hook(1, AF_INET) != 0) { + error = ENOENT; /* see ip_fw_pfil.c::ipfw_hook() */ + printf("ipfw_hook() error\n"); + } #ifdef INET6 -int -ipfw6_hook(void) -{ - struct pfil_head *pfh_inet6; - - pfh_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6); - if (pfh_inet6 == NULL) - return ENOENT; - - (void)pfil_add_hook(ipfw_check_in, NULL, PFIL_IN | PFIL_WAITOK, - pfh_inet6); - (void)pfil_add_hook(ipfw_check_out, NULL, PFIL_OUT | PFIL_WAITOK, - pfh_inet6); - - return 0; + if (arg == 0) /* detach */ + ipfw_hook(0, AF_INET6); + else if (V_fw6_enable && ipfw_hook(1, AF_INET6) != 0) { + error = ENOENT; + printf("ipfw6_hook() error\n"); + } +#endif + return error; } -int -ipfw6_unhook(void) -{ - struct pfil_head *pfh_inet6; - - pfh_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6); - if (pfh_inet6 == NULL) - return ENOENT; - - (void)pfil_remove_hook(ipfw_check_in, NULL, PFIL_IN | PFIL_WAITOK, - pfh_inet6); - (void)pfil_remove_hook(ipfw_check_out, NULL, PFIL_OUT | PFIL_WAITOK, - pfh_inet6); - - return 0; -} -#endif /* INET6 */ - int ipfw_chg_hook(SYSCTL_HANDLER_ARGS) { - int enable = *(int *)arg1; + int enable; + int oldenable; int error; + int af; -#ifdef VIMAGE /* Since enabling is global, only let base do it. */ - if (! IS_DEFAULT_VNET(curvnet)) - return (EPERM); + if (arg1 == &VNET_NAME(fw_enable)) { + enable = V_fw_enable; + af = AF_INET; + } +#ifdef INET6 + else if (arg1 == &VNET_NAME(fw6_enable)) { + enable = V_fw6_enable; + af = AF_INET6; + } #endif + else + return (EINVAL); + + oldenable = enable; + error = sysctl_handle_int(oidp, &enable, 0, req); + if (error) return (error); enable = (enable) ? 1 : 0; - if (enable == *(int *)arg1) + if (enable == oldenable) return (0); - if (arg1 == &V_fw_enable) { - if (enable) - error = ipfw_hook(); - else - error = ipfw_unhook(); - } -#ifdef INET6 - if (arg1 == &V_fw6_enable) { - if (enable) - error = ipfw6_hook(); - else - error = ipfw6_unhook(); - } -#endif - + error = ipfw_hook(enable, af); if (error) return (error); - - *(int *)arg1 = enable; + if (af == AF_INET) + V_fw_enable = enable; +#ifdef INET6 + else if (af == AF_INET6) + V_fw6_enable = enable; +#endif return (0); } - +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_private.h b/sys/netinet/ipfw/ip_fw_private.h new file mode 100644 index 000000000000..92508f14dc45 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_private.h @@ -0,0 +1,274 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * 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$ + */ + +#ifndef _IPFW2_PRIVATE_H +#define _IPFW2_PRIVATE_H + +/* + * Internal constants and data structures used by ipfw components + * and not meant to be exported outside the kernel. + */ + +#ifdef _KERNEL + + +/* Return values from ipfw_chk() */ +enum { + IP_FW_PASS = 0, + IP_FW_DENY, + IP_FW_DIVERT, + IP_FW_TEE, + IP_FW_DUMMYNET, + IP_FW_NETGRAPH, + IP_FW_NGTEE, + IP_FW_NAT, + IP_FW_REASS, +}; + +/* + * Structure for collecting parameters to dummynet for ip6_output forwarding + */ +struct _ip6dn_args { + struct ip6_pktopts *opt_or; + struct route_in6 ro_or; + int flags_or; + struct ip6_moptions *im6o_or; + struct ifnet *origifp_or; + struct ifnet *ifp_or; + struct sockaddr_in6 dst_or; + u_long mtu_or; + struct route_in6 ro_pmtu_or; +}; + + +/* + * Arguments for calling ipfw_chk() and dummynet_io(). We put them + * all into a structure because this way it is easier and more + * efficient to pass variables around and extend the interface. + */ +struct ip_fw_args { + struct mbuf *m; /* the mbuf chain */ + struct ifnet *oif; /* output interface */ + struct sockaddr_in *next_hop; /* forward address */ + + /* + * On return, it points to the matching rule. + * On entry, rule.slot > 0 means the info is valid and + * contains the the starting rule for an ipfw search. + * If chain_id == chain->id && slot >0 then jump to that slot. + * Otherwise, we locate the first rule >= rulenum:rule_id + */ + struct ipfw_rule_ref rule; /* match/restart info */ + + struct ether_header *eh; /* for bridged packets */ + + struct ipfw_flow_id f_id; /* grabbed from IP header */ + //uint32_t cookie; /* a cookie depending on rule action */ + struct inpcb *inp; + + struct _ip6dn_args dummypar; /* dummynet->ip6_output */ + struct sockaddr_in hopstore; /* store here if cannot use a pointer */ +}; + +MALLOC_DECLARE(M_IPFW); + +/* + * Hooks sometime need to know the direction of the packet + * (divert, dummynet, netgraph, ...) + * We use a generic definition here, with bit0-1 indicating the + * direction, bit 2 indicating layer2 or 3, bit 3-4 indicating the + * specific protocol + * indicating the protocol (if necessary) + */ +enum { + DIR_MASK = 0x3, + DIR_OUT = 0, + DIR_IN = 1, + DIR_FWD = 2, + DIR_DROP = 3, + PROTO_LAYER2 = 0x4, /* set for layer 2 */ + /* PROTO_DEFAULT = 0, */ + PROTO_IPV4 = 0x08, + PROTO_IPV6 = 0x10, + PROTO_IFB = 0x0c, /* layer2 + ifbridge */ + /* PROTO_OLDBDG = 0x14, unused, old bridge */ +}; + +/* wrapper for freeing a packet, in case we need to do more work */ +#define FREE_PKT(m) m_freem(m) + +/* + * Function definitions. + */ + +/* attach (arg = 1) or detach (arg = 0) hooks */ +int ipfw_attach_hooks(int); +#ifdef NOTYET +void ipfw_nat_destroy(void); +#endif + +/* In ip_fw_log.c */ +struct ip; +void ipfw_log_bpf(int); +void ipfw_log(struct ip_fw *f, u_int hlen, struct ip_fw_args *args, + struct mbuf *m, struct ifnet *oif, u_short offset, uint32_t tablearg, + struct ip *ip); +VNET_DECLARE(u_int64_t, norule_counter); +#define V_norule_counter VNET(norule_counter) +VNET_DECLARE(int, verbose_limit); +#define V_verbose_limit VNET(verbose_limit) + +/* In ip_fw_dynamic.c */ + +enum { /* result for matching dynamic rules */ + MATCH_REVERSE = 0, + MATCH_FORWARD, + MATCH_NONE, + MATCH_UNKNOWN, +}; + +/* + * The lock for dynamic rules is only used once outside the file, + * and only to release the result of lookup_dyn_rule(). + * Eventually we may implement it with a callback on the function. + */ +void ipfw_dyn_unlock(void); + +struct tcphdr; +struct mbuf *ipfw_send_pkt(struct mbuf *, struct ipfw_flow_id *, + u_int32_t, u_int32_t, int); +int ipfw_install_state(struct ip_fw *rule, ipfw_insn_limit *cmd, + struct ip_fw_args *args, uint32_t tablearg); +ipfw_dyn_rule *ipfw_lookup_dyn_rule(struct ipfw_flow_id *pkt, + int *match_direction, struct tcphdr *tcp); +void ipfw_remove_dyn_children(struct ip_fw *rule); +void ipfw_get_dynamic(char **bp, const char *ep); + +void ipfw_dyn_attach(void); /* uma_zcreate .... */ +void ipfw_dyn_detach(void); /* uma_zdestroy ... */ +void ipfw_dyn_init(void); /* per-vnet initialization */ +void ipfw_dyn_uninit(int); /* per-vnet deinitialization */ +int ipfw_dyn_len(void); + +/* common variables */ +VNET_DECLARE(int, fw_one_pass); +#define V_fw_one_pass VNET(fw_one_pass) + +VNET_DECLARE(int, fw_verbose); +#define V_fw_verbose VNET(fw_verbose) + +VNET_DECLARE(struct ip_fw_chain, layer3_chain); +#define V_layer3_chain VNET(layer3_chain) + +VNET_DECLARE(u_int32_t, set_disable); +#define V_set_disable VNET(set_disable) + +VNET_DECLARE(int, autoinc_step); +#define V_autoinc_step VNET(autoinc_step) + +struct ip_fw_chain { + struct ip_fw *rules; /* list of rules */ + struct ip_fw *reap; /* list of rules to reap */ + struct ip_fw *default_rule; + int n_rules; /* number of static rules */ + int static_len; /* total len of static rules */ + struct ip_fw **map; /* array of rule ptrs to ease lookup */ + LIST_HEAD(nat_list, cfg_nat) nat; /* list of nat entries */ + struct radix_node_head *tables[IPFW_TABLES_MAX]; + struct rwlock rwmtx; + struct rwlock uh_lock; /* lock for upper half */ + uint32_t id; /* ruleset id */ +}; + +struct sockopt; /* used by tcp_var.h */ + +/* + * The lock is heavily used by ip_fw2.c (the main file) and ip_fw_nat.c + * so the variable and the macros must be here. + */ + +#define IPFW_LOCK_INIT(_chain) do { \ + rw_init(&(_chain)->rwmtx, "IPFW static rules"); \ + rw_init(&(_chain)->uh_lock, "IPFW UH lock"); \ + } while (0) + +#define IPFW_LOCK_DESTROY(_chain) do { \ + rw_destroy(&(_chain)->rwmtx); \ + rw_destroy(&(_chain)->uh_lock); \ + } while (0) + +#define IPFW_WLOCK_ASSERT(_chain) rw_assert(&(_chain)->rwmtx, RA_WLOCKED) + +#define IPFW_RLOCK(p) rw_rlock(&(p)->rwmtx) +#define IPFW_RUNLOCK(p) rw_runlock(&(p)->rwmtx) +#define IPFW_WLOCK(p) rw_wlock(&(p)->rwmtx) +#define IPFW_WUNLOCK(p) rw_wunlock(&(p)->rwmtx) + +#define IPFW_UH_RLOCK(p) rw_rlock(&(p)->uh_lock) +#define IPFW_UH_RUNLOCK(p) rw_runlock(&(p)->uh_lock) +#define IPFW_UH_WLOCK(p) rw_wlock(&(p)->uh_lock) +#define IPFW_UH_WUNLOCK(p) rw_wunlock(&(p)->uh_lock) + +/* In ip_fw_sockopt.c */ +int ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id); +int ipfw_add_rule(struct ip_fw_chain *chain, struct ip_fw *input_rule); +int ipfw_ctl(struct sockopt *sopt); +int ipfw_chk(struct ip_fw_args *args); +void ipfw_reap_rules(struct ip_fw *head); + +/* In ip_fw_table.c */ +struct radix_node; +int ipfw_lookup_table(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint32_t *val); +int ipfw_init_tables(struct ip_fw_chain *ch); +int ipfw_flush_table(struct ip_fw_chain *ch, uint16_t tbl); +void ipfw_flush_tables(struct ip_fw_chain *ch); +int ipfw_add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen, uint32_t value); +int ipfw_dump_table_entry(struct radix_node *rn, void *arg); +int ipfw_del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen); +int ipfw_count_table(struct ip_fw_chain *ch, uint32_t tbl, uint32_t *cnt); +int ipfw_dump_table(struct ip_fw_chain *ch, ipfw_table *tbl); + +/* In ip_fw_nat.c -- XXX to be moved to ip_var.h */ + +extern struct cfg_nat *(*lookup_nat_ptr)(struct nat_list *, int); + +typedef int ipfw_nat_t(struct ip_fw_args *, struct cfg_nat *, struct mbuf *); +typedef int ipfw_nat_cfg_t(struct sockopt *); + +extern ipfw_nat_t *ipfw_nat_ptr; +#define IPFW_NAT_LOADED (ipfw_nat_ptr != NULL) + +extern ipfw_nat_cfg_t *ipfw_nat_cfg_ptr; +extern ipfw_nat_cfg_t *ipfw_nat_del_ptr; +extern ipfw_nat_cfg_t *ipfw_nat_get_cfg_ptr; +extern ipfw_nat_cfg_t *ipfw_nat_get_log_ptr; + +#endif /* _KERNEL */ +#endif /* _IPFW2_PRIVATE_H */ diff --git a/sys/netinet/ipfw/ip_fw_sockopt.c b/sys/netinet/ipfw/ip_fw_sockopt.c new file mode 100644 index 000000000000..3d0fc5505cb6 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_sockopt.c @@ -0,0 +1,1081 @@ +/*- + * Copyright (c) 2002-2009 Luigi Rizzo, Universita` di Pisa + * + * Supported by: Valeria Paoli + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Sockopt support for ipfw. The routines here implement + * the upper half of the ipfw code. + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include /* struct m_tag used by nested headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include /* hooks */ +#include +#include + +#ifdef MAC +#include +#endif + +MALLOC_DEFINE(M_IPFW, "IpFw/IpAcct", "IpFw/IpAcct chain's"); + +/* + * static variables followed by global ones (none in this file) + */ + +/* + * Find the smallest rule >= key, id. + * We could use bsearch but it is so simple that we code it directly + */ +int +ipfw_find_rule(struct ip_fw_chain *chain, uint32_t key, uint32_t id) +{ + int i, lo, hi; + struct ip_fw *r; + + for (lo = 0, hi = chain->n_rules - 1; lo < hi;) { + i = (lo + hi) / 2; + r = chain->map[i]; + if (r->rulenum < key) + lo = i + 1; /* continue from the next one */ + else if (r->rulenum > key) + hi = i; /* this might be good */ + else if (r->id < id) + lo = i + 1; /* continue from the next one */ + else /* r->id >= id */ + hi = i; /* this might be good */ + }; + return hi; +} + +/* + * allocate a new map, returns the chain locked. extra is the number + * of entries to add or delete. + */ +static struct ip_fw ** +get_map(struct ip_fw_chain *chain, int extra, int locked) +{ + + for (;;) { + struct ip_fw **map; + int i; + + i = chain->n_rules + extra; + map = malloc(i * sizeof(struct ip_fw *), M_IPFW, M_WAITOK); + if (map == NULL) { + printf("%s: cannot allocate map\n", __FUNCTION__); + return NULL; + } + if (!locked) + IPFW_UH_WLOCK(chain); + if (i >= chain->n_rules + extra) /* good */ + return map; + /* otherwise we lost the race, free and retry */ + if (!locked) + IPFW_UH_WUNLOCK(chain); + free(map, M_IPFW); + } +} + +/* + * swap the maps. It is supposed to be called with IPFW_UH_WLOCK + */ +static struct ip_fw ** +swap_map(struct ip_fw_chain *chain, struct ip_fw **new_map, int new_len) +{ + struct ip_fw **old_map; + + IPFW_WLOCK(chain); + chain->id++; + chain->n_rules = new_len; + old_map = chain->map; + chain->map = new_map; + IPFW_WUNLOCK(chain); + return old_map; +} + +/* + * Add a new rule to the list. Copy the rule into a malloc'ed area, then + * possibly create a rule number and add the rule to the list. + * Update the rule_number in the input struct so the caller knows it as well. + * XXX DO NOT USE FOR THE DEFAULT RULE. + * Must be called without IPFW_UH held + */ +int +ipfw_add_rule(struct ip_fw_chain *chain, struct ip_fw *input_rule) +{ + struct ip_fw *rule; + int i, l, insert_before; + struct ip_fw **map; /* the new array of pointers */ + + if (chain->rules == NULL || input_rule->rulenum > IPFW_DEFAULT_RULE-1) + return (EINVAL); + + l = RULESIZE(input_rule); + rule = malloc(l, M_IPFW, M_WAITOK | M_ZERO); + if (rule == NULL) + return (ENOSPC); + /* get_map returns with IPFW_UH_WLOCK if successful */ + map = get_map(chain, 1, 0 /* not locked */); + if (map == NULL) { + free(rule, M_IPFW); + return ENOSPC; + } + + bcopy(input_rule, rule, l); + /* clear fields not settable from userland */ + rule->x_next = NULL; + rule->next_rule = NULL; + rule->pcnt = 0; + rule->bcnt = 0; + rule->timestamp = 0; + + if (V_autoinc_step < 1) + V_autoinc_step = 1; + else if (V_autoinc_step > 1000) + V_autoinc_step = 1000; + /* find the insertion point, we will insert before */ + insert_before = rule->rulenum ? rule->rulenum + 1 : IPFW_DEFAULT_RULE; + i = ipfw_find_rule(chain, insert_before, 0); + /* duplicate first part */ + if (i > 0) + bcopy(chain->map, map, i * sizeof(struct ip_fw *)); + map[i] = rule; + /* duplicate remaining part, we always have the default rule */ + bcopy(chain->map + i, map + i + 1, + sizeof(struct ip_fw *) *(chain->n_rules - i)); + if (rule->rulenum == 0) { + /* write back the number */ + rule->rulenum = i > 0 ? map[i-1]->rulenum : 0; + if (rule->rulenum < IPFW_DEFAULT_RULE - V_autoinc_step) + rule->rulenum += V_autoinc_step; + input_rule->rulenum = rule->rulenum; + } + + rule->id = chain->id + 1; + map = swap_map(chain, map, chain->n_rules + 1); + chain->static_len += l; + IPFW_UH_WUNLOCK(chain); + if (map) + free(map, M_IPFW); + return (0); +} + +/* + * Reclaim storage associated with a list of rules. This is + * typically the list created using remove_rule. + * A NULL pointer on input is handled correctly. + */ +void +ipfw_reap_rules(struct ip_fw *head) +{ + struct ip_fw *rule; + + while ((rule = head) != NULL) { + head = head->x_next; + free(rule, M_IPFW); + } +} + +/** + * Remove all rules with given number, and also do set manipulation. + * Assumes chain != NULL && *chain != NULL. + * + * The argument is an u_int32_t. The low 16 bit are the rule or set number, + * the next 8 bits are the new set, the top 8 bits are the command: + * + * 0 delete rules with given number + * 1 delete rules with given set number + * 2 move rules with given number to new set + * 3 move rules with given set number to new set + * 4 swap sets with given numbers + * 5 delete rules with given number and with given set number + */ +static int +del_entry(struct ip_fw_chain *chain, u_int32_t arg) +{ + struct ip_fw *rule; + uint32_t rulenum; /* rule or old_set */ + uint8_t cmd, new_set; + int start, end = 0, i, ofs, n; + struct ip_fw **map = NULL; + int error = 0; + + rulenum = arg & 0xffff; + cmd = (arg >> 24) & 0xff; + new_set = (arg >> 16) & 0xff; + + if (cmd > 5 || new_set > RESVD_SET) + return EINVAL; + if (cmd == 0 || cmd == 2 || cmd == 5) { + if (rulenum >= IPFW_DEFAULT_RULE) + return EINVAL; + } else { + if (rulenum > RESVD_SET) /* old_set */ + return EINVAL; + } + + IPFW_UH_WLOCK(chain); /* prevent conflicts among the writers */ + chain->reap = NULL; /* prepare for deletions */ + + switch (cmd) { + case 0: /* delete rules with given number (0 is special means all) */ + case 1: /* delete all rules with given set number, rule->set == rulenum */ + case 5: /* delete rules with given number and with given set number. + * rulenum - given rule number; + * new_set - given set number. + */ + /* locate first rule to delete (start), the one after the + * last one (end), and count how many rules to delete (n) + */ + n = 0; + if (cmd == 1) { /* look for a specific set, must scan all */ + for (start = -1, i = 0; i < chain->n_rules; i++) { + if (chain->map[start]->set != rulenum) + continue; + if (start < 0) + start = i; + end = i; + n++; + } + end++; /* first non-matching */ + } else { + start = ipfw_find_rule(chain, rulenum, 0); + for (end = start; end < chain->n_rules; end++) { + rule = chain->map[end]; + if (rulenum > 0 && rule->rulenum != rulenum) + break; + if (rule->set != RESVD_SET && + (cmd == 0 || rule->set == new_set) ) + n++; + } + } + if (n == 0 && arg == 0) + break; /* special case, flush on empty ruleset */ + /* allocate the map, if needed */ + if (n > 0) + map = get_map(chain, -n, 1 /* locked */); + if (n == 0 || map == NULL) { + error = EINVAL; + break; + } + /* copy the initial part of the map */ + if (start > 0) + bcopy(chain->map, map, start * sizeof(struct ip_fw *)); + /* copy active rules between start and end */ + for (i = ofs = start; i < end; i++) { + rule = chain->map[i]; + if (!(rule->set != RESVD_SET && + (cmd == 0 || rule->set == new_set) )) + map[ofs++] = chain->map[i]; + } + /* finally the tail */ + bcopy(chain->map + end, map + ofs, + (chain->n_rules - end) * sizeof(struct ip_fw *)); + map = swap_map(chain, map, chain->n_rules - n); + /* now remove the rules deleted */ + for (i = start; i < end; i++) { + rule = map[i]; + if (rule->set != RESVD_SET && + (cmd == 0 || rule->set == new_set) ) { + int l = RULESIZE(rule); + + chain->static_len -= l; + ipfw_remove_dyn_children(rule); + rule->x_next = chain->reap; + chain->reap = rule; + } + } + break; + + case 2: /* move rules with given number to new set */ + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + if (rule->rulenum == rulenum) + rule->set = new_set; + } + break; + + case 3: /* move rules with given set number to new set */ + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + if (rule->set == rulenum) + rule->set = new_set; + } + break; + + case 4: /* swap two sets */ + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + if (rule->set == rulenum) + rule->set = new_set; + else if (rule->set == new_set) + rule->set = rulenum; + } + break; + } + rule = chain->reap; + chain->reap = NULL; + IPFW_UH_WUNLOCK(chain); + ipfw_reap_rules(rule); + if (map) + free(map, M_IPFW); + return error; +} + +/* + * Clear counters for a specific rule. + * Normally run under IPFW_UH_RLOCK, but these are idempotent ops + * so we only care that rules do not disappear. + */ +static void +clear_counters(struct ip_fw *rule, int log_only) +{ + ipfw_insn_log *l = (ipfw_insn_log *)ACTION_PTR(rule); + + if (log_only == 0) { + rule->bcnt = rule->pcnt = 0; + rule->timestamp = 0; + } + if (l->o.opcode == O_LOG) + l->log_left = l->max_log; +} + +/** + * Reset some or all counters on firewall rules. + * The argument `arg' is an u_int32_t. The low 16 bit are the rule number, + * the next 8 bits are the set number, the top 8 bits are the command: + * 0 work with rules from all set's; + * 1 work with rules only from specified set. + * Specified rule number is zero if we want to clear all entries. + * log_only is 1 if we only want to reset logs, zero otherwise. + */ +static int +zero_entry(struct ip_fw_chain *chain, u_int32_t arg, int log_only) +{ + struct ip_fw *rule; + char *msg; + int i; + + uint16_t rulenum = arg & 0xffff; + uint8_t set = (arg >> 16) & 0xff; + uint8_t cmd = (arg >> 24) & 0xff; + + if (cmd > 1) + return (EINVAL); + if (cmd == 1 && set > RESVD_SET) + return (EINVAL); + + IPFW_UH_RLOCK(chain); + if (rulenum == 0) { + V_norule_counter = 0; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + /* Skip rules not in our set. */ + if (cmd == 1 && rule->set != set) + continue; + clear_counters(rule, log_only); + } + msg = log_only ? "All logging counts reset" : + "Accounting cleared"; + } else { + int cleared = 0; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + if (rule->rulenum == rulenum) { + if (cmd == 0 || rule->set == set) + clear_counters(rule, log_only); + cleared = 1; + } + if (rule->rulenum > rulenum) + break; + } + if (!cleared) { /* we did not find any matching rules */ + IPFW_WUNLOCK(chain); + return (EINVAL); + } + msg = log_only ? "logging count reset" : "cleared"; + } + IPFW_UH_RUNLOCK(chain); + + if (V_fw_verbose) { + int lev = LOG_SECURITY | LOG_NOTICE; + + if (rulenum) + log(lev, "ipfw: Entry %d %s.\n", rulenum, msg); + else + log(lev, "ipfw: %s.\n", msg); + } + return (0); +} + +/* + * Check validity of the structure before insert. + * Rules are simple, so this mostly need to check rule sizes. + */ +static int +check_ipfw_struct(struct ip_fw *rule, int size) +{ + int l, cmdlen = 0; + int have_action=0; + ipfw_insn *cmd; + + if (size < sizeof(*rule)) { + printf("ipfw: rule too short\n"); + return (EINVAL); + } + /* first, check for valid size */ + l = RULESIZE(rule); + if (l != size) { + printf("ipfw: size mismatch (have %d want %d)\n", size, l); + return (EINVAL); + } + if (rule->act_ofs >= rule->cmd_len) { + printf("ipfw: bogus action offset (%u > %u)\n", + rule->act_ofs, rule->cmd_len - 1); + return (EINVAL); + } + /* + * Now go for the individual checks. Very simple ones, basically only + * instruction sizes. + */ + for (l = rule->cmd_len, cmd = rule->cmd ; + l > 0 ; l -= cmdlen, cmd += cmdlen) { + cmdlen = F_LEN(cmd); + if (cmdlen > l) { + printf("ipfw: opcode %d size truncated\n", + cmd->opcode); + return EINVAL; + } + switch (cmd->opcode) { + case O_PROBE_STATE: + case O_KEEP_STATE: + case O_PROTO: + case O_IP_SRC_ME: + case O_IP_DST_ME: + case O_LAYER2: + case O_IN: + case O_FRAG: + case O_DIVERTED: + case O_IPOPT: + case O_IPTOS: + case O_IPPRECEDENCE: + case O_IPVER: + case O_TCPWIN: + case O_TCPFLAGS: + case O_TCPOPTS: + case O_ESTAB: + case O_VERREVPATH: + case O_VERSRCREACH: + case O_ANTISPOOF: + case O_IPSEC: +#ifdef INET6 + case O_IP6_SRC_ME: + case O_IP6_DST_ME: + case O_EXT_HDR: + case O_IP6: +#endif + case O_IP4: + case O_TAG: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + break; + + case O_FIB: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + if (cmd->arg1 >= rt_numfibs) { + printf("ipfw: invalid fib number %d\n", + cmd->arg1); + return EINVAL; + } + break; + + case O_SETFIB: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + if (cmd->arg1 >= rt_numfibs) { + printf("ipfw: invalid fib number %d\n", + cmd->arg1); + return EINVAL; + } + goto check_action; + + case O_UID: + case O_GID: + case O_JAIL: + case O_IP_SRC: + case O_IP_DST: + case O_TCPSEQ: + case O_TCPACK: + case O_PROB: + case O_ICMPTYPE: + if (cmdlen != F_INSN_SIZE(ipfw_insn_u32)) + goto bad_size; + break; + + case O_LIMIT: + if (cmdlen != F_INSN_SIZE(ipfw_insn_limit)) + goto bad_size; + break; + + case O_LOG: + if (cmdlen != F_INSN_SIZE(ipfw_insn_log)) + goto bad_size; + + ((ipfw_insn_log *)cmd)->log_left = + ((ipfw_insn_log *)cmd)->max_log; + + break; + + case O_IP_SRC_MASK: + case O_IP_DST_MASK: + /* only odd command lengths */ + if ( !(cmdlen & 1) || cmdlen > 31) + goto bad_size; + break; + + case O_IP_SRC_SET: + case O_IP_DST_SET: + if (cmd->arg1 == 0 || cmd->arg1 > 256) { + printf("ipfw: invalid set size %d\n", + cmd->arg1); + return EINVAL; + } + if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + + (cmd->arg1+31)/32 ) + goto bad_size; + break; + + case O_IP_SRC_LOOKUP: + case O_IP_DST_LOOKUP: + if (cmd->arg1 >= IPFW_TABLES_MAX) { + printf("ipfw: invalid table number %d\n", + cmd->arg1); + return (EINVAL); + } + if (cmdlen != F_INSN_SIZE(ipfw_insn) && + cmdlen != F_INSN_SIZE(ipfw_insn_u32) + 1 && + cmdlen != F_INSN_SIZE(ipfw_insn_u32)) + goto bad_size; + break; + + case O_MACADDR2: + if (cmdlen != F_INSN_SIZE(ipfw_insn_mac)) + goto bad_size; + break; + + case O_NOP: + case O_IPID: + case O_IPTTL: + case O_IPLEN: + case O_TCPDATALEN: + case O_TAGGED: + if (cmdlen < 1 || cmdlen > 31) + goto bad_size; + break; + + case O_MAC_TYPE: + case O_IP_SRCPORT: + case O_IP_DSTPORT: /* XXX artificial limit, 30 port pairs */ + if (cmdlen < 2 || cmdlen > 31) + goto bad_size; + break; + + case O_RECV: + case O_XMIT: + case O_VIA: + if (cmdlen != F_INSN_SIZE(ipfw_insn_if)) + goto bad_size; + break; + + case O_ALTQ: + if (cmdlen != F_INSN_SIZE(ipfw_insn_altq)) + goto bad_size; + break; + + case O_PIPE: + case O_QUEUE: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; + goto check_action; + + case O_FORWARD_IP: +#ifdef IPFIREWALL_FORWARD + if (cmdlen != F_INSN_SIZE(ipfw_insn_sa)) + goto bad_size; + goto check_action; +#else + return EINVAL; +#endif + + case O_DIVERT: + case O_TEE: + if (ip_divert_ptr == NULL) + return EINVAL; + else + goto check_size; + case O_NETGRAPH: + case O_NGTEE: + if (ng_ipfw_input_p == NULL) + return EINVAL; + else + goto check_size; + case O_NAT: + if (!IPFW_NAT_LOADED) + return EINVAL; + if (cmdlen != F_INSN_SIZE(ipfw_insn_nat)) + goto bad_size; + goto check_action; + case O_FORWARD_MAC: /* XXX not implemented yet */ + case O_CHECK_STATE: + case O_COUNT: + case O_ACCEPT: + case O_DENY: + case O_REJECT: +#ifdef INET6 + case O_UNREACH6: +#endif + case O_SKIPTO: + case O_REASS: +check_size: + if (cmdlen != F_INSN_SIZE(ipfw_insn)) + goto bad_size; +check_action: + if (have_action) { + printf("ipfw: opcode %d, multiple actions" + " not allowed\n", + cmd->opcode); + return EINVAL; + } + have_action = 1; + if (l != cmdlen) { + printf("ipfw: opcode %d, action must be" + " last opcode\n", + cmd->opcode); + return EINVAL; + } + break; +#ifdef INET6 + case O_IP6_SRC: + case O_IP6_DST: + if (cmdlen != F_INSN_SIZE(struct in6_addr) + + F_INSN_SIZE(ipfw_insn)) + goto bad_size; + break; + + case O_FLOW6ID: + if (cmdlen != F_INSN_SIZE(ipfw_insn_u32) + + ((ipfw_insn_u32 *)cmd)->o.arg1) + goto bad_size; + break; + + case O_IP6_SRC_MASK: + case O_IP6_DST_MASK: + if ( !(cmdlen & 1) || cmdlen > 127) + goto bad_size; + break; + case O_ICMP6TYPE: + if( cmdlen != F_INSN_SIZE( ipfw_insn_icmp6 ) ) + goto bad_size; + break; +#endif + + default: + switch (cmd->opcode) { +#ifndef INET6 + case O_IP6_SRC_ME: + case O_IP6_DST_ME: + case O_EXT_HDR: + case O_IP6: + case O_UNREACH6: + case O_IP6_SRC: + case O_IP6_DST: + case O_FLOW6ID: + case O_IP6_SRC_MASK: + case O_IP6_DST_MASK: + case O_ICMP6TYPE: + printf("ipfw: no IPv6 support in kernel\n"); + return EPROTONOSUPPORT; +#endif + default: + printf("ipfw: opcode %d, unknown opcode\n", + cmd->opcode); + return EINVAL; + } + } + } + if (have_action == 0) { + printf("ipfw: missing action\n"); + return EINVAL; + } + return 0; + +bad_size: + printf("ipfw: opcode %d size %d wrong\n", + cmd->opcode, cmdlen); + return EINVAL; +} + +/* + * Copy the static and dynamic rules to the supplied buffer + * and return the amount of space actually used. + * Must be run under IPFW_UH_RLOCK + */ +static size_t +ipfw_getrules(struct ip_fw_chain *chain, void *buf, size_t space) +{ + char *bp = buf; + char *ep = bp + space; + struct ip_fw *rule, *dst; + int l, i; + time_t boot_seconds; + + boot_seconds = boottime.tv_sec; + for (i = 0; i < chain->n_rules; i++) { + rule = chain->map[i]; + l = RULESIZE(rule); + if (bp + l > ep) { /* should not happen */ + printf("overflow dumping static rules\n"); + break; + } + dst = (struct ip_fw *)bp; + bcopy(rule, dst, l); + /* + * XXX HACK. Store the disable mask in the "next" + * pointer in a wild attempt to keep the ABI the same. + * Why do we do this on EVERY rule? + */ + bcopy(&V_set_disable, &dst->next_rule, sizeof(V_set_disable)); + if (dst->timestamp) + dst->timestamp += boot_seconds; + bp += l; + } + ipfw_get_dynamic(&bp, ep); /* protected by the dynamic lock */ + return (bp - (char *)buf); +} + + +/** + * {set|get}sockopt parser. + */ +int +ipfw_ctl(struct sockopt *sopt) +{ +#define RULE_MAXSIZE (256*sizeof(u_int32_t)) + int error; + size_t size; + struct ip_fw *buf, *rule; + struct ip_fw_chain *chain; + u_int32_t rulenum[2]; + + error = priv_check(sopt->sopt_td, PRIV_NETINET_IPFW); + if (error) + return (error); + + /* + * Disallow modifications in really-really secure mode, but still allow + * the logging counters to be reset. + */ + if (sopt->sopt_name == IP_FW_ADD || + (sopt->sopt_dir == SOPT_SET && sopt->sopt_name != IP_FW_RESETLOG)) { + error = securelevel_ge(sopt->sopt_td->td_ucred, 3); + if (error) + return (error); + } + + chain = &V_layer3_chain; + error = 0; + + switch (sopt->sopt_name) { + case IP_FW_GET: + /* + * pass up a copy of the current rules. Static rules + * come first (the last of which has number IPFW_DEFAULT_RULE), + * followed by a possibly empty list of dynamic rule. + * The last dynamic rule has NULL in the "next" field. + * + * Note that the calculated size is used to bound the + * amount of data returned to the user. The rule set may + * change between calculating the size and returning the + * data in which case we'll just return what fits. + */ + for (;;) { + int len = 0, want; + + size = chain->static_len; + size += ipfw_dyn_len(); + if (size >= sopt->sopt_valsize) + break; + buf = malloc(size, M_TEMP, M_WAITOK); + if (buf == NULL) + break; + IPFW_UH_RLOCK(chain); + /* check again how much space we need */ + want = chain->static_len + ipfw_dyn_len(); + if (size >= want) + len = ipfw_getrules(chain, buf, size); + IPFW_UH_RUNLOCK(chain); + if (size >= want) + error = sooptcopyout(sopt, buf, len); + free(buf, M_TEMP); + if (size >= want) + break; + } + break; + + case IP_FW_FLUSH: + /* locking is done within del_entry() */ + error = del_entry(chain, 0); /* special case, rule=0, cmd=0 means all */ + break; + + case IP_FW_ADD: + rule = malloc(RULE_MAXSIZE, M_TEMP, M_WAITOK); + error = sooptcopyin(sopt, rule, RULE_MAXSIZE, + sizeof(struct ip_fw) ); + if (error == 0) + error = check_ipfw_struct(rule, sopt->sopt_valsize); + if (error == 0) { + /* locking is done within ipfw_add_rule() */ + error = ipfw_add_rule(chain, rule); + size = RULESIZE(rule); + if (!error && sopt->sopt_dir == SOPT_GET) + error = sooptcopyout(sopt, rule, size); + } + free(rule, M_TEMP); + break; + + case IP_FW_DEL: + /* + * IP_FW_DEL is used for deleting single rules or sets, + * and (ab)used to atomically manipulate sets. Argument size + * is used to distinguish between the two: + * sizeof(u_int32_t) + * delete single rule or set of rules, + * or reassign rules (or sets) to a different set. + * 2*sizeof(u_int32_t) + * atomic disable/enable sets. + * first u_int32_t contains sets to be disabled, + * second u_int32_t contains sets to be enabled. + */ + error = sooptcopyin(sopt, rulenum, + 2*sizeof(u_int32_t), sizeof(u_int32_t)); + if (error) + break; + size = sopt->sopt_valsize; + if (size == sizeof(u_int32_t) && rulenum[0] != 0) { + /* delete or reassign, locking done in del_entry() */ + error = del_entry(chain, rulenum[0]); + } else if (size == 2*sizeof(u_int32_t)) { /* set enable/disable */ + IPFW_UH_WLOCK(chain); + V_set_disable = + (V_set_disable | rulenum[0]) & ~rulenum[1] & + ~(1<sopt_val != 0) { + error = sooptcopyin(sopt, rulenum, + sizeof(u_int32_t), sizeof(u_int32_t)); + if (error) + break; + } + error = zero_entry(chain, rulenum[0], + sopt->sopt_name == IP_FW_RESETLOG); + break; + + /*--- TABLE manipulations are protected by the IPFW_LOCK ---*/ + case IP_FW_TABLE_ADD: + { + ipfw_table_entry ent; + + error = sooptcopyin(sopt, &ent, + sizeof(ent), sizeof(ent)); + if (error) + break; + error = ipfw_add_table_entry(chain, ent.tbl, + ent.addr, ent.masklen, ent.value); + } + break; + + case IP_FW_TABLE_DEL: + { + ipfw_table_entry ent; + + error = sooptcopyin(sopt, &ent, + sizeof(ent), sizeof(ent)); + if (error) + break; + error = ipfw_del_table_entry(chain, ent.tbl, + ent.addr, ent.masklen); + } + break; + + case IP_FW_TABLE_FLUSH: + { + u_int16_t tbl; + + error = sooptcopyin(sopt, &tbl, + sizeof(tbl), sizeof(tbl)); + if (error) + break; + IPFW_WLOCK(chain); + error = ipfw_flush_table(chain, tbl); + IPFW_WUNLOCK(chain); + } + break; + + case IP_FW_TABLE_GETSIZE: + { + u_int32_t tbl, cnt; + + if ((error = sooptcopyin(sopt, &tbl, sizeof(tbl), + sizeof(tbl)))) + break; + IPFW_RLOCK(chain); + error = ipfw_count_table(chain, tbl, &cnt); + IPFW_RUNLOCK(chain); + if (error) + break; + error = sooptcopyout(sopt, &cnt, sizeof(cnt)); + } + break; + + case IP_FW_TABLE_LIST: + { + ipfw_table *tbl; + + if (sopt->sopt_valsize < sizeof(*tbl)) { + error = EINVAL; + break; + } + size = sopt->sopt_valsize; + tbl = malloc(size, M_TEMP, M_WAITOK); + error = sooptcopyin(sopt, tbl, size, sizeof(*tbl)); + if (error) { + free(tbl, M_TEMP); + break; + } + tbl->size = (size - sizeof(*tbl)) / + sizeof(ipfw_table_entry); + IPFW_RLOCK(chain); + error = ipfw_dump_table(chain, tbl); + IPFW_RUNLOCK(chain); + if (error) { + free(tbl, M_TEMP); + break; + } + error = sooptcopyout(sopt, tbl, size); + free(tbl, M_TEMP); + } + break; + + /*--- NAT operations are protected by the IPFW_LOCK ---*/ + case IP_FW_NAT_CFG: + if (IPFW_NAT_LOADED) + error = ipfw_nat_cfg_ptr(sopt); + else { + printf("IP_FW_NAT_CFG: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + case IP_FW_NAT_DEL: + if (IPFW_NAT_LOADED) + error = ipfw_nat_del_ptr(sopt); + else { + printf("IP_FW_NAT_DEL: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + case IP_FW_NAT_GET_CONFIG: + if (IPFW_NAT_LOADED) + error = ipfw_nat_get_cfg_ptr(sopt); + else { + printf("IP_FW_NAT_GET_CFG: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + case IP_FW_NAT_GET_LOG: + if (IPFW_NAT_LOADED) + error = ipfw_nat_get_log_ptr(sopt); + else { + printf("IP_FW_NAT_GET_LOG: %s\n", + "ipfw_nat not present, please load it"); + error = EINVAL; + } + break; + + default: + printf("ipfw: ipfw_ctl invalid option %d\n", sopt->sopt_name); + error = EINVAL; + } + + return (error); +#undef RULE_MAXSIZE +} +/* end of file */ diff --git a/sys/netinet/ipfw/ip_fw_table.c b/sys/netinet/ipfw/ip_fw_table.c new file mode 100644 index 000000000000..0d8625af9715 --- /dev/null +++ b/sys/netinet/ipfw/ip_fw_table.c @@ -0,0 +1,281 @@ +/*- + * Copyright (c) 2004 Ruslan Ermilov and Vsevolod Lobko. + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Lookup table support for ipfw + * + * Lookup tables are implemented (at the moment) using the radix + * tree used for routing tables. Tables store key-value entries, where + * keys are network prefixes (addr/masklen), and values are integers. + * As a degenerate case we can interpret keys as 32-bit integers + * (with a /32 mask). + * + * The table is protected by the IPFW lock even for manipulation coming + * from userland, because operations are typically fast. + */ + +#if !defined(KLD_MODULE) +#include "opt_ipfw.h" +#include "opt_ipdivert.h" +#include "opt_ipdn.h" +#include "opt_inet.h" +#ifndef INET +#error IPFIREWALL requires INET. +#endif /* INET */ +#endif +#include "opt_inet6.h" +#include "opt_ipsec.h" + +#include +#include +#include +#include +#include +#include +#include +#include /* ip_fw.h requires IFNAMSIZ */ +#include +#include +#include + +#include +#include /* struct ipfw_rule_ref */ +#include +#include + +#ifdef MAC +#include +#endif + +MALLOC_DEFINE(M_IPFW_TBL, "ipfw_tbl", "IpFw tables"); + +struct table_entry { + struct radix_node rn[2]; + struct sockaddr_in addr, mask; + u_int32_t value; +}; + +/* + * The radix code expects addr and mask to be array of bytes, + * with the first byte being the length of the array. rn_inithead + * is called with the offset in bits of the lookup key within the + * array. If we use a sockaddr_in as the underlying type, + * sin_len is conveniently located at offset 0, sin_addr is at + * offset 4 and normally aligned. + * But for portability, let's avoid assumption and make the code explicit + */ +#define KEY_LEN(v) *((uint8_t *)&(v)) +#define KEY_OFS (8*offsetof(struct sockaddr_in, sin_addr)) + +int +ipfw_add_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen, uint32_t value) +{ + struct radix_node_head *rnh; + struct table_entry *ent; + struct radix_node *rn; + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + ent = malloc(sizeof(*ent), M_IPFW_TBL, M_NOWAIT | M_ZERO); + if (ent == NULL) + return (ENOMEM); + ent->value = value; + KEY_LEN(ent->addr) = KEY_LEN(ent->mask) = 8; + ent->mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); + ent->addr.sin_addr.s_addr = addr & ent->mask.sin_addr.s_addr; + IPFW_WLOCK(ch); + rn = rnh->rnh_addaddr(&ent->addr, &ent->mask, rnh, (void *)ent); + if (rn == NULL) { + IPFW_WUNLOCK(ch); + free(ent, M_IPFW_TBL); + return (EEXIST); + } + IPFW_WUNLOCK(ch); + return (0); +} + +int +ipfw_del_table_entry(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint8_t mlen) +{ + struct radix_node_head *rnh; + struct table_entry *ent; + struct sockaddr_in sa, mask; + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + KEY_LEN(sa) = KEY_LEN(mask) = 8; + mask.sin_addr.s_addr = htonl(mlen ? ~((1 << (32 - mlen)) - 1) : 0); + sa.sin_addr.s_addr = addr & mask.sin_addr.s_addr; + IPFW_WLOCK(ch); + ent = (struct table_entry *)rnh->rnh_deladdr(&sa, &mask, rnh); + if (ent == NULL) { + IPFW_WUNLOCK(ch); + return (ESRCH); + } + IPFW_WUNLOCK(ch); + free(ent, M_IPFW_TBL); + return (0); +} + +static int +flush_table_entry(struct radix_node *rn, void *arg) +{ + struct radix_node_head * const rnh = arg; + struct table_entry *ent; + + ent = (struct table_entry *) + rnh->rnh_deladdr(rn->rn_key, rn->rn_mask, rnh); + if (ent != NULL) + free(ent, M_IPFW_TBL); + return (0); +} + +int +ipfw_flush_table(struct ip_fw_chain *ch, uint16_t tbl) +{ + struct radix_node_head *rnh; + + IPFW_WLOCK_ASSERT(ch); + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + KASSERT(rnh != NULL, ("NULL IPFW table")); + rnh->rnh_walktree(rnh, flush_table_entry, rnh); + return (0); +} + +void +ipfw_flush_tables(struct ip_fw_chain *ch) +{ + uint16_t tbl; + + IPFW_WLOCK_ASSERT(ch); + + for (tbl = 0; tbl < IPFW_TABLES_MAX; tbl++) + ipfw_flush_table(ch, tbl); +} + +int +ipfw_init_tables(struct ip_fw_chain *ch) +{ + int i; + uint16_t j; + + for (i = 0; i < IPFW_TABLES_MAX; i++) { + if (!rn_inithead((void **)&ch->tables[i], KEY_OFS)) { + for (j = 0; j < i; j++) { + (void) ipfw_flush_table(ch, j); + } + return (ENOMEM); + } + } + return (0); +} + +int +ipfw_lookup_table(struct ip_fw_chain *ch, uint16_t tbl, in_addr_t addr, + uint32_t *val) +{ + struct radix_node_head *rnh; + struct table_entry *ent; + struct sockaddr_in sa; + + if (tbl >= IPFW_TABLES_MAX) + return (0); + rnh = ch->tables[tbl]; + KEY_LEN(sa) = 8; + sa.sin_addr.s_addr = addr; + ent = (struct table_entry *)(rnh->rnh_lookup(&sa, NULL, rnh)); + if (ent != NULL) { + *val = ent->value; + return (1); + } + return (0); +} + +static int +count_table_entry(struct radix_node *rn, void *arg) +{ + u_int32_t * const cnt = arg; + + (*cnt)++; + return (0); +} + +int +ipfw_count_table(struct ip_fw_chain *ch, uint32_t tbl, uint32_t *cnt) +{ + struct radix_node_head *rnh; + + if (tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl]; + *cnt = 0; + rnh->rnh_walktree(rnh, count_table_entry, cnt); + return (0); +} + +static int +dump_table_entry(struct radix_node *rn, void *arg) +{ + struct table_entry * const n = (struct table_entry *)rn; + ipfw_table * const tbl = arg; + ipfw_table_entry *ent; + + if (tbl->cnt == tbl->size) + return (1); + ent = &tbl->ent[tbl->cnt]; + ent->tbl = tbl->tbl; + if (in_nullhost(n->mask.sin_addr)) + ent->masklen = 0; + else + ent->masklen = 33 - ffs(ntohl(n->mask.sin_addr.s_addr)); + ent->addr = n->addr.sin_addr.s_addr; + ent->value = n->value; + tbl->cnt++; + return (0); +} + +int +ipfw_dump_table(struct ip_fw_chain *ch, ipfw_table *tbl) +{ + struct radix_node_head *rnh; + + if (tbl->tbl >= IPFW_TABLES_MAX) + return (EINVAL); + rnh = ch->tables[tbl->tbl]; + tbl->cnt = 0; + rnh->rnh_walktree(rnh, dump_table_entry, tbl); + return (0); +} +/* end of file */ diff --git a/sys/netinet/libalias/alias.c b/sys/netinet/libalias/alias.c index 2e469d7e49a4..226965d208ef 100644 --- a/sys/netinet/libalias/alias.c +++ b/sys/netinet/libalias/alias.c @@ -1669,6 +1669,7 @@ LibAliasRefreshModules(void) LibAliasLoadModule(buf); } } + fclose(fd); return (0); } diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c index 489933f6385c..a42803ef44be 100644 --- a/sys/netinet/libalias/alias_db.c +++ b/sys/netinet/libalias/alias_db.c @@ -2136,7 +2136,7 @@ void SetProtocolFlags(struct alias_link *lnk, int pflags) { - lnk->pflags = pflags;; + lnk->pflags = pflags; } int diff --git a/sys/netinet/libalias/alias_mod.c b/sys/netinet/libalias/alias_mod.c index 2713137ec20c..b6d903091c99 100644 --- a/sys/netinet/libalias/alias_mod.c +++ b/sys/netinet/libalias/alias_mod.c @@ -52,11 +52,11 @@ __FBSDID("$FreeBSD$"); #endif /* Protocol and userland module handlers chains. */ -LIST_HEAD(handler_chain, proto_handler) handler_chain = LIST_HEAD_INITIALIZER(foo); +LIST_HEAD(handler_chain, proto_handler) handler_chain = LIST_HEAD_INITIALIZER(handler_chain); #ifdef _KERNEL struct rwlock handler_rw; #endif -SLIST_HEAD(dll_chain, dll) dll_chain = SLIST_HEAD_INITIALIZER(foo); +SLIST_HEAD(dll_chain, dll) dll_chain = SLIST_HEAD_INITIALIZER(dll_chain); #ifdef _KERNEL @@ -158,7 +158,7 @@ _attach_handler(struct proto_handler *p) static int _detach_handler(struct proto_handler *p) { - struct proto_handler *b, *b_tmp;; + struct proto_handler *b, *b_tmp; LIBALIAS_WLOCK_ASSERT(); LIST_FOREACH_SAFE(b, &handler_chain, entries, b_tmp) { diff --git a/sys/netinet/libalias/alias_proxy.c b/sys/netinet/libalias/alias_proxy.c index 4e11d4d74be5..d5b1b81eb363 100644 --- a/sys/netinet/libalias/alias_proxy.c +++ b/sys/netinet/libalias/alias_proxy.c @@ -137,9 +137,6 @@ struct proxy_entry { destination of a proxied IP packet */ -#ifdef _KERNEL /* XXX: can it be moved to libkern? */ -static int inet_aton(const char *cp, struct in_addr *addr); -#endif static int IpMask(int, struct in_addr *); static int IpAddr(char *, struct in_addr *); static int IpPort(char *, int, int *); @@ -149,107 +146,6 @@ static int RuleNumberDelete(struct libalias *la, int); static void ProxyEncodeTcpStream(struct alias_link *, struct ip *, int); static void ProxyEncodeIpHeader(struct ip *, int); -#ifdef _KERNEL -static int -inet_aton(cp, addr) - const char *cp; - struct in_addr *addr; -{ - u_long parts[4]; - in_addr_t val; - const char *c; - char *endptr; - int gotend, n; - - c = (const char *)cp; - n = 0; - /* - * Run through the string, grabbing numbers until - * the end of the string, or some error - */ - gotend = 0; - while (!gotend) { - unsigned long l; - - l = strtoul(c, &endptr, 0); - - if (l == ULONG_MAX || (l == 0 && endptr == c)) - return (0); - - val = (in_addr_t)l; - /* - * If the whole string is invalid, endptr will equal - * c.. this way we can make sure someone hasn't - * gone '.12' or something which would get past - * the next check. - */ - if (endptr == c) - return (0); - parts[n] = val; - c = endptr; - - /* Check the next character past the previous number's end */ - switch (*c) { - case '.' : - /* Make sure we only do 3 dots .. */ - if (n == 3) /* Whoops. Quit. */ - return (0); - n++; - c++; - break; - - case '\0': - gotend = 1; - break; - - default: - if (isspace((unsigned char)*c)) { - gotend = 1; - break; - } else - return (0); /* Invalid character, so fail */ - } - - } - - /* - * Concoct the address according to - * the number of parts specified. - */ - - switch (n) { - case 0: /* a -- 32 bits */ - /* - * Nothing is necessary here. Overflow checking was - * already done in strtoul(). - */ - break; - case 1: /* a.b -- 8.24 bits */ - if (val > 0xffffff || parts[0] > 0xff) - return (0); - val |= parts[0] << 24; - break; - - case 2: /* a.b.c -- 8.8.16 bits */ - if (val > 0xffff || parts[0] > 0xff || parts[1] > 0xff) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16); - break; - - case 3: /* a.b.c.d -- 8.8.8.8 bits */ - if (val > 0xff || parts[0] > 0xff || parts[1] > 0xff || - parts[2] > 0xff) - return (0); - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - } - - if (addr != NULL) - addr->s_addr = htonl(val); - return (1); -} -#endif - static int IpMask(int nbits, struct in_addr *mask) { diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index b40ceb28b792..9341cf29bbe6 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -80,14 +80,18 @@ VNET_DEFINE(struct inpcbinfo, ripcbinfo); #define V_ripcbinfo VNET(ripcbinfo) /* - * Control and data hooks for ipfw and dummynet. + * Control and data hooks for ipfw, dummynet, divert and so on. * The data hooks are not used here but it is convenient * to keep them all in one place. */ -int (*ip_fw_ctl_ptr)(struct sockopt *) = NULL; -int (*ip_dn_ctl_ptr)(struct sockopt *) = NULL; -int (*ip_fw_chk_ptr)(struct ip_fw_args *args) = NULL; -int (*ip_dn_io_ptr)(struct mbuf **m, int dir, struct ip_fw_args *fwa) = NULL; +VNET_DEFINE(ip_fw_chk_ptr_t, ip_fw_chk_ptr) = NULL; +VNET_DEFINE(ip_fw_ctl_ptr_t, ip_fw_ctl_ptr) = NULL; + +int (*ip_dn_ctl_ptr)(struct sockopt *); +int (*ip_dn_io_ptr)(struct mbuf **, int, struct ip_fw_args *); +void (*ip_divert_ptr)(struct mbuf *, int); +int (*ng_ipfw_input_p)(struct mbuf **, int, + struct ip_fw_args *, int); /* * Hooks for multicast routing. They all default to NULL, so leave them not @@ -291,7 +295,7 @@ rip_input(struct mbuf *m, int off) continue; if (inp->inp_faddr.s_addr != ip->ip_src.s_addr) continue; - if (jailed(inp->inp_cred)) { + if (jailed_without_vnet(inp->inp_cred)) { /* * XXX: If faddr was bound to multicast group, * jailed raw socket will drop datagram. @@ -325,7 +329,7 @@ rip_input(struct mbuf *m, int off) if (!in_nullhost(inp->inp_faddr) && !in_hosteq(inp->inp_faddr, ip->ip_src)) continue; - if (jailed(inp->inp_cred)) { + if (jailed_without_vnet(inp->inp_cred)) { /* * Allow raw socket in jail to receive multicast; * assume process had PRIV_NETINET_RAW at attach, @@ -343,17 +347,35 @@ rip_input(struct mbuf *m, int off) */ if (inp->inp_moptions != NULL && IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) { - struct sockaddr_in group; + /* + * If the incoming datagram is for IGMP, allow it + * through unconditionally to the raw socket. + * + * In the case of IGMPv2, we may not have explicitly + * joined the group, and may have set IFF_ALLMULTI + * on the interface. imo_multi_filter() may discard + * control traffic we actually need to see. + * + * Userland multicast routing daemons should continue + * filter the control traffic appropriately. + */ int blocked; - bzero(&group, sizeof(struct sockaddr_in)); - group.sin_len = sizeof(struct sockaddr_in); - group.sin_family = AF_INET; - group.sin_addr = ip->ip_dst; + blocked = MCAST_PASS; + if (proto != IPPROTO_IGMP) { + struct sockaddr_in group; + + bzero(&group, sizeof(struct sockaddr_in)); + group.sin_len = sizeof(struct sockaddr_in); + group.sin_family = AF_INET; + group.sin_addr = ip->ip_dst; + + blocked = imo_multi_filter(inp->inp_moptions, + ifp, + (struct sockaddr *)&group, + (struct sockaddr *)&ripsrc); + } - blocked = imo_multi_filter(inp->inp_moptions, ifp, - (struct sockaddr *)&group, - (struct sockaddr *)&ripsrc); if (blocked != MCAST_PASS) { IPSTAT_INC(ips_notmember); continue; @@ -517,18 +539,20 @@ rip_ctloutput(struct socket *so, struct sockopt *sopt) error = sooptcopyout(sopt, &optval, sizeof optval); break; + case IP_FW3: /* generic ipfw v.3 functions */ case IP_FW_ADD: /* ADD actually returns the body... */ case IP_FW_GET: case IP_FW_TABLE_GETSIZE: case IP_FW_TABLE_LIST: case IP_FW_NAT_GET_CONFIG: case IP_FW_NAT_GET_LOG: - if (ip_fw_ctl_ptr != NULL) - error = ip_fw_ctl_ptr(sopt); + if (V_ip_fw_ctl_ptr != NULL) + error = V_ip_fw_ctl_ptr(sopt); else error = ENOPROTOOPT; break; + case IP_DUMMYNET3: /* generic dummynet v.3 functions */ case IP_DUMMYNET_GET: if (ip_dn_ctl_ptr != NULL) error = ip_dn_ctl_ptr(sopt); @@ -574,6 +598,7 @@ rip_ctloutput(struct socket *so, struct sockopt *sopt) inp->inp_flags &= ~INP_HDRINCL; break; + case IP_FW3: /* generic ipfw v.3 functions */ case IP_FW_ADD: case IP_FW_DEL: case IP_FW_FLUSH: @@ -584,12 +609,13 @@ rip_ctloutput(struct socket *so, struct sockopt *sopt) case IP_FW_TABLE_FLUSH: case IP_FW_NAT_CFG: case IP_FW_NAT_DEL: - if (ip_fw_ctl_ptr != NULL) - error = ip_fw_ctl_ptr(sopt); + if (V_ip_fw_ctl_ptr != NULL) + error = V_ip_fw_ctl_ptr(sopt); else error = ENOPROTOOPT; break; + case IP_DUMMYNET3: /* generic dummynet v.3 functions */ case IP_DUMMYNET_CONFIGURE: case IP_DUMMYNET_DEL: case IP_DUMMYNET_FLUSH: diff --git a/sys/netinet/sctp_asconf.c b/sys/netinet/sctp_asconf.c index 404b5ad0aa74..9513ded33617 100644 --- a/sys/netinet/sctp_asconf.c +++ b/sys/netinet/sctp_asconf.c @@ -2224,7 +2224,7 @@ sctp_asconf_iterator_stcb(struct sctp_inpcb *inp, struct sctp_tcb *stcb, } if (stcb->asoc.ipv4_local_scope == 0 && IN4_ISPRIVATE_ADDRESS(&sin->sin_addr)) { - continue;; + continue; } if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && SCTP_IPV6_V6ONLY(inp6)) { @@ -3180,24 +3180,6 @@ sctp_addr_mgmt_ep_sa(struct sctp_inpcb *inp, struct sockaddr *sa, ifa = NULL; } if (ifa != NULL) { - /* add this address */ - struct sctp_asconf_iterator *asc; - struct sctp_laddr *wi; - - SCTP_MALLOC(asc, struct sctp_asconf_iterator *, - sizeof(struct sctp_asconf_iterator), - SCTP_M_ASC_IT); - if (asc == NULL) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_ASCONF, ENOMEM); - return (ENOMEM); - } - wi = SCTP_ZONE_GET(SCTP_BASE_INFO(ipi_zone_laddr), - struct sctp_laddr); - if (wi == NULL) { - SCTP_FREE(asc, SCTP_M_ASC_IT); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_ASCONF, ENOMEM); - return (ENOMEM); - } if (type == SCTP_ADD_IP_ADDRESS) { sctp_add_local_addr_ep(inp, ifa, type); } else if (type == SCTP_DEL_IP_ADDRESS) { @@ -3205,8 +3187,6 @@ sctp_addr_mgmt_ep_sa(struct sctp_inpcb *inp, struct sockaddr *sa, if (inp->laddr_count < 2) { /* can't delete the last local address */ - SCTP_FREE(asc, SCTP_M_ASC_IT); - SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_laddr), wi); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_ASCONF, EINVAL); return (EINVAL); } @@ -3218,27 +3198,49 @@ sctp_addr_mgmt_ep_sa(struct sctp_inpcb *inp, struct sockaddr *sa, } } } - LIST_INIT(&asc->list_of_work); - asc->cnt = 1; - SCTP_INCR_LADDR_COUNT(); - wi->ifa = ifa; - wi->action = type; - atomic_add_int(&ifa->refcount, 1); - LIST_INSERT_HEAD(&asc->list_of_work, wi, sctp_nxt_addr); - (void)sctp_initiate_iterator(sctp_asconf_iterator_ep, - sctp_asconf_iterator_stcb, - sctp_asconf_iterator_ep_end, - SCTP_PCB_ANY_FLAGS, - SCTP_PCB_ANY_FEATURES, - SCTP_ASOC_ANY_STATE, - (void *)asc, 0, - sctp_asconf_iterator_end, inp, 0); + if (!LIST_EMPTY(&inp->sctp_asoc_list)) { + /* + * There is no need to start the iterator if the inp + * has no associations. + */ + struct sctp_asconf_iterator *asc; + struct sctp_laddr *wi; + + SCTP_MALLOC(asc, struct sctp_asconf_iterator *, + sizeof(struct sctp_asconf_iterator), + SCTP_M_ASC_IT); + if (asc == NULL) { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_ASCONF, ENOMEM); + return (ENOMEM); + } + wi = SCTP_ZONE_GET(SCTP_BASE_INFO(ipi_zone_laddr), struct sctp_laddr); + if (wi == NULL) { + SCTP_FREE(asc, SCTP_M_ASC_IT); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_ASCONF, ENOMEM); + return (ENOMEM); + } + LIST_INIT(&asc->list_of_work); + asc->cnt = 1; + SCTP_INCR_LADDR_COUNT(); + wi->ifa = ifa; + wi->action = type; + atomic_add_int(&ifa->refcount, 1); + LIST_INSERT_HEAD(&asc->list_of_work, wi, sctp_nxt_addr); + (void)sctp_initiate_iterator(sctp_asconf_iterator_ep, + sctp_asconf_iterator_stcb, + sctp_asconf_iterator_ep_end, + SCTP_PCB_ANY_FLAGS, + SCTP_PCB_ANY_FEATURES, + SCTP_ASOC_ANY_STATE, + (void *)asc, 0, + sctp_asconf_iterator_end, inp, 0); + } + return (0); } else { /* invalid address! */ SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_ASCONF, EADDRNOTAVAIL); return (EADDRNOTAVAIL); } - return (0); } void diff --git a/sys/netinet/sctp_auth.c b/sys/netinet/sctp_auth.c index a166cb4b9c9f..928f572cbe21 100644 --- a/sys/netinet/sctp_auth.c +++ b/sys/netinet/sctp_auth.c @@ -456,21 +456,6 @@ sctp_compute_hashkey(sctp_key_t * key1, sctp_key_t * key2, sctp_key_t * shared) /* concatenate the keys */ if (sctp_compare_key(key1, key2) <= 0) { -#ifdef SCTP_AUTH_DRAFT_04 - /* key is key1 + shared + key2 */ - if (sctp_get_keylen(key1)) { - bcopy(key1->key, key_ptr, key1->keylen); - key_ptr += key1->keylen; - } - if (sctp_get_keylen(shared)) { - bcopy(shared->key, key_ptr, shared->keylen); - key_ptr += shared->keylen; - } - if (sctp_get_keylen(key2)) { - bcopy(key2->key, key_ptr, key2->keylen); - key_ptr += key2->keylen; - } -#else /* key is shared + key1 + key2 */ if (sctp_get_keylen(shared)) { bcopy(shared->key, key_ptr, shared->keylen); @@ -484,23 +469,7 @@ sctp_compute_hashkey(sctp_key_t * key1, sctp_key_t * key2, sctp_key_t * shared) bcopy(key2->key, key_ptr, key2->keylen); key_ptr += key2->keylen; } -#endif } else { -#ifdef SCTP_AUTH_DRAFT_04 - /* key is key2 + shared + key1 */ - if (sctp_get_keylen(key2)) { - bcopy(key2->key, key_ptr, key2->keylen); - key_ptr += key2->keylen; - } - if (sctp_get_keylen(shared)) { - bcopy(shared->key, key_ptr, shared->keylen); - key_ptr += shared->keylen; - } - if (sctp_get_keylen(key1)) { - bcopy(key1->key, key_ptr, key1->keylen); - key_ptr += key1->keylen; - } -#else /* key is shared + key2 + key1 */ if (sctp_get_keylen(shared)) { bcopy(shared->key, key_ptr, shared->keylen); @@ -514,7 +483,6 @@ sctp_compute_hashkey(sctp_key_t * key1, sctp_key_t * key2, sctp_key_t * shared) bcopy(key1->key, key_ptr, key1->keylen); key_ptr += key1->keylen; } -#endif } return (new_key); } @@ -573,7 +541,7 @@ sctp_insert_sharedkey(struct sctp_keyhead *shared_keys, return (EINVAL); /* insert into an empty list? */ - if (SCTP_LIST_EMPTY(shared_keys)) { + if (LIST_EMPTY(shared_keys)) { LIST_INSERT_HEAD(shared_keys, new_skey, next); return (0); } @@ -739,7 +707,7 @@ sctp_auth_add_hmacid(sctp_hmaclist_t * list, uint16_t hmac_id) (hmac_id != SCTP_AUTH_HMAC_ID_SHA384) && (hmac_id != SCTP_AUTH_HMAC_ID_SHA512) && #endif - (hmac_id != SCTP_AUTH_HMAC_ID_MD5)) { + 1) { return (-1); } /* Now is it already in the list */ @@ -802,12 +770,6 @@ sctp_negotiate_hmacid(sctp_hmaclist_t * peer, sctp_hmaclist_t * local) for (i = 0; i < peer->num_algo; i++) { for (j = 0; j < local->num_algo; j++) { if (peer->hmac[i] == local->hmac[j]) { -#ifndef SCTP_AUTH_DRAFT_04 - /* "skip" MD5 as it's been deprecated */ - if (peer->hmac[i] == SCTP_AUTH_HMAC_ID_MD5) - continue; -#endif - /* found the "best" one */ SCTPDBG(SCTP_DEBUG_AUTH1, "SCTP: negotiated peer HMAC id %u\n", @@ -911,8 +873,6 @@ sctp_get_hmac_digest_len(uint16_t hmac_algo) switch (hmac_algo) { case SCTP_AUTH_HMAC_ID_SHA1: return (SCTP_AUTH_DIGEST_LEN_SHA1); - case SCTP_AUTH_HMAC_ID_MD5: - return (SCTP_AUTH_DIGEST_LEN_MD5); #ifdef HAVE_SHA224 case SCTP_AUTH_HMAC_ID_SHA224: return (SCTP_AUTH_DIGEST_LEN_SHA224); @@ -936,7 +896,6 @@ sctp_get_hmac_block_len(uint16_t hmac_algo) { switch (hmac_algo) { case SCTP_AUTH_HMAC_ID_SHA1: - case SCTP_AUTH_HMAC_ID_MD5: #ifdef HAVE_SHA224 case SCTP_AUTH_HMAC_ID_SHA224: #endif @@ -962,9 +921,6 @@ sctp_hmac_init(uint16_t hmac_algo, sctp_hash_context_t * ctx) case SCTP_AUTH_HMAC_ID_SHA1: SHA1_Init(&ctx->sha1); break; - case SCTP_AUTH_HMAC_ID_MD5: - MD5_Init(&ctx->md5); - break; #ifdef HAVE_SHA224 case SCTP_AUTH_HMAC_ID_SHA224: break; @@ -995,9 +951,6 @@ sctp_hmac_update(uint16_t hmac_algo, sctp_hash_context_t * ctx, case SCTP_AUTH_HMAC_ID_SHA1: SHA1_Update(&ctx->sha1, text, textlen); break; - case SCTP_AUTH_HMAC_ID_MD5: - MD5_Update(&ctx->md5, text, textlen); - break; #ifdef HAVE_SHA224 case SCTP_AUTH_HMAC_ID_SHA224: break; @@ -1028,9 +981,6 @@ sctp_hmac_final(uint16_t hmac_algo, sctp_hash_context_t * ctx, case SCTP_AUTH_HMAC_ID_SHA1: SHA1_Final(digest, &ctx->sha1); break; - case SCTP_AUTH_HMAC_ID_MD5: - MD5_Final(digest, &ctx->md5); - break; #ifdef HAVE_SHA224 case SCTP_AUTH_HMAC_ID_SHA224: break; @@ -1636,15 +1586,6 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m, (uint8_t *) & tmp_param); } /* concatenate the full random key */ -#ifdef SCTP_AUTH_DRAFT_04 - keylen = random_len; - new_key = sctp_alloc_key(keylen); - if (new_key != NULL) { - /* copy in the RANDOM */ - if (p_random != NULL) - bcopy(p_random->random_data, new_key->key, random_len); - } -#else keylen = sizeof(*p_random) + random_len + sizeof(*hmacs) + hmacs_len; if (chunks != NULL) { keylen += sizeof(*chunks) + num_chunks; @@ -1668,15 +1609,10 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m, sizeof(*hmacs) + hmacs_len); } } -#endif if (stcb->asoc.authinfo.random != NULL) sctp_free_key(stcb->asoc.authinfo.random); stcb->asoc.authinfo.random = new_key; stcb->asoc.authinfo.random_len = random_len; -#ifdef SCTP_AUTH_DRAFT_04 - /* don't include the chunks and hmacs for draft -04 */ - stcb->asoc.authinfo.random->keylen = random_len; -#endif sctp_clear_cachedkeys(stcb, stcb->asoc.authinfo.assoc_keyid); sctp_clear_cachedkeys(stcb, stcb->asoc.authinfo.recv_keyid); @@ -2143,11 +2079,6 @@ sctp_initialize_auth_params(struct sctp_inpcb *inp, struct sctp_tcb *stcb) &stcb->asoc.shared_keys); /* now set the concatenated key (random + chunks + hmacs) */ -#ifdef SCTP_AUTH_DRAFT_04 - /* don't include the chunks and hmacs for draft -04 */ - keylen = random_len; - new_key = sctp_generate_random_key(keylen); -#else /* key includes parameter headers */ keylen = (3 * sizeof(struct sctp_paramhdr)) + random_len + chunks_len + hmacs_len; @@ -2188,436 +2119,8 @@ sctp_initialize_auth_params(struct sctp_inpcb *inp, struct sctp_tcb *stcb) (void)sctp_serialize_hmaclist(stcb->asoc.local_hmacs, new_key->key + keylen); } -#endif if (stcb->asoc.authinfo.random != NULL) sctp_free_key(stcb->asoc.authinfo.random); stcb->asoc.authinfo.random = new_key; stcb->asoc.authinfo.random_len = random_len; } - - -#ifdef SCTP_HMAC_TEST -/* - * HMAC and key concatenation tests - */ -static void -sctp_print_digest(uint8_t * digest, uint32_t digestlen, const char *str) -{ - uint32_t i; - - printf("\n%s: 0x", str); - if (digest == NULL) - return; - - for (i = 0; i < digestlen; i++) - printf("%02x", digest[i]); -} - -static int -sctp_test_hmac(const char *str, uint16_t hmac_id, uint8_t * key, - uint32_t keylen, uint8_t * text, uint32_t textlen, - uint8_t * digest, uint32_t digestlen) -{ - uint8_t computed_digest[SCTP_AUTH_DIGEST_LEN_MAX]; - - printf("\n%s:", str); - sctp_hmac(hmac_id, key, keylen, text, textlen, computed_digest); - sctp_print_digest(digest, digestlen, "Expected digest"); - sctp_print_digest(computed_digest, digestlen, "Computed digest"); - if (memcmp(digest, computed_digest, digestlen) != 0) { - printf("\nFAILED"); - return (-1); - } else { - printf("\nPASSED"); - return (0); - } -} - - -/* - * RFC 2202: HMAC-SHA1 test cases - */ -void -sctp_test_hmac_sha1(void) -{ - uint8_t *digest; - uint8_t key[128]; - uint32_t keylen; - uint8_t text[128]; - uint32_t textlen; - uint32_t digestlen = 20; - int failed = 0; - - /*- - * test_case = 1 - * key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b - * key_len = 20 - * data = "Hi There" - * data_len = 8 - * digest = 0xb617318655057264e28bc0b6fb378c8ef146be00 - */ - keylen = 20; - memset(key, 0x0b, keylen); - textlen = 8; - strcpy(text, "Hi There"); - digest = "\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00"; - if (sctp_test_hmac("SHA1 test case 1", SCTP_AUTH_HMAC_ID_SHA1, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 2 - * key = "Jefe" - * key_len = 4 - * data = "what do ya want for nothing?" - * data_len = 28 - * digest = 0xeffcdf6ae5eb2fa2d27416d5f184df9c259a7c79 - */ - keylen = 4; - strcpy(key, "Jefe"); - textlen = 28; - strcpy(text, "what do ya want for nothing?"); - digest = "\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79"; - if (sctp_test_hmac("SHA1 test case 2", SCTP_AUTH_HMAC_ID_SHA1, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 3 - * key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - * key_len = 20 - * data = 0xdd repeated 50 times - * data_len = 50 - * digest = 0x125d7342b9ac11cd91a39af48aa17b4f63f175d3 - */ - keylen = 20; - memset(key, 0xaa, keylen); - textlen = 50; - memset(text, 0xdd, textlen); - digest = "\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3"; - if (sctp_test_hmac("SHA1 test case 3", SCTP_AUTH_HMAC_ID_SHA1, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 4 - * key = 0x0102030405060708090a0b0c0d0e0f10111213141516171819 - * key_len = 25 - * data = 0xcd repeated 50 times - * data_len = 50 - * digest = 0x4c9007f4026250c6bc8414f9bf50c86c2d7235da - */ - keylen = 25; - memcpy(key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", keylen); - textlen = 50; - memset(text, 0xcd, textlen); - digest = "\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda"; - if (sctp_test_hmac("SHA1 test case 4", SCTP_AUTH_HMAC_ID_SHA1, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 5 - * key = 0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c - * key_len = 20 - * data = "Test With Truncation" - * data_len = 20 - * digest = 0x4c1a03424b55e07fe7f27be1d58bb9324a9a5a04 - * digest-96 = 0x4c1a03424b55e07fe7f27be1 - */ - keylen = 20; - memset(key, 0x0c, keylen); - textlen = 20; - strcpy(text, "Test With Truncation"); - digest = "\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04"; - if (sctp_test_hmac("SHA1 test case 5", SCTP_AUTH_HMAC_ID_SHA1, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 6 - * key = 0xaa repeated 80 times - * key_len = 80 - * data = "Test Using Larger Than Block-Size Key - Hash Key First" - * data_len = 54 - * digest = 0xaa4ae5e15272d00e95705637ce8a3b55ed402112 - */ - keylen = 80; - memset(key, 0xaa, keylen); - textlen = 54; - strcpy(text, "Test Using Larger Than Block-Size Key - Hash Key First"); - digest = "\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12"; - if (sctp_test_hmac("SHA1 test case 6", SCTP_AUTH_HMAC_ID_SHA1, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 7 - * key = 0xaa repeated 80 times - * key_len = 80 - * data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data" - * data_len = 73 - * digest = 0xe8e99d0f45237d786d6bbaa7965c7808bbff1a91 - */ - keylen = 80; - memset(key, 0xaa, keylen); - textlen = 73; - strcpy(text, "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"); - digest = "\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91"; - if (sctp_test_hmac("SHA1 test case 7", SCTP_AUTH_HMAC_ID_SHA1, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /* done with all tests */ - if (failed) - printf("\nSHA1 test results: %d cases failed", failed); - else - printf("\nSHA1 test results: all test cases passed"); -} - -/* - * RFC 2202: HMAC-MD5 test cases - */ -void -sctp_test_hmac_md5(void) -{ - uint8_t *digest; - uint8_t key[128]; - uint32_t keylen; - uint8_t text[128]; - uint32_t textlen; - uint32_t digestlen = 16; - int failed = 0; - - /*- - * test_case = 1 - * key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b - * key_len = 16 - * data = "Hi There" - * data_len = 8 - * digest = 0x9294727a3638bb1c13f48ef8158bfc9d - */ - keylen = 16; - memset(key, 0x0b, keylen); - textlen = 8; - strcpy(text, "Hi There"); - digest = "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d"; - if (sctp_test_hmac("MD5 test case 1", SCTP_AUTH_HMAC_ID_MD5, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 2 - * key = "Jefe" - * key_len = 4 - * data = "what do ya want for nothing?" - * data_len = 28 - * digest = 0x750c783e6ab0b503eaa86e310a5db738 - */ - keylen = 4; - strcpy(key, "Jefe"); - textlen = 28; - strcpy(text, "what do ya want for nothing?"); - digest = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38"; - if (sctp_test_hmac("MD5 test case 2", SCTP_AUTH_HMAC_ID_MD5, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 3 - * key = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - * key_len = 16 - * data = 0xdd repeated 50 times - * data_len = 50 - * digest = 0x56be34521d144c88dbb8c733f0e8b3f6 - */ - keylen = 16; - memset(key, 0xaa, keylen); - textlen = 50; - memset(text, 0xdd, textlen); - digest = "\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6"; - if (sctp_test_hmac("MD5 test case 3", SCTP_AUTH_HMAC_ID_MD5, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 4 - * key = 0x0102030405060708090a0b0c0d0e0f10111213141516171819 - * key_len = 25 - * data = 0xcd repeated 50 times - * data_len = 50 - * digest = 0x697eaf0aca3a3aea3a75164746ffaa79 - */ - keylen = 25; - memcpy(key, "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", keylen); - textlen = 50; - memset(text, 0xcd, textlen); - digest = "\x69\x7e\xaf\x0a\xca\x3a\x3a\xea\x3a\x75\x16\x47\x46\xff\xaa\x79"; - if (sctp_test_hmac("MD5 test case 4", SCTP_AUTH_HMAC_ID_MD5, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 5 - * key = 0x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c - * key_len = 16 - * data = "Test With Truncation" - * data_len = 20 - * digest = 0x56461ef2342edc00f9bab995690efd4c - * digest-96 = 0x56461ef2342edc00f9bab995 - */ - keylen = 16; - memset(key, 0x0c, keylen); - textlen = 20; - strcpy(text, "Test With Truncation"); - digest = "\x56\x46\x1e\xf2\x34\x2e\xdc\x00\xf9\xba\xb9\x95\x69\x0e\xfd\x4c"; - if (sctp_test_hmac("MD5 test case 5", SCTP_AUTH_HMAC_ID_MD5, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 6 - * key = 0xaa repeated 80 times - * key_len = 80 - * data = "Test Using Larger Than Block-Size Key - Hash Key First" - * data_len = 54 - * digest = 0x6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd - */ - keylen = 80; - memset(key, 0xaa, keylen); - textlen = 54; - strcpy(text, "Test Using Larger Than Block-Size Key - Hash Key First"); - digest = "\x6b\x1a\xb7\xfe\x4b\xd7\xbf\x8f\x0b\x62\xe6\xce\x61\xb9\xd0\xcd"; - if (sctp_test_hmac("MD5 test case 6", SCTP_AUTH_HMAC_ID_MD5, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /*- - * test_case = 7 - * key = 0xaa repeated 80 times - * key_len = 80 - * data = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data" - * data_len = 73 - * digest = 0x6f630fad67cda0ee1fb1f562db3aa53e - */ - keylen = 80; - memset(key, 0xaa, keylen); - textlen = 73; - strcpy(text, "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data"); - digest = "\x6f\x63\x0f\xad\x67\xcd\xa0\xee\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e"; - if (sctp_test_hmac("MD5 test case 7", SCTP_AUTH_HMAC_ID_MD5, key, keylen, - text, textlen, digest, digestlen) < 0) - failed++; - - /* done with all tests */ - if (failed) - printf("\nMD5 test results: %d cases failed", failed); - else - printf("\nMD5 test results: all test cases passed"); -} - -/* - * test assoc key concatenation - */ -static int -sctp_test_key_concatenation(sctp_key_t * key1, sctp_key_t * key2, - sctp_key_t * expected_key) -{ - sctp_key_t *key; - int ret_val; - - sctp_show_key(key1, "\nkey1"); - sctp_show_key(key2, "\nkey2"); - key = sctp_compute_hashkey(key1, key2, NULL); - sctp_show_key(expected_key, "\nExpected"); - sctp_show_key(key, "\nComputed"); - if (memcmp(key, expected_key, expected_key->keylen) != 0) { - printf("\nFAILED"); - ret_val = -1; - } else { - printf("\nPASSED"); - ret_val = 0; - } - sctp_free_key(key1); - sctp_free_key(key2); - sctp_free_key(expected_key); - sctp_free_key(key); - return (ret_val); -} - - -void -sctp_test_authkey(void) -{ - sctp_key_t *key1, *key2, *expected_key; - int failed = 0; - - /* test case 1 */ - key1 = sctp_set_key("\x01\x01\x01\x01", 4); - key2 = sctp_set_key("\x01\x02\x03\x04", 4); - expected_key = sctp_set_key("\x01\x01\x01\x01\x01\x02\x03\x04", 8); - if (sctp_test_key_concatenation(key1, key2, expected_key) < 0) - failed++; - - /* test case 2 */ - key1 = sctp_set_key("\x00\x00\x00\x01", 4); - key2 = sctp_set_key("\x02", 1); - expected_key = sctp_set_key("\x00\x00\x00\x01\x02", 5); - if (sctp_test_key_concatenation(key1, key2, expected_key) < 0) - failed++; - - /* test case 3 */ - key1 = sctp_set_key("\x01", 1); - key2 = sctp_set_key("\x00\x00\x00\x02", 4); - expected_key = sctp_set_key("\x01\x00\x00\x00\x02", 5); - if (sctp_test_key_concatenation(key1, key2, expected_key) < 0) - failed++; - - /* test case 4 */ - key1 = sctp_set_key("\x00\x00\x00\x01", 4); - key2 = sctp_set_key("\x01", 1); - expected_key = sctp_set_key("\x01\x00\x00\x00\x01", 5); - if (sctp_test_key_concatenation(key1, key2, expected_key) < 0) - failed++; - - /* test case 5 */ - key1 = sctp_set_key("\x01", 1); - key2 = sctp_set_key("\x00\x00\x00\x01", 4); - expected_key = sctp_set_key("\x01\x00\x00\x00\x01", 5); - if (sctp_test_key_concatenation(key1, key2, expected_key) < 0) - failed++; - - /* test case 6 */ - key1 = sctp_set_key("\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07", 11); - key2 = sctp_set_key("\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x08", 11); - expected_key = sctp_set_key("\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x08", 22); - if (sctp_test_key_concatenation(key1, key2, expected_key) < 0) - failed++; - - /* test case 7 */ - key1 = sctp_set_key("\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x08", 11); - key2 = sctp_set_key("\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07", 11); - expected_key = sctp_set_key("\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x08", 22); - if (sctp_test_key_concatenation(key1, key2, expected_key) < 0) - failed++; - - /* done with all tests */ - if (failed) - printf("\nKey concatenation test results: %d cases failed", failed); - else - printf("\nKey concatenation test results: all test cases passed"); -} - - -#if defined(STANDALONE_HMAC_TEST) -int -main(void) -{ - sctp_test_hmac_sha1(); - sctp_test_hmac_md5(); - sctp_test_authkey(); -} - -#endif /* STANDALONE_HMAC_TEST */ - -#endif /* SCTP_HMAC_TEST */ diff --git a/sys/netinet/sctp_auth.h b/sys/netinet/sctp_auth.h index 8602c97ac3c7..ef0217154831 100644 --- a/sys/netinet/sctp_auth.h +++ b/sys/netinet/sctp_auth.h @@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$"); /* digest lengths */ #define SCTP_AUTH_DIGEST_LEN_SHA1 20 -#define SCTP_AUTH_DIGEST_LEN_MD5 16 #define SCTP_AUTH_DIGEST_LEN_SHA224 28 #define SCTP_AUTH_DIGEST_LEN_SHA256 32 #define SCTP_AUTH_DIGEST_LEN_SHA384 48 @@ -52,7 +51,6 @@ __FBSDID("$FreeBSD$"); /* union of all supported HMAC algorithm contexts */ typedef union sctp_hash_context { SHA1_CTX sha1; - MD5_CTX md5; #ifdef HAVE_SHA2 SHA256_CTX sha256; SHA384_CTX sha384; @@ -62,7 +60,7 @@ typedef union sctp_hash_context { typedef struct sctp_key { uint32_t keylen; - uint8_t key[0]; + uint8_t key[]; } sctp_key_t; typedef struct sctp_shared_key { @@ -85,7 +83,7 @@ typedef struct sctp_auth_chklist { typedef struct sctp_hmaclist { uint16_t max_algo; /* max algorithms allocated */ uint16_t num_algo; /* num algorithms used */ - uint16_t hmac[0]; + uint16_t hmac[]; } sctp_hmaclist_t; /* authentication info */ @@ -234,8 +232,4 @@ sctp_initialize_auth_params(struct sctp_inpcb *inp, struct sctp_tcb *stcb); /* test functions */ -extern void sctp_test_hmac_sha1(void); -extern void sctp_test_hmac_md5(void); -extern void sctp_test_authkey(void); - #endif /* __SCTP_AUTH_H__ */ diff --git a/sys/netinet/sctp_bsd_addr.c b/sys/netinet/sctp_bsd_addr.c index 6a8dfc91163e..e508a4ab986e 100644 --- a/sys/netinet/sctp_bsd_addr.c +++ b/sys/netinet/sctp_bsd_addr.c @@ -97,6 +97,7 @@ sctp_iterator_thread(void *v) &SCTP_BASE_INFO(ipi_iterator_wq_mtx), 0, "waiting_for_work", 0); if (SCTP_BASE_INFO(threads_must_exit)) { + SCTP_IPI_ITERATOR_WQ_DESTROY(); kthread_exit(); } sctp_iterator_worker(); diff --git a/sys/netinet/sctp_cc_functions.c b/sys/netinet/sctp_cc_functions.c index 02fb1a9a9073..8beff191628b 100644 --- a/sys/netinet/sctp_cc_functions.c +++ b/sys/netinet/sctp_cc_functions.c @@ -348,7 +348,7 @@ sctp_cwnd_update_after_timeout(struct sctp_tcb *stcb, struct sctp_nets *net) { int old_cwnd = net->cwnd; - net->ssthresh = max(net->cwnd / 2, 2 * net->mtu); + net->ssthresh = max(net->cwnd / 2, 4 * net->mtu); net->cwnd = net->mtu; net->partial_bytes_acked = 0; diff --git a/sys/netinet/sctp_constants.h b/sys/netinet/sctp_constants.h index 8df349096341..4a013d3df114 100644 --- a/sys/netinet/sctp_constants.h +++ b/sys/netinet/sctp_constants.h @@ -87,10 +87,13 @@ __FBSDID("$FreeBSD$"); /* #define SCTP_AUDITING_ENABLED 1 used for debug/auditing */ #define SCTP_AUDIT_SIZE 256 +/* temporary disabled since it does not work with VNET. */ +#if 0 #define SCTP_USE_THREAD_BASED_ITERATOR 1 +#endif #define SCTP_KTRHEAD_NAME "sctp_iterator" -#define SCTP_KTHREAD_PAGES 2 +#define SCTP_KTHREAD_PAGES 0 /* If you support Multi-VRF how big to @@ -273,28 +276,16 @@ __FBSDID("$FreeBSD$"); #define SCTP_SCALE_FOR_ADDR 2 /* default AUTO_ASCONF mode enable(1)/disable(0) value (sysctl) */ -#if defined (__APPLE__) && !defined(SCTP_APPLE_AUTO_ASCONF) -#define SCTP_DEFAULT_AUTO_ASCONF 0 -#else #define SCTP_DEFAULT_AUTO_ASCONF 1 -#endif /* default MULTIPLE_ASCONF mode enable(1)/disable(0) value (sysctl) */ #define SCTP_DEFAULT_MULTIPLE_ASCONFS 0 /* default MOBILITY_BASE mode enable(1)/disable(0) value (sysctl) */ -#if defined (__APPLE__) && !defined(SCTP_APPLE_MOBILITY_BASE) -#define SCTP_DEFAULT_MOBILITY_BASE 0 -#else #define SCTP_DEFAULT_MOBILITY_BASE 0 -#endif /* default MOBILITY_FASTHANDOFF mode enable(1)/disable(0) value (sysctl) */ -#if defined (__APPLE__) && !defined(SCTP_APPLE_MOBILITY_FASTHANDOFF) #define SCTP_DEFAULT_MOBILITY_FASTHANDOFF 0 -#else -#define SCTP_DEFAULT_MOBILITY_FASTHANDOFF 0 -#endif /* * Theshold for rwnd updates, we have to read (sb_hiwat >> diff --git a/sys/netinet/sctp_header.h b/sys/netinet/sctp_header.h index c551e53b473e..7fc3e56fd8dd 100644 --- a/sys/netinet/sctp_header.h +++ b/sys/netinet/sctp_header.h @@ -62,7 +62,7 @@ struct sctp_ipv6addr_param { struct sctp_cookie_perserve_param { struct sctp_paramhdr ph;/* type=SCTP_COOKIE_PRESERVE, len=8 */ uint32_t time; /* time in ms to extend cookie */ -}; +} SCTP_PACKED; #define SCTP_ARRAY_MIN_LEN 1 /* Host Name Address */ @@ -138,7 +138,7 @@ struct sctp_asconf_addrv4_param { /* an ASCONF address (v4) parameter */ struct sctp_supported_chunk_types_param { struct sctp_paramhdr ph;/* type = 0x8008 len = x */ - uint8_t chunk_types[0]; + uint8_t chunk_types[]; } SCTP_PACKED; @@ -219,7 +219,7 @@ struct sctp_state_cookie { /* this is our definition... */ struct sctp_missing_nat_state { uint16_t cause; uint16_t length; - uint8_t data[0]; + uint8_t data[]; } SCTP_PACKED; @@ -284,13 +284,6 @@ struct sctp_sack_chunk { struct sctp_sack sack; } SCTP_PACKED; - -/* EY Following 3 structs define NR Selective Ack (NR_SACK) chunk */ -struct sctp_nr_gap_ack_block { - uint16_t start; /* NR Gap Ack block start */ - uint16_t end; /* NR Gap Ack block end */ -} SCTP_PACKED; - struct sctp_nr_sack { uint32_t cum_tsn_ack; /* cumulative TSN Ack */ uint32_t a_rwnd; /* updated a_rwnd of sender */ @@ -299,7 +292,6 @@ struct sctp_nr_sack { uint16_t num_dup_tsns; /* number of duplicate TSNs */ uint16_t reserved; /* not currently used */ /* struct sctp_gap_ack_block's follow */ - /* struct sctp_nr_gap_ack_block's follow */ /* uint32_t duplicate_tsn's follow */ } SCTP_PACKED; @@ -459,7 +451,7 @@ struct sctp_pktdrop_chunk { uint32_t current_onq; uint16_t trunc_len; uint16_t reserved; - uint8_t data[0]; + uint8_t data[]; } SCTP_PACKED; /**********STREAM RESET STUFF ******************/ @@ -469,13 +461,13 @@ struct sctp_stream_reset_out_request { uint32_t request_seq; /* monotonically increasing seq no */ uint32_t response_seq; /* if a response, the resp seq no */ uint32_t send_reset_at_tsn; /* last TSN I assigned outbound */ - uint16_t list_of_streams[0]; /* if not all list of streams */ + uint16_t list_of_streams[]; /* if not all list of streams */ } SCTP_PACKED; struct sctp_stream_reset_in_request { struct sctp_paramhdr ph; uint32_t request_seq; - uint16_t list_of_streams[0]; /* if not all list of streams */ + uint16_t list_of_streams[]; /* if not all list of streams */ } SCTP_PACKED; @@ -503,7 +495,7 @@ struct sctp_stream_reset_add_strm { uint32_t request_seq; uint16_t number_of_streams; uint16_t reserved; -}; +} SCTP_PACKED; #define SCTP_STREAM_RESET_NOTHING 0x00000000 /* Nothing for me to do */ #define SCTP_STREAM_RESET_PERFORMED 0x00000001 /* Did it */ @@ -553,24 +545,24 @@ struct sctp_stream_reset_resp_tsn { #define SCTP_RANDOM_MAX_SIZE 256 struct sctp_auth_random { struct sctp_paramhdr ph;/* type = 0x8002 */ - uint8_t random_data[0]; + uint8_t random_data[]; } SCTP_PACKED; struct sctp_auth_chunk_list { struct sctp_paramhdr ph;/* type = 0x8003 */ - uint8_t chunk_types[0]; + uint8_t chunk_types[]; } SCTP_PACKED; struct sctp_auth_hmac_algo { struct sctp_paramhdr ph;/* type = 0x8004 */ - uint16_t hmac_ids[0]; + uint16_t hmac_ids[]; } SCTP_PACKED; struct sctp_auth_chunk { struct sctp_chunkhdr ch; uint16_t shared_key_id; uint16_t hmac_id; - uint8_t hmac[0]; + uint8_t hmac[]; } SCTP_PACKED; struct sctp_auth_invalid_hmac { diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c index 9174522237b9..cdb78aff0e0c 100644 --- a/sys/netinet/sctp_indata.c +++ b/sys/netinet/sctp_indata.c @@ -439,12 +439,11 @@ abandon: * EY!-TODO- this tsn should be tagged nr only if it is * out-of-order, the if statement should be modified */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { - + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { nr_tsn = chk->rec.data.TSN_seq; SCTP_CALC_TSN_TO_GAP(nr_gap, nr_tsn, asoc->nr_mapping_array_base_tsn); - if ((nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3)) || - (nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3))) { + if ((nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3))) { /* * EY The 1st should never happen, as in * process_a_data_chunk method this check @@ -525,11 +524,11 @@ abandon: * nr_gap and tag this tsn * NR */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { SCTP_CALC_TSN_TO_GAP(nr_gap, nr_tsn, asoc->nr_mapping_array_base_tsn); if ((nr_gap >= (SCTP_NR_MAPPING_ARRAY << 3)) || (nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3))) { - printf("Impossible NR gap calculation?\n"); /* * EY The * 1st @@ -694,7 +693,8 @@ protocol_error: * calculate the gap and such then tag this TSN nr * chk->rec.data.TSN_seq */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { SCTP_CALC_TSN_TO_GAP(nr_gap, nr_tsn, asoc->nr_mapping_array_base_tsn); if ((nr_gap >= (SCTP_NR_MAPPING_ARRAY << 3)) || (nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3))) { @@ -750,11 +750,11 @@ protocol_error: * such then tag this TSN nr * chk->rec.data.TSN_seq */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { SCTP_CALC_TSN_TO_GAP(nr_gap, nr_tsn, asoc->nr_mapping_array_base_tsn); if ((nr_gap >= (SCTP_NR_MAPPING_ARRAY << 3)) || (nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3))) { - printf("Impossible nr TSN set 3?\n"); /* * EY The 1st should never * happen, as in @@ -773,7 +773,8 @@ protocol_error: SCTP_TCB_LOCK_ASSERT(stcb); SCTP_REVERSE_OUT_TSN_PRES(nr_gap, nr_tsn, asoc); SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, nr_gap); - if (compare_with_wrap(nr_tsn, asoc->highest_tsn_inside_nr_map, + if (compare_with_wrap(nr_tsn, + asoc->highest_tsn_inside_nr_map, MAX_TSN)) asoc->highest_tsn_inside_nr_map = nr_tsn; } @@ -1759,7 +1760,8 @@ sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc, SCTP_TCB_LOCK_ASSERT(stcb); SCTP_SET_TSN_PRESENT(asoc->mapping_array, gap); /* EY set this tsn present in nr_sack's nr_mapping_array */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { SCTP_TCB_LOCK_ASSERT(stcb); SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap); SCTP_REVERSE_OUT_TSN_PRES(gap, tsn, asoc); @@ -2015,7 +2017,8 @@ failed_express_del: * block here I should check if this delivered tsn * is out_of_order, if yes then update the nr_map */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { /* EY debugging block */ { /* @@ -2260,13 +2263,13 @@ failed_pdapi_express_del: sctp_add_to_readq(stcb->sctp_ep, stcb, control, &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); - /* * EY It is added to the read queue in prev if block * here I should check if this delivered tsn is * out_of_order, if yes then update the nr_map */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { /* * EY check if the mapping_array and * nr_mapping array are consistent @@ -2412,6 +2415,10 @@ finish_express_del: SCTP_TCB_LOCK_ASSERT(stcb); SCTP_SET_TSN_PRESENT(asoc->mapping_array, gap); + /* + * EY - set tsn present in nr-map if doing nr-sacks and the tsn is + * non-renegable + */ if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack && (SCTP_BASE_SYSCTL(sctp_do_drain) == 0)) { @@ -3416,49 +3423,37 @@ sctp_process_segment_range(struct sctp_tcb *stcb, struct sctp_tmit_chunk **p_tp1 } -static void +static int sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_sack_chunk *ch, uint32_t last_tsn, uint32_t * biggest_tsn_acked, + uint32_t last_tsn, uint32_t * biggest_tsn_acked, uint32_t * biggest_newly_acked_tsn, uint32_t * this_sack_lowest_newack, - int num_seg, int *ecn_seg_sums) + int num_seg, int num_nr_seg, int *ecn_seg_sums) { - /************************************************/ - /* process fragments and update sendqueue */ - /************************************************/ - struct sctp_sack *sack; struct sctp_gap_ack_block *frag, block; struct sctp_tmit_chunk *tp1; int i; int num_frs = 0; + int chunk_freed; + int non_revocable; + uint16_t frag_strt, frag_end; + uint32_t last_frag_high; - uint16_t frag_strt, frag_end, primary_flag_set; - u_long last_frag_high; - - /* - * @@@ JRI : TODO: This flag is not used anywhere .. remove? - */ - if (asoc->primary_destination->dest_state & SCTP_ADDR_SWITCH_PRIMARY) { - primary_flag_set = 1; - } else { - primary_flag_set = 0; - } - sack = &ch->sack; - - frag = (struct sctp_gap_ack_block *)sctp_m_getptr(m, *offset, - sizeof(struct sctp_gap_ack_block), (uint8_t *) & block); - *offset += sizeof(block); - if (frag == NULL) { - return; - } tp1 = NULL; last_frag_high = 0; - for (i = 0; i < num_seg; i++) { + chunk_freed = 0; + + for (i = 0; i < (num_seg + num_nr_seg); i++) { + frag = (struct sctp_gap_ack_block *)sctp_m_getptr(m, *offset, + sizeof(struct sctp_gap_ack_block), (uint8_t *) & block); + *offset += sizeof(block); + if (frag == NULL) { + return (chunk_freed); + } frag_strt = ntohs(frag->start); frag_end = ntohs(frag->end); /* some sanity checks on the fragment offsets */ if (frag_strt > frag_end) { /* this one is malformed, skip */ - frag++; continue; } if (compare_with_wrap((frag_end + last_tsn), *biggest_tsn_acked, @@ -3468,7 +3463,6 @@ sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct /* mark acked dgs and find out the highestTSN being acked */ if (tp1 == NULL) { tp1 = TAILQ_FIRST(&asoc->sent_queue); - /* save the locations of the last frags */ last_frag_high = frag_end + last_tsn; } else { @@ -3496,14 +3490,15 @@ sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct } last_frag_high = frag_end + last_tsn; } - sctp_process_segment_range(stcb, &tp1, last_tsn, frag_strt, frag_end, - 0, &num_frs, biggest_newly_acked_tsn, - this_sack_lowest_newack, ecn_seg_sums); - frag = (struct sctp_gap_ack_block *)sctp_m_getptr(m, *offset, - sizeof(struct sctp_gap_ack_block), (uint8_t *) & block); - *offset += sizeof(block); - if (frag == NULL) { - break; + if (i < num_seg) { + non_revocable = 0; + } else { + non_revocable = 1; + } + if (sctp_process_segment_range(stcb, &tp1, last_tsn, frag_strt, frag_end, + non_revocable, &num_frs, biggest_newly_acked_tsn, + this_sack_lowest_newack, ecn_seg_sums)) { + chunk_freed = 1; } } if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { @@ -3512,12 +3507,13 @@ sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct *biggest_newly_acked_tsn, last_tsn, SCTP_FR_LOG_BIGGEST_TSNS); } + return (chunk_freed); } static void sctp_check_for_revoked(struct sctp_tcb *stcb, struct sctp_association *asoc, uint32_t cumack, - u_long biggest_tsn_acked) + uint32_t biggest_tsn_acked) { struct sctp_tmit_chunk *tp1; int tot_revoked = 0; @@ -3599,7 +3595,7 @@ sctp_check_for_revoked(struct sctp_tcb *stcb, static void sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, - u_long biggest_tsn_acked, u_long biggest_tsn_newly_acked, u_long this_sack_lowest_newack, int accum_moved) + uint32_t biggest_tsn_acked, uint32_t biggest_tsn_newly_acked, uint32_t this_sack_lowest_newack, int accum_moved) { struct sctp_tmit_chunk *tp1; int strike_flag = 0; @@ -4450,7 +4446,6 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, struct socket *so; #endif - SOCKBUF_LOCK(&stcb->sctp_socket->so_snd); if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) { /* sa_ignore NO_NULL_CHK */ @@ -4525,10 +4520,10 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, if (compare_with_wrap(asoc->last_acked_seq, asoc->nonce_resync_tsn, MAX_TSN)) { asoc->nonce_sum_check = 1; /* - * now we must calculate what the base is. + * Now we must calculate what the base is. * We do this based on two things, we know * the total's for all the segments - * gap-acked in the SACK (none), We also + * gap-acked in the SACK (none). We also * know the SACK's nonce sum, its in * nonce_sum_flag. So we can build a truth * table to back-calculate the new value of @@ -4567,6 +4562,7 @@ again: /* sa_ignore FREED_MEMORY */ TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) { if (tp1->window_probe) { + /* move back to data send queue */ sctp_window_probe_recovery(stcb, asoc, net, tp1); break; } @@ -4620,9 +4616,7 @@ again: */ if (sctp_fs_audit(asoc)) { TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - if (net->flight_size) { - net->flight_size = 0; - } + net->flight_size = 0; } asoc->total_flight = 0; asoc->total_flight_count = 0; @@ -4782,20 +4776,62 @@ again: } } +/* EY- nr_sack */ +/* Identifies the non-renegable tsns that are revoked*/ +static void +sctp_check_for_nr_revoked(struct sctp_tcb *stcb, + struct sctp_association *asoc, uint32_t cumack, + uint32_t biggest_tsn_acked) +{ + struct sctp_tmit_chunk *tp1; + + for (tp1 = TAILQ_FIRST(&asoc->sent_queue); tp1; tp1 = TAILQ_NEXT(tp1, sctp_next)) { + if (compare_with_wrap(tp1->rec.data.TSN_seq, cumack, + MAX_TSN)) { + /* + * ok this guy is either ACK or MARKED. If it is + * ACKED it has been previously acked but not this + * time i.e. revoked. If it is MARKED it was ACK'ed + * again. + */ + if (compare_with_wrap(tp1->rec.data.TSN_seq, biggest_tsn_acked, + MAX_TSN)) + break; + + + if (tp1->sent == SCTP_DATAGRAM_NR_ACKED) { + /* + * EY! a non-renegable TSN is revoked, need + * to abort the association + */ + /* + * EY TODO: put in the code to abort the + * assoc. + */ + return; + } else if (tp1->sent == SCTP_DATAGRAM_NR_MARKED) { + /* it has been re-acked in this SACK */ + tp1->sent = SCTP_DATAGRAM_NR_ACKED; + } + } + if (tp1->sent == SCTP_DATAGRAM_UNSENT) + break; + } + return; +} + void -sctp_handle_sack(struct mbuf *m, int offset, - struct sctp_sack_chunk *ch, struct sctp_tcb *stcb, - struct sctp_nets *net_from, int *abort_now, int sack_len, uint32_t rwnd) +sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, + struct sctp_tcb *stcb, struct sctp_nets *net_from, + uint16_t num_seg, uint16_t num_nr_seg, uint16_t num_dup, + int *abort_now, uint8_t flags, + uint32_t cum_ack, uint32_t rwnd) { struct sctp_association *asoc; - struct sctp_sack *sack; struct sctp_tmit_chunk *tp1, *tp2; - uint32_t cum_ack, last_tsn, biggest_tsn_acked, biggest_tsn_newly_acked, - this_sack_lowest_newack; + uint32_t last_tsn, biggest_tsn_acked, biggest_tsn_newly_acked, this_sack_lowest_newack; uint32_t sav_cum_ack; - uint16_t num_seg, num_dup; uint16_t wake_him = 0; - unsigned int sack_length; uint32_t send_s = 0; long j; int accum_moved = 0; @@ -4831,15 +4867,13 @@ sctp_handle_sack(struct mbuf *m, int offset, * if in shutdown_recv state. */ SCTP_TCB_LOCK_ASSERT(stcb); - sack = &ch->sack; /* CMT DAC algo */ this_sack_lowest_newack = 0; j = 0; - sack_length = (unsigned int)sack_len; - /* ECN Nonce */ SCTP_STAT_INCR(sctps_slowpath_sack); - nonce_sum_flag = ch->ch.chunk_flags & SCTP_SACK_NONCE_SUM; - cum_ack = last_tsn = ntohl(sack->cum_tsn_ack); + last_tsn = cum_ack; + nonce_sum_flag = flags & SCTP_SACK_NONCE_SUM; + cmt_dac_flag = flags & SCTP_SACK_CMT_DAC; #ifdef SCTP_ASOCLOG_OF_TSNS stcb->asoc.cumack_log[stcb->asoc.cumack_log_at] = cum_ack; stcb->asoc.cumack_log_at++; @@ -4847,13 +4881,12 @@ sctp_handle_sack(struct mbuf *m, int offset, stcb->asoc.cumack_log_at = 0; } #endif - num_seg = ntohs(sack->num_gap_ack_blks); a_rwnd = rwnd; - /* CMT DAC algo */ - cmt_dac_flag = ch->ch.chunk_flags & SCTP_SACK_CMT_DAC; - num_dup = ntohs(sack->num_dup_tsns); - + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_SACK_ARRIVALS_ENABLE) { + sctp_misc_ints(SCTP_SACK_LOG_NORMAL, cum_ack, + rwnd, stcb->asoc.last_acked_seq, stcb->asoc.peers_rwnd); + } old_rwnd = stcb->asoc.peers_rwnd; if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) { sctp_misc_ints(SCTP_THRESHOLD_CLEAR, @@ -4873,27 +4906,16 @@ sctp_handle_sack(struct mbuf *m, int offset, SCTP_LOG_NEW_SACK); } if ((num_dup) && (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_FR_LOGGING_ENABLE | SCTP_EARLYFR_LOGGING_ENABLE))) { - int off_to_dup, iii; + uint16_t i; uint32_t *dupdata, dblock; - off_to_dup = (num_seg * sizeof(struct sctp_gap_ack_block)) + sizeof(struct sctp_sack_chunk); - if ((off_to_dup + (num_dup * sizeof(uint32_t))) <= sack_length) { - dupdata = (uint32_t *) sctp_m_getptr(m, off_to_dup, + for (i = 0; i < num_dup; i++) { + dupdata = (uint32_t *) sctp_m_getptr(m, offset_dup + i * sizeof(uint32_t), sizeof(uint32_t), (uint8_t *) & dblock); - off_to_dup += sizeof(uint32_t); - if (dupdata) { - for (iii = 0; iii < num_dup; iii++) { - sctp_log_fr(*dupdata, 0, 0, SCTP_FR_DUPED); - dupdata = (uint32_t *) sctp_m_getptr(m, off_to_dup, - sizeof(uint32_t), (uint8_t *) & dblock); - if (dupdata == NULL) - break; - off_to_dup += sizeof(uint32_t); - } + if (dupdata == NULL) { + break; } - } else { - SCTP_PRINTF("Size invalid offset to dups:%d number dups:%d sack_len:%d num gaps:%d\n", - off_to_dup, num_dup, sack_length, num_seg); + sctp_log_fr(*dupdata, 0, 0, SCTP_FR_DUPED); } } if (SCTP_BASE_SYSCTL(sctp_strict_sacks)) { @@ -4915,8 +4937,6 @@ sctp_handle_sack(struct mbuf *m, int offset, hopeless_peer: panic("Impossible sack 1"); #else - - /* * no way, we have not even sent this TSN out yet. * Peer is hopelessly messed up with us. @@ -4956,8 +4976,7 @@ sctp_handle_sack(struct mbuf *m, int offset, /* update the Rwnd of the peer */ if (TAILQ_EMPTY(&asoc->sent_queue) && TAILQ_EMPTY(&asoc->send_queue) && - (asoc->stream_queue_cnt == 0) - ) { + (asoc->stream_queue_cnt == 0)) { /* nothing left on send/sent and strmq */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) { sctp_log_rwnd_set(SCTP_SET_PEER_RWND_VIA_SACK, @@ -5128,14 +5147,7 @@ sctp_handle_sack(struct mbuf *m, int offset, /* always set this up to cum-ack */ asoc->this_sack_highest_gap = last_tsn; - /* Move offset up to point to gaps/dups */ - offset += sizeof(struct sctp_sack_chunk); - if (((num_seg * (sizeof(struct sctp_gap_ack_block))) + sizeof(struct sctp_sack_chunk)) > sack_length) { - - /* skip corrupt segments */ - goto skip_segments; - } - if (num_seg > 0) { + if ((num_seg > 0) || (num_nr_seg > 0)) { /* * CMT: SFR algo (and HTNA) - this_sack_highest_newack has @@ -5153,10 +5165,11 @@ sctp_handle_sack(struct mbuf *m, int offset, * handling NEWLY ACKED chunks. this_sack_lowest_newack is * used for CMT DAC algo. saw_newack will also change. */ - sctp_handle_segments(m, &offset, stcb, asoc, ch, last_tsn, - &biggest_tsn_acked, &biggest_tsn_newly_acked, &this_sack_lowest_newack, - num_seg, &ecn_seg_sums); - + if (sctp_handle_segments(m, &offset_seg, stcb, asoc, last_tsn, &biggest_tsn_acked, + &biggest_tsn_newly_acked, &this_sack_lowest_newack, + num_seg, num_nr_seg, &ecn_seg_sums)) { + wake_him++; + } if (SCTP_BASE_SYSCTL(sctp_strict_sacks)) { /* * validate the biggest_tsn_acked in the gap acks if @@ -5172,7 +5185,6 @@ sctp_handle_sack(struct mbuf *m, int offset, } } } -skip_segments: /*******************************************/ /* cancel ALL T3-send timer if accum moved */ /*******************************************/ @@ -5310,6 +5322,19 @@ done_with_it: if (tp1 != NULL) { /* Peer revoked all dg's marked or acked */ TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) { + /* + * EY- maybe check only if it is nr_acked + * nr_marked may not be possible + */ + if ((tp1->sent == SCTP_DATAGRAM_NR_ACKED) || + (tp1->sent == SCTP_DATAGRAM_NR_MARKED)) { + /* + * EY! - TODO: Something previously + * nr_gapped is reneged, abort the + * association + */ + return; + } if ((tp1->sent > SCTP_DATAGRAM_RESEND) && (tp1->sent < SCTP_FORWARD_TSN_SKIP)) { tp1->sent = SCTP_DATAGRAM_SENT; @@ -5345,6 +5370,10 @@ done_with_it: else asoc->saw_sack_with_frags = 0; + /* EY! - not sure about if there should be an IF */ + if (num_nr_seg > 0) + sctp_check_for_nr_revoked(stcb, asoc, cum_ack, biggest_tsn_acked); + /* JRS - Use the congestion control given in the CC module */ asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, accum_moved, reneged_all, will_exit_fast_recovery); @@ -5480,7 +5509,7 @@ done_with_it: if (SCTP_BASE_SYSCTL(sctp_cmt_on_off) && SCTP_BASE_SYSCTL(sctp_cmt_use_dac) && (cmt_dac_flag == 0)) { this_sack_lowest_newack = cum_ack; } - if (num_seg > 0) { + if ((num_seg > 0) || (num_nr_seg > 0)) { sctp_strike_gap_ack_chunks(stcb, asoc, biggest_tsn_acked, biggest_tsn_newly_acked, this_sack_lowest_newack, accum_moved); } @@ -5603,9 +5632,12 @@ again: } if (net->flight_size) { j++; - sctp_timer_start(SCTP_TIMER_TYPE_SEND, - stcb->sctp_ep, stcb, net); + if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { + sctp_timer_start(SCTP_TIMER_TYPE_SEND, + stcb->sctp_ep, stcb, net); + } if (net->window_probe) { + net->window_probe = 0; } } else { if (net->window_probe) { @@ -5613,7 +5645,6 @@ again: * In window probes we must assure a timer * is still running there */ - if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { sctp_timer_start(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net); @@ -5661,7 +5692,11 @@ again: done_once = 1; goto again; } - /* Fix up the a-p-a-p for future PR-SCTP sends */ + /*********************************************/ + /* Here we perform PR-SCTP procedures */ + /* (section 4.2) */ + /*********************************************/ + /* C1. update advancedPeerAckPoint */ if (compare_with_wrap(cum_ack, asoc->advanced_peer_ack_point, MAX_TSN)) { asoc->advanced_peer_ack_point = cum_ack; } @@ -5773,8 +5808,8 @@ sctp_kick_prsctp_reorder_queue(struct sctp_tcb *stcb, * such then tag this TSN nr * chk->rec.data.TSN_seq */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { - + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { SCTP_CALC_TSN_TO_GAP(nr_gap, nr_tsn, asoc->nr_mapping_array_base_tsn); if ((nr_gap >= (SCTP_NR_MAPPING_ARRAY << 3)) || (nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3))) { @@ -5874,7 +5909,8 @@ sctp_kick_prsctp_reorder_queue(struct sctp_tcb *stcb, * such then tag this TSN nr * chk->rec.data.TSN_seq */ - if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && asoc->peer_supports_nr_sack) { + if (SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + asoc->peer_supports_nr_sack) { SCTP_CALC_TSN_TO_GAP(nr_gap, nr_tsn, asoc->nr_mapping_array_base_tsn); if ((nr_gap >= (SCTP_NR_MAPPING_ARRAY << 3)) || (nr_gap >= (uint32_t) (asoc->nr_mapping_array_size << 3))) { @@ -6359,1743 +6395,3 @@ sctp_handle_forward_tsn(struct sctp_tcb *stcb, sctp_deliver_reasm_check(stcb, &stcb->asoc); } } - -/* EY fully identical to sctp_express_handle_sack, duplicated for only naming convention */ -void -sctp_express_handle_nr_sack(struct sctp_tcb *stcb, uint32_t cumack, - uint32_t rwnd, int nonce_sum_flag, int *abort_now) -{ - struct sctp_nets *net; - struct sctp_association *asoc; - struct sctp_tmit_chunk *tp1, *tp2; - uint32_t old_rwnd; - int win_probe_recovery = 0; - int win_probe_recovered = 0; - int j, done_once = 0; - - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_SACK_ARRIVALS_ENABLE) { - sctp_misc_ints(SCTP_SACK_LOG_EXPRESS, cumack, - rwnd, stcb->asoc.last_acked_seq, stcb->asoc.peers_rwnd); - } - SCTP_TCB_LOCK_ASSERT(stcb); -#ifdef SCTP_ASOCLOG_OF_TSNS - stcb->asoc.cumack_log[stcb->asoc.cumack_log_at] = cumack; - stcb->asoc.cumack_log_at++; - if (stcb->asoc.cumack_log_at > SCTP_TSN_LOG_SIZE) { - stcb->asoc.cumack_log_at = 0; - } -#endif - asoc = &stcb->asoc; - old_rwnd = asoc->peers_rwnd; - if (compare_with_wrap(asoc->last_acked_seq, cumack, MAX_TSN)) { - /* old ack */ - return; - } else if (asoc->last_acked_seq == cumack) { - /* Window update sack */ - asoc->peers_rwnd = sctp_sbspace_sub(rwnd, - (uint32_t) (asoc->total_flight + (asoc->sent_queue_cnt * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh)))); - if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) { - /* SWS sender side engages */ - asoc->peers_rwnd = 0; - } - if (asoc->peers_rwnd > old_rwnd) { - goto again; - } - return; - } - /* First setup for CC stuff */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - net->prev_cwnd = net->cwnd; - net->net_ack = 0; - net->net_ack2 = 0; - - /* - * CMT: Reset CUC and Fast recovery algo variables before - * SACK processing - */ - net->new_pseudo_cumack = 0; - net->will_exit_fast_recovery = 0; - } - if (SCTP_BASE_SYSCTL(sctp_strict_sacks)) { - uint32_t send_s; - - if (!TAILQ_EMPTY(&asoc->sent_queue)) { - tp1 = TAILQ_LAST(&asoc->sent_queue, - sctpchunk_listhead); - send_s = tp1->rec.data.TSN_seq + 1; - } else { - send_s = asoc->sending_seq; - } - if ((cumack == send_s) || - compare_with_wrap(cumack, send_s, MAX_TSN)) { -#ifndef INVARIANTS - struct mbuf *oper; - -#endif -#ifdef INVARIANTS - panic("Impossible sack 1"); -#else - *abort_now = 1; - /* XXX */ - oper = sctp_get_mbuf_for_msg((sizeof(struct sctp_paramhdr) + sizeof(uint32_t)), - 0, M_DONTWAIT, 1, MT_DATA); - if (oper) { - struct sctp_paramhdr *ph; - uint32_t *ippp; - - SCTP_BUF_LEN(oper) = sizeof(struct sctp_paramhdr) + - sizeof(uint32_t); - ph = mtod(oper, struct sctp_paramhdr *); - ph->param_type = htons(SCTP_CAUSE_PROTOCOL_VIOLATION); - ph->param_length = htons(SCTP_BUF_LEN(oper)); - ippp = (uint32_t *) (ph + 1); - *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_25); - } - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - return; -#endif - } - } - asoc->this_sack_highest_gap = cumack; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) { - sctp_misc_ints(SCTP_THRESHOLD_CLEAR, - stcb->asoc.overall_error_count, - 0, - SCTP_FROM_SCTP_INDATA, - __LINE__); - } - stcb->asoc.overall_error_count = 0; - if (compare_with_wrap(cumack, asoc->last_acked_seq, MAX_TSN)) { - /* process the new consecutive TSN first */ - tp1 = TAILQ_FIRST(&asoc->sent_queue); - while (tp1) { - tp2 = TAILQ_NEXT(tp1, sctp_next); - if (compare_with_wrap(cumack, tp1->rec.data.TSN_seq, - MAX_TSN) || - cumack == tp1->rec.data.TSN_seq) { - if (tp1->sent == SCTP_DATAGRAM_UNSENT) { - printf("Warning, an unsent is now acked?\n"); - } - /* - * ECN Nonce: Add the nonce to the sender's - * nonce sum - */ - asoc->nonce_sum_expect_base += tp1->rec.data.ect_nonce; - if (tp1->sent < SCTP_DATAGRAM_ACKED) { - /* - * If it is less than ACKED, it is - * now no-longer in flight. Higher - * values may occur during marking - */ - if (tp1->sent < SCTP_DATAGRAM_RESEND) { - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) { - sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_CA, - tp1->whoTo->flight_size, - tp1->book_size, - (uintptr_t) tp1->whoTo, - tp1->rec.data.TSN_seq); - } - sctp_flight_size_decrease(tp1); - /* sa_ignore NO_NULL_CHK */ - sctp_total_flight_decrease(stcb, tp1); - } - tp1->whoTo->net_ack += tp1->send_size; - if (tp1->snd_count < 2) { - /* - * True non-retransmited - * chunk - */ - tp1->whoTo->net_ack2 += - tp1->send_size; - - /* update RTO too? */ - if (tp1->do_rtt) { - tp1->whoTo->RTO = - /* - * sa_ignore - * NO_NULL_CHK - */ - sctp_calculate_rto(stcb, - asoc, tp1->whoTo, - &tp1->sent_rcv_time, - sctp_align_safe_nocopy); - tp1->do_rtt = 0; - } - } - /* - * CMT: CUCv2 algorithm. From the - * cumack'd TSNs, for each TSN being - * acked for the first time, set the - * following variables for the - * corresp destination. - * new_pseudo_cumack will trigger a - * cwnd update. - * find_(rtx_)pseudo_cumack will - * trigger search for the next - * expected (rtx-)pseudo-cumack. - */ - tp1->whoTo->new_pseudo_cumack = 1; - tp1->whoTo->find_pseudo_cumack = 1; - tp1->whoTo->find_rtx_pseudo_cumack = 1; - - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { - /* sa_ignore NO_NULL_CHK */ - sctp_log_cwnd(stcb, tp1->whoTo, tp1->rec.data.TSN_seq, SCTP_CWND_LOG_FROM_SACK); - } - } - if (tp1->sent == SCTP_DATAGRAM_RESEND) { - sctp_ucount_decr(asoc->sent_queue_retran_cnt); - } - if (tp1->rec.data.chunk_was_revoked) { - /* deflate the cwnd */ - tp1->whoTo->cwnd -= tp1->book_size; - tp1->rec.data.chunk_was_revoked = 0; - } - tp1->sent = SCTP_DATAGRAM_ACKED; - TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next); - if (tp1->data) { - /* sa_ignore NO_NULL_CHK */ - sctp_free_bufspace(stcb, asoc, tp1, 1); - sctp_m_freem(tp1->data); - } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) { - sctp_log_sack(asoc->last_acked_seq, - cumack, - tp1->rec.data.TSN_seq, - 0, - 0, - SCTP_LOG_FREE_SENT); - } - tp1->data = NULL; - asoc->sent_queue_cnt--; - sctp_free_a_chunk(stcb, tp1); - tp1 = tp2; - } else { - break; - } - } - - } - /* sa_ignore NO_NULL_CHK */ - if (stcb->sctp_socket) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - struct socket *so; - -#endif - - SOCKBUF_LOCK(&stcb->sctp_socket->so_snd); - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) { - /* sa_ignore NO_NULL_CHK */ - sctp_wakeup_log(stcb, cumack, 1, SCTP_WAKESND_FROM_SACK); - } -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - so = SCTP_INP_SO(stcb->sctp_ep); - atomic_add_int(&stcb->asoc.refcnt, 1); - SCTP_TCB_UNLOCK(stcb); - SCTP_SOCKET_LOCK(so, 1); - SCTP_TCB_LOCK(stcb); - atomic_subtract_int(&stcb->asoc.refcnt, 1); - if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { - /* assoc was freed while we were unlocked */ - SCTP_SOCKET_UNLOCK(so, 1); - return; - } -#endif - sctp_sowwakeup_locked(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - SCTP_SOCKET_UNLOCK(so, 1); -#endif - } else { - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) { - sctp_wakeup_log(stcb, cumack, 1, SCTP_NOWAKE_FROM_SACK); - } - } - - /* JRS - Use the congestion control given in the CC module */ - if (asoc->last_acked_seq != cumack) - asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, 1, 0, 0); - - asoc->last_acked_seq = cumack; - - if (TAILQ_EMPTY(&asoc->sent_queue)) { - /* nothing left in-flight */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - net->flight_size = 0; - net->partial_bytes_acked = 0; - } - asoc->total_flight = 0; - asoc->total_flight_count = 0; - } - /* Fix up the a-p-a-p for future PR-SCTP sends */ - if (compare_with_wrap(cumack, asoc->advanced_peer_ack_point, MAX_TSN)) { - asoc->advanced_peer_ack_point = cumack; - } - /* ECN Nonce updates */ - if (asoc->ecn_nonce_allowed) { - if (asoc->nonce_sum_check) { - if (nonce_sum_flag != ((asoc->nonce_sum_expect_base) & SCTP_SACK_NONCE_SUM)) { - if (asoc->nonce_wait_for_ecne == 0) { - struct sctp_tmit_chunk *lchk; - - lchk = TAILQ_FIRST(&asoc->send_queue); - asoc->nonce_wait_for_ecne = 1; - if (lchk) { - asoc->nonce_wait_tsn = lchk->rec.data.TSN_seq; - } else { - asoc->nonce_wait_tsn = asoc->sending_seq; - } - } else { - if (compare_with_wrap(asoc->last_acked_seq, asoc->nonce_wait_tsn, MAX_TSN) || - (asoc->last_acked_seq == asoc->nonce_wait_tsn)) { - /* - * Misbehaving peer. We need - * to react to this guy - */ - asoc->ecn_allowed = 0; - asoc->ecn_nonce_allowed = 0; - } - } - } - } else { - /* See if Resynchronization Possible */ - if (compare_with_wrap(asoc->last_acked_seq, asoc->nonce_resync_tsn, MAX_TSN)) { - asoc->nonce_sum_check = 1; - /* - * now we must calculate what the base is. - * We do this based on two things, we know - * the total's for all the segments - * gap-acked in the SACK (none), We also - * know the SACK's nonce sum, its in - * nonce_sum_flag. So we can build a truth - * table to back-calculate the new value of - * asoc->nonce_sum_expect_base: - * - * SACK-flag-Value Seg-Sums Base 0 0 0 - * 1 0 1 0 1 1 1 1 0 - */ - asoc->nonce_sum_expect_base = (0 ^ nonce_sum_flag) & SCTP_SACK_NONCE_SUM; - } - } - } - /* RWND update */ - asoc->peers_rwnd = sctp_sbspace_sub(rwnd, - (uint32_t) (asoc->total_flight + (asoc->sent_queue_cnt * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh)))); - if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) { - /* SWS sender side engages */ - asoc->peers_rwnd = 0; - } - if (asoc->peers_rwnd > old_rwnd) { - win_probe_recovery = 1; - } - /* Now assure a timer where data is queued at */ -again: - j = 0; - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - int to_ticks; - - if (win_probe_recovery && (net->window_probe)) { - win_probe_recovered = 1; - /* - * Find first chunk that was used with window probe - * and clear the sent - */ - /* sa_ignore FREED_MEMORY */ - TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) { - if (tp1->window_probe) { - /* move back to data send queue */ - sctp_window_probe_recovery(stcb, asoc, net, tp1); - break; - } - } - } - if (net->RTO == 0) { - to_ticks = MSEC_TO_TICKS(stcb->asoc.initial_rto); - } else { - to_ticks = MSEC_TO_TICKS(net->RTO); - } - if (net->flight_size) { - - j++; - (void)SCTP_OS_TIMER_START(&net->rxt_timer.timer, to_ticks, - sctp_timeout_handler, &net->rxt_timer); - if (net->window_probe) { - net->window_probe = 0; - } - } else { - if (net->window_probe) { - /* - * In window probes we must assure a timer - * is still running there - */ - net->window_probe = 0; - (void)SCTP_OS_TIMER_START(&net->rxt_timer.timer, to_ticks, - sctp_timeout_handler, &net->rxt_timer); - } else if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_22); - } - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck4); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_23); - } - } - } - } - if ((j == 0) && - (!TAILQ_EMPTY(&asoc->sent_queue)) && - (asoc->sent_queue_retran_cnt == 0) && - (win_probe_recovered == 0) && - (done_once == 0)) { - /* - * huh, this should not happen unless all packets are - * PR-SCTP and marked to skip of course. - */ - if (sctp_fs_audit(asoc)) { - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - net->flight_size = 0; - } - asoc->total_flight = 0; - asoc->total_flight_count = 0; - asoc->sent_queue_retran_cnt = 0; - TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) { - if (tp1->sent < SCTP_DATAGRAM_RESEND) { - sctp_flight_size_increase(tp1); - sctp_total_flight_increase(stcb, tp1); - } else if (tp1->sent == SCTP_DATAGRAM_RESEND) { - asoc->sent_queue_retran_cnt++; - } - } - } - done_once = 1; - goto again; - } - /**********************************/ - /* Now what about shutdown issues */ - /**********************************/ - if (TAILQ_EMPTY(&asoc->send_queue) && TAILQ_EMPTY(&asoc->sent_queue)) { - /* nothing left on sendqueue.. consider done */ - /* clean up */ - if ((asoc->stream_queue_cnt == 1) && - ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) || - (asoc->state & SCTP_STATE_SHUTDOWN_RECEIVED)) && - (asoc->locked_on_sending) - ) { - struct sctp_stream_queue_pending *sp; - - /* - * I may be in a state where we got all across.. but - * cannot write more due to a shutdown... we abort - * since the user did not indicate EOR in this case. - * The sp will be cleaned during free of the asoc. - */ - sp = TAILQ_LAST(&((asoc->locked_on_sending)->outqueue), - sctp_streamhead); - if ((sp) && (sp->length == 0)) { - /* Let cleanup code purge it */ - if (sp->msg_is_complete) { - asoc->stream_queue_cnt--; - } else { - asoc->state |= SCTP_STATE_PARTIAL_MSG_LEFT; - asoc->locked_on_sending = NULL; - asoc->stream_queue_cnt--; - } - } - } - if ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) && - (asoc->stream_queue_cnt == 0)) { - if (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT) { - /* Need to abort here */ - struct mbuf *oper; - - abort_out_now: - *abort_now = 1; - /* XXX */ - oper = sctp_get_mbuf_for_msg((sizeof(struct sctp_paramhdr) + sizeof(uint32_t)), - 0, M_DONTWAIT, 1, MT_DATA); - if (oper) { - struct sctp_paramhdr *ph; - uint32_t *ippp; - - SCTP_BUF_LEN(oper) = sizeof(struct sctp_paramhdr) + - sizeof(uint32_t); - ph = mtod(oper, struct sctp_paramhdr *); - ph->param_type = htons(SCTP_CAUSE_USER_INITIATED_ABT); - ph->param_length = htons(SCTP_BUF_LEN(oper)); - ippp = (uint32_t *) (ph + 1); - *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_24); - } - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_24; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_RESPONSE_TO_USER_REQ, oper, SCTP_SO_NOT_LOCKED); - } else { - if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || - (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { - SCTP_STAT_DECR_GAUGE32(sctps_currestab); - } - SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); - SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); - sctp_stop_timers_for_shutdown(stcb); - sctp_send_shutdown(stcb, - stcb->asoc.primary_destination); - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, - stcb->sctp_ep, stcb, asoc->primary_destination); - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, - stcb->sctp_ep, stcb, asoc->primary_destination); - } - } else if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) && - (asoc->stream_queue_cnt == 0)) { - if (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT) { - goto abort_out_now; - } - SCTP_STAT_DECR_GAUGE32(sctps_currestab); - SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_ACK_SENT); - SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); - sctp_send_shutdown_ack(stcb, - stcb->asoc.primary_destination); - - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNACK, - stcb->sctp_ep, stcb, asoc->primary_destination); - } - } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_RWND_LOGGING_ENABLE) { - sctp_misc_ints(SCTP_SACK_RWND_UPDATE, - rwnd, - stcb->asoc.peers_rwnd, - stcb->asoc.total_flight, - stcb->asoc.total_output_queue_size); - } -} - -/* EY! nr_sack version of sctp_handle_segments, nr-gapped TSNs get removed from RtxQ in this method*/ -static void -sctp_handle_nr_sack_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_nr_sack_chunk *ch, uint32_t last_tsn, uint32_t * biggest_tsn_acked, - uint32_t * biggest_newly_acked_tsn, uint32_t * this_sack_lowest_newack, - uint32_t num_seg, uint32_t num_nr_seg, int *ecn_seg_sums) -{ - /************************************************/ - /* process fragments and update sendqueue */ - /************************************************/ - struct sctp_nr_sack *nr_sack; - struct sctp_gap_ack_block *frag, block; - struct sctp_nr_gap_ack_block *nr_frag, nr_block; - struct sctp_tmit_chunk *tp1; - uint32_t i; - int wake_him = 0; - int num_frs = 0; - - uint16_t frag_strt, frag_end, primary_flag_set; - uint16_t nr_frag_strt, nr_frag_end; - - uint32_t last_frag_high; - uint32_t last_nr_frag_high; - - /* - * @@@ JRI : TODO: This flag is not used anywhere .. remove? - */ - if (asoc->primary_destination->dest_state & SCTP_ADDR_SWITCH_PRIMARY) { - primary_flag_set = 1; - } else { - primary_flag_set = 0; - } - nr_sack = &ch->nr_sack; - - /* - * EY! - I will process nr_gaps similarly,by going to this position - * again if All bit is set - */ - frag = (struct sctp_gap_ack_block *)sctp_m_getptr(m, *offset, - sizeof(struct sctp_gap_ack_block), (uint8_t *) & block); - *offset += sizeof(block); - if (frag == NULL) { - return; - } - tp1 = NULL; - last_frag_high = 0; - for (i = 0; i < num_seg; i++) { - frag_strt = ntohs(frag->start); - frag_end = ntohs(frag->end); - /* some sanity checks on the fargment offsets */ - if (frag_strt > frag_end) { - /* this one is malformed, skip */ - frag++; - continue; - } - if (compare_with_wrap((frag_end + last_tsn), *biggest_tsn_acked, - MAX_TSN)) - *biggest_tsn_acked = frag_end + last_tsn; - - /* mark acked dgs and find out the highestTSN being acked */ - if (tp1 == NULL) { - tp1 = TAILQ_FIRST(&asoc->sent_queue); - - /* save the locations of the last frags */ - last_frag_high = frag_end + last_tsn; - } else { - /* - * now lets see if we need to reset the queue due to - * a out-of-order SACK fragment - */ - if (compare_with_wrap(frag_strt + last_tsn, - last_frag_high, MAX_TSN)) { - /* - * if the new frag starts after the last TSN - * frag covered, we are ok and this one is - * beyond the last one - */ - ; - } else { - /* - * ok, they have reset us, so we need to - * reset the queue this will cause extra - * hunting but hey, they chose the - * performance hit when they failed to order - * there gaps.. - */ - tp1 = TAILQ_FIRST(&asoc->sent_queue); - } - last_frag_high = frag_end + last_tsn; - } - sctp_process_segment_range(stcb, &tp1, last_tsn, frag_strt, frag_end, - 0, &num_frs, biggest_newly_acked_tsn, - this_sack_lowest_newack, ecn_seg_sums); - frag = (struct sctp_gap_ack_block *)sctp_m_getptr(m, *offset, - sizeof(struct sctp_gap_ack_block), (uint8_t *) & block); - *offset += sizeof(block); - if (frag == NULL) { - break; - } - } - - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { - if (num_frs) - sctp_log_fr(*biggest_tsn_acked, - *biggest_newly_acked_tsn, - last_tsn, SCTP_FR_LOG_BIGGEST_TSNS); - } - nr_frag = (struct sctp_nr_gap_ack_block *)sctp_m_getptr(m, *offset, - sizeof(struct sctp_nr_gap_ack_block), (uint8_t *) & nr_block); - *offset += sizeof(nr_block); - - - - if (nr_frag == NULL) { - return; - } - tp1 = NULL; - last_nr_frag_high = 0; - /* Reset to beginning for the nr_sack section */ - tp1 = TAILQ_FIRST(&asoc->sent_queue); - - for (i = 0; i < num_nr_seg; i++) { - - nr_frag_strt = ntohs(nr_frag->start); - nr_frag_end = ntohs(nr_frag->end); - - /* some sanity checks on the nr fargment offsets */ - if (nr_frag_strt > nr_frag_end) { - /* this one is malformed, skip */ - nr_frag++; - continue; - } - /* mark acked dgs and find out the highestTSN being acked */ - if (tp1 == NULL) { - tp1 = TAILQ_FIRST(&asoc->sent_queue); - - /* save the locations of the last frags */ - last_nr_frag_high = nr_frag_end + last_tsn; - } else { - /* - * now lets see if we need to reset the queue due to - * a out-of-order SACK fragment - */ - if (compare_with_wrap(nr_frag_strt + last_tsn, - last_nr_frag_high, MAX_TSN)) { - /* - * if the new frag starts after the last TSN - * frag covered, we are ok and this one is - * beyond the last one - */ - ; - } else { - /* - * ok, they have reset us, so we need to - * reset the queue this will cause extra - * hunting but hey, they chose the - * performance hit when they failed to order - * there gaps.. - */ - tp1 = TAILQ_FIRST(&asoc->sent_queue); - } - last_nr_frag_high = nr_frag_end + last_tsn; - } - num_frs = 0; - wake_him = sctp_process_segment_range(stcb, &tp1, last_tsn, - nr_frag_strt, nr_frag_end, 1, - &num_frs, biggest_newly_acked_tsn, - this_sack_lowest_newack, ecn_seg_sums); - - nr_frag = (struct sctp_nr_gap_ack_block *)sctp_m_getptr(m, *offset, - sizeof(struct sctp_nr_gap_ack_block), - (uint8_t *) & nr_block); - *offset += sizeof(nr_block); - if (nr_frag == NULL) { - break; - } - } - - /* - * EY- wake up the socket if things have been removed from the sent - * queue - */ - if ((wake_him) && (stcb->sctp_socket)) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - struct socket *so; - -#endif - SOCKBUF_LOCK(&stcb->sctp_socket->so_snd); - /* - * if (SCTP_BASE_SYSCTL(sctp_logging_level) & - * SCTP_WAKE_LOGGING_ENABLE) { sctp_wakeup_log(stcb, - * cum_ack, wake_him, SCTP_WAKESND_FROM_SACK);} - */ -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - so = SCTP_INP_SO(stcb->sctp_ep); - atomic_add_int(&stcb->asoc.refcnt, 1); - SCTP_TCB_UNLOCK(stcb); - SCTP_SOCKET_LOCK(so, 1); - SCTP_TCB_LOCK(stcb); - atomic_subtract_int(&stcb->asoc.refcnt, 1); - if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { - /* assoc was freed while we were unlocked */ - SCTP_SOCKET_UNLOCK(so, 1); - return; - } -#endif - sctp_sowwakeup_locked(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - SCTP_SOCKET_UNLOCK(so, 1); -#endif - } /* else { if - * (SCTP_BASE_SYSCTL(sctp_logging_level) & - * SCTP_WAKE_LOGGING_ENABLE) { - * sctp_wakeup_log(stcb, cum_ack, wake_him, - * SCTP_NOWAKE_FROM_SACK); } } */ -} - -/* EY- nr_sack */ -/* Identifies the non-renegable tsns that are revoked*/ -static void -sctp_check_for_nr_revoked(struct sctp_tcb *stcb, - struct sctp_association *asoc, uint32_t cumack, - u_long biggest_tsn_acked) -{ - struct sctp_tmit_chunk *tp1; - - tp1 = TAILQ_FIRST(&asoc->sent_queue); - while (tp1) { - if (compare_with_wrap(tp1->rec.data.TSN_seq, cumack, - MAX_TSN)) { - /* - * ok this guy is either ACK or MARKED. If it is - * ACKED it has been previously acked but not this - * time i.e. revoked. If it is MARKED it was ACK'ed - * again. - */ - if (compare_with_wrap(tp1->rec.data.TSN_seq, biggest_tsn_acked, - MAX_TSN)) - break; - - - if (tp1->sent == SCTP_DATAGRAM_NR_ACKED) { - /* - * EY! a non-renegable TSN is revoked, need - * to abort the association - */ - /* - * EY TODO: put in the code to abort the - * assoc. - */ - return; - } else if (tp1->sent == SCTP_DATAGRAM_NR_MARKED) { - /* it has been re-acked in this SACK */ - tp1->sent = SCTP_DATAGRAM_NR_ACKED; - } - } - if (tp1->sent == SCTP_DATAGRAM_UNSENT) - break; - tp1 = TAILQ_NEXT(tp1, sctp_next); - } -} - -/* EY! nr_sack version of sctp_handle_sack, nr_gap_ack processing should be added to this method*/ -void -sctp_handle_nr_sack(struct mbuf *m, int offset, - struct sctp_nr_sack_chunk *ch, struct sctp_tcb *stcb, - struct sctp_nets *net_from, int *abort_now, int nr_sack_len, uint32_t rwnd) -{ - struct sctp_association *asoc; - - /* EY sack */ - struct sctp_nr_sack *nr_sack; - struct sctp_tmit_chunk *tp1, *tp2; - uint32_t cum_ack, last_tsn, biggest_tsn_acked, biggest_tsn_newly_acked, - this_sack_lowest_newack; - uint32_t sav_cum_ack; - - /* EY num_seg */ - uint16_t num_seg, num_nr_seg, num_dup; - uint16_t wake_him = 0; - unsigned int nr_sack_length; - uint32_t send_s = 0; - long j; - int accum_moved = 0; - int will_exit_fast_recovery = 0; - uint32_t a_rwnd, old_rwnd; - int win_probe_recovery = 0; - int win_probe_recovered = 0; - struct sctp_nets *net = NULL; - int nonce_sum_flag, ecn_seg_sums = 0; - int done_once; - uint8_t reneged_all = 0; - uint8_t cmt_dac_flag; - - /* - * we take any chance we can to service our queues since we cannot - * get awoken when the socket is read from :< - */ - /* - * Now perform the actual SACK handling: 1) Verify that it is not an - * old sack, if so discard. 2) If there is nothing left in the send - * queue (cum-ack is equal to last acked) then you have a duplicate - * too, update any rwnd change and verify no timers are running. - * then return. 3) Process any new consequtive data i.e. cum-ack - * moved process these first and note that it moved. 4) Process any - * sack blocks. 5) Drop any acked from the queue. 6) Check for any - * revoked blocks and mark. 7) Update the cwnd. 8) Nothing left, - * sync up flightsizes and things, stop all timers and also check - * for shutdown_pending state. If so then go ahead and send off the - * shutdown. If in shutdown recv, send off the shutdown-ack and - * start that timer, Ret. 9) Strike any non-acked things and do FR - * procedure if needed being sure to set the FR flag. 10) Do pr-sctp - * procedures. 11) Apply any FR penalties. 12) Assure we will SACK - * if in shutdown_recv state. - */ - SCTP_TCB_LOCK_ASSERT(stcb); - nr_sack = &ch->nr_sack; - /* CMT DAC algo */ - this_sack_lowest_newack = 0; - j = 0; - nr_sack_length = (unsigned int)nr_sack_len; - /* ECN Nonce */ - SCTP_STAT_INCR(sctps_slowpath_sack); - nonce_sum_flag = ch->ch.chunk_flags & SCTP_SACK_NONCE_SUM; - cum_ack = last_tsn = ntohl(nr_sack->cum_tsn_ack); -#ifdef SCTP_ASOCLOG_OF_TSNS - stcb->asoc.cumack_log[stcb->asoc.cumack_log_at] = cum_ack; - stcb->asoc.cumack_log_at++; - if (stcb->asoc.cumack_log_at > SCTP_TSN_LOG_SIZE) { - stcb->asoc.cumack_log_at = 0; - } -#endif - num_seg = ntohs(nr_sack->num_gap_ack_blks); - num_nr_seg = ntohs(nr_sack->num_nr_gap_ack_blks); - a_rwnd = rwnd; - - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_SACK_ARRIVALS_ENABLE) { - sctp_misc_ints(SCTP_SACK_LOG_NORMAL, cum_ack, - rwnd, stcb->asoc.last_acked_seq, stcb->asoc.peers_rwnd); - } - /* CMT DAC algo */ - cmt_dac_flag = ch->ch.chunk_flags & SCTP_SACK_CMT_DAC; - num_dup = ntohs(nr_sack->num_dup_tsns); - - old_rwnd = stcb->asoc.peers_rwnd; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) { - sctp_misc_ints(SCTP_THRESHOLD_CLEAR, - stcb->asoc.overall_error_count, - 0, - SCTP_FROM_SCTP_INDATA, - __LINE__); - } - stcb->asoc.overall_error_count = 0; - asoc = &stcb->asoc; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) { - sctp_log_sack(asoc->last_acked_seq, - cum_ack, - 0, - num_seg, - num_dup, - SCTP_LOG_NEW_SACK); - } - if ((num_dup) && (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_FR_LOGGING_ENABLE | SCTP_EARLYFR_LOGGING_ENABLE))) { - int off_to_dup, iii; - uint32_t *dupdata, dblock; - - off_to_dup = (num_seg * sizeof(struct sctp_gap_ack_block)) + - (num_nr_seg * sizeof(struct sctp_nr_gap_ack_block)) + sizeof(struct sctp_nr_sack_chunk); - if ((off_to_dup + (num_dup * sizeof(uint32_t))) <= nr_sack_length) { - dupdata = (uint32_t *) sctp_m_getptr(m, off_to_dup, - sizeof(uint32_t), (uint8_t *) & dblock); - off_to_dup += sizeof(uint32_t); - if (dupdata) { - for (iii = 0; iii < num_dup; iii++) { - sctp_log_fr(*dupdata, 0, 0, SCTP_FR_DUPED); - dupdata = (uint32_t *) sctp_m_getptr(m, off_to_dup, - sizeof(uint32_t), (uint8_t *) & dblock); - if (dupdata == NULL) - break; - off_to_dup += sizeof(uint32_t); - } - } - } else { - SCTP_PRINTF("Size invalid offset to dups:%d number dups:%d nr_sack_len:%d num gaps:%d num nr_gaps:%d\n", - off_to_dup, num_dup, nr_sack_length, num_seg, num_nr_seg); - } - } - if (SCTP_BASE_SYSCTL(sctp_strict_sacks)) { - /* reality check */ - if (!TAILQ_EMPTY(&asoc->sent_queue)) { - tp1 = TAILQ_LAST(&asoc->sent_queue, - sctpchunk_listhead); - send_s = tp1->rec.data.TSN_seq + 1; - } else { - send_s = asoc->sending_seq; - } - if (cum_ack == send_s || - compare_with_wrap(cum_ack, send_s, MAX_TSN)) { -#ifndef INVARIANTS - struct mbuf *oper; - -#endif -#ifdef INVARIANTS - hopeless_peer: - panic("Impossible sack 1"); -#else - - - /* - * no way, we have not even sent this TSN out yet. - * Peer is hopelessly messed up with us. - */ - hopeless_peer: - *abort_now = 1; - /* XXX */ - oper = sctp_get_mbuf_for_msg((sizeof(struct sctp_paramhdr) + sizeof(uint32_t)), - 0, M_DONTWAIT, 1, MT_DATA); - if (oper) { - struct sctp_paramhdr *ph; - uint32_t *ippp; - - SCTP_BUF_LEN(oper) = sizeof(struct sctp_paramhdr) + - sizeof(uint32_t); - ph = mtod(oper, struct sctp_paramhdr *); - ph->param_type = htons(SCTP_CAUSE_PROTOCOL_VIOLATION); - ph->param_length = htons(SCTP_BUF_LEN(oper)); - ippp = (uint32_t *) (ph + 1); - *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_25); - } - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_PEER_FAULTY, oper, SCTP_SO_NOT_LOCKED); - return; -#endif - } - } - /**********************/ - /* 1) check the range */ - /**********************/ - if (compare_with_wrap(asoc->last_acked_seq, last_tsn, MAX_TSN)) { - /* acking something behind */ - return; - } - sav_cum_ack = asoc->last_acked_seq; - - /* update the Rwnd of the peer */ - if (TAILQ_EMPTY(&asoc->sent_queue) && - TAILQ_EMPTY(&asoc->send_queue) && - (asoc->stream_queue_cnt == 0) - ) { - /* nothing left on send/sent and strmq */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) { - sctp_log_rwnd_set(SCTP_SET_PEER_RWND_VIA_SACK, - asoc->peers_rwnd, 0, 0, a_rwnd); - } - asoc->peers_rwnd = a_rwnd; - if (asoc->sent_queue_retran_cnt) { - asoc->sent_queue_retran_cnt = 0; - } - if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) { - /* SWS sender side engages */ - asoc->peers_rwnd = 0; - } - /* stop any timers */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_26); - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck1); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_26); - } - } - net->partial_bytes_acked = 0; - net->flight_size = 0; - } - asoc->total_flight = 0; - asoc->total_flight_count = 0; - return; - } - /* - * We init netAckSz and netAckSz2 to 0. These are used to track 2 - * things. The total byte count acked is tracked in netAckSz AND - * netAck2 is used to track the total bytes acked that are un- - * amibguious and were never retransmitted. We track these on a per - * destination address basis. - */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - net->prev_cwnd = net->cwnd; - net->net_ack = 0; - net->net_ack2 = 0; - - /* - * CMT: Reset CUC and Fast recovery algo variables before - * SACK processing - */ - net->new_pseudo_cumack = 0; - net->will_exit_fast_recovery = 0; - } - /* process the new consecutive TSN first */ - tp1 = TAILQ_FIRST(&asoc->sent_queue); - while (tp1) { - if (compare_with_wrap(last_tsn, tp1->rec.data.TSN_seq, - MAX_TSN) || - last_tsn == tp1->rec.data.TSN_seq) { - if (tp1->sent != SCTP_DATAGRAM_UNSENT) { - /* - * ECN Nonce: Add the nonce to the sender's - * nonce sum - */ - asoc->nonce_sum_expect_base += tp1->rec.data.ect_nonce; - accum_moved = 1; - if (tp1->sent < SCTP_DATAGRAM_ACKED) { - /* - * If it is less than ACKED, it is - * now no-longer in flight. Higher - * values may occur during marking - */ - if ((tp1->whoTo->dest_state & - SCTP_ADDR_UNCONFIRMED) && - (tp1->snd_count < 2)) { - /* - * If there was no retran - * and the address is - * un-confirmed and we sent - * there and are now - * sacked.. its confirmed, - * mark it so. - */ - tp1->whoTo->dest_state &= - ~SCTP_ADDR_UNCONFIRMED; - } - if (tp1->sent < SCTP_DATAGRAM_RESEND) { - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) { - sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_CA, - tp1->whoTo->flight_size, - tp1->book_size, - (uintptr_t) tp1->whoTo, - tp1->rec.data.TSN_seq); - } - sctp_flight_size_decrease(tp1); - sctp_total_flight_decrease(stcb, tp1); - } - tp1->whoTo->net_ack += tp1->send_size; - - /* CMT SFR and DAC algos */ - this_sack_lowest_newack = tp1->rec.data.TSN_seq; - tp1->whoTo->saw_newack = 1; - - if (tp1->snd_count < 2) { - /* - * True non-retransmited - * chunk - */ - tp1->whoTo->net_ack2 += - tp1->send_size; - - /* update RTO too? */ - if (tp1->do_rtt) { - tp1->whoTo->RTO = - sctp_calculate_rto(stcb, - asoc, tp1->whoTo, - &tp1->sent_rcv_time, - sctp_align_safe_nocopy); - tp1->do_rtt = 0; - } - } - /* - * CMT: CUCv2 algorithm. From the - * cumack'd TSNs, for each TSN being - * acked for the first time, set the - * following variables for the - * corresp destination. - * new_pseudo_cumack will trigger a - * cwnd update. - * find_(rtx_)pseudo_cumack will - * trigger search for the next - * expected (rtx-)pseudo-cumack. - */ - tp1->whoTo->new_pseudo_cumack = 1; - tp1->whoTo->find_pseudo_cumack = 1; - tp1->whoTo->find_rtx_pseudo_cumack = 1; - - - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) { - sctp_log_sack(asoc->last_acked_seq, - cum_ack, - tp1->rec.data.TSN_seq, - 0, - 0, - SCTP_LOG_TSN_ACKED); - } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { - sctp_log_cwnd(stcb, tp1->whoTo, tp1->rec.data.TSN_seq, SCTP_CWND_LOG_FROM_SACK); - } - } - if (tp1->sent == SCTP_DATAGRAM_RESEND) { - sctp_ucount_decr(asoc->sent_queue_retran_cnt); -#ifdef SCTP_AUDITING_ENABLED - sctp_audit_log(0xB3, - (asoc->sent_queue_retran_cnt & 0x000000ff)); -#endif - } - if (tp1->rec.data.chunk_was_revoked) { - /* deflate the cwnd */ - tp1->whoTo->cwnd -= tp1->book_size; - tp1->rec.data.chunk_was_revoked = 0; - } - tp1->sent = SCTP_DATAGRAM_ACKED; - } - } else { - break; - } - tp1 = TAILQ_NEXT(tp1, sctp_next); - } - biggest_tsn_newly_acked = biggest_tsn_acked = last_tsn; - /* always set this up to cum-ack */ - asoc->this_sack_highest_gap = last_tsn; - - /* Move offset up to point to gaps/dups */ - offset += sizeof(struct sctp_nr_sack_chunk); - if (((num_seg * (sizeof(struct sctp_gap_ack_block))) + sizeof(struct sctp_nr_sack_chunk)) > nr_sack_length) { - - /* skip corrupt segments */ - goto skip_segments; - } - if (num_seg > 0) { - - /* - * CMT: SFR algo (and HTNA) - this_sack_highest_newack has - * to be greater than the cumack. Also reset saw_newack to 0 - * for all dests. - */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - net->saw_newack = 0; - net->this_sack_highest_newack = last_tsn; - } - - /* - * thisSackHighestGap will increase while handling NEW - * segments this_sack_highest_newack will increase while - * handling NEWLY ACKED chunks. this_sack_lowest_newack is - * used for CMT DAC algo. saw_newack will also change. - */ - - sctp_handle_nr_sack_segments(m, &offset, stcb, asoc, ch, last_tsn, - &biggest_tsn_acked, &biggest_tsn_newly_acked, &this_sack_lowest_newack, - num_seg, num_nr_seg, &ecn_seg_sums); - - - if (SCTP_BASE_SYSCTL(sctp_strict_sacks)) { - /* - * validate the biggest_tsn_acked in the gap acks if - * strict adherence is wanted. - */ - if ((biggest_tsn_acked == send_s) || - (compare_with_wrap(biggest_tsn_acked, send_s, MAX_TSN))) { - /* - * peer is either confused or we are under - * attack. We must abort. - */ - goto hopeless_peer; - } - } - } -skip_segments: - /*******************************************/ - /* cancel ALL T3-send timer if accum moved */ - /*******************************************/ - if (SCTP_BASE_SYSCTL(sctp_cmt_on_off)) { - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - if (net->new_pseudo_cumack) - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_27); - - } - } else { - if (accum_moved) { - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_28); - } - } - } - /********************************************/ - /* drop the acked chunks from the sendqueue */ - /********************************************/ - asoc->last_acked_seq = cum_ack; - - tp1 = TAILQ_FIRST(&asoc->sent_queue); - if (tp1 == NULL) - goto done_with_it; - do { - if (compare_with_wrap(tp1->rec.data.TSN_seq, cum_ack, - MAX_TSN)) { - break; - } - if (tp1->sent == SCTP_DATAGRAM_UNSENT) { - /* no more sent on list */ - printf("Warning, tp1->sent == %d and its now acked?\n", - tp1->sent); - } - tp2 = TAILQ_NEXT(tp1, sctp_next); - TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next); - if (tp1->pr_sctp_on) { - if (asoc->pr_sctp_cnt != 0) - asoc->pr_sctp_cnt--; - } - if ((TAILQ_FIRST(&asoc->sent_queue) == NULL) && - (asoc->total_flight > 0)) { -#ifdef INVARIANTS - panic("Warning flight size is postive and should be 0"); -#else - SCTP_PRINTF("Warning flight size incorrect should be 0 is %d\n", - asoc->total_flight); -#endif - asoc->total_flight = 0; - } - if (tp1->data) { - /* sa_ignore NO_NULL_CHK */ - sctp_free_bufspace(stcb, asoc, tp1, 1); - sctp_m_freem(tp1->data); - if (asoc->peer_supports_prsctp && PR_SCTP_BUF_ENABLED(tp1->flags)) { - asoc->sent_queue_cnt_removeable--; - } - } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) { - sctp_log_sack(asoc->last_acked_seq, - cum_ack, - tp1->rec.data.TSN_seq, - 0, - 0, - SCTP_LOG_FREE_SENT); - } - tp1->data = NULL; - asoc->sent_queue_cnt--; - sctp_free_a_chunk(stcb, tp1); - wake_him++; - tp1 = tp2; - } while (tp1 != NULL); - -done_with_it: - /* sa_ignore NO_NULL_CHK */ - if ((wake_him) && (stcb->sctp_socket)) { -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - struct socket *so; - -#endif - SOCKBUF_LOCK(&stcb->sctp_socket->so_snd); - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) { - sctp_wakeup_log(stcb, cum_ack, wake_him, SCTP_WAKESND_FROM_SACK); - } -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - so = SCTP_INP_SO(stcb->sctp_ep); - atomic_add_int(&stcb->asoc.refcnt, 1); - SCTP_TCB_UNLOCK(stcb); - SCTP_SOCKET_LOCK(so, 1); - SCTP_TCB_LOCK(stcb); - atomic_subtract_int(&stcb->asoc.refcnt, 1); - if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { - /* assoc was freed while we were unlocked */ - SCTP_SOCKET_UNLOCK(so, 1); - return; - } -#endif - sctp_sowwakeup_locked(stcb->sctp_ep, stcb->sctp_socket); -#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING) - SCTP_SOCKET_UNLOCK(so, 1); -#endif - } else { - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) { - sctp_wakeup_log(stcb, cum_ack, wake_him, SCTP_NOWAKE_FROM_SACK); - } - } - - if (asoc->fast_retran_loss_recovery && accum_moved) { - if (compare_with_wrap(asoc->last_acked_seq, - asoc->fast_recovery_tsn, MAX_TSN) || - asoc->last_acked_seq == asoc->fast_recovery_tsn) { - /* Setup so we will exit RFC2582 fast recovery */ - will_exit_fast_recovery = 1; - } - } - /* - * Check for revoked fragments: - * - * if Previous sack - Had no frags then we can't have any revoked if - * Previous sack - Had frag's then - If we now have frags aka - * num_seg > 0 call sctp_check_for_revoked() to tell if peer revoked - * some of them. else - The peer revoked all ACKED fragments, since - * we had some before and now we have NONE. - */ - - if (num_seg) - sctp_check_for_revoked(stcb, asoc, cum_ack, biggest_tsn_acked); - - else if (asoc->saw_sack_with_frags) { - int cnt_revoked = 0; - - tp1 = TAILQ_FIRST(&asoc->sent_queue); - if (tp1 != NULL) { - /* Peer revoked all dg's marked or acked */ - TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) { - /* - * EY- maybe check only if it is nr_acked - * nr_marked may not be possible - */ - if ((tp1->sent == SCTP_DATAGRAM_NR_ACKED) || - (tp1->sent == SCTP_DATAGRAM_NR_MARKED)) { - /* - * EY! - TODO: Something previously - * nr_gapped is reneged, abort the - * association - */ - return; - } - if ((tp1->sent > SCTP_DATAGRAM_RESEND) && - (tp1->sent < SCTP_FORWARD_TSN_SKIP)) { - tp1->sent = SCTP_DATAGRAM_SENT; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) { - sctp_misc_ints(SCTP_FLIGHT_LOG_UP_REVOKE, - tp1->whoTo->flight_size, - tp1->book_size, - (uintptr_t) tp1->whoTo, - tp1->rec.data.TSN_seq); - } - sctp_flight_size_increase(tp1); - sctp_total_flight_increase(stcb, tp1); - tp1->rec.data.chunk_was_revoked = 1; - /* - * To ensure that this increase in - * flightsize, which is artificial, - * does not throttle the sender, we - * also increase the cwnd - * artificially. - */ - tp1->whoTo->cwnd += tp1->book_size; - cnt_revoked++; - } - } - if (cnt_revoked) { - reneged_all = 1; - } - } - asoc->saw_sack_with_frags = 0; - } - if (num_seg) - asoc->saw_sack_with_frags = 1; - else - asoc->saw_sack_with_frags = 0; - - /* EY! - not sure about if there should be an IF */ - if (num_nr_seg) - sctp_check_for_nr_revoked(stcb, asoc, cum_ack, biggest_tsn_acked); - else if (asoc->saw_sack_with_nr_frags) { - /* - * EY!- TODO: all previously nr_gapped chunks have been - * reneged abort the association - */ - asoc->saw_sack_with_nr_frags = 0; - } - if (num_nr_seg) - asoc->saw_sack_with_nr_frags = 1; - else - asoc->saw_sack_with_nr_frags = 0; - /* JRS - Use the congestion control given in the CC module */ - asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, accum_moved, reneged_all, will_exit_fast_recovery); - - if (TAILQ_EMPTY(&asoc->sent_queue)) { - /* nothing left in-flight */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - /* stop all timers */ - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck4); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_29); - } - } - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_30); - net->flight_size = 0; - net->partial_bytes_acked = 0; - } - asoc->total_flight = 0; - asoc->total_flight_count = 0; - } - /**********************************/ - /* Now what about shutdown issues */ - /**********************************/ - if (TAILQ_EMPTY(&asoc->send_queue) && TAILQ_EMPTY(&asoc->sent_queue)) { - /* nothing left on sendqueue.. consider done */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) { - sctp_log_rwnd_set(SCTP_SET_PEER_RWND_VIA_SACK, - asoc->peers_rwnd, 0, 0, a_rwnd); - } - asoc->peers_rwnd = a_rwnd; - if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) { - /* SWS sender side engages */ - asoc->peers_rwnd = 0; - } - /* clean up */ - if ((asoc->stream_queue_cnt == 1) && - ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) || - (asoc->state & SCTP_STATE_SHUTDOWN_RECEIVED)) && - (asoc->locked_on_sending) - ) { - struct sctp_stream_queue_pending *sp; - - /* - * I may be in a state where we got all across.. but - * cannot write more due to a shutdown... we abort - * since the user did not indicate EOR in this case. - */ - sp = TAILQ_LAST(&((asoc->locked_on_sending)->outqueue), - sctp_streamhead); - if ((sp) && (sp->length == 0)) { - asoc->locked_on_sending = NULL; - if (sp->msg_is_complete) { - asoc->stream_queue_cnt--; - } else { - asoc->state |= SCTP_STATE_PARTIAL_MSG_LEFT; - asoc->stream_queue_cnt--; - } - } - } - if ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) && - (asoc->stream_queue_cnt == 0)) { - if (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT) { - /* Need to abort here */ - struct mbuf *oper; - - abort_out_now: - *abort_now = 1; - /* XXX */ - oper = sctp_get_mbuf_for_msg((sizeof(struct sctp_paramhdr) + sizeof(uint32_t)), - 0, M_DONTWAIT, 1, MT_DATA); - if (oper) { - struct sctp_paramhdr *ph; - uint32_t *ippp; - - SCTP_BUF_LEN(oper) = sizeof(struct sctp_paramhdr) + - sizeof(uint32_t); - ph = mtod(oper, struct sctp_paramhdr *); - ph->param_type = htons(SCTP_CAUSE_USER_INITIATED_ABT); - ph->param_length = htons(SCTP_BUF_LEN(oper)); - ippp = (uint32_t *) (ph + 1); - *ippp = htonl(SCTP_FROM_SCTP_INDATA + SCTP_LOC_31); - } - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_31; - sctp_abort_an_association(stcb->sctp_ep, stcb, SCTP_RESPONSE_TO_USER_REQ, oper, SCTP_SO_NOT_LOCKED); - return; - } else { - if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || - (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { - SCTP_STAT_DECR_GAUGE32(sctps_currestab); - } - SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); - SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); - sctp_stop_timers_for_shutdown(stcb); - sctp_send_shutdown(stcb, - stcb->asoc.primary_destination); - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, - stcb->sctp_ep, stcb, asoc->primary_destination); - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, - stcb->sctp_ep, stcb, asoc->primary_destination); - } - return; - } else if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) && - (asoc->stream_queue_cnt == 0)) { - if (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT) { - goto abort_out_now; - } - SCTP_STAT_DECR_GAUGE32(sctps_currestab); - SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_ACK_SENT); - SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); - sctp_send_shutdown_ack(stcb, - stcb->asoc.primary_destination); - - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNACK, - stcb->sctp_ep, stcb, asoc->primary_destination); - return; - } - } - /* - * Now here we are going to recycle net_ack for a different use... - * HEADS UP. - */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - net->net_ack = 0; - } - - /* - * CMT DAC algorithm: If SACK DAC flag was 0, then no extra marking - * to be done. Setting this_sack_lowest_newack to the cum_ack will - * automatically ensure that. - */ - if (SCTP_BASE_SYSCTL(sctp_cmt_on_off) && SCTP_BASE_SYSCTL(sctp_cmt_use_dac) && (cmt_dac_flag == 0)) { - this_sack_lowest_newack = cum_ack; - } - if (num_seg > 0) { - sctp_strike_gap_ack_chunks(stcb, asoc, biggest_tsn_acked, - biggest_tsn_newly_acked, this_sack_lowest_newack, accum_moved); - } - /* JRS - Use the congestion control given in the CC module */ - asoc->cc_functions.sctp_cwnd_update_after_fr(stcb, asoc); - - /****************************************************************** - * Here we do the stuff with ECN Nonce checking. - * We basically check to see if the nonce sum flag was incorrect - * or if resynchronization needs to be done. Also if we catch a - * misbehaving receiver we give him the kick. - ******************************************************************/ - - if (asoc->ecn_nonce_allowed) { - if (asoc->nonce_sum_check) { - if (nonce_sum_flag != ((asoc->nonce_sum_expect_base + ecn_seg_sums) & SCTP_SACK_NONCE_SUM)) { - if (asoc->nonce_wait_for_ecne == 0) { - struct sctp_tmit_chunk *lchk; - - lchk = TAILQ_FIRST(&asoc->send_queue); - asoc->nonce_wait_for_ecne = 1; - if (lchk) { - asoc->nonce_wait_tsn = lchk->rec.data.TSN_seq; - } else { - asoc->nonce_wait_tsn = asoc->sending_seq; - } - } else { - if (compare_with_wrap(asoc->last_acked_seq, asoc->nonce_wait_tsn, MAX_TSN) || - (asoc->last_acked_seq == asoc->nonce_wait_tsn)) { - /* - * Misbehaving peer. We need - * to react to this guy - */ - asoc->ecn_allowed = 0; - asoc->ecn_nonce_allowed = 0; - } - } - } - } else { - /* See if Resynchronization Possible */ - if (compare_with_wrap(asoc->last_acked_seq, asoc->nonce_resync_tsn, MAX_TSN)) { - asoc->nonce_sum_check = 1; - /* - * now we must calculate what the base is. - * We do this based on two things, we know - * the total's for all the segments - * gap-acked in the SACK, its stored in - * ecn_seg_sums. We also know the SACK's - * nonce sum, its in nonce_sum_flag. So we - * can build a truth table to back-calculate - * the new value of - * asoc->nonce_sum_expect_base: - * - * SACK-flag-Value Seg-Sums Base 0 0 0 - * 1 0 1 0 1 1 1 1 0 - */ - asoc->nonce_sum_expect_base = (ecn_seg_sums ^ nonce_sum_flag) & SCTP_SACK_NONCE_SUM; - } - } - } - /* Now are we exiting loss recovery ? */ - if (will_exit_fast_recovery) { - /* Ok, we must exit fast recovery */ - asoc->fast_retran_loss_recovery = 0; - } - if ((asoc->sat_t3_loss_recovery) && - ((compare_with_wrap(asoc->last_acked_seq, asoc->sat_t3_recovery_tsn, - MAX_TSN) || - (asoc->last_acked_seq == asoc->sat_t3_recovery_tsn)))) { - /* end satellite t3 loss recovery */ - asoc->sat_t3_loss_recovery = 0; - } - /* - * CMT Fast recovery - */ - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - if (net->will_exit_fast_recovery) { - /* Ok, we must exit fast recovery */ - net->fast_retran_loss_recovery = 0; - } - } - - /* Adjust and set the new rwnd value */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) { - sctp_log_rwnd_set(SCTP_SET_PEER_RWND_VIA_SACK, - asoc->peers_rwnd, asoc->total_flight, (asoc->sent_queue_cnt * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh)), a_rwnd); - } - asoc->peers_rwnd = sctp_sbspace_sub(a_rwnd, - (uint32_t) (asoc->total_flight + (asoc->sent_queue_cnt * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh)))); - if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) { - /* SWS sender side engages */ - asoc->peers_rwnd = 0; - } - if (asoc->peers_rwnd > old_rwnd) { - win_probe_recovery = 1; - } - /* - * Now we must setup so we have a timer up for anyone with - * outstanding data. - */ - done_once = 0; -again: - j = 0; - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - if (win_probe_recovery && (net->window_probe)) { - win_probe_recovered = 1; - /*- - * Find first chunk that was used with - * window probe and clear the event. Put - * it back into the send queue as if has - * not been sent. - */ - TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) { - if (tp1->window_probe) { - sctp_window_probe_recovery(stcb, asoc, net, tp1); - break; - } - } - } - if (net->flight_size) { - j++; - sctp_timer_start(SCTP_TIMER_TYPE_SEND, - stcb->sctp_ep, stcb, net); - if (net->window_probe) { - net->window_probe = 0; - } - } else { - if (net->window_probe) { - net->window_probe = 0; - sctp_timer_start(SCTP_TIMER_TYPE_SEND, - stcb->sctp_ep, stcb, net); - } else if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { - sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_22); - } - if (SCTP_BASE_SYSCTL(sctp_early_fr)) { - if (SCTP_OS_TIMER_PENDING(&net->fr_timer.timer)) { - SCTP_STAT_INCR(sctps_earlyfrstpidsck4); - sctp_timer_stop(SCTP_TIMER_TYPE_EARLYFR, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_23); - } - } - } - } - if ((j == 0) && - (!TAILQ_EMPTY(&asoc->sent_queue)) && - (asoc->sent_queue_retran_cnt == 0) && - (win_probe_recovered == 0) && - (done_once == 0)) { - /* - * huh, this should not happen unless all packets are - * PR-SCTP and marked to skip of course. - */ - if (sctp_fs_audit(asoc)) { - TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - net->flight_size = 0; - } - asoc->total_flight = 0; - asoc->total_flight_count = 0; - asoc->sent_queue_retran_cnt = 0; - TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) { - if (tp1->sent < SCTP_DATAGRAM_RESEND) { - sctp_flight_size_increase(tp1); - sctp_total_flight_increase(stcb, tp1); - } else if (tp1->sent == SCTP_DATAGRAM_RESEND) { - asoc->sent_queue_retran_cnt++; - } - } - } - done_once = 1; - goto again; - } - /*********************************************/ - /* Here we perform PR-SCTP procedures */ - /* (section 4.2) */ - /*********************************************/ - /* C1. update advancedPeerAckPoint */ - if (compare_with_wrap(cum_ack, asoc->advanced_peer_ack_point, MAX_TSN)) { - asoc->advanced_peer_ack_point = cum_ack; - } - /* C2. try to further move advancedPeerAckPoint ahead */ - if ((asoc->peer_supports_prsctp) && (asoc->pr_sctp_cnt > 0)) { - struct sctp_tmit_chunk *lchk; - uint32_t old_adv_peer_ack_point; - - old_adv_peer_ack_point = asoc->advanced_peer_ack_point; - lchk = sctp_try_advance_peer_ack_point(stcb, asoc); - /* C3. See if we need to send a Fwd-TSN */ - if (compare_with_wrap(asoc->advanced_peer_ack_point, cum_ack, - MAX_TSN)) { - /* - * ISSUE with ECN, see FWD-TSN processing for notes - * on issues that will occur when the ECN NONCE - * stuff is put into SCTP for cross checking. - */ - if (compare_with_wrap(asoc->advanced_peer_ack_point, old_adv_peer_ack_point, - MAX_TSN)) { - send_forward_tsn(stcb, asoc); - /* - * ECN Nonce: Disable Nonce Sum check when - * FWD TSN is sent and store resync tsn - */ - asoc->nonce_sum_check = 0; - asoc->nonce_resync_tsn = asoc->advanced_peer_ack_point; - } else if (lchk) { - /* try to FR fwd-tsn's that get lost too */ - lchk->rec.data.fwd_tsn_cnt++; - if (lchk->rec.data.fwd_tsn_cnt > 3) { - send_forward_tsn(stcb, asoc); - lchk->rec.data.fwd_tsn_cnt = 0; - } - } - } - if (lchk) { - /* Assure a timer is up */ - sctp_timer_start(SCTP_TIMER_TYPE_SEND, - stcb->sctp_ep, stcb, lchk->whoTo); - } - } - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_RWND_LOGGING_ENABLE) { - sctp_misc_ints(SCTP_SACK_RWND_UPDATE, - a_rwnd, - stcb->asoc.peers_rwnd, - stcb->asoc.total_flight, - stcb->asoc.total_output_queue_size); - } -} diff --git a/sys/netinet/sctp_indata.h b/sys/netinet/sctp_indata.h index 76fa9467f7d4..b6a8323a5d5a 100644 --- a/sys/netinet/sctp_indata.h +++ b/sys/netinet/sctp_indata.h @@ -96,18 +96,11 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, uint32_t rwnd, int nonce_sum_flag, int *abort_now); void -sctp_handle_sack(struct mbuf *m, int offset, struct sctp_sack_chunk *, struct sctp_tcb *, - struct sctp_nets *, int *, int, uint32_t); - -/* EY does "exactly" the same as sctp_express_handle_sack */ -void -sctp_express_handle_nr_sack(struct sctp_tcb *stcb, uint32_t cumack, - uint32_t rwnd, int nonce_sum_flag, int *abort_now); - -/* EY nr_sack version of sctp_handle_sack */ -void -sctp_handle_nr_sack(struct mbuf *m, int offset, struct sctp_nr_sack_chunk *, struct sctp_tcb *, - struct sctp_nets *, int *, int, uint32_t); +sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, + struct sctp_tcb *stcb, struct sctp_nets *net_from, + uint16_t num_seg, uint16_t num_nr_seg, uint16_t num_dup, + int *abort_now, uint8_t flags, + uint32_t cum_ack, uint32_t rwnd); /* draft-ietf-tsvwg-usctp */ void diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index e59e78858fcf..ef187377b954 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -834,6 +834,9 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, return; } else { sctp_update_acked(stcb, cp, net, abort_flag); + if (*abort_flag) { + return; + } } if (asoc->control_pdapi) { /* @@ -915,7 +918,8 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, static void sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp, - struct sctp_tcb *stcb, struct sctp_nets *net) + struct sctp_tcb *stcb, + struct sctp_nets *net) { struct sctp_association *asoc; @@ -931,6 +935,13 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp, asoc = &stcb->asoc; /* process according to association state */ + if ((SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_WAIT) || + (SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_ECHOED)) { + /* unexpected SHUTDOWN-ACK... do OOTB handling... */ + sctp_send_shutdown_complete(stcb, net, 1); + SCTP_TCB_UNLOCK(stcb); + return; + } if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { /* unexpected SHUTDOWN-ACK... so ignore... */ @@ -972,7 +983,7 @@ sctp_handle_shutdown_ack(struct sctp_shutdown_ack_chunk *cp, /* stop the timer */ sctp_timer_stop(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, net, SCTP_FROM_SCTP_INPUT + SCTP_LOC_9); /* send SHUTDOWN-COMPLETE */ - sctp_send_shutdown_complete(stcb, net); + sctp_send_shutdown_complete(stcb, net, 0); /* notify upper layer protocol */ if (stcb->sctp_socket) { sctp_ulp_notify(SCTP_NOTIFY_ASSOC_DOWN, stcb, 0, NULL, SCTP_SO_NOT_LOCKED); @@ -4596,16 +4607,18 @@ process_control_chunks: struct sctp_sack_chunk *sack; int abort_now = 0; uint32_t a_rwnd, cum_ack; - uint16_t num_seg; + uint16_t num_seg, num_dup; + uint8_t flags; + int offset_seg, offset_dup; int nonce_sum_flag; - if ((stcb == NULL) || (chk_length < sizeof(struct sctp_sack_chunk))) { - SCTPDBG(SCTP_DEBUG_INDATA1, "Bad size on sack chunk, too small\n"); - *offset = length; - if (locked_tcb) { - SCTP_TCB_UNLOCK(locked_tcb); - } - return (NULL); + if (stcb == NULL) { + SCTPDBG(SCTP_DEBUG_INDATA1, "No stcb when processing SACK chunk\n"); + break; + } + if (chk_length < sizeof(struct sctp_sack_chunk)) { + SCTPDBG(SCTP_DEBUG_INDATA1, "Bad size on SACK chunk, too small\n"); + break; } if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_ACK_SENT) { /*- @@ -4616,15 +4629,22 @@ process_control_chunks: break; } sack = (struct sctp_sack_chunk *)ch; - nonce_sum_flag = ch->chunk_flags & SCTP_SACK_NONCE_SUM; + flags = ch->chunk_flags; + nonce_sum_flag = flags & SCTP_SACK_NONCE_SUM; cum_ack = ntohl(sack->sack.cum_tsn_ack); num_seg = ntohs(sack->sack.num_gap_ack_blks); + num_dup = ntohs(sack->sack.num_dup_tsns); a_rwnd = (uint32_t) ntohl(sack->sack.a_rwnd); + if (sizeof(struct sctp_sack_chunk) + + num_seg * sizeof(struct sctp_gap_ack_block) + + num_dup * sizeof(uint32_t) != chk_length) { + SCTPDBG(SCTP_DEBUG_INDATA1, "Bad size of SACK chunk\n"); + break; + } + offset_seg = *offset + sizeof(struct sctp_sack_chunk); + offset_dup = offset_seg + num_seg * sizeof(struct sctp_gap_ack_block); SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_SACK process cum_ack:%x num_seg:%d a_rwnd:%d\n", - cum_ack, - num_seg, - a_rwnd - ); + cum_ack, num_seg, a_rwnd); stcb->asoc.seen_a_sack_this_pkt = 1; if ((stcb->asoc.pr_sctp_cnt == 0) && (num_seg == 0) && @@ -4646,19 +4666,21 @@ process_control_chunks: &abort_now); } else { if (netp && *netp) - sctp_handle_sack(m, *offset, - sack, stcb, *netp, &abort_now, chk_length, a_rwnd); - } - if (TAILQ_EMPTY(&stcb->asoc.send_queue) && - TAILQ_EMPTY(&stcb->asoc.sent_queue) && - (stcb->asoc.stream_queue_cnt == 0)) { - sctp_ulp_notify(SCTP_NOTIFY_SENDER_DRY, stcb, 0, NULL, SCTP_SO_NOT_LOCKED); + sctp_handle_sack(m, offset_seg, offset_dup, + stcb, *netp, + num_seg, 0, num_dup, &abort_now, flags, + cum_ack, a_rwnd); } if (abort_now) { /* ABORT signal from sack processing */ *offset = length; return (NULL); } + if (TAILQ_EMPTY(&stcb->asoc.send_queue) && + TAILQ_EMPTY(&stcb->asoc.sent_queue) && + (stcb->asoc.stream_queue_cnt == 0)) { + sctp_ulp_notify(SCTP_NOTIFY_SENDER_DRY, stcb, 0, NULL, SCTP_SO_NOT_LOCKED); + } } break; /* @@ -4672,80 +4694,90 @@ process_control_chunks: struct sctp_nr_sack_chunk *nr_sack; int abort_now = 0; uint32_t a_rwnd, cum_ack; - uint16_t num_seg, num_nr_seg; + uint16_t num_seg, num_nr_seg, num_dup; + uint8_t flags; + int offset_seg, offset_dup; int nonce_sum_flag; - if ((stcb == NULL) || (chk_length < sizeof(struct sctp_nr_sack_chunk))) { - SCTPDBG(SCTP_DEBUG_INDATA1, "Bad size on nr_sack chunk, too small\n"); - ignore_nr_sack: - *offset = length; - if (locked_tcb) { - SCTP_TCB_UNLOCK(locked_tcb); - } - return (NULL); - } /* * EY nr_sacks have not been negotiated but * the peer end sent an nr_sack, silently * discard the chunk */ - if (!(SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && stcb->asoc.peer_supports_nr_sack)) { + if (!(SCTP_BASE_SYSCTL(sctp_nr_sack_on_off) && + stcb->asoc.peer_supports_nr_sack)) { goto unknown_chunk; } + if (stcb == NULL) { + SCTPDBG(SCTP_DEBUG_INDATA1, "No stcb when processing NR-SACK chunk\n"); + break; + } + if (chk_length < sizeof(struct sctp_nr_sack_chunk)) { + SCTPDBG(SCTP_DEBUG_INDATA1, "Bad size on NR-SACK chunk, too small\n"); + break; + } if (SCTP_GET_STATE(&stcb->asoc) == SCTP_STATE_SHUTDOWN_ACK_SENT) { /*- * If we have sent a shutdown-ack, we will pay no * attention to a sack sent in to us since * we don't care anymore. */ - goto ignore_nr_sack; + break; } nr_sack = (struct sctp_nr_sack_chunk *)ch; - nonce_sum_flag = ch->chunk_flags & SCTP_SACK_NONCE_SUM; + flags = ch->chunk_flags; + nonce_sum_flag = flags & SCTP_SACK_NONCE_SUM; cum_ack = ntohl(nr_sack->nr_sack.cum_tsn_ack); num_seg = ntohs(nr_sack->nr_sack.num_gap_ack_blks); num_nr_seg = ntohs(nr_sack->nr_sack.num_nr_gap_ack_blks); + num_dup = ntohs(nr_sack->nr_sack.num_dup_tsns); a_rwnd = (uint32_t) ntohl(nr_sack->nr_sack.a_rwnd); + if (sizeof(struct sctp_nr_sack_chunk) + + (num_seg + num_nr_seg) * sizeof(struct sctp_gap_ack_block) + + num_dup * sizeof(uint32_t) != chk_length) { + SCTPDBG(SCTP_DEBUG_INDATA1, "Bad size of NR_SACK chunk\n"); + break; + } + offset_seg = *offset + sizeof(struct sctp_nr_sack_chunk); + offset_dup = offset_seg + num_seg * sizeof(struct sctp_gap_ack_block); SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_NR_SACK process cum_ack:%x num_seg:%d a_rwnd:%d\n", - cum_ack, - num_seg, - a_rwnd - ); + cum_ack, num_seg, a_rwnd); stcb->asoc.seen_a_sack_this_pkt = 1; if ((stcb->asoc.pr_sctp_cnt == 0) && - (num_seg == 0) && + (num_seg == 0) && (num_nr_seg == 0) && ((compare_with_wrap(cum_ack, stcb->asoc.last_acked_seq, MAX_TSN)) || (cum_ack == stcb->asoc.last_acked_seq)) && (stcb->asoc.saw_sack_with_frags == 0) && - (!TAILQ_EMPTY(&stcb->asoc.sent_queue)) - ) { + (!TAILQ_EMPTY(&stcb->asoc.sent_queue))) { /* * We have a SIMPLE sack having no * prior segments and data on sent - * queue to be acked.. Use the - * faster path sack processing. We - * also allow window update sacks - * with no missing segments to go - * this way too. + * queue to be acked. Use the faster + * path sack processing. We also + * allow window update sacks with no + * missing segments to go this way + * too. */ - sctp_express_handle_nr_sack(stcb, cum_ack, a_rwnd, nonce_sum_flag, + sctp_express_handle_sack(stcb, cum_ack, a_rwnd, nonce_sum_flag, &abort_now); } else { if (netp && *netp) - sctp_handle_nr_sack(m, *offset, - nr_sack, stcb, *netp, &abort_now, chk_length, a_rwnd); - } - if (TAILQ_EMPTY(&stcb->asoc.send_queue) && - TAILQ_EMPTY(&stcb->asoc.sent_queue) && - (stcb->asoc.stream_queue_cnt == 0)) { - sctp_ulp_notify(SCTP_NOTIFY_SENDER_DRY, stcb, 0, NULL, SCTP_SO_NOT_LOCKED); + sctp_handle_sack(m, offset_seg, offset_dup, + stcb, *netp, + num_seg, num_nr_seg, num_dup, &abort_now, flags, + cum_ack, a_rwnd); } if (abort_now) { /* ABORT signal from sack processing */ *offset = length; return (NULL); } + if (TAILQ_EMPTY(&stcb->asoc.send_queue) && + TAILQ_EMPTY(&stcb->asoc.sent_queue) && + (stcb->asoc.stream_queue_cnt == 0)) { + sctp_ulp_notify(SCTP_NOTIFY_SENDER_DRY, stcb, 0, NULL, SCTP_SO_NOT_LOCKED); + } } break; @@ -5782,6 +5814,7 @@ sctp_input_with_port(struct mbuf *i_pak, int off, uint16_t port) } sh->checksum = 0; /* prepare for calc */ calc_check = sctp_calculate_cksum(m, iphlen); + sh->checksum = check; SCTP_STAT_INCR(sctps_recvswcrc); if (calc_check != check) { SCTPDBG(SCTP_DEBUG_INPUT1, "Bad CSUM on SCTP packet calc_check:%x check:%x m:%p mlen:%d iphlen:%d\n", @@ -5807,7 +5840,6 @@ sctp_input_with_port(struct mbuf *i_pak, int off, uint16_t port) SCTP_STAT_INCR_COUNTER32(sctps_checksumerrors); goto bad; } - sh->checksum = calc_check; sctp_skip_csum_4: /* destination port of 0 is illegal, based on RFC2960. */ if (sh->dest_port == 0) { diff --git a/sys/netinet/sctp_os_bsd.h b/sys/netinet/sctp_os_bsd.h index f0cca72c76d3..cec568d52c6a 100644 --- a/sys/netinet/sctp_os_bsd.h +++ b/sys/netinet/sctp_os_bsd.h @@ -78,8 +78,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include - #ifdef IPSEC #include #include @@ -155,7 +153,6 @@ MALLOC_DECLARE(SCTP_M_SOCKOPT); * */ #define USER_ADDR_NULL (NULL) /* FIX ME: temp */ -#define SCTP_LIST_EMPTY(list) LIST_EMPTY(list) #if defined(SCTP_DEBUG) #define SCTPDBG(level, params...) \ @@ -257,10 +254,9 @@ MALLOC_DECLARE(SCTP_M_SOCKOPT); /* SCTP_ZONE_INIT: initialize the zone */ typedef struct uma_zone *sctp_zone_t; -#define UMA_ZFLAG_FULL 0x0020 #define SCTP_ZONE_INIT(zone, name, size, number) { \ zone = uma_zcreate(name, size, NULL, NULL, NULL, NULL, UMA_ALIGN_PTR,\ - UMA_ZFLAG_FULL); \ + 0); \ uma_zone_set_max(zone, number); \ } @@ -482,12 +478,6 @@ sctp_get_mbuf_for_msg(unsigned int space_needed, #include #endif -#include -/* map standard crypto API names */ -#define MD5_Init MD5Init -#define MD5_Update MD5Update -#define MD5_Final MD5Final - #endif #define SCTP_DECREMENT_AND_CHECK_REFCOUNT(addr) (atomic_fetchadd_int(addr, -1) == 1) diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index b9750b9d50e0..be4c3a8633fa 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -3490,11 +3490,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, tos_value = inp->ip_inp.inp.inp_ip_tos; } if ((nofragment_flag) && (port == 0)) { -#if defined(WITH_CONVERT_IP_OFF) || defined(__FreeBSD__) || defined(__APPLE__) || defined(__Userspace__) ip->ip_off = IP_DF; -#else - ip->ip_off = htons(IP_DF); -#endif } else ip->ip_off = 0; @@ -3570,7 +3566,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, sctp_free_ifa(_lsrc); } else { ip->ip_src = over_addr->sin.sin_addr; - SCTP_RTALLOC((&ro->ro_rt), vrf_id); + SCTP_RTALLOC(ro, vrf_id); } } if (port) { @@ -3924,7 +3920,7 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp, sctp_free_ifa(_lsrc); } else { lsa6->sin6_addr = over_addr->sin6.sin6_addr; - SCTP_RTALLOC((&ro->ro_rt), vrf_id); + SCTP_RTALLOC(ro, vrf_id); } (void)sa6_recoverscope(sin6); } @@ -4313,16 +4309,8 @@ sctp_send_initiate(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked if (stcb->asoc.authinfo.random != NULL) { randp = (struct sctp_auth_random *)(mtod(m, caddr_t)+SCTP_BUF_LEN(m)); p_len = sizeof(*randp) + stcb->asoc.authinfo.random_len; -#ifdef SCTP_AUTH_DRAFT_04 - randp->ph.param_type = htons(SCTP_RANDOM); - randp->ph.param_length = htons(p_len); - bcopy(stcb->asoc.authinfo.random->key, - randp->random_data, - stcb->asoc.authinfo.random_len); -#else /* random key already contains the header */ bcopy(stcb->asoc.authinfo.random->key, randp, p_len); -#endif /* zero out any padding required */ bzero((caddr_t)randp + p_len, SCTP_SIZE32(p_len) - p_len); SCTP_BUF_LEN(m) += SCTP_SIZE32(p_len); @@ -5602,37 +5590,13 @@ sctp_insert_on_wheel(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, int holds_lock) { - struct sctp_stream_out *stre, *strn; - if (holds_lock == 0) { SCTP_TCB_SEND_LOCK(stcb); } - if ((strq->next_spoke.tqe_next) || - (strq->next_spoke.tqe_prev)) { - /* already on wheel */ - goto outof_here; + if ((strq->next_spoke.tqe_next == NULL) && + (strq->next_spoke.tqe_prev == NULL)) { + TAILQ_INSERT_TAIL(&asoc->out_wheel, strq, next_spoke); } - stre = TAILQ_FIRST(&asoc->out_wheel); - if (stre == NULL) { - /* only one on wheel */ - TAILQ_INSERT_HEAD(&asoc->out_wheel, strq, next_spoke); - goto outof_here; - } - for (; stre; stre = strn) { - strn = TAILQ_NEXT(stre, next_spoke); - if (stre->stream_no > strq->stream_no) { - TAILQ_INSERT_BEFORE(stre, strq, next_spoke); - goto outof_here; - } else if (stre->stream_no == strq->stream_no) { - /* huh, should not happen */ - goto outof_here; - } else if (strn == NULL) { - /* next one is null */ - TAILQ_INSERT_AFTER(&asoc->out_wheel, stre, strq, - next_spoke); - } - } -outof_here: if (holds_lock == 0) { SCTP_TCB_SEND_UNLOCK(stcb); } @@ -5645,19 +5609,26 @@ sctp_remove_from_wheel(struct sctp_tcb *stcb, int holds_lock) { /* take off and then setup so we know it is not on the wheel */ - if (holds_lock == 0) + if (holds_lock == 0) { SCTP_TCB_SEND_LOCK(stcb); - if (TAILQ_FIRST(&strq->outqueue)) { - /* more was added */ - if (holds_lock == 0) - SCTP_TCB_SEND_UNLOCK(stcb); - return; } - TAILQ_REMOVE(&asoc->out_wheel, strq, next_spoke); - strq->next_spoke.tqe_next = NULL; - strq->next_spoke.tqe_prev = NULL; - if (holds_lock == 0) + if (TAILQ_EMPTY(&strq->outqueue)) { + if (asoc->last_out_stream == strq) { + asoc->last_out_stream = TAILQ_PREV(asoc->last_out_stream, sctpwheel_listhead, next_spoke); + if (asoc->last_out_stream == NULL) { + asoc->last_out_stream = TAILQ_LAST(&asoc->out_wheel, sctpwheel_listhead); + } + if (asoc->last_out_stream == strq) { + asoc->last_out_stream = NULL; + } + } + TAILQ_REMOVE(&asoc->out_wheel, strq, next_spoke); + strq->next_spoke.tqe_next = NULL; + strq->next_spoke.tqe_prev = NULL; + } + if (holds_lock == 0) { SCTP_TCB_SEND_UNLOCK(stcb); + } } static void @@ -5892,10 +5863,8 @@ sctp_msg_append(struct sctp_tcb *stcb, sp->strseq = 0; if (sp->sinfo_flags & SCTP_ADDR_OVER) { sp->net = net; - sp->addr_over = 1; } else { sp->net = stcb->asoc.primary_destination; - sp->addr_over = 0; } atomic_add_int(&sp->net->ref_count, 1); (void)SCTP_GETTIME_TIMEVAL(&sp->ts); @@ -7069,7 +7038,6 @@ dont_do_it: chk->rec.data.timetodrop = sp->ts; chk->flags = sp->act_flags; - chk->addr_over = sp->addr_over; chk->whoTo = net; atomic_add_int(&chk->whoTo->ref_count, 1); @@ -7190,22 +7158,14 @@ sctp_select_a_stream(struct sctp_tcb *stcb, struct sctp_association *asoc) /* Find the next stream to use */ if (asoc->last_out_stream == NULL) { - strq = asoc->last_out_stream = TAILQ_FIRST(&asoc->out_wheel); - if (asoc->last_out_stream == NULL) { - /* huh nothing on the wheel, TSNH */ - return (NULL); + strq = TAILQ_FIRST(&asoc->out_wheel); + } else { + strq = TAILQ_NEXT(asoc->last_out_stream, next_spoke); + if (strq == NULL) { + strq = TAILQ_FIRST(&asoc->out_wheel); } - goto done_it; } - strq = TAILQ_NEXT(asoc->last_out_stream, next_spoke); -done_it: - if (strq == NULL) { - strq = asoc->last_out_stream = TAILQ_FIRST(&asoc->out_wheel); - } - /* Save off the last stream */ - asoc->last_out_stream = strq; return (strq); - } @@ -7214,7 +7174,7 @@ sctp_fill_outqueue(struct sctp_tcb *stcb, struct sctp_nets *net, int frag_point, int eeor_mode, int *quit_now) { struct sctp_association *asoc; - struct sctp_stream_out *strq, *strqn, *strqt; + struct sctp_stream_out *strq, *strqn; int goal_mtu, moved_how_much, total_moved = 0, bail = 0; int locked, giveup; struct sctp_stream_queue_pending *sp; @@ -7280,7 +7240,9 @@ sctp_fill_outqueue(struct sctp_tcb *stcb, bail = 0; moved_how_much = sctp_move_to_outqueue(stcb, net, strq, goal_mtu, frag_point, &locked, &giveup, eeor_mode, &bail); - asoc->last_out_stream = strq; + if (moved_how_much) + asoc->last_out_stream = strq; + if (locked) { asoc->locked_on_sending = strq; if ((moved_how_much == 0) || (giveup) || bail) @@ -7288,11 +7250,10 @@ sctp_fill_outqueue(struct sctp_tcb *stcb, break; } else { asoc->locked_on_sending = NULL; - strqt = sctp_select_a_stream(stcb, asoc); - if (TAILQ_FIRST(&strq->outqueue) == NULL) { + if (TAILQ_EMPTY(&strq->outqueue)) { if (strq == strqn) { /* Must move start to next one */ - strqn = TAILQ_NEXT(asoc->last_out_stream, next_spoke); + strqn = TAILQ_NEXT(strq, next_spoke); if (strqn == NULL) { strqn = TAILQ_FIRST(&asoc->out_wheel); if (strqn == NULL) { @@ -7305,7 +7266,7 @@ sctp_fill_outqueue(struct sctp_tcb *stcb, if ((giveup) || bail) { break; } - strq = strqt; + strq = sctp_select_a_stream(stcb, asoc); if (strq == NULL) { break; } @@ -9466,6 +9427,7 @@ sctp_chunk_output(struct sctp_inpcb *inp, if ((un_sent <= 0) && (TAILQ_EMPTY(&asoc->control_send_queue)) && + (TAILQ_EMPTY(&asoc->asconf_send_queue)) && (asoc->sent_queue_retran_cnt == 0)) { /* Nothing to do unless there is something to be sent left */ return; @@ -10210,7 +10172,6 @@ sctp_send_nr_sack(struct sctp_tcb *stcb) struct sctp_nr_sack_chunk *nr_sack; struct sctp_gap_ack_block *gap_descriptor; - struct sctp_nr_gap_ack_block *nr_gap_descriptor; struct sack_track *selector; struct sack_track *nr_selector; @@ -10471,8 +10432,6 @@ sctp_send_nr_sack(struct sctp_tcb *stcb) } /*---------------------------------------------------------filling the nr_gap_ack blocks----------------------------------------------------*/ - nr_gap_descriptor = (struct sctp_nr_gap_ack_block *)gap_descriptor; - /* EY - there will be gaps + nr_gaps if draining is possible */ if ((SCTP_BASE_SYSCTL(sctp_do_drain)) && (limit_reached == 0)) { @@ -10508,7 +10467,7 @@ sctp_send_nr_sack(struct sctp_tcb *stcb) * ok to merge. */ num_nr_gap_blocks--; - nr_gap_descriptor--; + gap_descriptor--; } if (nr_selector->num_entries == 0) mergeable = 0; @@ -10527,12 +10486,12 @@ sctp_send_nr_sack(struct sctp_tcb *stcb) * left side */ mergeable = 0; - nr_gap_descriptor->start = htons((nr_selector->gaps[j].start + offset)); + gap_descriptor->start = htons((nr_selector->gaps[j].start + offset)); } - nr_gap_descriptor->end = htons((nr_selector->gaps[j].end + offset)); + gap_descriptor->end = htons((nr_selector->gaps[j].end + offset)); num_nr_gap_blocks++; - nr_gap_descriptor++; - if (((caddr_t)nr_gap_descriptor + sizeof(struct sctp_nr_gap_ack_block)) > limit) { + gap_descriptor++; + if (((caddr_t)gap_descriptor + sizeof(struct sctp_gap_ack_block)) > limit) { /* no more room */ limit_reached = 1; break; @@ -10555,7 +10514,7 @@ sctp_send_nr_sack(struct sctp_tcb *stcb) /* now we must add any dups we are going to report. */ if ((limit_reached == 0) && (asoc->numduptsns)) { - dup = (uint32_t *) nr_gap_descriptor; + dup = (uint32_t *) gap_descriptor; for (i = 0; i < asoc->numduptsns; i++) { *dup = htonl(asoc->dup_tsns[i]); dup++; @@ -10575,10 +10534,9 @@ sctp_send_nr_sack(struct sctp_tcb *stcb) num_nr_gap_blocks = num_gap_blocks; num_gap_blocks = 0; } - a_chk->send_size = (sizeof(struct sctp_nr_sack_chunk) + - (num_gap_blocks * sizeof(struct sctp_gap_ack_block)) + - (num_nr_gap_blocks * sizeof(struct sctp_nr_gap_ack_block)) + - (num_dups * sizeof(int32_t))); + a_chk->send_size = sizeof(struct sctp_nr_sack_chunk) + + (num_gap_blocks + num_nr_gap_blocks) * sizeof(struct sctp_gap_ack_block) + + num_dups * sizeof(int32_t); SCTP_BUF_LEN(a_chk->data) = a_chk->send_size; nr_sack->nr_sack.num_gap_ack_blks = htons(num_gap_blocks); @@ -10664,27 +10622,37 @@ sctp_send_abort_tcb(struct sctp_tcb *stcb, struct mbuf *operr, int so_locked void sctp_send_shutdown_complete(struct sctp_tcb *stcb, - struct sctp_nets *net) + struct sctp_nets *net, + int reflect_vtag) { /* formulate and SEND a SHUTDOWN-COMPLETE */ struct mbuf *m_shutdown_comp; struct sctp_shutdown_complete_chunk *shutdown_complete; + uint32_t vtag; + uint8_t flags; m_shutdown_comp = sctp_get_mbuf_for_msg(sizeof(struct sctp_chunkhdr), 0, M_DONTWAIT, 1, MT_HEADER); if (m_shutdown_comp == NULL) { /* no mbuf's */ return; } + if (reflect_vtag) { + flags = SCTP_HAD_NO_TCB; + vtag = stcb->asoc.my_vtag; + } else { + flags = 0; + vtag = stcb->asoc.peer_vtag; + } shutdown_complete = mtod(m_shutdown_comp, struct sctp_shutdown_complete_chunk *); shutdown_complete->ch.chunk_type = SCTP_SHUTDOWN_COMPLETE; - shutdown_complete->ch.chunk_flags = 0; + shutdown_complete->ch.chunk_flags = flags; shutdown_complete->ch.chunk_length = htons(sizeof(struct sctp_shutdown_complete_chunk)); SCTP_BUF_LEN(m_shutdown_comp) = sizeof(struct sctp_shutdown_complete_chunk); (void)sctp_lowlevel_chunk_output(stcb->sctp_ep, stcb, net, (struct sockaddr *)&net->ro._l_addr, m_shutdown_comp, 0, NULL, 0, 1, 0, NULL, 0, stcb->sctp_ep->sctp_lport, stcb->rport, - htonl(stcb->asoc.peer_vtag), + htonl(vtag), net->port, SCTP_SO_NOT_LOCKED, NULL); SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); return; @@ -12275,10 +12243,8 @@ skip_copy: } else { if (sp->sinfo_flags & SCTP_ADDR_OVER) { sp->net = net; - sp->addr_over = 1; } else { sp->net = asoc->primary_destination; - sp->addr_over = 0; } atomic_add_int(&sp->net->ref_count, 1); sctp_set_prsctp_policy(sp); diff --git a/sys/netinet/sctp_output.h b/sys/netinet/sctp_output.h index ce76febda068..bd40a0b1f099 100644 --- a/sys/netinet/sctp_output.h +++ b/sys/netinet/sctp_output.h @@ -111,7 +111,7 @@ void sctp_send_shutdown(struct sctp_tcb *, struct sctp_nets *); void sctp_send_shutdown_ack(struct sctp_tcb *, struct sctp_nets *); -void sctp_send_shutdown_complete(struct sctp_tcb *, struct sctp_nets *); +void sctp_send_shutdown_complete(struct sctp_tcb *, struct sctp_nets *, int); void sctp_send_shutdown_complete2(struct mbuf *, int, struct sctphdr *, diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c index 21cd88998a8a..73e7991c6596 100644 --- a/sys/netinet/sctp_pcb.c +++ b/sys/netinet/sctp_pcb.c @@ -452,7 +452,7 @@ sctp_remove_ifa_from_ifn(struct sctp_ifa *sctp_ifap) sctp_ifap->ifn_p->num_v4--; ifn_index = sctp_ifap->ifn_p->ifn_index; - if (SCTP_LIST_EMPTY(&sctp_ifap->ifn_p->ifalist)) { + if (LIST_EMPTY(&sctp_ifap->ifn_p->ifalist)) { /* remove the ifn, possibly freeing it */ sctp_delete_ifn(sctp_ifap->ifn_p, SCTP_ADDR_LOCKED); } else { @@ -4262,7 +4262,7 @@ sctp_delete_from_timewait(uint32_t tag, uint16_t lport, uint16_t rport) int i; chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; - if (!SCTP_LIST_EMPTY(chain)) { + if (!LIST_EMPTY(chain)) { LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { for (i = 0; i < SCTP_NUMBER_IN_VTAG_BLOCK; i++) { if ((twait_block->vtag_block[i].v_tag == tag) && @@ -4292,7 +4292,7 @@ sctp_is_in_timewait(uint32_t tag, uint16_t lport, uint16_t rport) SCTP_INP_INFO_WLOCK(); chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; - if (!SCTP_LIST_EMPTY(chain)) { + if (!LIST_EMPTY(chain)) { LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { for (i = 0; i < SCTP_NUMBER_IN_VTAG_BLOCK; i++) { if ((twait_block->vtag_block[i].v_tag == tag) && @@ -4326,7 +4326,7 @@ sctp_add_vtag_to_timewait(uint32_t tag, uint32_t time, uint16_t lport, uint16_t (void)SCTP_GETTIME_TIMEVAL(&now); chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; set = 0; - if (!SCTP_LIST_EMPTY(chain)) { + if (!LIST_EMPTY(chain)) { /* Block(s) present, lets find space, and expire on the fly */ LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { for (i = 0; i < SCTP_NUMBER_IN_VTAG_BLOCK; i++) { @@ -4953,7 +4953,7 @@ sctp_free_assoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int from_inpcbfre sctp_free_remote_addr(net); } - while (!SCTP_LIST_EMPTY(&asoc->sctp_restricted_addrs)) { + while (!LIST_EMPTY(&asoc->sctp_restricted_addrs)) { /* sa_ignore FREED_MEMORY */ laddr = LIST_FIRST(&asoc->sctp_restricted_addrs); sctp_remove_laddr(laddr); @@ -5528,7 +5528,7 @@ sctp_pcb_init() /* Init the TIMEWAIT list */ for (i = 0; i < SCTP_STACK_VTAG_HASH_SIZE; i++) { - LIST_INIT(&SCTP_BASE_INFO(vtag_timewait[i])); + LIST_INIT(&SCTP_BASE_INFO(vtag_timewait)[i]); } #if defined(SCTP_USE_THREAD_BASED_ITERATOR) @@ -5558,36 +5558,54 @@ sctp_pcb_finish(void) struct sctp_ifa *ifa; struct sctpvtaghead *chain; struct sctp_tagblock *twait_block, *prev_twait_block; + struct sctp_laddr *wi; + struct sctp_iterator *it; int i; +#if defined(SCTP_USE_THREAD_BASED_ITERATOR) + SCTP_BASE_INFO(threads_must_exit) = 1; + /* Wake the thread up so it will exit now */ + sctp_wakeup_iterator(); + +#endif + SCTP_OS_TIMER_STOP(&SCTP_BASE_INFO(addr_wq_timer.timer)); + SCTP_IPI_ITERATOR_WQ_LOCK(); + while ((wi = LIST_FIRST(&SCTP_BASE_INFO(addr_wq))) != NULL) { + LIST_REMOVE(wi, sctp_nxt_addr); + SCTP_DECR_LADDR_COUNT(); + SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_laddr), wi); + } + SCTP_IPI_ITERATOR_WQ_UNLOCK(); + while ((it = TAILQ_FIRST(&SCTP_BASE_INFO(iteratorhead))) != NULL) { + if (it->function_atend != NULL) { + (*it->function_atend) (it->pointer, it->val); + } + TAILQ_REMOVE(&SCTP_BASE_INFO(iteratorhead), it, sctp_nxt_itr); + SCTP_FREE(it, SCTP_M_ITER); + } + /* * free the vrf/ifn/ifa lists and hashes (be sure address monitor is * destroyed first). */ vrf_bucket = &SCTP_BASE_INFO(sctp_vrfhash)[(SCTP_DEFAULT_VRFID & SCTP_BASE_INFO(hashvrfmark))]; - vrf = LIST_FIRST(vrf_bucket); - while (vrf) { - ifn = LIST_FIRST(&vrf->ifnlist); - while (ifn) { - ifa = LIST_FIRST(&ifn->ifalist); - while (ifa) { + while ((vrf = LIST_FIRST(vrf_bucket)) != NULL) { + while ((ifn = LIST_FIRST(&vrf->ifnlist)) != NULL) { + while ((ifa = LIST_FIRST(&ifn->ifalist)) != NULL) { /* free the ifa */ LIST_REMOVE(ifa, next_bucket); LIST_REMOVE(ifa, next_ifa); SCTP_FREE(ifa, SCTP_M_IFA); - ifa = LIST_FIRST(&ifn->ifalist); } /* free the ifn */ LIST_REMOVE(ifn, next_bucket); LIST_REMOVE(ifn, next_ifn); SCTP_FREE(ifn, SCTP_M_IFN); - ifn = LIST_FIRST(&vrf->ifnlist); } SCTP_HASH_FREE(vrf->vrf_addr_hash, vrf->vrf_addr_hashmark); /* free the vrf */ LIST_REMOVE(vrf, next_vrf); SCTP_FREE(vrf, SCTP_M_VRF); - vrf = LIST_FIRST(vrf_bucket); } /* free the vrf hashes */ SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_vrfhash), SCTP_BASE_INFO(hashvrfmark)); @@ -5599,7 +5617,7 @@ sctp_pcb_finish(void) */ for (i = 0; i < SCTP_STACK_VTAG_HASH_SIZE; i++) { chain = &SCTP_BASE_INFO(vtag_timewait)[i]; - if (!SCTP_LIST_EMPTY(chain)) { + if (!LIST_EMPTY(chain)) { prev_twait_block = NULL; LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { if (prev_twait_block) { @@ -5614,9 +5632,7 @@ sctp_pcb_finish(void) /* free the locks and mutexes */ #ifdef SCTP_PACKET_LOGGING SCTP_IP_PKTLOG_DESTROY(); - #endif - SCTP_IPI_ITERATOR_WQ_DESTROY(); SCTP_IPI_ADDR_DESTROY(); SCTP_ITERATOR_LOCK_DESTROY(); SCTP_STATLOG_DESTROY(); @@ -6238,15 +6254,6 @@ next_param: return (-33); } /* concatenate the full random key */ -#ifdef SCTP_AUTH_DRAFT_04 - keylen = random_len; - new_key = sctp_alloc_key(keylen); - if (new_key != NULL) { - /* copy in the RANDOM */ - if (p_random != NULL) - bcopy(p_random->random_data, new_key->key, random_len); - } -#else keylen = sizeof(*p_random) + random_len + sizeof(*hmacs) + hmacs_len; if (chunks != NULL) { keylen += sizeof(*chunks) + num_chunks; @@ -6269,19 +6276,13 @@ next_param: bcopy(hmacs, new_key->key + keylen, sizeof(*hmacs) + hmacs_len); } - } -#endif - else { + } else { /* failed to get memory for the key */ return (-34); } if (stcb->asoc.authinfo.peer_random != NULL) sctp_free_key(stcb->asoc.authinfo.peer_random); stcb->asoc.authinfo.peer_random = new_key; -#ifdef SCTP_AUTH_DRAFT_04 - /* don't include the chunks and hmacs for draft -04 */ - stcb->asoc.authinfo.peer_random->keylen = random_len; -#endif sctp_clear_cachedkeys(stcb, stcb->asoc.authinfo.assoc_keyid); sctp_clear_cachedkeys(stcb, stcb->asoc.authinfo.recv_keyid); @@ -6369,9 +6370,9 @@ sctp_is_vtag_good(struct sctp_inpcb *inp, uint32_t tag, uint16_t lport, uint16_t } skip_vtag_check: - chain = &SCTP_BASE_INFO(vtag_timewait[(tag % SCTP_STACK_VTAG_HASH_SIZE))]; + chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; /* Now what about timed wait ? */ - if (!SCTP_LIST_EMPTY(chain)) { + if (!LIST_EMPTY(chain)) { /* * Block(s) are present, lets see if we have this tag in the * list diff --git a/sys/netinet/sctp_structs.h b/sys/netinet/sctp_structs.h index 595c37c3e7a6..9b952fd022b5 100644 --- a/sys/netinet/sctp_structs.h +++ b/sys/netinet/sctp_structs.h @@ -364,9 +364,6 @@ struct sctp_tmit_chunk { uint8_t pad_inplace; uint8_t do_rtt; uint8_t book_size_scale; - uint8_t addr_over; /* flag which is set if the dest address for - * this chunk is overridden by user. Used for - * CMT (iyengar@cis.udel.edu, 2005/06/21) */ uint8_t no_fr_allowed; uint8_t pr_sctp_on; uint8_t copy_by_ref; @@ -444,7 +441,6 @@ struct sctp_stream_queue_pending { uint8_t holds_key_ref; uint8_t msg_is_complete; uint8_t some_taken; - uint8_t addr_over; uint8_t pr_sctp_on; uint8_t sender_all_done; uint8_t put_last_out; @@ -1047,8 +1043,6 @@ struct sctp_association { uint8_t delayed_connection; uint8_t ifp_had_enobuf; uint8_t saw_sack_with_frags; - /* EY */ - uint8_t saw_sack_with_nr_frags; uint8_t in_asocid_hash; uint8_t assoc_up_sent; uint8_t adaptation_needed; diff --git a/sys/netinet/sctp_sysctl.c b/sys/netinet/sctp_sysctl.c index ceb4622ab8a2..b4023c68213f 100644 --- a/sys/netinet/sctp_sysctl.c +++ b/sys/netinet/sctp_sysctl.c @@ -556,9 +556,7 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS) if (error == 0) { RANGECHK(SCTP_BASE_SYSCTL(sctp_sendspace), SCTPCTL_MAXDGRAM_MIN, SCTPCTL_MAXDGRAM_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_recvspace), SCTPCTL_RECVSPACE_MIN, SCTPCTL_RECVSPACE_MAX); -#if defined(__FreeBSD__) || defined(SCTP_APPLE_AUTO_ASCONF) RANGECHK(SCTP_BASE_SYSCTL(sctp_auto_asconf), SCTPCTL_AUTOASCONF_MIN, SCTPCTL_AUTOASCONF_MAX); -#endif RANGECHK(SCTP_BASE_SYSCTL(sctp_ecn_enable), SCTPCTL_ECN_ENABLE_MIN, SCTPCTL_ECN_ENABLE_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_ecn_nonce), SCTPCTL_ECN_NONCE_MIN, SCTPCTL_ECN_NONCE_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_strict_sacks), SCTPCTL_STRICT_SACKS_MIN, SCTPCTL_STRICT_SACKS_MAX); @@ -613,12 +611,8 @@ sysctl_sctp_check(SYSCTL_HANDLER_ARGS) RANGECHK(SCTP_BASE_SYSCTL(sctp_default_frag_interleave), SCTPCTL_DEFAULT_FRAG_INTERLEAVE_MIN, SCTPCTL_DEFAULT_FRAG_INTERLEAVE_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_vtag_time_wait), SCTPCTL_TIME_WAIT_MIN, SCTPCTL_TIME_WAIT_MAX); -#if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_BASE) RANGECHK(SCTP_BASE_SYSCTL(sctp_mobility_base), SCTPCTL_MOBILITY_BASE_MIN, SCTPCTL_MOBILITY_BASE_MAX); -#endif -#if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_FASTHANDOFF) RANGECHK(SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff), SCTPCTL_MOBILITY_FASTHANDOFF_MIN, SCTPCTL_MOBILITY_FASTHANDOFF_MAX); -#endif RANGECHK(SCTP_BASE_SYSCTL(sctp_udp_tunneling_for_client_enable), SCTPCTL_UDP_TUNNELING_FOR_CLIENT_ENABLE_MIN, SCTPCTL_UDP_TUNNELING_FOR_CLIENT_ENABLE_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_enable_sack_immediately), SCTPCTL_SACK_IMMEDIATELY_ENABLE_MIN, SCTPCTL_SACK_IMMEDIATELY_ENABLE_MAX); RANGECHK(SCTP_BASE_SYSCTL(sctp_inits_include_nat_friendly), SCTPCTL_NAT_FRIENDLY_INITS_MIN, SCTPCTL_NAT_FRIENDLY_INITS_MAX); @@ -660,11 +654,9 @@ SYSCTL_PROC(_net_inet_sctp, OID_AUTO, recvspace, CTLTYPE_INT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_recvspace), 0, sysctl_sctp_check, "IU", SCTPCTL_RECVSPACE_DESC); -#if defined(__FreeBSD__) || defined(SCTP_APPLE_AUTO_ASCONF) SYSCTL_PROC(_net_inet_sctp, OID_AUTO, auto_asconf, CTLTYPE_INT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_auto_asconf), 0, sysctl_sctp_check, "IU", SCTPCTL_AUTOASCONF_DESC); -#endif SYSCTL_PROC(_net_inet_sctp, OID_AUTO, ecn_enable, CTLTYPE_INT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_ecn_enable), 0, sysctl_sctp_check, "IU", @@ -871,17 +863,13 @@ SYSCTL_PROC(_net_inet_sctp, OID_AUTO, default_frag_interleave, CTLTYPE_INT | CTL &SCTP_BASE_SYSCTL(sctp_default_frag_interleave), 0, sysctl_sctp_check, "IU", SCTPCTL_DEFAULT_FRAG_INTERLEAVE_DESC); -#if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_BASE) SYSCTL_PROC(_net_inet_sctp, OID_AUTO, mobility_base, CTLTYPE_INT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_mobility_base), 0, sysctl_sctp_check, "IU", SCTPCTL_MOBILITY_BASE_DESC); -#endif -#if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_FASTHANDOFF) SYSCTL_PROC(_net_inet_sctp, OID_AUTO, mobility_fasthandoff, CTLTYPE_INT | CTLFLAG_RW, &SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff), 0, sysctl_sctp_check, "IU", SCTPCTL_MOBILITY_FASTHANDOFF_DESC); -#endif #if defined(SCTP_LOCAL_TRACE_BUF) SYSCTL_STRUCT(_net_inet_sctp, OID_AUTO, log, CTLFLAG_RD, diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h index 2f16b94c2d67..19089301411f 100644 --- a/sys/netinet/sctp_uio.h +++ b/sys/netinet/sctp_uio.h @@ -45,6 +45,9 @@ __FBSDID("$FreeBSD$"); typedef uint32_t sctp_assoc_t; +/* Compatibility to previous define's */ +#define sctp_stream_reset_events sctp_stream_reset_event + /* On/Off setup for subscription to events */ struct sctp_event_subscribe { uint8_t sctp_data_io_event; @@ -57,7 +60,7 @@ struct sctp_event_subscribe { uint8_t sctp_adaptation_layer_event; uint8_t sctp_authentication_event; uint8_t sctp_sender_dry_event; - uint8_t sctp_stream_reset_events; + uint8_t sctp_stream_reset_event; }; /* ancillary data types */ @@ -273,7 +276,7 @@ struct sctp_send_failed { uint32_t ssf_error; struct sctp_sndrcvinfo ssf_info; sctp_assoc_t ssf_assoc_id; - uint8_t ssf_data[0]; + uint8_t ssf_data[]; }; /* flag that indicates state of data */ @@ -367,7 +370,7 @@ struct sctp_stream_reset_event { uint16_t strreset_flags; uint32_t strreset_length; sctp_assoc_t strreset_assoc_id; - uint16_t strreset_list[0]; + uint16_t strreset_list[]; }; /* flags in strreset_flags field */ @@ -402,19 +405,19 @@ union sctp_notification { }; /* notification types */ -#define SCTP_ASSOC_CHANGE 0x0001 -#define SCTP_PEER_ADDR_CHANGE 0x0002 -#define SCTP_REMOTE_ERROR 0x0003 -#define SCTP_SEND_FAILED 0x0004 -#define SCTP_SHUTDOWN_EVENT 0x0005 -#define SCTP_ADAPTATION_INDICATION 0x0006 +#define SCTP_ASSOC_CHANGE 0x0001 +#define SCTP_PEER_ADDR_CHANGE 0x0002 +#define SCTP_REMOTE_ERROR 0x0003 +#define SCTP_SEND_FAILED 0x0004 +#define SCTP_SHUTDOWN_EVENT 0x0005 +#define SCTP_ADAPTATION_INDICATION 0x0006 /* same as above */ -#define SCTP_ADAPTION_INDICATION 0x0006 -#define SCTP_PARTIAL_DELIVERY_EVENT 0x0007 -#define SCTP_AUTHENTICATION_EVENT 0x0008 -#define SCTP_STREAM_RESET_EVENT 0x0009 -#define SCTP_SENDER_DRY_EVENT 0x000a - +#define SCTP_ADAPTION_INDICATION 0x0006 +#define SCTP_PARTIAL_DELIVERY_EVENT 0x0007 +#define SCTP_AUTHENTICATION_EVENT 0x0008 +#define SCTP_STREAM_RESET_EVENT 0x0009 +#define SCTP_SENDER_DRY_EVENT 0x000a +#define SCTP__NOTIFICATIONS_STOPPED_EVENT 0x000b /* we dont send this */ /* * socket option structs */ @@ -514,19 +517,18 @@ struct sctp_authchunk { struct sctp_authkey { sctp_assoc_t sca_assoc_id; uint16_t sca_keynumber; - uint8_t sca_key[0]; + uint8_t sca_key[]; }; /* SCTP_HMAC_IDENT */ struct sctp_hmacalgo { uint32_t shmac_number_of_idents; - uint16_t shmac_idents[0]; + uint16_t shmac_idents[]; }; /* AUTH hmac_id */ #define SCTP_AUTH_HMAC_ID_RSVD 0x0000 #define SCTP_AUTH_HMAC_ID_SHA1 0x0001 /* default, mandatory */ -#define SCTP_AUTH_HMAC_ID_MD5 0x0002 /* deprecated */ #define SCTP_AUTH_HMAC_ID_SHA256 0x0003 #define SCTP_AUTH_HMAC_ID_SHA224 0x0004 #define SCTP_AUTH_HMAC_ID_SHA384 0x0005 @@ -542,7 +544,7 @@ struct sctp_authkeyid { /* SCTP_PEER_AUTH_CHUNKS / SCTP_LOCAL_AUTH_CHUNKS */ struct sctp_authchunks { sctp_assoc_t gauth_assoc_id; - uint8_t gauth_chunks[0]; + uint8_t gauth_chunks[]; }; struct sctp_assoc_value { @@ -552,7 +554,7 @@ struct sctp_assoc_value { struct sctp_assoc_ids { uint32_t gaids_number_of_ids; - sctp_assoc_t gaids_assoc_id[0]; + sctp_assoc_t gaids_assoc_id[]; }; struct sctp_sack_info { @@ -601,7 +603,7 @@ struct sctp_stream_reset { sctp_assoc_t strrst_assoc_id; uint16_t strrst_flags; uint16_t strrst_num_streams; /* 0 == ALL */ - uint16_t strrst_list[0];/* list if strrst_num_streams is not 0 */ + uint16_t strrst_list[]; /* list if strrst_num_streams is not 0 */ }; @@ -754,7 +756,7 @@ struct sctp_cwnd_log_req { int32_t num_ret; /* Number returned */ int32_t start_at; /* start at this one */ int32_t end_at; /* end at this one */ - struct sctp_cwnd_log log[0]; + struct sctp_cwnd_log log[]; }; struct sctp_timeval { diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index a8ea998a3b3e..2851272d35a0 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -551,6 +551,7 @@ sctp_attach(struct socket *so, int proto, struct thread *p) sctp_log_closing(inp, NULL, 17); #endif if (error != 0) { +try_again: flags = inp->sctp_flags; if (((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && (atomic_cmpset_int(&inp->sctp_flags, flags, (flags | SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP)))) { @@ -561,7 +562,12 @@ sctp_attach(struct socket *so, int proto, struct thread *p) sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, SCTP_CALLED_AFTER_CMPSET_OFCLOSE); } else { - SCTP_INP_WUNLOCK(inp); + flags = inp->sctp_flags; + if ((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { + goto try_again; + } else { + SCTP_INP_WUNLOCK(inp); + } } return error; } @@ -759,7 +765,7 @@ sctp_disconnect(struct socket *so) SCTP_INP_RLOCK(inp); if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { - if (SCTP_LIST_EMPTY(&inp->sctp_asoc_list)) { + if (LIST_EMPTY(&inp->sctp_asoc_list)) { /* No connection */ SCTP_INP_RUNLOCK(inp); return (0); @@ -974,7 +980,9 @@ sctp_shutdown(struct socket *so) /* For UDP model this is a invalid call */ if (inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) { /* Restore the flags that the soshutdown took away. */ + SOCKBUF_LOCK(&so->so_rcv); so->so_rcv.sb_state &= ~SBS_CANTRCVMORE; + SOCKBUF_UNLOCK(&so->so_rcv); /* This proc will wakeup for read and do nothing (I hope) */ SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EOPNOTSUPP); @@ -2008,7 +2016,7 @@ flags_out: events->sctp_sender_dry_event = 1; if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_STREAM_RESETEVNT)) - events->sctp_stream_reset_events = 1; + events->sctp_stream_reset_event = 1; SCTP_INP_RUNLOCK(inp); *optsize = sizeof(struct sctp_event_subscribe); } @@ -3650,7 +3658,7 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize, sctp_feature_off(inp, SCTP_PCB_FLAGS_DRYEVNT); } - if (events->sctp_stream_reset_events) { + if (events->sctp_stream_reset_event) { sctp_feature_on(inp, SCTP_PCB_FLAGS_STREAM_RESETEVNT); } else { sctp_feature_off(inp, SCTP_PCB_FLAGS_STREAM_RESETEVNT); @@ -4459,6 +4467,15 @@ sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p) if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; /* Set the connected flag so we can queue data */ + SOCKBUF_LOCK(&so->so_rcv); + so->so_rcv.sb_state &= ~SBS_CANTRCVMORE; + SOCKBUF_UNLOCK(&so->so_rcv); + SOCKBUF_LOCK(&so->so_snd); + so->so_snd.sb_state &= ~SBS_CANTSENDMORE; + SOCKBUF_UNLOCK(&so->so_snd); + SOCK_LOCK(so); + so->so_state &= ~SS_ISDISCONNECTING; + SOCK_UNLOCK(so); soisconnecting(so); } SCTP_SET_STATE(&stcb->asoc, SCTP_STATE_COOKIE_WAIT); diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index 94dea3fa73d4..658dc5557107 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -52,15 +52,9 @@ __FBSDID("$FreeBSD$"); #define NUMBER_OF_MTU_SIZES 18 -#if defined(__Windows__) && !defined(SCTP_LOCAL_TRACE_BUF) -#include "eventrace_netinet.h" -#include "sctputil.tmh" /* this is the file that will be auto - * generated */ -#else #ifndef KTR_SCTP #define KTR_SCTP KTR_SUBSYS #endif -#endif void sctp_sblog(struct sockbuf *sb, @@ -855,7 +849,7 @@ retry: uint32_t sctp_select_a_tag(struct sctp_inpcb *inp, uint16_t lport, uint16_t rport, int save_in_twait) { - u_long x, not_done; + uint32_t x, not_done; struct timeval now; (void)SCTP_GETTIME_TIMEVAL(&now); @@ -2757,8 +2751,6 @@ sctp_pad_lastmbuf(struct mbuf *m, int padval, struct mbuf *last_mbuf) return (EFAULT); } -int sctp_asoc_change_wake = 0; - static void sctp_notify_assoc_change(uint32_t event, struct sctp_tcb *stcb, uint32_t error, void *data, int so_locked @@ -2812,7 +2804,6 @@ sctp_notify_assoc_change(uint32_t event, struct sctp_tcb *stcb, SCTP_SOCKET_UNLOCK(so, 1); } #endif - sctp_asoc_change_wake++; } if (sctp_is_feature_off(stcb->sctp_ep, SCTP_PCB_FLAGS_RECVASSOCEVNT)) { /* event not enabled */ @@ -4382,7 +4373,7 @@ sctp_add_to_readq(struct sctp_inpcb *inp, m = SCTP_BUF_NEXT(prev); } if (m == NULL) { - control->tail_mbuf = prev;; + control->tail_mbuf = prev; } continue; } @@ -4791,7 +4782,6 @@ next_on_sent: chk->rec.data.payloadtype = sp->ppid; chk->rec.data.context = sp->context; chk->flags = sp->act_flags; - chk->addr_over = sp->addr_over; chk->whoTo = sp->net; atomic_add_int(&chk->whoTo->ref_count, 1); chk->rec.data.TSN_seq = atomic_fetchadd_int(&stcb->asoc.sending_seq, 1); @@ -6156,11 +6146,11 @@ sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id) * newest first :-0 */ LIST_INSERT_HEAD(&SCTP_BASE_INFO(addr_wq), wi, sctp_nxt_addr); + SCTP_IPI_ITERATOR_WQ_UNLOCK(); sctp_timer_start(SCTP_TIMER_TYPE_ADDR_WQ, (struct sctp_inpcb *)NULL, (struct sctp_tcb *)NULL, (struct sctp_nets *)NULL); - SCTP_IPI_ITERATOR_WQ_UNLOCK(); return (0); } diff --git a/sys/netinet/tcp.h b/sys/netinet/tcp.h index 03b8bf637087..2929d0d2a923 100644 --- a/sys/netinet/tcp.h +++ b/sys/netinet/tcp.h @@ -52,11 +52,11 @@ struct tcphdr { tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ #if BYTE_ORDER == LITTLE_ENDIAN - u_int th_x2:4, /* (unused) */ + u_char th_x2:4, /* (unused) */ th_off:4; /* data offset */ #endif #if BYTE_ORDER == BIG_ENDIAN - u_int th_off:4, /* data offset */ + u_char th_off:4, /* data offset */ th_x2:4; /* (unused) */ #endif u_char th_flags; @@ -181,10 +181,10 @@ struct tcp_info { u_int8_t tcpi_snd_wscale:4, /* RFC1323 send shift value. */ tcpi_rcv_wscale:4; /* RFC1323 recv shift value. */ - u_int32_t __tcpi_rto; + u_int32_t tcpi_rto; /* Retransmission timeout (usec). */ u_int32_t __tcpi_ato; - u_int32_t __tcpi_snd_mss; - u_int32_t __tcpi_rcv_mss; + u_int32_t tcpi_snd_mss; /* Max segment size for send. */ + u_int32_t tcpi_rcv_mss; /* Max segment size for receive. */ u_int32_t __tcpi_unacked; u_int32_t __tcpi_sacked; @@ -195,7 +195,7 @@ struct tcp_info { /* Times; measurements in usecs. */ u_int32_t __tcpi_last_data_sent; u_int32_t __tcpi_last_ack_sent; /* Also unimpl. on Linux? */ - u_int32_t __tcpi_last_data_recv; + u_int32_t tcpi_last_data_recv; /* Time since last recv data. */ u_int32_t __tcpi_last_ack_recv; /* Metrics; variable units. */ diff --git a/sys/netinet/tcp_hostcache.c b/sys/netinet/tcp_hostcache.c index acbc860a26ed..a0c4012f21f0 100644 --- a/sys/netinet/tcp_hostcache.c +++ b/sys/netinet/tcp_hostcache.c @@ -115,6 +115,7 @@ static VNET_DEFINE(struct callout, tcp_hc_callout); static struct hc_metrics *tcp_hc_lookup(struct in_conninfo *); static struct hc_metrics *tcp_hc_insert(struct in_conninfo *); static int sysctl_tcp_hc_list(SYSCTL_HANDLER_ARGS); +static void tcp_hc_purge_internal(int); static void tcp_hc_purge(void *); SYSCTL_NODE(_net_inet_tcp, OID_AUTO, hostcache, CTLFLAG_RW, 0, @@ -235,10 +236,19 @@ tcp_hc_init(void) void tcp_hc_destroy(void) { - - /* XXX TODO walk the hashtable and free all entries */ + int i; callout_drain(&V_tcp_hc_callout); + + /* Purge all hc entries. */ + tcp_hc_purge_internal(1); + + /* Free the uma zone and the allocated hash table. */ + uma_zdestroy(V_tcp_hostcache.zone); + + for (i = 0; i < V_tcp_hostcache.hashsize; i++) + mtx_destroy(&V_tcp_hostcache.hashbase[i].hch_mtx); + free(V_tcp_hostcache.hashbase, M_HOSTCACHE); } #endif @@ -633,22 +643,14 @@ sysctl_tcp_hc_list(SYSCTL_HANDLER_ARGS) } /* - * Expire and purge (old|all) entries in the tcp_hostcache. Runs - * periodically from the callout. + * Caller has to make sure the curvnet is set properly. */ static void -tcp_hc_purge(void *arg) +tcp_hc_purge_internal(int all) { - CURVNET_SET((struct vnet *) arg); struct hc_metrics *hc_entry, *hc_next; - int all = 0; int i; - if (V_tcp_hostcache.purgeall) { - all = 1; - V_tcp_hostcache.purgeall = 0; - } - for (i = 0; i < V_tcp_hostcache.hashsize; i++) { THC_LOCK(&V_tcp_hostcache.hashbase[i].hch_mtx); TAILQ_FOREACH_SAFE(hc_entry, @@ -664,6 +666,24 @@ tcp_hc_purge(void *arg) } THC_UNLOCK(&V_tcp_hostcache.hashbase[i].hch_mtx); } +} + +/* + * Expire and purge (old|all) entries in the tcp_hostcache. Runs + * periodically from the callout. + */ +static void +tcp_hc_purge(void *arg) +{ + CURVNET_SET((struct vnet *) arg); + int all = 0; + + if (V_tcp_hostcache.purgeall) { + all = 1; + V_tcp_hostcache.purgeall = 0; + } + + tcp_hc_purge_internal(all); callout_reset(&V_tcp_hc_callout, V_tcp_hostcache.prune * hz, tcp_hc_purge, arg); diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 470d782ee5e7..09f834bcabdd 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -180,26 +180,6 @@ int tcp_read_locking = 1; SYSCTL_INT(_net_inet_tcp, OID_AUTO, read_locking, CTLFLAG_RW, &tcp_read_locking, 0, "Enable read locking strategy"); -int tcp_rlock_atfirst; -SYSCTL_INT(_net_inet_tcp, OID_AUTO, rlock_atfirst, CTLFLAG_RD, - &tcp_rlock_atfirst, 0, ""); - -int tcp_wlock_atfirst; -SYSCTL_INT(_net_inet_tcp, OID_AUTO, tcp_wlock_atfirst, CTLFLAG_RD, - &tcp_wlock_atfirst, 0, ""); - -int tcp_wlock_upgraded; -SYSCTL_INT(_net_inet_tcp, OID_AUTO, wlock_upgraded, CTLFLAG_RD, - &tcp_wlock_upgraded, 0, ""); - -int tcp_wlock_relocked; -SYSCTL_INT(_net_inet_tcp, OID_AUTO, wlock_relocked, CTLFLAG_RD, - &tcp_wlock_relocked, 0, ""); - -int tcp_wlock_looped; -SYSCTL_INT(_net_inet_tcp, OID_AUTO, wlock_looped, CTLFLAG_RD, - &tcp_wlock_looped, 0, ""); - VNET_DEFINE(struct inpcbhead, tcb); VNET_DEFINE(struct inpcbinfo, tcbinfo); #define tcb6 tcb /* for KAME src sync over BSD*'s */ @@ -505,11 +485,9 @@ tcp_input(struct mbuf *m, int off0) tcp_read_locking == 0) { INP_INFO_WLOCK(&V_tcbinfo); ti_locked = TI_WLOCKED; - tcp_wlock_atfirst++; } else { INP_INFO_RLOCK(&V_tcbinfo); ti_locked = TI_RLOCKED; - tcp_rlock_atfirst++; } findpcb: @@ -648,6 +626,7 @@ findpcb: * tried to free the inpcb, in which case we need to loop back and * try to find a new inpcb to deliver to. */ +relocked: if (inp->inp_flags & INP_TIMEWAIT) { KASSERT(ti_locked == TI_RLOCKED || ti_locked == TI_WLOCKED, ("%s: INP_TIMEWAIT ti_locked %d", __func__, ti_locked)); @@ -661,15 +640,11 @@ findpcb: ti_locked = TI_WLOCKED; INP_WLOCK(inp); if (in_pcbrele(inp)) { - tcp_wlock_looped++; inp = NULL; goto findpcb; } - tcp_wlock_relocked++; - } else { + } else ti_locked = TI_WLOCKED; - tcp_wlock_upgraded++; - } } INP_INFO_WLOCK_ASSERT(&V_tcbinfo); @@ -698,7 +673,8 @@ findpcb: * We've identified a valid inpcb, but it could be that we need an * inpcbinfo write lock and have only a read lock. In this case, * attempt to upgrade/relock using the same strategy as the TIMEWAIT - * case above. + * case above. If we relock, we have to jump back to 'relocked' as + * the connection might now be in TIMEWAIT. */ if (tp->t_state != TCPS_ESTABLISHED || (thflags & (TH_SYN | TH_FIN | TH_RST)) != 0 || @@ -715,15 +691,12 @@ findpcb: ti_locked = TI_WLOCKED; INP_WLOCK(inp); if (in_pcbrele(inp)) { - tcp_wlock_looped++; inp = NULL; goto findpcb; } - tcp_wlock_relocked++; - } else { + goto relocked; + } else ti_locked = TI_WLOCKED; - tcp_wlock_upgraded++; - } } INP_INFO_WLOCK_ASSERT(&V_tcbinfo); } diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index ee33ea2de738..ebe5e36ee3fc 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -992,7 +992,7 @@ send: * to read more data than can be buffered prior to transmitting on * the connection. */ - if (recwin == 0) + if (th->th_win == 0) tp->t_flags |= TF_RXWIN0SENT; else tp->t_flags &= ~TF_RXWIN0SENT; diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c index 16c4f676ebbb..4d9d487b5037 100644 --- a/sys/netinet/tcp_syncache.c +++ b/sys/netinet/tcp_syncache.c @@ -278,11 +278,33 @@ syncache_init(void) void syncache_destroy(void) { + struct syncache_head *sch; + struct syncache *sc, *nsc; + int i; - /* XXX walk the cache, free remaining objects, stop timers */ + /* Cleanup hash buckets: stop timers, free entries, destroy locks. */ + for (i = 0; i < V_tcp_syncache.hashsize; i++) { + sch = &V_tcp_syncache.hashbase[i]; + callout_drain(&sch->sch_timer); + + SCH_LOCK(sch); + TAILQ_FOREACH_SAFE(sc, &sch->sch_bucket, sc_hash, nsc) + syncache_drop(sc, sch); + SCH_UNLOCK(sch); + KASSERT(TAILQ_EMPTY(&sch->sch_bucket), + ("%s: sch->sch_bucket not empty", __func__)); + KASSERT(sch->sch_length == 0, ("%s: sch->sch_length %d not 0", + __func__, sch->sch_length)); + mtx_destroy(&sch->sch_mtx); + } + + KASSERT(V_tcp_syncache.cache_count == 0, ("%s: cache_count %d not 0", + __func__, V_tcp_syncache.cache_count)); + + /* Free the allocated global resources. */ uma_zdestroy(V_tcp_syncache.zone); - FREE(V_tcp_syncache.hashbase, M_SYNCACHE); + free(V_tcp_syncache.hashbase, M_SYNCACHE); } #endif diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 4913e6c29f71..dc9f11b8a0f9 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1194,6 +1194,8 @@ tcp_fill_info(struct tcpcb *tp, struct tcp_info *ti) ti->tcpi_rcv_wscale = tp->rcv_scale; } + ti->tcpi_rto = tp->t_rxtcur * tick; + ti->tcpi_last_data_recv = (long)(ticks - (int)tp->t_rcvtime) * tick; ti->tcpi_rtt = ((u_int64_t)tp->t_srtt * tick) >> TCP_RTT_SHIFT; ti->tcpi_rttvar = ((u_int64_t)tp->t_rttvar * tick) >> TCP_RTTVAR_SHIFT; @@ -1208,8 +1210,8 @@ tcp_fill_info(struct tcpcb *tp, struct tcp_info *ti) ti->tcpi_snd_wnd = tp->snd_wnd; ti->tcpi_snd_bwnd = tp->snd_bwnd; ti->tcpi_snd_nxt = tp->snd_nxt; - ti->__tcpi_snd_mss = tp->t_maxseg; - ti->__tcpi_rcv_mss = tp->t_maxseg; + ti->tcpi_snd_mss = tp->t_maxseg; + ti->tcpi_rcv_mss = tp->t_maxseg; if (tp->t_flags & TF_TOE) ti->tcpi_options |= TCPI_OPT_TOE; } diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index 93d3feb40680..769c21991c23 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -648,7 +648,6 @@ int tcp_ctloutput(struct socket *, struct sockopt *); struct tcpcb * tcp_drop(struct tcpcb *, int); void tcp_drain(void); -void tcp_fasttimo(void); void tcp_init(void); #ifdef VIMAGE void tcp_destroy(void); diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index 04810c362739..57f8d32c59ab 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -296,7 +296,7 @@ icmp6_error(struct mbuf *m, int type, int code, int param) * we should basically suppress sending an error (RFC 2463, Section * 2.4). * We have two exceptions (the item e.2 in that section): - * - the Pakcet Too Big message can be sent for path MTU discovery. + * - the Packet Too Big message can be sent for path MTU discovery. * - the Parameter Problem Message that can be allowed an icmp6 error * in the option type field. This check has been done in * ip6_unknown_opt(), so we can just check the type and code. @@ -870,7 +870,7 @@ icmp6_input(struct mbuf **mp, int *offp, int proto) break; } deliver: - if (icmp6_notify_error(&m, off, icmp6len, code)) { + if (icmp6_notify_error(&m, off, icmp6len, code) != 0) { /* In this case, m should've been freed. */ return (IPPROTO_DONE); } diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index ccea27ad72bc..c839efdc8df5 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -1200,8 +1200,12 @@ in6_purgeaddr(struct ifaddr *ifa) * The check for the current setting of "nd6_useloopback" * is not needed. */ - error = ifa_del_loopback_route((struct ifaddr *)ia, - (struct sockaddr *)&ia->ia_addr); + if (ia->ia_flags & IFA_RTSELF) { + error = ifa_del_loopback_route((struct ifaddr *)ia, + (struct sockaddr *)&ia->ia_addr); + if (error == 0) + ia->ia_flags &= ~IFA_RTSELF; + } /* stop DAD processing */ nd6_dad_stop(ifa); @@ -1762,6 +1766,8 @@ in6_ifinit(struct ifnet *ifp, struct in6_ifaddr *ia, || (ifp->if_flags & IFF_LOOPBACK))) { error = ifa_add_loopback_route((struct ifaddr *)ia, (struct sockaddr *)&ia->ia_addr); + if (error == 0) + ia->ia_flags |= IFA_RTSELF; } /* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */ @@ -2347,7 +2353,9 @@ in6_lltable_prefix_free(struct lltable *llt, } static int -in6_lltable_rtcheck(struct ifnet *ifp, const struct sockaddr *l3addr) +in6_lltable_rtcheck(struct ifnet *ifp, + u_int flags, + const struct sockaddr *l3addr) { struct rtentry *rt; char ip6buf[INET6_ADDRSTRLEN]; @@ -2415,7 +2423,7 @@ in6_lltable_lookup(struct lltable *llt, u_int flags, * verify this. */ if (!(flags & LLE_IFADDR) && - in6_lltable_rtcheck(ifp, l3addr) != 0) + in6_lltable_rtcheck(ifp, flags, l3addr) != 0) return NULL; lle = in6_lltable_new(l3addr, flags); @@ -2437,7 +2445,7 @@ in6_lltable_lookup(struct lltable *llt, u_int flags, LLE_WLOCK(lle); lle->la_flags = LLE_DELETED; LLE_WUNLOCK(lle); -#ifdef DIAGNOSTICS +#ifdef DIAGNOSTIC log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); #endif } diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c index eab70133c90e..5041ee2f2338 100644 --- a/sys/netinet6/in6_ifattach.c +++ b/sys/netinet6/in6_ifattach.c @@ -758,10 +758,12 @@ in6_ifattach(struct ifnet *ifp, struct ifnet *altifp) ia = in6ifa_ifpforlinklocal(ifp, 0); if (ia == NULL) { error = in6_ifattach_linklocal(ifp, altifp); +#if 0 if (error) log(LOG_NOTICE, "in6_ifattach_linklocal: " "failed to add a link-local addr to %s\n", if_name(ifp)); +#endif } else ifa_free(&ia->ia_ifa); } diff --git a/sys/netinet6/in6_mcast.c b/sys/netinet6/in6_mcast.c index eedebb91b485..1438c32030da 100644 --- a/sys/netinet6/in6_mcast.c +++ b/sys/netinet6/in6_mcast.c @@ -1814,6 +1814,7 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt) ifp = NULL; imf = NULL; + lims = NULL; error = 0; is_new = 0; @@ -1917,11 +1918,6 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt) */ (void)in6_setscope(&gsa->sin6.sin6_addr, ifp, NULL); - /* - * MCAST_JOIN_SOURCE on an exclusive membership is an error. - * On an existing inclusive membership, it just adds the - * source to the filter list. - */ imo = in6p_findmoptions(inp); idx = im6o_match_group(imo, ifp, &gsa->sa); if (idx == -1) { @@ -1929,16 +1925,53 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt) } else { inm = imo->im6o_membership[idx]; imf = &imo->im6o_mfilters[idx]; - if (ssa->ss.ss_family != AF_UNSPEC && - imf->im6f_st[1] != MCAST_INCLUDE) { + if (ssa->ss.ss_family != AF_UNSPEC) { + /* + * MCAST_JOIN_SOURCE_GROUP on an exclusive membership + * is an error. On an existing inclusive membership, + * it just adds the source to the filter list. + */ + if (imf->im6f_st[1] != MCAST_INCLUDE) { + error = EINVAL; + goto out_in6p_locked; + } + /* + * Throw out duplicates. + * + * XXX FIXME: This makes a naive assumption that + * even if entries exist for *ssa in this imf, + * they will be rejected as dupes, even if they + * are not valid in the current mode (in-mode). + * + * in6_msource is transactioned just as for anything + * else in SSM -- but note naive use of in6m_graft() + * below for allocating new filter entries. + * + * This is only an issue if someone mixes the + * full-state SSM API with the delta-based API, + * which is discouraged in the relevant RFCs. + */ + lims = im6o_match_source(imo, idx, &ssa->sa); + if (lims != NULL /*&& + lims->im6sl_st[1] == MCAST_INCLUDE*/) { + error = EADDRNOTAVAIL; + goto out_in6p_locked; + } + } else { + /* + * MCAST_JOIN_GROUP alone, on any existing membership, + * is rejected, to stop the same inpcb tying up + * multiple refs to the in_multi. + * On an existing inclusive membership, this is also + * an error; if you want to change filter mode, + * you must use the userland API setsourcefilter(). + * XXX We don't reject this for imf in UNDEFINED + * state at t1, because allocation of a filter + * is atomic with allocation of a membership. + */ error = EINVAL; goto out_in6p_locked; } - lims = im6o_match_source(imo, idx, &ssa->sa); - if (lims != NULL) { - error = EADDRNOTAVAIL; - goto out_in6p_locked; - } } /* @@ -1970,7 +2003,13 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt) /* * Graft new source into filter list for this inpcb's * membership of the group. The in6_multi may not have - * been allocated yet if this is a new membership. + * been allocated yet if this is a new membership, however, + * the in_mfilter slot will be allocated and must be initialized. + * + * Note: Grafting of exclusive mode filters doesn't happen + * in this path. + * XXX: Should check for non-NULL lims (node exists but may + * not be in-mode) for interop with full-state API. */ if (ssa->ss.ss_family != AF_UNSPEC) { /* Membership starts in IN mode */ @@ -1987,6 +2026,12 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sopt) error = ENOMEM; goto out_im6o_free; } + } else { + /* No address specified; Membership starts in EX mode */ + if (is_new) { + CTR1(KTR_MLD, "%s: new join w/o source", __func__); + im6f_init(imf, MCAST_UNDEFINED, MCAST_EXCLUDE); + } } /* @@ -2272,8 +2317,10 @@ out_im6f_rollback: if (is_final) { /* Remove the gap in the membership array. */ - for (++idx; idx < imo->im6o_num_memberships; ++idx) + for (++idx; idx < imo->im6o_num_memberships; ++idx) { imo->im6o_membership[idx-1] = imo->im6o_membership[idx]; + imo->im6o_mfilters[idx-1] = imo->im6o_mfilters[idx]; + } imo->im6o_num_memberships--; } @@ -2340,9 +2387,11 @@ in6p_set_source_filters(struct inpcb *inp, struct sockopt *sopt) if (error) return (error); - if (msfr.msfr_nsrcs > in6_mcast_maxsocksrc || - (msfr.msfr_fmode != MCAST_EXCLUDE && - msfr.msfr_fmode != MCAST_INCLUDE)) + if (msfr.msfr_nsrcs > in6_mcast_maxsocksrc) + return (ENOBUFS); + + if (msfr.msfr_fmode != MCAST_EXCLUDE && + msfr.msfr_fmode != MCAST_INCLUDE) return (EINVAL); if (msfr.msfr_group.ss_family != AF_INET6 || diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index d40a9e351019..6699ced9ab34 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -101,8 +101,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include - struct in6_addr zeroin6_addr; int @@ -332,7 +330,7 @@ in6_pcbladdr(register struct inpcb *inp, struct sockaddr *nam, * Do not update this earlier, in case we return with an error. * * XXX: this in6_selectsrc result might replace the bound local - * aaddress with the address specified by setsockopt(IPV6_PKTINFO). + * address with the address specified by setsockopt(IPV6_PKTINFO). * Is it the intended behavior? */ *plocal_addr6 = in6a; diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c index 35ab9bdac950..3289e57a274e 100644 --- a/sys/netinet6/in6_proto.c +++ b/sys/netinet6/in6_proto.c @@ -173,7 +173,6 @@ struct ip6protosw inet6sw[] = { .pr_ctloutput = tcp_ctloutput, #ifndef INET /* don't call initialization and timeout routines twice */ .pr_init = tcp_init, - .pr_fasttimo = tcp_fasttimo, .pr_slowtimo = tcp_slowtimo, #endif .pr_drain = tcp_drain, diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c index 8e82ef117aef..ea302a52fa4c 100644 --- a/sys/netinet6/in6_src.c +++ b/sys/netinet6/in6_src.c @@ -270,6 +270,13 @@ in6_selectsrc(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts, return (0); } + /* + * Bypass source address selection and use the primary jail IP + * if requested. + */ + if (cred != NULL && !prison_saddrsel_ip6(cred, srcp)) + return (0); + /* * If the address is not specified, choose the best one based on * the outgoing interface and the destination address. diff --git a/sys/netinet6/ip6_forward.c b/sys/netinet6/ip6_forward.c index 7ba4977d919c..cff29e19be52 100644 --- a/sys/netinet6/ip6_forward.c +++ b/sys/netinet6/ip6_forward.c @@ -551,11 +551,11 @@ skip_routing: in6_clearscope(&ip6->ip6_dst); /* Jump over all PFIL processing if hooks are not active. */ - if (!PFIL_HOOKED(&inet6_pfil_hook)) + if (!PFIL_HOOKED(&V_inet6_pfil_hook)) goto pass; /* Run through list of hooks for output packets. */ - error = pfil_run_hooks(&inet6_pfil_hook, &m, rt->rt_ifp, PFIL_OUT, NULL); + error = pfil_run_hooks(&V_inet6_pfil_hook, &m, rt->rt_ifp, PFIL_OUT, NULL); if (error != 0) goto senderr; if (m == NULL) diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 730b3bee7a27..c244f374b92b 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -152,7 +152,7 @@ VNET_DECLARE(int, udp6_recvspace); struct rwlock in6_ifaddr_lock; RW_SYSINIT(in6_ifaddr_lock, &in6_ifaddr_lock, "in6_ifaddr_lock"); -struct pfil_head inet6_pfil_hook; +VNET_DEFINE (struct pfil_head, inet6_pfil_hook); static void ip6_init2(void *); static struct ip6aux *ip6_setdstifaddr(struct mbuf *, struct in6_ifaddr *); @@ -247,6 +247,13 @@ ip6_init(void) V_ip6_desync_factor = arc4random() % MAX_TEMP_DESYNC_FACTOR; + /* Initialize packet filter hooks. */ + V_inet6_pfil_hook.ph_type = PFIL_TYPE_AF; + V_inet6_pfil_hook.ph_af = AF_INET6; + if ((i = pfil_head_register(&V_inet6_pfil_hook)) != 0) + printf("%s: WARNING: unable to register pfil hook, " + "error %d\n", __func__, i); + /* Skip global initialization stuff for non-default instances. */ if (!IS_DEFAULT_VNET(curvnet)) return; @@ -275,13 +282,6 @@ ip6_init(void) ip6_protox[pr->pr_protocol] = pr - inet6sw; } - /* Initialize packet filter hooks. */ - inet6_pfil_hook.ph_type = PFIL_TYPE_AF; - inet6_pfil_hook.ph_af = AF_INET6; - if ((i = pfil_head_register(&inet6_pfil_hook)) != 0) - printf("%s: WARNING: unable to register pfil hook, " - "error %d\n", __func__, i); - netisr_register(&ip6_nh); } @@ -515,10 +515,11 @@ ip6_input(struct mbuf *m) odst = ip6->ip6_dst; /* Jump over all PFIL processing if hooks are not active. */ - if (!PFIL_HOOKED(&inet6_pfil_hook)) + if (!PFIL_HOOKED(&V_inet6_pfil_hook)) goto passin; - if (pfil_run_hooks(&inet6_pfil_hook, &m, m->m_pkthdr.rcvif, PFIL_IN, NULL)) + if (pfil_run_hooks(&V_inet6_pfil_hook, &m, + m->m_pkthdr.rcvif, PFIL_IN, NULL)) return; if (m == NULL) /* consumed by filter */ return; @@ -1405,7 +1406,7 @@ ip6_savecontrol(struct inpcb *in6p, struct mbuf *m, struct mbuf **mp) mp = &(*mp)->m_next; break; case IPPROTO_ROUTING: - if (!in6p->inp_flags & IN6P_RTHDR) + if (!(in6p->inp_flags & IN6P_RTHDR)) break; *mp = sbcreatecontrol((caddr_t)ip6e, elen, diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c index 98875640e7a5..c2ec49aa3509 100644 --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -805,12 +805,12 @@ again: } /* Jump over all PFIL processing if hooks are not active. */ - if (!PFIL_HOOKED(&inet6_pfil_hook)) + if (!PFIL_HOOKED(&V_inet6_pfil_hook)) goto passout; odst = ip6->ip6_dst; /* Run through list of hooks for output packets. */ - error = pfil_run_hooks(&inet6_pfil_hook, &m, ifp, PFIL_OUT, inp); + error = pfil_run_hooks(&V_inet6_pfil_hook, &m, ifp, PFIL_OUT, inp); if (error != 0 || m == NULL) goto done; ip6 = mtod(m, struct ip6_hdr *); diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index e8fe3ec04a4a..a0a0f3a18d8f 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -358,7 +358,8 @@ VNET_DECLARE(int, ip6_use_defzone); /* Whether to use the default scope #endif #define V_ip6_use_defzone VNET(ip6_use_defzone) -extern struct pfil_head inet6_pfil_hook; /* packet filter hooks */ +VNET_DECLARE (struct pfil_head, inet6_pfil_hook); /* packet filter hooks */ +#define V_inet6_pfil_hook VNET(inet6_pfil_hook) extern struct pr_usrreqs rip6_usrreqs; struct sockopt; diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c index 172a8d6eb8a0..cade0d2b2083 100644 --- a/sys/netinet6/mld6.c +++ b/sys/netinet6/mld6.c @@ -79,6 +79,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -131,7 +132,8 @@ static struct mbuf * static int mld_v2_enqueue_filter_change(struct ifqueue *, struct in6_multi *); static int mld_v2_enqueue_group_record(struct ifqueue *, - struct in6_multi *, const int, const int, const int); + struct in6_multi *, const int, const int, const int, + const int); static int mld_v2_input_query(struct ifnet *, const struct ip6_hdr *, struct mbuf *, const int, const int); static int mld_v2_merge_state_changes(struct in6_multi *, @@ -235,6 +237,11 @@ SYSCTL_INT(_net_inet6_mld, OID_AUTO, v1enable, CTLFLAG_RW, &mld_v1enable, 0, "Enable fallback to MLDv1"); TUNABLE_INT("net.inet6.mld.v1enable", &mld_v1enable); +static int mld_use_allow = 1; +SYSCTL_INT(_net_inet6_mld, OID_AUTO, use_allow, CTLFLAG_RW, + &mld_use_allow, 0, "Use ALLOW/BLOCK for RFC 4604 SSM joins/leaves"); +TUNABLE_INT("net.inet6.mld.use_allow", &mld_use_allow); + /* * Packed Router Alert option structure declaration. */ @@ -460,6 +467,8 @@ mld_domifattach(struct ifnet *ifp) mli = mli_alloc_locked(ifp); if (!(ifp->if_flags & IFF_MULTICAST)) mli->mli_flags |= MLIF_SILENT; + if (mld_use_allow) + mli->mli_flags |= MLIF_USEALLOW; MLD_UNLOCK(); @@ -1549,7 +1558,8 @@ mld_v2_process_group_timers(struct mld_ifinfo *mli, int retval; retval = mld_v2_enqueue_group_record(qrq, inm, 0, 1, - (inm->in6m_state == MLD_SG_QUERY_PENDING_MEMBER)); + (inm->in6m_state == MLD_SG_QUERY_PENDING_MEMBER), + 0); CTR2(KTR_MLD, "%s: enqueue record = %d", __func__, retval); inm->in6m_state = MLD_REPORTING_MEMBER; @@ -2024,7 +2034,7 @@ mld_initial_join(struct in6_multi *inm, struct mld_ifinfo *mli, ifq = &inm->in6m_scq; _IF_DRAIN(ifq); retval = mld_v2_enqueue_group_record(ifq, inm, 1, - 0, 0); + 0, 0, (mli->mli_flags & MLIF_USEALLOW)); CTR2(KTR_MLD, "%s: enqueue record = %d", __func__, retval); if (retval <= 0) { @@ -2117,7 +2127,8 @@ mld_handle_state_change(struct in6_multi *inm, struct mld_ifinfo *mli) _IF_DRAIN(&inm->in6m_scq); - retval = mld_v2_enqueue_group_record(&inm->in6m_scq, inm, 1, 0, 0); + retval = mld_v2_enqueue_group_record(&inm->in6m_scq, inm, 1, 0, 0, + (mli->mli_flags & MLIF_USEALLOW)); CTR2(KTR_MLD, "%s: enqueue record = %d", __func__, retval); if (retval <= 0) return (-retval); @@ -2202,7 +2213,8 @@ mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli) in6m_acquire_locked(inm); retval = mld_v2_enqueue_group_record( - &inm->in6m_scq, inm, 1, 0, 0); + &inm->in6m_scq, inm, 1, 0, 0, + (mli->mli_flags & MLIF_USEALLOW)); KASSERT(retval != 0, ("%s: enqueue record = %d", __func__, retval)); @@ -2249,6 +2261,10 @@ mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli) * it was recorded for a Group-Source query, and will be omitted if * it is not both in-mode and recorded. * + * If use_block_allow is non-zero, state change reports for initial join + * and final leave, on an inclusive mode group with a source list, will be + * rewritten to use the ALLOW_NEW and BLOCK_OLD record types, respectively. + * * The function will attempt to allocate leading space in the packet * for the IPv6+ICMP headers to be prepended without fragmenting the chain. * @@ -2259,7 +2275,7 @@ mld_final_leave(struct in6_multi *inm, struct mld_ifinfo *mli) static int mld_v2_enqueue_group_record(struct ifqueue *ifq, struct in6_multi *inm, const int is_state_change, const int is_group_query, - const int is_source_query) + const int is_source_query, const int use_block_allow) { struct mldv2_record mr; struct mldv2_record *pmr; @@ -2307,10 +2323,16 @@ mld_v2_enqueue_group_record(struct ifqueue *ifq, struct in6_multi *inm, * If the mode did not change, and there are non-ASM * listeners or source filters present, * we potentially need to issue two records for the group. - * If we are transitioning to MCAST_UNDEFINED, we need - * not send any sources. * If there are ASM listeners, and there was no filter * mode transition of any kind, do nothing. + * + * If we are transitioning to MCAST_UNDEFINED, we need + * not send any sources. A transition to/from this state is + * considered inclusive with some special treatment. + * + * If we are rewriting initial joins/leaves to use + * ALLOW/BLOCK, and the group's membership is inclusive, + * we need to send sources in all cases. */ if (mode != inm->in6m_st[0].iss_fmode) { if (mode == MCAST_EXCLUDE) { @@ -2320,9 +2342,26 @@ mld_v2_enqueue_group_record(struct ifqueue *ifq, struct in6_multi *inm, } else { CTR1(KTR_MLD, "%s: change to INCLUDE", __func__); - type = MLD_CHANGE_TO_INCLUDE_MODE; - if (mode == MCAST_UNDEFINED) - record_has_sources = 0; + if (use_block_allow) { + /* + * XXX + * Here we're interested in state + * edges either direction between + * MCAST_UNDEFINED and MCAST_INCLUDE. + * Perhaps we should just check + * the group state, rather than + * the filter mode. + */ + if (mode == MCAST_UNDEFINED) { + type = MLD_BLOCK_OLD_SOURCES; + } else { + type = MLD_ALLOW_NEW_SOURCES; + } + } else { + type = MLD_CHANGE_TO_INCLUDE_MODE; + if (mode == MCAST_UNDEFINED) + record_has_sources = 0; + } } } else { if (record_has_sources) { @@ -2435,9 +2474,12 @@ mld_v2_enqueue_group_record(struct ifqueue *ifq, struct in6_multi *inm, * If we are appending to an existing packet, we need to obtain * a pointer to the group record after m_append(), in case a new * mbuf was allocated. + * * Only append sources which are in-mode at t1. If we are - * transitioning to MCAST_UNDEFINED state on the group, do not - * include source entries. + * transitioning to MCAST_UNDEFINED state on the group, and + * use_block_allow is zero, do not include source entries. + * Otherwise, we need to include this source in the report. + * * Only report recorded sources in our filter set when responding * to a group-source query. */ @@ -2459,7 +2501,8 @@ mld_v2_enqueue_group_record(struct ifqueue *ifq, struct in6_multi *inm, now = im6s_get_mode(inm, ims, 1); CTR2(KTR_MLD, "%s: node is %d", __func__, now); if ((now != mode) || - (now == mode && mode == MCAST_UNDEFINED)) { + (now == mode && + (!use_block_allow && mode == MCAST_UNDEFINED))) { CTR1(KTR_MLD, "%s: skip node", __func__); continue; } @@ -2549,7 +2592,8 @@ mld_v2_enqueue_group_record(struct ifqueue *ifq, struct in6_multi *inm, __func__, ip6_sprintf(ip6tbuf, &ims->im6s_addr)); now = im6s_get_mode(inm, ims, 1); if ((now != mode) || - (now == mode && mode == MCAST_UNDEFINED)) { + (now == mode && + (!use_block_allow && mode == MCAST_UNDEFINED))) { CTR1(KTR_MLD, "%s: skip node", __func__); continue; } @@ -2960,7 +3004,7 @@ mld_v2_dispatch_general_query(struct mld_ifinfo *mli) case MLD_AWAKENING_MEMBER: inm->in6m_state = MLD_REPORTING_MEMBER; retval = mld_v2_enqueue_group_record(&mli->mli_gq, - inm, 0, 0, 0); + inm, 0, 0, 0, 0); CTR2(KTR_MLD, "%s: enqueue record = %d", __func__, retval); break; diff --git a/sys/netinet6/mld6_var.h b/sys/netinet6/mld6_var.h index efd01abb5592..e62ec236ce5d 100644 --- a/sys/netinet6/mld6_var.h +++ b/sys/netinet6/mld6_var.h @@ -55,6 +55,7 @@ struct mld_ifinfo { struct ifqueue mli_gq; /* queue of general query responses */ }; #define MLIF_SILENT 0x00000001 /* Do not use MLD on this ifp */ +#define MLIF_USEALLOW 0x00000002 /* Use ALLOW/BLOCK for joins/leaves */ #define MLD_RANDOM_DELAY(X) (arc4random() % (X) + 1) #define MLD_MAX_STATE_CHANGES 24 /* Max pending changes per group */ diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index de1773ed669b..a32539b8972b 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -439,31 +439,27 @@ skip1: void nd6_llinfo_settimer_locked(struct llentry *ln, long tick) { + int canceled; + if (tick < 0) { ln->la_expire = 0; ln->ln_ntick = 0; - callout_stop(&ln->ln_timer_ch); - /* - * XXX - do we know that there is - * callout installed? i.e. are we - * guaranteed that we're not dropping - * a reference that we did not add? - * KMM - */ - LLE_REMREF(ln); + canceled = callout_stop(&ln->ln_timer_ch); } else { ln->la_expire = time_second + tick / hz; LLE_ADDREF(ln); if (tick > INT_MAX) { ln->ln_ntick = tick - INT_MAX; - callout_reset(&ln->ln_timer_ch, INT_MAX, + canceled = callout_reset(&ln->ln_timer_ch, INT_MAX, nd6_llinfo_timer, ln); } else { ln->ln_ntick = 0; - callout_reset(&ln->ln_timer_ch, tick, + canceled = callout_reset(&ln->ln_timer_ch, tick, nd6_llinfo_timer, ln); } } + if (canceled) + LLE_REMREF(ln); } void @@ -507,12 +503,13 @@ nd6_llinfo_timer(void *arg) ndi = ND_IFINFO(ifp); dst = &L3_ADDR_SIN6(ln)->sin6_addr; - if ((ln->la_flags & LLE_STATIC) || (ln->la_expire > time_second)) { + if (ln->la_flags & LLE_STATIC) { goto done; } if (ln->la_flags & LLE_DELETED) { (void)nd6_free(ln, 0); + ln = NULL; goto done; } @@ -581,10 +578,10 @@ nd6_llinfo_timer(void *arg) } break; } - CURVNET_RESTORE(); done: if (ln != NULL) LLE_FREE(ln); + CURVNET_RESTORE(); } @@ -767,22 +764,25 @@ regen_tmpaddr(struct in6_ifaddr *ia6) */ if (!IFA6_IS_DEPRECATED(it6)) public_ifa6 = it6; + + if (public_ifa6 != NULL) + ifa_ref(&public_ifa6->ia_ifa); } + IF_ADDR_UNLOCK(ifp); if (public_ifa6 != NULL) { int e; if ((e = in6_tmpifadd(public_ifa6, 0, 0)) != 0) { - IF_ADDR_UNLOCK(ifp); + ifa_free(&public_ifa6->ia_ifa); log(LOG_NOTICE, "regen_tmpaddr: failed to create a new" " tmp addr,errno=%d\n", e); return (-1); } - IF_ADDR_UNLOCK(ifp); + ifa_free(&public_ifa6->ia_ifa); return (0); } - IF_ADDR_UNLOCK(ifp); return (-1); } @@ -938,8 +938,28 @@ nd6_is_new_addr_neighbor(struct sockaddr_in6 *addr, struct ifnet *ifp) if (pr->ndpr_ifp != ifp) continue; - if (!(pr->ndpr_stateflags & NDPRF_ONLINK)) - continue; + if (!(pr->ndpr_stateflags & NDPRF_ONLINK)) { + struct rtentry *rt; + rt = rtalloc1((struct sockaddr *)&pr->ndpr_prefix, 0, 0); + if (rt == NULL) + continue; + /* + * This is the case where multiple interfaces + * have the same prefix, but only one is installed + * into the routing table and that prefix entry + * is not the one being examined here. In the case + * where RADIX_MPATH is enabled, multiple route + * entries (of the same rt_key value) will be + * installed because the interface addresses all + * differ. + */ + if (!IN6_ARE_ADDR_EQUAL(&pr->ndpr_prefix.sin6_addr, + &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr)) { + RTFREE_LOCKED(rt); + continue; + } + RTFREE_LOCKED(rt); + } if (IN6_ARE_MASKED_ADDR_EQUAL(&pr->ndpr_prefix.sin6_addr, &addr->sin6_addr, &pr->ndpr_mask)) @@ -1047,6 +1067,9 @@ nd6_free(struct llentry *ln, int gc) else nd6_llinfo_settimer(ln, (long)V_nd6_gctimer * hz); splx(s); + LLE_WLOCK(ln); + LLE_REMREF(ln); + LLE_WUNLOCK(ln); return (LIST_NEXT(ln, lle_next)); } diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index 23be4c5232c3..74f4954bf0f9 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -1629,7 +1629,7 @@ nd6_prefix_onlink(struct nd_prefix *pr) bzero(&mask6, sizeof(mask6)); mask6.sin6_len = sizeof(mask6); mask6.sin6_addr = pr->ndpr_mask; - rtflags = ifa->ifa_flags | RTF_UP; + rtflags = (ifa->ifa_flags & ~IFA_RTSELF) | RTF_UP; error = rtrequest(RTM_ADD, (struct sockaddr *)&pr->ndpr_prefix, ifa->ifa_addr, (struct sockaddr *)&mask6, rtflags, &rt); if (error == 0) { diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 108742d55b65..9f1236ab1bdb 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -184,7 +184,7 @@ rip6_input(struct mbuf **mp, int *offp, int proto) if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr) && !IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, &ip6->ip6_src)) continue; - if (jailed(in6p->inp_cred)) { + if (jailed_without_vnet(in6p->inp_cred)) { /* * Allow raw socket in jail to receive multicast; * assume process had PRIV_NETINET_RAW at attach, @@ -213,17 +213,39 @@ rip6_input(struct mbuf **mp, int *offp, int proto) */ if (in6p->in6p_moptions && IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) { - struct sockaddr_in6 mcaddr; + /* + * If the incoming datagram is for MLD, allow it + * through unconditionally to the raw socket. + * + * Use the M_RTALERT_MLD flag to check for MLD + * traffic without having to inspect the mbuf chain + * more deeply, as all MLDv1/v2 host messages MUST + * contain the Router Alert option. + * + * In the case of MLDv1, we may not have explicitly + * joined the group, and may have set IFF_ALLMULTI + * on the interface. im6o_mc_filter() may discard + * control traffic we actually need to see. + * + * Userland multicast routing daemons should continue + * filter the control traffic appropriately. + */ int blocked; - bzero(&mcaddr, sizeof(struct sockaddr_in6)); - mcaddr.sin6_len = sizeof(struct sockaddr_in6); - mcaddr.sin6_family = AF_INET6; - mcaddr.sin6_addr = ip6->ip6_dst; + blocked = MCAST_PASS; + if ((m->m_flags & M_RTALERT_MLD) == 0) { + struct sockaddr_in6 mcaddr; - blocked = im6o_mc_filter(in6p->in6p_moptions, ifp, - (struct sockaddr *)&mcaddr, - (struct sockaddr *)&fromsa); + bzero(&mcaddr, sizeof(struct sockaddr_in6)); + mcaddr.sin6_len = sizeof(struct sockaddr_in6); + mcaddr.sin6_family = AF_INET6; + mcaddr.sin6_addr = ip6->ip6_dst; + + blocked = im6o_mc_filter(in6p->in6p_moptions, + ifp, + (struct sockaddr *)&mcaddr, + (struct sockaddr *)&fromsa); + } if (blocked != MCAST_PASS) { IP6STAT_INC(ip6s_notmember); continue; diff --git a/sys/netipsec/ipcomp_var.h b/sys/netipsec/ipcomp_var.h index a9dbe86f6e16..78f18488221d 100644 --- a/sys/netipsec/ipcomp_var.h +++ b/sys/netipsec/ipcomp_var.h @@ -41,6 +41,7 @@ */ #define IPCOMP_ALG_MAX 8 +#define IPCOMPSTAT_VERSION 1 struct ipcompstat { u_int32_t ipcomps_hdrops; /* Packet shorter than header shows */ u_int32_t ipcomps_nopf; /* Protocol family not supported */ @@ -58,6 +59,9 @@ struct ipcompstat { u_int32_t ipcomps_pdrops; /* Packet blocked due to policy */ u_int32_t ipcomps_crypto; /* "Crypto" processing failure */ u_int32_t ipcomps_hist[IPCOMP_ALG_MAX];/* Per-algorithm op count */ + u_int32_t version; /* Version of this structure. */ + u_int32_t ipcomps_threshold; /* Packet < comp. algo. threshold. */ + u_int32_t ipcomps_uncompr; /* Compression was useles. */ }; #ifdef _KERNEL diff --git a/sys/netipsec/ipsec_mbuf.c b/sys/netipsec/ipsec_mbuf.c index 97f97142d6b2..ffbe6649b340 100644 --- a/sys/netipsec/ipsec_mbuf.c +++ b/sys/netipsec/ipsec_mbuf.c @@ -69,7 +69,7 @@ m_makespace(struct mbuf *m0, int skip, int hlen, int *off) * At this point skip is the offset into the mbuf m * where the new header should be placed. Figure out * if there's space to insert the new header. If so, - * and copying the remainder makese sense then do so. + * and copying the remainder makes sense then do so. * Otherwise insert a new mbuf in the chain, splitting * the contents of m as needed. */ diff --git a/sys/netipsec/key.c b/sys/netipsec/key.c index 3cc5a6c2fdc9..c5aa4b78ba8f 100644 --- a/sys/netipsec/key.c +++ b/sys/netipsec/key.c @@ -2852,9 +2852,10 @@ key_newsav(m, mhp, sah, errp, where, tag) sa_initref(newsav); newsav->state = SADB_SASTATE_LARVAL; - /* XXX locking??? */ + SAHTREE_LOCK(); LIST_INSERT_TAIL(&sah->savtree[SADB_SASTATE_LARVAL], newsav, secasvar, chain); + SAHTREE_UNLOCK(); done: KEYDEBUG(KEYDEBUG_IPSEC_STAMP, printf("DP %s from %s:%u return SP:%p\n", __func__, @@ -5698,8 +5699,8 @@ key_delete(so, m, mhp) } key_sa_chgstate(sav, SADB_SASTATE_DEAD); - SAHTREE_UNLOCK(); KEY_FREESAV(&sav); + SAHTREE_UNLOCK(); { struct mbuf *n; diff --git a/sys/netipsec/keydb.h b/sys/netipsec/keydb.h index 35a01229f7f2..07e1f6024e0c 100644 --- a/sys/netipsec/keydb.h +++ b/sys/netipsec/keydb.h @@ -52,7 +52,7 @@ union sockaddr_union { /* Security Assocciation Index */ /* NOTE: Ensure to be same address family */ struct secasindex { - union sockaddr_union src; /* srouce address for SA */ + union sockaddr_union src; /* source address for SA */ union sockaddr_union dst; /* destination address for SA */ u_int16_t proto; /* IPPROTO_ESP or IPPROTO_AH */ u_int8_t mode; /* mode of protocol, see ipsec.h */ diff --git a/sys/netipsec/xform_esp.c b/sys/netipsec/xform_esp.c index 135be9d1ffe7..dbacd7714757 100644 --- a/sys/netipsec/xform_esp.c +++ b/sys/netipsec/xform_esp.c @@ -282,9 +282,15 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff) IPSEC_ASSERT(sav != NULL, ("null SA")); IPSEC_ASSERT(sav->tdb_encalgxform != NULL, ("null encoding xform")); - IPSEC_ASSERT((skip&3) == 0 && (m->m_pkthdr.len&3) == 0, - ("misaligned packet, skip %u pkt len %u", - skip, m->m_pkthdr.len)); + + /* Valid IP Packet length ? */ + if ( (skip&3) || (m->m_pkthdr.len&3) ){ + DPRINTF(("%s: misaligned packet, skip %u pkt len %u", + __func__, skip, m->m_pkthdr.len)); + V_espstat.esps_badilen++; + m_freem(m); + return EINVAL; + } /* XXX don't pullup, just copy header */ IP6_EXTHDR_GET(esp, struct newesp *, m, skip, sizeof (struct newesp)); diff --git a/sys/netipsec/xform_ipcomp.c b/sys/netipsec/xform_ipcomp.c index 4049154ac3ee..d528d2abd609 100644 --- a/sys/netipsec/xform_ipcomp.c +++ b/sys/netipsec/xform_ipcomp.c @@ -68,7 +68,7 @@ #include #include -VNET_DEFINE(int, ipcomp_enable) = 0; +VNET_DEFINE(int, ipcomp_enable) = 1; VNET_DEFINE(struct ipcompstat, ipcompstat); SYSCTL_DECL(_net_inet_ipcomp); @@ -249,10 +249,8 @@ ipcomp_input_cb(struct cryptop *crp) if (crp->crp_etype == EAGAIN) { KEY_FREESAV(&sav); - error = crypto_dispatch(crp); - return error; + return crypto_dispatch(crp); } - V_ipcompstat.ipcomps_noxform++; DPRINTF(("%s: crypto error %d\n", __func__, crp->crp_etype)); error = crp->crp_etype; @@ -330,34 +328,40 @@ ipcomp_output( { struct secasvar *sav; struct comp_algo *ipcompx; - int error, ralen, hlen, maxpacketsize, roff; - u_int8_t prot; + int error, ralen, maxpacketsize; struct cryptodesc *crdc; struct cryptop *crp; struct tdb_crypto *tc; - struct mbuf *mo; - struct ipcomp *ipcomp; sav = isr->sav; IPSEC_ASSERT(sav != NULL, ("null SA")); ipcompx = sav->tdb_compalgxform; IPSEC_ASSERT(ipcompx != NULL, ("null compression xform")); - ralen = m->m_pkthdr.len - skip; /* Raw payload length before comp. */ - hlen = IPCOMP_HLENGTH; + /* + * Do not touch the packet in case our payload to compress + * is lower than the minimal threshold of the compression + * alogrithm. We will just send out the data uncompressed. + * See RFC 3173, 2.2. Non-Expansion Policy. + */ + if (m->m_pkthdr.len <= ipcompx->minlen) { + V_ipcompstat.ipcomps_threshold++; + return ipsec_process_done(m, isr); + } + ralen = m->m_pkthdr.len - skip; /* Raw payload length before comp. */ V_ipcompstat.ipcomps_output++; /* Check for maximum packet size violations. */ switch (sav->sah->saidx.dst.sa.sa_family) { #ifdef INET case AF_INET: - maxpacketsize = IP_MAXPACKET; + maxpacketsize = IP_MAXPACKET; break; #endif /* INET */ #ifdef INET6 case AF_INET6: - maxpacketsize = IPV6_MAXPACKET; + maxpacketsize = IPV6_MAXPACKET; break; #endif /* INET6 */ default: @@ -370,13 +374,13 @@ ipcomp_output( error = EPFNOSUPPORT; goto bad; } - if (skip + hlen + ralen > maxpacketsize) { + if (ralen + skip + IPCOMP_HLENGTH > maxpacketsize) { V_ipcompstat.ipcomps_toobig++; DPRINTF(("%s: packet in IPCA %s/%08lx got too big " "(len %u, max len %u)\n", __func__, ipsec_address(&sav->sah->saidx.dst), (u_long) ntohl(sav->spi), - skip + hlen + ralen, maxpacketsize)); + ralen + skip + IPCOMP_HLENGTH, maxpacketsize)); error = EMSGSIZE; goto bad; } @@ -394,40 +398,7 @@ ipcomp_output( goto bad; } - /* Inject IPCOMP header */ - mo = m_makespace(m, skip, hlen, &roff); - if (mo == NULL) { - V_ipcompstat.ipcomps_wrap++; - DPRINTF(("%s: IPCOMP header inject failed for IPCA %s/%08lx\n", - __func__, ipsec_address(&sav->sah->saidx.dst), - (u_long) ntohl(sav->spi))); - error = ENOBUFS; - goto bad; - } - ipcomp = (struct ipcomp *)(mtod(mo, caddr_t) + roff); - - /* Initialize the IPCOMP header */ - /* XXX alignment always correct? */ - switch (sav->sah->saidx.dst.sa.sa_family) { -#ifdef INET - case AF_INET: - ipcomp->comp_nxt = mtod(m, struct ip *)->ip_p; - break; -#endif /* INET */ -#ifdef INET6 - case AF_INET6: - ipcomp->comp_nxt = mtod(m, struct ip6_hdr *)->ip6_nxt; - break; -#endif - } - ipcomp->comp_flags = 0; - ipcomp->comp_cpi = htons((u_int16_t) ntohl(sav->spi)); - - /* Fix Next Protocol in IPv4/IPv6 header */ - prot = IPPROTO_IPCOMP; - m_copyback(m, protoff, sizeof(u_int8_t), (u_char *) &prot); - - /* Ok now, we can pass to the crypto processing */ + /* Ok now, we can pass to the crypto processing. */ /* Get crypto descriptors */ crp = crypto_getreq(1); @@ -440,10 +411,10 @@ ipcomp_output( crdc = crp->crp_desc; /* Compression descriptor */ - crdc->crd_skip = skip + hlen; - crdc->crd_len = m->m_pkthdr.len - (skip + hlen); + crdc->crd_skip = skip; + crdc->crd_len = ralen; crdc->crd_flags = CRD_F_COMP; - crdc->crd_inject = skip + hlen; + crdc->crd_inject = skip; /* Compression operation */ crdc->crd_alg = ipcompx->type; @@ -463,7 +434,8 @@ ipcomp_output( tc->tc_spi = sav->spi; tc->tc_dst = sav->sah->saidx.dst; tc->tc_proto = sav->sah->saidx.proto; - tc->tc_skip = skip + hlen; + tc->tc_protoff = protoff; + tc->tc_skip = skip; /* Crypto operation descriptor */ crp->crp_ilen = m->m_pkthdr.len; /* Total input length */ @@ -490,13 +462,12 @@ ipcomp_output_cb(struct cryptop *crp) struct ipsecrequest *isr; struct secasvar *sav; struct mbuf *m; - int error, skip, rlen; + int error, skip; tc = (struct tdb_crypto *) crp->crp_opaque; IPSEC_ASSERT(tc != NULL, ("null opaque data area!")); m = (struct mbuf *) crp->crp_buf; skip = tc->tc_skip; - rlen = crp->crp_ilen - skip; isr = tc->tc_isr; IPSECREQUEST_LOCK(isr); @@ -511,15 +482,14 @@ ipcomp_output_cb(struct cryptop *crp) /* Check for crypto errors */ if (crp->crp_etype) { - /* Reset session ID */ + /* Reset the session ID */ if (sav->tdb_cryptoid != 0) sav->tdb_cryptoid = crp->crp_sid; if (crp->crp_etype == EAGAIN) { KEY_FREESAV(&sav); IPSECREQUEST_UNLOCK(isr); - error = crypto_dispatch(crp); - return error; + return crypto_dispatch(crp); } V_ipcompstat.ipcomps_noxform++; DPRINTF(("%s: crypto error %d\n", __func__, crp->crp_etype)); @@ -535,7 +505,46 @@ ipcomp_output_cb(struct cryptop *crp) } V_ipcompstat.ipcomps_hist[sav->alg_comp]++; - if (rlen > crp->crp_olen) { + if (crp->crp_ilen - skip > crp->crp_olen) { + struct mbuf *mo; + struct ipcomp *ipcomp; + int roff; + uint8_t prot; + + /* Compression helped, inject IPCOMP header. */ + mo = m_makespace(m, skip, IPCOMP_HLENGTH, &roff); + if (mo == NULL) { + V_ipcompstat.ipcomps_wrap++; + DPRINTF(("%s: IPCOMP header inject failed for IPCA %s/%08lx\n", + __func__, ipsec_address(&sav->sah->saidx.dst), + (u_long) ntohl(sav->spi))); + error = ENOBUFS; + goto bad; + } + ipcomp = (struct ipcomp *)(mtod(mo, caddr_t) + roff); + + /* Initialize the IPCOMP header */ + /* XXX alignment always correct? */ + switch (sav->sah->saidx.dst.sa.sa_family) { +#ifdef INET + case AF_INET: + ipcomp->comp_nxt = mtod(m, struct ip *)->ip_p; + break; +#endif /* INET */ +#ifdef INET6 + case AF_INET6: + ipcomp->comp_nxt = mtod(m, struct ip6_hdr *)->ip6_nxt; + break; +#endif + } + ipcomp->comp_flags = 0; + ipcomp->comp_cpi = htons((u_int16_t) ntohl(sav->spi)); + + /* Fix Next Protocol in IPv4/IPv6 header */ + prot = IPPROTO_IPCOMP; + m_copyback(m, tc->tc_protoff, sizeof(u_int8_t), + (u_char *)&prot); + /* Adjust the length in the IP header */ switch (sav->sah->saidx.dst.sa.sa_family) { #ifdef INET @@ -554,14 +563,18 @@ ipcomp_output_cb(struct cryptop *crp) DPRINTF(("%s: unknown/unsupported protocol " "family %d, IPCA %s/%08lx\n", __func__, sav->sah->saidx.dst.sa.sa_family, - ipsec_address(&sav->sah->saidx.dst), + ipsec_address(&sav->sah->saidx.dst), (u_long) ntohl(sav->spi))); error = EPFNOSUPPORT; goto bad; } } else { - /* compression was useless, we have lost time */ - /* XXX add statistic */ + /* Compression was useless, we have lost time. */ + V_ipcompstat.ipcomps_uncompr++; + DPRINTF(("%s: compressions was useless %d - %d <= %d\n", + __func__, crp->crp_ilen, skip, crp->crp_olen)); + /* XXX remember state to not compress the next couple + * of packets, RFC 3173, 2.2. Non-Expansion Policy */ } /* Release the crypto descriptor */ @@ -598,3 +611,13 @@ ipcomp_attach(void) } SYSINIT(ipcomp_xform_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, ipcomp_attach, NULL); + +static void +vnet_ipcomp_attach(const void *unused __unused) +{ + + V_ipcompstat.version = IPCOMPSTAT_VERSION; +} + +VNET_SYSINIT(vnet_ipcomp_xform_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, + vnet_ipcomp_attach, NULL); diff --git a/sys/nfs/nfs_common.c b/sys/nfs/nfs_common.c index b2c231fc61e5..c56f31f9331a 100644 --- a/sys/nfs/nfs_common.c +++ b/sys/nfs/nfs_common.c @@ -37,7 +37,7 @@ __FBSDID("$FreeBSD$"); /* * These functions support the macros and help fiddle mbuf chains for - * the nfs op functions. They do things like create the rpc header and + * the nfs op functions. They do things like create the rpc header and * copy data between mbuf chains and uio lists. */ @@ -54,8 +54,10 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include +#include #include #include @@ -75,10 +77,21 @@ nfstype nfsv3_type[9] = { NFNON, NFREG, NFDIR, NFBLK, NFCHR, NFLNK, NFSOCK, NFFIFO, NFNON }; -static void *nfsm_dissect_xx_sub(int s, struct mbuf **md, caddr_t *dpos, int how); +static void *nfsm_dissect_xx_sub(int s, struct mbuf **md, caddr_t *dpos, + int how); + +SYSCTL_NODE(_vfs, OID_AUTO, nfs_common, CTLFLAG_RD, 0, "NFS common support"); + +static int nfs_realign_test; +SYSCTL_INT(_vfs_nfs_common, OID_AUTO, realign_test, CTLFLAG_RD, + &nfs_realign_test, 0, "Number of realign tests done"); + +static int nfs_realign_count; +SYSCTL_INT(_vfs_nfs_common, OID_AUTO, realign_count, CTLFLAG_RD, + &nfs_realign_count, 0, "Number of mbuf realignments done"); u_quad_t -nfs_curusec(void) +nfs_curusec(void) { struct timeval tv; @@ -176,7 +189,7 @@ nfsm_disct(struct mbuf **mdp, caddr_t *dposp, int siz, int left, int how) while (left == 0) { *mdp = mp = mp->m_next; if (mp == NULL) - return NULL; + return (NULL); left = mp->m_len; *dposp = mtod(mp, caddr_t); } @@ -184,13 +197,13 @@ nfsm_disct(struct mbuf **mdp, caddr_t *dposp, int siz, int left, int how) ret = *dposp; *dposp += siz; } else if (mp->m_next == NULL) { - return NULL; + return (NULL); } else if (siz > MHLEN) { panic("nfs S too big"); } else { MGET(mp2, how, MT_DATA); if (mp2 == NULL) - return NULL; + return (NULL); mp2->m_len = siz; mp2->m_next = mp->m_next; mp->m_next = mp2; @@ -206,7 +219,7 @@ nfsm_disct(struct mbuf **mdp, caddr_t *dposp, int siz, int left, int how) /* Loop around copying up the siz2 bytes */ while (siz2 > 0) { if (mp2 == NULL) - return NULL; + return (NULL); xfer = (siz2 > mp2->m_len) ? mp2->m_len : siz2; if (xfer > 0) { bcopy(mtod(mp2, caddr_t), ptr, xfer); @@ -229,7 +242,7 @@ nfsm_disct(struct mbuf **mdp, caddr_t *dposp, int siz, int left, int how) *dposp = npos; } } - return ret; + return (ret); } /* @@ -273,19 +286,21 @@ nfsm_build_xx(int s, struct mbuf **mb, caddr_t *bpos) ret = *bpos; (*mb)->m_len += s; *bpos += s; - return ret; + return (ret); } void * nfsm_dissect_xx(int s, struct mbuf **md, caddr_t *dpos) { - return nfsm_dissect_xx_sub(s, md, dpos, M_WAIT); + + return (nfsm_dissect_xx_sub(s, md, dpos, M_WAIT)); } void * nfsm_dissect_xx_nonblock(int s, struct mbuf **md, caddr_t *dpos) { - return nfsm_dissect_xx_sub(s, md, dpos, M_DONTWAIT); + + return (nfsm_dissect_xx_sub(s, md, dpos, M_DONTWAIT)); } static void * @@ -299,10 +314,10 @@ nfsm_dissect_xx_sub(int s, struct mbuf **md, caddr_t *dpos, int how) if (t1 >= s) { ret = *dpos; *dpos += s; - return ret; + return (ret); } - cp2 = nfsm_disct(md, dpos, s, t1, how); - return cp2; + cp2 = nfsm_disct(md, dpos, s, t1, how); + return (cp2); } int @@ -312,11 +327,11 @@ nfsm_strsiz_xx(int *s, int m, struct mbuf **mb, caddr_t *bpos) tl = nfsm_dissect_xx(NFSX_UNSIGNED, mb, bpos); if (tl == NULL) - return EBADRPC; + return (EBADRPC); *s = fxdr_unsigned(int32_t, *tl); if (*s > m) - return EBADRPC; - return 0; + return (EBADRPC); + return (0); } int @@ -327,10 +342,75 @@ nfsm_adv_xx(int s, struct mbuf **md, caddr_t *dpos) t1 = mtod(*md, caddr_t) + (*md)->m_len - *dpos; if (t1 >= s) { *dpos += s; - return 0; + return (0); } t1 = nfs_adv(md, dpos, s, t1); if (t1) - return t1; - return 0; + return (t1); + return (0); } + +/* + * Check for badly aligned mbuf data and realign by copying the unaligned + * portion of the data into a new mbuf chain and freeing the portions of the + * old chain that were replaced. + * + * We cannot simply realign the data within the existing mbuf chain because + * the underlying buffers may contain other rpc commands and we cannot afford + * to overwrite them. + * + * We would prefer to avoid this situation entirely. The situation does not + * occur with NFS/UDP and is supposed to only occassionally occur with TCP. + * Use vfs.nfs.realign_count and realign_test to check this. + */ +int +nfs_realign(struct mbuf **pm, int how) +{ + struct mbuf *m, *n; + int off; + + ++nfs_realign_test; + while ((m = *pm) != NULL) { + if (!nfsm_aligned(m->m_len, u_int32_t) || + !nfsm_aligned(mtod(m, intptr_t), u_int32_t)) { + /* + * NB: we can't depend on m_pkthdr.len to help us + * decide what to do here. May not be worth doing + * the m_length calculation as m_copyback will + * expand the mbuf chain below as needed. + */ + if (m_length(m, NULL) >= MINCLSIZE) { + /* NB: m_copyback handles space > MCLBYTES */ + n = m_getcl(how, MT_DATA, 0); + } else + n = m_get(how, MT_DATA); + if (n == NULL) + return (ENOMEM); + /* + * Align the remainder of the mbuf chain. + */ + n->m_len = 0; + off = 0; + while (m != NULL) { + m_copyback(n, off, m->m_len, mtod(m, caddr_t)); + off += m->m_len; + m = m->m_next; + } + m_freem(*pm); + *pm = n; + ++nfs_realign_count; + break; + } + pm = &m->m_next; + } + return (0); +} + +static moduledata_t nfs_common_mod = { + "nfs_common", + NULL, + NULL +}; + +DECLARE_MODULE(nfs_common, nfs_common_mod, SI_SUB_VFS, SI_ORDER_ANY); +MODULE_VERSION(nfs_common, 1); diff --git a/sys/nfs/nfs_common.h b/sys/nfs/nfs_common.h index 7c0613095939..1c0b31594119 100644 --- a/sys/nfs/nfs_common.h +++ b/sys/nfs/nfs_common.h @@ -33,7 +33,6 @@ * $FreeBSD$ */ - #ifndef _NFS_NFS_COMMON_H_ #define _NFS_NFS_COMMON_H_ @@ -49,6 +48,7 @@ extern nfstype nfsv3_type[]; int nfs_adv(struct mbuf **, caddr_t *, int, int); u_quad_t nfs_curusec(void); void *nfsm_disct(struct mbuf **, caddr_t *, int, int, int); +int nfs_realign(struct mbuf **, int); /* ****************************** */ /* Build request/reply phase macros */ @@ -86,7 +86,7 @@ do { \ goto nfsmout; \ } \ } while (0) - + #define nfsm_dissect(c, s) \ ({ \ void *ret; \ diff --git a/sys/nfsclient/bootp_subr.c b/sys/nfsclient/bootp_subr.c index e57b32a1bedb..cff72c7f2bc4 100644 --- a/sys/nfsclient/bootp_subr.c +++ b/sys/nfsclient/bootp_subr.c @@ -584,6 +584,8 @@ bootpc_call(struct bootpc_globalcontext *gctx, struct thread *td) int retry; const char *s; + CURVNET_SET(TD_TO_VNET(td)); + /* * Create socket and set its recieve timeout. */ @@ -960,6 +962,7 @@ gotreply: out: soclose(so); out0: + CURVNET_RESTORE(); return error; } @@ -974,6 +977,8 @@ bootpc_fakeup_interface(struct bootpc_ifcontext *ifctx, struct ifaddr *ifa; struct sockaddr_dl *sdl; + CURVNET_SET(TD_TO_VNET(td)); + error = socreate(AF_INET, &ifctx->so, SOCK_DGRAM, 0, td->td_ucred, td); if (error != 0) panic("nfs_boot: socreate, error=%d", error); @@ -1048,6 +1053,8 @@ bootpc_fakeup_interface(struct bootpc_ifcontext *ifctx, ifctx->ireq.ifr_name); ifctx->sdl = sdl; + CURVNET_RESTORE(); + return error; } @@ -1325,7 +1332,7 @@ bootpc_compose_query(struct bootpc_ifcontext *ifctx, *vendp++ = TAG_VENDOR_INDENTIFIER; *vendp++ = vendor_client_len; memcpy(vendp, vendor_client, vendor_client_len); - vendp += vendor_client_len;; + vendp += vendor_client_len; ifctx->dhcpquerytype = DHCP_NOMSG; switch (ifctx->state) { case IF_DHCP_UNRESOLVED: diff --git a/sys/nfsclient/krpc_subr.c b/sys/nfsclient/krpc_subr.c index 996cb050bd77..c2a84506390b 100644 --- a/sys/nfsclient/krpc_subr.c +++ b/sys/nfsclient/krpc_subr.c @@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -55,6 +56,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include @@ -213,6 +216,8 @@ krpc_call(struct sockaddr_in *sa, u_int prog, u_int vers, u_int func, nam = mhead = NULL; from = NULL; + CURVNET_SET(TD_TO_VNET(td)); + /* * Create socket and set its recieve timeout. */ @@ -425,6 +430,7 @@ krpc_call(struct sockaddr_in *sa, u_int prog, u_int vers, u_int func, if (mhead) m_freem(mhead); if (from) free(from, M_SONAME); soclose(so); + CURVNET_RESTORE(); return error; } diff --git a/sys/nfsclient/nfs.h b/sys/nfsclient/nfs.h index 18eae3bae743..6f6e0d33ad50 100644 --- a/sys/nfsclient/nfs.h +++ b/sys/nfsclient/nfs.h @@ -252,7 +252,7 @@ int nfs_writerpc(struct vnode *, struct uio *, struct ucred *, int *, int nfs_commit(struct vnode *vp, u_quad_t offset, int cnt, struct ucred *cred, struct thread *td); int nfs_readdirrpc(struct vnode *, struct uio *, struct ucred *); -int nfs_nfsiodnew(void); +int nfs_nfsiodnew(int); int nfs_asyncio(struct nfsmount *, struct buf *, struct ucred *, struct thread *); int nfs_doio(struct vnode *, struct buf *, struct ucred *, struct thread *); void nfs_doio_directwrite (struct buf *); diff --git a/sys/nfsclient/nfs_bio.c b/sys/nfsclient/nfs_bio.c index 945bc51597de..cec0220b7f15 100644 --- a/sys/nfsclient/nfs_bio.c +++ b/sys/nfsclient/nfs_bio.c @@ -1377,7 +1377,7 @@ again: * Find a free iod to process this request. */ for (iod = 0; iod < nfs_numasync; iod++) - if (nfs_iodwant[iod]) { + if (nfs_iodwant[iod] == NFSIOD_AVAILABLE) { gotiod = TRUE; break; } @@ -1386,7 +1386,7 @@ again: * Try to create one if none are free. */ if (!gotiod) { - iod = nfs_nfsiodnew(); + iod = nfs_nfsiodnew(1); if (iod != -1) gotiod = TRUE; } @@ -1398,7 +1398,7 @@ again: */ NFS_DPF(ASYNCIO, ("nfs_asyncio: waking iod %d for mount %p\n", iod, nmp)); - nfs_iodwant[iod] = NULL; + nfs_iodwant[iod] = NFSIOD_NOT_AVAILABLE; nfs_iodmount[iod] = nmp; nmp->nm_bufqiods++; wakeup(&nfs_iodwant[iod]); diff --git a/sys/nfsclient/nfs_kdtrace.c b/sys/nfsclient/nfs_kdtrace.c index cc6ba456c02c..3a478e0abf26 100644 --- a/sys/nfsclient/nfs_kdtrace.c +++ b/sys/nfsclient/nfs_kdtrace.c @@ -500,15 +500,11 @@ dtnfsclient_load(void *dummy) static int dtnfsclient_unload() { - int error = 0; dtrace_nfsclient_nfs23_start_probe = NULL; dtrace_nfsclient_nfs23_done_probe = NULL; - if ((error = dtrace_unregister(dtnfsclient_id)) != 0) - return (error); - - return (error); + return (dtrace_unregister(dtnfsclient_id)); } static int @@ -543,3 +539,4 @@ DEV_MODULE(dtnfsclient, dtnfsclient_modevent, NULL); MODULE_VERSION(dtnfsclient, 1); MODULE_DEPEND(dtnfsclient, dtrace, 1, 1, 1); MODULE_DEPEND(dtnfsclient, opensolaris, 1, 1, 1); +MODULE_DEPEND(dtnfsclient, nfs, 1, 1, 1); diff --git a/sys/nfsclient/nfs_krpc.c b/sys/nfsclient/nfs_krpc.c index 098c46b06a9f..bfb1ea177eff 100644 --- a/sys/nfsclient/nfs_krpc.c +++ b/sys/nfsclient/nfs_krpc.c @@ -87,8 +87,6 @@ uint32_t nfsclient_nfs3_start_probes[NFS_NPROCS]; uint32_t nfsclient_nfs3_done_probes[NFS_NPROCS]; #endif -static int nfs_realign_test; -static int nfs_realign_count; static int nfs_bufpackets = 4; static int nfs_reconnects; static int nfs3_jukebox_delay = 10; @@ -97,17 +95,15 @@ static int fake_wchan; SYSCTL_DECL(_vfs_nfs); -SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_test, CTLFLAG_RW, &nfs_realign_test, 0, - "Number of realign tests done"); -SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_count, CTLFLAG_RW, &nfs_realign_count, 0, - "Number of mbuf realignments done"); SYSCTL_INT(_vfs_nfs, OID_AUTO, bufpackets, CTLFLAG_RW, &nfs_bufpackets, 0, "Buffer reservation size 2 < x < 64"); SYSCTL_INT(_vfs_nfs, OID_AUTO, reconnects, CTLFLAG_RD, &nfs_reconnects, 0, "Number of times the nfs client has had to reconnect"); -SYSCTL_INT(_vfs_nfs, OID_AUTO, nfs3_jukebox_delay, CTLFLAG_RW, &nfs3_jukebox_delay, 0, +SYSCTL_INT(_vfs_nfs, OID_AUTO, nfs3_jukebox_delay, CTLFLAG_RW, + &nfs3_jukebox_delay, 0, "Number of seconds to delay a retry after receiving EJUKEBOX"); -SYSCTL_INT(_vfs_nfs, OID_AUTO, skip_wcc_data_onerr, CTLFLAG_RW, &nfs_skip_wcc_data_onerr, 0, +SYSCTL_INT(_vfs_nfs, OID_AUTO, skip_wcc_data_onerr, CTLFLAG_RW, + &nfs_skip_wcc_data_onerr, 0, "Disable weak cache consistency checking when server returns an error"); static void nfs_down(struct nfsmount *, struct thread *, const char *, @@ -160,7 +156,8 @@ static enum nfs_rto_timer_t nfs_proct[NFS_NPROCS] = { static inline enum nfs_rto_timer_t nfs_rto_timer(u_int32_t procnum) { - return nfs_proct[procnum]; + + return (nfs_proct[procnum]); } /* @@ -225,7 +222,7 @@ nfs_connect(struct nfsmount *nmp) nconf = getnetconfigent("udp6"); else nconf = getnetconfigent("tcp6"); - + /* * Get buffer reservation size from sysctl, but impose reasonable * limits. @@ -273,9 +270,8 @@ nfs_connect(struct nfsmount *nmp) * Someone else already connected. */ CLNT_RELEASE(client); - } else { + } else nmp->nm_client = client; - } /* * Protocols that do not require connections may be optionally left @@ -284,22 +280,21 @@ nfs_connect(struct nfsmount *nmp) if (!(nmp->nm_flag & NFSMNT_NOCONN)) { mtx_unlock(&nmp->nm_mtx); CLNT_CONTROL(client, CLSET_CONNECT, &one); - } else { + } else mtx_unlock(&nmp->nm_mtx); - } /* Restore current thread's credentials. */ td->td_ucred = origcred; mtx_lock(&nmp->nm_mtx); - /* Initialize other non-zero congestion variables */ + /* Initialize other non-zero congestion variables. */ nfs_init_rtt(nmp); mtx_unlock(&nmp->nm_mtx); return (0); } /* - * NFS disconnect. Clean up and unlink. + * NFS disconnect. Clean up and unlink. */ void nfs_disconnect(struct nfsmount *nmp) @@ -316,9 +311,8 @@ nfs_disconnect(struct nfsmount *nmp) #endif CLNT_CLOSE(client); CLNT_RELEASE(client); - } else { + } else mtx_unlock(&nmp->nm_mtx); - } } void @@ -341,11 +335,10 @@ nfs_getauth(struct nfsmount *nmp, struct ucred *cred) case RPCSEC_GSS_KRB5: case RPCSEC_GSS_KRB5I: case RPCSEC_GSS_KRB5P: - if (!nmp->nm_mech_oid) { + if (!nmp->nm_mech_oid) if (!rpc_gss_mech_to_oid("kerberosv5", - &nmp->nm_mech_oid)) + &nmp->nm_mech_oid)) return (NULL); - } if (nmp->nm_secflavor == RPCSEC_GSS_KRB5) svc = rpc_gss_svc_none; else if (nmp->nm_secflavor == RPCSEC_GSS_KRB5I) @@ -403,65 +396,6 @@ nfs_feedback(int type, int proc, void *arg) } } -/* - * nfs_realign: - * - * Check for badly aligned mbuf data and realign by copying the unaligned - * portion of the data into a new mbuf chain and freeing the portions - * of the old chain that were replaced. - * - * We cannot simply realign the data within the existing mbuf chain - * because the underlying buffers may contain other rpc commands and - * we cannot afford to overwrite them. - * - * We would prefer to avoid this situation entirely. The situation does - * not occur with NFS/UDP and is supposed to only occassionally occur - * with TCP. Use vfs.nfs.realign_count and realign_test to check this. - * - */ -static int -nfs_realign(struct mbuf **pm, int hsiz) -{ - struct mbuf *m, *n; - int off, space; - - ++nfs_realign_test; - while ((m = *pm) != NULL) { - if ((m->m_len & 0x3) || (mtod(m, intptr_t) & 0x3)) { - /* - * NB: we can't depend on m_pkthdr.len to help us - * decide what to do here. May not be worth doing - * the m_length calculation as m_copyback will - * expand the mbuf chain below as needed. - */ - space = m_length(m, NULL); - if (space >= MINCLSIZE) { - /* NB: m_copyback handles space > MCLBYTES */ - n = m_getcl(M_DONTWAIT, MT_DATA, 0); - } else - n = m_get(M_DONTWAIT, MT_DATA); - if (n == NULL) - return (ENOMEM); - /* - * Align the remainder of the mbuf chain. - */ - n->m_len = 0; - off = 0; - while (m != NULL) { - m_copyback(n, off, m->m_len, mtod(m, caddr_t)); - off += m->m_len; - m = m->m_next; - } - m_freem(*pm); - *pm = n; - ++nfs_realign_count; - break; - } - pm = &m->m_next; - } - return (0); -} - /* * nfs_request - goes something like this * - fill in request struct @@ -503,10 +437,10 @@ nfs_request(struct vnode *vp, struct mbuf *mreq, int procnum, nf.nf_td = td; getmicrouptime(&now); nf.nf_lastmsg = now.tv_sec - - ((nmp->nm_tprintf_delay) - (nmp->nm_tprintf_initial_delay)); + ((nmp->nm_tprintf_delay) - (nmp->nm_tprintf_initial_delay)); /* - * XXX if not already connected call nfs_connect now. Longer + * XXX if not already connected call nfs_connect now. Longer * term, change nfs_mount to call nfs_connect unconditionally * and let clnt_reconnect_create handle reconnects. */ @@ -526,18 +460,17 @@ nfs_request(struct vnode *vp, struct mbuf *mreq, int procnum, /* * Use a conservative timeout for RPCs other than getattr, - * lookup, read or write. The justification for doing "other" + * lookup, read or write. The justification for doing "other" * this way is that these RPCs happen so infrequently that * timer est. would probably be stale. Also, since many of * these RPCs are non-idempotent, a conservative timeout is * desired. */ timer = nfs_rto_timer(procnum); - if (timer != NFS_DEFAULT_TIMER) { + if (timer != NFS_DEFAULT_TIMER) ext.rc_timers = &nmp->nm_timers[timer - 1]; - } else { + else ext.rc_timers = NULL; - } #ifdef KDTRACE_HOOKS if (dtrace_nfsclient_nfs23_start_probe != NULL) { @@ -570,17 +503,16 @@ tryagain: * If there was a successful reply and a tprintf msg. * tprintf a response. */ - if (stat == RPC_SUCCESS) { + if (stat == RPC_SUCCESS) error = 0; - } else if (stat == RPC_TIMEDOUT) { + else if (stat == RPC_TIMEDOUT) error = ETIMEDOUT; - } else if (stat == RPC_VERSMISMATCH) { + else if (stat == RPC_VERSMISMATCH) error = EOPNOTSUPP; - } else if (stat == RPC_PROGVERSMISMATCH) { + else if (stat == RPC_PROGVERSMISMATCH) error = EPROTONOSUPPORT; - } else { + else error = EACCES; - } if (error) goto nfsmout; @@ -592,7 +524,7 @@ tryagain: * These could cause pointer alignment problems, so copy them to * well aligned mbufs. */ - error = nfs_realign(&mrep, 2 * NFSX_UNSIGNED); + error = nfs_realign(&mrep, M_DONTWAIT); if (error == ENOMEM) { m_freem(mrep); AUTH_DESTROY(auth); @@ -609,9 +541,9 @@ tryagain: m_freem(mrep); error = 0; waituntil = time_second + nfs3_jukebox_delay; - while (time_second < waituntil) { - (void) tsleep(&fake_wchan, PSOCK, "nqnfstry", hz); - } + while (time_second < waituntil) + (void)tsleep(&fake_wchan, PSOCK, "nqnfstry", + hz); goto tryagain; } @@ -622,12 +554,13 @@ tryagain: if (error == ESTALE) nfs_purgecache(vp); /* - * Skip wcc data on NFS errors for now. NetApp filers + * Skip wcc data on NFS errors for now. NetApp filers * return corrupt postop attrs in the wcc data for NFS - * err EROFS. Not sure if they could return corrupt + * err EROFS. Not sure if they could return corrupt * postop attrs for others errors. */ - if ((nmp->nm_flag & NFSMNT_NFSV3) && !nfs_skip_wcc_data_onerr) { + if ((nmp->nm_flag & NFSMNT_NFSV3) && + !nfs_skip_wcc_data_onerr) { *mrp = mrep; *mdp = md; *dposp = dpos; @@ -689,7 +622,7 @@ nfsmout: /* * Mark all of an nfs mount's outstanding requests with R_SOFTTERM and - * wait for all requests to complete. This is used by forced unmounts + * wait for all requests to complete. This is used by forced unmounts * to terminate any outstanding RPCs. */ int @@ -703,7 +636,7 @@ nfs_nmcancelreqs(struct nfsmount *nmp) /* * Any signal that can interrupt an NFS operation in an intr mount - * should be added to this set. SIGSTOP and SIGKILL cannot be masked. + * should be added to this set. SIGSTOP and SIGKILL cannot be masked. */ int nfs_sig_set[] = { SIGINT, @@ -722,16 +655,16 @@ static int nfs_sig_pending(sigset_t set) { int i; - + for (i = 0 ; i < sizeof(nfs_sig_set)/sizeof(int) ; i++) if (SIGISMEMBER(set, nfs_sig_set[i])) return (1); return (0); } - + /* * The set/restore sigmask functions are used to (temporarily) overwrite - * the process p_sigmask during an RPC call (for example). These are also + * the process p_sigmask during an RPC call (for example). These are also * used in other places in the NFS client that might tsleep(). */ void @@ -740,18 +673,18 @@ nfs_set_sigmask(struct thread *td, sigset_t *oldset) sigset_t newset; int i; struct proc *p; - + SIGFILLSET(newset); if (td == NULL) td = curthread; /* XXX */ p = td->td_proc; - /* Remove the NFS set of signals from newset */ + /* Remove the NFS set of signals from newset. */ PROC_LOCK(p); mtx_lock(&p->p_sigacts->ps_mtx); for (i = 0 ; i < sizeof(nfs_sig_set)/sizeof(int) ; i++) { /* * But make sure we leave the ones already masked - * by the process, ie. remove the signal from the + * by the process, i.e. remove the signal from the * temporary signalmask only if it wasn't already * in p_sigmask. */ @@ -777,12 +710,13 @@ nfs_restore_sigmask(struct thread *td, sigset_t *set) * old one after msleep() returns. */ int -nfs_msleep(struct thread *td, void *ident, struct mtx *mtx, int priority, char *wmesg, int timo) +nfs_msleep(struct thread *td, void *ident, struct mtx *mtx, int priority, + char *wmesg, int timo) { sigset_t oldset; int error; struct proc *p; - + if ((priority & PCATCH) == 0) return msleep(ident, mtx, priority, wmesg, timo); if (td == NULL) @@ -803,7 +737,7 @@ nfs_sigintr(struct nfsmount *nmp, struct thread *td) { struct proc *p; sigset_t tmpset; - + /* Terminate all requests while attempting a forced unmount. */ if (nmp->nm_mountp->mnt_kern_flag & MNTK_UNMOUNTF) return (EIO); @@ -834,12 +768,11 @@ nfs_msg(struct thread *td, const char *server, const char *msg, int error) struct proc *p; p = td ? td->td_proc : NULL; - if (error) { + if (error) tprintf(p, LOG_INFO, "nfs server %s: %s, error %d\n", server, msg, error); - } else { + else tprintf(p, LOG_INFO, "nfs server %s: %s\n", server, msg); - } return (0); } @@ -858,7 +791,8 @@ nfs_down(struct nfsmount *nmp, struct thread *td, const char *msg, } else mtx_unlock(&nmp->nm_mtx); mtx_lock(&nmp->nm_mtx); - if ((flags & NFSSTA_LOCKTIMEO) && !(nmp->nm_state & NFSSTA_LOCKTIMEO)) { + if ((flags & NFSSTA_LOCKTIMEO) && + !(nmp->nm_state & NFSSTA_LOCKTIMEO)) { nmp->nm_state |= NFSSTA_LOCKTIMEO; mtx_unlock(&nmp->nm_mtx); vfs_event_signal(&nmp->nm_mountp->mnt_stat.f_fsid, @@ -874,9 +808,8 @@ nfs_up(struct nfsmount *nmp, struct thread *td, const char *msg, { if (nmp == NULL) return; - if (tprintfmsg) { + if (tprintfmsg) nfs_msg(td, nmp->nm_mountp->mnt_stat.f_mntfromname, msg, 0); - } mtx_lock(&nmp->nm_mtx); if ((flags & NFSSTA_TIMEO) && (nmp->nm_state & NFSSTA_TIMEO)) { @@ -886,9 +819,10 @@ nfs_up(struct nfsmount *nmp, struct thread *td, const char *msg, VQ_NOTRESP, 1); } else mtx_unlock(&nmp->nm_mtx); - + mtx_lock(&nmp->nm_mtx); - if ((flags & NFSSTA_LOCKTIMEO) && (nmp->nm_state & NFSSTA_LOCKTIMEO)) { + if ((flags & NFSSTA_LOCKTIMEO) && + (nmp->nm_state & NFSSTA_LOCKTIMEO)) { nmp->nm_state &= ~NFSSTA_LOCKTIMEO; mtx_unlock(&nmp->nm_mtx); vfs_event_signal(&nmp->nm_mountp->mnt_stat.f_fsid, diff --git a/sys/nfsclient/nfs_nfsiod.c b/sys/nfsclient/nfs_nfsiod.c index 3fafa1e2d94b..5302c5695a22 100644 --- a/sys/nfsclient/nfs_nfsiod.c +++ b/sys/nfsclient/nfs_nfsiod.c @@ -113,7 +113,7 @@ sysctl_iodmin(SYSCTL_HANDLER_ARGS) * than the new minimum, create some more. */ for (i = nfs_iodmin - nfs_numasync; i > 0; i--) - nfs_nfsiodnew(); + nfs_nfsiodnew(0); out: mtx_unlock(&nfs_iod_mtx); return (0); @@ -147,7 +147,7 @@ sysctl_iodmax(SYSCTL_HANDLER_ARGS) */ iod = nfs_numasync - 1; for (i = 0; i < nfs_numasync - nfs_iodmax; i++) { - if (nfs_iodwant[iod]) + if (nfs_iodwant[iod] == NFSIOD_AVAILABLE) wakeup(&nfs_iodwant[iod]); iod--; } @@ -160,7 +160,7 @@ SYSCTL_PROC(_vfs_nfs, OID_AUTO, iodmax, CTLTYPE_UINT | CTLFLAG_RW, 0, "Max number of nfsiod kthreads"); int -nfs_nfsiodnew(void) +nfs_nfsiodnew(int set_iodwant) { int error, i; int newiod; @@ -176,12 +176,17 @@ nfs_nfsiodnew(void) } if (newiod == -1) return (-1); + if (set_iodwant > 0) + nfs_iodwant[i] = NFSIOD_CREATED_FOR_NFS_ASYNCIO; mtx_unlock(&nfs_iod_mtx); error = kproc_create(nfssvc_iod, nfs_asyncdaemon + i, NULL, RFHIGHPID, 0, "nfsiod %d", newiod); mtx_lock(&nfs_iod_mtx); - if (error) + if (error) { + if (set_iodwant > 0) + nfs_iodwant[i] = NFSIOD_NOT_AVAILABLE; return (-1); + } nfs_numasync++; return (newiod); } @@ -199,7 +204,7 @@ nfsiod_setup(void *dummy) nfs_iodmin = NFS_MAXASYNCDAEMON; for (i = 0; i < nfs_iodmin; i++) { - error = nfs_nfsiodnew(); + error = nfs_nfsiodnew(0); if (error == -1) panic("nfsiod_setup: nfs_nfsiodnew failed"); } @@ -236,7 +241,8 @@ nfssvc_iod(void *instance) goto finish; if (nmp) nmp->nm_bufqiods--; - nfs_iodwant[myiod] = curthread->td_proc; + if (nfs_iodwant[myiod] == NFSIOD_NOT_AVAILABLE) + nfs_iodwant[myiod] = NFSIOD_AVAILABLE; nfs_iodmount[myiod] = NULL; /* * Always keep at least nfs_iodmin kthreads. @@ -303,7 +309,7 @@ finish: nfs_asyncdaemon[myiod] = 0; if (nmp) nmp->nm_bufqiods--; - nfs_iodwant[myiod] = NULL; + nfs_iodwant[myiod] = NFSIOD_NOT_AVAILABLE; nfs_iodmount[myiod] = NULL; /* Someone may be waiting for the last nfsiod to terminate. */ if (--nfs_numasync == 0) diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c index 329294bae30e..94cbe8448d45 100644 --- a/sys/nfsclient/nfs_subs.c +++ b/sys/nfsclient/nfs_subs.c @@ -347,7 +347,7 @@ nfs_init(struct vfsconf *vfsp) nfs_ticks = 1; /* Ensure async daemons disabled */ for (i = 0; i < NFS_MAXASYNCDAEMON; i++) { - nfs_iodwant[i] = NULL; + nfs_iodwant[i] = NFSIOD_NOT_AVAILABLE; nfs_iodmount[i] = NULL; } nfs_nhinit(); /* Init the nfsnode table */ @@ -375,7 +375,7 @@ nfs_uninit(struct vfsconf *vfsp) mtx_lock(&nfs_iod_mtx); nfs_iodmax = 0; for (i = 0; i < nfs_numasync; i++) - if (nfs_iodwant[i]) + if (nfs_iodwant[i] == NFSIOD_AVAILABLE) wakeup(&nfs_iodwant[i]); /* The last nfsiod to exit will wake us up when nfs_numasync hits 0 */ while (nfs_numasync) diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index 17dc5d4b5dee..a8f32da0188e 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -64,6 +64,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include + #include #include @@ -112,7 +114,7 @@ static void nfs_decode_args(struct mount *mp, struct nfsmount *nmp, struct nfs_args *argp, const char *hostname); static int mountnfs(struct nfs_args *, struct mount *, struct sockaddr *, char *, struct vnode **, - struct ucred *cred); + struct ucred *cred, int); static vfs_mount_t nfs_mount; static vfs_cmount_t nfs_cmount; static vfs_unmount_t nfs_unmount; @@ -145,6 +147,7 @@ MODULE_DEPEND(nfs, krpc, 1, 1, 1); #ifdef KGSSAPI MODULE_DEPEND(nfs, kgssapi, 1, 1, 1); #endif +MODULE_DEPEND(nfs, nfs_common, 1, 1, 1); static struct nfs_rpcops nfs_rpcops = { nfs_readrpc, @@ -421,14 +424,18 @@ nfs_mountroot(struct mount *mp) char buf[128]; char *cp; + CURVNET_SET(TD_TO_VNET(td)); + #if defined(BOOTP_NFSROOT) && defined(BOOTP) bootpc_init(); /* use bootp to get nfs_diskless filled in */ #elif defined(NFS_ROOT) nfs_setup_diskless(); #endif - if (nfs_diskless_valid == 0) + if (nfs_diskless_valid == 0) { + CURVNET_RESTORE(); return (-1); + } if (nfs_diskless_valid == 1) nfs_convert_diskless(); @@ -514,6 +521,7 @@ nfs_mountroot(struct mount *mp) nd->root_args.hostname = buf; if ((error = nfs_mountdiskless(buf, &nd->root_saddr, &nd->root_args, td, &vp, mp)) != 0) { + CURVNET_RESTORE(); return (error); } @@ -527,6 +535,7 @@ nfs_mountroot(struct mount *mp) sizeof (prison0.pr_hostname)); mtx_unlock(&prison0.pr_mtx); inittodr(ntohl(nd->root_time)); + CURVNET_RESTORE(); return (0); } @@ -543,7 +552,7 @@ nfs_mountdiskless(char *path, nam = sodupsockaddr((struct sockaddr *)sin, M_WAITOK); if ((error = mountnfs(args, mp, nam, path, vpp, - td->td_ucred)) != 0) { + td->td_ucred, NFS_DEFAULT_NEGNAMETIMEO)) != 0) { printf("nfs_mountroot: mount %s on /: %d\n", path, error); return (error); } @@ -770,7 +779,7 @@ static const char *nfs_opts[] = { "from", "nfs_args", "readdirsize", "soft", "hard", "mntudp", "tcp", "udp", "wsize", "rsize", "retrans", "acregmin", "acregmax", "acdirmin", "acdirmax", "deadthresh", "hostname", "timeout", "addr", "fh", "nfsv3", "sec", - "maxgroups", "principal", + "maxgroups", "principal", "negnametimeo", NULL }; /* @@ -819,6 +828,7 @@ nfs_mount(struct mount *mp) size_t len; u_char nfh[NFSX_V3FHMAX]; char *opt; + int negnametimeo = NFS_DEFAULT_NEGNAMETIMEO; has_nfs_args_opt = 0; has_addr_opt = 0; @@ -1021,7 +1031,7 @@ nfs_mount(struct mount *mp) } if (vfs_getopt(mp->mnt_optnew, "maxgroups", (void **)&opt, NULL) == 0) { ret = sscanf(opt, "%d", &args.maxgrouplist); - if (ret != 1 || args.timeo <= 0) { + if (ret != 1 || args.maxgrouplist <= 0) { vfs_mount_error(mp, "illegal maxgroups: %s", opt); error = EINVAL; @@ -1029,6 +1039,16 @@ nfs_mount(struct mount *mp) } args.flags |= NFSMNT_MAXGRPS; } + if (vfs_getopt(mp->mnt_optnew, "negnametimeo", (void **)&opt, NULL) + == 0) { + ret = sscanf(opt, "%d", &negnametimeo); + if (ret != 1 || negnametimeo < 0) { + vfs_mount_error(mp, "illegal negnametimeo: %s", + opt); + error = EINVAL; + goto out; + } + } if (vfs_getopt(mp->mnt_optnew, "addr", (void **)&args.addr, &args.addrlen) == 0) { has_addr_opt = 1; @@ -1117,7 +1137,7 @@ nfs_mount(struct mount *mp) } } error = mountnfs(&args, mp, nam, args.hostname, &vp, - curthread->td_ucred); + curthread->td_ucred, negnametimeo); out: if (!error) { MNT_ILOCK(mp); @@ -1159,7 +1179,7 @@ nfs_cmount(struct mntarg *ma, void *data, int flags) */ static int mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam, - char *hst, struct vnode **vpp, struct ucred *cred) + char *hst, struct vnode **vpp, struct ucred *cred, int negnametimeo) { struct nfsmount *nmp; struct nfsnode *np; @@ -1209,6 +1229,7 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam, nmp->nm_numgrps = NFS_MAXGRPS; nmp->nm_readahead = NFS_DEFRAHEAD; nmp->nm_deadthresh = NFS_MAXDEADTHRESH; + nmp->nm_negnametimeo = negnametimeo; nmp->nm_tprintf_delay = nfs_tprintf_delay; if (nmp->nm_tprintf_delay < 0) nmp->nm_tprintf_delay = 0; diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index 7dfd298da6d2..64953fe19cd3 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -212,7 +212,7 @@ static int nfs_renameit(struct vnode *sdvp, struct componentname *scnp, * Global variables */ struct mtx nfs_iod_mtx; -struct proc *nfs_iodwant[NFS_MAXASYNCDAEMON]; +enum nfsiod_state nfs_iodwant[NFS_MAXASYNCDAEMON]; struct nfsmount *nfs_iodmount[NFS_MAXASYNCDAEMON]; int nfs_numasync = 0; vop_advlock_t *nfs_advlock_p = nfs_dolock; @@ -924,6 +924,7 @@ nfs_lookup(struct vop_lookup_args *ap) struct vnode **vpp = ap->a_vpp; struct mount *mp = dvp->v_mount; struct vattr vattr; + time_t dmtime; int flags = cnp->cn_flags; struct vnode *newvp; struct nfsmount *nmp; @@ -935,7 +936,7 @@ nfs_lookup(struct vop_lookup_args *ap) int error = 0, attrflag, fhsize, ltype; int v3 = NFS_ISV3(dvp); struct thread *td = cnp->cn_thread; - + *vpp = NULLVP; if ((flags & ISLASTCN) && (mp->mnt_flag & MNT_RDONLY) && (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) @@ -980,9 +981,13 @@ nfs_lookup(struct vop_lookup_args *ap) * We only accept a negative hit in the cache if the * modification time of the parent directory matches * our cached copy. Otherwise, we discard all of the - * negative cache entries for this directory. + * negative cache entries for this directory. We also + * only trust -ve cache entries for less than + * nm_negative_namecache_timeout seconds. */ - if (VOP_GETATTR(dvp, &vattr, cnp->cn_cred) == 0 && + if ((u_int)(ticks - np->n_dmtime_ticks) < + (nmp->nm_negnametimeo * hz) && + VOP_GETATTR(dvp, &vattr, cnp->cn_cred) == 0 && vattr.va_mtime.tv_sec == np->n_dmtime) { nfsstats.lookupcache_hits++; return (ENOENT); @@ -992,6 +997,19 @@ nfs_lookup(struct vop_lookup_args *ap) np->n_dmtime = 0; mtx_unlock(&np->n_mtx); } + + /* + * Cache the modification time of the parent directory in case + * the lookup fails and results in adding the first negative + * name cache entry for the directory. Since this is reading + * a single time_t, don't bother with locking. The + * modification time may be a bit stale, but it must be read + * before performing the lookup RPC to prevent a race where + * another lookup updates the timestamp on the directory after + * the lookup RPC has been performed on the server but before + * n_dmtime is set at the end of this function. + */ + dmtime = np->n_vattr.va_mtime.tv_sec; error = 0; newvp = NULLVP; nfsstats.lookupcache_misses++; @@ -1130,13 +1148,27 @@ nfsmout: * Maintain n_dmtime as the modification time * of the parent directory when the oldest -ve * name cache entry for this directory was - * added. + * added. If a -ve cache entry has already + * been added with a newer modification time + * by a concurrent lookup, then don't bother + * adding a cache entry. The modification + * time of the directory might have changed + * due to the file this lookup failed to find + * being created. In that case a subsequent + * lookup would incorrectly use the entry + * added here instead of doing an extra + * lookup. */ mtx_lock(&np->n_mtx); - if (np->n_dmtime == 0) - np->n_dmtime = np->n_vattr.va_mtime.tv_sec; - mtx_unlock(&np->n_mtx); - cache_enter(dvp, NULL, cnp); + if (np->n_dmtime <= dmtime) { + if (np->n_dmtime == 0) { + np->n_dmtime = dmtime; + np->n_dmtime_ticks = ticks; + } + mtx_unlock(&np->n_mtx); + cache_enter(dvp, NULL, cnp); + } else + mtx_unlock(&np->n_mtx); } return (ENOENT); } @@ -1532,11 +1564,14 @@ nfs_create(struct vop_create_args *ap) /* * Oops, not for me.. */ - if (vap->va_type == VSOCK) - return (nfs_mknodrpc(dvp, ap->a_vpp, cnp, vap)); - - if ((error = VOP_GETATTR(dvp, &vattr, cnp->cn_cred)) != 0) + if (vap->va_type == VSOCK) { + error = nfs_mknodrpc(dvp, ap->a_vpp, cnp, vap); return (error); + } + + if ((error = VOP_GETATTR(dvp, &vattr, cnp->cn_cred)) != 0) { + return (error); + } if (vap->va_vaflags & VA_EXCLUSIVE) fmode |= O_EXCL; again: diff --git a/sys/nfsclient/nfsmount.h b/sys/nfsclient/nfsmount.h index 47d7ef305f6f..d47957c0066a 100644 --- a/sys/nfsclient/nfsmount.h +++ b/sys/nfsclient/nfsmount.h @@ -85,6 +85,7 @@ struct nfsmount { struct rpc_timers nm_timers[NFS_MAX_TIMER]; /* RTT Timers for rpcs */ char nm_principal[MNAMELEN]; /* GSS-API principal of server */ gss_OID nm_mech_oid; /* OID of selected GSS-API mechanism */ + int nm_negnametimeo; /* timeout for -ve entries (sec) */ /* NFSv4 */ uint64_t nm_clientid; @@ -107,6 +108,10 @@ struct nfsmount { #define NFS_TPRINTF_DELAY 30 #endif +#ifndef NFS_DEFAULT_NEGNAMETIMEO +#define NFS_DEFAULT_NEGNAMETIMEO 60 +#endif + #define NFS_PCATCH (PCATCH | PBDRY) #endif diff --git a/sys/nfsclient/nfsnode.h b/sys/nfsclient/nfsnode.h index 29198d8c20a2..46d1bd6cf6c3 100644 --- a/sys/nfsclient/nfsnode.h +++ b/sys/nfsclient/nfsnode.h @@ -114,6 +114,7 @@ struct nfsnode { struct timespec n_mtime; /* Prev modify time. */ time_t n_ctime; /* Prev create time. */ time_t n_dmtime; /* Prev dir modify time. */ + int n_dmtime_ticks; /* Tick of -ve cache entry */ time_t n_expiry; /* Lease expiry time */ nfsfh_t *n_fhp; /* NFS File Handle */ struct vnode *n_vnode; /* associated vnode */ @@ -175,11 +176,24 @@ struct nfsnode { #define NFS_TIMESPEC_COMPARE(T1, T2) (((T1)->tv_sec != (T2)->tv_sec) || ((T1)->tv_nsec != (T2)->tv_nsec)) +/* + * NFS iod threads can be in one of these three states once spawned. + * NFSIOD_NOT_AVAILABLE - Cannot be assigned an I/O operation at this time. + * NFSIOD_AVAILABLE - Available to be assigned an I/O operation. + * NFSIOD_CREATED_FOR_NFS_ASYNCIO - Newly created for nfs_asyncio() and + * will be used by the thread that called nfs_asyncio(). + */ +enum nfsiod_state { + NFSIOD_NOT_AVAILABLE = 0, + NFSIOD_AVAILABLE = 1, + NFSIOD_CREATED_FOR_NFS_ASYNCIO = 2, +}; + /* * Queue head for nfsiod's */ extern TAILQ_HEAD(nfs_bufq, buf) nfs_bufq; -extern struct proc *nfs_iodwant[NFS_MAXASYNCDAEMON]; +extern enum nfsiod_state nfs_iodwant[NFS_MAXASYNCDAEMON]; extern struct nfsmount *nfs_iodmount[NFS_MAXASYNCDAEMON]; #if defined(_KERNEL) diff --git a/sys/nfsserver/nfs.h b/sys/nfsserver/nfs.h index b907a060b4d8..bb1893e18c01 100644 --- a/sys/nfsserver/nfs.h +++ b/sys/nfsserver/nfs.h @@ -82,14 +82,13 @@ #define IO_METASYNC 0 #endif - /* NFS state flags XXX -Wunused */ #define NFSRV_SNDLOCK 0x01000000 /* Send socket lock */ #define NFSRV_WANTSND 0x02000000 /* Want above */ /* - * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and mount_nfs - * should ever try and use it. + * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and + * mount_nfs should ever try and use it. */ /* diff --git a/sys/nfsserver/nfs_fha.c b/sys/nfsserver/nfs_fha.c index 901a0ce512cd..76537d7ef94d 100644 --- a/sys/nfsserver/nfs_fha.c +++ b/sys/nfsserver/nfs_fha.c @@ -71,16 +71,17 @@ static struct fha_global { u_long hashmask; } g_fha; -/* - * These are the entries in the filehandle hash. They talk about a specific - * file, requests against which are being handled by one or more nfsds. We keep - * a chain of nfsds against the file. We only have more than one if reads are - * ongoing, and then only if the reads affect disparate regions of the file. +/* + * These are the entries in the filehandle hash. They talk about a specific + * file, requests against which are being handled by one or more nfsds. We + * keep a chain of nfsds against the file. We only have more than one if reads + * are ongoing, and then only if the reads affect disparate regions of the + * file. * - * In general, we want to assign a new request to an existing nfsd if it is - * going to contend with work happening already on that nfsd, or if the - * operation is a read and the nfsd is already handling a proximate read. We - * do this to avoid jumping around in the read stream unnecessarily, and to + * In general, we want to assign a new request to an existing nfsd if it is + * going to contend with work happening already on that nfsd, or if the + * operation is a read and the nfsd is already handling a proximate read. We + * do this to avoid jumping around in the read stream unnecessarily, and to * avoid contention between threads over single files. */ struct fha_hash_entry { @@ -101,7 +102,7 @@ struct fha_info { }; static int fhe_stats_sysctl(SYSCTL_HANDLER_ARGS); - + static void nfs_fha_init(void *foo) { @@ -136,7 +137,7 @@ nfs_fha_init(void *foo) &fha_ctls.max_reqs_per_nfsd, 0, "Maximum requests that " "single nfsd thread should be working on at any time"); - SYSCTL_ADD_OID(&fha_clist, SYSCTL_STATIC_CHILDREN(_vfs_nfsrv_fha), + SYSCTL_ADD_OID(&fha_clist, SYSCTL_STATIC_CHILDREN(_vfs_nfsrv_fha), OID_AUTO, "fhe_stats", CTLTYPE_STRING | CTLFLAG_RD, 0, 0, fhe_stats_sysctl, "A", ""); } @@ -151,34 +152,34 @@ nfs_fha_uninit(void *foo) SYSINIT(nfs_fha, SI_SUB_ROOT_CONF, SI_ORDER_ANY, nfs_fha_init, NULL); SYSUNINIT(nfs_fha, SI_SUB_ROOT_CONF, SI_ORDER_ANY, nfs_fha_uninit, NULL); -/* +/* * This just specifies that offsets should obey affinity when within * the same 1Mbyte (1<<20) chunk for the file (reads only for now). */ static void fha_extract_info(struct svc_req *req, struct fha_info *i) { - struct mbuf *md = req->rq_args; + struct mbuf *md; nfsfh_t fh; - caddr_t dpos = mtod(md, caddr_t); + caddr_t dpos; static u_int64_t random_fh = 0; int error; int v3 = (req->rq_vers == 3); u_int32_t *tl; rpcproc_t procnum; - /* - * We start off with a random fh. If we get a reasonable - * procnum, we set the fh. If there's a concept of offset + /* + * We start off with a random fh. If we get a reasonable + * procnum, we set the fh. If there's a concept of offset * that we're interested in, we set that. */ i->fh = ++random_fh; i->offset = 0; i->locktype = LK_EXCLUSIVE; - + /* * Extract the procnum and convert to v3 form if necessary, - * taking care to deal with out-of-range procnums. Caller will + * taking care to deal with out-of-range procnums. Caller will * ensure that rq_vers is either 2 or 3. */ procnum = req->rq_proc; @@ -188,25 +189,31 @@ fha_extract_info(struct svc_req *req, struct fha_info *i) procnum = nfsrv_nfsv3_procid[procnum]; } - /* - * We do affinity for most. However, we divide a realm of affinity - * by file offset so as to allow for concurrent random access. We - * only do this for reads today, but this may change when IFS supports + /* + * We do affinity for most. However, we divide a realm of affinity + * by file offset so as to allow for concurrent random access. We + * only do this for reads today, but this may change when IFS supports * efficient concurrent writes. */ if (procnum == NFSPROC_FSSTAT || procnum == NFSPROC_FSINFO || procnum == NFSPROC_PATHCONF || - procnum == NFSPROC_NOOP || + procnum == NFSPROC_NOOP || procnum == NFSPROC_NULL) goto out; - + + error = nfs_realign(&req->rq_args, M_DONTWAIT); + if (error) + goto out; + md = req->rq_args; + dpos = mtod(md, caddr_t); + /* Grab the filehandle. */ error = nfsm_srvmtofh_xx(&fh.fh_generic, v3, &md, &dpos); if (error) goto out; - i->fh = *(const u_int64_t *)(fh.fh_generic.fh_fid.fid_data); + bcopy(fh.fh_generic.fh_fid.fid_data, &i->fh, sizeof(i->fh)); /* Content ourselves with zero offset for all but reads. */ if (procnum != NFSPROC_READ) @@ -266,8 +273,8 @@ fha_hash_entry_new(u_int64_t fh) e->num_writes = 0; e->num_threads = 0; LIST_INIT(&e->threads); - - return e; + + return (e); } static void @@ -292,10 +299,9 @@ fha_hash_entry_lookup(SVCPOOL *pool, u_int64_t fh) { struct fha_hash_entry *fhe, *new_fhe; - LIST_FOREACH(fhe, &g_fha.hashtable[fh % g_fha.hashmask], link) { + LIST_FOREACH(fhe, &g_fha.hashtable[fh % g_fha.hashmask], link) if (fhe->fh == fh) break; - } if (!fhe) { /* Allocate a new entry. */ @@ -304,25 +310,24 @@ fha_hash_entry_lookup(SVCPOOL *pool, u_int64_t fh) mtx_lock(&pool->sp_lock); /* Double-check to make sure we still need the new entry. */ - LIST_FOREACH(fhe, &g_fha.hashtable[fh % g_fha.hashmask], link) { + LIST_FOREACH(fhe, &g_fha.hashtable[fh % g_fha.hashmask], link) if (fhe->fh == fh) break; - } if (!fhe) { fhe = new_fhe; LIST_INSERT_HEAD(&g_fha.hashtable[fh % g_fha.hashmask], fhe, link); - } else { + } else fha_hash_entry_destroy(new_fhe); - } } - return fhe; + return (fhe); } static void fha_hash_entry_add_thread(struct fha_hash_entry *fhe, SVCTHREAD *thread) { + LIST_INSERT_HEAD(&fhe->threads, thread, st_alink); fhe->num_threads++; } @@ -335,7 +340,7 @@ fha_hash_entry_remove_thread(struct fha_hash_entry *fhe, SVCTHREAD *thread) fhe->num_threads--; } -/* +/* * Account for an ongoing operation associated with this file. */ static void @@ -361,7 +366,7 @@ get_idle_thread(SVCPOOL *pool) } -/* +/* * Get the service thread currently associated with the fhe that is * appropriate to handle this operation. */ @@ -383,15 +388,15 @@ fha_hash_entry_choose_thread(SVCPOOL *pool, struct fha_hash_entry *fhe, /* If there are any writes in progress, use the first thread. */ if (fhe->num_writes) { #if 0 - ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, + ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, "fha: %p(%d)w", thread, req_count); #endif return (thread); } - /* - * Check for read locality, making sure that we won't - * exceed our per-thread load limit in the process. + /* + * Check for read locality, making sure that we won't + * exceed our per-thread load limit in the process. */ offset1 = i->offset >> fha_ctls.bin_shift; offset2 = STAILQ_FIRST(&thread->st_reqs)->rq_p3 @@ -400,21 +405,21 @@ fha_hash_entry_choose_thread(SVCPOOL *pool, struct fha_hash_entry *fhe, if ((fha_ctls.max_reqs_per_nfsd == 0) || (req_count < fha_ctls.max_reqs_per_nfsd)) { #if 0 - ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, + ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, "fha: %p(%d)r", thread, req_count); #endif return (thread); } } - /* + /* * We don't have a locality match, so skip this thread, - * but keep track of the most attractive thread in case + * but keep track of the most attractive thread in case * we need to come back to it later. */ #if 0 - ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, - "fha: %p(%d)s off1 %llu off2 %llu", thread, + ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, + "fha: %p(%d)s off1 %llu off2 %llu", thread, req_count, offset1, offset2); #endif if ((min_thread == NULL) || (req_count < min_count)) { @@ -423,38 +428,38 @@ fha_hash_entry_choose_thread(SVCPOOL *pool, struct fha_hash_entry *fhe, } } - /* - * We didn't find a good match yet. See if we can add + /* + * We didn't find a good match yet. See if we can add * a new thread to this file handle entry's thread list. */ - if ((fha_ctls.max_nfsds_per_fh == 0) || + if ((fha_ctls.max_nfsds_per_fh == 0) || (fhe->num_threads < fha_ctls.max_nfsds_per_fh)) { - /* - * We can add a new thread, so try for an idle thread - * first, and fall back to this_thread if none are idle. + /* + * We can add a new thread, so try for an idle thread + * first, and fall back to this_thread if none are idle. */ if (STAILQ_EMPTY(&this_thread->st_reqs)) { thread = this_thread; #if 0 - ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, + ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, "fha: %p(%d)t", thread, thread->st_reqcount); #endif } else if ((thread = get_idle_thread(pool))) { #if 0 - ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, + ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, "fha: %p(%d)i", thread, thread->st_reqcount); #endif - } else { + } else { thread = this_thread; #if 0 - ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, + ITRACE_CURPROC(ITRACE_NFS, ITRACE_INFO, "fha: %p(%d)b", thread, thread->st_reqcount); #endif } fha_hash_entry_add_thread(fhe, thread); } else { - /* - * We don't want to use any more threads for this file, so + /* + * We don't want to use any more threads for this file, so * go back to the most attractive nfsd we're already using. */ thread = min_thread; @@ -463,8 +468,8 @@ fha_hash_entry_choose_thread(SVCPOOL *pool, struct fha_hash_entry *fhe, return (thread); } -/* - * After getting a request, try to assign it to some thread. Usually we +/* + * After getting a request, try to assign it to some thread. Usually we * handle it ourselves. */ SVCTHREAD * @@ -487,16 +492,16 @@ fha_assign(SVCTHREAD *this_thread, struct svc_req *req) pool = req->rq_xprt->xp_pool; fha_extract_info(req, &i); - /* - * We save the offset associated with this request for later + /* + * We save the offset associated with this request for later * nfsd matching. */ fhe = fha_hash_entry_lookup(pool, i.fh); req->rq_p1 = fhe; req->rq_p2 = i.locktype; req->rq_p3 = i.offset; - - /* + + /* * Choose a thread, taking into consideration locality, thread load, * and the number of threads already working on this file. */ @@ -507,8 +512,8 @@ fha_assign(SVCTHREAD *this_thread, struct svc_req *req) return (thread); } -/* - * Called when we're done with an operation. The request has already +/* + * Called when we're done with an operation. The request has already * been de-queued. */ void diff --git a/sys/nfsserver/nfs_serv.c b/sys/nfsserver/nfs_serv.c index 3bb9a6a2880a..d1be5e55333d 100644 --- a/sys/nfsserver/nfs_serv.c +++ b/sys/nfsserver/nfs_serv.c @@ -1810,10 +1810,9 @@ out: } ereply: nfsm_reply(NFSX_WCCDATA(v3)); - if (v3) { + if (v3) nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft); - error = 0; - } + error = 0; nfsmout: NDFREE(&nd, NDF_ONLY_PNBUF); if (nd.ni_dvp) { @@ -2187,8 +2186,8 @@ ereply: if (v3) { nfsm_srvpostop_attr(getret, &at); nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft); - error = 0; } + error = 0; /* fall through */ nfsmout: diff --git a/sys/nfsserver/nfs_srvkrpc.c b/sys/nfsserver/nfs_srvkrpc.c index 54b1c4ac5919..512373b30e28 100644 --- a/sys/nfsserver/nfs_srvkrpc.c +++ b/sys/nfsserver/nfs_srvkrpc.c @@ -96,8 +96,6 @@ SYSCTL_DECL(_vfs_nfsrv); SVCPOOL *nfsrv_pool; int nfsd_waiting = 0; int nfsrv_numnfsd = 0; -static int nfs_realign_test; -static int nfs_realign_count; struct callout nfsrv_callout; static eventhandler_tag nfsrv_nmbclusters_tag; @@ -111,10 +109,6 @@ SYSCTL_INT(_vfs_nfsrv, OID_AUTO, gatherdelay, CTLFLAG_RW, SYSCTL_INT(_vfs_nfsrv, OID_AUTO, gatherdelay_v3, CTLFLAG_RW, &nfsrvw_procrastinate_v3, 0, "Delay in seconds for NFSv3 write gathering"); -SYSCTL_INT(_vfs_nfsrv, OID_AUTO, realign_test, CTLFLAG_RW, - &nfs_realign_test, 0, ""); -SYSCTL_INT(_vfs_nfsrv, OID_AUTO, realign_count, CTLFLAG_RW, - &nfs_realign_count, 0, ""); static int nfssvc_addsock(struct file *, struct thread *); static int nfssvc_nfsd(struct thread *, struct nfsd_nfsd_args *); @@ -187,19 +181,18 @@ nfssvc_nfsserver(struct thread *td, struct nfssvc_args *uap) } error = nfssvc_addsock(fp, td); fdrop(fp, td); - } else if (uap->flag & NFSSVC_OLDNFSD) { + } else if (uap->flag & NFSSVC_OLDNFSD) error = nfssvc_nfsd(td, NULL); - } else if (uap->flag & NFSSVC_NFSD) { - if (!uap->argp) + else if (uap->flag & NFSSVC_NFSD) { + if (!uap->argp) return (EINVAL); error = copyin(uap->argp, (caddr_t)&nfsdarg, sizeof(nfsdarg)); if (error) return (error); error = nfssvc_nfsd(td, &nfsdarg); - } else { + } else error = ENXIO; - } return (error); } @@ -251,57 +244,6 @@ nfs_rephead(int siz, struct nfsrv_descript *nd, int err, return (mreq); } -/* - * nfs_realign: - * - * Check for badly aligned mbuf data and realign by copying the unaligned - * portion of the data into a new mbuf chain and freeing the portions - * of the old chain that were replaced. - * - * We cannot simply realign the data within the existing mbuf chain - * because the underlying buffers may contain other rpc commands and - * we cannot afford to overwrite them. - * - * We would prefer to avoid this situation entirely. The situation does - * not occur with NFS/UDP and is supposed to only occassionally occur - * with TCP. Use vfs.nfs.realign_count and realign_test to check this. - */ -static void -nfs_realign(struct mbuf **pm) /* XXX COMMON */ -{ - struct mbuf *m; - struct mbuf *n = NULL; - int off = 0; - - ++nfs_realign_test; - while ((m = *pm) != NULL) { - if ((m->m_len & 0x3) || (mtod(m, intptr_t) & 0x3)) { - MGET(n, M_WAIT, MT_DATA); - if (m->m_len >= MINCLSIZE) { - MCLGET(n, M_WAIT); - } - n->m_len = 0; - break; - } - pm = &m->m_next; - } - - /* - * If n is non-NULL, loop on m copying data, then replace the - * portion of the chain that had to be realigned. - */ - if (n != NULL) { - ++nfs_realign_count; - while (m) { - m_copyback(n, off, m->m_len, mtod(m, caddr_t)); - off += m->m_len; - m = m->m_next; - } - m_freem(*pm); - *pm = n; - } -} - static void nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt) { @@ -335,7 +277,7 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt) mreq = mrep = NULL; mreq = rqst->rq_args; rqst->rq_args = NULL; - nfs_realign(&mreq); + (void)nfs_realign(&mreq, M_WAIT); /* * Note: we want rq_addr, not svc_getrpccaller for nd_nam2 - @@ -447,9 +389,8 @@ nfssvc_addsock(struct file *fp, struct thread *td) siz = sb_max_adj; error = soreserve(so, siz, siz); - if (error) { + if (error) return (error); - } /* * Steal the socket from userland so that it doesn't close @@ -471,7 +412,7 @@ nfssvc_addsock(struct file *fp, struct thread *td) } /* - * Called by nfssvc() for nfsds. Just loops around servicing rpc requests + * Called by nfssvc() for nfsds. Just loops around servicing rpc requests * until it is killed by a signal. */ static int @@ -496,9 +437,9 @@ nfssvc_nfsd(struct thread *td, struct nfsd_nfsd_args *args) #endif /* - * Only the first nfsd actually does any work. The RPC code - * adds threads to it as needed. Any extra processes offered - * by nfsd just exit. If nfsd is new enough, it will call us + * Only the first nfsd actually does any work. The RPC code + * adds threads to it as needed. Any extra processes offered + * by nfsd just exit. If nfsd is new enough, it will call us * once with a structure that specifies how many threads to * use. */ @@ -522,7 +463,7 @@ nfssvc_nfsd(struct thread *td, struct nfsd_nfsd_args *args) nfsrv_pool->sp_minthreads = 4; nfsrv_pool->sp_maxthreads = 4; } - + svc_run(nfsrv_pool); #ifdef KGSSAPI @@ -541,7 +482,7 @@ nfssvc_nfsd(struct thread *td, struct nfsd_nfsd_args *args) /* * Size the NFS server's duplicate request cache at 1/2 the - * nmbclusters, floating within a (64, 2048) range. This is to + * nmbclusters, floating within a (64, 2048) range. This is to * prevent all mbuf clusters being tied up in the NFS dupreq * cache for small values of nmbclusters. */ diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c index ee0614b4dc99..d84261e82498 100644 --- a/sys/nfsserver/nfs_srvsubs.c +++ b/sys/nfsserver/nfs_srvsubs.c @@ -560,6 +560,7 @@ DECLARE_MODULE(nfsserver, nfsserver_mod, SI_SUB_VFS, SI_ORDER_ANY); MODULE_VERSION(nfsserver, 1); MODULE_DEPEND(nfsserver, nfssvc, 1, 1, 1); MODULE_DEPEND(nfsserver, krpc, 1, 1, 1); +MODULE_DEPEND(nfsserver, nfs_common, 1, 1, 1); /* * Set up nameidata for a lookup() call and do it. diff --git a/sys/nlm/nlm.h b/sys/nlm/nlm.h index d2c5ee1610a5..379d4ece9344 100644 --- a/sys/nlm/nlm.h +++ b/sys/nlm/nlm.h @@ -48,6 +48,12 @@ struct vnode; extern struct timeval nlm_zero_tv; extern int nlm_nsm_state; +/* + * Make a struct netobj. + */ +extern void nlm_make_netobj(struct netobj *dst, caddr_t srt, + size_t srcsize, struct malloc_type *type); + /* * Copy a struct netobj. */ @@ -192,6 +198,12 @@ extern int nlm_do_unlock(nlm4_unlockargs *argp, nlm4_res *result, extern int nlm_do_granted(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp, CLIENT **rpcp); +/* + * Implementation for the granted result RPC. The client may reject the granted + * message, in which case we need to handle it appropriately. + */ +extern void nlm_do_granted_res(nlm4_res *argp, struct svc_req *rqstp); + /* * Free all locks associated with the hostname argp->name. */ diff --git a/sys/nlm/nlm_prot_impl.c b/sys/nlm/nlm_prot_impl.c index 049c7ba97508..f6b296d6f3c9 100644 --- a/sys/nlm/nlm_prot_impl.c +++ b/sys/nlm/nlm_prot_impl.c @@ -26,12 +26,12 @@ */ #include "opt_inet6.h" -#include "opt_nfs.h" #include __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -77,6 +77,11 @@ MALLOC_DEFINE(M_NLM, "NLM", "Network Lock Manager"); */ #define NLM_IDLE_PERIOD 5 +/* + * We only look for GRANTED_RES messages for a little while. + */ +#define NLM_EXPIRE_TIMEOUT 10 + /* * Support for sysctl vfs.nlm.sysid */ @@ -205,6 +210,7 @@ struct nlm_async_lock { struct nlm_host *af_host; /* (c) host which is locking */ CLIENT *af_rpc; /* (c) rpc client to send message */ nlm4_testargs af_granted; /* (c) notification details */ + time_t af_expiretime; /* (c) notification time */ }; TAILQ_HEAD(nlm_async_lock_list, nlm_async_lock); @@ -238,7 +244,9 @@ struct nlm_host { enum nlm_host_state nh_monstate; /* (l) local NSM monitoring state */ time_t nh_idle_timeout; /* (s) Time at which host is idle */ struct sysctl_ctx_list nh_sysctl; /* (c) vfs.nlm.sysid nodes */ + uint32_t nh_grantcookie; /* (l) grant cookie counter */ struct nlm_async_lock_list nh_pending; /* (l) pending async locks */ + struct nlm_async_lock_list nh_granted; /* (l) granted locks */ struct nlm_async_lock_list nh_finished; /* (l) finished async locks */ }; TAILQ_HEAD(nlm_host_list, nlm_host); @@ -248,6 +256,25 @@ static uint32_t nlm_next_sysid = 1; /* (g) */ static void nlm_host_unmonitor(struct nlm_host *); +struct nlm_grantcookie { + uint32_t ng_sysid; + uint32_t ng_cookie; +}; + +static inline uint32_t +ng_sysid(struct netobj *src) +{ + + return ((struct nlm_grantcookie *)src->n_bytes)->ng_sysid; +} + +static inline uint32_t +ng_cookie(struct netobj *src) +{ + + return ((struct nlm_grantcookie *)src->n_bytes)->ng_cookie; +} + /**********************************************************************/ /* @@ -281,6 +308,19 @@ nlm_uninit(void *dummy) } SYSUNINIT(nlm_uninit, SI_SUB_LOCK, SI_ORDER_FIRST, nlm_uninit, NULL); +/* + * Create a netobj from an arbitrary source. + */ +void +nlm_make_netobj(struct netobj *dst, caddr_t src, size_t srcsize, + struct malloc_type *type) +{ + + dst->n_len = srcsize; + dst->n_bytes = malloc(srcsize, type, M_WAITOK); + memcpy(dst->n_bytes, src, srcsize); +} + /* * Copy a struct netobj. */ @@ -289,11 +329,10 @@ nlm_copy_netobj(struct netobj *dst, struct netobj *src, struct malloc_type *type) { - dst->n_len = src->n_len; - dst->n_bytes = malloc(src->n_len, type, M_WAITOK); - memcpy(dst->n_bytes, src->n_bytes, src->n_len); + nlm_make_netobj(dst, src->n_bytes, src->n_len, type); } + /* * Create an RPC client handle for the given (address,prog,vers) * triple using UDP. @@ -519,8 +558,10 @@ nlm_lock_callback(void *arg, int pending) struct nlm_async_lock *af = (struct nlm_async_lock *) arg; struct rpc_callextra ext; - NLM_DEBUG(2, "NLM: async lock %p for %s (sysid %d) granted\n", - af, af->af_host->nh_caller_name, af->af_host->nh_sysid); + NLM_DEBUG(2, "NLM: async lock %p for %s (sysid %d) granted," + " cookie %d:%d\n", af, af->af_host->nh_caller_name, + af->af_host->nh_sysid, ng_sysid(&af->af_granted.cookie), + ng_cookie(&af->af_granted.cookie)); /* * Send the results back to the host. @@ -557,16 +598,12 @@ nlm_lock_callback(void *arg, int pending) } /* - * Move this entry to the nh_finished list. Someone else will - * free it later - its too hard to do it here safely without - * racing with cancel. - * - * XXX possibly we should have a third "granted sent but not - * ack'ed" list so that we can re-send the granted message. + * Move this entry to the nh_granted list. */ + af->af_expiretime = time_uptime + NLM_EXPIRE_TIMEOUT; mtx_lock(&af->af_host->nh_lock); TAILQ_REMOVE(&af->af_host->nh_pending, af, af_link); - TAILQ_INSERT_TAIL(&af->af_host->nh_finished, af, af_link); + TAILQ_INSERT_TAIL(&af->af_host->nh_granted, af, af_link); mtx_unlock(&af->af_host->nh_lock); } @@ -636,11 +673,23 @@ nlm_cancel_async_lock(struct nlm_async_lock *af) } static void -nlm_free_finished_locks(struct nlm_host *host) +nlm_check_expired_locks(struct nlm_host *host) { struct nlm_async_lock *af; + time_t uptime = time_uptime; mtx_lock(&host->nh_lock); + while ((af = TAILQ_FIRST(&host->nh_granted)) != NULL + && uptime >= af->af_expiretime) { + NLM_DEBUG(2, "NLM: async lock %p for %s (sysid %d) expired," + " cookie %d:%d\n", af, af->af_host->nh_caller_name, + af->af_host->nh_sysid, ng_sysid(&af->af_granted.cookie), + ng_cookie(&af->af_granted.cookie)); + TAILQ_REMOVE(&host->nh_granted, af, af_link); + mtx_unlock(&host->nh_lock); + nlm_free_async_lock(af); + mtx_lock(&host->nh_lock); + } while ((af = TAILQ_FIRST(&host->nh_finished)) != NULL) { TAILQ_REMOVE(&host->nh_finished, af, af_link); mtx_unlock(&host->nh_lock); @@ -671,8 +720,6 @@ nlm_host_destroy(struct nlm_host *host) free(host, M_NLM); } -#ifdef NFSCLIENT - /* * Thread start callback for client lock recovery */ @@ -695,8 +742,6 @@ nlm_client_recovery_start(void *arg) kthread_exit(); } -#endif - /* * This is called when we receive a host state change notification. We * unlock any active locks owned by the host. When rpc.lockd is @@ -727,7 +772,7 @@ nlm_host_notify(struct nlm_host *host, int newstate) nlm_cancel_async_lock(af); } mtx_unlock(&host->nh_lock); - nlm_free_finished_locks(host); + nlm_check_expired_locks(host); /* * The host just rebooted - trash its locks. @@ -735,7 +780,6 @@ nlm_host_notify(struct nlm_host *host, int newstate) lf_clearremotesys(host->nh_sysid); host->nh_state = newstate; -#ifdef NFSCLIENT /* * If we have any remote locks for this host (i.e. it * represents a remote NFS server that our local NFS client @@ -750,7 +794,6 @@ nlm_host_notify(struct nlm_host *host, int newstate) kthread_add(nlm_client_recovery_start, host, curproc, &td, 0, 0, "NFS lock recovery for %s", host->nh_caller_name); } -#endif } /* @@ -806,7 +849,9 @@ nlm_create_host(const char* caller_name) host->nh_vers = 0; host->nh_state = 0; host->nh_monstate = NLM_UNMONITORED; + host->nh_grantcookie = 1; TAILQ_INIT(&host->nh_pending); + TAILQ_INIT(&host->nh_granted); TAILQ_INIT(&host->nh_finished); TAILQ_INSERT_TAIL(&nlm_hosts, host, nh_link); @@ -1479,10 +1524,8 @@ nlm_server_main(int addr_count, char **addrs) enum clnt_stat stat; struct nlm_host *host, *nhost; struct nlm_waiting_lock *nw; -#ifdef NFSCLIENT vop_advlock_t *old_nfs_advlock; vop_reclaim_t *old_nfs_reclaim; -#endif int v4_used; #ifdef INET6 int v6_used; @@ -1583,20 +1626,16 @@ nlm_server_main(int addr_count, char **addrs) NLM_DEBUG(1, "NLM: local NSM state is %d\n", smstat.state); nlm_nsm_state = smstat.state; -#ifdef NFSCLIENT old_nfs_advlock = nfs_advlock_p; nfs_advlock_p = nlm_advlock; old_nfs_reclaim = nfs_reclaim_p; nfs_reclaim_p = nlm_reclaim; -#endif svc_run(pool); error = 0; -#ifdef NFSCLIENT nfs_advlock_p = old_nfs_advlock; nfs_reclaim_p = old_nfs_reclaim; -#endif out: if (pool) @@ -1847,7 +1886,7 @@ nlm_do_test(nlm4_testargs *argp, nlm4_testres *result, struct svc_req *rqstp, NLM_DEBUG(3, "nlm_do_test(): caller_name = %s (sysid = %d)\n", host->nh_caller_name, host->nh_sysid); - nlm_free_finished_locks(host); + nlm_check_expired_locks(host); sysid = host->nh_sysid; nlm_convert_to_fhandle_t(&fh, &argp->alock.fh); @@ -1952,7 +1991,7 @@ nlm_do_lock(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp, nlm_host_notify(host, argp->state); } - nlm_free_finished_locks(host); + nlm_check_expired_locks(host); sysid = host->nh_sysid; nlm_convert_to_fhandle_t(&fh, &argp->alock.fh); @@ -1981,6 +2020,7 @@ nlm_do_lock(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp, if (argp->block) { struct nlm_async_lock *af; CLIENT *client; + struct nlm_grantcookie cookie; /* * First, make sure we can contact the host's NLM. @@ -2006,6 +2046,10 @@ nlm_do_lock(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp, break; } } + if (!af) { + cookie.ng_sysid = host->nh_sysid; + cookie.ng_cookie = host->nh_grantcookie++; + } mtx_unlock(&host->nh_lock); if (af) { CLNT_RELEASE(client); @@ -2024,6 +2068,8 @@ nlm_do_lock(nlm4_lockargs *argp, nlm4_res *result, struct svc_req *rqstp, * We use M_RPC here so that we can xdr_free the thing * later. */ + nlm_make_netobj(&af->af_granted.cookie, + (caddr_t)&cookie, sizeof(cookie), M_RPC); af->af_granted.exclusive = argp->exclusive; af->af_granted.alock.caller_name = strdup(argp->alock.caller_name, M_RPC); @@ -2124,7 +2170,7 @@ nlm_do_cancel(nlm4_cancargs *argp, nlm4_res *result, struct svc_req *rqstp, NLM_DEBUG(3, "nlm_do_cancel(): caller_name = %s (sysid = %d)\n", host->nh_caller_name, host->nh_sysid); - nlm_free_finished_locks(host); + nlm_check_expired_locks(host); sysid = host->nh_sysid; nlm_convert_to_fhandle_t(&fh, &argp->alock.fh); @@ -2213,7 +2259,7 @@ nlm_do_unlock(nlm4_unlockargs *argp, nlm4_res *result, struct svc_req *rqstp, NLM_DEBUG(3, "nlm_do_unlock(): caller_name = %s (sysid = %d)\n", host->nh_caller_name, host->nh_sysid); - nlm_free_finished_locks(host); + nlm_check_expired_locks(host); sysid = host->nh_sysid; nlm_convert_to_fhandle_t(&fh, &argp->alock.fh); @@ -2270,6 +2316,7 @@ nlm_do_granted(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp, nlm_copy_netobj(&result->cookie, &argp->cookie, M_RPC); result->stat.stat = nlm4_denied; + KFAIL_POINT_CODE(DEBUG_FP, nlm_deny_grant, goto out); mtx_lock(&nlm_global_lock); TAILQ_FOREACH(nw, &nlm_waiting_locks, nw_link) { @@ -2288,12 +2335,73 @@ nlm_do_granted(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp, } } mtx_unlock(&nlm_global_lock); + +out: if (rpcp) *rpcp = nlm_host_get_rpc(host, TRUE); nlm_host_release(host); return (0); } +void +nlm_do_granted_res(nlm4_res *argp, struct svc_req *rqstp) +{ + struct nlm_host *host = NULL; + struct nlm_async_lock *af = NULL; + int error; + + if (argp->cookie.n_len != sizeof(struct nlm_grantcookie)) { + NLM_DEBUG(1, "NLM: bogus grant cookie"); + goto out; + } + + host = nlm_find_host_by_sysid(ng_sysid(&argp->cookie)); + if (!host) { + NLM_DEBUG(1, "NLM: Unknown host rejected our grant"); + goto out; + } + + mtx_lock(&host->nh_lock); + TAILQ_FOREACH(af, &host->nh_granted, af_link) + if (ng_cookie(&argp->cookie) == + ng_cookie(&af->af_granted.cookie)) + break; + if (af) + TAILQ_REMOVE(&host->nh_granted, af, af_link); + mtx_unlock(&host->nh_lock); + + if (!af) { + NLM_DEBUG(1, "NLM: host %s (sysid %d) replied to our grant " + "with unrecognized cookie %d:%d", host->nh_caller_name, + host->nh_sysid, ng_sysid(&argp->cookie), + ng_cookie(&argp->cookie)); + goto out; + } + + if (argp->stat.stat != nlm4_granted) { + af->af_fl.l_type = F_UNLCK; + error = VOP_ADVLOCK(af->af_vp, NULL, F_UNLCK, &af->af_fl, F_REMOTE); + if (error) { + NLM_DEBUG(1, "NLM: host %s (sysid %d) rejected our grant " + "and we failed to unlock (%d)", host->nh_caller_name, + host->nh_sysid, error); + goto out; + } + + NLM_DEBUG(5, "NLM: async lock %p rejected by host %s (sysid %d)", + af, host->nh_caller_name, host->nh_sysid); + } else { + NLM_DEBUG(5, "NLM: async lock %p accepted by host %s (sysid %d)", + af, host->nh_caller_name, host->nh_sysid); + } + + out: + if (af) + nlm_free_async_lock(af); + if (host) + nlm_host_release(host); +} + void nlm_do_free_all(nlm4_notify *argp) { diff --git a/sys/nlm/nlm_prot_server.c b/sys/nlm/nlm_prot_server.c index 6ff86ce38159..21b54cbb27ef 100644 --- a/sys/nlm/nlm_prot_server.c +++ b/sys/nlm/nlm_prot_server.c @@ -671,6 +671,7 @@ bool_t nlm4_granted_res_4_svc(nlm4_res *argp, void *result, struct svc_req *rqstp) { + nlm_do_granted_res(argp, rqstp); return (FALSE); } diff --git a/sys/opencrypto/crypto.c b/sys/opencrypto/crypto.c index 0637c86411ba..58107802fd7a 100644 --- a/sys/opencrypto/crypto.c +++ b/sys/opencrypto/crypto.c @@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$"); #define CRYPTO_TIMING /* enable timing support */ #include "opt_ddb.h" +#include "opt_kdtrace.h" #include #include @@ -68,6 +69,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -80,6 +82,8 @@ __FBSDID("$FreeBSD$"); #include #include "cryptodev_if.h" +SDT_PROVIDER_DEFINE(opencrypto); + /* * Crypto drivers register themselves by allocating a slot in the * crypto_drivers table with crypto_get_driverid() and then registering diff --git a/sys/opencrypto/cryptosoft.c b/sys/opencrypto/cryptosoft.c index 2769be6672dc..a404cbc75a21 100644 --- a/sys/opencrypto/cryptosoft.c +++ b/sys/opencrypto/cryptosoft.c @@ -434,7 +434,16 @@ swcr_authprepare(struct auth_hash *axf, struct swcr_data *sw, u_char *key, case CRYPTO_MD5_KPDK: case CRYPTO_SHA1_KPDK: { - /* We need a buffer that can hold an md5 and a sha1 result. */ + /* + * We need a buffer that can hold an md5 and a sha1 result + * just to throw it away. + * What we do here is the initial part of: + * ALGO( key, keyfill, .. ) + * adding the key to sw_ictx and abusing Final() to get the + * "keyfill" padding. + * In addition we abuse the sw_octx to save the key to have + * it to be able to append it at the end in swcr_authcompute(). + */ u_char buf[SHA1_RESULTLEN]; sw->sw_klen = klen; @@ -495,9 +504,17 @@ swcr_authcompute(struct cryptodesc *crd, struct swcr_data *sw, caddr_t buf, case CRYPTO_MD5_KPDK: case CRYPTO_SHA1_KPDK: + /* If we have no key saved, return error. */ if (sw->sw_octx == NULL) return EINVAL; + /* + * Add the trailing copy of the key (see comment in + * swcr_authprepare()) after the data: + * ALGO( .., key, algofill ) + * and let Final() do the proper, natural "algofill" + * padding. + */ axf->Update(&ctx, sw->sw_octx, sw->sw_klen); axf->Final(aalg, &ctx); break; @@ -552,7 +569,7 @@ swcr_compdec(struct cryptodesc *crd, struct swcr_data *sw, sw->sw_size = result; /* Check the compressed size when doing compression */ if (crd->crd_flags & CRD_F_COMP) { - if (result > crd->crd_len) { + if (result >= crd->crd_len) { /* Compression was useless, we lost time */ free(out, M_CRYPTO_DATA); return 0; diff --git a/sys/opencrypto/deflate.c b/sys/opencrypto/deflate.c index f4b4f48ff433..2113611ae0dc 100644 --- a/sys/opencrypto/deflate.c +++ b/sys/opencrypto/deflate.c @@ -35,16 +35,30 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_kdtrace.h" + #include #include #include #include +#include +#include #include #include #include #include +SDT_PROVIDER_DECLARE(opencrypto); +SDT_PROBE_DEFINE2(opencrypto, deflate, deflate_global, entry, + "int", "u_int32_t"); +SDT_PROBE_DEFINE5(opencrypto, deflate, deflate_global, bad, + "int", "int", "int", "int", "int"); +SDT_PROBE_DEFINE5(opencrypto, deflate, deflate_global, iter, + "int", "int", "int", "int", "int"); +SDT_PROBE_DEFINE2(opencrypto, deflate, deflate_global, return, + "int", "u_int32_t"); + int window_inflate = -1 * MAX_WBITS; int window_deflate = -12; @@ -65,111 +79,170 @@ deflate_global(data, size, decomp, out) z_stream zbuf; u_int8_t *output; u_int32_t count, result; - int error, i = 0, j; - struct deflate_buf buf[ZBUF]; + int error, i; + struct deflate_buf *bufh, *bufp; - bzero(&zbuf, sizeof(z_stream)); - for (j = 0; j < ZBUF; j++) - buf[j].flag = 0; - - zbuf.next_in = data; /* data that is going to be processed */ - zbuf.zalloc = z_alloc; - zbuf.zfree = z_free; - zbuf.opaque = Z_NULL; - zbuf.avail_in = size; /* Total length of data to be processed */ + SDT_PROBE2(opencrypto, deflate, deflate_global, entry, decomp, size); + bufh = bufp = NULL; if (!decomp) { - buf[i].out = malloc((u_long) size, M_CRYPTO_DATA, - M_NOWAIT); - if (buf[i].out == NULL) - goto bad; - buf[i].size = size; - buf[i].flag = 1; - i++; + i = 1; } else { /* * Choose a buffer with 4x the size of the input buffer * for the size of the output buffer in the case of * decompression. If it's not sufficient, it will need to be - * updated while the decompression is going on + * updated while the decompression is going on. */ - - buf[i].out = malloc((u_long) (size * 4), - M_CRYPTO_DATA, M_NOWAIT); - if (buf[i].out == NULL) - goto bad; - buf[i].size = size * 4; - buf[i].flag = 1; - i++; + i = 4; } + /* + * Make sure we do have enough output space. Repeated calls to + * deflate need at least 6 bytes of output buffer space to avoid + * repeated markers. We will always provide at least 16 bytes. + */ + while ((size * i) < 16) + i++; - zbuf.next_out = buf[0].out; - zbuf.avail_out = buf[0].size; + bufh = bufp = malloc(sizeof(*bufp) + (size_t)(size * i), + M_CRYPTO_DATA, M_NOWAIT); + if (bufp == NULL) { + SDT_PROBE3(opencrypto, deflate, deflate_global, bad, + decomp, 0, __LINE__); + goto bad2; + } + bufp->next = NULL; + bufp->size = size * i; + + bzero(&zbuf, sizeof(z_stream)); + zbuf.zalloc = z_alloc; + zbuf.zfree = z_free; + zbuf.opaque = Z_NULL; + zbuf.next_in = data; /* Data that is going to be processed. */ + zbuf.avail_in = size; /* Total length of data to be processed. */ + zbuf.next_out = bufp->data; + zbuf.avail_out = bufp->size; error = decomp ? inflateInit2(&zbuf, window_inflate) : deflateInit2(&zbuf, Z_DEFAULT_COMPRESSION, Z_METHOD, window_deflate, Z_MEMLEVEL, Z_DEFAULT_STRATEGY); - - if (error != Z_OK) + if (error != Z_OK) { + SDT_PROBE3(opencrypto, deflate, deflate_global, bad, + decomp, error, __LINE__); goto bad; - for (;;) { - error = decomp ? inflate(&zbuf, Z_PARTIAL_FLUSH) : - deflate(&zbuf, Z_PARTIAL_FLUSH); - if (error != Z_OK && error != Z_STREAM_END) - goto bad; - else if (zbuf.avail_in == 0 && zbuf.avail_out != 0) - goto end; - else if (zbuf.avail_out == 0 && i < (ZBUF - 1)) { - /* we need more output space, allocate size */ - buf[i].out = malloc((u_long) size, - M_CRYPTO_DATA, M_NOWAIT); - if (buf[i].out == NULL) - goto bad; - zbuf.next_out = buf[i].out; - buf[i].size = size; - buf[i].flag = 1; - zbuf.avail_out = buf[i].size; - i++; - } else - goto bad; } -end: + for (;;) { + error = decomp ? inflate(&zbuf, Z_SYNC_FLUSH) : + deflate(&zbuf, Z_FINISH); + if (error != Z_OK && error != Z_STREAM_END) { + /* + * Unfortunately we are limited to 5 arguments, + * thus use two probes. + */ + SDT_PROBE5(opencrypto, deflate, deflate_global, bad, + decomp, error, __LINE__, + zbuf.avail_in, zbuf.avail_out); + SDT_PROBE5(opencrypto, deflate, deflate_global, bad, + decomp, error, __LINE__, + zbuf.state->dummy, zbuf.total_out); + goto bad; + } + SDT_PROBE5(opencrypto, deflate, deflate_global, iter, + decomp, error, __LINE__, + zbuf.avail_in, zbuf.avail_out); + SDT_PROBE5(opencrypto, deflate, deflate_global, iter, + decomp, error, __LINE__, + zbuf.state->dummy, zbuf.total_out); + if (decomp && zbuf.avail_in == 0 && error == Z_STREAM_END) { + /* Done. */ + break; + } else if (!decomp && error == Z_STREAM_END) { + /* Done. */ + break; + } else if (zbuf.avail_out == 0) { + struct deflate_buf *p; + + /* We need more output space for another iteration. */ + p = malloc(sizeof(*p) + (size_t)(size * i), + M_CRYPTO_DATA, M_NOWAIT); + if (p == NULL) { + SDT_PROBE3(opencrypto, deflate, deflate_global, + bad, decomp, 0, __LINE__); + goto bad; + } + p->next = NULL; + p->size = size * i; + bufp->next = p; + bufp = p; + zbuf.next_out = bufp->data; + zbuf.avail_out = bufp->size; + } else { + /* Unexpect result. */ + /* + * Unfortunately we are limited to 5 arguments, + * thus, again, use two probes. + */ + SDT_PROBE5(opencrypto, deflate, deflate_global, bad, + decomp, error, __LINE__, + zbuf.avail_in, zbuf.avail_out); + SDT_PROBE5(opencrypto, deflate, deflate_global, bad, + decomp, error, __LINE__, + zbuf.state->dummy, zbuf.total_out); + goto bad; + } + } + result = count = zbuf.total_out; - *out = malloc((u_long) result, M_CRYPTO_DATA, M_NOWAIT); - if (*out == NULL) + *out = malloc(result, M_CRYPTO_DATA, M_NOWAIT); + if (*out == NULL) { + SDT_PROBE3(opencrypto, deflate, deflate_global, bad, + decomp, 0, __LINE__); goto bad; + } if (decomp) inflateEnd(&zbuf); else deflateEnd(&zbuf); output = *out; - for (j = 0; buf[j].flag != 0; j++) { - if (count > buf[j].size) { - bcopy(buf[j].out, *out, buf[j].size); - *out += buf[j].size; - free(buf[j].out, M_CRYPTO_DATA); - count -= buf[j].size; + for (bufp = bufh; bufp != NULL; ) { + if (count > bufp->size) { + struct deflate_buf *p; + + bcopy(bufp->data, *out, bufp->size); + *out += bufp->size; + count -= bufp->size; + p = bufp; + bufp = bufp->next; + free(p, M_CRYPTO_DATA); } else { - /* it should be the last buffer */ - bcopy(buf[j].out, *out, count); + /* It should be the last buffer. */ + bcopy(bufp->data, *out, count); *out += count; - free(buf[j].out, M_CRYPTO_DATA); + free(bufp, M_CRYPTO_DATA); + bufp = NULL; count = 0; } } *out = output; + SDT_PROBE2(opencrypto, deflate, deflate_global, return, decomp, result); return result; bad: - *out = NULL; - for (j = 0; buf[j].flag != 0; j++) - free(buf[j].out, M_CRYPTO_DATA); if (decomp) inflateEnd(&zbuf); else deflateEnd(&zbuf); + for (bufp = bufh; bufp != NULL; ) { + struct deflate_buf *p; + + p = bufp; + bufp = bufp->next; + free(p, M_CRYPTO_DATA); + } +bad2: + *out = NULL; return 0; } diff --git a/sys/opencrypto/deflate.h b/sys/opencrypto/deflate.h index 5c8ebd41e8de..dcf7a8441350 100644 --- a/sys/opencrypto/deflate.h +++ b/sys/opencrypto/deflate.h @@ -47,10 +47,14 @@ u_int32_t deflate_global(u_int8_t *, u_int32_t, int, u_int8_t **); void *z_alloc(void *, u_int, u_int); void z_free(void *, void *); +/* + * We are going to use a combined allocation to hold the metadata + * from the struct immediately followed by the real application data. + */ struct deflate_buf { - u_int8_t *out; - u_int32_t size; - int flag; + struct deflate_buf *next; + uint32_t size; + uint8_t data[]; }; #endif /* _CRYPTO_DEFLATE_H_ */ diff --git a/sys/pc98/cbus/cbus_dma.c b/sys/pc98/cbus/cbus_dma.c index 255f7e0ebd13..3d489e0c2b8d 100644 --- a/sys/pc98/cbus/cbus_dma.c +++ b/sys/pc98/cbus/cbus_dma.c @@ -72,6 +72,8 @@ static u_int8_t dma_bounced = 0; static u_int8_t dma_busy = 0; /* Used in isa_dmastart() */ static u_int8_t dma_inuse = 0; /* User for acquire/release */ static u_int8_t dma_auto_mode = 0; +static struct mtx isa_dma_lock; +MTX_SYSINIT(isa_dma_lock, &isa_dma_lock, "isa DMA lock", MTX_DEF); #define VALID_DMA_MASK (3) @@ -93,22 +95,31 @@ isa_dma_init(int chan, u_int bouncebufsize, int flag) panic("isa_dma_init: impossible request"); #endif - dma_bouncebufsize[chan] = bouncebufsize; /* Try malloc() first. It works better if it works. */ buf = malloc(bouncebufsize, M_DEVBUF, flag); if (buf != NULL) { - if (isa_dmarangecheck(buf, bouncebufsize, chan) == 0) { - dma_bouncebuf[chan] = buf; - return (0); + if (isa_dmarangecheck(buf, bouncebufsize, chan) != 0) { + free(buf, M_DEVBUF); + buf = NULL; } - free(buf, M_DEVBUF); } - buf = contigmalloc(bouncebufsize, M_DEVBUF, flag, 0ul, 0xfffffful, + + if (buf == NULL) { + buf = contigmalloc(bouncebufsize, M_DEVBUF, flag, 0ul, 0xfffffful, 1ul, chan & 4 ? 0x20000ul : 0x10000ul); + } + if (buf == NULL) return (ENOMEM); + + mtx_lock(&isa_dma_lock); + + dma_bouncebufsize[chan] = bouncebufsize; dma_bouncebuf[chan] = buf; + + mtx_unlock(&isa_dma_lock); + return (0); } @@ -125,12 +136,15 @@ isa_dma_acquire(chan) panic("isa_dma_acquire: channel out of range"); #endif + mtx_lock(&isa_dma_lock); if (dma_inuse & (1 << chan)) { printf("isa_dma_acquire: channel %d already in use\n", chan); + mtx_unlock(&isa_dma_lock); return (EBUSY); } dma_inuse |= (1 << chan); dma_auto_mode &= ~(1 << chan); + mtx_unlock(&isa_dma_lock); return (0); } @@ -147,8 +161,11 @@ isa_dma_release(chan) if (chan & ~VALID_DMA_MASK) panic("isa_dma_release: channel out of range"); + mtx_lock(&isa_dma_lock); if ((dma_inuse & (1 << chan)) == 0) printf("isa_dma_release: channel %d not in use\n", chan); +#else + mtx_lock(&isa_dma_lock); #endif if (dma_busy & (1 << chan)) { @@ -163,6 +180,8 @@ isa_dma_release(chan) dma_inuse &= ~(1 << chan); dma_auto_mode &= ~(1 << chan); + + mtx_unlock(&isa_dma_lock); } /* @@ -175,8 +194,11 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) vm_paddr_t phys; int waport; caddr_t newaddr; + int dma_range_checked; - GIANT_REQUIRED; + /* translate to physical */ + phys = pmap_extract(kernel_pmap, (vm_offset_t)addr); + dma_range_checked = isa_dmarangecheck(addr, nbytes, chan); #ifdef DIAGNOSTIC if (chan & ~VALID_DMA_MASK) @@ -186,8 +208,11 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) || (chan >= 4 && (nbytes > (1<<17) || (u_int)addr & 1))) panic("isa_dmastart: impossible request"); + mtx_lock(&isa_dma_lock); if ((dma_inuse & (1 << chan)) == 0) printf("isa_dmastart: channel %d not acquired\n", chan); +#else + mtx_lock(&isa_dma_lock); #endif #if 0 @@ -202,7 +227,7 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) dma_busy |= (1 << chan); - if (isa_dmarangecheck(addr, nbytes, chan)) { + if (dma_range_checked) { if (dma_bouncebuf[chan] == NULL || dma_bouncebufsize[chan] < nbytes) panic("isa_dmastart: bad bounce buffer"); @@ -215,9 +240,6 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) addr = newaddr; } - /* translate to physical */ - phys = pmap_extract(kernel_pmap, (vm_offset_t)addr); - if (flags & ISADMA_RAW) { dma_auto_mode |= (1 << chan); } else { @@ -255,6 +277,8 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) /* unmask channel */ outb(DMA1_SMSK, chan); + + mtx_unlock(&isa_dma_lock); } void @@ -275,6 +299,7 @@ isa_dmadone(int flags, caddr_t addr, int nbytes, int chan) printf("isa_dmadone: channel %d not acquired\n", chan); #endif + mtx_lock(&isa_dma_lock); if (((dma_busy & (1 << chan)) == 0) && (dma_auto_mode & (1 << chan)) == 0 ) printf("isa_dmadone: channel %d not busy\n", chan); @@ -290,6 +315,7 @@ isa_dmadone(int flags, caddr_t addr, int nbytes, int chan) dma_bounced &= ~(1 << chan); } dma_busy &= ~(1 << chan); + mtx_unlock(&isa_dma_lock); } /* @@ -306,8 +332,6 @@ isa_dmarangecheck(caddr_t va, u_int length, int chan) vm_offset_t endva; u_int dma_pgmsk = (chan & 4) ? ~(128*1024-1) : ~(64*1024-1); - GIANT_REQUIRED; - endva = (vm_offset_t)round_page((vm_offset_t)va + length); for (; va < (caddr_t) endva ; va += PAGE_SIZE) { phys = trunc_page(pmap_extract(kernel_pmap, (vm_offset_t)va)); @@ -364,13 +388,15 @@ isa_dmarangecheck(caddr_t va, u_int length, int chan) * or -1 if the channel requested is not active. * */ -int -isa_dmastatus(int chan) +static int +isa_dmastatus_locked(int chan) { u_long cnt = 0; int ffport, waport; u_long low1, high1, low2, high2; + mtx_assert(&isa_dma_lock, MA_OWNED); + /* channel active? */ if ((dma_inuse & (1 << chan)) == 0) { printf("isa_dmastatus: channel %d not active\n", chan); @@ -411,6 +437,18 @@ isa_dmastatus(int chan) return(cnt); } +int +isa_dmastatus(int chan) +{ + int status; + + mtx_lock(&isa_dma_lock); + status = isa_dmastatus_locked(chan); + mtx_unlock(&isa_dma_lock); + + return (status); +} + /* * Reached terminal count yet ? */ @@ -427,19 +465,27 @@ isa_dmatc(int chan) int isa_dmastop(int chan) { + int status; + + mtx_lock(&isa_dma_lock); if ((dma_inuse & (1 << chan)) == 0) printf("isa_dmastop: channel %d not acquired\n", chan); if (((dma_busy & (1 << chan)) == 0) && ((dma_auto_mode & (1 << chan)) == 0)) { printf("chan %d not busy\n", chan); + mtx_unlock(&isa_dma_lock); return -2 ; } if ((chan & 4) == 0) outb(DMA1_SMSK, (chan & 3) | 4 /* disable mask */); - return(isa_dmastatus(chan)); + status = isa_dmastatus_locked(chan); + + mtx_unlock(&isa_dma_lock); + + return (status); } /* diff --git a/sys/pc98/cbus/clock.c b/sys/pc98/cbus/clock.c index bb651bdc3a64..10b259868135 100644 --- a/sys/pc98/cbus/clock.c +++ b/sys/pc98/cbus/clock.c @@ -67,9 +67,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#ifdef DEV_APIC #include -#endif #include #include #include @@ -101,7 +99,7 @@ static u_int32_t i8254_lastcount; static u_int32_t i8254_offset; static int (*i8254_pending)(struct intsrc *); static int i8254_ticked; -static int using_lapic_timer; +static enum lapic_clock using_lapic_timer = LAPIC_CLOCK_NONE; /* Values for timerX_state: */ #define RELEASED 0 @@ -164,7 +162,8 @@ clkintr(struct trapframe *frame) clkintr_pending = 0; mtx_unlock_spin(&clock_lock); } - KASSERT(!using_lapic_timer, ("clk interrupt enabled with lapic timer")); + KASSERT(using_lapic_timer == LAPIC_CLOCK_NONE, + ("clk interrupt enabled with lapic timer")); #ifdef KDTRACE_HOOKS /* @@ -360,7 +359,7 @@ set_i8254_freq(u_int freq, int intr_freq) i8254_timecounter.tc_frequency = freq; mtx_lock_spin(&clock_lock); i8254_freq = freq; - if (using_lapic_timer) + if (using_lapic_timer != LAPIC_CLOCK_NONE) new_i8254_real_max_count = 0x10000; else new_i8254_real_max_count = TIMER_DIV(intr_freq); @@ -443,7 +442,7 @@ cpu_initclocks() * that it can drive hardclock(). Otherwise, change the 8254 * timecounter to user a simpler algorithm. */ - if (!using_lapic_timer) { + if (using_lapic_timer == LAPIC_CLOCK_NONE) { intr_add_handler("clk", 0, (driver_filter_t *)clkintr, NULL, NULL, INTR_TYPE_CLK, NULL); i8254_intsrc = intr_lookup_source(0); diff --git a/sys/pc98/cbus/gdc.c b/sys/pc98/cbus/gdc.c index 3fb6c82d689c..b048dad742c2 100644 --- a/sys/pc98/cbus/gdc.c +++ b/sys/pc98/cbus/gdc.c @@ -395,12 +395,13 @@ gdcioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) } static int -gdcmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot) +gdcmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { gdc_softc_t *sc; sc = GDC_SOFTC(GDC_UNIT(dev)); - return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot); + return genfbmmap(&sc->gensc, sc->adp, offset, paddr, prot, memattr); } #endif /* FB_INSTALL_CDEV */ @@ -1337,8 +1338,8 @@ gdc_blank_display(video_adapter_t *adp, int mode) * Mmap frame buffer. */ static int -gdc_mmap_buf(video_adapter_t *adp, vm_offset_t offset, vm_offset_t *paddr, - int prot) +gdc_mmap_buf(video_adapter_t *adp, vm_ooffset_t offset, vm_offset_t *paddr, + int prot, vm_memattr_t *memattr) { /* FIXME: is this correct? XXX */ if (offset > VIDEO_BUF_SIZE - PAGE_SIZE) diff --git a/sys/pc98/cbus/scterm-sck.c b/sys/pc98/cbus/scterm-sck.c index ce2324ff157a..b4bf70ffa4fe 100644 --- a/sys/pc98/cbus/scterm-sck.c +++ b/sys/pc98/cbus/scterm-sck.c @@ -94,15 +94,16 @@ typedef struct { color_t dflt_rev_color; /* default reverse color */ } term_stat; -static sc_term_init_t scterm_init; -static sc_term_term_t scterm_term; -static sc_term_puts_t scterm_puts; -static sc_term_ioctl_t scterm_ioctl; -static sc_term_reset_t scterm_reset; +static sc_term_init_t scterm_init; +static sc_term_term_t scterm_term; +static sc_term_puts_t scterm_puts; +static sc_term_ioctl_t scterm_ioctl; +static sc_term_reset_t scterm_reset; static sc_term_default_attr_t scterm_default_attr; -static sc_term_clear_t scterm_clear; -static sc_term_notify_t scterm_notify; -static sc_term_input_t scterm_input; +static sc_term_clear_t scterm_clear; +static sc_term_notify_t scterm_notify; +static sc_term_input_t scterm_input; +static sc_term_fkeystr_t scterm_fkeystr; static sc_term_sw_t sc_term_sc = { { NULL, NULL }, @@ -120,6 +121,7 @@ static sc_term_sw_t sc_term_sc = { scterm_clear, scterm_notify, scterm_input, + scterm_fkeystr, }; SCTERM_MODULE(sc, sc_term_sc); @@ -1191,6 +1193,13 @@ scterm_input(scr_stat *scp, int c, struct tty *tp) return FALSE; } +static const char * +scterm_fkeystr(scr_stat *scp, int c) +{ + + return (NULL); +} + /* * Calculate hardware attributes word using logical attributes mask and * hardware colors diff --git a/sys/pc98/conf/DEFAULTS b/sys/pc98/conf/DEFAULTS index 0002cf0a30cc..f30501e44ac1 100644 --- a/sys/pc98/conf/DEFAULTS +++ b/sys/pc98/conf/DEFAULTS @@ -24,3 +24,6 @@ device uart_ns8250 # Default partitioning schemes options GEOM_PART_BSD options GEOM_PART_PC98 + +# enable support for native hardware +device atpic diff --git a/sys/pc98/conf/GENERIC b/sys/pc98/conf/GENERIC index ef75694ca50c..9f08bf5785ad 100644 --- a/sys/pc98/conf/GENERIC +++ b/sys/pc98/conf/GENERIC @@ -23,22 +23,13 @@ cpu I586_CPU cpu I686_CPU ident GENERIC -# To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" # Default places to look for devices. - -# Use the following to compile in values accessible to the kernel -# through getenv() (or kenv(1) in userland). The format of the file -# is 'variable=value', see kenv(1) -# -# env "GENERIC.env" - makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols options SCHED_4BSD # 4BSD scheduler #options PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols -#options SCTP # Stream Control Transmission Protocol +options SCTP # Stream Control Transmission Protocol options FFS # Berkeley Fast Filesystem options SOFTUPDATES # Enable FFS soft updates support options UFS_ACL # Support for access control lists @@ -46,13 +37,13 @@ options UFS_DIRHASH # Improve performance on big directories options UFS_GJOURNAL # Enable gjournal-based UFS journaling options MD_ROOT # MD is a potential root device options NFSCLIENT # Network Filesystem Client -#options NFSSERVER # Network Filesystem Server -#options NFSLOCKD # Network Lock Manager +options NFSSERVER # Network Filesystem Server +options NFSLOCKD # Network Lock Manager options NFS_ROOT # NFS usable as /, requires NFSCLIENT options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem -#options PROCFS # Process filesystem (requires PSEUDOFS) -#options PSEUDOFS # Pseudo-filesystem framework +options PROCFS # Process filesystem (requires PSEUDOFS) +options PSEUDOFS # Pseudo-filesystem framework options GEOM_PART_GPT # GUID Partition Tables. options GEOM_LABEL # Provides labelization options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty) @@ -66,20 +57,22 @@ options EPSON_BOUNCEDMA # use bounce buffer for 15-16M #options LINE30 options KTRACE # ktrace(1) support options STACK # stack(9) support -#options SYSVSHM # SYSV-style shared memory -#options SYSVMSG # SYSV-style message queues -#options SYSVSEM # SYSV-style semaphores +options SYSVSHM # SYSV-style shared memory +options SYSVMSG # SYSV-style message queues +options SYSVSEM # SYSV-style semaphores options P1003_1B_SEMAPHORES # POSIX-style semaphores options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions options KBD_INSTALL_CDEV # install a CDEV entry in /dev options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework +options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging for use in -current options KDB # Enable kernel debugger support. options DDB # Support DDB. options GDB # Support remote GDB. +options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS options WITNESS # Enable checks to detect deadlocks and cycles @@ -114,9 +107,9 @@ device sym # NCR/Symbios Logic (newer chipsets + those of `ncr') device aic # PC-9801-100 device ct # host adapter using WD33C93[ABC] chip (C bus) -#device ncv # NCR 53C500 -#device nsp # Workbit Ninja SCSI-3 -#device stg # TMC 18C30/18C50 +device ncv # NCR 53C500 +device nsp # Workbit Ninja SCSI-3 +device stg # TMC 18C30/18C50 # SCSI peripherals device scbus # SCSI bus (required for SCSI) @@ -155,9 +148,9 @@ device sc # PCCARD (PCMCIA) support # PCMCIA and cardbus bridge support -#device cbb # cardbus (yenta) bridge -#device pccard # PC Card (16-bit) bus -#device cardbus # CardBus (32-bit) bus +device cbb # cardbus (yenta) bridge +device pccard # PC Card (16-bit) bus +device cardbus # CardBus (32-bit) bus # Serial (COM) ports #options COM_MULTIPORT @@ -169,15 +162,15 @@ device mse #device joy # NEW Parallel port -#device ppc -#device ppbus # Parallel port bus (required) -#device lpt # Printer -#device plip # TCP/IP over parallel -#device ppi # Parallel port interface device +device ppc +device ppbus # Parallel port bus (required) +device lpt # Printer +device plip # TCP/IP over parallel +device ppi # Parallel port interface device #device vpo # Requires scbus and da # OLD Parallel port # Please stay olpt driver after ppc driver -#device olpt +device olpt # PCI Ethernet NICs. device de # DEC/Intel DC21x4x (``Tulip'') @@ -223,7 +216,7 @@ device xe # Xircom pccard Ethernet #device wlan # 802.11 support #options IEEE80211_DEBUG # enable debug msgs #options IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's -#options IEEE80211_SUPPORT_MESH # enable 802.11s D3.0 support +#options IEEE80211_SUPPORT_MESH # enable 802.11s draft support #device wlan_wep # 802.11 WEP support #device wlan_ccmp # 802.11 CCMP support #device wlan_tkip # 802.11 TKIP support @@ -241,6 +234,7 @@ device xe # Xircom pccard Ethernet device loop # Network loopback device random # Entropy device device ether # Ethernet support +device vlan # 802.1Q VLAN support device tun # Packet tunnel. device pty # BSD-style compatibility pseudo ttys device md # Memory "disks" @@ -264,10 +258,6 @@ device bpf # Berkeley packet filter #device ulpt # Printer #device umass # Disks/Mass storage - Requires scbus and da #device ums # Mouse -#device rum # Ralink Technology RT2501USB wireless NICs -#device uath # Atheros AR5523 wireless NICs -#device ural # Ralink Technology RT2500USB wireless NICs -#device zyd # ZyDAS zb1211/zb1211b wireless NICs #device urio # Diamond Rio 500 MP3 player # USB Serial devices #device uark # Technologies ARK3116 based serial adapters @@ -287,6 +277,11 @@ device bpf # Berkeley packet filter #device kue # Kawasaki LSI USB Ethernet #device rue # RealTek RTL8150 USB Ethernet #device udav # Davicom DM9601E USB +# USB Wireless +#device rum # Ralink Technology RT2501USB wireless NICs +#device uath # Atheros AR5523 wireless NICs +#device ural # Ralink Technology RT2500USB wireless NICs +#device zyd # ZyDAS zb1211/zb1211b wireless NICs # FireWire support #device firewire # FireWire bus code diff --git a/sys/pc98/conf/Makefile b/sys/pc98/conf/Makefile index 2c006e9c2c80..dabcd9a48a54 100644 --- a/sys/pc98/conf/Makefile +++ b/sys/pc98/conf/Makefile @@ -1,3 +1,5 @@ # $FreeBSD$ +TARGET=pc98 + .include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/pc98/conf/NOTES b/sys/pc98/conf/NOTES index 990fc94a2ea0..03cabb1cdee7 100644 --- a/sys/pc98/conf/NOTES +++ b/sys/pc98/conf/NOTES @@ -382,11 +382,8 @@ hint.mse.0.irq="13" # ie: AT&T StarLAN 10 and EN100; 3Com 3C507; unknown NI5210; # Intel EtherExpress # le: AMD Am7900 LANCE and Am79C9xx ILACC/PCnet Ethernet interface driver -# ral: Ralink Technology IEEE 802.11 wireless adapter # sbni: Granch SBNI12-xx ISA and PCI adapters # snc: National Semiconductor DP8393X SONIC Ethernet adapter driver -# ural: Ralink Technology RT2500USB IEEE 802.11 wireless adapter -# ath: Atheros a/b/g WiFi adapters (requires ath_hal and wlan) # Order for ISA/EISA devices is important here @@ -408,7 +405,6 @@ hint.ie.2.maddr="0xd0000" hint.le.0.at="isa" hint.le.0.port="0x03d0" hint.le.0.irq="6" -device ral device sbni hint.sbni.0.at="isa" hint.sbni.0.port="0x210" @@ -419,22 +415,6 @@ hint.snc.0.at="isa" hint.snc.0.port="0x888" hint.snc.0.irq="6" hint.snc.0.maddr="0xc0000" -device ural - -device ath # Atheros pci/cardbus NIC's -device ath_hal # pci/cardbus chip support -#device ath_ar5210 # AR5210 chips -#device ath_ar5211 # AR5211 chips -#device ath_ar5212 # AR5212 chips -#device ath_rf2413 -#device ath_rf2417 -#device ath_rf2425 -#device ath_rf5111 -#device ath_rf5112 -#device ath_rf5413 -#device ath_ar5416 # AR5416 chips -options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors -device ath_rate_sample # SampleRate tx rate control for ath # # SCSI host adapters: diff --git a/sys/pc98/pc98/machdep.c b/sys/pc98/pc98/machdep.c index f052ceecb23e..f17874820b01 100644 --- a/sys/pc98/pc98/machdep.c +++ b/sys/pc98/pc98/machdep.c @@ -129,7 +129,7 @@ __FBSDID("$FreeBSD$"); #endif #ifdef DEV_ISA -#include +#include #endif /* Sanity check for __curthread() */ @@ -686,7 +686,6 @@ osigreturn(td, uap) struct osigcontext sc; struct trapframe *regs; struct osigcontext *scp; - struct proc *p = td->td_proc; int eflags, error; ksiginfo_t ksi; @@ -786,17 +785,14 @@ osigreturn(td, uap) regs->tf_eip = scp->sc_pc; regs->tf_eflags = eflags; - PROC_LOCK(p); #if defined(COMPAT_43) if (scp->sc_onstack & 1) td->td_sigstk.ss_flags |= SS_ONSTACK; else td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif - SIGSETOLD(td->td_sigmask, scp->sc_mask); - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, (sigset_t *)&scp->sc_mask, NULL, + SIGPROCMASK_OLD); return (EJUSTRETURN); } #endif /* COMPAT_43 */ @@ -813,9 +809,8 @@ freebsd4_sigreturn(td, uap) } */ *uap; { struct ucontext4 uc; - struct proc *p = td->td_proc; struct trapframe *regs; - const struct ucontext4 *ucp; + struct ucontext4 *ucp; int cs, eflags, error; ksiginfo_t ksi; @@ -903,18 +898,13 @@ freebsd4_sigreturn(td, uap) bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs)); } - PROC_LOCK(p); #if defined(COMPAT_43) if (ucp->uc_mcontext.mc_onstack & 1) td->td_sigstk.ss_flags |= SS_ONSTACK; else td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif - - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); return (EJUSTRETURN); } #endif /* COMPAT_FREEBSD4 */ @@ -930,9 +920,8 @@ sigreturn(td, uap) } */ *uap; { ucontext_t uc; - struct proc *p = td->td_proc; struct trapframe *regs; - const ucontext_t *ucp; + ucontext_t *ucp; int cs, eflags, error, ret; ksiginfo_t ksi; @@ -1024,18 +1013,14 @@ sigreturn(td, uap) bcopy(&ucp->uc_mcontext.mc_fs, regs, sizeof(*regs)); } - PROC_LOCK(p); #if defined(COMPAT_43) if (ucp->uc_mcontext.mc_onstack & 1) td->td_sigstk.ss_flags |= SS_ONSTACK; else td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif + kern_sigprocmask(td, SIG_SETMASK, &ucp->uc_sigmask, NULL, 0); - td->td_sigmask = ucp->uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); return (EJUSTRETURN); } diff --git a/sys/pci/if_rlreg.h b/sys/pci/if_rlreg.h index d112d024c5a9..b5752895a857 100644 --- a/sys/pci/if_rlreg.h +++ b/sys/pci/if_rlreg.h @@ -166,6 +166,7 @@ #define RL_HWREV_8100E 0x30800000 #define RL_HWREV_8101E 0x34000000 #define RL_HWREV_8102E 0x34800000 +#define RL_HWREV_8103E 0x34C00000 #define RL_HWREV_8168_SPIN2 0x38000000 #define RL_HWREV_8168_SPIN3 0x38400000 #define RL_HWREV_8168C 0x3C000000 diff --git a/sys/pci/ncr.c b/sys/pci/ncr.c index c344a1e85fd7..793ae80154db 100644 --- a/sys/pci/ncr.c +++ b/sys/pci/ncr.c @@ -3992,7 +3992,7 @@ ncr_action (struct cam_sim *sim, union ccb *ccb) msgptr[msglen++] = MSG_EXT_SDTR_LEN; msgptr[msglen++] = MSG_EXT_SDTR; msgptr[msglen++] = tp->tinfo.goal.period; - msgptr[msglen++] = tp->tinfo.goal.offset;; + msgptr[msglen++] = tp->tinfo.goal.offset; if (DEBUG_FLAGS & DEBUG_NEGO) { PRINT_ADDR(ccb); printf ("sync msgout: "); diff --git a/sys/pci/nfsmb.c b/sys/pci/nfsmb.c index ce3753f08f48..a178ae36235d 100644 --- a/sys/pci/nfsmb.c +++ b/sys/pci/nfsmb.c @@ -65,6 +65,10 @@ static int nfsmb_debug = 0; #define NFSMB_DEVICEID_NF4_55_SMB 0x0368 #define NFSMB_DEVICEID_NF4_61_SMB 0x03eb #define NFSMB_DEVICEID_NF4_65_SMB 0x0446 +#define NFSMB_DEVICEID_NF4_67_SMB 0x0542 +#define NFSMB_DEVICEID_NF4_73_SMB 0x07d8 +#define NFSMB_DEVICEID_NF4_78S_SMB 0x0752 +#define NFSMB_DEVICEID_NF4_79_SMB 0x0aa2 /* PCI Configuration space registers */ #define NF2PCI_SMBASE_1 PCIR_BAR(4) @@ -158,6 +162,10 @@ nfsmb_probe(device_t dev) case NFSMB_DEVICEID_NF4_55_SMB: case NFSMB_DEVICEID_NF4_61_SMB: case NFSMB_DEVICEID_NF4_65_SMB: + case NFSMB_DEVICEID_NF4_67_SMB: + case NFSMB_DEVICEID_NF4_73_SMB: + case NFSMB_DEVICEID_NF4_78S_SMB: + case NFSMB_DEVICEID_NF4_79_SMB: device_set_desc(dev, "nForce2/3/4 MCP SMBus Controller"); return (BUS_PROBE_DEFAULT); } @@ -245,6 +253,10 @@ nfsmb_attach(device_t dev) case NFSMB_DEVICEID_NF4_55_SMB: case NFSMB_DEVICEID_NF4_61_SMB: case NFSMB_DEVICEID_NF4_65_SMB: + case NFSMB_DEVICEID_NF4_67_SMB: + case NFSMB_DEVICEID_NF4_73_SMB: + case NFSMB_DEVICEID_NF4_78S_SMB: + case NFSMB_DEVICEID_NF4_79_SMB: /* Trying to add secondary device as slave */ nfsmb_sc->subdev = device_add_child(dev, "nfsmb", -1); if (!nfsmb_sc->subdev) { diff --git a/sys/powerpc/aim/clock.c b/sys/powerpc/aim/clock.c index 0a5391f7424b..b182b01f32da 100644 --- a/sys/powerpc/aim/clock.c +++ b/sys/powerpc/aim/clock.c @@ -95,8 +95,7 @@ static struct timecounter decr_timecounter = { void decr_intr(struct trapframe *frame) { - long tick; - int nticks; + int32_t tick, nticks; /* * Check whether we are initialized. @@ -113,12 +112,15 @@ decr_intr(struct trapframe *frame) tick += ticks_per_intr; mtdec(tick); - if (PCPU_GET(cpuid) == 0) { - while (nticks-- > 0) + while (nticks-- > 0) { + if (PCPU_GET(cpuid) == 0) hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); - } else { - while (nticks-- > 0) + else hardclock_cpu(TRAPF_USERMODE(frame)); + + statclock(TRAPF_USERMODE(frame)); + if (profprocs != 0) + profclock(TRAPF_USERMODE(frame), TRAPF_PC(frame)); } } @@ -145,6 +147,8 @@ decr_init(void) ticks_per_intr = ticks_per_sec / hz; mtdec(ticks_per_intr); + set_cputicker(mftb, ticks_per_sec, 0); + mtmsr(msr); } diff --git a/sys/powerpc/aim/copyinout.c b/sys/powerpc/aim/copyinout.c index 4e9f77746f1a..e023b3f79921 100644 --- a/sys/powerpc/aim/copyinout.c +++ b/sys/powerpc/aim/copyinout.c @@ -347,8 +347,19 @@ casuword(volatile u_long *addr, u_long old, u_long new) return (-1); } - val = *p; - (void) atomic_cmpset_32((volatile uint32_t *)p, old, new); + __asm __volatile ( + "1:\tlwarx %0, 0, %2\n\t" /* load old value */ + "cmplw %3, %0\n\t" /* compare */ + "bne 2f\n\t" /* exit if not equal */ + "stwcx. %4, 0, %2\n\t" /* attempt to store */ + "bne- 1b\n\t" /* spin if failed */ + "b 3f\n\t" /* we've succeeded */ + "2:\n\t" + "stwcx. %0, 0, %2\n\t" /* clear reservation (74xx) */ + "3:\n\t" + : "=&r" (val), "=m" (*p) + : "r" (p), "r" (old), "r" (new), "m" (*p) + : "cc", "memory"); td->td_pcb->pcb_onfault = NULL; diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/machdep.c index 339e64abfd8b..a9cf051b57fd 100644 --- a/sys/powerpc/aim/machdep.c +++ b/sys/powerpc/aim/machdep.c @@ -130,7 +130,6 @@ extern vm_offset_t ksym_start, ksym_end; int cold = 1; int cacheline_size = 32; -int ppc64 = 0; int hw_direct_map = 1; struct pcpu __pcpu[MAXCPU]; @@ -199,6 +198,11 @@ cpu_startup(void *dummy) ptoa(physmem) / 1048576); realmem = physmem; + if (bootverbose) + printf("available KVA = %zd (%zd MB)\n", + virtual_end - virtual_avail, + (virtual_end - virtual_avail) / 1048576); + /* * Display any holes after the first chunk of extended memory. */ @@ -256,6 +260,7 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) char *env; uint32_t msr, scratch; uint8_t *cache_check; + int ppc64; end = 0; kmdp = NULL; @@ -374,7 +379,7 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) for (cacheline_size = 0; cacheline_size < 0x100; cacheline_size++) cache_check[cacheline_size] = 0xff; - __asm __volatile("dcbz %0,0":: "r" (cache_check) : "memory"); + __asm __volatile("dcbz 0,%0":: "r" (cache_check) : "memory"); /* Find the first byte dcbz did not zero to get the cache line size */ for (cacheline_size = 0; cacheline_size < 0x100 && @@ -405,12 +410,15 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) mfsprg2 %1;" : "=r"(scratch), "=r"(ppc64)); + if (ppc64) + cpu_features |= PPC_FEATURE_64; + /* * Now copy restorebridge into all the handlers, if necessary, * and set up the trap tables. */ - if (ppc64) { + if (cpu_features & PPC_FEATURE_64) { /* Patch the two instances of rfi -> rfid */ bcopy(&rfid_patch,&rfi_patch1,4); #ifdef KDB @@ -489,7 +497,7 @@ powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp) * in case the platform module had a better idea of what we * should do. */ - if (ppc64) + if (cpu_features & PPC_FEATURE_64) pmap_mmu_install(MMU_TYPE_G5, BUS_PROBE_GENERIC); else pmap_mmu_install(MMU_TYPE_OEA, BUS_PROBE_GENERIC); @@ -692,7 +700,6 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) int sigreturn(struct thread *td, struct sigreturn_args *uap) { - struct proc *p; ucontext_t uc; int error; @@ -707,12 +714,7 @@ sigreturn(struct thread *td, struct sigreturn_args *uap) if (error != 0) return (error); - p = td->td_proc; - PROC_LOCK(p); - td->td_sigmask = uc.uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0); CTR3(KTR_SIG, "sigreturn: return td=%p pc=%#x sp=%#x", td, uc.uc_mcontext.mc_srr0, uc.uc_mcontext.mc_gpr[1]); @@ -885,6 +887,8 @@ cpu_initclocks(void) { decr_tc_init(); + stathz = hz; + profhz = hz; } /* @@ -901,8 +905,10 @@ void cpu_idle(int busy) { uint32_t msr; + uint16_t vers; msr = mfmsr(); + vers = mfpvr() >> 16; #ifdef INVARIANTS if ((msr & PSL_EE) != PSL_EE) { @@ -912,9 +918,25 @@ cpu_idle(int busy) } #endif if (powerpc_pow_enabled) { - powerpc_sync(); - mtmsr(msr | PSL_POW); - isync(); + switch (vers) { + case IBM970: + case IBM970FX: + case IBM970MP: + case MPC7447A: + case MPC7448: + case MPC7450: + case MPC7455: + case MPC7457: + __asm __volatile("\ + dssall; sync; mtmsr %0; isync" + :: "r"(msr | PSL_POW)); + break; + default: + powerpc_sync(); + mtmsr(msr | PSL_POW); + isync(); + break; + } } } diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index bbf2e04daae4..8357929e4f28 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -330,7 +330,7 @@ void moea_unmapdev(mmu_t, vm_offset_t, vm_size_t); vm_offset_t moea_kextract(mmu_t, vm_offset_t); void moea_kenter(mmu_t, vm_offset_t, vm_offset_t); boolean_t moea_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); -boolean_t moea_page_executable(mmu_t, vm_page_t); +static void moea_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t); static mmu_method_t moea_methods[] = { MMUMETHOD(mmu_change_wiring, moea_change_wiring), @@ -357,6 +357,7 @@ static mmu_method_t moea_methods[] = { MMUMETHOD(mmu_remove, moea_remove), MMUMETHOD(mmu_remove_all, moea_remove_all), MMUMETHOD(mmu_remove_write, moea_remove_write), + MMUMETHOD(mmu_sync_icache, moea_sync_icache), MMUMETHOD(mmu_zero_page, moea_zero_page), MMUMETHOD(mmu_zero_page_area, moea_zero_page_area), MMUMETHOD(mmu_zero_page_idle, moea_zero_page_idle), @@ -371,7 +372,6 @@ static mmu_method_t moea_methods[] = { MMUMETHOD(mmu_kextract, moea_kextract), MMUMETHOD(mmu_kenter, moea_kenter), MMUMETHOD(mmu_dev_direct_mapped,moea_dev_direct_mapped), - MMUMETHOD(mmu_page_executable, moea_page_executable), { 0, 0 } }; @@ -909,7 +909,7 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) * Set the start and end of kva. */ virtual_avail = VM_MIN_KERNEL_ADDRESS; - virtual_end = VM_MAX_KERNEL_ADDRESS; + virtual_end = VM_MAX_SAFE_KERNEL_ADDRESS; /* * Allocate a kernel stack with a guard page for thread0 and map it @@ -922,7 +922,7 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) thread0.td_kstack = va; thread0.td_kstack_pages = KSTACK_PAGES; for (i = 0; i < KSTACK_PAGES; i++) { - moea_kenter(mmup, va, pa);; + moea_kenter(mmup, va, pa); pa += PAGE_SIZE; va += PAGE_SIZE; } @@ -935,7 +935,7 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) va = virtual_avail; virtual_avail += round_page(MSGBUF_SIZE); while (va < virtual_avail) { - moea_kenter(mmup, va, pa);; + moea_kenter(mmup, va, pa); pa += PAGE_SIZE; va += PAGE_SIZE; } @@ -948,7 +948,7 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) va = virtual_avail; virtual_avail += DPCPU_SIZE; while (va < virtual_avail) { - moea_kenter(mmup, va, pa);; + moea_kenter(mmup, va, pa); pa += PAGE_SIZE; va += PAGE_SIZE; } @@ -1729,6 +1729,10 @@ moea_remove_all(mmu_t mmu, vm_page_t m) moea_pvo_remove(pvo, -1); PMAP_UNLOCK(pmap); } + if ((m->flags & PG_WRITEABLE) && moea_is_modified(mmu, m)) { + moea_attr_clear(m, LPTE_CHG); + vm_page_dirty(m); + } vm_page_flag_clear(m, PG_WRITEABLE); } @@ -2203,10 +2207,8 @@ moea_query_bit(vm_page_t m, int ptebit) struct pvo_entry *pvo; struct pte *pt; -#if 0 if (moea_attr_fetch(m) & ptebit) return (TRUE); -#endif LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { MOEA_PVO_CHECK(pvo); /* sanity check */ @@ -2359,12 +2361,6 @@ moea_dev_direct_mapped(mmu_t mmu, vm_offset_t pa, vm_size_t size) return (EFAULT); } -boolean_t -moea_page_executable(mmu_t mmu, vm_page_t pg) -{ - return ((moea_attr_fetch(pg) & PTE_EXEC) == PTE_EXEC); -} - /* * Map a set of physical memory pages into the kernel virtual * address space. Return a pointer to where it is mapped. This @@ -2417,10 +2413,34 @@ moea_unmapdev(mmu_t mmu, vm_offset_t va, vm_size_t size) * If this is outside kernel virtual space, then it's a * battable entry and doesn't require unmapping */ - if ((va >= VM_MIN_KERNEL_ADDRESS) && (va <= VM_MAX_KERNEL_ADDRESS)) { + if ((va >= VM_MIN_KERNEL_ADDRESS) && (va <= virtual_end)) { base = trunc_page(va); offset = va & PAGE_MASK; size = roundup(offset + size, PAGE_SIZE); kmem_free(kernel_map, base, size); } } + +static void +moea_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) +{ + struct pvo_entry *pvo; + vm_offset_t lim; + vm_paddr_t pa; + vm_size_t len; + + PMAP_LOCK(pm); + while (sz > 0) { + lim = round_page(va); + len = MIN(lim - va, sz); + pvo = moea_pvo_find_va(pm, va & ~ADDR_POFF, NULL); + if (pvo != NULL) { + pa = (pvo->pvo_pte.pte.pte_lo & PTE_RPGN) | + (va & ADDR_POFF); + moea_syncicache(pa, len); + } + va += len; + sz -= len; + } + PMAP_UNLOCK(pm); +} diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c index 4dad3dc7561a..6760feedb0b8 100644 --- a/sys/powerpc/aim/mmu_oea64.c +++ b/sys/powerpc/aim/mmu_oea64.c @@ -172,6 +172,7 @@ va_to_vsid(pmap_t pm, vm_offset_t va) return ((pm->pm_sr[(uintptr_t)va >> ADDR_SR_SHFT]) & SR_VSID_MASK); } +#define PTESYNC() __asm __volatile("ptesync"); #define TLBSYNC() __asm __volatile("tlbsync; ptesync"); #define SYNC() __asm __volatile("sync"); #define EIEIO() __asm __volatile("eieio"); @@ -182,35 +183,28 @@ va_to_vsid(pmap_t pm, vm_offset_t va) * Just to add to the fun, exceptions must be off as well * so that we can't trap in 64-bit mode. What a pain. */ +struct mtx tlbie_mutex; static __inline void TLBIE(pmap_t pmap, vm_offset_t va) { - register_t msr; - register_t scratch; - uint64_t vpn; register_t vpn_hi, vpn_lo; - -#if 1 - /* - * CPU documentation says that tlbie takes the VPN, not the - * VA. I think the code below does this correctly. We will see. - */ + register_t msr; + register_t scratch; vpn = (uint64_t)(va & ADDR_PIDX); if (pmap != NULL) vpn |= (va_to_vsid(pmap,va) << 28); -#else - vpn = va; -#endif + vpn &= ~(0xffffULL << 48); vpn_hi = (uint32_t)(vpn >> 32); vpn_lo = (uint32_t)vpn; + mtx_lock_spin(&tlbie_mutex); __asm __volatile("\ mfmsr %0; \ - clrldi %1,%0,49; \ - insrdi %1,1,1,0; \ + mr %1, %0; \ + insrdi %1,%5,1,0; \ mtmsrd %1; \ ptesync; \ \ @@ -222,7 +216,9 @@ TLBIE(pmap_t pmap, vm_offset_t va) { eieio; \ tlbsync; \ ptesync;" - : "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32)); + : "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32), "r"(1) + : "memory"); + mtx_unlock_spin(&tlbie_mutex); } #define DISABLE_TRANS(msr) msr = mfmsr(); mtmsr(msr & ~PSL_DR); isync() @@ -231,14 +227,15 @@ TLBIE(pmap_t pmap, vm_offset_t va) { #define VSID_MAKE(sr, hash) ((sr) | (((hash) & 0xfffff) << 4)) #define VSID_TO_SR(vsid) ((vsid) & 0xf) #define VSID_TO_HASH(vsid) (((vsid) >> 4) & 0xfffff) +#define VSID_HASH_MASK 0x0000007fffffffffULL -#define PVO_PTEGIDX_MASK 0x007 /* which PTEG slot */ -#define PVO_PTEGIDX_VALID 0x008 /* slot is valid */ -#define PVO_WIRED 0x010 /* PVO entry is wired */ -#define PVO_MANAGED 0x020 /* PVO entry is managed */ -#define PVO_BOOTSTRAP 0x080 /* PVO entry allocated during +#define PVO_PTEGIDX_MASK 0x007UL /* which PTEG slot */ +#define PVO_PTEGIDX_VALID 0x008UL /* slot is valid */ +#define PVO_WIRED 0x010UL /* PVO entry is wired */ +#define PVO_MANAGED 0x020UL /* PVO entry is managed */ +#define PVO_BOOTSTRAP 0x080UL /* PVO entry allocated during bootstrap */ -#define PVO_FAKE 0x100 /* fictitious phys page */ +#define PVO_FAKE 0x100UL /* fictitious phys page */ #define PVO_VADDR(pvo) ((pvo)->pvo_vaddr & ~ADDR_POFF) #define PVO_ISFAKE(pvo) ((pvo)->pvo_vaddr & PVO_FAKE) #define PVO_PTEGIDX_GET(pvo) ((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK) @@ -270,7 +267,6 @@ static struct mem_region *pregions; extern u_int phys_avail_count; extern int regions_sz, pregions_sz; extern int ofw_real_mode; -static struct ofw_map translations[64]; extern struct pmap ofw_pmap; @@ -302,9 +298,6 @@ struct pvo_head moea64_pvo_unmanaged = uma_zone_t moea64_upvo_zone; /* zone for pvo entries for unmanaged pages */ uma_zone_t moea64_mpvo_zone; /* zone for pvo entries for managed pages */ -vm_offset_t pvo_allocator_start; -vm_offset_t pvo_allocator_end; - #define BPVO_POOL_SIZE 327680 static struct pvo_entry *moea64_bpvo_pool; static int moea64_bpvo_pool_index = 0; @@ -352,7 +345,7 @@ static int moea64_pte_insert(u_int, struct lpte *); * PVO calls. */ static int moea64_pvo_enter(pmap_t, uma_zone_t, struct pvo_head *, - vm_offset_t, vm_offset_t, uint64_t, int, int); + vm_offset_t, vm_offset_t, uint64_t, int); static void moea64_pvo_remove(struct pvo_entry *, int); static struct pvo_entry *moea64_pvo_find_va(pmap_t, vm_offset_t, int *); static struct lpte *moea64_pvo_to_pte(const struct pvo_entry *, int); @@ -369,7 +362,7 @@ static boolean_t moea64_query_bit(vm_page_t, u_int64_t); static u_int moea64_clear_bit(vm_page_t, u_int64_t, u_int64_t *); static void moea64_kremove(mmu_t, vm_offset_t); static void moea64_syncicache(pmap_t pmap, vm_offset_t va, - vm_offset_t pa); + vm_offset_t pa, vm_size_t sz); static void tlbia(void); /* @@ -410,7 +403,7 @@ void moea64_unmapdev(mmu_t, vm_offset_t, vm_size_t); vm_offset_t moea64_kextract(mmu_t, vm_offset_t); void moea64_kenter(mmu_t, vm_offset_t, vm_offset_t); boolean_t moea64_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); -boolean_t moea64_page_executable(mmu_t, vm_page_t); +static void moea64_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t); static mmu_method_t moea64_bridge_methods[] = { MMUMETHOD(mmu_change_wiring, moea64_change_wiring), @@ -437,6 +430,7 @@ static mmu_method_t moea64_bridge_methods[] = { MMUMETHOD(mmu_remove, moea64_remove), MMUMETHOD(mmu_remove_all, moea64_remove_all), MMUMETHOD(mmu_remove_write, moea64_remove_write), + MMUMETHOD(mmu_sync_icache, moea64_sync_icache), MMUMETHOD(mmu_zero_page, moea64_zero_page), MMUMETHOD(mmu_zero_page_area, moea64_zero_page_area), MMUMETHOD(mmu_zero_page_idle, moea64_zero_page_idle), @@ -451,7 +445,6 @@ static mmu_method_t moea64_bridge_methods[] = { MMUMETHOD(mmu_kextract, moea64_kextract), MMUMETHOD(mmu_kenter, moea64_kenter), MMUMETHOD(mmu_dev_direct_mapped,moea64_dev_direct_mapped), - MMUMETHOD(mmu_page_executable, moea64_page_executable), { 0, 0 } }; @@ -466,9 +459,9 @@ MMU_DEF(oea64_bridge_mmu); static __inline u_int va_to_pteg(uint64_t vsid, vm_offset_t addr) { - u_int hash; + uint64_t hash; - hash = vsid ^ (((uint64_t)addr & ADDR_PIDX) >> + hash = (vsid & VSID_HASH_MASK) ^ (((uint64_t)addr & ADDR_PIDX) >> ADDR_PIDX_SHFT); return (hash & moea64_pteg_mask); } @@ -519,23 +512,6 @@ moea64_attr_save(vm_page_t m, u_int64_t ptebit) m->md.mdpg_attrs |= ptebit; } -static __inline int -moea64_pte_compare(const struct lpte *pt, const struct lpte *pvo_pt) -{ - if (pt->pte_hi == pvo_pt->pte_hi) - return (1); - - return (0); -} - -static __inline int -moea64_pte_match(struct lpte *pt, uint64_t vsid, vm_offset_t va, int which) -{ - return (pt->pte_hi & ~LPTE_VALID) == - ((vsid << LPTE_VSID_SHIFT) | - ((uint64_t)(va >> ADDR_API_SHFT64) & LPTE_API) | which); -} - static __inline void moea64_pte_create(struct lpte *pt, uint64_t vsid, vm_offset_t va, uint64_t pte_lo) @@ -590,7 +566,7 @@ moea64_pte_set(struct lpte *pt, struct lpte *pvo_pt) pt->pte_lo = pvo_pt->pte_lo; EIEIO(); pt->pte_hi = pvo_pt->pte_hi; - SYNC(); + PTESYNC(); moea64_pte_valid++; } @@ -609,7 +585,6 @@ moea64_pte_unset(struct lpte *pt, struct lpte *pvo_pt, pmap_t pmap, vm_offset_t * Invalidate the pte. */ pt->pte_hi &= ~LPTE_VALID; - TLBIE(pmap,va); /* @@ -628,6 +603,8 @@ moea64_pte_change(struct lpte *pt, struct lpte *pvo_pt, pmap_t pmap, vm_offset_t */ moea64_pte_unset(pt, pvo_pt, pmap, va); moea64_pte_set(pt, pvo_pt); + if (pmap == kernel_pmap) + isync(); } static __inline uint64_t @@ -708,24 +685,66 @@ moea64_bridge_cpu_bootstrap(mmu_t mmup, int ap) for (i = 0; i < 16; i++) { mtsrin(i << ADDR_SR_SHFT, kernel_pmap->pm_sr[i]); } - __asm __volatile ("sync; mtsdr1 %0; isync" + __asm __volatile ("ptesync; mtsdr1 %0; isync" :: "r"((u_int)moea64_pteg_table | (32 - cntlzw(moea64_pteg_mask >> 11)))); tlbia(); } +static void +moea64_add_ofw_mappings(mmu_t mmup, phandle_t mmu, size_t sz) +{ + struct ofw_map translations[sz/sizeof(struct ofw_map)]; + register_t msr; + vm_offset_t off; + vm_paddr_t pa_base; + int i, ofw_mappings; + + bzero(translations, sz); + if (OF_getprop(mmu, "translations", translations, sz) == -1) + panic("moea64_bootstrap: can't get ofw translations"); + + CTR0(KTR_PMAP, "moea64_add_ofw_mappings: translations"); + sz /= sizeof(*translations); + qsort(translations, sz, sizeof (*translations), om_cmp); + + for (i = 0, ofw_mappings = 0; i < sz; i++) { + CTR3(KTR_PMAP, "translation: pa=%#x va=%#x len=%#x", + (uint32_t)(translations[i].om_pa_lo), translations[i].om_va, + translations[i].om_len); + + if (translations[i].om_pa_lo % PAGE_SIZE) + panic("OFW translation not page-aligned!"); + + if (translations[i].om_pa_hi) + panic("OFW translations above 32-bit boundary!"); + + pa_base = translations[i].om_pa_lo; + + /* Now enter the pages for this mapping */ + + DISABLE_TRANS(msr); + for (off = 0; off < translations[i].om_len; off += PAGE_SIZE) { + moea64_kenter(mmup, translations[i].om_va + off, + pa_base + off); + + ofw_mappings++; + } + ENABLE_TRANS(msr); + } +} + static void moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) { ihandle_t mmui; phandle_t chosen; phandle_t mmu; - int sz; + size_t sz; int i, j; - int ofw_mappings; vm_size_t size, physsz, hwphyssz; vm_offset_t pa, va, off; - uint32_t msr; + register_t msr; void *dpcpu; /* We don't have a direct map since there is no BAT */ @@ -824,6 +843,11 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele mtx_init(&moea64_table_mutex, "pmap table", NULL, MTX_DEF | MTX_RECURSE); + /* + * Initialize the TLBIE lock. TLBIE can only be executed by one CPU. + */ + mtx_init(&tlbie_mutex, "tlbie mutex", NULL, MTX_SPIN); + /* * Initialise the unmanaged pvo pool. */ @@ -866,18 +890,18 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele off = (vm_offset_t)(moea64_bpvo_pool); for (pa = off; pa < off + size; pa += PAGE_SIZE) moea64_kenter(mmup, pa, pa); - ENABLE_TRANS(msr); /* - * Map certain important things, like ourselves and the exception - * vectors + * Map certain important things, like ourselves. + * + * NOTE: We do not map the exception vector space. That code is + * used only in real mode, and leaving it unmapped allows us to + * catch NULL pointer deferences, instead of making NULL a valid + * address. */ - DISABLE_TRANS(msr); for (pa = kernelstart & ~PAGE_MASK; pa < kernelend; pa += PAGE_SIZE) moea64_kenter(mmup, pa, pa); - for (pa = EXC_RSVD; pa < EXC_LAST; pa += PAGE_SIZE) - moea64_kenter(mmup, pa, pa); ENABLE_TRANS(msr); if (!ofw_real_mode) { @@ -886,8 +910,8 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele */ moea64_pinit(mmup, &ofw_pmap); - ofw_pmap.pm_sr[KERNEL_SR] = kernel_pmap->pm_sr[KERNEL_SR]; - ofw_pmap.pm_sr[KERNEL2_SR] = kernel_pmap->pm_sr[KERNEL2_SR]; + for (i = 0; i < 16; i++) + ofw_pmap.pm_sr[i] = kernel_pmap->pm_sr[i]; if ((chosen = OF_finddevice("/chosen")) == -1) panic("moea64_bootstrap: can't find /chosen"); @@ -896,54 +920,10 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele panic("moea64_bootstrap: can't get mmu package"); if ((sz = OF_getproplen(mmu, "translations")) == -1) panic("moea64_bootstrap: can't get ofw translation count"); + if (sz > 6144 /* tmpstksz - 2 KB headroom */) + panic("moea64_bootstrap: too many ofw translations"); - bzero(translations, sz); - if (OF_getprop(mmu, "translations", translations, sz) == -1) - panic("moea64_bootstrap: can't get ofw translations"); - - CTR0(KTR_PMAP, "moea64_bootstrap: translations"); - sz /= sizeof(*translations); - qsort(translations, sz, sizeof (*translations), om_cmp); - - for (i = 0, ofw_mappings = 0; i < sz; i++) { - CTR3(KTR_PMAP, "translation: pa=%#x va=%#x len=%#x", - (uint32_t)(translations[i].om_pa_lo), translations[i].om_va, - translations[i].om_len); - - if (translations[i].om_pa_lo % PAGE_SIZE) - panic("OFW translation not page-aligned!"); - - if (translations[i].om_pa_hi) - panic("OFW translations above 32-bit boundary!"); - - /* Now enter the pages for this mapping */ - - /* - * Lock the ofw pmap. pmap_kenter(), which we use for the - * pages the kernel also needs, does its own locking. - */ - PMAP_LOCK(&ofw_pmap); - DISABLE_TRANS(msr); - for (off = 0; off < translations[i].om_len; off += PAGE_SIZE) { - struct vm_page m; - - /* Map low memory mappings into the kernel pmap, too. - * These are typically mappings made by the loader, - * so we need them if we want to keep executing. */ - - if (translations[i].om_va + off < SEGMENT_LENGTH) - moea64_kenter(mmup, translations[i].om_va + off, - translations[i].om_va + off); - - m.phys_addr = translations[i].om_pa_lo + off; - moea64_enter_locked(&ofw_pmap, - translations[i].om_va + off, &m, VM_PROT_ALL, 1); - - ofw_mappings++; - } - ENABLE_TRANS(msr); - PMAP_UNLOCK(&ofw_pmap); - } + moea64_add_ofw_mappings(mmup, mmu, sz); } #ifdef SMP @@ -969,15 +949,20 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele * Set the start and end of kva. */ virtual_avail = VM_MIN_KERNEL_ADDRESS; - virtual_end = VM_MAX_KERNEL_ADDRESS; + virtual_end = VM_MAX_SAFE_KERNEL_ADDRESS; /* - * Allocate some stupid buffer regions. + * Figure out how far we can extend virtual_end into segment 16 + * without running into existing mappings. Segment 16 is guaranteed + * to contain neither RAM nor devices (at least on Apple hardware), + * but will generally contain some OFW mappings we should not + * step on. */ - pvo_allocator_start = virtual_avail; - virtual_avail += SEGMENT_LENGTH/4; - pvo_allocator_end = virtual_avail; + PMAP_LOCK(kernel_pmap); + while (moea64_pvo_find_va(kernel_pmap, virtual_end+1, NULL) == NULL) + virtual_end += PAGE_SIZE; + PMAP_UNLOCK(kernel_pmap); /* * Allocate some things for page zeroing @@ -985,16 +970,17 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele mtx_init(&moea64_scratchpage_mtx, "pvo zero page", NULL, MTX_DEF); for (i = 0; i < 2; i++) { - moea64_scratchpage_va[i] = virtual_avail; - virtual_avail += PAGE_SIZE; + moea64_scratchpage_va[i] = (virtual_end+1) - PAGE_SIZE; + virtual_end -= PAGE_SIZE; - moea64_kenter(mmup,moea64_scratchpage_va[i],kernelstart); + moea64_kenter(mmup,moea64_scratchpage_va[i],0); LOCK_TABLE(); moea64_scratchpage_pvo[i] = moea64_pvo_find_va(kernel_pmap, moea64_scratchpage_va[i],&j); moea64_scratchpage_pte[i] = moea64_pvo_to_pte( moea64_scratchpage_pvo[i],j); + moea64_scratchpage_pte[i]->pte_hi |= LPTE_LOCKED; UNLOCK_TABLE(); } @@ -1009,7 +995,7 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele thread0.td_kstack = va; thread0.td_kstack_pages = KSTACK_PAGES; for (i = 0; i < KSTACK_PAGES; i++) { - moea64_kenter(mmup, va, pa);; + moea64_kenter(mmup, va, pa); pa += PAGE_SIZE; va += PAGE_SIZE; } @@ -1022,7 +1008,7 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele va = virtual_avail; virtual_avail += round_page(MSGBUF_SIZE); while (va < virtual_avail) { - moea64_kenter(mmup, va, pa);; + moea64_kenter(mmup, va, pa); pa += PAGE_SIZE; va += PAGE_SIZE; } @@ -1032,10 +1018,9 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernele */ pa = moea64_bootstrap_alloc(DPCPU_SIZE, PAGE_SIZE); dpcpu = (void *)virtual_avail; - va = virtual_avail; virtual_avail += DPCPU_SIZE; while (va < virtual_avail) { - moea64_kenter(mmup, va, pa);; + moea64_kenter(mmup, va, pa); pa += PAGE_SIZE; va += PAGE_SIZE; } @@ -1094,15 +1079,6 @@ moea64_change_wiring(mmu_t mmu, pmap_t pm, vm_offset_t va, boolean_t wired) PMAP_UNLOCK(pm); } -/* - * Zero a page of physical memory by temporarily mapping it into the tlb. - */ -void -moea64_zero_page(mmu_t mmu, vm_page_t m) -{ - moea64_zero_page_area(mmu,m,0,PAGE_SIZE); -} - /* * This goes through and sets the physical address of our * special scratch PTE to the PA we want to zero or copy. Because @@ -1112,8 +1088,10 @@ moea64_zero_page(mmu_t mmu, vm_page_t m) static __inline void moea64_set_scratchpage_pa(int which, vm_offset_t pa) { + mtx_assert(&moea64_scratchpage_mtx, MA_OWNED); + moea64_scratchpage_pvo[which]->pvo_pte.lpte.pte_lo &= - (~LPTE_WIMG & ~LPTE_RPGN); + ~(LPTE_WIMG | LPTE_RPGN); moea64_scratchpage_pvo[which]->pvo_pte.lpte.pte_lo |= moea64_calc_wimg(pa) | (uint64_t)pa; @@ -1125,7 +1103,7 @@ void moea64_set_scratchpage_pa(int which, vm_offset_t pa) { EIEIO(); moea64_scratchpage_pte[which]->pte_hi |= LPTE_VALID; - TLBIE(kernel_pmap, moea64_scratchpage_va[which]); + PTESYNC(); isync(); } void @@ -1145,8 +1123,6 @@ moea64_copy_page(mmu_t mmu, vm_page_t msrc, vm_page_t mdst) kcopy((void *)moea64_scratchpage_va[0], (void *)moea64_scratchpage_va[1], PAGE_SIZE); - __syncicache((void *)moea64_scratchpage_va[1],PAGE_SIZE); - mtx_unlock(&moea64_scratchpage_mtx); } @@ -1164,8 +1140,27 @@ moea64_zero_page_area(mmu_t mmu, vm_page_t m, int off, int size) moea64_set_scratchpage_pa(0,pa); bzero((caddr_t)moea64_scratchpage_va[0] + off, size); - __syncicache((void *)moea64_scratchpage_va[0],PAGE_SIZE); + mtx_unlock(&moea64_scratchpage_mtx); +} +/* + * Zero a page of physical memory by temporarily mapping it + */ +void +moea64_zero_page(mmu_t mmu, vm_page_t m) +{ + vm_offset_t pa = VM_PAGE_TO_PHYS(m); + vm_offset_t off; + + if (!moea64_initialized) + panic("moea64_zero_page: can't zero pa %#x", pa); + + mtx_lock(&moea64_scratchpage_mtx); + + moea64_set_scratchpage_pa(0,pa); + for (off = 0; off < PAGE_SIZE; off += cacheline_size) + __asm __volatile("dcbz 0,%0" :: + "r"(moea64_scratchpage_va[0] + off)); mtx_unlock(&moea64_scratchpage_mtx); } @@ -1254,23 +1249,21 @@ moea64_enter_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, pvo_flags |= PVO_FAKE; error = moea64_pvo_enter(pmap, zone, pvo_head, va, VM_PAGE_TO_PHYS(m), - pte_lo, pvo_flags, 0); - - if (pmap == kernel_pmap) - TLBIE(pmap, va); + pte_lo, pvo_flags); /* * Flush the page from the instruction cache if this page is * mapped executable and cacheable. */ if ((pte_lo & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) { - moea64_syncicache(pmap, va, VM_PAGE_TO_PHYS(m)); + moea64_syncicache(pmap, va, VM_PAGE_TO_PHYS(m), PAGE_SIZE); } } static void -moea64_syncicache(pmap_t pmap, vm_offset_t va, vm_offset_t pa) +moea64_syncicache(pmap_t pmap, vm_offset_t va, vm_offset_t pa, vm_size_t sz) { + /* * This is much trickier than on older systems because * we can't sync the icache on physical addresses directly @@ -1285,16 +1278,17 @@ moea64_syncicache(pmap_t pmap, vm_offset_t va, vm_offset_t pa) * If PMAP is not bootstrapped, we are likely to be * in real mode. */ - __syncicache((void *)pa,PAGE_SIZE); + __syncicache((void *)pa, sz); } else if (pmap == kernel_pmap) { - __syncicache((void *)va,PAGE_SIZE); + __syncicache((void *)va, sz); } else { /* Use the scratch page to set up a temp mapping */ mtx_lock(&moea64_scratchpage_mtx); - moea64_set_scratchpage_pa(1,pa); - __syncicache((void *)moea64_scratchpage_va[1],PAGE_SIZE); + moea64_set_scratchpage_pa(1,pa & ~ADDR_POFF); + __syncicache((void *)(moea64_scratchpage_va[1] + + (va & ADDR_POFF)), sz); mtx_unlock(&moea64_scratchpage_mtx); } @@ -1421,22 +1415,15 @@ moea64_uma_page_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) break; } - va = pvo_allocator_start; - pvo_allocator_start += PAGE_SIZE; + va = VM_PAGE_TO_PHYS(m); - if (pvo_allocator_start >= pvo_allocator_end) - panic("Ran out of PVO allocator buffer space!"); - - /* Now call pvo_enter in recursive mode */ moea64_pvo_enter(kernel_pmap, moea64_upvo_zone, - &moea64_pvo_kunmanaged, va, VM_PAGE_TO_PHYS(m), LPTE_M, - PVO_WIRED | PVO_BOOTSTRAP, 1); + &moea64_pvo_kunmanaged, va, VM_PAGE_TO_PHYS(m), LPTE_M, + PVO_WIRED | PVO_BOOTSTRAP); - TLBIE(kernel_pmap, va); - if (needed_lock) PMAP_UNLOCK(kernel_pmap); - + if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) bzero((void *)va, PAGE_SIZE); @@ -1522,7 +1509,7 @@ moea64_remove_write(mmu_t mmu, vm_page_t m) lo |= pvo->pvo_pte.lpte.pte_lo; pvo->pvo_pte.lpte.pte_lo &= ~LPTE_CHG; moea64_pte_change(pt, &pvo->pvo_pte.lpte, - pvo->pvo_pmap, pvo->pvo_vaddr); + pvo->pvo_pmap, PVO_VADDR(pvo)); } UNLOCK_TABLE(); } @@ -1569,19 +1556,19 @@ moea64_kenter(mmu_t mmu, vm_offset_t va, vm_offset_t pa) uint64_t pte_lo; int error; +#if 0 if (!pmap_bootstrapped) { - if (va >= VM_MIN_KERNEL_ADDRESS && va < VM_MAX_KERNEL_ADDRESS) + if (va >= VM_MIN_KERNEL_ADDRESS && va < virtual_end) panic("Trying to enter an address in KVA -- %#x!\n",pa); } +#endif pte_lo = moea64_calc_wimg(pa); PMAP_LOCK(kernel_pmap); error = moea64_pvo_enter(kernel_pmap, moea64_upvo_zone, &moea64_pvo_kunmanaged, va, pa, pte_lo, - PVO_WIRED | VM_PROT_EXECUTE, 0); - - TLBIE(kernel_pmap, va); + PVO_WIRED | VM_PROT_EXECUTE); if (error != 0 && error != ENOENT) panic("moea64_kenter: failed to enter va %#x pa %#x: %d", va, @@ -1814,11 +1801,12 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva, */ if (pt != NULL) { moea64_pte_change(pt, &pvo->pvo_pte.lpte, - pvo->pvo_pmap, pvo->pvo_vaddr); + pvo->pvo_pmap, PVO_VADDR(pvo)); if ((pvo->pvo_pte.lpte.pte_lo & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) { - moea64_syncicache(pm, sva, - pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN); + moea64_syncicache(pm, sva, + pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN, + PAGE_SIZE); } } UNLOCK_TABLE(); @@ -1917,6 +1905,10 @@ moea64_remove_all(mmu_t mmu, vm_page_t m) moea64_pvo_remove(pvo, -1); PMAP_UNLOCK(pmap); } + if ((m->flags & PG_WRITEABLE) && moea64_is_modified(mmu, m)) { + moea64_attr_clear(m, LPTE_CHG); + vm_page_dirty(m); + } vm_page_flag_clear(m, PG_WRITEABLE); } @@ -1967,14 +1959,29 @@ static void tlbia(void) { vm_offset_t i; + register_t msr, scratch; - for (i = 0; i < 0xFF000; i += 0x00001000) - TLBIE(NULL,i); + for (i = 0; i < 0xFF000; i += 0x00001000) { + __asm __volatile("\ + mfmsr %0; \ + mr %1, %0; \ + insrdi %1,%3,1,0; \ + mtmsrd %1; \ + ptesync; \ + \ + tlbiel %2; \ + \ + mtmsrd %0; \ + eieio; \ + tlbsync; \ + ptesync;" + : "=r"(msr), "=r"(scratch) : "r"(i), "r"(1)); + } } static int moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, - vm_offset_t va, vm_offset_t pa, uint64_t pte_lo, int flags, int recurse) + vm_offset_t va, vm_offset_t pa, uint64_t pte_lo, int flags) { struct pvo_entry *pvo; uint64_t vsid; @@ -2010,16 +2017,14 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, * Remove any existing mapping for this page. Reuse the pvo entry if * there is a mapping. */ - if (!recurse) - LOCK_TABLE(); + LOCK_TABLE(); LIST_FOREACH(pvo, &moea64_pvo_table[ptegidx], pvo_olink) { if (pvo->pvo_pmap == pm && PVO_VADDR(pvo) == va) { if ((pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) == pa && (pvo->pvo_pte.lpte.pte_lo & LPTE_PP) == (pte_lo & LPTE_PP)) { - if (!recurse) - UNLOCK_TABLE(); + UNLOCK_TABLE(); return (0); } moea64_pvo_remove(pvo, -1); @@ -2040,12 +2045,19 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, moea64_bpvo_pool_index++; bootstrap = 1; } else { + /* + * Note: drop the table around the UMA allocation in + * case the UMA allocator needs to manipulate the page + * table. The mapping we are working with is already + * protected by the PMAP lock. + */ + UNLOCK_TABLE(); pvo = uma_zalloc(zone, M_NOWAIT); + LOCK_TABLE(); } if (pvo == NULL) { - if (!recurse) - UNLOCK_TABLE(); + UNLOCK_TABLE(); return (ENOMEM); } @@ -2077,7 +2089,7 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, first = 1; LIST_INSERT_HEAD(pvo_head, pvo, pvo_vlink); - if (pvo->pvo_pte.lpte.pte_lo & PVO_WIRED) + if (pvo->pvo_vaddr & PVO_WIRED) pm->pm_stats.wired_count++; pm->pm_stats.resident_count++; @@ -2092,8 +2104,10 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t zone, struct pvo_head *pvo_head, moea64_pte_overflow++; } - if (!recurse) - UNLOCK_TABLE(); + if (pm == kernel_pmap) + isync(); + + UNLOCK_TABLE(); return (first ? ENOENT : 0); } @@ -2111,7 +2125,7 @@ moea64_pvo_remove(struct pvo_entry *pvo, int pteidx) pt = moea64_pvo_to_pte(pvo, pteidx); if (pt != NULL) { moea64_pte_unset(pt, &pvo->pvo_pte.lpte, pvo->pvo_pmap, - pvo->pvo_vaddr); + PVO_VADDR(pvo)); PVO_PTEGIDX_CLR(pvo); } else { moea64_pte_overflow--; @@ -2122,7 +2136,7 @@ moea64_pvo_remove(struct pvo_entry *pvo, int pteidx) * Update our statistics. */ pvo->pvo_pmap->pm_stats.resident_count--; - if (pvo->pvo_pte.lpte.pte_lo & PVO_WIRED) + if (pvo->pvo_vaddr & PVO_WIRED) pvo->pvo_pmap->pm_stats.wired_count--; /* @@ -2149,7 +2163,7 @@ moea64_pvo_remove(struct pvo_entry *pvo, int pteidx) */ LIST_REMOVE(pvo, pvo_olink); if (!(pvo->pvo_vaddr & PVO_BOOTSTRAP)) - uma_zfree(pvo->pvo_vaddr & PVO_MANAGED ? moea64_mpvo_zone : + uma_zfree((pvo->pvo_vaddr & PVO_MANAGED) ? moea64_mpvo_zone : moea64_upvo_zone, pvo); moea64_pvo_entries--; moea64_pvo_remove_calls++; @@ -2158,18 +2172,16 @@ moea64_pvo_remove(struct pvo_entry *pvo, int pteidx) static __inline int moea64_pvo_pte_index(const struct pvo_entry *pvo, int ptegidx) { - int pteidx; /* * We can find the actual pte entry without searching by grabbing - * the PTEG index from 3 unused bits in pte_lo[11:9] and by + * the PTEG index from 3 unused bits in pvo_vaddr and by * noticing the HID bit. */ - pteidx = ptegidx * 8 + PVO_PTEGIDX_GET(pvo); if (pvo->pvo_pte.lpte.pte_hi & LPTE_HID) - pteidx ^= moea64_pteg_mask * 8; + ptegidx ^= moea64_pteg_mask; - return (pteidx); + return ((ptegidx << 3) | PVO_PTEGIDX_GET(pvo)); } static struct pvo_entry * @@ -2208,8 +2220,8 @@ moea64_pvo_to_pte(const struct pvo_entry *pvo, int pteidx) int ptegidx; uint64_t vsid; - vsid = va_to_vsid(pvo->pvo_pmap, pvo->pvo_vaddr); - ptegidx = va_to_pteg(vsid, pvo->pvo_vaddr); + vsid = va_to_vsid(pvo->pvo_pmap, PVO_VADDR(pvo)); + ptegidx = va_to_pteg(vsid, PVO_VADDR(pvo)); pteidx = moea64_pvo_pte_index(pvo, ptegidx); } @@ -2266,7 +2278,8 @@ moea64_pte_insert(u_int ptegidx, struct lpte *pvo_pt) * First try primary hash. */ for (pt = moea64_pteg_table[ptegidx].pt, i = 0; i < 8; i++, pt++) { - if ((pt->pte_hi & LPTE_VALID) == 0) { + if ((pt->pte_hi & LPTE_VALID) == 0 && + (pt->pte_hi & LPTE_LOCKED) == 0) { pvo_pt->pte_hi &= ~LPTE_HID; moea64_pte_set(pt, pvo_pt); return (i); @@ -2279,7 +2292,8 @@ moea64_pte_insert(u_int ptegidx, struct lpte *pvo_pt) ptegidx ^= moea64_pteg_mask; for (pt = moea64_pteg_table[ptegidx].pt, i = 0; i < 8; i++, pt++) { - if ((pt->pte_hi & LPTE_VALID) == 0) { + if ((pt->pte_hi & LPTE_VALID) == 0 && + (pt->pte_hi & LPTE_LOCKED) == 0) { pvo_pt->pte_hi |= LPTE_HID; moea64_pte_set(pt, pvo_pt); return (i); @@ -2296,10 +2310,8 @@ moea64_query_bit(vm_page_t m, u_int64_t ptebit) struct pvo_entry *pvo; struct lpte *pt; -#if 0 if (moea64_attr_fetch(m) & ptebit) return (TRUE); -#endif LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { MOEA_PVO_CHECK(pvo); /* sanity check */ @@ -2403,13 +2415,22 @@ moea64_clear_bit(vm_page_t m, u_int64_t ptebit, u_int64_t *origbit) boolean_t moea64_dev_direct_mapped(mmu_t mmu, vm_offset_t pa, vm_size_t size) { - return (EFAULT); -} + struct pvo_entry *pvo; + vm_offset_t ppa; + int error = 0; -boolean_t -moea64_page_executable(mmu_t mmu, vm_page_t pg) -{ - return (!moea64_query_bit(pg, LPTE_NOEXEC)); + PMAP_LOCK(kernel_pmap); + for (ppa = pa & ~ADDR_POFF; ppa < pa + size; ppa += PAGE_SIZE) { + pvo = moea64_pvo_find_va(kernel_pmap, ppa, NULL); + if (pvo == NULL || + (pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) != ppa) { + error = EFAULT; + break; + } + } + PMAP_UNLOCK(kernel_pmap); + + return (error); } /* @@ -2454,3 +2475,26 @@ moea64_unmapdev(mmu_t mmu, vm_offset_t va, vm_size_t size) kmem_free(kernel_map, base, size); } +static void +moea64_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) +{ + struct pvo_entry *pvo; + vm_offset_t lim; + vm_paddr_t pa; + vm_size_t len; + + PMAP_LOCK(pm); + while (sz > 0) { + lim = round_page(va); + len = MIN(lim - va, sz); + pvo = moea64_pvo_find_va(pm, va & ~ADDR_POFF, NULL); + if (pvo != NULL) { + pa = (pvo->pvo_pte.pte.pte_lo & PTE_RPGN) | + (va & ADDR_POFF); + moea64_syncicache(pm, va, pa, len); + } + va += len; + sz -= len; + } + PMAP_UNLOCK(pm); +} diff --git a/sys/powerpc/aim/mp_cpudep.c b/sys/powerpc/aim/mp_cpudep.c index 1dc9525c0eee..50f64d79441a 100644 --- a/sys/powerpc/aim/mp_cpudep.c +++ b/sys/powerpc/aim/mp_cpudep.c @@ -48,14 +48,34 @@ __FBSDID("$FreeBSD$"); #include #include -extern void *rstcode; -extern register_t l2cr_config; -extern register_t l3cr_config; - void *ap_pcpu; +static register_t bsp_state[8] __aligned(8); + +static void cpudep_save_config(void *dummy); +SYSINIT(cpu_save_config, SI_SUB_CPU, SI_ORDER_ANY, cpudep_save_config, NULL); + +uintptr_t +cpudep_ap_bootstrap(void) +{ + register_t msr, sp; + + msr = PSL_KERNSET & ~PSL_EE; + mtmsr(msr); + isync(); + + __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu)); + powerpc_sync(); + + pcpup->pc_curthread = pcpup->pc_idlethread; + pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb; + sp = pcpup->pc_curpcb->pcb_sp; + + return (sp); +} + static register_t -l2_enable(void) +mpc745x_l2_enable(register_t l2cr_config) { register_t ccr; @@ -77,7 +97,7 @@ l2_enable(void) } static register_t -l3_enable(void) +mpc745x_l3_enable(register_t l3cr_config) { register_t ccr; @@ -109,7 +129,7 @@ l3_enable(void) } static register_t -l1d_enable(void) +mpc745x_l1d_enable(void) { register_t hid; @@ -127,7 +147,7 @@ l1d_enable(void) } static register_t -l1i_enable(void) +mpc745x_l1i_enable(void) { register_t hid; @@ -144,43 +164,118 @@ l1i_enable(void) return (hid); } -uint32_t -cpudep_ap_bootstrap(void) +static void +cpudep_save_config(void *dummy) { - uint32_t hid, msr, reg, sp; + uint16_t vers; - // reg = mfspr(SPR_MSSCR0); - // mtspr(SPR_MSSCR0, reg | 0x3); + vers = mfpvr() >> 16; - __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu)); - powerpc_sync(); + switch(vers) { + case IBM970: + case IBM970FX: + case IBM970MP: + __asm __volatile ("mfspr %0,%2; mr %1,%0; srdi %0,%0,32" + : "=r" (bsp_state[0]),"=r" (bsp_state[1]) : "K" (SPR_HID0)); + __asm __volatile ("mfspr %0,%2; mr %1,%0; srdi %0,%0,32" + : "=r" (bsp_state[2]),"=r" (bsp_state[3]) : "K" (SPR_HID1)); + __asm __volatile ("mfspr %0,%2; mr %1,%0; srdi %0,%0,32" + : "=r" (bsp_state[4]),"=r" (bsp_state[5]) : "K" (SPR_HID4)); + __asm __volatile ("mfspr %0,%2; mr %1,%0; srdi %0,%0,32" + : "=r" (bsp_state[6]),"=r" (bsp_state[7]) : "K" (SPR_HID5)); - __asm __volatile("mtspr 1023,%0" :: "r"(PCPU_GET(cpuid))); - __asm __volatile("mfspr %0,1023" : "=r"(pcpup->pc_pir)); + powerpc_sync(); - msr = PSL_FP | PSL_IR | PSL_DR | PSL_ME | PSL_RI; - powerpc_sync(); - isync(); - mtmsr(msr); - isync(); + break; + case MPC7450: + case MPC7455: + case MPC7457: + /* Only MPC745x CPUs have an L3 cache. */ + bsp_state[3] = mfspr(SPR_L3CR); - if (l3cr_config != 0) - reg = l3_enable(); - if (l2cr_config != 0) - reg = l2_enable(); - reg = l1d_enable(); - reg = l1i_enable(); - - hid = mfspr(SPR_HID0); - hid &= ~(HID0_DOZE | HID0_SLEEP); - hid |= HID0_NAP | HID0_DPM; - mtspr(SPR_HID0, hid); - isync(); - - pcpup->pc_curthread = pcpup->pc_idlethread; - pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb; - sp = pcpup->pc_curpcb->pcb_sp; - - return (sp); + /* Fallthrough */ + case MPC7400: + case MPC7410: + case MPC7447A: + case MPC7448: + bsp_state[2] = mfspr(SPR_L2CR); + bsp_state[1] = mfspr(SPR_HID1); + bsp_state[0] = mfspr(SPR_HID0); + break; + } +} + +void +cpudep_ap_setup() +{ + register_t reg; + uint16_t vers; + + vers = mfpvr() >> 16; + + switch(vers) { + case IBM970: + case IBM970FX: + case IBM970MP: + /* Set HIOR to 0 */ + __asm __volatile("mtspr 311,%0" :: "r"(0)); + powerpc_sync(); + + /* + * The 970 has strange rules about how to update HID registers. + * See Table 2-3, 970MP manual + */ + + __asm __volatile("mtasr %0; sync" :: "r"(0)); + __asm __volatile(" \ + ld %0,0(%2); \ + sync; isync; \ + mtspr %1, %0; \ + mfspr %0, %1; mfspr %0, %1; mfspr %0, %1; \ + mfspr %0, %1; mfspr %0, %1; mfspr %0, %1; \ + sync; isync" + : "=r"(reg) : "K"(SPR_HID0), "r"(bsp_state)); + __asm __volatile("ld %0, 8(%2); sync; isync; \ + mtspr %1, %0; mtspr %1, %0; sync; isync" + : "=r"(reg) : "K"(SPR_HID1), "r"(bsp_state)); + __asm __volatile("ld %0, 16(%2); sync; isync; \ + mtspr %1, %0; sync; isync;" + : "=r"(reg) : "K"(SPR_HID4), "r"(bsp_state)); + __asm __volatile("ld %0, 24(%2); sync; isync; \ + mtspr %1, %0; sync; isync;" + : "=r"(reg) : "K"(SPR_HID5), "r"(bsp_state)); + + powerpc_sync(); + break; + case MPC7450: + case MPC7455: + case MPC7457: + /* Only MPC745x CPUs have an L3 cache. */ + reg = mpc745x_l3_enable(bsp_state[3]); + + /* Fallthrough */ + case MPC7400: + case MPC7410: + case MPC7447A: + case MPC7448: + /* XXX: Program the CPU ID into PIR */ + __asm __volatile("mtspr 1023,%0" :: "r"(PCPU_GET(cpuid))); + + powerpc_sync(); + isync(); + + mtspr(SPR_HID0, bsp_state[0]); isync(); + mtspr(SPR_HID1, bsp_state[1]); isync(); + + reg = mpc745x_l2_enable(bsp_state[2]); + reg = mpc745x_l1d_enable(); + reg = mpc745x_l1i_enable(); + + break; + default: + printf("WARNING: Unknown CPU type. Cache performace may be " + "suboptimal.\n"); + break; + } } diff --git a/sys/powerpc/aim/ofw_machdep.c b/sys/powerpc/aim/ofw_machdep.c index 773d229d3a27..6e276970edd0 100644 --- a/sys/powerpc/aim/ofw_machdep.c +++ b/sys/powerpc/aim/ofw_machdep.c @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -336,7 +337,7 @@ openfirmware(void *args) /* * Clear battable[] translations */ - if (!ppc64) { + if (!(cpu_features & PPC_FEATURE_64)) { __asm __volatile("mtdbatu 2, %0\n" "mtdbatu 3, %0" : : "r" (0)); } diff --git a/sys/powerpc/aim/platform_chrp.c b/sys/powerpc/aim/platform_chrp.c index 7a8fe3b94642..2258c126e720 100644 --- a/sys/powerpc/aim/platform_chrp.c +++ b/sys/powerpc/aim/platform_chrp.c @@ -35,11 +35,14 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include #include +#include #include #include @@ -220,6 +223,7 @@ chrp_smp_start_cpu(platform_t plat, struct pcpu *pc) #ifdef SMP phandle_t cpu; volatile uint8_t *rstvec; + static volatile uint8_t *rstvec_virtbase = NULL; int res, reset, timeout; cpu = pc->pc_hwref; @@ -229,15 +233,20 @@ chrp_smp_start_cpu(platform_t plat, struct pcpu *pc) ap_pcpu = pc; - rstvec = (uint8_t *)(0x80000000 + reset); + if (rstvec_virtbase == NULL) + rstvec_virtbase = pmap_mapdev(0x80000000, PAGE_SIZE); + + rstvec = rstvec_virtbase + reset; *rstvec = 4; + (void)(*rstvec); powerpc_sync(); DELAY(1); *rstvec = 0; + (void)(*rstvec); powerpc_sync(); - timeout = 1000; + timeout = 10000; while (!pc->pc_awake && timeout--) DELAY(100); diff --git a/sys/powerpc/aim/swtch.S b/sys/powerpc/aim/swtch.S index 619bf8907624..079705709f53 100644 --- a/sys/powerpc/aim/swtch.S +++ b/sys/powerpc/aim/swtch.S @@ -57,6 +57,7 @@ */ #include "assym.s" +#include "opt_sched.h" #include @@ -81,36 +82,36 @@ ENTRY(cpu_throw) * Switch to a new thread saving the current state in the old thread. */ ENTRY(cpu_switch) - stw %r5,TD_LOCK(%r3) /* ULE: update old thread's lock */ - /* XXX needs to change for MP */ - - lwz %r5,TD_PCB(%r3) /* Get the old thread's PCB ptr */ + lwz %r6,TD_PCB(%r3) /* Get the old thread's PCB ptr */ mr %r12,%r2 - stmw %r12,PCB_CONTEXT(%r5) /* Save the non-volatile GP regs. + stmw %r12,PCB_CONTEXT(%r6) /* Save the non-volatile GP regs. These can now be used for scratch */ mfcr %r16 /* Save the condition register */ - stw %r16,PCB_CR(%r5) + stw %r16,PCB_CR(%r6) mflr %r16 /* Save the link register */ - stw %r16,PCB_LR(%r5) + stw %r16,PCB_LR(%r6) mfsr %r16,USER_SR /* Save USER_SR for copyin/out */ isync - stw %r16,PCB_AIM_USR(%r5) - stw %r1,PCB_SP(%r5) /* Save the stack pointer */ + stw %r16,PCB_AIM_USR(%r6) + stw %r1,PCB_SP(%r6) /* Save the stack pointer */ mr %r14,%r3 /* Copy the old thread ptr... */ mr %r15,%r4 /* and the new thread ptr in scratch */ + mr %r16,%r5 /* and the new lock */ + mr %r17,%r6 /* and the PCB */ - lwz %r6,PCB_FLAGS(%r5) + lwz %r7,PCB_FLAGS(%r17) /* Save FPU context if needed */ - andi. %r6, %r6, PCB_FPU + andi. %r7, %r7, PCB_FPU beq .L1 bl save_fpu .L1: - lwz %r6,PCB_FLAGS(%r5) + mr %r3,%r14 /* restore old thread ptr */ + lwz %r7,PCB_FLAGS(%r17) /* Save Altivec context if needed */ - andi. %r6, %r6, PCB_VEC + andi. %r7, %r7, PCB_VEC beq .L2 bl save_vec @@ -118,7 +119,19 @@ ENTRY(cpu_switch) mr %r3,%r14 /* restore old thread ptr */ bl pmap_deactivate /* Deactivate the current pmap */ + stw %r16,TD_LOCK(%r14) /* ULE: update old thread's lock */ + cpu_switchin: +#if defined(SMP) && defined(SCHED_ULE) + /* Wait for the new thread to become unblocked */ + lis %r6,blocked_lock@ha + addi %r6,%r6,blocked_lock@l +blocked_loop: + lwz %r7,TD_LOCK(%r15) + cmpw %r6,%r7 + beq blocked_loop +#endif + mfsprg %r7,0 /* Get the pcpu pointer */ stw %r15,PC_CURTHREAD(%r7) /* Store new current thread */ lwz %r17,TD_PCB(%r15) /* Store new current PCB */ @@ -171,7 +184,7 @@ ENTRY(savectx) mr %r12,%r2 stmw %r12,PCB_CONTEXT(%r3) /* Save the non-volatile GP regs */ mfcr %r4 /* Save the condition register */ - stw %r4,PCB_CONTEXT(%r3) + stw %r4,PCB_CR(%r3) blr /* diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c index 0ab58f3830f3..35f41473e277 100644 --- a/sys/powerpc/aim/trap.c +++ b/sys/powerpc/aim/trap.c @@ -82,11 +82,10 @@ static void printtrap(u_int vector, struct trapframe *frame, int isfatal, int user); static int trap_pfault(struct trapframe *frame, int user); static int fix_unaligned(struct thread *td, struct trapframe *frame); +static int ppc_instr_emulate(struct trapframe *frame); static int handle_onfault(struct trapframe *frame); static void syscall(struct trapframe *frame); -static __inline void setusr(u_int); - int setfault(faultbuf); /* defined in locore.S */ /* Why are these not defined in a header? */ @@ -211,7 +210,9 @@ trap(struct trapframe *frame) /* Identify the trap reason */ if (frame->srr1 & EXC_PGM_TRAP) sig = SIGTRAP; - else + else if (ppc_instr_emulate(frame) == 0) + frame->srr0 += 4; + else sig = SIGILL; break; @@ -238,12 +239,6 @@ trap(struct trapframe *frame) trap_fatal(frame); } -#ifdef ALTIVEC - if (td != PCPU_GET(vecthread) || - td->td_pcb->pcb_veccpu != PCPU_GET(cpuid)) - frame->srr1 &= ~PSL_VEC; -#endif /* ALTIVEC */ - if (sig != 0) { if (p->p_sysent->sv_transtrap != NULL) sig = (p->p_sysent->sv_transtrap)(sig, type); @@ -417,43 +412,8 @@ syscall(struct trapframe *frame) CTR3(KTR_SYSC, "syscall: p=%s %s ret=%x", td->td_name, syscallnames[code], td->td_retval[0]); } - switch (error) { - case 0: - if (frame->fixreg[0] == SYS___syscall && - code != SYS_freebsd6_lseek && code != SYS_lseek) { - /* - * 64-bit return, 32-bit syscall. Fixup byte order - */ - frame->fixreg[FIRSTARG] = 0; - frame->fixreg[FIRSTARG + 1] = td->td_retval[0]; - } else { - frame->fixreg[FIRSTARG] = td->td_retval[0]; - frame->fixreg[FIRSTARG + 1] = td->td_retval[1]; - } - /* XXX: Magic number */ - frame->cr &= ~0x10000000; - break; - case ERESTART: - /* - * Set user's pc back to redo the system call. - */ - frame->srr0 -= 4; - break; - case EJUSTRETURN: - /* nothing to do */ - break; - default: - if (p->p_sysent->sv_errsize) { - if (error >= p->p_sysent->sv_errsize) - error = -1; /* XXX */ - else - error = p->p_sysent->sv_errtbl[error]; - } - frame->fixreg[FIRSTARG] = error; - /* XXX: Magic number: Carry Flag Equivalent? */ - frame->cr |= 0x10000000; - break; - } + + cpu_set_syscall_retval(td, error); /* * Check for misbehavior. @@ -534,9 +494,7 @@ trap_pfault(struct trapframe *frame, int user) PROC_UNLOCK(p); /* Fault in the user page: */ - rv = vm_fault(map, va, ftype, - (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY - : VM_FAULT_NORMAL); + rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); PROC_LOCK(p); --p->p_lock; @@ -558,13 +516,6 @@ trap_pfault(struct trapframe *frame, int user) return (SIGSEGV); } -static __inline void -setusr(u_int content) -{ - __asm __volatile ("isync; mtsr %0,%1; isync" - :: "n"(USER_SR), "r"(content)); -} - int badaddr(void *addr, size_t size) { @@ -667,3 +618,21 @@ fix_unaligned(struct thread *td, struct trapframe *frame) return -1; } + +static int +ppc_instr_emulate(struct trapframe *frame) +{ + uint32_t instr; + int reg; + + instr = fuword32((void *)frame->srr0); + + if ((instr & 0xfc1fffff) == 0x7c1f42a6) { /* mfpvr */ + reg = (instr & ~0xfc1fffff) >> 21; + frame->fixreg[reg] = mfpvr(); + return (0); + } + + return (-1); +} + diff --git a/sys/powerpc/aim/trap_subr.S b/sys/powerpc/aim/trap_subr.S index f946575a3f9c..5d9596b51848 100644 --- a/sys/powerpc/aim/trap_subr.S +++ b/sys/powerpc/aim/trap_subr.S @@ -275,10 +275,16 @@ CNAME(restorebridgesize) = .-CNAME(restorebridge) /* * Processor reset exception handler. These are typically * the first instructions the processor executes after a - * software reset. + * software reset. We do this in two bits so that we are + * not still hanging around in the trap handling region + * once the MMU is turned on. */ .globl CNAME(rstcode), CNAME(rstsize) CNAME(rstcode): + ba cpu_reset +CNAME(rstsize) = . - CNAME(rstcode) + +cpu_reset: bl 1f .space 124 @@ -296,7 +302,6 @@ CNAME(rstcode): /* Should not be reached */ 9: b 9b -CNAME(rstsize) = . - CNAME(rstcode) #endif /* @@ -451,7 +456,7 @@ disitrap: lwz %r30,(PC_TEMPSAVE+CPUSAVE_AIM_DAR)(%r1) /* get DAR */ stw %r30,(PC_DBSAVE +CPUSAVE_AIM_DAR)(%r1) /* save DAR */ lwz %r30,(PC_TEMPSAVE+CPUSAVE_AIM_DSISR)(%r1) /* get DSISR */ - lwz %r30,(PC_DBSAVE +CPUSAVE_AIM_DSISR)(%r1) /* save DSISR */ + stw %r30,(PC_DBSAVE +CPUSAVE_AIM_DSISR)(%r1) /* save DSISR */ lwz %r30,(PC_DISISAVE+CPUSAVE_R28)(%r1) /* get r28 */ stw %r30,(PC_DBSAVE +CPUSAVE_R28)(%r1) /* save r28 */ lwz %r31,(PC_DISISAVE+CPUSAVE_R29)(%r1) /* get r29 */ diff --git a/sys/powerpc/aim/uma_machdep.c b/sys/powerpc/aim/uma_machdep.c index dc03a263d7f2..6b28d67186f9 100644 --- a/sys/powerpc/aim/uma_machdep.c +++ b/sys/powerpc/aim/uma_machdep.c @@ -56,13 +56,6 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) vm_page_t m; int pflags; - if (!hw_direct_map) { - *flags = UMA_SLAB_KMEM; - va = (void *)kmem_malloc(kmem_map, bytes, wait); - - return va; - } - *flags = UMA_SLAB_PRIV; if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT) pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; @@ -82,6 +75,10 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, int wait) } va = (void *) VM_PAGE_TO_PHYS(m); + + if (!hw_direct_map) + pmap_kenter((vm_offset_t)va, VM_PAGE_TO_PHYS(m)); + if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) bzero(va, PAGE_SIZE); atomic_add_int(&hw_uma_mdpages, 1); @@ -94,13 +91,11 @@ uma_small_free(void *mem, int size, u_int8_t flags) { vm_page_t m; - if (!hw_direct_map) { - kmem_free(kmem_map, (vm_offset_t)mem, size); + if (!hw_direct_map) + pmap_remove(kernel_pmap,(vm_offset_t)mem, + (vm_offset_t)mem + PAGE_SIZE); - return; - } - - m = PHYS_TO_VM_PAGE((u_int32_t)mem); + m = PHYS_TO_VM_PAGE((vm_offset_t)mem); m->wire_count--; vm_page_free(m); atomic_subtract_int(&cnt.v_wire_count, 1); diff --git a/sys/powerpc/aim/vm_machdep.c b/sys/powerpc/aim/vm_machdep.c index af83854e3b5f..3967176e2b00 100644 --- a/sys/powerpc/aim/vm_machdep.c +++ b/sys/powerpc/aim/vm_machdep.c @@ -81,7 +81,9 @@ #include #include #include +#include #include +#include #include #include @@ -421,6 +423,59 @@ cpu_thread_swapout(struct thread *td) { } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + struct proc *p; + struct trapframe *tf; + int fixup; + + if (error == EJUSTRETURN) + return; + + p = td->td_proc; + tf = td->td_frame; + + if (tf->fixreg[0] == SYS___syscall) { + int code = tf->fixreg[FIRSTARG + 1]; + if (p->p_sysent->sv_mask) + code &= p->p_sysent->sv_mask; + fixup = (code != SYS_freebsd6_lseek && code != SYS_lseek) ? + 1 : 0; + } else + fixup = 0; + + switch (error) { + case 0: + if (fixup) { + /* + * 64-bit return, 32-bit syscall. Fixup byte order + */ + tf->fixreg[FIRSTARG] = 0; + tf->fixreg[FIRSTARG + 1] = td->td_retval[0]; + } else { + tf->fixreg[FIRSTARG] = td->td_retval[0]; + tf->fixreg[FIRSTARG + 1] = td->td_retval[1]; + } + tf->cr &= ~0x10000000; /* XXX: Magic number */ + break; + case ERESTART: + /* + * Set user's pc back to redo the system call. + */ + tf->srr0 -= 4; + break; + default: + if (p->p_sysent->sv_errsize) { + error = (error < p->p_sysent->sv_errsize) ? + p->p_sysent->sv_errtbl[error] : -1; + } + tf->fixreg[FIRSTARG] = error; + tf->cr |= 0x10000000; /* XXX: Magic number */ + break; + } +} + void cpu_set_upcall(struct thread *td, struct thread *td0) { diff --git a/sys/powerpc/booke/clock.c b/sys/powerpc/booke/clock.c index 1d9043ebbed9..74f7d7490c21 100644 --- a/sys/powerpc/booke/clock.c +++ b/sys/powerpc/booke/clock.c @@ -197,15 +197,8 @@ DELAY(int n) { u_quad_t start, end, now; -#define USECS_IN_SEC 1000000ULL - - if (n > USECS_IN_SEC) { - printf("WARNING: %s(%d) called from %p", __func__, n, - __builtin_return_address(0)); - } - start = mftb(); - end = start + (u_quad_t)ticks_per_sec / (USECS_IN_SEC / n); + end = start + (u_quad_t)ticks_per_sec / (1000000ULL / n); do { now = mftb(); } while (now < end || (now > start && end < start)); diff --git a/sys/powerpc/booke/copyinout.c b/sys/powerpc/booke/copyinout.c index fd3bdf3fe99c..91195dd3eb2c 100644 --- a/sys/powerpc/booke/copyinout.c +++ b/sys/powerpc/booke/copyinout.c @@ -295,8 +295,19 @@ casuword(volatile u_long *addr, u_long old, u_long new) return (EFAULT); } - val = *addr; - (void) atomic_cmpset_32((volatile uint32_t *)addr, old, new); + __asm __volatile ( + "1:\tlwarx %0, 0, %2\n\t" /* load old value */ + "cmplw %3, %0\n\t" /* compare */ + "bne 2f\n\t" /* exit if not equal */ + "stwcx. %4, 0, %2\n\t" /* attempt to store */ + "bne- 1b\n\t" /* spin if failed */ + "b 3f\n\t" /* we've succeeded */ + "2:\n\t" + "stwcx. %0, 0, %2\n\t" /* clear reservation (74xx) */ + "3:\n\t" + : "=&r" (val), "=m" (*addr) + : "r" (addr), "r" (old), "r" (new), "m" (*addr) + : "cc", "memory"); td->td_pcb->pcb_onfault = NULL; diff --git a/sys/powerpc/booke/machdep.c b/sys/powerpc/booke/machdep.c index 87870985ac80..d2e25e79ded9 100644 --- a/sys/powerpc/booke/machdep.c +++ b/sys/powerpc/booke/machdep.c @@ -179,7 +179,6 @@ SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size, CTLFLAG_RD, &cacheline_size, 0, ""); int hw_direct_map = 0; -int ppc64 = 0; static void cpu_e500_startup(void *); SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_e500_startup, NULL); @@ -385,7 +384,7 @@ e500_init(u_int32_t startkernel, u_int32_t endkernel, void *mdp) init_param1(); /* Start initializing proc0 and thread0. */ - proc_linkup(&proc0, &thread0); + proc_linkup0(&proc0, &thread0); thread0.td_frame = &frame0; /* Set up per-cpu data and store the pointer in SPR general 0. */ @@ -665,7 +664,6 @@ set_mcontext(struct thread *td, const mcontext_t *mcp) int sigreturn(struct thread *td, struct sigreturn_args *uap) { - struct proc *p; ucontext_t uc; int error; @@ -680,12 +678,7 @@ sigreturn(struct thread *td, struct sigreturn_args *uap) if (error != 0) return (error); - p = td->td_proc; - PROC_LOCK(p); - td->td_sigmask = uc.uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0); CTR3(KTR_SIG, "sigreturn: return td=%p pc=%#x sp=%#x", td, uc.uc_mcontext.mc_srr0, uc.uc_mcontext.mc_gpr[1]); diff --git a/sys/powerpc/booke/mp_cpudep.c b/sys/powerpc/booke/mp_cpudep.c index 59629814d618..55e33d8a3bac 100644 --- a/sys/powerpc/booke/mp_cpudep.c +++ b/sys/powerpc/booke/mp_cpudep.c @@ -47,7 +47,7 @@ extern void icache_inval(void); volatile void *ap_pcpu; -uint32_t +uintptr_t cpudep_ap_bootstrap() { uint32_t msr, sp, csr; @@ -78,3 +78,8 @@ cpudep_ap_bootstrap() return (sp); } + +void +cpudep_ap_setup() +{ +} diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index 78a72507fa44..13e637ce6034 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -319,7 +319,8 @@ static vm_offset_t mmu_booke_kextract(mmu_t, vm_offset_t); static void mmu_booke_kenter(mmu_t, vm_offset_t, vm_offset_t); static void mmu_booke_kremove(mmu_t, vm_offset_t); static boolean_t mmu_booke_dev_direct_mapped(mmu_t, vm_offset_t, vm_size_t); -static boolean_t mmu_booke_page_executable(mmu_t, vm_page_t); +static void mmu_booke_sync_icache(mmu_t, pmap_t, vm_offset_t, + vm_size_t); static vm_offset_t mmu_booke_dumpsys_map(mmu_t, struct pmap_md *, vm_size_t, vm_size_t *); static void mmu_booke_dumpsys_unmap(mmu_t, struct pmap_md *, @@ -357,6 +358,7 @@ static mmu_method_t mmu_booke_methods[] = { MMUMETHOD(mmu_remove, mmu_booke_remove), MMUMETHOD(mmu_remove_all, mmu_booke_remove_all), MMUMETHOD(mmu_remove_write, mmu_booke_remove_write), + MMUMETHOD(mmu_sync_icache, mmu_booke_sync_icache), MMUMETHOD(mmu_zero_page, mmu_booke_zero_page), MMUMETHOD(mmu_zero_page_area, mmu_booke_zero_page_area), MMUMETHOD(mmu_zero_page_idle, mmu_booke_zero_page_idle), @@ -370,7 +372,6 @@ static mmu_method_t mmu_booke_methods[] = { MMUMETHOD(mmu_kenter, mmu_booke_kenter), MMUMETHOD(mmu_kextract, mmu_booke_kextract), /* MMUMETHOD(mmu_kremove, mmu_booke_kremove), */ - MMUMETHOD(mmu_page_executable, mmu_booke_page_executable), MMUMETHOD(mmu_unmapdev, mmu_booke_unmapdev), /* dumpsys() support */ @@ -1682,21 +1683,6 @@ mmu_booke_enter_locked(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, __syncicache((void *)va, PAGE_SIZE); sync = 0; } - - if (sync) { - /* Create a temporary mapping. */ - pmap = PCPU_GET(curpmap); - - va = 0; - pte = pte_find(mmu, pmap, va); - KASSERT(pte == NULL, ("%s:%d", __func__, __LINE__)); - - flags = PTE_SR | PTE_VALID | PTE_UR | PTE_M; - - pte_enter(mmu, pmap, m, va, flags); - __syncicache((void *)va, PAGE_SIZE); - pte_remove(mmu, pmap, va, PTBL_UNHOLD); - } } /* @@ -1991,25 +1977,47 @@ mmu_booke_remove_write(mmu_t mmu, vm_page_t m) vm_page_flag_clear(m, PG_WRITEABLE); } -static boolean_t -mmu_booke_page_executable(mmu_t mmu, vm_page_t m) +static void +mmu_booke_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz) { - pv_entry_t pv; pte_t *pte; - boolean_t executable; + pmap_t pmap; + vm_page_t m; + vm_offset_t addr; + vm_paddr_t pa; + int active, valid; + + va = trunc_page(va); + sz = round_page(sz); - executable = FALSE; - TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { - PMAP_LOCK(pv->pv_pmap); - pte = pte_find(mmu, pv->pv_pmap, pv->pv_va); - if (pte != NULL && PTE_ISVALID(pte) && (pte->flags & PTE_UX)) - executable = TRUE; - PMAP_UNLOCK(pv->pv_pmap); - if (executable) - break; + vm_page_lock_queues(); + pmap = PCPU_GET(curpmap); + active = (pm == kernel_pmap || pm == pmap) ? 1 : 0; + while (sz > 0) { + PMAP_LOCK(pm); + pte = pte_find(mmu, pm, va); + valid = (pte != NULL && PTE_ISVALID(pte)) ? 1 : 0; + if (valid) + pa = PTE_PA(pte); + PMAP_UNLOCK(pm); + if (valid) { + if (!active) { + /* Create a mapping in the active pmap. */ + addr = 0; + m = PHYS_TO_VM_PAGE(pa); + PMAP_LOCK(pmap); + pte_enter(mmu, pmap, m, addr, + PTE_SR | PTE_VALID | PTE_UR); + __syncicache((void *)addr, PAGE_SIZE); + pte_remove(mmu, pmap, addr, PTBL_UNHOLD); + PMAP_UNLOCK(pmap); + } else + __syncicache((void *)va, PAGE_SIZE); + } + va += PAGE_SIZE; + sz -= PAGE_SIZE; } - - return (executable); + vm_page_unlock_queues(); } /* @@ -2299,7 +2307,7 @@ make_sure_to_unlock: static void mmu_booke_change_wiring(mmu_t mmu, pmap_t pmap, vm_offset_t va, boolean_t wired) { - pte_t *pte;; + pte_t *pte; PMAP_LOCK(pmap); if ((pte = pte_find(mmu, pmap, va)) != NULL) { @@ -2783,7 +2791,7 @@ tlb1_write_entry(unsigned int idx) mtspr(SPR_MAS7, mas7); __asm __volatile("isync; tlbwe; isync; msync"); - //debugf("tlb1_write_entry: e\n");; + //debugf("tlb1_write_entry: e\n"); } /* diff --git a/sys/powerpc/booke/trap.c b/sys/powerpc/booke/trap.c index 0e746f4f0c79..db9be64fe35d 100644 --- a/sys/powerpc/booke/trap.c +++ b/sys/powerpc/booke/trap.c @@ -417,42 +417,7 @@ syscall(struct trapframe *frame) syscallnames[code], td->td_retval[0]); } - switch (error) { - case 0: - if (frame->fixreg[0] == SYS___syscall && SYS_lseek) { - /* - * 64-bit return, 32-bit syscall. Fixup byte order - */ - frame->fixreg[FIRSTARG] = 0; - frame->fixreg[FIRSTARG + 1] = td->td_retval[0]; - } else { - frame->fixreg[FIRSTARG] = td->td_retval[0]; - frame->fixreg[FIRSTARG + 1] = td->td_retval[1]; - } - /* XXX: Magic number */ - frame->cr &= ~0x10000000; - break; - case ERESTART: - /* - * Set user's pc back to redo the system call. - */ - frame->srr0 -= 4; - break; - case EJUSTRETURN: - /* nothing to do */ - break; - default: - if (p->p_sysent->sv_errsize) { - if (error >= p->p_sysent->sv_errsize) - error = -1; /* XXX */ - else - error = p->p_sysent->sv_errtbl[error]; - } - frame->fixreg[FIRSTARG] = error; - /* XXX: Magic number: Carry Flag Equivalent? */ - frame->cr |= 0x10000000; - break; - } + cpu_set_syscall_retval(td, error); /* * Check for misbehavior. @@ -532,8 +497,7 @@ trap_pfault(struct trapframe *frame, int user) PROC_UNLOCK(p); /* Fault in the user page: */ - rv = vm_fault(map, va, ftype, - (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); + rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); PROC_LOCK(p); --p->p_lock; diff --git a/sys/powerpc/booke/vm_machdep.c b/sys/powerpc/booke/vm_machdep.c index 178b863de546..7d2b88b4bce5 100644 --- a/sys/powerpc/booke/vm_machdep.c +++ b/sys/powerpc/booke/vm_machdep.c @@ -113,7 +113,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include +#include #include #include @@ -422,6 +424,59 @@ cpu_thread_swapout(struct thread *td) } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + struct proc *p; + struct trapframe *tf; + int fixup; + + p = td->td_proc; + tf = td->td_frame; + + if (tf->fixreg[0] == SYS___syscall) { + int code = tf->fixreg[FIRSTARG + 1]; + if (p->p_sysent->sv_mask) + code &= p->p_sysent->sv_mask; + fixup = (code != SYS_freebsd6_lseek && code != SYS_lseek) ? + 1 : 0; + } else + fixup = 0; + + switch (error) { + case 0: + if (fixup) { + /* + * 64-bit return, 32-bit syscall. Fixup byte order + */ + tf->fixreg[FIRSTARG] = 0; + tf->fixreg[FIRSTARG + 1] = td->td_retval[0]; + } else { + tf->fixreg[FIRSTARG] = td->td_retval[0]; + tf->fixreg[FIRSTARG + 1] = td->td_retval[1]; + } + tf->cr &= ~0x10000000; /* XXX: Magic number */ + break; + case ERESTART: + /* + * Set user's pc back to redo the system call. + */ + tf->srr0 -= 4; + break; + case EJUSTRETURN: + /* nothing to do */ + break; + default: + if (p->p_sysent->sv_errsize) { + error = (error < p->p_sysent->sv_errsize) ? + p->p_sysent->sv_errtbl[error] : -1; + } + tf->fixreg[FIRSTARG] = error; + tf->cr |= 0x10000000; /* XXX: Magic number */ + break; + } +} + void cpu_set_upcall(struct thread *td, struct thread *td0) { diff --git a/sys/powerpc/conf/GENERIC b/sys/powerpc/conf/GENERIC index 7d9f9b09997d..6e1aa09fe186 100644 --- a/sys/powerpc/conf/GENERIC +++ b/sys/powerpc/conf/GENERIC @@ -21,9 +21,6 @@ cpu AIM ident GENERIC -#To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" - makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols # Platform support @@ -66,10 +63,12 @@ options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework +options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging for use in -current options KDB #Enable the kernel debugger options DDB #Support DDB +#options DEADLKRES #Enable the deadlock resolver options INVARIANTS #Enable calls of extra sanity checking options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS options WITNESS #Enable checks to detect deadlocks and cycles @@ -131,6 +130,7 @@ device fxp # Intel EtherExpress PRO/100B (82557, 82558) device loop # Network loopback device random # Entropy device device ether # Ethernet support +device vlan # 802.1Q VLAN support device tun # Packet tunnel. device pty # BSD-style compatibility pseudo ttys device md # Memory "disks" @@ -155,6 +155,7 @@ options KBD_INSTALL_CDEV # install a CDEV entry in /dev device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da0 device ums # Mouse +device atp # Apple USB touchpad device urio # Diamond Rio 500 MP3 player # USB Ethernet device aue # ADMtek USB Ethernet diff --git a/sys/powerpc/conf/MPC85XX b/sys/powerpc/conf/MPC85XX index 8e6badc78b72..51d4e8d53425 100644 --- a/sys/powerpc/conf/MPC85XX +++ b/sys/powerpc/conf/MPC85XX @@ -22,6 +22,7 @@ options BOOTP_WIRED_TO=tsec0 options CD9660 options COMPAT_43 options DDB +#options DEADLKRES options DEVICE_POLLING options HZ=1000 #options DIAGNOSTIC diff --git a/sys/powerpc/conf/Makefile b/sys/powerpc/conf/Makefile index 2c006e9c2c80..562bc4693cde 100644 --- a/sys/powerpc/conf/Makefile +++ b/sys/powerpc/conf/Makefile @@ -1,3 +1,5 @@ # $FreeBSD$ +TARGET=powerpc + .include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/powerpc/include/cpu.h b/sys/powerpc/include/cpu.h index 9856ab0588ef..16cabe7887ca 100644 --- a/sys/powerpc/include/cpu.h +++ b/sys/powerpc/include/cpu.h @@ -39,6 +39,27 @@ #include #include +/* + * CPU Feature Attributes + * + * These are defined in the PowerPC ELF ABI for the AT_HWCAP vector, + * and are exported to userland via the machdep.cpu_features + * sysctl. + */ + +extern int cpu_features; + +#define PPC_FEATURE_32 0x80000000 /* Always true */ +#define PPC_FEATURE_64 0x40000000 /* Defined on a 64-bit CPU */ +#define PPC_FEATURE_HAS_ALTIVEC 0x10000000 +#define PPC_FEATURE_HAS_FPU 0x08000000 +#define PPC_FEATURE_HAS_MMU 0x04000000 +#define PPC_FEATURE_UNIFIED_CACHE 0x01000000 + +#define PPC_FEATURE_BITMASK \ + "\20" \ + "\040PPC32\037PPC64\035ALTIVEC\034FPU\033MMU\031UNIFIEDCACHE" + #define TRAPF_USERMODE(frame) (((frame)->srr1 & PSL_PR) != 0) #define TRAPF_PC(frame) ((frame)->srr0) diff --git a/sys/powerpc/include/elf.h b/sys/powerpc/include/elf.h index 1224fbb284f6..e01488dcc0c4 100644 --- a/sys/powerpc/include/elf.h +++ b/sys/powerpc/include/elf.h @@ -96,4 +96,6 @@ __ElfType(Auxinfo); #define ELF_TARG_MACH EM_PPC #define ELF_TARG_VER 1 +#define ET_DYN_LOAD_ADDR 0x01010000 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/powerpc/include/hid.h b/sys/powerpc/include/hid.h index 3ba5b5594493..94f996530c51 100644 --- a/sys/powerpc/include/hid.h +++ b/sys/powerpc/include/hid.h @@ -41,6 +41,7 @@ #define HID0_ECLK 0x02000000 /* CLK_OUT clock type selection */ #define HID0_PAR 0x01000000 /* Disable precharge of ARTRY */ #define HID0_STEN 0x01000000 /* Software table search enable (7450) */ +#define HID0_DEEPNAP 0x01000000 /* Enable deep nap mode (970) */ #define HID0_HBATEN 0x00800000 /* High BAT enable (74[45][578]) */ #define HID0_DOZE 0x00800000 /* Enable doze mode */ #define HID0_NAP 0x00400000 /* Enable nap mode */ @@ -98,6 +99,12 @@ "\020b16\017TBEN\016SEL_TBCLK\015b19\014b20\013b21\012b22\011b23" \ "\010EN_MAS7_UPDATE\007DCFA\006b26\005b27\004b28\003b29\002b30\001NOPTI" +#define HID0_970_BITMASK \ + "\20" \ + "\040ONEPPC\037SINGLE\036ISYNCSC\035SERGP\031DEEPNAP\030DOZE" \ + "\027NAP\025DPM\023TG\022HANGDETECT\021NHR\020INORDER" \ + "\016TBCTRL\015TBEN\012CIABREN\011HDICEEN\001ENATTN" + /* * HID0 bit definitions per cpu model * diff --git a/sys/powerpc/include/md_var.h b/sys/powerpc/include/md_var.h index d1785adfbe0f..bfe5ed238291 100644 --- a/sys/powerpc/include/md_var.h +++ b/sys/powerpc/include/md_var.h @@ -46,7 +46,6 @@ extern u_long ns_per_tick; extern int powerpc_pow_enabled; extern int cacheline_size; -extern int ppc64; extern int hw_direct_map; void __syncicache(void *, int); diff --git a/sys/powerpc/include/pcpu.h b/sys/powerpc/include/pcpu.h index 51422daac70b..1513922c634c 100644 --- a/sys/powerpc/include/pcpu.h +++ b/sys/powerpc/include/pcpu.h @@ -43,8 +43,8 @@ struct pmap; struct thread *pc_vecthread; /* current vec user */ \ uintptr_t pc_hwref; \ uint32_t pc_pir; \ - int pc_bsp:1; \ - int pc_awake:1; \ + int pc_bsp; \ + volatile int pc_awake; \ uint32_t pc_ipimask; \ register_t pc_tempsave[CPUSAVE_LEN]; \ register_t pc_disisave[CPUSAVE_LEN]; \ diff --git a/sys/powerpc/include/pmap.h b/sys/powerpc/include/pmap.h index d4fce7fef910..a23052ea975c 100644 --- a/sys/powerpc/include/pmap.h +++ b/sys/powerpc/include/pmap.h @@ -171,7 +171,6 @@ void pmap_bootstrap(vm_offset_t, vm_offset_t); void pmap_kenter(vm_offset_t va, vm_offset_t pa); void pmap_kremove(vm_offset_t); void *pmap_mapdev(vm_offset_t, vm_size_t); -boolean_t pmap_page_executable(vm_page_t); void pmap_unmapdev(vm_offset_t, vm_size_t); void pmap_deactivate(struct thread *); vm_offset_t pmap_kextract(vm_offset_t); diff --git a/sys/powerpc/include/pte.h b/sys/powerpc/include/pte.h index f1e5319a5bc1..b7f5fd971e9a 100644 --- a/sys/powerpc/include/pte.h +++ b/sys/powerpc/include/pte.h @@ -95,6 +95,7 @@ struct lpteg { /* High quadword: */ #define LPTE_VSID_SHIFT 12 #define LPTE_API 0x0000000000000F80ULL +#define LPTE_LOCKED 0x0000000000000008ULL #define LPTE_BIG 0x0000000000000004ULL /* 4kb/16Mb page */ #define LPTE_HID 0x0000000000000002ULL #define LPTE_VALID 0x0000000000000001ULL diff --git a/sys/powerpc/include/smp.h b/sys/powerpc/include/smp.h index 0e5ec16eb90e..dfb3149217a2 100644 --- a/sys/powerpc/include/smp.h +++ b/sys/powerpc/include/smp.h @@ -48,7 +48,8 @@ struct cpuref { }; void pmap_cpu_bootstrap(int); -uint32_t cpudep_ap_bootstrap(void); +uintptr_t cpudep_ap_bootstrap(void); +void cpudep_ap_setup(void); void machdep_ap_bootstrap(void); #endif /* !LOCORE */ diff --git a/sys/powerpc/include/spr.h b/sys/powerpc/include/spr.h index 4e55326c4a3c..586a57be9db6 100644 --- a/sys/powerpc/include/spr.h +++ b/sys/powerpc/include/spr.h @@ -50,7 +50,7 @@ #define mtspr64(reg,valhi,vallo,scratch) \ __asm __volatile(" \ mfmsr %0; \ - insrdi %0,1,1,0; \ + insrdi %0,%5,1,0; \ mtmsrd %0; \ isync; \ \ @@ -62,13 +62,13 @@ clrldi %0,%0,1; \ mtmsrd %0; \ isync;" \ - : "=r"(scratch), "=r"(valhi) : "r"(vallo), "K"(reg), "r"(32)) + : "=r"(scratch), "=r"(valhi) : "r"(vallo), "K"(reg), "r"(32), "r"(1)) #define mfspr64upper(reg,scratch) \ ( { register_t val; \ __asm __volatile(" \ mfmsr %0; \ - insrdi %0,1,1,0; \ + insrdi %0,%4,1,0; \ mtmsrd %0; \ isync; \ \ @@ -78,7 +78,7 @@ clrldi %0,%0,1; \ mtmsrd %0; \ isync;" \ - : "=r"(scratch), "=r"(val) : "K"(reg), "r"(32)); \ + : "=r"(scratch), "=r"(val) : "K"(reg), "r"(32), "r"(1)); \ val; } ) #endif /* _LOCORE */ diff --git a/sys/powerpc/include/sr.h b/sys/powerpc/include/sr.h index 2ef7b3585076..061195dd0552 100644 --- a/sys/powerpc/include/sr.h +++ b/sys/powerpc/include/sr.h @@ -45,6 +45,7 @@ #define USER_SR 12 #define KERNEL_SR 13 #define KERNEL2_SR 14 +#define KERNEL3_SR 15 #define KERNEL_VSIDBITS 0xfffff #define KERNEL_SEGMENT (0xfffff0 + KERNEL_SR) #define KERNEL2_SEGMENT (0xfffff0 + KERNEL2_SR) diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h index 8b6ef2b13fef..b7424f6c1915 100644 --- a/sys/powerpc/include/vmparam.h +++ b/sys/powerpc/include/vmparam.h @@ -38,23 +38,23 @@ #define USRSTACK VM_MAXUSER_ADDRESS #ifndef MAXTSIZ -#define MAXTSIZ (16*1024*1024) /* max text size */ +#define MAXTSIZ (64*1024*1024) /* max text size */ #endif #ifndef DFLDSIZ -#define DFLDSIZ (32*1024*1024) /* default data size */ +#define DFLDSIZ (128*1024*1024) /* default data size */ #endif #ifndef MAXDSIZ -#define MAXDSIZ (512*1024*1024) /* max data size */ +#define MAXDSIZ (1*1024*1024*1024) /* max data size */ #endif #ifndef DFLSSIZ -#define DFLSSIZ (1*1024*1024) /* default stack size */ +#define DFLSSIZ (8*1024*1024) /* default stack size */ #endif #ifndef MAXSSIZ -#define MAXSSIZ (32*1024*1024) /* max stack size */ +#define MAXSSIZ (64*1024*1024) /* max stack size */ #endif /* @@ -98,7 +98,8 @@ #define KERNBASE 0x00100000 /* start of kernel virtual */ #define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)(KERNEL_SR << ADDR_SR_SHFT)) -#define VM_MAX_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + 2*SEGMENT_LENGTH - 1) +#define VM_MAX_SAFE_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + 2*SEGMENT_LENGTH -1) +#define VM_MAX_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + 3*SEGMENT_LENGTH - 1) /* * Use the direct-mapped BAT registers for UMA small allocs. This @@ -106,13 +107,6 @@ */ #define UMA_MD_SMALL_ALLOC -/* - * On 64-bit systems in bridge mode, we have no direct map, so we fake - * the small_alloc() calls. But we need the VM to be in a reasonable - * state first. - */ -#define UMA_MD_SMALL_ALLOC_NEEDS_VM - #else /* diff --git a/sys/powerpc/mpc85xx/pci_ocp.c b/sys/powerpc/mpc85xx/pci_ocp.c index b98f62c7e905..eba3f50d501b 100644 --- a/sys/powerpc/mpc85xx/pci_ocp.c +++ b/sys/powerpc/mpc85xx/pci_ocp.c @@ -76,6 +76,9 @@ __FBSDID("$FreeBSD$"); #define REG_PIWBEAR(n) (0x0e0c - 0x20 * (n)) #define REG_PIWAR(n) (0x0e10 - 0x20 * (n)) +#define PCIR_FSL_LTSSM 0x404 +#define FSL_LTSSM_L0 0x16 + #define DEVFN(b, s, f) ((b << 16) | (s << 8) | f) struct pci_ocp_softc { @@ -94,7 +97,7 @@ struct pci_ocp_softc { int sc_rid; int sc_busnr; - int sc_pcie:1; + uint8_t sc_pcie_cap; /* Devices that need special attention. */ int sc_devfn_tundra; @@ -168,7 +171,7 @@ pci_ocp_cfgread(struct pci_ocp_softc *sc, u_int bus, u_int slot, u_int func, addr |= (slot & 0x1f) << 11; addr |= (func & 0x7) << 8; addr |= reg & 0xfc; - if (sc->sc_pcie) + if (sc->sc_pcie_cap) addr |= (reg & 0xf00) << 16; bus_space_write_4(sc->sc_bst, sc->sc_bsh, REG_CFG_ADDR, addr); @@ -206,7 +209,7 @@ pci_ocp_cfgwrite(struct pci_ocp_softc *sc, u_int bus, u_int slot, u_int func, addr |= (slot & 0x1f) << 11; addr |= (func & 0x7) << 8; addr |= reg & 0xfc; - if (sc->sc_pcie) + if (sc->sc_pcie_cap) addr |= (reg & 0xf00) << 16; bus_space_write_4(sc->sc_bst, sc->sc_bsh, REG_CFG_ADDR, addr); @@ -261,7 +264,7 @@ pci_ocp_maxslots(device_t dev) { struct pci_ocp_softc *sc = device_get_softc(dev); - return ((sc->sc_pcie) ? 0 : 30); + return ((sc->sc_pcie_cap) ? 0 : 30); } static uint32_t @@ -271,9 +274,21 @@ pci_ocp_read_config(device_t dev, u_int bus, u_int slot, u_int func, struct pci_ocp_softc *sc = device_get_softc(dev); u_int devfn; - if (bus == sc->sc_busnr && !sc->sc_pcie && slot < 10) + if (bus == sc->sc_busnr && !sc->sc_pcie_cap && slot < 10) return (~0); devfn = DEVFN(bus, slot, func); + /* + * For the host controller itself, pretend to be a standard + * PCI bridge, rather than a PowerPC processor. That way the + * generic PCI code will enumerate all subordinate busses + * and devices as usual. + */ + if (sc->sc_pcie_cap && devfn == 0) { + if (reg == PCIR_CLASS && bytes == 1) + return (PCIC_BRIDGE); + if (reg == PCIR_SUBCLASS && bytes == 1) + return (PCIS_BRIDGE_PCI); + } if (devfn == sc->sc_devfn_tundra) return (~0); if (devfn == sc->sc_devfn_via_ide && reg == PCIR_INTPIN) @@ -287,7 +302,7 @@ pci_ocp_write_config(device_t dev, u_int bus, u_int slot, u_int func, { struct pci_ocp_softc *sc = device_get_softc(dev); - if (bus == sc->sc_busnr && !sc->sc_pcie && slot < 10) + if (bus == sc->sc_busnr && !sc->sc_pcie_cap && slot < 10) return; pci_ocp_cfgwrite(sc, bus, slot, func, reg, val, bytes); } @@ -297,11 +312,12 @@ pci_ocp_probe(device_t dev) { char buf[128]; struct pci_ocp_softc *sc; - const char *mpcid, *type; + const char *type; device_t parent; u_long start, size; uintptr_t devtype; uint32_t cfgreg; + uint8_t capptr; int error; parent = device_get_parent(dev); @@ -327,48 +343,33 @@ pci_ocp_probe(device_t dev) cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_VENDOR, 2); if (cfgreg != 0x1057 && cfgreg != 0x1957) goto out; - cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_DEVICE, 2); - switch (cfgreg) { - case 0x000a: - mpcid = "8555E"; - break; - case 0x0012: - mpcid = "8548E"; - break; - case 0x0013: - mpcid = "8548"; - break; - /* - * Documentation from Freescale is incorrect. - * Use right values after documentation is corrected. - */ - case 0x0030: - mpcid = "8544E"; - break; - case 0x0031: - mpcid = "8544"; - break; - case 0x0032: - mpcid = "8544"; - break; - default: + + cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_CLASS, 1); + if (cfgreg != PCIC_PROCESSOR) + goto out; + + cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_SUBCLASS, 1); + if (cfgreg != PCIS_PROCESSOR_POWERPC) + goto out; + + cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_PROGIF, 1); + if (cfgreg != 0) /* RC mode = 0, EP mode = 1 */ goto out; - } type = "PCI"; - cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_CAP_PTR, 1); - while (cfgreg != 0) { - cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, cfgreg, 2); + capptr = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_CAP_PTR, 1); + while (capptr != 0) { + cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, capptr, 2); switch (cfgreg & 0xff) { case PCIY_PCIX: /* PCI-X */ type = "PCI-X"; break; case PCIY_EXPRESS: /* PCI Express */ type = "PCI Express"; - sc->sc_pcie = 1; + sc->sc_pcie_cap = capptr; break; } - cfgreg = (cfgreg >> 8) & 0xff; + capptr = (cfgreg >> 8) & 0xff; } error = bus_get_resource(dev, SYS_RES_MEMORY, 1, &start, &size); @@ -376,7 +377,7 @@ pci_ocp_probe(device_t dev) goto out; snprintf(buf, sizeof(buf), - "Freescale MPC%s %s host controller", mpcid, type); + "Freescale on-chip %s host controller", type); device_set_desc_copy(dev, buf); error = BUS_PROBE_DEFAULT; @@ -753,7 +754,18 @@ pci_ocp_attach(device_t dev) sc->sc_devfn_tundra = -1; sc->sc_devfn_via_ide = -1; - maxslot = (sc->sc_pcie) ? 1 : 31; + /* + * PCI Express host controllers require a link. We don't + * fail the attach if there's no link, but we also don't + * create a child pci(4) device. + */ + if (sc->sc_pcie_cap) { + cfgreg = pci_ocp_cfgread(sc, 0, 0, 0, PCIR_FSL_LTSSM, 4); + if (cfgreg < FSL_LTSSM_L0) + return (0); + } + + maxslot = (sc->sc_pcie_cap) ? 1 : 31; pci_ocp_init(sc, sc->sc_busnr, maxslot); device_add_child(dev, "pci", -1); @@ -783,6 +795,7 @@ pci_ocp_alloc_resource(device_t dev, device_t child, int type, int *rid, device_printf(dev, "%s requested ISA interrupt %lu\n", device_get_nameunit(child), start); } + flags |= RF_SHAREABLE; return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child, type, rid, start, end, count, flags)); default: diff --git a/sys/powerpc/ofw/ofw_syscons.c b/sys/powerpc/ofw/ofw_syscons.c index 5ab5939fe6fc..56d0ca8da1da 100644 --- a/sys/powerpc/ofw/ofw_syscons.c +++ b/sys/powerpc/ofw/ofw_syscons.c @@ -624,8 +624,8 @@ ofwfb_blank_display(video_adapter_t *adp, int mode) } static int -ofwfb_mmap(video_adapter_t *adp, vm_offset_t offset, vm_paddr_t *paddr, - int prot) +ofwfb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { struct ofwfb_softc *sc; int i; diff --git a/sys/powerpc/powermac/ata_dbdma.c b/sys/powerpc/powermac/ata_dbdma.c index b08ade6bc076..c8f37581b422 100644 --- a/sys/powerpc/powermac/ata_dbdma.c +++ b/sys/powerpc/powermac/ata_dbdma.c @@ -204,7 +204,6 @@ static int ata_dbdma_load(struct ata_request *request, void *addr, int *entries) { struct ata_channel *ch = device_get_softc(request->parent); - struct ata_device *atadev = device_get_softc(request->dev); struct ata_dbdma_dmaload_args args; int error; @@ -230,7 +229,7 @@ ata_dbdma_load(struct ata_request *request, void *addr, int *entries) return EIO; } - request->dma = &ch->dma.slot[atadev->unit]; + request->dma = &ch->dma.slot[0]; if ((error = bus_dmamap_load(request->dma->data_tag, request->dma->data_map, request->data, request->bytecount, diff --git a/sys/powerpc/powermac/ata_kauai.c b/sys/powerpc/powermac/ata_kauai.c index 415d0fb0e69e..f7b6daa5a7b9 100644 --- a/sys/powerpc/powermac/ata_kauai.c +++ b/sys/powerpc/powermac/ata_kauai.c @@ -85,7 +85,7 @@ __FBSDID("$FreeBSD$"); */ static int ata_kauai_probe(device_t dev); static int ata_kauai_attach(device_t dev); -static void ata_kauai_setmode(device_t parent, device_t dev); +static int ata_kauai_setmode(device_t dev, int target, int mode); static int ata_kauai_begin_transaction(struct ata_request *request); static device_method_t ata_kauai_methods[] = { @@ -307,34 +307,26 @@ ata_kauai_attach(device_t dev) return ata_attach(dev); } -static void -ata_kauai_setmode(device_t parent, device_t dev) +static int +ata_kauai_setmode(device_t dev, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); - struct ata_kauai_softc *sc = device_get_softc(parent); - uint32_t mode; + struct ata_kauai_softc *sc = device_get_softc(dev); - mode = ata_limit_mode(dev,atadev->mode, - (sc->shasta) ? ATA_UDMA6 : ATA_UDMA5); - - if (ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - return; - - atadev->mode = mode; + mode = min(mode,sc->shasta ? ATA_UDMA6 : ATA_UDMA5); if (sc->shasta) { switch (mode & ATA_DMA_MASK) { case ATA_UDMA0: - sc->udmaconf[atadev->unit] + sc->udmaconf[target] = udma_timing_shasta[mode & ATA_MODE_MASK]; break; case ATA_WDMA0: - sc->udmaconf[atadev->unit] = 0; - sc->wdmaconf[atadev->unit] + sc->udmaconf[target] = 0; + sc->wdmaconf[target] = dma_timing_shasta[mode & ATA_MODE_MASK]; break; default: - sc->pioconf[atadev->unit] + sc->pioconf[target] = pio_timing_shasta[(mode & ATA_MODE_MASK) - ATA_PIO0]; break; @@ -342,32 +334,33 @@ ata_kauai_setmode(device_t parent, device_t dev) } else { switch (mode & ATA_DMA_MASK) { case ATA_UDMA0: - sc->udmaconf[atadev->unit] + sc->udmaconf[target] = udma_timing_kauai[mode & ATA_MODE_MASK]; break; case ATA_WDMA0: - sc->udmaconf[atadev->unit] = 0; - sc->wdmaconf[atadev->unit] + sc->udmaconf[target] = 0; + sc->wdmaconf[target] = dma_timing_kauai[mode & ATA_MODE_MASK]; break; default: - sc->pioconf[atadev->unit] + sc->pioconf[target] = pio_timing_kauai[(mode & ATA_MODE_MASK) - ATA_PIO0]; break; } } + + return (mode); } static int ata_kauai_begin_transaction(struct ata_request *request) { - struct ata_device *atadev = device_get_softc(request->dev); struct ata_kauai_softc *sc = device_get_softc(request->parent); - bus_write_4(sc->sc_memr, UDMA_CONFIG_REG, sc->udmaconf[atadev->unit]); + bus_write_4(sc->sc_memr, UDMA_CONFIG_REG, sc->udmaconf[request->unit]); bus_write_4(sc->sc_memr, PIO_CONFIG_REG, - sc->wdmaconf[atadev->unit] | sc->pioconf[atadev->unit]); + sc->wdmaconf[request->unit] | sc->pioconf[request->unit]); return ata_begin_transaction(request); } diff --git a/sys/powerpc/powermac/ata_macio.c b/sys/powerpc/powermac/ata_macio.c index 320e86e33819..447009da7ea0 100644 --- a/sys/powerpc/powermac/ata_macio.c +++ b/sys/powerpc/powermac/ata_macio.c @@ -111,7 +111,7 @@ static const struct ide_timings udma_timings[5] = { * Define the macio ata bus attachment. */ static int ata_macio_probe(device_t dev); -static void ata_macio_setmode(device_t parent, device_t dev); +static int ata_macio_setmode(device_t dev, int target, int mode); static int ata_macio_attach(device_t dev); static int ata_macio_begin_transaction(struct ata_request *request); @@ -193,7 +193,7 @@ ata_macio_probe(device_t dev) ata_default_registers(dev); ch->unit = 0; - ch->flags |= ATA_USE_16BIT; + ch->flags |= ATA_USE_16BIT | ATA_NO_ATAPI_DMA; ata_generic_hw(dev); return (ata_probe(dev)); @@ -247,26 +247,15 @@ ata_macio_attach(device_t dev) return ata_attach(dev); } -static void -ata_macio_setmode(device_t parent, device_t dev) +static int +ata_macio_setmode(device_t dev, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); - struct ata_macio_softc *sc = device_get_softc(parent); - int mode = atadev->mode; + struct ata_macio_softc *sc = device_get_softc(dev); int min_cycle = 0, min_active = 0; int cycle_tick = 0, act_tick = 0, inact_tick = 0, half_tick; - mode = ata_limit_mode(dev, mode, sc->max_mode); - - /* XXX Some controllers don't work correctly with ATAPI DMA */ - if (atadev->param.config & ATA_PROTO_ATAPI) - mode = ata_limit_mode(dev, mode, ATA_PIO_MAX); - - if (ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode)) - return; - - atadev->mode = mode; + mode = min(mode, sc->max_mode); if ((mode & ATA_DMA_MASK) == ATA_UDMA0) { min_cycle = udma_timings[mode & ATA_MODE_MASK].cycle; @@ -276,7 +265,7 @@ ata_macio_setmode(device_t parent, device_t dev) act_tick = ATA_TIME_TO_TICK(sc->rev,min_active); /* mask: 0x1ff00000 */ - sc->udmaconf[atadev->unit] = + sc->udmaconf[target] = (cycle_tick << 21) | (act_tick << 25) | 0x100000; } else if ((mode & ATA_DMA_MASK) == ATA_WDMA0) { min_cycle = dma_timings[mode & ATA_MODE_MASK].cycle; @@ -288,7 +277,7 @@ ata_macio_setmode(device_t parent, device_t dev) if (sc->rev == 4) { inact_tick = cycle_tick - act_tick; /* mask: 0x001ffc00 */ - sc->wdmaconf[atadev->unit] = + sc->wdmaconf[target] = (act_tick << 10) | (inact_tick << 15); } else { inact_tick = cycle_tick - act_tick - DMA_REC_OFFSET; @@ -297,7 +286,7 @@ ata_macio_setmode(device_t parent, device_t dev) half_tick = 0; /* XXX */ /* mask: 0xfffff800 */ - sc->wdmaconf[atadev->unit] = (half_tick << 21) + sc->wdmaconf[target] = (half_tick << 21) | (inact_tick << 16) | (act_tick << 11); } } else { @@ -313,7 +302,7 @@ ata_macio_setmode(device_t parent, device_t dev) inact_tick = cycle_tick - act_tick; /* mask: 0x000003ff */ - sc->pioconf[atadev->unit] = + sc->pioconf[target] = (inact_tick << 5) | act_tick; } else { if (act_tick < PIO_ACT_MIN) @@ -324,21 +313,22 @@ ata_macio_setmode(device_t parent, device_t dev) inact_tick = PIO_REC_MIN; /* mask: 0x000007ff */ - sc->pioconf[atadev->unit] = + sc->pioconf[target] = (inact_tick << 5) | act_tick; } } + + return (mode); } static int ata_macio_begin_transaction(struct ata_request *request) { - struct ata_device *atadev = device_get_softc(request->dev); struct ata_macio_softc *sc = device_get_softc(request->parent); bus_write_4(sc->sc_mem, ATA_MACIO_TIMINGREG, - sc->udmaconf[atadev->unit] | sc->wdmaconf[atadev->unit] - | sc->pioconf[atadev->unit]); + sc->udmaconf[request->unit] | sc->wdmaconf[request->unit] + | sc->pioconf[request->unit]); return ata_begin_transaction(request); } diff --git a/sys/powerpc/powermac/hrowpic.c b/sys/powerpc/powermac/hrowpic.c index 2ed0aa3744a5..ce35d465e15c 100644 --- a/sys/powerpc/powermac/hrowpic.c +++ b/sys/powerpc/powermac/hrowpic.c @@ -182,7 +182,13 @@ hrowpic_toggle_irq(struct hrowpic_softc *sc, int irq, int enable) u_int roffset; u_int rbit; - KASSERT((irq > 0) && (irq < HROWPIC_IRQMAX), ("en irq out of range")); + KASSERT((irq > 0) && (irq <= HROWPIC_IRQMAX), ("en irq out of range")); + + /* + * Humor the SMP layer if it wants to set up an IPI handler. + */ + if (irq == HROWPIC_IRQMAX) + return; /* * Calculate prim/sec register bank for the IRQ, update soft copy, diff --git a/sys/powerpc/powermac/smu.c b/sys/powerpc/powermac/smu.c index 4d5e1c8fac53..061ac1c59acb 100644 --- a/sys/powerpc/powermac/smu.c +++ b/sys/powerpc/powermac/smu.c @@ -32,25 +32,51 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include +#include #include +#include #include #include #include #include +#include #include #include #include struct smu_cmd { - uint8_t cmd; + volatile uint8_t cmd; uint8_t len; uint8_t data[254]; }; +struct smu_fan { + cell_t reg; + cell_t min_rpm; + cell_t max_rpm; + cell_t unmanaged_rpm; + char location[32]; + + int old_style; + int setpoint; +}; + +struct smu_sensor { + cell_t reg; + char location[32]; + enum { + SMU_CURRENT_SENSOR, + SMU_VOLTAGE_SENSOR, + SMU_POWER_SENSOR, + SMU_TEMP_SENSOR + } type; +}; + struct smu_softc { device_t sc_dev; struct mtx sc_mtx; @@ -65,6 +91,32 @@ struct smu_softc { struct smu_cmd *sc_cmd; bus_addr_t sc_cmd_phys; bus_dmamap_t sc_cmd_dmamap; + + struct smu_fan *sc_fans; + int sc_nfans; + struct smu_sensor *sc_sensors; + int sc_nsensors; + + struct callout sc_fanmgt_callout; + time_t sc_lastuserchange; + + /* Calibration data */ + uint16_t sc_cpu_diode_scale; + int16_t sc_cpu_diode_offset; + + uint16_t sc_cpu_volt_scale; + int16_t sc_cpu_volt_offset; + uint16_t sc_cpu_curr_scale; + int16_t sc_cpu_curr_offset; + + uint16_t sc_slots_pow_scale; + int16_t sc_slots_pow_offset; + + /* Thermal management parameters */ + int sc_target_temp; /* Default 55 C */ + int sc_critical_temp; /* Default 90 C */ + + struct cdev *sc_leddev; }; /* regular bus attachment functions */ @@ -77,6 +129,16 @@ static int smu_attach(device_t); static void smu_cpufreq_pre_change(device_t, const struct cf_level *level); static void smu_cpufreq_post_change(device_t, const struct cf_level *level); +/* utility functions */ +static int smu_run_cmd(device_t dev, struct smu_cmd *cmd); +static int smu_get_datablock(device_t dev, int8_t id, uint8_t *buf, + size_t len); +static void smu_attach_fans(device_t dev, phandle_t fanroot); +static void smu_attach_sensors(device_t dev, phandle_t sensroot); +static void smu_fanmgt_callout(void *xdev); +static void smu_set_sleepled(void *xdev, int onoff); +static int smu_server_mode(SYSCTL_HANDLER_ARGS); + /* where to find the doorbell GPIO */ static device_t smu_doorbell = NULL; @@ -97,11 +159,43 @@ static driver_t smu_driver = { static devclass_t smu_devclass; DRIVER_MODULE(smu, nexus, smu_driver, smu_devclass, 0, 0); +MALLOC_DEFINE(M_SMU, "smu", "SMU Sensor Information"); -#define SMU_MAILBOX 0x860c +#define SMU_MAILBOX 0x8000860c +#define SMU_FANMGT_INTERVAL 500 /* ms */ /* Command types */ -#define SMU_POWER 0xaa +#define SMU_ADC 0xd8 +#define SMU_FAN 0x4a +#define SMU_I2C 0x9a +#define SMU_I2C_SIMPLE 0x00 +#define SMU_I2C_NORMAL 0x01 +#define SMU_I2C_COMBINED 0x02 +#define SMU_MISC 0xee +#define SMU_MISC_GET_DATA 0x02 +#define SMU_MISC_LED_CTRL 0x04 +#define SMU_POWER 0xaa +#define SMU_POWER_EVENTS 0x8f +#define SMU_PWR_GET_POWERUP 0x00 +#define SMU_PWR_SET_POWERUP 0x01 +#define SMU_PWR_CLR_POWERUP 0x02 + +/* Power event types */ +#define SMU_WAKEUP_KEYPRESS 0x01 +#define SMU_WAKEUP_AC_INSERT 0x02 +#define SMU_WAKEUP_AC_CHANGE 0x04 +#define SMU_WAKEUP_RING 0x10 + +/* Data blocks */ +#define SMU_CPUTEMP_CAL 0x18 +#define SMU_CPUVOLT_CAL 0x21 +#define SMU_SLOTPW_CAL 0x78 + +/* Partitions */ +#define SMU_PARTITION 0x3e +#define SMU_PARTITION_LATEST 0x01 +#define SMU_PARTITION_BASE 0x02 +#define SMU_PARTITION_UPDATE 0x03 static int smu_probe(device_t dev) @@ -127,6 +221,8 @@ static int smu_attach(device_t dev) { struct smu_softc *sc; + phandle_t node, child; + uint8_t data[12]; sc = device_get_softc(dev); @@ -139,7 +235,7 @@ smu_attach(device_t dev) bus_dma_tag_create(NULL, 16, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, PAGE_SIZE, 1, PAGE_SIZE, 0, NULL, NULL, &(sc->sc_dmatag)); - sc->sc_bt = &bs_be_tag; + sc->sc_bt = &bs_le_tag; bus_space_map(sc->sc_bt, SMU_MAILBOX, 4, 0, &sc->sc_mailbox); /* @@ -159,6 +255,72 @@ smu_attach(device_t dev) EVENTHANDLER_REGISTER(cpufreq_post_change, smu_cpufreq_post_change, dev, EVENTHANDLER_PRI_ANY); + /* + * Detect and attach child devices. + */ + node = ofw_bus_get_node(dev); + for (child = OF_child(node); child != 0; child = OF_peer(child)) { + char name[32]; + memset(name, 0, sizeof(name)); + OF_getprop(child, "name", name, sizeof(name)); + + if (strncmp(name, "rpm-fans", 9) == 0 || + strncmp(name, "fans", 5) == 0) + smu_attach_fans(dev, child); + + if (strncmp(name, "sensors", 8) == 0) + smu_attach_sensors(dev, child); + } + + /* + * Collect calibration constants. + */ + smu_get_datablock(dev, SMU_CPUTEMP_CAL, data, sizeof(data)); + sc->sc_cpu_diode_scale = (data[4] << 8) + data[5]; + sc->sc_cpu_diode_offset = (data[6] << 8) + data[7]; + + smu_get_datablock(dev, SMU_CPUVOLT_CAL, data, sizeof(data)); + sc->sc_cpu_volt_scale = (data[4] << 8) + data[5]; + sc->sc_cpu_volt_offset = (data[6] << 8) + data[7]; + sc->sc_cpu_curr_scale = (data[8] << 8) + data[9]; + sc->sc_cpu_curr_offset = (data[10] << 8) + data[11]; + + smu_get_datablock(dev, SMU_SLOTPW_CAL, data, sizeof(data)); + sc->sc_slots_pow_scale = (data[4] << 8) + data[5]; + sc->sc_slots_pow_offset = (data[6] << 8) + data[7]; + + /* + * Set up simple-minded thermal management. + */ + sc->sc_target_temp = 55; + sc->sc_critical_temp = 90; + + SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "target_temp", CTLTYPE_INT | CTLFLAG_RW, &sc->sc_target_temp, + sizeof(int), "Target temperature (C)"); + SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "critical_temp", CTLTYPE_INT | CTLFLAG_RW, + &sc->sc_critical_temp, sizeof(int), "Critical temperature (C)"); + + callout_init(&sc->sc_fanmgt_callout, 1); + smu_fanmgt_callout(dev); + + /* + * Set up LED interface + */ + sc->sc_leddev = led_create(smu_set_sleepled, dev, "sleepled"); + + /* + * Reset on power loss behavior + */ + + SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, + "server_mode", CTLTYPE_INT | CTLFLAG_RW, dev, 0, + smu_server_mode, "I", "Enable reboot after power failure"); + return (0); } @@ -166,19 +328,22 @@ static int smu_run_cmd(device_t dev, struct smu_cmd *cmd) { struct smu_softc *sc; - int doorbell_ack, result; + int doorbell_ack, result, oldpow; sc = device_get_softc(dev); mtx_lock(&sc->sc_mtx); + oldpow = powerpc_pow_enabled; + powerpc_pow_enabled = 0; + /* Copy the command to the mailbox */ memcpy(sc->sc_cmd, cmd, sizeof(*cmd)); bus_dmamap_sync(sc->sc_dmatag, sc->sc_cmd_dmamap, BUS_DMASYNC_PREWRITE); bus_space_write_4(sc->sc_bt, sc->sc_mailbox, 0, sc->sc_cmd_phys); - /* Invalidate the cacheline it is in -- SMU bypasses the cache */ - __asm __volatile("dcbst 0,%0; sync" :: "r"(sc->sc_cmd): "memory"); + /* Flush the cacheline it is in -- SMU bypasses the cache */ + __asm __volatile("sync; dcbf 0,%0; sync" :: "r"(sc->sc_cmd): "memory"); /* Ring SMU doorbell */ macgpio_write(smu_doorbell, GPIO_DDR_OUTPUT); @@ -188,7 +353,7 @@ smu_run_cmd(device_t dev, struct smu_cmd *cmd) /* XXX: timeout */ DELAY(50); doorbell_ack = macgpio_read(smu_doorbell); - } while (!doorbell_ack); + } while (doorbell_ack != (GPIO_DDR_OUTPUT | GPIO_LEVEL_RO | GPIO_DATA)); /* Check result. First invalidate the cache again... */ __asm __volatile("dcbf 0,%0; sync" :: "r"(sc->sc_cmd) : "memory"); @@ -196,16 +361,50 @@ smu_run_cmd(device_t dev, struct smu_cmd *cmd) bus_dmamap_sync(sc->sc_dmatag, sc->sc_cmd_dmamap, BUS_DMASYNC_POSTREAD); /* SMU acks the command by inverting the command bits */ - if (sc->sc_cmd->cmd == ~cmd->cmd) + if (sc->sc_cmd->cmd == ((~cmd->cmd) & 0xff)) result = 0; else result = EIO; + powerpc_pow_enabled = oldpow; + + memcpy(cmd->data, sc->sc_cmd->data, sizeof(cmd->data)); + cmd->len = sc->sc_cmd->len; + mtx_unlock(&sc->sc_mtx); return (result); } +static int +smu_get_datablock(device_t dev, int8_t id, uint8_t *buf, size_t len) +{ + struct smu_cmd cmd; + uint8_t addr[4]; + + cmd.cmd = SMU_PARTITION; + cmd.len = 2; + cmd.data[0] = SMU_PARTITION_LATEST; + cmd.data[1] = id; + + smu_run_cmd(dev, &cmd); + + addr[0] = addr[1] = 0; + addr[2] = cmd.data[0]; + addr[3] = cmd.data[1]; + + cmd.cmd = SMU_MISC; + cmd.len = 7; + cmd.data[0] = SMU_MISC_GET_DATA; + cmd.data[1] = sizeof(addr); + memcpy(&cmd.data[2], addr, sizeof(addr)); + cmd.data[6] = len; + + smu_run_cmd(dev, &cmd); + memcpy(buf, cmd.data, len); + return (0); +} + static void smu_slew_cpu_voltage(device_t dev, int to) { @@ -286,3 +485,453 @@ doorbell_attach(device_t dev) smu_doorbell = dev; return (0); } + +/* + * Sensor and fan management + */ + +static int +smu_fan_set_rpm(device_t smu, struct smu_fan *fan, int rpm) +{ + struct smu_cmd cmd; + int error; + + cmd.cmd = SMU_FAN; + error = EIO; + + /* Clamp to allowed range */ + rpm = max(fan->min_rpm, rpm); + rpm = min(fan->max_rpm, rpm); + + /* + * Apple has two fan control mechanisms. We can't distinguish + * them except by seeing if the new one fails. If the new one + * fails, use the old one. + */ + + if (!fan->old_style) { + cmd.len = 4; + cmd.data[0] = 0x30; + cmd.data[1] = fan->reg; + cmd.data[2] = (rpm >> 8) & 0xff; + cmd.data[3] = rpm & 0xff; + + error = smu_run_cmd(smu, &cmd); + if (error) + fan->old_style = 1; + } + + if (fan->old_style) { + cmd.len = 14; + cmd.data[0] = 0; + cmd.data[1] = 1 << fan->reg; + cmd.data[2 + 2*fan->reg] = (rpm >> 8) & 0xff; + cmd.data[3 + 2*fan->reg] = rpm & 0xff; + error = smu_run_cmd(smu, &cmd); + } + + if (error == 0) + fan->setpoint = rpm; + + return (error); +} + +static int +smu_fan_read_rpm(device_t smu, struct smu_fan *fan) +{ + struct smu_cmd cmd; + + cmd.cmd = SMU_FAN; + cmd.len = 1; + cmd.data[0] = 1; + + smu_run_cmd(smu, &cmd); + + return ((cmd.data[fan->reg*2+1] << 8) | cmd.data[fan->reg*2+2]); +} + +static int +smu_fanrpm_sysctl(SYSCTL_HANDLER_ARGS) +{ + device_t smu; + struct smu_softc *sc; + struct smu_fan *fan; + int rpm, error; + + smu = arg1; + sc = device_get_softc(smu); + fan = &sc->sc_fans[arg2]; + + rpm = smu_fan_read_rpm(smu, fan); + error = sysctl_handle_int(oidp, &rpm, 0, req); + + if (error || !req->newptr) + return (error); + + sc->sc_lastuserchange = time_uptime; + + return (smu_fan_set_rpm(smu, fan, rpm)); +} + +static void +smu_attach_fans(device_t dev, phandle_t fanroot) +{ + struct smu_fan *fan; + struct smu_softc *sc; + struct sysctl_oid *oid, *fanroot_oid; + struct sysctl_ctx_list *ctx; + phandle_t child; + char type[32], sysctl_name[32]; + int i; + + sc = device_get_softc(dev); + sc->sc_nfans = 0; + + for (child = OF_child(fanroot); child != 0; child = OF_peer(child)) + sc->sc_nfans++; + + if (sc->sc_nfans == 0) { + device_printf(dev, "WARNING: No fans detected!\n"); + return; + } + + sc->sc_fans = malloc(sc->sc_nfans * sizeof(struct smu_fan), M_SMU, + M_WAITOK | M_ZERO); + + fan = sc->sc_fans; + sc->sc_nfans = 0; + + ctx = device_get_sysctl_ctx(dev); + fanroot_oid = SYSCTL_ADD_NODE(ctx, + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "fans", + CTLFLAG_RD, 0, "SMU Fan Information"); + + for (child = OF_child(fanroot); child != 0; child = OF_peer(child)) { + OF_getprop(child, "device_type", type, sizeof(type)); + if (strcmp(type, "fan-rpm-control") != 0) + continue; + + fan->old_style = 0; + OF_getprop(child, "reg", &fan->reg, sizeof(cell_t)); + OF_getprop(child, "min-value", &fan->min_rpm, sizeof(cell_t)); + OF_getprop(child, "max-value", &fan->max_rpm, sizeof(cell_t)); + + if (OF_getprop(child, "unmanaged-value", &fan->unmanaged_rpm, + sizeof(cell_t)) != sizeof(cell_t)) + fan->unmanaged_rpm = fan->max_rpm; + + fan->setpoint = smu_fan_read_rpm(dev, fan); + + OF_getprop(child, "location", fan->location, + sizeof(fan->location)); + + /* Add sysctls */ + for (i = 0; i < strlen(fan->location); i++) { + sysctl_name[i] = tolower(fan->location[i]); + if (isspace(sysctl_name[i])) + sysctl_name[i] = '_'; + } + sysctl_name[i] = 0; + + oid = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(fanroot_oid), + OID_AUTO, sysctl_name, CTLFLAG_RD, 0, "Fan Information"); + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "minrpm", + CTLTYPE_INT | CTLFLAG_RD, &fan->min_rpm, sizeof(cell_t), + "Minimum allowed RPM"); + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "maxrpm", + CTLTYPE_INT | CTLFLAG_RD, &fan->max_rpm, sizeof(cell_t), + "Maximum allowed RPM"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "rpm", + CTLTYPE_INT | CTLFLAG_RW, dev, sc->sc_nfans, + smu_fanrpm_sysctl, "I", "Fan RPM"); + + fan++; + sc->sc_nfans++; + } +} + +static int +smu_sensor_read(device_t smu, struct smu_sensor *sens) +{ + struct smu_cmd cmd; + struct smu_softc *sc; + int64_t value; + + cmd.cmd = SMU_ADC; + cmd.len = 1; + cmd.data[0] = sens->reg; + + smu_run_cmd(smu, &cmd); + + sc = device_get_softc(smu); + value = (cmd.data[0] << 8) | cmd.data[1]; + + switch (sens->type) { + case SMU_TEMP_SENSOR: + value *= sc->sc_cpu_diode_scale; + value >>= 3; + value += ((int64_t)sc->sc_cpu_diode_offset) << 9; + value <<= 1; + + /* Convert from 16.16 fixed point degC into integer C. */ + value *= 15625; + value /= 1024; + value /= 1000000; + break; + case SMU_VOLTAGE_SENSOR: + value *= sc->sc_cpu_volt_scale; + value += sc->sc_cpu_volt_offset; + value <<= 4; + + /* Convert from 16.16 fixed point V into mV. */ + value *= 15625; + value /= 1024; + value /= 1000; + break; + case SMU_CURRENT_SENSOR: + value *= sc->sc_cpu_curr_scale; + value += sc->sc_cpu_curr_offset; + value <<= 4; + + /* Convert from 16.16 fixed point A into mA. */ + value *= 15625; + value /= 1024; + value /= 1000; + break; + case SMU_POWER_SENSOR: + value *= sc->sc_slots_pow_scale; + value += sc->sc_slots_pow_offset; + value <<= 4; + + /* Convert from 16.16 fixed point W into mW. */ + value *= 15625; + value /= 1024; + value /= 1000; + break; + } + + return (value); +} + +static int +smu_sensor_sysctl(SYSCTL_HANDLER_ARGS) +{ + device_t smu; + struct smu_softc *sc; + struct smu_sensor *sens; + int value, error; + + smu = arg1; + sc = device_get_softc(smu); + sens = &sc->sc_sensors[arg2]; + + value = smu_sensor_read(smu, sens); + error = sysctl_handle_int(oidp, &value, 0, req); + + return (error); +} + +static void +smu_attach_sensors(device_t dev, phandle_t sensroot) +{ + struct smu_sensor *sens; + struct smu_softc *sc; + struct sysctl_oid *sensroot_oid; + struct sysctl_ctx_list *ctx; + phandle_t child; + char type[32]; + int i; + + sc = device_get_softc(dev); + sc->sc_nsensors = 0; + + for (child = OF_child(sensroot); child != 0; child = OF_peer(child)) + sc->sc_nsensors++; + + if (sc->sc_nsensors == 0) { + device_printf(dev, "WARNING: No sensors detected!\n"); + return; + } + + sc->sc_sensors = malloc(sc->sc_nsensors * sizeof(struct smu_sensor), + M_SMU, M_WAITOK | M_ZERO); + + sens = sc->sc_sensors; + sc->sc_nsensors = 0; + + ctx = device_get_sysctl_ctx(dev); + sensroot_oid = SYSCTL_ADD_NODE(ctx, + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "sensors", + CTLFLAG_RD, 0, "SMU Sensor Information"); + + for (child = OF_child(sensroot); child != 0; child = OF_peer(child)) { + char sysctl_name[40], sysctl_desc[40]; + const char *units; + + OF_getprop(child, "device_type", type, sizeof(type)); + + if (strcmp(type, "current-sensor") == 0) { + sens->type = SMU_CURRENT_SENSOR; + units = "mA"; + } else if (strcmp(type, "temp-sensor") == 0) { + sens->type = SMU_TEMP_SENSOR; + units = "C"; + } else if (strcmp(type, "voltage-sensor") == 0) { + sens->type = SMU_VOLTAGE_SENSOR; + units = "mV"; + } else if (strcmp(type, "power-sensor") == 0) { + sens->type = SMU_POWER_SENSOR; + units = "mW"; + } else { + continue; + } + + OF_getprop(child, "reg", &sens->reg, sizeof(cell_t)); + OF_getprop(child, "location", sens->location, + sizeof(sens->location)); + + for (i = 0; i < strlen(sens->location); i++) { + sysctl_name[i] = tolower(sens->location[i]); + if (isspace(sysctl_name[i])) + sysctl_name[i] = '_'; + } + sysctl_name[i] = 0; + + sprintf(sysctl_desc,"%s (%s)", sens->location, units); + + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(sensroot_oid), OID_AUTO, + sysctl_name, CTLTYPE_INT | CTLFLAG_RD, dev, sc->sc_nsensors, + smu_sensor_sysctl, "I", sysctl_desc); + + sens++; + sc->sc_nsensors++; + } +} + +static int +ms_to_ticks(int ms) +{ + if (hz > 1000) + return ms*(hz/1000); + + return ms/(1000/hz); +} + +static void +smu_fanmgt_callout(void *xdev) { + device_t smu = xdev; + struct smu_softc *sc; + int i, maxtemp, temp, factor; + + sc = device_get_softc(smu); + + if (time_uptime - sc->sc_lastuserchange < 3) { + /* + * If we have heard from a user process in the last 3 seconds, + * go away. + */ + + callout_reset(&sc->sc_fanmgt_callout, + ms_to_ticks(SMU_FANMGT_INTERVAL), smu_fanmgt_callout, smu); + return; + } + + maxtemp = 0; + for (i = 0; i < sc->sc_nsensors; i++) { + if (sc->sc_sensors[i].type != SMU_TEMP_SENSOR) + continue; + + temp = smu_sensor_read(smu, &sc->sc_sensors[i]); + if (temp > maxtemp) + maxtemp = temp; + } + + if (maxtemp < 10) { /* Bail if no good sensors */ + for (i = 0; i < sc->sc_nfans; i++) + smu_fan_set_rpm(smu, &sc->sc_fans[i], + sc->sc_fans[i].unmanaged_rpm); + return; + } + + if (maxtemp > sc->sc_critical_temp) { + device_printf(smu, "WARNING: Current system temperature (%d C) " + "exceeds critical temperature (%d C)! Shutting down!\n", + maxtemp, sc->sc_critical_temp); + shutdown_nice(RB_POWEROFF); + } + + if (maxtemp - sc->sc_target_temp > 20) + device_printf(smu, "WARNING: Current system temperature (%d C) " + "more than 20 degrees over target temperature (%d C)!\n", + maxtemp, sc->sc_target_temp); + + if (maxtemp > sc->sc_target_temp) + factor = 110; + else if (sc->sc_target_temp - maxtemp > 4) + factor = 90; + else if (sc->sc_target_temp - maxtemp > 1) + factor = 95; + else + factor = 100; + + for (i = 0; i < sc->sc_nfans; i++) + smu_fan_set_rpm(smu, &sc->sc_fans[i], + (sc->sc_fans[i].setpoint * factor) / 100); + + callout_reset(&sc->sc_fanmgt_callout, + ms_to_ticks(SMU_FANMGT_INTERVAL), smu_fanmgt_callout, smu); +} + +static void +smu_set_sleepled(void *xdev, int onoff) +{ + struct smu_cmd cmd; + device_t smu = xdev; + + cmd.cmd = SMU_MISC; + cmd.len = 3; + cmd.data[0] = SMU_MISC_LED_CTRL; + cmd.data[1] = 0; + cmd.data[2] = onoff; + + smu_run_cmd(smu, &cmd); +} + +static int +smu_server_mode(SYSCTL_HANDLER_ARGS) +{ + struct smu_cmd cmd; + u_int server_mode; + device_t smu = arg1; + int error; + + cmd.cmd = SMU_POWER_EVENTS; + cmd.len = 1; + cmd.data[0] = SMU_PWR_GET_POWERUP; + + error = smu_run_cmd(smu, &cmd); + + if (error) + return (error); + + server_mode = (cmd.data[1] & SMU_WAKEUP_AC_INSERT) ? 1 : 0; + + error = sysctl_handle_int(oidp, &server_mode, 0, req); + + if (error || !req->newptr) + return (error); + + if (server_mode == 1) + cmd.data[0] = SMU_PWR_SET_POWERUP; + else if (server_mode == 0) + cmd.data[0] = SMU_PWR_CLR_POWERUP; + else + return (EINVAL); + + cmd.len = 3; + cmd.data[1] = 0; + cmd.data[2] = SMU_WAKEUP_AC_INSERT; + + return (smu_run_cmd(smu, &cmd)); +} + diff --git a/sys/powerpc/powerpc/cpu.c b/sys/powerpc/powerpc/cpu.c index 77ebe95afd0b..d02c15687fcd 100644 --- a/sys/powerpc/powerpc/cpu.c +++ b/sys/powerpc/powerpc/cpu.c @@ -67,65 +67,112 @@ #include #include +#include #include #include +#include #include int powerpc_pow_enabled; +static void cpu_6xx_setup(int cpuid, uint16_t vers); +static void cpu_e500_setup(int cpuid, uint16_t vers); +static void cpu_970_setup(int cpuid, uint16_t vers); + struct cputab { const char *name; uint16_t version; uint16_t revfmt; + int features; /* Do not include PPC_FEATURE_32 or + * PPC_FEATURE_HAS_MMU */ + void (*cpu_setup)(int cpuid, uint16_t vers); }; #define REVFMT_MAJMIN 1 /* %u.%u */ #define REVFMT_HEX 2 /* 0x%04x */ #define REVFMT_DEC 3 /* %u */ static const struct cputab models[] = { - { "Motorola PowerPC 601", MPC601, REVFMT_DEC }, - { "Motorola PowerPC 602", MPC602, REVFMT_DEC }, - { "Motorola PowerPC 603", MPC603, REVFMT_MAJMIN }, - { "Motorola PowerPC 603e", MPC603e, REVFMT_MAJMIN }, - { "Motorola PowerPC 603ev", MPC603ev, REVFMT_MAJMIN }, - { "Motorola PowerPC 604", MPC604, REVFMT_MAJMIN }, - { "Motorola PowerPC 604ev", MPC604ev, REVFMT_MAJMIN }, - { "Motorola PowerPC 620", MPC620, REVFMT_HEX }, - { "Motorola PowerPC 750", MPC750, REVFMT_MAJMIN }, - { "IBM PowerPC 750FX", IBM750FX, REVFMT_MAJMIN }, - { "IBM PowerPC 970", IBM970, REVFMT_MAJMIN }, - { "IBM PowerPC 970FX", IBM970FX, REVFMT_MAJMIN }, - { "IBM PowerPC 970GX", IBM970GX, REVFMT_MAJMIN }, - { "IBM PowerPC 970MP", IBM970MP, REVFMT_MAJMIN }, - { "Motorola PowerPC 7400", MPC7400, REVFMT_MAJMIN }, - { "Motorola PowerPC 7410", MPC7410, REVFMT_MAJMIN }, - { "Motorola PowerPC 7450", MPC7450, REVFMT_MAJMIN }, - { "Motorola PowerPC 7455", MPC7455, REVFMT_MAJMIN }, - { "Motorola PowerPC 7457", MPC7457, REVFMT_MAJMIN }, - { "Motorola PowerPC 7447A", MPC7447A, REVFMT_MAJMIN }, - { "Motorola PowerPC 7448", MPC7448, REVFMT_MAJMIN }, - { "Motorola PowerPC 8240", MPC8240, REVFMT_MAJMIN }, - { "Freescale e500v1 core", FSL_E500v1, REVFMT_MAJMIN }, - { "Freescale e500v2 core", FSL_E500v2, REVFMT_MAJMIN }, - { "Unknown PowerPC CPU", 0, REVFMT_HEX } + { "Motorola PowerPC 601", MPC601, REVFMT_DEC, + PPC_FEATURE_HAS_FPU | PPC_FEATURE_UNIFIED_CACHE, cpu_6xx_setup }, + { "Motorola PowerPC 602", MPC602, REVFMT_DEC, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 603", MPC603, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 603e", MPC603e, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 603ev", MPC603ev, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 604", MPC604, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 604ev", MPC604ev, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 620", MPC620, REVFMT_HEX, + PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU, NULL }, + { "Motorola PowerPC 750", MPC750, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "IBM PowerPC 750FX", IBM750FX, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "IBM PowerPC 970", IBM970, REVFMT_MAJMIN, + PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, + cpu_970_setup }, + { "IBM PowerPC 970FX", IBM970FX, REVFMT_MAJMIN, + PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, + cpu_970_setup }, + { "IBM PowerPC 970GX", IBM970GX, REVFMT_MAJMIN, + PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, + cpu_970_setup }, + { "IBM PowerPC 970MP", IBM970MP, REVFMT_MAJMIN, + PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, + cpu_970_setup }, + { "Motorola PowerPC 7400", MPC7400, REVFMT_MAJMIN, + PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 7410", MPC7410, REVFMT_MAJMIN, + PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 7450", MPC7450, REVFMT_MAJMIN, + PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 7455", MPC7455, REVFMT_MAJMIN, + PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 7457", MPC7457, REVFMT_MAJMIN, + PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 7447A", MPC7447A, REVFMT_MAJMIN, + PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 7448", MPC7448, REVFMT_MAJMIN, + PPC_FEATURE_HAS_ALTIVEC | PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 8240", MPC8240, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Motorola PowerPC 8245", MPC8245, REVFMT_MAJMIN, + PPC_FEATURE_HAS_FPU, cpu_6xx_setup }, + { "Freescale e500v1 core", FSL_E500v1, REVFMT_MAJMIN, + 0, cpu_e500_setup }, + { "Freescale e500v2 core", FSL_E500v2, REVFMT_MAJMIN, + 0, cpu_e500_setup }, + { "Unknown PowerPC CPU", 0, REVFMT_HEX, 0, NULL }, }; +static void cpu_6xx_print_cacheinfo(u_int, uint16_t); +static int cpu_feature_bit(SYSCTL_HANDLER_ARGS); + static char model[64]; SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD, model, 0, ""); -register_t l2cr_config = 0; -register_t l3cr_config = 0; +int cpu_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU; +SYSCTL_OPAQUE(_hw, OID_AUTO, cpu_features, CTLTYPE_INT | CTLFLAG_RD, + &cpu_features, sizeof(cpu_features), "IX", "PowerPC CPU features"); -static void cpu_print_speed(void); -static void cpu_print_cacheinfo(u_int, uint16_t); +/* Provide some user-friendly aliases for bits in cpu_features */ +SYSCTL_PROC(_hw, OID_AUTO, floatingpoint, CTLTYPE_INT | CTLFLAG_RD, + 0, PPC_FEATURE_HAS_FPU, cpu_feature_bit, "I", + "Floating point instructions executed in hardware"); +SYSCTL_PROC(_hw, OID_AUTO, altivec, CTLTYPE_INT | CTLFLAG_RD, + 0, PPC_FEATURE_HAS_ALTIVEC, cpu_feature_bit, "I", "CPU supports Altivec"); void cpu_setup(u_int cpuid) { - u_int pvr, maj, min, hid0; + u_int pvr, maj, min; uint16_t vers, rev, revfmt; + uint64_t cps; const struct cputab *cp; const char *name; - char *bitmask; pvr = mfpvr(); vers = pvr >> 16; @@ -172,132 +219,19 @@ cpu_setup(u_int cpuid) break; } - hid0 = mfspr(SPR_HID0); - - /* - * Configure power-saving mode. - */ - switch (vers) { - case MPC603: - case MPC603e: - case MPC603ev: - case MPC604ev: - case MPC750: - case IBM750FX: - case MPC7400: - case MPC7410: - case MPC8240: - case MPC8245: - /* Select DOZE mode. */ - hid0 &= ~(HID0_DOZE | HID0_NAP | HID0_SLEEP); - hid0 |= HID0_DOZE | HID0_DPM; - powerpc_pow_enabled = 1; - break; - - case MPC7448: - case MPC7447A: - case MPC7457: - case MPC7455: - case MPC7450: - /* Enable the 7450 branch caches */ - hid0 |= HID0_SGE | HID0_BTIC; - hid0 |= HID0_LRSTK | HID0_FOLD | HID0_BHT; - /* Disable BTIC on 7450 Rev 2.0 or earlier and on 7457 */ - if (((pvr >> 16) == MPC7450 && (pvr & 0xFFFF) <= 0x0200) - || (pvr >> 16) == MPC7457) - hid0 &= ~HID0_BTIC; - /* Select NAP mode. */ - hid0 &= ~(HID0_DOZE | HID0_NAP | HID0_SLEEP); - hid0 |= HID0_NAP | HID0_DPM; - powerpc_pow_enabled = 1; - break; - - default: - /* No power-saving mode is available. */ ; - } - - switch (vers) { - case IBM750FX: - case MPC750: - hid0 &= ~HID0_DBP; /* XXX correct? */ - hid0 |= HID0_EMCP | HID0_BTIC | HID0_SGE | HID0_BHT; - break; - - case MPC7400: - case MPC7410: - hid0 &= ~HID0_SPD; - hid0 |= HID0_EMCP | HID0_BTIC | HID0_SGE | HID0_BHT; - hid0 |= HID0_EIEC; - break; - - case FSL_E500v1: - case FSL_E500v2: - break; - } - - mtspr(SPR_HID0, hid0); - - switch (vers) { - case MPC7447A: - case MPC7448: - case MPC7450: - case MPC7455: - case MPC7457: - bitmask = HID0_7450_BITMASK; - break; - case FSL_E500v1: - case FSL_E500v2: - bitmask = HID0_E500_BITMASK; - break; - default: - bitmask = HID0_BITMASK; - break; - } - - switch (vers) { - case MPC7450: - case MPC7455: - case MPC7457: - /* Only MPC745x CPUs have an L3 cache. */ - - l3cr_config = mfspr(SPR_L3CR); - - /* Fallthrough */ - case MPC750: - case IBM750FX: - case MPC7400: - case MPC7410: - case MPC7447A: - case MPC7448: - cpu_print_speed(); - printf("\n"); - - l2cr_config = mfspr(SPR_L2CR); - - if (bootverbose) - cpu_print_cacheinfo(cpuid, vers); - break; - case IBM970: - case IBM970FX: - case IBM970MP: - cpu_print_speed(); - printf("\n"); - break; - default: - printf("\n"); - break; - } - - printf("cpu%d: HID0 %b\n", cpuid, hid0, bitmask); -} - -void -cpu_print_speed(void) -{ - uint64_t cps; - if (cpu_est_clockrate(0, &cps) == 0) printf(", %lld.%02lld MHz", cps / 1000000, (cps / 10000) % 100); + printf("\n"); + + cpu_features |= cp->features; + printf("cpu%d: Features %b\n", cpuid, cpu_features, + PPC_FEATURE_BITMASK); + + /* + * Configure CPU + */ + if (cp->cpu_setup != NULL) + cp->cpu_setup(cpuid, vers); } /* Get current clock frequency for the given cpu id. */ @@ -355,10 +289,98 @@ cpu_est_clockrate(int cpu_id, uint64_t *cps) } void -cpu_print_cacheinfo(u_int cpuid, uint16_t vers) +cpu_6xx_setup(int cpuid, uint16_t vers) { - uint32_t hid; + register_t hid0, pvr; + const char *bitmask; + hid0 = mfspr(SPR_HID0); + pvr = mfpvr(); + + /* + * Configure power-saving mode. + */ + switch (vers) { + case MPC603: + case MPC603e: + case MPC603ev: + case MPC604ev: + case MPC750: + case IBM750FX: + case MPC7400: + case MPC7410: + case MPC8240: + case MPC8245: + /* Select DOZE mode. */ + hid0 &= ~(HID0_DOZE | HID0_NAP | HID0_SLEEP); + hid0 |= HID0_DOZE | HID0_DPM; + powerpc_pow_enabled = 1; + break; + + case MPC7448: + case MPC7447A: + case MPC7457: + case MPC7455: + case MPC7450: + /* Enable the 7450 branch caches */ + hid0 |= HID0_SGE | HID0_BTIC; + hid0 |= HID0_LRSTK | HID0_FOLD | HID0_BHT; + /* Disable BTIC on 7450 Rev 2.0 or earlier and on 7457 */ + if (((pvr >> 16) == MPC7450 && (pvr & 0xFFFF) <= 0x0200) + || (pvr >> 16) == MPC7457) + hid0 &= ~HID0_BTIC; + /* Select NAP mode. */ + hid0 &= ~(HID0_DOZE | HID0_NAP | HID0_SLEEP); + hid0 |= HID0_NAP | HID0_DPM; + powerpc_pow_enabled = 1; + break; + + default: + /* No power-saving mode is available. */ ; + } + + switch (vers) { + case IBM750FX: + case MPC750: + hid0 &= ~HID0_DBP; /* XXX correct? */ + hid0 |= HID0_EMCP | HID0_BTIC | HID0_SGE | HID0_BHT; + break; + + case MPC7400: + case MPC7410: + hid0 &= ~HID0_SPD; + hid0 |= HID0_EMCP | HID0_BTIC | HID0_SGE | HID0_BHT; + hid0 |= HID0_EIEC; + break; + + } + + mtspr(SPR_HID0, hid0); + + if (bootverbose) + cpu_6xx_print_cacheinfo(cpuid, vers); + + switch (vers) { + case MPC7447A: + case MPC7448: + case MPC7450: + case MPC7455: + case MPC7457: + bitmask = HID0_7450_BITMASK; + break; + default: + bitmask = HID0_BITMASK; + break; + } + + printf("cpu%d: HID0 %b\n", cpuid, (int)hid0, bitmask); +} + + +static void +cpu_6xx_print_cacheinfo(u_int cpuid, uint16_t vers) +{ + register_t hid; hid = mfspr(SPR_HID0); printf("cpu%u: ", cpuid); @@ -366,15 +388,15 @@ cpu_print_cacheinfo(u_int cpuid, uint16_t vers) printf("L1 D-cache %sabled\n", (hid & HID0_DCE) ? "en" : "dis"); printf("cpu%u: ", cpuid); - if (l2cr_config & L2CR_L2E) { + if (mfspr(SPR_L2CR) & L2CR_L2E) { switch (vers) { case MPC7450: case MPC7455: case MPC7457: printf("256KB L2 cache, "); - if (l3cr_config & L3CR_L3E) + if (mfspr(SPR_L3CR) & L3CR_L3E) printf("%cMB L3 backside cache", - l3cr_config & L3CR_L3SIZ ? '2' : '1'); + mfspr(SPR_L3CR) & L3CR_L3SIZ ? '2' : '1'); else printf("L3 cache disabled"); printf("\n"); @@ -383,7 +405,7 @@ cpu_print_cacheinfo(u_int cpuid, uint16_t vers) printf("512KB L2 cache\n"); break; default: - switch (l2cr_config & L2CR_L2SIZ) { + switch (mfspr(SPR_L2CR) & L2CR_L2SIZ) { case L2SIZ_256K: printf("256KB "); break; @@ -394,9 +416,9 @@ cpu_print_cacheinfo(u_int cpuid, uint16_t vers) printf("1MB "); break; } - printf("write-%s", (l2cr_config & L2CR_L2WT) + printf("write-%s", (mfspr(SPR_L2CR) & L2CR_L2WT) ? "through" : "back"); - if (l2cr_config & L2CR_L2PE) + if (mfspr(SPR_L2CR) & L2CR_L2PE) printf(", with parity"); printf(" backside cache\n"); break; @@ -404,3 +426,60 @@ cpu_print_cacheinfo(u_int cpuid, uint16_t vers) } else printf("L2 cache disabled\n"); } + +static void +cpu_e500_setup(int cpuid, uint16_t vers) +{ + register_t hid0; + + hid0 = mfspr(SPR_HID0); + printf("cpu%d: HID0 %b\n", cpuid, (int)hid0, HID0_E500_BITMASK); +} + +static void +cpu_970_setup(int cpuid, uint16_t vers) +{ +#ifdef AIM + uint32_t hid0_hi, hid0_lo; + + __asm __volatile ("mfspr %0,%2; clrldi %1,%0,32; srdi %0,%0,32;" + : "=r" (hid0_hi), "=r" (hid0_lo) : "K" (SPR_HID0)); + + /* Configure power-saving mode */ + switch (vers) { + case IBM970MP: + hid0_hi |= (HID0_DEEPNAP | HID0_DPM); + hid0_hi &= ~(HID0_DOZE | HID0_NAP); + break; + default: + hid0_hi |= (HID0_NAP | HID0_DPM); + hid0_hi &= ~(HID0_DOZE | HID0_DEEPNAP); + break; + } + powerpc_pow_enabled = 1; + + __asm __volatile (" \ + sync; isync; \ + sldi %0,%0,32; or %0,%0,%1; \ + mtspr %2, %0; \ + mfspr %0, %2; mfspr %0, %2; mfspr %0, %2; \ + mfspr %0, %2; mfspr %0, %2; mfspr %0, %2; \ + sync; isync" + :: "r" (hid0_hi), "r"(hid0_lo), "K" (SPR_HID0)); + + __asm __volatile ("mfspr %0,%1; srdi %0,%0,32;" + : "=r" (hid0_hi) : "K" (SPR_HID0)); + printf("cpu%d: HID0 %b\n", cpuid, (int)(hid0_hi), HID0_970_BITMASK); +#endif +} + +static int +cpu_feature_bit(SYSCTL_HANDLER_ARGS) +{ + int result; + + result = (cpu_features & arg2) ? 1 : 0; + + return (sysctl_handle_int(oidp, &result, 0, req)); +} + diff --git a/sys/powerpc/powerpc/elf_machdep.c b/sys/powerpc/powerpc/elf_machdep.c index fdf830afeb72..c370309e2d2f 100644 --- a/sys/powerpc/powerpc/elf_machdep.c +++ b/sys/powerpc/powerpc/elf_machdep.c @@ -91,7 +91,7 @@ static Elf32_Brandinfo freebsd_brand_info = { .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE }; -SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t) elf32_insert_brand_entry, &freebsd_brand_info); diff --git a/sys/powerpc/powerpc/mem.c b/sys/powerpc/powerpc/mem.c index 22d99c42bbe6..e4b70c68d906 100644 --- a/sys/powerpc/powerpc/mem.c +++ b/sys/powerpc/powerpc/mem.c @@ -121,8 +121,7 @@ kmem_direct_mapped: v = uio->uio_offset; else if (dev2unit(dev) == CDEV_MINOR_KMEM) { va = uio->uio_offset; - if ((va < VM_MIN_KERNEL_ADDRESS) - || (va > VM_MAX_KERNEL_ADDRESS)) + if ((va < VM_MIN_KERNEL_ADDRESS) || (va > virtual_end)) goto kmem_direct_mapped; va = trunc_page(uio->uio_offset); @@ -135,8 +134,7 @@ kmem_direct_mapped: v = uio->uio_offset; */ for (; va < eva; va += PAGE_SIZE) - if (pmap_extract(kernel_pmap, va) - == 0) + if (pmap_extract(kernel_pmap, va) == 0) return (EFAULT); prot = (uio->uio_rw == UIO_READ) @@ -161,7 +159,8 @@ kmem_direct_mapped: v = uio->uio_offset; * instead of going through read/write */ int -memmmap(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, int prot) +memmmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int prot, vm_memattr_t *memattr) { /* * /dev/mem is the only one that makes sense through this diff --git a/sys/powerpc/powerpc/mmu_if.m b/sys/powerpc/powerpc/mmu_if.m index 4a5a37c456c5..5b8ba14d6898 100644 --- a/sys/powerpc/powerpc/mmu_if.m +++ b/sys/powerpc/powerpc/mmu_if.m @@ -789,15 +789,21 @@ METHOD boolean_t dev_direct_mapped { /** - * @brief Evaluate if a physical page has an executable mapping + * @brief Enforce instruction cache coherency. Typically called after a + * region of memory has been modified and before execution of or within + * that region is attempted. Setting breakpoints in a process through + * ptrace(2) is one example of when the instruction cache needs to be + * made coherent. * - * @param _pg physical page - * - * @retval bool TRUE if a physical mapping exists for the given page. + * @param _pm the physical map of the virtual address + * @param _va the virtual address of the modified region + * @param _sz the size of the modified region */ -METHOD boolean_t page_executable { +METHOD void sync_icache { mmu_t _mmu; - vm_page_t _pg; + pmap_t _pm; + vm_offset_t _va; + vm_size_t _sz; }; diff --git a/sys/powerpc/powerpc/mp_machdep.c b/sys/powerpc/powerpc/mp_machdep.c index 1ae7d6d6f7ff..f3e16e898b8f 100644 --- a/sys/powerpc/powerpc/mp_machdep.c +++ b/sys/powerpc/powerpc/mp_machdep.c @@ -64,7 +64,10 @@ static u_int ipi_msg_cnt[32]; void machdep_ap_bootstrap(void) { + /* Set up important bits on the CPU (HID registers, etc.) */ + cpudep_ap_setup(); + /* Set PIR */ PCPU_SET(pir, mfspr(SPR_PIR)); PCPU_SET(awake, 1); __asm __volatile("msync; isync"); @@ -78,7 +81,7 @@ machdep_ap_bootstrap(void) __asm __volatile("mtdec %0" :: "r"(ap_decr)); atomic_add_int(&ap_awake, 1); - CTR1(KTR_SMP, "SMP: AP CPU%d launched", PCPU_GET(cpuid)); + printf("SMP: AP CPU #%d launched\n", PCPU_GET(cpuid)); /* Initialize curthread */ PCPU_SET(curthread, PCPU_GET(idlethread)); @@ -86,6 +89,8 @@ machdep_ap_bootstrap(void) /* Let the DEC and external interrupts go */ mtmsr(mfmsr() | PSL_EE); + + /* Announce ourselves awake, and enter the scheduler */ sched_throw(NULL); } @@ -247,6 +252,9 @@ cpu_mp_unleash(void *dummy) mp_ncpus, cpus, smp_cpus); } + /* Let the APs get into the scheduler */ + DELAY(10000); + smp_active = 1; smp_started = 1; } diff --git a/sys/powerpc/powerpc/pmap_dispatch.c b/sys/powerpc/powerpc/pmap_dispatch.c index b34c7ebbb9f0..2b45e17c6f3d 100644 --- a/sys/powerpc/powerpc/pmap_dispatch.c +++ b/sys/powerpc/powerpc/pmap_dispatch.c @@ -457,12 +457,12 @@ pmap_dev_direct_mapped(vm_offset_t pa, vm_size_t size) return (MMU_DEV_DIRECT_MAPPED(mmu_obj, pa, size)); } -boolean_t -pmap_page_executable(vm_page_t pg) +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) { - - CTR2(KTR_PMAP, "%s(%p)", __func__, pg); - return (MMU_PAGE_EXECUTABLE(mmu_obj, pg)); + + CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pm, va, sz); + return (MMU_SYNC_ICACHE(mmu_obj, pm, va, sz)); } vm_offset_t diff --git a/sys/powerpc/powerpc/stack_machdep.c b/sys/powerpc/powerpc/stack_machdep.c index 7bc6fd45ca7d..b3519c39d740 100644 --- a/sys/powerpc/powerpc/stack_machdep.c +++ b/sys/powerpc/powerpc/stack_machdep.c @@ -43,7 +43,7 @@ __FBSDID("$FreeBSD$"); #include static void -stack_capture(struct stack *st, register_t frame) +stack_capture(struct stack *st, vm_offset_t frame) { vm_offset_t callpc; @@ -76,7 +76,7 @@ stack_capture(struct stack *st, register_t frame) void stack_save_td(struct stack *st, struct thread *td) { - register_t frame; + vm_offset_t frame; if (TD_IS_SWAPPED(td)) panic("stack_save_td: swapped"); diff --git a/sys/powerpc/powerpc/uio_machdep.c b/sys/powerpc/powerpc/uio_machdep.c index 2a88fd247ae9..6d171145f2c9 100644 --- a/sys/powerpc/powerpc/uio_machdep.c +++ b/sys/powerpc/powerpc/uio_machdep.c @@ -107,9 +107,6 @@ uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio) sf_buf_free(sf); goto out; } - if (uio->uio_rw == UIO_WRITE && - pmap_page_executable(m)) - __syncicache(cp, cnt); break; case UIO_SYSSPACE: if (uio->uio_rw == UIO_READ) diff --git a/sys/powerpc/psim/ata_iobus.c b/sys/powerpc/psim/ata_iobus.c index a70d0087a87a..60f6c5088709 100644 --- a/sys/powerpc/psim/ata_iobus.c +++ b/sys/powerpc/psim/ata_iobus.c @@ -210,7 +210,7 @@ ata_iobus_release_resource(device_t dev, device_t child, int type, int rid, */ static int ata_iobus_sub_probe(device_t dev); -static void ata_iobus_sub_setmode(device_t parent, device_t dev); +static int ata_iobus_sub_setmode(device_t dev, int target, int mode); static device_method_t ata_iobus_sub_methods[] = { /* Device interface */ @@ -245,11 +245,9 @@ ata_iobus_sub_probe(device_t dev) return ata_probe(dev); } -static void -ata_iobus_sub_setmode(device_t parent, device_t dev) +static int +ata_iobus_sub_setmode(device_t parent, int target, int mode) { - struct ata_device *atadev = device_get_softc(dev); - /* Only ever PIO mode here... */ - atadev->mode = ATA_PIO; + return (ATA_PIO); } diff --git a/sys/rpc/authunix_prot.c b/sys/rpc/authunix_prot.c index fc03dff3ab90..b1b70a596730 100644 --- a/sys/rpc/authunix_prot.c +++ b/sys/rpc/authunix_prot.c @@ -110,7 +110,7 @@ xdr_authunix_parms(XDR *xdrs, uint32_t *time, struct xucred *cred) if (!xdr_uint32_t(xdrs, &ngroups)) return (FALSE); for (i = 0; i < ngroups; i++) { - if (i + 1 < NGROUPS) { + if (i + 1 < ngroups_max + 1) { if (!xdr_uint32_t(xdrs, &cred->cr_groups[i + 1])) return (FALSE); } else { @@ -120,8 +120,8 @@ xdr_authunix_parms(XDR *xdrs, uint32_t *time, struct xucred *cred) } if (xdrs->x_op == XDR_DECODE) { - if (ngroups + 1 > NGROUPS) - cred->cr_ngroups = NGROUPS; + if (ngroups + 1 > ngroups_max + 1) + cred->cr_ngroups = ngroups_max + 1; else cred->cr_ngroups = ngroups + 1; } diff --git a/sys/rpc/clnt_dg.c b/sys/rpc/clnt_dg.c index 78f4a9a21285..e3fa02c91bf9 100644 --- a/sys/rpc/clnt_dg.c +++ b/sys/rpc/clnt_dg.c @@ -258,7 +258,7 @@ clnt_dg_create( rpc_createerr.cf_error.re_errno = 0; goto err2; } - cu->cu_mcalllen = XDR_GETPOS(&xdrs);; + cu->cu_mcalllen = XDR_GETPOS(&xdrs); /* * By default, closeit is always FALSE. It is users responsibility diff --git a/sys/rpc/clnt_vc.c b/sys/rpc/clnt_vc.c index 85e89abe5c31..2e5fe41f1b94 100644 --- a/sys/rpc/clnt_vc.c +++ b/sys/rpc/clnt_vc.c @@ -413,6 +413,22 @@ call_again: cr->cr_xid = xid; mtx_lock(&ct->ct_lock); + /* + * Check to see if the other end has already started to close down + * the connection. The upcall will have set ct_error.re_status + * to RPC_CANTRECV if this is the case. + * If the other end starts to close down the connection after this + * point, it will be detected later when cr_error is checked, + * since the request is in the ct_pending queue. + */ + if (ct->ct_error.re_status == RPC_CANTRECV) { + if (errp != &ct->ct_error) { + errp->re_errno = ct->ct_error.re_errno; + errp->re_status = RPC_CANTRECV; + } + stat = RPC_CANTRECV; + goto out; + } TAILQ_INSERT_TAIL(&ct->ct_pending, cr, cr_link); mtx_unlock(&ct->ct_lock); diff --git a/sys/rpc/rpcsec_gss/rpcsec_gss_prot.c b/sys/rpc/rpcsec_gss/rpcsec_gss_prot.c index 0654a6e6a22c..91112a1aa675 100644 --- a/sys/rpc/rpcsec_gss/rpcsec_gss_prot.c +++ b/sys/rpc/rpcsec_gss/rpcsec_gss_prot.c @@ -307,7 +307,7 @@ xdr_rpc_gss_unwrap_data(struct mbuf **resultsp, } #ifdef DEBUG -#include +#include void rpc_gss_log_debug(const char *fmt, ...) @@ -315,9 +315,9 @@ rpc_gss_log_debug(const char *fmt, ...) va_list ap; va_start(ap, fmt); - fprintf(stderr, "rpcsec_gss: "); - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n"); + printf("rpcsec_gss: "); + vprintf(fmt, ap); + printf("\n"); va_end(ap); } @@ -328,7 +328,7 @@ rpc_gss_log_status(const char *m, gss_OID mech, OM_uint32 maj_stat, OM_uint32 mi gss_buffer_desc msg; int msg_ctx = 0; - fprintf(stderr, "rpcsec_gss: %s: ", m); + printf("rpcsec_gss: %s: ", m); gss_display_status(&min, maj_stat, GSS_C_GSS_CODE, GSS_C_NULL_OID, &msg_ctx, &msg); diff --git a/sys/rpc/rpcsec_gss/svc_rpcsec_gss.c b/sys/rpc/rpcsec_gss/svc_rpcsec_gss.c index 2e7f3c8df7f7..7433b79d2bbe 100644 --- a/sys/rpc/rpcsec_gss/svc_rpcsec_gss.c +++ b/sys/rpc/rpcsec_gss/svc_rpcsec_gss.c @@ -100,7 +100,7 @@ struct svc_rpc_gss_callback { rpc_gss_callback_t cb_callback; }; static SLIST_HEAD(svc_rpc_gss_callback_list, svc_rpc_gss_callback) - svc_rpc_gss_callbacks = SLIST_HEAD_INITIALIZER(&svc_rpc_gss_callbacks); + svc_rpc_gss_callbacks = SLIST_HEAD_INITIALIZER(svc_rpc_gss_callbacks); struct svc_rpc_gss_svc_name { SLIST_ENTRY(svc_rpc_gss_svc_name) sn_link; @@ -112,7 +112,7 @@ struct svc_rpc_gss_svc_name { u_int sn_version; }; static SLIST_HEAD(svc_rpc_gss_svc_name_list, svc_rpc_gss_svc_name) - svc_rpc_gss_svc_names = SLIST_HEAD_INITIALIZER(&svc_rpc_gss_svc_names); + svc_rpc_gss_svc_names = SLIST_HEAD_INITIALIZER(svc_rpc_gss_svc_names); enum svc_rpc_gss_client_state { CLIENT_NEW, /* still authenticating */ @@ -121,6 +121,9 @@ enum svc_rpc_gss_client_state { }; #define SVC_RPC_GSS_SEQWINDOW 128 +#ifndef RPCAUTH_UNIXGIDS +#define RPCAUTH_UNIXGIDS 16 +#endif struct svc_rpc_gss_clientid { unsigned long ci_hostid; @@ -147,7 +150,7 @@ struct svc_rpc_gss_client { int cl_rpcflavor; /* RPC pseudo sec flavor */ bool_t cl_done_callback; /* TRUE after call */ void *cl_cookie; /* user cookie from callback */ - gid_t cl_gid_storage[NGROUPS]; + gid_t cl_gid_storage[RPCAUTH_UNIXGIDS]; gss_OID cl_mech; /* mechanism */ gss_qop_t cl_qop; /* quality of protection */ uint32_t cl_seqlast; /* sequence window origin */ @@ -449,6 +452,8 @@ rpc_gss_svc_getcred(struct svc_req *req, struct ucred **crp, int *flavorp) cr->cr_uid = cr->cr_ruid = cr->cr_svuid = uc->uid; cr->cr_rgid = cr->cr_svgid = uc->gid; crsetgroups(cr, uc->gidlen, uc->gidlist); + cr->cr_prison = &prison0; + prison_hold(cr->cr_prison); *crp = crhold(cr); return (TRUE); @@ -733,7 +738,7 @@ svc_rpc_gss_build_ucred(struct svc_rpc_gss_client *client, uc->gid = 65534; uc->gidlist = client->cl_gid_storage; - numgroups = NGROUPS; + numgroups = RPCAUTH_UNIXGIDS; maj_stat = gss_pname_to_unix_cred(&min_stat, name, client->cl_mech, &uc->uid, &uc->gid, &numgroups, &uc->gidlist[0]); if (GSS_ERROR(maj_stat)) @@ -930,7 +935,7 @@ svc_rpc_gss_accept_sec_context(struct svc_rpc_gss_client *client, "", client->cl_rawcred.client_principal->name, mechname.length, (char *)mechname.value, - client->cl_qop, client->rawcred.service); + client->cl_qop, client->cl_rawcred.service); gss_release_buffer(&min_stat, &mechname); } diff --git a/sys/security/audit/audit_arg.c b/sys/security/audit/audit_arg.c index 6d99666ddf24..562b799cc21a 100644 --- a/sys/security/audit/audit_arg.c +++ b/sys/security/audit/audit_arg.c @@ -262,8 +262,8 @@ audit_arg_groupset(gid_t *gidset, u_int gidset_size) u_int i; struct kaudit_record *ar; - KASSERT(gidset_size <= NGROUPS, - ("audit_arg_groupset: gidset_size > NGROUPS")); + KASSERT(gidset_size <= ngroups_max + 1, + ("audit_arg_groupset: gidset_size > (kern.ngroups + 1)")); ar = currecord(); if (ar == NULL) diff --git a/sys/security/audit/audit_bsm.c b/sys/security/audit/audit_bsm.c index b1a9931e2111..faa458353187 100644 --- a/sys/security/audit/audit_bsm.c +++ b/sys/security/audit/audit_bsm.c @@ -842,6 +842,13 @@ kaudit_to_bsm(struct kaudit_record *kar, struct au_record **pau) UPATH1_VNODE1_TOKENS; break; + case AUE_CLOSEFROM: + if (ARG_IS_VALID(kar, ARG_FD)) { + tok = au_to_arg32(1, "fd", ar->ar_arg_fd); + kau_write(rec, tok); + } + break; + case AUE_CORE: if (ARG_IS_VALID(kar, ARG_SIGNUM)) { tok = au_to_arg32(1, "signal", ar->ar_arg_signum); diff --git a/sys/security/mac_biba/mac_biba.c b/sys/security/mac_biba/mac_biba.c index e66e089041a2..fcede07142f6 100644 --- a/sys/security/mac_biba/mac_biba.c +++ b/sys/security/mac_biba/mac_biba.c @@ -955,6 +955,7 @@ biba_devfs_create_device(struct ucred *cred, struct mount *mp, biba_type = MAC_BIBA_TYPE_EQUAL; else if (ptys_equal && (strncmp(dev->si_name, "ttyp", strlen("ttyp")) == 0 || + strncmp(dev->si_name, "pts/", strlen("pts/")) == 0 || strncmp(dev->si_name, "ptyp", strlen("ptyp")) == 0)) biba_type = MAC_BIBA_TYPE_EQUAL; else diff --git a/sys/security/mac_lomac/mac_lomac.c b/sys/security/mac_lomac/mac_lomac.c index 63a6a63a2f85..5cdfc6767f32 100644 --- a/sys/security/mac_lomac/mac_lomac.c +++ b/sys/security/mac_lomac/mac_lomac.c @@ -1043,6 +1043,7 @@ lomac_devfs_create_device(struct ucred *cred, struct mount *mp, lomac_type = MAC_LOMAC_TYPE_EQUAL; else if (ptys_equal && (strncmp(dev->si_name, "ttyp", strlen("ttyp")) == 0 || + strncmp(dev->si_name, "pts/", strlen("pts/")) == 0 || strncmp(dev->si_name, "ptyp", strlen("ptyp")) == 0)) lomac_type = MAC_LOMAC_TYPE_EQUAL; else @@ -2470,7 +2471,7 @@ lomac_vnode_check_open(struct ucred *cred, struct vnode *vp, obj = SLOT(vplabel); /* XXX privilege override for admin? */ - if (accmode & (VWRITE | VAPPEND | VADMIN)) { + if (accmode & VMODIFY_PERMS) { if (!lomac_subject_dominate(subj, obj)) return (EACCES); } diff --git a/sys/security/mac_mls/mac_mls.c b/sys/security/mac_mls/mac_mls.c index a0669c7eb54b..d41799d5a23f 100644 --- a/sys/security/mac_mls/mac_mls.c +++ b/sys/security/mac_mls/mac_mls.c @@ -918,6 +918,7 @@ mls_devfs_create_device(struct ucred *cred, struct mount *mp, mls_type = MAC_MLS_TYPE_HIGH; else if (ptys_equal && (strncmp(dev->si_name, "ttyp", strlen("ttyp")) == 0 || + strncmp(dev->si_name, "pts/", strlen("pts/")) == 0 || strncmp(dev->si_name, "ptyp", strlen("ptyp")) == 0)) mls_type = MAC_MLS_TYPE_EQUAL; else diff --git a/sys/sparc64/central/central.c b/sys/sparc64/central/central.c index 4ded549e70d9..777660fdfebb 100644 --- a/sys/sparc64/central/central.c +++ b/sys/sparc64/central/central.c @@ -105,7 +105,9 @@ static driver_t central_driver = { static devclass_t central_devclass; -DRIVER_MODULE(central, nexus, central_driver, central_devclass, 0, 0); +EARLY_DRIVER_MODULE(central, nexus, central_driver, central_devclass, 0, 0, + BUS_PASS_BUS); +MODULE_DEPEND(fhc, nexus, 1, 1, 1); MODULE_VERSION(central, 1); static int diff --git a/sys/sparc64/conf/GENERIC b/sys/sparc64/conf/GENERIC index ecf640cc4396..1c4d45bef792 100644 --- a/sys/sparc64/conf/GENERIC +++ b/sys/sparc64/conf/GENERIC @@ -21,15 +21,6 @@ cpu SUN4U ident GENERIC -# To statically compile in device wiring instead of /boot/device.hints -#hints "GENERIC.hints" # Default places to look for devices. - -# Use the following to compile in values accessible to the kernel -# through getenv() (or kenv(1) in userland). The format of the file -# is 'variable=value', see kenv(1) -# -# env "GENERIC.env" - makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols # Platforms supported @@ -72,11 +63,13 @@ options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework +options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging for use in -current options KDB # Enable kernel debugger support. options DDB # Support DDB. options GDB # Support remote GDB. +options DEADLKRES # Enable the deadlock resolver options INVARIANTS # Enable calls of extra sanity checking options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS options WITNESS # Enable checks to detect deadlocks and cycles @@ -150,6 +143,7 @@ device eeprom # eeprom (really a front-end for the MK48Txx) device mk48txx # Mostek MK48Txx clocks device rtc # rtc (really a front-end for the MC146818) device mc146818 # Motorola MC146818 and compatible clocks +device epic # Sun Fire V215/V245 LEDs # Serial (COM) ports device puc # Multi-channel uarts @@ -190,7 +184,7 @@ device rl # RealTek 8129/8139 device sf # Adaptec AIC-6915 (``Starfire'') #device sis # Silicon Integrated Systems SiS 900/SiS 7016 device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet -#device ste # Sundance ST201 (D-Link DFE-550TX) +device ste # Sundance ST201 (D-Link DFE-550TX) device stge # Sundance/Tamarack TC9021 gigabit Ethernet #device tl # Texas Instruments ThunderLAN #device tx # SMC EtherPower II (83c170 ``EPIC'') @@ -216,6 +210,7 @@ device ath_rate_sample # SampleRate tx rate control for ath device loop # Network loopback device random # Entropy device device ether # Ethernet support +device vlan # 802.1Q VLAN support device tun # Packet tunnel. device pty # BSD-style compatibility pseudo ttys device md # Memory "disks" @@ -239,10 +234,6 @@ device ukbd # Keyboard device ulpt # Printer device umass # Disks/Mass storage - Requires scbus and da device ums # Mouse -device rum # Ralink Technology RT2501USB wireless NICs -device uath # Atheros AR5523 wireless NICs -device ural # Ralink Technology RT2500USB wireless NICs -device zyd # ZyDAS zb1211/zb1211b wireless NICs device urio # Diamond Rio 500 MP3 player # USB Serial devices device uark # Technologies ARK3116 based serial adapters @@ -261,6 +252,11 @@ device cue # CATC USB Ethernet device kue # Kawasaki LSI USB Ethernet device rue # RealTek RTL8150 USB Ethernet device udav # Davicom DM9601E USB +# USB Wireless +device rum # Ralink Technology RT2501USB wireless NICs +device uath # Atheros AR5523 wireless NICs +device ural # Ralink Technology RT2500USB wireless NICs +device zyd # ZyDAS zb1211/zb1211b wireless NICs # FireWire support device firewire # FireWire bus code diff --git a/sys/sparc64/conf/Makefile b/sys/sparc64/conf/Makefile index 2c006e9c2c80..b0b5857849c4 100644 --- a/sys/sparc64/conf/Makefile +++ b/sys/sparc64/conf/Makefile @@ -1,3 +1,5 @@ # $FreeBSD$ +TARGET=sparc64 + .include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/sparc64/conf/NOTES b/sys/sparc64/conf/NOTES index 211165a1fe8a..d9c5be538ea1 100644 --- a/sys/sparc64/conf/NOTES +++ b/sys/sparc64/conf/NOTES @@ -43,6 +43,7 @@ device mc146818 # Motorola MC146818 and compatible clocks # device auxio # auxiliary I/O device +device epic # Sun Fire V215/V245 LEDs device creator # Creator, Creator3D and Elite3D framebuffers device machfb # ATI Mach64 framebuffers @@ -129,6 +130,7 @@ nodevice ex # Options we don't want to deal with nooption FDC_DEBUG +nooption COMPAT_FREEBSD4 nooption SC_RENDER_DEBUG nooption SC_DEBUG_LEVEL nooption PPC_DEBUG diff --git a/sys/sparc64/ebus/ebus.c b/sys/sparc64/ebus/ebus.c index 3bafaae33233..124eebb82045 100644 --- a/sys/sparc64/ebus/ebus.c +++ b/sys/sparc64/ebus/ebus.c @@ -1,6 +1,7 @@ /*- * Copyright (c) 1999, 2000 Matthew R. Green * Copyright (c) 2001 Thomas Moestl + * Copyright (c) 2009 by Marius Strobl * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,7 +34,7 @@ __FBSDID("$FreeBSD$"); /* - * UltraSPARC 5 and beyond EBus support + * Driver for JBus to EBus and PCI to EBus bridges */ #include @@ -43,14 +44,17 @@ __FBSDID("$FreeBSD$"); #include #include -#include - #include #include #include #include +#include +#ifndef SUN4V +#include +#endif +#include #include #include @@ -59,11 +63,19 @@ __FBSDID("$FreeBSD$"); #include /* - * The register, ranges and interrupt map properties are identical to the ISA - * ones. + * The register, interrupt map and for the PCI variant also the ranges + * properties are identical to the ISA ones. */ #include +struct ebus_nexus_ranges { + uint32_t child_hi; + uint32_t child_lo; + uint32_t phys_hi; + uint32_t phys_lo; + uint32_t size; +}; + struct ebus_devinfo { struct ofw_bus_devinfo edi_obdinfo; struct resource_list edi_rl; @@ -76,32 +88,92 @@ struct ebus_rinfo { }; struct ebus_softc { - struct isa_ranges *sc_range; + void *sc_range; struct ebus_rinfo *sc_rinfo; + u_int sc_flags; +#define EBUS_PCI (1 << 0) + int sc_nrange; struct ofw_bus_iinfo sc_iinfo; + +#ifndef SUN4V + uint32_t sc_ign; +#endif }; -static device_probe_t ebus_probe; -static device_attach_t ebus_attach; +static device_probe_t ebus_nexus_probe; +static device_attach_t ebus_nexus_attach; +static device_probe_t ebus_pci_probe; +static device_attach_t ebus_pci_attach; static bus_print_child_t ebus_print_child; static bus_probe_nomatch_t ebus_probe_nomatch; static bus_alloc_resource_t ebus_alloc_resource; static bus_release_resource_t ebus_release_resource; +static bus_setup_intr_t ebus_setup_intr; static bus_get_resource_list_t ebus_get_resource_list; static ofw_bus_get_devinfo_t ebus_get_devinfo; -static struct ebus_devinfo *ebus_setup_dinfo(device_t, struct ebus_softc *, - phandle_t); -static void ebus_destroy_dinfo(struct ebus_devinfo *); -static int ebus_print_res(struct ebus_devinfo *); +static int ebus_attach(device_t dev, struct ebus_softc *sc, phandle_t node); +static struct ebus_devinfo *ebus_setup_dinfo(device_t dev, + struct ebus_softc *sc, phandle_t node); +static void ebus_destroy_dinfo(struct ebus_devinfo *edi); +static int ebus_print_res(struct ebus_devinfo *edi); -static device_method_t ebus_methods[] = { +static devclass_t ebus_devclass; + +static device_method_t ebus_nexus_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, ebus_probe), - DEVMETHOD(device_attach, ebus_attach), + DEVMETHOD(device_probe, ebus_nexus_probe), + DEVMETHOD(device_attach, ebus_nexus_attach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + /* Bus interface */ + DEVMETHOD(bus_print_child, ebus_print_child), + DEVMETHOD(bus_probe_nomatch, ebus_probe_nomatch), + DEVMETHOD(bus_alloc_resource, ebus_alloc_resource), + DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), + DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_release_resource, ebus_release_resource), + DEVMETHOD(bus_setup_intr, ebus_setup_intr), + DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), + DEVMETHOD(bus_get_resource_list, ebus_get_resource_list), + DEVMETHOD(bus_child_pnpinfo_str, ofw_bus_gen_child_pnpinfo_str), + + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_devinfo, ebus_get_devinfo), + DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat), + DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model), + DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name), + DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node), + DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type), + + KOBJMETHOD_END +}; + +static driver_t ebus_nexus_driver = { + "ebus", + ebus_nexus_methods, + sizeof(struct ebus_softc), +}; + +/* + * NB: we rely on the interrupt controllers of the accompanying PCI-Express + * bridge to be registered as the nexus variant of the EBus bridges doesn't + * employ its own one. + */ +EARLY_DRIVER_MODULE(ebus, nexus, ebus_nexus_driver, ebus_devclass, 0, 0, + BUS_PASS_BUS + 1); +MODULE_DEPEND(ebus, nexus, 1, 1, 1); + +static device_method_t ebus_pci_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ebus_pci_probe), + DEVMETHOD(device_attach, ebus_pci_attach), DEVMETHOD(device_shutdown, bus_generic_shutdown), DEVMETHOD(device_suspend, bus_generic_suspend), DEVMETHOD(device_resume, bus_generic_resume), @@ -130,20 +202,33 @@ static device_method_t ebus_methods[] = { KOBJMETHOD_END }; -static driver_t ebus_driver = { +static driver_t ebus_pci_driver = { "ebus", - ebus_methods, + ebus_pci_methods, sizeof(struct ebus_softc), }; -static devclass_t ebus_devclass; - -DRIVER_MODULE(ebus, pci, ebus_driver, ebus_devclass, 0, 0); +EARLY_DRIVER_MODULE(ebus, pci, ebus_pci_driver, ebus_devclass, 0, 0, + BUS_PASS_BUS); MODULE_DEPEND(ebus, pci, 1, 1, 1); MODULE_VERSION(ebus, 1); static int -ebus_probe(device_t dev) +ebus_nexus_probe(device_t dev) +{ + const char* compat; + + compat = ofw_bus_get_compat(dev); + if (compat != NULL && strcmp(ofw_bus_get_name(dev), "ebus") == 0 && + strcmp(compat, "jbus-ebus") == 0) { + device_set_desc(dev, "JBus-EBus bridge"); + return (BUS_PROBE_GENERIC); + } + return (ENXIO); +} + +static int +ebus_pci_probe(device_t dev) { if (pci_get_class(dev) != PCIC_BRIDGE || @@ -157,27 +242,58 @@ ebus_probe(device_t dev) device_set_desc(dev, "PCI-EBus3 bridge"); else return (ENXIO); - return (0); + return (BUS_PROBE_GENERIC); } static int -ebus_attach(device_t dev) +ebus_nexus_attach(device_t dev) +{ + struct ebus_softc *sc; + phandle_t node; + + sc = device_get_softc(dev); + node = ofw_bus_get_node(dev); + +#ifndef SUN4V + if (OF_getprop(node, "portid", &sc->sc_ign, + sizeof(sc->sc_ign)) == -1) { + device_printf(dev, "could not determine IGN"); + return (ENXIO); + } +#endif + + sc->sc_nrange = OF_getprop_alloc(node, "ranges", + sizeof(struct ebus_nexus_ranges), &sc->sc_range); + if (sc->sc_nrange == -1) { + printf("%s: could not get ranges property\n", __func__); + return (ENXIO); + } + return (ebus_attach(dev, sc, node)); +} + +static int +ebus_pci_attach(device_t dev) { struct ebus_softc *sc; - struct ebus_devinfo *edi; struct ebus_rinfo *eri; struct resource *res; - device_t cdev; phandle_t node; int i, rnum, rid; sc = device_get_softc(dev); + sc->sc_flags |= EBUS_PCI; + + pci_write_config(dev, PCIR_COMMAND, + pci_read_config(dev, PCIR_COMMAND, 2) | PCIM_CMD_SERRESPEN | + PCIM_CMD_PERRESPEN | PCIM_CMD_BUSMASTEREN | PCIM_CMD_MEMEN, 2); + pci_write_config(dev, PCIR_CACHELNSZ, 16 /* 64 bytes */, 1); + pci_write_config(dev, PCIR_LATTIMER, 64 /* 64 PCI cycles */, 1); node = ofw_bus_get_node(dev); sc->sc_nrange = OF_getprop_alloc(node, "ranges", - sizeof(*sc->sc_range), (void **)&sc->sc_range); + sizeof(struct isa_ranges), &sc->sc_range); if (sc->sc_nrange == -1) { - printf("ebus_attach: could not get ranges property\n"); + printf("%s: could not get ranges property\n", __func__); return (ENXIO); } @@ -187,29 +303,52 @@ ebus_attach(device_t dev) /* For every range, there must be a matching resource. */ for (rnum = 0; rnum < sc->sc_nrange; rnum++) { eri = &sc->sc_rinfo[rnum]; - eri->eri_rtype = ofw_isa_range_restype(&sc->sc_range[rnum]); + eri->eri_rtype = ofw_isa_range_restype( + &((struct isa_ranges *)sc->sc_range)[rnum]); rid = PCIR_BAR(rnum); res = bus_alloc_resource_any(dev, eri->eri_rtype, &rid, RF_ACTIVE); if (res == NULL) { - printf("ebus_attach: failed to allocate range " - "resource!\n"); + printf("%s: failed to allocate range resource!\n", + __func__); goto fail; } eri->eri_res = res; eri->eri_rman.rm_type = RMAN_ARRAY; eri->eri_rman.rm_descr = "EBus range"; if (rman_init(&eri->eri_rman) != 0) { - printf("ebus_attach: failed to initialize rman!"); + printf("%s: failed to initialize rman!", __func__); goto fail; } if (rman_manage_region(&eri->eri_rman, rman_get_start(res), rman_get_end(res)) != 0) { - printf("ebus_attach: failed to register region!"); + printf("%s: failed to register region!", __func__); rman_fini(&eri->eri_rman); goto fail; } } + return (ebus_attach(dev, sc, node)); + + fail: + for (i = rnum; i >= 0; i--) { + eri = &sc->sc_rinfo[i]; + if (i < rnum) + rman_fini(&eri->eri_rman); + if (eri->eri_res != 0) { + bus_release_resource(dev, eri->eri_rtype, + PCIR_BAR(rnum), eri->eri_res); + } + } + free(sc->sc_rinfo, M_DEVBUF); + free(sc->sc_range, M_OFWPROP); + return (ENXIO); +} + +static int +ebus_attach(device_t dev, struct ebus_softc *sc, phandle_t node) +{ + struct ebus_devinfo *edi; + device_t cdev; ofw_bus_setup_iinfo(node, &sc->sc_iinfo, sizeof(ofw_isa_intr_t)); @@ -228,20 +367,6 @@ ebus_attach(device_t dev) device_set_ivars(cdev, edi); } return (bus_generic_attach(dev)); - -fail: - for (i = rnum; i >= 0; i--) { - eri = &sc->sc_rinfo[i]; - if (i < rnum) - rman_fini(&eri->eri_rman); - if (eri->eri_res != 0) { - bus_release_resource(dev, eri->eri_rtype, - PCIR_BAR(rnum), eri->eri_res); - } - } - free(sc->sc_rinfo, M_DEVBUF); - free(sc->sc_range, M_OFWPROP); - return (ENXIO); } static int @@ -273,28 +398,26 @@ ebus_alloc_resource(device_t bus, device_t child, int type, int *rid, struct resource_list_entry *rle = NULL; struct resource *res; struct ebus_rinfo *ri; + struct ebus_nexus_ranges *enr; bus_space_tag_t bt; bus_space_handle_t bh; - int passthrough = (device_get_parent(child) != bus); - int isdefault = (start == 0UL && end == ~0UL); - int ridx, rv; + uint64_t cend, cstart, offset; + int i, isdefault, passthrough, ridx, rv; - sc = (struct ebus_softc *)device_get_softc(bus); + isdefault = (start == 0UL && end == ~0UL); + passthrough = (device_get_parent(child) != bus); + sc = device_get_softc(bus); rl = BUS_GET_RESOURCE_LIST(bus, child); - /* - * Map EBus ranges to PCI ranges. This may include changing the - * allocation type. - */ switch (type) { case SYS_RES_MEMORY: KASSERT(!(isdefault && passthrough), - ("ebus_alloc_resource: passthrough of default alloc")); + ("%s: passthrough of default allocation", __func__)); if (!passthrough) { rle = resource_list_find(rl, type, *rid); if (rle == NULL) return (NULL); KASSERT(rle->res == NULL, - ("ebus_alloc_resource: resource entry is busy")); + ("%s: resource entry is busy", __func__)); if (isdefault) { start = rle->start; count = ulmax(count, rle->count); @@ -302,25 +425,53 @@ ebus_alloc_resource(device_t bus, device_t child, int type, int *rid, } } - (void)ofw_isa_range_map(sc->sc_range, sc->sc_nrange, - &start, &end, &ridx); + res = NULL; + if ((sc->sc_flags & EBUS_PCI) != 0) { + /* + * Map EBus ranges to PCI ranges. This may include + * changing the allocation type. + */ + (void)ofw_isa_range_map(sc->sc_range, sc->sc_nrange, + &start, &end, &ridx); + ri = &sc->sc_rinfo[ridx]; + res = rman_reserve_resource(&ri->eri_rman, start, end, + count, flags, child); + if (res == NULL) + return (NULL); + rman_set_rid(res, *rid); + bt = rman_get_bustag(ri->eri_res); + rman_set_bustag(res, bt); + rv = bus_space_subregion(bt, + rman_get_bushandle(ri->eri_res), + rman_get_start(res) - rman_get_start(ri->eri_res), + count, &bh); + if (rv != 0) { + rman_release_resource(res); + return (NULL); + } + rman_set_bushandle(res, bh); + } else { + /* Map EBus ranges to nexus ranges. */ + for (i = 0; i < sc->sc_nrange; i++) { + enr = &((struct ebus_nexus_ranges *) + sc->sc_range)[i]; + cstart = (((uint64_t)enr->child_hi) << 32) | + enr->child_lo; + cend = cstart + enr->size - 1; + if (start >= cstart && end <= cend) { + offset = + (((uint64_t)enr->phys_hi) << 32) | + enr->phys_lo; + start += offset - cstart; + end += offset - cstart; + res = bus_generic_alloc_resource(bus, + child, type, rid, start, end, + count, flags); + break; + } + } - ri = &sc->sc_rinfo[ridx]; - res = rman_reserve_resource(&ri->eri_rman, start, end, count, - flags, child); - if (res == NULL) - return (NULL); - rman_set_rid(res, *rid); - bt = rman_get_bustag(ri->eri_res); - rman_set_bustag(res, bt); - rv = bus_space_subregion(bt, rman_get_bushandle(ri->eri_res), - rman_get_start(res) - rman_get_start(ri->eri_res), count, - &bh); - if (rv != 0) { - rman_release_resource(res); - return (NULL); } - rman_set_bushandle(res, bh); if (!passthrough) rle->res = res; return (res); @@ -335,34 +486,77 @@ static int ebus_release_resource(device_t bus, device_t child, int type, int rid, struct resource *res) { + struct ebus_softc *sc; struct resource_list *rl; struct resource_list_entry *rle; - int passthrough = (device_get_parent(child) != bus); - int rv; + int passthrough, rv; + passthrough = (device_get_parent(child) != bus); rl = BUS_GET_RESOURCE_LIST(bus, child); switch (type) { case SYS_RES_MEMORY: + sc = device_get_softc(bus); + if ((sc->sc_flags & EBUS_PCI) == 0) + return (resource_list_release(rl, bus, child, type, + rid, res)); if ((rv = rman_release_resource(res)) != 0) return (rv); if (!passthrough) { rle = resource_list_find(rl, type, rid); - KASSERT(rle != NULL, ("ebus_release_resource: " - "resource entry not found!")); - KASSERT(rle->res != NULL, ("ebus_alloc_resource: " - "resource entry is not busy")); + KASSERT(rle != NULL, + ("%s: resource entry not found!", __func__)); + KASSERT(rle->res != NULL, + ("%s: resource entry is not busy", __func__)); rle->res = NULL; } break; case SYS_RES_IRQ: return (resource_list_release(rl, bus, child, type, rid, res)); default: - panic("ebus_release_resource: unsupported resource type %d", - type); + panic("%s: unsupported resource type %d", __func__, type); } return (0); } +static int +ebus_setup_intr(device_t dev, device_t child, struct resource *ires, + int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, + void **cookiep) +{ +#ifndef SUN4V + struct ebus_softc *sc; + u_long vec; + + sc = device_get_softc(dev); + if ((sc->sc_flags & EBUS_PCI) == 0) { + /* + * Make sure the vector is fully specified. This isn't + * necessarily the case with the PCI variant. + */ + vec = rman_get_start(ires); + if (INTIGN(vec) != sc->sc_ign) { + device_printf(dev, + "invalid interrupt vector 0x%lx\n", vec); + return (EINVAL); + } + + /* + * As we rely on the interrupt controllers of the + * accompanying PCI-Express bridge ensure at least + * something is registered for this vector. + */ + if (intr_vectors[vec].iv_ic == NULL) { + device_printf(dev, + "invalid interrupt controller for vector 0x%lx\n", + vec); + return (EINVAL); + } + } +#endif + return (bus_generic_setup_intr(dev, child, ires, flags, filt, intr, + arg, cookiep)); +} + static struct resource_list * ebus_get_resource_list(device_t dev, device_t child) { @@ -384,12 +578,13 @@ ebus_get_devinfo(device_t bus, device_t dev) static struct ebus_devinfo * ebus_setup_dinfo(device_t dev, struct ebus_softc *sc, phandle_t node) { + struct isa_regs reg, *regs; + ofw_isa_intr_t intr, *intrs; struct ebus_devinfo *edi; - struct isa_regs *reg; - ofw_isa_intr_t *intrs; - ofw_pci_intr_t rintr; - u_int64_t start; - int nreg, nintr, i; + uint64_t start; + uint32_t rintr; + int i, nintr, nreg, rv; + uint8_t maskbuf[sizeof(reg) + sizeof(intr)]; edi = malloc(sizeof(*edi), M_DEVBUF, M_ZERO | M_WAITOK); if (ofw_bus_gen_setup_devinfo(&edi->edi_obdinfo, node) != 0) { @@ -397,40 +592,51 @@ ebus_setup_dinfo(device_t dev, struct ebus_softc *sc, phandle_t node) return (NULL); } resource_list_init(&edi->edi_rl); - nreg = OF_getprop_alloc(node, "reg", sizeof(*reg), (void **)®); + nreg = OF_getprop_alloc(node, "reg", sizeof(*regs), (void **)®s); if (nreg == -1) { device_printf(dev, "<%s>: incomplete\n", edi->edi_obdinfo.obd_name); - goto fail; + ebus_destroy_dinfo(edi); + return (NULL); } for (i = 0; i < nreg; i++) { - start = ISA_REG_PHYS(reg + i); - resource_list_add(&edi->edi_rl, SYS_RES_MEMORY, i, - start, start + reg[i].size - 1, reg[i].size); + start = ISA_REG_PHYS(regs + i); + (void)resource_list_add(&edi->edi_rl, SYS_RES_MEMORY, i, + start, start + regs[i].size - 1, regs[i].size); } - free(reg, M_OFWPROP); + free(regs, M_OFWPROP); nintr = OF_getprop_alloc(node, "interrupts", sizeof(*intrs), (void **)&intrs); + if (nintr == -1) + return (edi); for (i = 0; i < nintr; i++) { - rintr = ofw_isa_route_intr(dev, node, &sc->sc_iinfo, intrs[i]); - if (rintr == PCI_INVALID_IRQ) { + rv = 0; + if ((sc->sc_flags & EBUS_PCI) != 0) { + rintr = ofw_isa_route_intr(dev, node, &sc->sc_iinfo, + intrs[i]); + } else { + intr = intrs[i]; + rv = ofw_bus_lookup_imap(node, &sc->sc_iinfo, ®, + sizeof(reg), &intr, sizeof(intr), &rintr, + sizeof(rintr), maskbuf); +#ifndef SUN4V + if (rv != 0) + rintr = INTMAP_VEC(sc->sc_ign, rintr); +#endif + } + if ((sc->sc_flags & EBUS_PCI) == 0 ? rv == 0 : + rintr == PCI_INVALID_IRQ) { device_printf(dev, "<%s>: could not map EBus interrupt %d\n", edi->edi_obdinfo.obd_name, intrs[i]); - free(intrs, M_OFWPROP); - goto fail; + continue; } - resource_list_add(&edi->edi_rl, SYS_RES_IRQ, i, - rintr, rintr, 1); + (void)resource_list_add(&edi->edi_rl, SYS_RES_IRQ, i, rintr, + rintr, 1); } free(intrs, M_OFWPROP); - return (edi); - -fail: - ebus_destroy_dinfo(edi); - return (NULL); } static void diff --git a/sys/sparc64/ebus/epic.c b/sys/sparc64/ebus/epic.c new file mode 100644 index 000000000000..8c20e9402283 --- /dev/null +++ b/sys/sparc64/ebus/epic.c @@ -0,0 +1,216 @@ +/*- + * Copyright (c) 2009 Marius Strobl + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#define EPIC_DELAY 10000 + +#define EPIC_NREG 1 +#define EPIC_FW_LED 0 + +#define EPIC_FW_LED_DATA 0x40 +#define EPIC_FW_LED_ADDR 0x41 +#define EPIC_FW_LED_WRITE_MASK 0x80 + +#define EPIC_FW_VERSION 0x05 +#define EPIC_LED_STATE0 0x06 + +#define EPIC_LED_ALERT_MASK 0x0c +#define EPIC_LED_ALERT_OFF 0x00 +#define EPIC_LED_ALERT_ON 0x04 + +#define EPIC_LED_POWER_MASK 0x30 +#define EPIC_LED_POWER_OFF 0x00 +#define EPIC_LED_POWER_ON 0x10 +#define EPIC_LED_POWER_SB_BLINK 0x20 +#define EPIC_LED_POWER_FAST_BLINK 0x30 + +static struct resource_spec epic_res_spec[] = { + { SYS_RES_MEMORY, EPIC_FW_LED, RF_ACTIVE }, + { -1, 0 } +}; + +struct epic_softc { + struct mtx sc_mtx; + struct resource *sc_res[EPIC_NREG]; + struct cdev *sc_led_dev_alert; + struct cdev *sc_led_dev_power; +}; + +#define EPIC_FW_LED_READ(sc, off) ({ \ + uint8_t __val; \ + bus_write_1((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_ADDR, (off));\ + bus_barrier((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_ADDR, 1, \ + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); \ + DELAY(EPIC_DELAY); \ + __val = bus_read_1((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_DATA);\ + bus_barrier((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_DATA, 1, \ + BUS_SPACE_BARRIER_READ); \ + DELAY(EPIC_DELAY); \ + __val; \ +}) + +#define EPIC_FW_LED_WRITE(sc, off, mask, val) do { \ + bus_write_1((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_ADDR, (off));\ + bus_barrier((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_ADDR, 1, \ + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); \ + DELAY(EPIC_DELAY); \ + bus_write_1((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_WRITE_MASK, \ + (mask)); \ + bus_barrier((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_WRITE_MASK, \ + 1, BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); \ + DELAY(EPIC_DELAY); \ + bus_write_1((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_DATA, (val));\ + bus_barrier((sc)->sc_res[EPIC_FW_LED], EPIC_FW_LED_DATA, 1, \ + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); \ + DELAY(EPIC_DELAY); \ +} while (0) + +#define EPIC_LOCK_INIT(sc) \ + mtx_init(&(sc)->sc_mtx, "epic mtx", NULL, MTX_DEF) +#define EPIC_LOCK_DESTROY(sc) mtx_destroy(&(sc)->sc_mtx) +#define EPIC_LOCK(sc) mtx_lock(&(sc)->sc_mtx) +#define EPIC_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) + +static device_probe_t epic_probe; +static device_attach_t epic_attach; +static device_detach_t epic_detach; + +static void epic_led_alert(void *arg, int onoff); +static void epic_led_power(void *arg, int onoff); + +static device_method_t epic_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, epic_probe), + DEVMETHOD(device_attach, epic_attach), + DEVMETHOD(device_detach, epic_detach), + + KOBJMETHOD_END +}; + +static devclass_t epic_devclass; + +DEFINE_CLASS_0(epic, epic_driver, epic_methods, + sizeof(struct epic_softc)); +DRIVER_MODULE(epic, ebus, epic_driver, epic_devclass, 0, 0); + +static int +epic_probe(device_t dev) +{ + const char* compat; + + compat = ofw_bus_get_compat(dev); + if (compat != NULL && strcmp(ofw_bus_get_name(dev), + "env-monitor") == 0 && strcmp(compat, "epic") == 0) { + device_set_desc(dev, "Sun Fire V215/V245 LEDs"); + return (BUS_PROBE_DEFAULT); + } + return (ENXIO); +} + +static int +epic_attach(device_t dev) +{ + struct epic_softc *sc; + + sc = device_get_softc(dev); + if (bus_alloc_resources(dev, epic_res_spec, sc->sc_res)) { + device_printf(dev, "failed to allocate resources\n"); + bus_release_resources(dev, epic_res_spec, sc->sc_res); + return (ENXIO); + } + + EPIC_LOCK_INIT(sc); + + if (bootverbose) + device_printf(dev, "version 0x%x\n", + EPIC_FW_LED_READ(sc, EPIC_FW_VERSION)); + + sc->sc_led_dev_alert = led_create(epic_led_alert, sc, "alert"); + sc->sc_led_dev_power = led_create(epic_led_power, sc, "power"); + + return (0); +} + +static int +epic_detach(device_t dev) +{ + struct epic_softc *sc; + + sc = device_get_softc(dev); + + led_destroy(sc->sc_led_dev_alert); + led_destroy(sc->sc_led_dev_power); + + bus_release_resources(dev, epic_res_spec, sc->sc_res); + + EPIC_LOCK_DESTROY(sc); + + return (0); +} + +static void +epic_led_alert(void *arg, int onoff) +{ + struct epic_softc *sc; + + sc = (struct epic_softc *)arg; + + EPIC_LOCK(sc); + EPIC_FW_LED_WRITE(sc, EPIC_LED_STATE0, EPIC_LED_ALERT_MASK, + onoff ? EPIC_LED_ALERT_ON : EPIC_LED_ALERT_OFF); + EPIC_UNLOCK(sc); +} + +static void +epic_led_power(void *arg, int onoff) +{ + struct epic_softc *sc; + + sc = (struct epic_softc *)arg; + + EPIC_LOCK(sc); + EPIC_FW_LED_WRITE(sc, EPIC_LED_STATE0, EPIC_LED_POWER_MASK, + onoff ? EPIC_LED_POWER_ON : EPIC_LED_POWER_OFF); + EPIC_UNLOCK(sc); +} diff --git a/sys/sparc64/fhc/fhc.c b/sys/sparc64/fhc/fhc.c index 91416ec8431c..6aefffa1a6f9 100644 --- a/sys/sparc64/fhc/fhc.c +++ b/sys/sparc64/fhc/fhc.c @@ -119,9 +119,12 @@ static driver_t fhc_driver = { static devclass_t fhc_devclass; -DRIVER_MODULE(fhc, central, fhc_driver, fhc_devclass, 0, 0); -DRIVER_MODULE(fhc, nexus, fhc_driver, fhc_devclass, 0, 0); +EARLY_DRIVER_MODULE(fhc, central, fhc_driver, fhc_devclass, 0, 0, + BUS_PASS_BUS); MODULE_DEPEND(fhc, central, 1, 1, 1); +EARLY_DRIVER_MODULE(fhc, nexus, fhc_driver, fhc_devclass, 0, 0, + BUS_PASS_BUS); +MODULE_DEPEND(fhc, nexus, 1, 1, 1); MODULE_VERSION(fhc, 1); static const struct intr_controller fhc_ic = { diff --git a/sys/sparc64/include/asi.h b/sys/sparc64/include/asi.h index 93713783011a..90dc3f394e18 100644 --- a/sys/sparc64/include/asi.h +++ b/sys/sparc64/include/asi.h @@ -33,7 +33,7 @@ #define _MACHINE_ASI_H_ /* - * Standard v9 asis + * Standard v9 ASIs */ #define ASI_N 0x4 #define ASI_NL 0xc @@ -51,7 +51,7 @@ #define ASI_SNFL 0x8b /* - * UltraSPARC extensions. ASIs limited to a certain family are annotated. + * UltraSPARC extensions - ASIs limited to a certain family are annotated. */ #define ASI_PHYS_USE_EC 0x14 #define ASI_PHYS_BYPASS_EC_WITH_EBIT 0x15 @@ -91,9 +91,12 @@ #define ASI_INTR_RECEIVE 0x49 #define ASI_UPA_CONFIG_REG 0x4a /* US-I, II */ -#define ASI_FIREPLANE_CONFIG_REG 0x4a /* US-III Cu */ -#define AA_FIREPLANE_CONFIG 0x0 /* US-III Cu */ -#define AA_FIREPLANE_ADDRESS 0x8 /* US-III Cu */ +#define ASI_FIREPLANE_CONFIG_REG 0x4a /* US-III{,+}, IV{,+} */ +#define AA_FIREPLANE_CONFIG 0x0 /* US-III{,+}, IV{,+} */ +#define AA_FIREPLANE_ADDRESS 0x8 /* US-III{,+}, IV{,+} */ +#define AA_FIREPLANE_CONFIG_2 0x10 /* US-IV{,+} */ + +#define ASI_JBUS_CONFIG_REG 0x4a /* US-IIIi{,+} */ #define ASI_ESTATE_ERROR_EN_REG 0x4b #define AA_ESTATE_CEEN 0x1 @@ -153,6 +156,11 @@ #define ASI_IIU_INST_TRAP 0x60 /* US-III family */ +#define ASI_INTR_ID 0x63 /* US-IV{,+} */ +#define AA_INTR_ID 0x0 /* US-IV{,+} */ +#define AA_CORE_ID 0x10 /* US-IV{,+} */ +#define AA_CESR_ID 0x40 /* US-IV{,+} */ + #define ASI_ICACHE_INSTR 0x66 #define ASI_ICACHE_TAG 0x67 #define ASI_ICACHE_SNOOP_TAG 0x68 /* US-III family */ @@ -179,7 +187,7 @@ /* * With the advent of the US-III, the numbering has changed, as additional - * registers were inserted in between. We retain the original ordering for + * registers were inserted in between. We retain the original ordering for * now, and append an A to the inserted registers. * Exceptions are AA_SDB_INTR_D6 and AA_SDB_INTR_D7, which were appended * at the end. diff --git a/sys/sparc64/include/asmacros.h b/sys/sparc64/include/asmacros.h index a0e317b218e4..6d19a097f614 100644 --- a/sys/sparc64/include/asmacros.h +++ b/sys/sparc64/include/asmacros.h @@ -107,7 +107,7 @@ #ifdef INVARIANTS #define KASSERT(r1, msg) \ - brnz r1, 8f ; \ + brnz,pt r1, 8f ; \ nop ; \ PANIC(msg, r1) ; \ 8: diff --git a/sys/sparc64/include/bus_common.h b/sys/sparc64/include/bus_common.h index e2ea4e9984b4..f04eb7f5b4cb 100644 --- a/sys/sparc64/include/bus_common.h +++ b/sys/sparc64/include/bus_common.h @@ -39,18 +39,22 @@ #ifndef _MACHINE_BUS_COMMON_H_ #define _MACHINE_BUS_COMMON_H_ -#define INTMAP_V 0x080000000LL /* Interrupt valid (enabled) */ -#define INTMAP_TID_MASK 0x07c000000LL /* UPA target ID */ +#define INTCLR_PENDING 0x000000003ULL /* Interrupt queued to CPU */ +#define INTCLR_RECEIVED 0x000000001ULL /* Interrupt received */ +#define INTCLR_IDLE 0x000000000ULL /* Interrupt idle */ + +#define INTMAP_V 0x080000000ULL /* Interrupt valid (enabled) */ +#define INTMAP_TID_MASK 0x07c000000ULL /* UPA target ID */ #define INTMAP_TID_SHIFT 26 -#define INTMAP_IGN_MASK 0x0000007c0LL /* Interrupt group no. */ +#define INTMAP_IGN_MASK 0x0000007c0ULL /* Interrupt group no. */ #define INTMAP_IGN_SHIFT 6 -#define INTMAP_INO_MASK 0x00000003fLL /* Interrupt number */ +#define INTMAP_INO_MASK 0x00000003fULL /* Interrupt number */ #define INTMAP_INR_MASK (INTMAP_IGN_MASK | INTMAP_INO_MASK) -#define INTMAP_SBUSSLOT_MASK 0x000000018LL /* SBus slot # */ -#define INTMAP_PCIBUS_MASK 0x000000010LL /* PCI bus number (A or B) */ -#define INTMAP_PCISLOT_MASK 0x00000000cLL /* PCI slot # */ -#define INTMAP_PCIINT_MASK 0x000000003LL /* PCI interrupt #A,#B,#C,#D */ -#define INTMAP_OBIO_MASK 0x000000020LL /* Onboard device */ +#define INTMAP_SBUSSLOT_MASK 0x000000018ULL /* SBus slot # */ +#define INTMAP_PCIBUS_MASK 0x000000010ULL /* PCI bus number (A or B) */ +#define INTMAP_PCISLOT_MASK 0x00000000cULL /* PCI slot # */ +#define INTMAP_PCIINT_MASK 0x000000003ULL /* PCI interrupt #A,#B,#C,#D */ +#define INTMAP_OBIO_MASK 0x000000020ULL /* Onboard device */ #define INTIGN(x) (((x) & INTMAP_IGN_MASK) >> INTMAP_IGN_SHIFT) #define INTVEC(x) ((x) & INTMAP_INR_MASK) #define INTSLOT(x) (((x) >> 3) & 0x7) @@ -60,9 +64,9 @@ (INTMAP_TID((mr), (mid)) | INTMAP_V) #define INTMAP_TID(mr, mid) \ (((mr) & ~INTMAP_TID_MASK) | ((mid) << INTMAP_TID_SHIFT)) -#define INTMAP_VEC(ign, inr) \ +#define INTMAP_VEC(ign, ino) \ ((((ign) << INTMAP_IGN_SHIFT) & INTMAP_IGN_MASK) | \ - ((inr) & INTMAP_INR_MASK)) + ((ino) & INTMAP_INO_MASK)) /* counter-timer support. */ void sparc64_counter_init(const char *name, bus_space_tag_t tag, diff --git a/sys/sparc64/include/cache.h b/sys/sparc64/include/cache.h index 9dd71914a1b8..9c4804b97764 100644 --- a/sys/sparc64/include/cache.h +++ b/sys/sparc64/include/cache.h @@ -91,7 +91,7 @@ struct cacheinfo { struct pcpu; -typedef void cache_enable_t(void); +typedef void cache_enable_t(u_int cpu_impl); typedef void cache_flush_t(void); typedef void dcache_page_inval_t(vm_paddr_t pa); typedef void icache_page_inval_t(vm_paddr_t pa); diff --git a/sys/sparc64/include/cmt.h b/sys/sparc64/include/cmt.h new file mode 100644 index 000000000000..cdeed29c61ca --- /dev/null +++ b/sys/sparc64/include/cmt.h @@ -0,0 +1,39 @@ +/*- + * Copyright (c) 2010 Marius Strobl + * 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$ + */ + +#ifndef _MACHINE_CMT_H_ +#define _MACHINE_CMT_H_ + +#define INTR_ID_ID_SHIFT (0) +#define INTR_ID_ID_SIZE (10) +#define INTR_ID_ID_MASK \ + (((1 << INTR_ID_ID_SIZE) - 1) << INTR_ID_ID_SHIFT) + +#define INTR_ID_GET_ID(cr) ((cr & INTR_ID_ID_MASK) >> INTR_ID_ID_SHIFT) + +#endif /* _MACHINE_CMT_H_ */ diff --git a/sys/sparc64/include/cpu.h b/sys/sparc64/include/cpu.h index b593f13ce9bf..c0845a0771b1 100644 --- a/sys/sparc64/include/cpu.h +++ b/sys/sparc64/include/cpu.h @@ -52,7 +52,7 @@ extern char btext[]; extern char etext[]; -void cheetah_init(void); +void cheetah_init(u_int cpu_impl); void cpu_halt(void); void cpu_reset(void); void fork_trampoline(void); diff --git a/sys/sparc64/include/elf.h b/sys/sparc64/include/elf.h index c0fcbee5ecd6..2a666705d0f8 100644 --- a/sys/sparc64/include/elf.h +++ b/sys/sparc64/include/elf.h @@ -97,4 +97,6 @@ __ElfType(Auxinfo); #define ELF_TARG_MACH ELF_ARCH #define ELF_TARG_VER 1 +#define ET_DYN_LOAD_ADDR 0x100000 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/sparc64/include/fireplane.h b/sys/sparc64/include/fireplane.h new file mode 100644 index 000000000000..83489545d40f --- /dev/null +++ b/sys/sparc64/include/fireplane.h @@ -0,0 +1,40 @@ +/*- + * Copyright (c) 2010 Marius Strobl + * 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$ + */ + +#ifndef _MACHINE_FIREPLANE_H_ +#define _MACHINE_FIREPLANE_H_ + +#define FIREPLANE_CR_AID_SHIFT (17) +#define FIREPLANE_CR_AID_SIZE (10) +#define FIREPLANE_CR_AID_MASK \ + (((1 << FIREPLANE_CR_AID_SIZE) - 1) << FIREPLANE_CR_AID_SHIFT) + +#define FIREPLANE_CR_GET_AID(cr) \ + ((cr & FIREPLANE_CR_AID_MASK) >> FIREPLANE_CR_AID_SHIFT) + +#endif /* _MACHINE_FIREPLANE_H_ */ diff --git a/sys/sparc64/include/in_cksum.h b/sys/sparc64/include/in_cksum.h index c754d8b1b01b..ae06a4cb9972 100644 --- a/sys/sparc64/include/in_cksum.h +++ b/sys/sparc64/include/in_cksum.h @@ -164,6 +164,8 @@ in_cksum_hdr(struct ip *ip) return (__ret); } +#ifdef _KERNEL u_short in_cksum_skip(struct mbuf *m, int len, int skip); +#endif #endif /* _MACHINE_IN_CKSUM_H_ */ diff --git a/sys/sparc64/include/intr_machdep.h b/sys/sparc64/include/intr_machdep.h index ef24d187ae18..46a619693892 100644 --- a/sys/sparc64/include/intr_machdep.h +++ b/sys/sparc64/include/intr_machdep.h @@ -93,6 +93,7 @@ extern struct intr_vector intr_vectors[]; void intr_add_cpu(u_int cpu); #endif int intr_bind(int vec, u_char cpu); +int intr_describe(int vec, void *ih, const char *descr); void intr_setup(int level, ih_func_t *ihf, int pri, iv_func_t *ivf, void *iva); void intr_init1(void); diff --git a/sys/sparc64/include/iommureg.h b/sys/sparc64/include/iommureg.h index 6032ac585a65..f4d0349903ea 100644 --- a/sys/sparc64/include/iommureg.h +++ b/sys/sparc64/include/iommureg.h @@ -37,17 +37,20 @@ */ #ifndef _MACHINE_IOMMUREG_H_ -#define _MACHINE_IOMMUREG_H_ +#define _MACHINE_IOMMUREG_H_ /* * UltraSPARC IOMMU registers, common to both the PCI and SBus * controllers. */ -/* iommmu registers */ +/* IOMMU registers */ #define IMR_CTL 0x0000 /* IOMMU control register */ #define IMR_TSB 0x0008 /* IOMMU TSB base register */ #define IMR_FLUSH 0x0010 /* IOMMU flush register */ +/* The TTE Cache is Fire and Oberon only. */ +#define IMR_CACHE_FLUSH 0x0100 /* IOMMU TTE cache flush address register */ +#define IMR_CACHE_INVAL 0x0108 /* IOMMU TTE cache invalidate register */ /* streaming buffer registers */ #define ISR_CTL 0x0000 /* streaming buffer control reg */ @@ -61,35 +64,64 @@ #define ISD_LN_TAG_DIAG 0x0900 /* streaming buffer line tag diag 0..15 */ /* streaming buffer control register */ -#define STRBUF_EN 0x0000000000000001UL -#define STRBUF_D 0x0000000000000002UL -#define STRBUF_RR_DIS 0x0000000000000004UL +#define STRBUF_EN 0x0000000000000001UL +#define STRBUF_D 0x0000000000000002UL +#define STRBUF_RR_DIS 0x0000000000000004UL #define IOMMU_MAXADDR(bits) ((1UL << (bits)) - 1) /* * control register bits */ -/* Nummber of entries in IOTSB */ +/* Nummber of entries in the IOTSB - pre-Fire only */ +#define IOMMUCR_TSBSZ_MASK 0x0000000000070000UL #define IOMMUCR_TSBSZ_SHIFT 16 -#define IOMMUCR_TSB1K 0x0000000000000000UL -#define IOMMUCR_TSB2K 0x0000000000010000UL -#define IOMMUCR_TSB4K 0x0000000000020000UL -#define IOMMUCR_TSB8K 0x0000000000030000UL -#define IOMMUCR_TSB16K 0x0000000000040000UL -#define IOMMUCR_TSB32K 0x0000000000050000UL -#define IOMMUCR_TSB64K 0x0000000000060000UL -#define IOMMUCR_TSB128K 0x0000000000070000UL -/* Mask for above */ -#define IOMMUCR_TSBMASK 0xfffffffffff8ffffUL -/* 8K iommu page size */ -#define IOMMUCR_8KPG 0x0000000000000000UL -/* 64K iommu page size */ -#define IOMMUCR_64KPG 0x0000000000000004UL -/* Diag enable */ -#define IOMMUCR_DE 0x0000000000000002UL -/* Enable IOMMU */ -#define IOMMUCR_EN 0x0000000000000001UL +/* TSB cache snoop enable */ +#define IOMMUCR_SE 0x0000000000000400UL +/* Cache modes - Fire and Oberon */ +#define IOMMUCR_CM_NC_TLB_TBW 0x0000000000000000UL +#define IOMMUCR_CM_LC_NTLB_NTBW 0x0000000000000100UL +#define IOMMUCR_CM_LC_TLB_TBW 0x0000000000000200UL +#define IOMMUCR_CM_C_TLB_TBW 0x0000000000000300UL +/* IOMMU page size - pre-Fire only */ +#define IOMMUCR_8KPG 0x0000000000000000UL +#define IOMMUCR_64KPG 0x0000000000000004UL +/* Bypass enable - Fire and Oberon */ +#define IOMMUCR_BE 0x0000000000000002UL +/* Diagnostic mode enable - pre-Fire only */ +#define IOMMUCR_DE 0x0000000000000002UL +/* IOMMU/translation enable */ +#define IOMMUCR_EN 0x0000000000000001UL + +/* + * TSB base register bits + */ + /* TSB base address */ +#define IOMMUTB_TB_MASK 0x000007ffffffe000UL +#define IOMMUTB_TB_SHIFT 13 +/* IOMMU page size - Fire and Oberon */ +#define IOMMUTB_8KPG 0x0000000000000000UL +#define IOMMUTB_64KPG 0x0000000000000100UL +/* Nummber of entries in the IOTSB - Fire and Oberon */ +#define IOMMUTB_TSBSZ_MASK 0x0000000000000004UL +#define IOMMUTB_TSBSZ_SHIFT 0 + +/* + * TSB size definitions for both control and TSB base register */ +#define IOMMU_TSB1K 0 +#define IOMMU_TSB2K 1 +#define IOMMU_TSB4K 2 +#define IOMMU_TSB8K 3 +#define IOMMU_TSB16K 4 +#define IOMMU_TSB32K 5 +#define IOMMU_TSB64K 6 +#define IOMMU_TSB128K 7 +/* Fire and Oberon */ +#define IOMMU_TSB256K 8 +/* Fire and Oberon */ +#define IOMMU_TSB512K 9 +#define IOMMU_TSBENTRIES(tsbsz) \ + ((1 << (tsbsz)) << (IO_PAGE_SHIFT - IOTTE_SHIFT)) /* * Diagnostic register definitions @@ -97,9 +129,9 @@ #define IOMMU_DTAG_VPNBITS 19 #define IOMMU_DTAG_VPNMASK ((1 << IOMMU_DTAG_VPNBITS) - 1) #define IOMMU_DTAG_VPNSHIFT 13 -#define IOMMU_DTAG_ERRBITS 3 +#define IOMMU_DTAG_ERRBITS 3 #define IOMMU_DTAG_ERRSHIFT 22 -#define IOMMU_DTAG_ERRMASK \ +#define IOMMU_DTAG_ERRMASK \ (((1 << IOMMU_DTAG_ERRBITS) - 1) << IOMMU_DTAG_ERRSHIFT) #define IOMMU_DDATA_PGBITS 21 @@ -113,19 +145,19 @@ */ /* Entry valid */ #define IOTTE_V 0x8000000000000000UL -/* 8K or 64K page? */ -#define IOTTE_64K 0x2000000000000000UL -#define IOTTE_8K 0x0000000000000000UL -/* Is page streamable? */ -#define IOTTE_STREAM 0x1000000000000000UL -/* Accesses to same bus segment? */ +/* Page size - pre-Fire only */ +#define IOTTE_64K 0x2000000000000000UL +#define IOTTE_8K 0x0000000000000000UL +/* Streamable page - streaming buffer equipped variants only */ +#define IOTTE_STREAM 0x1000000000000000UL +/* Accesses to the same bus segment - SBus only */ #define IOTTE_LOCAL 0x0800000000000000UL -/* Let's assume this is correct */ -#define IOTTE_PAMASK 0x000007ffffffe000UL -/* Accesses to cacheable space */ -#define IOTTE_C 0x0000000000000010UL +/* Physical address mask (based on Oberon) */ +#define IOTTE_PAMASK 0x00007fffffffe000UL +/* Accesses to cacheable space - pre-Fire only */ +#define IOTTE_C 0x0000000000000010UL /* Writeable */ -#define IOTTE_W 0x0000000000000002UL +#define IOTTE_W 0x0000000000000002UL /* log2 of the IOMMU TTE size */ #define IOTTE_SHIFT 3 @@ -167,14 +199,14 @@ */ #define IOTSB_BASESZ (1024 << IOTTE_SHIFT) -#define IOTSB_VEND (~IO_PAGE_MASK) -#define IOTSB_VSTART(sz) (u_int)(IOTSB_VEND << ((sz) + 10)) +#define IOTSB_VEND (~IO_PAGE_MASK) +#define IOTSB_VSTART(sz) (u_int)(IOTSB_VEND << ((sz) + 10)) -#define MAKEIOTTE(pa,w,c,s) \ +#define MAKEIOTTE(pa, w, c, s) \ (((pa) & IOTTE_PAMASK) | ((w) ? IOTTE_W : 0) | \ ((c) ? IOTTE_C : 0) | ((s) ? IOTTE_STREAM : 0) | \ (IOTTE_V | IOTTE_8K)) -#define IOTSBSLOT(va) \ +#define IOTSBSLOT(va) \ ((u_int)(((vm_offset_t)(va)) - (is->is_dvmabase)) >> IO_PAGE_SHIFT) #endif /* !_MACHINE_IOMMUREG_H_ */ diff --git a/sys/sparc64/include/iommuvar.h b/sys/sparc64/include/iommuvar.h index 5904f046a2a1..1ef4e0bd0aee 100644 --- a/sys/sparc64/include/iommuvar.h +++ b/sys/sparc64/include/iommuvar.h @@ -66,10 +66,10 @@ struct iommu_state { int is_tsbsize; /* (r) 0 = 8K, ... */ uint64_t is_pmaxaddr; /* (r) max. physical address */ uint64_t is_dvmabase; /* (r) */ - int64_t is_cr; /* (r) Control reg value */ + uint64_t is_cr; /* (r) Control reg value */ vm_paddr_t is_flushpa[2]; /* (r) */ - volatile int64_t *is_flushva[2]; /* (r, *i) */ + volatile uint64_t *is_flushva[2]; /* (r, *i) */ /* * (i) * When a flush is completed, 64 bytes will be stored at the given @@ -99,11 +99,14 @@ struct iommu_state { /* behavior flags */ u_int is_flags; /* (r) */ #define IOMMU_RERUN_DISABLE (1 << 0) +#define IOMMU_FIRE (1 << 1) +#define IOMMU_FLUSH_CACHE (1 << 2) +#define IOMMU_PRESERVE_PROM (1 << 3) }; /* interfaces for PCI/SBus code */ -void iommu_init(const char *name, struct iommu_state *is, int tsbsize, - uint32_t iovabase, int resvpg); +void iommu_init(const char *name, struct iommu_state *is, u_int tsbsize, + uint32_t iovabase, u_int resvpg); void iommu_reset(struct iommu_state *is); void iommu_decode_fault(struct iommu_state *is, vm_offset_t phys); diff --git a/sys/sparc64/include/jbus.h b/sys/sparc64/include/jbus.h new file mode 100644 index 000000000000..09c93b4c6354 --- /dev/null +++ b/sys/sparc64/include/jbus.h @@ -0,0 +1,39 @@ +/*- + * Copyright (c) 2010 Marius Strobl + * 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$ + */ + +#ifndef _MACHINE_JBUS_H_ +#define _MACHINE_JBUS_H_ + +#define JBUS_CR_JID_SHIFT (17) +#define JBUS_CR_JID_SIZE (3) +#define JBUS_CR_JID_MASK \ + (((1 << JBUS_CR_JID_SIZE) - 1) << JBUS_CR_JID_SHIFT) + +#define JBUS_CR_GET_JID(cr) ((cr & JBUS_CR_JID_MASK) >> JBUS_CR_JID_SHIFT) + +#endif /* _MACHINE_JBUS_H_ */ diff --git a/sys/sparc64/include/ktr.h b/sys/sparc64/include/ktr.h index 0b7e96a50eec..5948ba29fb3e 100644 --- a/sys/sparc64/include/ktr.h +++ b/sys/sparc64/include/ktr.h @@ -34,11 +34,9 @@ #include -#include - #ifndef LOCORE -#define KTR_CPU UPA_CR_GET_MID(ldxa(0, ASI_UPA_CONFIG_REG)) +#define KTR_CPU PCPU_GET(mid) #else @@ -74,7 +72,7 @@ l2: add r2, 1, r3 ; \ add r1, r2, r1 ; \ rd %tick, r2 ; \ stx r2, [r1 + KTR_TIMESTAMP] ; \ - UPA_GET_MID(r2) ; \ + lduw [PCPU(MID)], r2 ; \ stw r2, [r1 + KTR_CPU] ; \ stw %g0, [r1 + KTR_LINE] ; \ stx %g0, [r1 + KTR_FILE] ; \ @@ -84,7 +82,7 @@ l2: add r2, 1, r3 ; \ #define CATR(mask, desc, r1, r2, r3, l1, l2, l3) \ set mask, r1 ; \ TEST(ktr_mask, r1, r2, r2, l3) ; \ - UPA_GET_MID(r1) ; \ + lduw [PCPU(MID)], r1 ; \ mov 1, r2 ; \ sllx r2, r1, r1 ; \ TEST(ktr_cpumask, r1, r2, r3, l3) ; \ diff --git a/sys/sparc64/include/md_var.h b/sys/sparc64/include/md_var.h index 69c6d698c5fb..a1f39807b8c3 100644 --- a/sys/sparc64/include/md_var.h +++ b/sys/sparc64/include/md_var.h @@ -47,6 +47,8 @@ extern vm_paddr_t kstack0_phys; struct pcpu; struct md_utrap; +const char *cpu_cpuid_prop(u_int cpu_impl); +uint32_t cpu_get_mid(u_int cpu_impl); void cpu_identify(u_long vers, u_int clock, u_int id); void cpu_setregs(struct pcpu *pc); int is_physical_memory(vm_paddr_t addr); diff --git a/sys/sparc64/include/nexusvar.h b/sys/sparc64/include/nexusvar.h new file mode 100644 index 000000000000..94c770c56500 --- /dev/null +++ b/sys/sparc64/include/nexusvar.h @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2010 Marius Strobl + * 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$ + */ + +#ifndef _MACHINE_NEXUSVAR_H_ +#define _MACHINE_NEXUSVAR_H_ + +DECLARE_CLASS(nexus_driver); + +#endif /* _MACHINE_NEXUSVAR_H_ */ diff --git a/sys/sparc64/include/pcb.h b/sys/sparc64/include/pcb.h index 7e8294ad9b68..f23c1f291c2f 100644 --- a/sys/sparc64/include/pcb.h +++ b/sys/sparc64/include/pcb.h @@ -49,7 +49,8 @@ struct pcb { uint64_t pcb_nsaved; uint64_t pcb_pc; uint64_t pcb_sp; - uint64_t pcb_pad[4]; + uint64_t pcb_tpc; + uint64_t pcb_pad[3]; } __aligned(64); #ifdef _KERNEL diff --git a/sys/sparc64/include/pcpu.h b/sys/sparc64/include/pcpu.h index 7d2f5a023fc5..f5735bf48019 100644 --- a/sys/sparc64/include/pcpu.h +++ b/sys/sparc64/include/pcpu.h @@ -54,6 +54,7 @@ struct pmap; u_long pc_tickref; \ u_long pc_tickadj; \ u_int pc_clock; \ + u_int pc_impl; \ u_int pc_mid; \ u_int pc_node; \ u_int pc_tlb_ctx; \ diff --git a/sys/sparc64/include/pmap.h b/sys/sparc64/include/pmap.h index 91c2a51eb64b..83c81904b50b 100644 --- a/sys/sparc64/include/pmap.h +++ b/sys/sparc64/include/pmap.h @@ -80,7 +80,7 @@ struct pmap { #define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT #define pmap_page_set_memattr(m, ma) (void)0 -void pmap_bootstrap(void); +void pmap_bootstrap(u_int cpu_impl); vm_paddr_t pmap_kextract(vm_offset_t va); void pmap_kenter(vm_offset_t va, vm_page_t m); void pmap_kremove(vm_offset_t); diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h index 87355430ca31..467c6b639114 100644 --- a/sys/sparc64/include/smp.h +++ b/sys/sparc64/include/smp.h @@ -94,7 +94,7 @@ void cpu_mp_shutdown(void); typedef void cpu_ipi_selected_t(u_int, u_long, u_long, u_long); extern cpu_ipi_selected_t *cpu_ipi_selected; -void mp_init(void); +void mp_init(u_int cpu_impl); extern struct mtx ipi_mtx; extern struct ipi_cache_args ipi_cache_args; diff --git a/sys/sparc64/include/tick.h b/sys/sparc64/include/tick.h index 9182cb405b59..ae80d53c5013 100644 --- a/sys/sparc64/include/tick.h +++ b/sys/sparc64/include/tick.h @@ -31,8 +31,8 @@ extern u_int hardclock_use_stick; -void tick_clear(void); +void tick_clear(u_int cpu_impl); void tick_start(void); -void tick_stop(void); +void tick_stop(u_int cpu_impl); #endif diff --git a/sys/sparc64/include/upa.h b/sys/sparc64/include/upa.h index 3e56917b6383..43531cf63318 100644 --- a/sys/sparc64/include/upa.h +++ b/sys/sparc64/include/upa.h @@ -26,25 +26,16 @@ */ #ifndef _MACHINE_UPA_H_ -#define _MACHINE_UPA_H_ +#define _MACHINE_UPA_H_ #define UPA_MEMSTART 0x1c000000000UL #define UPA_MEMEND 0x1ffffffffffUL #define UPA_CR_MID_SHIFT (17) #define UPA_CR_MID_SIZE (5) -#define UPA_CR_MID_MASK \ +#define UPA_CR_MID_MASK \ (((1 << UPA_CR_MID_SIZE) - 1) << UPA_CR_MID_SHIFT) #define UPA_CR_GET_MID(cr) ((cr & UPA_CR_MID_MASK) >> UPA_CR_MID_SHIFT) -#ifdef LOCORE - -#define UPA_GET_MID(r1) \ - ldxa [%g0] ASI_UPA_CONFIG_REG, r1 ; \ - srlx r1, UPA_CR_MID_SHIFT, r1 ; \ - and r1, (1 << UPA_CR_MID_SIZE) - 1, r1 - -#endif - #endif /* _MACHINE_UPA_H_ */ diff --git a/sys/sparc64/include/ver.h b/sys/sparc64/include/ver.h index 0fb7933f0bc5..ad6841bd9ad4 100644 --- a/sys/sparc64/include/ver.h +++ b/sys/sparc64/include/ver.h @@ -43,24 +43,28 @@ #ifndef LOCORE -#define VER_MANUF_MASK (((1L<> VER_MANUF_SHIFT) -#define VER_IMPL(ver) \ +#define VER_IMPL(ver) \ (((ver) & VER_IMPL_MASK) >> VER_IMPL_SHIFT) -#define VER_MASK(ver) \ +#define VER_MASK(ver) \ (((ver) & VER_MASK_MASK) >> VER_MASK_SHIFT) -#define VER_MAXTL(ver) \ +#define VER_MAXTL(ver) \ (((ver) & VER_MAXTL_MASK) >> VER_MAXTL_SHIFT) -#define VER_MAXWIN(ver) \ +#define VER_MAXWIN(ver) \ (((ver) & VER_MAXWIN_MASK) >> VER_MAXWIN_SHIFT) -extern int cpu_impl; extern char sparc64_model[]; #endif /* !LOCORE */ diff --git a/sys/sparc64/isa/ofw_isa.c b/sys/sparc64/isa/ofw_isa.c index de5e4cecd384..6139ba7a059f 100644 --- a/sys/sparc64/isa/ofw_isa.c +++ b/sys/sparc64/isa/ofw_isa.c @@ -79,11 +79,11 @@ ofw_isa_range_map(struct isa_ranges *range, int nrange, u_long *start, for (i = 0; i < nrange; i++) { r = &range[i]; cstart = ISA_RANGE_CHILD(r); - cend = cstart + r->size; + cend = cstart + r->size - 1; if (*start < cstart || *start > cend) continue; if (*end < cstart || *end > cend) { - panic("ofw_isa_map_iorange: iorange crosses pci " + panic("ofw_isa_map_iorange: iorange crosses PCI " "ranges (%#lx not in %#lx - %#lx)", *end, cstart, cend); } diff --git a/sys/sparc64/pci/apb.c b/sys/sparc64/pci/apb.c index ad4dfca7cd13..2f4932e2c1cc 100644 --- a/sys/sparc64/pci/apb.c +++ b/sys/sparc64/pci/apb.c @@ -111,7 +111,8 @@ static device_method_t apb_methods[] = { static devclass_t pcib_devclass; DEFINE_CLASS_0(pcib, apb_driver, apb_methods, sizeof(struct apb_softc)); -DRIVER_MODULE(apb, pci, apb_driver, pcib_devclass, 0, 0); +EARLY_DRIVER_MODULE(apb, pci, apb_driver, pcib_devclass, 0, 0, BUS_PASS_BUS); +MODULE_DEPEND(apb, pci, 1, 1, 1); /* APB specific registers */ #define APBR_IOMAP 0xde diff --git a/sys/sparc64/pci/fire.c b/sys/sparc64/pci/fire.c new file mode 100644 index 000000000000..4a3b0604b5bd --- /dev/null +++ b/sys/sparc64/pci/fire.c @@ -0,0 +1,2172 @@ +/*- + * Copyright (c) 1999, 2000 Matthew R. Green + * Copyright (c) 2001 - 2003 by Thomas Moestl + * Copyright (c) 2009 by Marius Strobl + * 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. + * 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 ``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 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. + * + * from: NetBSD: psycho.c,v 1.39 2001/10/07 20:30:41 eeh Exp + * from: FreeBSD: psycho.c 183152 2008-09-18 19:45:22Z marius + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Driver for `Fire' JBus to PCI Express and `Oberon' Uranus to PCI Express + * bridges + */ + +#include "opt_fire.h" +#include "opt_ofw_pci.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include "pcib_if.h" + +struct fire_msiqarg; + +static bus_space_tag_t fire_alloc_bus_tag(struct fire_softc *sc, int type); +static const struct fire_desc *fire_get_desc(device_t dev); +static void fire_dmamap_sync(bus_dma_tag_t dt __unused, bus_dmamap_t map, + bus_dmasync_op_t op); +static int fire_get_intrmap(struct fire_softc *sc, u_int ino, + bus_addr_t *intrmapptr, bus_addr_t *intrclrptr); +static void fire_intr_assign(void *arg); +static void fire_intr_clear(void *arg); +static void fire_intr_disable(void *arg); +static void fire_intr_enable(void *arg); +static int fire_intr_register(struct fire_softc *sc, u_int ino); +static inline void fire_msiq_common(struct intr_vector *iv, + struct fire_msiqarg *fmqa); +static void fire_msiq_filter(void *cookie); +static void fire_msiq_handler(void *cookie); +static void fire_set_intr(struct fire_softc *sc, u_int index, u_int ino, + driver_filter_t handler, void *arg); +static timecounter_get_t fire_get_timecount; + +/* Interrupt handlers */ +static driver_filter_t fire_dmc_pec; +static driver_filter_t fire_pcie; +static driver_filter_t fire_xcb; + +/* + * Methods + */ +static bus_activate_resource_t fire_activate_resource; +static pcib_alloc_msi_t fire_alloc_msi; +static pcib_alloc_msix_t fire_alloc_msix; +static bus_alloc_resource_t fire_alloc_resource; +static device_attach_t fire_attach; +static bus_deactivate_resource_t fire_deactivate_resource; +static bus_get_dma_tag_t fire_get_dma_tag; +static ofw_bus_get_node_t fire_get_node; +static pcib_map_msi_t fire_map_msi; +static pcib_maxslots_t fire_maxslots; +static device_probe_t fire_probe; +static pcib_read_config_t fire_read_config; +static bus_read_ivar_t fire_read_ivar; +static pcib_release_msi_t fire_release_msi; +static pcib_release_msix_t fire_release_msix; +static bus_release_resource_t fire_release_resource; +static pcib_route_interrupt_t fire_route_interrupt; +static bus_setup_intr_t fire_setup_intr; +static bus_teardown_intr_t fire_teardown_intr; +static pcib_write_config_t fire_write_config; + +static device_method_t fire_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, fire_probe), + DEVMETHOD(device_attach, fire_attach), + DEVMETHOD(device_shutdown, bus_generic_shutdown), + DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_resume, bus_generic_resume), + + /* Bus interface */ + DEVMETHOD(bus_print_child, bus_generic_print_child), + DEVMETHOD(bus_read_ivar, fire_read_ivar), + DEVMETHOD(bus_setup_intr, fire_setup_intr), + DEVMETHOD(bus_teardown_intr, fire_teardown_intr), + DEVMETHOD(bus_alloc_resource, fire_alloc_resource), + DEVMETHOD(bus_activate_resource, fire_activate_resource), + DEVMETHOD(bus_deactivate_resource, fire_deactivate_resource), + DEVMETHOD(bus_release_resource, fire_release_resource), + DEVMETHOD(bus_get_dma_tag, fire_get_dma_tag), + + /* pcib interface */ + DEVMETHOD(pcib_maxslots, fire_maxslots), + DEVMETHOD(pcib_read_config, fire_read_config), + DEVMETHOD(pcib_write_config, fire_write_config), + DEVMETHOD(pcib_route_interrupt, fire_route_interrupt), + DEVMETHOD(pcib_alloc_msi, fire_alloc_msi), + DEVMETHOD(pcib_release_msi, fire_release_msi), + DEVMETHOD(pcib_alloc_msix, fire_alloc_msix), + DEVMETHOD(pcib_release_msix, fire_release_msix), + DEVMETHOD(pcib_map_msi, fire_map_msi), + + /* ofw_bus interface */ + DEVMETHOD(ofw_bus_get_node, fire_get_node), + + KOBJMETHOD_END +}; + +static devclass_t fire_devclass; + +DEFINE_CLASS_0(pcib, fire_driver, fire_methods, sizeof(struct fire_softc)); +EARLY_DRIVER_MODULE(fire, nexus, fire_driver, fire_devclass, 0, 0, + BUS_PASS_BUS); +MODULE_DEPEND(fire, nexus, 1, 1, 1); + +static const struct intr_controller fire_ic = { + fire_intr_enable, + fire_intr_disable, + fire_intr_assign, + fire_intr_clear +}; + +struct fire_icarg { + struct fire_softc *fica_sc; + bus_addr_t fica_map; + bus_addr_t fica_clr; +}; + +static const struct intr_controller fire_msiqc_filter = { + fire_intr_enable, + fire_intr_disable, + fire_intr_assign, + NULL +}; + +struct fire_msiqarg { + struct fire_icarg fmqa_fica; + struct mtx fmqa_mtx; + struct fo_msiq_record *fmqa_base; + uint64_t fmqa_head; + uint64_t fmqa_tail; + uint32_t fmqa_msiq; + uint32_t fmqa_msi; +}; + +#define FIRE_PERF_CNT_QLTY 100 + +#define FIRE_SPC_BARRIER(spc, sc, offs, len, flags) \ + bus_barrier((sc)->sc_mem_res[(spc)], (offs), (len), (flags)) +#define FIRE_SPC_READ_8(spc, sc, offs) \ + bus_read_8((sc)->sc_mem_res[(spc)], (offs)) +#define FIRE_SPC_WRITE_8(spc, sc, offs, v) \ + bus_write_8((sc)->sc_mem_res[(spc)], (offs), (v)) + +#ifndef FIRE_DEBUG +#define FIRE_SPC_SET(spc, sc, offs, reg, v) \ + FIRE_SPC_WRITE_8((spc), (sc), (offs), (v)) +#else +#define FIRE_SPC_SET(spc, sc, offs, reg, v) do { \ + device_printf((sc)->sc_dev, reg " 0x%016llx -> 0x%016llx\n", \ + (unsigned long long)FIRE_SPC_READ_8((spc), (sc), (offs)), \ + (unsigned long long)(v)); \ + FIRE_SPC_WRITE_8((spc), (sc), (offs), (v)); \ + } while (0) +#endif + +#define FIRE_PCI_BARRIER(sc, offs, len, flags) \ + FIRE_SPC_BARRIER(FIRE_PCI, (sc), (offs), len, flags) +#define FIRE_PCI_READ_8(sc, offs) \ + FIRE_SPC_READ_8(FIRE_PCI, (sc), (offs)) +#define FIRE_PCI_WRITE_8(sc, offs, v) \ + FIRE_SPC_WRITE_8(FIRE_PCI, (sc), (offs), (v)) +#define FIRE_CTRL_BARRIER(sc, offs, len, flags) \ + FIRE_SPC_BARRIER(FIRE_CTRL, (sc), (offs), len, flags) +#define FIRE_CTRL_READ_8(sc, offs) \ + FIRE_SPC_READ_8(FIRE_CTRL, (sc), (offs)) +#define FIRE_CTRL_WRITE_8(sc, offs, v) \ + FIRE_SPC_WRITE_8(FIRE_CTRL, (sc), (offs), (v)) + +#define FIRE_PCI_SET(sc, offs, v) \ + FIRE_SPC_SET(FIRE_PCI, (sc), (offs), # offs, (v)) +#define FIRE_CTRL_SET(sc, offs, v) \ + FIRE_SPC_SET(FIRE_CTRL, (sc), (offs), # offs, (v)) + +struct fire_desc { + const char *fd_string; + int fd_mode; + const char *fd_name; +}; + +static const struct fire_desc const fire_compats[] = { + { "pciex108e,80f0", FIRE_MODE_FIRE, "Fire" }, +#if 0 + { "pciex108e,80f8", FIRE_MODE_OBERON, "Oberon" }, +#endif + { NULL, 0, NULL } +}; + +static const struct fire_desc * +fire_get_desc(device_t dev) +{ + const struct fire_desc *desc; + const char *compat; + + compat = ofw_bus_get_compat(dev); + if (compat == NULL) + return (NULL); + for (desc = fire_compats; desc->fd_string != NULL; desc++) + if (strcmp(desc->fd_string, compat) == 0) + return (desc); + return (NULL); +} + +static int +fire_probe(device_t dev) +{ + const char *dtype; + + dtype = ofw_bus_get_type(dev); + if (dtype != NULL && strcmp(dtype, OFW_TYPE_PCIE) == 0 && + fire_get_desc(dev) != NULL) { + device_set_desc(dev, "Sun Host-PCIe bridge"); + return (BUS_PROBE_GENERIC); + } + return (ENXIO); +} + +static int +fire_attach(device_t dev) +{ + struct fire_softc *sc; + const struct fire_desc *desc; + struct ofw_pci_msi_ranges msi_ranges; + struct ofw_pci_msi_addr_ranges msi_addr_ranges; + struct ofw_pci_msi_eq_to_devino msi_eq_to_devino; + struct fire_msiqarg *fmqa; + struct timecounter *tc; + struct ofw_pci_ranges *range; + uint64_t ino_bitmap, val; + phandle_t node; + uint32_t prop, prop_array[2]; + int i, j, mode; + u_int lw; + uint16_t mps; + + sc = device_get_softc(dev); + node = ofw_bus_get_node(dev); + desc = fire_get_desc(dev); + mode = desc->fd_mode; + + sc->sc_dev = dev; + sc->sc_node = node; + sc->sc_mode = mode; + sc->sc_flags = 0; + + mtx_init(&sc->sc_msi_mtx, "msi_mtx", NULL, MTX_DEF); + mtx_init(&sc->sc_pcib_mtx, "pcib_mtx", NULL, MTX_SPIN); + + /* + * Fire and Oberon have two register banks: + * (0) per-PBM PCI Express configuration and status registers + * (1) (shared) Fire/Oberon controller configuration and status + * registers + */ + for (i = 0; i < FIRE_NREG; i++) { + j = i; + sc->sc_mem_res[i] = bus_alloc_resource_any(dev, + SYS_RES_MEMORY, &j, RF_ACTIVE); + if (sc->sc_mem_res[i] == NULL) + panic("%s: could not allocate register bank %d", + __func__, i); + } + + if (OF_getprop(node, "portid", &sc->sc_ign, sizeof(sc->sc_ign)) == -1) + panic("%s: could not determine IGN", __func__); + if (OF_getprop(node, "module-revision#", &prop, sizeof(prop)) == -1) + panic("%s: could not determine revision", __func__); + + device_printf(dev, "%s, module-revision %d, IGN %#x\n", + desc->fd_name, prop, sc->sc_ign); + + /* + * Hunt through all the interrupt mapping regs and register + * the interrupt controller for our interrupt vectors. We do + * this early in order to be able to catch stray interrupts. + */ + i = OF_getprop(node, "ino-bitmap", (void *)prop_array, + sizeof(prop_array)); + if (i == -1) + panic("%s: could not get ino-bitmap", __func__); + ino_bitmap = ((uint64_t)prop_array[1] << 32) | prop_array[0]; + for (i = 0; i <= FO_MAX_INO; i++) { + if ((ino_bitmap & (1ULL << i)) == 0) + continue; + j = fire_intr_register(sc, i); + if (j != 0) + device_printf(dev, "could not register interrupt " + "controller for INO %d (%d)\n", i, j); + } + + /* JBC/UBC module initialization */ + FIRE_CTRL_SET(sc, FO_XBC_ERR_LOG_EN, ~0ULL); + FIRE_CTRL_SET(sc, FO_XBC_ERR_STAT_CLR, ~0ULL); + /* not enabled by OpenSolaris */ + FIRE_CTRL_SET(sc, FO_XBC_INT_EN, ~0ULL); + if (sc->sc_mode == FIRE_MODE_FIRE) { + FIRE_CTRL_SET(sc, FIRE_JBUS_PAR_CTRL, + FIRE_JBUS_PAR_CTRL_P_EN); + FIRE_CTRL_SET(sc, FIRE_JBC_FATAL_RST_EN, + ((1ULL << FIRE_JBC_FATAL_RST_EN_SPARE_P_INT_SHFT) & + FIRE_JBC_FATAL_RST_EN_SPARE_P_INT_MASK) | + FIRE_JBC_FATAL_RST_EN_MB_PEA_P_INT | + FIRE_JBC_FATAL_RST_EN_CPE_P_INT | + FIRE_JBC_FATAL_RST_EN_APE_P_INT | + FIRE_JBC_FATAL_RST_EN_PIO_CPE_INT | + FIRE_JBC_FATAL_RST_EN_JTCEEW_P_INT | + FIRE_JBC_FATAL_RST_EN_JTCEEI_P_INT | + FIRE_JBC_FATAL_RST_EN_JTCEER_P_INT); + FIRE_CTRL_SET(sc, FIRE_JBC_CORE_BLOCK_INT_EN, ~0ULL); + } + + /* TLU initialization */ + FIRE_PCI_SET(sc, FO_PCI_TLU_OEVENT_STAT_CLR, + FO_PCI_TLU_OEVENT_S_MASK | FO_PCI_TLU_OEVENT_P_MASK); + /* not enabled by OpenSolaris */ + FIRE_PCI_SET(sc, FO_PCI_TLU_OEVENT_INT_EN, + FO_PCI_TLU_OEVENT_S_MASK | FO_PCI_TLU_OEVENT_P_MASK); + FIRE_PCI_SET(sc, FO_PCI_TLU_UERR_STAT_CLR, + FO_PCI_TLU_UERR_INT_S_MASK | FO_PCI_TLU_UERR_INT_P_MASK); + /* not enabled by OpenSolaris */ + FIRE_PCI_SET(sc, FO_PCI_TLU_UERR_INT_EN, + FO_PCI_TLU_UERR_INT_S_MASK | FO_PCI_TLU_UERR_INT_P_MASK); + FIRE_PCI_SET(sc, FO_PCI_TLU_CERR_STAT_CLR, + FO_PCI_TLU_CERR_INT_S_MASK | FO_PCI_TLU_CERR_INT_P_MASK); + /* not enabled by OpenSolaris */ + FIRE_PCI_SET(sc, FO_PCI_TLU_CERR_INT_EN, + FO_PCI_TLU_CERR_INT_S_MASK | FO_PCI_TLU_CERR_INT_P_MASK); + val = FIRE_PCI_READ_8(sc, FO_PCI_TLU_CTRL) | + ((FO_PCI_TLU_CTRL_L0S_TIM_DFLT << FO_PCI_TLU_CTRL_L0S_TIM_SHFT) & + FO_PCI_TLU_CTRL_L0S_TIM_MASK) | + ((FO_PCI_TLU_CTRL_CFG_DFLT << FO_PCI_TLU_CTRL_CFG_SHFT) & + FO_PCI_TLU_CTRL_CFG_MASK); + if (sc->sc_mode == FIRE_MODE_OBERON) + val &= ~FO_PCI_TLU_CTRL_NWPR_EN; + val |= FO_PCI_TLU_CTRL_CFG_REMAIN_DETECT_QUIET; + FIRE_PCI_SET(sc, FO_PCI_TLU_CTRL, val); + FIRE_PCI_SET(sc, FO_PCI_TLU_DEV_CTRL, 0); + FIRE_PCI_SET(sc, FO_PCI_TLU_LNK_CTRL, FO_PCI_TLU_LNK_CTRL_CLK); + + /* DLU/LPU initialization */ + if (sc->sc_mode == FIRE_MODE_OBERON) + FIRE_PCI_SET(sc, FO_PCI_LPU_INT_MASK, 0); + else + FIRE_PCI_SET(sc, FO_PCI_LPU_RST, 0); + FIRE_PCI_SET(sc, FO_PCI_LPU_LNK_LYR_CFG, + FO_PCI_LPU_LNK_LYR_CFG_VC0_EN); + FIRE_PCI_SET(sc, FO_PCI_LPU_FLW_CTRL_UPDT_CTRL, + FO_PCI_LPU_FLW_CTRL_UPDT_CTRL_FC0_NP_EN | + FO_PCI_LPU_FLW_CTRL_UPDT_CTRL_FC0_P_EN); + if (sc->sc_mode == FIRE_MODE_OBERON) + FIRE_PCI_SET(sc, FO_PCI_LPU_TXLNK_RPLY_TMR_THRS, + (OBERON_PCI_LPU_TXLNK_RPLY_TMR_THRS_DFLT << + FO_PCI_LPU_TXLNK_RPLY_TMR_THRS_SHFT) & + FO_PCI_LPU_TXLNK_RPLY_TMR_THRS_MASK); + else { + switch ((FIRE_PCI_READ_8(sc, FO_PCI_TLU_LNK_STAT) & + FO_PCI_TLU_LNK_STAT_WDTH_MASK) >> + FO_PCI_TLU_LNK_STAT_WDTH_SHFT) { + case 1: + lw = 0; + break; + case 4: + lw = 1; + break; + case 8: + lw = 2; + break; + case 16: + lw = 3; + break; + default: + lw = 0; + } + mps = (FIRE_PCI_READ_8(sc, FO_PCI_TLU_CTRL) & + FO_PCI_TLU_CTRL_CFG_MASK) >> FO_PCI_TLU_CTRL_CFG_SHFT; + i = sizeof(fire_freq_nak_tmr_thrs) / + sizeof(*fire_freq_nak_tmr_thrs); + if (mps >= i); + mps = i - 1; + FIRE_PCI_SET(sc, FO_PCI_LPU_TXLNK_FREQ_LAT_TMR_THRS, + (fire_freq_nak_tmr_thrs[mps][lw] << + FO_PCI_LPU_TXLNK_FREQ_LAT_TMR_THRS_SHFT) & + FO_PCI_LPU_TXLNK_FREQ_LAT_TMR_THRS_MASK); + FIRE_PCI_SET(sc, FO_PCI_LPU_TXLNK_RPLY_TMR_THRS, + (fire_rply_tmr_thrs[mps][lw] << + FO_PCI_LPU_TXLNK_RPLY_TMR_THRS_SHFT) & + FO_PCI_LPU_TXLNK_RPLY_TMR_THRS_MASK); + FIRE_PCI_SET(sc, FO_PCI_LPU_TXLNK_RTR_FIFO_PTR, + ((FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_TL_DFLT << + FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_TL_SHFT) & + FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_TL_MASK) | + ((FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_HD_DFLT << + FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_HD_SHFT) & + FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_HD_MASK)); + FIRE_PCI_SET(sc, FO_PCI_LPU_LTSSM_CFG2, + (FO_PCI_LPU_LTSSM_CFG2_12_TO_DFLT << + FO_PCI_LPU_LTSSM_CFG2_12_TO_SHFT) & + FO_PCI_LPU_LTSSM_CFG2_12_TO_MASK); + FIRE_PCI_SET(sc, FO_PCI_LPU_LTSSM_CFG3, + (FO_PCI_LPU_LTSSM_CFG3_2_TO_DFLT << + FO_PCI_LPU_LTSSM_CFG3_2_TO_SHFT) & + FO_PCI_LPU_LTSSM_CFG3_2_TO_MASK); + FIRE_PCI_SET(sc, FO_PCI_LPU_LTSSM_CFG4, + ((FO_PCI_LPU_LTSSM_CFG4_DATA_RATE_DFLT << + FO_PCI_LPU_LTSSM_CFG4_DATA_RATE_SHFT) & + FO_PCI_LPU_LTSSM_CFG4_DATA_RATE_MASK) | + ((FO_PCI_LPU_LTSSM_CFG4_N_FTS_DFLT << + FO_PCI_LPU_LTSSM_CFG4_N_FTS_SHFT) & + FO_PCI_LPU_LTSSM_CFG4_N_FTS_MASK)); + FIRE_PCI_SET(sc, FO_PCI_LPU_LTSSM_CFG5, 0); + } + + /* ILU initialization */ + FIRE_PCI_SET(sc, FO_PCI_ILU_ERR_STAT_CLR, ~0ULL); + /* not enabled by OpenSolaris */ + FIRE_PCI_SET(sc, FO_PCI_ILU_INT_EN, ~0ULL); + + /* IMU initialization */ + FIRE_PCI_SET(sc, FO_PCI_IMU_ERR_STAT_CLR, ~0ULL); + FIRE_PCI_SET(sc, FO_PCI_IMU_INT_EN, + FIRE_PCI_READ_8(sc, FO_PCI_IMU_INT_EN) & + ~(FO_PCI_IMU_ERR_INT_FATAL_MES_NOT_EN_S | + FO_PCI_IMU_ERR_INT_NFATAL_MES_NOT_EN_S | + FO_PCI_IMU_ERR_INT_COR_MES_NOT_EN_S | + FO_PCI_IMU_ERR_INT_FATAL_MES_NOT_EN_P | + FO_PCI_IMU_ERR_INT_NFATAL_MES_NOT_EN_P | + FO_PCI_IMU_ERR_INT_COR_MES_NOT_EN_P)); + + /* MMU initialization */ + FIRE_PCI_SET(sc, FO_PCI_MMU_ERR_STAT_CLR, + FO_PCI_MMU_ERR_INT_S_MASK | FO_PCI_MMU_ERR_INT_P_MASK); + /* not enabled by OpenSolaris */ + FIRE_PCI_SET(sc, FO_PCI_MMU_INT_EN, + FO_PCI_MMU_ERR_INT_S_MASK | FO_PCI_MMU_ERR_INT_P_MASK); + + /* DMC initialization */ + FIRE_PCI_SET(sc, FO_PCI_DMC_CORE_BLOCK_INT_EN, ~0ULL); + FIRE_PCI_SET(sc, FO_PCI_DMC_DBG_SEL_PORTA, 0); + FIRE_PCI_SET(sc, FO_PCI_DMC_DBG_SEL_PORTB, 0); + + /* PEC initialization */ + FIRE_PCI_SET(sc, FO_PCI_PEC_CORE_BLOCK_INT_EN, ~0ULL); + + /* Establish handlers for interesting interrupts. */ + if ((ino_bitmap & (1ULL << FO_DMC_PEC_INO)) != 0) + fire_set_intr(sc, 1, FO_DMC_PEC_INO, fire_dmc_pec, sc); + if ((ino_bitmap & (1ULL << FO_XCB_INO)) != 0) + fire_set_intr(sc, 0, FO_XCB_INO, fire_xcb, sc); + + /* MSI/MSI-X support */ + if (OF_getprop(node, "#msi", &sc->sc_msi_count, + sizeof(sc->sc_msi_count)) == -1) + panic("%s: could not determine MSI count", __func__); + if (OF_getprop(node, "msi-ranges", &msi_ranges, + sizeof(msi_ranges)) == -1) + sc->sc_msi_first = 0; + else + sc->sc_msi_first = msi_ranges.first; + if (OF_getprop(node, "msi-data-mask", &sc->sc_msi_data_mask, + sizeof(sc->sc_msi_data_mask)) == -1) + panic("%s: could not determine MSI data mask", __func__); + if (OF_getprop(node, "msix-data-width", &sc->sc_msix_data_width, + sizeof(sc->sc_msix_data_width)) > 0) + sc->sc_flags |= FIRE_MSIX; + if (OF_getprop(node, "msi-address-ranges", &msi_addr_ranges, + sizeof(msi_addr_ranges)) == -1) + panic("%s: could not determine MSI address ranges", __func__); + sc->sc_msi_addr32 = OFW_PCI_MSI_ADDR_RANGE_32(&msi_addr_ranges); + sc->sc_msi_addr64 = OFW_PCI_MSI_ADDR_RANGE_64(&msi_addr_ranges); + if (OF_getprop(node, "#msi-eqs", &sc->sc_msiq_count, + sizeof(sc->sc_msiq_count)) == -1) + panic("%s: could not determine MSI event queue count", + __func__); + if (OF_getprop(node, "msi-eq-size", &sc->sc_msiq_size, + sizeof(sc->sc_msiq_size)) == -1) + panic("%s: could not determine MSI event queue size", + __func__); + if (OF_getprop(node, "msi-eq-to-devino", &msi_eq_to_devino, + sizeof(msi_eq_to_devino)) == -1 && + OF_getprop(node, "msi-eq-devino", &msi_eq_to_devino, + sizeof(msi_eq_to_devino)) == -1) { + sc->sc_msiq_first = 0; + sc->sc_msiq_ino_first = FO_EQ_FIRST_INO; + } else { + sc->sc_msiq_first = msi_eq_to_devino.eq_first; + sc->sc_msiq_ino_first = msi_eq_to_devino.devino_first; + } + if (sc->sc_msiq_ino_first < FO_EQ_FIRST_INO || + sc->sc_msiq_ino_first + sc->sc_msiq_count - 1 > FO_EQ_LAST_INO) + panic("%s: event queues exceed INO range", __func__); + sc->sc_msi_bitmap = malloc(roundup2(sc->sc_msi_count, NBBY) / NBBY, + M_DEVBUF, M_NOWAIT | M_ZERO); + if (sc->sc_msi_bitmap == NULL) + panic("%s: could not malloc MSI bitmap", __func__); + sc->sc_msi_msiq_table = malloc(sc->sc_msi_count * + sizeof(*sc->sc_msi_msiq_table), M_DEVBUF, M_NOWAIT | M_ZERO); + if (sc->sc_msi_msiq_table == NULL) + panic("%s: could not malloc MSI-MSI event queue table", + __func__); + sc->sc_msiq_bitmap = malloc(roundup2(sc->sc_msiq_count, NBBY) / NBBY, + M_DEVBUF, M_NOWAIT | M_ZERO); + if (sc->sc_msiq_bitmap == NULL) + panic("%s: could not malloc MSI event queue bitmap", __func__); + j = FO_EQ_RECORD_SIZE * FO_EQ_NRECORDS * sc->sc_msiq_count; + sc->sc_msiq = contigmalloc(j, M_DEVBUF, M_NOWAIT, 0, ~0UL, + FO_EQ_ALIGNMENT, 0); + if (sc->sc_msiq == NULL) + panic("%s: could not contigmalloc MSI event queue", __func__); + memset(sc->sc_msiq, 0, j); + FIRE_PCI_SET(sc, FO_PCI_EQ_BASE_ADDR, FO_PCI_EQ_BASE_ADDR_BYPASS | + (pmap_kextract((vm_offset_t)sc->sc_msiq) & + FO_PCI_EQ_BASE_ADDR_MASK)); + for (i = 0; i < sc->sc_msi_count; i++) { + j = (i + sc->sc_msi_first) << 3; + FIRE_PCI_WRITE_8(sc, FO_PCI_MSI_MAP_BASE + j, + FIRE_PCI_READ_8(sc, FO_PCI_MSI_MAP_BASE + j) & + ~FO_PCI_MSI_MAP_V); + } + for (i = 0; i < sc->sc_msiq_count; i++) { + j = i + sc->sc_msiq_ino_first; + if ((ino_bitmap & (1ULL << j)) == 0) { + mtx_lock(&sc->sc_msi_mtx); + setbit(sc->sc_msiq_bitmap, i); + mtx_unlock(&sc->sc_msi_mtx); + } + fmqa = intr_vectors[INTMAP_VEC(sc->sc_ign, j)].iv_icarg; + mtx_init(&fmqa->fmqa_mtx, "msiq_mtx", NULL, MTX_SPIN); + fmqa->fmqa_base = + (struct fo_msiq_record *)((caddr_t)sc->sc_msiq + + (FO_EQ_RECORD_SIZE * FO_EQ_NRECORDS * i)); + j = i + sc->sc_msiq_first; + fmqa->fmqa_msiq = j; + j <<= 3; + fmqa->fmqa_head = FO_PCI_EQ_HD_BASE + j; + fmqa->fmqa_tail = FO_PCI_EQ_TL_BASE + j; + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_CTRL_CLR_BASE + j, + FO_PCI_EQ_CTRL_CLR_COVERR | FO_PCI_EQ_CTRL_CLR_E2I | + FO_PCI_EQ_CTRL_CLR_DIS); + FIRE_PCI_WRITE_8(sc, fmqa->fmqa_tail, + (0 << FO_PCI_EQ_TL_SHFT) & FO_PCI_EQ_TL_MASK); + FIRE_PCI_WRITE_8(sc, fmqa->fmqa_head, + (0 << FO_PCI_EQ_HD_SHFT) & FO_PCI_EQ_HD_MASK); + } + FIRE_PCI_SET(sc, FO_PCI_MSI_32_BIT_ADDR, sc->sc_msi_addr32 & + FO_PCI_MSI_32_BIT_ADDR_MASK); + FIRE_PCI_SET(sc, FO_PCI_MSI_64_BIT_ADDR, sc->sc_msi_addr64 & + FO_PCI_MSI_64_BIT_ADDR_MASK); + + /* + * Establish a handler for interesting PCIe messages and disable + * unintersting ones. + */ + mtx_lock(&sc->sc_msi_mtx); + for (i = 0; i < sc->sc_msiq_count; i++) { + if (isclr(sc->sc_msiq_bitmap, i) != 0) { + j = i; + break; + } + } + if (i == sc->sc_msiq_count) { + mtx_unlock(&sc->sc_msi_mtx); + panic("%s: no spare event queue for PCIe messages", __func__); + } + setbit(sc->sc_msiq_bitmap, j); + mtx_unlock(&sc->sc_msi_mtx); + i = INTMAP_VEC(sc->sc_ign, j + sc->sc_msiq_ino_first); + if (bus_set_resource(dev, SYS_RES_IRQ, 2, i, 1) != 0) + panic("%s: failed to add interrupt for PCIe messages", + __func__); + fire_set_intr(sc, 2, INTINO(i), fire_pcie, intr_vectors[i].iv_icarg); + j += sc->sc_msiq_first; + /* + * "Please note that setting the EQNUM field to a value larger than + * 35 will yield unpredictable results." + */ + if (j > 35) + panic("%s: invalid queue for PCIe messages (%d)", + __func__, j); + FIRE_PCI_SET(sc, FO_PCI_ERR_COR, FO_PCI_ERR_PME_V | + ((j << FO_PCI_ERR_PME_EQNUM_SHFT) & FO_PCI_ERR_PME_EQNUM_MASK)); + FIRE_PCI_SET(sc, FO_PCI_ERR_NONFATAL, FO_PCI_ERR_PME_V | + ((j << FO_PCI_ERR_PME_EQNUM_SHFT) & FO_PCI_ERR_PME_EQNUM_MASK)); + FIRE_PCI_SET(sc, FO_PCI_ERR_FATAL, FO_PCI_ERR_PME_V | + ((j << FO_PCI_ERR_PME_EQNUM_SHFT) & FO_PCI_ERR_PME_EQNUM_MASK)); + FIRE_PCI_SET(sc, FO_PCI_PM_PME, 0); + FIRE_PCI_SET(sc, FO_PCI_PME_TO_ACK, 0); + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_CTRL_SET_BASE + (j << 3), + FO_PCI_EQ_CTRL_SET_EN); + +#define TC_COUNTER_MAX_MASK 0xffffffff + + /* + * Setup JBC/UBC performance counter 0 in bus cycle counting + * mode as timecounter. Unfortunately, at least with Fire all + * JBus-driven performance counters just don't advance in bus + * cycle counting mode. + */ + if (device_get_unit(dev) == 0) { + FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT0, 0); + FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT1, 0); + FIRE_CTRL_SET(sc, FO_XBC_PRF_CNT_SEL, + (FO_XBC_PRF_CNT_NONE << FO_XBC_PRF_CNT_CNT1_SHFT) | + (FO_XBC_PRF_CNT_XB_CLK << FO_XBC_PRF_CNT_CNT0_SHFT)); +#ifdef FIRE_DEBUG + device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n", + (long long unsigned)FIRE_CTRL_READ_8(sc, + FO_XBC_PRF_CNT0)); + device_printf(dev, "FO_XBC_PRF_CNT0 0x%016llx\n", + (long long unsigned)FIRE_CTRL_READ_8(sc, + FO_XBC_PRF_CNT0)); +#endif + tc = malloc(sizeof(*tc), M_DEVBUF, M_NOWAIT | M_ZERO); + if (tc == NULL) + panic("%s: could not malloc timecounter", __func__); + tc->tc_get_timecount = fire_get_timecount; + tc->tc_poll_pps = NULL; + tc->tc_counter_mask = TC_COUNTER_MAX_MASK; + if (OF_getprop(OF_peer(0), "clock-frequency", &prop, + sizeof(prop)) == -1) + panic("%s: could not determine clock frequency", + __func__); + tc->tc_frequency = prop; + tc->tc_name = strdup(device_get_nameunit(dev), M_DEVBUF); + tc->tc_quality = -FIRE_PERF_CNT_QLTY; + tc->tc_priv = sc; + tc_init(tc); + } + + /* + * Set up the IOMMU. Both Fire and Oberon have one per PBM, but + * neither has a streaming buffer. + */ + memcpy(&sc->sc_dma_methods, &iommu_dma_methods, + sizeof(sc->sc_dma_methods)); + sc->sc_is.is_flags = IOMMU_FIRE | IOMMU_PRESERVE_PROM; + if (sc->sc_mode == FIRE_MODE_OBERON) { + sc->sc_is.is_flags |= IOMMU_FLUSH_CACHE; + sc->sc_is.is_pmaxaddr = IOMMU_MAXADDR(OBERON_IOMMU_BITS); + } else { + sc->sc_dma_methods.dm_dmamap_sync = fire_dmamap_sync; + sc->sc_is.is_pmaxaddr = IOMMU_MAXADDR(FIRE_IOMMU_BITS); + } + sc->sc_is.is_sb[0] = sc->sc_is.is_sb[1] = 0; + /* Punch in our copies. */ + sc->sc_is.is_bustag = rman_get_bustag(sc->sc_mem_res[FIRE_PCI]); + sc->sc_is.is_bushandle = rman_get_bushandle(sc->sc_mem_res[FIRE_PCI]); + sc->sc_is.is_iommu = FO_PCI_MMU; + val = FIRE_PCI_READ_8(sc, FO_PCI_MMU + IMR_CTL); + iommu_init(device_get_nameunit(sc->sc_dev), &sc->sc_is, 7, -1, 0); +#ifdef FIRE_DEBUG + device_printf(dev, "FO_PCI_MMU + IMR_CTL 0x%016llx -> 0x%016llx\n", + (long long unsigned)val, (long long unsigned)sc->sc_is.is_cr); +#endif + + /* Initialize memory and I/O rmans. */ + sc->sc_pci_io_rman.rm_type = RMAN_ARRAY; + sc->sc_pci_io_rman.rm_descr = "Fire PCI I/O Ports"; + if (rman_init(&sc->sc_pci_io_rman) != 0 || + rman_manage_region(&sc->sc_pci_io_rman, 0, FO_IO_SIZE) != 0) + panic("%s: failed to set up I/O rman", __func__); + sc->sc_pci_mem_rman.rm_type = RMAN_ARRAY; + sc->sc_pci_mem_rman.rm_descr = "Fire PCI Memory"; + if (rman_init(&sc->sc_pci_mem_rman) != 0 || + rman_manage_region(&sc->sc_pci_mem_rman, 0, FO_MEM_SIZE) != 0) + panic("%s: failed to set up memory rman", __func__); + + i = OF_getprop_alloc(node, "ranges", sizeof(*range), (void **)&range); + /* + * Make sure that the expected ranges are present. The + * OFW_PCI_CS_MEM64 one is not currently used though. + */ + if (i != FIRE_NRANGE) + panic("%s: unsupported number of ranges", __func__); + /* + * Find the addresses of the various bus spaces. + * There should not be multiple ones of one kind. + * The physical start addresses of the ranges are the configuration, + * memory and I/O handles. + */ + for (i = 0; i < FIRE_NRANGE; i++) { + j = OFW_PCI_RANGE_CS(&range[i]); + if (sc->sc_pci_bh[j] != 0) + panic("%s: duplicate range for space %d", + __func__, j); + sc->sc_pci_bh[j] = OFW_PCI_RANGE_PHYS(&range[i]); + } + free(range, M_OFWPROP); + + /* Allocate our tags. */ + sc->sc_pci_memt = fire_alloc_bus_tag(sc, PCI_MEMORY_BUS_SPACE); + sc->sc_pci_iot = fire_alloc_bus_tag(sc, PCI_IO_BUS_SPACE); + sc->sc_pci_cfgt = fire_alloc_bus_tag(sc, PCI_CONFIG_BUS_SPACE); + if (bus_dma_tag_create(bus_get_dma_tag(dev), 8, 0, + sc->sc_is.is_pmaxaddr, ~0, NULL, NULL, sc->sc_is.is_pmaxaddr, + 0xff, 0xffffffff, 0, NULL, NULL, &sc->sc_pci_dmat) != 0) + panic("%s: bus_dma_tag_create failed", __func__); + /* Customize the tag. */ + sc->sc_pci_dmat->dt_cookie = &sc->sc_is; + sc->sc_pci_dmat->dt_mt = &sc->sc_dma_methods; + + /* + * Get the bus range from the firmware. + * NB: Neither Fire nor Oberon support PCI bus reenumeration. + */ + i = OF_getprop(node, "bus-range", (void *)prop_array, + sizeof(prop_array)); + if (i == -1) + panic("%s: could not get bus-range", __func__); + if (i != sizeof(prop_array)) + panic("%s: broken bus-range (%d)", __func__, i); + sc->sc_pci_secbus = prop_array[0]; + sc->sc_pci_subbus = prop_array[1]; + if (bootverbose != 0) + device_printf(dev, "bus range %u to %u; PCI bus %d\n", + sc->sc_pci_secbus, sc->sc_pci_subbus, sc->sc_pci_secbus); + + ofw_bus_setup_iinfo(node, &sc->sc_pci_iinfo, sizeof(ofw_pci_intr_t)); + +#define FIRE_SYSCTL_ADD_UINT(name, arg, desc) \ + SYSCTL_ADD_UINT(device_get_sysctl_ctx(dev), \ + SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, \ + (name), CTLFLAG_RD, (arg), 0, (desc)) + + FIRE_SYSCTL_ADD_UINT("ilu_err", &sc->sc_stats_ilu_err, + "ILU unknown errors"); + FIRE_SYSCTL_ADD_UINT("jbc_ce_async", &sc->sc_stats_jbc_ce_async, + "JBC correctable errors"); + FIRE_SYSCTL_ADD_UINT("jbc_unsol_int", &sc->sc_stats_jbc_unsol_int, + "JBC unsolicited interrupt ACK/NACK errors"); + FIRE_SYSCTL_ADD_UINT("jbc_unsol_rd", &sc->sc_stats_jbc_unsol_rd, + "JBC unsolicited read response errors"); + FIRE_SYSCTL_ADD_UINT("mmu_err", &sc->sc_stats_mmu_err, "MMU errors"); + FIRE_SYSCTL_ADD_UINT("tlu_ce", &sc->sc_stats_tlu_ce, + "DLU/TLU correctable errors"); + FIRE_SYSCTL_ADD_UINT("tlu_oe_non_fatal", + &sc->sc_stats_tlu_oe_non_fatal, + "DLU/TLU other event non-fatal errors summary"), + FIRE_SYSCTL_ADD_UINT("tlu_oe_rx_err", &sc->sc_stats_tlu_oe_rx_err, + "DLU/TLU receive other event errors"), + FIRE_SYSCTL_ADD_UINT("tlu_oe_tx_err", &sc->sc_stats_tlu_oe_tx_err, + "DLU/TLU transmit other event errors"), + FIRE_SYSCTL_ADD_UINT("ubc_dmardue", &sc->sc_stats_ubc_dmardue, + "UBC DMARDUE erros"); + +#undef FIRE_SYSCTL_ADD_UINT + + device_add_child(dev, "pci", -1); + return (bus_generic_attach(dev)); +} + +static void +fire_set_intr(struct fire_softc *sc, u_int index, u_int ino, + driver_filter_t handler, void *arg) +{ + u_long vec; + int rid; + + rid = index; + sc->sc_irq_res[index] = bus_alloc_resource_any(sc->sc_dev, + SYS_RES_IRQ, &rid, RF_ACTIVE); + if (sc->sc_irq_res[index] == NULL || + INTINO(vec = rman_get_start(sc->sc_irq_res[index])) != ino || + INTIGN(vec) != sc->sc_ign || + intr_vectors[vec].iv_ic != &fire_ic || + bus_setup_intr(sc->sc_dev, sc->sc_irq_res[index], + INTR_TYPE_MISC | INTR_FAST, handler, NULL, arg, + &sc->sc_ihand[index]) != 0) + panic("%s: failed to set up interrupt %d", __func__, index); +} + +static int +fire_intr_register(struct fire_softc *sc, u_int ino) +{ + struct fire_icarg *fica; + bus_addr_t intrclr, intrmap; + int error; + + if (fire_get_intrmap(sc, ino, &intrmap, &intrclr) == 0) + return (ENXIO); + fica = malloc((ino >= FO_EQ_FIRST_INO && ino <= FO_EQ_LAST_INO) ? + sizeof(struct fire_msiqarg) : sizeof(struct fire_icarg), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (fica == NULL) + return (ENOMEM); + fica->fica_sc = sc; + fica->fica_map = intrmap; + fica->fica_clr = intrclr; + error = (intr_controller_register(INTMAP_VEC(sc->sc_ign, ino), + &fire_ic, fica)); + if (error != 0) + free(fica, M_DEVBUF); + return (error); +} + +static int +fire_get_intrmap(struct fire_softc *sc, u_int ino, bus_addr_t *intrmapptr, + bus_addr_t *intrclrptr) +{ + + if (ino > FO_MAX_INO) { + device_printf(sc->sc_dev, "out of range INO %d requested\n", + ino); + return (0); + } + + ino <<= 3; + if (intrmapptr != NULL) + *intrmapptr = FO_PCI_INT_MAP_BASE + ino; + if (intrclrptr != NULL) + *intrclrptr = FO_PCI_INT_CLR_BASE + ino; + return (1); +} + +/* + * Interrupt handlers + */ +static int +fire_dmc_pec(void *arg) +{ + struct fire_softc *sc; + device_t dev; + uint64_t cestat, dmcstat, ilustat, imustat, mcstat, mmustat, mmutfar; + uint64_t mmutfsr, oestat, pecstat, uestat, val; + u_int fatal, oenfatal; + + fatal = 0; + sc = arg; + dev = sc->sc_dev; + mtx_lock_spin(&sc->sc_pcib_mtx); + mcstat = FIRE_PCI_READ_8(sc, FO_PCI_MULTI_CORE_ERR_STAT); + if ((mcstat & FO_PCI_MULTI_CORE_ERR_STAT_DMC) != 0) { + dmcstat = FIRE_PCI_READ_8(sc, FO_PCI_DMC_CORE_BLOCK_ERR_STAT); + if ((dmcstat & FO_PCI_DMC_CORE_BLOCK_INT_EN_IMU) != 0) { + imustat = FIRE_PCI_READ_8(sc, FO_PCI_IMU_INT_STAT); + device_printf(dev, "IMU error %#llx\n", + (unsigned long long)imustat); + if ((imustat & + FO_PCI_IMU_ERR_INT_EQ_NOT_EN_P) != 0) { + fatal = 1; + val = FIRE_PCI_READ_8(sc, + FO_PCI_IMU_SCS_ERR_LOG); + device_printf(dev, "SCS error log %#llx\n", + (unsigned long long)val); + } + if ((imustat & FO_PCI_IMU_ERR_INT_EQ_OVER_P) != 0) { + fatal = 1; + val = FIRE_PCI_READ_8(sc, + FO_PCI_IMU_EQS_ERR_LOG); + device_printf(dev, "EQS error log %#llx\n", + (unsigned long long)val); + } + if ((imustat & (FO_PCI_IMU_ERR_INT_MSI_MAL_ERR_P | + FO_PCI_IMU_ERR_INT_MSI_PAR_ERR_P | + FO_PCI_IMU_ERR_INT_PMEACK_MES_NOT_EN_P | + FO_PCI_IMU_ERR_INT_PMPME_MES_NOT_EN_P | + FO_PCI_IMU_ERR_INT_FATAL_MES_NOT_EN_P | + FO_PCI_IMU_ERR_INT_NFATAL_MES_NOT_EN_P | + FO_PCI_IMU_ERR_INT_COR_MES_NOT_EN_P | + FO_PCI_IMU_ERR_INT_MSI_NOT_EN_P)) != 0) { + fatal = 1; + val = FIRE_PCI_READ_8(sc, + FO_PCI_IMU_RDS_ERR_LOG); + device_printf(dev, "RDS error log %#llx\n", + (unsigned long long)val); + } + } + if ((dmcstat & FO_PCI_DMC_CORE_BLOCK_INT_EN_MMU) != 0) { + fatal = 1; + mmustat = FIRE_PCI_READ_8(sc, FO_PCI_MMU_INT_STAT); + mmutfar = FIRE_PCI_READ_8(sc, + FO_PCI_MMU_TRANS_FAULT_ADDR); + mmutfsr = FIRE_PCI_READ_8(sc, + FO_PCI_MMU_TRANS_FAULT_STAT); + if ((mmustat & (FO_PCI_MMU_ERR_INT_TBW_DPE_P | + FO_PCI_MMU_ERR_INT_TBW_ERR_P | + FO_PCI_MMU_ERR_INT_TBW_UDE_P | + FO_PCI_MMU_ERR_INT_TBW_DME_P | + FO_PCI_MMU_ERR_INT_TTC_CAE_P | + FIRE_PCI_MMU_ERR_INT_TTC_DPE_P | + OBERON_PCI_MMU_ERR_INT_TTC_DUE_P | + FO_PCI_MMU_ERR_INT_TRN_ERR_P)) != 0) + fatal = 1; + else { + sc->sc_stats_mmu_err++; + FIRE_PCI_WRITE_8(sc, FO_PCI_MMU_ERR_STAT_CLR, + mmustat); + } + device_printf(dev, + "MMU error %#llx: TFAR %#llx TFSR %#llx\n", + (unsigned long long)mmustat, + (unsigned long long)mmutfar, + (unsigned long long)mmutfsr); + } + } + if ((mcstat & FO_PCI_MULTI_CORE_ERR_STAT_PEC) != 0) { + pecstat = FIRE_PCI_READ_8(sc, FO_PCI_PEC_CORE_BLOCK_INT_STAT); + if ((pecstat & FO_PCI_PEC_CORE_BLOCK_INT_STAT_UERR) != 0) { + fatal = 1; + uestat = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_UERR_INT_STAT); + device_printf(dev, + "DLU/TLU uncorrectable error %#llx\n", + (unsigned long long)uestat); + if ((uestat & (FO_PCI_TLU_UERR_INT_UR_P | + OBERON_PCI_TLU_UERR_INT_POIS_P | + FO_PCI_TLU_UERR_INT_MFP_P | + FO_PCI_TLU_UERR_INT_ROF_P | + FO_PCI_TLU_UERR_INT_UC_P | + FIRE_PCI_TLU_UERR_INT_PP_P | + OBERON_PCI_TLU_UERR_INT_POIS_P)) != 0) { + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_RX_UERR_HDR1_LOG); + device_printf(dev, + "receive header log %#llx\n", + (unsigned long long)val); + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_RX_UERR_HDR2_LOG); + device_printf(dev, + "receive header log 2 %#llx\n", + (unsigned long long)val); + } + if ((uestat & FO_PCI_TLU_UERR_INT_CTO_P) != 0) { + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_TX_UERR_HDR1_LOG); + device_printf(dev, + "transmit header log %#llx\n", + (unsigned long long)val); + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_TX_UERR_HDR2_LOG); + device_printf(dev, + "transmit header log 2 %#llx\n", + (unsigned long long)val); + } + if ((uestat & FO_PCI_TLU_UERR_INT_DLP_P) != 0) { + val = FIRE_PCI_READ_8(sc, + FO_PCI_LPU_LNK_LYR_INT_STAT); + device_printf(dev, + "link layer interrupt and status %#llx\n", + (unsigned long long)val); + } + if ((uestat & FO_PCI_TLU_UERR_INT_TE_P) != 0) { + val = FIRE_PCI_READ_8(sc, + FO_PCI_LPU_PHY_LYR_INT_STAT); + device_printf(dev, + "phy layer interrupt and status %#llx\n", + (unsigned long long)val); + } + } + if ((pecstat & FO_PCI_PEC_CORE_BLOCK_INT_STAT_CERR) != 0) { + sc->sc_stats_tlu_ce++; + cestat = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_CERR_INT_STAT); + device_printf(dev, + "DLU/TLU correctable error %#llx\n", + (unsigned long long)cestat); + val = FIRE_PCI_READ_8(sc, + FO_PCI_LPU_LNK_LYR_INT_STAT); + device_printf(dev, + "link layer interrupt and status %#llx\n", + (unsigned long long)val); + if ((cestat & FO_PCI_TLU_CERR_INT_RE_P) != 0) { + FIRE_PCI_WRITE_8(sc, + FO_PCI_LPU_LNK_LYR_INT_STAT, val); + val = FIRE_PCI_READ_8(sc, + FO_PCI_LPU_PHY_LYR_INT_STAT); + device_printf(dev, + "phy layer interrupt and status %#llx\n", + (unsigned long long)val); + } + FIRE_PCI_WRITE_8(sc, FO_PCI_TLU_CERR_STAT_CLR, + cestat); + } + if ((pecstat & FO_PCI_PEC_CORE_BLOCK_INT_STAT_OEVENT) != 0) { + oenfatal = 0; + oestat = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_OEVENT_INT_STAT); + device_printf(dev, "DLU/TLU other event %#llx\n", + (unsigned long long)oestat); + if ((oestat & (FO_PCI_TLU_OEVENT_MFC_P | + FO_PCI_TLU_OEVENT_MRC_P | + FO_PCI_TLU_OEVENT_WUC_P | + FO_PCI_TLU_OEVENT_RUC_P | + FO_PCI_TLU_OEVENT_CRS_P)) != 0) { + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_RX_OEVENT_HDR1_LOG); + device_printf(dev, + "receive header log %#llx\n", + (unsigned long long)val); + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_RX_OEVENT_HDR2_LOG); + device_printf(dev, + "receive header log 2 %#llx\n", + (unsigned long long)val); + if ((oestat & (FO_PCI_TLU_OEVENT_MFC_P | + FO_PCI_TLU_OEVENT_MRC_P | + FO_PCI_TLU_OEVENT_WUC_P | + FO_PCI_TLU_OEVENT_RUC_P)) != 0) + fatal = 1; + else { + sc->sc_stats_tlu_oe_rx_err++; + oenfatal = 1; + } + } + if ((oestat & (FO_PCI_TLU_OEVENT_MFC_P | + FO_PCI_TLU_OEVENT_CTO_P | + FO_PCI_TLU_OEVENT_WUC_P | + FO_PCI_TLU_OEVENT_RUC_P)) != 0) { + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_TX_OEVENT_HDR1_LOG); + device_printf(dev, + "transmit header log %#llx\n", + (unsigned long long)val); + val = FIRE_PCI_READ_8(sc, + FO_PCI_TLU_TX_OEVENT_HDR2_LOG); + device_printf(dev, + "transmit header log 2 %#llx\n", + (unsigned long long)val); + if ((oestat & (FO_PCI_TLU_OEVENT_MFC_P | + FO_PCI_TLU_OEVENT_CTO_P | + FO_PCI_TLU_OEVENT_WUC_P | + FO_PCI_TLU_OEVENT_RUC_P)) != 0) + fatal = 1; + else { + sc->sc_stats_tlu_oe_tx_err++; + oenfatal = 1; + } + } + if ((oestat & (FO_PCI_TLU_OEVENT_ERO_P | + FO_PCI_TLU_OEVENT_EMP_P | + FO_PCI_TLU_OEVENT_EPE_P | + FIRE_PCI_TLU_OEVENT_ERP_P | + OBERON_PCI_TLU_OEVENT_ERBU_P | + FIRE_PCI_TLU_OEVENT_EIP_P | + OBERON_PCI_TLU_OEVENT_EIUE_P)) != 0) { + fatal = 1; + val = FIRE_PCI_READ_8(sc, + FO_PCI_LPU_LNK_LYR_INT_STAT); + device_printf(dev, + "link layer interrupt and status %#llx\n", + (unsigned long long)val); + } + if ((oestat & (FO_PCI_TLU_OEVENT_IIP_P | + FO_PCI_TLU_OEVENT_EDP_P | + FIRE_PCI_TLU_OEVENT_EHP_P | + OBERON_PCI_TLU_OEVENT_TLUEITMO_S | + FO_PCI_TLU_OEVENT_ERU_P)) != 0) + fatal = 1; + if ((oestat & (FO_PCI_TLU_OEVENT_NFP_P | + FO_PCI_TLU_OEVENT_LWC_P | + FO_PCI_TLU_OEVENT_LIN_P | + FO_PCI_TLU_OEVENT_LRS_P | + FO_PCI_TLU_OEVENT_LDN_P | + FO_PCI_TLU_OEVENT_LUP_P)) != 0) + oenfatal = 1; + if (oenfatal != 0) { + sc->sc_stats_tlu_oe_non_fatal++; + FIRE_PCI_WRITE_8(sc, + FO_PCI_TLU_OEVENT_STAT_CLR, oestat); + if ((oestat & FO_PCI_TLU_OEVENT_LIN_P) != 0) + FIRE_PCI_WRITE_8(sc, + FO_PCI_LPU_LNK_LYR_INT_STAT, + FIRE_PCI_READ_8(sc, + FO_PCI_LPU_LNK_LYR_INT_STAT)); + } + } + if ((pecstat & FO_PCI_PEC_CORE_BLOCK_INT_STAT_ILU) != 0) { + ilustat = FIRE_PCI_READ_8(sc, FO_PCI_ILU_INT_STAT); + device_printf(dev, "ILU error %#llx\n", + (unsigned long long)ilustat); + if ((ilustat & (FIRE_PCI_ILU_ERR_INT_IHB_PE_P | + FIRE_PCI_ILU_ERR_INT_IHB_PE_P)) != 0) + fatal = 1; + else { + sc->sc_stats_ilu_err++; + FIRE_PCI_WRITE_8(sc, FO_PCI_ILU_INT_STAT, + ilustat); + } + } + } + mtx_unlock_spin(&sc->sc_pcib_mtx); + if (fatal != 0) + panic("%s: fatal DMC/PEC error", + device_get_nameunit(sc->sc_dev)); + return (FILTER_HANDLED); +} + +static int +fire_xcb(void *arg) +{ + struct fire_softc *sc; + device_t dev; + uint64_t errstat, intstat, val; + u_int fatal; + + fatal = 0; + sc = arg; + dev = sc->sc_dev; + mtx_lock_spin(&sc->sc_pcib_mtx); + if (sc->sc_mode == FIRE_MODE_OBERON) { + intstat = FIRE_CTRL_READ_8(sc, FO_XBC_INT_STAT); + device_printf(dev, "UBC error: interrupt status %#llx\n", + (unsigned long long)intstat); + if ((intstat & ~(OBERON_UBC_ERR_INT_DMARDUEB_P | + OBERON_UBC_ERR_INT_DMARDUEA_P)) != 0) + fatal = 1; + else + sc->sc_stats_ubc_dmardue++; + if (fatal != 0) { + mtx_unlock_spin(&sc->sc_pcib_mtx); + panic("%s: fatal UBC core block error", + device_get_nameunit(sc->sc_dev)); + } else { + FIRE_CTRL_SET(sc, FO_XBC_ERR_STAT_CLR, ~0ULL); + mtx_unlock_spin(&sc->sc_pcib_mtx); + } + } else { + errstat = FIRE_CTRL_READ_8(sc, FIRE_JBC_CORE_BLOCK_ERR_STAT); + if ((errstat & (FIRE_JBC_CORE_BLOCK_ERR_STAT_MERGE | + FIRE_JBC_CORE_BLOCK_ERR_STAT_JBCINT | + FIRE_JBC_CORE_BLOCK_ERR_STAT_DMCINT)) != 0) { + intstat = FIRE_CTRL_READ_8(sc, FO_XBC_INT_STAT); + device_printf(dev, "JBC interrupt status %#llx\n", + (unsigned long long)intstat); + if ((intstat & FIRE_JBC_ERR_INT_EBUS_TO_P) != 0) { + val = FIRE_CTRL_READ_8(sc, + FIRE_JBC_CSR_ERR_LOG); + device_printf(dev, "CSR error log %#llx\n", + (unsigned long long)val); + } + if ((intstat & (FIRE_JBC_ERR_INT_UNSOL_RD_P | + FIRE_JBC_ERR_INT_UNSOL_INT_P)) != 0) { + if ((intstat & + FIRE_JBC_ERR_INT_UNSOL_RD_P) != 0) + sc->sc_stats_jbc_unsol_rd++; + if ((intstat & + FIRE_JBC_ERR_INT_UNSOL_INT_P) != 0) + sc->sc_stats_jbc_unsol_int++; + val = FIRE_CTRL_READ_8(sc, + FIRE_DMCINT_IDC_ERR_LOG); + device_printf(dev, + "DMCINT IDC error log %#llx\n", + (unsigned long long)val); + } + if ((intstat & (FIRE_JBC_ERR_INT_MB_PER_P | + FIRE_JBC_ERR_INT_MB_PEW_P)) != 0) { + fatal = 1; + val = FIRE_CTRL_READ_8(sc, + FIRE_MERGE_TRANS_ERR_LOG); + device_printf(dev, + "merge transaction error log %#llx\n", + (unsigned long long)val); + } + if ((intstat & FIRE_JBC_ERR_INT_IJP_P) != 0) { + fatal = 1; + val = FIRE_CTRL_READ_8(sc, + FIRE_JBCINT_OTRANS_ERR_LOG); + device_printf(dev, + "JBCINT out transaction error log " + "%#llx\n", (unsigned long long)val); + val = FIRE_CTRL_READ_8(sc, + FIRE_JBCINT_OTRANS_ERR_LOG2); + device_printf(dev, + "JBCINT out transaction error log 2 " + "%#llx\n", (unsigned long long)val); + } + if ((intstat & (FIRE_JBC_ERR_INT_UE_ASYN_P | + FIRE_JBC_ERR_INT_CE_ASYN_P | + FIRE_JBC_ERR_INT_JTE_P | FIRE_JBC_ERR_INT_JBE_P | + FIRE_JBC_ERR_INT_JUE_P | + FIRE_JBC_ERR_INT_ICISE_P | + FIRE_JBC_ERR_INT_WR_DPE_P | + FIRE_JBC_ERR_INT_RD_DPE_P | + FIRE_JBC_ERR_INT_ILL_BMW_P | + FIRE_JBC_ERR_INT_ILL_BMR_P | + FIRE_JBC_ERR_INT_BJC_P)) != 0) { + if ((intstat & (FIRE_JBC_ERR_INT_UE_ASYN_P | + FIRE_JBC_ERR_INT_JTE_P | + FIRE_JBC_ERR_INT_JBE_P | + FIRE_JBC_ERR_INT_JUE_P | + FIRE_JBC_ERR_INT_ICISE_P | + FIRE_JBC_ERR_INT_WR_DPE_P | + FIRE_JBC_ERR_INT_RD_DPE_P | + FIRE_JBC_ERR_INT_ILL_BMW_P | + FIRE_JBC_ERR_INT_ILL_BMR_P | + FIRE_JBC_ERR_INT_BJC_P)) != 0) + fatal = 1; + else + sc->sc_stats_jbc_ce_async++; + val = FIRE_CTRL_READ_8(sc, + FIRE_JBCINT_ITRANS_ERR_LOG); + device_printf(dev, + "JBCINT in transaction error log %#llx\n", + (unsigned long long)val); + val = FIRE_CTRL_READ_8(sc, + FIRE_JBCINT_ITRANS_ERR_LOG2); + device_printf(dev, + "JBCINT in transaction error log 2 " + "%#llx\n", (unsigned long long)val); + } + if ((intstat & (FIRE_JBC_ERR_INT_PIO_UNMAP_RD_P | + FIRE_JBC_ERR_INT_ILL_ACC_RD_P | + FIRE_JBC_ERR_INT_PIO_UNMAP_P | + FIRE_JBC_ERR_INT_PIO_DPE_P | + FIRE_JBC_ERR_INT_PIO_CPE_P | + FIRE_JBC_ERR_INT_ILL_ACC_P)) != 0) { + fatal = 1; + val = FIRE_CTRL_READ_8(sc, + FIRE_JBC_CSR_ERR_LOG); + device_printf(dev, + "DMCINT ODCD error log %#llx\n", + (unsigned long long)val); + } + if ((intstat & (FIRE_JBC_ERR_INT_MB_PEA_P | + FIRE_JBC_ERR_INT_CPE_P | FIRE_JBC_ERR_INT_APE_P | + FIRE_JBC_ERR_INT_PIO_CPE_P | + FIRE_JBC_ERR_INT_JTCEEW_P | + FIRE_JBC_ERR_INT_JTCEEI_P | + FIRE_JBC_ERR_INT_JTCEER_P)) != 0) { + fatal = 1; + val = FIRE_CTRL_READ_8(sc, + FIRE_FATAL_ERR_LOG); + device_printf(dev, "fatal error log %#llx\n", + (unsigned long long)val); + val = FIRE_CTRL_READ_8(sc, + FIRE_FATAL_ERR_LOG2); + device_printf(dev, "fatal error log 2 " + "%#llx\n", (unsigned long long)val); + } + if (fatal != 0) { + mtx_unlock_spin(&sc->sc_pcib_mtx); + panic("%s: fatal JBC core block error", + device_get_nameunit(sc->sc_dev)); + } else { + FIRE_CTRL_SET(sc, FO_XBC_ERR_STAT_CLR, ~0ULL); + mtx_unlock_spin(&sc->sc_pcib_mtx); + } + } else { + mtx_unlock_spin(&sc->sc_pcib_mtx); + panic("%s: unknown JCB core block error status %#llx", + device_get_nameunit(sc->sc_dev), + (unsigned long long)errstat); + } + } + return (FILTER_HANDLED); +} + +static int +fire_pcie(void *arg) +{ + struct fire_msiqarg *fmqa; + struct fire_softc *sc; + struct fo_msiq_record *qrec; + device_t dev; + uint64_t word0; + u_int head, msg, msiq; + + fmqa = arg; + sc = fmqa->fmqa_fica.fica_sc; + dev = sc->sc_dev; + msiq = fmqa->fmqa_msiq; + mtx_lock_spin(&fmqa->fmqa_mtx); + head = (FIRE_PCI_READ_8(sc, fmqa->fmqa_head) & FO_PCI_EQ_HD_MASK) >> + FO_PCI_EQ_HD_SHFT; + qrec = &fmqa->fmqa_base[head]; + word0 = qrec->fomqr_word0; + for (;;) { + KASSERT((word0 & FO_MQR_WORD0_FMT_TYPE_MSG) != 0, + ("%s: received non-PCIe message in event queue %d " + "(word0 %#llx)", device_get_nameunit(dev), msiq, + (unsigned long long)word0)); + msg = (word0 & FO_MQR_WORD0_DATA0_MASK) >> + FO_MQR_WORD0_DATA0_SHFT; + +#define PCIE_MSG_CODE_ERR_COR 0x30 +#define PCIE_MSG_CODE_ERR_NONFATAL 0x31 +#define PCIE_MSG_CODE_ERR_FATAL 0x33 + + if (msg == PCIE_MSG_CODE_ERR_COR) + device_printf(dev, "correctable PCIe error\n"); + else if (msg == PCIE_MSG_CODE_ERR_NONFATAL || + msg == PCIE_MSG_CODE_ERR_FATAL) + panic("%s: %sfatal PCIe error", + device_get_nameunit(dev), + msg == PCIE_MSG_CODE_ERR_NONFATAL ? "non-" : ""); + else + panic("%s: received unknown PCIe message %#x", + device_get_nameunit(dev), msg); + qrec->fomqr_word0 &= ~FO_MQR_WORD0_FMT_TYPE_MASK; + head = (head + 1) % sc->sc_msiq_size; + qrec = &fmqa->fmqa_base[head]; + word0 = qrec->fomqr_word0; + if (__predict_true((word0 & FO_MQR_WORD0_FMT_TYPE_MASK) == 0)) + break; + } + FIRE_PCI_WRITE_8(sc, fmqa->fmqa_head, (head & FO_PCI_EQ_HD_MASK) << + FO_PCI_EQ_HD_SHFT); + if ((FIRE_PCI_READ_8(sc, fmqa->fmqa_tail) & + FO_PCI_EQ_TL_OVERR) != 0) { + device_printf(dev, "event queue %d overflow\n", msiq); + msiq <<= 3; + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_CTRL_CLR_BASE + msiq, + FIRE_PCI_READ_8(sc, FO_PCI_EQ_CTRL_CLR_BASE + msiq) | + FO_PCI_EQ_CTRL_CLR_COVERR); + } + mtx_unlock_spin(&fmqa->fmqa_mtx); + return (FILTER_HANDLED); +} + +static int +fire_maxslots(device_t dev) +{ + + return (1); +} + +static uint32_t +fire_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, + int width) +{ + struct fire_softc *sc; + bus_space_handle_t bh; + u_long offset = 0; + uint32_t r, wrd; + int i; + uint16_t shrt; + uint8_t byte; + + sc = device_get_softc(dev); + if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus || + slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCIE_REGMAX) + return (-1); + + offset = FO_CONF_OFF(bus, slot, func, reg); + bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG]; + switch (width) { + case 1: + i = bus_space_peek_1(sc->sc_pci_cfgt, bh, offset, &byte); + r = byte; + break; + case 2: + i = bus_space_peek_2(sc->sc_pci_cfgt, bh, offset, &shrt); + r = shrt; + break; + case 4: + i = bus_space_peek_4(sc->sc_pci_cfgt, bh, offset, &wrd); + r = wrd; + break; + default: + panic("%s: bad width", __func__); + /* NOTREACHED */ + } + + if (i) { +#ifdef FIRE_DEBUG + printf("%s: read data error reading: %d.%d.%d: 0x%x\n", + __func__, bus, slot, func, reg); +#endif + r = -1; + } + return (r); +} + +static void +fire_write_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, + uint32_t val, int width) +{ + struct fire_softc *sc; + bus_space_handle_t bh; + u_long offset = 0; + + sc = device_get_softc(dev); + if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus || + slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCIE_REGMAX) + return; + + offset = FO_CONF_OFF(bus, slot, func, reg); + bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG]; + switch (width) { + case 1: + bus_space_write_1(sc->sc_pci_cfgt, bh, offset, val); + break; + case 2: + bus_space_write_2(sc->sc_pci_cfgt, bh, offset, val); + break; + case 4: + bus_space_write_4(sc->sc_pci_cfgt, bh, offset, val); + break; + default: + panic("%s: bad width", __func__); + /* NOTREACHED */ + } +} + +static int +fire_route_interrupt(device_t bridge, device_t dev, int pin) +{ + struct fire_softc *sc; + struct ofw_pci_register reg; + ofw_pci_intr_t pintr, mintr; + uint8_t maskbuf[sizeof(reg) + sizeof(pintr)]; + + sc = device_get_softc(bridge); + pintr = pin; + if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo, + ®, sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr), + maskbuf) != 0) + return (mintr); + + device_printf(bridge, "could not route pin %d for device %d.%d\n", + pin, pci_get_slot(dev), pci_get_function(dev)); + return (PCI_INVALID_IRQ); +} + +static int +fire_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) +{ + struct fire_softc *sc; + + sc = device_get_softc(dev); + switch (which) { + case PCIB_IVAR_DOMAIN: + *result = device_get_unit(dev); + return (0); + case PCIB_IVAR_BUS: + *result = sc->sc_pci_secbus; + return (0); + } + return (ENOENT); +} + +#define VIS_BLOCKSIZE 64 + +static void +fire_dmamap_sync(bus_dma_tag_t dt __unused, bus_dmamap_t map, + bus_dmasync_op_t op) +{ + static u_char buf[VIS_BLOCKSIZE] __aligned(VIS_BLOCKSIZE); + register_t reg, s; + + if ((map->dm_flags & DMF_LOADED) == 0 || + (op & ~BUS_DMASYNC_POSTWRITE) == 0) + return; + + s = intr_disable(); + reg = rd(fprs); + wr(fprs, reg | FPRS_FEF, 0); + __asm __volatile("stda %%f0, [%0] %1" + : : "r" (buf), "n" (ASI_BLK_COMMIT_S)); + membar(Sync); + wr(fprs, reg, 0); + intr_restore(s); +} + +static void +fire_intr_enable(void *arg) +{ + struct intr_vector *iv; + struct fire_icarg *fica; + struct fire_softc *sc; + struct pcpu *pc; + uint64_t mr; + u_int ctrl, i; + + iv = arg; + fica = iv->iv_icarg; + sc = fica->fica_sc; + mr = FO_PCI_IMAP_V; + if (sc->sc_mode == FIRE_MODE_OBERON) + mr |= (iv->iv_mid << OBERON_PCI_IMAP_T_DESTID_SHFT) & + OBERON_PCI_IMAP_T_DESTID_MASK; + else + mr |= (iv->iv_mid << FIRE_PCI_IMAP_T_JPID_SHFT) & + FIRE_PCI_IMAP_T_JPID_MASK; + /* + * Given that all mondos for the same target are required to use the + * same interrupt controller we just use the CPU ID for indexing the + * latter. + */ + ctrl = 0; + for (i = 0; i < mp_ncpus; ++i) { + pc = pcpu_find(i); + if (pc == NULL || iv->iv_mid != pc->pc_mid) + continue; + ctrl = pc->pc_cpuid % 4; + break; + } + mr |= (1ULL << ctrl) << FO_PCI_IMAP_INT_CTRL_NUM_SHFT & + FO_PCI_IMAP_INT_CTRL_NUM_MASK; + FIRE_PCI_WRITE_8(sc, fica->fica_map, mr); +} + +static void +fire_intr_disable(void *arg) +{ + struct intr_vector *iv; + struct fire_icarg *fica; + struct fire_softc *sc; + + iv = arg; + fica = iv->iv_icarg; + sc = fica->fica_sc; + FIRE_PCI_WRITE_8(sc, fica->fica_map, + FIRE_PCI_READ_8(sc, fica->fica_map) & ~FO_PCI_IMAP_V); +} + +static void +fire_intr_assign(void *arg) +{ + struct intr_vector *iv; + struct fire_icarg *fica; + struct fire_softc *sc; + uint64_t mr; + + iv = arg; + fica = iv->iv_icarg; + sc = fica->fica_sc; + mr = FIRE_PCI_READ_8(sc, fica->fica_map); + if ((mr & FO_PCI_IMAP_V) != 0) { + FIRE_PCI_WRITE_8(sc, fica->fica_map, mr & ~FO_PCI_IMAP_V); + FIRE_PCI_BARRIER(sc, fica->fica_map, 8, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); + } + while (FIRE_PCI_READ_8(sc, fica->fica_clr) != INTCLR_IDLE) + ; + if ((mr & FO_PCI_IMAP_V) != 0) + fire_intr_enable(arg); +} + +static void +fire_intr_clear(void *arg) +{ + struct intr_vector *iv; + struct fire_icarg *fica; + + iv = arg; + fica = iv->iv_icarg; + FIRE_PCI_WRITE_8(fica->fica_sc, fica->fica_clr, INTCLR_IDLE); +} + +/* + * Given that the event queue implementation matches our current MD and MI + * interrupt frameworks like square pegs fit into round holes we are generous + * and use one event queue per MSI for now, which limits us to 35 MSIs/MSI-Xs + * per Host-PCIe-bridge (we use one event queue for the PCIe error messages). + * This seems tolerable as long as most devices just use one MSI/MSI-X anyway. + * Adding knowledge about MSIs/MSI-Xs to the MD interrupt code should allow us + * to decouple the 1:1 mapping at the cost of no longer being able to bind + * MSIs/MSI-Xs to specific CPUs as we currently have no reliable way to + * quiesce a device while we move its MSIs/MSI-Xs to another event queue. + */ + +static int +fire_alloc_msi(device_t dev, device_t child, int count, int maxcount __unused, + int *irqs) +{ + struct fire_softc *sc; + u_int i, j, msiqrun; + + if (powerof2(count) == 0 || count > 32) + return (EINVAL); + + sc = device_get_softc(dev); + mtx_lock(&sc->sc_msi_mtx); + msiqrun = 0; + for (i = 0; i < sc->sc_msiq_count; i++) { + for (j = i; j < i + count; j++) { + if (isclr(sc->sc_msiq_bitmap, j) == 0) + break; + } + if (j == i + count) { + msiqrun = i; + break; + } + } + if (i == sc->sc_msiq_count) { + mtx_unlock(&sc->sc_msi_mtx); + return (ENXIO); + } + for (i = 0; i + count < sc->sc_msi_count; i += count) { + for (j = i; j < i + count; j++) + if (isclr(sc->sc_msi_bitmap, j) == 0) + break; + if (j == i + count) { + for (j = 0; j < count; j++) { + setbit(sc->sc_msiq_bitmap, msiqrun + j); + setbit(sc->sc_msi_bitmap, i + j); + sc->sc_msi_msiq_table[i + j] = msiqrun + j; + irqs[j] = sc->sc_msi_first + i + j; + } + mtx_unlock(&sc->sc_msi_mtx); + return (0); + } + } + mtx_unlock(&sc->sc_msi_mtx); + return (ENXIO); +} + +static int +fire_release_msi(device_t dev, device_t child, int count, int *irqs) +{ + struct fire_softc *sc; + u_int i; + + sc = device_get_softc(dev); + mtx_lock(&sc->sc_msi_mtx); + for (i = 0; i < count; i++) { + clrbit(sc->sc_msiq_bitmap, + sc->sc_msi_msiq_table[irqs[i] - sc->sc_msi_first]); + clrbit(sc->sc_msi_bitmap, irqs[i] - sc->sc_msi_first); + } + mtx_unlock(&sc->sc_msi_mtx); + return (0); +} + +static int +fire_alloc_msix(device_t dev, device_t child, int *irq) +{ + struct fire_softc *sc; + u_int i, msiq; + + sc = device_get_softc(dev); + if ((sc->sc_flags & FIRE_MSIX) == 0) + return (ENXIO); + mtx_lock(&sc->sc_msi_mtx); + msiq = 0; + for (i = 0; i < sc->sc_msiq_count; i++) { + if (isclr(sc->sc_msiq_bitmap, i) != 0) { + msiq = i; + break; + } + } + if (i == sc->sc_msiq_count) { + mtx_unlock(&sc->sc_msi_mtx); + return (ENXIO); + } + for (i = sc->sc_msi_count - 1; i >= 0; i--) { + if (isclr(sc->sc_msi_bitmap, i) != 0) { + setbit(sc->sc_msiq_bitmap, msiq); + setbit(sc->sc_msi_bitmap, i); + sc->sc_msi_msiq_table[i] = msiq; + *irq = sc->sc_msi_first + i; + mtx_unlock(&sc->sc_msi_mtx); + return (0); + } + } + mtx_unlock(&sc->sc_msi_mtx); + return (ENXIO); +} + +static int +fire_release_msix(device_t dev, device_t child, int irq) +{ + struct fire_softc *sc; + + sc = device_get_softc(dev); + if ((sc->sc_flags & FIRE_MSIX) == 0) + return (ENXIO); + mtx_lock(&sc->sc_msi_mtx); + clrbit(sc->sc_msiq_bitmap, + sc->sc_msi_msiq_table[irq - sc->sc_msi_first]); + clrbit(sc->sc_msi_bitmap, irq - sc->sc_msi_first); + mtx_unlock(&sc->sc_msi_mtx); + return (0); +} + +static int +fire_map_msi(device_t dev, device_t child, int irq, uint64_t *addr, + uint32_t *data) +{ + struct fire_softc *sc; + struct pci_devinfo *dinfo; + + sc = device_get_softc(dev); + dinfo = device_get_ivars(child); + if (dinfo->cfg.msi.msi_alloc > 0) { + if ((irq & ~sc->sc_msi_data_mask) != 0) { + device_printf(dev, "invalid MSI 0x%x\n", irq); + return (EINVAL); + } + } else { + if ((sc->sc_flags & FIRE_MSIX) == 0) + return (ENXIO); + if (fls(irq) > sc->sc_msix_data_width) { + device_printf(dev, "invalid MSI-X 0x%x\n", irq); + return (EINVAL); + } + } + if (dinfo->cfg.msi.msi_alloc > 0 && + (dinfo->cfg.msi.msi_ctrl & PCIM_MSICTRL_64BIT) == 0) + *addr = sc->sc_msi_addr32; + else + *addr = sc->sc_msi_addr64; + *data = irq; + return (0); +} + +static void +fire_msiq_handler(void *cookie) +{ + struct intr_vector *iv; + struct fire_msiqarg *fmqa; + + iv = cookie; + fmqa = iv->iv_icarg; + /* + * Note that since fire_intr_clear() will clear the event queue + * interrupt after the handler associated with the MSI [sic] has + * been executed we have to protect the access to the event queue as + * otherwise nested event queue interrupts cause corruption of the + * event queue on MP machines. Obviously especially when abandoning + * the 1:1 mapping it would be better to not clear the event queue + * interrupt after each handler invocation but only once when the + * outstanding MSIs have been processed but unfortunately that + * doesn't work well and leads to interrupt storms with controllers/ + * drivers which don't mask interrupts while the handler is executed. + * Maybe delaying clearing the MSI until after the handler has been + * executed could be used to work around this but that's not the + * intended usage and might in turn cause lost MSIs. + */ + mtx_lock_spin(&fmqa->fmqa_mtx); + fire_msiq_common(iv, fmqa); + mtx_unlock_spin(&fmqa->fmqa_mtx); +} + +static void +fire_msiq_filter(void *cookie) +{ + struct intr_vector *iv; + struct fire_msiqarg *fmqa; + + iv = cookie; + fmqa = iv->iv_icarg; + /* + * For filters we don't use fire_intr_clear() since it would clear + * the event queue interrupt while we're still processing the event + * queue as filters and associated post-filter handler are executed + * directly, which in turn would lead to lost MSIs. So we clear the + * event queue interrupt only once after processing the event queue. + * Given that this still guarantees the filters to not be executed + * concurrently and no other CPU can clear the event queue interrupt + * while the event queue is still processed, we don't even need to + * interlock the access to the event queue in this case. + */ + critical_enter(); + fire_msiq_common(iv, fmqa); + FIRE_PCI_WRITE_8(fmqa->fmqa_fica.fica_sc, fmqa->fmqa_fica.fica_clr, + INTCLR_IDLE); + critical_exit(); +} + +static inline void +fire_msiq_common(struct intr_vector *iv, struct fire_msiqarg *fmqa) +{ + struct fire_softc *sc; + struct fo_msiq_record *qrec; + device_t dev; + uint64_t word0; + u_int head, msi, msiq; + + sc = fmqa->fmqa_fica.fica_sc; + dev = sc->sc_dev; + msiq = fmqa->fmqa_msiq; + head = (FIRE_PCI_READ_8(sc, fmqa->fmqa_head) & FO_PCI_EQ_HD_MASK) >> + FO_PCI_EQ_HD_SHFT; + qrec = &fmqa->fmqa_base[head]; + word0 = qrec->fomqr_word0; + for (;;) { + if (__predict_false((word0 & FO_MQR_WORD0_FMT_TYPE_MASK) == 0)) + break; + KASSERT((word0 & FO_MQR_WORD0_FMT_TYPE_MSI64) != 0 || + (word0 & FO_MQR_WORD0_FMT_TYPE_MSI32) != 0, + ("%s: received non-MSI/MSI-X message in event queue %d " + "(word0 %#llx)", device_get_nameunit(dev), msiq, + (unsigned long long)word0)); + msi = (word0 & FO_MQR_WORD0_DATA0_MASK) >> + FO_MQR_WORD0_DATA0_SHFT; + /* + * Sanity check the MSI/MSI-X as long as we use a 1:1 mapping. + */ + KASSERT(msi == fmqa->fmqa_msi, + ("%s: received non-matching MSI/MSI-X in event queue %d " + "(%d versus %d)", device_get_nameunit(dev), msiq, msi, + fmqa->fmqa_msi)); + FIRE_PCI_WRITE_8(sc, FO_PCI_MSI_CLR_BASE + (msi << 3), + FO_PCI_MSI_CLR_EQWR_N); + if (__predict_false(intr_event_handle(iv->iv_event, + NULL) != 0)) + printf("stray MSI/MSI-X in event queue %d\n", msiq); + qrec->fomqr_word0 &= ~FO_MQR_WORD0_FMT_TYPE_MASK; + head = (head + 1) % sc->sc_msiq_size; + qrec = &fmqa->fmqa_base[head]; + word0 = qrec->fomqr_word0; + } + FIRE_PCI_WRITE_8(sc, fmqa->fmqa_head, (head & FO_PCI_EQ_HD_MASK) << + FO_PCI_EQ_HD_SHFT); + if (__predict_false((FIRE_PCI_READ_8(sc, fmqa->fmqa_tail) & + FO_PCI_EQ_TL_OVERR) != 0)) { + device_printf(dev, "event queue %d overflow\n", msiq); + msiq <<= 3; + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_CTRL_CLR_BASE + msiq, + FIRE_PCI_READ_8(sc, FO_PCI_EQ_CTRL_CLR_BASE + msiq) | + FO_PCI_EQ_CTRL_CLR_COVERR); + } +} + +static int +fire_setup_intr(device_t dev, device_t child, struct resource *ires, + int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, + void **cookiep) +{ + struct fire_softc *sc; + struct fire_msiqarg *fmqa; + u_long vec; + int error; + u_int msi, msiq; + + sc = device_get_softc(dev); + /* + * XXX this assumes that a device only has one INTx, while in fact + * Cassini+ and Saturn can use all four the firmware has assigned + * to them, but so does pci(4). + */ + if (rman_get_rid(ires) != 0) { + msi = rman_get_start(ires); + msiq = sc->sc_msi_msiq_table[msi - sc->sc_msi_first]; + vec = INTMAP_VEC(sc->sc_ign, sc->sc_msiq_ino_first + msiq); + msiq += sc->sc_msiq_first; + if (intr_vectors[vec].iv_ic != &fire_ic) { + device_printf(dev, + "invalid interrupt controller for vector 0x%lx\n", + vec); + return (EINVAL); + } + /* + * The MD interrupt code needs the vector rather than the MSI. + */ + rman_set_start(ires, vec); + rman_set_end(ires, vec); + error = bus_generic_setup_intr(dev, child, ires, flags, filt, + intr, arg, cookiep); + rman_set_start(ires, msi); + rman_set_end(ires, msi); + if (error != 0) + return (error); + fmqa = intr_vectors[vec].iv_icarg; + /* + * XXX inject our event queue handler. + */ + if (filt != NULL) { + intr_vectors[vec].iv_func = fire_msiq_filter; + intr_vectors[vec].iv_ic = &fire_msiqc_filter; + /* + * Ensure the event queue interrupt is cleared, it + * might have triggered before. Given we supply NULL + * as ic_clear, inthand_add() won't do this for us. + */ + FIRE_PCI_WRITE_8(sc, fmqa->fmqa_fica.fica_clr, + INTCLR_IDLE); + } else + intr_vectors[vec].iv_func = fire_msiq_handler; + /* Record the MSI/MSI-X as long as we we use a 1:1 mapping. */ + fmqa->fmqa_msi = msi; + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_CTRL_SET_BASE + (msiq << 3), + FO_PCI_EQ_CTRL_SET_EN); + msi <<= 3; + FIRE_PCI_WRITE_8(sc, FO_PCI_MSI_MAP_BASE + msi, + (FIRE_PCI_READ_8(sc, FO_PCI_MSI_MAP_BASE + msi) & + ~FO_PCI_MSI_MAP_EQNUM_MASK) | + ((msiq << FO_PCI_MSI_MAP_EQNUM_SHFT) & + FO_PCI_MSI_MAP_EQNUM_MASK)); + FIRE_PCI_WRITE_8(sc, FO_PCI_MSI_CLR_BASE + msi, + FO_PCI_MSI_CLR_EQWR_N); + FIRE_PCI_WRITE_8(sc, FO_PCI_MSI_MAP_BASE + msi, + FIRE_PCI_READ_8(sc, FO_PCI_MSI_MAP_BASE + msi) | + FO_PCI_MSI_MAP_V); + return (error); + } + + /* + * Make sure the vector is fully specified and we registered + * our interrupt controller for it. + */ + vec = rman_get_start(ires); + if (INTIGN(vec) != sc->sc_ign) { + device_printf(dev, "invalid interrupt vector 0x%lx\n", vec); + return (EINVAL); + } + if (intr_vectors[vec].iv_ic != &fire_ic) { + device_printf(dev, + "invalid interrupt controller for vector 0x%lx\n", vec); + return (EINVAL); + } + return (bus_generic_setup_intr(dev, child, ires, flags, filt, intr, + arg, cookiep)); +} + +static int +fire_teardown_intr(device_t dev, device_t child, struct resource *ires, + void *cookie) +{ + struct fire_softc *sc; + u_long vec; + int error; + u_int msi, msiq; + + sc = device_get_softc(dev); + if (rman_get_rid(ires) != 0) { + msi = rman_get_start(ires); + msiq = sc->sc_msi_msiq_table[msi - sc->sc_msi_first]; + vec = INTMAP_VEC(sc->sc_ign, msiq + sc->sc_msiq_ino_first); + msiq += sc->sc_msiq_first; + msi <<= 3; + FIRE_PCI_WRITE_8(sc, FO_PCI_MSI_MAP_BASE + msi, + FIRE_PCI_READ_8(sc, FO_PCI_MSI_MAP_BASE + msi) & + ~FO_PCI_MSI_MAP_V); + msiq <<= 3; + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_CTRL_CLR_BASE + msiq, + FO_PCI_EQ_CTRL_CLR_COVERR | FO_PCI_EQ_CTRL_CLR_E2I | + FO_PCI_EQ_CTRL_CLR_DIS); + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_TL_BASE + msiq, + (0 << FO_PCI_EQ_TL_SHFT) & FO_PCI_EQ_TL_MASK); + FIRE_PCI_WRITE_8(sc, FO_PCI_EQ_HD_BASE + msiq, + (0 << FO_PCI_EQ_HD_SHFT) & FO_PCI_EQ_HD_MASK); + intr_vectors[vec].iv_ic = &fire_ic; + /* + * The MD interrupt code needs the vector rather than the MSI. + */ + rman_set_start(ires, vec); + rman_set_end(ires, vec); + error = bus_generic_teardown_intr(dev, child, ires, cookie); + msi >>= 3; + rman_set_start(ires, msi); + rman_set_end(ires, msi); + return (error); + } + return (bus_generic_teardown_intr(dev, child, ires, cookie)); +} + +static struct resource * +fire_alloc_resource(device_t bus, device_t child, int type, int *rid, + u_long start, u_long end, u_long count, u_int flags) +{ + struct fire_softc *sc; + struct resource *rv; + struct rman *rm; + bus_space_tag_t bt; + bus_space_handle_t bh; + int needactivate = flags & RF_ACTIVE; + + flags &= ~RF_ACTIVE; + + sc = device_get_softc(bus); + if (type == SYS_RES_IRQ) { + /* + * XXX: Don't accept blank ranges for now, only single + * interrupts. The other case should not happen with + * the MI PCI code... + * XXX: This may return a resource that is out of the + * range that was specified. Is this correct...? + */ + if (start != end) + panic("%s: XXX: interrupt range", __func__); + if (*rid == 0) + start = end = INTMAP_VEC(sc->sc_ign, end); + return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, + type, rid, start, end, count, flags)); + } + switch (type) { + case SYS_RES_MEMORY: + rm = &sc->sc_pci_mem_rman; + bt = sc->sc_pci_memt; + bh = sc->sc_pci_bh[OFW_PCI_CS_MEM32]; + break; + case SYS_RES_IOPORT: + rm = &sc->sc_pci_io_rman; + bt = sc->sc_pci_iot; + bh = sc->sc_pci_bh[OFW_PCI_CS_IO]; + break; + default: + return (NULL); + /* NOTREACHED */ + } + + rv = rman_reserve_resource(rm, start, end, count, flags, child); + if (rv == NULL) + return (NULL); + rman_set_rid(rv, *rid); + bh += rman_get_start(rv); + rman_set_bustag(rv, bt); + rman_set_bushandle(rv, bh); + + if (needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + return (rv); +} + +static int +fire_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + void *p; + int error; + + if (type == SYS_RES_IRQ) + return (BUS_ACTIVATE_RESOURCE(device_get_parent(bus), child, + type, rid, r)); + if (type == SYS_RES_MEMORY) { + /* + * Need to memory-map the device space, as some drivers + * depend on the virtual address being set and usable. + */ + error = sparc64_bus_mem_map(rman_get_bustag(r), + rman_get_bushandle(r), rman_get_size(r), 0, 0, &p); + if (error != 0) + return (error); + rman_set_virtual(r, p); + } + return (rman_activate_resource(r)); +} + +static int +fire_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + if (type == SYS_RES_IRQ) + return (BUS_DEACTIVATE_RESOURCE(device_get_parent(bus), child, + type, rid, r)); + if (type == SYS_RES_MEMORY) { + sparc64_bus_mem_unmap(rman_get_virtual(r), rman_get_size(r)); + rman_set_virtual(r, NULL); + } + return (rman_deactivate_resource(r)); +} + +static int +fire_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + int error; + + if (type == SYS_RES_IRQ) + return (BUS_RELEASE_RESOURCE(device_get_parent(bus), child, + type, rid, r)); + if (rman_get_flags(r) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, r); + if (error) + return (error); + } + return (rman_release_resource(r)); +} + +static bus_dma_tag_t +fire_get_dma_tag(device_t bus, device_t child) +{ + struct fire_softc *sc; + + sc = device_get_softc(bus); + return (sc->sc_pci_dmat); +} + +static phandle_t +fire_get_node(device_t bus, device_t dev) +{ + struct fire_softc *sc; + + sc = device_get_softc(bus); + /* We only have one child, the PCI bus, which needs our own node. */ + return (sc->sc_node); +} + +static bus_space_tag_t +fire_alloc_bus_tag(struct fire_softc *sc, int type) +{ + bus_space_tag_t bt; + + bt = malloc(sizeof(struct bus_space_tag), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (bt == NULL) + panic("%s: out of memory", __func__); + + bt->bst_cookie = sc; + bt->bst_parent = rman_get_bustag(sc->sc_mem_res[FIRE_PCI]); + bt->bst_type = type; + return (bt); +} + +static u_int +fire_get_timecount(struct timecounter *tc) +{ + struct fire_softc *sc; + + sc = tc->tc_priv; + return (FIRE_CTRL_READ_8(sc, FO_XBC_PRF_CNT0) & TC_COUNTER_MAX_MASK); +} diff --git a/sys/sparc64/pci/firereg.h b/sys/sparc64/pci/firereg.h new file mode 100644 index 000000000000..1471b09de99d --- /dev/null +++ b/sys/sparc64/pci/firereg.h @@ -0,0 +1,1004 @@ +/*- + * Copyright (c) 2009 Marius Strobl + * 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$ + */ + +#ifndef _SPARC64_PCI_FIREREG_H_ +#define _SPARC64_PCI_FIREREG_H_ + +#define FIRE_NINTR 3 /* 2 OFW + 1 MSIq */ +#define FIRE_NRANGE 4 +#define FIRE_NREG 2 + +#define FIRE_PCI 0 +#define FIRE_CTRL 1 + +/* PCI configuration and status registers */ +#define FO_PCI_INT_MAP_BASE 0x01000 +#define FO_PCI_INT_CLR_BASE 0x01400 +#define FO_PCI_EQ_BASE_ADDR 0x10000 +#define FO_PCI_EQ_CTRL_SET_BASE 0x11000 +#define FO_PCI_EQ_CTRL_CLR_BASE 0x11200 +#define FO_PCI_EQ_TL_BASE 0x11600 +#define FO_PCI_EQ_HD_BASE 0x11800 +#define FO_PCI_MSI_MAP_BASE 0x20000 +#define FO_PCI_MSI_CLR_BASE 0x28000 +#define FO_PCI_ERR_COR 0x30000 +#define FO_PCI_ERR_NONFATAL 0x30008 +#define FO_PCI_ERR_FATAL 0x30010 +#define FO_PCI_PM_PME 0x30018 +#define FO_PCI_PME_TO_ACK 0x30020 +#define FO_PCI_IMU_INT_EN 0x31008 +#define FO_PCI_IMU_INT_STAT 0x31010 +#define FO_PCI_IMU_ERR_STAT_CLR 0x31018 +#define FO_PCI_IMU_RDS_ERR_LOG 0x31028 +#define FO_PCI_IMU_SCS_ERR_LOG 0x31030 +#define FO_PCI_IMU_EQS_ERR_LOG 0x31038 +#define FO_PCI_DMC_CORE_BLOCK_INT_EN 0x31800 +#define FO_PCI_DMC_CORE_BLOCK_ERR_STAT 0x31808 +#define FO_PCI_MULTI_CORE_ERR_STAT 0x31810 +#define FO_PCI_MSI_32_BIT_ADDR 0x34000 +#define FO_PCI_MSI_64_BIT_ADDR 0x34008 +#define FO_PCI_MMU 0x40000 +#define FO_PCI_MMU_INT_EN 0x41008 +#define FO_PCI_MMU_INT_STAT 0x41010 +#define FO_PCI_MMU_ERR_STAT_CLR 0x41018 +#define FO_PCI_MMU_TRANS_FAULT_ADDR 0x41028 +#define FO_PCI_MMU_TRANS_FAULT_STAT 0x41030 +#define FO_PCI_ILU_INT_EN 0x51008 +#define FO_PCI_ILU_INT_STAT 0x51010 +#define FO_PCI_ILU_ERR_STAT_CLR 0x51018 +#define FO_PCI_DMC_DBG_SEL_PORTA 0x53000 +#define FO_PCI_DMC_DBG_SEL_PORTB 0x53008 +#define FO_PCI_PEC_CORE_BLOCK_INT_EN 0x51800 +#define FO_PCI_PEC_CORE_BLOCK_INT_STAT 0x51808 +#define FO_PCI_TLU_CTRL 0x80000 +#define FO_PCI_TLU_OEVENT_INT_EN 0x81008 +#define FO_PCI_TLU_OEVENT_INT_STAT 0x81010 +#define FO_PCI_TLU_OEVENT_STAT_CLR 0x81018 +#define FO_PCI_TLU_RX_OEVENT_HDR1_LOG 0x81028 +#define FO_PCI_TLU_RX_OEVENT_HDR2_LOG 0x81030 +#define FO_PCI_TLU_TX_OEVENT_HDR1_LOG 0x81038 +#define FO_PCI_TLU_TX_OEVENT_HDR2_LOG 0x81040 +#define FO_PCI_TLU_DEV_CTRL 0x90008 +#define FO_PCI_TLU_LNK_CTRL 0x90020 +#define FO_PCI_TLU_LNK_STAT 0x90028 +#define FO_PCI_TLU_UERR_INT_EN 0x91008 +#define FO_PCI_TLU_UERR_INT_STAT 0x91010 +#define FO_PCI_TLU_UERR_STAT_CLR 0x91018 +#define FO_PCI_TLU_RX_UERR_HDR1_LOG 0x91028 +#define FO_PCI_TLU_RX_UERR_HDR2_LOG 0x91030 +#define FO_PCI_TLU_TX_UERR_HDR1_LOG 0x91038 +#define FO_PCI_TLU_TX_UERR_HDR2_LOG 0x91040 +#define FO_PCI_TLU_CERR_INT_EN 0xa1008 +#define FO_PCI_TLU_CERR_INT_STAT 0xa1010 +#define FO_PCI_TLU_CERR_STAT_CLR 0xa1018 +#define FO_PCI_LPU_RST 0xe2008 +#define FO_PCI_LPU_INT_STAT 0xe2040 +#define FO_PCI_LPU_INT_MASK 0xe0248 +#define FO_PCI_LPU_LNK_LYR_CFG 0xe2200 +#define FO_PCI_LPU_LNK_LYR_INT_STAT 0xe2210 +#define FO_PCI_LPU_FLW_CTRL_UPDT_CTRL 0xe2240 +#define FO_PCI_LPU_TXLNK_FREQ_LAT_TMR_THRS 0xe2400 +#define FO_PCI_LPU_TXLNK_RPLY_TMR_THRS 0xe2410 +#define FO_PCI_LPU_TXLNK_RTR_FIFO_PTR 0xe2430 +#define FO_PCI_LPU_PHY_LYR_INT_STAT 0xe2610 +#define FO_PCI_LPU_LTSSM_CFG2 0xe2788 +#define FO_PCI_LPU_LTSSM_CFG3 0xe2790 +#define FO_PCI_LPU_LTSSM_CFG4 0xe2798 +#define FO_PCI_LPU_LTSSM_CFG5 0xe27a0 + +/* PCI interrupt mapping registers */ +#define FO_PCI_IMAP_MDO_MODE 0x8000000000000000ULL +#define FO_PCI_IMAP_V 0x0000000080000000ULL +#define FIRE_PCI_IMAP_T_JPID_MASK 0x000000007c000000ULL +#define FIRE_PCI_IMAP_T_JPID_SHFT 26 +#define OBERON_PCI_IMAP_T_DESTID_MASK 0x000000007fe00000ULL +#define OBERON_PCI_IMAP_T_DESTID_SHFT 21 +#define FO_PCI_IMAP_INT_CTRL_NUM_MASK 0x00000000000003c0ULL +#define FO_PCI_IMAP_INT_CTRL_NUM_SHFT 6 + +/* PCI interrupt clear registers - use INTCLR_* from */ + +/* PCI event queue base address register */ +#define FO_PCI_EQ_BASE_ADDR_BYPASS 0xfffc000000000000ULL +#define FO_PCI_EQ_BASE_ADDR_MASK 0xfffffffffff80000ULL +#define FO_PCI_EQ_BASE_ADDR_SHFT 19 + +/* PCI event queue control set registers */ +#define FO_PCI_EQ_CTRL_SET_ENOVERR 0x0200000000000000ULL +#define FO_PCI_EQ_CTRL_SET_EN 0x0000100000000000ULL + +/* PCI event queue control clear registers */ +#define FO_PCI_EQ_CTRL_CLR_COVERR 0x0200000000000000ULL +#define FO_PCI_EQ_CTRL_CLR_E2I 0x0000800000000000ULL +#define FO_PCI_EQ_CTRL_CLR_DIS 0x0000100000000000ULL + +/* PCI event queue tail registers */ +#define FO_PCI_EQ_TL_OVERR 0x0200000000000000ULL +#define FO_PCI_EQ_TL_MASK 0x000000000000007fULL +#define FO_PCI_EQ_TL_SHFT 0 + +/* PCI event queue head registers */ +#define FO_PCI_EQ_HD_MASK 0x000000000000007fULL +#define FO_PCI_EQ_HD_SHFT 0 + +/* PCI MSI mapping registers */ +#define FO_PCI_MSI_MAP_V 0x8000000000000000ULL +#define FO_PCI_MSI_MAP_EQWR_N 0x4000000000000000ULL +#define FO_PCI_MSI_MAP_EQNUM_MASK 0x000000000000003fULL +#define FO_PCI_MSI_MAP_EQNUM_SHFT 0 + +/* PCI MSI clear registers */ +#define FO_PCI_MSI_CLR_EQWR_N 0x4000000000000000ULL + +/* + * PCI IMU interrupt enable, interrupt status and error status clear + * registers + */ +#define FO_PCI_IMU_ERR_INT_SPARE_S_MASK 0x00007c0000000000ULL +#define FO_PCI_IMU_ERR_INT_SPARE_S_SHFT 42 +#define FO_PCI_IMU_ERR_INT_EQ_OVER_S 0x0000020000000000ULL +#define FO_PCI_IMU_ERR_INT_EQ_NOT_EN_S 0x0000010000000000ULL +#define FO_PCI_IMU_ERR_INT_MSI_MAL_ERR_S 0x0000008000000000ULL +#define FO_PCI_IMU_ERR_INT_MSI_PAR_ERR_S 0x0000004000000000ULL +#define FO_PCI_IMU_ERR_INT_PMEACK_MES_NOT_EN_S 0x0000002000000000ULL +#define FO_PCI_IMU_ERR_INT_PMPME_MES_NOT_EN_S 0x0000001000000000ULL +#define FO_PCI_IMU_ERR_INT_FATAL_MES_NOT_EN_S 0x0000000800000000ULL +#define FO_PCI_IMU_ERR_INT_NFATAL_MES_NOT_EN_S 0x0000000400000000ULL +#define FO_PCI_IMU_ERR_INT_COR_MES_NOT_EN_S 0x0000000200000000ULL +#define FO_PCI_IMU_ERR_INT_MSI_NOT_EN_S 0x0000000100000000ULL +#define FO_PCI_IMU_ERR_INT_SPARE_P_MASK 0x0000000000007c00ULL +#define FO_PCI_IMU_ERR_INT_SPARE_P_SHFT 10 +#define FO_PCI_IMU_ERR_INT_EQ_OVER_P 0x0000000000000200ULL +#define FO_PCI_IMU_ERR_INT_EQ_NOT_EN_P 0x0000000000000100ULL +#define FO_PCI_IMU_ERR_INT_MSI_MAL_ERR_P 0x0000000000000080ULL +#define FO_PCI_IMU_ERR_INT_MSI_PAR_ERR_P 0x0000000000000040ULL +#define FO_PCI_IMU_ERR_INT_PMEACK_MES_NOT_EN_P 0x0000000000000020ULL +#define FO_PCI_IMU_ERR_INT_PMPME_MES_NOT_EN_P 0x0000000000000010ULL +#define FO_PCI_IMU_ERR_INT_FATAL_MES_NOT_EN_P 0x0000000000000008ULL +#define FO_PCI_IMU_ERR_INT_NFATAL_MES_NOT_EN_P 0x0000000000000004ULL +#define FO_PCI_IMU_ERR_INT_COR_MES_NOT_EN_P 0x0000000000000002ULL +#define FO_PCI_IMU_ERR_INT_MSI_NOT_EN_P 0x0000000000000001ULL + +/* PCI IMU RDS error log register */ +#define FO_PCI_IMU_RDS_ERR_LOG_TYPE_MASK 0xfc00000000000000ULL +#define FO_PCI_IMU_RDS_ERR_LOG_TYPE_SHFT 58 +#define FO_PCI_IMU_RDS_ERR_LOG_LENGTH_MASK 0x03ff000000000000ULL +#define FO_PCI_IMU_RDS_ERR_LOG_LENGTH_SHFT 48 +#define FO_PCI_IMU_RDS_ERR_LOG_REQ_ID_MASK 0x0000ffff00000000ULL +#define FO_PCI_IMU_RDS_ERR_LOG_REQ_ID_SHFT 32 +#define FO_PCI_IMU_RDS_ERR_LOG_TLP_TAG_MASK 0x00000000ff000000ULL +#define FO_PCI_IMU_RDS_ERR_LOG_TLP_TAG_SHFT 24 +#define FO_PCI_IMU_RDS_ERR_LOG_BE_MCODE_MASK 0x0000000000ff0000ULL +#define FO_PCI_IMU_RDS_ERR_LOG_BE_MCODE_SHFT 16 +#define FO_PCI_IMU_RDS_ERR_LOG_MSI_DATA_MASK 0x000000000000ffffULL +#define FO_PCI_IMU_RDS_ERR_LOG_MSI_DATA_SHFT 0 + +/* PCI IMU SCS error log register */ +#define FO_PCI_IMU_SCS_ERR_LOG_TYPE_MASK 0xfc00000000000000ULL +#define FO_PCI_IMU_SCS_ERR_LOG_TYPE_SHFT 58 +#define FO_PCI_IMU_SCS_ERR_LOG_LENGTH_MASK 0x03ff000000000000ULL +#define FO_PCI_IMU_SCS_ERR_LOG_LENGTH_SHFT 48 +#define FO_PCI_IMU_SCS_ERR_LOG_REQ_ID_MASK 0x0000ffff00000000ULL +#define FO_PCI_IMU_SCS_ERR_LOG_REQ_ID_SHFT 32 +#define FO_PCI_IMU_SCS_ERR_LOG_TLP_TAG_MASK 0x00000000ff000000ULL +#define FO_PCI_IMU_SCS_ERR_LOG_TLP_TAG_SHFT 24 +#define FO_PCI_IMU_SCS_ERR_LOG_BE_MODE_MASK 0x0000000000ff0000ULL +#define FO_PCI_IMU_SCS_ERR_LOG_BE_MCODE_SHFT 16 +#define FO_PCI_IMU_SCS_ERR_LOG_EQ_NUM_MASK 0x000000000000003fULL +#define FO_PCI_IMU_SCS_ERR_LOG_EQ_NUM_SHFT 0 + +/* PCI IMU EQS error log register */ +#define FO_PCI_IMU_EQS_ERR_LOG_EQ_NUM_MASK 0x000000000000003fULL +#define FO_PCI_IMU_EQS_ERROR_LOG_EQ_NUM_SHFT 0 + +/* + * PCI ERR COR, ERR NONFATAL, ERR FATAL, PM PME and PME To ACK mapping + * registers + */ +#define FO_PCI_ERR_PME_V 0x8000000000000000ULL +#define FO_PCI_ERR_PME_EQNUM_MASK 0x000000000000003fULL +#define FO_PCI_ERR_PME_EQNUM_SHFT 0 + +/* PCI DMC core and block interrupt enable register */ +#define FO_PCI_DMC_CORE_BLOCK_INT_EN_DMC 0x8000000000000000ULL +#define FO_PCI_DMC_CORE_BLOCK_INT_EN_MMU 0x0000000000000002ULL +#define FO_PCI_DMC_CORE_BLOCK_INT_EN_IMU 0x0000000000000001ULL + +/* PCI DMC core and block error status register */ +#define FO_PCI_DMC_CORE_BLOCK_ERR_STAT_MMU 0x0000000000000002ULL +#define FO_PCI_DMC_CORE_BLOCK_ERR_STAT_IMU 0x0000000000000001ULL + +/* PCI multi core error status register */ +#define FO_PCI_MULTI_CORE_ERR_STAT_PEC 0x0000000000000002ULL +#define FO_PCI_MULTI_CORE_ERR_STAT_DMC 0x0000000000000001ULL + +/* PCI MSI 32-bit address register */ +#define FO_PCI_MSI_32_BIT_ADDR_MASK 0x00000000ffff0000ULL +#define FO_PCI_MSI_32_BIT_ADDR_SHFT 16 + +/* PCI MSI 64-bit address register */ +#define FO_PCI_MSI_64_BIT_ADDR_MASK 0x0000ffffffff0000ULL +#define FO_PCI_MSI_64_BIT_ADDR_SHFT 16 + +/* + * PCI MMU interrupt enable, interrupt status and error status clear + * registers + */ +#define FO_PCI_MMU_ERR_INT_S_MASK 0x0000ffff00000000ULL +#define FO_PCI_MMU_ERR_INT_S_SHFT 32 +#define FO_PCI_MMU_ERR_INT_TBW_DPE_S 0x0000800000000000ULL +#define FO_PCI_MMU_ERR_INT_TBW_ERR_S 0x0000400000000000ULL +#define FO_PCI_MMU_ERR_INT_TBW_UDE_S 0x0000200000000000ULL +#define FO_PCI_MMU_ERR_INT_TBW_DME_S 0x0000100000000000ULL +#define FO_PCI_MMU_ERR_INT_SPARE3_S 0x0000080000000000ULL +#define FO_PCI_MMU_ERR_INT_SPARE2_S 0x0000040000000000ULL +#define FO_PCI_MMU_ERR_INT_TTC_CAE_S 0x0000020000000000ULL +#define FIRE_PCI_MMU_ERR_INT_TTC_DPE_S 0x0000010000000000ULL +#define OBERON_PCI_MMU_ERR_INT_TTC_DUE_S 0x0000010000000000ULL +#define FO_PCI_MMU_ERR_INT_TTE_PRT_S 0x0000008000000000ULL +#define FO_PCI_MMU_ERR_INT_TTE_INV_S 0x0000004000000000ULL +#define FO_PCI_MMU_ERR_INT_TRN_OOR_S 0x0000002000000000ULL +#define FO_PCI_MMU_ERR_INT_TRN_ERR_S 0x0000001000000000ULL +#define FO_PCI_MMU_ERR_INT_SPARE1_S 0x0000000800000000ULL +#define FO_PCI_MMU_ERR_INT_SPARE0_S 0x0000000400000000ULL +#define FO_PCI_MMU_ERR_INT_BYP_OOR_S 0x0000000200000000ULL +#define FO_PCI_MMU_ERR_INT_BYP_ERR_S 0x0000000100000000ULL +#define FO_PCI_MMU_ERR_INT_P_MASK 0x000000000000ffffULL +#define FO_PCI_MMU_ERR_INT_P_SHFT 0 +#define FO_PCI_MMU_ERR_INT_TBW_DPE_P 0x0000000000008000ULL +#define FO_PCI_MMU_ERR_INT_TBW_ERR_P 0x0000000000004000ULL +#define FO_PCI_MMU_ERR_INT_TBW_UDE_P 0x0000000000002000ULL +#define FO_PCI_MMU_ERR_INT_TBW_DME_P 0x0000000000001000ULL +#define FO_PCI_MMU_ERR_INT_SPARE3_P 0x0000000000000800ULL +#define FO_PCI_MMU_ERR_INT_SPARE2_P 0x0000000000000400ULL +#define FO_PCI_MMU_ERR_INT_TTC_CAE_P 0x0000000000000200ULL +#define FIRE_PCI_MMU_ERR_INT_TTC_DPE_P 0x0000000000000100ULL +#define OBERON_PCI_MMU_ERR_INT_TTC_DUE_P 0x0000000000000100ULL +#define FO_PCI_MMU_ERR_INT_TTE_PRT_P 0x0000000000000080ULL +#define FO_PCI_MMU_ERR_INT_TTE_INV_P 0x0000000000000040ULL +#define FO_PCI_MMU_ERR_INT_TRN_OOR_P 0x0000000000000020ULL +#define FO_PCI_MMU_ERR_INT_TRN_ERR_P 0x0000000000000010ULL +#define FO_PCI_MMU_ERR_INT_SPARE1_P 0x0000000000000008ULL +#define FO_PCI_MMU_ERR_INT_SPARE0_P 0x0000000000000004ULL +#define FO_PCI_MMU_ERR_INT_BYP_OOR_P 0x0000000000000002ULL +#define FO_PCI_MMU_ERR_INT_BYP_ERR_P 0x0000000000000001ULL + +/* PCI MMU translation fault address register */ +#define FO_PCI_MMU_TRANS_FAULT_ADDR_VA_MASK 0xfffffffffffffffcULL +#define FO_PCI_MMU_TRANS_FAULT_ADDR_VA_SHFT 2 + +/* PCI MMU translation fault status register */ +#define FO_PCI_MMU_TRANS_FAULT_STAT_ENTRY_MASK 0x000001ff00000000ULL +#define FO_PCI_MMU_TRANS_FAULT_STAT_ENTRY_SHFT 32 +#define FO_PCI_MMU_TRANS_FAULT_STAT_TYPE_MASK 0x00000000007f0000ULL +#define FO_PCI_MMU_TRANS_FAULT_STAT_TYPE_SHFT 16 +#define FO_PCI_MMU_TRANS_FAULT_STAT_ID_MASK 0x000000000000ffffULL +#define FO_PCI_MMU_TRANS_FAULT_STAT_ID_SHFT 0 + +/* + * PCI ILU interrupt enable, interrupt status and error status clear + * registers + */ +#define FO_PCI_ILU_ERR_INT_SPARE3_S 0x0000008000000000ULL +#define FO_PCI_ILU_ERR_INT_SPARE2_S 0x0000004000000000ULL +#define FO_PCI_ILU_ERR_INT_SPARE1_S 0x0000002000000000ULL +#define FIRE_PCI_ILU_ERR_INT_IHB_PE_S 0x0000001000000000ULL +#define OBERON_PCI_ILU_ERR_INT_IHB_UE_S 0x0000001000000000ULL +#define FO_PCI_ILU_ERR_INT_SPARE3_P 0x0000000000000080ULL +#define FO_PCI_ILU_ERR_INT_SPARE2_P 0x0000000000000040ULL +#define FO_PCI_ILU_ERR_INT_SPARE1_P 0x0000000000000020ULL +#define FIRE_PCI_ILU_ERR_INT_IHB_PE_P 0x0000000000000010ULL +#define OBERON_PCI_ILU_ERR_INT_IHB_UE_P 0x0000000000000010ULL + +/* PCI DMC debug select registers for port a/b */ +#define FO_PCI_DMC_DBG_SEL_PORT_BLCK_MASK 0x00000000000003c0ULL +#define FO_PCI_DMC_DBG_SEL_PORT_BLCK_SHFT 6 +#define FO_PCI_DMC_DBG_SEL_PORT_SUB_MASK 0x0000000000000038ULL +#define FO_PCI_DMC_DBG_SEL_PORT_SUB_SHFT 3 +#define FO_PCI_DMC_DBG_SEL_PORT_SUB_SGNL_MASK 0x0000000000000007ULL +#define FO_PCI_DMC_DBG_SEL_PORT_SUB_SGNL_SHFT 0 + +/* PCI PEC core and block interrupt enable register */ +#define FO_PCI_PEC_CORE_BLOCK_INT_EN_PEC 0x8000000000000000ULL +#define FO_PCI_PEC_CORE_BLOCK_INT_EN_ILU 0x0000000000000008ULL +#define FO_PCI_PEC_CORE_BLOCK_INT_EN_UERR 0x0000000000000004ULL +#define FO_PCI_PEC_CORE_BLOCK_INT_EN_CERR 0x0000000000000002ULL +#define FO_PCI_PEC_CORE_BLOCK_INT_EN_OEVENT 0x0000000000000001ULL + +/* PCI PEC core and block interrupt status register */ +#define FO_PCI_PEC_CORE_BLOCK_INT_STAT_ILU 0x0000000000000008ULL +#define FO_PCI_PEC_CORE_BLOCK_INT_STAT_UERR 0x0000000000000004ULL +#define FO_PCI_PEC_CORE_BLOCK_INT_STAT_CERR 0x0000000000000002ULL +#define FO_PCI_PEC_CORE_BLOCK_INT_STAT_OEVENT 0x0000000000000001ULL + +/* PCI TLU control register */ +#define FO_PCI_TLU_CTRL_L0S_TIM_MASK 0x00000000ff000000ULL +#define FO_PCI_TLU_CTRL_L0S_TIM_SHFT 24 +#define FO_PCI_TLU_CTRL_NWPR_EN 0x0000000000100000ULL +#define FO_PCI_TLU_CTRL_CTO_SEL_MASK 0x0000000000070000ULL +#define FO_PCI_TLU_CTRL_CTO_SEL_SHFT 16 +#define FO_PCI_TLU_CTRL_CFG_MASK 0x000000000000ffffULL +#define FO_PCI_TLU_CTRL_CFG_SHFT 0 +#define FO_PCI_TLU_CTRL_CFG_REMAIN_DETECT_QUIET 0x0000000000000100ULL + +/* + * PCI TLU other event interrupt enable, interrupt status and status clear + * registers + */ +#define FO_PCI_TLU_OEVENT_S_MASK 0x00ffffff00000000ULL +#define FO_PCI_TLU_OEVENT_S_SHFT 32 +#define FO_PCI_TLU_OEVENT_SPARE_S 0x0080000000000000ULL +#define FO_PCI_TLU_OEVENT_MFC_S 0x0040000000000000ULL +#define FO_PCI_TLU_OEVENT_CTO_S 0x0020000000000000ULL +#define FO_PCI_TLU_OEVENT_NFP_S 0x0010000000000000ULL +#define FO_PCI_TLU_OEVENT_LWC_S 0x0008000000000000ULL +#define FO_PCI_TLU_OEVENT_MRC_S 0x0004000000000000ULL +#define FO_PCI_TLU_OEVENT_WUC_S 0x0002000000000000ULL +#define FO_PCI_TLU_OEVENT_RUC_S 0x0001000000000000ULL +#define FO_PCI_TLU_OEVENT_CRS_S 0x0000800000000000ULL +#define FO_PCI_TLU_OEVENT_IIP_S 0x0000400000000000ULL +#define FO_PCI_TLU_OEVENT_EDP_S 0x0000200000000000ULL +#define FIRE_PCI_TLU_OEVENT_EHP_S 0x0000100000000000ULL +#define OBERON_PCI_TLU_OEVENT_EHBUE_S 0x0000100000000000ULL +#define OBERON_PCI_TLU_OEVENT_EDBUE_S 0x0000100000000000ULL +#define FO_PCI_TLU_OEVENT_LIN_S 0x0000080000000000ULL +#define FO_PCI_TLU_OEVENT_LRS_S 0x0000040000000000ULL +#define FO_PCI_TLU_OEVENT_LDN_S 0x0000020000000000ULL +#define FO_PCI_TLU_OEVENT_LUP_S 0x0000010000000000ULL +#define FO_PCI_TLU_OEVENT_LPU_S_MASK 0x000000c000000000ULL +#define FO_PCI_TLU_OEVENT_LPU_S_SHFT 38 +#define OBERON_PCI_TLU_OEVENT_TLUEITMO_S 0x0000008000000000ULL +#define FO_PCI_TLU_OEVENT_ERU_S 0x0000002000000000ULL +#define FO_PCI_TLU_OEVENT_ERO_S 0x0000001000000000ULL +#define FO_PCI_TLU_OEVENT_EMP_S 0x0000000800000000ULL +#define FO_PCI_TLU_OEVENT_EPE_S 0x0000000400000000ULL +#define FIRE_PCI_TLU_OEVENT_ERP_S 0x0000000200000000ULL +#define OBERON_PCI_TLU_OEVENT_ERBU_S 0x0000000200000000ULL +#define FIRE_PCI_TLU_OEVENT_EIP_S 0x0000000100000000ULL +#define OBERON_PCI_TLU_OEVENT_EIUE_S 0x0000000100000000ULL +#define FO_PCI_TLU_OEVENT_P_MASK 0x0000000000ffffffULL +#define FO_PCI_TLU_OEVENT_P_SHFT 0 +#define FO_PCI_TLU_OEVENT_SPARE_P 0x0000000000800000ULL +#define FO_PCI_TLU_OEVENT_MFC_P 0x0000000000400000ULL +#define FO_PCI_TLU_OEVENT_CTO_P 0x0000000000200000ULL +#define FO_PCI_TLU_OEVENT_NFP_P 0x0000000000100000ULL +#define FO_PCI_TLU_OEVENT_LWC_P 0x0000000000080000ULL +#define FO_PCI_TLU_OEVENT_MRC_P 0x0000000000040000ULL +#define FO_PCI_TLU_OEVENT_WUC_P 0x0000000000020000ULL +#define FO_PCI_TLU_OEVENT_RUC_P 0x0000000000010000ULL +#define FO_PCI_TLU_OEVENT_CRS_P 0x0000000000008000ULL +#define FO_PCI_TLU_OEVENT_IIP_P 0x0000000000004000ULL +#define FO_PCI_TLU_OEVENT_EDP_P 0x0000000000002000ULL +#define FIRE_PCI_TLU_OEVENT_EHP_P 0x0000000000001000ULL +#define OBERON_PCI_TLU_OEVENT_EHBUE_P 0x0000000000001000ULL +#define OBERON_PCI_TLU_OEVENT_EDBUE_P 0x0000000000001000ULL +#define FO_PCI_TLU_OEVENT_LIN_P 0x0000000000000800ULL +#define FO_PCI_TLU_OEVENT_LRS_P 0x0000000000000400ULL +#define FO_PCI_TLU_OEVENT_LDN_P 0x0000000000000200ULL +#define FO_PCI_TLU_OEVENT_LUP_P 0x0000000000000100ULL +#define FO_PCI_TLU_OEVENT_LPU_P_MASK 0x00000000000000c0ULL +#define FO_PCI_TLU_OEVENT_LPU_P_SHFT 6 +#define OBERON_PCI_TLU_OEVENT_TLUEITMO_P 0x0000000000000080ULL +#define FO_PCI_TLU_OEVENT_ERU_P 0x0000000000000020ULL +#define FO_PCI_TLU_OEVENT_ERO_P 0x0000000000000010ULL +#define FO_PCI_TLU_OEVENT_EMP_P 0x0000000000000008ULL +#define FO_PCI_TLU_OEVENT_EPE_P 0x0000000000000004ULL +#define FIRE_PCI_TLU_OEVENT_ERP_P 0x0000000000000002ULL +#define OBERON_PCI_TLU_OEVENT_ERBU_P 0x0000000000000002ULL +#define FIRE_PCI_TLU_OEVENT_EIP_P 0x0000000000000001ULL +#define OBERON_PCI_TLU_OEVENT_EIUE_P 0x0000000000000001ULL + +/* PCI receive/transmit DLU/TLU other event header 1/2 log registers */ +#define FO_PCI_TLU_OEVENT_HDR_LOG_MASK 0xffffffffffffffffULL +#define FO_PCI_TLU_OEVENT_HDR_LOG_SHFT 0 + +/* PCI TLU device control register */ +#define FO_PCI_TLU_DEV_CTRL_MRRS_MASK 0x0000000000007000ULL +#define FO_PCI_TLU_DEV_CTRL_MRRS_SHFT 12 +#define FO_PCI_TLU_DEV_CTRL_MPS_MASK 0x00000000000000e0ULL +#define FO_PCI_TLU_DEV_CTRL_MPS_SHFT 5 + +/* + * PCI TLU uncorrectable error interrupt enable, interrupt status and + * status clear registers + */ +#define FO_PCI_TLU_UERR_INT_S_MASK 0x001fffff00000000ULL +#define FO_PCI_TLU_UERR_INT_S_SHFT 32 +#define FO_PCI_TLU_UERR_INT_UR_S 0x0010000000000000ULL +#define OBERON_PCI_TLU_UERR_INT_ECRC_S 0x0008000000000000ULL +#define FO_PCI_TLU_UERR_INT_MFP_S 0x0004000000000000ULL +#define FO_PCI_TLU_UERR_INT_ROF_S 0x0002000000000000ULL +#define FO_PCI_TLU_UERR_INT_UC_S 0x0001000000000000ULL +#define FO_PCI_TLU_UERR_INT_CA_S 0x0000800000000000ULL +#define FO_PCI_TLU_UERR_INT_CTO_S 0x0000400000000000ULL +#define FO_PCI_TLU_UERR_INT_FCP_S 0x0000200000000000ULL +#define FIRE_PCI_TLU_UERR_INT_PP_S 0x0000100000000000ULL +#define OBERON_PCI_TLU_UERR_INT_POIS_S 0x0000100000000000ULL +#define FO_PCI_TLU_UERR_INT_DLP_S 0x0000001000000000ULL +#define FO_PCI_TLU_UERR_INT_TE_S 0x0000000100000000ULL +#define FO_PCI_TLU_UERR_INT_P_MASK 0x00000000001fffffULL +#define FO_PCI_TLU_UERR_INT_P_SHFT 0 +#define FO_PCI_TLU_UERR_INT_UR_P 0x0000000000100000ULL +#define OBERON_PCI_TLU_UERR_INT_ECRC_P 0x0000000000080000ULL +#define FO_PCI_TLU_UERR_INT_MFP_P 0x0000000000040000ULL +#define FO_PCI_TLU_UERR_INT_ROF_P 0x0000000000020000ULL +#define FO_PCI_TLU_UERR_INT_UC_P 0x0000000000010000ULL +#define FO_PCI_TLU_UERR_INT_CA_P 0x0000000000008000ULL +#define FO_PCI_TLU_UERR_INT_CTO_P 0x0000000000004000ULL +#define FO_PCI_TLU_UERR_INT_FCP_P 0x0000000000002000ULL +#define FIRE_PCI_TLU_UERR_INT_PP_P 0x0000000000001000ULL +#define OBERON_PCI_TLU_UERR_INT_POIS_P 0x0000000000001000ULL +#define FO_PCI_TLU_UERR_INT_DLP_P 0x0000000000000010ULL +#define FO_PCI_TLU_UERR_INT_TE_P 0x0000000000000001ULL + +/* + * PCI TLU correctable error interrupt enable, interrupt status and + * status clear registers + */ +#define FO_PCI_TLU_CERR_INT_S_MASK 0x001fffff00000000ULL +#define FO_PCI_TLU_CERR_INT_S_SHFT 32 +#define FO_PCI_TLU_CERR_INT_RTO_S 0x0000100000000000ULL +#define FO_PCI_TLU_CERR_INT_RNR_S 0x0000010000000000ULL +#define FO_PCI_TLU_CERR_INT_BDP_S 0x0000008000000000ULL +#define FO_PCI_TLU_CERR_INT_BTP_S 0x0000004000000000ULL +#define FO_PCI_TLU_CERR_INT_RE_S 0x0000000100000000ULL +#define FO_PCI_TLU_CERR_INT_P_MASK 0x00000000001fffffULL +#define FO_PCI_TLU_CERR_INT_P_SHFT 0 +#define FO_PCI_TLU_CERR_INT_RTO_P 0x0000000000001000ULL +#define FO_PCI_TLU_CERR_INT_RNR_P 0x0000000000000100ULL +#define FO_PCI_TLU_CERR_INT_BDP_P 0x0000000000000080ULL +#define FO_PCI_TLU_CERR_INT_BTP_P 0x0000000000000040ULL +#define FO_PCI_TLU_CERR_INT_RE_P 0x0000000000000001ULL + +/* PCI TLU reset register */ +#define FO_PCI_LPU_RST_WE 0x0000000080000000ULL +#define FO_PCI_LPU_RST_UNUSED_MASK 0x0000000000000e00ULL +#define FO_PCI_LPU_RST_UNUSED_SHFT 9 +#define FO_PCI_LPU_RST_ERR 0x0000000000000100ULL +#define FO_PCI_LPU_RST_TXLINK 0x0000000000000080ULL +#define FO_PCI_LPU_RST_RXLINK 0x0000000000000040ULL +#define FO_PCI_LPU_RST_SMLINK 0x0000000000000020ULL +#define FO_PCI_LPU_RST_LTSSM 0x0000000000000010ULL +#define FO_PCI_LPU_RST_TXPHY 0x0000000000000008ULL +#define FO_PCI_LPU_RST_RXPHY 0x0000000000000004ULL +#define FO_PCI_LPU_RST_TXPCS 0x0000000000000002ULL +#define FO_PCI_LPU_RST_RXPCS 0x0000000000000001ULL + +/* PCI TLU link control register */ +#define FO_PCI_TLU_LNK_CTRL_EXTSYNC 0x0000000000000080ULL +#define FO_PCI_TLU_LNK_CTRL_CLK 0x0000000000000040ULL +#define FO_PCI_TLU_LNK_CTRL_RETRAIN 0x0000000000000020ULL +#define FO_PCI_TLU_LNK_CTRL_DIS 0x0000000000000010ULL +#define FO_PCI_TLU_LNK_CTRL_RCB 0x0000000000000008ULL +#define FO_PCI_TLU_LNK_CTRL_ASPM_L0S_L1S 0x0000000000000003ULL +#define FO_PCI_TLU_LNK_CTRL_ASPM_L1S 0x0000000000000002ULL +#define FO_PCI_TLU_LNK_CTRL_ASPM_L0S 0x0000000000000001ULL +#define FO_PCI_TLU_LNK_CTRL_ASPM_DIS 0x0000000000000000ULL + +/* PCI TLU link status register */ +#define FO_PCI_TLU_LNK_STAT_CLK 0x0000000000001000ULL +#define FO_PCI_TLU_LNK_STAT_TRAIN 0x0000000000000800ULL +#define FO_PCI_TLU_LNK_STAT_ERR 0x0000000000000400ULL +#define FO_PCI_TLU_LNK_STAT_WDTH_MASK 0x00000000000003f0ULL +#define FO_PCI_TLU_LNK_STAT_WDTH_SHFT 4 +#define FO_PCI_TLU_LNK_STAT_SPEED_MASK 0x000000000000000fULL +#define FO_PCI_TLU_LNK_STAT_SPEED_SHFT 0 + +/* + * PCI receive/transmit DLU/TLU uncorrectable error header 1/2 log + * registers + */ +#define FO_PCI_TLU_UERR_HDR_LOG_MASK 0xffffffffffffffffULL +#define FO_PCI_TLU_UERR_HDR_LOG_SHFT 0 + +/* PCI DLU/LPU interrupt status and mask registers */ +#define FO_PCI_LPU_INT_INT 0x0000000080000000ULL +#define FIRE_PCI_LPU_INT_PRF_CNT2_OFLW 0x0000000000000080ULL +#define FIRE_PCI_LPU_INT_PRF_CNT1_OFLW 0x0000000000000040ULL +#define FO_PCI_LPU_INT_LNK_LYR 0x0000000000000020ULL +#define FO_PCI_LPU_INT_PHY_ERR 0x0000000000000010ULL +#define FIRE_PCI_LPU_INT_LTSSM 0x0000000000000008ULL +#define FIRE_PCI_LPU_INT_PHY_TX 0x0000000000000004ULL +#define FIRE_PCI_LPU_INT_PHY_RX 0x0000000000000002ULL +#define FIRE_PCI_LPU_INT_PHY_GB 0x0000000000000001ULL + +/* PCI DLU/LPU link layer config register */ +#define FIRE_PCI_LPU_LNK_LYR_CFG_AUTO_UPDT_DIS 0x0000000000080000ULL +#define FIRE_PCI_LPU_LNK_LYR_CFG_FREQ_NAK_EN 0x0000000000040000ULL +#define FIRE_PCI_LPU_LNK_LYR_CFG_RPLY_AFTER_REQ 0x0000000000020000ULL +#define FIRE_PCI_LPU_LNK_LYR_CFG_LAT_THRS_WR_EN 0x0000000000010000ULL +#define FO_PCI_LPU_LNK_LYR_CFG_VC0_EN 0x0000000000000100ULL +#define FIRE_PCI_LPU_LNK_LYR_CFG_L0S_ADJ_FAC_EN 0x0000000000000010ULL +#define FIER_PCI_LPU_LNK_LYR_CFG_TLP_XMIT_FC_EN 0x0000000000000008ULL +#define FO_PCI_LPU_LNK_LYR_CFG_FREQ_ACK_EN 0x0000000000000004ULL +#define FO_PCI_LPU_LNK_LYR_CFG_RETRY_DIS 0x0000000000000002ULL + +/* PCI DLU/LPU link layer interrupt and status register */ +#define FO_PCI_LPU_LNK_LYR_INT_STAT_LNK_ERR_ACT 0x0000000080000000ULL +#define OBERON_PCI_LPU_LNK_LYR_INT_STAT_PBUS_PE 0x0000000000800000ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_USPRTD_DLLP 0x0000000000400000ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_DLLP_RX_ERR 0x0000000000200000ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_BAD_DLLP 0x0000000000100000ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_TLP_RX_ERR 0x0000000000040000ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_SRC_ERR_TLP 0x0000000000020000ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_BAD_TLP 0x0000000000010000ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_RBF_UDF_ERR 0x0000000000000200ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_RBF_OVF_ERR 0x0000000000000100ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_EG_TLPM_ERR 0x0000000000000080ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_EG_TFRM_ERR 0x0000000000000040ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_RBF_PE 0x0000000000000020ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_EGRESS_PE 0x0000000000000010ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_RPLY_TMR_TO 0x0000000000000004ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_RPLY_NUM_RO 0x0000000000000002ULL +#define FO_PCI_LPU_LNK_LYR_INT_STAT_DLNK_PES 0x0000000000000001ULL + +/* PCI DLU/LPU flow control update control register */ +#define FO_PCI_LPU_FLW_CTRL_UPDT_CTRL_FC0_C_EN 0x0000000000000004ULL +#define FO_PCI_LPU_FLW_CTRL_UPDT_CTRL_FC0_NP_EN 0x0000000000000002ULL +#define FO_PCI_LPU_FLW_CTRL_UPDT_CTRL_FC0_P_EN 0x0000000000000001ULL + +/* PCI DLU/LPU txlink ACKNAK latency timer threshold register */ +#define FO_PCI_LPU_TXLNK_FREQ_LAT_TMR_THRS_MASK 0x000000000000ffffULL +#define FO_PCI_LPU_TXLNK_FREQ_LAT_TMR_THRS_SHFT 0 + +/* PCI DLU/LPU txlink replay timer threshold register */ +#define FO_PCI_LPU_TXLNK_RPLY_TMR_THRS_MASK 0x00000000000fffffULL +#define FO_PCI_LPU_TXLNK_RPLY_TMR_THRS_SHFT 0 + +/* PCI DLU/LPU txlink FIFO pointer register */ +#define FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_TL_MASK 0x00000000ffff0000ULL +#define FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_TL_SHFT 16 +#define FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_HD_MASK 0x000000000000ffffULL +#define FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_HD_SHFT 0 + +/* PCI DLU/LPU phy layer interrupt and status register */ +#define FO_PCI_LPU_PHY_LYR_INT_STAT_PHY_LYR_ERR 0x0000000080000000ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_KC_DLLP_ERR 0x0000000000000800ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_END_POS_ERR 0x0000000000000400ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_LNK_ERR 0x0000000000000200ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_TRN_ERR 0x0000000000000100ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_EDB_DET 0x0000000000000080ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_SDP_END 0x0000000000000040ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_STP_END_EDB 0x0000000000000020ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_INVC_ERR 0x0000000000000010ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_MULTI_SDP 0x0000000000000008ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_MULTI_STP 0x0000000000000004ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_ILL_SDP_POS 0x0000000000000002ULL +#define FO_PCI_LPU_PHY_LYR_INT_STAT_ILL_STP_POS 0x0000000000000001ULL + +/* PCI DLU/LPU LTSSM config2 register */ +#define FO_PCI_LPU_LTSSM_CFG2_12_TO_MASK 0x00000000ffffffffULL +#define FO_PCI_LPU_LTSSM_CFG2_12_TO_SHFT 0 + +/* PCI DLU/LPU LTSSM config3 register */ +#define FO_PCI_LPU_LTSSM_CFG3_2_TO_MASK 0x00000000ffffffffULL +#define FO_PCI_LPU_LTSSM_CFG3_2_TO_SHFT 0 + +/* PCI DLU/LPU LTSSM config4 register */ +#define FO_PCI_LPU_LTSSM_CFG4_TRN_CTRL_MASK 0x00000000ff000000ULL +#define FO_PCI_LPU_LTSSM_CFG4_TRN_CTRL_SHFT 24 +#define FO_PCI_LPU_LTSSM_CFG4_DATA_RATE_MASK 0x0000000000ff0000ULL +#define FO_PCI_LPU_LTSSM_CFG4_DATA_RATE_SHFT 16 +#define FO_PCI_LPU_LTSSM_CFG4_N_FTS_MASK 0x000000000000ff00ULL +#define FO_PCI_LPU_LTSSM_CFG4_N_FTS_SHFT 8 +#define FO_PCI_LPU_LTSSM_CFG4_LNK_NUM_MASK 0x00000000000000ffULL +#define FO_PCI_LPU_LTSSM_CFG4_LNK_NUM_SHFT 0 + +/* PCI DLU/LPU LTSSM config5 register */ +#define FO_PCI_LPU_LTSSM_CFG5_UNUSED0_MASK 0x00000000ffffe000ULL +#define FO_PCI_LPU_LTSSM_CFG5_UNUSED0_SHFT 13 +#define FO_PCI_LPU_LTSSM_CFG5_RCV_DET_TST_MODE 0x0000000000001000ULL +#define FO_PCI_LPU_LTSSM_CFG5_POLL_CMPLNC_DIS 0x0000000000000800ULL +#define FO_PCI_LPU_LTSSM_CFG5_TX_IDLE_TX_FTS 0x0000000000000400ULL +#define FO_PCI_LPU_LTSSM_CFG5_RX_FTS_RVR_LK 0x0000000000000200ULL +#define FO_PCI_LPU_LTSSM_CFG5_UNUSED1_MASK 0x0000000000000180ULL +#define FO_PCI_LPU_LTSSM_CFG5_UNUSED1_SHFT 7 +#define FO_PCI_LPU_LTSSM_CFG5_LPBK_NTRY_ACTIVE 0x0000000000000040ULL +#define FO_PCI_LPU_LTSSM_CFG5_LPBK_NTRY_EXIT 0x0000000000000020ULL +#define FO_PCI_LPU_LTSSM_CFG5_LPBK_ACTIVE_EXIT 0x0000000000000010ULL +#define FO_PCI_LPU_LTSSM_CFG5_L1_IDLE_RCVRY_LK 0x0000000000000008ULL +#define FO_PCI_LPU_LTSSM_CFG5_L0_TRN_CNTRL_RST 0x0000000000000004ULL +#define FO_PCI_LPU_LTSSM_CFG5_L0_LPBK 0x0000000000000002ULL +#define FO_PCI_LPU_LTSSM_CFG5_UNUSED2 0x0000000000000001ULL + +/* Controller configuration and status registers */ +#define FIRE_JBUS_PAR_CTRL 0x60010 +#define FO_XBC_ERR_LOG_EN 0x61000 +#define FO_XBC_INT_EN 0x61008 +#define FO_XBC_INT_STAT 0x61010 +#define FO_XBC_ERR_STAT_CLR 0x61018 +#define FIRE_JBC_FATAL_RST_EN 0x61028 +#define FIRE_JBCINT_ITRANS_ERR_LOG 0x61040 +#define FIRE_JBCINT_ITRANS_ERR_LOG2 0x61048 +#define FIRE_JBCINT_OTRANS_ERR_LOG 0x61040 +#define FIRE_JBCINT_OTRANS_ERR_LOG2 0x61048 +#define FIRE_FATAL_ERR_LOG 0x61050 +#define FIRE_FATAL_ERR_LOG2 0x61058 +#define FIRE_MERGE_TRANS_ERR_LOG 0x61060 +#define FIRE_DMCINT_ODCD_ERR_LOG 0x61068 +#define FIRE_DMCINT_IDC_ERR_LOG 0x61070 +#define FIRE_JBC_CSR_ERR_LOG 0x61078 +#define FIRE_JBC_CORE_BLOCK_INT_EN 0x61800 +#define FIRE_JBC_CORE_BLOCK_ERR_STAT 0x61808 +#define FO_XBC_PRF_CNT_SEL 0x62000 +#define FO_XBC_PRF_CNT0 0x62008 +#define FO_XBC_PRF_CNT1 0x62010 + +/* JBus parity control register */ +#define FIRE_JBUS_PAR_CTRL_P_EN 0x8000000000000000ULL +#define FIRE_JBUS_PAR_CTRL_INVRTD_PAR_MASK 0x000000000000003cULL +#define FIRE_JBUS_PAR_CTRL_INVRTD_PAR_SHFT 2 +#define FIRE_JBUS_PAR_CTRL_NEXT_DATA 0x0000000000000002ULL +#define FIRE_JBUS_PAR_CTRL_NEXT_ADDR 0x0000000000000001ULL + +/* JBC error log enable register - may also apply to UBC */ +#define FIRE_JBC_ERR_LOG_EN_SPARE_MASK 0x00000000e0000000ULL +#define FIRE_JBC_ERR_LOG_EN_SPARE_SHFT 29 +#define FIRE_JBC_ERR_LOG_EN_PIO_UNMAP_RD 0x0000000010000000ULL +#define FIRE_JBC_ERR_LOG_EN_ILL_ACC_RD 0x0000000008000000ULL +#define FIRE_JBC_ERR_LOG_EN_EBUS_TO 0x0000000004000000ULL +#define FIRE_JBC_ERR_LOG_EN_MB_PEA 0x0000000002000000ULL +#define FIRE_JBC_ERR_LOG_EN_MB_PER 0x0000000001000000ULL +#define FIRE_JBC_ERR_LOG_EN_MB_PEW 0x0000000000800000ULL +#define FIRE_JBC_ERR_LOG_EN_UE_ASYN 0x0000000000400000ULL +#define FIRE_JBC_ERR_LOG_EN_CE_ASYN 0x0000000000200000ULL +#define FIRE_JBC_ERR_LOG_EN_JTE 0x0000000000100000ULL +#define FIRE_JBC_ERR_LOG_EN_JBE 0x0000000000080000ULL +#define FIRE_JBC_ERR_LOG_EN_JUE 0x0000000000040000ULL +#define FIRE_JBC_ERR_LOG_EN_IJP 0x0000000000020000ULL +#define FIRE_JBC_ERR_LOG_EN_ICISE 0x0000000000010000ULL +#define FIRE_JBC_ERR_LOG_EN_CPE 0x0000000000008000ULL +#define FIRE_JBC_ERR_LOG_EN_APE 0x0000000000004000ULL +#define FIRE_JBC_ERR_LOG_EN_WR_DPE 0x0000000000002000ULL +#define FIRE_JBC_ERR_LOG_EN_RD_DPE 0x0000000000001000ULL +#define FIRE_JBC_ERR_LOG_EN_ILL_BMW 0x0000000000000800ULL +#define FIRE_JBC_ERR_LOG_EN_ILL_BMR 0x0000000000000400ULL +#define FIRE_JBC_ERR_LOG_EN_BJC 0x0000000000000200ULL +#define FIRE_JBC_ERR_LOG_EN_PIO_UNMAP 0x0000000000000100ULL +#define FIRE_JBC_ERR_LOG_EN_PIO_DPE 0x0000000000000080ULL +#define FIRE_JBC_ERR_LOG_EN_PIO_CPE 0x0000000000000040ULL +#define FIRE_JBC_ERR_LOG_EN_ILL_ACC 0x0000000000000020ULL +#define FIRE_JBC_ERR_LOG_EN_UNSOL_RD 0x0000000000000010ULL +#define FIRE_JBC_ERR_LOG_EN_UNSOL_INT 0x0000000000000008ULL +#define FIRE_JBC_ERR_LOG_EN_JTCEEW 0x0000000000000004ULL +#define FIRE_JBC_ERR_LOG_EN_JTCEEI 0x0000000000000002ULL +#define FIRE_JBC_ERR_LOG_EN_JTCEER 0x0000000000000001ULL + +/* JBC interrupt enable, interrupt status and error status clear registers */ +#define FIRE_JBC_ERR_INT_SPARE_S_MASK 0xe000000000000000ULL +#define FIRE_JBC_ERR_INT_SPARE_S_SHFT 61 +#define FIRE_JBC_ERR_INT_PIO_UNMAP_RD_S 0x1000000000000000ULL +#define FIRE_JBC_ERR_INT_ILL_ACC_RD_S 0x0800000000000000ULL +#define FIRE_JBC_ERR_INT_EBUS_TO_S 0x0400000000000000ULL +#define FIRE_JBC_ERR_INT_MB_PEA_S 0x0200000000000000ULL +#define FIRE_JBC_ERR_INT_MB_PER_S 0x0100000000000000ULL +#define FIRE_JBC_ERR_INT_MB_PEW_S 0x0080000000000000ULL +#define FIRE_JBC_ERR_INT_UE_ASYN_S 0x0040000000000000ULL +#define FIRE_JBC_ERR_INT_CE_ASYN_S 0x0020000000000000ULL +#define FIRE_JBC_ERR_INT_JTE_S 0x0010000000000000ULL +#define FIRE_JBC_ERR_INT_JBE_S 0x0008000000000000ULL +#define FIRE_JBC_ERR_INT_JUE_S 0x0004000000000000ULL +#define FIRE_JBC_ERR_INT_IJP_S 0x0002000000000000ULL +#define FIRE_JBC_ERR_INT_ICISE_S 0x0001000000000000ULL +#define FIRE_JBC_ERR_INT_CPE_S 0x0000800000000000ULL +#define FIRE_JBC_ERR_INT_APE_S 0x0000400000000000ULL +#define FIRE_JBC_ERR_INT_WR_DPE_S 0x0000200000000000ULL +#define FIRE_JBC_ERR_INT_RD_DPE_S 0x0000100000000000ULL +#define FIRE_JBC_ERR_INT_ILL_BMW_S 0x0000080000000000ULL +#define FIRE_JBC_ERR_INT_ILL_BMR_S 0x0000040000000000ULL +#define FIRE_JBC_ERR_INT_BJC_S 0x0000020000000000ULL +#define FIRE_JBC_ERR_INT_PIO_UNMAP_S 0x0000010000000000ULL +#define FIRE_JBC_ERR_INT_PIO_DPE_S 0x0000008000000000ULL +#define FIRE_JBC_ERR_INT_PIO_CPE_S 0x0000004000000000ULL +#define FIRE_JBC_ERR_INT_ILL_ACC_S 0x0000002000000000ULL +#define FIRE_JBC_ERR_INT_UNSOL_RD_S 0x0000001000000000ULL +#define FIRE_JBC_ERR_INT_UNSOL_INT_S 0x0000000800000000ULL +#define FIRE_JBC_ERR_INT_JTCEEW_S 0x0000000400000000ULL +#define FIRE_JBC_ERR_INT_JTCEEI_S 0x0000000200000000ULL +#define FIRE_JBC_ERR_INT_JTCEER_S 0x0000000100000000ULL +#define FIRE_JBC_ERR_INT_SPARE_P_MASK 0x00000000e0000000ULL +#define FIRE_JBC_ERR_INT_SPARE_P_SHFT 29 +#define FIRE_JBC_ERR_INT_PIO_UNMAP_RD_P 0x0000000010000000ULL +#define FIRE_JBC_ERR_INT_ILL_ACC_RD_P 0x0000000008000000ULL +#define FIRE_JBC_ERR_INT_EBUS_TO_P 0x0000000004000000ULL +#define FIRE_JBC_ERR_INT_MB_PEA_P 0x0000000002000000ULL +#define FIRE_JBC_ERR_INT_MB_PER_P 0x0000000001000000ULL +#define FIRE_JBC_ERR_INT_MB_PEW_P 0x0000000000800000ULL +#define FIRE_JBC_ERR_INT_UE_ASYN_P 0x0000000000400000ULL +#define FIRE_JBC_ERR_INT_CE_ASYN_P 0x0000000000200000ULL +#define FIRE_JBC_ERR_INT_JTE_P 0x0000000000100000ULL +#define FIRE_JBC_ERR_INT_JBE_P 0x0000000000080000ULL +#define FIRE_JBC_ERR_INT_JUE_P 0x0000000000040000ULL +#define FIRE_JBC_ERR_INT_IJP_P 0x0000000000020000ULL +#define FIRE_JBC_ERR_INT_ICISE_P 0x0000000000010000ULL +#define FIRE_JBC_ERR_INT_CPE_P 0x0000000000008000ULL +#define FIRE_JBC_ERR_INT_APE_P 0x0000000000004000ULL +#define FIRE_JBC_ERR_INT_WR_DPE_P 0x0000000000002000ULL +#define FIRE_JBC_ERR_INT_RD_DPE_P 0x0000000000001000ULL +#define FIRE_JBC_ERR_INT_ILL_BMW_P 0x0000000000000800ULL +#define FIRE_JBC_ERR_INT_ILL_BMR_P 0x0000000000000400ULL +#define FIRE_JBC_ERR_INT_BJC_P 0x0000000000000200ULL +#define FIRE_JBC_ERR_INT_PIO_UNMAP_P 0x0000000000000100ULL +#define FIRE_JBC_ERR_INT_PIO_DPE_P 0x0000000000000080ULL +#define FIRE_JBC_ERR_INT_PIO_CPE_P 0x0000000000000040ULL +#define FIRE_JBC_ERR_INT_ILL_ACC_P 0x0000000000000020ULL +#define FIRE_JBC_ERR_INT_UNSOL_RD_P 0x0000000000000010ULL +#define FIRE_JBC_ERR_INT_UNSOL_INT_P 0x0000000000000008ULL +#define FIRE_JBC_ERR_INT_JTCEEW_P 0x0000000000000004ULL +#define FIRE_JBC_ERR_INT_JTCEEI_P 0x0000000000000002ULL +#define FIRE_JBC_ERR_INT_JTCEER_P 0x0000000000000001ULL + +/* UBC interrupt enable, error status and error status clear registers */ +#define OBERON_UBC_ERR_INT_PIORBEUE_S 0x0004000000000000ULL +#define OBERON_UBC_ERR_INT_PIOWBEUE_S 0x0002000000000000ULL +#define OBERON_UBC_ERR_INT_PIOWTUE_S 0x0001000000000000ULL +#define OBERON_UBC_ERR_INT_MEMWTAXB_S 0x0000080000000000ULL +#define OBERON_UBC_ERR_INT_MEMRDAXB_S 0x0000040000000000ULL +#define OBERON_UBC_ERR_INT_DMAWTUEB_S 0x0000020000000000ULL +#define OBERON_UBC_ERR_INT_DMARDUEB_S 0x0000010000000000ULL +#define OBERON_UBC_ERR_INT_MEMWTAXA_S 0x0000000800000000ULL +#define OBERON_UBC_ERR_INT_MEMRDAXA_S 0x0000000400000000ULL +#define OBERON_UBC_ERR_INT_DMAWTUEA_S 0x0000000200000000ULL +#define OBERON_UBC_ERR_INT_DMARDUEA_S 0x0000000100000000ULL +#define OBERON_UBC_ERR_INT_PIORBEUE_P 0x0000000000040000ULL +#define OBERON_UBC_ERR_INT_PIOWBEUE_P 0x0000000000020000ULL +#define OBERON_UBC_ERR_INT_PIOWTUE_P 0x0000000000010000ULL +#define OBERON_UBC_ERR_INT_MEMWTAXB_P 0x0000000000000800ULL +#define OBERON_UBC_ERR_INT_MEMRDAXB_P 0x0000000000000400ULL +#define OBERON_UBC_ERR_INT_DMARDUEB_P 0x0000000000000200ULL +#define OBERON_UBC_ERR_INT_DMAWTUEB_P 0x0000000000000100ULL +#define OBERON_UBC_ERR_INT_MEMWTAXA_P 0x0000000000000008ULL +#define OBERON_UBC_ERR_INT_MEMRDAXA_P 0x0000000000000004ULL +#define OBERON_UBC_ERR_INT_DMAWTUEA_P 0x0000000000000002ULL +#define OBERON_UBC_ERR_INT_DMARDUEA_P 0x0000000000000001ULL + +/* JBC fatal reset enable register */ +#define FIRE_JBC_FATAL_RST_EN_SPARE_P_INT_MASK 0x000000000c000000ULL +#define FIRE_JBC_FATAL_RST_EN_SPARE_P_INT_SHFT 26 +#define FIRE_JBC_FATAL_RST_EN_MB_PEA_P_INT 0x0000000002000000ULL +#define FIRE_JBC_FATAL_RST_EN_CPE_P_INT 0x0000000000008000ULL +#define FIRE_JBC_FATAL_RST_EN_APE_P_INT 0x0000000000004000ULL +#define FIRE_JBC_FATAL_RST_EN_PIO_CPE_INT 0x0000000000000040ULL +#define FIRE_JBC_FATAL_RST_EN_JTCEEW_P_INT 0x0000000000000004ULL +#define FIRE_JBC_FATAL_RST_EN_JTCEEI_P_INT 0x0000000000000002ULL +#define FIRE_JBC_FATAL_RST_EN_JTCEER_P_INT 0x0000000000000001ULL + +/* JBC JBCINT in transaction error log register */ +#define FIRE_JBCINT_ITRANS_ERR_LOG_Q_WORD_MASK 0x00c0000000000000ULL +#define FIRE_JBCINT_ITRANS_ERR_LOG_Q_WORD_SHFT 54 +#define FIRE_JBCINT_ITRANS_ERR_LOG_TRANSID_MASK 0x0003000000000000ULL +#define FIRE_JBCINT_ITRANS_ERR_LOG_TRANSID_SHFT 48 +#define FIRE_JBCINT_ITRANS_ERR_LOG_ADDR_MASK 0x000007ffffffffffULL +#define FIRE_JBCINT_ITRANS_ERR_LOG_ADDR_SHFT 0 + +/* JBC JBCINT in transaction error log register 2 */ +#define FIRE_JBCINT_ITRANS_ERR_LOG2_ARB_WN_MASK 0x000ffffff0000000ULL +#define FIRE_JBCINT_ITRANS_ERR_LOG2_ARB_WN_SHFT 28 +#define FIRE_JBCINT_ITRANS_ERR_LOG2_J_REQ_MASK 0x000000000fe00000ULL +#define FIRE_JBCINT_ITRANS_ERR_LOG2_J_REQ_SHFT 21 +#define FIRE_JBCINT_ITRANS_ERR_LOG2_J_PACK_MASK 0x00000000001fffffULL +#define FIRE_JBCINT_ITRANS_ERR_LOG2_J_PACK_SHFT 0 + +/* JBC JBCINT out transaction error log register */ +#define FIRE_JBCINT_OTRANS_ERR_LOG_TRANSID_MASK 0x003f000000000000ULL +#define FIRE_JBCINT_OTRANS_ERR_LOG_TRANSID_SHFT 48 +#define FIRE_JBCINT_OTRANS_ERR_LOG_ADDR_MASK 0x000007ffffffffffULL +#define FIRE_JBCINT_OTRANS_ERR_LOG_ADDR_SHFT 0 + +/* JBC JBCINT out transaction error log register 2 */ +#define FIRE_JBCINT_OTRANS_ERR_LOG2_ARB_WN_MASK 0x000ffffff0000000ULL +#define FIRE_JBCINT_OTRANS_ERR_LOG2_ARB_WN_SHFT 28 +#define FIRE_JBCINT_OTRANS_ERR_LOG2_J_REQ_MASK 0x000000000fe00000ULL +#define FIRE_JBCINT_OTRANS_ERR_LOG2_J_REQ_SHFT 21 +#define FIRE_JBCINT_OTRANS_ERR_LOG2_J_PACK_MASK 0x00000000001fffffULL +#define FIRE_JBCINT_OTRANS_ERR_LOG2_J_PACK_SHFT 0 + +/* JBC merge transaction error log register */ +#define FIRE_FATAL_ERR_LOG_DATA_MASK 0xffffffffffffffffULL +#define FIRE_FATAL_ERR_LOG_DATA_SHFT 0 + +/* JBC merge transaction error log register 2 */ +#define FIRE_FATAL_ERR_LOG2_ARB_WN_MASK 0x000ffffff0000000ULL +#define FIRE_FATAL_ERR_LOG2_ARB_WN_SHFT 28 +#define FIRE_FATAL_ERR_LOG2_J_REQ_MASK 0x000000000fe00000ULL +#define FIRE_FATAL_ERR_LOG2_J_REQ_SHFT 21 +#define FIRE_FATAL_ERR_LOG2_J_PACK_MASK 0x00000000001fffffULL +#define FIRE_FATAL_ERR_LOG2_J_PACK_SHFT 0 + +/* JBC merge transaction error log register */ +#define FIRE_MERGE_TRANS_ERR_LOG_Q_WORD_MASK 0x00c0000000000000ULL +#define FIRE_MERGE_TRANS_ERR_LOG_Q_WORD_SHFT 54 +#define FIRE_MERGE_TRANS_ERR_LOG_TRANSID_MASK 0x0003000000000000ULL +#define FIRE_MERGE_TRANS_ERR_LOG_TRANSID_SHFT 48 +#define FIRE_MERGE_TRANS_ERR_LOG_JBC_TAG_MASK 0x0000f80000000000ULL +#define FIRE_MERGE_TRANS_ERR_LOG_JBC_TAG_SHFT 43 +#define FIRE_MERGE_TRANS_ERR_LOG_ADDR_MASK 0x000007ffffffffffULL +#define FIRE_MERGE_TRANS_ERR_LOG_ADDR_SHFT 0 + +/* JBC DMCINT ODCD error log register */ +#define FIRE_DMCINT_ODCD_ERR_LOG_TRANS_ID_MASK 0x0030000000000000ULL +#define FIRE_DMCINT_ODCD_ERR_LOG_TRANS_ID_SHFT 52 +#define FIRE_DMCINT_ODCD_ERR_LOG_AID_MASK 0x000f000000000000ULL +#define FIRE_DMCINT_ODCD_ERR_LOG_AID_SHFT 48 +#define FIRE_DMCINT_ODCD_ERR_LOG_TTYPE_MASK 0x0000f80000000000ULL +#define FIRE_DMCINT_ODCD_ERR_LOG_TTYPE_SHFT 43 +#define FIRE_DMCINT_ODCD_ERR_LOG_ADDR_MASK 0x000007ffffffffffULL +#define FIRE_DMCINT_ODCD_ERR_LOG_ADDR_SHFT 0 + +/* JBC DMCINT IDC error log register */ +#define FIRE_DMCINT_IDC_ERR_DMC_CTAG_MASK 0x000000000fff0000ULL +#define FIRE_DMCINT_IDC_ERR_DMC_CTAG_SHFT 16 +#define FIRE_DMCINT_IDC_ERR_TRANSID_MASK 0x000000000000c000ULL +#define FIRE_DMCINT_IDC_ERR_AGNTID_MASK 0x0000000000003c00ULL +#define FIRE_DMCINT_IDC_ERR_AGNTID_SHFT 10 +#define FIRE_DMCINT_IDC_ERR_SRCID_MASK 0x00000000000003e0ULL +#define FIRE_DMCINT_IDC_ERR_SRCID_SHFT 5 +#define FIRE_DMCINT_IDC_ERR_TARGID_MASK 0x000000000000001fULL +#define FIRE_DMCINT_IDC_ERRO_TARGID_SHFT 0 + +/* JBC CSR error log register */ +#define FIRE_JBC_CSR_ERR_LOG_WR 0x0000040000000000ULL +#define FIRE_JBC_CSR_ERR_LOG_BMASK_MASK 0x000003fffc000000ULL +#define FIRE_JBC_CSR_ERR_LOG_BMASK_SHFT 26 +#define FIRE_JBC_CSR_ERR_LOG_ADDR_MASK 0x0000000003ffffffULL +#define FIRE_JBC_CSR_ERR_LOG_ADDR_SHFT 0 + +/* JBC core and block interrupt enable register */ +#define FIRE_JBC_CORE_BLOCK_INT_EN_JBC 0x8000000000000000ULL +#define FIRE_JBC_CORE_BLOCK_INT_EN_CSR 0x0000000000000008ULL +#define FIRE_JBC_CORE_BLOCK_INT_EN_MERGE 0x0000000000000004ULL +#define FIRE_JBC_CORE_BLOCK_INT_EN_JBCINT 0x0000000000000002ULL +#define FIRE_JBC_CORE_BLOCK_INT_EN_DMCINT 0x0000000000000001ULL + +/* JBC core and block error status register */ +#define FIRE_JBC_CORE_BLOCK_ERR_STAT_CSR 0x0000000000000008ULL +#define FIRE_JBC_CORE_BLOCK_ERR_STAT_MERGE 0x0000000000000004ULL +#define FIRE_JBC_CORE_BLOCK_ERR_STAT_JBCINT 0x0000000000000002ULL +#define FIRE_JBC_CORE_BLOCK_ERR_STAT_DMCINT 0x0000000000000001ULL + +/* JBC performance counter select register - may also apply to UBC */ +#define FO_XBC_PRF_CNT_PIO_RD_PCIEB 0x0000000000000018ULL +#define FO_XBC_PRF_CNT_PIO_WR_PCIEB 0x0000000000000017ULL +#define FO_XBC_PRF_CNT_PIO_RD_PCIEA 0x0000000000000016ULL +#define FO_XBC_PRF_CNT_PIO_WR_PCIEA 0x0000000000000015ULL +#define FO_XBC_PRF_CNT_WB 0x0000000000000014ULL +#define FO_XBC_PRF_CNT_PIO_FRGN 0x0000000000000013ULL +#define FO_XBC_PRF_CNT_XB_NCHRNT 0x0000000000000012ULL +#define FO_XBC_PRF_CNT_FO_CHRNT 0x0000000000000011ULL +#define FO_XBC_PRF_CNT_XB_CHRNT 0x0000000000000010ULL +#define FO_XBC_PRF_CNT_AOKOFF_DOKOFF 0x000000000000000fULL +#define FO_XBC_PRF_CNT_DOKOFF 0x000000000000000eULL +#define FO_XBC_PRF_CNT_AOKOFF 0x000000000000000dULL +#define FO_XBC_PRF_CNT_RD_TOTAL 0x000000000000000cULL +#define FO_XBC_PRF_CNT_WR_TOTAL 0x000000000000000bULL +#define FO_XBC_PRF_CNT_WR_PARTIAL 0x000000000000000aULL +#define FO_XBC_PRF_CNT_PIOS_CSR_RINGB 0x0000000000000009ULL +#define FO_XBC_PRF_CNT_PIOS_CSR_RINGA 0x0000000000000008ULL +#define FO_XBC_PRF_CNT_PIOS_EBUS 0x0000000000000007ULL +#define FO_XBC_PRF_CNT_PIOS_I2C 0x0000000000000006ULL +#define FO_XBC_PRF_CNT_RD_LAT_SMPLS 0x0000000000000005ULL +#define FO_XBC_PRF_CNT_RD_LAT 0x0000000000000004ULL +#define FO_XBC_PRF_CNT_ON_XB 0x0000000000000003ULL +#define FO_XBC_PRF_CNT_XB_IDL 0x0000000000000002ULL +#define FO_XBC_PRF_CNT_XB_CLK 0x0000000000000001ULL +#define FO_XBC_PRF_CNT_NONE 0x0000000000000000ULL +#define FO_XBC_PRF_CNT_CNT1_SHFT 8 +#define FO_XBC_PRF_CNT_CNT0_SHFT 0 + +/* JBC performance counter 0/1 registers - may also apply to UBC */ +#define FO_XBC_PRF_CNT_MASK 0xffffffffffffffffULL +#define FO_XBC_PRF_CNT_SHFT 0 + +/* Lookup tables */ +const uint16_t const fire_freq_nak_tmr_thrs[6][4] = { + { 0x00ed, 0x049, 0x043, 0x030 }, + { 0x01a0, 0x076, 0x06b, 0x048 }, + { 0x022f, 0x09a, 0x056, 0x056 }, + { 0x042f, 0x11a, 0x096, 0x096 }, + { 0x082f, 0x21a, 0x116, 0x116 }, + { 0x102f, 0x41a, 0x216, 0x216 } +}; + +const uint16_t const fire_rply_tmr_thrs[6][4] = { + { 0x0379, 0x112, 0x0fc, 0x0b4 }, + { 0x0618, 0x1BA, 0x192, 0x10e }, + { 0x0831, 0x242, 0x143, 0x143 }, + { 0x0fb1, 0x422, 0x233, 0x233 }, + { 0x1eb0, 0x7e1, 0x412, 0x412 }, + { 0x3cb0, 0xf61, 0x7d2, 0x7d2 } +}; + +/* Register default values */ +#define FO_PCI_TLU_CTRL_L0S_TIM_DFLT 0xda +#define FO_PCI_TLU_CTRL_CFG_DFLT 0x1 +#define FO_PCI_LPU_LTSSM_CFG2_12_TO_DFLT 0x2dc6c0 +#define FO_PCI_LPU_LTSSM_CFG3_2_TO_DFLT 0x7a120 +#define FO_PCI_LPU_LTSSM_CFG4_DATA_RATE_DFLT 0x2 +#define FO_PCI_LPU_LTSSM_CFG4_N_FTS_DFLT 0x8c +#define OBERON_PCI_LPU_TXLNK_RPLY_TMR_THRS_DFLT 0xc9 +#define FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_HD_DFLT 0x0 +#define FO_PCI_LPU_TXLNK_RTR_FIFO_PTR_TL_DFLT 0xffff + +/* INO macros */ +#define FO_EQ_FIRST_INO 0x18 +#define FO_EQ_LAST_INO 0x3b +#define FO_DMC_PEC_INO 0x3e +#define FO_XCB_INO 0x3f +#define FO_MAX_INO FO_XCB_INO + +/* Device space macros */ +#define FO_CONF_BUS_SHFT 20 +#define FO_CONF_DEV_SHFT 15 +#define FO_CONF_FUNC_SHFT 12 +#define FO_CONF_REG_SHFT 0 +#define FO_IO_SIZE 0x10000000 +#define FO_MEM_SIZE 0x1ffff0000 + +#define FO_CONF_OFF(bus, slot, func, reg) \ + (((bus) << FO_CONF_BUS_SHFT) | \ + ((slot) << FO_CONF_DEV_SHFT) | \ + ((func) << FO_CONF_FUNC_SHFT) | \ + ((reg) << FO_CONF_REG_SHFT)) + +/* Width of the physical addresses the IOMMU translates to */ +#define FIRE_IOMMU_BITS 43 +#define OBERON_IOMMU_BITS 47 + +/* Event queue macros */ +#define FO_EQ_ALIGNMENT (512 * 1024) +#define FO_EQ_NRECORDS 128 +#define FO_EQ_RECORD_SIZE 64 + +/* Event queue record format */ +struct fo_msiq_record { + uint64_t fomqr_word0; + uint64_t fomqr_word1; + uint64_t fomqr_reserved[6]; +}; + +#define FO_MQR_WORD0_FMT_TYPE_MASK 0x7f00000000000000ULL +#define FO_MQR_WORD0_FMT_TYPE_SHFT 56 +#define FO_MQR_WORD0_FMT_TYPE_MSI64 0x7800000000000000ULL +#define FO_MQR_WORD0_FMT_TYPE_MSI32 0x5800000000000000ULL +#define FO_MQR_WORD0_FMT_TYPE_MSG 0x3000000000000000ULL +#define FO_MQR_WORD0_FMT_TYPE_MSG_ROUTE_MASK 0x0700000000000000ULL +#define FO_MQR_WORD0_FMT_TYPE_MSG_ROUTE_SHFT 56 +#define FO_MQR_WORD0_LENGTH_MASK 0x00ffc00000000000ULL +#define FO_MQR_WORD0_LENGTH_SHFT 46 +#define FO_MQR_WORD0_ADDR0_MASK 0x00003fff00000000ULL +#define FO_MQR_WORD0_ADDR0_SHFT 32 +#define FO_MQR_WORD0_RID_MASK 0x00000000ffff0000ULL +#define FO_MQR_WORD0_RID_SHFT 16 +#define FO_MQR_WORD0_DATA0_MASK 0x000000000000ffffULL +#define FO_MQR_WORD0_DATA0_SHFT 0 +#define FO_MQR_WORD1_ADDR1_MASK 0xffffffffffff0000ULL +#define FO_MQR_WORD1_ADDR1_SHFT 16 +#define FO_MQR_WORD1_DATA1_MASK 0x000000000000ffffULL +#define FO_MQR_WORD1_DATA1_SHFT 0 + +#endif /* !_SPARC64_PCI_FIREREG_H_ */ diff --git a/sys/sparc64/pci/firevar.h b/sys/sparc64/pci/firevar.h new file mode 100644 index 000000000000..58ba419daeea --- /dev/null +++ b/sys/sparc64/pci/firevar.h @@ -0,0 +1,98 @@ +/*- + * Copyright (c) 2009 by Marius Strobl . + * 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, + * without modification, immediately at the beginning of the file. + * 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$ + */ + +#ifndef _SPARC64_PCI_FIREVAR_H_ +#define _SPARC64_PCI_FIREVAR_H_ + +struct fire_softc { + struct iommu_state sc_is; + struct bus_dma_methods sc_dma_methods; + + struct mtx sc_msi_mtx; + struct mtx sc_pcib_mtx; + + struct resource *sc_mem_res[FIRE_NREG]; + struct resource *sc_irq_res[FIRE_NINTR]; + void *sc_ihand[FIRE_NINTR]; + + struct rman sc_pci_mem_rman; + struct rman sc_pci_io_rman; + bus_space_handle_t sc_pci_bh[FIRE_NRANGE]; + bus_space_tag_t sc_pci_cfgt; + bus_space_tag_t sc_pci_iot; + bus_space_tag_t sc_pci_memt; + bus_dma_tag_t sc_pci_dmat; + + device_t sc_dev; + + uint64_t *sc_msiq; + u_char *sc_msi_bitmap; + uint32_t *sc_msi_msiq_table; + u_char *sc_msiq_bitmap; + uint64_t sc_msi_addr32; + uint64_t sc_msi_addr64; + uint32_t sc_msi_count; + uint32_t sc_msi_first; + uint32_t sc_msi_data_mask; + uint32_t sc_msix_data_width; + uint32_t sc_msiq_count; + uint32_t sc_msiq_size; + uint32_t sc_msiq_first; + uint32_t sc_msiq_ino_first; + + phandle_t sc_node; + + u_int sc_mode; +#define FIRE_MODE_FIRE 0 +#define FIRE_MODE_OBERON 1 + + u_int sc_flags; +#define FIRE_MSIX (1 << 0) + + uint32_t sc_ign; + + uint32_t sc_stats_ilu_err; + uint32_t sc_stats_jbc_ce_async; + uint32_t sc_stats_jbc_unsol_int; + uint32_t sc_stats_jbc_unsol_rd; + uint32_t sc_stats_mmu_err; + uint32_t sc_stats_tlu_ce; + uint32_t sc_stats_tlu_oe_non_fatal; + uint32_t sc_stats_tlu_oe_rx_err; + uint32_t sc_stats_tlu_oe_tx_err; + uint32_t sc_stats_ubc_dmardue; + + uint8_t sc_pci_secbus; + uint8_t sc_pci_subbus; + + struct ofw_bus_iinfo sc_pci_iinfo; +}; + +#endif /* !_SPARC64_PCI_FIREVAR_H_ */ diff --git a/sys/sparc64/pci/ofw_pci.h b/sys/sparc64/pci/ofw_pci.h index 3b5059858c1a..ad9642014d42 100644 --- a/sys/sparc64/pci/ofw_pci.h +++ b/sys/sparc64/pci/ofw_pci.h @@ -48,6 +48,31 @@ typedef uint32_t ofw_pci_intr_t; #define OFW_TYPE_PCI "pci" #define OFW_TYPE_PCIE "pciex" +struct ofw_pci_msi_addr_ranges { + uint32_t addr32_hi; + uint32_t addr32_lo; + uint32_t addr32_sz; + uint32_t addr64_hi; + uint32_t addr64_lo; + uint32_t addr64_sz; +}; + +#define OFW_PCI_MSI_ADDR_RANGE_32(r) \ + (((uint64_t)(r)->addr32_hi << 32) | (uint64_t)(r)->addr32_lo) +#define OFW_PCI_MSI_ADDR_RANGE_64(r) \ + (((uint64_t)(r)->addr64_hi << 32) | (uint64_t)(r)->addr64_lo) + +struct ofw_pci_msi_eq_to_devino { + uint32_t eq_first; + uint32_t eq_count; + uint32_t devino_first; +}; + +struct ofw_pci_msi_ranges { + uint32_t first; + uint32_t count; +}; + struct ofw_pci_ranges { uint32_t cspace; uint32_t child_hi; diff --git a/sys/sparc64/pci/ofw_pcib.c b/sys/sparc64/pci/ofw_pcib.c index 3be57e3d340a..c18d7c0e3497 100644 --- a/sys/sparc64/pci/ofw_pcib.c +++ b/sys/sparc64/pci/ofw_pcib.c @@ -3,6 +3,7 @@ * Copyright (c) 2000 Michael Smith * Copyright (c) 2000 BSDi * Copyright (c) 2001 - 2003 Thomas Moestl + * Copyright (c) 2009 by Marius Strobl * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,8 +38,9 @@ __FBSDID("$FreeBSD$"); #include "opt_ofw_pci.h" #include -#include #include +#include +#include #include #include @@ -82,6 +84,11 @@ static device_method_t ofw_pcib_methods[] = { DEVMETHOD(pcib_read_config, pcib_read_config), DEVMETHOD(pcib_write_config, pcib_write_config), DEVMETHOD(pcib_route_interrupt, ofw_pcib_gen_route_interrupt), + DEVMETHOD(pcib_alloc_msi, pcib_alloc_msi), + DEVMETHOD(pcib_release_msi, pcib_release_msi), + DEVMETHOD(pcib_alloc_msix, pcib_alloc_msix), + DEVMETHOD(pcib_release_msix, pcib_release_msix), + DEVMETHOD(pcib_map_msi, pcib_map_msi), /* ofw_bus interface */ DEVMETHOD(ofw_bus_get_node, ofw_pcib_gen_get_node), @@ -93,24 +100,56 @@ static devclass_t pcib_devclass; DEFINE_CLASS_0(pcib, ofw_pcib_driver, ofw_pcib_methods, sizeof(struct ofw_pcib_gen_softc)); -DRIVER_MODULE(ofw_pcib, pci, ofw_pcib_driver, pcib_devclass, 0, 0); +EARLY_DRIVER_MODULE(ofw_pcib, pci, ofw_pcib_driver, pcib_devclass, 0, 0, + BUS_PASS_BUS); +MODULE_DEPEND(ofw_pcib, pci, 1, 1, 1); static int ofw_pcib_probe(device_t dev) { + char desc[sizeof("OFW PCIe-PCIe bridge")]; + const char *dtype, *pbdtype; + +#define ISDTYPE(dtype, type) \ + (((dtype) != NULL) && strcmp((dtype), (type)) == 0) if ((pci_get_class(dev) == PCIC_BRIDGE) && (pci_get_subclass(dev) == PCIS_BRIDGE_PCI) && ofw_bus_get_node(dev) != 0) { - device_set_desc(dev, "OFW PCI-PCI bridge"); + dtype = ofw_bus_get_type(dev); + pbdtype = ofw_bus_get_type(device_get_parent( + device_get_parent(dev))); + snprintf(desc, sizeof(desc), "OFW PCI%s-PCI%s bridge", + ISDTYPE(pbdtype, OFW_TYPE_PCIE) ? "e" : "", + ISDTYPE(dtype, OFW_TYPE_PCIE) ? "e" : ""); + device_set_desc_copy(dev, desc); return (0); } + +#undef ISDTYPE + return (ENXIO); } static int ofw_pcib_attach(device_t dev) { + struct ofw_pcib_gen_softc *sc; + + sc = device_get_softc(dev); + + /* Quirk handling */ + switch (pci_get_devid(dev)) { + /* + * The ALi M5249 found in Fire-based machines by definition must me + * subtractive as they have a ISA bridge on their secondary side but + * don't indicate this in the class code although the ISA I/O range + * isn't included in their bridge decode. + */ + case 0x524910b9: + sc->ops_pcib_sc.flags |= PCIB_SUBTRACTIVE; + break; + } ofw_pcib_gen_setup(dev); pcib_attach_common(dev); diff --git a/sys/sparc64/pci/ofw_pcibus.c b/sys/sparc64/pci/ofw_pcibus.c index bd2c7a65888c..a0a447bbf0c5 100644 --- a/sys/sparc64/pci/ofw_pcibus.c +++ b/sys/sparc64/pci/ofw_pcibus.c @@ -3,6 +3,7 @@ * Copyright (c) 2000, Michael Smith * Copyright (c) 2000, BSDi * Copyright (c) 2003, Thomas Moestl + * Copyright (c) 2005 - 2009 Marius Strobl * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -64,11 +65,11 @@ static void ofw_pcibus_setup_device(device_t bridge, uint32_t clock, u_int busno, u_int slot, u_int func); /* Methods */ -static device_probe_t ofw_pcibus_probe; -static device_attach_t ofw_pcibus_attach; -static pci_assign_interrupt_t ofw_pcibus_assign_interrupt; -static ofw_bus_get_devinfo_t ofw_pcibus_get_devinfo; static bus_child_pnpinfo_str_t ofw_pcibus_pnpinfo_str; +static device_attach_t ofw_pcibus_attach; +static device_probe_t ofw_pcibus_probe; +static ofw_bus_get_devinfo_t ofw_pcibus_get_devinfo; +static pci_assign_interrupt_t ofw_pcibus_assign_interrupt; static device_method_t ofw_pcibus_methods[] = { /* Device interface */ @@ -101,7 +102,8 @@ static devclass_t pci_devclass; DEFINE_CLASS_1(pci, ofw_pcibus_driver, ofw_pcibus_methods, 1 /* no softc */, pci_driver); -DRIVER_MODULE(ofw_pcibus, pcib, ofw_pcibus_driver, pci_devclass, 0, 0); +EARLY_DRIVER_MODULE(ofw_pcibus, pcib, ofw_pcibus_driver, pci_devclass, 0, 0, + BUS_PASS_BUS); MODULE_VERSION(ofw_pcibus, 1); MODULE_DEPEND(ofw_pcibus, pci, 1, 1, 1); @@ -123,6 +125,11 @@ static void ofw_pcibus_setup_device(device_t bridge, uint32_t clock, u_int busno, u_int slot, u_int func) { +#define CS_READ(n, w) \ + PCIB_READ_CONFIG(bridge, busno, slot, func, (n), (w)) +#define CS_WRITE(n, v, w) \ + PCIB_WRITE_CONFIG(bridge, busno, slot, func, (n), (v), (w)) + #ifndef SUN4V uint32_t reg; @@ -137,33 +144,27 @@ ofw_pcibus_setup_device(device_t bridge, uint32_t clock, u_int busno, * For bridges, we additionally set up the bridge control and the * secondary latency registers. */ - if ((PCIB_READ_CONFIG(bridge, busno, slot, func, PCIR_HDRTYPE, 1) & - PCIM_HDRTYPE) == PCIM_HDRTYPE_BRIDGE) { - reg = PCIB_READ_CONFIG(bridge, busno, slot, func, - PCIR_BRIDGECTL_1, 1); + if ((CS_READ(PCIR_HDRTYPE, 1) & PCIM_HDRTYPE) == + PCIM_HDRTYPE_BRIDGE) { + reg = CS_READ(PCIR_BRIDGECTL_1, 1); reg |= PCIB_BCR_MASTER_ABORT_MODE | PCIB_BCR_SERR_ENABLE | PCIB_BCR_PERR_ENABLE; #ifdef OFW_PCI_DEBUG device_printf(bridge, "bridge %d/%d/%d: control 0x%x -> 0x%x\n", - busno, slot, func, PCIB_READ_CONFIG(bridge, busno, slot, - func, PCIR_BRIDGECTL_1, 1), reg); + busno, slot, func, CS_READ(PCIR_BRIDGECTL_1, 1), reg); #endif /* OFW_PCI_DEBUG */ - PCIB_WRITE_CONFIG(bridge, busno, slot, func, PCIR_BRIDGECTL_1, - reg, 1); + CS_WRITE(PCIR_BRIDGECTL_1, reg, 1); reg = OFW_PCI_LATENCY; #ifdef OFW_PCI_DEBUG device_printf(bridge, "bridge %d/%d/%d: latency timer %d -> %d\n", - busno, slot, func, PCIB_READ_CONFIG(bridge, busno, slot, - func, PCIR_SECLAT_1, 1), reg); + busno, slot, func, CS_READ(PCIR_SECLAT_1, 1), reg); #endif /* OFW_PCI_DEBUG */ - PCIB_WRITE_CONFIG(bridge, busno, slot, func, PCIR_SECLAT_1, - reg, 1); + CS_WRITE(PCIR_SECLAT_1, reg, 1); } else { - reg = PCIB_READ_CONFIG(bridge, busno, slot, func, - PCIR_MINGNT, 1); + reg = CS_READ(PCIR_MINGNT, 1); if (reg != 0) { switch (clock) { case 33000000: @@ -179,10 +180,9 @@ ofw_pcibus_setup_device(device_t bridge, uint32_t clock, u_int busno, } #ifdef OFW_PCI_DEBUG device_printf(bridge, "device %d/%d/%d: latency timer %d -> %d\n", - busno, slot, func, PCIB_READ_CONFIG(bridge, busno, slot, func, - PCIR_LATTIMER, 1), reg); + busno, slot, func, CS_READ(PCIR_LATTIMER, 1), reg); #endif /* OFW_PCI_DEBUG */ - PCIB_WRITE_CONFIG(bridge, busno, slot, func, PCIR_LATTIMER, reg, 1); + CS_WRITE(PCIR_LATTIMER, reg, 1); /* * Compute a value to write into the cache line size register. @@ -191,17 +191,34 @@ ofw_pcibus_setup_device(device_t bridge, uint32_t clock, u_int busno, * reached. Generally, the cache line size is fixed at 64 bytes * by Fireplane/Safari, JBus and UPA. */ - PCIB_WRITE_CONFIG(bridge, busno, slot, func, PCIR_CACHELNSZ, - STRBUF_LINESZ / sizeof(uint32_t), 1); + CS_WRITE(PCIR_CACHELNSZ, STRBUF_LINESZ / sizeof(uint32_t), 1); #endif + /* + * Ensure that ALi M5229 report the actual content of PCIR_PROGIF + * and that IDE I/O is force enabled. The former is done in order + * to have unique behavior across revisions as some default to + * hiding bits 4-6 for compliance with PCI 2.3. The latter is done + * as at least revision 0xc8 requires the PCIM_CMD_PORTEN bypass + * to be always enabled as otherwise even enabling PCIM_CMD_PORTEN + * results in an instant data access trap on Fire-based machines. + * Thus these quirks have to be handled before pci(4) adds the maps. + * Note that for older revisions bit 0 of register 0x50 enables the + * internal IDE function instead of force enabling IDE I/O. + */ + if ((CS_READ(PCIR_VENDOR, 2) == 0x10b9 && + CS_READ(PCIR_DEVICE, 2) == 0x5229)) + CS_WRITE(0x50, CS_READ(0x50, 1) | 0x3, 1); + /* * The preset in the intline register is usually wrong. Reset * it to 255, so that the PCI code will reroute the interrupt if * needed. */ - PCIB_WRITE_CONFIG(bridge, busno, slot, func, PCIR_INTLINE, - PCI_INVALID_IRQ, 1); + CS_WRITE(PCIR_INTLINE, PCI_INVALID_IRQ, 1); + +#undef CS_READ +#undef CS_WRITE } static int @@ -222,9 +239,14 @@ ofw_pcibus_attach(device_t dev) domain, busno); node = ofw_bus_get_node(dev); -#ifndef SUN4V - /* Add the PCI side of the HOST-PCI bridge itself to the bus. */ + /* + * Add the PCI side of the host-PCI bridge itself to the bus. + * Note that we exclude the host-PCIe bridges here as these + * have no configuration space implemented themselves. + */ if (strcmp(device_get_name(device_get_parent(pcib)), "nexus") == 0 && + ofw_bus_get_type(pcib) != NULL && + strcmp(ofw_bus_get_type(pcib), OFW_TYPE_PCIE) != 0 && (dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(pcib, domain, busno, 0, 0, sizeof(*dinfo))) != NULL) { if (ofw_bus_gen_setup_devinfo(&dinfo->opd_obdinfo, node) != 0) @@ -232,7 +254,6 @@ ofw_pcibus_attach(device_t dev) else pci_add_child(dev, (struct pci_devinfo *)dinfo); } -#endif if (OF_getprop(ofw_bus_get_node(pcib), "clock-frequency", &clock, sizeof(clock)) == -1) diff --git a/sys/sparc64/pci/psycho.c b/sys/sparc64/pci/psycho.c index 8034612fd4cf..486136a4600a 100644 --- a/sys/sparc64/pci/psycho.c +++ b/sys/sparc64/pci/psycho.c @@ -115,6 +115,7 @@ static bus_alloc_resource_t psycho_alloc_resource; static bus_activate_resource_t psycho_activate_resource; static bus_deactivate_resource_t psycho_deactivate_resource; static bus_release_resource_t psycho_release_resource; +static bus_describe_intr_t psycho_describe_intr; static bus_get_dma_tag_t psycho_get_dma_tag; static pcib_maxslots_t psycho_maxslots; static pcib_read_config_t psycho_read_config; @@ -139,6 +140,7 @@ static device_method_t psycho_methods[] = { DEVMETHOD(bus_activate_resource, psycho_activate_resource), DEVMETHOD(bus_deactivate_resource, psycho_deactivate_resource), DEVMETHOD(bus_release_resource, psycho_release_resource), + DEVMETHOD(bus_describe_intr, psycho_describe_intr), DEVMETHOD(bus_get_dma_tag, psycho_get_dma_tag), /* pcib interface */ @@ -181,9 +183,9 @@ struct psycho_dma_sync { void *pds_arg; /* argument for the handler */ void *pds_cookie; /* parent bus int. cookie */ device_t pds_ppb; /* farest PCI-PCI bridge */ - uint8_t pds_bus; /* bus of farest PCI device */ - uint8_t pds_slot; /* slot of farest PCI device */ - uint8_t pds_func; /* func. of farest PCI device */ + uint8_t pds_bus; /* bus of farest PCI dev. */ + uint8_t pds_slot; /* slot of farest PCI dev. */ + uint8_t pds_func; /* func. of farest PCI dev. */ }; #define PSYCHO_READ8(sc, off) \ @@ -205,8 +207,8 @@ struct psycho_dma_sync { * "Hummingbird" is the UltraSPARC IIe onboard UPA to PCI bridge. It's * basically the same as Sabre but without an APB underneath it. * - * "Psycho" and "Psycho+" are dual UPA to PCI bridges. They sit on the UPA bus - * and manage two PCI buses. "Psycho" has two 64-bit 33MHz buses, while + * "Psycho" and "Psycho+" are dual UPA to PCI bridges. They sit on the UPA + * bus and manage two PCI buses. "Psycho" has two 64-bit 33MHz buses, while * "Psycho+" controls both a 64-bit 33Mhz and a 64-bit 66Mhz PCI bus. You * will usually find a "Psycho+" since I don't think the original "Psycho" * ever shipped, and if it did it would be in the U30. @@ -263,7 +265,8 @@ psycho_get_desc(device_t dev) rv = psycho_find_desc(psycho_models, ofw_bus_get_model(dev)); if (rv == NULL) - rv = psycho_find_desc(psycho_compats, ofw_bus_get_compat(dev)); + rv = psycho_find_desc(psycho_compats, + ofw_bus_get_compat(dev)); return (rv); } @@ -295,7 +298,7 @@ psycho_attach(device_t dev) uint32_t dvmabase, prop, prop_array[2]; int32_t rev; u_int rerun, ver; - int i, n; + int i, j; node = ofw_bus_get_node(dev); sc = device_get_softc(dev); @@ -461,12 +464,12 @@ psycho_attach(device_t dev) rman_manage_region(&sc->sc_pci_mem_rman, 0, PSYCHO_MEM_SIZE) != 0) panic("%s: failed to set up memory rman", __func__); - n = OF_getprop_alloc(node, "ranges", sizeof(*range), (void **)&range); + i = OF_getprop_alloc(node, "ranges", sizeof(*range), (void **)&range); /* * Make sure that the expected ranges are present. The * OFW_PCI_CS_MEM64 one is not currently used though. */ - if (n != PSYCHO_NRANGE) + if (i != PSYCHO_NRANGE) panic("%s: unsupported number of ranges", __func__); /* * Find the addresses of the various bus spaces. @@ -474,11 +477,12 @@ psycho_attach(device_t dev) * The physical start addresses of the ranges are the configuration, * memory and I/O handles. */ - for (n = 0; n < PSYCHO_NRANGE; n++) { - i = OFW_PCI_RANGE_CS(&range[n]); - if (sc->sc_pci_bh[i] != 0) - panic("%s: duplicate range for space %d", __func__, i); - sc->sc_pci_bh[i] = OFW_PCI_RANGE_PHYS(&range[n]); + for (i = 0; i < PSYCHO_NRANGE; i++) { + j = OFW_PCI_RANGE_CS(&range[i]); + if (sc->sc_pci_bh[j] != 0) + panic("%s: duplicate range for space %d", + __func__, j); + sc->sc_pci_bh[j] = OFW_PCI_RANGE_PHYS(&range[i]); } free(range, M_OFWPROP); @@ -496,8 +500,8 @@ psycho_attach(device_t dev) * vectors. We do this early in order to be able to catch * stray interrupts. */ - for (n = 0; n <= PSYCHO_MAX_INO; n++) { - if (psycho_find_intrmap(sc, n, &intrmap, &intrclr, + for (i = 0; i <= PSYCHO_MAX_INO; i++) { + if (psycho_find_intrmap(sc, i, &intrmap, &intrclr, NULL) == 0) continue; pica = malloc(sizeof(*pica), M_DEVBUF, M_NOWAIT); @@ -515,21 +519,21 @@ psycho_attach(device_t dev) */ device_printf(dev, "intr map (INO %d, %s) %#lx: %#lx, clr: %#lx\n", - n, intrmap <= PSR_PCIB3_INT_MAP ? "PCI" : "OBIO", - (u_long)intrmap, (u_long)PSYCHO_READ8(sc, intrmap), - (u_long)intrclr); - PSYCHO_WRITE8(sc, intrmap, INTMAP_VEC(sc->sc_ign, n)); + i, intrmap <= PSR_PCIB3_INT_MAP ? "PCI" : "OBIO", + (u_long)intrmap, (u_long)PSYCHO_READ8(sc, + intrmap), (u_long)intrclr); + PSYCHO_WRITE8(sc, intrmap, INTMAP_VEC(sc->sc_ign, i)); PSYCHO_WRITE8(sc, intrclr, 0); PSYCHO_WRITE8(sc, intrmap, - INTMAP_ENABLE(INTMAP_VEC(sc->sc_ign, n), + INTMAP_ENABLE(INTMAP_VEC(sc->sc_ign, i), PCPU_GET(mid))); #endif - i = intr_controller_register(INTMAP_VEC(sc->sc_ign, n), - &psycho_ic, pica); - if (i != 0) + j = intr_controller_register(INTMAP_VEC(sc->sc_ign, + i), &psycho_ic, pica); + if (j != 0) device_printf(dev, "could not register " "interrupt controller for INO %d (%d)\n", - n, i); + i, j); } if (sc->sc_mode == PSYCHO_MODE_PSYCHO) @@ -552,6 +556,7 @@ psycho_attach(device_t dev) M_NOWAIT | M_ZERO); if (sc->sc_is == NULL) panic("%s: malloc iommu_state failed", __func__); + sc->sc_is->is_flags = IOMMU_PRESERVE_PROM; if (sc->sc_mode == PSYCHO_MODE_SABRE) sc->sc_is->is_pmaxaddr = IOMMU_MAXADDR(SABRE_IOMMU_BITS); @@ -583,16 +588,17 @@ psycho_attach(device_t dev) sc->sc_pci_dmat->dt_cookie = sc->sc_is; sc->sc_pci_dmat->dt_mt = &iommu_dma_methods; - n = OF_getprop(node, "bus-range", (void *)prop_array, + i = OF_getprop(node, "bus-range", (void *)prop_array, sizeof(prop_array)); - if (n == -1) + if (i == -1) panic("%s: could not get bus-range", __func__); - if (n != sizeof(prop_array)) - panic("%s: broken bus-range (%d)", __func__, n); + if (i != sizeof(prop_array)) + panic("%s: broken bus-range (%d)", __func__, i); + sc->sc_pci_secbus = prop_array[0]; + sc->sc_pci_subbus = prop_array[1]; if (bootverbose) device_printf(dev, "bus range %u to %u; PCI bus %d\n", - prop_array[0], prop_array[1], prop_array[0]); - sc->sc_pci_secbus = prop_array[0]; + sc->sc_pci_secbus, sc->sc_pci_subbus, sc->sc_pci_secbus); /* Clear any pending PCI error bits. */ PCIB_WRITE_CONFIG(dev, sc->sc_pci_secbus, PCS_DEVICE, PCS_FUNC, @@ -657,15 +663,15 @@ psycho_attach(device_t dev) PCIB_WRITE_CONFIG(dev, sc->sc_pci_secbus, PCS_DEVICE, PCS_FUNC, PCIR_LATTIMER, OFW_PCI_LATENCY, 1); - for (n = PCIR_VENDOR; n < PCIR_STATUS; n += sizeof(uint16_t)) - le16enc(&sc->sc_pci_hpbcfg[n], bus_space_read_2( + for (i = PCIR_VENDOR; i < PCIR_STATUS; i += sizeof(uint16_t)) + le16enc(&sc->sc_pci_hpbcfg[i], bus_space_read_2( sc->sc_pci_cfgt, sc->sc_pci_bh[OFW_PCI_CS_CONFIG], PSYCHO_CONF_OFF(sc->sc_pci_secbus, PCS_DEVICE, - PCS_FUNC, n))); - for (n = PCIR_REVID; n <= PCIR_BIST; n += sizeof(uint8_t)) - sc->sc_pci_hpbcfg[n] = bus_space_read_1(sc->sc_pci_cfgt, + PCS_FUNC, i))); + for (i = PCIR_REVID; i <= PCIR_BIST; i += sizeof(uint8_t)) + sc->sc_pci_hpbcfg[i] = bus_space_read_1(sc->sc_pci_cfgt, sc->sc_pci_bh[OFW_PCI_CS_CONFIG], PSYCHO_CONF_OFF( - sc->sc_pci_secbus, PCS_DEVICE, PCS_FUNC, n)); + sc->sc_pci_secbus, PCS_DEVICE, PCS_FUNC, i)); ofw_bus_setup_iinfo(node, &sc->sc_pci_iinfo, sizeof(ofw_pci_intr_t)); /* @@ -694,8 +700,8 @@ psycho_set_intr(struct psycho_softc *sc, u_int index, bus_addr_t intrmap, int rid; rid = index; - sc->sc_irq_res[index] = bus_alloc_resource_any(sc->sc_dev, SYS_RES_IRQ, - &rid, RF_ACTIVE); + sc->sc_irq_res[index] = bus_alloc_resource_any(sc->sc_dev, + SYS_RES_IRQ, &rid, RF_ACTIVE); if (sc->sc_irq_res[index] == NULL && intrmap >= PSR_POWER_INT_MAP) { /* * These interrupts aren't mandatory and not available @@ -704,7 +710,8 @@ psycho_set_intr(struct psycho_softc *sc, u_int index, bus_addr_t intrmap, return; } if (sc->sc_irq_res[index] == NULL || - INTIGN(vec = rman_get_start(sc->sc_irq_res[index])) != sc->sc_ign || + INTIGN(vec = rman_get_start(sc->sc_irq_res[index])) != + sc->sc_ign || INTVEC(PSYCHO_READ8(sc, intrmap)) != vec || intr_vectors[vec].iv_ic != &psycho_ic || bus_setup_intr(sc->sc_dev, sc->sc_irq_res[index], @@ -714,8 +721,8 @@ psycho_set_intr(struct psycho_softc *sc, u_int index, bus_addr_t intrmap, } static int -psycho_find_intrmap(struct psycho_softc *sc, u_int ino, bus_addr_t *intrmapptr, - bus_addr_t *intrclrptr, bus_addr_t *intrdiagptr) +psycho_find_intrmap(struct psycho_softc *sc, u_int ino, + bus_addr_t *intrmapptr, bus_addr_t *intrclrptr, bus_addr_t *intrdiagptr) { bus_addr_t intrclr, intrmap; uint64_t diag; @@ -875,7 +882,7 @@ psycho_wakeup(void *arg) { struct psycho_softc *sc = arg; - /* Gee, we don't really have a framework to deal with this properly. */ + /* We don't really have a framework to deal with this properly. */ device_printf(sc->sc_dev, "power management wakeup\n"); return (FILTER_HANDLED); } @@ -920,6 +927,10 @@ psycho_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, int i; sc = device_get_softc(dev); + if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus || + slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX) + return (-1); + bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG]; /* @@ -992,14 +1003,18 @@ psycho_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, } static void -psycho_write_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, - uint32_t val, int width) +psycho_write_config(device_t dev, u_int bus, u_int slot, u_int func, + u_int reg, uint32_t val, int width) { struct psycho_softc *sc; bus_space_handle_t bh; u_long offset = 0; sc = device_get_softc(dev); + if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus || + slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX) + return; + offset = PSYCHO_CONF_OFF(bus, slot, func, reg); bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG]; switch (width) { @@ -1029,8 +1044,9 @@ psycho_route_interrupt(device_t bridge, device_t dev, int pin) sc = device_get_softc(bridge); pintr = pin; - if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo, ®, - sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr), maskbuf)) + if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo, + ®, sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr), + maskbuf)) return (mintr); /* * If this is outside of the range for an intpin, it's likely a full @@ -1052,7 +1068,8 @@ psycho_route_interrupt(device_t bridge, device_t dev, int pin) intrmap = PSR_PCIA0_INT_MAP + 8 * (pci_get_slot(dev) - 1 + 3 * sc->sc_half); mintr = INTINO(PSYCHO_READ8(sc, intrmap)) + pin - 1; - device_printf(bridge, "guessing interrupt %d for device %d.%d pin %d\n", + device_printf(bridge, + "guessing interrupt %d for device %d.%d pin %d\n", (int)mintr, pci_get_slot(dev), pci_get_function(dev), pin); return (mintr); } @@ -1246,6 +1263,18 @@ psycho_teardown_intr(device_t dev, device_t child, struct resource *vec, return (bus_generic_teardown_intr(dev, child, vec, cookie)); } +static int +psycho_describe_intr(device_t dev, device_t child, struct resource *vec, + void *cookie, const char *descr) +{ + struct psycho_softc *sc; + + sc = device_get_softc(dev); + if (sc->sc_mode == PSYCHO_MODE_SABRE) + cookie = ((struct psycho_dma_sync *)cookie)->pds_cookie; + return (bus_generic_describe_intr(dev, child, vec, cookie, descr)); +} + static struct resource * psycho_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -1271,8 +1300,8 @@ psycho_alloc_resource(device_t bus, device_t child, int type, int *rid, if (start != end) panic("%s: XXX: interrupt range", __func__); start = end = INTMAP_VEC(sc->sc_ign, end); - return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, - rid, start, end, count, flags)); + return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, + type, rid, start, end, count, flags)); } switch (type) { case SYS_RES_MEMORY: @@ -1387,7 +1416,8 @@ psycho_alloc_bus_tag(struct psycho_softc *sc, int type) { bus_space_tag_t bt; - bt = malloc(sizeof(struct bus_space_tag), M_DEVBUF, M_NOWAIT | M_ZERO); + bt = malloc(sizeof(struct bus_space_tag), M_DEVBUF, + M_NOWAIT | M_ZERO); if (bt == NULL) panic("%s: out of memory", __func__); diff --git a/sys/sparc64/pci/psychovar.h b/sys/sparc64/pci/psychovar.h index 04d81adf7315..e7c6980bba5c 100644 --- a/sys/sparc64/pci/psychovar.h +++ b/sys/sparc64/pci/psychovar.h @@ -75,6 +75,7 @@ struct psycho_softc { struct rman sc_pci_io_rman; uint8_t sc_pci_secbus; + uint8_t sc_pci_subbus; uint8_t sc_pci_hpbcfg[16]; diff --git a/sys/sparc64/pci/schizo.c b/sys/sparc64/pci/schizo.c index 4685a611315c..f783b23f1c43 100644 --- a/sys/sparc64/pci/schizo.c +++ b/sys/sparc64/pci/schizo.c @@ -113,6 +113,7 @@ static bus_alloc_resource_t schizo_alloc_resource; static bus_activate_resource_t schizo_activate_resource; static bus_deactivate_resource_t schizo_deactivate_resource; static bus_release_resource_t schizo_release_resource; +static bus_describe_intr_t schizo_describe_intr; static bus_get_dma_tag_t schizo_get_dma_tag; static pcib_maxslots_t schizo_maxslots; static pcib_read_config_t schizo_read_config; @@ -137,6 +138,7 @@ static device_method_t schizo_methods[] = { DEVMETHOD(bus_activate_resource, schizo_activate_resource), DEVMETHOD(bus_deactivate_resource, schizo_deactivate_resource), DEVMETHOD(bus_release_resource, schizo_release_resource), + DEVMETHOD(bus_describe_intr, schizo_describe_intr), DEVMETHOD(bus_get_dma_tag, schizo_get_dma_tag), /* pcib interface */ @@ -180,9 +182,9 @@ struct schizo_dma_sync { void *sds_cookie; uint64_t sds_syncval; device_t sds_ppb; /* farest PCI-PCI bridge */ - uint8_t sds_bus; /* bus of farest PCI device */ - uint8_t sds_slot; /* slot of farest PCI device */ - uint8_t sds_func; /* func. of farest PCI device */ + uint8_t sds_bus; /* bus of farest PCI dev. */ + uint8_t sds_slot; /* slot of farest PCI dev. */ + uint8_t sds_func; /* func. of farest PCI dev. */ }; #define SCHIZO_PERF_CNT_QLTY 100 @@ -260,7 +262,7 @@ schizo_attach(device_t dev) uint64_t ino_bitmap, reg; phandle_t node; uint32_t prop, prop_array[2]; - int i, mode, n, nrange, rid, tsbsize; + int i, j, mode, rid, tsbsize; sc = device_get_softc(dev); node = ofw_bus_get_node(dev); @@ -289,18 +291,18 @@ schizo_attach(device_t dev) */ sc->sc_half = (bus_get_resource_start(dev, SYS_RES_MEMORY, STX_PCI) >> 20) & 1; - for (n = 0; n < (mode == SCHIZO_MODE_SCZ ? SCZ_NREG : TOM_NREG); - n++) { - rid = n; - sc->sc_mem_res[n] = bus_alloc_resource_any(dev, + for (i = 0; i < (mode == SCHIZO_MODE_SCZ ? SCZ_NREG : TOM_NREG); + i++) { + rid = i; + sc->sc_mem_res[i] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, (((mode == SCHIZO_MODE_SCZ && ((sc->sc_half == 1 && - n == STX_PCI) || n == STX_CTRL)) || + i == STX_PCI) || i == STX_CTRL)) || (mode == SCHIZO_MODE_TOM && sc->sc_half == 0 && - n == STX_CTRL)) ? RF_SHAREABLE : 0) | RF_ACTIVE); - if (sc->sc_mem_res[n] == NULL) + i == STX_CTRL)) ? RF_SHAREABLE : 0) | RF_ACTIVE); + if (sc->sc_mem_res[i] == NULL) panic("%s: could not allocate register bank %d", - __func__, n); + __func__, i); } /* @@ -333,7 +335,8 @@ schizo_attach(device_t dev) if (OF_getprop(node, "portid", &sc->sc_ign, sizeof(sc->sc_ign)) == -1) panic("%s: could not determine IGN", __func__); - if (OF_getprop(node, "version#", &sc->sc_ver, sizeof(sc->sc_ver)) == -1) + if (OF_getprop(node, "version#", &sc->sc_ver, sizeof(sc->sc_ver)) == + -1) panic("%s: could not determine version", __func__); if (OF_getprop(node, "clock-frequency", &prop, sizeof(prop)) == -1) prop = 33000000; @@ -397,21 +400,21 @@ schizo_attach(device_t dev) * This is complicated by the fact that a pair of Schizo PBMs * shares one IGN. */ - n = OF_getprop(node, "ino-bitmap", (void *)prop_array, + i = OF_getprop(node, "ino-bitmap", (void *)prop_array, sizeof(prop_array)); - if (n == -1) + if (i == -1) panic("%s: could not get ino-bitmap", __func__); ino_bitmap = ((uint64_t)prop_array[1] << 32) | prop_array[0]; - for (n = 0; n <= STX_MAX_INO; n++) { - if ((ino_bitmap & (1ULL << n)) == 0) + for (i = 0; i <= STX_MAX_INO; i++) { + if ((ino_bitmap & (1ULL << i)) == 0) continue; - if (n == STX_FB0_INO || n == STX_FB1_INO) + if (i == STX_FB0_INO || i == STX_FB1_INO) /* Leave for upa(4). */ continue; - i = schizo_intr_register(sc, n); - if (i != 0) + j = schizo_intr_register(sc, i); + if (j != 0) device_printf(dev, "could not register interrupt " - "controller for INO %d (%d)\n", n, i); + "controller for INO %d (%d)\n", i, j); } /* @@ -453,6 +456,7 @@ schizo_attach(device_t dev) * buffer, in Schizo version < 5 (i.e. revision < 2.3) it's * affected by several errata and basically unusable though. */ + sc->sc_is.is_flags = IOMMU_PRESERVE_PROM; sc->sc_is.is_pmaxaddr = IOMMU_MAXADDR(STX_IOMMU_BITS); sc->sc_is.is_sb[0] = sc->sc_is.is_sb[1] = 0; if (OF_getproplen(node, "no-streaming-cache") < 0 && @@ -464,9 +468,9 @@ schizo_attach(device_t dev) tsbsize = (x); \ break; \ - n = OF_getprop(node, "virtual-dma", (void *)prop_array, + i = OF_getprop(node, "virtual-dma", (void *)prop_array, sizeof(prop_array)); - if (n == -1 || n != sizeof(prop_array)) + if (i == -1 || i != sizeof(prop_array)) schizo_iommu_init(sc, 7, -1); else { switch (prop_array[1]) { @@ -500,13 +504,12 @@ schizo_attach(device_t dev) rman_manage_region(&sc->sc_pci_mem_rman, 0, STX_MEM_SIZE) != 0) panic("%s: failed to set up memory rman", __func__); - nrange = OF_getprop_alloc(node, "ranges", sizeof(*range), - (void **)&range); + i = OF_getprop_alloc(node, "ranges", sizeof(*range), (void **)&range); /* * Make sure that the expected ranges are present. The * OFW_PCI_CS_MEM64 one is not currently used though. */ - if (nrange != STX_NRANGE) + if (i != STX_NRANGE) panic("%s: unsupported number of ranges", __func__); /* * Find the addresses of the various bus spaces. @@ -514,11 +517,12 @@ schizo_attach(device_t dev) * The physical start addresses of the ranges are the configuration, * memory and I/O handles. */ - for (n = 0; n < STX_NRANGE; n++) { - i = OFW_PCI_RANGE_CS(&range[n]); - if (sc->sc_pci_bh[i] != 0) - panic("%s: duplicate range for space %d", __func__, i); - sc->sc_pci_bh[i] = OFW_PCI_RANGE_PHYS(&range[n]); + for (i = 0; i < STX_NRANGE; i++) { + j = OFW_PCI_RANGE_CS(&range[i]); + if (sc->sc_pci_bh[j] != 0) + panic("%s: duplicate range for space %d", + __func__, j); + sc->sc_pci_bh[j] = OFW_PCI_RANGE_PHYS(&range[i]); } free(range, M_OFWPROP); @@ -541,16 +545,17 @@ schizo_attach(device_t dev) * Get the bus range from the firmware. * NB: Tomatillos don't support PCI bus reenumeration. */ - n = OF_getprop(node, "bus-range", (void *)prop_array, + i = OF_getprop(node, "bus-range", (void *)prop_array, sizeof(prop_array)); - if (n == -1) + if (i == -1) panic("%s: could not get bus-range", __func__); - if (n != sizeof(prop_array)) - panic("%s: broken bus-range (%d)", __func__, n); + if (i != sizeof(prop_array)) + panic("%s: broken bus-range (%d)", __func__, i); + sc->sc_pci_secbus = prop_array[0]; + sc->sc_pci_subbus = prop_array[1]; if (bootverbose) device_printf(dev, "bus range %u to %u; PCI bus %d\n", - prop_array[0], prop_array[1], prop_array[0]); - sc->sc_pci_secbus = prop_array[0]; + sc->sc_pci_secbus, sc->sc_pci_subbus, sc->sc_pci_secbus); /* Clear any pending PCI error bits. */ PCIB_WRITE_CONFIG(dev, sc->sc_pci_secbus, STX_CS_DEVICE, STX_CS_FUNC, @@ -626,31 +631,45 @@ schizo_attach(device_t dev) /* * According to the Schizo Errata I-13, consistent DMA flushing/ * syncing is FUBAR in version < 5 (i.e. revision < 2.3) bridges, - * so we can't use it and need to live with the consequences. - * With Schizo version >= 5, CDMA flushing/syncing is usable - * but requires the the workaround described in Schizo Errata - * I-23. With Tomatillo and XMITS, CDMA flushing/syncing works - * as expected, Tomatillo version <= 4 (i.e. revision <= 2.3) - * bridges additionally require a block store after a write to - * TOMXMS_PCI_DMA_SYNC_PEND though. + * so we can't use it and need to live with the consequences. With + * Schizo version >= 5, CDMA flushing/syncing is usable but requires + * the workaround described in Schizo Errata I-23. With Tomatillo + * and XMITS, CDMA flushing/syncing works as expected, Tomatillo + * version <= 4 (i.e. revision <= 2.3) bridges additionally require + * a block store after a write to TOMXMS_PCI_DMA_SYNC_PEND though. */ if ((sc->sc_mode == SCHIZO_MODE_SCZ && sc->sc_ver >= 5) || - sc->sc_mode == SCHIZO_MODE_TOM || sc->sc_mode == SCHIZO_MODE_XMS) { + sc->sc_mode == SCHIZO_MODE_TOM || + sc->sc_mode == SCHIZO_MODE_XMS) { sc->sc_flags |= SCHIZO_FLAGS_CDMA; if (sc->sc_mode == SCHIZO_MODE_SCZ) { - n = STX_CDMA_A_INO + sc->sc_half; - if (bus_set_resource(dev, SYS_RES_IRQ, 5, - INTMAP_VEC(sc->sc_ign, n), 1) != 0) - panic("%s: failed to add CDMA interrupt", - __func__); - i = schizo_intr_register(sc, n); - if (i != 0) - panic("%s: could not register interrupt " - "controller for CDMA (%d)", __func__, i); - (void)schizo_get_intrmap(sc, n, NULL, - &sc->sc_cdma_clr); sc->sc_cdma_state = SCHIZO_CDMA_STATE_DONE; - schizo_set_intr(sc, 5, n, schizo_cdma); + /* + * Some firmware versions include the CDMA interrupt + * at RID 4 but most don't. With the latter we add + * it ourselves at the spare RID 5. + */ + i = INTINO(bus_get_resource_start(dev, SYS_RES_IRQ, + 4)); + if (i == STX_CDMA_A_INO || i == STX_CDMA_B_INO) { + (void)schizo_get_intrmap(sc, i, NULL, + &sc->sc_cdma_clr); + schizo_set_intr(sc, 4, i, schizo_cdma); + } else { + i = STX_CDMA_A_INO + sc->sc_half; + if (bus_set_resource(dev, SYS_RES_IRQ, 5, + INTMAP_VEC(sc->sc_ign, i), 1) != 0) + panic("%s: failed to add CDMA " + "interrupt", __func__); + j = schizo_intr_register(sc, i); + if (j != 0) + panic("%s: could not register " + "interrupt controller for CDMA " + "(%d)", __func__, j); + (void)schizo_get_intrmap(sc, i, NULL, + &sc->sc_cdma_clr); + schizo_set_intr(sc, 5, i, schizo_cdma); + } } if (sc->sc_mode == SCHIZO_MODE_TOM && sc->sc_ver <= 4) sc->sc_flags |= SCHIZO_FLAGS_BSWAR; @@ -677,11 +696,11 @@ schizo_set_intr(struct schizo_softc *sc, u_int index, u_int ino, int rid; rid = index; - sc->sc_irq_res[index] = bus_alloc_resource_any(sc->sc_dev, SYS_RES_IRQ, - &rid, RF_ACTIVE); + sc->sc_irq_res[index] = bus_alloc_resource_any(sc->sc_dev, + SYS_RES_IRQ, &rid, RF_ACTIVE); if (sc->sc_irq_res[index] == NULL || - INTIGN(vec = rman_get_start(sc->sc_irq_res[index])) != sc->sc_ign || - INTINO(vec) != ino || + INTINO(vec = rman_get_start(sc->sc_irq_res[index])) != ino || + INTIGN(vec) != sc->sc_ign || intr_vectors[vec].iv_ic != &schizo_ic || bus_setup_intr(sc->sc_dev, sc->sc_irq_res[index], INTR_TYPE_MISC | INTR_FAST, handler, NULL, sc, @@ -717,8 +736,8 @@ schizo_intr_register(struct schizo_softc *sc, u_int ino) } static int -schizo_get_intrmap(struct schizo_softc *sc, u_int ino, bus_addr_t *intrmapptr, - bus_addr_t *intrclrptr) +schizo_get_intrmap(struct schizo_softc *sc, u_int ino, + bus_addr_t *intrmapptr, bus_addr_t *intrclrptr) { bus_addr_t intrclr, intrmap; uint64_t mr; @@ -912,6 +931,9 @@ schizo_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, uint8_t byte; sc = device_get_softc(dev); + if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus || + slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX) + return (-1); /* * The Schizo bridges contain a dupe of their header at 0x80. @@ -952,14 +974,18 @@ schizo_read_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, } static void -schizo_write_config(device_t dev, u_int bus, u_int slot, u_int func, u_int reg, - uint32_t val, int width) +schizo_write_config(device_t dev, u_int bus, u_int slot, u_int func, + u_int reg, uint32_t val, int width) { struct schizo_softc *sc; bus_space_handle_t bh; u_long offset = 0; sc = device_get_softc(dev); + if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus || + slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX) + return; + offset = STX_CONF_OFF(bus, slot, func, reg); bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG]; switch (width) { @@ -988,8 +1014,9 @@ schizo_route_interrupt(device_t bridge, device_t dev, int pin) sc = device_get_softc(bridge); pintr = pin; - if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo, ®, - sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr), maskbuf)) + if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo, + ®, sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr), + maskbuf)) return (mintr); device_printf(bridge, "could not route pin %d for device %d.%d\n", @@ -1024,8 +1051,8 @@ schizo_dma_sync_stub(void *arg) (void)PCIB_READ_CONFIG(sds->sds_ppb, sds->sds_bus, sds->sds_slot, sds->sds_func, PCIR_VENDOR, 2); - for (; atomic_cmpset_acq_32(&sc->sc_cdma_state, SCHIZO_CDMA_STATE_DONE, - SCHIZO_CDMA_STATE_PENDING) == 0;) + for (; atomic_cmpset_acq_32(&sc->sc_cdma_state, + SCHIZO_CDMA_STATE_DONE, SCHIZO_CDMA_STATE_PENDING) == 0;) ; SCHIZO_PCI_WRITE_8(sc, sc->sc_cdma_clr, 1); microuptime(&cur); @@ -1257,6 +1284,18 @@ schizo_teardown_intr(device_t dev, device_t child, struct resource *vec, return (bus_generic_teardown_intr(dev, child, vec, cookie)); } +static int +schizo_describe_intr(device_t dev, device_t child, struct resource *vec, + void *cookie, const char *descr) +{ + struct schizo_softc *sc; + + sc = device_get_softc(dev); + if ((sc->sc_flags & SCHIZO_FLAGS_CDMA) != 0) + cookie = ((struct schizo_dma_sync *)cookie)->sds_cookie; + return (bus_generic_describe_intr(dev, child, vec, cookie, descr)); +} + static struct resource * schizo_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -1282,8 +1321,8 @@ schizo_alloc_resource(device_t bus, device_t child, int type, int *rid, if (start != end) panic("%s: XXX: interrupt range", __func__); start = end = INTMAP_VEC(sc->sc_ign, end); - return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, - rid, start, end, count, flags)); + return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, + type, rid, start, end, count, flags)); } switch (type) { case SYS_RES_MEMORY: @@ -1398,7 +1437,7 @@ schizo_alloc_bus_tag(struct schizo_softc *sc, int type) { bus_space_tag_t bt; - bt = (bus_space_tag_t)malloc(sizeof(struct bus_space_tag), M_DEVBUF, + bt = malloc(sizeof(struct bus_space_tag), M_DEVBUF, M_NOWAIT | M_ZERO); if (bt == NULL) panic("%s: out of memory", __func__); diff --git a/sys/sparc64/pci/schizovar.h b/sys/sparc64/pci/schizovar.h index 6b2bca9c601c..144ace7c0659 100644 --- a/sys/sparc64/pci/schizovar.h +++ b/sys/sparc64/pci/schizovar.h @@ -71,6 +71,7 @@ struct schizo_softc { bus_dma_tag_t sc_pci_dmat; uint8_t sc_pci_secbus; + uint8_t sc_pci_subbus; struct ofw_bus_iinfo sc_pci_iinfo; diff --git a/sys/sparc64/sbus/dma_sbus.c b/sys/sparc64/sbus/dma_sbus.c index b4c2e5e6224d..4bc1d4387232 100644 --- a/sys/sparc64/sbus/dma_sbus.c +++ b/sys/sparc64/sbus/dma_sbus.c @@ -149,7 +149,13 @@ static driver_t dma_driver = { sizeof(struct dma_softc), }; -DRIVER_MODULE(dma, sbus, dma_driver, dma_devclass, 0, 0); +/* + * The probe order is handled by sbus(4) as we don't want the variants + * with children to be attached earlier than the stand-alone controllers + * in order to generally preserve the OFW device tree order. + */ +EARLY_DRIVER_MODULE(dma, sbus, dma_driver, dma_devclass, 0, 0, + BUS_PASS_DEFAULT); MODULE_DEPEND(dma, sbus, 1, 1, 1); MODULE_VERSION(dma, 1); diff --git a/sys/sparc64/sbus/sbus.c b/sys/sparc64/sbus/sbus.c index dd36f036d7ee..0c4b509e508b 100644 --- a/sys/sparc64/sbus/sbus.c +++ b/sys/sparc64/sbus/sbus.c @@ -247,7 +247,9 @@ static driver_t sbus_driver = { static devclass_t sbus_devclass; -DRIVER_MODULE(sbus, nexus, sbus_driver, sbus_devclass, 0, 0); +EARLY_DRIVER_MODULE(sbus, nexus, sbus_driver, sbus_devclass, 0, 0, + BUS_PASS_BUS); +MODULE_DEPEND(sbus, nexus, 1, 1, 1); MODULE_VERSION(sbus, 1); #define OFW_SBUS_TYPE "sbus" diff --git a/sys/sparc64/sparc64/cache.c b/sys/sparc64/sparc64/cache.c index 8dd933e4ecb0..8cb8dee8a206 100644 --- a/sys/sparc64/sparc64/cache.c +++ b/sys/sparc64/sparc64/cache.c @@ -43,6 +43,7 @@ */ /*- * Copyright (c) 2001 by Thomas Moestl . + * Copyright (c) 2008, 2010 Marius Strobl * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -89,32 +90,49 @@ icache_page_inval_t *icache_page_inval; #define OF_GET(h, n, v) OF_getprop((h), (n), &(v), sizeof(v)) +static u_int cache_new_prop(u_int cpu_impl); + +static u_int +cache_new_prop(u_int cpu_impl) +{ + + switch (cpu_impl) { + case CPU_IMPL_ULTRASPARCIV: + case CPU_IMPL_ULTRASPARCIVp: + return (1); + default: + return (0); + } +} + /* - * Fill in the cache parameters using the cpu node. + * Fill in the cache parameters using the CPU node. */ void cache_init(struct pcpu *pcpu) { u_long set; + u_int use_new_prop; - if (OF_GET(pcpu->pc_node, "icache-size", - pcpu->pc_cache.ic_size) == -1 || - OF_GET(pcpu->pc_node, "icache-line-size", - pcpu->pc_cache.ic_linesize) == -1 || - OF_GET(pcpu->pc_node, "icache-associativity", - pcpu->pc_cache.ic_assoc) == -1 || - OF_GET(pcpu->pc_node, "dcache-size", - pcpu->pc_cache.dc_size) == -1 || - OF_GET(pcpu->pc_node, "dcache-line-size", - pcpu->pc_cache.dc_linesize) == -1 || - OF_GET(pcpu->pc_node, "dcache-associativity", - pcpu->pc_cache.dc_assoc) == -1 || - OF_GET(pcpu->pc_node, "ecache-size", - pcpu->pc_cache.ec_size) == -1 || - OF_GET(pcpu->pc_node, "ecache-line-size", - pcpu->pc_cache.ec_linesize) == -1 || - OF_GET(pcpu->pc_node, "ecache-associativity", - pcpu->pc_cache.ec_assoc) == -1) + use_new_prop = cache_new_prop(pcpu->pc_impl); + if (OF_GET(pcpu->pc_node, !use_new_prop ? "icache-size" : + "l1-icache-size", pcpu->pc_cache.ic_size) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "icache-line-size" : + "l1-icache-line-size", pcpu->pc_cache.ic_linesize) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "icache-associativity" : + "l1-icache-associativity", pcpu->pc_cache.ic_assoc) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-size" : + "l1-dcache-size", pcpu->pc_cache.dc_size) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-line-size" : + "l1-dcache-line-size", pcpu->pc_cache.dc_linesize) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "dcache-associativity" : + "l1-dcache-associativity", pcpu->pc_cache.dc_assoc) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-size" : + "l2-cache-size", pcpu->pc_cache.ec_size) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-line-size" : + "l2-cache-line-size", pcpu->pc_cache.ec_linesize) == -1 || + OF_GET(pcpu->pc_node, !use_new_prop ? "ecache-associativity" : + "l2-cache-associativity", pcpu->pc_cache.ec_assoc) == -1) panic("cache_init: could not retrieve cache parameters"); set = pcpu->pc_cache.ic_size / pcpu->pc_cache.ic_assoc; @@ -130,7 +148,7 @@ cache_init(struct pcpu *pcpu) if ((set & ~(1UL << (ffs(set) - 1))) != 0) panic("cache_init: E$ set size not a power of 2"); - if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) { + if (pcpu->pc_impl >= CPU_IMPL_ULTRASPARCIII) { cache_enable = cheetah_cache_enable; cache_flush = cheetah_cache_flush; dcache_page_inval = cheetah_dcache_page_inval; diff --git a/sys/sparc64/sparc64/cheetah.c b/sys/sparc64/sparc64/cheetah.c index e2dc7144048e..ae24744c9edf 100644 --- a/sys/sparc64/sparc64/cheetah.c +++ b/sys/sparc64/sparc64/cheetah.c @@ -58,7 +58,7 @@ __FBSDID("$FreeBSD$"); * CPU-specific initialization */ void -cheetah_init(void) +cheetah_init(u_int cpu_impl) { register_t s; @@ -119,7 +119,7 @@ cheetah_init(void) * Enable level 1 caches. */ void -cheetah_cache_enable(void) +cheetah_cache_enable(u_int cpu_impl) { u_long lsu; diff --git a/sys/sparc64/sparc64/eeprom.c b/sys/sparc64/sparc64/eeprom.c index 223b96c93c58..da9909a5d30c 100644 --- a/sys/sparc64/sparc64/eeprom.c +++ b/sys/sparc64/sparc64/eeprom.c @@ -107,7 +107,7 @@ DRIVER_MODULE(eeprom, sbus, eeprom_driver, eeprom_devclass, 0, 0); static int eeprom_probe(device_t dev) { - + if (strcmp("eeprom", ofw_bus_get_name(dev)) == 0) { device_set_desc(dev, "EEPROM/clock"); return (0); @@ -119,7 +119,6 @@ static int eeprom_attach(device_t dev) { struct mk48txx_softc *sc; - struct resource *res; struct timespec ts; int error, rid; @@ -128,14 +127,13 @@ eeprom_attach(device_t dev) mtx_init(&sc->sc_mtx, "eeprom_mtx", NULL, MTX_DEF); rid = 0; - res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); - if (res == NULL) { + sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, + RF_ACTIVE); + if (sc->sc_res == NULL) { device_printf(dev, "cannot allocate resources\n"); error = ENXIO; goto fail_mtx; } - sc->sc_bst = rman_get_bustag(res); - sc->sc_bsh = rman_get_bushandle(res); if ((sc->sc_model = ofw_bus_get_model(dev)) == NULL) { device_printf(dev, "cannot determine model\n"); @@ -180,7 +178,7 @@ eeprom_attach(device_t dev) return (0); fail_res: - bus_release_resource(dev, SYS_RES_MEMORY, rid, res); + bus_release_resource(dev, SYS_RES_MEMORY, rid, sc->sc_res); fail_mtx: mtx_destroy(&sc->sc_mtx); diff --git a/sys/sparc64/sparc64/elf_machdep.c b/sys/sparc64/sparc64/elf_machdep.c index d113b49a0223..2f9ee396e8de 100644 --- a/sys/sparc64/sparc64/elf_machdep.c +++ b/sys/sparc64/sparc64/elf_machdep.c @@ -103,7 +103,7 @@ static Elf64_Brandinfo freebsd_brand_info = { .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE }; -SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_ANY, +SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST, (sysinit_cfunc_t) elf64_insert_brand_entry, &freebsd_brand_info); diff --git a/sys/sparc64/sparc64/genassym.c b/sys/sparc64/sparc64/genassym.c index 8073b692e83b..9efaa74883c0 100644 --- a/sys/sparc64/sparc64/genassym.c +++ b/sys/sparc64/sparc64/genassym.c @@ -239,6 +239,7 @@ ASSYM(P_VMSPACE, offsetof(struct proc, p_vmspace)); ASSYM(TD_FLAGS, offsetof(struct thread, td_flags)); ASSYM(TD_FRAME, offsetof(struct thread, td_frame)); ASSYM(TD_KSTACK, offsetof(struct thread, td_kstack)); +ASSYM(TD_LOCK, offsetof(struct thread, td_lock)); ASSYM(TD_PCB, offsetof(struct thread, td_pcb)); ASSYM(TD_PROC, offsetof(struct thread, td_proc)); ASSYM(TD_MD, offsetof(struct thread, td_md)); diff --git a/sys/sparc64/sparc64/identcpu.c b/sys/sparc64/sparc64/identcpu.c index 020dc924fb32..0b731515f165 100644 --- a/sys/sparc64/sparc64/identcpu.c +++ b/sys/sparc64/sparc64/identcpu.c @@ -15,7 +15,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include @@ -27,7 +26,12 @@ static char cpu_model[128]; SYSCTL_STRING(_hw, HW_MODEL, model, CTLFLAG_RD, cpu_model, 0, "Machine model"); -int cpu_impl; +SYSCTL_NODE(_hw, OID_AUTO, freq, CTLFLAG_RD, 0, ""); + +static u_int cpu_count; +static u_int cpu_freq; +SYSCTL_UINT(_hw_freq, OID_AUTO, cpu, CTLFLAG_RD, &cpu_freq, 0, + "CPU clock frequency"); void cpu_identify(u_long vers, u_int freq, u_int id) @@ -104,4 +108,11 @@ cpu_identify(u_long vers, u_int freq, u_int id) printf(" mask=0x%lx maxtl=%ld maxwin=%ld\n", VER_MASK(vers), VER_MAXTL(vers), VER_MAXWIN(vers)); } + + /* + * Calculate the average CPU frequency. + */ + freq = (freq + 500000ul) / 1000000ul; + cpu_freq = (cpu_freq * cpu_count + freq) / (cpu_count + 1); + cpu_count++; } diff --git a/sys/sparc64/sparc64/interrupt.S b/sys/sparc64/sparc64/interrupt.S index ca4456faa4c7..75a972753014 100644 --- a/sys/sparc64/sparc64/interrupt.S +++ b/sys/sparc64/sparc64/interrupt.S @@ -176,7 +176,7 @@ ENTRY(intr_fast) 3: ldx [%l0 + IR_FUNC], %o0 ldx [%l0 + IR_ARG], %o1 - lduw [%l0 + IR_VEC], %o2 + lduw [%l0 + IR_VEC], %l2 ldx [PCPU(IRFREE)], %l1 stx %l1, [%l0 + IR_NEXT] @@ -188,17 +188,17 @@ ENTRY(intr_fast) call %o0 mov %o1, %o0 - /* intrcnt[intr_countp[%o2]]++ */ - SET(intrcnt, %l7, %l2) /* %l2 = intrcnt */ - prefetcha [%l2] ASI_N, 1 - SET(intr_countp, %l7, %l3) /* %l3 = intr_countp */ - sllx %o2, 1, %l4 /* %l4 = vec << 1 */ - lduh [%l4 + %l3], %l5 /* %l5 = intr_countp[%o2] */ - sllx %l5, 3, %l6 /* %l6 = intr_countp[%o2] << 3 */ - add %l6, %l2, %l7 /* %l7 = intrcnt[intr_countp[%o2]] */ - ldx [%l7], %l2 + /* intrcnt[intr_countp[%l2]]++ */ + SET(intrcnt, %l7, %l3) /* %l3 = intrcnt */ + prefetcha [%l3] ASI_N, 1 + SET(intr_countp, %l7, %l4) /* %l4 = intr_countp */ + sllx %l2, 1, %l2 /* %l2 = vec << 1 */ + lduh [%l4 + %l2], %l4 /* %l4 = intr_countp[%l2] */ + sllx %l4, 3, %l4 /* %l4 = intr_countp[%l2] << 3 */ + add %l4, %l3, %l4 /* %l4 = intrcnt[intr_countp[%l2]] */ + ldx [%l4], %l2 inc %l2 - stx %l2, [%l7] + stx %l2, [%l4] ba,a %xcc, 1b nop diff --git a/sys/sparc64/sparc64/intr_machdep.c b/sys/sparc64/sparc64/intr_machdep.c index 9f9df1b4a26c..7a73bbc67682 100644 --- a/sys/sparc64/sparc64/intr_machdep.c +++ b/sys/sparc64/sparc64/intr_machdep.c @@ -276,7 +276,7 @@ intr_execute_handlers(void *cookie) struct intr_vector *iv; iv = cookie; - if (iv->iv_ic == NULL || intr_event_handle(iv->iv_event, NULL) != 0) + if (__predict_false(intr_event_handle(iv->iv_event, NULL) != 0)) intr_stray_vector(iv); } @@ -377,7 +377,8 @@ inthand_add(const char *name, int vec, driver_filter_t *filt, #endif ic->ic_enable(iv); /* Ensure the interrupt is cleared, it might have triggered before. */ - ic->ic_clear(iv); + if (ic->ic_clear != NULL) + ic->ic_clear(iv); sx_xunlock(&intr_table_lock); return (0); } @@ -412,6 +413,31 @@ inthand_remove(int vec, void *cookie) return (error); } +/* Add a description to an active interrupt handler. */ +int +intr_describe(int vec, void *ih, const char *descr) +{ + struct intr_vector *iv; + int error; + + if (vec < 0 || vec >= IV_MAX) + return (EINVAL); + sx_xlock(&intr_table_lock); + iv = &intr_vectors[vec]; + if (iv == NULL) { + sx_xunlock(&intr_table_lock); + return (EINVAL); + } + error = intr_event_describe_handler(iv->iv_event, ih, descr); + if (error) { + sx_xunlock(&intr_table_lock); + return (error); + } + intrcnt_updatename(vec, iv->iv_event->ie_fullname, 0); + sx_xunlock(&intr_table_lock); + return (error); +} + #ifdef SMP /* * Support for balancing interrupt sources across CPUs. For now we just @@ -449,13 +475,19 @@ int intr_bind(int vec, u_char cpu) { struct intr_vector *iv; + int error; if (vec < 0 || vec >= IV_MAX) return (EINVAL); + sx_xlock(&intr_table_lock); iv = &intr_vectors[vec]; - if (iv == NULL) + if (iv == NULL) { + sx_xunlock(&intr_table_lock); return (EINVAL); - return (intr_event_bind(iv->iv_event, cpu)); + } + error = intr_event_bind(iv->iv_event, cpu); + sx_xunlock(&intr_table_lock); + return (error); } /* diff --git a/sys/sparc64/sparc64/iommu.c b/sys/sparc64/sparc64/iommu.c index 88ab2c9fb6a5..9d31303c6735 100644 --- a/sys/sparc64/sparc64/iommu.c +++ b/sys/sparc64/sparc64/iommu.c @@ -130,6 +130,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -138,11 +139,13 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include #include #include +#include #include @@ -212,6 +215,12 @@ static __inline void iommu_tlb_flush(struct iommu_state *is, bus_addr_t va) { + if ((is->is_flags & IOMMU_FIRE) != 0) + /* + * Direct page flushing is not supported and also not + * necessary due to cache snooping. + */ + return; IOMMU_WRITE8(is, is_iommu, IMR_FLUSH, va); } @@ -282,18 +291,19 @@ iommu_map_remq(struct iommu_state *is, bus_dmamap_t map) * - create a private DVMA map. */ void -iommu_init(const char *name, struct iommu_state *is, int tsbsize, - uint32_t iovabase, int resvpg) +iommu_init(const char *name, struct iommu_state *is, u_int tsbsize, + uint32_t iovabase, u_int resvpg) { vm_size_t size; vm_offset_t offs; - uint64_t end; + uint64_t end, obpmap, obpptsb, tte; + u_int maxtsbsize, obptsbentries, obptsbsize, slot, tsbentries; int i; /* - * Setup the iommu. + * Setup the IOMMU. * - * The sun4u iommu is part of the PCI or SBus controller so we + * The sun4u IOMMU is part of the PCI or SBus controller so we * will deal with it here.. * * The IOMMU address space always ends at 0xffffe000, but the starting @@ -301,16 +311,30 @@ iommu_init(const char *name, struct iommu_state *is, int tsbsize, * is->is_tsbsize entries, where each entry is 8 bytes. The start of * the map can be calculated by (0xffffe000 << (8 + is->is_tsbsize)). */ - is->is_cr = (tsbsize << IOMMUCR_TSBSZ_SHIFT) | IOMMUCR_EN; + if ((is->is_flags & IOMMU_FIRE) != 0) { + maxtsbsize = IOMMU_TSB512K; + /* + * We enable bypass in order to be able to use a physical + * address for the event queue base. + */ + is->is_cr = IOMMUCR_SE | IOMMUCR_CM_C_TLB_TBW | IOMMUCR_BE; + } else { + maxtsbsize = IOMMU_TSB128K; + is->is_cr = (tsbsize << IOMMUCR_TSBSZ_SHIFT) | IOMMUCR_DE; + } + if (tsbsize > maxtsbsize) + panic("%s: unsupported TSB size ", __func__); + tsbentries = IOMMU_TSBENTRIES(tsbsize); + is->is_cr |= IOMMUCR_EN; is->is_tsbsize = tsbsize; is->is_dvmabase = iovabase; if (iovabase == -1) is->is_dvmabase = IOTSB_VSTART(is->is_tsbsize); size = IOTSB_BASESZ << is->is_tsbsize; - printf("%s: DVMA map: %#lx to %#lx%s\n", name, + printf("%s: DVMA map: %#lx to %#lx %d entries%s\n", name, is->is_dvmabase, is->is_dvmabase + - (size << (IO_PAGE_SHIFT - IOTTE_SHIFT)) - 1, + (size << (IO_PAGE_SHIFT - IOTTE_SHIFT)) - 1, tsbentries, IOMMU_HAS_SB(is) ? ", streaming buffer" : ""); /* @@ -333,11 +357,53 @@ iommu_init(const char *name, struct iommu_state *is, int tsbsize, */ is->is_tsb = contigmalloc(size, M_DEVBUF, M_NOWAIT, 0, ~0UL, PAGE_SIZE, 0); - if (is->is_tsb == 0) + if (is->is_tsb == NULL) panic("%s: contigmalloc failed", __func__); is->is_ptsb = pmap_kextract((vm_offset_t)is->is_tsb); bzero(is->is_tsb, size); + /* + * Add the PROM mappings to the kernel IOTSB if desired. + * Note that the firmware of certain Darwin boards doesn't set + * the TSB size correctly. + */ + if ((is->is_flags & IOMMU_FIRE) != 0) + obptsbsize = (IOMMU_READ8(is, is_iommu, IMR_TSB) & + IOMMUTB_TSBSZ_MASK) >> IOMMUTB_TSBSZ_SHIFT; + else + obptsbsize = (IOMMU_READ8(is, is_iommu, IMR_CTL) & + IOMMUCR_TSBSZ_MASK) >> IOMMUCR_TSBSZ_SHIFT; + obptsbentries = IOMMU_TSBENTRIES(obptsbsize); + if (bootverbose) + printf("%s: PROM IOTSB size: %d (%d entries)\n", name, + obptsbsize, obptsbentries); + if ((is->is_flags & IOMMU_PRESERVE_PROM) != 0 && + !(PCPU_GET(impl) == CPU_IMPL_ULTRASPARCIIi && obptsbsize == 7)) { + if (obptsbentries > tsbentries) + panic("%s: PROM IOTSB entries exceed kernel", + __func__); + obpptsb = IOMMU_READ8(is, is_iommu, IMR_TSB) & + IOMMUTB_TB_MASK; + for (i = 0; i < obptsbentries; i++) { + tte = ldxa(obpptsb + i * 8, ASI_PHYS_USE_EC); + if ((tte & IOTTE_V) == 0) + continue; + slot = tsbentries - obptsbentries + i; + if (bootverbose) + printf("%s: adding PROM IOTSB slot %d " + "(kernel slot %d) TTE: %#lx\n", name, + i, slot, tte); + obpmap = (is->is_dvmabase + slot * IO_PAGE_SIZE) >> + IO_PAGE_SHIFT; + if (rman_reserve_resource(&is->is_dvma_rman, obpmap, + obpmap, IO_PAGE_SIZE >> IO_PAGE_SHIFT, RF_ACTIVE, + NULL) == NULL) + panic("%s: could not reserve PROM IOTSB slot " + "%d (kernel slot %d)", __func__, i, slot); + is->is_tsb[slot] = tte; + } + } + /* * Initialize streaming buffer, if it is there. */ @@ -349,7 +415,7 @@ iommu_init(const char *name, struct iommu_state *is, int tsbsize, offs = roundup2((vm_offset_t)is->is_flush, STRBUF_FLUSHSYNC_NBYTES); for (i = 0; i < 2; i++, offs += STRBUF_FLUSHSYNC_NBYTES) { - is->is_flushva[i] = (int64_t *)offs; + is->is_flushva[i] = (uint64_t *)offs; is->is_flushpa[i] = pmap_kextract(offs); } } @@ -368,11 +434,16 @@ iommu_init(const char *name, struct iommu_state *is, int tsbsize, void iommu_reset(struct iommu_state *is) { + uint64_t tsb; int i; - IOMMU_WRITE8(is, is_iommu, IMR_TSB, is->is_ptsb); - /* Enable IOMMU in diagnostic mode */ - IOMMU_WRITE8(is, is_iommu, IMR_CTL, is->is_cr | IOMMUCR_DE); + tsb = is->is_ptsb; + if ((is->is_flags & IOMMU_FIRE) != 0) { + tsb |= is->is_tsbsize; + IOMMU_WRITE8(is, is_iommu, IMR_CACHE_INVAL, ~0ULL); + } + IOMMU_WRITE8(is, is_iommu, IMR_TSB, tsb); + IOMMU_WRITE8(is, is_iommu, IMR_CTL, is->is_cr); for (i = 0; i < 2; i++) { if (is->is_sb[i] != 0) { @@ -386,6 +457,8 @@ iommu_reset(struct iommu_state *is) is->is_sb[i] = 0; } } + + (void)IOMMU_READ8(is, is_iommu, IMR_CTL); } /* @@ -396,7 +469,7 @@ static void iommu_enter(struct iommu_state *is, vm_offset_t va, vm_paddr_t pa, int stream, int flags) { - int64_t tte; + uint64_t tte; KASSERT(va >= is->is_dvmabase, ("%s: va %#lx not in DVMA space", __func__, va)); @@ -423,7 +496,7 @@ iommu_enter(struct iommu_state *is, vm_offset_t va, vm_paddr_t pa, static int iommu_remove(struct iommu_state *is, vm_offset_t va, vm_size_t len) { - int streamed = 0; + int slot, streamed = 0; #ifdef IOMMU_DIAG iommu_diag(is, va); @@ -443,6 +516,12 @@ iommu_remove(struct iommu_state *is, vm_offset_t va, vm_size_t len) len -= ulmin(len, IO_PAGE_SIZE); IOMMU_SET_TTE(is, va, 0); iommu_tlb_flush(is, va); + if ((is->is_flags & IOMMU_FLUSH_CACHE) != 0) { + slot = IOTSBSLOT(va); + if (len <= IO_PAGE_SIZE || slot % 8 == 7) + IOMMU_WRITE8(is, is_iommu, IMR_CACHE_FLUSH, + is->is_ptsb + slot * 8); + } va += IO_PAGE_SIZE; } return (streamed); @@ -829,12 +908,13 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is, bus_dmamap_t map, void *buf, bus_size_t buflen, struct thread *td, int flags, bus_dma_segment_t *segs, int *segp, int align) { - bus_addr_t amask, dvmaddr; + bus_addr_t amask, dvmaddr, dvmoffs; bus_size_t sgsize, esize; vm_offset_t vaddr, voffs; vm_paddr_t curaddr; pmap_t pmap = NULL; int error, firstpg, sgcnt; + u_int slot; KASSERT(buflen != 0, ("%s: buflen == 0!", __func__)); if (buflen > dt->dt_maxsize) @@ -877,8 +957,15 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is, buflen -= sgsize; vaddr += sgsize; - iommu_enter(is, trunc_io_page(dvmaddr), trunc_io_page(curaddr), + dvmoffs = trunc_io_page(dvmaddr); + iommu_enter(is, dvmoffs, trunc_io_page(curaddr), (map->dm_flags & DMF_STREAMED) != 0, flags); + if ((is->is_flags & IOMMU_FLUSH_CACHE) != 0) { + slot = IOTSBSLOT(dvmoffs); + if (buflen <= 0 || slot % 8 == 7) + IOMMU_WRITE8(is, is_iommu, IMR_CACHE_FLUSH, + is->is_ptsb + slot * 8); + } /* * Chop the chunk up into segments of at most maxsegsz, but try @@ -1183,6 +1270,8 @@ iommu_diag(struct iommu_state *is, vm_offset_t va) int i; uint64_t data, tag; + if ((is->is_flags & IOMMU_FIRE) != 0) + return; IS_LOCK_ASSERT(is); IOMMU_WRITE8(is, is_dva, 0, trunc_io_page(va)); membar(StoreStore | StoreLoad); diff --git a/sys/sparc64/sparc64/locore.S b/sys/sparc64/sparc64/locore.S index 8c1043e406f2..ac6659b5c977 100644 --- a/sys/sparc64/sparc64/locore.S +++ b/sys/sparc64/sparc64/locore.S @@ -46,12 +46,14 @@ ENTRY(btext) ENTRY(_start) /* * Initialize misc. state to known values: interrupts disabled, normal - * globals, windows flushed (cr = 0, cs = nwindows - 1), no clean - * windows, pil 0, and floating point disabled. + * globals, windows flushed (cr = 0, cs = nwindows - 1), PIL 0 and + * floating point disabled. + * Note that some firmware versions don't implement a clean window + * trap handler so we unfortunately can't clear the windows by setting + * %cleanwin to zero here. */ wrpr %g0, PSTATE_NORMAL, %pstate flushw - wrpr %g0, 0, %cleanwin wrpr %g0, 0, %pil wr %g0, 0, %fprs diff --git a/sys/sparc64/sparc64/machdep.c b/sys/sparc64/sparc64/machdep.c index 49a2bb1c94fd..c5b08eea5187 100644 --- a/sys/sparc64/sparc64/machdep.c +++ b/sys/sparc64/sparc64/machdep.c @@ -89,10 +89,13 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include +#include #include #include #include +#include #include #include #include @@ -143,11 +146,12 @@ static int cpu_use_vis = 1; cpu_block_copy_t *cpu_block_copy; cpu_block_zero_t *cpu_block_zero; +static phandle_t find_bsp(phandle_t node, uint32_t bspid, u_int cpu_impl); void sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec); -void sparc64_shutdown_final(void *dummy, int howto); +static void sparc64_shutdown_final(void *dummy, int howto); -static void cpu_startup(void *); +static void cpu_startup(void *arg); SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); CTASSERT((1 << INT_SHIFT) == sizeof(int)); @@ -236,18 +240,95 @@ spinlock_exit(void) wrpr(pil, td->td_md.md_saved_pil, 0); } +static phandle_t +find_bsp(phandle_t node, uint32_t bspid, u_int cpu_impl) +{ + char type[sizeof("cpu")]; + phandle_t child; + uint32_t cpuid; + + for (; node != 0; node = OF_peer(node)) { + child = OF_child(node); + if (child > 0) { + child = find_bsp(child, bspid, cpu_impl); + if (child > 0) + return (child); + } else { + if (OF_getprop(node, "device_type", type, + sizeof(type)) <= 0) + continue; + if (strcmp(type, "cpu") != 0) + continue; + if (OF_getprop(node, cpu_cpuid_prop(cpu_impl), &cpuid, + sizeof(cpuid)) <= 0) + continue; + if (cpuid == bspid) + return (node); + } + } + return (0); +} + +const char * +cpu_cpuid_prop(u_int cpu_impl) +{ + + switch (cpu_impl) { + case CPU_IMPL_SPARC64: + case CPU_IMPL_ULTRASPARCI: + case CPU_IMPL_ULTRASPARCII: + case CPU_IMPL_ULTRASPARCIIi: + case CPU_IMPL_ULTRASPARCIIe: + return ("upa-portid"); + case CPU_IMPL_ULTRASPARCIII: + case CPU_IMPL_ULTRASPARCIIIp: + case CPU_IMPL_ULTRASPARCIIIi: + case CPU_IMPL_ULTRASPARCIIIip: + return ("portid"); + case CPU_IMPL_ULTRASPARCIV: + case CPU_IMPL_ULTRASPARCIVp: + return ("cpuid"); + default: + return (""); + } +} + +uint32_t +cpu_get_mid(u_int cpu_impl) +{ + + switch (cpu_impl) { + case CPU_IMPL_SPARC64: + case CPU_IMPL_ULTRASPARCI: + case CPU_IMPL_ULTRASPARCII: + case CPU_IMPL_ULTRASPARCIIi: + case CPU_IMPL_ULTRASPARCIIe: + return (UPA_CR_GET_MID(ldxa(0, ASI_UPA_CONFIG_REG))); + case CPU_IMPL_ULTRASPARCIII: + case CPU_IMPL_ULTRASPARCIIIp: + return (FIREPLANE_CR_GET_AID(ldxa(AA_FIREPLANE_CONFIG, + ASI_FIREPLANE_CONFIG_REG))); + case CPU_IMPL_ULTRASPARCIIIi: + case CPU_IMPL_ULTRASPARCIIIip: + return (JBUS_CR_GET_JID(ldxa(0, ASI_JBUS_CONFIG_REG))); + case CPU_IMPL_ULTRASPARCIV: + case CPU_IMPL_ULTRASPARCIVp: + return (INTR_ID_GET_ID(ldxa(AA_INTR_ID, ASI_INTR_ID))); + default: + return (0); + } +} + void sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) { - char type[8]; char *env; struct pcpu *pc; vm_offset_t end; vm_offset_t va; caddr_t kmdp; - phandle_t child; phandle_t root; - uint32_t portid; + u_int cpu_impl; end = 0; kmdp = NULL; @@ -262,12 +343,12 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) * Do CPU-specific Initialization. */ if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) - cheetah_init(); + cheetah_init(cpu_impl); /* * Clear (S)TICK timer (including NPT). */ - tick_clear(); + tick_clear(cpu_impl); /* * UltraSparc II[e,i] based systems come up with the tick interrupt @@ -277,7 +358,7 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) * enabled, causing an interrupt storm on startup since they are not * handled. */ - tick_stop(); + tick_stop(cpu_impl); /* * Set up Open Firmware entry points. @@ -319,7 +400,8 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) pc = (struct pcpu *)(pcpu0 + (PCPU_PAGES * PAGE_SIZE)) - 1; pcpu_init(pc, 0, sizeof(struct pcpu)); pc->pc_addr = (vm_offset_t)pcpu0; - pc->pc_mid = UPA_CR_GET_MID(ldxa(0, ASI_UPA_CONFIG_REG)); + pc->pc_impl = cpu_impl; + pc->pc_mid = cpu_get_mid(cpu_impl); pc->pc_tlb_ctx = TLB_CTX_USER_MIN; pc->pc_tlb_ctx_min = TLB_CTX_USER_MIN; pc->pc_tlb_ctx_max = TLB_CTX_USER_MAX; @@ -328,24 +410,11 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) * Determine the OFW node and frequency of the BSP (and ensure the * BSP is in the device tree in the first place). */ - pc->pc_node = 0; root = OF_peer(0); - for (child = OF_child(root); child != 0; child = OF_peer(child)) { - if (OF_getprop(child, "device_type", type, sizeof(type)) <= 0) - continue; - if (strcmp(type, "cpu") != 0) - continue; - if (OF_getprop(child, cpu_impl < CPU_IMPL_ULTRASPARCIII ? - "upa-portid" : "portid", &portid, sizeof(portid)) <= 0) - continue; - if (portid == pc->pc_mid) { - pc->pc_node = child; - break; - } - } + pc->pc_node = find_bsp(root, pc->pc_mid, cpu_impl); if (pc->pc_node == 0) OF_exit(); - if (OF_getprop(child, "clock-frequency", &pc->pc_clock, + if (OF_getprop(pc->pc_node, "clock-frequency", &pc->pc_clock, sizeof(pc->pc_clock)) <= 0) OF_exit(); @@ -383,8 +452,9 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) */ for (va = KERNBASE + (kernel_tlb_slots - 1) * PAGE_SIZE_4M; va >= roundup2(end, PAGE_SIZE_4M); va -= PAGE_SIZE_4M) { - printf("demapping unused kernel TLB slot (va %#lx - %#lx)\n", - va, va + PAGE_SIZE_4M - 1); + if (bootverbose) + printf("demapping unused kernel TLB slot " + "(va %#lx - %#lx)\n", va, va + PAGE_SIZE_4M - 1); stxa(TLB_DEMAP_VA(va) | TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE, ASI_DMMU_DEMAP, 0); stxa(TLB_DEMAP_VA(va) | TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE, @@ -407,7 +477,7 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) panic("sparc64_init: cannot determine number of iTLB slots"); cache_init(pc); - cache_enable(); + cache_enable(cpu_impl); uma_set_align(pc->pc_cache.dc_linesize - 1); cpu_block_copy = bcopy; @@ -433,13 +503,13 @@ sparc64_init(caddr_t mdp, u_long o1, u_long o2, u_long o3, ofw_vec_t *vec) } #ifdef SMP - mp_init(); + mp_init(cpu_impl); #endif /* * Initialize virtual memory and calculate physmem. */ - pmap_bootstrap(); + pmap_bootstrap(cpu_impl); /* * Initialize tunables. @@ -653,26 +723,13 @@ sigreturn(struct thread *td, struct sigreturn_args *uap) if (error != 0) return (error); - PROC_LOCK(p); - td->td_sigmask = uc.uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0); CTR4(KTR_SIG, "sigreturn: return td=%p pc=%#lx sp=%#lx tstate=%#lx", td, mc->mc_tpc, mc->mc_sp, mc->mc_tstate); return (EJUSTRETURN); } -#ifdef COMPAT_FREEBSD4 -int -freebsd4_sigreturn(struct thread *td, struct freebsd4_sigreturn_args *uap) -{ - - return sigreturn(td, (struct sigreturn_args *)uap); -} -#endif - /* * Construct a PCB from a trapframe. This is called from kdb_trap() where * we want to start a backtrace from the function that caused us to enter @@ -696,12 +753,39 @@ get_mcontext(struct thread *td, mcontext_t *mc, int flags) tf = td->td_frame; pcb = td->td_pcb; - bcopy(tf, mc, sizeof(*tf)); + /* + * Copy the registers which will be restored by tl0_ret() from the + * trapframe. + * Note that we skip %g7 which is used as the userland TLS register + * and %wstate. + */ + mc->mc_flags = _MC_VERSION; + mc->mc_global[1] = tf->tf_global[1]; + mc->mc_global[2] = tf->tf_global[2]; + mc->mc_global[3] = tf->tf_global[3]; + mc->mc_global[4] = tf->tf_global[4]; + mc->mc_global[5] = tf->tf_global[5]; + mc->mc_global[6] = tf->tf_global[6]; if (flags & GET_MC_CLEAR_RET) { mc->mc_out[0] = 0; mc->mc_out[1] = 0; + } else { + mc->mc_out[0] = tf->tf_out[0]; + mc->mc_out[1] = tf->tf_out[1]; } - mc->mc_flags = _MC_VERSION; + mc->mc_out[2] = tf->tf_out[2]; + mc->mc_out[3] = tf->tf_out[3]; + mc->mc_out[4] = tf->tf_out[4]; + mc->mc_out[5] = tf->tf_out[5]; + mc->mc_out[6] = tf->tf_out[6]; + mc->mc_out[7] = tf->tf_out[7]; + mc->mc_fprs = tf->tf_fprs; + mc->mc_fsr = tf->tf_fsr; + mc->mc_gsr = tf->tf_gsr; + mc->mc_tnpc = tf->tf_tnpc; + mc->mc_tpc = tf->tf_tpc; + mc->mc_tstate = tf->tf_tstate; + mc->mc_y = tf->tf_y; critical_enter(); if ((tf->tf_fprs & FPRS_FEF) != 0) { savefpctx(pcb->pcb_ufp); @@ -721,7 +805,6 @@ set_mcontext(struct thread *td, const mcontext_t *mc) { struct trapframe *tf; struct pcb *pcb; - uint64_t wstate; if (!TSTATE_SECURE(mc->mc_tstate) || (mc->mc_flags & ((1L << _MC_VERSION_BITS) - 1)) != _MC_VERSION) @@ -730,9 +813,33 @@ set_mcontext(struct thread *td, const mcontext_t *mc) pcb = td->td_pcb; /* Make sure the windows are spilled first. */ flushw(); - wstate = tf->tf_wstate; - bcopy(mc, tf, sizeof(*tf)); - tf->tf_wstate = wstate; + /* + * Copy the registers which will be restored by tl0_ret() to the + * trapframe. + * Note that we skip %g7 which is used as the userland TLS register + * and %wstate. + */ + tf->tf_global[1] = mc->mc_global[1]; + tf->tf_global[2] = mc->mc_global[2]; + tf->tf_global[3] = mc->mc_global[3]; + tf->tf_global[4] = mc->mc_global[4]; + tf->tf_global[5] = mc->mc_global[5]; + tf->tf_global[6] = mc->mc_global[6]; + tf->tf_out[0] = mc->mc_out[0]; + tf->tf_out[1] = mc->mc_out[1]; + tf->tf_out[2] = mc->mc_out[2]; + tf->tf_out[3] = mc->mc_out[3]; + tf->tf_out[4] = mc->mc_out[4]; + tf->tf_out[5] = mc->mc_out[5]; + tf->tf_out[6] = mc->mc_out[6]; + tf->tf_out[7] = mc->mc_out[7]; + tf->tf_fprs = mc->mc_fprs; + tf->tf_fsr = mc->mc_fsr; + tf->tf_gsr = mc->mc_gsr; + tf->tf_tnpc = mc->mc_tnpc; + tf->tf_tpc = mc->mc_tpc; + tf->tf_tstate = mc->mc_tstate; + tf->tf_y = mc->mc_y; if ((mc->mc_fprs & FPRS_FEF) != 0) { tf->tf_fprs = 0; bcopy(mc->mc_fp, pcb->pcb_ufp, sizeof(pcb->pcb_ufp)); @@ -800,7 +907,7 @@ cpu_halt(void) cpu_shutdown(&args); } -void +static void sparc64_shutdown_final(void *dummy, int howto) { static struct { diff --git a/sys/sparc64/sparc64/mp_locore.S b/sys/sparc64/sparc64/mp_locore.S index e8b2a9526335..17dc444c7d96 100644 --- a/sys/sparc64/sparc64/mp_locore.S +++ b/sys/sparc64/sparc64/mp_locore.S @@ -33,7 +33,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include "assym.s" @@ -44,12 +43,14 @@ __FBSDID("$FreeBSD$"); .text _ALIGN_TEXT /* - * Initialize misc. state to known values: interrupts disabled, - * normal globals, no clean windows, PIL 0, and floating point - * disabled. + * Initialize misc. state to known values: interrupts disabled, normal + * globals, windows flushed (cr = 0, cs = nwindows - 1), PIL 0 and + * floating point disabled. + * Note that some firmware versions don't implement a clean window + * trap handler so we unfortunately can't clear the windows by setting + * %cleanwin to zero here. */ 1: wrpr %g0, PSTATE_NORMAL, %pstate - wrpr %g0, 0, %cleanwin wrpr %g0, 0, %pil wr %g0, 0, %fprs @@ -68,7 +69,7 @@ __FBSDID("$FreeBSD$"); setx TD_V | TD_L, %l1, %l0 /* - * We read ASI_DTLB_DATA_ACCESS_REG twice in order to work + * We read ASI_ITLB_DATA_ACCESS_REG twice in order to work * around errata of USIII and beyond. */ ldxa [%g0] ASI_ITLB_DATA_ACCESS_REG, %g0 @@ -94,7 +95,7 @@ __FBSDID("$FreeBSD$"); mov (1 << TLB_DAR_SLOT_SHIFT), %l4 setx TD_V, %l1, %l0 /* - * We read ASI_DTLB_DATA_ACCESS_REG twice in order to work + * We read ASI_ITLB_DATA_ACCESS_REG twice in order to work * around errata of USIII and beyond. */ 2: ldxa [%l4] ASI_ITLB_DATA_ACCESS_REG, %g0 @@ -136,7 +137,7 @@ __FBSDID("$FreeBSD$"); mov (1 << TLB_DAR_SLOT_SHIFT), %l0 setx TD_V, %o1, %o0 /* - * We read ASI_DTLB_DATA_ACCESS_REG twice in order to work + * We read ASI_ITLB_DATA_ACCESS_REG twice in order to work * around errata of USIII and beyond. */ 5: ldxa [%l0] ASI_ITLB_DATA_ACCESS_REG, %g0 @@ -201,23 +202,17 @@ ENTRY(mp_startup) cmp %l1, CPU_IMPL_ULTRASPARCIII bl %icc, 3f nop - mov CPU_STICKSYNC, %l1 + mov CPU_STICKSYNC, %l2 membar #StoreLoad - stw %l1, [%l0 + CSA_STATE] + stw %l2, [%l0 + CSA_STATE] -2: ldx [%l0 + CSA_STICK], %l1 - brz %l1, 2b +2: ldx [%l0 + CSA_STICK], %l2 + brz %l2, 2b nop - wr %l1, 0, %asr24 + wr %l2, 0, %asr24 -3: UPA_GET_MID(%o0) - -#if KTR_COMPILE & KTR_SMP - CATR(KTR_SMP, "mp_start: CPU %d entered kernel" - , %g1, %g2, %g3, 7, 8, 9) - stx %o0, [%g1 + KTR_PARM1] -9: -#endif +3: call cpu_get_mid + mov %l1, %o0 /* * Inform the boot processor we have inited. @@ -234,13 +229,6 @@ ENTRY(mp_startup) bne %xcc, 4b nop -#if KTR_COMPILE & KTR_SMP - CATR(KTR_SMP, "_mp_start: CPU %d got start signal" - , %g1, %g2, %g3, 7, 8, 9) - stx %o0, [%g1 + KTR_PARM1] -9: -#endif - add %l0, CSA_TTES, %l1 clr %l2 @@ -281,7 +269,7 @@ ENTRY(mp_startup) #if KTR_COMPILE & KTR_SMP CATR(KTR_SMP, - "_mp_start: bootstrap cpuid=%d mid=%d pcpu=%#lx data=%#lx sp=%#lx" + "mp_startup: bootstrap cpuid=%d mid=%d pcpu=%#lx data=%#lx sp=%#lx" , %g1, %g2, %g3, 7, 8, 9) lduw [%l1 + PC_CPUID], %g2 stx %g2, [%g1 + KTR_PARM1] diff --git a/sys/sparc64/sparc64/mp_machdep.c b/sys/sparc64/sparc64/mp_machdep.c index 997f0a4195e8..8ea72f3954a3 100644 --- a/sys/sparc64/sparc64/mp_machdep.c +++ b/sys/sparc64/sparc64/mp_machdep.c @@ -119,7 +119,11 @@ static u_int cpuid_to_mid[MAXCPU]; static int isjbus; static volatile u_int shutdown_cpus; +static void ap_count(phandle_t node, u_int mid, u_int cpu_impl); +static void ap_start(phandle_t node, u_int mid, u_int cpu_impl); static void cpu_mp_unleash(void *v); +static void foreach_ap(phandle_t node, void (*func)(phandle_t node, + u_int mid, u_int cpu_impl)); static void spitfire_ipi_send(u_int mid, u_long d0, u_long d1, u_long d2); static void sun4u_startcpu(phandle_t cpu, void *func, u_long arg); @@ -133,7 +137,7 @@ CTASSERT(MAXCPU <= sizeof(u_int) * NBBY); CTASSERT(MAXCPU <= sizeof(int) * NBBY); void -mp_init(void) +mp_init(u_int cpu_impl) { struct tte *tp; int i; @@ -166,25 +170,63 @@ mp_init(void) cpu_ipi_selected = spitfire_ipi_selected; } +static void +foreach_ap(phandle_t node, void (*func)(phandle_t node, u_int mid, + u_int cpu_impl)) +{ + char type[sizeof("cpu")]; + phandle_t child; + u_int cpuid; + uint32_t cpu_impl; + + /* There's no need to traverse the whole OFW tree twice. */ + if (mp_maxid > 0 && mp_ncpus >= mp_maxid + 1) + return; + + for (; node != 0; node = OF_peer(node)) { + child = OF_child(node); + if (child > 0) + foreach_ap(child, func); + else { + if (OF_getprop(node, "device_type", type, + sizeof(type)) <= 0) + continue; + if (strcmp(type, "cpu") != 0) + continue; + if (OF_getprop(node, "implementation#", &cpu_impl, + sizeof(cpu_impl)) <= 0) + panic("%s: couldn't determine CPU " + "implementation", __func__); + if (OF_getprop(node, cpu_cpuid_prop(cpu_impl), &cpuid, + sizeof(cpuid)) <= 0) + panic("%s: couldn't determine CPU module ID", + __func__); + if (cpuid == PCPU_GET(mid)) + continue; + (*func)(node, cpuid, cpu_impl); + } + } +} + /* * Probe for other CPUs. */ void -cpu_mp_setmaxid(void) +cpu_mp_setmaxid() { - char buf[128]; - phandle_t child; - u_int cpus; all_cpus = 1 << curcpu; mp_ncpus = 1; + mp_maxid = 0; - cpus = 0; - for (child = OF_child(OF_peer(0)); child != 0; child = OF_peer(child)) - if (OF_getprop(child, "device_type", buf, sizeof(buf)) > 0 && - strcmp(buf, "cpu") == 0) - cpus++; - mp_maxid = cpus - 1; + foreach_ap(OF_child(OF_peer(0)), ap_count); +} + +static void +ap_count(phandle_t node __unused, u_int mid __unused, u_int cpu_impl __unused) +{ + + mp_maxid++; } int @@ -228,15 +270,6 @@ sun4u_startcpu(phandle_t cpu, void *func, u_long arg) void cpu_mp_start(void) { - char buf[128]; - volatile struct cpu_start_args *csa; - struct pcpu *pc; - register_t s; - vm_offset_t va; - phandle_t child; - u_int mid; - u_int clock; - u_int cpuid; mtx_init(&ipi_mtx, "ipi", NULL, MTX_SPIN); @@ -248,60 +281,7 @@ cpu_mp_start(void) cpuid_to_mid[curcpu] = PCPU_GET(mid); - csa = &cpu_start_args; - for (child = OF_child(OF_peer(0)); child != 0 && mp_ncpus <= MAXCPU; - child = OF_peer(child)) { - if (OF_getprop(child, "device_type", buf, sizeof(buf)) <= 0 || - strcmp(buf, "cpu") != 0) - continue; - if (OF_getprop(child, cpu_impl < CPU_IMPL_ULTRASPARCIII ? - "upa-portid" : "portid", &mid, sizeof(mid)) <= 0) - panic("%s: can't get module ID", __func__); - if (mid == PCPU_GET(mid)) - continue; - if (OF_getprop(child, "clock-frequency", &clock, - sizeof(clock)) <= 0) - panic("%s: can't get clock", __func__); - if (clock != PCPU_GET(clock)) - hardclock_use_stick = 1; - - csa->csa_state = 0; - sun4u_startcpu(child, (void *)mp_tramp, 0); - s = intr_disable(); - while (csa->csa_state != CPU_TICKSYNC) - ; - membar(StoreLoad); - csa->csa_tick = rd(tick); - if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) { - while (csa->csa_state != CPU_STICKSYNC) - ; - membar(StoreLoad); - csa->csa_stick = rdstick(); - } - while (csa->csa_state != CPU_INIT) - ; - csa->csa_tick = csa->csa_stick = 0; - intr_restore(s); - - cpuid = mp_ncpus++; - cpuid_to_mid[cpuid] = mid; - cpu_identify(csa->csa_ver, clock, cpuid); - - va = kmem_alloc(kernel_map, PCPU_PAGES * PAGE_SIZE); - pc = (struct pcpu *)(va + (PCPU_PAGES * PAGE_SIZE)) - 1; - pcpu_init(pc, cpuid, sizeof(*pc)); - dpcpu_init((void *)kmem_alloc(kernel_map, DPCPU_SIZE), - cpuid); - pc->pc_addr = va; - pc->pc_clock = clock; - pc->pc_mid = mid; - pc->pc_node = child; - - cache_init(pc); - - all_cpus |= 1 << cpuid; - intr_add_cpu(cpuid); - } + foreach_ap(OF_child(OF_peer(0)), ap_start); KASSERT(!isjbus || mp_ncpus <= IDR_JALAPENO_MAX_BN_PAIRS, ("%s: can only IPI a maximum of %d JBus-CPUs", __func__, IDR_JALAPENO_MAX_BN_PAIRS)); @@ -309,6 +289,63 @@ cpu_mp_start(void) smp_active = 1; } +static void +ap_start(phandle_t node, u_int mid, u_int cpu_impl) +{ + volatile struct cpu_start_args *csa; + struct pcpu *pc; + register_t s; + vm_offset_t va; + u_int cpuid; + uint32_t clock; + + if (mp_ncpus > MAXCPU) + return; + + if (OF_getprop(node, "clock-frequency", &clock, sizeof(clock)) <= 0) + panic("%s: couldn't determine CPU frequency", __func__); + if (clock != PCPU_GET(clock)) + hardclock_use_stick = 1; + + csa = &cpu_start_args; + csa->csa_state = 0; + sun4u_startcpu(node, (void *)mp_tramp, 0); + s = intr_disable(); + while (csa->csa_state != CPU_TICKSYNC) + ; + membar(StoreLoad); + csa->csa_tick = rd(tick); + if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) { + while (csa->csa_state != CPU_STICKSYNC) + ; + membar(StoreLoad); + csa->csa_stick = rdstick(); + } + while (csa->csa_state != CPU_INIT) + ; + csa->csa_tick = csa->csa_stick = 0; + intr_restore(s); + + cpuid = mp_ncpus++; + cpuid_to_mid[cpuid] = mid; + cpu_identify(csa->csa_ver, clock, cpuid); + + va = kmem_alloc(kernel_map, PCPU_PAGES * PAGE_SIZE); + pc = (struct pcpu *)(va + (PCPU_PAGES * PAGE_SIZE)) - 1; + pcpu_init(pc, cpuid, sizeof(*pc)); + dpcpu_init((void *)kmem_alloc(kernel_map, DPCPU_SIZE), cpuid); + pc->pc_addr = va; + pc->pc_clock = clock; + pc->pc_impl = cpu_impl; + pc->pc_mid = mid; + pc->pc_node = node; + + cache_init(pc); + + all_cpus |= 1 << cpuid; + intr_add_cpu(cpuid); +} + void cpu_mp_announce(void) { @@ -372,9 +409,9 @@ cpu_mp_bootstrap(struct pcpu *pc) volatile struct cpu_start_args *csa; csa = &cpu_start_args; - if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) - cheetah_init(); - cache_enable(); + if (pc->pc_impl >= CPU_IMPL_ULTRASPARCIII) + cheetah_init(pc->pc_impl); + cache_enable(pc->pc_impl); pmap_map_tsb(); /* * Flush all non-locked TLB entries possibly left over by the diff --git a/sys/sparc64/sparc64/nexus.c b/sys/sparc64/sparc64/nexus.c index 58c0805600ec..ee01aa86ae00 100644 --- a/sys/sparc64/sparc64/nexus.c +++ b/sys/sparc64/sparc64/nexus.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -49,6 +50,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -90,12 +92,13 @@ static bus_activate_resource_t nexus_activate_resource; static bus_deactivate_resource_t nexus_deactivate_resource; static bus_release_resource_t nexus_release_resource; static bus_get_resource_list_t nexus_get_resource_list; +#ifdef SMP +static bus_bind_intr_t nexus_bind_intr; +#endif +static bus_describe_intr_t nexus_describe_intr; static bus_get_dma_tag_t nexus_get_dma_tag; static ofw_bus_get_devinfo_t nexus_get_devinfo; -#ifdef SMP -static int nexus_bind_intr(device_t, device_t, struct resource *, int); -#endif static int nexus_inlist(const char *, const char *const *); static struct nexus_devinfo * nexus_setup_dinfo(device_t, phandle_t); static void nexus_destroy_dinfo(struct nexus_devinfo *); @@ -128,6 +131,7 @@ static device_method_t nexus_methods[] = { #ifdef SMP DEVMETHOD(bus_bind_intr, nexus_bind_intr), #endif + DEVMETHOD(bus_describe_intr, nexus_describe_intr), DEVMETHOD(bus_get_dma_tag, nexus_get_dma_tag), /* ofw_bus interface */ @@ -144,23 +148,30 @@ static device_method_t nexus_methods[] = { static devclass_t nexus_devclass; DEFINE_CLASS_0(nexus, nexus_driver, nexus_methods, sizeof(struct nexus_softc)); -DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0); +EARLY_DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0, + BUS_PASS_BUS); +MODULE_VERSION(nexus, 1); static const char *const nexus_excl_name[] = { "aliases", "associations", "chosen", + "cmp", "counter-timer", /* No separate device; handled by psycho/sbus */ + "failsafe", "memory", "openprom", "options", "packages", "rsc", + "sgcn", + "todsg", "virtual-memory", NULL }; static const char *const nexus_excl_type[] = { + "core", "cpu", NULL }; @@ -202,20 +213,24 @@ nexus_attach(device_t dev) device_t cdev; phandle_t node; - node = OF_peer(0); - if (node == -1) - panic("%s: OF_peer failed.", __func__); + if (strcmp(device_get_name(device_get_parent(dev)), "root") == 0) { + node = OF_peer(0); + if (node == -1) + panic("%s: OF_peer failed.", __func__); - sc = device_get_softc(dev); - sc->sc_intr_rman.rm_type = RMAN_ARRAY; - sc->sc_intr_rman.rm_descr = "Interrupts"; - sc->sc_mem_rman.rm_type = RMAN_ARRAY; - sc->sc_mem_rman.rm_descr = "Device Memory"; - if (rman_init(&sc->sc_intr_rman) != 0 || - rman_init(&sc->sc_mem_rman) != 0 || - rman_manage_region(&sc->sc_intr_rman, 0, IV_MAX - 1) != 0 || - rman_manage_region(&sc->sc_mem_rman, 0ULL, ~0ULL) != 0) - panic("%s: failed to set up rmans.", __func__); + sc = device_get_softc(dev); + sc->sc_intr_rman.rm_type = RMAN_ARRAY; + sc->sc_intr_rman.rm_descr = "Interrupts"; + sc->sc_mem_rman.rm_type = RMAN_ARRAY; + sc->sc_mem_rman.rm_descr = "Device Memory"; + if (rman_init(&sc->sc_intr_rman) != 0 || + rman_init(&sc->sc_mem_rman) != 0 || + rman_manage_region(&sc->sc_intr_rman, 0, + IV_MAX - 1) != 0 || + rman_manage_region(&sc->sc_mem_rman, 0ULL, ~0ULL) != 0) + panic("%s: failed to set up rmans.", __func__); + } else + node = ofw_bus_get_node(dev); /* * Allow devices to identify. @@ -327,6 +342,14 @@ nexus_bind_intr(device_t dev, device_t child, struct resource *r, int cpu) } #endif +static int +nexus_describe_intr(device_t dev, device_t child, struct resource *r, + void *cookie, const char *descr) +{ + + return (intr_describe(rman_get_start(r), cookie, descr)); +} + static struct resource * nexus_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) @@ -335,12 +358,16 @@ nexus_alloc_resource(device_t bus, device_t child, int type, int *rid, struct rman *rm; struct resource *rv; struct resource_list_entry *rle; + device_t nexus; int isdefault, needactivate, passthrough; isdefault = (start == 0UL && end == ~0UL); needactivate = flags & RF_ACTIVE; passthrough = (device_get_parent(child) != bus); - sc = device_get_softc(bus); + nexus = bus; + while (strcmp(device_get_name(device_get_parent(nexus)), "root") != 0) + nexus = device_get_parent(nexus); + sc = device_get_softc(nexus); rle = NULL; if (!passthrough) { @@ -486,15 +513,17 @@ nexus_setup_dinfo(device_t dev, phandle_t node) for (i = 0; i < nreg; i++) { phys = NEXUS_REG_PHYS(®[i]); size = NEXUS_REG_SIZE(®[i]); - resource_list_add(&ndi->ndi_rl, SYS_RES_MEMORY, i, phys, - phys + size - 1, size); + /* Skip the dummy reg property of glue devices like ssm(4). */ + if (size != 0) + resource_list_add(&ndi->ndi_rl, SYS_RES_MEMORY, i, + phys, phys + size - 1, size); } free(reg, M_OFWPROP); nintr = OF_getprop_alloc(node, "interrupts", sizeof(*intr), (void **)&intr); if (nintr > 0) { - if (OF_getprop(node, cpu_impl < CPU_IMPL_ULTRASPARCIII ? + if (OF_getprop(node, PCPU_GET(impl) < CPU_IMPL_ULTRASPARCIII ? "upa-portid" : "portid", &ign, sizeof(ign)) <= 0) { device_printf(dev, "<%s>: could not determine portid\n", ndi->ndi_obdinfo.obd_name); diff --git a/sys/sparc64/sparc64/ofw_machdep.c b/sys/sparc64/sparc64/ofw_machdep.c index bcacea77b41b..9d522629c788 100644 --- a/sys/sparc64/sparc64/ofw_machdep.c +++ b/sys/sparc64/sparc64/ofw_machdep.c @@ -1,6 +1,6 @@ /*- * Copyright (c) 2001 by Thomas Moestl . - * Copyright (c) 2005 by Marius Strobl . + * Copyright (c) 2005 - 2009 by Marius Strobl . * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,7 +23,7 @@ * 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 __FBSDID("$FreeBSD$"); @@ -64,34 +64,32 @@ OF_getetheraddr(device_t dev, u_char *addr) node = OF_peer(0); if (node <= 0 || OF_getprop(node, "idprom", &idp, sizeof(idp)) == -1) - panic("Could not determine the machine ethernet address"); + panic("Could not determine the machine Ethernet address"); bcopy(&idp.id_ether, addr, ETHER_ADDR_LEN); } static __inline uint32_t phys_hi_mask_space(const char *bus, uint32_t phys_hi) { - uint32_t space; - space = phys_hi; if (strcmp(bus, "ebus") == 0 || strcmp(bus, "isa") == 0) - space &= 0x1; + phys_hi &= 0x1; else if (strcmp(bus, "pci") == 0) - space &= OFW_PCI_PHYS_HI_SPACEMASK; + phys_hi &= OFW_PCI_PHYS_HI_SPACEMASK; /* The phys.hi cells of the other busses only contain space bits. */ - return (space); + return (phys_hi); } /* * Return the physical address and the bus space to use for a node * referenced by its package handle and the index of the register bank - * to decode. Intended to be used to together with sparc64_fake_bustag() + * to decode. Intended to be used to together with sparc64_fake_bustag() * by console drivers in early boot only. * Works by mapping the address of the node's bank given in the address * space of its parent upward in the device tree at each bridge along the * path. * Currently only really deals with max. 64-bit addresses, i.e. addresses - * consisting of max. 2 phys cells (phys.hi and phys.lo). If we encounter + * consisting of max. 2 phys cells (phys.hi and phys.lo). If we encounter * a 3 phys cells address (as with PCI addresses) we assume phys.hi can * be ignored except for the space bits (generally contained in phys.hi) * and treat phys.mid as phys.hi. @@ -100,26 +98,26 @@ int OF_decode_addr(phandle_t node, int bank, int *space, bus_addr_t *addr) { char name[32]; - uint64_t cend, cstart, end, phys, sz, start; + uint64_t cend, cstart, end, phys, pphys, sz, start; pcell_t addrc, szc, paddrc; phandle_t bus, lbus, pbus; uint32_t banks[10 * 5]; /* 10 PCI banks */ - uint32_t cspace, spc; + uint32_t cspc, pspc, spc; int i, j, nbank; /* * In general the addresses are contained in the "reg" property - * of a node. The first address in the "reg" property of a PCI + * of a node. The first address in the "reg" property of a PCI * node however is the address of its configuration registers in - * the configuration space of the host bridge. Additional entries - * denote the memory and I/O addresses. For relocatable addresses + * the configuration space of the host bridge. Additional entries + * denote the memory and I/O addresses. For relocatable addresses * the "reg" property contains the BAR, for non-relocatable - * addresses it contains the absolute PCI address. The PCI-only + * addresses it contains the absolute PCI address. The PCI-only * "assigned-addresses" property however always contains the * absolute PCI addresses. * The "assigned-addresses" and "reg" properties are arrays of * address structures consisting of #address-cells 32-bit phys - * cells and #size-cells 32-bit size cells. If a parent lacks + * cells and #size-cells 32-bit size cells. If a parent lacks * the "#address-cells" or "#size-cells" property the default * for #address-cells to use is 2 and for #size-cells 1. */ @@ -150,17 +148,18 @@ OF_decode_addr(phandle_t node, int bank, int *space, bus_addr_t *addr) nbank /= sizeof(banks[0]) * (addrc + szc); if (bank < 0 || bank > nbank - 1) return (ENXIO); + bank *= addrc + szc; + spc = phys_hi_mask_space(name, banks[bank]); + /* Skip the high cell for 3-cell addresses. */ + bank += addrc - 2; phys = 0; for (i = 0; i < MIN(2, addrc); i++) - phys |= (uint64_t)banks[(addrc + szc) * bank + addrc - 2 + i] << - 32 * (MIN(2, addrc) - i - 1); + phys = ((uint64_t)phys << 32) | banks[bank++]; sz = 0; for (i = 0; i < szc; i++) - sz |= (uint64_t)banks[(addrc + szc) * bank + addrc + i] << - 32 * (szc - i - 1); + sz = ((uint64_t)sz << 32) | banks[bank++]; start = phys; end = phys + sz - 1; - spc = phys_hi_mask_space(name, banks[(addrc + szc) * bank]); /* * Map upward in the device tree at every bridge we encounter @@ -172,7 +171,7 @@ OF_decode_addr(phandle_t node, int bank, int *space, bus_addr_t *addr) * If a bridge doesn't have a "ranges" property no mapping is * necessary at that bridge. */ - cspace = 0; + cspc = 0; lbus = bus; while ((pbus = OF_parent(bus)) != 0) { if (OF_getprop(pbus, "#address-cells", &paddrc, @@ -195,42 +194,40 @@ OF_decode_addr(phandle_t node, int bank, int *space, bus_addr_t *addr) return (ENXIO); } nbank /= sizeof(banks[0]) * (addrc + paddrc + szc); + bank = 0; for (i = 0; i < nbank; i++) { - cspace = phys_hi_mask_space(name, - banks[(addrc + paddrc + szc) * i]); - if (cspace != spc) + cspc = phys_hi_mask_space(name, banks[bank]); + if (cspc != spc) { + bank += addrc + paddrc + szc; continue; + } + /* Skip the high cell for 3-cell addresses. */ + bank += addrc - 2; phys = 0; for (j = 0; j < MIN(2, addrc); j++) - phys |= (uint64_t)banks[ - (addrc + paddrc + szc) * i + - addrc - 2 + j] << - 32 * (MIN(2, addrc) - j - 1); + phys = ((uint64_t)phys << 32) | banks[bank++]; + pspc = banks[bank]; + /* Skip the high cell for 3-cell addresses. */ + bank += paddrc - 2; + pphys = 0; + for (j = 0; j < MIN(2, paddrc); j++) + pphys = + ((uint64_t)pphys << 32) | banks[bank++]; sz = 0; for (j = 0; j < szc; j++) - sz |= (uint64_t)banks[ - (addrc + paddrc + szc) * i + addrc + - paddrc + j] << - 32 * (szc - j - 1); + sz = ((uint64_t)sz << 32) | banks[bank++]; cstart = phys; cend = phys + sz - 1; if (start < cstart || start > cend) continue; if (end < cstart || end > cend) return (ENXIO); - phys = 0; - for (j = 0; j < MIN(2, paddrc); j++) - phys |= (uint64_t)banks[ - (addrc + paddrc + szc) * i + addrc + - paddrc - 2 + j] << - 32 * (MIN(2, paddrc) - j - 1); - start += phys - cstart; - end += phys - cstart; if (OF_getprop(pbus, "name", name, sizeof(name)) == -1) return (ENXIO); name[sizeof(name) - 1] = '\0'; - spc = phys_hi_mask_space(name, - banks[(addrc + paddrc + szc) * i + addrc]); + spc = phys_hi_mask_space(name, pspc); + start += pphys - cstart; + end += pphys - cstart; break; } if (i == nbank) @@ -241,8 +238,8 @@ OF_decode_addr(phandle_t node, int bank, int *space, bus_addr_t *addr) bus = pbus; } - /* Done with mapping. Return the bus space as used by FreeBSD. */ *addr = start; + /* Determine the bus space based on the last bus we mapped. */ if (OF_parent(lbus) == 0) { *space = NEXUS_BUS_SPACE; return (0); @@ -250,11 +247,12 @@ OF_decode_addr(phandle_t node, int bank, int *space, bus_addr_t *addr) if (OF_getprop(lbus, "name", name, sizeof(name)) == -1) return (ENXIO); name[sizeof(name) - 1] = '\0'; - if (strcmp(name, "central") == 0 || strcmp(name, "upa") == 0) { + if (strcmp(name, "central") == 0 || strcmp(name, "ebus") == 0 || + strcmp(name, "upa") == 0) { *space = NEXUS_BUS_SPACE; return (0); } else if (strcmp(name, "pci") == 0) { - switch (cspace) { + switch (cspc) { case OFW_PCI_PHYS_HI_SPACE_IO: *space = PCI_IO_BUS_SPACE; return (0); diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index 664a856d6ad2..5ebc6ff31298 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -241,6 +241,7 @@ PMAP_STATS_VAR(pmap_nnew_thread_oc); */ static int mr_cmp(const void *a, const void *b); static int om_cmp(const void *a, const void *b); + static int mr_cmp(const void *a, const void *b) { @@ -256,6 +257,7 @@ mr_cmp(const void *a, const void *b) else return (0); } + static int om_cmp(const void *a, const void *b) { @@ -276,7 +278,7 @@ om_cmp(const void *a, const void *b) * Bootstrap the system enough to run with virtual memory. */ void -pmap_bootstrap(void) +pmap_bootstrap(u_int cpu_impl) { struct pmap *pm; struct tte *tp; @@ -1111,10 +1113,9 @@ pmap_release(pmap_t pm) * to a kernel thread, leaving the pmap pointer unchanged. */ mtx_lock_spin(&sched_lock); - SLIST_FOREACH(pc, &cpuhead, pc_allcpu) { + SLIST_FOREACH(pc, &cpuhead, pc_allcpu) if (pc->pc_pmap == pm) pc->pc_pmap = NULL; - } mtx_unlock_spin(&sched_lock); obj = pm->pm_tsb_obj; @@ -1150,7 +1151,7 @@ pmap_growkernel(vm_offset_t addr) int pmap_remove_tte(struct pmap *pm, struct pmap *pm2, struct tte *tp, - vm_offset_t va) + vm_offset_t va) { vm_page_t m; u_long data; @@ -1198,12 +1199,10 @@ pmap_remove(pmap_t pm, vm_offset_t start, vm_offset_t end) tsb_foreach(pm, NULL, start, end, pmap_remove_tte); tlb_context_demap(pm); } else { - for (va = start; va < end; va += PAGE_SIZE) { - if ((tp = tsb_tte_lookup(pm, va)) != NULL) { - if (!pmap_remove_tte(pm, NULL, tp, va)) - break; - } - } + for (va = start; va < end; va += PAGE_SIZE) + if ((tp = tsb_tte_lookup(pm, va)) != NULL && + !pmap_remove_tte(pm, NULL, tp, va)) + break; tlb_range_demap(pm, start, end - 1); } PMAP_UNLOCK(pm); @@ -1245,7 +1244,7 @@ pmap_remove_all(vm_page_t m) int pmap_protect_tte(struct pmap *pm, struct pmap *pm2, struct tte *tp, - vm_offset_t va) + vm_offset_t va) { u_long data; vm_page_t m; @@ -1287,10 +1286,9 @@ pmap_protect(pmap_t pm, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) tsb_foreach(pm, NULL, sva, eva, pmap_protect_tte); tlb_context_demap(pm); } else { - for (va = sva; va < eva; va += PAGE_SIZE) { + for (va = sva; va < eva; va += PAGE_SIZE) if ((tp = tsb_tte_lookup(pm, va)) != NULL) pmap_protect_tte(pm, NULL, tp, va); - } tlb_range_demap(pm, sva, eva - 1); } PMAP_UNLOCK(pm); @@ -1386,21 +1384,18 @@ pmap_enter_locked(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot, */ if ((prot & VM_PROT_WRITE) != 0) { tp->tte_data |= TD_SW; - if (wired) { + if (wired) tp->tte_data |= TD_W; - } vm_page_flag_set(m, PG_WRITEABLE); - } else if ((data & TD_W) != 0) { + } else if ((data & TD_W) != 0) vm_page_dirty(m); - } /* * If we're turning on execute permissions, flush the icache. */ if ((prot & VM_PROT_EXECUTE) != 0) { - if ((data & TD_EXEC) == 0) { + if ((data & TD_EXEC) == 0) icache_page_inval(pa); - } tp->tte_data |= TD_EXEC; } @@ -1495,7 +1490,7 @@ pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_prot_t prot) void pmap_object_init_pt(pmap_t pm, vm_offset_t addr, vm_object_t object, - vm_pindex_t pindex, vm_size_t size) + vm_pindex_t pindex, vm_size_t size) { VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); @@ -1529,7 +1524,8 @@ pmap_change_wiring(pmap_t pm, vm_offset_t va, boolean_t wired) } static int -pmap_copy_tte(pmap_t src_pmap, pmap_t dst_pmap, struct tte *tp, vm_offset_t va) +pmap_copy_tte(pmap_t src_pmap, pmap_t dst_pmap, struct tte *tp, + vm_offset_t va) { vm_page_t m; u_long data; @@ -1547,7 +1543,7 @@ pmap_copy_tte(pmap_t src_pmap, pmap_t dst_pmap, struct tte *tp, vm_offset_t va) void pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, - vm_size_t len, vm_offset_t src_addr) + vm_size_t len, vm_offset_t src_addr) { struct tte *tp; vm_offset_t va; @@ -1567,10 +1563,9 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, pmap_copy_tte); tlb_context_demap(dst_pmap); } else { - for (va = src_addr; va < src_addr + len; va += PAGE_SIZE) { + for (va = src_addr; va < src_addr + len; va += PAGE_SIZE) if ((tp = tsb_tte_lookup(src_pmap, va)) != NULL) pmap_copy_tte(src_pmap, dst_pmap, tp, va); - } tlb_range_demap(dst_pmap, src_addr, src_addr + len - 1); } vm_page_unlock_queues(); @@ -1823,10 +1818,9 @@ pmap_page_is_mapped(vm_page_t m) if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0) return (FALSE); mtx_assert(&vm_page_queue_mtx, MA_OWNED); - TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) { + TAILQ_FOREACH(tp, &m->md.tte_list, tte_link) if ((tp->tte_data & TD_PV) != 0) return (TRUE); - } return (FALSE); } @@ -2001,6 +1995,12 @@ pmap_activate(struct thread *td) mtx_unlock_spin(&sched_lock); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ + +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/sparc64/sparc64/rtc.c b/sys/sparc64/sparc64/rtc.c index 5bd196b25efb..d9b0da95d4ba 100644 --- a/sys/sparc64/sparc64/rtc.c +++ b/sys/sparc64/sparc64/rtc.c @@ -28,10 +28,11 @@ __FBSDID("$FreeBSD$"); /* - * The `rtc' device is a MC146818 compatible clock found on the ISA - * bus and EBus. The EBus variant actually is the Real-Time Clock - * function of a National Semiconductor PC87317/PC97317 which also - * provides Advanced Power Control functionality. + * The `rtc' device is found on the ISA bus and the EBus. The ISA version + * always is a MC146818 compatible clock while the EBus variant either is the + * MC146818 compatible Real-Time Clock function of a National Semiconductor + * PC87317/PC97317 which also provides Advanced Power Control functionality + * or a Texas Instruments bq4802. */ #include "opt_isa.h" @@ -110,7 +111,7 @@ static device_method_t rtc_isa_methods[] = { DEVMETHOD(clock_gettime, mc146818_gettime), DEVMETHOD(clock_settime, mc146818_settime), - { 0, 0 } + KOBJMETHOD_END }; static driver_t rtc_isa_driver = { @@ -122,14 +123,18 @@ static driver_t rtc_isa_driver = { DRIVER_MODULE(rtc, isa, rtc_isa_driver, rtc_devclass, 0, 0); #endif -static u_int pc87317_getcent(device_t); -static void pc87317_setcent(device_t, u_int); +static u_int pc87317_getcent(device_t dev); +static void pc87317_setcent(device_t dev, u_int cent); static int rtc_ebus_probe(device_t dev) { if (strcmp(ofw_bus_get_name(dev), "rtc") == 0) { + /* The bq4802 is not supported, yet. */ + if (ofw_bus_get_compat(dev) != NULL && + strcmp(ofw_bus_get_compat(dev), "bq4802") == 0) + return (ENXIO); device_set_desc(dev, RTC_DESC); return (0); } diff --git a/sys/sparc64/sparc64/spitfire.c b/sys/sparc64/sparc64/spitfire.c index 5a8c4eca070b..d6e25b970b73 100644 --- a/sys/sparc64/sparc64/spitfire.c +++ b/sys/sparc64/sparc64/spitfire.c @@ -56,7 +56,7 @@ PMAP_STATS_VAR(spitfire_icache_npage_inval_match); * Enable the level 1 caches. */ void -spitfire_cache_enable(void) +spitfire_cache_enable(u_int cpu_impl __unused) { u_long lsu; diff --git a/sys/sparc64/sparc64/ssm.c b/sys/sparc64/sparc64/ssm.c new file mode 100644 index 000000000000..98bd0f3a927b --- /dev/null +++ b/sys/sparc64/sparc64/ssm.c @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 2010 Marius Strobl + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* + * Glue allowing devices beneath the scalable shared memory node to be + * treated like nexus(4) children + */ + +#include +#include +#include +#include +#include + +#include + +#include + +static device_probe_t ssm_probe; + +static device_method_t ssm_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ssm_probe), + + /* Bus interface */ + + /* ofw_bus interface */ + + KOBJMETHOD_END +}; + +static devclass_t ssm_devclass; + +DEFINE_CLASS_1(ssm, ssm_driver, ssm_methods, 1 /* no softc */, nexus_driver); +EARLY_DRIVER_MODULE(ssm, nexus, ssm_driver, ssm_devclass, 0, 0, BUS_PASS_BUS); +MODULE_DEPEND(ssm, nexus, 1, 1, 1); +MODULE_VERSION(ssm, 1); + +static int +ssm_probe(device_t dev) +{ + + if (strcmp(ofw_bus_get_name(dev), "ssm") == 0) { + device_set_desc(dev, "Scalable Shared Memory"); + return (BUS_PROBE_DEFAULT); + } + return (ENXIO); +} diff --git a/sys/sparc64/sparc64/stack_machdep.c b/sys/sparc64/sparc64/stack_machdep.c index f05ad6b7f49a..a4309ef45c48 100644 --- a/sys/sparc64/sparc64/stack_machdep.c +++ b/sys/sparc64/sparc64/stack_machdep.c @@ -36,15 +36,20 @@ __FBSDID("$FreeBSD$"); #include #include -static void stack_capture(struct stack *st, struct frame *fp); +static void stack_capture(struct stack *st, struct frame *frame); static void -stack_capture(struct stack *st, struct frame *fp) +stack_capture(struct stack *st, struct frame *frame) { + struct frame *fp; vm_offset_t callpc; stack_zero(st); - while (1) { + fp = frame; + for (;;) { + if (!INKERNEL((vm_offset_t)fp) || + !ALIGNED_POINTER(fp, uint64_t)) + break; callpc = fp->fr_pc; if (!INKERNEL(callpc)) break; @@ -56,6 +61,9 @@ stack_capture(struct stack *st, struct frame *fp) break; if (stack_put(st, callpc) == -1) break; + if (v9next_frame(fp) <= fp || + v9next_frame(fp) >= frame + KSTACK_PAGES * PAGE_SIZE) + break; fp = v9next_frame(fp); } } diff --git a/sys/sparc64/sparc64/swtch.S b/sys/sparc64/sparc64/swtch.S index d9e86d218dd2..af0531627aa9 100644 --- a/sys/sparc64/sparc64/swtch.S +++ b/sys/sparc64/sparc64/swtch.S @@ -46,15 +46,14 @@ ENTRY(cpu_throw) save %sp, -CCFSZ, %sp flushw ba %xcc, .Lsw1 - mov %i1, %i0 + mov %g0, %i2 END(cpu_throw) /* - * void cpu_switch(struct thread *old, struct thread *new) + * void cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx) */ ENTRY(cpu_switch) save %sp, -CCFSZ, %sp - mov %i1, %i0 /* * If the current thread was using floating point in the kernel, save @@ -63,7 +62,7 @@ ENTRY(cpu_switch) */ rd %fprs, %l2 andcc %l2, FPRS_FEF, %g0 - bz,a,pt %xcc, 1f + bz,a,pt %xcc, 1f nop call savefpctx add PCB_REG, PCB_KFP, %o0 @@ -104,24 +103,24 @@ ENTRY(cpu_switch) .Lsw1: #if KTR_COMPILE & KTR_PROC CATR(KTR_PROC, "cpu_switch: new td=%p pc=%#lx fp=%#lx" - , %g1, %g2, %g3, 7, 8, 9) - stx %i0, [%g1 + KTR_PARM1] - ldx [%i0 + TD_PCB], %g2 + , %g1, %g2, %g3, 8, 9, 10) + stx %i1, [%g1 + KTR_PARM1] + ldx [%i1 + TD_PCB], %g2 ldx [%g2 + PCB_PC], %g3 stx %g3, [%g1 + KTR_PARM2] ldx [%g2 + PCB_SP], %g3 stx %g3, [%g1 + KTR_PARM3] -9: +10: #endif - ldx [%i0 + TD_PCB], %i1 + ldx [%i1 + TD_PCB], %l0 - stx %i0, [PCPU(CURTHREAD)] - stx %i1, [PCPU(CURPCB)] + stx %i1, [PCPU(CURTHREAD)] + stx %l0, [PCPU(CURPCB)] wrpr %g0, PSTATE_NORMAL, %pstate - mov %i1, PCB_REG + mov %l0, PCB_REG wrpr %g0, PSTATE_ALT, %pstate - mov %i1, PCB_REG + mov %l0, PCB_REG wrpr %g0, PSTATE_KERNEL, %pstate ldx [PCB_REG + PCB_SP], %fp @@ -132,24 +131,24 @@ ENTRY(cpu_switch) * Point to the pmaps of the new process, and of the last non-kernel * process to run. */ - ldx [%i0 + TD_PROC], %i2 + ldx [%i1 + TD_PROC], %l1 ldx [PCPU(PMAP)], %l2 - ldx [%i2 + P_VMSPACE], %i5 - add %i5, VM_PMAP, %i2 + ldx [%l1 + P_VMSPACE], %i5 + add %i5, VM_PMAP, %l1 #if KTR_COMPILE & KTR_PROC CATR(KTR_PROC, "cpu_switch: new pmap=%p old pmap=%p" - , %g1, %g2, %g3, 7, 8, 9) - stx %i2, [%g1 + KTR_PARM1] + , %g1, %g2, %g3, 8, 9, 10) + stx %l1, [%g1 + KTR_PARM1] stx %l2, [%g1 + KTR_PARM2] -9: +10: #endif /* * If they are the same we are done. */ - cmp %l2, %i2 - be,a,pn %xcc, 5f + cmp %l2, %l1 + be,a,pn %xcc, 7f nop /* @@ -158,21 +157,20 @@ ENTRY(cpu_switch) */ SET(vmspace0, %i4, %i3) cmp %i5, %i3 - be,a,pn %xcc, 5f + be,a,pn %xcc, 7f nop /* * If there was no non-kernel pmap, don't try to deactivate it. */ - brz,a,pn %l2, 3f - nop + brz,pn %l2, 3f + lduw [PCPU(CPUMASK)], %l4 /* * Mark the pmap of the last non-kernel vmspace to run as no longer * active on this CPU. */ lduw [%l2 + PM_ACTIVE], %l3 - lduw [PCPU(CPUMASK)], %l4 andn %l3, %l4, %l3 stw %l3, [%l2 + PM_ACTIVE] @@ -185,25 +183,28 @@ ENTRY(cpu_switch) mov -1, %l5 stw %l5, [%l3 + %l4] +3: cmp %i2, %g0 + be,pn %xcc, 4f + lduw [PCPU(TLB_CTX_MAX)], %i4 + stx %i2, [%i0 + TD_LOCK] + /* * Find a new TLB context. If we've run out we have to flush all * user mappings from the TLB and reset the context numbers. */ -3: lduw [PCPU(TLB_CTX)], %i3 - lduw [PCPU(TLB_CTX_MAX)], %i4 +4: lduw [PCPU(TLB_CTX)], %i3 cmp %i3, %i4 - bne,a,pt %xcc, 4f + bne,a,pt %xcc, 5f nop SET(tlb_flush_user, %i5, %i4) ldx [%i4], %i5 call %i5 - nop - lduw [PCPU(TLB_CTX_MIN)], %i3 + lduw [PCPU(TLB_CTX_MIN)], %i3 /* * Advance next free context. */ -4: add %i3, 1, %i4 +5: add %i3, 1, %i4 stw %i4, [PCPU(TLB_CTX)] /* @@ -211,36 +212,36 @@ ENTRY(cpu_switch) */ lduw [PCPU(CPUID)], %i4 sllx %i4, INT_SHIFT, %i4 - add %i2, PM_CONTEXT, %i5 + add %l1, PM_CONTEXT, %i5 stw %i3, [%i4 + %i5] /* * Mark the pmap as active on this CPU. */ - lduw [%i2 + PM_ACTIVE], %i4 + lduw [%l1 + PM_ACTIVE], %i4 lduw [PCPU(CPUMASK)], %i5 or %i4, %i5, %i4 - stw %i4, [%i2 + PM_ACTIVE] + stw %i4, [%l1 + PM_ACTIVE] /* * Make note of the change in pmap. */ - stx %i2, [PCPU(PMAP)] + stx %l1, [PCPU(PMAP)] /* * Fiddle the hardware bits. Set the TSB registers and install the * new context number in the CPU. */ - ldx [%i2 + PM_TSB], %i4 + ldx [%l1 + PM_TSB], %i4 mov AA_DMMU_TSB, %i5 stxa %i4, [%i5] ASI_DMMU mov AA_IMMU_TSB, %i5 stxa %i4, [%i5] ASI_IMMU setx TLB_PCXR_PGSZ_MASK, %i5, %i4 mov AA_DMMU_PCXR, %i5 - ldxa [%i5] ASI_DMMU, %i2 - and %i2, %i4, %i2 - or %i3, %i2, %i3 + ldxa [%i5] ASI_DMMU, %l1 + and %l1, %i4, %l1 + or %i3, %l1, %i3 sethi %hi(KERNBASE), %i4 stxa %i3, [%i5] ASI_DMMU flush %i4 @@ -248,7 +249,15 @@ ENTRY(cpu_switch) /* * Done, return and load the new process's window from the stack. */ -5: ret + +6: ret + restore + +7: cmp %i2, %g0 + be,a,pn %xcc, 6b + nop + stx %i2, [%i0 + TD_LOCK] + ret restore END(cpu_switch) diff --git a/sys/sparc64/sparc64/tick.c b/sys/sparc64/sparc64/tick.c index 97472286168d..1a38013e884b 100644 --- a/sys/sparc64/sparc64/tick.c +++ b/sys/sparc64/sparc64/tick.c @@ -120,7 +120,7 @@ cpu_initclocks(void) */ } else { clock = PCPU_GET(clock); - intr_setup(PIL_TICK, cpu_impl < CPU_IMPL_ULTRASPARCIII ? + intr_setup(PIL_TICK, PCPU_GET(impl) < CPU_IMPL_ULTRASPARCIII ? tick_hardclock_bbwar : tick_hardclock, -1, NULL, NULL); set_cputicker(tick_cputicks, clock, 0); } @@ -322,7 +322,7 @@ tick_start(void) } void -tick_clear(void) +tick_clear(u_int cpu_impl) { if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) @@ -331,7 +331,7 @@ tick_clear(void) } void -tick_stop(void) +tick_stop(u_int cpu_impl) { if (cpu_impl >= CPU_IMPL_ULTRASPARCIII) diff --git a/sys/sparc64/sparc64/trap.c b/sys/sparc64/sparc64/trap.c index 702e4f198664..3df335bcc48d 100644 --- a/sys/sparc64/sparc64/trap.c +++ b/sys/sparc64/sparc64/trap.c @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -84,6 +85,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -92,9 +94,18 @@ __FBSDID("$FreeBSD$"); #include #include +struct syscall_args { + u_long code; + struct sysent *callp; + register_t args[8]; + register_t *argp; + int narg; +}; + void trap(struct trapframe *tf); void syscall(struct trapframe *tf); +static int fetch_syscall_args(struct thread *td, struct syscall_args *sa); static int trap_pfault(struct thread *td, struct trapframe *tf); extern char copy_fault[]; @@ -381,7 +392,7 @@ trap(struct trapframe *tf) if (tf->tf_tpc > (u_long)fas_nofault_begin && tf->tf_tpc < (u_long)fas_nofault_end) { cache_flush(); - cache_enable(); + cache_enable(PCPU_GET(impl)); tf->tf_tpc = (u_long)fas_fault; tf->tf_tnpc = tf->tf_tpc + 4; error = 0; @@ -409,7 +420,6 @@ trap_pfault(struct thread *td, struct trapframe *tf) vm_prot_t prot; vm_map_entry_t entry; u_long ctx; - int flags; int type; int rv; @@ -429,15 +439,13 @@ trap_pfault(struct thread *td, struct trapframe *tf) CTR4(KTR_TRAP, "trap_pfault: td=%p pm_ctx=%#lx va=%#lx ctx=%#lx", td, p->p_vmspace->vm_pmap.pm_context[curcpu], va, ctx); - if (type == T_DATA_PROTECTION) { + if (type == T_DATA_PROTECTION) prot = VM_PROT_WRITE; - flags = VM_FAULT_DIRTY; - } else { + else { if (type == T_DATA_MISS) prot = VM_PROT_READ; else prot = VM_PROT_READ | VM_PROT_EXECUTE; - flags = VM_FAULT_NORMAL; } if (ctx != TLB_CTX_KERNEL) { @@ -463,7 +471,7 @@ trap_pfault(struct thread *td, struct trapframe *tf) PROC_UNLOCK(p); /* Fault in the user page. */ - rv = vm_fault(&vm->vm_map, va, prot, flags); + rv = vm_fault(&vm->vm_map, va, prot, VM_FAULT_NORMAL); /* * Now the process can be swapped again. @@ -524,170 +532,163 @@ trap_pfault(struct thread *td, struct trapframe *tf) /* Maximum number of arguments that can be passed via the out registers. */ #define REG_MAXARGS 6 +static int +fetch_syscall_args(struct thread *td, struct syscall_args *sa) +{ + struct trapframe *tf; + struct proc *p; + int reg; + int regcnt; + int error; + + p = td->td_proc; + tf = td->td_frame; + reg = 0; + regcnt = REG_MAXARGS; + + sa->code = tf->tf_global[1]; + + if (p->p_sysent->sv_prepsyscall) { +#if 0 + (*p->p_sysent->sv_prepsyscall)(tf, sa->args, &sa->code, + ¶ms); +#endif + } else if (sa->code == SYS_syscall || sa->code == SYS___syscall) { + sa->code = tf->tf_out[reg++]; + regcnt--; + } + + if (p->p_sysent->sv_mask) + sa->code &= p->p_sysent->sv_mask; + + if (sa->code >= p->p_sysent->sv_size) + sa->callp = &p->p_sysent->sv_table[0]; + else + sa->callp = &p->p_sysent->sv_table[sa->code]; + + sa->narg = sa->callp->sy_narg; + KASSERT(sa->narg <= sizeof(sa->args) / sizeof(sa->args[0]), + ("Too many syscall arguments!")); + error = 0; + sa->argp = sa->args; + bcopy(&tf->tf_out[reg], sa->args, sizeof(sa->args[0]) * regcnt); + if (sa->narg > regcnt) + error = copyin((void *)(tf->tf_out[6] + SPOFF + + offsetof(struct frame, fr_pad[6])), &sa->args[regcnt], + (sa->narg - regcnt) * sizeof(sa->args[0])); + + /* + * This may result in two records if debugger modified + * registers or memory during sleep at stop/ptrace point. + */ +#ifdef KTRACE + if (KTRPOINT(td, KTR_SYSCALL)) + ktrsyscall(sa->code, sa->narg, sa->argp); +#endif + return (error); +} + /* - * Syscall handler. The arguments to the syscall are passed in the o registers - * by the caller, and are saved in the trap frame. The syscall number is passed - * in %g1 (and also saved in the trap frame). + * Syscall handler + * The arguments to the syscall are passed in the out registers by the caller, + * and are saved in the trap frame. The syscall number is passed in %g1 (and + * also saved in the trap frame). */ void syscall(struct trapframe *tf) { - struct sysent *callp; + struct syscall_args sa; struct thread *td; - register_t args[8]; - register_t *argp; struct proc *p; - u_long code; - u_long tpc; - int reg; - int regcnt; - int narg; int error; td = curthread; KASSERT(td != NULL, ("trap: curthread NULL")); KASSERT(td->td_proc != NULL, ("trap: curproc NULL")); - p = td->td_proc; - PCPU_INC(cnt.v_syscall); + p = td->td_proc; + td->td_syscalls++; td->td_pticks = 0; td->td_frame = tf; if (td->td_ucred != p->p_ucred) cred_update_thread(td); - code = tf->tf_global[1]; + if ((p->p_flag & P_TRACED) != 0) { + PROC_LOCK(p); + td->td_dbgflags &= ~TDB_USERWR; + PROC_UNLOCK(p); + } /* * For syscalls, we don't want to retry the faulting instruction * (usually), instead we need to advance one instruction. */ - tpc = tf->tf_tpc; + td->td_pcb->pcb_tpc = tf->tf_tpc; TF_DONE(tf); - reg = 0; - regcnt = REG_MAXARGS; - if (p->p_sysent->sv_prepsyscall) { - /* - * The prep code is MP aware. - */ -#if 0 - (*p->p_sysent->sv_prepsyscall)(tf, args, &code, ¶ms); -#endif - } else if (code == SYS_syscall || code == SYS___syscall) { - code = tf->tf_out[reg++]; - regcnt--; - } - - if (p->p_sysent->sv_mask) - code &= p->p_sysent->sv_mask; - - if (code >= p->p_sysent->sv_size) - callp = &p->p_sysent->sv_table[0]; - else - callp = &p->p_sysent->sv_table[code]; - - narg = callp->sy_narg; - - KASSERT(narg <= sizeof(args) / sizeof(args[0]), - ("Too many syscall arguments!")); - error = 0; - argp = args; - bcopy(&tf->tf_out[reg], args, sizeof(args[0]) * regcnt); - if (narg > regcnt) - error = copyin((void *)(tf->tf_out[6] + SPOFF + - offsetof(struct frame, fr_pad[6])), - &args[regcnt], (narg - regcnt) * sizeof(args[0])); - + error = fetch_syscall_args(td, &sa); CTR5(KTR_SYSC, "syscall: td=%p %s(%#lx, %#lx, %#lx)", td, - syscallnames[code], argp[0], argp[1], argp[2]); - -#ifdef KTRACE - if (KTRPOINT(td, KTR_SYSCALL)) - ktrsyscall(code, narg, argp); -#endif - - td->td_syscalls++; + syscallnames[sa.code], sa.argp[0], sa.argp[1], sa.argp[2]); if (error == 0) { td->td_retval[0] = 0; td->td_retval[1] = 0; - STOPEVENT(p, S_SCE, narg); /* MP aware */ - + STOPEVENT(p, S_SCE, sa.narg); PTRACESTOP_SC(p, td, S_PT_SCE); + if ((td->td_dbgflags & TDB_USERWR) != 0) { + /* + * Reread syscall number and arguments if + * debugger modified registers or memory. + */ + error = fetch_syscall_args(td, &sa); + if (error != 0) + goto retval; + td->td_retval[1] = 0; + } - AUDIT_SYSCALL_ENTER(code, td); - error = (*callp->sy_call)(td, argp); + AUDIT_SYSCALL_ENTER(sa.code, td); + error = (*sa.callp->sy_call)(td, sa.argp); AUDIT_SYSCALL_EXIT(error, td); - CTR5(KTR_SYSC, "syscall: p=%p error=%d %s return %#lx %#lx ", p, - error, syscallnames[code], td->td_retval[0], + CTR5(KTR_SYSC, "syscall: p=%p error=%d %s return %#lx %#lx", + p, error, syscallnames[sa.code], td->td_retval[0], td->td_retval[1]); } - - /* - * MP SAFE (we may or may not have the MP lock at this point) - */ - switch (error) { - case 0: - tf->tf_out[0] = td->td_retval[0]; - tf->tf_out[1] = td->td_retval[1]; - tf->tf_tstate &= ~TSTATE_XCC_C; - break; - - case ERESTART: - /* - * Undo the tpc advancement we have done above, we want to - * reexecute the system call. - */ - tf->tf_tpc = tpc; - tf->tf_tnpc -= 4; - break; - - case EJUSTRETURN: - break; - - default: - if (p->p_sysent->sv_errsize) { - if (error >= p->p_sysent->sv_errsize) - error = -1; /* XXX */ - else - error = p->p_sysent->sv_errtbl[error]; - } - tf->tf_out[0] = error; - tf->tf_tstate |= TSTATE_XCC_C; - break; - } + retval: + cpu_set_syscall_retval(td, error); /* * Check for misbehavior. */ WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???"); KASSERT(td->td_critnest == 0, ("System call %s returning in a critical section", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???")); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???")); KASSERT(td->td_locks == 0, ("System call %s returning with %d locks held", - (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???", - td->td_locks)); + (sa.code >= 0 && sa.code < SYS_MAXSYSCALL) ? + syscallnames[sa.code] : "???", td->td_locks)); /* - * Handle reschedule and other end-of-syscall issues + * Handle reschedule and other end-of-syscall issues. */ userret(td, tf); #ifdef KTRACE if (KTRPOINT(td, KTR_SYSRET)) - ktrsysret(code, error, td->td_retval[0]); + ktrsysret(sa.code, error, td->td_retval[0]); #endif /* * This works because errno is findable through the * register set. If we ever support an emulation where this * is not the case, this code will need to be revisited. */ - STOPEVENT(p, S_SCX, code); + STOPEVENT(p, S_SCX, sa.code); PTRACESTOP_SC(p, td, S_PT_SCX); } diff --git a/sys/sparc64/sparc64/upa.c b/sys/sparc64/sparc64/upa.c index 7e81c8923aef..ecb11a2db4f3 100644 --- a/sys/sparc64/sparc64/upa.c +++ b/sys/sparc64/sparc64/upa.c @@ -151,7 +151,7 @@ static device_method_t upa_methods[] = { static devclass_t upa_devclass; DEFINE_CLASS_0(upa, upa_driver, upa_methods, sizeof(struct upa_softc)); -DRIVER_MODULE(upa, nexus, upa_driver, upa_devclass, 0, 0); +EARLY_DRIVER_MODULE(upa, nexus, upa_driver, upa_devclass, 0, 0, BUS_PASS_BUS); static const struct intr_controller upa_ic = { upa_intr_enable, diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_machdep.c index 76521a6bca36..009f45d650a1 100644 --- a/sys/sparc64/sparc64/vm_machdep.c +++ b/sys/sparc64/sparc64/vm_machdep.c @@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -165,6 +166,42 @@ cpu_thread_swapout(struct thread *td) } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + + switch (error) { + case 0: + td->td_frame->tf_out[0] = td->td_retval[0]; + td->td_frame->tf_out[1] = td->td_retval[1]; + td->td_frame->tf_tstate &= ~TSTATE_XCC_C; + break; + + case ERESTART: + /* + * Undo the tpc advancement we have done on syscall + * enter, we want to reexecute the system call. + */ + td->td_frame->tf_tpc = td->td_pcb->pcb_tpc; + td->td_frame->tf_tnpc -= 4; + break; + + case EJUSTRETURN: + break; + + default: + if (td->td_proc->p_sysent->sv_errsize) { + if (error >= td->td_proc->p_sysent->sv_errsize) + error = -1; /* XXX */ + else + error = td->td_proc->p_sysent->sv_errtbl[error]; + } + td->td_frame->tf_out[0] = error; + td->td_frame->tf_tstate |= TSTATE_XCC_C; + break; + } +} + void cpu_set_upcall(struct thread *td, struct thread *td0) { diff --git a/sys/sun4v/conf/GENERIC b/sys/sun4v/conf/GENERIC index ea72139d0a95..13db23d25a34 100644 --- a/sys/sun4v/conf/GENERIC +++ b/sys/sun4v/conf/GENERIC @@ -66,6 +66,7 @@ options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed. options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4) options AUDIT # Security event auditing options MAC # TrustedBSD MAC Framework +options INCLUDE_CONFIG_FILE # Include this file in kernel # Debugging for use in -current options KDB # Enable kernel debugger support. @@ -74,6 +75,7 @@ options DDB # Support DDB. #options TRAP_TRACING # Enable trap tracing. #options TRAP_TRACE_ENTRIES=256 # Trap trace buffer entries. #options GDB # Support remote GDB. +#options DEADLKRES # Enable the deadlock resolver #options INVARIANTS # Enable calls of extra sanity checking #options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS #options WITNESS # Enable checks to detect deadlocks and cycles @@ -169,6 +171,7 @@ device bge # Broadcom BCM570xx Gigabit Ethernet device loop # Network loopback device random # Entropy device device ether # Ethernet support +device vlan # 802.1Q VLAN support device tun # Packet tunnel. device pty # BSD-style compatibility pseudo ttys device md # Memory "disks" @@ -218,4 +221,3 @@ device ccd # on most arches and in most cases 1000Hz pessimizes performance # its choice was not adequately researched options HZ=100 - diff --git a/sys/sun4v/conf/Makefile b/sys/sun4v/conf/Makefile index 2c006e9c2c80..1c33841c2489 100644 --- a/sys/sun4v/conf/Makefile +++ b/sys/sun4v/conf/Makefile @@ -1,3 +1,5 @@ # $FreeBSD$ +TARGET=sun4v + .include "${.CURDIR}/../../conf/makeLINT.mk" diff --git a/sys/sun4v/conf/NOTES b/sys/sun4v/conf/NOTES index a773e5cffd6f..b655ae278a6f 100644 --- a/sys/sun4v/conf/NOTES +++ b/sys/sun4v/conf/NOTES @@ -19,39 +19,20 @@ cpu SUN4V # HARDWARE BUS CONFIGURATION device ebus -#device isa +device isa device pci -device sbus -#device central -device fhc ##################################################################### # HARDWARE DEVICE CONFIGURATION -# -# Mandatory devices: -# - -#device eeprom # eeprom (really a front-end for the MK48Txx) -device mk48txx # Mostek MK48Txx clocks -#device rtc # rtc (really a front-end for the MC146818) -device mc146818 # Motorola MC146818 and compatible clocks - # # Optional devices: # -#device auxio # auxiliary I/O device -#device clkbrd # Clock Board (blinkenlight on Sun Exx00) -#device creator # Creator, Creator3D and Elite3D framebuffers -#device machfb # ATI Mach64 framebuffers - device ofw_console # Open Firmware console device option OFWCONS_POLL_HZ=4 # 20 or more works best on Ultra2 -#device sab # Siemens SAB82532 based serial ports - ##################################################################### # Devices we don't want to deal with diff --git a/sys/sun4v/include/asi.h b/sys/sun4v/include/asi.h index 07b097b93383..e37785993c08 100644 --- a/sys/sun4v/include/asi.h +++ b/sys/sun4v/include/asi.h @@ -158,6 +158,11 @@ #define AA_DMMU_TAR 0x30 #define ASI_UPA_CONFIG_REG 0x4a /* US-I, II */ +#define ASI_FIREPLANE_CONFIG_REG 0x4a /* US-III{,+}, IV{,+} */ +#define AA_FIREPLANE_CONFIG 0x0 /* US-III{,+}, IV{,+} */ +#define AA_FIREPLANE_ADDRESS 0x8 /* US-III{,+}, IV{,+} */ +#define AA_FIREPLANE_CONFIG_2 0x10 /* US-IV{,+} */ +#define ASI_JBUS_CONFIG_REG 0x4a /* US-IIIi{,+} */ #define ASI_IMMU 0x50 #define ASI_ITLB_DATA_IN_REG 0x54 #define ASI_ITLB_DATA_ACCESS_REG 0x55 @@ -167,5 +172,7 @@ #define ASI_DTLB_DATA_IN_REG 0x5c #define ASI_DTLB_DATA_ACCESS_REG 0x5d #define ASI_DTLB_TAG_READ_REG 0x5e +#define ASI_INTR_ID 0x63 /* US-IV{,+} */ +#define AA_INTR_ID 0x0 /* US-IV{,+} */ #endif /* !_MACHINE_ASI_H_ */ diff --git a/sys/sun4v/include/bus.h b/sys/sun4v/include/bus.h index 27901df65c50..02fa6345a8d7 100644 --- a/sys/sun4v/include/bus.h +++ b/sys/sun4v/include/bus.h @@ -81,7 +81,6 @@ #include #include -#include /* * Nexus and SBus spaces are non-cached and big endian @@ -96,30 +95,27 @@ #define PCI_MEMORY_BUS_SPACE 4 #define LAST_BUS_SPACE 5 -extern int bus_type_asi[]; -extern int bus_stream_asi[]; +extern const int bus_type_asi[]; +extern const int bus_stream_asi[]; -#define __BUS_SPACE_HAS_STREAM_METHODS 1 +#define __BUS_SPACE_HAS_STREAM_METHODS 1 -#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF -#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXSIZE 0xFFFFFFFFFFFFFFFF -#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF -#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF -#define BUS_SPACE_MAXADDR 0xFFFFFFFF +#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF +#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF +#define BUS_SPACE_MAXSIZE 0xFFFFFFFFFFFFFFFF +#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF +#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF +#define BUS_SPACE_MAXADDR 0xFFFFFFFF -#define BUS_SPACE_UNRESTRICTED (~0) +#define BUS_SPACE_UNRESTRICTED (~0) -/* - * Access methods for bus resources and address space. - */ struct bus_space_tag { void *bst_cookie; bus_space_tag_t bst_parent; int bst_type; void (*bst_bus_barrier)(bus_space_tag_t, bus_space_handle_t, - bus_size_t, bus_size_t, int); + bus_size_t, bus_size_t, int); }; /* @@ -135,13 +131,11 @@ static int bus_space_subregion(bus_space_tag_t, bus_space_handle_t, */ static __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr, - bus_size_t size, int flags, - bus_space_handle_t *bshp); + bus_size_t size, int flags, bus_space_handle_t *bshp); static __inline int bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr, - bus_size_t size __unused, int flags __unused, - bus_space_handle_t *bshp) + bus_size_t size __unused, int flags __unused, bus_space_handle_t *bshp) { *bshp = addr; @@ -152,24 +146,26 @@ bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr, * Unmap a region of device bus space. */ static __inline void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh, - bus_size_t size); + bus_size_t size); static __inline void bus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused, - bus_size_t size __unused) + bus_size_t size __unused) { + } /* This macro finds the first "upstream" implementation of method `f' */ -#define _BS_CALL(t,f) \ +#define _BS_CALL(t,f) \ while (t->f == NULL) \ - t = t->bst_parent; \ + t = t->bst_parent; \ return (*(t)->f) static __inline void bus_space_barrier(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_size_t s, int f) { + _BS_CALL(t, bst_bus_barrier)(t, h, o, s, f); } @@ -177,20 +173,21 @@ static __inline int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_size_t s, bus_space_handle_t *hp) { + *hp = h + o; return (0); } /* flags for bus space map functions */ -#define BUS_SPACE_MAP_CACHEABLE 0x0001 -#define BUS_SPACE_MAP_LINEAR 0x0002 -#define BUS_SPACE_MAP_READONLY 0x0004 -#define BUS_SPACE_MAP_PREFETCHABLE 0x0008 +#define BUS_SPACE_MAP_CACHEABLE 0x0001 +#define BUS_SPACE_MAP_LINEAR 0x0002 +#define BUS_SPACE_MAP_READONLY 0x0004 +#define BUS_SPACE_MAP_PREFETCHABLE 0x0008 /* placeholders for bus functions... */ -#define BUS_SPACE_MAP_BUS1 0x0100 -#define BUS_SPACE_MAP_BUS2 0x0200 -#define BUS_SPACE_MAP_BUS3 0x0400 -#define BUS_SPACE_MAP_BUS4 0x0800 +#define BUS_SPACE_MAP_BUS1 0x0100 +#define BUS_SPACE_MAP_BUS2 0x0200 +#define BUS_SPACE_MAP_BUS3 0x0400 +#define BUS_SPACE_MAP_BUS4 0x0800 /* flags for bus_space_barrier() */ #define BUS_SPACE_BARRIER_READ 0x01 /* force read barrier */ @@ -198,13 +195,9 @@ bus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, #ifdef BUS_SPACE_DEBUG #define KTR_BUS KTR_CT2 -#define BUS_HANDLE_MIN UPA_MEMSTART #define __BUS_DEBUG_ACCESS(h, o, desc, sz) do { \ CTR4(KTR_BUS, "bus space: %s %d: handle %#lx, offset %#lx", \ (desc), (sz), (h), (o)); \ - if ((h) + (o) < BUS_HANDLE_MIN) \ - panic("bus space access at %#lx out of range", \ - (h) + (o)); \ } while (0) #else #define __BUS_DEBUG_ACCESS(h, o, desc, sz) @@ -316,7 +309,7 @@ bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, static __inline void bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - uint8_t *a, size_t c) + const uint8_t *a, size_t c) { while (c-- > 0) @@ -325,7 +318,7 @@ bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, static __inline void bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - uint16_t *a, size_t c) + const uint16_t *a, size_t c) { while (c-- > 0) @@ -334,7 +327,7 @@ bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, static __inline void bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - uint32_t *a, size_t c) + const uint32_t *a, size_t c) { while (c-- > 0) @@ -343,7 +336,7 @@ bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, static __inline void bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - uint64_t *a, size_t c) + const uint64_t *a, size_t c) { while (c-- > 0) @@ -388,97 +381,109 @@ bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, static __inline void bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int8_t *a, bus_size_t c) + uint8_t *a, bus_size_t c) { + for (; c; a++, c--, o++) *a = bus_space_read_1(t, h, o); } static __inline void bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int16_t *a, bus_size_t c) + uint16_t *a, bus_size_t c) { - for (; c; a++, c--, o+=2) + + for (; c; a++, c--, o += 2) *a = bus_space_read_2(t, h, o); } static __inline void bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int32_t *a, bus_size_t c) + uint32_t *a, bus_size_t c) { - for (; c; a++, c--, o+=4) + + for (; c; a++, c--, o += 4) *a = bus_space_read_4(t, h, o); } static __inline void bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int64_t *a, bus_size_t c) + uint64_t *a, bus_size_t c) { - for (; c; a++, c--, o+=8) + + for (; c; a++, c--, o += 8) *a = bus_space_read_8(t, h, o); } static __inline void bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int8_t *a, bus_size_t c) + const uint8_t *a, bus_size_t c) { + for (; c; a++, c--, o++) bus_space_write_1(t, h, o, *a); } static __inline void bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int16_t *a, bus_size_t c) + const uint16_t *a, bus_size_t c) { - for (; c; a++, c--, o+=2) + + for (; c; a++, c--, o += 2) bus_space_write_2(t, h, o, *a); } static __inline void bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int32_t *a, bus_size_t c) + const uint32_t *a, bus_size_t c) { - for (; c; a++, c--, o+=4) + + for (; c; a++, c--, o += 4) bus_space_write_4(t, h, o, *a); } static __inline void bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int64_t *a, bus_size_t c) + const uint64_t *a, bus_size_t c) { - for (; c; a++, c--, o+=8) + + for (; c; a++, c--, o += 8) bus_space_write_8(t, h, o, *a); } static __inline void bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int8_t v, bus_size_t c) + const uint8_t v, bus_size_t c) { + for (; c; c--, o++) bus_space_write_1(t, h, o, v); } static __inline void bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int16_t v, bus_size_t c) + const uint16_t v, bus_size_t c) { - for (; c; c--, o+=2) + + for (; c; c--, o += 2) bus_space_write_2(t, h, o, v); } static __inline void bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int32_t v, bus_size_t c) + const uint32_t v, bus_size_t c) { - for (; c; c--, o+=4) + + for (; c; c--, o += 4) bus_space_write_4(t, h, o, v); } static __inline void bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - const u_int64_t v, bus_size_t c) + const uint64_t v, bus_size_t c) { - for (; c; c--, o+=8) + + for (; c; c--, o += 8) bus_space_write_8(t, h, o, v); } @@ -486,6 +491,7 @@ static __inline void bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { + for (; c; c--, o1++, o2++) bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2)); } @@ -494,7 +500,8 @@ static __inline void bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - for (; c; c--, o1+=2, o2+=2) + + for (; c; c--, o1 += 2, o2 += 2) bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2)); } @@ -502,7 +509,8 @@ static __inline void bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - for (; c; c--, o1+=4, o2+=4) + + for (; c; c--, o1 += 4, o2 += 4) bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2)); } @@ -510,7 +518,8 @@ static __inline void bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - for (; c; c--, o1+=8, o2+=8) + + for (; c; c--, o1 += 8, o2 += 8) bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } @@ -692,7 +701,7 @@ bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h, static __inline void bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, u_int8_t *a, bus_size_t c) + bus_size_t o, uint8_t *a, bus_size_t c) { for (; c; a++, c--, o++) @@ -701,34 +710,34 @@ bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, static __inline void bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, u_int16_t *a, bus_size_t c) + bus_size_t o, uint16_t *a, bus_size_t c) { - for (; c; a++, c--, o+=2) + for (; c; a++, c--, o += 2) *a = bus_space_read_stream_2(t, h, o); } static __inline void bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, u_int32_t *a, bus_size_t c) + bus_size_t o, uint32_t *a, bus_size_t c) { - for (; c; a++, c--, o+=4) + for (; c; a++, c--, o += 4) *a = bus_space_read_stream_4(t, h, o); } static __inline void bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, u_int64_t *a, bus_size_t c) + bus_size_t o, uint64_t *a, bus_size_t c) { - for (; c; a++, c--, o+=8) + for (; c; a++, c--, o += 8) *a = bus_space_read_stream_8(t, h, o); } static __inline void bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int8_t *a, bus_size_t c) + bus_size_t o, const uint8_t *a, bus_size_t c) { for (; c; a++, c--, o++) @@ -737,34 +746,34 @@ bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, static __inline void bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int16_t *a, bus_size_t c) + bus_size_t o, const uint16_t *a, bus_size_t c) { - for (; c; a++, c--, o+=2) + for (; c; a++, c--, o += 2) bus_space_write_stream_2(t, h, o, *a); } static __inline void bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int32_t *a, bus_size_t c) + bus_size_t o, const uint32_t *a, bus_size_t c) { - for (; c; a++, c--, o+=4) + for (; c; a++, c--, o += 4) bus_space_write_stream_4(t, h, o, *a); } static __inline void bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int64_t *a, bus_size_t c) + bus_size_t o, const uint64_t *a, bus_size_t c) { - for (; c; a++, c--, o+=8) + for (; c; a++, c--, o += 8) bus_space_write_stream_8(t, h, o, *a); } static __inline void bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int8_t v, bus_size_t c) + bus_size_t o, const uint8_t v, bus_size_t c) { for (; c; c--, o++) @@ -773,28 +782,28 @@ bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h, static __inline void bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int16_t v, bus_size_t c) + bus_size_t o, const uint16_t v, bus_size_t c) { - for (; c; c--, o+=2) + for (; c; c--, o += 2) bus_space_write_stream_2(t, h, o, v); } static __inline void bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int32_t v, bus_size_t c) + bus_size_t o, const uint32_t v, bus_size_t c) { - for (; c; c--, o+=4) + for (; c; c--, o += 4) bus_space_write_stream_4(t, h, o, v); } static __inline void bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h, - bus_size_t o, const u_int64_t v, bus_size_t c) + bus_size_t o, const uint64_t v, bus_size_t c) { - for (; c; c--, o+=8) + for (; c; c--, o += 8) bus_space_write_stream_8(t, h, o, v); } @@ -813,7 +822,7 @@ bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - for (; c; c--, o1+=2, o2+=2) + for (; c; c--, o1 += 2, o2 += 2) bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2, o2)); } @@ -823,7 +832,7 @@ bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - for (; c; c--, o1+=4, o2+=4) + for (; c; c--, o1 += 4, o2 += 4) bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2, o2)); } @@ -833,7 +842,7 @@ bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1, bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c) { - for (; c; c--, o1+=8, o2+=8) + for (; c; c--, o1 += 8, o2 += 8) bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2)); } diff --git a/sys/sun4v/include/cmt.h b/sys/sun4v/include/cmt.h new file mode 100644 index 000000000000..4fddc63d21fa --- /dev/null +++ b/sys/sun4v/include/cmt.h @@ -0,0 +1,7 @@ +/*- + * This file is in the public domain. + * + * $FreeBSD$ + */ + +#include diff --git a/sys/sun4v/include/elf.h b/sys/sun4v/include/elf.h index c0fcbee5ecd6..2a666705d0f8 100644 --- a/sys/sun4v/include/elf.h +++ b/sys/sun4v/include/elf.h @@ -97,4 +97,6 @@ __ElfType(Auxinfo); #define ELF_TARG_MACH ELF_ARCH #define ELF_TARG_VER 1 +#define ET_DYN_LOAD_ADDR 0x100000 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/sun4v/include/fireplane.h b/sys/sun4v/include/fireplane.h new file mode 100644 index 000000000000..7c81412db3e5 --- /dev/null +++ b/sys/sun4v/include/fireplane.h @@ -0,0 +1,7 @@ +/*- + * This file is in the public domain. + * + * $FreeBSD$ + */ + +#include diff --git a/sys/sun4v/include/jbus.h b/sys/sun4v/include/jbus.h new file mode 100644 index 000000000000..502f7851e408 --- /dev/null +++ b/sys/sun4v/include/jbus.h @@ -0,0 +1,7 @@ +/*- + * This file is in the public domain. + * + * $FreeBSD$ + */ + +#include diff --git a/sys/sun4v/sun4v/bus_machdep.c b/sys/sun4v/sun4v/bus_machdep.c index 0c76feeaedf8..1282b0e79b9c 100644 --- a/sys/sun4v/sun4v/bus_machdep.c +++ b/sys/sun4v/sun4v/bus_machdep.c @@ -95,7 +95,7 @@ * from: @(#)machdep.c 8.6 (Berkeley) 1/14/94 * from: NetBSD: machdep.c,v 1.111 2001/09/15 07:13:40 eeh Exp * and - * from: FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.24 2001/08/15 + * from: FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.24 2001/08/15 */ #include @@ -129,8 +129,8 @@ __FBSDID("$FreeBSD$"); static void nexus_bus_barrier(bus_space_tag_t, bus_space_handle_t, bus_size_t, bus_size_t, int); -/* ASI's for bus access. */ -int bus_type_asi[] = { +/* ASIs for bus access */ +const int bus_type_asi[] = { ASI_REAL_IO, /* nexus */ ASI_REAL_IO, /* SBus */ ASI_REAL_IO_L, /* PCI configuration space */ @@ -139,7 +139,7 @@ int bus_type_asi[] = { 0 }; -int bus_stream_asi[] = { +const int bus_stream_asi[] = { ASI_REAL_IO, /* nexus */ ASI_REAL_IO, /* SBus */ ASI_REAL_IO, /* PCI configuration space */ @@ -249,7 +249,7 @@ bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, newtag->dt_segments = NULL; - /* Take into account any restrictions imposed by our parent tag */ + /* Take into account any restrictions imposed by our parent tag. */ if (parent != NULL) { newtag->dt_lowaddr = ulmin(parent->dt_lowaddr, newtag->dt_lowaddr); @@ -551,8 +551,7 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, struct uio *uio, if (uio->uio_segflg == UIO_USERSPACE) { td = uio->uio_td; - KASSERT(td != NULL, - ("nexus_dmamap_load_uio: USERSPACE but no proc")); + KASSERT(td != NULL, ("%s: USERSPACE but no proc", __func__)); } nsegs = 0; @@ -652,9 +651,9 @@ nexus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags, *vaddr = malloc(dmat->dt_maxsize, M_DEVBUF, mflags); } else { /* - * XXX: Use contigmalloc until it is merged into this facility - * and handles multi-seg allocations. Nobody is doing multi-seg - * allocations yet though. + * XXX use contigmalloc until it is merged into this + * facility and handles multi-seg allocations. Nobody + * is doing multi-seg allocations yet though. */ *vaddr = contigmalloc(dmat->dt_maxsize, M_DEVBUF, mflags, 0ul, dmat->dt_lowaddr, @@ -795,8 +794,8 @@ sparc64_bus_mem_unmap(void *bh, bus_size_t size) } /* - * Fake up a bus tag, for use by console drivers in early boot when the regular - * means to allocate resources are not yet available. + * Fake up a bus tag, for use by console drivers in early boot when the + * regular means to allocate resources are not yet available. * Addr is the physical address of the desired start of the handle. */ bus_space_handle_t diff --git a/sys/sun4v/sun4v/machdep.c b/sys/sun4v/sun4v/machdep.c index 5430460ccc7f..3913d35ca02a 100644 --- a/sys/sun4v/sun4v/machdep.c +++ b/sys/sun4v/sun4v/machdep.c @@ -667,11 +667,7 @@ sigreturn(struct thread *td, struct sigreturn_args *uap) if (error != 0) return (error); - PROC_LOCK(p); - td->td_sigmask = uc.uc_sigmask; - SIG_CANTMASK(td->td_sigmask); - signotify(td); - PROC_UNLOCK(p); + kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0); CTR4(KTR_SIG, "sigreturn: return td=%p pc=%#lx sp=%#lx tstate=%#lx", td, mc->mc_tpc, mc->mc_sp, mc->mc_tstate); diff --git a/sys/sun4v/sun4v/pmap.c b/sys/sun4v/sun4v/pmap.c index a754ce943e5d..d3b8c79467e8 100644 --- a/sys/sun4v/sun4v/pmap.c +++ b/sys/sun4v/sun4v/pmap.c @@ -424,6 +424,11 @@ pmap_activate(struct thread *td) critical_exit(); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. diff --git a/sys/sun4v/sun4v/stack_machdep.c b/sys/sun4v/sun4v/stack_machdep.c index e29ce88ef73b..6b91dc1d52f1 100644 --- a/sys/sun4v/sun4v/stack_machdep.c +++ b/sys/sun4v/sun4v/stack_machdep.c @@ -36,20 +36,28 @@ __FBSDID("$FreeBSD$"); #include #include -static void stack_capture(struct stack *st, struct frame *fp); +static void stack_capture(struct stack *st, struct frame *frame); static void -stack_capture(struct stack *st, struct frame *fp) +stack_capture(struct stack *st, struct frame *frame) { + struct frame *fp; vm_offset_t callpc; stack_zero(st); - while (1) { + fp = frame; + for (;;) { + if (!INKERNEL((vm_offset_t)fp) || + !ALIGNED_POINTER(fp, uint64_t)) + break; callpc = fp->fr_pc; if (!INKERNEL(callpc)) break; if (stack_put(st, callpc) == -1) break; + if (v9next_frame(fp) <= fp || + v9next_frame(fp) >= frame + KSTACK_PAGES * PAGE_SIZE) + break; fp = v9next_frame(fp); } } diff --git a/sys/sun4v/sun4v/trap.c b/sys/sun4v/sun4v/trap.c index ffa0e8ca633c..702fd5ce28fd 100644 --- a/sys/sun4v/sun4v/trap.c +++ b/sys/sun4v/sun4v/trap.c @@ -81,6 +81,7 @@ #include #include #include +#include #include #include #include @@ -459,7 +460,6 @@ trap_pfault(struct thread *td, struct trapframe *tf, int64_t type, uint64_t data vm_offset_t va; vm_prot_t prot; u_long ctx; - int flags; int rv; if (td == NULL) @@ -486,15 +486,13 @@ trap_pfault(struct thread *td, struct trapframe *tf, int64_t type, uint64_t data KASSERT(td->td_proc->p_vmspace != NULL, ("trap_pfault: vmspace NULL")); - if (type == T_DATA_PROTECTION) { + if (type == T_DATA_PROTECTION) prot = VM_PROT_WRITE; - flags = VM_FAULT_DIRTY; - } else { + else { if (type == T_DATA_MISS) prot = VM_PROT_READ; else prot = VM_PROT_READ | VM_PROT_EXECUTE; - flags = VM_FAULT_NORMAL; } if (ctx != TLB_CTX_KERNEL) { @@ -520,7 +518,7 @@ trap_pfault(struct thread *td, struct trapframe *tf, int64_t type, uint64_t data PROC_UNLOCK(p); /* Fault in the user page. */ - rv = vm_fault(&vm->vm_map, va, prot, flags); + rv = vm_fault(&vm->vm_map, va, prot, VM_FAULT_NORMAL); /* * Now the process can be swapped again. @@ -582,7 +580,6 @@ syscall(struct trapframe *tf) register_t *argp; struct proc *p; u_long code; - u_long tpc; int reg; int regcnt; int narg; @@ -606,7 +603,7 @@ syscall(struct trapframe *tf) * For syscalls, we don't want to retry the faulting instruction * (usually), instead we need to advance one instruction. */ - tpc = tf->tf_tpc; + td->td_pcb->pcb_tpc = tf->tf_tpc; TF_DONE(tf); reg = 0; @@ -673,40 +670,8 @@ syscall(struct trapframe *tf) error, syscallnames[code], td->td_retval[0], td->td_retval[1]); } - - /* - * MP SAFE (we may or may not have the MP lock at this point) - */ - switch (error) { - case 0: - tf->tf_out[0] = td->td_retval[0]; - tf->tf_out[1] = td->td_retval[1]; - tf->tf_tstate &= ~TSTATE_XCC_C; - break; - case ERESTART: - /* - * Undo the tpc advancement we have done above, we want to - * reexecute the system call. - */ - tf->tf_tpc = tpc; - tf->tf_tnpc -= 4; - break; - - case EJUSTRETURN: - break; - - default: - if (p->p_sysent->sv_errsize) { - if (error >= p->p_sysent->sv_errsize) - error = -1; /* XXX */ - else - error = p->p_sysent->sv_errtbl[error]; - } - tf->tf_out[0] = error; - tf->tf_tstate |= TSTATE_XCC_C; - break; - } + cpu_set_syscall_retval(td, error); /* * Handle reschedule and other end-of-syscall issues diff --git a/sys/sun4v/sun4v/vm_machdep.c b/sys/sun4v/sun4v/vm_machdep.c index 63a002f5e50d..5e02aec29d2f 100644 --- a/sys/sun4v/sun4v/vm_machdep.c +++ b/sys/sun4v/sun4v/vm_machdep.c @@ -57,6 +57,7 @@ #include #include #include +#include #include #include @@ -141,6 +142,42 @@ cpu_thread_swapout(struct thread *td) { } +void +cpu_set_syscall_retval(struct thread *td, int error) +{ + + switch (error) { + case 0: + td->td_frame->tf_out[0] = td->td_retval[0]; + td->td_frame->tf_out[1] = td->td_retval[1]; + td->td_frame->tf_tstate &= ~TSTATE_XCC_C; + break; + + case ERESTART: + /* + * Undo the tpc advancement we have done on syscall + * enter, we want to reexecute the system call. + */ + td->td_frame->tf_tpc = td->td_pcb->pcb_tpc; + td->td_frame->tf_tnpc -= 4; + break; + + case EJUSTRETURN: + break; + + default: + if (td->td_proc->p_sysent->sv_errsize) { + if (error >= td->td_proc->p_sysent->sv_errsize) + error = -1; /* XXX */ + else + error = td->td_proc->p_sysent->sv_errtbl[error]; + } + td->td_frame->tf_out[0] = error; + td->td_frame->tf_tstate |= TSTATE_XCC_C; + break; + } +} + void cpu_set_upcall(struct thread *td, struct thread *td0) { diff --git a/sys/sys/_lockmgr.h b/sys/sys/_lockmgr.h index 0b99e1a4cba5..0367ff1e7ba1 100644 --- a/sys/sys/_lockmgr.h +++ b/sys/sys/_lockmgr.h @@ -38,6 +38,7 @@ struct lock { struct lock_object lock_object; volatile uintptr_t lk_lock; + u_int lk_exslpfail; int lk_timo; int lk_pri; #ifdef DEBUG_LOCKS diff --git a/sys/sys/_semaphore.h b/sys/sys/_semaphore.h index df3c5da1bd65..5266d044ff89 100644 --- a/sys/sys/_semaphore.h +++ b/sys/sys/_semaphore.h @@ -31,27 +31,10 @@ typedef intptr_t semid_t; struct timespec; +#define SEM_VALUE_MAX __INT_MAX + #ifndef _KERNEL -#include - -/* - * Semaphore definitions. - */ -struct sem { -#define SEM_MAGIC ((u_int32_t) 0x09fa4012) - u_int32_t magic; - pthread_mutex_t lock; - pthread_cond_t gtzero; - u_int32_t count; - u_int32_t nwaiters; -#define SEM_USER (NULL) - semid_t semid; /* semaphore id if kernel (shared) semaphore */ - int syssem; /* 1 if kernel (shared) semaphore */ - LIST_ENTRY(sem) entry; - struct sem **backpointer; -}; - __BEGIN_DECLS int ksem_close(semid_t id); diff --git a/sys/sys/_termios.h b/sys/sys/_termios.h new file mode 100644 index 000000000000..3fb5bf4d441d --- /dev/null +++ b/sys/sys/_termios.h @@ -0,0 +1,222 @@ +/*- + * Copyright (c) 1988, 1989, 1993, 1994 + * 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. + * + * @(#)termios.h 8.3 (Berkeley) 3/28/94 + * $FreeBSD$ + */ + +#ifndef _SYS__TERMIOS_H_ +#define _SYS__TERMIOS_H_ + +/* + * Special Control Characters + * + * Index into c_cc[] character array. + * + * Name Subscript Enabled by + */ +#define VEOF 0 /* ICANON */ +#define VEOL 1 /* ICANON */ +#ifndef _POSIX_SOURCE +#define VEOL2 2 /* ICANON together with IEXTEN */ +#endif +#define VERASE 3 /* ICANON */ +#ifndef _POSIX_SOURCE +#define VWERASE 4 /* ICANON together with IEXTEN */ +#endif +#define VKILL 5 /* ICANON */ +#ifndef _POSIX_SOURCE +#define VREPRINT 6 /* ICANON together with IEXTEN */ +#define VERASE2 7 /* ICANON */ +#endif +/* 7 ex-spare 1 */ +#define VINTR 8 /* ISIG */ +#define VQUIT 9 /* ISIG */ +#define VSUSP 10 /* ISIG */ +#ifndef _POSIX_SOURCE +#define VDSUSP 11 /* ISIG together with IEXTEN */ +#endif +#define VSTART 12 /* IXON, IXOFF */ +#define VSTOP 13 /* IXON, IXOFF */ +#ifndef _POSIX_SOURCE +#define VLNEXT 14 /* IEXTEN */ +#define VDISCARD 15 /* IEXTEN */ +#endif +#define VMIN 16 /* !ICANON */ +#define VTIME 17 /* !ICANON */ +#ifndef _POSIX_SOURCE +#define VSTATUS 18 /* ICANON together with IEXTEN */ +/* 19 spare 2 */ +#endif +#define NCCS 20 + +#define _POSIX_VDISABLE 0xff + +/* + * Input flags - software input processing + */ +#define IGNBRK 0x00000001 /* ignore BREAK condition */ +#define BRKINT 0x00000002 /* map BREAK to SIGINTR */ +#define IGNPAR 0x00000004 /* ignore (discard) parity errors */ +#define PARMRK 0x00000008 /* mark parity and framing errors */ +#define INPCK 0x00000010 /* enable checking of parity errors */ +#define ISTRIP 0x00000020 /* strip 8th bit off chars */ +#define INLCR 0x00000040 /* map NL into CR */ +#define IGNCR 0x00000080 /* ignore CR */ +#define ICRNL 0x00000100 /* map CR to NL (ala CRMOD) */ +#define IXON 0x00000200 /* enable output flow control */ +#define IXOFF 0x00000400 /* enable input flow control */ +#ifndef _POSIX_SOURCE +#define IXANY 0x00000800 /* any char will restart after stop */ +#define IMAXBEL 0x00002000 /* ring bell on input queue full */ +#endif /*_POSIX_SOURCE */ + +/* + * Output flags - software output processing + */ +#define OPOST 0x00000001 /* enable following output processing */ +#ifndef _POSIX_SOURCE +#define ONLCR 0x00000002 /* map NL to CR-NL (ala CRMOD) */ +#define TABDLY 0x00000004 /* tab delay mask */ +#define TAB0 0x00000000 /* no tab delay and expansion */ +#define TAB3 0x00000004 /* expand tabs to spaces */ +#define ONOEOT 0x00000008 /* discard EOT's (^D) on output) */ +#define OCRNL 0x00000010 /* map CR to NL on output */ +#define ONOCR 0x00000020 /* no CR output at column 0 */ +#define ONLRET 0x00000040 /* NL performs CR function */ +#endif /*_POSIX_SOURCE */ + +/* + * Control flags - hardware control of terminal + */ +#ifndef _POSIX_SOURCE +#define CIGNORE 0x00000001 /* ignore control flags */ +#endif +#define CSIZE 0x00000300 /* character size mask */ +#define CS5 0x00000000 /* 5 bits (pseudo) */ +#define CS6 0x00000100 /* 6 bits */ +#define CS7 0x00000200 /* 7 bits */ +#define CS8 0x00000300 /* 8 bits */ +#define CSTOPB 0x00000400 /* send 2 stop bits */ +#define CREAD 0x00000800 /* enable receiver */ +#define PARENB 0x00001000 /* parity enable */ +#define PARODD 0x00002000 /* odd parity, else even */ +#define HUPCL 0x00004000 /* hang up on last close */ +#define CLOCAL 0x00008000 /* ignore modem status lines */ +#ifndef _POSIX_SOURCE +#define CCTS_OFLOW 0x00010000 /* CTS flow control of output */ +#define CRTSCTS (CCTS_OFLOW | CRTS_IFLOW) +#define CRTS_IFLOW 0x00020000 /* RTS flow control of input */ +#define CDTR_IFLOW 0x00040000 /* DTR flow control of input */ +#define CDSR_OFLOW 0x00080000 /* DSR flow control of output */ +#define CCAR_OFLOW 0x00100000 /* DCD flow control of output */ +#endif + + +/* + * "Local" flags - dumping ground for other state + * + * Warning: some flags in this structure begin with + * the letter "I" and look like they belong in the + * input flag. + */ + +#ifndef _POSIX_SOURCE +#define ECHOKE 0x00000001 /* visual erase for line kill */ +#endif /*_POSIX_SOURCE */ +#define ECHOE 0x00000002 /* visually erase chars */ +#define ECHOK 0x00000004 /* echo NL after line kill */ +#define ECHO 0x00000008 /* enable echoing */ +#define ECHONL 0x00000010 /* echo NL even if ECHO is off */ +#ifndef _POSIX_SOURCE +#define ECHOPRT 0x00000020 /* visual erase mode for hardcopy */ +#define ECHOCTL 0x00000040 /* echo control chars as ^(Char) */ +#endif /*_POSIX_SOURCE */ +#define ISIG 0x00000080 /* enable signals INTR, QUIT, [D]SUSP */ +#define ICANON 0x00000100 /* canonicalize input lines */ +#ifndef _POSIX_SOURCE +#define ALTWERASE 0x00000200 /* use alternate WERASE algorithm */ +#endif /*_POSIX_SOURCE */ +#define IEXTEN 0x00000400 /* enable DISCARD and LNEXT */ +#define EXTPROC 0x00000800 /* external processing */ +#define TOSTOP 0x00400000 /* stop background jobs from output */ +#ifndef _POSIX_SOURCE +#define FLUSHO 0x00800000 /* output being flushed (state) */ +#define NOKERNINFO 0x02000000 /* no kernel output from VSTATUS */ +#define PENDIN 0x20000000 /* XXX retype pending input (state) */ +#endif /*_POSIX_SOURCE */ +#define NOFLSH 0x80000000 /* don't flush after interrupt */ + +/* + * Standard speeds + */ +#define B0 0 +#define B50 50 +#define B75 75 +#define B110 110 +#define B134 134 +#define B150 150 +#define B200 200 +#define B300 300 +#define B600 600 +#define B1200 1200 +#define B1800 1800 +#define B2400 2400 +#define B4800 4800 +#define B9600 9600 +#define B19200 19200 +#define B38400 38400 +#ifndef _POSIX_SOURCE +#define B7200 7200 +#define B14400 14400 +#define B28800 28800 +#define B57600 57600 +#define B76800 76800 +#define B115200 115200 +#define B230400 230400 +#define B460800 460800 +#define B921600 921600 +#define EXTA 19200 +#define EXTB 38400 +#endif /* !_POSIX_SOURCE */ + +typedef unsigned int tcflag_t; +typedef unsigned char cc_t; +typedef unsigned int speed_t; + +struct termios { + tcflag_t c_iflag; /* input flags */ + tcflag_t c_oflag; /* output flags */ + tcflag_t c_cflag; /* control flags */ + tcflag_t c_lflag; /* local flags */ + cc_t c_cc[NCCS]; /* control chars */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; + +#endif /* !_SYS__TERMIOS_H_ */ diff --git a/sys/sys/_umtx.h b/sys/sys/_umtx.h new file mode 100644 index 000000000000..fcda9744c35e --- /dev/null +++ b/sys/sys/_umtx.h @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 2010, David Xu + * 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 unmodified, 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 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$ + * + */ + +#ifndef _SYS__UMTX_H_ +#define _SYS__UMTX_H_ + +#include + +struct umtx { + volatile unsigned long u_owner; /* Owner of the mutex. */ +}; + +struct umutex { + volatile __lwpid_t m_owner; /* Owner of the mutex */ + __uint32_t m_flags; /* Flags of the mutex */ + __uint32_t m_ceilings[2]; /* Priority protect ceiling */ + __uint32_t m_spare[4]; +}; + +struct ucond { + volatile __uint32_t c_has_waiters; /* Has waiters in kernel */ + __uint32_t c_flags; /* Flags of the condition variable */ + __uint32_t c_spare[2]; /* Spare space */ +}; + +struct urwlock { + volatile __int32_t rw_state; + __uint32_t rw_flags; + __uint32_t rw_blocked_readers; + __uint32_t rw_blocked_writers; + __uint32_t rw_spare[4]; +}; + +struct _usem { + volatile __uint32_t _has_waiters; + volatile __uint32_t _count; + __uint32_t _flags; +}; + +#endif /* !_SYS__UMTX_H_ */ diff --git a/sys/sys/aac_ioctl.h b/sys/sys/aac_ioctl.h index ef16a429e043..69af10e73a71 100644 --- a/sys/sys/aac_ioctl.h +++ b/sys/sys/aac_ioctl.h @@ -192,7 +192,10 @@ struct aac_query_disk { typedef union { struct { u_int32_t largeLBA : 1; /* disk support greater 2TB */ - u_int32_t fReserved : 31; + u_int32_t IoctlBuf : 1; /* ARCIOCTL call support */ + u_int32_t AIFSupport: 1; /* AIF support */ + u_int32_t JBODSupport:1; /* fw + driver support JBOD */ + u_int32_t fReserved : 28; } fBits; u_int32_t fValue; } featuresState; diff --git a/sys/sys/acl.h b/sys/sys/acl.h index 855e85c7ce64..80a3fe61637c 100644 --- a/sys/sys/acl.h +++ b/sys/sys/acl.h @@ -99,13 +99,13 @@ struct oldacl { * Current "struct acl". */ struct acl_entry { - acl_tag_t ae_tag; - uid_t ae_id; - acl_perm_t ae_perm; - /* "allow" or "deny". Unused in POSIX ACLs. */ + acl_tag_t ae_tag; + uid_t ae_id; + acl_perm_t ae_perm; + /* NFSv4 entry type, "allow" or "deny". Unused in POSIX.1e ACLs. */ acl_entry_type_t ae_entry_type; - /* Flags control inheritance. Unused in POSIX ACLs. */ - acl_flag_t ae_flags; + /* NFSv4 ACL inheritance. Unused in POSIX.1e ACLs. */ + acl_flag_t ae_flags; }; typedef struct acl_entry *acl_entry_t; diff --git a/sys/sys/apm.h b/sys/sys/apm.h index 5fbfa65bbb04..e1b0e85c9c2b 100644 --- a/sys/sys/apm.h +++ b/sys/sys/apm.h @@ -61,6 +61,8 @@ struct apm_ent { #define APM_ENT_TYPE_FREEBSD_VINUM "FreeBSD-Vinum" #define APM_ENT_TYPE_FREEBSD_ZFS "FreeBSD-ZFS" +#define APM_ENT_TYPE_APPLE_BOOT "Apple_Bootstrap" #define APM_ENT_TYPE_APPLE_HFS "Apple_HFS" +#define APM_ENT_TYPE_APPLE_UFS "Apple_UNIX_SVR2" #endif /* _SYS_APM_H_ */ diff --git a/sys/sys/ata.h b/sys/sys/ata.h index f98d4881b63a..cacb1ea02777 100644 --- a/sys/sys/ata.h +++ b/sys/sys/ata.h @@ -48,9 +48,10 @@ struct ata_params { #define ATA_DRQ_SLOW 0x0000 /* cpu 3 ms delay */ #define ATA_DRQ_INTR 0x0020 /* interrupt 10 ms delay */ #define ATA_DRQ_FAST 0x0040 /* accel 50 us delay */ +#define ATA_RESP_INCOMPLETE 0x0004 /*001*/ u_int16_t cylinders; /* # of cylinders */ - u_int16_t reserved2; +/*002*/ u_int16_t specconf; /* specific configuration */ /*003*/ u_int16_t heads; /* # heads */ u_int16_t obsolete4; u_int16_t obsolete5; @@ -67,6 +68,8 @@ struct ata_params { /*049*/ u_int16_t capabilities1; #define ATA_SUPPORT_DMA 0x0100 #define ATA_SUPPORT_LBA 0x0200 +#define ATA_SUPPORT_IORDY 0x0400 +#define ATA_SUPPORT_IORDYDIS 0x0800 #define ATA_SUPPORT_OVERLAP 0x4000 /*050*/ u_int16_t capabilities2; @@ -99,7 +102,9 @@ struct ata_params { /*066*/ u_int16_t mwdmarec; /* rec. M/W DMA time ns */ /*067*/ u_int16_t pioblind; /* min. PIO cycle w/o flow */ /*068*/ u_int16_t pioiordy; /* min. PIO cycle IORDY flow */ - u_int16_t reserved69; +/*069*/ u_int16_t support3; +#define ATA_SUPPORT_RZAT 0x0020 +#define ATA_SUPPORT_DRAT 0x4000 u_int16_t reserved70; /*071*/ u_int16_t rlsovlap; /* rel time (us) for overlap */ /*072*/ u_int16_t rlsservice; /* rel time (us) for service */ @@ -108,22 +113,31 @@ struct ata_params { /*075*/ u_int16_t queue; #define ATA_QUEUE_LEN(x) ((x) & 0x001f) - u_int16_t satacapabilities; +/*76*/ u_int16_t satacapabilities; #define ATA_SATA_GEN1 0x0002 #define ATA_SATA_GEN2 0x0004 +#define ATA_SATA_GEN3 0x0008 #define ATA_SUPPORT_NCQ 0x0100 #define ATA_SUPPORT_IFPWRMNGTRCV 0x0200 #define ATA_SUPPORT_PHYEVENTCNT 0x0400 #define ATA_SUPPORT_NCQ_UNLOAD 0x0800 #define ATA_SUPPORT_NCQ_PRIO 0x1000 +#define ATA_SUPPORT_HAPST 0x2000 +#define ATA_SUPPORT_DAPST 0x4000 +#define ATA_SUPPORT_READLOGDMAEXT 0x8000 - u_int16_t reserved77; - u_int16_t satasupport; +/*77*/ u_int16_t satacapabilities2; +#define ATA_SATA_CURR_GEN_MASK 0x0006 +#define ATA_SUPPORT_NCQ_STREAM 0x0010 +#define ATA_SUPPORT_NCQ_QMANAGEMENT 0x0020 +/*78*/ u_int16_t satasupport; #define ATA_SUPPORT_NONZERO 0x0002 #define ATA_SUPPORT_AUTOACTIVATE 0x0004 #define ATA_SUPPORT_IFPWRMNGT 0x0008 #define ATA_SUPPORT_INORDERDATA 0x0010 - u_int16_t sataenabled; +#define ATA_SUPPORT_SOFTSETPRESERVE 0x0040 +/*79*/ u_int16_t sataenabled; +#define ATA_ENABLED_DAPST 0x0080 /*080*/ u_int16_t version_major; /*081*/ u_int16_t version_minor; @@ -161,8 +175,8 @@ struct ata_params { #define ATA_SUPPORT_FLUSHCACHE48 0x2000 /*084/087*/ u_int16_t extension; -#define ATA_SUPPORT_SMARTTEST 0x0001 -#define ATA_SUPPORT_SMARTLOG 0x0002 +#define ATA_SUPPORT_SMARTLOG 0x0001 +#define ATA_SUPPORT_SMARTTEST 0x0002 #define ATA_SUPPORT_MEDIASN 0x0004 #define ATA_SUPPORT_MEDIAPASS 0x0008 #define ATA_SUPPORT_STREAMING 0x0010 @@ -170,6 +184,7 @@ struct ata_params { #define ATA_SUPPORT_WRITEDMAFUAEXT 0x0040 #define ATA_SUPPORT_WRITEDMAQFUAEXT 0x0080 #define ATA_SUPPORT_64BITWWN 0x0100 +#define ATA_SUPPORT_UNLOAD 0x2000 } __packed support, enabled; /*088*/ u_int16_t udmamodes; /* UltraDMA modes */ @@ -192,14 +207,56 @@ struct ata_params { u_int16_t lba_size48_2; u_int16_t lba_size48_3; u_int16_t lba_size48_4; - u_int16_t reserved104[23]; + u_int16_t reserved104; +/*105*/ u_int16_t max_dsm_blocks; +/*106*/ u_int16_t pss; +#define ATA_PSS_LSPPS 0x000F +#define ATA_PSS_LSSABOVE512 0x1000 +#define ATA_PSS_MULTLS 0x2000 +/*107*/ u_int16_t isd; +/*108*/ u_int16_t wwn[4]; + u_int16_t reserved112[5]; +/*117*/ u_int16_t lss_1; +/*118*/ u_int16_t lss_2; +/*119*/ u_int16_t support2; +#define ATA_SUPPORT_WRITEREADVERIFY 0x0002 +#define ATA_SUPPORT_WRITEUNCORREXT 0x0004 +#define ATA_SUPPORT_RWLOGDMAEXT 0x0008 +#define ATA_SUPPORT_MICROCODE3 0x0010 +#define ATA_SUPPORT_FREEFALL 0x0020 +/*120*/ u_int16_t enabled2; + u_int16_t reserved121[6]; /*127*/ u_int16_t removable_status; /*128*/ u_int16_t security_status; u_int16_t reserved129[31]; /*160*/ u_int16_t cfa_powermode1; - u_int16_t reserved161[15]; -/*176*/ u_int16_t media_serial[30]; - u_int16_t reserved206[49]; + u_int16_t reserved161; +/*162*/ u_int16_t cfa_kms_support; +/*163*/ u_int16_t cfa_trueide_modes; +/*164*/ u_int16_t cfa_memory_modes; + u_int16_t reserved165[4]; +/*169*/ u_int16_t support_dsm; +#define ATA_SUPPORT_DSM_TRIM 0x0001 + u_int16_t reserved170[6]; +/*176*/ u_int8_t media_serial[60]; +/*206*/ u_int16_t sct; + u_int16_t reserved206[2]; +/*209*/ u_int16_t lsalign; +/*210*/ u_int16_t wrv_sectors_m3_1; + u_int16_t wrv_sectors_m3_2; +/*212*/ u_int16_t wrv_sectors_m2_1; + u_int16_t wrv_sectors_m2_2; +/*214*/ u_int16_t nv_cache_caps; +/*215*/ u_int16_t nv_cache_size_1; + u_int16_t nv_cache_size_2; +/*217*/ u_int16_t media_rotation_rate; + u_int16_t reserved218; +/*219*/ u_int16_t nv_cache_opt; +/*220*/ u_int16_t wrv_mode; + u_int16_t reserved221; +/*222*/ u_int16_t transport_major; +/*223*/ u_int16_t transport_minor; + u_int16_t reserved224[31]; /*255*/ u_int16_t integrity; } __packed; @@ -228,15 +285,14 @@ struct ata_params { #define ATA_SA150 0x47 #define ATA_SA300 0x48 #define ATA_DMA_MAX 0x4f -#define ATA_USB 0x80 -#define ATA_USB1 0x81 -#define ATA_USB2 0x82 /* ATA commands */ #define ATA_NOP 0x00 /* NOP */ #define ATA_NF_FLUSHQUEUE 0x00 /* flush queued cmd's */ #define ATA_NF_AUTOPOLL 0x01 /* start autopoll function */ +#define ATA_DATA_SET_MANAGEMENT 0x06 +#define ATA_DSM_TRIM 0x01 #define ATA_DEVICE_RESET 0x08 /* reset device */ #define ATA_READ 0x20 /* read */ #define ATA_READ48 0x24 /* read 48bit LBA */ @@ -244,12 +300,21 @@ struct ata_params { #define ATA_READ_DMA_QUEUED48 0x26 /* read DMA QUEUED 48bit LBA */ #define ATA_READ_NATIVE_MAX_ADDRESS48 0x27 /* read native max addr 48bit */ #define ATA_READ_MUL48 0x29 /* read multi 48bit LBA */ +#define ATA_READ_STREAM_DMA48 0x2a /* read DMA stream 48bit LBA */ +#define ATA_READ_STREAM48 0x2b /* read stream 48bit LBA */ #define ATA_WRITE 0x30 /* write */ #define ATA_WRITE48 0x34 /* write 48bit LBA */ #define ATA_WRITE_DMA48 0x35 /* write DMA 48bit LBA */ #define ATA_WRITE_DMA_QUEUED48 0x36 /* write DMA QUEUED 48bit LBA*/ #define ATA_SET_MAX_ADDRESS48 0x37 /* set max address 48bit */ #define ATA_WRITE_MUL48 0x39 /* write multi 48bit LBA */ +#define ATA_WRITE_STREAM_DMA48 0x3a +#define ATA_WRITE_STREAM48 0x3b +#define ATA_WRITE_DMA_FUA48 0x3d +#define ATA_WRITE_DMA_QUEUED_FUA48 0x3e +#define ATA_WRITE_LOG_EXT 0x3f +#define ATA_READ_VERIFY 0x40 +#define ATA_READ_VERIFY48 0x42 #define ATA_READ_FPDMA_QUEUED 0x60 /* read DMA NCQ */ #define ATA_WRITE_FPDMA_QUEUED 0x61 /* write DMA NCQ */ #define ATA_SEEK 0x70 /* seek */ @@ -265,6 +330,7 @@ struct ata_params { #define ATA_READ_DMA 0xc8 /* read DMA */ #define ATA_WRITE_DMA 0xca /* write DMA */ #define ATA_WRITE_DMA_QUEUED 0xcc /* write DMA QUEUED */ +#define ATA_WRITE_MUL_FUA48 0xce #define ATA_STANDBY_IMMEDIATE 0xe0 /* standby immediate */ #define ATA_IDLE_IMMEDIATE 0xe1 /* idle immediate */ #define ATA_STANDBY_CMD 0xe2 /* standby */ @@ -280,6 +346,9 @@ struct ata_params { #define ATA_SF_SETXFER 0x03 /* set transfer mode */ #define ATA_SF_ENAB_WCACHE 0x02 /* enable write cache */ #define ATA_SF_DIS_WCACHE 0x82 /* disable write cache */ +#define ATA_SF_ENAB_PUIS 0x06 /* enable PUIS */ +#define ATA_SF_DIS_PUIS 0x86 /* disable PUIS */ +#define ATA_SF_PUIS_SPINUP 0x07 /* PUIS spin-up */ #define ATA_SF_ENAB_RCACHE 0xaa /* enable readahead cache */ #define ATA_SF_DIS_RCACHE 0x55 /* disable readahead cache */ #define ATA_SF_ENAB_RELIRQ 0x5d /* enable release interrupt */ diff --git a/sys/sys/bio.h b/sys/sys/bio.h index 5af902bdae6e..8b6ff0ec696a 100644 --- a/sys/sys/bio.h +++ b/sys/sys/bio.h @@ -40,6 +40,22 @@ #include +/* bio_cmd */ +#define BIO_READ 0x01 +#define BIO_WRITE 0x02 +#define BIO_DELETE 0x04 +#define BIO_GETATTR 0x08 +#define BIO_FLUSH 0x10 +#define BIO_CMD0 0x20 /* Available for local hacks */ +#define BIO_CMD1 0x40 /* Available for local hacks */ +#define BIO_CMD2 0x80 /* Available for local hacks */ + +/* bio_flags */ +#define BIO_ERROR 0x01 +#define BIO_DONE 0x02 +#define BIO_ONQUEUE 0x04 + +#ifdef _KERNEL struct disk; struct bio; @@ -95,23 +111,6 @@ struct bio { daddr_t bio_pblkno; /* physical block number */ }; -/* bio_cmd */ -#define BIO_READ 0x01 -#define BIO_WRITE 0x02 -#define BIO_DELETE 0x04 -#define BIO_GETATTR 0x08 -#define BIO_FLUSH 0x10 -#define BIO_CMD0 0x20 /* Available for local hacks */ -#define BIO_CMD1 0x40 /* Available for local hacks */ -#define BIO_CMD2 0x80 /* Available for local hacks */ - -/* bio_flags */ -#define BIO_ERROR 0x01 -#define BIO_DONE 0x02 -#define BIO_ONQUEUE 0x04 - -#ifdef _KERNEL - struct uio; struct devstat; diff --git a/sys/sys/bus.h b/sys/sys/bus.h index 794dc47a8f13..402d3cca8623 100644 --- a/sys/sys/bus.h +++ b/sys/sys/bus.h @@ -231,6 +231,7 @@ struct resource_list_entry { STAILQ_ENTRY(resource_list_entry) link; int type; /**< @brief type argument to alloc_resource */ int rid; /**< @brief resource identifier */ + int flags; /**< @brief resource flags */ struct resource *res; /**< @brief the real resource when allocated */ u_long start; /**< @brief start of resource range */ u_long end; /**< @brief end of resource range */ @@ -238,6 +239,9 @@ struct resource_list_entry { }; STAILQ_HEAD(resource_list, resource_list_entry); +#define RLE_RESERVED 0x0001 /* Reserved by the parent bus. */ +#define RLE_ALLOCATED 0x0002 /* Reserved resource is allocated. */ + void resource_list_init(struct resource_list *rl); void resource_list_free(struct resource_list *rl); struct resource_list_entry * @@ -247,6 +251,8 @@ struct resource_list_entry * int resource_list_add_next(struct resource_list *rl, int type, u_long start, u_long end, u_long count); +int resource_list_busy(struct resource_list *rl, + int type, int rid); struct resource_list_entry* resource_list_find(struct resource_list *rl, int type, int rid); @@ -261,6 +267,15 @@ struct resource * int resource_list_release(struct resource_list *rl, device_t bus, device_t child, int type, int rid, struct resource *res); +struct resource * + resource_list_reserve(struct resource_list *rl, + device_t bus, device_t child, + int type, int *rid, + u_long start, u_long end, + u_long count, u_int flags); +int resource_list_unreserve(struct resource_list *rl, + device_t bus, device_t child, + int type, int rid); void resource_list_purge(struct resource_list *rl); int resource_list_print_type(struct resource_list *rl, const char *name, int type, @@ -292,6 +307,9 @@ int bus_generic_bind_intr(device_t dev, device_t child, int bus_generic_child_present(device_t dev, device_t child); int bus_generic_config_intr(device_t, int, enum intr_trigger, enum intr_polarity); +int bus_generic_describe_intr(device_t dev, device_t child, + struct resource *irq, void *cookie, + const char *descr); int bus_generic_deactivate_resource(device_t dev, device_t child, int type, int rid, struct resource *r); int bus_generic_detach(device_t dev); @@ -344,8 +362,10 @@ struct resource_spec { int flags; }; -int bus_alloc_resources(device_t dev, struct resource_spec *rs, struct resource **res); -void bus_release_resources(device_t dev, const struct resource_spec *rs, struct resource **res); +int bus_alloc_resources(device_t dev, struct resource_spec *rs, + struct resource **res); +void bus_release_resources(device_t dev, const struct resource_spec *rs, + struct resource **res); struct resource *bus_alloc_resource(device_t dev, int type, int *rid, u_long start, u_long end, u_long count, @@ -363,6 +383,8 @@ int bus_setup_intr(device_t dev, struct resource *r, int flags, void *arg, void **cookiep); int bus_teardown_intr(device_t dev, struct resource *r, void *cookie); int bus_bind_intr(device_t dev, struct resource *r, int cpu); +int bus_describe_intr(device_t dev, struct resource *irq, void *cookie, + const char *fmt, ...); int bus_set_resource(device_t dev, int type, int rid, u_long start, u_long count); int bus_get_resource(device_t dev, int type, int rid, diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h index 44bed25ecca1..5d413d3710f1 100644 --- a/sys/sys/cdefs.h +++ b/sys/sys/cdefs.h @@ -234,12 +234,6 @@ #define __always_inline #endif -#if __GNUC_PREREQ__(4, 2) /* actually 4.1.3 */ -#define __gnu89_inline __attribute__((__gnu_inline__)) __inline -#else -#define __gnu89_inline -#endif - #if __GNUC_PREREQ__(3, 1) #define __noinline __attribute__ ((__noinline__)) #else diff --git a/sys/sys/conf.h b/sys/sys/conf.h index 3df4284fa92e..a18d6996a6c2 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -135,9 +135,7 @@ typedef int d_read_t(struct cdev *dev, struct uio *uio, int ioflag); typedef int d_write_t(struct cdev *dev, struct uio *uio, int ioflag); typedef int d_poll_t(struct cdev *dev, int events, struct thread *td); typedef int d_kqfilter_t(struct cdev *dev, struct knote *kn); -typedef int d_mmap_t(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, - int nprot); -typedef int d_mmap2_t(struct cdev *dev, vm_offset_t offset, vm_paddr_t *paddr, +typedef int d_mmap_t(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr); typedef int d_mmap_single_t(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size, struct vm_object **object, int nprot); @@ -172,7 +170,6 @@ typedef int dumper_t( #define D_PSEUDO 0x00200000 /* make_dev() can return NULL */ #define D_NEEDGIANT 0x00400000 /* driver want Giant */ #define D_NEEDMINOR 0x00800000 /* driver uses clone_create() */ -#define D_MMAP2 0x01000000 /* driver uses d_mmap2() */ /* * Version numbers. @@ -180,7 +177,8 @@ typedef int dumper_t( #define D_VERSION_00 0x20011966 #define D_VERSION_01 0x17032005 /* Add d_uid,gid,mode & kind */ #define D_VERSION_02 0x28042009 /* Add d_mmap_single */ -#define D_VERSION D_VERSION_02 +#define D_VERSION_03 0x17122009 /* d_mmap takes memattr,vm_ooffset_t */ +#define D_VERSION D_VERSION_03 /* * Flags used for internal housekeeping @@ -201,31 +199,24 @@ struct cdevsw { d_write_t *d_write; d_ioctl_t *d_ioctl; d_poll_t *d_poll; - union { - d_mmap_t *old; - d_mmap2_t *new; - } __d_mmap; + d_mmap_t *d_mmap; d_strategy_t *d_strategy; dumper_t *d_dump; d_kqfilter_t *d_kqfilter; d_purge_t *d_purge; d_mmap_single_t *d_mmap_single; - uid_t d_uid; - gid_t d_gid; - mode_t d_mode; - const char *d_kind; + + int32_t d_spare0[3]; + void *d_spare1[3]; /* These fields should not be messed with by drivers */ - LIST_ENTRY(cdevsw) d_list; LIST_HEAD(, cdev) d_devs; - int d_spare3; + int d_spare2; union { struct cdevsw *gianttrick; SLIST_ENTRY(cdevsw) postfree_list; } __d_giant; }; -#define d_mmap __d_mmap.old -#define d_mmap2 __d_mmap.new #define d_gianttrick __d_giant.gianttrick #define d_postfree_list __d_giant.postfree_list diff --git a/sys/sys/copyright.h b/sys/sys/copyright.h index 1b0b96a5b984..62a4ac9d920c 100644 --- a/sys/sys/copyright.h +++ b/sys/sys/copyright.h @@ -1,5 +1,5 @@ /*- - * Copyright (C) 1992-2009 The FreeBSD Project. All rights reserved. + * Copyright (C) 1992-2010 The FreeBSD Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ /* FreeBSD */ #define COPYRIGHT_FreeBSD \ - "Copyright (c) 1992-2009 The FreeBSD Project.\n" + "Copyright (c) 1992-2010 The FreeBSD Project.\n" /* Foundation */ #define TRADEMARK_Foundation \ diff --git a/sys/sys/disk.h b/sys/sys/disk.h index 4fe2e09c22f4..422229ef69c8 100644 --- a/sys/sys/disk.h +++ b/sys/sys/disk.h @@ -104,4 +104,16 @@ void disk_err(struct bio *bp, const char *what, int blkdone, int nl); * must be at least MAXPATHLEN bytes long. */ +#define DIOCGSTRIPESIZE _IOR('d', 139, off_t) /* Get stripe size in bytes */ + /*- + * Get the size of the device's optimal access block in bytes. + * This should be a multiple of the sectorsize. + */ + +#define DIOCGSTRIPEOFFSET _IOR('d', 140, off_t) /* Get stripe offset in bytes */ + /*- + * Get the offset of the first device's optimal access block in bytes. + * This should be a multiple of the sectorsize. + */ + #endif /* _SYS_DISK_H_ */ diff --git a/sys/sys/elf_common.h b/sys/sys/elf_common.h index f642c710c8ca..39f6d347b7ac 100644 --- a/sys/sys/elf_common.h +++ b/sys/sys/elf_common.h @@ -471,6 +471,7 @@ typedef struct { #define DF_1_BIND_NOW 0x00000001 /* Same as DF_BIND_NOW */ #define DF_1_GLOBAL 0x00000002 /* Set the RTLD_GLOBAL for object */ #define DF_1_NODELETE 0x00000008 /* Set the RTLD_NODELETE for object */ +#define DF_1_NOOPEN 0x00000040 /* Do not allow loading on dlopen() */ #define DF_1_ORIGIN 0x00000080 /* Process $ORIGIN */ /* Values for n_type. Used in core files. */ diff --git a/sys/sys/errno.h b/sys/sys/errno.h index 77b5f67a1734..1fceb007c18a 100644 --- a/sys/sys/errno.h +++ b/sys/sys/errno.h @@ -174,7 +174,11 @@ __END_DECLS #define EPROTO 92 /* Protocol error */ #ifndef _POSIX_SOURCE -#define ELAST 92 /* Must be equal largest errno */ +#define ENOTCAPABLE 93 /* Capabilities insufficient */ +#endif /* _POSIX_SOURCE */ + +#ifndef _POSIX_SOURCE +#define ELAST 93 /* Must be equal largest errno */ #endif /* _POSIX_SOURCE */ #ifdef _KERNEL diff --git a/sys/sys/event.h b/sys/sys/event.h index 4365e44e58d4..d92eb55d43d2 100644 --- a/sys/sys/event.h +++ b/sys/sys/event.h @@ -38,7 +38,7 @@ #define EVFILT_PROC (-5) /* attached to struct proc */ #define EVFILT_SIGNAL (-6) /* attached to struct proc */ #define EVFILT_TIMER (-7) /* timers */ -#define EVFILT_NETDEV (-8) /* network devices */ +/* EVFILT_NETDEV (-8) no longer supported */ #define EVFILT_FS (-9) /* filesystem events */ #define EVFILT_LIO (-10) /* attached to lio requests */ #define EVFILT_USER (-11) /* User events */ @@ -131,13 +131,6 @@ struct kevent { #define NOTE_TRACKERR 0x00000002 /* could not track child */ #define NOTE_CHILD 0x00000004 /* am a child process */ -/* - * data/hint flags for EVFILT_NETDEV, shared with userspace - */ -#define NOTE_LINKUP 0x0001 /* link is up */ -#define NOTE_LINKDOWN 0x0002 /* link is down */ -#define NOTE_LINKINV 0x0004 /* link state is invalid */ - struct knote; SLIST_HEAD(klist, knote); struct kqueue; diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h index 1f26d48f6581..6715efc7b2b9 100644 --- a/sys/sys/eventhandler.h +++ b/sys/sys/eventhandler.h @@ -211,7 +211,20 @@ EVENTHANDLER_DECLARE(process_exit, exitlist_fn); EVENTHANDLER_DECLARE(process_fork, forklist_fn); EVENTHANDLER_DECLARE(process_exec, execlist_fn); +/* + * application dump event + */ struct thread; +typedef void (*app_coredump_start_fn)(void *, struct thread *, char *name); +typedef void (*app_coredump_progress_fn)(void *, struct thread *td, int byte_count); +typedef void (*app_coredump_finish_fn)(void *, struct thread *td); +typedef void (*app_coredump_error_fn)(void *, struct thread *td, char *msg, ...); + +EVENTHANDLER_DECLARE(app_coredump_start, app_coredump_start_fn); +EVENTHANDLER_DECLARE(app_coredump_progress, app_coredump_progress_fn); +EVENTHANDLER_DECLARE(app_coredump_finish, app_coredump_finish_fn); +EVENTHANDLER_DECLARE(app_coredump_error, app_coredump_error_fn); + typedef void (*thread_ctor_fn)(void *, struct thread *); typedef void (*thread_dtor_fn)(void *, struct thread *); typedef void (*thread_fini_fn)(void *, struct thread *); diff --git a/sys/sys/fbio.h b/sys/sys/fbio.h index c7183dfc38c0..5745182316bc 100644 --- a/sys/sys/fbio.h +++ b/sys/sys/fbio.h @@ -269,6 +269,7 @@ struct video_info { #define V_INFO_GRAPHICS (1 << 1) #define V_INFO_LINEAR (1 << 2) #define V_INFO_VESA (1 << 3) +#define V_INFO_NONVGA (1 << 4) int vi_width; int vi_height; int vi_cwidth; @@ -331,6 +332,7 @@ struct video_adapter { #define V_ADP_INITIALIZED (1 << 17) #define V_ADP_REGISTERED (1 << 18) #define V_ADP_ATTACHED (1 << 19) +#define V_ADP_DAC8 (1 << 20) vm_offset_t va_io_base; int va_io_size; vm_offset_t va_crtc_addr; diff --git a/sys/sys/fcntl.h b/sys/sys/fcntl.h index 893bbcd677c0..ef394a3fe660 100644 --- a/sys/sys/fcntl.h +++ b/sys/sys/fcntl.h @@ -140,7 +140,7 @@ typedef __pid_t pid_t; /* bits to save after open */ #define FMASK (FREAD|FWRITE|FAPPEND|FASYNC|FFSYNC|FNONBLOCK|O_DIRECT|FEXEC) /* bits settable by fcntl(F_SETFL, ...) */ -#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|O_DIRECT) +#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FRDAHEAD|O_DIRECT) #if defined(COMPAT_FREEBSD7) || defined(COMPAT_FREEBSD6) || \ defined(COMPAT_FREEBSD5) || defined(COMPAT_FREEBSD4) @@ -151,7 +151,8 @@ typedef __pid_t pid_t; */ #define FPOSIXSHM O_NOFOLLOW #undef FCNTLFLAGS -#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FPOSIXSHM|O_DIRECT) +#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FPOSIXSHM|FRDAHEAD| \ + O_DIRECT) #endif #endif @@ -176,6 +177,8 @@ typedef __pid_t pid_t; * different meaning for fcntl(2). */ #if __BSD_VISIBLE +/* Read ahead */ +#define FRDAHEAD O_CREAT #endif /* Defined by POSIX Extended API Set Part 2 */ @@ -218,6 +221,8 @@ typedef __pid_t pid_t; #define F_SETLK 12 /* set record locking information */ #define F_SETLKW 13 /* F_SETLK; wait if blocked */ #define F_SETLK_REMOTE 14 /* debugging support for remote locks */ +#define F_READAHEAD 15 /* read ahead */ +#define F_RDAHEAD 16 /* Darwin compatible read ahead */ /* file descriptor flags (F_GETFD, F_SETFD) */ #define FD_CLOEXEC 1 /* close-on-exec flag */ diff --git a/sys/sys/file.h b/sys/sys/file.h index 5c58e8251cea..8ad30a5aee73 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -216,87 +216,62 @@ static __inline fo_stat_t fo_stat; static __inline fo_close_t fo_close; static __inline int -fo_read(fp, uio, active_cred, flags, td) - struct file *fp; - struct uio *uio; - struct ucred *active_cred; - int flags; - struct thread *td; +fo_read(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td) { return ((*fp->f_ops->fo_read)(fp, uio, active_cred, flags, td)); } static __inline int -fo_write(fp, uio, active_cred, flags, td) - struct file *fp; - struct uio *uio; - struct ucred *active_cred; - int flags; - struct thread *td; +fo_write(struct file *fp, struct uio *uio, struct ucred *active_cred, + int flags, struct thread *td) { return ((*fp->f_ops->fo_write)(fp, uio, active_cred, flags, td)); } static __inline int -fo_truncate(fp, length, active_cred, td) - struct file *fp; - off_t length; - struct ucred *active_cred; - struct thread *td; +fo_truncate(struct file *fp, off_t length, struct ucred *active_cred, + struct thread *td) { return ((*fp->f_ops->fo_truncate)(fp, length, active_cred, td)); } static __inline int -fo_ioctl(fp, com, data, active_cred, td) - struct file *fp; - u_long com; - void *data; - struct ucred *active_cred; - struct thread *td; +fo_ioctl(struct file *fp, u_long com, void *data, struct ucred *active_cred, + struct thread *td) { return ((*fp->f_ops->fo_ioctl)(fp, com, data, active_cred, td)); } static __inline int -fo_poll(fp, events, active_cred, td) - struct file *fp; - int events; - struct ucred *active_cred; - struct thread *td; +fo_poll(struct file *fp, int events, struct ucred *active_cred, + struct thread *td) { return ((*fp->f_ops->fo_poll)(fp, events, active_cred, td)); } static __inline int -fo_stat(fp, sb, active_cred, td) - struct file *fp; - struct stat *sb; - struct ucred *active_cred; - struct thread *td; +fo_stat(struct file *fp, struct stat *sb, struct ucred *active_cred, + struct thread *td) { return ((*fp->f_ops->fo_stat)(fp, sb, active_cred, td)); } static __inline int -fo_close(fp, td) - struct file *fp; - struct thread *td; +fo_close(struct file *fp, struct thread *td) { return ((*fp->f_ops->fo_close)(fp, td)); } static __inline int -fo_kqfilter(fp, kn) - struct file *fp; - struct knote *kn; +fo_kqfilter(struct file *fp, struct knote *kn) { return ((*fp->f_ops->fo_kqfilter)(fp, kn)); diff --git a/sys/sys/gpt.h b/sys/sys/gpt.h index 1e6c595341d6..a3e39f23d7fb 100644 --- a/sys/sys/gpt.h +++ b/sys/sys/gpt.h @@ -117,6 +117,8 @@ struct gpt_ent { #define GPT_ENT_TYPE_LINUX_LVM \ {0xe6d6d379,0xf507,0x44c2,0xa2,0x3c,{0x23,0x8f,0x2a,0x3d,0xf9,0x28}} +#define GPT_ENT_TYPE_APPLE_BOOT \ + {0x426F6F74,0x0000,0x11aa,0xaa,0x11,{0x00,0x30,0x65,0x43,0xec,0xac}} #define GPT_ENT_TYPE_APPLE_HFS \ {0x48465300,0x0000,0x11aa,0xaa,0x11,{0x00,0x30,0x65,0x43,0xec,0xac}} #define GPT_ENT_TYPE_APPLE_UFS \ @@ -127,6 +129,10 @@ struct gpt_ent { {0x52414944,0x0000,0x11aa,0xaa,0x22,{0x00,0x30,0x65,0x43,0xec,0xac}} #define GPT_ENT_TYPE_APPLE_RAID_OFFLINE \ {0x52414944,0x5f4f,0x11aa,0xaa,0x22,{0x00,0x30,0x65,0x43,0xec,0xac}} +#define GPT_ENT_TYPE_APPLE_LABEL \ + {0x4C616265,0x6c00,0x11aa,0xaa,0x11,{0x00,0x30,0x65,0x43,0xec,0xac}} +#define GPT_ENT_TYPE_APPLE_TV_RECOVERY \ + {0x5265636f,0x7665,0x11AA,0xaa,0x11,{0x00,0x30,0x65,0x43,0xec,0xac}} #define GPT_ENT_TYPE_NETBSD_FFS \ {0x49f48d5a,0xb10e,0x11dc,0xb9,0x9b,{0x00,0x19,0xd1,0x87,0x96,0x48}} diff --git a/sys/sys/imgact.h b/sys/sys/imgact.h index e6acc00404f9..79b389ebe381 100644 --- a/sys/sys/imgact.h +++ b/sys/sys/imgact.h @@ -75,6 +75,8 @@ struct image_params { struct sysentvec; struct thread; +#define IMGACT_CORE_COMPRESS 0x01 + int exec_check_permissions(struct image_params *); register_t *exec_copyout_strings(struct image_params *); int exec_new_vmspace(struct image_params *, struct sysentvec *); diff --git a/sys/sys/imgact_aout.h b/sys/sys/imgact_aout.h index c386c1be9b63..ca67cab6584f 100644 --- a/sys/sys/imgact_aout.h +++ b/sys/sys/imgact_aout.h @@ -150,7 +150,8 @@ struct exec { struct thread; struct vnode; -int aout_coredump(struct thread *td, struct vnode *vp, off_t limit); +int aout_coredump(struct thread *td, struct vnode *vp, off_t limit, + int flags); #endif #endif /* !_IMGACT_AOUT_H_ */ diff --git a/sys/sys/imgact_elf.h b/sys/sys/imgact_elf.h index 4ccee5df082b..1cc2a6166f2b 100644 --- a/sys/sys/imgact_elf.h +++ b/sys/sys/imgact_elf.h @@ -88,7 +88,7 @@ int __elfN(brand_inuse)(Elf_Brandinfo *entry); int __elfN(insert_brand_entry)(Elf_Brandinfo *entry); int __elfN(remove_brand_entry)(Elf_Brandinfo *entry); int __elfN(freebsd_fixup)(register_t **, struct image_params *); -int __elfN(coredump)(struct thread *, struct vnode *, off_t); +int __elfN(coredump)(struct thread *, struct vnode *, off_t, int); /* Machine specific function to dump per-thread information. */ void __elfN(dump_thread)(struct thread *, void *, size_t *); diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h index 92c0f03bfcd9..c1df1c764a7c 100644 --- a/sys/sys/interrupt.h +++ b/sys/sys/interrupt.h @@ -47,7 +47,7 @@ struct intr_handler { driver_intr_t *ih_handler; /* Threaded handler function. */ void *ih_argument; /* Argument to pass to handlers. */ int ih_flags; - const char *ih_name; /* Name of handler. */ + char ih_name[MAXCOMLEN + 1]; /* Name of handler. */ struct intr_event *ih_event; /* Event we are connected to. */ int ih_need; /* Needs service. */ TAILQ_ENTRY(intr_handler) ih_next; /* Next handler for this event. */ @@ -104,8 +104,8 @@ struct intr_handler { struct intr_event { TAILQ_ENTRY(intr_event) ie_list; TAILQ_HEAD(, intr_handler) ie_handlers; /* Interrupt handlers. */ - char ie_name[MAXCOMLEN]; /* Individual event name. */ - char ie_fullname[MAXCOMLEN]; + char ie_name[MAXCOMLEN + 1]; /* Individual event name. */ + char ie_fullname[MAXCOMLEN + 1]; struct mtx ie_lock; void *ie_source; /* Cookie used by MD code. */ struct intr_thread *ie_thread; /* Thread we are connected to. */ @@ -168,6 +168,8 @@ int intr_event_create(struct intr_event **event, void *source, void (*post_ithread)(void *), void (*post_filter)(void *), int (*assign_cpu)(void *, u_char), const char *fmt, ...) __printflike(9, 10); +int intr_event_describe_handler(struct intr_event *ie, void *cookie, + const char *descr); int intr_event_destroy(struct intr_event *ie); void intr_event_execute_handlers(struct proc *p, struct intr_event *ie); int intr_event_handle(struct intr_event *ie, struct trapframe *frame); diff --git a/sys/sys/jail.h b/sys/sys/jail.h index cb26a64ec7d2..d7a0622f3cd1 100644 --- a/sys/sys/jail.h +++ b/sys/sys/jail.h @@ -191,6 +191,10 @@ struct prison { #define PR_VNET 0x00000010 /* Virtual network stack */ #define PR_IP4_DISABLE 0x00000020 /* Disable IPv4 */ #define PR_IP6_DISABLE 0x00000040 /* Disable IPv6 */ +#define PR_IP4_SADDRSEL 0x00000080 /* Do IPv4 src addr sel. or use the */ + /* primary jail address. */ +#define PR_IP6_SADDRSEL 0x00000100 /* Do IPv6 src addr sel. or use the */ + /* primary jail address. */ /* Internal flag bits */ #define PR_REMOVE 0x01000000 /* In process of being removed */ @@ -335,6 +339,7 @@ struct mount; struct sockaddr; struct statfs; int jailed(struct ucred *cred); +int jailed_without_vnet(struct ucred *); void getcredhostname(struct ucred *, char *, size_t); void getcreddomainname(struct ucred *, char *, size_t); void getcredhostuuid(struct ucred *, char *, size_t); @@ -361,12 +366,14 @@ int prison_get_ip4(struct ucred *cred, struct in_addr *ia); int prison_local_ip4(struct ucred *cred, struct in_addr *ia); int prison_remote_ip4(struct ucred *cred, struct in_addr *ia); int prison_check_ip4(struct ucred *cred, struct in_addr *ia); +int prison_saddrsel_ip4(struct ucred *, struct in_addr *); #ifdef INET6 int prison_equal_ip6(struct prison *, struct prison *); int prison_get_ip6(struct ucred *, struct in6_addr *); int prison_local_ip6(struct ucred *, struct in6_addr *, int); int prison_remote_ip6(struct ucred *, struct in6_addr *); int prison_check_ip6(struct ucred *, struct in6_addr *); +int prison_saddrsel_ip6(struct ucred *, struct in6_addr *); #endif int prison_check_af(struct ucred *cred, int af); int prison_if(struct ucred *cred, struct sockaddr *sa); diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h index 5461dfd2b96e..1a9cb5cd003d 100644 --- a/sys/sys/kernel.h +++ b/sys/sys/kernel.h @@ -109,6 +109,7 @@ enum sysinit_sub_id { SI_SUB_VNET_PRELINK = 0x1E00000, /* vnet init before modules */ SI_SUB_KLD = 0x2000000, /* KLD and module setup */ SI_SUB_CPU = 0x2100000, /* CPU resource(s)*/ + SI_SUB_RANDOM = 0x2120000, /* random number generator */ SI_SUB_KDTRACE = 0x2140000, /* Kernel dtrace hooks */ SI_SUB_MAC = 0x2180000, /* TrustedBSD MAC subsystem */ SI_SUB_MAC_POLICY = 0x21C0000, /* TrustedBSD MAC policies */ diff --git a/sys/sys/kthread.h b/sys/sys/kthread.h index e4d9c5a9a5be..b06ff69b6e41 100644 --- a/sys/sys/kthread.h +++ b/sys/sys/kthread.h @@ -73,7 +73,7 @@ int kthread_resume(struct thread *); void kthread_shutdown(void *, int); void kthread_start(const void *); int kthread_suspend(struct thread *, int); -void kthread_suspend_check(struct thread *); +void kthread_suspend_check(void); #endif /* !_SYS_KTHREAD_H_ */ diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h index 8aedac1c160d..c48c900199e1 100644 --- a/sys/sys/ktrace.h +++ b/sys/sys/ktrace.h @@ -52,7 +52,7 @@ struct ktr_header { int ktr_len; /* length of buf */ short ktr_type; /* trace record type */ pid_t ktr_pid; /* process id */ - char ktr_comm[MAXCOMLEN+1]; /* command name */ + char ktr_comm[MAXCOMLEN + 1];/* command name */ struct timeval ktr_time; /* timestamp */ intptr_t ktr_tid; /* was ktr_buffer */ }; diff --git a/sys/sys/mman.h b/sys/sys/mman.h index 9b64e8981ccf..12c013383de8 100644 --- a/sys/sys/mman.h +++ b/sys/sys/mman.h @@ -82,6 +82,9 @@ */ #define MAP_FILE 0x0000 /* map from file (default) */ #define MAP_ANON 0x1000 /* allocated from memory, swap space */ +#ifndef _KERNEL +#define MAP_ANONYMOUS MAP_ANON /* For compatibility. */ +#endif /* !_KERNEL */ /* * Extended flags diff --git a/sys/sys/mount.h b/sys/sys/mount.h index dbf8c20fcc8d..b8264130a176 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -239,6 +239,7 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); #define MNT_NOATIME 0x10000000 /* disable update of file access time */ #define MNT_NOCLUSTERR 0x40000000 /* disable cluster read */ #define MNT_NOCLUSTERW 0x80000000 /* disable cluster write */ +#define MNT_NFS4ACLS 0x00000010 /* * NFS export related mount flags. @@ -274,7 +275,7 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); MNT_ROOTFS | MNT_NOATIME | MNT_NOCLUSTERR| \ MNT_NOCLUSTERW | MNT_SUIDDIR | MNT_SOFTDEP | \ MNT_IGNORE | MNT_EXPUBLIC | MNT_NOSYMFOLLOW | \ - MNT_GJOURNAL | MNT_MULTILABEL | MNT_ACLS) + MNT_GJOURNAL | MNT_MULTILABEL | MNT_ACLS | MNT_NFS4ACLS) /* Mask of flags that can be updated. */ #define MNT_UPDATEMASK (MNT_NOSUID | MNT_NOEXEC | \ @@ -282,7 +283,7 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); MNT_NOATIME | \ MNT_NOSYMFOLLOW | MNT_IGNORE | \ MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR | \ - MNT_ACLS | MNT_USER) + MNT_ACLS | MNT_USER | MNT_NFS4ACLS) /* * External filesystem command modifier flags. @@ -299,10 +300,6 @@ void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); #define MNT_BYFSID 0x08000000 /* specify filesystem by ID. */ #define MNT_CMDFLAGS (MNT_UPDATE | MNT_DELEXPORT | MNT_RELOAD | \ MNT_FORCE | MNT_SNAPSHOT | MNT_BYFSID) -/* - * Still available. - */ -#define MNT_SPARE_0x00000010 0x00000010 /* * Internal filesystem control flags stored in mnt_kern_flag. * diff --git a/sys/sys/msgbuf.h b/sys/sys/msgbuf.h index 61c79a1b6f7e..23bce08ceca1 100644 --- a/sys/sys/msgbuf.h +++ b/sys/sys/msgbuf.h @@ -54,6 +54,7 @@ struct msgbuf { #ifdef _KERNEL extern int msgbuftrigger; extern struct msgbuf *msgbufp; +extern struct mtx msgbuf_lock; void msgbufinit(void *ptr, int size); void msgbuf_addchar(struct msgbuf *mbp, int c); diff --git a/sys/sys/param.h b/sys/sys/param.h index 7bfab291c448..11e3fa673b6b 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -58,7 +58,7 @@ * in the range 5 to 9. */ #undef __FreeBSD_version -#define __FreeBSD_version 900002 /* Master, propagated to newvers */ +#define __FreeBSD_version 900009 /* Master, propagated to newvers */ #ifndef LOCORE #include @@ -144,7 +144,14 @@ #define MCLBYTES (1 << MCLSHIFT) /* size of an mbuf cluster */ -#define MJUMPAGESIZE PAGE_SIZE /* jumbo cluster 4k */ +#if PAGE_SIZE < 2048 +#define MJUMPAGESIZE MCLBYTES +#elif PAGE_SIZE <= 8192 +#define MJUMPAGESIZE PAGE_SIZE +#else +#define MJUMPAGESIZE (8 * 1024) +#endif + #define MJUM9BYTES (9 * 1024) /* jumbo cluster 9k */ #define MJUM16BYTES (16 * 1024) /* jumbo cluster 16k */ diff --git a/sys/sys/pmc.h b/sys/sys/pmc.h index 68d7df0af141..f4a29ce911af 100644 --- a/sys/sys/pmc.h +++ b/sys/sys/pmc.h @@ -84,7 +84,8 @@ __PMC_CPU(INTEL_CORE2, 0x88, "Intel Core2") \ __PMC_CPU(INTEL_CORE2EXTREME, 0x89, "Intel Core2 Extreme") \ __PMC_CPU(INTEL_ATOM, 0x8A, "Intel Atom") \ - __PMC_CPU(INTEL_COREI7, 0x8B, "Intel Core i7") + __PMC_CPU(INTEL_COREI7, 0x8B, "Intel Core i7") \ + __PMC_CPU(INTEL_XSCALE, 0x100, "Intel XScale") enum pmc_cputype { #undef __PMC_CPU @@ -93,7 +94,7 @@ enum pmc_cputype { }; #define PMC_CPU_FIRST PMC_CPU_AMD_K7 -#define PMC_CPU_LAST PMC_CPU_INTEL_COREI7 +#define PMC_CPU_LAST PMC_CPU_INTEL_XSCALE /* * Classes of PMCs @@ -107,7 +108,8 @@ enum pmc_cputype { __PMC_CLASS(P6) /* Intel Pentium Pro counters */ \ __PMC_CLASS(P4) /* Intel Pentium-IV counters */ \ __PMC_CLASS(IAF) /* Intel Core2/Atom, fixed function */ \ - __PMC_CLASS(IAP) /* Intel Core...Atom, programmable */ + __PMC_CLASS(IAP) /* Intel Core...Atom, programmable */ \ + __PMC_CLASS(XSCALE) /* Intel XScale counters */ enum pmc_class { #undef __PMC_CLASS @@ -116,7 +118,7 @@ enum pmc_class { }; #define PMC_CLASS_FIRST PMC_CLASS_TSC -#define PMC_CLASS_LAST PMC_CLASS_IAP +#define PMC_CLASS_LAST PMC_CLASS_XSCALE /* * A PMC can be in the following states: @@ -750,7 +752,8 @@ struct pmc_owner { struct pmclog_buffer *po_curbuf; /* current log buffer */ struct file *po_file; /* file reference */ int po_error; /* recorded error */ - int po_sscount; /* # SS PMCs owned */ + short po_sscount; /* # SS PMCs owned */ + short po_logprocmaps; /* global mappings done */ }; #define PMC_PO_OWNS_LOGFILE 0x00000001 /* has a log file */ diff --git a/sys/sys/priv.h b/sys/sys/priv.h index c8ccfa62a724..5738fca5d44f 100644 --- a/sys/sys/priv.h +++ b/sys/sys/priv.h @@ -335,6 +335,7 @@ #define PRIV_NET_LAGG 415 /* Administer lagg interface. */ #define PRIV_NET_GIF 416 /* Administer gif interface. */ #define PRIV_NET_SETIFVNET 417 /* Move interface to vnet. */ +#define PRIV_NET_SETIFDESCR 418 /* Set interface description. */ /* * 802.11-related privileges. diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 6e5716788e9f..dd9efae05241 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -77,6 +77,7 @@ struct session { u_int s_count; /* Ref cnt; pgrps in session - atomic. */ struct proc *s_leader; /* (m + e) Session leader. */ struct vnode *s_ttyvp; /* (m) Vnode of controlling tty. */ + struct cdev_priv *s_ttydp; /* (m) Device of controlling tty. */ struct tty *s_ttyp; /* (e) Controlling tty. */ pid_t s_sid; /* (c) Session ID. */ /* (m) Setlogin() name: */ @@ -216,7 +217,8 @@ struct thread { int td_pinned; /* (k) Temporary cpu pin count. */ struct ucred *td_ucred; /* (k) Reference to credentials. */ u_int td_estcpu; /* (t) estimated cpu utilization */ - u_int td_slptick; /* (t) Time at sleep. */ + int td_slptick; /* (t) Time at sleep. */ + int td_blktick; /* (t) Time spent blocked. */ struct rusage td_ru; /* (t) rusage information */ uint64_t td_incruntime; /* (t) Cpu ticks to transfer to proc. */ uint64_t td_runtime; /* (t) How many cpu ticks we've run. */ @@ -322,7 +324,7 @@ do { \ #define TDF_NEEDSUSPCHK 0x00008000 /* Thread may need to suspend. */ #define TDF_NEEDRESCHED 0x00010000 /* Thread needs to yield. */ #define TDF_NEEDSIGCHK 0x00020000 /* Thread may need signal delivery. */ -#define TDF_UNUSED18 0x00040000 /* --available-- */ +#define TDF_NOLOAD 0x00040000 /* Ignore during load avg calculations. */ #define TDF_UNUSED19 0x00080000 /* Thread is sleeping on a umtx. */ #define TDF_THRWAKEUP 0x00100000 /* Libthr thread must not suspend itself. */ #define TDF_UNUSED21 0x00200000 /* --available-- */ @@ -339,6 +341,7 @@ do { \ /* Userland debug flags */ #define TDB_SUSPEND 0x00000001 /* Thread is suspended by debugger */ #define TDB_XSIG 0x00000002 /* Thread is exchanging signal under trace */ +#define TDB_USERWR 0x00000004 /* Debugger modified memory or registers */ /* * "Private" flags kept in td_pflags: @@ -558,7 +561,7 @@ struct proc { #define P_ADVLOCK 0x00001 /* Process may hold a POSIX advisory lock. */ #define P_CONTROLT 0x00002 /* Has a controlling terminal. */ #define P_KTHREAD 0x00004 /* Kernel thread (*). */ -#define P_NOLOAD 0x00008 /* Ignore during load avg calculations. */ +#define P_UNUSED0 0x00008 /* available. */ #define P_PPWAIT 0x00010 /* Parent is waiting for child to exec/exit. */ #define P_PROFIL 0x00020 /* Has started profiling. */ #define P_STOPPROF 0x00040 /* Has thread requesting to stop profiling. */ @@ -836,7 +839,7 @@ void cpu_exit(struct thread *); void exit1(struct thread *, int) __dead2; void cpu_fork(struct thread *, struct proc *, struct thread *, int); void cpu_set_fork_handler(struct thread *, void (*)(void *), void *); - +void cpu_set_syscall_retval(struct thread *, int); void cpu_set_upcall(struct thread *td, struct thread *td0); void cpu_set_upcall_kse(struct thread *, void (*)(void *), void *, stack_t *); diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h index 8fd52cb4451e..e3653b657d1a 100644 --- a/sys/sys/ptrace.h +++ b/sys/sys/ptrace.h @@ -67,6 +67,10 @@ #define PT_SETFPREGS 36 /* set floating-point registers */ #define PT_GETDBREGS 37 /* get debugging registers */ #define PT_SETDBREGS 38 /* set debugging registers */ + +#define PT_VM_TIMESTAMP 40 /* Get VM version (timestamp) */ +#define PT_VM_ENTRY 41 /* Get VM map (entry) */ + #define PT_FIRSTMACH 64 /* for machine-specific requests */ #include /* machine-specific requests, if any */ @@ -98,6 +102,20 @@ struct ptrace_lwpinfo { sigset_t pl_siglist; /* LWP pending signal */ }; +/* Argument structure for PT_VM_ENTRY. */ +struct ptrace_vm_entry { + int pve_entry; /* Entry number used for iteration. */ + int pve_timestamp; /* Generation number of VM map. */ + u_long pve_start; /* Start VA of range. */ + u_long pve_end; /* End VA of range (incl). */ + u_long pve_offset; /* Offset in backing object. */ + u_int pve_prot; /* Protection of memory range. */ + u_int pve_pathlen; /* Size of path. */ + long pve_fileid; /* File ID. */ + uint32_t pve_fsid; /* File system ID. */ + char *pve_path; /* Path name of object. */ +}; + #ifdef _KERNEL #define PTRACESTOP_SC(p, td, flag) \ diff --git a/sys/sys/queue.h b/sys/sys/queue.h index f1f35c8ce358..257679bc0580 100644 --- a/sys/sys/queue.h +++ b/sys/sys/queue.h @@ -112,6 +112,7 @@ struct qm_trace { #define TRACEBUF struct qm_trace trace; #define TRASHIT(x) do {(x) = (void *)-1;} while (0) +#define QMD_SAVELINK(name, link) void **name = (void *)&(link) #define QMD_TRACE_HEAD(head) do { \ (head)->trace.prevline = (head)->trace.lastline; \ @@ -130,6 +131,7 @@ struct qm_trace { #else #define QMD_TRACE_ELEM(elem) #define QMD_TRACE_HEAD(head) +#define QMD_SAVELINK(name, link) #define TRACEBUF #define TRASHIT(x) #endif /* QUEUE_MACRO_DEBUG */ @@ -189,6 +191,7 @@ struct { \ #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) #define SLIST_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ if (SLIST_FIRST((head)) == (elm)) { \ SLIST_REMOVE_HEAD((head), field); \ } \ @@ -198,7 +201,7 @@ struct { \ curelm = SLIST_NEXT(curelm, field); \ SLIST_REMOVE_AFTER(curelm, field); \ } \ - TRASHIT((elm)->field.sle_next); \ + TRASHIT(*oldnext); \ } while (0) #define SLIST_REMOVE_AFTER(elm, field) do { \ @@ -285,6 +288,7 @@ struct { \ #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) #define STAILQ_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ if (STAILQ_FIRST((head)) == (elm)) { \ STAILQ_REMOVE_HEAD((head), field); \ } \ @@ -294,7 +298,7 @@ struct { \ curelm = STAILQ_NEXT(curelm, field); \ STAILQ_REMOVE_AFTER(head, curelm, field); \ } \ - TRASHIT((elm)->field.stqe_next); \ + TRASHIT(*oldnext); \ } while (0) #define STAILQ_REMOVE_HEAD(head, field) do { \ @@ -415,14 +419,16 @@ struct { \ #define LIST_NEXT(elm, field) ((elm)->field.le_next) #define LIST_REMOVE(elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.le_next); \ + QMD_SAVELINK(oldprev, (elm)->field.le_prev); \ QMD_LIST_CHECK_NEXT(elm, field); \ QMD_LIST_CHECK_PREV(elm, field); \ if (LIST_NEXT((elm), field) != NULL) \ LIST_NEXT((elm), field)->field.le_prev = \ (elm)->field.le_prev; \ *(elm)->field.le_prev = LIST_NEXT((elm), field); \ - TRASHIT((elm)->field.le_next); \ - TRASHIT((elm)->field.le_prev); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ } while (0) #define LIST_SWAP(head1, head2, type, field) do { \ @@ -587,6 +593,8 @@ struct { \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) #define TAILQ_REMOVE(head, elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.tqe_next); \ + QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); \ QMD_TAILQ_CHECK_NEXT(elm, field); \ QMD_TAILQ_CHECK_PREV(elm, field); \ if ((TAILQ_NEXT((elm), field)) != NULL) \ @@ -597,8 +605,8 @@ struct { \ QMD_TRACE_HEAD(head); \ } \ *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ - TRASHIT((elm)->field.tqe_next); \ - TRASHIT((elm)->field.tqe_prev); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ QMD_TRACE_ELEM(&(elm)->field); \ } while (0) diff --git a/sys/sys/rwlock.h b/sys/sys/rwlock.h index 50410ffaa0ba..ad178261fb91 100644 --- a/sys/sys/rwlock.h +++ b/sys/sys/rwlock.h @@ -55,13 +55,6 @@ * * When the lock is not locked by any thread, it is encoded as a read lock * with zero waiters. - * - * A note about memory barriers. Write locks need to use the same memory - * barriers as mutexes: _acq when acquiring a write lock and _rel when - * releasing a write lock. Read locks also need to use an _acq barrier when - * acquiring a read lock. However, since read locks do not update any - * locked data (modulo bugs of course), no memory barrier is needed when - * releasing a read lock. */ #define RW_LOCK_READ 0x01 diff --git a/sys/sys/sdt.h b/sys/sys/sdt.h index 8d212c8a96fc..eeae665c1413 100644 --- a/sys/sys/sdt.h +++ b/sys/sys/sdt.h @@ -59,6 +59,12 @@ #define SDT_PROBE_DEFINE4(prov, mod, func, name, arg0, arg1, arg2, arg3) #define SDT_PROBE_DEFINE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) +#define SDT_PROBE1(prov, mod, func, name, arg0) +#define SDT_PROBE2(prov, mod, func, name, arg0, arg1) +#define SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2) +#define SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3) +#define SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) + #else /* @@ -192,6 +198,17 @@ struct sdt_provider { SDT_PROBE_ARGTYPE(prov, mod, func, name, 3, arg3); \ SDT_PROBE_ARGTYPE(prov, mod, func, name, 4, arg4) +#define SDT_PROBE1(prov, mod, func, name, arg0) \ + SDT_PROBE(prov, mod, func, name, arg0, 0, 0, 0, 0) +#define SDT_PROBE2(prov, mod, func, name, arg0, arg1) \ + SDT_PROBE(prov, mod, func, name, arg0, arg1, 0, 0, 0) +#define SDT_PROBE3(prov, mod, func, name, arg0, arg1, arg2) \ + SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, 0, 0) +#define SDT_PROBE4(prov, mod, func, name, arg0, arg1, arg2, arg3) \ + SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, 0) +#define SDT_PROBE5(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) \ + SDT_PROBE(prov, mod, func, name, arg0, arg1, arg2, arg3, arg4) + typedef int (*sdt_argtype_listall_func_t)(struct sdt_argtype *, void *); typedef int (*sdt_probe_listall_func_t)(struct sdt_probe *, void *); typedef int (*sdt_provider_listall_func_t)(struct sdt_provider *, void *); diff --git a/sys/sys/semaphore.h b/sys/sys/semaphore.h deleted file mode 100644 index 34ede7b26613..000000000000 --- a/sys/sys/semaphore.h +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * Copyright (c) 1996, 1997 - * HD Associates, Inc. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by HD Associates, Inc - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES 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 HD ASSOCIATES 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$ - */ - -/* semaphore.h: POSIX 1003.1b semaphores */ - -#ifndef _SEMAPHORE_H_ -#define _SEMAPHORE_H_ - -#include - -/* Opaque type definition. */ -struct sem; -typedef struct sem * sem_t; - -#define SEM_FAILED ((sem_t *)0) -#define SEM_VALUE_MAX __INT_MAX - -#ifndef _KERNEL -#include - -struct timespec; - -__BEGIN_DECLS -int sem_close(sem_t *); -int sem_destroy(sem_t *); -int sem_getvalue(sem_t * __restrict, int * __restrict); -int sem_init(sem_t *, int, unsigned int); -sem_t *sem_open(const char *, int, ...); -int sem_post(sem_t *); -int sem_timedwait(sem_t * __restrict, const struct timespec * __restrict); -int sem_trywait(sem_t *); -int sem_unlink(const char *); -int sem_wait(sem_t *); -__END_DECLS - -#endif - -#endif /* !_SEMAPHORE_H_ */ diff --git a/sys/sys/signal.h b/sys/sys/signal.h index e90b107d170d..ff2d1fcbed29 100644 --- a/sys/sys/signal.h +++ b/sys/sys/signal.h @@ -119,9 +119,8 @@ #define SIG_DFL ((__sighandler_t *)0) #define SIG_IGN ((__sighandler_t *)1) #define SIG_ERR ((__sighandler_t *)-1) -/* - * XXX missing SIG_HOLD. - */ +/* #define SIG_CATCH ((__sighandler_t *)2) See signalvar.h */ +#define SIG_HOLD ((__sighandler_t *)3) /*- * Type of a signal handling function. @@ -338,6 +337,7 @@ struct sigaction { /* an asynchronous I/O request.*/ #define SI_MESGQ 0x10005 /* Signal generated by arrival of a */ /* message on an empty message queue. */ +#define SI_KERNEL 0x10006 #endif #if __BSD_VISIBLE #define SI_UNDEFINED 0 diff --git a/sys/sys/signalvar.h b/sys/sys/signalvar.h index 89b40f029768..552a83517235 100644 --- a/sys/sys/signalvar.h +++ b/sys/sys/signalvar.h @@ -97,7 +97,7 @@ typedef void __osiginfohandler_t(int, osiginfo_t *, void *); /* additional signal action values, used only temporarily/internally */ #define SIG_CATCH ((__sighandler_t *)2) -#define SIG_HOLD ((__sighandler_t *)3) +/* #define SIG_HOLD ((__sighandler_t *)3) See signal.h */ /* * get signal action for process and signal; currently only for current process @@ -233,7 +233,9 @@ typedef struct ksiginfo { #define KSI_TRAP 0x01 /* Generated by trap. */ #define KSI_EXT 0x02 /* Externally managed ksi. */ #define KSI_INS 0x04 /* Directly insert ksi, not the copy */ -#define KSI_COPYMASK KSI_TRAP +#define KSI_SIGQ 0x08 /* Generated by sigqueue, might ret EGAIN. */ +#define KSI_HEAD 0x10 /* Insert into head, not tail. */ +#define KSI_COPYMASK (KSI_TRAP|KSI_SIGQ) #define KSI_ONQ(ksi) ((ksi)->ksi_sigq != NULL) @@ -252,9 +254,10 @@ typedef struct sigqueue { /* Return nonzero if process p has an unmasked pending signal. */ #define SIGPENDING(td) \ - (!SIGISEMPTY((td)->td_siglist) && \ - !sigsetmasked(&(td)->td_siglist, &(td)->td_sigmask)) - + ((!SIGISEMPTY((td)->td_siglist) && \ + !sigsetmasked(&(td)->td_siglist, &(td)->td_sigmask)) || \ + (!SIGISEMPTY((td)->td_proc->p_siglist) && \ + !sigsetmasked(&(td)->td_proc->p_siglist, &(td)->td_sigmask))) /* * Return the value of the pseudo-expression ((*set & ~*mask) != 0). This * is an optimized version of SIGISEMPTY() on a temporary variable @@ -315,16 +318,22 @@ extern int kern_logsigexit; /* Sysctl variable kern.logsigexit */ #define SIG_STOP_ALLOWED 100 #define SIG_STOP_NOT_ALLOWED 101 +/* flags for kern_sigprocmask */ +#define SIGPROCMASK_OLD 0x0001 +#define SIGPROCMASK_PROC_LOCKED 0x0002 +#define SIGPROCMASK_PS_LOCKED 0x0004 + /* * Machine-independent functions: */ int cursig(struct thread *td, int stop_allowed); void execsigs(struct proc *p); -void gsignal(int pgid, int sig); +void gsignal(int pgid, int sig, ksiginfo_t *ksi); void killproc(struct proc *p, char *why); +void pksignal(struct proc *p, int sig, ksiginfo_t *ksi); void pgsigio(struct sigio **, int signum, int checkctty); -void pgsignal(struct pgrp *pgrp, int sig, int checkctty); -void postsig(int sig); +void pgsignal(struct pgrp *pgrp, int sig, int checkctty, ksiginfo_t *ksi); +int postsig(int sig); void psignal(struct proc *p, int sig); int psignal_event(struct proc *p, struct sigevent *, ksiginfo_t *); struct sigacts *sigacts_alloc(void); @@ -336,6 +345,7 @@ void sigexit(struct thread *td, int signum) __dead2; int sig_ffs(sigset_t *set); void siginit(struct proc *p); void signotify(struct thread *td); +void tdsigcleanup(struct thread *td); int tdsignal(struct proc *p, struct thread *td, int sig, ksiginfo_t *ksi); void trapsignal(struct thread *td, ksiginfo_t *); @@ -345,19 +355,12 @@ void ksiginfo_free(ksiginfo_t *); void sigqueue_init(struct sigqueue *queue, struct proc *p); void sigqueue_flush(struct sigqueue *queue); void sigqueue_delete_proc(struct proc *p, int sig); -void sigqueue_delete_set(struct sigqueue *queue, sigset_t *set); void sigqueue_delete(struct sigqueue *queue, int sig); -void sigqueue_move_set(struct sigqueue *src, sigqueue_t *dst, sigset_t *); -int sigqueue_get(struct sigqueue *queue, int sig, ksiginfo_t *info); -int sigqueue_add(struct sigqueue *queue, int sig, ksiginfo_t *info); -void sigqueue_collect_set(struct sigqueue *queue, sigset_t *set); -void sigqueue_move(struct sigqueue *, struct sigqueue *, int sig); -void sigqueue_delete_set_proc(struct proc *, sigset_t *); -void sigqueue_delete_stopmask_proc(struct proc *); void sigqueue_take(ksiginfo_t *ksi); int kern_sigtimedwait(struct thread *, sigset_t, - ksiginfo_t *, struct timespec *); - + ksiginfo_t *, struct timespec *); +int kern_sigprocmask(struct thread *td, int how, + sigset_t *set, sigset_t *oset, int flags); /* * Machine-dependent functions: */ diff --git a/sys/sys/sleepqueue.h b/sys/sys/sleepqueue.h index 362945aabeb4..3e33e6b34c70 100644 --- a/sys/sys/sleepqueue.h +++ b/sys/sys/sleepqueue.h @@ -109,8 +109,10 @@ void sleepq_release(void *wchan); void sleepq_remove(struct thread *td, void *wchan); int sleepq_signal(void *wchan, int flags, int pri, int queue); void sleepq_set_timeout(void *wchan, int timo); +u_int sleepq_sleepcnt(void *wchan, int queue); int sleepq_timedwait(void *wchan, int pri); int sleepq_timedwait_sig(void *wchan, int pri); +int sleepq_type(void *wchan); void sleepq_wait(void *wchan, int pri); int sleepq_wait_sig(void *wchan, int pri); diff --git a/sys/sys/socket.h b/sys/sys/socket.h index 13961e04dd54..9f227482f170 100644 --- a/sys/sys/socket.h +++ b/sys/sys/socket.h @@ -462,8 +462,8 @@ struct cmsghdr { #if __BSD_VISIBLE /* * While we may have more groups than this, the cmsgcred struct must - * be able to fit in an mbuf, and NGROUPS_MAX is too large to allow - * this. + * be able to fit in an mbuf and we have historically supported a + * maximum of 16 groups. */ #define CMGROUP_MAX 16 diff --git a/sys/sys/sockio.h b/sys/sys/sockio.h index a5911b7a0d19..2af2467da3b1 100644 --- a/sys/sys/sockio.h +++ b/sys/sys/sockio.h @@ -82,6 +82,8 @@ #define SIOCGIFMAC _IOWR('i', 38, struct ifreq) /* get IF MAC label */ #define SIOCSIFMAC _IOW('i', 39, struct ifreq) /* set IF MAC label */ #define SIOCSIFNAME _IOW('i', 40, struct ifreq) /* set IF name */ +#define SIOCSIFDESCR _IOW('i', 41, struct ifreq) /* set ifnet descr */ +#define SIOCGIFDESCR _IOWR('i', 42, struct ifreq) /* get ifnet descr */ #define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */ #define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */ diff --git a/sys/sys/sx.h b/sys/sys/sx.h index 4ff693bf14ea..67f7d9756448 100644 --- a/sys/sys/sx.h +++ b/sys/sys/sx.h @@ -63,13 +63,6 @@ * * When the lock is not locked by any thread, it is encoded as a * shared lock with zero waiters. - * - * A note about memory barriers. Exclusive locks need to use the same - * memory barriers as mutexes: _acq when acquiring an exclusive lock - * and _rel when releasing an exclusive lock. On the other side, - * shared lock needs to use an _acq barrier when acquiring the lock - * but, since they don't update any locked data, no memory barrier is - * needed when releasing a shared lock. */ #define SX_LOCK_SHARED 0x01 @@ -200,7 +193,7 @@ __sx_sunlock(struct sx *sx, const char *file, int line) uintptr_t x = sx->sx_lock; if (x == (SX_SHARERS_LOCK(1) | SX_LOCK_EXCLUSIVE_WAITERS) || - !atomic_cmpset_ptr(&sx->sx_lock, x, x - SX_ONE_SHARER)) + !atomic_cmpset_rel_ptr(&sx->sx_lock, x, x - SX_ONE_SHARER)) _sx_sunlock_hard(sx, file, line); } diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index 8e67fdb481cc..865107a560de 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 195458 2009-07-08 15:23:18Z trasz + * created from FreeBSD: head/sys/kern/syscalls.master 198508 2009-10-27 10:55:34Z kib */ #define SYS_syscall 0 @@ -428,4 +428,5 @@ #define SYS_msgctl 511 #define SYS_shmctl 512 #define SYS_lpathconf 513 -#define SYS_MAXSYSCALL 514 +#define SYS_pselect 522 +#define SYS_MAXSYSCALL 523 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index dc6ea5e59ed0..4953adc11d74 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,7 +1,7 @@ # FreeBSD system call names. # DO NOT EDIT-- this file is automatically generated. # $FreeBSD$ -# created from FreeBSD: head/sys/kern/syscalls.master 195458 2009-07-08 15:23:18Z trasz +# created from FreeBSD: head/sys/kern/syscalls.master 198508 2009-10-27 10:55:34Z kib MIASM = \ syscall.o \ exit.o \ @@ -376,4 +376,5 @@ MIASM = \ __semctl.o \ msgctl.o \ shmctl.o \ - lpathconf.o + lpathconf.o \ + pselect.o diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index e1c83ccebb22..35c0b261a2e6 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -148,6 +148,8 @@ int kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg, int name, u_long flags); int kern_pipe(struct thread *td, int fildes[2]); int kern_preadv(struct thread *td, int fd, struct uio *auio, off_t offset); +int kern_pselect(struct thread *td, int nd, fd_set *in, fd_set *ou, + fd_set *ex, struct timeval *tvp, sigset_t *uset, int abi_nfdbits); int kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data); int kern_pwritev(struct thread *td, int fd, struct uio *auio, off_t offset); @@ -190,8 +192,6 @@ int kern_shmctl(struct thread *td, int shmid, int cmd, void *buf, int kern_sigaction(struct thread *td, int sig, struct sigaction *act, struct sigaction *oact, int flags); int kern_sigaltstack(struct thread *td, stack_t *ss, stack_t *oss); -int kern_sigprocmask(struct thread *td, int how, - sigset_t *set, sigset_t *oset, int old); int kern_sigsuspend(struct thread *td, sigset_t mask); int kern_stat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp); @@ -212,7 +212,7 @@ int kern_truncate(struct thread *td, char *path, enum uio_seg pathseg, off_t length); int kern_unlink(struct thread *td, char *path, enum uio_seg pathseg); int kern_unlinkat(struct thread *td, int fd, char *path, - enum uio_seg pathseg); + enum uio_seg pathseg, ino_t oldinum); int kern_utimes(struct thread *td, char *path, enum uio_seg pathseg, struct timeval *tptr, enum uio_seg tptrseg); int kern_utimesat(struct thread *td, int fd, char *path, diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index e1ce71889eee..aa7b8df5d595 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -714,8 +714,8 @@ int sysctl_wire_old_buffer(struct sysctl_req *req, size_t len); #include __BEGIN_DECLS -int sysctl(int *, u_int, void *, size_t *, void *, size_t); -int sysctlbyname(const char *, void *, size_t *, void *, size_t); +int sysctl(const int *, u_int, void *, size_t *, const void *, size_t); +int sysctlbyname(const char *, void *, size_t *, const void *, size_t); int sysctlnametomib(const char *, int *, size_t *); __END_DECLS #endif /* _KERNEL */ diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h index f17f4f0345f5..a7a2907c3cf6 100644 --- a/sys/sys/sysent.h +++ b/sys/sys/sysent.h @@ -87,7 +87,7 @@ struct sysentvec { void (*sv_prepsyscall)(struct trapframe *, int *, u_int *, caddr_t *); char *sv_name; /* name of binary type */ - int (*sv_coredump)(struct thread *, struct vnode *, off_t); + int (*sv_coredump)(struct thread *, struct vnode *, off_t, int); /* function to dump core, or NULL */ int (*sv_imgact_try)(struct image_params *); int sv_minsigstksz; /* minimum signal stack size */ diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index 987cc3a5874e..a97a0aee6f22 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -3,7 +3,7 @@ * * DO NOT EDIT-- this file is automatically generated. * $FreeBSD$ - * created from FreeBSD: head/sys/kern/syscalls.master 195458 2009-07-08 15:23:18Z trasz + * created from FreeBSD: head/sys/kern/syscalls.master 198508 2009-10-27 10:55:34Z kib */ #ifndef _SYS_SYSPROTO_H_ @@ -1641,6 +1641,14 @@ struct lpathconf_args { char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)]; }; +struct pselect_args { + char nd_l_[PADL_(int)]; int nd; char nd_r_[PADR_(int)]; + char in_l_[PADL_(fd_set *)]; fd_set * in; char in_r_[PADR_(fd_set *)]; + char ou_l_[PADL_(fd_set *)]; fd_set * ou; char ou_r_[PADR_(fd_set *)]; + char ex_l_[PADL_(fd_set *)]; fd_set * ex; char ex_r_[PADR_(fd_set *)]; + char ts_l_[PADL_(const struct timespec *)]; const struct timespec * ts; char ts_r_[PADR_(const struct timespec *)]; + char sm_l_[PADL_(const sigset_t *)]; const sigset_t * sm; char sm_r_[PADR_(const sigset_t *)]; +}; int nosys(struct thread *, struct nosys_args *); void sys_exit(struct thread *, struct sys_exit_args *); int fork(struct thread *, struct fork_args *); @@ -1999,6 +2007,7 @@ int __semctl(struct thread *, struct __semctl_args *); int msgctl(struct thread *, struct msgctl_args *); int shmctl(struct thread *, struct shmctl_args *); int lpathconf(struct thread *, struct lpathconf_args *); +int pselect(struct thread *, struct pselect_args *); #ifdef COMPAT_43 @@ -2233,21 +2242,13 @@ int freebsd4_sigreturn(struct thread *, struct freebsd4_sigreturn_args *); #endif /* COMPAT_FREEBSD4 */ -#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) +#ifdef COMPAT_FREEBSD6 -#endif /* COMPAT_FREEBSD[45] */ +#endif /* COMPAT_FREEBSD6 */ -#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD6) - - -#endif /* COMPAT_FREEBSD[456] */ - - -#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \ - defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) +#ifdef COMPAT_FREEBSD7 struct freebsd7___semctl_args { char semid_l_[PADL_(int)]; int semid; char semid_r_[PADR_(int)]; @@ -2269,7 +2270,7 @@ int freebsd7___semctl(struct thread *, struct freebsd7___semctl_args *); int freebsd7_msgctl(struct thread *, struct freebsd7_msgctl_args *); int freebsd7_shmctl(struct thread *, struct freebsd7_shmctl_args *); -#endif /* COMPAT_FREEBSD[4567] */ +#endif /* COMPAT_FREEBSD7 */ #define SYS_AUE_syscall AUE_NULL #define SYS_AUE_exit AUE_EXIT @@ -2679,6 +2680,7 @@ int freebsd7_shmctl(struct thread *, struct freebsd7_shmctl_args *); #define SYS_AUE_msgctl AUE_MSGCTL #define SYS_AUE_shmctl AUE_SHMCTL #define SYS_AUE_lpathconf AUE_LPATHCONF +#define SYS_AUE_pselect AUE_SELECT #undef PAD_ #undef PADL_ diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 397976fd564f..3868c9a380c6 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -52,8 +52,6 @@ extern char version[]; /* system version */ extern char copyright[]; /* system copyright */ extern int kstack_pages; /* number of kernel stack pages */ -extern int nswap; /* size of swap space */ - extern u_long pagesizes[]; /* supported page sizes */ extern long physmem; /* physical memory */ extern long realmem; /* 'real' memory */ @@ -64,6 +62,10 @@ extern int boothowto; /* reboot flags, from console subsystem */ extern int bootverbose; /* nonzero to print verbose messages */ extern int maxusers; /* system tune hint */ +extern int ngroups_max; /* max # of supplemental groups */ +extern int vm_guest; /* Running as virtual machine guest? */ + +enum VM_GUEST { VM_GUEST_NO = 0, VM_GUEST_VM, VM_GUEST_XEN }; #ifdef INVARIANTS /* The option is always available */ #define KASSERT(exp,msg) do { \ @@ -164,6 +166,7 @@ void critical_exit(void); void init_param1(void); void init_param2(long physpages); void init_param3(long kmempages); +void init_static_kenv(char *, size_t); void tablefull(const char *); int kvprintf(char const *, void (*)(int, void*), void *, int, __va_list) __printflike(1, 0); diff --git a/sys/sys/termios.h b/sys/sys/termios.h index 0543d6ee64b6..e5bacf46550f 100644 --- a/sys/sys/termios.h +++ b/sys/sys/termios.h @@ -1,302 +1,5 @@ -/*- - * Copyright (c) 1988, 1989, 1993, 1994 - * 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. - * - * @(#)termios.h 8.3 (Berkeley) 3/28/94 - * $FreeBSD$ - */ - -#ifndef _SYS_TERMIOS_H_ -#define _SYS_TERMIOS_H_ - -#include -#ifndef _PID_T_DECLARED -typedef __pid_t pid_t; -#define _PID_T_DECLARED -#endif - -/* - * Special Control Characters - * - * Index into c_cc[] character array. - * - * Name Subscript Enabled by - */ -#define VEOF 0 /* ICANON */ -#define VEOL 1 /* ICANON */ -#ifndef _POSIX_SOURCE -#define VEOL2 2 /* ICANON together with IEXTEN */ -#endif -#define VERASE 3 /* ICANON */ -#ifndef _POSIX_SOURCE -#define VWERASE 4 /* ICANON together with IEXTEN */ -#endif -#define VKILL 5 /* ICANON */ -#ifndef _POSIX_SOURCE -#define VREPRINT 6 /* ICANON together with IEXTEN */ -#define VERASE2 7 /* ICANON */ -#endif -/* 7 ex-spare 1 */ -#define VINTR 8 /* ISIG */ -#define VQUIT 9 /* ISIG */ -#define VSUSP 10 /* ISIG */ -#ifndef _POSIX_SOURCE -#define VDSUSP 11 /* ISIG together with IEXTEN */ -#endif -#define VSTART 12 /* IXON, IXOFF */ -#define VSTOP 13 /* IXON, IXOFF */ -#ifndef _POSIX_SOURCE -#define VLNEXT 14 /* IEXTEN */ -#define VDISCARD 15 /* IEXTEN */ -#endif -#define VMIN 16 /* !ICANON */ -#define VTIME 17 /* !ICANON */ -#ifndef _POSIX_SOURCE -#define VSTATUS 18 /* ICANON together with IEXTEN */ -/* 19 spare 2 */ -#endif -#define NCCS 20 - -#define _POSIX_VDISABLE 0xff - -/* - * Input flags - software input processing - */ -#define IGNBRK 0x00000001 /* ignore BREAK condition */ -#define BRKINT 0x00000002 /* map BREAK to SIGINTR */ -#define IGNPAR 0x00000004 /* ignore (discard) parity errors */ -#define PARMRK 0x00000008 /* mark parity and framing errors */ -#define INPCK 0x00000010 /* enable checking of parity errors */ -#define ISTRIP 0x00000020 /* strip 8th bit off chars */ -#define INLCR 0x00000040 /* map NL into CR */ -#define IGNCR 0x00000080 /* ignore CR */ -#define ICRNL 0x00000100 /* map CR to NL (ala CRMOD) */ -#define IXON 0x00000200 /* enable output flow control */ -#define IXOFF 0x00000400 /* enable input flow control */ -#ifndef _POSIX_SOURCE -#define IXANY 0x00000800 /* any char will restart after stop */ -#define IMAXBEL 0x00002000 /* ring bell on input queue full */ -#endif /*_POSIX_SOURCE */ - -/* - * Output flags - software output processing - */ -#define OPOST 0x00000001 /* enable following output processing */ -#ifndef _POSIX_SOURCE -#define ONLCR 0x00000002 /* map NL to CR-NL (ala CRMOD) */ -#define TABDLY 0x00000004 /* tab delay mask */ -#define TAB0 0x00000000 /* no tab delay and expansion */ -#define TAB3 0x00000004 /* expand tabs to spaces */ -#ifndef _KERNEL -#define OXTABS TAB3 -#endif /* !_KERNEL */ -#define ONOEOT 0x00000008 /* discard EOT's (^D) on output) */ -#define OCRNL 0x00000010 /* map CR to NL on output */ -#define ONOCR 0x00000020 /* no CR output at column 0 */ -#define ONLRET 0x00000040 /* NL performs CR function */ -#endif /*_POSIX_SOURCE */ - -/* - * Control flags - hardware control of terminal - */ -#ifndef _POSIX_SOURCE -#define CIGNORE 0x00000001 /* ignore control flags */ -#endif -#define CSIZE 0x00000300 /* character size mask */ -#define CS5 0x00000000 /* 5 bits (pseudo) */ -#define CS6 0x00000100 /* 6 bits */ -#define CS7 0x00000200 /* 7 bits */ -#define CS8 0x00000300 /* 8 bits */ -#define CSTOPB 0x00000400 /* send 2 stop bits */ -#define CREAD 0x00000800 /* enable receiver */ -#define PARENB 0x00001000 /* parity enable */ -#define PARODD 0x00002000 /* odd parity, else even */ -#define HUPCL 0x00004000 /* hang up on last close */ -#define CLOCAL 0x00008000 /* ignore modem status lines */ -#ifndef _POSIX_SOURCE -#define CCTS_OFLOW 0x00010000 /* CTS flow control of output */ -#define CRTSCTS (CCTS_OFLOW | CRTS_IFLOW) -#define CRTS_IFLOW 0x00020000 /* RTS flow control of input */ -#define CDTR_IFLOW 0x00040000 /* DTR flow control of input */ -#define CDSR_OFLOW 0x00080000 /* DSR flow control of output */ -#define CCAR_OFLOW 0x00100000 /* DCD flow control of output */ -#ifndef _KERNEL -#define MDMBUF CCAR_OFLOW -#endif /* !_KERNEL */ -#endif - - -/* - * "Local" flags - dumping ground for other state - * - * Warning: some flags in this structure begin with - * the letter "I" and look like they belong in the - * input flag. - */ - -#ifndef _POSIX_SOURCE -#define ECHOKE 0x00000001 /* visual erase for line kill */ -#endif /*_POSIX_SOURCE */ -#define ECHOE 0x00000002 /* visually erase chars */ -#define ECHOK 0x00000004 /* echo NL after line kill */ -#define ECHO 0x00000008 /* enable echoing */ -#define ECHONL 0x00000010 /* echo NL even if ECHO is off */ -#ifndef _POSIX_SOURCE -#define ECHOPRT 0x00000020 /* visual erase mode for hardcopy */ -#define ECHOCTL 0x00000040 /* echo control chars as ^(Char) */ -#endif /*_POSIX_SOURCE */ -#define ISIG 0x00000080 /* enable signals INTR, QUIT, [D]SUSP */ -#define ICANON 0x00000100 /* canonicalize input lines */ -#ifndef _POSIX_SOURCE -#define ALTWERASE 0x00000200 /* use alternate WERASE algorithm */ -#endif /*_POSIX_SOURCE */ -#define IEXTEN 0x00000400 /* enable DISCARD and LNEXT */ -#define EXTPROC 0x00000800 /* external processing */ -#define TOSTOP 0x00400000 /* stop background jobs from output */ -#ifndef _POSIX_SOURCE -#define FLUSHO 0x00800000 /* output being flushed (state) */ -#define NOKERNINFO 0x02000000 /* no kernel output from VSTATUS */ -#define PENDIN 0x20000000 /* XXX retype pending input (state) */ -#endif /*_POSIX_SOURCE */ -#define NOFLSH 0x80000000 /* don't flush after interrupt */ - -typedef unsigned int tcflag_t; -typedef unsigned char cc_t; -typedef unsigned int speed_t; - -struct termios { - tcflag_t c_iflag; /* input flags */ - tcflag_t c_oflag; /* output flags */ - tcflag_t c_cflag; /* control flags */ - tcflag_t c_lflag; /* local flags */ - cc_t c_cc[NCCS]; /* control chars */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ -}; - -/* - * Standard speeds - */ -#define B0 0 -#define B50 50 -#define B75 75 -#define B110 110 -#define B134 134 -#define B150 150 -#define B200 200 -#define B300 300 -#define B600 600 -#define B1200 1200 -#define B1800 1800 -#define B2400 2400 -#define B4800 4800 -#define B9600 9600 -#define B19200 19200 -#define B38400 38400 -#ifndef _POSIX_SOURCE -#define B7200 7200 -#define B14400 14400 -#define B28800 28800 -#define B57600 57600 -#define B76800 76800 -#define B115200 115200 -#define B230400 230400 -#define B460800 460800 -#define B921600 921600 -#define EXTA 19200 -#define EXTB 38400 -#endif /* !_POSIX_SOURCE */ - -#ifndef _KERNEL - -#ifndef _POSIX_SOURCE -#define CCEQ(val, c) ((c) == (val) && (val) != _POSIX_VDISABLE) -#endif - -/* - * Commands passed to tcsetattr() for setting the termios structure. - */ -#define TCSANOW 0 /* make change immediate */ -#define TCSADRAIN 1 /* drain output, then change */ -#define TCSAFLUSH 2 /* drain output, flush input */ -#ifndef _POSIX_SOURCE -#define TCSASOFT 0x10 /* flag - don't alter h.w. state */ -#endif - -#define TCIFLUSH 1 -#define TCOFLUSH 2 -#define TCIOFLUSH 3 -#define TCOOFF 1 -#define TCOON 2 -#define TCIOFF 3 -#define TCION 4 - -#include - -__BEGIN_DECLS -speed_t cfgetispeed(const struct termios *); -speed_t cfgetospeed(const struct termios *); -int cfsetispeed(struct termios *, speed_t); -int cfsetospeed(struct termios *, speed_t); -int tcgetattr(int, struct termios *); -int tcsetattr(int, int, const struct termios *); -int tcdrain(int); -int tcflow(int, int); -int tcflush(int, int); -int tcsendbreak(int, int); - -#if __POSIX_VISIBLE >= 200112 || __BSD_VISIBLE -pid_t tcgetsid(int); -#endif -#if __BSD_VISIBLE -int tcsetsid(int, pid_t); - -void cfmakeraw(struct termios *); -int cfsetspeed(struct termios *, speed_t); -#endif -__END_DECLS - -#endif /* !_KERNEL */ - -#ifndef _POSIX_SOURCE - -/* - * Include tty ioctl's that aren't just for backwards compatibility - * with the old tty driver. These ioctl definitions were previously - * in . - */ -#include -#endif - -/* - * END OF PROTECTED INCLUDE. - */ -#endif /* !_SYS_TERMIOS_H_ */ - -#ifndef _POSIX_SOURCE -#include +/* $FreeBSD$ */ +#ifdef __GNUC__ +#warning "this file includes which is deprecated, use instead" #endif +#include diff --git a/sys/sys/time.h b/sys/sys/time.h index 0185c31b7720..c2ed337e52d7 100644 --- a/sys/sys/time.h +++ b/sys/sys/time.h @@ -283,7 +283,7 @@ extern struct timeval boottime; * * Functions with the "get" prefix returns a less precise result * much faster than the functions without "get" prefix and should - * be used where a precision of 10 msec is acceptable or where + * be used where a precision of 1/hz seconds is acceptable or where * performance is priority. (NB: "precision", _not_ "resolution" !) * */ diff --git a/sys/sys/timeb.h b/sys/sys/timeb.h index 2a88f6b3f7d8..59aa4666b026 100644 --- a/sys/sys/timeb.h +++ b/sys/sys/timeb.h @@ -38,6 +38,13 @@ #ifndef _SYS_TIMEB_H_ #define _SYS_TIMEB_H_ +#include + +#ifndef _TIME_T_DECLARED +typedef __time_t time_t; +#define _TIME_T_DECLARED +#endif + /* The ftime(2) system call structure -- deprecated. */ struct timeb { time_t time; /* seconds since the Epoch */ @@ -54,4 +61,4 @@ int ftime(struct timeb *); __END_DECLS #endif /* _KERNEL */ -#endif +#endif /* !_SYS_TIMEB_H_ */ diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 13c89f92c07b..c594e11211df 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include @@ -182,9 +182,10 @@ void tty_wakeup(struct tty *tp, int flags); int tty_checkoutq(struct tty *tp); int tty_putchar(struct tty *tp, char c); -int tty_ioctl(struct tty *tp, u_long cmd, void *data, struct thread *td); -int tty_ioctl_compat(struct tty *tp, u_long cmd, caddr_t data, +int tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, struct thread *td); +int tty_ioctl_compat(struct tty *tp, u_long cmd, caddr_t data, + int fflag, struct thread *td); void tty_init_console(struct tty *tp, speed_t speed); void tty_flush(struct tty *tp, int flags); void tty_hiwat_in_block(struct tty *tp); diff --git a/sys/sys/ttydevsw.h b/sys/sys/ttydevsw.h index e2278c3ab432..4506919832f9 100644 --- a/sys/sys/ttydevsw.h +++ b/sys/sys/ttydevsw.h @@ -48,8 +48,8 @@ typedef int tsw_ioctl_t(struct tty *tp, u_long cmd, caddr_t data, struct thread *td); typedef int tsw_param_t(struct tty *tp, struct termios *t); typedef int tsw_modem_t(struct tty *tp, int sigon, int sigoff); -typedef int tsw_mmap_t(struct tty *tp, vm_offset_t offset, - vm_paddr_t * paddr, int nprot); +typedef int tsw_mmap_t(struct tty *tp, vm_ooffset_t offset, + vm_paddr_t * paddr, int nprot, vm_memattr_t *memattr); typedef void tsw_pktnotify_t(struct tty *tp, char event); typedef void tsw_free_t(void *softc); @@ -142,11 +142,12 @@ ttydevsw_modem(struct tty *tp, int sigon, int sigoff) } static __inline int -ttydevsw_mmap(struct tty *tp, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +ttydevsw_mmap(struct tty *tp, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { MPASS(!tty_gone(tp)); - return tp->t_devsw->tsw_mmap(tp, offset, paddr, nprot); + return tp->t_devsw->tsw_mmap(tp, offset, paddr, nprot, memattr); } static __inline void diff --git a/sys/sys/ttyqueue.h b/sys/sys/ttyqueue.h index aac6b3c011f9..2d1a565af965 100644 --- a/sys/sys/ttyqueue.h +++ b/sys/sys/ttyqueue.h @@ -92,6 +92,13 @@ ttyinq_getsize(struct ttyinq *ti) return (ti->ti_nblocks * TTYINQ_DATASIZE); } +static __inline size_t +ttyinq_getallocatedsize(struct ttyinq *ti) +{ + + return (ti->ti_quota * TTYINQ_DATASIZE); +} + static __inline size_t ttyinq_bytesleft(struct ttyinq *ti) { @@ -142,6 +149,13 @@ ttyoutq_getsize(struct ttyoutq *to) return (to->to_nblocks * TTYOUTQ_DATASIZE); } +static __inline size_t +ttyoutq_getallocatedsize(struct ttyoutq *to) +{ + + return (to->to_quota * TTYOUTQ_DATASIZE); +} + static __inline size_t ttyoutq_bytesleft(struct ttyoutq *to) { diff --git a/sys/sys/umtx.h b/sys/sys/umtx.h index 2d45677ee1ae..dab862ef1b9f 100644 --- a/sys/sys/umtx.h +++ b/sys/sys/umtx.h @@ -30,19 +30,11 @@ #ifndef _SYS_UMTX_H_ #define _SYS_UMTX_H_ -#include +#include #include -/* - * See pthread_* - */ - -#define UMTX_UNOWNED 0x0 -#define UMTX_CONTESTED LONG_MIN - -struct umtx { - volatile u_long u_owner; /* Owner of the mutex. */ -}; +#define UMTX_UNOWNED 0x0 +#define UMTX_CONTESTED LONG_MIN #define USYNC_PROCESS_SHARED 0x0001 /* Process shared sync objs */ @@ -53,27 +45,6 @@ struct umtx { #define UMUTEX_PRIO_INHERIT 0x0004 /* Priority inherited mutex */ #define UMUTEX_PRIO_PROTECT 0x0008 /* Priority protect mutex */ -struct umutex { - volatile __lwpid_t m_owner; /* Owner of the mutex */ - uint32_t m_flags; /* Flags of the mutex */ - uint32_t m_ceilings[2]; /* Priority protect ceiling */ - uint32_t m_spare[4]; -}; - -struct ucond { - volatile uint32_t c_has_waiters; /* Has waiters in kernel */ - uint32_t c_flags; /* Flags of the condition variable */ - uint32_t c_spare[2]; /* Spare space */ -}; - -struct urwlock { - volatile int32_t rw_state; - uint32_t rw_flags; - uint32_t rw_blocked_readers; - uint32_t rw_blocked_writers; - uint32_t rw_spare[4]; -}; - /* urwlock flags */ #define URWLOCK_PREFER_READER 0x0002 @@ -83,6 +54,9 @@ struct urwlock { #define URWLOCK_MAX_READERS 0x1fffffffU #define URWLOCK_READER_COUNT(c) ((c) & URWLOCK_MAX_READERS) +/* _usem flags */ +#define SEM_NAMED 0x0002 + /* op code for _umtx_op */ #define UMTX_OP_LOCK 0 #define UMTX_OP_UNLOCK 1 @@ -100,10 +74,12 @@ struct urwlock { #define UMTX_OP_RW_WRLOCK 13 #define UMTX_OP_RW_UNLOCK 14 #define UMTX_OP_WAIT_UINT_PRIVATE 15 -#define UMTX_OP_WAKE_PRIVATE 16 -#define UMTX_OP_MUTEX_WAIT 17 -#define UMTX_OP_MUTEX_WAKE 18 -#define UMTX_OP_MAX 19 +#define UMTX_OP_WAKE_PRIVATE 16 +#define UMTX_OP_MUTEX_WAIT 17 +#define UMTX_OP_MUTEX_WAKE 18 +#define UMTX_OP_SEM_WAIT 19 +#define UMTX_OP_SEM_WAKE 20 +#define UMTX_OP_MAX 21 /* flags for UMTX_OP_CV_WAIT */ #define UMTX_CHECK_UNPARKING 0x01 diff --git a/sys/sys/user.h b/sys/sys/user.h index b13503466da1..d5e46feb58fd 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -100,8 +100,12 @@ #define KINFO_PROC_SIZE 768 #endif #ifdef __mips__ +#ifdef __mips_n64 +#define KINFO_PROC_SIZE 1088 +#else #define KINFO_PROC_SIZE 816 #endif +#endif #ifdef __powerpc__ #define KINFO_PROC_SIZE 768 #endif diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index dffbf9a293f3..4c84ea30ebe2 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -237,7 +237,6 @@ struct xvnode { #define VI_AGE 0x0040 /* Insert vnode at head of free list */ #define VI_DOOMED 0x0080 /* This vnode is being recycled */ #define VI_FREE 0x0100 /* This vnode is on the freelist */ -#define VI_OBJDIRTY 0x0400 /* object might be dirty */ #define VI_DOINGINACT 0x0800 /* VOP_INACTIVE is in progress */ #define VI_OWEINACT 0x1000 /* Need to call inactive */ @@ -633,6 +632,7 @@ void vholdl(struct vnode *); int vinvalbuf(struct vnode *vp, int save, int slpflag, int slptimeo); int vtruncbuf(struct vnode *vp, struct ucred *cred, struct thread *td, off_t length, int blksize); +void vunref(struct vnode *); void vn_printf(struct vnode *vp, const char *fmt, ...) __printflike(2,3); #define vprint(label, vp) vn_printf((vp), "%s\n", (label)) int vrecycle(struct vnode *vp, struct thread *td); @@ -685,6 +685,7 @@ int vop_stdlock(struct vop_lock1_args *); int vop_stdputpages(struct vop_putpages_args *); int vop_stdunlock(struct vop_unlock_args *); int vop_nopoll(struct vop_poll_args *); +int vop_stdaccess(struct vop_access_args *ap); int vop_stdaccessx(struct vop_accessx_args *ap); int vop_stdadvlock(struct vop_advlock_args *ap); int vop_stdadvlockasync(struct vop_advlockasync_args *ap); diff --git a/sys/teken/sequences b/sys/teken/sequences index 957665a02f53..cf720b0ca0f9 100644 --- a/sys/teken/sequences +++ b/sys/teken/sequences @@ -88,6 +88,7 @@ ICH Insert character ^[ [ @ n IL Insert line ^[ [ L n IND Index ^[ D NEL Next line ^[ E +OSC Operating System Command ^[ ] RI Reverse index ^[ M RIS Reset to Initial State ^[ c RM Reset Mode ^[ [ l r diff --git a/sys/teken/teken.c b/sys/teken/teken.c index c8d6b09cc33a..1435d2fa9b18 100644 --- a/sys/teken/teken.c +++ b/sys/teken/teken.c @@ -49,13 +49,15 @@ static FILE *df; #endif /* __FreeBSD__ && _KERNEL */ /* Private flags for t_stateflags. */ -#define TS_FIRSTDIGIT 0x01 /* First numeric digit in escape sequence. */ -#define TS_INSERT 0x02 /* Insert mode. */ -#define TS_AUTOWRAP 0x04 /* Autowrap. */ -#define TS_ORIGIN 0x08 /* Origin mode. */ -#define TS_WRAPPED 0x10 /* Next character should be printed on col 0. */ -#define TS_8BIT 0x20 /* UTF-8 disabled. */ -#define TS_CONS25 0x40 /* cons25 emulation. */ +#define TS_FIRSTDIGIT 0x0001 /* First numeric digit in escape sequence. */ +#define TS_INSERT 0x0002 /* Insert mode. */ +#define TS_AUTOWRAP 0x0004 /* Autowrap. */ +#define TS_ORIGIN 0x0008 /* Origin mode. */ +#define TS_WRAPPED 0x0010 /* Next character should be printed on col 0. */ +#define TS_8BIT 0x0020 /* UTF-8 disabled. */ +#define TS_CONS25 0x0040 /* cons25 emulation. */ +#define TS_INSTRING 0x0080 /* Inside string. */ +#define TS_CURSORKEYS 0x0100 /* Cursor keys mode. */ /* Character that blanks a cell. */ #define BLANK ' ' @@ -176,6 +178,24 @@ static void teken_input_char(teken_t *t, teken_char_t c) { + /* + * There is no support for DCS and OSC. Just discard strings + * until we receive characters that may indicate string + * termination. + */ + if (t->t_stateflags & TS_INSTRING) { + switch (c) { + case '\x1B': + t->t_stateflags &= ~TS_INSTRING; + break; + case '\a': + t->t_stateflags &= ~TS_INSTRING; + return; + default: + return; + } + } + switch (c) { case '\0': break; @@ -460,4 +480,64 @@ teken_256to8(teken_color_t c) } } +static const char * const special_strings_cons25[] = { + [TKEY_UP] = "\x1B[A", [TKEY_DOWN] = "\x1B[B", + [TKEY_LEFT] = "\x1B[D", [TKEY_RIGHT] = "\x1B[C", + + [TKEY_HOME] = "\x1B[H", [TKEY_END] = "\x1B[F", + [TKEY_INSERT] = "\x1B[L", [TKEY_DELETE] = "\x7F", + [TKEY_PAGE_UP] = "\x1B[I", [TKEY_PAGE_DOWN] = "\x1B[G", + + [TKEY_F1] = "\x1B[M", [TKEY_F2] = "\x1B[N", + [TKEY_F3] = "\x1B[O", [TKEY_F4] = "\x1B[P", + [TKEY_F5] = "\x1B[Q", [TKEY_F6] = "\x1B[R", + [TKEY_F7] = "\x1B[S", [TKEY_F8] = "\x1B[T", + [TKEY_F9] = "\x1B[U", [TKEY_F10] = "\x1B[V", + [TKEY_F11] = "\x1B[W", [TKEY_F12] = "\x1B[X", +}; + +static const char * const special_strings_ckeys[] = { + [TKEY_UP] = "\x1BOA", [TKEY_DOWN] = "\x1BOB", + [TKEY_LEFT] = "\x1BOD", [TKEY_RIGHT] = "\x1BOC", + + [TKEY_HOME] = "\x1BOH", [TKEY_END] = "\x1BOF", +}; + +static const char * const special_strings_normal[] = { + [TKEY_UP] = "\x1B[A", [TKEY_DOWN] = "\x1B[B", + [TKEY_LEFT] = "\x1B[D", [TKEY_RIGHT] = "\x1B[C", + + [TKEY_HOME] = "\x1B[H", [TKEY_END] = "\x1B[F", + [TKEY_INSERT] = "\x1B[2~", [TKEY_DELETE] = "\x1B[3~", + [TKEY_PAGE_UP] = "\x1B[5~", [TKEY_PAGE_DOWN] = "\x1B[6~", + + [TKEY_F1] = "\x1BOP", [TKEY_F2] = "\x1BOQ", + [TKEY_F3] = "\x1BOR", [TKEY_F4] = "\x1BOS", + [TKEY_F5] = "\x1B[15~", [TKEY_F6] = "\x1B[17~", + [TKEY_F7] = "\x1B[18~", [TKEY_F8] = "\x1B[19~", + [TKEY_F9] = "\x1B[20~", [TKEY_F10] = "\x1B[21~", + [TKEY_F11] = "\x1B[23~", [TKEY_F12] = "\x1B[24~", +}; + +const char * +teken_get_sequence(teken_t *t, unsigned int k) +{ + + /* Cons25 mode. */ + if (t->t_stateflags & TS_CONS25 && + k < sizeof special_strings_cons25 / sizeof(char *)) + return (special_strings_cons25[k]); + + /* Cursor keys mode. */ + if (t->t_stateflags & TS_CURSORKEYS && + k < sizeof special_strings_ckeys / sizeof(char *)) + return (special_strings_ckeys[k]); + + /* Default xterm sequences. */ + if (k < sizeof special_strings_normal / sizeof(char *)) + return (special_strings_normal[k]); + + return (NULL); +} + #include "teken_state.h" diff --git a/sys/teken/teken.h b/sys/teken/teken.h index aab037f2526e..36cb71aa1d04 100644 --- a/sys/teken/teken.h +++ b/sys/teken/teken.h @@ -89,14 +89,14 @@ typedef void tf_fill_t(void *, const teken_rect_t *, teken_char_t, typedef void tf_copy_t(void *, const teken_rect_t *, const teken_pos_t *); typedef void tf_param_t(void *, int, unsigned int); #define TP_SHOWCURSOR 0 -#define TP_CURSORKEYS 1 -#define TP_KEYPADAPP 2 -#define TP_AUTOREPEAT 3 -#define TP_SWITCHVT 4 -#define TP_132COLS 5 -#define TP_SETBELLPD 6 +#define TP_KEYPADAPP 1 +#define TP_AUTOREPEAT 2 +#define TP_SWITCHVT 3 +#define TP_132COLS 4 +#define TP_SETBELLPD 5 #define TP_SETBELLPD_PITCH(pd) ((pd) >> 16) #define TP_SETBELLPD_DURATION(pd) ((pd) & 0xffff) +#define TP_MOUSE 6 typedef void tf_respond_t(void *, const void *, size_t); typedef struct { @@ -167,6 +167,33 @@ void teken_set_curattr(teken_t *, const teken_attr_t *); void teken_set_defattr(teken_t *, const teken_attr_t *); void teken_set_winsize(teken_t *, const teken_pos_t *); +/* Key input escape sequences. */ +#define TKEY_UP 0x00 +#define TKEY_DOWN 0x01 +#define TKEY_LEFT 0x02 +#define TKEY_RIGHT 0x03 + +#define TKEY_HOME 0x04 +#define TKEY_END 0x05 +#define TKEY_INSERT 0x06 +#define TKEY_DELETE 0x07 +#define TKEY_PAGE_UP 0x08 +#define TKEY_PAGE_DOWN 0x09 + +#define TKEY_F1 0x0a +#define TKEY_F2 0x0b +#define TKEY_F3 0x0c +#define TKEY_F4 0x0d +#define TKEY_F5 0x0e +#define TKEY_F6 0x0f +#define TKEY_F7 0x10 +#define TKEY_F8 0x11 +#define TKEY_F9 0x12 +#define TKEY_F10 0x13 +#define TKEY_F11 0x14 +#define TKEY_F12 0x15 +const char *teken_get_sequence(teken_t *, unsigned int); + /* Legacy features. */ void teken_set_8bit(teken_t *); void teken_set_cons25(teken_t *); diff --git a/sys/teken/teken_scs.h b/sys/teken/teken_scs.h index 815e1d7f6680..03e88f29d0e6 100644 --- a/sys/teken/teken_scs.h +++ b/sys/teken/teken_scs.h @@ -41,12 +41,12 @@ static const uint16_t teken_boxdrawing_unicode[31] = { 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x00b7 }; -/* CP437 points for VT100 box drawing. */ +/* ASCII points for VT100 box drawing. */ static const uint8_t teken_boxdrawing_8bit[31] = { - 0x04, 0xb1, 0x48, 0x46, 0x43, 0x4c, 0xf8, 0xf1, - 0x4e, 0x56, 0xd9, 0xbf, 0xda, 0xc0, 0xc5, 0xc4, - 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xb4, 0xc1, 0xc2, - 0xb3, 0xf3, 0xf2, 0xe3, 0xd8, 0x9c, 0xfa, + '?', '?', 'H', 'F', 'C', 'L', '?', '?', + 'N', 'V', '+', '+', '+', '+', '+', '-', + '-', '-', '-', '-', '+', '+', '+', '+', + '|', '?', '?', '?', '?', '?', '?', }; static teken_char_t diff --git a/sys/teken/teken_subr.h b/sys/teken/teken_subr.h index 32cae4dcc49d..6bad71e36567 100644 --- a/sys/teken/teken_subr.h +++ b/sys/teken/teken_subr.h @@ -425,10 +425,11 @@ teken_subr_delete_line(teken_t *t, unsigned int nrows) } static void -teken_subr_device_control_string(teken_t *t __unused) +teken_subr_device_control_string(teken_t *t) { - teken_printf("device control string???\n"); + teken_printf("Unsupported device control string\n"); + t->t_stateflags |= TS_INSTRING; } static void @@ -743,6 +744,14 @@ teken_subr_next_line(teken_t *t) teken_subr_newline(t); } +static void +teken_subr_operating_system_command(teken_t *t) +{ + + teken_printf("Unsupported operating system command\n"); + t->t_stateflags |= TS_INSTRING; +} + static void teken_subr_pan_down(teken_t *t, unsigned int nrows) { @@ -894,7 +903,7 @@ teken_subr_reset_dec_mode(teken_t *t, unsigned int cmd) switch (cmd) { case 1: /* Cursor keys mode. */ - teken_funcs_param(t, TP_CURSORKEYS, 0); + t->t_stateflags &= ~TS_CURSORKEYS; break; case 2: /* DECANM: ANSI/VT52 mode. */ teken_printf("DECRST VT52\n"); @@ -932,6 +941,9 @@ teken_subr_reset_dec_mode(teken_t *t, unsigned int cmd) case 47: /* Switch to alternate buffer. */ teken_printf("Switch to alternate buffer\n"); break; + case 1000: /* Mouse input. */ + teken_funcs_param(t, TP_MOUSE, 0); + break; default: teken_printf("Unknown DECRST: %u\n", cmd); } @@ -1040,7 +1052,7 @@ teken_subr_set_dec_mode(teken_t *t, unsigned int cmd) switch (cmd) { case 1: /* Cursor keys mode. */ - teken_funcs_param(t, TP_CURSORKEYS, 1); + t->t_stateflags |= TS_CURSORKEYS; break; case 2: /* DECANM: ANSI/VT52 mode. */ teken_printf("DECSET VT52\n"); @@ -1078,6 +1090,9 @@ teken_subr_set_dec_mode(teken_t *t, unsigned int cmd) case 47: /* Switch to alternate buffer. */ teken_printf("Switch away from alternate buffer\n"); break; + case 1000: /* Mouse input. */ + teken_funcs_param(t, TP_MOUSE, 1); + break; default: teken_printf("Unknown DECSET: %u\n", cmd); } @@ -1222,16 +1237,17 @@ teken_subr_set_top_and_bottom_margins(teken_t *t, unsigned int top, bottom = t->t_winsize.tp_row; } + /* Apply scrolling region. */ t->t_scrollreg.ts_begin = top; t->t_scrollreg.ts_end = bottom; - if (t->t_stateflags & TS_ORIGIN) { - /* XXX: home cursor? */ + if (t->t_stateflags & TS_ORIGIN) t->t_originreg = t->t_scrollreg; - t->t_cursor.tp_row = t->t_originreg.ts_begin; - t->t_cursor.tp_col = 0; - t->t_stateflags &= ~TS_WRAPPED; - teken_funcs_cursor(t); - } + + /* Home cursor to the top left of the scrolling region. */ + t->t_cursor.tp_row = t->t_originreg.ts_begin; + t->t_cursor.tp_col = 0; + t->t_stateflags &= ~TS_WRAPPED; + teken_funcs_cursor(t); } static void @@ -1252,7 +1268,10 @@ static void teken_subr_string_terminator(teken_t *t __unused) { - teken_printf("string terminator???\n"); + /* + * Strings are already terminated in teken_input_char() when ^[ + * is inserted. + */ } static void diff --git a/sys/tools/fw_stub.awk b/sys/tools/fw_stub.awk index ddcca017f424..05e2f32ec974 100644 --- a/sys/tools/fw_stub.awk +++ b/sys/tools/fw_stub.awk @@ -118,8 +118,14 @@ if (!num_files || !opt_m) cfilename = opt_c; ctmpfilename = cfilename ".tmp"; +modname = opt_m; +gsub(/[-\.]/, "_", modname); -printc("#include \ +printc("/*\ + * Automatically generated by:\ + * $FreeBSD$\ + */\ +#include \ #include \ #include \ #include \ @@ -139,7 +145,7 @@ for (file_i = 0; file_i < num_files; file_i++) { } printc("\nstatic int\n"\ -opt_m "_fw_modevent(module_t mod, int type, void *unused)\ +modname "_fw_modevent(module_t mod, int type, void *unused)\ {\ const struct firmware *fp, *parent;\ int error;\ @@ -206,14 +212,14 @@ printc("\t\treturn (error);\ return (EINVAL);\ }\ \ -static moduledata_t " opt_m "_fw_mod = {\ - \"" opt_m "_fw\",\ - " opt_m "_fw_modevent,\ +static moduledata_t " modname "_fw_mod = {\ + \"" modname "_fw\",\ + " modname "_fw_modevent,\ 0\ };\ -DECLARE_MODULE(" opt_m "_fw, " opt_m "_fw_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);\ -MODULE_VERSION(" opt_m "_fw, 1);\ -MODULE_DEPEND(" opt_m "_fw, firmware, 1, 1, 1);\ +DECLARE_MODULE(" modname "_fw, " modname "_fw_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);\ +MODULE_VERSION(" modname "_fw, 1);\ +MODULE_DEPEND(" modname "_fw, firmware, 1, 1, 1);\ "); if (opt_c) diff --git a/sys/tools/makeobjops.awk b/sys/tools/makeobjops.awk index 61994f36e588..0406b8550477 100644 --- a/sys/tools/makeobjops.awk +++ b/sys/tools/makeobjops.awk @@ -240,7 +240,7 @@ function handle_method (static, doc) lineno++ } - default = ""; + default_function = ""; if (!match(line, /\};?/)) { warnsrc("Premature end of file"); error = 1; @@ -248,9 +248,9 @@ function handle_method (static, doc) } extra = substr(line, RSTART + RLENGTH); if (extra ~ /[ ]*DEFAULT[ ]*[a-zA-Z_][a-zA-Z_0-9]*[ ]*;/) { - default = extra; - sub(/.*DEFAULT[ ]*/, "", default); - sub(/[; ]+.*$/, "", default); + default_function = extra; + sub(/.*DEFAULT[ ]*/, "", default_function); + sub(/[; ]+.*$/, "", default_function); } else if (extra && opt_d) { # Warn about garbage at end of line. @@ -294,8 +294,8 @@ function handle_method (static, doc) firstvar = varnames[1]; - if (default == "") - default = "kobj_error_method"; + if (default_function == "") + default_function = "kobj_error_method"; # the method description printh("/** @brief Unique descriptor for the " umname "() method */"); @@ -308,7 +308,7 @@ function handle_method (static, doc) # Print out the method desc printc("struct kobj_method " mname "_method_default = {"); - printc("\t&" mname "_desc, (kobjop_t) " default); + printc("\t&" mname "_desc, (kobjop_t) " default_function); printc("};\n"); printc("struct kobjop_desc " mname "_desc = {"); diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index b4f001e6c677..7bf117719726 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -76,9 +77,13 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include +#include + +#include #include #include #include @@ -88,24 +93,25 @@ __FBSDID("$FreeBSD$"); #include #include -typedef ufs2_daddr_t allocfcn_t(struct inode *ip, int cg, ufs2_daddr_t bpref, +typedef ufs2_daddr_t allocfcn_t(struct inode *ip, u_int cg, ufs2_daddr_t bpref, int size); -static ufs2_daddr_t ffs_alloccg(struct inode *, int, ufs2_daddr_t, int); +static ufs2_daddr_t ffs_alloccg(struct inode *, u_int, ufs2_daddr_t, int); static ufs2_daddr_t ffs_alloccgblk(struct inode *, struct buf *, ufs2_daddr_t); #ifdef INVARIANTS static int ffs_checkblk(struct inode *, ufs2_daddr_t, long); #endif -static ufs2_daddr_t ffs_clusteralloc(struct inode *, int, ufs2_daddr_t, int); +static ufs2_daddr_t ffs_clusteralloc(struct inode *, u_int, ufs2_daddr_t, int); static void ffs_clusteracct(struct ufsmount *, struct fs *, struct cg *, ufs1_daddr_t, int); static ino_t ffs_dirpref(struct inode *); -static ufs2_daddr_t ffs_fragextend(struct inode *, int, ufs2_daddr_t, int, int); +static ufs2_daddr_t ffs_fragextend(struct inode *, u_int, ufs2_daddr_t, + int, int); static void ffs_fserr(struct fs *, ino_t, char *); static ufs2_daddr_t ffs_hashalloc - (struct inode *, int, ufs2_daddr_t, int, allocfcn_t *); -static ufs2_daddr_t ffs_nodealloccg(struct inode *, int, ufs2_daddr_t, int); + (struct inode *, u_int, ufs2_daddr_t, int, allocfcn_t *); +static ufs2_daddr_t ffs_nodealloccg(struct inode *, u_int, ufs2_daddr_t, int); static ufs1_daddr_t ffs_mapsearch(struct fs *, struct cg *, ufs2_daddr_t, int); static int ffs_reallocblks_ufs1(struct vop_reallocblks_args *); static int ffs_reallocblks_ufs2(struct vop_reallocblks_args *); @@ -140,7 +146,7 @@ ffs_alloc(ip, lbn, bpref, size, flags, cred, bnp) struct fs *fs; struct ufsmount *ump; ufs2_daddr_t bno; - int cg, reclaimed; + u_int cg, reclaimed; static struct timeval lastfail; static int curfail; int64_t delta; @@ -243,7 +249,8 @@ ffs_realloccg(ip, lbprev, bprev, bpref, osize, nsize, flags, cred, bpp) struct fs *fs; struct buf *bp; struct ufsmount *ump; - int cg, request, error, reclaimed; + u_int cg, request, reclaimed; + int error; ufs2_daddr_t bno; static struct timeval lastfail; static int curfail; @@ -425,8 +432,10 @@ nospace: reclaimed = 1; softdep_request_cleanup(fs, vp); UFS_UNLOCK(ump); - if (bp) + if (bp) { brelse(bp); + bp = NULL; + } UFS_LOCK(ump); goto retry; } @@ -928,7 +937,8 @@ ffs_valloc(pvp, mode, cred, vpp) struct timespec ts; struct ufsmount *ump; ino_t ino, ipref; - int cg, error, error1; + u_int cg; + int error, error1; static struct timeval lastfail; static int curfail; @@ -1038,11 +1048,11 @@ ffs_dirpref(pip) struct inode *pip; { struct fs *fs; - int cg, prefcg, dirsize, cgsize; - int avgifree, avgbfree, avgndir, curdirsize; - int minifree, minbfree, maxndir; - int mincg, minndir; - int maxcontigdirs; + u_int cg, prefcg, dirsize, cgsize; + u_int avgifree, avgbfree, avgndir, curdirsize; + u_int minifree, minbfree, maxndir; + u_int mincg, minndir; + u_int maxcontigdirs; mtx_assert(UFS_MTX(pip->i_ump), MA_OWNED); fs = pip->i_fs; @@ -1166,8 +1176,8 @@ ffs_blkpref_ufs1(ip, lbn, indx, bap) ufs1_daddr_t *bap; { struct fs *fs; - int cg; - int avgbfree, startcg; + u_int cg; + u_int avgbfree, startcg; mtx_assert(UFS_MTX(ip->i_ump), MA_OWNED); fs = ip->i_fs; @@ -1216,8 +1226,8 @@ ffs_blkpref_ufs2(ip, lbn, indx, bap) ufs2_daddr_t *bap; { struct fs *fs; - int cg; - int avgbfree, startcg; + u_int cg; + u_int avgbfree, startcg; mtx_assert(UFS_MTX(ip->i_ump), MA_OWNED); fs = ip->i_fs; @@ -1270,14 +1280,14 @@ ffs_blkpref_ufs2(ip, lbn, indx, bap) static ufs2_daddr_t ffs_hashalloc(ip, cg, pref, size, allocator) struct inode *ip; - int cg; + u_int cg; ufs2_daddr_t pref; int size; /* size for data blocks, mode for inodes */ allocfcn_t *allocator; { struct fs *fs; ufs2_daddr_t result; - int i, icg = cg; + u_int i, icg = cg; mtx_assert(UFS_MTX(ip->i_ump), MA_OWNED); #ifdef INVARIANTS @@ -1328,7 +1338,7 @@ ffs_hashalloc(ip, cg, pref, size, allocator) static ufs2_daddr_t ffs_fragextend(ip, cg, bprev, osize, nsize) struct inode *ip; - int cg; + u_int cg; ufs2_daddr_t bprev; int osize, nsize; { @@ -1411,7 +1421,7 @@ fail: static ufs2_daddr_t ffs_alloccg(ip, cg, bpref, size) struct inode *ip; - int cg; + u_int cg; ufs2_daddr_t bpref; int size; { @@ -1581,7 +1591,7 @@ gotit: static ufs2_daddr_t ffs_clusteralloc(ip, cg, bpref, len) struct inode *ip; - int cg; + u_int cg; ufs2_daddr_t bpref; int len; { @@ -1705,7 +1715,7 @@ fail: static ufs2_daddr_t ffs_nodealloccg(ip, cg, ipref, mode) struct inode *ip; - int cg; + u_int cg; ufs2_daddr_t ipref; int mode; { @@ -1806,7 +1816,7 @@ gotit: bdwrite(bp); if (ibp != NULL) bawrite(ibp); - return (cg * fs->fs_ipg + ipref); + return ((ino_t)(cg * fs->fs_ipg + ipref)); } /* @@ -1851,7 +1861,8 @@ ffs_blkfree(ump, fs, devvp, bno, size, inum) struct buf *bp; ufs1_daddr_t fragno, cgbno; ufs2_daddr_t cgblkno; - int i, cg, blk, frags, bbase; + int i, blk, frags, bbase; + u_int cg; u_int8_t *blksfree; struct cdev *dev; @@ -2049,7 +2060,8 @@ ffs_freefile(ump, fs, devvp, ino, mode) struct cg *cgp; struct buf *bp; ufs2_daddr_t cgbno; - int error, cg; + int error; + u_int cg; u_int8_t *inosused; struct cdev *dev; @@ -2063,7 +2075,7 @@ ffs_freefile(ump, fs, devvp, ino, mode) dev = devvp->v_rdev; cgbno = fsbtodb(fs, cgtod(fs, cg)); } - if ((u_int)ino >= fs->fs_ipg * fs->fs_ncg) + if (ino >= fs->fs_ipg * fs->fs_ncg) panic("ffs_freefile: range: dev = %s, ino = %lu, fs = %s", devtoname(dev), (u_long)ino, fs->fs_fsmnt); if ((error = bread(devvp, cgbno, (int)fs->fs_cgsize, NOCRED, &bp))) { @@ -2080,8 +2092,8 @@ ffs_freefile(ump, fs, devvp, ino, mode) inosused = cg_inosused(cgp); ino %= fs->fs_ipg; if (isclr(inosused, ino)) { - printf("dev = %s, ino = %lu, fs = %s\n", devtoname(dev), - (u_long)ino + cg * fs->fs_ipg, fs->fs_fsmnt); + printf("dev = %s, ino = %u, fs = %s\n", devtoname(dev), + ino + cg * fs->fs_ipg, fs->fs_fsmnt); if (fs->fs_ronly == 0) panic("ffs_freefile: freeing free inode"); } @@ -2116,7 +2128,8 @@ ffs_checkfreefile(fs, devvp, ino) struct cg *cgp; struct buf *bp; ufs2_daddr_t cgbno; - int ret, cg; + int ret; + u_int cg; u_int8_t *inosused; cg = ino_to_cg(fs, ino); @@ -2127,7 +2140,7 @@ ffs_checkfreefile(fs, devvp, ino) /* devvp is a normal disk device */ cgbno = fsbtodb(fs, cgtod(fs, cg)); } - if ((u_int)ino >= fs->fs_ipg * fs->fs_ncg) + if (ino >= fs->fs_ipg * fs->fs_ncg) return (1); if (bread(devvp, cgbno, (int)fs->fs_cgsize, NOCRED, &bp)) { brelse(bp); @@ -2328,7 +2341,7 @@ ffs_fserr(fs, inum, cp) /* * This function provides the capability for the fsck program to - * update an active filesystem. Eleven operations are provided: + * update an active filesystem. Fourteen operations are provided: * * adjrefcnt(inode, amt) - adjusts the reference count on the * specified inode by the specified amount. Under normal @@ -2349,6 +2362,12 @@ ffs_fserr(fs, inum, cp) * as in use. * setflags(flags, set/clear) - the fs_flags field has the specified * flags set (second parameter +1) or cleared (second parameter -1). + * setcwd(dirinode) - set the current directory to dirinode in the + * filesystem associated with the snapshot. + * setdotdot(oldvalue, newvalue) - Verify that the inode number for ".." + * in the current directory is oldvalue then change it to newvalue. + * unlink(nameptr, oldvalue) - Verify that the inode number associated + * with nameptr in the current directory is oldvalue then unlink it. */ static int sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS); @@ -2386,6 +2405,15 @@ static SYSCTL_NODE(_vfs_ffs, FFS_BLK_FREE, freeblks, CTLFLAG_WR, static SYSCTL_NODE(_vfs_ffs, FFS_SET_FLAGS, setflags, CTLFLAG_WR, sysctl_ffs_fsck, "Change Filesystem Flags"); +static SYSCTL_NODE(_vfs_ffs, FFS_SET_CWD, setcwd, CTLFLAG_WR, + sysctl_ffs_fsck, "Set Current Working Directory"); + +static SYSCTL_NODE(_vfs_ffs, FFS_SET_DOTDOT, setdotdot, CTLFLAG_WR, + sysctl_ffs_fsck, "Change Value of .. Entry"); + +static SYSCTL_NODE(_vfs_ffs, FFS_UNLINK, unlink, CTLFLAG_WR, + sysctl_ffs_fsck, "Unlink a Duplicate Name"); + #ifdef DEBUG static int fsckcmds = 0; SYSCTL_INT(_debug, OID_AUTO, fsckcmds, CTLFLAG_RW, &fsckcmds, 0, ""); @@ -2394,16 +2422,18 @@ SYSCTL_INT(_debug, OID_AUTO, fsckcmds, CTLFLAG_RW, &fsckcmds, 0, ""); static int sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) { + struct thread *td = curthread; struct fsck_cmd cmd; struct ufsmount *ump; - struct vnode *vp; - struct inode *ip; + struct vnode *vp, *vpold, *dvp, *fdvp; + struct inode *ip, *dp; struct mount *mp; struct fs *fs; ufs2_daddr_t blkno; long blkcnt, blksize; + struct filedesc *fdp; struct file *fp; - int filetype, error; + int vfslocked, filetype, error; if (req->newlen > sizeof cmd) return (EBADRPC); @@ -2413,15 +2443,20 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) return (ERPCMISMATCH); if ((error = getvnode(curproc->p_fd, cmd.handle, &fp)) != 0) return (error); - vn_start_write(fp->f_data, &mp, V_WAIT); + vp = fp->f_data; + if (vp->v_type != VREG && vp->v_type != VDIR) { + fdrop(fp, td); + return (EINVAL); + } + vn_start_write(vp, &mp, V_WAIT); if (mp == 0 || strncmp(mp->mnt_stat.f_fstypename, "ufs", MFSNAMELEN)) { vn_finished_write(mp); - fdrop(fp, curthread); + fdrop(fp, td); return (EINVAL); } if (mp->mnt_flag & MNT_RDONLY) { vn_finished_write(mp); - fdrop(fp, curthread); + fdrop(fp, td); return (EROFS); } ump = VFSTOUFS(mp); @@ -2553,6 +2588,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) #endif /* DEBUG */ fs->fs_cstotal.cs_ndir += cmd.value; break; + case FFS_ADJ_NBFREE: #ifdef DEBUG if (fsckcmds) { @@ -2562,6 +2598,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) #endif /* DEBUG */ fs->fs_cstotal.cs_nbfree += cmd.value; break; + case FFS_ADJ_NIFREE: #ifdef DEBUG if (fsckcmds) { @@ -2571,6 +2608,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) #endif /* DEBUG */ fs->fs_cstotal.cs_nifree += cmd.value; break; + case FFS_ADJ_NFFREE: #ifdef DEBUG if (fsckcmds) { @@ -2580,6 +2618,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) #endif /* DEBUG */ fs->fs_cstotal.cs_nffree += cmd.value; break; + case FFS_ADJ_NUMCLUSTERS: #ifdef DEBUG if (fsckcmds) { @@ -2590,6 +2629,91 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) fs->fs_cstotal.cs_numclusters += cmd.value; break; + case FFS_SET_CWD: +#ifdef DEBUG + if (fsckcmds) { + printf("%s: set current directory to inode %jd\n", + mp->mnt_stat.f_mntonname, (intmax_t)cmd.value); + } +#endif /* DEBUG */ + if ((error = ffs_vget(mp, (ino_t)cmd.value, LK_SHARED, &vp))) + break; + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + AUDIT_ARG_VNODE1(vp); + if ((error = change_dir(vp, td)) != 0) { + vput(vp); + VFS_UNLOCK_GIANT(vfslocked); + break; + } + VOP_UNLOCK(vp, 0); + VFS_UNLOCK_GIANT(vfslocked); + fdp = td->td_proc->p_fd; + FILEDESC_XLOCK(fdp); + vpold = fdp->fd_cdir; + fdp->fd_cdir = vp; + FILEDESC_XUNLOCK(fdp); + vfslocked = VFS_LOCK_GIANT(vpold->v_mount); + vrele(vpold); + VFS_UNLOCK_GIANT(vfslocked); + break; + + case FFS_SET_DOTDOT: +#ifdef DEBUG + if (fsckcmds) { + printf("%s: change .. in cwd from %jd to %jd\n", + mp->mnt_stat.f_mntonname, (intmax_t)cmd.value, + (intmax_t)cmd.size); + } +#endif /* DEBUG */ + /* + * First we have to get and lock the parent directory + * to which ".." points. + */ + error = ffs_vget(mp, (ino_t)cmd.value, LK_EXCLUSIVE, &fdvp); + if (error) + break; + /* + * Now we get and lock the child directory containing "..". + */ + FILEDESC_SLOCK(td->td_proc->p_fd); + dvp = td->td_proc->p_fd->fd_cdir; + FILEDESC_SUNLOCK(td->td_proc->p_fd); + if ((error = vget(dvp, LK_EXCLUSIVE, td)) != 0) { + vput(fdvp); + break; + } + dp = VTOI(dvp); + dp->i_offset = 12; /* XXX mastertemplate.dot_reclen */ + error = ufs_dirrewrite(dp, VTOI(fdvp), (ino_t)cmd.size, + DT_DIR, 0); + cache_purge(fdvp); + cache_purge(dvp); + vput(dvp); + vput(fdvp); + break; + + case FFS_UNLINK: +#ifdef DEBUG + if (fsckcmds) { + char buf[32]; + + if (copyinstr((char *)(intptr_t)cmd.value, buf,32,NULL)) + strncpy(buf, "Name_too_long", 32); + printf("%s: unlink %s (inode %jd)\n", + mp->mnt_stat.f_mntonname, buf, (intmax_t)cmd.size); + } +#endif /* DEBUG */ + /* + * kern_unlinkat will do its own start/finish writes and + * they do not nest, so drop ours here. Setting mp == NULL + * indicates that vn_finished_write is not needed down below. + */ + vn_finished_write(mp); + mp = NULL; + error = kern_unlinkat(td, AT_FDCWD, (char *)(intptr_t)cmd.value, + UIO_USERSPACE, (ino_t)cmd.size); + break; + default: #ifdef DEBUG if (fsckcmds) { @@ -2601,7 +2725,7 @@ sysctl_ffs_fsck(SYSCTL_HANDLER_ARGS) break; } - fdrop(fp, curthread); + fdrop(fp, td); vn_finished_write(mp); return (error); } diff --git a/sys/ufs/ffs/ffs_rawread.c b/sys/ufs/ffs/ffs_rawread.c index 434c833f7c3e..574d89c57d33 100644 --- a/sys/ufs/ffs/ffs_rawread.c +++ b/sys/ufs/ffs/ffs_rawread.c @@ -101,6 +101,7 @@ ffs_rawread_sync(struct vnode *vp) int upgraded; struct bufobj *bo; struct mount *mp; + vm_object_t obj; /* Check for dirty mmap, pending writes and dirty buffers */ bo = &vp->v_bufobj; @@ -108,7 +109,8 @@ ffs_rawread_sync(struct vnode *vp) VI_LOCK(vp); if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0 || - (vp->v_iflag & VI_OBJDIRTY) != 0) { + ((obj = vp->v_object) != NULL && + (obj->flags & OBJ_MIGHTBEDIRTY) != 0)) { VI_UNLOCK(vp); BO_UNLOCK(bo); @@ -138,13 +140,12 @@ ffs_rawread_sync(struct vnode *vp) return (EIO); } /* Attempt to msync mmap() regions to clean dirty mmap */ - if ((vp->v_iflag & VI_OBJDIRTY) != 0) { + if ((obj = vp->v_object) != NULL && + (obj->flags & OBJ_MIGHTBEDIRTY) != 0) { VI_UNLOCK(vp); - if (vp->v_object != NULL) { - VM_OBJECT_LOCK(vp->v_object); - vm_object_page_clean(vp->v_object, 0, 0, OBJPC_SYNC); - VM_OBJECT_UNLOCK(vp->v_object); - } + VM_OBJECT_LOCK(obj); + vm_object_page_clean(obj, 0, 0, OBJPC_SYNC); + VM_OBJECT_UNLOCK(obj); } else VI_UNLOCK(vp); diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index a6e73f53c5fc..b36cb58808bd 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -739,7 +739,7 @@ out1: auio.uio_iovcnt = 1; aiov.iov_base = (void *)snapblklist; aiov.iov_len = snaplistsize * sizeof(daddr_t); - auio.uio_resid = aiov.iov_len;; + auio.uio_resid = aiov.iov_len; auio.uio_offset = ip->i_size; auio.uio_segflg = UIO_SYSSPACE; auio.uio_rw = UIO_WRITE; diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index d3d7c2c60730..8aa9f9c53a4c 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -128,7 +128,7 @@ static struct buf_ops ffs_ops = { static const char *ffs_opts[] = { "acls", "async", "noatime", "noclusterr", "noclusterw", "noexec", "export", "force", "from", "multilabel", "snapshot", "nosuid", "suiddir", "nosymfollow", "sync", - "union", NULL }; + "union", "nfsv4acls", NULL }; static int ffs_mount(struct mount *mp) @@ -138,7 +138,7 @@ ffs_mount(struct mount *mp) struct ufsmount *ump = 0; struct fs *fs; int error, flags; - u_int mntorflags, mntandnotflags; + u_int mntorflags; accmode_t accmode; struct nameidata ndp; char *fspec; @@ -163,7 +163,6 @@ ffs_mount(struct mount *mp) return (error); mntorflags = 0; - mntandnotflags = 0; if (vfs_getopt(mp->mnt_optnew, "acls", NULL, NULL) == 0) mntorflags |= MNT_ACLS; @@ -177,8 +176,17 @@ ffs_mount(struct mount *mp) vfs_deleteopt(mp->mnt_opt, "snapshot"); } + if (vfs_getopt(mp->mnt_optnew, "nfsv4acls", NULL, NULL) == 0) { + if (mntorflags & MNT_ACLS) { + printf("WARNING: \"acls\" and \"nfsv4acls\" " + "options are mutually exclusive\n"); + return (EINVAL); + } + mntorflags |= MNT_NFS4ACLS; + } + MNT_ILOCK(mp); - mp->mnt_flag = (mp->mnt_flag | mntorflags) & ~mntandnotflags; + mp->mnt_flag |= mntorflags; MNT_IUNLOCK(mp); /* * If updating, check whether changing from read-only to @@ -360,6 +368,13 @@ ffs_mount(struct mount *mp) MNT_IUNLOCK(mp); } + if ((fs->fs_flags & FS_NFS4ACLS) != 0) { + /* XXX: Set too late ? */ + MNT_ILOCK(mp); + mp->mnt_flag |= MNT_NFS4ACLS; + MNT_IUNLOCK(mp); + } + /* * If this is a snapshot request, take the snapshot. */ @@ -834,7 +849,13 @@ ffs_mountfs(devvp, mp, td) if ((fs->fs_flags & FS_ACLS) != 0) { #ifdef UFS_ACL MNT_ILOCK(mp); + + if (mp->mnt_flag & MNT_NFS4ACLS) + printf("WARNING: ACLs flag on fs conflicts with " + "\"nfsv4acls\" mount option; option ignored\n"); + mp->mnt_flag &= ~MNT_NFS4ACLS; mp->mnt_flag |= MNT_ACLS; + MNT_IUNLOCK(mp); #else printf( @@ -842,6 +863,24 @@ ffs_mountfs(devvp, mp, td) mp->mnt_stat.f_mntonname); #endif } + if ((fs->fs_flags & FS_NFS4ACLS) != 0) { +#ifdef UFS_ACL + MNT_ILOCK(mp); + + if (mp->mnt_flag & MNT_ACLS) + printf("WARNING: NFSv4 ACLs flag on fs conflicts with " + "\"acls\" mount option; option ignored\n"); + mp->mnt_flag &= ~MNT_ACLS; + mp->mnt_flag |= MNT_NFS4ACLS; + + MNT_IUNLOCK(mp); +#else + printf( +"WARNING: %s: NFSv4 ACLs flag on fs but no ACLs support\n", + mp->mnt_stat.f_mntonname); +#endif + } + ump->um_mountp = mp; ump->um_dev = dev; ump->um_devvp = devvp; diff --git a/sys/ufs/ffs/fs.h b/sys/ufs/ffs/fs.h index 7da18ea6c096..5452e2be6de2 100644 --- a/sys/ufs/ffs/fs.h +++ b/sys/ufs/ffs/fs.h @@ -211,7 +211,10 @@ #define FFS_ADJ_NIFREE 9 /* adjust number of free inodes */ #define FFS_ADJ_NFFREE 10 /* adjust number of free frags */ #define FFS_ADJ_NUMCLUSTERS 11 /* adjust number of free clusters */ -#define FFS_MAXID 12 /* number of valid ffs ids */ +#define FFS_SET_CWD 12 /* set current directory */ +#define FFS_SET_DOTDOT 13 /* set inode number for ".." */ +#define FFS_UNLINK 14 /* remove a name in the filesystem */ +#define FFS_MAXID 15 /* number of valid ffs ids */ /* * Command structure passed in to the filesystem to adjust filesystem values. @@ -261,7 +264,7 @@ struct fs { int32_t fs_old_time; /* last time written */ int32_t fs_old_size; /* number of blocks in fs */ int32_t fs_old_dsize; /* number of data blocks in fs */ - int32_t fs_ncg; /* number of cylinder groups */ + u_int32_t fs_ncg; /* number of cylinder groups */ int32_t fs_bsize; /* size of basic blocks in fs */ int32_t fs_fsize; /* size of frag blocks in fs */ int32_t fs_frag; /* number of frags in a block in fs */ @@ -284,7 +287,7 @@ struct fs { int32_t fs_spare1[2]; /* old fs_csmask */ /* old fs_csshift */ int32_t fs_nindir; /* value of NINDIR */ - int32_t fs_inopb; /* value of INOPB */ + u_int32_t fs_inopb; /* value of INOPB */ int32_t fs_old_nspf; /* value of NSPF */ /* yet another configuration parameter */ int32_t fs_optim; /* optimization preference, see below */ @@ -301,7 +304,7 @@ struct fs { int32_t fs_old_spc; /* sectors per cylinder */ int32_t fs_old_ncyl; /* cylinders in filesystem */ int32_t fs_old_cpg; /* cylinders per group */ - int32_t fs_ipg; /* inodes per group */ + u_int32_t fs_ipg; /* inodes per group */ int32_t fs_fpg; /* blocks per group * fs_frag */ /* this data must be re-computed after crashes */ struct csum fs_old_cstotal; /* cylinder summary information */ @@ -332,10 +335,10 @@ struct fs { int64_t fs_dsize; /* number of data blocks in fs */ ufs2_daddr_t fs_csaddr; /* blk addr of cyl grp summary area */ int64_t fs_pendingblocks; /* (u) blocks being freed */ - int32_t fs_pendinginodes; /* (u) inodes being freed */ - int32_t fs_snapinum[FSMAXSNAP];/* list of snapshot inode numbers */ - int32_t fs_avgfilesize; /* expected average file size */ - int32_t fs_avgfpdir; /* expected # of files per directory */ + u_int32_t fs_pendinginodes; /* (u) inodes being freed */ + ino_t fs_snapinum[FSMAXSNAP];/* list of snapshot inode numbers */ + u_int32_t fs_avgfilesize; /* expected average file size */ + u_int32_t fs_avgfpdir; /* expected # of files per directory */ int32_t fs_save_cgsize; /* save real cg size to use fs_bsize */ int32_t fs_sparecon32[26]; /* reserved for future constants */ int32_t fs_flags; /* see FS_ flags below */ @@ -393,22 +396,24 @@ CTASSERT(sizeof(struct fs) == 1376); * flag to indicate that the indicies need to be rebuilt (by fsck) before * they can be used. * - * FS_ACLS indicates that ACLs are administratively enabled for the - * file system, so they should be loaded from extended attributes, + * FS_ACLS indicates that POSIX.1e ACLs are administratively enabled + * for the file system, so they should be loaded from extended attributes, * observed for access control purposes, and be administered by object - * owners. FS_MULTILABEL indicates that the TrustedBSD MAC Framework - * should attempt to back MAC labels into extended attributes on the - * file system rather than maintain a single mount label for all - * objects. + * owners. FS_NFS4ACLS indicates that NFSv4 ACLs are administratively + * enabled. This flag is mutually exclusive with FS_ACLS. FS_MULTILABEL + * indicates that the TrustedBSD MAC Framework should attempt to back MAC + * labels into extended attributes on the file system rather than maintain + * a single mount label for all objects. */ -#define FS_UNCLEAN 0x01 /* filesystem not clean at mount */ -#define FS_DOSOFTDEP 0x02 /* filesystem using soft dependencies */ -#define FS_NEEDSFSCK 0x04 /* filesystem needs sync fsck before mount */ -#define FS_INDEXDIRS 0x08 /* kernel supports indexed directories */ -#define FS_ACLS 0x10 /* file system has ACLs enabled */ -#define FS_MULTILABEL 0x20 /* file system is MAC multi-label */ -#define FS_GJOURNAL 0x40 /* gjournaled file system */ -#define FS_FLAGS_UPDATED 0x80 /* flags have been moved to new location */ +#define FS_UNCLEAN 0x0001 /* filesystem not clean at mount */ +#define FS_DOSOFTDEP 0x0002 /* filesystem using soft dependencies */ +#define FS_NEEDSFSCK 0x0004 /* filesystem needs sync fsck before mount */ +#define FS_INDEXDIRS 0x0008 /* kernel supports indexed directories */ +#define FS_ACLS 0x0010 /* file system has POSIX.1e ACLs enabled */ +#define FS_MULTILABEL 0x0020 /* file system is MAC multi-label */ +#define FS_GJOURNAL 0x0040 /* gjournaled file system */ +#define FS_FLAGS_UPDATED 0x0080 /* flags have been moved to new location */ +#define FS_NFS4ACLS 0x0100 /* file system has NFSv4 ACLs enabled */ /* * Macros to access bits in the fs_active array. @@ -458,26 +463,26 @@ struct cg { int32_t cg_firstfield; /* historic cyl groups linked list */ int32_t cg_magic; /* magic number */ int32_t cg_old_time; /* time last written */ - int32_t cg_cgx; /* we are the cgx'th cylinder group */ + u_int32_t cg_cgx; /* we are the cgx'th cylinder group */ int16_t cg_old_ncyl; /* number of cyl's this cg */ int16_t cg_old_niblk; /* number of inode blocks this cg */ - int32_t cg_ndblk; /* number of data blocks this cg */ - struct csum cg_cs; /* cylinder summary information */ - int32_t cg_rotor; /* position of last used block */ - int32_t cg_frotor; /* position of last used frag */ - int32_t cg_irotor; /* position of last used inode */ - int32_t cg_frsum[MAXFRAG]; /* counts of available frags */ + u_int32_t cg_ndblk; /* number of data blocks this cg */ + struct csum cg_cs; /* cylinder summary information */ + u_int32_t cg_rotor; /* position of last used block */ + u_int32_t cg_frotor; /* position of last used frag */ + u_int32_t cg_irotor; /* position of last used inode */ + u_int32_t cg_frsum[MAXFRAG]; /* counts of available frags */ int32_t cg_old_btotoff; /* (int32) block totals per cylinder */ int32_t cg_old_boff; /* (u_int16) free block positions */ - int32_t cg_iusedoff; /* (u_int8) used inode map */ - int32_t cg_freeoff; /* (u_int8) free block map */ - int32_t cg_nextfreeoff; /* (u_int8) next available space */ - int32_t cg_clustersumoff; /* (u_int32) counts of avail clusters */ - int32_t cg_clusteroff; /* (u_int8) free cluster map */ - int32_t cg_nclusterblks; /* number of clusters this cg */ - int32_t cg_niblk; /* number of inode blocks this cg */ - int32_t cg_initediblk; /* last initialized inode */ - int32_t cg_unrefs; /* number of unreferenced inodes */ + u_int32_t cg_iusedoff; /* (u_int8) used inode map */ + u_int32_t cg_freeoff; /* (u_int8) free block map */ + u_int32_t cg_nextfreeoff; /* (u_int8) next available space */ + u_int32_t cg_clustersumoff; /* (u_int32) counts of avail clusters */ + u_int32_t cg_clusteroff; /* (u_int8) free cluster map */ + u_int32_t cg_nclusterblks; /* number of clusters this cg */ + u_int32_t cg_niblk; /* number of inode blocks this cg */ + u_int32_t cg_initediblk; /* last initialized inode */ + u_int32_t cg_unrefs; /* number of unreferenced inodes */ int32_t cg_sparecon32[2]; /* reserved for future use */ ufs_time_t cg_time; /* time last written */ int64_t cg_sparecon64[3]; /* reserved for future use */ @@ -524,11 +529,11 @@ struct cg { * inode number to cylinder group number. * inode number to filesystem block address. */ -#define ino_to_cg(fs, x) ((x) / (fs)->fs_ipg) +#define ino_to_cg(fs, x) (((ino_t)(x)) / (fs)->fs_ipg) #define ino_to_fsba(fs, x) \ - ((ufs2_daddr_t)(cgimin(fs, ino_to_cg(fs, x)) + \ - (blkstofrags((fs), (((x) % (fs)->fs_ipg) / INOPB(fs)))))) -#define ino_to_fsbo(fs, x) ((x) % INOPB(fs)) + ((ufs2_daddr_t)(cgimin(fs, ino_to_cg(fs, (ino_t)(x))) + \ + (blkstofrags((fs), ((((ino_t)(x)) % (fs)->fs_ipg) / INOPB(fs)))))) +#define ino_to_fsbo(fs, x) (((ino_t)(x)) % INOPB(fs)) /* * Give cylinder group number for a filesystem block. diff --git a/sys/ufs/ufs/acl.h b/sys/ufs/ufs/acl.h index b53e3284df1e..235261e51644 100644 --- a/sys/ufs/ufs/acl.h +++ b/sys/ufs/ufs/acl.h @@ -37,6 +37,8 @@ #ifdef _KERNEL +int ufs_getacl_nfs4_internal(struct vnode *vp, struct acl *aclp, struct thread *td); +int ufs_setacl_nfs4_internal(struct vnode *vp, struct acl *aclp, struct thread *td); void ufs_sync_acl_from_inode(struct inode *ip, struct acl *acl); void ufs_sync_inode_from_acl(struct acl *acl, struct inode *ip); diff --git a/sys/ufs/ufs/ufs_acl.c b/sys/ufs/ufs/ufs_acl.c index 68e5015c2d4e..8ed1c0b2110c 100644 --- a/sys/ufs/ufs/ufs_acl.c +++ b/sys/ufs/ufs/ufs_acl.c @@ -140,6 +140,81 @@ ufs_sync_inode_from_acl(struct acl *acl, struct inode *ip) DIP_SET(ip, i_mode, ip->i_mode); } +/* + * Retrieve NFSv4 ACL, skipping access checks. Must be used in UFS code + * instead of VOP_GETACL() when we don't want to be restricted by the user + * not having ACL_READ_ACL permission, e.g. when calculating inherited ACL + * or in ufs_vnops.c:ufs_accessx(). + */ +int +ufs_getacl_nfs4_internal(struct vnode *vp, struct acl *aclp, struct thread *td) +{ + int error, len; + struct inode *ip = VTOI(vp); + + len = sizeof(*aclp); + bzero(aclp, len); + + error = vn_extattr_get(vp, IO_NODELOCKED, + NFS4_ACL_EXTATTR_NAMESPACE, NFS4_ACL_EXTATTR_NAME, + &len, (char *) aclp, td); + aclp->acl_maxcnt = ACL_MAX_ENTRIES; + if (error == ENOATTR) { + /* + * Legitimately no ACL set on object, purely + * emulate it through the inode. + */ + acl_nfs4_sync_acl_from_mode(aclp, ip->i_mode, ip->i_uid); + + return (0); + } + + if (error) + return (error); + + if (len != sizeof(*aclp)) { + /* + * A short (or long) read, meaning that for + * some reason the ACL is corrupted. Return + * EPERM since the object DAC protections + * are unsafe. + */ + printf("ufs_getacl_nfs4(): Loaded invalid ACL (" + "%d bytes), inumber %d on %s\n", len, + ip->i_number, ip->i_fs->fs_fsmnt); + + return (EPERM); + } + + error = acl_nfs4_check(aclp, vp->v_type == VDIR); + if (error) { + printf("ufs_getacl_nfs4(): Loaded invalid ACL " + "(failed acl_nfs4_check), inumber %d on %s\n", + ip->i_number, ip->i_fs->fs_fsmnt); + + return (EPERM); + } + + return (0); +} + +static int +ufs_getacl_nfs4(struct vop_getacl_args *ap) +{ + int error; + + if ((ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) == 0) + return (EINVAL); + + error = VOP_ACCESSX(ap->a_vp, VREAD_ACL, ap->a_td->td_ucred, ap->a_td); + if (error) + return (error); + + error = ufs_getacl_nfs4_internal(ap->a_vp, ap->a_aclp, ap->a_td); + + return (error); +} + /* * Read POSIX.1e ACL from an EA. Return error if its not found * or if any other error has occured. @@ -209,7 +284,7 @@ ufs_getacl_posix1e(struct vop_getacl_args *ap) * ACLs, remove this check. */ if ((ap->a_vp->v_mount->mnt_flag & MNT_ACLS) == 0) - return (EOPNOTSUPP); + return (EINVAL); old = malloc(sizeof(*old), M_ACL, M_WAITOK | M_ZERO); @@ -282,9 +357,117 @@ ufs_getacl(ap) } */ *ap; { + if ((ap->a_vp->v_mount->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) == 0) + return (EOPNOTSUPP); + + if (ap->a_type == ACL_TYPE_NFS4) + return (ufs_getacl_nfs4(ap)); + return (ufs_getacl_posix1e(ap)); } +/* + * Set NFSv4 ACL without doing any access checking. This is required + * e.g. by the UFS code that implements ACL inheritance, or from + * ufs_vnops.c:ufs_chmod(), as some of the checks have to be skipped + * in that case, and others are redundant. + */ +int +ufs_setacl_nfs4_internal(struct vnode *vp, struct acl *aclp, struct thread *td) +{ + int error; + mode_t mode; + struct inode *ip = VTOI(vp); + + KASSERT(acl_nfs4_check(aclp, vp->v_type == VDIR) == 0, + ("invalid ACL passed to ufs_setacl_nfs4_internal")); + + if (acl_nfs4_is_trivial(aclp, ip->i_uid)) { + error = vn_extattr_rm(vp, IO_NODELOCKED, + NFS4_ACL_EXTATTR_NAMESPACE, NFS4_ACL_EXTATTR_NAME, td); + + /* + * An attempt to remove ACL from a file that didn't have + * any extended entries is not an error. + */ + if (error == ENOATTR) + error = 0; + + } else { + error = vn_extattr_set(vp, IO_NODELOCKED, + NFS4_ACL_EXTATTR_NAMESPACE, NFS4_ACL_EXTATTR_NAME, + sizeof(*aclp), (char *) aclp, td); + } + + /* + * Map lack of attribute definition in UFS_EXTATTR into lack of + * support for ACLs on the filesystem. + */ + if (error == ENOATTR) + return (EOPNOTSUPP); + + if (error) + return (error); + + mode = ip->i_mode; + + acl_nfs4_sync_mode_from_acl(&mode, aclp); + + ip->i_mode &= ACL_PRESERVE_MASK; + ip->i_mode |= mode; + DIP_SET(ip, i_mode, ip->i_mode); + ip->i_flag |= IN_CHANGE; + + VN_KNOTE_UNLOCKED(vp, NOTE_ATTRIB); + + return (0); +} + +static int +ufs_setacl_nfs4(struct vop_setacl_args *ap) +{ + int error; + struct inode *ip = VTOI(ap->a_vp); + + if ((ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) == 0) + return (EINVAL); + + if (ap->a_vp->v_mount->mnt_flag & MNT_RDONLY) + return (EROFS); + + if (ap->a_aclp == NULL) + return (EINVAL); + + error = VOP_ACLCHECK(ap->a_vp, ap->a_type, ap->a_aclp, ap->a_cred, + ap->a_td); + if (error) + return (error); + + /* + * Authorize the ACL operation. + */ + if (ip->i_flags & (IMMUTABLE | APPEND)) + return (EPERM); + + /* + * Must hold VWRITE_ACL or have appropriate privilege. + */ + if ((error = VOP_ACCESSX(ap->a_vp, VWRITE_ACL, ap->a_cred, ap->a_td))) + return (error); + + /* + * With NFSv4 ACLs, chmod(2) may need to add additional entries. + * Make sure it has enough room for that - splitting every entry + * into two and appending "canonical six" entries at the end. + */ + if (ap->a_aclp->acl_cnt > (ACL_MAX_ENTRIES - 6) / 2) + return (ENOSPC); + + error = ufs_setacl_nfs4_internal(ap->a_vp, ap->a_aclp, ap->a_td); + + return (error); +} + /* * Set the ACL on a file. * @@ -302,7 +485,7 @@ ufs_setacl_posix1e(struct vop_setacl_args *ap) struct oldacl *old; if ((ap->a_vp->v_mount->mnt_flag & MNT_ACLS) == 0) - return (EOPNOTSUPP); + return (EINVAL); /* * If this is a set operation rather than a delete operation, @@ -422,16 +605,43 @@ ufs_setacl(ap) struct thread *td; } */ *ap; { + if ((ap->a_vp->v_mount->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) == 0) + return (EOPNOTSUPP); + + if (ap->a_type == ACL_TYPE_NFS4) + return (ufs_setacl_nfs4(ap)); return (ufs_setacl_posix1e(ap)); } +static int +ufs_aclcheck_nfs4(struct vop_aclcheck_args *ap) +{ + int is_directory = 0; + + if ((ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) == 0) + return (EINVAL); + + /* + * With NFSv4 ACLs, chmod(2) may need to add additional entries. + * Make sure it has enough room for that - splitting every entry + * into two and appending "canonical six" entries at the end. + */ + if (ap->a_aclp->acl_cnt > (ACL_MAX_ENTRIES - 6) / 2) + return (ENOSPC); + + if (ap->a_vp->v_type == VDIR) + is_directory = 1; + + return (acl_nfs4_check(ap->a_aclp, is_directory)); +} + static int ufs_aclcheck_posix1e(struct vop_aclcheck_args *ap) { if ((ap->a_vp->v_mount->mnt_flag & MNT_ACLS) == 0) - return (EOPNOTSUPP); + return (EINVAL); /* * Verify we understand this type of ACL, and that it applies @@ -471,6 +681,12 @@ ufs_aclcheck(ap) } */ *ap; { + if ((ap->a_vp->v_mount->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) == 0) + return (EOPNOTSUPP); + + if (ap->a_type == ACL_TYPE_NFS4) + return (ufs_aclcheck_nfs4(ap)); + return (ufs_aclcheck_posix1e(ap)); } diff --git a/sys/ufs/ufs/ufs_dirhash.c b/sys/ufs/ufs/ufs_dirhash.c index e18b8387e4cd..c85fdc8980f6 100644 --- a/sys/ufs/ufs/ufs_dirhash.c +++ b/sys/ufs/ufs/ufs_dirhash.c @@ -632,6 +632,7 @@ restart: goto fail; } } + KASSERT(bp != NULL, ("no buffer allocated")); dp = (struct direct *)(bp->b_data + (offset & bmask)); if (dp->d_reclen == 0 || dp->d_reclen > DIRBLKSIZ - (offset & (DIRBLKSIZ - 1))) { diff --git a/sys/ufs/ufs/ufs_lookup.c b/sys/ufs/ufs/ufs_lookup.c index ea73b1ff8616..b0247e77d0d8 100644 --- a/sys/ufs/ufs/ufs_lookup.c +++ b/sys/ufs/ufs/ufs_lookup.c @@ -80,6 +80,61 @@ SYSCTL_INT(_debug, OID_AUTO, dircheck, CTLFLAG_RW, &dirchk, 0, ""); static int ufs_lookup_(struct vnode *, struct vnode **, struct componentname *, ino_t *); +static int +ufs_delete_denied(struct vnode *vdp, struct vnode *tdp, struct ucred *cred, + struct thread *td) +{ + int error; + +#ifdef UFS_ACL + /* + * NFSv4 Minor Version 1, draft-ietf-nfsv4-minorversion1-03.txt + * + * 3.16.2.1. ACE4_DELETE vs. ACE4_DELETE_CHILD + */ + + /* + * XXX: Is this check required? + */ + error = VOP_ACCESS(vdp, VEXEC, cred, td); + if (error) + return (error); + + error = VOP_ACCESSX(tdp, VDELETE, cred, td); + if (error == 0) + return (0); + + error = VOP_ACCESSX(vdp, VDELETE_CHILD, cred, td); + if (error == 0) + return (0); + + error = VOP_ACCESSX(vdp, VEXPLICIT_DENY | VDELETE_CHILD, cred, td); + if (error) + return (error); + +#endif /* !UFS_ACL */ + + /* + * Standard Unix access control - delete access requires VWRITE. + */ + error = VOP_ACCESS(vdp, VWRITE, cred, td); + if (error) + return (error); + + /* + * If directory is "sticky", then user must own + * the directory, or the file in it, else she + * may not delete it (unless she's root). This + * implements append-only directories. + */ + if ((VTOI(vdp)->i_mode & ISVTX) && + VOP_ACCESS(vdp, VADMIN, cred, td) && + VOP_ACCESS(tdp, VADMIN, cred, td)) + return (EPERM); + + return (0); +} + /* * Convert a component of a pathname into a pointer to a locked inode. * This is a very central and rather complicated routine. @@ -410,8 +465,13 @@ notfound: /* * Access for write is interpreted as allowing * creation of files in the directory. + * + * XXX: Fix the comment above. */ - error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_thread); + if (flags & WILLBEDIR) + error = VOP_ACCESSX(vdp, VWRITE | VAPPEND, cred, cnp->cn_thread); + else + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_thread); if (error) return (error); /* @@ -498,12 +558,17 @@ found: if (nameiop == DELETE && (flags & ISLASTCN)) { if (flags & LOCKPARENT) ASSERT_VOP_ELOCKED(vdp, __FUNCTION__); - /* - * Write access to directory required to delete files. - */ - error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_thread); - if (error) + if ((error = VFS_VGET(vdp->v_mount, ino, + LK_EXCLUSIVE, &tdp)) != 0) return (error); + + error = ufs_delete_denied(vdp, tdp, cred, cnp->cn_thread); + if (error) { + vput(tdp); + return (error); + } + + /* * Return pointer to current entry in dp->i_offset, * and distance past previous entry (if there @@ -523,23 +588,10 @@ found: if (dp->i_number == ino) { VREF(vdp); *vpp = vdp; + vput(tdp); return (0); } - if ((error = VFS_VGET(vdp->v_mount, ino, - LK_EXCLUSIVE, &tdp)) != 0) - return (error); - /* - * If directory is "sticky", then user must own - * the directory, or the file in it, else she - * may not delete it (unless she's root). This - * implements append-only directories. - */ - if ((dp->i_mode & ISVTX) && - VOP_ACCESS(vdp, VADMIN, cred, cnp->cn_thread) && - VOP_ACCESS(tdp, VADMIN, cred, cnp->cn_thread)) { - vput(tdp); - return (EPERM); - } + *vpp = tdp; return (0); } @@ -551,7 +603,11 @@ found: * regular file, or empty directory. */ if (nameiop == RENAME && (flags & ISLASTCN)) { - if ((error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_thread))) + if (flags & WILLBEDIR) + error = VOP_ACCESSX(vdp, VWRITE | VAPPEND, cred, cnp->cn_thread); + else + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_thread); + if (error) return (error); /* * Careful about locking second inode. @@ -563,6 +619,33 @@ found: if ((error = VFS_VGET(vdp->v_mount, ino, LK_EXCLUSIVE, &tdp)) != 0) return (error); + + error = ufs_delete_denied(vdp, tdp, cred, cnp->cn_thread); + if (error) { + vput(tdp); + return (error); + } + +#ifdef SunOS_doesnt_do_that + /* + * The only purpose of this check is to return the correct + * error. Assume that we want to rename directory "a" + * to a file "b", and that we have no ACL_WRITE_DATA on + * a containing directory, but we _do_ have ACL_APPEND_DATA. + * In that case, the VOP_ACCESS check above will return 0, + * and the operation will fail with ENOTDIR instead + * of EACCESS. + */ + if (tdp->v_type == VDIR) + error = VOP_ACCESSX(vdp, VWRITE | VAPPEND, cred, cnp->cn_thread); + else + error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_thread); + if (error) { + vput(tdp); + return (error); + } +#endif + *vpp = tdp; cnp->cn_flags |= SAVENAME; return (0); @@ -1141,6 +1224,11 @@ ufs_dirrewrite(dp, oip, newinum, newtype, isrmdir) error = UFS_BLKATOFF(vdp, (off_t)dp->i_offset, (char **)&ep, &bp); if (error) return (error); + if (ep->d_namlen == 2 && ep->d_name[1] == '.' && ep->d_name[0] == '.' && + ep->d_ino != oip->i_number) { + brelse(bp); + return (EIDRM); + } ep->d_ino = newinum; if (!OFSFMT(vdp)) ep->d_type = newtype; diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index 08b77ae07290..9d4d93dbc8fe 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -88,7 +88,7 @@ __FBSDID("$FreeBSD$"); #include -static vop_access_t ufs_access; +static vop_accessx_t ufs_accessx; static int ufs_chmod(struct vnode *, int, struct ucred *, struct thread *); static int ufs_chown(struct vnode *, uid_t, gid_t, struct ucred *, struct thread *); static vop_close_t ufs_close; @@ -298,8 +298,8 @@ ufs_close(ap) } static int -ufs_access(ap) - struct vop_access_args /* { +ufs_accessx(ap) + struct vop_accessx_args /* { struct vnode *a_vp; accmode_t a_accmode; struct ucred *a_cred; @@ -315,6 +315,7 @@ ufs_access(ap) #endif #ifdef UFS_ACL struct acl *acl; + acl_type_t type; #endif /* @@ -322,7 +323,7 @@ ufs_access(ap) * unless the file is a socket, fifo, or a block or * character device resident on the filesystem. */ - if (accmode & VWRITE) { + if (accmode & VMODIFY_PERMS) { switch (vp->v_type) { case VDIR: case VLNK: @@ -367,41 +368,63 @@ relock: } } - /* If immutable bit set, nobody gets to write it. */ - if ((accmode & VWRITE) && (ip->i_flags & (IMMUTABLE | SF_SNAPSHOT))) + /* + * If immutable bit set, nobody gets to write it. "& ~VADMIN_PERMS" + * is here, because without it, * it would be impossible for the owner + * to remove the IMMUTABLE flag. + */ + if ((accmode & (VMODIFY_PERMS & ~VADMIN_PERMS)) && + (ip->i_flags & (IMMUTABLE | SF_SNAPSHOT))) return (EPERM); #ifdef UFS_ACL - if ((vp->v_mount->mnt_flag & MNT_ACLS) != 0) { + if ((vp->v_mount->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) != 0) { + if (vp->v_mount->mnt_flag & MNT_NFS4ACLS) + type = ACL_TYPE_NFS4; + else + type = ACL_TYPE_ACCESS; + acl = acl_alloc(M_WAITOK); - error = VOP_GETACL(vp, ACL_TYPE_ACCESS, acl, ap->a_cred, - ap->a_td); + if (type == ACL_TYPE_NFS4) + error = ufs_getacl_nfs4_internal(vp, acl, ap->a_td); + else + error = VOP_GETACL(vp, type, acl, ap->a_cred, ap->a_td); switch (error) { - case EOPNOTSUPP: - error = vaccess(vp->v_type, ip->i_mode, ip->i_uid, - ip->i_gid, ap->a_accmode, ap->a_cred, NULL); - break; case 0: - error = vaccess_acl_posix1e(vp->v_type, ip->i_uid, - ip->i_gid, acl, ap->a_accmode, ap->a_cred, NULL); + if (type == ACL_TYPE_NFS4) { + error = vaccess_acl_nfs4(vp->v_type, ip->i_uid, + ip->i_gid, acl, accmode, ap->a_cred, NULL); + } else { + error = vfs_unixify_accmode(&accmode); + if (error == 0) + error = vaccess_acl_posix1e(vp->v_type, ip->i_uid, + ip->i_gid, acl, accmode, ap->a_cred, NULL); + } break; default: - printf( -"ufs_access(): Error retrieving ACL on object (%d).\n", - error); + if (error != EOPNOTSUPP) + printf( +"ufs_accessx(): Error retrieving ACL on object (%d).\n", + error); /* * XXX: Fall back until debugged. Should * eventually possibly log an error, and return * EPERM for safety. */ - error = vaccess(vp->v_type, ip->i_mode, ip->i_uid, - ip->i_gid, ap->a_accmode, ap->a_cred, NULL); + error = vfs_unixify_accmode(&accmode); + if (error == 0) + error = vaccess(vp->v_type, ip->i_mode, ip->i_uid, + ip->i_gid, accmode, ap->a_cred, NULL); } acl_free(acl); - } else + + return (error); + } #endif /* !UFS_ACL */ + error = vfs_unixify_accmode(&accmode); + if (error == 0) error = vaccess(vp->v_type, ip->i_mode, ip->i_uid, ip->i_gid, - ap->a_accmode, ap->a_cred, NULL); + accmode, ap->a_cred, NULL); return (error); } @@ -608,11 +631,20 @@ ufs_setattr(ap) * check succeeds. */ if (vap->va_vaflags & VA_UTIMES_NULL) { - error = VOP_ACCESS(vp, VADMIN, cred, td); + /* + * NFSv4.1, draft 21, 6.2.1.3.1, Discussion of Mask Attributes + * + * "A user having ACL_WRITE_DATA or ACL_WRITE_ATTRIBUTES + * will be allowed to set the times [..] to the current + * server time." + * + * XXX: Calling it four times seems a little excessive. + */ + error = VOP_ACCESSX(vp, VWRITE_ATTRIBUTES, cred, td); if (error) error = VOP_ACCESS(vp, VWRITE, cred, td); } else - error = VOP_ACCESS(vp, VADMIN, cred, td); + error = VOP_ACCESSX(vp, VWRITE_ATTRIBUTES, cred, td); if (error) return (error); if (vap->va_atime.tv_sec != VNOVAL) @@ -652,6 +684,32 @@ ufs_setattr(ap) return (error); } +#ifdef UFS_ACL +static int +ufs_update_nfs4_acl_after_mode_change(struct vnode *vp, int mode, + int file_owner_id, struct ucred *cred, struct thread *td) +{ + int error; + struct acl *aclp; + + aclp = acl_alloc(M_WAITOK); + error = ufs_getacl_nfs4_internal(vp, aclp, td); + /* + * We don't have to handle EOPNOTSUPP here, as the filesystem claims + * it supports ACLs. + */ + if (error) + goto out; + + acl_nfs4_sync_acl_from_mode(aclp, mode, file_owner_id); + error = ufs_setacl_nfs4_internal(vp, aclp, td); + +out: + acl_free(aclp); + return (error); +} +#endif /* UFS_ACL */ + /* * Mark this file's access time for update for vfs_mark_atime(). This * is called from execve() and mmap(). @@ -689,7 +747,7 @@ ufs_chmod(vp, mode, cred, td) * To modify the permissions on a file, must possess VADMIN * for that file. */ - if ((error = VOP_ACCESS(vp, VADMIN, cred, td))) + if ((error = VOP_ACCESSX(vp, VWRITE_ACL, cred, td))) return (error); /* * Privileged processes may set the sticky bit on non-directories, @@ -706,11 +764,25 @@ ufs_chmod(vp, mode, cred, td) if (error) return (error); } + + /* + * Deny setting setuid if we are not the file owner. + */ + if ((mode & ISUID) && ip->i_uid != cred->cr_uid) { + error = priv_check_cred(cred, PRIV_VFS_ADMIN, 0); + if (error) + return (error); + } + ip->i_mode &= ~ALLPERMS; ip->i_mode |= (mode & ALLPERMS); DIP_SET(ip, i_mode, ip->i_mode); ip->i_flag |= IN_CHANGE; - return (0); +#ifdef UFS_ACL + if ((vp->v_mount->mnt_flag & MNT_NFS4ACLS) != 0) + error = ufs_update_nfs4_acl_after_mode_change(vp, mode, ip->i_uid, cred, td); +#endif + return (error); } /* @@ -742,14 +814,14 @@ ufs_chown(vp, uid, gid, cred, td) * To modify the ownership of a file, must possess VADMIN for that * file. */ - if ((error = VOP_ACCESS(vp, VADMIN, cred, td))) + if ((error = VOP_ACCESSX(vp, VWRITE_OWNER, cred, td))) return (error); /* * To change the owner of a file, or change the group of a file to a * group of which we are not a member, the caller must have * privilege. */ - if ((uid != ip->i_uid || + if (((uid != ip->i_uid && uid != cred->cr_uid) || (gid != ip->i_gid && !groupmember(gid, cred))) && (error = priv_check_cred(cred, PRIV_VFS_CHOWN, 0))) return (error); @@ -1397,6 +1469,190 @@ out: return (error); } +#ifdef UFS_ACL +static int +ufs_do_posix1e_acl_inheritance_dir(struct vnode *dvp, struct vnode *tvp, + mode_t dmode, struct ucred *cred, struct thread *td) +{ + int error; + struct inode *ip = VTOI(tvp); + struct acl *dacl, *acl; + + acl = acl_alloc(M_WAITOK); + dacl = acl_alloc(M_WAITOK); + + /* + * Retrieve default ACL from parent, if any. + */ + error = VOP_GETACL(dvp, ACL_TYPE_DEFAULT, acl, cred, td); + switch (error) { + case 0: + /* + * Retrieved a default ACL, so merge mode and ACL if + * necessary. If the ACL is empty, fall through to + * the "not defined or available" case. + */ + if (acl->acl_cnt != 0) { + dmode = acl_posix1e_newfilemode(dmode, acl); + ip->i_mode = dmode; + DIP_SET(ip, i_mode, dmode); + *dacl = *acl; + ufs_sync_acl_from_inode(ip, acl); + break; + } + /* FALLTHROUGH */ + + case EOPNOTSUPP: + /* + * Just use the mode as-is. + */ + ip->i_mode = dmode; + DIP_SET(ip, i_mode, dmode); + error = 0; + goto out; + + default: + goto out; + } + + /* + * XXX: If we abort now, will Soft Updates notify the extattr + * code that the EAs for the file need to be released? + */ + error = VOP_SETACL(tvp, ACL_TYPE_ACCESS, acl, cred, td); + if (error == 0) + error = VOP_SETACL(tvp, ACL_TYPE_DEFAULT, dacl, cred, td); + switch (error) { + case 0: + break; + + case EOPNOTSUPP: + /* + * XXX: This should not happen, as EOPNOTSUPP above + * was supposed to free acl. + */ + printf("ufs_mkdir: VOP_GETACL() but no VOP_SETACL()\n"); + /* + panic("ufs_mkdir: VOP_GETACL() but no VOP_SETACL()"); + */ + break; + + default: + goto out; + } + +out: + acl_free(acl); + acl_free(dacl); + + return (error); +} + +static int +ufs_do_posix1e_acl_inheritance_file(struct vnode *dvp, struct vnode *tvp, + mode_t mode, struct ucred *cred, struct thread *td) +{ + int error; + struct inode *ip = VTOI(tvp); + struct acl *acl; + + acl = acl_alloc(M_WAITOK); + + /* + * Retrieve default ACL for parent, if any. + */ + error = VOP_GETACL(dvp, ACL_TYPE_DEFAULT, acl, cred, td); + switch (error) { + case 0: + /* + * Retrieved a default ACL, so merge mode and ACL if + * necessary. + */ + if (acl->acl_cnt != 0) { + /* + * Two possible ways for default ACL to not + * be present. First, the EA can be + * undefined, or second, the default ACL can + * be blank. If it's blank, fall through to + * the it's not defined case. + */ + mode = acl_posix1e_newfilemode(mode, acl); + ip->i_mode = mode; + DIP_SET(ip, i_mode, mode); + ufs_sync_acl_from_inode(ip, acl); + break; + } + /* FALLTHROUGH */ + + case EOPNOTSUPP: + /* + * Just use the mode as-is. + */ + ip->i_mode = mode; + DIP_SET(ip, i_mode, mode); + error = 0; + goto out; + + default: + goto out; + } + + /* + * XXX: If we abort now, will Soft Updates notify the extattr + * code that the EAs for the file need to be released? + */ + error = VOP_SETACL(tvp, ACL_TYPE_ACCESS, acl, cred, td); + switch (error) { + case 0: + break; + + case EOPNOTSUPP: + /* + * XXX: This should not happen, as EOPNOTSUPP above was + * supposed to free acl. + */ + printf("ufs_makeinode: VOP_GETACL() but no " + "VOP_SETACL()\n"); + /* panic("ufs_makeinode: VOP_GETACL() but no " + "VOP_SETACL()"); */ + break; + + default: + goto out; + } + +out: + acl_free(acl); + + return (error); +} + +static int +ufs_do_nfs4_acl_inheritance(struct vnode *dvp, struct vnode *tvp, + mode_t child_mode, struct ucred *cred, struct thread *td) +{ + int error; + struct acl *parent_aclp, *child_aclp; + + parent_aclp = acl_alloc(M_WAITOK); + child_aclp = acl_alloc(M_WAITOK | M_ZERO); + + error = ufs_getacl_nfs4_internal(dvp, parent_aclp, td); + if (error) + goto out; + acl_nfs4_compute_inherited_acl(parent_aclp, child_aclp, + child_mode, VTOI(tvp)->i_uid, tvp->v_type == VDIR); + error = ufs_setacl_nfs4_internal(tvp, child_aclp, td); + if (error) + goto out; +out: + acl_free(parent_aclp); + acl_free(child_aclp); + + return (error); +} +#endif + /* * Mkdir system call */ @@ -1417,9 +1673,6 @@ ufs_mkdir(ap) struct buf *bp; struct dirtemplate dirtemplate, *dtp; struct direct newdir; -#ifdef UFS_ACL - struct acl *acl, *dacl; -#endif int error, dmode; long blkoff; @@ -1508,59 +1761,8 @@ ufs_mkdir(ap) #endif #endif /* !SUIDDIR */ ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; -#ifdef UFS_ACL - acl = dacl = NULL; - if ((dvp->v_mount->mnt_flag & MNT_ACLS) != 0) { - acl = acl_alloc(M_WAITOK); - dacl = acl_alloc(M_WAITOK); - - /* - * Retrieve default ACL from parent, if any. - */ - error = VOP_GETACL(dvp, ACL_TYPE_DEFAULT, acl, cnp->cn_cred, - cnp->cn_thread); - switch (error) { - case 0: - /* - * Retrieved a default ACL, so merge mode and ACL if - * necessary. If the ACL is empty, fall through to - * the "not defined or available" case. - */ - if (acl->acl_cnt != 0) { - dmode = acl_posix1e_newfilemode(dmode, acl); - ip->i_mode = dmode; - DIP_SET(ip, i_mode, dmode); - *dacl = *acl; - ufs_sync_acl_from_inode(ip, acl); - break; - } - /* FALLTHROUGH */ - - case EOPNOTSUPP: - /* - * Just use the mode as-is. - */ - ip->i_mode = dmode; - DIP_SET(ip, i_mode, dmode); - acl_free(acl); - acl_free(dacl); - dacl = acl = NULL; - break; - - default: - UFS_VFREE(tvp, ip->i_number, dmode); - vput(tvp); - acl_free(acl); - acl_free(dacl); - return (error); - } - } else { -#endif /* !UFS_ACL */ - ip->i_mode = dmode; - DIP_SET(ip, i_mode, dmode); -#ifdef UFS_ACL - } -#endif + ip->i_mode = dmode; + DIP_SET(ip, i_mode, dmode); tvp->v_type = VDIR; /* Rest init'd in getnewvnode(). */ ip->i_effnlink = 2; ip->i_nlink = 2; @@ -1595,40 +1797,16 @@ ufs_mkdir(ap) } #endif #ifdef UFS_ACL - if (acl != NULL) { - /* - * XXX: If we abort now, will Soft Updates notify the extattr - * code that the EAs for the file need to be released? - */ - error = VOP_SETACL(tvp, ACL_TYPE_ACCESS, acl, cnp->cn_cred, - cnp->cn_thread); - if (error == 0) - error = VOP_SETACL(tvp, ACL_TYPE_DEFAULT, dacl, - cnp->cn_cred, cnp->cn_thread); - switch (error) { - case 0: - break; - - case EOPNOTSUPP: - /* - * XXX: This should not happen, as EOPNOTSUPP above - * was supposed to free acl. - */ - printf("ufs_mkdir: VOP_GETACL() but no VOP_SETACL()\n"); - /* - panic("ufs_mkdir: VOP_GETACL() but no VOP_SETACL()"); - */ - break; - - default: - acl_free(acl); - acl_free(dacl); - dacl = acl = NULL; + if (dvp->v_mount->mnt_flag & MNT_ACLS) { + error = ufs_do_posix1e_acl_inheritance_dir(dvp, tvp, dmode, + cnp->cn_cred, cnp->cn_thread); + if (error) + goto bad; + } else if (dvp->v_mount->mnt_flag & MNT_NFS4ACLS) { + error = ufs_do_nfs4_acl_inheritance(dvp, tvp, dmode, + cnp->cn_cred, cnp->cn_thread); + if (error) goto bad; - } - acl_free(acl); - acl_free(dacl); - dacl = acl = NULL; } #endif /* !UFS_ACL */ @@ -1691,12 +1869,6 @@ bad: if (error == 0) { *ap->a_vpp = tvp; } else { -#ifdef UFS_ACL - if (acl != NULL) - acl_free(acl); - if (dacl != NULL) - acl_free(dacl); -#endif dp->i_effnlink--; dp->i_nlink--; DIP_SET(dp, i_nlink, dp->i_nlink); @@ -2117,6 +2289,7 @@ ufsfifo_pathconf(ap) switch (ap->a_name) { case _PC_ACL_EXTENDED: + case _PC_ACL_NFS4: case _PC_ACL_PATH_MAX: case _PC_MAC_PRESENT: return (ufs_pathconf(ap)); @@ -2169,9 +2342,21 @@ ufs_pathconf(ap) *ap->a_retval = 0; #endif break; + + case _PC_ACL_NFS4: +#ifdef UFS_ACL + if (ap->a_vp->v_mount->mnt_flag & MNT_NFS4ACLS) + *ap->a_retval = 1; + else + *ap->a_retval = 0; +#else + *ap->a_retval = 0; +#endif + break; + case _PC_ACL_PATH_MAX: #ifdef UFS_ACL - if (ap->a_vp->v_mount->mnt_flag & MNT_ACLS) + if (ap->a_vp->v_mount->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) *ap->a_retval = ACL_MAX_ENTRIES; else *ap->a_retval = 3; @@ -2268,9 +2453,6 @@ ufs_makeinode(mode, dvp, vpp, cnp) struct inode *ip, *pdir; struct direct newdir; struct vnode *tvp; -#ifdef UFS_ACL - struct acl *acl; -#endif int error; pdir = VTOI(dvp); @@ -2350,62 +2532,8 @@ ufs_makeinode(mode, dvp, vpp, cnp) #endif #endif /* !SUIDDIR */ ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE; -#ifdef UFS_ACL - acl = NULL; - if ((dvp->v_mount->mnt_flag & MNT_ACLS) != 0) { - acl = acl_alloc(M_WAITOK); - - /* - * Retrieve default ACL for parent, if any. - */ - error = VOP_GETACL(dvp, ACL_TYPE_DEFAULT, acl, cnp->cn_cred, - cnp->cn_thread); - switch (error) { - case 0: - /* - * Retrieved a default ACL, so merge mode and ACL if - * necessary. - */ - if (acl->acl_cnt != 0) { - /* - * Two possible ways for default ACL to not - * be present. First, the EA can be - * undefined, or second, the default ACL can - * be blank. If it's blank, fall through to - * the it's not defined case. - */ - mode = acl_posix1e_newfilemode(mode, acl); - ip->i_mode = mode; - DIP_SET(ip, i_mode, mode); - ufs_sync_acl_from_inode(ip, acl); - break; - } - /* FALLTHROUGH */ - - case EOPNOTSUPP: - /* - * Just use the mode as-is. - */ - ip->i_mode = mode; - DIP_SET(ip, i_mode, mode); - acl_free(acl); - acl = NULL; - break; - - default: - UFS_VFREE(tvp, ip->i_number, mode); - vput(tvp); - acl_free(acl); - acl = NULL; - return (error); - } - } else { -#endif - ip->i_mode = mode; - DIP_SET(ip, i_mode, mode); -#ifdef UFS_ACL - } -#endif + ip->i_mode = mode; + DIP_SET(ip, i_mode, mode); tvp->v_type = IFTOVT(mode); /* Rest init'd in getnewvnode(). */ ip->i_effnlink = 1; ip->i_nlink = 1; @@ -2438,33 +2566,16 @@ ufs_makeinode(mode, dvp, vpp, cnp) } #endif #ifdef UFS_ACL - if (acl != NULL) { - /* - * XXX: If we abort now, will Soft Updates notify the extattr - * code that the EAs for the file need to be released? - */ - error = VOP_SETACL(tvp, ACL_TYPE_ACCESS, acl, cnp->cn_cred, - cnp->cn_thread); - switch (error) { - case 0: - break; - - case EOPNOTSUPP: - /* - * XXX: This should not happen, as EOPNOTSUPP above was - * supposed to free acl. - */ - printf("ufs_makeinode: VOP_GETACL() but no " - "VOP_SETACL()\n"); - /* panic("ufs_makeinode: VOP_GETACL() but no " - "VOP_SETACL()"); */ - break; - - default: - acl_free(acl); + if (dvp->v_mount->mnt_flag & MNT_ACLS) { + error = ufs_do_posix1e_acl_inheritance_file(dvp, tvp, mode, + cnp->cn_cred, cnp->cn_thread); + if (error) + goto bad; + } else if (dvp->v_mount->mnt_flag & MNT_NFS4ACLS) { + error = ufs_do_nfs4_acl_inheritance(dvp, tvp, mode, + cnp->cn_cred, cnp->cn_thread); + if (error) goto bad; - } - acl_free(acl); } #endif /* !UFS_ACL */ ufs_makedirentry(ip, cnp, &newdir); @@ -2496,7 +2607,7 @@ struct vop_vector ufs_vnodeops = { .vop_read = VOP_PANIC, .vop_reallocblks = VOP_PANIC, .vop_write = VOP_PANIC, - .vop_access = ufs_access, + .vop_accessx = ufs_accessx, .vop_bmap = ufs_bmap, .vop_cachedlookup = ufs_lookup, .vop_close = ufs_close, @@ -2540,7 +2651,7 @@ struct vop_vector ufs_vnodeops = { struct vop_vector ufs_fifoops = { .vop_default = &fifo_specops, .vop_fsync = VOP_PANIC, - .vop_access = ufs_access, + .vop_accessx = ufs_accessx, .vop_close = ufsfifo_close, .vop_getattr = ufs_getattr, .vop_inactive = ufs_inactive, diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index c7f559381fd0..9002e775bb97 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -93,17 +93,6 @@ dev_pager_init() UMA_ZONE_NOFREE|UMA_ZONE_VM); } -static __inline int -dev_mmap(struct cdevsw *csw, struct cdev *dev, vm_offset_t offset, - vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr) -{ - - if (csw->d_flags & D_MMAP2) - return (csw->d_mmap2(dev, offset, paddr, nprot, memattr)); - else - return (csw->d_mmap(dev, offset, paddr, nprot)); -} - /* * MPSAFE */ @@ -116,7 +105,7 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_pindex_t pindex; unsigned int npages; vm_paddr_t paddr; - vm_offset_t off; + vm_ooffset_t off; vm_memattr_t dummy; struct cdevsw *csw; @@ -145,7 +134,7 @@ dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, */ npages = OFF_TO_IDX(size); for (off = foff; npages--; off += PAGE_SIZE) - if (dev_mmap(csw, dev, off, &paddr, (int)prot, &dummy) != 0) { + if (csw->d_mmap(dev, off, &paddr, (int)prot, &dummy) != 0) { dev_relthread(dev); return (NULL); } @@ -242,7 +231,7 @@ dev_pager_getpages(object, m, count, reqpage) td = curthread; fpop = td->td_fpop; td->td_fpop = NULL; - ret = dev_mmap(csw, dev, (vm_offset_t)offset << PAGE_SHIFT, &paddr, + ret = csw->d_mmap(dev, (vm_ooffset_t)offset << PAGE_SHIFT, &paddr, PROT_READ, &memattr); KASSERT(ret == 0, ("dev_pager_getpage: map function returns error")); td->td_fpop = fpop; diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h index 22d61181b3cd..02fda073aea4 100644 --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -133,6 +133,7 @@ void pmap_remove(pmap_t, vm_offset_t, vm_offset_t); void pmap_remove_all(vm_page_t m); void pmap_remove_pages(pmap_t); void pmap_remove_write(vm_page_t m); +void pmap_sync_icache(pmap_t, vm_offset_t, vm_size_t); void pmap_zero_page(vm_page_t); void pmap_zero_page_area(vm_page_t, int off, int size); void pmap_zero_page_idle(vm_page_t); diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index de33ebaadda1..ef64b31ae09a 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -155,11 +155,15 @@ int swap_pager_avail; static int swdev_syscall_active = 0; /* serialize swap(on|off) */ static vm_ooffset_t swap_total; -SYSCTL_QUAD(_vm, OID_AUTO, swap_total, CTLFLAG_RD, &swap_total, 0, ""); +SYSCTL_QUAD(_vm, OID_AUTO, swap_total, CTLFLAG_RD, &swap_total, 0, + "Total amount of available swap storage."); static vm_ooffset_t swap_reserved; -SYSCTL_QUAD(_vm, OID_AUTO, swap_reserved, CTLFLAG_RD, &swap_reserved, 0, ""); +SYSCTL_QUAD(_vm, OID_AUTO, swap_reserved, CTLFLAG_RD, &swap_reserved, 0, + "Amount of swap storage needed to back all allocated anonymous memory."); static int overcommit = 0; -SYSCTL_INT(_vm, OID_AUTO, overcommit, CTLFLAG_RW, &overcommit, 0, ""); +SYSCTL_INT(_vm, OID_AUTO, overcommit, CTLFLAG_RW, &overcommit, 0, + "Configure virtual memory overcommit behavior. See tuning(7) " + "for details."); /* bits from overcommit */ #define SWAP_RESERVE_FORCE_ON (1 << 0) @@ -176,7 +180,7 @@ swap_reserve(vm_ooffset_t incr) int swap_reserve_by_uid(vm_ooffset_t incr, struct uidinfo *uip) { - vm_ooffset_t r, s, max; + vm_ooffset_t r, s; int res, error; static int curfail; static struct timeval lastfail; @@ -185,7 +189,6 @@ swap_reserve_by_uid(vm_ooffset_t incr, struct uidinfo *uip) panic("swap_reserve: & PAGE_MASK"); res = 0; - error = priv_check(curthread, PRIV_VM_SWAP_NOQUOTA); mtx_lock(&sw_dev_mtx); r = swap_reserved + incr; if (overcommit & SWAP_RESERVE_ALLOW_NONWIRED) { @@ -204,10 +207,9 @@ swap_reserve_by_uid(vm_ooffset_t incr, struct uidinfo *uip) if (res) { PROC_LOCK(curproc); UIDINFO_VMSIZE_LOCK(uip); - error = priv_check(curthread, PRIV_VM_SWAP_NORLIMIT); - max = (error != 0) ? lim_cur(curproc, RLIMIT_SWAP) : 0; - if (max != 0 && uip->ui_vmsize + incr > max && - (overcommit & SWAP_RESERVE_RLIMIT_ON) != 0) + if ((overcommit & SWAP_RESERVE_RLIMIT_ON) != 0 && + uip->ui_vmsize + incr > lim_cur(curproc, RLIMIT_SWAP) && + priv_check(curthread, PRIV_VM_SWAP_NORLIMIT)) res = 0; else uip->ui_vmsize += incr; diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c index 81254828ead8..a2d5633bd515 100644 --- a/sys/vm/uma_core.c +++ b/sys/vm/uma_core.c @@ -122,14 +122,14 @@ static MALLOC_DEFINE(M_UMAHASH, "UMAHash", "UMA Hash Buckets"); static int bucketdisable = 1; /* Linked list of all kegs in the system */ -static LIST_HEAD(,uma_keg) uma_kegs = LIST_HEAD_INITIALIZER(&uma_kegs); +static LIST_HEAD(,uma_keg) uma_kegs = LIST_HEAD_INITIALIZER(uma_kegs); /* This mutex protects the keg list */ static struct mtx uma_mtx; /* Linked list of boot time pages */ static LIST_HEAD(,uma_slab) uma_boot_pages = - LIST_HEAD_INITIALIZER(&uma_boot_pages); + LIST_HEAD_INITIALIZER(uma_boot_pages); /* This mutex protects the boot time pages list */ static struct mtx uma_boot_pages_mtx; diff --git a/sys/vm/uma_int.h b/sys/vm/uma_int.h index c2ed06dc7db4..1aaf84f819d2 100644 --- a/sys/vm/uma_int.h +++ b/sys/vm/uma_int.h @@ -144,10 +144,10 @@ #define UMA_HASH_INSERT(h, s, mem) \ SLIST_INSERT_HEAD(&(h)->uh_slab_hash[UMA_HASH((h), \ - (mem))], (s), us_hlink); + (mem))], (s), us_hlink) #define UMA_HASH_REMOVE(h, s, mem) \ SLIST_REMOVE(&(h)->uh_slab_hash[UMA_HASH((h), \ - (mem))], (s), uma_slab, us_hlink); + (mem))], (s), uma_slab, us_hlink) /* Hash table for freed address -> slab translation */ diff --git a/sys/vm/vm.h b/sys/vm/vm.h index 941300a08948..6dd3cbe8a649 100644 --- a/sys/vm/vm.h +++ b/sys/vm/vm.h @@ -76,7 +76,7 @@ typedef u_char vm_prot_t; /* protection codes */ #define VM_PROT_READ ((vm_prot_t) 0x01) #define VM_PROT_WRITE ((vm_prot_t) 0x02) #define VM_PROT_EXECUTE ((vm_prot_t) 0x04) -#define VM_PROT_OVERRIDE_WRITE ((vm_prot_t) 0x08) /* copy-on-write */ +#define VM_PROT_COPY ((vm_prot_t) 0x08) /* copy-on-read */ #define VM_PROT_ALL (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) #define VM_PROT_RW (VM_PROT_READ|VM_PROT_WRITE) diff --git a/sys/vm/vm_extern.h b/sys/vm/vm_extern.h index 65b6c8e8e4a6..ad6087eae337 100644 --- a/sys/vm/vm_extern.h +++ b/sys/vm/vm_extern.h @@ -58,11 +58,12 @@ int vm_fault(vm_map_t, vm_offset_t, vm_prot_t, int); void vm_fault_copy_entry(vm_map_t, vm_map_t, vm_map_entry_t, vm_map_entry_t, vm_ooffset_t *); void vm_fault_unwire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t); -int vm_fault_wire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t, boolean_t); +int vm_fault_wire(vm_map_t, vm_offset_t, vm_offset_t, boolean_t); int vm_forkproc(struct thread *, struct proc *, struct thread *, struct vmspace *, int); void vm_waitproc(struct proc *); int vm_mmap(vm_map_t, vm_offset_t *, vm_size_t, vm_prot_t, vm_prot_t, int, objtype_t, void *, vm_ooffset_t); void vm_set_page_size(void); +void vm_sync_icache(vm_map_t, vm_offset_t, vm_size_t); struct vmspace *vmspace_alloc(vm_offset_t, vm_offset_t); struct vmspace *vmspace_fork(struct vmspace *, vm_ooffset_t *); int vmspace_exec(struct proc *, vm_offset_t, vm_offset_t); diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 98b6b099b1e1..0a5a4125bef4 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -96,7 +96,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include /* XXX Temporary for VFS_LOCK_GIANT() */ @@ -186,7 +185,7 @@ unlock_and_deallocate(struct faultstate *fs) * default objects are zero-fill, there is no real pager. */ #define TRYPAGER (fs.object->type != OBJT_DEFAULT && \ - (((fault_flags & VM_FAULT_WIRE_MASK) == 0) || wired)) + ((fault_flags & VM_FAULT_CHANGE_WIRING) == 0 || wired)) /* * vm_fault: @@ -239,42 +238,15 @@ RetryFault:; result = vm_map_lookup(&fs.map, vaddr, fault_type, &fs.entry, &fs.first_object, &fs.first_pindex, &prot, &wired); if (result != KERN_SUCCESS) { - if (result != KERN_PROTECTION_FAILURE || - (fault_flags & VM_FAULT_WIRE_MASK) != VM_FAULT_USER_WIRE) { - if (growstack && result == KERN_INVALID_ADDRESS && - map != kernel_map && curproc != NULL) { - result = vm_map_growstack(curproc, vaddr); - if (result != KERN_SUCCESS) - return (KERN_FAILURE); - growstack = FALSE; - goto RetryFault; - } - return (result); + if (growstack && result == KERN_INVALID_ADDRESS && + map != kernel_map) { + result = vm_map_growstack(curproc, vaddr); + if (result != KERN_SUCCESS) + return (KERN_FAILURE); + growstack = FALSE; + goto RetryFault; } - - /* - * If we are user-wiring a r/w segment, and it is COW, then - * we need to do the COW operation. Note that we don't COW - * currently RO sections now, because it is NOT desirable - * to COW .text. We simply keep .text from ever being COW'ed - * and take the heat that one cannot debug wired .text sections. - */ - result = vm_map_lookup(&fs.map, vaddr, - VM_PROT_READ|VM_PROT_WRITE|VM_PROT_OVERRIDE_WRITE, - &fs.entry, &fs.first_object, &fs.first_pindex, &prot, &wired); - if (result != KERN_SUCCESS) - return (result); - - /* - * If we don't COW now, on a user wire, the user will never - * be able to write to the mapping. If we don't make this - * restriction, the bookkeeping would be nearly impossible. - * - * XXX The following assignment modifies the map without - * holding a write lock on it. - */ - if ((fs.entry->protection & VM_PROT_WRITE) == 0) - fs.entry->max_protection &= ~VM_PROT_WRITE; + return (result); } map_generation = fs.map->timestamp; @@ -301,7 +273,7 @@ RetryFault:; fs.lookup_still_valid = TRUE; if (wired) - fault_type = prot; + fault_type = prot | (fault_type & VM_PROT_COPY); fs.first_m = NULL; @@ -730,7 +702,7 @@ vnode_locked: /* * We only really need to copy if we want to write it. */ - if (fault_type & VM_PROT_WRITE) { + if ((fault_type & (VM_PROT_COPY | VM_PROT_WRITE)) != 0) { /* * This allows pages to be virtually copied from a * backing_object into the first_object, where the @@ -787,8 +759,13 @@ vnode_locked: */ pmap_copy_page(fs.m, fs.first_m); fs.first_m->valid = VM_PAGE_BITS_ALL; - } - if (fs.m) { + if (wired && (fault_flags & + VM_FAULT_CHANGE_WIRING) == 0) { + vm_page_lock_queues(); + vm_page_wire(fs.first_m); + vm_page_unwire(fs.m, FALSE); + vm_page_unlock_queues(); + } /* * We no longer need the old page or object. */ @@ -885,19 +862,12 @@ vnode_locked: vm_object_set_writeable_dirty(fs.object); /* - * If the fault is a write, we know that this page is being - * written NOW so dirty it explicitly to save on - * pmap_is_modified() calls later. - * * If this is a NOSYNC mmap we do not want to set VPO_NOSYNC * if the page is already dirty to prevent data written with * the expectation of being synced from not being synced. * Likewise if this entry does not request NOSYNC then make * sure the page isn't marked NOSYNC. Applications sharing * data should use the same flags to avoid ping ponging. - * - * Also tell the backing pager, if any, that it should remove - * any swap backing since the page is now dirty. */ if (fs.entry->eflags & MAP_ENTRY_NOSYNC) { if (fs.m->dirty == 0) @@ -905,7 +875,17 @@ vnode_locked: } else { fs.m->oflags &= ~VPO_NOSYNC; } - if (fault_flags & VM_FAULT_DIRTY) { + + /* + * If the fault is a write, we know that this page is being + * written NOW so dirty it explicitly to save on + * pmap_is_modified() calls later. + * + * Also tell the backing pager, if any, that it should remove + * any swap backing since the page is now dirty. + */ + if ((fault_type & VM_PROT_WRITE) != 0 && + (fault_flags & VM_FAULT_CHANGE_WIRING) == 0) { vm_page_dirty(fs.m); vm_pager_page_unswapped(fs.m); } @@ -931,9 +911,8 @@ vnode_locked: * won't find it (yet). */ pmap_enter(fs.map->pmap, vaddr, fault_type, fs.m, prot, wired); - if (((fault_flags & VM_FAULT_WIRE_MASK) == 0) && (wired == 0)) { + if ((fault_flags & VM_FAULT_CHANGE_WIRING) == 0 && wired == 0) vm_fault_prefault(fs.map->pmap, vaddr, fs.entry); - } VM_OBJECT_LOCK(fs.object); vm_page_lock_queues(); vm_page_flag_set(fs.m, PG_REFERENCED); @@ -942,7 +921,7 @@ vnode_locked: * If the page is not wired down, then put it where the pageout daemon * can find it. */ - if (fault_flags & VM_FAULT_WIRE_MASK) { + if (fault_flags & VM_FAULT_CHANGE_WIRING) { if (wired) vm_page_wire(fs.m); else @@ -1011,8 +990,8 @@ vm_fault_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry) while ((m = vm_page_lookup(lobject, pindex)) == NULL && lobject->type == OBJT_DEFAULT && (backing_object = lobject->backing_object) != NULL) { - if (lobject->backing_object_offset & PAGE_MASK) - break; + KASSERT((lobject->backing_object_offset & PAGE_MASK) == + 0, ("vm_fault_prefault: unaligned object offset")); pindex += lobject->backing_object_offset >> PAGE_SHIFT; VM_OBJECT_LOCK(backing_object); VM_OBJECT_UNLOCK(lobject); @@ -1060,7 +1039,7 @@ vm_fault_quick(caddr_t v, int prot) */ int vm_fault_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, - boolean_t user_wire, boolean_t fictitious) + boolean_t fictitious) { vm_offset_t va; int rv; @@ -1071,9 +1050,7 @@ vm_fault_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, * read-only sections. */ for (va = start; va < end; va += PAGE_SIZE) { - rv = vm_fault(map, va, - user_wire ? VM_PROT_READ : VM_PROT_READ | VM_PROT_WRITE, - user_wire ? VM_FAULT_USER_WIRE : VM_FAULT_CHANGE_WIRING); + rv = vm_fault(map, va, VM_PROT_NONE, VM_FAULT_CHANGE_WIRING); if (rv) { if (va != start) vm_fault_unwire(map, start, va, fictitious); @@ -1119,7 +1096,10 @@ vm_fault_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end, * Routine: * vm_fault_copy_entry * Function: - * Copy all of the pages from a wired-down map entry to another. + * Create new shadow object backing dst_entry with private copy of + * all underlying pages. When src_entry is equal to dst_entry, + * function implements COW for wired-down map entry. Otherwise, + * it forks wired entry into dst_map. * * In/out conditions: * The source and destination maps must be locked for write. @@ -1131,22 +1111,23 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map, vm_map_entry_t dst_entry, vm_map_entry_t src_entry, vm_ooffset_t *fork_charge) { - vm_object_t backing_object, dst_object, object; - vm_object_t src_object; - vm_ooffset_t dst_offset; - vm_ooffset_t src_offset; - vm_pindex_t pindex; - vm_prot_t prot; + vm_object_t backing_object, dst_object, object, src_object; + vm_pindex_t dst_pindex, pindex, src_pindex; + vm_prot_t access, prot; vm_offset_t vaddr; vm_page_t dst_m; vm_page_t src_m; + boolean_t src_readonly, upgrade; #ifdef lint src_map++; #endif /* lint */ + upgrade = src_entry == dst_entry; + src_object = src_entry->object.vm_object; - src_offset = src_entry->offset; + src_pindex = OFF_TO_IDX(src_entry->offset); + src_readonly = (src_entry->protection & VM_PROT_WRITE) == 0; /* * Create the top-level object for the destination entry. (Doesn't @@ -1160,33 +1141,50 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map, #endif VM_OBJECT_LOCK(dst_object); - KASSERT(dst_entry->object.vm_object == NULL, + KASSERT(upgrade || dst_entry->object.vm_object == NULL, ("vm_fault_copy_entry: vm_object not NULL")); dst_entry->object.vm_object = dst_object; dst_entry->offset = 0; - dst_object->uip = curthread->td_ucred->cr_ruidinfo; - uihold(dst_object->uip); dst_object->charge = dst_entry->end - dst_entry->start; - KASSERT(dst_entry->uip == NULL, - ("vm_fault_copy_entry: leaked swp charge")); - *fork_charge += dst_object->charge; - prot = dst_entry->max_protection; + if (fork_charge != NULL) { + KASSERT(dst_entry->uip == NULL, + ("vm_fault_copy_entry: leaked swp charge")); + dst_object->uip = curthread->td_ucred->cr_ruidinfo; + uihold(dst_object->uip); + *fork_charge += dst_object->charge; + } else { + dst_object->uip = dst_entry->uip; + dst_entry->uip = NULL; + } + access = prot = dst_entry->protection; + /* + * If not an upgrade, then enter the mappings in the pmap as + * read and/or execute accesses. Otherwise, enter them as + * write accesses. + * + * A writeable large page mapping is only created if all of + * the constituent small page mappings are modified. Marking + * PTEs as modified on inception allows promotion to happen + * without taking potentially large number of soft faults. + */ + if (!upgrade) + access &= ~VM_PROT_WRITE; /* * Loop through all of the pages in the entry's range, copying each * one from the source object (it should be there) to the destination * object. */ - for (vaddr = dst_entry->start, dst_offset = 0; + for (vaddr = dst_entry->start, dst_pindex = 0; vaddr < dst_entry->end; - vaddr += PAGE_SIZE, dst_offset += PAGE_SIZE) { + vaddr += PAGE_SIZE, dst_pindex++) { /* - * Allocate a page in the destination object + * Allocate a page in the destination object. */ do { - dst_m = vm_page_alloc(dst_object, - OFF_TO_IDX(dst_offset), VM_ALLOC_NORMAL); + dst_m = vm_page_alloc(dst_object, dst_pindex, + VM_ALLOC_NORMAL); if (dst_m == NULL) { VM_OBJECT_UNLOCK(dst_object); VM_WAIT; @@ -1201,10 +1199,9 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map, */ VM_OBJECT_LOCK(src_object); object = src_object; - pindex = 0; - while ((src_m = vm_page_lookup(object, pindex + - OFF_TO_IDX(dst_offset + src_offset))) == NULL && - (src_entry->protection & VM_PROT_WRITE) == 0 && + pindex = src_pindex + dst_pindex; + while ((src_m = vm_page_lookup(object, pindex)) == NULL && + src_readonly && (backing_object = object->backing_object) != NULL) { /* * Allow fallback to backing objects if we are reading. @@ -1222,21 +1219,30 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map, VM_OBJECT_UNLOCK(dst_object); /* - * Enter it in the pmap as a read and/or execute access. + * Enter it in the pmap. If a wired, copy-on-write + * mapping is being replaced by a write-enabled + * mapping, then wire that new mapping. */ - pmap_enter(dst_map->pmap, vaddr, prot & ~VM_PROT_WRITE, dst_m, - prot, FALSE); + pmap_enter(dst_map->pmap, vaddr, access, dst_m, prot, upgrade); /* * Mark it no longer busy, and put it on the active list. */ VM_OBJECT_LOCK(dst_object); vm_page_lock_queues(); - vm_page_activate(dst_m); + if (upgrade) { + vm_page_unwire(src_m, 0); + vm_page_wire(dst_m); + } else + vm_page_activate(dst_m); vm_page_unlock_queues(); vm_page_wakeup(dst_m); } VM_OBJECT_UNLOCK(dst_object); + if (upgrade) { + dst_entry->eflags &= ~(MAP_ENTRY_COW | MAP_ENTRY_NEEDS_COPY); + vm_object_deallocate(src_object); + } } diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 851c73361ee9..8882565ef831 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -309,6 +309,13 @@ vm_imgact_unmap_page(struct sf_buf *sf) vm_page_unlock_queues(); } +void +vm_sync_icache(vm_map_t map, vm_offset_t va, vm_offset_t sz) +{ + + pmap_sync_icache(map->pmap, va, sz); +} + struct kstack_cache_entry { vm_object_t ksobj; struct kstack_cache_entry *next_ks_entry; diff --git a/sys/vm/vm_init.c b/sys/vm/vm_init.c index e9baf091e8f6..fdffb463891d 100644 --- a/sys/vm/vm_init.c +++ b/sys/vm/vm_init.c @@ -186,7 +186,7 @@ again: panic("startup: table size inconsistency"); clean_map = kmem_suballoc(kernel_map, &kmi->clean_sva, &kmi->clean_eva, - (long)nbuf * BKVASIZE + (long)nswbuf * MAXPHYS, FALSE); + (long)nbuf * BKVASIZE + (long)nswbuf * MAXPHYS, TRUE); buffer_map = kmem_suballoc(clean_map, &kmi->buffer_sva, &kmi->buffer_eva, (long)nbuf * BKVASIZE, FALSE); buffer_map->system_map = 1; diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index b5651ef99ba8..3b17a30a4170 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -116,22 +116,6 @@ __FBSDID("$FreeBSD$"); * another, and then marking both regions as copy-on-write. */ -/* - * vm_map_startup: - * - * Initialize the vm_map module. Must be called before - * any other vm_map routines. - * - * Map and entry structures are allocated from the general - * purpose memory pool with some exceptions: - * - * - The kernel map and kmem submap are allocated statically. - * - Kernel map entries are allocated out of a static pool. - * - * These restrictions are necessary since malloc() uses the - * maps and requires map entries. - */ - static struct mtx map_sleep_mtx; static uma_zone_t mapentzone; static uma_zone_t kmapentzone; @@ -176,6 +160,22 @@ static void vmspace_zdtor(void *mem, int size, void *arg); start = end; \ } +/* + * vm_map_startup: + * + * Initialize the vm_map module. Must be called before + * any other vm_map routines. + * + * Map and entry structures are allocated from the general + * purpose memory pool with some exceptions: + * + * - The kernel map and kmem submap are allocated statically. + * - Kernel map entries are allocated out of a static pool. + * + * These restrictions are necessary since malloc() uses the + * maps and requires map entries. + */ + void vm_map_startup(void) { @@ -1136,7 +1136,7 @@ vm_map_insert(vm_map_t map, vm_object_t object, vm_ooffset_t offset, ((protoeflags & MAP_ENTRY_NEEDS_COPY) || object == NULL))) { if (!(cow & MAP_ACC_CHARGED) && !swap_reserve(end - start)) return (KERN_RESOURCE_SHORTAGE); - KASSERT(object == NULL || (cow & MAP_ENTRY_NEEDS_COPY) || + KASSERT(object == NULL || (protoeflags & MAP_ENTRY_NEEDS_COPY) || object->uip == NULL, ("OVERCOMMIT: vm_map_insert o %p", object)); uip = curthread->td_ucred->cr_ruidinfo; @@ -1805,10 +1805,10 @@ int vm_map_protect(vm_map_t map, vm_offset_t start, vm_offset_t end, vm_prot_t new_prot, boolean_t set_max) { - vm_map_entry_t current; - vm_map_entry_t entry; + vm_map_entry_t current, entry; vm_object_t obj; struct uidinfo *uip; + vm_prot_t old_prot; vm_map_lock(map); @@ -1897,9 +1897,8 @@ vm_map_protect(vm_map_t map, vm_offset_t start, vm_offset_t end, */ current = entry; while ((current != &map->header) && (current->start < end)) { - vm_prot_t old_prot; - old_prot = current->protection; + if (set_max) current->protection = (current->max_protection = new_prot) & @@ -1907,11 +1906,18 @@ vm_map_protect(vm_map_t map, vm_offset_t start, vm_offset_t end, else current->protection = new_prot; + if ((current->eflags & (MAP_ENTRY_COW | MAP_ENTRY_USER_WIRED)) + == (MAP_ENTRY_COW | MAP_ENTRY_USER_WIRED) && + (current->protection & VM_PROT_WRITE) != 0 && + (old_prot & VM_PROT_WRITE) == 0) { + vm_fault_copy_entry(map, map, current, current, NULL); + } + /* - * Update physical map if necessary. Worry about copy-on-write - * here. + * When restricting access, update the physical map. Worry + * about copy-on-write here. */ - if (current->protection != old_prot) { + if ((old_prot & ~current->protection) != 0) { #define MASK(entry) (((entry)->eflags & MAP_ENTRY_COW) ? ~VM_PROT_WRITE : \ VM_PROT_ALL) pmap_protect(map->pmap, current->start, @@ -2375,7 +2381,7 @@ vm_map_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, */ vm_map_unlock(map); rv = vm_fault_wire(map, saved_start, saved_end, - user_wire, fictitious); + fictitious); vm_map_lock(map); if (last_timestamp + 1 != map->timestamp) { /* @@ -3548,23 +3554,16 @@ RetryLookup:; /* * Check whether this task is allowed to have this page. - * Note the special case for MAP_ENTRY_COW - * pages with an override. This is to implement a forced - * COW for debuggers. */ - if (fault_type & VM_PROT_OVERRIDE_WRITE) - prot = entry->max_protection; - else - prot = entry->protection; + prot = entry->protection; fault_type &= (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE); - if ((fault_type & prot) != fault_type) { + if ((fault_type & prot) != fault_type || prot == VM_PROT_NONE) { vm_map_unlock_read(map); return (KERN_PROTECTION_FAILURE); } if ((entry->eflags & MAP_ENTRY_USER_WIRED) && (entry->eflags & MAP_ENTRY_COW) && - (fault_type & VM_PROT_WRITE) && - (fault_typea & VM_PROT_OVERRIDE_WRITE) == 0) { + (fault_type & VM_PROT_WRITE)) { vm_map_unlock_read(map); return (KERN_PROTECTION_FAILURE); } @@ -3575,7 +3574,7 @@ RetryLookup:; */ *wired = (entry->wired_count != 0); if (*wired) - prot = fault_type = entry->protection; + fault_type = entry->protection; size = entry->end - entry->start; /* * If the entry was copy-on-write, we either ... @@ -3588,7 +3587,8 @@ RetryLookup:; * If we don't need to write the page, we just demote the * permissions allowed. */ - if (fault_type & VM_PROT_WRITE) { + if ((fault_type & VM_PROT_WRITE) != 0 || + (fault_typea & VM_PROT_COPY) != 0) { /* * Make a new object, and place it in the object * chain. Note that no new references have appeared @@ -3711,21 +3711,14 @@ vm_map_lookup_locked(vm_map_t *var_map, /* IN/OUT */ /* * Check whether this task is allowed to have this page. - * Note the special case for MAP_ENTRY_COW - * pages with an override. This is to implement a forced - * COW for debuggers. */ - if (fault_type & VM_PROT_OVERRIDE_WRITE) - prot = entry->max_protection; - else - prot = entry->protection; + prot = entry->protection; fault_type &= VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE; if ((fault_type & prot) != fault_type) return (KERN_PROTECTION_FAILURE); if ((entry->eflags & MAP_ENTRY_USER_WIRED) && (entry->eflags & MAP_ENTRY_COW) && - (fault_type & VM_PROT_WRITE) && - (fault_typea & VM_PROT_OVERRIDE_WRITE) == 0) + (fault_type & VM_PROT_WRITE)) return (KERN_PROTECTION_FAILURE); /* @@ -3734,7 +3727,7 @@ vm_map_lookup_locked(vm_map_t *var_map, /* IN/OUT */ */ *wired = (entry->wired_count != 0); if (*wired) - prot = fault_type = entry->protection; + fault_type = entry->protection; if (entry->eflags & MAP_ENTRY_NEEDS_COPY) { /* diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h index 0c586ab2ae58..963084555127 100644 --- a/sys/vm/vm_map.h +++ b/sys/vm/vm_map.h @@ -319,9 +319,6 @@ long vmspace_wired_count(struct vmspace *vmspace); */ #define VM_FAULT_NORMAL 0 /* Nothing special */ #define VM_FAULT_CHANGE_WIRING 1 /* Change the wiring as appropriate */ -#define VM_FAULT_USER_WIRE 2 /* Likewise, but for user purposes */ -#define VM_FAULT_WIRE_MASK (VM_FAULT_CHANGE_WIRING|VM_FAULT_USER_WIRE) -#define VM_FAULT_DIRTY 8 /* Dirty the page */ /* * The following "find_space" options are supported by vm_map_find() diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index c8d25ee3a305..4963a6038339 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -229,7 +229,8 @@ mmap(td, uap) pos = uap->pos; fp = NULL; - /* make sure mapping fits into numeric range etc */ + + /* Make sure mapping fits into numeric range, etc. */ if ((uap->len == 0 && !SV_CURPROC_FLAG(SV_AOUT) && curproc->p_osrel >= 800104) || ((flags & MAP_ANON) && uap->fd != -1)) @@ -267,6 +268,7 @@ mmap(td, uap) addr -= pageoff; if (addr & PAGE_MASK) return (EINVAL); + /* Address range must be all in user VM space. */ if (addr < vm_map_min(&vms->vm_map) || addr + size > vm_map_max(&vms->vm_map)) diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index d7a6e97ac465..399cb10a1f91 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -773,9 +773,9 @@ vm_object_page_clean(vm_object_t object, vm_pindex_t start, vm_pindex_t end, int int curgeneration; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - if (object->type != OBJT_VNODE || - (object->flags & OBJ_MIGHTBEDIRTY) == 0) + if ((object->flags & OBJ_MIGHTBEDIRTY) == 0) return; + KASSERT(object->type == OBJT_VNODE, ("Not a vnode object")); pagerflags = (flags & (OBJPC_SYNC | OBJPC_INVAL)) ? VM_PAGER_PUT_SYNC : VM_PAGER_CLUSTER_OK; pagerflags |= (flags & OBJPC_INVAL) ? VM_PAGER_PUT_INVAL : 0; @@ -875,18 +875,8 @@ vm_object_page_clean(vm_object_t object, vm_pindex_t start, vm_pindex_t end, int pmap_remove_write(p); } - if (clearobjflags && (tstart == 0) && (tend == object->size)) { - struct vnode *vp; - + if (clearobjflags && (tstart == 0) && (tend == object->size)) vm_object_clear_flag(object, OBJ_MIGHTBEDIRTY); - if (object->type == OBJT_VNODE && - (vp = (struct vnode *)object->handle) != NULL) { - VI_LOCK(vp); - if (vp->v_iflag & VI_OBJDIRTY) - vp->v_iflag &= ~VI_OBJDIRTY; - VI_UNLOCK(vp); - } - } rescan: curgeneration = object->generation; @@ -2148,18 +2138,12 @@ vm_object_coalesce(vm_object_t prev_object, vm_ooffset_t prev_offset, void vm_object_set_writeable_dirty(vm_object_t object) { - struct vnode *vp; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); - if ((object->flags & OBJ_MIGHTBEDIRTY) != 0) + if (object->type != OBJT_VNODE || + (object->flags & OBJ_MIGHTBEDIRTY) != 0) return; vm_object_set_flag(object, OBJ_MIGHTBEDIRTY); - if (object->type == OBJT_VNODE && - (vp = (struct vnode *)object->handle) != NULL) { - VI_LOCK(vp); - vp->v_iflag |= VI_OBJDIRTY; - VI_UNLOCK(vp); - } } #include "opt_ddb.h" diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index 0b06fed2828b..6a9f129cf83e 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -154,7 +154,7 @@ struct vm_object { #define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ #define OBJ_NOSPLIT 0x0010 /* dont split this object */ #define OBJ_PIPWNT 0x0040 /* paging in progress wanted */ -#define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty */ +#define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty, only for vnode */ #define OBJ_CLEANING 0x0200 #define OBJ_COLORED 0x1000 /* pg_color is defined */ #define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index ac363b701666..665baa9dcf38 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -135,8 +135,8 @@ __FBSDID("$FreeBSD$"); */ struct vpgqueues vm_page_queues[PQ_COUNT]; -struct mtx vm_page_queue_mtx; -struct mtx vm_page_queue_free_mtx; +struct vpglocks vm_page_queue_lock; +struct vpglocks vm_page_queue_free_lock; vm_page_t vm_page_array = 0; int vm_page_array_size = 0; @@ -1020,8 +1020,13 @@ vm_page_cache_transfer(vm_object_t orig_object, vm_pindex_t offidxstart, * VM_ALLOC_SYSTEM system *really* needs a page * VM_ALLOC_INTERRUPT interrupt time request * VM_ALLOC_ZERO zero page + * VM_ALLOC_WIRED wire the allocated page + * VM_ALLOC_NOOBJ page is not associated with a vm object + * VM_ALLOC_NOBUSY do not set the page busy + * VM_ALLOC_IFNOTCACHED return NULL, do not reactivate if the page + * is cached * - * This routine may not block. + * This routine may not sleep. */ vm_page_t vm_page_alloc(vm_object_t object, vm_pindex_t pindex, int req) diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h index b1b1070ae48d..662af98be83a 100644 --- a/sys/vm/vm_page.h +++ b/sys/vm/vm_page.h @@ -170,7 +170,15 @@ struct vpgqueues { }; extern struct vpgqueues vm_page_queues[PQ_COUNT]; -extern struct mtx vm_page_queue_free_mtx; + +struct vpglocks { + struct mtx data; + char pad[CACHE_LINE_SIZE - sizeof(struct mtx)]; +} __aligned(CACHE_LINE_SIZE); + +extern struct vpglocks vm_page_queue_free_lock; + +#define vm_page_queue_free_mtx vm_page_queue_free_lock.data /* * These are the flags defined for vm_page. @@ -258,7 +266,9 @@ PHYS_TO_VM_PAGE(vm_paddr_t pa) #endif } -extern struct mtx vm_page_queue_mtx; +extern struct vpglocks vm_page_queue_lock; + +#define vm_page_queue_mtx vm_page_queue_lock.data #define vm_page_lock_queues() mtx_lock(&vm_page_queue_mtx) #define vm_page_unlock_queues() mtx_unlock(&vm_page_queue_mtx) diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 19edce173ff3..723b14d2175a 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -951,6 +951,8 @@ rescan0: vnodes_skipped++; goto unlock_and_continue; } + KASSERT(mp != NULL, + ("vp %p with NULL v_mount", vp)); vm_page_unlock_queues(); vm_object_reference_locked(object); VM_OBJECT_UNLOCK(object); diff --git a/sys/vm/vm_zeroidle.c b/sys/vm/vm_zeroidle.c index a102e89a5c8b..6ba96e1c0064 100644 --- a/sys/vm/vm_zeroidle.c +++ b/sys/vm/vm_zeroidle.c @@ -139,26 +139,21 @@ vm_pagezero(void __unused *arg) } } -static struct proc *pagezero_proc; - static void pagezero_start(void __unused *arg) { int error; + struct proc *p; struct thread *td; - error = kproc_create(vm_pagezero, NULL, &pagezero_proc, RFSTOPPED, 0, - "pagezero"); + error = kproc_create(vm_pagezero, NULL, &p, RFSTOPPED, 0, "pagezero"); if (error) panic("pagezero_start: error %d\n", error); - /* - * We're an idle task, don't count us in the load. - */ - PROC_LOCK(pagezero_proc); - pagezero_proc->p_flag |= P_NOLOAD; - PROC_UNLOCK(pagezero_proc); - td = FIRST_THREAD_IN_PROC(pagezero_proc); + td = FIRST_THREAD_IN_PROC(p); thread_lock(td); + + /* We're an idle task, don't count us in the load. */ + td->td_flags |= TDF_NOLOAD; sched_class(td, PRI_IDLE); sched_prio(td, PRI_MAX_IDLE); sched_add(td, SRQ_BORING); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index faa6f37f831e..aedc794c5191 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -250,13 +250,16 @@ static void vnode_pager_dealloc(object) vm_object_t object; { - struct vnode *vp = object->handle; + struct vnode *vp; + int refs; + vp = object->handle; if (vp == NULL) panic("vnode_pager_dealloc: pager already dealloced"); VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); vm_object_pip_wait(object, "vnpdea"); + refs = object->ref_count; object->handle = NULL; object->type = OBJT_DEAD; @@ -267,6 +270,8 @@ vnode_pager_dealloc(object) ASSERT_VOP_ELOCKED(vp, "vnode_pager_dealloc"); vp->v_object = NULL; vp->v_vflag &= ~VV_TEXT; + while (refs-- > 0) + vunref(vp); } static boolean_t @@ -1011,7 +1016,6 @@ vnode_pager_putpages(object, m, count, sync, rtvals) { int rtval; struct vnode *vp; - struct mount *mp; int bytes = count * PAGE_SIZE; /* @@ -1034,8 +1038,6 @@ vnode_pager_putpages(object, m, count, sync, rtvals) */ vp = object->handle; VM_OBJECT_UNLOCK(object); - if (vp->v_type != VREG) - mp = NULL; rtval = VOP_PUTPAGES(vp, m, bytes, sync, rtvals, 0); KASSERT(rtval != EOPNOTSUPP, ("vnode_pager: stale FS putpages\n")); diff --git a/sys/i386/bios/smbios.c b/sys/x86/bios/smbios.c similarity index 100% rename from sys/i386/bios/smbios.c rename to sys/x86/bios/smbios.c diff --git a/sys/i386/bios/vpd.c b/sys/x86/bios/vpd.c similarity index 100% rename from sys/i386/bios/vpd.c rename to sys/x86/bios/vpd.c diff --git a/sys/i386/cpufreq/est.c b/sys/x86/cpufreq/est.c similarity index 98% rename from sys/i386/cpufreq/est.c rename to sys/x86/cpufreq/est.c index 2c6fd2ce6181..6a7b514a2c37 100644 --- a/sys/i386/cpufreq/est.c +++ b/sys/x86/cpufreq/est.c @@ -96,6 +96,8 @@ struct est_softc { static int msr_info_enabled = 0; TUNABLE_INT("hw.est.msr_info", &msr_info_enabled); +static int strict = -1; +TUNABLE_INT("hw.est.strict", &strict); /* Default bus clock value for Centrino processors. */ #define INTEL_BUS_CLK 100 @@ -1025,6 +1027,9 @@ est_attach(device_t dev) sc = device_get_softc(dev); sc->dev = dev; + /* On SMP system we can't guarantie independent freq setting. */ + if (strict == -1 && mp_ncpus > 1) + strict = 0; /* Check CPU for supported settings. */ if (est_get_info(dev)) return (ENXIO); @@ -1119,17 +1124,21 @@ est_acpi_info(device_t dev, freq_info **freqs) */ if (sets[i].freq > 0) { error = est_set_id16(dev, sets[i].spec[0], 1); - if (error != 0) { + if (error != 0 && strict) { if (bootverbose) device_printf(dev, "Invalid freq %u, " "ignored.\n", sets[i].freq); - } else { - table[j].freq = sets[i].freq; - table[j].volts = sets[i].volts; - table[j].id16 = sets[i].spec[0]; - table[j].power = sets[i].power; - ++j; + continue; + } else if (error != 0 && bootverbose) { + device_printf(dev, "Can't check freq %u, " + "it may be invalid\n", + sets[i].freq); } + table[j].freq = sets[i].freq; + table[j].volts = sets[i].volts; + table[j].id16 = sets[i].spec[0]; + table[j].power = sets[i].power; + ++j; } } /* restore saved setting */ diff --git a/sys/i386/cpufreq/hwpstate.c b/sys/x86/cpufreq/hwpstate.c similarity index 100% rename from sys/i386/cpufreq/hwpstate.c rename to sys/x86/cpufreq/hwpstate.c diff --git a/sys/i386/cpufreq/p4tcc.c b/sys/x86/cpufreq/p4tcc.c similarity index 100% rename from sys/i386/cpufreq/p4tcc.c rename to sys/x86/cpufreq/p4tcc.c diff --git a/sys/i386/cpufreq/powernow.c b/sys/x86/cpufreq/powernow.c similarity index 100% rename from sys/i386/cpufreq/powernow.c rename to sys/x86/cpufreq/powernow.c diff --git a/sys/i386/cpufreq/smist.c b/sys/x86/cpufreq/smist.c similarity index 100% rename from sys/i386/cpufreq/smist.c rename to sys/x86/cpufreq/smist.c diff --git a/sys/i386/isa/atpic.c b/sys/x86/isa/atpic.c similarity index 98% rename from sys/i386/isa/atpic.c rename to sys/x86/isa/atpic.c index 37a12859b551..d17153c06ed7 100644 --- a/sys/i386/isa/atpic.c +++ b/sys/x86/isa/atpic.c @@ -53,14 +53,22 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #ifdef PC98 #include #else -#include +#include #endif #include +#ifdef __amd64__ +#define SDT_ATPIC SDT_SYSIGT +#define GSEL_ATPIC 0 +#else +#define SDT_ATPIC SDT_SYS386IGT +#define GSEL_ATPIC GSEL(GCODE_SEL, SEL_KPL) +#endif + #define MASTER 0 #define SLAVE 1 @@ -468,8 +476,7 @@ atpic_startup(void) ai->at_intsrc.is_count = &ai->at_count; ai->at_intsrc.is_straycount = &ai->at_straycount; setidt(((struct atpic *)ai->at_intsrc.is_pic)->at_intbase + - ai->at_irq, ai->at_intr, SDT_SYS386IGT, SEL_KPL, - GSEL(GCODE_SEL, SEL_KPL)); + ai->at_irq, ai->at_intr, SDT_ATPIC, SEL_KPL, GSEL_ATPIC); } #ifdef DEV_MCA diff --git a/sys/isa/atrtc.c b/sys/x86/isa/atrtc.c similarity index 100% rename from sys/isa/atrtc.c rename to sys/x86/isa/atrtc.c diff --git a/sys/i386/isa/clock.c b/sys/x86/isa/clock.c similarity index 95% rename from sys/i386/isa/clock.c rename to sys/x86/isa/clock.c index 12e76e4b7ea9..6ced537c5c8f 100644 --- a/sys/i386/isa/clock.c +++ b/sys/x86/isa/clock.c @@ -39,12 +39,13 @@ __FBSDID("$FreeBSD$"); * Routines to handle clock hardware. */ +#ifndef __amd64__ #include "opt_apic.h" +#endif #include "opt_clock.h" #include "opt_kdtrace.h" #include "opt_isa.h" #include "opt_mca.h" -#include "opt_xbox.h" #include #include @@ -62,12 +63,9 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include -#ifdef DEV_APIC #include -#endif #include #include #include @@ -106,7 +104,7 @@ static u_int32_t i8254_offset; static int (*i8254_pending)(struct intsrc *); static int i8254_ticked; static int using_atrtc_timer; -static int using_lapic_timer; +static enum lapic_clock using_lapic_timer = LAPIC_CLOCK_NONE; /* Values for timerX_state: */ #define RELEASED 0 @@ -175,7 +173,8 @@ clkintr(struct trapframe *frame) clkintr_pending = 0; mtx_unlock_spin(&clock_lock); } - KASSERT(!using_lapic_timer, ("clk interrupt enabled with lapic timer")); + KASSERT(using_lapic_timer == LAPIC_CLOCK_NONE, + ("clk interrupt enabled with lapic timer")); #ifdef KDTRACE_HOOKS /* @@ -453,7 +452,7 @@ set_i8254_freq(u_int freq, int intr_freq) i8254_timecounter.tc_frequency = freq; mtx_lock_spin(&clock_lock); i8254_freq = freq; - if (using_lapic_timer) + if (using_lapic_timer != LAPIC_CLOCK_NONE) new_i8254_real_max_count = 0x10000; else new_i8254_real_max_count = TIMER_DIV(intr_freq); @@ -481,12 +480,15 @@ i8254_restore(void) mtx_unlock_spin(&clock_lock); } +#ifndef __amd64__ /* * Restore all the timers non-atomically (XXX: should be atomically). * * This function is called from pmtimer_resume() to restore all the timers. * This should not be necessary, but there are broken laptops that do not * restore all the timers on resume. + * As long as pmtimer is not part of amd64 suport, skip this for the amd64 + * case. */ void timer_restore(void) @@ -495,6 +497,7 @@ timer_restore(void) i8254_restore(); /* restore i8254_freq and hz */ atrtc_restore(); /* reenable RTC interrupts */ } +#endif /* This is separate from startrtclock() so that it can be called early. */ void @@ -524,7 +527,7 @@ void cpu_initclocks() { -#ifdef DEV_APIC +#if defined(__amd64__) || defined(DEV_APIC) using_lapic_timer = lapic_setup_clock(); #endif /* @@ -533,7 +536,7 @@ cpu_initclocks() * that it can drive hardclock(). Otherwise, change the 8254 * timecounter to user a simpler algorithm. */ - if (!using_lapic_timer) { + if (using_lapic_timer == LAPIC_CLOCK_NONE) { intr_add_handler("clk", 0, (driver_filter_t *)clkintr, NULL, NULL, INTR_TYPE_CLK, NULL); i8254_intsrc = intr_lookup_source(0); @@ -556,7 +559,7 @@ cpu_initclocks() * kernel clocks, then setup the RTC to periodically interrupt to * drive statclock() and profclock(). */ - if (!using_lapic_timer) { + if (using_lapic_timer != LAPIC_CLOCK_ALL) { using_atrtc_timer = atrtc_setup_clock(); if (using_atrtc_timer) { /* Enable periodic interrupts from the RTC. */ @@ -580,7 +583,7 @@ void cpu_startprofclock(void) { - if (using_lapic_timer || !using_atrtc_timer) + if (using_lapic_timer == LAPIC_CLOCK_ALL || !using_atrtc_timer) return; atrtc_rate(RTCSA_PROF); psdiv = pscnt = psratio; @@ -590,7 +593,7 @@ void cpu_stopprofclock(void) { - if (using_lapic_timer || !using_atrtc_timer) + if (using_lapic_timer == LAPIC_CLOCK_ALL || !using_atrtc_timer) return; atrtc_rate(RTCSA_NOPROF); psdiv = pscnt = 1; @@ -626,11 +629,15 @@ i8254_simple_get_timecount(struct timecounter *tc) static unsigned i8254_get_timecount(struct timecounter *tc) { + register_t flags; u_int count; u_int high, low; - u_int eflags; - eflags = read_eflags(); +#ifdef __amd64__ + flags = read_rflags(); +#else + flags = read_eflags(); +#endif mtx_lock_spin(&clock_lock); /* Select timer0 and latch counter value. */ @@ -641,7 +648,7 @@ i8254_get_timecount(struct timecounter *tc) count = i8254_max_count - ((high << 8) | low); if (count < i8254_lastcount || (!i8254_ticked && (clkintr_pending || - ((count < 20 || (!(eflags & PSL_I) && + ((count < 20 || (!(flags & PSL_I) && count < i8254_max_count / 2u)) && i8254_pending != NULL && i8254_pending(i8254_intsrc))))) { i8254_ticked = 1; @@ -679,6 +686,14 @@ attimer_attach(device_t dev) return(0); } +static int +attimer_resume(device_t dev) +{ + + i8254_restore(); + return (0); +} + static device_method_t attimer_methods[] = { /* Device interface */ DEVMETHOD(device_probe, attimer_probe), @@ -686,7 +701,7 @@ static device_method_t attimer_methods[] = { DEVMETHOD(device_detach, bus_generic_detach), DEVMETHOD(device_shutdown, bus_generic_shutdown), DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), + DEVMETHOD(device_resume, attimer_resume), { 0, 0 } }; diff --git a/sys/amd64/isa/elcr.c b/sys/x86/isa/elcr.c similarity index 100% rename from sys/amd64/isa/elcr.c rename to sys/x86/isa/elcr.c diff --git a/sys/i386/isa/icu.h b/sys/x86/isa/icu.h similarity index 96% rename from sys/i386/isa/icu.h rename to sys/x86/isa/icu.h index bd9df0850529..d7cd87afe8eb 100644 --- a/sys/i386/isa/icu.h +++ b/sys/x86/isa/icu.h @@ -38,8 +38,8 @@ * W. Jolitz 8/89 */ -#ifndef _I386_ISA_ICU_H_ -#define _I386_ISA_ICU_H_ +#ifndef _X86_ISA_ICU_H_ +#define _X86_ISA_ICU_H_ #ifdef PC98 #define ICU_IMR_OFFSET 2 @@ -50,4 +50,4 @@ void atpic_handle_intr(u_int vector, struct trapframe *frame); void atpic_startup(void); -#endif /* !_I386_ISA_ICU_H_ */ +#endif /* !_X86_ISA_ICU_H_ */ diff --git a/sys/i386/isa/isa.c b/sys/x86/isa/isa.c similarity index 99% rename from sys/i386/isa/isa.c rename to sys/x86/isa/isa.c index 786de1a98e79..7b2982a7b54a 100644 --- a/sys/i386/isa/isa.c +++ b/sys/x86/isa/isa.c @@ -245,7 +245,7 @@ isa_release_resource(device_t bus, device_t child, int type, int rid, */ int isa_setup_intr(device_t bus, device_t child, struct resource *r, int flags, - driver_filter_t filter, void (*ihand)(void *), void *arg, + driver_filter_t *filter, void (*ihand)(void *), void *arg, void **cookiep) { return (BUS_SETUP_INTR(device_get_parent(bus), child, r, flags, diff --git a/sys/i386/isa/isa.h b/sys/x86/isa/isa.h similarity index 97% rename from sys/i386/isa/isa.h rename to sys/x86/isa/isa.h index ac493b2d8435..78bd95694c3b 100644 --- a/sys/i386/isa/isa.h +++ b/sys/x86/isa/isa.h @@ -37,8 +37,8 @@ #error isa.h is included from PC-9801 source #endif -#ifndef _I386_ISA_ISA_H_ -#define _I386_ISA_ISA_H_ +#ifndef _X86_ISA_ISA_H_ +#define _X86_ISA_ISA_H_ /* BEWARE: Included in both assembler and C code */ @@ -99,4 +99,4 @@ #define RAM_SIZE (RAM_END - RAM_BEGIN) #endif /* !RAM_BEGIN */ -#endif /* !_I386_ISA_ISA_H_ */ +#endif /* !_X86_ISA_ISA_H_ */ diff --git a/sys/amd64/isa/isa_dma.c b/sys/x86/isa/isa_dma.c similarity index 90% rename from sys/amd64/isa/isa_dma.c rename to sys/x86/isa/isa_dma.c index ffd3baaddbae..cbc99598faaa 100644 --- a/sys/amd64/isa/isa_dma.c +++ b/sys/x86/isa/isa_dma.c @@ -61,7 +61,7 @@ __FBSDID("$FreeBSD$"); #include #include -#define ISARAM_END 0x1000000 +#define ISARAM_END RAM_END static int isa_dmarangecheck(caddr_t va, u_int length, int chan); @@ -71,6 +71,8 @@ static u_int8_t dma_bounced = 0; static u_int8_t dma_busy = 0; /* Used in isa_dmastart() */ static u_int8_t dma_inuse = 0; /* User for acquire/release */ static u_int8_t dma_auto_mode = 0; +static struct mtx isa_dma_lock; +MTX_SYSINIT(isa_dma_lock, &isa_dma_lock, "isa DMA lock", MTX_DEF); #define VALID_DMA_MASK (7) @@ -84,7 +86,34 @@ int isa_dma_init(int chan, u_int bouncebufsize, int flag) { void *buf; + int contig; +#ifdef DIAGNOSTIC + if (chan & ~VALID_DMA_MASK) + panic("isa_dma_init: channel out of range"); +#endif + + + /* Try malloc() first. It works better if it works. */ + buf = malloc(bouncebufsize, M_DEVBUF, flag); + if (buf != NULL) { + if (isa_dmarangecheck(buf, bouncebufsize, chan) != 0) { + free(buf, M_DEVBUF); + buf = NULL; + } + contig = 0; + } + + if (buf == NULL) { + buf = contigmalloc(bouncebufsize, M_DEVBUF, flag, 0ul, 0xfffffful, + 1ul, chan & 4 ? 0x20000ul : 0x10000ul); + contig = 1; + } + + if (buf == NULL) + return (ENOMEM); + + mtx_lock(&isa_dma_lock); /* * If a DMA channel is shared, both drivers have to call isa_dma_init * since they don't know that the other driver will do it. @@ -93,30 +122,20 @@ isa_dma_init(int chan, u_int bouncebufsize, int flag) * XXX: is typically the case since they are multiple instances of * XXX: the same driver. */ - if (dma_bouncebuf[chan] != NULL) + if (dma_bouncebuf[chan] != NULL) { + if (contig) + contigfree(buf, bouncebufsize, M_DEVBUF); + else + free(buf, M_DEVBUF); + mtx_unlock(&isa_dma_lock); return (0); - -#ifdef DIAGNOSTIC - if (chan & ~VALID_DMA_MASK) - panic("isa_dma_init: channel out of range"); -#endif + } dma_bouncebufsize[chan] = bouncebufsize; - - /* Try malloc() first. It works better if it works. */ - buf = malloc(bouncebufsize, M_DEVBUF, flag); - if (buf != NULL) { - if (isa_dmarangecheck(buf, bouncebufsize, chan) == 0) { - dma_bouncebuf[chan] = buf; - return (0); - } - free(buf, M_DEVBUF); - } - buf = contigmalloc(bouncebufsize, M_DEVBUF, flag, 0ul, 0xfffffful, - 1ul, chan & 4 ? 0x20000ul : 0x10000ul); - if (buf == NULL) - return (ENOMEM); dma_bouncebuf[chan] = buf; + + mtx_unlock(&isa_dma_lock); + return (0); } @@ -133,12 +152,15 @@ isa_dma_acquire(chan) panic("isa_dma_acquire: channel out of range"); #endif + mtx_lock(&isa_dma_lock); if (dma_inuse & (1 << chan)) { printf("isa_dma_acquire: channel %d already in use\n", chan); + mtx_unlock(&isa_dma_lock); return (EBUSY); } dma_inuse |= (1 << chan); dma_auto_mode &= ~(1 << chan); + mtx_unlock(&isa_dma_lock); return (0); } @@ -155,8 +177,11 @@ isa_dma_release(chan) if (chan & ~VALID_DMA_MASK) panic("isa_dma_release: channel out of range"); + mtx_lock(&isa_dma_lock); if ((dma_inuse & (1 << chan)) == 0) printf("isa_dma_release: channel %d not in use\n", chan); +#else + mtx_lock(&isa_dma_lock); #endif if (dma_busy & (1 << chan)) { @@ -171,6 +196,8 @@ isa_dma_release(chan) dma_inuse &= ~(1 << chan); dma_auto_mode &= ~(1 << chan); + + mtx_unlock(&isa_dma_lock); } /* @@ -186,6 +213,7 @@ isa_dmacascade(chan) panic("isa_dmacascade: channel out of range"); #endif + mtx_lock(&isa_dma_lock); /* set dma channel mode, and set dma channel mode */ if ((chan & 4) == 0) { outb(DMA1_MODE, DMA37MD_CASCADE | chan); @@ -194,6 +222,7 @@ isa_dmacascade(chan) outb(DMA2_MODE, DMA37MD_CASCADE | (chan & 3)); outb(DMA2_SMSK, chan & 3); } + mtx_unlock(&isa_dma_lock); } /* @@ -206,8 +235,11 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) vm_paddr_t phys; int waport; caddr_t newaddr; + int dma_range_checked; - GIANT_REQUIRED; + /* translate to physical */ + phys = pmap_extract(kernel_pmap, (vm_offset_t)addr); + dma_range_checked = isa_dmarangecheck(addr, nbytes, chan); #ifdef DIAGNOSTIC if (chan & ~VALID_DMA_MASK) @@ -217,8 +249,11 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) || (chan >= 4 && (nbytes > (1<<17) || (uintptr_t)addr & 1))) panic("isa_dmastart: impossible request"); + mtx_lock(&isa_dma_lock); if ((dma_inuse & (1 << chan)) == 0) printf("isa_dmastart: channel %d not acquired\n", chan); +#else + mtx_lock(&isa_dma_lock); #endif #if 0 @@ -233,7 +268,7 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) dma_busy |= (1 << chan); - if (isa_dmarangecheck(addr, nbytes, chan)) { + if (dma_range_checked) { if (dma_bouncebuf[chan] == NULL || dma_bouncebufsize[chan] < nbytes) panic("isa_dmastart: bad bounce buffer"); @@ -246,9 +281,6 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) addr = newaddr; } - /* translate to physical */ - phys = pmap_extract(kernel_pmap, (vm_offset_t)addr); - if (flags & ISADMA_RAW) { dma_auto_mode |= (1 << chan); } else { @@ -323,6 +355,7 @@ isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan) /* unmask channel */ outb(DMA2_SMSK, chan & 3); } + mtx_unlock(&isa_dma_lock); } void @@ -336,6 +369,7 @@ isa_dmadone(int flags, caddr_t addr, int nbytes, int chan) printf("isa_dmadone: channel %d not acquired\n", chan); #endif + mtx_lock(&isa_dma_lock); if (((dma_busy & (1 << chan)) == 0) && (dma_auto_mode & (1 << chan)) == 0 ) printf("isa_dmadone: channel %d not busy\n", chan); @@ -351,6 +385,7 @@ isa_dmadone(int flags, caddr_t addr, int nbytes, int chan) dma_bounced &= ~(1 << chan); } dma_busy &= ~(1 << chan); + mtx_unlock(&isa_dma_lock); } /* @@ -367,8 +402,6 @@ isa_dmarangecheck(caddr_t va, u_int length, int chan) vm_offset_t endva; u_int dma_pgmsk = (chan & 4) ? ~(128*1024-1) : ~(64*1024-1); - GIANT_REQUIRED; - endva = (vm_offset_t)round_page((vm_offset_t)va + length); for (; va < (caddr_t) endva ; va += PAGE_SIZE) { phys = trunc_page(pmap_extract(kernel_pmap, (vm_offset_t)va)); @@ -420,13 +453,15 @@ isa_dmarangecheck(caddr_t va, u_int length, int chan) * or -1 if the channel requested is not active. * */ -int -isa_dmastatus(int chan) +static int +isa_dmastatus_locked(int chan) { u_long cnt = 0; int ffport, waport; u_long low1, high1, low2, high2; + mtx_assert(&isa_dma_lock, MA_OWNED); + /* channel active? */ if ((dma_inuse & (1 << chan)) == 0) { printf("isa_dmastatus: channel %d not active\n", chan); @@ -472,6 +507,18 @@ isa_dmastatus(int chan) return(cnt); } +int +isa_dmastatus(int chan) +{ + int status; + + mtx_lock(&isa_dma_lock); + status = isa_dmastatus_locked(chan); + mtx_unlock(&isa_dma_lock); + + return (status); +} + /* * Reached terminal count yet ? */ @@ -491,12 +538,16 @@ isa_dmatc(int chan) int isa_dmastop(int chan) { + int status; + + mtx_lock(&isa_dma_lock); if ((dma_inuse & (1 << chan)) == 0) printf("isa_dmastop: channel %d not acquired\n", chan); if (((dma_busy & (1 << chan)) == 0) && ((dma_auto_mode & (1 << chan)) == 0)) { printf("chan %d not busy\n", chan); + mtx_unlock(&isa_dma_lock); return -2 ; } @@ -505,7 +556,12 @@ isa_dmastop(int chan) } else { outb(DMA2_SMSK, (chan & 3) | 4 /* disable mask */); } - return(isa_dmastatus(chan)); + + status = isa_dmastatus_locked(chan); + + mtx_unlock(&isa_dma_lock); + + return (status); } /* diff --git a/sys/i386/isa/nmi.c b/sys/x86/isa/nmi.c similarity index 100% rename from sys/i386/isa/nmi.c rename to sys/x86/isa/nmi.c diff --git a/sys/isa/orm.c b/sys/x86/isa/orm.c similarity index 100% rename from sys/isa/orm.c rename to sys/x86/isa/orm.c diff --git a/sys/xen/evtchn/evtchn_dev.c b/sys/xen/evtchn/evtchn_dev.c index 4253d8a1700d..7e21d7a07be6 100644 --- a/sys/xen/evtchn/evtchn_dev.c +++ b/sys/xen/evtchn/evtchn_dev.c @@ -302,11 +302,11 @@ evtchn_close(struct cdev *dev, int flag, int otyp, struct thread *td __unused) { int i; - mtx_lock_spin(&lock); if (ring != NULL) { free(ring, M_DEVBUF); ring = NULL; } + mtx_lock_spin(&lock); for ( i = 0; i < NR_EVENT_CHANNELS; i++ ) if ( synch_test_and_clear_bit(i, &bound_ports[0]) ) mask_evtchn(i); diff --git a/sys/xen/gnttab.c b/sys/xen/gnttab.c index d05790bbf84f..ae44e8f6a8f5 100644 --- a/sys/xen/gnttab.c +++ b/sys/xen/gnttab.c @@ -325,7 +325,7 @@ gnttab_claim_grant_reference(grant_ref_t *private_head) grant_ref_t g = *private_head; if (unlikely(g == GNTTAB_LIST_END)) - return (ENOSPC); + return (g); *private_head = gnttab_entry(g); return (g); } diff --git a/sys/xen/xenbus/xenbus_probe.c b/sys/xen/xenbus/xenbus_probe.c index f04f8eca4638..b1e9a2108aa6 100644 --- a/sys/xen/xenbus/xenbus_probe.c +++ b/sys/xen/xenbus/xenbus_probe.c @@ -330,7 +330,7 @@ xenbus_devices_changed(struct xenbus_watch *watch, device_t dev = sc->xs_dev; char *node, *bus, *type, *id, *p; - node = strdup(vec[XS_WATCH_PATH], M_DEVBUF);; + node = strdup(vec[XS_WATCH_PATH], M_DEVBUF); p = strchr(node, '/'); if (!p) goto out; diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc index e8c1f1f11bb3..dd5497e01c3a 100644 --- a/tools/build/mk/OptionalObsoleteFiles.inc +++ b/tools/build/mk/OptionalObsoleteFiles.inc @@ -5,6 +5,17 @@ # the check-old and delete-old* targets. # +.if ${MK_ACCT} == no +OLD_FILES+=etc/periodic/daily/310.accounting +OLD_FILES+=etc/periodic/monthly/200.accounting +OLD_FILES+=usr/sbin/ac +OLD_FILES+=usr/sbin/accton +OLD_FILES+=usr/sbin/sa +OLD_FILES+=usr/share/man/man8/ac.8.gz +OLD_FILES+=usr/share/man/man8/accton.8.gz +OLD_FILES+=usr/share/man/man8/sa.8.gz +.endif + .if ${MK_ACPI} == no OLD_FILES+=usr/sbin/acpiconf OLD_FILES+=usr/sbin/acpidb @@ -16,9 +27,102 @@ OLD_FILES+=usr/share/man/man8/acpidump.8.gz OLD_FILES+=usr/share/man/man8/iasl.8.gz .endif -#.if ${MK_ATM} == no -# to be filled in -#.endif +.if ${MK_AMD} == no +OLD_FILES+=etc/amd.map +OLD_FILES+=usr/bin/pawd +OLD_FILES+=usr/sbin/amd +OLD_FILES+=usr/sbin/amq +OLD_FILES+=usr/sbin/fixmount +OLD_FILES+=usr/sbin/fsinfo +OLD_FILES+=usr/sbin/hlfsd +OLD_FILES+=usr/sbin/mk-amd-map +OLD_FILES+=usr/sbin/wire-test +OLD_FILES+=usr/share/examples/etc/amd.map +OLD_FILES+=usr/share/info/am-utils.info.gz +OLD_FILES+=usr/share/man/man1/pawd.1.gz +OLD_FILES+=usr/share/man/man5/amd.conf.5.gz +OLD_FILES+=usr/share/man/man8/amd.8.gz +OLD_FILES+=usr/share/man/man8/amq.8.gz +OLD_FILES+=usr/share/man/man8/fixmount.8.gz +OLD_FILES+=usr/share/man/man8/fsinfo.8.gz +OLD_FILES+=usr/share/man/man8/hlfsd.8.gz +OLD_FILES+=usr/share/man/man8/mk-amd-map.8.gz +OLD_FILES+=usr/share/man/man8/wire-test.8.gz +.endif + +.if ${MK_APM} == no +OLD_FILES+=etc/apmd.conf +OLD_FILES+=usr/sbin/apm +OLD_FILES+=usr/share/examples/etc/apmd.conf +OLD_FILES+=usr/share/man/man8/amd64/apm.8.gz +OLD_FILES+=usr/share/man/man8/amd64/apmconf.8.gz +.endif + +.if ${MK_AT} == no +OLD_FILES+=usr/bin/at +OLD_FILES+=usr/bin/atq +OLD_FILES+=usr/bin/atrm +OLD_FILES+=usr/bin/batch +OLD_FILES+=usr/libexec/atrun +OLD_FILES+=usr/share/man/man1/at.1.gz +OLD_FILES+=usr/share/man/man1/atq.1.gz +OLD_FILES+=usr/share/man/man1/atrm.1.gz +OLD_FILES+=usr/share/man/man1/batch.1.gz +OLD_FILES+=usr/share/man/man8/atrun.8.gz +.endif + +.if ${MK_ATM} == no +OLD_FILES+=rescue/atmconfig +OLD_FILES+=sbin/atmconfig +OLD_FILES+=usr/bin/sscop +OLD_FILES+=usr/include/bsnmp/snmp_atm.h +OLD_FILES+=usr/include/netnatm/addr.h +OLD_FILES+=usr/include/netnatm/api/atmapi.h +OLD_FILES+=usr/include/netnatm/api/ccatm.h +OLD_FILES+=usr/include/netnatm/api/unisap.h +OLD_FILES+=usr/include/netnatm/msg/uni_config.h +OLD_FILES+=usr/include/netnatm/msg/uni_hdr.h +OLD_FILES+=usr/include/netnatm/msg/uni_ie.h +OLD_FILES+=usr/include/netnatm/msg/uni_msg.h +OLD_FILES+=usr/include/netnatm/msg/unimsglib.h +OLD_FILES+=usr/include/netnatm/msg/uniprint.h +OLD_FILES+=usr/include/netnatm/msg/unistruct.h +OLD_FILES+=usr/include/netnatm/saal/sscfu.h +OLD_FILES+=usr/include/netnatm/saal/sscfudef.h +OLD_FILES+=usr/include/netnatm/saal/sscop.h +OLD_FILES+=usr/include/netnatm/saal/sscopdef.h +OLD_FILES+=usr/include/netnatm/sig/uni.h +OLD_FILES+=usr/include/netnatm/sig/unidef.h +OLD_FILES+=usr/include/netnatm/sig/unisig.h +OLD_FILES+=usr/include/netnatm/unimsg.h +OLD_FILES+=usr/lib/libngatm.a +OLD_FILES+=usr/lib/libngatm.so +OLD_LIBS+=usr/lib/libngatm.so.4 +OLD_FILES+=usr/lib/libngatm_p.a +OLD_FILES+=usr/lib/snmp_atm.so +OLD_LIBS+=usr/lib/snmp_atm.so.6 +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libngatm.a +OLD_FILES+=usr/lib32/libngatm.so +OLD_LIBS+=usr/lib32/libngatm.so.4 +OLD_FILES+=usr/lib32/libngatm_p.a +.endif +OLD_FILES+=usr/share/doc/atm/atmconfig.help +OLD_FILES+=usr/share/doc/atm/atmconfig_device.help +OLD_FILES+=usr/share/man/man1/sscop.1.gz +OLD_FILES+=usr/share/man/man3/libngatm.3.gz +OLD_FILES+=usr/share/man/man3/snmp_atm.3.gz +OLD_FILES+=usr/share/man/man3/uniaddr.3.gz +OLD_FILES+=usr/share/man/man3/unifunc.3.gz +OLD_FILES+=usr/share/man/man3/unimsg.3.gz +OLD_FILES+=usr/share/man/man3/unisap.3.gz +OLD_FILES+=usr/share/man/man3/unistruct.3.gz +OLD_FILES+=usr/share/man/man8/atmconfig.8.gz +OLD_FILES+=usr/share/snmp/defs/atm_freebsd.def +OLD_FILES+=usr/share/snmp/defs/atm_tree.def +OLD_FILES+=usr/share/snmp/mibs/BEGEMOT-ATM-FREEBSD-MIB.txt +OLD_FILES+=usr/share/snmp/mibs/BEGEMOT-ATM.txt +.endif .if ${MK_AUDIT} == no OLD_FILES+=usr/sbin/audit @@ -31,9 +135,10 @@ OLD_FILES+=usr/share/man/man8/audit.8.gz OLD_FILES+=usr/share/man/man8/auditd.8.gz .endif -#.if ${MK_AUTHPF} == no -# to be filled in -#.endif +.if ${MK_AUTHPF} == no +OLD_FILES+=usr/sbin/authpf +OLD_FILES+=usr/share/man/man8/authpf.8.gz +.endif .if ${MK_BIND} == no OLD_FILES+=usr/bin/dig @@ -233,33 +338,50 @@ OLD_DIRS+=var/named/etc/namedb/dynamic #.endif .if ${MK_BLUETOOTH} == no +OLD_FILES+=etc/bluetooth/hcsecd.conf +OLD_FILES+=etc/bluetooth/hosts +OLD_FILES+=etc/bluetooth/protocols OLD_FILES+=usr/bin/bthost OLD_FILES+=usr/bin/btsockstat OLD_FILES+=usr/bin/rfcomm_sppd +OLD_FILES+=usr/include/bluetooth.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_bluetooth.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_bt3c.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_btsocket.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_btsocket_hci_raw.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_btsocket_l2cap.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_btsocket_rfcomm.h +OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_btsocket_sco.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_h4.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_hci.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_l2cap.h OLD_FILES+=usr/include/netgraph/bluetooth/include/ng_ubt.h OLD_DIRS+=usr/include/netgraph/bluetooth/include OLD_DIRS+=usr/include/netgraph/bluetooth -OLD_FILES+=usr/include/bluetooth.h OLD_FILES+=usr/include/sdp.h OLD_FILES+=usr/lib/libbluetooth.a -OLD_FILES+=usr/lib/libbluetooth_p.a -OLD_LIBS+=usr/lib/libbluetooth.so.2 OLD_FILES+=usr/lib/libbluetooth.so +OLD_LIBS+=usr/lib/libbluetooth.so.4 +OLD_FILES+=usr/lib/libbluetooth_p.a OLD_FILES+=usr/lib/libsdp.a -OLD_FILES+=usr/lib/libsdp_p.a -OLD_LIBS+=usr/lib/libsdp.so.2 OLD_FILES+=usr/lib/libsdp.so +OLD_LIBS+=usr/lib/libsdp.so.4 +OLD_FILES+=usr/lib/libsdp_p.a +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libbluetooth.a +OLD_FILES+=usr/lib32/libbluetooth.so +OLD_LIBS+=usr/lib32/libbluetooth.so.4 +OLD_FILES+=usr/lib32/libbluetooth_p.a +OLD_FILES+=usr/lib32/libsdp.a +OLD_FILES+=usr/lib32/libsdp.so +OLD_LIBS+=usr/lib32/libsdp.so.4 +OLD_FILES+=usr/lib32/libsdp_p.a +.endif OLD_FILES+=usr/sbin/bcmfw OLD_FILES+=usr/sbin/bt3cfw +OLD_FILES+=usr/sbin/bthidcontrol +OLD_FILES+=usr/sbin/bthidd +OLD_FILES+=usr/sbin/btpand OLD_FILES+=usr/sbin/hccontrol OLD_FILES+=usr/sbin/hcsecd OLD_FILES+=usr/sbin/hcseriald @@ -271,45 +393,67 @@ OLD_FILES+=usr/sbin/sdpd OLD_FILES+=usr/share/man/man1/bthost.1.gz OLD_FILES+=usr/share/man/man1/btsockstat.1.gz OLD_FILES+=usr/share/man/man1/rfcomm_sppd.1.gz -OLD_FILES+=usr/share/man/man3/bluetooth.3.gz -OLD_FILES+=usr/share/man/man3/bt_gethostbyname.3.gz -OLD_FILES+=usr/share/man/man3/bt_gethostbyaddr.3.gz -OLD_FILES+=usr/share/man/man3/bt_gethostent.3.gz -OLD_FILES+=usr/share/man/man3/bt_sethostent.3.gz -OLD_FILES+=usr/share/man/man3/bt_endhostent.3.gz -OLD_FILES+=usr/share/man/man3/bt_getprotobyname.3.gz -OLD_FILES+=usr/share/man/man3/bt_getprotobynumber.3.gz -OLD_FILES+=usr/share/man/man3/bt_getprotoent.3.gz -OLD_FILES+=usr/share/man/man3/bt_setprotoent.3.gz -OLD_FILES+=usr/share/man/man3/bt_endprotoent.3.gz -OLD_FILES+=usr/share/man/man3/bt_ntoa.3.gz -OLD_FILES+=usr/share/man/man3/bt_aton.3.gz -OLD_FILES+=usr/share/man/man3/sdp.3.gz -OLD_FILES+=usr/share/man/man3/SDP_GET8.3.gz +OLD_FILES+=usr/share/man/man3/SDP_GET128.3.gz OLD_FILES+=usr/share/man/man3/SDP_GET16.3.gz OLD_FILES+=usr/share/man/man3/SDP_GET32.3.gz OLD_FILES+=usr/share/man/man3/SDP_GET64.3.gz -OLD_FILES+=usr/share/man/man3/SDP_GET128.3.gz -OLD_FILES+=usr/share/man/man3/SDP_PUT8.3.gz +OLD_FILES+=usr/share/man/man3/SDP_GET8.3.gz +OLD_FILES+=usr/share/man/man3/SDP_PUT128.3.gz OLD_FILES+=usr/share/man/man3/SDP_PUT16.3.gz OLD_FILES+=usr/share/man/man3/SDP_PUT32.3.gz OLD_FILES+=usr/share/man/man3/SDP_PUT64.3.gz -OLD_FILES+=usr/share/man/man3/SDP_PUT128.3.gz -OLD_FILES+=usr/share/man/man3/sdp_open.3.gz -OLD_FILES+=usr/share/man/man3/sdp_open_local.3.gz +OLD_FILES+=usr/share/man/man3/SDP_PUT8.3.gz +OLD_FILES+=usr/share/man/man3/bdaddr_any.3.gz +OLD_FILES+=usr/share/man/man3/bdaddr_copy.3.gz +OLD_FILES+=usr/share/man/man3/bdaddr_same.3.gz +OLD_FILES+=usr/share/man/man3/bluetooth.3.gz +OLD_FILES+=usr/share/man/man3/bt_aton.3.gz +OLD_FILES+=usr/share/man/man3/bt_devaddr.3.gz +OLD_FILES+=usr/share/man/man3/bt_devclose.3.gz +OLD_FILES+=usr/share/man/man3/bt_devenum.3.gz +OLD_FILES+=usr/share/man/man3/bt_devfilter.3.gz +OLD_FILES+=usr/share/man/man3/bt_devfilter_evt_clr.3.gz +OLD_FILES+=usr/share/man/man3/bt_devfilter_evt_set.3.gz +OLD_FILES+=usr/share/man/man3/bt_devfilter_evt_tst.3.gz +OLD_FILES+=usr/share/man/man3/bt_devfilter_pkt_clr.3.gz +OLD_FILES+=usr/share/man/man3/bt_devfilter_pkt_set.3.gz +OLD_FILES+=usr/share/man/man3/bt_devfilter_pkt_tst.3.gz +OLD_FILES+=usr/share/man/man3/bt_devinfo.3.gz +OLD_FILES+=usr/share/man/man3/bt_devinquiry.3.gz +OLD_FILES+=usr/share/man/man3/bt_devname.3.gz +OLD_FILES+=usr/share/man/man3/bt_devopen.3.gz +OLD_FILES+=usr/share/man/man3/bt_devreq.3.gz +OLD_FILES+=usr/share/man/man3/bt_devsend.3.gz +OLD_FILES+=usr/share/man/man3/bt_endhostent.3.gz +OLD_FILES+=usr/share/man/man3/bt_endprotoent.3.gz +OLD_FILES+=usr/share/man/man3/bt_gethostbyaddr.3.gz +OLD_FILES+=usr/share/man/man3/bt_gethostbyname.3.gz +OLD_FILES+=usr/share/man/man3/bt_gethostent.3.gz +OLD_FILES+=usr/share/man/man3/bt_getprotobyname.3.gz +OLD_FILES+=usr/share/man/man3/bt_getprotobynumber.3.gz +OLD_FILES+=usr/share/man/man3/bt_getprotoent.3.gz +OLD_FILES+=usr/share/man/man3/bt_ntoa.3.gz +OLD_FILES+=usr/share/man/man3/bt_sethostent.3.gz +OLD_FILES+=usr/share/man/man3/bt_setprotoent.3.gz +OLD_FILES+=usr/share/man/man3/sdp.3.gz +OLD_FILES+=usr/share/man/man3/sdp_attr2desc.3.gz +OLD_FILES+=usr/share/man/man3/sdp_change_service.3.gz OLD_FILES+=usr/share/man/man3/sdp_close.3.gz OLD_FILES+=usr/share/man/man3/sdp_error.3.gz -OLD_FILES+=usr/share/man/man3/sdp_search.3.gz -OLD_FILES+=usr/share/man/man3/sdp_attr2desc.3.gz -OLD_FILES+=usr/share/man/man3/sdp_uuid2desc.3.gz +OLD_FILES+=usr/share/man/man3/sdp_open.3.gz +OLD_FILES+=usr/share/man/man3/sdp_open_local.3.gz OLD_FILES+=usr/share/man/man3/sdp_register_service.3.gz +OLD_FILES+=usr/share/man/man3/sdp_search.3.gz OLD_FILES+=usr/share/man/man3/sdp_unregister_service.3.gz -OLD_FILES+=usr/share/man/man3/sdp_change_service.3.gz +OLD_FILES+=usr/share/man/man3/sdp_uuid2desc.3.gz OLD_FILES+=usr/share/man/man5/hcsecd.conf.5.gz OLD_FILES+=usr/share/man/man8/bcmfw.8.gz OLD_FILES+=usr/share/man/man8/bt3cfw.8.gz -OLD_FILES+=usr/share/man/man8/hcsecd.8.gz +OLD_FILES+=usr/share/man/man8/bthidcontrol.8.gz +OLD_FILES+=usr/share/man/man8/bthidd.8.gz +OLD_FILES+=usr/share/man/man8/btpand.8.gz OLD_FILES+=usr/share/man/man8/hccontrol.8.gz +OLD_FILES+=usr/share/man/man8/hcsecd.8.gz OLD_FILES+=usr/share/man/man8/hcseriald.8.gz OLD_FILES+=usr/share/man/man8/l2control.8.gz OLD_FILES+=usr/share/man/man8/l2ping.8.gz @@ -322,77 +466,315 @@ OLD_FILES+=usr/share/man/man8/sdpd.8.gz # to be filled in #.endif -#.if ${MK_CALENDAR} == no -# to be filled in -#.endif +.if ${MK_CALENDAR} == no +OLD_FILES+=etc/periodic/daily/300.calendar +OLD_FILES+=usr/bin/calendar +OLD_FILES+=usr/share/calendar/calendar.all +OLD_FILES+=usr/share/calendar/calendar.australia +OLD_FILES+=usr/share/calendar/calendar.birthday +OLD_FILES+=usr/share/calendar/calendar.christian +OLD_FILES+=usr/share/calendar/calendar.computer +OLD_FILES+=usr/share/calendar/calendar.croatian +OLD_FILES+=usr/share/calendar/calendar.dutch +OLD_FILES+=usr/share/calendar/calendar.freebsd +OLD_FILES+=usr/share/calendar/calendar.french +OLD_FILES+=usr/share/calendar/calendar.german +OLD_FILES+=usr/share/calendar/calendar.history +OLD_FILES+=usr/share/calendar/calendar.holiday +OLD_FILES+=usr/share/calendar/calendar.hungarian +OLD_FILES+=usr/share/calendar/calendar.judaic +OLD_FILES+=usr/share/calendar/calendar.lotr +OLD_FILES+=usr/share/calendar/calendar.music +OLD_FILES+=usr/share/calendar/calendar.newzealand +OLD_FILES+=usr/share/calendar/calendar.russian +OLD_FILES+=usr/share/calendar/calendar.southafrica +OLD_FILES+=usr/share/calendar/calendar.ukrainian +OLD_FILES+=usr/share/calendar/calendar.usholiday +OLD_FILES+=usr/share/calendar/calendar.world +OLD_DIRS+=usr/share/calendar/de_AT.ISO_8859-15 +OLD_FILES+=usr/share/calendar/de_AT.ISO_8859-15/calendar.feiertag +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-1/calendar.all +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-1/calendar.feiertag +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-1/calendar.geschichte +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-1/calendar.kirche +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-1/calendar.literatur +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-1/calendar.musik +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-1/calendar.wissenschaft +OLD_FILES+=usr/share/calendar/de_DE.ISO8859-15 +OLD_FILES+=usr/share/calendar/fr_FR.ISO8859-1/calendar.all +OLD_FILES+=usr/share/calendar/fr_FR.ISO8859-1/calendar.fetes +OLD_FILES+=usr/share/calendar/fr_FR.ISO8859-1/calendar.french +OLD_FILES+=usr/share/calendar/fr_FR.ISO8859-1/calendar.jferies +OLD_FILES+=usr/share/calendar/fr_FR.ISO8859-1/calendar.proverbes +OLD_FILES+=usr/share/calendar/fr_FR.ISO8859-15 +OLD_FILES+=usr/share/calendar/hr_HR.ISO8859-2/calendar.all +OLD_FILES+=usr/share/calendar/hr_HR.ISO8859-2/calendar.praznici +OLD_FILES+=usr/share/calendar/hu_HU.ISO8859-2/calendar.all +OLD_FILES+=usr/share/calendar/hu_HU.ISO8859-2/calendar.nevnapok +OLD_FILES+=usr/share/calendar/hu_HU.ISO8859-2/calendar.unnepek +OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.all +OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.common +OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.holiday +OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.military +OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.msk +OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.orthodox +OLD_FILES+=usr/share/calendar/ru_RU.KOI8-R/calendar.pagan +OLD_FILES+=usr/share/calendar/uk_UA.KOI8-U/calendar.all +OLD_FILES+=usr/share/calendar/uk_UA.KOI8-U/calendar.holiday +OLD_FILES+=usr/share/calendar/uk_UA.KOI8-U/calendar.misc +OLD_FILES+=usr/share/calendar/uk_UA.KOI8-U/calendar.orthodox +OLD_FILES+=usr/share/man/man1/calendar.1.gz +.endif .if ${MK_CDDL} == no -OLD_LIBS+=lib/libavl.so.1 -OLD_LIBS+=lib/libnvpair.so.1 -OLD_LIBS+=lib/libumem.so.1 -OLD_LIBS+=lib/libuutil.so.1 +OLD_LIBS+=lib/libavl.so.2 +OLD_LIBS+=lib/libctf.so.2 +OLD_LIBS+=lib/libdtrace.so.2 +OLD_LIBS+=lib/libnvpair.so.2 +OLD_LIBS+=lib/libumem.so.2 +OLD_LIBS+=lib/libuutil.so.2 +OLD_FILES+=usr/bin/ctfconvert +OLD_FILES+=usr/bin/ctfdump +OLD_FILES+=usr/bin/ctfmerge +OLD_FILES+=usr/bin/sgsmsg +OLD_FILES+=usr/lib/dtrace/drti.o +OLD_FILES+=usr/lib/dtrace/errno.d +OLD_FILES+=usr/lib/dtrace/psinfo.d +OLD_FILES+=usr/lib/dtrace/signal.d +OLD_FILES+=usr/lib/dtrace/unistd.d OLD_FILES+=usr/lib/libavl.a OLD_FILES+=usr/lib/libavl.so +OLD_FILES+=usr/lib/libavl_p.a +OLD_FILES+=usr/lib/libctf.a +OLD_FILES+=usr/lib/libctf.so +OLD_FILES+=usr/lib/libctf_p.a +OLD_FILES+=usr/lib/libdtrace.a +OLD_FILES+=usr/lib/libdtrace.so +OLD_FILES+=usr/lib/libdtrace_p.a OLD_FILES+=usr/lib/libnvpair.a OLD_FILES+=usr/lib/libnvpair.so +OLD_FILES+=usr/lib/libnvpair_p.a OLD_FILES+=usr/lib/libumem.a OLD_FILES+=usr/lib/libumem.so +OLD_FILES+=usr/lib/libumem_p.a OLD_FILES+=usr/lib/libuutil.a OLD_FILES+=usr/lib/libuutil.so +OLD_FILES+=usr/lib/libuutil_p.a +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/dtrace/drti.o +OLD_FILES+=usr/lib32/libavl.a +OLD_FILES+=usr/lib32/libavl.so +OLD_LIBS+=usr/lib32/libavl.so.2 +OLD_FILES+=usr/lib32/libavl_p.a +OLD_FILES+=usr/lib32/libctf.a +OLD_FILES+=usr/lib32/libctf.so +OLD_LIBS+=usr/lib32/libctf.so.2 +OLD_FILES+=usr/lib32/libctf_p.a +OLD_FILES+=usr/lib32/libdtrace.a +OLD_FILES+=usr/lib32/libdtrace.so +OLD_LIBS+=usr/lib32/libdtrace.so.2 +OLD_FILES+=usr/lib32/libdtrace_p.a +OLD_FILES+=usr/lib32/libnvpair.a +OLD_FILES+=usr/lib32/libnvpair.so +OLD_LIBS+=usr/lib32/libnvpair.so.2 +OLD_FILES+=usr/lib32/libnvpair_p.a +OLD_FILES+=usr/lib32/libumem.a +OLD_FILES+=usr/lib32/libumem.so +OLD_LIBS+=usr/lib32/libumem.so.2 +OLD_FILES+=usr/lib32/libumem_p.a +OLD_FILES+=usr/lib32/libuutil.a +OLD_FILES+=usr/lib32/libuutil.so +OLD_LIBS+=usr/lib32/libuutil.so.2 +OLD_FILES+=usr/lib32/libuutil_p.a +.endif +OLD_FILES+=usr/sbin/dtrace +OLD_FILES+=usr/sbin/lockstat +OLD_FILES+=usr/share/man/man1/dtrace.1.gz .endif .if ${MK_ZFS} == no -OLD_LIBS+=lib/libzfs.so.1 -OLD_LIBS+=lib/libzpool.so.1 +OLD_FILES+=boot/gptzfsboot +OLD_FILES+=boot/zfsboot +OLD_FILES+=boot/zfsloader +OLD_LIBS+=lib/libzfs.so.2 +OLD_LIBS+=lib/libzpool.so.2 +OLD_FILES+=rescue/zfs +OLD_FILES+=rescue/zpool OLD_FILES+=sbin/zfs OLD_FILES+=sbin/zpool +OLD_FILES+=usr/bin/zinject +OLD_FILES+=usr/bin/ztest OLD_FILES+=usr/lib/libzfs.a OLD_FILES+=usr/lib/libzfs.so +OLD_FILES+=usr/lib/libzfs_p.a OLD_FILES+=usr/lib/libzpool.a OLD_FILES+=usr/lib/libzpool.so -OLD_FILES+=usr/bin/ztest +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libzfs.a +OLD_FILES+=usr/lib32/libzfs.so +OLD_LIBS+=usr/lib32/libzfs.so.2 +OLD_FILES+=usr/lib32/libzfs_p.a +OLD_FILES+=usr/lib32/libzpool.a +OLD_FILES+=usr/lib32/libzpool.so +OLD_LIBS+=usr/lib32/libzpool.so.2 +.endif OLD_FILES+=usr/sbin/zdb OLD_FILES+=usr/share/man/man8/zdb.8.gz OLD_FILES+=usr/share/man/man8/zfs.8.gz OLD_FILES+=usr/share/man/man8/zpool.8.gz .endif -#.if ${MK_CPP} == no -# to be filled in -#.endif +.if ${MK_CPP} == no +OLD_FILES+=usr/bin/cpp +OLD_FILES+=usr/share/man/man1/cpp.1.gz +.endif #.if ${MK_CRYPT} == no # to be filled in #.endif -#.if ${MK_CVS} == no -# to be filled in -#.endif +.if ${MK_CTM} == no +OLD_FILES+=usr/sbin/ctm +OLD_FILES+=usr/sbin/ctm_dequeue +OLD_FILES+=usr/sbin/ctm_rmail +OLD_FILES+=usr/sbin/ctm_smail +OLD_FILES+=usr/share/man/man1/ctm.1.gz +OLD_FILES+=usr/share/man/man1/ctm_dequeue.1.gz +OLD_FILES+=usr/share/man/man1/ctm_rmail.1.gz +OLD_FILES+=usr/share/man/man1/ctm_smail.1.gz +OLD_FILES+=usr/share/man/man5/ctm.5.gz +.endif + +.if ${MK_CVS} == no +OLD_FILES+=usr/bin/cvs +OLD_FILES+=usr/bin/cvsbug +OLD_FILES+=usr/share/examples/cvs/contrib/README +OLD_FILES+=usr/share/examples/cvs/contrib/clmerge +OLD_FILES+=usr/share/examples/cvs/contrib/cln_hist +OLD_FILES+=usr/share/examples/cvs/contrib/commit_prep +OLD_FILES+=usr/share/examples/cvs/contrib/cvs2vendor +OLD_FILES+=usr/share/examples/cvs/contrib/cvs_acls +OLD_FILES+=usr/share/examples/cvs/contrib/cvscheck +OLD_FILES+=usr/share/examples/cvs/contrib/cvscheck.man +OLD_FILES+=usr/share/examples/cvs/contrib/cvshelp.man +OLD_FILES+=usr/share/examples/cvs/contrib/descend.man +OLD_FILES+=usr/share/examples/cvs/contrib/easy-import +OLD_FILES+=usr/share/examples/cvs/contrib/intro.doc +OLD_FILES+=usr/share/examples/cvs/contrib/log +OLD_FILES+=usr/share/examples/cvs/contrib/log_accum +OLD_FILES+=usr/share/examples/cvs/contrib/mfpipe +OLD_FILES+=usr/share/examples/cvs/contrib/rcs-to-cvs +OLD_FILES+=usr/share/examples/cvs/contrib/rcs2log +OLD_FILES+=usr/share/examples/cvs/contrib/rcslock +OLD_FILES+=usr/share/examples/cvs/contrib/sccs2rcs +OLD_FILES+=usr/share/info/cvs.info.gz +OLD_FILES+=usr/share/info/cvsclient.info.gz +OLD_FILES+=usr/share/man/man1/cvs.1.gz +OLD_FILES+=usr/share/man/man5/cvs.5.gz +OLD_FILES+=usr/share/man/man8/cvsbug.8.gz +.endif #.if ${MK_CXX} == no # to be filled in #.endif -#.if ${MK_DICT} == no -# to be filled in -#.endif +.if ${MK_DICT} == no +OLD_FILES+=usr/share/dict/README +OLD_FILES+=usr/share/dict/freebsd +OLD_FILES+=usr/share/dict/propernames +OLD_FILES+=usr/share/dict/web2 +OLD_FILES+=usr/share/dict/web2a +OLD_FILES+=usr/share/dict/words +.endif #.if ${MK_EXAMPLES} == no # to be filled in #.endif -#.if ${MK_GAMES} == no -# to be filled in -#.endif +.if ${MK_FLOPPY} == no +OLD_FILES+=usr/sbin/fdcontrol +OLD_FILES+=usr/sbin/fdformat +OLD_FILES+=usr/sbin/fdread +OLD_FILES+=usr/sbin/fdwrite +OLD_FILES+=usr/share/man/man1/fdformat.1.gz +OLD_FILES+=usr/share/man/man1/fdread.1.gz +OLD_FILES+=usr/share/man/man1/fdwrite.1.gz +OLD_FILES+=usr/share/man/man8/fdcontrol.8.gz +.endif + +.if ${MK_FREEBSD_UPDATE} == no +OLD_FILES+=etc/freebsd-update.conf +OLD_FILES+=usr/sbin/freebsd-update +OLD_FILES+=usr/share/examples/etc/freebsd-update.conf +OLD_FILES+=usr/share/man/man8/freebsd-update.8.gz +.endif + +.if ${MK_GAMES} == no +OLD_FILES+=usr/games/bcd +OLD_FILES+=usr/games/caesar +OLD_FILES+=usr/games/factor +OLD_FILES+=usr/games/fortune +OLD_FILES+=usr/games/grdc +OLD_FILES+=usr/games/morse +OLD_FILES+=usr/games/number +OLD_FILES+=usr/games/pom +OLD_FILES+=usr/games/ppt +OLD_FILES+=usr/games/primes +OLD_FILES+=usr/games/random +OLD_FILES+=usr/games/rot13 +OLD_FILES+=usr/games/strfile +OLD_FILES+=usr/games/unstr +OLD_FILES+=usr/share/games/fortune/fortunes +OLD_FILES+=usr/share/games/fortune/fortunes-o +OLD_FILES+=usr/share/games/fortune/fortunes-o.dat +OLD_FILES+=usr/share/games/fortune/fortunes.dat +OLD_FILES+=usr/share/games/fortune/freebsd-tips +OLD_FILES+=usr/share/games/fortune/freebsd-tips.dat +OLD_FILES+=usr/share/games/fortune/gerrold.limerick +OLD_FILES+=usr/share/games/fortune/gerrold.limerick.dat +OLD_FILES+=usr/share/games/fortune/limerick +OLD_FILES+=usr/share/games/fortune/limerick.dat +OLD_FILES+=usr/share/games/fortune/murphy +OLD_FILES+=usr/share/games/fortune/murphy-o +OLD_FILES+=usr/share/games/fortune/murphy-o.dat +OLD_FILES+=usr/share/games/fortune/murphy.dat +OLD_FILES+=usr/share/games/fortune/startrek +OLD_FILES+=usr/share/games/fortune/startrek.dat +OLD_FILES+=usr/share/games/fortune/zippy +OLD_FILES+=usr/share/games/fortune/zippy.dat +OLD_FILES+=usr/share/man/man6/bcd.6.gz +OLD_FILES+=usr/share/man/man6/caesar.6.gz +OLD_FILES+=usr/share/man/man6/factor.6.gz +OLD_FILES+=usr/share/man/man6/fortune.6.gz +OLD_FILES+=usr/share/man/man6/grdc.6.gz +OLD_FILES+=usr/share/man/man6/morse.6.gz +OLD_FILES+=usr/share/man/man6/number.6.gz +OLD_FILES+=usr/share/man/man6/pom.6.gz +OLD_FILES+=usr/share/man/man6/ppt.6.gz +OLD_FILES+=usr/share/man/man6/primes.6.gz +OLD_FILES+=usr/share/man/man6/random.6.gz +OLD_FILES+=usr/share/man/man6/rot13.6.gz +OLD_FILES+=usr/share/man/man8/strfile.8.gz +OLD_FILES+=usr/share/man/man8/unstr.8.gz +.endif .if ${MK_GCOV} == no OLD_FILES+=usr/bin/gcov OLD_FILES+=usr/share/man/man1/gcov.1.gz .endif -#.if ${MK_GDB} == no -# to be filled in -#.endif +.if ${MK_GDB} == no +OLD_FILES+=usr/bin/gdb +OLD_FILES+=usr/bin/gdbserver +OLD_FILES+=usr/bin/gdbtui +OLD_FILES+=usr/bin/kgdb +OLD_FILES+=usr/share/info/gdb.info.gz +OLD_FILES+=usr/share/info/gdbint.info.gz +OLD_FILES+=usr/share/info/stabs.info.gz +OLD_FILES+=usr/share/man/man1/gdb.1.gz +OLD_FILES+=usr/share/man/man1/gdbserver.1.gz +OLD_FILES+=usr/share/man/man1/kgdb.1.gz +.endif .if ${MK_GNU_CPIO} == no OLD_FILES+=usr/bin/gcpio @@ -400,9 +782,101 @@ OLD_FILES+=usr/share/info/cpio.info.gz OLD_FILES+=usr/share/man/man1/gcpio.1.gz .endif -#.if ${MK_GPIB} == no -# none -#.endif +.if ${MK_GPIB} == no +OLD_FILES+=usr/include/dev/ieee488/ibfoo_int.h +OLD_FILES+=usr/include/dev/ieee488/ugpib.h +OLD_FILES+=usr/include/dev/ieee488/upd7210.h +OLD_FILES+=usr/include/gpib/gpib.h +OLD_FILES+=usr/lib/libgpib.a +OLD_FILES+=usr/lib/libgpib.so +OLD_LIBS+=usr/lib/libgpib.so.3 +OLD_FILES+=usr/lib/libgpib_p.a +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libgpib.a +OLD_FILES+=usr/lib32/libgpib.so +OLD_LIBS+=usr/lib32/libgpib.so.3 +OLD_FILES+=usr/lib32/libgpib_p.a +.endif +.endif + +.if ${MK_GSSAPI} == no +OLD_FILES+=usr/lib/libgssapi.a +OLD_FILES+=usr/lib/libgssapi.so +OLD_LIBS+=usr/lib/libgssapi.so.10 +OLD_FILES+=usr/lib/libgssapi_p.a +OLD_FILES+=usr/lib/librpcsec_gss.a +OLD_FILES+=usr/lib/librpcsec_gss.so +OLD_LIBS+=usr/lib/librpcsec_gss.so.1 +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libgssapi.a +OLD_FILES+=usr/lib32/libgssapi.so +OLD_LIBS+=usr/lib32/libgssapi.so.10 +OLD_FILES+=usr/lib32/libgssapi_p.a +OLD_FILES+=usr/lib32/librpcsec_gss.a +OLD_FILES+=usr/lib32/librpcsec_gss.so +OLD_LIBS+=usr/lib32/librpcsec_gss.so.1 +.endif +OLD_FILES+=usr/sbin/gssd +OLD_FILES+=usr/share/man/man3/gss_accept_sec_context.3.gz +OLD_FILES+=usr/share/man/man3/gss_acquire_cred.3.gz +OLD_FILES+=usr/share/man/man3/gss_add_cred.3.gz +OLD_FILES+=usr/share/man/man3/gss_add_oid_set_member.3.gz +OLD_FILES+=usr/share/man/man3/gss_canonicalize_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_compare_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_context_time.3.gz +OLD_FILES+=usr/share/man/man3/gss_create_empty_oid_set.3.gz +OLD_FILES+=usr/share/man/man3/gss_delete_sec_context.3.gz +OLD_FILES+=usr/share/man/man3/gss_display_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_display_status.3.gz +OLD_FILES+=usr/share/man/man3/gss_duplicate_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_export_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_export_sec_context.3.gz +OLD_FILES+=usr/share/man/man3/gss_get_mic.3.gz +OLD_FILES+=usr/share/man/man3/gss_import_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_import_sec_context.3.gz +OLD_FILES+=usr/share/man/man3/gss_indicate_mechs.3.gz +OLD_FILES+=usr/share/man/man3/gss_init_sec_context.3.gz +OLD_FILES+=usr/share/man/man3/gss_inquire_context.3.gz +OLD_FILES+=usr/share/man/man3/gss_inquire_cred.3.gz +OLD_FILES+=usr/share/man/man3/gss_inquire_cred_by_mech.3.gz +OLD_FILES+=usr/share/man/man3/gss_inquire_mechs_for_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_inquire_names_for_mech.3.gz +OLD_FILES+=usr/share/man/man3/gss_process_context_token.3.gz +OLD_FILES+=usr/share/man/man3/gss_release_buffer.3.gz +OLD_FILES+=usr/share/man/man3/gss_release_cred.3.gz +OLD_FILES+=usr/share/man/man3/gss_release_name.3.gz +OLD_FILES+=usr/share/man/man3/gss_release_oid_set.3.gz +OLD_FILES+=usr/share/man/man3/gss_seal.3.gz +OLD_FILES+=usr/share/man/man3/gss_sign.3.gz +OLD_FILES+=usr/share/man/man3/gss_test_oid_set_member.3.gz +OLD_FILES+=usr/share/man/man3/gss_unseal.3.gz +OLD_FILES+=usr/share/man/man3/gss_unwrap.3.gz +OLD_FILES+=usr/share/man/man3/gss_verify.3.gz +OLD_FILES+=usr/share/man/man3/gss_verify_mic.3.gz +OLD_FILES+=usr/share/man/man3/gss_wrap.3.gz +OLD_FILES+=usr/share/man/man3/gss_wrap_size_limit.3.gz +OLD_FILES+=usr/share/man/man3/gssapi.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_get_error.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_get_mech_info.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_get_mechanisms.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_get_principal_name.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_get_versions.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_getcred.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_is_installed.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_max_data_length.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_mech_to_oid.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_oid_to_mech.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_qop_to_num.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_seccreate.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_set_callback.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_set_defaults.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_set_svc_name.3.gz +OLD_FILES+=usr/share/man/man3/rpc_gss_svc_max_data_length.3.gz +OLD_FILES+=usr/share/man/man3/rpcsec_gss.3.gz +OLD_FILES+=usr/share/man/man5/mech.5.gz +OLD_FILES+=usr/share/man/man5/qop.5.gz +OLD_FILES+=usr/share/man/man8/gssd.8.gz +.endif #.if ${MK_GROFF} == no # to be filled in @@ -420,8 +894,11 @@ OLD_FILES+=usr/share/man/man5/hesiod.conf.5.gz # to be filled in #.endif +.if ${MK_IDEA} == no +OLD_FILES+=usr/include/openssl/idea.h +.endif + .if ${MK_INET6} == no -OLD_FILES+=rescue/ping6 OLD_FILES+=sbin/ping6 OLD_FILES+=sbin/rtsol OLD_FILES+=usr/sbin/faithd @@ -449,6 +926,10 @@ OLD_FILES+=usr/share/man/man8/rtsold.8.gz OLD_FILES+=usr/share/man/man8/traceroute6.8.gz .endif +.if ${MK_INET6_SUPPORT} == no +OLD_FILES+=rescue/ping6 +.endif + #.if ${MK_INFO} == no # to be filled in #.endif @@ -532,15 +1013,26 @@ OLD_FILES+=usr/share/man/man8/ipnat.8.gz OLD_FILES+=usr/share/man/man8/ippool.8.gz .endif +.if ${MK_IPFW} == no +OLD_FILES+=etc/periodic/security/500.ipfwdenied +OLD_FILES+=etc/periodic/security/550.ipfwlimit +OLD_FILES+=sbin/ipfw +OLD_FILES+=sbin/natd +OLD_FILES+=usr/sbin/ipfwpcap +OLD_FILES+=usr/share/man/man8/ipfw.8.gz +OLD_FILES+=usr/share/man/man8/ipfwpcap.8.gz +OLD_FILES+=usr/share/man/man8/natd.8.gz +.endif + .if ${MK_IPX} == no -OLD_LIBS+=lib/libipx.so.4 +OLD_LIBS+=lib/libipx.so.5 OLD_FILES+=usr/lib/libipx.a OLD_FILES+=usr/lib/libipx.so OLD_FILES+=usr/lib/libipx_p.a .if ${TARGET_ARCH} == "amd64" OLD_FILES+=usr/lib32/libipx.a OLD_FILES+=usr/lib32/libipx.so -OLD_LIBS+=usr/lib32/libipx.so.4 +OLD_LIBS+=usr/lib32/libipx.so.5 OLD_FILES+=usr/lib32/libipx_p.a .endif OLD_FILES+=usr/sbin/IPXrouted @@ -550,77 +1042,178 @@ OLD_FILES+=usr/share/man/man3/ipx_ntoa.3.gz OLD_FILES+=usr/share/man/man8/IPXrouted.8.gz .endif +.if ${MK_JAIL} == no +OLD_FILES+=usr/sbin/jail +OLD_FILES+=usr/sbin/jexec +OLD_FILES+=usr/sbin/jls +OLD_FILES+=usr/share/man/man8/jail.8.gz +OLD_FILES+=usr/share/man/man8/jexec.8.gz +OLD_FILES+=usr/share/man/man8/jls.8.gz +.endif + .if ${MK_KERBEROS} == no -OLD_FILES+=usr/bin/ksu OLD_FILES+=usr/bin/kadmin OLD_FILES+=usr/bin/kdestroy OLD_FILES+=usr/bin/kinit OLD_FILES+=usr/bin/klist OLD_FILES+=usr/bin/kpasswd OLD_FILES+=usr/bin/krb5-config +OLD_FILES+=usr/bin/ksu OLD_FILES+=usr/bin/verify_krb5_conf +OLD_FILES+=usr/include/asn1_err.h +OLD_FILES+=usr/include/cms_asn1.h +OLD_FILES+=usr/include/digest_asn1.h +OLD_FILES+=usr/include/gssapi/gssapi_krb5.h +OLD_FILES+=usr/include/hdb-private.h +OLD_FILES+=usr/include/hdb-protos.h +OLD_FILES+=usr/include/hdb.h +OLD_FILES+=usr/include/hdb_asn1.h +OLD_FILES+=usr/include/hdb_err.h +OLD_FILES+=usr/include/heim_asn1.h +OLD_FILES+=usr/include/heim_err.h +OLD_FILES+=usr/include/heim_threads.h +OLD_FILES+=usr/include/heimntlm-protos.h +OLD_FILES+=usr/include/heimntlm.h +OLD_FILES+=usr/include/hx509-private.h +OLD_FILES+=usr/include/hx509-protos.h +OLD_FILES+=usr/include/hx509.h +OLD_FILES+=usr/include/hx509_err.h +OLD_FILES+=usr/include/k524_err.h OLD_FILES+=usr/include/kadm5/admin.h OLD_FILES+=usr/include/kadm5/kadm5-private.h OLD_FILES+=usr/include/kadm5/kadm5-protos.h OLD_FILES+=usr/include/kadm5/kadm5_err.h OLD_FILES+=usr/include/kadm5/private.h -OLD_FILES+=usr/include/asn1_err.h -OLD_FILES+=usr/include/krb5_asn1.h -OLD_FILES+=usr/include/hdb.h -OLD_FILES+=usr/include/hdb-private.h -OLD_FILES+=usr/include/hdb-protos.h -OLD_FILES+=usr/include/hdb_asn1.h -OLD_FILES+=usr/include/hdb_err.h OLD_FILES+=usr/include/kafs.h -OLD_FILES+=usr/include/heim_err.h -OLD_FILES+=usr/include/k524_err.h OLD_FILES+=usr/include/krb5-protos.h OLD_FILES+=usr/include/krb5-types.h +OLD_FILES+=usr/include/krb5-v4compat.h OLD_FILES+=usr/include/krb5.h +OLD_FILES+=usr/include/krb5_asn1.h OLD_FILES+=usr/include/krb5_err.h -OLD_FILES+=usr/include/roken.h +OLD_FILES+=usr/include/krb_err.h +OLD_FILES+=usr/include/kx509_asn1.h +OLD_FILES+=usr/include/ocsp_asn1.h +OLD_FILES+=usr/include/pkcs10_asn1.h +OLD_FILES+=usr/include/pkcs12_asn1.h +OLD_FILES+=usr/include/pkcs8_asn1.h +OLD_FILES+=usr/include/pkcs9_asn1.h +OLD_FILES+=usr/include/pkinit_asn1.h +OLD_FILES+=usr/include/rfc2459_asn1.h OLD_FILES+=usr/include/roken-common.h -OLD_FILES+=usr/lib/pam_krb5.so.3 -OLD_FILES+=usr/lib/pam_krb5.so -OLD_FILES+=usr/lib/pam_ksu.so.3 -OLD_FILES+=usr/lib/pam_ksu.so +OLD_FILES+=usr/include/roken.h OLD_FILES+=usr/lib/libasn1.a -OLD_FILES+=usr/lib/libasn1_p.a -OLD_FILES+=usr/lib/libasn1.so.8 OLD_FILES+=usr/lib/libasn1.so +OLD_LIBS+=usr/lib/libasn1.so.10 +OLD_FILES+=usr/lib/libasn1_p.a OLD_FILES+=usr/lib/libgssapi_krb5.a -OLD_FILES+=usr/lib/libgssapi_krb5_p.a -OLD_FILES+=usr/lib/libgssapi_krb5.so.8 OLD_FILES+=usr/lib/libgssapi_krb5.so +OLD_LIBS+=usr/lib/libgssapi_krb5.so.10 +OLD_FILES+=usr/lib/libgssapi_krb5_p.a +OLD_FILES+=usr/lib/libgssapi_ntlm.a +OLD_FILES+=usr/lib/libgssapi_ntlm.so +OLD_LIBS+=usr/lib/libgssapi_ntlm.so.10 +OLD_FILES+=usr/lib/libgssapi_ntlm_p.a +OLD_FILES+=usr/lib/libgssapi_spnego.a +OLD_FILES+=usr/lib/libgssapi_spnego.so +OLD_LIBS+=usr/lib/libgssapi_spnego.so.10 +OLD_FILES+=usr/lib/libgssapi_spnego_p.a OLD_FILES+=usr/lib/libhdb.a -OLD_FILES+=usr/lib/libhdb_p.a -OLD_FILES+=usr/lib/libhdb.so.8 OLD_FILES+=usr/lib/libhdb.so +OLD_LIBS+=usr/lib/libhdb.so.10 +OLD_FILES+=usr/lib/libhdb_p.a +OLD_FILES+=usr/lib/libheimntlm.a +OLD_FILES+=usr/lib/libheimntlm.so +OLD_LIBS+=usr/lib/libheimntlm.so.10 +OLD_FILES+=usr/lib/libheimntlm_p.a +OLD_FILES+=usr/lib/libhx509.a +OLD_FILES+=usr/lib/libhx509.so +OLD_LIBS+=usr/lib/libhx509.so.10 +OLD_FILES+=usr/lib/libhx509_p.a OLD_FILES+=usr/lib/libkadm5clnt.a -OLD_FILES+=usr/lib/libkadm5clnt_p.a -OLD_FILES+=usr/lib/libkadm5clnt.so.8 OLD_FILES+=usr/lib/libkadm5clnt.so +OLD_LIBS+=usr/lib/libkadm5clnt.so.10 +OLD_FILES+=usr/lib/libkadm5clnt_p.a OLD_FILES+=usr/lib/libkadm5srv.a -OLD_FILES+=usr/lib/libkadm5srv_p.a -OLD_FILES+=usr/lib/libkadm5srv.so.8 OLD_FILES+=usr/lib/libkadm5srv.so +OLD_LIBS+=usr/lib/libkadm5srv.so.10 +OLD_FILES+=usr/lib/libkadm5srv_p.a OLD_FILES+=usr/lib/libkafs5.a -OLD_FILES+=usr/lib/libkafs5_p.a -OLD_FILES+=usr/lib/libkafs5.so.8 OLD_FILES+=usr/lib/libkafs5.so +OLD_LIBS+=usr/lib/libkafs5.so.10 +OLD_FILES+=usr/lib/libkafs5_p.a OLD_FILES+=usr/lib/libkrb5.a -OLD_FILES+=usr/lib/libkrb5_p.a -OLD_FILES+=usr/lib/libkrb5.so.8 OLD_FILES+=usr/lib/libkrb5.so +OLD_LIBS+=usr/lib/libkrb5.so.10 +OLD_FILES+=usr/lib/libkrb5_p.a OLD_FILES+=usr/lib/libroken.a -OLD_FILES+=usr/lib/libroken_p.a -OLD_FILES+=usr/lib/libroken.so.8 OLD_FILES+=usr/lib/libroken.so -OLD_FILES+=usr/libexec/ipropd-master -OLD_FILES+=usr/libexec/ipropd-slave +OLD_LIBS+=usr/lib/libroken.so.10 +OLD_FILES+=usr/lib/libroken_p.a +OLD_FILES+=usr/lib/pam_krb5.so +OLD_LIBS+=usr/lib/pam_krb5.so.5 +OLD_FILES+=usr/lib/pam_ksu.so +OLD_LIBS+=usr/lib/pam_ksu.so.5 +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libasn1.a +OLD_FILES+=usr/lib32/libasn1.so +OLD_LIBS+=usr/lib32/libasn1.so.10 +OLD_FILES+=usr/lib32/libasn1_p.a +OLD_FILES+=usr/lib32/libgssapi_krb5.a +OLD_FILES+=usr/lib32/libgssapi_krb5.so +OLD_LIBS+=usr/lib32/libgssapi_krb5.so.10 +OLD_FILES+=usr/lib32/libgssapi_krb5_p.a +OLD_FILES+=usr/lib32/libgssapi_ntlm.a +OLD_FILES+=usr/lib32/libgssapi_ntlm.so +OLD_LIBS+=usr/lib32/libgssapi_ntlm.so.10 +OLD_FILES+=usr/lib32/libgssapi_ntlm_p.a +OLD_FILES+=usr/lib32/libgssapi_spnego.a +OLD_FILES+=usr/lib32/libgssapi_spnego.so +OLD_LIBS+=usr/lib32/libgssapi_spnego.so.10 +OLD_FILES+=usr/lib32/libgssapi_spnego_p.a +OLD_FILES+=usr/lib32/libhdb.a +OLD_FILES+=usr/lib32/libhdb.so +OLD_LIBS+=usr/lib32/libhdb.so.10 +OLD_FILES+=usr/lib32/libhdb_p.a +OLD_FILES+=usr/lib32/libheimntlm.a +OLD_FILES+=usr/lib32/libheimntlm.so +OLD_LIBS+=usr/lib32/libheimntlm.so.10 +OLD_FILES+=usr/lib32/libheimntlm_p.a +OLD_FILES+=usr/lib32/libhx509.a +OLD_FILES+=usr/lib32/libhx509.so +OLD_LIBS+=usr/lib32/libhx509.so.10 +OLD_FILES+=usr/lib32/libhx509_p.a +OLD_FILES+=usr/lib32/libkadm5clnt.a +OLD_FILES+=usr/lib32/libkadm5clnt.so +OLD_LIBS+=usr/lib32/libkadm5clnt.so.10 +OLD_FILES+=usr/lib32/libkadm5clnt_p.a +OLD_FILES+=usr/lib32/libkadm5srv.a +OLD_FILES+=usr/lib32/libkadm5srv.so +OLD_LIBS+=usr/lib32/libkadm5srv.so.10 +OLD_FILES+=usr/lib32/libkadm5srv_p.a +OLD_FILES+=usr/lib32/libkafs5.a +OLD_FILES+=usr/lib32/libkafs5.so +OLD_LIBS+=usr/lib32/libkafs5.so.10 +OLD_FILES+=usr/lib32/libkafs5_p.a +OLD_FILES+=usr/lib32/libkrb5.a +OLD_FILES+=usr/lib32/libkrb5.so +OLD_LIBS+=usr/lib32/libkrb5.so.10 +OLD_FILES+=usr/lib32/libkrb5_p.a +OLD_FILES+=usr/lib32/libroken.a +OLD_FILES+=usr/lib32/libroken.so +OLD_LIBS+=usr/lib32/libroken.so.10 +OLD_FILES+=usr/lib32/libroken_p.a +OLD_FILES+=usr/lib32/pam_krb5.so +OLD_LIBS+=usr/lib32/pam_krb5.so.5 +OLD_FILES+=usr/lib32/pam_ksu.so +OLD_LIBS+=usr/lib32/pam_ksu.so.5 +.endif OLD_FILES+=usr/libexec/hprop OLD_FILES+=usr/libexec/hpropd +OLD_FILES+=usr/libexec/ipropd-master +OLD_FILES+=usr/libexec/ipropd-slave OLD_FILES+=usr/libexec/kadmind +OLD_FILES+=usr/libexec/kcm OLD_FILES+=usr/libexec/kdc OLD_FILES+=usr/libexec/kpasswdd OLD_FILES+=usr/sbin/kstash @@ -631,76 +1224,40 @@ OLD_FILES+=usr/share/man/man1/kinit.1.gz OLD_FILES+=usr/share/man/man1/klist.1.gz OLD_FILES+=usr/share/man/man1/kpasswd.1.gz OLD_FILES+=usr/share/man/man1/krb5-config.1.gz -OLD_FILES+=usr/share/man/man3/kafs5.3.gz OLD_FILES+=usr/share/man/man3/k_afs_cell_of_file.3.gz OLD_FILES+=usr/share/man/man3/k_hasafs.3.gz OLD_FILES+=usr/share/man/man3/k_pioctl.3.gz OLD_FILES+=usr/share/man/man3/k_setpag.3.gz OLD_FILES+=usr/share/man/man3/k_unlog.3.gz OLD_FILES+=usr/share/man/man3/kafs.3.gz +OLD_FILES+=usr/share/man/man3/kafs5.3.gz OLD_FILES+=usr/share/man/man3/kafs_set_verbose.3.gz OLD_FILES+=usr/share/man/man3/kafs_settoken.3.gz OLD_FILES+=usr/share/man/man3/kafs_settoken5.3.gz OLD_FILES+=usr/share/man/man3/kafs_settoken_rxkad.3.gz -OLD_FILES+=usr/share/man/man3/krb5_afslog.3.gz -OLD_FILES+=usr/share/man/man3/krb5_afslog_uid.3.gz -OLD_FILES+=usr/share/man/man3/krb_afslog.3.gz -OLD_FILES+=usr/share/man/man3/krb_afslog_uid.3.gz OLD_FILES+=usr/share/man/man3/krb5.3.gz +OLD_FILES+=usr/share/man/man3/krb524_convert_creds_kdc.3.gz OLD_FILES+=usr/share/man/man3/krb5_425_conv_principal.3.gz -OLD_FILES+=usr/share/man/man3/krb5_address.3.gz -OLD_FILES+=usr/share/man/man3/krb5_aname_to_localname.3.gz -OLD_FILES+=usr/share/man/man3/krb5_appdefault.3.gz -OLD_FILES+=usr/share/man/man3/krb5_auth_context.3.gz -OLD_FILES+=usr/share/man/man3/krb5_build_principal.3.gz -OLD_FILES+=usr/share/man/man3/krb5_ccache.3.gz -OLD_FILES+=usr/share/man/man3/krb5_config.3.gz -OLD_FILES+=usr/share/man/man3/krb5_context.3.gz -OLD_FILES+=usr/share/man/man3/krb5_create_checksum.3.gz -OLD_FILES+=usr/share/man/man3/krb5_crypto_init.3.gz -OLD_FILES+=usr/share/man/man3/krb5_data.3.gz -OLD_FILES+=usr/share/man/man3/krb5_encrypt.3.gz -OLD_FILES+=usr/share/man/man3/krb5_free_addresses.3.gz -OLD_FILES+=usr/share/man/man3/krb5_free_principal.3.gz -OLD_FILES+=usr/share/man/man3/krb5_get_all_client_addrs.3.gz -OLD_FILES+=usr/share/man/man3/krb5_get_krbhst.3.gz -OLD_FILES+=usr/share/man/man3/krb5_init_context.3.gz -OLD_FILES+=usr/share/man/man3/krb5_keytab.3.gz -OLD_FILES+=usr/share/man/man3/krb5_krbhst_init.3.gz -OLD_FILES+=usr/share/man/man3/krb5_kuserok.3.gz -OLD_FILES+=usr/share/man/man3/krb5_openlog.3.gz -OLD_FILES+=usr/share/man/man3/krb5_parse_name.3.gz -OLD_FILES+=usr/share/man/man3/krb5_principal_get_realm.3.gz -OLD_FILES+=usr/share/man/man3/krb5_set_default_realm.3.gz -OLD_FILES+=usr/share/man/man3/krb5_sname_to_principal.3.gz -OLD_FILES+=usr/share/man/man3/krb5_timeofday.3.gz -OLD_FILES+=usr/share/man/man3/krb5_unparse_name.3.gz -OLD_FILES+=usr/share/man/man3/krb5_verify_user.3.gz -OLD_FILES+=usr/share/man/man3/krb5_warn.3.gz OLD_FILES+=usr/share/man/man3/krb5_425_conv_principal_ext.3.gz OLD_FILES+=usr/share/man/man3/krb5_524_conv_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_acl_match_file.3.gz +OLD_FILES+=usr/share/man/man3/krb5_addlog_dest.3.gz +OLD_FILES+=usr/share/man/man3/krb5_addlog_func.3.gz OLD_FILES+=usr/share/man/man3/krb5_addr2sockaddr.3.gz +OLD_FILES+=usr/share/man/man3/krb5_address.3.gz OLD_FILES+=usr/share/man/man3/krb5_address_compare.3.gz OLD_FILES+=usr/share/man/man3/krb5_address_order.3.gz OLD_FILES+=usr/share/man/man3/krb5_address_search.3.gz OLD_FILES+=usr/share/man/man3/krb5_addresses.3.gz +OLD_FILES+=usr/share/man/man3/krb5_afslog.3.gz +OLD_FILES+=usr/share/man/man3/krb5_afslog_uid.3.gz +OLD_FILES+=usr/share/man/man3/krb5_aname_to_localname.3.gz OLD_FILES+=usr/share/man/man3/krb5_anyaddr.3.gz -OLD_FILES+=usr/share/man/man3/krb5_append_addresses.3.gz -OLD_FILES+=usr/share/man/man3/krb5_copy_address.3.gz -OLD_FILES+=usr/share/man/man3/krb5_copy_addresses.3.gz -OLD_FILES+=usr/share/man/man3/krb5_free_address.3.gz -OLD_FILES+=usr/share/man/man3/krb5_h_addr2addr.3.gz -OLD_FILES+=usr/share/man/man3/krb5_h_addr2sockaddr.3.gz -OLD_FILES+=usr/share/man/man3/krb5_make_addrport.3.gz -OLD_FILES+=usr/share/man/man3/krb5_max_sockaddr_size.3.gz -OLD_FILES+=usr/share/man/man3/krb5_parse_address.3.gz -OLD_FILES+=usr/share/man/man3/krb5_print_address.3.gz -OLD_FILES+=usr/share/man/man3/krb5_sockaddr2address.3.gz -OLD_FILES+=usr/share/man/man3/krb5_sockaddr2port.3.gz -OLD_FILES+=usr/share/man/man3/krb5_sockaddr_uninteresting.3.gz +OLD_FILES+=usr/share/man/man3/krb5_appdefault.3.gz OLD_FILES+=usr/share/man/man3/krb5_appdefault_boolean.3.gz OLD_FILES+=usr/share/man/man3/krb5_appdefault_string.3.gz OLD_FILES+=usr/share/man/man3/krb5_appdefault_time.3.gz +OLD_FILES+=usr/share/man/man3/krb5_append_addresses.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_free.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_genaddrs.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_getaddrs.3.gz @@ -711,7 +1268,6 @@ OLD_FILES+=usr/share/man/man3/krb5_auth_con_getrcache.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_getremotesubkey.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_getuserkey.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_init.3.gz -OLD_FILES+=usr/share/man/man3/krb5_log.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_initivector.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_setaddrs.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_setaddrs_from_fd.3.gz @@ -722,6 +1278,7 @@ OLD_FILES+=usr/share/man/man3/krb5_auth_con_setlocalsubkey.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_setrcache.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_setremotesubkey.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_con_setuserkey.3.gz +OLD_FILES+=usr/share/man/man3/krb5_auth_context.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_getauthenticator.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_getcksumtype.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_getkeytype.3.gz @@ -731,10 +1288,11 @@ OLD_FILES+=usr/share/man/man3/krb5_auth_setcksumtype.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_setkeytype.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_setlocalseqnumber.3.gz OLD_FILES+=usr/share/man/man3/krb5_auth_setremoteseqnumber.3.gz +OLD_FILES+=usr/share/man/man3/krb5_build_principal.3.gz OLD_FILES+=usr/share/man/man3/krb5_build_principal_ext.3.gz OLD_FILES+=usr/share/man/man3/krb5_build_principal_va.3.gz OLD_FILES+=usr/share/man/man3/krb5_build_principal_va_ext.3.gz -OLD_FILES+=usr/share/man/man3/krb5_make_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_c_make_checksum.3.gz OLD_FILES+=usr/share/man/man3/krb5_cc_close.3.gz OLD_FILES+=usr/share/man/man3/krb5_cc_copy_cache.3.gz OLD_FILES+=usr/share/man/man3/krb5_cc_cursor.3.gz @@ -758,36 +1316,84 @@ OLD_FILES+=usr/share/man/man3/krb5_cc_retrieve_cred.3.gz OLD_FILES+=usr/share/man/man3/krb5_cc_set_default_name.3.gz OLD_FILES+=usr/share/man/man3/krb5_cc_set_flags.3.gz OLD_FILES+=usr/share/man/man3/krb5_cc_store_cred.3.gz -OLD_FILES+=usr/share/man/man3/krb5_fcc_ops.3.gz -OLD_FILES+=usr/share/man/man3/krb5_mcc_ops.3.gz +OLD_FILES+=usr/share/man/man3/krb5_ccache.3.gz +OLD_FILES+=usr/share/man/man3/krb5_check_transited.3.gz +OLD_FILES+=usr/share/man/man3/krb5_checksum_is_collision_proof.3.gz +OLD_FILES+=usr/share/man/man3/krb5_checksum_is_keyed.3.gz +OLD_FILES+=usr/share/man/man3/krb5_checksumsize.3.gz +OLD_FILES+=usr/share/man/man3/krb5_closelog.3.gz +OLD_FILES+=usr/share/man/man3/krb5_compare_creds.3.gz +OLD_FILES+=usr/share/man/man3/krb5_config.3.gz OLD_FILES+=usr/share/man/man3/krb5_config_get_bool_default.3.gz OLD_FILES+=usr/share/man/man3/krb5_config_get_int_default.3.gz OLD_FILES+=usr/share/man/man3/krb5_config_get_string_default.3.gz OLD_FILES+=usr/share/man/man3/krb5_config_get_time_default.3.gz -OLD_FILES+=usr/share/man/man3/krb5_checksum_is_collision_proof.3.gz -OLD_FILES+=usr/share/man/man3/krb5_checksum_is_keyed.3.gz -OLD_FILES+=usr/share/man/man3/krb5_vlog.3.gz -OLD_FILES+=usr/share/man/man3/krb5_checksumsize.3.gz -OLD_FILES+=usr/share/man/man3/krb5_verify_checksum.3.gz -OLD_FILES+=usr/share/man/man3/krb5_crypto_destroy.3.gz +OLD_FILES+=usr/share/man/man3/krb5_context.3.gz +OLD_FILES+=usr/share/man/man3/krb5_copy_address.3.gz +OLD_FILES+=usr/share/man/man3/krb5_copy_addresses.3.gz OLD_FILES+=usr/share/man/man3/krb5_copy_data.3.gz +OLD_FILES+=usr/share/man/man3/krb5_copy_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_create_checksum.3.gz +OLD_FILES+=usr/share/man/man3/krb5_creds.3.gz +OLD_FILES+=usr/share/man/man3/krb5_crypto_destroy.3.gz +OLD_FILES+=usr/share/man/man3/krb5_crypto_init.3.gz +OLD_FILES+=usr/share/man/man3/krb5_data.3.gz OLD_FILES+=usr/share/man/man3/krb5_data_alloc.3.gz OLD_FILES+=usr/share/man/man3/krb5_data_copy.3.gz OLD_FILES+=usr/share/man/man3/krb5_data_free.3.gz OLD_FILES+=usr/share/man/man3/krb5_data_realloc.3.gz OLD_FILES+=usr/share/man/man3/krb5_data_zero.3.gz -OLD_FILES+=usr/share/man/man3/krb5_free_data.3.gz -OLD_FILES+=usr/share/man/man3/krb5_free_data_contents.3.gz OLD_FILES+=usr/share/man/man3/krb5_decrypt.3.gz OLD_FILES+=usr/share/man/man3/krb5_decrypt_EncryptedData.3.gz +OLD_FILES+=usr/share/man/man3/krb5_digest.3.gz +OLD_FILES+=usr/share/man/man3/krb5_eai_to_heim_errno.3.gz +OLD_FILES+=usr/share/man/man3/krb5_encrypt.3.gz OLD_FILES+=usr/share/man/man3/krb5_encrypt_EncryptedData.3.gz -OLD_FILES+=usr/share/man/man3/krb5_get_all_server_addrs.3.gz +OLD_FILES+=usr/share/man/man3/krb5_err.3.gz +OLD_FILES+=usr/share/man/man3/krb5_errx.3.gz +OLD_FILES+=usr/share/man/man3/krb5_expand_hostname.3.gz +OLD_FILES+=usr/share/man/man3/krb5_fcc_ops.3.gz +OLD_FILES+=usr/share/man/man3/krb5_find_padata.3.gz +OLD_FILES+=usr/share/man/man3/krb5_free_address.3.gz +OLD_FILES+=usr/share/man/man3/krb5_free_addresses.3.gz +OLD_FILES+=usr/share/man/man3/krb5_free_context.3.gz +OLD_FILES+=usr/share/man/man3/krb5_free_data.3.gz +OLD_FILES+=usr/share/man/man3/krb5_free_data_contents.3.gz +OLD_FILES+=usr/share/man/man3/krb5_free_host_realm.3.gz OLD_FILES+=usr/share/man/man3/krb5_free_krbhst.3.gz +OLD_FILES+=usr/share/man/man3/krb5_free_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_generate_random_block.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_all_client_addrs.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_all_server_addrs.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_credentials.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_creds.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_default_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_default_realm.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_default_realms.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_forwarded_creds.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_host_realm.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_in_cred.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_init_creds.3.gz OLD_FILES+=usr/share/man/man3/krb5_get_krb524hst.3.gz OLD_FILES+=usr/share/man/man3/krb5_get_krb_admin_hst.3.gz OLD_FILES+=usr/share/man/man3/krb5_get_krb_changepw_hst.3.gz -OLD_FILES+=usr/share/man/man3/krb5_free_context.3.gz +OLD_FILES+=usr/share/man/man3/krb5_get_krbhst.3.gz +OLD_FILES+=usr/share/man/man3/krb5_getportbyname.3.gz +OLD_FILES+=usr/share/man/man3/krb5_h_addr2addr.3.gz +OLD_FILES+=usr/share/man/man3/krb5_h_addr2sockaddr.3.gz +OLD_FILES+=usr/share/man/man3/krb5_init_context.3.gz +OLD_FILES+=usr/share/man/man3/krb5_initlog.3.gz +OLD_FILES+=usr/share/man/man3/krb5_is_thread_safe.3.gz +OLD_FILES+=usr/share/man/man3/krb5_keyblock.3.gz +OLD_FILES+=usr/share/man/man3/krb5_keytab.3.gz OLD_FILES+=usr/share/man/man3/krb5_keytab_entry.3.gz +OLD_FILES+=usr/share/man/man3/krb5_krbhst_format_string.3.gz +OLD_FILES+=usr/share/man/man3/krb5_krbhst_free.3.gz +OLD_FILES+=usr/share/man/man3/krb5_krbhst_get_addrinfo.3.gz +OLD_FILES+=usr/share/man/man3/krb5_krbhst_init.3.gz +OLD_FILES+=usr/share/man/man3/krb5_krbhst_next.3.gz +OLD_FILES+=usr/share/man/man3/krb5_krbhst_next_as_string.3.gz +OLD_FILES+=usr/share/man/man3/krb5_krbhst_reset.3.gz OLD_FILES+=usr/share/man/man3/krb5_kt_add_entry.3.gz OLD_FILES+=usr/share/man/man3/krb5_kt_close.3.gz OLD_FILES+=usr/share/man/man3/krb5_kt_compare.3.gz @@ -807,53 +1413,88 @@ OLD_FILES+=usr/share/man/man3/krb5_kt_register.3.gz OLD_FILES+=usr/share/man/man3/krb5_kt_remove_entry.3.gz OLD_FILES+=usr/share/man/man3/krb5_kt_resolve.3.gz OLD_FILES+=usr/share/man/man3/krb5_kt_start_seq_get.3.gz -OLD_FILES+=usr/share/man/man3/krb5_krbhst_format_string.3.gz -OLD_FILES+=usr/share/man/man3/krb5_krbhst_free.3.gz -OLD_FILES+=usr/share/man/man3/krb5_krbhst_get_addrinfo.3.gz -OLD_FILES+=usr/share/man/man3/krb5_krbhst_next.3.gz -OLD_FILES+=usr/share/man/man3/krb5_krbhst_reset.3.gz -OLD_FILES+=usr/share/man/man3/krb5_krbhst_next_as_string.3.gz -OLD_FILES+=usr/share/man/man3/krb5_addlog_dest.3.gz -OLD_FILES+=usr/share/man/man3/krb5_addlog_func.3.gz -OLD_FILES+=usr/share/man/man3/krb5_closelog.3.gz -OLD_FILES+=usr/share/man/man3/krb5_initlog.3.gz +OLD_FILES+=usr/share/man/man3/krb5_kuserok.3.gz +OLD_FILES+=usr/share/man/man3/krb5_log.3.gz OLD_FILES+=usr/share/man/man3/krb5_log_msg.3.gz -OLD_FILES+=usr/share/man/man3/krb5_vlog_msg.3.gz +OLD_FILES+=usr/share/man/man3/krb5_make_addrport.3.gz +OLD_FILES+=usr/share/man/man3/krb5_make_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_max_sockaddr_size.3.gz +OLD_FILES+=usr/share/man/man3/krb5_mcc_ops.3.gz +OLD_FILES+=usr/share/man/man3/krb5_mk_req.3.gz +OLD_FILES+=usr/share/man/man3/krb5_mk_safe.3.gz +OLD_FILES+=usr/share/man/man3/krb5_openlog.3.gz +OLD_FILES+=usr/share/man/man3/krb5_parse_address.3.gz +OLD_FILES+=usr/share/man/man3/krb5_parse_name.3.gz +OLD_FILES+=usr/share/man/man3/krb5_parse_name_flags.3.gz +OLD_FILES+=usr/share/man/man3/krb5_parse_nametype.3.gz +OLD_FILES+=usr/share/man/man3/krb5_princ_realm.3.gz +OLD_FILES+=usr/share/man/man3/krb5_princ_set_realm.3.gz +OLD_FILES+=usr/share/man/man3/krb5_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_principal_compare.3.gz +OLD_FILES+=usr/share/man/man3/krb5_principal_compare_any_realm.3.gz OLD_FILES+=usr/share/man/man3/krb5_principal_get_comp_string.3.gz -OLD_FILES+=usr/share/man/man3/krb5_free_host_realm.3.gz -OLD_FILES+=usr/share/man/man3/krb5_get_default_realm.3.gz -OLD_FILES+=usr/share/man/man3/krb5_get_default_realms.3.gz -OLD_FILES+=usr/share/man/man3/krb5_get_host_realm.3.gz +OLD_FILES+=usr/share/man/man3/krb5_principal_get_realm.3.gz +OLD_FILES+=usr/share/man/man3/krb5_principal_get_type.3.gz +OLD_FILES+=usr/share/man/man3/krb5_principal_match.3.gz +OLD_FILES+=usr/share/man/man3/krb5_principal_set_type.3.gz +OLD_FILES+=usr/share/man/man3/krb5_print_address.3.gz +OLD_FILES+=usr/share/man/man3/krb5_rcache.3.gz +OLD_FILES+=usr/share/man/man3/krb5_rd_error.3.gz +OLD_FILES+=usr/share/man/man3/krb5_rd_safe.3.gz +OLD_FILES+=usr/share/man/man3/krb5_realm_compare.3.gz +OLD_FILES+=usr/share/man/man3/krb5_set_default_realm.3.gz +OLD_FILES+=usr/share/man/man3/krb5_set_password.3.gz +OLD_FILES+=usr/share/man/man3/krb5_set_warn_dest.3.gz +OLD_FILES+=usr/share/man/man3/krb5_sname_to_principal.3.gz OLD_FILES+=usr/share/man/man3/krb5_sock_to_principal.3.gz +OLD_FILES+=usr/share/man/man3/krb5_sockaddr2address.3.gz +OLD_FILES+=usr/share/man/man3/krb5_sockaddr2port.3.gz +OLD_FILES+=usr/share/man/man3/krb5_sockaddr_uninteresting.3.gz +OLD_FILES+=usr/share/man/man3/krb5_storage.3.gz +OLD_FILES+=usr/share/man/man3/krb5_string_to_key.3.gz +OLD_FILES+=usr/share/man/man3/krb5_ticket.3.gz +OLD_FILES+=usr/share/man/man3/krb5_timeofday.3.gz +OLD_FILES+=usr/share/man/man3/krb5_unparse_name.3.gz +OLD_FILES+=usr/share/man/man3/krb5_unparse_name_fixed.3.gz +OLD_FILES+=usr/share/man/man3/krb5_unparse_name_fixed_flags.3.gz +OLD_FILES+=usr/share/man/man3/krb5_unparse_name_fixed_short.3.gz +OLD_FILES+=usr/share/man/man3/krb5_unparse_name_flags.3.gz +OLD_FILES+=usr/share/man/man3/krb5_unparse_name_short.3.gz OLD_FILES+=usr/share/man/man3/krb5_us_timeofday.3.gz +OLD_FILES+=usr/share/man/man3/krb5_verify_checksum.3.gz +OLD_FILES+=usr/share/man/man3/krb5_verify_init_creds.3.gz OLD_FILES+=usr/share/man/man3/krb5_verify_opt_init.3.gz OLD_FILES+=usr/share/man/man3/krb5_verify_opt_set_flags.3.gz OLD_FILES+=usr/share/man/man3/krb5_verify_opt_set_keytab.3.gz OLD_FILES+=usr/share/man/man3/krb5_verify_opt_set_secure.3.gz OLD_FILES+=usr/share/man/man3/krb5_verify_opt_set_service.3.gz +OLD_FILES+=usr/share/man/man3/krb5_verify_user.3.gz OLD_FILES+=usr/share/man/man3/krb5_verify_user_lrealm.3.gz OLD_FILES+=usr/share/man/man3/krb5_verify_user_opt.3.gz -OLD_FILES+=usr/share/man/man3/krb5_err.3.gz -OLD_FILES+=usr/share/man/man3/krb5_errx.3.gz -OLD_FILES+=usr/share/man/man3/krb5_set_warn_dest.3.gz OLD_FILES+=usr/share/man/man3/krb5_verr.3.gz OLD_FILES+=usr/share/man/man3/krb5_verrx.3.gz +OLD_FILES+=usr/share/man/man3/krb5_vlog.3.gz +OLD_FILES+=usr/share/man/man3/krb5_vlog_msg.3.gz OLD_FILES+=usr/share/man/man3/krb5_vwarn.3.gz OLD_FILES+=usr/share/man/man3/krb5_vwarnx.3.gz +OLD_FILES+=usr/share/man/man3/krb5_warn.3.gz OLD_FILES+=usr/share/man/man3/krb5_warnx.3.gz +OLD_FILES+=usr/share/man/man3/krb_afslog.3.gz +OLD_FILES+=usr/share/man/man3/krb_afslog_uid.3.gz OLD_FILES+=usr/share/man/man5/krb5.conf.5.gz -OLD_FILES+=usr/share/man/man8/pam_krb5.8.gz -OLD_FILES+=usr/share/man/man8/pam_ksu.8.gz -OLD_FILES+=usr/share/man/man8/kerberos.8.gz OLD_FILES+=usr/share/man/man8/hprop.8.gz OLD_FILES+=usr/share/man/man8/hpropd.8.gz -OLD_FILES+=usr/share/man/man8/kadmind.8.gz -OLD_FILES+=usr/share/man/man8/kdc.8.gz -OLD_FILES+=usr/share/man/man8/kpasswdd.8.gz OLD_FILES+=usr/share/man/man8/kadmin.8.gz -OLD_FILES+=usr/share/man/man8/verify_krb5_conf.8.gz +OLD_FILES+=usr/share/man/man8/kadmind.8.gz +OLD_FILES+=usr/share/man/man8/kcm.8.gz +OLD_FILES+=usr/share/man/man8/kdc.8.gz +OLD_FILES+=usr/share/man/man8/kerberos.8.gz +OLD_FILES+=usr/share/man/man8/kpasswdd.8.gz OLD_FILES+=usr/share/man/man8/kstash.8.gz OLD_FILES+=usr/share/man/man8/ktutil.8.gz +OLD_FILES+=usr/share/man/man8/pam_krb5.8.gz +OLD_FILES+=usr/share/man/man8/pam_ksu.8.gz +OLD_FILES+=usr/share/man/man8/verify_krb5_conf.8.gz .endif #.if ${MK_LIB32} == no @@ -869,6 +1510,8 @@ OLD_FILES+=usr/share/man/man8/ktutil.8.gz #.endif .if ${MK_LPR} == no +OLD_FILES+=etc/hosts.lpd +OLD_FILES+=etc/printcap OLD_FILES+=usr/bin/lp OLD_FILES+=usr/bin/lpq OLD_FILES+=usr/bin/lpr @@ -883,6 +1526,8 @@ OLD_FILES+=usr/sbin/lpd OLD_FILES+=usr/sbin/lptest OLD_FILES+=usr/sbin/pac OLD_FILES+=usr/share/doc/smm/07.lpd/paper.ascii.gz +OLD_FILES+=usr/share/examples/etc/hosts.lpd +OLD_FILES+=usr/share/examples/etc/printcap OLD_FILES+=usr/share/man/man1/lp.1.gz OLD_FILES+=usr/share/man/man1/lpq.1.gz OLD_FILES+=usr/share/man/man1/lpr.1.gz @@ -895,9 +1540,33 @@ OLD_FILES+=usr/share/man/man8/lpd.8.gz OLD_FILES+=usr/share/man/man8/pac.8.gz .endif -#.if ${MK_MAILWRAPPER} == no -# to be filled in -#.endif +.if ${MK_MAIL} == no +OLD_FILES+=usr/bin/Mail +OLD_FILES+=usr/bin/biff +OLD_FILES+=usr/bin/from +OLD_FILES+=usr/bin/mail +OLD_FILES+=usr/bin/mailx +OLD_FILES+=usr/bin/msgs +OLD_FILES+=usr/libexec/comsat +OLD_FILES+=usr/share/examples/etc/mail.rc +OLD_FILES+=usr/share/man/man1/Mail.1.gz +OLD_FILES+=usr/share/man/man1/biff.1.gz +OLD_FILES+=usr/share/man/man1/from.1.gz +OLD_FILES+=usr/share/man/man1/mail.1.gz +OLD_FILES+=usr/share/man/man1/mailx.1.gz +OLD_FILES+=usr/share/man/man1/msgs.1.gz +OLD_FILES+=usr/share/man/man8/comsat.8.gz +OLD_FILES+=usr/share/misc/mail.help +OLD_FILES+=usr/share/misc/mail.tildehelp +.endif + +.if ${MK_MAILWRAPPER} == no +OLD_FILES+=etc/mail/mailer.conf +.if ${MK_SENDMAIL} == no +OLD_FILES+=usr/sbin/mailwrapper +.endif +OLD_FILES+=usr/share/man/man8/mailwrapper.8.gz +.endif #.if ${MK_MAN} == no # This should add a dependency to a special target which removes all man pages. @@ -930,12 +1599,12 @@ OLD_FILES+=usr/include/netncp/nwerror.h #OLD_DIRS+=usr/include/netncp OLD_FILES+=usr/lib/libncp.a OLD_FILES+=usr/lib/libncp.so -OLD_LIBS+=usr/lib/libncp.so.3 +OLD_LIBS+=usr/lib/libncp.so.4 OLD_FILES+=usr/lib/libncp_p.a .if ${TARGET_ARCH} == "amd64" OLD_FILES+=usr/lib32/libncp.a OLD_FILES+=usr/lib32/libncp.so -OLD_LIBS+=usr/lib32/libncp.so.3 +OLD_LIBS+=usr/lib32/libncp.so.4 OLD_FILES+=usr/lib32/libncp_p.a .endif OLD_FILES+=usr/sbin/mount_nwfs @@ -945,6 +1614,14 @@ OLD_FILES+=usr/share/man/man1/ncplogout.1.gz OLD_FILES+=usr/share/man/man8/mount_nwfs.8.gz .endif +.if ${MK_NDIS} == no +OLD_FILES+=usr/sbin/ndiscvt +OLD_FILES+=usr/sbin/ndisgen +OLD_FILES+=usr/share/man/man8/ndiscvt.8.gz +OLD_FILES+=usr/share/man/man8/ndisgen.8.gz +OLD_FILES+=usr/share/misc/windrv_stub.c +.endif + .if ${MK_NETCAT} == no OLD_FILES+=usr/bin/nc OLD_FILES+=usr/share/man/man1/nc.1.gz @@ -958,6 +1635,93 @@ OLD_FILES+=usr/share/man/man1/nc.1.gz # to be filled in #.endif +.if ${MK_NTP} == no +OLD_FILES+=etc/ntp.conf +OLD_FILES+=etc/periodic/daily/480.status-ntpd +OLD_FILES+=usr/bin/ntpq +OLD_FILES+=usr/sbin/ntp-keygen +OLD_FILES+=usr/sbin/ntpd +OLD_FILES+=usr/sbin/ntpdate +OLD_FILES+=usr/sbin/ntpdc +OLD_FILES+=usr/sbin/ntptime +OLD_FILES+=usr/sbin/sntp +OLD_FILES+=usr/share/doc/ntp/accopt.html +OLD_FILES+=usr/share/doc/ntp/assoc.html +OLD_FILES+=usr/share/doc/ntp/audio.html +OLD_FILES+=usr/share/doc/ntp/authopt.html +OLD_FILES+=usr/share/doc/ntp/build.html +OLD_FILES+=usr/share/doc/ntp/clockopt.html +OLD_FILES+=usr/share/doc/ntp/config.html +OLD_FILES+=usr/share/doc/ntp/confopt.html +OLD_FILES+=usr/share/doc/ntp/copyright.html +OLD_FILES+=usr/share/doc/ntp/debug.html +OLD_FILES+=usr/share/doc/ntp/driver1.html +OLD_FILES+=usr/share/doc/ntp/driver10.html +OLD_FILES+=usr/share/doc/ntp/driver11.html +OLD_FILES+=usr/share/doc/ntp/driver12.html +OLD_FILES+=usr/share/doc/ntp/driver16.html +OLD_FILES+=usr/share/doc/ntp/driver18.html +OLD_FILES+=usr/share/doc/ntp/driver19.html +OLD_FILES+=usr/share/doc/ntp/driver2.html +OLD_FILES+=usr/share/doc/ntp/driver20.html +OLD_FILES+=usr/share/doc/ntp/driver22.html +OLD_FILES+=usr/share/doc/ntp/driver26.html +OLD_FILES+=usr/share/doc/ntp/driver27.html +OLD_FILES+=usr/share/doc/ntp/driver28.html +OLD_FILES+=usr/share/doc/ntp/driver29.html +OLD_FILES+=usr/share/doc/ntp/driver3.html +OLD_FILES+=usr/share/doc/ntp/driver30.html +OLD_FILES+=usr/share/doc/ntp/driver32.html +OLD_FILES+=usr/share/doc/ntp/driver33.html +OLD_FILES+=usr/share/doc/ntp/driver34.html +OLD_FILES+=usr/share/doc/ntp/driver35.html +OLD_FILES+=usr/share/doc/ntp/driver36.html +OLD_FILES+=usr/share/doc/ntp/driver37.html +OLD_FILES+=usr/share/doc/ntp/driver4.html +OLD_FILES+=usr/share/doc/ntp/driver5.html +OLD_FILES+=usr/share/doc/ntp/driver6.html +OLD_FILES+=usr/share/doc/ntp/driver7.html +OLD_FILES+=usr/share/doc/ntp/driver8.html +OLD_FILES+=usr/share/doc/ntp/driver9.html +OLD_FILES+=usr/share/doc/ntp/extern.html +OLD_FILES+=usr/share/doc/ntp/hints.html +OLD_FILES+=usr/share/doc/ntp/howto.html +OLD_FILES+=usr/share/doc/ntp/index.html +OLD_FILES+=usr/share/doc/ntp/kern.html +OLD_FILES+=usr/share/doc/ntp/ldisc.html +OLD_FILES+=usr/share/doc/ntp/measure.html +OLD_FILES+=usr/share/doc/ntp/miscopt.html +OLD_FILES+=usr/share/doc/ntp/monopt.html +OLD_FILES+=usr/share/doc/ntp/mx4200data.html +OLD_FILES+=usr/share/doc/ntp/notes.html +OLD_FILES+=usr/share/doc/ntp/ntpd.html +OLD_FILES+=usr/share/doc/ntp/ntpdate.html +OLD_FILES+=usr/share/doc/ntp/ntpdc.html +OLD_FILES+=usr/share/doc/ntp/ntpq.html +OLD_FILES+=usr/share/doc/ntp/ntptime.html +OLD_FILES+=usr/share/doc/ntp/ntptrace.html +OLD_FILES+=usr/share/doc/ntp/parsedata.html +OLD_FILES+=usr/share/doc/ntp/parsenew.html +OLD_FILES+=usr/share/doc/ntp/patches.html +OLD_FILES+=usr/share/doc/ntp/porting.html +OLD_FILES+=usr/share/doc/ntp/pps.html +OLD_FILES+=usr/share/doc/ntp/prefer.html +OLD_FILES+=usr/share/doc/ntp/quick.html +OLD_FILES+=usr/share/doc/ntp/rdebug.html +OLD_FILES+=usr/share/doc/ntp/refclock.html +OLD_FILES+=usr/share/doc/ntp/release.html +OLD_FILES+=usr/share/doc/ntp/tickadj.html +OLD_FILES+=usr/share/examples/etc/ntp.conf +OLD_FILES+=usr/share/man/man5/ntp.conf.5.gz +OLD_FILES+=usr/share/man/man5/ntp.keys.5.gz +OLD_FILES+=usr/share/man/man8/ntp-keygen.8.gz +OLD_FILES+=usr/share/man/man8/ntpd.8.gz +OLD_FILES+=usr/share/man/man8/ntpdate.8.gz +OLD_FILES+=usr/share/man/man8/ntpdc.8.gz +OLD_FILES+=usr/share/man/man8/ntpq.8.gz +OLD_FILES+=usr/share/man/man8/ntptime.8.gz +.endif + #.if ${MK_OBJC} == no # to be filled in #.endif @@ -970,9 +1734,67 @@ OLD_FILES+=usr/share/man/man1/nc.1.gz # to be filled in #.endif -#.if ${MK_PCVT} == no -# to be filled in -#.endif +.if ${MK_PF} == no +OLD_FILES+=etc/periodic/security/520.pfdenied +OLD_FILES+=etc/pf.os +OLD_FILES+=sbin/pfctl +OLD_FILES+=sbin/pflogd +OLD_FILES+=usr/libexec/tftp-proxy +OLD_FILES+=usr/sbin/ftp-proxy +OLD_FILES+=usr/share/examples/etc/pf.os +OLD_FILES+=usr/share/examples/pf/ackpri +OLD_FILES+=usr/share/examples/pf/faq-example1 +OLD_FILES+=usr/share/examples/pf/faq-example2 +OLD_FILES+=usr/share/examples/pf/faq-example3 +OLD_FILES+=usr/share/examples/pf/pf.conf +OLD_FILES+=usr/share/examples/pf/queue1 +OLD_FILES+=usr/share/examples/pf/queue2 +OLD_FILES+=usr/share/examples/pf/queue3 +OLD_FILES+=usr/share/examples/pf/queue4 +OLD_FILES+=usr/share/examples/pf/spamd +OLD_FILES+=usr/share/man/man4/pf.4.gz +OLD_FILES+=usr/share/man/man4/pflog.4.gz +OLD_FILES+=usr/share/man/man4/pfsync.4.gz +OLD_FILES+=usr/share/man/man5/pf.conf.5.gz +OLD_FILES+=usr/share/man/man5/pf.os.5.gz +OLD_FILES+=usr/share/man/man8/ftp-proxy.8.gz +OLD_FILES+=usr/share/man/man8/pfctl.8.gz +OLD_FILES+=usr/share/man/man8/pflogd.8.gz +OLD_FILES+=usr/share/man/man8/tftp-proxy.8.gz +.endif + +.if ${MK_PKGTOOLS} == no +OLD_FILES+=etc/periodic/weekly/400.status-pkg +OLD_FILES+=usr/sbin/pkg_add +OLD_FILES+=usr/sbin/pkg_create +OLD_FILES+=usr/sbin/pkg_delete +OLD_FILES+=usr/sbin/pkg_info +OLD_FILES+=usr/sbin/pkg_updating +OLD_FILES+=usr/sbin/pkg_version +OLD_FILES+=usr/share/man/man1/pkg_add.1.gz +OLD_FILES+=usr/share/man/man1/pkg_create.1.gz +OLD_FILES+=usr/share/man/man1/pkg_delete.1.gz +OLD_FILES+=usr/share/man/man1/pkg_info.1.gz +OLD_FILES+=usr/share/man/man1/pkg_updating.1.gz +OLD_FILES+=usr/share/man/man1/pkg_version.1.gz +.endif + +.if ${MK_PORTSNAP} == no +OLD_FILES+=etc/portsnap.conf +OLD_FILES+=usr/libexec/make_index +OLD_FILES+=usr/libexec/phttpget +OLD_FILES+=usr/sbin/portsnap +OLD_FILES+=usr/share/examples/etc/portsnap.conf +OLD_FILES+=usr/share/man/man8/portsnap.8.gz +.endif + +.if ${MK_PPP} == no +OLD_FILES+=etc/ppp/ppp.conf +OLD_FILES+=usr/sbin/ppp +OLD_FILES+=usr/sbin/pppctl +OLD_FILES+=usr/share/man/man8/ppp.8.gz +OLD_FILES+=usr/share/man/man8/pppctl.8.gz +.endif .if ${MK_PROFILE} == no OLD_FILES+=usr/lib/libalias_cuseeme_p.a @@ -1089,29 +1911,276 @@ OLD_FILES+=usr/lib/libz_p.a .if ${MK_RCMDS} == no OLD_FILES+=bin/rcp +OLD_FILES+=etc/periodic/daily/140.clean-rwho +OLD_FILES+=etc/periodic/daily/430.status-rwho OLD_FILES+=rescue/rcp OLD_FILES+=usr/bin/rlogin OLD_FILES+=usr/bin/rsh +OLD_FILES+=usr/bin/ruptime +OLD_FILES+=usr/bin/rwho OLD_FILES+=usr/libexec/rlogind OLD_FILES+=usr/libexec/rshd +OLD_FILES+=usr/sbin/rwhod OLD_FILES+=usr/share/man/man1/rcp.1.gz OLD_FILES+=usr/share/man/man1/rlogin.1.gz OLD_FILES+=usr/share/man/man1/rsh.1.gz +OLD_FILES+=usr/share/man/man1/ruptime.1.gz +OLD_FILES+=usr/share/man/man1/rwho.1.gz OLD_FILES+=usr/share/man/man8/rlogind.8.gz OLD_FILES+=usr/share/man/man8/rshd.8.gz +OLD_FILES+=usr/share/man/man8/rwhod.8.gz .endif -#.if ${MK_RCS} == no -# to be filled in -#.endif +.if ${MK_RCS} == no +OLD_FILES+=usr/bin/ci +OLD_FILES+=usr/bin/co +OLD_FILES+=usr/bin/ident +OLD_FILES+=usr/bin/merge +OLD_FILES+=usr/bin/rcs +OLD_FILES+=usr/bin/rcsclean +OLD_FILES+=usr/bin/rcsdiff +OLD_FILES+=usr/bin/rcsfreeze +OLD_FILES+=usr/bin/rcsmerge +OLD_FILES+=usr/bin/rlog +OLD_FILES+=usr/share/man/man1/ci.1.gz +OLD_FILES+=usr/share/man/man1/co.1.gz +OLD_FILES+=usr/share/man/man1/ident.1.gz +OLD_FILES+=usr/share/man/man1/merge.1.gz +OLD_FILES+=usr/share/man/man1/rcs.1.gz +OLD_FILES+=usr/share/man/man1/rcsclean.1.gz +OLD_FILES+=usr/share/man/man1/rcsdiff.1.gz +OLD_FILES+=usr/share/man/man1/rcsfreeze.1.gz +OLD_FILES+=usr/share/man/man1/rcsintro.1.gz +OLD_FILES+=usr/share/man/man1/rcsmerge.1.gz +OLD_FILES+=usr/share/man/man1/rlog.1.gz +OLD_FILES+=usr/share/man/man5/rcsfile.5.gz +.endif #.if ${MK_RESCUE} == no # to be filled in or replaced with a special target #.endif -#.if ${MK_SENDMAIL} == no -# to be filled in -#.endif +.if ${MK_ROUTED} == no +OLD_FILES+=sbin/routed +OLD_FILES+=sbin/rtquery +OLD_FILES+=usr/share/man/man8/routed.8.gz +OLD_FILES+=usr/share/man/man8/rtquery.8.gz +.endif + +.if ${MK_SENDMAIL} == no +OLD_FILES+=bin/rmail +OLD_FILES+=usr/bin/vacation +OLD_FILES+=usr/include/libmilter/mfapi.h +OLD_FILES+=usr/include/libmilter/mfdef.h +OLD_FILES+=usr/lib/libmilter.a +OLD_LIBS+=usr/lib/libmilter.so.5 +OLD_FILES+=usr/lib/libmilter_p.a +.if ${TARGET_ARCH} == "amd64" +OLD_FILES+=usr/lib32/libmilter.a +OLD_LIBS+=usr/lib32/libmilter.so.5 +OLD_FILES+=usr/lib32/libmilter_p.a +.endif +OLD_FILES+=usr/libexec/mail.local +OLD_FILES+=usr/libexec/sendmail/sendmail +OLD_FILES+=usr/libexec/smrsh +OLD_FILES+=usr/sbin/editmap +OLD_FILES+=usr/sbin/mailstats +OLD_FILES+=usr/sbin/makemap +OLD_FILES+=usr/sbin/praliases +OLD_FILES+=usr/share/doc/smm/08.sendmailop/paper.ascii.gz +OLD_FILES+=usr/share/man/man1/mailq.1.gz +OLD_FILES+=usr/share/man/man1/newaliases.1.gz +OLD_FILES+=usr/share/man/man1/vacation.1.gz +OLD_FILES+=usr/share/man/man5/aliases.5.gz +OLD_FILES+=usr/share/man/man8/editmap.8.gz +OLD_FILES+=usr/share/man/man8/hoststat.8.gz +OLD_FILES+=usr/share/man/man8/mail.local.8.gz +OLD_FILES+=usr/share/man/man8/mailstats.8.gz +OLD_FILES+=usr/share/man/man8/makemap.8.gz +OLD_FILES+=usr/share/man/man8/praliases.8.gz +OLD_FILES+=usr/share/man/man8/purgestat.8.gz +OLD_FILES+=usr/share/man/man8/rmail.8.gz +OLD_FILES+=usr/share/man/man8/sendmail.8.gz +OLD_FILES+=usr/share/man/man8/smrsh.8.gz +OLD_FILES+=usr/share/sendmail/cf/README +OLD_FILES+=usr/share/sendmail/cf/cf/Makefile +OLD_FILES+=usr/share/sendmail/cf/cf/README +OLD_FILES+=usr/share/sendmail/cf/cf/chez.cs.mc +OLD_FILES+=usr/share/sendmail/cf/cf/clientproto.mc +OLD_FILES+=usr/share/sendmail/cf/cf/cs-hpux10.mc +OLD_FILES+=usr/share/sendmail/cf/cf/cs-hpux9.mc +OLD_FILES+=usr/share/sendmail/cf/cf/cs-osf1.mc +OLD_FILES+=usr/share/sendmail/cf/cf/cs-solaris2.mc +OLD_FILES+=usr/share/sendmail/cf/cf/cs-sunos4.1.mc +OLD_FILES+=usr/share/sendmail/cf/cf/cs-ultrix4.mc +OLD_FILES+=usr/share/sendmail/cf/cf/cyrusproto.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-bsd4.4.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-hpux10.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-hpux9.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-linux.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-mpeix.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-nextstep3.3.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-osf1.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-solaris.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-sunos4.1.mc +OLD_FILES+=usr/share/sendmail/cf/cf/generic-ultrix4.mc +OLD_FILES+=usr/share/sendmail/cf/cf/huginn.cs.mc +OLD_FILES+=usr/share/sendmail/cf/cf/knecht.mc +OLD_FILES+=usr/share/sendmail/cf/cf/mail.cs.mc +OLD_FILES+=usr/share/sendmail/cf/cf/mail.eecs.mc +OLD_FILES+=usr/share/sendmail/cf/cf/mailspool.cs.mc +OLD_FILES+=usr/share/sendmail/cf/cf/python.cs.mc +OLD_FILES+=usr/share/sendmail/cf/cf/s2k-osf1.mc +OLD_FILES+=usr/share/sendmail/cf/cf/s2k-ultrix4.mc +OLD_FILES+=usr/share/sendmail/cf/cf/submit.cf +OLD_FILES+=usr/share/sendmail/cf/cf/submit.mc +OLD_FILES+=usr/share/sendmail/cf/cf/tcpproto.mc +OLD_FILES+=usr/share/sendmail/cf/cf/ucbarpa.mc +OLD_FILES+=usr/share/sendmail/cf/cf/ucbvax.mc +OLD_FILES+=usr/share/sendmail/cf/cf/uucpproto.mc +OLD_FILES+=usr/share/sendmail/cf/cf/vangogh.cs.mc +OLD_FILES+=usr/share/sendmail/cf/domain/Berkeley.EDU.m4 +OLD_FILES+=usr/share/sendmail/cf/domain/CS.Berkeley.EDU.m4 +OLD_FILES+=usr/share/sendmail/cf/domain/EECS.Berkeley.EDU.m4 +OLD_FILES+=usr/share/sendmail/cf/domain/S2K.Berkeley.EDU.m4 +OLD_FILES+=usr/share/sendmail/cf/domain/berkeley-only.m4 +OLD_FILES+=usr/share/sendmail/cf/domain/generic.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/accept_unqualified_senders.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/accept_unresolvable_domains.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/access_db.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/allmasquerade.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/always_add_domain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/authinfo.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/badmx.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/bestmx_is_local.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/bitdomain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/blacklist_recipients.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/block_bad_helo.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/compat_check.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/conncontrol.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/delay_checks.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/dnsbl.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/domaintable.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/enhdnsbl.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/generics_entire_domain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/genericstable.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/greet_pause.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/ldap_routing.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/limited_masquerade.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/local_lmtp.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/local_no_masquerade.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/local_procmail.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/lookupdotdomain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/loose_relay_check.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/mailertable.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/masquerade_entire_domain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/masquerade_envelope.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/msp.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/mtamark.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/no_default_msa.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/nocanonify.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/notsticky.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/nouucp.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/nullclient.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/preserve_local_plus_detail.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/preserve_luser_host.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/promiscuous_relay.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/queuegroup.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/ratecontrol.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/redirect.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/relay_based_on_MX.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/relay_entire_domain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/relay_hosts_only.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/relay_local_from.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/relay_mail_from.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/require_rdns.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/smrsh.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/stickyhost.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/use_client_ptr.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/use_ct_file.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/use_cw_file.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/uucpdomain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/virtuser_entire_domain.m4 +OLD_FILES+=usr/share/sendmail/cf/feature/virtusertable.m4 +OLD_FILES+=usr/share/sendmail/cf/hack/cssubdomain.m4 +OLD_FILES+=usr/share/sendmail/cf/m4/cf.m4 +OLD_FILES+=usr/share/sendmail/cf/m4/cfhead.m4 +OLD_FILES+=usr/share/sendmail/cf/m4/proto.m4 +OLD_FILES+=usr/share/sendmail/cf/m4/version.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/cyrus.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/cyrusv2.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/fax.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/local.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/mail11.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/phquery.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/pop.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/procmail.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/qpage.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/smtp.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/usenet.m4 +OLD_FILES+=usr/share/sendmail/cf/mailer/uucp.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/a-ux.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/aix3.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/aix4.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/aix5.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/altos.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/amdahl-uts.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/bsd4.3.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/bsd4.4.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/bsdi.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/bsdi1.0.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/bsdi2.0.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/darwin.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/dgux.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/domainos.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/dragonfly.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/dynix3.2.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/freebsd4.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/freebsd5.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/freebsd6.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/gnu.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/hpux10.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/hpux11.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/hpux9.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/irix4.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/irix5.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/irix6.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/isc4.1.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/linux.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/maxion.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/mklinux.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/mpeix.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/nextstep.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/openbsd.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/osf1.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/powerux.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/ptx2.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/qnx.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/riscos4.5.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/sco-uw-2.1.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/sco3.2.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/sinix.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/solaris2.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/solaris2.ml.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/solaris2.pre5.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/solaris8.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/sunos3.5.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/sunos4.1.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/svr4.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/ultrix4.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/unicos.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/unicosmk.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/unicosmp.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/unixware7.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/unknown.m4 +OLD_FILES+=usr/share/sendmail/cf/ostype/uxpds.m4 +OLD_FILES+=usr/share/sendmail/cf/sendmail.schema +OLD_FILES+=usr/share/sendmail/cf/sh/makeinfo.sh +OLD_FILES+=usr/share/sendmail/cf/siteconfig/uucp.cogsci.m4 +OLD_FILES+=usr/share/sendmail/cf/siteconfig/uucp.old.arpa.m4 +OLD_FILES+=usr/share/sendmail/cf/siteconfig/uucp.ucbarpa.m4 +OLD_FILES+=usr/share/sendmail/cf/siteconfig/uucp.ucbvax.m4 +.endif #.if ${MK_SHAREDOCS} == no # to be filled in @@ -1159,6 +2228,13 @@ OLD_FILES+=usr/share/nls/ru_RU.KOI8-R/tcsh.cat OLD_FILES+=usr/share/nls/uk_UA.KOI8-U/tcsh.cat .endif +.if ${MK_TELNET} == no +OLD_FILES+=usr/bin/telnet +OLD_FILES+=usr/libexec/telnetd +OLD_FILES+=usr/share/man/man1/telnet.1.gz +OLD_FILES+=usr/share/man/man8/telnetd.8.gz +.endif + #.if ${MK_TOOLCHAIN} == no # to be filled in #.endif @@ -1166,3 +2242,32 @@ OLD_FILES+=usr/share/nls/uk_UA.KOI8-U/tcsh.cat #.if ${MK_USB} == no # to be filled in #.endif + +.if ${MK_WIRELESS} == no +OLD_FILES+=etc/regdomain.xml +OLD_FILES+=usr/sbin/ancontrol +OLD_FILES+=usr/sbin/hostapd +OLD_FILES+=usr/sbin/hostapd_cli +OLD_FILES+=usr/sbin/ndis_events +OLD_FILES+=usr/sbin/wlandebug +OLD_FILES+=usr/sbin/wlconfig +OLD_FILES+=usr/sbin/wpa_cli +OLD_FILES+=usr/sbin/wpa_passphrase +OLD_FILES+=usr/sbin/wpa_supplicant +OLD_FILES+=usr/share/examples/etc/regdomain.xml +OLD_FILES+=usr/share/examples/etc/wpa_supplicant.conf +OLD_FILES+=usr/share/examples/hostapd/hostapd.conf +OLD_FILES+=usr/share/examples/hostapd/hostapd.eap_user +OLD_FILES+=usr/share/examples/hostapd/hostapd.wpa_psk +OLD_FILES+=usr/share/man/man5/hostapd.conf.5.gz +OLD_FILES+=usr/share/man/man5/wpa_supplicant.conf.5.gz +OLD_FILES+=usr/share/man/man8/ancontrol.8.gz +OLD_FILES+=usr/share/man/man8/hostapd.8.gz +OLD_FILES+=usr/share/man/man8/hostapd_cli.8.gz +OLD_FILES+=usr/share/man/man8/i386/wlconfig.8.gz +OLD_FILES+=usr/share/man/man8/ndis_events.8.gz +OLD_FILES+=usr/share/man/man8/wlandebug.8.gz +OLD_FILES+=usr/share/man/man8/wpa_cli.8.gz +OLD_FILES+=usr/share/man/man8/wpa_passphrase.8.gz +OLD_FILES+=usr/share/man/man8/wpa_supplicant.8.gz +.endif diff --git a/tools/make_libdeps.sh b/tools/make_libdeps.sh index f03f01edcca4..b0b3f186b1ac 100644 --- a/tools/make_libdeps.sh +++ b/tools/make_libdeps.sh @@ -47,9 +47,12 @@ sed -E -e's; ;! ;g' -e's;$;!;' -e's;-lbsdxml!;lib/libexpat;g' + -e's;-lpthread!;lib/libthr;g' -e's;-lm!;lib/msun;g' - -e's;-l(supc\+\+)!;gnu/lib/lib\1;g' - -e's;-l(asn1|krb5|roken)!;kerberos5/lib/lib\1;g' + -e's;-l(ncurses|termcap)!;lib/ncurses/ncurses;g' + -e's;-l(gcc)!;gnu/lib/lib\1;g' + -e's;-lssp_nonshared!;gnu/lib/libssp/libssp_nonshared;g' + -e's;-l(asn1|heimntlm|hx509|krb5|roken)!;kerberos5/lib/lib\1;g' -e's;-l(crypto|ssh|ssl)!;secure/lib/lib\1;g' -e's;-l([^!]+)!;lib/lib\1;g' " diff --git a/tools/regression/acct/Makefile b/tools/regression/acct/Makefile index 6834fcbe283b..09f8b323ecdb 100644 --- a/tools/regression/acct/Makefile +++ b/tools/regression/acct/Makefile @@ -6,12 +6,16 @@ PROG= pack NO_MAN= +CFLAGS= -include /usr/include/sys/limits.h \ + -include /usr/include/sys/syslog.h + all: regress pack: pack.c convert.c convert.c: ../../../sys/kern/kern_acct.c - sed -n '/FLOAT_CONVERSION_START/,/FLOAT_CONVERSION_END/p' $? >$@ + sed -n -e 's/log(/syslog(/g' \ + -e '/FLOAT_CONVERSION_START/,/FLOAT_CONVERSION_END/p' $? >$@ regress: pack regress.t ./regress.t diff --git a/tools/regression/acct/regress.t b/tools/regression/acct/regress.t old mode 100644 new mode 100755 index c078caa924ec..8bb8969af7ec --- a/tools/regression/acct/regress.t +++ b/tools/regression/acct/regress.t @@ -17,6 +17,8 @@ check() fi } +(cd $DIR ; make pack) >/dev/null 2>&1 + echo 1..7 check 1 0 0 @@ -27,4 +29,6 @@ check 5 1 1000000 check 6 2147483647 999999 check 7 10000000 +(cd $DIR ; make clean) >/dev/null 2>&1 + exit 0 diff --git a/tools/regression/acltools/02.t b/tools/regression/acltools/02.t new file mode 100644 index 000000000000..431375ed5b7c --- /dev/null +++ b/tools/regression/acltools/02.t @@ -0,0 +1,86 @@ +#!/bin/sh +# +# Copyright (c) 2008, 2009 Edward Tomasz NapieraÅ‚a +# 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$ +# + +# This is a wrapper script to run tools-nfs4.test. +# +# If any of the tests fails, here is how to debug it: go to +# the directory with problematic filesystem mounted on it, +# and do /path/to/test run /path/to/test tools-nfs4.test, e.g. +# +# /usr/src/tools/regression/acltools/run /usr/src/tools/regression/acltools/tools-nfs4.test +# +# Output should be obvious. + +echo "1..4" + +if [ `whoami` != "root" ]; then + echo "not ok 1 - you need to be root to run this test." + exit 1 +fi + +TESTDIR=`dirname $0` + +# Set up the test filesystem. +MD=`mdconfig -at swap -s 10m` +MNT=`mktemp -dt acltools` +newfs /dev/$MD > /dev/null +mount -o nfsv4acls /dev/$MD $MNT +if [ $? -ne 0 ]; then + echo "not ok 1 - mount failed." + exit 1 +fi + +echo "ok 1" + +cd $MNT + +# First, check whether we can crash the kernel by creating too many +# entries. For some reason this won't work in the test file. +touch xxx +setfacl -x5 xxx +while :; do setfacl -a0 u:42:rwx:allow xxx 2> /dev/null; if [ $? -ne 0 ]; then break; fi; done +chmod 600 xxx +rm xxx +echo "ok 2" + +perl $TESTDIR/run $TESTDIR/tools-nfs4.test > /dev/null + +if [ $? -eq 0 ]; then + echo "ok 3" +else + echo "not ok 3" +fi + +cd / +umount -f $MNT +rmdir $MNT +mdconfig -du $MD + +echo "ok 4" + diff --git a/tools/regression/acltools/tools-crossfs.test b/tools/regression/acltools/tools-crossfs.test index f6c5ed408b74..6652a120befa 100644 --- a/tools/regression/acltools/tools-crossfs.test +++ b/tools/regression/acltools/tools-crossfs.test @@ -56,17 +56,14 @@ $ getfacl -nq posix/xxx > group::r-- > other::r-- -$ rm posix/xxx - -# mv without any ACLs. -$ chmod 456 nfs4/xxx -$ mv nfs4/xxx posix/ +# mv with POSIX.1e ACLs. +$ rm -f posix/xxx +$ rm -f posix/yyy +$ touch posix/xxx +$ chmod 456 posix/xxx $ ls -l posix/xxx | cut -d' ' -f1 > -r--r-xrw- - -# mv with POSIX.1e ACLs. $ setfacl -m u:42:x,g:43:w posix/xxx -$ rm -f posix/yyy $ mv posix/xxx posix/yyy $ getfacl -nq posix/yyy > user::r-- @@ -75,9 +72,30 @@ $ getfacl -nq posix/yyy > group:43:-w- > mask::rwx > other::rw- +$ ls -l posix/yyy | cut -d' ' -f1 +> -r--rwxrw-+ + +# mv from POSIX.1e to none. +$ rm -f posix/xxx +$ rm -f none/xxx +$ touch posix/xxx +$ chmod 345 posix/xxx +$ setfacl -m u:42:x,g:43:w posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> --wxrwxr-x+ +$ mv posix/xxx none/xxx +> mv: failed to set acl entries for none/xxx: Operation not supported +$ ls -l none/xxx | cut -d' ' -f1 +> --wxrwxr-x # mv from POSIX.1e to NFSv4. +$ rm -f posix/xxx $ rm -f nfs4/xxx +$ touch posix/xxx +$ chmod 456 posix/xxx +$ setfacl -m u:42:x,g:43:w posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> -r--rwxrw-+ $ mv posix/yyy nfs4/xxx > mv: failed to set acl entries for nfs4/xxx: Invalid argument $ getfacl -nq nfs4/xxx @@ -87,37 +105,82 @@ $ getfacl -nq nfs4/xxx > group@:rwxp----------:------:allow > everyone@:--x----A-W-Co-:------:deny > everyone@:rw-p--a-R-c--s:------:allow +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -r--rwxrw- # mv with NFSv4 ACLs. -$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ rm -f nfs4/xxx $ rm -f nfs4/yyy +$ touch nfs4/xxx +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx $ mv nfs4/xxx nfs4/yyy $ getfacl -nq nfs4/yyy > user:42:--x-----------:------:allow > group:43:-w------------:------:allow -> owner@:-wxp----------:------:deny -> owner@:r------A-W-Co-:------:allow -> group@:--------------:------:deny -> group@:rwxp----------:------:allow -> everyone@:--x----A-W-Co-:------:deny -> everyone@:rw-p--a-R-c--s:------:allow +> owner@:--x-----------:------:deny +> owner@:rw-p---A-W-Co-:------:allow +> group@:-wxp----------:------:deny +> group@:r-------------:------:allow +> everyone@:-wxp---A-W-Co-:------:deny +> everyone@:r-----a-R-c--s:------:allow +$ ls -l nfs4/yyy | cut -d' ' -f1 +> -rw-r--r--+ -# mv from NFSv4 to POSIX.1e. +# mv from NFSv4 to POSIX.1e without any ACLs. +$ rm -f nfs4/xxx $ rm -f posix/xxx -$ mv nfs4/yyy posix/xxx -> mv: failed to set acl entries for posix/xxx: Invalid argument +$ touch nfs4/xxx +$ chmod 456 nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -r--r-xrw- +$ mv nfs4/xxx posix/xxx $ ls -l posix/xxx | cut -d' ' -f1 -> -r--rwxrw- +> -r--r-xrw- -# mv from POSIX.1e to none. -$ setfacl -m u:42:x,g:43:w posix/xxx -$ mv posix/xxx none/xxx +# mv from NFSv4 to none. +$ rm -f nfs4/xxx +$ rm -f none/xxx +$ touch nfs4/xxx +$ chmod 345 nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> --wxr--r-x +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> --wxr--r-x+ +$ mv nfs4/xxx none/xxx > mv: failed to set acl entries for none/xxx: Operation not supported $ ls -l none/xxx | cut -d' ' -f1 -> -r--rwxrw- +> --wxr--r-x + +# mv from NFSv4 to POSIX.1e. +$ rm -f nfs4/xxx +$ rm -f posix/xxx +$ touch nfs4/xxx +$ chmod 345 nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> --wxr--r-x +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> --wxr--r-x+ +$ mv nfs4/xxx posix/xxx +> mv: failed to set acl entries for posix/xxx: Invalid argument +$ ls -l posix/xxx | cut -d' ' -f1 +> --wxr--r-x # cp with POSIX.1e ACLs. $ rm -f posix/xxx +$ rm -f posix/yyy +$ touch posix/xxx +$ setfacl -m u:42:x,g:43:w posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> -rw-rwxr--+ +$ cp posix/xxx posix/yyy +$ ls -l posix/yyy | cut -d' ' -f1 +> -rw-r-xr-- + +# cp -p with POSIX.1e ACLs. +$ rm -f posix/xxx +$ rm -f posix/yyy $ touch posix/xxx $ setfacl -m u:42:x,g:43:w posix/xxx $ getfacl -nq posix/xxx @@ -127,15 +190,8 @@ $ getfacl -nq posix/xxx > group:43:-w- > mask::rwx > other::r-- - -$ rm -f posix/yyy -$ cp posix/xxx posix/yyy -$ getfacl -nq posix/yyy -> user::rw- -> group::r-x -> other::r-- - -$ rm -f posix/yyy +$ ls -l posix/xxx | cut -d' ' -f1 +> -rw-rwxr--+ $ cp -p posix/xxx posix/yyy $ getfacl -nq posix/yyy > user::rw- @@ -144,35 +200,132 @@ $ getfacl -nq posix/yyy > group:43:-w- > mask::rwx > other::r-- +$ ls -l posix/yyy | cut -d' ' -f1 +> -rw-rwxr--+ -# mv from POSIX.1e to NFSv4. +# cp from POSIX.1e to none. +$ rm -f posix/xxx +$ rm -f none/xxx +$ touch posix/xxx +$ setfacl -m u:42:x,g:43:w posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> -rw-rwxr--+ +$ cp posix/xxx none/xxx +$ ls -l none/xxx | cut -d' ' -f1 +> -rw-r-xr-- + +# cp -p from POSIX.1e to none. +$ rm -f posix/xxx +$ rm -f none/xxx +$ touch posix/xxx +$ setfacl -m u:42:x,g:43:w posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> -rw-rwxr--+ +$ cp -p posix/xxx none/xxx +> cp: failed to set acl entries for none/xxx: Operation not supported +$ ls -l none/xxx | cut -d' ' -f1 +> -rw-rwxr-- + +# cp from POSIX.1e to NFSv4. +$ rm -f posix/xxx $ rm -f nfs4/xxx +$ touch posix/xxx +$ setfacl -m u:42:x,g:43:w posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> -rw-rwxr--+ +$ cp posix/xxx nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -rw-r-xr-- + +# cp -p from POSIX.1e to NFSv4. +$ rm -f posix/xxx +$ rm -f nfs4/xxx +$ touch posix/xxx +$ setfacl -m u:42:x,g:43:w posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> -rw-rwxr--+ $ cp -p posix/xxx nfs4/xxx > cp: failed to set acl entries for nfs4/xxx: Invalid argument $ ls -l nfs4/xxx | cut -d' ' -f1 > -rw-rwxr-- # cp with NFSv4 ACLs. -$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ rm -f nfs4/xxx $ rm -f nfs4/yyy +$ touch nfs4/xxx +$ chmod 543 nfs4/xxx +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -r-xr---wx+ +$ cp nfs4/xxx nfs4/yyy +$ ls -l nfs4/yyy | cut -d' ' -f1 +> -r-xr----x + +# cp -p with NFSv4 ACLs. +$ rm -f nfs4/xxx +$ rm -f nfs4/yyy +$ touch nfs4/xxx +$ chmod 543 nfs4/xxx +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx $ cp -p nfs4/xxx nfs4/yyy $ getfacl -nq nfs4/yyy > user:42:--x-----------:------:allow > group:43:-w------------:------:allow -> owner@:--x-----------:------:deny -> owner@:rw-p---A-W-Co-:------:allow -> group@:--------------:------:deny -> group@:rwxp----------:------:allow -> everyone@:-wxp---A-W-Co-:------:deny -> everyone@:r-----a-R-c--s:------:allow +> owner@:-w-p----------:------:deny +> owner@:r-x----A-W-Co-:------:allow +> group@:-wxp----------:------:deny +> group@:r-------------:------:allow +> everyone@:r------A-W-Co-:------:deny +> everyone@:-wxp--a-R-c--s:------:allow +$ ls -l nfs4/yyy | cut -d' ' -f1 +> -r-xr---wx+ + +# cp from NFSv4 to none. +$ rm -f nfs4/xxx +$ rm -f none/xxx +$ touch nfs4/xxx +$ chmod 543 nfs4/xxx +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -r-xr---wx+ +$ cp nfs4/xxx none/xxx +$ ls -l none/xxx | cut -d' ' -f1 +> -r-xr----x + +# cp -p from NFSv4 to none. +$ rm -f nfs4/xxx +$ rm -f none/xxx +$ touch nfs4/xxx +$ chmod 543 nfs4/xxx +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -r-xr---wx+ +$ cp -p nfs4/xxx none/xxx +> cp: failed to set acl entries for none/xxx: Operation not supported +$ ls -l none/xxx | cut -d' ' -f1 +> -r-xr---wx # cp from NFSv4 to POSIX.1e. +$ rm -f nfs4/xxx $ rm -f posix/xxx +$ touch nfs4/xxx +$ chmod 543 nfs4/xxx +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -r-xr---wx+ +$ cp nfs4/xxx posix/xxx +$ ls -l posix/xxx | cut -d' ' -f1 +> -r-xr----x + +# cp -p from NFSv4 to POSIX.1e. +$ rm -f nfs4/xxx +$ rm -f posix/xxx +$ touch nfs4/xxx +$ chmod 543 nfs4/xxx +$ setfacl -a0 u:42:x:allow,g:43:w:allow nfs4/xxx +$ ls -l nfs4/xxx | cut -d' ' -f1 +> -r-xr---wx+ $ cp -p nfs4/xxx posix/xxx > cp: failed to set acl entries for posix/xxx: Invalid argument $ ls -l posix/xxx | cut -d' ' -f1 -> -rw-rwxr-- - -$ cp -p nfs4/yyy none/xxx -> cp: failed to set acl entries for none/xxx: Operation not supported - +> -r-xr---wx diff --git a/tools/regression/bin/date/regress.sh b/tools/regression/bin/date/regress.sh index 463e49c8f8fd..9f4b68bef13b 100644 --- a/tools/regression/bin/date/regress.sh +++ b/tools/regression/bin/date/regress.sh @@ -35,19 +35,21 @@ check() R=`date -r ${TEST1} +%${S}` if [ "${R}" = "${A1}" ]; then - echo "${count}a. ${S} - ok" + echo "ok ${S}{t1}" else - echo "${count}a. ${S} - not ok (got ${R}, expected ${A1})" + echo "no ok ${S}{t1} - (got ${R}, expected ${A1})" fi R=`date -r ${TEST2} +%${S}` if [ "${R}" = "${A2}" ]; then - echo "${count}b. ${S} - ok" + echo "ok ${S}{t2}" else - echo "${count}b. ${S} - not ok (got ${R}, expected ${A2})" + echo "no ok ${S}{t2} - (got ${R}, expected ${A2})" fi } +echo "1..78" + check A Saturday Monday check a Sat Mon check B February November diff --git a/tools/regression/bin/mv/regress.sh b/tools/regression/bin/mv/regress.sh index 9283a9f3b1c0..d0a5e83440c6 100644 --- a/tools/regression/bin/mv/regress.sh +++ b/tools/regression/bin/mv/regress.sh @@ -184,7 +184,7 @@ do # Should fail per POSIX step 3a: # Destination path is a file of type directory and # source_file is not a file of type directory - mv 1/2/3/fa ${FS}db + mv 1/2/3/fa ${FS}db 2>/dev/null ckfail $? ckf fa 1/2/3/fa end @@ -238,7 +238,7 @@ do mkd da1/da2/da3/da mkdir -p ${FS}db1/db2/db3/da/full # Should fail (per the semantics of rename(2)) - mv da1/da2/da3/da ${FS}db1/db2/db3 + mv da1/da2/da3/da ${FS}db1/db2/db3 2>/dev/null ckfail $? ckd da da1/da2/da3/da end @@ -250,7 +250,7 @@ do # Should fail per POSIX step 3b: # Destination path is a file not of type directory # and source_file is a file of type directory - mv da1/da2/da3/da ${FS}db1/db2/db3/da + mv da1/da2/da3/da ${FS}db1/db2/db3/da 2>/dev/null ckfail $? ckd da da1/da2/da3/da end diff --git a/tools/regression/bin/sh/builtins/builtin1.0 b/tools/regression/bin/sh/builtins/builtin1.0 new file mode 100644 index 000000000000..b6083858f671 --- /dev/null +++ b/tools/regression/bin/sh/builtins/builtin1.0 @@ -0,0 +1,31 @@ +# $FreeBSD$ + +failures=0 + +check() { + if ! eval "[ $* ]"; then + echo "Failed: $*" + : $((failures += 1)) + fi +} + +builtin : || echo "Bad return code at $LINENO" +builtin true || echo "Bad return code at $LINENO" +builtin ls 2>/dev/null && echo "Bad return code at $LINENO" +check '"$(builtin pwd)" = "$(pwd)"' +check '-z "$(builtin :)"' +check '-z "$(builtin true)"' +check '-z "$( (builtin nosuchtool) 2>/dev/null)"' +check '-z "$(builtin nosuchtool 2>/dev/null)"' +check '-z "$(builtin nosuchtool 2>/dev/null; :)"' +check '-z "$( (builtin ls) 2>/dev/null)"' +check '-z "$(builtin ls 2>/dev/null)"' +check '-z "$(builtin ls 2>/dev/null; :)"' +check '-n "$( (builtin nosuchtool) 2>&1)"' +check '-n "$(builtin nosuchtool 2>&1)"' +check '-n "$(builtin nosuchtool 2>&1; :)"' +check '-n "$( (builtin ls) 2>&1)"' +check '-n "$(builtin ls 2>&1)"' +check '-n "$(builtin ls 2>&1; :)"' + +exit $((failures > 0)) diff --git a/tools/regression/bin/sh/builtins/cd1.0 b/tools/regression/bin/sh/builtins/cd1.0 index 52970232bf41..b6151743ebff 100644 --- a/tools/regression/bin/sh/builtins/cd1.0 +++ b/tools/regression/bin/sh/builtins/cd1.0 @@ -1,17 +1,27 @@ # $FreeBSD$ set -e -PDIR=${TMPDIR:-/tmp} -cd ${PDIR} -TMPDIR=$(mktemp -d sh-test.XXXXXX) -chmod 0 ${TMPDIR} +P=${TMPDIR:-/tmp} +cd $P +T=$(mktemp -d sh-test.XXXXXX) -cd -L ${TMPDIR} 2>/dev/null && exit 1 -[ "${PWD}" = "${PDIR}" ] -[ "$(pwd)" = "${PDIR}" ] -cd -P ${TMPDIR} 2>/dev/null && exit 1 -[ "${PWD}" = "${PDIR}" ] -[ "$(pwd)" = "${PDIR}" ] +chmod 0 $T +cd -L $T 2>/dev/null && exit 1 +[ "$PWD" = "$P" ] +[ "$(pwd)" = "$P" ] +cd -P $T 2>/dev/null && exit 1 +[ "$PWD" = "$P" ] +[ "$(pwd)" = "$P" ] -chmod 755 ${TMPDIR} -rmdir ${TMPDIR} +chmod 755 $T +cd $T +mkdir -p 1/2/3 +ln -s 1/2 link1 +ln -s 2/3 1/link2 +(cd -L 1/../1 && [ "$(pwd -L)" = "$P/$T/1" ]) +(cd -L link1 && [ "$(pwd -L)" = "$P/$T/link1" ]) +(cd -L link1 && [ "$(pwd -P)" = "$P/$T/1/2" ]) +(cd -P link1 && [ "$(pwd -L)" = "$P/$T/1/2" ]) +(cd -P link1 && [ "$(pwd -P)" = "$P/$T/1/2" ]) + +rm -rf ${P}/${T} diff --git a/tools/regression/bin/sh/builtins/cd2.0 b/tools/regression/bin/sh/builtins/cd2.0 new file mode 100644 index 000000000000..eb8caf5dadaf --- /dev/null +++ b/tools/regression/bin/sh/builtins/cd2.0 @@ -0,0 +1,15 @@ +# $FreeBSD$ +set -e + +T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX) +cd $T +D=$T +for i in 0 1 2 3 4 5 6 7 8 9; do + for j in 0 1 2 3 4 5 6 7 8 9; do + mkdir veryverylongdirectoryname + cd veryverylongdirectoryname + D=$D/veryverylongdirectoryname + done +done +[ $(pwd | wc -c) -eq $((${#D} + 1)) ] # +\n +rm -rf ${T} diff --git a/tools/regression/bin/sh/builtins/command6.0 b/tools/regression/bin/sh/builtins/command6.0 new file mode 100644 index 000000000000..2ba836e58a21 --- /dev/null +++ b/tools/regression/bin/sh/builtins/command6.0 @@ -0,0 +1,15 @@ +# $FreeBSD$ +PATH=/var/empty +command -pV ls +command -pV true +command -pV /bin/ls + +fun() { +} +command -pV fun +command -pV break +command -pV if +command -pV { + +alias foo=bar +command -pV foo diff --git a/tools/regression/bin/sh/builtins/command6.0.stdout b/tools/regression/bin/sh/builtins/command6.0.stdout new file mode 100644 index 000000000000..4cb2b11fb490 --- /dev/null +++ b/tools/regression/bin/sh/builtins/command6.0.stdout @@ -0,0 +1,8 @@ +ls is /bin/ls +true is a shell builtin +/bin/ls is /bin/ls +fun is a shell function +break is a special shell builtin +if is a shell keyword +{ is a shell keyword +foo is an alias for bar diff --git a/tools/regression/bin/sh/builtins/command7.0 b/tools/regression/bin/sh/builtins/command7.0 new file mode 100644 index 000000000000..897a14cf6bc2 --- /dev/null +++ b/tools/regression/bin/sh/builtins/command7.0 @@ -0,0 +1,29 @@ +# $FreeBSD$ + +failures=0 + +check() { + if ! eval "[ $* ]"; then + echo "Failed: $*" + : $((failures += 1)) + fi +} + +check '"$(PATH=/libexec command -V ld-elf.so.1)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"' +check '"$(PATH=/libexec command -V ld-elf.so.1; :)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"' +check '"$(PATH=/libexec command -pv ld-elf.so.1)" = ""' +check '"$(PATH=/libexec command -pv ld-elf.so.1; :)" = ""' + +PATH=/libexec:$PATH + +check '"$(command -V ld-elf.so.1)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"' +check '"$(command -V ld-elf.so.1; :)" = "ld-elf.so.1 is /libexec/ld-elf.so.1"' +check '"$(command -pv ld-elf.so.1)" = ""' +check '"$(command -pv ld-elf.so.1; :)" = ""' + +PATH=/libexec + +check '"$(command -v ls)" = ""' +check '"$(command -pv ls)" = "/bin/ls"' + +exit $((failures > 0)) diff --git a/tools/regression/bin/sh/builtins/fc1.0 b/tools/regression/bin/sh/builtins/fc1.0 new file mode 100644 index 000000000000..7cf0d943a137 --- /dev/null +++ b/tools/regression/bin/sh/builtins/fc1.0 @@ -0,0 +1,27 @@ +# $FreeBSD$ +set -e +trap 'echo Broken pipe -- test failed' pipe + +P=${TMPDIR:-/tmp} +cd $P +T=$(mktemp -d sh-test.XXXXXX) +cd $T + +mkfifo input output error +HISTFILE=/dev/null sh +m -i output 2>error & +{ + # Syntax error + echo ')' >&3 + # Read error message, shell will read new input now + read dummy <&5 + # Execute bad command again + echo 'fc -e true' >&3 + # Verify that the shell is still running + echo 'echo continued' >&3 || rc=3 + echo 'exit' >&3 || rc=3 + read line <&4 && [ "$line" = continued ] && : ${rc:=0} +} 3>input 4output 2>error & +exec 3>input +{ + # Command not found, containing slash + echo '/var/empty/nonexistent' >&3 + # Read error message, shell will read new input now + read dummy <&5 + # Execute bad command again + echo 'fc -e true; echo continued' >&3 + read dummy <&5 + read line <&4 && [ "$line" = continued ] && : ${rc:=0} + exec 3>&- + # Old sh duplicates itself after the fc, producing another line + # of output. + if read line <&4; then + echo "Extraneous output: $line" + rc=1 + fi +} 4&- + +rm input output error +rmdir ${P}/${T} +exit ${rc:-3} diff --git a/tools/regression/bin/sh/builtins/trap3.0 b/tools/regression/bin/sh/builtins/trap3.0 new file mode 100644 index 000000000000..41bdd61747ae --- /dev/null +++ b/tools/regression/bin/sh/builtins/trap3.0 @@ -0,0 +1,12 @@ +# $FreeBSD$ + +{ + trap '' garbage && exit 3 + trap - garbage && exit 3 + trap true garbage && exit 3 + trap '' 99999 && exit 3 + trap - 99999 && exit 3 + trap true 99999 && exit 3 +} 2>/dev/null +test -n "$(trap true garbage TERM 2>/dev/null || trap)" || exit 3 +exit 0 diff --git a/tools/regression/bin/sh/builtins/type2.0 b/tools/regression/bin/sh/builtins/type2.0 new file mode 100644 index 000000000000..fe44d957fc0a --- /dev/null +++ b/tools/regression/bin/sh/builtins/type2.0 @@ -0,0 +1,26 @@ +# $FreeBSD$ + +failures=0 + +check() { + if ! eval "$*"; then + echo "Failed: $*" + : $((failures += 1)) + fi +} + +check 'PATH=/libexec type ld-elf.so.1 >/dev/null' +check '! PATH=/libexec type ls 2>/dev/null' + +PATH=/libexec:$PATH + +check 'type ld-elf.so.1 >/dev/null' + +PATH=/libexec + +check 'type ld-elf.so.1 >/dev/null' +check '! type ls 2>/dev/null' +check 'PATH=/bin type ls >/dev/null' +check '! PATH=/bin type ld-elf.so.1 2>/dev/null' + +exit $((failures > 0)) diff --git a/tools/regression/bin/sh/errors/backquote-error1.0 b/tools/regression/bin/sh/errors/backquote-error1.0 index 4d539c03178b..2a40c88e1be7 100644 --- a/tools/regression/bin/sh/errors/backquote-error1.0 +++ b/tools/regression/bin/sh/errors/backquote-error1.0 @@ -1,4 +1,4 @@ # $FreeBSD$ -echo 'echo `for` echo ".BAD"CODE.' | sh -i 2>&1 | grep -q BADCODE && exit 1 +echo 'echo `for` echo ".BAD"CODE.' | sh +m -i 2>&1 | grep -q BADCODE && exit 1 exit 0 diff --git a/tools/regression/bin/sh/errors/backquote-error2.0 b/tools/regression/bin/sh/errors/backquote-error2.0 new file mode 100644 index 000000000000..977c055a2af1 --- /dev/null +++ b/tools/regression/bin/sh/errors/backquote-error2.0 @@ -0,0 +1,7 @@ +# $FreeBSD$ + +sh -c 'echo `echo .BA"DCODE.` +echo ".BAD"CODE.' 2>&1 | grep -q BADCODE && exit 1 +echo '`"`' | sh -n 2>/dev/null && exit 1 +echo '`'"'"'`' | sh -n 2>/dev/null && exit 1 +exit 0 diff --git a/tools/regression/bin/sh/execution/redir1.0 b/tools/regression/bin/sh/execution/redir1.0 new file mode 100644 index 000000000000..cc5cc49318fe --- /dev/null +++ b/tools/regression/bin/sh/execution/redir1.0 @@ -0,0 +1,27 @@ +# $FreeBSD$ +trap ': $((brokenpipe+=1))' pipe + +P=${TMPDIR:-/tmp} +cd $P +T=$(mktemp -d sh-test.XXXXXX) +cd $T + +brokenpipe=0 +mkfifo fifo1 fifo2 +read dummy >fifo2 fifo2 +} 3fifo1 +if [ $brokenpipe -ne 0 ]; then + rc=3 +fi +wait +echo dummy >&4 +if [ $brokenpipe -eq 1 ]; then + : ${rc:=0} +fi + +rm fifo1 fifo2 +rmdir ${P}/${T} +exit ${rc:-3} diff --git a/tools/regression/bin/sh/execution/redir2.0 b/tools/regression/bin/sh/execution/redir2.0 new file mode 100644 index 000000000000..079ee82f533d --- /dev/null +++ b/tools/regression/bin/sh/execution/redir2.0 @@ -0,0 +1,29 @@ +# $FreeBSD$ +trap ': $((brokenpipe+=1))' pipe + +P=${TMPDIR:-/tmp} +cd $P +T=$(mktemp -d sh-test.XXXXXX) +cd $T + +brokenpipe=0 +mkfifo fifo1 fifo2 +{ + { + exec sh -c 'exec fifo2 +exec 3>fifo1 +echo dummy >&4 +if [ $brokenpipe -eq 1 ]; then + : ${rc:=0} +fi +echo dummy >&3 +wait + +rm fifo1 fifo2 +rmdir ${P}/${T} +exit ${rc:-3} diff --git a/tools/regression/bin/sh/execution/unknown1.0 b/tools/regression/bin/sh/execution/unknown1.0 new file mode 100644 index 000000000000..45f541e6eeea --- /dev/null +++ b/tools/regression/bin/sh/execution/unknown1.0 @@ -0,0 +1,29 @@ +# $FreeBSD$ + +nosuchtool 2>/dev/null +[ $? -ne 127 ] && exit 1 +/var/empty/nosuchtool 2>/dev/null +[ $? -ne 127 ] && exit 1 +(nosuchtool) 2>/dev/null +[ $? -ne 127 ] && exit 1 +(/var/empty/nosuchtool) 2>/dev/null +[ $? -ne 127 ] && exit 1 +/ 2>/dev/null +[ $? -ne 126 ] && exit 1 +PATH=/usr bin 2>/dev/null +[ $? -ne 126 ] && exit 1 + +dummy=$(nosuchtool 2>/dev/null) +[ $? -ne 127 ] && exit 1 +dummy=$(/var/empty/nosuchtool 2>/dev/null) +[ $? -ne 127 ] && exit 1 +dummy=$( (nosuchtool) 2>/dev/null) +[ $? -ne 127 ] && exit 1 +dummy=$( (/var/empty/nosuchtool) 2>/dev/null) +[ $? -ne 127 ] && exit 1 +dummy=$(/ 2>/dev/null) +[ $? -ne 126 ] && exit 1 +dummy=$(PATH=/usr bin 2>/dev/null) +[ $? -ne 126 ] && exit 1 + +exit 0 diff --git a/tools/regression/bin/sh/expansion/arith1.0 b/tools/regression/bin/sh/expansion/arith1.0 new file mode 100644 index 000000000000..118ba2265687 --- /dev/null +++ b/tools/regression/bin/sh/expansion/arith1.0 @@ -0,0 +1,30 @@ +# $FreeBSD$ + +failures=0 + +check() { + if [ $(($1)) != $2 ]; then + failures=$((failures+1)) + echo "For $1, expected $2 actual $(($1))" + fi +} + +check "0&&0" 0 +check "1&&0" 0 +check "0&&1" 0 +check "1&&1" 1 +check "2&&2" 1 +check "1&&2" 1 +check "1<<40&&1<<40" 1 +check "1<<40&&4" 1 + +check "0||0" 0 +check "1||0" 1 +check "0||1" 1 +check "1||1" 1 +check "2||2" 1 +check "1||2" 1 +check "1<<40||1<<40" 1 +check "1<<40||4" 1 + +exit $((failures != 0)) diff --git a/tools/regression/bin/sh/expansion/arith2.0 b/tools/regression/bin/sh/expansion/arith2.0 new file mode 100644 index 000000000000..3e4bb2f99d55 --- /dev/null +++ b/tools/regression/bin/sh/expansion/arith2.0 @@ -0,0 +1,77 @@ +# $FreeBSD$ + +failures=0 + +check() { + if [ $(($1)) != $2 ]; then + failures=$((failures+1)) + echo "For $1, expected $2 actual $(($1))" + fi +} + +# variables +unset v +check "v=2" 2 +check "v" 2 +check "$(($v))" 2 +check "v+=1" 3 +check "v" 3 + +# constants +check "4611686018427387904" 4611686018427387904 +check "0x4000000000000000" 4611686018427387904 +check "0400000000000000000000" 4611686018427387904 +check "0x4Ab0000000000000" 5381801554707742720 +check "010" 8 + +# try out all operators +v=42 +check "!v" 0 +check "!!v" 1 +check "!0" 1 +check "~0" -1 +check "~(-1)" 0 +check "-0" 0 +check "-v" -42 +check "v*v" 1764 +check "v/2" 21 +check "v%10" 2 +check "v+v" 84 +check "v-4" 38 +check "v<<1" 84 +check "v>>1" 21 +check "v<43" 1 +check "v>42" 0 +check "v<=43" 1 +check "v>=43" 0 +check "v==41" 0 +check "v!=42" 0 +check "v&3" 2 +check "v^3" 41 +check "v|3" 43 +check "v>=40&&v<=44" 1 +check "v<40||v>44" 0 +check "(v=42)&&(v+=1)==43" 1 +check "v" 43 +check "(v=42)&&(v-=1)==41" 1 +check "v" 41 +check "(v=42)&&(v*=2)==84" 1 +check "v" 84 +check "(v=42)&&(v/=10)==4" 1 +check "v" 4 +check "(v=42)&&(v%=10)==2" 1 +check "v" 2 +check "(v=42)&&(v<<=1)==84" 1 +check "v" 84 +check "(v=42)&&(v>>=2)==10" 1 +check "v" 10 +check "(v=42)&&(v&=32)==32" 1 +check "v" 32 +check "(v=42)&&(v^=32)==10" 1 +check "v" 10 +check "(v=42)&&(v|=32)==42" 1 +check "v" 42 + +# missing: ternary, comma + +exit $((failures != 0)) diff --git a/tools/regression/bin/sh/expansion/arith3.0 b/tools/regression/bin/sh/expansion/arith3.0 new file mode 100644 index 000000000000..b69159d9b5b8 --- /dev/null +++ b/tools/regression/bin/sh/expansion/arith3.0 @@ -0,0 +1,14 @@ +# $FreeBSD$ + +failures=0 + +check() { + if [ $(($1)) != $2 ]; then + failures=$((failures+1)) + echo "For $1, expected $2 actual $(($1))" + fi +} + +check "1 << 1 + 1 | 1" 5 + +exit $((failures != 0)) diff --git a/tools/regression/bin/sh/expansion/cmdsubst1.0 b/tools/regression/bin/sh/expansion/cmdsubst1.0 new file mode 100644 index 000000000000..515c7da9aca1 --- /dev/null +++ b/tools/regression/bin/sh/expansion/cmdsubst1.0 @@ -0,0 +1,48 @@ +# $FreeBSD$ + +failures=0 + +check() { + if ! eval "[ $* ]"; then + echo "Failed: $*" + : $((failures += 1)) + fi +} + +check '"$(echo abcde)" = "abcde"' +check '"$(echo abcde; :)" = "abcde"' + +check '"$(printf abcde)" = "abcde"' +check '"$(printf abcde; :)" = "abcde"' + +# regular +check '-n "$(umask)"' +check '-n "$(umask; :)"' +check '-n "$(umask 2>&1)"' +check '-n "$(umask 2>&1; :)"' + +# special +check '-n "$(times)"' +check '-n "$(times; :)"' +check '-n "$(times 2>&1)"' +check '-n "$(times 2>&1; :)"' + +# regular +check '".$(umask -@ 2>&1)." = ".umask: Illegal option -@."' +check '".$(umask -@ 2>&1; :)." = ".umask: Illegal option -@."' +check '".$({ umask -@; } 2>&1)." = ".umask: Illegal option -@."' + +# special +check '".$(shift xyz 2>&1)." = ".shift: Illegal number: xyz."' +check '".$(shift xyz 2>&1; :)." = ".shift: Illegal number: xyz."' +check '".$({ shift xyz; } 2>&1)." = ".shift: Illegal number: xyz."' + +v=1 +check '-z "$(v=2 :)"' +check '"$v" = 1' +check '-z "$(v=3)"' +check '"$v" = 1' +check '"$(v=4 eval echo \$v)" = 4' +check '"$v" = 1' + +exit $((failures > 0)) diff --git a/tools/regression/bin/sh/expansion/question1.0 b/tools/regression/bin/sh/expansion/question1.0 new file mode 100644 index 000000000000..355af624aa6d --- /dev/null +++ b/tools/regression/bin/sh/expansion/question1.0 @@ -0,0 +1,22 @@ +# $FreeBSD$ + +x=a\ b +[ "$x" = "${x?}" ] || exit 1 +set -- ${x?} +{ [ "$#" = 2 ] && [ "$1" = a ] && [ "$2" = b ]; } || exit 1 +unset x +(echo ${x?abcdefg}) 2>&1 | grep -q abcdefg || exit 1 +sh -c 'unset foo; echo ${foo?}' 2>/dev/null && exit 1 +sh -c 'foo=; echo ${foo:?}' 2>/dev/null && exit 1 +sh -c 'foo=; echo ${foo?}' >/dev/null || exit 1 +sh -c 'foo=1; echo ${foo:?}' >/dev/null || exit 1 +sh -c 'echo ${!?}' 2>/dev/null && exit 1 +sh -c ':& echo ${!?}' >/dev/null || exit 1 +sh -c 'echo ${#?}' >/dev/null || exit 1 +sh -c 'echo ${*?}' 2>/dev/null && exit 1 +sh -c 'echo ${*?}' sh x >/dev/null || exit 1 +sh -c 'echo ${1?}' 2>/dev/null && exit 1 +sh -c 'echo ${1?}' sh x >/dev/null || exit 1 +sh -c 'echo ${2?}' sh x 2>/dev/null && exit 1 +sh -c 'echo ${2?}' sh x y >/dev/null || exit 1 +exit 0 diff --git a/tools/regression/bin/sh/expansion/set-u1.0 b/tools/regression/bin/sh/expansion/set-u1.0 new file mode 100644 index 000000000000..a66bfc9dc99b --- /dev/null +++ b/tools/regression/bin/sh/expansion/set-u1.0 @@ -0,0 +1,29 @@ +# $FreeBSD$ + +sh -uc 'unset foo; echo $foo' 2>/dev/null && exit 1 +sh -uc 'foo=; echo $foo' >/dev/null || exit 1 +sh -uc 'foo=1; echo $foo' >/dev/null || exit 1 +# -/+/= are unaffected by set -u +sh -uc 'unset foo; echo ${foo-}' >/dev/null || exit 1 +sh -uc 'unset foo; echo ${foo+}' >/dev/null || exit 1 +sh -uc 'unset foo; echo ${foo=}' >/dev/null || exit 1 +# length/trimming are affected +sh -uc 'unset foo; echo ${#foo}' 2>/dev/null && exit 1 +sh -uc 'foo=; echo ${#foo}' >/dev/null || exit 1 +sh -uc 'unset foo; echo ${foo#?}' 2>/dev/null && exit 1 +sh -uc 'foo=1; echo ${foo#?}' >/dev/null || exit 1 +sh -uc 'unset foo; echo ${foo##?}' 2>/dev/null && exit 1 +sh -uc 'foo=1; echo ${foo##?}' >/dev/null || exit 1 +sh -uc 'unset foo; echo ${foo%?}' 2>/dev/null && exit 1 +sh -uc 'foo=1; echo ${foo%?}' >/dev/null || exit 1 +sh -uc 'unset foo; echo ${foo%%?}' 2>/dev/null && exit 1 +sh -uc 'foo=1; echo ${foo%%?}' >/dev/null || exit 1 + +sh -uc 'echo $!' 2>/dev/null && exit 1 +sh -uc ':& echo $!' >/dev/null || exit 1 +sh -uc 'echo $#' >/dev/null || exit 1 +sh -uc 'echo $1' 2>/dev/null && exit 1 +sh -uc 'echo $1' sh x >/dev/null || exit 1 +sh -uc 'echo $2' sh x 2>/dev/null && exit 1 +sh -uc 'echo $2' sh x y >/dev/null || exit 1 +exit 0 diff --git a/tools/regression/bin/sh/expansion/set-u2.0 b/tools/regression/bin/sh/expansion/set-u2.0 new file mode 100644 index 000000000000..f81aa62cb6ba --- /dev/null +++ b/tools/regression/bin/sh/expansion/set-u2.0 @@ -0,0 +1,12 @@ +# $FreeBSD$ + +set -u +: $* $@ "$@" "$*" +set -- x +: $* $@ "$@" "$*" +shift $# +: $* $@ "$@" "$*" +set -- y +set -- +: $* $@ "$@" "$*" +exit 0 diff --git a/tools/regression/bin/sh/parameters/mail1.0 b/tools/regression/bin/sh/parameters/mail1.0 new file mode 100644 index 000000000000..26308eadbdc4 --- /dev/null +++ b/tools/regression/bin/sh/parameters/mail1.0 @@ -0,0 +1,15 @@ +# $FreeBSD$ +# Test that a non-interactive shell does not access $MAIL. + +goodfile=/var/empty/sh-test-goodfile +mailfile=/var/empty/sh-test-mailfile +T=$(mktemp sh-test.XXXXXX) || exit +MAIL=$mailfile ktrace -i -f "$T" sh -c "[ -s $goodfile ]" 2>/dev/null +if ! grep -q $goodfile "$T"; then + # ktrace problem + rc=0 +elif ! grep -q $mailfile "$T"; then + rc=0 +fi +rm "$T" +exit ${rc:-3} diff --git a/tools/regression/bin/sh/parameters/mail2.0 b/tools/regression/bin/sh/parameters/mail2.0 new file mode 100644 index 000000000000..e3b7da341328 --- /dev/null +++ b/tools/regression/bin/sh/parameters/mail2.0 @@ -0,0 +1,15 @@ +# $FreeBSD$ +# Test that an interactive shell accesses $MAIL. + +goodfile=/var/empty/sh-test-goodfile +mailfile=/var/empty/sh-test-mailfile +T=$(mktemp sh-test.XXXXXX) || exit +ENV=$goodfile MAIL=$mailfile ktrace -i -f "$T" sh +m -i /dev/null 2>&1 +if ! grep -q $goodfile "$T"; then + # ktrace problem + rc=0 +elif grep -q $mailfile "$T"; then + rc=0 +fi +rm "$T" +exit ${rc:-3} diff --git a/tools/regression/bin/sh/parser/for1.0 b/tools/regression/bin/sh/parser/for1.0 new file mode 100644 index 000000000000..64e14420a4d4 --- /dev/null +++ b/tools/regression/bin/sh/parser/for1.0 @@ -0,0 +1,29 @@ +# $FreeBSD$ + +nl=' +' +list=' a b c' +for s1 in "$nl" " "; do + for s2 in "$nl" ";" ";$nl"; do + for s3 in "$nl" " "; do + r='' + eval "for i${s1}in ${list}${s2}do${s3}r=\"\$r \$i\"; done" + [ "$r" = "$list" ] || exit 1 + done + done +done +set -- $list +for s2 in "$nl" " " ";" ";$nl"; do # s2=";" and ";$nl" are extensions to POSIX + for s3 in "$nl" " "; do + r='' + eval "for i${s2}do${s3}r=\"\$r \$i\"; done" + [ "$r" = "$list" ] || exit 1 + done +done +for s1 in "$nl" " "; do + for s2 in "$nl" ";" ";$nl"; do + for s3 in "$nl" " "; do + eval "for i${s1}in${s2}do${s3}exit 1; done" + done + done +done diff --git a/tools/regression/bpf/bpf_filter/Makefile b/tools/regression/bpf/bpf_filter/Makefile index adeead17574a..79a2e0cb0a46 100644 --- a/tools/regression/bpf/bpf_filter/Makefile +++ b/tools/regression/bpf/bpf_filter/Makefile @@ -20,7 +20,7 @@ TEST_CASES?= test0001 test0002 test0003 test0004 \ test0069 test0070 test0071 test0072 \ test0073 test0074 test0075 test0076 \ test0077 test0078 test0079 test0080 \ - test0081 test0082 test0083 + test0081 test0082 test0083 test0084 SYSDIR?= ${.CURDIR}/../../../../sys @@ -43,6 +43,7 @@ CFLAGS+= -DBPF_VALIDATE SRCS+= ${SYSDIR}/net/bpf_jitter.c \ ${SYSDIR}/${MACHINE_ARCH}/${MACHINE_ARCH}/bpf_jit_machdep.c CFLAGS+= -DBPF_JIT_COMPILER +LIBS+= -lutil WARNS?= 6 .else SRCS+= ${SYSDIR}/net/bpf_filter.c @@ -52,7 +53,7 @@ WARNS?= 2 .for TEST in ${TEST_CASES} ${TEST}: ${.CURDIR}/tests/${TEST}.h ${SRCS} @${CC} ${CFLAGS} -DBPF_TEST_H=\"${TEST}.h\" \ - -o ${.CURDIR}/${TEST} ${SRCS} + -o ${.CURDIR}/${TEST} ${SRCS} ${LIBS} .endfor all: ${TEST_CASES} diff --git a/tools/regression/bpf/bpf_filter/bpf_test.c b/tools/regression/bpf/bpf_filter/bpf_test.c index cd16fd68e9e0..6bd67cfe4ca2 100644 --- a/tools/regression/bpf/bpf_filter/bpf_test.c +++ b/tools/regression/bpf/bpf_filter/bpf_test.c @@ -1,5 +1,5 @@ /*- - * Copyright (C) 2008 Jung-uk Kim . All rights reserved. + * Copyright (C) 2008-2009 Jung-uk Kim . All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -57,6 +57,8 @@ static int verbose = LOG_LEVEL; #ifdef BPF_JIT_COMPILER +#include + #include static u_int @@ -73,6 +75,10 @@ bpf_compile_and_filter(void) printf("FATAL\n"); exit(FATAL); } + if (verbose > 2) { + printf("\n"); + hexdump(filter->func, filter->size, NULL, HD_OMIT_CHARS); + } for (i = 0; i < BPF_NRUNS; i++) ret = (*(filter->func))(pkt, wirelen, buflen); @@ -222,6 +228,14 @@ main(void) for (i = 0; i < BPF_NRUNS; i++) ret = bpf_filter(nins != 0 ? pc : NULL, pkt, wirelen, buflen); #endif + if (expect_signal != 0) { + if (verbose > 1) + printf("Expected signal %d but got none:\t", + expect_signal); + if (verbose > 0) + printf("FAILED\n"); + return (FAILED); + } if (ret != expect) { if (verbose > 1) printf("Expected 0x%x but got 0x%x:\t", expect, ret); diff --git a/tools/regression/bpf/bpf_filter/tests/test0075.h b/tools/regression/bpf/bpf_filter/tests/test0075.h index 0d94c7af72a7..fa85dd0351a6 100644 --- a/tools/regression/bpf/bpf_filter/tests/test0075.h +++ b/tools/regression/bpf/bpf_filter/tests/test0075.h @@ -7,7 +7,7 @@ /* BPF program */ struct bpf_insn pc[] = { BPF_STMT(BPF_LD+BPF_IMM, 0xdeadc0de), - BPF_STMT(BPF_LD+BPF_MEM, 0xffffffff), + BPF_STMT(BPF_LD+BPF_MEM, 0x8fffffff), BPF_STMT(BPF_RET+BPF_A, 0), }; @@ -29,8 +29,8 @@ int invalid = 1; u_int expect = 0xdeadc0de; /* Expected signal */ -#ifdef BPF_JIT_COMPILER -int expect_signal = SIGSEGV; -#else +#ifdef __amd64__ int expect_signal = SIGBUS; +#else +int expect_signal = SIGSEGV; #endif diff --git a/tools/regression/bpf/bpf_filter/tests/test0076.h b/tools/regression/bpf/bpf_filter/tests/test0076.h index 6513459e3d08..318cbea0cc15 100644 --- a/tools/regression/bpf/bpf_filter/tests/test0076.h +++ b/tools/regression/bpf/bpf_filter/tests/test0076.h @@ -7,7 +7,7 @@ /* BPF program */ struct bpf_insn pc[] = { BPF_STMT(BPF_LD+BPF_IMM, 0xdeadc0de), - BPF_STMT(BPF_LDX+BPF_MEM, 0xffffffff), + BPF_STMT(BPF_LDX+BPF_MEM, 0x8fffffff), BPF_STMT(BPF_MISC+BPF_TXA, 0), BPF_STMT(BPF_RET+BPF_A, 0), }; @@ -30,8 +30,8 @@ int invalid = 1; u_int expect = 0xdeadc0de; /* Expected signal */ -#ifdef BPF_JIT_COMPILER -int expect_signal = SIGSEGV; -#else +#ifdef __amd64__ int expect_signal = SIGBUS; +#else +int expect_signal = SIGSEGV; #endif diff --git a/tools/regression/bpf/bpf_filter/tests/test0077.h b/tools/regression/bpf/bpf_filter/tests/test0077.h index 6ac1e51083eb..2af70cc9d4a5 100644 --- a/tools/regression/bpf/bpf_filter/tests/test0077.h +++ b/tools/regression/bpf/bpf_filter/tests/test0077.h @@ -7,7 +7,7 @@ /* BPF program */ struct bpf_insn pc[] = { BPF_STMT(BPF_LD+BPF_IMM, 0xdeadc0de), - BPF_STMT(BPF_ST, 0xffffffff), + BPF_STMT(BPF_ST, 0x8fffffff), BPF_STMT(BPF_RET+BPF_A, 0), }; @@ -29,8 +29,8 @@ int invalid = 1; u_int expect = 0xdeadc0de; /* Expected signal */ -#ifdef BPF_JIT_COMPILER -int expect_signal = SIGSEGV; -#else +#ifdef __amd64__ int expect_signal = SIGBUS; +#else +int expect_signal = SIGSEGV; #endif diff --git a/tools/regression/bpf/bpf_filter/tests/test0078.h b/tools/regression/bpf/bpf_filter/tests/test0078.h index 8803073084a5..3146de20acc3 100644 --- a/tools/regression/bpf/bpf_filter/tests/test0078.h +++ b/tools/regression/bpf/bpf_filter/tests/test0078.h @@ -7,7 +7,7 @@ /* BPF program */ struct bpf_insn pc[] = { BPF_STMT(BPF_LD+BPF_IMM, 0xdeadc0de), - BPF_STMT(BPF_STX, 0xffffffff), + BPF_STMT(BPF_STX, 0x8fffffff), BPF_STMT(BPF_MISC+BPF_TXA, 0), BPF_STMT(BPF_RET+BPF_A, 0), }; @@ -30,8 +30,8 @@ int invalid = 1; u_int expect = 0xdeadc0de; /* Expected signal */ -#ifdef BPF_JIT_COMPILER -int expect_signal = SIGSEGV; -#else +#ifdef __amd64__ int expect_signal = SIGBUS; +#else +int expect_signal = SIGSEGV; #endif diff --git a/tools/regression/bpf/bpf_filter/tests/test0080.h b/tools/regression/bpf/bpf_filter/tests/test0080.h index 69bed7322374..65ae6c52dfe7 100644 --- a/tools/regression/bpf/bpf_filter/tests/test0080.h +++ b/tools/regression/bpf/bpf_filter/tests/test0080.h @@ -1,12 +1,12 @@ /*- - * Test 0080: Check uninitialized scratch memory (only for JIT compiler). + * Test 0080: Check uninitialized scratch memory (obsolete). * * $FreeBSD$ */ /* BPF program */ struct bpf_insn pc[] = { -#ifdef BPF_JIT_COMPILER +#ifdef BPF_JIT_COMPILER_OBSOLETE BPF_STMT(BPF_LDX+BPF_IMM, 0xffffffff), BPF_STMT(BPF_LD+BPF_MEM, 0), BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 29, 0), diff --git a/tools/regression/bpf/bpf_filter/tests/test0084.h b/tools/regression/bpf/bpf_filter/tests/test0084.h new file mode 100644 index 000000000000..043a68e47b0e --- /dev/null +++ b/tools/regression/bpf/bpf_filter/tests/test0084.h @@ -0,0 +1,1030 @@ +/*- + * Test 0084: Check very long BPF program. + * + * $FreeBSD$ + */ + +/* BPF program */ +struct bpf_insn pc[] = { + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 0), + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 1), + BPF_STMT(BPF_RET+BPF_A, 0), +}; + +/* Packet */ +u_char pkt[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, +}; + +/* Packet length seen on wire */ +u_int wirelen = sizeof(pkt); + +/* Packet length passed on buffer */ +u_int buflen = sizeof(pkt); + +/* Invalid instruction */ +int invalid = 0; + +/* Expected return value */ +u_int expect = 0x23456789; + +/* Expected signal */ +int expect_signal = 0; diff --git a/tools/regression/environ/Makefile.envctl b/tools/regression/environ/Makefile.envctl index 6298a20646dd..fc90499b5342 100644 --- a/tools/regression/environ/Makefile.envctl +++ b/tools/regression/environ/Makefile.envctl @@ -13,4 +13,4 @@ NO_MAN= yes .include test: ${PROG} - @sh envtest.t + @env -i sh envtest.t diff --git a/tools/regression/environ/envctl.c b/tools/regression/environ/envctl.c index 7858211151dd..586314bc0855 100644 --- a/tools/regression/environ/envctl.c +++ b/tools/regression/environ/envctl.c @@ -60,7 +60,7 @@ dump_environ(void) static void usage(const char *program) { - fprintf(stderr, "Usage: %s [-DGUchrt] [-c 1|2|3|4] [-gu name] " + fprintf(stderr, "Usage: %s [-DGUchrt] [-c 1|2|3|4] [-bgu name] " "[-p name=value]\n" "\t[(-S|-s name) value overwrite]\n\n" "Options:\n" @@ -68,6 +68,7 @@ usage(const char *program) " -G name\t\t\tgetenv(NULL)\n" " -S value overwrite\t\tsetenv(NULL, value, overwrite)\n" " -U\t\t\t\tunsetenv(NULL)\n" + " -b name\t\t\tblank the 'name=$name' entry, corrupting it\n" " -c 1|2|3|4\t\t\tClear environ variable using method:\n" "\t\t\t\t1 - set environ to NULL pointer\n" "\t\t\t\t2 - set environ[0] to NULL pointer\n" @@ -98,6 +99,28 @@ print_rtrn_errno(int rtrnVal, const char *eol) return; } +static void +blank_env(const char *var) +{ + char **newenviron; + int n, varlen; + + if (environ == NULL) + return; + + for (n = 0; environ[n] != NULL; n++) + ; + newenviron = malloc(sizeof(char *) * (n + 1)); + varlen = strlen(var); + for (; n >= 0; n--) { + newenviron[n] = environ[n]; + if (newenviron[n] != NULL && + strncmp(newenviron[n], var, varlen) == 0 && + newenviron[n][varlen] == '=') + newenviron[n] += strlen(newenviron[n]); + } + environ = newenviron; +} int main(int argc, char **argv) @@ -114,8 +137,12 @@ main(int argc, char **argv) } /* The entire program is basically executed from this loop. */ - while ((arg = getopt(argc, argv, "DGS:Uc:g:hp:rs:tu:")) != -1) { + while ((arg = getopt(argc, argv, "DGS:Ub:c:g:hp:rs:tu:")) != -1) { switch (arg) { + case 'b': + blank_env(optarg); + break; + case 'c': switch (atoi(optarg)) { case 1: diff --git a/tools/regression/environ/envtest.t b/tools/regression/environ/envtest.t index 6b5485a3b800..2c540179f68c 100644 --- a/tools/regression/environ/envtest.t +++ b/tools/regression/environ/envtest.t @@ -232,3 +232,18 @@ check_result "${BAR} 0 0 ${BAR} 0 0 ${NULL}" run_test -r -g FOO -u FOO -g FOO -s FOO ${BAR} 1 -g FOO check_result "${BAR} 0 0 ${NULL} 0 0 ${BAR}" + + +# corruption (blanking) of environ members. +export BLANK_ME= +export AFTER_BLANK=blanked +run_test -b BLANK_ME -p MORE=vars -g FOO -g BLANK_ME -g AFTER_BLANK +check_result "0 0 ${FOO} ${NULL} ${AFTER_BLANK}" + +run_test -b BLANK_ME -u FOO -g FOO -g AFTER_BLANK +check_result "0 0 ${NULL} ${AFTER_BLANK}" + +export BLANK_ME2= +export AFTER_BLANKS=blankD +run_test -b BLANK_ME -b AFTER_BLANK -b BLANK_ME2 -g FOO -g AFTER_BLANKS +check_result "${FOO} ${AFTER_BLANKS}" diff --git a/tools/regression/fifo/fifo_misc/fifo_misc.c b/tools/regression/fifo/fifo_misc/fifo_misc.c index b379d18c057f..d0a2cf7f70cf 100644 --- a/tools/regression/fifo/fifo_misc/fifo_misc.c +++ b/tools/regression/fifo/fifo_misc/fifo_misc.c @@ -148,114 +148,6 @@ test_truncate(void) cleanfifo("testfifo", -1, -1); } -struct filter_entry { - int fe_filter; - const char *fe_name; - int fe_error; - const char *fe_errorname; -}; - -static const struct filter_entry good_filter_types[] = { - { EVFILT_READ, "EVFILT_READ", 0, "0" }, - { EVFILT_WRITE, "EVFILT_WRITE", 0, "0" }, -#if WORKING_EVFILT_VNODE_ON_FIFOS - { EVFILT_VNODE, "EVFILT_VNODE", EINVAL, "EINVAL" }, -#endif -}; -static const int good_filter_types_len = sizeof(good_filter_types) / - sizeof(good_filter_types[0]); - -static const struct filter_entry bad_filter_types[] = { - { EVFILT_NETDEV, "EVFILT_NETDEV", EINVAL, "EINVAL" }, -}; -static const int bad_filter_types_len = sizeof(bad_filter_types) / - sizeof(bad_filter_types[0]); - -/* - * kqueue event-related tests are in fifo_io.c; however, that tests only - * valid invocations of kqueue. Check to make sure that some invalid filters - * that are generally allowed on file descriptors are not allowed to be - * registered with kqueue, and that if attempts are made, we get the right - * error. - */ -static void -test_kqueue(void) -{ - int kqueue_fd, reader_fd, writer_fd; - struct kevent kev_set; - struct timespec timeout; - int i, ret; - - makefifo("testfifo", __func__); - - if (openfifo("testfifo", __func__, &reader_fd, &writer_fd) < 0) { - warn("%s: openfifo", __func__); - cleanfifo("testfifo", -1, -1); - exit(-1); - } - - kqueue_fd = kqueue(); - if (kqueue_fd < 0) { - warn("%s: kqueue", __func__); - cleanfifo("testfifo", reader_fd, writer_fd); - exit(-1); - } - - timeout.tv_sec = 0; - timeout.tv_nsec = 0; - - for (i = 0; i < good_filter_types_len; i++) { - bzero(&kev_set, sizeof(kev_set)); - EV_SET(&kev_set, reader_fd, good_filter_types[i].fe_filter, - EV_ADD, 0, 0, 0); - ret = kevent(kqueue_fd, &kev_set, 1, NULL, 0, &timeout); - if (ret < 0) { - warn("%s: kevent: adding good filter %s", __func__, - good_filter_types[i].fe_name); - close(kqueue_fd); - cleanfifo("testfifo", reader_fd, writer_fd); - exit(-1); - } - bzero(&kev_set, sizeof(kev_set)); - EV_SET(&kev_set, reader_fd, good_filter_types[i].fe_filter, - EV_DELETE, 0, 0, 0); - ret = kevent(kqueue_fd, &kev_set, 1, NULL, 0, &timeout); - if (ret < 0) { - warn("%s: kevent: deleting good filter %s", __func__, - good_filter_types[i].fe_name); - close(kqueue_fd); - cleanfifo("testfifo", reader_fd, writer_fd); - exit(-1); - } - } - - for (i = 0; i < bad_filter_types_len; i++) { - bzero(&kev_set, sizeof(kev_set)); - EV_SET(&kev_set, reader_fd, bad_filter_types[i].fe_filter, - EV_ADD, 0, 0, 0); - ret = kevent(kqueue_fd, &kev_set, 1, NULL, 0, &timeout); - if (ret >= 0) { - warnx("%s: kevent: bad filter %s succeeded, expected " - "EINVAL", __func__, bad_filter_types[i].fe_name); - close(kqueue_fd); - cleanfifo("testfifo", reader_fd, writer_fd); - exit(-1); - } - if (errno != bad_filter_types[i].fe_error) { - warn("%s: kevent: bad filter %s failed with error " - "not %s", __func__, - bad_filter_types[i].fe_name, - bad_filter_types[i].fe_errorname); - close(kqueue_fd); - cleanfifo("testfifo", reader_fd, writer_fd); - exit(-1); - } - } - - close(kqueue_fd); - cleanfifo("testfifo", reader_fd, writer_fd); -} - static int test_ioctl_setclearflag(int fd, int flag, const char *testname, const char *fdname, const char *flagname) @@ -345,7 +237,6 @@ main(int argc, char *argv[]) test_lseek(); test_truncate(); - test_kqueue(); test_ioctl(); return (0); diff --git a/tools/regression/file/closefrom/Makefile b/tools/regression/file/closefrom/Makefile index 7ff2df81ee76..4b8829c78484 100644 --- a/tools/regression/file/closefrom/Makefile +++ b/tools/regression/file/closefrom/Makefile @@ -3,7 +3,7 @@ PROG= closefrom MAN= WARNS?= 6 - +DPADD= ${LIBUTIL} LDADD= -lutil .include diff --git a/tools/regression/file/flock/Makefile b/tools/regression/file/flock/Makefile index f3522a54dac2..1c9e6cca4244 100644 --- a/tools/regression/file/flock/Makefile +++ b/tools/regression/file/flock/Makefile @@ -3,7 +3,7 @@ PROG= flock NO_MAN= WARNS?= 6 - -LDADD+= -lpthread +DPADD= ${LIBPTHREAD} +LDADD= -lpthread .include diff --git a/tools/regression/file/newfileops_on_fork/newfileops_on_fork.c b/tools/regression/file/newfileops_on_fork/newfileops_on_fork.c index 42a6af71a7c4..8713a8264f3b 100644 --- a/tools/regression/file/newfileops_on_fork/newfileops_on_fork.c +++ b/tools/regression/file/newfileops_on_fork/newfileops_on_fork.c @@ -113,7 +113,7 @@ main(__unused int argc, __unused char *argv[]) err(-1, "bind"); if (listen(listen_fd, -1) <0) err(-1, "listen"); - if (pthread_create(&accept_thread, NULL, do_accept, NULL) < 0) + if (pthread_create(&accept_thread, NULL, do_accept, NULL) != 0) err(-1, "pthread_create"); sleep(1); /* Easier than using a CV. */; do_fork(); diff --git a/tools/regression/fstest/tests/rename/21.t b/tools/regression/fstest/tests/rename/21.t index 446974536621..2630f628e0e3 100644 --- a/tools/regression/fstest/tests/rename/21.t +++ b/tools/regression/fstest/tests/rename/21.t @@ -6,7 +6,7 @@ desc="write access to subdirectory is required to move it to another directory" dir=`dirname $0` . ${dir}/../misc.sh -echo "1..15" +echo "1..16" n0=`namegen` n1=`namegen` @@ -30,8 +30,9 @@ expect "0|EACCES" -u 65534 -g 65534 rename ${n2}/${n1} ${n2}/${n0} # to move ${n0} from ${n2} to ${n3}. expect "0|EACCES" -u 65534 -g 65534 rename ${n2}/${n0} ${n3}/${n1} -expect 0 rmdir ${n2}/${n0} +expect "0|ENOENT" rmdir ${n2}/${n0} expect ENOENT rmdir ${n2}/${n0} +expect "0|ENOENT" rmdir ${n3}/${n1} expect ENOENT rmdir ${n3}/${n1} # Check that write permission on containing directory (${n2}) is enough diff --git a/tools/regression/gaithrstress/Makefile b/tools/regression/gaithrstress/Makefile index 2506e017a3bd..f3b8b004fd84 100644 --- a/tools/regression/gaithrstress/Makefile +++ b/tools/regression/gaithrstress/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG= gaithrstress -LDADD+= -pthread +DPADD= ${LIBPTHREAD} +LDADD= -lpthread NO_MAN= .include diff --git a/tools/regression/gaithrstress/gaithrstress.c b/tools/regression/gaithrstress/gaithrstress.c index 023e0b57355b..c76f94f353e0 100644 --- a/tools/regression/gaithrstress/gaithrstress.c +++ b/tools/regression/gaithrstress/gaithrstress.c @@ -241,7 +241,7 @@ usage: fflush(stdout); for (i = 0; i < nworkers; i++) { if (pthread_create(&workers[i].w_thread, NULL, work, - &workers[i]) == -1) + &workers[i]) != 0) err(1, "creating worker %u", i); printf("%u%s", i, i == nworkers - 1 ? ".\n" : ", "); fflush(stdout); diff --git a/tools/regression/geom/ConfCmp/ConfCmp.c b/tools/regression/geom/ConfCmp/ConfCmp.c index 8c551cf8e846..599a953b1b89 100644 --- a/tools/regression/geom/ConfCmp/ConfCmp.c +++ b/tools/regression/geom/ConfCmp/ConfCmp.c @@ -74,7 +74,7 @@ struct ref { char *k2; }; -LIST_HEAD(, ref) refs = LIST_HEAD_INITIALIZER(&refs); +LIST_HEAD(, ref) refs = LIST_HEAD_INITIALIZER(refs); static struct node * new_node(void) diff --git a/tools/regression/kgssapi/Makefile b/tools/regression/kgssapi/Makefile index 49059fa9d670..e033e28db481 100644 --- a/tools/regression/kgssapi/Makefile +++ b/tools/regression/kgssapi/Makefile @@ -3,6 +3,7 @@ PROG= gsstest NO_MAN= WARNS?= 2 +DPADD= ${LIBGSSAPI} ${LIBGSSAPI_KRB5} LDADD= -lgssapi -lgssapi_krb5 DEBUG_FLAGS= -g -O0 diff --git a/tools/regression/kqueue/Makefile b/tools/regression/kqueue/Makefile new file mode 100644 index 000000000000..b25a17b87223 --- /dev/null +++ b/tools/regression/kqueue/Makefile @@ -0,0 +1,21 @@ +# $FreeBSD$ +# +# svn://mark.heily.com/libkqueue/trunk/test +# Last update: r114 +# +# libkqueue and test suite by Mark Heily +# + +PROG=kqtest +SRCS= \ + main.c \ + read.c \ + timer.c \ + vnode.c \ + proc.c \ + signal.c \ + user.c +NO_MAN= +WARNS=2 + +.include "bsd.prog.mk" diff --git a/tools/regression/kqueue/common.h b/tools/regression/kqueue/common.h new file mode 100644 index 000000000000..aada7786ad0c --- /dev/null +++ b/tools/regression/kqueue/common.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#ifndef _COMMON_H +#define _COMMON_H + + +#if HAVE_ERR_H +# include +#else +# define err(rc,msg,...) do { perror(msg); exit(rc); } while (0) +# define errx(rc,msg,...) do { puts(msg); exit(rc); } while (0) +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "config.h" + +extern char *cur_test_id; +int vnode_fd; + +extern const char * kevent_to_str(struct kevent *); +struct kevent * kevent_get(int); + + +void kevent_cmp(struct kevent *, struct kevent *); + +void +kevent_add(int kqfd, struct kevent *kev, + uintptr_t ident, + short filter, + u_short flags, + u_int fflags, + intptr_t data, + void *udata); + +/* DEPRECATED: */ +#define KEV_CMP(kev,_ident,_filter,_flags) do { \ + if (kev.ident != (_ident) || \ + kev.filter != (_filter) || \ + kev.flags != (_flags)) \ + err(1, "kevent mismatch: got [%d,%d,%d] but expecting [%d,%d,%d]", \ + (int)_ident, (int)_filter, (int)_flags,\ + (int)kev.ident, kev.filter, kev.flags);\ +} while (0); + +/* Checks if any events are pending, which is an error. */ +extern void test_no_kevents(void); + +extern void test_begin(const char *); +extern void success(void); + +#endif /* _COMMON_H */ diff --git a/tools/regression/kqueue/config.h b/tools/regression/kqueue/config.h new file mode 100644 index 000000000000..2a377db5887a --- /dev/null +++ b/tools/regression/kqueue/config.h @@ -0,0 +1,13 @@ +/* AUTOMATICALLY GENERATED -- DO NOT EDIT */ +/* $FreeBSD$ */ +#define HAVE_ERR_H +#define HAVE_SYS_EVENT_H +#define HAVE_EV_DISPATCH 1 +#define HAVE_EV_RECEIPT 1 +#undef HAVE_NOTE_TRUNCATE +#define HAVE_EVFILT_TIMER 1 +#define HAVE_EVFILT_USER 1 +#define PROGRAM "libkqueue-test" +#define VERSION "0.1" +#define TARGET "freebsd" +#define CFLAGS "-g -O0 -Wall -Werror" diff --git a/tools/regression/kqueue/main.c b/tools/regression/kqueue/main.c new file mode 100644 index 000000000000..182003c32aa5 --- /dev/null +++ b/tools/regression/kqueue/main.c @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include + +#include "common.h" + +int testnum = 1; +char *cur_test_id = NULL; +int kqfd; + +extern void test_evfilt_read(); +extern void test_evfilt_signal(); +extern void test_evfilt_vnode(); +extern void test_evfilt_timer(); +extern void test_evfilt_proc(); +#if HAVE_EVFILT_USER +extern void test_evfilt_user(); +#endif + +/* Checks if any events are pending, which is an error. */ +void +test_no_kevents(void) +{ + int nfds; + struct timespec timeo; + struct kevent kev; + + puts("confirming that there are no events pending"); + memset(&timeo, 0, sizeof(timeo)); + nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo); + if (nfds != 0) { + puts("\nUnexpected event:"); + puts(kevent_to_str(&kev)); + errx(1, "%d event(s) pending, but none expected:", nfds); + } +} + +/* Retrieve a single kevent */ +struct kevent * +kevent_get(int kqfd) +{ + int nfds; + struct kevent *kev; + + if ((kev = calloc(1, sizeof(*kev))) == NULL) + err(1, "out of memory"); + + nfds = kevent(kqfd, NULL, 0, kev, 1, NULL); + if (nfds < 1) + err(1, "kevent(2)"); + + return (kev); +} + +char * +kevent_fflags_dump(struct kevent *kev) +{ + char *buf; + +#define KEVFFL_DUMP(attrib) \ + if (kev->fflags & attrib) \ + strncat(buf, #attrib" ", 64); + + if ((buf = calloc(1, 1024)) == NULL) + abort(); + + /* Not every filter has meaningful fflags */ + if (kev->filter != EVFILT_VNODE) { + snprintf(buf, 1024, "fflags = %d", kev->fflags); + return (buf); + } + + snprintf(buf, 1024, "fflags = %d (", kev->fflags); + KEVFFL_DUMP(NOTE_DELETE); + KEVFFL_DUMP(NOTE_WRITE); + KEVFFL_DUMP(NOTE_EXTEND); +#if HAVE_NOTE_TRUNCATE + KEVFFL_DUMP(NOTE_TRUNCATE); +#endif + KEVFFL_DUMP(NOTE_ATTRIB); + KEVFFL_DUMP(NOTE_LINK); + KEVFFL_DUMP(NOTE_RENAME); +#if HAVE_NOTE_REVOKE + KEVFFL_DUMP(NOTE_REVOKE); +#endif + buf[strlen(buf) - 1] = ')'; + + return (buf); +} + +char * +kevent_flags_dump(struct kevent *kev) +{ + char *buf; + +#define KEVFL_DUMP(attrib) \ + if (kev->flags & attrib) \ + strncat(buf, #attrib" ", 64); + + if ((buf = calloc(1, 1024)) == NULL) + abort(); + + snprintf(buf, 1024, "flags = %d (", kev->flags); + KEVFL_DUMP(EV_ADD); + KEVFL_DUMP(EV_ENABLE); + KEVFL_DUMP(EV_DISABLE); + KEVFL_DUMP(EV_DELETE); + KEVFL_DUMP(EV_ONESHOT); + KEVFL_DUMP(EV_CLEAR); + KEVFL_DUMP(EV_EOF); + KEVFL_DUMP(EV_ERROR); +#if HAVE_EV_DISPATCH + KEVFL_DUMP(EV_DISPATCH); +#endif +#if HAVE_EV_RECEIPT + KEVFL_DUMP(EV_RECEIPT); +#endif + buf[strlen(buf) - 1] = ')'; + + return (buf); +} + +/* Copied from ../kevent.c kevent_dump() and improved */ +const char * +kevent_to_str(struct kevent *kev) +{ + char buf[512]; + + snprintf(&buf[0], sizeof(buf), + "[ident=%d, filter=%d, %s, %s, data=%d, udata=%p]", + (u_int) kev->ident, + kev->filter, + kevent_flags_dump(kev), + kevent_fflags_dump(kev), + (int) kev->data, + kev->udata); + + return (strdup(buf)); +} + +void +kevent_add(int kqfd, struct kevent *kev, + uintptr_t ident, + short filter, + u_short flags, + u_int fflags, + intptr_t data, + void *udata) +{ + EV_SET(kev, ident, filter, flags, fflags, data, NULL); + if (kevent(kqfd, kev, 1, NULL, 0, NULL) < 0) { + printf("Unable to add the following kevent:\n%s\n", + kevent_to_str(kev)); + err(1, "kevent(): %s", strerror(errno)); + } +} + +void +kevent_cmp(struct kevent *k1, struct kevent *k2) +{ +/* XXX- + Workaround for inconsistent implementation of kevent(2) + */ +#ifdef __FreeBSD__ + if (k1->flags & EV_ADD) + k2->flags |= EV_ADD; +#endif + if (memcmp(k1, k2, sizeof(*k1)) != 0) { + printf("kevent_cmp: mismatch:\n %s !=\n %s\n", + kevent_to_str(k1), kevent_to_str(k2)); + abort(); + } +} + +void +test_begin(const char *func) +{ + if (cur_test_id) + free(cur_test_id); + cur_test_id = strdup(func); + if (!cur_test_id) + err(1, "strdup failed"); + + printf("\n\nTest %d: %s\n", testnum++, func); +} + +void +success(void) +{ + printf("%-70s %s\n", cur_test_id, "passed"); + free(cur_test_id); + cur_test_id = NULL; +} + +void +test_kqueue(void) +{ + test_begin("kqueue()"); + if ((kqfd = kqueue()) < 0) + err(1, "kqueue()"); + test_no_kevents(); + success(); +} + +void +test_kqueue_close(void) +{ + test_begin("close(kq)"); + if (close(kqfd) < 0) + err(1, "close()"); + success(); +} + +int +main(int argc, char **argv) +{ + int test_proc = 0; /* XXX-FIXME */ + int test_socket = 1; + int test_signal = 1; + int test_vnode = 1; + int test_timer = 1; +#ifdef __FreeBSD__ + int test_user = 1; +#else + /* XXX-FIXME temporary */ + int test_user = 0; +#endif + + while (argc) { + if (strcmp(argv[0], "--no-proc") == 0) + test_proc = 0; + if (strcmp(argv[0], "--no-socket") == 0) + test_socket = 0; + if (strcmp(argv[0], "--no-timer") == 0) + test_timer = 0; + if (strcmp(argv[0], "--no-signal") == 0) + test_signal = 0; + if (strcmp(argv[0], "--no-vnode") == 0) + test_vnode = 0; + if (strcmp(argv[0], "--no-user") == 0) + test_user = 0; + argv++; + argc--; + } + + test_kqueue(); + test_kqueue_close(); + + if (test_socket) + test_evfilt_read(); + if (test_signal) + test_evfilt_signal(); + if (test_vnode) + test_evfilt_vnode(); +#if HAVE_EVFILT_USER + if (test_user) + test_evfilt_user(); +#endif + if (test_timer) + test_evfilt_timer(); + if (test_proc) + test_evfilt_proc(); + + printf("\n---\n" + "+OK All %d tests completed.\n", testnum - 1); + return (0); +} diff --git a/tools/regression/kqueue/proc.c b/tools/regression/kqueue/proc.c new file mode 100644 index 000000000000..d4e863eefe02 --- /dev/null +++ b/tools/regression/kqueue/proc.c @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "common.h" + +static int sigusr1_caught = 0; + +int kqfd; + +static void +sig_handler(int signum) +{ + sigusr1_caught = 1; +} + +static void +add_and_delete(void) +{ + struct kevent kev; + pid_t pid; + + /* Create a child that waits to be killed and then exits */ + pid = fork(); + if (pid == 0) { + pause(); + exit(2); + } + printf(" -- child created (pid %d)\n", (int) pid); + + test_begin("kevent(EVFILT_PROC, EV_ADD)"); + + test_no_kevents(); + kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_ADD, 0, 0, NULL); + test_no_kevents(); + + success(); + + test_begin("kevent(EVFILT_PROC, EV_DELETE)"); + + test_no_kevents(); + kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_DELETE, 0, 0, NULL); + if (kill(pid, SIGKILL) < 0) + err(1, "kill"); + sleep(1); + test_no_kevents(); + + success(); + +} + +static void +event_trigger(void) +{ + struct kevent kev; + pid_t pid; + + test_begin("kevent(EVFILT_PROC, wait)"); + + /* Create a child that waits to be killed and then exits */ + pid = fork(); + if (pid == 0) { + pause(); + printf(" -- child caught signal, exiting\n"); + exit(2); + } + printf(" -- child created (pid %d)\n", (int) pid); + + test_no_kevents(); + kevent_add(kqfd, &kev, pid, EVFILT_PROC, EV_ADD, 0, 0, NULL); + + /* Cause the child to exit, then retrieve the event */ + printf(" -- killing process %d\n", (int) pid); + if (kill(pid, SIGUSR1) < 0) + err(1, "kill"); + kevent_cmp(&kev, kevent_get(kqfd)); + test_no_kevents(); + + success(); +} + +#ifdef TODO +void +test_kevent_signal_disable(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_DISABLE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DISABLE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGKILL) < 0) + err(1, "kill"); + + test_no_kevents(); + + success(); +} + +void +test_kevent_signal_enable(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_ENABLE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ENABLE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + kev.flags = EV_ADD | EV_CLEAR; +#if LIBKQUEUE + kev.data = 1; /* WORKAROUND */ +#else + kev.data = 2; // one extra time from test_kevent_signal_disable() +#endif + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Delete the watch */ + kev.flags = EV_DELETE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_signal_del(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_DELETE)"; + struct kevent kev; + + test_begin(test_id); + + /* Delete the kevent */ + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DELETE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + test_no_kevents(); + success(); +} + +void +test_kevent_signal_oneshot(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_ONESHOT)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD | EV_ONESHOT, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + kev.flags |= EV_CLEAR; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Send another one and make sure we get no events */ + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + test_no_kevents(); + + success(); +} +#endif + +void +test_evfilt_proc() +{ + kqfd = kqueue(); + + signal(SIGUSR1, sig_handler); + + add_and_delete(); + event_trigger(); + + signal(SIGUSR1, SIG_DFL); + +#if TODO + test_kevent_signal_add(); + test_kevent_signal_del(); + test_kevent_signal_get(); + test_kevent_signal_disable(); + test_kevent_signal_enable(); + test_kevent_signal_oneshot(); +#endif + close(kqfd); +} diff --git a/tools/regression/kqueue/read.c b/tools/regression/kqueue/read.c new file mode 100644 index 000000000000..cc6542719fba --- /dev/null +++ b/tools/regression/kqueue/read.c @@ -0,0 +1,324 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "common.h" + +int kqfd; +int sockfd[2]; + +static void +kevent_socket_drain(void) +{ + char buf[1]; + + /* Drain the read buffer, then make sure there are no more events. */ + puts("draining the read buffer"); + if (read(sockfd[0], &buf[0], 1) < 1) + err(1, "read(2)"); +} + +static void +kevent_socket_fill(void) +{ + puts("filling the read buffer"); + if (write(sockfd[1], ".", 1) < 1) + err(1, "write(2)"); +} + + +void +test_kevent_socket_add(void) +{ + const char *test_id = "kevent(EVFILT_READ, EV_ADD)"; + struct kevent kev; + + test_begin(test_id); + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_socket_get(void) +{ + const char *test_id = "kevent(EVFILT_READ) wait"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kevent_socket_fill(); + + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + kevent_socket_drain(); + test_no_kevents(); + + kev.flags = EV_DELETE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_socket_clear(void) +{ + const char *test_id = "kevent(EVFILT_READ, EV_CLEAR)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kevent_socket_fill(); + kevent_socket_fill(); + + kev.data = 2; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* We filled twice, but drain once. Edge-triggered would not generate + additional events. + */ + kevent_socket_drain(); + test_no_kevents(); + + kevent_socket_drain(); + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_DELETE, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_socket_disable_and_enable(void) +{ + const char *test_id = "kevent(EVFILT_READ, EV_DISABLE)"; + struct kevent kev; + + test_begin(test_id); + + /* Add an event, then disable it. */ + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_DISABLE, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kevent_socket_fill(); + test_no_kevents(); + + /* Re-enable the knote, then see if an event is generated */ + kev.flags = EV_ENABLE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + kev.flags = EV_ADD; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + kevent_socket_drain(); + + kev.flags = EV_DELETE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_socket_del(void) +{ + const char *test_id = "kevent(EVFILT_READ, EV_DELETE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_DELETE, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kevent_socket_fill(); + test_no_kevents(); + kevent_socket_drain(); + + success(); +} + +void +test_kevent_socket_oneshot(void) +{ + const char *test_id = "kevent(EVFILT_READ, EV_ONESHOT)"; + struct kevent kev; + + test_begin(test_id); + + /* Re-add the watch and make sure no events are pending */ + puts("-- re-adding knote"); + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + test_no_kevents(); + + puts("-- getting one event"); + kevent_socket_fill(); + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + puts("-- checking knote disabled"); + test_no_kevents(); + + /* Try to delete the knote, it should already be deleted */ + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_DELETE, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) == 0) + err(1, "%s", test_id); + + kevent_socket_drain(); + + success(); +} + + +#if HAVE_EV_DISPATCH +void +test_kevent_socket_dispatch(void) +{ + const char *test_id = "kevent(EVFILT_READ, EV_DISPATCH)"; + + test_begin(test_id); + + struct kevent kev; + + /* Re-add the watch and make sure no events are pending */ + puts("-- re-adding knote"); + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD | EV_DISPATCH, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + test_no_kevents(); + + /* The event will occur only once, even though EV_CLEAR is not + specified. */ + kevent_socket_fill(); + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + test_no_kevents(); + + /* Since the knote is disabled, the EV_DELETE operation succeeds. */ + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_DELETE, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kevent_socket_drain(); + + success(); +} +#endif /* HAVE_EV_DISPATCH */ + +#if BROKEN +void +test_kevent_socket_lowat(void) +{ + const char *test_id = "kevent(EVFILT_READ, NOTE_LOWAT)"; + struct kevent kev; + + test_begin(test_id); + + /* Re-add the watch and make sure no events are pending */ + puts("-- re-adding knote, setting low watermark to 2 bytes"); + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD | EV_ONESHOT, NOTE_LOWAT, 2, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + test_no_kevents(); + + puts("-- checking that one byte does not trigger an event.."); + kevent_socket_fill(); + test_no_kevents(); + + puts("-- checking that two bytes triggers an event.."); + kevent_socket_fill(); + if (kevent(kqfd, NULL, 0, &kev, 1, NULL) != 1) + err(1, "%s", test_id); + KEV_CMP(kev, sockfd[0], EVFILT_READ, 0); + test_no_kevents(); + + kevent_socket_drain(); + kevent_socket_drain(); + + success(); +} +#endif + +void +test_kevent_socket_eof(void) +{ + const char *test_id = "kevent(EVFILT_READ, EV_EOF)"; + struct kevent kev; + + test_begin(test_id); + + /* Re-add the watch and make sure no events are pending */ + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_ADD, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + test_no_kevents(); + + if (close(sockfd[1]) < 0) + err(1, "close(2)"); + + kev.flags |= EV_EOF; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Delete the watch */ + EV_SET(&kev, sockfd[0], EVFILT_READ, EV_DELETE, 0, 0, &sockfd[0]); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_evfilt_read() +{ + /* Create a connected pair of full-duplex sockets for testing socket events */ + if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd) < 0) + abort(); + + kqfd = kqueue(); + test_kevent_socket_add(); + test_kevent_socket_del(); + test_kevent_socket_get(); + test_kevent_socket_disable_and_enable(); + test_kevent_socket_oneshot(); + test_kevent_socket_clear(); +#if HAVE_EV_DISPATCH + test_kevent_socket_dispatch(); +#endif + test_kevent_socket_eof(); + close(kqfd); +} diff --git a/tools/regression/kqueue/signal.c b/tools/regression/kqueue/signal.c new file mode 100644 index 000000000000..14e751db95c2 --- /dev/null +++ b/tools/regression/kqueue/signal.c @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "common.h" + +int kqfd; + +void +test_kevent_signal_add(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_ADD)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_signal_get(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, wait)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + kev.flags |= EV_CLEAR; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + success(); +} + +void +test_kevent_signal_disable(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_DISABLE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DISABLE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + test_no_kevents(); + + success(); +} + +void +test_kevent_signal_enable(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_ENABLE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ENABLE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + kev.flags = EV_ADD | EV_CLEAR; +#if LIBKQUEUE + kev.data = 1; /* WORKAROUND */ +#else + kev.data = 2; // one extra time from test_kevent_signal_disable() +#endif + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Delete the watch */ + kev.flags = EV_DELETE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_signal_del(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_DELETE)"; + struct kevent kev; + + test_begin(test_id); + + /* Delete the kevent */ + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_DELETE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + test_no_kevents(); + success(); +} + +void +test_kevent_signal_oneshot(void) +{ + const char *test_id = "kevent(EVFILT_SIGNAL, EV_ONESHOT)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, SIGUSR1, EVFILT_SIGNAL, EV_ADD | EV_ONESHOT, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Block SIGUSR1, then send it to ourselves */ + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) + err(1, "sigprocmask"); + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + + kev.flags |= EV_CLEAR; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Send another one and make sure we get no events */ + if (kill(getpid(), SIGUSR1) < 0) + err(1, "kill"); + test_no_kevents(); + + success(); +} + +void +test_evfilt_signal() +{ + kqfd = kqueue(); + test_kevent_signal_add(); + test_kevent_signal_del(); + test_kevent_signal_get(); + test_kevent_signal_disable(); + test_kevent_signal_enable(); + test_kevent_signal_oneshot(); + close(kqfd); +} diff --git a/tools/regression/kqueue/timer.c b/tools/regression/kqueue/timer.c new file mode 100644 index 000000000000..766125d857e8 --- /dev/null +++ b/tools/regression/kqueue/timer.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "common.h" + +int kqfd; + +void +test_kevent_timer_add(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, EV_ADD)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_timer_del(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, EV_DELETE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + test_no_kevents(); + + success(); +} + +void +test_kevent_timer_get(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, wait)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, 1, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kev.flags |= EV_CLEAR; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + EV_SET(&kev, 1, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +static void +test_oneshot(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, EV_ONESHOT)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500,NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Retrieve the event */ + kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Check if the event occurs again */ + sleep(3); + test_no_kevents(); + + + success(); +} + +static void +test_periodic(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, periodic)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 1000,NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Retrieve the event */ + kev.flags = EV_ADD | EV_CLEAR; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Check if the event occurs again */ + sleep(1); + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Delete the event */ + kev.flags = EV_DELETE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +static void +disable_and_enable(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, EV_DISABLE and EV_ENABLE)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + /* Add the watch and immediately disable it */ + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 2000,NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + kev.flags = EV_DISABLE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + test_no_kevents(); + + /* Re-enable and check again */ + kev.flags = EV_ENABLE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + success(); +} + +void +test_evfilt_timer() +{ + kqfd = kqueue(); + test_kevent_timer_add(); + test_kevent_timer_del(); + test_kevent_timer_get(); + test_oneshot(); + test_periodic(); + disable_and_enable(); + close(kqfd); +} diff --git a/tools/regression/kqueue/user.c b/tools/regression/kqueue/user.c new file mode 100644 index 000000000000..9ba25f9df4d3 --- /dev/null +++ b/tools/regression/kqueue/user.c @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "common.h" + +int kqfd; + +static void +add_and_delete(void) +{ + const char *test_id = "kevent(EVFILT_USER, EV_ADD and EV_DELETE)"; + struct kevent kev; + + test_begin(test_id); + + kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL); + test_no_kevents(); + + kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DELETE, 0, 0, NULL); + test_no_kevents(); + + success(); +} + +static void +event_wait(void) +{ + const char *test_id = "kevent(EVFILT_USER, wait)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + /* Add the event, and then trigger it */ + kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, NULL); + kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL); + + kev.fflags &= ~NOTE_FFCTRLMASK; + kev.fflags &= ~NOTE_TRIGGER; + kev.flags = EV_CLEAR; + kevent_cmp(&kev, kevent_get(kqfd)); + + test_no_kevents(); + + success(); +} + +static void +disable_and_enable(void) +{ + const char *test_id = "kevent(EVFILT_USER, EV_DISABLE and EV_ENABLE)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ADD, 0, 0, NULL); + kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_DISABLE, 0, 0, NULL); + + /* Trigger the event, but since it is disabled, nothing will happen. */ + kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL); + test_no_kevents(); + + kevent_add(kqfd, &kev, 1, EVFILT_USER, EV_ENABLE, 0, 0, NULL); + kevent_add(kqfd, &kev, 1, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL); + + kev.flags = EV_CLEAR; + kev.fflags &= ~NOTE_FFCTRLMASK; + kev.fflags &= ~NOTE_TRIGGER; + kevent_cmp(&kev, kevent_get(kqfd)); + + success(); +} + +static void +oneshot(void) +{ + const char *test_id = "kevent(EVFILT_USER, EV_ONESHOT)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + kevent_add(kqfd, &kev, 2, EVFILT_USER, EV_ADD | EV_ONESHOT, 0, 0, NULL); + + puts(" -- event 1"); + kevent_add(kqfd, &kev, 2, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL); + + kev.flags = EV_ONESHOT; + kev.fflags &= ~NOTE_FFCTRLMASK; + kev.fflags &= ~NOTE_TRIGGER; + kevent_cmp(&kev, kevent_get(kqfd)); + + test_no_kevents(); + + success(); +} + +void +test_evfilt_user() +{ + kqfd = kqueue(); + + add_and_delete(); + event_wait(); + disable_and_enable(); + oneshot(); + /* TODO: try different fflags operations */ + + close(kqfd); +} diff --git a/tools/regression/kqueue/vnode.c b/tools/regression/kqueue/vnode.c new file mode 100644 index 000000000000..dfa0b5e176f8 --- /dev/null +++ b/tools/regression/kqueue/vnode.c @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $FreeBSD$ + */ + +#include "common.h" + +int kqfd; +int vnode_fd; + +void +test_kevent_vnode_add(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, EV_ADD)"; + const char *testfile = "/tmp/kqueue-test.tmp"; + struct kevent kev; + + test_begin(test_id); + + system("touch /tmp/kqueue-test.tmp"); + vnode_fd = open(testfile, O_RDONLY); + if (vnode_fd < 0) + err(1, "open of %s", testfile); + else + printf("vnode_fd = %d\n", vnode_fd); + + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_ADD, + NOTE_WRITE | NOTE_ATTRIB | NOTE_RENAME | NOTE_DELETE, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_vnode_note_delete(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, NOTE_DELETE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_DELETE, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + if (unlink("/tmp/kqueue-test.tmp") < 0) + err(1, "unlink"); + + kevent_cmp(&kev, kevent_get(kqfd)); + + success(); +} + +void +test_kevent_vnode_note_write(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, NOTE_WRITE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_WRITE, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + if (system("echo hello >> /tmp/kqueue-test.tmp") < 0) + err(1, "system"); + + /* BSD kqueue adds NOTE_EXTEND even though it was not requested */ + /* BSD kqueue removes EV_ENABLE */ + kev.flags &= ~EV_ENABLE; // XXX-FIXME compatibility issue + kev.fflags |= NOTE_EXTEND; // XXX-FIXME compatibility issue + kevent_cmp(&kev, kevent_get(kqfd)); + + success(); +} + +void +test_kevent_vnode_note_attrib(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, NOTE_ATTRIB)"; + struct kevent kev; + int nfds; + + test_begin(test_id); + + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_ATTRIB, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + if (system("touch /tmp/kqueue-test.tmp") < 0) + err(1, "system"); + + nfds = kevent(kqfd, NULL, 0, &kev, 1, NULL); + if (nfds < 1) + err(1, "%s", test_id); + if (kev.ident != vnode_fd || + kev.filter != EVFILT_VNODE || + kev.fflags != NOTE_ATTRIB) + err(1, "%s - incorrect event (sig=%u; filt=%d; flags=%d)", + test_id, (unsigned int)kev.ident, kev.filter, kev.flags); + + success(); +} + +void +test_kevent_vnode_note_rename(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, NOTE_RENAME)"; + struct kevent kev; + int nfds; + + test_begin(test_id); + + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_RENAME, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + if (system("mv /tmp/kqueue-test.tmp /tmp/kqueue-test2.tmp") < 0) + err(1, "system"); + + nfds = kevent(kqfd, NULL, 0, &kev, 1, NULL); + if (nfds < 1) + err(1, "%s", test_id); + if (kev.ident != vnode_fd || + kev.filter != EVFILT_VNODE || + kev.fflags != NOTE_RENAME) + err(1, "%s - incorrect event (sig=%u; filt=%d; flags=%d)", + test_id, (unsigned int)kev.ident, kev.filter, kev.flags); + + if (system("mv /tmp/kqueue-test2.tmp /tmp/kqueue-test.tmp") < 0) + err(1, "system"); + + success(); +} + +void +test_kevent_vnode_del(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, EV_DELETE)"; + struct kevent kev; + + test_begin(test_id); + + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_DELETE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +void +test_kevent_vnode_disable_and_enable(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, EV_DISABLE and EV_ENABLE)"; + struct kevent kev; + int nfds; + + test_begin(test_id); + + test_no_kevents(); + + /* Add the watch and immediately disable it */ + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_ATTRIB, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + kev.flags = EV_DISABLE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Confirm that the watch is disabled */ + if (system("touch /tmp/kqueue-test.tmp") < 0) + err(1, "system"); + test_no_kevents(); + + /* Re-enable and check again */ + kev.flags = EV_ENABLE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + if (system("touch /tmp/kqueue-test.tmp") < 0) + err(1, "system"); + nfds = kevent(kqfd, NULL, 0, &kev, 1, NULL); + if (nfds < 1) + err(1, "%s", test_id); + if (kev.ident != vnode_fd || + kev.filter != EVFILT_VNODE || + kev.fflags != NOTE_ATTRIB) + err(1, "%s - incorrect event (sig=%u; filt=%d; flags=%d)", + test_id, (unsigned int)kev.ident, kev.filter, kev.flags); + + success(); +} + +#if HAVE_EV_DISPATCH +void +test_kevent_vnode_dispatch(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, EV_DISPATCH)"; + struct kevent kev; + int nfds; + + test_begin(test_id); + + test_no_kevents(); + + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_ADD | EV_DISPATCH, NOTE_ATTRIB, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + if (system("touch /tmp/kqueue-test.tmp") < 0) + err(1, "system"); + + nfds = kevent(kqfd, NULL, 0, &kev, 1, NULL); + if (nfds < 1) + err(1, "%s", test_id); + if (kev.ident != vnode_fd || + kev.filter != EVFILT_VNODE || + kev.fflags != NOTE_ATTRIB) + err(1, "%s - incorrect event (sig=%u; filt=%d; flags=%d)", + test_id, (unsigned int)kev.ident, kev.filter, kev.flags); + + /* Confirm that the watch is disabled automatically */ + puts("-- checking that watch is disabled"); + if (system("touch /tmp/kqueue-test.tmp") < 0) + err(1, "system"); + test_no_kevents(); + + /* Delete the watch */ + EV_SET(&kev, vnode_fd, EVFILT_VNODE, EV_DELETE, NOTE_ATTRIB, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "remove watch failed: %s", test_id); + + success(); +} +#endif /* HAVE_EV_DISPATCH */ + +void +test_evfilt_vnode() +{ + kqfd = kqueue(); + test_kevent_vnode_add(); + test_kevent_vnode_del(); + test_kevent_vnode_disable_and_enable(); +#if HAVE_EV_DISPATCH + test_kevent_vnode_dispatch(); +#endif + test_kevent_vnode_note_write(); + test_kevent_vnode_note_attrib(); + test_kevent_vnode_note_rename(); + test_kevent_vnode_note_delete(); + close(kqfd); +} diff --git a/tools/regression/kthread/kld/Makefile b/tools/regression/kthread/kld/Makefile new file mode 100644 index 000000000000..df1f76374ada --- /dev/null +++ b/tools/regression/kthread/kld/Makefile @@ -0,0 +1,10 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR} + +KMOD= kthrdlk +NO_MAN= +SRCS= kthrdlk.c +WARNS?= 2 + +.include diff --git a/tools/regression/kthread/kld/kthrdlk.c b/tools/regression/kthread/kld/kthrdlk.c new file mode 100644 index 000000000000..6485c11d7c09 --- /dev/null +++ b/tools/regression/kthread/kld/kthrdlk.c @@ -0,0 +1,204 @@ +/*- + * Copyright (c) 2010 Giovanni Trematerra + * 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. + */ + +/* + * PURPOSE: + * + * This kernel module helped to identify a deadlock in kthread + * interface, also pointed out a race in kthread_exit function. + * + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef TESTPAUSE_DEBUG +#define DPRINTF(x) do { \ + printf (x); \ +} while (0) +#else +#define DPRINTF(x) +#endif + +static struct mtx test_global_lock; +static int global_condvar; +static int test_thrcnt; +volatile int QUIT; + +static void +thr_suspender(void *arg) +{ + struct thread *td = (struct thread *) arg; + int error; + + for (;;) { + if (QUIT == 1) + break; + error = kthread_suspend(td, 10*hz); + if (error != 0 && QUIT == 0) { + if (error == EWOULDBLOCK) + panic("Ooops: kthread deadlock\n"); + else + panic("kthread_suspend error: %d\n", error); + break; + } + } + + mtx_lock(&test_global_lock); + test_thrcnt--; + wakeup(&global_condvar); + mtx_unlock(&test_global_lock); + + kthread_exit(); +} + +static void +thr_resumer(void *arg) +{ + struct thread *td = (struct thread *) arg; + int error; + + for (;;) { + /* must be the last thread to exit */ + if (QUIT == 1 && test_thrcnt == 1) + break; + error = kthread_resume(td); + if (error != 0) + panic("%s: error on kthread_resume. error: %d\n", + __func__, error); + } + + mtx_lock(&test_global_lock); + test_thrcnt--; + wakeup(&global_condvar); + mtx_unlock(&test_global_lock); + + kthread_exit(); +} + +static void +thr_getsuspended(void *arg) +{ + for (;;) { + if (QUIT == 1) + break; + kthread_suspend_check(); + } + + mtx_lock(&test_global_lock); + test_thrcnt--; + wakeup(&global_condvar); + mtx_unlock(&test_global_lock); + + kthread_exit(); +} + +static void +kthrdlk_init(void) +{ + struct proc *testproc; + struct thread *newthr; + int error; + + QUIT = 0; + test_thrcnt = 3; + mtx_init(&test_global_lock, "kthrdlk_lock", NULL, MTX_DEF); + testproc = NULL; + error = kproc_kthread_add(thr_getsuspended, NULL, &testproc, &newthr, + 0, 0, "kthrdlk", "thr_getsuspended"); + if (error != 0) + panic("cannot start thr_getsuspended error: %d\n", error); + + error = kproc_kthread_add(thr_resumer, newthr, &testproc, NULL, 0, 0, + "kthrdlk", "thr_resumer"); + if (error != 0) + panic("cannot start thr_resumer error: %d\n", error); + + error = kproc_kthread_add(thr_suspender, newthr, &testproc, NULL, 0, 0, + "kthrdlk", "thr_suspender"); + if (error != 0) + panic("cannot start thr_suspender error: %d\n", error); +} + +static void +kthrdlk_done(void) +{ + int ret; + DPRINTF(("sending QUIT signal to the thrdlk threads\n")); + + /* wait kernel threads end */ + mtx_lock(&test_global_lock); + QUIT = 1; + while (test_thrcnt != 0) { + ret = mtx_sleep(&global_condvar, &test_global_lock, 0, "waiting thrs end", 30 * hz); + if (ret == EWOULDBLOCK) { + panic("some threads not die! remaing: %d", test_thrcnt); + break; + } + } + if (test_thrcnt == 0) + DPRINTF(("All test_pause threads die\n")); + + mtx_destroy(&test_global_lock); +} + +static int +kthrdlk_handler(module_t mod, int /*modeventtype_t*/ what, + void *arg) +{ + switch (what) { + case MOD_LOAD: + kthrdlk_init(); + uprintf("kthrdlk loaded!\n"); + return (0); + case MOD_UNLOAD: + kthrdlk_done(); + uprintf("Bye Bye! kthrdlk unloaded!\n"); + return (0); + } + + return (EOPNOTSUPP); +} + +static moduledata_t mod_data= { + "kthrdlk", + kthrdlk_handler, + 0 + }; + +MODULE_VERSION(kthrdlk, 1); + +DECLARE_MODULE(kthrdlk, mod_data, SI_SUB_EXEC, SI_ORDER_ANY); + diff --git a/tools/regression/lib/libc/gen/test-wordexp.c b/tools/regression/lib/libc/gen/test-wordexp.c index c78199ed9291..df8f8856f621 100644 --- a/tools/regression/lib/libc/gen/test-wordexp.c +++ b/tools/regression/lib/libc/gen/test-wordexp.c @@ -32,17 +32,36 @@ #include __FBSDID("$FreeBSD$"); +#include + #include +#include +#include #include #include #include #include +static void +chld_handler(int x) +{ + int status, serrno; + + (void)x; + serrno = errno; + while (waitpid(-1, &status, WNOHANG) > 0) + ; + errno = serrno; +} + int main(int argc, char *argv[]) { + struct sigaction sa; wordexp_t we; int r; + int i; + char longdata[6 * 10000 + 1]; /* Test that the macros are there. */ (void)(WRDE_APPEND + WRDE_DOOFFS + WRDE_NOCMD + WRDE_REUSE + @@ -59,6 +78,15 @@ main(int argc, char *argv[]) assert(we.we_wordv[2] == NULL); wordfree(&we); + /* Long output. */ + for (i = 0; i < 10000; i++) + snprintf(longdata + 6 * i, 7, "%05d ", i); + r = wordexp(longdata, &we, 0); + assert(r == 0); + assert(we.we_wordc == 10000); + assert(we.we_wordv[10000] == NULL); + wordfree(&we); + /* WRDE_DOOFFS */ we.we_offs = 3; r = wordexp("hello world", &we, WRDE_DOOFFS); @@ -167,6 +195,20 @@ main(int argc, char *argv[]) r = wordexp("test } test", &we, 0); assert(r == WRDE_BADCHAR); + /* With a SIGCHLD handler that reaps all zombies. */ + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sa.sa_handler = chld_handler; + r = sigaction(SIGCHLD, &sa, NULL); + assert(r == 0); + r = wordexp("hello world", &we, 0); + assert(r == 0); + assert(we.we_wordc == 2); + assert(strcmp(we.we_wordv[0], "hello") == 0); + assert(strcmp(we.we_wordv[1], "world") == 0); + assert(we.we_wordv[2] == NULL); + wordfree(&we); + printf("PASS wordexp()\n"); printf("PASS wordfree()\n"); diff --git a/tools/regression/lib/libc/stdio/test-getdelim.c b/tools/regression/lib/libc/stdio/test-getdelim.c index 1102c20fd5af..c68c21ef6246 100644 --- a/tools/regression/lib/libc/stdio/test-getdelim.c +++ b/tools/regression/lib/libc/stdio/test-getdelim.c @@ -80,7 +80,7 @@ main(int argc, char *argv[]) srandom(0); - printf("1..5\n"); + printf("1..6\n"); /* * Test multiple times with different buffer sizes @@ -103,6 +103,7 @@ main(int argc, char *argv[]) assert(getline(&line, &linecap, fp) == -1); assert(line[0] == '\0'); free(line); + line = NULL; assert(feof(fp)); assert(!ferror(fp)); fclose(fp); @@ -164,5 +165,23 @@ main(int argc, char *argv[]) fclose(fp); printf("ok 5 - nul\n"); + /* Make sure NULL *linep and zero *linecapp are handled. */ + fp = mkfilebuf(); + free(line); + line = NULL; + linecap = 42; + assert(getline(&line, &linecap, fp) == sizeof(apothegm) - 1); + assert(memcmp(line, apothegm, sizeof(apothegm)) == 0); + fp = mkfilebuf(); + free(line); + line = malloc(100); + linecap = 0; + assert(getline(&line, &linecap, fp) == sizeof(apothegm) - 1); + assert(memcmp(line, apothegm, sizeof(apothegm)) == 0); + free(line); + assert(!ferror(fp)); + fclose(fp); + printf("ok 6 - empty/NULL initial buffer\n"); + exit(0); } diff --git a/tools/regression/lib/libutil/Makefile b/tools/regression/lib/libutil/Makefile index 74972fde555c..6fc97aaa4252 100644 --- a/tools/regression/lib/libutil/Makefile +++ b/tools/regression/lib/libutil/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ -TESTS= test-trimdomain test-trimdomain-nodomain test-flopen test-grp -CFLAGS+= -g -Wall -lutil +TESTS= test-trimdomain test-trimdomain-nodomain test-flopen test-grp test-pidfile +CFLAGS+= -g -Wall -Wextra -Werror -lutil .PHONY: tests tests: ${TESTS} diff --git a/tools/regression/lib/libutil/test-flopen.c b/tools/regression/lib/libutil/test-flopen.c index 30b1b894127f..047158466503 100644 --- a/tools/regression/lib/libutil/test-flopen.c +++ b/tools/regression/lib/libutil/test-flopen.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2007 Dag-Erling Coïdan Smørgrav + * Copyright (c) 2007-2009 Dag-Erling Coïdan Smørgrav * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,18 +23,16 @@ * 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 __FBSDID("$FreeBSD$"); -#include #include #include #include +#include #include #include #include @@ -163,21 +161,18 @@ test_flopen_lock_child(void) if (fd1 < 0) { result = strerror(errno); } else { - if ((pid = fork()) == 0) { + pid = fork(); + if (pid == -1) { + result = strerror(errno); + } else if (pid == 0) { select(0, 0, 0, 0, 0); _exit(0); } close(fd1); - fd2 = -42; - if (vfork() == 0) { - fd2 = flopen(fn, O_RDWR|O_NONBLOCK); - close(fd2); - _exit(0); - } - if (fd2 == -42) - result = "vfork() doesn't work as expected"; - if (fd2 >= 0) + if ((fd2 = flopen(fn, O_RDWR|O_NONBLOCK)) != -1) { result = "second open succeeded"; + close(fd2); + } kill(pid, SIGINT); } unlink(fn); diff --git a/tools/regression/lib/libutil/test-grp.c b/tools/regression/lib/libutil/test-grp.c index 722a0b8a2202..ae7ce73bf1c0 100644 --- a/tools/regression/lib/libutil/test-grp.c +++ b/tools/regression/lib/libutil/test-grp.c @@ -64,7 +64,7 @@ build_grp(struct group *grp) int -main(int argc, char **argv) +main(void) { char *strGrp; int testNdx; diff --git a/tools/regression/lib/libutil/test-pidfile.c b/tools/regression/lib/libutil/test-pidfile.c new file mode 100644 index 000000000000..0b70bc80152b --- /dev/null +++ b/tools/regression/lib/libutil/test-pidfile.c @@ -0,0 +1,280 @@ +/*- + * Copyright (c) 2007-2009 Dag-Erling Coïdan Smørgrav + * 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 + * in this position and unchanged. + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* + * We need a signal handler so kill(2) will interrupt our child's + * select(2) instead of killing it. + */ +static void +signal_handler(int sig) +{ + (void)sig; +} + +/* + * Test that pidfile_open() can create a pidfile and that pidfile_write() + * can write to it. + */ +static const char * +test_pidfile_uncontested(void) +{ + const char *fn = "test_pidfile_uncontested"; + struct pidfh *pf; + pid_t other = 0; + + unlink(fn); + pf = pidfile_open(fn, 0600, &other); + if (pf == NULL && other != 0) + return ("pidfile exists and is locked"); + if (pf == NULL) + return (strerror(errno)); + if (pidfile_write(pf) != 0) { + pidfile_close(pf); + unlink(fn); + return ("failed to write PID"); + } + pidfile_close(pf); + unlink(fn); + return (NULL); +} + +/* + * Test that pidfile_open() locks against self. + */ +static const char * +test_pidfile_self(void) +{ + const char *fn = "test_pidfile_self"; + struct pidfh *pf1, *pf2; + pid_t other = 0; + int serrno; + + unlink(fn); + pf1 = pidfile_open(fn, 0600, &other); + if (pf1 == NULL && other != 0) + return ("pidfile exists and is locked"); + if (pf1 == NULL) + return (strerror(errno)); + if (pidfile_write(pf1) != 0) { + serrno = errno; + pidfile_close(pf1); + unlink(fn); + return (strerror(serrno)); + } + // second open should fail + pf2 = pidfile_open(fn, 0600, &other); + if (pf2 != NULL) { + pidfile_close(pf1); + pidfile_close(pf2); + unlink(fn); + return ("managed to opened pidfile twice"); + } + if (other != getpid()) { + pidfile_close(pf1); + unlink(fn); + return ("pidfile contained wrong PID"); + } + pidfile_close(pf1); + unlink(fn); + return (NULL); +} + +/* + * Common code for test_pidfile_{contested,inherited}. + */ +static const char * +common_test_pidfile_child(const char *fn, int parent_open) +{ + struct pidfh *pf = NULL; + pid_t other = 0, pid = 0; + int fd[2], serrno, status; + char ch; + + unlink(fn); + if (pipe(fd) != 0) + return (strerror(errno)); + + if (parent_open) { + pf = pidfile_open(fn, 0600, &other); + if (pf == NULL && other != 0) + return ("pidfile exists and is locked"); + if (pf == NULL) + return (strerror(errno)); + } + + pid = fork(); + if (pid == -1) + return (strerror(errno)); + if (pid == 0) { + // child + close(fd[0]); + signal(SIGINT, signal_handler); + if (!parent_open) { + pf = pidfile_open(fn, 0600, &other); + if (pf == NULL && other != 0) + return ("pidfile exists and is locked"); + if (pf == NULL) + return (strerror(errno)); + } + if (pidfile_write(pf) != 0) { + serrno = errno; + pidfile_close(pf); + unlink(fn); + return (strerror(serrno)); + } + if (pf == NULL) + _exit(1); + if (pidfile_write(pf) != 0) + _exit(1); + if (write(fd[1], "*", 1) != 1) + _exit(1); + select(0, 0, 0, 0, 0); + _exit(0); + } + // parent + close(fd[1]); + if (pf) + pidfile_close(pf); + + // wait for the child to signal us + if (read(fd[0], &ch, 1) != 1) { + serrno = errno; + unlink(fn); + kill(pid, SIGTERM); + errno = serrno; + return (strerror(errno)); + } + + // We shouldn't be able to lock the same pidfile as our child + pf = pidfile_open(fn, 0600, &other); + if (pf != NULL) { + pidfile_close(pf); + unlink(fn); + return ("managed to lock contested pidfile"); + } + + // Failed to lock, but not because it was contested + if (other == 0) { + unlink(fn); + return (strerror(errno)); + } + + // Locked by the wrong process + if (other != pid) { + unlink(fn); + return ("pidfile contained wrong PID"); + } + + // check our child's fate + if (pf) + pidfile_close(pf); + unlink(fn); + if (kill(pid, SIGINT) != 0) + return (strerror(errno)); + if (waitpid(pid, &status, 0) == -1) + return (strerror(errno)); + if (WIFSIGNALED(status)) + return ("child caught signal"); + if (WEXITSTATUS(status) != 0) + return ("child returned non-zero status"); + + // success + return (NULL); +} + +/* + * Test that pidfile_open() fails when attempting to open a pidfile that + * is already locked, and that it returns the correct PID. + */ +static const char * +test_pidfile_contested(void) +{ + const char *fn = "test_pidfile_contested"; + const char *result; + + result = common_test_pidfile_child(fn, 0); + return (result); +} + +/* + * Test that the pidfile lock is inherited. + */ +static const char * +test_pidfile_inherited(void) +{ + const char *fn = "test_pidfile_inherited"; + const char *result; + + result = common_test_pidfile_child(fn, 1); + return (result); +} + +static struct test { + const char *name; + const char *(*func)(void); +} t[] = { + { "pidfile_uncontested", test_pidfile_uncontested }, + { "pidfile_self", test_pidfile_self }, + { "pidfile_contested", test_pidfile_contested }, + { "pidfile_inherited", test_pidfile_inherited }, +}; + +int +main(void) +{ + const char *result; + int i, nt; + + nt = sizeof(t) / sizeof(*t); + printf("1..%d\n", nt); + for (i = 0; i < nt; ++i) { + if ((result = t[i].func()) != NULL) + printf("not ok %d - %s # %s\n", i + 1, + t[i].name, result); + else + printf("ok %d - %s\n", i + 1, + t[i].name); + } + exit(0); +} diff --git a/tools/regression/lib/libutil/test-trimdomain-nodomain.c b/tools/regression/lib/libutil/test-trimdomain-nodomain.c index 344bc17e439e..c02ccdb8fd10 100644 --- a/tools/regression/lib/libutil/test-trimdomain-nodomain.c +++ b/tools/regression/lib/libutil/test-trimdomain-nodomain.c @@ -47,7 +47,8 @@ int tests = 0; * This makes the tests much easier to write and less likely to fail on * oddly configured systems. */ -int gethostname(char *name, size_t namelen) +int +gethostname(char *name, size_t namelen) { if (strlcpy(name, TESTFQDN, namelen) > namelen) { errno = ENAMETOOLONG; @@ -63,7 +64,7 @@ testit(const char *input, int hostsize, const char *output, const char *test) const char *expected = (output == NULL) ? input : output; testhost = strdup(input); - trimdomain(testhost, hostsize < 0 ? strlen(testhost) : hostsize); + trimdomain(testhost, hostsize < 0 ? (int)strlen(testhost) : hostsize); tests++; if (strcmp(testhost, expected) != 0) { printf("not ok %d - %s\n", tests, test); @@ -75,7 +76,7 @@ testit(const char *input, int hostsize, const char *output, const char *test) } int -main (int argc, char **argv) +main(void) { printf("1..5\n"); diff --git a/tools/regression/lib/libutil/test-trimdomain.c b/tools/regression/lib/libutil/test-trimdomain.c index d1c782380503..08fcfc0130d6 100644 --- a/tools/regression/lib/libutil/test-trimdomain.c +++ b/tools/regression/lib/libutil/test-trimdomain.c @@ -47,7 +47,8 @@ int tests = 0; * This makes the tests much easier to write and less likely to fail on * oddly configured systems. */ -int gethostname(char *name, size_t namelen) +int +gethostname(char *name, size_t namelen) { if (strlcpy(name, TESTFQDN, namelen) > namelen) { errno = ENAMETOOLONG; @@ -63,7 +64,7 @@ testit(const char *input, int hostsize, const char *output, const char *test) const char *expected = (output == NULL) ? input : output; testhost = strdup(input); - trimdomain(testhost, hostsize < 0 ? strlen(testhost) : hostsize); + trimdomain(testhost, hostsize < 0 ? (int)strlen(testhost) : hostsize); tests++; if (strcmp(testhost, expected) != 0) { printf("not ok %d - %s\n", tests, test); @@ -75,7 +76,7 @@ testit(const char *input, int hostsize, const char *output, const char *test) } int -main (int argc, char **argv) +main(void) { printf("1..5\n"); diff --git a/tools/regression/mmap/Makefile b/tools/regression/mmap/Makefile new file mode 100644 index 000000000000..eb4d66c83549 --- /dev/null +++ b/tools/regression/mmap/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +PROG= mmap +NO_MAN= + +.include diff --git a/tools/regression/mmap/mmap.c b/tools/regression/mmap/mmap.c new file mode 100644 index 000000000000..14c55a1aed19 --- /dev/null +++ b/tools/regression/mmap/mmap.c @@ -0,0 +1,96 @@ +/*- + * Copyright (c) 2009 Simon L. Nielsen , + * Bjoern A. Zeeb + * + * 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 +#include +#include +#include + +#include +#include + +const struct tests { + void *addr; + int ok[2]; /* Depending on security.bsd.map_at_zero {0, !=0}. */ +} tests[] = { + { (void *)0, { 0, 1 } }, /* Test sysctl. */ + { (void *)1, { 0, 0 } }, + { (void *)(PAGE_SIZE - 1), { 0, 0 } }, + { (void *)PAGE_SIZE, { 1, 1 } }, + { (void *)-1, { 0, 0 } }, + { (void *)(-PAGE_SIZE), { 0, 0 } }, + { (void *)(-1 - PAGE_SIZE), { 0, 0 } }, + { (void *)(-1 - PAGE_SIZE - 1), { 0, 0 } }, + { (void *)(0x1000 * PAGE_SIZE), { 1, 1 } }, +}; + +int +main(void) +{ + void *p; + size_t len; + int i, error, mib[3], map_at_zero; + + error = 0; + + /* Get the current sysctl value of security.bsd.map_at_zero. */ + len = sizeof(mib) / sizeof(*mib); + if (sysctlnametomib("security.bsd.map_at_zero", mib, &len) == -1) + err(1, "sysctlnametomib(security.bsd.map_at_zero)"); + + len = sizeof(map_at_zero); + if (sysctl(mib, 3, &map_at_zero, &len, NULL, 0) == -1) + err(1, "sysctl(security.bsd.map_at_zero)"); + + /* Normalize to 0 or 1 for array access. */ + map_at_zero = !!map_at_zero; + + for (i=0; i < (sizeof(tests) / sizeof(*tests)); i++) { + p = mmap((void *)tests[i].addr, PAGE_SIZE, + PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_FIXED, + -1, 0); + if (p == MAP_FAILED) { + if (tests[i].ok[map_at_zero] != 0) + error++; + warnx("%s: mmap(%p, ...) failed.", + (tests[i].ok[map_at_zero] == 0) ? "OK " : "ERR", + tests[i].addr); + } else { + if (tests[i].ok[map_at_zero] != 1) + error++; + warnx("%s: mmap(%p, ...) succeeded: p=%p", + (tests[i].ok[map_at_zero] == 1) ? "OK " : "ERR", + tests[i].addr, p); + } + } + + if (error) + err(1, "---\nERROR: %d unexpected results.", error); + + return (error != 0); +} diff --git a/tools/regression/mqueue/mqtest1/Makefile b/tools/regression/mqueue/mqtest1/Makefile index 4e04d1d2ad9c..370b5c9bd35a 100644 --- a/tools/regression/mqueue/mqtest1/Makefile +++ b/tools/regression/mqueue/mqtest1/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG=mqtest1 -LDADD+=-lrt +DPADD= ${LIBRT} +LDADD= -lrt NO_MAN= DEBUG_FLAGS=-g diff --git a/tools/regression/mqueue/mqtest2/Makefile b/tools/regression/mqueue/mqtest2/Makefile index 9d1b92c39887..07a5577d4ec4 100644 --- a/tools/regression/mqueue/mqtest2/Makefile +++ b/tools/regression/mqueue/mqtest2/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG=mqtest2 -LDADD+=-lrt +DPADD= ${LIBRT} +LDADD= -lrt NO_MAN= DEBUG_FLAGS=-g diff --git a/tools/regression/mqueue/mqtest3/Makefile b/tools/regression/mqueue/mqtest3/Makefile index d4ea9fa08691..543948041b07 100644 --- a/tools/regression/mqueue/mqtest3/Makefile +++ b/tools/regression/mqueue/mqtest3/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG=mqtest3 -LDADD+=-lrt +DPADD= ${LIBRT} +LDADD= -lrt NO_MAN= DEBUG_FLAGS=-g diff --git a/tools/regression/mqueue/mqtest4/Makefile b/tools/regression/mqueue/mqtest4/Makefile index 3dfec4d6481e..d0476b27476e 100644 --- a/tools/regression/mqueue/mqtest4/Makefile +++ b/tools/regression/mqueue/mqtest4/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG=mqtest4 -LDADD+=-lrt +DPADD= ${LIBRT} +LDADD= -lrt NO_MAN= DEBUG_FLAGS=-g diff --git a/tools/regression/mqueue/mqtest5/Makefile b/tools/regression/mqueue/mqtest5/Makefile index 25f46adf1e4f..b2f3aad69815 100644 --- a/tools/regression/mqueue/mqtest5/Makefile +++ b/tools/regression/mqueue/mqtest5/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG=mqtest5 -LDADD+=-lrt +DPADD= ${LIBRT} +LDADD= -lrt NO_MAN= DEBUG_FLAGS=-g diff --git a/tools/regression/netipx/ipxdgramloopback/Makefile b/tools/regression/netipx/ipxdgramloopback/Makefile index 364d787e46b7..78b3e4528989 100644 --- a/tools/regression/netipx/ipxdgramloopback/Makefile +++ b/tools/regression/netipx/ipxdgramloopback/Makefile @@ -5,7 +5,7 @@ PROG= ipxdgramloopback NO_MAN= -DPADD= ${LIBIPX}; +DPADD= ${LIBIPX} LDADD= -lipx WARNS?= 3 diff --git a/tools/regression/netipx/spxabort/Makefile b/tools/regression/netipx/spxabort/Makefile index b9498a07c659..ec3ef5b26fd6 100644 --- a/tools/regression/netipx/spxabort/Makefile +++ b/tools/regression/netipx/spxabort/Makefile @@ -5,7 +5,7 @@ PROG= spxabort NO_MAN= -DPADD= ${LIBIPX}; +DPADD= ${LIBIPX} LDADD= -lipx WARNS?= 3 diff --git a/tools/regression/netipx/spxloopback/Makefile b/tools/regression/netipx/spxloopback/Makefile index edbfbbc5bdd3..4245217a2aca 100644 --- a/tools/regression/netipx/spxloopback/Makefile +++ b/tools/regression/netipx/spxloopback/Makefile @@ -5,7 +5,7 @@ PROG= spxloopback NO_MAN= -DPADD= ${LIBIPX}; +DPADD= ${LIBIPX} LDADD= -lipx WARNS?= 3 diff --git a/tools/regression/posixsem2/Makefile b/tools/regression/posixsem2/Makefile new file mode 100644 index 000000000000..84f96174e6ed --- /dev/null +++ b/tools/regression/posixsem2/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +PROG= semtest +SRCS= semtest.c +NO_MAN= + +WARNS?= 3 + +.include diff --git a/tools/regression/posixsem2/semtest.c b/tools/regression/posixsem2/semtest.c new file mode 100644 index 000000000000..befc7c5d3651 --- /dev/null +++ b/tools/regression/posixsem2/semtest.c @@ -0,0 +1,101 @@ +/* $FreeBSD$ */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SEM_NAME "/semtst" + +int test_unnamed(void); +int test_named(void); + +int +test_unnamed(void) +{ + sem_t *s; + pid_t pid; + int status; + + printf("testing unnamed process-shared semaphore\n"); + s = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, + -1, 0); + if (s == MAP_FAILED) + err(1, "mmap failed"); + if (sem_init(s, 1, 0)) + err(2, "sem_init failed"); + if ((pid = fork()) == 0) { + printf("child: sem_wait()\n"); + if (sem_wait(s)) + err(3, "sem_wait failed"); + printf("child: sem_wait() returned\n"); + exit(0); + } else { + sleep(1); + printf("parent: sem_post()\n"); + if (sem_post(s)) + err(4, "sem_post failed"); + waitpid(pid, &status, 0); + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) + printf("OK.\n"); + else + printf("Failure."); + } + return (0); +} + +int +test_named(void) +{ + sem_t *s, *s2; + pid_t pid; + int status; + + printf("testing named process-shared semaphore\n"); + sem_unlink(SEM_NAME); + s = sem_open(SEM_NAME, O_CREAT, 0777, 0); + if (s == SEM_FAILED) + err(1, "sem_open failed"); + s2 = sem_open(SEM_NAME, O_CREAT, 0777, 0); + if (s2 == SEM_FAILED) + err(2, "second sem_open call failed"); + if (s != s2) + err(3, "two sem_open calls for same semaphore do not returm same address."); + if (sem_close(s2)) + err(4, "sem_close failed"); + if ((pid = fork()) == 0) { + printf("child: sem_wait()\n"); + if (sem_wait(s)) + err(5, "sem_wait failed"); + printf("child: sem_wait() returned\n"); + exit(0); + } else { + sleep(1); + printf("parent: sem_post()\n"); + if (sem_post(s)) + err(6, "sem_post failed"); + waitpid(pid, &status, 0); + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) + printf("OK.\n"); + else + printf("Failure."); + } + + if (sem_close(s)) + err(7, "sem_close failed"); + + return (0); +} + +int +main(void) +{ + test_unnamed(); + test_named(); + return (0); +} diff --git a/tools/regression/pthread/cv_cancel1/Makefile b/tools/regression/pthread/cv_cancel1/Makefile index 6fe38c76d86c..bb238255f93c 100644 --- a/tools/regression/pthread/cv_cancel1/Makefile +++ b/tools/regression/pthread/cv_cancel1/Makefile @@ -2,7 +2,7 @@ PROG= cv_cancel1 NO_MAN= - +DPADD= ${LIBPTHREAD} LDADD= -lpthread .include diff --git a/tools/regression/pthread/mutex_isowned_np/Makefile b/tools/regression/pthread/mutex_isowned_np/Makefile index d7d3ac47ca7a..a234fbc5eb6e 100644 --- a/tools/regression/pthread/mutex_isowned_np/Makefile +++ b/tools/regression/pthread/mutex_isowned_np/Makefile @@ -2,7 +2,7 @@ PROG= mutex_isowned_np NO_MAN= - +DPADD= ${LIBPTHREAD} LDADD= -lpthread .include diff --git a/tools/regression/rpcsec_gss/Makefile b/tools/regression/rpcsec_gss/Makefile index 29b14d6e332e..d1f894bfea17 100644 --- a/tools/regression/rpcsec_gss/Makefile +++ b/tools/regression/rpcsec_gss/Makefile @@ -3,6 +3,7 @@ PROG= rpctest NO_MAN= WARNS?= 6 +DPADD= ${LIBRPCSEC_GSS} LDADD= -lrpcsec_gss DEBUG_FLAGS= -g -O0 diff --git a/tools/regression/sigqueue/sigqtest1/Makefile b/tools/regression/sigqueue/sigqtest1/Makefile index 08a140c5c894..86f7206cc009 100644 --- a/tools/regression/sigqueue/sigqtest1/Makefile +++ b/tools/regression/sigqueue/sigqtest1/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG=sigqtest1 -LDADD+= NO_MAN= DEBUG_FLAGS=-g diff --git a/tools/regression/sigqueue/sigqtest1/sigqtest1.c b/tools/regression/sigqueue/sigqtest1/sigqtest1.c index 0f40021b4ab6..f0201c37af86 100644 --- a/tools/regression/sigqueue/sigqtest1/sigqtest1.c +++ b/tools/regression/sigqueue/sigqtest1/sigqtest1.c @@ -1,12 +1,14 @@ /* $FreeBSD$ */ -#include -#include #include #include +#include +#include +#include int received; -void handler(int sig, siginfo_t *si, void *ctx) +void +handler(int sig, siginfo_t *si, void *ctx) { if (si->si_code != SI_QUEUE) errx(1, "si_code != SI_QUEUE"); @@ -15,7 +17,8 @@ void handler(int sig, siginfo_t *si, void *ctx) received++; } -int main() +int +main() { struct sigaction sa; union sigval val; diff --git a/tools/regression/sigqueue/sigqtest2/Makefile b/tools/regression/sigqueue/sigqtest2/Makefile index b3899ad833f9..e7033f7b21e0 100644 --- a/tools/regression/sigqueue/sigqtest2/Makefile +++ b/tools/regression/sigqueue/sigqtest2/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG=sigqtest2 -LDADD+= NO_MAN= DEBUG_FLAGS=-g diff --git a/tools/regression/sigqueue/sigqtest2/sigqtest2.c b/tools/regression/sigqueue/sigqtest2/sigqtest2.c index 078ea81f6278..50b579d0a42c 100644 --- a/tools/regression/sigqueue/sigqtest2/sigqtest2.c +++ b/tools/regression/sigqueue/sigqtest2/sigqtest2.c @@ -1,24 +1,29 @@ /* $FreeBSD$ */ -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#include +#include int stop_received; int exit_received; int cont_received; -void job_handler(int sig, siginfo_t *si, void *ctx) +void +job_handler(int sig, siginfo_t *si, void *ctx) { int status; int ret; if (si->si_code == CLD_STOPPED) { + printf("%d: stop received\n", si->si_pid); stop_received = 1; kill(si->si_pid, SIGCONT); } else if (si->si_code == CLD_EXITED) { + printf("%d: exit received\n", si->si_pid); ret = waitpid(si->si_pid, &status, 0); if (ret == -1) errx(1, "waitpid"); @@ -26,11 +31,13 @@ void job_handler(int sig, siginfo_t *si, void *ctx) errx(1, "!WIFEXITED(status)"); exit_received = 1; } else if (si->si_code == CLD_CONTINUED) { + printf("%d: cont received\n", si->si_pid); cont_received = 1; } } -void job_control_test() +void +job_control_test(void) { struct sigaction sa; pid_t pid; @@ -43,9 +50,12 @@ void job_control_test() stop_received = 0; cont_received = 0; exit_received = 0; + fflush(stdout); pid = fork(); if (pid == 0) { + printf("child %d\n", getpid()); kill(getpid(), SIGSTOP); + sleep(2); exit(1); } @@ -60,11 +70,13 @@ void job_control_test() printf("job control test OK.\n"); } -void rtsig_handler(int sig, siginfo_t *si, void *ctx) +void +rtsig_handler(int sig, siginfo_t *si, void *ctx) { } -int main() +int +main() { struct sigaction sa; sigset_t set; diff --git a/tools/regression/sockets/sendfile/Makefile b/tools/regression/sockets/sendfile/Makefile index e1a43cb933f1..2930363820a9 100644 --- a/tools/regression/sockets/sendfile/Makefile +++ b/tools/regression/sockets/sendfile/Makefile @@ -5,5 +5,7 @@ PROG= sendfile NO_MAN= WARNS?= 6 +DPADD= ${LIBMD} +LDADD= -lmd .include diff --git a/tools/regression/sockets/sendfile/sendfile.c b/tools/regression/sockets/sendfile/sendfile.c index fbeaac12fead..c81582421aa9 100644 --- a/tools/regression/sockets/sendfile/sendfile.c +++ b/tools/regression/sockets/sendfile/sendfile.c @@ -29,11 +29,14 @@ #include #include #include +#include #include #include +#include #include +#include #include #include #include @@ -47,113 +50,192 @@ * of cases and performing limited validation. */ +#define FAIL(msg) {printf("# %s\n", msg); \ + return (-1);} + +#define FAIL_ERR(msg) {printf("# %s: %s\n", msg, strerror(errno)); \ + return (-1);} + #define TEST_PORT 5678 #define TEST_MAGIC 0x4440f7bb #define TEST_PAGES 4 #define TEST_SECONDS 30 struct test_header { - u_int32_t th_magic; - u_int32_t th_header_length; - u_int32_t th_offset; - u_int32_t th_length; + uint32_t th_magic; + uint32_t th_header_length; + uint32_t th_offset; + uint32_t th_length; + char th_md5[33]; +}; + +struct sendfile_test { + uint32_t hdr_length; + uint32_t offset; + uint32_t length; }; -pid_t child_pid, parent_pid; -int listen_socket; int file_fd; +char path[PATH_MAX]; +int listen_socket; +int accept_socket; + +static int test_th(struct test_header *th, uint32_t *header_length, + uint32_t *offset, uint32_t *length); +static void signal_alarm(int signum); +static void setup_alarm(int seconds); +static void cancel_alarm(void); +static int receive_test(void); +static void run_child(void); +static int new_test_socket(int *connect_socket); +static void init_th(struct test_header *th, uint32_t header_length, + uint32_t offset, uint32_t length); +static int send_test(int connect_socket, struct sendfile_test); +static void run_parent(void); +static void cleanup(void); + static int -test_th(struct test_header *th, u_int32_t *header_length, u_int32_t *offset, - u_int32_t *length) +test_th(struct test_header *th, uint32_t *header_length, uint32_t *offset, + uint32_t *length) { if (th->th_magic != htonl(TEST_MAGIC)) - return (0); + FAIL("magic number not found in header") *header_length = ntohl(th->th_header_length); *offset = ntohl(th->th_offset); *length = ntohl(th->th_length); - return (1); + return (0); } static void signal_alarm(int signum) { - (void)signum; + + printf("# test timeout\n"); + + if (accept_socket > 0) + close(accept_socket); + if (listen_socket > 0) + close(listen_socket); + + _exit(-1); } static void setup_alarm(int seconds) { + struct itimerval itv; + bzero(&itv, sizeof(itv)); + (void)seconds; + itv.it_value.tv_sec = seconds; signal(SIGALRM, signal_alarm); - alarm(seconds); + setitimer(ITIMER_REAL, &itv, NULL); } static void cancel_alarm(void) { - - alarm(0); - signal(SIGALRM, SIG_DFL); + struct itimerval itv; + bzero(&itv, sizeof(itv)); + setitimer(ITIMER_REAL, &itv, NULL); } -static void -receive_test(int accept_socket) +static int +receive_test(void) { - u_int32_t header_length, offset, length, counter; + uint32_t header_length, offset, length, counter; struct test_header th; ssize_t len; - char ch; + char buf[10240]; + MD5_CTX md5ctx; + char *rxmd5; len = read(accept_socket, &th, sizeof(th)); - if (len < 0) - err(1, "read"); - if ((size_t)len < sizeof(th)) - errx(1, "read: %zd", len); + if (len < 0 || (size_t)len < sizeof(th)) + FAIL_ERR("read") - if (test_th(&th, &header_length, &offset, &length) == 0) - errx(1, "test_th: bad"); + if (test_th(&th, &header_length, &offset, &length) != 0) + return (-1); + + MD5Init(&md5ctx); counter = 0; while (1) { - len = read(accept_socket, &ch, sizeof(ch)); - if (len < 0) - err(1, "read"); - if (len == 0) + len = read(accept_socket, buf, sizeof(buf)); + if (len < 0 || len == 0) break; - counter++; - /* XXXRW: Validate byte here. */ + counter += len; + MD5Update(&md5ctx, buf, len); } - if (counter != header_length + length) - errx(1, "receive_test: expected (%d, %d) received %d", - header_length, length, counter); + + rxmd5 = MD5End(&md5ctx, NULL); + + if ((counter != header_length+length) || + memcmp(th.th_md5, rxmd5, 33) != 0) + FAIL("receive length mismatch") + + free(rxmd5); + return (0); } static void run_child(void) { - int accept_socket; + struct sockaddr_in sin; + int rc = 0; - while (1) { + listen_socket = socket(PF_INET, SOCK_STREAM, 0); + if (listen_socket < 0) { + printf("# socket: %s\n", strerror(errno)); + rc = -1; + } + + if (!rc) { + bzero(&sin, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + sin.sin_port = htons(TEST_PORT); + + if (bind(listen_socket, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + printf("# bind: %s\n", strerror(errno)); + rc = -1; + } + } + + if (!rc && listen(listen_socket, -1) < 0) { + printf("# listen: %s\n", strerror(errno)); + rc = -1; + } + + if (!rc) { accept_socket = accept(listen_socket, NULL, NULL); setup_alarm(TEST_SECONDS); - receive_test(accept_socket); - cancel_alarm(); - close(accept_socket); + if (receive_test() != 0) + rc = -1; } + + cancel_alarm(); + if (accept_socket > 0) + close(accept_socket); + if (listen_socket > 0) + close(listen_socket); + + _exit(rc); } static int -new_test_socket(void) +new_test_socket(int *connect_socket) { struct sockaddr_in sin; - int connect_socket; + int rc = 0; - connect_socket = socket(PF_INET, SOCK_STREAM, 0); - if (connect_socket < 0) - err(1, "socket"); + *connect_socket = socket(PF_INET, SOCK_STREAM, 0); + if (*connect_socket < 0) + FAIL_ERR("socket") bzero(&sin, sizeof(sin)); sin.sin_len = sizeof(sin); @@ -161,57 +243,65 @@ new_test_socket(void) sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); sin.sin_port = htons(TEST_PORT); - if (connect(connect_socket, (struct sockaddr *)&sin, sizeof(sin)) < 0) - err(1, "connect"); + if (connect(*connect_socket, (struct sockaddr *)&sin, sizeof(sin)) < 0) + FAIL_ERR("connect") - return (connect_socket); + return (rc); } static void -init_th(struct test_header *th, u_int32_t header_length, u_int32_t offset, - u_int32_t length) +init_th(struct test_header *th, uint32_t header_length, uint32_t offset, + uint32_t length) { - bzero(th, sizeof(*th)); th->th_magic = htonl(TEST_MAGIC); th->th_header_length = htonl(header_length); th->th_offset = htonl(offset); th->th_length = htonl(length); + + MD5FileChunk(path, th->th_md5, offset, length); } -static void -send_test(int connect_socket, u_int32_t header_length, u_int32_t offset, - u_int32_t length) +static int +send_test(int connect_socket, struct sendfile_test test) { struct test_header th; struct sf_hdtr hdtr, *hdtrp; struct iovec headers; char *header; ssize_t len; + int length; off_t off; len = lseek(file_fd, 0, SEEK_SET); - if (len < 0) - err(1, "lseek"); if (len != 0) - errx(1, "lseek: %zd", len); + FAIL_ERR("lseek") - init_th(&th, header_length, offset, length); + if (test.length == 0) { + struct stat st; + if (fstat(file_fd, &st) < 0) + FAIL_ERR("fstat") + length = st.st_size - test.offset; + } + else { + length = test.length; + } + + init_th(&th, test.hdr_length, test.offset, length); len = write(connect_socket, &th, sizeof(th)); - if (len < 0) - err(1, "send"); if (len != sizeof(th)) - err(1, "send: %zd", len); + return (-1); - if (header_length != 0) { - header = malloc(header_length); + if (test.hdr_length != 0) { + header = malloc(test.hdr_length); if (header == NULL) - err(1, "malloc"); + FAIL_ERR("malloc") + hdtrp = &hdtr; bzero(&headers, sizeof(headers)); headers.iov_base = header; - headers.iov_len = header_length; + headers.iov_len = test.hdr_length; bzero(&hdtr, sizeof(hdtr)); hdtr.headers = &headers; hdtr.hdr_cnt = 1; @@ -222,148 +312,130 @@ send_test(int connect_socket, u_int32_t header_length, u_int32_t offset, header = NULL; } - if (sendfile(file_fd, connect_socket, offset, length, hdtrp, &off, - 0) < 0) - err(1, "sendfile"); + if (sendfile(file_fd, connect_socket, test.offset, test.length, + hdtrp, &off, 0) < 0) { + if (header != NULL) + free(header); + FAIL_ERR("sendfile") + } if (length == 0) { struct stat sb; - if (fstat(file_fd, &sb) < 0) - err(1, "fstat"); - length = sb.st_size - offset; - } - - if (off != length) { - errx(1, "sendfile: off(%ju) != length(%ju)", - (uintmax_t)off, (uintmax_t)length); + if (fstat(file_fd, &sb) == 0) + length = sb.st_size - test.offset; } if (header != NULL) free(header); + + if (off != length) + FAIL("offset != length") + + return (0); } static void run_parent(void) { int connect_socket; + int status; + int test_num; + int pid; - connect_socket = new_test_socket(); - send_test(connect_socket, 0, 0, 1); - close(connect_socket); + const int pagesize = getpagesize(); - sleep(1); + struct sendfile_test tests[10] = { + { .hdr_length = 0, .offset = 0, .length = 1 }, + { .hdr_length = 0, .offset = 0, .length = pagesize }, + { .hdr_length = 0, .offset = 1, .length = 1 }, + { .hdr_length = 0, .offset = 1, .length = pagesize }, + { .hdr_length = 0, .offset = pagesize, .length = pagesize }, + { .hdr_length = 0, .offset = 0, .length = 2*pagesize }, + { .hdr_length = 0, .offset = 0, .length = 0 }, + { .hdr_length = 0, .offset = pagesize, .length = 0 }, + { .hdr_length = 0, .offset = 2*pagesize, .length = 0 }, + { .hdr_length = 0, .offset = TEST_PAGES*pagesize, .length = 0 } + }; - connect_socket = new_test_socket(); - send_test(connect_socket, 0, 0, getpagesize()); - close(connect_socket); + printf("1..10\n"); - sleep(1); + for (test_num = 1; test_num <= 10; test_num++) { - connect_socket = new_test_socket(); - send_test(connect_socket, 0, 1, 1); - close(connect_socket); + pid = fork(); + if (pid == -1) { + printf("not ok %d\n", test_num); + continue; + } - sleep(1); + if (pid == 0) + run_child(); - connect_socket = new_test_socket(); - send_test(connect_socket, 0, 1, getpagesize()); - close(connect_socket); + usleep(250000); - sleep(1); + if (new_test_socket(&connect_socket) != 0) { + printf("not ok %d\n", test_num); + kill(pid, SIGALRM); + close(connect_socket); + continue; + } - connect_socket = new_test_socket(); - send_test(connect_socket, 0, getpagesize(), getpagesize()); - close(connect_socket); + if (send_test(connect_socket, tests[test_num-1]) != 0) { + printf("not ok %d\n", test_num); + kill(pid, SIGALRM); + close(connect_socket); + continue; + } - sleep(1); + close(connect_socket); + if (waitpid(pid, &status, 0) == pid) { + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) + printf("%s %d\n", "ok", test_num); + else + printf("%s %d\n", "not ok", test_num); + } + else { + printf("not ok %d\n", test_num); + } + } +} - connect_socket = new_test_socket(); - send_test(connect_socket, 0, 0, 2 * getpagesize()); - close(connect_socket); - - sleep(1); - - connect_socket = new_test_socket(); - send_test(connect_socket, 0, 0, 0); - close(connect_socket); - - sleep(1); - - connect_socket = new_test_socket(); - send_test(connect_socket, 0, getpagesize(), 0); - close(connect_socket); - - sleep(1); - - connect_socket = new_test_socket(); - send_test(connect_socket, 0, 2 * getpagesize(), 0); - close(connect_socket); - - sleep(1); - - connect_socket = new_test_socket(); - send_test(connect_socket, 0, TEST_PAGES * getpagesize(), 0); - close(connect_socket); - - sleep(1); - - (void)kill(child_pid, SIGKILL); +static void +cleanup(void) +{ + if (*path != '\0') + unlink(path); } int main(void) { - char path[PATH_MAX], *page_buffer; - struct sockaddr_in sin; + char *page_buffer; int pagesize; ssize_t len; + *path = '\0'; + pagesize = getpagesize(); page_buffer = malloc(TEST_PAGES * pagesize); if (page_buffer == NULL) - err(1, "malloc"); + FAIL_ERR("malloc") bzero(page_buffer, TEST_PAGES * pagesize); - listen_socket = socket(PF_INET, SOCK_STREAM, 0); - if (listen_socket < 0) - err(1, "socket"); - - bzero(&sin, sizeof(sin)); - sin.sin_len = sizeof(sin); - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - sin.sin_port = htons(TEST_PORT); - snprintf(path, PATH_MAX, "/tmp/sendfile.XXXXXXXXXXXX"); file_fd = mkstemp(path); - (void)unlink(path); + atexit(cleanup); len = write(file_fd, page_buffer, TEST_PAGES * pagesize); if (len < 0) - err(1, "write"); + FAIL_ERR("write") len = lseek(file_fd, 0, SEEK_SET); if (len < 0) - err(1, "lseek"); + FAIL_ERR("lseek") if (len != 0) - errx(1, "lseek: %zd", len); - - if (bind(listen_socket, (struct sockaddr *)&sin, sizeof(sin)) < 0) - err(1, "bind"); - - if (listen(listen_socket, -1) < 0) - err(1, "listen"); - - parent_pid = getpid(); - child_pid = fork(); - if (child_pid < 0) - err(1, "fork"); - if (child_pid == 0) { - child_pid = getpid(); - run_child(); - } else - run_parent(); + FAIL("len != 0") + run_parent(); return (0); } diff --git a/tools/regression/sockets/unix_seqpacket/Makefile b/tools/regression/sockets/unix_seqpacket/Makefile new file mode 100644 index 000000000000..3045065245ce --- /dev/null +++ b/tools/regression/sockets/unix_seqpacket/Makefile @@ -0,0 +1,9 @@ +# +# $FreeBSD$ +# + +PROG= unix_seqpacket +CFLAGS+= -Wall -Werror +NO_MAN= + +.include diff --git a/tools/regression/sockets/unix_seqpacket/unix_seqpacket.c b/tools/regression/sockets/unix_seqpacket/unix_seqpacket.c new file mode 100644 index 000000000000..40baa64a76f8 --- /dev/null +++ b/tools/regression/sockets/unix_seqpacket/unix_seqpacket.c @@ -0,0 +1,140 @@ +/*- + * Copyright (c) 2009 Robert N. M. Watson + * All rights reserved. + * + * This software was developed at the University of Cambridge Computer + * Laboratory with support from a grant from Google, Inc. + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include + +#define FAILERR(str) err(-1, "%s: %s", __func__, str) +#define FAILERRX(str) errx(-1, "%s: %s", __func__, str) + +static void +test_socket(void) +{ + int s; + + s = socket(PF_LOCAL, SOCK_SEQPACKET, 0); + if (s < 0) + FAILERR("socket"); + (void)close(s); +} + +static void +test_socketpair(void) +{ + int sv[2]; + + if (socketpair(PF_LOCAL, SOCK_SEQPACKET, 0, sv) < 0) + FAILERR("socketpair"); + (void)close(sv[0]); + (void)close(sv[1]); +} + +static void +test_listen_unbound(void) +{ + int s; + + s = socket(PF_LOCAL, SOCK_SEQPACKET, 0); + if (s < 0) + FAILERR("socket"); + if (listen(s, -1) == 0) + FAILERRX("listen"); + (void)close(s); +} + +static void +test_bind(void) +{ + struct sockaddr_un sun; + char path[PATH_MAX]; + int s; + + snprintf(path, sizeof(path), "/tmp/lds.XXXXXXXXX"); + if (mktemp(path) == NULL) + FAILERR("mktemp"); + s = socket(PF_LOCAL, SOCK_SEQPACKET, 0); + if (s < 0) + FAILERR("socket"); + bzero(&sun, sizeof(sun)); + sun.sun_family = AF_LOCAL; + sun.sun_len = sizeof(sun); + strlcpy(sun.sun_path, path, sizeof(sun.sun_path)); + if (bind(s, (struct sockaddr *)&sun, sizeof(sun)) < 0) + FAILERR("bind"); + close(s); + (void)unlink(path); +} + +static void +test_listen_bound(void) +{ + struct sockaddr_un sun; + char path[PATH_MAX]; + int s; + + snprintf(path, sizeof(path), "/tmp/lds.XXXXXXXXX"); + if (mktemp(path) == NULL) + FAILERR("mktemp"); + s = socket(PF_LOCAL, SOCK_SEQPACKET, 0); + if (s < 0) + FAILERR("socket"); + bzero(&sun, sizeof(sun)); + sun.sun_family = AF_LOCAL; + sun.sun_len = sizeof(sun); + strlcpy(sun.sun_path, path, sizeof(sun.sun_path)); + if (bind(s, (struct sockaddr *)&sun, sizeof(sun)) < 0) + FAILERR("bind"); + if (listen(s, -1)) { + (void)unlink(path); + FAILERR("bind"); + } + close(s); + (void)unlink(path); +} + +int +main(int argc, char *argv[]) +{ + + test_socket(); + test_socketpair(); + test_listen_unbound(); + test_bind(); + test_listen_bound(); +} diff --git a/tools/regression/sockets/unix_seqpacket_exercise/Makefile b/tools/regression/sockets/unix_seqpacket_exercise/Makefile new file mode 100644 index 000000000000..494575b17054 --- /dev/null +++ b/tools/regression/sockets/unix_seqpacket_exercise/Makefile @@ -0,0 +1,9 @@ +# +# $FreeBSD$ +# + +PROG=unix_seqpacket_exercise +CFLAGS+=-Wall -Werror +NO_MAN= + +.include diff --git a/tools/regression/sockets/unix_seqpacket_exercise/unix_seqpacket_exercise.c b/tools/regression/sockets/unix_seqpacket_exercise/unix_seqpacket_exercise.c new file mode 100644 index 000000000000..00eebb4b8946 --- /dev/null +++ b/tools/regression/sockets/unix_seqpacket_exercise/unix_seqpacket_exercise.c @@ -0,0 +1,435 @@ +/*- + * Copyright (c) 2009 Robert N. M. Watson + * All rights reserved. + * + * This software was developed at the University of Cambridge Computer + * Laboratory with support from a grant from Google, Inc. + * + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define min(x, y) (x < y ? x : y) + +#define BUFLEN 32768 + +#define SEQPACKET_RCVBUF (131072-16) +#define SEQPACKET_SNDBUF (131072-16) + +#define FAILERR(str) err(-1, "%s: %s", __func__, str) +#define FAILNERR(str, n) err(-1, "%s %d: %s", __func__, n, str) +#define FAILNMERR(str, n, m) err(-1, "%s %d %d: %s", __func__, n, m, str) +#define FAILERRX(str) errx(-1, "%s: %s", __func__, str) +#define FAILNERRX(str, n) errx(-1, "%s %d: %s", __func__, n, str) +#define FAILNMERRX(str, n, m) errx(-1, "%s %d %d: %s", __func__, n, m, str) + +static int ann = 0; + +#define ANN() (ann ? warnx("%s: start", __func__) : 0) +#define ANNN(n) (ann ? warnx("%s %d: start", __func__, (n)) : 0) +#define ANNNM(n, m) (ann ? warnx("%s %d %d: start", __func__, (n), (m)) : 0) + +#define OK() warnx("%s: ok", __func__) +#define OKN(n) warnx("%s %d: ok", __func__, (n)) +#define OKNM(n, m) warnx("%s %d %d: ok", __func__, (n), (m)) + +#ifdef SO_NOSIGPIPE +#define NEW_SOCKET(s) do { \ + int i; \ + \ + (s) = socket(PF_LOCAL, SOCK_SEQPACKET, 0); \ + if ((s) < 0) \ + FAILERR("socket"); \ + \ + i = 1; \ + if (setsockopt((s), SOL_SOCKET, SO_NOSIGPIPE, &i, sizeof(i)) < 0) \ + FAILERR("setsockopt SO_NOSIGPIPE"); \ + \ + i = SEQPACKET_RCVBUF; \ + if (setsockopt((s), SOL_SOCKET, SO_RCVBUF, &i, sizeof(i)) < 0) \ + FAILERR("setsockopt SO_RCVBUF"); \ + \ + i = SEQPACKET_SNDBUF; \ + if (setsockopt((s), SOL_SOCKET, SO_SNDBUF, &i, sizeof(i)) < 0) \ + FAILERR("setsockopt SO_SNDBUF"); \ +} while (0) +#else +#define NEW_SOCKET(s) do { \ + int i; \ + \ + (s) = socket(PF_LOCAL, SOCK_SEQPACKET, 0); \ + if ((s) < 0) \ + FAILERR("socket"); \ + \ + i = SEQPACKET_RCVBUF; \ + if (setsockopt((s), SOL_SOCKET, SO_RCVBUF, &i, sizeof(i)) < 0) \ + FAILERR("setsockopt SO_RCVBUF"); \ + \ + i = SEQPACKET_SNDBUF; \ + if (setsockopt((s), SOL_SOCKET, SO_SNDBUF, &i, sizeof(i)) < 0) \ + FAILERR("setsockopt SO_SNDBUF"); \ +} while (0) +#endif + +static void +server(int s_listen) +{ + char buffer[BUFLEN]; + ssize_t ssize_recv, ssize_send; + socklen_t socklen; + int i, s_accept; + + while (1) { + s_accept = accept(s_listen, NULL, 0); + if (s_accept >= 0) { + i = SEQPACKET_RCVBUF; + if (setsockopt(s_accept, SOL_SOCKET, SO_RCVBUF, &i, + sizeof(i)) < 0) { + warn("server: setsockopt SO_RCVBUF"); + close(s_accept); + continue; + } + + if (getsockopt(s_accept, SOL_SOCKET, SO_RCVBUF, &i, + &socklen) < 0) { + warn("server: getsockopt SO_RCVBUF"); + close(s_accept); + continue; + } + if (i != SEQPACKET_RCVBUF) { + warnx("server: getsockopt SO_RCVBUF wrong %d", + i); + close(s_accept); + continue; + } + + socklen = sizeof(i); + if (getsockopt(s_accept, SOL_SOCKET, SO_SNDBUF, &i, + &socklen) < 0) { + warn("server: getsockopt SO_SNDBUF"); + close(s_accept); + continue; + } + if (i != SEQPACKET_SNDBUF) { + warnx("server: getsockopt SO_SNDBUF wrong %d", + i); + close(s_accept); + continue; + } + + do { + ssize_recv = recv(s_accept, buffer, + sizeof(buffer), 0); + if (ssize_recv == 0) + break; + if (ssize_recv < 0) { + warn("server: recv"); + break; + } + ssize_send = send(s_accept, buffer, + ssize_recv, 0); + if (ssize_send == 0) + break; + if (ssize_send < 0) { + warn("server: send"); + break; + } + if (ssize_send != ssize_recv) + warnx("server: recv %d sent %d", + ssize_recv, ssize_send); + } while (1); + close(s_accept); + } else + warn("server: accept"); + } +} + +static void +test_connect(struct sockaddr_un *sun) +{ + int s; + + ANN(); + NEW_SOCKET(s); + if (connect(s, (struct sockaddr *)sun, sizeof(*sun)) < 0) + FAILERR("connect"); + (void)close(s); + OK(); +} + +static void +test_connect_send(struct sockaddr_un *sun) +{ + ssize_t ssize; + char ch; + int s; + + ANN(); + NEW_SOCKET(s); + if (connect(s, (struct sockaddr *)sun, sizeof(*sun)) < 0) + FAILERR("connect"); + ssize = send(s, &ch, sizeof(ch), 0); + if (ssize < 0) + FAILERR("send"); + if (ssize != sizeof(ch)) + FAILERRX("send wrong size"); + (void)close(s); + OK(); +} + +static void +test_connect_shutdown_send(struct sockaddr_un *sun) +{ + ssize_t ssize; + char ch; + int s; + + ANN(); + NEW_SOCKET(s); + if (connect(s, (struct sockaddr *)sun, sizeof(*sun)) < 0) + FAILERR("connect"); + if (shutdown(s, SHUT_RDWR) < 0) + FAILERR("shutdown SHUT_RDWR"); + ssize = send(s, &ch, sizeof(ch), 0); + if (ssize >= 0) + FAILERRX("send"); + if (errno != EPIPE) + FAILERR("send unexpected error"); + (void)close(s); + OK(); +} + +static void +test_connect_send_recv(struct sockaddr_un *sun, size_t size) +{ + char buf[size + 4]; /* Detect extra bytes. */ + size_t truncsize; + ssize_t ssize; + int s; + + ANNN(size); + NEW_SOCKET(s); + if (connect(s, (struct sockaddr *)sun, sizeof(*sun)) < 0) + FAILNERR("connect", size); + ssize = send(s, buf, size, 0); + if (ssize < 0 && size >= SEQPACKET_RCVBUF) + goto out; + if (ssize < 0) + FAILNERR("send", size); + if (ssize == 0) + FAILNERR("send eof", size); + if (ssize != size) + FAILNERRX("send size", size); + + truncsize = min(size, BUFLEN); + ssize = recv(s, buf, sizeof(buf), 0); + if (ssize < 0) + FAILNERR("recv", size); + if (ssize == 0) + FAILNERRX("recv eof", size); + if (ssize < truncsize) + FAILNERRX("recv too few bytes", size); + if (ssize > truncsize) + FAILNERRX("recv too many bytes", size); +out: + (void)close(s); + OKN(size); +} + +static void +test_connect_send_recv_count(struct sockaddr_un *sun, int count, size_t size) +{ + char buf[size + 4]; /* Detect extra bytes and coalescing. */ + size_t truncsize; + ssize_t ssize; + int i, s; + + ANNNM(size, count); + NEW_SOCKET(s); + if (connect(s, (struct sockaddr *)sun, sizeof(*sun)) < 0) + FAILNMERR("connect", size, count); + for (i = 0; i < count; i++) { + usleep(5000); + ssize = send(s, buf, size, 0); + if (ssize < 0 && size >= SEQPACKET_RCVBUF) + goto out; + if (ssize < 0) + FAILNMERR("send", size, count); + if (ssize == 0) + FAILNMERRX("send eof", size, count); + if (ssize != size) + FAILNMERRX("send size", size, count); + } + + truncsize = min(size, BUFLEN); + for (i = 0; i < count; i++) { + ssize = recv(s, buf, sizeof(buf), 0); + if (ssize < 0) + FAILNMERR("recv", size, count); + if (ssize == 0) + FAILNMERRX("recv eof", size, count); + if (ssize < truncsize) + FAILNMERRX("recv too few bytes", size, count); + if (ssize > truncsize) + FAILNMERRX("recv too many bytes", size, count); + } +out: + (void)close(s); + OKNM(size, count); +} + +static void +test_sendto(struct sockaddr_un *sun) +{ + ssize_t ssize; + char ch; + int s; + + ANN(); + NEW_SOCKET(s); + ssize = sendto(s, &ch, sizeof(ch), 0, (struct sockaddr *)sun, + sizeof(*sun)); + if (ssize < 0) + FAILERR("sendto"); + (void)close(s); + OK(); +} + +static void +client(struct sockaddr_un *sun) +{ + size_t sizes[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, + 4096, 8192, 16384, 32768, 65536 /*, 131072 */}; + int c, i; + + test_connect(sun); + test_connect_send(sun); + test_connect_shutdown_send(sun); + + /* + * Try a range of sizes and packet counts. + */ + for (i = 0; i < sizeof(sizes) / sizeof(sizes[0]); i++) + test_connect_send_recv(sun, sizes[i]); + for (c = 1; c <= 8; c++) { + for (i = 0; i < sizeof(sizes) / sizeof(sizes[0]); i++) + test_connect_send_recv_count(sun, c, sizes[i]); + } + test_sendto(sun); + printf("client done\n"); +} + +int +main(int argc, char *argv[]) +{ + struct sockaddr_un sun; + char path[PATH_MAX]; + pid_t pid_client, pid_server; + int i, s_listen; + + snprintf(path, sizeof(path), "/tmp/lds_exercise.XXXXXXXXX"); + if (mktemp(path) == NULL) + FAILERR("mktemp"); + + s_listen = socket(PF_LOCAL, SOCK_SEQPACKET, 0); + if (s_listen < 0) { + (void)unlink(path); + FAILERR("socket"); + } + + i = SEQPACKET_RCVBUF; + if (setsockopt(s_listen, SOL_SOCKET, SO_RCVBUF, &i, sizeof(i)) < 0) { + (void)unlink(path); + FAILERR("setsockopt SO_RCVBUF"); + } + + i = SEQPACKET_SNDBUF; + if (setsockopt(s_listen, SOL_SOCKET, SO_SNDBUF, &i, sizeof(i)) < 0) { + (void)unlink(path); + FAILERR("setsockopt SO_SNDBUF"); + } + + i = 1; + if (setsockopt(s_listen, SOL_SOCKET, SO_NOSIGPIPE, &i, sizeof(i)) + < 0) { + (void)unlink(path); + FAILERR("setsockopt SO_NOSIGPIPE"); + } + + bzero(&sun, sizeof(sun)); + sun.sun_len = sizeof(sun); + sun.sun_family = AF_LOCAL; + strlcpy(sun.sun_path, path, sizeof(sun.sun_path)); + + if (bind(s_listen, (struct sockaddr *)&sun, sizeof(sun)) < 0) { + (void)unlink(path); + FAILERR("bind"); + } + + if (listen(s_listen, -1) < 0) { + (void)unlink(path); + FAILERR("listen"); + } + + pid_server = fork(); + if (pid_server < 0) { + (void)unlink(path); + FAILERR("fork"); + } + if (pid_server == 0) { + server(s_listen); + return (0); + } + + pid_client = fork(); + if (pid_client < 0) { + (void)kill(pid_server, SIGKILL); + (void)unlink(path); + FAILERR("fork"); + } + if (pid_client == 0) { + client(&sun); + return (0); + } + + /* + * When the client is done, kill the server and clean up. + */ + (void)waitpid(pid_client, NULL, 0); + (void)kill(pid_server, SIGKILL); + (void)unlink(path); + return (0); +} diff --git a/tools/regression/tls/libxx/Makefile b/tools/regression/tls/libxx/Makefile index bc9393b538e0..cf4e68069f23 100644 --- a/tools/regression/tls/libxx/Makefile +++ b/tools/regression/tls/libxx/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ -LIB= xx -SHLIB_MAJOR= 1 +SHLIB_NAME= libxx.so SRCS= xx.c #CFLAGS+=-mtls-dialect=sun diff --git a/tools/regression/tls/libyy/Makefile b/tools/regression/tls/libyy/Makefile index 8b45b99a29ca..b7a7198cb319 100644 --- a/tools/regression/tls/libyy/Makefile +++ b/tools/regression/tls/libyy/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ -LIB= yy -SHLIB_MAJOR= 1 +SHLIB_NAME= libyy.so SRCS= yy.c CFLAGS+=-fpic diff --git a/tools/regression/tls/ttls1/Makefile b/tools/regression/tls/ttls1/Makefile index d3b6e6521412..f4da549c7e51 100644 --- a/tools/regression/tls/ttls1/Makefile +++ b/tools/regression/tls/ttls1/Makefile @@ -1,8 +1,8 @@ # $FreeBSD$ PROG= ttls1 -LDADD+= -L../libxx -lxx -Wl,--rpath=${.OBJDIR}/../libxx -LDADD+= -L../libyy -lyy -Wl,--rpath=${.OBJDIR}/../libyy +LDFLAGS+= -L../libxx -lxx -Wl,--rpath=${.OBJDIR}/../libxx +LDFLAGS+= -L../libyy -lyy -Wl,--rpath=${.OBJDIR}/../libyy NO_MAN= DEBUG_FLAGS= -g diff --git a/tools/regression/tls/ttls2/Makefile b/tools/regression/tls/ttls2/Makefile index 0a3bc95912e8..043b9cad15a2 100644 --- a/tools/regression/tls/ttls2/Makefile +++ b/tools/regression/tls/ttls2/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG= ttls2 -LDADD+= -lpthread +DPADD= ${LIBPTHREAD} +LDADD= -lpthread NO_MAN= DEBUG_FLAGS= -g diff --git a/tools/regression/tls/ttls4/Makefile b/tools/regression/tls/ttls4/Makefile index 5fb37df580fe..9a38a58e6343 100644 --- a/tools/regression/tls/ttls4/Makefile +++ b/tools/regression/tls/ttls4/Makefile @@ -1,7 +1,8 @@ # $FreeBSD$ PROG= ttls4 -LDADD+= -lpthread +DPADD= ${LIBPTHREAD} +LDADD= -lpthread NO_MAN= DEBUG_FLAGS= -g diff --git a/tools/regression/tmpfs/h_tools.c b/tools/regression/tmpfs/h_tools.c index 1339060bc9a1..6e8a236c6498 100644 --- a/tools/regression/tmpfs/h_tools.c +++ b/tools/regression/tmpfs/h_tools.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -250,10 +251,10 @@ statvfs_main(int argc, char **argv) return EXIT_FAILURE; } - (void)printf("f_bsize=%llu\n", buf.f_bsize); - (void)printf("f_blocks=%llu\n", buf.f_blocks); - (void)printf("f_bfree=%llu\n", buf.f_bfree); - (void)printf("f_files=%llu\n", buf.f_files); + (void)printf("f_bsize=%ju\n", (uintmax_t)buf.f_bsize); + (void)printf("f_blocks=%ju\n", (uintmax_t)buf.f_blocks); + (void)printf("f_bfree=%ju\n", (uintmax_t)buf.f_bfree); + (void)printf("f_files=%ju\n", (uintmax_t)buf.f_files); return EXIT_SUCCESS; } diff --git a/tools/regression/usr.bin/Makefile b/tools/regression/usr.bin/Makefile index 6e6d6f124b1d..364741b2f66c 100644 --- a/tools/regression/usr.bin/Makefile +++ b/tools/regression/usr.bin/Makefile @@ -1,5 +1,8 @@ # $FreeBSD$ -SUBDIR= calendar file2c join jot m4 printf sed tr uudecode uuencode xargs lastcomm +SUBDIR= calendar comm file2c join jot m4 printf sed tr uudecode uuencode xargs +.if !defined(AUTOMATED) +SUBDIR+= lastcomm +.endif .include diff --git a/tools/regression/usr.bin/calendar/regress.sh b/tools/regression/usr.bin/calendar/regress.sh index 743eb95e7f98..70447ca4e8af 100644 --- a/tools/regression/usr.bin/calendar/regress.sh +++ b/tools/regression/usr.bin/calendar/regress.sh @@ -7,31 +7,25 @@ CALENDAR="${CALENDAR_BIN} ${CALENDAR_FILE}" REGRESSION_START($1) -echo 1..4 +echo 1..28 REGRESSION_TEST(`s1',`$CALENDAR -t 29.12.2006') REGRESSION_TEST(`s2',`$CALENDAR -t 30.12.2006') REGRESSION_TEST(`s3',`$CALENDAR -t 31.12.2006') REGRESSION_TEST(`s4',`$CALENDAR -t 01.01.2007') -echo 5..9 - REGRESSION_TEST(`a1',`$CALENDAR -A 3 -t 28.12.2006') REGRESSION_TEST(`a2',`$CALENDAR -A 3 -t 29.12.2006') REGRESSION_TEST(`a3',`$CALENDAR -A 3 -t 30.12.2006') REGRESSION_TEST(`a4',`$CALENDAR -A 3 -t 31.12.2006') REGRESSION_TEST(`a5',`$CALENDAR -A 3 -t 01.01.2007') -echo 10..14 - REGRESSION_TEST(`b1',`$CALENDAR -B 3 -t 31.12.2006') REGRESSION_TEST(`b2',`$CALENDAR -B 3 -t 01.01.2007') REGRESSION_TEST(`b3',`$CALENDAR -B 3 -t 02.01.2007') REGRESSION_TEST(`b4',`$CALENDAR -B 3 -t 03.01.2007') REGRESSION_TEST(`b5',`$CALENDAR -B 3 -t 04.01.2007') -echo 15..21 - REGRESSION_TEST(`w0-1',`$CALENDAR -W 0 -t 28.12.2006') REGRESSION_TEST(`w0-2',`$CALENDAR -W 0 -t 29.12.2006') REGRESSION_TEST(`w0-3',`$CALENDAR -W 0 -t 30.12.2006') @@ -40,8 +34,6 @@ REGRESSION_TEST(`w0-5',`$CALENDAR -W 0 -t 01.01.2007') REGRESSION_TEST(`w0-6',`$CALENDAR -W 0 -t 02.01.2007') REGRESSION_TEST(`w0-7',`$CALENDAR -W 0 -t 03.01.2007') -echo 22..28 - REGRESSION_TEST(`wn-1',`$CALENDAR -W 0 -t 28.12.2006') REGRESSION_TEST(`wn-2',`$CALENDAR -W 1 -t 28.12.2006') REGRESSION_TEST(`wn-3',`$CALENDAR -W 2 -t 28.12.2006') diff --git a/tools/regression/usr.bin/comm/Makefile b/tools/regression/usr.bin/comm/Makefile new file mode 100644 index 000000000000..b937d41a4e4a --- /dev/null +++ b/tools/regression/usr.bin/comm/Makefile @@ -0,0 +1,4 @@ +# $FreeBSD$ + +all: + @m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR} diff --git a/tools/regression/usr.bin/comm/regress.00.out b/tools/regression/usr.bin/comm/regress.00.out new file mode 100644 index 000000000000..89a65daab380 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.00.out @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.00a.in b/tools/regression/usr.bin/comm/regress.00a.in new file mode 100644 index 000000000000..85b5cd53a6bf --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.00a.in @@ -0,0 +1,5 @@ +a b +c d +e f +e f g +h i diff --git a/tools/regression/usr.bin/comm/regress.00b.in b/tools/regression/usr.bin/comm/regress.00b.in new file mode 100644 index 000000000000..89a65daab380 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.00b.in @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.01.out b/tools/regression/usr.bin/comm/regress.01.out new file mode 100644 index 000000000000..05ab154ecba2 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.01.out @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.01a.in b/tools/regression/usr.bin/comm/regress.01a.in new file mode 100644 index 000000000000..78c410b7d759 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.01a.in @@ -0,0 +1,5 @@ +a b +c d +e f +e f g +h i diff --git a/tools/regression/usr.bin/comm/regress.01b.in b/tools/regression/usr.bin/comm/regress.01b.in new file mode 100644 index 000000000000..05ab154ecba2 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.01b.in @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.02.out b/tools/regression/usr.bin/comm/regress.02.out new file mode 100644 index 000000000000..a451adbbb245 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.02.out @@ -0,0 +1,5 @@ +a +b + c + d + e diff --git a/tools/regression/usr.bin/comm/regress.02a.in b/tools/regression/usr.bin/comm/regress.02a.in new file mode 100644 index 000000000000..1c943a988877 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.02a.in @@ -0,0 +1,3 @@ +a +b +c \ No newline at end of file diff --git a/tools/regression/usr.bin/comm/regress.02b.in b/tools/regression/usr.bin/comm/regress.02b.in new file mode 100644 index 000000000000..36019ee78df9 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.02b.in @@ -0,0 +1,3 @@ +c +d +e \ No newline at end of file diff --git a/tools/regression/usr.bin/comm/regress.sh b/tools/regression/usr.bin/comm/regress.sh new file mode 100644 index 000000000000..774093f0c424 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.sh @@ -0,0 +1,13 @@ +# $FreeBSD$ + +LC_ALL=C; export LC_ALL + +echo 1..3 + +REGRESSION_START($1) + +REGRESSION_TEST(`00', `comm -12 regress.00a.in regress.00b.in') +REGRESSION_TEST(`01', `comm -12 regress.01a.in regress.01b.in') +REGRESSION_TEST(`02', `comm regress.02a.in regress.02b.in') + +REGRESSION_END() diff --git a/tools/regression/usr.bin/comm/regress.t b/tools/regression/usr.bin/comm/regress.t new file mode 100644 index 000000000000..a82aacd9886f --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.t @@ -0,0 +1,6 @@ +#!/bin/sh +# $FreeBSD$ + +cd `dirname $0` + +m4 ../regress.m4 regress.sh | sh diff --git a/tools/regression/usr.bin/env/Makefile b/tools/regression/usr.bin/env/Makefile index c019964c3c3a..c20fedd56c0b 100644 --- a/tools/regression/usr.bin/env/Makefile +++ b/tools/regression/usr.bin/env/Makefile @@ -14,4 +14,4 @@ all: # This will probably need a bit more thought... testenv: @ruby regress-sb.rb --rgdata=${.CURDIR}/regress-env.rgdata \ - --testpgm=${TESTPGM} \ No newline at end of file + --testpgm=${TESTPGM} diff --git a/tools/regression/usr.bin/jot/regress.sh b/tools/regression/usr.bin/jot/regress.sh index 33600ff7e058..05afebf15ca5 100644 --- a/tools/regression/usr.bin/jot/regress.sh +++ b/tools/regression/usr.bin/jot/regress.sh @@ -52,8 +52,8 @@ REGRESSION_TEST(`wo', `jot -w "a%ob" 10') REGRESSION_TEST(`wx', `jot -w "a%xb" 10') REGRESSION_TEST(`wX1', `jot -w "a%Xb" 10') REGRESSION_TEST(`wXl', `jot -w "a%Xb" 10 2147483648') -REGRESSION_TEST(`wdl', `jot -w "a%db" 10 2147483648') -REGRESSION_TEST(`wxn', `jot -w "a%xb" 10 -5') +REGRESSION_TEST(`wdl', `jot -w "a%db" 10 2147483648 2>/dev/null') +REGRESSION_TEST(`wxn', `jot -w "a%xb" 10 -5 2>/dev/null') REGRESSION_TEST(`wdn', `jot -w "a%db" 10 -5') REGRESSION_TEST(`wp1', `jot -w "%%%d%%%%" 10') REGRESSION_TEST(`wp2', `jot -w "%d%%d%%" 10') diff --git a/tools/regression/usr.bin/lastcomm/regress.t b/tools/regression/usr.bin/lastcomm/regress.t old mode 100644 new mode 100755 diff --git a/tools/regression/usr.bin/lastcomm/values.sh b/tools/regression/usr.bin/lastcomm/values.sh index ef2e015a86f2..6c2095437e54 100644 --- a/tools/regression/usr.bin/lastcomm/values.sh +++ b/tools/regression/usr.bin/lastcomm/values.sh @@ -12,6 +12,11 @@ run() /usr/bin/time -l -o $1.time "$@" } +if [ `whoami` != "root" ]; then + echo "You need to be root to run this test." + exit 1 +fi + echo Redirecting accounting. mkdir $TMPDIR diff --git a/tools/regression/usr.bin/make/common.sh b/tools/regression/usr.bin/make/common.sh index 34aacf8f22e7..e685ea1197a7 100644 --- a/tools/regression/usr.bin/make/common.sh +++ b/tools/regression/usr.bin/make/common.sh @@ -233,6 +233,12 @@ reset_test() # eval_clean() { + # + # If you have special cleaning needs, provide a 'cleanup' shell script. + # + if [ -n "${TEST_CLEANUP}" ] ; then + . ${SRC_DIR}/cleanup + fi rm -rf ${WORK_DIR} rm -rf ${OUTPUT_DIR} } diff --git a/tools/regression/usr.bin/make/syntax/directive-t0/Makefile b/tools/regression/usr.bin/make/syntax/directive-t0/Makefile new file mode 100644 index 000000000000..0f95a2161164 --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/directive-t0/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ +# +# A typo'ed directive. +# + +.uudef foo + +all: diff --git a/tools/regression/usr.bin/make/syntax/directive-t0/expected.status.1 b/tools/regression/usr.bin/make/syntax/directive-t0/expected.status.1 new file mode 100644 index 000000000000..d00491fd7e5b --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/directive-t0/expected.status.1 @@ -0,0 +1 @@ +1 diff --git a/tools/regression/usr.bin/make/syntax/directive-t0/expected.stderr.1 b/tools/regression/usr.bin/make/syntax/directive-t0/expected.stderr.1 new file mode 100644 index 000000000000..de66fcc37752 --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/directive-t0/expected.stderr.1 @@ -0,0 +1,2 @@ +"Makefile", line 6: Unknown directive +make: fatal errors encountered -- cannot continue diff --git a/tools/regression/usr.bin/make/syntax/directive-t0/expected.stdout.1 b/tools/regression/usr.bin/make/syntax/directive-t0/expected.stdout.1 new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tools/regression/usr.bin/make/syntax/directive-t0/test.t b/tools/regression/usr.bin/make/syntax/directive-t0/test.t new file mode 100644 index 000000000000..4b71de3f56be --- /dev/null +++ b/tools/regression/usr.bin/make/syntax/directive-t0/test.t @@ -0,0 +1,14 @@ +#! /bin/sh +# $FreeBSD$ + +cd `dirname $0` +. ../../common.sh + +# Description +DESC="A typo'ed directive." + +# Run +TEST_N=1 +TEST_1= + +eval_cmd $* diff --git a/tools/regression/usr.bin/make/sysmk/t0/2/1/Makefile b/tools/regression/usr.bin/make/sysmk/t0/2/1/Makefile new file mode 100644 index 000000000000..fc95f46e679e --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t0/2/1/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ +# +# Can we traverse up to / and find a 'mk/sys.mk'? +# +all: + @echo ${DASH_M_DOTDOTDOT} diff --git a/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.status.1 b/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.status.1 new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.status.1 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.stderr.1 b/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.stderr.1 new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.stdout.1 b/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.stdout.1 new file mode 100644 index 000000000000..6f29307aecc3 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t0/2/1/expected.stdout.1 @@ -0,0 +1 @@ +Found_DotDotDot_sys_mk diff --git a/tools/regression/usr.bin/make/sysmk/t0/2/1/test.t b/tools/regression/usr.bin/make/sysmk/t0/2/1/test.t new file mode 100644 index 000000000000..9a781570fd15 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t0/2/1/test.t @@ -0,0 +1,17 @@ +#!/bin/sh + +# $FreeBSD$ + +cd `dirname $0` +. ../../../../common.sh + +# Description +DESC="Can we traverse up to / and find a 'mk/sys.mk'?" + +# Run +TEST_N=1 +TEST_1="-m .../mk" +TEST_MAKE_DIRS="../../mk 755" +TEST_COPY_FILES="../../mk/sys.mk 644" + +eval_cmd $* diff --git a/tools/regression/usr.bin/make/sysmk/t0/mk/sys.mk b/tools/regression/usr.bin/make/sysmk/t0/mk/sys.mk new file mode 100644 index 000000000000..60f195533ed2 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t0/mk/sys.mk @@ -0,0 +1,3 @@ +# $FreeBSD$ + +DASH_M_DOTDOTDOT=Found_DotDotDot_sys_mk diff --git a/tools/regression/usr.bin/make/sysmk/t1/2/1/cleanup b/tools/regression/usr.bin/make/sysmk/t1/2/1/cleanup new file mode 100644 index 000000000000..c3d58b79e422 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t1/2/1/cleanup @@ -0,0 +1,3 @@ +# $FreeBSD$ + +rm -rf ${WORK_DIR}/../../../t0/2/1 diff --git a/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.status.1 b/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.status.1 new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.status.1 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.stderr.1 b/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.stderr.1 new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.stdout.1 b/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.stdout.1 new file mode 100644 index 000000000000..6f29307aecc3 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t1/2/1/expected.stdout.1 @@ -0,0 +1 @@ +Found_DotDotDot_sys_mk diff --git a/tools/regression/usr.bin/make/sysmk/t1/2/1/test.t b/tools/regression/usr.bin/make/sysmk/t1/2/1/test.t new file mode 100644 index 000000000000..ad1584f82d1d --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t1/2/1/test.t @@ -0,0 +1,19 @@ +#!/bin/sh + +# $FreeBSD$ + +cd `dirname $0` +. ../../../../common.sh + +# Description +DESC="Can we traverse up to / and find a 'mk/sys.mk' with -C -m?" + +# Run +TEST_N=1 +TEST_1="-C ../../../t0/2/1 -m .../mk" +TEST_MAKE_DIRS="../../mk 755 ../../../t0/mk 755 ../../../t0/2/1 755" +TEST_COPY_FILES="../../mk/sys.mk 644 ../../../t0/mk/sys.mk 644 ../../../t0/2/1/Makefile 644" +TEST_CLEAN_FILES="../../../t0/2/1" +TEST_CLEANUP=clean-special + +eval_cmd $* diff --git a/tools/regression/usr.bin/make/sysmk/t1/mk/sys.mk b/tools/regression/usr.bin/make/sysmk/t1/mk/sys.mk new file mode 100644 index 000000000000..99b8ecc1d389 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t1/mk/sys.mk @@ -0,0 +1,3 @@ +# $FreeBSD$ + +DASH_M_DOTDOTDOT=Found_WRONG_DotDotDot_sys_mk__with_C_before_m diff --git a/tools/regression/usr.bin/make/sysmk/t2/2/1/cleanup b/tools/regression/usr.bin/make/sysmk/t2/2/1/cleanup new file mode 100644 index 000000000000..c3d58b79e422 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t2/2/1/cleanup @@ -0,0 +1,3 @@ +# $FreeBSD$ + +rm -rf ${WORK_DIR}/../../../t0/2/1 diff --git a/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.status.1 b/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.status.1 new file mode 100644 index 000000000000..573541ac9702 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.status.1 @@ -0,0 +1 @@ +0 diff --git a/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.stderr.1 b/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.stderr.1 new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.stdout.1 b/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.stdout.1 new file mode 100644 index 000000000000..70f1be3c507c --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t2/2/1/expected.stdout.1 @@ -0,0 +1 @@ +Found_DotDotDot_sys_mk__with_m_before_C diff --git a/tools/regression/usr.bin/make/sysmk/t2/2/1/test.t b/tools/regression/usr.bin/make/sysmk/t2/2/1/test.t new file mode 100644 index 000000000000..2c4dff35bde1 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t2/2/1/test.t @@ -0,0 +1,19 @@ +#!/bin/sh + +# $FreeBSD$ + +cd `dirname $0` +. ../../../../common.sh + +# Description +DESC="Can we traverse up to / and find a 'mk/sys.mk' with -m -C?" + +# Run +TEST_N=1 +TEST_1="-m .../mk -C ../../../t0/2/1" +TEST_MAKE_DIRS="../../mk 755 ../../../t0/mk 755 ../../../t0/2/1 755" +TEST_COPY_FILES="../../mk/sys.mk 644 ../../../t0/mk/sys.mk 644 ../../../t0/2/1/Makefile 644" +TEST_CLEAN_FILES="../../../t0/2/1" +TEST_CLEANUP=clean-special + +eval_cmd $* diff --git a/tools/regression/usr.bin/make/sysmk/t2/mk/sys.mk b/tools/regression/usr.bin/make/sysmk/t2/mk/sys.mk new file mode 100644 index 000000000000..55632fdc90a4 --- /dev/null +++ b/tools/regression/usr.bin/make/sysmk/t2/mk/sys.mk @@ -0,0 +1,3 @@ +# $FreeBSD$ + +DASH_M_DOTDOTDOT=Found_DotDotDot_sys_mk__with_m_before_C diff --git a/tools/regression/usr.bin/pkill/pgrep-q.t b/tools/regression/usr.bin/pkill/pgrep-q.t new file mode 100644 index 000000000000..02a89fc1295b --- /dev/null +++ b/tools/regression/usr.bin/pkill/pgrep-q.t @@ -0,0 +1,38 @@ +#!/bin/sh +# $FreeBSD$ + +base=`basename $0` + +echo "1..4" + +name="pgrep -q" +sleep0=`mktemp /tmp/$base.XXXXXX` || exit 1 +sleep1=`mktemp /tmp/$base.XXXXXX` || exit 1 +ln -sf /bin/sleep $sleep0 +$sleep0 5 & +sleep 0.3 +pid=$! +out="`pgrep -q -f $sleep0 2>&1`" +if [ $? -eq 0 ]; then + echo "ok 1 - $name" +else + echo "not ok 1 - $name" +fi +if [ -z "${out}" ]; then + echo "ok 2 - $name" +else + echo "not ok 2 - $name" +fi +out="`pgrep -q -f $sleep1 2>&1`" +if [ $? -ne 0 ]; then + echo "ok 3 - $name" +else + echo "not ok 3 - $name" +fi +if [ -z "${out}" ]; then + echo "ok 4 - $name" +else + echo "not ok 4 - $name" +fi +kill $pid +rm -f $sleep0 $sleep1 diff --git a/tools/regression/usr.bin/pkill/pgrep-t.t b/tools/regression/usr.bin/pkill/pgrep-t.t index 7e81ada75688..c1d0c2a4861d 100644 --- a/tools/regression/usr.bin/pkill/pgrep-t.t +++ b/tools/regression/usr.bin/pkill/pgrep-t.t @@ -11,7 +11,10 @@ if [ "$tty" = "??" ]; then tty="-" ttyshort="-" else - ttyshort=`echo $tty | cut -c 4-` + case $tty in + pts/*) ttyshort=`echo $tty | cut -c 5-` ;; + *) ttyshort=`echo $tty | cut -c 4-` ;; + esac fi sleep=`mktemp /tmp/$base.XXXXXX` || exit 1 ln -sf /bin/sleep $sleep diff --git a/tools/regression/usr.bin/pkill/pkill-t.t b/tools/regression/usr.bin/pkill/pkill-t.t index cbef527cd50b..84a66c30088a 100644 --- a/tools/regression/usr.bin/pkill/pkill-t.t +++ b/tools/regression/usr.bin/pkill/pkill-t.t @@ -11,7 +11,10 @@ if [ "$tty" = "??" ]; then tty="-" ttyshort="-" else - ttyshort=`echo $tty | cut -c 4-` + case $tty in + pts/*) ttyshort=`echo $tty | cut -c 5-` ;; + *) ttyshort=`echo $tty | cut -c 4-` ;; + esac fi sleep=`mktemp /tmp/$base.XXXXXX` || exit 1 ln -sf /bin/sleep $sleep diff --git a/tools/regression/usr.bin/sed/multitest.t b/tools/regression/usr.bin/sed/multitest.t index 67dcded3ec22..a6588ff4b09d 100644 --- a/tools/regression/usr.bin/sed/multitest.t +++ b/tools/regression/usr.bin/sed/multitest.t @@ -50,7 +50,7 @@ main() awk 'END { for (i = 1; i < 15; i++) print "l1_" i}' lines1 awk 'END { for (i = 1; i < 10; i++) print "l2_" i}' lines2 - echo "1..121" + echo "1..129" exec 4>&1 5>&2 tests diff --git a/tools/regression/usr.sbin/sa/regress.t b/tools/regression/usr.sbin/sa/regress.t old mode 100644 new mode 100755 diff --git a/tools/tools/README b/tools/tools/README index c052e7d728f9..8a28d9832b7c 100644 --- a/tools/tools/README +++ b/tools/tools/README @@ -48,6 +48,7 @@ mfc Merge a directory from HEAD to a branch where it does not mid Create a Message-ID database for mailing lists. mwl Tools specific to the Marvell 88W8363 support ncpus Count the number of processors +notescheck Check for missing devices and options in NOTES files. npe Tools specific to the Intel IXP4XXX NPE device nxge A diagnostic tool for the nxge(4) driver pciid Generate src/share/misc/pci_vendors. diff --git a/tools/tools/ath/athdecode/main.c b/tools/tools/ath/athdecode/main.c index e27c4e49bb77..977ae1400f46 100644 --- a/tools/tools/ath/athdecode/main.c +++ b/tools/tools/ath/athdecode/main.c @@ -125,13 +125,13 @@ opmark(FILE *fd, int i, const struct athregrec *r) fprintf(fd, "ar%uReset (done), OK", state.chipnum); break; case AH_MARK_CHIPRESET: - fprintf(fd, "ar%uChipReset, channel %u Mhz", state.chipnum, r->val); + fprintf(fd, "ar%uChipReset, channel %u MHz", state.chipnum, r->val); break; case AH_MARK_PERCAL: - fprintf(fd, "ar%uPerCalibration, channel %u Mhz", state.chipnum, r->val); + fprintf(fd, "ar%uPerCalibration, channel %u MHz", state.chipnum, r->val); break; case AH_MARK_SETCHANNEL: - fprintf(fd, "ar%uSetChannel, channel %u Mhz", state.chipnum, r->val); + fprintf(fd, "ar%uSetChannel, channel %u MHz", state.chipnum, r->val); break; case AH_MARK_ANI_RESET: switch (r->val) { diff --git a/tools/tools/ether_reflect/Makefile b/tools/tools/ether_reflect/Makefile index e3cf2667868e..822643bf497d 100644 --- a/tools/tools/ether_reflect/Makefile +++ b/tools/tools/ether_reflect/Makefile @@ -4,7 +4,7 @@ # A Makefile that builds both the ether_reflect program and its manual page. PROG= ether_reflect - -LDADD+= -lpcap +DPADD= ${LIBPCAP} +LDADD= -lpcap .include diff --git a/tools/tools/mcgrab/Makefile b/tools/tools/mcgrab/Makefile new file mode 100644 index 000000000000..a470227a4a72 --- /dev/null +++ b/tools/tools/mcgrab/Makefile @@ -0,0 +1,6 @@ +# $FreeBSD$ + +PROG_CXX= mcgrab +CFLAGS+= -I${.CURDIR}/../mctest + +.include diff --git a/tools/tools/mctest/mcgrab.1 b/tools/tools/mcgrab/mcgrab.1 similarity index 83% rename from tools/tools/mctest/mcgrab.1 rename to tools/tools/mcgrab/mcgrab.1 index f2b8b347ebc9..1b83f50182e8 100644 --- a/tools/tools/mctest/mcgrab.1 +++ b/tools/tools/mcgrab/mcgrab.1 @@ -25,7 +25,7 @@ .\" $FreeBSD$ .\" .Dd July 9, 2008 -.Dt mcgrab 1 +.Dt MCGRAB 1 .Os .Sh NAME .Nm mcgrab @@ -36,23 +36,27 @@ .Op Fl g Ar group .Op Fl n Ar number .Sh DESCRIPTION -The +The .Nm command implements a multicast test which grabs and holds -N multicast addresses. The purpose of the test is to see what +N multicast addresses. +The purpose of the test is to see what happens when a network interface is no longer able to filter -multicasts in hardware and has to switch to promiscious or -multicast promiscious mode. A successful test does not have any +multicasts in hardware and has to switch to promiscuous or +multicast promiscuous mode. +A successful test does not have any result, but an unsuccessful test will have deleterious side effects. Packet size in bytes. The options are as follows: -.Bl -tag -width ".Fl d Ar argument" +.Bl -tag -width ".Fl i Ar interface" .It Fl i Ar interface -Network interface, which can be found with ifconfig(1). -.It Fl i Ar group -Multicast group +Network interface, which can be found with +.Xr ifconfig 8 . +.It Fl g Ar group +Multicast group. .It Fl n Ar number Number of groups to join. +.El .Sh EXAMPLES The following is an example of a typical usage of the @@ -62,9 +66,9 @@ command: .Dl "mcgrab -i em0 -g 239.255.255.1 -n 1024" .Sh SEE ALSO .Xr mctest 1 , -.Xr ifconfig 8 , .Xr netstat 1 , -.Xr nanosleep 2 . +.Xr nanosleep 2 , +.Xr ifconfig 8 .Sh HISTORY The .Nm @@ -75,4 +79,5 @@ This manual page was written by .An George V. Neville-Neil Aq gnn@FreeBSD.org . .Sh BUGS -Should be reported to the author or to net@freebsd.org. +Should be reported to the author or to +.Aq net@FreeBSD.org . diff --git a/tools/tools/mctest/mcgrab.cc b/tools/tools/mcgrab/mcgrab.cc similarity index 100% rename from tools/tools/mctest/mcgrab.cc rename to tools/tools/mcgrab/mcgrab.cc diff --git a/tools/tools/mctest/Makefile b/tools/tools/mctest/Makefile index 4de93c37d3b9..6edaf89820f3 100644 --- a/tools/tools/mctest/Makefile +++ b/tools/tools/mctest/Makefile @@ -1,11 +1,7 @@ -# # $FreeBSD$ -# -# A Makefile that builds both the mctest program and its manual page. PROG_CXX= mctest -PROG_CXX= mcgrab - -LDADD+= -lpthread +DPADD= ${LIBPTHREAD} +LDADD= -lpthread .include diff --git a/tools/tools/mctest/mctest.1 b/tools/tools/mctest/mctest.1 index 5eb7e5b4fecd..c64a5f80ba85 100644 --- a/tools/tools/mctest/mctest.1 +++ b/tools/tools/mctest/mctest.1 @@ -25,7 +25,7 @@ .\" $FreeBSD$ .\" .Dd April 3, 2008 -.Dt mctest 1 +.Dt MCTEST 1 .Os .Sh NAME .Nm mctest @@ -40,29 +40,34 @@ .Op Fl t Ar inter-packet gap .Op Fl M Ar number of clients (source only) .Op Fl m Ar my client number (sink only) -.Op Fl r +.Op Fl r .Sh DESCRIPTION -The +The .Nm -command implements a multicast test which involved a source -and a sink. The source sends packets to a pre-configured -multicast address over the interface given as a command line -argument. The sink listens for multicast packets, records -the time at which they're received and then reflects them back -over unicast to the source. When the source has captured all +command implements a multicast test which involves a source +and a sink. +The source sends packets to a pre-configured +multicast address over the interface given as a command line +argument. +The sink listens for multicast packets, records +the time at which they are received and then reflects them back +over unicast to the source. +When the source has captured all the reflected packets it prints out the round trip time of each. .Pp The source prints out the round trip time of packets sent to the -sinks. The sink prints out the time between the packets received. +sinks. +The sink prints out the time between the packets received. .Pp The options are as follows: -.Bl -tag -width ".Fl d Ar argument" +.Bl -tag -width ".Fl i Ar interface" .It Fl i Ar interface -Network interface, which can be found with ifconfig(1). +Network interface, which can be found with +.Xr ifconfig 8 . .It Fl g Ar group -Multicast group +Multicast group. .It Fl b Ar base port -Port on which to listen +Port on which to listen. .It Fl s Ar size Packet size in bytes. .It Fl n Ar number @@ -70,14 +75,15 @@ Number of packets. .It Fl t Ar gap Inter-packet gap in nanoseconds. .It Fl M Ar clients -The number of clients that are listening +The number of clients that are listening. .It Fl m Ar my number The client's number 0, 1, etc. .It Fl r This version of .Nm -is the receiver aka the sink. This option MUST -only be used with one copy of the program at a time. +is the receiver aka the sink. +This option MUST +only be used with one copy of the program at a time. .El .Sh EXAMPLES The following is an example of a typical usage @@ -92,14 +98,15 @@ Sink .Pp Send 100 packets of 1024 bytes, with an inter-packet gap of 1 nanosecond. .Pp -Gaps are measured with +Gaps are measured with .Xr nanosleep 2 , and so are not accurate down to nanoseconds -but depend on the setting of kern.hz. +but depend on the setting of +.Va kern.hz . .Sh SEE ALSO -.Xr ifconfig 8 , .Xr netstat 1 , -.Xr nanosleep 2 . +.Xr nanosleep 2 , +.Xr ifconfig 8 .Sh HISTORY The .Nm @@ -110,4 +117,5 @@ This manual page was written by .An George V. Neville-Neil Aq gnn@FreeBSD.org . .Sh BUGS -Should be reported to the author or to net@freebsd.org. +Should be reported to the author or to +.Aq net@FreeBSD.org . diff --git a/tools/tools/mctest/mctest.cc b/tools/tools/mctest/mctest.cc index 7140b62cd723..2bd4b3e8b1b1 100644 --- a/tools/tools/mctest/mctest.cc +++ b/tools/tools/mctest/mctest.cc @@ -368,7 +368,7 @@ int source(char *interface, struct in_addr *group, int pkt_size, args[i].packets = received[i]; args[i].number = number / clients; args[i].client = base_port + i; - if (pthread_create(&thread[i], NULL, server, &args[i]) < 0) { + if (pthread_create(&thread[i], NULL, server, &args[i]) != 0) { perror("failed to create server thread"); return -1; } @@ -393,7 +393,7 @@ int source(char *interface, struct in_addr *group, int pkt_size, } for (int i = 0; i < clients; i++) { - if (pthread_join(thread[i], NULL) < 0) { + if (pthread_join(thread[i], NULL) != 0) { perror("failed to join thread"); return -1; } diff --git a/tools/tools/nanobsd/gateworks/Files/root/.profile b/tools/tools/nanobsd/gateworks/Files/root/.profile index e1efe6b71f3d..83dc9b0cbf10 100644 --- a/tools/tools/nanobsd/gateworks/Files/root/.profile +++ b/tools/tools/nanobsd/gateworks/Files/root/.profile @@ -3,7 +3,7 @@ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:~/bin export PATH HOME=/root; export HOME -TERM=${TERM:-cons25}; export TERM +TERM=${TERM:-xterm}; export TERM PAGER=more; export PAGER #set -o vi diff --git a/tools/tools/nanobsd/nanobsd.sh b/tools/tools/nanobsd/nanobsd.sh index d476ff893920..10d8f78b6c9e 100644 --- a/tools/tools/nanobsd/nanobsd.sh +++ b/tools/tools/nanobsd/nanobsd.sh @@ -439,7 +439,7 @@ create_i386_diskimage ( ) ( -y ${NANO_HEADS}` fi - trap "df -i ${MNT} ; umount ${MNT} || true ; mdconfig -d -u $MD" 1 2 15 EXIT + trap "echo 'Running exit trap code' ; df -i ${MNT} ; umount ${MNT} || true ; mdconfig -d -u $MD" 1 2 15 EXIT fdisk -i -f ${NANO_OBJ}/_.fdisk ${MD} fdisk ${MD} @@ -491,6 +491,9 @@ create_i386_diskimage ( ) ( echo "Writing out _.disk.image..." dd if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k mdconfig -d -u $MD + + trap - 1 2 15 EXIT + ) > ${NANO_OBJ}/_.di 2>&1 ) diff --git a/tools/tools/nanobsd/pcengines/ALIX_DSK b/tools/tools/nanobsd/pcengines/ALIX_DSK new file mode 100644 index 000000000000..b45822e56e81 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/ALIX_DSK @@ -0,0 +1,113 @@ +# +# $FreeBSD$ +# + +cpu I586_CPU +ident ALIX_DSK +makeoptions DEBUG=-g +options CPU_GEODE +options SCHED_ULE +options PREEMPTION +options INET +options INET6 +options FFS +options SOFTUPDATES +options UFS_ACL +options UFS_DIRHASH +options NFSCLIENT +options NFSLOCKD +options MSDOSFS +options CD9660 +options PROCFS +options PSEUDOFS +options GEOM_PART_GPT +options GEOM_LABEL +options COMPAT_43TTY +options COMPAT_FREEBSD7 +options SCSI_DELAY=5000 +options SYSVSHM +options SYSVMSG +options SYSVSEM +options P1003_1B_SEMAPHORES +options _KPOSIX_PRIORITY_SCHEDULING +options PRINTF_BUFR_SIZE=128 +device apic +device pci +device fdc +device ata +device atadisk +device atapicd +device atapist +options ATA_STATIC_ID +device scbus +device da +device sa +device cd +device pass +device uart +device em +device miibus +device vr +device wlan +options IEEE80211_DEBUG +options IEEE80211_AMPDU_AGE +options IEEE80211_SUPPORT_MESH +device wlan_wep +device wlan_ccmp +device wlan_tkip +device wlan_amrr +device an +device ath +device ath_hal +options AH_SUPPORT_AR5416 +device ath_rate_sample +device wi +device loop +device random +device ether +device tun +device pty +device md +device gif +device faith +device firmware +device bpf +device uhci +device ohci +device ehci +device usb +device ulpt +device umass +device u3g +device ubsa +device uftdi + +options INCLUDE_CONFIG_FILE + +options ALTQ +options ALTQ_CBQ +options ALTQ_RED +options ALTQ_RIO +options ALTQ_HFSC +options ALTQ_CDNR +options ALTQ_PRIQ + +device pf +device pflog +device pfsync +device carp +device if_bridge + +options DEVICE_POLLING + +options NETGRAPH +options NETGRAPH_BPF +options NETGRAPH_ETHER +options NETGRAPH_IFACE +options NETGRAPH_PPP +options NETGRAPH_PPPOE +options NETGRAPH_PPTPGRE +options NETGRAPH_MPPC_ENCRYPTION +options NETGRAPH_SOCKET +options NETGRAPH_KSOCKET +options NETGRAPH_VJC diff --git a/tools/tools/nanobsd/pcengines/ALIX_NFS b/tools/tools/nanobsd/pcengines/ALIX_NFS new file mode 100644 index 000000000000..fe911da613f6 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/ALIX_NFS @@ -0,0 +1,121 @@ +# +# $FreeBSD$ +# + +cpu I586_CPU +ident ALIX_DSK +makeoptions DEBUG=-g +options CPU_GEODE +options SCHED_ULE +options PREEMPTION +options INET +options INET6 +options FFS +options SOFTUPDATES +options UFS_ACL +options UFS_DIRHASH +options NFSCLIENT +options NFSLOCKD +options MSDOSFS +options CD9660 +options PROCFS +options PSEUDOFS +options GEOM_PART_GPT +options GEOM_LABEL +options COMPAT_43TTY +options COMPAT_FREEBSD7 +options SCSI_DELAY=5000 +options SYSVSHM +options SYSVMSG +options SYSVSEM +options P1003_1B_SEMAPHORES +options _KPOSIX_PRIORITY_SCHEDULING +options PRINTF_BUFR_SIZE=128 +device apic +device pci +device fdc +device ata +device atadisk +device atapicd +device atapist +options ATA_STATIC_ID +device scbus +device da +device sa +device cd +device pass +device uart +device em +device miibus +device vr +device wlan +options IEEE80211_DEBUG +options IEEE80211_AMPDU_AGE +options IEEE80211_SUPPORT_MESH +device wlan_wep +device wlan_ccmp +device wlan_tkip +device wlan_amrr +device an +device ath +device ath_hal +options AH_SUPPORT_AR5416 +device ath_rate_sample +device wi +device loop +device random +device ether +device tun +device pty +device md +device gif +device faith +device firmware +device bpf +device uhci +device ohci +device ehci +device usb +device ulpt +device umass +device u3g +device ubsa +device uftdi + +options INCLUDE_CONFIG_FILE + +options ALTQ +options ALTQ_CBQ +options ALTQ_RED +options ALTQ_RIO +options ALTQ_HFSC +options ALTQ_CDNR +options ALTQ_PRIQ + +device pf +device pflog +device pfsync +device carp +device if_bridge + +options DEVICE_POLLING + +options NETGRAPH +options NETGRAPH_BPF +options NETGRAPH_ETHER +options NETGRAPH_IFACE +options NETGRAPH_PPP +options NETGRAPH_PPPOE +options NETGRAPH_PPTPGRE +options NETGRAPH_MPPC_ENCRYPTION +options NETGRAPH_SOCKET +options NETGRAPH_KSOCKET +options NETGRAPH_VJC + +options NFS_ROOT +options BOOTP +options BOOTP_NFSROOT +options BOOTP_NFSV3 +#options BOOTP_WIRED_TO=fxp0 +#options BOOTP_WIRED_TO=ath0 +options BOOTP_COMPAT diff --git a/tools/tools/nanobsd/pcengines/Files/etc/rc.conf b/tools/tools/nanobsd/pcengines/Files/etc/rc.conf new file mode 100644 index 000000000000..4db828e4e552 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/etc/rc.conf @@ -0,0 +1,13 @@ +# +# $FreeBSD$ +# + +hostname="alix" +ifconfig_vr0="DHCP" +ifconfig_em0="DHCP" + +sshd_enable="YES" +#ntpdate_enable="YES" +#ntpdate_hosts="1.0.0.0" +#ntpd_enable="YES" +#ntpd_sync_on_start="YES" diff --git a/tools/tools/nanobsd/pcengines/Files/etc/ttys b/tools/tools/nanobsd/pcengines/Files/etc/ttys new file mode 100644 index 000000000000..7d28bad02ee3 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/etc/ttys @@ -0,0 +1,565 @@ +# +# $FreeBSD$ +# @(#)ttys 5.1 (Berkeley) 4/17/89 +# +# This file specifies various information about terminals on the system. +# It is used by several different programs. Common entries for the +# various columns include: +# +# name The name of the terminal device. +# +# getty The program to start running on the terminal. Typically a +# getty program, as the name implies. Other common entries +# include none, when no getty is needed, and xdm, to start the +# X Window System. +# +# type The initial terminal type for this port. For hardwired +# terminal lines, this will contain the type of terminal used. +# For virtual consoles, the correct type is typically xterm, but +# vt220 will work better if you need interoperability with other +# systems like Solaris or GNU/Linux. +# Other common values include network for network connections on +# pseudo-terminals, dialup for incoming modem ports, and unknown +# when the terminal type cannot be predetermined. +# +# status Must be on or off. If on, init will run the getty program on +# the specified port. If the word "secure" appears, this tty +# allows root login. +# +# name getty type status comments +# +# If console is marked "insecure", then init will ask for the root password +# when going to single-user mode. +console none unknown off secure +# +ttyv0 "/usr/libexec/getty Pc" xterm off secure +# Virtual terminals +ttyv1 "/usr/libexec/getty Pc" xterm off secure +ttyv2 "/usr/libexec/getty Pc" xterm off secure +ttyv3 "/usr/libexec/getty Pc" xterm off secure +ttyv4 "/usr/libexec/getty Pc" xterm off secure +ttyv5 "/usr/libexec/getty Pc" xterm off secure +ttyv6 "/usr/libexec/getty Pc" xterm off secure +ttyv7 "/usr/libexec/getty Pc" xterm off secure +ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure +# Serial terminals +# The 'dialup' keyword identifies dialin lines to login, fingerd etc. +ttyu0 "/usr/libexec/getty std.9600" xterm on secure +ttyd1 "/usr/libexec/getty std.9600" dialup off secure +ttyd2 "/usr/libexec/getty std.9600" dialup off secure +ttyd3 "/usr/libexec/getty std.9600" dialup off secure +# Dumb console +dcons "/usr/libexec/getty std.9600" vt100 off secure +# Pseudo terminals +ttyp0 none network +ttyp1 none network +ttyp2 none network +ttyp3 none network +ttyp4 none network +ttyp5 none network +ttyp6 none network +ttyp7 none network +ttyp8 none network +ttyp9 none network +ttypa none network +ttypb none network +ttypc none network +ttypd none network +ttype none network +ttypf none network +ttypg none network +ttyph none network +ttypi none network +ttypj none network +ttypk none network +ttypl none network +ttypm none network +ttypn none network +ttypo none network +ttypp none network +ttypq none network +ttypr none network +ttyps none network +ttypt none network +ttypu none network +ttypv none network +ttyq0 none network +ttyq1 none network +ttyq2 none network +ttyq3 none network +ttyq4 none network +ttyq5 none network +ttyq6 none network +ttyq7 none network +ttyq8 none network +ttyq9 none network +ttyqa none network +ttyqb none network +ttyqc none network +ttyqd none network +ttyqe none network +ttyqf none network +ttyqg none network +ttyqh none network +ttyqi none network +ttyqj none network +ttyqk none network +ttyql none network +ttyqm none network +ttyqn none network +ttyqo none network +ttyqp none network +ttyqq none network +ttyqr none network +ttyqs none network +ttyqt none network +ttyqu none network +ttyqv none network +ttyr0 none network +ttyr1 none network +ttyr2 none network +ttyr3 none network +ttyr4 none network +ttyr5 none network +ttyr6 none network +ttyr7 none network +ttyr8 none network +ttyr9 none network +ttyra none network +ttyrb none network +ttyrc none network +ttyrd none network +ttyre none network +ttyrf none network +ttyrg none network +ttyrh none network +ttyri none network +ttyrj none network +ttyrk none network +ttyrl none network +ttyrm none network +ttyrn none network +ttyro none network +ttyrp none network +ttyrq none network +ttyrr none network +ttyrs none network +ttyrt none network +ttyru none network +ttyrv none network +ttys0 none network +ttys1 none network +ttys2 none network +ttys3 none network +ttys4 none network +ttys5 none network +ttys6 none network +ttys7 none network +ttys8 none network +ttys9 none network +ttysa none network +ttysb none network +ttysc none network +ttysd none network +ttyse none network +ttysf none network +ttysg none network +ttysh none network +ttysi none network +ttysj none network +ttysk none network +ttysl none network +ttysm none network +ttysn none network +ttyso none network +ttysp none network +ttysq none network +ttysr none network +ttyss none network +ttyst none network +ttysu none network +ttysv none network +ttyP0 none network +ttyP1 none network +ttyP2 none network +ttyP3 none network +ttyP4 none network +ttyP5 none network +ttyP6 none network +ttyP7 none network +ttyP8 none network +ttyP9 none network +ttyPa none network +ttyPb none network +ttyPc none network +ttyPd none network +ttyPe none network +ttyPf none network +ttyPg none network +ttyPh none network +ttyPi none network +ttyPj none network +ttyPk none network +ttyPl none network +ttyPm none network +ttyPn none network +ttyPo none network +ttyPp none network +ttyPq none network +ttyPr none network +ttyPs none network +ttyPt none network +ttyPu none network +ttyPv none network +ttyQ0 none network +ttyQ1 none network +ttyQ2 none network +ttyQ3 none network +ttyQ4 none network +ttyQ5 none network +ttyQ6 none network +ttyQ7 none network +ttyQ8 none network +ttyQ9 none network +ttyQa none network +ttyQb none network +ttyQc none network +ttyQd none network +ttyQe none network +ttyQf none network +ttyQg none network +ttyQh none network +ttyQi none network +ttyQj none network +ttyQk none network +ttyQl none network +ttyQm none network +ttyQn none network +ttyQo none network +ttyQp none network +ttyQq none network +ttyQr none network +ttyQs none network +ttyQt none network +ttyQu none network +ttyQv none network +ttyR0 none network +ttyR1 none network +ttyR2 none network +ttyR3 none network +ttyR4 none network +ttyR5 none network +ttyR6 none network +ttyR7 none network +ttyR8 none network +ttyR9 none network +ttyRa none network +ttyRb none network +ttyRc none network +ttyRd none network +ttyRe none network +ttyRf none network +ttyRg none network +ttyRh none network +ttyRi none network +ttyRj none network +ttyRk none network +ttyRl none network +ttyRm none network +ttyRn none network +ttyRo none network +ttyRp none network +ttyRq none network +ttyRr none network +ttyRs none network +ttyRt none network +ttyRu none network +ttyRv none network +ttyS0 none network +ttyS1 none network +ttyS2 none network +ttyS3 none network +ttyS4 none network +ttyS5 none network +ttyS6 none network +ttyS7 none network +ttyS8 none network +ttyS9 none network +ttySa none network +ttySb none network +ttySc none network +ttySd none network +ttySe none network +ttySf none network +ttySg none network +ttySh none network +ttySi none network +ttySj none network +ttySk none network +ttySl none network +ttySm none network +ttySn none network +ttySo none network +ttySp none network +ttySq none network +ttySr none network +ttySs none network +ttySt none network +ttySu none network +ttySv none network +ttyl0 none network +ttyl1 none network +ttyl2 none network +ttyl3 none network +ttyl4 none network +ttyl5 none network +ttyl6 none network +ttyl7 none network +ttyl8 none network +ttyl9 none network +ttyla none network +ttylb none network +ttylc none network +ttyld none network +ttyle none network +ttylf none network +ttylg none network +ttylh none network +ttyli none network +ttylj none network +ttylk none network +ttyll none network +ttylm none network +ttyln none network +ttylo none network +ttylp none network +ttylq none network +ttylr none network +ttyls none network +ttylt none network +ttylu none network +ttylv none network +ttym0 none network +ttym1 none network +ttym2 none network +ttym3 none network +ttym4 none network +ttym5 none network +ttym6 none network +ttym7 none network +ttym8 none network +ttym9 none network +ttyma none network +ttymb none network +ttymc none network +ttymd none network +ttyme none network +ttymf none network +ttymg none network +ttymh none network +ttymi none network +ttymj none network +ttymk none network +ttyml none network +ttymm none network +ttymn none network +ttymo none network +ttymp none network +ttymq none network +ttymr none network +ttyms none network +ttymt none network +ttymu none network +ttymv none network +ttyn0 none network +ttyn1 none network +ttyn2 none network +ttyn3 none network +ttyn4 none network +ttyn5 none network +ttyn6 none network +ttyn7 none network +ttyn8 none network +ttyn9 none network +ttyna none network +ttynb none network +ttync none network +ttynd none network +ttyne none network +ttynf none network +ttyng none network +ttynh none network +ttyni none network +ttynj none network +ttynk none network +ttynl none network +ttynm none network +ttynn none network +ttyno none network +ttynp none network +ttynq none network +ttynr none network +ttyns none network +ttynt none network +ttynu none network +ttynv none network +ttyo0 none network +ttyo1 none network +ttyo2 none network +ttyo3 none network +ttyo4 none network +ttyo5 none network +ttyo6 none network +ttyo7 none network +ttyo8 none network +ttyo9 none network +ttyoa none network +ttyob none network +ttyoc none network +ttyod none network +ttyoe none network +ttyof none network +ttyog none network +ttyoh none network +ttyoi none network +ttyoj none network +ttyok none network +ttyol none network +ttyom none network +ttyon none network +ttyoo none network +ttyop none network +ttyoq none network +ttyor none network +ttyos none network +ttyot none network +ttyou none network +ttyov none network +ttyL0 none network +ttyL1 none network +ttyL2 none network +ttyL3 none network +ttyL4 none network +ttyL5 none network +ttyL6 none network +ttyL7 none network +ttyL8 none network +ttyL9 none network +ttyLa none network +ttyLb none network +ttyLc none network +ttyLd none network +ttyLe none network +ttyLf none network +ttyLg none network +ttyLh none network +ttyLi none network +ttyLj none network +ttyLk none network +ttyLl none network +ttyLm none network +ttyLn none network +ttyLo none network +ttyLp none network +ttyLq none network +ttyLr none network +ttyLs none network +ttyLt none network +ttyLu none network +ttyLv none network +ttyM0 none network +ttyM1 none network +ttyM2 none network +ttyM3 none network +ttyM4 none network +ttyM5 none network +ttyM6 none network +ttyM7 none network +ttyM8 none network +ttyM9 none network +ttyMa none network +ttyMb none network +ttyMc none network +ttyMd none network +ttyMe none network +ttyMf none network +ttyMg none network +ttyMh none network +ttyMi none network +ttyMj none network +ttyMk none network +ttyMl none network +ttyMm none network +ttyMn none network +ttyMo none network +ttyMp none network +ttyMq none network +ttyMr none network +ttyMs none network +ttyMt none network +ttyMu none network +ttyMv none network +ttyN0 none network +ttyN1 none network +ttyN2 none network +ttyN3 none network +ttyN4 none network +ttyN5 none network +ttyN6 none network +ttyN7 none network +ttyN8 none network +ttyN9 none network +ttyNa none network +ttyNb none network +ttyNc none network +ttyNd none network +ttyNe none network +ttyNf none network +ttyNg none network +ttyNh none network +ttyNi none network +ttyNj none network +ttyNk none network +ttyNl none network +ttyNm none network +ttyNn none network +ttyNo none network +ttyNp none network +ttyNq none network +ttyNr none network +ttyNs none network +ttyNt none network +ttyNu none network +ttyNv none network +ttyO0 none network +ttyO1 none network +ttyO2 none network +ttyO3 none network +ttyO4 none network +ttyO5 none network +ttyO6 none network +ttyO7 none network +ttyO8 none network +ttyO9 none network +ttyOa none network +ttyOb none network +ttyOc none network +ttyOd none network +ttyOe none network +ttyOf none network +ttyOg none network +ttyOh none network +ttyOi none network +ttyOj none network +ttyOk none network +ttyOl none network +ttyOm none network +ttyOn none network +ttyOo none network +ttyOp none network +ttyOq none network +ttyOr none network +ttyOs none network +ttyOt none network +ttyOu none network +ttyOv none network diff --git a/tools/tools/nanobsd/pcengines/Files/root/.cshrc b/tools/tools/nanobsd/pcengines/Files/root/.cshrc new file mode 100644 index 000000000000..313af8e2507d --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/.cshrc @@ -0,0 +1,35 @@ +# $FreeBSD$ +# +# .cshrc - csh resource script, read at beginning of execution by each shell +# +# see also csh(1), environ(7). +# + +alias h history 25 +alias j jobs -l +alias la ls -a +alias lf ls -FA +alias ll ls -lA + +# A righteous umask +umask 22 + +set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin) + +setenv EDITOR vi +setenv PAGER more +setenv BLOCKSIZE K + +if ($?prompt) then + # An interactive shell -- set some stuff up + set prompt = "`/bin/hostname -s`# " + set filec + set history = 100 + set savehist = 100 + set mail = (/var/mail/$USER) + if ( $?tcsh ) then + bindkey "^W" backward-delete-word + bindkey -k up history-search-backward + bindkey -k down history-search-forward + endif +endif diff --git a/tools/tools/nanobsd/pcengines/Files/root/.k5login b/tools/tools/nanobsd/pcengines/Files/root/.k5login new file mode 100644 index 000000000000..e01b9417fdbe --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/.k5login @@ -0,0 +1,4 @@ +# $FreeBSD$ +# +# user1/root@YOUR.REALM.WHEREVER +# user2/root@YOUR.REALM.WHEREVER diff --git a/tools/tools/nanobsd/pcengines/Files/root/.login b/tools/tools/nanobsd/pcengines/Files/root/.login new file mode 100644 index 000000000000..3032ef97c762 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/.login @@ -0,0 +1,9 @@ +# $FreeBSD$ +# +# .login - csh login script, read by login shell, after `.cshrc' at login. +# +# see also csh(1), environ(7). +# + +# Uncomment to display a random cookie each login: +# [ -x /usr/games/fortune ] && /usr/games/fortune -s diff --git a/tools/tools/nanobsd/pcengines/Files/root/change_password b/tools/tools/nanobsd/pcengines/Files/root/change_password new file mode 100644 index 000000000000..daf4c8ca0e83 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/change_password @@ -0,0 +1,40 @@ +#!/bin/sh +# +# Copyright (c) 2004-2005 Poul-Henning Kamp. +# 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$ +# + +set -e + +passwd root + +cfgslice=`grep '/cfg' /etc/fstab | cut -d \ -f 1` + +trap "umount /cfg" 1 2 15 EXIT +mount /cfg +cp /etc/master.passwd /etc/passwd /etc/pwd.db /etc/spwd.db /etc/group /cfg +umount /cfg +trap 1 2 15 EXIT diff --git a/tools/tools/nanobsd/pcengines/Files/root/save_cfg b/tools/tools/nanobsd/pcengines/Files/root/save_cfg new file mode 100644 index 000000000000..19f11950c0e0 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/save_cfg @@ -0,0 +1,42 @@ +#!/bin/sh +# +# Copyright (c) 2006 Mathieu Arnold +# 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$ +# + +set -e + +trap "umount /cfg" 1 2 15 EXIT +mount /cfg +( +cd /cfg +for i in "$@" `find * -type f` +do + cmp -s /etc/$i /cfg/$i || cp -pfv /etc/$i /cfg/$i +done +) +umount /cfg +trap 1 2 15 EXIT diff --git a/tools/tools/nanobsd/pcengines/Files/root/save_sshkeys b/tools/tools/nanobsd/pcengines/Files/root/save_sshkeys new file mode 100644 index 000000000000..03fccf4ac0a2 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/save_sshkeys @@ -0,0 +1,40 @@ +#!/bin/sh +# +# Copyright (c) 2004-2005 Poul-Henning Kamp. +# 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$ +# + +set -e + +trap "umount /cfg" 1 2 15 EXIT +mount /cfg +mkdir -p /cfg/ssh +( +cd /etc/ssh +cp ssh_host_* /cfg/ssh +) +umount /cfg +trap 1 2 15 EXIT diff --git a/tools/tools/nanobsd/pcengines/Files/root/updatep1 b/tools/tools/nanobsd/pcengines/Files/root/updatep1 new file mode 100644 index 000000000000..6b83de530a50 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/updatep1 @@ -0,0 +1,54 @@ +#!/bin/sh +# +# Copyright (c) 2004-2005 Poul-Henning Kamp. +# 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$ +# +# Script to update partition 1 on a NanoBSD system. +# +# usage: +# ssh somewhere cat image.s1 | sh updatep1 +# + +set -e + +. /etc/nanobsd.conf + +if mount | grep ${NANO_DRIVE}s1 > /dev/null ; then + echo "You are running partition 1 already" + echo "you probably want to use 'updatep2' instead" + exit 1 +fi + +# Blow away old system. +dd if=/dev/zero of=/dev/${NANO_DRIVE}s1 bs=1m count=1 > /dev/null 2>&1 + +# Copy in new system +dd of=/dev/${NANO_DRIVE}s1 obs=64k + +# Check that it worked +fsck_ffs -n /dev/${NANO_DRIVE}s1a + +gpart set -a active -i 1 ${NANO_DRIVE} diff --git a/tools/tools/nanobsd/pcengines/Files/root/updatep2 b/tools/tools/nanobsd/pcengines/Files/root/updatep2 new file mode 100644 index 000000000000..fc5312be0c46 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/Files/root/updatep2 @@ -0,0 +1,61 @@ +#!/bin/sh +# +# Copyright (c) 2004-2005 Poul-Henning Kamp. +# 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$ +# +# Script to update partition 2 on a NanoBSD system. +# +# usage: +# ssh somewhere cat image.s1 | sh updatep2 +# + +set -e + +. /etc/nanobsd.conf + +if mount | grep ${NANO_DRIVE}s2 > /dev/null ; then + echo "You are running partition 2 already" + echo "you probably want to use 'updatep1' instead" + exit 1 +fi + +# Blow away old system. +dd if=/dev/zero of=/dev/${NANO_DRIVE}s2 bs=1m count=1 > /dev/null 2>&1 + +# Copy in new system +dd of=/dev/${NANO_DRIVE}s2 obs=64k + +# Check that it worked +fsck_ffs -n /dev/${NANO_DRIVE}s2a + +# Update the /etc/fstab +trap "umount /mnt" 1 2 15 EXIT +mount /dev/${NANO_DRIVE}s2a /mnt +sed -i "" "s/${NANO_DRIVE}s1/${NANO_DRIVE}s2/" /mnt/conf/base/etc/fstab +sed -i "" "s/${NANO_DRIVE}s1/${NANO_DRIVE}s2/" /mnt/etc/fstab +umount /mnt +trap 1 2 15 EXIT +gpart set -a active -i 2 ${NANO_DRIVE} diff --git a/tools/tools/nanobsd/pcengines/Files/usr/ports/.keepme b/tools/tools/nanobsd/pcengines/Files/usr/ports/.keepme new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tools/tools/nanobsd/pcengines/alix_dsk.conf b/tools/tools/nanobsd/pcengines/alix_dsk.conf new file mode 100644 index 000000000000..559f6ab45d04 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/alix_dsk.conf @@ -0,0 +1,29 @@ +# +# $FreeBSD$ +# + +NANO_KERNEL=ALIX_DSK +NANO_NAME=alix_dsk +NANO_ARCH=i386 +TARGET_ARCH=i386; export TARGET_ARCH +#TARGET_CPUTYPE=i386; export TARGET_CPUTYPE +#CONF_BUILD="TARGET_ARCH=i386 TARGET_CPUTYPE=i386" +#CONF_INSTALL="TARGET_ARCH=i386 TARGET_CPUTYPE=i386" +#CONF_BUILD="TARGET_ARCH=i386" +#CONF_INSTALL="TARGET_ARCH=i386" +# Phys C/H/S 7964/16/63 +# Log C/H/S 995/128/63 +NANO_MEDIASIZE="8027712" +NANO_SECTS="63" +#PHYS +NANO_HEADS="16" +#LOG +#NANO_HEADS="64" +NANO_IMAGES="2" +# Initialize the second slice =1, or not =0 +NANO_INIT_IMG2="0" +#NANO_BOOT0CFG="-o packet,noupdate -s 1 -m 3" +NANO_BOOT0CFG="-o packet,update,nosetdrv -s 1 -m 3" +NANO_DRIVE=ad0 + +. common.conf diff --git a/tools/tools/nanobsd/pcengines/alix_nfs.conf b/tools/tools/nanobsd/pcengines/alix_nfs.conf new file mode 100644 index 000000000000..745fd4bc2e1f --- /dev/null +++ b/tools/tools/nanobsd/pcengines/alix_nfs.conf @@ -0,0 +1,26 @@ +# +# $FreeBSD$ +# + +NANO_KERNEL=ALIX_NFS +NANO_NAME=alix_nfs +NANO_ARCH=i386 +TARGET_ARCH=i386; export TARGET_ARCH +#TARGET_CPUTYPE=i386; export TARGET_CPUTYPE +#CONF_BUILD="TARGET_ARCH=i386 TARGET_CPUTYPE=i386" +#CONF_INSTALL="TARGET_ARCH=i386 TARGET_CPUTYPE=i386" +#CONF_BUILD="TARGET_ARCH=i386" +#CONF_INSTALL="TARGET_ARCH=i386" +# Phys C/H/S 7964/16/63 +# Log C/H/S 995/128/63 +NANO_MEDIASIZE="8027712" +NANO_SECTS="63" +#PHYS +NANO_HEADS="16" +#LOG +#NANO_HEADS="64" +NANO_IMAGES="2" +NANO_INIT_IMG2="0" +NANO_BOOT0CFG="-o nopacket,noupdate -s 1 -m 3" + +. common.conf diff --git a/tools/tools/nanobsd/pcengines/build.sh b/tools/tools/nanobsd/pcengines/build.sh new file mode 100755 index 000000000000..525b7ba38398 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/build.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# +# $FreeBSD$ +# + +if [ -z "${1}" -o \! -f "${1}" ]; then + echo "Usage: $0 cfg_file [-bhiknw]" + echo "-i : skip image build" + echo "-w : skip buildworld step" + echo "-k : skip buildkernel step" + echo "-b : skip buildworld and buildkernel step" + exit +fi + +CFG="${1}" +shift; + +sh ../nanobsd.sh $* -c ${CFG} diff --git a/tools/tools/nanobsd/pcengines/common.conf b/tools/tools/nanobsd/pcengines/common.conf new file mode 100644 index 000000000000..cfbe8d69e511 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/common.conf @@ -0,0 +1,83 @@ +# +# $FreeBSD$ +# + +NANO_TOOLS=`pwd` +NANO_PACKAGE_DIR=`pwd`/Pkg +#NANO_RAM_TMPVARSIZE=20480 +#NANO_RAM_TMPVARSIZE=30720 +NANO_RAM_TMPVARSIZE=40960 +NANO_PMAKE="make -j 8" + +NANO_MD_BACKING="swap" +#NANO_MAKEFS="makefs \ +# -o bsize=4096,fsize=512,density=8192,optimization=space" +#export NANO_MAKEFS + +# Options to put in make.conf during buildworld only +CONF_BUILD=' +NO_CLEAN=YES +' +# Options to put in make.conf during installworld only +CONF_INSTALL=' +' +# Options to put in make.conf during both build- & installworld. +CONF_WORLD=' +#TARGET_ARCH=i386 +CFLAGS=-O -pipe +WITHOUT_ACPI= +MODULES_OVERRIDE=netgraph rc4 +BOOT_PXELDR_PROBE_KEYBOARD=1 +BOOT_PXELDR_ALWAYS_SERIAL=1 +BOOT_COMCONSOLE_SPEED=9600 +' + +customize_cmd cust_comconsole +customize_cmd cust_allow_ssh_root +customize_cmd cust_install_files +cust_install_machine_files() ( + MACHINE_DIR="${NANO_TOOLS}/Files.${NANO_NAME}" + if [ -d "${MACHINE_DIR}" ]; then + cd ${MACHINE_DIR} + find . -print | grep -Ev '/(CVS|\.svn)' | cpio -dumpv ${NANO_WORLDDIR} + else + echo "${MACHINE_DIR} not found, skipping step" + fi +) +customize_cmd cust_install_machine_files + +cust_ld32_cfg () ( + cd ${NANO_WORLDDIR}/libexec + if [ \! -f ld-elf32.so.1 ]; then + ln -s ld-elf.so.1 ld-elf32.so.1 + fi +) +customize_cmd cust_ld32_cfg + +cust_boot_cfg () ( + cd ${NANO_WORLDDIR} + echo "-S9600 -h" > boot.config + echo "console=\"comconsole\"" > boot/loader.conf + echo "comconsole_speed=\"9600\"" >> boot/loader.conf + echo "hint.acpi.0.disabled=\"1\"" >> boot/loader.conf +) +customize_cmd cust_boot_cfg +customize_cmd cust_pkg +cust_etc_cfg () ( + cd ${NANO_WORLDDIR} + mkdir -pv z/scratch + echo "fs:/usr/ports /usr/ports nfs rw,noauto,noatime,bg,soft,intr,nfsv3 0 0" >> etc/fstab + echo "fs:/mnt/Backup /mnt/Backup nfs rw,noauto,noatime,bg,soft,intr,nfsv3 0 0" >> etc/fstab + echo "fs:/mnt/Ablage /mnt/Ablage nfs rw,noauto,noatime,bg,soft,intr,nfsv3 0 0" >> etc/fstab + echo "/dev/ad1s1a /z/scratch ufs rw,noauto,noatime 0 0" >> etc/fstab +) +customize_cmd cust_etc_cfg + +last_orders () ( + pprint 2 "last orders" + ( + cd ${NANO_WORLDDIR} + touch conf/default/etc/.keepme + touch conf/default/var/.keepme + ) +) diff --git a/tools/tools/nanobsd/pcengines/test.sh b/tools/tools/nanobsd/pcengines/test.sh new file mode 100755 index 000000000000..9997c81f8572 --- /dev/null +++ b/tools/tools/nanobsd/pcengines/test.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# +# $FreeBSD$ +# + +_run () { + case "$1" in + "alix_dsk") + ARG="-cpu pentium" + ARG="$ARG -hda /usr/obj/nanobsd.alix_dsk/_.disk.full -boot c" + ARG="$ARG -hdb /z/scratch/scratch" + ARG="$ARG -net nic,model=e1000" + ARG="$ARG -net tap,ifname=tap0,script=no,downscript=no" + ARG="$ARG -m 1024 -k de -localtime -nographic" + break + ;; + "alix_nfs") + ARG="-cpu pentium" + ARG="$ARG -hda /usr/obj/nanobsd.alix_nfs/_.disk.full -boot c" + ARG="$ARG -hdb /z/scratch/scratch" + ARG="$ARG -net nic,model=e1000" + ARG="$ARG -net tap,ifname=tap0,script=no,downscript=no" + ARG="$ARG -m 1024 -k de -localtime -nographic" + break + ;; + + esac + qemu-system-x86_64 -kernel-kqemu $ARG +} + +_init () { + kldstat -n kqemu || kldload kqemu + kldstat -n aio || kldload aio + kldstat -n if_tap || kldload if_tap + kldstat -n if_bridge || kldload if_bridge + sysctl net.link.tap.up_on_open=1 + ifconfig bridge0 down destroy + ifconfig tap0 down destroy + ifconfig tap0 create up + ifconfig bridge0 create + ifconfig bridge0 addm nfe0 addm tap0 up +} + +_ifup () { + sleep 2; + ifconfig bridge0 -learn nfe0 + ifconfig tap0 up + ifconfig bridge0 up +} + +_clear () { + ifconfig bridge0 down destroy + ifconfig tap0 down destroy +} + +_init +(_ifup) & +_run "$1" +_clear diff --git a/tools/tools/nanobsd/rescue/Files/etc/ttys b/tools/tools/nanobsd/rescue/Files/etc/ttys index c62941fe9e7a..8e72947a73c7 100644 --- a/tools/tools/nanobsd/rescue/Files/etc/ttys +++ b/tools/tools/nanobsd/rescue/Files/etc/ttys @@ -15,7 +15,7 @@ # # type The initial terminal type for this port. For hardwired # terminal lines, this will contain the type of terminal used. -# For virtual consoles, the correct type is typically cons25, but +# For virtual consoles, the correct type is typically xterm, but # vt220 will work better if you need interoperability with other # systems like Solaris or GNU/Linux. # Other common values include network for network connections on @@ -32,15 +32,15 @@ # when going to single-user mode. console none unknown off secure # -ttyv0 "/usr/libexec/getty Pc" cons25 on secure +ttyv0 "/usr/libexec/getty Pc" xterm on secure # Virtual terminals -ttyv1 "/usr/libexec/getty Pc" cons25 on secure -ttyv2 "/usr/libexec/getty Pc" cons25 on secure -ttyv3 "/usr/libexec/getty Pc" cons25 off secure -ttyv4 "/usr/libexec/getty Pc" cons25 off secure -ttyv5 "/usr/libexec/getty Pc" cons25 off secure -ttyv6 "/usr/libexec/getty Pc" cons25 off secure -ttyv7 "/usr/libexec/getty Pc" cons25 off secure +ttyv1 "/usr/libexec/getty Pc" xterm on secure +ttyv2 "/usr/libexec/getty Pc" xterm on secure +ttyv3 "/usr/libexec/getty Pc" xterm off secure +ttyv4 "/usr/libexec/getty Pc" xterm off secure +ttyv5 "/usr/libexec/getty Pc" xterm off secure +ttyv6 "/usr/libexec/getty Pc" xterm off secure +ttyv7 "/usr/libexec/getty Pc" xterm off secure ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure # Serial terminals # The 'dialup' keyword identifies dialin lines to login, fingerd etc. diff --git a/tools/tools/ncpus/acpi.c b/tools/tools/ncpus/acpi.c index 88ec6fc2ed45..5366dc85abe1 100644 --- a/tools/tools/ncpus/acpi.c +++ b/tools/tools/ncpus/acpi.c @@ -247,13 +247,13 @@ static const char * devstate(devinfo_state_t state) { switch (state) { - case DIS_NOTPRESENT: + case DS_NOTPRESENT: return "not-present"; - case DIS_ALIVE: + case DS_ALIVE: return "alive"; - case DIS_ATTACHED: + case DS_ATTACHED: return "attached"; - case DIS_BUSY: + case DS_BUSY: return "busy"; default: return "unknown-state"; @@ -266,8 +266,8 @@ acpi0_check(struct devinfo_dev *dd, void *arg) printf("%s: %s %s\n", __func__, dd->dd_name, devstate(dd->dd_state)); /* NB: device must be present AND attached */ if (strcmp(dd->dd_name, "acpi0") == 0) - return (dd->dd_state == DIS_ATTACHED || - dd->dd_state == DIS_BUSY); + return (dd->dd_state == DS_ATTACHED || + dd->dd_state == DS_BUSY); return devinfo_foreach_device_child(dd, acpi0_check, arg); } diff --git a/tools/tools/net80211/stumbler/Makefile b/tools/tools/net80211/stumbler/Makefile index 69abea7394bc..d7236afe95b0 100644 --- a/tools/tools/net80211/stumbler/Makefile +++ b/tools/tools/net80211/stumbler/Makefile @@ -2,7 +2,7 @@ PROG= stumbler BINDIR= /usr/local/bin -DPADD= ${LIBPCAP} +DPADD= ${LIBPCAP} ${LIBNCURSES} LDADD= -lpcap -lncurses CFLAGS=-g NO_MAN= diff --git a/tools/tools/net80211/w00t/Makefile.inc b/tools/tools/net80211/w00t/Makefile.inc index 0670300a62e2..ecf5517ac524 100644 --- a/tools/tools/net80211/w00t/Makefile.inc +++ b/tools/tools/net80211/w00t/Makefile.inc @@ -3,7 +3,8 @@ W00T= ../libw00t # NB: we get crc32 from -lz DPADD= ${W00T}/libw00t.a ${LIBCRYPTO} ${LIBZ} -LDADD= -L${W00T} -lw00t -lcrypto -lz +LDFLAGS= -L${W00T} +LDADD= -lw00t -lcrypto -lz BINDIR= /usr/local/bin CFLAGS= -g -I${W00T} diff --git a/tools/tools/netrate/http/http.c b/tools/tools/netrate/http/http.c index 5010703b1831..ea9431f1f4e6 100644 --- a/tools/tools/netrate/http/http.c +++ b/tools/tools/netrate/http/http.c @@ -300,15 +300,15 @@ main(int argc, char *argv[]) if (threaded) { if (pthread_barrier_init(&statep->start_barrier, NULL, - numthreads) < 0) - err(-1, "pthread_mutex_init"); + numthreads) != 0) + err(-1, "pthread_barrier_init"); } for (i = 0; i < numthreads; i++) { statep->hwd[i].hwd_count = 0; if (threaded) { if (pthread_create(&statep->hwd[i].hwd_thread, NULL, - http_worker, &statep->hwd[i]) < 0) + http_worker, &statep->hwd[i]) != 0) err(-1, "pthread_create"); } else { curthread = i; @@ -339,7 +339,7 @@ main(int argc, char *argv[]) for (i = 0; i < numthreads; i++) { if (threaded) { if (pthread_join(statep->hwd[i].hwd_thread, NULL) - < 0) + != 0) err(-1, "pthread_join"); } else { pid = waitpid(statep->hwd[i].hwd_pid, NULL, 0); diff --git a/tools/tools/netrate/httpd/httpd.c b/tools/tools/netrate/httpd/httpd.c index 73422b1b3ba6..3e7a67212c20 100644 --- a/tools/tools/netrate/httpd/httpd.c +++ b/tools/tools/netrate/httpd/httpd.c @@ -280,7 +280,7 @@ main(int argc, char *argv[]) for (i = 0; i < THREADS; i++) { if (threaded) { if (pthread_create(&statep->hts[i].hts_thread, NULL, - httpd_worker, &statep->hts[i]) < 0) + httpd_worker, &statep->hts[i]) != 0) err(-1, "pthread_create"); } else { pid = fork(); @@ -299,7 +299,7 @@ main(int argc, char *argv[]) for (i = 0; i < THREADS; i++) { if (threaded) { if (pthread_join(statep->hts[i].hts_thread, NULL) - < 0) + != 0) err(-1, "pthread_join"); } else { pid = waitpid(statep->hts[i].hts_pid, NULL, 0); diff --git a/tools/tools/netrate/juggle/juggle.c b/tools/tools/netrate/juggle/juggle.c index d0bb4968c4f3..67bb23343ddb 100644 --- a/tools/tools/netrate/juggle/juggle.c +++ b/tools/tools/netrate/juggle/juggle.c @@ -301,15 +301,15 @@ juggling_thread(void *arg) fd2 = *(int *)arg; - if (pthread_mutex_lock(&threaded_mtx) < 0) + if (pthread_mutex_lock(&threaded_mtx) != 0) err(-1, "juggling_thread: pthread_mutex_lock"); threaded_child_ready = 1; - if (pthread_cond_signal(&threaded_cond) < 0) + if (pthread_cond_signal(&threaded_cond) != 0) err(-1, "juggling_thread: pthread_cond_signal"); - if (pthread_mutex_unlock(&threaded_mtx) < 0) + if (pthread_mutex_unlock(&threaded_mtx) != 0) err(-1, "juggling_thread: pthread_mutex_unlock"); for (i = 0; i < NUMCYCLES; i++) { @@ -334,21 +334,21 @@ thread_juggle(int fd1, int fd2, int pipeline) threaded_pipeline = pipeline; - if (pthread_mutex_init(&threaded_mtx, NULL) < 0) + if (pthread_mutex_init(&threaded_mtx, NULL) != 0) err(-1, "thread_juggle: pthread_mutex_init"); - if (pthread_create(&thread, NULL, juggling_thread, &fd2) < 0) + if (pthread_create(&thread, NULL, juggling_thread, &fd2) != 0) err(-1, "thread_juggle: pthread_create"); - if (pthread_mutex_lock(&threaded_mtx) < 0) + if (pthread_mutex_lock(&threaded_mtx) != 0) err(-1, "thread_juggle: pthread_mutex_lock"); while (!threaded_child_ready) { - if (pthread_cond_wait(&threaded_cond, &threaded_mtx) < 0) + if (pthread_cond_wait(&threaded_cond, &threaded_mtx) != 0) err(-1, "thread_juggle: pthread_cond_wait"); } - if (pthread_mutex_unlock(&threaded_mtx) < 0) + if (pthread_mutex_unlock(&threaded_mtx) != 0) err(-1, "thread_juggle: pthread_mutex_unlock"); if (clock_gettime(CLOCK_REALTIME, &tstart) < 0) @@ -369,7 +369,7 @@ thread_juggle(int fd1, int fd2, int pipeline) if (clock_gettime(CLOCK_REALTIME, &tfinish) < 0) err(-1, "thread_juggle: clock_gettime"); - if (pthread_join(thread, NULL) < 0) + if (pthread_join(thread, NULL) != 0) err(-1, "thread_juggle: pthread_join"); timespecsub(&tfinish, &tstart); diff --git a/tools/tools/netrate/netsend/netsend.c b/tools/tools/netrate/netsend/netsend.c index 8a335b648d82..5e41f2d743bf 100644 --- a/tools/tools/netrate/netsend/netsend.c +++ b/tools/tools/netrate/netsend/netsend.c @@ -39,12 +39,23 @@ #include #include +/* program arguments */ +struct _a { + int s; + struct timespec interval; + int port, port_max; + long duration; + struct sockaddr_in sin; + int packet_len; + void *packet; +}; + static void usage(void) { fprintf(stderr, - "netsend [ip] [port] [payloadsize] [rate] [duration]\n"); + "netsend [ip] [port[-port_max]] [payloadsize] [packet_rate] [duration]\n"); exit(-1); } @@ -114,26 +125,39 @@ wait_time(struct timespec ts, struct timespec *wakeup_ts, long long *waited) * Calculate a second-aligned starting time for the packet stream. Busy * wait between our calculated interval and dropping the provided packet * into the socket. If we hit our duration limit, bail. + * We sweep the ports from a->port to a->port_max included. + * If the two ports are the same we connect() the socket upfront, which + * almost halves the cost of the sendto() call. */ static int -timing_loop(int s, struct timespec interval, long duration, u_char *packet, - u_int packet_len) +timing_loop(struct _a *a) { struct timespec nexttime, starttime, tmptime; long long waited; u_int32_t counter; long finishtime; long send_errors, send_calls; + /* do not call gettimeofday more than every 20us */ + long minres_ns = 20000; + int ic, gettimeofday_cycles; + int cur_port; if (clock_getres(CLOCK_REALTIME, &tmptime) == -1) { perror("clock_getres"); return (-1); } - if (timespec_ge(&tmptime, &interval)) + if (timespec_ge(&tmptime, &a->interval)) fprintf(stderr, - "warning: interval less than resolution (%jd.%09ld)\n", + "warning: interval (%jd.%09ld) less than resolution (%jd.%09ld)\n", + (intmax_t)a->interval.tv_sec, a->interval.tv_nsec, (intmax_t)tmptime.tv_sec, tmptime.tv_nsec); + if (a->interval.tv_nsec < minres_ns) { + gettimeofday_cycles = minres_ns/(tmptime.tv_nsec + 1); + fprintf(stderr, + "calling time every %d cycles\n", gettimeofday_cycles); + } else + gettimeofday_cycles = 0; if (clock_gettime(CLOCK_REALTIME, &starttime) == -1) { perror("clock_gettime"); @@ -146,15 +170,28 @@ timing_loop(int s, struct timespec interval, long duration, u_char *packet, if (wait_time(starttime, NULL, NULL) == -1) return (-1); nexttime = starttime; - finishtime = starttime.tv_sec + duration; + finishtime = starttime.tv_sec + a->duration; send_errors = send_calls = 0; counter = 0; waited = 0; - while (1) { - timespec_add(&nexttime, &interval); - if (wait_time(nexttime, &tmptime, &waited) == -1) + ic = gettimeofday_cycles; + cur_port = a->port; + if (a->port == a->port_max) { + if (connect(a->s, (struct sockaddr *)&a->sin, sizeof(a->sin))) { + perror("connect"); return (-1); + } + } + while (1) { + int ret; + + timespec_add(&nexttime, &a->interval); + if (--ic <= 0) { + ic = gettimeofday_cycles; + if (wait_time(nexttime, &tmptime, &waited) == -1) + return (-1); + } /* * We maintain and, if there's room, send a counter. Note * that even if the error is purely local, we still increment @@ -164,17 +201,28 @@ timing_loop(int s, struct timespec interval, long duration, u_char *packet, * previous send, the error will turn up the current send * operation, causing the current sequence number also to be * skipped. + * The counter is incremented only on the initial port number, + * so all destinations will see the same set of packets. * * XXXRW: Note alignment assumption. */ - if (packet_len >= 4) { - *((u_int32_t *)packet) = htonl(counter); + if (cur_port == a->port && a->packet_len >= 4) { + *((u_int32_t *)a->packet) = htonl(counter); counter++; } - if (send(s, packet, packet_len, 0) < 0) + if (a->port == a->port_max) { /* socket already bound */ + ret = send(a->s, a->packet, a->packet_len, 0); + } else { + a->sin.sin_port = htons(cur_port++); + if (cur_port > a->port_max) + cur_port = a->port; + ret = sendto(a->s, a->packet, a->packet_len, 0, + (struct sockaddr *)&a->sin, sizeof(a->sin)); + } + if (ret < 0) send_errors++; send_calls++; - if (duration != 0 && tmptime.tv_sec >= finishtime) + if (a->duration != 0 && tmptime.tv_sec >= finishtime) goto done; } @@ -191,11 +239,11 @@ done: tmptime.tv_nsec); printf("send calls: %ld\n", send_calls); printf("send errors: %ld\n", send_errors); - printf("approx send rate: %ld\n", (send_calls - send_errors) / - duration); + printf("approx send rate: %ld pps\n", (send_calls - send_errors) / + a->duration); printf("approx error rate: %ld\n", (send_errors / send_calls)); printf("waited: %lld\n", waited); - printf("approx waits/sec: %lld\n", (long long)(waited / duration)); + printf("approx waits/sec: %lld\n", (long long)(waited / a->duration)); printf("approx wait rate: %lld\n", (long long)(waited / send_calls)); return (0); @@ -204,27 +252,35 @@ done: int main(int argc, char *argv[]) { - long rate, payloadsize, port, duration; - struct timespec interval; - struct sockaddr_in sin; - char *dummy, *packet; - int s; + long rate, payloadsize, port; + char *dummy; + struct _a a; /* arguments */ + + bzero(&a, sizeof(a)); if (argc != 6) usage(); - bzero(&sin, sizeof(sin)); - sin.sin_len = sizeof(sin); - sin.sin_family = AF_INET; - if (inet_aton(argv[1], &sin.sin_addr) == 0) { + a.sin.sin_len = sizeof(a.sin); + a.sin.sin_family = AF_INET; + if (inet_aton(argv[1], &a.sin.sin_addr) == 0) { perror(argv[1]); return (-1); } port = strtoul(argv[2], &dummy, 10); - if (port < 1 || port > 65535 || *dummy != '\0') + if (port < 1 || port > 65535) usage(); - sin.sin_port = htons(port); + if (*dummy != '\0' && *dummy != '-') + usage(); + a.sin.sin_port = htons(port); + a.port = a.port_max = port; + if (*dummy == '-') { /* set high port */ + port = strtoul(dummy + 1, &dummy, 10); + if (port < a.port || port > 65535) + usage(); + a.port_max = port; + } payloadsize = strtoul(argv[3], &dummy, 10); if (payloadsize < 0 || *dummy != '\0') @@ -233,55 +289,51 @@ main(int argc, char *argv[]) fprintf(stderr, "payloadsize > 32768\n"); return (-1); } + a.packet_len = payloadsize; /* * Specify an arbitrary limit. It's exactly that, not selected by - .* any particular strategy. '0' is a special value meaning "blast", + * any particular strategy. '0' is a special value meaning "blast", * and avoids the cost of a timing loop. */ rate = strtoul(argv[4], &dummy, 10); - if (rate < 1 || *dummy != '\0') + if (rate < 0 || *dummy != '\0') usage(); if (rate > MAX_RATE) { - fprintf(stderr, "rate > %d\n", MAX_RATE); + fprintf(stderr, "packet rate at most %d\n", MAX_RATE); return (-1); } - duration = strtoul(argv[5], &dummy, 10); - if (duration < 0 || *dummy != '\0') + a.duration = strtoul(argv[5], &dummy, 10); + if (a.duration < 0 || *dummy != '\0') usage(); - packet = malloc(payloadsize); - if (packet == NULL) { + a.packet = malloc(payloadsize); + if (a.packet == NULL) { perror("malloc"); return (-1); } - bzero(packet, payloadsize); - + bzero(a.packet, payloadsize); if (rate == 0) { - interval.tv_sec = 0; - interval.tv_nsec = 0; + a.interval.tv_sec = 0; + a.interval.tv_nsec = 0; } else if (rate == 1) { - interval.tv_sec = 1; - interval.tv_nsec = 0; + a.interval.tv_sec = 1; + a.interval.tv_nsec = 0; } else { - interval.tv_sec = 0; - interval.tv_nsec = ((1 * 1000000000) / rate); + a.interval.tv_sec = 0; + a.interval.tv_nsec = ((1 * 1000000000) / rate); } - printf("Sending packet of payload size %ld every %jd.%09lds for %ld " - "seconds\n", payloadsize, (intmax_t)interval.tv_sec, - interval.tv_nsec, duration); - s = socket(PF_INET, SOCK_DGRAM, 0); - if (s == -1) { + printf("Sending packet of payload size %ld every %jd.%09lds for %ld " + "seconds\n", payloadsize, (intmax_t)a.interval.tv_sec, + a.interval.tv_nsec, a.duration); + + a.s = socket(PF_INET, SOCK_DGRAM, 0); + if (a.s == -1) { perror("socket"); return (-1); } - if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { - perror("connect"); - return (-1); - } - - return (timing_loop(s, interval, duration, packet, payloadsize)); + return (timing_loop(&a)); } diff --git a/tools/tools/notescheck/Makefile b/tools/tools/notescheck/Makefile new file mode 100644 index 000000000000..8899a0abd96b --- /dev/null +++ b/tools/tools/notescheck/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +SCRIPTS= notescheck.py + +.include diff --git a/tools/tools/notescheck/notescheck.py b/tools/tools/notescheck/notescheck.py new file mode 100644 index 000000000000..5aae2969b905 --- /dev/null +++ b/tools/tools/notescheck/notescheck.py @@ -0,0 +1,361 @@ +#!/usr/local/bin/python +# +# This script analyzes sys/conf/files*, sys/conf/options*, +# sys/conf/NOTES, and sys/*/conf/NOTES and checks for inconsistencies +# such as options or devices that are not specified in any NOTES files +# or MI devices specified in MD NOTES files. +# +# $FreeBSD$ + +import glob +import os.path +import sys + +def usage(): + print >>sys.stderr, "notescheck " + print >>sys.stderr + print >>sys.stderr, "Where 'path' is a path to a kernel source tree." + +# These files are used to determine if a path is a valid kernel source tree. +requiredfiles = ['conf/files', 'conf/options', 'conf/NOTES'] + +# This special platform string is used for managing MI options. +global_platform = 'global' + +# This is a global string that represents the current file and line +# being parsed. +location = "" + +# Format the contents of a set into a sorted, comma-separated string +def format_set(set): + l = [] + for item in set: + l.append(item) + if len(l) == 0: + return "(empty)" + l.sort() + if len(l) == 2: + return "%s and %s" % (l[0], l[1]) + s = "%s" % (l[0]) + if len(l) == 1: + return s + for item in l[1:-1]: + s = "%s, %s" % (s, item) + s = "%s, and %s" % (s, l[-1]) + return s + +# This class actually covers both options and devices. For each named +# option we maintain two different lists. One is the list of +# platforms that the option was defined in via an options or files +# file. The other is the list of platforms that the option was tested +# in via a NOTES file. All options are stored as lowercase since +# config(8) treats the names as case-insensitive. +class Option: + def __init__(self, name): + self.name = name + self.type = None + self.defines = set() + self.tests = set() + + def set_type(self, type): + if self.type is None: + self.type = type + self.type_location = location + elif self.type != type: + print "WARN: Attempt to change type of %s from %s to %s%s" % \ + (self.name, self.type, type, location) + print " Previous type set%s" % (self.type_location) + + def add_define(self, platform): + self.defines.add(platform) + + def add_test(self, platform): + self.tests.add(platform) + + def title(self): + if self.type == 'option': + return 'option %s' % (self.name.upper()) + if self.type == None: + return self.name + return '%s %s' % (self.type, self.name) + + def warn(self): + # If the defined and tested sets are equal, then this option + # is ok. + if self.defines == self.tests: + return + + # If the tested set contains the global platform, then this + # option is ok. + if global_platform in self.tests: + return + + if global_platform in self.defines: + # If the device is defined globally ans is never tested, whine. + if len(self.tests) == 0: + print 'WARN: %s is defined globally but never tested' % \ + (self.title()) + return + + # If the device is defined globally and is tested on + # multiple MD platforms, then it is ok. This often occurs + # for drivers that are shared across multiple, but not + # all, platforms (e.g. acpi, agp). + if len(self.tests) > 1: + return + + # If a device is defined globally but is only tested on a + # single MD platform, then whine about this. + print 'WARN: %s is defined globally but only tested in %s NOTES' % \ + (self.title(), format_set(self.tests)) + return + + # If an option or device is never tested, whine. + if len(self.tests) == 0: + print 'WARN: %s is defined in %s but never tested' % \ + (self.title(), format_set(self.defines)) + return + + # The set of MD platforms where this option is defined, but not tested. + notest = self.defines - self.tests + if len(notest) != 0: + print 'WARN: %s is not tested in %s NOTES' % \ + (self.title(), format_set(notest)) + return + + print 'ERROR: bad state for %s: defined in %s, tested in %s' % \ + (self.title(), format_set(self.defines), format_set(self.tests)) + +# This class maintains a dictionary of options keyed by name. +class Options: + def __init__(self): + self.options = {} + + # Look up the object for a given option by name. If the option + # doesn't already exist, then add a new option. + def find(self, name): + name = name.lower() + if name in self.options: + return self.options[name] + option = Option(name) + self.options[name] = option + return option + + # Warn about inconsistencies + def warn(self): + keys = self.options.keys() + keys.sort() + for key in keys: + option = self.options[key] + option.warn() + +# Global map of options +options = Options() + +# Look for MD NOTES files to build our list of platforms. We ignore +# platforms that do not have a NOTES file. +def find_platforms(tree): + platforms = [] + for file in glob.glob(tree + '*/conf/NOTES'): + if not file.startswith(tree): + print >>sys.stderr, "Bad MD NOTES file %s" %(file) + sys.exit(1) + platforms.append(file[len(tree):].split('/')[0]) + if global_platform in platforms: + print >>sys.stderr, "Found MD NOTES file for global platform" + sys.exit(1) + return platforms + +# Parse a file that has escaped newlines. Any escaped newlines are +# coalesced and each logical line is passed to the callback function. +# This also skips blank lines and comments. +def parse_file(file, callback, *args): + global location + + f = open(file) + current = None + i = 0 + for line in f: + # Update parsing location + i = i + 1 + location = ' at %s:%d' % (file, i) + + # Trim the newline + line = line[:-1] + + # If the previous line had an escaped newline, append this + # line to that. + if current is not None: + line = current + line + current = None + + # If the line ends in a '\', set current to the line (minus + # the escape) and continue. + if len(line) > 0 and line[-1] == '\\': + current = line[:-1] + continue + + # Skip blank lines or lines with only whitespace + if len(line) == 0 or len(line.split()) == 0: + continue + + # Skip comment lines. Any line whose first non-space + # character is a '#' is considered a comment. + if line.split()[0][0] == '#': + continue + + # Invoke the callback on this line + callback(line, *args) + if current is not None: + callback(current, *args) + + location = "" + +# Split a line into words on whitespace with the exception that quoted +# strings are always treated as a single word. +def tokenize(line): + if len(line) == 0: + return [] + + # First, split the line on quote characters. + groups = line.split('"') + + # Ensure we have an even number of quotes. The 'groups' array + # will contain 'number of quotes' + 1 entries, so it should have + # an odd number of entries. + if len(groups) % 2 == 0: + print >>sys.stderr, "Failed to tokenize: %s%s" (line, location) + return [] + + # String split all the "odd" groups since they are not quoted strings. + quoted = False + words = [] + for group in groups: + if quoted: + words.append(group) + quoted = False + else: + for word in group.split(): + words.append(word) + quoted = True + return words + +# Parse a sys/conf/files* file adding defines for any options +# encountered. Note files does not differentiate between options and +# devices. +def parse_files_line(line, platform): + words = tokenize(line) + + # Skip include lines. + if words[0] == 'include': + return + + # Skip standard lines as they have no devices or options. + if words[1] == 'standard': + return + + # Remaining lines better be optional or mandatory lines. + if words[1] != 'optional' and words[1] != 'mandatory': + print >>sys.stderr, "Invalid files line: %s%s" % (line, location) + + # Drop the first two words and begin parsing keywords and devices. + skip = False + for word in words[2:]: + if skip: + skip = False + continue + + # Skip keywords + if word == 'no-obj' or word == 'no-implicit-rule' or \ + word == 'before-depend' or word == 'local' or \ + word == 'no-depend' or word == 'profiling-routine' or \ + word == 'nowerror': + continue + + # Skip keywords and their following argument + if word == 'dependency' or word == 'clean' or \ + word == 'compile-with' or word == 'warning': + skip = True + continue + + # Ignore pipes + if word == '|': + continue + + option = options.find(word) + option.add_define(platform) + +# Parse a sys/conf/options* file adding defines for any options +# encountered. Unlike a files file, options files only add options. +def parse_options_line(line, platform): + # The first word is the option name. + name = line.split()[0] + + # Ignore DEV_xxx options. These are magic options that are + # aliases for 'device xxx'. + if name.startswith('DEV_'): + return + + option = options.find(name) + option.add_define(platform) + option.set_type('option') + +# Parse a sys/conf/NOTES file adding tests for any options or devices +# encountered. +def parse_notes_line(line, platform): + words = line.split() + + # Skip lines with just whitespace + if len(words) == 0: + return + + if words[0] == 'device' or words[0] == 'devices': + option = options.find(words[1]) + option.add_test(platform) + option.set_type('device') + return + + if words[0] == 'option' or words[0] == 'options': + option = options.find(words[1].split('=')[0]) + option.add_test(platform) + option.set_type('option') + return + +def main(argv=None): + if argv is None: + argv = sys.argv + if len(sys.argv) != 2: + usage() + return 2 + + # Ensure the path has a trailing '/'. + tree = sys.argv[1] + if tree[-1] != '/': + tree = tree + '/' + for file in requiredfiles: + if not os.path.exists(tree + file): + print>> sys.stderr, "Kernel source tree missing %s" % (file) + return 1 + + platforms = find_platforms(tree) + + # First, parse global files. + parse_file(tree + 'conf/files', parse_files_line, global_platform) + parse_file(tree + 'conf/options', parse_options_line, global_platform) + parse_file(tree + 'conf/NOTES', parse_notes_line, global_platform) + + # Next, parse MD files. + for platform in platforms: + files_file = tree + 'conf/files.' + platform + if os.path.exists(files_file): + parse_file(files_file, parse_files_line, platform) + options_file = tree + 'conf/options.' + platform + if os.path.exists(options_file): + parse_file(options_file, parse_options_line, platform) + parse_file(tree + platform + '/conf/NOTES', parse_notes_line, platform) + + options.warn() + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/tools/sysbuild/sysbuild.sh b/tools/tools/sysbuild/sysbuild.sh index c3689ab47c9d..009973cca10d 100644 --- a/tools/tools/sysbuild/sysbuild.sh +++ b/tools/tools/sysbuild/sysbuild.sh @@ -41,6 +41,18 @@ if [ `uname -m` = "i386" ] ; then s,s3a,s2a, '` + # Where our build-bits are to be found + FREEBSD_PART=`echo $TARGET_PART | sed 's/s[12]a/s3/'` +elif [ `uname -m` = "amd64" ] ; then + TARGET_PART=`df / | sed ' + 1d + s/[ ].*// + s,/dev/,, + s,s1a,s3a, + s,s2a,s1a, + s,s3a,s2a, + '` + # Where our build-bits are to be found FREEBSD_PART=`echo $TARGET_PART | sed 's/s[12]a/s3/'` else @@ -162,7 +174,7 @@ ports_recurse() ( else ( cd $d - ports_recurse `make -V _DEPEND_DIRS` + ports_recurse `make -V _DEPEND_DIRS ${PORTS_OPTS}` ) echo $d >> /tmp/_.plist fi @@ -195,7 +207,7 @@ ports_build() ( cd /usr/ports cd $p set +e - make clean + make clean ${PORTS_OPTS} if make install ${PORTS_OPTS} ; then if [ "x${PKG_DIR}" != "x" ] ; then make package ${PORTS_OPTS} @@ -217,9 +229,11 @@ ports_prefetch() ( true > /tmp/_.plist ports_recurse $PORTS_WE_WANT + true > /mnt/_.prefetch # Now checksump/fetch them for p in `cat /tmp/_.plist` do + echo "Prefetching $p" >> /mnt/_.prefetch b=`echo $p | tr / _` ( cd $p @@ -434,6 +448,7 @@ if [ "x${OBJ_PATH}" != "x" ] ; then fi log_it Wait for ports prefetch +log_it "(Tail /mnt/_.prefetch for progress)" wait log_it Move filesystems diff --git a/tools/tools/tinybsd/conf/wrap/etc/ttys b/tools/tools/tinybsd/conf/wrap/etc/ttys index d20b7ebbd30c..919bceaa3403 100644 --- a/tools/tools/tinybsd/conf/wrap/etc/ttys +++ b/tools/tools/tinybsd/conf/wrap/etc/ttys @@ -14,7 +14,7 @@ # # type The initial terminal type for this port. For hardwired # terminal lines, this will contain the type of terminal used. -# For virtual consoles, the correct type is typically cons25, but +# For virtual consoles, the correct type is typically xterm, but # vt220 will work better if you need interoperability with other # systems like Solaris or GNU/Linux. # Other common values include network for network connections on @@ -31,22 +31,22 @@ # when going to single-user mode. console none unknown off secure # -ttyv0 "/usr/libexec/getty Pc" cons25 off secure +ttyv0 "/usr/libexec/getty Pc" xterm off secure # Virtual terminals -ttyv1 "/usr/libexec/getty Pc" cons25 off secure -ttyv2 "/usr/libexec/getty Pc" cons25 off secure -ttyv3 "/usr/libexec/getty Pc" cons25 off secure -ttyv4 "/usr/libexec/getty Pc" cons25 off secure -ttyv5 "/usr/libexec/getty Pc" cons25 off secure -ttyv6 "/usr/libexec/getty Pc" cons25 off secure -ttyv7 "/usr/libexec/getty Pc" cons25 off secure -ttyv8 "/usr/X11R6/bin/xdm -nodaemoff" xterm off secure +ttyv1 "/usr/libexec/getty Pc" xterm off secure +ttyv2 "/usr/libexec/getty Pc" xterm off secure +ttyv3 "/usr/libexec/getty Pc" xterm off secure +ttyv4 "/usr/libexec/getty Pc" xterm off secure +ttyv5 "/usr/libexec/getty Pc" xterm off secure +ttyv6 "/usr/libexec/getty Pc" xterm off secure +ttyv7 "/usr/libexec/getty Pc" xterm off secure +ttyv8 "/usr/local/bin/xdm -nodaemoff" xterm off secure # Serial terminals # The 'dialup' keyword identifies dialin lines to login, fingerd etc. -ttyd0 "/usr/libexec/getty std.9600" dialup on secure -ttyd1 "/usr/libexec/getty std.9600" dialup off secure -ttyd2 "/usr/libexec/getty std.9600" dialup off secure -ttyd3 "/usr/libexec/getty std.9600" dialup off secure +ttyu0 "/usr/libexec/getty std.9600" dialup on secure +ttyu1 "/usr/libexec/getty std.9600" dialup off secure +ttyu2 "/usr/libexec/getty std.9600" dialup off secure +ttyu3 "/usr/libexec/getty std.9600" dialup off secure # Dumb console dcons "/usr/libexec/getty std.9600" vt100 off secure # Pseudo terminals diff --git a/tools/tools/tinybsd/tinybsd b/tools/tools/tinybsd/tinybsd index 0f333f7b5745..27216d4d2e3a 100755 --- a/tools/tools/tinybsd/tinybsd +++ b/tools/tools/tinybsd/tinybsd @@ -393,7 +393,7 @@ create_etc() { cd /usr/src/etc/ mkdir -p ${WORKDIR}/var/named/etc/namedb - make distribution DESTDIR=${WORKDIR} + make distribution DESTDIR=${WORKDIR} || exit 1 } create_ssh_keys() { diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 64977431214e..b6fdcae675e4 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -5,7 +5,7 @@ # XXX MISSING: deroff diction graph learn plot # spell spline struct xsend -# XXX Use GNU versions: apropos bc dc diff grep ld man patch whatis +# XXX Use GNU versions: apropos diff grep ld man patch whatis # Moved to secure: bdes # @@ -18,6 +18,7 @@ SUBDIR= alias \ awk \ banner \ basename \ + ${_bc} \ ${_biff} \ ${_bluetooth} \ brandelf \ @@ -49,6 +50,7 @@ SUBDIR= alias \ ${_csup} \ ${_ctags} \ cut \ + ${_dc} \ ${_dig} \ dirname \ du \ @@ -64,7 +66,7 @@ SUBDIR= alias \ ${_file2c} \ find \ finger \ - ${_fmt} \ + fmt \ fold \ ${_from} \ fstat \ @@ -170,6 +172,7 @@ SUBDIR= alias \ ${_rwho} \ script \ sed \ + seq \ shar \ showmount \ ${_smbutil} \ @@ -203,6 +206,7 @@ SUBDIR= alias \ unexpand \ ${_unifdef} \ uniq \ + unzip \ units \ unvis \ ${_usbhidaction} \ @@ -224,6 +228,7 @@ SUBDIR= alias \ who \ whois \ write \ + wtmpcvt \ xargs \ xinstall \ ${_xlint} \ @@ -276,7 +281,9 @@ _hesinfo= hesinfo .endif .if ${MK_OPENSSL} != "no" +_bc= bc _chkey= chkey +_dc= dc _newkey= newkey .if ${MK_LIBTHR} != "no" _csup= csup @@ -290,7 +297,6 @@ _locate= locate # XXX msgs? .if ${MK_MAIL} != "no" _biff= biff -_fmt= fmt _from= from _mail= mail _msgs= msgs @@ -384,4 +390,8 @@ _smbutil= smbutil _smbutil= smbutil .endif +.if ${MACHINE_ARCH} == "sparc64" +_smbutil= smbutil +.endif + .include diff --git a/usr.bin/Makefile.inc b/usr.bin/Makefile.inc index 2ee98c34aab5..534349f25155 100644 --- a/usr.bin/Makefile.inc +++ b/usr.bin/Makefile.inc @@ -3,6 +3,4 @@ BINDIR?= /usr/bin -# Commented out for the time being. -# I intend to make this default at some stage. -#WARNS?= 2 +WARNS?= 6 diff --git a/usr.bin/apply/Makefile b/usr.bin/apply/Makefile index 0355588b3c39..ca0f10a2fce8 100644 --- a/usr.bin/apply/Makefile +++ b/usr.bin/apply/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= apply -WARNS?= 4 .include diff --git a/usr.bin/ar/Makefile b/usr.bin/ar/Makefile index 533f9317d02f..1f00aca1984e 100644 --- a/usr.bin/ar/Makefile +++ b/usr.bin/ar/Makefile @@ -3,8 +3,6 @@ PROG= ar SRCS= ar.c acplex.l acpyacc.y read.c util.c write.c y.tab.h -WARNS?= 5 - DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBELF} LDADD= -larchive -lbz2 -lz -lelf diff --git a/usr.bin/ar/acpyacc.y b/usr.bin/ar/acpyacc.y index bc25b628c68f..b686c3f57475 100644 --- a/usr.bin/ar/acpyacc.y +++ b/usr.bin/ar/acpyacc.y @@ -251,7 +251,7 @@ arscp_open(char *fname) if ((a = archive_read_new()) == NULL) bsdar_errc(bsdar, EX_SOFTWARE, 0, "archive_read_new failed"); archive_read_support_compression_all(a); - archive_read_support_format_all(a); + archive_read_support_format_ar(a); AC(archive_read_open_file(a, fname, DEF_BLKSZ)); if ((r = archive_read_next_header(a, &entry))) bsdar_warnc(bsdar, 0, "%s", archive_error_string(a)); @@ -414,7 +414,7 @@ arscp_extract(struct list *list) /* List modules of archive. (Simple Mode) */ static void -arscp_list() +arscp_list(void) { if (!arscp_target_exist()) @@ -483,7 +483,7 @@ arscp_replace(struct list *list) /* Rename the temporary archive to the target archive. */ static void -arscp_save() +arscp_save(void) { mode_t mask; @@ -512,7 +512,7 @@ arscp_save() * invoking CREATE cmd on current archive. */ static void -arscp_clear() +arscp_clear(void) { char *new_target; @@ -549,7 +549,7 @@ arscp_end(int eval) * issued by user. */ static int -arscp_target_exist() +arscp_target_exist(void) { if (target) @@ -624,7 +624,7 @@ arscp_mlist2argv(struct list *list) /* Free space allocated for argv array and its elements. */ static void -arscp_free_argv() +arscp_free_argv(void) { int i; @@ -636,7 +636,7 @@ arscp_free_argv() /* Show a prompt if we are in interactive mode */ static void -arscp_prompt() +arscp_prompt(void) { if (interactive) { diff --git a/usr.bin/ar/ar.c b/usr.bin/ar/ar.c index 35a0380e3653..dc4b6c4a7606 100644 --- a/usr.bin/ar/ar.c +++ b/usr.bin/ar/ar.c @@ -349,7 +349,7 @@ only_mode(struct bsdar *bsdar, const char *opt, const char *valid_modes) } static void -bsdar_usage() +bsdar_usage(void) { (void)fprintf(stderr, "usage: ar -d [-Tjsvz] archive file ...\n"); @@ -367,7 +367,7 @@ bsdar_usage() } static void -ranlib_usage() +ranlib_usage(void) { (void)fprintf(stderr, "usage: ranlib [-t] archive ...\n"); @@ -376,14 +376,14 @@ ranlib_usage() } static void -bsdar_version() +bsdar_version(void) { (void)printf("BSD ar %s - %s\n", BSDAR_VERSION, archive_version()); exit(EX_OK); } static void -ranlib_version() +ranlib_version(void) { (void)printf("ranlib %s - %s\n", BSDAR_VERSION, archive_version()); exit(EX_OK); diff --git a/usr.bin/ar/read.c b/usr.bin/ar/read.c index a9e2ed103193..37bd0a18932a 100644 --- a/usr.bin/ar/read.c +++ b/usr.bin/ar/read.c @@ -88,7 +88,7 @@ read_archive(struct bsdar *bsdar, char mode) if ((a = archive_read_new()) == NULL) bsdar_errc(bsdar, EX_SOFTWARE, 0, "archive_read_new failed"); archive_read_support_compression_all(a); - archive_read_support_format_all(a); + archive_read_support_format_ar(a); AC(archive_read_open_file(a, bsdar->filename, DEF_BLKSZ)); for (;;) { diff --git a/usr.bin/at/Makefile b/usr.bin/at/Makefile index 47d2574e7f5c..75546fc156fa 100644 --- a/usr.bin/at/Makefile +++ b/usr.bin/at/Makefile @@ -11,6 +11,8 @@ MLINKS= at.1 batch.1 \ at.1 atq.1 \ at.1 atrm.1 +WARNS?= 1 + BINOWN= root BINMODE= 4555 CLEANFILES+= at.1 diff --git a/usr.bin/at/at.c b/usr.bin/at/at.c index 71d8e607f9c9..fbba7bd59027 100644 --- a/usr.bin/at/at.c +++ b/usr.bin/at/at.c @@ -179,7 +179,7 @@ static char *cwdname(void) } static long -nextjob() +nextjob(void) { long jobno; FILE *fid; diff --git a/usr.bin/at/at.man b/usr.bin/at/at.man index bca1051793f5..a87697439f76 100644 --- a/usr.bin/at/at.man +++ b/usr.bin/at/at.man @@ -313,7 +313,7 @@ letter pair is not specified, the value defaults to 0. directory containing job files .It Pa _ATSPOOL_DIR directory containing output spool files -.It Pa /var/run/utmp +.It Pa /var/run/utx.active login records .It Pa _PERM_PATH/at.allow allow permission control @@ -338,7 +338,7 @@ with minor enhancements by .An Joe Halpin Aq joe.halpin@attbi.com . .Sh BUGS If the file -.Pa /var/run/utmp +.Pa /var/run/utx.active is not available or corrupted, or if the user is not logged on at the time .Nm diff --git a/usr.bin/atm/sscop/Makefile b/usr.bin/atm/sscop/Makefile index 16703bb35bd6..36d3dcfc0280 100644 --- a/usr.bin/atm/sscop/Makefile +++ b/usr.bin/atm/sscop/Makefile @@ -6,7 +6,6 @@ CONTRIB= ${.CURDIR}/../../../contrib/ngatm/sscop PROG= sscop SRCS= common.c sscop_main.c -WARNS?= 6 CFLAGS+= -I${CONTRIB} -DUSE_LIBBEGEMOT DPADD= ${LIBBEGEMOT} ${LIBNETGRAPH} ${LIBNGATM} diff --git a/usr.bin/awk/Makefile b/usr.bin/awk/Makefile index 7ec2e575c608..65386365b180 100644 --- a/usr.bin/awk/Makefile +++ b/usr.bin/awk/Makefile @@ -8,6 +8,8 @@ SRCS= awkgram.y b.c lex.c lib.c main.c parse.c proctab.c run.c tran.c ytab.h CFLAGS+= -DHAS_ISBLANK -I. -I${AWKSRC} -DFOPEN_MAX=64 +WARNS?= 1 + DPADD= ${LIBM} LDADD= -lm @@ -25,10 +27,4 @@ proctab.c: maketab build-tools: maketab maketab: ytab.h ${AWKSRC}/maketab.c -.for f in b.c main.c run.c -${f}: ${AWKSRC}/${f} ${.CURDIR}/${f}.diff - patch -s -b .orig -o ${.TARGET} < ${.CURDIR}/${f}.diff ${AWKSRC}/${f} -CLEANFILES+= ${f} -.endfor - .include diff --git a/usr.bin/awk/b.c.diff b/usr.bin/awk/b.c.diff deleted file mode 100644 index 525fcbc37dc5..000000000000 --- a/usr.bin/awk/b.c.diff +++ /dev/null @@ -1,53 +0,0 @@ -$FreeBSD$ - -Index: b.c -=================================================================== -RCS file: /home/ncvs/src/contrib/one-true-awk/b.c,v -retrieving revision 1.1.1.8 -diff -u -p -r1.1.1.8 b.c ---- b.c 16 May 2005 19:11:31 -0000 1.1.1.8 -+++ b.c 16 May 2005 19:12:40 -0000 -@@ -282,9 +282,21 @@ int quoted(char **pp) /* pick up next th - return c; - } - -+static int collate_range_cmp(int a, int b) -+{ -+ static char s[2][2]; -+ -+ if ((uschar)a == (uschar)b) -+ return 0; -+ s[0][0] = a; -+ s[1][0] = b; -+ return (strcoll(s[0], s[1])); -+} -+ - char *cclenter(const char *argp) /* add a character class */ - { - int i, c, c2; -+ int j; - uschar *p = (uschar *) argp; - uschar *op, *bp; - static uschar *buf = 0; -@@ -303,15 +315,18 @@ char *cclenter(const char *argp) /* add - c2 = *p++; - if (c2 == '\\') - c2 = quoted((char **) &p); -- if (c > c2) { /* empty; ignore */ -+ if (collate_range_cmp(c, c2) > 0) { - bp--; - i--; - continue; - } -- while (c < c2) { -+ for (j = 0; j < NCHARS; j++) { -+ if ((collate_range_cmp(c, j) > 0) || -+ collate_range_cmp(j, c2) > 0) -+ continue; - if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, "cclenter1")) - FATAL("out of space for character class [%.10s...] 2", p); -- *bp++ = ++c; -+ *bp++ = j; - i++; - } - continue; diff --git a/usr.bin/awk/main.c.diff b/usr.bin/awk/main.c.diff deleted file mode 100644 index 252cd5ac2421..000000000000 --- a/usr.bin/awk/main.c.diff +++ /dev/null @@ -1,69 +0,0 @@ -$FreeBSD$ - -Index: main.c -=================================================================== -RCS file: /home/ncvs/src/contrib/one-true-awk/main.c,v -retrieving revision 1.1.1.10 -diff -u -p -r1.1.1.10 main.c ---- main.c 16 May 2005 19:11:31 -0000 1.1.1.10 -+++ main.c 15 Sep 2006 13:21:30 -0000 -@@ -22,7 +22,7 @@ ARISING OUT OF OR IN CONNECTION WITH THE - THIS SOFTWARE. - ****************************************************************/ - --const char *version = "version 20070501"; -+const char *version = "version 20070501 (FreeBSD)"; - - #define DEBUG - #include -@@ -58,6 +58,7 @@ int main(int argc, char *argv[]) - const char *fs = NULL; - - setlocale(LC_CTYPE, ""); -+ setlocale(LC_COLLATE, ""); - setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */ - cmdname = argv[0]; - if (argc == 1) { -@@ -79,13 +80,18 @@ int main(int argc, char *argv[]) - safe = 1; - break; - case 'f': /* next argument is program filename */ -- argc--; -- argv++; -- if (argc <= 1) -- FATAL("no program filename"); -- if (npfile >= MAX_PFILE - 1) -- FATAL("too many -f options"); -- pfile[npfile++] = argv[1]; -+ if (argv[1][2] != 0) { /* arg is -fsomething */ -+ if (npfile >= MAX_PFILE - 1) -+ FATAL("too many -f options"); -+ pfile[npfile++] = &argv[1][2]; -+ } else { /* arg is -f something */ -+ argc--; argv++; -+ if (argc <= 1) -+ FATAL("no program filename"); -+ if (npfile >= MAX_PFILE - 1) -+ FATAL("too many -f options"); -+ pfile[npfile++] = argv[1]; -+ } - break; - case 'F': /* set field separator */ - if (argv[1][2] != 0) { /* arg is -Fsomething */ -@@ -104,8 +110,14 @@ int main(int argc, char *argv[]) - WARNING("field separator FS is empty"); - break; - case 'v': /* -v a=1 to be done NOW. one -v for each */ -- if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) -- setclvar(argv[1]); -+ if (argv[1][2] != 0) { /* arg is -vsomething */ -+ if (argv[1][2] != 0) -+ setclvar(&argv[1][2]); -+ } else { /* arg is -v something */ -+ argc--; argv++; -+ if (argc > 1 && isclvar(argv[1])) -+ setclvar(argv[1]); -+ } - break; - case 'm': /* more memory: -mr=record, -mf=fields */ - /* no longer supported */ diff --git a/usr.bin/awk/run.c.diff b/usr.bin/awk/run.c.diff deleted file mode 100644 index d4912507ee5c..000000000000 --- a/usr.bin/awk/run.c.diff +++ /dev/null @@ -1,18 +0,0 @@ -$FreeBSD$ - -Index: run.c -=================================================================== -RCS file: /home/ncvs/src/contrib/one-true-awk/run.c,v -retrieving revision 1.1.1.8 -diff -u -p -r1.1.1.8 run.c ---- run.c 16 May 2005 19:11:35 -0000 1.1.1.8 -+++ run.c 16 May 2005 19:12:47 -0000 -@@ -651,7 +651,7 @@ Cell *relop(Node **a, int n) /* a[0 < a[ - j = x->fval - y->fval; - i = j<0? -1: (j>0? 1: 0); - } else { -- i = strcmp(getsval(x), getsval(y)); -+ i = strcoll(getsval(x), getsval(y)); - } - tempfree(x); - tempfree(y); diff --git a/usr.bin/banner/banner.c b/usr.bin/banner/banner.c index eb96a152f95c..b87aa4089532 100644 --- a/usr.bin/banner/banner.c +++ b/usr.bin/banner/banner.c @@ -1178,7 +1178,7 @@ main(int argc, char *argv[]) } static void -usage() +usage(void) { fprintf(stderr, "usage: banner [-d] [-t] [-w width] message ...\n"); exit(1); diff --git a/usr.bin/bc/Makefile b/usr.bin/bc/Makefile new file mode 100644 index 000000000000..55f465d5c209 --- /dev/null +++ b/usr.bin/bc/Makefile @@ -0,0 +1,14 @@ +# $FreeBSD$ +# $OpenBSD: Makefile,v 1.4 2006/06/30 19:02:28 otto Exp $ + +PROG= bc +SRCS= bc.y scan.l +CFLAGS+= -I. -I${.CURDIR} + +DPADD= ${LIBEDIT} ${LIBTERMCAP} +LDADD= -ledit -ltermcap + +FILES+= bc.library +FILESDIR=${SHAREDIR}/misc + +.include diff --git a/usr.bin/bc/USD.doc/bc b/usr.bin/bc/USD.doc/bc new file mode 100644 index 000000000000..c4e68c679a6b --- /dev/null +++ b/usr.bin/bc/USD.doc/bc @@ -0,0 +1,1241 @@ +.\" $FreeBSD$ +.\" $OpenBSD: bc,v 1.9 2004/07/09 10:23:05 jmc Exp $ +.\" +.\" Copyright (C) Caldera International Inc. 2001-2002. +.\" 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 and documentation 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. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed or owned by Caldera +.\" International, Inc. +.\" 4. Neither the name of Caldera International, Inc. nor the names of other +.\" contributors may be used to endorse or promote products derived from +.\" this software without specific prior written permission. +.\" +.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA +.\" INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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. +.\" +.\" @(#)bc 6.2 (Berkeley) 4/17/91 +.\" +.if n \{\ +.po 5n +.ll 70n +.\} +.EH 'USD:6-%''BC \- An Arbitrary Precision Desk-Calculator Language' +.OH 'BC \- An Arbitrary Precision Desk-Calculator Language''USD:6-%' +.\".RP +.TL +BC \- An Arbitrary Precision Desk-Calculator Language +.AU +Lorinda Cherry +.AU +Robert Morris +.AI +.\" .MH +.AB +BC is a language and a compiler for doing arbitrary precision arithmetic +on the PDP-11 under the +.UX +time-sharing +system. The output of the compiler is interpreted and executed by +a collection of routines which can input, output, and do +arithmetic on indefinitely large integers and on scaled fixed-point +numbers. +.PP +These routines are themselves based on a dynamic storage allocator. +Overflow does not occur until all available core storage +is exhausted. +.PP +The language has a complete control structure as well as immediate-mode +operation. Functions can be defined and saved for later execution. +.PP +Two five hundred-digit numbers can be multiplied to give a +thousand digit result in about ten seconds. +.PP +A small collection of library functions is also available, +including sin, cos, arctan, log, exponential, and Bessel functions of +integer order. +.PP +Some of the uses of this compiler are +.IP \- +to do computation with large integers, +.IP \- +to do computation accurate to many decimal places, +.IP \- +conversion of numbers from one base to another base. +.AE +.PP +.SH +Introduction +.PP +BC is a language and a compiler for doing arbitrary precision +arithmetic on the +.UX +time-sharing system [1]. +The compiler was written to make conveniently available a +collection of routines (called DC [5]) which are capable of doing +arithmetic on integers of arbitrary size. The compiler +is by no means intended to provide a complete programming +language. +It is a minimal language facility. +.PP +There is a scaling provision that permits the +use of decimal point notation. +Provision is made for input and output in bases other than +decimal. Numbers can be converted from decimal to octal by +simply setting the output base to equal 8. +.PP +The actual limit on the number of digits that can +be handled depends on the amount of storage available on the machine. +Manipulation of numbers with many hundreds of digits +is possible even on the smallest versions of +.UX . +.PP +The syntax of BC has been deliberately selected to agree +substantially with the C language [2]. Those who +are familiar with C will find few surprises in this language. +.SH +Simple Computations with Integers +.PP +The simplest kind of statement is an arithmetic expression +on a line by itself. +For instance, if you type in the line: +.DS +.ft B +142857 + 285714 +.ft P +.DE +the program responds immediately with the line +.DS +.ft B +428571 +.ft P +.DE +The operators \-, *, /, %, and ^ can also be used; they +indicate subtraction, multiplication, division, remaindering, and +exponentiation, respectively. Division of integers produces an +integer result truncated toward zero. +Division by zero produces an error +comment. +.PP +Any term in an expression may be prefixed by a minus sign to +indicate that it is to be negated (the `unary' minus sign). +The expression +.DS +.ft B +7+\-3 +.ft P +.DE +is interpreted to mean that \-3 is to be added to 7. +.PP +More complex expressions with several operators and with +parentheses are interpreted just as in +Fortran, with ^ having the greatest binding +power, then * and % and /, and finally + and \-. +Contents of parentheses are evaluated before material +outside the parentheses. +Exponentiations are +performed from right to left and the other operators +from left to right. +The two expressions +.DS +.ft B +a^b^c and a^(b^c) +.ft P +.DE +are equivalent, as are the two expressions +.DS +.ft B +a*b*c and (a*b)*c +.ft P +.DE +BC shares with Fortran and C the undesirable convention that +.DS +\fBa/b*c\fP is equivalent to \fB(a/b)*c\fP +.ft P +.DE +.PP +Internal storage registers to hold numbers have single lower-case +letter names. The value of an expression can be assigned to +a register in the usual way. The statement +.DS +.ft B +x = x + 3 +.ft P +.DE +has the effect of increasing by three the value of the contents of the +register named x. +When, as in this case, the outermost operator is an =, the +assignment is performed but the result is not printed. +Only 26 of these named storage registers are available. +.PP +There is a built-in square root function whose +result is truncated to an integer (but see scaling below). +The lines +.DS +.ft B +x = sqrt(191) +x +.ft P +.DE +produce the printed result +.DS +.ft B +13 +.ft P +.DE +.SH +Bases +.PP +There are special internal quantities, called `ibase' and `obase'. +The contents of `ibase', initially set to 10, +determines the base used for interpreting numbers read in. +For example, the lines +.DS +.ft B +ibase = 8 +11 +.ft P +.DE +will produce the output line +.DS +.ft B +9 +.ft P +.DE +and you are all set up to do octal to decimal conversions. +Beware, however of trying to change the input base back +to decimal by typing +.DS +.ft B +ibase = 10 +.ft P +.DE +Because the number 10 is interpreted as octal, this statement will +have no effect. +For those who deal in hexadecimal notation, +the characters A\-F are permitted in numbers +(no matter what base is in effect) +and are +interpreted as digits having values 10\-15 respectively. +The statement +.DS +.ft B +ibase = A +.ft P +.DE +will change you back to decimal input base no matter what the +current input base is. +Negative and large positive input bases are +permitted but useless. +No mechanism has been provided for the input of arbitrary +numbers in bases less than 1 and greater than 16. +.PP +The contents of `obase', initially set to 10, are used as the base for output +numbers. The lines +.DS +.ft B +obase = 16 +1000 +.ft P +.DE +will produce the output line +.DS +.ft B +3E8 +.ft P +.DE +which is to be interpreted as a 3-digit hexadecimal number. +Very large output bases are permitted, and they are sometimes useful. +For example, large numbers can be output in groups of five digits +by setting `obase' to 100000. +Strange (i.e. 1, 0, or negative) output bases are +handled appropriately. +.PP +Very large numbers are split across lines with 70 characters per line. +Lines which are continued end with \\. +Decimal output conversion is practically instantaneous, but output +of very large numbers (i.e., more than 100 digits) with other bases +is rather slow. +Non-decimal output conversion of +a one hundred digit number takes about +three seconds. +.PP +It is best to remember that `ibase' and `obase' have no effect +whatever on the course of internal computation or +on the evaluation of expressions, but only affect input and +output conversion, respectively. +.SH +Scaling +.PP +A third special internal quantity called `scale' is +used to determine the scale of calculated +quantities. +Numbers may have +up to a specific number of decimal digits after the decimal point. +This fractional part is retained in further computations. +We refer to the number of digits after the decimal point of +a number as its scale. +The current implementation allows scales to be as large as can be +represented by a 32-bit unsigned number minus one. +This is a non-portable extension. +The original implementation allowed for a maximum scale of 99. +.PP +When two scaled numbers are combined by +means of one of the arithmetic operations, the result +has a scale determined by the following rules. For +addition and subtraction, the scale of the result is the larger +of the scales of the two operands. In this case, +there is never any truncation of the result. +For multiplications, the scale of the result is never +less than the maximum of the two scales of the operands, +never more than the sum of the scales of the operands +and, subject to those two restrictions, +the scale of the result is set equal to the contents of the internal +quantity `scale'. +The scale of a quotient is the contents of the internal +quantity `scale'. The scale of a remainder is +the sum of the scales of the quotient and the divisor. +The result of an exponentiation is scaled as if +the implied multiplications were performed. +An exponent must be an integer. +The scale of a square root is set to the maximum of the scale +of the argument and the contents of `scale'. +.PP +All of the internal operations are actually carried out in terms +of integers, with digits being discarded when necessary. +In every case where digits are discarded, truncation and +not rounding is performed. +.PP +The contents of +`scale' must be no greater than +4294967294 and no less than 0. It is initially set to 0. +.PP +The internal quantities `scale', `ibase', and `obase' can be +used in expressions just like other variables. +The line +.DS +.ft B +scale = scale + 1 +.ft P +.DE +increases the value of `scale' by one, and the line +.DS +.ft B +scale +.ft P +.DE +causes the current value of `scale' to be printed. +.PP +The value of `scale' retains its meaning as a +number of decimal digits to be retained in internal +computation even when `ibase' or `obase' are not equal to 10. +The internal computations (which are still conducted in decimal, +regardless of the bases) are performed to the specified number +of decimal digits, never hexadecimal or octal or any +other kind of digits. +.SH +Functions +.PP +The name of a function is a single lower-case letter. +Function names are permitted to collide with simple +variable names. +Twenty-six different defined functions are permitted +in addition to the twenty-six variable names. +The line +.DS +.ft B + define a(x){ +.ft P +.DE +begins the definition of a function with one argument. +This line must be followed by one or more statements, +which make up the body of the function, ending +with a right brace }. +Return of control from a function occurs when a return +statement is executed or when the end of the function is reached. +The return statement can take either +of the two forms +.DS +.ft B +return +return(x) +.ft P +.DE +In the first case, the value of the function is 0, and in +the second, the value of the expression in parentheses. +.PP +Variables used in the function can be declared as automatic +by a statement of the form +.DS +.ft B +auto x,y,z +.ft P +.DE +There can be only one `auto' statement in a function and it must +be the first statement in the definition. +These automatic variables are allocated space and initialized +to zero on entry to the function and thrown away on return. The +values of any variables with the same names outside the function +are not disturbed. +Functions may be called recursively and the automatic variables +at each level of call are protected. +The parameters named in a function definition are treated in +the same way as the automatic variables of that function +with the single exception that they are given a value +on entry to the function. +An example of a function definition is +.DS +.ft B + define a(x,y){ + auto z + z = x*y + return(z) + } +.ft P +.DE +The value of this function, when called, will be the +product of its +two arguments. +.PP +A function is called by the appearance of its name +followed by a string of arguments enclosed in +parentheses and separated by commas. +The result +is unpredictable if the wrong number of arguments is used. +.PP +Functions with no arguments are defined and called using +parentheses with nothing between them: b(). +.PP +If the function +.ft I +a +.ft +above has been defined, then the line +.DS +.ft B +a(7,3.14) +.ft P +.DE +would cause the result 21.98 to be printed and the line +.DS +.ft B +x = a(a(3,4),5) +.ft P +.DE +would cause the value of x to become 60. +.SH +Subscripted Variables +.PP +A single lower-case letter variable name +followed by an expression in brackets is called a subscripted +variable (an array element). +The variable name is called the array name and the expression +in brackets is called the subscript. +Only one-dimensional arrays are +permitted. The names of arrays are permitted to +collide with the names of simple variables and function names. +Any fractional +part of a subscript is discarded before use. +Subscripts must be greater than or equal to zero and +less than or equal to 2047. +.PP +Subscripted variables may be freely used in expressions, in +function calls, and in return statements. +.PP +An array name may be used as an argument to a function, +or may be declared as automatic in +a function definition by the use of empty brackets: +.DS +.ft B +f(a[\|]) +define f(a[\|]) +auto a[\|] +.ft P +.DE +When an array name is so used, the whole contents of the array +are copied for the use of the function, and thrown away on exit +from the function. +Array names which refer to whole arrays cannot be used +in any other contexts. +.SH +Control Statements +.PP +The `if', the `while', and the `for' statements +may be used to alter the flow within programs or to cause iteration. +The range of each of them is a statement or +a compound statement consisting of a collection of +statements enclosed in braces. +They are written in the following way +.DS +.ft B +if(relation) statement +if(relation) statement else statement +while(relation) statement +for(expression1; relation; expression2) statement +.ft P +.DE +or +.DS +.ft B +if(relation) {statements} +if(relation) {statements} else {statements} +while(relation) {statements} +for(expression1; relation; expression2) {statements} +.ft P +.DE +.PP +A relation in one of the control statements is an expression of the form +.DS +.ft B +x>y +.ft P +.DE +where two expressions are related by one of the six relational +operators `<', `>', `<=', `>=', `==', or `!='. +The relation `==' +stands for `equal to' and `!=' stands for `not equal to'. +The meaning of the remaining relational operators is +clear. +.PP +BEWARE of using `=' instead of `==' in a relational. Unfortunately, +both of them are legal, so you will not get a diagnostic +message, but `=' really will not do a comparison. +.PP +The `if' statement causes execution of its range +if and only if the relation is true. +Then control passes to the next statement in sequence. +If an `else' branch is present, the statements in this branch are +executed if the relation is false. +The `else' keyword is a non-portable extension. +.PP +The `while' statement causes execution of its range +repeatedly as long as the relation +is true. The relation is tested before each execution +of its range and if the relation +is false, control passes to the next statement beyond the range +of the while. +.PP +The `for' statement begins +by executing `expression1'. Then the relation is tested +and, if true, the statements in the range of the `for' are executed. +Then `expression2' is executed. The relation is tested, and so on. +The typical use of the `for' statement is for a controlled iteration, +as in the statement +.DS +.ft B +for(i=1; i<=10; i=i+1) i +.ft P +.DE +which will print the integers from 1 to 10. +Here are some examples of the use of the control statements. +.DS +.ft B +define f(n){ +auto i, x +x=1 +for(i=1; i<=n; i=i+1) x=x*i +return(x) +} +.ft P +.DE +The line +.DS +.ft B + f(a) +.ft P +.DE +will print +.ft I +a +.ft +factorial if +.ft I +a +.ft +is a positive integer. +Here is the definition of a function which will +compute values of the binomial coefficient +(m and n are assumed to be positive integers). +.DS +.ft B +define b(n,m){ +auto x, j +x=1 +for(j=1; j<=m; j=j+1) x=x*(n\-j+1)/j +return(x) +} +.ft P +.DE +The following function computes values of the exponential function +by summing the appropriate series +without regard for possible truncation errors: +.DS +.ft B +scale = 20 +define e(x){ + auto a, b, c, d, n + a = 1 + b = 1 + c = 1 + d = 0 + n = 1 + while(1==1){ + a = a*x + b = b*n + c = c + a/b + n = n + 1 + if(c==d) return(c) + d = c + } +} +.ft P +.DE +.SH +Some Details +.PP +There are some language features that every user should know +about even if he will not use them. +.PP +Normally statements are typed one to a line. It is also permissible +to type several statements on a line separated by semicolons. +.PP +If an assignment statement is parenthesized, it then has +a value and it can be used anywhere that an expression can. +For example, the line +.DS +.ft B +(x=y+17) +.ft P +.DE +not only makes the indicated assignment, but also prints the +resulting value. +.PP +Here is an example of a use of the value of an +assignment statement even when it is not parenthesized. +.DS +.ft B +x = a[i=i+1] +.ft P +.DE +causes a value to be assigned to x and also increments i +before it is used as a subscript. +.PP +The following constructs work in BC in exactly the same manner +as they do in the C language. Consult the appendix or the +C manuals [2] for their exact workings. +.DS +.ft B +.ta 2i +x=y=z is the same as x=(y=z) +x += y x = x+y +x \-= y x = x\-y +x *= y x = x*y +x /= y x = x/y +x %= y x = x%y +x ^= y x = x^y +x++ (x=x+1)\-1 +x\-\- (x=x\-1)+1 +++x x = x+1 +\-\-x x = x\-1 +.ft P +.DE +Even if you don't intend to use the constructs, +if you type one inadvertently, something correct but unexpected +may happen. +.SH +Three Important Things +.PP +1. To exit a BC program, type `quit'. +.PP +2. There is a comment convention identical to that of C and +of PL/I. Comments begin with `/*' and end with `*/'. +As a non-portable extension, comments may also start with a `#' and end with +a newline. +The newline is not part of the comment. +.PP +3. There is a library of math functions which may be obtained by +typing at command level +.DS +.ft B +bc \-l +.ft P +.DE +This command will load a set of library functions +which, at the time of writing, consists of sine (named `s'), +cosine (`c'), arctangent (`a'), natural logarithm (`l'), +exponential (`e') and Bessel functions of integer order (`j(n,x)'). Doubtless more functions will be added +in time. +The library sets the scale to 20. You can reset it to something +else if you like. +The design of these mathematical library routines +is discussed elsewhere [3]. +.PP +If you type +.DS +.ft B +bc file ... +.ft P +.DE +BC will read and execute the named file or files before accepting +commands from the keyboard. In this way, you may load your +favorite programs and function definitions. +.SH +Acknowledgement +.PP +The compiler is written in YACC [4]; its original +version was written by S. C. Johnson. +.SH +References +.IP [1] +K. Thompson and D. M. Ritchie, +.ft I +UNIX Programmer's Manual, +.ft +Bell Laboratories, +1978. +.IP [2] +B. W. Kernighan and +D. M. Ritchie, +.ft I +The C Programming Language, +.ft +Prentice-Hall, 1978. +.IP [3] +R. Morris, +.ft I +A Library of Reference Standard Mathematical Subroutines, +.ft +Bell Laboratories internal memorandum, 1975. +.IP [4] +S. C. Johnson, +.ft I +YACC \(em Yet Another Compiler-Compiler. +.ft +Bell Laboratories Computing Science Technical Report #32, 1978. +.IP [5] +R. Morris and L. L. Cherry, +.ft I +DC \- An Interactive Desk Calculator. +.ft +.LP +.bp +.ft B +.DS C +Appendix +.DE +.ft +.NH +Notation +.PP +In the following pages syntactic categories are in \fIitalics\fP; +literals are in \fBbold\fP; material in brackets [\|] is optional. +.NH +Tokens +.PP +Tokens consist of keywords, identifiers, constants, operators, +and separators. +Token separators may be blanks, tabs or comments. +Newline characters or semicolons separate statements. +.NH 2 +Comments +.PP +Comments are introduced by the characters /* and terminated by +*/. +As a non-portable extension, comments may also start with a # and +end with a newline. +The newline is not part of the comment. +.NH 2 +Identifiers +.PP +There are three kinds of identifiers \- ordinary identifiers, array identifiers +and function identifiers. +All three types consist of single lower-case letters. +Array identifiers are followed by square brackets, possibly +enclosing an expression describing a subscript. +Arrays are singly dimensioned and may contain up to 2048 +elements. +Indexing begins at zero so an array may be indexed from 0 to 2047. +Subscripts are truncated to integers. +Function identifiers are followed by parentheses, possibly enclosing arguments. +The three types of identifiers do not conflict; +a program can have a variable named \fBx\fP, +an array named \fBx\fP and a function named \fBx\fP, all of which are separate and +distinct. +.NH 2 +Keywords +.PP +The following are reserved keywords: +.ft B +.ta .5i 1.0i +.nf + ibase if + obase break + scale define + sqrt auto + length return + while quit + for continue + else last + print +.fi +.ft +.NH 2 +Constants +.PP +Constants consist of arbitrarily long numbers +with an optional decimal point. +The hexadecimal digits \fBA\fP\-\fBF\fP are also recognized as digits with +values 10\-15, respectively. +.NH 1 +Expressions +.PP +The value of an expression is printed unless the main +operator is an assignment. +The value printed is assigned to the special variable \fBlast\fP. +A single dot may be used as a synonym for \fBlast\fP. +This is a non-portable extension. +Precedence is the same as the order +of presentation here, with highest appearing first. +Left or right associativity, where applicable, is +discussed with each operator. +.bp +.NH 2 +Primitive expressions +.NH 3 +Named expressions +.PP +Named expressions are +places where values are stored. +Simply stated, +named expressions are legal on the left +side of an assignment. +The value of a named expression is the value stored in the place named. +.NH 4 +\fIidentifiers\fR +.PP +Simple identifiers are named expressions. +They have an initial value of zero. +.NH 4 +\fIarray-name\fP\|[\|\fIexpression\fP\|] +.PP +Array elements are named expressions. +They have an initial value of zero. +.NH 4 +\fBscale\fR, \fBibase\fR and \fBobase\fR +.PP +The internal registers +\fBscale\fP, \fBibase\fP and \fBobase\fP are all named expressions. +\fBscale\fP is the number of digits after the decimal point to be +retained in arithmetic operations. +\fBscale\fR has an initial value of zero. +\fBibase\fP and \fBobase\fP are the input and output number +radix respectively. +Both \fBibase\fR and \fBobase\fR have initial values of 10. +.NH 3 +Function calls +.NH 4 +\fIfunction-name\fB\|(\fR[\fIexpression\fR\|[\fB,\|\fIexpression\|\fR.\|.\|.\|]\|]\fB) +.PP +A function call consists of a function name followed by parentheses +containing a comma-separated list of +expressions, which are the function arguments. +A whole array passed as an argument is specified by the +array name followed by empty square brackets. +All function arguments are passed by +value. +As a result, changes made to the formal parameters have +no effect on the actual arguments. +If the function terminates by executing a return +statement, the value of the function is +the value of the expression in the parentheses of the return +statement or is zero if no expression is provided +or if there is no return statement. +.NH 4 +sqrt\|(\|\fIexpression\fP\|) +.PP +The result is the square root of the expression. +The result is truncated in the least significant decimal place. +The scale of the result is +the scale of the expression or the +value of +.ft B +scale, +.ft +whichever is larger. +.NH 4 +length\|(\|\fIexpression\fP\|) +.PP +The result is the total number of significant decimal digits in the expression. +The scale of the result is zero. +.NH 4 +scale\|(\|\fIexpression\fP\|) +.PP +The result is the scale of the expression. +The scale of the result is zero. +.NH 3 +Constants +.PP +Constants are primitive expressions. +.NH 3 +Parentheses +.PP +An expression surrounded by parentheses is +a primitive expression. +The parentheses are used to alter the +normal precedence. +.NH 2 +Unary operators +.PP +The unary operators +bind right to left. +.NH 3 +\-\|\fIexpression\fP +.PP +The result is the negative of the expression. +.NH 3 +++\|\fInamed-expression\fP +.PP +The named expression is +incremented by one. +The result is the value of the named expression after +incrementing. +.NH 3 +\-\-\|\fInamed-expression\fP +.PP +The named expression is +decremented by one. +The result is the value of the named expression after +decrementing. +.NH 3 +\fInamed-expression\fP\|++ +.PP +The named expression is +incremented by one. +The result is the value of the named expression before +incrementing. +.NH 3 +\fInamed-expression\fP\|\-\- +.PP +The named expression is +decremented by one. +The result is the value of the named expression before +decrementing. +.NH 2 +Exponentiation operator +.PP +The exponentiation operator binds right to left. +.NH 3 +\fIexpression\fP ^ \fIexpression\fP +.PP +The result is the first +expression raised to the power of the +second expression. +The second expression must be an integer. +If \fIa\fP +is the scale of the left expression +and \fIb\fP is the absolute value +of the right expression, +then the scale of the result is: +.PP +min\|(\|\fIa\(mub\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP\|)\|) +.NH 2 +Multiplicative operators +.PP +The operators *, /, % bind left to right. +.NH 3 +\fIexpression\fP * \fIexpression\fP +.PP +The result is the product +of the two expressions. +If \fIa\fP and \fIb\fP are the +scales of the two expressions, +then the scale of the result is: +.PP +min\|(\|\fIa+b\fP,\|max\|(\|\fBscale\fP,\|\fIa\fP,\|\fIb\fP\|)\|) +.NH 3 +\fIexpression\fP / \fIexpression\fP +.PP +The result is the quotient of the two expressions. +The scale of the result is the value of \fBscale\fR. +.NH 3 +\fIexpression\fP % \fIexpression\fP +.PP +The % operator produces the remainder of the division +of the two expressions. +More precisely, +\fIa\fP%\fIb\fP is \fIa\fP\-\fIa\fP/\fIb\fP*\fIb\fP. +.PP +The scale of the result is the sum of the scale of +the divisor and the value of +.ft B +scale +.ft +.NH 2 +Additive operators +.PP +The additive operators bind left to right. +.NH 3 +\fIexpression\fP + \fIexpression\fP +.PP +The result is the sum of the two expressions. +The scale of the result is +the maximum of the scales of the expressions. +.NH 3 +\fIexpression\fP \- \fIexpression\fP +.PP +The result is the difference of the two expressions. +The scale of the result is the +maximum of the scales of the expressions. +.NH 2 +assignment operators +.PP +The assignment operators bind right to left. +.NH 3 +\fInamed-expression\fP = \fIexpression\fP +.PP +This expression results in assigning the value of the expression +on the right +to the named expression on the left. +.NH 3 +\fInamed-expression\fP += \fIexpression\fP +.NH 3 +\fInamed-expression\fP \-= \fIexpression\fP +.NH 3 +\fInamed-expression\fP *= \fIexpression\fP +.NH 3 +\fInamed-expression\fP /= \fIexpression\fP +.NH 3 +\fInamed-expression\fP %= \fIexpression\fP +.NH 3 +\fInamed-expression\fP ^= \fIexpression\fP +.PP +The result of the above expressions is equivalent +to ``named expression = named expression OP expression'', +where OP is the operator after the = sign. +.NH 1 +Relations +.PP +Unlike all other operators, the relational operators +are only valid as the object of an \fBif\fP, \fBwhile\fP, +or inside a \fBfor\fP statement. +.NH 2 +\fIexpression\fP < \fIexpression\fP +.NH 2 +\fIexpression\fP > \fIexpression\fP +.NH 2 +\fIexpression\fP <= \fIexpression\fP +.NH 2 +\fIexpression\fP >= \fIexpression\fP +.NH 2 +\fIexpression\fP == \fIexpression\fP +.NH 2 +\fIexpression\fP != \fIexpression\fP +.NH 1 +Storage classes +.PP +There are only two storage classes in BC, global and automatic +(local). +Only identifiers that are to be local to a function need be +declared with the \fBauto\fP command. +The arguments to a function +are local to the function. +All other identifiers are assumed to be global +and available to all functions. +All identifiers, global and local, have initial values +of zero. +Identifiers declared as \fBauto\fP are allocated on entry to the function +and released on returning from the function. +They therefore do not retain values between function calls. +\fBauto\fP arrays are specified by the array name followed by empty square brackets. +.PP +Automatic variables in BC do not work in exactly the same way +as in either C or PL/I. On entry to a function, the old values of +the names that appear as parameters and as automatic +variables are pushed onto a stack. +Until return is made from the function, reference to these +names refers only to the new values. +.NH 1 +Statements +.PP +Statements must be separated by semicolon or newline. +Except where altered by control statements, execution +is sequential. +.NH 2 +Expression statements +.PP +When a statement is an expression, unless +the main operator is an assignment, the value +of the expression is printed, followed by a newline character. +.NH 2 +Compound statements +.PP +Statements may be grouped together and used when one statement is expected +by surrounding them with { }. +.NH 2 +Quoted string statements +.PP +"any string" +.sp .5 +This statement prints the string inside the quotes. +.NH 2 +If statements +.sp .5 +\fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fR +.PP +The substatement is executed if the relation is true. +.NH 2 +If-else statements +.sp .5 +\fBif\|(\|\fIrelation\fB\|)\|\fIstatement\fB\|else\|\fIstatement\fR +.PP +The first substatement is executed if the relation is true, the second +substatement if the relation is false. +The \fBif-else\fR statement is a non-portable extension. +.NH 2 +While statements +.sp .5 +\fBwhile\|(\|\fIrelation\fB\|)\|\fIstatement\fR +.PP +The statement is executed while the relation +is true. +The test occurs before each execution of the statement. +.NH 2 +For statements +.sp .5 +\fBfor\|(\|\fIexpression\fB; \fIrelation\fB; \fIexpression\fB\|)\|\fIstatement\fR +.PP +The \fBfor\fR statement is the same as +.nf +.ft I + first-expression + \fBwhile\|(\fPrelation\|\fB) {\fP + statement + last-expression + } +.ft R +.fi +.PP +All three expressions may be left out. +This is a non-portable extension. +.NH 2 +Break statements +.sp .5 +\fBbreak\fP +.PP +\fBbreak\fP causes termination of a \fBfor\fP or \fBwhile\fP statement. +.NH 2 +Continue statements +.sp .5 +\fBcontinue\fP +.PP +\fBcontinue\fP causes the next iteration of a \fBfor\fP or \fBwhile\fP +statement to start, skipping the remainder of the loop. +For a \fBwhile\fP statement, execution continues with the evaluation +of the condition. +For a \fBfor\fP statement, execution continues with evaluation of +the last-expression. +The \fBcontinue\fP statement is a non-portable extension. +.NH 2 +Auto statements +.sp .5 +\fBauto \fIidentifier\fR\|[\|\fB,\fIidentifier\fR\|] +.PP +The \fBauto\fR statement causes the values of the identifiers to be pushed down. +The identifiers can be ordinary identifiers or array identifiers. +Array identifiers are specified by following the array name by empty square +brackets. +The auto statement must be the first statement +in a function definition. +.NH 2 +Define statements +.sp .5 +.nf +\fBdefine(\|\fR[\fIparameter\|\fR[\fB\|,\|\fIparameter\|.\|.\|.\|\fR]\|]\|\fB)\|{\fI + statements\|\fB}\fR +.fi +.PP +The \fBdefine\fR statement defines a function. +The parameters may +be ordinary identifiers or array names. +Array names must be followed by empty square brackets. +As a non-portable extension, the opening brace may also appear on the +next line. +.NH 2 +Return statements +.sp .5 +\fBreturn\fP +.sp .5 +\fBreturn(\fI\|expression\|\fB)\fR +.PP +The \fBreturn\fR statement causes termination of a function, +popping of its auto variables, and +specifies the result of the function. +The first form is equivalent to \fBreturn(0)\fR. +The result of the function is the result of the expression +in parentheses. +Leaving out the expression between parentheses is equivalent to +\fBreturn(0)\fR. +As a non-portable extension, the parentheses may be left out. +.NH 2 +Print +.PP +The \fBprint\fR statement takes a list of comma-separated expressions. +Each expression in the list is evaluated and the computed +value is printed and assigned to the variable `last'. +No trailing newline is printed. +The expression may also be a string enclosed in double quotes. +Within these strings the following escape sequences may be used: +\ea +for bell (alert), +`\eb' +for backspace, +`\ef' +for formfeed, +`\en' +for newline, +`\er' +for carriage return, +`\et' +`for tab, +`\eq' +for double quote and +`\e\e' +for backslash. +Any other character following a backslash will be ignored. +Strings will not be assigned to `last'. +The \fBprint\fR statement is a non-portable extension. +.NH 2 +Quit +.PP +The \fBquit\fR statement stops execution of a BC program and returns +control to UNIX when it is first encountered. +Because it is not treated as an executable statement, +it cannot be used +in a function definition or in an +.ft B +if, for, +.ft +or +.ft B +while +.ft +statement. diff --git a/usr.bin/bc/bc.1 b/usr.bin/bc/bc.1 new file mode 100644 index 000000000000..8fe21c6d9718 --- /dev/null +++ b/usr.bin/bc/bc.1 @@ -0,0 +1,396 @@ +.\" $FreeBSD$ +.\" $OpenBSD: bc.1,v 1.25 2010/01/02 19:48:56 schwarze Exp $ +.\" +.\" Copyright (C) Caldera International Inc. 2001-2002. +.\" 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 and documentation 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. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed or owned by Caldera +.\" International, Inc. +.\" 4. Neither the name of Caldera International, Inc. nor the names of other +.\" contributors may be used to endorse or promote products derived from +.\" this software without specific prior written permission. +.\" +.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA +.\" INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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. +.\" +.\" @(#)bc.1 6.8 (Berkeley) 8/8/91 +.\" +.Dd January 22, 2010 +.Dt BC 1 +.Os +.Sh NAME +.Nm bc +.Nd arbitrary-precision arithmetic language and calculator +.Sh SYNOPSIS +.Nm bc +.Op Fl chlqv +.Op Fl e Ar expression +.Op Ar file ... +.Sh DESCRIPTION +.Nm +is an interactive processor for a language which resembles +C but provides unlimited precision arithmetic. +It takes input from any expressions on the command line and +any files given, then reads the standard input. +.Pp +Options available: +.Bl -tag -width Ds +.It Fl c +.Nm +is actually a preprocessor for +.Xr dc 1 , +which it invokes automatically, unless the +.Fl c +.Pq compile only +option is present. +In this case the generated +.Xr dc 1 +instructions are sent to the standard output, +instead of being interpreted by a running +.Xr dc 1 +process. +.It Fl e Ar expression , Fl Fl expression Ar expression +Evaluate +.Ar expression . +If multiple +.Fl e +options are specified, they are processed in the order given, +separated by newlines. +.It Fl h , Fl Fl help +Prints usage information. +.It Fl l , Fl Fl mathlib +Allow specification of an arbitrary precision math library. +The definitions in the library are available to command line +expressions. +Synonym for +.Fl l . +.It Fl v , Fl Fl version +Prints version information. +.El +.Pp +The syntax for +.Nm +programs is as follows: +.Sq L +means letter a-z; +.Sq E +means expression; +.Sq S +means statement. +As a non-portable extension, it is possible to use long names +in addition to single letter names. +A long name is a sequence starting with a lowercase letter +followed by any number of lowercase letters and digits. +The underscore character +.Pq Sq _ +counts as a letter. +.Pp +Comments +.Bd -unfilled -offset indent -compact +are enclosed in /* and */ +are enclosed in # and the next newline +.Ed +.Pp +The newline is not part of the line comment, +which in itself is a non-portable extension. +.Pp +Names +.Bd -unfilled -offset indent -compact +simple variables: L +array elements: L [ E ] +The words `ibase', `obase', and `scale' +The word `last' or a single dot +.Ed +.Pp +Other operands +.Bd -unfilled -offset indent -compact +arbitrarily long numbers with optional sign and decimal point +( E ) +sqrt ( E ) +length ( E ) number of significant decimal digits +scale ( E ) number of digits right of decimal point +L ( E , ... , E ) +.Ed +.Pp +The sequence +.Sq \e +is ignored within numbers. +.Pp +Operators +.Pp +The following arithmetic and logical operators can be used. +The semantics of the operators is the same as in the C language. +They are listed in order of decreasing precedence. +Operators in the same group have the same precedence. +.Bl -column -offset indent "= += \-= *= /= %= ^=" "Associativity" \ +"multiply, divide, modulus" +.It Sy "Operator" Ta Sy "Associativity" Ta Sy "Description" +.It "++ \-\-" Ta "none" Ta "increment, decrement" +.It "\-" Ta "none" Ta "unary minus" +.It "^" Ta "right" Ta "power" +.It "* / %" Ta "left" Ta "multiply, divide, modulus" +.It "+ \-" Ta "left" Ta "plus, minus" +.It "= += -= *= /= %= ^=" Ta "right" Ta "assignment" +.It "== <= >= != < >" Ta "none" Ta "relational" +.It "!" Ta "none" Ta "boolean not" +.It "&&" Ta "left" Ta "boolean and" +.It "||" Ta "left" Ta "boolean or" +.El +.Pp +Note the following: +.Bl -bullet -offset indent +.It +The relational operators may appear in any expression. +The +.St -p1003.2 +standard only allows them in the conditional expression of an +.Sq if , +.Sq while +or +.Sq for +statement. +.It +The relational operators have a lower precedence than the assignment +operators. +This has the consequence that the expression +.Sy a = b < c +is interpreted as +.Sy (a = b) < c , +which is probably not what the programmer intended. +.It +In contrast with the C language, the relational operators all have +the same precedence, and are non-associative. +The expression +.Sy a < b < c +will produce a syntax error. +.It +The boolean operators (!, && and ||) are non-portable extensions. +.It +The boolean not +(!) operator has much lower precedence than the same operator in the +C language. +This has the consequence that the expression +.Sy !a < b +is interpreted as +.Sy !(a < b) . +Prudent programmers use parentheses when writing expressions involving +boolean operators. +.El +.Pp +Statements +.Bd -unfilled -offset indent -compact +E +{ S ; ... ; S } +if ( E ) S +if ( E ) S else S +while ( E ) S +for ( E ; E ; E ) S +null statement +break +continue +quit +a string of characters, enclosed in double quotes +print E ,..., E +.Ed +.Pp +A string may contain any character, except double quote. +The if statement with an else branch is a non-portable extension. +All three E's in a for statement may be empty. +This is a non-portable extension. +The continue and print statements are also non-portable extensions. +.Pp +The print statement takes a list of comma-separated expressions. +Each expression in the list is evaluated and the computed +value is printed and assigned to the variable `last'. +No trailing newline is printed. +The expression may also be a string enclosed in double quotes. +Within these strings the following escape sequences may be used: +.Sq \ea +for bell (alert), +.Sq \eb +for backspace, +.Sq \ef +for formfeed, +.Sq \en +for newline, +.Sq \er +for carriage return, +.Sq \et +for tab, +.Sq \eq +for double quote and +.Sq \e\e +for backslash. +Any other character following a backslash will be ignored. +Strings will not be assigned to `last'. +.Pp +Function definitions +.Bd -unfilled -offset indent +define L ( L ,..., L ) { + auto L, ... , L + S; ... S + return ( E ) +} +.Ed +.Pp +As a non-portable extension, the opening brace of the define statement +may appear on the next line. +The return statement may also appear in the following forms: +.Bd -unfilled -offset indent +return +return () +return E +.Ed +.Pp +The first two are equivalent to the statement +.Dq return 0 . +The last form is a non-portable extension. +Not specifying a return statement is equivalent to writing +.Dq return (0) . +.Pp +Functions available in the math library, which is loaded by specifying the +.Fl l +flag on the command line +.Pp +.Bl -tag -width j(n,x) -offset indent -compact +.It s(x) +sine +.It c(x) +cosine +.It e(x) +exponential +.It l(x) +log +.It a(x) +arctangent +.It j(n,x) +Bessel function +.El +.Pp +All function arguments are passed by value. +.Pp +The value of a statement that is an expression is printed +unless the main operator is an assignment. +The value printed is assigned to the special variable `last'. +This is a non-portable extension. +A single dot may be used as a synonym for `last'. +Either semicolons or newlines may separate statements. +Assignment to +.Ar scale +influences the number of digits to be retained on arithmetic +operations in the manner of +.Xr dc 1 . +Assignments to +.Ar ibase +or +.Ar obase +set the input and output number radix respectively. +.Pp +The same letter may be used as an array, a function, +and a simple variable simultaneously. +All variables are global to the program. +`Auto' variables are pushed down during function calls. +When using arrays as function arguments +or defining them as automatic variables, +empty square brackets must follow the array name. +.Pp +For example +.Bd -literal -offset indent +scale = 20 +define e(x){ + auto a, b, c, i, s + a = 1 + b = 1 + s = 1 + for(i=1; 1==1; i++){ + a = a*x + b = b*i + c = a/b + if(c == 0) return(s) + s = s+c + } +} +.Ed +.Pp +defines a function to compute an approximate value of +the exponential function and +.Pp +.Dl for(i=1; i<=10; i++) e(i) +.Pp +prints approximate values of the exponential function of +the first ten integers. +.Bd -literal -offset indent +$ bc -l -e 'scale = 500; 2 * a(2^10000)' -e quit +.Ed +.Pp +prints an approximation of pi. +.Sh FILES +.Bl -tag -width /usr/share/misc/bc.library -compact +.It Pa /usr/share/misc/bc.library +math library, read when the +.Fl l +option is specified on the command line. +.El +.Sh SEE ALSO +.Xr dc 1 +.Pp +"BC \- An Arbitrary Precision Desk-Calculator Language", +.Pa /usr/share/doc/usd/06.bc/ . +.Sh STANDARDS +The +.Nm +utility is compliant with the +.St -p1003.1-2008 +specification. +.Pp +The flags +.Op Fl ce +are extensions to that specification. +.Sh HISTORY +The +.Nm +command first appeared in +.At v6 . +A complete rewrite of the +.Nm +command first appeared in +.Ox 3.5 . +.Sh AUTHORS +.An -nosplit +The original version of the +.Nm +command was written by +.An Robert Morris +and +.An Lorinda Cherry . +The current version of the +.Nm +utility was written by +.An Otto Moerbeek . +.Sh BUGS +.Ql Quit +is interpreted when read, not when executed. +.Pp +Some non-portable extensions, as found in the GNU version of the +.Nm +utility are not implemented (yet). diff --git a/usr.bin/bc/bc.library b/usr.bin/bc/bc.library new file mode 100644 index 000000000000..c3145ab9d33a --- /dev/null +++ b/usr.bin/bc/bc.library @@ -0,0 +1,263 @@ +/* $FreeBSD$ */ +/* $OpenBSD: bc.library,v 1.3 2007/02/03 21:15:06 otto Exp $ */ + +/* + * Copyright (C) Caldera International Inc. 2001-2002. + * 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 and documentation 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed or owned by Caldera + * International, Inc. + * 4. Neither the name of Caldera International, Inc. nor the names of other + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA + * INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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. + */ + +/* + * @(#)bc.library 5.1 (Berkeley) 4/17/91 + */ + +scale = 20 +define e(x) { + auto a, b, c, d, e, g, t, w, y, r + + r = ibase + ibase = A + t = scale + scale = t + .434*x + 1 + + w = 0 + if (x < 0) { + x = -x + w = 1 + } + y = 0 + while (x > 2) { + x = x/2 + y = y + 1 + } + + a = 1 + b = 1 + c = b + d = 1 + e = 1 + for (a = 1; 1 == 1; a++) { + b = b*x + c = c*a + b + d = d*a + g = c/d + if (g == e) { + g = g/1 + while (y--) { + g = g*g + } + scale = t + ibase = r + if (w == 1) return (1/g) + return (g/1) + } + e = g + } +} + +define l(x) { + auto a, b, c, d, e, f, g, u, s, t, r + r = ibase + ibase = A + if (x <= 0) { + a = (1 - 10^scale) + ibase = r + return (a) + } + t = scale + + f = 1 + scale = scale + scale(x) - length(x) + 1 + s = scale + while (x > 2) { + s = s + (length(x) - scale(x))/2 + 1 + if (s > 0) scale = s + x = sqrt(x) + f = f*2 + } + while (x < .5) { + s = s + (length(x) - scale(x))/2 + 1 + if (s > 0) scale = s + x = sqrt(x) + f = f*2 + } + + scale = t + length(f) - scale(f) + 1 + u = (x - 1)/(x + 1) + + scale = scale + 1.1*length(t) - 1.1*scale(t) + s = u*u + b = 2*f + c = b + d = 1 + e = 1 + for (a = 3; 1 == 1 ; a = a + 2) { + b = b*s + c = c*a + d*b + d = d*a + g = c/d + if (g == e) { + scale = t + ibase = r + return (u*c/d) + } + e = g + } +} + +define s(x) { + auto a, b, c, s, t, y, p, n, i, r + r = ibase + ibase = A + t = scale + y = x/.7853 + s = t + length(y) - scale(y) + if (s < t) s = t + scale = s + p = a(1) + + scale = 0 + if (x >= 0) n = (x/(2*p) + 1)/2 + if (x < 0) n = (x/(2*p) - 1)/2 + x = x - 4*n*p + if (n % 2 != 0) x = -x + + scale = t + length(1.2*t) - scale(1.2*t) + y = -x*x + a = x + b = 1 + s = x + for (i =3 ; 1 == 1; i = i + 2) { + a = a*y + b = b*i*(i - 1) + c = a/b + if (c == 0) { + scale = t + ibase = r + return (s/1) + } + s = s + c + } +} + +define c(x) { + auto t, r + r = ibase + ibase = A + t = scale + scale = scale + 1 + x = s(x + 2*a(1)) + scale = t + ibase = r + return (x/1) +} + +define a(x) { + auto a, b, c, d, e, f, g, s, t, r + if (x == 0) return(0) + + r = ibase + ibase = A + if (x == 1) { + if (scale < 52) { + a = .7853981633974483096156608458198757210492923498437764/1 + ibase = r + return (a) + } + } + t = scale + f = 1 + while (x > .5) { + scale = scale + 1 + x = -(1 - sqrt(1. + x*x))/x + f = f*2 + } + while (x < -.5) { + scale = scale + 1 + x = -(1 - sqrt(1. + x*x))/x + f = f*2 + } + s = -x*x + b = f + c = f + d = 1 + e = 1 + for (a = 3; 1 == 1; a = a + 2) { + b = b*s + c = c*a + d*b + d = d*a + g = c/d + if (g == e) { + ibase = r + scale = t + return (x*c/d) + } + e = g + } +} + +define j(n,x) { + auto a, b, c, d, e, g, i, s, k, t, r + + r = ibase + ibase = A + t = scale + k = 1.36*x + 1.16*t - n + k = length(k) - scale(k) + if (k > 0) scale = scale + k + + s = -x*x/4 + if (n < 0) { + n = -n + x = -x + } + a = 1 + c = 1 + for (i = 1; i <= n; i++) { + a = a*x + c = c*2*i + } + b = a + d = 1 + e = 1 + for (i = 1; 1; i++) { + a = a*s + b = b*i*(n + i) + a + c = c*i*(n + i) + g = b/c + if (g == e) { + ibase = r + scale = t + return (g/1) + } + e = g + } +} diff --git a/usr.bin/bc/bc.y b/usr.bin/bc/bc.y new file mode 100644 index 000000000000..b00d5ac06525 --- /dev/null +++ b/usr.bin/bc/bc.y @@ -0,0 +1,1205 @@ +%{ +/* $OpenBSD: bc.y,v 1.33 2009/10/27 23:59:36 deraadt Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This implementation of bc(1) uses concepts from the original 4.4 + * BSD bc(1). The code itself is a complete rewrite, based on the + * Posix defined bc(1) grammar. Other differences include type safe + * usage of pointers to build the tree of emitted code, typed yacc + * rule values, dynamic allocation of all data structures and a + * completely rewritten lexical analyzer using lex(1). + * + * Some effort has been made to make sure that the generated code is + * the same as the code generated by the older version, to provide + * easy regression testing. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "extern.h" +#include "pathnames.h" + +#define BC_VER "1.0-FreeBSD" +#define END_NODE ((ssize_t) -1) +#define CONST_STRING ((ssize_t) -2) +#define ALLOC_STRING ((ssize_t) -3) + +extern char *yytext; +extern FILE *yyin; + +struct tree { + union { + char *astr; + const char *cstr; + } u; + ssize_t index; +}; + +int yyparse(void); +int yywrap(void); + +int fileindex; +int sargc; +const char **sargv; +const char *filename; +char *cmdexpr; + +static void grow(void); +static ssize_t cs(const char *); +static ssize_t as(const char *); +static ssize_t node(ssize_t, ...); +static void emit(ssize_t); +static void emit_macro(int, ssize_t); +static void free_tree(void); +static ssize_t numnode(int); +static ssize_t lookup(char *, size_t, char); +static ssize_t letter_node(char *); +static ssize_t array_node(char *); +static ssize_t function_node(char *); + +static void add_par(ssize_t); +static void add_local(ssize_t); +static void warning(const char *); +static void init(void); +static void usage(void); +static char *escape(const char *); + +static ssize_t instr_sz = 0; +static struct tree *instructions = NULL; +static ssize_t current = 0; +static int macro_char = '0'; +static int reset_macro_char = '0'; +static int nesting = 0; +static int breakstack[16]; +static int breaksp = 0; +static ssize_t prologue; +static ssize_t epilogue; +static bool st_has_continue; +static char str_table[UCHAR_MAX][2]; +static bool do_fork = true; +static u_short var_count; +static pid_t dc; + +static void sigchld(int); + +extern char *__progname; + +#define BREAKSTACK_SZ (sizeof(breakstack)/sizeof(breakstack[0])) + +/* These values are 4.4BSD bc compatible */ +#define FUNC_CHAR 0x01 +#define ARRAY_CHAR 0xa1 + +/* Skip '\0', [, \ and ] */ +#define ENCODE(c) ((c) < '[' ? (c) : (c) + 3); +#define VAR_BASE (256-4) +#define MAX_VARIABLES (VAR_BASE * VAR_BASE) + +const struct option long_options[] = +{ + {"expression", required_argument, NULL, 'e'}, + {"help", no_argument, NULL, 'h'}, + {"mathlib", no_argument, NULL, 'l'}, + /* compatibility option */ + {"quiet", no_argument, NULL, 'q'}, + {"version", no_argument, NULL, 'v'}, + {NULL, no_argument, NULL, 0} +}; + +%} + +%start program + +%union { + struct lvalue lvalue; + const char *str; + char *astr; + ssize_t node; +} + +%token COMMA SEMICOLON LPAR RPAR LBRACE RBRACE LBRACKET RBRACKET DOT +%token NEWLINE +%token LETTER +%token NUMBER STRING +%token DEFINE BREAK QUIT LENGTH +%token RETURN FOR IF WHILE SQRT +%token SCALE IBASE OBASE AUTO +%token CONTINUE ELSE PRINT + +%left BOOL_OR +%left BOOL_AND +%nonassoc BOOL_NOT +%nonassoc EQUALS LESS_EQ GREATER_EQ UNEQUALS LESS GREATER +%right ASSIGN_OP +%left PLUS MINUS +%left MULTIPLY DIVIDE REMAINDER +%right EXPONENT +%nonassoc UMINUS +%nonassoc INCR DECR + +%type named_expression +%type argument_list +%type alloc_macro +%type expression +%type function +%type function_header +%type input_item +%type opt_argument_list +%type opt_expression +%type opt_relational_expression +%type opt_statement +%type print_expression +%type print_expression_list +%type relational_expression +%type return_expression +%type semicolon_list +%type statement +%type statement_list + +%% + +program : /* empty */ + | program input_item + ; + +input_item : semicolon_list NEWLINE + { + emit($1); + macro_char = reset_macro_char; + putchar('\n'); + free_tree(); + st_has_continue = false; + } + | function + { + putchar('\n'); + free_tree(); + st_has_continue = false; + } + | error NEWLINE + { + yyerrok; + } + | error QUIT + { + yyerrok; + } + ; + +semicolon_list : /* empty */ + { + $$ = cs(""); + } + | statement + | semicolon_list SEMICOLON statement + { + $$ = node($1, $3, END_NODE); + } + | semicolon_list SEMICOLON + ; + +statement_list : /* empty */ + { + $$ = cs(""); + } + | statement + | statement_list NEWLINE + | statement_list NEWLINE statement + { + $$ = node($1, $3, END_NODE); + } + | statement_list SEMICOLON + | statement_list SEMICOLON statement + { + $$ = node($1, $3, END_NODE); + } + ; + + +opt_statement : /* empty */ + { + $$ = cs(""); + } + | statement + ; + +statement : expression + { + $$ = node($1, cs("ps."), END_NODE); + } + | named_expression ASSIGN_OP expression + { + if ($2[0] == '\0') + $$ = node($3, cs($2), $1.store, + END_NODE); + else + $$ = node($1.load, $3, cs($2), $1.store, + END_NODE); + } + | STRING + { + $$ = node(cs("["), as($1), + cs("]P"), END_NODE); + } + | BREAK + { + if (breaksp == 0) { + warning("break not in for or while"); + YYERROR; + } else { + $$ = node( + numnode(nesting - + breakstack[breaksp-1]), + cs("Q"), END_NODE); + } + } + | CONTINUE + { + if (breaksp == 0) { + warning("continue not in for or while"); + YYERROR; + } else { + st_has_continue = true; + $$ = node(numnode(nesting - + breakstack[breaksp-1] - 1), + cs("J"), END_NODE); + } + } + | QUIT + { + sigset_t mask; + + putchar('q'); + fflush(stdout); + if (dc) { + sigprocmask(SIG_BLOCK, NULL, &mask); + sigsuspend(&mask); + } else + exit(0); + } + | RETURN return_expression + { + if (nesting == 0) { + warning("return must be in a function"); + YYERROR; + } + $$ = $2; + } + | FOR LPAR alloc_macro opt_expression SEMICOLON + opt_relational_expression SEMICOLON + opt_expression RPAR opt_statement pop_nesting + { + ssize_t n; + + if (st_has_continue) + n = node($10, cs("M"), $8, cs("s."), + $6, $3, END_NODE); + else + n = node($10, $8, cs("s."), $6, $3, + END_NODE); + + emit_macro($3, n); + $$ = node($4, cs("s."), $6, $3, cs(" "), + END_NODE); + } + | IF LPAR alloc_macro pop_nesting relational_expression RPAR + opt_statement + { + emit_macro($3, $7); + $$ = node($5, $3, cs(" "), END_NODE); + } + | IF LPAR alloc_macro pop_nesting relational_expression RPAR + opt_statement ELSE alloc_macro pop_nesting opt_statement + { + emit_macro($3, $7); + emit_macro($9, $11); + $$ = node($5, $3, cs("e"), $9, cs(" "), + END_NODE); + } + | WHILE LPAR alloc_macro relational_expression RPAR + opt_statement pop_nesting + { + ssize_t n; + + if (st_has_continue) + n = node($6, cs("M"), $4, $3, END_NODE); + else + n = node($6, $4, $3, END_NODE); + emit_macro($3, n); + $$ = node($4, $3, cs(" "), END_NODE); + } + | LBRACE statement_list RBRACE + { + $$ = $2; + } + | PRINT print_expression_list + { + $$ = $2; + } + ; + +alloc_macro : /* empty */ + { + $$ = cs(str_table[macro_char]); + macro_char++; + /* Do not use [, \ and ] */ + if (macro_char == '[') + macro_char += 3; + /* skip letters */ + else if (macro_char == 'a') + macro_char = '{'; + else if (macro_char == ARRAY_CHAR) + macro_char += 26; + else if (macro_char == 255) + fatal("program too big"); + if (breaksp == BREAKSTACK_SZ) + fatal("nesting too deep"); + breakstack[breaksp++] = nesting++; + } + ; + +pop_nesting : /* empty */ + { + breaksp--; + } + ; + +function : function_header opt_parameter_list RPAR opt_newline + LBRACE NEWLINE opt_auto_define_list + statement_list RBRACE + { + int n = node(prologue, $8, epilogue, + cs("0"), numnode(nesting), + cs("Q"), END_NODE); + emit_macro($1, n); + reset_macro_char = macro_char; + nesting = 0; + breaksp = 0; + } + ; + +function_header : DEFINE LETTER LPAR + { + $$ = function_node($2); + free($2); + prologue = cs(""); + epilogue = cs(""); + nesting = 1; + breaksp = 0; + breakstack[breaksp] = 0; + } + ; + +opt_newline : /* empty */ + | NEWLINE + ; + +opt_parameter_list + : /* empty */ + | parameter_list + ; + + +parameter_list : LETTER + { + add_par(letter_node($1)); + free($1); + } + | LETTER LBRACKET RBRACKET + { + add_par(array_node($1)); + free($1); + } + | parameter_list COMMA LETTER + { + add_par(letter_node($3)); + free($3); + } + | parameter_list COMMA LETTER LBRACKET RBRACKET + { + add_par(array_node($3)); + free($3); + } + ; + + + +opt_auto_define_list + : /* empty */ + | AUTO define_list NEWLINE + | AUTO define_list SEMICOLON + ; + + +define_list : LETTER + { + add_local(letter_node($1)); + free($1); + } + | LETTER LBRACKET RBRACKET + { + add_local(array_node($1)); + free($1); + } + | define_list COMMA LETTER + { + add_local(letter_node($3)); + free($3); + } + | define_list COMMA LETTER LBRACKET RBRACKET + { + add_local(array_node($3)); + free($3); + } + ; + + +opt_argument_list + : /* empty */ + { + $$ = cs(""); + } + | argument_list + ; + + +argument_list : expression + | argument_list COMMA expression + { + $$ = node($1, $3, END_NODE); + } + | argument_list COMMA LETTER LBRACKET RBRACKET + { + $$ = node($1, cs("l"), array_node($3), + END_NODE); + free($3); + } + ; + +opt_relational_expression + : /* empty */ + { + $$ = cs(" 0 0="); + } + | relational_expression + ; + +relational_expression + : expression EQUALS expression + { + $$ = node($1, $3, cs("="), END_NODE); + } + | expression UNEQUALS expression + { + $$ = node($1, $3, cs("!="), END_NODE); + } + | expression LESS expression + { + $$ = node($1, $3, cs(">"), END_NODE); + } + | expression LESS_EQ expression + { + $$ = node($1, $3, cs("!<"), END_NODE); + } + | expression GREATER expression + { + $$ = node($1, $3, cs("<"), END_NODE); + } + | expression GREATER_EQ expression + { + $$ = node($1, $3, cs("!>"), END_NODE); + } + | expression + { + $$ = node($1, cs(" 0!="), END_NODE); + } + ; + + +return_expression + : /* empty */ + { + $$ = node(cs("0"), epilogue, + numnode(nesting), cs("Q"), END_NODE); + } + | expression + { + $$ = node($1, epilogue, + numnode(nesting), cs("Q"), END_NODE); + } + | LPAR RPAR + { + $$ = node(cs("0"), epilogue, + numnode(nesting), cs("Q"), END_NODE); + } + ; + + +opt_expression : /* empty */ + { + $$ = cs(" 0"); + } + | expression + ; + +expression : named_expression + { + $$ = node($1.load, END_NODE); + } + | DOT { + $$ = node(cs("l."), END_NODE); + } + | NUMBER + { + $$ = node(cs(" "), as($1), END_NODE); + } + | LPAR expression RPAR + { + $$ = $2; + } + | LETTER LPAR opt_argument_list RPAR + { + $$ = node($3, cs("l"), + function_node($1), cs("x"), + END_NODE); + free($1); + } + | MINUS expression %prec UMINUS + { + $$ = node(cs(" 0"), $2, cs("-"), + END_NODE); + } + | expression PLUS expression + { + $$ = node($1, $3, cs("+"), END_NODE); + } + | expression MINUS expression + { + $$ = node($1, $3, cs("-"), END_NODE); + } + | expression MULTIPLY expression + { + $$ = node($1, $3, cs("*"), END_NODE); + } + | expression DIVIDE expression + { + $$ = node($1, $3, cs("/"), END_NODE); + } + | expression REMAINDER expression + { + $$ = node($1, $3, cs("%"), END_NODE); + } + | expression EXPONENT expression + { + $$ = node($1, $3, cs("^"), END_NODE); + } + | INCR named_expression + { + $$ = node($2.load, cs("1+d"), $2.store, + END_NODE); + } + | DECR named_expression + { + $$ = node($2.load, cs("1-d"), + $2.store, END_NODE); + } + | named_expression INCR + { + $$ = node($1.load, cs("d1+"), + $1.store, END_NODE); + } + | named_expression DECR + { + $$ = node($1.load, cs("d1-"), + $1.store, END_NODE); + } + | named_expression ASSIGN_OP expression + { + if ($2[0] == '\0') + $$ = node($3, cs($2), cs("d"), $1.store, + END_NODE); + else + $$ = node($1.load, $3, cs($2), cs("d"), + $1.store, END_NODE); + } + | LENGTH LPAR expression RPAR + { + $$ = node($3, cs("Z"), END_NODE); + } + | SQRT LPAR expression RPAR + { + $$ = node($3, cs("v"), END_NODE); + } + | SCALE LPAR expression RPAR + { + $$ = node($3, cs("X"), END_NODE); + } + | BOOL_NOT expression + { + $$ = node($2, cs("N"), END_NODE); + } + | expression BOOL_AND alloc_macro pop_nesting expression + { + ssize_t n = node(cs("R"), $5, END_NODE); + emit_macro($3, n); + $$ = node($1, cs("d0!="), $3, END_NODE); + } + | expression BOOL_OR alloc_macro pop_nesting expression + { + ssize_t n = node(cs("R"), $5, END_NODE); + emit_macro($3, n); + $$ = node($1, cs("d0="), $3, END_NODE); + } + | expression EQUALS expression + { + $$ = node($1, $3, cs("G"), END_NODE); + } + | expression UNEQUALS expression + { + $$ = node($1, $3, cs("GN"), END_NODE); + } + | expression LESS expression + { + $$ = node($3, $1, cs("("), END_NODE); + } + | expression LESS_EQ expression + { + $$ = node($3, $1, cs("{"), END_NODE); + } + | expression GREATER expression + { + $$ = node($1, $3, cs("("), END_NODE); + } + | expression GREATER_EQ expression + { + $$ = node($1, $3, cs("{"), END_NODE); + } + ; + +named_expression + : LETTER + { + $$.load = node(cs("l"), letter_node($1), + END_NODE); + $$.store = node(cs("s"), letter_node($1), + END_NODE); + free($1); + } + | LETTER LBRACKET expression RBRACKET + { + $$.load = node($3, cs(";"), + array_node($1), END_NODE); + $$.store = node($3, cs(":"), + array_node($1), END_NODE); + free($1); + } + | SCALE + { + $$.load = cs("K"); + $$.store = cs("k"); + } + | IBASE + { + $$.load = cs("I"); + $$.store = cs("i"); + } + | OBASE + { + $$.load = cs("O"); + $$.store = cs("o"); + } + ; + +print_expression_list + : print_expression + | print_expression_list COMMA print_expression + { + $$ = node($1, $3, END_NODE); + } + +print_expression + : expression + { + $$ = node($1, cs("ds.n"), END_NODE); + } + | STRING + { + char *p = escape($1); + $$ = node(cs("["), as(p), cs("]n"), END_NODE); + free(p); + } +%% + + +static void +grow(void) +{ + struct tree *p; + size_t newsize; + + if (current == instr_sz) { + newsize = instr_sz * 2 + 1; + p = realloc(instructions, newsize * sizeof(*p)); + if (p == NULL) { + free(instructions); + err(1, NULL); + } + instructions = p; + instr_sz = newsize; + } +} + +static ssize_t +cs(const char *str) +{ + + grow(); + instructions[current].index = CONST_STRING; + instructions[current].u.cstr = str; + return (current++); +} + +static ssize_t +as(const char *str) +{ + + grow(); + instructions[current].index = ALLOC_STRING; + instructions[current].u.astr = strdup(str); + if (instructions[current].u.astr == NULL) + err(1, NULL); + return (current++); +} + +static ssize_t +node(ssize_t arg, ...) +{ + va_list ap; + ssize_t ret; + + va_start(ap, arg); + + ret = current; + grow(); + instructions[current++].index = arg; + + do { + arg = va_arg(ap, ssize_t); + grow(); + instructions[current++].index = arg; + } while (arg != END_NODE); + + va_end(ap); + return (ret); +} + +static void +emit(ssize_t i) +{ + + if (instructions[i].index >= 0) + while (instructions[i].index != END_NODE) + emit(instructions[i++].index); + else + fputs(instructions[i].u.cstr, stdout); +} + +static void +emit_macro(int nodeidx, ssize_t code) +{ + + putchar('['); + emit(code); + printf("]s%s\n", instructions[nodeidx].u.cstr); + nesting--; +} + +static void +free_tree(void) +{ + ssize_t i; + + for (i = 0; i < current; i++) + if (instructions[i].index == ALLOC_STRING) + free(instructions[i].u.astr); + current = 0; +} + +static ssize_t +numnode(int num) +{ + const char *p; + + if (num < 10) + p = str_table['0' + num]; + else if (num < 16) + p = str_table['A' - 10 + num]; + else + errx(1, "internal error: break num > 15"); + return (node(cs(" "), cs(p), END_NODE)); +} + + +static ssize_t +lookup(char * str, size_t len, char type) +{ + ENTRY entry, *found; + u_char *p; + u_short num; + + /* The scanner allocated an extra byte already */ + if (str[len-1] != type) { + str[len] = type; + str[len+1] = '\0'; + } + entry.key = str; + found = hsearch(entry, FIND); + if (found == NULL) { + if (var_count == MAX_VARIABLES) + errx(1, "too many variables"); + p = malloc(4); + if (p == NULL) + err(1, NULL); + num = var_count++; + p[0] = 255; + p[1] = ENCODE(num / VAR_BASE + 1); + p[2] = ENCODE(num % VAR_BASE + 1); + p[3] = '\0'; + + entry.data = (char *)p; + entry.key = strdup(str); + if (entry.key == NULL) + err(1, NULL); + found = hsearch(entry, ENTER); + if (found == NULL) + err(1, NULL); + } + return (cs(found->data)); +} + +static ssize_t +letter_node(char *str) +{ + size_t len; + + len = strlen(str); + if (len == 1 && str[0] != '_') + return (cs(str_table[(int)str[0]])); + else + return (lookup(str, len, 'L')); +} + +static ssize_t +array_node(char *str) +{ + size_t len; + + len = strlen(str); + if (len == 1 && str[0] != '_') + return (cs(str_table[(int)str[0] - 'a' + ARRAY_CHAR])); + else + return (lookup(str, len, 'A')); +} + +static ssize_t +function_node(char *str) +{ + size_t len; + + len = strlen(str); + if (len == 1 && str[0] != '_') + return (cs(str_table[(int)str[0] - 'a' + FUNC_CHAR])); + else + return (lookup(str, len, 'F')); +} + +static void +add_par(ssize_t n) +{ + + prologue = node(cs("S"), n, prologue, END_NODE); + epilogue = node(epilogue, cs("L"), n, cs("s."), END_NODE); +} + +static void +add_local(ssize_t n) +{ + + prologue = node(cs("0S"), n, prologue, END_NODE); + epilogue = node(epilogue, cs("L"), n, cs("s."), END_NODE); +} + +void +yyerror(const char *s) +{ + char *p, *str; + int n; + + if (yyin != NULL && feof(yyin)) + n = asprintf(&str, "%s: %s:%d: %s: unexpected EOF", + __progname, filename, lineno, s); + else if (isspace(yytext[0]) || !isprint(yytext[0])) + n = asprintf(&str, + "%s: %s:%d: %s: ascii char 0x%02x unexpected", + __progname, filename, lineno, s, yytext[0]); + else + n = asprintf(&str, "%s: %s:%d: %s: %s unexpected", + __progname, filename, lineno, s, yytext); + if (n == -1) + err(1, NULL); + + fputs("c[", stdout); + for (p = str; *p != '\0'; p++) { + if (*p == '[' || *p == ']' || *p =='\\') + putchar('\\'); + putchar(*p); + } + fputs("]pc\n", stdout); + free(str); +} + +void +fatal(const char *s) +{ + + errx(1, "%s:%d: %s", filename, lineno, s); +} + +static void +warning(const char *s) +{ + + warnx("%s:%d: %s", filename, lineno, s); +} + +static void +init(void) +{ + unsigned int i; + + for (i = 0; i < UCHAR_MAX; i++) { + str_table[i][0] = i; + str_table[i][1] = '\0'; + } + if (hcreate(1 << 16) == 0) + err(1, NULL); +} + + +static void +usage(void) +{ + + fprintf(stderr, "usage: %s [-chlqv] [-e expression] [file ...]\n", + __progname); + exit(1); +} + +static char * +escape(const char *str) +{ + char *p, *ret; + + ret = malloc(strlen(str) + 1); + if (ret == NULL) + err(1, NULL); + + p = ret; + while (*str != '\0') { + /* + * We get _escaped_ strings here. Single backslashes are + * already converted to double backslashes + */ + if (*str == '\\') { + if (*++str == '\\') { + switch (*++str) { + case 'a': + *p++ = '\a'; + break; + case 'b': + *p++ = '\b'; + break; + case 'f': + *p++ = '\f'; + break; + case 'n': + *p++ = '\n'; + break; + case 'q': + *p++ = '"'; + break; + case 'r': + *p++ = '\r'; + break; + case 't': + *p++ = '\t'; + break; + case '\\': + *p++ = '\\'; + break; + } + str++; + } else { + *p++ = '\\'; + *p++ = *str++; + } + } else + *p++ = *str++; + } + *p = '\0'; + return (ret); +} + +/* ARGSUSED */ +void +sigchld(int signo) +{ + pid_t pid; + int status; + + switch (signo) { + default: + for (;;) { + pid = waitpid(dc, &status, WCONTINUED); + if (pid == -1) { + if (errno == EINTR) + continue; + _exit(0); + } + if (WIFEXITED(status) || WIFSIGNALED(status)) + _exit(0); + else + break; + } + } +} + +static const char * +dummy_prompt(void) +{ + + return (""); +} + +int +main(int argc, char *argv[]) +{ + char *q; + int p[2]; + int ch, i; + + init(); + setlinebuf(stdout); + + sargv = malloc(argc * sizeof(char *)); + if (sargv == NULL) + err(1, NULL); + + if ((cmdexpr = strdup("")) == NULL) + err(1, NULL); + /* The d debug option is 4.4 BSD bc(1) compatible */ + while ((ch = getopt_long(argc, argv, "cde:hlqv", + long_options, NULL)) != -1) { + switch (ch) { + case 'c': + case 'd': + do_fork = false; + break; + case 'e': + q = cmdexpr; + if (asprintf(&cmdexpr, "%s%s\n", cmdexpr, optarg) == -1) + err(1, NULL); + free(q); + break; + case 'h': + usage(); + break; + case 'l': + sargv[sargc++] = _PATH_LIBB; + break; + case 'q': + /* compatibility option */ + break; + case 'v': + fprintf(stderr, "%s (BSD bc) %s\n", __progname, BC_VER); + exit(0); + break; + default: + usage(); + } + } + + argc -= optind; + argv += optind; + + interactive = isatty(STDIN_FILENO); + for (i = 0; i < argc; i++) + sargv[sargc++] = argv[i]; + + if (do_fork) { + if (pipe(p) == -1) + err(1, "cannot create pipe"); + dc = fork(); + if (dc == -1) + err(1, "cannot fork"); + else if (dc != 0) { + signal(SIGCHLD, sigchld); + close(STDOUT_FILENO); + dup(p[1]); + close(p[0]); + close(p[1]); + if (interactive) { + el = el_init("bc", stdin, stderr, stderr); + hist = history_init(); + history(hist, &he, H_SETSIZE, 100); + el_set(el, EL_HIST, history, hist); + el_set(el, EL_EDITOR, "emacs"); + el_set(el, EL_SIGNAL, 1); + el_set(el, EL_PROMPT, dummy_prompt); + el_source(el, NULL); + } + } else { + close(STDIN_FILENO); + dup(p[0]); + close(p[0]); + close(p[1]); + execl(_PATH_DC, "dc", "-x", (char *)NULL); + err(1, "cannot find dc"); + } + } + yywrap(); + return (yyparse()); +} diff --git a/usr.bin/bc/extern.h b/usr.bin/bc/extern.h new file mode 100644 index 000000000000..d1e9fe80e5f6 --- /dev/null +++ b/usr.bin/bc/extern.h @@ -0,0 +1,42 @@ +/* $FreeBSD$ */ +/* $OpenBSD: extern.h,v 1.6 2006/03/18 20:44:43 otto Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +struct lvalue { + ssize_t load; + ssize_t store; +}; + +int yylex(void); +void yyerror(const char *); +void fatal(const char *); +void abort_line(int); + +extern int lineno; +extern int fileindex; +extern int sargc; +extern const char **sargv; +extern const char *filename; +extern char *cmdexpr; +extern bool interactive; +extern EditLine *el; +extern History *hist; +extern HistEvent he; + diff --git a/usr.bin/bc/pathnames.h b/usr.bin/bc/pathnames.h new file mode 100644 index 000000000000..defb766f7169 --- /dev/null +++ b/usr.bin/bc/pathnames.h @@ -0,0 +1,21 @@ +/* $FreeBSD$ */ +/* $OpenBSD: pathnames.h,v 1.1 2003/09/25 19:32:44 otto Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#define _PATH_LIBB "/usr/share/misc/bc.library" +#define _PATH_DC "/usr/bin/dc" diff --git a/usr.bin/bc/scan.l b/usr.bin/bc/scan.l new file mode 100644 index 000000000000..0de6dc84f568 --- /dev/null +++ b/usr.bin/bc/scan.l @@ -0,0 +1,327 @@ +%{ +/* $OpenBSD: scan.l,v 1.23 2009/10/27 23:59:36 deraadt Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include "extern.h" +#include "bc.h" +#include "pathnames.h" + +int lineno; + +bool interactive; +HistEvent he; +EditLine *el; +History *hist; + +static char *strbuf = NULL; +static size_t strbuf_sz = 1; +static bool dot_seen; + +static void init_strbuf(void); +static void add_str(const char *); +static int bc_yyinput(char *, int); + +#undef YY_INPUT +#define YY_INPUT(buf,retval,max) \ + (retval = bc_yyinput(buf, max)) +%} + +%option always-interactive + +DIGIT [0-9A-F] +ALPHA [a-z_] +ALPHANUM [a-z_0-9] + +%x comment string number + +%% + +"/*" BEGIN(comment); +{ + "*/" BEGIN(INITIAL); + \n lineno++; + \* ; + [^*\n]+ ; + <> fatal("end of file in comment"); +} + +\" BEGIN(string); init_strbuf(); +{ + [^"\n\\\[\]]+ add_str(yytext); + \[ add_str("\\["); + \] add_str("\\]"); + \\ add_str("\\\\"); + \n add_str("\n"); lineno++; + \" BEGIN(INITIAL); yylval.str = strbuf; return STRING; + <> fatal("end of file in string"); +} + +{DIGIT}+ { + BEGIN(number); + dot_seen = false; + init_strbuf(); + add_str(yytext); + } +\. { + BEGIN(number); + dot_seen = true; + init_strbuf(); + add_str("."); + } +{ + {DIGIT}+ add_str(yytext); + \. { + if (dot_seen) { + BEGIN(INITIAL); + yylval.str = strbuf; + unput('.'); + return (NUMBER); + } else { + dot_seen = true; + add_str("."); + } + } + \\\n[ \t]* lineno++; + [^0-9A-F\.] { + BEGIN(INITIAL); + unput(yytext[0]); + if (strcmp(strbuf, ".") == 0) + return (DOT); + else { + yylval.str = strbuf; + return (NUMBER); + } + } +} + +"auto" return (AUTO); +"break" return (BREAK); +"continue" return (CONTINUE); +"define" return (DEFINE); +"else" return (ELSE); +"ibase" return (IBASE); +"if" return (IF); +"last" return (DOT); +"for" return (FOR); +"length" return (LENGTH); +"obase" return (OBASE); +"print" return (PRINT); +"quit" return (QUIT); +"return" return (RETURN); +"scale" return (SCALE); +"sqrt" return (SQRT); +"while" return (WHILE); + +"^" return (EXPONENT); +"*" return (MULTIPLY); +"/" return (DIVIDE); +"%" return (REMAINDER); + +"!" return (BOOL_NOT); +"&&" return (BOOL_AND); +"||" return (BOOL_OR); + +"+" return (PLUS); +"-" return (MINUS); + +"++" return (INCR); +"--" return (DECR); + +"=" yylval.str = ""; return (ASSIGN_OP); +"+=" yylval.str = "+"; return (ASSIGN_OP); +"-=" yylval.str = "-"; return (ASSIGN_OP); +"*=" yylval.str = "*"; return (ASSIGN_OP); +"/=" yylval.str = "/"; return (ASSIGN_OP); +"%=" yylval.str = "%"; return (ASSIGN_OP); +"^=" yylval.str = "^"; return (ASSIGN_OP); + +"==" return (EQUALS); +"<=" return (LESS_EQ); +">=" return (GREATER_EQ); +"!=" return (UNEQUALS); +"<" return (LESS); +">" return (GREATER); + +"," return (COMMA); +";" return (SEMICOLON); + +"(" return (LPAR); +")" return (RPAR); + +"[" return (LBRACKET); +"]" return (RBRACKET); + +"{" return (LBRACE); +"}" return (RBRACE); + +{ALPHA}{ALPHANUM}* { + /* alloc an extra byte for the type marker */ + char *p = malloc(yyleng + 2); + if (p == NULL) + err(1, NULL); + strlcpy(p, yytext, yyleng + 1); + yylval.astr = p; + return (LETTER); + } + +\\\n lineno++; +\n lineno++; return (NEWLINE); + +#[^\n]* ; +[ \t] ; +<> return (QUIT); +. yyerror("illegal character"); + +%% + +static void +init_strbuf(void) +{ + + if (strbuf == NULL) { + strbuf = malloc(strbuf_sz); + if (strbuf == NULL) + err(1, NULL); + } + strbuf[0] = '\0'; +} + +static void +add_str(const char *str) +{ + size_t arglen; + + arglen = strlen(str); + + if (strlen(strbuf) + arglen + 1 > strbuf_sz) { + size_t newsize; + char *p; + + newsize = strbuf_sz + arglen + 1; + p = realloc(strbuf, newsize); + if (p == NULL) { + free(strbuf); + err(1, NULL); + } + strbuf_sz = newsize; + strbuf = p; + } + strlcat(strbuf, str, strbuf_sz); +} + +/* ARGSUSED */ +void +abort_line(int sig) +{ + static const char str[] = "[\n]P\n"; + int save_errno; + + switch (sig) { + default: + save_errno = errno; + YY_FLUSH_BUFFER; /* XXX signal race? */ + write(STDOUT_FILENO, str, sizeof(str) - 1); + errno = save_errno; + } +} + +int +yywrap(void) +{ + static YY_BUFFER_STATE buf; + static int state; + + if (fileindex == 0 && sargc > 0 && strcmp(sargv[0], _PATH_LIBB) == 0) { + filename = sargv[fileindex++]; + yyin = fopen(filename, "r"); + lineno = 1; + if (yyin == NULL) + err(1, "cannot open %s", filename); + return (0); + } + if (state == 0 && cmdexpr[0] != '\0') { + buf = yy_scan_string(cmdexpr); + state++; + lineno = 1; + filename = "command line"; + return (0); + } else if (state == 1) { + yy_delete_buffer(buf); + free(cmdexpr); + state++; + } + if (yyin != NULL && yyin != stdin) + fclose(yyin); + if (fileindex < sargc) { + filename = sargv[fileindex++]; + yyin = fopen(filename, "r"); + lineno = 1; + if (yyin == NULL) + err(1, "cannot open %s", filename); + return (0); + } else if (fileindex == sargc) { + fileindex++; + yyin = stdin; + if (interactive) + signal(SIGINT, abort_line); + lineno = 1; + filename = "stdin"; + return (0); + } + return (1); +} + +static int +bc_yyinput(char *buf, int maxlen) +{ + int num; + if (yyin == stdin && interactive) { + const char *bp; + + if ((bp = el_gets(el, &num)) == NULL || num == 0) + return (0); + if (num > maxlen) { + el_push(el, (char *)(uintptr_t)(bp) + maxlen); + num = maxlen; + } + memcpy(buf, bp, num); + history(hist, &he, H_ENTER, bp); + } else { + int c = '*'; + for (num = 0; num < maxlen && + (c = getc(yyin)) != EOF && c != '\n'; ++num) + buf[num] = (char) c; + if (c == '\n') + buf[num++] = (char) c; + if (c == EOF && ferror(yyin)) + YY_FATAL_ERROR( "input in flex scanner failed" ); + } + return (num); +} + diff --git a/usr.bin/biff/biff.c b/usr.bin/biff/biff.c index c04c8d39f9fa..70d2d85d0028 100644 --- a/usr.bin/biff/biff.c +++ b/usr.bin/biff/biff.c @@ -110,7 +110,7 @@ main(int argc, char *argv[]) } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: biff [n | y | b]\n"); exit(2); diff --git a/usr.bin/bluetooth/bthost/Makefile b/usr.bin/bluetooth/bthost/Makefile index fe2c47959353..833d10721392 100644 --- a/usr.bin/bluetooth/bthost/Makefile +++ b/usr.bin/bluetooth/bthost/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= bthost -WARNS?= 2 DPADD= ${LIBBLUETOOTH} LDADD= -lbluetooth diff --git a/usr.bin/brandelf/brandelf.1 b/usr.bin/brandelf/brandelf.1 index 9c7439e1e3b2..689f0cc4650c 100644 --- a/usr.bin/brandelf/brandelf.1 +++ b/usr.bin/brandelf/brandelf.1 @@ -96,7 +96,7 @@ brandelf -t Linux file .%A The Santa Cruz Operation, Inc. .%T System V Application Binary Interface .%D April 29, 1998 (DRAFT) -.%O http://www.sco.com/developer/devspecs/ +.%U http://www.sco.com/developer/devspecs/ .Re .Sh HISTORY The diff --git a/usr.bin/bsdiff/Makefile.inc b/usr.bin/bsdiff/Makefile.inc index 198d906713fd..265f86d1ed55 100644 --- a/usr.bin/bsdiff/Makefile.inc +++ b/usr.bin/bsdiff/Makefile.inc @@ -1,6 +1,3 @@ # $FreeBSD$ -WARNS?= 6 - .include "../Makefile.inc" - diff --git a/usr.bin/bsdiff/bsdiff/bsdiff.1 b/usr.bin/bsdiff/bsdiff/bsdiff.1 index 5c608b44c426..4ceb9ed5bb0c 100644 --- a/usr.bin/bsdiff/bsdiff/bsdiff.1 +++ b/usr.bin/bsdiff/bsdiff/bsdiff.1 @@ -65,5 +65,24 @@ an absolute minimum working set size of 8 times the size of .Ar oldfile . .Sh SEE ALSO .Xr bspatch 1 +.Sh BUGS +The +.Nm +utility does not store the hashes of +.Ar oldfile +or +.Ar newfile +in +.Ar patchfile . +As a result, it is possible to apply a patch to the wrong file; this +will usually produce garbage. +It is recommended that users of +.Nm +store the hashes of +.Ar oldfile +and +.Ar newfile +and compare against them before and after applying +.Ar patchfile . .Sh AUTHORS .An Colin Percival Aq cperciva@FreeBSD.org diff --git a/usr.bin/bsdiff/bspatch/bspatch.1 b/usr.bin/bsdiff/bspatch/bspatch.1 index 894bc5075225..29b8db3c81ec 100644 --- a/usr.bin/bsdiff/bspatch/bspatch.1 +++ b/usr.bin/bsdiff/bspatch/bspatch.1 @@ -61,5 +61,26 @@ but can tolerate a very small working set without a dramatic loss of performance. .Sh SEE ALSO .Xr bsdiff 1 +.Sh BUGS +The +.Nm +utility does not verify that +.Ar oldfile +is the correct source file for +.Ar patchfile . +Attempting to apply a patch to the wrong file will usually produce +garbage; consequently it is strongly recommended that users of +.Nm +verify that +.Ar oldfile +matches the source file from which +.Ar patchfile +was built, by comparing cryptographic hashes, for example. +Users may also wish to verify after running +.Nm +that +.Ar newfile +matches the target file from which +.Ar was built. .Sh AUTHORS .An Colin Percival Aq cperciva@FreeBSD.org diff --git a/usr.bin/bzip2/Makefile b/usr.bin/bzip2/Makefile index 0460fff19142..c2490a2bb5a1 100644 --- a/usr.bin/bzip2/Makefile +++ b/usr.bin/bzip2/Makefile @@ -6,6 +6,8 @@ BZ2DIR= ${.CURDIR}/../../contrib/bzip2 PROG= bzip2 CFLAGS+= -D_FILE_OFFSET_BITS=64 +WARNS?= 3 + DPADD= ${LIBBZ2} LDADD= -lbz2 diff --git a/usr.bin/calendar/Makefile b/usr.bin/calendar/Makefile index 481713ac9931..27df8b679714 100644 --- a/usr.bin/calendar/Makefile +++ b/usr.bin/calendar/Makefile @@ -9,6 +9,8 @@ DE_LINKS= de_DE.ISO8859-15 FR_LINKS= fr_FR.ISO8859-15 TEXTMODE?= 444 +WARNS?= 3 + beforeinstall: ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${TEXTMODE} \ ${.CURDIR}/calendars/calendar.* ${DESTDIR}${SHAREDIR}/calendar diff --git a/usr.bin/calendar/calendar.c b/usr.bin/calendar/calendar.c index d1bb74516d98..39f2c9ce23f9 100644 --- a/usr.bin/calendar/calendar.c +++ b/usr.bin/calendar/calendar.c @@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include "pathnames.h" #include "calendar.h" struct passwd *pw; diff --git a/usr.bin/calendar/calendars/calendar.all b/usr.bin/calendar/calendars/calendar.all index b46dcb46f0e4..545c0e4e868e 100644 --- a/usr.bin/calendar/calendars/calendar.all +++ b/usr.bin/calendar/calendars/calendar.all @@ -8,13 +8,16 @@ #define _calendar_all_ #include +#include #include #include #include #include #include -#include +#include #include +#include +#include #include #endif /* !_calendar_all_ */ diff --git a/usr.bin/calendar/calendars/calendar.dutch b/usr.bin/calendar/calendars/calendar.dutch index 3094ddd0578f..47b1bf520a4e 100644 --- a/usr.bin/calendar/calendars/calendar.dutch +++ b/usr.bin/calendar/calendars/calendar.dutch @@ -5,6 +5,7 @@ */ LANG=nl_NL.ISO8859-15 +Easter=Pasen /* * Feestdagen @@ -32,21 +33,21 @@ LANG=nl_NL.ISO8859-15 /* * Pasen gerelateerd */ -Easter-50 Carnaval -Easter-49 Carnaval -Easter-48 Carnaval -Easter-47 Carnaval (Vastenavond) -Easter-46 Aswoensdag -Easter-7 Palmzondag -Easter-3 Witte Donderdag -Easter-2 Goede vrijdag -Easter-1 Stille zaterdag -Easter Eerste paasdag -Easter+1 Tweede paasdag -Easter+39 Hemelvaartsdag -Easter+49 Eerste Pinksterdag -Easter+50 Tweede Pinksterdag -Easter+56 Trinitatis +Pasen-50 Carnaval +Pasen-49 Carnaval +Pasen-48 Carnaval +Pasen-47 Carnaval (Vastenavond) +Pasen-46 Aswoensdag +Pasen-7 Palmzondag +Pasen-3 Witte Donderdag +Pasen-2 Goede vrijdag +Pasen-1 Stille zaterdag +Pasen Eerste paasdag +Pasen+1 Tweede paasdag +Pasen+39 Hemelvaartsdag +Pasen+49 Eerste Pinksterdag +Pasen+50 Tweede Pinksterdag +Pasen+56 Trinitatis /* * Misc diff --git a/usr.bin/calendar/calendars/calendar.freebsd b/usr.bin/calendar/calendars/calendar.freebsd index a28033773098..3c7d71db196b 100644 --- a/usr.bin/calendar/calendars/calendar.freebsd +++ b/usr.bin/calendar/calendars/calendar.freebsd @@ -134,6 +134,7 @@ 05/11 Jesus Rodriguez born in Barcelona, Spain, 1972 05/11 Roman Kurakin born in Moscow, USSR, 1979 05/13 Pete Fritchman born in Lansdale, Pennsylvania, United States, 1983 +05/14 Bruce Cran born in Cambridge, United Kingdom, 1981 05/14 Tatsumi Hosokawa born in Tokyo, Japan, 1968 05/14 Shigeyuku Fukushima born in Osaka, Japan, 1974 05/16 Johann Kois born in Wolfsberg, Austria, 1975 @@ -158,6 +159,7 @@ 06/02 Jean-Marc Zucconi born in Pontarlier, France, 1954 06/02 Alexander Botero-Lowry born in Austin, TX, USA, 1986 06/03 CHOI Junho born in Seoul, Korea, 1974 +06/03 Wesley Shields born in Binghamton, NY, USA, 1981 06/04 Julian Elischer born in Perth, Australia, 1959 06/04 Jason Evans born in Greeley, Colorado, United States, 1973 06/04 Justin Gibbs born in San Pedro, California, United States, 1973 @@ -203,6 +205,7 @@ 07/22 Lukas Ertl born in Weissenbach/Enns, Steiermark, Austria, 1976 07/23 Sergey A. Osokin born in Krasnogorsky, Stepnogorsk, Akmolinskaya region, Kazakhstan, 1972 07/24 Alexander Nedotsukov born in Ulyanovsk, Russian Federation, 1974 +07/24 Alberto Villa born in Vercelli, Italy, 1987 07/28 Jim Mock born in Bethlehem, Pennsylvania, United States, 1974 07/28 Tom Hukins born in Manchester, United Kingdom, 1976 07/29 Dirk Meyer born in Kassel, Hessen, Germany, 1965 @@ -244,6 +247,7 @@ 09/10 Wesley R. Peters born in Hartford, Alabama, United States, 1961 09/12 Weongyo Jeong born in Haman, Korea, 1980 09/12 William C. Fumerola II born in Detroit, Michigan, United States, 1981 +09/12 Benedict Christopher Reuschling born in Darmstadt, Germany, 1981 09/15 Dima Panov born in Khabarovsk, Russian Federation, 1978 09/17 Maxim Bolotin born in Rostov-on-Don, Russian Federation, 1976 09/20 Kevin Lo born in Taipei, Taiwan, Republic of China, 1972 @@ -253,6 +257,7 @@ 09/28 Alex Dupre born in Milano, Italy, 1980 09/29 Matthew Hunt born in Johnstown, Pennsylvania, United States, 1976 09/30 Hiten M. Pandya born in Dar-es-Salaam, Tanzania, East Africa, 1986 +10/02 Beat Gaetzi born in Zurich, Switzerland, 1980 10/05 Hiroki Sato born in Yamagata, Japan, 1977 10/05 Chris Costello born in Houston, Texas, United States, 1985 10/09 Stefan Walter born in Werne, Nordrhein-Westfalen, 1978 @@ -283,6 +288,7 @@ 11/18 Thomas Quinot born in Paris, France, 1977 11/19 Konstantin Belousov born in Kiev, USSR, 1972 11/20 Dmitry Morozovsky born in Moscow, USSR, 1968 +11/20 Gavin Atkinson born in Middlesbrough, United Kingdom, 1979 11/23 Josef Lawrence Karthauser born in Pembury, Kent, United Kingdom, 1972 11/24 Andrey Zakhvatov born in Chelyabinsk, Russian Federation, 1974 11/24 Daniel Gerzo born in Bratislava, Slovakia, 1986 diff --git a/usr.bin/calendar/day.c b/usr.bin/calendar/day.c index d3f3c1ec4f29..e40481eb918a 100644 --- a/usr.bin/calendar/day.c +++ b/usr.bin/calendar/day.c @@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include "pathnames.h" #include "calendar.h" struct tm *tp; diff --git a/usr.bin/calendar/io.c b/usr.bin/calendar/io.c index 92df7be2582d..03f28feb7aa3 100644 --- a/usr.bin/calendar/io.c +++ b/usr.bin/calendar/io.c @@ -467,7 +467,7 @@ closecal(FILE *fp) if (!doall) return; - (void)rewind(fp); + rewind(fp); if (fstat(fileno(fp), &sbuf) || !sbuf.st_size) goto done; if (pipe(pdes) < 0) diff --git a/usr.bin/calendar/ostern.c b/usr.bin/calendar/ostern.c index 76e593327a39..89e7b1cee51b 100644 --- a/usr.bin/calendar/ostern.c +++ b/usr.bin/calendar/ostern.c @@ -30,7 +30,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include "calendar.h" @@ -88,7 +87,7 @@ geteaster(char *s, int year) else return (0); -#if DEBUG +#ifdef DEBUG printf("%s %d %d\n", s, year, EASTERNAMELEN); #endif diff --git a/usr.bin/calendar/paskha.c b/usr.bin/calendar/paskha.c index d96ffc2546e0..e713f5f9be9e 100644 --- a/usr.bin/calendar/paskha.c +++ b/usr.bin/calendar/paskha.c @@ -30,7 +30,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include "calendar.h" diff --git a/usr.bin/catman/Makefile b/usr.bin/catman/Makefile index d80a5fd8ae49..ab4c01453a1b 100644 --- a/usr.bin/catman/Makefile +++ b/usr.bin/catman/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= catman -WARNS?= 6 .include diff --git a/usr.bin/catman/catman.c b/usr.bin/catman/catman.c index ba3ad248a2c2..c17a091593cb 100644 --- a/usr.bin/catman/catman.c +++ b/usr.bin/catman/catman.c @@ -589,9 +589,15 @@ process_section(char *mandir, char *section) } static int -select_sections(struct dirent *entry) +select_sections(const struct dirent *entry) { - return directory_type(entry->d_name) == MAN_SECTION_DIR; + char *name; + int ret; + + name = strdup(entry->d_name); + ret = directory_type(name) == MAN_SECTION_DIR; + free(name); + return (ret); } /* diff --git a/usr.bin/chkey/Makefile b/usr.bin/chkey/Makefile index 2813ca1a45f0..847e5c960106 100644 --- a/usr.bin/chkey/Makefile +++ b/usr.bin/chkey/Makefile @@ -13,6 +13,4 @@ CFLAGS+= -DYP DPADD= ${LIBRPCSVC} ${LIBMP} ${LIBCRYPTO} LDADD= -lrpcsvc -lmp -lcrypto -WARNS?= 6 - .include diff --git a/usr.bin/chpass/Makefile b/usr.bin/chpass/Makefile index e9589562186a..7f7ac510c6bc 100644 --- a/usr.bin/chpass/Makefile +++ b/usr.bin/chpass/Makefile @@ -9,7 +9,6 @@ PROG= chpass SRCS= chpass.c edit.c field.c pw_scan.c table.c util.c BINOWN= root BINMODE=4555 -WARNS?= 5 .if ${MK_NIS} != "no" CFLAGS+= -DYP .endif diff --git a/usr.bin/chpass/chpass.1 b/usr.bin/chpass/chpass.1 index 24b17597bad6..a926607eed0c 100644 --- a/usr.bin/chpass/chpass.1 +++ b/usr.bin/chpass/chpass.1 @@ -168,7 +168,7 @@ that manipulate these files will often return only one of the multiple entries, and that one by random selection. .Pp The -.Ar group +.Ar gid field is the group that the user will be placed in at login. Since .Bx diff --git a/usr.bin/colldef/Makefile b/usr.bin/colldef/Makefile index 6cb213f48898..5f62bc596b79 100644 --- a/usr.bin/colldef/Makefile +++ b/usr.bin/colldef/Makefile @@ -8,4 +8,6 @@ CFLAGS+=-DCOLLATE_DEBUG -DYY_NO_UNPUT LDADD= -ll DPADD= ${LIBL} +WARNS?= 2 + .include diff --git a/usr.bin/comm/comm.1 b/usr.bin/comm/comm.1 index 2402ab5a1ceb..02b508cf6264 100644 --- a/usr.bin/comm/comm.1 +++ b/usr.bin/comm/comm.1 @@ -35,7 +35,7 @@ .\" From: @(#)comm.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd January 26, 2005 +.Dd December 12, 2009 .Os .Dt COMM 1 .Sh NAME @@ -118,7 +118,3 @@ A .Nm command appeared in .At v4 . -.Sh BUGS -Input lines are limited to -.Dv LINE_MAX -(2048) characters in length. diff --git a/usr.bin/comm/comm.c b/usr.bin/comm/comm.c index ea9267311354..afda0e73e52f 100644 --- a/usr.bin/comm/comm.c +++ b/usr.bin/comm/comm.c @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -59,7 +60,8 @@ __FBSDID("$FreeBSD$"); #include #include -#define MAXLINELEN (LINE_MAX + 1) +#define INITLINELEN (LINE_MAX + 1) +#define MAXLINELEN ((SIZE_MAX / sizeof(wchar_t)) / 2) const wchar_t *tabs[] = { L"", L"\t", L"\t\t" }; @@ -83,8 +85,8 @@ main(int argc, char *argv[]) flag1 = flag2 = flag3 = 1; iflag = 0; - line1len = MAXLINELEN; - line2len = MAXLINELEN; + line1len = INITLINELEN; + line2len = INITLINELEN; line1 = malloc(line1len * sizeof(*line1)); line2 = malloc(line2len * sizeof(*line2)); if (line1 == NULL || line2 == NULL) @@ -163,7 +165,7 @@ main(int argc, char *argv[]) if (!comp) { read1 = read2 = 1; if (col3 != NULL) - (void)printf("%ls%ls", col3, line1); + (void)printf("%ls%ls\n", col3, line1); continue; } @@ -172,12 +174,12 @@ main(int argc, char *argv[]) read1 = 1; read2 = 0; if (col1 != NULL) - (void)printf("%ls%ls", col1, line1); + (void)printf("%ls%ls\n", col1, line1); } else { read1 = 0; read2 = 1; if (col2 != NULL) - (void)printf("%ls%ls", col2, line2); + (void)printf("%ls%ls\n", col2, line2); } } exit(0); @@ -190,19 +192,20 @@ getline(wchar_t *buf, size_t *buflen, FILE *fp) wint_t ch; bufpos = 0; - do { - if ((ch = getwc(fp)) != WEOF) { - if (bufpos + 2 >= *buflen) { - *buflen = *buflen * 2; - buf = reallocf(buf, *buflen * sizeof(*buf)); - if (buf == NULL) - return (NULL); - } - buf[bufpos++] = ch; + while ((ch = getwc(fp)) != WEOF && ch != '\n') { + if (bufpos + 1 >= *buflen) { + *buflen = *buflen * 2; + if (*buflen > MAXLINELEN) + errx(1, + "Maximum line buffer length (%zu) exceeded", + MAXLINELEN); + buf = reallocf(buf, *buflen * sizeof(*buf)); + if (buf == NULL) + err(1, "reallocf"); } - } while (ch != WEOF && ch != '\n'); - if (bufpos + 1 != *buflen) - buf[bufpos] = '\0'; + buf[bufpos++] = ch; + } + buf[bufpos] = '\0'; return (bufpos != 0 || ch == '\n' ? buf : NULL); } @@ -212,7 +215,7 @@ show(FILE *fp, const char *fn, const wchar_t *offset, wchar_t *buf, size_t *bufl { do { - (void)printf("%ls%ls", offset, buf); + (void)printf("%ls%ls\n", offset, buf); } while ((buf = getline(buf, buflen, fp)) != NULL); if (ferror(fp)) err(1, "%s", fn); @@ -254,13 +257,13 @@ wcsicoll(const wchar_t *s1, const wchar_t *s2) new_l2_buflen = wcsicoll_l2_buflen; while (new_l1_buflen < l1) { if (new_l1_buflen == 0) - new_l1_buflen = MAXLINELEN; + new_l1_buflen = INITLINELEN; else new_l1_buflen *= 2; } while (new_l2_buflen < l2) { if (new_l2_buflen == 0) - new_l2_buflen = MAXLINELEN; + new_l2_buflen = INITLINELEN; else new_l2_buflen *= 2; } diff --git a/usr.bin/compile_et/Makefile b/usr.bin/compile_et/Makefile index 3d4ab15dfcce..262e696ac1b4 100644 --- a/usr.bin/compile_et/Makefile +++ b/usr.bin/compile_et/Makefile @@ -6,4 +6,6 @@ PROG= compile_et SRCS= compile_et.c parse.y lex.l getarg.c CFLAGS+=-I. -I${.CURDIR}/../../contrib/com_err +WARNS?= 0 + .include diff --git a/usr.bin/compress/Makefile b/usr.bin/compress/Makefile index 45c0814add3f..a586b97fcfcf 100644 --- a/usr.bin/compress/Makefile +++ b/usr.bin/compress/Makefile @@ -5,7 +5,6 @@ PROG= compress SRCS= compress.c zopen.c LINKS= ${BINDIR}/compress ${BINDIR}/uncompress MLINKS= compress.1 uncompress.1 -WARNS?= 6 # XXX zopen is not part of libc # MAN=zopen.3 diff --git a/usr.bin/cpio/Makefile b/usr.bin/cpio/Makefile index c64ab6c6a040..bfcbe9734297 100644 --- a/usr.bin/cpio/Makefile +++ b/usr.bin/cpio/Makefile @@ -5,8 +5,6 @@ PROG= bsdcpio BSDCPIO_VERSION_STRING=2.7.0 SRCS= cpio.c cmdline.c err.c matching.c pathmatch.c -WARNS?= 6 -DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2} CFLAGS+= -DBSDCPIO_VERSION_STRING=\"${BSDCPIO_VERSION_STRING}\" CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" .ifdef RELEASE_CRUNCH @@ -14,8 +12,10 @@ CFLAGS+= -DPLATFORM_CONFIG_H=\"config_freebsd.h\" # statically linked, cannot use -lcrypto, and are size sensitive. CFLAGS+= -DSMALLER .endif -LDADD+= -larchive -lz -lbz2 -lmd +DPADD= ${LIBARCHIVE} ${LIBZ} ${LIBBZ2} ${LIBMD} +LDADD= -larchive -lz -lbz2 -lmd .if ${MK_OPENSSL} != "no" +DPADD+= ${LIBCRYPTO} LDADD+= -lcrypto .endif diff --git a/usr.bin/cpio/bsdcpio.1 b/usr.bin/cpio/bsdcpio.1 index 81b34626bbd0..6017bc5b465c 100644 --- a/usr.bin/cpio/bsdcpio.1 +++ b/usr.bin/cpio/bsdcpio.1 @@ -266,7 +266,7 @@ for more information. .Sh EXAMPLES The .Nm -command is traditionally used to copy file heirarchies in conjunction +command is traditionally used to copy file hierarchies in conjunction with the .Xr find 1 command. diff --git a/usr.bin/cpio/cmdline.c b/usr.bin/cpio/cmdline.c index 9b6172854033..b6a56bed485d 100644 --- a/usr.bin/cpio/cmdline.c +++ b/usr.bin/cpio/cmdline.c @@ -50,7 +50,7 @@ __FBSDID("$FreeBSD$"); /* * Short options for cpio. Please keep this sorted. */ -static const char *short_options = "0AaBC:F:O:cdE:f:H:hijLlmnopR:rtuvW:yZz"; +static const char *short_options = "0AaBC:F:O:cdE:f:H:hijLlmnopR:rtuvVW:yZz"; /* * Long options for cpio. Please keep this sorted. @@ -61,6 +61,7 @@ static const struct option { int equivalent; /* Equivalent short option. */ } cpio_longopts[] = { { "create", 0, 'o' }, + { "dot", 0, 'V' }, { "extract", 0, 'i' }, { "file", 1, 'F' }, { "format", 1, 'H' }, diff --git a/usr.bin/cpio/cpio.c b/usr.bin/cpio/cpio.c index 3b626f7f5405..53195aa95af2 100644 --- a/usr.bin/cpio/cpio.c +++ b/usr.bin/cpio/cpio.c @@ -278,6 +278,9 @@ main(int argc, char *argv[]) case 'v': /* POSIX 1997 */ cpio->verbose++; break; + case 'V': /* GNU cpio */ + cpio->dot++; + break; case OPTION_VERSION: /* GNU convention */ version(); break; @@ -331,6 +334,9 @@ main(int argc, char *argv[]) /* -l requires -p */ if (cpio->option_link && cpio->mode != 'p') cpio_errc(1, 0, "Option -l requires -p"); + /* -v overrides -V */ + if (cpio->dot && cpio->verbose) + cpio->dot = 0; /* TODO: Flag other nonsensical combinations. */ switch (cpio->mode) { @@ -388,7 +394,7 @@ static const char *long_help_msg = "First option must be a mode specifier:\n" " -i Input -o Output -p Pass\n" "Common Options:\n" - " -v Verbose\n" + " -v Verbose filenames -V one dot per file\n" "Create: %p -o [options] < [list of files] > [archive]\n" #ifdef HAVE_BZLIB_H " -y Compress archive with bzip2\n" @@ -521,6 +527,8 @@ mode_out(struct cpio *cpio) } r = archive_write_close(cpio->archive); + if (cpio->dot) + fprintf(stderr, "\n"); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(cpio->archive)); @@ -659,6 +667,8 @@ entry_to_archive(struct cpio *cpio, struct archive_entry *entry) /* Print out the destination name to the user. */ if (cpio->verbose) fprintf(stderr,"%s", destpath); + if (cpio->dot) + fprintf(stderr, "."); /* * Option_link only makes sense in pass mode and for @@ -857,7 +867,9 @@ mode_in(struct cpio *cpio) if (destpath == NULL) continue; if (cpio->verbose) - fprintf(stdout, "%s\n", destpath); + fprintf(stderr, "%s\n", destpath); + if (cpio->dot) + fprintf(stderr, "."); if (cpio->uid_override >= 0) archive_entry_set_uid(entry, cpio->uid_override); if (cpio->gid_override >= 0) @@ -872,6 +884,8 @@ mode_in(struct cpio *cpio) } } r = archive_read_close(a); + if (cpio->dot) + fprintf(stderr, "\n"); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(a)); r = archive_write_close(ext); @@ -1078,6 +1092,8 @@ mode_pass(struct cpio *cpio, const char *destdir) archive_entry_linkresolver_free(cpio->linkresolver); r = archive_write_close(cpio->archive); + if (cpio->dot) + fprintf(stderr, "\n"); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(cpio->archive)); diff --git a/usr.bin/cpio/cpio.h b/usr.bin/cpio/cpio.h index 8493299263a7..8c1873725138 100644 --- a/usr.bin/cpio/cpio.h +++ b/usr.bin/cpio/cpio.h @@ -52,6 +52,7 @@ struct cpio { const char *format; /* -H format */ int bytes_per_block; /* -b block_size */ int verbose; /* -v */ + int dot; /* -V */ int quiet; /* --quiet */ int extract_flags; /* Flags for extract operation */ char symlink_mode; /* H or L, per BSD conventions */ diff --git a/usr.bin/cpio/test/Makefile b/usr.bin/cpio/test/Makefile index 7da5a606226a..ace951698010 100644 --- a/usr.bin/cpio/test/Makefile +++ b/usr.bin/cpio/test/Makefile @@ -53,7 +53,6 @@ CFLAGS+= -I${CPIO_SRCDIR} # Uncomment to link against dmalloc #LDADD+= -L/usr/local/lib -ldmalloc #CFLAGS+= -I/usr/local/include -DUSE_DMALLOC -WARNS=6 check test: bsdcpio_test ${.OBJDIR}/bsdcpio_test -p ${.OBJDIR}/../bsdcpio -r ${.CURDIR} diff --git a/usr.bin/cpuset/Makefile b/usr.bin/cpuset/Makefile index 85a51485a47c..660a0962031b 100644 --- a/usr.bin/cpuset/Makefile +++ b/usr.bin/cpuset/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= cpuset -WARNS?= 6 .include diff --git a/usr.bin/csup/Makefile b/usr.bin/csup/Makefile index 37536fa9a457..af1815cb14e5 100644 --- a/usr.bin/csup/Makefile +++ b/usr.bin/csup/Makefile @@ -1,40 +1,24 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/../../contrib/csup +PREFIX?= /usr/local +BINDIR?= ${PREFIX}/bin +MANDIR?= ${PREFIX}/man/man + +UNAME!= /usr/bin/uname -s PROG= csup -SRCS= attrstack.c \ - config.c \ - detailer.c \ - diff.c \ - fattr.c \ - fixups.c \ - fnmatch.c \ - globtree.c \ - idcache.c \ - keyword.c \ - lex.rcs.c \ - lister.c \ - main.c \ - misc.c \ - mux.c \ - parse.y \ - pathcomp.c \ - proto.c \ - rcsfile.c \ - rcsparse.c \ - rsyncfile.c \ - status.c \ - stream.c \ - threads.c \ - token.l \ - updater.c +SRCS= attrstack.c auth.c config.c detailer.c diff.c fattr.c fixups.c fnmatch.c \ + globtree.c idcache.c keyword.c lister.c main.c misc.c mux.c parse.y \ + pathcomp.c proto.c status.c stream.c threads.c token.l updater.c \ + rcsfile.c rcsparse.c lex.rcs.c rsyncfile.c -CFLAGS+= -I. -I${.CURDIR}/../../contrib/csup -CFLAGS+= -DHAVE_FFLAGS -DNDEBUG -WARNS?= 1 +CFLAGS+= -I. -I${.CURDIR} -g -pthread -DHAVE_FFLAGS -DNDEBUG +WARNS?= 1 -DPADD= ${LIBCRYPTO} ${LIBZ} ${LIBPTHREAD} -LDADD= -lcrypto -lz -lpthread +DPADD= ${LIBCRYPTO} ${LIBZ} +LDADD= -lcrypto -lz + +SCRIPTS= cpasswd.sh +MAN= csup.1 cpasswd.1 .include diff --git a/contrib/csup/README b/usr.bin/csup/README similarity index 100% rename from contrib/csup/README rename to usr.bin/csup/README diff --git a/contrib/csup/TODO b/usr.bin/csup/TODO similarity index 85% rename from contrib/csup/TODO rename to usr.bin/csup/TODO index 41b2408766f2..9854d35acc83 100644 --- a/contrib/csup/TODO +++ b/usr.bin/csup/TODO @@ -17,11 +17,9 @@ BUGS: MISSING FEATURES: -- Add support for authentication. - Add support for shell commands sent by the server. -- Add missing support for various CVSup options : -D, -a (requires - authentication support), -e and -E (requires shell commands support) - and the destDir parameter. +- Add missing support for various CVSup options : -D, -e and -E (requires + shell commands support) and the destDir parameter. - For now, this code should build fine on FreeBSD, NetBSD, OpenBSD, Linux and Darwin. Solaris support would also be nice at some point. - Implement some new useful options : the ability to generate CVS diff --git a/contrib/csup/attrstack.c b/usr.bin/csup/attrstack.c similarity index 100% rename from contrib/csup/attrstack.c rename to usr.bin/csup/attrstack.c diff --git a/contrib/csup/attrstack.h b/usr.bin/csup/attrstack.h similarity index 100% rename from contrib/csup/attrstack.h rename to usr.bin/csup/attrstack.h diff --git a/usr.bin/csup/auth.c b/usr.bin/csup/auth.c new file mode 100644 index 000000000000..4e79bc5a361e --- /dev/null +++ b/usr.bin/csup/auth.c @@ -0,0 +1,331 @@ +/*- + * Copyright (c) 2003-2007, Petar Zhivkov Petrov + * 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 +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "auth.h" +#include "config.h" +#include "misc.h" +#include "proto.h" +#include "stream.h" + +#define MD5_BYTES 16 + +/* This should be at least 2 * MD5_BYTES + 6 (length of "$md5$" + 1) */ +#define MD5_CHARS_MAX (2*(MD5_BYTES)+6) + +struct srvrecord { + char server[MAXHOSTNAMELEN]; + char client[256]; + char password[256]; +}; + +static int auth_domd5auth(struct config *); +static int auth_lookuprecord(char *, struct srvrecord *); +static int auth_parsetoken(char **, char *, int); +static void auth_makesecret(struct srvrecord *, char *); +static void auth_makeresponse(char *, char *, char *); +static void auth_readablesum(unsigned char *, char *); +static void auth_makechallenge(struct config *, char *); +static int auth_checkresponse(char *, char *, char *); + +int auth_login(struct config *config) +{ + struct stream *s; + char hostbuf[MAXHOSTNAMELEN]; + char *login, *host; + int error; + + s = config->server; + error = gethostname(hostbuf, sizeof(hostbuf)); + hostbuf[sizeof(hostbuf) - 1] = '\0'; + if (error) + host = NULL; + else + host = hostbuf; + login = getlogin(); + proto_printf(s, "USER %s %s\n", login != NULL ? login : "?", + host != NULL ? host : "?"); + stream_flush(s); + error = auth_domd5auth(config); + return (error); +} + +static int +auth_domd5auth(struct config *config) +{ + struct stream *s; + char *line, *cmd, *challenge, *realm, *client, *srvresponse, *msg; + char shrdsecret[MD5_CHARS_MAX], response[MD5_CHARS_MAX]; + char clichallenge[MD5_CHARS_MAX]; + struct srvrecord auth; + int error; + + lprintf(2, "MD5 authentication started\n"); + s = config->server; + line = stream_getln(s, NULL); + cmd = proto_get_ascii(&line); + realm = proto_get_ascii(&line); + challenge = proto_get_ascii(&line); + if (challenge == NULL || + line != NULL || + (strcmp(cmd, "AUTHMD5") != 0)) { + lprintf(-1, "Invalid server reply to USER\n"); + return (STATUS_FAILURE); + } + + client = NULL; + response[0] = clichallenge[0] = '.'; + response[1] = clichallenge[1] = 0; + if (config->reqauth || (strcmp(challenge, ".") != 0)) { + if (strcmp(realm, ".") == 0) { + lprintf(-1, "Authentication required, but not enabled on server\n"); + return (STATUS_FAILURE); + } + error = auth_lookuprecord(realm, &auth); + if (error != STATUS_SUCCESS) + return (error); + client = auth.client; + auth_makesecret(&auth, shrdsecret); + } + + if (strcmp(challenge, ".") != 0) + auth_makeresponse(challenge, shrdsecret, response); + if (config->reqauth) + auth_makechallenge(config, clichallenge); + proto_printf(s, "AUTHMD5 %s %s %s\n", + client == NULL ? "." : client, response, clichallenge); + stream_flush(s); + line = stream_getln(s, NULL); + cmd = proto_get_ascii(&line); + if (cmd == NULL || line == NULL) + goto bad; + if (strcmp(cmd, "OK") == 0) { + srvresponse = proto_get_ascii(&line); + if (srvresponse == NULL) + goto bad; + if (config->reqauth && + !auth_checkresponse(srvresponse, clichallenge, shrdsecret)) { + lprintf(-1, "Server failed to authenticate itself to client\n"); + return (STATUS_FAILURE); + } + lprintf(2, "MD5 authentication successfull\n"); + return (STATUS_SUCCESS); + } + if (strcmp(cmd, "!") == 0) { + msg = proto_get_rest(&line); + if (msg == NULL) + goto bad; + lprintf(-1, "Server error: %s\n", msg); + return (STATUS_FAILURE); + } +bad: + lprintf(-1, "Invalid server reply to AUTHMD5\n"); + return (STATUS_FAILURE); +} + +static int +auth_lookuprecord(char *server, struct srvrecord *auth) +{ + char *home, *line, authfile[FILENAME_MAX]; + struct stream *s; + int linenum = 0, error; + + home = getenv("HOME"); + if (home == NULL) { + lprintf(-1, "Environment variable \"HOME\" is not set\n"); + return (STATUS_FAILURE); + } + snprintf(authfile, sizeof(authfile), "%s/%s", home, AUTHFILE); + s = stream_open_file(authfile, O_RDONLY); + if (s == NULL) { + lprintf(-1, "Could not open file %s\n", authfile); + return (STATUS_FAILURE); + } + + while ((line = stream_getln(s, NULL)) != NULL) { + linenum++; + if (line[0] == '#' || line[0] == '\0') + continue; + error = auth_parsetoken(&line, auth->server, + sizeof(auth->server)); + if (error != STATUS_SUCCESS) { + lprintf(-1, "%s:%d Missng client name\n", authfile, linenum); + goto close; + } + /* Skip the rest of this line, it isn't what we are looking for. */ + if (strcmp(auth->server, server) != 0) + continue; + error = auth_parsetoken(&line, auth->client, + sizeof(auth->client)); + if (error != STATUS_SUCCESS) { + lprintf(-1, "%s:%d Missng password\n", authfile, linenum); + goto close; + } + error = auth_parsetoken(&line, auth->password, + sizeof(auth->password)); + if (error != STATUS_SUCCESS) { + lprintf(-1, "%s:%d Missng comment\n", authfile, linenum); + goto close; + } + stream_close(s); + lprintf(2, "Found authentication record for server \"%s\"\n", + server); + return (STATUS_SUCCESS); + } + lprintf(-1, "Unknown server \"%s\". Fix your %s\n", server , authfile); + memset(auth->password, 0, sizeof(auth->password)); +close: + stream_close(s); + return (STATUS_FAILURE); +} + +static int +auth_parsetoken(char **line, char *buf, int len) +{ + char *colon; + + colon = strchr(*line, ':'); + if (colon == NULL) + return (STATUS_FAILURE); + *colon = 0; + buf[len - 1] = 0; + strncpy(buf, *line, len - 1); + *line = colon + 1; + return (STATUS_SUCCESS); +} + +static void +auth_makesecret(struct srvrecord *auth, char *secret) +{ + char *s, ch; + const char *md5salt = "$md5$"; + unsigned char md5sum[MD5_BYTES]; + MD5_CTX md5; + + MD5_Init(&md5); + for (s = auth->client; *s != 0; ++s) { + ch = tolower(*s); + MD5_Update(&md5, &ch, 1); + } + MD5_Update(&md5, ":", 1); + for (s = auth->server; *s != 0; ++s) { + ch = tolower(*s); + MD5_Update(&md5, &ch, 1); + } + MD5_Update(&md5, ":", 1); + MD5_Update(&md5, auth->password, strlen(auth->password)); + MD5_Final(md5sum, &md5); + memset(secret, 0, sizeof(secret)); + strcpy(secret, md5salt); + auth_readablesum(md5sum, secret + strlen(md5salt)); +} + +static void +auth_makeresponse(char *challenge, char *sharedsecret, char *response) +{ + MD5_CTX md5; + unsigned char md5sum[MD5_BYTES]; + + MD5_Init(&md5); + MD5_Update(&md5, sharedsecret, strlen(sharedsecret)); + MD5_Update(&md5, ":", 1); + MD5_Update(&md5, challenge, strlen(challenge)); + MD5_Final(md5sum, &md5); + auth_readablesum(md5sum, response); +} + +/* + * Generates a challenge string which is an MD5 sum + * of a fairly random string. The purpose is to decrease + * the possibility of generating the same challenge + * string (even by different clients) more then once + * for the same server. + */ +static void +auth_makechallenge(struct config *config, char *challenge) +{ + MD5_CTX md5; + unsigned char md5sum[MD5_BYTES]; + char buf[128]; + struct timeval tv; + struct sockaddr_in laddr; + pid_t pid, ppid; + int error, addrlen; + + gettimeofday(&tv, NULL); + pid = getpid(); + ppid = getppid(); + srand(tv.tv_usec ^ tv.tv_sec ^ pid); + addrlen = sizeof(laddr); + error = getsockname(config->socket, (struct sockaddr *)&laddr, &addrlen); + if (error < 0) { + memset(&laddr, 0, sizeof(laddr)); + } + gettimeofday(&tv, NULL); + MD5_Init(&md5); + snprintf(buf, sizeof(buf), "%s:%ld:%ld:%ld:%d:%d", + inet_ntoa(laddr.sin_addr), tv.tv_sec, tv.tv_usec, random(), pid, ppid); + MD5_Update(&md5, buf, strlen(buf)); + MD5_Final(md5sum, &md5); + auth_readablesum(md5sum, challenge); +} + +static int +auth_checkresponse(char *response, char *challenge, char *secret) +{ + char correctresponse[MD5_CHARS_MAX]; + + auth_makeresponse(challenge, secret, correctresponse); + return (strcmp(response, correctresponse) == 0); +} + +static void +auth_readablesum(unsigned char *md5sum, char *readable) +{ + unsigned int i; + char *s = readable; + + for (i = 0; i < MD5_BYTES; ++i, s+=2) { + sprintf(s, "%.2x", md5sum[i]); + } +} + diff --git a/usr.bin/csup/auth.h b/usr.bin/csup/auth.h new file mode 100644 index 000000000000..61052e33a140 --- /dev/null +++ b/usr.bin/csup/auth.h @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 2003-2007, Petar Zhivkov Petrov + * 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$ + */ +#ifndef _AUTH_H_ +#define _AUTH_H_ + +#define AUTHFILE ".csup/auth" /* user home relative */ + +struct config; + +int auth_login(struct config *); + +#endif /* !_AUTH_H_ */ + diff --git a/contrib/csup/config.c b/usr.bin/csup/config.c similarity index 100% rename from contrib/csup/config.c rename to usr.bin/csup/config.c diff --git a/contrib/csup/config.h b/usr.bin/csup/config.h similarity index 99% rename from contrib/csup/config.h rename to usr.bin/csup/config.h index 78b699547adb..859013cfa23c 100644 --- a/contrib/csup/config.h +++ b/usr.bin/csup/config.h @@ -108,6 +108,7 @@ struct config { struct chan *chan1; struct stream *server; fattr_support_t fasupport; + int reqauth; }; struct config *config_init(const char *, struct coll *, int); diff --git a/usr.bin/csup/cpasswd.1 b/usr.bin/csup/cpasswd.1 new file mode 100644 index 000000000000..946783f4c25c --- /dev/null +++ b/usr.bin/csup/cpasswd.1 @@ -0,0 +1,120 @@ +.\" Copyright 1999-2003 John D. Polstra. +.\" 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. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgment: +.\" This product includes software developed by John D. Polstra. +.\" 4. 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 ``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 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. +.\" +.\" $Id: cvpasswd.1,v 1.4 2003/03/04 18:24:42 jdp Exp $ +.\" $FreeBSD $ +.\" +.Dd June 27, 2007 +.Os FreeBSD +.Dt CPASSWD 1 +.Sh NAME +.Nm cpasswd +.Nd scramble passwords for csup authentication +.Sh SYNOPSIS +.Nm +.Ar clientName +.Ar serverName +.Sh DESCRIPTION +The +.Nm +utility creates scrambled passwords for the +.Nm CVSup +server's authentication database. It is invoked with a client name +and a server name. +.Ar ClientName +is the name the client uses to gain access to the +server. By convention, e-mail addresses are used for all client +names, e.g., +.Ql BillyJoe@FreeBSD.ORG . +Client names are case-insensitive. +.Pp +.Ar ServerName +is the name of the +.Nm CVSup +server which the client wishes to access. By convention, +it is the canonical fully-qualified domain name of the server, e.g., +.Ql CVSup.FreeBSD.ORG . +This must agree with the server's own idea of its name. The name is +case-insensitive. +.Pp +To set up authentication for a given server, one must perform the +following steps: +.Bl -enum +.It +Obtain the official +.Ar serverName +from the administrator of the server or from some other source. +.It +Choose an appropriate +.Ar clientName . +It should be in the form of a valid e-mail address, to make it easy +for the server administrator to contact the user if necessary. +.It +Choose an arbitrary secret +.Ar password . +.It +Run +.Nm cpasswd , +and type in the +.Ar password +when prompted for it. The utility will print out a line to send +to the server administrator, and instruct you how to modify your +.Li $ Ns Ev HOME Ns Pa /.csup/auth +file. You should use a secure channel to send the line to the +server administrator. +.El +.Pp +Since +.Li $ Ns Ev HOME Ns Pa /.csup/auth +contains passwords, you should ensure that it is not readable by +anyone except yourself. +.Sh FILES +.Bl -tag -width $HOME/.csup/authxx -compact +.It Li $ Ns Ev HOME Ns Pa /.csup/auth +Authentication password file. +.El +.Sh SEE ALSO +.Xr csup 1 , +.Xr cvsup 1 , +.Xr cvsupd 8 . +.Pp +.Bd -literal +http://www.cvsup.org/ +.Ed +.Sh AUTHORS +.An -nosplit +.An Petar Zhivkov Petrov Aq pesho.petrov@gmail.com +is the author of +.Nm , +the rewrite of +.Nm cvpasswd . +.An John Polstra Aq jdp@polstra.com +is the author of +.Nm CVSup . +.Sh LEGALITIES +CVSup is a registered trademark of John D. Polstra. diff --git a/usr.bin/csup/cpasswd.sh b/usr.bin/csup/cpasswd.sh new file mode 100755 index 000000000000..71e17c5d8150 --- /dev/null +++ b/usr.bin/csup/cpasswd.sh @@ -0,0 +1,135 @@ +#! /bin/sh +# +# Copyright 2007. Petar Zhivkov Petrov +# pesho.petrov@gmail.com +# +# $FreeBSD$ + +usage() { + echo "Usage: $0 clientName serverName" + echo " $0 -v" +} + +countChars() { + _count="`echo "$1" | sed -e "s/[^$2]//g" | tr -d "\n" | wc -c`" + return 0 +} + +readPassword() { + while [ true ]; do + stty -echo + read -p "$1" _password + stty echo + echo "" + countChars "$_password" ":" + if [ $_count != 0 ]; then + echo "Sorry, password must not contain \":\" characters" + echo "" + else + break + fi + done + return 0 +} + +makeSecret() { + local clientLower="`echo "$1" | tr "[:upper:]" "[:lower:]"`" + local serverLower="`echo "$2" | tr "[:upper:]" "[:lower:]"`" + local secret="`md5 -qs "$clientLower:$serverLower:$3"`" + _secret="\$md5\$$secret" +} + +if [ $# -eq 1 -a "X$1" = "X-v" ]; then + echo "Csup authentication key generator" + usage + exit +elif [ $# -ne 2 ]; then + usage + exit +fi + +clientName=$1 +serverName=$2 + +# +# Client name must contain exactly one '@' and at least one '.'. +# It must not contain a ':'. +# + +countChars "$clientName" "@" +aCount=$_count + +countChars "$clientName" "." +dotCount=$_count +if [ $aCount -ne 1 -o $dotCount -eq 0 ]; then + echo "Client name must have the form of an e-mail address," + echo "e.g., \"user@domain.com\"" + exit +fi + +countChars "$clientName" ":" +colonCount=$_count +if [ $colonCount -gt 0 ]; then + echo "Client name must not contain \":\" characters" + exit +fi + +# +# Server name must not contain '@' and must have at least one '.'. +# It also must not contain a ':'. +# + +countChars "$serverName" "@" +aCount=$_count + +countChars "$serverName" "." +dotCount=$_count +if [ $aCount != 0 -o $dotCount = 0 ]; then + echo "Server name must be a fully-qualified domain name." + echo "e.g., \"host.domain.com\"" + exit +fi + +countChars "$serverName" ":" +colonCount=$_count +if [ $colonCount -gt 0 ]; then + echo "Server name must not contain \":\" characters" + exit +fi + +# +# Ask for password and generate secret. +# + +while [ true ]; do + readPassword "Enter password: " + makeSecret "$clientName" "$serverName" "$_password" + secret=$_secret + + readPassword "Enter same password again: " + makeSecret "$clientName" "$serverName" "$_password" + secret2=$_secret + + if [ "X$secret" = "X$secret2" ]; then + break + else + echo "Passwords did not match. Try again." + echo "" + fi +done + +echo "" +echo "Send this line to the server administrator at $serverName:" +echo "-------------------------------------------------------------------------------" +echo "$clientName:$secret::" +echo "-------------------------------------------------------------------------------" +echo "Be sure to send it using a secure channel!" +echo "" +echo "Add this line to your file \"$HOME/.csup/auth\", replacing \"XXX\"" +echo "with the password you typed in:" +echo "-------------------------------------------------------------------------------" +echo "$serverName:$clientName:XXX:" +echo "-------------------------------------------------------------------------------" +echo "Make sure the file is readable and writable only by you!" +echo "" + diff --git a/contrib/csup/csup.1 b/usr.bin/csup/csup.1 similarity index 88% rename from contrib/csup/csup.1 rename to usr.bin/csup/csup.1 index 4d22fc437e90..2690863bde0c 100644 --- a/contrib/csup/csup.1 +++ b/usr.bin/csup/csup.1 @@ -32,7 +32,7 @@ .Nd network distribution package for CVS repositories .Sh SYNOPSIS .Nm -.Op Fl 146ksvzZ +.Op Fl 146aksvzZ .Op Fl A Ar addr .Op Fl b Ar base .Op Fl c Ar collDir @@ -106,6 +106,12 @@ to use IPv4 addresses only. Forces .Nm to use IPv6 addresses only. +.It Fl a +Requires the server to authenticate itself (prove its identity) to +the client. If authentication of the server fails, the update is +canceled. See +.Sx AUTHENTICATION , +below. .It Fl A Ar addr Specifies a local address to bind to when connecting to the server. The local address might be a hostname or a numeric host address string @@ -793,6 +799,102 @@ as well: .It .Pa /bar/stool/src-all/refuse.cvs:RELENG_3 .El +.Sh AUTHENTICATION +.Nm +implements an optional authentication mechanism which can be used by the +client and server to verify each other's identities. +Public CVSup servers normally do not enable authentication. +.Nm +users may ignore this section unless they have been informed +that authentication is required by the administrator of their server. +.Pp +The authentication subsystem uses a +challenge-response protocol which is immune to packet sniffing and +replay attacks. No passwords are sent over the network in either +direction. Both the client and the server can independently verify +the identities of each other. +.Pp +The file +.Li $ Ns Ev HOME Ns Pa /.csup/auth +holds the information used for authentication. This file contains a +record for each server that the client is allowed to access. Each +record occupies one line in the file. Lines beginning with +.Ql # +are ignored, as are lines containing only white space. White space is +significant everywhere else in the file. Fields are separated by +.Ql \&: +characters. +.Pp +Each record of the file has the following form: +.Bd -literal -offset indent +.Sm off +.Xo Ar serverName No : Ar clientName No : +.Ar password No : Ar comment +.Xc +.Sm on +.Ed +.Pp +All fields must be present even if some of them are empty. +.Ar ServerName +is the name of the server to which the record applies. By convention, +it is the canonical fully-qualified domain name of the server, e.g., +.Ql CVSup177.FreeBSD.ORG . +This must agree with the server's own idea of its name. The name is +case-insensitive. +.Pp +.Ar ClientName +is the name the client uses to gain access to the server. By +convention, e-mail addresses are used for all client names, e.g., +.Ql BillyJoe@FreeBSD.ORG . +Client names are case-insensitive. +.Pp +.Ar Password +is a secret string of characters that the client uses to prove its +identity. It may not contain any +.Ql \&: +or newline characters. +.Pp +.Ar Comment +may contain any additional information to identify the record. It +is not interpreted by the program. +.Pp +To set up authentication for a given server, one must perform the +following steps: +.Bl -enum +.It +Obtain the official +.Ar serverName +from the administrator of the server or from some other source. +.It +Choose an appropriate +.Ar clientName . +It should be in the form of a valid e-mail address, to make it easy +for the server administrator to contact the user if necessary. +.It +Choose an arbitrary secret +.Ar password . +.It +Run the +.Nm cpasswd +utility, and type in the +.Ar password +when prompted for it. The utility will print out a line to send +to the server administrator, and instruct you how to modify your +.Li $ Ns Ev HOME Ns Pa /.csup/auth +file. You should use a secure channel to send the line to the +server administrator. +.El +.Pp +Since +.Li $ Ns Ev HOME Ns Pa /.csup/auth +contains passwords, you should ensure that it is not readable by +anyone except yourself. +.Pp +Authentication works independently in both directions. The server +administrator controls whether you must prove your identity. +You control whether to check the server's identity, by means of the +.Fl a +command line option. .Sh csup AND FIREWALLS In its default mode, .Nm @@ -865,6 +967,7 @@ subdirectory. List files. .El .Sh SEE ALSO +.Xr cpasswd 1 , .Xr cvs 1 , .Xr rcsintro 1 , .Xr ssh 1 . diff --git a/contrib/csup/detailer.c b/usr.bin/csup/detailer.c similarity index 100% rename from contrib/csup/detailer.c rename to usr.bin/csup/detailer.c diff --git a/contrib/csup/detailer.h b/usr.bin/csup/detailer.h similarity index 100% rename from contrib/csup/detailer.h rename to usr.bin/csup/detailer.h diff --git a/contrib/csup/diff.c b/usr.bin/csup/diff.c similarity index 100% rename from contrib/csup/diff.c rename to usr.bin/csup/diff.c diff --git a/contrib/csup/diff.h b/usr.bin/csup/diff.h similarity index 100% rename from contrib/csup/diff.h rename to usr.bin/csup/diff.h diff --git a/contrib/csup/fattr.c b/usr.bin/csup/fattr.c similarity index 100% rename from contrib/csup/fattr.c rename to usr.bin/csup/fattr.c diff --git a/contrib/csup/fattr.h b/usr.bin/csup/fattr.h similarity index 100% rename from contrib/csup/fattr.h rename to usr.bin/csup/fattr.h diff --git a/contrib/csup/fattr_bsd.h b/usr.bin/csup/fattr_bsd.h similarity index 100% rename from contrib/csup/fattr_bsd.h rename to usr.bin/csup/fattr_bsd.h diff --git a/contrib/csup/fattr_posix.h b/usr.bin/csup/fattr_posix.h similarity index 100% rename from contrib/csup/fattr_posix.h rename to usr.bin/csup/fattr_posix.h diff --git a/contrib/csup/fixups.c b/usr.bin/csup/fixups.c similarity index 100% rename from contrib/csup/fixups.c rename to usr.bin/csup/fixups.c diff --git a/contrib/csup/fixups.h b/usr.bin/csup/fixups.h similarity index 100% rename from contrib/csup/fixups.h rename to usr.bin/csup/fixups.h diff --git a/contrib/csup/fnmatch.c b/usr.bin/csup/fnmatch.c similarity index 100% rename from contrib/csup/fnmatch.c rename to usr.bin/csup/fnmatch.c diff --git a/contrib/csup/fnmatch.h b/usr.bin/csup/fnmatch.h similarity index 100% rename from contrib/csup/fnmatch.h rename to usr.bin/csup/fnmatch.h diff --git a/contrib/csup/globtree.c b/usr.bin/csup/globtree.c similarity index 100% rename from contrib/csup/globtree.c rename to usr.bin/csup/globtree.c diff --git a/contrib/csup/globtree.h b/usr.bin/csup/globtree.h similarity index 100% rename from contrib/csup/globtree.h rename to usr.bin/csup/globtree.h diff --git a/contrib/csup/idcache.c b/usr.bin/csup/idcache.c similarity index 100% rename from contrib/csup/idcache.c rename to usr.bin/csup/idcache.c diff --git a/contrib/csup/idcache.h b/usr.bin/csup/idcache.h similarity index 100% rename from contrib/csup/idcache.h rename to usr.bin/csup/idcache.h diff --git a/contrib/csup/keyword.c b/usr.bin/csup/keyword.c similarity index 100% rename from contrib/csup/keyword.c rename to usr.bin/csup/keyword.c diff --git a/contrib/csup/keyword.h b/usr.bin/csup/keyword.h similarity index 100% rename from contrib/csup/keyword.h rename to usr.bin/csup/keyword.h diff --git a/contrib/csup/lex.rcs.c b/usr.bin/csup/lex.rcs.c similarity index 100% rename from contrib/csup/lex.rcs.c rename to usr.bin/csup/lex.rcs.c diff --git a/contrib/csup/lister.c b/usr.bin/csup/lister.c similarity index 100% rename from contrib/csup/lister.c rename to usr.bin/csup/lister.c diff --git a/contrib/csup/lister.h b/usr.bin/csup/lister.h similarity index 100% rename from contrib/csup/lister.h rename to usr.bin/csup/lister.h diff --git a/contrib/csup/main.c b/usr.bin/csup/main.c similarity index 96% rename from contrib/csup/main.c rename to usr.bin/csup/main.c index 74150393bc0b..e7711b338808 100644 --- a/contrib/csup/main.c +++ b/usr.bin/csup/main.c @@ -60,6 +60,8 @@ usage(char *argv0) "(same as \"-r 0\")"); lprintf(-1, USAGE_OPTFMT, "-4", "Force usage of IPv4 addresses"); lprintf(-1, USAGE_OPTFMT, "-6", "Force usage of IPv6 addresses"); + lprintf(-1, USAGE_OPTFMT, "-a", + "Require server to authenticate itself to us"); lprintf(-1, USAGE_OPTFMT, "-A addr", "Bind local socket to a specific address"); lprintf(-1, USAGE_OPTFMT, "-b base", @@ -107,7 +109,7 @@ main(int argc, char *argv[]) struct stream *lock; char *argv0, *file, *lockfile; int family, error, lockfd, lflag, overridemask; - int c, i, deletelim, port, retries, status; + int c, i, deletelim, port, retries, status, reqauth; time_t nexttry; error = 0; @@ -124,9 +126,10 @@ main(int argc, char *argv[]) lockfile = NULL; override = coll_new(NULL); overridemask = 0; + reqauth = 0; while ((c = getopt(argc, argv, - "146A:b:c:d:gh:i:kl:L:p:P:r:svzZ")) != -1) { + "146aA:b:c:d:gh:i:kl:L:p:P:r:svzZ")) != -1) { switch (c) { case '1': retries = 0; @@ -137,6 +140,10 @@ main(int argc, char *argv[]) case '6': family = AF_INET6; break; + case 'a': + /* Require server authentication */ + reqauth = 1; + break; case 'A': error = getaddrinfo(optarg, NULL, NULL, &res); if (error) { @@ -303,6 +310,7 @@ main(int argc, char *argv[]) config->laddrlen = laddrlen; } config->deletelim = deletelim; + config->reqauth = reqauth; lprintf(2, "Connecting to %s\n", config->host); i = 0; diff --git a/contrib/csup/main.h b/usr.bin/csup/main.h similarity index 100% rename from contrib/csup/main.h rename to usr.bin/csup/main.h diff --git a/contrib/csup/misc.c b/usr.bin/csup/misc.c similarity index 100% rename from contrib/csup/misc.c rename to usr.bin/csup/misc.c diff --git a/contrib/csup/misc.h b/usr.bin/csup/misc.h similarity index 100% rename from contrib/csup/misc.h rename to usr.bin/csup/misc.h diff --git a/contrib/csup/mux.c b/usr.bin/csup/mux.c similarity index 100% rename from contrib/csup/mux.c rename to usr.bin/csup/mux.c diff --git a/contrib/csup/mux.h b/usr.bin/csup/mux.h similarity index 100% rename from contrib/csup/mux.h rename to usr.bin/csup/mux.h diff --git a/contrib/csup/parse.y b/usr.bin/csup/parse.y similarity index 100% rename from contrib/csup/parse.y rename to usr.bin/csup/parse.y diff --git a/contrib/csup/pathcomp.c b/usr.bin/csup/pathcomp.c similarity index 100% rename from contrib/csup/pathcomp.c rename to usr.bin/csup/pathcomp.c diff --git a/contrib/csup/pathcomp.h b/usr.bin/csup/pathcomp.h similarity index 100% rename from contrib/csup/pathcomp.h rename to usr.bin/csup/pathcomp.h diff --git a/contrib/csup/proto.c b/usr.bin/csup/proto.c similarity index 94% rename from contrib/csup/proto.c rename to usr.bin/csup/proto.c index 15c12355073c..166a1344b9f3 100644 --- a/contrib/csup/proto.c +++ b/usr.bin/csup/proto.c @@ -45,6 +45,7 @@ #include #include +#include "auth.h" #include "config.h" #include "detailer.h" #include "fattr.h" @@ -74,7 +75,6 @@ static void killer_stop(struct killer *); static int proto_waitconnect(int); static int proto_greet(struct config *); static int proto_negproto(struct config *); -static int proto_login(struct config *); static int proto_fileattr(struct config *); static int proto_xchgcoll(struct config *); static struct mux *proto_mux(struct config *); @@ -251,56 +251,6 @@ bad: return (STATUS_FAILURE); } -static int -proto_login(struct config *config) -{ - struct stream *s; - char hostbuf[MAXHOSTNAMELEN]; - char *line, *login, *host, *cmd, *realm, *challenge, *msg; - int error; - - s = config->server; - error = gethostname(hostbuf, sizeof(hostbuf)); - hostbuf[sizeof(hostbuf) - 1] = '\0'; - if (error) - host = NULL; - else - host = hostbuf; - login = getlogin(); - proto_printf(s, "USER %s %s\n", login != NULL ? login : "?", - host != NULL ? host : "?"); - stream_flush(s); - line = stream_getln(s, NULL); - cmd = proto_get_ascii(&line); - realm = proto_get_ascii(&line); - challenge = proto_get_ascii(&line); - if (challenge == NULL || line != NULL) - goto bad; - if (strcmp(realm, ".") != 0 || strcmp(challenge, ".") != 0) { - lprintf(-1, "Authentication required by the server and not " - "supported by client\n"); - return (STATUS_FAILURE); - } - proto_printf(s, "AUTHMD5 . . .\n"); - stream_flush(s); - line = stream_getln(s, NULL); - cmd = proto_get_ascii(&line); - if (cmd == NULL || line == NULL) - goto bad; - if (strcmp(cmd, "OK") == 0) - return (STATUS_SUCCESS); - if (strcmp(cmd, "!") == 0) { - msg = proto_get_rest(&line); - if (msg == NULL) - goto bad; - lprintf(-1, "Server error: %s\n", msg); - return (STATUS_FAILURE); - } -bad: - lprintf(-1, "Invalid server reply to AUTHMD5\n"); - return (STATUS_FAILURE); -} - /* * File attribute support negotiation. */ @@ -601,7 +551,7 @@ proto_run(struct config *config) if (status == STATUS_SUCCESS) status = proto_negproto(config); if (status == STATUS_SUCCESS) - status = proto_login(config); + status = auth_login(config); if (status == STATUS_SUCCESS) status = proto_fileattr(config); if (status == STATUS_SUCCESS) diff --git a/contrib/csup/proto.h b/usr.bin/csup/proto.h similarity index 100% rename from contrib/csup/proto.h rename to usr.bin/csup/proto.h diff --git a/contrib/csup/queue.h b/usr.bin/csup/queue.h similarity index 100% rename from contrib/csup/queue.h rename to usr.bin/csup/queue.h diff --git a/contrib/csup/rcsfile.c b/usr.bin/csup/rcsfile.c similarity index 100% rename from contrib/csup/rcsfile.c rename to usr.bin/csup/rcsfile.c diff --git a/contrib/csup/rcsfile.h b/usr.bin/csup/rcsfile.h similarity index 100% rename from contrib/csup/rcsfile.h rename to usr.bin/csup/rcsfile.h diff --git a/contrib/csup/rcsparse.c b/usr.bin/csup/rcsparse.c similarity index 100% rename from contrib/csup/rcsparse.c rename to usr.bin/csup/rcsparse.c diff --git a/contrib/csup/rcsparse.h b/usr.bin/csup/rcsparse.h similarity index 100% rename from contrib/csup/rcsparse.h rename to usr.bin/csup/rcsparse.h diff --git a/contrib/csup/rcstokenizer.h b/usr.bin/csup/rcstokenizer.h similarity index 100% rename from contrib/csup/rcstokenizer.h rename to usr.bin/csup/rcstokenizer.h diff --git a/contrib/csup/rcstokenizer.l b/usr.bin/csup/rcstokenizer.l similarity index 100% rename from contrib/csup/rcstokenizer.l rename to usr.bin/csup/rcstokenizer.l diff --git a/contrib/csup/rsyncfile.c b/usr.bin/csup/rsyncfile.c similarity index 100% rename from contrib/csup/rsyncfile.c rename to usr.bin/csup/rsyncfile.c diff --git a/contrib/csup/rsyncfile.h b/usr.bin/csup/rsyncfile.h similarity index 100% rename from contrib/csup/rsyncfile.h rename to usr.bin/csup/rsyncfile.h diff --git a/contrib/csup/status.c b/usr.bin/csup/status.c similarity index 100% rename from contrib/csup/status.c rename to usr.bin/csup/status.c diff --git a/contrib/csup/status.h b/usr.bin/csup/status.h similarity index 100% rename from contrib/csup/status.h rename to usr.bin/csup/status.h diff --git a/contrib/csup/stream.c b/usr.bin/csup/stream.c similarity index 100% rename from contrib/csup/stream.c rename to usr.bin/csup/stream.c diff --git a/contrib/csup/stream.h b/usr.bin/csup/stream.h similarity index 100% rename from contrib/csup/stream.h rename to usr.bin/csup/stream.h diff --git a/contrib/csup/threads.c b/usr.bin/csup/threads.c similarity index 100% rename from contrib/csup/threads.c rename to usr.bin/csup/threads.c diff --git a/contrib/csup/threads.h b/usr.bin/csup/threads.h similarity index 100% rename from contrib/csup/threads.h rename to usr.bin/csup/threads.h diff --git a/contrib/csup/token.h b/usr.bin/csup/token.h similarity index 100% rename from contrib/csup/token.h rename to usr.bin/csup/token.h diff --git a/contrib/csup/token.l b/usr.bin/csup/token.l similarity index 100% rename from contrib/csup/token.l rename to usr.bin/csup/token.l diff --git a/contrib/csup/updater.c b/usr.bin/csup/updater.c similarity index 100% rename from contrib/csup/updater.c rename to usr.bin/csup/updater.c diff --git a/contrib/csup/updater.h b/usr.bin/csup/updater.h similarity index 100% rename from contrib/csup/updater.h rename to usr.bin/csup/updater.h diff --git a/usr.bin/ctags/ctags.c b/usr.bin/ctags/ctags.c index eda4145291f9..2d9e3f36ed01 100644 --- a/usr.bin/ctags/ctags.c +++ b/usr.bin/ctags/ctags.c @@ -244,7 +244,7 @@ void init(void) { int i; - const char *sp; + const unsigned char *sp; for (i = 0; i < 256; i++) { _wht[i] = _etk[i] = _itk[i] = _btk[i] = NO; diff --git a/usr.bin/ctags/fortran.c b/usr.bin/ctags/fortran.c index 3761615f10eb..a494752f7f0e 100644 --- a/usr.bin/ctags/fortran.c +++ b/usr.bin/ctags/fortran.c @@ -52,7 +52,7 @@ static void takeprec(void); char *lbp; /* line buffer pointer */ int -PF_funcs() +PF_funcs(void) { bool pfcnt; /* pascal/fortran functions found */ char *cp; diff --git a/usr.bin/dc/Makefile b/usr.bin/dc/Makefile new file mode 100644 index 000000000000..ee91c95508b7 --- /dev/null +++ b/usr.bin/dc/Makefile @@ -0,0 +1,10 @@ +# $FreeBSD$ +# $OpenBSD: Makefile,v 1.2 2006/11/26 11:31:09 deraadt Exp $ + +PROG= dc +SRCS= dc.c bcode.c inout.c mem.c stack.c +CFLAGS+=--param max-inline-insns-single=64 +DPADD= ${LIBCRYPTO} +LDADD= -lcrypto + +.include diff --git a/usr.bin/dc/USD.doc/dc b/usr.bin/dc/USD.doc/dc new file mode 100644 index 000000000000..4caa0f42ba70 --- /dev/null +++ b/usr.bin/dc/USD.doc/dc @@ -0,0 +1,753 @@ +.\" $FreeBSD$ +.\" $OpenBSD: dc,v 1.2 2003/09/22 19:08:27 otto Exp $ +.\" +.\" Copyright (C) Caldera International Inc. 2001-2002. +.\" 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 and documentation 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. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed or owned by Caldera +.\" International, Inc. +.\" 4. Neither the name of Caldera International, Inc. nor the names of other +.\" contributors may be used to endorse or promote products derived from +.\" this software without specific prior written permission. +.\" +.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA +.\" INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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. +.\" +.\" @(#)dc 8.1 (Berkeley) 6/8/93 +.\" +.EH 'USD:5-%''DC \- An Interactive Desk Calculator' +.OH 'DC \- An Interactive Desk Calculator''USD:5-%' +.\".RP +.\" ....TM 75-1271-8 39199 39199-11 +.ND +.TL +DC \- An Interactive Desk Calculator +.AU "MH 2C-524" 3878 +Robert Morris +.AU +Lorinda Cherry +.AI +.\" .MH +.AB +DC is an interactive desk calculator program implemented +on the +.UX +time-sharing system to do arbitrary-precision +integer arithmetic. +It has provision for manipulating scaled fixed-point numbers and +for input and output in bases other than decimal. +.PP +The size of numbers that can be manipulated is limited +only by available core storage. +On typical implementations of +.UX , +the size of numbers that +can be handled varies from several hundred digits on the smallest +systems to several thousand on the largest. +.AE +.PP +.SH +.PP +.ft I +Editor's note: the description of the implementation details of DC in this +paper is only valid for the original version of DC. +The current version of DC uses a different approach. +.ft +.PP +DC is an arbitrary precision arithmetic package implemented +on the +.UX +time-sharing system +in the form of an interactive desk calculator. +It works like a stacking calculator using reverse Polish notation. +Ordinarily DC operates on decimal integers, but one may +specify an input base, output base, and a number of fractional +digits to be maintained. +.PP +A language called BC [1] has been developed which accepts +programs written in the familiar style of higher-level +programming languages and compiles output which is +interpreted by DC. +Some of the commands described below were designed +for the compiler interface and are not easy for a human user +to manipulate. +.PP +Numbers that are typed into DC are put on a push-down +stack. +DC commands work by taking the top number or two +off the stack, performing the desired operation, and pushing the result +on the stack. +If an argument is given, +input is taken from that file until its end, +then from the standard input. +.SH +SYNOPTIC DESCRIPTION +.PP +Here we describe the DC commands that are intended +for use by people. The additional commands that are +intended to be invoked by compiled output are +described in the detailed description. +.PP +Any number of commands are permitted on a line. +Blanks and new-line characters are ignored except within numbers +and in places where a register name is expected. +.PP +The following constructions are recognized: +.SH +number +.IP +The value of the number is pushed onto the main stack. +A number is an unbroken string of the digits 0-9 +and the capital letters A\-F which are treated as digits +with values 10\-15 respectively. +The number may be preceded by an underscore _ to input a +negative number. +Numbers may contain decimal points. +.SH ++ \- * % ^ +.IP +The +top two values on the stack are added +(\fB+\fP), +subtracted +(\fB\-\fP), +multiplied (\fB*\fP), +divided (\fB/\fP), +remaindered (\fB%\fP), +or exponentiated (^). +The two entries are popped off the stack; +the result is pushed on the stack in their place. +The result of a division is an integer truncated toward zero. +See the detailed description below for the treatment of +numbers with decimal points. +An exponent must not have any digits after the decimal point. +.SH +s\fIx\fP +.IP +The +top of the main stack is popped and stored into +a register named \fIx\fP, where \fIx\fP may be any character. +If +the +.ft B +s +.ft +is capitalized, +.ft I +x +.ft +is treated as a stack and the value is pushed onto it. +Any character, even blank or new-line, is a valid register name. +.SH +l\fIx\fP +.IP +The +value in register +.ft I +x +.ft +is pushed onto the stack. +The register +.ft I +x +.ft +is not altered. +If the +.ft B +l +.ft +is capitalized, +register +.ft I +x +.ft +is treated as a stack and its top value is popped onto the main stack. +.LP +All registers start with empty value which is treated as a zero +by the command \fBl\fP and is treated as an error by the command \fBL\fP. +.SH +d +.IP +The +top value on the stack is duplicated. +.SH +p +.IP +The top value on the stack is printed. +The top value remains unchanged. +.SH +f +.IP +All values on the stack and in registers are printed. +.SH +x +.IP +treats the top element of the stack as a character string, +removes it from the stack, and +executes it as a string of DC commands. +.SH +[ ... ] +.IP +puts the bracketed character string onto the top of the stack. +.SH +q +.IP +exits the program. +If executing a string, the recursion level is +popped by two. +If +.ft B +q +.ft +is capitalized, +the top value on the stack is popped and the string execution level is popped +by that value. +.SH +<\fIx\fP >\fIx\fP =\fIx\fP !<\fIx\fP !>\fIx\fP !=\fIx\fP +.IP +The +top two elements of the stack are popped and compared. +Register +.ft I +x +.ft +is executed if they obey the stated +relation. +Exclamation point is negation. +.SH +v +.IP +replaces the top element on the stack by its square root. +The square root of an integer is truncated to an integer. +For the treatment of numbers with decimal points, see +the detailed description below. +.SH +! +.IP +interprets the rest of the line as a +.UX +command. +Control returns to DC when the +.UX +command terminates. +.SH +c +.IP +All values on the stack are popped; the stack becomes empty. +.SH +i +.IP +The top value on the stack is popped and used as the +number radix for further input. +If \fBi\fP is capitalized, the value of +the input base is pushed onto the stack. +No mechanism has been provided for the input of arbitrary +numbers in bases less than 1 or greater than 16. +.SH +o +.IP +The top value on the stack is popped and used as the +number radix for further output. +If \fBo\fP is capitalized, the value of the output +base is pushed onto the stack. +.SH +k +.IP +The top of the stack is popped, and that value is used as +a scale factor +that influences the number of decimal places +that are maintained during multiplication, division, and exponentiation. +The scale factor must be greater than or equal to zero and +less than 100. +If \fBk\fP is capitalized, the value of the scale factor +is pushed onto the stack. +.SH +z +.IP +The value of the stack level is pushed onto the stack. +.SH +? +.IP +A line of input is taken from the input source (usually the console) +and executed. +.SH +DETAILED DESCRIPTION +.SH +Internal Representation of Numbers +.PP +Numbers are stored internally using a dynamic storage allocator. +Numbers are kept in the form of a string +of digits to the base 100 stored one digit per byte +(centennial digits). +The string is stored with the low-order digit at the +beginning of the string. +For example, the representation of 157 +is 57,1. +After any arithmetic operation on a number, care is taken +that all digits are in the range 0\-99 and that +the number has no leading zeros. +The number zero is represented by the empty string. +.PP +Negative numbers are represented in the 100's complement +notation, which is analogous to two's complement notation for binary +numbers. +The high order digit of a negative number is always \-1 +and all other digits are in the range 0\-99. +The digit preceding the high order \-1 digit is never a 99. +The representation of \-157 is 43,98,\-1. +We shall call this the canonical form of a number. +The advantage of this kind of representation of negative +numbers is ease of addition. When addition is performed digit +by digit, the result is formally correct. The result need only +be modified, if necessary, to put it into canonical form. +.PP +Because the largest valid digit is 99 and the byte can +hold numbers twice that large, addition can be carried out +and the handling of carries done later when +that is convenient, as it sometimes is. +.PP +An additional byte is stored with each number beyond +the high order digit to indicate the number of +assumed decimal digits after the decimal point. The representation +of .001 is 1,\fI3\fP +where the scale has been italicized to emphasize the fact that it +is not the high order digit. +The value of this extra byte is called the +.ft B +scale factor +.ft +of the number. +.SH +The Allocator +.PP +DC uses a dynamic string storage allocator +for all of its internal storage. +All reading and writing of numbers internally is done through +the allocator. +Associated with each string in the allocator is a four-word header containing pointers +to the beginning of the string, the end of the string, +the next place to write, and the next place to read. +Communication between the allocator and DC +is done via pointers to these headers. +.PP +The allocator initially has one large string on a list +of free strings. All headers except the one pointing +to this string are on a list of free headers. +Requests for strings are made by size. +The size of the string actually supplied is the next higher +power of 2. +When a request for a string is made, the allocator +first checks the free list to see if there is +a string of the desired size. +If none is found, the allocator finds the next larger free string and splits it repeatedly until +it has a string of the right size. +Left-over strings are put on the free list. +If there are no larger strings, +the allocator tries to coalesce smaller free strings into +larger ones. +Since all strings are the result +of splitting large strings, +each string has a neighbor that is next to it in core +and, if free, can be combined with it to make a string twice as long. +This is an implementation of the `buddy system' of allocation +described in [2]. +.PP +Failing to find a string of the proper length after coalescing, +the allocator asks the system for more space. +The amount of space on the system is the only limitation +on the size and number of strings in DC. +If at any time in the process of trying to allocate a string, the allocator runs out of +headers, it also asks the system for more space. +.PP +There are routines in the allocator for reading, writing, copying, rewinding, +forward-spacing, and backspacing strings. +All string manipulation is done using these routines. +.PP +The reading and writing routines +increment the read pointer or write pointer so that +the characters of a string are read or written in +succession by a series of read or write calls. +The write pointer is interpreted as the end of the +information-containing portion of a string and a call +to read beyond that point returns an end-of-string indication. +An attempt to write beyond the end of a string +causes the allocator to +allocate a larger space and then copy +the old string into the larger block. +.SH +Internal Arithmetic +.PP +All arithmetic operations are done on integers. +The operands (or operand) needed for the operation are popped +from the main stack and their scale factors stripped off. +Zeros are added or digits removed as necessary to get +a properly scaled result from the internal arithmetic routine. +For example, if the scale of the operands is different and decimal +alignment is required, as it is for +addition, zeros are appended to the operand with the smaller +scale. +After performing the required arithmetic operation, +the proper scale factor is appended to the end of the number before +it is pushed on the stack. +.PP +A register called \fBscale\fP plays a part +in the results of most arithmetic operations. +\fBscale\fP is the bound on the number of decimal places retained in +arithmetic computations. +\fBscale\fP may be set to the number on the top of the stack +truncated to an integer with the \fBk\fP command. +\fBK\fP may be used to push the value of \fBscale\fP on the stack. +\fBscale\fP must be greater than or equal to 0 and less than 100. +The descriptions of the individual arithmetic operations will +include the exact effect of \fBscale\fP on the computations. +.SH +Addition and Subtraction +.PP +The scales of the two numbers are compared and trailing +zeros are supplied to the number with the lower scale to give both +numbers the same scale. The number with the smaller scale is +multiplied by 10 if the difference of the scales is odd. +The scale of the result is then set to the larger of the scales +of the two operands. +.PP +Subtraction is performed by negating the number +to be subtracted and proceeding as in addition. +.PP +Finally, the addition is performed digit by digit from the +low order end of the number. The carries are propagated +in the usual way. +The resulting number is brought into canonical form, which may +require stripping of leading zeros, or for negative numbers +replacing the high-order configuration 99,\-1 by the digit \-1. +In any case, digits which are not in the range 0\-99 must +be brought into that range, propagating any carries or borrows +that result. +.SH +Multiplication +.PP +The scales are removed from the two operands and saved. +The operands are both made positive. +Then multiplication is performed in +a digit by digit manner that exactly mimics the hand method +of multiplying. +The first number is multiplied by each digit of the second +number, beginning with its low order digit. The intermediate +products are accumulated into a partial sum which becomes the +final product. +The product is put into the canonical form and its sign is +computed from the signs of the original operands. +.PP +The scale of the result is set equal to the sum +of the scales of the two operands. +If that scale is larger than the internal register +.ft B +scale +.ft +and also larger than both of the scales of the two operands, +then the scale of the result is set equal to the largest +of these three last quantities. +.SH +Division +.PP +The scales are removed from the two operands. +Zeros are appended or digits removed from the dividend to make +the scale of the result of the integer division equal to +the internal quantity +\fBscale\fP. +The signs are removed and saved. +.PP +Division is performed much as it would be done by hand. +The difference of the lengths of the two numbers +is computed. +If the divisor is longer than the dividend, +zero is returned. +Otherwise the top digit of the divisor is divided into the top +two digits of the dividend. +The result is used as the first (high-order) digit of the +quotient. +It may turn out be one unit too low, but if it is, the next +trial quotient will be larger than 99 and this will be +adjusted at the end of the process. +The trial digit is multiplied by the divisor and the result subtracted +from the dividend and the process is repeated to get +additional quotient digits until the remaining +dividend is smaller than the divisor. +At the end, the digits of the quotient are put into +the canonical form, with propagation of carry as needed. +The sign is set from the sign of the operands. +.SH +Remainder +.PP +The division routine is called and division is performed +exactly as described. The quantity returned is the remains of the +dividend at the end of the divide process. +Since division truncates toward zero, remainders have the same +sign as the dividend. +The scale of the remainder is set to +the maximum of the scale of the dividend and +the scale of the quotient plus the scale of the divisor. +.SH +Square Root +.PP +The scale is stripped from the operand. +Zeros are added if necessary to make the +integer result have a scale that is the larger of +the internal quantity +\fBscale\fP +and the scale of the operand. +.PP +The method used to compute sqrt(y) is Newton's method +with successive approximations by the rule +.EQ +x sub {n+1} ~=~ half ( x sub n + y over x sub n ) +.EN +The initial guess is found by taking the integer square root +of the top two digits. +.SH +Exponentiation +.PP +Only exponents with zero scale factor are handled. If the exponent is +zero, then the result is 1. If the exponent is negative, then +it is made positive and the base is divided into one. The scale +of the base is removed. +.PP +The integer exponent is viewed as a binary number. +The base is repeatedly squared and the result is +obtained as a product of those powers of the base that +correspond to the positions of the one-bits in the binary +representation of the exponent. +Enough digits of the result +are removed to make the scale of the result the same as if the +indicated multiplication had been performed. +.SH +Input Conversion and Base +.PP +Numbers are converted to the internal representation as they are read +in. +The scale stored with a number is simply the number of fractional digits input. +Negative numbers are indicated by preceding the number with a \fB\_\fP (an +underscore). +The hexadecimal digits A\-F correspond to the numbers 10\-15 regardless of input base. +The \fBi\fP command can be used to change the base of the input numbers. +This command pops the stack, truncates the resulting number to an integer, +and uses it as the input base for all further input. +The input base is initialized to 10 but may, for example be changed to +8 or 16 to do octal or hexadecimal to decimal conversions. +The command \fBI\fP will push the value of the input base on the stack. +.SH +Output Commands +.PP +The command \fBp\fP causes the top of the stack to be printed. +It does not remove the top of the stack. +All of the stack and internal registers can be output +by typing the command \fBf\fP. +The \fBo\fP command can be used to change the output base. +This command uses the top of the stack, truncated to an integer as +the base for all further output. +The output base in initialized to 10. +It will work correctly for any base. +The command \fBO\fP pushes the value of the output base on the stack. +.SH +Output Format and Base +.PP +The input and output bases only affect +the interpretation of numbers on input and output; they have no +effect on arithmetic computations. +Large numbers are output with 70 characters per line; +a \\ indicates a continued line. +All choices of input and output bases work correctly, although not all are +useful. +A particularly useful output base is 100000, which has the effect of +grouping digits in fives. +Bases of 8 and 16 can be used for decimal-octal or decimal-hexadecimal +conversions. +.SH +Internal Registers +.PP +Numbers or strings may be stored in internal registers or loaded on the stack +from registers with the commands \fBs\fP and \fBl\fP. +The command \fBs\fIx\fR pops the top of the stack and +stores the result in register \fBx\fP. +\fIx\fP can be any character. +\fBl\fIx\fR puts the contents of register \fBx\fP on the top of the stack. +The \fBl\fP command has no effect on the contents of register \fIx\fP. +The \fBs\fP command, however, is destructive. +.SH +Stack Commands +.PP +The command \fBc\fP clears the stack. +The command \fBd\fP pushes a duplicate of the number on the top of the stack +on the stack. +The command \fBz\fP pushes the stack size on the stack. +The command \fBX\fP replaces the number on the top of the stack +with its scale factor. +The command \fBZ\fP replaces the top of the stack +with its length. +.SH +Subroutine Definitions and Calls +.PP +Enclosing a string in \fB[ ]\fP pushes the ascii string on the stack. +The \fBq\fP command quits or in executing a string, pops the recursion levels by two. +.SH +Internal Registers \- Programming DC +.PP +The load and store +commands together with \fB[ ]\fP to store strings, \fBx\fP to execute +and the testing commands `<', `>', `=', `!<', `!>', `!=' can be used to program +DC. +The \fBx\fP command assumes the top of the stack is an string of DC commands +and executes it. +The testing commands compare the top two elements on the stack and if the relation holds, execute the register +that follows the relation. +For example, to print the numbers 0-9, +.DS +[lip1+ si li10>a]sa +0si lax +.DE +.SH +Push-Down Registers and Arrays +.PP +These commands were designed for used by a compiler, not by +people. +They involve push-down registers and arrays. +In addition to the stack that commands work on, DC can be thought +of as having individual stacks for each register. +These registers are operated on by the commands \fBS\fP and \fBL\fP. +\fBS\fIx\fR pushes the top value of the main stack onto the stack for +the register \fIx\fP. +\fBL\fIx\fR pops the stack for register \fIx\fP and puts the result on the main +stack. +The commands \fBs\fP and \fBl\fP also work on registers but not as push-down +stacks. +\fBl\fP doesn't effect the top of the +register stack, and \fBs\fP destroys what was there before. +.PP +The commands to work on arrays are \fB:\fP and \fB;\fP. +\fB:\fIx\fR pops the stack and uses this value as an index into +the array \fIx\fP. +The next element on the stack is stored at this index in \fIx\fP. +An index must be greater than or equal to 0 and +less than 2048. +\fB;\fIx\fR is the command to load the main stack from the array \fIx\fP. +The value on the top of the stack is the index +into the array \fIx\fP of the value to be loaded. +.SH +Miscellaneous Commands +.PP +The command \fB!\fP interprets the rest of the line as a +.UX +command and passes it to +.UX +to execute. +One other compiler command is \fBQ\fP. +This command uses the top of the stack as the number of levels of recursion to skip. +.SH +DESIGN CHOICES +.PP +The real reason for the use of a dynamic storage allocator was +that a general purpose program could be (and in fact has been) +used for a variety of other tasks. +The allocator has some value for input and for compiling (i.e. +the bracket [...] commands) where it cannot be known in advance +how long a string will be. +The result was that at a modest +cost in execution time, all considerations of string allocation +and sizes of strings were removed from the remainder of the program +and debugging was made easier. The allocation method +used wastes approximately 25% of available space. +.PP +The choice of 100 as a base for internal arithmetic +seemingly has no compelling advantage. Yet the base cannot +exceed 127 because of hardware limitations and at the cost +of 5% in space, debugging was made a great deal easier and +decimal output was made much faster. +.PP +The reason for a stack-type arithmetic design was +to permit all DC commands from addition to subroutine execution +to be implemented in essentially the same way. The result +was a considerable degree of logical separation of the final +program into modules with very little communication between +modules. +.PP +The rationale for the lack of interaction between the scale and the bases +was to provide an understandable means of proceeding after +a change of base or scale when numbers had already been entered. +An earlier implementation which had global notions of +scale and base did not work out well. +If the value of +.ft B +scale +.ft +were to be interpreted in the current +input or output base, +then a change of base or scale in the midst of a +computation would cause great confusion in the interpretation +of the results. +The current scheme has the advantage that the value of +the input and output bases +are only used for input and output, respectively, and they +are ignored in all other operations. +The value of +scale +is not used for any essential purpose by any part of the program +and it is used only to prevent the number of +decimal places resulting from the arithmetic operations from +growing beyond all bounds. +.PP +The design rationale for the choices for the scales of +the results of arithmetic were that in no case should +any significant digits be thrown away if, on appearances, the +user actually wanted them. Thus, if the user wants +to add the numbers 1.5 and 3.517, it seemed reasonable to give +him the result 5.017 without requiring him to unnecessarily +specify his rather obvious requirements for precision. +.PP +On the other hand, multiplication and exponentiation produce +results with many more digits than their operands and it +seemed reasonable to give as a minimum the number of decimal +places in the operands but not to give more than that +number of digits +unless the user asked for them by specifying a value for \fBscale\fP. +Square root can be handled in just the same way as multiplication. +The operation of division gives arbitrarily many decimal places +and there is simply no way to guess how many places the user +wants. +In this case only, the user must +specify a \fBscale\fP to get any decimal places at all. +.PP +The scale of remainder was chosen to make it possible +to recreate the dividend from the quotient and remainder. +This is easy to implement; no digits are thrown away. +.SH +References +.IP [1] +L. L. Cherry, R. Morris, +.ft I +BC \- An Arbitrary Precision Desk-Calculator Language. +.ft +.IP [2] +K. C. Knowlton, +.ft I +A Fast Storage Allocator, +.ft +Comm. ACM \fB8\fP, pp. 623-625 (Oct. 1965). diff --git a/usr.bin/dc/bcode.c b/usr.bin/dc/bcode.c new file mode 100644 index 000000000000..e80c63587a38 --- /dev/null +++ b/usr.bin/dc/bcode.c @@ -0,0 +1,1775 @@ +/* $OpenBSD: bcode.c,v 1.40 2009/10/27 23:59:37 deraadt Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include + +#include "extern.h" + +BIGNUM zero; + +#define __inline + +#define MAX_ARRAY_INDEX 2048 +#define READSTACK_SIZE 8 + +#define NO_ELSE -2 /* -1 is EOF */ +#define REG_ARRAY_SIZE_SMALL (UCHAR_MAX + 1) +#define REG_ARRAY_SIZE_BIG (UCHAR_MAX + 1 + USHRT_MAX + 1) + +struct bmachine { + struct source *readstack; + struct stack *reg; + struct stack stack; + volatile sig_atomic_t interrupted; + u_int scale; + u_int obase; + u_int ibase; + size_t readsp; + size_t reg_array_size; + size_t readstack_sz; + bool extended_regs; +}; + +static struct bmachine bmachine; +static void sighandler(int); + +static __inline int readch(void); +static __inline void unreadch(void); +static __inline char *readline(void); +static __inline void src_free(void); + +static __inline u_int max(u_int, u_int); +static u_long get_ulong(struct number *); + +static __inline void push_number(struct number *); +static __inline void push_string(char *); +static __inline void push(struct value *); +static __inline struct value *tos(void); +static __inline struct number *pop_number(void); +static __inline char *pop_string(void); +static __inline void clear_stack(void); +static __inline void print_tos(void); +static void pop_print(void); +static void pop_printn(void); +static __inline void print_stack(void); +static __inline void dup(void); +static void swap(void); +static void drop(void); + +static void get_scale(void); +static void set_scale(void); +static void get_obase(void); +static void set_obase(void); +static void get_ibase(void); +static void set_ibase(void); +static void stackdepth(void); +static void push_scale(void); +static u_int count_digits(const struct number *); +static void num_digits(void); +static void to_ascii(void); +static void push_line(void); +static void comment(void); +static void bexec(char *); +static void badd(void); +static void bsub(void); +static void bmul(void); +static void bdiv(void); +static void bmod(void); +static void bdivmod(void); +static void bexp(void); +static bool bsqrt_stop(const BIGNUM *, const BIGNUM *, u_int *); +static void bsqrt(void); +static void not(void); +static void equal_numbers(void); +static void less_numbers(void); +static void lesseq_numbers(void); +static void equal(void); +static void not_equal(void); +static void less(void); +static void not_less(void); +static void greater(void); +static void not_greater(void); +static void not_compare(void); +static bool compare_numbers(enum bcode_compare, struct number *, + struct number *); +static void compare(enum bcode_compare); +static int readreg(void); +static void load(void); +static void store(void); +static void load_stack(void); +static void store_stack(void); +static void load_array(void); +static void store_array(void); +static void nop(void); +static void quit(void); +static void quitN(void); +static void skipN(void); +static void skip_until_mark(void); +static void parse_number(void); +static void unknown(void); +static void eval_string(char *); +static void eval_line(void); +static void eval_tos(void); + + +typedef void (*opcode_function)(void); + +struct jump_entry { + u_char ch; + opcode_function f; +}; + +static opcode_function jump_table[UCHAR_MAX]; + +static const struct jump_entry jump_table_data[] = { + { ' ', nop }, + { '!', not_compare }, + { '#', comment }, + { '%', bmod }, + { '(', less_numbers }, + { '*', bmul }, + { '+', badd }, + { '-', bsub }, + { '.', parse_number }, + { '/', bdiv }, + { '0', parse_number }, + { '1', parse_number }, + { '2', parse_number }, + { '3', parse_number }, + { '4', parse_number }, + { '5', parse_number }, + { '6', parse_number }, + { '7', parse_number }, + { '8', parse_number }, + { '9', parse_number }, + { ':', store_array }, + { ';', load_array }, + { '<', less }, + { '=', equal }, + { '>', greater }, + { '?', eval_line }, + { 'A', parse_number }, + { 'B', parse_number }, + { 'C', parse_number }, + { 'D', parse_number }, + { 'E', parse_number }, + { 'F', parse_number }, + { 'G', equal_numbers }, + { 'I', get_ibase }, + { 'J', skipN }, + { 'K', get_scale }, + { 'L', load_stack }, + { 'M', nop }, + { 'N', not }, + { 'O', get_obase }, + { 'P', pop_print }, + { 'Q', quitN }, + { 'R', drop }, + { 'S', store_stack }, + { 'X', push_scale }, + { 'Z', num_digits }, + { '[', push_line }, + { '\f', nop }, + { '\n', nop }, + { '\r', nop }, + { '\t', nop }, + { '^', bexp }, + { '_', parse_number }, + { 'a', to_ascii }, + { 'c', clear_stack }, + { 'd', dup }, + { 'f', print_stack }, + { 'i', set_ibase }, + { 'k', set_scale }, + { 'l', load }, + { 'n', pop_printn }, + { 'o', set_obase }, + { 'p', print_tos }, + { 'q', quit }, + { 'r', swap }, + { 's', store }, + { 'v', bsqrt }, + { 'x', eval_tos }, + { 'z', stackdepth }, + { '{', lesseq_numbers }, + { '~', bdivmod } +}; + +#define JUMP_TABLE_DATA_SIZE \ + (sizeof(jump_table_data)/sizeof(jump_table_data[0])) + +static void +sighandler(int ignored) +{ + + switch (ignored) + { + default: + bmachine.interrupted = true; + } +} + +void +init_bmachine(bool extended_registers) +{ + unsigned int i; + + bmachine.extended_regs = extended_registers; + bmachine.reg_array_size = bmachine.extended_regs ? + REG_ARRAY_SIZE_BIG : REG_ARRAY_SIZE_SMALL; + + bmachine.reg = calloc(bmachine.reg_array_size, + sizeof(bmachine.reg[0])); + if (bmachine.reg == NULL) + err(1, NULL); + + for (i = 0; i < UCHAR_MAX; i++) + jump_table[i] = unknown; + for (i = 0; i < JUMP_TABLE_DATA_SIZE; i++) + jump_table[jump_table_data[i].ch] = jump_table_data[i].f; + + stack_init(&bmachine.stack); + + for (i = 0; i < bmachine.reg_array_size; i++) + stack_init(&bmachine.reg[i]); + + bmachine.readstack_sz = READSTACK_SIZE; + bmachine.readstack = calloc(sizeof(struct source), + bmachine.readstack_sz); + if (bmachine.readstack == NULL) + err(1, NULL); + bmachine.obase = bmachine.ibase = 10; + BN_init(&zero); + bn_check(BN_zero(&zero)); + signal(SIGINT, sighandler); +} + +/* Reset the things needed before processing a (new) file */ +void +reset_bmachine(struct source *src) +{ + + bmachine.readsp = 0; + bmachine.readstack[0] = *src; +} + +static __inline int +readch(void) +{ + struct source *src = &bmachine.readstack[bmachine.readsp]; + + return (src->vtable->readchar(src)); +} + +static __inline void +unreadch(void) +{ + struct source *src = &bmachine.readstack[bmachine.readsp]; + + src->vtable->unreadchar(src); +} + +static __inline char * +readline(void) +{ + struct source *src = &bmachine.readstack[bmachine.readsp]; + + return (src->vtable->readline(src)); +} + +static __inline void +src_free(void) +{ + struct source *src = &bmachine.readstack[bmachine.readsp]; + + src->vtable->free(src); +} + +#ifdef DEBUGGING +void +pn(const char *str, const struct number *n) +{ + char *p = BN_bn2dec(n->number); + + if (p == NULL) + err(1, "BN_bn2dec failed"); + fputs(str, stderr); + fprintf(stderr, " %s (%u)\n" , p, n->scale); + OPENSSL_free(p); +} + +void +pbn(const char *str, const BIGNUM *n) +{ + char *p = BN_bn2dec(n); + + if (p == NULL) + err(1, "BN_bn2dec failed"); + fputs(str, stderr); + fprintf(stderr, " %s\n", p); + OPENSSL_free(p); +} + +#endif + +static __inline u_int +max(u_int a, u_int b) +{ + + return (a > b ? a : b); +} + +static unsigned long factors[] = { + 0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, + 100000000, 1000000000 +}; + +void +scale_number(BIGNUM *n, int s) +{ + unsigned int abs_scale; + + if (s == 0) + return; + + abs_scale = s > 0 ? s : -s; + + if (abs_scale < sizeof(factors)/sizeof(factors[0])) { + if (s > 0) + bn_check(BN_mul_word(n, factors[abs_scale])); + else + BN_div_word(n, factors[abs_scale]); + } else { + BIGNUM *a, *p; + BN_CTX *ctx; + + a = BN_new(); + bn_checkp(a); + p = BN_new(); + bn_checkp(p); + ctx = BN_CTX_new(); + bn_checkp(ctx); + + bn_check(BN_set_word(a, 10)); + bn_check(BN_set_word(p, abs_scale)); + bn_check(BN_exp(a, a, p, ctx)); + if (s > 0) + bn_check(BN_mul(n, n, a, ctx)); + else + bn_check(BN_div(n, NULL, n, a, ctx)); + BN_CTX_free(ctx); + BN_free(a); + BN_free(p); + } +} + +void +split_number(const struct number *n, BIGNUM *i, BIGNUM *f) +{ + u_long rem; + + bn_checkp(BN_copy(i, n->number)); + + if (n->scale == 0 && f != NULL) + bn_check(BN_zero(f)); + else if (n->scale < sizeof(factors)/sizeof(factors[0])) { + rem = BN_div_word(i, factors[n->scale]); + if (f != NULL) + bn_check(BN_set_word(f, rem)); + } else { + BIGNUM *a, *p; + BN_CTX *ctx; + + a = BN_new(); + bn_checkp(a); + p = BN_new(); + bn_checkp(p); + ctx = BN_CTX_new(); + bn_checkp(ctx); + + bn_check(BN_set_word(a, 10)); + bn_check(BN_set_word(p, n->scale)); + bn_check(BN_exp(a, a, p, ctx)); + bn_check(BN_div(i, f, n->number, a, ctx)); + BN_CTX_free(ctx); + BN_free(a); + BN_free(p); + } +} + +__inline void +normalize(struct number *n, u_int s) +{ + + scale_number(n->number, s - n->scale); + n->scale = s; +} + +static u_long +get_ulong(struct number *n) +{ + + normalize(n, 0); + return (BN_get_word(n->number)); +} + +void +negate(struct number *n) +{ + + bn_check(BN_sub(n->number, &zero, n->number)); +} + +static __inline void +push_number(struct number *n) +{ + + stack_pushnumber(&bmachine.stack, n); +} + +static __inline void +push_string(char *string) +{ + + stack_pushstring(&bmachine.stack, string); +} + +static __inline void +push(struct value *v) +{ + + stack_push(&bmachine.stack, v); +} + +static __inline struct value * +tos(void) +{ + + return (stack_tos(&bmachine.stack)); +} + +static __inline struct value * +pop(void) +{ + + return (stack_pop(&bmachine.stack)); +} + +static __inline struct number * +pop_number(void) +{ + + return (stack_popnumber(&bmachine.stack)); +} + +static __inline char * +pop_string(void) +{ + + return (stack_popstring(&bmachine.stack)); +} + +static __inline void +clear_stack(void) +{ + + stack_clear(&bmachine.stack); +} + +static __inline void +print_stack(void) +{ + + stack_print(stdout, &bmachine.stack, "", bmachine.obase); +} + +static __inline void +print_tos(void) +{ + struct value *value = tos(); + + if (value != NULL) { + print_value(stdout, value, "", bmachine.obase); + putchar('\n'); + } + else + warnx("stack empty"); +} + +static void +pop_print(void) +{ + struct value *value = pop(); + + if (value != NULL) { + switch (value->type) { + case BCODE_NONE: + break; + case BCODE_NUMBER: + normalize(value->u.num, 0); + print_ascii(stdout, value->u.num); + fflush(stdout); + break; + case BCODE_STRING: + fputs(value->u.string, stdout); + fflush(stdout); + break; + } + stack_free_value(value); + } +} + +static void +pop_printn(void) +{ + struct value *value = pop(); + + if (value != NULL) { + print_value(stdout, value, "", bmachine.obase); + fflush(stdout); + stack_free_value(value); + } +} + +static __inline void +dup(void) +{ + + stack_dup(&bmachine.stack); +} + +static void +swap(void) +{ + + stack_swap(&bmachine.stack); +} + +static void +drop(void) +{ + struct value *v = pop(); + if (v != NULL) + stack_free_value(v); +} + +static void +get_scale(void) +{ + struct number *n; + + n = new_number(); + bn_check(BN_set_word(n->number, bmachine.scale)); + push_number(n); +} + +static void +set_scale(void) +{ + struct number *n; + u_long scale; + + n = pop_number(); + if (n != NULL) { + if (BN_cmp(n->number, &zero) < 0) + warnx("scale must be a nonnegative number"); + else { + scale = get_ulong(n); + if (scale != BN_MASK2 && scale <= UINT_MAX) + bmachine.scale = (u_int)scale; + else + warnx("scale too large"); + } + free_number(n); + } +} + +static void +get_obase(void) +{ + struct number *n; + + n = new_number(); + bn_check(BN_set_word(n->number, bmachine.obase)); + push_number(n); +} + +static void +set_obase(void) +{ + struct number *n; + u_long base; + + n = pop_number(); + if (n != NULL) { + base = get_ulong(n); + if (base != BN_MASK2 && base > 1 && base <= UINT_MAX) + bmachine.obase = (u_int)base; + else + warnx("output base must be a number greater than 1"); + free_number(n); + } +} + +static void +get_ibase(void) +{ + struct number *n; + + n = new_number(); + bn_check(BN_set_word(n->number, bmachine.ibase)); + push_number(n); +} + +static void +set_ibase(void) +{ + struct number *n; + u_long base; + + n = pop_number(); + if (n != NULL) { + base = get_ulong(n); + if (base != BN_MASK2 && 2 <= base && base <= 16) + bmachine.ibase = (u_int)base; + else + warnx("input base must be a number between 2 and 16 " + "(inclusive)"); + free_number(n); + } +} + +static void +stackdepth(void) +{ + struct number *n; + size_t i; + + i = stack_size(&bmachine.stack); + n = new_number(); + bn_check(BN_set_word(n->number, i)); + push_number(n); +} + +static void +push_scale(void) +{ + struct number *n; + struct value *value; + u_int scale = 0; + + value = pop(); + if (value != NULL) { + switch (value->type) { + case BCODE_NONE: + return; + case BCODE_NUMBER: + scale = value->u.num->scale; + break; + case BCODE_STRING: + break; + } + stack_free_value(value); + n = new_number(); + bn_check(BN_set_word(n->number, scale)); + push_number(n); + } +} + +static u_int +count_digits(const struct number *n) +{ + struct number *int_part, *fract_part; + u_int i; + + if (BN_is_zero(n->number)) + return (1); + + int_part = new_number(); + fract_part = new_number(); + fract_part->scale = n->scale; + split_number(n, int_part->number, fract_part->number); + + i = 0; + while (!BN_is_zero(int_part->number)) { + BN_div_word(int_part->number, 10); + i++; + } + free_number(int_part); + free_number(fract_part); + return (i + n->scale); +} + +static void +num_digits(void) +{ + struct number *n = NULL; + struct value *value; + size_t digits; + + value = pop(); + if (value != NULL) { + switch (value->type) { + case BCODE_NONE: + return; + case BCODE_NUMBER: + digits = count_digits(value->u.num); + n = new_number(); + bn_check(BN_set_word(n->number, digits)); + break; + case BCODE_STRING: + digits = strlen(value->u.string); + n = new_number(); + bn_check(BN_set_word(n->number, digits)); + break; + } + stack_free_value(value); + push_number(n); + } +} + +static void +to_ascii(void) +{ + struct number *n; + struct value *value; + char str[2]; + + value = pop(); + if (value != NULL) { + str[1] = '\0'; + switch (value->type) { + case BCODE_NONE: + return; + case BCODE_NUMBER: + n = value->u.num; + normalize(n, 0); + if (BN_num_bits(n->number) > 8) + bn_check(BN_mask_bits(n->number, 8)); + str[0] = (char)BN_get_word(n->number); + break; + case BCODE_STRING: + str[0] = value->u.string[0]; + break; + } + stack_free_value(value); + push_string(bstrdup(str)); + } +} + +static int +readreg(void) +{ + int ch1, ch2, idx; + + idx = readch(); + if (idx == 0xff && bmachine.extended_regs) { + ch1 = readch(); + ch2 = readch(); + if (ch1 == EOF || ch2 == EOF) { + warnx("unexpected eof"); + idx = -1; + } else + idx = (ch1 << 8) + ch2 + UCHAR_MAX + 1; + } + if (idx < 0 || (unsigned)idx >= bmachine.reg_array_size) { + warnx("internal error: reg num = %d", idx); + idx = -1; + } + return (idx); +} + +static void +load(void) +{ + struct number *n; + struct value *v; + struct value copy; + int idx; + + idx = readreg(); + if (idx >= 0) { + v = stack_tos(&bmachine.reg[idx]); + if (v == NULL) { + n = new_number(); + bn_check(BN_zero(n->number)); + push_number(n); + } else + push(stack_dup_value(v, ©)); + } +} + +static void +store(void) +{ + struct value *val; + int idx; + + idx = readreg(); + if (idx >= 0) { + val = pop(); + if (val == NULL) { + return; + } + stack_set_tos(&bmachine.reg[idx], val); + } +} + +static void +load_stack(void) +{ + struct stack *stack; + struct value *value; + int idx; + + idx = readreg(); + if (idx >= 0) { + stack = &bmachine.reg[idx]; + value = NULL; + if (stack_size(stack) > 0) { + value = stack_pop(stack); + } + if (value != NULL) + push(value); + else + warnx("stack register '%c' (0%o) is empty", + idx, idx); + } +} + +static void +store_stack(void) +{ + struct value *value; + int idx; + + idx = readreg(); + if (idx >= 0) { + value = pop(); + if (value == NULL) + return; + stack_push(&bmachine.reg[idx], value); + } +} + +static void +load_array(void) +{ + struct number *inumber, *n; + struct stack *stack; + struct value *v; + struct value copy; + u_long idx; + int reg; + + reg = readreg(); + if (reg >= 0) { + inumber = pop_number(); + if (inumber == NULL) + return; + idx = get_ulong(inumber); + if (BN_cmp(inumber->number, &zero) < 0) + warnx("negative idx"); + else if (idx == BN_MASK2 || idx > MAX_ARRAY_INDEX) + warnx("idx too big"); + else { + stack = &bmachine.reg[reg]; + v = frame_retrieve(stack, idx); + if (v == NULL || v->type == BCODE_NONE) { + n = new_number(); + bn_check(BN_zero(n->number)); + push_number(n); + } + else + push(stack_dup_value(v, ©)); + } + free_number(inumber); + } +} + +static void +store_array(void) +{ + struct number *inumber; + struct value *value; + struct stack *stack; + u_long idx; + int reg; + + reg = readreg(); + if (reg >= 0) { + inumber = pop_number(); + if (inumber == NULL) + return; + value = pop(); + if (value == NULL) { + free_number(inumber); + return; + } + idx = get_ulong(inumber); + if (BN_cmp(inumber->number, &zero) < 0) { + warnx("negative idx"); + stack_free_value(value); + } else if (idx == BN_MASK2 || idx > MAX_ARRAY_INDEX) { + warnx("idx too big"); + stack_free_value(value); + } else { + stack = &bmachine.reg[reg]; + frame_assign(stack, idx, value); + } + free_number(inumber); + } +} + +static void +push_line(void) +{ + + push_string(read_string(&bmachine.readstack[bmachine.readsp])); +} + +static void +comment(void) +{ + + free(readline()); +} + +static void +bexec(char *line) +{ + + system(line); + free(line); +} + +static void +badd(void) +{ + struct number *a, *b, *r; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + + r = new_number(); + r->scale = max(a->scale, b->scale); + if (r->scale > a->scale) + normalize(a, r->scale); + else if (r->scale > b->scale) + normalize(b, r->scale); + bn_check(BN_add(r->number, a->number, b->number)); + push_number(r); + free_number(a); + free_number(b); +} + +static void +bsub(void) +{ + struct number *a, *b, *r; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + + r = new_number(); + + r->scale = max(a->scale, b->scale); + if (r->scale > a->scale) + normalize(a, r->scale); + else if (r->scale > b->scale) + normalize(b, r->scale); + bn_check(BN_sub(r->number, b->number, a->number)); + push_number(r); + free_number(a); + free_number(b); +} + +void +bmul_number(struct number *r, struct number *a, struct number *b) +{ + BN_CTX *ctx; + + /* Create copies of the scales, since r might be equal to a or b */ + u_int ascale = a->scale; + u_int bscale = b->scale; + u_int rscale = ascale + bscale; + + ctx = BN_CTX_new(); + bn_checkp(ctx); + bn_check(BN_mul(r->number, a->number, b->number, ctx)); + BN_CTX_free(ctx); + + if (rscale > bmachine.scale && rscale > ascale && rscale > bscale) { + r->scale = rscale; + normalize(r, max(bmachine.scale, max(ascale, bscale))); + } else + r->scale = rscale; +} + +static void +bmul(void) +{ + struct number *a, *b, *r; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + + r = new_number(); + bmul_number(r, a, b); + + push_number(r); + free_number(a); + free_number(b); +} + +static void +bdiv(void) +{ + struct number *a, *b, *r; + BN_CTX *ctx; + u_int scale; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + + r = new_number(); + r->scale = bmachine.scale; + scale = max(a->scale, b->scale); + + if (BN_is_zero(a->number)) + warnx("divide by zero"); + else { + normalize(a, scale); + normalize(b, scale + r->scale); + + ctx = BN_CTX_new(); + bn_checkp(ctx); + bn_check(BN_div(r->number, NULL, b->number, a->number, ctx)); + BN_CTX_free(ctx); + } + push_number(r); + free_number(a); + free_number(b); +} + +static void +bmod(void) +{ + struct number *a, *b, *r; + BN_CTX *ctx; + u_int scale; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + + r = new_number(); + scale = max(a->scale, b->scale); + r->scale = max(b->scale, a->scale + bmachine.scale); + + if (BN_is_zero(a->number)) + warnx("remainder by zero"); + else { + normalize(a, scale); + normalize(b, scale + bmachine.scale); + + ctx = BN_CTX_new(); + bn_checkp(ctx); + bn_check(BN_mod(r->number, b->number, a->number, ctx)); + BN_CTX_free(ctx); + } + push_number(r); + free_number(a); + free_number(b); +} + +static void +bdivmod(void) +{ + struct number *a, *b, *rdiv, *rmod; + BN_CTX *ctx; + u_int scale; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + + rdiv = new_number(); + rmod = new_number(); + rdiv->scale = bmachine.scale; + rmod->scale = max(b->scale, a->scale + bmachine.scale); + scale = max(a->scale, b->scale); + + if (BN_is_zero(a->number)) + warnx("divide by zero"); + else { + normalize(a, scale); + normalize(b, scale + bmachine.scale); + + ctx = BN_CTX_new(); + bn_checkp(ctx); + bn_check(BN_div(rdiv->number, rmod->number, + b->number, a->number, ctx)); + BN_CTX_free(ctx); + } + push_number(rdiv); + push_number(rmod); + free_number(a); + free_number(b); +} + +static void +bexp(void) +{ + struct number *a, *p, *r; + u_int scale; + bool neg; + + p = pop_number(); + if (p == NULL) { + return; + } + a = pop_number(); + if (a == NULL) { + push_number(p); + return; + } + + if (p->scale != 0) + warnx("Runtime warning: non-zero scale in exponent"); + normalize(p, 0); + + neg = false; + if (BN_cmp(p->number, &zero) < 0) { + neg = true; + negate(p); + scale = bmachine.scale; + } else { + /* Posix bc says min(a.scale * b, max(a.scale, scale) */ + u_long b; + u_int m; + + b = BN_get_word(p->number); + m = max(a->scale, bmachine.scale); + scale = a->scale * (u_int)b; + if (scale > m || (a->scale > 0 && (b == BN_MASK2 || + b > UINT_MAX))) + scale = m; + } + + if (BN_is_zero(p->number)) { + r = new_number(); + bn_check(BN_one(r->number)); + normalize(r, scale); + } else { + while (!BN_is_bit_set(p->number, 0)) { + bmul_number(a, a, a); + bn_check(BN_rshift1(p->number, p->number)); + } + + r = dup_number(a); + normalize(r, scale); + bn_check(BN_rshift1(p->number, p->number)); + + while (!BN_is_zero(p->number)) { + bmul_number(a, a, a); + if (BN_is_bit_set(p->number, 0)) + bmul_number(r, r, a); + bn_check(BN_rshift1(p->number, p->number)); + } + + if (neg) { + BN_CTX *ctx; + BIGNUM *one; + + one = BN_new(); + bn_checkp(one); + bn_check(BN_one(one)); + ctx = BN_CTX_new(); + bn_checkp(ctx); + scale_number(one, r->scale + scale); + normalize(r, scale); + bn_check(BN_div(r->number, NULL, one, r->number, ctx)); + BN_free(one); + BN_CTX_free(ctx); + } else + normalize(r, scale); + } + push_number(r); + free_number(a); + free_number(p); +} + +static bool +bsqrt_stop(const BIGNUM *x, const BIGNUM *y, u_int *onecount) +{ + BIGNUM *r; + bool ret; + + r = BN_new(); + bn_checkp(r); + bn_check(BN_sub(r, x, y)); + if (BN_is_one(r)) + (*onecount)++; + ret = BN_is_zero(r); + BN_free(r); + return (ret || *onecount > 1); +} + +static void +bsqrt(void) +{ + struct number *n, *r; + BIGNUM *x, *y; + BN_CTX *ctx; + u_int onecount, scale; + + onecount = 0; + n = pop_number(); + if (n == NULL) { + return; + } + if (BN_is_zero(n->number)) { + r = new_number(); + push_number(r); + } else if (BN_cmp(n->number, &zero) < 0) + warnx("square root of negative number"); + else { + scale = max(bmachine.scale, n->scale); + normalize(n, 2*scale); + x = BN_dup(n->number); + bn_checkp(x); + bn_check(BN_rshift(x, x, BN_num_bits(x)/2)); + y = BN_new(); + bn_checkp(y); + ctx = BN_CTX_new(); + bn_checkp(ctx); + for (;;) { + bn_checkp(BN_copy(y, x)); + bn_check(BN_div(x, NULL, n->number, x, ctx)); + bn_check(BN_add(x, x, y)); + bn_check(BN_rshift1(x, x)); + if (bsqrt_stop(x, y, &onecount)) + break; + } + r = bmalloc(sizeof(*r)); + r->scale = scale; + r->number = y; + BN_free(x); + BN_CTX_free(ctx); + push_number(r); + } + + free_number(n); +} + +static void +not(void) +{ + struct number *a; + + a = pop_number(); + if (a == NULL) { + return; + } + a->scale = 0; + bn_check(BN_set_word(a->number, BN_get_word(a->number) ? 0 : 1)); + push_number(a); +} + +static void +equal(void) +{ + + compare(BCODE_EQUAL); +} + +static void +equal_numbers(void) +{ + struct number *a, *b, *r; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + r = new_number(); + bn_check(BN_set_word(r->number, + compare_numbers(BCODE_EQUAL, a, b) ? 1 : 0)); + push_number(r); +} + +static void +less_numbers(void) +{ + struct number *a, *b, *r; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + r = new_number(); + bn_check(BN_set_word(r->number, + compare_numbers(BCODE_LESS, a, b) ? 1 : 0)); + push_number(r); +} + +static void +lesseq_numbers(void) +{ + struct number *a, *b, *r; + + a = pop_number(); + if (a == NULL) { + return; + } + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + r = new_number(); + bn_check(BN_set_word(r->number, + compare_numbers(BCODE_NOT_GREATER, a, b) ? 1 : 0)); + push_number(r); +} + +static void +not_equal(void) +{ + + compare(BCODE_NOT_EQUAL); +} + +static void +less(void) +{ + + compare(BCODE_LESS); +} + +static void +not_compare(void) +{ + + switch (readch()) { + case '<': + not_less(); + break; + case '>': + not_greater(); + break; + case '=': + not_equal(); + break; + default: + unreadch(); + bexec(readline()); + break; + } +} + +static void +not_less(void) +{ + + compare(BCODE_NOT_LESS); +} + +static void +greater(void) +{ + + compare(BCODE_GREATER); +} + +static void +not_greater(void) +{ + + compare(BCODE_NOT_GREATER); +} + +static bool +compare_numbers(enum bcode_compare type, struct number *a, struct number *b) +{ + u_int scale; + int cmp; + + scale = max(a->scale, b->scale); + + if (scale > a->scale) + normalize(a, scale); + else if (scale > b->scale) + normalize(b, scale); + + cmp = BN_cmp(a->number, b->number); + + free_number(a); + free_number(b); + + switch (type) { + case BCODE_EQUAL: + return (cmp == 0); + case BCODE_NOT_EQUAL: + return (cmp != 0); + case BCODE_LESS: + return (cmp < 0); + case BCODE_NOT_LESS: + return (cmp >= 0); + case BCODE_GREATER: + return (cmp > 0); + case BCODE_NOT_GREATER: + return (cmp <= 0); + } + return (false); +} + +static void +compare(enum bcode_compare type) +{ + struct number *a, *b; + struct value *v; + int idx, elseidx; + bool ok; + + elseidx = NO_ELSE; + idx = readreg(); + if (readch() == 'e') + elseidx = readreg(); + else + unreadch(); + + a = pop_number(); + if (a == NULL) + return; + b = pop_number(); + if (b == NULL) { + push_number(a); + return; + } + + ok = compare_numbers(type, a, b); + + if (!ok && elseidx != NO_ELSE) + idx = elseidx; + + if (idx >= 0 && (ok || (!ok && elseidx != NO_ELSE))) { + v = stack_tos(&bmachine.reg[idx]); + if (v == NULL) + warnx("register '%c' (0%o) is empty", idx, idx); + else { + switch(v->type) { + case BCODE_NONE: + warnx("register '%c' (0%o) is empty", idx, idx); + break; + case BCODE_NUMBER: + warn("eval called with non-string argument"); + break; + case BCODE_STRING: + eval_string(bstrdup(v->u.string)); + break; + } + } + } +} + + +static void +nop(void) +{ + +} + +static void +quit(void) +{ + + if (bmachine.readsp < 2) + exit(0); + src_free(); + bmachine.readsp--; + src_free(); + bmachine.readsp--; +} + +static void +quitN(void) +{ + struct number *n; + u_long i; + + n = pop_number(); + if (n == NULL) + return; + i = get_ulong(n); + free_number(n); + if (i == BN_MASK2 || i == 0) + warnx("Q command requires a number >= 1"); + else if (bmachine.readsp < i) + warnx("Q command argument exceeded string execution depth"); + else { + while (i-- > 0) { + src_free(); + bmachine.readsp--; + } + } +} + +static void +skipN(void) +{ + struct number *n; + u_long i; + + n = pop_number(); + if (n == NULL) + return; + i = get_ulong(n); + if (i == BN_MASK2) + warnx("J command requires a number >= 0"); + else if (i > 0 && bmachine.readsp < i) + warnx("J command argument exceeded string execution depth"); + else { + while (i-- > 0) { + src_free(); + bmachine.readsp--; + } + skip_until_mark(); + } +} + +static void +skip_until_mark(void) +{ + + for (;;) { + switch (readch()) { + case 'M': + return; + case EOF: + errx(1, "mark not found"); + return; + case 'l': + case 'L': + case 's': + case 'S': + case ':': + case ';': + case '<': + case '>': + case '=': + readreg(); + if (readch() == 'e') + readreg(); + else + unreadch(); + break; + case '[': + free(read_string(&bmachine.readstack[bmachine.readsp])); + break; + case '!': + switch (readch()) { + case '<': + case '>': + case '=': + readreg(); + if (readch() == 'e') + readreg(); + else + unreadch(); + break; + default: + free(readline()); + break; + } + break; + default: + break; + } + } +} + +static void +parse_number(void) +{ + + unreadch(); + push_number(readnumber(&bmachine.readstack[bmachine.readsp], + bmachine.ibase)); +} + +static void +unknown(void) +{ + int ch = bmachine.readstack[bmachine.readsp].lastchar; + warnx("%c (0%o) is unimplemented", ch, ch); +} + +static void +eval_string(char *p) +{ + int ch; + + if (bmachine.readsp > 0) { + /* Check for tail call. Do not recurse in that case. */ + ch = readch(); + if (ch == EOF) { + src_free(); + src_setstring(&bmachine.readstack[bmachine.readsp], p); + return; + } else + unreadch(); + } + if (bmachine.readsp == bmachine.readstack_sz - 1) { + size_t newsz = bmachine.readstack_sz * 2; + struct source *stack; + stack = realloc(bmachine.readstack, newsz * + sizeof(struct source)); + if (stack == NULL) + err(1, "recursion too deep"); + bmachine.readstack_sz = newsz; + bmachine.readstack = stack; + } + src_setstring(&bmachine.readstack[++bmachine.readsp], p); +} + +static void +eval_line(void) +{ + /* Always read from stdin */ + struct source in; + char *p; + + clearerr(stdin); + src_setstream(&in, stdin); + p = (*in.vtable->readline)(&in); + eval_string(p); +} + +static void +eval_tos(void) +{ + char *p; + + p = pop_string(); + if (p == NULL) + return; + eval_string(p); +} + +void +eval(void) +{ + int ch; + + for (;;) { + ch = readch(); + if (ch == EOF) { + if (bmachine.readsp == 0) + return; + src_free(); + bmachine.readsp--; + continue; + } + if (bmachine.interrupted) { + if (bmachine.readsp > 0) { + src_free(); + bmachine.readsp--; + continue; + } else + bmachine.interrupted = false; + } +#ifdef DEBUGGING + fprintf(stderr, "# %c\n", ch); + stack_print(stderr, &bmachine.stack, "* ", + bmachine.obase); + fprintf(stderr, "%zd =>\n", bmachine.readsp); +#endif + + if (0 <= ch && ch < (signed)UCHAR_MAX) + (*jump_table[ch])(); + else + warnx("internal error: opcode %d", ch); + +#ifdef DEBUGGING + stack_print(stderr, &bmachine.stack, "* ", + bmachine.obase); + fprintf(stderr, "%zd ==\n", bmachine.readsp); +#endif + } +} diff --git a/usr.bin/dc/bcode.h b/usr.bin/dc/bcode.h new file mode 100644 index 000000000000..9290cf1b68c8 --- /dev/null +++ b/usr.bin/dc/bcode.h @@ -0,0 +1,98 @@ +/* $FreeBSD$ */ +/* $OpenBSD: bcode.h,v 1.5 2006/01/16 08:09:25 otto Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +struct number { + BIGNUM *number; + u_int scale; +}; + +enum stacktype { + BCODE_NONE, + BCODE_NUMBER, + BCODE_STRING +}; + +enum bcode_compare { + BCODE_EQUAL, + BCODE_NOT_EQUAL, + BCODE_LESS, + BCODE_NOT_LESS, + BCODE_GREATER, + BCODE_NOT_GREATER +}; + +struct array; + +struct value { + union { + struct number *num; + char *string; + } u; + struct array *array; + enum stacktype type; +}; + +struct array { + struct value *data; + size_t size; +}; + +struct stack { + struct value *stack; + ssize_t size; + ssize_t sp; +}; + +struct source; + +struct vtable { + int (*readchar)(struct source *); + void (*unreadchar)(struct source *); + char *(*readline)(struct source *); + void (*free)(struct source *); +}; + +struct source { + union { + struct { + u_char *buf; + size_t pos; + } string; + FILE *stream; + } u; + struct vtable *vtable; + int lastchar; +}; + +void init_bmachine(bool); +void reset_bmachine(struct source *); +void scale_number(BIGNUM *, int); +void normalize(struct number *, u_int); +void eval(void); +void pn(const char *, const struct number *); +void pbn(const char *, const BIGNUM *); +void negate(struct number *); +void split_number(const struct number *, BIGNUM *, BIGNUM *); +void bmul_number(struct number *, struct number *, + struct number *); + +extern BIGNUM zero; diff --git a/usr.bin/dc/dc.1 b/usr.bin/dc/dc.1 new file mode 100644 index 000000000000..03fc7621a5a8 --- /dev/null +++ b/usr.bin/dc/dc.1 @@ -0,0 +1,548 @@ +.\" $FreeBSD$ +.\" $OpenBSD: dc.1,v 1.24 2010/01/02 19:48:56 schwarze Exp $ +.\" +.\" Copyright (C) Caldera International Inc. 2001-2002. +.\" 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 and documentation 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. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed or owned by Caldera +.\" International, Inc. +.\" 4. Neither the name of Caldera International, Inc. nor the names of other +.\" contributors may be used to endorse or promote products derived from +.\" this software without specific prior written permission. +.\" +.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA +.\" INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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. +.\" +.\" @(#)dc.1 8.1 (Berkeley) 6/6/93 +.\" +.Dd January 22, 2010 +.Dt DC 1 +.Os +.Sh NAME +.Nm dc +.Nd desk calculator +.Sh SYNOPSIS +.Nm +.Op Fl hxV +.Op Fl e Ar expression +.Op Fl f Ar filename +.Op Ar filename +.Sh DESCRIPTION +.Nm +is an arbitrary precision arithmetic package. +The overall structure of +.Nm +is +a stacking (reverse Polish) calculator i.e.\& +numbers are stored on a stack. +Adding a number pushes it onto the stack. +Arithmetic operations pop arguments off the stack +and push the results. +See also the +.Xr bc 1 +utility, which is a preprocessor for +.Nm +providing infix notation and a C-like syntax +which implements functions and reasonable control +structures for programs. +The options are as follows: +.Bl -tag -width Ds +.It Fl e Ar expr , Fl Fl expression Ar expr +Evaluate +.Ar expression . +If multiple +.Fl e +options are specified, they will be processed in the order given. +If no +.Ar filename +argument is given, execution will stop after processing the expressions +given on the command line, +otherwise processing will continue with the contents of +.Ar filename . +.It Fl f Ar filename , Fl Fl file Ar filename +Process the content of the given file before further calculations are done. +If multiple +.Fl f +options are specified, they will be processed in the order given. +.It Fl h , Fl Fl help +Print short usage info. +.It Fl V , Fl Fl version +Print version info. +.It Fl x +Enable extended register mode. +This mode is used by +.Xr bc 1 +to allow more than 256 registers. +See +.Sx Registers +for a more detailed description. +.El +.Pp +Ordinarily, +.Nm +operates on decimal integers, +but one may specify an input base, output base, +and a number of fractional digits (scale) to be maintained. +If an argument is given, +input is taken from that file until its end, +then from the standard input. +Whitespace is ignored, except where it signals the end of a number, +end of a line or when a register name is expected. +The following constructions are recognized: +.Bl -tag -width "number" +.It Va number +The value of the number is pushed on the stack. +A number is an unbroken string of the digits 0\-9 and letters A\-F. +It may be preceded by an underscore +.Pq Sq _ +to input a negative number. +A number may contain a single decimal point. +A number may also contain the characters A\-F, with the values 10\-15. +.It Cm "+ - / * % ~ ^" +The +top two values on the stack are added +(+), +subtracted +(\-), +multiplied (*), +divided (/), +remaindered (%), +divided and remaindered (~), +or exponentiated (^). +The two entries are popped off the stack; +the result is pushed on the stack in their place. +Any fractional part of an exponent is ignored. +.Pp +For addition and subtraction, the scale of the result is the maximum +of scales of the operands. +For division the scale of the result is defined +by the scale set by the +.Ic k +operation. +For multiplication, the scale is defined by the expression +.Sy min(a+b,max(a,b,scale)) , +where +.Sy a +and +.Sy b +are the scales of the operands, and +.Sy scale +is the scale defined by the +.Ic k +operation. +For exponentiation with a non-negative exponent, the scale of the result is +.Sy min(a*b,max(scale,a)) , +where +.Sy a +is the scale of the base, and +.Sy b +is the +.Em value +of the exponent. +If the exponent is negative, the scale of the result is the scale +defined by the +.Ic k +operation. +.Pp +In the case of the division and modulus operator (~), +the resultant quotient is pushed first followed by the remainder. +This is a shorthand for the sequence: +.Bd -literal -offset indent -compact +x y / x y % +.Ed +The division and modulus operator is a non-portable extension. +.It Ic a +Pop the top value from the stack. +If that value is a number, compute the integer part of the number modulo 256. +If the result is zero, push an empty string. +Otherwise push a one character string by interpreting the computed value +as an +.Tn ASCII +character. +.Pp +If the top value is a string, push a string containing the first character +of the original string. +If the original string is empty, an empty string is pushed back. +The +.Ic a +operator is a non-portable extension. +.It Ic c +All values on the stack are popped. +.It Ic d +The top value on the stack is duplicated. +.It Ic f +All values on the stack are printed, separated by newlines. +.It Ic G +The top two numbers are popped from the stack and compared. +A one is pushed if the top of the stack is equal to the second number +on the stack. +A zero is pushed otherwise. +This is a non-portable extension. +.It Ic I +Pushes the input base on the top of the stack. +.It Ic i +The top value on the stack is popped and used as the +base for further input. +The initial input base is 10. +.It Ic J +Pop the top value from the stack. +The recursion level is popped by that value and, following that, +the input is skipped until the first occurrence of the +.Ic M +operator. +The +.Ic J +operator is a non-portable extension, used by the +.Xr bc 1 +command. +.It Ic K +The current scale factor is pushed onto the stack. +.It Ic k +The top of the stack is popped, and that value is used as +a non-negative scale factor: +the appropriate number of places +are printed on output, +and maintained during multiplication, division, and exponentiation. +The interaction of scale factor, +input base, and output base will be reasonable if all are changed +together. +.It Ic L Ns Ar x +Register +.Ar x +is treated as a stack and its top value is popped onto the main stack. +.It Ic l Ns Ar x +The +value in register +.Ar x +is pushed on the stack. +The register +.Ar x +is not altered. +Initially, all registers contain the value zero. +.It Ic M +Mark used by the +.Ic J +operator. +The +.Ic M +operator is a non-portable extensions, used by the +.Xr bc 1 +command. +.It Ic N +The top of the stack is replaced by one if the top of the stack +is equal to zero. +If the top of the stack is unequal to zero, it is replaced by zero. +This is a non-portable extension. +.It Ic n +The top value on the stack is popped and printed without a newline. +This is a non-portable extension. +.It Ic O +Pushes the output base on the top of the stack. +.It Ic o +The top value on the stack is popped and used as the +base for further output. +The initial output base is 10. +.It Ic P +The top of the stack is popped. +If the top of the stack is a string, it is printed without a trailing newline. +If the top of the stack is a number, it is interpreted as a +base 256 number, and each digit of this base 256 number is printed as +an +.Tn ASCII +character, without a trailing newline. +.It Ic p +The top value on the stack is printed with a trailing newline. +The top value remains unchanged. +.It Ic Q +The top value on the stack is popped and the string execution level is popped +by that value. +.It Ic q +Exits the program. +If executing a string, the recursion level is +popped by two. +.It Ic R +The top of the stack is removed (popped). +This is a non-portable extension. +.It Ic r +The top two values on the stack are reversed (swapped). +This is a non-portable extension. +.It Ic S Ns Ar x +Register +.Ar x +is treated as a stack. +The top value of the main stack is popped and pushed on it. +.It Ic s Ns Ar x +The +top of the stack is popped and stored into +a register named +.Ar x . +.It Ic v +Replaces the top element on the stack by its square root. +The scale of the result is the maximum of the scale of the argument +and the current value of scale. +.It Ic X +Replaces the number on the top of the stack with its scale factor. +If the top of the stack is a string, replace it with the integer 0. +.It Ic x +Treats the top element of the stack as a character string +and executes it as a string of +.Nm +commands. +.It Ic Z +Replaces the number on the top of the stack with its length. +The length of a string is its number of characters. +The length of a number is its number of digits, not counting the minus sign +and decimal point. +.It Ic z +The stack level is pushed onto the stack. +.It Cm [ Ns ... Ns Cm ] +Puts the bracketed +.Tn ASCII +string onto the top of the stack. +If the string includes brackets, these must be properly balanced. +The backslash character +.Pq Sq \e +may be used as an escape character, making it +possible to include unbalanced brackets in strings. +To include a backslash in a string, use a double backslash. +.It Xo +.Cm < Ns Va x +.Cm > Ns Va x +.Cm = Ns Va x +.Cm !< Ns Va x +.Cm !> Ns Va x +.Cm != Ns Va x +.Xc +The top two elements of the stack are popped and compared. +Register +.Ar x +is executed if they obey the stated +relation. +.It Xo +.Cm < Ns Va x Ns e Ns Va y +.Cm > Ns Va x Ns e Ns Va y +.Cm = Ns Va x Ns e Ns Va y +.Cm !< Ns Va x Ns e Ns Va y +.Cm !> Ns Va x Ns e Ns Va y +.Cm != Ns Va x Ns e Ns Va y +.Xc +These operations are variants of the comparison operations above. +The first register name is followed by the letter +.Sq e +and another register name. +Register +.Ar x +will be executed if the relation is true, and register +.Ar y +will be executed if the relation is false. +This is a non-portable extension. +.It Ic \&( +The top two numbers are popped from the stack and compared. +A one is pushed if the top of the stack is less than the second number +on the stack. +A zero is pushed otherwise. +This is a non-portable extension. +.It Ic { +The top two numbers are popped from the stack and compared. +A one is pushed if the top of stack is less than or equal to the +second number on the stack. +A zero is pushed otherwise. +This is a non-portable extension. +.It Ic \&! +Interprets the rest of the line as a +.Ux +command. +.It Ic \&? +A line of input is taken from the input source (usually the terminal) +and executed. +.It Ic : Ns Ar r +Pop two values from the stack. +The second value on the stack is stored into the array +.Ar r +indexed by the top of stack. +.It Ic ; Ns Ar r +Pop a value from the stack. +The value is used as an index into register +.Ar r . +The value in this register is pushed onto the stack. +.Pp +Array elements initially have the value zero. +Each level of a stacked register has its own array associated with +it. +The command sequence +.Bd -literal -offset indent +[first] 0:a [dummy] Sa [second] 0:a 0;a p La 0;a p +.Ed +.Pp +will print +.Bd -literal -offset indent +second +first +.Ed +.Pp +since the string +.Ql second +is written in an array that is later popped, to reveal the array that +stored +.Ql first . +.It Ic # +Skip the rest of the line. +This is a non-portable extension. +.El +.Ss Registers +Registers have a single character name +.Ar x , +where +.Ar x +may be any character, including space, tab or any other special character. +If extended register mode is enabled using the +.Fl x +option and the register identifier +.Ar x +has the value 255, the next two characters are interpreted as a +two-byte register index. +The set of standard single character registers and the set of extended +registers do not overlap. +Extended register mode is a non-portable extension. +.Sh EXAMPLES +An example which prints the first ten values of +.Ic n! : +.Bd -literal -offset indent +[la1+dsa*pla10>y]sy +0sa1 +lyx +.Ed +.Pp +Independent of the current input base, the command +.Bd -literal -offset indent +Ai +.Ed +.Pp +will reset the input base to decimal 10. +.Sh DIAGNOSTICS +.Bl -diag +.It %c (0%o) is unimplemented +an undefined operation was called. +.It stack empty +for not enough elements on the stack to do what was asked. +.It stack register '%c' (0%o) is empty +for an +.Ar L +operation from a stack register that is empty. +.It Runtime warning: non-zero scale in exponent +for a fractional part of an exponent that is being ignored. +.It divide by zero +for trying to divide by zero. +.It remainder by zero +for trying to take a remainder by zero. +.It square root of negative number +for trying to take the square root of a negative number. +.It index too big +for an array index that is larger than 2048. +.It negative index +for a negative array index. +.It "input base must be a number between 2 and 16" +for trying to set an illegal input base. +.It output base must be a number greater than 1 +for trying to set an illegal output base. +.It scale must be a nonnegative number +for trying to set a negative or zero scale. +.It scale too large +for trying to set a scale that is too large. +A scale must be representable as a 32-bit unsigned number. +.It Q command argument exceeded string execution depth +for trying to pop the recursion level more than the current +recursion level. +.It Q command requires a number >= 1 +for trying to pop an illegal number of recursion levels. +.It recursion too deep +for too many levels of nested execution. +.Pp +The recursion level is increased by one if the +.Ar x +or +.Ar ?\& +operation or one of the compare operations resulting in the execution +of register is executed. +As an exception, the recursion level is not increased if the operation +is executed as the last command of a string. +For example, the commands +.Bd -literal -offset indent +[lax]sa +1 lax +.Ed +.Pp +will execute an endless loop, while the commands +.Bd -literal -offset indent +[laxp]sa +1 lax +.Ed +.Pp +will terminate because of a too deep recursion level. +.It J command argument exceeded string execution depth +for trying to pop the recursion level more than the current +recursion level. +.It mark not found +for a failed scan for an occurrence of the +.Ic M +operator. +.El +.Sh SEE ALSO +.Xr bc 1 +.Pp +.An -nosplit +.An L. L. Cherry , +.An R. Morris +"DC \- An Interactive Desk Calculator" +.Pa /usr/share/doc/usd/05.dc/ . +.Sh STANDARDS +The arithmetic operations of the +.Nm +utility are expected to conform to the definition listed in the +.Xr bc 1 +section of the +.St -p1003.2 +specification. +.Sh HISTORY +The +.Nm +command first appeared in +.At v6 . +A complete rewrite of the +.Nm +command using the +.Xr bn 3 +big number routines first appeared in +.Ox 3.5 . +.Sh AUTHORS +.An -nosplit +The original version of the +.Nm +command was written by +.An Robert Morris +and +.An Lorinda Cherry . +The current version of the +.Nm +utility was written by +.An Otto Moerbeek . diff --git a/usr.bin/dc/dc.c b/usr.bin/dc/dc.c new file mode 100644 index 000000000000..13766539bdd7 --- /dev/null +++ b/usr.bin/dc/dc.c @@ -0,0 +1,135 @@ +/* $OpenBSD: dc.c,v 1.11 2009/10/27 23:59:37 deraadt Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * Copyright (c) 2009, Gabor Kovesdan + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "extern.h" + +#define DC_VER "1.3-FreeBSD" + +static void usage(void); + +extern char *__progname; + +struct source src; + +struct option long_options[] = +{ + {"expression", required_argument, NULL, 'e'}, + {"file", required_argument, NULL, 'f'}, + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'V'} +}; + +static void +usage(void) +{ + fprintf(stderr, "usage: %s [-hVx] [-e expression] [file]\n", + __progname); + exit(1); +} + +static void +procfile(char *fname) { + struct stat st; + FILE *file; + + file = fopen(fname, "r"); + if (file == NULL) + err(1, "cannot open file %s", fname); + if (fstat(fileno(file), &st) == -1) + err(1, "%s", fname); + if (S_ISDIR(st.st_mode)) { + errno = EISDIR; + err(1, "%s", fname); + } + src_setstream(&src, file); + reset_bmachine(&src); + eval(); + fclose(file); +} + +int +main(int argc, char *argv[]) +{ + int ch; + bool extended_regs = false, preproc_done = false; + + /* accept and ignore a single dash to be 4.4BSD dc(1) compatible */ + while ((ch = getopt_long(argc, argv, "e:f:Vx", long_options, NULL)) != -1) { + switch (ch) { + case 'e': + src_setstring(&src, optarg); + reset_bmachine(&src); + eval(); + preproc_done = true; + break; + case 'f': + procfile(optarg); + preproc_done = true; + break; + case 'x': + extended_regs = true; + break; + case 'V': + fprintf(stderr, "%s (BSD bc) %s\n", __progname, DC_VER); + exit(0); + break; + case '-': + break; + case 'h': + /* FALLTHROUGH */ + default: + usage(); + } + } + argc -= optind; + argv += optind; + + init_bmachine(extended_regs); + setlinebuf(stdout); + setlinebuf(stderr); + + if (argc > 1) + usage(); + if (argc == 1) { + procfile(argv[0]); + preproc_done = true; + } + if (preproc_done) + return (0); + + src_setstream(&src, stdin); + reset_bmachine(&src); + eval(); + + return (0); +} diff --git a/usr.bin/dc/extern.h b/usr.bin/dc/extern.h new file mode 100644 index 000000000000..4abf06355a3a --- /dev/null +++ b/usr.bin/dc/extern.h @@ -0,0 +1,63 @@ +/* $FreeBSD$ */ +/* $OpenBSD: extern.h,v 1.3 2006/01/16 08:09:25 otto Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include "bcode.h" + + +/* inout.c */ +void src_setstream(struct source *, FILE *); +void src_setstring(struct source *, char *); +struct number *readnumber(struct source *, u_int); +void printnumber(FILE *, const struct number *, u_int); +char *read_string(struct source *); +void print_value(FILE *, const struct value *, const char *, u_int); +void print_ascii(FILE *, const struct number *); + +/* mem.c */ +struct number *new_number(void); +void free_number(struct number *); +struct number *dup_number(const struct number *); +void *bmalloc(size_t); +void *brealloc(void *, size_t); +char *bstrdup(const char *p); +void bn_check(int); +void bn_checkp(const void *); + +/* stack.c */ +void stack_init(struct stack *); +void stack_free_value(struct value *); +struct value *stack_dup_value(const struct value *, struct value *); +void stack_swap(struct stack *); +size_t stack_size(const struct stack *); +void stack_dup(struct stack *); +void stack_pushnumber(struct stack *, struct number *); +void stack_pushstring(struct stack *stack, char *); +void stack_push(struct stack *, struct value *); +void stack_set_tos(struct stack *, struct value *); +struct value *stack_tos(const struct stack *); +struct value *stack_pop(struct stack *); +struct number *stack_popnumber(struct stack *); +char *stack_popstring(struct stack *); +void stack_clear(struct stack *); +void stack_print(FILE *, const struct stack *, const char *, + u_int base); +void frame_assign(struct stack *, size_t, const struct value *); +struct value *frame_retrieve(const struct stack *, size_t); +/* void frame_free(struct stack *); */ diff --git a/usr.bin/dc/inout.c b/usr.bin/dc/inout.c new file mode 100644 index 000000000000..4a2bb701be6a --- /dev/null +++ b/usr.bin/dc/inout.c @@ -0,0 +1,417 @@ +/* $OpenBSD: inout.c,v 1.15 2009/10/27 23:59:37 deraadt Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include "extern.h" + +#define MAX_CHARS_PER_LINE 68 + +static int lastchar; +static int charcount; + +static int src_getcharstream(struct source *); +static void src_ungetcharstream(struct source *); +static char *src_getlinestream(struct source *); +static int src_getcharstring(struct source *); +static void src_ungetcharstring(struct source *); +static char *src_getlinestring(struct source *); +static void src_freestring(struct source *); +static void flushwrap(FILE *); +static void putcharwrap(FILE *, int); +static void printwrap(FILE *, const char *); +static char *get_digit(u_long, int, u_int); + +static struct vtable stream_vtable = { + src_getcharstream, + src_ungetcharstream, + src_getlinestream, + NULL +}; + +static struct vtable string_vtable = { + src_getcharstring, + src_ungetcharstring, + src_getlinestring, + src_freestring +}; + +void +src_setstream(struct source *src, FILE *stream) +{ + + src->u.stream = stream; + src->vtable = &stream_vtable; +} + +void +src_setstring(struct source *src, char *p) +{ + + src->u.string.buf = (u_char *)p; + src->u.string.pos = 0; + src->vtable = &string_vtable; +} + +static int +src_getcharstream(struct source *src) +{ + + return (src->lastchar = getc(src->u.stream)); +} + +static void +src_ungetcharstream(struct source *src) +{ + + ungetc(src->lastchar, src->u.stream); +} + +static char * +src_getlinestream(struct source *src) +{ + char buf[BUFSIZ]; + + if (fgets(buf, BUFSIZ, src->u.stream) == NULL) + return (bstrdup("")); + return bstrdup(buf); +} + +static int +src_getcharstring(struct source *src) +{ + + src->lastchar = src->u.string.buf[src->u.string.pos]; + if (src->lastchar == '\0') + return (EOF); + else { + src->u.string.pos++; + return (src->lastchar); + } +} + +static void +src_ungetcharstring(struct source *src) +{ + + if (src->u.string.pos > 0) { + if (src->lastchar != '\0') + --src->u.string.pos; + } +} + +static char * +src_getlinestring(struct source *src) +{ + char buf[BUFSIZ]; + int i, ch; + + i = 0; + while (i < BUFSIZ-1) { + ch = src_getcharstring(src); + if (ch == EOF) + break; + buf[i++] = ch; + if (ch == '\n') + break; + } + buf[i] = '\0'; + return (bstrdup(buf)); +} + +static void +src_freestring(struct source *src) +{ + + free(src->u.string.buf); +} + +static void +flushwrap(FILE *f) +{ + + if (lastchar != -1) + putc(lastchar, f); +} + +static void +putcharwrap(FILE *f, int ch) +{ + + if (charcount >= MAX_CHARS_PER_LINE) { + charcount = 0; + fputs("\\\n", f); + } + if (lastchar != -1) { + charcount++; + putc(lastchar, f); + } + lastchar = ch; +} + +static void +printwrap(FILE *f, const char *p) +{ + char *q; + char buf[12]; + + q = buf; + strlcpy(buf, p, sizeof(buf)); + while (*q) + putcharwrap(f, *q++); +} + +struct number * +readnumber(struct source *src, u_int base) +{ + struct number *n; + BN_ULONG v; + u_int i; + int ch; + bool dot = false, sign = false; + + n = new_number(); + bn_check(BN_zero(n->number)); + + while ((ch = (*src->vtable->readchar)(src)) != EOF) { + + if ('0' <= ch && ch <= '9') + v = ch - '0'; + else if ('A' <= ch && ch <= 'F') + v = ch - 'A' + 10; + else if (ch == '_') { + sign = true; + continue; + } else if (ch == '.') { + if (dot) + break; + dot = true; + continue; + } else { + (*src->vtable->unreadchar)(src); + break; + } + if (dot) + n->scale++; + + bn_check(BN_mul_word(n->number, base)); + +#if 0 + /* work around a bug in BN_add_word: 0 += 0 is buggy.... */ + if (v > 0) +#endif + bn_check(BN_add_word(n->number, v)); + } + if (base != 10) { + scale_number(n->number, n->scale); + for (i = 0; i < n->scale; i++) + BN_div_word(n->number, base); + } + if (sign) + negate(n); + return (n); +} + +char * +read_string(struct source *src) +{ + char *p; + int count, ch, i, new_sz, sz; + bool escape; + + escape = false; + count = 1; + i = 0; + sz = 15; + p = bmalloc(sz + 1); + + while ((ch = (*src->vtable->readchar)(src)) != EOF) { + if (!escape) { + if (ch == '[') + count++; + else if (ch == ']') + count--; + if (count == 0) + break; + } + if (ch == '\\' && !escape) + escape = true; + else { + escape = false; + if (i == sz) { + new_sz = sz * 2; + p = brealloc(p, new_sz + 1); + sz = new_sz; + } + p[i++] = ch; + } + } + p[i] = '\0'; + return (p); +} + +static char * +get_digit(u_long num, int digits, u_int base) +{ + char *p; + + if (base <= 16) { + p = bmalloc(2); + p[0] = num >= 10 ? num + 'A' - 10 : num + '0'; + p[1] = '\0'; + } else { + if (asprintf(&p, "%0*lu", digits, num) == -1) + err(1, NULL); + } + return (p); +} + +void +printnumber(FILE *f, const struct number *b, u_int base) +{ + struct number *fract_part, *int_part; + struct stack stack; + char *p; + char buf[11]; + size_t sz; + unsigned int i; + int digits; + + charcount = 0; + lastchar = -1; + if (BN_is_zero(b->number)) + putcharwrap(f, '0'); + + int_part = new_number(); + fract_part = new_number(); + fract_part->scale = b->scale; + + if (base <= 16) + digits = 1; + else { + digits = snprintf(buf, sizeof(buf), "%u", base-1); + } + split_number(b, int_part->number, fract_part->number); + + i = 0; + stack_init(&stack); + while (!BN_is_zero(int_part->number)) { + BN_ULONG rem = BN_div_word(int_part->number, base); + stack_pushstring(&stack, get_digit(rem, digits, base)); + i++; + } + sz = i; + if (BN_cmp(b->number, &zero) < 0) + putcharwrap(f, '-'); + for (i = 0; i < sz; i++) { + p = stack_popstring(&stack); + if (base > 16) + putcharwrap(f, ' '); + printwrap(f, p); + free(p); + } + stack_clear(&stack); + if (b->scale > 0) { + struct number *num_base; + BIGNUM mult, stop; + + putcharwrap(f, '.'); + num_base = new_number(); + bn_check(BN_set_word(num_base->number, base)); + BN_init(&mult); + bn_check(BN_one(&mult)); + BN_init(&stop); + bn_check(BN_one(&stop)); + scale_number(&stop, b->scale); + + i = 0; + while (BN_cmp(&mult, &stop) < 0) { + u_long rem; + + if (i && base > 16) + putcharwrap(f, ' '); + i = 1; + + bmul_number(fract_part, fract_part, num_base); + split_number(fract_part, int_part->number, NULL); + rem = BN_get_word(int_part->number); + p = get_digit(rem, digits, base); + int_part->scale = 0; + normalize(int_part, fract_part->scale); + bn_check(BN_sub(fract_part->number, fract_part->number, + int_part->number)); + printwrap(f, p); + free(p); + bn_check(BN_mul_word(&mult, base)); + } + free_number(num_base); + BN_free(&mult); + BN_free(&stop); + } + flushwrap(f); + free_number(int_part); + free_number(fract_part); +} + +void +print_value(FILE *f, const struct value *value, const char *prefix, u_int base) +{ + + fputs(prefix, f); + switch (value->type) { + case BCODE_NONE: + if (value->array != NULL) + fputs("", f); + break; + case BCODE_NUMBER: + printnumber(f, value->u.num, base); + break; + case BCODE_STRING: + fputs(value->u.string, f); + break; + } +} + +void +print_ascii(FILE *f, const struct number *n) +{ + BIGNUM *v; + int ch, i, numbits; + + v = BN_dup(n->number); + bn_checkp(v); + + if (BN_cmp(v, &zero) < 0) + bn_check(BN_sub(v, &zero, v)); + + numbits = BN_num_bytes(v) * 8; + while (numbits > 0) { + ch = 0; + for (i = 0; i < 8; i++) + ch |= BN_is_bit_set(v, numbits-i-1) << (7 - i); + putc(ch, f); + numbits -= 8; + } + BN_free(v); +} diff --git a/usr.bin/dc/mem.c b/usr.bin/dc/mem.c new file mode 100644 index 000000000000..78fb429e2604 --- /dev/null +++ b/usr.bin/dc/mem.c @@ -0,0 +1,110 @@ +/* $OpenBSD: mem.c,v 1.5 2009/10/27 23:59:37 deraadt Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#include +#include +#include + +#include "extern.h" + +struct number * +new_number(void) +{ + struct number *n; + + n = bmalloc(sizeof(*n)); + n->scale = 0; + n->number = BN_new(); + if (n->number == NULL) + err(1, NULL); + return (n); +} + +void +free_number(struct number *n) +{ + + BN_free(n->number); + free(n); +} + +struct number * +dup_number(const struct number *a) +{ + struct number *n; + + n = bmalloc(sizeof(*n)); + n->scale = a->scale; + n->number = BN_dup(a->number); + bn_checkp(n->number); + return (n); +} + +void * +bmalloc(size_t sz) +{ + void *p; + + p = malloc(sz); + if (p == NULL) + err(1, NULL); + return (p); +} + +void * +brealloc(void *p, size_t sz) +{ + void *q; + + q = realloc(p, sz); + if (q == NULL) + err(1, NULL); + return (q); +} + +char * +bstrdup(const char *p) +{ + char *q; + + q = strdup(p); + if (q == NULL) + err(1, NULL); + return (q); +} + +void +bn_check(int x) \ +{ + + if (x == 0) + err(1, "big number failure %lx", ERR_get_error()); +} + +void +bn_checkp(const void *p) \ +{ + + if (p == NULL) + err(1, "allocation failure %lx", ERR_get_error()); +} diff --git a/usr.bin/dc/stack.c b/usr.bin/dc/stack.c new file mode 100644 index 000000000000..950b4e5fdbf5 --- /dev/null +++ b/usr.bin/dc/stack.c @@ -0,0 +1,379 @@ +/* $OpenBSD: stack.c,v 1.11 2009/10/27 23:59:37 deraadt Exp $ */ + +/* + * Copyright (c) 2003, Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include "extern.h" + +static __inline bool stack_empty(const struct stack *); +static void stack_grow(struct stack *); +static struct array *array_new(void); +static __inline void array_free(struct array *); +static struct array *array_dup(const struct array *); +static __inline void array_grow(struct array *, size_t); +static __inline void array_assign(struct array *, size_t, const struct value *); +static __inline struct value *array_retrieve(const struct array *, size_t); + +void +stack_init(struct stack *stack) +{ + + stack->size = 0; + stack->sp = -1; + stack->stack = NULL; +} + +static __inline bool +stack_empty(const struct stack *stack) +{ + bool empty = stack->sp == -1; + + if (empty) + warnx("stack empty"); + return empty; +} + +/* Clear number or string, but leave value itself */ +void +stack_free_value(struct value *v) +{ + + switch (v->type) { + case BCODE_NONE: + break; + case BCODE_NUMBER: + free_number(v->u.num); + break; + case BCODE_STRING: + free(v->u.string); + break; + } + if (v->array != NULL) { + array_free(v->array); + v->array = NULL; + } +} + +/* Copy number or string content into already allocated target */ +struct value * +stack_dup_value(const struct value *a, struct value *copy) +{ + + copy->type = a->type; + + switch (a->type) { + case BCODE_NONE: + break; + case BCODE_NUMBER: + copy->u.num = dup_number(a->u.num); + break; + case BCODE_STRING: + copy->u.string = strdup(a->u.string); + if (copy->u.string == NULL) + err(1, NULL); + break; + } + + copy->array = a->array == NULL ? NULL : array_dup(a->array); + + return (copy); +} + +size_t +stack_size(const struct stack *stack) +{ + + return (stack->sp + 1); +} + +void +stack_dup(struct stack *stack) +{ + struct value *value; + struct value copy; + + value = stack_tos(stack); + if (value == NULL) { + warnx("stack empty"); + return; + } + stack_push(stack, stack_dup_value(value, ©)); +} + +void +stack_swap(struct stack *stack) +{ + struct value copy; + + if (stack->sp < 1) { + warnx("stack empty"); + return; + } + copy = stack->stack[stack->sp]; + stack->stack[stack->sp] = stack->stack[stack->sp-1]; + stack->stack[stack->sp-1] = copy; +} + +static void +stack_grow(struct stack *stack) +{ + size_t i, new_size; + + if (++stack->sp == stack->size) { + new_size = stack->size * 2 + 1; + stack->stack = brealloc(stack->stack, + new_size * sizeof(*stack->stack)); + for (i = stack->size; i < new_size; i++) + stack->stack[i].array = NULL; + stack->size = new_size; + } +} + +void +stack_pushnumber(struct stack *stack, struct number *b) +{ + + stack_grow(stack); + stack->stack[stack->sp].type = BCODE_NUMBER; + stack->stack[stack->sp].u.num = b; +} + +void +stack_pushstring(struct stack *stack, char *string) +{ + + stack_grow(stack); + stack->stack[stack->sp].type = BCODE_STRING; + stack->stack[stack->sp].u.string = string; +} + +void +stack_push(struct stack *stack, struct value *v) +{ + + switch (v->type) { + case BCODE_NONE: + stack_grow(stack); + stack->stack[stack->sp].type = BCODE_NONE; + break; + case BCODE_NUMBER: + stack_pushnumber(stack, v->u.num); + break; + case BCODE_STRING: + stack_pushstring(stack, v->u.string); + break; + } + stack->stack[stack->sp].array = v->array == NULL ? + NULL : array_dup(v->array); +} + +struct value * +stack_tos(const struct stack *stack) +{ + + if (stack->sp == -1) + return (NULL); + return &stack->stack[stack->sp]; +} + +void +stack_set_tos(struct stack *stack, struct value *v) +{ + + if (stack->sp == -1) + stack_push(stack, v); + else { + stack_free_value(&stack->stack[stack->sp]); + stack->stack[stack->sp] = *v; + stack->stack[stack->sp].array = v->array == NULL ? + NULL : array_dup(v->array); + } +} + +struct value * +stack_pop(struct stack *stack) +{ + + if (stack_empty(stack)) + return (NULL); + return &stack->stack[stack->sp--]; +} + +struct number * +stack_popnumber(struct stack *stack) +{ + + if (stack_empty(stack)) + return (NULL); + if (stack->stack[stack->sp].array != NULL) { + array_free(stack->stack[stack->sp].array); + stack->stack[stack->sp].array = NULL; + } + if (stack->stack[stack->sp].type != BCODE_NUMBER) { + warnx("not a number"); /* XXX remove */ + return (NULL); + } + return stack->stack[stack->sp--].u.num; +} + +char * +stack_popstring(struct stack *stack) +{ + + if (stack_empty(stack)) + return (NULL); + if (stack->stack[stack->sp].array != NULL) { + array_free(stack->stack[stack->sp].array); + stack->stack[stack->sp].array = NULL; + } + if (stack->stack[stack->sp].type != BCODE_STRING) { + warnx("not a string"); /* XXX remove */ + return (NULL); + } + return stack->stack[stack->sp--].u.string; +} + +void +stack_clear(struct stack *stack) +{ + + while (stack->sp >= 0) { + stack_free_value(&stack->stack[stack->sp--]); + } + free(stack->stack); + stack_init(stack); +} + +void +stack_print(FILE *f, const struct stack *stack, const char *prefix, u_int base) +{ + ssize_t i; + + for (i = stack->sp; i >= 0; i--) { + print_value(f, &stack->stack[i], prefix, base); + putc('\n', f); + } +} + + +static struct array * +array_new(void) +{ + struct array *a; + + a = bmalloc(sizeof(*a)); + a->data = NULL; + a->size = 0; + return a; +} + +static __inline void +array_free(struct array *a) +{ + size_t i; + + if (a == NULL) + return; + for (i = 0; i < a->size; i++) + stack_free_value(&a->data[i]); + free(a->data); + free(a); +} + +static struct array * +array_dup(const struct array *a) +{ + struct array *n; + size_t i; + + if (a == NULL) + return (NULL); + n = array_new(); + array_grow(n, a->size); + for (i = 0; i < a->size; i++) + stack_dup_value(&a->data[i], &n->data[i]); + return (n); +} + +static __inline void +array_grow(struct array *array, size_t newsize) +{ + size_t i; + + array->data = brealloc(array->data, newsize * sizeof(*array->data)); + for (i = array->size; i < newsize; i++) { + array->data[i].type = BCODE_NONE; + array->data[i].array = NULL; + } + array->size = newsize; +} + +static __inline void +array_assign(struct array *array, size_t i, const struct value *v) +{ + + if (i >= array->size) + array_grow(array, i + 1); + stack_free_value(&array->data[i]); + array->data[i] = *v; +} + +static __inline struct value * +array_retrieve(const struct array *array, size_t i) +{ + + if (i >= array->size) + return (NULL); + return &array->data[i]; +} + +void +frame_assign(struct stack *stack, size_t i, const struct value *v) +{ + struct array *a; + struct value n; + + if (stack->sp == -1) { + n.type = BCODE_NONE; + n.array = NULL; + stack_push(stack, &n); + } + + a = stack->stack[stack->sp].array; + if (a == NULL) + a = stack->stack[stack->sp].array = array_new(); + array_assign(a, i, v); +} + +struct value * +frame_retrieve(const struct stack *stack, size_t i) +{ + struct array *a; + + if (stack->sp == -1) + return (NULL); + a = stack->stack[stack->sp].array; + if (a == NULL) + a = stack->stack[stack->sp].array = array_new(); + return array_retrieve(a, i); +} diff --git a/usr.bin/dig/Makefile b/usr.bin/dig/Makefile index 585e3794b193..ec11dc483520 100644 --- a/usr.bin/dig/Makefile +++ b/usr.bin/dig/Makefile @@ -20,6 +20,8 @@ CFLAGS+= -DWITH_IDN -I/usr/local/include CFLAGS+= -L/usr/local/lib -lidnkit -R/usr/local/lib -liconv .endif +WARNS?= 1 + DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} diff --git a/usr.bin/du/Makefile b/usr.bin/du/Makefile index 12e80b9da3d1..f614866da6de 100644 --- a/usr.bin/du/Makefile +++ b/usr.bin/du/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= du -WARNS?= 6 DPADD= ${LIBUTIL} LDADD= -lutil diff --git a/usr.bin/ee/Makefile b/usr.bin/ee/Makefile index 43f043221a0d..ffa47b93239b 100644 --- a/usr.bin/ee/Makefile +++ b/usr.bin/ee/Makefile @@ -14,7 +14,7 @@ LDADD= -lncurses WARNS?= 2 NLS= en_US.US-ASCII fr_FR.ISO8859-1 de_DE.ISO8859-1 pl_PL.ISO8859-2 \ - uk_UA.KOI8-U ru_RU.KOI8-R hu_HU.ISO8859-2 + uk_UA.KOI8-U pt_BR.ISO8859-1 ru_RU.KOI8-R hu_HU.ISO8859-2 NLSLINKS_en_US.US-ASCII= en_US.ISO8859-1 en_US.ISO8859-15 NLSLINKS_fr_FR.ISO8859-1= fr_BE.ISO8859-1 fr_BE.ISO8859-15 \ @@ -22,6 +22,7 @@ NLSLINKS_fr_FR.ISO8859-1= fr_BE.ISO8859-1 fr_BE.ISO8859-15 \ fr_FR.ISO8859-15 NLSLINKS_de_DE.ISO8859-1= de_AT.ISO8859-1 de_AT.ISO8859-15 de_CH.ISO8859-1 \ de_CH.ISO8859-15 de_DE.ISO8859-15 +NLSLINKS_pt_BR.ISO8859-1= pt_PT.ISO8859-1 NLSSRCFILES=ee.msg .for lang in ${NLS} diff --git a/usr.bin/ee/nls/pt_BR.ISO8859-1/ee.msg b/usr.bin/ee/nls/pt_BR.ISO8859-1/ee.msg new file mode 100644 index 000000000000..592ea171bc52 --- /dev/null +++ b/usr.bin/ee/nls/pt_BR.ISO8859-1/ee.msg @@ -0,0 +1,186 @@ +$ This file contains the messages for ee ("easy editor"). See the file +$ ee.i18n.guide for more information +$ +$ For ee patchlevel 3 +$ +$ $Header: /home/hugh/sources/old_ae/RCS/ee.msg,v 1.8 1996/11/30 03:23:40 hugh Exp $ +$ $FreeBSD$ +$ +$ +$set 1 +$quote " +1 "modo menu" +2 "tabs para espaços " +3 "busca com case sensitive " +4 "observar margens " +5 "formatação de auto-parágrafo" +6 "caracteres de oito bits " +7 "informação da janela " +8 "margem direita " +9 "deixar o menu" +10 "salvar mudanças" +11 "sem salvar" +12 "menu arquivo" +13 "ler um arquivo" +14 "escrever uma arquivo" +15 "salvar arquivo" +16 "editar conteúdo de impressão" +17 "menu localizar" +18 "localizar por ..." +19 "localizar" +20 "menu dicionário" +21 "usar 'spell'" +22 "usar 'ispell'" +23 "menu diversos" +24 "formatação de parágrafo" +25 "comando shell" +26 "checar dicionário" +27 "menu principal" +28 "deixar editor" +29 "ajuda" +30 "operações com arquivos" +31 "redesenhar tela" +32 "configurações" +33 "localizar" +34 "diversos" +35 "Teclas de controle: " +36 "^a código ascii ^i tab ^r direita " +37 "^b botão de texto ^j nova linha ^t início do texto " +38 "^c comando ^k deletar caracter ^u para acima " +39 "^d para baixo ^l esquerda ^v restaurar palavra " +40 "^e localizar prompt ^m nova linha ^w deletar palavra " +41 "^f restaurar caracter ^n próxima página ^x localizar " +42 "^g início da linha ^o fim da linha ^y deletar linha " +43 "^h backspace ^p página anterior ^z restaurar linha " +44 "^[ (escape) menu " +45 " " +46 "Comandos: " +47 "help : obter esta informação file : imprimir nome do arquivo " +48 "read : ler um arquivo char : código ascii de caracter " +49 "write : escrever a arquivo case : localizar com case sensitive " +50 "exit : salva e sair nocase : localizar sem case insensitive " +51 "quit : sair, sem salvar !cmd : executar \"cmd\" no shell " +52 "line : visualizar linhas # 0-9 : ir para linha \"#\" " +53 "expand : expandir tabs noexpand: não expande tabs " +54 " " +55 " ee [+#] [-i] [-e] [-h] [arquivos(s)] " +56 "+# :ir para linha # -i :sem informação da janela -e : não expandir tabs -h :sem destaque " +57 "^[ (escape) menu ^e prompt localizar ^y deletar linha ^u para cima ^p página anterior " +58 "^a código ascii ^x localizar ^z restaurar linha ^d para baixo ^n próxima página " +59 "^b botão de texto ^g início da linha ^w deletar palavra ^l esquerda " +60 "^t início do texto ^o fim da linha ^v restaurar palavra ^r direita " +61 "^c comando ^k deletar caracter ^f restaurar caracter " +62 "help : obter ajuda |file : imprimir nome do arquivo |line : imprimir linha # " +63 "read : ler um arquivo |char : código ascii de caracter |0-9 : ir para linha \"#\"" +64 "write: escrever um arquivo |case : localizar com case sensitive |exit : salvar e sair " +65 "!cmd : shell \"cmd\" |nocase: ignorar case na busca |quit : sair, sem salvar" +66 "expand: expandir tabs |noexpand: não expandir tabs " +67 " pressione Escape (^[) para menu" +68 "sem arquivo" +69 "código ascii: " +70 "enviar conteúdo do buffer para \"%s\" " +71 "comando: " +72 "nome do arquivo para escrever: " +73 "nome do arquivo para leitura: " +74 "caracter = %d" +75 "comando desconhecido \"%s\"" +76 "mais de um comando digitado" +77 "linha %d " +78 "comprimento = %d" +79 "arquivo atual \"%s\" " +80 "uso: %s [-i] [-e] [-h] [+número_da_linha] [arquivo(s)]\n" +81 " -i desligar informações da janela\n" +82 " -e não converter tabs para espaços\n" +83 " -h não usar destaque\n" +84 "arquivo \"%s\" é um diretório" +85 "novo arquivo \"%s\"" +86 "não posso abrir \"%s\"" +87 "arquivos \"%s\", %d linhas" +88 "finalizar leitura de arquivo \"%s\"" +89 "lendo arquivo \"%s\"" +90 ", somente leitura" +91 "arquivo \"%s\", %d linhas" +92 "digite o nome do arquivo: " +93 "nenhum arquivo digitado: arquivo não foi salvo" +94 "Foram feitas alterações, você tem certeza? (y/n [n]) " +95 "y" +96 "arquivo já existe, sobrescrever? (y/n) [n] " +97 "impossível criar arquivo \"%s\"" +98 "escrevendo arquivo \"%s\"" +99 "\"%s\" %d linhas, %d caracteres" +100 " ...localizando" +101 "string \"%s\" não encontrada" +102 "localizar por: " +103 "execução não permitida %s\n" +104 "pressione enter para continuar " +105 "pressione Esc para cancelar" +106 "menu muito grande para a janela" +107 "pressione qualquer tecla para continuar " +108 "comando shell: " +109 "...formatando parágrafo..." +110 " diff --git a/usr.bin/elf2aout/elf2aout.1 b/usr.bin/elf2aout/elf2aout.1 index 7b153e9b2432..0f4be221348d 100644 --- a/usr.bin/elf2aout/elf2aout.1 +++ b/usr.bin/elf2aout/elf2aout.1 @@ -32,7 +32,7 @@ .Nd "Convert ELF binary to a.out format" .Sh SYNOPSIS .Nm -.Op Fl o outfile +.Op Fl o Ar outfile .Ar infile .Sh DESCRIPTION The diff --git a/usr.bin/elf2aout/elf2aout.c b/usr.bin/elf2aout/elf2aout.c index 4168f4e60560..7e1ece66deed 100644 --- a/usr.bin/elf2aout/elf2aout.c +++ b/usr.bin/elf2aout/elf2aout.c @@ -35,6 +35,8 @@ __FBSDID("$FreeBSD$"); #include #include +#include +#include #include #include @@ -155,5 +157,6 @@ static void usage(void) { - errx(1, "usage: elf2aout [-o outfile] infile"); + fprintf(stderr, "usage: elf2aout [-o outfile] infile\n"); + exit(1); } diff --git a/usr.bin/elfdump/Makefile b/usr.bin/elfdump/Makefile index 95ce514b3ace..22e1ca94be0c 100644 --- a/usr.bin/elfdump/Makefile +++ b/usr.bin/elfdump/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= elfdump -WARNS?= 5 .include diff --git a/usr.bin/elfdump/elfdump.1 b/usr.bin/elfdump/elfdump.1 index 1902e41820c8..5818297d82e8 100644 --- a/usr.bin/elfdump/elfdump.1 +++ b/usr.bin/elfdump/elfdump.1 @@ -89,7 +89,7 @@ command: .Rs .%A "AT&T Unix Systems Labs" .%T "System V Application Binary Interface" -.%O http://www.sco.com/developers/gabi/ +.%U http://www.sco.com/developers/gabi/ .Re .Sh HISTORY The diff --git a/usr.bin/env/Makefile b/usr.bin/env/Makefile index bc1eea49153a..89ab59472630 100644 --- a/usr.bin/env/Makefile +++ b/usr.bin/env/Makefile @@ -3,6 +3,5 @@ PROG= env SRCS= env.c envopts.c -WARNS?= 6 .include diff --git a/usr.bin/fetch/Makefile b/usr.bin/fetch/Makefile index c422af8afb21..6f0db80ca4d7 100644 --- a/usr.bin/fetch/Makefile +++ b/usr.bin/fetch/Makefile @@ -4,9 +4,8 @@ PROG= fetch CSTD?= c99 -WARNS?= 6 -DPADD= ${LIBFETCH} -LDADD= -lfetch +DPADD= ${LIBFETCH} ${LIBMD} +LDADD= -lfetch -lmd .if ${MK_OPENSSL} != "no" DPADD+= ${LIBSSL} ${LIBCRYPTO} LDADD+= -lssl -lcrypto diff --git a/usr.bin/fetch/fetch.c b/usr.bin/fetch/fetch.c index 2512a2e8632c..7553bd8d1028 100644 --- a/usr.bin/fetch/fetch.c +++ b/usr.bin/fetch/fetch.c @@ -340,6 +340,11 @@ fetch(char *URL, const char *path) fetchDebug = 1; /* parse URL */ + url = NULL; + if (*URL == '\0') { + warnx("empty URL"); + goto failure; + } if ((url = fetchParseURL(URL)) == NULL) { warnx("%s: parse error", URL); goto failure; diff --git a/usr.bin/file2c/Makefile b/usr.bin/file2c/Makefile index c3c6ddc7612d..82b7e97662ef 100644 --- a/usr.bin/file2c/Makefile +++ b/usr.bin/file2c/Makefile @@ -1,5 +1,4 @@ # $FreeBSD$ PROG= file2c -WARNS?= 6 .include diff --git a/usr.bin/find/Makefile b/usr.bin/find/Makefile index b20dc0346f55..0c7bb7044c02 100644 --- a/usr.bin/find/Makefile +++ b/usr.bin/find/Makefile @@ -4,8 +4,6 @@ PROG= find SRCS= find.c function.c ls.c main.c misc.c operator.c option.c \ getdate.y -WARNS?=6 -CFLAGS+= -DHAVE_SYS_TIMEB_H -I${.CURDIR} YFLAGS= .include diff --git a/usr.bin/find/extern.h b/usr.bin/find/extern.h index 716c1f57be14..cc6143cb6d99 100644 --- a/usr.bin/find/extern.h +++ b/usr.bin/find/extern.h @@ -43,8 +43,7 @@ PLAN *find_formplan(char **); PLAN *not_squish(PLAN *); PLAN *or_squish(PLAN *); PLAN *paren_squish(PLAN *); -struct timeb; -time_t get_date(char *, struct timeb *); +time_t get_date(char *); struct stat; void printlong(char *, char *, struct stat *); int queryuser(char **); diff --git a/usr.bin/find/function.c b/usr.bin/find/function.c index c11d24f8bab7..1714627d1fc3 100644 --- a/usr.bin/find/function.c +++ b/usr.bin/find/function.c @@ -50,7 +50,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include #include @@ -770,7 +769,7 @@ done: *argvp = argv + 1; /* Finish any pending -exec ... {} + functions. */ void -finish_execplus() +finish_execplus(void) { PLAN *p; @@ -1155,7 +1154,7 @@ c_newer(OPTION *option, char ***argvp) new = palloc(option); /* compare against what */ if (option->flags & F_TIME2_T) { - new->t_data = get_date(fn_or_tspec, (struct timeb *) 0); + new->t_data = get_date(fn_or_tspec); if (new->t_data == (time_t) -1) errx(1, "Can't parse date/time: %s", fn_or_tspec); } else { @@ -1165,6 +1164,8 @@ c_newer(OPTION *option, char ***argvp) new->t_data = sb.st_ctime; else if (option->flags & F_TIME2_A) new->t_data = sb.st_atime; + else if (option->flags & F_TIME2_B) + new->t_data = sb.st_birthtime; else new->t_data = sb.st_mtime; } diff --git a/usr.bin/find/getdate.y b/usr.bin/find/getdate.y index de7750c88ff5..81a9c47735e5 100644 --- a/usr.bin/find/getdate.y +++ b/usr.bin/find/getdate.y @@ -28,7 +28,6 @@ __FBSDID("$FreeBSD$"); #else /* defined(vms) */ # include # include -# include #endif /* !defined(vms) */ #if defined (__STDC__) || defined (USG) @@ -69,7 +68,7 @@ static int yyparse(void); static int yylex(void); static int yyerror(const char *); -time_t get_date(char *, struct timeb *); +time_t get_date(char *); #define EPOCH 1970 #define HOUR(x) ((time_t)(x) * 60) @@ -849,58 +848,50 @@ difftm (struct tm *a, struct tm *b) } time_t -get_date(char *p, struct timeb *now) +get_date(char *p) { - struct tm *tm, gmt; - struct timeb ftz; + struct tm *tm, *gmt_ptr, gmt; + int tzoff; time_t Start; time_t tod; time_t nowtime; bzero (&gmt, sizeof(struct tm)); yyInput = p; - if (now == NULL) { - struct tm *gmt_ptr; - now = &ftz; - (void)time (&nowtime); + (void)time (&nowtime); - gmt_ptr = gmtime (&nowtime); - if (gmt_ptr != NULL) - { - /* Make a copy, in case localtime modifies *tm (I think - that comment now applies to *gmt_ptr, but I am too - lazy to dig into how gmtime and locatime allocate the - structures they return pointers to). */ - gmt = *gmt_ptr; - } - - if (! (tm = localtime (&nowtime))) - return -1; - - if (gmt_ptr != NULL) - ftz.timezone = difftm (&gmt, tm) / 60; - else - /* We are on a system like VMS, where the system clock is - in local time and the system has no concept of timezones. - Hopefully we can fake this out (for the case in which the - user specifies no timezone) by just saying the timezone - is zero. */ - ftz.timezone = 0; - - if(tm->tm_isdst) - ftz.timezone += 60; - } - else + gmt_ptr = gmtime (&nowtime); + if (gmt_ptr != NULL) { - nowtime = now->time; + /* Make a copy, in case localtime modifies *tm (I think + that comment now applies to *gmt_ptr, but I am too + lazy to dig into how gmtime and locatime allocate the + structures they return pointers to). */ + gmt = *gmt_ptr; } + if (! (tm = localtime (&nowtime))) + return -1; + + if (gmt_ptr != NULL) + tzoff = difftm (&gmt, tm) / 60; + else + /* We are on a system like VMS, where the system clock is + in local time and the system has no concept of timezones. + Hopefully we can fake this out (for the case in which the + user specifies no timezone) by just saying the timezone + is zero. */ + tzoff = 0; + + if(tm->tm_isdst) + tzoff += 60; + tm = localtime(&nowtime); yyYear = tm->tm_year + 1900; yyMonth = tm->tm_mon + 1; yyDay = tm->tm_mday; - yyTimezone = now->timezone; + yyTimezone = tzoff; yyDSTmode = DSTmaybe; yyHour = 0; yyMinutes = 0; @@ -956,7 +947,7 @@ main(int ac, char *av[]) (void)printf("Enter date, or blank line to exit.\n\t> "); (void)fflush(stdout); while (gets(buff) && buff[0]) { - d = get_date(buff, (struct timeb *)NULL); + d = get_date(buff); if (d == -1) (void)printf("Bad format - couldn't convert.\n"); else diff --git a/usr.bin/finger/Makefile b/usr.bin/finger/Makefile index 983392b7a1e0..30e04dfed68e 100644 --- a/usr.bin/finger/Makefile +++ b/usr.bin/finger/Makefile @@ -5,4 +5,6 @@ PROG= finger SRCS= finger.c lprint.c net.c sprint.c util.c MAN= finger.1 finger.conf.5 +WARNS?= 2 + .include diff --git a/usr.bin/finger/extern.h b/usr.bin/finger/extern.h index 498c296d0937..0014b749b34a 100644 --- a/usr.bin/finger/extern.h +++ b/usr.bin/finger/extern.h @@ -51,8 +51,8 @@ extern int invoker_root; /* Invoked by root */ void enter_lastlog(PERSON *); PERSON *enter_person(struct passwd *); -void enter_where(struct utmp *, PERSON *); -PERSON *find_person(const char *); +void enter_where(struct utmpx *, PERSON *); +PERSON *find_person(char *); int hide(struct passwd *); void lflag_print(void); int match(struct passwd *, const char *); diff --git a/usr.bin/finger/finger.1 b/usr.bin/finger/finger.1 index 590a3822adf1..c643c18c79ba 100644 --- a/usr.bin/finger/finger.1 +++ b/usr.bin/finger/finger.1 @@ -100,8 +100,7 @@ of the remote host when used in conjunction with the .Fl h option. .It Fl k -Disable all use of -.Xr utmp 5 . +Disable all use of the user accounting database. .It Fl l Produce a multi-line format displaying all of the information described for the @@ -221,10 +220,10 @@ This variable may be set with favored options to .Nm . .El .Sh FILES -.Bl -tag -width /var/log/lastlog -compact +.Bl -tag -width /var/log/utx.lastlogin -compact .It Pa /etc/finger.conf alias definition data base -.It Pa /var/log/lastlog +.It Pa /var/log/utx.lastlogin last login data base .El .Sh SEE ALSO diff --git a/usr.bin/finger/finger.c b/usr.bin/finger/finger.c index b2787520c486..ae2766f08ee2 100644 --- a/usr.bin/finger/finger.c +++ b/usr.bin/finger/finger.c @@ -83,7 +83,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include "finger.h" @@ -233,29 +233,26 @@ loginlist(void) PERSON *pn; DBT data, key; struct passwd *pw; - struct utmp user; + struct utmpx *user; int r, sflag1; - char name[UT_NAMESIZE + 1]; if (kflag) errx(1, "can't list logins without reading utmp"); - if (!freopen(_PATH_UTMP, "r", stdin)) - err(1, "%s", _PATH_UTMP); - name[UT_NAMESIZE] = '\0'; - while (fread((char *)&user, sizeof(user), 1, stdin) == 1) { - if (!user.ut_name[0]) + setutxent(); + while ((user = getutxent()) != NULL) { + if (user->ut_type != USER_PROCESS) continue; - if ((pn = find_person(user.ut_name)) == NULL) { - bcopy(user.ut_name, name, UT_NAMESIZE); - if ((pw = getpwnam(name)) == NULL) + if ((pn = find_person(user->ut_user)) == NULL) { + if ((pw = getpwnam(user->ut_user)) == NULL) continue; if (hide(pw)) continue; pn = enter_person(pw); } - enter_where(&user, pn); + enter_where(user, pn); } + endutxent(); if (db && lflag) for (sflag1 = R_FIRST;; sflag1 = R_NEXT) { PERSON *tmp; @@ -275,7 +272,7 @@ userlist(int argc, char **argv) { PERSON *pn; DBT data, key; - struct utmp user; + struct utmpx *user; struct passwd *pw; int r, sflag1, *used, *ip; char **ap, **nargv, **np, **p; @@ -373,6 +370,7 @@ net: for (p = nargv; *p;) { printf("\n"); } + free(used); if (entries == 0) return; @@ -383,15 +381,15 @@ net: for (p = nargv; *p;) { * Scan thru the list of users currently logged in, saving * appropriate data whenever a match occurs. */ - if (!freopen(_PATH_UTMP, "r", stdin)) - err(1, "%s", _PATH_UTMP); - while (fread((char *)&user, sizeof(user), 1, stdin) == 1) { - if (!user.ut_name[0]) + setutxent(); + while ((user = getutxent()) != NULL) { + if (user->ut_type != USER_PROCESS) continue; - if ((pn = find_person(user.ut_name)) == NULL) + if ((pn = find_person(user->ut_user)) == NULL) continue; - enter_where(&user, pn); + enter_where(user, pn); } + endutxent(); if (db) for (sflag1 = R_FIRST;; sflag1 = R_NEXT) { PERSON *tmp; diff --git a/usr.bin/finger/finger.h b/usr.bin/finger/finger.h index 6b18146d4b50..72a5554ee463 100644 --- a/usr.bin/finger/finger.h +++ b/usr.bin/finger/finger.h @@ -62,8 +62,8 @@ typedef struct where { short writable; /* tty is writable */ time_t loginat; /* time of (last) login */ time_t idletime; /* how long idle (if logged in) */ - char tty[UT_LINESIZE+1]; /* null terminated tty line */ - char host[UT_HOSTSIZE+1]; /* null terminated remote host name */ + char tty[sizeof ((struct utmpx *)0)->ut_line]; /* tty line */ + char host[sizeof ((struct utmpx *)0)->ut_host]; /* host name */ } WHERE; #define UNPRIV_NAME "nobody" /* Preferred privilege level */ diff --git a/usr.bin/finger/lprint.c b/usr.bin/finger/lprint.c index 848bbeeeb324..628aab6fbd5f 100644 --- a/usr.bin/finger/lprint.c +++ b/usr.bin/finger/lprint.c @@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include "finger.h" #include "pathnames.h" diff --git a/usr.bin/finger/net.c b/usr.bin/finger/net.c index 5260a2d6ca29..14a69c98cc39 100644 --- a/usr.bin/finger/net.c +++ b/usr.bin/finger/net.c @@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include "finger.h" static void cleanup(int sig); diff --git a/usr.bin/finger/sprint.c b/usr.bin/finger/sprint.c index e4f768b30000..d4091a8cbfba 100644 --- a/usr.bin/finger/sprint.c +++ b/usr.bin/finger/sprint.c @@ -43,6 +43,7 @@ static char sccsid[] = "@(#)sprint.c 8.3 (Berkeley) 4/28/95"; #include __FBSDID("$FreeBSD$"); +#include #include #include #include @@ -52,7 +53,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include "finger.h" static void stimeprint(WHERE *); @@ -88,7 +89,7 @@ sflag_print(void) */ #define MAXREALNAME 16 #define MAXHOSTNAME 17 /* in reality, hosts are never longer than 16 */ - (void)printf("%-*s %-*s%s %s\n", UT_NAMESIZE, "Login", MAXREALNAME, + (void)printf("%-*s %-*s%s %s\n", MAXLOGNAME, "Login", MAXREALNAME, "Name", " TTY Idle Login Time ", (gflag) ? "" : oflag ? "Office Phone" : "Where"); @@ -105,7 +106,7 @@ sflag_print(void) namelen = MAXREALNAME; if (w->info == LOGGEDIN && !w->writable) --namelen; /* leave space before `*' */ - (void)printf("%-*.*s %-*.*s", UT_NAMESIZE, UT_NAMESIZE, + (void)printf("%-*.*s %-*.*s", MAXLOGNAME, MAXLOGNAME, pn->name, MAXREALNAME, namelen, pn->realname ? pn->realname : ""); if (!w->loginat) { diff --git a/usr.bin/finger/util.c b/usr.bin/finger/util.c index a84c711745c7..8e3812b60bee 100644 --- a/usr.bin/finger/util.c +++ b/usr.bin/finger/util.c @@ -57,7 +57,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include "finger.h" #include "pathnames.h" @@ -109,29 +109,18 @@ void enter_lastlog(PERSON *pn) { WHERE *w; - static int opened, fd; - struct lastlog ll; + struct utmpx *ut = NULL; char doit = 0; - /* some systems may not maintain lastlog, don't report errors. */ - if (!opened) { - fd = open(_PATH_LASTLOG, O_RDONLY, 0); - opened = 1; - } - if (fd == -1 || - lseek(fd, (long)pn->uid * sizeof(ll), SEEK_SET) != - (long)pn->uid * sizeof(ll) || - read(fd, (char *)&ll, sizeof(ll)) != sizeof(ll)) { - /* as if never logged in */ - ll.ll_line[0] = ll.ll_host[0] = '\0'; - ll.ll_time = 0; - } + if (setutxdb(UTXDB_LASTLOGIN, NULL) == 0) + ut = getutxuser(pn->name); if ((w = pn->whead) == NULL) doit = 1; - else if (ll.ll_time != 0) { + else if (ut != NULL && ut->ut_type == USER_PROCESS) { /* if last login is earlier than some current login */ for (; !doit && w != NULL; w = w->next) - if (w->info == LOGGEDIN && w->loginat < ll.ll_time) + if (w->info == LOGGEDIN && + w->loginat < ut->ut_tv.tv_sec) doit = 1; /* * and if it's not any of the current logins @@ -140,32 +129,29 @@ enter_lastlog(PERSON *pn) */ for (w = pn->whead; doit && w != NULL; w = w->next) if (w->info == LOGGEDIN && - strncmp(w->tty, ll.ll_line, UT_LINESIZE) == 0) + strcmp(w->tty, ut->ut_line) == 0) doit = 0; } - if (doit) { + if (ut != NULL && doit) { w = walloc(pn); w->info = LASTLOG; - bcopy(ll.ll_line, w->tty, UT_LINESIZE); - w->tty[UT_LINESIZE] = 0; - bcopy(ll.ll_host, w->host, UT_HOSTSIZE); - w->host[UT_HOSTSIZE] = 0; - w->loginat = ll.ll_time; + strcpy(w->tty, ut->ut_line); + strcpy(w->host, ut->ut_host); + w->loginat = ut->ut_tv.tv_sec; } + endutxent(); } void -enter_where(struct utmp *ut, PERSON *pn) +enter_where(struct utmpx *ut, PERSON *pn) { WHERE *w; w = walloc(pn); w->info = LOGGEDIN; - bcopy(ut->ut_line, w->tty, UT_LINESIZE); - w->tty[UT_LINESIZE] = 0; - bcopy(ut->ut_host, w->host, UT_HOSTSIZE); - w->host[UT_HOSTSIZE] = 0; - w->loginat = (time_t)ut->ut_time; + strcpy(w->tty, ut->ut_line); + strcpy(w->host, ut->ut_host); + w->loginat = ut->ut_tv.tv_sec; find_idle_and_ttywrite(w); } @@ -205,14 +191,12 @@ enter_person(struct passwd *pw) } PERSON * -find_person(const char *name) +find_person(char *name) { struct passwd *pw; - int cnt; DBT data, key; PERSON *p; - char buf[UT_NAMESIZE + 1]; if (!db) return(NULL); @@ -220,12 +204,8 @@ find_person(const char *name) if ((pw = getpwnam(name)) && hide(pw)) return(NULL); - /* Name may be only UT_NAMESIZE long and not NUL terminated. */ - for (cnt = 0; cnt < UT_NAMESIZE && *name; ++name, ++cnt) - buf[cnt] = *name; - buf[cnt] = '\0'; - key.data = buf; - key.size = cnt; + key.data = name; + key.size = strlen(name); if ((*db->get)(db, &key, &data, 0)) return (NULL); diff --git a/usr.bin/fstat/Makefile b/usr.bin/fstat/Makefile index d55fce479867..23e907b9b5c4 100644 --- a/usr.bin/fstat/Makefile +++ b/usr.bin/fstat/Makefile @@ -9,7 +9,6 @@ DPADD= ${LIBKVM} LDADD= -lkvm BINGRP= kmem BINMODE=2555 -WARNS?= 6 CFLAGS+=-D_KVM_VNODE diff --git a/usr.bin/fsync/Makefile b/usr.bin/fsync/Makefile index 42aa6ddec665..c9bc5249ee6f 100644 --- a/usr.bin/fsync/Makefile +++ b/usr.bin/fsync/Makefile @@ -2,5 +2,4 @@ PROG= fsync -WARNS?= 6 .include diff --git a/usr.bin/ftp/Makefile b/usr.bin/ftp/Makefile index c2fe59cd4b1f..6f42e69a3289 100644 --- a/usr.bin/ftp/Makefile +++ b/usr.bin/ftp/Makefile @@ -23,6 +23,8 @@ CFLAGS+= -I${.CURDIR} -I${LUKEMFTP} LDADD= -ledit -ltermcap -lutil DPADD= ${LIBEDIT} ${LIBTERMCAP} ${LIBUTIL} +WARNS?= 2 + LINKS= ${BINDIR}/ftp ${BINDIR}/pftp \ ${BINDIR}/ftp ${BINDIR}/gate-ftp MLINKS= ftp.1 pftp.1 \ diff --git a/usr.bin/gcore/Makefile b/usr.bin/gcore/Makefile index 5ab51cf5c7eb..e83a48f375a4 100644 --- a/usr.bin/gcore/Makefile +++ b/usr.bin/gcore/Makefile @@ -3,5 +3,9 @@ PROG= gcore SRCS= elfcore.c gcore.c +DPADD= ${LIBUTIL} +LDADD= -lutil + +WARNS?= 1 .include diff --git a/usr.bin/gcore/elfcore.c b/usr.bin/gcore/elfcore.c index 6c90708f2cd0..73d92b455773 100644 --- a/usr.bin/gcore/elfcore.c +++ b/usr.bin/gcore/elfcore.c @@ -1,4 +1,5 @@ /*- + * Copyright (c) 2007 Sandvine Incorporated * Copyright (c) 1998 John D. Polstra * All rights reserved. * @@ -29,8 +30,12 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include +#include +#include +#include #include #include #include @@ -44,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include "extern.h" @@ -69,16 +75,15 @@ static void cb_put_phdr(vm_map_entry_t, void *); static void cb_size_segment(vm_map_entry_t, void *); static void each_writable_segment(vm_map_entry_t, segment_callback, void *closure); -static void elf_corehdr(int fd, pid_t, vm_map_entry_t, int numsegs, - void *hdr, size_t hdrsize); -static void elf_puthdr(vm_map_entry_t, void *, size_t *, - const prstatus_t *, const prfpregset_t *, const prpsinfo_t *, int numsegs); +static void elf_detach(void); /* atexit() handler. */ +static void elf_puthdr(pid_t, vm_map_entry_t, void *, size_t *, int numsegs); static void elf_putnote(void *dst, size_t *off, const char *name, int type, const void *desc, size_t descsz); static void freemap(vm_map_entry_t); -static void readhdrinfo(pid_t, prstatus_t *, prfpregset_t *, prpsinfo_t *); static vm_map_entry_t readmap(pid_t); +static pid_t g_pid; /* Pid being dumped, global for elf_detach */ + static int elf_ident(int efd, pid_t pid __unused, char *binfile __unused) { @@ -93,6 +98,14 @@ elf_ident(int efd, pid_t pid __unused, char *binfile __unused) return (0); } +static void +elf_detach(void) +{ + + if (g_pid != 0) + ptrace(PT_DETACH, g_pid, (caddr_t)1, 0); +} + /* * Write an ELF coredump for the given pid to the given fd. */ @@ -103,11 +116,20 @@ elf_coredump(int efd __unused, int fd, pid_t pid) struct sseg_closure seginfo; void *hdr; size_t hdrsize; - char memname[64]; - int memfd; Elf_Phdr *php; int i; + /* Attach to process to dump. */ + g_pid = pid; + if (atexit(elf_detach) != 0) + err(1, "atexit"); + errno = 0; + ptrace(PT_ATTACH, pid, NULL, 0); + if (errno) + err(1, "PT_ATTACH"); + if (waitpid(pid, NULL, 0) == -1) + err(1, "waitpid"); + /* Get the program's memory map. */ map = readmap(pid); @@ -122,28 +144,31 @@ elf_coredump(int efd __unused, int fd, pid_t pid) * size is calculated. */ hdrsize = 0; - elf_puthdr(map, (void *)NULL, &hdrsize, - (const prstatus_t *)NULL, (const prfpregset_t *)NULL, - (const prpsinfo_t *)NULL, seginfo.count); + elf_puthdr(pid, map, NULL, &hdrsize, seginfo.count); /* * Allocate memory for building the header, fill it up, * and write it out. */ - if ((hdr = malloc(hdrsize)) == NULL) + if ((hdr = calloc(1, hdrsize)) == NULL) errx(1, "out of memory"); - elf_corehdr(fd, pid, map, seginfo.count, hdr, hdrsize); + + /* Fill in the header. */ + hdrsize = 0; + elf_puthdr(pid, map, hdr, &hdrsize, seginfo.count); + + /* Write it to the core file. */ + if (write(fd, hdr, hdrsize) == -1) + err(1, "write"); /* Write the contents of all of the writable segments. */ - snprintf(memname, sizeof memname, "/proc/%d/mem", pid); - if ((memfd = open(memname, O_RDONLY)) == -1) - err(1, "cannot open %s", memname); - php = (Elf_Phdr *)((char *)hdr + sizeof(Elf_Ehdr)) + 1; for (i = 0; i < seginfo.count; i++) { + struct ptrace_io_desc iorequest; uintmax_t nleft = php->p_filesz; - lseek(memfd, (off_t)php->p_vaddr, SEEK_SET); + iorequest.piod_op = PIOD_READ_D; + iorequest.piod_offs = (caddr_t)php->p_vaddr; while (nleft > 0) { char buf[8*1024]; size_t nwant; @@ -153,12 +178,12 @@ elf_coredump(int efd __unused, int fd, pid_t pid) nwant = sizeof buf; else nwant = nleft; - ngot = read(memfd, buf, nwant); - if (ngot == -1) - err(1, "read from %s", memname); + iorequest.piod_addr = buf; + iorequest.piod_len = nwant; + ptrace(PT_IO, pid, (caddr_t)&iorequest, 0); + ngot = iorequest.piod_len; if ((size_t)ngot < nwant) - errx(1, "short read from %s:" - " wanted %zu, got %zd", memname, + errx(1, "short read wanted %d, got %d", nwant, ngot); ngot = write(fd, buf, nwant); if (ngot == -1) @@ -166,10 +191,10 @@ elf_coredump(int efd __unused, int fd, pid_t pid) if ((size_t)ngot != nwant) errx(1, "short write"); nleft -= nwant; + iorequest.piod_offs += ngot; } php++; } - close(memfd); free(hdr); freemap(map); } @@ -231,30 +256,25 @@ each_writable_segment(vm_map_entry_t map, segment_callback func, void *closure) (*func)(entry, closure); } -/* - * Write the core file header to the file, including padding up to - * the page boundary. - */ static void -elf_corehdr(int fd, pid_t pid, vm_map_entry_t map, int numsegs, void *hdr, - size_t hdrsize) +elf_getstatus(pid_t pid, prpsinfo_t *psinfo) { - size_t off; - prstatus_t status; - prfpregset_t fpregset; - prpsinfo_t psinfo; + struct kinfo_proc kobj; + int name[4]; + size_t len; - /* Gather the information for the header. */ - readhdrinfo(pid, &status, &fpregset, &psinfo); + name[0] = CTL_KERN; + name[1] = KERN_PROC; + name[2] = KERN_PROC_PID; + name[3] = pid; - /* Fill in the header. */ - memset(hdr, 0, hdrsize); - off = 0; - elf_puthdr(map, hdr, &off, &status, &fpregset, &psinfo, numsegs); - - /* Write it to the core file. */ - if (write(fd, hdr, hdrsize) == -1) - err(1, "write"); + len = sizeof(kobj); + if (sysctl(name, 4, &kobj, &len, NULL, 0) == -1) + err(1, "error accessing kern.proc.pid.%u sysctl", pid); + if (kobj.ki_pid != pid) + err(1, "error accessing kern.proc.pid.%u sysctl datas", pid); + strncpy(psinfo->pr_fname, kobj.ki_comm, MAXCOMLEN); + strncpy(psinfo->pr_psargs, psinfo->pr_fname, PRARGSZ); } /* @@ -262,13 +282,24 @@ elf_corehdr(int fd, pid_t pid, vm_map_entry_t map, int numsegs, void *hdr, * be NULL, in which case the header is sized but not actually generated. */ static void -elf_puthdr(vm_map_entry_t map, void *dst, size_t *off, const prstatus_t *status, - const prfpregset_t *fpregset, const prpsinfo_t *psinfo, int numsegs) +elf_puthdr(pid_t pid, vm_map_entry_t map, void *dst, size_t *off, int numsegs) { + struct { + prstatus_t status; + prfpregset_t fpregset; + prpsinfo_t psinfo; + } *tempdata; size_t ehoff; size_t phoff; size_t noteoff; size_t notesz; + size_t threads; + lwpid_t *tids; + int i; + + prstatus_t *status; + prfpregset_t *fpregset; + prpsinfo_t *psinfo; ehoff = *off; *off += sizeof(Elf_Ehdr); @@ -277,14 +308,68 @@ elf_puthdr(vm_map_entry_t map, void *dst, size_t *off, const prstatus_t *status, *off += (numsegs + 1) * sizeof(Elf_Phdr); noteoff = *off; - elf_putnote(dst, off, "FreeBSD", NT_PRSTATUS, status, - sizeof *status); - elf_putnote(dst, off, "FreeBSD", NT_FPREGSET, fpregset, - sizeof *fpregset); + + if (dst != NULL) { + if ((tempdata = calloc(1, sizeof(*tempdata))) == NULL) + errx(1, "out of memory"); + status = &tempdata->status; + fpregset = &tempdata->fpregset; + psinfo = &tempdata->psinfo; + } else { + tempdata = NULL; + status = NULL; + fpregset = NULL; + psinfo = NULL; + } + + errno = 0; + threads = ptrace(PT_GETNUMLWPS, pid, NULL, 0); + if (errno) + err(1, "PT_GETNUMLWPS"); + + if (dst != NULL) { + psinfo->pr_version = PRPSINFO_VERSION; + psinfo->pr_psinfosz = sizeof(prpsinfo_t); + elf_getstatus(pid, psinfo); + + } elf_putnote(dst, off, "FreeBSD", NT_PRPSINFO, psinfo, sizeof *psinfo); + + if (dst != NULL) { + tids = malloc(threads * sizeof(*tids)); + if (tids == NULL) + errx(1, "out of memory"); + errno = 0; + ptrace(PT_GETLWPLIST, pid, (void *)tids, threads); + if (errno) + err(1, "PT_GETLWPLIST"); + } + for (i = 0; i < threads; ++i) { + if (dst != NULL) { + status->pr_version = PRSTATUS_VERSION; + status->pr_statussz = sizeof(prstatus_t); + status->pr_gregsetsz = sizeof(gregset_t); + status->pr_fpregsetsz = sizeof(fpregset_t); + status->pr_osreldate = __FreeBSD_version; + status->pr_pid = tids[i]; + + ptrace(PT_GETREGS, tids[i], (void *)&status->pr_reg, 0); + ptrace(PT_GETFPREGS, tids[i], (void *)fpregset, 0); + } + elf_putnote(dst, off, "FreeBSD", NT_PRSTATUS, status, + sizeof *status); + elf_putnote(dst, off, "FreeBSD", NT_FPREGSET, fpregset, + sizeof *fpregset); + } + notesz = *off - noteoff; + if (dst != NULL) { + free(tids); + free(tempdata); + } + /* Align up to a page boundary for the program segments. */ *off = round_page(*off); @@ -381,70 +466,7 @@ freemap(vm_map_entry_t map) } /* - * Read the process information necessary to fill in the core file's header. - */ -static void -readhdrinfo(pid_t pid, prstatus_t *status, prfpregset_t *fpregset, - prpsinfo_t *psinfo) -{ - char name[64]; - char line[256]; - int fd; - int i; - int n; - - memset(status, 0, sizeof *status); - status->pr_version = PRSTATUS_VERSION; - status->pr_statussz = sizeof(prstatus_t); - status->pr_gregsetsz = sizeof(gregset_t); - status->pr_fpregsetsz = sizeof(fpregset_t); - status->pr_osreldate = __FreeBSD_version; - status->pr_pid = pid; - - memset(fpregset, 0, sizeof *fpregset); - - memset(psinfo, 0, sizeof *psinfo); - psinfo->pr_version = PRPSINFO_VERSION; - psinfo->pr_psinfosz = sizeof(prpsinfo_t); - - /* Read the general registers. */ - snprintf(name, sizeof name, "/proc/%d/regs", pid); - if ((fd = open(name, O_RDONLY)) == -1) - err(1, "cannot open %s", name); - if ((n = read(fd, &status->pr_reg, sizeof status->pr_reg)) == -1) - err(1, "read error from %s", name); - if ((size_t)n < sizeof(status->pr_reg)) - errx(1, "short read from %s: wanted %zu, got %d", name, - sizeof status->pr_reg, n); - close(fd); - - /* Read the floating point registers. */ - snprintf(name, sizeof name, "/proc/%d/fpregs", pid); - if ((fd = open(name, O_RDONLY)) == -1) - err(1, "cannot open %s", name); - if ((n = read(fd, fpregset, sizeof *fpregset)) == -1) - err(1, "read error from %s", name); - if ((size_t)n < sizeof(*fpregset)) - errx(1, "short read from %s: wanted %zu, got %d", name, - sizeof *fpregset, n); - close(fd); - - /* Read and parse the process status. */ - snprintf(name, sizeof name, "/proc/%d/status", pid); - if ((fd = open(name, O_RDONLY)) == -1) - err(1, "cannot open %s", name); - if ((n = read(fd, line, sizeof line - 1)) == -1) - err(1, "read error from %s", name); - if (n > MAXCOMLEN) - n = MAXCOMLEN; - for (i = 0; i < n && line[i] != ' '; i++) - psinfo->pr_fname[i] = line[i]; - strncpy(psinfo->pr_psargs, psinfo->pr_fname, PRARGSZ); - close(fd); -} - -/* - * Read the process's memory map using procfs, and return a list of + * Read the process's memory map using kinfo_getvmmap(), and return a list of * VM map entries. Only the non-device read/writable segments are * returned. The map entries in the list aren't fully filled in; only * the items we need are present. @@ -452,83 +474,44 @@ readhdrinfo(pid_t pid, prstatus_t *status, prfpregset_t *fpregset, static vm_map_entry_t readmap(pid_t pid) { - char mapname[64]; - int mapfd; - ssize_t mapsize; - size_t bufsize; - char *mapbuf; - int pos; - vm_map_entry_t map; - vm_map_entry_t *linkp; + vm_map_entry_t ent, *linkp, map; + struct kinfo_vmentry *vmentl, *kve; + int i, nitems; - snprintf(mapname, sizeof mapname, "/proc/%d/map", pid); - if ((mapfd = open(mapname, O_RDONLY)) == -1) - err(1, "cannot open %s", mapname); + vmentl = kinfo_getvmmap(pid, &nitems); + if (vmentl == NULL) + err(1, "cannot retrieve mappings for %u process", pid); - /* - * Procfs requires (for consistency) that the entire memory map - * be read with a single read() call. Start with a reasonably sized - * buffer, and double it until it is big enough. - */ - bufsize = 8 * 1024; - mapbuf = NULL; - for ( ; ; ) { - if ((mapbuf = realloc(mapbuf, bufsize + 1)) == NULL) - errx(1, "out of memory"); - mapsize = read(mapfd, mapbuf, bufsize); - if (mapsize != -1 || errno != EFBIG) - break; - bufsize *= 2; - /* This lseek shouldn't be necessary, but it is. */ - lseek(mapfd, (off_t)0, SEEK_SET); - } - if (mapsize == -1) - err(1, "read error from %s", mapname); - if (mapsize == 0) - errx(1, "empty map file %s", mapname); - mapbuf[mapsize] = 0; - close(mapfd); - - pos = 0; map = NULL; linkp = ↦ - while (pos < mapsize) { - vm_map_entry_t ent; - u_long start; - u_long end; - char prot[4]; - char type[16]; - int n; - int len; + for (i = 0; i < nitems; i++) { + kve = &vmentl[i]; - len = 0; - n = sscanf(mapbuf + pos, "%lx %lx %*d %*d %*x %3[-rwx]" - " %*d %*d %*x %*s %*s %16s %*s%*[\n]%n", - &start, &end, prot, type, &len); - if (n != 4 || len == 0) - errx(1, "ill-formed line in %s starting at character %d", mapname, pos + 1); - pos += len; - - /* Ignore segments of the wrong kind, and unwritable ones */ - if (strncmp(prot, "rw", 2) != 0 || - (strcmp(type, "default") != 0 && - strcmp(type, "vnode") != 0 && - strcmp(type, "swap") != 0)) + /* + * Ignore segments of the wrong kind and ones which are not + * readable and writable. + */ + if ((kve->kve_protection & KVME_PROT_WRITE) == 0 || + (kve->kve_protection & KVME_PROT_READ) == 0 || + (kve->kve_type != KVME_TYPE_DEFAULT && + kve->kve_type != KVME_TYPE_VNODE && + kve->kve_type != KVME_TYPE_SWAP)) continue; - if ((ent = (vm_map_entry_t)calloc(1, sizeof *ent)) == NULL) + ent = calloc(1, sizeof(*ent)); + if (ent == NULL) errx(1, "out of memory"); - ent->start = start; - ent->end = end; + ent->start = (vm_offset_t)kve->kve_start; + ent->end = (vm_offset_t)kve->kve_end; ent->protection = VM_PROT_READ | VM_PROT_WRITE; - if (prot[2] == 'x') - ent->protection |= VM_PROT_EXECUTE; + if ((kve->kve_protection & KVME_PROT_EXEC) != 0) + ent->protection |= VM_PROT_EXECUTE; *linkp = ent; linkp = &ent->next; } - free(mapbuf); - return map; + free(vmentl); + return (map); } struct dumpers elfdump = { elf_ident, elf_coredump }; diff --git a/usr.bin/gcore/extern.h b/usr.bin/gcore/extern.h index 1bd70954794f..68e05a7835bd 100644 --- a/usr.bin/gcore/extern.h +++ b/usr.bin/gcore/extern.h @@ -38,3 +38,4 @@ struct dumpers { int (*ident)(int efd, pid_t pid, char *binfile); void (*dump)(int efd, int fd, pid_t pid); }; +extern int sflag; diff --git a/usr.bin/gcore/gcore.1 b/usr.bin/gcore/gcore.1 index 981e0be3b346..a5be26a3f4d6 100644 --- a/usr.bin/gcore/gcore.1 +++ b/usr.bin/gcore/gcore.1 @@ -32,7 +32,7 @@ .\" @(#)gcore.1 8.2 (Berkeley) 4/18/94 .\" $FreeBSD$ .\" -.Dd April 18, 1994 +.Dd November 18, 2009 .Dt GCORE 1 .Os .Sh NAME @@ -55,11 +55,6 @@ By default, the core is written to the file The process identifier, .Ar pid , must be given on the command line. -If no executable image is -specified, -.Nm -will use -.Dq Pa /proc//file . .Pp The following options are available: .Bl -tag -width indent @@ -80,8 +75,6 @@ The same effect can be achieved manually with .Bl -tag -width /var/log/messages -compact .It Pa core. the core image -.It Pa /proc//file -the executable image .El .Sh HISTORY A @@ -89,12 +82,15 @@ A utility appeared in .Bx 4.2 . .Sh BUGS -Context switches or paging activity that occur while +Because of the +.Xr ptrace 2 +usage .Nm -is running may cause the program to become confused. -For best results, use -.Fl s -to temporarily stop the target process. +may not work with processes which are actively investigated with +.Xr truss 1 +or +.Xr gdb 1 . +Additionally, interruptable sleeps may exit with EINTR. .Pp The .Nm diff --git a/usr.bin/gcore/gcore.c b/usr.bin/gcore/gcore.c index 7005e834ff91..b02a4a9390e2 100644 --- a/usr.bin/gcore/gcore.c +++ b/usr.bin/gcore/gcore.c @@ -61,19 +61,19 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include -#include #include #include #include #include #include "extern.h" +int sflag; static void killed(int); -static void restart_target(void); static void usage(void) __dead2; static pid_t pid; @@ -83,10 +83,11 @@ SET_DECLARE(dumpset, struct dumpers); int main(int argc, char *argv[]) { - int ch, efd, fd, sflag; + int ch, efd, fd, name[4]; char *binfile, *corefile; - char fname[MAXPATHLEN]; + char passpath[MAXPATHLEN], fname[MAXPATHLEN]; struct dumpers **d, *dumper; + size_t len; sflag = 0; corefile = NULL; @@ -109,9 +110,14 @@ main(int argc, char *argv[]) switch (argc) { case 1: pid = atoi(argv[0]); - asprintf(&binfile, "/proc/%d/file", pid); - if (binfile == NULL) - errx(1, "allocation failure"); + name[0] = CTL_KERN; + name[1] = KERN_PROC; + name[2] = KERN_PROC_PATHNAME; + name[3] = pid; + len = sizeof(passpath); + if (sysctl(name, 4, passpath, &len, NULL, 0) == -1) + errx(1, "kern.proc.pathname failure"); + binfile = passpath; break; case 2: pid = atoi(argv[1]); @@ -141,36 +147,28 @@ main(int argc, char *argv[]) fd = open(corefile, O_RDWR|O_CREAT|O_TRUNC, DEFFILEMODE); if (fd < 0) err(1, "%s", corefile); - if (sflag) { - signal(SIGHUP, killed); - signal(SIGINT, killed); - signal(SIGTERM, killed); - if (kill(pid, SIGSTOP) == -1) - err(1, "%d: stop signal", pid); - atexit(restart_target); - } + /* + * The semantics of the 's' flag is to stop the target process. + * Previous versions of gcore would manage this by trapping SIGHUP, + * SIGINT and SIGTERM (to be passed to the target pid), and then + * signal the child to stop. + * + * However, this messes up if the selected dumper uses ptrace calls + * that leave the child already stopped. The waitpid call in elfcore + * never returns. + * + * The best thing to do here is to externalize the 's' flag and let + * each dumper dispose of what that means, if anything. For the elfcore + * dumper, the 's' flag is a no-op since the ptrace attach stops the + * process in question already. + */ + dumper->dump(efd, fd, pid); (void)close(fd); (void)close(efd); exit(0); } -static void -killed(int sig) -{ - - restart_target(); - signal(sig, SIG_DFL); - kill(getpid(), sig); -} - -static void -restart_target(void) -{ - - kill(pid, SIGCONT); -} - void usage(void) { diff --git a/usr.bin/gencat/Makefile b/usr.bin/gencat/Makefile index a6c9991bb5b9..2cf86df59e1b 100644 --- a/usr.bin/gencat/Makefile +++ b/usr.bin/gencat/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= gencat -WARNS?= 6 .include diff --git a/usr.bin/gencat/gencat.c b/usr.bin/gencat/gencat.c index 306f48d3d7bd..2ac5828a344e 100644 --- a/usr.bin/gencat/gencat.c +++ b/usr.bin/gencat/gencat.c @@ -18,13 +18,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -94,13 +87,13 @@ __FBSDID("$FreeBSD$"); struct _msgT { long msgId; char *str; - LIST_ENTRY(_msgT) entries; + LIST_ENTRY(_msgT) entries; }; struct _setT { long setId; - LIST_HEAD(msghead, _msgT) msghead; - LIST_ENTRY(_setT) entries; + LIST_HEAD(msghead, _msgT) msghead; + LIST_ENTRY(_setT) entries; }; LIST_HEAD(sethead, _setT) sethead; @@ -130,17 +123,17 @@ void usage(void); int main(int, char **); void -usage() +usage(void) { fprintf(stderr, "usage: %s catfile msgfile ...\n", getprogname()); - exit(1); + exit(1); } int main(int argc, char **argv) { int ofd, ifd; - char *catfile = NULL; + char *catfile = NULL; int c; #define DEPRECATEDMSG 1 @@ -419,23 +412,23 @@ MCParse(int fd) cptr += 5; if (!*cptr) quote = 0; - else { + else { cptr = wskip(cptr); if (!*cptr) quote = 0; else quote = *cptr; - } + } } else if (isspace((unsigned char) *cptr)) { ; - } else { + } else { if (*cptr) { cptr = wskip(cptr); if (*cptr) warning(cptr, "unrecognized line"); } - } - } else { + } + } else { /* * First check for (and eat) empty lines.... */ @@ -453,7 +446,7 @@ MCParse(int fd) } else { warning(cptr, "neither blank line nor start of a message id"); continue; - } + } /* * If we have a message ID, but no message, * then this means "delete this message id @@ -461,12 +454,12 @@ MCParse(int fd) */ if (!*cptr) { MCDelMsg(msgid); - } else { + } else { str = getmsg(fd, cptr, quote); MCAddMsg(msgid, str); - } + } + } } - } } void @@ -686,7 +679,7 @@ MCAddSet(int setId) if (p && p->setId == setId) { ; - } else { + } else { p = xmalloc(sizeof(struct _setT)); memset(p, '\0', sizeof(struct _setT)); LIST_INIT(&p->msghead); @@ -697,8 +690,8 @@ MCAddSet(int setId) LIST_INSERT_HEAD(&sethead, p, entries); } else { LIST_INSERT_AFTER(q, p, entries); - } -} + } + } curSet = p; } @@ -718,7 +711,7 @@ MCAddMsg(int msgId, const char *str) if (msgId > NL_MSGMAX) { error("msgID exceeds limit"); /* NOTREACHED */ - } + } p = curSet->msghead.lh_first; q = NULL; @@ -739,7 +732,7 @@ MCAddMsg(int msgId, const char *str) p->msgId = msgId; p->str = xstrdup(str); - } +} void MCDelSet(int setId) @@ -756,13 +749,13 @@ MCDelSet(int setId) while (msg) { free(msg->str); LIST_REMOVE(msg, entries); - } + } LIST_REMOVE(set, entries); return; - } - warning(NULL, "specified set doesn't exist"); } + warning(NULL, "specified set doesn't exist"); +} void MCDelMsg(int msgId) @@ -779,6 +772,6 @@ MCDelMsg(int msgId) free(msg->str); LIST_REMOVE(msg, entries); return; - } + } warning(NULL, "specified msg doesn't exist"); } diff --git a/usr.bin/getent/Makefile b/usr.bin/getent/Makefile index 6cc3d56cfd1e..85bc1b1ec71b 100644 --- a/usr.bin/getent/Makefile +++ b/usr.bin/getent/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= getent -WARNS?= 3 .include diff --git a/usr.bin/getent/getent.1 b/usr.bin/getent/getent.1 index a18d3411d67d..a14bdfaabd67 100644 --- a/usr.bin/getent/getent.1 +++ b/usr.bin/getent/getent.1 @@ -14,13 +14,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -75,6 +68,7 @@ argument may be one of: .It Li rpc Ta name number [alias ...] .It Li services Ta name port/protocol [alias ...] .It Li shells Ta /path/to/shell +.It Li utmpx Ta [time] type: properties .El .Pp If one or more @@ -109,6 +103,7 @@ utility exits 0 on success, or 3 if there is no support for enumeration on .Ar database . .Sh SEE ALSO +.Xr getutxent 3 , .Xr ethers 5 , .Xr group 5 , .Xr hosts 5 , diff --git a/usr.bin/getent/getent.c b/usr.bin/getent/getent.c index d7558135b6f2..e958665d8fdf 100644 --- a/usr.bin/getent/getent.c +++ b/usr.bin/getent/getent.c @@ -15,13 +15,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -55,11 +48,13 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include +#include +#include #include #include #include +#include static int usage(void); static int parsenum(const char *, unsigned long *); @@ -72,6 +67,7 @@ static int protocols(int, char *[]); static int rpc(int, char *[]); static int services(int, char *[]); static int shells(int, char *[]); +static int utmpx(int, char *[]); enum { RV_OK = 0, @@ -93,6 +89,7 @@ static struct getentdb { { "rpc", rpc, }, { "services", services, }, { "shells", shells, }, + { "utmpx", utmpx, }, { NULL, NULL, }, }; @@ -562,3 +559,91 @@ shells(int argc, char *argv[]) endusershell(); return rv; } + +/* + * utmpx + */ + +#define UTMPXPRINTID do { \ + size_t i; \ + for (i = 0; i < sizeof ut->ut_id; i++) \ + printf("%02hhx", ut->ut_id[i]); \ +} while (0) + +static void +utmpxprint(const struct utmpx *ut) +{ + + if (ut->ut_type == EMPTY) + return; + + printf("[%jd.%06u -- %.24s] ", + (intmax_t)ut->ut_tv.tv_sec, (unsigned int)ut->ut_tv.tv_usec, + ctime(&ut->ut_tv.tv_sec)); + + switch (ut->ut_type) { + case BOOT_TIME: + printf("system boot\n"); + return; + case SHUTDOWN_TIME: + printf("system shutdown\n"); + return; + case OLD_TIME: + printf("old system time\n"); + return; + case NEW_TIME: + printf("new system time\n"); + return; + case USER_PROCESS: + printf("user process: id=\""); + UTMPXPRINTID; + printf("\" pid=\"%d\" user=\"%s\" line=\"%s\" host=\"%s\"\n", + ut->ut_pid, ut->ut_user, ut->ut_line, ut->ut_host); + break; + case DEAD_PROCESS: + printf("dead process: id=\""); + UTMPXPRINTID; + printf("\" pid=\"%d\"\n", ut->ut_pid); + break; + default: + printf("unknown record type\n"); + break; + } +} + +static int +utmpx(int argc, char *argv[]) +{ + const struct utmpx *ut; + int rv = RV_OK, db; + + assert(argc > 1); + assert(argv != NULL); + + if (argc == 2) { + db = UTXDB_ACTIVE; + } else if (argc == 3) { + if (strcmp(argv[2], "active") == 0) + db = UTXDB_ACTIVE; + else if (strcmp(argv[2], "lastlogin") == 0) + db = UTXDB_LASTLOGIN; + else if (strcmp(argv[2], "log") == 0) + db = UTXDB_LOG; + else + rv = RV_USAGE; + } else { + rv = RV_USAGE; + } + + if (rv == RV_USAGE) { + fprintf(stderr, "Usage: %s utmpx [active | lastlogin | log]\n", + getprogname()); + } else if (rv == RV_OK) { + if (setutxdb(db, NULL) != 0) + return (RV_NOTFOUND); + while ((ut = getutxent()) != NULL) + utmpxprint(ut); + endutxent(); + } + return (rv); +} diff --git a/usr.bin/gprof/Makefile b/usr.bin/gprof/Makefile index a24d9cda6c81..506232597a42 100644 --- a/usr.bin/gprof/Makefile +++ b/usr.bin/gprof/Makefile @@ -7,4 +7,6 @@ SRCS= gprof.c aout.c arcs.c dfn.c elf.c lookup.c hertz.c \ FILES= gprof.flat gprof.callg FILESDIR= ${SHAREDIR}/misc +WARNS?= 1 + .include diff --git a/usr.bin/gprof/aout.c b/usr.bin/gprof/aout.c index 2ccf818f42e0..9103148997de 100644 --- a/usr.bin/gprof/aout.c +++ b/usr.bin/gprof/aout.c @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include "gprof.h" diff --git a/usr.bin/gzip/Makefile b/usr.bin/gzip/Makefile index dae5f842a32e..048033738756 100644 --- a/usr.bin/gzip/Makefile +++ b/usr.bin/gzip/Makefile @@ -8,7 +8,6 @@ MAN= gzip.1 gzexe.1 zdiff.1 zforce.1 zmore.1 znew.1 DPADD= ${LIBZ} LDADD= -lz -WARNS?= 6 .if ${MK_BZIP2_SUPPORT} != "no" DPADD+= ${LIBBZ2} diff --git a/usr.bin/gzip/unbzip2.c b/usr.bin/gzip/unbzip2.c index e8990d7b984f..c744e564ef18 100644 --- a/usr.bin/gzip/unbzip2.c +++ b/usr.bin/gzip/unbzip2.c @@ -1,4 +1,4 @@ -/* $NetBSD: unbzip2.c,v 1.11 2008/04/28 20:24:13 martin Exp $ */ +/* $NetBSD: unbzip2.c,v 1.12 2009/10/11 05:17:20 mrg Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ static off_t unbzip2(int in, int out, char *pre, size_t prelen, off_t *bytes_in) { - int ret, end_of_file; + int ret, end_of_file, cold = 0; off_t bytes_out = 0; bz_stream bzs; static char *inbuf, *outbuf; @@ -64,7 +64,7 @@ unbzip2(int in, int out, char *pre, size_t prelen, off_t *bytes_in) if (bytes_in) *bytes_in = prelen; - while (ret >= BZ_OK && ret != BZ_STREAM_END) { + while (ret == BZ_OK) { if (bzs.avail_in == 0 && !end_of_file) { ssize_t n; @@ -86,9 +86,19 @@ unbzip2(int in, int out, char *pre, size_t prelen, off_t *bytes_in) switch (ret) { case BZ_STREAM_END: case BZ_OK: - if (ret == BZ_OK && end_of_file) - maybe_err("read"); - if (!tflag) { + if (ret == BZ_OK && end_of_file) { + /* + * If we hit this after a stream end, consider + * it as the end of the whole file and don't + * bail out. + */ + if (cold == 1) + ret = BZ_STREAM_END; + else + maybe_errx("truncated file"); + } + cold = 0; + if (!tflag && bzs.avail_out != BUFLEN) { ssize_t n; n = write(out, outbuf, BUFLEN - bzs.avail_out); @@ -96,7 +106,14 @@ unbzip2(int in, int out, char *pre, size_t prelen, off_t *bytes_in) maybe_err("write"); bytes_out += n; } - break; + if (ret == BZ_STREAM_END && !end_of_file) { + if (BZ2_bzDecompressEnd(&bzs) != BZ_OK || + BZ2_bzDecompressInit(&bzs, 0, 0) != BZ_OK) + maybe_errx("bzip2 re-init"); + cold = 1; + ret = BZ_OK; + } + break; case BZ_DATA_ERROR: maybe_warnx("bzip2 data integrity error"); @@ -109,7 +126,10 @@ unbzip2(int in, int out, char *pre, size_t prelen, off_t *bytes_in) case BZ_MEM_ERROR: maybe_warnx("bzip2 out of memory"); break; - + + default: + maybe_warnx("unknown bzip2 error: %d", ret); + break; } } diff --git a/usr.bin/head/Makefile b/usr.bin/head/Makefile index 002b3f385b3e..60b0a2f33ce6 100644 --- a/usr.bin/head/Makefile +++ b/usr.bin/head/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= head -WARNS= 6 .include diff --git a/usr.bin/hexdump/Makefile b/usr.bin/hexdump/Makefile index 3252fc9af147..4cd3cc5dc62f 100644 --- a/usr.bin/hexdump/Makefile +++ b/usr.bin/hexdump/Makefile @@ -7,6 +7,5 @@ MAN= hexdump.1 od.1 MLINKS= hexdump.1 hd.1 LINKS= ${BINDIR}/hexdump ${BINDIR}/od LINKS+= ${BINDIR}/hexdump ${BINDIR}/hd -WARNS?= 6 .include diff --git a/usr.bin/hexdump/hexdump.1 b/usr.bin/hexdump/hexdump.1 index 4d8c2daefecc..baf9d463652d 100644 --- a/usr.bin/hexdump/hexdump.1 +++ b/usr.bin/hexdump/hexdump.1 @@ -32,7 +32,7 @@ .\" @(#)hexdump.1 8.2 (Berkeley) 4/18/94 .\" $FreeBSD$ .\" -.Dd July 10, 2004 +.Dd February 18, 2010 .Dt HEXDUMP 1 .Os .Sh NAME @@ -258,7 +258,7 @@ strings. .It "\&00C\ FF\t00D\ CR\t00E\ SO\t00F\ SI\t010\ DLE\t011\ DC1 .It "\&012\ DC2\t013\ DC3\t014\ DC4\t015\ NAK\t016\ SYN\t017\ ETB .It "\&018\ CAN\t019\ EM\t01A\ SUB\t01B\ ESC\t01C\ FS\t01D\ GS -.It "\&01E\ RS\t01F\ US\t0FF\ DEL +.It "\&01E\ RS\t01F\ US\t07F\ DEL .El .El .Pp diff --git a/usr.bin/hexdump/od.1 b/usr.bin/hexdump/od.1 index 9bf796762107..dd67ff58b234 100644 --- a/usr.bin/hexdump/od.1 +++ b/usr.bin/hexdump/od.1 @@ -32,7 +32,7 @@ .\" @(#)od.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd December 24, 2006 +.Dd February 18, 2010 .Os .Dt OD 1 .Sh NAME @@ -155,7 +155,7 @@ Control characters are displayed using the following names: .It "00c FF 00d CR 00e SO 00f SI 010 DLE 011 DC1" .It "012 DC2 013 DC3 014 DC4 015 NAK 016 SYN 017 ETB" .It "018 CAN 019 EM 01a SUB 01b ESC 01c FS 01d GS" -.It "01e RS 01f US 020 SP 0ff DEL" +.It "01e RS 01f US 020 SP 07f DEL" .El .It Cm c Characters in the default character set. diff --git a/usr.bin/host/Makefile b/usr.bin/host/Makefile index 986191466a9b..e2909e13782c 100644 --- a/usr.bin/host/Makefile +++ b/usr.bin/host/Makefile @@ -15,6 +15,8 @@ SRCS+= dighost.c host.c CFLAGS+= -I${SRCDIR}/include CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include +WARNS?= 1 + DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} diff --git a/usr.bin/id/Makefile b/usr.bin/id/Makefile index 96c162f7565a..7d78b50c7440 100644 --- a/usr.bin/id/Makefile +++ b/usr.bin/id/Makefile @@ -4,7 +4,6 @@ .include PROG= id -WARNS?= 6 LINKS= ${BINDIR}/id ${BINDIR}/groups LINKS+= ${BINDIR}/id ${BINDIR}/whoami MAN= id.1 groups.1 whoami.1 diff --git a/usr.bin/ipcrm/Makefile b/usr.bin/ipcrm/Makefile index 47e4ccc8e285..f55311c11761 100644 --- a/usr.bin/ipcrm/Makefile +++ b/usr.bin/ipcrm/Makefile @@ -7,4 +7,6 @@ LDADD= -lkvm CFLAGS+=-I${.CURDIR}/../ipcs .PATH: ${.CURDIR}/../ipcs +WARNS?= 0 + .include diff --git a/usr.bin/ipcs/Makefile b/usr.bin/ipcs/Makefile index 8ee1d4324e5d..0d422e189f62 100644 --- a/usr.bin/ipcs/Makefile +++ b/usr.bin/ipcs/Makefile @@ -5,4 +5,6 @@ SRCS= ipcs.c ipc.c DPADD= ${LIBKVM} LDADD= -lkvm +WARNS?= 1 + .include diff --git a/usr.bin/jot/jot.1 b/usr.bin/jot/jot.1 index 77cebb403a5a..3e198a342f20 100644 --- a/usr.bin/jot/jot.1 +++ b/usr.bin/jot/jot.1 @@ -32,7 +32,7 @@ .\" @(#)jot.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd November 6, 2006 +.Dd February 19, 2010 .Dt JOT 1 .Os .Sh NAME @@ -239,6 +239,7 @@ but only one is allowed. .Xr ed 1 , .Xr expand 1 , .Xr rs 1 , +.Xr seq 1 , .Xr yes 1 , .Xr arc4random 3 , .Xr printf 3 , diff --git a/usr.bin/kdump/Makefile b/usr.bin/kdump/Makefile index 2ca8561c4eb9..832b2dc20ac9 100644 --- a/usr.bin/kdump/Makefile +++ b/usr.bin/kdump/Makefile @@ -7,6 +7,8 @@ PROG= kdump SRCS= kdump.c ioctl.c kdump_subr.c subr.c CFLAGS+= -I${.CURDIR}/../ktrace -I${.CURDIR} -I${.CURDIR}/../.. +WARNS?= 0 + CLEANFILES= ioctl.c kdump_subr.c ioctl.c: mkioctls diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c index 3d8b93a61013..9c86fff189b9 100644 --- a/usr.bin/kdump/kdump.c +++ b/usr.bin/kdump/kdump.c @@ -182,14 +182,16 @@ main(int argc, char *argv[]) if (ktr_header.ktr_type & KTR_DROP) { ktr_header.ktr_type &= ~KTR_DROP; if (!drop_logged && threads) { - (void)printf("%6d %6d %-8.*s Events dropped.\n", - ktr_header.ktr_pid, ktr_header.ktr_tid > - 0 ? ktr_header.ktr_tid : 0, MAXCOMLEN, - ktr_header.ktr_comm); + (void)printf( + "%6jd %6jd %-8.*s Events dropped.\n", + (intmax_t)ktr_header.ktr_pid, + ktr_header.ktr_tid > 0 ? + (intmax_t)ktr_header.ktr_tid : 0, + MAXCOMLEN, ktr_header.ktr_comm); drop_logged = 1; } else if (!drop_logged) { - (void)printf("%6d %-8.*s Events dropped.\n", - ktr_header.ktr_pid, MAXCOMLEN, + (void)printf("%6jd %-8.*s Events dropped.\n", + (intmax_t)ktr_header.ktr_pid, MAXCOMLEN, ktr_header.ktr_comm); drop_logged = 1; } @@ -309,10 +311,11 @@ dumpheader(struct ktr_header *kth) * negative tid's as 0. */ if (threads) - (void)printf("%6d %6d %-8.*s ", kth->ktr_pid, kth->ktr_tid > - 0 ? kth->ktr_tid : 0, MAXCOMLEN, kth->ktr_comm); + (void)printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid, + kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0, + MAXCOMLEN, kth->ktr_comm); else - (void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, + (void)printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN, kth->ktr_comm); if (timestamp) { if (timestamp == 3) { @@ -325,8 +328,8 @@ dumpheader(struct ktr_header *kth) timevalsub(&kth->ktr_time, &prevtime); prevtime = temp; } - (void)printf("%ld.%06ld ", - kth->ktr_time.tv_sec, kth->ktr_time.tv_usec); + (void)printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec, + kth->ktr_time.tv_usec); } (void)printf("%s ", type); } @@ -799,7 +802,7 @@ ktrsyscall(struct ktr_syscall *ktr) narg--; } } - while (narg) { + while (narg > 0) { print_number(ip,narg,c); } (void)putchar(')'); @@ -821,7 +824,7 @@ ktrsysret(struct ktr_sysret *ktr) if (error == 0) { if (fancy) { - (void)printf("%d", ret); + (void)printf("%ld", (long)ret); if (ret < 0 || ret > 9) (void)printf("/%#lx", (long)ret); } else { @@ -1121,17 +1124,14 @@ ktruser_malloc(int len, unsigned char *p) { struct utrace_malloc *ut = (struct utrace_malloc *)p; - if (ut->p == NULL) { - if (ut->s == 0 && ut->r == NULL) - printf("malloc_init()\n"); - else - printf("%p = malloc(%zu)\n", ut->r, ut->s); - } else { - if (ut->s == 0) - printf("free(%p)\n", ut->p); - else - printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s); - } + if (ut->p == (void *)(intptr_t)(-1)) + printf("malloc_init()\n"); + else if (ut->s == 0) + printf("free(%p)\n", ut->p); + else if (ut->p == NULL) + printf("%p = malloc(%zu)\n", ut->r, ut->s); + else + printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s); } void @@ -1270,7 +1270,7 @@ ktrstat(struct stat *statp) printf("rdev=%ju, ", (uintmax_t)statp->st_rdev); printf("atime="); if (resolv == 0) - printf("%ld", statp->st_atimespec.tv_sec); + printf("%jd", (intmax_t)statp->st_atimespec.tv_sec); else { tm = localtime(&statp->st_atimespec.tv_sec); (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); @@ -1282,7 +1282,7 @@ ktrstat(struct stat *statp) printf(", "); printf("stime="); if (resolv == 0) - printf("%ld", statp->st_mtimespec.tv_sec); + printf("%jd", (intmax_t)statp->st_mtimespec.tv_sec); else { tm = localtime(&statp->st_mtimespec.tv_sec); (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); @@ -1294,7 +1294,7 @@ ktrstat(struct stat *statp) printf(", "); printf("ctime="); if (resolv == 0) - printf("%ld", statp->st_ctimespec.tv_sec); + printf("%jd", (intmax_t)statp->st_ctimespec.tv_sec); else { tm = localtime(&statp->st_ctimespec.tv_sec); (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); @@ -1306,7 +1306,7 @@ ktrstat(struct stat *statp) printf(", "); printf("birthtime="); if (resolv == 0) - printf("%ld", statp->st_birthtimespec.tv_sec); + printf("%jd", (intmax_t)statp->st_birthtimespec.tv_sec); else { tm = localtime(&statp->st_birthtimespec.tv_sec); (void)strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); @@ -1328,6 +1328,8 @@ ktrstruct(char *buf, size_t buflen) char *name, *data; size_t namelen, datalen; int i; + struct stat sb; + struct sockaddr_storage ss; for (name = buf, namelen = 0; namelen < buflen && name[namelen] != '\0'; @@ -1348,12 +1350,16 @@ ktrstruct(char *buf, size_t buflen) if (strcmp(name, "stat") == 0) { if (datalen != sizeof(struct stat)) goto invalid; - ktrstat((struct stat *)data); + memcpy(&sb, data, datalen); + ktrstat(&sb); } else if (strcmp(name, "sockaddr") == 0) { - if (datalen < sizeof(struct sockaddr) || - datalen != ((struct sockaddr *)(data))->sa_len) + if (datalen > sizeof(ss)) goto invalid; - ktrsockaddr((struct sockaddr *)data); + memcpy(&ss, data, datalen); + if (datalen < sizeof(struct sockaddr) || + datalen != ss.ss_len) + goto invalid; + ktrsockaddr((struct sockaddr *)&ss); } else { printf("unknown structure\n"); } diff --git a/usr.bin/keylogin/Makefile b/usr.bin/keylogin/Makefile index bf279eb25b22..4c03051a48f6 100644 --- a/usr.bin/keylogin/Makefile +++ b/usr.bin/keylogin/Makefile @@ -5,4 +5,6 @@ PROG= keylogin DPADD= ${LIBRPCSVC} LDADD= -lrpcsvc +WARNS?= 0 + .include diff --git a/usr.bin/killall/killall.1 b/usr.bin/killall/killall.1 index 632c06609604..19362bc6d655 100644 --- a/usr.bin/killall/killall.1 +++ b/usr.bin/killall/killall.1 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 27, 2009 +.Dd December 25, 2009 .Os .Dt KILLALL 1 .Sh NAME @@ -145,6 +145,17 @@ command appeared in It has been modeled after the .Nm command as available on other platforms. +.Sh IMPLEMENTATION NOTES +This +.Fx +implementation of +.Nm +has completely different semantics as compared to the traditional +.Ux +System V behavior of +.Nm . +The latter will kill all processes that the current user is able to +kill, and is intended to be used by the system shutdown process only. .Sh AUTHORS .An -nosplit The diff --git a/usr.bin/ktrace/Makefile b/usr.bin/ktrace/Makefile index c00bb7510459..267992353ae7 100644 --- a/usr.bin/ktrace/Makefile +++ b/usr.bin/ktrace/Makefile @@ -5,4 +5,6 @@ PROG= ktrace SRCS= ktrace.c subr.c MLINKS= ktrace.1 trace.1 +WARNS?= 4 + .include diff --git a/usr.bin/ktrdump/Makefile b/usr.bin/ktrdump/Makefile index 6b5ff127165f..c30dc3d6d7e3 100644 --- a/usr.bin/ktrdump/Makefile +++ b/usr.bin/ktrdump/Makefile @@ -5,4 +5,6 @@ DPADD= ${LIBKVM} LDADD= -lkvm MAN= ktrdump.8 +WARNS?= 2 + .include diff --git a/usr.bin/lam/lam.c b/usr.bin/lam/lam.c index 333549fe17a1..0cb681a28fc1 100644 --- a/usr.bin/lam/lam.c +++ b/usr.bin/lam/lam.c @@ -221,7 +221,7 @@ gatherline(struct openfile *ip) } static void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n", "usage: lam [ -f min.max ] [ -s sepstring ] [ -t c ] file ...", diff --git a/usr.bin/last/Makefile b/usr.bin/last/Makefile index f7e88115e9b1..0bd2f05eb27e 100644 --- a/usr.bin/last/Makefile +++ b/usr.bin/last/Makefile @@ -3,4 +3,6 @@ PROG= last +WARNS?= 1 + .include diff --git a/usr.bin/last/last.1 b/usr.bin/last/last.1 index f838c4aab8a2..223a2c6e3fb3 100644 --- a/usr.bin/last/last.1 +++ b/usr.bin/last/last.1 @@ -83,7 +83,7 @@ be reported. This may be used with the .Fl f option to derive the results from stored -.Pa wtmp +.Pa utx.log files. When this argument is provided, all other options except for .Fl f @@ -141,7 +141,7 @@ letter pair is not specified, the value defaults to 0. Read the file .Ar file instead of the default, -.Pa /var/log/wtmp . +.Pa /var/log/utx.log . .It Fl h Ar host .Ar Host names may be names or internet numbers. @@ -196,13 +196,13 @@ If interrupted with a quit signal indicates how far the search has progressed and then continues. .Sh FILES -.Bl -tag -width /var/log/wtmp -compact -.It Pa /var/log/wtmp +.Bl -tag -width /var/log/utx.log -compact +.It Pa /var/log/utx.log login data base .El .Sh SEE ALSO .Xr lastcomm 1 , -.Xr utmp 5 , +.Xr getutxent 3 , .Xr ac 8 .Sh HISTORY A @@ -212,7 +212,7 @@ utility appeared in .Sh BUGS If a login shell should terminate abnormally for some reason, it is likely that a logout record will not be written to the -.Pa wtmp +.Pa utx.log file. In this case, .Nm diff --git a/usr.bin/last/last.c b/usr.bin/last/last.c index d9877b423bb8..eb38b64ccb65 100644 --- a/usr.bin/last/last.c +++ b/usr.bin/last/last.c @@ -59,15 +59,13 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #define NO 0 /* false/no */ #define YES 1 /* true/yes */ #define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2; -static struct utmp buf[1024]; /* utmp read buffer */ - typedef struct arg { char *name; /* argument */ #define HOST_TYPE -2 @@ -78,18 +76,18 @@ typedef struct arg { } ARG; ARG *arglist; /* head of linked list */ -LIST_HEAD(ttylisthead, ttytab) ttylist; +LIST_HEAD(idlisthead, idtab) idlist; -struct ttytab { +struct idtab { time_t logout; /* log out time */ - char tty[UT_LINESIZE + 1]; /* terminal name */ - LIST_ENTRY(ttytab) list; + char id[sizeof ((struct utmpx *)0)->ut_id]; /* identifier */ + LIST_ENTRY(idtab) list; }; static const char *crmsg; /* cause of last reboot */ -static long currentout, /* current logout value */ - maxrec; /* records to display */ -static const char *file = _PATH_WTMP; /* wtmp file */ +static time_t currentout; /* current logout value */ +static long maxrec; /* records to display */ +static const char *file = NULL; /* wtmp file */ static int sflag = 0; /* show delta in seconds */ static int width = 5; /* show seconds in delta */ static int yflag; /* show year */ @@ -102,12 +100,11 @@ static time_t snaptime; /* if != 0, we will only void addarg(int, char *); time_t dateconv(char *); -void doentry(struct utmp *); +void doentry(struct utmpx *); void hostconv(char *); -void onintr(int); -void printentry(struct utmp *, struct ttytab *); +void printentry(struct utmpx *, struct idtab *); char *ttyconv(char *); -int want(struct utmp *); +int want(struct utmpx *); void usage(void); void wtmp(void); @@ -206,33 +203,35 @@ main(int argc, char *argv[]) void wtmp(void) { - struct utmp *bp; /* current structure */ - struct stat stb; /* stat of file for size */ - long bl; - int bytes, wfd; + struct utmpx *buf = NULL; + struct utmpx *ut; + static unsigned int amount = 0; + time_t t; char ct[80]; struct tm *tm; - time_t t; - - LIST_INIT(&ttylist); - - if ((wfd = open(file, O_RDONLY, 0)) < 0 || fstat(wfd, &stb) == -1) - err(1, "%s", file); - bl = (stb.st_size + sizeof(buf) - 1) / sizeof(buf); + LIST_INIT(&idlist); (void)time(&t); - buf[0].ut_time = _time_to_int(t); - (void)signal(SIGINT, onintr); - (void)signal(SIGQUIT, onintr); - while (--bl >= 0) { - if (lseek(wfd, (off_t)(bl * sizeof(buf)), L_SET) == -1 || - (bytes = read(wfd, buf, sizeof(buf))) == -1) - err(1, "%s", file); - for (bp = &buf[bytes / sizeof(buf[0]) - 1]; bp >= buf; --bp) - doentry(bp); + /* Load the last entries from the file. */ + if (setutxdb(UTXDB_LOG, file) != 0) + err(1, "%s", file); + while ((ut = getutxent()) != NULL) { + if (amount % 128 == 0) { + buf = realloc(buf, (amount + 128) * sizeof *ut); + if (buf == NULL) + err(1, "realloc"); + } + memcpy(&buf[amount++], ut, sizeof *ut); + if (t > ut->ut_tv.tv_sec) + t = ut->ut_tv.tv_sec; } - t = _int_to_time(buf[0].ut_time); + endutxent(); + + /* Display them in reverse order. */ + while (amount > 0) + doentry(&buf[--amount]); + tm = localtime(&t); (void) strftime(ct, sizeof(ct), "\nwtmp begins %+\n", tm); printf("%s", ct); @@ -243,24 +242,21 @@ wtmp(void) * process a single wtmp entry */ void -doentry(struct utmp *bp) +doentry(struct utmpx *bp) { - struct ttytab *tt, *ttx; /* ttylist entry */ + struct idtab *tt, *ttx; /* idlist entry */ - /* - * if the terminal line is '~', the machine stopped. - * see utmp(5) for more info. - */ - if (bp->ut_line[0] == '~' && !bp->ut_line[1]) { + /* the machine stopped */ + if (bp->ut_type == BOOT_TIME || bp->ut_type == SHUTDOWN_TIME) { /* everybody just logged out */ - for (tt = LIST_FIRST(&ttylist); tt;) { + for (tt = LIST_FIRST(&idlist); tt;) { LIST_REMOVE(tt, list); ttx = tt; tt = LIST_NEXT(tt, list); free(ttx); } - currentout = -bp->ut_time; - crmsg = strncmp(bp->ut_name, "shutdown", UT_NAMESIZE) ? + currentout = -bp->ut_tv.tv_sec; + crmsg = bp->ut_type != SHUTDOWN_TIME ? "crash" : "shutdown"; /* * if we're in snapshot mode, we want to exit if this @@ -276,50 +272,42 @@ doentry(struct utmp *bp) printentry(bp, NULL); return; } - /* - * if the line is '{' or '|', date got set; see - * utmp(5) for more info. - */ - if ((bp->ut_line[0] == '{' || bp->ut_line[0] == '|') && - !bp->ut_line[1]) { + /* date got set */ + if (bp->ut_type == OLD_TIME || bp->ut_type == NEW_TIME) { if (want(bp) && !snaptime) printentry(bp, NULL); return; } - /* find associated tty */ - LIST_FOREACH(tt, &ttylist, list) - if (!strncmp(tt->tty, bp->ut_line, UT_LINESIZE)) + + if (bp->ut_type != USER_PROCESS && bp->ut_type != DEAD_PROCESS) + return; + + /* find associated identifier */ + LIST_FOREACH(tt, &idlist, list) + if (!memcmp(tt->id, bp->ut_id, sizeof bp->ut_id)) break; if (tt == NULL) { /* add new one */ - tt = malloc(sizeof(struct ttytab)); + tt = malloc(sizeof(struct idtab)); if (tt == NULL) errx(1, "malloc failure"); tt->logout = currentout; - strncpy(tt->tty, bp->ut_line, UT_LINESIZE); - LIST_INSERT_HEAD(&ttylist, tt, list); + memcpy(tt->id, bp->ut_id, sizeof bp->ut_id); + LIST_INSERT_HEAD(&idlist, tt, list); } /* * print record if not in snapshot mode and wanted * or in snapshot mode and in snapshot range */ - if (bp->ut_name[0] && (want(bp) || (bp->ut_time < snaptime && + if (bp->ut_type == USER_PROCESS && (want(bp) || + (bp->ut_tv.tv_sec < snaptime && (tt->logout > snaptime || tt->logout < 1)))) { snapfound = 1; - /* - * when uucp and ftp log in over a network, the entry in - * the utmp file is the name plus their process id. See - * etc/ftpd.c and usr.bin/uucp/uucpd.c for more information. - */ - if (!strncmp(bp->ut_line, "ftp", sizeof("ftp") - 1)) - bp->ut_line[3] = '\0'; - else if (!strncmp(bp->ut_line, "uucp", sizeof("uucp") - 1)) - bp->ut_line[4] = '\0'; printentry(bp, tt); } - tt->logout = bp->ut_time; + tt->logout = bp->ut_tv.tv_sec; } /* @@ -330,7 +318,7 @@ doentry(struct utmp *bp) * logout type (crash/shutdown) as appropriate. */ void -printentry(struct utmp *bp, struct ttytab *tt) +printentry(struct utmpx *bp, struct idtab *tt) { char ct[80]; struct tm *tm; @@ -339,16 +327,30 @@ printentry(struct utmp *bp, struct ttytab *tt) if (maxrec != -1 && !maxrec--) exit(0); - t = _int_to_time(bp->ut_time); + t = bp->ut_tv.tv_sec; tm = localtime(&t); (void) strftime(ct, sizeof(ct), d_first ? (yflag ? "%a %e %b %Y %R" : "%a %e %b %R") : (yflag ? "%a %b %e %Y %R" : "%a %b %e %R"), tm); - printf("%-*.*s %-*.*s %-*.*s %s%c", - UT_NAMESIZE, UT_NAMESIZE, bp->ut_name, - UT_LINESIZE, UT_LINESIZE, bp->ut_line, - UT_HOSTSIZE, UT_HOSTSIZE, bp->ut_host, - ct, tt == NULL ? '\n' : ' '); + switch (bp->ut_type) { + case BOOT_TIME: + printf("%-42s", "boot time"); + break; + case SHUTDOWN_TIME: + printf("%-42s", "shutdown time"); + break; + case OLD_TIME: + printf("%-42s", "old time"); + break; + case NEW_TIME: + printf("%-42s", "new time"); + break; + case USER_PROCESS: + printf("%-10s %-8s %-22.22s", + bp->ut_user, bp->ut_line, bp->ut_host); + break; + } + printf(" %s%c", ct, tt == NULL ? '\n' : ' '); if (tt == NULL) return; if (!tt->logout) { @@ -363,7 +365,7 @@ printentry(struct utmp *bp, struct ttytab *tt) (void) strftime(ct, sizeof(ct), "%R", tm); printf("- %s", ct); } - delta = tt->logout - bp->ut_time; + delta = tt->logout - bp->ut_tv.tv_sec; if (sflag) { printf(" (%8ld)\n", (long)delta); } else { @@ -381,7 +383,7 @@ printentry(struct utmp *bp, struct ttytab *tt) * see if want this entry */ int -want(struct utmp *bp) +want(struct utmpx *bp) { ARG *step; @@ -394,15 +396,15 @@ want(struct utmp *bp) for (step = arglist; step; step = step->next) switch(step->type) { case HOST_TYPE: - if (!strncasecmp(step->name, bp->ut_host, UT_HOSTSIZE)) + if (!strcasecmp(step->name, bp->ut_host)) return (YES); break; case TTY_TYPE: - if (!strncmp(step->name, bp->ut_line, UT_LINESIZE)) + if (!strcmp(step->name, bp->ut_line)) return (YES); break; case USER_TYPE: - if (!strncmp(step->name, bp->ut_name, UT_NAMESIZE)) + if (!strcmp(step->name, bp->ut_user)) return (YES); break; } @@ -552,25 +554,3 @@ terr: errx(1, "out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]"); return timet; } - - -/* - * onintr -- - * on interrupt, we inform the user how far we've gotten - */ -void -onintr(int signo) -{ - char ct[80]; - struct tm *tm; - time_t t = _int_to_time(buf[0].ut_time); - - tm = localtime(&t); - (void) strftime(ct, sizeof(ct), - d_first ? "%a %e %b %R" : "%a %b %e %R", - tm); - printf("\ninterrupted %s\n", ct); - if (signo == SIGINT) - exit(1); - (void)fflush(stdout); /* fix required for rsh */ -} diff --git a/usr.bin/lastcomm/Makefile b/usr.bin/lastcomm/Makefile index c79cd7442a4c..84708d9fb413 100644 --- a/usr.bin/lastcomm/Makefile +++ b/usr.bin/lastcomm/Makefile @@ -3,6 +3,5 @@ PROG= lastcomm SRCS= lastcomm.c readrec.c -WARNS?= 6 .include diff --git a/usr.bin/lastcomm/lastcomm.c b/usr.bin/lastcomm/lastcomm.c index 8c551231a4fc..ab12ec2e4f5f 100644 --- a/usr.bin/lastcomm/lastcomm.c +++ b/usr.bin/lastcomm/lastcomm.c @@ -59,7 +59,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include #include "pathnames.h" /*XXX*/#include @@ -154,11 +153,11 @@ main(int argc, char *argv[]) if (*argv && !requested(argv, &ab)) continue; - (void)printf("%-*.*s %-7s %-*s %-*s", + (void)printf("%-*.*s %-7s %-*s %-8s", AC_COMM_LEN, AC_COMM_LEN, ab.ac_comm, flagbits(ab.ac_flagx), - UT_NAMESIZE, user_from_uid(ab.ac_uid, 0), - UT_LINESIZE, getdev(ab.ac_tty)); + MAXLOGNAME - 1, user_from_uid(ab.ac_uid, 0), + getdev(ab.ac_tty)); /* user + system time */ diff --git a/usr.bin/lastcomm/pathnames.h b/usr.bin/lastcomm/pathnames.h index 0737970dab93..04af44020648 100644 --- a/usr.bin/lastcomm/pathnames.h +++ b/usr.bin/lastcomm/pathnames.h @@ -31,8 +31,8 @@ * SUCH DAMAGE. * * @(#)pathnames.h 8.1 (Berkeley) 6/6/93 + * + * $FreeBSD$ */ -#include - #define _PATH_ACCT "/var/account/acct" diff --git a/usr.bin/ldd/Makefile b/usr.bin/ldd/Makefile index 357f9f37c770..cd172280d783 100644 --- a/usr.bin/ldd/Makefile +++ b/usr.bin/ldd/Makefile @@ -5,6 +5,5 @@ SRCS= ldd.c .if ${MACHINE_ARCH} == "i386" SRCS+= sods.c .endif -WARNS?= 6 .include diff --git a/usr.bin/ldd/ldd.1 b/usr.bin/ldd/ldd.1 index 72afb3903c51..b245631fdae0 100644 --- a/usr.bin/ldd/ldd.1 +++ b/usr.bin/ldd/ldd.1 @@ -63,7 +63,7 @@ The following is an example of a shell pipeline which uses the option. It will print a report of all ELF binaries in the current directory, which link against libc.so.6: -.Dl "find . -type f | xargs -n1 file -F " " | grep ELF | cut -f1 -d' ' | xargs ldd -f '%A %o\en' | grep libc.so.6" +.Dl "find . -type f | xargs -n1 file -F ' ' | grep ELF | cut -f1 -d' ' | xargs ldd -f '%A %o\en' | grep libc.so.6" .Sh SEE ALSO .Xr ld 1 , .Xr nm 1 , diff --git a/usr.bin/leave/Makefile b/usr.bin/leave/Makefile index 859c11cbf845..548479768a06 100644 --- a/usr.bin/leave/Makefile +++ b/usr.bin/leave/Makefile @@ -3,4 +3,6 @@ PROG= leave +WARNS?= 1 + .include diff --git a/usr.bin/leave/leave.c b/usr.bin/leave/leave.c index 89c3f5285716..c7f93c6b2c54 100644 --- a/usr.bin/leave/leave.c +++ b/usr.bin/leave/leave.c @@ -53,7 +53,7 @@ __FBSDID("$FreeBSD$"); #include #include -void doalarm(u_int); +static void doalarm(u_int); static void usage(void); /* diff --git a/usr.bin/less/Makefile.common b/usr.bin/less/Makefile.common index fcc6ccfa1ce3..cffb85a1f30b 100644 --- a/usr.bin/less/Makefile.common +++ b/usr.bin/less/Makefile.common @@ -4,6 +4,7 @@ LSDIR= ${.CURDIR}/../../contrib/less .PATH: ${LSDIR} CFLAGS+=-I${.CURDIR}/../less -I${LSDIR} +WARNS?= 1 .SUFFIXES: .nro .1 diff --git a/usr.bin/lex/Makefile b/usr.bin/lex/Makefile index 6d0ea5b44ec2..e16568fda122 100644 --- a/usr.bin/lex/Makefile +++ b/usr.bin/lex/Makefile @@ -24,6 +24,8 @@ MLINKS+= lex.1 flex.1 MLINKS+= lex.1 flex++.1 MLINKS+= lex.1 lex++.1 +WARNS?= 2 + CLEANFILES= scan.c skel.c SUBDIR= lib diff --git a/usr.bin/lex/flex.skl b/usr.bin/lex/flex.skl index 460b2fa575ef..21117118fd62 100644 --- a/usr.bin/lex/flex.skl +++ b/usr.bin/lex/flex.skl @@ -747,7 +747,7 @@ void yyFlexLexer::LexerOutput( const char* buf, int size ) */ %- -static int yy_get_next_buffer() +static int yy_get_next_buffer(void) %+ int yyFlexLexer::yy_get_next_buffer() %* @@ -883,7 +883,7 @@ int yyFlexLexer::yy_get_next_buffer() /* yy_get_previous_state - get the state just before the EOB char was reached */ %- -static yy_state_type yy_get_previous_state() +static yy_state_type yy_get_previous_state(void) %+ yy_state_type yyFlexLexer::yy_get_previous_state() %* @@ -982,7 +982,7 @@ void yyFlexLexer::yyunput( int c, char* yy_bp ) #ifdef __cplusplus static int yyinput() #else -static int input() +static int input(void) #endif %+ int yyFlexLexer::yyinput() diff --git a/usr.bin/lex/initscan.c b/usr.bin/lex/initscan.c index 7617c693dd40..59c81f7512fa 100644 --- a/usr.bin/lex/initscan.c +++ b/usr.bin/lex/initscan.c @@ -2894,7 +2894,7 @@ case YY_STATE_EOF(LINEDIR): * EOB_ACT_END_OF_FILE - end of file */ -static int yy_get_next_buffer() +static int yy_get_next_buffer(void) { char *dest = yy_current_buffer->yy_ch_buf; char *source = yytext_ptr; @@ -3026,7 +3026,7 @@ static int yy_get_next_buffer() /* yy_get_previous_state - get the state just before the EOB char was reached */ -static yy_state_type yy_get_previous_state() +static yy_state_type yy_get_previous_state(void) { yy_state_type yy_current_state; char *yy_cp; @@ -3138,7 +3138,7 @@ char *yy_bp; #ifdef __cplusplus static int yyinput() #else -static int input() +static int input(void) #endif { int c; diff --git a/usr.bin/lex/lib/Makefile b/usr.bin/lex/lib/Makefile index dcc75185c044..b43d803e2220 100644 --- a/usr.bin/lex/lib/Makefile +++ b/usr.bin/lex/lib/Makefile @@ -6,6 +6,8 @@ LIB= ln SRCS= libmain.c libyywrap.c NO_PIC= +WARNS?= 2 + .if ${MK_INSTALLLIB} != "no" LINKS= ${LIBDIR}/libln.a ${LIBDIR}/libl.a LINKS+= ${LIBDIR}/libln.a ${LIBDIR}/libfl.a diff --git a/usr.bin/limits/Makefile b/usr.bin/limits/Makefile index 5999cdbe060c..013317824db1 100644 --- a/usr.bin/limits/Makefile +++ b/usr.bin/limits/Makefile @@ -3,6 +3,5 @@ PROG= limits DPADD= ${LIBUTIL} LDADD= -lutil -WARNS?= 6 .include diff --git a/usr.bin/locale/Makefile b/usr.bin/locale/Makefile index d7f67e1aca81..5b8932cd25aa 100644 --- a/usr.bin/locale/Makefile +++ b/usr.bin/locale/Makefile @@ -2,6 +2,6 @@ PROG = locale CFLAGS += -I${.CURDIR}/../../lib/libc/locale -WARNS ?= 1 +WARNS ?= 3 .include diff --git a/usr.bin/locale/locale.1 b/usr.bin/locale/locale.1 index e6b645180787..b2aba5defdbf 100644 --- a/usr.bin/locale/locale.1 +++ b/usr.bin/locale/locale.1 @@ -35,8 +35,12 @@ .Nm .Op Fl a | m .Nm -.Op Fl ck -.Op Ar keyword ... +.Fl k +.Ic list +.Op Ar prefix +.Nm +.Op Fl ck +.Ar keyword ... .Sh DESCRIPTION The .Nm @@ -79,6 +83,8 @@ The special specific) keyword .Cm list can be used to retrieve the human readable list of all available keywords. +If so, +a prefix string can be defined to limit the amount of keywords returned. .Sh EXIT STATUS .Ex -std .Sh SEE ALSO diff --git a/usr.bin/locale/locale.c b/usr.bin/locale/locale.c index a4b6b4001839..cad3afe71bdb 100644 --- a/usr.bin/locale/locale.c +++ b/usr.bin/locale/locale.c @@ -55,7 +55,7 @@ const char *lookup_localecat(int); char *kwval_lconv(int); int kwval_lookup(char *, char **, int *, int *); void showdetails(char *); -void showkeywordslist(void); +void showkeywordslist(char *substring); void showlocale(void); void usage(void); @@ -190,6 +190,18 @@ struct _kwinfo { { "abmon_10", 1, LC_TIME, ABMON_10, "" }, { "abmon_11", 1, LC_TIME, ABMON_11, "" }, { "abmon_12", 1, LC_TIME, ABMON_12, "" }, + { "altmon_1", 1, LC_TIME, ALTMON_1, "(FreeBSD only)" }, + { "altmon_2", 1, LC_TIME, ALTMON_2, "(FreeBSD only)" }, + { "altmon_3", 1, LC_TIME, ALTMON_3, "(FreeBSD only)" }, + { "altmon_4", 1, LC_TIME, ALTMON_4, "(FreeBSD only)" }, + { "altmon_5", 1, LC_TIME, ALTMON_5, "(FreeBSD only)" }, + { "altmon_6", 1, LC_TIME, ALTMON_6, "(FreeBSD only)" }, + { "altmon_7", 1, LC_TIME, ALTMON_7, "(FreeBSD only)" }, + { "altmon_8", 1, LC_TIME, ALTMON_8, "(FreeBSD only)" }, + { "altmon_9", 1, LC_TIME, ALTMON_9, "(FreeBSD only)" }, + { "altmon_10", 1, LC_TIME, ALTMON_10, "(FreeBSD only)" }, + { "altmon_11", 1, LC_TIME, ALTMON_11, "(FreeBSD only)" }, + { "altmon_12", 1, LC_TIME, ALTMON_12, "(FreeBSD only)" }, { "era", 1, LC_TIME, ERA, "(unavailable)" }, { "era_d_fmt", 1, LC_TIME, ERA_D_FMT, "(unavailable)" }, { "era_d_t_fmt", 1, LC_TIME, ERA_D_T_FMT, "(unavailable)" }, @@ -217,7 +229,7 @@ main(int argc, char *argv[]) int ch; int tmp; - while ((ch = getopt(argc, argv, "ackm")) != -1) { + while ((ch = getopt(argc, argv, "ackms:")) != -1) { switch (ch) { case 'a': all_locales = 1; @@ -265,7 +277,7 @@ main(int argc, char *argv[]) if (prt_keywords && argc > 0) while (tmp < argc) if (strcasecmp(argv[tmp++], "list") == 0) { - showkeywordslist(); + showkeywordslist(argv[tmp]); exit(0); } @@ -290,7 +302,8 @@ void usage(void) { printf("Usage: locale [ -a | -m ]\n" - " locale [ -ck ] name ...\n"); + " locale -k list [prefix]\n" + " locale [ -ck ] keyword ...\n"); exit(1); } @@ -594,6 +607,7 @@ showdetails(char *kw) * invalid keyword specified. * XXX: any actions? */ + fprintf(stderr, "Unknown keyword: `%s'\n", kw); return; } @@ -639,16 +653,25 @@ lookup_localecat(int cat) * Show list of keywords */ void -showkeywordslist(void) +showkeywordslist(char *substring) { size_t i; #define FMT "%-20s %-12s %-7s %-20s\n" - printf("List of available keywords\n\n"); + if (substring == NULL) + printf("List of available keywords\n\n"); + else + printf("List of available keywords starting with '%s'\n\n", + substring); printf(FMT, "Keyword", "Category", "Type", "Comment"); printf("-------------------- ------------ ------- --------------------\n"); for (i = 0; i < NKWINFO; i++) { + if (substring != NULL) { + if (strncmp(kwinfo[i].name, substring, + strlen(substring)) != 0) + continue; + } printf(FMT, kwinfo[i].name, lookup_localecat(kwinfo[i].catid), diff --git a/usr.bin/locate/Makefile.inc b/usr.bin/locate/Makefile.inc index 48174083d848..5ce397d85406 100644 --- a/usr.bin/locate/Makefile.inc +++ b/usr.bin/locate/Makefile.inc @@ -1,3 +1,5 @@ # $FreeBSD$ LIBEXECDIR?= /usr/libexec + +WARNS?= 0 diff --git a/usr.bin/locate/locate/Makefile b/usr.bin/locate/locate/Makefile index 9a618da4e8fa..a139ff282028 100644 --- a/usr.bin/locate/locate/Makefile +++ b/usr.bin/locate/locate/Makefile @@ -7,6 +7,8 @@ CFLAGS+= -I${.CURDIR} -DMMAP # -DDEBUG (print time) -O2 (10% faster) SCRIPTS=updatedb.sh mklocatedb.sh concatdb.sh MAN= locate.1 locate.updatedb.8 +WARNS?= 2 + SCRIPTSDIR= ${LIBEXECDIR} .for script in ${SCRIPTS} SCRIPTSNAME_${script}= locate.${script:R} diff --git a/usr.bin/lock/Makefile b/usr.bin/lock/Makefile index dc09a87b1b9c..8093ca51ba1d 100644 --- a/usr.bin/lock/Makefile +++ b/usr.bin/lock/Makefile @@ -7,4 +7,6 @@ BINMODE=4555 DPADD= ${LIBCRYPT} LDADD= -lcrypt +WARNS?= 1 + .include diff --git a/usr.bin/logger/Makefile b/usr.bin/logger/Makefile index 6ff722452793..922192ce919f 100644 --- a/usr.bin/logger/Makefile +++ b/usr.bin/logger/Makefile @@ -4,7 +4,6 @@ .include PROG= logger -WARNS?= 6 .if ${MK_INET6_SUPPORT} != "no" CFLAGS+= -DINET6 diff --git a/usr.bin/logger/logger.c b/usr.bin/logger/logger.c index 5d9ec4df83bb..90271052fdba 100644 --- a/usr.bin/logger/logger.c +++ b/usr.bin/logger/logger.c @@ -114,6 +114,7 @@ main(int argc, char *argv[]) case 'f': /* file to log */ if (freopen(optarg, "r", stdin) == NULL) err(1, "%s", optarg); + setvbuf(stdin, 0, _IONBF, 0); break; case 'h': /* hostname to deliver to */ host = optarg; diff --git a/usr.bin/login/Makefile b/usr.bin/login/Makefile index 22c73b9993d9..bd34ed9c6269 100644 --- a/usr.bin/login/Makefile +++ b/usr.bin/login/Makefile @@ -9,6 +9,8 @@ CFLAGS+=-DLOGALL DPADD= ${LIBUTIL} ${LIBPAM} LDADD= -lutil ${MINUSLPAM} +WARNS?= 5 + .if ${MK_AUDIT} != "no" SRCS+= login_audit.c CFLAGS+= -DUSE_BSM_AUDIT diff --git a/usr.bin/login/login.c b/usr.bin/login/login.c index 2a429247d9a0..da182aa90e89 100644 --- a/usr.bin/login/login.c +++ b/usr.bin/login/login.c @@ -737,7 +737,7 @@ auth_pam(void) * Export any environment variables PAM modules may have set */ static void -export_pam_environment() +export_pam_environment(void) { char **pam_env; char **pp; @@ -786,7 +786,7 @@ export(const char *s) } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: login [-fp] [-h hostname] [username]\n"); @@ -797,7 +797,7 @@ usage() * Prompt user and read login name from stdin. */ static char * -getloginname() +getloginname(void) { char *nbuf, *p; int ch; @@ -941,7 +941,7 @@ pam_syslog(const char *msg) * Shut down PAM */ static void -pam_cleanup() +pam_cleanup(void) { if (pamh != NULL) { diff --git a/usr.bin/login/login_fbtab.c b/usr.bin/login/login_fbtab.c index f6111a1cd352..afa320f83991 100644 --- a/usr.bin/login/login_fbtab.c +++ b/usr.bin/login/login_fbtab.c @@ -81,10 +81,7 @@ static void login_protect(const char *, char *, int, uid_t, gid_t); /* login_fbtab - apply protections specified in /etc/fbtab or logindevperm */ void -login_fbtab(tty, uid, gid) -char *tty; -uid_t uid; -gid_t gid; +login_fbtab(char *tty, uid_t uid, gid_t gid) { FILE *fp; char buf[BUFSIZ]; @@ -124,12 +121,7 @@ gid_t gid; /* login_protect - protect one device entry */ void -login_protect(table, pattern, mask, uid, gid) -const char *table; -char *pattern; -int mask; -uid_t uid; -gid_t gid; +login_protect(const char *table, char *pattern, int mask, uid_t uid, gid_t gid) { glob_t gl; char *path; diff --git a/usr.bin/logins/Makefile b/usr.bin/logins/Makefile index 42840fb28b9c..ad88cd926140 100644 --- a/usr.bin/logins/Makefile +++ b/usr.bin/logins/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= logins -WARNS?= 6 .include diff --git a/usr.bin/logname/Makefile b/usr.bin/logname/Makefile index 4e910ce73297..875df2c0abf6 100644 --- a/usr.bin/logname/Makefile +++ b/usr.bin/logname/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= logname -WARNS?= 6 .include diff --git a/usr.bin/look/Makefile b/usr.bin/look/Makefile index 64d778891fba..a62003922094 100644 --- a/usr.bin/look/Makefile +++ b/usr.bin/look/Makefile @@ -1,5 +1,8 @@ # @(#)Makefile 8.1 (Berkeley) 6/9/93 +# $FreeBSD$ PROG= look +WARNS?= 2 + .include diff --git a/usr.bin/lsvfs/Makefile b/usr.bin/lsvfs/Makefile index 0c33583257cf..324b6fd0746d 100644 --- a/usr.bin/lsvfs/Makefile +++ b/usr.bin/lsvfs/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= lsvfs -WARNS?= 6 .include diff --git a/usr.bin/m4/Makefile b/usr.bin/m4/Makefile index 702b3f3d2444..feceb0ca80d1 100644 --- a/usr.bin/m4/Makefile +++ b/usr.bin/m4/Makefile @@ -9,4 +9,6 @@ CFLAGS+=-DEXTENDED SRCS= eval.c expr.c look.c main.c misc.c gnum4.c trace.c +WARNS?= 0 + .include diff --git a/usr.bin/mail/Makefile b/usr.bin/mail/Makefile index 5fa455b19d3a..da3e4336b4c7 100644 --- a/usr.bin/mail/Makefile +++ b/usr.bin/mail/Makefile @@ -11,6 +11,8 @@ EFILES= mail.rc LINKS= ${BINDIR}/mail ${BINDIR}/Mail ${BINDIR}/mail ${BINDIR}/mailx MLINKS= mail.1 Mail.1 mail.1 mailx.1 +WARNS?= 1 + .PATH: ${.CURDIR}/misc etc-mailrc: diff --git a/usr.bin/make/Makefile b/usr.bin/make/Makefile index deb076f90104..c58138580ae9 100644 --- a/usr.bin/make/Makefile +++ b/usr.bin/make/Makefile @@ -8,7 +8,6 @@ SRCS= arch.c buf.c cond.c dir.c for.c hash.c hash_tables.c job.c \ lst.c main.c make.c parse.c proc.c shell.c str.c suff.c targ.c \ util.c var.c -WARNS?= 6 NO_SHARED?= YES CFLAGS+=-DMAKE_VERSION=\"5200408120\" diff --git a/usr.bin/make/arch.c b/usr.bin/make/arch.c index 90801cdece4f..9cd0a1c64618 100644 --- a/usr.bin/make/arch.c +++ b/usr.bin/make/arch.c @@ -1131,7 +1131,7 @@ Arch_MemMTime(GNode *gn) * command (or the linker will know where to find it) and set the * TARGET variable for this node to be the node's name. Otherwise, * we set the TARGET variable to be the full path of the library, - * as returned by Dir_FindFile. + * as returned by Path_FindFile. * *----------------------------------------------------------------------- */ diff --git a/usr.bin/make/dir.c b/usr.bin/make/dir.c index c66b2bf4bc97..7cee3d461e2b 100644 --- a/usr.bin/make/dir.c +++ b/usr.bin/make/dir.c @@ -61,6 +61,10 @@ __FBSDID("$FreeBSD$"); * If it exists, the entire path is returned. * Otherwise NULL is returned. * + * Dir_FindHereOrAbove Search for a path in the current directory and + * then all the directories above it in turn until + * the path is found or we reach the root ("/"). + * * Dir_MTime Return the modification time of a node. The file * is searched for along the default search path. * The path and mtime fields of the node are filled in. @@ -83,14 +87,13 @@ __FBSDID("$FreeBSD$"); * Dir_PrintDirectories Print stats about the directory cache. */ -#include +#include #include #include #include #include #include #include -#include #include "arch.h" #include "dir.h" @@ -98,7 +101,6 @@ __FBSDID("$FreeBSD$"); #include "GNode.h" #include "hash.h" #include "lst.h" -#include "make.h" #include "str.h" #include "targ.h" #include "util.h" @@ -832,21 +834,6 @@ Path_FindFile(char *name, struct Path *path) * When searching for $(FILE), we will find it in $(INSTALLDIR) * b/c we added it here. This is not good... */ -#ifdef notdef - cp[-1] = '\0'; - Path_AddDir(path, name); - cp[-1] = '/'; - - bigmisses += 1; - pe = TAILQ_LAST(path, Path); - if (pe == NULL) - return (NULL); - - if (Hash_FindEntry(&pe->dir->files, cp) != NULL) { - return (estrdup(name)); - - return (NULL); -#else /* !notdef */ DEBUGF(DIR, ("Looking for \"%s\"...", name)); bigmisses += 1; @@ -864,7 +851,83 @@ Path_FindFile(char *name, struct Path *path) DEBUGF(DIR, ("failed. Returning NULL\n")); return (NULL); } -#endif /* notdef */ +} + +/*- + *----------------------------------------------------------------------- + * Dir_FindHereOrAbove -- + * search for a path starting at a given directory and then working + * our way up towards the root. + * + * Input: + * here starting directory + * search_path the path we are looking for + * result the result of a successful search is placed here + * rlen the length of the result buffer + * (typically MAXPATHLEN + 1) + * + * Results: + * 0 on failure, 1 on success [in which case the found path is put + * in the result buffer]. + * + * Side Effects: + *----------------------------------------------------------------------- + */ +int +Dir_FindHereOrAbove(char *here, char *search_path, char *result, int rlen) +{ + struct stat st; + char dirbase[MAXPATHLEN + 1], *db_end; + char try[MAXPATHLEN + 1], *try_end; + + /* copy out our starting point */ + snprintf(dirbase, sizeof(dirbase), "%s", here); + db_end = dirbase + strlen(dirbase); + + /* loop until we determine a result */ + while (1) { + /* try and stat(2) it ... */ + snprintf(try, sizeof(try), "%s/%s", dirbase, search_path); + if (stat(try, &st) != -1) { + /* + * Success! If we found a file, chop off + * the filename so we return a directory. + */ + if ((st.st_mode & S_IFMT) != S_IFDIR) { + try_end = try + strlen(try); + while (try_end > try && *try_end != '/') + try_end--; + if (try_end > try) + *try_end = 0; /* chop! */ + } + + /* + * Done! + */ + snprintf(result, rlen, "%s", try); + return(1); + } + + /* + * Nope, we didn't find it. If we used up dirbase we've + * reached the root and failed. + */ + if (db_end == dirbase) + break; /* Failed! */ + + /* + * truncate dirbase from the end to move up a dir + */ + while (db_end > dirbase && *db_end != '/') + db_end--; + *db_end = 0; /* chop! */ + + } /* while (1) */ + + /* + * We failed... + */ + return(0); } /*- @@ -878,7 +941,7 @@ Path_FindFile(char *name, struct Path *path) * * Side Effects: * The modification time is placed in the node's mtime slot. - * If the node didn't have a path entry before, and Dir_FindFile + * If the node didn't have a path entry before, and Path_FindFile * found one for it, the full name is placed in the path slot. *----------------------------------------------------------------------- */ diff --git a/usr.bin/make/dir.h b/usr.bin/make/dir.h index 03481b869790..1ae89aeac61e 100644 --- a/usr.bin/make/dir.h +++ b/usr.bin/make/dir.h @@ -56,6 +56,7 @@ TAILQ_HEAD(Path, PathElement); void Dir_Init(void); void Dir_InitDot(void); Boolean Dir_HasWildcards(const char *); +int Dir_FindHereOrAbove(char *, char *, char *, int); int Dir_MTime(struct GNode *); void Dir_PrintDirectories(void); diff --git a/usr.bin/make/for.c b/usr.bin/make/for.c index 8df547119115..f2eccce9afd1 100644 --- a/usr.bin/make/for.c +++ b/usr.bin/make/for.c @@ -50,11 +50,9 @@ __FBSDID("$FreeBSD$"); #include #include "buf.h" -#include "dir.h" #include "for.h" #include "globals.h" #include "lst.h" -#include "make.h" #include "parse.h" #include "str.h" #include "util.h" diff --git a/usr.bin/make/globals.h b/usr.bin/make/globals.h index 6f75eafcb270..06c302e2aeb4 100644 --- a/usr.bin/make/globals.h +++ b/usr.bin/make/globals.h @@ -45,9 +45,6 @@ * Global Variables */ -#include -#include - #include "lst.h" #include "util.h" diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c index e37c62c621e6..beb83dc4a621 100644 --- a/usr.bin/make/job.c +++ b/usr.bin/make/job.c @@ -114,6 +114,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include @@ -137,7 +139,7 @@ __FBSDID("$FreeBSD$"); #include "util.h" #include "var.h" -#define TMPPAT "/tmp/makeXXXXXXXXXX" +#define TMPPAT "makeXXXXXXXXXX" #ifndef USE_KQUEUE /* @@ -236,7 +238,7 @@ typedef struct Job { */ struct { /* Name of file to which shell output was rerouted */ - char of_outFile[sizeof(TMPPAT)]; + char of_outFile[PATH_MAX]; /* * Stream open to the output file. Used to funnel all @@ -485,7 +487,7 @@ catch_child(int sig __unused) /** */ void -Proc_Init() +Proc_Init(void) { /* * Catch SIGCHLD so that we get kicked out of select() when we @@ -1008,17 +1010,6 @@ JobFinish(Job *job, int *status) if (!(job->flags & JOB_CONTINUING)) { DEBUGF(JOB, ("Warning: process %jd was not " "continuing.\n", (intmax_t) job->pid)); -#ifdef notdef - /* - * We don't really want to restart a - * job from scratch just because it - * continued, especially not without - * killing the continuing process! - * That's why this is ifdef'ed out. - * FD - 9/17/90 - */ - JobRestart(job); -#endif } job->flags &= ~JOB_CONTINUING; TAILQ_INSERT_TAIL(&jobs, job, link); @@ -1577,7 +1568,8 @@ JobStart(GNode *gn, int flags, Job *previous) Boolean noExec; /* Set true if we decide not to run the job */ int tfd; /* File descriptor for temp file */ LstNode *ln; - char tfile[sizeof(TMPPAT)]; + char tfile[PATH_MAX]; + const char *tdir; if (interrupted) { JobPassSig(interrupted); @@ -1618,6 +1610,9 @@ JobStart(GNode *gn, int flags, Job *previous) cmdsOK = TRUE; } + if ((tdir = getenv("TMPDIR")) == NULL) + tdir = _PATH_TMP; + /* * If the -n flag wasn't given, we open up OUR (not the child's) * temporary file to stuff commands in it. The thing is rd/wr so we @@ -1633,7 +1628,7 @@ JobStart(GNode *gn, int flags, Job *previous) DieHorribly(); } - strcpy(tfile, TMPPAT); + snprintf(tfile, sizeof(tfile), "%s/%s", tdir, TMPPAT); if ((tfd = mkstemp(tfile)) == -1) Punt("Cannot create temp file: %s", strerror(errno)); job->cmdFILE = fdopen(tfd, "w+"); @@ -1812,7 +1807,8 @@ JobStart(GNode *gn, int flags, Job *previous) } else { fprintf(stdout, "Remaking `%s'\n", gn->name); fflush(stdout); - strcpy(job->outFile, TMPPAT); + snprintf(job->outFile, sizeof(job->outFile), "%s/%s", + tdir, TMPPAT); if ((job->outFd = mkstemp(job->outFile)) == -1) Punt("cannot create temp file: %s", strerror(errno)); @@ -3380,6 +3376,8 @@ Compat_Run(Lst *targs) printf("`%s' not remade because of errors.\n", gn->name); makeErrors++; + } else if (gn->made == ERROR) { + makeErrors++; } } diff --git a/usr.bin/make/lst.c b/usr.bin/make/lst.c index a5b7f06c5254..be30621ad3a8 100644 --- a/usr.bin/make/lst.c +++ b/usr.bin/make/lst.c @@ -41,7 +41,6 @@ #include #include "lst.h" -#include "make.h" #include "util.h" /** diff --git a/usr.bin/make/lst.h b/usr.bin/make/lst.h index 497d59c59780..1199e94688c7 100644 --- a/usr.bin/make/lst.h +++ b/usr.bin/make/lst.h @@ -48,8 +48,6 @@ * Header for using the list library */ -#include "util.h" - /* * Structure of a list node. */ diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c index 0e165062c1bb..91638d4212bf 100644 --- a/usr.bin/make/main.c +++ b/usr.bin/make/main.c @@ -368,6 +368,7 @@ MainParseArgs(int argc, char **argv) { int c; Boolean found_dd = FALSE; + char found_dir[MAXPATHLEN + 1]; /* for searching for sys.mk */ rearg: optind = 1; /* since we're called more than once */ @@ -394,6 +395,8 @@ rearg: case 'C': if (chdir(optarg) == -1) err(1, "chdir %s", optarg); + if (getcwd(curdir, MAXPATHLEN) == NULL) + err(2, NULL); break; case 'D': Var_SetGlobal(optarg, "1"); @@ -492,7 +495,15 @@ rearg: MFLAGS_append("-k", NULL); break; case 'm': - Path_AddDir(&sysIncPath, optarg); + /* look for magic parent directory search string */ + if (strncmp(".../", optarg, 4) == 0) { + if (!Dir_FindHereOrAbove(curdir, optarg + 4, + found_dir, sizeof(found_dir))) + break; /* nothing doing */ + Path_AddDir(&sysIncPath, found_dir); + } else { + Path_AddDir(&sysIncPath, optarg); + } MFLAGS_append("-m", optarg); break; case 'n': @@ -706,6 +717,7 @@ Main_AddSourceMakefile(const char *name) static void Remake_Makefiles(void) { + Lst cleanup; LstNode *ln; int error_cnt = 0; int remade_cnt = 0; @@ -716,6 +728,7 @@ Remake_Makefiles(void) Fatal("Failed to change directory to %s.", curdir); } + Lst_Init(&cleanup); LST_FOREACH(ln, &source_makefiles) { LstNode *ln2; struct GNode *gn; @@ -791,21 +804,7 @@ Remake_Makefiles(void) gn->name); error_cnt++; } else if (gn->made == UPTODATE) { - Lst examine; - - Lst_Init(&examine); - Lst_EnQueue(&examine, gn); - while (!Lst_IsEmpty(&examine)) { - LstNode *eln; - GNode *egn = Lst_DeQueue(&examine); - - egn->make = FALSE; - LST_FOREACH(eln, &egn->children) { - GNode *cgn = Lst_Datum(eln); - - Lst_EnQueue(&examine, cgn); - } - } + Lst_EnQueue(&cleanup, gn); } } @@ -827,6 +826,24 @@ Remake_Makefiles(void) } } + while (!Lst_IsEmpty(&cleanup)) { + GNode *gn = Lst_DeQueue(&cleanup); + + gn->unmade = 0; + gn->make = FALSE; + gn->made = UNMADE; + gn->childMade = FALSE; + gn->mtime = gn->cmtime = 0; + gn->cmtime_gn = NULL; + + LST_FOREACH(ln, &gn->children) { + GNode *cgn = Lst_Datum(ln); + + gn->unmade++; + Lst_EnQueue(&cleanup, cgn); + } + } + if (curdir != objdir) { if (chdir(objdir) < 0) Fatal("Failed to change directory to %s.", objdir); @@ -863,6 +880,7 @@ main(int argc, char **argv) char mdpath[MAXPATHLEN]; char obpath[MAXPATHLEN]; char cdpath[MAXPATHLEN]; + char found_dir[MAXPATHLEN + 1]; /* for searching for sys.mk */ char *cp = NULL, *start; save_argv = argv; @@ -1015,6 +1033,12 @@ main(int argc, char **argv) } Job_SetPrefix(); + /* + * Find where we are... + */ + if (getcwd(curdir, MAXPATHLEN) == NULL) + err(2, NULL); + /* * First snag things out of the MAKEFLAGS environment * variable. Then parse the command line arguments. @@ -1024,11 +1048,8 @@ main(int argc, char **argv) MainParseArgs(argc, argv); /* - * Find where we are... + * Verify that cwd is sane (after -C may have changed it). */ - if (getcwd(curdir, MAXPATHLEN) == NULL) - err(2, NULL); - { struct stat sa; @@ -1126,18 +1147,37 @@ main(int argc, char **argv) * as dir1:...:dirn) to the system include path. */ if (TAILQ_EMPTY(&sysIncPath)) { - char syspath[] = PATH_DEFSYSPATH; + char defsyspath[] = PATH_DEFSYSPATH; + char *syspath = getenv("MAKESYSPATH"); + + /* + * If no user-supplied system path was given (thru -m option) + * add the directories from the DEFSYSPATH (more than one may + * be given as dir1:...:dirn) to the system include path. + */ + if (syspath == NULL || *syspath == '\0') + syspath = defsyspath; + else + syspath = estrdup(syspath); for (start = syspath; *start != '\0'; start = cp) { for (cp = start; *cp != '\0' && *cp != ':'; cp++) continue; - if (*cp == '\0') { - Path_AddDir(&sysIncPath, start); - } else { + if (*cp == ':') { *cp++ = '\0'; + } + /* look for magic parent directory search string */ + if (strncmp(".../", start, 4) == 0) { + if (Dir_FindHereOrAbove(curdir, start + 4, + found_dir, sizeof(found_dir))) { + Path_AddDir(&sysIncPath, found_dir); + } + } else { Path_AddDir(&sysIncPath, start); } } + if (syspath != defsyspath) + free(syspath); } /* diff --git a/usr.bin/make/make.1 b/usr.bin/make/make.1 index a4e837ceba49..4e435384b1ad 100644 --- a/usr.bin/make/make.1 +++ b/usr.bin/make/make.1 @@ -240,6 +240,36 @@ The system include path will always be appended to the search path used for "..."-style inclusions and makefile searches (see the .Fl I option). +.Pp +If a file or directory name in the +.Fl m +argument (or the +.Ev MAKESYSPATH +environment variable) starts with the string +.Qq \&.../ +then +.Nm +will search for the specified file or directory named in the remaining part +of the argument string. +The search starts with the current directory of the Makefile and then works +upward towards the root of the filesystem. +If the search is successful, +then the resulting directory replaces the +.Qq \&.../ +specification in the +.Fl m +argument. +If used, this feature allows +.Nm +to easily search in the current source tree for customized sys.mk files +(e.g. by using +.Qq \&.../mk/sys.mk +as an argument). +Note that a +.Fl C +that are earlier on the command line affect where +.Fl m Qq \&.../ +searches. .It Fl n Display the commands that would have been executed, but do not actually execute them. @@ -822,7 +852,7 @@ These directories will be searched for source files by .Nm after it has finished parsing all input makefiles. .El -.Pp +.Ss Variable Modifiers Variable expansion may be modified to select or modify each word of the variable (where a .Dq word @@ -837,7 +867,7 @@ The colon may be escaped with a backslash .Pq Ql \e . .Bl -tag -width Cm .Sm off -.It Cm C No / Ar pattern Xo +.It Cm :C No / Ar pattern Xo .No / Ar replacement .No / Op Cm 1g .Xc @@ -866,13 +896,13 @@ and are orthogonal; the former specifies whether multiple words are potentially affected, the latter whether multiple substitutions can potentially occur within each affected word. -.It Cm E +.It Cm :E Replaces each word in the variable with its suffix. -.It Cm H +.It Cm :H Replaces each word in the variable with everything but the last component. -.It Cm L +.It Cm :L Converts variable to lower-case letters. -.It Cm M Ns Ar pattern +.It Cm :M Ns Ar pattern Select only those words that match the rest of the modifier. The standard shell wildcard characters .Pf ( Ql * , @@ -883,21 +913,21 @@ may be used. The wildcard characters may be escaped with a backslash .Pq Ql \e . -.It Cm N Ns Ar pattern +.It Cm :N Ns Ar pattern This is identical to -.Cm M , +.Cm :M , but selects all words which do not match the rest of the modifier. -.It Cm O +.It Cm :O Order every word in the variable alphabetically. -.It Cm Q +.It Cm :Q Quotes every shell meta-character in the variable, so that it can be passed safely through recursive invocations of .Nm . -.It Cm R +.It Cm :R Replaces each word in the variable with everything but its suffix. .Sm off -.It Cm S No / Ar old_string Xo +.It Cm :S No / Ar old_string Xo .No / Ar new_string .No / Op Cm g .Xc @@ -941,7 +971,7 @@ with the single exception that a backslash is used to prevent the expansion of a dollar sign .Pq Ql $ , not a preceding dollar sign as is usual. -.It Ar old_string=new_string +.It Ar :old_string=new_string This is the .At V style variable substitution. @@ -961,11 +991,11 @@ is the substring of .Ar old_string to be replaced in .Ar new_string -.It Cm T +.It Cm :T Replaces each word in the variable with its last component. -.It Cm U +.It Cm :U Converts variable to upper-case letters. -.It Cm u +.It Cm :u Remove adjacent duplicate words (like .Xr uniq 1 ) . .El @@ -1665,8 +1695,9 @@ utility uses the following environment variables, if they exist: .Ev MAKE , .Ev MAKEFLAGS , .Ev MAKEOBJDIR , +.Ev MAKEOBJDIRPREFIX , and -.Ev MAKEOBJDIRPREFIX . +.Ev MAKESYSPATH . .Sh FILES .Bl -tag -width /usr/share/doc/psd/12.make -compact .It Pa .depend diff --git a/usr.bin/make/make.c b/usr.bin/make/make.c index a6ddc85d4c8d..3e6cb42fca0f 100644 --- a/usr.bin/make/make.c +++ b/usr.bin/make/make.c @@ -72,8 +72,6 @@ __FBSDID("$FreeBSD$"); * and perform the .USE actions if so. */ -#include - #include "arch.h" #include "config.h" #include "dir.h" diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c index 2c651645b240..134d90578b9d 100644 --- a/usr.bin/make/parse.c +++ b/usr.bin/make/parse.c @@ -699,6 +699,7 @@ static void ParseDoDependency(char *line) { char *cp; /* our current position */ + char *lstart = line; /* original input line */ GNode *gn; /* a general purpose temporary node */ int op; /* the operator on the line */ char savec; /* a place to save a character */ @@ -802,13 +803,15 @@ ParseDoDependency(char *line) * merges. */ if (strncmp(line, "<<<<<<", 6) == 0 || + strncmp(line, "||||||", 6) == 0 || strncmp(line, "======", 6) == 0 || strncmp(line, ">>>>>>", 6) == 0) { Parse_Error(PARSE_FATAL, "Makefile appears to " "contain unresolved cvs/rcs/??? merge " "conflicts"); } else - Parse_Error(PARSE_FATAL, "Need an operator"); + Parse_Error(PARSE_FATAL, lstart[0] == '.' ? + "Unknown directive" : "Need an operator"); return; } *cp = '\0'; @@ -1028,7 +1031,8 @@ ParseDoDependency(char *line) op = OP_DEPENDS; } } else { - Parse_Error(PARSE_FATAL, "Missing dependency operator"); + Parse_Error(PARSE_FATAL, lstart[0] == '.' ? + "Unknown directive" : "Missing dependency operator"); return; } diff --git a/usr.bin/make/proc.c b/usr.bin/make/proc.c index 711f605a4846..3a7e4f654eee 100644 --- a/usr.bin/make/proc.c +++ b/usr.bin/make/proc.c @@ -116,7 +116,7 @@ Proc_Exec(const ProcStuff *ps) execvp(ps->argv[0], ps->argv); write(STDERR_FILENO, ps->argv[0], strlen(ps->argv[0])); - write(STDERR_FILENO, ":", 1); + write(STDERR_FILENO, ": ", 2); write(STDERR_FILENO, strerror(errno), strlen(strerror(errno))); write(STDERR_FILENO, "\n", 1); } else { diff --git a/usr.bin/make/str.c b/usr.bin/make/str.c index 81bb7a375617..44ba79d29493 100644 --- a/usr.bin/make/str.c +++ b/usr.bin/make/str.c @@ -41,12 +41,10 @@ #include __FBSDID("$FreeBSD$"); -#include #include #include #include "buf.h" -#include "globals.h" #include "str.h" #include "util.h" diff --git a/usr.bin/make/targ.c b/usr.bin/make/targ.c index eac121e23ca8..75ced89a42fe 100644 --- a/usr.bin/make/targ.c +++ b/usr.bin/make/targ.c @@ -78,13 +78,11 @@ __FBSDID("$FreeBSD$"); */ #include -#include #include "dir.h" #include "globals.h" #include "GNode.h" #include "hash.h" -#include "make.h" #include "suff.h" #include "targ.h" #include "util.h" diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index 983bb2ae7046..534abcaf42b0 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -84,7 +84,6 @@ __FBSDID("$FreeBSD$"); * XXX: There's a lot of duplication in these functions. */ -#include #include #include #include @@ -97,7 +96,6 @@ __FBSDID("$FreeBSD$"); #include "GNode.h" #include "job.h" #include "lst.h" -#include "make.h" #include "parse.h" #include "str.h" #include "targ.h" diff --git a/usr.bin/makewhatis/makewhatis.c b/usr.bin/makewhatis/makewhatis.c index 6b2dce4e5950..f2ae3709d6dd 100644 --- a/usr.bin/makewhatis/makewhatis.c +++ b/usr.bin/makewhatis/makewhatis.c @@ -879,9 +879,9 @@ process_section(char *section_dir) * Returns whether the directory entry is a man page section. */ static int -select_sections(struct dirent *entry) +select_sections(const struct dirent *entry) { - char *p = &entry->d_name[3]; + const char *p = &entry->d_name[3]; if (strncmp(entry->d_name, "man", 3) != 0) return 0; diff --git a/usr.bin/minigzip/Makefile b/usr.bin/minigzip/Makefile index 226ba7617985..9a0ab9560fec 100644 --- a/usr.bin/minigzip/Makefile +++ b/usr.bin/minigzip/Makefile @@ -5,4 +5,6 @@ LDADD= -lz DPADD= ${LIBZ} .PATH: ${.CURDIR}/../../lib/libz +WARNS?= 5 + .include diff --git a/usr.bin/mkfifo/Makefile b/usr.bin/mkfifo/Makefile index bab308b133f6..30f013ecea41 100644 --- a/usr.bin/mkfifo/Makefile +++ b/usr.bin/mkfifo/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= mkfifo -WARNS?= 6 .include diff --git a/usr.bin/mklocale/Makefile b/usr.bin/mklocale/Makefile index 9873d4e32fc3..e75fe99bbba5 100644 --- a/usr.bin/mklocale/Makefile +++ b/usr.bin/mklocale/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= mklocale -WARNS?= 6 SRCS= yacc.y lex.l y.tab.h CFLAGS+= -I. -I${.CURDIR} -I${.CURDIR}/../../lib/libc/locale diff --git a/usr.bin/mklocale/lex.l b/usr.bin/mklocale/lex.l index eeed535db2c6..34ff62724d02 100644 --- a/usr.bin/mklocale/lex.l +++ b/usr.bin/mklocale/lex.l @@ -170,7 +170,7 @@ ENCODING { return(ENCODING); } #if !defined(yywrap) int -yywrap() +yywrap(void) { return(1); } diff --git a/usr.bin/mklocale/yacc.y b/usr.bin/mklocale/yacc.y index 344af220cf6b..b86ab889a36e 100644 --- a/usr.bin/mklocale/yacc.y +++ b/usr.bin/mklocale/yacc.y @@ -266,22 +266,20 @@ main(int ac, char *av[]) } static void -usage() +usage(void) { fprintf(stderr, "usage: mklocale [-d] [-o output] [source]\n"); exit(1); } void -yyerror(s) - const char *s; +yyerror(const char *s) { fprintf(stderr, "%s\n", s); } static void * -xmalloc(sz) - unsigned int sz; +xmalloc(unsigned int sz) { void *r = malloc(sz); if (!r) @@ -290,8 +288,7 @@ xmalloc(sz) } static uint32_t * -xlalloc(sz) - unsigned int sz; +xlalloc(unsigned int sz) { uint32_t *r = (uint32_t *)malloc(sz * sizeof(uint32_t)); if (!r) @@ -300,9 +297,7 @@ xlalloc(sz) } static uint32_t * -xrelalloc(old, sz) - uint32_t *old; - unsigned int sz; +xrelalloc(uint32_t *old, unsigned int sz) { uint32_t *r = (uint32_t *)realloc((char *)old, sz * sizeof(uint32_t)); @@ -312,10 +307,7 @@ xrelalloc(old, sz) } void -set_map(map, list, flag) - rune_map *map; - rune_list *list; - uint32_t flag; +set_map(rune_map *map, rune_list *list, uint32_t flag) { while (list) { rune_list *nlist = list->next; @@ -325,9 +317,7 @@ set_map(map, list, flag) } void -set_digitmap(map, list) - rune_map *map; - rune_list *list; +set_digitmap(rune_map *map, rune_list *list) { int32_t i; @@ -347,10 +337,7 @@ set_digitmap(map, list) } void -add_map(map, list, flag) - rune_map *map; - rune_list *list; - uint32_t flag; +add_map(rune_map *map, rune_list *list, uint32_t flag) { int32_t i; rune_list *lr = 0; @@ -555,7 +542,7 @@ add_map(map, list, flag) } static void -dump_tables() +dump_tables(void) { int x, first_d, curr_d; rune_list *list; diff --git a/usr.bin/mkstr/Makefile b/usr.bin/mkstr/Makefile index 805c013d4a97..b4e36209ffcd 100644 --- a/usr.bin/mkstr/Makefile +++ b/usr.bin/mkstr/Makefile @@ -3,4 +3,6 @@ PROG= mkstr +WARNS?= 2 + .include diff --git a/usr.bin/mktemp/mktemp.c b/usr.bin/mktemp/mktemp.c index b58ac4b9d055..72b89d607889 100644 --- a/usr.bin/mktemp/mktemp.c +++ b/usr.bin/mktemp/mktemp.c @@ -143,7 +143,7 @@ main(int argc, char **argv) } static void -usage() +usage(void) { fprintf(stderr, "usage: mktemp [-d] [-q] [-t prefix] [-u] template ...\n"); diff --git a/usr.bin/mkuzip/Makefile b/usr.bin/mkuzip/Makefile index 11ed0831f14c..c5eac201776b 100644 --- a/usr.bin/mkuzip/Makefile +++ b/usr.bin/mkuzip/Makefile @@ -6,6 +6,5 @@ MAN= mkuzip.8 DPADD= ${LIBZ} LDADD= -lz -WARNS?= 6 .include diff --git a/usr.bin/msgs/Makefile b/usr.bin/msgs/Makefile index 9f59c6a598cc..21cb15155568 100644 --- a/usr.bin/msgs/Makefile +++ b/usr.bin/msgs/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= msgs -WARNS?= 6 DPADD= ${LIBTERMCAP} LDADD= -ltermcap diff --git a/usr.bin/nc/Makefile b/usr.bin/nc/Makefile index a4400bcddc90..84d20d3f2e83 100644 --- a/usr.bin/nc/Makefile +++ b/usr.bin/nc/Makefile @@ -9,4 +9,6 @@ CFLAGS+=-DIPSEC LDADD= -lipsec DPADD= ${LIBIPSEC} +WARNS?= 1 + .include diff --git a/usr.bin/ncplist/Makefile b/usr.bin/ncplist/Makefile index 8e6d18991a4f..b5baed47d7b2 100644 --- a/usr.bin/ncplist/Makefile +++ b/usr.bin/ncplist/Makefile @@ -2,6 +2,8 @@ PROG= ncplist +WARNS?= 0 + DPADD= ${LIBNCP} ${LIBIPX} LDADD= -lncp -lipx diff --git a/usr.bin/ncplist/ncplist.1 b/usr.bin/ncplist/ncplist.1 index 753be8fc6197..335fcc712876 100644 --- a/usr.bin/ncplist/ncplist.1 +++ b/usr.bin/ncplist/ncplist.1 @@ -69,7 +69,7 @@ Displays mounted volumes on a given .Sh IMPLEMENTATION NOTES This utility is provided mostly for educational purposes. .Sh FILES -.Bl -tag -width /var/log/wtmp -compact +.Bl -tag -width /var/log/utx.log -compact .It Pa ~/.nwfsrc keeps description for each connection. See diff --git a/usr.bin/netstat/Makefile b/usr.bin/netstat/Makefile index df31aecaf94e..8f009016ff8d 100644 --- a/usr.bin/netstat/Makefile +++ b/usr.bin/netstat/Makefile @@ -4,7 +4,7 @@ .include PROG= netstat -SRCS= if.c inet.c main.c mbuf.c mroute.c route.c \ +SRCS= if.c inet.c main.c mbuf.c mroute.c netisr.c route.c \ unix.c atalk.c mroute6.c ipsec.c bpf.c pfkey.c sctp.c WARNS?= 3 diff --git a/usr.bin/netstat/if.c b/usr.bin/netstat/if.c index aa28a6fa2651..50c8fdc821d3 100644 --- a/usr.bin/netstat/if.c +++ b/usr.bin/netstat/if.c @@ -198,8 +198,8 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *)) u_long imcasts; u_long oerrors; u_long ierrors; + u_long idrops; u_long collisions; - short timer; int drops; struct sockaddr *sa = NULL; char name[IFNAMSIZ]; @@ -225,16 +225,14 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *)) printf("%-7.7s", "Name"); else printf("%-5.5s", "Name"); - printf(" %5.5s %-13.13s %-17.17s %8.8s %5.5s", - "Mtu", "Network", "Address", "Ipkts", "Ierrs"); + printf(" %5.5s %-13.13s %-17.17s %8.8s %5.5s %5.5s", + "Mtu", "Network", "Address", "Ipkts", "Ierrs", "Idrop"); if (bflag) printf(" %10.10s","Ibytes"); printf(" %8.8s %5.5s", "Opkts", "Oerrs"); if (bflag) printf(" %10.10s","Obytes"); printf(" %5s", "Coll"); - if (tflag) - printf(" %s", "Time"); if (dflag) printf(" %s", "Drop"); putchar('\n'); @@ -285,8 +283,8 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *)) imcasts = ifnet.if_imcasts; oerrors = ifnet.if_oerrors; ierrors = ifnet.if_ierrors; + idrops = ifnet.if_iqdrops; collisions = ifnet.if_collisions; - timer = ifnet.if_timer; drops = ifnet.if_snd.ifq_drops; if (ifaddraddr == 0) { @@ -423,6 +421,7 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *)) show_stat("lu", 8, ipackets, link_layer|network_layer); show_stat("lu", 5, ierrors, link_layer); + show_stat("lu", 5, idrops, link_layer); if (bflag) show_stat("lu", 10, ibytes, link_layer|network_layer); @@ -432,8 +431,6 @@ intpr(int interval1, u_long ifnetaddr, void (*pfunc)(char *)) show_stat("lu", 10, obytes, link_layer|network_layer); show_stat("NRSlu", 5, collisions, link_layer); - if (tflag) - show_stat("LSd", 4, timer, link_layer); if (dflag) show_stat("LSd", 4, drops, link_layer); putchar('\n'); @@ -513,6 +510,7 @@ struct iftot { char ift_name[IFNAMSIZ]; /* interface name */ u_long ift_ip; /* input packets */ u_long ift_ie; /* input errors */ + u_long ift_id; /* input drops */ u_long ift_op; /* output packets */ u_long ift_oe; /* output errors */ u_long ift_co; /* collisions */ @@ -598,8 +596,9 @@ banner: printf("%17s %14s %16s", "input", interesting ? interesting->ift_name : "(Total)", "output"); putchar('\n'); - printf("%10s %5s %10s %10s %5s %10s %5s", - "packets", "errs", "bytes", "packets", "errs", "bytes", "colls"); + printf("%10s %5s %5s %10s %10s %5s %10s %5s", + "packets", "errs", "idrops", "bytes", "packets", "errs", "bytes", + "colls"); if (dflag) printf(" %5.5s", "drops"); putchar('\n'); @@ -615,6 +614,7 @@ loop: if (!first) { show_stat("lu", 10, ifnet.if_ipackets - ip->ift_ip, 1); show_stat("lu", 5, ifnet.if_ierrors - ip->ift_ie, 1); + show_stat("lu", 5, ifnet.if_iqdrops - ip->ift_id, 1); show_stat("lu", 10, ifnet.if_ibytes - ip->ift_ib, 1); show_stat("lu", 10, ifnet.if_opackets - ip->ift_op, 1); show_stat("lu", 5, ifnet.if_oerrors - ip->ift_oe, 1); @@ -636,6 +636,7 @@ loop: } else { sum->ift_ip = 0; sum->ift_ie = 0; + sum->ift_id = 0; sum->ift_ib = 0; sum->ift_op = 0; sum->ift_oe = 0; @@ -651,6 +652,7 @@ loop: } sum->ift_ip += ifnet.if_ipackets; sum->ift_ie += ifnet.if_ierrors; + sum->ift_id += ifnet.if_iqdrops; sum->ift_ib += ifnet.if_ibytes; sum->ift_op += ifnet.if_opackets; sum->ift_oe += ifnet.if_oerrors; @@ -662,6 +664,7 @@ loop: if (!first) { show_stat("lu", 10, sum->ift_ip - total->ift_ip, 1); show_stat("lu", 5, sum->ift_ie - total->ift_ie, 1); + show_stat("lu", 5, sum->ift_id - total->ift_id, 1); show_stat("lu", 10, sum->ift_ib - total->ift_ib, 1); show_stat("lu", 10, sum->ift_op - total->ift_op, 1); show_stat("lu", 5, sum->ift_oe - total->ift_oe, 1); @@ -676,6 +679,8 @@ loop: if (!first) putchar('\n'); fflush(stdout); + if ((noutputs != 0) && (--noutputs == 0)) + exit(0); oldmask = sigblock(sigmask(SIGALRM)); while (!signalled) sigpause(0); diff --git a/usr.bin/netstat/ipsec.c b/usr.bin/netstat/ipsec.c index bfd8ce01ee85..d3276bf27615 100644 --- a/usr.bin/netstat/ipsec.c +++ b/usr.bin/netstat/ipsec.c @@ -418,6 +418,7 @@ esp_stats(u_long off, const char *name, int family __unused, int proto __unused) static void print_ipcompstats(const struct ipcompstat *ipcompstat) { + uint32_t version; #define p32(f, m) if (ipcompstat->f || sflag <= 1) \ printf("\t%u" m, (unsigned int)ipcompstat->f, plural(ipcompstat->f)) #define p64(f, m) if (ipcompstat->f || sflag <= 1) \ @@ -425,6 +426,11 @@ print_ipcompstats(const struct ipcompstat *ipcompstat) #define hist(f, n, t) \ ipsec_hist_new((f), sizeof(f)/sizeof(f[0]), (n), (t)); +#ifndef IPCOMPSTAT_VERSION + version = 0; +#else + version = ipcompstat->version; +#endif p32(ipcomps_hdrops, " packet%s shorter than header shows\n"); p32(ipcomps_nopf, " packet%s dropped; protocol family not supported\n"); p32(ipcomps_notdb, " packet%s dropped; no TDB\n"); @@ -441,6 +447,10 @@ print_ipcompstats(const struct ipcompstat *ipcompstat) p32(ipcomps_pdrops, " packet%s blocked due to policy\n"); p32(ipcomps_crypto, " crypto processing failure%s\n"); hist(ipcompstat->ipcomps_hist, ipsec_compnames, "COMP output"); + if (version >= 1) { + p32(ipcomps_threshold, " packet%s sent uncompressed; size < compr. algo. threshold\n"); + p32(ipcomps_uncompr, " packet%s sent uncompressed; compression was useless\n"); + } #undef p32 #undef p64 diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c index ebbe1d24fbf6..f54db4ee700f 100644 --- a/usr.bin/netstat/main.c +++ b/usr.bin/netstat/main.c @@ -186,6 +186,8 @@ static struct nlist nl[] = { { .n_name = "_mfctablesize" }, #define N_ARPSTAT 55 { .n_name = "_arpstat" }, +#define N_UNP_SPHEAD 56 + { .n_name = "unp_sphead" }, { .n_name = NULL }, }; @@ -332,12 +334,13 @@ int hflag; /* show counters in human readable format */ int iflag; /* show interfaces */ int Lflag; /* show size of listen queues */ int mflag; /* show memory stats */ +int noutputs = 0; /* how much outputs before we exit */ int numeric_addr; /* show addresses numerically */ int numeric_port; /* show ports numerically */ static int pflag; /* show given protocol */ +int Qflag; /* show netisr information */ int rflag; /* show routing tables (or routing stats) */ int sflag; /* show protocol statistics */ -int tflag; /* show i/f watchdog timers */ int Wflag; /* wide display */ int xflag; /* extra information, includes all socket buffer info */ int zflag; /* zero stats */ @@ -358,7 +361,8 @@ main(int argc, char *argv[]) af = AF_UNSPEC; - while ((ch = getopt(argc, argv, "AaBbdf:ghI:iLlM:mN:np:rSstuWw:xz")) != -1) + while ((ch = getopt(argc, argv, "AaBbdf:ghI:iLlM:mN:np:Qq:rSsuWw:xz")) + != -1) switch(ch) { case 'A': Aflag = 1; @@ -444,6 +448,14 @@ main(int argc, char *argv[]) } pflag = 1; break; + case 'Q': + Qflag = 1; + break; + case 'q': + noutputs = atoi(optarg); + if (noutputs != 0) + noutputs++; + break; case 'r': rflag = 1; break; @@ -453,9 +465,6 @@ main(int argc, char *argv[]) case 'S': numeric_addr = 1; break; - case 't': - tflag = 1; - break; case 'u': af = AF_UNIX; break; @@ -520,6 +529,14 @@ main(int argc, char *argv[]) mbpr(NULL, 0); exit(0); } + if (Qflag) { + if (!live) { + if (kread(0, NULL, 0) == 0) + netisr_stats(kvmd); + } else + netisr_stats(NULL); + exit(0); + } #if 0 /* * Keep file descriptors open to avoid overhead @@ -601,7 +618,8 @@ main(int argc, char *argv[]) #endif /* NETGRAPH */ if ((af == AF_UNIX || af == AF_UNSPEC) && !sflag) unixpr(nl[N_UNP_COUNT].n_value, nl[N_UNP_GENCNT].n_value, - nl[N_UNP_DHEAD].n_value, nl[N_UNP_SHEAD].n_value); + nl[N_UNP_DHEAD].n_value, nl[N_UNP_SHEAD].n_value, + nl[N_UNP_SPHEAD].n_value); exit(0); } @@ -775,12 +793,12 @@ name2protox(const char *name) static void usage(void) { - (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", + (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", "usage: netstat [-AaLnSWx] [-f protocol_family | -p protocol]\n" " [-M core] [-N system]", -" netstat -i | -I interface [-abdhntW] [-f address_family]\n" +" netstat -i | -I interface [-abdhnW] [-f address_family]\n" " [-M core] [-N system]", -" netstat -w wait [-I interface] [-d] [-M core] [-N system]", +" netstat -w wait [-I interface] [-d] [-M core] [-N system] [-q howmany]", " netstat -s [-s] [-z] [-f protocol_family | -p protocol]\n" " [-M core] [-N system]", " netstat -i | -I interface -s [-f protocol_family | -p protocol]\n" @@ -790,6 +808,7 @@ usage(void) " netstat -r [-AanW] [-f address_family] [-M core] [-N system]", " netstat -rs [-s] [-M core] [-N system]", " netstat -g [-W] [-f address_family] [-M core] [-N system]", -" netstat -gs [-s] [-f address_family] [-M core] [-N system]"); +" netstat -gs [-s] [-f address_family] [-M core] [-N system]", +" netstat -Q"); exit(1); } diff --git a/usr.bin/netstat/netisr.c b/usr.bin/netstat/netisr.c new file mode 100644 index 000000000000..733a847b828d --- /dev/null +++ b/usr.bin/netstat/netisr.c @@ -0,0 +1,518 @@ +/*- + * Copyright (c) 2010 Juniper Networks, Inc. + * All rights reserved. + * + * This software was developed by Robert N. M. Watson under contract + * to Juniper Networks, Inc. + * + * 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. + */ + +#include + +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include + +#define _WANT_NETISR_INTERNAL +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "netstat.h" + +/* + * Print statistics for the kernel netisr subsystem. + */ +static u_int bindthreads; +static u_int maxthreads; +static u_int numthreads; + +static u_int defaultqlimit; +static u_int maxqlimit; + +static u_int direct; +static u_int direct_force; + +static struct sysctl_netisr_proto *proto_array; +static u_int proto_array_len; + +static struct sysctl_netisr_workstream *workstream_array; +static u_int workstream_array_len; + +static struct sysctl_netisr_work *work_array; +static u_int work_array_len; + +static u_int *nws_array; + +static u_int maxprot; + +static void +netisr_load_kvm_uint(kvm_t *kd, char *name, u_int *p) +{ + struct nlist nl[] = { + { .n_name = name }, + { .n_name = NULL }, + }; + int ret; + + ret = kvm_nlist(kd, nl); + if (ret < 0) + errx(-1, "%s: kvm_nlist(%s): %s", __func__, name, + kvm_geterr(kd)); + if (ret != 0) + errx(-1, "%s: kvm_nlist(%s): unresolved symbol", __func__, + name); + if (kvm_read(kd, nl[0].n_value, p, sizeof(*p)) != sizeof(*p)) + errx(-1, "%s: kvm_read(%s): %s", __func__, name, + kvm_geterr(kd)); +} + +/* + * Load a nul-terminated string from KVM up to 'limit', guarantee that the + * string in local memory is nul-terminated. + */ +static void +netisr_load_kvm_string(kvm_t *kd, uintptr_t addr, char *dest, u_int limit) +{ + u_int i; + + for (i = 0; i < limit; i++) { + if (kvm_read(kd, addr + i, &dest[i], sizeof(dest[i])) != + sizeof(dest[i])) + err(-1, "%s: kvm_read: %s", __func__, + kvm_geterr(kd)); + if (dest[i] == '\0') + break; + } + dest[limit - 1] = '\0'; +} + +static const char * +netisr_proto2name(u_int proto) +{ + u_int i; + + for (i = 0; i < proto_array_len; i++) { + if (proto_array[i].snp_proto == proto) + return (proto_array[i].snp_name); + } + return ("unknown"); +} + +static int +netisr_protoispresent(u_int proto) +{ + u_int i; + + for (i = 0; i < proto_array_len; i++) { + if (proto_array[i].snp_proto == proto) + return (1); + } + return (0); +} + +static void +netisr_load_kvm_config(kvm_t *kd) +{ + + netisr_load_kvm_uint(kd, "_netisr_bindthreads", &bindthreads); + netisr_load_kvm_uint(kd, "_netisr_maxthreads", &maxthreads); + netisr_load_kvm_uint(kd, "_nws_count", &numthreads); + + netisr_load_kvm_uint(kd, "_netisr_defaultqlimit", &defaultqlimit); + netisr_load_kvm_uint(kd, "_netisr_maxqlimit", &maxqlimit); + + netisr_load_kvm_uint(kd, "_netisr_direct", &direct); + netisr_load_kvm_uint(kd, "_netisr_direct_force", &direct_force); +} + +static void +netisr_load_sysctl_uint(const char *name, u_int *p) +{ + size_t retlen; + + retlen = sizeof(u_int); + if (sysctlbyname(name, p, &retlen, NULL, 0) < 0) + err(-1, "%s", name); + if (retlen != sizeof(u_int)) + errx(-1, "%s: invalid len %ju", name, (uintmax_t)retlen); +} + +static void +netisr_load_sysctl_config(void) +{ + + netisr_load_sysctl_uint("net.isr.bindthreads", &bindthreads); + netisr_load_sysctl_uint("net.isr.maxthreads", &maxthreads); + netisr_load_sysctl_uint("net.isr.numthreads", &numthreads); + + netisr_load_sysctl_uint("net.isr.defaultqlimit", &defaultqlimit); + netisr_load_sysctl_uint("net.isr.maxqlimit", &maxqlimit); + + netisr_load_sysctl_uint("net.isr.direct", &direct); + netisr_load_sysctl_uint("net.isr.direct_force", &direct_force); +} + +static void +netisr_load_kvm_proto(kvm_t *kd) +{ + struct nlist nl[] = { +#define NLIST_NETISR_PROTO 0 + { .n_name = "_netisr_proto" }, + { .n_name = NULL }, + }; + struct netisr_proto *np_array, *npp; + u_int i, protocount; + struct sysctl_netisr_proto *snpp; + size_t len; + int ret; + + /* + * Kernel compile-time and user compile-time definitions of + * NETISR_MAXPROT must match, as we use that to size work arrays. + */ + netisr_load_kvm_uint(kd, "_netisr_maxprot", &maxprot); + if (maxprot != NETISR_MAXPROT) + errx(-1, "%s: NETISR_MAXPROT mismatch", __func__); + len = maxprot * sizeof(*np_array); + np_array = malloc(len); + if (np_array == NULL) + err(-1, "%s: malloc", __func__); + ret = kvm_nlist(kd, nl); + if (ret < 0) + errx(-1, "%s: kvm_nlist(_netisr_proto): %s", __func__, + kvm_geterr(kd)); + if (ret != 0) + errx(-1, "%s: kvm_nlist(_netisr_proto): unresolved symbol", + __func__); + if (kvm_read(kd, nl[NLIST_NETISR_PROTO].n_value, np_array, len) != + (ssize_t)len) + errx(-1, "%s: kvm_read(_netisr_proto): %s", __func__, + kvm_geterr(kd)); + + /* + * Size and allocate memory to hold only live protocols. + */ + protocount = 0; + for (i = 0; i < maxprot; i++) { + if (np_array[i].np_name == NULL) + continue; + protocount++; + } + proto_array = calloc(protocount, sizeof(*proto_array)); + if (proto_array == NULL) + err(-1, "malloc"); + protocount = 0; + for (i = 0; i < maxprot; i++) { + npp = &np_array[i]; + if (npp->np_name == NULL) + continue; + snpp = &proto_array[protocount]; + snpp->snp_version = sizeof(*snpp); + netisr_load_kvm_string(kd, (uintptr_t)npp->np_name, + snpp->snp_name, sizeof(snpp->snp_name)); + snpp->snp_proto = i; + snpp->snp_qlimit = npp->np_qlimit; + snpp->snp_policy = npp->np_policy; + if (npp->np_m2flow != NULL) + snpp->snp_flags |= NETISR_SNP_FLAGS_M2FLOW; + if (npp->np_m2cpuid != NULL) + snpp->snp_flags |= NETISR_SNP_FLAGS_M2CPUID; + if (npp->np_drainedcpu != NULL) + snpp->snp_flags |= NETISR_SNP_FLAGS_DRAINEDCPU; + protocount++; + } + proto_array_len = protocount; + free(np_array); +} + +static void +netisr_load_sysctl_proto(void) +{ + size_t len; + + if (sysctlbyname("net.isr.proto", NULL, &len, NULL, 0) < 0) + err(-1, "net.isr.proto: query len"); + if (len % sizeof(*proto_array) != 0) + errx(-1, "net.isr.proto: invalid len"); + proto_array = malloc(len); + if (proto_array == NULL) + err(-1, "malloc"); + if (sysctlbyname("net.isr.proto", proto_array, &len, NULL, 0) < 0) + err(-1, "net.isr.proto: query data"); + if (len % sizeof(*proto_array) != 0) + errx(-1, "net.isr.proto: invalid len"); + proto_array_len = len / sizeof(*proto_array); + if (proto_array_len < 1) + errx(-1, "net.isr.proto: no data"); + if (proto_array[0].snp_version != sizeof(proto_array[0])) + errx(-1, "net.isr.proto: invalid version"); +} + +static void +netisr_load_kvm_workstream(kvm_t *kd) +{ + struct nlist nl[] = { +#define NLIST_NWS_ARRAY 0 + { .n_name = "_nws_array" }, + { .n_name = NULL }, + }; + struct netisr_workstream nws; + struct sysctl_netisr_workstream *snwsp; + struct sysctl_netisr_work *snwp; + struct netisr_work *nwp; + struct nlist nl_nws[2]; + u_int counter, cpuid, proto, wsid; + size_t len; + int ret; + + len = numthreads * sizeof(*nws_array); + nws_array = malloc(len); + if (nws_array == NULL) + err(-1, "malloc"); + ret = kvm_nlist(kd, nl); + if (ret < 0) + errx(-1, "%s: kvm_nlist: %s", __func__, kvm_geterr(kd)); + if (ret != 0) + errx(-1, "%s: kvm_nlist: unresolved symbol", __func__); + if (kvm_read(kd, nl[NLIST_NWS_ARRAY].n_value, nws_array, len) != + (ssize_t)len) + errx(-1, "%s: kvm_read(_nws_array): %s", __func__, + kvm_geterr(kd)); + workstream_array = calloc(numthreads, sizeof(*workstream_array)); + if (workstream_array == NULL) + err(-1, "calloc"); + workstream_array_len = numthreads; + work_array = calloc(numthreads * proto_array_len, sizeof(*work_array)); + if (work_array == NULL) + err(-1, "calloc"); + counter = 0; + for (wsid = 0; wsid < numthreads; wsid++) { + cpuid = nws_array[wsid]; + if (kvm_dpcpu_setcpu(kd, cpuid) < 0) + errx(-1, "%s: kvm_dpcpu_setcpu(%u): %s", __func__, + cpuid, kvm_geterr(kd)); + bzero(nl_nws, sizeof(nl_nws)); + nl_nws[0].n_name = "_nws"; + ret = kvm_nlist(kd, nl_nws); + if (ret < 0) + errx(-1, "%s: kvm_nlist looking up nws on CPU %u: %s", + __func__, cpuid, kvm_geterr(kd)); + if (ret != 0) + errx(-1, "%s: kvm_nlist(nws): unresolved symbol on " + "CPU %u", __func__, cpuid); + if (kvm_read(kd, nl_nws[0].n_value, &nws, sizeof(nws)) != + sizeof(nws)) + errx(-1, "%s: kvm_read(nw): %s", __func__, + kvm_geterr(kd)); + snwsp = &workstream_array[wsid]; + snwsp->snws_version = sizeof(*snwsp); + snwsp->snws_wsid = cpuid; + snwsp->snws_cpu = cpuid; + if (nws.nws_intr_event != NULL) + snwsp->snws_flags |= NETISR_SNWS_FLAGS_INTR; + + /* + * Extract the CPU's per-protocol work information. + */ + printf("counting to maxprot: %u\n", maxprot); + for (proto = 0; proto < maxprot; proto++) { + if (!netisr_protoispresent(proto)) + continue; + nwp = &nws.nws_work[proto]; + snwp = &work_array[counter]; + snwp->snw_version = sizeof(*snwp); + snwp->snw_wsid = cpuid; + snwp->snw_proto = proto; + snwp->snw_len = nwp->nw_len; + snwp->snw_watermark = nwp->nw_watermark; + snwp->snw_dispatched = nwp->nw_dispatched; + snwp->snw_hybrid_dispatched = + nwp->nw_hybrid_dispatched; + snwp->snw_qdrops = nwp->nw_qdrops; + snwp->snw_queued = nwp->nw_queued; + snwp->snw_handled = nwp->nw_handled; + counter++; + } + } + work_array_len = counter; +} + +static void +netisr_load_sysctl_workstream(void) +{ + size_t len; + + if (sysctlbyname("net.isr.workstream", NULL, &len, NULL, 0) < 0) + err(-1, "net.isr.workstream: query len"); + if (len % sizeof(*workstream_array) != 0) + errx(-1, "net.isr.workstream: invalid len"); + workstream_array = malloc(len); + if (workstream_array == NULL) + err(-1, "malloc"); + if (sysctlbyname("net.isr.workstream", workstream_array, &len, NULL, + 0) < 0) + err(-1, "net.isr.workstream: query data"); + if (len % sizeof(*workstream_array) != 0) + errx(-1, "net.isr.workstream: invalid len"); + workstream_array_len = len / sizeof(*workstream_array); + if (workstream_array_len < 1) + errx(-1, "net.isr.workstream: no data"); + if (workstream_array[0].snws_version != sizeof(workstream_array[0])) + errx(-1, "net.isr.workstream: invalid version"); +} + +static void +netisr_load_sysctl_work(void) +{ + size_t len; + + if (sysctlbyname("net.isr.work", NULL, &len, NULL, 0) < 0) + err(-1, "net.isr.work: query len"); + if (len % sizeof(*work_array) != 0) + errx(-1, "net.isr.work: invalid len"); + work_array = malloc(len); + if (work_array == NULL) + err(-1, "malloc"); + if (sysctlbyname("net.isr.work", work_array, &len, NULL, 0) < 0) + err(-1, "net.isr.work: query data"); + if (len % sizeof(*work_array) != 0) + errx(-1, "net.isr.work: invalid len"); + work_array_len = len / sizeof(*work_array); + if (work_array_len < 1) + errx(-1, "net.isr.work: no data"); + if (work_array[0].snw_version != sizeof(work_array[0])) + errx(-1, "net.isr.work: invalid version"); +} + +static void +netisr_print_proto(struct sysctl_netisr_proto *snpp) +{ + + printf("%-6s", snpp->snp_name); + printf(" %5u", snpp->snp_proto); + printf(" %6u", snpp->snp_qlimit); + printf(" %6s", + (snpp->snp_policy == NETISR_POLICY_SOURCE) ? "source" : + (snpp->snp_policy == NETISR_POLICY_FLOW) ? "flow" : + (snpp->snp_policy == NETISR_POLICY_CPU) ? "cpu" : "-"); + printf(" %s%s%s\n", + (snpp->snp_flags & NETISR_SNP_FLAGS_M2CPUID) ? "C" : "-", + (snpp->snp_flags & NETISR_SNP_FLAGS_DRAINEDCPU) ? "D" : "-", + (snpp->snp_flags & NETISR_SNP_FLAGS_M2FLOW) ? "F" : "-"); +} + +static void +netisr_print_workstream(struct sysctl_netisr_workstream *snwsp) +{ + struct sysctl_netisr_work *snwp; + int first; + u_int i; + + first = 1; + for (i = 0; i < work_array_len; i++) { + snwp = &work_array[i]; + if (snwp->snw_wsid != snwsp->snws_wsid) + continue; + if (first) { + printf("%4u", snwsp->snws_wsid); + printf(" %3u", snwsp->snws_cpu); + first = 0; + } else + printf("%4s %3s", "", ""); + printf("%2s", ""); + printf("%-6s", netisr_proto2name(snwp->snw_proto)); + printf(" %5u", snwp->snw_len); + printf(" %5u", snwp->snw_watermark); + printf(" %8ju", snwp->snw_dispatched); + printf(" %8ju", snwp->snw_hybrid_dispatched); + printf(" %8ju", snwp->snw_qdrops); + printf(" %8ju", snwp->snw_queued); + printf(" %8ju", snwp->snw_handled); + printf("\n"); + } +} + +void +netisr_stats(void *kvmd) +{ + struct sysctl_netisr_workstream *snwsp; + struct sysctl_netisr_proto *snpp; + kvm_t *kd = kvmd; + u_int i; + + if (live) { + netisr_load_sysctl_config(); + netisr_load_sysctl_proto(); + netisr_load_sysctl_workstream(); + netisr_load_sysctl_work(); + } else { + if (kd == NULL) + errx(-1, "netisr_stats: !live but !kd"); + netisr_load_kvm_config(kd); + netisr_load_kvm_proto(kd); + netisr_load_kvm_workstream(kd); /* Also does work. */ + } + + printf("Configuration:\n"); + printf("%-25s %12s %12s\n", "Setting", "Current", "Limit"); + printf("%-25s %12u %12u\n", "Thread count", numthreads, maxthreads); + printf("%-25s %12u %12u\n", "Default queue limit", defaultqlimit, + maxqlimit); + printf("%-25s %12s %12s\n", "Direct dispatch", + direct ? "enabled" : "disabled", "n/a"); + printf("%-25s %12s %12s\n", "Forced direct dispatch", + direct_force ? "enabled" : "disabled", "n/a"); + printf("%-25s %12s %12s\n", "Threads bound to CPUs", + bindthreads ? "enabled" : "disabled", "n/a"); + printf("\n"); + + printf("Protocols:\n"); + printf("%-6s %5s %6s %-6s %-5s\n", "Name", "Proto", "QLimit", + "Policy", "Flags"); + for (i = 0; i < proto_array_len; i++) { + snpp = &proto_array[i]; + netisr_print_proto(snpp); + } + printf("\n"); + + printf("Workstreams:\n"); + printf("%4s %3s ", "WSID", "CPU"); + printf("%2s", ""); + printf("%-6s %5s %5s %8s %8s %8s %8s %8s\n", "Name", "Len", "WMark", + "Disp'd", "HDisp'd", "QDrops", "Queued", "Handled"); + for (i = 0; i < workstream_array_len; i++) { + snwsp = &workstream_array[i]; + netisr_print_workstream(snwsp); + } +} diff --git a/usr.bin/netstat/netstat.1 b/usr.bin/netstat/netstat.1 index cddaaaf568ab..6cf895b455a4 100644 --- a/usr.bin/netstat/netstat.1 +++ b/usr.bin/netstat/netstat.1 @@ -32,7 +32,7 @@ .\" @(#)netstat.1 8.8 (Berkeley) 4/18/94 .\" $FreeBSD$ .\" -.Dd July 9, 2009 +.Dd February 22, 2010 .Dt NETSTAT 1 .Os .Sh NAME @@ -92,7 +92,7 @@ is present, display socket buffer and tcp timer statistics for each internet soc .Bk -words .Nm .Fl i | I Ar interface -.Op Fl abdhntW +.Op Fl abdhnW .Op Fl f Ar address_family .Op Fl M Ar core .Op Fl N Ar system @@ -123,9 +123,6 @@ If .Fl h is also present, print all counters in human readable form. If -.Fl t -is also present, show the contents of watchdog timers. -If .Fl W is also present, print interface names using a wider field size. .It Xo @@ -136,6 +133,7 @@ is also present, print interface names using a wider field size. .Op Fl d .Op Fl M Ar core .Op Fl N Ar system +.Op Fl q Ar howmany .Ek .Xc At intervals of @@ -146,6 +144,11 @@ traffic on all configured network interfaces or a single .Ar interface . If +.Fl q +is also present, exit after +.Ar howmany +outputs. +If .Fl d is also present, show the number of dropped packets. .It Xo @@ -289,6 +292,15 @@ Show multicast routing statistics. If .Fl s is repeated, counters with a value of zero are suppressed. +.It Xo +.Bk -words +.Nm +.Fl Q +.Ek +.Xc +Show +.Xr netisr 9 +statistics. .El .Pp Some options have the general meaning: diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h index f834495e32b4..da3f8f38d593 100644 --- a/usr.bin/netstat/netstat.h +++ b/usr.bin/netstat/netstat.h @@ -45,11 +45,11 @@ extern int hflag; /* show counters in human readable format */ extern int iflag; /* show interfaces */ extern int Lflag; /* show size of listen queues */ extern int mflag; /* show memory stats */ +extern int noutputs; /* how much outputs before we exit */ extern int numeric_addr; /* show addresses numerically */ extern int numeric_port; /* show ports numerically */ extern int rflag; /* show routing tables (or routing stats) */ extern int sflag; /* show protocol statistics */ -extern int tflag; /* show i/f watchdog timers */ extern int Wflag; /* wide display */ extern int xflag; /* extended display, includes all socket buffer info */ extern int zflag; /* zero stats */ @@ -67,6 +67,9 @@ const char *plural(uintmax_t); const char *plurales(uintmax_t); const char *pluralies(uintmax_t); +struct sockaddr; +struct socket; +struct xsocket; int sotoxsocket(struct socket *, struct xsocket *); void protopr(u_long, const char *, int, int); void tcp_stats(u_long, const char *, int, int); @@ -112,6 +115,8 @@ void pfkey_stats(u_long, const char *, int, int); void mbpr(void *, u_long); +void netisr_stats(void *); + void hostpr(u_long, u_long); void impstats(u_long, u_long); @@ -150,7 +155,7 @@ void ddp_stats(u_long, const char *, int, int); void netgraphprotopr(u_long, const char *, int, int); #endif -void unixpr(u_long, u_long, u_long, u_long); +void unixpr(u_long, u_long, u_long, u_long, u_long); void esis_stats(u_long, const char *, int, int); void clnp_stats(u_long, const char *, int, int); diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c index 735612b867a9..2e9e919f109b 100644 --- a/usr.bin/netstat/route.c +++ b/usr.bin/netstat/route.c @@ -1008,11 +1008,11 @@ rt_stats(u_long rtsaddr, u_long rttaddr) #define p(f, m) if (rtstat.f || sflag <= 1) \ printf(m, rtstat.f, plural(rtstat.f)) - p(rts_badredirect, "\t%u bad routing redirect%s\n"); - p(rts_dynamic, "\t%u dynamically created route%s\n"); - p(rts_newgateway, "\t%u new gateway%s due to redirects\n"); - p(rts_unreach, "\t%u destination%s found unreachable\n"); - p(rts_wildcard, "\t%u use%s of a wildcard route\n"); + p(rts_badredirect, "\t%hu bad routing redirect%s\n"); + p(rts_dynamic, "\t%hu dynamically created route%s\n"); + p(rts_newgateway, "\t%hu new gateway%s due to redirects\n"); + p(rts_unreach, "\t%hu destination%s found unreachable\n"); + p(rts_wildcard, "\t%hu use%s of a wildcard route\n"); #undef p if (rttrash || sflag <= 1) diff --git a/usr.bin/netstat/unix.c b/usr.bin/netstat/unix.c index 209fc8d497be..0ad8f34a52a2 100644 --- a/usr.bin/netstat/unix.c +++ b/usr.bin/netstat/unix.c @@ -193,21 +193,37 @@ fail: } void -unixpr(u_long count_off, u_long gencnt_off, u_long dhead_off, u_long shead_off) +unixpr(u_long count_off, u_long gencnt_off, u_long dhead_off, u_long shead_off, + u_long sphead_off) { char *buf; int ret, type; struct xsocket *so; struct xunpgen *xug, *oxug; struct xunpcb *xunp; + u_long head_off; for (type = SOCK_STREAM; type <= SOCK_SEQPACKET; type++) { if (live) ret = pcblist_sysctl(type, &buf); - else - ret = pcblist_kvm(count_off, gencnt_off, - type == SOCK_STREAM ? shead_off : - (type == SOCK_DGRAM ? dhead_off : 0), &buf); + else { + head_off = 0; + switch (type) { + case SOCK_STREAM: + head_off = shead_off; + break; + + case SOCK_DGRAM: + head_off = dhead_off; + break; + + case SOCK_SEQPACKET: + head_off = sphead_off; + break; + } + ret = pcblist_kvm(count_off, gencnt_off, head_off, + &buf); + } if (ret == -1) continue; if (ret < 0) diff --git a/usr.bin/newkey/Makefile b/usr.bin/newkey/Makefile index 1460f8719419..b3b5b51d8c9f 100644 --- a/usr.bin/newkey/Makefile +++ b/usr.bin/newkey/Makefile @@ -11,6 +11,4 @@ MAN= newkey.8 DPADD= ${LIBRPCSVC} ${LIBMP} ${LIBCRYPTO} LDADD= -lrpcsvc -lmp -lcrypto -WARNS?= 6 - .include diff --git a/usr.bin/nfsstat/Makefile b/usr.bin/nfsstat/Makefile index ce4c7c6136fb..d31db0aaf806 100644 --- a/usr.bin/nfsstat/Makefile +++ b/usr.bin/nfsstat/Makefile @@ -6,4 +6,6 @@ CFLAGS+=-DNFS DPADD= ${LIBKVM} LDADD= -lkvm +WARNS?= 3 + .include diff --git a/usr.bin/nl/Makefile b/usr.bin/nl/Makefile index 9b1f292dfbee..07bef878c44e 100644 --- a/usr.bin/nl/Makefile +++ b/usr.bin/nl/Makefile @@ -2,4 +2,6 @@ PROG= nl +WARNS?= 2 + .include diff --git a/usr.bin/nl/nl.1 b/usr.bin/nl/nl.1 index f21ce93a3be9..064971a46d50 100644 --- a/usr.bin/nl/nl.1 +++ b/usr.bin/nl/nl.1 @@ -14,13 +14,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/nl/nl.c b/usr.bin/nl/nl.c index 172eb6cbea24..b3b78b1688d6 100644 --- a/usr.bin/nl/nl.c +++ b/usr.bin/nl/nl.c @@ -13,13 +13,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/nohup/Makefile b/usr.bin/nohup/Makefile index cd635cefa526..5ec4057d30a5 100644 --- a/usr.bin/nohup/Makefile +++ b/usr.bin/nohup/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= nohup -WARNS?= 4 .include diff --git a/usr.bin/nslookup/Makefile b/usr.bin/nslookup/Makefile index 004efa2def2a..b3ba117cf8aa 100644 --- a/usr.bin/nslookup/Makefile +++ b/usr.bin/nslookup/Makefile @@ -18,6 +18,8 @@ CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} +WARNS?= 1 + MANFILTER= sed -e "s@^host \[server\]@\\\fBhost\\\fR \\\fI[server]\\\fR@" .include diff --git a/usr.bin/nsupdate/Makefile b/usr.bin/nsupdate/Makefile index 0b81c5eb6643..941c7f30fbff 100644 --- a/usr.bin/nsupdate/Makefile +++ b/usr.bin/nsupdate/Makefile @@ -18,6 +18,8 @@ CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} +WARNS?= 1 + MAN= nsupdate.1 MANFILTER= sed -e "s@/etc/named\.conf@/etc/namedb/named.conf@g" \ diff --git a/usr.bin/opieinfo/Makefile b/usr.bin/opieinfo/Makefile index 0375111dbfba..b3ba166d7f69 100644 --- a/usr.bin/opieinfo/Makefile +++ b/usr.bin/opieinfo/Makefile @@ -8,6 +8,8 @@ CFLAGS+=-I${.CURDIR}/../../lib/libopie CFLAGS+=-I${OPIE_DIST} CFLAGS+=-DINSECURE_OVERRIDE +WARNS?= 0 + DPADD= ${LIBOPIE} ${LIBMD} LDADD= -lopie -lmd diff --git a/usr.bin/opiekey/Makefile b/usr.bin/opiekey/Makefile index 215c86b4511e..e017f4d044a5 100644 --- a/usr.bin/opiekey/Makefile +++ b/usr.bin/opiekey/Makefile @@ -8,6 +8,8 @@ CFLAGS+=-I${.CURDIR}/../../lib/libopie CFLAGS+=-I${OPIE_DIST} CFLAGS+=-DINSECURE_OVERRIDE +WARNS?= 0 + DPADD= ${LIBOPIE} ${LIBMD} LDADD= -lopie -lmd diff --git a/usr.bin/opiepasswd/Makefile b/usr.bin/opiepasswd/Makefile index 0d75a2113dc1..b05e3b21e938 100644 --- a/usr.bin/opiepasswd/Makefile +++ b/usr.bin/opiepasswd/Makefile @@ -8,6 +8,8 @@ CFLAGS+=-I${.CURDIR}/../../lib/libopie CFLAGS+=-I${OPIE_DIST} CFLAGS+=-DINSECURE_OVERRIDE +WARNS?= 0 + DPADD= ${LIBOPIE} ${LIBMD} LDADD= -lopie -lmd diff --git a/usr.bin/passwd/Makefile b/usr.bin/passwd/Makefile index a1ce76b48117..7aeee564e38a 100644 --- a/usr.bin/passwd/Makefile +++ b/usr.bin/passwd/Makefile @@ -12,7 +12,6 @@ LDADD = ${MINUSLPAM} LINKS = ${BINDIR}/passwd ${BINDIR}/yppasswd MLINKS = passwd.1 yppasswd.1 .endif -WARNS ?= 4 beforeinstall: .for i in passwd yppasswd diff --git a/usr.bin/passwd/passwd.c b/usr.bin/passwd/passwd.c index d35458c956a1..2d399c56291b 100644 --- a/usr.bin/passwd/passwd.c +++ b/usr.bin/passwd/passwd.c @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) { char hostname[MAXHOSTNAMELEN]; - struct passwd *pwd; + struct passwd *pwd = NULL; /* Keep compiler happy. */ int o, pam_err; uid_t uid; diff --git a/usr.bin/perror/perror.c b/usr.bin/perror/perror.c index 6d852a7a3717..ef3db35b64b2 100644 --- a/usr.bin/perror/perror.c +++ b/usr.bin/perror/perror.c @@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include static void usage(void); @@ -43,6 +44,7 @@ main(int argc, char **argv) char *errstr; long errnum; + (void) setlocale(LC_MESSAGES, ""); if (argc != 2) usage(); diff --git a/usr.bin/pr/Makefile b/usr.bin/pr/Makefile index 70a921d2139b..15652dcaed76 100644 --- a/usr.bin/pr/Makefile +++ b/usr.bin/pr/Makefile @@ -1,4 +1,5 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $FreeBSD$ PROG= pr SRCS= pr.c egetopt.c diff --git a/usr.bin/pr/egetopt.c b/usr.bin/pr/egetopt.c index 277459ee47a7..4b41b4ac365b 100644 --- a/usr.bin/pr/egetopt.c +++ b/usr.bin/pr/egetopt.c @@ -46,7 +46,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include "extern.h" diff --git a/usr.bin/pr/pr.c b/usr.bin/pr/pr.c index fed27f253add..ae7ae07ac0f7 100644 --- a/usr.bin/pr/pr.c +++ b/usr.bin/pr/pr.c @@ -1265,9 +1265,7 @@ FILE * nxtfile(int argc, char **argv, const char **fname, char *buf, int dt) { FILE *inf = NULL; - struct timeval tv; time_t tv_sec; - struct timezone tz; struct tm *timeptr = NULL; struct stat statbuf; static int twice = -1; @@ -1287,14 +1285,13 @@ nxtfile(int argc, char **argv, const char **fname, char *buf, int dt) *fname = fnamedefault; if (nohead) return(inf); - if (gettimeofday(&tv, &tz) < 0) { + if ((tv_sec = time(NULL)) == -1) { ++errcnt; (void)fprintf(err, "pr: cannot get time of day, %s\n", strerror(errno)); eoptind = argc - 1; return(NULL); } - tv_sec = tv.tv_sec; timeptr = localtime(&tv_sec); } for (; eoptind < argc; ++eoptind) { @@ -1311,14 +1308,13 @@ nxtfile(int argc, char **argv, const char **fname, char *buf, int dt) ++eoptind; if (nohead || (dt && twice)) return(inf); - if (gettimeofday(&tv, &tz) < 0) { + if ((tv_sec = time(NULL)) == -1) { ++errcnt; (void)fprintf(err, "pr: cannot get time of day, %s\n", strerror(errno)); return(NULL); } - tv_sec = tv.tv_sec; timeptr = localtime(&tv_sec); } else { /* @@ -1343,14 +1339,13 @@ nxtfile(int argc, char **argv, const char **fname, char *buf, int dt) return(inf); if (dt) { - if (gettimeofday(&tv, &tz) < 0) { + if ((tv_sec = time(NULL)) == -1) { ++errcnt; (void)fprintf(err, "pr: cannot get time of day, %s\n", strerror(errno)); return(NULL); } - tv_sec = tv.tv_sec; timeptr = localtime(&tv_sec); } else { if (fstat(fileno(inf), &statbuf) < 0) { diff --git a/usr.bin/printf/Makefile b/usr.bin/printf/Makefile index 78cdd0d13019..c91c4e3f53c1 100644 --- a/usr.bin/printf/Makefile +++ b/usr.bin/printf/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= printf -WARNS?= 6 .include diff --git a/usr.bin/procstat/Makefile b/usr.bin/procstat/Makefile index 6cb589565183..1c187b04bd24 100644 --- a/usr.bin/procstat/Makefile +++ b/usr.bin/procstat/Makefile @@ -14,6 +14,5 @@ SRCS= procstat.c \ LDADD+= -lutil DPADD+= ${LIBUTIL} -WARNS?= 4 .include diff --git a/usr.bin/procstat/procstat.1 b/usr.bin/procstat/procstat.1 index 0fdff9a3c52c..f4dc731a9c5c 100644 --- a/usr.bin/procstat/procstat.1 +++ b/usr.bin/procstat/procstat.1 @@ -141,6 +141,8 @@ The following file descriptor types may be displayed: .Bl -tag -width X -compact .It c crypto +.It e +POSIX semaphore .It f fifo .It h @@ -168,10 +170,14 @@ not a vnode block device .It c character device +.It d +directory .It f fifo .It l symbolic link +.It r +regular file .It s socket .It x diff --git a/usr.bin/renice/renice.c b/usr.bin/renice/renice.c index 21bb4c2c9805..55f6537208a5 100644 --- a/usr.bin/renice/renice.c +++ b/usr.bin/renice/renice.c @@ -177,7 +177,7 @@ getnum(const char *com, const char *str, int *val) } static void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n", "usage: renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]", diff --git a/usr.bin/revoke/Makefile b/usr.bin/revoke/Makefile index b3c4ee690a65..92fe2218b189 100644 --- a/usr.bin/revoke/Makefile +++ b/usr.bin/revoke/Makefile @@ -2,6 +2,4 @@ PROG= revoke -WARNS?= 6 - .include diff --git a/usr.bin/rlogin/Makefile b/usr.bin/rlogin/Makefile index 195bffbb0b15..abf4a826a541 100644 --- a/usr.bin/rlogin/Makefile +++ b/usr.bin/rlogin/Makefile @@ -7,4 +7,6 @@ BINOWN= root BINMODE=4555 PRECIOUSPROG= +WARNS?= 3 + .include diff --git a/usr.bin/rpcgen/Makefile b/usr.bin/rpcgen/Makefile index c298820e343a..f78fa64968fd 100644 --- a/usr.bin/rpcgen/Makefile +++ b/usr.bin/rpcgen/Makefile @@ -4,6 +4,4 @@ PROG= rpcgen SRCS= rpc_main.c rpc_clntout.c rpc_cout.c rpc_hout.c rpc_parse.c \ rpc_sample.c rpc_scan.c rpc_svcout.c rpc_tblout.c rpc_util.c -WARNS?= 2 - .include diff --git a/usr.bin/rpcgen/rpc_hout.c b/usr.bin/rpcgen/rpc_hout.c index 70683638360e..7607ef74d6c9 100644 --- a/usr.bin/rpcgen/rpc_hout.c +++ b/usr.bin/rpcgen/rpc_hout.c @@ -148,8 +148,7 @@ print_xdr_func_def(const char *name, int pointerp) static void -pconstdef(def) - definition *def; +pconstdef(definition *def) { pdefine(def->def_name, def->def.co); } @@ -205,8 +204,7 @@ pstructdef(definition *def) } static void -puniondef(def) - definition *def; +puniondef(definition *def) { case_list *l; const char *name = def->def_name; @@ -374,8 +372,7 @@ parglist(proc_list *proc, const char *addargtype) } static void -penumdef(def) - definition *def; +penumdef(definition *def) { const char *name = def->def_name; enumval_list *l; @@ -406,8 +403,7 @@ penumdef(def) } static void -ptypedef(def) - definition *def; +ptypedef(definition *def) { const char *name = def->def_name; const char *old = def->def.ty.old_type; diff --git a/usr.bin/rpcgen/rpc_main.c b/usr.bin/rpcgen/rpc_main.c index fb3813f42bd7..00d85b8e6ded 100644 --- a/usr.bin/rpcgen/rpc_main.c +++ b/usr.bin/rpcgen/rpc_main.c @@ -1203,7 +1203,7 @@ parseargs(int argc, const char *argv[], struct commandline *cmd) } static void -usage() +usage(void) { f_print(stderr, "%s\n%s\n%s\n%s\n%s\n", "usage: rpcgen infile", @@ -1218,7 +1218,7 @@ usage() } static void -options_usage() +options_usage(void) { f_print(stderr, "options:\n"); f_print(stderr, "-a\t\tgenerate all files, including samples\n"); diff --git a/usr.bin/rpcinfo/Makefile b/usr.bin/rpcinfo/Makefile index c89b5b3cbe56..3c8e51c000c3 100644 --- a/usr.bin/rpcinfo/Makefile +++ b/usr.bin/rpcinfo/Makefile @@ -7,4 +7,6 @@ MAN= rpcinfo.8 CFLAGS+= -DPORTMAP +WARNS?= 2 + .include diff --git a/usr.bin/rsh/Makefile b/usr.bin/rsh/Makefile index cf052f71efa7..5c6951cd0745 100644 --- a/usr.bin/rsh/Makefile +++ b/usr.bin/rsh/Makefile @@ -4,6 +4,8 @@ PROG= rsh CFLAGS+=-I${.CURDIR}/../../libexec/rlogind +WARNS?= 2 + BINOWN= root BINMODE=4555 PRECIOUSPROG= diff --git a/usr.bin/rup/Makefile b/usr.bin/rup/Makefile index 6d329774b711..e87220168c22 100644 --- a/usr.bin/rup/Makefile +++ b/usr.bin/rup/Makefile @@ -2,6 +2,8 @@ PROG= rup +WARNS?= 1 + DPADD= ${LIBRPCSVC} LDADD= -lrpcsvc diff --git a/usr.bin/ruptime/Makefile b/usr.bin/ruptime/Makefile index 57f1e15ee0d1..351d0d8a181d 100644 --- a/usr.bin/ruptime/Makefile +++ b/usr.bin/ruptime/Makefile @@ -1,5 +1,8 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $FreeBSD$ PROG= ruptime +WARNS?= 3 + .include diff --git a/usr.bin/rusers/Makefile b/usr.bin/rusers/Makefile index 21d0ce24a706..6cb39acd29e4 100644 --- a/usr.bin/rusers/Makefile +++ b/usr.bin/rusers/Makefile @@ -1,7 +1,6 @@ # $FreeBSD$ PROG = rusers -WARNS?= 6 DPADD= ${LIBRPCSVC} LDADD= -lrpcsvc diff --git a/usr.bin/rwho/Makefile b/usr.bin/rwho/Makefile index 328aa38bcb98..aee9ff765f73 100644 --- a/usr.bin/rwho/Makefile +++ b/usr.bin/rwho/Makefile @@ -1,5 +1,8 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $FreeBSD$ PROG= rwho +WARNS?= 1 + .include diff --git a/usr.bin/rwho/rwho.c b/usr.bin/rwho/rwho.c index be82ad36d4dc..b41bed83aa64 100644 --- a/usr.bin/rwho/rwho.c +++ b/usr.bin/rwho/rwho.c @@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include DIR *dirp; @@ -172,7 +171,7 @@ main(int argc, char *argv[]) (void)sprintf(buf, "%s:%-.*s", mp->myhost, sizeof(mp->myutmp.out_line), mp->myutmp.out_line); printf("%-*.*s %-*s %s", - UT_NAMESIZE, sizeof(mp->myutmp.out_name), + sizeof(mp->myutmp.out_name), sizeof(mp->myutmp.out_name), mp->myutmp.out_name, width, buf, diff --git a/usr.bin/script/script.c b/usr.bin/script/script.c index ad706dcdd350..bd2de283ebf8 100644 --- a/usr.bin/script/script.c +++ b/usr.bin/script/script.c @@ -126,7 +126,7 @@ main(int argc, char *argv[]) if ((fscript = fopen(fname, aflg ? "a" : "w")) == NULL) err(1, "%s", fname); - if (ttyflg = isatty(STDIN_FILENO)) { + if ((ttyflg = isatty(STDIN_FILENO)) != 0) { if (tcgetattr(STDIN_FILENO, &tt) == -1) err(1, "tcgetattr"); if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == -1) diff --git a/usr.bin/sed/Makefile b/usr.bin/sed/Makefile index 9d9886f3688c..1fbce17d5fb7 100644 --- a/usr.bin/sed/Makefile +++ b/usr.bin/sed/Makefile @@ -4,4 +4,6 @@ PROG= sed SRCS= compile.c main.c misc.c process.c +WARNS?= 2 + .include diff --git a/usr.bin/seq/Makefile b/usr.bin/seq/Makefile new file mode 100644 index 000000000000..58b16aea7b05 --- /dev/null +++ b/usr.bin/seq/Makefile @@ -0,0 +1,8 @@ +# $NetBSD: Makefile,v 1.3 2009/04/14 22:15:26 lukem Exp $ +# $FreeBSD$ + +PROG= seq +DPADD= ${LIBM} +LDADD= -lm + +.include diff --git a/usr.bin/seq/seq.1 b/usr.bin/seq/seq.1 new file mode 100644 index 000000000000..e3bccee6dff7 --- /dev/null +++ b/usr.bin/seq/seq.1 @@ -0,0 +1,187 @@ +.\" $NetBSD: seq.1,v 1.6 2008/11/26 15:03:47 ginsbach Exp $ +.\" +.\" Copyright (c) 2005 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by Brian Ginsbach. +.\" +.\" 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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$ +.\" +.Dd February 19, 2010 +.Dt SEQ 1 +.Os +.Sh NAME +.Nm seq +.Nd print sequences of numbers +.Sh SYNOPSIS +.Nm +.Op Fl w +.Op Fl f Ar format +.Op Fl s Ar string +.Op Fl t Ar string +.Op Ar first Op Ar incr +.Ar last +.Sh DESCRIPTION +The +.Nm +utility prints a sequence of numbers, one per line +.Pq default , +from +.Ar first +.Pq default 1 , +to near +.Ar last +as possible, in increments of +.Ar incr +.Pq default 1 . +When +.Ar first +is larger than +.Ar last +the default +.Ar incr +is -1. +.Pp +All numbers are interpreted as floating point. +.Pp +Normally integer values are printed as decimal integers. +.Pp +The +.Nm +utility accepts the following options: +.Bl -tag -width Ar +.It Fl f Ar format +Use a +.Xr printf 3 +style +.Ar format +to print each number. +Only the +.Cm E , +.Cm e , +.Cm f , +.Cm G , +.Cm g , +and +.Cm % +conversion characters are valid, along with any optional +flags and an optional numeric minimum field width or precision. +The +.Ar format +can contain character escape sequences in backslash notation as +defined in +.St -ansiC . +The default is +.Cm %g . +.It Fl s Ar string +Use +.Ar string +to separate numbers. +The +.Ar string +can contain character escape sequences in backslash notation as +defined in +.St -ansiC . +The default is +.Cm \en . +.It Fl t Ar string +Use +.Ar string +to terminate sequence of numbers. +The +.Ar string +can contain character escape sequences in backslash notation as +defined in +.St -ansiC . +This option is useful when the default separator +does not contain a +.Cm \en . +.It Fl w +Equalize the widths of all numbers by padding with zeros as necessary. +This option has no effect with the +.Fl f +option. +If any sequence numbers will be printed in exponential notation, +the default conversion is changed to +.Cm %e . +.El +.Pp +The +.Nm +utility exits 0 on success and non-zero if an error occurs. +.Sh EXAMPLES +.Bd -literal -offset indent +# seq 1 3 +1 +2 +3 + +# seq 3 1 +3 +2 +1 + +# seq -w 0 .05 .1 +0.00 +0.05 +0.10 +.Ed +.Sh SEE ALSO +.Xr jot 1 , +.Xr printf 1 , +.Xr printf 3 +.Sh HISTORY +The +.Nm +command first appeared in +.Tn "Plan 9 from Bell Labs" . +A +.Nm +command appeared in +.Nx 3.0 , +and ported to +.Fx 9.0 . +This command was based on the command of the same name in +.Tn "Plan 9 from Bell Labs" +and the +.Tn GNU +core utilities. +The +.Tn GNU +.Nm +command first appeared in the 1.13 shell utilities release. +.Sh BUGS +The +.Fl w +option does not handle the transition from pure floating point +to exponent representation very well. +The +.Nm +command is not bug for bug compatible with the +.Tn "Plan 9 from Bell Labs" +or +.Tn GNU +versions of +.Nm . diff --git a/usr.bin/seq/seq.c b/usr.bin/seq/seq.c new file mode 100644 index 000000000000..f94ca0051755 --- /dev/null +++ b/usr.bin/seq/seq.c @@ -0,0 +1,453 @@ +/* $NetBSD: seq.c,v 1.5 2008/07/21 14:19:26 lukem Exp $ */ +/* + * Copyright (c) 2005 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Brian Ginsbach. + * + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ZERO '0' +#define SPACE ' ' + +#define MAX(a, b) (((a) < (b))? (b) : (a)) +#define ISSIGN(c) ((int)(c) == '-' || (int)(c) == '+') +#define ISEXP(c) ((int)(c) == 'e' || (int)(c) == 'E') +#define ISODIGIT(c) ((int)(c) >= '0' && (int)(c) <= '7') + +/* Globals */ + +const char *decimal_point = "."; /* default */ +char default_format[] = { "%g" }; /* default */ + +/* Prototypes */ + +double e_atof(const char *); + +int decimal_places(const char *); +int main(int, char *[]); +int numeric(const char *); +int valid_format(const char *); + +char *generate_format(double, double, double, int, char); +char *unescape(char *); + +/* + * The seq command will print out a numeric sequence from 1, the default, + * to a user specified upper limit by 1. The lower bound and increment + * maybe indicated by the user on the command line. The sequence can + * be either whole, the default, or decimal numbers. + */ +int +main(int argc, char *argv[]) +{ + int c = 0, errflg = 0; + int equalize = 0; + double first = 1.0; + double last = 0.0; + double incr = 0.0; + struct lconv *locale; + char *fmt = NULL; + const char *sep = "\n"; + const char *term = NULL; + char pad = ZERO; + + /* Determine the locale's decimal point. */ + locale = localeconv(); + if (locale && locale->decimal_point && locale->decimal_point[0] != '\0') + decimal_point = locale->decimal_point; + + /* + * Process options, but handle negative numbers separately + * least they trip up getopt(3). + */ + while ((optind < argc) && !numeric(argv[optind]) && + (c = getopt(argc, argv, "f:hs:t:w")) != -1) { + + switch (c) { + case 'f': /* format (plan9) */ + fmt = optarg; + equalize = 0; + break; + case 's': /* separator (GNU) */ + sep = unescape(optarg); + break; + case 't': /* terminator (new) */ + term = unescape(optarg); + break; + case 'w': /* equal width (plan9) */ + if (!fmt) + if (equalize++) + pad = SPACE; + break; + case 'h': /* help (GNU) */ + default: + errflg++; + break; + } + } + + argc -= optind; + argv += optind; + if (argc < 1 || argc > 3) + errflg++; + + if (errflg) { + fprintf(stderr, + "usage: %s [-w] [-f format] [-s string] [-t string] [first [incr]] last\n", + getprogname()); + exit(1); + } + + last = e_atof(argv[argc - 1]); + + if (argc > 1) + first = e_atof(argv[0]); + + if (argc > 2) { + incr = e_atof(argv[1]); + /* Plan 9/GNU don't do zero */ + if (incr == 0.0) + errx(1, "zero %screment", (first < last)? "in" : "de"); + } + + /* default is one for Plan 9/GNU work alike */ + if (incr == 0.0) + incr = (first < last) ? 1.0 : -1.0; + + if (incr <= 0.0 && first < last) + errx(1, "needs positive increment"); + + if (incr >= 0.0 && first > last) + errx(1, "needs negative decrement"); + + if (fmt != NULL) { + if (!valid_format(fmt)) + errx(1, "invalid format string: `%s'", fmt); + fmt = unescape(fmt); + /* + * XXX to be bug for bug compatible with Plan 9 add a + * newline if none found at the end of the format string. + */ + } else + fmt = generate_format(first, incr, last, equalize, pad); + + if (incr > 0) { + for (; first <= last; first += incr) { + printf(fmt, first); + fputs(sep, stdout); + } + } else { + for (; first >= last; first += incr) { + printf(fmt, first); + fputs(sep, stdout); + } + } + if (term != NULL) + fputs(term, stdout); + + return (0); +} + +/* + * numeric - verify that string is numeric + */ +int +numeric(const char *s) +{ + int seen_decimal_pt, decimal_pt_len; + + /* skip any sign */ + if (ISSIGN((unsigned char)*s)) + s++; + + seen_decimal_pt = 0; + decimal_pt_len = strlen(decimal_point); + while (*s) { + if (!isdigit((unsigned char)*s)) { + if (!seen_decimal_pt && + strncmp(s, decimal_point, decimal_pt_len) == 0) { + s += decimal_pt_len; + seen_decimal_pt = 1; + continue; + } + if (ISEXP((unsigned char)*s)) { + s++; + if (ISSIGN((unsigned char)*s) || + isdigit((unsigned char)*s)) { + s++; + continue; + } + } + break; + } + s++; + } + return (*s == '\0'); +} + +/* + * valid_format - validate user specified format string + */ +int +valid_format(const char *fmt) +{ + int conversions = 0; + + while (*fmt != '\0') { + /* scan for conversions */ + if (*fmt != '\0' && *fmt != '%') { + do { + fmt++; + } while (*fmt != '\0' && *fmt != '%'); + } + /* scan a conversion */ + if (*fmt != '\0') { + do { + fmt++; + + /* ok %% */ + if (*fmt == '%') { + fmt++; + break; + } + /* valid conversions */ + if (strchr("eEfgG", *fmt) && + conversions++ < 1) { + fmt++; + break; + } + /* flags, width and precsision */ + if (isdigit((unsigned char)*fmt) || + strchr("+- 0#.", *fmt)) + continue; + + /* oops! bad conversion format! */ + return (0); + } while (*fmt != '\0'); + } + } + + return (conversions <= 1); +} + +/* + * unescape - handle C escapes in a string + */ +char * +unescape(char *orig) +{ + char c, *cp, *new = orig; + int i; + + for (cp = orig; (*orig = *cp); cp++, orig++) { + if (*cp != '\\') + continue; + + switch (*++cp) { + case 'a': /* alert (bell) */ + *orig = '\a'; + continue; + case 'b': /* backspace */ + *orig = '\b'; + continue; + case 'e': /* escape */ + *orig = '\e'; + continue; + case 'f': /* formfeed */ + *orig = '\f'; + continue; + case 'n': /* newline */ + *orig = '\n'; + continue; + case 'r': /* carriage return */ + *orig = '\r'; + continue; + case 't': /* horizontal tab */ + *orig = '\t'; + continue; + case 'v': /* vertical tab */ + *orig = '\v'; + continue; + case '\\': /* backslash */ + *orig = '\\'; + continue; + case '\'': /* single quote */ + *orig = '\''; + continue; + case '\"': /* double quote */ + *orig = '"'; + continue; + case '0': + case '1': + case '2': + case '3': /* octal */ + case '4': + case '5': + case '6': + case '7': /* number */ + for (i = 0, c = 0; + ISODIGIT((unsigned char)*cp) && i < 3; + i++, cp++) { + c <<= 3; + c |= (*cp - '0'); + } + *orig = c; + --cp; + continue; + case 'x': /* hexidecimal number */ + cp++; /* skip 'x' */ + for (i = 0, c = 0; + isxdigit((unsigned char)*cp) && i < 2; + i++, cp++) { + c <<= 4; + if (isdigit((unsigned char)*cp)) + c |= (*cp - '0'); + else + c |= ((toupper((unsigned char)*cp) - + 'A') + 10); + } + *orig = c; + --cp; + continue; + default: + --cp; + break; + } + } + + return (new); +} + +/* + * e_atof - convert an ASCII string to a double + * exit if string is not a valid double, or if converted value would + * cause overflow or underflow + */ +double +e_atof(const char *num) +{ + char *endp; + double dbl; + + errno = 0; + dbl = strtod(num, &endp); + + if (errno == ERANGE) + /* under or overflow */ + err(2, "%s", num); + else if (*endp != '\0') + /* "junk" left in number */ + errx(2, "invalid floating point argument: %s", num); + + /* zero shall have no sign */ + if (dbl == -0.0) + dbl = 0; + return (dbl); +} + +/* + * decimal_places - count decimal places in a number (string) + */ +int +decimal_places(const char *number) +{ + int places = 0; + char *dp; + + /* look for a decimal point */ + if ((dp = strstr(number, decimal_point))) { + dp += strlen(decimal_point); + + while (isdigit((unsigned char)*dp++)) + places++; + } + return (places); +} + +/* + * generate_format - create a format string + * + * XXX to be bug for bug compatable with Plan9 and GNU return "%g" + * when "%g" prints as "%e" (this way no width adjustments are made) + */ +char * +generate_format(double first, double incr, double last, int equalize, char pad) +{ + static char buf[256]; + char cc = '\0'; + int precision, width1, width2, places; + + if (equalize == 0) + return (default_format); + + /* figure out "last" value printed */ + if (first > last) + last = first - incr * floor((first - last) / incr); + else + last = first + incr * floor((last - first) / incr); + + sprintf(buf, "%g", incr); + if (strchr(buf, 'e')) + cc = 'e'; + precision = decimal_places(buf); + + width1 = sprintf(buf, "%g", first); + if (strchr(buf, 'e')) + cc = 'e'; + if ((places = decimal_places(buf))) + width1 -= (places + strlen(decimal_point)); + + precision = MAX(places, precision); + + width2 = sprintf(buf, "%g", last); + if (strchr(buf, 'e')) + cc = 'e'; + if ((places = decimal_places(buf))) + width2 -= (places + strlen(decimal_point)); + + if (precision) { + sprintf(buf, "%%%c%d.%d%c", pad, + MAX(width1, width2) + (int) strlen(decimal_point) + + precision, precision, (cc) ? cc : 'f'); + } else { + sprintf(buf, "%%%c%d%c", pad, MAX(width1, width2), + (cc) ? cc : 'g'); + } + + return (buf); +} diff --git a/usr.bin/showmount/showmount.c b/usr.bin/showmount/showmount.c index 5e67cc1bc7bb..c70688c7fbc1 100644 --- a/usr.bin/showmount/showmount.c +++ b/usr.bin/showmount/showmount.c @@ -110,9 +110,7 @@ int tcp_callrpc(const char *host, int prognum, int versnum, int procnum, * for detailed information on the protocol. */ int -main(argc, argv) - int argc; - char **argv; +main(int argc, char **argv) { register struct exportslist *exp; register struct grouplist *grp; @@ -213,15 +211,8 @@ main(argc, argv) * use tcp as transport method in order to handle large replies. */ int -tcp_callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) - const char *host; - int prognum; - int versnum; - int procnum; - xdrproc_t inproc; - char *in; - xdrproc_t outproc; - char *out; +tcp_callrpc(const char *host, int prognum, int versnum, int procnum, + xdrproc_t inproc, char *in, xdrproc_t outproc, char *out) { CLIENT *client; struct timeval timeout; @@ -245,9 +236,7 @@ tcp_callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) * Xdr routine for retrieving the mount dump list */ int -xdr_mntdump(xdrsp, mlp) - XDR *xdrsp; - struct mountlist **mlp; +xdr_mntdump(XDR *xdrsp, struct mountlist **mlp) { register struct mountlist *mp; register struct mountlist *tp; @@ -327,9 +316,7 @@ next: * Xdr routine to retrieve exports list */ int -xdr_exportslist(xdrsp, exp) - XDR *xdrsp; - struct exportslist **exp; +xdr_exportslist(XDR *xdrsp, struct exportslist **exp) { register struct exportslist *ep; register struct grouplist *gp; @@ -370,7 +357,7 @@ xdr_exportslist(xdrsp, exp) } static void -usage() +usage(void) { fprintf(stderr, "usage: showmount [-a | -d] [-e3] [host]\n"); exit(1); @@ -380,8 +367,7 @@ usage() * Print the binary tree in inorder so that output is sorted. */ void -print_dump(mp) - struct mountlist *mp; +print_dump(struct mountlist *mp) { if (mp == NULL) diff --git a/usr.bin/smbutil/Makefile b/usr.bin/smbutil/Makefile index 13b5078e0411..19ac5fd7343a 100644 --- a/usr.bin/smbutil/Makefile +++ b/usr.bin/smbutil/Makefile @@ -9,6 +9,8 @@ LDADD= -lsmb -lkiconv CONTRIBDIR= ${.CURDIR}/../../contrib/smbfs CFLAGS+= -I${CONTRIBDIR}/include +WARNS?= 0 + .PATH: ${CONTRIBDIR}/smbutil .include diff --git a/usr.bin/sockstat/Makefile b/usr.bin/sockstat/Makefile index 55e702577e6c..8093367fa2d8 100644 --- a/usr.bin/sockstat/Makefile +++ b/usr.bin/sockstat/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= sockstat -WARNS?= 4 .include diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1 index 206dad7e38cb..64e163b5ceb9 100644 --- a/usr.bin/sockstat/sockstat.1 +++ b/usr.bin/sockstat/sockstat.1 @@ -167,3 +167,10 @@ The .Nm command and this manual page were written by .An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . +.Sh BUGS +Unlike +.Xr netstat 1 , +.Nm +lists sockets by walking file descriptor tables and will not output +the ones owned by the kernel, e.g. NLM sockets created by +.Xr rpc.lockd 8 . diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c index 1b2f1417b9c3..1a5af429fdb7 100644 --- a/usr.bin/sockstat/sockstat.c +++ b/usr.bin/sockstat/sockstat.c @@ -496,8 +496,8 @@ printaddr(int af, struct sockaddr_storage *ss) { char addrstr[INET6_ADDRSTRLEN] = { '\0', '\0' }; struct sockaddr_un *sun; - void *addr; - int off, port; + void *addr = NULL; /* Keep compiler happy. */ + int off, port = 0; switch (af) { case AF_INET: diff --git a/usr.bin/stat/stat.1 b/usr.bin/stat/stat.1 index b629341b8ccd..6856efae22fd 100644 --- a/usr.bin/stat/stat.1 +++ b/usr.bin/stat/stat.1 @@ -14,13 +14,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/stat/stat.c b/usr.bin/stat/stat.c index 0b32f11c60d3..83d389b8ee85 100644 --- a/usr.bin/stat/stat.c +++ b/usr.bin/stat/stat.c @@ -13,13 +13,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/su/Makefile b/usr.bin/su/Makefile index 25216cf44f1d..0002e869c471 100644 --- a/usr.bin/su/Makefile +++ b/usr.bin/su/Makefile @@ -5,6 +5,8 @@ PROG= su +WARNS?= 5 + DPADD= ${LIBUTIL} ${LIBPAM} LDADD= -lutil ${MINUSLPAM} diff --git a/usr.bin/systat/Makefile b/usr.bin/systat/Makefile index 4f5f229725b6..6a7e53d5d39c 100644 --- a/usr.bin/systat/Makefile +++ b/usr.bin/systat/Makefile @@ -14,7 +14,9 @@ SRCS+= icmp6.c ip6.c CFLAGS+= -DINET6 .endif -DPADD= ${LIBCURSES} ${LIBM} ${LIBDEVSTAT} ${LIBKVM} -LDADD= -lcurses -lm -ldevstat -lkvm +WARNS?= 0 + +DPADD= ${LIBNCURSESW} ${LIBM} ${LIBDEVSTAT} ${LIBKVM} +LDADD= -lncursesw -lm -ldevstat -lkvm .include diff --git a/usr.bin/systat/keyboard.c b/usr.bin/systat/keyboard.c index 7784f5be98a3..0ab28eb2603e 100644 --- a/usr.bin/systat/keyboard.c +++ b/usr.bin/systat/keyboard.c @@ -39,8 +39,10 @@ __FBSDID("$FreeBSD$"); static const char sccsid[] = "@(#)keyboard.c 8.1 (Berkeley) 6/6/93"; #endif +#include #include #include +#include #include #include "systat.h" @@ -57,10 +59,11 @@ keyboard(void) move(CMDLINE, 0); do { refresh(); - ch = getch() & 0177; - if (ch == 0177 && ferror(stdin)) { - clearerr(stdin); - continue; + ch = getch(); + if (ch == ERR) { + if (errno == EINTR) + continue; + exit(1); } if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A'; diff --git a/usr.bin/systat/main.c b/usr.bin/systat/main.c index 28673e54e6b7..d092f10fe19a 100644 --- a/usr.bin/systat/main.c +++ b/usr.bin/systat/main.c @@ -87,7 +87,7 @@ main(int argc, char **argv) char errbuf[_POSIX2_LINE_MAX], dummy; size_t size; - (void) setlocale(LC_TIME, ""); + (void) setlocale(LC_ALL, ""); argc--, argv++; while (argc > 0) { @@ -133,6 +133,7 @@ main(int argc, char **argv) exit(1); } } + signal(SIGHUP, die); signal(SIGINT, die); signal(SIGQUIT, die); signal(SIGTERM, die); diff --git a/usr.bin/systat/vmstat.c b/usr.bin/systat/vmstat.c index 38664381ca5e..1a0219730402 100644 --- a/usr.bin/systat/vmstat.c +++ b/usr.bin/systat/vmstat.c @@ -66,7 +66,7 @@ static const char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 1/12/94"; #include #include #include -#include +#include #include #include "systat.h" #include "extern.h" @@ -141,7 +141,6 @@ static void putlongdouble(long double, int, int, int, int, int); static int ucount(void); static int ncpu; -static int ut; static char buf[26]; static time_t t; static double etime; @@ -150,16 +149,10 @@ static long *intrloc; static char **intrname; static int nextintsrow; -struct utmp utmp; - - WINDOW * openkre(void) { - ut = open(_PATH_UTMP, O_RDONLY); - if (ut < 0) - error("No utmp"); return (stdscr); } @@ -167,7 +160,6 @@ void closekre(WINDOW *w) { - (void) close(ut); if (w == NULL) return; wclear(w); @@ -634,14 +626,14 @@ static int ucount(void) { int nusers = 0; + struct utmpx *ut; - if (ut < 0) - return (0); - while (read(ut, &utmp, sizeof(utmp))) - if (utmp.ut_name[0] != '\0') + setutxent(); + while ((ut = getutxent()) != NULL) + if (ut->ut_type == USER_PROCESS) nusers++; + endutxent(); - lseek(ut, 0L, L_SET); return (nusers); } diff --git a/usr.bin/tail/Makefile b/usr.bin/tail/Makefile index c8166936983d..672cbed008e6 100644 --- a/usr.bin/tail/Makefile +++ b/usr.bin/tail/Makefile @@ -3,6 +3,5 @@ PROG= tail SRCS= forward.c misc.c read.c reverse.c tail.c -WARNS?= 4 .include diff --git a/usr.bin/tail/misc.c b/usr.bin/tail/misc.c index 7e57504f818a..26b162af9a84 100644 --- a/usr.bin/tail/misc.c +++ b/usr.bin/tail/misc.c @@ -63,7 +63,7 @@ ierr(const char *fname) } void -oerr() +oerr(void) { err(1, "stdout"); } diff --git a/usr.bin/tail/tail.1 b/usr.bin/tail/tail.1 index 7f91e7159511..5e382e91b17c 100644 --- a/usr.bin/tail/tail.1 +++ b/usr.bin/tail/tail.1 @@ -35,7 +35,7 @@ .\" @(#)tail.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd June 05, 2009 +.Dd June 5, 2009 .Dt TAIL 1 .Os .Sh NAME diff --git a/usr.bin/talk/ctl_transact.c b/usr.bin/talk/ctl_transact.c index 9c8665dab0dc..ff5b4622411d 100644 --- a/usr.bin/talk/ctl_transact.c +++ b/usr.bin/talk/ctl_transact.c @@ -42,7 +42,6 @@ static const char sccsid[] = "@(#)ctl_transact.c 8.1 (Berkeley) 6/6/93"; #include #include -#include #include "talk.h" #include "talk_ctl.h" diff --git a/usr.bin/talk/display.c b/usr.bin/talk/display.c index f565354b3e90..11f5c809c1c1 100644 --- a/usr.bin/talk/display.c +++ b/usr.bin/talk/display.c @@ -44,6 +44,7 @@ static const char sccsid[] = "@(#)display.c 8.1 (Berkeley) 6/6/93"; * displaying of text */ #include +#include #include "talk.h" diff --git a/usr.bin/talk/get_addrs.c b/usr.bin/talk/get_addrs.c index 2923021aa551..fbd415b5b1c9 100644 --- a/usr.bin/talk/get_addrs.c +++ b/usr.bin/talk/get_addrs.c @@ -42,6 +42,7 @@ static const char sccsid[] = "@(#)get_addrs.c 8.1 (Berkeley) 6/6/93"; #include #include #include +#include #include "talk.h" #include "talk_ctl.h" diff --git a/usr.bin/talk/get_iface.c b/usr.bin/talk/get_iface.c index ebf08bd48a17..96d3d6edabb5 100644 --- a/usr.bin/talk/get_iface.c +++ b/usr.bin/talk/get_iface.c @@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include "talk.h" diff --git a/usr.bin/talk/get_names.c b/usr.bin/talk/get_names.c index b3e0f7b661e7..a4ea39df5b91 100644 --- a/usr.bin/talk/get_names.c +++ b/usr.bin/talk/get_names.c @@ -45,6 +45,7 @@ static const char sccsid[] = "@(#)get_names.c 8.1 (Berkeley) 6/6/93"; #include #include #include +#include #include "talk.h" diff --git a/usr.bin/talk/invite.c b/usr.bin/talk/invite.c index 99c251435494..d94362b379ae 100644 --- a/usr.bin/talk/invite.c +++ b/usr.bin/talk/invite.c @@ -47,6 +47,7 @@ static const char sccsid[] = "@(#)invite.c 8.1 (Berkeley) 6/6/93"; #include #include #include +#include #include "talk_ctl.h" #include "talk.h" diff --git a/usr.bin/talk/look_up.c b/usr.bin/talk/look_up.c index 1ccf23c652f0..7a66e6fbe03f 100644 --- a/usr.bin/talk/look_up.c +++ b/usr.bin/talk/look_up.c @@ -45,6 +45,7 @@ static const char sccsid[] = "@(#)look_up.c 8.1 (Berkeley) 6/6/93"; #include #include +#include #include "talk_ctl.h" #include "talk.h" diff --git a/usr.bin/talk/talk.1 b/usr.bin/talk/talk.1 index 775b6d1437ce..6af62d7d7282 100644 --- a/usr.bin/talk/talk.1 +++ b/usr.bin/talk/talk.1 @@ -116,10 +116,10 @@ Permission to talk may be denied or granted by use of the command. At the outset talking is allowed. .Sh FILES -.Bl -tag -width /var/run/utmp -compact +.Bl -tag -width /var/run/utx.active -compact .It Pa /etc/hosts to find the recipient's machine -.It Pa /var/run/utmp +.It Pa /var/run/utx.active to find the recipient's tty .El .Sh SEE ALSO diff --git a/usr.bin/talk/talk.c b/usr.bin/talk/talk.c index 5fc8337322d3..578e370bb189 100644 --- a/usr.bin/talk/talk.c +++ b/usr.bin/talk/talk.c @@ -46,6 +46,7 @@ static const char copyright[] = #endif #include +#include #include "talk.h" diff --git a/usr.bin/talk/talk.h b/usr.bin/talk/talk.h index e20c8ecc3700..47cbbaeaefd8 100644 --- a/usr.bin/talk/talk.h +++ b/usr.bin/talk/talk.h @@ -42,7 +42,6 @@ #include #include #include -#include extern int sockt; extern int curses_initialized; diff --git a/usr.bin/tar/Makefile b/usr.bin/tar/Makefile index 22f8ff795179..18289520209c 100644 --- a/usr.bin/tar/Makefile +++ b/usr.bin/tar/Makefile @@ -3,11 +3,22 @@ PROG= bsdtar BSDTAR_VERSION_STRING=2.7.0 -SRCS= bsdtar.c cmdline.c getdate.c matching.c read.c siginfo.c subst.c tree.c util.c write.c -WARNS?= 5 -DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} +SRCS= bsdtar.c \ + cmdline.c \ + err.c \ + getdate.c \ + line_reader.c \ + matching.c \ + pathmatch.c \ + read.c \ + subst.c \ + tree.c \ + util.c \ + write.c +DPADD= ${LIBARCHIVE} ${LIBBZ2} ${LIBZ} ${LIBMD} LDADD= -larchive -lbz2 -lz -lmd .if ${MK_OPENSSL} != "no" +DPADD+= ${LIBCRYPTO} LDADD+= -lcrypto .endif CFLAGS+= -DBSDTAR_VERSION_STRING=\"${BSDTAR_VERSION_STRING}\" diff --git a/usr.bin/tar/bsdtar.c b/usr.bin/tar/bsdtar.c index cd6fa6314c6f..c858ba39db39 100644 --- a/usr.bin/tar/bsdtar.c +++ b/usr.bin/tar/bsdtar.c @@ -47,6 +47,9 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_PATHS_H #include #endif +#ifdef HAVE_SIGNAL_H +#include +#endif #include #ifdef HAVE_STDLIB_H #include @@ -60,11 +63,10 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_UNISTD_H #include #endif -#if HAVE_ZLIB_H -#include -#endif #include "bsdtar.h" +#include "err.h" +#include "matching.h" /* * Per POSIX.1-1988, tar defaults to reading/writing archives to/from @@ -81,10 +83,39 @@ __FBSDID("$FreeBSD$"); #define _PATH_DEFTAPE "/dev/tape" #endif -/* External function to parse a date/time string (from getdate.y) */ +#ifdef __MINGW32__ +int _CRT_glob = 0; /* Disable broken CRT globbing. */ +#endif + +#if defined(HAVE_SIGACTION) && (defined(SIGINFO) || defined(SIGUSR1)) +static volatile int siginfo_occurred; + +static void +siginfo_handler(int sig) +{ + (void)sig; /* UNUSED */ + siginfo_occurred = 1; +} + +int +need_report(void) +{ + int r = siginfo_occurred; + siginfo_occurred = 0; + return (r); +} +#else +int +need_report(void) +{ + return (0); +} +#endif + +/* External function to parse a date/time string */ time_t get_date(time_t, const char *); -static void long_help(struct bsdtar *); +static void long_help(void); static void only_mode(struct bsdtar *, const char *opt, const char *valid); static void set_mode(struct bsdtar *, char opt); @@ -113,32 +144,44 @@ main(int argc, char **argv) memset(bsdtar, 0, sizeof(*bsdtar)); bsdtar->fd = -1; /* Mark as "unused" */ option_o = 0; -#if defined(_WIN32) && !defined(__CYGWIN__) - /* Make sure open() function will be used with a binary mode. */ - /* on cygwin, we need something similar, but instead link against */ - /* a special startup object, binmode.o */ - _set_fmode(_O_BINARY); + +#if defined(HAVE_SIGACTION) && (defined(SIGINFO) || defined(SIGUSR1)) + { /* Catch SIGINFO and SIGUSR1, if they exist. */ + struct sigaction sa; + sa.sa_handler = siginfo_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; +#ifdef SIGINFO + if (sigaction(SIGINFO, &sa, NULL)) + bsdtar_errc(1, errno, "sigaction(SIGINFO) failed"); +#endif +#ifdef SIGUSR1 + /* ... and treat SIGUSR1 the same way as SIGINFO. */ + if (sigaction(SIGUSR1, &sa, NULL)) + bsdtar_errc(1, errno, "sigaction(SIGUSR1) failed"); +#endif + } #endif - /* Need bsdtar->progname before calling bsdtar_warnc. */ + /* Need bsdtar_progname before calling bsdtar_warnc. */ if (*argv == NULL) - bsdtar->progname = "bsdtar"; + bsdtar_progname = "bsdtar"; else { #if defined(_WIN32) && !defined(__CYGWIN__) - bsdtar->progname = strrchr(*argv, '\\'); + bsdtar_progname = strrchr(*argv, '\\'); #else - bsdtar->progname = strrchr(*argv, '/'); + bsdtar_progname = strrchr(*argv, '/'); #endif - if (bsdtar->progname != NULL) - bsdtar->progname++; + if (bsdtar_progname != NULL) + bsdtar_progname++; else - bsdtar->progname = *argv; + bsdtar_progname = *argv; } time(&now); if (setlocale(LC_ALL, "") == NULL) - bsdtar_warnc(bsdtar, 0, "Failed to set default locale"); + bsdtar_warnc(0, "Failed to set default locale"); #if defined(HAVE_NL_LANGINFO) && defined(HAVE_D_MD_ORDER) bsdtar->day_first = (*nl_langinfo(D_MD_ORDER) == 'd'); #endif @@ -158,8 +201,10 @@ main(int argc, char **argv) /* Default: Perform basic security checks. */ bsdtar->extract_flags |= SECURITY; - /* Defaults for root user: */ - if (bsdtar_is_privileged(bsdtar)) { +#ifndef _WIN32 + /* On POSIX systems, assume --same-owner and -p when run by + * the root user. This doesn't make any sense on Windows. */ + if (bsdtar->user_uid == 0) { /* --same-owner */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_OWNER; /* -p */ @@ -168,6 +213,7 @@ main(int argc, char **argv) bsdtar->extract_flags |= ARCHIVE_EXTRACT_XATTR; bsdtar->extract_flags |= ARCHIVE_EXTRACT_FFLAGS; } +#endif bsdtar->argv = argv; bsdtar->argc = argc; @@ -185,9 +231,9 @@ main(int argc, char **argv) break; case 'b': /* SUSv2 */ t = atoi(bsdtar->optarg); - if (t <= 0 || t > 1024) - bsdtar_errc(bsdtar, 1, 0, - "Argument to -b is out of range (1..1024)"); + if (t <= 0 || t > 8192) + bsdtar_errc(1, 0, + "Argument to -b is out of range (1..8192)"); bsdtar->bytes_per_block = 512 * t; break; case 'C': /* GNU tar */ @@ -203,8 +249,8 @@ main(int argc, char **argv) bsdtar->option_chroot = 1; break; case OPTION_EXCLUDE: /* GNU tar */ - if (exclude(bsdtar, bsdtar->optarg)) - bsdtar_errc(bsdtar, 1, 0, + if (lafe_exclude(&bsdtar->matching, bsdtar->optarg)) + bsdtar_errc(1, 0, "Couldn't exclude %s\n", bsdtar->optarg); break; case OPTION_FORMAT: /* GNU tar, others */ @@ -227,7 +273,7 @@ main(int argc, char **argv) possible_help_request = 1; break; case OPTION_HELP: /* GNU tar, others */ - long_help(bsdtar); + long_help(); exit(0); break; case 'I': /* GNU tar */ @@ -249,36 +295,24 @@ main(int argc, char **argv) * noone else needs this to filter entries * when transforming archives. */ - if (include(bsdtar, bsdtar->optarg)) - bsdtar_errc(bsdtar, 1, 0, + if (lafe_include(&bsdtar->matching, bsdtar->optarg)) + bsdtar_errc(1, 0, "Failed to add %s to inclusion list", bsdtar->optarg); break; case 'j': /* GNU tar */ -#if HAVE_LIBBZ2 if (bsdtar->create_compression != '\0') - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; -#else - bsdtar_warnc(bsdtar, 0, - "bzip2 compression not supported by this version of bsdtar"); - usage(bsdtar); -#endif break; case 'J': /* GNU tar 1.21 and later */ -#if HAVE_LIBLZMA if (bsdtar->create_compression != '\0') - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; -#else - bsdtar_warnc(bsdtar, 0, - "xz compression not supported by this version of bsdtar"); - usage(bsdtar); -#endif break; case 'k': /* GNU tar */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE; @@ -294,17 +328,11 @@ main(int argc, char **argv) bsdtar->option_warn_links = 1; break; case OPTION_LZMA: -#if HAVE_LIBLZMA if (bsdtar->create_compression != '\0') - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; -#else - bsdtar_warnc(bsdtar, 0, - "lzma compression not supported by this version of bsdtar"); - usage(bsdtar); -#endif break; case 'm': /* SUSv2 */ bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_TIME; @@ -326,7 +354,7 @@ main(int argc, char **argv) { struct stat st; if (stat(bsdtar->optarg, &st) != 0) - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't open file %s", bsdtar->optarg); bsdtar->newer_ctime_sec = st.st_ctime; bsdtar->newer_ctime_nsec = @@ -340,7 +368,7 @@ main(int argc, char **argv) { struct stat st; if (stat(bsdtar->optarg, &st) != 0) - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't open file %s", bsdtar->optarg); bsdtar->newer_mtime_sec = st.st_mtime; bsdtar->newer_mtime_nsec = @@ -411,9 +439,9 @@ main(int argc, char **argv) #if HAVE_REGEX_H add_substitution(bsdtar, bsdtar->optarg); #else - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "-s is not supported by this version of bsdtar"); - usage(bsdtar); + usage(); #endif break; case OPTION_SAME_OWNER: /* GNU tar */ @@ -457,8 +485,8 @@ main(int argc, char **argv) bsdtar->option_interactive = 1; break; case 'X': /* GNU tar */ - if (exclude_from_file(bsdtar, bsdtar->optarg)) - bsdtar_errc(bsdtar, 1, 0, + if (lafe_exclude_from_file(&bsdtar->matching, bsdtar->optarg)) + bsdtar_errc(1, 0, "failed to process exclusions from file %s", bsdtar->optarg); break; @@ -466,43 +494,31 @@ main(int argc, char **argv) set_mode(bsdtar, opt); break; case 'y': /* FreeBSD version of GNU tar */ -#if HAVE_LIBBZ2 if (bsdtar->create_compression != '\0') - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; -#else - bsdtar_warnc(bsdtar, 0, - "bzip2 compression not supported by this version of bsdtar"); - usage(bsdtar); -#endif break; case 'Z': /* GNU tar */ if (bsdtar->create_compression != '\0') - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; break; case 'z': /* GNU tar, star, many others */ -#if HAVE_LIBZ if (bsdtar->create_compression != '\0') - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't specify both -%c and -%c", opt, bsdtar->create_compression); bsdtar->create_compression = opt; -#else - bsdtar_warnc(bsdtar, 0, - "gzip compression not supported by this version of bsdtar"); - usage(bsdtar); -#endif break; case OPTION_USE_COMPRESS_PROGRAM: bsdtar->compress_program = bsdtar->optarg; break; default: - usage(bsdtar); + usage(); } } @@ -512,13 +528,13 @@ main(int argc, char **argv) /* If no "real" mode was specified, treat -h as --help. */ if ((bsdtar->mode == '\0') && possible_help_request) { - long_help(bsdtar); + long_help(); exit(0); } /* Otherwise, a mode is required. */ if (bsdtar->mode == '\0') - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Must specify one of -c, -r, -t, -u, -x"); /* Check boolean options only permitted in certain modes. */ @@ -592,13 +608,13 @@ main(int argc, char **argv) break; } - cleanup_exclusions(bsdtar); + lafe_cleanup_exclusions(&bsdtar->matching); #if HAVE_REGEX_H cleanup_substitution(bsdtar); #endif if (bsdtar->return_value != 0) - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Error exit delayed from previous errors."); return (bsdtar->return_value); } @@ -607,7 +623,7 @@ static void set_mode(struct bsdtar *bsdtar, char opt) { if (bsdtar->mode != '\0' && bsdtar->mode != opt) - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't specify both -%c and -%c", opt, bsdtar->mode); bsdtar->mode = opt; } @@ -619,18 +635,18 @@ static void only_mode(struct bsdtar *bsdtar, const char *opt, const char *valid_modes) { if (strchr(valid_modes, bsdtar->mode) == NULL) - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Option %s is not permitted in mode -%c", opt, bsdtar->mode); } void -usage(struct bsdtar *bsdtar) +usage(void) { const char *p; - p = bsdtar->progname; + p = bsdtar_progname; fprintf(stderr, "Usage:\n"); fprintf(stderr, " List: %s -tf \n", p); @@ -685,12 +701,12 @@ static const char *long_help_msg = * echo bsdtar; else echo not bsdtar; fi */ static void -long_help(struct bsdtar *bsdtar) +long_help(void) { const char *prog; const char *p; - prog = bsdtar->progname; + prog = bsdtar_progname; fflush(stderr); diff --git a/usr.bin/tar/bsdtar.h b/usr.bin/tar/bsdtar.h index f0f3e545495b..919156a0b1ab 100644 --- a/usr.bin/tar/bsdtar.h +++ b/usr.bin/tar/bsdtar.h @@ -28,6 +28,8 @@ #include "bsdtar_platform.h" #include +#include "matching.h" + #define DEFAULT_BYTES_PER_BLOCK (20*512) /* @@ -77,8 +79,6 @@ struct bsdtar { int fd; /* Miscellaneous state information */ - struct archive *archive; - const char *progname; int argc; char **argv; const char *optarg; @@ -98,7 +98,7 @@ struct bsdtar { struct archive_dir *archive_dir; /* for write.c */ struct name_cache *gname_cache; /* for write.c */ char *buff; /* for write.c */ - struct matching *matching; /* for matching.c */ + struct lafe_matching *matching; /* for matching.c */ struct security *security; /* for read.c */ struct name_cache *uname_cache; /* for write.c */ struct siginfo_data *siginfo; /* for siginfo.c */ @@ -134,37 +134,20 @@ enum { OPTION_VERSION }; - -void bsdtar_errc(struct bsdtar *, int _eval, int _code, - const char *fmt, ...) __LA_DEAD; int bsdtar_getopt(struct bsdtar *); -void bsdtar_warnc(struct bsdtar *, int _code, const char *fmt, ...); -void cleanup_exclusions(struct bsdtar *); void do_chdir(struct bsdtar *); int edit_pathname(struct bsdtar *, struct archive_entry *); -int exclude(struct bsdtar *, const char *pattern); -int exclude_from_file(struct bsdtar *, const char *pathname); -int excluded(struct bsdtar *, const char *pathname); -int include(struct bsdtar *, const char *pattern); -int include_from_file(struct bsdtar *, const char *pathname); +int need_report(void); int pathcmp(const char *a, const char *b); -int process_lines(struct bsdtar *bsdtar, const char *pathname, - int (*process)(struct bsdtar *, const char *)); void safe_fprintf(FILE *, const char *fmt, ...); void set_chdir(struct bsdtar *, const char *newdir); -void siginfo_init(struct bsdtar *); -void siginfo_setinfo(struct bsdtar *, const char * oper, - const char * path, int64_t size); -void siginfo_printinfo(struct bsdtar *, off_t progress); -void siginfo_done(struct bsdtar *); +const char *tar_i64toa(int64_t); void tar_mode_c(struct bsdtar *bsdtar); void tar_mode_r(struct bsdtar *bsdtar); void tar_mode_t(struct bsdtar *bsdtar); void tar_mode_u(struct bsdtar *bsdtar); void tar_mode_x(struct bsdtar *bsdtar); -int unmatched_inclusions(struct bsdtar *bsdtar); -int unmatched_inclusions_warn(struct bsdtar *bsdtar, const char *msg); -void usage(struct bsdtar *); +void usage(void); int yes(const char *fmt, ...); #if HAVE_REGEX_H diff --git a/usr.bin/tar/bsdtar_platform.h b/usr.bin/tar/bsdtar_platform.h index fb1444206a7b..5ad8d30a584d 100644 --- a/usr.bin/tar/bsdtar_platform.h +++ b/usr.bin/tar/bsdtar_platform.h @@ -37,19 +37,18 @@ #if defined(PLATFORM_CONFIG_H) /* Use hand-built config.h in environments that need it. */ #include PLATFORM_CONFIG_H -#elif defined(HAVE_CONFIG_H) -/* Most POSIX platforms use the 'configure' script to build config.h */ +#else +/* Not having a config.h of some sort is a serious problem. */ #include "config.h" -#else -/* Warn if bsdtar hasn't been (automatically or manually) configured. */ -#error Oops: No config.h and no built-in configuration in bsdtar_platform.h. -#endif /* !HAVE_CONFIG_H */ +#endif -/* No non-FreeBSD platform will have __FBSDID, so just define it here. */ -#ifdef __FreeBSD__ -#include /* For __FBSDID */ -#else -/* Just leaving this macro replacement empty leads to a dangling semicolon. */ +/* Get a real definition for __FBSDID if we can */ +#if HAVE_SYS_CDEFS_H +#include +#endif + +/* If not, define it so as to avoid dangling semicolons. */ +#ifndef __FBSDID #define __FBSDID(a) struct _undefined_hack #endif @@ -63,29 +62,6 @@ #include "archive_entry.h" #endif -/* - * Does this platform have complete-looking POSIX-style ACL support, - * including some variant of the acl_get_perm() function (which was - * omitted from the POSIX.1e draft)? - */ -#if HAVE_SYS_ACL_H && HAVE_ACL_PERMSET_T && HAVE_ACL_USER -#if HAVE_ACL_GET_PERM || HAVE_ACL_GET_PERM_NP -#define HAVE_POSIX_ACL 1 -#endif -#endif - -#ifdef HAVE_LIBACL -#include -#endif - -#if HAVE_ACL_GET_PERM -#define ACL_GET_PERM acl_get_perm -#else -#if HAVE_ACL_GET_PERM_NP -#define ACL_GET_PERM acl_get_perm_np -#endif -#endif - /* * Include "dirent.h" (or it's equivalent on several different platforms). * @@ -115,25 +91,6 @@ # endif #endif - -/* - * We need to be able to display a filesize using printf(). The type - * and format string here must be compatible with one another and - * large enough for any file. - */ -#if HAVE_UINTMAX_T -#define BSDTAR_FILESIZE_TYPE uintmax_t -#define BSDTAR_FILESIZE_PRINTF "%ju" -#else -#if HAVE_UNSIGNED_LONG_LONG -#define BSDTAR_FILESIZE_TYPE unsigned long long -#define BSDTAR_FILESIZE_PRINTF "%llu" -#else -#define BSDTAR_FILESIZE_TYPE unsigned long -#define BSDTAR_FILESIZE_PRINTF "%lu" -#endif -#endif - #if HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC #define ARCHIVE_STAT_CTIME_NANOS(st) (st)->st_ctimespec.tv_nsec #define ARCHIVE_STAT_MTIME_NANOS(st) (st)->st_mtimespec.tv_nsec @@ -164,12 +121,8 @@ #define __LA_DEAD #endif -#if defined(__CYGWIN__) -#include "bsdtar_cygwin.h" -#elif defined(_WIN32) /* && !__CYGWIN__ */ +#if defined(_WIN32) && !defined(__CYGWIN__) #include "bsdtar_windows.h" -#else -#define bsdtar_is_privileged(bsdtar) (bsdtar->user_uid == 0) #endif #endif /* !BSDTAR_PLATFORM_H_INCLUDED */ diff --git a/usr.bin/tar/cmdline.c b/usr.bin/tar/cmdline.c index efaeafdcb26e..dfe7cf6f0f95 100644 --- a/usr.bin/tar/cmdline.c +++ b/usr.bin/tar/cmdline.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #endif #include "bsdtar.h" +#include "err.h" /* * Short options for tar. Please keep this sorted. @@ -220,7 +221,7 @@ bsdtar_getopt(struct bsdtar *bsdtar) if (p[1] == ':') { bsdtar->optarg = *bsdtar->argv; if (bsdtar->optarg == NULL) { - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Option %c requires an argument", opt); return ('?'); @@ -287,7 +288,7 @@ bsdtar_getopt(struct bsdtar *bsdtar) /* Otherwise, pick up the next word. */ opt_word = *bsdtar->argv; if (opt_word == NULL) { - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Option -%c requires an argument", opt); return ('?'); @@ -338,13 +339,13 @@ bsdtar_getopt(struct bsdtar *bsdtar) /* Fail if there wasn't a unique match. */ if (match == NULL) { - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Option %s%s is not supported", long_prefix, opt_word); return ('?'); } if (match2 != NULL) { - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Ambiguous option %s%s (matches --%s and --%s)", long_prefix, opt_word, match->name, match2->name); return ('?'); @@ -356,7 +357,7 @@ bsdtar_getopt(struct bsdtar *bsdtar) if (bsdtar->optarg == NULL) { bsdtar->optarg = *bsdtar->argv; if (bsdtar->optarg == NULL) { - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Option %s%s requires an argument", long_prefix, match->name); return ('?'); @@ -367,7 +368,7 @@ bsdtar_getopt(struct bsdtar *bsdtar) } else { /* Argument forbidden: fail if there is one. */ if (bsdtar->optarg != NULL) { - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Option %s%s does not allow an argument", long_prefix, match->name); return ('?'); diff --git a/usr.bin/tar/config_freebsd.h b/usr.bin/tar/config_freebsd.h index 64e0d985cffc..965fe857ba7c 100644 --- a/usr.bin/tar/config_freebsd.h +++ b/usr.bin/tar/config_freebsd.h @@ -26,21 +26,10 @@ */ /* A default configuration for FreeBSD, used if there is no config.h. */ - #include /* __FreeBSD_version */ -#if __FreeBSD__ > 4 -#define HAVE_ACL_GET_PERM 0 -#define HAVE_ACL_GET_PERM_NP 1 -#define HAVE_ACL_PERMSET_T 1 -#define HAVE_ACL_USER 1 -#endif #undef HAVE_ATTR_XATTR_H -#define HAVE_BZLIB_H 1 -#define HAVE_CHFLAGS 1 #define HAVE_CHROOT 1 -#define HAVE_DECL_OPTARG 1 -#define HAVE_DECL_OPTIND 1 #define HAVE_DIRENT_D_NAMLEN 1 #define HAVE_DIRENT_H 1 #define HAVE_D_MD_ORDER 1 @@ -48,29 +37,13 @@ #undef HAVE_EXT2FS_EXT2_FS_H #define HAVE_FCHDIR 1 #define HAVE_FCNTL_H 1 -#define HAVE_FNMATCH 1 -#define HAVE_FNMATCH_H 1 -#define HAVE_FNM_LEADING_DIR 1 -#define HAVE_FTRUNCATE 1 -#undef HAVE_GETXATTR #define HAVE_GRP_H 1 -#define HAVE_INTTYPES_H 1 #define HAVE_LANGINFO_H 1 -#undef HAVE_LGETXATTR -#undef HAVE_LIBACL #define HAVE_LIBARCHIVE 1 -#define HAVE_LIBBZ2 1 -#define HAVE_LIBZ 1 #define HAVE_LIMITS_H 1 #undef HAVE_LINUX_EXT2_FS_H #undef HAVE_LINUX_FS_H -#undef HAVE_LISTXATTR -#undef HAVE_LLISTXATTR #define HAVE_LOCALE_H 1 -#define HAVE_MALLOC 1 -#define HAVE_MEMMOVE 1 -#define HAVE_MEMORY_H 1 -#define HAVE_MEMSET 1 #if __FreeBSD_version >= 450002 /* nl_langinfo introduced */ #define HAVE_NL_LANGINFO 1 #endif @@ -79,19 +52,11 @@ #define HAVE_REGEX_H 1 #define HAVE_SETLOCALE 1 #define HAVE_STDARG_H 1 -#define HAVE_STDINT_H 1 #define HAVE_STDLIB_H 1 -#define HAVE_STRCHR 1 -#define HAVE_STRDUP 1 -#define HAVE_STRERROR 1 -#define HAVE_STRFTIME 1 -#define HAVE_STRINGS_H 1 #define HAVE_STRING_H 1 -#define HAVE_STRRCHR 1 #define HAVE_STRUCT_STAT_ST_FLAGS 1 #undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC #define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1 -#define HAVE_SYS_ACL_H 1 #define HAVE_SYS_IOCTL_H 1 #define HAVE_SYS_PARAM_H 1 #define HAVE_SYS_STAT_H 1 @@ -100,9 +65,5 @@ #define HAVE_UINTMAX_T 1 #define HAVE_UNISTD_H 1 #define HAVE_UNSIGNED_LONG_LONG -#define HAVE_VPRINTF 1 #define HAVE_WCTYPE_H 1 -#define HAVE_ZLIB_H 1 #undef MAJOR_IN_MKDEV -#define STDC_HEADERS 1 - diff --git a/usr.bin/tar/err.c b/usr.bin/tar/err.c new file mode 100644 index 000000000000..377056146204 --- /dev/null +++ b/usr.bin/tar/err.c @@ -0,0 +1,74 @@ +/*- + * Copyright (c) 2003-2010 Tim Kientzle + * 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 + * in this position and unchanged. + * 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(S) ``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(S) 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 "bsdtar_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_STDARG_H +#include +#endif +#include +#ifdef HAVE_STDLIB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif + +#include "err.h" + +const char *bsdtar_progname; + +static void +bsdtar_vwarnc(int code, const char *fmt, va_list ap) +{ + fprintf(stderr, "%s: ", bsdtar_progname); + vfprintf(stderr, fmt, ap); + if (code != 0) + fprintf(stderr, ": %s", strerror(code)); + fprintf(stderr, "\n"); +} + +void +bsdtar_warnc(int code, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + bsdtar_vwarnc(code, fmt, ap); + va_end(ap); +} + +void +bsdtar_errc(int eval, int code, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + bsdtar_vwarnc(code, fmt, ap); + va_end(ap); + exit(eval); +} diff --git a/usr.bin/tar/err.h b/usr.bin/tar/err.h new file mode 100644 index 000000000000..84ed3f42d476 --- /dev/null +++ b/usr.bin/tar/err.h @@ -0,0 +1,43 @@ +/*- + * Copyright (c) 2009 Joerg Sonnenberger + * 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(S) ``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(S) 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$ + */ + +#ifndef LAFE_ERR_H +#define LAFE_ERR_H + +#if defined(__GNUC__) && (__GNUC__ > 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_DEAD __attribute__((__noreturn__)) +#else +#define __LA_DEAD +#endif + +extern const char *bsdtar_progname; + +void bsdtar_warnc(int code, const char *fmt, ...); +void bsdtar_errc(int eval, int code, const char *fmt, ...) __LA_DEAD; + +#endif diff --git a/usr.bin/tar/getdate.c b/usr.bin/tar/getdate.c index 8df1e26fba77..ffaa679ba1a3 100644 --- a/usr.bin/tar/getdate.c +++ b/usr.bin/tar/getdate.c @@ -219,7 +219,8 @@ datephrase(struct gdstate *gds) gds->Year = gds->tokenp[0].value; gds->Month = gds->tokenp[2].value; gds->Day = gds->tokenp[4].value; - } else if ((gds->tokenp[4].value >= 13) || (gds->tokenp[2].value >= 13)) { + } else if ((gds->tokenp[4].value >= 13) + || (gds->tokenp[2].value >= 13)) { /* Last number is big: 01/07/98 */ /* Middle number is big: 01/29/04 */ gds->Month = gds->tokenp[0].value; @@ -680,20 +681,6 @@ static struct LEXICON { { 0, NULL, 0, 0 } }; -/* - * Convert hour/minute/second to count of seconds. - */ -static time_t -ToSeconds(time_t Hours, time_t Minutes, time_t Seconds) -{ - if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59) - return -1; - if (Hours < 0 || Hours > 23) - return -1; - return Hours * HOUR + Minutes * MINUTE + Seconds; -} - - /* * Year is either: * = A number from 0 to 99, which means a year from 1970 to 2069, or @@ -707,7 +694,6 @@ Convert(time_t Month, time_t Day, time_t Year, static int DaysInMonth[12] = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - time_t tod; time_t Julian; int i; @@ -722,7 +708,10 @@ Convert(time_t Month, time_t Day, time_t Year, if (Year < EPOCH || Year > 2038 || Month < 1 || Month > 12 /* Lint fluff: "conversion from long may lose accuracy" */ - || Day < 1 || Day > DaysInMonth[(int)--Month]) + || Day < 1 || Day > DaysInMonth[(int)--Month] + || Hours < 0 || Hours > 23 + || Minutes < 0 || Minutes > 59 + || Seconds < 0 || Seconds > 59) return -1; Julian = Day - 1; @@ -732,9 +721,7 @@ Convert(time_t Month, time_t Day, time_t Year, Julian += 365 + (i % 4 == 0); Julian *= DAY; Julian += Timezone; - if ((tod = ToSeconds(Hours, Minutes, Seconds)) < 0) - return -1; - Julian += tod; + Julian += Hours * HOUR + Minutes * MINUTE + Seconds; if (DSTmode == DSTon || (DSTmode == DSTmaybe && localtime(&Julian)->tm_isdst)) Julian -= HOUR; @@ -838,7 +825,7 @@ nexttoken(char **in, time_t *value) } src++; } - buff[i++] = '\0'; + buff[i] = '\0'; /* * Find the first match. If the word can be diff --git a/usr.bin/tar/line_reader.c b/usr.bin/tar/line_reader.c new file mode 100644 index 000000000000..c9df1b0fbd50 --- /dev/null +++ b/usr.bin/tar/line_reader.c @@ -0,0 +1,171 @@ +/*- + * Copyright (c) 2008 Tim Kientzle + * 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 + * in this position and unchanged. + * 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(S) ``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(S) 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 "bsdtar_platform.h" +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include "err.h" +#include "line_reader.h" + +#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__BORLANDC__) +#define strdup _strdup +#endif + +/* + * Read lines from file and do something with each one. If option_null + * is set, lines are terminated with zero bytes; otherwise, they're + * terminated with newlines. + * + * This uses a self-sizing buffer to handle arbitrarily-long lines. + */ +struct lafe_line_reader { + FILE *f; + char *buff, *buff_end, *line_start, *line_end, *p; + char *pathname; + size_t buff_length; + int nullSeparator; /* Lines separated by null, not CR/CRLF/etc. */ + int ret; +}; + +struct lafe_line_reader * +lafe_line_reader(const char *pathname, int nullSeparator) +{ + struct lafe_line_reader *lr; + + lr = calloc(1, sizeof(*lr)); + if (lr == NULL) + bsdtar_errc(1, ENOMEM, "Can't open %s", pathname); + + lr->nullSeparator = nullSeparator; + lr->pathname = strdup(pathname); + + if (strcmp(pathname, "-") == 0) + lr->f = stdin; + else + lr->f = fopen(pathname, "r"); + if (lr->f == NULL) + bsdtar_errc(1, errno, "Couldn't open %s", pathname); + lr->buff_length = 8192; + lr->buff = malloc(lr->buff_length); + if (lr->buff == NULL) + bsdtar_errc(1, ENOMEM, "Can't read %s", pathname); + lr->line_start = lr->line_end = lr->buff_end = lr->buff; + + return (lr); +} + +const char * +lafe_line_reader_next(struct lafe_line_reader *lr) +{ + size_t bytes_wanted, bytes_read, new_buff_size; + char *line_start, *p; + + for (;;) { + /* If there's a line in the buffer, return it immediately. */ + while (lr->line_end < lr->buff_end) { + if (lr->nullSeparator) { + if (*lr->line_end == '\0') { + line_start = lr->line_start; + lr->line_start = lr->line_end + 1; + lr->line_end = lr->line_start; + return (line_start); + } + } else if (*lr->line_end == '\x0a' || *lr->line_end == '\x0d') { + *lr->line_end = '\0'; + line_start = lr->line_start; + lr->line_start = lr->line_end + 1; + lr->line_end = lr->line_start; + if (line_start[0] != '\0') + return (line_start); + } + lr->line_end++; + } + + /* If we're at end-of-file, process the final data. */ + if (lr->f == NULL) { + /* If there's more text, return one last line. */ + if (lr->line_end > lr->line_start) { + *lr->line_end = '\0'; + line_start = lr->line_start; + lr->line_start = lr->line_end + 1; + lr->line_end = lr->line_start; + return (line_start); + } + /* Otherwise, we're done. */ + return (NULL); + } + + /* Buffer only has part of a line. */ + if (lr->line_start > lr->buff) { + /* Move a leftover fractional line to the beginning. */ + memmove(lr->buff, lr->line_start, + lr->buff_end - lr->line_start); + lr->buff_end -= lr->line_start - lr->buff; + lr->line_end -= lr->line_start - lr->buff; + lr->line_start = lr->buff; + } else { + /* Line is too big; enlarge the buffer. */ + new_buff_size = lr->buff_length * 2; + if (new_buff_size <= lr->buff_length) + bsdtar_errc(1, ENOMEM, + "Line too long in %s", lr->pathname); + lr->buff_length = new_buff_size; + p = realloc(lr->buff, new_buff_size); + if (p == NULL) + bsdtar_errc(1, ENOMEM, + "Line too long in %s", lr->pathname); + lr->buff_end = p + (lr->buff_end - lr->buff); + lr->line_end = p + (lr->line_end - lr->buff); + lr->line_start = lr->buff = p; + } + + /* Get some more data into the buffer. */ + bytes_wanted = lr->buff + lr->buff_length - lr->buff_end; + bytes_read = fread(lr->buff_end, 1, bytes_wanted, lr->f); + lr->buff_end += bytes_read; + + if (ferror(lr->f)) + bsdtar_errc(1, errno, "Can't read %s", lr->pathname); + if (feof(lr->f)) { + if (lr->f != stdin) + fclose(lr->f); + lr->f = NULL; + } + } +} + +void +lafe_line_reader_free(struct lafe_line_reader *lr) +{ + free(lr->buff); + free(lr->pathname); + free(lr); +} diff --git a/usr.bin/tar/line_reader.h b/usr.bin/tar/line_reader.h new file mode 100644 index 000000000000..e4c3729e3c4d --- /dev/null +++ b/usr.bin/tar/line_reader.h @@ -0,0 +1,37 @@ +/*- + * Copyright (c) 2009 Joerg Sonnenberger + * 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(S) ``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(S) 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$ + */ + +#ifndef LAFE_LINE_READER_H +#define LAFE_LINE_READER_H + +struct lafe_line_reader; + +struct lafe_line_reader *lafe_line_reader(const char *, int nullSeparator); +const char *lafe_line_reader_next(struct lafe_line_reader *); +void lafe_line_reader_free(struct lafe_line_reader *); + +#endif diff --git a/usr.bin/tar/matching.c b/usr.bin/tar/matching.c index 36bc84b2f600..184d29a7ad4e 100644 --- a/usr.bin/tar/matching.c +++ b/usr.bin/tar/matching.c @@ -36,7 +36,10 @@ __FBSDID("$FreeBSD$"); #include #endif -#include "bsdtar.h" +#include "err.h" +#include "line_reader.h" +#include "matching.h" +#include "pathmatch.h" struct match { struct match *next; @@ -44,7 +47,7 @@ struct match { char pattern[1]; }; -struct matching { +struct lafe_matching { struct match *exclusions; int exclusions_count; struct match *inclusions; @@ -52,14 +55,10 @@ struct matching { int inclusions_unmatched_count; }; - -static void add_pattern(struct bsdtar *, struct match **list, - const char *pattern); -static int bsdtar_fnmatch(const char *p, const char *s); -static void initialize_matching(struct bsdtar *); +static void add_pattern(struct match **list, const char *pattern); +static void initialize_matching(struct lafe_matching **); static int match_exclusion(struct match *, const char *pathname); static int match_inclusion(struct match *, const char *pathname); -static int pathmatch(const char *p, const char *s); /* * The matching logic here needs to be re-thought. I started out to @@ -73,55 +72,74 @@ static int pathmatch(const char *p, const char *s); */ int -exclude(struct bsdtar *bsdtar, const char *pattern) +lafe_exclude(struct lafe_matching **matching, const char *pattern) { - struct matching *matching; - if (bsdtar->matching == NULL) - initialize_matching(bsdtar); - matching = bsdtar->matching; - add_pattern(bsdtar, &(matching->exclusions), pattern); - matching->exclusions_count++; + if (*matching == NULL) + initialize_matching(matching); + add_pattern(&((*matching)->exclusions), pattern); + (*matching)->exclusions_count++; return (0); } int -exclude_from_file(struct bsdtar *bsdtar, const char *pathname) +lafe_exclude_from_file(struct lafe_matching **matching, const char *pathname) { - return (process_lines(bsdtar, pathname, &exclude)); + struct lafe_line_reader *lr; + const char *p; + int ret = 0; + + lr = lafe_line_reader(pathname, '\n'); + while ((p = lafe_line_reader_next(lr)) != NULL) { + if (lafe_exclude(matching, p) != 0) + ret = -1; + } + lafe_line_reader_free(lr); + return (ret); } int -include(struct bsdtar *bsdtar, const char *pattern) +lafe_include(struct lafe_matching **matching, const char *pattern) { - struct matching *matching; - if (bsdtar->matching == NULL) - initialize_matching(bsdtar); - matching = bsdtar->matching; - add_pattern(bsdtar, &(matching->inclusions), pattern); - matching->inclusions_count++; - matching->inclusions_unmatched_count++; + if (*matching == NULL) + initialize_matching(matching); + add_pattern(&((*matching)->inclusions), pattern); + (*matching)->inclusions_count++; + (*matching)->inclusions_unmatched_count++; return (0); } int -include_from_file(struct bsdtar *bsdtar, const char *pathname) +lafe_include_from_file(struct lafe_matching **matching, const char *pathname, + int nullSeparator) { - return (process_lines(bsdtar, pathname, &include)); + struct lafe_line_reader *lr; + const char *p; + int ret = 0; + + lr = lafe_line_reader(pathname, nullSeparator); + while ((p = lafe_line_reader_next(lr)) != NULL) { + if (lafe_include(matching, p) != 0) + ret = -1; + } + lafe_line_reader_free(lr); + return (ret); } static void -add_pattern(struct bsdtar *bsdtar, struct match **list, const char *pattern) +add_pattern(struct match **list, const char *pattern) { struct match *match; + size_t len; - match = malloc(sizeof(*match) + strlen(pattern) + 1); + len = strlen(pattern); + match = malloc(sizeof(*match) + len + 1); if (match == NULL) - bsdtar_errc(bsdtar, 1, errno, "Out of memory"); + bsdtar_errc(1, errno, "Out of memory"); strcpy(match->pattern, pattern); /* Both "foo/" and "foo" should match "foo/bar". */ - if (match->pattern[strlen(match->pattern)-1] == '/') + if (len && match->pattern[len - 1] == '/') match->pattern[strlen(match->pattern)-1] = '\0'; match->next = *list; *list = match; @@ -130,13 +148,11 @@ add_pattern(struct bsdtar *bsdtar, struct match **list, const char *pattern) int -excluded(struct bsdtar *bsdtar, const char *pathname) +lafe_excluded(struct lafe_matching *matching, const char *pathname) { - struct matching *matching; struct match *match; struct match *matched; - matching = bsdtar->matching; if (matching == NULL) return (0); @@ -191,288 +207,74 @@ excluded(struct bsdtar *bsdtar, const char *pathname) static int match_exclusion(struct match *match, const char *pathname) { - const char *p; - - if (*match->pattern == '*' || *match->pattern == '/') - return (pathmatch(match->pattern, pathname) == 0); - - for (p = pathname; p != NULL; p = strchr(p, '/')) { - if (*p == '/') - p++; - if (pathmatch(match->pattern, p) == 0) - return (1); - } - return (0); + return (lafe_pathmatch(match->pattern, + pathname, + PATHMATCH_NO_ANCHOR_START | PATHMATCH_NO_ANCHOR_END)); } /* * Again, mimic gtar: inclusions are always anchored (have to match * the beginning of the path) even though exclusions are not anchored. */ -int +static int match_inclusion(struct match *match, const char *pathname) { - return (pathmatch(match->pattern, pathname) == 0); + return (lafe_pathmatch(match->pattern, pathname, PATHMATCH_NO_ANCHOR_END)); } void -cleanup_exclusions(struct bsdtar *bsdtar) +lafe_cleanup_exclusions(struct lafe_matching **matching) { struct match *p, *q; - if (bsdtar->matching) { - p = bsdtar->matching->inclusions; - while (p != NULL) { - q = p; - p = p->next; - free(q); - } - p = bsdtar->matching->exclusions; - while (p != NULL) { - q = p; - p = p->next; - free(q); - } - free(bsdtar->matching); + if (*matching == NULL) + return; + + for (p = (*matching)->inclusions; p != NULL; ) { + q = p; + p = p->next; + free(q); } + + for (p = (*matching)->exclusions; p != NULL; ) { + q = p; + p = p->next; + free(q); + } + + free(*matching); + *matching = NULL; } static void -initialize_matching(struct bsdtar *bsdtar) +initialize_matching(struct lafe_matching **matching) { - bsdtar->matching = malloc(sizeof(*bsdtar->matching)); - if (bsdtar->matching == NULL) - bsdtar_errc(bsdtar, 1, errno, "No memory"); - memset(bsdtar->matching, 0, sizeof(*bsdtar->matching)); + *matching = calloc(sizeof(**matching), 1); + if (*matching == NULL) + bsdtar_errc(1, errno, "No memory"); } int -unmatched_inclusions(struct bsdtar *bsdtar) +lafe_unmatched_inclusions(struct lafe_matching *matching) { - struct matching *matching; - matching = bsdtar->matching; if (matching == NULL) return (0); return (matching->inclusions_unmatched_count); } - int -unmatched_inclusions_warn(struct bsdtar *bsdtar, const char *msg) +lafe_unmatched_inclusions_warn(struct lafe_matching *matching, const char *msg) { - struct matching *matching; struct match *p; - matching = bsdtar->matching; if (matching == NULL) return (0); - p = matching->inclusions; - while (p != NULL) { - if (p->matches == 0) { - bsdtar->return_value = 1; - bsdtar_warnc(bsdtar, 0, "%s: %s", - p->pattern, msg); - } - p = p->next; + for (p = matching->inclusions; p != NULL; p = p->next) { + if (p->matches == 0) + bsdtar_warnc(0, "%s: %s", p->pattern, msg); } + return (matching->inclusions_unmatched_count); } - -/* - * TODO: Extend this so that the following matches work: - * "foo//bar" == "foo/bar" - * "foo/./bar" == "foo/bar" - * "./foo" == "foo" - * - * The POSIX fnmatch() function doesn't handle any of these, but - * all are common situations that arise when paths are generated within - * large scripts. E.g., the following is quite common: - * MYPATH=foo/ TARGET=$MYPATH/bar - * It may be worthwhile to edit such paths at write time as well, - * especially when such editing may avoid the need for long pathname - * extensions. - */ -static int -pathmatch(const char *pattern, const char *string) -{ - /* - * Strip leading "./" or ".//" so that, e.g., - * "foo" matches "./foo". In particular, this - * opens up an optimization for the writer to - * elide leading "./". - */ - if (pattern[0] == '.' && pattern[1] == '/') { - pattern += 2; - while (pattern[0] == '/') - ++pattern; - } - if (string[0] == '.' && string[1] == '/') { - string += 2; - while (string[0] == '/') - ++string; - } - return (bsdtar_fnmatch(pattern, string)); -} - - -#if defined(HAVE_FNMATCH) && defined(HAVE_FNM_LEADING_DIR) - -/* Use system fnmatch() if it suits our needs. */ -/* On Linux, _GNU_SOURCE must be defined to get FNM_LEADING_DIR. */ -#define _GNU_SOURCE -#include -static int -bsdtar_fnmatch(const char *pattern, const char *string) -{ - return (fnmatch(pattern, string, FNM_LEADING_DIR)); -} - -#else -/* - * The following was hacked from BSD C library - * code: src/lib/libc/gen/fnmatch.c,v 1.15 2002/02/01 - * - * In particular, most of the flags were ripped out: this always - * behaves like FNM_LEADING_DIR is set and other flags specified - * by POSIX are unset. - * - * Normally, I would not conditionally compile something like this: If - * I have to support it anyway, everyone may as well use it. ;-) - * However, the full POSIX spec for fnmatch() includes a lot of - * advanced character handling that I'm not ready to put in here, so - * it's probably best if people use a local version when it's available. - */ - -/* - * Copyright (c) 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - * - * 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. - */ - -static int -bsdtar_fnmatch(const char *pattern, const char *string) -{ - const char *saved_pattern; - int negate, matched; - char c; - - for (;;) { - switch (c = *pattern++) { - case '\0': - if (*string == '/' || *string == '\0') - return (0); - return (1); - case '?': - if (*string == '\0') - return (1); - ++string; - break; - case '*': - c = *pattern; - /* Collapse multiple stars. */ - while (c == '*') - c = *++pattern; - - /* Optimize for pattern with * at end. */ - if (c == '\0') - return (0); - - /* General case, use recursion. */ - while (*string != '\0') { - if (!bsdtar_fnmatch(pattern, string)) - return (0); - ++string; - } - return (1); - case '[': - if (*string == '\0') - return (1); - saved_pattern = pattern; - if (*pattern == '!' || *pattern == '^') { - negate = 1; - ++pattern; - } else - negate = 0; - matched = 0; - c = *pattern++; - do { - if (c == '\\') - c = *pattern++; - if (c == '\0') { - pattern = saved_pattern; - c = '['; - goto norm; - } - if (*pattern == '-') { - char c2 = *(pattern + 1); - if (c2 == '\0') { - pattern = saved_pattern; - c = '['; - goto norm; - } - if (c2 == ']') { - /* [a-] is not a range. */ - if (c == *string - || '-' == *string) - matched = 1; - pattern ++; - } else { - if (c <= *string - && *string <= c2) - matched = 1; - pattern += 2; - } - } else if (c == *string) - matched = 1; - c = *pattern++; - } while (c != ']'); - if (matched == negate) - return (1); - ++string; - break; - case '\\': - if ((c = *pattern++) == '\0') { - c = '\\'; - --pattern; - } - /* FALLTHROUGH */ - default: - norm: - if (c != *string) - return (1); - string++; - break; - } - } - /* NOTREACHED */ -} - -#endif diff --git a/usr.bin/tar/matching.h b/usr.bin/tar/matching.h new file mode 100644 index 000000000000..f4edebd43997 --- /dev/null +++ b/usr.bin/tar/matching.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 + * in this position and unchanged. + * 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(S) ``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(S) 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$ + */ + +#ifndef MATCHING_H +#define MATCHING_H + +struct lafe_matching; + +int lafe_exclude(struct lafe_matching **matching, const char *pattern); +int lafe_exclude_from_file(struct lafe_matching **matching, + const char *pathname); +int lafe_include(struct lafe_matching **matching, const char *pattern); +int lafe_include_from_file(struct lafe_matching **matching, + const char *pathname, int nullSeparator); + +int lafe_excluded(struct lafe_matching *, const char *pathname); +void lafe_cleanup_exclusions(struct lafe_matching **); +int lafe_unmatched_inclusions(struct lafe_matching *); +int lafe_unmatched_inclusions_warn(struct lafe_matching *, const char *msg); + +#endif diff --git a/usr.bin/tar/pathmatch.c b/usr.bin/tar/pathmatch.c new file mode 100644 index 000000000000..8b43138044f5 --- /dev/null +++ b/usr.bin/tar/pathmatch.c @@ -0,0 +1,255 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 + * in this position and unchanged. + * 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(S) ``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(S) 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 "bsdtar_platform.h" +__FBSDID("$FreeBSD$"); + +#ifdef HAVE_STRING_H +#include +#endif + +#include "pathmatch.h" + +/* + * Check whether a character 'c' is matched by a list specification [...]: + * * Leading '!' negates the class. + * * - is a range of characters + * * \ removes any special meaning for + * + * Some interesting boundary cases: + * a-d-e is one range (a-d) followed by two single characters - and e. + * \a-\d is same as a-d + * a\-d is three single characters: a, d, - + * Trailing - is not special (so [a-] is two characters a and -). + * Initial - is not special ([a-] is same as [-a] is same as [\\-a]) + * This function never sees a trailing \. + * [] always fails + * [!] always succeeds + */ +static int +pm_list(const char *start, const char *end, const char c, int flags) +{ + const char *p = start; + char rangeStart = '\0', nextRangeStart; + int match = 1, nomatch = 0; + + /* This will be used soon... */ + (void)flags; /* UNUSED */ + + /* If this is a negated class, return success for nomatch. */ + if (*p == '!' && p < end) { + match = 0; + nomatch = 1; + ++p; + } + + while (p < end) { + nextRangeStart = '\0'; + switch (*p) { + case '-': + /* Trailing or initial '-' is not special. */ + if ((rangeStart == '\0') || (p == end - 1)) { + if (*p == c) + return (match); + } else { + char rangeEnd = *++p; + if (rangeEnd == '\\') + rangeEnd = *++p; + if ((rangeStart <= c) && (c <= rangeEnd)) + return (match); + } + break; + case '\\': + ++p; + /* Fall through */ + default: + if (*p == c) + return (match); + nextRangeStart = *p; /* Possible start of range. */ + } + rangeStart = nextRangeStart; + ++p; + } + return (nomatch); +} + +/* + * If s is pointing to "./", ".//", "./././" or the like, skip it. + */ +static const char * +pm_slashskip(const char *s) { + while ((*s == '/') + || (s[0] == '.' && s[1] == '/') + || (s[0] == '.' && s[1] == '\0')) + ++s; + return (s); +} + +static int +pm(const char *p, const char *s, int flags) +{ + const char *end; + + /* + * Ignore leading './', './/', '././', etc. + */ + if (s[0] == '.' && s[1] == '/') + s = pm_slashskip(s + 1); + if (p[0] == '.' && p[1] == '/') + p = pm_slashskip(p + 1); + + for (;;) { + switch (*p) { + case '\0': + if (s[0] == '/') { + if (flags & PATHMATCH_NO_ANCHOR_END) + return (1); + /* "dir" == "dir/" == "dir/." */ + s = pm_slashskip(s); + } + return (*s == '\0'); + case '?': + /* ? always succeds, unless we hit end of 's' */ + if (*s == '\0') + return (0); + break; + case '*': + /* "*" == "**" == "***" ... */ + while (*p == '*') + ++p; + /* Trailing '*' always succeeds. */ + if (*p == '\0') + return (1); + while (*s) { + if (lafe_pathmatch(p, s, flags)) + return (1); + ++s; + } + return (0); + case '[': + /* + * Find the end of the [...] character class, + * ignoring \] that might occur within the class. + */ + end = p + 1; + while (*end != '\0' && *end != ']') { + if (*end == '\\' && end[1] != '\0') + ++end; + ++end; + } + if (*end == ']') { + /* We found [...], try to match it. */ + if (!pm_list(p + 1, end, *s, flags)) + return (0); + p = end; /* Jump to trailing ']' char. */ + break; + } else + /* No final ']', so just match '['. */ + if (*p != *s) + return (0); + break; + case '\\': + /* Trailing '\\' matches itself. */ + if (p[1] == '\0') { + if (*s != '\\') + return (0); + } else { + ++p; + if (*p != *s) + return (0); + } + break; + case '/': + if (*s != '/' && *s != '\0') + return (0); + /* Note: pattern "/\./" won't match "/"; + * pm_slashskip() correctly stops at backslash. */ + p = pm_slashskip(p); + s = pm_slashskip(s); + if (*p == '\0' && (flags & PATHMATCH_NO_ANCHOR_END)) + return (1); + --p; /* Counteract the increment below. */ + --s; + break; + case '$': + /* '$' is special only at end of pattern and only + * if PATHMATCH_NO_ANCHOR_END is specified. */ + if (p[1] == '\0' && (flags & PATHMATCH_NO_ANCHOR_END)){ + /* "dir" == "dir/" == "dir/." */ + return (*pm_slashskip(s) == '\0'); + } + /* Otherwise, '$' is not special. */ + /* FALL THROUGH */ + default: + if (*p != *s) + return (0); + break; + } + ++p; + ++s; + } +} + +/* Main entry point. */ +int +lafe_pathmatch(const char *p, const char *s, int flags) +{ + /* Empty pattern only matches the empty string. */ + if (p == NULL || *p == '\0') + return (s == NULL || *s == '\0'); + + /* Leading '^' anchors the start of the pattern. */ + if (*p == '^') { + ++p; + flags &= ~PATHMATCH_NO_ANCHOR_START; + } + + if (*p == '/' && *s != '/') + return (0); + + /* Certain patterns and file names anchor implicitly. */ + if (*p == '*' || *p == '/' || *p == '/') { + while (*p == '/') + ++p; + while (*s == '/') + ++s; + return (pm(p, s, flags)); + } + + /* If start is unanchored, try to match start of each path element. */ + if (flags & PATHMATCH_NO_ANCHOR_START) { + for ( ; s != NULL; s = strchr(s, '/')) { + if (*s == '/') + s++; + if (pm(p, s, flags)) + return (1); + } + return (0); + } + + /* Default: Match from beginning. */ + return (pm(p, s, flags)); +} diff --git a/usr.bin/tar/pathmatch.h b/usr.bin/tar/pathmatch.h new file mode 100644 index 000000000000..a92f3aef215d --- /dev/null +++ b/usr.bin/tar/pathmatch.h @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * 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 + * in this position and unchanged. + * 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(S) ``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(S) 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$ + */ + +#ifndef LAFE_PATHMATCH_H +#define LAFE_PATHMATCH_H + +/* Don't anchor at beginning unless the pattern starts with "^" */ +#define PATHMATCH_NO_ANCHOR_START 1 +/* Don't anchor at end unless the pattern ends with "$" */ +#define PATHMATCH_NO_ANCHOR_END 2 + +/* Note that "^" and "$" are not special unless you set the corresponding + * flag above. */ + +int lafe_pathmatch(const char *p, const char *s, int flags); + +#endif diff --git a/usr.bin/tar/read.c b/usr.bin/tar/read.c index 0756cd81132e..c0e5bcbf9bd0 100644 --- a/usr.bin/tar/read.c +++ b/usr.bin/tar/read.c @@ -29,11 +29,6 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_TYPES_H #include #endif -#ifdef MAJOR_IN_MKDEV -#include -#elif defined(MAJOR_IN_SYSMACROS) -#include -#endif #ifdef HAVE_SYS_PARAM_H #include #endif @@ -53,6 +48,9 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_PWD_H #include #endif +#ifdef HAVE_STDINT_H +#include +#endif #include #ifdef HAVE_STDLIB_H #include @@ -68,6 +66,13 @@ __FBSDID("$FreeBSD$"); #endif #include "bsdtar.h" +#include "err.h" + +struct progress_data { + struct bsdtar *bsdtar; + struct archive *archive; + struct archive_entry *entry; +}; static void list_item_verbose(struct bsdtar *, FILE *, struct archive_entry *); @@ -77,28 +82,48 @@ void tar_mode_t(struct bsdtar *bsdtar) { read_archive(bsdtar, 't'); - unmatched_inclusions_warn(bsdtar, "Not found in archive"); + if (lafe_unmatched_inclusions_warn(bsdtar->matching, "Not found in archive") != 0) + bsdtar->return_value = 1; } void tar_mode_x(struct bsdtar *bsdtar) { - /* We want to catch SIGINFO and SIGUSR1. */ - siginfo_init(bsdtar); - read_archive(bsdtar, 'x'); - unmatched_inclusions_warn(bsdtar, "Not found in archive"); - /* Restore old SIGINFO + SIGUSR1 handlers. */ - siginfo_done(bsdtar); + if (lafe_unmatched_inclusions_warn(bsdtar->matching, "Not found in archive") != 0) + bsdtar->return_value = 1; } static void -progress_func(void * cookie) +progress_func(void *cookie) { - struct bsdtar * bsdtar = cookie; + struct progress_data *progress_data = cookie; + struct bsdtar *bsdtar = progress_data->bsdtar; + struct archive *a = progress_data->archive; + struct archive_entry *entry = progress_data->entry; + uint64_t comp, uncomp; - siginfo_printinfo(bsdtar, 0); + if (!need_report()) + return; + + if (bsdtar->verbose) + fprintf(stderr, "\n"); + if (a != NULL) { + comp = archive_position_compressed(a); + uncomp = archive_position_uncompressed(a); + fprintf(stderr, + "In: %s bytes, compression %d%%;", + tar_i64toa(comp), (int)((uncomp - comp) * 100 / uncomp)); + fprintf(stderr, " Out: %d files, %s bytes\n", + archive_file_count(a), tar_i64toa(uncomp)); + } + if (entry != NULL) { + safe_fprintf(stderr, "Current: %s", + archive_entry_pathname(entry)); + fprintf(stderr, " (%s bytes)\n", + tar_i64toa(archive_entry_size(entry))); + } } /* @@ -107,6 +132,7 @@ progress_func(void * cookie) static void read_archive(struct bsdtar *bsdtar, char mode) { + struct progress_data progress_data; FILE *out; struct archive *a; struct archive_entry *entry; @@ -114,12 +140,13 @@ read_archive(struct bsdtar *bsdtar, char mode) int r; while (*bsdtar->argv) { - include(bsdtar, *bsdtar->argv); + lafe_include(&bsdtar->matching, *bsdtar->argv); bsdtar->argv++; } if (bsdtar->names_from_file != NULL) - include_from_file(bsdtar, bsdtar->names_from_file); + lafe_include_from_file(&bsdtar->matching, + bsdtar->names_from_file, bsdtar->option_null); a = archive_read_new(); if (bsdtar->compress_program != NULL) @@ -128,27 +155,29 @@ read_archive(struct bsdtar *bsdtar, char mode) archive_read_support_compression_all(a); archive_read_support_format_all(a); if (ARCHIVE_OK != archive_read_set_options(a, bsdtar->option_options)) - bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + bsdtar_errc(1, 0, "%s", archive_error_string(a)); if (archive_read_open_file(a, bsdtar->filename, bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block : DEFAULT_BYTES_PER_BLOCK)) - bsdtar_errc(bsdtar, 1, 0, "Error opening archive: %s", + bsdtar_errc(1, 0, "Error opening archive: %s", archive_error_string(a)); do_chdir(bsdtar); if (mode == 'x') { /* Set an extract callback so that we can handle SIGINFO. */ + progress_data.bsdtar = bsdtar; + progress_data.archive = a; archive_read_extract_set_progress_callback(a, progress_func, - bsdtar); + &progress_data); } if (mode == 'x' && bsdtar->option_chroot) { #if HAVE_CHROOT if (chroot(".") != 0) - bsdtar_errc(bsdtar, 1, errno, "Can't chroot to \".\""); + bsdtar_errc(1, errno, "Can't chroot to \".\""); #else - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "chroot isn't supported on this platform"); #endif } @@ -156,19 +185,20 @@ read_archive(struct bsdtar *bsdtar, char mode) for (;;) { /* Support --fast-read option */ if (bsdtar->option_fast_read && - unmatched_inclusions(bsdtar) == 0) + lafe_unmatched_inclusions(bsdtar->matching) == 0) break; r = archive_read_next_header(a, &entry); + progress_data.entry = entry; if (r == ARCHIVE_EOF) break; if (r < ARCHIVE_OK) - bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a)); + bsdtar_warnc(0, "%s", archive_error_string(a)); if (r <= ARCHIVE_WARN) bsdtar->return_value = 1; if (r == ARCHIVE_RETRY) { /* Retryable error: try again */ - bsdtar_warnc(bsdtar, 0, "Retrying..."); + bsdtar_warnc(0, "Retrying..."); continue; } if (r == ARCHIVE_FATAL) @@ -209,7 +239,7 @@ read_archive(struct bsdtar *bsdtar, char mode) * rewrite, there would be no way to exclude foo1/bar * while allowing foo2/bar.) */ - if (excluded(bsdtar, archive_entry_pathname(entry))) + if (lafe_excluded(bsdtar->matching, archive_entry_pathname(entry))) continue; /* Excluded by a pattern test. */ if (mode == 't') { @@ -232,17 +262,17 @@ read_archive(struct bsdtar *bsdtar, char mode) r = archive_read_data_skip(a); if (r == ARCHIVE_WARN) { fprintf(out, "\n"); - bsdtar_warnc(bsdtar, 0, "%s", + bsdtar_warnc(0, "%s", archive_error_string(a)); } if (r == ARCHIVE_RETRY) { fprintf(out, "\n"); - bsdtar_warnc(bsdtar, 0, "%s", + bsdtar_warnc(0, "%s", archive_error_string(a)); } if (r == ARCHIVE_FATAL) { fprintf(out, "\n"); - bsdtar_warnc(bsdtar, 0, "%s", + bsdtar_warnc(0, "%s", archive_error_string(a)); bsdtar->return_value = 1; break; @@ -267,10 +297,7 @@ read_archive(struct bsdtar *bsdtar, char mode) fflush(stderr); } - /* Tell the SIGINFO-handler code what we're doing. */ - siginfo_setinfo(bsdtar, "extracting", - archive_entry_pathname(entry), 0); - siginfo_printinfo(bsdtar, 0); + // TODO siginfo_printinfo(bsdtar, 0); if (bsdtar->option_stdout) r = archive_read_data_into_fd(a, 1); @@ -297,7 +324,7 @@ read_archive(struct bsdtar *bsdtar, char mode) r = archive_read_close(a); if (r != ARCHIVE_OK) - bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a)); + bsdtar_warnc(0, "%s", archive_error_string(a)); if (r <= ARCHIVE_WARN) bsdtar->return_value = 1; @@ -320,7 +347,6 @@ read_archive(struct bsdtar *bsdtar, char mode) static void list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) { - const struct stat *st; char tmp[100]; size_t w; const char *p; @@ -328,8 +354,6 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) time_t tim; static time_t now; - st = archive_entry_stat(entry); - /* * We avoid collecting the entire list in memory at once by * listing things as we see them. However, that also means we can't @@ -345,12 +369,13 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) time(&now); fprintf(out, "%s %d ", archive_entry_strmode(entry), - (int)(st->st_nlink)); + archive_entry_nlink(entry)); /* Use uname if it's present, else uid. */ p = archive_entry_uname(entry); if ((p == NULL) || (*p == '\0')) { - sprintf(tmp, "%lu ", (unsigned long)st->st_uid); + sprintf(tmp, "%lu ", + (unsigned long)archive_entry_uid(entry)); p = tmp; } w = strlen(p); @@ -364,7 +389,8 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) fprintf(out, "%s", p); w = strlen(p); } else { - sprintf(tmp, "%lu", (unsigned long)st->st_gid); + sprintf(tmp, "%lu", + (unsigned long)archive_entry_gid(entry)); w = strlen(tmp); fprintf(out, "%s", tmp); } @@ -374,37 +400,30 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) * total width of group and devnum/filesize fields be gs_width. * If gs_width is too small, grow it. */ - if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) { + if (archive_entry_filetype(entry) == AE_IFCHR + || archive_entry_filetype(entry) == AE_IFBLK) { sprintf(tmp, "%lu,%lu", - (unsigned long)major(st->st_rdev), - (unsigned long)minor(st->st_rdev)); /* ls(1) also casts here. */ + (unsigned long)archive_entry_rdevmajor(entry), + (unsigned long)archive_entry_rdevminor(entry)); } else { - /* - * Note the use of platform-dependent macros to format - * the filesize here. We need the format string and the - * corresponding type for the cast. - */ - sprintf(tmp, BSDTAR_FILESIZE_PRINTF, - (BSDTAR_FILESIZE_TYPE)st->st_size); + strcpy(tmp, tar_i64toa(archive_entry_size(entry))); } if (w + strlen(tmp) >= bsdtar->gs_width) bsdtar->gs_width = w+strlen(tmp)+1; fprintf(out, "%*s", (int)(bsdtar->gs_width - w), tmp); /* Format the time using 'ls -l' conventions. */ - tim = (time_t)st->st_mtime; + tim = archive_entry_mtime(entry); +#define HALF_YEAR (time_t)365 * 86400 / 2 #if defined(_WIN32) && !defined(__CYGWIN__) - /* Windows' strftime function does not support %e format. */ - if (abs(tim - now) > (365/2)*86400) - fmt = bsdtar->day_first ? "%d %b %Y" : "%b %d %Y"; - else - fmt = bsdtar->day_first ? "%d %b %H:%M" : "%b %d %H:%M"; +#define DAY_FMT "%d" /* Windows' strftime function does not support %e format. */ #else - if (abs(tim - now) > (365/2)*86400) - fmt = bsdtar->day_first ? "%e %b %Y" : "%b %e %Y"; - else - fmt = bsdtar->day_first ? "%e %b %H:%M" : "%b %e %H:%M"; +#define DAY_FMT "%e" /* Day number without leading zeros */ #endif + if (tim < now - HALF_YEAR || tim > now + HALF_YEAR) + fmt = bsdtar->day_first ? DAY_FMT " %b %Y" : "%b " DAY_FMT " %Y"; + else + fmt = bsdtar->day_first ? DAY_FMT " %b %H:%M" : "%b " DAY_FMT " %H:%M"; strftime(tmp, sizeof(tmp), fmt, localtime(&tim)); fprintf(out, " %s ", tmp); safe_fprintf(out, "%s", archive_entry_pathname(entry)); @@ -413,6 +432,6 @@ list_item_verbose(struct bsdtar *bsdtar, FILE *out, struct archive_entry *entry) if (archive_entry_hardlink(entry)) /* Hard link */ safe_fprintf(out, " link to %s", archive_entry_hardlink(entry)); - else if (S_ISLNK(st->st_mode)) /* Symbolic link */ + else if (archive_entry_symlink(entry)) /* Symbolic link */ safe_fprintf(out, " -> %s", archive_entry_symlink(entry)); } diff --git a/usr.bin/tar/siginfo.c b/usr.bin/tar/siginfo.c deleted file mode 100644 index e0881ac1a1db..000000000000 --- a/usr.bin/tar/siginfo.c +++ /dev/null @@ -1,151 +0,0 @@ -/*- - * Copyright 2008 Colin Percival - * 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(S) ``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(S) 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 "bsdtar_platform.h" -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include - -#include "bsdtar.h" - -/* Is there a pending SIGINFO or SIGUSR1? */ -static volatile sig_atomic_t siginfo_received = 0; - -struct siginfo_data { - /* What sort of operation are we doing? */ - char * oper; - - /* What path are we handling? */ - char * path; - - /* How large is the archive entry? */ - int64_t size; - - /* Old signal handlers. */ -#ifdef SIGINFO - void (*siginfo_old)(int); -#endif - void (*sigusr1_old)(int); -}; - -static void siginfo_handler(int sig); - -/* Handler for SIGINFO / SIGUSR1. */ -static void -siginfo_handler(int sig) -{ - - (void)sig; /* UNUSED */ - - /* Record that SIGINFO or SIGUSR1 has been received. */ - siginfo_received = 1; -} - -void -siginfo_init(struct bsdtar *bsdtar) -{ - - /* Allocate space for internal structure. */ - if ((bsdtar->siginfo = malloc(sizeof(struct siginfo_data))) == NULL) - bsdtar_errc(bsdtar, 1, errno, "malloc failed"); - - /* Set the strings to NULL so that free() is safe. */ - bsdtar->siginfo->path = bsdtar->siginfo->oper = NULL; - -#ifdef SIGINFO - /* We want to catch SIGINFO, if it exists. */ - bsdtar->siginfo->siginfo_old = signal(SIGINFO, siginfo_handler); -#endif -#ifdef SIGUSR1 - /* ... and treat SIGUSR1 the same way as SIGINFO. */ - bsdtar->siginfo->sigusr1_old = signal(SIGUSR1, siginfo_handler); -#endif -} - -void -siginfo_setinfo(struct bsdtar *bsdtar, const char * oper, const char * path, - int64_t size) -{ - - /* Free old operation and path strings. */ - free(bsdtar->siginfo->oper); - free(bsdtar->siginfo->path); - - /* Duplicate strings and store entry size. */ - if ((bsdtar->siginfo->oper = strdup(oper)) == NULL) - bsdtar_errc(bsdtar, 1, errno, "Cannot strdup"); - if ((bsdtar->siginfo->path = strdup(path)) == NULL) - bsdtar_errc(bsdtar, 1, errno, "Cannot strdup"); - bsdtar->siginfo->size = size; -} - -void -siginfo_printinfo(struct bsdtar *bsdtar, off_t progress) -{ - - /* If there's a signal to handle and we know what we're doing... */ - if ((siginfo_received == 1) && - (bsdtar->siginfo->path != NULL) && - (bsdtar->siginfo->oper != NULL)) { - if (bsdtar->verbose) - fprintf(stderr, "\n"); - if (bsdtar->siginfo->size > 0) { - safe_fprintf(stderr, "%s %s (%ju / %" PRId64 ")", - bsdtar->siginfo->oper, bsdtar->siginfo->path, - (uintmax_t)progress, bsdtar->siginfo->size); - } else { - safe_fprintf(stderr, "%s %s", - bsdtar->siginfo->oper, bsdtar->siginfo->path); - } - if (!bsdtar->verbose) - fprintf(stderr, "\n"); - siginfo_received = 0; - } -} - -void -siginfo_done(struct bsdtar *bsdtar) -{ - -#ifdef SIGINFO - /* Restore old SIGINFO handler. */ - signal(SIGINFO, bsdtar->siginfo->siginfo_old); -#endif -#ifdef SIGUSR1 - /* And the old SIGUSR1 handler, too. */ - signal(SIGUSR1, bsdtar->siginfo->sigusr1_old); -#endif - - /* Free strings. */ - free(bsdtar->siginfo->path); - free(bsdtar->siginfo->oper); - - /* Free internal data structure. */ - free(bsdtar->siginfo); -} diff --git a/usr.bin/tar/subst.c b/usr.bin/tar/subst.c index 13464cd5e16e..44fd87ba0cf8 100644 --- a/usr.bin/tar/subst.c +++ b/usr.bin/tar/subst.c @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #if HAVE_REGEX_H #include "bsdtar.h" +#include "err.h" #include #include @@ -56,7 +57,7 @@ init_substitution(struct bsdtar *bsdtar) bsdtar->substitution = subst = malloc(sizeof(*subst)); if (subst == NULL) - bsdtar_errc(bsdtar, 1, errno, "Out of memory"); + bsdtar_errc(1, errno, "Out of memory"); subst->first_rule = subst->last_rule = NULL; } @@ -76,7 +77,7 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text) rule = malloc(sizeof(*rule)); if (rule == NULL) - bsdtar_errc(bsdtar, 1, errno, "Out of memory"); + bsdtar_errc(1, errno, "Out of memory"); rule->next = NULL; if (subst->last_rule == NULL) @@ -86,32 +87,32 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text) subst->last_rule = rule; if (*rule_text == '\0') - bsdtar_errc(bsdtar, 1, 0, "Empty replacement string"); + bsdtar_errc(1, 0, "Empty replacement string"); end_pattern = strchr(rule_text + 1, *rule_text); if (end_pattern == NULL) - bsdtar_errc(bsdtar, 1, 0, "Invalid replacement string"); + bsdtar_errc(1, 0, "Invalid replacement string"); pattern = malloc(end_pattern - rule_text); if (pattern == NULL) - bsdtar_errc(bsdtar, 1, errno, "Out of memory"); + bsdtar_errc(1, errno, "Out of memory"); memcpy(pattern, rule_text + 1, end_pattern - rule_text - 1); pattern[end_pattern - rule_text - 1] = '\0'; if ((r = regcomp(&rule->re, pattern, REG_BASIC)) != 0) { char buf[80]; regerror(r, &rule->re, buf, sizeof(buf)); - bsdtar_errc(bsdtar, 1, 0, "Invalid regular expression: %s", buf); + bsdtar_errc(1, 0, "Invalid regular expression: %s", buf); } free(pattern); start_subst = end_pattern + 1; end_pattern = strchr(start_subst, *rule_text); if (end_pattern == NULL) - bsdtar_errc(bsdtar, 1, 0, "Invalid replacement string"); + bsdtar_errc(1, 0, "Invalid replacement string"); rule->result = malloc(end_pattern - start_subst + 1); if (rule->result == NULL) - bsdtar_errc(bsdtar, 1, errno, "Out of memory"); + bsdtar_errc(1, errno, "Out of memory"); memcpy(rule->result, start_subst, end_pattern - start_subst); rule->result[end_pattern - start_subst] = '\0'; @@ -134,13 +135,13 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text) rule->symlink = 1; break; default: - bsdtar_errc(bsdtar, 1, 0, "Invalid replacement flag %c", *end_pattern); + bsdtar_errc(1, 0, "Invalid replacement flag %c", *end_pattern); } } } static void -realloc_strncat(struct bsdtar *bsdtar, char **str, const char *append, size_t len) +realloc_strncat(char **str, const char *append, size_t len) { char *new_str; size_t old_len; @@ -152,7 +153,7 @@ realloc_strncat(struct bsdtar *bsdtar, char **str, const char *append, size_t le new_str = malloc(old_len + len + 1); if (new_str == NULL) - bsdtar_errc(bsdtar, 1, errno, "Out of memory"); + bsdtar_errc(1, errno, "Out of memory"); memcpy(new_str, *str, old_len); memcpy(new_str + old_len, append, len); new_str[old_len + len] = '\0'; @@ -161,7 +162,7 @@ realloc_strncat(struct bsdtar *bsdtar, char **str, const char *append, size_t le } static void -realloc_strcat(struct bsdtar *bsdtar, char **str, const char *append) +realloc_strcat(char **str, const char *append) { char *new_str; size_t old_len; @@ -173,7 +174,7 @@ realloc_strcat(struct bsdtar *bsdtar, char **str, const char *append) new_str = malloc(old_len + strlen(append) + 1); if (new_str == NULL) - bsdtar_errc(bsdtar, 1, errno, "Out of memory"); + bsdtar_errc(1, errno, "Out of memory"); memcpy(new_str, *str, old_len); strcpy(new_str + old_len, append); free(*str); @@ -206,12 +207,12 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, int s got_match = 1; print_match |= rule->print; - realloc_strncat(bsdtar, result, name, matches[0].rm_so); + realloc_strncat(result, name, matches[0].rm_so); for (i = 0, j = 0; rule->result[i] != '\0'; ++i) { if (rule->result[i] == '~') { - realloc_strncat(bsdtar, result, rule->result + j, i - j); - realloc_strncat(bsdtar, result, name, matches[0].rm_eo); + realloc_strncat(result, rule->result + j, i - j); + realloc_strncat(result, name, matches[0].rm_eo); j = i + 1; continue; } @@ -223,7 +224,7 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, int s switch (c) { case '~': case '\\': - realloc_strncat(bsdtar, result, rule->result + j, i - j - 1); + realloc_strncat(result, rule->result + j, i - j - 1); j = i; break; case '1': @@ -235,13 +236,13 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, int s case '7': case '8': case '9': - realloc_strncat(bsdtar, result, rule->result + j, i - j - 1); + realloc_strncat(result, rule->result + j, i - j - 1); if ((size_t)(c - '0') > (size_t)(rule->re.re_nsub)) { free(*result); *result = NULL; return -1; } - realloc_strncat(bsdtar, result, name + matches[c - '0'].rm_so, matches[c - '0'].rm_eo - matches[c - '0'].rm_so); + realloc_strncat(result, name + matches[c - '0'].rm_so, matches[c - '0'].rm_eo - matches[c - '0'].rm_so); j = i + 1; break; default: @@ -251,7 +252,7 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, int s } - realloc_strcat(bsdtar, result, rule->result + j); + realloc_strcat(result, rule->result + j); name += matches[0].rm_eo; @@ -260,7 +261,7 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, int s } if (got_match) - realloc_strcat(bsdtar, result, name); + realloc_strcat(result, name); if (print_match) fprintf(stderr, "%s >> %s\n", path, *result); diff --git a/usr.bin/tar/test/Makefile b/usr.bin/tar/test/Makefile index 2f6f05665cdb..3880be051d2a 100644 --- a/usr.bin/tar/test/Makefile +++ b/usr.bin/tar/test/Makefile @@ -45,7 +45,6 @@ CFLAGS+= -I${TAR_SRCDIR} # Uncomment to link against dmalloc #LDADD+= -L/usr/local/lib -ldmalloc #CFLAGS+= -I/usr/local/include -DUSE_DMALLOC -WARNS=6 check test: bsdtar_test ./bsdtar_test -p ${.OBJDIR}/../bsdtar -r ${.CURDIR} diff --git a/usr.bin/tar/test/test_option_T.c b/usr.bin/tar/test/test_option_T.c index 9f4a2b34c6cf..72dcd541b8d6 100644 --- a/usr.bin/tar/test/test_option_T.c +++ b/usr.bin/tar/test/test_option_T.c @@ -43,7 +43,7 @@ DEFINE_TEST(test_option_T) int r; struct stat st; - /* Create a simple dir heirarchy; bail if anything fails. */ + /* Create a simple dir hierarchy; bail if anything fails. */ if (!assertEqualInt(0, mkdir("d1", 0755))) return; if (!assertEqualInt(0, mkdir("d1/d2", 0755))) return; if (!touch("d1/f1")) return; diff --git a/usr.bin/tar/test/test_option_s.c b/usr.bin/tar/test/test_option_s.c index 1059066fd5cc..c9a68997428f 100644 --- a/usr.bin/tar/test/test_option_s.c +++ b/usr.bin/tar/test/test_option_s.c @@ -44,7 +44,7 @@ DEFINE_TEST(test_option_s) { struct stat st; - /* Create a sample file heirarchy. */ + /* Create a sample file hierarchy. */ assertEqualInt(0, mkdir("in", 0755)); assertEqualInt(0, mkdir("in/d1", 0755)); assertEqualInt(0, mkfile("in/d1/foo", "foo")); diff --git a/usr.bin/tar/tree.c b/usr.bin/tar/tree.c index f70b6d5a6492..58e9febd3d8e 100644 --- a/usr.bin/tar/tree.c +++ b/usr.bin/tar/tree.c @@ -313,7 +313,7 @@ tree_next(struct tree *t) * violation. Just crash now. */ if (t->visit_type == TREE_ERROR_FATAL) { const char *msg = "Unable to continue traversing" - " directory heirarchy after a fatal error."; + " directory hierarchy after a fatal error."; write(2, msg, strlen(msg)); *(int *)0 = 1; /* Deliberate SEGV; NULL pointer dereference. */ exit(1); /* In case the SEGV didn't work. */ diff --git a/usr.bin/tar/util.c b/usr.bin/tar/util.c index 7b2da4888ace..858d472cba70 100644 --- a/usr.bin/tar/util.c +++ b/usr.bin/tar/util.c @@ -36,9 +36,15 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include #endif +#ifdef HAVE_IO_H +#include +#endif #ifdef HAVE_STDARG_H #include #endif +#ifdef HAVE_STDINT_H +#include +#endif #include #ifdef HAVE_STDLIB_H #include @@ -54,12 +60,15 @@ __FBSDID("$FreeBSD$"); #endif #include "bsdtar.h" +#include "err.h" -static void bsdtar_vwarnc(struct bsdtar *, int code, - const char *fmt, va_list ap); static size_t bsdtar_expand_char(char *, size_t, char); static const char *strip_components(const char *path, int elements); +#if defined(_WIN32) && !defined(__CYGWIN__) +#define read _read +#endif + /* TODO: Hack up a version of mbtowc for platforms with no wide * character support at all. I think the following might suffice, * but it needs careful testing. @@ -88,7 +97,7 @@ safe_fprintf(FILE *f, const char *fmt, ...) char *fmtbuff_heap; /* If fmtbuff_stack is too small, we use malloc */ char *fmtbuff; /* Pointer to fmtbuff_stack or fmtbuff_heap. */ int fmtbuff_length; - int length; + int length, n; va_list ap; const char *p; unsigned i; @@ -125,14 +134,13 @@ safe_fprintf(FILE *f, const char *fmt, ...) /* Note: mbrtowc() has a cleaner API, but mbtowc() seems a bit * more portable, so we use that here instead. */ - mbtowc(NULL, NULL, 0); /* Reset the shift state. */ + n = mbtowc(NULL, NULL, 1); /* Reset the shift state. */ /* Write data, expanding unprintable characters. */ p = fmtbuff; i = 0; try_wc = 1; while (*p != '\0') { - int n; /* Convert to wide char, test if the wide * char is printable in the current locale. */ @@ -145,24 +153,24 @@ safe_fprintf(FILE *f, const char *fmt, ...) } else { /* Not printable, format the bytes. */ while (n-- > 0) - i += bsdtar_expand_char( + i += (unsigned)bsdtar_expand_char( outbuff, i, *p++); } } else { /* After any conversion failure, don't bother * trying to convert the rest. */ - i += bsdtar_expand_char(outbuff, i, *p++); + i += (unsigned)bsdtar_expand_char(outbuff, i, *p++); try_wc = 0; } /* If our output buffer is full, dump it and keep going. */ if (i > (sizeof(outbuff) - 20)) { - outbuff[i++] = '\0'; + outbuff[i] = '\0'; fprintf(f, "%s", outbuff); i = 0; } } - outbuff[i++] = '\0'; + outbuff[i] = '\0'; fprintf(f, "%s", outbuff); /* If we allocated a heap-based formatting buffer, free it now. */ @@ -203,37 +211,6 @@ bsdtar_expand_char(char *buff, size_t offset, char c) return (i - offset); } -static void -bsdtar_vwarnc(struct bsdtar *bsdtar, int code, const char *fmt, va_list ap) -{ - fprintf(stderr, "%s: ", bsdtar->progname); - vfprintf(stderr, fmt, ap); - if (code != 0) - fprintf(stderr, ": %s", strerror(code)); - fprintf(stderr, "\n"); -} - -void -bsdtar_warnc(struct bsdtar *bsdtar, int code, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - bsdtar_vwarnc(bsdtar, code, fmt, ap); - va_end(ap); -} - -void -bsdtar_errc(struct bsdtar *bsdtar, int eval, int code, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - bsdtar_vwarnc(bsdtar, code, fmt, ap); - va_end(ap); - exit(eval); -} - int yes(const char *fmt, ...) { @@ -269,95 +246,6 @@ yes(const char *fmt, ...) return (0); } -/* - * Read lines from file and do something with each one. If option_null - * is set, lines are terminated with zero bytes; otherwise, they're - * terminated with newlines. - * - * This uses a self-sizing buffer to handle arbitrarily-long lines. - * If the "process" function returns non-zero for any line, this - * function will return non-zero after attempting to process all - * remaining lines. - */ -int -process_lines(struct bsdtar *bsdtar, const char *pathname, - int (*process)(struct bsdtar *, const char *)) -{ - FILE *f; - char *buff, *buff_end, *line_start, *line_end, *p; - size_t buff_length, new_buff_length, bytes_read, bytes_wanted; - int separator; - int ret; - - separator = bsdtar->option_null ? '\0' : '\n'; - ret = 0; - - if (strcmp(pathname, "-") == 0) - f = stdin; - else - f = fopen(pathname, "r"); - if (f == NULL) - bsdtar_errc(bsdtar, 1, errno, "Couldn't open %s", pathname); - buff_length = 8192; - buff = malloc(buff_length); - if (buff == NULL) - bsdtar_errc(bsdtar, 1, ENOMEM, "Can't read %s", pathname); - line_start = line_end = buff_end = buff; - for (;;) { - /* Get some more data into the buffer. */ - bytes_wanted = buff + buff_length - buff_end; - bytes_read = fread(buff_end, 1, bytes_wanted, f); - buff_end += bytes_read; - /* Process all complete lines in the buffer. */ - while (line_end < buff_end) { - if (*line_end == separator) { - *line_end = '\0'; - if ((*process)(bsdtar, line_start) != 0) - ret = -1; - line_start = line_end + 1; - line_end = line_start; - } else - line_end++; - } - if (feof(f)) - break; - if (ferror(f)) - bsdtar_errc(bsdtar, 1, errno, - "Can't read %s", pathname); - if (line_start > buff) { - /* Move a leftover fractional line to the beginning. */ - memmove(buff, line_start, buff_end - line_start); - buff_end -= line_start - buff; - line_end -= line_start - buff; - line_start = buff; - } else { - /* Line is too big; enlarge the buffer. */ - new_buff_length = buff_length * 2; - if (new_buff_length <= buff_length) - bsdtar_errc(bsdtar, 1, ENOMEM, - "Line too long in %s", pathname); - buff_length = new_buff_length; - p = realloc(buff, buff_length); - if (p == NULL) - bsdtar_errc(bsdtar, 1, ENOMEM, - "Line too long in %s", pathname); - buff_end = p + (buff_end - buff); - line_end = p + (line_end - buff); - line_start = buff = p; - } - } - /* At end-of-file, handle the final line. */ - if (line_end > line_start) { - *line_end = '\0'; - if ((*process)(bsdtar, line_start) != 0) - ret = -1; - } - free(buff); - if (f != stdin) - fclose(f); - return (ret); -} - /*- * The logic here for -C attempts to avoid * chdir() as long as possible. For example: @@ -374,6 +262,8 @@ process_lines(struct bsdtar *bsdtar, const char *pathname, * This way, programs that build tar command lines don't have to worry * about -C with non-existent directories; such requests will only * fail if the directory must be accessed. + * + * TODO: Make this handle Windows paths correctly. */ void set_chdir(struct bsdtar *bsdtar, const char *newdir) @@ -399,7 +289,7 @@ set_chdir(struct bsdtar *bsdtar, const char *newdir) free(old_pending); } if (bsdtar->pending_chdir == NULL) - bsdtar_errc(bsdtar, 1, errno, "No memory"); + bsdtar_errc(1, errno, "No memory"); } void @@ -409,23 +299,24 @@ do_chdir(struct bsdtar *bsdtar) return; if (chdir(bsdtar->pending_chdir) != 0) { - bsdtar_errc(bsdtar, 1, 0, "could not chdir to '%s'\n", + bsdtar_errc(1, 0, "could not chdir to '%s'\n", bsdtar->pending_chdir); } free(bsdtar->pending_chdir); bsdtar->pending_chdir = NULL; } -const char * -strip_components(const char *path, int elements) +static const char * +strip_components(const char *p, int elements) { - const char *p = path; - + /* Skip as many elements as necessary. */ while (elements > 0) { switch (*p++) { case '/': +#if defined(_WIN32) && !defined(__CYGWIN__) + case '\\': /* Support \ path sep on Windows ONLY. */ +#endif elements--; - path = p; break; case '\0': /* Path is too short, skip it. */ @@ -433,12 +324,25 @@ strip_components(const char *path, int elements) } } - while (*path == '/') - ++path; - if (*path == '\0') - return (NULL); - - return (path); + /* Skip any / characters. This handles short paths that have + * additional / termination. This also handles the case where + * the logic above stops in the middle of a duplicate // + * sequence (which would otherwise get converted to an + * absolute path). */ + for (;;) { + switch (*p) { + case '/': +#if defined(_WIN32) && !defined(__CYGWIN__) + case '\\': /* Support \ path sep on Windows ONLY. */ +#endif + ++p; + break; + case '\0': + return (NULL); + default: + return (p); + } + } } /* @@ -459,7 +363,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) #if HAVE_REGEX_H r = apply_substitution(bsdtar, name, &subst_name, 0); if (r == -1) { - bsdtar_warnc(bsdtar, 0, "Invalid substitution, skipping entry"); + bsdtar_warnc(0, "Invalid substitution, skipping entry"); return 1; } if (r == 1) { @@ -475,7 +379,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) if (archive_entry_hardlink(entry)) { r = apply_substitution(bsdtar, archive_entry_hardlink(entry), &subst_name, 1); if (r == -1) { - bsdtar_warnc(bsdtar, 0, "Invalid substitution, skipping entry"); + bsdtar_warnc(0, "Invalid substitution, skipping entry"); return 1; } if (r == 1) { @@ -486,7 +390,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) if (archive_entry_symlink(entry) != NULL) { r = apply_substitution(bsdtar, archive_entry_symlink(entry), &subst_name, 1); if (r == -1) { - bsdtar_warnc(bsdtar, 0, "Invalid substitution, skipping entry"); + bsdtar_warnc(0, "Invalid substitution, skipping entry"); return 1; } if (r == 1) { @@ -560,11 +464,11 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) if (p != name && !bsdtar->warned_lead_slash) { /* Generate a warning the first time this happens. */ if (slashonly) - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Removing leading '%c' from member names", name[0]); else - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "Removing leading drive letter from " "member names"); bsdtar->warned_lead_slash = 1; @@ -590,6 +494,28 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) return (0); } +/* + * It would be nice to just use printf() for formatting large numbers, + * but the compatibility problems are quite a headache. Hence the + * following simple utility function. + */ +const char * +tar_i64toa(int64_t n0) +{ + static char buff[24]; + int64_t n = n0 < 0 ? -n0 : n0; + char *p = buff + sizeof(buff); + + *--p = '\0'; + do { + *--p = '0' + (int)(n % 10); + n /= 10; + } while (n > 0); + if (n0 < 0) + *--p = '-'; + return p; +} + /* * Like strcmp(), but try to be a little more aware of the fact that * we're comparing two paths. Right now, it just handles leading @@ -600,6 +526,9 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) * TODO: Publish the path normalization routines in libarchive so * that bsdtar can normalize paths and use fast strcmp() instead * of this. + * + * Note: This is currently only used within write.c, so should + * not handle \ path separators. */ int diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c index efc94de682d6..31005eb7f87c 100644 --- a/usr.bin/tar/write.c +++ b/usr.bin/tar/write.c @@ -29,9 +29,6 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_TYPES_H #include #endif -#ifdef HAVE_SYS_ACL_H -#include -#endif #ifdef HAVE_SYS_IOCTL_H #include #endif @@ -47,12 +44,12 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_FCNTL_H #include #endif -#ifdef HAVE_FNMATCH_H -#include -#endif #ifdef HAVE_GRP_H #include #endif +#ifdef HAVE_IO_H +#include +#endif #ifdef HAVE_LIMITS_H #include #endif @@ -73,6 +70,9 @@ __FBSDID("$FreeBSD$"); #ifdef HAVE_PWD_H #include #endif +#ifdef HAVE_STDINT_H +#include +#endif #include #ifdef HAVE_STDLIB_H #include @@ -85,6 +85,8 @@ __FBSDID("$FreeBSD$"); #endif #include "bsdtar.h" +#include "err.h" +#include "line_reader.h" #include "tree.h" /* Size of buffer for holding file data prior to writing. */ @@ -124,12 +126,12 @@ static int append_archive_filename(struct bsdtar *, struct archive *, const char *fname); static void archive_names_from_file(struct bsdtar *bsdtar, struct archive *a); -static int archive_names_from_file_helper(struct bsdtar *bsdtar, - const char *line); -static int copy_file_data(struct bsdtar *bsdtar, - struct archive *a, struct archive *ina); +static int copy_file_data(struct bsdtar *, struct archive *a, + struct archive *ina, struct archive_entry *); static int new_enough(struct bsdtar *, const char *path, const struct stat *); +static void report_write(struct bsdtar *, struct archive *, + struct archive_entry *, int64_t progress); static void test_for_append(struct bsdtar *); static void write_archive(struct archive *, struct bsdtar *); static void write_entry_backend(struct bsdtar *, struct archive *, @@ -139,6 +141,23 @@ static int write_file_data(struct bsdtar *, struct archive *, static void write_hierarchy(struct bsdtar *, struct archive *, const char *); +#if defined(_WIN32) && !defined(__CYGWIN__) +/* Not a full lseek() emulation, but enough for our needs here. */ +static int +seek_file(int fd, int64_t offset, int whence) +{ + LARGE_INTEGER distance; + (void)whence; /* UNUSED */ + distance.QuadPart = offset; + return (SetFilePointerEx((HANDLE)_get_osfhandle(fd), + distance, NULL, FILE_BEGIN) ? 1 : -1); +} +#define open _open +#define close _close +#define read _read +#define lseek seek_file +#endif + void tar_mode_c(struct bsdtar *bsdtar) { @@ -146,7 +165,7 @@ tar_mode_c(struct bsdtar *bsdtar) int r; if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL) - bsdtar_errc(bsdtar, 1, 0, "no files or directories specified"); + bsdtar_errc(1, 0, "no files or directories specified"); a = archive_write_new(); @@ -161,7 +180,7 @@ tar_mode_c(struct bsdtar *bsdtar) fprintf(stderr, "Can't use format %s: %s\n", bsdtar->create_format, archive_error_string(a)); - usage(bsdtar); + usage(); } /* @@ -182,40 +201,39 @@ tar_mode_c(struct bsdtar *bsdtar) } else { switch (bsdtar->create_compression) { case 0: - archive_write_set_compression_none(a); + r = archive_write_set_compression_none(a); break; -#ifdef HAVE_LIBBZ2 case 'j': case 'y': - archive_write_set_compression_bzip2(a); + r = archive_write_set_compression_bzip2(a); break; -#endif -#ifdef HAVE_LIBLZMA case 'J': - archive_write_set_compression_xz(a); + r = archive_write_set_compression_xz(a); break; case OPTION_LZMA: - archive_write_set_compression_lzma(a); + r = archive_write_set_compression_lzma(a); break; -#endif -#ifdef HAVE_LIBZ case 'z': - archive_write_set_compression_gzip(a); + r = archive_write_set_compression_gzip(a); break; -#endif case 'Z': - archive_write_set_compression_compress(a); + r = archive_write_set_compression_compress(a); break; default: - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Unrecognized compression option -%c", bsdtar->create_compression); } + if (r != ARCHIVE_OK) { + bsdtar_errc(1, 0, + "Unsupported compression option -%c", + bsdtar->create_compression); + } } if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options)) - bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + bsdtar_errc(1, 0, "%s", archive_error_string(a)); if (ARCHIVE_OK != archive_write_open_file(a, bsdtar->filename)) - bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + bsdtar_errc(1, 0, "%s", archive_error_string(a)); write_archive(a, bsdtar); } @@ -226,7 +244,7 @@ tar_mode_c(struct bsdtar *bsdtar) void tar_mode_r(struct bsdtar *bsdtar) { - off_t end_offset; + int64_t end_offset; int format; struct archive *a; struct archive_entry *entry; @@ -237,9 +255,13 @@ tar_mode_r(struct bsdtar *bsdtar) format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED; +#if defined(__BORLANDC__) + bsdtar->fd = open(bsdtar->filename, O_RDWR | O_CREAT); +#else bsdtar->fd = open(bsdtar->filename, O_RDWR | O_CREAT, 0666); +#endif if (bsdtar->fd < 0) - bsdtar_errc(bsdtar, 1, errno, + bsdtar_errc(1, errno, "Cannot open %s", bsdtar->filename); a = archive_read_new(); @@ -248,14 +270,14 @@ tar_mode_r(struct bsdtar *bsdtar) archive_read_support_format_gnutar(a); r = archive_read_open_fd(a, bsdtar->fd, 10240); if (r != ARCHIVE_OK) - bsdtar_errc(bsdtar, 1, archive_errno(a), + bsdtar_errc(1, archive_errno(a), "Can't read archive %s: %s", bsdtar->filename, archive_error_string(a)); while (0 == archive_read_next_header(a, &entry)) { if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) { archive_read_finish(a); close(bsdtar->fd); - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Cannot append to compressed archive."); } /* Keep going until we hit end-of-archive */ @@ -284,7 +306,7 @@ tar_mode_r(struct bsdtar *bsdtar) format &= ARCHIVE_FORMAT_BASE_MASK; if (format != (int)(archive_format(a) & ARCHIVE_FORMAT_BASE_MASK) && format != ARCHIVE_FORMAT_EMPTY) { - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Format %s is incompatible with the archive %s.", bsdtar->create_format, bsdtar->filename); } @@ -300,11 +322,12 @@ tar_mode_r(struct bsdtar *bsdtar) format = ARCHIVE_FORMAT_TAR_PAX_RESTRICTED; archive_write_set_format(a, format); } - lseek(bsdtar->fd, end_offset, SEEK_SET); /* XXX check return val XXX */ + if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0) + bsdtar_errc(1, errno, "Could not seek to archive end"); if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options)) - bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + bsdtar_errc(1, 0, "%s", archive_error_string(a)); if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd)) - bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + bsdtar_errc(1, 0, "%s", archive_error_string(a)); write_archive(a, bsdtar); /* XXX check return val XXX */ @@ -315,7 +338,7 @@ tar_mode_r(struct bsdtar *bsdtar) void tar_mode_u(struct bsdtar *bsdtar) { - off_t end_offset; + int64_t end_offset; struct archive *a; struct archive_entry *entry; int format; @@ -332,7 +355,7 @@ tar_mode_u(struct bsdtar *bsdtar) bsdtar->fd = open(bsdtar->filename, O_RDWR); if (bsdtar->fd < 0) - bsdtar_errc(bsdtar, 1, errno, + bsdtar_errc(1, errno, "Cannot open %s", bsdtar->filename); a = archive_read_new(); @@ -342,7 +365,7 @@ tar_mode_u(struct bsdtar *bsdtar) if (archive_read_open_fd(a, bsdtar->fd, bsdtar->bytes_per_block != 0 ? bsdtar->bytes_per_block : DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) { - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Can't open %s: %s", bsdtar->filename, archive_error_string(a)); } @@ -352,7 +375,7 @@ tar_mode_u(struct bsdtar *bsdtar) if (archive_compression(a) != ARCHIVE_COMPRESSION_NONE) { archive_read_finish(a); close(bsdtar->fd); - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Cannot append to compressed archive."); } add_dir_list(bsdtar, archive_entry_pathname(entry), @@ -382,12 +405,12 @@ tar_mode_u(struct bsdtar *bsdtar) bsdtar->bytes_per_block); } else archive_write_set_bytes_per_block(a, DEFAULT_BYTES_PER_BLOCK); - lseek(bsdtar->fd, end_offset, SEEK_SET); - ftruncate(bsdtar->fd, end_offset); + if (lseek(bsdtar->fd, end_offset, SEEK_SET) < 0) + bsdtar_errc(1, errno, "Could not seek to archive end"); if (ARCHIVE_OK != archive_write_set_options(a, bsdtar->option_options)) - bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + bsdtar_errc(1, 0, "%s", archive_error_string(a)); if (ARCHIVE_OK != archive_write_open_fd(a, bsdtar->fd)) - bsdtar_errc(bsdtar, 1, 0, archive_error_string(a)); + bsdtar_errc(1, 0, "%s", archive_error_string(a)); write_archive(a, bsdtar); @@ -413,19 +436,16 @@ write_archive(struct archive *a, struct bsdtar *bsdtar) const char *arg; struct archive_entry *entry, *sparse_entry; - /* We want to catch SIGINFO and SIGUSR1. */ - siginfo_init(bsdtar); - /* Allocate a buffer for file data. */ if ((bsdtar->buff = malloc(FILEDATABUFLEN)) == NULL) - bsdtar_errc(bsdtar, 1, 0, "cannot allocate memory"); + bsdtar_errc(1, 0, "cannot allocate memory"); if ((bsdtar->resolver = archive_entry_linkresolver_new()) == NULL) - bsdtar_errc(bsdtar, 1, 0, "cannot create link resolver"); + bsdtar_errc(1, 0, "cannot create link resolver"); archive_entry_linkresolver_set_strategy(bsdtar->resolver, archive_format(a)); if ((bsdtar->diskreader = archive_read_disk_new()) == NULL) - bsdtar_errc(bsdtar, 1, 0, "Cannot create read_disk object"); + bsdtar_errc(1, 0, "Cannot create read_disk object"); archive_read_disk_set_standard_lookup(bsdtar->diskreader); if (bsdtar->names_from_file != NULL) @@ -439,7 +459,7 @@ write_archive(struct archive *a, struct bsdtar *bsdtar) bsdtar->argv++; arg = *bsdtar->argv; if (arg == NULL) { - bsdtar_warnc(bsdtar, 1, 0, + bsdtar_warnc(0, "%s", "Missing argument for -C"); bsdtar->return_value = 1; goto cleanup; @@ -454,12 +474,7 @@ write_archive(struct archive *a, struct bsdtar *bsdtar) arg + 1) != 0) break; } else -#if defined(_WIN32) && !defined(__CYGWIN__) - write_hierarchy_win(bsdtar, a, arg, - write_hierarchy); -#else write_hierarchy(bsdtar, a, arg); -#endif } bsdtar->argv++; } @@ -474,7 +489,7 @@ write_archive(struct archive *a, struct bsdtar *bsdtar) } if (archive_write_close(a)) { - bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a)); + bsdtar_warnc(0, "%s", archive_error_string(a)); bsdtar->return_value = 1; } @@ -487,14 +502,11 @@ cleanup: bsdtar->diskreader = NULL; if (bsdtar->option_totals) { - fprintf(stderr, "Total bytes written: " BSDTAR_FILESIZE_PRINTF "\n", - (BSDTAR_FILESIZE_TYPE)archive_position_compressed(a)); + fprintf(stderr, "Total bytes written: %s\n", + tar_i64toa(archive_position_compressed(a))); } archive_write_finish(a); - - /* Restore old SIGINFO + SIGUSR1 handlers. */ - siginfo_done(bsdtar); } /* @@ -504,36 +516,34 @@ cleanup: * cause the next line to be a directory to pass to chdir(). If * --null is specified, then a line "-C" is just another filename. */ -void +static void archive_names_from_file(struct bsdtar *bsdtar, struct archive *a) { - bsdtar->archive = a; + struct lafe_line_reader *lr; + const char *line; bsdtar->next_line_is_dir = 0; - process_lines(bsdtar, bsdtar->names_from_file, - archive_names_from_file_helper); + + lr = lafe_line_reader(bsdtar->names_from_file, bsdtar->option_null); + while ((line = lafe_line_reader_next(lr)) != NULL) { + if (bsdtar->next_line_is_dir) { + set_chdir(bsdtar, line); + bsdtar->next_line_is_dir = 0; + } else if (!bsdtar->option_null && strcmp(line, "-C") == 0) + bsdtar->next_line_is_dir = 1; + else { + if (*line != '/') + do_chdir(bsdtar); /* Handle a deferred -C */ + write_hierarchy(bsdtar, a, line); + } + } + lafe_line_reader_free(lr); if (bsdtar->next_line_is_dir) - bsdtar_errc(bsdtar, 1, errno, + bsdtar_errc(1, errno, "Unexpected end of filename list; " "directory expected after -C"); } -static int -archive_names_from_file_helper(struct bsdtar *bsdtar, const char *line) -{ - if (bsdtar->next_line_is_dir) { - set_chdir(bsdtar, line); - bsdtar->next_line_is_dir = 0; - } else if (!bsdtar->option_null && strcmp(line, "-C") == 0) - bsdtar->next_line_is_dir = 1; - else { - if (*line != '/') - do_chdir(bsdtar); /* Handle a deferred -C */ - write_hierarchy(bsdtar, bsdtar->archive, line); - } - return (0); -} - /* * Copy from specified archive to current archive. Returns non-zero * for write errors (which force us to terminate the entire archiving @@ -555,15 +565,15 @@ append_archive_filename(struct bsdtar *bsdtar, struct archive *a, archive_read_support_format_all(ina); archive_read_support_compression_all(ina); if (archive_read_open_file(ina, filename, 10240)) { - bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(ina)); + bsdtar_warnc(0, "%s", archive_error_string(ina)); bsdtar->return_value = 1; return (0); } rc = append_archive(bsdtar, a, ina); - if (archive_errno(ina)) { - bsdtar_warnc(bsdtar, 0, "Error reading archive %s: %s", + if (rc != ARCHIVE_OK) { + bsdtar_warnc(0, "Error reading archive %s: %s", filename, archive_error_string(ina)); bsdtar->return_value = 1; } @@ -582,7 +592,7 @@ append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina) if (!new_enough(bsdtar, archive_entry_pathname(in_entry), archive_entry_stat(in_entry))) continue; - if (excluded(bsdtar, archive_entry_pathname(in_entry))) + if (lafe_excluded(bsdtar->matching, archive_entry_pathname(in_entry))) continue; if (bsdtar->option_interactive && !yes("copy '%s'", archive_entry_pathname(in_entry))) @@ -590,15 +600,13 @@ append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina) if (bsdtar->verbose) safe_fprintf(stderr, "a %s", archive_entry_pathname(in_entry)); - siginfo_setinfo(bsdtar, "copying", - archive_entry_pathname(in_entry), - archive_entry_size(in_entry)); - siginfo_printinfo(bsdtar, 0); + if (need_report()) + report_write(bsdtar, a, in_entry, 0); e = archive_write_header(a, in_entry); if (e != ARCHIVE_OK) { if (!bsdtar->verbose) - bsdtar_warnc(bsdtar, 0, "%s: %s", + bsdtar_warnc(0, "%s: %s", archive_entry_pathname(in_entry), archive_error_string(a)); else @@ -610,7 +618,7 @@ append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina) if (e >= ARCHIVE_WARN) { if (archive_entry_size(in_entry) == 0) archive_read_data_skip(ina); - else if (copy_file_data(bsdtar, a, ina)) + else if (copy_file_data(bsdtar, a, ina, in_entry)) exit(1); } @@ -624,20 +632,22 @@ append_archive(struct bsdtar *bsdtar, struct archive *a, struct archive *ina) /* Helper function to copy data between archives. */ static int -copy_file_data(struct bsdtar *bsdtar, struct archive *a, struct archive *ina) +copy_file_data(struct bsdtar *bsdtar, struct archive *a, + struct archive *ina, struct archive_entry *entry) { ssize_t bytes_read; ssize_t bytes_written; - off_t progress = 0; + int64_t progress = 0; bytes_read = archive_read_data(ina, bsdtar->buff, FILEDATABUFLEN); while (bytes_read > 0) { - siginfo_printinfo(bsdtar, progress); + if (need_report()) + report_write(bsdtar, a, entry, progress); bytes_written = archive_write_data(a, bsdtar->buff, bytes_read); if (bytes_written < bytes_read) { - bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a)); + bsdtar_warnc(0, "%s", archive_error_string(a)); return (-1); } progress += bytes_written; @@ -664,12 +674,12 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) tree = tree_open(path); if (!tree) { - bsdtar_warnc(bsdtar, errno, "%s: Cannot open", path); + bsdtar_warnc(errno, "%s: Cannot open", path); bsdtar->return_value = 1; return; } - while ((tree_ret = tree_next(tree))) { + while ((tree_ret = tree_next(tree)) != 0) { int r; const char *name = tree_current_path(tree); const struct stat *st = NULL; /* info to use for this entry */ @@ -677,11 +687,11 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) int descend; if (tree_ret == TREE_ERROR_FATAL) - bsdtar_errc(bsdtar, 1, tree_errno(tree), + bsdtar_errc(1, tree_errno(tree), "%s: Unable to continue traversing directory tree", name); if (tree_ret == TREE_ERROR_DIR) { - bsdtar_warnc(bsdtar, errno, + bsdtar_warnc(errno, "%s: Couldn't visit directory", name); bsdtar->return_value = 1; } @@ -692,7 +702,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) * If this file/dir is excluded by a filename * pattern, skip it. */ - if (excluded(bsdtar, name)) + if (lafe_excluded(bsdtar->matching, name)) continue; /* @@ -701,7 +711,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) lst = tree_current_lstat(tree); if (lst == NULL) { /* Couldn't lstat(); must not exist. */ - bsdtar_warnc(bsdtar, errno, "%s: Cannot stat", name); + bsdtar_warnc(errno, "%s: Cannot stat", name); /* Return error if files disappear during traverse. */ bsdtar->return_value = 1; continue; @@ -739,17 +749,38 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) } /* - * If user has asked us not to cross mount points, - * then don't descend into into a dir on a different - * device. + * Are we about to cross to a new filesystem? */ if (!dev_recorded) { + /* This is the initial file system. */ first_dev = lst->st_dev; dev_recorded = 1; - } - if (bsdtar->option_dont_traverse_mounts) { - if (lst->st_dev != first_dev) - descend = 0; + } else if (lst->st_dev == first_dev) { + /* The starting file system is always acceptable. */ + } else if (descend == 0) { + /* We're not descending, so no need to check. */ + } else if (bsdtar->option_dont_traverse_mounts) { + /* User has asked us not to cross mount points. */ + descend = 0; + } else { + /* We're prepared to cross a mount point. */ + + /* XXX TODO: check whether this filesystem is + * synthetic and/or local. Add a new + * --local-only option to skip non-local + * filesystems. Skip synthetic filesystems + * regardless. + * + * The results should be cached, since + * tree.c doesn't usually visit a directory + * and the directory contents together. A simple + * move-to-front list should perform quite well. + * + * This is going to be heavily OS dependent: + * FreeBSD's statfs() in conjunction with getvfsbyname() + * provides all of this; NetBSD's statvfs() does + * most of it; other systems will vary. + */ } /* @@ -771,11 +802,27 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) * calling this so we can pass in an fd and shorten * the race to query metadata. The linkify dance * makes this more complex than it might sound. */ +#if defined(_WIN32) && !defined(__CYGWIN__) + /* TODO: tree.c uses stat(), which is badly broken + * on Windows. To fix this, we should + * deprecate tree_current_stat() and provide a new + * call tree_populate_entry(t, entry). This call + * would use stat() internally on POSIX and + * GetInfoByFileHandle() internally on Windows. + * This would be another step towards a tree-walker + * that can be integrated deep into libarchive. + * For now, just set st to NULL on Windows; + * archive_read_disk_entry_from_file() should + * be smart enough to use platform-appropriate + * ways to probe file information. + */ + st = NULL; +#endif r = archive_read_disk_entry_from_file(bsdtar->diskreader, entry, -1, st); if (r != ARCHIVE_OK) - bsdtar_warnc(bsdtar, archive_errno(bsdtar->diskreader), - archive_error_string(bsdtar->diskreader)); + bsdtar_warnc(archive_errno(bsdtar->diskreader), + "%s", archive_error_string(bsdtar->diskreader)); if (r < ARCHIVE_WARN) continue; @@ -786,7 +833,7 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) * If this file/dir is flagged "nodump" and we're * honoring such flags, skip this file/dir. */ -#ifdef HAVE_STRUCT_STAT_ST_FLAGS +#if defined(HAVE_STRUCT_STAT_ST_FLAGS) && defined(UF_NODUMP) /* BSD systems store flags in struct stat */ if (bsdtar->option_honor_nodump && (lst->st_flags & UF_NODUMP)) @@ -835,17 +882,11 @@ write_hierarchy(struct bsdtar *bsdtar, struct archive *a, const char *path) archive_entry_pathname(entry)); /* Non-regular files get archived with zero size. */ - if (!S_ISREG(st->st_mode)) + if (archive_entry_filetype(entry) != AE_IFREG) archive_entry_set_size(entry, 0); - /* Record what we're doing, for SIGINFO / SIGUSR1. */ - siginfo_setinfo(bsdtar, "adding", - archive_entry_pathname(entry), archive_entry_size(entry)); archive_entry_linkify(bsdtar->resolver, &entry, &spare_entry); - /* Handle SIGINFO / SIGUSR1 request if one was made. */ - siginfo_printinfo(bsdtar, 0); - while (entry != NULL) { write_entry_backend(bsdtar, a, entry); archive_entry_free(entry); @@ -875,7 +916,7 @@ write_entry_backend(struct bsdtar *bsdtar, struct archive *a, fd = open(pathname, O_RDONLY); if (fd == -1) { if (!bsdtar->verbose) - bsdtar_warnc(bsdtar, errno, + bsdtar_warnc(errno, "%s: could not open file", pathname); else fprintf(stderr, ": %s", strerror(errno)); @@ -886,7 +927,7 @@ write_entry_backend(struct bsdtar *bsdtar, struct archive *a, e = archive_write_header(a, entry); if (e != ARCHIVE_OK) { if (!bsdtar->verbose) - bsdtar_warnc(bsdtar, 0, "%s: %s", + bsdtar_warnc(0, "%s: %s", archive_entry_pathname(entry), archive_error_string(a)); else @@ -915,6 +956,28 @@ write_entry_backend(struct bsdtar *bsdtar, struct archive *a, close(fd); } +static void +report_write(struct bsdtar *bsdtar, struct archive *a, + struct archive_entry *entry, int64_t progress) +{ + uint64_t comp, uncomp; + if (bsdtar->verbose) + fprintf(stderr, "\n"); + comp = archive_position_compressed(a); + uncomp = archive_position_uncompressed(a); + fprintf(stderr, "In: %d files, %s bytes;", + archive_file_count(a), tar_i64toa(uncomp)); + fprintf(stderr, + " Out: %s bytes, compression %d%%\n", + tar_i64toa(comp), (int)((uncomp - comp) * 100 / uncomp)); + /* Can't have two calls to tar_i64toa() pending, so split the output. */ + safe_fprintf(stderr, "Current: %s (%s", + archive_entry_pathname(entry), + tar_i64toa(progress)); + fprintf(stderr, "/%s bytes)\n", + tar_i64toa(archive_entry_size(entry))); +} + /* Helper function to copy file to archive. */ static int @@ -923,22 +986,23 @@ write_file_data(struct bsdtar *bsdtar, struct archive *a, { ssize_t bytes_read; ssize_t bytes_written; - off_t progress = 0; + int64_t progress = 0; bytes_read = read(fd, bsdtar->buff, FILEDATABUFLEN); while (bytes_read > 0) { - siginfo_printinfo(bsdtar, progress); + if (need_report()) + report_write(bsdtar, a, entry, progress); bytes_written = archive_write_data(a, bsdtar->buff, bytes_read); if (bytes_written < 0) { /* Write failed; this is bad */ - bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a)); + bsdtar_warnc(0, "%s", archive_error_string(a)); return (-1); } if (bytes_written < bytes_read) { /* Write was truncated; warn but continue. */ - bsdtar_warnc(bsdtar, 0, + bsdtar_warnc(0, "%s: Truncated write; file may have grown while being archived.", archive_entry_pathname(entry)); return (0); @@ -952,7 +1016,7 @@ write_file_data(struct bsdtar *bsdtar, struct archive *a, /* * Test if the specified file is new enough to include in the archive. */ -int +static int new_enough(struct bsdtar *bsdtar, const char *path, const struct stat *st) { struct archive_dir_entry *p; @@ -1023,11 +1087,11 @@ add_dir_list(struct bsdtar *bsdtar, const char *path, p = malloc(sizeof(*p)); if (p == NULL) - bsdtar_errc(bsdtar, 1, ENOMEM, "Can't read archive directory"); + bsdtar_errc(1, ENOMEM, "Can't read archive directory"); p->name = strdup(path); if (p->name == NULL) - bsdtar_errc(bsdtar, 1, ENOMEM, "Can't read archive directory"); + bsdtar_errc(1, ENOMEM, "Can't read archive directory"); p->mtime_sec = mtime_sec; p->mtime_nsec = mtime_nsec; p->next = NULL; @@ -1039,25 +1103,32 @@ add_dir_list(struct bsdtar *bsdtar, const char *path, } } -void +static void test_for_append(struct bsdtar *bsdtar) { struct stat s; if (*bsdtar->argv == NULL && bsdtar->names_from_file == NULL) - bsdtar_errc(bsdtar, 1, 0, "no files or directories specified"); + bsdtar_errc(1, 0, "no files or directories specified"); if (bsdtar->filename == NULL) - bsdtar_errc(bsdtar, 1, 0, "Cannot append to stdout."); + bsdtar_errc(1, 0, "Cannot append to stdout."); if (bsdtar->create_compression != 0) - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Cannot append to %s with compression", bsdtar->filename); if (stat(bsdtar->filename, &s) != 0) return; if (!S_ISREG(s.st_mode) && !S_ISBLK(s.st_mode)) - bsdtar_errc(bsdtar, 1, 0, + bsdtar_errc(1, 0, "Cannot append to %s: not a regular file.", bsdtar->filename); + +/* Is this an appropriate check here on Windows? */ +/* + if (GetFileType(handle) != FILE_TYPE_DISK) + bsdtar_errc(1, 0, "Cannot append"); +*/ + } diff --git a/usr.bin/tcopy/Makefile b/usr.bin/tcopy/Makefile index 1bae0b229420..feb57695c1ea 100644 --- a/usr.bin/tcopy/Makefile +++ b/usr.bin/tcopy/Makefile @@ -3,4 +3,6 @@ PROG= tcopy +WARNS?= 1 + .include diff --git a/usr.bin/tcopy/tcopy.c b/usr.bin/tcopy/tcopy.c index 540ac06af738..4d9d516b08e9 100644 --- a/usr.bin/tcopy/tcopy.c +++ b/usr.bin/tcopy/tcopy.c @@ -70,17 +70,15 @@ FILE *msg; void *getspace(int); void intr(int); -static void usage(void); +static void usage(void) __dead2; void verify(int, int, char *); void writeop(int, int); void rewind_tape(int); int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { - register int lastnread, nread, nw, inp, outp; + int lastnread, nread, nw, inp, outp; enum {READ, VERIFY, COPY, COPYVERIFY} op = READ; sig_t oldsig; int ch, needeof; @@ -227,12 +225,10 @@ r1: guesslen = 0; } void -verify(inp, outp, outb) - register int inp, outp; - register char *outb; +verify(int inp, int outp, char *outb) { - register int eot, inmaxblk, inn, outmaxblk, outn; - register char *inb; + int eot, inmaxblk, inn, outmaxblk, outn; + char *inb; inb = getspace(maxblk); inmaxblk = outmaxblk = maxblk; @@ -281,8 +277,7 @@ r2: if (inn != outn) { } void -intr(signo) - int signo __unused; +intr(int signo __unused) { if (record) { if (record - lastrec > 1) @@ -296,8 +291,7 @@ intr(signo) } void * -getspace(blk) - int blk; +getspace(int blk) { void *bp; @@ -307,8 +301,7 @@ getspace(blk) } void -writeop(fd, type) - int fd, type; +writeop(int fd, int type) { struct mtop op; @@ -319,7 +312,7 @@ writeop(fd, type) } static void -usage() +usage(void) { fprintf(stderr, "usage: tcopy [-cvx] [-s maxblk] [src [dest]]\n"); exit(1); diff --git a/usr.bin/telnet/Makefile b/usr.bin/telnet/Makefile index ee112ffa06c8..0ef55c50e296 100644 --- a/usr.bin/telnet/Makefile +++ b/usr.bin/telnet/Makefile @@ -17,6 +17,8 @@ CFLAGS+= -DKLUDGELINEMODE -DUSE_TERMIO -DENV_HACK -DOPIE \ CFLAGS+= -DINET6 .endif +WARNS?= 2 + LIBTELNET= ${.OBJDIR}/../../lib/libtelnet/libtelnet.a DPADD= ${LIBTERMCAP} ${LIBTELNET} diff --git a/usr.bin/tftp/tftp.c b/usr.bin/tftp/tftp.c index 2f032df30c47..430090293862 100644 --- a/usr.bin/tftp/tftp.c +++ b/usr.bin/tftp/tftp.c @@ -140,6 +140,7 @@ send_data: (struct sockaddr *)&peer, peer.ss_len); if (n != size + 4) { warn("sendto"); + txrx_error = 1; goto abort; } read_ahead(file, convert); @@ -153,6 +154,7 @@ send_data: alarm(0); if (n < 0) { warn("recvfrom"); + txrx_error = 1; goto abort; } if (!serv.ss_family) @@ -160,6 +162,7 @@ send_data: else if (!cmpport((struct sockaddr *)&serv, (struct sockaddr *)&from)) { warn("server port mismatch"); + txrx_error = 1; goto abort; } peer = from; @@ -202,7 +205,6 @@ abort: stopclock(); if (amount > 0) printstats("Sent", amount); - txrx_error = 1; } /* @@ -255,6 +257,7 @@ send_ack: peer.ss_len) != size) { alarm(0); warn("sendto"); + txrx_error = 1; goto abort; } write_behind(file, convert); @@ -268,6 +271,7 @@ send_ack: alarm(0); if (n < 0) { warn("recvfrom"); + txrx_error = 1; goto abort; } if (!serv.ss_family) @@ -275,6 +279,7 @@ send_ack: else if (!cmpport((struct sockaddr *)&serv, (struct sockaddr *)&from)) { warn("server port mismatch"); + txrx_error = 1; goto abort; } peer = from; @@ -325,7 +330,6 @@ abort: /* ok to ack, since user */ stopclock(); if (amount > 0) printstats("Received", amount); - txrx_error = 1; } static int diff --git a/usr.bin/time/Makefile b/usr.bin/time/Makefile index 5a580d2c4ead..e462af660325 100644 --- a/usr.bin/time/Makefile +++ b/usr.bin/time/Makefile @@ -2,6 +2,5 @@ # $FreeBSD$ PROG= time -WARNS?=6 .include diff --git a/usr.bin/top/Makefile b/usr.bin/top/Makefile index 182714aa7021..864473f5c614 100644 --- a/usr.bin/top/Makefile +++ b/usr.bin/top/Makefile @@ -10,6 +10,8 @@ SRCS+= sigdesc.h top.local.h CFLAGS+= -DHAVE_GETOPT -DHAVE_STRERROR -DORDER CFLAGS+= -I${.CURDIR} -I${TOPDIR} -I. +WARNS?= 0 + # # The table size should be a prime number approximately twice as # large as the number of lines in /etc/passwd. The default number diff --git a/usr.bin/touch/touch.c b/usr.bin/touch/touch.c index 624ce05065e6..5ceb17572011 100644 --- a/usr.bin/touch/touch.c +++ b/usr.bin/touch/touch.c @@ -164,6 +164,11 @@ main(int argc, char *argv[]) for (rval = 0; *argv; ++argv) { /* See if the file exists. */ if (stat_f(*argv, &sb) != 0) { + if (errno != ENOENT) { + rval = 1; + warn("%s", *argv); + continue; + } if (!cflag) { /* Create the file. */ fd = open(*argv, @@ -206,7 +211,7 @@ main(int argc, char *argv[]) continue; /* If the user specified a time, nothing else we can do. */ - if (timeset) { + if (timeset || Aflag) { rval = 1; warn("%s", *argv); continue; @@ -222,11 +227,13 @@ main(int argc, char *argv[]) continue; /* Try reading/writing. */ - if (!S_ISLNK(sb.st_mode) && !S_ISDIR(sb.st_mode) && - rw(*argv, &sb, fflag)) + if (!S_ISLNK(sb.st_mode) && !S_ISDIR(sb.st_mode)) { + if (rw(*argv, &sb, fflag)) + rval = 1; + } else { rval = 1; - else warn("%s", *argv); + } } exit(rval); } diff --git a/usr.bin/tr/Makefile b/usr.bin/tr/Makefile index 00bdd8d5bb7a..c5c5297ef64b 100644 --- a/usr.bin/tr/Makefile +++ b/usr.bin/tr/Makefile @@ -4,4 +4,6 @@ PROG= tr SRCS= cmap.c cset.c str.c tr.c +WARNS?= 1 + .include diff --git a/usr.bin/truss/Makefile b/usr.bin/truss/Makefile index 104cd968776a..d907ad59c8e3 100644 --- a/usr.bin/truss/Makefile +++ b/usr.bin/truss/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ -WARNS?= 6 NO_WERROR= PROG= truss SRCS= main.c setup.c syscalls.c syscalls.h ioctl.c ${MACHINE_ARCH}-fbsd.c diff --git a/usr.bin/truss/amd64-fbsd32.c b/usr.bin/truss/amd64-fbsd32.c index eab841c96e83..3b1b88220b19 100644 --- a/usr.bin/truss/amd64-fbsd32.c +++ b/usr.bin/truss/amd64-fbsd32.c @@ -315,19 +315,6 @@ amd64_fbsd32_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused) } } - /* - * The pipe syscall returns its fds in two registers and has assembly glue - * to provide the libc API, so it cannot be handled like regular syscalls. - * The nargs check is so we don't have to do yet another strcmp on every - * syscall. - */ - if (!errorp && fsc.nargs == 0 && fsc.name && strcmp(fsc.name, "pipe") == 0) { - fsc.nargs = 1; - fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*)); - asprintf(&fsc.s_args[0], "[%d,%d]", (int)retval, (int)regs.r_rdx); - retval = 0; - } - if (fsc.name != NULL && (!strcmp(fsc.name, "freebsd32_execve") || !strcmp(fsc.name, "exit"))) { trussinfo->curthread->in_syscall = 1; diff --git a/usr.bin/truss/i386-fbsd.c b/usr.bin/truss/i386-fbsd.c index 8500f32bf48e..3a81392b15f7 100644 --- a/usr.bin/truss/i386-fbsd.c +++ b/usr.bin/truss/i386-fbsd.c @@ -305,19 +305,6 @@ i386_syscall_exit(struct trussinfo *trussinfo, int syscall_num __unused) } } - /* - * The pipe syscall returns its fds in two registers and has assembly glue - * to provide the libc API, so it cannot be handled like regular syscalls. - * The nargs check is so we don't have to do yet another strcmp on every - * syscall. - */ - if (!errorp && fsc.nargs == 0 && fsc.name && strcmp(fsc.name, "pipe") == 0) { - fsc.nargs = 1; - fsc.s_args = malloc((1+fsc.nargs) * sizeof(char*)); - asprintf(&fsc.s_args[0], "[%d,%d]", (int)retval, regs.r_edx); - retval = 0; - } - if (fsc.name != NULL && (!strcmp(fsc.name, "execve") || !strcmp(fsc.name, "exit"))) { trussinfo->curthread->in_syscall = 1; diff --git a/usr.bin/truss/main.c b/usr.bin/truss/main.c index d0dd073e632f..586fcd642990 100644 --- a/usr.bin/truss/main.c +++ b/usr.bin/truss/main.c @@ -239,6 +239,12 @@ main(int ac, char **av) if ((trussinfo->outfile = fopen(fname, "w")) == NULL) errx(1, "cannot open %s", fname); } + /* + * Set FD_CLOEXEC, so that the output file is not shared with + * the traced process. + */ + if (fcntl(fileno(trussinfo->outfile), F_SETFD, FD_CLOEXEC) == -1) + warn("fcntl()"); /* * If truss starts the process itself, it will ignore some signals -- diff --git a/usr.bin/truss/mips-fbsd.c b/usr.bin/truss/mips-fbsd.c index 0ef4ac9e9b12..cf5e2e1ca6f0 100644 --- a/usr.bin/truss/mips-fbsd.c +++ b/usr.bin/truss/mips-fbsd.c @@ -155,8 +155,8 @@ mips_syscall_entry(struct trussinfo *trussinfo, int nargs) { if (nargs == 0) return; -#if 0 // XXX fsc.args = malloc((1+nargs) * sizeof(unsigned long)); +#if 0 // XXX iorequest.piod_op = PIOD_READ_D; iorequest.piod_offs = (void *)parm_offset; iorequest.piod_addr = fsc.args; diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c index d9278156649b..f927e1ec1d23 100644 --- a/usr.bin/truss/syscalls.c +++ b/usr.bin/truss/syscalls.c @@ -92,6 +92,18 @@ static const char rcsid[] = struct syscall syscalls[] = { { .name = "fcntl", .ret_type = 1, .nargs = 3, .args = { { Int, 0 } , { Fcntl, 1 }, { Fcntlflag | OUT, 2 } } }, + { .name = "fork", .ret_type = 1, .nargs = 0 }, + { .name = "getegid", .ret_type = 1, .nargs = 0 }, + { .name = "geteuid", .ret_type = 1, .nargs = 0 }, + { .name = "getgid", .ret_type = 1, .nargs = 0 }, + { .name = "getpid", .ret_type = 1, .nargs = 0 }, + { .name = "getpgid", .ret_type = 1, .nargs = 1, + .args = { { Int, 0 } } }, + { .name = "getpgrp", .ret_type = 1, .nargs = 0 }, + { .name = "getppid", .ret_type = 1, .nargs = 0 }, + { .name = "getsid", .ret_type = 1, .nargs = 1, + .args = { { Int, 0 } } }, + { .name = "getuid", .ret_type = 1, .nargs = 0 }, { .name = "readlink", .ret_type = 1, .nargs = 3, .args = { { Name, 0 } , { Readlinkres | OUT, 1 }, { Int, 2 } } }, { .name = "lseek", .ret_type = 2, .nargs = 3, @@ -230,6 +242,8 @@ struct syscall syscalls[] = { .args = { { Name | IN, 0 }, { Hex, 1 } } }, { .name = "pathconf", .ret_type = 1, .nargs = 2, .args = { { Name | IN, 0 }, { Pathconf, 1 } } }, + { .name = "pipe", .ret_type = 1, .nargs = 1, + .args = { { Ptr, 0 } } }, { .name = "truncate", .ret_type = 1, .nargs = 3, .args = { { Name | IN, 0 }, { Int | IN, 1 }, { Quad | IN, 2 } } }, { .name = "ftruncate", .ret_type = 1, .nargs = 3, @@ -244,6 +258,8 @@ struct syscall syscalls[] = { .args = { { Name , 0 } , { Name, 1 } } }, { .name = "symlink", .ret_type = 1, .nargs = 2, .args = { { Name , 0 } , { Name, 1 } } }, + { .name = "posix_openpt", .ret_type = 1, .nargs = 1, + .args = { { Open, 0 } } }, { .name = 0 }, }; @@ -259,7 +275,7 @@ struct xlat { static struct xlat kevent_filters[] = { X(EVFILT_READ) X(EVFILT_WRITE) X(EVFILT_AIO) X(EVFILT_VNODE) X(EVFILT_PROC) X(EVFILT_SIGNAL) X(EVFILT_TIMER) - X(EVFILT_NETDEV) X(EVFILT_FS) X(EVFILT_READ) XEND + X(EVFILT_FS) X(EVFILT_READ) XEND }; static struct xlat kevent_flags[] = { @@ -1125,6 +1141,12 @@ print_syscall_ret(struct trussinfo *trussinfo, const char *name, int nargs, if (errorp) { fprintf(trussinfo->outfile, " ERR#%ld '%s'\n", retval, strerror(retval)); } else { + /* + * Because pipe(2) has a special assembly glue to provide the + * libc API, we have to adjust retval. + */ + if (name != NULL && !strcmp(name, "pipe")) + retval = 0; fprintf(trussinfo->outfile, " = %ld (0x%lx)\n", retval, retval); } } @@ -1141,15 +1163,15 @@ print_summary(struct trussinfo *trussinfo) ncall = nerror = 0; for (sc = syscalls; sc->name != NULL; sc++) if (sc->ncalls) { - fprintf(trussinfo->outfile, "%-20s%5d.%09ld%8d%8d\n", - sc->name, sc->time.tv_sec, sc->time.tv_nsec, - sc->ncalls, sc->nerror); + fprintf(trussinfo->outfile, "%-20s%5jd.%09ld%8d%8d\n", + sc->name, (intmax_t)sc->time.tv_sec, + sc->time.tv_nsec, sc->ncalls, sc->nerror); timespecadd(&total, &sc->time, &total); ncall += sc->ncalls; nerror += sc->nerror; } fprintf(trussinfo->outfile, "%20s%15s%8s%8s\n", "", "-------------", "-------", "-------"); - fprintf(trussinfo->outfile, "%-20s%5d.%09ld%8d%8d\n", - "", total.tv_sec, total.tv_nsec, ncall, nerror); + fprintf(trussinfo->outfile, "%-20s%5jd.%09ld%8d%8d\n", + "", (intmax_t)total.tv_sec, total.tv_nsec, ncall, nerror); } diff --git a/usr.bin/tset/extern.h b/usr.bin/tset/extern.h index f02d0c50bd56..8ec3f20b285a 100644 --- a/usr.bin/tset/extern.h +++ b/usr.bin/tset/extern.h @@ -34,8 +34,6 @@ * $FreeBSD$ */ -#include - extern struct termios mode, oldmode; extern int Columns, isreset, Lines; extern int erasech, intrchar, killch; diff --git a/usr.bin/tset/map.c b/usr.bin/tset/map.c index d3db6b67e707..80a894f70f6f 100644 --- a/usr.bin/tset/map.c +++ b/usr.bin/tset/map.c @@ -75,9 +75,7 @@ MAP *cur, *maplist; * The baud rate tests are: >, <, @, =, ! */ void -add_mapping(port, arg) - const char *port; - char *arg; +add_mapping(const char *port, char *arg) { MAP *mapp; char *copy, *p, *termp; @@ -190,8 +188,7 @@ badmopt: errx(1, "illegal -m option format: %s", copy); * 'type'. */ const char * -mapped(type) - const char *type; +mapped(const char *type) { MAP *mapp; int match; @@ -240,8 +237,7 @@ SPEEDS speeds[] = { }; speed_t -tset_baudrate(rate) - char *rate; +tset_baudrate(char *rate) { SPEEDS *sp; speed_t speed; diff --git a/usr.bin/tset/misc.c b/usr.bin/tset/misc.c index 52358e75a14c..16e0e1e00821 100644 --- a/usr.bin/tset/misc.c +++ b/usr.bin/tset/misc.c @@ -42,15 +42,12 @@ static const char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/9/93"; #include #include #include -#include -#include #include #include "extern.h" void -cat(file) - char *file; +cat(char *file) { register int fd, nr, nw; char buf[1024]; @@ -67,8 +64,7 @@ cat(file) } int -outc(c) - int c; +outc(int c) { return putc(c, stderr); } diff --git a/usr.bin/tset/set.c b/usr.bin/tset/set.c index 85965b38b991..39a0d960208b 100644 --- a/usr.bin/tset/set.c +++ b/usr.bin/tset/set.c @@ -40,6 +40,7 @@ static const char sccsid[] = "@(#)set.c 8.2 (Berkeley) 2/28/94"; #endif #include +#include #include #include @@ -54,7 +55,7 @@ int set_tabs(void); * a child program dies in raw mode. */ void -reset_mode() +reset_mode(void) { tcgetattr(STDERR_FILENO, &mode); @@ -155,7 +156,7 @@ reset_mode() * entry and command line and update their values in 'mode'. */ void -set_control_chars() +set_control_chars(void) { char *bp, *p, bs_char, buf[1024]; @@ -192,8 +193,7 @@ set_control_chars() * uppercase to internal lowercase. */ void -set_conversions(usingupper) - int usingupper; +set_conversions(int usingupper) { if (tgetflag("UC") || usingupper) { #ifdef IUCLC @@ -238,7 +238,7 @@ set_conversions(usingupper) /* Output startup string. */ void -set_init() +set_init(void) { char *bp, buf[1024]; int settle; @@ -282,7 +282,7 @@ set_init() * Return nonzero if we set any tab stops, zero if not. */ int -set_tabs() +set_tabs(void) { int c; char *capsp, *clear_tabs; diff --git a/usr.bin/tset/term.c b/usr.bin/tset/term.c index 54a349e05f2b..16acb23f6eaf 100644 --- a/usr.bin/tset/term.c +++ b/usr.bin/tset/term.c @@ -45,6 +45,7 @@ static const char sccsid[] = "@(#)term.c 8.1 (Berkeley) 6/9/93"; #include #include #include +#include #include #include #include "extern.h" @@ -59,8 +60,7 @@ char *ttys(char *); * its termcap entry. */ const char * -get_termcap_entry(userarg, tcapbufp) - char *userarg, **tcapbufp; +get_termcap_entry(char *userarg, char **tcapbufp) { struct ttyent *t; int rval; @@ -125,8 +125,7 @@ found: if ((p = getenv("TERMCAP")) != NULL && *p != '/') /* Prompt the user for a terminal type. */ const char * -askuser(dflt) - const char *dflt; +askuser(const char *dflt) { static char answer[256]; char *p; diff --git a/usr.bin/tset/tset.c b/usr.bin/tset/tset.c index dc4c333e2f90..ddcc2dac8ff1 100644 --- a/usr.bin/tset/tset.c +++ b/usr.bin/tset/tset.c @@ -53,6 +53,7 @@ static const char sccsid[] = "@(#)tset.c 8.1 (Berkeley) 6/9/93"; #include #include #include +#include #include #include diff --git a/usr.bin/tset/wrterm.c b/usr.bin/tset/wrterm.c index 9d149183e2f2..29b19218a19a 100644 --- a/usr.bin/tset/wrterm.c +++ b/usr.bin/tset/wrterm.c @@ -53,8 +53,7 @@ static const char sccsid[] = "@(#)wrterm.c 8.1 (Berkeley) 6/9/93"; * shell problems and omitting empty fields. */ void -wrtermcap(bp) - char *bp; +wrtermcap(char *bp) { register int ch; register char *p; diff --git a/usr.bin/uname/uname.1 b/usr.bin/uname/uname.1 index 2a28464efa23..f78e437c7ff2 100644 --- a/usr.bin/uname/uname.1 +++ b/usr.bin/uname/uname.1 @@ -32,7 +32,7 @@ .\" @(#)uname.1 8.3 (Berkeley) 4/8/94 .\" $FreeBSD$ .\" -.Dd April 2, 2003 +.Dd January 26, 2010 .Dt UNAME 1 .Os .Sh NAME @@ -40,7 +40,7 @@ .Nd display information about the system .Sh SYNOPSIS .Nm -.Op Fl aimnprsv +.Op Fl aimnoprsv .Sh DESCRIPTION The .Nm @@ -63,6 +63,10 @@ Write the kernel ident to standard output. Write the type of the current hardware platform to standard output. .It Fl n Write the name of the system to standard output. +.It Fl o +This is a synonym for the +.Fl s +option, for compatibility with other systems. .It Fl p Write the type of the machine processor architecture to standard output. .It Fl r diff --git a/usr.bin/uname/uname.c b/usr.bin/uname/uname.c index 81aef452a74e..0e120b9b5c83 100644 --- a/usr.bin/uname/uname.c +++ b/usr.bin/uname/uname.c @@ -88,7 +88,7 @@ main(int argc, char *argv[]) setup_get(); flags = 0; - while ((ch = getopt(argc, argv, "aimnprsv")) != -1) + while ((ch = getopt(argc, argv, "aimnoprsv")) != -1) switch(ch) { case 'a': flags |= (MFLAG | NFLAG | RFLAG | SFLAG | VFLAG); @@ -109,6 +109,7 @@ main(int argc, char *argv[]) flags |= RFLAG; break; case 's': + case 'o': flags |= SFLAG; break; case 'v': @@ -244,6 +245,6 @@ NATIVE_SYSCTLNAME_GET(ident, "kern.ident") { void usage(void) { - fprintf(stderr, "usage: uname [-aimnprsv]\n"); + fprintf(stderr, "usage: uname [-aimnoprsv]\n"); exit(1); } diff --git a/usr.bin/unifdef/Makefile b/usr.bin/unifdef/Makefile index b31709aa6e62..dcd358f23192 100644 --- a/usr.bin/unifdef/Makefile +++ b/usr.bin/unifdef/Makefile @@ -4,6 +4,5 @@ PROG= unifdef SCRIPTS=unifdefall.sh MLINKS= unifdef.1 unifdefall.1 -WARNS?= 5 .include diff --git a/usr.bin/unifdef/unifdef.1 b/usr.bin/unifdef/unifdef.1 index 12a5438553f8..da7cde8783bb 100644 --- a/usr.bin/unifdef/unifdef.1 +++ b/usr.bin/unifdef/unifdef.1 @@ -1,6 +1,6 @@ .\" Copyright (c) 1985, 1991, 1993 .\" The Regents of the University of California. All rights reserved. -.\" Copyright (c) 2002 - 2005 Tony Finch . All rights reserved. +.\" Copyright (c) 2002 - 2010 Tony Finch . All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" Dave Yost. It was rewritten to support ANSI C by Tony Finch. @@ -30,10 +30,10 @@ .\" SUCH DAMAGE. .\" .\" @(#)unifdef.1 8.2 (Berkeley) 4/1/94 -.\" $dotat: things/unifdef.1,v 1.51 2005/03/08 12:39:01 fanf2 Exp $ +.\" $dotat: unifdef/unifdef.1,v 1.63 2010/02/19 16:41:15 fanf2 Exp $ .\" $FreeBSD$ .\" -.Dd September 24, 2002 +.Dd January 19, 2010 .Dt UNIFDEF 1 .Os .Sh NAME @@ -41,14 +41,15 @@ .Nd remove preprocessor conditionals from code .Sh SYNOPSIS .Nm -.Op Fl cdeklnst +.Op Fl BbcdeKknst .Op Fl I Ns Ar path .Op Fl D Ns Ar sym Ns Op = Ns Ar val .Op Fl U Ns Ar sym .Op Fl iD Ns Ar sym Ns Op = Ns Ar val .Op Fl iU Ns Ar sym .Ar ... -.Op Ar file +.Op Fl o Ar outfile +.Op Ar infile .Nm unifdefall .Op Fl I Ns Ar path .Ar ... @@ -70,46 +71,85 @@ utility acts on .Ic #if , #ifdef , #ifndef , #elif , #else , and .Ic #endif -lines, -and it understands only the commonly-used subset +lines. +A directive is only processed +if the symbols specified on the command line are sufficient to allow +.Nm +to get a definite value for its control expression. +If the result is false, +the directive and the following lines under its control are removed. +If the result is true, +only the directive is removed. +An +.Ic #ifdef +or +.Ic #ifndef +directive is passed through unchanged +if its controlling symbol is not specified on the command line. +Any +.Ic #if +or +.Ic #elif +control expression that has an unknown value or that +.Nm +cannot parse is passed through unchanged. +By default, +.Nm +ignores +.Ic #if +and +.Ic #elif +lines with constant expressions; +it can be told to process them by specifying the +.Fl k +flag on the command line. +.Pp +It understands a commonly-used subset of the expression syntax for .Ic #if and .Ic #elif -lines. -It handles +lines: +integer constants, integer values of symbols defined on the command line, the .Fn defined -operator applied to symbols defined or undefined on the command line, +operator, the operators .Ic \&! , < , > , <= , >= , == , != , && , || , and parenthesized expressions. -Anything that it does not understand is passed through unharmed. -It only processes -.Ic #ifdef -and -.Ic #ifndef -directives if the symbol is specified on the command line, -otherwise they are also passed through unchanged. -By default, it ignores -.Ic #if -and -.Ic #elif -lines with constant expressions, -or they may be processed by specifying the -.Fl k -flag on the command line. +A kind of +.Dq "short circuit" +evaluation is used for the +.Ic && +operator: +if either operand is definitely false then the result is false, +even if the value of the other operand is unknown. +Similarly, +if either operand of +.Ic || +is definitely true then the result is true. +.Pp +In most cases, the +.Nm +utility does not distinguish between object-like macros +(without arguments) and function-like arguments (with arguments). +If a macro is not explicitly defined, or is defined with the +.Fl D +flag on the command-line, its arguments are ignored. +If a macro is explicitly undefined on the command line with the +.Fl U +flag, it may not have any arguments since this leads to a syntax error. .Pp The .Nm -utility also understands just enough about C +utility understands just enough about C to know when one of the directives is inactive because it is inside a comment, or affected by a backslash-continued line. It spots unusually-formatted preprocessor directives -and knows when the layout is too odd to handle. +and knows when the layout is too odd for it to handle. .Pp A script called .Nm unifdefall @@ -125,24 +165,38 @@ and their definitions (or lack thereof), then invokes .Nm with appropriate arguments to process the file. -.Pp -Available options: +.Sh OPTIONS .Pp .Bl -tag -width indent -compact -.It Fl D Ns Ar sym Ns Op = Ns Ar val -Specify that a symbol is defined, -and optionally specify what value to give it -for the purpose of handling +.It Fl D Ns Ar sym Ns = Ns Ar val +Specify that a symbol is defined to a given value +which is used when evaluating .Ic #if and .Ic #elif -directives. +control expressions. +.Pp +.It Fl D Ns Ar sym +Specify that a symbol is defined to the value 1. .Pp .It Fl U Ns Ar sym Specify that a symbol is undefined. If the same symbol appears in more than one argument, the last occurrence dominates. .Pp +.It Fl B +Compress blank lines around a deleted section. +Mutually exclusive with the +.Fl b +option. +.Pp +.It Fl b +Replace removed lines with blank lines +instead of deleting them. +Mutually exclusive with the +.Fl B +option. +.Pp .It Fl c If the .Fl c @@ -174,6 +228,16 @@ option changes the behaviour so that, where possible, such lines are left unprocessed instead of reporting an error. .Pp +.It Fl K +Always treat the result of +.Ic && +and +.Ic || +operators as unknown if either operand is unknown, +instead of short-circuiting when unknown operands can't affect the result. +This option is for compatibility with older versions of +.Nm . +.Pp .It Fl k Process .Ic #if @@ -186,10 +250,6 @@ because they typically start and are used as a kind of comment to sketch out future or past development. It would be rude to strip them out, just as it would be for normal comments. .Pp -.It Fl l -Replace removed lines with blank lines -instead of deleting them. -.Pp .It Fl n Add .Li #line @@ -197,6 +257,18 @@ directives to the output following any deleted lines, so that errors produced when compiling the output file correspond to line numbers in the input file. .Pp +.It Fl o Ar outfile +Write output to the file +.Ar outfile +instead of the standard output. +If +.Ar outfile +is the same as the input file, +the output is written to a temporary file +which is renamed into place when +.Nm +completes successfully. +.Pp .It Fl s Instead of processing the input file as usual, this option causes @@ -235,7 +307,7 @@ comments and line continuations inside those .Ic #ifdef Ns s . -One specifies ignored symbols with +You can specify ignored symbols with .Fl iD Ns Ar sym Ns Oo = Ns Ar val Oc and .Fl iU Ns Ar sym @@ -313,7 +385,7 @@ command appeared in support was added in .Fx 4.7 . .Sh AUTHORS -This implementation was originally written by +The original implementation was written by .An Dave Yost Aq Dave@Yost.com . .An Tony Finch Aq dot@dotat.at rewrote it to support diff --git a/usr.bin/unifdef/unifdef.c b/usr.bin/unifdef/unifdef.c index a8427d150a84..cdcc40341d17 100644 --- a/usr.bin/unifdef/unifdef.c +++ b/usr.bin/unifdef/unifdef.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002 - 2008 Tony Finch + * Copyright (c) 2002 - 2010 Tony Finch * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -24,33 +24,13 @@ */ /* - * This code is derived from software contributed to Berkeley by Dave Yost. + * unifdef - remove ifdef'ed lines + * + * This code was derived from software contributed to Berkeley by Dave Yost. * It was rewritten to support ANSI C by Tony Finch. The original version * of unifdef carried the 4-clause BSD copyright licence. None of its code * remains in this version (though some of the names remain) so it now * carries a more liberal licence. - */ - -#include - -#ifndef lint -#if 0 -static const char copyright[] = -"@(#) Copyright (c) 1985, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif -#ifdef __IDSTRING -__IDSTRING(Berkeley, "@(#)unifdef.c 8.1 (Berkeley) 6/6/93"); -__IDSTRING(NetBSD, "$NetBSD: unifdef.c,v 1.8 2000/07/03 02:51:36 matt Exp $"); -__IDSTRING(dotat, "$dotat: things/unifdef.c,v 1.178 2008/03/02 22:23:32 fanf2 Exp $"); -#endif -#endif /* not lint */ -#ifdef __FBSDID -__FBSDID("$FreeBSD$"); -#endif - -/* - * unifdef - remove ifdef'ed lines * * Wishlist: * provide an option which will append the name of the @@ -59,12 +39,16 @@ __FBSDID("$FreeBSD$"); * #else's and #endif's to see that they match their * corresponding #ifdef or #ifndef * - * The first two items above require better buffer handling, which would - * also make it possible to handle all "dodgy" directives correctly. + * These require better buffer handling, which would also make + * it possible to handle all "dodgy" directives correctly. */ +#include +#include + #include #include +#include #include #include #include @@ -72,6 +56,13 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef __IDSTRING +__IDSTRING(dotat, "$dotat: unifdef/unifdef.c,v 1.198 2010/02/19 16:37:05 fanf2 Exp $"); +#endif +#ifdef __FBSDID +__FBSDID("$FreeBSD$"); +#endif + /* types of input lines: */ typedef enum { LT_TRUEI, /* a true #if with ignore flag */ @@ -88,6 +79,7 @@ typedef enum { LT_DODGY_LAST = LT_DODGY + LT_ENDIF, LT_PLAIN, /* ordinary line */ LT_EOF, /* end of file */ + LT_ERROR, /* unevaluable #if */ LT_COUNT } Linetype; @@ -98,7 +90,7 @@ static char const * const linetype_name[] = { "DODGY IF", "DODGY TRUE", "DODGY FALSE", "DODGY ELIF", "DODGY ELTRUE", "DODGY ELFALSE", "DODGY ELSE", "DODGY ENDIF", - "PLAIN", "EOF" + "PLAIN", "EOF", "ERROR" }; /* state of #if processing */ @@ -162,15 +154,22 @@ static char const * const linestate_name[] = { */ #define EDITSLOP 10 +/* + * For temporary filenames + */ +#define TEMPLATE "unifdef.XXXXXX" + /* * Globals. */ +static bool compblank; /* -B: compress blank lines */ +static bool lnblank; /* -b: blank deleted lines */ static bool complement; /* -c: do the complement */ static bool debugging; /* -d: debugging reports */ static bool iocccok; /* -e: fewer IOCCC errors */ +static bool strictlogic; /* -K: keep ambiguous #ifs */ static bool killconsts; /* -k: eval constant #ifs */ -static bool lnblank; /* -l: blank deleted lines */ static bool lnnum; /* -n: add #line directives */ static bool symlist; /* -s: output symbol list */ static bool text; /* -t: this is a text file */ @@ -183,10 +182,18 @@ static int nsyms; /* number of symbols */ static FILE *input; /* input file pointer */ static const char *filename; /* input file name */ static int linenum; /* current line number */ +static FILE *output; /* output file pointer */ +static const char *ofilename; /* output file name */ +static bool overwriting; /* output overwrites input */ +static char tempname[FILENAME_MAX]; /* used when overwriting */ static char tline[MAXLINE+EDITSLOP];/* input buffer plus space */ static char *keyword; /* used for editing #elif's */ +static const char *newline; /* input file format */ +static const char newline_unix[] = "\n"; +static const char newline_crlf[] = "\r\n"; + static Comment_state incomment; /* comment parser state */ static Line_state linestate; /* #if line parser state */ static Ifstate ifstate[MAXDEPTH]; /* #if processor state */ @@ -194,23 +201,27 @@ static bool ignoring[MAXDEPTH]; /* ignore comments state */ static int stifline[MAXDEPTH]; /* start of current #if */ static int depth; /* current #if nesting */ static int delcount; /* count of deleted lines */ -static bool keepthis; /* don't delete constant #if */ +static unsigned blankcount; /* count of blank lines */ +static unsigned blankmax; /* maximum recent blankcount */ +static bool constexpr; /* constant #if expression */ static int exitstat; /* program exit status */ static void addsym(bool, bool, char *); +static void closeout(void); static void debug(const char *, ...); static void done(void); static void error(const char *); static int findsym(const char *); static void flushline(bool); -static Linetype getline(void); +static Linetype parseline(void); static Linetype ifeval(const char **); static void ignoreoff(void); static void ignoreon(void); static void keywordedit(const char *); static void nest(void); static void process(void); +static const char *skipargs(const char *); static const char *skipcomment(const char *); static const char *skipsym(const char *); static void state(Ifstate); @@ -218,7 +229,7 @@ static int strlcmp(const char *, const char *, size_t); static void unnest(void); static void usage(void); -#define endsym(c) (!isalpha((unsigned char)c) && !isdigit((unsigned char)c) && c != '_') +#define endsym(c) (!isalnum((unsigned char)c) && c != '_') /* * The main program. @@ -228,7 +239,7 @@ main(int argc, char *argv[]) { int opt; - while ((opt = getopt(argc, argv, "i:D:U:I:cdeklnst")) != -1) + while ((opt = getopt(argc, argv, "i:D:U:I:o:BbcdeKklnst")) != -1) switch (opt) { case 'i': /* treat stuff controlled by these symbols as text */ /* @@ -253,6 +264,13 @@ main(int argc, char *argv[]) case 'I': /* no-op for compatibility with cpp */ break; + case 'B': /* compress blank lines around removed section */ + compblank = true; + break; + case 'b': /* blank deleted lines instead of omitting them */ + case 'l': /* backwards compatibility */ + lnblank = true; + break; case 'c': /* treat -D as -U and vice versa */ complement = true; break; @@ -262,15 +280,18 @@ main(int argc, char *argv[]) case 'e': /* fewer errors from dodgy lines */ iocccok = true; break; + case 'K': /* keep ambiguous #ifs */ + strictlogic = true; + break; case 'k': /* process constant #ifs */ killconsts = true; break; - case 'l': /* blank deleted lines instead of omitting them */ - lnblank = true; - break; case 'n': /* add #line directive after deleted lines */ lnnum = true; break; + case 'o': /* output to a file */ + ofilename = optarg; + break; case 's': /* only output list of symbols that control #ifs */ symlist = true; break; @@ -282,6 +303,8 @@ main(int argc, char *argv[]) } argc -= optind; argv += optind; + if (compblank && lnblank) + errx(2, "-B and -b are mutually exclusive"); if (argc > 1) { errx(2, "can only do one file"); } else if (argc == 1 && strcmp(*argv, "-") != 0) { @@ -293,6 +316,45 @@ main(int argc, char *argv[]) filename = "[stdin]"; input = stdin; } + if (ofilename == NULL) { + ofilename = "[stdout]"; + output = stdout; + } else { + struct stat ist, ost; + memset(&ist, 0, sizeof(ist)); + memset(&ost, 0, sizeof(ost)); + + if (fstat(fileno(input), &ist) != 0) + err(2, "can't fstat %s", filename); + if (stat(ofilename, &ost) != 0 && errno != ENOENT) + warn("can't stat %s", ofilename); + + overwriting = (ist.st_dev == ost.st_dev + && ist.st_ino == ost.st_ino); + if (overwriting) { + const char *dirsep; + int ofd; + + dirsep = strrchr(ofilename, '/'); + if (dirsep != NULL) + snprintf(tempname, sizeof(tempname), + "%.*s/" TEMPLATE, + (int)(dirsep - ofilename), ofilename); + else + snprintf(tempname, sizeof(tempname), + TEMPLATE); + ofd = mkstemp(tempname); + if (ofd != -1) + output = fdopen(ofd, "w+"); + if (output == NULL) + err(2, "can't create temporary file"); + fchmod(ofd, ist.st_mode & ACCESSPERMS); + } else { + output = fopen(ofilename, "w"); + if (output == NULL) + err(2, "can't open %s", ofilename); + } + } process(); abort(); /* bug */ } @@ -300,7 +362,7 @@ main(int argc, char *argv[]) static void usage(void) { - fprintf(stderr, "usage: unifdef [-cdeklnst] [-Ipath]" + fprintf(stderr, "usage: unifdef [-BbcdeKknst] [-Ipath]" " [-Dsym[=val]] [-Usym] [-iDsym[=val]] [-iUsym] ... [file]\n"); exit(2); } @@ -373,67 +435,60 @@ static void Itrue (void) { Ftrue(); ignoreon(); } static void Ifalse(void) { Ffalse(); ignoreon(); } /* edit this line */ static void Mpass (void) { strncpy(keyword, "if ", 4); Pelif(); } -static void Mtrue (void) { keywordedit("else\n"); state(IS_TRUE_MIDDLE); } -static void Melif (void) { keywordedit("endif\n"); state(IS_FALSE_TRAILER); } -static void Melse (void) { keywordedit("endif\n"); state(IS_FALSE_ELSE); } +static void Mtrue (void) { keywordedit("else"); state(IS_TRUE_MIDDLE); } +static void Melif (void) { keywordedit("endif"); state(IS_FALSE_TRAILER); } +static void Melse (void) { keywordedit("endif"); state(IS_FALSE_ELSE); } static state_fn * const trans_table[IS_COUNT][LT_COUNT] = { /* IS_OUTSIDE */ { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Eendif, Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eendif, - print, done }, + print, done, abort }, /* IS_FALSE_PREFIX */ { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Strue, Sfalse,Selse, Dendif, Idrop, Idrop, Fdrop, Fdrop, Fdrop, Mpass, Eioccc,Eioccc,Eioccc,Eioccc, - drop, Eeof }, + drop, Eeof, abort }, /* IS_TRUE_PREFIX */ { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Dfalse,Dfalse,Dfalse,Delse, Dendif, Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, - print, Eeof }, + print, Eeof, abort }, /* IS_PASS_MIDDLE */ { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Pelif, Mtrue, Delif, Pelse, Pendif, Oiffy, Oiffy, Fpass, Oif, Oif, Pelif, Oelif, Oelif, Pelse, Pendif, - print, Eeof }, + print, Eeof, abort }, /* IS_FALSE_MIDDLE */ { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Pelif, Mtrue, Delif, Pelse, Pendif, Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eioccc,Eioccc,Eioccc,Eioccc,Eioccc, - drop, Eeof }, + drop, Eeof, abort }, /* IS_TRUE_MIDDLE */ { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Melif, Melif, Melif, Melse, Pendif, Oiffy, Oiffy, Fpass, Oif, Oif, Eioccc,Eioccc,Eioccc,Eioccc,Pendif, - print, Eeof }, + print, Eeof, abort }, /* IS_PASS_ELSE */ { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Pendif, Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Pendif, - print, Eeof }, + print, Eeof, abort }, /* IS_FALSE_ELSE */ { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Dendif, Idrop, Idrop, Fdrop, Fdrop, Fdrop, Eelif, Eelif, Eelif, Eelse, Eioccc, - drop, Eeof }, + drop, Eeof, abort }, /* IS_TRUE_ELSE */ { Itrue, Ifalse,Fpass, Ftrue, Ffalse,Eelif, Eelif, Eelif, Eelse, Dendif, Oiffy, Oiffy, Fpass, Oif, Oif, Eelif, Eelif, Eelif, Eelse, Eioccc, - print, Eeof }, + print, Eeof, abort }, /* IS_FALSE_TRAILER */ { Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Dendif, Idrop, Idrop, Fdrop, Fdrop, Fdrop, Dfalse,Dfalse,Dfalse,Delse, Eioccc, - drop, Eeof } + drop, Eeof, abort } /*TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF TRUEI FALSEI IF TRUE FALSE ELIF ELTRUE ELFALSE ELSE ENDIF (DODGY) - PLAIN EOF */ + PLAIN EOF ERROR */ }; /* * State machine utility functions */ static void -done(void) -{ - if (incomment) - error("EOF in comment"); - exit(exitstat); -} -static void ignoreoff(void) { if (depth == 0) @@ -448,15 +503,18 @@ ignoreon(void) static void keywordedit(const char *replacement) { - strlcpy(keyword, replacement, tline + sizeof(tline) - keyword); + snprintf(keyword, tline + sizeof(tline) - keyword, + "%s%s", replacement, newline); print(); } static void nest(void) { - depth += 1; - if (depth >= MAXDEPTH) + if (depth > MAXDEPTH-1) + abort(); /* bug */ + if (depth == MAXDEPTH-1) error("Too many levels of nesting"); + depth += 1; stifline[depth] = linenum; } static void @@ -481,15 +539,23 @@ flushline(bool keep) if (symlist) return; if (keep ^ complement) { - if (lnnum && delcount > 0) - printf("#line %d\n", linenum); - fputs(tline, stdout); - delcount = 0; + bool blankline = tline[strspn(tline, " \t\r\n")] == '\0'; + if (blankline && compblank && blankcount != blankmax) { + delcount += 1; + blankcount += 1; + } else { + if (lnnum && delcount > 0) + printf("#line %d%s", linenum, newline); + fputs(tline, output); + delcount = 0; + blankmax = blankcount = blankline ? blankcount + 1 : 0; + } } else { if (lnblank) - putc('\n', stdout); + fputs(newline, output); exitstat = 1; delcount += 1; + blankcount = 0; } } @@ -501,9 +567,12 @@ process(void) { Linetype lineval; + /* When compressing blank lines, act as if the file + is preceded by a large number of blank lines. */ + blankmax = blankcount = 1000; for (;;) { linenum++; - lineval = getline(); + lineval = parseline(); trans_table[ifstate[depth]][lineval](); debug("process %s -> %s depth %d", linetype_name[lineval], @@ -511,13 +580,47 @@ process(void) } } +/* + * Flush the output and handle errors. + */ +static void +closeout(void) +{ + if (fclose(output) == EOF) { + warn("couldn't write to %s", ofilename); + if (overwriting) { + unlink(tempname); + errx(2, "%s unchanged", filename); + } else { + exit(2); + } + } +} + +/* + * Clean up and exit. + */ +static void +done(void) +{ + if (incomment) + error("EOF in comment"); + closeout(); + if (overwriting && rename(tempname, filename) == -1) { + warn("couldn't rename temporary file"); + unlink(tempname); + errx(2, "%s unchanged", filename); + } + exit(exitstat); +} + /* * Parse a line and determine its type. We keep the preprocessor line * parser state between calls in the global variable linestate, with * help from skipcomment(). */ static Linetype -getline(void) +parseline(void) { const char *cp; int cursym; @@ -527,6 +630,12 @@ getline(void) if (fgets(tline, MAXLINE, input) == NULL) return (LT_EOF); + if (newline == NULL) { + if (strrchr(tline, '\n') == strrchr(tline, '\r') + 1) + newline = newline_crlf; + else + newline = newline_unix; + } retval = LT_PLAIN; wascomment = incomment; cp = skipcomment(tline); @@ -542,7 +651,8 @@ getline(void) cp = skipsym(cp); kwlen = cp - keyword; /* no way can we deal with a continuation inside a keyword */ - if (strncmp(cp, "\\\n", 2) == 0) + if (strncmp(cp, "\\\r\n", 3) == 0 || + strncmp(cp, "\\\n", 2) == 0) Eioccc(); if (strlcmp("ifdef", keyword, kwlen) == 0 || strlcmp("ifndef", keyword, kwlen) == 0) { @@ -593,9 +703,8 @@ getline(void) size_t len = cp - tline; if (fgets(tline + len, MAXLINE - len, input) == NULL) { /* append the missing newline */ - tline[len+0] = '\n'; - tline[len+1] = '\0'; - cp++; + strcpy(tline + len, newline); + cp += strlen(newline); linestate = LS_START; } else { linestate = LS_DIRTY; @@ -613,17 +722,40 @@ getline(void) /* * These are the binary operators that are supported by the expression - * evaluator. Note that if support for division is added then we also - * need short-circuiting booleans because of divide-by-zero. + * evaluator. */ -static int op_lt(int a, int b) { return (a < b); } -static int op_gt(int a, int b) { return (a > b); } -static int op_le(int a, int b) { return (a <= b); } -static int op_ge(int a, int b) { return (a >= b); } -static int op_eq(int a, int b) { return (a == b); } -static int op_ne(int a, int b) { return (a != b); } -static int op_or(int a, int b) { return (a || b); } -static int op_and(int a, int b) { return (a && b); } +static Linetype op_strict(int *p, int v, Linetype at, Linetype bt) { + if(at == LT_IF || bt == LT_IF) return (LT_IF); + return (*p = v, v ? LT_TRUE : LT_FALSE); +} +static Linetype op_lt(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a < b, at, bt); +} +static Linetype op_gt(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a > b, at, bt); +} +static Linetype op_le(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a <= b, at, bt); +} +static Linetype op_ge(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a >= b, at, bt); +} +static Linetype op_eq(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a == b, at, bt); +} +static Linetype op_ne(int *p, Linetype at, int a, Linetype bt, int b) { + return op_strict(p, a != b, at, bt); +} +static Linetype op_or(int *p, Linetype at, int a, Linetype bt, int b) { + if (!strictlogic && (at == LT_TRUE || bt == LT_TRUE)) + return (*p = 1, LT_TRUE); + return op_strict(p, a || b, at, bt); +} +static Linetype op_and(int *p, Linetype at, int a, Linetype bt, int b) { + if (!strictlogic && (at == LT_FALSE || bt == LT_FALSE)) + return (*p = 0, LT_FALSE); + return op_strict(p, a && b, at, bt); +} /* * An evaluation function takes three arguments, as follows: (1) a pointer to @@ -632,8 +764,8 @@ static int op_and(int a, int b) { return (a && b); } * value of the expression; and (3) a pointer to a char* that points to the * expression to be evaluated and that is updated to the end of the expression * when evaluation is complete. The function returns LT_FALSE if the value of - * the expression is zero, LT_TRUE if it is non-zero, or LT_IF if the - * expression could not be evaluated. + * the expression is zero, LT_TRUE if it is non-zero, LT_IF if the expression + * depends on an unknown symbol, or LT_ERROR if there is a parse failure. */ struct ops; @@ -652,7 +784,7 @@ static const struct ops { eval_fn *inner; struct op { const char *str; - int (*fn)(int, int); + Linetype (*fn)(int *, Linetype, int, Linetype, int); } op[5]; } eval_ops[] = { { eval_table, { { "||", op_or } } }, @@ -667,8 +799,8 @@ static const struct ops { /* * Function for evaluating the innermost parts of expressions, - * viz. !expr (expr) defined(symbol) symbol number - * We reset the keepthis flag when we find a non-constant subexpression. + * viz. !expr (expr) number defined(symbol) symbol + * We reset the constexpr flag in the last two cases. */ static Linetype eval_unary(const struct ops *ops, int *valp, const char **cpp) @@ -677,25 +809,34 @@ eval_unary(const struct ops *ops, int *valp, const char **cpp) char *ep; int sym; bool defparen; + Linetype lt; cp = skipcomment(*cpp); if (*cp == '!') { debug("eval%d !", ops - eval_ops); cp++; - if (eval_unary(ops, valp, &cp) == LT_IF) - return (LT_IF); - *valp = !*valp; + lt = eval_unary(ops, valp, &cp); + if (lt == LT_ERROR) + return (LT_ERROR); + if (lt != LT_IF) { + *valp = !*valp; + lt = *valp ? LT_TRUE : LT_FALSE; + } } else if (*cp == '(') { cp++; debug("eval%d (", ops - eval_ops); - if (eval_table(eval_ops, valp, &cp) == LT_IF) - return (LT_IF); + lt = eval_table(eval_ops, valp, &cp); + if (lt == LT_ERROR) + return (LT_ERROR); cp = skipcomment(cp); if (*cp++ != ')') - return (LT_IF); + return (LT_ERROR); } else if (isdigit((unsigned char)*cp)) { debug("eval%d number", ops - eval_ops); *valp = strtol(cp, &ep, 0); + if (ep == cp) + return (LT_ERROR); + lt = *valp ? LT_TRUE : LT_FALSE; cp = skipsym(cp); } else if (strncmp(cp, "defined", 7) == 0 && endsym(cp[7])) { cp = skipcomment(cp+7); @@ -707,36 +848,43 @@ eval_unary(const struct ops *ops, int *valp, const char **cpp) defparen = false; } sym = findsym(cp); - if (sym < 0) - return (LT_IF); - *valp = (value[sym] != NULL); + if (sym < 0) { + lt = LT_IF; + } else { + *valp = (value[sym] != NULL); + lt = *valp ? LT_TRUE : LT_FALSE; + } cp = skipsym(cp); cp = skipcomment(cp); if (defparen && *cp++ != ')') - return (LT_IF); - keepthis = false; + return (LT_ERROR); + constexpr = false; } else if (!endsym(*cp)) { debug("eval%d symbol", ops - eval_ops); sym = findsym(cp); - if (sym < 0) - return (LT_IF); - if (value[sym] == NULL) + cp = skipsym(cp); + if (sym < 0) { + lt = LT_IF; + cp = skipargs(cp); + } else if (value[sym] == NULL) { *valp = 0; - else { + lt = LT_FALSE; + } else { *valp = strtol(value[sym], &ep, 0); if (*ep != '\0' || ep == value[sym]) - return (LT_IF); + return (LT_ERROR); + lt = *valp ? LT_TRUE : LT_FALSE; + cp = skipargs(cp); } - cp = skipsym(cp); - keepthis = false; + constexpr = false; } else { debug("eval%d bad expr", ops - eval_ops); - return (LT_IF); + return (LT_ERROR); } *cpp = cp; debug("eval%d = %d", ops - eval_ops, *valp); - return (*valp ? LT_TRUE : LT_FALSE); + return (lt); } /* @@ -748,11 +896,13 @@ eval_table(const struct ops *ops, int *valp, const char **cpp) const struct op *op; const char *cp; int val; + Linetype lt, rt; debug("eval%d", ops - eval_ops); cp = *cpp; - if (ops->inner(ops+1, valp, &cp) == LT_IF) - return (LT_IF); + lt = ops->inner(ops+1, valp, &cp); + if (lt == LT_ERROR) + return (LT_ERROR); for (;;) { cp = skipcomment(cp); for (op = ops->op; op->str != NULL; op++) @@ -762,14 +912,16 @@ eval_table(const struct ops *ops, int *valp, const char **cpp) break; cp += strlen(op->str); debug("eval%d %s", ops - eval_ops, op->str); - if (ops->inner(ops+1, &val, &cp) == LT_IF) - return (LT_IF); - *valp = op->fn(*valp, val); + rt = ops->inner(ops+1, &val, &cp); + if (rt == LT_ERROR) + return (LT_ERROR); + lt = op->fn(valp, lt, *valp, rt, val); } *cpp = cp; debug("eval%d = %d", ops - eval_ops, *valp); - return (*valp ? LT_TRUE : LT_FALSE); + debug("eval%d lt = %s", ops - eval_ops, linetype_name[lt]); + return (lt); } /* @@ -784,10 +936,10 @@ ifeval(const char **cpp) int val = 0; debug("eval %s", *cpp); - keepthis = killconsts ? false : true; + constexpr = killconsts ? false : true; ret = eval_table(eval_ops, &val, cpp); debug("eval = %d", val); - return (keepthis ? LT_IF : ret); + return (constexpr ? LT_IF : ret == LT_ERROR ? LT_IF : ret); } /* @@ -808,11 +960,16 @@ skipcomment(const char *cp) } while (*cp != '\0') /* don't reset to LS_START after a line continuation */ - if (strncmp(cp, "\\\n", 2) == 0) + if (strncmp(cp, "\\\r\n", 3) == 0) + cp += 3; + else if (strncmp(cp, "\\\n", 2) == 0) cp += 2; else switch (incomment) { case NO_COMMENT: - if (strncmp(cp, "/\\\n", 3) == 0) { + if (strncmp(cp, "/\\\r\n", 4) == 0) { + incomment = STARTING_COMMENT; + cp += 4; + } else if (strncmp(cp, "/\\\n", 3) == 0) { incomment = STARTING_COMMENT; cp += 3; } else if (strncmp(cp, "/*", 2) == 0) { @@ -832,7 +989,7 @@ skipcomment(const char *cp) } else if (strncmp(cp, "\n", 1) == 0) { linestate = LS_START; cp += 1; - } else if (strchr(" \t", *cp) != NULL) { + } else if (strchr(" \r\t", *cp) != NULL) { cp += 1; } else return (cp); @@ -864,7 +1021,10 @@ skipcomment(const char *cp) cp += 1; continue; case C_COMMENT: - if (strncmp(cp, "*\\\n", 3) == 0) { + if (strncmp(cp, "*\\\r\n", 4) == 0) { + incomment = FINISHING_COMMENT; + cp += 4; + } else if (strncmp(cp, "*\\\n", 3) == 0) { incomment = FINISHING_COMMENT; cp += 3; } else if (strncmp(cp, "*/", 2) == 0) { @@ -898,6 +1058,31 @@ skipcomment(const char *cp) return (cp); } +/* + * Skip macro arguments. + */ +static const char * +skipargs(const char *cp) +{ + const char *ocp = cp; + int level = 0; + cp = skipcomment(cp); + if (*cp != '(') + return (cp); + do { + if (*cp == '(') + level++; + if (*cp == ')') + level--; + cp = skipcomment(cp+1); + } while (level != 0 && *cp != '\0'); + if (level == 0) + return (cp); + else + /* Rewind and re-detect the syntax error later. */ + return (ocp); +} + /* * Skip over an identifier. */ @@ -960,7 +1145,7 @@ addsym(bool ignorethis, bool definethis, char *sym) value[symind] = val+1; *val = '\0'; } else if (*val == '\0') - value[symind] = ""; + value[symind] = "1"; else usage(); } else { @@ -1008,5 +1193,6 @@ error(const char *msg) else warnx("%s: %d: %s (#if line %d depth %d)", filename, linenum, msg, stifline[depth], depth); + closeout(); errx(2, "output may be truncated"); } diff --git a/usr.bin/unifdef/unifdefall.sh b/usr.bin/unifdef/unifdefall.sh index bcba08c9712b..179fc9390dda 100644 --- a/usr.bin/unifdef/unifdefall.sh +++ b/usr.bin/unifdef/unifdefall.sh @@ -1,29 +1,70 @@ #!/bin/sh # -# remove all the #if's from a source file +# unifdefall: remove all the #if's from a source file # -# $dotat: things/unifdefall.sh,v 1.9 2002/09/24 19:43:57 fanf2 Exp $ +# Copyright (c) 2002 - 2010 Tony Finch +# Copyright (c) 2009 - 2010 Jonathan Nieder +# +# 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 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 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. +# +# $dotat: unifdef/unifdefall.sh,v 1.27 2010/01/19 16:09:50 fanf2 Exp $ # $FreeBSD$ set -e -basename=`basename $0` -tmp=`mktemp -d -t $basename` || exit 2 +unifdef="$(dirname "$0")/unifdef" +if [ ! -e "$unifdef" ] +then + unifdef=unifdef +fi +# export to the final shell command +export unifdef -unifdef -s "$@" | sort | uniq > $tmp/ctrl -cpp -dM "$@" | sort | - sed -Ee 's/^#define[ ]+(.*[^ ])[ ]*$/\1/' > $tmp/hashdefs -sed -Ee 's/^([A-Za-z0-9_]+).*$/\1/' $tmp/hashdefs > $tmp/alldef -comm -23 $tmp/ctrl $tmp/alldef > $tmp/undef -comm -12 $tmp/ctrl $tmp/alldef > $tmp/def +basename=$(basename "$0") +tmp=$(mktemp -d "${TMPDIR:-/tmp}/$basename.XXXXXXXXXX") || exit 2 +trap 'rm -r "$tmp" || exit 1' EXIT -echo unifdef -k \\ > $tmp/cmd -sed -Ee 's/^(.*)$/-U\1 \\/' $tmp/undef >> $tmp/cmd -while read sym -do sed -Ee '/^('"$sym"')([(][^)]*[)])?([ ]+(.*))?$/!d;s//-D\1=\4/' $tmp/hashdefs -done < $tmp/def | - sed -Ee 's/\\/\\\\/g;s/"/\\"/g;s/^/"/;s/$/" \\/' >> $tmp/cmd -echo '"$@"' >> $tmp/cmd -sh $tmp/cmd "$@" +export LC_ALL=C -rm -r $tmp +# list of all controlling macros +"$unifdef" -s "$@" | sort | uniq >"$tmp/ctrl" +# list of all macro definitions +cpp -dM "$@" | sort | sed 's/^#define //' >"$tmp/hashdefs" +# list of defined macro names +sed 's/[^A-Za-z0-9_].*$//' <"$tmp/hashdefs" >"$tmp/alldef" +# list of undefined and defined controlling macros +comm -23 "$tmp/ctrl" "$tmp/alldef" >"$tmp/undef" +comm -12 "$tmp/ctrl" "$tmp/alldef" >"$tmp/def" +# create a sed script that extracts the controlling macro definitions +# and converts them to unifdef command-line arguments +sed 's|.*|s/^&\\(([^)]*)\\)\\{0,1\\} /-D&=/p|' <"$tmp/def" >"$tmp/script" +# create the final unifdef command +{ echo '"$unifdef" -k \' + # convert the controlling undefined macros to -U arguments + sed 's/.*/-U& \\/' <"$tmp/undef" + # convert the controlling defined macros to quoted -D arguments + sed -nf "$tmp/script" <"$tmp/hashdefs" | + sed "s/'/'\\\\''/g;s/.*/'&' \\\\/" + echo '"$@"' +} >"$tmp/cmd" +# run the command we just created +sh "$tmp/cmd" "$@" diff --git a/usr.bin/uniq/uniq.1 b/usr.bin/uniq/uniq.1 index a12ad3a6ef1f..ec94d05877d7 100644 --- a/usr.bin/uniq/uniq.1 +++ b/usr.bin/uniq/uniq.1 @@ -35,7 +35,7 @@ .\" From: @(#)uniq.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd July 3, 2004 +.Dd December 17, 2009 .Dt UNIQ 1 .Os .Sh NAME @@ -153,7 +153,3 @@ A .Nm command appeared in .At v3 . -.Sh BUGS -Input lines are limited to -.Dv LINE_MAX -(2048) bytes in length. diff --git a/usr.bin/uniq/uniq.c b/usr.bin/uniq/uniq.c index bc04db777f62..2b11fe4745a2 100644 --- a/usr.bin/uniq/uniq.c +++ b/usr.bin/uniq/uniq.c @@ -52,6 +52,7 @@ static const char rcsid[] = #include #include #include +#include #include #include #include @@ -59,7 +60,8 @@ static const char rcsid[] = #include #include -#define MAXLINELEN (LINE_MAX + 1) +#define INITLINELEN (LINE_MAX + 1) +#define MAXLINELEN ((SIZE_MAX / sizeof(wchar_t)) / 2) int cflag, dflag, uflag; int numchars, numfields, repeats; @@ -137,8 +139,8 @@ main (int argc, char *argv[]) if (argc > 1) ofp = file(argv[1], "w"); - prevbuflen = MAXLINELEN; - thisbuflen = MAXLINELEN; + prevbuflen = INITLINELEN; + thisbuflen = INITLINELEN; prevline = malloc(prevbuflen * sizeof(*prevline)); thisline = malloc(thisbuflen * sizeof(*thisline)); if (prevline == NULL || thisline == NULL) @@ -198,16 +200,19 @@ getline(wchar_t *buf, size_t *buflen, FILE *fp) bufpos = 0; while ((ch = getwc(fp)) != WEOF && ch != '\n') { - if (bufpos + 2 >= *buflen) { + if (bufpos + 1 >= *buflen) { *buflen = *buflen * 2; + if (*buflen > MAXLINELEN) + errx(1, + "Maximum line buffer length (%zu) exceeded", + MAXLINELEN); buf = reallocf(buf, *buflen * sizeof(*buf)); if (buf == NULL) - return (NULL); + err(1, "reallocf"); } buf[bufpos++] = ch; } - if (bufpos + 1 != *buflen) - buf[bufpos] = '\0'; + buf[bufpos] = '\0'; return (bufpos != 0 || ch == '\n' ? buf : NULL); } @@ -305,13 +310,13 @@ wcsicoll(wchar_t *s1, wchar_t *s2) new_l2_buflen = wcsicoll_l2_buflen; while (new_l1_buflen < l1) { if (new_l1_buflen == 0) - new_l1_buflen = MAXLINELEN; + new_l1_buflen = INITLINELEN; else new_l1_buflen *= 2; } while (new_l2_buflen < l2) { if (new_l2_buflen == 0) - new_l2_buflen = MAXLINELEN; + new_l2_buflen = INITLINELEN; else new_l2_buflen *= 2; } diff --git a/usr.bin/unzip/Makefile b/usr.bin/unzip/Makefile index cc31dea8f835..ef8a69072686 100644 --- a/usr.bin/unzip/Makefile +++ b/usr.bin/unzip/Makefile @@ -1,9 +1,8 @@ # $FreeBSD$ PROG = unzip -WARNS ?= 6 CSTD = c99 -DPADD = ${LIBARCHIVE} -LDADD = -larchive +DPADD = ${LIBARCHIVE} ${LIBZ} +LDADD = -larchive -lz .include diff --git a/usr.bin/unzip/unzip.1 b/usr.bin/unzip/unzip.1 index b6ee87aa1b50..3d4de4628de1 100644 --- a/usr.bin/unzip/unzip.1 +++ b/usr.bin/unzip/unzip.1 @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd September 7, 2009 +.Dd February 16, 2010 .Dt UNZIP 1 .Os .Sh NAME @@ -158,17 +158,6 @@ utility is only able to process ZIP archives handled by Depending on the installed version of .Xr libarchive , this may or may not include self-extracting archives. -.Sh BUGS -The -.Nm -utility currently does not support asking the user whether to -overwrite or skip a file that already exists on disk. -To be on the safe side, it will fail if it encounters a file that -already exists and neither the -.Fl n -nor the -.Fl o -command line option was specified. .Sh SEE ALSO .Xr libarchive 3 .Sh HISTORY diff --git a/usr.bin/unzip/unzip.c b/usr.bin/unzip/unzip.c index f0856a430e32..b80810cb1cce 100644 --- a/usr.bin/unzip/unzip.c +++ b/usr.bin/unzip/unzip.c @@ -383,7 +383,7 @@ extract_dir(struct archive *a, struct archive_entry *e, const char *path) { int mode; - mode = archive_entry_filetype(e) & 0777; + mode = archive_entry_mode(e) & 0777; if (mode == 0) mode = 0755; @@ -411,52 +411,104 @@ extract_dir(struct archive *a, struct archive_entry *e, const char *path) static unsigned char buffer[8192]; static char spinner[] = { '|', '/', '-', '\\' }; +static int +handle_existing_file(char **path) +{ + size_t alen; + ssize_t len; + char buf[4]; + + for (;;) { + fprintf(stderr, + "replace %s? [y]es, [n]o, [A]ll, [N]one, [r]ename: ", + *path); + if (fgets(buf, sizeof(buf), stdin) == 0) { + clearerr(stdin); + printf("NULL\n(EOF or read error, " + "treating as \"[N]one\"...)\n"); + n_opt = 1; + return -1; + } + switch (*buf) { + case 'A': + o_opt = 1; + /* FALLTHROUGH */ + case 'y': + case 'Y': + (void)unlink(*path); + return 1; + case 'N': + n_opt = 1; + /* FALLTHROUGH */ + case 'n': + return -1; + case 'r': + case 'R': + printf("New name: "); + fflush(stdout); + free(*path); + *path = NULL; + alen = 0; + len = getdelim(path, &alen, '\n', stdin); + if ((*path)[len - 1] == '\n') + (*path)[len - 1] = '\0'; + return 0; + default: + break; + } + } +} + /* * Extract a regular file. */ static void -extract_file(struct archive *a, struct archive_entry *e, const char *path) +extract_file(struct archive *a, struct archive_entry *e, char **path) { int mode; time_t mtime; struct stat sb; struct timeval tv[2]; - int cr, fd, text, warn; + int cr, fd, text, warn, check; ssize_t len; unsigned char *p, *q, *end; - mode = archive_entry_filetype(e) & 0777; + mode = archive_entry_mode(e) & 0777; if (mode == 0) mode = 0644; mtime = archive_entry_mtime(e); /* look for existing file of same name */ - if (lstat(path, &sb) == 0) { +recheck: + if (lstat(*path, &sb) == 0) { if (u_opt || f_opt) { /* check if up-to-date */ if (S_ISREG(sb.st_mode) && sb.st_mtime >= mtime) return; - (void)unlink(path); + (void)unlink(*path); } else if (o_opt) { /* overwrite */ - (void)unlink(path); + (void)unlink(*path); } else if (n_opt) { /* do not overwrite */ return; } else { - /* XXX ask user */ - errorx("not implemented"); + check = handle_existing_file(path); + if (check == 0) + goto recheck; + if (check == -1) + return; /* do not overwrite */ } } else { if (f_opt) return; } - if ((fd = open(path, O_RDWR|O_CREAT|O_TRUNC, mode)) < 0) - error("open('%s')", path); + if ((fd = open(*path, O_RDWR|O_CREAT|O_TRUNC, mode)) < 0) + error("open('%s')", *path); /* loop over file contents and write to disk */ - info(" extracting: %s", path); + info(" extracting: %s", *path); text = a_opt; warn = 0; cr = 0; @@ -473,7 +525,7 @@ extract_file(struct archive *a, struct archive_entry *e, const char *path) if (a_opt && cr) { if (len == 0 || buffer[0] != '\n') if (write(fd, "\r", 1) != 1) - error("write('%s')", path); + error("write('%s')", *path); cr = 0; } @@ -504,7 +556,7 @@ extract_file(struct archive *a, struct archive_entry *e, const char *path) /* simple case */ if (!a_opt || !text) { if (write(fd, buffer, len) != len) - error("write('%s')", path); + error("write('%s')", *path); continue; } @@ -514,7 +566,7 @@ extract_file(struct archive *a, struct archive_entry *e, const char *path) if (!warn && !isascii(*q)) { warningx("%s may be corrupted due" " to weak text file detection" - " heuristic", path); + " heuristic", *path); warn = 1; } if (q[0] != '\r') @@ -527,7 +579,7 @@ extract_file(struct archive *a, struct archive_entry *e, const char *path) break; } if (write(fd, p, q - p) != q - p) - error("write('%s')", path); + error("write('%s')", *path); } } if (tty) @@ -542,9 +594,9 @@ extract_file(struct archive *a, struct archive_entry *e, const char *path) tv[1].tv_sec = mtime; tv[1].tv_usec = 0; if (futimes(fd, tv) != 0) - error("utimes('%s')", path); + error("utimes('%s')", *path); if (close(fd) != 0) - error("close('%s')", path); + error("close('%s')", *path); } /* @@ -620,7 +672,7 @@ extract(struct archive *a, struct archive_entry *e) if (S_ISDIR(filetype)) extract_dir(a, e, realpathname); else - extract_file(a, e, realpathname); + extract_file(a, e, &realpathname); free(realpathname); free(pathname); @@ -814,7 +866,8 @@ unzip(const char *fn) ac(archive_read_support_format_zip(a)); ac(archive_read_open_fd(a, fd, 8192)); - printf("Archive: %s\n", fn); + if (!p_opt && !q_opt) + printf("Archive: %s\n", fn); if (v_opt == 1) { printf(" Length Date Time Name\n"); printf(" -------- ---- ---- ----\n"); diff --git a/usr.bin/usbhidaction/usbhidaction.1 b/usr.bin/usbhidaction/usbhidaction.1 index 95420c8f7914..148c6d886d19 100644 --- a/usr.bin/usbhidaction/usbhidaction.1 +++ b/usr.bin/usbhidaction/usbhidaction.1 @@ -15,13 +15,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/usbhidaction/usbhidaction.c b/usr.bin/usbhidaction/usbhidaction.c index a5e25985260f..fc78d4e31cb6 100644 --- a/usr.bin/usbhidaction/usbhidaction.c +++ b/usr.bin/usbhidaction/usbhidaction.c @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/usbhidctl/usbhid.c b/usr.bin/usbhidctl/usbhid.c index 485418f74064..2ac947d2a5f6 100644 --- a/usr.bin/usbhidctl/usbhid.c +++ b/usr.bin/usbhidctl/usbhid.c @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/usbhidctl/usbhidctl.1 b/usr.bin/usbhidctl/usbhidctl.1 index 8ba5ec163c05..37c7c7a2fdaf 100644 --- a/usr.bin/usbhidctl/usbhidctl.1 +++ b/usr.bin/usbhidctl/usbhidctl.1 @@ -15,13 +15,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/users/users.1 b/usr.bin/users/users.1 index c3454c6784d0..2179c5e0b644 100644 --- a/usr.bin/users/users.1 +++ b/usr.bin/users/users.1 @@ -46,14 +46,14 @@ The utility lists the login names of the users currently on the system, in sorted order, space separated, on a single line. .Sh FILES -.Bl -tag -width /var/run/utmp -.It Pa /var/run/utmp +.Bl -tag -width /var/run/utx.active +.It Pa /var/run/utx.active .El .Sh SEE ALSO .Xr finger 1 , .Xr last 1 , .Xr who 1 , -.Xr utmp 5 +.Xr getutxent 3 .Sh HISTORY The .Nm diff --git a/usr.bin/users/users.c b/usr.bin/users/users.c index c90bfbdc149d..ccf80069a5b5 100644 --- a/usr.bin/users/users.c +++ b/usr.bin/users/users.c @@ -45,15 +45,16 @@ static const char rcsid[] = "$FreeBSD$"; #endif /* not lint */ +#include #include #include #include #include #include #include -#include +#include -typedef char namebuf[UT_NAMESIZE]; +typedef char namebuf[MAXLOGNAME]; int scmp(const void *, const void *); static void usage(void); @@ -65,7 +66,7 @@ main(int argc, char **argv) int ncnt = 0; int nmax = 0; int cnt; - struct utmp utmp; + struct utmpx *ut; int ch; while ((ch = getopt(argc, argv, "")) != -1) @@ -77,28 +78,28 @@ main(int argc, char **argv) argc -= optind; argv += optind; - if (!freopen(_PATH_UTMP, "r", stdin)) - errx(1, "can't open %s", _PATH_UTMP); - while (fread((char *)&utmp, sizeof(utmp), 1, stdin) == 1) { - if (*utmp.ut_name) { - if (ncnt >= nmax) { - nmax += 32; - names = realloc(names, sizeof (*names) * nmax); - if (!names) { - errx(1, "realloc"); - /* NOTREACHED */ - } + setutxent(); + while ((ut = getutxent()) != NULL) { + if (ut->ut_type != USER_PROCESS) + continue; + if (ncnt >= nmax) { + nmax += 32; + names = realloc(names, sizeof(*names) * nmax); + if (!names) { + errx(1, "realloc"); + /* NOTREACHED */ } - (void)strncpy(names[ncnt], utmp.ut_name, UT_NAMESIZE); - ++ncnt; } + (void)strlcpy(names[ncnt], ut->ut_user, sizeof(*names)); + ++ncnt; } - if (ncnt) { - qsort(names, ncnt, UT_NAMESIZE, scmp); - (void)printf("%.*s", UT_NAMESIZE, names[0]); + endutxent(); + if (ncnt > 0) { + qsort(names, ncnt, sizeof(namebuf), scmp); + (void)printf("%s", names[0]); for (cnt = 1; cnt < ncnt; ++cnt) - if (strncmp(names[cnt], names[cnt - 1], UT_NAMESIZE)) - (void)printf(" %.*s", UT_NAMESIZE, names[cnt]); + if (strcmp(names[cnt], names[cnt - 1]) != 0) + (void)printf(" %s", names[cnt]); (void)printf("\n"); } exit(0); @@ -114,5 +115,6 @@ usage(void) int scmp(const void *p, const void *q) { - return(strncmp(p, q, UT_NAMESIZE)); + + return (strcmp(p, q)); } diff --git a/usr.bin/uudecode/Makefile b/usr.bin/uudecode/Makefile index 37005f3ded52..909ce3d746f2 100644 --- a/usr.bin/uudecode/Makefile +++ b/usr.bin/uudecode/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= uudecode -WARNS?= 4 LINKS= ${BINDIR}/uudecode ${BINDIR}/b64decode NO_MAN= diff --git a/usr.bin/uuencode/Makefile b/usr.bin/uuencode/Makefile index c795753a10bc..9a8b9918dffe 100644 --- a/usr.bin/uuencode/Makefile +++ b/usr.bin/uuencode/Makefile @@ -2,7 +2,6 @@ # $FreeBSD$ PROG= uuencode -WARNS?= 4 MAN= uuencode.1 uuencode.format.5 LINKS= ${BINDIR}/uuencode ${BINDIR}/b64encode MLINKS= uuencode.1 uudecode.1 \ diff --git a/usr.bin/vacation/Makefile b/usr.bin/vacation/Makefile index 63ba3abec817..056f5764fa01 100644 --- a/usr.bin/vacation/Makefile +++ b/usr.bin/vacation/Makefile @@ -9,6 +9,8 @@ CFLAGS+=-I${SENDMAIL_DIR}/src -I${SENDMAIL_DIR}/include -I. CFLAGS+=-DNEWDB -DNOT_SENDMAIL CFLAGS+=-D_FFR_LISTDB -D_FFR_DEBUG +WARNS?= 2 + LIBSMDIR= ${.OBJDIR}/../../lib/libsm LIBSM= ${LIBSMDIR}/libsm.a diff --git a/usr.bin/vgrind/Makefile b/usr.bin/vgrind/Makefile index 1a64c1c9f01f..612e504ecb2b 100644 --- a/usr.bin/vgrind/Makefile +++ b/usr.bin/vgrind/Makefile @@ -11,6 +11,8 @@ FILESDIR= ${SHAREDIR}/misc FILESDIR_tmac.vgrind= ${SHAREDIR}/tmac MAN= vgrind.1 vgrindefs.5 +WARNS?= 2 + BINDIR= /usr/libexec SCRIPTSDIR=/usr/bin diff --git a/usr.bin/vi/Makefile b/usr.bin/vi/Makefile index 7276b7b35bb8..048c35b6f017 100644 --- a/usr.bin/vi/Makefile +++ b/usr.bin/vi/Makefile @@ -9,6 +9,8 @@ CFLAGS+= -DGTAGS #if using ncurses: CFLAGS+= -DSYSV_CURSES +WARNS?= 0 + VI= nvi EX= nex VIEW= nview diff --git a/usr.bin/vis/foldit.c b/usr.bin/vis/foldit.c index 6ad82c2dc2f4..3c977cb8d5e0 100644 --- a/usr.bin/vis/foldit.c +++ b/usr.bin/vis/foldit.c @@ -44,9 +44,7 @@ static const char sccsid[] = "@(#)foldit.c 8.1 (Berkeley) 6/6/93"; #include "extern.h" int -foldit(chunk, col, max) - char *chunk; - int col, max; +foldit(char *chunk, int col, int max) { char *cp; diff --git a/usr.bin/vmstat/Makefile b/usr.bin/vmstat/Makefile index 6e87a6a6f8e5..d413d25ab61a 100644 --- a/usr.bin/vmstat/Makefile +++ b/usr.bin/vmstat/Makefile @@ -6,4 +6,6 @@ MAN= vmstat.8 DPADD= ${LIBDEVSTAT} ${LIBKVM} ${LIBMEMSTAT} ${LIBUTIL} LDADD= -ldevstat -lkvm -lmemstat -lutil +WARNS?= 1 + .include diff --git a/usr.bin/vmstat/vmstat.c b/usr.bin/vmstat/vmstat.c index aa1d13bb47aa..cf4b73a07c26 100644 --- a/usr.bin/vmstat/vmstat.c +++ b/usr.bin/vmstat/vmstat.c @@ -58,6 +58,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include @@ -417,11 +418,91 @@ getuptime(void) return(uptime); } +static void +fill_pcpu(struct pcpu ***pcpup, int* maxcpup) +{ + struct pcpu **pcpu; + + int maxcpu, size, i; + + *pcpup = NULL; + + if (kd == NULL) + return; + + maxcpu = kvm_getmaxcpu(kd); + if (maxcpu < 0) + errx(1, "kvm_getmaxcpu: %s", kvm_geterr(kd)); + + pcpu = calloc(maxcpu, sizeof(struct pcpu *)); + if (pcpu == NULL) + err(1, "calloc"); + + for (i = 0; i < maxcpu; i++) { + pcpu[i] = kvm_getpcpu(kd, i); + if (pcpu[i] == (struct pcpu *)-1) + errx(1, "kvm_getpcpu: %s", kvm_geterr(kd)); + } + + *maxcpup = maxcpu; + *pcpup = pcpu; +} + +static void +free_pcpu(struct pcpu **pcpu, int maxcpu) +{ + int i; + + for (i = 0; i < maxcpu; i++) + free(pcpu[i]); + free(pcpu); +} + static void fill_vmmeter(struct vmmeter *vmmp) { + struct pcpu **pcpu; + int maxcpu, i; + if (kd != NULL) { kread(X_SUM, vmmp, sizeof(*vmmp)); + fill_pcpu(&pcpu, &maxcpu); + for (i = 0; i < maxcpu; i++) { + if (pcpu[i] == NULL) + continue; +#define ADD_FROM_PCPU(i, name) \ + vmmp->name += pcpu[i]->pc_cnt.name + ADD_FROM_PCPU(i, v_swtch); + ADD_FROM_PCPU(i, v_trap); + ADD_FROM_PCPU(i, v_syscall); + ADD_FROM_PCPU(i, v_intr); + ADD_FROM_PCPU(i, v_soft); + ADD_FROM_PCPU(i, v_vm_faults); + ADD_FROM_PCPU(i, v_cow_faults); + ADD_FROM_PCPU(i, v_cow_optim); + ADD_FROM_PCPU(i, v_zfod); + ADD_FROM_PCPU(i, v_ozfod); + ADD_FROM_PCPU(i, v_swapin); + ADD_FROM_PCPU(i, v_swapout); + ADD_FROM_PCPU(i, v_swappgsin); + ADD_FROM_PCPU(i, v_swappgsout); + ADD_FROM_PCPU(i, v_vnodein); + ADD_FROM_PCPU(i, v_vnodeout); + ADD_FROM_PCPU(i, v_vnodepgsin); + ADD_FROM_PCPU(i, v_vnodepgsout); + ADD_FROM_PCPU(i, v_intrans); + ADD_FROM_PCPU(i, v_tfree); + ADD_FROM_PCPU(i, v_forks); + ADD_FROM_PCPU(i, v_vforks); + ADD_FROM_PCPU(i, v_rforks); + ADD_FROM_PCPU(i, v_kthreads); + ADD_FROM_PCPU(i, v_forkpages); + ADD_FROM_PCPU(i, v_vforkpages); + ADD_FROM_PCPU(i, v_rforkpages); + ADD_FROM_PCPU(i, v_kthreadpages); +#undef ADD_FROM_PCPU + } + free_pcpu(pcpu, maxcpu); } else { size_t size = sizeof(unsigned int); #define GET_VM_STATS(cat, name) \ diff --git a/usr.bin/w/w.1 b/usr.bin/w/w.1 index 0dfbd1b8b59e..26ca42a52191 100644 --- a/usr.bin/w/w.1 +++ b/usr.bin/w/w.1 @@ -87,8 +87,8 @@ If one or more .Ar user names are specified, the output is restricted to those users. .Sh FILES -.Bl -tag -width ".Pa /var/run/utmp" -compact -.It Pa /var/run/utmp +.Bl -tag -width ".Pa /var/run/utx.active" -compact +.It Pa /var/run/utx.active list of users on the system .El .Sh COMPATIBILITY diff --git a/usr.bin/w/w.c b/usr.bin/w/w.c index 10ec7b04bd22..fb97e8afa9d6 100644 --- a/usr.bin/w/w.c +++ b/usr.bin/w/w.c @@ -84,13 +84,13 @@ static const char sccsid[] = "@(#)w.c 8.4 (Berkeley) 4/16/94"; #include #include #include -#include +#include #include #include "extern.h" struct timeval boottime; -struct utmp utmp; +struct utmpx *utmp; struct winsize ws; kvm_t *kd; time_t now; /* the current time of day */ @@ -109,7 +109,7 @@ char **sel_users; /* login array of particular users selected */ */ struct entry { struct entry *next; - struct utmp utmp; + struct utmpx utmp; dev_t tdev; /* dev_t of terminal */ time_t idle; /* idle time of terminal in seconds */ struct kinfo_proc *kp; /* `most interesting' proc */ @@ -117,13 +117,14 @@ struct entry { struct kinfo_proc *dkp; /* debug option proc list */ } *ep, *ehead = NULL, **nextp = &ehead; -#define debugproc(p) *((struct kinfo_proc **)&(p)->ki_udata) +#define debugproc(p) *(&((struct kinfo_proc *)p)->ki_udata) -/* W_DISPHOSTSIZE should not be greater than UT_HOSTSIZE */ -#define W_DISPHOSTSIZE 16 +#define W_DISPUSERSIZE 10 +#define W_DISPLINESIZE 8 +#define W_DISPHOSTSIZE 24 static void pr_header(time_t *, int); -static struct stat *ttystat(char *, int); +static struct stat *ttystat(char *); static void usage(int); static int this_is_uptime(const char *s); @@ -135,7 +136,6 @@ main(int argc, char *argv[]) struct kinfo_proc *kp; struct kinfo_proc *dkp; struct stat *stp; - FILE *ut; time_t touched; int ch, i, nentries, nusers, wcmd, longidle, longattime, dropgid; const char *memf, *nlistf, *p; @@ -158,7 +158,8 @@ main(int argc, char *argv[]) } dropgid = 0; - memf = nlistf = _PATH_DEVNULL; + memf = _PATH_DEVNULL; + nlistf = NULL; while ((ch = getopt(argc, argv, p)) != -1) switch (ch) { case 'd': @@ -208,16 +209,15 @@ main(int argc, char *argv[]) errx(1, "%s", errbuf); (void)time(&now); - if ((ut = fopen(_PATH_UTMP, "r")) == NULL) - err(1, "%s", _PATH_UTMP); if (*argv) sel_users = argv; - for (nusers = 0; fread(&utmp, sizeof(utmp), 1, ut);) { - if (utmp.ut_name[0] == '\0') + setutxent(); + for (nusers = 0; (utmp = getutxent()) != NULL;) { + if (utmp->ut_type != USER_PROCESS) continue; - if (!(stp = ttystat(utmp.ut_line, UT_LINESIZE))) + if (!(stp = ttystat(utmp->ut_line))) continue; /* corrupted record */ ++nusers; if (wcmd == 0) @@ -228,7 +228,7 @@ main(int argc, char *argv[]) usermatch = 0; for (user = sel_users; !usermatch && *user; user++) - if (!strncmp(utmp.ut_name, *user, UT_NAMESIZE)) + if (!strcmp(utmp->ut_user, *user)) usermatch = 1; if (!usermatch) continue; @@ -237,7 +237,7 @@ main(int argc, char *argv[]) errx(1, "calloc"); *nextp = ep; nextp = &ep->next; - memmove(&ep->utmp, &utmp, sizeof(struct utmp)); + memmove(&ep->utmp, utmp, sizeof *utmp); ep->tdev = stp->st_rdev; /* * If this is the console device, attempt to ascertain @@ -250,14 +250,14 @@ main(int argc, char *argv[]) (void)sysctlbyname("machdep.consdev", &ep->tdev, &size, NULL, 0); } touched = stp->st_atime; - if (touched < ep->utmp.ut_time) { + if (touched < ep->utmp.ut_tv.tv_sec) { /* tty untouched since before login */ - touched = ep->utmp.ut_time; + touched = ep->utmp.ut_tv.tv_sec; } if ((ep->idle = now - touched) < 0) ep->idle = 0; } - (void)fclose(ut); + endutxent(); if (header || wcmd == 0) { pr_header(&now, nusers); @@ -271,11 +271,11 @@ main(int argc, char *argv[]) #define HEADER_FROM "FROM" #define HEADER_LOGIN_IDLE "LOGIN@ IDLE " #define HEADER_WHAT "WHAT\n" -#define WUSED (UT_NAMESIZE + UT_LINESIZE + W_DISPHOSTSIZE + \ +#define WUSED (W_DISPUSERSIZE + W_DISPLINESIZE + W_DISPHOSTSIZE + \ sizeof(HEADER_LOGIN_IDLE) + 3) /* header width incl. spaces */ (void)printf("%-*.*s %-*.*s %-*.*s %s", - UT_NAMESIZE, UT_NAMESIZE, HEADER_USER, - UT_LINESIZE, UT_LINESIZE, HEADER_TTY, + W_DISPUSERSIZE, W_DISPUSERSIZE, HEADER_USER, + W_DISPLINESIZE, W_DISPLINESIZE, HEADER_TTY, W_DISPHOSTSIZE, W_DISPHOSTSIZE, HEADER_FROM, HEADER_LOGIN_IDLE HEADER_WHAT); } @@ -283,7 +283,8 @@ main(int argc, char *argv[]) if ((kp = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nentries)) == NULL) err(1, "%s", kvm_geterr(kd)); for (i = 0; i < nentries; i++, kp++) { - if (kp->ki_stat == SIDL || kp->ki_stat == SZOMB) + if (kp->ki_stat == SIDL || kp->ki_stat == SZOMB || + kp->ki_tdev == NODEV) continue; for (ep = ehead; ep != NULL; ep = ep->next) { if (ep->tdev == kp->ki_tdev) { @@ -347,7 +348,7 @@ main(int argc, char *argv[]) } for (ep = ehead; ep != NULL; ep = ep->next) { - char host_buf[UT_HOSTSIZE + 1]; + struct addrinfo hints, *res; struct sockaddr_storage ss; struct sockaddr *sa = (struct sockaddr *)&ss; struct sockaddr_in *lsin = (struct sockaddr_in *)&ss; @@ -355,9 +356,7 @@ main(int argc, char *argv[]) time_t t; int isaddr; - host_buf[UT_HOSTSIZE] = '\0'; - strncpy(host_buf, ep->utmp.ut_host, UT_HOSTSIZE); - p = *host_buf ? host_buf : "-"; + p = *ep->utmp.ut_host ? ep->utmp.ut_host : "-"; if ((x_suffix = strrchr(p, ':')) != NULL) { if ((dot = strchr(x_suffix, '.')) != NULL && strchr(dot+1, '.') == NULL) @@ -365,23 +364,42 @@ main(int argc, char *argv[]) else x_suffix = NULL; } + + isaddr = 0; + memset(&ss, '\0', sizeof(ss)); + if (inet_pton(AF_INET6, p, &lsin6->sin6_addr) == 1) { + lsin6->sin6_len = sizeof(*lsin6); + lsin6->sin6_family = AF_INET6; + isaddr = 1; + } else if (inet_pton(AF_INET, p, &lsin->sin_addr) == 1) { + lsin->sin_len = sizeof(*lsin); + lsin->sin_family = AF_INET; + isaddr = 1; + } if (!nflag) { /* Attempt to change an IP address into a name */ - isaddr = 0; - memset(&ss, '\0', sizeof(ss)); - if (inet_pton(AF_INET6, p, &lsin6->sin6_addr) == 1) { - lsin6->sin6_len = sizeof(*lsin6); - lsin6->sin6_family = AF_INET6; - isaddr = 1; - } else if (inet_pton(AF_INET, p, &lsin->sin_addr) == 1) { - lsin->sin_len = sizeof(*lsin); - lsin->sin_family = AF_INET; - isaddr = 1; - } if (isaddr && realhostname_sa(fn, sizeof(fn), sa, sa->sa_len) == HOSTNAME_FOUND) p = fn; + } else if (!isaddr) { + /* + * If a host has only one A/AAAA RR, change a + * name into an IP address + */ + memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_PASSIVE; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + if (getaddrinfo(p, NULL, &hints, &res) == 0) { + if (res->ai_next == NULL && + getnameinfo(res->ai_addr, res->ai_addrlen, + fn, sizeof(fn), NULL, 0, + NI_NUMERICHOST) == 0) + p = fn; + freeaddrinfo(res); + } } + if (x_suffix) { (void)snprintf(buf, sizeof(buf), "%s:%s", p, x_suffix); p = buf; @@ -399,13 +417,14 @@ main(int argc, char *argv[]) } } (void)printf("%-*.*s %-*.*s %-*.*s ", - UT_NAMESIZE, UT_NAMESIZE, ep->utmp.ut_name, - UT_LINESIZE, UT_LINESIZE, - strncmp(ep->utmp.ut_line, "tty", 3) && + W_DISPUSERSIZE, W_DISPUSERSIZE, ep->utmp.ut_user, + W_DISPLINESIZE, W_DISPLINESIZE, + *ep->utmp.ut_line ? + (strncmp(ep->utmp.ut_line, "tty", 3) && strncmp(ep->utmp.ut_line, "cua", 3) ? - ep->utmp.ut_line : ep->utmp.ut_line + 3, + ep->utmp.ut_line : ep->utmp.ut_line + 3) : "-", W_DISPHOSTSIZE, W_DISPHOSTSIZE, *p ? p : "-"); - t = _time_to_time32(ep->utmp.ut_time); + t = ep->utmp.ut_tv.tv_sec; longattime = pr_attime(&t, &now); longidle = pr_idle(ep->idle); (void)printf("%.*s\n", argwidth - longidle - longattime, @@ -476,12 +495,12 @@ pr_header(time_t *nowp, int nusers) } static struct stat * -ttystat(char *line, int sz) +ttystat(char *line) { static struct stat sb; char ttybuf[MAXPATHLEN]; - (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line); + (void)snprintf(ttybuf, sizeof(ttybuf), "%s%s", _PATH_DEV, line); if (stat(ttybuf, &sb) == 0) { return (&sb); } else diff --git a/usr.bin/wall/Makefile b/usr.bin/wall/Makefile index 65abb61184c7..c5deb3bc408c 100644 --- a/usr.bin/wall/Makefile +++ b/usr.bin/wall/Makefile @@ -1,4 +1,5 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $FreeBSD$ PROG= wall SRCS= ttymsg.c wall.c diff --git a/usr.bin/wall/wall.c b/usr.bin/wall/wall.c index be5329aca566..b92edd445230 100644 --- a/usr.bin/wall/wall.c +++ b/usr.bin/wall/wall.c @@ -65,7 +65,7 @@ static const char sccsid[] = "@(#)wall.c 8.2 (Berkeley) 11/16/93"; #include #include #include -#include +#include #include "ttymsg.h" @@ -82,12 +82,12 @@ int mbufsize; char *mbuf; static int -ttystat(char *line, int sz) +ttystat(char *line) { struct stat sb; char ttybuf[MAXPATHLEN]; - (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line); + (void)snprintf(ttybuf, sizeof(ttybuf), "%s%s", _PATH_DEV, line); if (stat(ttybuf, &sb) == 0) { return (0); } else @@ -98,17 +98,14 @@ int main(int argc, char *argv[]) { struct iovec iov; - struct utmp utmp; + struct utmpx *utmp; int ch; int ingroup; - FILE *fp; struct wallgroup *g; struct group *grp; char **np; const char *p; struct passwd *pw; - char line[sizeof(utmp.ut_line) + 1]; - char username[sizeof(utmp.ut_name) + 1]; (void)setlocale(LC_CTYPE, ""); @@ -145,20 +142,17 @@ main(int argc, char *argv[]) makemsg(*argv); - if (!(fp = fopen(_PATH_UTMP, "r"))) - err(1, "cannot read %s", _PATH_UTMP); iov.iov_base = mbuf; iov.iov_len = mbufsize; /* NOSTRICT */ - while (fread((char *)&utmp, sizeof(utmp), 1, fp) == 1) { - if (!utmp.ut_name[0]) + while ((utmp = getutxent()) != NULL) { + if (utmp->ut_type != USER_PROCESS) continue; - if (ttystat(utmp.ut_line, UT_LINESIZE) != 0) + if (ttystat(utmp->ut_line) != 0) continue; if (grouplist) { ingroup = 0; - strlcpy(username, utmp.ut_name, sizeof(utmp.ut_name)); - pw = getpwnam(username); + pw = getpwnam(utmp->ut_user); if (!pw) continue; for (g = grouplist; g && ingroup == 0; g = g->next) { @@ -168,7 +162,7 @@ main(int argc, char *argv[]) ingroup = 1; else if ((grp = getgrgid(g->gid)) != NULL) { for (np = grp->gr_mem; *np; np++) { - if (strcmp(*np, username) == 0) { + if (strcmp(*np, utmp->ut_user) == 0) { ingroup = 1; break; } @@ -178,16 +172,14 @@ main(int argc, char *argv[]) if (ingroup == 0) continue; } - strncpy(line, utmp.ut_line, sizeof(utmp.ut_line)); - line[sizeof(utmp.ut_line)] = '\0'; - if ((p = ttymsg(&iov, 1, line, 60*5)) != NULL) + if ((p = ttymsg(&iov, 1, utmp->ut_line, 60*5)) != NULL) warnx("%s", p); } exit(0); } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: wall [-g group] [file]\n"); exit(1); diff --git a/usr.bin/wc/Makefile b/usr.bin/wc/Makefile index edce9c1412c8..4fa9f30f7912 100644 --- a/usr.bin/wc/Makefile +++ b/usr.bin/wc/Makefile @@ -2,5 +2,4 @@ # $FreeBSD$ PROG= wc -WARNS?= 6 .include diff --git a/usr.bin/wc/wc.c b/usr.bin/wc/wc.c index b787612d3b0c..5b0247478a0f 100644 --- a/usr.bin/wc/wc.c +++ b/usr.bin/wc/wc.c @@ -287,7 +287,7 @@ word: gotsp = 1; } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: wc [-Lclmw] [file ...]\n"); exit(1); diff --git a/usr.bin/whereis/Makefile b/usr.bin/whereis/Makefile index d48b30d11782..47e2c3dcf494 100644 --- a/usr.bin/whereis/Makefile +++ b/usr.bin/whereis/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= whereis -WARNS?= 5 .include diff --git a/usr.bin/who/Makefile b/usr.bin/who/Makefile index 8695ca223237..0478d73071a3 100644 --- a/usr.bin/who/Makefile +++ b/usr.bin/who/Makefile @@ -1,4 +1,5 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $FreeBSD$ PROG= who diff --git a/usr.bin/who/who.1 b/usr.bin/who/who.1 index e36b07cde550..4a5c6a44fcd4 100644 --- a/usr.bin/who/who.1 +++ b/usr.bin/who/who.1 @@ -90,36 +90,36 @@ Equivalent to By default, .Nm gathers information from the file -.Pa /var/run/utmp . +.Pa /var/run/utx.active . An alternate .Ar file may be specified which is usually -.Pa /var/log/wtmp +.Pa /var/log/utx.log (or -.Pa /var/log/wtmp.[0-6] +.Pa /var/log/utx.log.[0-6] depending on site policy as -.Pa wtmp +.Pa utx.log can grow quite large and daily versions may or may not be kept around after compression by .Xr ac 8 ) . The -.Pa wtmp +.Pa utx.log file contains a record of every login, logout, crash, shutdown and date change since -.Pa wtmp +.Pa utx.log was last truncated or created. .Pp If -.Pa /var/log/wtmp +.Pa /var/log/utx.log is being used as the file, the user name may be empty or one of the special characters '|', '}' and '~'. Logouts produce an output line without any user name. For more information on the special characters, see -.Xr utmp 5 . +.Xr getutxent 3 . .Sh ENVIRONMENT The .Ev COLUMNS , LANG , LC_ALL @@ -130,10 +130,10 @@ environment variables affect the execution of as described in .Xr environ 7 . .Sh FILES -.Bl -tag -width /var/log/wtmp.[0-6] -compact -.It Pa /var/run/utmp -.It Pa /var/log/wtmp -.It Pa /var/log/wtmp.[0-6] +.Bl -tag -width /var/log/utx.log.[0-6] -compact +.It Pa /var/run/utx.active +.It Pa /var/log/utx.log +.It Pa /var/log/utx.log.[0-6] .El .Sh EXIT STATUS .Ex -std @@ -141,7 +141,7 @@ as described in .Xr last 1 , .Xr users 1 , .Xr w 1 , -.Xr utmp 5 +.Xr getutxent 3 .Sh STANDARDS The .Nm diff --git a/usr.bin/who/who.c b/usr.bin/who/who.c index f94fcdb34743..d6f38dd62919 100644 --- a/usr.bin/who/who.c +++ b/usr.bin/who/who.c @@ -45,15 +45,15 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include static void heading(void); -static void process_utmp(FILE *); -static void quick(FILE *); -static void row(struct utmp *); +static void process_utmp(void); +static void quick(void); +static void row(struct utmpx *); static int ttywidth(void); static void usage(void); -static void whoami(FILE *); +static void whoami(void); static int Hflag; /* Write column headings */ static int mflag; /* Show info about current terminal */ @@ -66,8 +66,6 @@ int main(int argc, char *argv[]) { int ch; - const char *file; - FILE *fp; setlocale(LC_TIME, ""); @@ -109,27 +107,25 @@ main(int argc, char *argv[]) if (argc > 1) usage(); - if (*argv != NULL) - file = *argv; - else - file = _PATH_UTMP; - if ((fp = fopen(file, "r")) == NULL) - err(1, "%s", file); + if (*argv != NULL) { + if (setutxdb(UTXDB_ACTIVE, *argv) != 0) + err(1, "%s", *argv); + } if (qflag) - quick(fp); + quick(); else { if (sflag) Tflag = uflag = 0; if (Hflag) heading(); if (mflag) - whoami(fp); + whoami(); else - process_utmp(fp); + process_utmp(); } - fclose(fp); + endutxent(); exit(0); } @@ -146,21 +142,19 @@ static void heading(void) { - printf("%-*s ", UT_NAMESIZE, "NAME"); + printf("%-16s ", "NAME"); if (Tflag) printf("S "); - printf("%-*s ", UT_LINESIZE, "LINE"); - printf("%-*s ", 12, "TIME"); + printf("%-8s %-12s ", "LINE", "TIME"); if (uflag) printf("IDLE "); - printf("%-*s", UT_HOSTSIZE, "FROM"); - putchar('\n'); + printf("%-16s\n", "FROM"); } static void -row(struct utmp *ut) +row(struct utmpx *ut) { - char buf[80], tty[sizeof(_PATH_DEV) + UT_LINESIZE]; + char buf[80], tty[PATH_MAX]; struct stat sb; time_t idle, t; static int d_first = -1; @@ -173,8 +167,7 @@ row(struct utmp *ut) state = '?'; idle = 0; if (Tflag || uflag) { - snprintf(tty, sizeof(tty), "%s%.*s", _PATH_DEV, - UT_LINESIZE, ut->ut_line); + snprintf(tty, sizeof(tty), "%s%s", _PATH_DEV, ut->ut_line); if (stat(tty, &sb) == 0) { state = sb.st_mode & (S_IWOTH|S_IWGRP) ? '+' : '-'; @@ -182,11 +175,11 @@ row(struct utmp *ut) } } - printf("%-*.*s ", UT_NAMESIZE, UT_NAMESIZE, ut->ut_name); + printf("%-16s ", ut->ut_user); if (Tflag) printf("%c ", state); - printf("%-*.*s ", UT_LINESIZE, UT_LINESIZE, ut->ut_line); - t = _time32_to_time(ut->ut_time); + printf("%-8s ", ut->ut_line); + t = ut->ut_tv.tv_sec; tm = localtime(&t); strftime(buf, sizeof(buf), d_first ? "%e %b %R" : "%b %e %R", tm); printf("%-*s ", 12, buf); @@ -200,17 +193,17 @@ row(struct utmp *ut) printf(" old "); } if (*ut->ut_host != '\0') - printf("(%.*s)", UT_HOSTSIZE, ut->ut_host); + printf("(%s)", ut->ut_host); putchar('\n'); } static int -ttystat(char *line, int sz) +ttystat(char *line) { struct stat sb; char ttybuf[MAXPATHLEN]; - (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line); + (void)snprintf(ttybuf, sizeof(ttybuf), "%s%s", _PATH_DEV, line); if (stat(ttybuf, &sb) == 0) { return (0); } else @@ -218,32 +211,32 @@ ttystat(char *line, int sz) } static void -process_utmp(FILE *fp) +process_utmp(void) { - struct utmp ut; + struct utmpx *utx; - while (fread(&ut, sizeof(ut), 1, fp) == 1) { - if (*ut.ut_name == '\0') + while ((utx = getutxent()) != NULL) { + if (utx->ut_type != USER_PROCESS) continue; - if (ttystat(ut.ut_line, UT_LINESIZE) != 0) + if (ttystat(utx->ut_line) != 0) continue; - row(&ut); + row(utx); } } static void -quick(FILE *fp) +quick(void) { - struct utmp ut; + struct utmpx *utx; int col, ncols, num; ncols = ttywidth(); col = num = 0; - while (fread(&ut, sizeof(ut), 1, fp) == 1) { - if (*ut.ut_name == '\0') + while ((utx = getutxent()) != NULL) { + if (utx->ut_type != USER_PROCESS) continue; - printf("%-*.*s", UT_NAMESIZE, UT_NAMESIZE, ut.ut_name); - if (++col < ncols / (UT_NAMESIZE + 1)) + printf("%-16s", utx->ut_user); + if (++col < ncols / (16 + 1)) putchar(' '); else { col = 0; @@ -258,24 +251,23 @@ quick(FILE *fp) } static void -whoami(FILE *fp) +whoami(void) { - struct utmp ut; + struct utmpx ut, *utx; struct passwd *pwd; - const char *name, *p, *tty; + const char *name, *tty; if ((tty = ttyname(STDIN_FILENO)) == NULL) tty = "tty??"; - else if ((p = strrchr(tty, '/')) != NULL) - tty = p + 1; + else if (strncmp(tty, _PATH_DEV, sizeof _PATH_DEV - 1) == 0) + tty += sizeof _PATH_DEV - 1; + strlcpy(ut.ut_line, tty, sizeof ut.ut_line); /* Search utmp for our tty, dump first matching record. */ - while (fread(&ut, sizeof(ut), 1, fp) == 1) - if (*ut.ut_name != '\0' && strncmp(ut.ut_line, tty, - UT_LINESIZE) == 0) { - row(&ut); - return; - } + if ((utx = getutxline(&ut)) != NULL && utx->ut_type == USER_PROCESS) { + row(utx); + return; + } /* Not found; fill the utmp structure with the information we have. */ memset(&ut, 0, sizeof(ut)); @@ -283,9 +275,8 @@ whoami(FILE *fp) name = pwd->pw_name; else name = "?"; - strncpy(ut.ut_name, name, UT_NAMESIZE); - strncpy(ut.ut_line, tty, UT_LINESIZE); - ut.ut_time = _time_to_time32(time(NULL)); + strlcpy(ut.ut_user, name, sizeof ut.ut_user); + gettimeofday(&ut.ut_tv, NULL); row(&ut); } diff --git a/usr.bin/whois/whois.1 b/usr.bin/whois/whois.1 index 52da22091773..45b386786879 100644 --- a/usr.bin/whois/whois.1 +++ b/usr.bin/whois/whois.1 @@ -32,7 +32,7 @@ .\" From: @(#)whois.1 8.1 (Berkeley) 6/6/93 .\" $FreeBSD$ .\" -.Dd January 23, 2006 +.Dd October 2, 2009 .Dt WHOIS 1 .Os .Sh NAME @@ -40,7 +40,7 @@ .Nd "Internet domain name and network number directory service" .Sh SYNOPSIS .Nm -.Op Fl aAbdfgiIklmQrR6 +.Op Fl aAbfgiIklmQrR .Op Fl c Ar country-code | Fl h Ar host .Op Fl p Ar port .Ar name ... @@ -82,11 +82,6 @@ This is the equivalent of using the .Fl h option with an argument of .Qq Ar country-code Ns Li .whois-servers.net . -.It Fl d -Use the US Department of Defense -database. -It contains points of contact for subdomains of -.Pa .MIL . .It Fl f Use the African Network Information Centre .Pq Tn AfriNIC @@ -212,17 +207,14 @@ This option is deprecated; use the option with an argument of .Qq Li RU instead. -.It Fl 6 -Use the IPv6 Resource Center -.Pq Tn 6bone -database. -It contains network names and addresses for the IPv6 network. -.El .Pp The operands specified to .Nm are treated independently and may be used as queries on different whois servers. +.El +.Sh EXIT STATUS +.Ex -std .Sh EXAMPLES Most types of data, such as domain names and .Tn IP @@ -255,15 +247,6 @@ but other .Tn TLDs can be queried by using a similar syntax.) .Pp -The following example demonstrates how to obtain information about an -.Tn IPv6 -address or hostname using the -.Fl 6 -option, which directs the query to -.Tn 6bone . -.Pp -.Dl "whois -6 IPv6-IP-Address" -.Pp The following example demonstrates how to query a whois server using a non-standard port, where .Dq Li query-data diff --git a/usr.bin/whois/whois.c b/usr.bin/whois/whois.c index c21655625175..864a58539b58 100644 --- a/usr.bin/whois/whois.c +++ b/usr.bin/whois/whois.c @@ -63,7 +63,6 @@ __FBSDID("$FreeBSD$"); #define ABUSEHOST "whois.abuse.net" #define NICHOST "whois.crsnic.net" #define INICHOST "whois.networksolutions.com" -#define DNICHOST "whois.nic.mil" #define GNICHOST "whois.nic.gov" #define ANICHOST "whois.arin.net" #define LNICHOST "whois.lacnic.net" @@ -72,7 +71,6 @@ __FBSDID("$FreeBSD$"); #define PNICHOST "whois.apnic.net" #define MNICHOST "whois.ra.net" #define QNICHOST_TAIL ".whois-servers.net" -#define SNICHOST "whois.6bone.net" #define BNICHOST "whois.registro.br" #define NORIDHOST "whois.norid.no" #define IANAHOST "whois.iana.org" @@ -110,7 +108,7 @@ main(int argc, char *argv[]) country = host = qnichost = NULL; flags = use_qnichost = 0; - while ((ch = getopt(argc, argv, "aAbc:dfgh:iIklmp:QrR6")) != -1) { + while ((ch = getopt(argc, argv, "aAbc:fgh:iIklmp:QrR6")) != -1) { switch (ch) { case 'a': host = ANICHOST; @@ -124,9 +122,6 @@ main(int argc, char *argv[]) case 'c': country = optarg; break; - case 'd': - host = DNICHOST; - break; case 'f': host = FNICHOST; break; @@ -164,8 +159,10 @@ main(int argc, char *argv[]) warnx("-R is deprecated; use '-c ru' instead"); country = "ru"; break; + /* Remove in FreeBSD 10 */ case '6': - host = SNICHOST; + errx(EX_USAGE, + "-6 is deprecated; use -[aAflr] instead"); break; case '?': default: @@ -218,6 +215,10 @@ choose_server(char *domain) { char *pos, *retval; + if (strchr(domain, ':')) { + s_asprintf(&retval, "%s", ANICHOST); + return (retval); + } for (pos = strchr(domain, '\0'); pos > domain && *--pos == '.';) *pos = '\0'; if (*domain == '\0') @@ -363,7 +364,7 @@ static void usage(void) { fprintf(stderr, - "usage: whois [-aAbdfgiIklmQrR6] [-c country-code | -h hostname] " + "usage: whois [-aAbfgiIklmQrR6] [-c country-code | -h hostname] " "[-p port] name ...\n"); exit(EX_USAGE); } diff --git a/usr.bin/write/Makefile b/usr.bin/write/Makefile index 8e6454bdc45c..94345c4559d8 100644 --- a/usr.bin/write/Makefile +++ b/usr.bin/write/Makefile @@ -1,4 +1,5 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 +# $FreeBSD$ PROG= write BINMODE=2555 diff --git a/usr.bin/write/write.c b/usr.bin/write/write.c index 878c8c1d0ba1..17f6775964ad 100644 --- a/usr.bin/write/write.c +++ b/usr.bin/write/write.c @@ -63,7 +63,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include void done(int); void do_write(char *, char *, uid_t); @@ -146,20 +146,17 @@ usage(void) int utmp_chk(char *user, char *tty) { - struct utmp u; - int ufd; + struct utmpx lu, *u; - if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0) - return(0); /* ignore error, shouldn't happen anyway */ - - while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u)) - if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0 && - strncmp(tty, u.ut_line, sizeof(u.ut_line)) == 0) { - (void)close(ufd); + strncpy(lu.ut_line, tty, sizeof lu.ut_line); + setutxent(); + while ((u = getutxline(&lu)) != NULL) + if (u->ut_type == USER_PROCESS && + strcmp(user, u->ut_user) == 0) { + endutxent(); return(0); } - - (void)close(ufd); + endutxent(); return(1); } @@ -177,43 +174,40 @@ utmp_chk(char *user, char *tty) void search_utmp(char *user, char *tty, char *mytty, uid_t myuid) { - struct utmp u; + struct utmpx *u; time_t bestatime, atime; - int ufd, nloggedttys, nttys, msgsok, user_is_me; - char atty[UT_LINESIZE + 1]; - - if ((ufd = open(_PATH_UTMP, O_RDONLY)) < 0) - err(1, "utmp"); + int nloggedttys, nttys, msgsok, user_is_me; nloggedttys = nttys = 0; bestatime = 0; user_is_me = 0; - while (read(ufd, (char *) &u, sizeof(u)) == sizeof(u)) - if (strncmp(user, u.ut_name, sizeof(u.ut_name)) == 0) { + + setutxent(); + while ((u = getutxent()) != NULL) + if (u->ut_type == USER_PROCESS && + strcmp(user, u->ut_user) == 0) { ++nloggedttys; - (void)strncpy(atty, u.ut_line, UT_LINESIZE); - atty[UT_LINESIZE] = '\0'; - if (term_chk(atty, &msgsok, &atime, 0)) + if (term_chk(u->ut_line, &msgsok, &atime, 0)) continue; /* bad term? skip */ if (myuid && !msgsok) continue; /* skip ttys with msgs off */ - if (strcmp(atty, mytty) == 0) { + if (strcmp(u->ut_line, mytty) == 0) { user_is_me = 1; continue; /* don't write to yourself */ } ++nttys; if (atime > bestatime) { bestatime = atime; - (void)strcpy(tty, atty); + (void)strlcpy(tty, u->ut_line, MAXPATHLEN); } } + endutxent(); - (void)close(ufd); if (nloggedttys == 0) errx(1, "%s is not logged in", user); if (nttys == 0) { if (user_is_me) { /* ok, so write to yourself! */ - (void)strcpy(tty, mytty); + (void)strlcpy(tty, mytty, MAXPATHLEN); return; } errx(1, "%s has messages disabled", user); diff --git a/usr.bin/wtmpcvt/Makefile b/usr.bin/wtmpcvt/Makefile new file mode 100644 index 000000000000..0caa097be1c8 --- /dev/null +++ b/usr.bin/wtmpcvt/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +PROG= wtmpcvt + +.include diff --git a/usr.bin/wtmpcvt/wtmpcvt.1 b/usr.bin/wtmpcvt/wtmpcvt.1 new file mode 100644 index 000000000000..fdc995b4d5c0 --- /dev/null +++ b/usr.bin/wtmpcvt/wtmpcvt.1 @@ -0,0 +1,66 @@ +.\" Copyright (c) 2010 Ed Schouten +.\" 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$ +.\" +.Dd January 14, 2010 +.Os +.Dt WTMPCVT 1 +.Sh NAME +.Nm wtmpcvt +.Nd convert wtmp files to the utmpx format +.Sh SYNOPSIS +.Nm +.Ar input +.Ar output +.Sh DESCRIPTION +The +.Nm +utility converts traditional +.Pa wtmp +user accounting database files to the same format that is used by +.Pa /var/log/utx.log . +This makes it possible to view their contents using existing accounting +utilities, such as +.Xr last 1 +and +.Xr ac 8 . +.Sh SEE ALSO +.Xr last 1 , +.Xr getutxent 3 , +.Xr ac 8 +.Sh HISTORY +The +.Nm +utility appeared in +.Fx 9.0 . +.Sh BUGS +The application assumes the +.Ar input +file has the same byte order as the host system. +The +.Ar output +file can be used on any architecture. +.Sh AUTHORS +.An Ed Schouten Aq ed@FreeBSD.org diff --git a/usr.bin/wtmpcvt/wtmpcvt.c b/usr.bin/wtmpcvt/wtmpcvt.c new file mode 100644 index 000000000000..aa4e25e2c395 --- /dev/null +++ b/usr.bin/wtmpcvt/wtmpcvt.c @@ -0,0 +1,138 @@ +/*- + * Copyright (c) 2010 Ed Schouten + * 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. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "../../lib/libc/gen/utxdb.h" + +struct outmp { + char ut_line[8]; + char ut_user[16]; + char ut_host[16]; + int32_t ut_time; +}; + +static void +usage(void) +{ + + fprintf(stderr, "usage: wtmpcvt input output\n"); + exit(1); +} + +static void +outmp_to_futx(const struct outmp *ui, struct futx *uo) +{ + + memset(uo, 0, sizeof *uo); +#define COPY_STRING(field) do { \ + strncpy(uo->fu_ ## field, ui->ut_ ## field, \ + MIN(sizeof uo->fu_ ## field, sizeof ui->ut_ ## field)); \ +} while (0) +#define COPY_LINE_TO_ID() do { \ + strncpy(uo->fu_id, ui->ut_line, \ + MIN(sizeof uo->fu_id, sizeof ui->ut_line)); \ +} while (0) +#define MATCH(field, value) (strncmp(ui->ut_ ## field, (value), \ + sizeof(ui->ut_ ## field)) == 0) + if (MATCH(user, "reboot") && MATCH(line, "~")) + uo->fu_type = BOOT_TIME; + else if (MATCH(user, "date") && MATCH(line, "|")) + uo->fu_type = OLD_TIME; + else if (MATCH(user, "date") && MATCH(line, "{")) + uo->fu_type = NEW_TIME; + else if (MATCH(user, "shutdown") && MATCH(line, "~")) + uo->fu_type = SHUTDOWN_TIME; + else if (MATCH(user, "") && MATCH(host, "") && !MATCH(line, "")) { + uo->fu_type = DEAD_PROCESS; + COPY_LINE_TO_ID(); + } else if (!MATCH(user, "") && !MATCH(line, "") && ui->ut_time != 0) { + uo->fu_type = USER_PROCESS; + COPY_STRING(user); + COPY_STRING(line); + COPY_STRING(host); + COPY_LINE_TO_ID(); + } else { + uo->fu_type = EMPTY; + return; + } +#undef COPY_STRING +#undef COPY_LINE_TO_ID +#undef MATCH + + /* Timestamp conversion. XXX: Assumes host byte order! */ + uo->fu_tv = htobe64((uint64_t)ui->ut_time * 1000000); +} + +int +main(int argc, char *argv[]) +{ + FILE *in, *out; + struct outmp ui; + struct futx uo; + size_t l; + uint16_t lo; + + if (argc != 3) + usage(); + + /* Open files. */ + in = fopen(argv[1], "r"); + if (in == NULL) + err(1, argv[1]); + out = fopen(argv[2], "w"); + if (out == NULL) + err(1, argv[2]); + + /* Process entries. */ + while (fread(&ui, sizeof ui, 1, in) == 1) { + outmp_to_futx(&ui, &uo); + if (uo.fu_type == EMPTY) + continue; + + /* Write new entry to output file. */ + for (l = sizeof uo; l > 0 && + ((const char *)&uo)[l - 1] == '\0'; l--); + lo = htobe16(l); + fwrite(&lo, sizeof lo, 1, out); + fwrite(&uo, l, 1, out); + } + + fclose(in); + fclose(out); + return (0); +} diff --git a/usr.bin/xargs/Makefile b/usr.bin/xargs/Makefile index 16162a1641e9..642e9532e421 100644 --- a/usr.bin/xargs/Makefile +++ b/usr.bin/xargs/Makefile @@ -3,6 +3,5 @@ PROG= xargs SRCS= xargs.c strnsubst.c -WARNS?= 6 .include diff --git a/usr.bin/xinstall/Makefile b/usr.bin/xinstall/Makefile index 594f1dcfbf79..e6ff88e90a5b 100644 --- a/usr.bin/xinstall/Makefile +++ b/usr.bin/xinstall/Makefile @@ -4,6 +4,5 @@ PROG= xinstall PROGNAME= install MAN= install.1 -WARNS?= 6 .include diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c index 49e47c65a362..449dea329432 100644 --- a/usr.bin/xinstall/xinstall.c +++ b/usr.bin/xinstall/xinstall.c @@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include #include @@ -86,16 +85,16 @@ int dobackup, docompare, dodir, dopreserve, dostrip, nommap, safecopy, verbose; mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; const char *suffix = BACKUP_SUFFIX; -void copy(int, const char *, int, const char *, off_t); -int compare(int, const char *, size_t, int, const char *, size_t); -int create_newfile(const char *, int, struct stat *); -int create_tempfile(const char *, char *, size_t); -void install(const char *, const char *, u_long, u_int); -void install_dir(char *); -u_long numeric_id(const char *, const char *); -void strip(const char *); -int trymmap(int); -void usage(void); +static int compare(int, const char *, size_t, int, const char *, size_t); +static void copy(int, const char *, int, const char *, off_t); +static int create_newfile(const char *, int, struct stat *); +static int create_tempfile(const char *, char *, size_t); +static void install(const char *, const char *, u_long, u_int); +static void install_dir(char *); +static u_long numeric_id(const char *, const char *); +static void strip(const char *); +static int trymmap(int); +static void usage(void); int main(int argc, char *argv[]) @@ -247,7 +246,7 @@ main(int argc, char *argv[]) /* NOTREACHED */ } -u_long +static u_long numeric_id(const char *name, const char *type) { u_long val; @@ -270,7 +269,7 @@ numeric_id(const char *name, const char *type) * install -- * build a path name and install the file */ -void +static void install(const char *from_name, const char *to_name, u_long fset, u_int flags) { struct stat from_sb, temp_sb, to_sb; @@ -524,7 +523,7 @@ install(const char *from_name, const char *to_name, u_long fset, u_int flags) * compare -- * compare two files; non-zero means files differ */ -int +static int compare(int from_fd, const char *from_name __unused, size_t from_len, int to_fd, const char *to_name __unused, size_t to_len) { @@ -588,7 +587,7 @@ compare(int from_fd, const char *from_name __unused, size_t from_len, * create_tempfile -- * create a temporary file based on path and open it */ -int +static int create_tempfile(const char *path, char *temp, size_t tsize) { char *p; @@ -608,7 +607,7 @@ create_tempfile(const char *path, char *temp, size_t tsize) * create_newfile -- * create a new file, overwriting an existing one if necessary */ -int +static int create_newfile(const char *path, int target, struct stat *sbp) { char backup[MAXPATHLEN]; @@ -651,7 +650,7 @@ create_newfile(const char *path, int target, struct stat *sbp) * copy -- * copy from one file to another */ -void +static void copy(int from_fd, const char *from_name, int to_fd, const char *to_name, off_t size) { @@ -704,7 +703,7 @@ copy(int from_fd, const char *from_name, int to_fd, const char *to_name, * strip -- * use strip(1) to strip the target file */ -void +static void strip(const char *to_name) { const char *stripbin; @@ -734,9 +733,9 @@ strip(const char *to_name) /* * install_dir -- - * build directory heirarchy + * build directory hierarchy */ -void +static void install_dir(char *path) { char *p; @@ -770,8 +769,8 @@ install_dir(char *path) * usage -- * print a usage message and die */ -void -usage() +static void +usage(void) { (void)fprintf(stderr, "usage: install [-bCcpSsv] [-B suffix] [-f flags] [-g group] [-m mode]\n" @@ -787,7 +786,7 @@ usage() * trymmap -- * return true (1) if mmap should be tried, false (0) if not. */ -int +static int trymmap(int fd) { /* diff --git a/usr.bin/xlint/lint1/makeman b/usr.bin/xlint/lint1/makeman index 9c2584640d87..d5be8bfdbb94 100644 --- a/usr.bin/xlint/lint1/makeman +++ b/usr.bin/xlint/lint1/makeman @@ -15,13 +15,6 @@ # 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. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by the NetBSD -# Foundation, Inc. and its contributors. -# 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.bin/xlint/xlint/xlint.c b/usr.bin/xlint/xlint/xlint.c index 82a118e99ab6..553ac19c6f1a 100644 --- a/usr.bin/xlint/xlint/xlint.c +++ b/usr.bin/xlint/xlint/xlint.c @@ -135,7 +135,7 @@ static char *concat3(const char *, const char *, const char *); static void terminate(int) __attribute__((__noreturn__)); static const char *lbasename(const char *, int); static void appdef(char ***, const char *); -static void usage(void); +static void usage(void) __dead2; static void fname(const char *); static void runchild(const char *, char *const *, const char *, int); static void findlibs(char *const *); @@ -304,11 +304,12 @@ int main(int argc, char *argv[]) { int c; - char flgbuf[3], *tmp, *s; + char flgbuf[3], *s; + const char *tmp; size_t len; if ((tmp = getenv("TMPDIR")) == NULL || (len = strlen(tmp)) == 0) { - tmpdir = xstrdup(_PATH_TMP); + tmpdir = _PATH_TMP; } else { s = xmalloc(len + 2); (void)sprintf(s, "%s%s", tmp, tmp[len - 1] == '/' ? "" : "/"); @@ -555,9 +556,9 @@ main(int argc, char *argv[]) terminate(0); if (!oflag) { - if ((s = getenv("LIBDIR")) == NULL || strlen(s) == 0) - s = PATH_LINTLIB; - appcstrg(&libsrchpath, s); + if ((tmp = getenv("LIBDIR")) == NULL || strlen(tmp) == 0) + tmp = PATH_LINTLIB; + appcstrg(&libsrchpath, tmp); findlibs(libs); findlibs(deflibs); } @@ -620,7 +621,7 @@ fname(const char *name) return; } ofn = xmalloc(strlen(bn) + (bn == suff ? 4 : 2)); - len = bn == suff ? strlen(bn) : (suff - 1) - bn; + len = bn == suff ? strlen(bn) : (size_t)((suff - 1) - bn); (void)sprintf(ofn, "%.*s", (int)len, bn); (void)strcat(ofn, ".ln"); } else { diff --git a/usr.bin/yacc/Makefile b/usr.bin/yacc/Makefile index e8b1024e82bb..c2f31a78fe19 100644 --- a/usr.bin/yacc/Makefile +++ b/usr.bin/yacc/Makefile @@ -9,4 +9,6 @@ MAN= yacc.1 yyfix.1 LINKS= ${BINDIR}/yacc ${BINDIR}/byacc MLINKS= yacc.1 byacc.1 +WARNS?= 2 + .include diff --git a/usr.bin/yacc/defs.h b/usr.bin/yacc/defs.h index 5219e1b6623e..772e9129caaa 100644 --- a/usr.bin/yacc/defs.h +++ b/usr.bin/yacc/defs.h @@ -220,7 +220,6 @@ extern char tflag; extern char vflag; extern const char *symbol_prefix; -extern char *myname; extern char *cptr; extern char *line; extern int lineno; diff --git a/usr.bin/yacc/skeleton.c b/usr.bin/yacc/skeleton.c index 8ff7c8a122f1..434a7c231dbf 100644 --- a/usr.bin/yacc/skeleton.c +++ b/usr.bin/yacc/skeleton.c @@ -140,7 +140,11 @@ const char *header[] = const char *body[] = { "/* allocate initial stack or double stack size, up to YYMAXDEPTH */", + "#if defined(__cplusplus) || __STDC__", + "static int yygrowstack(void)", + "#else", "static int yygrowstack()", + "#endif", "{", " int newsize, i;", " short *newss;", diff --git a/usr.bin/ypcat/Makefile b/usr.bin/ypcat/Makefile index 58ee6907f07f..782fdcc1a8d6 100644 --- a/usr.bin/ypcat/Makefile +++ b/usr.bin/ypcat/Makefile @@ -3,4 +3,6 @@ PROG= ypcat +WARNS?= 3 + .include diff --git a/usr.bin/ypmatch/Makefile b/usr.bin/ypmatch/Makefile index 22e62996937e..d4a5b955e5c7 100644 --- a/usr.bin/ypmatch/Makefile +++ b/usr.bin/ypmatch/Makefile @@ -3,4 +3,6 @@ PROG= ypmatch +WARNS?= 3 + .include diff --git a/usr.bin/ypwhich/Makefile b/usr.bin/ypwhich/Makefile index f28f864ab097..3f6928fb7e8b 100644 --- a/usr.bin/ypwhich/Makefile +++ b/usr.bin/ypwhich/Makefile @@ -3,4 +3,6 @@ PROG= ypwhich +WARNS?= 2 + .include diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index 160b122571ae..cdcaaf3cc6b9 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -167,6 +167,7 @@ SUBDIR= ${_ac} \ ${_sa} \ ${_sade} \ ${_sendmail} \ + service \ setfib \ setfmac \ setpmac \ @@ -188,6 +189,7 @@ SUBDIR= ${_ac} \ tzsetup \ ${_uathload} \ ugidfw \ + ${_uhsoctl} \ ${_usbdevs} \ ${_usbconfig} \ ${_vidcontrol} \ @@ -409,6 +411,7 @@ _crunch= crunch .if ${MACHINE_ARCH} != "ia64" _uathload= uathload .endif +_uhsoctl= uhsoctl #_usbdevs= usbdevs _usbconfig= usbconfig .endif @@ -468,6 +471,9 @@ _boot98cfg= boot98cfg .if ${MK_ACPI} != "no" _acpi= acpi .endif +.if ${MK_APM} != "no" +_apm= apm +.endif _asf= asf _boot0cfg= boot0cfg .if ${MK_TOOLCHAIN} != "no" @@ -506,6 +512,7 @@ _ofwdump= ofwdump .if ${MACHINE_ARCH} == "sparc64" _eeprom= eeprom +_mount_smbfs= mount_smbfs _ofwdump= ofwdump .endif diff --git a/usr.sbin/Makefile.inc b/usr.sbin/Makefile.inc index 4347591cf563..bd13613e1d93 100644 --- a/usr.sbin/Makefile.inc +++ b/usr.sbin/Makefile.inc @@ -2,3 +2,5 @@ # $FreeBSD$ BINDIR?= /usr/sbin + +WARNS?= 6 diff --git a/usr.sbin/ac/Makefile b/usr.sbin/ac/Makefile index c45a0d69ff42..46064fcf300b 100644 --- a/usr.sbin/ac/Makefile +++ b/usr.sbin/ac/Makefile @@ -3,8 +3,6 @@ PROG= ac MAN= ac.8 -WARNS?= 4 - # Temporary, while tracking down problem wrt 64-bit time_t's on sparc64 .if ${MACHINE_ARCH} == "sparc64" CFLAGS+=-DDEBUG diff --git a/usr.sbin/ac/ac.8 b/usr.sbin/ac/ac.8 index efe3e23c92ce..34484abc5eaf 100644 --- a/usr.sbin/ac/ac.8 +++ b/usr.sbin/ac/ac.8 @@ -45,7 +45,7 @@ .Op Ar users ... .Sh DESCRIPTION If the file -.Pa /var/log/wtmp +.Pa /var/log/utx.log exists, a record of individual login and logout times are written to it by .Xr login 1 @@ -86,7 +86,7 @@ flags may be specified. Read connect time data from .Ar wtmp instead of the default file, -.Pa /var/log/wtmp . +.Pa /var/log/utx.log . .It Ar users ... Display totals for the given individuals only. .El @@ -95,20 +95,20 @@ If no arguments are given, .Nm displays the total connect time for all accounts with login sessions recorded in -.Pa wtmp . +.Pa utx.log . .Pp The default -.Pa wtmp +.Pa utx.log file will increase without bound unless it is truncated. It is normally truncated by the daily scripts run by .Xr cron 8 , which rename and rotate the -.Pa wtmp +.Pa utx.log files, keeping a week's worth of data on hand. No login or connect time accounting is performed if -.Pa /var/log/wtmp +.Pa /var/log/utx.log does not exist. .Pp For example, @@ -122,15 +122,15 @@ allows times recorded in to be charged out at a different rate than .Pa other . .Sh FILES -.Bl -tag -width /var/log/wtmp -compact -.It Pa /var/log/wtmp +.Bl -tag -width /var/log/utx.log -compact +.It Pa /var/log/utx.log connect time accounting file .El .Sh EXIT STATUS .Ex -std .Sh SEE ALSO .Xr login 1 , -.Xr utmp 5 , +.Xr getutxent 3 , .Xr init 8 , .Xr sa 8 .\" .Sh NOTES diff --git a/usr.sbin/ac/ac.c b/usr.sbin/ac/ac.c index 031099a4b9b8..d6db2d864953 100644 --- a/usr.sbin/ac/ac.c +++ b/usr.sbin/ac/ac.c @@ -27,14 +27,14 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include /* * this is for our list of currently logged in sessions */ struct utmp_list { struct utmp_list *next; - struct utmp usr; + struct utmpx usr; }; /* @@ -42,7 +42,7 @@ struct utmp_list { */ struct user_list { struct user_list *next; - char name[UT_NAMESIZE+1]; + char name[sizeof(((struct utmpx *)0)->ut_user)]; time_t secs; }; @@ -51,7 +51,7 @@ struct user_list { */ struct tty_list { struct tty_list *next; - char name[UT_LINESIZE+3]; + char name[sizeof(((struct utmpx *)0)->ut_host) + 2]; size_t len; int ret; }; @@ -81,15 +81,14 @@ static int Debug = 0; #endif int main(int, char **); -int ac(FILE *); +int ac(const char *); struct tty_list *add_tty(char *); #ifdef DEBUG -const char *debug_pfx(const struct utmp *, const struct utmp *); +const char *debug_pfx(const struct utmpx *, const struct utmpx *); #endif int do_tty(char *); -FILE *file(const char *); -struct utmp_list *log_in(struct utmp_list *, struct utmp *); -struct utmp_list *log_out(struct utmp_list *, struct utmp *); +struct utmp_list *log_in(struct utmp_list *, struct utmpx *); +struct utmp_list *log_out(struct utmp_list *, struct utmpx *); int on_console(struct utmp_list *); void show(const char *, time_t); void show_today(struct user_list *, struct utmp_list *, @@ -98,22 +97,6 @@ void show_users(struct user_list *); struct user_list *update_user(struct user_list *, char *, time_t); void usage(void); -/* - * open wtmp or die - */ -FILE * -file(const char *name) -{ - FILE *fp; - - if ((fp = fopen(name, "r")) == NULL) - err(1, "%s", name); - /* in case we want to discriminate */ - if (strcmp(_PATH_WTMP, name)) - Flags |= AC_W; - return fp; -} - struct tty_list * add_tty(char *name) { @@ -173,8 +156,7 @@ on_console(struct utmp_list *head) struct utmp_list *up; for (up = head; up; up = up->next) { - if (strncmp(up->usr.ut_line, Console, - sizeof (up->usr.ut_line)) == 0) + if (strcmp(up->usr.ut_line, Console) == 0) return 1; } return 0; @@ -190,7 +172,7 @@ update_user(struct user_list *head, char *name, time_t secs) struct user_list *up; for (up = head; up != NULL; up = up->next) { - if (strncmp(up->name, name, UT_NAMESIZE) == 0) { + if (strcmp(up->name, name) == 0) { up->secs += secs; Total += secs; return head; @@ -217,9 +199,10 @@ update_user(struct user_list *head, char *name, time_t secs) * includes a timestamp (perhaps with year), device-name, and user-name. */ const char * -debug_pfx(const struct utmp *event_up, const struct utmp *userinf_up) +debug_pfx(const struct utmpx *event_up, const struct utmpx *userinf_up) { - static char str_result[40+UT_LINESIZE+UT_NAMESIZE]; + static char str_result[40 + sizeof(userinf_up->ut_line) + + sizeof(userinf_up->ut_user)]; static char thisyear[5]; size_t maxcopy; time_t ut_timecopy; @@ -231,15 +214,10 @@ debug_pfx(const struct utmp *event_up, const struct utmp *userinf_up) strlcpy(thisyear, &str_result[20], sizeof(thisyear)); } - if (event_up->ut_time == 0) + if (event_up->ut_tv.tv_sec == 0) strlcpy(str_result, "*ZeroTime* --:--:-- ", sizeof(str_result)); else { - /* - * The type of utmp.ut_time is not necessary type time_t, as - * it is explicitly defined as type int32_t. Copy the value - * for platforms where sizeof(time_t) != sizeof(int32_t). - */ - ut_timecopy = _time32_to_time(event_up->ut_time); + ut_timecopy = event_up->ut_tv.tv_sec; strlcpy(str_result, ctime(&ut_timecopy), sizeof(str_result)); /* * Include the year, if it is not the same year as "now". @@ -255,22 +233,20 @@ debug_pfx(const struct utmp *event_up, const struct utmp *userinf_up) if (userinf_up->ut_line[0] == '\0') strlcat(str_result, "NoDev", sizeof(str_result)); else { - /* ut_line is not necessarily null-terminated. */ - maxcopy = strlen(str_result) + UT_LINESIZE + 1; + maxcopy = strlen(str_result) + sizeof(userinf_up->ut_line); if (maxcopy > sizeof(str_result)) maxcopy = sizeof(str_result); strlcat(str_result, userinf_up->ut_line, maxcopy); } strlcat(str_result, ": ", sizeof(str_result)); - if (userinf_up->ut_name[0] == '\0') + if (userinf_up->ut_user[0] == '\0') strlcat(str_result, "LogOff", sizeof(str_result)); else { - /* ut_name is not necessarily null-terminated. */ - maxcopy = strlen(str_result) + UT_NAMESIZE + 1; + maxcopy = strlen(str_result) + sizeof(userinf_up->ut_user); if (maxcopy > sizeof(str_result)) maxcopy = sizeof(str_result); - strlcat(str_result, userinf_up->ut_name, maxcopy); + strlcat(str_result, userinf_up->ut_user, maxcopy); } return (str_result); @@ -280,12 +256,11 @@ debug_pfx(const struct utmp *event_up, const struct utmp *userinf_up) int main(int argc, char *argv[]) { - FILE *fp; + const char *wtmpf = NULL; int c; (void) setlocale(LC_TIME, ""); - fp = NULL; while ((c = getopt(argc, argv, "Dc:dpt:w:")) != -1) { switch (c) { #ifdef DEBUG @@ -310,7 +285,8 @@ main(int argc, char *argv[]) add_tty(optarg); break; case 'w': - fp = file(optarg); + Flags |= AC_W; + wtmpf = optarg; break; case '?': default: @@ -329,16 +305,7 @@ main(int argc, char *argv[]) } if (Flags & AC_D) Flags &= ~AC_P; - if (fp == NULL) { - /* - * if _PATH_WTMP does not exist, exit quietly - */ - if (access(_PATH_WTMP, 0) != 0 && errno == ENOENT) - return 0; - - fp = file(_PATH_WTMP); - } - ac(fp); + ac(wtmpf); return 0; } @@ -349,7 +316,8 @@ main(int argc, char *argv[]) void show(const char *name, time_t secs) { - (void)printf("\t%-*s %8.2f\n", UT_NAMESIZE, name, + (void)printf("\t%-*s %8.2f\n", + (int)sizeof(((struct utmpx *)0)->ut_user), name, ((double)secs / 3600)); } @@ -384,9 +352,9 @@ show_today(struct user_list *users, struct utmp_list *logins, time_t secs) yesterday++; for (lp = logins; lp != NULL; lp = lp->next) { - secs = yesterday - lp->usr.ut_time; - Users = update_user(Users, lp->usr.ut_name, secs); - lp->usr.ut_time = yesterday; /* as if they just logged in */ + secs = yesterday - lp->usr.ut_tv.tv_sec; + Users = update_user(Users, lp->usr.ut_user, secs); + lp->usr.ut_tv.tv_sec = yesterday; /* as if they just logged in */ } secs = 0; for (up = users; up != NULL; up = up->next) { @@ -403,16 +371,17 @@ show_today(struct user_list *users, struct utmp_list *logins, time_t secs) * been shut down. */ struct utmp_list * -log_out(struct utmp_list *head, struct utmp *up) +log_out(struct utmp_list *head, struct utmpx *up) { struct utmp_list *lp, *lp2, *tlp; time_t secs; for (lp = head, lp2 = NULL; lp != NULL; ) - if (*up->ut_line == '~' || strncmp(lp->usr.ut_line, up->ut_line, - sizeof (up->ut_line)) == 0) { - secs = up->ut_time - lp->usr.ut_time; - Users = update_user(Users, lp->usr.ut_name, secs); + if (up->ut_type == BOOT_TIME || up->ut_type == SHUTDOWN_TIME || + (up->ut_type == DEAD_PROCESS && + memcmp(lp->usr.ut_id, up->ut_id, sizeof up->ut_id) == 0)) { + secs = up->ut_tv.tv_sec - lp->usr.ut_tv.tv_sec; + Users = update_user(Users, lp->usr.ut_user, secs); #ifdef DEBUG if (Debug) printf("%s logged out (%2d:%02d:%02d)\n", @@ -442,7 +411,7 @@ log_out(struct utmp_list *head, struct utmp *up) * if do_tty says ok, login a user */ struct utmp_list * -log_in(struct utmp_list *head, struct utmp *up) +log_in(struct utmp_list *head, struct utmpx *up) { struct utmp_list *lp; @@ -491,7 +460,7 @@ log_in(struct utmp_list *head, struct utmp *up) errx(1, "malloc failed"); lp->next = head; head = lp; - memmove((char *)&lp->usr, (char *)up, sizeof (struct utmp)); + memmove(&lp->usr, up, sizeof *up); #ifdef DEBUG if (Debug) { printf("%s logged in", debug_pfx(&lp->usr, up)); @@ -505,10 +474,10 @@ log_in(struct utmp_list *head, struct utmp *up) } int -ac(FILE *fp) +ac(const char *file) { struct utmp_list *lp, *head = NULL; - struct utmp usr; + struct utmpx *usr, usht; struct tm *ltm; time_t prev_secs, secs, ut_timecopy; int day, rfound, tchanged, tskipped; @@ -517,14 +486,11 @@ ac(FILE *fp) prev_secs = 1; /* Minimum acceptable date == 1970 */ rfound = tchanged = tskipped = 0; secs = 0; - while (fread((char *)&usr, sizeof(usr), 1, fp) == 1) { + if (setutxdb(UTXDB_LOG, file) != 0) + err(1, "%s", file); + while ((usr = getutxent()) != NULL) { rfound++; - /* - * The type of utmp.ut_time is not necessary type time_t, as - * it is explicitly defined as type int32_t. Copy the value - * for platforms where sizeof(time_t) != size(int32_t). - */ - ut_timecopy = _time32_to_time(usr.ut_time); + ut_timecopy = usr->ut_tv.tv_sec; /* * With sparc64 using 64-bit time_t's, there is some system * routine which sets ut_time==0 (the high-order word of a @@ -540,10 +506,10 @@ ac(FILE *fp) #ifdef DEBUG if (Debug) printf("%s - date changed to: %s", - debug_pfx(&usr, &usr), ctime(&prev_secs)); + debug_pfx(usr, usr), ctime(&prev_secs)); #endif tchanged++; - usr.ut_time = ut_timecopy = prev_secs; + usr->ut_tv.tv_sec = ut_timecopy = prev_secs; } /* * Skip records where the time goes backwards. @@ -552,7 +518,7 @@ ac(FILE *fp) #ifdef DEBUG if (Debug) printf("%s - bad date, record skipped\n", - debug_pfx(&usr, &usr)); + debug_pfx(usr, usr)); #endif tskipped++; continue; /* Skip this invalid record. */ @@ -576,50 +542,51 @@ ac(FILE *fp) } else day = ltm->tm_yday; } - switch(*usr.ut_line) { - case '|': + switch(usr->ut_type) { + case OLD_TIME: secs = ut_timecopy; break; - case '{': + case NEW_TIME: secs -= ut_timecopy; /* * adjust time for those logged in */ for (lp = head; lp != NULL; lp = lp->next) - lp->usr.ut_time -= secs; + lp->usr.ut_tv.tv_sec -= secs; break; - case '~': /* reboot or shutdown */ - head = log_out(head, &usr); + case BOOT_TIME: + case SHUTDOWN_TIME: + head = log_out(head, usr); FirstTime = ut_timecopy; /* shouldn't be needed */ break; - default: + case USER_PROCESS: /* * if they came in on tty[p-sP-S]*, then it is only * a login session if the ut_host field is non-empty */ - if (*usr.ut_name) { - if (strncmp(usr.ut_line, "tty", 3) == 0 || - strchr("pqrsPQRS", usr.ut_line[3]) != 0 || - *usr.ut_host != '\0') - head = log_in(head, &usr); + if (strncmp(usr->ut_line, "tty", 3) != 0 || + strchr("pqrsPQRS", usr->ut_line[3]) == NULL || + *usr->ut_host != '\0') + head = log_in(head, usr); #ifdef DEBUG - else if (Debug > 1) - /* Things such as 'screen' sessions. */ - printf("%s - record ignored\n", - debug_pfx(&usr, &usr)); + else if (Debug > 1) + /* Things such as 'screen' sessions. */ + printf("%s - record ignored\n", + debug_pfx(usr, usr)); #endif - } else - head = log_out(head, &usr); + break; + case DEAD_PROCESS: + head = log_out(head, usr); break; } } - (void)fclose(fp); + endutxent(); if (!(Flags & AC_W)) - usr.ut_time = time((time_t *)0); - (void)strcpy(usr.ut_line, "~"); + usht.ut_tv.tv_sec = time(NULL); + usht.ut_type = SHUTDOWN_TIME; if (Flags & AC_D) { - ut_timecopy = _time32_to_time(usr.ut_time); + ut_timecopy = usht.ut_tv.tv_sec; ltm = localtime(&ut_timecopy); if (day >= 0 && day != ltm->tm_yday) { /* @@ -635,7 +602,7 @@ ac(FILE *fp) /* * anyone still logged in gets time up to now */ - head = log_out(head, &usr); + head = log_out(head, &usht); if (Flags & AC_D) show_today(Users, head, time((time_t *)0)); diff --git a/usr.sbin/accton/Makefile b/usr.sbin/accton/Makefile index 7ea45a7df929..ea9b4f43565a 100644 --- a/usr.sbin/accton/Makefile +++ b/usr.sbin/accton/Makefile @@ -4,6 +4,4 @@ PROG= accton MAN= accton.8 -WARNS?= 4 - .include diff --git a/usr.sbin/accton/accton.c b/usr.sbin/accton/accton.c index c1bb8b6b72c5..33e66042e898 100644 --- a/usr.sbin/accton/accton.c +++ b/usr.sbin/accton/accton.c @@ -80,7 +80,7 @@ main(int argc, char *argv[]) } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: accton [file]\n"); exit(1); diff --git a/usr.sbin/acpi/acpiconf/Makefile b/usr.sbin/acpi/acpiconf/Makefile index bb0df4b406e5..5f862a2c621e 100644 --- a/usr.sbin/acpi/acpiconf/Makefile +++ b/usr.sbin/acpi/acpiconf/Makefile @@ -3,6 +3,5 @@ PROG= acpiconf MAN= acpiconf.8 -WARNS?= 6 .include diff --git a/usr.sbin/acpi/acpidb/Makefile b/usr.sbin/acpi/acpidb/Makefile index 8ad8239741aa..5981f38d3dbd 100644 --- a/usr.sbin/acpi/acpidb/Makefile +++ b/usr.sbin/acpi/acpidb/Makefile @@ -38,8 +38,8 @@ SRCS+= psargs.c psloop.c psopcode.c psparse.c psscope.c \ # namespace SRCS+= nsaccess.c nsalloc.c nsdump.c nseval.c nsinit.c \ nsload.c nsnames.c nsobject.c nsparse.c nspredef.c \ - nsrepair.c nssearch.c nsutils.c nswalk.c nsxfeval.c \ - nsxfname.c nsxfobj.c + nsrepair.c nsrepair2.c nssearch.c nsutils.c nswalk.c \ + nsxfeval.c nsxfname.c nsxfobj.c # resources SRCS+= rsaddr.c rscalc.c rscreate.c rsdump.c rsinfo.c \ diff --git a/usr.sbin/acpi/acpidb/acpidb.c b/usr.sbin/acpi/acpidb/acpidb.c index 53d9db1145f4..325dfae12a2c 100644 --- a/usr.sbin/acpi/acpidb/acpidb.c +++ b/usr.sbin/acpi/acpidb/acpidb.c @@ -81,7 +81,7 @@ static int aml_simulate_regcontent_read(int regtype, static int aml_simulate_regcontent_write(int regtype, ACPI_PHYSICAL_ADDRESS addr, UINT8 *valuep); -static ACPI_INTEGER aml_simulate_prompt(char *msg, ACPI_INTEGER def_val); +static UINT64 aml_simulate_prompt(char *msg, UINT64 def_val); static void aml_simulation_regload(const char *dumpfile); static void aml_simulation_regdump(const char *dumpfile); @@ -161,11 +161,11 @@ aml_simulate_regcontent_write(int regtype, ACPI_PHYSICAL_ADDRESS addr, UINT8 *va return (aml_simulate_regcontent_add(regtype, addr, *valuep)); } -static ACPI_INTEGER -aml_simulate_prompt(char *msg, ACPI_INTEGER def_val) +static UINT64 +aml_simulate_prompt(char *msg, UINT64 def_val) { char buf[16], *ep; - ACPI_INTEGER val; + UINT64 val; val = def_val; printf("DEBUG"); @@ -271,12 +271,12 @@ aml_vm_space_handler( UINT32 Function, ACPI_PHYSICAL_ADDRESS Address, UINT32 BitWidth, - ACPI_INTEGER *Value, + UINT64 *Value, int Prompt) { int state; UINT8 val; - ACPI_INTEGER value, i; + UINT64 value, i; char msg[256]; static const char *space_names[] = { "SYSTEM_MEMORY", "SYSTEM_IO", "PCI_CONFIG", @@ -336,7 +336,7 @@ aml_vm_space_handler_##name ( \ UINT32 Function, \ ACPI_PHYSICAL_ADDRESS Address, \ UINT32 BitWidth, \ - ACPI_INTEGER *Value) \ + UINT64 *Value) \ { \ return (aml_vm_space_handler(id, Function, Address, \ BitWidth, Value, aml_debug_prompt)); \ diff --git a/usr.sbin/acpi/acpidump/Makefile b/usr.sbin/acpi/acpidump/Makefile index 21a4140defcc..e00450091222 100644 --- a/usr.sbin/acpi/acpidump/Makefile +++ b/usr.sbin/acpi/acpidump/Makefile @@ -3,6 +3,5 @@ PROG= acpidump MAN= acpidump.8 SRCS= acpi.c acpi_user.c acpidump.c -WARNS?= 6 .include diff --git a/usr.sbin/acpi/iasl/Makefile b/usr.sbin/acpi/iasl/Makefile index 551bfc6311fb..130c39e951ae 100644 --- a/usr.sbin/acpi/iasl/Makefile +++ b/usr.sbin/acpi/iasl/Makefile @@ -5,7 +5,8 @@ SRCS= adfile.c adisasm.c adwalk.c SRCS+= osunixxf.c # common -SRCS+= dmrestag.c dmtable.c dmtbdump.c dmtbinfo.c getopt.c +SRCS+= dmextern.c dmrestag.c dmtable.c dmtbdump.c dmtbinfo.c \ + getopt.c # compiler SRCS+= aslanalyze.c aslcodegen.c aslcompile.c aslcompiler.y.h \ @@ -49,6 +50,8 @@ SRCS+= utalloc.c utcache.c utcopy.c utdebug.c utdelete.c \ utglobal.c utinit.c utlock.c utmath.c utmisc.c \ utmutex.c utobject.c utresrc.c utstate.c utxface.c +WARNS?= 2 + MAN= iasl.8 CFLAGS+= -DACPI_ASL_COMPILER -I. diff --git a/usr.sbin/adduser/adduser.sh b/usr.sbin/adduser/adduser.sh index 3d1d6f85cebc..8e05f33c545d 100644 --- a/usr.sbin/adduser/adduser.sh +++ b/usr.sbin/adduser/adduser.sh @@ -28,20 +28,20 @@ # # err msg -# Display $msg on stderr, unless we're being quiet. -# +# Display $msg on stderr, unless we're being quiet. +# err() { if [ -z "$quietflag" ]; then - echo 1>&2 ${THISCMD}: ERROR: $* + echo 1>&2 ${THISCMD}: ERROR: $* fi } # info msg -# Display $msg on stdout, unless we're being quiet. -# +# Display $msg on stdout, unless we're being quiet. +# info() { if [ -z "$quietflag" ]; then - echo ${THISCMD}: INFO: $* + echo ${THISCMD}: INFO: $* fi } @@ -50,7 +50,7 @@ info() { # is not, output the value of the next higher uid that is available. # If a uid is not specified, output the first available uid, as indicated # by pw(8). -# +# get_nextuid () { _uid=$1 _nextuid= @@ -163,8 +163,7 @@ fullpath_from_shell() { # the path is invalid or it is not executable it # will emit an informational message saying so. # -shell_exists() -{ +shell_exists() { _sh="$1" _shellchk="${GREPCMD} '^$_sh$' ${ETCSHELLS} > /dev/null 2>&1" @@ -647,7 +646,6 @@ input_from_file() { # the user database. # input_interactive() { - _disable= _pass= _passconfirm= @@ -887,7 +885,7 @@ defaultshell="${DEFAULTSHELL}" defaultHomePerm= # Make sure the user running this program is root. This isn't a security -# measure as much as it is a usefull method of reminding the user to +# measure as much as it is a useful method of reminding the user to # 'su -' before he/she wastes time entering data that won't be saved. # procowner=${procowner:-`/usr/bin/id -u`} diff --git a/usr.sbin/amd/Makefile.inc b/usr.sbin/amd/Makefile.inc index c8451f6b1fc5..673edc1b9152 100644 --- a/usr.sbin/amd/Makefile.inc +++ b/usr.sbin/amd/Makefile.inc @@ -40,6 +40,8 @@ RPCCOM= rpcgen MOUNT_X= ${DESTDIR}/usr/include/rpcsvc/mount.x NFS_PROT_X= ${DESTDIR}/usr/include/rpcsvc/nfs_prot.x +WARNS?= 1 + .if exists(${.CURDIR}/../../Makefile.inc) .include "${.CURDIR}/../../Makefile.inc" .endif diff --git a/usr.sbin/ancontrol/ancontrol.c b/usr.sbin/ancontrol/ancontrol.c index 08d13d312058..008970d9b08e 100644 --- a/usr.sbin/ancontrol/ancontrol.c +++ b/usr.sbin/ancontrol/ancontrol.c @@ -1327,8 +1327,8 @@ an_setkeys(const char *iface, const char *key, int keytype) } } -static void an_readkeyinfo(iface) - const char *iface; +static void +an_readkeyinfo(const char *iface) { struct an_req areq; struct an_ltv_genconfig *cfg; diff --git a/usr.sbin/apm/Makefile b/usr.sbin/apm/Makefile index 043c3c763aed..08ed25fce66a 100644 --- a/usr.sbin/apm/Makefile +++ b/usr.sbin/apm/Makefile @@ -3,7 +3,6 @@ PROG= apm MAN= apm.8 MLINKS= apm.8 apmconf.8 -MANSUBDIR= /i386 -WARNS?= 6 +MANSUBDIR= /${MACHINE_ARCH} .include diff --git a/usr.sbin/apm/apm.8 b/usr.sbin/apm/apm.8 index 1e36f639f509..3e039b08b1b8 100644 --- a/usr.sbin/apm/apm.8 +++ b/usr.sbin/apm/apm.8 @@ -7,15 +7,15 @@ .\" these terms are retained. Under no circumstances is the author .\" responsible for the proper functioning of this software, nor does .\" the author assume any responsibility for damages incurred with its +.\" use. .\" .\" $FreeBSD$ .\" -.\" use. -.Dd November 1, 1994 +.Dd December 22, 2009 .Dt APM 8 i386 .Os .Sh NAME -.Nm apm , zzz +.Nm apm .Nd control the APM BIOS and display its information .Sh SYNOPSIS .Nm @@ -24,27 +24,14 @@ .Op Fl e Ar enable .Op Fl h Ar enable .Op Fl r Ar delta -.Pp -.Nm zzz .Sh DESCRIPTION The .Nm utility controls the Intel / Microsoft APM (Advanced Power Management) BIOS and displays the current status of APM on laptop PCs. -The -.Nm zzz -utility suspends the system by controlling APM. .Pp -The following options are available for -.Nm -(no options are available for -.Nm zzz ) . -If no options are specified, -.Nm -displays information and current status of APM in verbose mode. -If multiple display options are given, the values are displayed one -per line in the order given here. +The options are as follows: .Bl -tag -width indent .It Fl a Display the current AC-line status as an integer value. @@ -126,9 +113,15 @@ output of tells what your laptop claims to support. .It Fl z Suspend the system. -It is equivalent to -.Nm zzz . +It is used by +.Xr zzz 8 . .El +.Pp +If no options are specified, +.Nm +displays information and current status of APM in verbose mode. +If multiple display options are given, the values are displayed one +per line in the order given here. .Sh NOTES .Xr apmconf 8 has been merged in @@ -137,7 +130,8 @@ and thus .Nm replaces all of its functionality. .Sh SEE ALSO -.Xr apm 4 +.Xr apm 4 , +.Xr zzz 8 .Sh AUTHORS .An Tatsumi Hosokawa Aq hosokawa@jp.FreeBSD.org .Sh BUGS diff --git a/usr.sbin/apm/apm.c b/usr.sbin/apm/apm.c index 56432a4ab7a2..a60f8213a766 100644 --- a/usr.sbin/apm/apm.c +++ b/usr.sbin/apm/apm.c @@ -1,5 +1,5 @@ /* - * apm / zzz APM BIOS utility for FreeBSD + * APM BIOS utility for FreeBSD * * Copyright (C) 1994-1996 by Tatsumi Hosokawa * @@ -43,10 +43,9 @@ int cmos_wall = 0; /* True when wall time is in cmos clock, else UTC */ static void usage(void) { - fprintf(stderr, "%s\n%s\n", + fprintf(stderr, "usage: apm [-ablstzZ] [-d enable ] [ -e enable ] " - "[ -h enable ] [-r delta]", - " zzz"); + "[ -h enable ] [-r delta]\n"); exit(1); } @@ -397,11 +396,6 @@ main(int argc, char *argv[]) else cmdname = argv[0]; - if (strcmp(cmdname, "zzz") == 0) { - dosleep = 1; - all_info = 0; - goto finish_option; - } while ((c = getopt(argc, argv, "abe:h:lRr:stzd:Z")) != -1) { switch (c) { case 'a': @@ -457,7 +451,6 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; } -finish_option: if (haltcpu != -1 || enable != -1 || display != -1 || delta || dosleep || standby) { fd = open(APMDEV, O_RDWR); diff --git a/usr.sbin/apmd/Makefile b/usr.sbin/apmd/Makefile index 7e81b35dbc77..5ccf7e63e5ee 100644 --- a/usr.sbin/apmd/Makefile +++ b/usr.sbin/apmd/Makefile @@ -5,6 +5,8 @@ MAN= apmd.8 MANSUBDIR= /i386 SRCS= apmd.c apmdlex.l apmdparse.y y.tab.h +WARNS?= 0 + DPADD= ${LIBL} LDADD= -ll diff --git a/usr.sbin/arp/arp.c b/usr.sbin/arp/arp.c index 8a3410fd8f82..a0e228ce3656 100644 --- a/usr.sbin/arp/arp.c +++ b/usr.sbin/arp/arp.c @@ -101,7 +101,8 @@ static int valid_type(int type); static int nflag; /* no reverse dns lookups */ static char *rifname; -static int expire_time, flags, doing_proxy, proxy_only; +static time_t expire_time; +static int flags, doing_proxy, proxy_only; /* which function we're supposed to do */ #define F_GET 1 @@ -326,7 +327,6 @@ set(int argc, char **argv) doing_proxy = 1; if (argc && strncmp(argv[1], "only", 3) == 0) { proxy_only = 1; - dst->sin_other = SIN_PROXY; argc--; argv++; } } else if (strncmp(argv[0], "blackhole", 9) == 0) { @@ -365,33 +365,30 @@ set(int argc, char **argv) sdl_m.sdl_alen = ETHER_ADDR_LEN; } } - for (;;) { /* try at most twice */ - rtm = rtmsg(RTM_GET, dst, &sdl_m); - if (rtm == NULL) { - warn("%s", host); - return (1); - } - addr = (struct sockaddr_inarp *)(rtm + 1); - sdl = (struct sockaddr_dl *)(SA_SIZE(addr) + (char *)addr); - if (addr->sin_addr.s_addr != dst->sin_addr.s_addr) - break; - if (sdl->sdl_family == AF_LINK && - !(rtm->rtm_flags & RTF_GATEWAY) && - valid_type(sdl->sdl_type) ) - break; - if (doing_proxy == 0) { - printf("set: can only proxy for %s\n", host); - return (1); - } - if (dst->sin_other & SIN_PROXY) { - printf("set: proxy entry exists for non 802 device\n"); - return (1); - } - dst->sin_other = SIN_PROXY; - proxy_only = 1; + + /* + * In the case a proxy-arp entry is being added for + * a remote end point, the RTF_ANNOUNCE flag in the + * RTM_GET command is an indication to the kernel + * routing code that the interface associated with + * the prefix route covering the local end of the + * PPP link should be returned, on which ARP applies. + */ + rtm = rtmsg(RTM_GET, dst, &sdl_m); + if (rtm == NULL) { + warn("%s", host); + return (1); + } + addr = (struct sockaddr_inarp *)(rtm + 1); + sdl = (struct sockaddr_dl *)(SA_SIZE(addr) + (char *)addr); + if (addr->sin_addr.s_addr == dst->sin_addr.s_addr) { + printf("set: proxy entry exists for non 802 device\n"); + return (1); } - if (sdl->sdl_family != AF_LINK) { + if ((sdl->sdl_family != AF_LINK) || + (rtm->rtm_flags & RTF_GATEWAY) || + !valid_type(sdl->sdl_type)) { printf("cannot intuit interface index and type for %s\n", host); return (1); } @@ -436,7 +433,11 @@ delete(char *host, int do_proxy) dst = getaddr(host); if (dst == NULL) return (1); - dst->sin_other = do_proxy; + + /* + * Perform a regular entry delete first. + */ + flags &= ~RTF_ANNOUNCE; /* * setup the data structure to notify the kernel @@ -471,11 +472,16 @@ delete(char *host, int do_proxy) break; } - if (dst->sin_other & SIN_PROXY) { + /* + * Regualar entry delete failed, now check if there + * is a proxy-arp entry to remove. + */ + if (flags & RTF_ANNOUNCE) { fprintf(stderr, "delete: cannot locate %s\n",host); return (1); } - dst->sin_other = SIN_PROXY; + + flags |= RTF_ANNOUNCE; } rtm->rtm_flags |= RTF_LLDATA; if (rtmsg(RTM_DELETE, dst, NULL) != NULL) { @@ -485,6 +491,7 @@ delete(char *host, int do_proxy) return (1); } + /* * Search the arp table and do some action on matching entries */ @@ -493,7 +500,7 @@ search(u_long addr, action_fn *action) { int mib[6]; size_t needed; - char *lim, *buf, *newbuf, *next; + char *lim, *buf, *next; struct rt_msghdr *rtm; struct sockaddr_inarp *sin2; struct sockaddr_dl *sdl; @@ -516,13 +523,9 @@ search(u_long addr, action_fn *action) return 0; buf = NULL; for (;;) { - newbuf = realloc(buf, needed); - if (newbuf == NULL) { - if (buf != NULL) - free(buf); + buf = reallocf(buf, needed); + if (buf == NULL) errx(1, "could not reallocate memory"); - } - buf = newbuf; st = sysctl(mib, 6, buf, &needed, NULL, 0); if (st == 0 || errno != ENOMEM) break; @@ -592,6 +595,15 @@ print_entry(struct sockaddr_dl *sdl, printf(" on %s", ifname); if (rtm->rtm_rmx.rmx_expire == 0) printf(" permanent"); + else { + static struct timeval tv; + if (tv.tv_sec == 0) + gettimeofday(&tv, 0); + if ((expire_time = rtm->rtm_rmx.rmx_expire - tv.tv_sec) > 0) + printf(" expires in %d seconds", (int)expire_time); + else + printf(" expired"); + } if (addr->sin_other & SIN_PROXY) printf(" published (proxy only)"); if (rtm->rtm_flags & RTF_ANNOUNCE) diff --git a/usr.sbin/asf/Makefile b/usr.sbin/asf/Makefile index b4b7af350138..0db69e82cc6d 100644 --- a/usr.sbin/asf/Makefile +++ b/usr.sbin/asf/Makefile @@ -7,6 +7,4 @@ MAN= asf.8 DPADD= ${LIBKVM} LDADD= -lkvm -WARNS?= 4 - .include diff --git a/usr.sbin/asf/asf_kld.c b/usr.sbin/asf/asf_kld.c index 1d6a2b7d51e6..f0bd699580d8 100644 --- a/usr.sbin/asf/asf_kld.c +++ b/usr.sbin/asf/asf_kld.c @@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$"); * Works with a live kernel only. */ void -asf_kld() +asf_kld(void) { struct kld_file_stat kfs; int fid = 0; /* indicates the beginning of the linker file list */ diff --git a/usr.sbin/audit/Makefile b/usr.sbin/audit/Makefile index 9f31741500ac..a3f7fbf241fd 100644 --- a/usr.sbin/audit/Makefile +++ b/usr.sbin/audit/Makefile @@ -13,4 +13,6 @@ MAN= audit.8 DPADD= ${LIBBSM} LDADD= -lbsm +WARNS?= 5 + .include diff --git a/usr.sbin/auditd/Makefile b/usr.sbin/auditd/Makefile index 839458d98b4f..47ffd0b915d0 100644 --- a/usr.sbin/auditd/Makefile +++ b/usr.sbin/auditd/Makefile @@ -11,7 +11,9 @@ PROG= auditd SRCS= auditd.c audit_warn.c auditd_fbsd.c MAN= auditd.8 -DPADD= ${LIBBSM} ${LIBAUDITD} -LDADD= -lbsm -lauditd +DPADD= ${LIBAUDITD} ${LIBBSM} +LDADD= -lauditd -lbsm + +WARNS?= 3 .include diff --git a/usr.sbin/auditreduce/Makefile b/usr.sbin/auditreduce/Makefile index 73b355de4e12..7dc955337da1 100644 --- a/usr.sbin/auditreduce/Makefile +++ b/usr.sbin/auditreduce/Makefile @@ -13,4 +13,6 @@ MAN= auditreduce.1 DPADD= ${LIBBSM} LDADD= -lbsm +WARNS?= 3 + .include diff --git a/usr.sbin/authpf/Makefile b/usr.sbin/authpf/Makefile index b4c9b4f36217..0a24b8efc087 100644 --- a/usr.sbin/authpf/Makefile +++ b/usr.sbin/authpf/Makefile @@ -19,4 +19,6 @@ CFLAGS+= -DENABLE_ALTQ LDADD+= -lm -lmd -lutil DPADD+= ${LIBM} ${LIBMD} ${LIBUTIL} +WARNS?= 3 + .include diff --git a/usr.sbin/boot0cfg/Makefile b/usr.sbin/boot0cfg/Makefile index dc02cad7b41d..9b46701ecf69 100644 --- a/usr.sbin/boot0cfg/Makefile +++ b/usr.sbin/boot0cfg/Makefile @@ -3,9 +3,7 @@ PROG= boot0cfg MAN= boot0cfg.8 -WARNS?= 2 - -DPADD= ${LIBGEOM} -LDADD= -lgeom +DPADD= ${LIBGEOM} ${LIBBSDXML} ${LIBSBUF} +LDADD= -lgeom -lbsdxml -lsbuf .include diff --git a/usr.sbin/bootparamd/Makefile.inc b/usr.sbin/bootparamd/Makefile.inc index 1e4d46f113a5..5c01215dd550 100644 --- a/usr.sbin/bootparamd/Makefile.inc +++ b/usr.sbin/bootparamd/Makefile.inc @@ -2,3 +2,5 @@ # $FreeBSD$ BINDIR?= /usr/sbin + +WARNS?= 2 diff --git a/usr.sbin/bootparamd/bootparamd/bootparamd.c b/usr.sbin/bootparamd/bootparamd/bootparamd.c index c6387304cd61..5c1d264a1650 100644 --- a/usr.sbin/bootparamd/bootparamd/bootparamd.c +++ b/usr.sbin/bootparamd/bootparamd/bootparamd.c @@ -191,9 +191,9 @@ int blen; { FILE *bpf; char *where; +#ifdef YP static char *result; int resultlen; -#ifdef YP static char *yp_domain; #endif @@ -294,9 +294,9 @@ int len; int ch, pch; FILE *bpf; int res = 0; +#ifdef YP static char *result; int resultlen; -#ifdef YP static char *yp_domain; #endif diff --git a/usr.sbin/bsnmpd/bsnmpd/Makefile b/usr.sbin/bsnmpd/bsnmpd/Makefile index 9fbf3667920f..e74f675b4abc 100644 --- a/usr.sbin/bsnmpd/bsnmpd/Makefile +++ b/usr.sbin/bsnmpd/bsnmpd/Makefile @@ -14,7 +14,6 @@ XSYM= snmpMIB begemotSnmpdModuleTable begemotSnmpd begemotTrapSinkTable \ freeBSDVersion CLEANFILES= oid.h tree.c tree.h MAN= bsnmpd.1 snmpmod.3 -WARNS?= 6 NO_WERROR= FILESGROUPS= BMIBS DEFS diff --git a/usr.sbin/bsnmpd/gensnmptree/Makefile b/usr.sbin/bsnmpd/gensnmptree/Makefile index 11c6a3b28f18..a92f4eb3684e 100644 --- a/usr.sbin/bsnmpd/gensnmptree/Makefile +++ b/usr.sbin/bsnmpd/gensnmptree/Makefile @@ -10,4 +10,6 @@ CFLAGS+= -I${CONTRIB}/lib CFLAGS+= -DQUADFMT='"llu"' -DQUADXFMT='"llx"' -DHAVE_STDINT_H CFLAGS+= -DHAVE_INTTYPES_H +WARNS?= 5 + .include diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c index 7e8143649167..cb3814599d36 100644 --- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c +++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c @@ -352,11 +352,11 @@ device_get_status(struct devinfo_dev *dev) assert(dev != NULL); switch (dev->dd_state) { - case DIS_ALIVE: /* probe succeeded */ - case DIS_NOTPRESENT: /* not probed or probe failed */ + case DS_ALIVE: /* probe succeeded */ + case DS_NOTPRESENT: /* not probed or probe failed */ return (DS_DOWN); - case DIS_ATTACHED: /* attach method called */ - case DIS_BUSY: /* device is open */ + case DS_ATTACHED: /* attach method called */ + case DS_BUSY: /* device is open */ return (DS_RUNNING); default: return (DS_UNKNOWN); diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_scalars.c b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_scalars.c index 945a9bde55a7..f86334ecfc70 100644 --- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_scalars.c +++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_scalars.c @@ -41,15 +41,12 @@ #include #include #include -#include +#include #include "hostres_snmp.h" #include "hostres_oid.h" #include "hostres_tree.h" -/* file pointer to keep an open instance of utmp */ -static FILE *utmp_fp; - /* boot timestamp in centi-seconds */ static uint64_t kernel_boot; @@ -70,9 +67,6 @@ fini_scalars(void) { free(boot_line); - - if (utmp_fp != NULL) - (void)fclose(utmp_fp); } /** @@ -220,30 +214,15 @@ OS_getSystemInitialLoadParameters(u_char **params) static int OS_getSystemNumUsers(uint32_t *nu) { - struct utmp utmp; - static int first_time = 1; - - if (utmp_fp == NULL) { - if (!first_time) - return (SNMP_ERR_GENERR); - first_time = 0; - if ((utmp_fp = fopen(_PATH_UTMP, "r")) == NULL) { - syslog(LOG_ERR, "fopen(%s) failed: %m", _PATH_UTMP); - return (SNMP_ERR_GENERR); - } - } - - /* start with the begining of the utmp file */ - (void)rewind(utmp_fp); + struct utmpx *utmp; + setutxent(); *nu = 0; - while (fread(&utmp, sizeof(utmp), 1, utmp_fp) == 1) { - if (utmp.ut_name[0] != '\0' && utmp.ut_line[0] != '\0') { - if (getpwnam(utmp.ut_name) == NULL) - continue; + while ((utmp = getutxent()) != NULL) { + if (utmp->ut_type == USER_PROCESS) (*nu)++; - } } + endutxent(); return (SNMP_ERR_NOERROR); } diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c index 47112da77708..c2a06db56e58 100644 --- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c +++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.c @@ -49,7 +49,6 @@ #include #include #include -#include #include "hostres_snmp.h" #include "hostres_oid.h" diff --git a/usr.sbin/bsnmpd/modules/snmp_pf/Makefile b/usr.sbin/bsnmpd/modules/snmp_pf/Makefile index 74724644cf49..92b0a4ba9125 100644 --- a/usr.sbin/bsnmpd/modules/snmp_pf/Makefile +++ b/usr.sbin/bsnmpd/modules/snmp_pf/Makefile @@ -4,7 +4,6 @@ MOD= pf SRCS= pf_snmp.c -WARNS?= 6 XSYM= begemotPf DEFS= ${MOD}_tree.def diff --git a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c index 919e5d48cbd1..4e554c00866e 100644 --- a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c +++ b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c @@ -1104,7 +1104,7 @@ pft_refresh(void) } for (i = 0; i < numtbls; i++) { - e = malloc(sizeof(struct pfr_tstats)); + e = malloc(sizeof(struct pft_entry)); if (e == NULL) goto err1; e->index = i + 1; diff --git a/usr.sbin/btxld/Makefile b/usr.sbin/btxld/Makefile index 6ca452eec1c2..32cf99d5edac 100644 --- a/usr.sbin/btxld/Makefile +++ b/usr.sbin/btxld/Makefile @@ -4,6 +4,4 @@ PROG= btxld MAN= btxld.8 SRCS= btxld.c elfh.c -WARNS?= 6 - .include diff --git a/usr.sbin/burncd/Makefile b/usr.sbin/burncd/Makefile index bd4f285760ca..11e07c79d0c7 100644 --- a/usr.sbin/burncd/Makefile +++ b/usr.sbin/burncd/Makefile @@ -3,6 +3,4 @@ PROG= burncd MAN= burncd.8 -WARNS?= 6 - .include diff --git a/usr.sbin/burncd/burncd.8 b/usr.sbin/burncd/burncd.8 index 18c1bc46a11b..2501e7209c7b 100644 --- a/usr.sbin/burncd/burncd.8 +++ b/usr.sbin/burncd/burncd.8 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 2, 2005 +.Dd December 21, 2009 .Os .Dt BURNCD 8 .Sh NAME @@ -158,7 +158,11 @@ refers to stdin, and can only be used once. .Sh ENVIRONMENT The following environment variables affect the execution of .Nm : -.Bl -tag -width ".Ev CDROM" +.Bl -tag -width ".Ev BURNCD_SPEED" +.It Ev BURNCD_SPEED +The write speed to use if one is not specified with the +.Fl s +flag. .It Ev CDROM The CD device to use if one is not specified with the .Fl f diff --git a/usr.sbin/burncd/burncd.c b/usr.sbin/burncd/burncd.c index c4d1648e7bbc..43a0a09f1cbd 100644 --- a/usr.sbin/burncd/burncd.c +++ b/usr.sbin/burncd/burncd.c @@ -80,11 +80,13 @@ main(int argc, char **argv) int dao = 0, eject = 0, fixate = 0, list = 0, multi = 0, preemp = 0; int nogap = 0, speed = 4 * 177, test_write = 0, force = 0; int block_size = 0, block_type = 0, cdopen = 0, dvdrw = 0; - const char *dev; + const char *dev, *env_speed; if ((dev = getenv("CDROM")) == NULL) dev = "/dev/acd0"; + env_speed = getenv("BURNCD_SPEED"); + while ((ch = getopt(argc, argv, "def:Flmnpqs:tv")) != -1) { switch (ch) { case 'd': @@ -124,12 +126,7 @@ main(int argc, char **argv) break; case 's': - if (strcasecmp("max", optarg) == 0) - speed = CDR_MAX_SPEED; - else - speed = atoi(optarg) * 177; - if (speed <= 0) - errx(EX_USAGE, "Invalid speed: %s", optarg); + env_speed = optarg; break; case 't': @@ -147,6 +144,15 @@ main(int argc, char **argv) argc -= optind; argv += optind; + if (env_speed == NULL) + ; + else if (strcasecmp("max", env_speed) == 0) + speed = CDR_MAX_SPEED; + else + speed = atoi(env_speed) * 177; + if (speed <= 0) + errx(EX_USAGE, "Invalid speed: %s", env_speed); + if (argc == 0) usage(); diff --git a/usr.sbin/cdcontrol/Makefile b/usr.sbin/cdcontrol/Makefile index 40addadc52ef..a505e3a3e4a2 100644 --- a/usr.sbin/cdcontrol/Makefile +++ b/usr.sbin/cdcontrol/Makefile @@ -2,8 +2,6 @@ PROG= cdcontrol -WARNS?= 2 - DPADD= ${LIBEDIT} ${LIBTERMCAP} LDADD= -ledit -ltermcap diff --git a/usr.sbin/cdcontrol/cdcontrol.c b/usr.sbin/cdcontrol/cdcontrol.c index ede590432013..526f59979c3b 100644 --- a/usr.sbin/cdcontrol/cdcontrol.c +++ b/usr.sbin/cdcontrol/cdcontrol.c @@ -152,7 +152,7 @@ __const char *strstatus(int); static u_int dbprog_discid(void); __const char *cdcontrol_prompt(void); -void help () +void help (void) { struct cmdtab *c; const char *s; @@ -178,7 +178,7 @@ void help () printf ("\tThe plain target address is taken as a synonym for play.\n"); } -void usage () +void usage (void) { fprintf (stderr, "usage: cdcontrol [-sv] [-f device] [command ...]\n"); exit (1); @@ -241,7 +241,7 @@ int main (int argc, char **argv) if (argc > 0) { char buf[80], *p; - int len; + int len, rc; for (p=buf; argc-->0; ++argv) { len = strlen (*argv); @@ -257,7 +257,11 @@ int main (int argc, char **argv) } *p = 0; arg = parse (buf, &cmd); - return (run (cmd, arg)); + rc = run (cmd, arg); + if (rc < 0 && verbose) + warn(NULL); + + return (rc); } if (verbose == 1) @@ -409,8 +413,11 @@ int run (int cmd, char *arg) if (fd < 0 && !open_cd ()) return (0); - if (! strlen (arg)) - return pstatus ("volume"); + if (! strlen (arg)) { + char volume[] = "volume"; + + return pstatus (volume); + } if (! strncasecmp (arg, "left", strlen(arg))) return ioctl (fd, CDIOCSETLEFT); @@ -895,7 +902,7 @@ dbprog_sum(int n) * The integer disc ID. */ static u_int -dbprog_discid() +dbprog_discid(void) { struct ioc_toc_header h; int rc; @@ -926,7 +933,7 @@ dbprog_discid() return((n % 0xff) << 24 | t << 8 | ntr); } -int cdid () +int cdid (void) { u_int id; @@ -1126,7 +1133,7 @@ int status (int *trk, int *min, int *sec, int *frame) } const char * -cdcontrol_prompt() +cdcontrol_prompt(void) { return ("cdcontrol> "); } @@ -1245,7 +1252,7 @@ char *parse (char *buf, int *cmd) return p; } -int open_cd () +int open_cd (void) { char devbuf[MAXPATHLEN]; const char *dev; diff --git a/usr.sbin/chkgrp/Makefile b/usr.sbin/chkgrp/Makefile index 1c52f4680f83..a7bfc548ced1 100644 --- a/usr.sbin/chkgrp/Makefile +++ b/usr.sbin/chkgrp/Makefile @@ -3,6 +3,4 @@ PROG= chkgrp MAN= chkgrp.8 -WARNS?= 2 - .include diff --git a/usr.sbin/chown/Makefile b/usr.sbin/chown/Makefile index 63c5a22f05da..97972e5684ed 100644 --- a/usr.sbin/chown/Makefile +++ b/usr.sbin/chown/Makefile @@ -5,6 +5,4 @@ PROG= chown LINKS= ${BINDIR}/chown /usr/bin/chgrp MAN= chgrp.1 chown.8 -WARNS?= 5 - .include diff --git a/usr.sbin/chown/chgrp.1 b/usr.sbin/chown/chgrp.1 index 71b680666129..8a4c2711edf7 100644 --- a/usr.sbin/chown/chgrp.1 +++ b/usr.sbin/chown/chgrp.1 @@ -31,7 +31,7 @@ .\" @(#)chgrp.1 8.3 (Berkeley) 3/31/94 .\" $FreeBSD$ .\" -.Dd April 25, 2003 +.Dd February 21, 2010 .Dt CHGRP 1 .Os .Sh NAME @@ -39,7 +39,7 @@ .Nd change group .Sh SYNOPSIS .Nm -.Op Fl fhv +.Op Fl fhvx .Oo .Fl R .Op Fl H | Fl L | Fl P @@ -89,6 +89,8 @@ If the flag is specified more than once, .Nm will print the filename, followed by the old and new numeric group ID. +.It Fl x +File system mount points are not traversed. .El .Pp The @@ -125,7 +127,9 @@ In previous versions of this system, symbolic links did not have groups. .Pp The .Fl v -option is non-standard and its use in scripts is not recommended. +and +.Fl x +options are non-standard and their use in scripts is not recommended. .Sh SEE ALSO .Xr chown 2 , .Xr fts 3 , diff --git a/usr.sbin/chown/chown.8 b/usr.sbin/chown/chown.8 index f617f7355504..b5882a3cc6af 100644 --- a/usr.sbin/chown/chown.8 +++ b/usr.sbin/chown/chown.8 @@ -28,7 +28,7 @@ .\" @(#)chown.8 8.3 (Berkeley) 3/31/94 .\" $FreeBSD$ .\" -.Dd April 25, 2003 +.Dd February 21, 2010 .Dt CHOWN 8 .Os .Sh NAME @@ -36,7 +36,7 @@ .Nd change file owner and group .Sh SYNOPSIS .Nm -.Op Fl fhv +.Op Fl fhvx .Oo .Fl R .Op Fl H | Fl L | Fl P @@ -44,7 +44,7 @@ .Ar owner Ns Op : Ns Ar group .Ar .Nm -.Op Fl fhv +.Op Fl fhvx .Oo .Fl R .Op Fl H | Fl L | Fl P @@ -97,6 +97,8 @@ If the flag is specified more than once, .Nm will print the filename, followed by the old and new numeric user/group ID. +.It Fl x +File system mount points are not traversed. .El .Pp The @@ -146,7 +148,9 @@ owners. .Pp The .Fl v -option is non-standard and its use in scripts is not recommended. +and +.Fl x +options are non-standard and their use in scripts is not recommended. .Sh SEE ALSO .Xr chgrp 1 , .Xr find 1 , diff --git a/usr.sbin/chown/chown.c b/usr.sbin/chown/chown.c index b79decaa6a08..7a22292731d4 100644 --- a/usr.sbin/chown/chown.c +++ b/usr.sbin/chown/chown.c @@ -73,14 +73,14 @@ main(int argc, char **argv) { FTS *ftsp; FTSENT *p; - int Hflag, Lflag, Rflag, fflag, hflag, vflag; + int Hflag, Lflag, Rflag, fflag, hflag, vflag, xflag; int ch, fts_options, rval; char *cp; ischown = (strcmp(basename(argv[0]), "chown") == 0); - Hflag = Lflag = Rflag = fflag = hflag = vflag = 0; - while ((ch = getopt(argc, argv, "HLPRfhv")) != -1) + Hflag = Lflag = Rflag = fflag = hflag = vflag = xflag = 0; + while ((ch = getopt(argc, argv, "HLPRfhvx")) != -1) switch (ch) { case 'H': Hflag = 1; @@ -105,6 +105,9 @@ main(int argc, char **argv) case 'v': vflag++; break; + case 'x': + xflag = 1; + break; case '?': default: usage(); @@ -128,6 +131,8 @@ main(int argc, char **argv) } } else fts_options = hflag ? FTS_PHYSICAL : FTS_LOGICAL; + if (xflag) + fts_options |= FTS_XDEV; uid = (uid_t)-1; gid = (gid_t)-1; @@ -301,11 +306,11 @@ usage(void) if (ischown) (void)fprintf(stderr, "%s\n%s\n", - "usage: chown [-fhv] [-R [-H | -L | -P]] owner[:group]" + "usage: chown [-fhvx] [-R [-H | -L | -P]] owner[:group]" " file ...", - " chown [-fhv] [-R [-H | -L | -P]] :group file ..."); + " chown [-fhvx] [-R [-H | -L | -P]] :group file ..."); else (void)fprintf(stderr, "%s\n", - "usage: chgrp [-fhv] [-R [-H | -L | -P]] group file ..."); + "usage: chgrp [-fhvx] [-R [-H | -L | -P]] group file ..."); exit(1); } diff --git a/usr.sbin/chroot/Makefile b/usr.sbin/chroot/Makefile index d28de6668e26..652de797cec4 100644 --- a/usr.sbin/chroot/Makefile +++ b/usr.sbin/chroot/Makefile @@ -4,6 +4,4 @@ PROG= chroot MAN= chroot.8 -WARNS?= 2 - .include diff --git a/usr.sbin/chroot/chroot.c b/usr.sbin/chroot/chroot.c index cc924a027bc5..a0122f777e66 100644 --- a/usr.sbin/chroot/chroot.c +++ b/usr.sbin/chroot/chroot.c @@ -61,9 +61,7 @@ char *group; /* group to switch to ... */ char *grouplist; /* group list to switch to ... */ int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { struct group *gp; struct passwd *pw; @@ -179,7 +177,7 @@ main(argc, argv) } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: chroot [-g group] [-G group,group,...] " "[-u user] newroot [command]\n"); diff --git a/usr.sbin/clear_locks/Makefile b/usr.sbin/clear_locks/Makefile index dace0e16668c..00ff3ce95adc 100644 --- a/usr.sbin/clear_locks/Makefile +++ b/usr.sbin/clear_locks/Makefile @@ -4,6 +4,5 @@ PROG= clear_locks MAN= clear_locks.8 DPADD= ${LIBRPCSVC} LDADD= -lrpcsvc -WARNS= 6 .include diff --git a/usr.sbin/config/Makefile b/usr.sbin/config/Makefile index ac828818e367..6faf8475e9be 100644 --- a/usr.sbin/config/Makefile +++ b/usr.sbin/config/Makefile @@ -9,7 +9,6 @@ SRCS= config.y main.c lang.l mkmakefile.c mkheaders.c \ kernconf.c: kernconf.tmpl file2c 'char kernconfstr[] = {' ',0};' < ${.CURDIR}/kernconf.tmpl > kernconf.c -WARNS?= 6 CFLAGS+= -I. -I${.CURDIR} DPADD= ${LIBL} ${LIBSBUF} diff --git a/usr.sbin/config/lang.l b/usr.sbin/config/lang.l index 075f21f4dfc1..c7845cb0416d 100644 --- a/usr.sbin/config/lang.l +++ b/usr.sbin/config/lang.l @@ -285,7 +285,7 @@ include(const char *fname, int ateof) * Terminate the most recent inclusion. */ static int -endinclude() +endinclude(void) { struct incl *in; int ateof; diff --git a/usr.sbin/cpucontrol/Makefile b/usr.sbin/cpucontrol/Makefile index 00e721406ec0..a048dd77c3db 100644 --- a/usr.sbin/cpucontrol/Makefile +++ b/usr.sbin/cpucontrol/Makefile @@ -4,6 +4,4 @@ PROG= cpucontrol MAN= cpucontrol.8 SRCS= cpucontrol.c intel.c amd.c -WARNS?= 6 - .include diff --git a/usr.sbin/cpucontrol/cpucontrol.c b/usr.sbin/cpucontrol/cpucontrol.c index 8b3ca1dad5c4..71930801da9a 100644 --- a/usr.sbin/cpucontrol/cpucontrol.c +++ b/usr.sbin/cpucontrol/cpucontrol.c @@ -83,7 +83,7 @@ struct datadir { const char *path; SLIST_ENTRY(datadir) next; }; -static SLIST_HEAD(, datadir) datadirs = SLIST_HEAD_INITIALIZER(&datadirs); +static SLIST_HEAD(, datadir) datadirs = SLIST_HEAD_INITIALIZER(datadirs); struct ucode_handler { ucode_probe_t *probe; @@ -102,7 +102,7 @@ static int do_update(const char *dev); static void datadir_add(const char *path); static void __dead2 -usage() +usage(void) { const char *name; diff --git a/usr.sbin/crashinfo/crashinfo.sh b/usr.sbin/crashinfo/crashinfo.sh index cd4100941898..60f036014c44 100755 --- a/usr.sbin/crashinfo/crashinfo.sh +++ b/usr.sbin/crashinfo/crashinfo.sh @@ -147,6 +147,8 @@ fi echo "Writing crash summary to $FILE." +umask 077 + # Simulate uname ostype=$(echo -e printf '"%s", ostype' | gdb -x /dev/stdin -batch $KERNEL) osrelease=$(echo -e printf '"%s", osrelease' | gdb -x /dev/stdin -batch $KERNEL) @@ -304,3 +306,10 @@ echo "------------------------------------------------------------------------" echo "kernel config" echo config -x $KERNEL + +echo +echo "------------------------------------------------------------------------" +echo "ddb capture buffer" +echo + +ddb capture -M $VMCORE -N $KERNEL print diff --git a/usr.sbin/cron/cron/Makefile b/usr.sbin/cron/cron/Makefile index 77ca47a1dc09..d9a1d247d41e 100644 --- a/usr.sbin/cron/cron/Makefile +++ b/usr.sbin/cron/cron/Makefile @@ -9,4 +9,6 @@ CFLAGS+= -DLOGIN_CAP -DPAM DPADD= ${LIBCRON} ${LIBPAM} ${LIBUTIL} LDADD= ${LIBCRON} ${MINUSLPAM} -lutil +WARNS?= 2 + .include diff --git a/usr.sbin/cron/cron/cron.c b/usr.sbin/cron/cron/cron.c index 101989c45d21..52cdcc8612a8 100644 --- a/usr.sbin/cron/cron/cron.c +++ b/usr.sbin/cron/cron/cron.c @@ -24,6 +24,7 @@ static const char rcsid[] = #include "cron.h" +#include #include #if SYS_TIME_H # include @@ -134,6 +135,9 @@ main(argc, argv) } } + if (madvise(NULL, 0, MADV_PROTECT) != 0) + log_it("CRON", getpid(), "WARNING", "madvise() failed"); + pidfile_write(pfh); database.head = NULL; database.tail = NULL; diff --git a/usr.sbin/crunch/Makefile.inc b/usr.sbin/crunch/Makefile.inc index f8ffe675db6e..36175b7e5258 100644 --- a/usr.sbin/crunch/Makefile.inc +++ b/usr.sbin/crunch/Makefile.inc @@ -2,3 +2,5 @@ # modify to taste BINDIR?= /usr/bin + +WARNS?= 2 diff --git a/usr.sbin/crunch/examples/really-big.conf b/usr.sbin/crunch/examples/really-big.conf index 45a10de0cf45..ab8a939e613a 100644 --- a/usr.sbin/crunch/examples/really-big.conf +++ b/usr.sbin/crunch/examples/really-big.conf @@ -27,7 +27,7 @@ progs badsect bim clri disklabel dmesg dump dumpfs fdisk fsck halt progs ifconfig init mknod modload modunload mount mount_isofs progs mount_lofs mount_msdosfs mount_portalfs mountd progs newfs nfsd nfsiod ping quotacheck reboot restore route routed savecore -progs shutdown slattach swapon ttyflags tunefs umount +progs shutdown swapon ttyflags tunefs umount # shell scripts: fastboot ln dump rdump @@ -71,7 +71,7 @@ progs ac accton amd arp bad144 catman chown chroot config config.new cron progs dev_mkdb diskpart edquota flcopy gettable grfinfo hilinfo htable inetd progs iostat iteconfig kvm_mkdb mtree named portmap pppd progs pstat pwd_mkdb quot quotaon rarpd rbootd repquota rmt rpc.bootparamd -progs rwhod sa sliplogin slstats spray sysctl syslogd tcpdump +progs rwhod sa spray sysctl syslogd tcpdump progs traceroute trpt trsp update vipw vnconfig ypbind yppoll ypset special amd srcdir /usr/src/usr.sbin/amd/amd diff --git a/usr.sbin/ctm/ctm/Makefile b/usr.sbin/ctm/ctm/Makefile index c0cf79a64d92..cc2c9b978e7b 100644 --- a/usr.sbin/ctm/ctm/Makefile +++ b/usr.sbin/ctm/ctm/Makefile @@ -17,6 +17,8 @@ NOTYET= ctm_ed.c LDADD= -lmd DPADD= ${LIBMD} +WARNS?= 2 + .if exists(${.CURDIR}/../../Makefile.inc) .include "${.CURDIR}/../../Makefile.inc" .endif diff --git a/usr.sbin/ctm/ctm_dequeue/Makefile b/usr.sbin/ctm/ctm_dequeue/Makefile index 07a234f0599d..18dd52557d42 100644 --- a/usr.sbin/ctm/ctm_dequeue/Makefile +++ b/usr.sbin/ctm/ctm_dequeue/Makefile @@ -8,4 +8,6 @@ SRCS= ctm_dequeue.c error.c CFLAGS+= -I${.CURDIR}/../ctm_rmail +WARNS?= 1 + .include diff --git a/usr.sbin/ctm/ctm_rmail/Makefile b/usr.sbin/ctm/ctm_rmail/Makefile index e2052b9228c7..1278ab46fa08 100644 --- a/usr.sbin/ctm/ctm_rmail/Makefile +++ b/usr.sbin/ctm/ctm_rmail/Makefile @@ -5,4 +5,6 @@ MLINKS= ctm_rmail.1 ctm_smail.1 \ ctm_rmail.1 ctm_dequeue.1 SRCS= ctm_rmail.c error.c +WARNS?= 2 + .include diff --git a/usr.sbin/ctm/ctm_smail/Makefile b/usr.sbin/ctm/ctm_smail/Makefile index 980e9bf02d3e..15209e42b69e 100644 --- a/usr.sbin/ctm/ctm_smail/Makefile +++ b/usr.sbin/ctm/ctm_smail/Makefile @@ -8,4 +8,6 @@ SRCS= ctm_smail.c error.c CFLAGS+= -I${.CURDIR}/../ctm_rmail +WARNS?= 2 + .include diff --git a/usr.sbin/ctm/ctm_smail/ctm_smail.c b/usr.sbin/ctm/ctm_smail/ctm_smail.c index a0dc03c8f59d..c90fa2f42656 100644 --- a/usr.sbin/ctm/ctm_smail/ctm_smail.c +++ b/usr.sbin/ctm/ctm_smail/ctm_smail.c @@ -29,7 +29,7 @@ #define DEF_MAX_MSG 64000 /* Default maximum mail msg minus headers. */ -#define LINE_LENGTH 76 /* Chars per encoded line. Divisible by 4. */ +#define LINE_LENGTH 72 /* Chars per encoded line. Divisible by 4. */ int chop_and_send_or_queue(FILE *dfp, char *delta, off_t ctm_size, long max_msg_size, char *mail_alias, char *queue_dir); diff --git a/usr.sbin/cxgbtool/Makefile b/usr.sbin/cxgbtool/Makefile index d97c51317822..f8e5175f8c44 100644 --- a/usr.sbin/cxgbtool/Makefile +++ b/usr.sbin/cxgbtool/Makefile @@ -8,4 +8,4 @@ CFLAGS+= -DCONFIG_T3_REGS -DCHELSIO_INTERNAL install: -.include \ No newline at end of file +.include diff --git a/usr.sbin/cxgbtool/cxgbtool.c b/usr.sbin/cxgbtool/cxgbtool.c index 8d7e677b1bb1..28d91f96dfe5 100644 --- a/usr.sbin/cxgbtool/cxgbtool.c +++ b/usr.sbin/cxgbtool/cxgbtool.c @@ -85,7 +85,8 @@ struct reg_info { static const char *progname; -static void __attribute__((noreturn)) usage(FILE *fp) +static void +usage(FILE *fp) { fprintf(fp, "Usage: %s [operation]\n", progname); fprintf(fp, @@ -136,7 +137,8 @@ doit(const char *iff_name, unsigned long cmd, void *data) return ioctl(fd, cmd, data) < 0 ? -1 : 0; } -static int get_int_arg(const char *s, uint32_t *valp) +static int +get_int_arg(const char *s, uint32_t *valp) { char *p; @@ -172,11 +174,12 @@ write_reg(const char *iff_name, uint32_t addr, uint32_t val) err(1, "register write"); } -static int register_io(int argc, char *argv[], int start_arg, +static int +register_io(int argc, char *argv[], int start_arg, const char *iff_name) { char *p; - uint32_t addr, val = 0, write = 0; + uint32_t addr, val = 0, w = 0; if (argc != start_arg + 1) return -1; @@ -184,14 +187,14 @@ static int register_io(int argc, char *argv[], int start_arg, if (p == argv[start_arg]) return -1; if (*p == '=' && p[1]) { val = strtoul(p + 1, &p, 0); - write = 1; + w = 1; } if (*p) { warnx("bad parameter \"%s\"", argv[start_arg]); return -1; } - if (write) + if (w) write_reg(iff_name, addr, val); else { val = read_reg(iff_name, addr); @@ -200,9 +203,9 @@ static int register_io(int argc, char *argv[], int start_arg, return 0; } -static int mdio_io(int argc, char *argv[], int start_arg, const char *iff_name) +static int +mdio_io(int argc, char *argv[], int start_arg, const char *iff_name) { - struct ifreq ifr; struct ch_mii_data p; unsigned int cmd, phy_addr, reg, mmd, val; @@ -230,12 +233,14 @@ static int mdio_io(int argc, char *argv[], int start_arg, const char *iff_name) return 0; } -static inline uint32_t xtract(uint32_t val, int shift, int len) +static inline +uint32_t xtract(uint32_t val, int shift, int len) { return (val >> shift) & ((1 << len) - 1); } -static int dump_block_regs(const struct reg_info *reg_array, uint32_t *regs) +static int +dump_block_regs(const struct reg_info *reg_array, uint32_t *regs) { uint32_t reg_val = 0; // silence compiler warning @@ -254,7 +259,8 @@ static int dump_block_regs(const struct reg_info *reg_array, uint32_t *regs) return 1; } -static int dump_regs_t2(int argc, char *argv[], int start_arg, uint32_t *regs) +static int +dump_regs_t2(int argc, char *argv[], int start_arg, uint32_t *regs) { int match = 0; char *block_name = NULL; @@ -292,8 +298,8 @@ static int dump_regs_t2(int argc, char *argv[], int start_arg, uint32_t *regs) } #if defined(CONFIG_T3_REGS) -static int dump_regs_t3(int argc, char *argv[], int start_arg, uint32_t *regs, - int is_pcie) +static int +dump_regs_t3(int argc, char *argv[], int start_arg, uint32_t *regs, int is_pcie) { int match = 0; char *block_name = NULL; @@ -353,8 +359,9 @@ static int dump_regs_t3(int argc, char *argv[], int start_arg, uint32_t *regs, return 0; } -static int dump_regs_t3b(int argc, char *argv[], int start_arg, uint32_t *regs, - int is_pcie) +static int +dump_regs_t3b(int argc, char *argv[], int start_arg, uint32_t *regs, + int is_pcie) { int match = 0; char *block_name = NULL; @@ -414,8 +421,9 @@ static int dump_regs_t3b(int argc, char *argv[], int start_arg, uint32_t *regs, return 0; } -static int dump_regs_t3c(int argc, char *argv[], int start_arg, uint32_t *regs, - int is_pcie) +static int +dump_regs_t3c(int argc, char *argv[], int start_arg, uint32_t *regs, + int is_pcie) { int match = 0; char *block_name = NULL; @@ -479,7 +487,7 @@ static int dump_regs_t3c(int argc, char *argv[], int start_arg, uint32_t *regs, static int dump_regs(int argc, char *argv[], int start_arg, const char *iff_name) { - int i, vers, revision, is_pcie; + int vers, revision, is_pcie; struct ch_ifconf_regs regs; regs.len = REGDUMP_SIZE; @@ -514,7 +522,8 @@ dump_regs(int argc, char *argv[], int start_arg, const char *iff_name) return 0; } -static int t3_meminfo(const uint32_t *regs) +static int +t3_meminfo(const uint32_t *regs) { enum { SG_EGR_CNTX_BADDR = 0x58, @@ -592,11 +601,16 @@ static int t3_meminfo(const uint32_t *regs) return 0; } -static int meminfo(int argc, char *argv[], int start_arg, const char *iff_name) +static int +meminfo(int argc, char *argv[], int start_arg, const char *iff_name) { int vers; struct ch_ifconf_regs regs; + (void) argc; + (void) argv; + (void) start_arg; + regs.len = REGDUMP_SIZE; if ((regs.data = malloc(regs.len)) == NULL) err(1, "can't malloc"); @@ -612,11 +626,11 @@ static int meminfo(int argc, char *argv[], int start_arg, const char *iff_name) return 0; } -static int mtu_tab_op(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +mtu_tab_op(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_mtus m; - int i; + unsigned int i; if (argc == start_arg) { if (doit(iff_name, CHELSIO_GETMTUTAB, &m) < 0) @@ -649,13 +663,14 @@ static int mtu_tab_op(int argc, char *argv[], int start_arg, } #ifdef CHELSIO_INTERNAL -static void show_egress_cntxt(uint32_t data[]) +static void +show_egress_cntxt(uint32_t data[]) { printf("credits: %u\n", data[0] & 0x7fff); printf("GTS: %u\n", (data[0] >> 15) & 1); printf("index: %u\n", data[0] >> 16); printf("queue size: %u\n", data[1] & 0xffff); - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((data[1] >> 16) | ((uint64_t)data[2] << 16) | (((uint64_t)data[3] & 0xf) << 48)) << 12); printf("rsp queue #: %u\n", (data[3] >> 4) & 7); @@ -667,9 +682,10 @@ static void show_egress_cntxt(uint32_t data[]) printf("valid: %u\n", (data[3] >> 31) & 1); } -static void show_fl_cntxt(uint32_t data[]) +static void +show_fl_cntxt(uint32_t data[]) { - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((uint64_t)data[0] | ((uint64_t)data[1] & 0xfffff) << 32) << 12); printf("index: %u\n", (data[1] >> 20) | ((data[2] & 0xf) << 12)); printf("queue size: %u\n", (data[2] >> 4) & 0xffff); @@ -680,11 +696,12 @@ static void show_fl_cntxt(uint32_t data[]) printf("GTS: %u\n", (data[3] >> 31) & 1); } -static void show_response_cntxt(uint32_t data[]) +static void +show_response_cntxt(uint32_t data[]) { printf("index: %u\n", data[0] & 0xffff); printf("size: %u\n", data[0] >> 16); - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((uint64_t)data[1] | ((uint64_t)data[2] & 0xfffff) << 32) << 12); printf("MSI-X/RspQ: %u\n", (data[2] >> 20) & 0x3f); printf("intr enable: %u\n", (data[2] >> 26) & 1); @@ -694,11 +711,12 @@ static void show_response_cntxt(uint32_t data[]) printf("FL threshold: %u\n", data[3]); } -static void show_cq_cntxt(uint32_t data[]) +static void +show_cq_cntxt(uint32_t data[]) { printf("index: %u\n", data[0] & 0xffff); printf("size: %u\n", data[0] >> 16); - printf("base address: 0x%llx\n", + printf("base address: 0x%" PRIx64 "\n", ((uint64_t)data[1] | ((uint64_t)data[2] & 0xfffff) << 32) << 12); printf("rsp queue #: %u\n", (data[2] >> 20) & 0x3f); printf("AN: %u\n", (data[2] >> 26) & 1); @@ -710,8 +728,8 @@ static void show_cq_cntxt(uint32_t data[]) printf("credit threshold: %u\n", data[3] >> 16); } -static int get_sge_context(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +get_sge_context(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_cntxt ctx; @@ -750,8 +768,8 @@ static int get_sge_context(int argc, char *argv[], int start_arg, #define ntohll(x) be64toh((x)) -static int get_sge_desc(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +get_sge_desc(int argc, char *argv[], int start_arg, const char *iff_name) { uint64_t *p, wr_hdr; unsigned int n = 1, qset, qnum; @@ -796,7 +814,8 @@ static int get_sge_desc(int argc, char *argv[], int start_arg, } #endif -static int get_tcb2(int argc, char *argv[], int start_arg, const char *iff_name) +static int +get_tcb2(int argc, char *argv[], int start_arg, const char *iff_name) { uint64_t *d; unsigned int i; @@ -835,8 +854,9 @@ static int get_tcb2(int argc, char *argv[], int start_arg, const char *iff_name) return 0; } -static int get_pm_page_spec(const char *s, unsigned int *page_size, - unsigned int *num_pages) +static int +get_pm_page_spec(const char *s, unsigned int *page_size, + unsigned int *num_pages) { char *p; unsigned long val; @@ -854,7 +874,8 @@ static int get_pm_page_spec(const char *s, unsigned int *page_size, return *p; } -static int conf_pm(int argc, char *argv[], int start_arg, const char *iff_name) +static int +conf_pm(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_pm pm; @@ -884,8 +905,8 @@ static int conf_pm(int argc, char *argv[], int start_arg, const char *iff_name) } #ifdef CHELSIO_INTERNAL -static int dump_tcam(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +dump_tcam(int argc, char *argv[], int start_arg, const char *iff_name) { unsigned int nwords; struct ch_tcam_word op; @@ -907,7 +928,8 @@ static int dump_tcam(int argc, char *argv[], int start_arg, return 0; } -static void hexdump_8b(unsigned int start, uint64_t *data, unsigned int len) +static void +hexdump_8b(unsigned int start, uint64_t *data, unsigned int len) { int i; @@ -920,8 +942,8 @@ static void hexdump_8b(unsigned int start, uint64_t *data, unsigned int len) } } -static int dump_mc7(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +dump_mc7(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_mem_range mem; unsigned int mem_id, addr, len; @@ -959,10 +981,11 @@ static int dump_mc7(int argc, char *argv[], int start_arg, } #endif -/* Max FW size is 32K including version, +4 bytes for the checksum. */ +/* Max FW size is 64K including version, +4 bytes for the checksum. */ #define MAX_FW_IMAGE_SIZE (64 * 1024) -static int load_fw(int argc, char *argv[], int start_arg, const char *iff_name) +static int +load_fw(int argc, char *argv[], int start_arg, const char *iff_name) { int fd, len; struct ch_mem_range op; @@ -979,12 +1002,13 @@ static int load_fw(int argc, char *argv[], int start_arg, const char *iff_name) if (!op.buf) err(1, "load firmware"); - op.len = read(fd, op.buf, MAX_FW_IMAGE_SIZE + 1); - if (op.len < 0) + len = read(fd, op.buf, MAX_FW_IMAGE_SIZE + 1); + if (len < 0) err(1, "load firmware"); - if (op.len > MAX_FW_IMAGE_SIZE) + if (len > MAX_FW_IMAGE_SIZE) errx(1, "FW image too large"); + op.len = len; if (doit(iff_name, CHELSIO_LOAD_FW, &op) < 0) err(1, "load firmware"); return 0; @@ -993,8 +1017,8 @@ static int load_fw(int argc, char *argv[], int start_arg, const char *iff_name) /* Max BOOT size is 255*512 bytes including the BIOS boot ROM basic header */ #define MAX_BOOT_IMAGE_SIZE (0xff * 512) -static int load_boot(int argc, char *argv[], - int start_arg, const char *iff_name) +static int +load_boot(int argc, char *argv[], int start_arg, const char *iff_name) { int fd, len; struct ch_mem_range op; @@ -1024,7 +1048,8 @@ static int load_boot(int argc, char *argv[], return 0; } -static int dump_proto_sram(const char *iff_name) +static int +dump_proto_sram(const char *iff_name) { int i, j; uint8_t buf[PROTO_SRAM_SIZE]; @@ -1054,15 +1079,20 @@ static int dump_proto_sram(const char *iff_name) return 0; } -static int proto_sram_op(int argc, char *argv[], int start_arg, +static int +proto_sram_op(int argc, char *argv[], int start_arg, const char *iff_name) { + (void) argv; + (void) start_arg; + if (argc == start_arg) return dump_proto_sram(iff_name); return -1; } -static int dump_qset_params(const char *iff_name) +static int +dump_qset_params(const char *iff_name) { struct ch_qset_params qp; @@ -1084,10 +1114,10 @@ static int dump_qset_params(const char *iff_name) return 0; } -static int qset_config(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +qset_config(int argc, char *argv[], int start_arg, const char *iff_name) { - struct ch_qset_params qp; + (void) argv; if (argc == start_arg) return dump_qset_params(iff_name); @@ -1095,11 +1125,13 @@ static int qset_config(int argc, char *argv[], int start_arg, return -1; } -static int qset_num_config(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +qset_num_config(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_reg reg; + (void) argv; + if (argc == start_arg) { if (doit(iff_name, CHELSIO_GET_QSET_NUM, ®) < 0) err(1, "get qsets"); @@ -1113,7 +1145,8 @@ static int qset_num_config(int argc, char *argv[], int start_arg, /* * Parse a string containing an IP address with an optional network prefix. */ -static int parse_ipaddr(const char *s, uint32_t *addr, uint32_t *mask) +static int +parse_ipaddr(const char *s, uint32_t *addr, uint32_t *mask) { char *p, *slash; struct in_addr ia; @@ -1143,7 +1176,8 @@ static int parse_ipaddr(const char *s, uint32_t *addr, uint32_t *mask) /* * Parse a string containing a value and an optional colon separated mask. */ -static int parse_val_mask_param(const char *s, uint32_t *val, uint32_t *mask) +static int +parse_val_mask_param(const char *s, uint32_t *val, uint32_t *mask) { char *p; @@ -1156,14 +1190,15 @@ static int parse_val_mask_param(const char *s, uint32_t *val, uint32_t *mask) return *p ? -1 : 0; } -static int parse_trace_param(const char *s, uint32_t *val, uint32_t *mask) +static int +parse_trace_param(const char *s, uint32_t *val, uint32_t *mask) { return strchr(s, '.') ? parse_ipaddr(s, val, mask) : parse_val_mask_param(s, val, mask); } -static int trace_config(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +trace_config(int argc, char *argv[], int start_arg, const char *iff_name) { uint32_t val, mask; struct ch_trace trace; @@ -1238,7 +1273,8 @@ static int trace_config(int argc, char *argv[], int start_arg, return 0; } -static int get_sched_param(int argc, char *argv[], int pos, unsigned int *valp) +static int +get_sched_param(int argc, char *argv[], int pos, unsigned int *valp) { if (pos + 1 >= argc) errx(1, "missing value for %s", argv[pos]); @@ -1247,7 +1283,8 @@ static int get_sched_param(int argc, char *argv[], int pos, unsigned int *valp) return 0; } -static int tx_sched(int argc, char *argv[], int start_arg, const char *iff_name) +static int +tx_sched(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_hw_sched op; unsigned int idx, val; @@ -1293,7 +1330,8 @@ static int tx_sched(int argc, char *argv[], int start_arg, const char *iff_name) return 0; } -static int pktsched(int argc, char *argv[], int start_arg, const char *iff_name) +static int +pktsched(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_pktsched_params op; unsigned int idx, min = -1, max, binding = -1; @@ -1333,20 +1371,29 @@ static int pktsched(int argc, char *argv[], int start_arg, const char *iff_name) return 0; } -static int clear_stats(int argc, char *argv[], int start_arg, - const char *iff_name) +static int +clear_stats(int argc, char *argv[], int start_arg, const char *iff_name) { + (void) argc; + (void) argv; + (void) start_arg; + if (doit(iff_name, CHELSIO_CLEAR_STATS, NULL) < 0) err(1, "clearstats"); return 0; } -static int get_up_la(int argc, char *argv[], int start_arg, const char *iff_name) +static int +get_up_la(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_up_la la; int i, idx, max_idx, entries; + (void) argc; + (void) argv; + (void) start_arg; + la.stopped = 0; la.idx = -1; la.bufsize = LA_BUFSIZE; @@ -1372,11 +1419,16 @@ static int get_up_la(int argc, char *argv[], int start_arg, const char *iff_name return 0; } -static int get_up_ioqs(int argc, char *argv[], int start_arg, const char *iff_name) +static int +get_up_ioqs(int argc, char *argv[], int start_arg, const char *iff_name) { struct ch_up_ioqs ioqs; int i, entries; + (void) argc; + (void) argv; + (void) start_arg; + bzero(&ioqs, sizeof(ioqs)); ioqs.bufsize = IOQS_BUFSIZE; ioqs.data = malloc(IOQS_BUFSIZE); @@ -1465,10 +1517,12 @@ run_cmd(int argc, char *argv[], const char *iff_name) static int run_cmd_loop(int argc, char *argv[], const char *iff_name) { - int n, i; + int n; + unsigned int i; char buf[64]; char *args[8], *s; + (void) argc; args[0] = argv[0]; args[1] = argv[1]; @@ -1481,11 +1535,8 @@ run_cmd_loop(int argc, char *argv[], const char *iff_name) for (;;) { fprintf(stdout, "> "); fflush(stdout); - n = read(STDIN_FILENO, buf, sizeof(buf)); - if (n > sizeof(buf) - 1) { - fprintf(stdout, "too much input.\n"); - return (0); - } else if (n <= 0) + n = read(STDIN_FILENO, buf, sizeof(buf) - 1); + if (n <= 0) return (0); if (buf[--n] != '\n') diff --git a/usr.sbin/cxgbtool/reg_defs.c b/usr.sbin/cxgbtool/reg_defs.c index 734061fa17a6..687bb75cee9f 100644 --- a/usr.sbin/cxgbtool/reg_defs.c +++ b/usr.sbin/cxgbtool/reg_defs.c @@ -106,7 +106,7 @@ struct reg_info sge_regs[] = { { "Packet_Too_Big", 3, 1 }, { "Packet_Mismatch", 4, 1 }, { "SG_RESPACCUTIMER", 0xc0, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc3_regs[] = { @@ -196,7 +196,7 @@ struct reg_info mc3_regs[] = { { "MC3_Uncorr_Err", 1, 1 }, { "MC3_Parity_Err", 2, 8 }, { "MC3_Addr_Err", 10, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc4_regs[] = { @@ -276,7 +276,7 @@ struct reg_info mc4_regs[] = { { "MC4_Corr_Err", 0, 1 }, { "MC4_Uncorr_Err", 1, 1 }, { "MC4_Addr_Err", 2, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info tpi_regs[] = { @@ -290,7 +290,7 @@ struct reg_info tpi_regs[] = { { "INT_DIR", 31, 1 }, { "TPI_PAR", 0x29c, 0 }, { "TPIPAR", 0, 7 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info tp_regs[] = { @@ -509,7 +509,7 @@ struct reg_info tp_regs[] = { { "DROP_TICKS_CNT", 4, 26 }, { "NUM_PKTS_DROPPED", 0, 4 }, { "TP_TX_DROP_COUNT", 0x4bc, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info rat_regs[] = { @@ -532,7 +532,7 @@ struct reg_info rat_regs[] = { { "CspiFramingError", 1, 1 }, { "SgeFramingError", 2, 1 }, { "TpFramingError", 3, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info cspi_regs[] = { @@ -560,7 +560,7 @@ struct reg_info cspi_regs[] = { { "TXDrop", 2, 1 }, { "RXOverflow", 3, 1 }, { "RAMParityErr", 4, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info espi_regs[] = { @@ -660,7 +660,7 @@ struct reg_info espi_regs[] = { { "Error_Ack", 9, 1 }, { "Unmapped_Err", 10, 1 }, { "Transaction_Timer", 16, 8 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info ulp_regs[] = { @@ -682,7 +682,7 @@ struct reg_info ulp_regs[] = { { "Pm_E2C_Wrt_Full", 24, 1 }, { "Pm_C2E_Wrt_Full", 25, 1 }, { "ULP_PIO_CTRL", 0x998, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pl_regs[] = { @@ -712,7 +712,7 @@ struct reg_info pl_regs[] = { { "PL_Intr_CSPI", 9, 1 }, { "PL_Intr_PCIX", 10, 1 }, { "PL_Intr_EXT", 11, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc5_regs[] = { @@ -833,5 +833,5 @@ struct reg_info mc5_regs[] = { { "MC5_DATA_WRITE_CMD", 0xcf4, 0 }, { "MC5_DATA_READ_CMD", 0xcf8, 0 }, { "MC5_MASK_WRITE_CMD", 0xcfc, 0 }, - { NULL } + { NULL, 0, 0 } }; diff --git a/usr.sbin/cxgbtool/reg_defs_t3.c b/usr.sbin/cxgbtool/reg_defs_t3.c index ffa4aefa78f3..6e9b8b1176f0 100644 --- a/usr.sbin/cxgbtool/reg_defs_t3.c +++ b/usr.sbin/cxgbtool/reg_defs_t3.c @@ -140,7 +140,7 @@ struct reg_info sge3_regs[] = { { "DrbPriThrsh", 0, 16 }, { "SG_DEBUG_INDEX", 0x78, 0 }, { "SG_DEBUG_DATA", 0x7c, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pcix1_regs[] = { @@ -212,7 +212,7 @@ struct reg_info pcix1_regs[] = { { "WakeUp0", 2, 1 }, { "SleepMode1", 1, 1 }, { "SleepMode0", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pcie0_regs[] = { @@ -411,7 +411,7 @@ struct reg_info pcie0_regs[] = { { "BISTDone", 24, 8 }, { "BISTCycleThresh", 3, 16 }, { "BISTMode", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3dbg_regs[] = { @@ -557,7 +557,7 @@ struct reg_info t3dbg_regs[] = { { "PMON_CDEL_MANUAL", 4, 1 }, { "PMON_MANUAL", 1, 1 }, { "PMON_AUTO", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc7_pmrx_regs[] = { @@ -674,7 +674,7 @@ struct reg_info mc7_pmrx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc7_pmtx_regs[] = { @@ -791,7 +791,7 @@ struct reg_info mc7_pmtx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc7_cm_regs[] = { @@ -908,7 +908,7 @@ struct reg_info mc7_cm_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info cim_regs[] = { @@ -1024,7 +1024,7 @@ struct reg_info cim_regs[] = { { "CIM_CDEBUGDATA", 0x2d0, 0 }, { "CDebugDataH", 16, 16 }, { "CDebugDataL", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info tp1_regs[] = { @@ -1384,7 +1384,7 @@ struct reg_info tp1_regs[] = { { "TP_EMBED_OP_FIELD3", 0x4f4, 0 }, { "TP_EMBED_OP_FIELD4", 0x4f8, 0 }, { "TP_EMBED_OP_FIELD5", 0x4fc, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info ulp2_rx_regs[] = { @@ -1428,7 +1428,7 @@ struct reg_info ulp2_rx_regs[] = { { "ULPRX_RQ_ULIMIT", 0x538, 0 }, { "ULPRX_PBL_LLIMIT", 0x53c, 0 }, { "ULPRX_PBL_ULIMIT", 0x540, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info ulp2_tx_regs[] = { @@ -1456,7 +1456,7 @@ struct reg_info ulp2_tx_regs[] = { { "ULPTX_DMA_WEIGHT", 0x5ac, 0 }, { "D1_WEIGHT", 16, 16 }, { "D0_WEIGHT", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pm1_rx_regs[] = { @@ -1500,7 +1500,7 @@ struct reg_info pm1_rx_regs[] = { { "ocspi1_ofifo2x_Tx_framing_error", 6, 1 }, { "iespi_par_error", 3, 3 }, { "ocspi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pm1_tx_regs[] = { @@ -1544,7 +1544,7 @@ struct reg_info pm1_tx_regs[] = { { "oespi1_ofifo2x_Tx_framing_error", 6, 1 }, { "icspi_par_error", 3, 3 }, { "oespi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mps0_regs[] = { @@ -1585,7 +1585,7 @@ struct reg_info mps0_regs[] = { { "RXTpParErr", 4, 2 }, { "TX1TpParErr", 2, 2 }, { "TX0TpParErr", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info cpl_switch_regs[] = { @@ -1616,7 +1616,7 @@ struct reg_info cpl_switch_regs[] = { { "cpl_map_tbl_idx", 0, 8 }, { "CPL_MAP_TBL_DATA", 0x65c, 0 }, { "cpl_map_tbl_data", 0, 8 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info smb0_regs[] = { @@ -1682,7 +1682,7 @@ struct reg_info smb0_regs[] = { { "DebugDataL", 0, 16 }, { "SMB_DEBUG_LA", 0x69c, 0 }, { "DebugLAReqAddr", 0, 10 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info i2cm0_regs[] = { @@ -1695,7 +1695,7 @@ struct reg_info i2cm0_regs[] = { { "Ack", 30, 1 }, { "Cont", 1, 1 }, { "Op", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mi1_regs[] = { @@ -1714,7 +1714,7 @@ struct reg_info mi1_regs[] = { { "Busy", 31, 1 }, { "Inc", 2, 1 }, { "Op", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info jm1_regs[] = { @@ -1727,7 +1727,7 @@ struct reg_info jm1_regs[] = { { "JM_OP", 0x6cc, 0 }, { "Busy", 31, 1 }, { "Cnt", 0, 5 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info sf1_regs[] = { @@ -1737,7 +1737,7 @@ struct reg_info sf1_regs[] = { { "Cont", 3, 1 }, { "ByteCnt", 1, 2 }, { "Op", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info pl3_regs[] = { @@ -1839,7 +1839,7 @@ struct reg_info pl3_regs[] = { { "PL_REV", 0x6f4, 0 }, { "Rev", 0, 4 }, { "PL_CLI", 0x6f8, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info mc5a_regs[] = { @@ -2010,7 +2010,7 @@ struct reg_info mc5a_regs[] = { { "ReadCmd", 0, 20 }, { "MC5_DB_MASK_WRITE_CMD", 0x7fc, 0 }, { "MaskWr", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info xgmac0_0_regs[] = { @@ -2341,7 +2341,7 @@ struct reg_info xgmac0_0_regs[] = { { "XGM_RX_SPI4_SOP_EOP_CNT", 0x9ac, 0 }, { "RxSPI4SopCnt", 16, 16 }, { "RxSPI4EopCnt", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info xgmac0_1_regs[] = { @@ -2672,5 +2672,5 @@ struct reg_info xgmac0_1_regs[] = { { "XGM_RX_SPI4_SOP_EOP_CNT", 0xbac, 0 }, { "RxSPI4SopCnt", 16, 16 }, { "RxSPI4EopCnt", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; diff --git a/usr.sbin/cxgbtool/reg_defs_t3b.c b/usr.sbin/cxgbtool/reg_defs_t3b.c index 539742ce3c9c..cd85d840a1dd 100644 --- a/usr.sbin/cxgbtool/reg_defs_t3b.c +++ b/usr.sbin/cxgbtool/reg_defs_t3b.c @@ -150,7 +150,7 @@ struct reg_info t3b_sge3_regs[] = { { "DrbPriThrsh", 0, 16 }, { "SG_DEBUG_INDEX", 0x78, 0 }, { "SG_DEBUG_DATA", 0x7c, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_pcix1_regs[] = { @@ -222,7 +222,7 @@ struct reg_info t3b_pcix1_regs[] = { { "WakeUp0", 2, 1 }, { "SleepMode1", 1, 1 }, { "SleepMode0", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_pcie0_regs[] = { @@ -376,7 +376,7 @@ struct reg_info t3b_pcie0_regs[] = { { "BeaconDetect", 2, 1 }, { "RxDetect", 1, 1 }, { "TxIdleDetect", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_t3dbg_regs[] = { @@ -557,7 +557,7 @@ struct reg_info t3b_t3dbg_regs[] = { { "BSEnLane1", 4, 1 }, { "BSInSelLane0", 1, 2 }, { "BSEnLane0", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_mc7_pmrx_regs[] = { @@ -678,7 +678,7 @@ struct reg_info t3b_mc7_pmrx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_mc7_pmtx_regs[] = { @@ -799,7 +799,7 @@ struct reg_info t3b_mc7_pmtx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_mc7_cm_regs[] = { @@ -920,7 +920,7 @@ struct reg_info t3b_mc7_cm_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_cim_regs[] = { @@ -1047,7 +1047,7 @@ struct reg_info t3b_cim_regs[] = { { "PILADbgWrPtr", 0, 9 }, { "CIM_PO_LA_DEBUGDATA", 0x2e8, 0 }, { "CIM_PI_LA_DEBUGDATA", 0x2ec, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_tp1_regs[] = { @@ -1453,7 +1453,7 @@ struct reg_info t3b_tp1_regs[] = { { "TP_EMBED_OP_FIELD3", 0x4f4, 0 }, { "TP_EMBED_OP_FIELD4", 0x4f8, 0 }, { "TP_EMBED_OP_FIELD5", 0x4fc, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_ulp2_rx_regs[] = { @@ -1497,7 +1497,7 @@ struct reg_info t3b_ulp2_rx_regs[] = { { "ULPRX_RQ_ULIMIT", 0x538, 0 }, { "ULPRX_PBL_LLIMIT", 0x53c, 0 }, { "ULPRX_PBL_ULIMIT", 0x540, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_ulp2_tx_regs[] = { @@ -1525,7 +1525,7 @@ struct reg_info t3b_ulp2_tx_regs[] = { { "ULPTX_DMA_WEIGHT", 0x5ac, 0 }, { "D1_WEIGHT", 16, 16 }, { "D0_WEIGHT", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_pm1_rx_regs[] = { @@ -1569,7 +1569,7 @@ struct reg_info t3b_pm1_rx_regs[] = { { "ocspi1_ofifo2x_Tx_framing_error", 6, 1 }, { "iespi_par_error", 3, 3 }, { "ocspi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_pm1_tx_regs[] = { @@ -1613,7 +1613,7 @@ struct reg_info t3b_pm1_tx_regs[] = { { "oespi1_ofifo2x_Tx_framing_error", 6, 1 }, { "icspi_par_error", 3, 3 }, { "oespi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_mps0_regs[] = { @@ -1655,7 +1655,7 @@ struct reg_info t3b_mps0_regs[] = { { "RXTpParErr", 4, 2 }, { "TX1TpParErr", 2, 2 }, { "TX0TpParErr", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_cpl_switch_regs[] = { @@ -1686,7 +1686,7 @@ struct reg_info t3b_cpl_switch_regs[] = { { "cpl_map_tbl_idx", 0, 8 }, { "CPL_MAP_TBL_DATA", 0x65c, 0 }, { "cpl_map_tbl_data", 0, 8 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_smb0_regs[] = { @@ -1752,7 +1752,7 @@ struct reg_info t3b_smb0_regs[] = { { "DebugDataL", 0, 16 }, { "SMB_DEBUG_LA", 0x69c, 0 }, { "DebugLAReqAddr", 0, 10 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_i2cm0_regs[] = { @@ -1765,7 +1765,7 @@ struct reg_info t3b_i2cm0_regs[] = { { "Ack", 30, 1 }, { "Cont", 1, 1 }, { "Op", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_mi1_regs[] = { @@ -1784,7 +1784,7 @@ struct reg_info t3b_mi1_regs[] = { { "Busy", 31, 1 }, { "Inc", 2, 1 }, { "Op", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_jm1_regs[] = { @@ -1797,7 +1797,7 @@ struct reg_info t3b_jm1_regs[] = { { "JM_OP", 0x6cc, 0 }, { "Busy", 31, 1 }, { "Cnt", 0, 5 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_sf1_regs[] = { @@ -1807,7 +1807,7 @@ struct reg_info t3b_sf1_regs[] = { { "Cont", 3, 1 }, { "ByteCnt", 1, 2 }, { "Op", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_pl3_regs[] = { @@ -1917,7 +1917,7 @@ struct reg_info t3b_pl3_regs[] = { { "PL_CLI", 0x6f8, 0 }, { "PL_LCK", 0x6fc, 0 }, { "Lck", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_mc5a_regs[] = { @@ -2100,7 +2100,7 @@ struct reg_info t3b_mc5a_regs[] = { { "ReadCmd", 0, 20 }, { "MC5_DB_MASK_WRITE_CMD", 0x7fc, 0 }, { "MaskWr", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_xgmac0_0_regs[] = { @@ -2464,7 +2464,7 @@ struct reg_info t3b_xgmac0_0_regs[] = { { "XGM_RX_SPI4_SOP_EOP_CNT", 0x9ac, 0 }, { "RxSPI4SopCnt", 16, 16 }, { "RxSPI4EopCnt", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3b_xgmac0_1_regs[] = { @@ -2828,5 +2828,5 @@ struct reg_info t3b_xgmac0_1_regs[] = { { "XGM_RX_SPI4_SOP_EOP_CNT", 0xbac, 0 }, { "RxSPI4SopCnt", 16, 16 }, { "RxSPI4EopCnt", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; diff --git a/usr.sbin/cxgbtool/reg_defs_t3c.c b/usr.sbin/cxgbtool/reg_defs_t3c.c index 6127fa4ce863..b9181b68e9a9 100644 --- a/usr.sbin/cxgbtool/reg_defs_t3c.c +++ b/usr.sbin/cxgbtool/reg_defs_t3c.c @@ -177,7 +177,7 @@ struct reg_info t3c_sge3_regs[] = { { "DrbPriThrsh", 0, 16 }, { "SG_DEBUG_INDEX", 0x78, 0 }, { "SG_DEBUG_DATA", 0x7c, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_pcix1_regs[] = { @@ -282,7 +282,7 @@ struct reg_info t3c_pcix1_regs[] = { { "IntSt", 4, 3 }, { "PIOSt", 2, 2 }, { "RFReqRdSt", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_pcie0_regs[] = { @@ -475,7 +475,7 @@ struct reg_info t3c_pcie0_regs[] = { { "P_WMark", 18, 11 }, { "NP_WMark", 11, 7 }, { "CPL_WMark", 0, 11 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_t3dbg_regs[] = { @@ -656,7 +656,7 @@ struct reg_info t3c_t3dbg_regs[] = { { "BSEnLane1", 4, 1 }, { "BSInSelLane0", 1, 2 }, { "BSEnLane0", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_mc7_pmrx_regs[] = { @@ -777,7 +777,7 @@ struct reg_info t3c_mc7_pmrx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_mc7_pmtx_regs[] = { @@ -898,7 +898,7 @@ struct reg_info t3c_mc7_pmtx_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_mc7_cm_regs[] = { @@ -1019,7 +1019,7 @@ struct reg_info t3c_mc7_cm_regs[] = { { "PE", 2, 15 }, { "UE", 1, 1 }, { "CE", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_cim_regs[] = { @@ -1194,7 +1194,7 @@ struct reg_info t3c_cim_regs[] = { { "PILADbgWrPtr", 0, 9 }, { "CIM_PO_LA_DEBUGDATA", 0x2e8, 0 }, { "CIM_PI_LA_DEBUGDATA", 0x2ec, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_tp1_regs[] = { @@ -1667,7 +1667,7 @@ struct reg_info t3c_tp1_regs[] = { { "TP_EMBED_OP_FIELD3", 0x4f4, 0 }, { "TP_EMBED_OP_FIELD4", 0x4f8, 0 }, { "TP_EMBED_OP_FIELD5", 0x4fc, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_ulp2_rx_regs[] = { @@ -1725,7 +1725,7 @@ struct reg_info t3c_ulp2_rx_regs[] = { { "ULPRX_RQ_ULIMIT", 0x538, 0 }, { "ULPRX_PBL_LLIMIT", 0x53c, 0 }, { "ULPRX_PBL_ULIMIT", 0x540, 0 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_ulp2_tx_regs[] = { @@ -1766,7 +1766,7 @@ struct reg_info t3c_ulp2_tx_regs[] = { { "ULPTX_DMA_WEIGHT", 0x5ac, 0 }, { "D1_WEIGHT", 16, 16 }, { "D0_WEIGHT", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_pm1_rx_regs[] = { @@ -1810,7 +1810,7 @@ struct reg_info t3c_pm1_rx_regs[] = { { "ocspi1_ofifo2x_Tx_framing_error", 6, 1 }, { "iespi_par_error", 3, 3 }, { "ocspi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_pm1_tx_regs[] = { @@ -1854,7 +1854,7 @@ struct reg_info t3c_pm1_tx_regs[] = { { "oespi1_ofifo2x_Tx_framing_error", 6, 1 }, { "icspi_par_error", 3, 3 }, { "oespi_par_error", 0, 3 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_mps0_regs[] = { @@ -1896,7 +1896,7 @@ struct reg_info t3c_mps0_regs[] = { { "RXTpParErr", 4, 2 }, { "TX1TpParErr", 2, 2 }, { "TX0TpParErr", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_cpl_switch_regs[] = { @@ -1930,7 +1930,7 @@ struct reg_info t3c_cpl_switch_regs[] = { { "cpl_map_tbl_idx", 0, 8 }, { "CPL_MAP_TBL_DATA", 0x65c, 0 }, { "cpl_map_tbl_data", 0, 8 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_smb0_regs[] = { @@ -1996,7 +1996,7 @@ struct reg_info t3c_smb0_regs[] = { { "DebugDataL", 0, 16 }, { "SMB_DEBUG_LA", 0x69c, 0 }, { "DebugLAReqAddr", 0, 10 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_i2cm0_regs[] = { @@ -2009,7 +2009,7 @@ struct reg_info t3c_i2cm0_regs[] = { { "Ack", 30, 1 }, { "Cont", 1, 1 }, { "Op", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_mi1_regs[] = { @@ -2028,7 +2028,7 @@ struct reg_info t3c_mi1_regs[] = { { "Busy", 31, 1 }, { "Inc", 2, 1 }, { "Op", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_jm1_regs[] = { @@ -2041,7 +2041,7 @@ struct reg_info t3c_jm1_regs[] = { { "JM_OP", 0x6cc, 0 }, { "Busy", 31, 1 }, { "Cnt", 0, 5 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_sf1_regs[] = { @@ -2051,7 +2051,7 @@ struct reg_info t3c_sf1_regs[] = { { "Cont", 3, 1 }, { "ByteCnt", 1, 2 }, { "Op", 0, 1 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_pl3_regs[] = { @@ -2162,7 +2162,7 @@ struct reg_info t3c_pl3_regs[] = { { "PL_CLI", 0x6f8, 0 }, { "PL_LCK", 0x6fc, 0 }, { "Lck", 0, 2 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_mc5a_regs[] = { @@ -2346,7 +2346,7 @@ struct reg_info t3c_mc5a_regs[] = { { "ReadCmd", 0, 20 }, { "MC5_DB_MASK_WRITE_CMD", 0x7fc, 0 }, { "MaskWr", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_xgmac0_0_regs[] = { @@ -2730,7 +2730,7 @@ struct reg_info t3c_xgmac0_0_regs[] = { { "XGM_RX_SPI4_SOP_EOP_CNT", 0x9ac, 0 }, { "RxSPI4SopCnt", 16, 16 }, { "RxSPI4EopCnt", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; struct reg_info t3c_xgmac0_1_regs[] = { @@ -3114,6 +3114,6 @@ struct reg_info t3c_xgmac0_1_regs[] = { { "XGM_RX_SPI4_SOP_EOP_CNT", 0xbac, 0 }, { "RxSPI4SopCnt", 16, 16 }, { "RxSPI4EopCnt", 0, 16 }, - { NULL } + { NULL, 0, 0 } }; diff --git a/usr.sbin/daemon/Makefile b/usr.sbin/daemon/Makefile index 3ca3e91ad193..2def8037f2a7 100644 --- a/usr.sbin/daemon/Makefile +++ b/usr.sbin/daemon/Makefile @@ -6,6 +6,4 @@ MAN= daemon.8 DPADD= ${LIBUTIL} LDADD= -lutil -WARNS?= 2 - .include diff --git a/usr.sbin/dconschat/Makefile b/usr.sbin/dconschat/Makefile index 47efe5274be1..2836a6678d86 100644 --- a/usr.sbin/dconschat/Makefile +++ b/usr.sbin/dconschat/Makefile @@ -8,4 +8,6 @@ CFLAGS+= -I${.CURDIR}/../../sys DPADD= ${LIBKVM} LDADD= -lkvm +WARNS?= 1 + .include diff --git a/usr.sbin/devinfo/Makefile b/usr.sbin/devinfo/Makefile index 52e4d6d279e2..2a2301bf545f 100644 --- a/usr.sbin/devinfo/Makefile +++ b/usr.sbin/devinfo/Makefile @@ -3,8 +3,6 @@ PROG= devinfo MAN= devinfo.8 -WARNS?= 2 - DPADD= ${LIBDEVINFO} LDADD= -ldevinfo diff --git a/usr.sbin/devinfo/devinfo.c b/usr.sbin/devinfo/devinfo.c index c32e57b07b5a..73dcfd56448f 100644 --- a/usr.sbin/devinfo/devinfo.c +++ b/usr.sbin/devinfo/devinfo.c @@ -137,7 +137,7 @@ print_device(struct devinfo_dev *dev, void *arg) struct indent_arg ia; int i, indent; - if (vflag || (dev->dd_name[0] != 0 && dev->dd_state >= DIS_ATTACHED)) { + if (vflag || (dev->dd_name[0] != 0 && dev->dd_state >= DS_ATTACHED)) { indent = (int)(intptr_t)arg; for (i = 0; i < indent; i++) printf(" "); diff --git a/usr.sbin/digictl/Makefile b/usr.sbin/digictl/Makefile index 029dfee11e53..cb3745b17d16 100644 --- a/usr.sbin/digictl/Makefile +++ b/usr.sbin/digictl/Makefile @@ -3,6 +3,4 @@ PROG= digictl MAN= digictl.8 -WARNS?= 2 - .include diff --git a/usr.sbin/diskinfo/Makefile b/usr.sbin/diskinfo/Makefile index 5ffa27f6f0d8..b16b9335c259 100644 --- a/usr.sbin/diskinfo/Makefile +++ b/usr.sbin/diskinfo/Makefile @@ -3,8 +3,6 @@ PROG= diskinfo MAN= diskinfo.8 -WARNS?= 5 - DPADD= ${LIBUTIL} LDADD= -lutil diff --git a/usr.sbin/diskinfo/diskinfo.8 b/usr.sbin/diskinfo/diskinfo.8 index dfc7040f349f..f68d426e6b49 100644 --- a/usr.sbin/diskinfo/diskinfo.8 +++ b/usr.sbin/diskinfo/diskinfo.8 @@ -46,7 +46,8 @@ and optionally runs a naive performance test on the device. .Pp If given no arguments, the output will be a single line per specified device with the following fields: device name, sectorsize, media size in bytes, -media size in sectors, firmware cylinders, firmware heads, and firmware sectors. +media size in sectors, stripe size, stripe offset, firmware cylinders, +firmware heads, and firmware sectors. The last three fields are only present if the information is available. .Pp If given the diff --git a/usr.sbin/diskinfo/diskinfo.c b/usr.sbin/diskinfo/diskinfo.c index 7ecf7cb4f328..1f967b732da3 100644 --- a/usr.sbin/diskinfo/diskinfo.c +++ b/usr.sbin/diskinfo/diskinfo.c @@ -58,7 +58,7 @@ main(int argc, char **argv) { int i, ch, fd, error; char buf[BUFSIZ], ident[DISK_IDENT_SIZE]; - off_t mediasize; + off_t mediasize, stripesize, stripeoffset; u_int sectorsize, fwsectors, fwheads; while ((ch = getopt(argc, argv, "ctv")) != -1) { @@ -104,11 +104,19 @@ main(int argc, char **argv) error = ioctl(fd, DIOCGFWHEADS, &fwheads); if (error) fwheads = 0; + error = ioctl(fd, DIOCGSTRIPESIZE, &stripesize); + if (error) + stripesize = 0; + error = ioctl(fd, DIOCGSTRIPEOFFSET, &stripeoffset); + if (error) + stripeoffset = 0; if (!opt_v) { printf("%s", argv[i]); printf("\t%u", sectorsize); printf("\t%jd", (intmax_t)mediasize); printf("\t%jd", (intmax_t)mediasize/sectorsize); + printf("\t%jd", (intmax_t)stripesize); + printf("\t%jd", (intmax_t)stripeoffset); if (fwsectors != 0 && fwheads != 0) { printf("\t%jd", (intmax_t)mediasize / (fwsectors * fwheads * sectorsize)); @@ -124,6 +132,8 @@ main(int argc, char **argv) (intmax_t)mediasize, buf); printf("\t%-12jd\t# mediasize in sectors\n", (intmax_t)mediasize/sectorsize); + printf("\t%-12jd\t# stripesize\n", stripesize); + printf("\t%-12jd\t# stripeoffset\n", stripeoffset); if (fwsectors != 0 && fwheads != 0) { printf("\t%-12jd\t# Cylinders according to firmware.\n", (intmax_t)mediasize / (fwsectors * fwheads * sectorsize)); diff --git a/usr.sbin/dnssec-dsfromkey/Makefile b/usr.sbin/dnssec-dsfromkey/Makefile index ee7c75e918a7..0b57eb530a86 100644 --- a/usr.sbin/dnssec-dsfromkey/Makefile +++ b/usr.sbin/dnssec-dsfromkey/Makefile @@ -17,6 +17,8 @@ CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} +WARNS?= 3 + MAN= dnssec-dsfromkey.8 .include diff --git a/usr.sbin/dnssec-keyfromlabel/Makefile b/usr.sbin/dnssec-keyfromlabel/Makefile index a698bffbdc9d..fd6a3413034c 100644 --- a/usr.sbin/dnssec-keyfromlabel/Makefile +++ b/usr.sbin/dnssec-keyfromlabel/Makefile @@ -17,6 +17,8 @@ CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} +WARNS?= 3 + MAN= dnssec-keyfromlabel.8 .include diff --git a/usr.sbin/dnssec-keygen/Makefile b/usr.sbin/dnssec-keygen/Makefile index 3ac90058106d..1bdf0c0b080e 100644 --- a/usr.sbin/dnssec-keygen/Makefile +++ b/usr.sbin/dnssec-keygen/Makefile @@ -17,6 +17,8 @@ CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} +WARNS?= 3 + MAN= dnssec-keygen.8 .include diff --git a/usr.sbin/dnssec-signzone/Makefile b/usr.sbin/dnssec-signzone/Makefile index 7c4ca65a78cc..70ddc3e0961e 100644 --- a/usr.sbin/dnssec-signzone/Makefile +++ b/usr.sbin/dnssec-signzone/Makefile @@ -17,6 +17,8 @@ CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} +WARNS?= 3 + MAN= dnssec-signzone.8 .include diff --git a/usr.sbin/dumpcis/Makefile b/usr.sbin/dumpcis/Makefile index 283de3a58387..7a5a590090da 100644 --- a/usr.sbin/dumpcis/Makefile +++ b/usr.sbin/dumpcis/Makefile @@ -5,6 +5,5 @@ PROG= dumpcis MAN= dumpcis.8 SRCS= main.c readcis.c printcis.c -WARNS?= 5 .include diff --git a/usr.sbin/editmap/Makefile b/usr.sbin/editmap/Makefile index 93e3e0712228..92d8392bf1f8 100644 --- a/usr.sbin/editmap/Makefile +++ b/usr.sbin/editmap/Makefile @@ -10,6 +10,8 @@ MAN= editmap.8 CFLAGS+= -I${SENDMAIL_DIR}/src -I${SENDMAIL_DIR}/include -I. CFLAGS+= -DNEWDB -DNOT_SENDMAIL +WARNS?= 2 + LIBSMDIR= ${.OBJDIR}/../../lib/libsm LIBSM= ${LIBSMDIR}/libsm.a diff --git a/usr.sbin/eeprom/Makefile b/usr.sbin/eeprom/Makefile index fa5f411d4428..61b48a2aab68 100644 --- a/usr.sbin/eeprom/Makefile +++ b/usr.sbin/eeprom/Makefile @@ -6,7 +6,6 @@ PROG= eeprom MAN= eeprom.8 MANSUBDIR= /sparc64 SRCS= eeprom.c ofw_options.c ofw_util.c -WARNS?= 6 CFLAGS+= -I${.CURDIR}/../ofwdump .include diff --git a/usr.sbin/eeprom/eeprom.8 b/usr.sbin/eeprom/eeprom.8 index 81cb2d36e930..e132da98b7e6 100644 --- a/usr.sbin/eeprom/eeprom.8 +++ b/usr.sbin/eeprom/eeprom.8 @@ -13,13 +13,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.sbin/eeprom/eeprom.c b/usr.sbin/eeprom/eeprom.c index ecd9267a0337..30c1a939567e 100644 --- a/usr.sbin/eeprom/eeprom.c +++ b/usr.sbin/eeprom/eeprom.c @@ -13,13 +13,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -146,7 +139,7 @@ action(char *line) } static void -dump_config() +dump_config(void) { ofwo_dump(); diff --git a/usr.sbin/extattr/Makefile b/usr.sbin/extattr/Makefile index ae349752d689..8e2b5f78e463 100644 --- a/usr.sbin/extattr/Makefile +++ b/usr.sbin/extattr/Makefile @@ -11,6 +11,4 @@ MLINKS+= rmextattr.8 setextattr.8 MLINKS+= rmextattr.8 getextattr.8 MLINKS+= rmextattr.8 lsextattr.8 -WARNS?= 5 - .include diff --git a/usr.sbin/extattr/rmextattr.c b/usr.sbin/extattr/rmextattr.c index 2b2689b0d1f4..7ed92b6e9650 100644 --- a/usr.sbin/extattr/rmextattr.c +++ b/usr.sbin/extattr/rmextattr.c @@ -269,7 +269,7 @@ main(int argc, char *argv[]) printf("\n"); continue; } else { - fwrite(buf, buflen, 1, stdout); + fwrite(buf, error, 1, stdout); printf("\n"); continue; } diff --git a/usr.sbin/extattrctl/Makefile b/usr.sbin/extattrctl/Makefile index 5eb1945d3b94..496a8aa8c7c1 100644 --- a/usr.sbin/extattrctl/Makefile +++ b/usr.sbin/extattrctl/Makefile @@ -3,6 +3,4 @@ PROG= extattrctl MAN= extattrctl.8 -WARNS?= 2 - .include diff --git a/usr.sbin/extattrctl/extattrctl.c b/usr.sbin/extattrctl/extattrctl.c index 103fcd345a92..1929f796f4f9 100644 --- a/usr.sbin/extattrctl/extattrctl.c +++ b/usr.sbin/extattrctl/extattrctl.c @@ -54,7 +54,7 @@ long num_inodes_by_path(char *path); void usage(void); void -usage() +usage(void) { fprintf(stderr, diff --git a/usr.sbin/faithd/Makefile b/usr.sbin/faithd/Makefile index e1898ed333a4..dec45b9645b0 100644 --- a/usr.sbin/faithd/Makefile +++ b/usr.sbin/faithd/Makefile @@ -20,4 +20,6 @@ SRCS= faithd.c tcp.c ftp.c prefix.c CFLAGS+= -DHAVE_POLL_H +WARNS?= 2 + .include diff --git a/usr.sbin/faithd/faithd.8 b/usr.sbin/faithd/faithd.8 index 5d16989902fa..25c118dbf129 100644 --- a/usr.sbin/faithd/faithd.8 +++ b/usr.sbin/faithd/faithd.8 @@ -29,7 +29,7 @@ .\" .\" $FreeBSD$ .\" -.Dd May 17, 1998 +.Dd January 9, 2010 .Dt FAITHD 8 .Os .Sh NAME @@ -44,20 +44,18 @@ .Sh DESCRIPTION The .Nm -utility provides IPv6-to-IPv4 TCP relay. -It must be used on an IPv4/v6 dual stack router. +utility provides IPv6-to-IPv4 TCP relaying. +It can only be used on an IPv4/v6 dual stack router. .Pp When .Nm receives .Tn TCPv6 -traffic, -.Nm -will relay the +traffic, it will relay the .Tn TCPv6 traffic to .Tn TCPv4 . -Destination for relayed +The destination for the relayed .Tn TCPv4 connection will be determined by the last 4 octets of the original .Tn IPv6 @@ -73,14 +71,14 @@ destination address is the traffic will be relayed to IPv4 destination .Li 10.1.1.1 . .Pp -To use +To use the .Nm translation service, an IPv6 address prefix must be reserved for mapping IPv4 addresses into. -Kernel must be properly configured to route all the TCP connection +The kernel must be properly configured to route all the TCP connections toward the reserved IPv6 address prefix into the .Xr faith 4 -pseudo interface, by using +pseudo interface, using the .Xr route 8 command. Also, @@ -91,7 +89,7 @@ to .Dv 1 . .Pp The router must be configured to capture all the TCP traffic -toward reserved +for the reserved .Tn IPv6 address prefix, by using .Xr route 8 @@ -101,21 +99,20 @@ commands. .Pp The .Nm -utility needs a special name-to-address translation logic, so that -hostnames gets resolved into special +utility needs special name-to-address translation logic, so that +hostnames get resolved into the special .Tn IPv6 address prefix. -For small-scale installation, use -.Xr hosts 5 . -For large-scale installation, it is useful to have +For small-scale installations, use +.Xr hosts 5 ; +For large-scale installations, it is useful to have a DNS server with special address translation support. An implementation called .Nm totd -is available -at -.Pa http://www.vermicelli.pasta.cs.uit.no/ipv6/software.html . -Make sure you do not propagate translated DNS records to normal DNS cloud, -it is highly harmful. +is available at +.Pa http://www.vermicelli.pasta.cs.uit.no/software/totd.html . +Make sure you do not propagate translated DNS records over to normal +DNS, as it can cause severe problems. .Ss Daemon mode When .Nm @@ -150,9 +147,9 @@ to you can run local daemons on the router. The .Nm -utility will invoke local daemon at +utility will invoke a local daemon at .Ar serverpath -if the destination address is local interface address, +if the destination address is a local interface address, and will perform translation to IPv4 TCP in other cases. You can also specify .Ar serverargs @@ -182,7 +179,7 @@ The .Nm utility includes special support for protocols used by .Xr ftp 1 . -When translating FTP protocol, +When translating the FTP protocol, .Nm translates network level addresses in .Li PORT/LPRT/EPRT @@ -191,8 +188,8 @@ and commands. .Pp Inactive sessions will be disconnected in 30 minutes, -to avoid stale sessions from chewing up resources. -This may be inappropriate for some of the services +to prevent stale sessions from chewing up resources. +This may be inappropriate for some services (should this be configurable?). .Ss inetd mode When @@ -200,13 +197,13 @@ When is invoked via .Xr inetd 8 , .Nm -will handle connection passed from standard input. +will handle connections passed from standard input. If the connection endpoint is in the reserved IPv6 address prefix, .Nm will relay the connection. Otherwise, .Nm -will invoke service-specific daemon like +will invoke a service-specific daemon like .Xr telnetd 8 , by using the command argument passed from .Xr inetd 8 . @@ -219,16 +216,16 @@ For example, if .Nm is invoked via .Xr inetd 8 -on FTP port, it will operate as a FTP relay. +on the FTP port, it will operate as an FTP relay. .Pp The operation mode requires special support for .Nm in .Xr inetd 8 . .Ss Access control -To prevent malicious accesses, +To prevent malicious access, .Nm -implements a simple address-based access control. +implements simple address-based access control. With .Pa /etc/faithd.conf (or @@ -239,7 +236,7 @@ specified by will avoid relaying unwanted traffic. The .Pa faithd.conf -contains directives with the following format: +configuration file contains directives of the following format: .Bl -bullet .It .Ar src Ns / Ns Ar slen Cm deny Ar dst Ns / Ns Ar dlen @@ -281,6 +278,7 @@ on error. .Sh EXAMPLES Before invoking .Nm , +the .Xr faith 4 interface has to be configured properly. .Bd -literal -offset @@ -334,12 +332,12 @@ ssh stream tcp6/faith nowait root faithd /usr/sbin/sshd -i .Ed .Pp .Xr inetd 8 -will open listening sockets with enabling kernel TCP relay support. -Whenever connection comes in, +will open listening sockets with kernel TCP relay support enabled. +Whenever a connection comes in, .Nm will be invoked by .Xr inetd 8 . -If it the connection endpoint is in the reserved IPv6 address prefix. +If the connection endpoint is in the reserved IPv6 address prefix. The .Nm utility will relay the connection. @@ -370,19 +368,19 @@ setting. .%A Kazu Yamamoto .%T "An IPv6-to-IPv4 transport relay translator" .%B RFC3142 -.%O ftp://ftp.isi.edu/in-notes/rfc3142.txt +.%U ftp://ftp.isi.edu/in-notes/rfc3142.txt .%D June 2001 .Re .\" .Sh HISTORY The .Nm -utility first appeared in WIDE Hydrangea IPv6 protocol stack kit. +utility first appeared in the WIDE Hydrangea IPv6 protocol stack kit. .\" .Pp IPv6 and IPsec support based on the KAME Project (http://www.kame.net/) stack was initially integrated into -.Fx 4.0 +.Fx 4.0 . .Sh SECURITY CONSIDERATIONS It is very insecure to use IP-address based authentication, for connections relayed by .Nm , @@ -392,16 +390,15 @@ Administrators are advised to limit accesses to .Nm using .Pa faithd.conf , -or by using IPv6 packet filters. -It is to protect +or by using IPv6 packet filters, to protect the .Nm -service from malicious parties and avoid theft of service/bandwidth. -IPv6 destination address can be limited by -carefully configuring routing entries that points to +service from malicious parties, and to avoid theft of service/bandwidth. +IPv6 destination addresses can be limited by +carefully configuring routing entries that point to .Xr faith 4 , using .Xr route 8 . -IPv6 source address needs to be filtered by using packet filters. -Documents listed in +The IPv6 source address needs to be filtered using packet filters. +The documents listed in .Sx SEE ALSO -have more discussions on this topic. +have more information on this topic. diff --git a/usr.sbin/faithd/faithd.c b/usr.sbin/faithd/faithd.c index f192fbd3d3b6..9caf0e9f8f30 100644 --- a/usr.sbin/faithd/faithd.c +++ b/usr.sbin/faithd/faithd.c @@ -791,7 +791,7 @@ exit_success(const char *fmt, ...) #ifdef USE_ROUTE static void -grab_myaddrs() +grab_myaddrs(void) { struct ifaddrs *ifap, *ifa; struct myaddrs *p; @@ -847,7 +847,7 @@ grab_myaddrs() } static void -free_myaddrs() +free_myaddrs(void) { struct myaddrs *p, *q; @@ -861,7 +861,7 @@ free_myaddrs() } static void -update_myaddrs() +update_myaddrs(void) { char msg[BUFSIZ]; int len; @@ -900,7 +900,7 @@ update_myaddrs() #endif /*USE_ROUTE*/ static void -usage() +usage(void) { fprintf(stderr, "usage: %s [-dp] [-f conf] service [serverpath [serverargs]]\n", faithdname); diff --git a/usr.sbin/fdcontrol/Makefile b/usr.sbin/fdcontrol/Makefile index e2b54aa06708..5f1426b18ba1 100644 --- a/usr.sbin/fdcontrol/Makefile +++ b/usr.sbin/fdcontrol/Makefile @@ -4,7 +4,6 @@ PROG= fdcontrol SRCS= fdcontrol.c fdutil.c -WARNS?= 6 CFLAGS+= -I${.CURDIR}/../fdread MAN= fdcontrol.8 diff --git a/usr.sbin/fdformat/Makefile b/usr.sbin/fdformat/Makefile index a172811ec055..59cd124f50d0 100644 --- a/usr.sbin/fdformat/Makefile +++ b/usr.sbin/fdformat/Makefile @@ -5,7 +5,6 @@ PROG= fdformat SRCS= fdformat.c fdutil.c -WARNS?= 6 CFLAGS+= -I${.CURDIR}/../fdread .if ${MACHINE} == "pc98" diff --git a/usr.sbin/fdread/Makefile b/usr.sbin/fdread/Makefile index 2868a3c38f03..e99c6205c4c3 100644 --- a/usr.sbin/fdread/Makefile +++ b/usr.sbin/fdread/Makefile @@ -3,8 +3,6 @@ PROG= fdread SRCS= fdread.c fdutil.c -WARNS?= 6 - .if ${MACHINE} == "pc98" CFLAGS+= -DPC98 .endif diff --git a/usr.sbin/fdwrite/Makefile b/usr.sbin/fdwrite/Makefile index ba6f047ff161..b97bdd444821 100644 --- a/usr.sbin/fdwrite/Makefile +++ b/usr.sbin/fdwrite/Makefile @@ -8,6 +8,5 @@ # $FreeBSD$ PROG= fdwrite -WARNS?= 6 .include diff --git a/usr.sbin/fifolog/Makefile.inc b/usr.sbin/fifolog/Makefile.inc index 7fb2a9e805c0..5ec27ddb4247 100644 --- a/usr.sbin/fifolog/Makefile.inc +++ b/usr.sbin/fifolog/Makefile.inc @@ -2,8 +2,6 @@ LIBFIFOLOG= ${.OBJDIR}/../lib/libfifolog.a -WARNS?= 6 - #LINT= flint #LINTFLAGS= ${.CURDIR}/../flint.lnt -I/usr/include diff --git a/usr.sbin/fifolog/fifolog_writer/fifolog_writer.c b/usr.sbin/fifolog/fifolog_writer/fifolog_writer.c index fd107115711f..346297faa069 100644 --- a/usr.sbin/fifolog/fifolog_writer/fifolog_writer.c +++ b/usr.sbin/fifolog/fifolog_writer/fifolog_writer.c @@ -42,7 +42,7 @@ static void usage(void) { - fprintf(stderr, "fifolog_writer [-w write-rate] [-s sync-rate] " + fprintf(stderr, "Usage: fifolog_writer [-w write-rate] [-s sync-rate] " "[-z compression] file\n"); exit(EX_USAGE); } diff --git a/usr.sbin/fifolog/lib/getdate.y b/usr.sbin/fifolog/lib/getdate.y index 93b5b6b4ed93..8e63e8112993 100644 --- a/usr.sbin/fifolog/lib/getdate.y +++ b/usr.sbin/fifolog/lib/getdate.y @@ -762,7 +762,7 @@ LookupWord(char *buff) static int -yylex() +yylex(void) { char c; char *p; diff --git a/usr.sbin/freebsd-update/freebsd-update.sh b/usr.sbin/freebsd-update/freebsd-update.sh index 2eacca8d2fb4..e1453c67d6dd 100644 --- a/usr.sbin/freebsd-update/freebsd-update.sh +++ b/usr.sbin/freebsd-update/freebsd-update.sh @@ -284,6 +284,9 @@ config_TargetRelease () { else return 1 fi + if echo ${TARGETRELEASE} | grep -qE '^[0-9.]+$'; then + TARGETRELEASE="${TARGETRELEASE}-RELEASE" + fi } # Define what happens to output of utilities @@ -600,6 +603,7 @@ fetch_check_params () { echo ${WORKDIR} exit 1 fi + chmod 700 ${WORKDIR} cd ${WORKDIR} || exit 1 # Generate release number. The s/SECURITY/RELEASE/ bit exists diff --git a/usr.sbin/ftp-proxy/Makefile.inc b/usr.sbin/ftp-proxy/Makefile.inc index 5abb7c023cc8..9043d098fca2 100644 --- a/usr.sbin/ftp-proxy/Makefile.inc +++ b/usr.sbin/ftp-proxy/Makefile.inc @@ -2,4 +2,4 @@ LIBEVENT= ${.OBJDIR}/../libevent/libevent.a -.include "../Makefile.inc" \ No newline at end of file +.include "../Makefile.inc" diff --git a/usr.sbin/ftp-proxy/libevent/Makefile b/usr.sbin/ftp-proxy/libevent/Makefile index acc546fe6068..a8ff09b9ba5f 100644 --- a/usr.sbin/ftp-proxy/libevent/Makefile +++ b/usr.sbin/ftp-proxy/libevent/Makefile @@ -22,4 +22,6 @@ CFLAGS+= -I${.CURDIR} \ -DHAVE_WORKING_KQUEUE \ -DVERSION='"1.3b"' +WARNS?= 2 + .include diff --git a/usr.sbin/getfmac/Makefile b/usr.sbin/getfmac/Makefile index ad496570afdd..f9fa1b2e4462 100644 --- a/usr.sbin/getfmac/Makefile +++ b/usr.sbin/getfmac/Makefile @@ -3,6 +3,4 @@ PROG= getfmac MAN= getfmac.8 -WARNS?= 6 - .include diff --git a/usr.sbin/getpmac/Makefile b/usr.sbin/getpmac/Makefile index 87e6d28889ca..597472866526 100644 --- a/usr.sbin/getpmac/Makefile +++ b/usr.sbin/getpmac/Makefile @@ -3,6 +3,4 @@ PROG= getpmac MAN= getpmac.8 -WARNS?= 6 - .include diff --git a/usr.sbin/gstat/Makefile b/usr.sbin/gstat/Makefile index a02cf4658f27..2a6da4089afa 100644 --- a/usr.sbin/gstat/Makefile +++ b/usr.sbin/gstat/Makefile @@ -2,7 +2,6 @@ PROG= gstat MAN= gstat.8 -WARNS?= 5 DPADD= ${LIBDEVSTAT} ${LIBKVM} ${LIBGEOM} ${LIBBSDXML} ${LIBSBUF} ${LIBEDIT} ${LIBCURSES} LDADD= -ldevstat -lkvm -lgeom -lbsdxml -lsbuf -ledit -lcurses diff --git a/usr.sbin/i2c/i2c.8 b/usr.sbin/i2c/i2c.8 index 0067be796484..e2bea3c4fe98 100644 --- a/usr.sbin/i2c/i2c.8 +++ b/usr.sbin/i2c/i2c.8 @@ -26,7 +26,7 @@ .\" $FreeBSD$ .\" -.Dd Jan 23, 2009 +.Dd January 23, 2009 .Dt I2C 8 .Os .Sh NAME diff --git a/usr.sbin/inetd/Makefile b/usr.sbin/inetd/Makefile index 35f2c222e583..29aacd1813d6 100644 --- a/usr.sbin/inetd/Makefile +++ b/usr.sbin/inetd/Makefile @@ -8,7 +8,7 @@ MAN= inetd.8 MLINKS= inetd.8 inetd.conf.5 SRCS= inetd.c builtins.c -WARNS?= 2 +WARNS?= 3 CFLAGS+= -DLOGIN_CAP #CFLAGS+= -DSANITY_CHECK diff --git a/usr.sbin/inetd/inetd.c b/usr.sbin/inetd/inetd.c index 6bcbac61badc..0a39fdf7f648 100644 --- a/usr.sbin/inetd/inetd.c +++ b/usr.sbin/inetd/inetd.c @@ -110,6 +110,7 @@ __FBSDID("$FreeBSD$"); */ #include #include +#include #include #include #include @@ -497,6 +498,9 @@ main(int argc, char **argv) } } + if (madvise(NULL, 0, MADV_PROTECT) != 0) + syslog(LOG_WARNING, "madvise() failed: %s", strerror(errno)); + for (i = 0; i < PERIPSIZE; ++i) LIST_INIT(&proctable[i]); @@ -1393,8 +1397,7 @@ setsockopt(fd, SOL_SOCKET, opt, (char *)&on, sizeof (on)) #ifdef IPSEC void -ipsecsetup(sep) - struct servtab *sep; +ipsecsetup(struct servtab *sep) { char *buf; char *policy_in = NULL; diff --git a/usr.sbin/iostat/Makefile b/usr.sbin/iostat/Makefile index 558b09bbd6cc..9fd4809a5455 100644 --- a/usr.sbin/iostat/Makefile +++ b/usr.sbin/iostat/Makefile @@ -7,4 +7,6 @@ MAN= iostat.8 DPADD= ${LIBDEVSTAT} ${LIBKVM} ${LIBM} LDADD= -ldevstat -lkvm -lm +WARNS?= 1 + .include diff --git a/usr.sbin/ip6addrctl/Makefile b/usr.sbin/ip6addrctl/Makefile index cd2510eb0e19..93a299056f99 100644 --- a/usr.sbin/ip6addrctl/Makefile +++ b/usr.sbin/ip6addrctl/Makefile @@ -3,4 +3,6 @@ PROG= ip6addrctl MAN= ip6addrctl.8 +WARNS?= 2 + .include diff --git a/usr.sbin/ipfwpcap/Makefile b/usr.sbin/ipfwpcap/Makefile index 5615eb1d4646..d16f888c67a6 100644 --- a/usr.sbin/ipfwpcap/Makefile +++ b/usr.sbin/ipfwpcap/Makefile @@ -11,8 +11,6 @@ DPADD= ${LIBPCAP} MAN= ipfwpcap.8 -WARNS?= 6 - .include test: $(CMD) diff --git a/usr.sbin/jail/Makefile b/usr.sbin/jail/Makefile index 74fd6c47b1e1..de35dcf248fc 100644 --- a/usr.sbin/jail/Makefile +++ b/usr.sbin/jail/Makefile @@ -7,8 +7,6 @@ MAN= jail.8 DPADD= ${LIBJAIL} ${LIBUTIL} LDADD= -ljail -lutil -WARNS?= 6 - .if ${MK_INET6_SUPPORT} != "no" CFLAGS+= -DINET6 .endif diff --git a/usr.sbin/jail/jail.8 b/usr.sbin/jail/jail.8 index f3340bd0334a..77f1b958ae40 100644 --- a/usr.sbin/jail/jail.8 +++ b/usr.sbin/jail/jail.8 @@ -34,7 +34,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 25, 2009 +.Dd January 17, 2010 .Dt JAIL 8 .Os .Sh NAME @@ -252,6 +252,13 @@ match. It is only possible to start multiple jails with the same IP address, if none of the jails has more than this single overlapping IP address assigned to itself. +.It Va ip4.saddrsel +A boolean option to change the formerly mentioned behaviour and disable +IPv4 source address selection for the prison in favour of the primary +IPv4 address of the jail. +Source address selection is enabled by default for all jails and a +.Va ip4.nosaddrsel +setting of a parent jail is not inherited for any child jails. .It Va ip4 Control the availablity of IPv4 addresses. Possible values are @@ -267,9 +274,10 @@ Setting the .Va ip4.addr parameter implies a value of .Dq new . -.It Va ip6.addr , Va ip6 -A list of IPv6 addresses assigned to the prison, the counterpart to -.Va ip4.addr +.It Va ip6.addr , Va ip6.saddrsel , Va ip6 +A set of IPv6 options for the prison, the counterparts to +.Va ip4.addr , +.Va ip4.saddrsel and .Va ip4 above. @@ -377,7 +385,7 @@ Since raw sockets can be used to configure and interact with various network subsystems, extra caution should be used where privileged access to jails is given out to untrusted parties. .It Va allow.chflags -Normally, priveleged users inside a jail are treated as unprivileged by +Normally, privileged users inside a jail are treated as unprivileged by .Xr chflags 2 . When this parameter is set, such users are treated as privileged, and may manipulate system file flags subject to the usual constraints on @@ -561,7 +569,7 @@ or for running a virtual server. Start a shell in the jail: .Pp .Bd -literal -offset indent -jail path=/data/jail/192.0.2.100 host.hostname=testhostname \\ +jail -c path=/data/jail/192.0.2.100 host.hostname=testhostname \\ ip4.addr=192.0.2.100 command=/bin/sh .Ed .Pp @@ -636,7 +644,7 @@ script from within the jail. .Bd -literal -offset indent ifconfig ed0 inet alias 192.0.2.100/32 mount -t procfs proc /data/jail/192.0.2.100/proc -jail path=/data/jail/192.0.2.100 host.hostname=testhostname \\ +jail -c path=/data/jail/192.0.2.100 host.hostname=testhostname \\ ip4.addr=192.0.2.100 command=/bin/sh /etc/rc .Ed .Pp diff --git a/usr.sbin/jexec/Makefile b/usr.sbin/jexec/Makefile index d55ea0fc1170..7a2e6821e42a 100644 --- a/usr.sbin/jexec/Makefile +++ b/usr.sbin/jexec/Makefile @@ -4,6 +4,5 @@ PROG= jexec MAN= jexec.8 DPADD= ${LIBJAIL} ${LIBUTIL} LDADD= -ljail -lutil -WARNS?= 6 .include diff --git a/usr.sbin/jls/Makefile b/usr.sbin/jls/Makefile index 2d02c560ac4e..e1157afbca14 100644 --- a/usr.sbin/jls/Makefile +++ b/usr.sbin/jls/Makefile @@ -5,6 +5,4 @@ MAN= jls.8 DPADD= ${LIBJAIL} LDADD= -ljail -WARNS?= 6 - .include diff --git a/usr.sbin/jls/jls.c b/usr.sbin/jls/jls.c index 0661ee3fa437..3f4800cb5a41 100644 --- a/usr.sbin/jls/jls.c +++ b/usr.sbin/jls/jls.c @@ -425,11 +425,6 @@ print_jail(int pflags, int jflags) if (params[i].jp_flags & JP_USER) free(param_values[i]); } - for (i = 0; i < nparams; i++) - if (!(params[i].jp_flags & JP_RAWVALUE)) { - free(params[i].jp_value); - params[i].jp_value = NULL; - } return (jid); } diff --git a/usr.sbin/kbdcontrol/kbdcontrol.c b/usr.sbin/kbdcontrol/kbdcontrol.c index 5d20b163730e..280faa1df2e0 100644 --- a/usr.sbin/kbdcontrol/kbdcontrol.c +++ b/usr.sbin/kbdcontrol/kbdcontrol.c @@ -1148,7 +1148,7 @@ mux_keyboard(u_int op, char *kbd) } void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n%s\n", "usage: kbdcontrol [-dFKix] [-A name] [-a name] [-b duration.pitch | [quiet.]belltype]", diff --git a/usr.sbin/kernbb/Makefile b/usr.sbin/kernbb/Makefile index 7da462b4f3b5..f3bf37cfa669 100644 --- a/usr.sbin/kernbb/Makefile +++ b/usr.sbin/kernbb/Makefile @@ -8,6 +8,5 @@ LDADD= -lkvm CFLAGS+= -I${.CURDIR}/../../contrib/gcc -WARNS?= 3 .include diff --git a/usr.sbin/lastlogin/Makefile b/usr.sbin/lastlogin/Makefile index 017aadf27726..715badd29341 100644 --- a/usr.sbin/lastlogin/Makefile +++ b/usr.sbin/lastlogin/Makefile @@ -3,6 +3,4 @@ PROG= lastlogin MAN= lastlogin.8 -WARNS?= 2 - .include diff --git a/usr.sbin/lastlogin/lastlogin.8 b/usr.sbin/lastlogin/lastlogin.8 index 03a587d0eccc..4d07a2bd249c 100644 --- a/usr.sbin/lastlogin/lastlogin.8 +++ b/usr.sbin/lastlogin/lastlogin.8 @@ -64,13 +64,13 @@ utility differs from in that it only prints information regarding the very last login session. The last login database is never turned over or deleted in standard usage. .Sh FILES -.Bl -tag -width /var/log/lastlog -compact -.It Pa /var/log/lastlog +.Bl -tag -width /var/log/utx.lastlogin -compact +.It Pa /var/log/utx.lastlogin last login database .El .Sh SEE ALSO .Xr last 1 , -.Xr lastlog 5 , +.Xr getutxent 3 , .Xr ac 8 .Sh AUTHORS .An John M. Vinopal diff --git a/usr.sbin/lastlogin/lastlogin.c b/usr.sbin/lastlogin/lastlogin.c index 21c82c3636dd..a1b5b6ea63be 100644 --- a/usr.sbin/lastlogin/lastlogin.c +++ b/usr.sbin/lastlogin/lastlogin.c @@ -36,98 +36,67 @@ __RCSID("$FreeBSD$"); __RCSID("$NetBSD: lastlogin.c,v 1.4 1998/02/03 04:45:35 perry Exp $"); #endif -#include #include -#include #include #include #include -#include -#include #include - -static const char *logfile = _PATH_LASTLOG; +#include int main(int, char **); -static void output(struct passwd *, struct lastlog *); +static void output(struct utmpx *); static void usage(void); int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { int ch, i; - FILE *fp; - struct passwd *passwd; - struct lastlog last; + struct utmpx *u; while ((ch = getopt(argc, argv, "")) != -1) { usage(); } - fp = fopen(logfile, "r"); - if (fp == NULL) - err(1, "%s", logfile); - - setpassent(1); /* Keep passwd file pointers open */ - /* Process usernames given on the command line. */ if (argc > 1) { - long offset; for (i = 1; i < argc; ++i) { - if ((passwd = getpwnam(argv[i])) == NULL) { + if (setutxdb(UTXDB_LASTLOGIN, NULL) != 0) + errx(1, "failed to open lastlog database"); + if ((u = getutxuser(argv[i])) == NULL) { warnx("user '%s' not found", argv[i]); continue; } - /* Calculate the offset into the lastlog file. */ - offset = (long)(passwd->pw_uid * sizeof(last)); - if (fseek(fp, offset, SEEK_SET)) { - warn("fseek error"); - continue; - } - if (fread(&last, sizeof(last), 1, fp) != 1) { - warnx("fread error on '%s'", passwd->pw_name); - clearerr(fp); - continue; - } - output(passwd, &last); + output(u); + endutxent(); } } /* Read all lastlog entries, looking for active ones */ else { - for (i = 0; fread(&last, sizeof(last), 1, fp) == 1; i++) { - if (last.ll_time == 0) + if (setutxdb(UTXDB_LASTLOGIN, NULL) != 0) + errx(1, "failed to open lastlog database"); + while ((u = getutxent()) != NULL) { + if (u->ut_type != USER_PROCESS) continue; - if ((passwd = getpwuid((uid_t)i)) != NULL) - output(passwd, &last); + output(u); } - if (ferror(fp)) - warnx("fread error"); + endutxent(); } - setpassent(0); /* Close passwd file pointers */ - - fclose(fp); exit(0); } /* Duplicate the output of last(1) */ static void -output(p, l) - struct passwd *p; - struct lastlog *l; +output(struct utmpx *u) { - time_t t = _int_to_time(l->ll_time); - printf("%-*.*s %-*.*s %-*.*s %s", - UT_NAMESIZE, UT_NAMESIZE, p->pw_name, - UT_LINESIZE, UT_LINESIZE, l->ll_line, - UT_HOSTSIZE, UT_HOSTSIZE, l->ll_host, - (l->ll_time) ? ctime(&t) : "Never logged in\n"); + time_t t = u->ut_tv.tv_sec; + + printf("%-10s %-8s %-22s %s", + u->ut_user, u->ut_line, u->ut_host, ctime(&t)); } static void -usage() +usage(void) { fprintf(stderr, "usage: lastlogin [user ...]\n"); exit(1); diff --git a/usr.sbin/lmcconfig/Makefile b/usr.sbin/lmcconfig/Makefile index b75ec2c8ce8b..842431accccf 100644 --- a/usr.sbin/lmcconfig/Makefile +++ b/usr.sbin/lmcconfig/Makefile @@ -6,4 +6,6 @@ MAN= lmcconfig.8 DPADD= ${LIBNETGRAPH} LDADD= -lnetgraph +WARNS?= 0 + .include diff --git a/usr.sbin/lpr/common_source/Makefile b/usr.sbin/lpr/common_source/Makefile index 14db0b77b798..4f148f9d4c46 100644 --- a/usr.sbin/lpr/common_source/Makefile +++ b/usr.sbin/lpr/common_source/Makefile @@ -10,4 +10,6 @@ INTERNALLIB= SRCS= common.c ctlinfo.c displayq.c matchjobs.c net.c \ printcap.c request.c rmjob.c startdaemon.c +WARNS?= 1 + .include diff --git a/usr.sbin/lpr/common_source/lp.h b/usr.sbin/lpr/common_source/lp.h index 891ed2f1bda3..63f2ff1a4778 100644 --- a/usr.sbin/lpr/common_source/lp.h +++ b/usr.sbin/lpr/common_source/lp.h @@ -280,7 +280,7 @@ void inform(const struct printer *_pp, char *_cf); void init_printer(struct printer *_pp); void init_request(struct request *_rp); int inlist(char *_uname, char *_cfile); -int iscf(struct dirent *_d); +int iscf(const struct dirent *_d); void ldump(const char *_nfile, const char *_datafile, int _copies); void lastprinter(void); int lockchk(struct printer *_pp, char *_slockf); diff --git a/usr.sbin/lpr/common_source/rmjob.c b/usr.sbin/lpr/common_source/rmjob.c index d6fd6148ccdd..33fcdacc4da5 100644 --- a/usr.sbin/lpr/common_source/rmjob.c +++ b/usr.sbin/lpr/common_source/rmjob.c @@ -384,7 +384,7 @@ rmremote(const struct printer *pp) * Return 1 if the filename begins with 'cf' */ int -iscf(struct dirent *d) +iscf(const struct dirent *d) { return(d->d_name[0] == 'c' && d->d_name[1] == 'f'); } diff --git a/usr.sbin/lpr/filters.ru/Makefile.inc b/usr.sbin/lpr/filters.ru/Makefile.inc index a312e73941ec..36a6f4641306 100644 --- a/usr.sbin/lpr/filters.ru/Makefile.inc +++ b/usr.sbin/lpr/filters.ru/Makefile.inc @@ -1,3 +1,5 @@ # $FreeBSD$ BINDIR= /usr/libexec/lpr/ru + +WARNS?= 3 diff --git a/usr.sbin/lpr/lp/lp.sh b/usr.sbin/lpr/lp/lp.sh index 03ad887b54d2..dbec0531d717 100644 --- a/usr.sbin/lpr/lp/lp.sh +++ b/usr.sbin/lpr/lp/lp.sh @@ -70,7 +70,7 @@ do s) # (silent option) : ;; t) # title for banner page - title="-J${OPTARG}";; + title="${OPTARG}";; *) # (error msg printed by getopts) exit 2;; esac @@ -78,4 +78,4 @@ done shift $(($OPTIND - 1)) -exec /usr/bin/lpr "-P${dest}" ${symlink} ${ncopies} ${mailafter} "${title}" "$@" +exec /usr/bin/lpr "-P${dest}" ${symlink} ${ncopies} ${mailafter} ${title:+-J"${title}"} "$@" diff --git a/usr.sbin/lpr/lpc/Makefile b/usr.sbin/lpr/lpc/Makefile index f050857dd031..35fa52ab138a 100644 --- a/usr.sbin/lpr/lpc/Makefile +++ b/usr.sbin/lpr/lpc/Makefile @@ -11,6 +11,8 @@ BINMODE= 2555 CFLAGS+= -I${.CURDIR}/../common_source +WARNS?= 0 + DPADD= ${LIBLPR} ${LIBEDIT} ${LIBTERMCAP} LDADD= ${LIBLPR} -ledit -ltermcap diff --git a/usr.sbin/lpr/lpd/Makefile b/usr.sbin/lpr/lpd/Makefile index 9af36556604c..0d7d93ef79d9 100644 --- a/usr.sbin/lpr/lpd/Makefile +++ b/usr.sbin/lpr/lpd/Makefile @@ -7,6 +7,8 @@ SRCS= lpd.c printjob.c recvjob.c lpdchar.c modes.c CFLAGS+= -I${.CURDIR}/../common_source +WARNS?= 1 + DPADD= ${LIBLPR} LDADD= ${LIBLPR} diff --git a/usr.sbin/lpr/lpr/Makefile b/usr.sbin/lpr/lpr/Makefile index 1ff376de4cd4..1894b0089c04 100644 --- a/usr.sbin/lpr/lpr/Makefile +++ b/usr.sbin/lpr/lpr/Makefile @@ -13,6 +13,8 @@ BINMODE= 6555 CFLAGS+= -I${.CURDIR}/../common_source +WARNS?= 2 + DPADD= ${LIBLPR} LDADD= ${LIBLPR} diff --git a/usr.sbin/lptcontrol/Makefile b/usr.sbin/lptcontrol/Makefile index 3f7a939a7e17..0cff6202fafa 100644 --- a/usr.sbin/lptcontrol/Makefile +++ b/usr.sbin/lptcontrol/Makefile @@ -3,6 +3,4 @@ PROG= lptcontrol MAN= lptcontrol.8 -WARNS?= 6 - .include diff --git a/usr.sbin/mailstats/Makefile b/usr.sbin/mailstats/Makefile index 86137b09c697..bd72fc6c5b76 100644 --- a/usr.sbin/mailstats/Makefile +++ b/usr.sbin/mailstats/Makefile @@ -11,6 +11,8 @@ MAN= mailstats.8 CFLAGS+= -I${SENDMAIL_DIR}/src -I${SENDMAIL_DIR}/include -I. CFLAGS+= -DNOT_SENDMAIL +WARNS?= 2 + LIBSMDIR= ${.OBJDIR}/../../lib/libsm LIBSM= ${LIBSMDIR}/libsm.a diff --git a/usr.sbin/mailwrapper/Makefile b/usr.sbin/mailwrapper/Makefile index 252f5e772413..3f305f773e70 100644 --- a/usr.sbin/mailwrapper/Makefile +++ b/usr.sbin/mailwrapper/Makefile @@ -8,7 +8,6 @@ MAN= mailwrapper.8 DPADD= ${LIBUTIL} LDADD= -lutil -WARNS?= 6 .endif .if ${MK_MAILWRAPPER} != "no" || ${MK_SENDMAIL} != "no" diff --git a/usr.sbin/makefs/compat/pwcache.c b/usr.sbin/makefs/compat/pwcache.c index 0579d2692ac5..d0c45c22b028 100644 --- a/usr.sbin/makefs/compat/pwcache.c +++ b/usr.sbin/makefs/compat/pwcache.c @@ -45,13 +45,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.sbin/makefs/compat/strsuftoll.c b/usr.sbin/makefs/compat/strsuftoll.c index f73e3ad51d23..657e52525fc6 100644 --- a/usr.sbin/makefs/compat/strsuftoll.c +++ b/usr.sbin/makefs/compat/strsuftoll.c @@ -14,13 +14,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.sbin/makefs/getid.c b/usr.sbin/makefs/getid.c index ca52fa39e46f..939d943ab764 100644 --- a/usr.sbin/makefs/getid.c +++ b/usr.sbin/makefs/getid.c @@ -46,13 +46,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.sbin/makefs/makefs.8 b/usr.sbin/makefs/makefs.8 index 101366ae70be..6c1615cb884a 100644 --- a/usr.sbin/makefs/makefs.8 +++ b/usr.sbin/makefs/makefs.8 @@ -159,7 +159,7 @@ free files (inodes) exist in the image. An optional .Ql % suffix may be provided to indicate that -.Ar free-blocks +.Ar free-files indicates a percentage of the calculated image size .It Fl F Ar specfile Use diff --git a/usr.sbin/makemap/Makefile b/usr.sbin/makemap/Makefile index 5d30c67ae634..80cafcbcfdba 100644 --- a/usr.sbin/makemap/Makefile +++ b/usr.sbin/makemap/Makefile @@ -11,6 +11,8 @@ MAN= makemap.8 CFLAGS+= -I${SENDMAIL_DIR}/src -I${SENDMAIL_DIR}/include -I. CFLAGS+= -DNEWDB -DNOT_SENDMAIL +WARNS?= 2 + LIBSMDIR= ${.OBJDIR}/../../lib/libsm LIBSM= ${LIBSMDIR}/libsm.a diff --git a/usr.sbin/memcontrol/Makefile b/usr.sbin/memcontrol/Makefile index 25009dbb478f..d465d531a3e9 100644 --- a/usr.sbin/memcontrol/Makefile +++ b/usr.sbin/memcontrol/Makefile @@ -2,6 +2,5 @@ PROG= memcontrol MAN= memcontrol.8 -WARNS?= 6 .include diff --git a/usr.sbin/mergemaster/mergemaster.8 b/usr.sbin/mergemaster/mergemaster.8 index 2bff4be2e4af..a56897c31d75 100644 --- a/usr.sbin/mergemaster/mergemaster.8 +++ b/usr.sbin/mergemaster/mergemaster.8 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2009 Douglas Barton +.\" Copyright (c) 1998-2010 Douglas Barton .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 18, 2009 +.Dd January 7, 2010 .Dt MERGEMASTER 8 .Os .Sh NAME @@ -61,10 +61,10 @@ down, populating that environment with the various files. You can specify a different source directory with the -.Op Fl m +.Fl m command line option, or specify the destination directory with the -.Op Fl D +.Fl D option. It then compares each file in that environment to its installed counterpart. @@ -91,10 +91,10 @@ compares the files themselves. You can also specify that the script ignore the Id strings and compare every file with the -.Op Fl s +.Fl s option. Using the -.Op Fl F +.Fl F option .Nm will install the new file for you if they differ only by @@ -126,7 +126,7 @@ installing an updated version of this file you should probably run .Xr pwd_mkdb 8 with the -.Op Fl p +.Fl p option to rebuild your password databases and recreate .Pa /etc/passwd . @@ -165,6 +165,14 @@ which will be read before Options specified on the command line are updated last, and therefore can override both files. .Pp +When the comparison is done if there are any files remaining +in the temproot directory they will be listed, and if the +.Fl a +option is not in use the user will be given the option of +deleting the temproot directory. +If there are no files remaining in the temproot directory +it will be deleted. +.Pp The options are as follows: .Bl -tag -width Fl .It Fl s @@ -198,11 +206,13 @@ If the directory exists, it creates a new one in a previously non-existent directory. This option unsets the verbose flag, -but is compatible with all other options. +but other than +.Fl U +it is compatible with all other options. Setting -.Op Fl a +.Fl a makes -.Op Fl w +.Fl w superfluous. .It Fl h Display usage and help information. @@ -253,7 +263,7 @@ instead of the default Add the date and time to the name of the temporary root directory. If -.Op Fl t +.Fl t is specified, this option must follow it if you want the date added too. .It Fl u Ar N @@ -320,44 +330,44 @@ with all values commented out: # These are options for mergemaster, with their default values listed # The following options have command line overrides # -# The target architecture (unset by default) +# The target architecture (-A, unset by default) #ARCHSTRING='TARGET_ARCH=' # -# Sourcedir is the directory to do the 'make' in (where the new files are) +# Sourcedir is the directory to do the 'make' in (-m) #SOURCEDIR='/usr/src' # -# Directory to install the temporary root environment into +# Directory to install the temporary root environment into (-t) #TEMPROOT='/var/tmp/temproot' # -# Specify the destination directory for the installed files +# Specify the destination directory for the installed files (-D) #DESTDIR= # -# Strict comparison skips the VCS Id test and compares every file +# Strict comparison skips the VCS Id test and compares every file (-s) #STRICT=no # -# Type of diff, such as unified, context, etc. +# Type of diff, such as unified, context, etc. (-c) #DIFF_FLAG='-u' # -# Install the new file if it differs only by VCS Id ($FreeBSD) +# Install the new file if it differs only by VCS Id ($FreeBSD, -F) #FREEBSD_ID= # -# Verbose mode includes more details and additional checks +# Verbose mode includes more details and additional checks (-v) #VERBOSE= # -# Automatically install files that do not exist on the system already +# Automatically install files that do not exist on the system already (-i) #AUTO_INSTALL= # -# Automatically upgrade files that have not been user modified +# Automatically upgrade files that have not been user modified (-U) #AUTO_UPGRADE= # -# Compare /etc/rc.conf[.local] to /etc/defaults/rc.conf -#COMP_CONFS=yes +# Compare /etc/rc.conf[.local] to /etc/defaults/rc.conf (-C) +#COMP_CONFS= # -# Preserve files that you replace -#PRESERVE_FILES=yes +# Preserve files that you replace (-P) +#PRESERVE_FILES= #PRESERVE_FILES_DIR=/var/tmp/mergemaster/preserved-files-`date +%y%m%d-%H%M%S` # -# The umask for mergemaster to compare the default file's modes to +# The umask for mergemaster to compare the default file's modes to (-u) #NEW_UMASK=022 # # The following options have no command line overrides @@ -377,6 +387,9 @@ with all values commented out: # If you set 'yes' above, make sure to include the PATH to your pager #PATH=/bin:/usr/bin:/usr/sbin # +# Delete stale files in /etc/rc.d without prompting +#DELETE_STALE_RC_FILES= +# # Specify the path to scripts to run before the comparison starts, # and/or after the script has finished its work #MM_PRE_COMPARE_SCRIPT= @@ -430,7 +443,7 @@ comparison, use: .Pp .Pa /usr/src/etc/Makefile .Rs -.%O http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html +.%U http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html .%T The Cutting Edge (using make world) .%A Nik Clayton .Re diff --git a/usr.sbin/mergemaster/mergemaster.sh b/usr.sbin/mergemaster/mergemaster.sh index 4d2ffc090568..2fa99066a635 100755 --- a/usr.sbin/mergemaster/mergemaster.sh +++ b/usr.sbin/mergemaster/mergemaster.sh @@ -5,7 +5,7 @@ # Compare files created by /usr/src/etc/Makefile (or the directory # the user specifies) with the currently installed copies. -# Copyright 1998-2009 Douglas Barton +# Copyright 1998-2010 Douglas Barton # DougB@FreeBSD.org # $FreeBSD$ @@ -261,11 +261,6 @@ if [ -r "$HOME/.mergemasterrc" ]; then . "$HOME/.mergemasterrc" fi -# Assign the location of the mtree database -# -MTREEDB=${MTREEDB:-/var/db} -MTREEFILE="${MTREEDB}/mergemaster.mtree" - # Check the command line options # while getopts ":ascrvhipCPm:t:du:w:D:A:FU" COMMAND_LINE_ARGUMENT ; do @@ -342,21 +337,32 @@ while getopts ":ascrvhipCPm:t:du:w:D:A:FU" COMMAND_LINE_ARGUMENT ; do esac done +# Assign the location of the mtree database +# +MTREEDB=${MTREEDB:-${DESTDIR}/var/db} +MTREEFILE="${MTREEDB}/mergemaster.mtree" + # Don't force the user to set this in the mergemaster rc file if [ -n "${PRESERVE_FILES}" -a -z "${PRESERVE_FILES_DIR}" ]; then PRESERVE_FILES_DIR=/var/tmp/mergemaster/preserved-files-`date +%y%m%d-%H%M%S` + mkdir -p ${PRESERVE_FILES_DIR} fi # Check for the mtree database in DESTDIR case "${AUTO_UPGRADE}" in '') ;; # If the option is not set no need to run the test or warn the user *) - if [ ! -s "${DESTDIR}${MTREEFILE}" ]; then + if [ ! -s "${MTREEFILE}" ]; then echo '' - echo "*** Unable to find mtree database. Skipping auto-upgrade on this run." + echo "*** Unable to find mtree database (${MTREEFILE})." + echo " Skipping auto-upgrade on this run." echo " It will be created for the next run when this one is complete." echo '' - press_to_continue + case "${AUTO_RUN}" in + '') + press_to_continue + ;; + esac unset AUTO_UPGRADE fi ;; @@ -463,9 +469,9 @@ MM_MAKE="make ${ARCHSTRING} -m ${SOURCEDIR}/share/mk" # Check DESTDIR against the mergemaster mtree database to see what # files the user changed from the reference files. # -if [ -n "${AUTO_UPGRADE}" -a -s "${DESTDIR}${MTREEFILE}" ]; then +if [ -n "${AUTO_UPGRADE}" -a -s "${MTREEFILE}" ]; then CHANGED=: - for file in `mtree -eqL -f ${DESTDIR}${MTREEFILE} -p ${DESTDIR}/ \ + for file in `mtree -eqL -f ${MTREEFILE} -p ${DESTDIR}/ \ 2>/dev/null | awk '($2 == "changed") {print $1}'`; do if [ -f "${DESTDIR}/$file" ]; then CHANGED="${CHANGED}${DESTDIR}/${file}:" @@ -505,7 +511,7 @@ CVS_ID_TAG=FreeBSD delete_temproot () { rm -rf "${TEMPROOT}" 2>/dev/null chflags -R 0 "${TEMPROOT}" 2>/dev/null - rm -rf "${TEMPROOT}" || exit 1 + rm -rf "${TEMPROOT}" || { echo "*** Unable to delete ${TEMPROOT}"; exit 1; } } case "${RERUN}" in @@ -536,7 +542,7 @@ case "${RERUN}" in echo '' echo " *** Deleting the old ${TEMPROOT}" echo '' - delete_temproot || exit 1 + delete_temproot unset TEST_TEMP_ROOT ;; [tT]) @@ -645,17 +651,15 @@ case "${RERUN}" in ;; esac - # Avoid comparing the motd if the user specifies it in .mergemasterrc - # Compatibility shim to be removed in FreeBSD 9.x case "${IGNORE_MOTD}" in '') ;; - *) IGNORE_FILES="${IGNORE_FILES} /etc/motd" + *) echo '' echo "*** You have the IGNORE_MOTD option set in your mergemaster rc file." echo " This option is deprecated in favor of the IGNORE_FILES option." echo " Please update your rc file accordingly." echo '' - press_to_continue + exit 1 ;; esac @@ -663,33 +667,34 @@ case "${RERUN}" in for file in ${IGNORE_FILES}; do test -e ${TEMPROOT}/${file} && unlink ${TEMPROOT}/${file} done + + # We really don't want to have to deal with files like login.conf.db, pwd.db, + # or spwd.db. Instead, we want to compare the text versions, and run *_mkdb. + # Prompt the user to do so below, as needed. + # + rm -f ${TEMPROOT}/etc/*.db ${TEMPROOT}/etc/passwd + + # We only need to compare things like freebsd.cf once + find ${TEMPROOT}/usr/obj -type f -delete 2>/dev/null + + # Delete stuff we do not need to keep the mtree database small, + # and to make the actual comparison faster. + find ${TEMPROOT}/usr -type l -delete 2>/dev/null + find ${TEMPROOT} -type f -size 0 -delete 2>/dev/null + find -d ${TEMPROOT} -type d -empty -delete 2>/dev/null + + # Build the mtree database in a temporary location. + case "${PRE_WORLD}" in + '') MTREENEW=`mktemp -t mergemaster.mtree` + mtree -ci -p ${TEMPROOT} -k size,md5digest > ${MTREENEW} 2>/dev/null + ;; + *) # We don't want to mess with the mtree database on a pre-world run or + # when re-scanning a previously-built tree. + ;; + esac ;; # End of the "RERUN" test esac -# We really don't want to have to deal with files like login.conf.db, pwd.db, -# or spwd.db. Instead, we want to compare the text versions, and run *_mkdb. -# Prompt the user to do so below, as needed. -# -rm -f ${TEMPROOT}/etc/*.db ${TEMPROOT}/etc/passwd - -# We only need to compare things like freebsd.cf once -find ${TEMPROOT}/usr/obj -type f -delete 2>/dev/null - -# Delete stuff we do not need to keep the mtree database small, -# and to make the actual comparison faster. -find ${TEMPROOT}/usr -type l -delete 2>/dev/null -find ${TEMPROOT} -type f -size 0 -delete 2>/dev/null -find -d ${TEMPROOT} -type d -empty -delete 2>/dev/null - -# Build the mtree database in a temporary location. -MTREENEW=`mktemp -t mergemaster.mtree` -case "${PRE_WORLD}" in -'') mtree -ci -p ${TEMPROOT} -k size,md5digest > ${MTREENEW} 2>/dev/null - ;; -*) # We don't want to mess with the mtree database on a pre-world run. - ;; -esac - # Get ready to start comparing files # Check umask if not specified on the command line, @@ -818,7 +823,8 @@ mm_install () { if [ -n "${DESTDIR}${INSTALL_DIR}" -a ! -d "${DESTDIR}${INSTALL_DIR}" ]; then DIR_MODE=`find_mode "${TEMPROOT}/${INSTALL_DIR}"` - install -d -o root -g wheel -m "${DIR_MODE}" "${DESTDIR}${INSTALL_DIR}" + install -d -o root -g wheel -m "${DIR_MODE}" "${DESTDIR}${INSTALL_DIR}" || + install_error $1 ${DESTDIR}${INSTALL_DIR} fi FILE_MODE=`find_mode "${1}"` @@ -837,32 +843,39 @@ mm_install () { DONT_INSTALL=yes ;; /.cshrc | /.profile) - case "${AUTO_INSTALL}" in - '') - case "${LINK_EXPLAINED}" in - '') - echo " *** Historically BSD derived systems have had a" - echo " hard link from /.cshrc and /.profile to" - echo " their namesakes in /root. Please indicate" - echo " your preference below for bringing your" - echo " installed files up to date." - echo '' - LINK_EXPLAINED=yes - ;; - esac + local st_nlink - echo " Use 'd' to delete the temporary ${COMPFILE}" - echo " Use 'l' to delete the existing ${DESTDIR}${COMPFILE#.} and create the link" - echo '' - echo " Default is to leave the temporary file to deal with by hand" - echo '' - echo -n " How should I handle ${COMPFILE}? [Leave it to install later] " - read HANDLE_LINK - ;; - *) # Part of AUTO_INSTALL - HANDLE_LINK=l - ;; - esac + # install will unlink the file before it installs the new one, + # so we have to restore/create the link afterwards. + # + st_nlink=0 # In case the file does not yet exist + eval $(stat -s ${DESTDIR}${COMPFILE#.} 2>/dev/null) + + do_install_and_rm "${FILE_MODE}" "${1}" "${DESTDIR}${INSTALL_DIR}" + + if [ -n "${AUTO_INSTALL}" -a $st_nlink -gt 1 ]; then + HANDLE_LINK=l + else + case "${LINK_EXPLAINED}" in + '') + echo " *** Historically BSD derived systems have had a" + echo " hard link from /.cshrc and /.profile to" + echo " their namesakes in /root. Please indicate" + echo " your preference below for bringing your" + echo " installed files up to date." + echo '' + LINK_EXPLAINED=yes + ;; + esac + + echo " Use 'd' to delete the temporary ${COMPFILE}" + echo " Use 'l' to delete the existing ${DESTDIR}/root/${COMPFILE##*/} and create the link" + echo '' + echo " Default is to leave the temporary file to deal with by hand" + echo '' + echo -n " How should I handle ${COMPFILE}? [Leave it to install later] " + read HANDLE_LINK + fi case "${HANDLE_LINK}" in [dD]*) @@ -872,19 +885,19 @@ mm_install () { ;; [lL]*) echo '' - rm -f "${DESTDIR}${COMPFILE#.}" - if ln "${DESTDIR}/root/${COMPFILE##*/}" "${DESTDIR}${COMPFILE#.}"; then + unlink ${DESTDIR}/root/${COMPFILE##*/} + if ln ${DESTDIR}${COMPFILE#.} ${DESTDIR}/root/${COMPFILE##*/}; then echo " *** Link from ${DESTDIR}${COMPFILE#.} to ${DESTDIR}/root/${COMPFILE##*/} installed successfully" - rm "${COMPFILE}" else - echo " *** Error linking ${DESTDIR}${COMPFILE#.} to ${DESTDIR}/root/${COMPFILE##*/}, ${COMPFILE} will remain to install by hand" + echo " *** Error linking ${DESTDIR}${COMPFILE#.} to ${DESTDIR}/root/${COMPFILE##*/}" + echo " *** ${COMPFILE} will remain for your consideration" fi ;; *) echo " *** ${COMPFILE} will remain for your consideration" ;; esac - DONT_INSTALL=yes + return ;; esac @@ -955,6 +968,12 @@ if [ -z "${PRE_WORLD}" -a -z "${RERUN}" ]; then esac sleep 2 ;; + *) + if [ -n "${DELETE_STALE_RC_FILES}" ]; then + echo ' *** Deleting ... ' + rm ${STALE_RC_FILES} + echo ' done.' + fi esac ;; esac @@ -967,7 +986,58 @@ if [ -r "${MM_PRE_COMPARE_SCRIPT}" ]; then . "${MM_PRE_COMPARE_SCRIPT}" fi -for COMPFILE in `find . -type f`; do +# Things that were files/directories/links in one version can sometimes +# change to something else in a newer version. So we need to explicitly +# test for this, and warn the user if what we find does not match. +# +for COMPFILE in `find . | sort` ; do + if [ -e "${DESTDIR}${COMPFILE#.}" ]; then + INSTALLED_TYPE=`stat -f '%HT' ${DESTDIR}${COMPFILE#.}` + else + continue + fi + TEMPROOT_TYPE=`stat -f '%HT' $COMPFILE` + + if [ ! "$TEMPROOT_TYPE" = "$INSTALLED_TYPE" ]; then + [ "$COMPFILE" = '.' ] && continue + TEMPROOT_TYPE=`echo $TEMPROOT_TYPE | tr [:upper:] [:lower:]` + INSTALLED_TYPE=`echo $INSTALLED_TYPE | tr [:upper:] [:lower:]` + + echo "*** The installed file ${DESTDIR}${COMPFILE#.} has the type \"$INSTALLED_TYPE\"" + echo " but the new version has the type \"$TEMPROOT_TYPE\"" + echo '' + echo " How would you like to handle this?" + echo '' + echo " Use 'r' to remove ${DESTDIR}${COMPFILE#.}" + case "$TEMPROOT_TYPE" in + 'symbolic link') + TARGET=`readlink $COMPFILE` + echo " and create a link to $TARGET in its place" ;; + *) echo " You will be able to install it as a \"$TEMPROOT_TYPE\"" ;; + esac + echo '' + echo " Use 'i' to ignore this" + echo '' + echo -n " How to proceed? [i] " + read ANSWER + case "$ANSWER" in + [rR]) case "${PRESERVE_FILES}" in + [Yy][Ee][Ss]) + mv ${DESTDIR}${COMPFILE#.} ${PRESERVE_FILES_DIR}/ || exit 1 ;; + *) rm -rf ${DESTDIR}${COMPFILE#.} ;; + esac + case "$TEMPROOT_TYPE" in + 'symbolic link') ln -sf $TARGET ${DESTDIR}${COMPFILE#.} ;; + esac ;; + *) echo '' + echo "*** See the man page about adding ${COMPFILE#.} to the list of IGNORE_FILES" + press_to_continue ;; + esac + echo '' + fi +done + +for COMPFILE in `find . -type f | sort`; do # First, check to see if the file exists in DESTDIR. If not, the # diff_loop function knows how to handle it. @@ -1032,7 +1102,7 @@ for COMPFILE in `find . -type f`; do # If the user chose the -F option, test for that before proceeding # if [ -n "$FREEBSD_ID" ]; then - if diff -q -I'[$]FreeBSD:.*$' "${DESTDIR}${COMPFILE#.}" "${COMPFILE}" > \ + if diff -q -I'[$]FreeBSD.*[$]' "${DESTDIR}${COMPFILE#.}" "${COMPFILE}" > \ /dev/null 2>&1; then if mm_install "${COMPFILE}"; then echo "*** Updated revision control Id for ${DESTDIR}${COMPFILE#.}" @@ -1061,8 +1131,8 @@ echo "*** Comparison complete" if [ -s "${MTREENEW}" ]; then echo "*** Saving mtree database for future upgrades" - test -e "${DESTDIR}${MTREEFILE}" && unlink ${DESTDIR}${MTREEFILE} - mv ${MTREENEW} ${DESTDIR}${MTREEFILE} + test -e "${MTREEFILE}" && unlink ${MTREEFILE} + mv ${MTREENEW} ${MTREEFILE} fi echo '' @@ -1070,30 +1140,28 @@ echo '' TEST_FOR_FILES=`find ${TEMPROOT} -type f -size +0 2>/dev/null` if [ -n "${TEST_FOR_FILES}" ]; then echo "*** Files that remain for you to merge by hand:" - find "${TEMPROOT}" -type f -size +0 + find "${TEMPROOT}" -type f -size +0 | sort echo '' -fi -case "${AUTO_RUN}" in -'') - echo -n "Do you wish to delete what is left of ${TEMPROOT}? [no] " - read DEL_TEMPROOT - - case "${DEL_TEMPROOT}" in - [yY]*) - if delete_temproot; then - echo " *** ${TEMPROOT} has been deleted" - else - echo " *** Unable to delete ${TEMPROOT}" - fi - ;; - *) - echo " *** ${TEMPROOT} will remain" + case "${AUTO_RUN}" in + '') + echo -n "Do you wish to delete what is left of ${TEMPROOT}? [no] " + read DEL_TEMPROOT + case "${DEL_TEMPROOT}" in + [yY]*) + delete_temproot + ;; + *) + echo " *** ${TEMPROOT} will remain" + ;; + esac ;; + *) ;; esac - ;; -*) ;; -esac +else + echo "*** ${TEMPROOT} is empty, deleting" + delete_temproot +fi case "${AUTO_INSTALLED_FILES}" in '') ;; @@ -1268,5 +1336,9 @@ case "${PRE_WORLD}" in ;; esac -exit 0 +if [ -n "${PRESERVE_FILES}" ]; then + find -d $PRESERVE_FILES_DIR -type d -empty -delete 2>/dev/null + rmdir $PRESERVE_FILES_DIR 2>/dev/null +fi +exit 0 diff --git a/usr.sbin/mfiutil/Makefile b/usr.sbin/mfiutil/Makefile index 03ded0329581..dbf158d914e4 100644 --- a/usr.sbin/mfiutil/Makefile +++ b/usr.sbin/mfiutil/Makefile @@ -8,6 +8,7 @@ MAN8= mfiutil.8 CFLAGS+= -fno-builtin-strftime WARNS?=3 +DPADD= ${LIBUTIL} LDADD= -lutil # Here be dragons diff --git a/usr.sbin/mixer/Makefile b/usr.sbin/mixer/Makefile index deb353941e4a..abc01822833b 100644 --- a/usr.sbin/mixer/Makefile +++ b/usr.sbin/mixer/Makefile @@ -3,6 +3,4 @@ PROG= mixer MAN= mixer.8 -WARNS?= 6 - .include diff --git a/usr.sbin/mld6query/Makefile b/usr.sbin/mld6query/Makefile index 0e9da4926104..1d4b44343fdd 100644 --- a/usr.sbin/mld6query/Makefile +++ b/usr.sbin/mld6query/Makefile @@ -20,4 +20,6 @@ SRCS= mld6.c CFLAGS+= -DIPSEC -DUSE_RFC2292BIS +WARNS?= 2 + .include diff --git a/usr.sbin/mlxcontrol/Makefile b/usr.sbin/mlxcontrol/Makefile index 95964a5854ff..038544b21423 100644 --- a/usr.sbin/mlxcontrol/Makefile +++ b/usr.sbin/mlxcontrol/Makefile @@ -6,4 +6,6 @@ SRCS= command.c config.c interface.c util.c CFLAGS+= -I${.CURDIR}/../../sys +WARNS?= 2 + .include diff --git a/usr.sbin/mount_portalfs/mount_portalfs.c b/usr.sbin/mount_portalfs/mount_portalfs.c index 8f61efcc964c..3c37b95657c1 100644 --- a/usr.sbin/mount_portalfs/mount_portalfs.c +++ b/usr.sbin/mount_portalfs/mount_portalfs.c @@ -272,7 +272,7 @@ main(int argc, char *argv[]) } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: mount_portalfs [-o options] config mount-point\n"); diff --git a/usr.sbin/mount_smbfs/Makefile b/usr.sbin/mount_smbfs/Makefile index ade4fad2f1cf..9b7394411bbd 100644 --- a/usr.sbin/mount_smbfs/Makefile +++ b/usr.sbin/mount_smbfs/Makefile @@ -2,7 +2,6 @@ PROG= mount_smbfs SRCS= mount_smbfs.c getmntopts.c -WARNS?= 6 MAN= mount_smbfs.8 MOUNTDIR= ${.CURDIR}/../../sbin/mount diff --git a/usr.sbin/mountd/exports.5 b/usr.sbin/mountd/exports.5 index 93d0cec3618a..c8a3b70d311d 100644 --- a/usr.sbin/mountd/exports.5 +++ b/usr.sbin/mountd/exports.5 @@ -28,7 +28,7 @@ .\" @(#)exports.5 8.3 (Berkeley) 3/29/95 .\" $FreeBSD$ .\" -.Dd June 30, 2008 +.Dd December 3, 2009 .Dt EXPORTS 5 .Os .Sh NAME @@ -473,6 +473,7 @@ operations on the server, so long as valid Kerberos credentials are provided. The machine grumpy.cis.uoguelph.ca is permitted to perform NFSv4 state operations on the server using AUTH_SYS credentials, as well as Kerberos ones. .Sh SEE ALSO +.Xr nfsv4 4 , .Xr netgroup 5 , .Xr mountd 8 , .Xr nfsd 8 , diff --git a/usr.sbin/moused/Makefile b/usr.sbin/moused/Makefile index 623954efce42..a313a213ac80 100644 --- a/usr.sbin/moused/Makefile +++ b/usr.sbin/moused/Makefile @@ -3,8 +3,6 @@ PROG= moused MAN= moused.8 -WARNS?=6 - DPADD= ${LIBUTIL} ${LIBM} LDADD= -lutil -lm diff --git a/usr.sbin/mptable/Makefile b/usr.sbin/mptable/Makefile index a9221f979c6d..cff7602f1e66 100644 --- a/usr.sbin/mptable/Makefile +++ b/usr.sbin/mptable/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ PROG= mptable -WARNS?= 6 .include diff --git a/usr.sbin/mptable/mptable.c b/usr.sbin/mptable/mptable.c index 1ca6dfe150c5..a16a1b94ff93 100644 --- a/usr.sbin/mptable/mptable.c +++ b/usr.sbin/mptable/mptable.c @@ -147,7 +147,7 @@ tableEntry basetableEntryTypes[] = tableEntry extendedtableEntryTypes[] = { { 128, 20, "System Address Space" }, - { 129, 8, "Bus Heirarchy" }, + { 129, 8, "Bus Hierarchy" }, { 130, 8, "Compatibility Bus Address" } }; diff --git a/usr.sbin/mptutil/Makefile b/usr.sbin/mptutil/Makefile index 4abf66e4657d..53d75b34d3d6 100644 --- a/usr.sbin/mptutil/Makefile +++ b/usr.sbin/mptutil/Makefile @@ -8,8 +8,8 @@ MAN= mptutil.8 WARNS?= 3 -DPADD+= ${LIBCAM} ${LIBUTIL} -LDADD+= -lcam -lutil +DPADD= ${LIBCAM} ${LIBSBUF} ${LIBUTIL} +LDADD= -lcam -lsbuf -lutil # Here be dragons .ifdef DEBUG diff --git a/usr.sbin/mptutil/mpt_cam.c b/usr.sbin/mptutil/mpt_cam.c index 0d20c7db6019..b14451a61789 100644 --- a/usr.sbin/mptutil/mpt_cam.c +++ b/usr.sbin/mptutil/mpt_cam.c @@ -56,15 +56,75 @@ xpt_open(void) return (xptfd); } +/* Fetch the path id of bus 0 for the opened mpt controller. */ +static int +fetch_path_id(path_id_t *path_id) +{ + struct bus_match_pattern *b; + union ccb ccb; + size_t bufsize; + + if (xpt_open() < 0) + return (ENXIO); + + /* First, find the path id of bus 0 for this mpt controller. */ + bzero(&ccb, sizeof(ccb)); + + ccb.ccb_h.func_code = XPT_DEV_MATCH; + + bufsize = sizeof(struct dev_match_result) * 1; + ccb.cdm.num_matches = 0; + ccb.cdm.match_buf_len = bufsize; + ccb.cdm.matches = calloc(1, bufsize); + + bufsize = sizeof(struct dev_match_pattern) * 1; + ccb.cdm.num_patterns = 1; + ccb.cdm.pattern_buf_len = bufsize; + ccb.cdm.patterns = calloc(1, bufsize); + + /* Match mptX bus 0. */ + ccb.cdm.patterns[0].type = DEV_MATCH_BUS; + b = &ccb.cdm.patterns[0].pattern.bus_pattern; + snprintf(b->dev_name, sizeof(b->dev_name), "mpt"); + b->unit_number = mpt_unit; + b->bus_id = 0; + b->flags = BUS_MATCH_NAME | BUS_MATCH_UNIT | BUS_MATCH_BUS_ID; + + if (ioctl(xptfd, CAMIOCOMMAND, &ccb) < 0) { + free(ccb.cdm.matches); + free(ccb.cdm.patterns); + return (errno); + } + free(ccb.cdm.patterns); + + if (((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) || + (ccb.cdm.status != CAM_DEV_MATCH_LAST)) { + warnx("fetch_path_id got CAM error %#x, CDM error %d\n", + ccb.ccb_h.status, ccb.cdm.status); + free(ccb.cdm.matches); + return (EIO); + } + + /* We should have exactly 1 match for the bus. */ + if (ccb.cdm.num_matches != 1 || + ccb.cdm.matches[0].type != DEV_MATCH_BUS) { + free(ccb.cdm.matches); + return (ENOENT); + } + *path_id = ccb.cdm.matches[0].result.bus_result.path_id; + free(ccb.cdm.matches); + return (0); +} + int mpt_query_disk(U8 VolumeBus, U8 VolumeID, struct mpt_query_disk *qd) { - struct bus_match_pattern *b; struct periph_match_pattern *p; struct periph_match_result *r; union ccb ccb; + path_id_t path_id; size_t bufsize; - int i; + int error, i; /* mpt(4) only handles devices on bus 0. */ if (VolumeBus != 0) @@ -73,6 +133,11 @@ mpt_query_disk(U8 VolumeBus, U8 VolumeID, struct mpt_query_disk *qd) if (xpt_open() < 0) return (ENXIO); + /* Find the path ID of bus 0. */ + error = fetch_path_id(&path_id); + if (error) + return (error); + bzero(&ccb, sizeof(ccb)); ccb.ccb_h.func_code = XPT_DEV_MATCH; @@ -85,25 +150,18 @@ mpt_query_disk(U8 VolumeBus, U8 VolumeID, struct mpt_query_disk *qd) ccb.cdm.match_buf_len = bufsize; ccb.cdm.matches = calloc(1, bufsize); - bufsize = sizeof(struct dev_match_pattern) * 2; - ccb.cdm.num_patterns = 2; + bufsize = sizeof(struct dev_match_pattern) * 1; + ccb.cdm.num_patterns = 1; ccb.cdm.pattern_buf_len = bufsize; ccb.cdm.patterns = calloc(1, bufsize); - /* Match mptX bus 0. */ - ccb.cdm.patterns[0].type = DEV_MATCH_BUS; - b = &ccb.cdm.patterns[0].pattern.bus_pattern; - snprintf(b->dev_name, sizeof(b->dev_name), "mpt"); - b->unit_number = mpt_unit; - b->bus_id = 0; - b->flags = BUS_MATCH_NAME | BUS_MATCH_UNIT | BUS_MATCH_BUS_ID; - /* Look for a "da" device at the specified target and lun. */ - ccb.cdm.patterns[1].type = DEV_MATCH_PERIPH; - p = &ccb.cdm.patterns[1].pattern.periph_pattern; + ccb.cdm.patterns[0].type = DEV_MATCH_PERIPH; + p = &ccb.cdm.patterns[0].pattern.periph_pattern; + p->path_id = path_id; snprintf(p->periph_name, sizeof(p->periph_name), "da"); p->target_id = VolumeID; - p->flags = PERIPH_MATCH_NAME | PERIPH_MATCH_TARGET; + p->flags = PERIPH_MATCH_PATH | PERIPH_MATCH_NAME | PERIPH_MATCH_TARGET; if (ioctl(xptfd, CAMIOCOMMAND, &ccb) < 0) { i = errno; @@ -122,25 +180,22 @@ mpt_query_disk(U8 VolumeBus, U8 VolumeID, struct mpt_query_disk *qd) } /* - * We should have exactly 2 matches, 1 for the bus and 1 for - * the peripheral. However, if we only have 1 match and it is - * for the bus, don't print an error message and return - * ENOENT. + * We should have exactly 1 match for the peripheral. + * However, if we don't get a match, don't print an error + * message and return ENOENT. */ - if (ccb.cdm.num_matches == 1 && - ccb.cdm.matches[0].type == DEV_MATCH_BUS) { + if (ccb.cdm.num_matches == 0) { free(ccb.cdm.matches); return (ENOENT); } - if (ccb.cdm.num_matches != 2) { - warnx("mpt_query_disk got %d matches, expected 2", + if (ccb.cdm.num_matches != 1) { + warnx("mpt_query_disk got %d matches, expected 1", ccb.cdm.num_matches); free(ccb.cdm.matches); return (EIO); } - if (ccb.cdm.matches[0].type != DEV_MATCH_BUS || - ccb.cdm.matches[1].type != DEV_MATCH_PERIPH) { - warnx("mpt_query_disk got wrong CAM matches"); + if (ccb.cdm.matches[0].type != DEV_MATCH_PERIPH) { + warnx("mpt_query_disk got wrong CAM match"); free(ccb.cdm.matches); return (EIO); } @@ -336,47 +391,44 @@ mpt_fetch_disks(int fd, int *ndisks, struct mpt_standalone_disk **disksp) { CONFIG_PAGE_IOC_2 *ioc2; struct mpt_standalone_disk *disks; - struct bus_match_pattern *b; struct periph_match_pattern *p; struct periph_match_result *r; struct cam_device *dev; union ccb ccb; + path_id_t path_id; size_t bufsize; u_int i; - int count; + int count, error; if (xpt_open() < 0) return (ENXIO); + error = fetch_path_id(&path_id); + if (error) + return (error); + for (count = 100;; count+= 100) { /* Try to fetch 'count' disks in one go. */ bzero(&ccb, sizeof(ccb)); ccb.ccb_h.func_code = XPT_DEV_MATCH; - bufsize = sizeof(struct dev_match_result) * (count + 2); + bufsize = sizeof(struct dev_match_result) * (count + 1); ccb.cdm.num_matches = 0; ccb.cdm.match_buf_len = bufsize; ccb.cdm.matches = calloc(1, bufsize); - bufsize = sizeof(struct dev_match_pattern) * 2; - ccb.cdm.num_patterns = 2; + bufsize = sizeof(struct dev_match_pattern) * 1; + ccb.cdm.num_patterns = 1; ccb.cdm.pattern_buf_len = bufsize; ccb.cdm.patterns = calloc(1, bufsize); - /* Match mptX bus 0. */ - ccb.cdm.patterns[0].type = DEV_MATCH_BUS; - b = &ccb.cdm.patterns[0].pattern.bus_pattern; - snprintf(b->dev_name, sizeof(b->dev_name), "mpt"); - b->unit_number = mpt_unit; - b->bus_id = 0; - b->flags = BUS_MATCH_NAME | BUS_MATCH_UNIT | BUS_MATCH_BUS_ID; - /* Match any "da" peripherals. */ - ccb.cdm.patterns[1].type = DEV_MATCH_PERIPH; - p = &ccb.cdm.patterns[1].pattern.periph_pattern; + ccb.cdm.patterns[0].type = DEV_MATCH_PERIPH; + p = &ccb.cdm.patterns[0].pattern.periph_pattern; + p->path_id = path_id; snprintf(p->periph_name, sizeof(p->periph_name), "da"); - p->flags = PERIPH_MATCH_NAME; + p->flags = PERIPH_MATCH_PATH | PERIPH_MATCH_NAME; if (ioctl(xptfd, CAMIOCOMMAND, &ccb) < 0) { i = errno; @@ -406,21 +458,16 @@ mpt_fetch_disks(int fd, int *ndisks, struct mpt_standalone_disk **disksp) break; } - /* - * We should have N + 1 matches, 1 for the bus and 1 for each - * "da" device. - */ - if (ccb.cdm.num_matches < 1) { - warnx("mpt_fetch_disks didn't get any matches"); + /* Shortcut if we don't have any "da" devices. */ + if (ccb.cdm.num_matches == 0) { free(ccb.cdm.matches); - return (EIO); + *ndisks = 0; + *disksp = NULL; + return (0); } - if (ccb.cdm.matches[0].type != DEV_MATCH_BUS) { - warnx("mpt_fetch_disks got wrong CAM matches"); - free(ccb.cdm.matches); - return (EIO); - } - for (i = 1; i < ccb.cdm.num_matches; i++) { + + /* We should have N matches, 1 for each "da" device. */ + for (i = 0; i < ccb.cdm.num_matches; i++) { if (ccb.cdm.matches[i].type != DEV_MATCH_PERIPH) { warnx("mpt_fetch_disks got wrong CAM matches"); free(ccb.cdm.matches); @@ -428,14 +475,6 @@ mpt_fetch_disks(int fd, int *ndisks, struct mpt_standalone_disk **disksp) } } - /* Shortcut if we don't have any "da" devices. */ - if (ccb.cdm.num_matches == 1) { - free(ccb.cdm.matches); - *ndisks = 0; - *disksp = NULL; - return (0); - } - /* * Some of the "da" peripherals may be for RAID volumes, so * fetch the IOC 2 page (list of RAID volumes) so we can @@ -444,7 +483,7 @@ mpt_fetch_disks(int fd, int *ndisks, struct mpt_standalone_disk **disksp) ioc2 = mpt_read_ioc_page(fd, 2, NULL); disks = calloc(ccb.cdm.num_matches, sizeof(*disks)); count = 0; - for (i = 1; i < ccb.cdm.num_matches; i++) { + for (i = 0; i < ccb.cdm.num_matches; i++) { r = &ccb.cdm.matches[i].result.periph_result; if (periph_is_volume(ioc2, r)) continue; @@ -480,10 +519,9 @@ mpt_fetch_disks(int fd, int *ndisks, struct mpt_standalone_disk **disksp) int mpt_rescan_bus(int bus, int id) { - struct bus_match_pattern *b; union ccb ccb; path_id_t path_id; - size_t bufsize; + int error; /* mpt(4) only handles devices on bus 0. */ if (bus != -1 && bus != 0) @@ -492,54 +530,12 @@ mpt_rescan_bus(int bus, int id) if (xpt_open() < 0) return (ENXIO); - /* First, find the path id of bus 0 for this mpt controller. */ + error = fetch_path_id(&path_id); + if (error) + return (error); + + /* Perform the actual rescan. */ bzero(&ccb, sizeof(ccb)); - - ccb.ccb_h.func_code = XPT_DEV_MATCH; - - bufsize = sizeof(struct dev_match_result) * 1; - ccb.cdm.num_matches = 0; - ccb.cdm.match_buf_len = bufsize; - ccb.cdm.matches = calloc(1, bufsize); - - bufsize = sizeof(struct dev_match_pattern) * 1; - ccb.cdm.num_patterns = 1; - ccb.cdm.pattern_buf_len = bufsize; - ccb.cdm.patterns = calloc(1, bufsize); - - /* Match mptX bus 0. */ - ccb.cdm.patterns[0].type = DEV_MATCH_BUS; - b = &ccb.cdm.patterns[0].pattern.bus_pattern; - snprintf(b->dev_name, sizeof(b->dev_name), "mpt"); - b->unit_number = mpt_unit; - b->bus_id = 0; - b->flags = BUS_MATCH_NAME | BUS_MATCH_UNIT | BUS_MATCH_BUS_ID; - - if (ioctl(xptfd, CAMIOCOMMAND, &ccb) < 0) { - free(ccb.cdm.matches); - free(ccb.cdm.patterns); - return (errno); - } - free(ccb.cdm.patterns); - - if (((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) || - (ccb.cdm.status != CAM_DEV_MATCH_LAST)) { - warnx("mpt_rescan_bus got CAM error %#x, CDM error %d\n", - ccb.ccb_h.status, ccb.cdm.status); - free(ccb.cdm.matches); - return (EIO); - } - - /* We should have exactly 1 match for the bus. */ - if (ccb.cdm.num_matches != 1 || - ccb.cdm.matches[0].type != DEV_MATCH_BUS) { - free(ccb.cdm.matches); - return (ENOENT); - } - path_id = ccb.cdm.matches[0].result.bus_result.path_id; - free(ccb.cdm.matches); - - /* Now perform the actual rescan. */ ccb.ccb_h.path_id = path_id; if (id == -1) { ccb.ccb_h.func_code = XPT_SCAN_BUS; diff --git a/usr.sbin/mptutil/mpt_show.c b/usr.sbin/mptutil/mpt_show.c index e0b6b74d136d..5a2a9463c819 100644 --- a/usr.sbin/mptutil/mpt_show.c +++ b/usr.sbin/mptutil/mpt_show.c @@ -78,6 +78,7 @@ show_adapter(int ac, char **av) CONFIG_PAGE_MANUFACTURING_0 *man0; CONFIG_PAGE_IOC_2 *ioc2; CONFIG_PAGE_IOC_6 *ioc6; + U16 IOCStatus; int fd, comma; if (ac != 1) { @@ -108,7 +109,7 @@ show_adapter(int ac, char **av) free(man0); - ioc2 = mpt_read_ioc_page(fd, 2, NULL); + ioc2 = mpt_read_ioc_page(fd, 2, &IOCStatus); if (ioc2 != NULL) { printf(" RAID Levels:"); comma = 0; @@ -151,9 +152,11 @@ show_adapter(int ac, char **av) printf(" none"); printf("\n"); free(ioc2); - } + } else if ((IOCStatus & MPI_IOCSTATUS_MASK) != + MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + warnx("mpt_read_ioc_page(2): %s", mpt_ioc_status(IOCStatus)); - ioc6 = mpt_read_ioc_page(fd, 6, NULL); + ioc6 = mpt_read_ioc_page(fd, 6, &IOCStatus); if (ioc6 != NULL) { display_stripe_map(" RAID0 Stripes", ioc6->SupportedStripeSizeMapIS); @@ -172,7 +175,9 @@ show_adapter(int ac, char **av) printf("-%u", ioc6->MaxDrivesIME); printf("\n"); free(ioc6); - } + } else if ((IOCStatus & MPI_IOCSTATUS_MASK) != + MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + warnx("mpt_read_ioc_page(6): %s", mpt_ioc_status(IOCStatus)); /* TODO: Add an ioctl to fetch IOC_FACTS and print firmware version. */ @@ -541,7 +546,8 @@ show_physdisks(int ac, char **av) for (i = 0; i <= 0xff; i++) { pinfo = mpt_pd_info(fd, i, &IOCStatus); if (pinfo == NULL) { - if (IOCStatus != MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + if ((IOCStatus & MPI_IOCSTATUS_MASK) != + MPI_IOCSTATUS_CONFIG_INVALID_PAGE) warnx("mpt_pd_info(%d): %s", i, mpt_ioc_status(IOCStatus)); continue; diff --git a/usr.sbin/mtree/Makefile b/usr.sbin/mtree/Makefile index b66c8bbeed8d..cbc4fd9f1870 100644 --- a/usr.sbin/mtree/Makefile +++ b/usr.sbin/mtree/Makefile @@ -8,8 +8,6 @@ MAN= mtree.8 mtree.5 SRCS= compare.c crc.c create.c excludes.c misc.c mtree.c spec.c verify.c SRCS+= specspec.c -WARNS?= 4 - CFLAGS+= -DMD5 -DSHA1 -DRMD160 -DSHA256 DPADD= ${LIBMD} LDADD= -lmd diff --git a/usr.sbin/mtree/mtree.5 b/usr.sbin/mtree/mtree.5 index 375cc7899690..8f17d90344f5 100644 --- a/usr.sbin/mtree/mtree.5 +++ b/usr.sbin/mtree/mtree.5 @@ -33,12 +33,12 @@ .Os .Sh NAME .Nm mtree -.Nd format of mtree dir heirarchy files +.Nd format of mtree dir hierarchy files .Sh DESCRIPTION The .Nm format is a textual format that describes a collection of filesystem objects. -Such files are typically used to create or verify directory heirarchies. +Such files are typically used to create or verify directory hierarchies. .Ss General Format An .Nm diff --git a/usr.sbin/named-checkconf/Makefile b/usr.sbin/named-checkconf/Makefile index 8728b4ad15e9..618cc1389d1c 100644 --- a/usr.sbin/named-checkconf/Makefile +++ b/usr.sbin/named-checkconf/Makefile @@ -14,6 +14,8 @@ SRCS+= named-checkconf.c check-tool.c CFLAGS+= -I${LIB_BIND_DIR} +WARNS?= 3 + DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} diff --git a/usr.sbin/named-checkzone/Makefile b/usr.sbin/named-checkzone/Makefile index 169c00adce4e..05cc9f23f954 100644 --- a/usr.sbin/named-checkzone/Makefile +++ b/usr.sbin/named-checkzone/Makefile @@ -14,6 +14,8 @@ SRCS+= named-checkzone.c check-tool.c CFLAGS+= -I${LIB_BIND_DIR} +WARNS?= 3 + DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} diff --git a/usr.sbin/named/Makefile b/usr.sbin/named/Makefile index 608866a4466e..296afe916399 100644 --- a/usr.sbin/named/Makefile +++ b/usr.sbin/named/Makefile @@ -51,6 +51,8 @@ CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include # Remove the date stamp to make it more obvious when real changes happen CFLAGS+= -U__DATE__ +WARNS?= 0 + DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} diff --git a/usr.sbin/ndiscvt/ndiscvt.c b/usr.sbin/ndiscvt/ndiscvt.c index 34d312071e57..5de75191f73b 100644 --- a/usr.sbin/ndiscvt/ndiscvt.c +++ b/usr.sbin/ndiscvt/ndiscvt.c @@ -91,10 +91,8 @@ extern const char *__progname; nt_hdr = (image_nt_header *)(x + dos_hdr->idh_lfanew); \ sect_hdr = IMAGE_FIRST_SECTION(nt_hdr); -static -int insert_padding(imgbase, imglen) - void **imgbase; - int *imglen; +static int +insert_padding(void **imgbase, int *imglen) { image_section_header *sect_hdr; image_dos_header *dos_hdr; diff --git a/usr.sbin/ndp/Makefile b/usr.sbin/ndp/Makefile index f1566919a2f2..552ac5375cf0 100644 --- a/usr.sbin/ndp/Makefile +++ b/usr.sbin/ndp/Makefile @@ -22,4 +22,6 @@ SRCS= ndp.c gmt2local.c CFLAGS+= -I. -I${.CURDIR} -I${.CURDIR}/../../contrib/tcpdump CFLAGS+= -D_U_="" +WARNS?= 1 + .include diff --git a/usr.sbin/ndp/gnuc.h b/usr.sbin/ndp/gnuc.h deleted file mode 100644 index c6412965c9db..000000000000 --- a/usr.sbin/ndp/gnuc.h +++ /dev/null @@ -1,2 +0,0 @@ -/* $FreeBSD$ */ -/* this is dummy to pacify gmt2local.c. */ diff --git a/usr.sbin/newsyslog/Makefile b/usr.sbin/newsyslog/Makefile index 9c301a1b9d1d..ebc297b4cf2a 100644 --- a/usr.sbin/newsyslog/Makefile +++ b/usr.sbin/newsyslog/Makefile @@ -4,6 +4,4 @@ PROG= newsyslog MAN= newsyslog.8 newsyslog.conf.5 SRCS= newsyslog.c ptimes.c -WARNS?= 2 - .include diff --git a/usr.sbin/newsyslog/newsyslog.8 b/usr.sbin/newsyslog/newsyslog.8 index 3db563f2964c..06714aa4c56b 100644 --- a/usr.sbin/newsyslog/newsyslog.8 +++ b/usr.sbin/newsyslog/newsyslog.8 @@ -17,7 +17,7 @@ .\" the suitability of this software for any purpose. It is .\" provided "as is" without express or implied warranty. .\" -.Dd February 24, 2005 +.Dd January 19, 2010 .Dt NEWSYSLOG 8 .Os .Sh NAME @@ -25,7 +25,7 @@ .Nd maintain system log files to manageable sizes .Sh SYNOPSIS .Nm -.Op Fl CFNnrsv +.Op Fl CFNPnrsv .Op Fl R Ar tagname .Op Fl a Ar directory .Op Fl d Ar directory @@ -169,6 +169,10 @@ This option is intended to be used with the or .Fl CC options when creating log files is the only objective. +.It Fl P +Prevent further action if we should send signal but the +.Dq pidfile +is empty or does not exist. .It Fl R Ar tagname Specify that .Nm diff --git a/usr.sbin/newsyslog/newsyslog.c b/usr.sbin/newsyslog/newsyslog.c index ef74f23917c8..4cadda432030 100644 --- a/usr.sbin/newsyslog/newsyslog.c +++ b/usr.sbin/newsyslog/newsyslog.c @@ -167,6 +167,7 @@ int needroot = 1; /* Root privs are necessary */ int noaction = 0; /* Don't do anything, just show it */ int norotate = 0; /* Don't rotate */ int nosignal; /* Do not send any signals */ +int enforcepid = 0; /* If PID file does not exist or empty, do nothing */ int force = 0; /* Force the trim no matter what */ int rotatereq = 0; /* -R = Always rotate the file(s) as given */ /* on the command (this also requires */ @@ -580,7 +581,7 @@ parse_args(int argc, char **argv) *p = '\0'; /* Parse command line options. */ - while ((ch = getopt(argc, argv, "a:d:f:nrsvCD:FNR:")) != -1) + while ((ch = getopt(argc, argv, "a:d:f:nrsvCD:FNPR:")) != -1) switch (ch) { case 'a': archtodir++; @@ -624,6 +625,9 @@ parse_args(int argc, char **argv) case 'N': norotate++; break; + case 'P': + enforcepid++; + break; case 'R': rotatereq++; requestor = strdup(optarg); @@ -1779,7 +1783,18 @@ set_swpid(struct sigwork_entry *swork, const struct conf_entry *ent) f = fopen(ent->pid_file, "r"); if (f == NULL) { - warn("can't open pid file: %s", ent->pid_file); + if (errno == ENOENT && enforcepid == 0) { + /* + * Warn if the PID file doesn't exist, but do + * not consider it an error. Most likely it + * means the process has been terminated, + * so it should be safe to rotate any log + * files that the process would have been using. + */ + swork->sw_pidok = 1; + warnx("pid file doesn't exist: %s", ent->pid_file); + } else + warn("can't open pid file: %s", ent->pid_file); return; } @@ -1790,7 +1805,7 @@ set_swpid(struct sigwork_entry *swork, const struct conf_entry *ent) * has terminated, so it should be safe to rotate any * log files that the process would have been using. */ - if (feof(f)) { + if (feof(f) && enforcepid == 0) { swork->sw_pidok = 1; warnx("pid file is empty: %s", ent->pid_file); } else diff --git a/usr.sbin/nfsd/Makefile b/usr.sbin/nfsd/Makefile index 3237ce3f9c63..290506773d76 100644 --- a/usr.sbin/nfsd/Makefile +++ b/usr.sbin/nfsd/Makefile @@ -4,6 +4,4 @@ PROG= nfsd MAN= nfsd.8 nfsv4.4 stablerestart.5 -WARNS?= 6 - .include diff --git a/usr.sbin/nfsd/nfsd.c b/usr.sbin/nfsd/nfsd.c index a822eb3133ff..d86309f4e1bb 100644 --- a/usr.sbin/nfsd/nfsd.c +++ b/usr.sbin/nfsd/nfsd.c @@ -842,7 +842,7 @@ setbindhost(struct addrinfo **ai, const char *bindhost, struct addrinfo hints) } void -usage() +usage(void) { (void)fprintf(stderr, "usage: nfsd %s\n", USAGE); exit(1); @@ -868,7 +868,7 @@ reapchild(__unused int signo) } void -unregistration() +unregistration(void) { if ((!rpcb_unset(NFS_PROGRAM, 2, NULL)) || (!rpcb_unset(NFS_PROGRAM, 3, NULL))) @@ -876,7 +876,7 @@ unregistration() } void -killchildren() +killchildren(void) { int i; diff --git a/usr.sbin/nfsd/nfsv4.4 b/usr.sbin/nfsd/nfsv4.4 index 70b145b98752..29e16096dcfb 100644 --- a/usr.sbin/nfsd/nfsv4.4 +++ b/usr.sbin/nfsd/nfsv4.4 @@ -24,22 +24,20 @@ .\" .\" $FreeBSD$ .\" -.Dd April 30, 2009 +.Dd December 3, 2009 .Dt NFSV4 4 .Os .Sh NAME -.Nm nfsv4 +.Nm NFSv4 .Nd NFS Version 4 Protocol -.Sh SYNOPSIS -experimental client and server with NFSv4 support .Sh DESCRIPTION -The experimental nfs client and server provides support for the +The experimental NFS client and server provides support for the .Tn NFSv4 specification; see .%T "Network File System (NFS) Version 4 Protocol \\*(tNRFC\\*(sP 3530" . The protocol is somewhat similar to NFS Version 3, but differs in significant ways. -It uses a single Compound RPC that concatenates operations to-gether. +It uses a single compound RPC that concatenates operations to-gether. Each of these operations are similar to the RPCs of NFS Version 3. The operations in the compound are performed in order, until one of them fails (returns an error) and then the RPC terminates at that point. @@ -48,10 +46,10 @@ It has integrated locking support, which implies that the server is no longer stateless. As such, the -.Tn NFSv4 -server remains in recovery mode for a Grace period (always greater than the +.Nm +server remains in recovery mode for a grace period (always greater than the lease duration the server uses) after a reboot. -During this Grace period, clients may recover state but not perform other +During this grace period, clients may recover state but not perform other open/lock state changing operations. To provide for correct recovery semantics, a small file described by .Xr stablerestart 5 @@ -61,14 +59,14 @@ the server will not start. If this file is lost, it should be recovered from backups, since creating an empty .Xr stablerestart 5 -file will result in the server starting without providing a Grace Period +file will result in the server starting without providing a grace period for recovery. Note that recovery only occurs when the server machine is rebooted, not when the .Xr nfsd 8 are just restarted. .Pp -It provides several optional features not in NFS Version 3: +It provides several optional features not present in NFS Version 3: .sp .Bd -literal -offset indent -compact - NFS Version 4 ACLs @@ -78,7 +76,7 @@ It provides several optional features not in NFS Version 3: .Ed .Pp The -.Tn NFSv4 +.Nm protocol does not use a separate mount protocol and assumes that the server provides a single file system tree structure, rooted at the point in the local file system tree specified by one or more @@ -131,7 +129,7 @@ by default. However, this can normally be overridden by a command line option or configuration file for the daemon used to do the name<->number mapping. -On FreeBSD, the mapping daemon is called +Under FreeBSD, the mapping daemon is called .Xr nfsuserd 8 and has a command line option that overrides the domain component of the machine's hostname. @@ -143,7 +141,7 @@ report a lot of ``nobody'' and ``nogroup'' ownerships. .Pp Although uid/gid numbers are no longer used in the .Nm -protocol, they will still be in the RPC authentication fields when running +protocol, they will still be in the RPC authentication fields when using AUTH_SYS (sec=sys), which is the default. As such, in this case both the user/group name and number spaces must be consistent between the client and server. @@ -154,8 +152,8 @@ with RPCSEC_GSS (sec=krb5, krb5i, krb5p), only names and KerberosV tickets will go on the wire. .Sh SERVER SETUP .Pp -To set up the experimental nfs server that supports -.Nm +To set up the experimental NFS server that supports +.Nm , you will need to either build a kernel with: .sp .Bd -literal -offset indent -compact @@ -318,13 +316,13 @@ variables. NFS V4 stable restart file .El .Sh SEE ALSO -.Xr stablerestart 5 -.Xr mountd 8 -.Xr nfscbd 8 -.Xr nfsd 8 -.Xr nfsdumpstate 8 -.Xr nfsrevoke 8 -.Xr nfsuserd 8 +.Xr stablerestart 5 , +.Xr mountd 8 , +.Xr nfscbd 8 , +.Xr nfsd 8 , +.Xr nfsdumpstate 8 , +.Xr nfsrevoke 8 , +.Xr nfsuserd 8 , .Sh BUGS At this time, there is no recall of delegations for local file system operations. diff --git a/usr.sbin/nfsd/stablerestart.5 b/usr.sbin/nfsd/stablerestart.5 index c469835fc0db..172dd4b5d9c2 100644 --- a/usr.sbin/nfsd/stablerestart.5 +++ b/usr.sbin/nfsd/stablerestart.5 @@ -24,23 +24,23 @@ .\" .\" $FreeBSD$ .\" -.Dd Sept 7, 2007 +.Dd December 3, 2009 .Dt STABLERESTART 5 .Os .Sh NAME .Nm nfs-stablerestart -.Nd handles restart edge conditions for the -.Tn NFS -V4 server +.Nd restart information for the +.Tn NFSv4 +server .Sh SYNOPSIS .Nm nfs-stablerestart .Sh DESCRIPTION The .Nm file holds information that allows the -.Tn NFS -V4 server to restart without always returning the NFSERR_NOGRACE error, as described in the -.Tn NFS V4 +.Tn NFSv4 +server to restart without always returning the NFSERR_NOGRACE error, as described in the +.Tn NFSv4 server specification; see .%T "Network File System (NFS) Version 4 Protocol \\*(tNRFC\\*(sP 3530, Section 8.6.3" . .Pp @@ -49,11 +49,11 @@ The first record in the file, as defined by struct nfsf_rec in last incarnation of the server and the number of boot times that follows. Following this are the number of previous boot times listed in the first record. -The lease duration is used to set the Grace Period. +The lease duration is used to set the grace period. The boot times are used to avoid the unlikely occurrence of a boot time being reused, due to a TOD clock going backwards. This record and the previous boot times with this boot time added is re-written at the -end of the Grace Period. +end of the grace period. .Pp The rest of the file are appended records, as defined by struct nfst_rec in /usr/include/fs/nfs/nfsrvstate.h and are used @@ -77,14 +77,14 @@ a local disk drive that holds the file, or similar. .Sh FILES .Bl -tag -width /var/db/nfs-stablerestart -compact .It Pa /var/db/nfs-stablerestart -NFS V4 stable restart file +NFSv4 stable restart file .El .Sh SEE ALSO -.Xr nfsv4 4 +.Xr nfsv4 4 , .Xr nfsd 8 .Sh BUGS -If the file is empty, the NFS V4 server has no choice but to return -NFSERR_NOGRACE for all Reclaim requests. Although correct, this is +If the file is empty, the NFSv4 server has no choice but to return +NFSERR_NOGRACE for all reclaim requests. Although correct, this is a highly undesirable occurrence, so the file should not be lost if at all possible. Nfsd will not create the file if it does not exist and will simply log a failure to start, in the hopes that the diff --git a/usr.sbin/nghook/Makefile b/usr.sbin/nghook/Makefile index 73f2df3bf935..e427f2603cc9 100644 --- a/usr.sbin/nghook/Makefile +++ b/usr.sbin/nghook/Makefile @@ -4,7 +4,6 @@ PROG= nghook MAN= nghook.8 SRCS= main.c -WARNS?= 6 DPADD= ${LIBNETGRAPH} LDADD= -lnetgraph diff --git a/usr.sbin/nscd/nscd.conf.5 b/usr.sbin/nscd/nscd.conf.5 index f64ce277938c..727e3e6f7b3a 100644 --- a/usr.sbin/nscd/nscd.conf.5 +++ b/usr.sbin/nscd/nscd.conf.5 @@ -106,7 +106,7 @@ The default policy is fifo. This is the internal hash table size. The value should be a prime number for optimum performance. You should only change this value when the number of cached elements is -significantly (in 5-10 times) greater then the default hash table size (255). +significantly (5-10 times) greater than the default hash table size (257). .It Va keep-hot-count Oo Ar cachename Oc Op Ar value The size limit of the cache with the given .Ar cachename . diff --git a/usr.sbin/ntp/Makefile b/usr.sbin/ntp/Makefile index 86e447ddfb61..31ee56461e6e 100644 --- a/usr.sbin/ntp/Makefile +++ b/usr.sbin/ntp/Makefile @@ -1,7 +1,7 @@ # Makefile for ntpd. # $FreeBSD$ -SUBDIR= libopts libntp libparse ntpd ntpdc ntpq ntpdate ntptrace \ +SUBDIR= libopts libntp libparse ntpd ntpdc ntpq ntpdate \ ntptime ntp-keygen sntp SUBDIR+= doc diff --git a/usr.sbin/ntp/Makefile.inc b/usr.sbin/ntp/Makefile.inc index f81905a418af..5095e89bbfbc 100644 --- a/usr.sbin/ntp/Makefile.inc +++ b/usr.sbin/ntp/Makefile.inc @@ -18,4 +18,6 @@ LIBOPTS= ${.OBJDIR}/../libopts/libopts.a LIBPARSE= ${.OBJDIR}/../libparse/libparse.a LIBNTP= ${.OBJDIR}/../libntp/libntp.a +WARNS?= 0 + .include "../Makefile.inc" diff --git a/usr.sbin/ntp/config.h b/usr.sbin/ntp/config.h index 518cd8ca565d..8359b301d971 100644 --- a/usr.sbin/ntp/config.h +++ b/usr.sbin/ntp/config.h @@ -947,7 +947,7 @@ /* #undef HAVE_UTMPX_H */ /* Define to 1 if you have the header file. */ -#define HAVE_UTMP_H 1 +/* #undef HAVE_UTMP_H */ /* Define to 1 if you have the header file. */ /* #undef HAVE_VALUES_H */ diff --git a/usr.sbin/ntp/doc/Makefile b/usr.sbin/ntp/doc/Makefile index f1326fcd20dc..64e357155bea 100644 --- a/usr.sbin/ntp/doc/Makefile +++ b/usr.sbin/ntp/doc/Makefile @@ -24,7 +24,7 @@ FILES= accopt.html assoc.html audio.html authopt.html build.html \ .endif MAN= ntp.conf.5 ntp.keys.5 -MAN+= ntp-keygen.8 ntpd.8 ntpdate.8 ntpdc.8 ntpq.8 ntptime.8 ntptrace.8 +MAN+= ntp-keygen.8 ntpd.8 ntpdate.8 ntpdc.8 ntpq.8 ntptime.8 .PATH: ${.CURDIR}/../../../contrib/ntp/html \ ${.CURDIR}/../../../contrib/ntp/html/build \ diff --git a/usr.sbin/ntp/doc/ntpd.8 b/usr.sbin/ntp/doc/ntpd.8 index 5194b758c6d0..a55fe43de299 100644 --- a/usr.sbin/ntp/doc/ntpd.8 +++ b/usr.sbin/ntp/doc/ntpd.8 @@ -121,7 +121,7 @@ Normally, .Nm exits with a message to the system log if the offset exceeds the panic threshold, which is 1000 s by default. -This option allows thetime to be set to any value without restriction; +This option allows the time to be set to any value without restriction; however, this can happen only once. If the threshold is exceeded after that, .Nm diff --git a/usr.sbin/ntp/ntptrace/Makefile b/usr.sbin/ntp/ntptrace/Makefile deleted file mode 100644 index 8d7547cf5ea1..000000000000 --- a/usr.sbin/ntp/ntptrace/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $FreeBSD$ - -.PATH: ${.CURDIR}/../scripts - -SCRIPTS= ntptrace -NO_MAN= -NO_OBJ= - -.include diff --git a/usr.sbin/nvram/Makefile b/usr.sbin/nvram/Makefile index 3cca03756507..2c6e43c8fcb4 100644 --- a/usr.sbin/nvram/Makefile +++ b/usr.sbin/nvram/Makefile @@ -4,6 +4,4 @@ PROG= nvram MAN= nvram.8 MANSUBDIR= /powerpc -WARNS?= 6 - .include diff --git a/usr.sbin/ofwdump/Makefile b/usr.sbin/ofwdump/Makefile index a20e94f9b335..ca4f4868db53 100644 --- a/usr.sbin/ofwdump/Makefile +++ b/usr.sbin/ofwdump/Makefile @@ -4,6 +4,4 @@ PROG= ofwdump MAN= ofwdump.8 SRCS= ofwdump.c ofw_util.c -WARNS?= 6 - .include diff --git a/usr.sbin/pciconf/Makefile b/usr.sbin/pciconf/Makefile index e57e736fe2c1..9fbec00ce0e2 100644 --- a/usr.sbin/pciconf/Makefile +++ b/usr.sbin/pciconf/Makefile @@ -7,4 +7,6 @@ MAN= pciconf.8 CFLAGS+= -I${.CURDIR}/../../sys +WARNS?= 3 + .include diff --git a/usr.sbin/pkg_install/add/main.c b/usr.sbin/pkg_install/add/main.c index eaed0c0c2eb9..d9b381bdd9b1 100644 --- a/usr.sbin/pkg_install/add/main.c +++ b/usr.sbin/pkg_install/add/main.c @@ -344,7 +344,7 @@ getpackagesite(void) } static void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n", "usage: pkg_add [-viInfFrRMSK] [-t template] [-p prefix] [-P prefix] [-C chrootdir]", diff --git a/usr.sbin/pkg_install/create/main.c b/usr.sbin/pkg_install/create/main.c index b98b21ee9db1..d85392dc9c7d 100644 --- a/usr.sbin/pkg_install/create/main.c +++ b/usr.sbin/pkg_install/create/main.c @@ -249,7 +249,7 @@ main(int argc, char **argv) } static void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n", "usage: pkg_create [-YNOhjnvyz] [-C conflicts] [-P pkgs] [-p prefix]", diff --git a/usr.sbin/pkg_install/delete/Makefile b/usr.sbin/pkg_install/delete/Makefile index c346ea705d79..c9a0fdebea22 100644 --- a/usr.sbin/pkg_install/delete/Makefile +++ b/usr.sbin/pkg_install/delete/Makefile @@ -5,7 +5,6 @@ SRCS= main.c perform.c CFLAGS+= -I${.CURDIR}/../lib -WARNS?= 6 WFORMAT?= 1 DPADD= ${LIBINSTALL} ${LIBMD} diff --git a/usr.sbin/pkg_install/delete/main.c b/usr.sbin/pkg_install/delete/main.c index 6075f72ab10b..f09a432f2bb4 100644 --- a/usr.sbin/pkg_install/delete/main.c +++ b/usr.sbin/pkg_install/delete/main.c @@ -170,7 +170,7 @@ main(int argc, char **argv) } static void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n", "usage: pkg_delete [-dDfGinrvxX] [-p prefix] pkg-name ...", diff --git a/usr.sbin/pkg_install/info/Makefile b/usr.sbin/pkg_install/info/Makefile index 675f7ca454ac..485cb2263210 100644 --- a/usr.sbin/pkg_install/info/Makefile +++ b/usr.sbin/pkg_install/info/Makefile @@ -5,7 +5,6 @@ SRCS= main.c perform.c show.c CFLAGS+= -I${.CURDIR}/../lib -WARNS?= 6 WFORMAT?= 1 DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} diff --git a/usr.sbin/pkg_install/info/main.c b/usr.sbin/pkg_install/info/main.c index 08ab23b22956..2de638e4cad3 100644 --- a/usr.sbin/pkg_install/info/main.c +++ b/usr.sbin/pkg_install/info/main.c @@ -282,7 +282,7 @@ main(int argc, char **argv) } static void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", "usage: pkg_info [-bcdDEfgGiIjkKLmopPqQrRsvVxX] [-e package] [-l prefix]", diff --git a/usr.sbin/pkg_install/lib/lib.h b/usr.sbin/pkg_install/lib/lib.h index a3d04138797f..4a6c6255b125 100644 --- a/usr.sbin/pkg_install/lib/lib.h +++ b/usr.sbin/pkg_install/lib/lib.h @@ -105,7 +105,7 @@ * Version of the package tools - increase whenever you make a change * in the code that is not cosmetic only. */ -#define PKG_INSTALL_VERSION 20090902 +#define PKG_INSTALL_VERSION 20100122 #define PKG_WRAPCONF_FNAME "/var/db/pkg_install.conf" #define main(argc, argv) real_main(argc, argv) diff --git a/usr.sbin/pkg_install/updating/Makefile b/usr.sbin/pkg_install/updating/Makefile index cf8bfc8718c0..b0d3689779e6 100644 --- a/usr.sbin/pkg_install/updating/Makefile +++ b/usr.sbin/pkg_install/updating/Makefile @@ -5,7 +5,6 @@ SRCS= main.c CFLAGS+= -I${.CURDIR}/../lib -WARNS?= 6 WFORMAT?= 1 DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} diff --git a/usr.sbin/pkg_install/updating/main.c b/usr.sbin/pkg_install/updating/main.c index e189c01f7fdc..0ab2ec0fe8ea 100644 --- a/usr.sbin/pkg_install/updating/main.c +++ b/usr.sbin/pkg_install/updating/main.c @@ -10,7 +10,11 @@ #include __FBSDID("$FreeBSD$"); + +#include +#include #include +#include #include #include #include @@ -115,10 +119,10 @@ main(int argc, char *argv[]) if (argc != 0) { pflag = 1; while (*argv) { - if((curr = (INSTALLEDPORT *) + if ((curr = (INSTALLEDPORT *) malloc(sizeof(INSTALLEDPORT))) == NULL) (void)exit(EXIT_FAILURE); - strlcpy (curr->name, *argv, strlen(*argv) + 1); + strlcpy(curr->name, *argv, strlen(*argv) + 1); curr->next = head; head = curr; (void)*argv++; @@ -131,22 +135,22 @@ main(int argc, char *argv[]) */ if (pflag == 0) { /* Open /var/db/pkg and search for all installed ports. */ - if((dir = opendir(pkgdbpath)) != NULL) { + if ((dir = opendir(pkgdbpath)) != NULL) { while ((pkgdbdir = readdir(dir)) != NULL) { if (strcmp(pkgdbdir->d_name, ".") != 0 && - strcmp(pkgdbdir->d_name, "..") !=0) { + strcmp(pkgdbdir->d_name, "..") != 0) { /* Create path to +CONTENTS file for each installed port */ n = strlcpy(tmp_file, pkgdbpath, strlen(pkgdbpath)+1); n = strlcpy(tmp_file + n, "/", sizeof(tmp_file) - n); n = strlcat(tmp_file + n, pkgdbdir->d_name, sizeof(tmp_file) - n); - if(stat(tmp_file, &attribute) == -1) { + if (stat(tmp_file, &attribute) == -1) { fprintf(stderr, "can't open %s: %s\n", tmp_file, strerror(errno)); return EXIT_FAILURE; } - if(attribute.st_mode & S_IFREG) + if (attribute.st_mode & S_IFREG) continue; (void)strlcat(tmp_file + n, "/", sizeof(tmp_file) - n); @@ -155,7 +159,7 @@ main(int argc, char *argv[]) /* Open +CONTENT file */ fd = fopen(tmp_file, "r"); - if(fd == NULL) { + if (fd == NULL) { fprintf(stderr, "warning: can't open %s: %s\n", tmp_file, strerror(errno)); continue; @@ -165,14 +169,14 @@ main(int argc, char *argv[]) * Parses +CONTENT for ORIGIN line and * put element into linked list. */ - while(fgets(originline, maxcharperline, fd) != NULL) { + while (fgets(originline, maxcharperline, fd) != NULL) { tmpline1 = strstr(originline, origin); - if( tmpline1 != NULL ) { + if (tmpline1 != NULL) { /* Tmp variable to store port name. */ char *pname; pname = strrchr(originline, (int)':'); pname++; - if((curr = (INSTALLEDPORT *) + if ((curr = (INSTALLEDPORT *) malloc(sizeof(INSTALLEDPORT))) == NULL) (void)exit(EXIT_FAILURE); if (pname[strlen(pname) - 1] == '\n') @@ -183,7 +187,7 @@ main(int argc, char *argv[]) } } - if(ferror(fd)) { + if (ferror(fd)) { fprintf(stderr, "error reading input\n"); exit(EX_IOERR); } @@ -195,32 +199,41 @@ main(int argc, char *argv[]) } } - /* Open UPDATING file */ - fd = fopen(updatingfile, "r"); - if(fd == NULL) { + /* Fetch UPDATING file if needed and open file */ + if (isURL(updatingfile)) { + if ((fd = fetchGetURL(updatingfile, "")) == NULL) { + fprintf(stderr, "Error: Unable to get %s: %s\n", + updatingfile, fetchLastErrString); + exit(EX_UNAVAILABLE); + } + } + else { + fd = fopen(updatingfile, "r"); + } + if (fd == NULL) { fprintf(stderr, "can't open %s: %s\n", - updatingfile, strerror(errno)); + updatingfile, strerror(errno)); exit(EX_UNAVAILABLE); } /* Parse opened UPDATING file. */ - while(fgets(updatingline, maxcharperline, fd) != NULL) { + while (fgets(updatingline, maxcharperline, fd) != NULL) { /* No entry is found so far */ if (found == 0) { /* Search for AFFECTS line to parse the portname. */ tmpline1 = strstr(updatingline, affects); - if( tmpline1 != NULL ) { + if (tmpline1 != NULL) { curr = head; - while(curr != NULL) { + while (curr != NULL) { tmpline2 = strstr(updatingline, curr->name); - if( tmpline2 != NULL ) + if (tmpline2 != NULL) break; curr = curr->next; } - if( tmpline2 != NULL ) { + if (tmpline2 != NULL) { /* If -d is set, check if entry is newer than the date. */ - if ( (dflag == 1) && (strncmp(dateline, date, 8) < 0)) + if ((dflag == 1) && (strncmp(dateline, date, 8) < 0)) continue; printf("%s", dateline); printf("%s", updatingline); @@ -231,7 +244,7 @@ main(int argc, char *argv[]) /* Search for the end of an entry, if not found print the line. */ else { tmpline1 = strstr(updatingline, end); - if( tmpline1 == NULL ) + if (tmpline1 == NULL) printf("%s", updatingline); else { linelength = strlen(updatingline); @@ -245,7 +258,7 @@ main(int argc, char *argv[]) dateline = strdup(updatingline); } - if(ferror(fd)) { + if (ferror(fd)) { fprintf(stderr, "error reading input\n"); exit(EX_IOERR); } diff --git a/usr.sbin/pkg_install/updating/pkg_updating.1 b/usr.sbin/pkg_install/updating/pkg_updating.1 index e3bcb546c705..0c35f9a2979b 100644 --- a/usr.sbin/pkg_install/updating/pkg_updating.1 +++ b/usr.sbin/pkg_install/updating/pkg_updating.1 @@ -45,26 +45,31 @@ Print help message. .El .Sh EXAMPLES .Bl -tag -width indent -.Dl pkg_updating +Shows all entries of all installed ports: .Pp -Shows all entries of all installed ports. +.Dl % pkg_updating .Pp -.Dl pkg_updating -d 20070101 +Shows all entries of all installed ports since 2007-01-01: .Pp -Shows all entries of all installed ports since 2007-01-01. +.Dl % pkg_updating -d 20070101 .Pp -.Dl pkg_updating apache mysql +Shows all entries for all apache and mysql ports: .Pp -Shows all entries for all apache and mysql ports. +.Dl % pkg_updating apache mysql .Pp -.Dl pkg_updating -d 20060101 apache +Shows all apache entries since 2006-01-01: .Pp -Shows all apache entries since 2006-01-01. -.Pp -.Dl pkg_updating -f /tmp/UPDATING +.Dl % pkg_updating -d 20060101 apache .Pp Defines that the UPDATING file is in /tmp and shows all entries of all -installed ports +installed ports: +.Pp +.Dl % pkg_updating -f /tmp/UPDATING +.Pp +Fetch UPDATING file from ftp mirror and show all entries of all +installed ports: +.Pp +.Dl % pkg_updating -f ftp://ftp.freebsd.org/pub/FreeBSD/ports/packages/UPDATING .Pp .El .Sh ENVIRONMENT diff --git a/usr.sbin/pkg_install/version/Makefile b/usr.sbin/pkg_install/version/Makefile index 71168ee3d23f..3e1d7a522f27 100644 --- a/usr.sbin/pkg_install/version/Makefile +++ b/usr.sbin/pkg_install/version/Makefile @@ -5,7 +5,6 @@ SRCS= main.c perform.c CFLAGS+= -I${.CURDIR}/../lib -WARNS?= 6 WFORMAT?= 1 DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD} diff --git a/usr.sbin/pkg_install/version/main.c b/usr.sbin/pkg_install/version/main.c index f46d945f4ef5..cad8583c23bf 100644 --- a/usr.sbin/pkg_install/version/main.c +++ b/usr.sbin/pkg_install/version/main.c @@ -127,7 +127,7 @@ main(int argc, char **argv) } static void -usage() +usage(void) { fprintf(stderr, "%s\n%s\n%s\n", "usage: pkg_version [-hIoqv] [-l limchar] [-L limchar] [[-X] -s string] [-O origin] [index]", diff --git a/usr.sbin/pmcannotate/Makefile b/usr.sbin/pmcannotate/Makefile index e087bb3c28e7..cff1efb5ccfa 100644 --- a/usr.sbin/pmcannotate/Makefile +++ b/usr.sbin/pmcannotate/Makefile @@ -5,8 +5,6 @@ PROG= pmcannotate MAN= pmcannotate.8 -WARNS?= 6 - SRCS= pmcannotate.c .include diff --git a/usr.sbin/pmcannotate/pmcannotate.c b/usr.sbin/pmcannotate/pmcannotate.c index 1a5dec2b6d13..1f39f257f072 100644 --- a/usr.sbin/pmcannotate/pmcannotate.c +++ b/usr.sbin/pmcannotate/pmcannotate.c @@ -325,7 +325,7 @@ fqueue_compact(float th) * Flush the first-level aggregates queue. */ static void -fqueue_deleteall() +fqueue_deleteall(void) { struct aggent *agg; @@ -472,7 +472,7 @@ fqueue_insertgen(void) * Flush the raw entries general queue. */ static void -general_deleteall() +general_deleteall(void) { struct entry *obj; diff --git a/usr.sbin/pmccontrol/Makefile b/usr.sbin/pmccontrol/Makefile index 9dafe1c3fbd5..0f6dc768d8eb 100644 --- a/usr.sbin/pmccontrol/Makefile +++ b/usr.sbin/pmccontrol/Makefile @@ -8,8 +8,6 @@ MAN= pmccontrol.8 DPADD= ${LIBPMC} LDADD= -lpmc -WARNS?= 6 - SRCS= pmccontrol.c .include diff --git a/usr.sbin/pmcstat/Makefile b/usr.sbin/pmcstat/Makefile index 6b11d8d945af..c27e56d8d13b 100644 --- a/usr.sbin/pmcstat/Makefile +++ b/usr.sbin/pmcstat/Makefile @@ -5,11 +5,10 @@ PROG= pmcstat MAN= pmcstat.8 -DPADD= ${LIBELF} ${LIBKVM} ${LIBPMC} ${LIBM} -LDADD= -lelf -lkvm -lpmc -lm +DPADD= ${LIBELF} ${LIBKVM} ${LIBPMC} ${LIBM} ${LIBNCURSES} +LDADD= -lelf -lkvm -lpmc -lm -lncurses -WARNS?= 6 - -SRCS= pmcstat.c pmcstat.h pmcstat_log.c +SRCS= pmcstat.c pmcstat.h pmcstat_log.c \ +pmcpl_callgraph.c pmcpl_gprof.c pmcpl_annotate.c pmcpl_calltree.c .include diff --git a/usr.sbin/pmcstat/pmcpl_annotate.c b/usr.sbin/pmcstat/pmcpl_annotate.c new file mode 100644 index 000000000000..802983cd9bd0 --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_annotate.c @@ -0,0 +1,111 @@ +/*- + * Copyright (c) 2005-2007, Joseph Koshy + * Copyright (c) 2007 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * + * 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. + */ + +/* + * Transform a hwpmc(4) log into human readable form, and into + * gprof(1) compatible profiles. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pmcstat.h" +#include "pmcstat_log.h" +#include "pmcpl_annotate.h" + +/* + * Record a callchain. + */ + +void +pmcpl_annotate_process(struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu) +{ + struct pmcstat_pcmap *map; + struct pmcstat_symbol *sym; + uintfptr_t newpc; + struct pmcstat_image *image; + + (void) pmcr; (void) nsamples; (void) usermode; (void) cpu; + + map = pmcstat_process_find_map(usermode ? pp : pmcstat_kernproc, cc[0]); + if (map == NULL) { + /* Unknown offset. */ + pmcstat_stats.ps_samples_unknown_offset++; + return; + } + + assert(cc[0] >= map->ppm_lowpc && cc[0] < map->ppm_highpc); + + image = map->ppm_image; + newpc = cc[0] - (map->ppm_lowpc + + (image->pi_vaddr - image->pi_start)); + sym = pmcstat_symbol_search(image, newpc); + if (sym == NULL) + return; + + fprintf(args.pa_graphfile, "%p %s 0x%jx 0x%jx\n", + (void *)cc[0], + pmcstat_string_unintern(sym->ps_name), + (uintmax_t)(sym->ps_start + + image->pi_vaddr), (uintmax_t)(sym->ps_end + + image->pi_vaddr)); +} diff --git a/usr.sbin/pmcstat/pmcpl_annotate.h b/usr.sbin/pmcstat/pmcpl_annotate.h new file mode 100644 index 000000000000..482bcd41e8d8 --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_annotate.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2005-2007, Joseph Koshy + * Copyright (c) 2007 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * + * 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$ + */ + +#ifndef _PMCSTAT_PL_ANNOTATE_H_ +#define _PMCSTAT_PL_ANNOTATE_H_ + +/* Function prototypes */ +void pmcpl_annotate_process( + struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu); + +#endif /* _PMCSTAT_PL_ANNOTATE_H_ */ diff --git a/usr.sbin/pmcstat/pmcpl_callgraph.c b/usr.sbin/pmcstat/pmcpl_callgraph.c new file mode 100644 index 000000000000..d6f1a9d26973 --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_callgraph.c @@ -0,0 +1,682 @@ +/*- + * Copyright (c) 2005-2007, Joseph Koshy + * Copyright (c) 2007 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * + * 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. + */ + +/* + * Transform a hwpmc(4) log into human readable form, and into + * gprof(1) compatible profiles. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pmcstat.h" +#include "pmcstat_log.h" +#include "pmcstat_top.h" +#include "pmcpl_callgraph.h" + +/* Get the sample value in percent related to nsamples. */ +#define PMCPL_CG_COUNTP(a) \ + ((a)->pcg_count * 100.0 / nsamples) + +/* + * The toplevel CG nodes (i.e., with rank == 0) are placed in a hash table. + */ + +struct pmcstat_cgnode_hash_list pmcstat_cgnode_hash[PMCSTAT_NHASH]; +int pmcstat_cgnode_hash_count; + +static pmcstat_interned_string pmcstat_previous_filename_printed; + +static struct pmcstat_cgnode * +pmcstat_cgnode_allocate(struct pmcstat_image *image, uintfptr_t pc) +{ + struct pmcstat_cgnode *cg; + + if ((cg = malloc(sizeof(*cg))) == NULL) + err(EX_OSERR, "ERROR: Cannot allocate callgraph node"); + + cg->pcg_image = image; + cg->pcg_func = pc; + + cg->pcg_count = 0; + cg->pcg_nchildren = 0; + LIST_INIT(&cg->pcg_children); + + return (cg); +} + +/* + * Free a node and its children. + */ +static void +pmcstat_cgnode_free(struct pmcstat_cgnode *cg) +{ + struct pmcstat_cgnode *cgc, *cgtmp; + + LIST_FOREACH_SAFE(cgc, &cg->pcg_children, pcg_sibling, cgtmp) + pmcstat_cgnode_free(cgc); + free(cg); +} + +/* + * Look for a callgraph node associated with pmc `pmcid' in the global + * hash table that corresponds to the given `pc' value in the process + * `pp'. + */ +static struct pmcstat_cgnode * +pmcstat_cgnode_hash_lookup_pc(struct pmcstat_process *pp, pmc_id_t pmcid, + uintfptr_t pc, int usermode) +{ + struct pmcstat_pcmap *ppm; + struct pmcstat_symbol *sym; + struct pmcstat_image *image; + struct pmcstat_cgnode *cg; + struct pmcstat_cgnode_hash *h; + uintfptr_t loadaddress; + unsigned int i, hash; + + ppm = pmcstat_process_find_map(usermode ? pp : pmcstat_kernproc, pc); + if (ppm == NULL) + return (NULL); + + image = ppm->ppm_image; + + loadaddress = ppm->ppm_lowpc + image->pi_vaddr - image->pi_start; + pc -= loadaddress; /* Convert to an offset in the image. */ + + /* + * Try determine the function at this offset. If we can't + * find a function round leave the `pc' value alone. + */ + if ((sym = pmcstat_symbol_search(image, pc)) != NULL) + pc = sym->ps_start; + + for (hash = i = 0; i < sizeof(uintfptr_t); i++) + hash += (pc >> i) & 0xFF; + + hash &= PMCSTAT_HASH_MASK; + + cg = NULL; + LIST_FOREACH(h, &pmcstat_cgnode_hash[hash], pch_next) + { + if (h->pch_pmcid != pmcid) + continue; + + cg = h->pch_cgnode; + + assert(cg != NULL); + + if (cg->pcg_image == image && cg->pcg_func == pc) + return (cg); + } + + /* + * We haven't seen this (pmcid, pc) tuple yet, so allocate a + * new callgraph node and a new hash table entry for it. + */ + cg = pmcstat_cgnode_allocate(image, pc); + if ((h = malloc(sizeof(*h))) == NULL) + err(EX_OSERR, "ERROR: Could not allocate callgraph node"); + + h->pch_pmcid = pmcid; + h->pch_cgnode = cg; + LIST_INSERT_HEAD(&pmcstat_cgnode_hash[hash], h, pch_next); + + pmcstat_cgnode_hash_count++; + + return (cg); +} + +/* + * Compare two callgraph nodes for sorting. + */ +static int +pmcstat_cgnode_compare(const void *a, const void *b) +{ + const struct pmcstat_cgnode *const *pcg1, *const *pcg2, *cg1, *cg2; + + pcg1 = (const struct pmcstat_cgnode *const *) a; + cg1 = *pcg1; + pcg2 = (const struct pmcstat_cgnode *const *) b; + cg2 = *pcg2; + + /* Sort in reverse order */ + if (cg1->pcg_count < cg2->pcg_count) + return (1); + if (cg1->pcg_count > cg2->pcg_count) + return (-1); + return (0); +} + +/* + * Find (allocating if a needed) a callgraph node in the given + * parent with the same (image, pcoffset) pair. + */ + +static struct pmcstat_cgnode * +pmcstat_cgnode_find(struct pmcstat_cgnode *parent, struct pmcstat_image *image, + uintfptr_t pcoffset) +{ + struct pmcstat_cgnode *child; + + LIST_FOREACH(child, &parent->pcg_children, pcg_sibling) { + if (child->pcg_image == image && + child->pcg_func == pcoffset) + return (child); + } + + /* + * Allocate a new structure. + */ + + child = pmcstat_cgnode_allocate(image, pcoffset); + + /* + * Link it into the parent. + */ + LIST_INSERT_HEAD(&parent->pcg_children, child, pcg_sibling); + parent->pcg_nchildren++; + + return (child); +} + +/* + * Print one callgraph node. The output format is: + * + * indentation %(parent's samples) #nsamples function@object + */ +static void +pmcstat_cgnode_print(struct pmcstat_cgnode *cg, int depth, uint32_t total) +{ + uint32_t n; + const char *space; + struct pmcstat_symbol *sym; + struct pmcstat_cgnode **sortbuffer, **cgn, *pcg; + + space = " "; + + if (depth > 0) + (void) fprintf(args.pa_graphfile, "%*s", depth, space); + + if (cg->pcg_count == total) + (void) fprintf(args.pa_graphfile, "100.0%% "); + else + (void) fprintf(args.pa_graphfile, "%05.2f%% ", + 100.0 * cg->pcg_count / total); + + n = fprintf(args.pa_graphfile, " [%u] ", cg->pcg_count); + + /* #samples is a 12 character wide field. */ + if (n < 12) + (void) fprintf(args.pa_graphfile, "%*s", 12 - n, space); + + if (depth > 0) + (void) fprintf(args.pa_graphfile, "%*s", depth, space); + + sym = pmcstat_symbol_search(cg->pcg_image, cg->pcg_func); + if (sym) + (void) fprintf(args.pa_graphfile, "%s", + pmcstat_string_unintern(sym->ps_name)); + else + (void) fprintf(args.pa_graphfile, "%p", + (void *) (cg->pcg_image->pi_vaddr + cg->pcg_func)); + + if (pmcstat_previous_filename_printed != + cg->pcg_image->pi_fullpath) { + pmcstat_previous_filename_printed = cg->pcg_image->pi_fullpath; + (void) fprintf(args.pa_graphfile, " @ %s\n", + pmcstat_string_unintern( + pmcstat_previous_filename_printed)); + } else + (void) fprintf(args.pa_graphfile, "\n"); + + if (cg->pcg_nchildren == 0) + return; + + if ((sortbuffer = (struct pmcstat_cgnode **) + malloc(sizeof(struct pmcstat_cgnode *) * + cg->pcg_nchildren)) == NULL) + err(EX_OSERR, "ERROR: Cannot print callgraph"); + cgn = sortbuffer; + + LIST_FOREACH(pcg, &cg->pcg_children, pcg_sibling) + *cgn++ = pcg; + + assert(cgn - sortbuffer == (int) cg->pcg_nchildren); + + qsort(sortbuffer, cg->pcg_nchildren, sizeof(struct pmcstat_cgnode *), + pmcstat_cgnode_compare); + + for (cgn = sortbuffer, n = 0; n < cg->pcg_nchildren; n++, cgn++) + pmcstat_cgnode_print(*cgn, depth+1, cg->pcg_count); + + free(sortbuffer); +} + +/* + * Record a callchain. + */ + +void +pmcpl_cg_process(struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu) +{ + uintfptr_t pc, loadaddress; + uint32_t n; + struct pmcstat_image *image; + struct pmcstat_pcmap *ppm; + struct pmcstat_symbol *sym; + struct pmcstat_cgnode *parent, *child; + struct pmcstat_process *km; + pmc_id_t pmcid; + + (void) cpu; + + /* + * Find the callgraph node recorded in the global hash table + * for this (pmcid, pc). + */ + + pc = cc[0]; + pmcid = pmcr->pr_pmcid; + parent = pmcstat_cgnode_hash_lookup_pc(pp, pmcid, pc, usermode); + if (parent == NULL) { + pmcstat_stats.ps_callchain_dubious_frames++; + return; + } + + parent->pcg_count++; + + /* + * For each return address in the call chain record, subject + * to the maximum depth desired. + * - Find the image associated with the sample. Stop if there + * there is no valid image at that address. + * - Find the function that overlaps the return address. + * - If found: use the start address of the function. + * If not found (say an object's symbol table is not present or + * is incomplete), round down to th gprof bucket granularity. + * - Convert return virtual address to an offset in the image. + * - Look for a child with the same {offset,image} tuple, + * inserting one if needed. + * - Increment the count of occurrences of the child. + */ + km = pmcstat_kernproc; + + for (n = 1; n < (uint32_t) args.pa_graphdepth && n < nsamples; n++, + parent = child) { + pc = cc[n]; + + ppm = pmcstat_process_find_map(usermode ? pp : km, pc); + if (ppm == NULL) { + /* Detect full frame capture (kernel + user). */ + if (!usermode) { + ppm = pmcstat_process_find_map(pp, pc); + if (ppm != NULL) + km = pp; + } + } + if (ppm == NULL) + return; + + image = ppm->ppm_image; + loadaddress = ppm->ppm_lowpc + image->pi_vaddr - + image->pi_start; + pc -= loadaddress; + + if ((sym = pmcstat_symbol_search(image, pc)) != NULL) + pc = sym->ps_start; + + child = pmcstat_cgnode_find(parent, image, pc); + child->pcg_count++; + } +} + +/* + * Printing a callgraph for a PMC. + */ +static void +pmcstat_callgraph_print_for_pmcid(struct pmcstat_pmcrecord *pmcr) +{ + int n, nentries; + uint32_t nsamples; + pmc_id_t pmcid; + struct pmcstat_cgnode **sortbuffer, **cgn; + struct pmcstat_cgnode_hash *pch; + + /* + * We pull out all callgraph nodes in the top-level hash table + * with a matching PMC id. We then sort these based on the + * frequency of occurrence. Each callgraph node is then + * printed. + */ + + nsamples = 0; + pmcid = pmcr->pr_pmcid; + if ((sortbuffer = (struct pmcstat_cgnode **) + malloc(sizeof(struct pmcstat_cgnode *) * + pmcstat_cgnode_hash_count)) == NULL) + err(EX_OSERR, "ERROR: Cannot sort callgraph"); + cgn = sortbuffer; + + for (n = 0; n < PMCSTAT_NHASH; n++) + LIST_FOREACH(pch, &pmcstat_cgnode_hash[n], pch_next) + if (pch->pch_pmcid == pmcid) { + nsamples += pch->pch_cgnode->pcg_count; + *cgn++ = pch->pch_cgnode; + } + + nentries = cgn - sortbuffer; + assert(nentries <= pmcstat_cgnode_hash_count); + + if (nentries == 0) { + free(sortbuffer); + return; + } + + qsort(sortbuffer, nentries, sizeof(struct pmcstat_cgnode *), + pmcstat_cgnode_compare); + + (void) fprintf(args.pa_graphfile, + "@ %s [%u samples]\n\n", + pmcstat_string_unintern(pmcr->pr_pmcname), + nsamples); + + for (cgn = sortbuffer, n = 0; n < nentries; n++, cgn++) { + pmcstat_previous_filename_printed = NULL; + pmcstat_cgnode_print(*cgn, 0, nsamples); + (void) fprintf(args.pa_graphfile, "\n"); + } + + free(sortbuffer); +} + +/* + * Print out callgraphs. + */ + +static void +pmcstat_callgraph_print(void) +{ + struct pmcstat_pmcrecord *pmcr; + + LIST_FOREACH(pmcr, &pmcstat_pmcs, pr_next) + pmcstat_callgraph_print_for_pmcid(pmcr); +} + +static void +pmcstat_cgnode_topprint(struct pmcstat_cgnode *cg, + int depth, uint32_t nsamples) +{ + int v_attrs, vs_len, ns_len, width, len, n, nchildren; + float v; + char ns[30], vs[10]; + struct pmcstat_symbol *sym; + struct pmcstat_cgnode **sortbuffer, **cgn, *pcg; + + (void) depth; + + /* Format value. */ + v = PMCPL_CG_COUNTP(cg); + snprintf(vs, sizeof(vs), "%.1f", v); + v_attrs = PMCSTAT_ATTRPERCENT(v); + + /* Format name. */ + sym = pmcstat_symbol_search(cg->pcg_image, cg->pcg_func); + if (sym != NULL) { + snprintf(ns, sizeof(ns), "%s", + pmcstat_string_unintern(sym->ps_name)); + } else + snprintf(ns, sizeof(ns), "%p", + (void *)cg->pcg_func); + + PMCSTAT_ATTRON(v_attrs); + PMCSTAT_PRINTW("%5.5s", vs); + PMCSTAT_ATTROFF(v_attrs); + PMCSTAT_PRINTW(" %-10.10s %-20.20s", + pmcstat_string_unintern(cg->pcg_image->pi_name), + ns); + + nchildren = cg->pcg_nchildren; + if (nchildren == 0) { + PMCSTAT_PRINTW("\n"); + return; + } + + width = pmcstat_displaywidth - 40; + + if ((sortbuffer = (struct pmcstat_cgnode **) + malloc(sizeof(struct pmcstat_cgnode *) * + nchildren)) == NULL) + err(EX_OSERR, "ERROR: Cannot print callgraph"); + cgn = sortbuffer; + + LIST_FOREACH(pcg, &cg->pcg_children, pcg_sibling) + *cgn++ = pcg; + + assert(cgn - sortbuffer == (int)nchildren); + + qsort(sortbuffer, nchildren, sizeof(struct pmcstat_cgnode *), + pmcstat_cgnode_compare); + + /* Count how many callers. */ + for (cgn = sortbuffer, n = 0; n < nchildren; n++, cgn++) { + pcg = *cgn; + + v = PMCPL_CG_COUNTP(pcg); + if (v < pmcstat_threshold) + break; + } + nchildren = n; + + for (cgn = sortbuffer, n = 0; n < nchildren; n++, cgn++) { + pcg = *cgn; + + /* Format value. */ + if (nchildren > 1) { + v = PMCPL_CG_COUNTP(pcg); + vs_len = snprintf(vs, sizeof(vs), ":%.1f", v); + v_attrs = PMCSTAT_ATTRPERCENT(v); + } else + vs_len = 0; + + /* Format name. */ + sym = pmcstat_symbol_search(pcg->pcg_image, pcg->pcg_func); + if (sym != NULL) { + ns_len = snprintf(ns, sizeof(ns), "%s", + pmcstat_string_unintern(sym->ps_name)); + } else + ns_len = snprintf(ns, sizeof(ns), "%p", + (void *)pcg->pcg_func); + + len = ns_len + vs_len + 1; + if (width - len < 0) { + PMCSTAT_PRINTW("..."); + break; + } + width -= len; + + PMCSTAT_PRINTW(" %s", ns); + if (nchildren > 1) { + PMCSTAT_ATTRON(v_attrs); + PMCSTAT_PRINTW("%s", vs); + PMCSTAT_ATTROFF(v_attrs); + } + } + PMCSTAT_PRINTW("\n"); + free(sortbuffer); +} + +/* + * Top mode display. + */ + +void +pmcpl_cg_topdisplay(void) +{ + int n, nentries; + uint32_t nsamples; + struct pmcstat_cgnode **sortbuffer, **cgn; + struct pmcstat_cgnode_hash *pch; + struct pmcstat_pmcrecord *pmcr; + + pmcr = pmcstat_pmcindex_to_pmcr(pmcstat_pmcinfilter); + + /* + * We pull out all callgraph nodes in the top-level hash table + * with a matching PMC index. We then sort these based on the + * frequency of occurrence. Each callgraph node is then + * printed. + */ + + nsamples = 0; + + if ((sortbuffer = (struct pmcstat_cgnode **) + malloc(sizeof(struct pmcstat_cgnode *) * + pmcstat_cgnode_hash_count)) == NULL) + err(EX_OSERR, "ERROR: Cannot sort callgraph"); + cgn = sortbuffer; + + for (n = 0; n < PMCSTAT_NHASH; n++) + LIST_FOREACH(pch, &pmcstat_cgnode_hash[n], pch_next) + if (pmcr == NULL || pch->pch_pmcid == pmcr->pr_pmcid) { + nsamples += pch->pch_cgnode->pcg_count; + *cgn++ = pch->pch_cgnode; + } + + nentries = cgn - sortbuffer; + assert(nentries <= pmcstat_cgnode_hash_count); + + if (nentries == 0) { + free(sortbuffer); + return; + } + + qsort(sortbuffer, nentries, sizeof(struct pmcstat_cgnode *), + pmcstat_cgnode_compare); + + PMCSTAT_PRINTW("%5.5s %-10.10s %-20.20s %s\n", + "%SAMP", "IMAGE", "FUNCTION", "CALLERS"); + + nentries = min(pmcstat_displayheight - 2, nentries); + + for (cgn = sortbuffer, n = 0; n < nentries; n++, cgn++) { + if (PMCPL_CG_COUNTP(*cgn) < pmcstat_threshold) + break; + pmcstat_cgnode_topprint(*cgn, 0, nsamples); + } + + free(sortbuffer); +} + +/* + * Handle top mode keypress. + */ + +int +pmcpl_cg_topkeypress(int c, WINDOW *w) +{ + + (void) c; (void) w; + + return 0; +} + +int +pmcpl_cg_init(void) +{ + int i; + + pmcstat_cgnode_hash_count = 0; + pmcstat_previous_filename_printed = NULL; + + for (i = 0; i < PMCSTAT_NHASH; i++) { + LIST_INIT(&pmcstat_cgnode_hash[i]); + } + + return (0); +} + +void +pmcpl_cg_shutdown(FILE *mf) +{ + int i; + struct pmcstat_cgnode_hash *pch, *pchtmp; + + (void) mf; + + if (args.pa_flags & FLAG_DO_CALLGRAPHS) + pmcstat_callgraph_print(); + + /* + * Free memory. + */ + for (i = 0; i < PMCSTAT_NHASH; i++) { + LIST_FOREACH_SAFE(pch, &pmcstat_cgnode_hash[i], pch_next, + pchtmp) { + pmcstat_cgnode_free(pch->pch_cgnode); + LIST_REMOVE(pch, pch_next); + free(pch); + } + } +} + diff --git a/usr.sbin/pmcstat/pmcpl_callgraph.h b/usr.sbin/pmcstat/pmcpl_callgraph.h new file mode 100644 index 000000000000..aaf0e1ba1d69 --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_callgraph.h @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2005-2007, Joseph Koshy + * Copyright (c) 2007 The FreeBSD Foundation + * All rights reserved. + * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * + * 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$ + */ + +#ifndef _PMCSTAT_PL_CALLGRAPH_H_ +#define _PMCSTAT_PL_CALLGRAPH_H_ + +/* + * Each call graph node is tracked by a pmcstat_cgnode struct. + */ + +struct pmcstat_cgnode { + struct pmcstat_image *pcg_image; + uintfptr_t pcg_func; + uint32_t pcg_count; + uint32_t pcg_nchildren; + LIST_ENTRY(pmcstat_cgnode) pcg_sibling; + LIST_HEAD(,pmcstat_cgnode) pcg_children; +}; + +struct pmcstat_cgnode_hash { + struct pmcstat_cgnode *pch_cgnode; + pmc_id_t pch_pmcid; + LIST_ENTRY(pmcstat_cgnode_hash) pch_next; +}; +extern LIST_HEAD(pmcstat_cgnode_hash_list, pmcstat_cgnode_hash) pmcstat_cgnode_hash[PMCSTAT_NHASH]; +extern int pmcstat_cgnode_hash_count; + +/* Function prototypes */ +int pmcpl_cg_init(void); +void pmcpl_cg_shutdown(FILE *mf); +void pmcpl_cg_process( + struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu); +int pmcpl_cg_topkeypress(int c, WINDOW *w); +void pmcpl_cg_topdisplay(void); +void pmcpl_cg_configure(char *opt); + +#endif /* _PMCSTAT_PL_CALLGRAPH_H_ */ diff --git a/usr.sbin/pmcstat/pmcpl_calltree.c b/usr.sbin/pmcstat/pmcpl_calltree.c new file mode 100644 index 000000000000..498092dcca83 --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_calltree.c @@ -0,0 +1,1000 @@ +/*- + * Copyright (c) 2009, Fabien Thomas + * 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. + */ + +/* + * Process hwpmc(4) samples as calltree. + * + * Output file format compatible with Kcachegrind (kdesdk). + * Handle top mode with a sorted tree display. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pmcstat.h" +#include "pmcstat_log.h" +#include "pmcstat_top.h" +#include "pmcpl_calltree.h" + +#define PMCPL_CT_GROWSIZE 4 + +static pmcstat_interned_string pmcpl_ct_prevfn; + +static int pmcstat_skiplink = 0; + +struct pmcpl_ct_node; + +/* Get the sample value for PMC a. */ +#define PMCPL_CT_SAMPLE(a, b) \ + ((a) < (b)->npmcs ? (b)->sb[a] : 0) + +/* Get the sample value in percent related to rsamples. */ +#define PMCPL_CT_SAMPLEP(a, b) \ + (PMCPL_CT_SAMPLE(a, b) * 100.0 / rsamples->sb[a]) + +struct pmcpl_ct_sample { + int npmcs; /* Max pmc index available. */ + unsigned *sb; /* Sample buffer for 0..npmcs. */ +}; + +struct pmcpl_ct_arc { + struct pmcpl_ct_sample pcta_samples; + struct pmcpl_ct_sample pcta_callid; + unsigned pcta_call; + struct pmcpl_ct_node *pcta_child; +}; + +struct pmcpl_ct_instr { + uintfptr_t pctf_func; + struct pmcpl_ct_sample pctf_samples; +}; + +/* + * Each calltree node is tracked by a pmcpl_ct_node struct. + */ +struct pmcpl_ct_node { +#define PMCPL_PCT_TAG 0x00000001 /* Loop detection. */ + uint32_t pct_flags; + struct pmcstat_image *pct_image; + uintfptr_t pct_func; + struct pmcpl_ct_sample pct_samples; + + int pct_narc; + int pct_arc_c; + struct pmcpl_ct_arc *pct_arc; + + /* TODO: optimize for large number of items. */ + int pct_ninstr; + int pct_instr_c; + struct pmcpl_ct_instr *pct_instr; +}; + +struct pmcpl_ct_node_hash { + struct pmcpl_ct_node *pch_ctnode; + LIST_ENTRY(pmcpl_ct_node_hash) pch_next; +}; + +struct pmcpl_ct_sample pmcpl_ct_callid; + +#define PMCPL_CT_MAXCOL PMC_CALLCHAIN_DEPTH_MAX +#define PMCPL_CT_MAXLINE 256 +struct pmcpl_ct_node *pmcpl_ct_topscreen[PMCPL_CT_MAXCOL][PMCPL_CT_MAXLINE]; + +/* + * All nodes indexed by function/image name are placed in a hash table. + */ +static LIST_HEAD(,pmcpl_ct_node_hash) pmcpl_ct_node_hash[PMCSTAT_NHASH]; + +/* + * Root node for the graph. + */ +static struct pmcpl_ct_node *pmcpl_ct_root; + +/* + * Prototypes + */ + +/* + * Initialize a samples. + */ + +static void +pmcpl_ct_samples_init(struct pmcpl_ct_sample *samples) +{ + + samples->npmcs = 0; + samples->sb = NULL; +} + +/* + * Free a samples. + */ + +static void +pmcpl_ct_samples_free(struct pmcpl_ct_sample *samples) +{ + + samples->npmcs = 0; + free(samples->sb); + samples->sb = NULL; +} + +/* + * Grow a sample block to store pmcstat_npmcs PMCs. + */ + +static void +pmcpl_ct_samples_grow(struct pmcpl_ct_sample *samples) +{ + int npmcs; + + /* Enough storage. */ + if (pmcstat_npmcs <= samples->npmcs) + return; + + npmcs = samples->npmcs + + max(pmcstat_npmcs - samples->npmcs, PMCPL_CT_GROWSIZE); + samples->sb = realloc(samples->sb, npmcs * sizeof(unsigned)); + if (samples->sb == NULL) + errx(EX_SOFTWARE, "ERROR: out of memory"); + bzero((char *)samples->sb + samples->npmcs * sizeof(unsigned), + (npmcs - samples->npmcs) * sizeof(unsigned)); + samples->npmcs = npmcs; +} + +/* + * Compute the sum of all root arcs. + */ + +static void +pmcpl_ct_samples_root(struct pmcpl_ct_sample *samples) +{ + int i, pmcin; + + pmcpl_ct_samples_init(samples); + pmcpl_ct_samples_grow(samples); + + for (i = 0; i < pmcpl_ct_root->pct_narc; i++) + for (pmcin = 0; pmcin < pmcstat_npmcs; pmcin++) + samples->sb[pmcin] += PMCPL_CT_SAMPLE(pmcin, + &pmcpl_ct_root->pct_arc[i].pcta_samples); +} + +/* + * Grow the arc table. + */ + +static void +pmcpl_ct_arc_grow(int cursize, int *maxsize, struct pmcpl_ct_arc **items) +{ + int nmaxsize; + + if (cursize < *maxsize) + return; + + nmaxsize = *maxsize + max(cursize + 1 - *maxsize, PMCPL_CT_GROWSIZE); + *items = realloc(*items, nmaxsize * sizeof(struct pmcpl_ct_arc)); + if (*items == NULL) + errx(EX_SOFTWARE, "ERROR: out of memory"); + bzero((char *)*items + *maxsize * sizeof(struct pmcpl_ct_arc), + (nmaxsize - *maxsize) * sizeof(struct pmcpl_ct_arc)); + *maxsize = nmaxsize; +} + +/* + * Compare two arc by samples value. + */ +static int +pmcpl_ct_arc_compare(void *thunk, const void *a, const void *b) +{ + const struct pmcpl_ct_arc *ct1, *ct2; + int pmcin = *(int *)thunk; + + ct1 = (const struct pmcpl_ct_arc *) a; + ct2 = (const struct pmcpl_ct_arc *) b; + + /* Sort in reverse order */ + if (PMCPL_CT_SAMPLE(pmcin, &ct1->pcta_samples) < + PMCPL_CT_SAMPLE(pmcin, &ct2->pcta_samples)) + return (1); + if (PMCPL_CT_SAMPLE(pmcin, &ct1->pcta_samples) > + PMCPL_CT_SAMPLE(pmcin, &ct2->pcta_samples)) + return (-1); + return (0); +} + +/* + * Grow the instr table. + */ + +static void +pmcpl_ct_instr_grow(int cursize, int *maxsize, struct pmcpl_ct_instr **items) +{ + int nmaxsize; + + if (cursize < *maxsize) + return; + + nmaxsize = *maxsize + max(cursize + 1 - *maxsize, PMCPL_CT_GROWSIZE); + *items = realloc(*items, nmaxsize * sizeof(struct pmcpl_ct_instr)); + if (*items == NULL) + errx(EX_SOFTWARE, "ERROR: out of memory"); + bzero((char *)*items + *maxsize * sizeof(struct pmcpl_ct_instr), + (nmaxsize - *maxsize) * sizeof(struct pmcpl_ct_instr)); + *maxsize = nmaxsize; +} + +/* + * Add a new instruction sample to given node. + */ + +static void +pmcpl_ct_instr_add(struct pmcpl_ct_node *ct, int pmcin, uintfptr_t pc) +{ + int i; + struct pmcpl_ct_instr *in; + + for (i = 0; ipct_ninstr; i++) { + if (ct->pct_instr[i].pctf_func == pc) { + in = &ct->pct_instr[i]; + pmcpl_ct_samples_grow(&in->pctf_samples); + in->pctf_samples.sb[pmcin]++; + return; + } + } + + pmcpl_ct_instr_grow(ct->pct_ninstr, &ct->pct_instr_c, &ct->pct_instr); + in = &ct->pct_instr[ct->pct_ninstr]; + in->pctf_func = pc; + pmcpl_ct_samples_init(&in->pctf_samples); + pmcpl_ct_samples_grow(&in->pctf_samples); + in->pctf_samples.sb[pmcin] = 1; + ct->pct_ninstr++; +} + +/* + * Allocate a new node. + */ + +static struct pmcpl_ct_node * +pmcpl_ct_node_allocate(struct pmcstat_image *image, uintfptr_t pc) +{ + struct pmcpl_ct_node *ct; + + if ((ct = malloc(sizeof(*ct))) == NULL) + err(EX_OSERR, "ERROR: Cannot allocate callgraph node"); + + ct->pct_flags = 0; + ct->pct_image = image; + ct->pct_func = pc; + + pmcpl_ct_samples_init(&ct->pct_samples); + + ct->pct_narc = 0; + ct->pct_arc_c = 0; + ct->pct_arc = NULL; + + ct->pct_ninstr = 0; + ct->pct_instr_c = 0; + ct->pct_instr = NULL; + + return (ct); +} + +/* + * Free a node. + */ + +static void +pmcpl_ct_node_free(struct pmcpl_ct_node *ct) +{ + int i; + + for (i = 0; i < ct->pct_narc; i++) { + pmcpl_ct_samples_free(&ct->pct_arc[i].pcta_samples); + pmcpl_ct_samples_free(&ct->pct_arc[i].pcta_callid); + } + + pmcpl_ct_samples_free(&ct->pct_samples); + free(ct->pct_arc); + free(ct->pct_instr); + free(ct); +} + +/* + * Clear the graph tag on each node. + */ +static void +pmcpl_ct_node_cleartag(void) +{ + int i; + struct pmcpl_ct_node_hash *pch; + + for (i = 0; i < PMCSTAT_NHASH; i++) + LIST_FOREACH(pch, &pmcpl_ct_node_hash[i], pch_next) + pch->pch_ctnode->pct_flags &= ~PMCPL_PCT_TAG; + + pmcpl_ct_root->pct_flags &= ~PMCPL_PCT_TAG; +} + +/* + * Print the callchain line by line with maximum cost at top. + */ + +static int +pmcpl_ct_node_dumptop(int pmcin, struct pmcpl_ct_node *ct, + struct pmcpl_ct_sample *rsamples, int x, int *y) +{ + int i; + + if (ct->pct_flags & PMCPL_PCT_TAG) + return 0; + + ct->pct_flags |= PMCPL_PCT_TAG; + + if (x >= PMCPL_CT_MAXCOL) { + pmcpl_ct_topscreen[x][*y] = NULL; + return 1; + } + pmcpl_ct_topscreen[x][*y] = ct; + + /* + * This is a terminal node + */ + if (ct->pct_narc == 0) { + pmcpl_ct_topscreen[x+1][*y] = NULL; + if (*y >= PMCPL_CT_MAXLINE || + *y >= pmcstat_displaywidth) + return 1; + *y = *y + 1; + for (i=0; i < x; i++) + pmcpl_ct_topscreen[i][*y] = + pmcpl_ct_topscreen[i][*y - 1]; + return 0; + } + + /* + * Quicksort the arcs. + */ + qsort_r(ct->pct_arc, ct->pct_narc, sizeof(struct pmcpl_ct_arc), + &pmcin, pmcpl_ct_arc_compare); + + for (i = 0; i < ct->pct_narc; i++) { + if (PMCPL_CT_SAMPLEP(pmcin, + &ct->pct_arc[i].pcta_samples) > pmcstat_threshold) { + if (pmcpl_ct_node_dumptop(pmcin, + ct->pct_arc[i].pcta_child, + rsamples, x+1, y)) + return 1; + } + } + + return 0; +} + +/* + * Format and display given PMC index. + */ + +static void +pmcpl_ct_node_printtop(struct pmcpl_ct_sample *rsamples, int pmcin, int maxy) +{ + int v_attrs, ns_len, vs_len, is_len, width, indentwidth, x, y; + float v; + char ns[30], vs[10], is[20]; + struct pmcpl_ct_node *ct; + struct pmcstat_symbol *sym; + const char *space = " "; + + for (y = 0; y < maxy; y++) { + /* Output image. */ + ct = pmcpl_ct_topscreen[0][y]; + snprintf(is, sizeof(is), "%-10.10s", + pmcstat_string_unintern(ct->pct_image->pi_name)); + PMCSTAT_PRINTW("%s ", is); + width = indentwidth = 11; + + for (x = 0; pmcpl_ct_topscreen[x][y] !=NULL; x++) { + + ct = pmcpl_ct_topscreen[x][y]; + + ns[0] = '\0'; ns_len = 0; + vs[0] = '\0'; vs_len = 0; + is[0] = '\0'; is_len = 0; + + /* Format value. */ + v = PMCPL_CT_SAMPLEP(pmcin, &ct->pct_samples); + if (v > pmcstat_threshold) + vs_len = snprintf(vs, sizeof(vs), "(%.1f%%)", v); + v_attrs = PMCSTAT_ATTRPERCENT(v); + + if (pmcstat_skiplink && v <= pmcstat_threshold) { + PMCSTAT_PRINTW(". "); + width += 2; + continue; + } + sym = pmcstat_symbol_search(ct->pct_image, ct->pct_func); + if (sym != NULL) { + ns_len = snprintf(ns, sizeof(ns), "%s", + pmcstat_string_unintern(sym->ps_name)); + } else + ns_len = snprintf(ns, sizeof(ns), "%p", + (void *)ct->pct_func); + + /* Format image. */ + if (x > 0 && pmcpl_ct_topscreen[x-1][y]->pct_image != ct->pct_image) + is_len = snprintf(is, sizeof(is), "@%s", + pmcstat_string_unintern(ct->pct_image->pi_name)); + + /* Check for line wrap. */ + width += ns_len + is_len + vs_len + 1; + if (width >= pmcstat_displaywidth) { + PMCSTAT_PRINTW("\n%*s", indentwidth, space); + width = indentwidth + ns_len + is_len + vs_len; + } + + PMCSTAT_ATTRON(v_attrs); + PMCSTAT_PRINTW("%s%s%s ", ns, is, vs); + PMCSTAT_ATTROFF(v_attrs); + } + PMCSTAT_PRINTW("\n"); + } +} + +/* + * Output top mode snapshot. + */ + +void +pmcpl_ct_topdisplay(void) +{ + int i, x, y, pmcin; + struct pmcpl_ct_sample rsamples; + + pmcpl_ct_samples_root(&rsamples); + + PMCSTAT_PRINTW("%-10.10s %s\n", "IMAGE", "CALLTREE"); + + for (pmcin = 0; pmcin < pmcstat_npmcs; pmcin++) { + /* Filter PMCs. */ + if (pmcstat_pmcinfilter != pmcin) + continue; + + pmcpl_ct_node_cleartag(); + + /* Quicksort the arcs. */ + qsort_r(pmcpl_ct_root->pct_arc, + pmcpl_ct_root->pct_narc, + sizeof(struct pmcpl_ct_arc), + &pmcin, pmcpl_ct_arc_compare); + + x = y = 0; + for (i = 0; i < pmcpl_ct_root->pct_narc; i++) { + if (pmcpl_ct_node_dumptop(pmcin, + pmcpl_ct_root->pct_arc[i].pcta_child, + &rsamples, x, &y)) { + break; + } + } + + pmcpl_ct_node_printtop(&rsamples, pmcin, y); + } + pmcpl_ct_samples_free(&rsamples); +} + +/* + * Handle top mode keypress. + */ + +int +pmcpl_ct_topkeypress(int c, WINDOW *w) +{ + + switch (c) { + case 'f': + pmcstat_skiplink = !pmcstat_skiplink; + wprintw(w, "skip empty link %s", pmcstat_skiplink ? "on" : "off"); + break; + } + + return 0; +} + +/* + * Look for a callgraph node associated with pmc `pmcid' in the global + * hash table that corresponds to the given `pc' value in the process map + * `ppm'. + */ + +static struct pmcpl_ct_node * +pmcpl_ct_node_hash_lookup_pc(struct pmcpl_ct_node *parent, + struct pmcstat_pcmap *ppm, uintfptr_t pc, int pmcin) +{ + struct pmcstat_symbol *sym; + struct pmcstat_image *image; + struct pmcpl_ct_node *ct; + struct pmcpl_ct_node_hash *h; + struct pmcpl_ct_arc *arc; + uintfptr_t loadaddress; + int i; + unsigned int hash; + + assert(parent != NULL); + + image = ppm->ppm_image; + + loadaddress = ppm->ppm_lowpc + image->pi_vaddr - image->pi_start; + pc -= loadaddress; /* Convert to an offset in the image. */ + + /* + * Try determine the function at this offset. If we can't + * find a function round leave the `pc' value alone. + */ + if ((sym = pmcstat_symbol_search(image, pc)) != NULL) + pc = sym->ps_start; + + for (hash = i = 0; i < (int)sizeof(uintfptr_t); i++) + hash += (pc >> i) & 0xFF; + + hash &= PMCSTAT_HASH_MASK; + + ct = NULL; + LIST_FOREACH(h, &pmcpl_ct_node_hash[hash], pch_next) { + ct = h->pch_ctnode; + + assert(ct != NULL); + + if (ct->pct_image == image && ct->pct_func == pc) { + /* + * Find related arc in parent node and + * increment the sample count. + */ + for (i = 0; i < parent->pct_narc; i++) { + if (parent->pct_arc[i].pcta_child == ct) { + arc = &parent->pct_arc[i]; + pmcpl_ct_samples_grow(&arc->pcta_samples); + arc->pcta_samples.sb[pmcin]++; + /* Estimate call count. */ + pmcpl_ct_samples_grow(&arc->pcta_callid); + if (pmcpl_ct_callid.sb[pmcin] - + arc->pcta_callid.sb[pmcin] > 1) + arc->pcta_call++; + arc->pcta_callid.sb[pmcin] = + pmcpl_ct_callid.sb[pmcin]; + return (ct); + } + } + + /* + * No arc found for us, add ourself to the parent. + */ + pmcpl_ct_arc_grow(parent->pct_narc, + &parent->pct_arc_c, &parent->pct_arc); + arc = &parent->pct_arc[parent->pct_narc]; + pmcpl_ct_samples_grow(&arc->pcta_samples); + arc->pcta_samples.sb[pmcin] = 1; + arc->pcta_call = 1; + pmcpl_ct_samples_grow(&arc->pcta_callid); + arc->pcta_callid.sb[pmcin] = pmcpl_ct_callid.sb[pmcin]; + arc->pcta_child = ct; + parent->pct_narc++; + return (ct); + } + } + + /* + * We haven't seen this (pmcid, pc) tuple yet, so allocate a + * new callgraph node and a new hash table entry for it. + */ + ct = pmcpl_ct_node_allocate(image, pc); + if ((h = malloc(sizeof(*h))) == NULL) + err(EX_OSERR, "ERROR: Could not allocate callgraph node"); + + h->pch_ctnode = ct; + LIST_INSERT_HEAD(&pmcpl_ct_node_hash[hash], h, pch_next); + + pmcpl_ct_arc_grow(parent->pct_narc, + &parent->pct_arc_c, &parent->pct_arc); + arc = &parent->pct_arc[parent->pct_narc]; + pmcpl_ct_samples_grow(&arc->pcta_samples); + arc->pcta_samples.sb[pmcin] = 1; + arc->pcta_call = 1; + pmcpl_ct_samples_grow(&arc->pcta_callid); + arc->pcta_callid.sb[pmcin] = pmcpl_ct_callid.sb[pmcin]; + arc->pcta_child = ct; + parent->pct_narc++; + return (ct); +} + +/* + * Record a callchain. + */ + +void +pmcpl_ct_process(struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu) +{ + int n, pmcin; + struct pmcstat_pcmap *ppm[PMC_CALLCHAIN_DEPTH_MAX]; + struct pmcstat_process *km; + struct pmcpl_ct_node *parent, *child; + + (void) cpu; + + assert(nsamples>0 && nsamples<=PMC_CALLCHAIN_DEPTH_MAX); + + /* Get the PMC index. */ + pmcin = pmcr->pr_pmcin; + + /* + * Validate mapping for the callchain. + * Go from bottom to first invalid entry. + */ + km = pmcstat_kernproc; + for (n = 0; n < (int)nsamples; n++) { + ppm[n] = pmcstat_process_find_map(usermode ? + pp : km, cc[n]); + if (ppm[n] == NULL) { + /* Detect full frame capture (kernel + user). */ + if (!usermode) { + ppm[n] = pmcstat_process_find_map(pp, cc[n]); + if (ppm[n] != NULL) + km = pp; + } + } + if (ppm[n] == NULL) + break; + } + if (n-- == 0) { + pmcstat_stats.ps_callchain_dubious_frames++; + return; + } + + /* Increase the call generation counter. */ + pmcpl_ct_samples_grow(&pmcpl_ct_callid); + pmcpl_ct_callid.sb[pmcin]++; + + /* + * Iterate remaining addresses. + */ + for (parent = pmcpl_ct_root, child = NULL; n >= 0; n--) { + child = pmcpl_ct_node_hash_lookup_pc(parent, ppm[n], cc[n], + pmcin); + if (child == NULL) { + pmcstat_stats.ps_callchain_dubious_frames++; + continue; + } + parent = child; + } + + /* + * Increment the sample count for this PMC. + */ + if (child != NULL) { + pmcpl_ct_samples_grow(&child->pct_samples); + child->pct_samples.sb[pmcin]++; + + /* Update per instruction sample if required. */ + if (args.pa_ctdumpinstr) + pmcpl_ct_instr_add(child, pmcin, cc[0] - + (ppm[0]->ppm_lowpc + ppm[0]->ppm_image->pi_vaddr - + ppm[0]->ppm_image->pi_start)); + } +} + +/* + * Print node self cost. + */ + +static void +pmcpl_ct_node_printself(struct pmcpl_ct_node *ct) +{ + int i, j, line; + uintptr_t addr; + struct pmcstat_symbol *sym; + char sourcefile[PATH_MAX]; + char funcname[PATH_MAX]; + + /* + * Object binary. + */ +#ifdef PMCPL_CT_OPTIMIZEFN + if (pmcpl_ct_prevfn != ct->pct_image->pi_fullpath) { +#endif + pmcpl_ct_prevfn = ct->pct_image->pi_fullpath; + fprintf(args.pa_graphfile, "ob=%s\n", + pmcstat_string_unintern(pmcpl_ct_prevfn)); +#ifdef PMCPL_CT_OPTIMIZEFN + } +#endif + + /* + * Function name. + */ + if (pmcstat_image_addr2line(ct->pct_image, ct->pct_func, + sourcefile, sizeof(sourcefile), &line, + funcname, sizeof(funcname))) { + fprintf(args.pa_graphfile, "fn=%s\n", + funcname); + } else { + sym = pmcstat_symbol_search(ct->pct_image, ct->pct_func); + if (sym != NULL) + fprintf(args.pa_graphfile, "fn=%s\n", + pmcstat_string_unintern(sym->ps_name)); + else + fprintf(args.pa_graphfile, "fn=%p\n", + (void *)(ct->pct_image->pi_vaddr + ct->pct_func)); + } + + /* + * Self cost. + */ + if (ct->pct_ninstr > 0) { + for (i = 0; i < ct->pct_ninstr; i++) { + addr = ct->pct_image->pi_vaddr + + ct->pct_instr[i].pctf_func; + line = 0; + if (pmcstat_image_addr2line(ct->pct_image, addr, + sourcefile, sizeof(sourcefile), &line, + funcname, sizeof(funcname))) + fprintf(args.pa_graphfile, "fl=%s\n", sourcefile); + fprintf(args.pa_graphfile, "%p %u", (void *)addr, line); + for (j = 0; jpct_instr[i].pctf_samples)); + fprintf(args.pa_graphfile, "\n"); + } + } else { + addr = ct->pct_image->pi_vaddr + ct->pct_func; + line = 0; + if (pmcstat_image_addr2line(ct->pct_image, addr, + sourcefile, sizeof(sourcefile), &line, + funcname, sizeof(funcname))) + fprintf(args.pa_graphfile, "fl=%s\n", sourcefile); + fprintf(args.pa_graphfile, "* *"); + for (i = 0; ipct_samples)); + fprintf(args.pa_graphfile, "\n"); + } +} + +/* + * Print node child cost. + */ + +static void +pmcpl_ct_node_printchild(struct pmcpl_ct_node *ct) +{ + int i, j, line; + uintptr_t addr; + struct pmcstat_symbol *sym; + struct pmcpl_ct_node *child; + char sourcefile[PATH_MAX]; + char funcname[PATH_MAX]; + + /* + * Child cost. + * TODO: attach child cost to the real position in the funtion. + * TODO: cfn= / call addr() / addr(call ) + */ + for (i=0 ; ipct_narc; i++) { + child = ct->pct_arc[i].pcta_child; + + /* Object binary. */ +#ifdef PMCPL_CT_OPTIMIZEFN + if (pmcpl_ct_prevfn != child->pct_image->pi_fullpath) { +#endif + pmcpl_ct_prevfn = child->pct_image->pi_fullpath; + fprintf(args.pa_graphfile, "cob=%s\n", + pmcstat_string_unintern(pmcpl_ct_prevfn)); +#if PMCPL_CT_OPTIMIZEFN + } +#endif + /* Child function name. */ + addr = child->pct_image->pi_vaddr + child->pct_func; + /* Child function source file. */ + if (pmcstat_image_addr2line(child->pct_image, addr, + sourcefile, sizeof(sourcefile), &line, + funcname, sizeof(funcname))) { + fprintf(args.pa_graphfile, "cfn=%s\n", funcname); + fprintf(args.pa_graphfile, "cfl=%s\n", sourcefile); + } else { + sym = pmcstat_symbol_search(child->pct_image, + child->pct_func); + if (sym != NULL) + fprintf(args.pa_graphfile, "cfn=%s\n", + pmcstat_string_unintern(sym->ps_name)); + else + fprintf(args.pa_graphfile, "cfn=%p\n", (void *)addr); + } + + /* Child function address, line and call count. */ + fprintf(args.pa_graphfile, "calls=%u %p %u\n", + ct->pct_arc[i].pcta_call, (void *)addr, line); + + if (ct->pct_image != NULL) { + /* Call address, line, sample. */ + addr = ct->pct_image->pi_vaddr + ct->pct_func; + line = 0; + pmcstat_image_addr2line(ct->pct_image, addr, sourcefile, + sizeof(sourcefile), &line, + funcname, sizeof(funcname)); + fprintf(args.pa_graphfile, "%p %u", (void *)addr, line); + } + else + fprintf(args.pa_graphfile, "* *"); + for (j = 0; jpct_arc[i].pcta_samples)); + fprintf(args.pa_graphfile, "\n"); + } +} + +/* + * Clean the PMC name for Kcachegrind formula + */ + +static void +pmcpl_ct_fixup_pmcname(char *s) +{ + char *p; + + for (p = s; *p; p++) + if (!isalnum(*p)) + *p = '_'; +} + +/* + * Print a calltree (KCachegrind) for all PMCs. + */ + +static void +pmcpl_ct_print(void) +{ + int n, i; + struct pmcpl_ct_node_hash *pch; + struct pmcpl_ct_sample rsamples; + char name[40]; + + pmcpl_ct_samples_root(&rsamples); + pmcpl_ct_prevfn = NULL; + + fprintf(args.pa_graphfile, + "version: 1\n" + "creator: pmcstat\n" + "positions: instr line\n" + "events:"); + for (i=0; ipch_ctnode); + pmcpl_ct_node_printchild(pch->pch_ctnode); + } + + pmcpl_ct_samples_free(&rsamples); +} + +int +pmcpl_ct_configure(char *opt) +{ + + if (strncmp(opt, "skiplink=", 9) == 0) { + pmcstat_skiplink = atoi(opt+9); + } else + return (0); + + return (1); +} + +int +pmcpl_ct_init(void) +{ + int i; + + pmcpl_ct_prevfn = NULL; + pmcpl_ct_root = pmcpl_ct_node_allocate(NULL, 0); + + for (i = 0; i < PMCSTAT_NHASH; i++) + LIST_INIT(&pmcpl_ct_node_hash[i]); + + pmcpl_ct_samples_init(&pmcpl_ct_callid); + + return (0); +} + +void +pmcpl_ct_shutdown(FILE *mf) +{ + int i; + struct pmcpl_ct_node_hash *pch, *pchtmp; + + (void) mf; + + if (args.pa_flags & FLAG_DO_CALLGRAPHS) + pmcpl_ct_print(); + + /* + * Free memory. + */ + + for (i = 0; i < PMCSTAT_NHASH; i++) { + LIST_FOREACH_SAFE(pch, &pmcpl_ct_node_hash[i], pch_next, + pchtmp) { + pmcpl_ct_node_free(pch->pch_ctnode); + free(pch); + } + } + + pmcpl_ct_node_free(pmcpl_ct_root); + pmcpl_ct_root = NULL; + + pmcpl_ct_samples_free(&pmcpl_ct_callid); +} + diff --git a/usr.sbin/pmcstat/pmcpl_calltree.h b/usr.sbin/pmcstat/pmcpl_calltree.h new file mode 100644 index 000000000000..f54957f83f71 --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_calltree.h @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2009, Fabien Thomas + * 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$ + */ + +#ifndef _PMCSTAT_PL_CALLTREE_H_ +#define _PMCSTAT_PL_CALLTREE_H_ + +/* Function prototypes */ +int pmcpl_ct_init(void); +void pmcpl_ct_shutdown(FILE *mf); +void pmcpl_ct_process( + struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu); +int pmcpl_ct_topkeypress(int c, WINDOW *w); +void pmcpl_ct_topdisplay(void); +int pmcpl_ct_configure(char *opt); + +#endif /* _PMCSTAT_PL_CALLTREE_H_ */ diff --git a/usr.sbin/pmcstat/pmcpl_gprof.c b/usr.sbin/pmcstat/pmcpl_gprof.c new file mode 100644 index 000000000000..9327eb95b62d --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_gprof.c @@ -0,0 +1,533 @@ +/*- + * Copyright (c) 2005-2007, Joseph Koshy + * Copyright (c) 2007 The FreeBSD Foundation + * Copyright (c) 2009, Fabien Thomas + * All rights reserved. + * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * + * 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. + */ + +/* + * Transform a hwpmc(4) log into human readable form, and into + * gprof(1) compatible profiles. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pmcstat.h" +#include "pmcstat_log.h" +#include "pmcpl_callgraph.h" +#include "pmcpl_gprof.h" + +/* + * struct pmcstat_gmonfile tracks a given 'gmon.out' file. These + * files are mmap()'ed in as needed. + */ + +struct pmcstat_gmonfile { + LIST_ENTRY(pmcstat_gmonfile) pgf_next; /* list of entries */ + int pgf_overflow; /* whether a count overflowed */ + pmc_id_t pgf_pmcid; /* id of the associated pmc */ + size_t pgf_nbuckets; /* #buckets in this gmon.out */ + unsigned int pgf_nsamples; /* #samples in this gmon.out */ + pmcstat_interned_string pgf_name; /* pathname of gmon.out file */ + size_t pgf_ndatabytes; /* number of bytes mapped */ + void *pgf_gmondata; /* pointer to mmap'ed data */ + FILE *pgf_file; /* used when writing gmon arcs */ +}; + +/* + * Prototypes + */ + +static void pmcstat_gmon_create_file(struct pmcstat_gmonfile *_pgf, + struct pmcstat_image *_image); +static pmcstat_interned_string pmcstat_gmon_create_name(const char *_sd, + struct pmcstat_image *_img, pmc_id_t _pmcid); +static void pmcstat_gmon_map_file(struct pmcstat_gmonfile *_pgf); +static void pmcstat_gmon_unmap_file(struct pmcstat_gmonfile *_pgf); + +static struct pmcstat_gmonfile *pmcstat_image_find_gmonfile(struct + pmcstat_image *_i, pmc_id_t _id); + +/* + * Create a gmon.out file and size it. + */ + +static void +pmcstat_gmon_create_file(struct pmcstat_gmonfile *pgf, + struct pmcstat_image *image) +{ + int fd; + size_t count; + struct gmonhdr gm; + const char *pathname; + char buffer[DEFAULT_BUFFER_SIZE]; + + pathname = pmcstat_string_unintern(pgf->pgf_name); + if ((fd = open(pathname, O_RDWR|O_NOFOLLOW|O_CREAT, + S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0) + err(EX_OSERR, "ERROR: Cannot open \"%s\"", pathname); + + gm.lpc = image->pi_start; + gm.hpc = image->pi_end; + gm.ncnt = (pgf->pgf_nbuckets * sizeof(HISTCOUNTER)) + + sizeof(struct gmonhdr); + gm.version = GMONVERSION; + gm.profrate = 0; /* use ticks */ + gm.histcounter_type = 0; /* compatibility with moncontrol() */ + gm.spare[0] = gm.spare[1] = 0; + + /* Write out the gmon header */ + if (write(fd, &gm, sizeof(gm)) < 0) + goto error; + + /* Zero fill the samples[] array */ + (void) memset(buffer, 0, sizeof(buffer)); + + count = pgf->pgf_ndatabytes - sizeof(struct gmonhdr); + while (count > sizeof(buffer)) { + if (write(fd, &buffer, sizeof(buffer)) < 0) + goto error; + count -= sizeof(buffer); + } + + if (write(fd, &buffer, count) < 0) + goto error; + + (void) close(fd); + + return; + + error: + err(EX_OSERR, "ERROR: Cannot write \"%s\"", pathname); +} + +/* + * Determine the full pathname of a gmon.out file for a given + * (image,pmcid) combination. Return the interned string. + */ + +pmcstat_interned_string +pmcstat_gmon_create_name(const char *samplesdir, struct pmcstat_image *image, + pmc_id_t pmcid) +{ + const char *pmcname; + char fullpath[PATH_MAX]; + + pmcname = pmcstat_pmcid_to_name(pmcid); + + (void) snprintf(fullpath, sizeof(fullpath), + "%s/%s/%s", samplesdir, pmcname, + pmcstat_string_unintern(image->pi_samplename)); + + return (pmcstat_string_intern(fullpath)); +} + + +/* + * Mmap in a gmon.out file for processing. + */ + +static void +pmcstat_gmon_map_file(struct pmcstat_gmonfile *pgf) +{ + int fd; + const char *pathname; + + pathname = pmcstat_string_unintern(pgf->pgf_name); + + /* the gmon.out file must already exist */ + if ((fd = open(pathname, O_RDWR | O_NOFOLLOW, 0)) < 0) + err(EX_OSERR, "ERROR: cannot open \"%s\"", pathname); + + pgf->pgf_gmondata = mmap(NULL, pgf->pgf_ndatabytes, + PROT_READ|PROT_WRITE, MAP_NOSYNC|MAP_SHARED, fd, 0); + + if (pgf->pgf_gmondata == MAP_FAILED) + err(EX_OSERR, "ERROR: cannot map \"%s\"", pathname); + + (void) close(fd); +} + +/* + * Unmap a gmon.out file after sync'ing its data to disk. + */ + +static void +pmcstat_gmon_unmap_file(struct pmcstat_gmonfile *pgf) +{ + (void) msync(pgf->pgf_gmondata, pgf->pgf_ndatabytes, + MS_SYNC); + (void) munmap(pgf->pgf_gmondata, pgf->pgf_ndatabytes); + pgf->pgf_gmondata = NULL; +} + +static void +pmcstat_gmon_append_arc(struct pmcstat_image *image, pmc_id_t pmcid, + uintptr_t rawfrom, uintptr_t rawto, uint32_t count) +{ + struct rawarc arc; /* from */ + const char *pathname; + struct pmcstat_gmonfile *pgf; + + if ((pgf = pmcstat_image_find_gmonfile(image, pmcid)) == NULL) + return; + + if (pgf->pgf_file == NULL) { + pathname = pmcstat_string_unintern(pgf->pgf_name); + if ((pgf->pgf_file = fopen(pathname, "a")) == NULL) + return; + } + + arc.raw_frompc = rawfrom + image->pi_vaddr; + arc.raw_selfpc = rawto + image->pi_vaddr; + arc.raw_count = count; + + (void) fwrite(&arc, sizeof(arc), 1, pgf->pgf_file); + +} + +static struct pmcstat_gmonfile * +pmcstat_image_find_gmonfile(struct pmcstat_image *image, pmc_id_t pmcid) +{ + struct pmcstat_gmonfile *pgf; + LIST_FOREACH(pgf, &image->pi_gmlist, pgf_next) + if (pgf->pgf_pmcid == pmcid) + return (pgf); + return (NULL); +} + +static void +pmcstat_cgnode_do_gmon_arcs(struct pmcstat_cgnode *cg, pmc_id_t pmcid) +{ + struct pmcstat_cgnode *cgc; + + /* + * Look for child nodes that belong to the same image. + */ + + LIST_FOREACH(cgc, &cg->pcg_children, pcg_sibling) { + if (cgc->pcg_image == cg->pcg_image) + pmcstat_gmon_append_arc(cg->pcg_image, pmcid, + cgc->pcg_func, cg->pcg_func, cgc->pcg_count); + if (cgc->pcg_nchildren > 0) + pmcstat_cgnode_do_gmon_arcs(cgc, pmcid); + } +} + +static void +pmcstat_callgraph_do_gmon_arcs_for_pmcid(pmc_id_t pmcid) +{ + int n; + struct pmcstat_cgnode_hash *pch; + + for (n = 0; n < PMCSTAT_NHASH; n++) + LIST_FOREACH(pch, &pmcstat_cgnode_hash[n], pch_next) + if (pch->pch_pmcid == pmcid && + pch->pch_cgnode->pcg_nchildren > 1) + pmcstat_cgnode_do_gmon_arcs(pch->pch_cgnode, + pmcid); +} + + +static void +pmcstat_callgraph_do_gmon_arcs(void) +{ + struct pmcstat_pmcrecord *pmcr; + + LIST_FOREACH(pmcr, &pmcstat_pmcs, pr_next) + pmcstat_callgraph_do_gmon_arcs_for_pmcid(pmcr->pr_pmcid); +} + +void +pmcpl_gmon_initimage(struct pmcstat_image *pi) +{ + int count, nlen; + char *sn; + char name[NAME_MAX]; + + /* + * Look for a suitable name for the sample files associated + * with this image: if `basename(path)`+".gmon" is available, + * we use that, otherwise we try iterating through + * `basename(path)`+ "~" + NNN + ".gmon" till we get a free + * entry. + */ + if ((sn = basename(pmcstat_string_unintern(pi->pi_execpath))) == NULL) + err(EX_OSERR, "ERROR: Cannot process \"%s\"", + pmcstat_string_unintern(pi->pi_execpath)); + + nlen = strlen(sn); + nlen = min(nlen, (int) (sizeof(name) - sizeof(".gmon"))); + + snprintf(name, sizeof(name), "%.*s.gmon", nlen, sn); + + /* try use the unabridged name first */ + if (pmcstat_string_lookup(name) == NULL) + pi->pi_samplename = pmcstat_string_intern(name); + else { + /* + * Otherwise use a prefix from the original name and + * upto 3 digits. + */ + nlen = strlen(sn); + nlen = min(nlen, (int) (sizeof(name)-sizeof("~NNN.gmon"))); + count = 0; + do { + if (++count > 999) + errx(EX_CANTCREAT, "ERROR: cannot create a " + "gmon file for \"%s\"", name); + snprintf(name, sizeof(name), "%.*s~%3.3d.gmon", + nlen, sn, count); + if (pmcstat_string_lookup(name) == NULL) { + pi->pi_samplename = + pmcstat_string_intern(name); + count = 0; + } + } while (count > 0); + } + + LIST_INIT(&pi->pi_gmlist); +} + +void +pmcpl_gmon_shutdownimage(struct pmcstat_image *pi) +{ + struct pmcstat_gmonfile *pgf, *pgftmp; + + LIST_FOREACH_SAFE(pgf, &pi->pi_gmlist, pgf_next, pgftmp) { + if (pgf->pgf_file) + (void) fclose(pgf->pgf_file); + LIST_REMOVE(pgf, pgf_next); + free(pgf); + } +} + +void +pmcpl_gmon_newpmc(pmcstat_interned_string ps, struct pmcstat_pmcrecord *pr) +{ + struct stat st; + char fullpath[PATH_MAX]; + + (void) pr; + + /* + * Create the appropriate directory to hold gmon.out files. + */ + + (void) snprintf(fullpath, sizeof(fullpath), "%s/%s", args.pa_samplesdir, + pmcstat_string_unintern(ps)); + + /* If the path name exists, it should be a directory */ + if (stat(fullpath, &st) == 0 && S_ISDIR(st.st_mode)) + return; + + if (mkdir(fullpath, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) < 0) + err(EX_OSERR, "ERROR: Cannot create directory \"%s\"", + fullpath); +} + +/* + * Increment the bucket in the gmon.out file corresponding to 'pmcid' + * and 'pc'. + */ + +void +pmcpl_gmon_process(struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu) +{ + struct pmcstat_pcmap *map; + struct pmcstat_image *image; + struct pmcstat_gmonfile *pgf; + uintfptr_t bucket; + HISTCOUNTER *hc; + pmc_id_t pmcid; + + (void) nsamples; (void) usermode; (void) cpu; + + map = pmcstat_process_find_map(usermode ? pp : pmcstat_kernproc, cc[0]); + if (map == NULL) { + /* Unknown offset. */ + pmcstat_stats.ps_samples_unknown_offset++; + return; + } + + assert(cc[0] >= map->ppm_lowpc && cc[0] < map->ppm_highpc); + + image = map->ppm_image; + pmcid = pmcr->pr_pmcid; + + /* + * If this is the first time we are seeing a sample for + * this executable image, try determine its parameters. + */ + if (image->pi_type == PMCSTAT_IMAGE_UNKNOWN) + pmcstat_image_determine_type(image); + + assert(image->pi_type != PMCSTAT_IMAGE_UNKNOWN); + + /* Ignore samples in images that we know nothing about. */ + if (image->pi_type == PMCSTAT_IMAGE_INDETERMINABLE) { + pmcstat_stats.ps_samples_indeterminable++; + return; + } + + /* + * Find the gmon file corresponding to 'pmcid', creating it if + * needed. + */ + pgf = pmcstat_image_find_gmonfile(image, pmcid); + if (pgf == NULL) { + if ((pgf = calloc(1, sizeof(*pgf))) == NULL) + err(EX_OSERR, "ERROR:"); + + pgf->pgf_gmondata = NULL; /* mark as unmapped */ + pgf->pgf_name = pmcstat_gmon_create_name(args.pa_samplesdir, + image, pmcid); + pgf->pgf_pmcid = pmcid; + assert(image->pi_end > image->pi_start); + pgf->pgf_nbuckets = (image->pi_end - image->pi_start) / + FUNCTION_ALIGNMENT; /* see */ + pgf->pgf_ndatabytes = sizeof(struct gmonhdr) + + pgf->pgf_nbuckets * sizeof(HISTCOUNTER); + pgf->pgf_nsamples = 0; + pgf->pgf_file = NULL; + + pmcstat_gmon_create_file(pgf, image); + + LIST_INSERT_HEAD(&image->pi_gmlist, pgf, pgf_next); + } + + /* + * Map the gmon file in if needed. It may have been mapped + * out under memory pressure. + */ + if (pgf->pgf_gmondata == NULL) + pmcstat_gmon_map_file(pgf); + + assert(pgf->pgf_gmondata != NULL); + + /* + * + */ + + bucket = (cc[0] - map->ppm_lowpc) / FUNCTION_ALIGNMENT; + + assert(bucket < pgf->pgf_nbuckets); + + hc = (HISTCOUNTER *) ((uintptr_t) pgf->pgf_gmondata + + sizeof(struct gmonhdr)); + + /* saturating add */ + if (hc[bucket] < 0xFFFFU) /* XXX tie this to sizeof(HISTCOUNTER) */ + hc[bucket]++; + else /* mark that an overflow occurred */ + pgf->pgf_overflow = 1; + + pgf->pgf_nsamples++; +} + +/* + * Shutdown module. + */ + +void +pmcpl_gmon_shutdown(FILE *mf) +{ + int i; + struct pmcstat_gmonfile *pgf; + struct pmcstat_image *pi; + + /* + * Sync back all gprof flat profile data. + */ + for (i = 0; i < PMCSTAT_NHASH; i++) { + LIST_FOREACH(pi, &pmcstat_image_hash[i], pi_next) { + if (mf) + (void) fprintf(mf, " \"%s\" => \"%s\"", + pmcstat_string_unintern(pi->pi_execpath), + pmcstat_string_unintern( + pi->pi_samplename)); + + /* flush gmon.out data to disk */ + LIST_FOREACH(pgf, &pi->pi_gmlist, pgf_next) { + pmcstat_gmon_unmap_file(pgf); + if (mf) + (void) fprintf(mf, " %s/%d", + pmcstat_pmcid_to_name( + pgf->pgf_pmcid), + pgf->pgf_nsamples); + if (pgf->pgf_overflow && args.pa_verbosity >= 1) + warnx("WARNING: profile \"%s\" " + "overflowed.", + pmcstat_string_unintern( + pgf->pgf_name)); + } + + if (mf) + (void) fprintf(mf, "\n"); + } + } + + /* + * Compute arcs and add these to the gprof files. + */ + if (args.pa_flags & FLAG_DO_GPROF && args.pa_graphdepth > 1) + pmcstat_callgraph_do_gmon_arcs(); +} diff --git a/usr.sbin/pmcstat/pmcpl_gprof.h b/usr.sbin/pmcstat/pmcpl_gprof.h new file mode 100644 index 000000000000..069082fe3e22 --- /dev/null +++ b/usr.sbin/pmcstat/pmcpl_gprof.h @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2005-2007, Joseph Koshy + * Copyright (c) 2007 The FreeBSD Foundation + * Copyright (c) 2009, Fabien Thomas + * All rights reserved. + * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * + * 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$ + */ + +#ifndef _PMCSTAT_PL_GPROF_H_ +#define _PMCSTAT_PL_GPROF_H_ + +/* Function prototypes */ +void pmcpl_gmon_shutdown(FILE *mf); +void pmcpl_gmon_process( + struct pmcstat_process *pp, struct pmcstat_pmcrecord *pmcr, + uint32_t nsamples, uintfptr_t *cc, int usermode, uint32_t cpu); +void pmcpl_gmon_initimage(struct pmcstat_image *pi); +void pmcpl_gmon_shutdownimage(struct pmcstat_image *pi); +void pmcpl_gmon_newpmc(pmcstat_interned_string ps, + struct pmcstat_pmcrecord *pr); + +#endif /* _PMCSTAT_PL_GPROF_H_ */ diff --git a/usr.sbin/pmcstat/pmcstat.8 b/usr.sbin/pmcstat/pmcstat.8 index a4e6f1f87a42..309eb3eae2d4 100644 --- a/usr.sbin/pmcstat/pmcstat.8 +++ b/usr.sbin/pmcstat/pmcstat.8 @@ -36,6 +36,7 @@ .Op Fl C .Op Fl D Ar pathname .Op Fl E +.Op Fl F Ar pathname .Op Fl G Ar pathname .Op Fl M Ar mapfilename .Op Fl N @@ -43,9 +44,11 @@ .Op Fl P Ar event-spec .Op Fl R Ar logfilename .Op Fl S Ar event-spec +.Op Fl T .Op Fl W .Op Fl c Ar cpu-spec .Op Fl d +.Op Fl f Ar pluginopt .Op Fl g .Op Fl k Ar kerneldir .Op Fl m Ar pathname @@ -129,6 +132,16 @@ complex pipeline of processes when used in conjunction with the .Fl d option. The default is to not to enable per-process tracking. +.It Fl F Ar pathname +Print calltree (Kcachegrind) information to file +.Ar pathname . +If argument +.Ar pathname +is a +.Dq Li - +this information is sent to the output file specified by the +.Fl o +option. .It Fl G Ar pathname Print callchain information to file .Ar pathname . @@ -195,6 +208,12 @@ Perform offline analysis using sampling data in file Allocate a system mode sampling PMC measuring hardware events specified in .Ar event-spec . +.It Fl T +Use a top like mode for sampling PMCs. The following hotkeys +can be used: 'c+a' switch to accumulative mode, 'c+d' switch +to delta mode, 'm' merge PMCs, 'n' change view, 'p' show next +PMC, ' ' pause, 'q' quit. calltree only: 'f' cost under threshold +is seen as a dot. .It Fl W Toggle logging the incremental counts seen by the threads of a tracked process each time they are scheduled on a CPU. @@ -218,6 +237,12 @@ Toggle between process mode PMCs measuring events for the target process' current and future children or only measuring events for the target process. The default is to measure events for the target process alone. +.It Fl f Ar pluginopt +Pass option string to the active plugin. +.br +threshold= do not display cost under specified value (Top). +.br +skiplink=0|1 replace node with cost under threshold by a dot (Top). .It Fl g Produce profiles in a format compatible with .Xr gprof 1 . @@ -286,7 +311,8 @@ regular expression for selecting processes based on their command names. .It Fl v Increase verbosity. .It Fl w Ar secs -Print the values of all counting mode PMCs every +Print the values of all counting mode PMCs or sampling mode PMCs +for top mode every .Ar secs seconds. The argument diff --git a/usr.sbin/pmcstat/pmcstat.c b/usr.sbin/pmcstat/pmcstat.c index 6496ddbeb1a0..a73d29380f1a 100644 --- a/usr.sbin/pmcstat/pmcstat.c +++ b/usr.sbin/pmcstat/pmcstat.c @@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -106,13 +107,15 @@ __FBSDID("$FreeBSD$"); int pmcstat_interrupt = 0; int pmcstat_displayheight = DEFAULT_DISPLAY_HEIGHT; +int pmcstat_displaywidth = DEFAULT_DISPLAY_WIDTH; int pmcstat_sockpair[NSOCKPAIRFD]; int pmcstat_kq; kvm_t *pmcstat_kvm; struct kinfo_proc *pmcstat_plist; +struct pmcstat_args args; void -pmcstat_attach_pmcs(struct pmcstat_args *a) +pmcstat_attach_pmcs(void) { struct pmcstat_ev *ev; struct pmcstat_target *pt; @@ -120,10 +123,10 @@ pmcstat_attach_pmcs(struct pmcstat_args *a) /* Attach all process PMCs to target processes. */ count = 0; - STAILQ_FOREACH(ev, &a->pa_events, ev_next) { + STAILQ_FOREACH(ev, &args.pa_events, ev_next) { if (PMC_IS_SYSTEM_MODE(ev->ev_mode)) continue; - SLIST_FOREACH(pt, &a->pa_targets, pt_next) + SLIST_FOREACH(pt, &args.pa_targets, pt_next) if (pmc_attach(ev->ev_pmcid, pt->pt_pid) == 0) count++; else if (errno != ESRCH) @@ -138,12 +141,12 @@ pmcstat_attach_pmcs(struct pmcstat_args *a) void -pmcstat_cleanup(struct pmcstat_args *a) +pmcstat_cleanup(void) { struct pmcstat_ev *ev, *tmp; /* release allocated PMCs. */ - STAILQ_FOREACH_SAFE(ev, &a->pa_events, ev_next, tmp) + STAILQ_FOREACH_SAFE(ev, &args.pa_events, ev_next, tmp) if (ev->ev_pmcid != PMC_ID_INVALID) { if (pmc_stop(ev->ev_pmcid) < 0) err(EX_OSERR, "ERROR: cannot stop pmc 0x%x " @@ -153,25 +156,25 @@ pmcstat_cleanup(struct pmcstat_args *a) "0x%x \"%s\"", ev->ev_pmcid, ev->ev_name); free(ev->ev_name); free(ev->ev_spec); - STAILQ_REMOVE(&a->pa_events, ev, pmcstat_ev, ev_next); + STAILQ_REMOVE(&args.pa_events, ev, pmcstat_ev, ev_next); free(ev); } /* de-configure the log file if present. */ - if (a->pa_flags & (FLAG_HAS_PIPE | FLAG_HAS_OUTPUT_LOGFILE)) + if (args.pa_flags & (FLAG_HAS_PIPE | FLAG_HAS_OUTPUT_LOGFILE)) (void) pmc_configure_logfile(-1); - if (a->pa_logparser) { - pmclog_close(a->pa_logparser); - a->pa_logparser = NULL; + if (args.pa_logparser) { + pmclog_close(args.pa_logparser); + args.pa_logparser = NULL; } - if (a->pa_flags & (FLAG_HAS_PIPE | FLAG_HAS_OUTPUT_LOGFILE)) - pmcstat_shutdown_logging(a); + if (args.pa_flags & (FLAG_HAS_PIPE | FLAG_HAS_OUTPUT_LOGFILE)) + pmcstat_shutdown_logging(); } void -pmcstat_clone_event_descriptor(struct pmcstat_args *a, struct pmcstat_ev *ev, +pmcstat_clone_event_descriptor(struct pmcstat_ev *ev, uint32_t cpumask) { int cpu; @@ -194,14 +197,14 @@ pmcstat_clone_event_descriptor(struct pmcstat_args *a, struct pmcstat_ev *ev, ev_clone->ev_saved = ev->ev_saved; ev_clone->ev_spec = strdup(ev->ev_spec); - STAILQ_INSERT_TAIL(&a->pa_events, ev_clone, ev_next); + STAILQ_INSERT_TAIL(&args.pa_events, ev_clone, ev_next); cpumask &= ~(1 << cpu); } } void -pmcstat_create_process(struct pmcstat_args *a) +pmcstat_create_process(void) { char token; pid_t pid; @@ -229,10 +232,10 @@ pmcstat_create_process(struct pmcstat_args *a) (void) close(pmcstat_sockpair[CHILDSOCKET]); /* exec() the program requested */ - execvp(*a->pa_argv, a->pa_argv); + execvp(*args.pa_argv, args.pa_argv); /* and if that fails, notify the parent */ kill(getppid(), SIGCHLD); - err(EX_OSERR, "ERROR: execvp \"%s\" failed", *a->pa_argv); + err(EX_OSERR, "ERROR: execvp \"%s\" failed", *args.pa_argv); /*NOTREACHED*/ default: /* parent */ @@ -250,7 +253,7 @@ pmcstat_create_process(struct pmcstat_args *a) errx(EX_SOFTWARE, "ERROR: Out of memory."); pt->pt_pid = pid; - SLIST_INSERT_HEAD(&a->pa_targets, pt, pt_next); + SLIST_INSERT_HEAD(&args.pa_targets, pt, pt_next); /* Wait for the child to signal that its ready to go. */ if (read(pmcstat_sockpair[PARENTSOCKET], &token, 1) < 0) @@ -260,7 +263,7 @@ pmcstat_create_process(struct pmcstat_args *a) } void -pmcstat_find_targets(struct pmcstat_args *a, const char *spec) +pmcstat_find_targets(const char *spec) { int n, nproc, pid, rv; struct pmcstat_target *pt; @@ -275,7 +278,7 @@ pmcstat_find_targets(struct pmcstat_args *a, const char *spec) if ((pt = malloc(sizeof(*pt))) == NULL) goto outofmemory; pt->pt_pid = pid; - SLIST_INSERT_HEAD(&a->pa_targets, pt, pt_next); + SLIST_INSERT_HEAD(&args.pa_targets, pt, pt_next); return; } @@ -302,7 +305,7 @@ pmcstat_find_targets(struct pmcstat_args *a, const char *spec) if ((pt = malloc(sizeof(*pt))) == NULL) goto outofmemory; pt->pt_pid = kp->ki_pid; - SLIST_INSERT_HEAD(&a->pa_targets, pt, pt_next); + SLIST_INSERT_HEAD(&args.pa_targets, pt, pt_next); } else if (rv != REG_NOMATCH) { regerror(rv, ®, errbuf, sizeof(errbuf)); errx(EX_SOFTWARE, "ERROR: Regex evalation failed: %s", @@ -343,17 +346,17 @@ pmcstat_get_cpumask(const char *cpuspec) } void -pmcstat_kill_process(struct pmcstat_args *a) +pmcstat_kill_process(void) { struct pmcstat_target *pt; - assert(a->pa_flags & FLAG_HAS_COMMANDLINE); + assert(args.pa_flags & FLAG_HAS_COMMANDLINE); /* * If a command line was specified, it would be the very first * in the list, before any other processes specified by -t. */ - pt = SLIST_FIRST(&a->pa_targets); + pt = SLIST_FIRST(&args.pa_targets); assert(pt != NULL); if (kill(pt->pt_pid, SIGINT) != 0) @@ -361,7 +364,7 @@ pmcstat_kill_process(struct pmcstat_args *a) } void -pmcstat_start_pmcs(struct pmcstat_args *a) +pmcstat_start_pmcs(void) { struct pmcstat_ev *ev; @@ -372,7 +375,7 @@ pmcstat_start_pmcs(struct pmcstat_args *a) if (pmc_start(ev->ev_pmcid) < 0) { warn("ERROR: Cannot start pmc 0x%x \"%s\"", ev->ev_pmcid, ev->ev_name); - pmcstat_cleanup(a); + pmcstat_cleanup(); exit(EX_OSERR); } } @@ -380,37 +383,37 @@ pmcstat_start_pmcs(struct pmcstat_args *a) } void -pmcstat_print_headers(struct pmcstat_args *a) +pmcstat_print_headers(void) { struct pmcstat_ev *ev; int c, w; - (void) fprintf(a->pa_printfile, PRINT_HEADER_PREFIX); + (void) fprintf(args.pa_printfile, PRINT_HEADER_PREFIX); - STAILQ_FOREACH(ev, &a->pa_events, ev_next) { + STAILQ_FOREACH(ev, &args.pa_events, ev_next) { if (PMC_IS_SAMPLING_MODE(ev->ev_mode)) continue; c = PMC_IS_SYSTEM_MODE(ev->ev_mode) ? 's' : 'p'; if (ev->ev_fieldskip != 0) - (void) fprintf(a->pa_printfile, "%*s", + (void) fprintf(args.pa_printfile, "%*s", ev->ev_fieldskip, ""); w = ev->ev_fieldwidth - ev->ev_fieldskip - 2; if (c == 's') - (void) fprintf(a->pa_printfile, "s/%02d/%-*s ", + (void) fprintf(args.pa_printfile, "s/%02d/%-*s ", ev->ev_cpu, w-3, ev->ev_name); else - (void) fprintf(a->pa_printfile, "p/%*s ", w, + (void) fprintf(args.pa_printfile, "p/%*s ", w, ev->ev_name); } - (void) fflush(a->pa_printfile); + (void) fflush(args.pa_printfile); } void -pmcstat_print_counters(struct pmcstat_args *a) +pmcstat_print_counters(void) { int extra_width; struct pmcstat_ev *ev; @@ -418,7 +421,7 @@ pmcstat_print_counters(struct pmcstat_args *a) extra_width = sizeof(PRINT_HEADER_PREFIX) - 1; - STAILQ_FOREACH(ev, &a->pa_events, ev_next) { + STAILQ_FOREACH(ev, &args.pa_events, ev_next) { /* skip sampling mode counters */ if (PMC_IS_SAMPLING_MODE(ev->ev_mode)) @@ -428,7 +431,7 @@ pmcstat_print_counters(struct pmcstat_args *a) err(EX_OSERR, "ERROR: Cannot read pmc " "\"%s\"", ev->ev_name); - (void) fprintf(a->pa_printfile, "%*ju ", + (void) fprintf(args.pa_printfile, "%*ju ", ev->ev_fieldwidth + extra_width, (uintmax_t) ev->ev_cumulative ? value : (value - ev->ev_saved)); @@ -438,7 +441,7 @@ pmcstat_print_counters(struct pmcstat_args *a) extra_width = 0; } - (void) fflush(a->pa_printfile); + (void) fflush(args.pa_printfile); } /* @@ -446,20 +449,20 @@ pmcstat_print_counters(struct pmcstat_args *a) */ void -pmcstat_print_pmcs(struct pmcstat_args *a) +pmcstat_print_pmcs(void) { static int linecount = 0; /* check if we need to print a header line */ if (++linecount > pmcstat_displayheight) { - (void) fprintf(a->pa_printfile, "\n"); + (void) fprintf(args.pa_printfile, "\n"); linecount = 1; } if (linecount == 1) - pmcstat_print_headers(a); - (void) fprintf(a->pa_printfile, "\n"); + pmcstat_print_headers(); + (void) fprintf(args.pa_printfile, "\n"); - pmcstat_print_counters(a); + pmcstat_print_counters(); return; } @@ -493,6 +496,8 @@ pmcstat_show_usage(void) "\t -C\t\t (toggle) show cumulative counts\n" "\t -D path\t create profiles in directory \"path\"\n" "\t -E\t\t (toggle) show counts at process exit\n" + "\t -F file\t write a system-wide callgraph (Kcachegrind format)" + " to \"file\"\n" "\t -G file\t write a system-wide callgraph to \"file\"\n" "\t -M file\t print executable/gmon file map to \"file\"\n" "\t -N\t\t (toggle) capture callchains\n" @@ -500,9 +505,11 @@ pmcstat_show_usage(void) "\t -P spec\t allocate a process-private sampling PMC\n" "\t -R file\t read events from \"file\"\n" "\t -S spec\t allocate a system-wide sampling PMC\n" + "\t -T\t\t start in top mode\n" "\t -W\t\t (toggle) show counts per context switch\n" "\t -c cpu-list\t set cpus for subsequent system-wide PMCs\n" "\t -d\t\t (toggle) track descendants\n" + "\t -f spec\t pass \"spec\" to as plugin option\n" "\t -g\t\t produce gprof(1) compatible profiles\n" "\t -k dir\t\t set the path to the kernel\n" "\t -n rate\t set sampling rate\n" @@ -519,6 +526,24 @@ pmcstat_show_usage(void) ); } +/* + * At exit handler for top mode + */ + +void +pmcstat_topexit(void) +{ + if (!args.pa_toptty) + return; + + /* + * Shutdown ncurses. + */ + clrtoeol(); + refresh(); + endwin(); +} + /* * Main */ @@ -535,6 +560,7 @@ main(int argc, char **argv) int graphdepth; int pipefd[2]; int use_cumulative_counts; + short cf, cb; uint32_t cpumask; char *end, *tmp; const char *errmsg, *graphfilename; @@ -570,6 +596,13 @@ main(int argc, char **argv) args.pa_mapfilename = NULL; args.pa_inputpath = NULL; args.pa_outputpath = NULL; + args.pa_pplugin = PMCSTAT_PL_NONE; + args.pa_plugin = PMCSTAT_PL_NONE; + args.pa_ctdumpinstr = 1; + args.pa_topmode = PMCSTAT_TOP_DELTA; + args.pa_toptty = 0; + args.pa_topcolor = 0; + args.pa_mergepmc = 0; STAILQ_INIT(&args.pa_events); SLIST_INIT(&args.pa_targets); bzero(&ds_start, sizeof(ds_start)); @@ -594,7 +627,7 @@ main(int argc, char **argv) } while ((option = getopt(argc, argv, - "CD:EG:M:NO:P:R:S:Wc:dgk:m:n:o:p:qr:s:t:vw:z:")) != -1) + "CD:EF:G:M:NO:P:R:S:TWc:df:gk:m:n:o:p:qr:s:t:vw:z:")) != -1) switch (option) { case 'C': /* cumulative values */ use_cumulative_counts = !use_cumulative_counts; @@ -628,13 +661,28 @@ main(int argc, char **argv) args.pa_required |= FLAG_HAS_PROCESS_PMCS; break; + case 'F': /* produce a system-wide calltree */ + args.pa_flags |= FLAG_DO_CALLGRAPHS; + args.pa_plugin = PMCSTAT_PL_CALLTREE; + graphfilename = optarg; + break; + + case 'f': /* plugins options */ + if (args.pa_plugin == PMCSTAT_PL_NONE) + err(EX_USAGE, "ERROR: Need -g/-G/-m/-T."); + pmcstat_pluginconfigure_log(optarg); + break; + case 'G': /* produce a system-wide callgraph */ args.pa_flags |= FLAG_DO_CALLGRAPHS; + args.pa_plugin = PMCSTAT_PL_CALLGRAPH; graphfilename = optarg; break; case 'g': /* produce gprof compatible profiles */ args.pa_flags |= FLAG_DO_GPROF; + args.pa_pplugin = PMCSTAT_PL_CALLGRAPH; + args.pa_plugin = PMCSTAT_PL_GPROF; break; case 'k': /* pathname to the kernel */ @@ -645,8 +693,9 @@ main(int argc, char **argv) break; case 'm': - args.pa_flags |= FLAG_WANTS_MAPPINGS; - graphfilename = optarg; + args.pa_flags |= FLAG_DO_ANNOTATE; + args.pa_plugin = PMCSTAT_PL_ANNOTATE; + graphfilename = optarg; break; case 'E': /* log process exit */ @@ -732,7 +781,7 @@ main(int argc, char **argv) STAILQ_INSERT_TAIL(&args.pa_events, ev, ev_next); if (option == 's' || option == 'S') - pmcstat_clone_event_descriptor(&args, ev, + pmcstat_clone_event_descriptor(ev, cpumask & ~(1 << ev->ev_cpu)); break; @@ -782,12 +831,21 @@ main(int argc, char **argv) break; case 't': /* target pid or process name */ - pmcstat_find_targets(&args, optarg); + pmcstat_find_targets(optarg); args.pa_flags |= FLAG_HAS_TARGET; args.pa_required |= FLAG_HAS_PROCESS_PMCS; break; + case 'T': /* top mode */ + args.pa_flags |= FLAG_DO_TOP; + args.pa_plugin = PMCSTAT_PL_CALLGRAPH; + args.pa_ctdumpinstr = 0; + args.pa_mergepmc = 1; + if (args.pa_printfile == stderr) + args.pa_printfile = stdout; + break; + case 'v': /* verbose */ args.pa_verbosity++; break; @@ -798,7 +856,6 @@ main(int argc, char **argv) errx(EX_USAGE, "ERROR: Illegal wait interval " "value \"%s\".", optarg); args.pa_flags |= FLAG_HAS_WAIT_INTERVAL; - args.pa_required |= FLAG_HAS_COUNTING_PMCS; args.pa_interval = interval; break; @@ -833,7 +890,7 @@ main(int argc, char **argv) args.pa_flags |= FLAG_HAS_COMMANDLINE; if (args.pa_flags & (FLAG_DO_GPROF | FLAG_DO_CALLGRAPHS | - FLAG_WANTS_MAPPINGS)) + FLAG_DO_ANNOTATE | FLAG_DO_TOP)) args.pa_flags |= FLAG_DO_ANALYSIS; /* @@ -846,11 +903,11 @@ main(int argc, char **argv) "exclusive."); /* -m option is allowed with -R only. */ - if (args.pa_flags & FLAG_WANTS_MAPPINGS && args.pa_inputpath == NULL) + if (args.pa_flags & FLAG_DO_ANNOTATE && args.pa_inputpath == NULL) errx(EX_USAGE, "ERROR: option -m requires an input file"); /* -m option is not allowed combined with -g or -G. */ - if (args.pa_flags & FLAG_WANTS_MAPPINGS && + if (args.pa_flags & FLAG_DO_ANNOTATE && args.pa_flags & (FLAG_DO_GPROF | FLAG_DO_CALLGRAPHS)) errx(EX_USAGE, "ERROR: option -m and -g | -G are mutually " "exclusive"); @@ -904,7 +961,7 @@ main(int argc, char **argv) /* check for counting mode options without a counting PMC */ if ((args.pa_required & FLAG_HAS_COUNTING_PMCS) && (args.pa_flags & FLAG_HAS_COUNTING_PMCS) == 0) - errx(EX_USAGE, "ERROR: options -C, -W, -o and -w require at " + errx(EX_USAGE, "ERROR: options -C, -W and -o require at " "least one counting mode PMC to be specified."); /* check for sampling mode options without a sampling PMC spec */ @@ -913,10 +970,10 @@ main(int argc, char **argv) errx(EX_USAGE, "ERROR: options -N, -n and -O require at " "least one sampling mode PMC to be specified."); - /* check if -g/-G are being used correctly */ + /* check if -g/-G/-m/-T are being used correctly */ if ((args.pa_flags & FLAG_DO_ANALYSIS) && !(args.pa_flags & (FLAG_HAS_SAMPLING_PMCS|FLAG_READ_LOGFILE))) - errx(EX_USAGE, "ERROR: options -g/-G require sampling PMCs " + errx(EX_USAGE, "ERROR: options -g/-G/-m/-T require sampling PMCs " "or -R to be specified."); /* check if -O was spuriously specified */ @@ -926,11 +983,11 @@ main(int argc, char **argv) "ERROR: option -O is used only with options " "-E, -P, -S and -W."); - /* -k kernel path require -g/-G or -R */ + /* -k kernel path require -g/-G/-m/-T or -R */ if ((args.pa_flags & FLAG_HAS_KERNELPATH) && (args.pa_flags & FLAG_DO_ANALYSIS) == 0 && (args.pa_flags & FLAG_READ_LOGFILE) == 0) - errx(EX_USAGE, "ERROR: option -k is only used with -g/-R."); + errx(EX_USAGE, "ERROR: option -k is only used with -g/-R/-m/-T."); /* -D only applies to gprof output mode (-g) */ if ((args.pa_flags & FLAG_HAS_SAMPLESDIR) && @@ -943,6 +1000,11 @@ main(int argc, char **argv) (args.pa_flags & FLAG_READ_LOGFILE) == 0) errx(EX_USAGE, "ERROR: option -M is only used with -g/-R."); + /* -T is incompatible with -R (replay logfile is a TODO) */ + if ((args.pa_flags & FLAG_DO_TOP) && + (args.pa_flags & FLAG_READ_LOGFILE)) + errx(EX_USAGE, "ERROR: option -T is incompatible with -R."); + /* * Disallow textual output of sampling PMCs if counting PMCs * have also been asked for, mostly because the combined output @@ -996,7 +1058,7 @@ main(int argc, char **argv) "for writing", graphfilename); } } - if (args.pa_flags & FLAG_WANTS_MAPPINGS) { + if (args.pa_flags & FLAG_DO_ANNOTATE) { args.pa_graphfile = fopen(graphfilename, "w"); if (args.pa_graphfile == NULL) err(EX_OSERR, "ERROR: cannot open \"%s\" for writing", @@ -1012,13 +1074,13 @@ main(int argc, char **argv) if ((args.pa_flags & FLAG_DO_ANALYSIS) == 0) args.pa_flags |= FLAG_DO_PRINT; - pmcstat_initialize_logging(&args); + pmcstat_initialize_logging(); args.pa_logfd = pmcstat_open_log(args.pa_inputpath, PMCSTAT_OPEN_FOR_READ); if ((args.pa_logparser = pmclog_open(args.pa_logfd)) == NULL) err(EX_OSERR, "ERROR: Cannot create parser"); - pmcstat_process_log(&args); - pmcstat_shutdown_logging(&args); + pmcstat_process_log(); + pmcstat_shutdown_logging(); exit(EX_OK); } @@ -1062,7 +1124,9 @@ main(int argc, char **argv) args.pa_logfd = pipefd[WRITEPIPEFD]; - args.pa_flags |= (FLAG_HAS_PIPE | FLAG_DO_PRINT); + args.pa_flags |= FLAG_HAS_PIPE; + if ((args.pa_flags & FLAG_DO_TOP) == 0) + args.pa_flags |= FLAG_DO_PRINT; args.pa_logparser = pmclog_open(pipefd[READPIPEFD]); } @@ -1126,12 +1190,24 @@ main(int argc, char **argv) err(EX_OSERR, "ERROR: Cannot determine window size"); pmcstat_displayheight = ws.ws_row - 1; + pmcstat_displaywidth = ws.ws_col - 1; EV_SET(&kev, SIGWINCH, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL); if (kevent(pmcstat_kq, &kev, 1, NULL, 0, NULL) < 0) err(EX_OSERR, "ERROR: Cannot register kevent for " "SIGWINCH"); + + args.pa_toptty = 1; + } + + /* + * Listen to key input in top mode. + */ + if (args.pa_flags & FLAG_DO_TOP) { + EV_SET(&kev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, NULL); + if (kevent(pmcstat_kq, &kev, 1, NULL, 0, NULL) < 0) + err(EX_OSERR, "ERROR: Cannot register kevent"); } EV_SET(&kev, SIGINT, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL); @@ -1152,9 +1228,13 @@ main(int argc, char **argv) if (kevent(pmcstat_kq, &kev, 1, NULL, 0, NULL) < 0) err(EX_OSERR, "ERROR: Cannot register kevent for SIGCHLD"); - /* setup a timer if we have counting mode PMCs needing to be printed */ - if ((args.pa_flags & FLAG_HAS_COUNTING_PMCS) && - (args.pa_required & FLAG_HAS_OUTPUT_LOGFILE) == 0) { + /* + * Setup a timer if we have counting mode PMCs needing to be printed or + * top mode plugin is active. + */ + if (((args.pa_flags & FLAG_HAS_COUNTING_PMCS) && + (args.pa_required & FLAG_HAS_OUTPUT_LOGFILE) == 0) || + (args.pa_flags & FLAG_DO_TOP)) { EV_SET(&kev, 0, EVFILT_TIMER, EV_ADD, 0, args.pa_interval * 1000, NULL); @@ -1165,7 +1245,7 @@ main(int argc, char **argv) /* attach PMCs to the target process, starting it if specified */ if (args.pa_flags & FLAG_HAS_COMMANDLINE) - pmcstat_create_process(&args); + pmcstat_create_process(); if (check_driver_stats && pmc_get_driver_stats(&ds_start) < 0) err(EX_OSERR, "ERROR: Cannot retrieve driver statistics"); @@ -1176,7 +1256,7 @@ main(int argc, char **argv) errx(EX_DATAERR, "ERROR: No matching target " "processes."); if (args.pa_flags & FLAG_HAS_PROCESS_PMCS) - pmcstat_attach_pmcs(&args); + pmcstat_attach_pmcs(); if (pmcstat_kvm) { kvm_close(pmcstat_kvm); @@ -1185,16 +1265,16 @@ main(int argc, char **argv) } /* start the pmcs */ - pmcstat_start_pmcs(&args); + pmcstat_start_pmcs(); /* start the (commandline) process if needed */ if (args.pa_flags & FLAG_HAS_COMMANDLINE) pmcstat_start_process(); /* initialize logging if printing the configured log */ - if ((args.pa_flags & FLAG_DO_PRINT) && + if ((args.pa_flags & (FLAG_DO_PRINT | FLAG_DO_TOP)) && (args.pa_flags & (FLAG_HAS_PIPE | FLAG_HAS_OUTPUT_LOGFILE))) - pmcstat_initialize_logging(&args); + pmcstat_initialize_logging(); /* Handle SIGINT using the kqueue loop */ sa.sa_handler = SIG_IGN; @@ -1204,6 +1284,37 @@ main(int argc, char **argv) if (sigaction(SIGINT, &sa, NULL) < 0) err(EX_OSERR, "ERROR: Cannot install signal handler"); + /* + * Setup the top mode display. + */ + if (args.pa_flags & FLAG_DO_TOP) { + args.pa_flags &= ~FLAG_DO_PRINT; + + if (args.pa_toptty) { + /* + * Init ncurses. + */ + initscr(); + if(has_colors() == TRUE) { + args.pa_topcolor = 1; + start_color(); + use_default_colors(); + pair_content(0, &cf, &cb); + init_pair(1, COLOR_RED, cb); + init_pair(2, COLOR_YELLOW, cb); + init_pair(3, COLOR_GREEN, cb); + } + cbreak(); + noecho(); + nonl(); + nodelay(stdscr, 1); + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + clear(); + atexit(pmcstat_topexit); + } + } + /* * loop till either the target process (if any) exits, or we * are killed by a SIGINT. @@ -1225,14 +1336,18 @@ main(int argc, char **argv) case EVFILT_PROC: /* target has exited */ if (args.pa_flags & (FLAG_HAS_OUTPUT_LOGFILE | FLAG_HAS_PIPE)) - runstate = pmcstat_close_log(&args); + runstate = pmcstat_close_log(); else runstate = PMCSTAT_FINISHED; do_print = 1; break; case EVFILT_READ: /* log file data is present */ - runstate = pmcstat_process_log(&args); + if (kev.ident == (unsigned)fileno(stdin)) { + if (pmcstat_keypress_log()) + runstate = pmcstat_close_log(); + } else + runstate = pmcstat_process_log(); break; case EVFILT_SIGNAL: @@ -1253,17 +1368,17 @@ main(int argc, char **argv) */ if (args.pa_flags & (FLAG_HAS_OUTPUT_LOGFILE | FLAG_HAS_PIPE)) { - runstate = pmcstat_close_log(&args); + runstate = pmcstat_close_log(); if (args.pa_flags & (FLAG_DO_PRINT|FLAG_DO_ANALYSIS)) - pmcstat_process_log(&args); + pmcstat_process_log(); } do_print = 1; /* print PMCs at exit */ runstate = PMCSTAT_FINISHED; } else if (kev.ident == SIGINT) { /* Kill the child process if we started it */ if (args.pa_flags & FLAG_HAS_COMMANDLINE) - pmcstat_kill_process(&args); + pmcstat_kill_process(); /* Close the pipe to self, if present. */ if (args.pa_flags & FLAG_HAS_PIPE) (void) close(pipefd[READPIPEFD]); @@ -1274,6 +1389,7 @@ main(int argc, char **argv) err(EX_OSERR, "ERROR: Cannot determine " "window size"); pmcstat_displayheight = ws.ws_row - 1; + pmcstat_displaywidth = ws.ws_col - 1; } else assert(0); @@ -1285,22 +1401,30 @@ main(int argc, char **argv) } - if (do_print && - (args.pa_required & FLAG_HAS_OUTPUT_LOGFILE) == 0) { - pmcstat_print_pmcs(&args); - if (runstate == PMCSTAT_FINISHED && /* final newline */ - (args.pa_flags & FLAG_DO_PRINT) == 0) - (void) fprintf(args.pa_printfile, "\n"); + if (do_print) { + if ((args.pa_required & FLAG_HAS_OUTPUT_LOGFILE) == 0) { + pmcstat_print_pmcs(); + if (runstate == PMCSTAT_FINISHED && /* final newline */ + (args.pa_flags & FLAG_DO_PRINT) == 0) + (void) fprintf(args.pa_printfile, "\n"); + } + if (args.pa_flags & FLAG_DO_TOP) + pmcstat_display_log(); do_print = 0; } } while (runstate != PMCSTAT_FINISHED); + if ((args.pa_flags & FLAG_DO_TOP) && args.pa_toptty) { + pmcstat_topexit(); + args.pa_toptty = 0; + } + /* flush any pending log entries */ if (args.pa_flags & (FLAG_HAS_OUTPUT_LOGFILE | FLAG_HAS_PIPE)) pmc_flush_logfile(); - pmcstat_cleanup(&args); + pmcstat_cleanup(); free(args.pa_kernel); diff --git a/usr.sbin/pmcstat/pmcstat.h b/usr.sbin/pmcstat/pmcstat.h index 5d6f5f296e20..1bb78627d6d7 100644 --- a/usr.sbin/pmcstat/pmcstat.h +++ b/usr.sbin/pmcstat/pmcstat.h @@ -47,13 +47,15 @@ #define FLAG_HAS_SAMPLESDIR 0x00000800 /* -D dir */ #define FLAG_HAS_KERNELPATH 0x00001000 /* -k kernel */ #define FLAG_DO_PRINT 0x00002000 /* -o */ -#define FLAG_DO_CALLGRAPHS 0x00004000 /* -G */ -#define FLAG_DO_ANALYSIS 0x00008000 /* -g or -G */ -#define FLAG_WANTS_MAPPINGS 0x00010000 /* -m */ +#define FLAG_DO_CALLGRAPHS 0x00004000 /* -G or -F */ +#define FLAG_DO_ANNOTATE 0x00008000 /* -m */ +#define FLAG_DO_TOP 0x00010000 /* -T */ +#define FLAG_DO_ANALYSIS 0x00020000 /* -g or -G or -m or -T */ #define DEFAULT_SAMPLE_COUNT 65536 #define DEFAULT_WAIT_INTERVAL 5.0 -#define DEFAULT_DISPLAY_HEIGHT 23 +#define DEFAULT_DISPLAY_HEIGHT 256 /* file virtual height */ +#define DEFAULT_DISPLAY_WIDTH 1024 /* file virtual width */ #define DEFAULT_BUFFER_SIZE 4096 #define DEFAULT_CALLGRAPH_DEPTH 4 @@ -75,12 +77,24 @@ #define PMCSTAT_LDD_COMMAND "/usr/bin/ldd" -#define PMCSTAT_PRINT_ENTRY(A,T,...) do { \ - (void) fprintf((A)->pa_printfile, "%-9s", T); \ - (void) fprintf((A)->pa_printfile, " " __VA_ARGS__); \ - (void) fprintf((A)->pa_printfile, "\n"); \ +#define PMCSTAT_PRINT_ENTRY(T,...) do { \ + (void) fprintf(args.pa_printfile, "%-9s", T); \ + (void) fprintf(args.pa_printfile, " " __VA_ARGS__); \ + (void) fprintf(args.pa_printfile, "\n"); \ } while (0) +#define PMCSTAT_PL_NONE 0 +#define PMCSTAT_PL_CALLGRAPH 1 +#define PMCSTAT_PL_GPROF 2 +#define PMCSTAT_PL_ANNOTATE 3 +#define PMCSTAT_PL_CALLTREE 4 + +#define PMCSTAT_TOP_DELTA 0 +#define PMCSTAT_TOP_ACCUM 1 + +#define min(A,B) ((A) < (B) ? (A) : (B)) +#define max(A,B) ((A) > (B) ? (A) : (B)) + enum pmcstat_state { PMCSTAT_FINISHED = 0, PMCSTAT_EXITING = 1, @@ -110,6 +124,8 @@ struct pmcstat_target { struct pmcstat_args { int pa_flags; /* argument flags */ int pa_required; /* required features */ + int pa_pplugin; /* pre-processing plugin */ + int pa_plugin; /* analysis plugin */ int pa_verbosity; /* verbosity level */ FILE *pa_printfile; /* where to send printed output */ int pa_logfd; /* output log file */ @@ -124,31 +140,44 @@ struct pmcstat_args { int pa_graphdepth; /* print depth for callgraphs */ double pa_interval; /* printing interval in seconds */ uint32_t pa_cpumask; /* filter for CPUs analysed */ + int pa_ctdumpinstr; /* dump instructions with calltree */ + int pa_topmode; /* delta or accumulative */ + int pa_toptty; /* output to tty or file */ + int pa_topcolor; /* terminal support color */ + int pa_mergepmc; /* merge PMC with same name */ int pa_argc; char **pa_argv; STAILQ_HEAD(, pmcstat_ev) pa_events; SLIST_HEAD(, pmcstat_target) pa_targets; -} args; +}; + +extern int pmcstat_displayheight; /* current terminal height */ +extern int pmcstat_displaywidth; /* current terminal width */ +extern struct pmcstat_args args; /* command line args */ /* Function prototypes */ -void pmcstat_attach_pmcs(struct pmcstat_args *_a); -void pmcstat_cleanup(struct pmcstat_args *_a); -void pmcstat_clone_event_descriptor(struct pmcstat_args *_a, +void pmcstat_attach_pmcs(void); +void pmcstat_cleanup(void); +void pmcstat_clone_event_descriptor( struct pmcstat_ev *_ev, uint32_t _cpumask); -int pmcstat_close_log(struct pmcstat_args *_a); -void pmcstat_create_process(struct pmcstat_args *_a); -void pmcstat_find_targets(struct pmcstat_args *_a, const char *_arg); -void pmcstat_initialize_logging(struct pmcstat_args *_a); -void pmcstat_kill_process(struct pmcstat_args *_a); +int pmcstat_close_log(void); +void pmcstat_create_process(void); +void pmcstat_find_targets(const char *_arg); +void pmcstat_initialize_logging(void); +void pmcstat_kill_process(void); int pmcstat_open_log(const char *_p, int _mode); -void pmcstat_print_counters(struct pmcstat_args *_a); -void pmcstat_print_headers(struct pmcstat_args *_a); -void pmcstat_print_pmcs(struct pmcstat_args *_a); +void pmcstat_print_counters(void); +void pmcstat_print_headers(void); +void pmcstat_print_pmcs(void); void pmcstat_show_usage(void); -void pmcstat_shutdown_logging(struct pmcstat_args *_a); -void pmcstat_start_pmcs(struct pmcstat_args *_a); +void pmcstat_shutdown_logging(void); +void pmcstat_start_pmcs(void); void pmcstat_start_process(void); -int pmcstat_process_log(struct pmcstat_args *_a); +int pmcstat_process_log(void); +int pmcstat_keypress_log(void); +void pmcstat_display_log(void); +void pmcstat_pluginconfigure_log(char *_opt); uint32_t pmcstat_get_cpumask(const char *_a); +void pmcstat_topexit(void); #endif /* _PMCSTAT_H_ */ diff --git a/usr.sbin/pmcstat/pmcstat_log.c b/usr.sbin/pmcstat/pmcstat_log.c index 981412685033..5811af3f1c68 100644 --- a/usr.sbin/pmcstat/pmcstat_log.c +++ b/usr.sbin/pmcstat/pmcstat_log.c @@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -68,9 +69,8 @@ __FBSDID("$FreeBSD$"); #include #include "pmcstat.h" - -#define min(A,B) ((A) < (B) ? (A) : (B)) -#define max(A,B) ((A) > (B) ? (A) : (B)) +#include "pmcstat_log.h" +#include "pmcstat_top.h" #define PMCSTAT_ALLOCATE 1 @@ -81,6 +81,7 @@ __FBSDID("$FreeBSD$"); * pmcstat_shutdown_logging() orderly shutdown, called last * pmcstat_open_log() open an eventlog for processing * pmcstat_process_log() print/convert an event log + * pmcstat_display_log() top mode display for the log * pmcstat_close_log() finish processing an event log * * IMPLEMENTATION NOTES @@ -127,236 +128,125 @@ __FBSDID("$FreeBSD$"); * also given a 'rank' that reflects its depth in the call stack. */ -typedef const void *pmcstat_interned_string; - -/* - * 'pmcstat_pmcrecord' is a mapping from PMC ids to human-readable - * names. - */ - -struct pmcstat_pmcrecord { - LIST_ENTRY(pmcstat_pmcrecord) pr_next; - pmc_id_t pr_pmcid; - pmcstat_interned_string pr_pmcname; -}; - -static LIST_HEAD(,pmcstat_pmcrecord) pmcstat_pmcs = - LIST_HEAD_INITIALIZER(&pmcstat_pmcs); - - -/* - * struct pmcstat_gmonfile tracks a given 'gmon.out' file. These - * files are mmap()'ed in as needed. - */ - -struct pmcstat_gmonfile { - LIST_ENTRY(pmcstat_gmonfile) pgf_next; /* list of entries */ - int pgf_overflow; /* whether a count overflowed */ - pmc_id_t pgf_pmcid; /* id of the associated pmc */ - size_t pgf_nbuckets; /* #buckets in this gmon.out */ - unsigned int pgf_nsamples; /* #samples in this gmon.out */ - pmcstat_interned_string pgf_name; /* pathname of gmon.out file */ - size_t pgf_ndatabytes; /* number of bytes mapped */ - void *pgf_gmondata; /* pointer to mmap'ed data */ - FILE *pgf_file; /* used when writing gmon arcs */ -}; - -/* - * A 'pmcstat_image' structure describes an executable program on - * disk. 'pi_execpath' is a cookie representing the pathname of - * the executable. 'pi_start' and 'pi_end' are the least and greatest - * virtual addresses for the text segments in the executable. - * 'pi_gmonlist' contains a linked list of gmon.out files associated - * with this image. - */ - -enum pmcstat_image_type { - PMCSTAT_IMAGE_UNKNOWN = 0, /* never looked at the image */ - PMCSTAT_IMAGE_INDETERMINABLE, /* can't tell what the image is */ - PMCSTAT_IMAGE_ELF32, /* ELF 32 bit object */ - PMCSTAT_IMAGE_ELF64, /* ELF 64 bit object */ - PMCSTAT_IMAGE_AOUT /* AOUT object */ -}; - -struct pmcstat_image { - LIST_ENTRY(pmcstat_image) pi_next; /* hash link */ - TAILQ_ENTRY(pmcstat_image) pi_lru; /* LRU list */ - pmcstat_interned_string pi_execpath; /* cookie */ - pmcstat_interned_string pi_samplename; /* sample path name */ - pmcstat_interned_string pi_fullpath; /* path to FS object */ - - enum pmcstat_image_type pi_type; /* executable type */ - - /* - * Executables have pi_start and pi_end; these are zero - * for shared libraries. - */ - uintfptr_t pi_start; /* start address (inclusive) */ - uintfptr_t pi_end; /* end address (exclusive) */ - uintfptr_t pi_entry; /* entry address */ - uintfptr_t pi_vaddr; /* virtual address where loaded */ - int pi_isdynamic; /* whether a dynamic object */ - int pi_iskernelmodule; - pmcstat_interned_string pi_dynlinkerpath; /* path in .interp */ - - /* All symbols associated with this object. */ - struct pmcstat_symbol *pi_symbols; - size_t pi_symcount; - - /* - * An image can be associated with one or more gmon.out files; - * one per PMC. - */ - LIST_HEAD(,pmcstat_gmonfile) pi_gmlist; -}; +struct pmcstat_pmcs pmcstat_pmcs = LIST_HEAD_INITIALIZER(pmcstat_pmcs); /* * All image descriptors are kept in a hash table. */ -static LIST_HEAD(,pmcstat_image) pmcstat_image_hash[PMCSTAT_NHASH]; - -/* - * A 'pmcstat_pcmap' structure maps a virtual address range to an - * underlying 'pmcstat_image' descriptor. - */ -struct pmcstat_pcmap { - TAILQ_ENTRY(pmcstat_pcmap) ppm_next; - uintfptr_t ppm_lowpc; - uintfptr_t ppm_highpc; - struct pmcstat_image *ppm_image; -}; - -/* - * A 'pmcstat_process' structure models processes. Each process is - * associated with a set of pmcstat_pcmap structures that map - * addresses inside it to executable objects. This set is implemented - * as a list, kept sorted in ascending order of mapped addresses. - * - * 'pp_pid' holds the pid of the process. When a process exits, the - * 'pp_isactive' field is set to zero, but the process structure is - * not immediately reclaimed because there may still be samples in the - * log for this process. - */ - -struct pmcstat_process { - LIST_ENTRY(pmcstat_process) pp_next; /* hash-next */ - pid_t pp_pid; /* associated pid */ - int pp_isactive; /* whether active */ - uintfptr_t pp_entryaddr; /* entry address */ - TAILQ_HEAD(,pmcstat_pcmap) pp_map; /* address range map */ -}; +struct pmcstat_image_hash_list pmcstat_image_hash[PMCSTAT_NHASH]; /* * All process descriptors are kept in a hash table. */ -static LIST_HEAD(,pmcstat_process) pmcstat_process_hash[PMCSTAT_NHASH]; +struct pmcstat_process_hash_list pmcstat_process_hash[PMCSTAT_NHASH]; -static struct pmcstat_process *pmcstat_kernproc; /* kernel 'process' */ +struct pmcstat_stats pmcstat_stats; /* statistics */ -/* - * Each function symbol tracked by pmcstat(8). - */ +struct pmcstat_process *pmcstat_kernproc; /* kernel 'process' */ -struct pmcstat_symbol { - pmcstat_interned_string ps_name; - uint64_t ps_start; - uint64_t ps_end; +#include "pmcpl_gprof.h" +#include "pmcpl_callgraph.h" +#include "pmcpl_annotate.h" +#include "pmcpl_calltree.h" + +struct pmc_plugins { + const char *pl_name; /* name */ + + /* configure */ + int (*pl_configure)(char *opt); + + /* init and shutdown */ + int (*pl_init)(void); + void (*pl_shutdown)(FILE *mf); + + /* sample processing */ + void (*pl_process)(struct pmcstat_process *pp, + struct pmcstat_pmcrecord *pmcr, uint32_t nsamples, + uintfptr_t *cc, int usermode, uint32_t cpu); + + /* image */ + void (*pl_initimage)(struct pmcstat_image *pi); + void (*pl_shutdownimage)(struct pmcstat_image *pi); + + /* pmc */ + void (*pl_newpmc)(pmcstat_interned_string ps, + struct pmcstat_pmcrecord *pr); + + /* top display */ + void (*pl_topdisplay)(void); + + /* top keypress */ + int (*pl_topkeypress)(int c, WINDOW *w); + +} plugins[] = { + { + .pl_name = "none", + }, + { + .pl_name = "callgraph", + .pl_init = pmcpl_cg_init, + .pl_shutdown = pmcpl_cg_shutdown, + .pl_process = pmcpl_cg_process, + .pl_topkeypress = pmcpl_cg_topkeypress, + .pl_topdisplay = pmcpl_cg_topdisplay + }, + { + .pl_name = "gprof", + .pl_shutdown = pmcpl_gmon_shutdown, + .pl_process = pmcpl_gmon_process, + .pl_initimage = pmcpl_gmon_initimage, + .pl_shutdownimage = pmcpl_gmon_shutdownimage, + .pl_newpmc = pmcpl_gmon_newpmc + }, + { + .pl_name = "annotate", + .pl_process = pmcpl_annotate_process + }, + { + .pl_name = "calltree", + .pl_configure = pmcpl_ct_configure, + .pl_init = pmcpl_ct_init, + .pl_shutdown = pmcpl_ct_shutdown, + .pl_process = pmcpl_ct_process, + .pl_topkeypress = pmcpl_ct_topkeypress, + .pl_topdisplay = pmcpl_ct_topdisplay + }, + { + .pl_name = NULL + } }; -/* - * Each call graph node is tracked by a pmcstat_cgnode struct. - */ - -struct pmcstat_cgnode { - struct pmcstat_image *pcg_image; - uintfptr_t pcg_func; - uint32_t pcg_count; - uint32_t pcg_nchildren; - LIST_ENTRY(pmcstat_cgnode) pcg_sibling; - LIST_HEAD(,pmcstat_cgnode) pcg_children; -}; - -struct pmcstat_cgnode_hash { - struct pmcstat_cgnode *pch_cgnode; - uint32_t pch_pmcid; - LIST_ENTRY(pmcstat_cgnode_hash) pch_next; -}; - -static int pmcstat_cgnode_hash_count; -static pmcstat_interned_string pmcstat_previous_filename_printed; - -/* - * The toplevel CG nodes (i.e., with rank == 0) are placed in a hash table. - */ - -static LIST_HEAD(,pmcstat_cgnode_hash) pmcstat_cgnode_hash[PMCSTAT_NHASH]; - -/* Misc. statistics */ -static struct pmcstat_stats { - int ps_exec_aout; /* # a.out executables seen */ - int ps_exec_elf; /* # elf executables seen */ - int ps_exec_errors; /* # errors processing executables */ - int ps_exec_indeterminable; /* # unknown executables seen */ - int ps_samples_total; /* total number of samples processed */ - int ps_samples_skipped; /* #samples filtered out for any reason */ - int ps_samples_unknown_offset; /* #samples of rank 0 not in a map */ - int ps_samples_indeterminable; /* #samples in indeterminable images */ - int ps_callchain_dubious_frames;/* #dubious frame pointers seen */ -} pmcstat_stats; +int pmcstat_mergepmc; +int pmcstat_pmcinfilter = 0; /* PMC filter for top mode. */ +float pmcstat_threshold = 0.5; /* Cost filter for top mode. */ /* * Prototypes */ -static void pmcstat_gmon_create_file(struct pmcstat_gmonfile *_pgf, - struct pmcstat_image *_image); -static pmcstat_interned_string pmcstat_gmon_create_name(const char *_sd, - struct pmcstat_image *_img, pmc_id_t _pmcid); -static void pmcstat_gmon_map_file(struct pmcstat_gmonfile *_pgf); -static void pmcstat_gmon_unmap_file(struct pmcstat_gmonfile *_pgf); - -static void pmcstat_image_determine_type(struct pmcstat_image *_image, - struct pmcstat_args *_a); -static struct pmcstat_gmonfile *pmcstat_image_find_gmonfile(struct - pmcstat_image *_i, pmc_id_t _id); static struct pmcstat_image *pmcstat_image_from_path(pmcstat_interned_string _path, int _iskernelmodule); -static void pmcstat_image_get_aout_params(struct pmcstat_image *_image, - struct pmcstat_args *_a); -static void pmcstat_image_get_elf_params(struct pmcstat_image *_image, - struct pmcstat_args *_a); -static void pmcstat_image_increment_bucket(struct pmcstat_pcmap *_pcm, - uintfptr_t _pc, pmc_id_t _pmcid, struct pmcstat_args *_a); +static void pmcstat_image_get_aout_params(struct pmcstat_image *_image); +static void pmcstat_image_get_elf_params(struct pmcstat_image *_image); static void pmcstat_image_link(struct pmcstat_process *_pp, struct pmcstat_image *_i, uintfptr_t _lpc); static void pmcstat_pmcid_add(pmc_id_t _pmcid, - pmcstat_interned_string _name, struct pmcstat_args *_a); -static const char *pmcstat_pmcid_to_name(pmc_id_t _pmcid); + pmcstat_interned_string _name); static void pmcstat_process_aout_exec(struct pmcstat_process *_pp, - struct pmcstat_image *_image, uintfptr_t _entryaddr, - struct pmcstat_args *_a); + struct pmcstat_image *_image, uintfptr_t _entryaddr); static void pmcstat_process_elf_exec(struct pmcstat_process *_pp, - struct pmcstat_image *_image, uintfptr_t _entryaddr, - struct pmcstat_args *_a); + struct pmcstat_image *_image, uintfptr_t _entryaddr); static void pmcstat_process_exec(struct pmcstat_process *_pp, - pmcstat_interned_string _path, uintfptr_t _entryaddr, - struct pmcstat_args *_ao); + pmcstat_interned_string _path, uintfptr_t _entryaddr); static struct pmcstat_process *pmcstat_process_lookup(pid_t _pid, int _allocate); -static struct pmcstat_pcmap *pmcstat_process_find_map( - struct pmcstat_process *_p, uintfptr_t _pc); - static int pmcstat_string_compute_hash(const char *_string); static void pmcstat_string_initialize(void); -static pmcstat_interned_string pmcstat_string_intern(const char *_s); -static pmcstat_interned_string pmcstat_string_lookup(const char *_s); static int pmcstat_string_lookup_hash(pmcstat_interned_string _is); static void pmcstat_string_shutdown(void); -static const char *pmcstat_string_unintern(pmcstat_interned_string _is); - /* * A simple implementation of interned strings. Each interned string @@ -374,6 +264,16 @@ struct pmcstat_string { static LIST_HEAD(,pmcstat_string) pmcstat_string_hash[PMCSTAT_NHASH]; +/* + * PMC count. + */ +int pmcstat_npmcs; + +/* + * PMC Top mode pause state. + */ +int pmcstat_pause; + /* * Compute a 'hash' value for a string. */ @@ -394,7 +294,7 @@ pmcstat_string_compute_hash(const char *s) * interned structure. */ -static pmcstat_interned_string +pmcstat_interned_string pmcstat_string_intern(const char *s) { struct pmcstat_string *ps; @@ -416,7 +316,7 @@ pmcstat_string_intern(const char *s) return ((pmcstat_interned_string) ps); } -static const char * +const char * pmcstat_string_unintern(pmcstat_interned_string str) { const char *s; @@ -425,7 +325,7 @@ pmcstat_string_unintern(pmcstat_interned_string str) return (s); } -static pmcstat_interned_string +pmcstat_interned_string pmcstat_string_lookup(const char *s) { struct pmcstat_string *ps; @@ -482,155 +382,6 @@ pmcstat_string_shutdown(void) } } -/* - * Create a gmon.out file and size it. - */ - -static void -pmcstat_gmon_create_file(struct pmcstat_gmonfile *pgf, - struct pmcstat_image *image) -{ - int fd; - size_t count; - struct gmonhdr gm; - const char *pathname; - char buffer[DEFAULT_BUFFER_SIZE]; - - pathname = pmcstat_string_unintern(pgf->pgf_name); - if ((fd = open(pathname, O_RDWR|O_NOFOLLOW|O_CREAT, - S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0) - err(EX_OSERR, "ERROR: Cannot open \"%s\"", pathname); - - gm.lpc = image->pi_start; - gm.hpc = image->pi_end; - gm.ncnt = (pgf->pgf_nbuckets * sizeof(HISTCOUNTER)) + - sizeof(struct gmonhdr); - gm.version = GMONVERSION; - gm.profrate = 0; /* use ticks */ - gm.histcounter_type = 0; /* compatibility with moncontrol() */ - gm.spare[0] = gm.spare[1] = 0; - - /* Write out the gmon header */ - if (write(fd, &gm, sizeof(gm)) < 0) - goto error; - - /* Zero fill the samples[] array */ - (void) memset(buffer, 0, sizeof(buffer)); - - count = pgf->pgf_ndatabytes - sizeof(struct gmonhdr); - while (count > sizeof(buffer)) { - if (write(fd, &buffer, sizeof(buffer)) < 0) - goto error; - count -= sizeof(buffer); - } - - if (write(fd, &buffer, count) < 0) - goto error; - - (void) close(fd); - - return; - - error: - err(EX_OSERR, "ERROR: Cannot write \"%s\"", pathname); -} - -/* - * Determine the full pathname of a gmon.out file for a given - * (image,pmcid) combination. Return the interned string. - */ - -pmcstat_interned_string -pmcstat_gmon_create_name(const char *samplesdir, struct pmcstat_image *image, - pmc_id_t pmcid) -{ - const char *pmcname; - char fullpath[PATH_MAX]; - - pmcname = pmcstat_pmcid_to_name(pmcid); - - (void) snprintf(fullpath, sizeof(fullpath), - "%s/%s/%s", samplesdir, pmcname, - pmcstat_string_unintern(image->pi_samplename)); - - return (pmcstat_string_intern(fullpath)); -} - - -/* - * Mmap in a gmon.out file for processing. - */ - -static void -pmcstat_gmon_map_file(struct pmcstat_gmonfile *pgf) -{ - int fd; - const char *pathname; - - pathname = pmcstat_string_unintern(pgf->pgf_name); - - /* the gmon.out file must already exist */ - if ((fd = open(pathname, O_RDWR | O_NOFOLLOW, 0)) < 0) - err(EX_OSERR, "ERROR: cannot open \"%s\"", pathname); - - pgf->pgf_gmondata = mmap(NULL, pgf->pgf_ndatabytes, - PROT_READ|PROT_WRITE, MAP_NOSYNC|MAP_SHARED, fd, 0); - - if (pgf->pgf_gmondata == MAP_FAILED) - err(EX_OSERR, "ERROR: cannot map \"%s\"", pathname); - - (void) close(fd); -} - -/* - * Unmap a gmon.out file after sync'ing its data to disk. - */ - -static void -pmcstat_gmon_unmap_file(struct pmcstat_gmonfile *pgf) -{ - (void) msync(pgf->pgf_gmondata, pgf->pgf_ndatabytes, - MS_SYNC); - (void) munmap(pgf->pgf_gmondata, pgf->pgf_ndatabytes); - pgf->pgf_gmondata = NULL; -} - -static void -pmcstat_gmon_append_arc(struct pmcstat_image *image, pmc_id_t pmcid, - uintptr_t rawfrom, uintptr_t rawto, uint32_t count) -{ - struct rawarc arc; /* from */ - const char *pathname; - struct pmcstat_gmonfile *pgf; - - if ((pgf = pmcstat_image_find_gmonfile(image, pmcid)) == NULL) - return; - - if (pgf->pgf_file == NULL) { - pathname = pmcstat_string_unintern(pgf->pgf_name); - if ((pgf->pgf_file = fopen(pathname, "a")) == NULL) - return; - } - - arc.raw_frompc = rawfrom + image->pi_vaddr; - arc.raw_selfpc = rawto + image->pi_vaddr; - arc.raw_count = count; - - (void) fwrite(&arc, sizeof(arc), 1, pgf->pgf_file); - -} - -static struct pmcstat_gmonfile * -pmcstat_image_find_gmonfile(struct pmcstat_image *image, pmc_id_t pmcid) -{ - struct pmcstat_gmonfile *pgf; - LIST_FOREACH(pgf, &image->pi_gmlist, pgf_next) - if (pgf->pgf_pmcid == pmcid) - return (pgf); - return (NULL); -} - - /* * Determine whether a given executable image is an A.OUT object, and * if so, fill in its parameters from the text file. @@ -638,8 +389,7 @@ pmcstat_image_find_gmonfile(struct pmcstat_image *image, pmc_id_t pmcid) */ static void -pmcstat_image_get_aout_params(struct pmcstat_image *image, - struct pmcstat_args *a) +pmcstat_image_get_aout_params(struct pmcstat_image *image) { int fd; ssize_t nbytes; @@ -655,7 +405,7 @@ pmcstat_image_get_aout_params(struct pmcstat_image *image, "unsupported \"%s\"", path); (void) snprintf(buffer, sizeof(buffer), "%s%s", - a->pa_fsroot, path); + args.pa_fsroot, path); if ((fd = open(buffer, O_RDONLY, 0)) < 0 || (nbytes = read(fd, &ex, sizeof(ex))) < 0) { @@ -702,7 +452,7 @@ pmcstat_symbol_compare(const void *a, const void *b) * Map an address to a symbol in an image. */ -static struct pmcstat_symbol * +struct pmcstat_symbol * pmcstat_symbol_search(struct pmcstat_image *image, uintfptr_t addr) { struct pmcstat_symbol sym; @@ -825,12 +575,12 @@ pmcstat_image_add_symbols(struct pmcstat_image *image, Elf *e, */ static void -pmcstat_image_get_elf_params(struct pmcstat_image *image, - struct pmcstat_args *a) +pmcstat_image_get_elf_params(struct pmcstat_image *image) { int fd; size_t i, nph, nsh; const char *path, *elfbase; + char *p, *endp; uintfptr_t minva, maxva; Elf *e; Elf_Scn *scn; @@ -858,10 +608,10 @@ pmcstat_image_get_elf_params(struct pmcstat_image *image, */ if (image->pi_iskernelmodule) (void) snprintf(buffer, sizeof(buffer), "%s%s/%s", - a->pa_fsroot, a->pa_kernel, path); + args.pa_fsroot, args.pa_kernel, path); else (void) snprintf(buffer, sizeof(buffer), "%s%s", - a->pa_fsroot, path); + args.pa_fsroot, path); e = NULL; if ((fd = open(buffer, O_RDONLY, 0)) < 0 || @@ -960,6 +710,14 @@ pmcstat_image_get_elf_params(struct pmcstat_image *image, image->pi_type = image_type; image->pi_fullpath = pmcstat_string_intern(buffer); + /* Build display name + */ + endp = buffer; + for (p = buffer; *p; p++) + if (*p == '/') + endp = p+1; + image->pi_name = pmcstat_string_intern(endp); + done: (void) elf_end(e); if (fd >= 0) @@ -972,17 +730,16 @@ pmcstat_image_get_elf_params(struct pmcstat_image *image, * If no handler claims the image, set its type to 'INDETERMINABLE'. */ -static void -pmcstat_image_determine_type(struct pmcstat_image *image, - struct pmcstat_args *a) +void +pmcstat_image_determine_type(struct pmcstat_image *image) { assert(image->pi_type == PMCSTAT_IMAGE_UNKNOWN); /* Try each kind of handler in turn */ if (image->pi_type == PMCSTAT_IMAGE_UNKNOWN) - pmcstat_image_get_elf_params(image, a); + pmcstat_image_get_elf_params(image); if (image->pi_type == PMCSTAT_IMAGE_UNKNOWN) - pmcstat_image_get_aout_params(image, a); + pmcstat_image_get_aout_params(image); /* * Otherwise, remember that we tried to determine @@ -1006,10 +763,8 @@ static struct pmcstat_image * pmcstat_image_from_path(pmcstat_interned_string internedpath, int iskernelmodule) { - int count, hash, nlen; + int hash; struct pmcstat_image *pi; - char *sn; - char name[NAME_MAX]; hash = pmcstat_string_lookup_hash(internedpath); @@ -1038,144 +793,18 @@ pmcstat_image_from_path(pmcstat_interned_string internedpath, pi->pi_dynlinkerpath = NULL; pi->pi_symbols = NULL; pi->pi_symcount = 0; + pi->pi_addr2line = NULL; - /* - * Look for a suitable name for the sample files associated - * with this image: if `basename(path)`+".gmon" is available, - * we use that, otherwise we try iterating through - * `basename(path)`+ "~" + NNN + ".gmon" till we get a free - * entry. - */ - if ((sn = basename(pmcstat_string_unintern(internedpath))) == NULL) - err(EX_OSERR, "ERROR: Cannot process \"%s\"", - pmcstat_string_unintern(internedpath)); - - nlen = strlen(sn); - nlen = min(nlen, (int) (sizeof(name) - sizeof(".gmon"))); - - snprintf(name, sizeof(name), "%.*s.gmon", nlen, sn); - - /* try use the unabridged name first */ - if (pmcstat_string_lookup(name) == NULL) - pi->pi_samplename = pmcstat_string_intern(name); - else { - /* - * Otherwise use a prefix from the original name and - * upto 3 digits. - */ - nlen = strlen(sn); - nlen = min(nlen, (int) (sizeof(name)-sizeof("~NNN.gmon"))); - count = 0; - do { - if (++count > 999) - errx(EX_CANTCREAT, "ERROR: cannot create a " - "gmon file for \"%s\"", name); - snprintf(name, sizeof(name), "%.*s~%3.3d.gmon", - nlen, sn, count); - if (pmcstat_string_lookup(name) == NULL) { - pi->pi_samplename = - pmcstat_string_intern(name); - count = 0; - } - } while (count > 0); - } - - - LIST_INIT(&pi->pi_gmlist); + if (plugins[args.pa_pplugin].pl_initimage != NULL) + plugins[args.pa_pplugin].pl_initimage(pi); + if (plugins[args.pa_plugin].pl_initimage != NULL) + plugins[args.pa_plugin].pl_initimage(pi); LIST_INSERT_HEAD(&pmcstat_image_hash[hash], pi, pi_next); return (pi); } -/* - * Increment the bucket in the gmon.out file corresponding to 'pmcid' - * and 'pc'. - */ - -static void -pmcstat_image_increment_bucket(struct pmcstat_pcmap *map, uintfptr_t pc, - pmc_id_t pmcid, struct pmcstat_args *a) -{ - struct pmcstat_image *image; - struct pmcstat_gmonfile *pgf; - uintfptr_t bucket; - HISTCOUNTER *hc; - - assert(pc >= map->ppm_lowpc && pc < map->ppm_highpc); - - image = map->ppm_image; - - /* - * If this is the first time we are seeing a sample for - * this executable image, try determine its parameters. - */ - if (image->pi_type == PMCSTAT_IMAGE_UNKNOWN) - pmcstat_image_determine_type(image, a); - - assert(image->pi_type != PMCSTAT_IMAGE_UNKNOWN); - - /* Ignore samples in images that we know nothing about. */ - if (image->pi_type == PMCSTAT_IMAGE_INDETERMINABLE) { - pmcstat_stats.ps_samples_indeterminable++; - return; - } - - /* - * Find the gmon file corresponding to 'pmcid', creating it if - * needed. - */ - pgf = pmcstat_image_find_gmonfile(image, pmcid); - if (pgf == NULL) { - if ((pgf = calloc(1, sizeof(*pgf))) == NULL) - err(EX_OSERR, "ERROR:"); - - pgf->pgf_gmondata = NULL; /* mark as unmapped */ - pgf->pgf_name = pmcstat_gmon_create_name(a->pa_samplesdir, - image, pmcid); - pgf->pgf_pmcid = pmcid; - assert(image->pi_end > image->pi_start); - pgf->pgf_nbuckets = (image->pi_end - image->pi_start) / - FUNCTION_ALIGNMENT; /* see */ - pgf->pgf_ndatabytes = sizeof(struct gmonhdr) + - pgf->pgf_nbuckets * sizeof(HISTCOUNTER); - pgf->pgf_nsamples = 0; - pgf->pgf_file = NULL; - - pmcstat_gmon_create_file(pgf, image); - - LIST_INSERT_HEAD(&image->pi_gmlist, pgf, pgf_next); - } - - /* - * Map the gmon file in if needed. It may have been mapped - * out under memory pressure. - */ - if (pgf->pgf_gmondata == NULL) - pmcstat_gmon_map_file(pgf); - - assert(pgf->pgf_gmondata != NULL); - - /* - * - */ - - bucket = (pc - map->ppm_lowpc) / FUNCTION_ALIGNMENT; - - assert(bucket < pgf->pgf_nbuckets); - - hc = (HISTCOUNTER *) ((uintptr_t) pgf->pgf_gmondata + - sizeof(struct gmonhdr)); - - /* saturating add */ - if (hc[bucket] < 0xFFFFU) /* XXX tie this to sizeof(HISTCOUNTER) */ - hc[bucket]++; - else /* mark that an overflow occurred */ - pgf->pgf_overflow = 1; - - pgf->pgf_nsamples++; -} - /* * Record the fact that PC values from 'start' to 'end' come from * image 'image'. @@ -1283,73 +912,182 @@ pmcstat_image_unmap(struct pmcstat_process *pp, uintfptr_t start, } } +/* + * Resolve file name and line number for the given address. + */ +int +pmcstat_image_addr2line(struct pmcstat_image *image, uintfptr_t addr, + char *sourcefile, size_t sourcefile_len, unsigned *sourceline, + char *funcname, size_t funcname_len) +{ + static int addr2line_warn = 0; + + char *sep, cmdline[PATH_MAX], imagepath[PATH_MAX]; + int fd; + + if (image->pi_addr2line == NULL) { + snprintf(imagepath, sizeof(imagepath), "%s.symbols", + pmcstat_string_unintern(image->pi_fullpath)); + fd = open(imagepath, O_RDONLY); + if (fd < 0) { + snprintf(imagepath, sizeof(imagepath), "%s", + pmcstat_string_unintern(image->pi_fullpath)); + } else + close(fd); + snprintf(cmdline, sizeof(cmdline), "addr2line -Cfe \"%s\"", + imagepath); + image->pi_addr2line = popen(cmdline, "r+"); + if (image->pi_addr2line == NULL) { + if (!addr2line_warn) { + addr2line_warn = 1; + warnx("WARNING: addr2line is needed" + "for source code information."); + } + return (0); + } + } + + if (feof(image->pi_addr2line) || ferror(image->pi_addr2line)) { + warnx("WARNING: addr2line pipe error"); + pclose(image->pi_addr2line); + image->pi_addr2line = NULL; + return (0); + } + + fprintf(image->pi_addr2line, "%p\n", (void *)addr); + + if (fgets(funcname, funcname_len, image->pi_addr2line) == NULL) { + warnx("WARNING: addr2line function name read error"); + return (0); + } + sep = strchr(funcname, '\n'); + if (sep != NULL) + *sep = '\0'; + + if (fgets(sourcefile, sourcefile_len, image->pi_addr2line) == NULL) { + warnx("WARNING: addr2line source file read error"); + return (0); + } + sep = strchr(sourcefile, ':'); + if (sep == NULL) { + warnx("WARNING: addr2line source line separator missing"); + return (0); + } + *sep = '\0'; + *sourceline = atoi(sep+1); + if (*sourceline == 0) + return (0); + + return (1); +} + /* * Add a {pmcid,name} mapping. */ static void -pmcstat_pmcid_add(pmc_id_t pmcid, pmcstat_interned_string ps, - struct pmcstat_args *a) +pmcstat_pmcid_add(pmc_id_t pmcid, pmcstat_interned_string ps) { - struct pmcstat_pmcrecord *pr; - struct stat st; - char fullpath[PATH_MAX]; + struct pmcstat_pmcrecord *pr, *prm; /* Replace an existing name for the PMC. */ + prm = NULL; LIST_FOREACH(pr, &pmcstat_pmcs, pr_next) - if (pr->pr_pmcid == pmcid) { - pr->pr_pmcname = ps; - return; - } + if (pr->pr_pmcid == pmcid) { + pr->pr_pmcname = ps; + return; + } else if (pr->pr_pmcname == ps) + prm = pr; /* - * Otherwise, allocate a new descriptor and create the - * appropriate directory to hold gmon.out files. + * Otherwise, allocate a new descriptor and call the + * plugins hook. */ if ((pr = malloc(sizeof(*pr))) == NULL) err(EX_OSERR, "ERROR: Cannot allocate pmc record"); pr->pr_pmcid = pmcid; pr->pr_pmcname = ps; + pr->pr_pmcin = pmcstat_npmcs++; + pr->pr_merge = prm == NULL ? pr : prm; + LIST_INSERT_HEAD(&pmcstat_pmcs, pr, pr_next); - (void) snprintf(fullpath, sizeof(fullpath), "%s/%s", a->pa_samplesdir, - pmcstat_string_unintern(ps)); - - /* If the path name exists, it should be a directory */ - if (stat(fullpath, &st) == 0 && S_ISDIR(st.st_mode)) - return; - - if (mkdir(fullpath, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) < 0) - err(EX_OSERR, "ERROR: Cannot create directory \"%s\"", - fullpath); + if (plugins[args.pa_pplugin].pl_newpmc != NULL) + plugins[args.pa_pplugin].pl_newpmc(ps, pr); + if (plugins[args.pa_plugin].pl_newpmc != NULL) + plugins[args.pa_plugin].pl_newpmc(ps, pr); } /* * Given a pmcid in use, find its human-readable name. */ -static const char * +const char * pmcstat_pmcid_to_name(pmc_id_t pmcid) { struct pmcstat_pmcrecord *pr; - char fullpath[PATH_MAX]; LIST_FOREACH(pr, &pmcstat_pmcs, pr_next) if (pr->pr_pmcid == pmcid) return (pmcstat_string_unintern(pr->pr_pmcname)); - /* create a default name and add this entry */ - if ((pr = malloc(sizeof(*pr))) == NULL) - err(EX_OSERR, "ERROR: "); - pr->pr_pmcid = pmcid; + err(EX_SOFTWARE, "ERROR: cannot find pmcid"); + return NULL; +} - (void) snprintf(fullpath, sizeof(fullpath), "%X", (unsigned int) pmcid); - pr->pr_pmcname = pmcstat_string_intern(fullpath); +/* + * Convert PMC index to name. + */ - LIST_INSERT_HEAD(&pmcstat_pmcs, pr, pr_next); +const char * +pmcstat_pmcindex_to_name(int pmcin) +{ + struct pmcstat_pmcrecord *pr; - return (pmcstat_string_unintern(pr->pr_pmcname)); + LIST_FOREACH(pr, &pmcstat_pmcs, pr_next) + if (pr->pr_pmcin == pmcin) + return pmcstat_string_unintern(pr->pr_pmcname); + + err(EX_SOFTWARE, "ERROR: cannot find pmcid name"); + return NULL; +} + +/* + * Return PMC record with given index. + */ + +struct pmcstat_pmcrecord * +pmcstat_pmcindex_to_pmcr(int pmcin) +{ + struct pmcstat_pmcrecord *pr; + + LIST_FOREACH(pr, &pmcstat_pmcs, pr_next) + if (pr->pr_pmcin == pmcin) + return pr; + + err(EX_SOFTWARE, "ERROR: invalid pmcindex"); + return NULL; +} + +/* + * Get PMC record by id, apply merge policy. + */ + +static struct pmcstat_pmcrecord * +pmcstat_lookup_pmcid(pmc_id_t pmcid) +{ + struct pmcstat_pmcrecord *pr; + + LIST_FOREACH(pr, &pmcstat_pmcs, pr_next) { + if (pr->pr_pmcid == pmcid) { + if (pmcstat_mergepmc) + return pr->pr_merge; + return pr; + } + } + + return NULL; } /* @@ -1358,13 +1096,11 @@ pmcstat_pmcid_to_name(pmc_id_t pmcid) static void pmcstat_process_aout_exec(struct pmcstat_process *pp, - struct pmcstat_image *image, uintfptr_t entryaddr, - struct pmcstat_args *a) + struct pmcstat_image *image, uintfptr_t entryaddr) { (void) pp; (void) image; (void) entryaddr; - (void) a; /* TODO Implement a.out handling */ } @@ -1374,8 +1110,7 @@ pmcstat_process_aout_exec(struct pmcstat_process *pp, static void pmcstat_process_elf_exec(struct pmcstat_process *pp, - struct pmcstat_image *image, uintfptr_t entryaddr, - struct pmcstat_args *a) + struct pmcstat_image *image, uintfptr_t entryaddr) { uintmax_t libstart; struct pmcstat_image *rtldimage; @@ -1414,8 +1149,7 @@ pmcstat_process_elf_exec(struct pmcstat_process *pp, * this we can figure out the address where the * runtime loader's file object had been mapped to. */ - rtldimage = pmcstat_image_from_path(image->pi_dynlinkerpath, - 0); + rtldimage = pmcstat_image_from_path(image->pi_dynlinkerpath, 0); if (rtldimage == NULL) { warnx("WARNING: Cannot find image for \"%s\".", pmcstat_string_unintern(image->pi_dynlinkerpath)); @@ -1424,7 +1158,7 @@ pmcstat_process_elf_exec(struct pmcstat_process *pp, } if (rtldimage->pi_type == PMCSTAT_IMAGE_UNKNOWN) - pmcstat_image_get_elf_params(rtldimage, a); + pmcstat_image_get_elf_params(rtldimage); if (rtldimage->pi_type != PMCSTAT_IMAGE_ELF32 && rtldimage->pi_type != PMCSTAT_IMAGE_ELF64) { @@ -1495,8 +1229,7 @@ pmcstat_process_lookup(pid_t pid, int allocate) static void pmcstat_process_exec(struct pmcstat_process *pp, - pmcstat_interned_string path, uintfptr_t entryaddr, - struct pmcstat_args *a) + pmcstat_interned_string path, uintfptr_t entryaddr) { struct pmcstat_image *image; @@ -1506,7 +1239,7 @@ pmcstat_process_exec(struct pmcstat_process *pp, } if (image->pi_type == PMCSTAT_IMAGE_UNKNOWN) - pmcstat_image_determine_type(image, a); + pmcstat_image_determine_type(image); assert(image->pi_type != PMCSTAT_IMAGE_UNKNOWN); @@ -1514,12 +1247,12 @@ pmcstat_process_exec(struct pmcstat_process *pp, case PMCSTAT_IMAGE_ELF32: case PMCSTAT_IMAGE_ELF64: pmcstat_stats.ps_exec_elf++; - pmcstat_process_elf_exec(pp, image, entryaddr, a); + pmcstat_process_elf_exec(pp, image, entryaddr); break; case PMCSTAT_IMAGE_AOUT: pmcstat_stats.ps_exec_aout++; - pmcstat_process_aout_exec(pp, image, entryaddr, a); + pmcstat_process_aout_exec(pp, image, entryaddr); break; case PMCSTAT_IMAGE_INDETERMINABLE: @@ -1537,7 +1270,7 @@ pmcstat_process_exec(struct pmcstat_process *pp, * Find the map entry associated with process 'p' at PC value 'pc'. */ -static struct pmcstat_pcmap * +struct pmcstat_pcmap * pmcstat_process_find_map(struct pmcstat_process *p, uintfptr_t pc) { struct pmcstat_pcmap *ppm; @@ -1552,444 +1285,36 @@ pmcstat_process_find_map(struct pmcstat_process *p, uintfptr_t pc) return (NULL); } -static struct pmcstat_cgnode * -pmcstat_cgnode_allocate(struct pmcstat_image *image, uintfptr_t pc) -{ - struct pmcstat_cgnode *cg; - - if ((cg = malloc(sizeof(*cg))) == NULL) - err(EX_OSERR, "ERROR: Cannot allocate callgraph node"); - - cg->pcg_image = image; - cg->pcg_func = pc; - - cg->pcg_count = 0; - cg->pcg_nchildren = 0; - LIST_INIT(&cg->pcg_children); - - return (cg); -} - -/* - * Free a node and its children. - */ -static void -pmcstat_cgnode_free(struct pmcstat_cgnode *cg) -{ - struct pmcstat_cgnode *cgc, *cgtmp; - - LIST_FOREACH_SAFE(cgc, &cg->pcg_children, pcg_sibling, cgtmp) - pmcstat_cgnode_free(cgc); - free(cg); -} - -/* - * Look for a callgraph node associated with pmc `pmcid' in the global - * hash table that corresponds to the given `pc' value in the process - * `pp'. - */ -static struct pmcstat_cgnode * -pmcstat_cgnode_hash_lookup_pc(struct pmcstat_process *pp, uint32_t pmcid, - uintfptr_t pc, int usermode) -{ - struct pmcstat_pcmap *ppm; - struct pmcstat_symbol *sym; - struct pmcstat_image *image; - struct pmcstat_cgnode *cg; - struct pmcstat_cgnode_hash *h; - uintfptr_t loadaddress; - unsigned int i, hash; - - ppm = pmcstat_process_find_map(usermode ? pp : pmcstat_kernproc, pc); - if (ppm == NULL) - return (NULL); - - image = ppm->ppm_image; - - loadaddress = ppm->ppm_lowpc + image->pi_vaddr - image->pi_start; - pc -= loadaddress; /* Convert to an offset in the image. */ - - /* - * Try determine the function at this offset. If we can't - * find a function round leave the `pc' value alone. - */ - if ((sym = pmcstat_symbol_search(image, pc)) != NULL) - pc = sym->ps_start; - - for (hash = i = 0; i < sizeof(uintfptr_t); i++) - hash += (pc >> i) & 0xFF; - - hash &= PMCSTAT_HASH_MASK; - - cg = NULL; - LIST_FOREACH(h, &pmcstat_cgnode_hash[hash], pch_next) - { - if (h->pch_pmcid != pmcid) - continue; - - cg = h->pch_cgnode; - - assert(cg != NULL); - - if (cg->pcg_image == image && cg->pcg_func == pc) - return (cg); - } - - /* - * We haven't seen this (pmcid, pc) tuple yet, so allocate a - * new callgraph node and a new hash table entry for it. - */ - cg = pmcstat_cgnode_allocate(image, pc); - if ((h = malloc(sizeof(*h))) == NULL) - err(EX_OSERR, "ERROR: Could not allocate callgraph node"); - - h->pch_pmcid = pmcid; - h->pch_cgnode = cg; - LIST_INSERT_HEAD(&pmcstat_cgnode_hash[hash], h, pch_next); - - pmcstat_cgnode_hash_count++; - - return (cg); -} - -/* - * Compare two callgraph nodes for sorting. - */ -static int -pmcstat_cgnode_compare(const void *a, const void *b) -{ - const struct pmcstat_cgnode *const *pcg1, *const *pcg2, *cg1, *cg2; - - pcg1 = (const struct pmcstat_cgnode *const *) a; - cg1 = *pcg1; - pcg2 = (const struct pmcstat_cgnode *const *) b; - cg2 = *pcg2; - - /* Sort in reverse order */ - if (cg1->pcg_count < cg2->pcg_count) - return (1); - if (cg1->pcg_count > cg2->pcg_count) - return (-1); - return (0); -} - -/* - * Find (allocating if a needed) a callgraph node in the given - * parent with the same (image, pcoffset) pair. - */ - -static struct pmcstat_cgnode * -pmcstat_cgnode_find(struct pmcstat_cgnode *parent, struct pmcstat_image *image, - uintfptr_t pcoffset) -{ - struct pmcstat_cgnode *child; - - LIST_FOREACH(child, &parent->pcg_children, pcg_sibling) { - if (child->pcg_image == image && - child->pcg_func == pcoffset) - return (child); - } - - /* - * Allocate a new structure. - */ - - child = pmcstat_cgnode_allocate(image, pcoffset); - - /* - * Link it into the parent. - */ - LIST_INSERT_HEAD(&parent->pcg_children, child, pcg_sibling); - parent->pcg_nchildren++; - - return (child); -} - -/* - * Print one callgraph node. The output format is: - * - * indentation %(parent's samples) #nsamples function@object - */ -static void -pmcstat_cgnode_print(struct pmcstat_args *a, struct pmcstat_cgnode *cg, - int depth, uint32_t total) -{ - uint32_t n; - const char *space; - struct pmcstat_symbol *sym; - struct pmcstat_cgnode **sortbuffer, **cgn, *pcg; - - space = " "; - - if (depth > 0) - (void) fprintf(a->pa_graphfile, "%*s", depth, space); - - if (cg->pcg_count == total) - (void) fprintf(a->pa_graphfile, "100.0%% "); - else - (void) fprintf(a->pa_graphfile, "%05.2f%% ", - 100.0 * cg->pcg_count / total); - - n = fprintf(a->pa_graphfile, " [%u] ", cg->pcg_count); - - /* #samples is a 12 character wide field. */ - if (n < 12) - (void) fprintf(a->pa_graphfile, "%*s", 12 - n, space); - - if (depth > 0) - (void) fprintf(a->pa_graphfile, "%*s", depth, space); - - sym = pmcstat_symbol_search(cg->pcg_image, cg->pcg_func); - if (sym) - (void) fprintf(a->pa_graphfile, "%s", - pmcstat_string_unintern(sym->ps_name)); - else - (void) fprintf(a->pa_graphfile, "%p", - (void *) (cg->pcg_image->pi_vaddr + cg->pcg_func)); - - if (pmcstat_previous_filename_printed != - cg->pcg_image->pi_fullpath) { - pmcstat_previous_filename_printed = cg->pcg_image->pi_fullpath; - (void) fprintf(a->pa_graphfile, " @ %s\n", - pmcstat_string_unintern( - pmcstat_previous_filename_printed)); - } else - (void) fprintf(a->pa_graphfile, "\n"); - - if (cg->pcg_nchildren == 0) - return; - - if ((sortbuffer = (struct pmcstat_cgnode **) - malloc(sizeof(struct pmcstat_cgnode *) * - cg->pcg_nchildren)) == NULL) - err(EX_OSERR, "ERROR: Cannot print callgraph"); - cgn = sortbuffer; - - LIST_FOREACH(pcg, &cg->pcg_children, pcg_sibling) - *cgn++ = pcg; - - assert(cgn - sortbuffer == (int) cg->pcg_nchildren); - - qsort(sortbuffer, cg->pcg_nchildren, sizeof(struct pmcstat_cgnode *), - pmcstat_cgnode_compare); - - for (cgn = sortbuffer, n = 0; n < cg->pcg_nchildren; n++, cgn++) - pmcstat_cgnode_print(a, *cgn, depth+1, cg->pcg_count); - - free(sortbuffer); -} - -/* - * Record a callchain. - */ - -static void -pmcstat_record_callchain(struct pmcstat_process *pp, uint32_t pmcid, - uint32_t nsamples, uintfptr_t *cc, int usermode, struct pmcstat_args *a) -{ - uintfptr_t pc, loadaddress; - uint32_t n; - struct pmcstat_image *image; - struct pmcstat_pcmap *ppm; - struct pmcstat_symbol *sym; - struct pmcstat_cgnode *parent, *child; - - /* - * Find the callgraph node recorded in the global hash table - * for this (pmcid, pc). - */ - - pc = cc[0]; - parent = pmcstat_cgnode_hash_lookup_pc(pp, pmcid, pc, usermode); - if (parent == NULL) { - pmcstat_stats.ps_callchain_dubious_frames++; - return; - } - - parent->pcg_count++; - - /* - * For each return address in the call chain record, subject - * to the maximum depth desired. - * - Find the image associated with the sample. Stop if there - * there is no valid image at that address. - * - Find the function that overlaps the return address. - * - If found: use the start address of the function. - * If not found (say an object's symbol table is not present or - * is incomplete), round down to th gprof bucket granularity. - * - Convert return virtual address to an offset in the image. - * - Look for a child with the same {offset,image} tuple, - * inserting one if needed. - * - Increment the count of occurrences of the child. - */ - - for (n = 1; n < (uint32_t) a->pa_graphdepth && n < nsamples; n++, - parent = child) { - pc = cc[n]; - - ppm = pmcstat_process_find_map(usermode ? pp : - pmcstat_kernproc, pc); - if (ppm == NULL) - return; - - image = ppm->ppm_image; - loadaddress = ppm->ppm_lowpc + image->pi_vaddr - - image->pi_start; - pc -= loadaddress; - - if ((sym = pmcstat_symbol_search(image, pc)) != NULL) - pc = sym->ps_start; - - child = pmcstat_cgnode_find(parent, image, pc); - child->pcg_count++; - } -} - -/* - * Printing a callgraph for a PMC. - */ -static void -pmcstat_callgraph_print_for_pmcid(struct pmcstat_args *a, - struct pmcstat_pmcrecord *pmcr) -{ - int n, nentries; - uint32_t nsamples, pmcid; - struct pmcstat_cgnode **sortbuffer, **cgn; - struct pmcstat_cgnode_hash *pch; - - /* - * We pull out all callgraph nodes in the top-level hash table - * with a matching PMC id. We then sort these based on the - * frequency of occurrence. Each callgraph node is then - * printed. - */ - - nsamples = 0; - pmcid = pmcr->pr_pmcid; - if ((sortbuffer = (struct pmcstat_cgnode **) - malloc(sizeof(struct pmcstat_cgnode *) * - pmcstat_cgnode_hash_count)) == NULL) - err(EX_OSERR, "ERROR: Cannot sort callgraph"); - cgn = sortbuffer; - - memset(sortbuffer, 0xFF, pmcstat_cgnode_hash_count * - sizeof(struct pmcstat_cgnode **)); - - for (n = 0; n < PMCSTAT_NHASH; n++) - LIST_FOREACH(pch, &pmcstat_cgnode_hash[n], pch_next) - if (pch->pch_pmcid == pmcid) { - nsamples += pch->pch_cgnode->pcg_count; - *cgn++ = pch->pch_cgnode; - } - - nentries = cgn - sortbuffer; - assert(nentries <= pmcstat_cgnode_hash_count); - - if (nentries == 0) - return; - - qsort(sortbuffer, nentries, sizeof(struct pmcstat_cgnode *), - pmcstat_cgnode_compare); - - (void) fprintf(a->pa_graphfile, - "@ %s [%u samples]\n\n", - pmcstat_string_unintern(pmcr->pr_pmcname), - nsamples); - - for (cgn = sortbuffer, n = 0; n < nentries; n++, cgn++) { - pmcstat_previous_filename_printed = NULL; - pmcstat_cgnode_print(a, *cgn, 0, nsamples); - (void) fprintf(a->pa_graphfile, "\n"); - } - - free(sortbuffer); -} - -/* - * Print out callgraphs. - */ - -static void -pmcstat_callgraph_print(struct pmcstat_args *a) -{ - struct pmcstat_pmcrecord *pmcr; - - LIST_FOREACH(pmcr, &pmcstat_pmcs, pr_next) - pmcstat_callgraph_print_for_pmcid(a, pmcr); -} - -static void -pmcstat_cgnode_do_gmon_arcs(struct pmcstat_cgnode *cg, pmc_id_t pmcid) -{ - struct pmcstat_cgnode *cgc; - - /* - * Look for child nodes that belong to the same image. - */ - - LIST_FOREACH(cgc, &cg->pcg_children, pcg_sibling) { - if (cgc->pcg_image == cg->pcg_image) - pmcstat_gmon_append_arc(cg->pcg_image, pmcid, - cgc->pcg_func, cg->pcg_func, cgc->pcg_count); - if (cgc->pcg_nchildren > 0) - pmcstat_cgnode_do_gmon_arcs(cgc, pmcid); - } -} - -static void -pmcstat_callgraph_do_gmon_arcs_for_pmcid(pmc_id_t pmcid) -{ - int n; - struct pmcstat_cgnode_hash *pch; - - for (n = 0; n < PMCSTAT_NHASH; n++) - LIST_FOREACH(pch, &pmcstat_cgnode_hash[n], pch_next) - if (pch->pch_pmcid == pmcid && - pch->pch_cgnode->pcg_nchildren > 1) - pmcstat_cgnode_do_gmon_arcs(pch->pch_cgnode, - pmcid); -} - - -static void -pmcstat_callgraph_do_gmon_arcs(void) -{ - struct pmcstat_pmcrecord *pmcr; - - LIST_FOREACH(pmcr, &pmcstat_pmcs, pr_next) - pmcstat_callgraph_do_gmon_arcs_for_pmcid(pmcr->pr_pmcid); -} - /* * Convert a hwpmc(4) log to profile information. A system-wide * callgraph is generated if FLAG_DO_CALLGRAPHS is set. gmon.out * files usable by gprof(1) are created if FLAG_DO_GPROF is set. */ static int -pmcstat_analyze_log(struct pmcstat_args *a) +pmcstat_analyze_log(void) { uint32_t cpu, cpuflags; - uintfptr_t pc, newpc; + uintfptr_t pc; pid_t pid; struct pmcstat_image *image; - struct pmcstat_symbol *sym; struct pmcstat_process *pp, *ppnew; struct pmcstat_pcmap *ppm, *ppmtmp; struct pmclog_ev ev; + struct pmcstat_pmcrecord *pmcr; pmcstat_interned_string image_path; - assert(a->pa_flags & FLAG_DO_ANALYSIS); + assert(args.pa_flags & FLAG_DO_ANALYSIS); if (elf_version(EV_CURRENT) == EV_NONE) err(EX_UNAVAILABLE, "Elf library intialization failed"); - while (pmclog_read(a->pa_logparser, &ev) == 0) { + while (pmclog_read(args.pa_logparser, &ev) == 0) { assert(ev.pl_state == PMCLOG_OK); switch (ev.pl_type) { case PMCLOG_TYPE_INITIALIZE: if ((ev.pl_u.pl_i.pl_version & 0xFF000000) != - PMC_VERSION_MAJOR << 24 && a->pa_verbosity > 0) + PMC_VERSION_MAJOR << 24 && args.pa_verbosity > 0) warnx("WARNING: Log version 0x%x does not " "match compiled version 0x%x.", ev.pl_u.pl_i.pl_version, @@ -2019,7 +1344,7 @@ pmcstat_analyze_log(struct pmcstat_args *a) pl_pathname); image = pmcstat_image_from_path(image_path, pid == -1); if (image->pi_type == PMCSTAT_IMAGE_UNKNOWN) - pmcstat_image_determine_type(image, a); + pmcstat_image_determine_type(image); if (image->pi_type != PMCSTAT_IMAGE_INDETERMINABLE) pmcstat_image_link(pp, image, ev.pl_u.pl_mi.pl_start); @@ -2059,16 +1384,23 @@ pmcstat_analyze_log(struct pmcstat_args *a) pc = ev.pl_u.pl_s.pl_pc; pp = pmcstat_process_lookup(ev.pl_u.pl_s.pl_pid, PMCSTAT_ALLOCATE); - if ((ppm = pmcstat_process_find_map(pp, pc)) == NULL && - (ppm = pmcstat_process_find_map(pmcstat_kernproc, - pc)) == NULL) { /* unknown process,offset pair */ - pmcstat_stats.ps_samples_unknown_offset++; - break; - } - pmcstat_image_increment_bucket(ppm, pc, - ev.pl_u.pl_s.pl_pmcid, a); + /* Get PMC record. */ + pmcr = pmcstat_lookup_pmcid(ev.pl_u.pl_s.pl_pmcid); + assert(pmcr != NULL); + /* + * Call the plugins processing + * TODO: move pmcstat_process_find_map inside plugins + */ + + if (plugins[args.pa_pplugin].pl_process != NULL) + plugins[args.pa_pplugin].pl_process( + pp, pmcr, 1, &pc, + pmcstat_process_find_map(pp, pc) != NULL, 0); + plugins[args.pa_plugin].pl_process( + pp, pmcr, 1, &pc, + pmcstat_process_find_map(pp, pc) != NULL, 0); break; case PMCLOG_TYPE_CALLCHAIN: @@ -2078,7 +1410,7 @@ pmcstat_analyze_log(struct pmcstat_args *a) cpu = PMC_CALLCHAIN_CPUFLAGS_TO_CPU(cpuflags); /* Filter on the CPU id. */ - if ((a->pa_cpumask & (1 << cpu)) == 0) { + if ((args.pa_cpumask & (1 << cpu)) == 0) { pmcstat_stats.ps_samples_skipped++; break; } @@ -2086,45 +1418,27 @@ pmcstat_analyze_log(struct pmcstat_args *a) pp = pmcstat_process_lookup(ev.pl_u.pl_cc.pl_pid, PMCSTAT_ALLOCATE); - if ((a->pa_flags & FLAG_WANTS_MAPPINGS) == 0) - pmcstat_record_callchain(pp, - ev.pl_u.pl_cc.pl_pmcid, - ev.pl_u.pl_cc.pl_npc, ev.pl_u.pl_cc.pl_pc, - PMC_CALLCHAIN_CPUFLAGS_TO_USERMODE(cpuflags), a); + /* Get PMC record. */ + pmcr = pmcstat_lookup_pmcid(ev.pl_u.pl_cc.pl_pmcid); + assert(pmcr != NULL); - if ((a->pa_flags & - (FLAG_DO_GPROF | FLAG_WANTS_MAPPINGS)) == 0) - break; - - pc = ev.pl_u.pl_cc.pl_pc[0]; - if (PMC_CALLCHAIN_CPUFLAGS_TO_USERMODE(cpuflags) == 0) - pp = pmcstat_kernproc; - ppm = pmcstat_process_find_map(pp, pc); - if (ppm == NULL) { - - /* Unknown offset. */ - pmcstat_stats.ps_samples_unknown_offset++; - break; - } - if (a->pa_flags & FLAG_WANTS_MAPPINGS) { - image = ppm->ppm_image; - newpc = pc - (ppm->ppm_lowpc + - (image->pi_vaddr - image->pi_start)); - sym = pmcstat_symbol_search(image, newpc); - if (sym == NULL) - break; - fprintf(a->pa_graphfile, "%p %s 0x%jx 0x%jx\n", - (void *)pc, - pmcstat_string_unintern(sym->ps_name), - (uintmax_t)(sym->ps_start + - image->pi_vaddr), (uintmax_t)(sym->ps_end + - image->pi_vaddr)); - break; - } - - pmcstat_image_increment_bucket(ppm, pc, - ev.pl_u.pl_cc.pl_pmcid, a); + /* + * Call the plugins processing + */ + if (plugins[args.pa_pplugin].pl_process != NULL) + plugins[args.pa_pplugin].pl_process( + pp, pmcr, + ev.pl_u.pl_cc.pl_npc, + ev.pl_u.pl_cc.pl_pc, + PMC_CALLCHAIN_CPUFLAGS_TO_USERMODE(cpuflags), + cpu); + plugins[args.pa_plugin].pl_process( + pp, pmcr, + ev.pl_u.pl_cc.pl_npc, + ev.pl_u.pl_cc.pl_pc, + PMC_CALLCHAIN_CPUFLAGS_TO_USERMODE(cpuflags), + cpu); break; case PMCLOG_TYPE_PMCALLOCATE: @@ -2133,7 +1447,7 @@ pmcstat_analyze_log(struct pmcstat_args *a) * PMC and its name. */ pmcstat_pmcid_add(ev.pl_u.pl_a.pl_pmcid, - pmcstat_string_intern(ev.pl_u.pl_a.pl_evname), a); + pmcstat_string_intern(ev.pl_u.pl_a.pl_evname)); break; case PMCLOG_TYPE_PROCEXEC: @@ -2156,7 +1470,7 @@ pmcstat_analyze_log(struct pmcstat_args *a) ev.pl_u.pl_x.pl_pathname); assert(image_path != NULL); pmcstat_process_exec(pp, image_path, - ev.pl_u.pl_x.pl_entryaddr, a); + ev.pl_u.pl_x.pl_entryaddr); break; case PMCLOG_TYPE_PROCEXIT: @@ -2224,16 +1538,16 @@ pmcstat_analyze_log(struct pmcstat_args *a) */ static int -pmcstat_print_log(struct pmcstat_args *a) +pmcstat_print_log(void) { struct pmclog_ev ev; uint32_t npc; - while (pmclog_read(a->pa_logparser, &ev) == 0) { + while (pmclog_read(args.pa_logparser, &ev) == 0) { assert(ev.pl_state == PMCLOG_OK); switch (ev.pl_type) { case PMCLOG_TYPE_CALLCHAIN: - PMCSTAT_PRINT_ENTRY(a, "callchain", + PMCSTAT_PRINT_ENTRY("callchain", "%d 0x%x %d %d %c", ev.pl_u.pl_cc.pl_pid, ev.pl_u.pl_cc.pl_pmcid, PMC_CALLCHAIN_CPUFLAGS_TO_CPU(ev.pl_u.pl_cc. \ @@ -2241,95 +1555,95 @@ pmcstat_print_log(struct pmcstat_args *a) PMC_CALLCHAIN_CPUFLAGS_TO_USERMODE(ev.pl_u.pl_cc.\ pl_cpuflags) ? 'u' : 's'); for (npc = 0; npc < ev.pl_u.pl_cc.pl_npc; npc++) - PMCSTAT_PRINT_ENTRY(a, "...", "%p", + PMCSTAT_PRINT_ENTRY("...", "%p", (void *) ev.pl_u.pl_cc.pl_pc[npc]); break; case PMCLOG_TYPE_CLOSELOG: - PMCSTAT_PRINT_ENTRY(a,"closelog",); + PMCSTAT_PRINT_ENTRY("closelog",); break; case PMCLOG_TYPE_DROPNOTIFY: - PMCSTAT_PRINT_ENTRY(a,"drop",); + PMCSTAT_PRINT_ENTRY("drop",); break; case PMCLOG_TYPE_INITIALIZE: - PMCSTAT_PRINT_ENTRY(a,"initlog","0x%x \"%s\"", + PMCSTAT_PRINT_ENTRY("initlog","0x%x \"%s\"", ev.pl_u.pl_i.pl_version, pmc_name_of_cputype(ev.pl_u.pl_i.pl_arch)); if ((ev.pl_u.pl_i.pl_version & 0xFF000000) != - PMC_VERSION_MAJOR << 24 && a->pa_verbosity > 0) + PMC_VERSION_MAJOR << 24 && args.pa_verbosity > 0) warnx("WARNING: Log version 0x%x != expected " "version 0x%x.", ev.pl_u.pl_i.pl_version, PMC_VERSION); break; case PMCLOG_TYPE_MAP_IN: - PMCSTAT_PRINT_ENTRY(a,"map-in","%d %p \"%s\"", + PMCSTAT_PRINT_ENTRY("map-in","%d %p \"%s\"", ev.pl_u.pl_mi.pl_pid, (void *) ev.pl_u.pl_mi.pl_start, ev.pl_u.pl_mi.pl_pathname); break; case PMCLOG_TYPE_MAP_OUT: - PMCSTAT_PRINT_ENTRY(a,"map-out","%d %p %p", + PMCSTAT_PRINT_ENTRY("map-out","%d %p %p", ev.pl_u.pl_mo.pl_pid, (void *) ev.pl_u.pl_mo.pl_start, (void *) ev.pl_u.pl_mo.pl_end); break; case PMCLOG_TYPE_PCSAMPLE: - PMCSTAT_PRINT_ENTRY(a,"sample","0x%x %d %p %c", + PMCSTAT_PRINT_ENTRY("sample","0x%x %d %p %c", ev.pl_u.pl_s.pl_pmcid, ev.pl_u.pl_s.pl_pid, (void *) ev.pl_u.pl_s.pl_pc, ev.pl_u.pl_s.pl_usermode ? 'u' : 's'); break; case PMCLOG_TYPE_PMCALLOCATE: - PMCSTAT_PRINT_ENTRY(a,"allocate","0x%x \"%s\" 0x%x", + PMCSTAT_PRINT_ENTRY("allocate","0x%x \"%s\" 0x%x", ev.pl_u.pl_a.pl_pmcid, ev.pl_u.pl_a.pl_evname, ev.pl_u.pl_a.pl_flags); break; case PMCLOG_TYPE_PMCATTACH: - PMCSTAT_PRINT_ENTRY(a,"attach","0x%x %d \"%s\"", + PMCSTAT_PRINT_ENTRY("attach","0x%x %d \"%s\"", ev.pl_u.pl_t.pl_pmcid, ev.pl_u.pl_t.pl_pid, ev.pl_u.pl_t.pl_pathname); break; case PMCLOG_TYPE_PMCDETACH: - PMCSTAT_PRINT_ENTRY(a,"detach","0x%x %d", + PMCSTAT_PRINT_ENTRY("detach","0x%x %d", ev.pl_u.pl_d.pl_pmcid, ev.pl_u.pl_d.pl_pid); break; case PMCLOG_TYPE_PROCCSW: - PMCSTAT_PRINT_ENTRY(a,"cswval","0x%x %d %jd", + PMCSTAT_PRINT_ENTRY("cswval","0x%x %d %jd", ev.pl_u.pl_c.pl_pmcid, ev.pl_u.pl_c.pl_pid, ev.pl_u.pl_c.pl_value); break; case PMCLOG_TYPE_PROCEXEC: - PMCSTAT_PRINT_ENTRY(a,"exec","0x%x %d %p \"%s\"", + PMCSTAT_PRINT_ENTRY("exec","0x%x %d %p \"%s\"", ev.pl_u.pl_x.pl_pmcid, ev.pl_u.pl_x.pl_pid, (void *) ev.pl_u.pl_x.pl_entryaddr, ev.pl_u.pl_x.pl_pathname); break; case PMCLOG_TYPE_PROCEXIT: - PMCSTAT_PRINT_ENTRY(a,"exitval","0x%x %d %jd", + PMCSTAT_PRINT_ENTRY("exitval","0x%x %d %jd", ev.pl_u.pl_e.pl_pmcid, ev.pl_u.pl_e.pl_pid, ev.pl_u.pl_e.pl_value); break; case PMCLOG_TYPE_PROCFORK: - PMCSTAT_PRINT_ENTRY(a,"fork","%d %d", + PMCSTAT_PRINT_ENTRY("fork","%d %d", ev.pl_u.pl_f.pl_oldpid, ev.pl_u.pl_f.pl_newpid); break; case PMCLOG_TYPE_USERDATA: - PMCSTAT_PRINT_ENTRY(a,"userdata","0x%x", + PMCSTAT_PRINT_ENTRY("userdata","0x%x", ev.pl_u.pl_u.pl_userdata); break; case PMCLOG_TYPE_SYSEXIT: - PMCSTAT_PRINT_ENTRY(a,"exit","%d", + PMCSTAT_PRINT_ENTRY("exit","%d", ev.pl_u.pl_se.pl_pid); break; default: - fprintf(a->pa_printfile, "unknown event (type %d).\n", + fprintf(args.pa_printfile, "unknown event (type %d).\n", ev.pl_type); } } @@ -2354,13 +1668,13 @@ pmcstat_print_log(struct pmcstat_args *a) */ int -pmcstat_close_log(struct pmcstat_args *a) +pmcstat_close_log(void) { if (pmc_flush_logfile() < 0 || pmc_configure_logfile(-1) < 0) err(EX_OSERR, "ERROR: logging failed"); - a->pa_flags &= ~(FLAG_HAS_OUTPUT_LOGFILE | FLAG_HAS_PIPE); - return (a->pa_flags & FLAG_HAS_PIPE ? PMCSTAT_EXITING : + args.pa_flags &= ~(FLAG_HAS_OUTPUT_LOGFILE | FLAG_HAS_PIPE); + return (args.pa_flags & FLAG_HAS_PIPE ? PMCSTAT_EXITING : PMCSTAT_FINISHED); } @@ -2456,17 +1770,208 @@ pmcstat_open_log(const char *path, int mode) */ int -pmcstat_process_log(struct pmcstat_args *a) +pmcstat_process_log(void) { /* * If analysis has not been asked for, just print the log to * the current output file. */ - if (a->pa_flags & FLAG_DO_PRINT) - return (pmcstat_print_log(a)); + if (args.pa_flags & FLAG_DO_PRINT) + return (pmcstat_print_log()); else - return (pmcstat_analyze_log(a)); + return (pmcstat_analyze_log()); +} + +/* + * Refresh top display. + */ + +static void +pmcstat_refresh_top(void) +{ + char pmcname[40]; + + /* If in pause mode do not refresh display. */ + if (pmcstat_pause) + return; + + /* Format PMC name. */ + if (pmcstat_mergepmc) + snprintf(pmcname, sizeof(pmcname), "[%s]", + pmcstat_pmcindex_to_name(pmcstat_pmcinfilter)); + else + snprintf(pmcname, sizeof(pmcname), "%s.%d", + pmcstat_pmcindex_to_name(pmcstat_pmcinfilter), + pmcstat_pmcinfilter); + + PMCSTAT_PRINTBEGIN(); + PMCSTAT_PRINTW("PMC: %s Samples: %u processed, %u invalid\n\n", + pmcname, + pmcstat_stats.ps_samples_total, + pmcstat_stats.ps_samples_unknown_offset + + pmcstat_stats.ps_samples_indeterminable + + pmcstat_stats.ps_callchain_dubious_frames); + if (plugins[args.pa_plugin].pl_topdisplay != NULL) + plugins[args.pa_plugin].pl_topdisplay(); + PMCSTAT_PRINTEND(); +} + +/* + * Find the next pmc index to display. + */ + +static void +pmcstat_changefilter(void) +{ + int pmcin; + struct pmcstat_pmcrecord *pmcr; + + /* + * Find the next merge target. + */ + if (pmcstat_mergepmc) { + pmcin = pmcstat_pmcinfilter; + + do { + pmcr = pmcstat_pmcindex_to_pmcr(pmcstat_pmcinfilter); + if (pmcr == pmcr->pr_merge) + break; + + pmcstat_pmcinfilter++; + if (pmcstat_pmcinfilter >= pmcstat_npmcs) + pmcstat_pmcinfilter = 0; + + } while (pmcstat_pmcinfilter != pmcin); + } +} + +/* + * Top mode keypress. + */ + +int +pmcstat_keypress_log(void) +{ + int c, ret = 0; + WINDOW *w; + + w = newwin(1, 0, 1, 0); + c = wgetch(w); + wprintw(w, "Key: %c => ", c); + switch (c) { + case 'c': + wprintw(w, "enter mode 'd' or 'a' => "); + c = wgetch(w); + if (c == 'd') { + args.pa_topmode = PMCSTAT_TOP_DELTA; + wprintw(w, "switching to delta mode"); + } else { + args.pa_topmode = PMCSTAT_TOP_ACCUM; + wprintw(w, "switching to accumulation mode"); + } + break; + case 'm': + pmcstat_mergepmc = !pmcstat_mergepmc; + /* + * Changing merge state require data reset. + */ + if (plugins[args.pa_plugin].pl_shutdown != NULL) + plugins[args.pa_plugin].pl_shutdown(NULL); + bzero(&pmcstat_stats, sizeof(struct pmcstat_stats)); + if (plugins[args.pa_plugin].pl_init != NULL) + plugins[args.pa_plugin].pl_init(); + + /* Update filter to be on a merge target. */ + pmcstat_changefilter(); + wprintw(w, "merge PMC %s", pmcstat_mergepmc ? "on" : "off"); + break; + case 'n': + /* Close current plugin. */ + if (plugins[args.pa_plugin].pl_shutdown != NULL) + plugins[args.pa_plugin].pl_shutdown(NULL); + + /* Find next top display available. */ + do { + args.pa_plugin++; + if (plugins[args.pa_plugin].pl_name == NULL) + args.pa_plugin = 0; + } while (plugins[args.pa_plugin].pl_topdisplay == NULL); + + /* Open new plugin. */ + bzero(&pmcstat_stats, sizeof(struct pmcstat_stats)); + if (plugins[args.pa_plugin].pl_init != NULL) + plugins[args.pa_plugin].pl_init(); + wprintw(w, "switching to plugin %s", + plugins[args.pa_plugin].pl_name); + break; + case 'p': + pmcstat_pmcinfilter++; + if (pmcstat_pmcinfilter >= pmcstat_npmcs) + pmcstat_pmcinfilter = 0; + pmcstat_changefilter(); + wprintw(w, "switching to PMC %s.%d", + pmcstat_pmcindex_to_name(pmcstat_pmcinfilter), + pmcstat_pmcinfilter); + break; + case ' ': + pmcstat_pause = !pmcstat_pause; + if (pmcstat_pause) + wprintw(w, "pause => press space again to continue"); + break; + case 'q': + wprintw(w, "exiting..."); + ret = 1; + default: + if (plugins[args.pa_plugin].pl_topkeypress != NULL) + if (plugins[args.pa_plugin].pl_topkeypress(c, w)) + ret = 1; + } + + wrefresh(w); + delwin(w); + return ret; +} + + +/* + * Top mode display. + */ + +void +pmcstat_display_log(void) +{ + + pmcstat_refresh_top(); + + /* Reset everythings if delta mode. */ + if (args.pa_topmode == PMCSTAT_TOP_DELTA) { + if (plugins[args.pa_plugin].pl_shutdown != NULL) + plugins[args.pa_plugin].pl_shutdown(NULL); + bzero(&pmcstat_stats, sizeof(struct pmcstat_stats)); + if (plugins[args.pa_plugin].pl_init != NULL) + plugins[args.pa_plugin].pl_init(); + } + +} + +/* + * Configure a plugins. + */ + +void +pmcstat_pluginconfigure_log(char *opt) +{ + + if (strncmp(opt, "threshold=", 10) == 0) { + pmcstat_threshold = atof(opt+10); + } else { + if (plugins[args.pa_plugin].pl_configure != NULL) { + if (!plugins[args.pa_plugin].pl_configure(opt)) + err(EX_USAGE, + "ERROR: unknown option <%s>.", opt); + } + } } /* @@ -2474,12 +1979,10 @@ pmcstat_process_log(struct pmcstat_args *a) */ void -pmcstat_initialize_logging(struct pmcstat_args *a) +pmcstat_initialize_logging(void) { int i; - (void) a; - /* use a convenient format for 'ldd' output */ if (setenv("LD_TRACE_LOADED_OBJECTS_FMT1","%o \"%p\" %x\n",1) != 0) err(EX_OSERR, "ERROR: Cannot setenv"); @@ -2499,6 +2002,21 @@ pmcstat_initialize_logging(struct pmcstat_args *a) if ((pmcstat_kernproc = pmcstat_process_lookup((pid_t) -1, PMCSTAT_ALLOCATE)) == NULL) err(EX_OSERR, "ERROR: Cannot initialize logging"); + + /* PMC count. */ + pmcstat_npmcs = 0; + + /* Merge PMC with same name. */ + pmcstat_mergepmc = args.pa_mergepmc; + + /* + * Initialize plugins + */ + + if (plugins[args.pa_pplugin].pl_init != NULL) + plugins[args.pa_pplugin].pl_init(); + if (plugins[args.pa_plugin].pl_init != NULL) + plugins[args.pa_plugin].pl_init(); } /* @@ -2506,99 +2024,57 @@ pmcstat_initialize_logging(struct pmcstat_args *a) */ void -pmcstat_shutdown_logging(struct pmcstat_args *a) +pmcstat_shutdown_logging(void) { int i; FILE *mf; - struct pmcstat_gmonfile *pgf, *pgftmp; struct pmcstat_image *pi, *pitmp; struct pmcstat_process *pp, *pptmp; - struct pmcstat_cgnode_hash *pch, *pchtmp; + struct pmcstat_pcmap *ppm, *ppmtmp; /* determine where to send the map file */ mf = NULL; - if (a->pa_mapfilename != NULL) - mf = (strcmp(a->pa_mapfilename, "-") == 0) ? - a->pa_printfile : fopen(a->pa_mapfilename, "w"); + if (args.pa_mapfilename != NULL) + mf = (strcmp(args.pa_mapfilename, "-") == 0) ? + args.pa_printfile : fopen(args.pa_mapfilename, "w"); - if (mf == NULL && a->pa_flags & FLAG_DO_GPROF && - a->pa_verbosity >= 2) - mf = a->pa_printfile; + if (mf == NULL && args.pa_flags & FLAG_DO_GPROF && + args.pa_verbosity >= 2) + mf = args.pa_printfile; if (mf) (void) fprintf(mf, "MAP:\n"); - - if (a->pa_flags & FLAG_DO_CALLGRAPHS) - pmcstat_callgraph_print(a); - /* - * Sync back all gprof flat profile data. + * Shutdown the plugins */ - for (i = 0; i < PMCSTAT_NHASH; i++) { - LIST_FOREACH(pi, &pmcstat_image_hash[i], pi_next) { - if (mf) - (void) fprintf(mf, " \"%s\" => \"%s\"", - pmcstat_string_unintern(pi->pi_execpath), - pmcstat_string_unintern( - pi->pi_samplename)); - /* flush gmon.out data to disk */ - LIST_FOREACH(pgf, &pi->pi_gmlist, pgf_next) { - pmcstat_gmon_unmap_file(pgf); - if (mf) - (void) fprintf(mf, " %s/%d", - pmcstat_pmcid_to_name( - pgf->pgf_pmcid), - pgf->pgf_nsamples); - if (pgf->pgf_overflow && a->pa_verbosity >= 1) - warnx("WARNING: profile \"%s\" " - "overflowed.", - pmcstat_string_unintern( - pgf->pgf_name)); - } - - if (mf) - (void) fprintf(mf, "\n"); - } - } - - /* - * Compute arcs and add these to the gprof files. - */ - if (a->pa_flags & FLAG_DO_GPROF && a->pa_graphdepth > 1) - pmcstat_callgraph_do_gmon_arcs(); - - /* - * Free memory. - */ - for (i = 0; i < PMCSTAT_NHASH; i++) { - LIST_FOREACH_SAFE(pch, &pmcstat_cgnode_hash[i], pch_next, - pchtmp) { - pmcstat_cgnode_free(pch->pch_cgnode); - free(pch); - } - } + if (plugins[args.pa_plugin].pl_shutdown != NULL) + plugins[args.pa_plugin].pl_shutdown(mf); + if (plugins[args.pa_pplugin].pl_shutdown != NULL) + plugins[args.pa_pplugin].pl_shutdown(mf); for (i = 0; i < PMCSTAT_NHASH; i++) { - LIST_FOREACH_SAFE(pi, &pmcstat_image_hash[i], pi_next, pitmp) - { - LIST_FOREACH_SAFE(pgf, &pi->pi_gmlist, pgf_next, - pgftmp) { - if (pgf->pgf_file) - (void) fclose(pgf->pgf_file); - LIST_REMOVE(pgf, pgf_next); - free(pgf); - } - if (pi->pi_symbols) - free(pi->pi_symbols); + LIST_FOREACH_SAFE(pi, &pmcstat_image_hash[i], pi_next, + pitmp) { + if (plugins[args.pa_plugin].pl_shutdownimage != NULL) + plugins[args.pa_plugin].pl_shutdownimage(pi); + if (plugins[args.pa_pplugin].pl_shutdownimage != NULL) + plugins[args.pa_pplugin].pl_shutdownimage(pi); + free(pi->pi_symbols); + if (pi->pi_addr2line != NULL) + pclose(pi->pi_addr2line); LIST_REMOVE(pi, pi_next); free(pi); } LIST_FOREACH_SAFE(pp, &pmcstat_process_hash[i], pp_next, pptmp) { + TAILQ_FOREACH_SAFE(ppm, &pp->pp_map, ppm_next, ppmtmp) { + TAILQ_REMOVE(&pp->pp_map, ppm, ppm_next); + free(ppm); + } LIST_REMOVE(pp, pp_next); free(pp); } @@ -2610,23 +2086,23 @@ pmcstat_shutdown_logging(struct pmcstat_args *a) * Print errors unless -q was specified. Print all statistics * if verbosity > 1. */ -#define PRINT(N,V,A) do { \ - if (pmcstat_stats.ps_##V || (A)->pa_verbosity >= 2) \ - (void) fprintf((A)->pa_printfile, " %-40s %d\n",\ +#define PRINT(N,V) do { \ + if (pmcstat_stats.ps_##V || args.pa_verbosity >= 2) \ + (void) fprintf(args.pa_printfile, " %-40s %d\n",\ N, pmcstat_stats.ps_##V); \ } while (0) - if (a->pa_verbosity >= 1 && a->pa_flags & FLAG_DO_GPROF) { - (void) fprintf(a->pa_printfile, "CONVERSION STATISTICS:\n"); - PRINT("#exec/a.out", exec_aout, a); - PRINT("#exec/elf", exec_elf, a); - PRINT("#exec/unknown", exec_indeterminable, a); - PRINT("#exec handling errors", exec_errors, a); - PRINT("#samples/total", samples_total, a); - PRINT("#samples/unclaimed", samples_unknown_offset, a); - PRINT("#samples/unknown-object", samples_indeterminable, a); - PRINT("#callchain/dubious-frames", callchain_dubious_frames, - a); + if (args.pa_verbosity >= 1 && (args.pa_flags & FLAG_DO_ANALYSIS) && + (args.pa_flags & FLAG_DO_TOP) == 0) { + (void) fprintf(args.pa_printfile, "CONVERSION STATISTICS:\n"); + PRINT("#exec/a.out", exec_aout); + PRINT("#exec/elf", exec_elf); + PRINT("#exec/unknown", exec_indeterminable); + PRINT("#exec handling errors", exec_errors); + PRINT("#samples/total", samples_total); + PRINT("#samples/unclaimed", samples_unknown_offset); + PRINT("#samples/unknown-object", samples_indeterminable); + PRINT("#callchain/dubious-frames", callchain_dubious_frames); } if (mf) diff --git a/usr.sbin/pmcstat/pmcstat_log.h b/usr.sbin/pmcstat/pmcstat_log.h new file mode 100644 index 000000000000..de92649c0d7c --- /dev/null +++ b/usr.sbin/pmcstat/pmcstat_log.h @@ -0,0 +1,196 @@ +/*- + * Copyright (c) 2005-2007, Joseph Koshy + * Copyright (c) 2007 The FreeBSD Foundation + * Copyright (c) 2009, Fabien Thomas + * All rights reserved. + * + * Portions of this software were developed by A. Joseph Koshy under + * sponsorship from the FreeBSD Foundation and Google, Inc. + * + * 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$ + */ + +#ifndef _PMCSTAT_LOG_H_ +#define _PMCSTAT_LOG_H_ + +typedef const void *pmcstat_interned_string; + +/* + * A 'pmcstat_process' structure models processes. Each process is + * associated with a set of pmcstat_pcmap structures that map + * addresses inside it to executable objects. This set is implemented + * as a list, kept sorted in ascending order of mapped addresses. + * + * 'pp_pid' holds the pid of the process. When a process exits, the + * 'pp_isactive' field is set to zero, but the process structure is + * not immediately reclaimed because there may still be samples in the + * log for this process. + */ + +struct pmcstat_process { + LIST_ENTRY(pmcstat_process) pp_next; /* hash-next */ + pid_t pp_pid; /* associated pid */ + int pp_isactive; /* whether active */ + uintfptr_t pp_entryaddr; /* entry address */ + TAILQ_HEAD(,pmcstat_pcmap) pp_map; /* address range map */ +}; +extern LIST_HEAD(pmcstat_process_hash_list, pmcstat_process) pmcstat_process_hash[PMCSTAT_NHASH]; + +/* + * A 'pmcstat_image' structure describes an executable program on + * disk. 'pi_execpath' is a cookie representing the pathname of + * the executable. 'pi_start' and 'pi_end' are the least and greatest + * virtual addresses for the text segments in the executable. + * 'pi_gmonlist' contains a linked list of gmon.out files associated + * with this image. + */ + +enum pmcstat_image_type { + PMCSTAT_IMAGE_UNKNOWN = 0, /* never looked at the image */ + PMCSTAT_IMAGE_INDETERMINABLE, /* can't tell what the image is */ + PMCSTAT_IMAGE_ELF32, /* ELF 32 bit object */ + PMCSTAT_IMAGE_ELF64, /* ELF 64 bit object */ + PMCSTAT_IMAGE_AOUT /* AOUT object */ +}; + +struct pmcstat_image { + LIST_ENTRY(pmcstat_image) pi_next; /* hash link */ + TAILQ_ENTRY(pmcstat_image) pi_lru; /* LRU list */ + pmcstat_interned_string pi_execpath; /* cookie */ + pmcstat_interned_string pi_samplename; /* sample path name */ + pmcstat_interned_string pi_fullpath; /* path to FS object */ + pmcstat_interned_string pi_name; /* display name */ + + enum pmcstat_image_type pi_type; /* executable type */ + + /* + * Executables have pi_start and pi_end; these are zero + * for shared libraries. + */ + uintfptr_t pi_start; /* start address (inclusive) */ + uintfptr_t pi_end; /* end address (exclusive) */ + uintfptr_t pi_entry; /* entry address */ + uintfptr_t pi_vaddr; /* virtual address where loaded */ + int pi_isdynamic; /* whether a dynamic object */ + int pi_iskernelmodule; + pmcstat_interned_string pi_dynlinkerpath; /* path in .interp */ + + /* All symbols associated with this object. */ + struct pmcstat_symbol *pi_symbols; + size_t pi_symcount; + + /* Handle to addr2line for this image. */ + FILE *pi_addr2line; + + /* + * Plugins private data + */ + + /* gprof: + * An image can be associated with one or more gmon.out files; + * one per PMC. + */ + LIST_HEAD(,pmcstat_gmonfile) pi_gmlist; +}; +extern LIST_HEAD(pmcstat_image_hash_list, pmcstat_image) pmcstat_image_hash[PMCSTAT_NHASH]; + +/* + * A 'pmcstat_pcmap' structure maps a virtual address range to an + * underlying 'pmcstat_image' descriptor. + */ +struct pmcstat_pcmap { + TAILQ_ENTRY(pmcstat_pcmap) ppm_next; + uintfptr_t ppm_lowpc; + uintfptr_t ppm_highpc; + struct pmcstat_image *ppm_image; +}; + +/* + * Each function symbol tracked by pmcstat(8). + */ + +struct pmcstat_symbol { + pmcstat_interned_string ps_name; + uint64_t ps_start; + uint64_t ps_end; +}; + +/* + * 'pmcstat_pmcrecord' is a mapping from PMC ids to human-readable + * names. + */ + +struct pmcstat_pmcrecord { + LIST_ENTRY(pmcstat_pmcrecord) pr_next; + pmc_id_t pr_pmcid; + int pr_pmcin; + pmcstat_interned_string pr_pmcname; + struct pmcstat_pmcrecord *pr_merge; +}; +extern LIST_HEAD(pmcstat_pmcs, pmcstat_pmcrecord) pmcstat_pmcs; /* PMC list */ + +/* + * Misc. statistics + */ +struct pmcstat_stats { + int ps_exec_aout; /* # a.out executables seen */ + int ps_exec_elf; /* # elf executables seen */ + int ps_exec_errors; /* # errors processing executables */ + int ps_exec_indeterminable; /* # unknown executables seen */ + int ps_samples_total; /* total number of samples processed */ + int ps_samples_skipped; /* #samples filtered out for any reason */ + int ps_samples_unknown_offset; /* #samples of rank 0 not in a map */ + int ps_samples_indeterminable; /* #samples in indeterminable images */ + int ps_callchain_dubious_frames;/* #dubious frame pointers seen */ +}; +extern struct pmcstat_stats pmcstat_stats; /* statistics */ + +extern struct pmcstat_process *pmcstat_kernproc; /* kernel 'process' */ + +extern int pmcstat_npmcs; /* PMC count. */ + +/* + * Top mode global options. + */ +float pmcstat_threshold; /* Threshold to filter node. */ +int pmcstat_pmcinfilter; /* PMC index displayed. */ + +/* Function prototypes */ +const char *pmcstat_pmcid_to_name(pmc_id_t _pmcid); +const char *pmcstat_pmcindex_to_name(int pmcin); +struct pmcstat_pmcrecord *pmcstat_pmcindex_to_pmcr(int pmcin); +struct pmcstat_pcmap *pmcstat_process_find_map(struct pmcstat_process *_p, + uintfptr_t _pc); +struct pmcstat_symbol *pmcstat_symbol_search(struct pmcstat_image *image, + uintfptr_t addr); +const char *pmcstat_string_unintern(pmcstat_interned_string _is); +pmcstat_interned_string pmcstat_string_intern(const char *_s); +void pmcstat_image_determine_type(struct pmcstat_image *_image); +pmcstat_interned_string pmcstat_string_lookup(const char *_s); +int pmcstat_image_addr2line(struct pmcstat_image *image, uintfptr_t addr, + char *sourcefile, size_t sourcefile_len, unsigned *sourceline, + char *funcname, size_t funcname_len); + +#endif /* _PMCSTAT_LOG_H_ */ + diff --git a/usr.sbin/pmcstat/pmcstat_top.h b/usr.sbin/pmcstat/pmcstat_top.h new file mode 100644 index 000000000000..281410b09caf --- /dev/null +++ b/usr.sbin/pmcstat/pmcstat_top.h @@ -0,0 +1,75 @@ +/*- + * Copyright (c) 2009, Fabien Thomas + * 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$ + */ + +#ifndef _PMCSTAT_TOP_H_ +#define _PMCSTAT_TOP_H_ + +/* Return the ncurses attributes for the given value. */ +#define PMCSTAT_ATTRPERCENT(b) \ + ((b) > 10.0 ? (args.pa_topcolor ? COLOR_PAIR(1) : A_BOLD) : \ + ((b) > 5.0 ? (args.pa_topcolor ? COLOR_PAIR(2) : 0) : \ + ((b) > 2.5 ? (args.pa_topcolor ? COLOR_PAIR(3) : 0) : 0))) + +/* Print to the default ncurse windows if on a terminal or to the file. */ +#define PMCSTAT_PRINTW(...) do { \ + if (args.pa_toptty) \ + printw(__VA_ARGS__); \ + else \ + fprintf(args.pa_printfile, __VA_ARGS__);\ +} while (0) + +/* If ncurses mode active set attributes. */ +#define PMCSTAT_ATTRON(b) do { \ + if (args.pa_toptty) \ + attron(b); \ +} while (0) + +/* If ncurses mode active unset attributes. */ +#define PMCSTAT_ATTROFF(b) do { \ + if (args.pa_toptty) \ + attroff(b); \ +} while (0) + +/* Erase screen and set cursor to top left. */ +#define PMCSTAT_PRINTBEGIN() do { \ + if (args.pa_toptty) \ + clear(); \ +} while (0) + +/* Flush buffer to backend. */ +#define PMCSTAT_PRINTEND() do { \ + if (!args.pa_toptty) { \ + PMCSTAT_PRINTW("---\n"); \ + fflush(args.pa_printfile); \ + } else \ + refresh(); \ +} while (0) + +/* Function prototypes */ + +#endif /* _PMCSTAT_TOP_H_ */ diff --git a/usr.sbin/pnpinfo/Makefile b/usr.sbin/pnpinfo/Makefile index 294b4f758d4f..164ef37790cf 100644 --- a/usr.sbin/pnpinfo/Makefile +++ b/usr.sbin/pnpinfo/Makefile @@ -11,4 +11,6 @@ CFLAGS+= -I${.CURDIR}/../../sys CFLAGS+= -DPC98 .endif +WARNS?= 2 + .include diff --git a/usr.sbin/portsnap/make_index/Makefile b/usr.sbin/portsnap/make_index/Makefile index 65b1a8e61063..87768f6035ef 100644 --- a/usr.sbin/portsnap/make_index/Makefile +++ b/usr.sbin/portsnap/make_index/Makefile @@ -2,7 +2,6 @@ PROG= make_index NO_MAN= -WARNS?= 6 BINDIR= ${LIBEXECDIR} diff --git a/usr.sbin/portsnap/phttpget/Makefile b/usr.sbin/portsnap/phttpget/Makefile index 154ff15f9520..6f003e3b975a 100644 --- a/usr.sbin/portsnap/phttpget/Makefile +++ b/usr.sbin/portsnap/phttpget/Makefile @@ -2,7 +2,6 @@ PROG= phttpget NO_MAN= -WARNS?= 6 BINDIR= ${LIBEXECDIR} diff --git a/usr.sbin/portsnap/portsnap/portsnap.sh b/usr.sbin/portsnap/portsnap/portsnap.sh index 0660b419b22e..f554809c4d24 100644 --- a/usr.sbin/portsnap/portsnap/portsnap.sh +++ b/usr.sbin/portsnap/portsnap/portsnap.sh @@ -140,7 +140,7 @@ parse_cmdline() { if [ ! -z "${SERVERNAME}" ]; then usage; fi shift; SERVERNAME="$1" ;; - cron | extract | fetch | update) + cron | extract | fetch | update | alfred) COMMANDS="${COMMANDS} $1" ;; *) @@ -1040,6 +1040,22 @@ cmd_update() { update_run || exit 1 } +# Alfred command. Run 'fetch' or 'cron' depending on +# whether stdin is a terminal; then run 'update' or +# 'extract' depending on whether ${PORTSDIR} exists. +cmd_alfred() { + if [ -t 0 ]; then + cmd_fetch + else + cmd_cron + fi + if [ -d ${PORTSDIR} ]; then + cmd_update + else + cmd_extract + fi +} + #### Entry point # Make sure we find utilities from the base system diff --git a/usr.sbin/powerd/Makefile b/usr.sbin/powerd/Makefile index 6adb188608aa..62f8da1ba1a4 100644 --- a/usr.sbin/powerd/Makefile +++ b/usr.sbin/powerd/Makefile @@ -2,13 +2,8 @@ PROG= powerd MAN= powerd.8 -WARNS?= 6 DPADD= ${LIBUTIL} LDADD= -lutil -.if ${MACHINE_ARCH} == "i386" -CFLAGS+=-DUSE_APM -.endif - .include diff --git a/usr.sbin/powerd/powerd.8 b/usr.sbin/powerd/powerd.8 index 7465410a6655..580886268e08 100644 --- a/usr.sbin/powerd/powerd.8 +++ b/usr.sbin/powerd/powerd.8 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd December 24, 2008 +.Dd December 21, 2009 .Dt POWERD 8 .Os .Sh NAME @@ -45,7 +45,7 @@ The .Nm utility monitors the system state and sets various power control options accordingly. -It offers three modes (maximum, minimum, and adaptive) that can be +It offers four modes (maximum, minimum, adaptive and hiadaptive) that can be individually selected while on AC power or batteries. The modes maximum, minimum, adaptive and hiadaptive may be abbreviated max, min, adp, hadp. @@ -57,9 +57,10 @@ Adaptive mode attempts to strike a balance by degrading performance when the system appears idle and increasing it when the system is busy. It offers a good balance between a small performance loss for greatly increased power savings. -Hiadaptive mode is alike adaptive mode, but tuned for systems where +Hiadaptive mode is like adaptive mode, but tuned for systems where performance and interactivity are more important then power consumption. -It rises frequency faster, drops slower and keeps twice lower CPU load. +It increases frequency faster, reduces the frequency less aggressively and +will maintain full frequency for longer. The default mode is adaptive for battery power and hiadaptive for the rest. .Pp The diff --git a/usr.sbin/powerd/powerd.c b/usr.sbin/powerd/powerd.c index e1b2a55a41bb..b4ba05d7a963 100644 --- a/usr.sbin/powerd/powerd.c +++ b/usr.sbin/powerd/powerd.c @@ -46,6 +46,10 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef __i386__ +#define USE_APM +#endif + #ifdef USE_APM #include #endif @@ -259,7 +263,7 @@ get_freq_id(int freq, int *freqs, int numfreqs) * to APM. If nothing succeeds, we'll just run in default mode. */ static void -acline_init() +acline_init(void) { acline_mib_len = 4; diff --git a/usr.sbin/ppp/Makefile b/usr.sbin/ppp/Makefile index e8ae0e3de3d6..11003d750aef 100644 --- a/usr.sbin/ppp/Makefile +++ b/usr.sbin/ppp/Makefile @@ -25,6 +25,9 @@ PPP_NO_SUID= .if ${MK_ATM} == "no" PPP_NO_ATM= .endif +.if ${MK_NETGRAPH} == "no" +PPP_NO_NETGRAPH= +.endif .if ${MK_PAM_SUPPORT} == "no" PPP_NO_PAM= .endif diff --git a/usr.sbin/ppp/id.c b/usr.sbin/ppp/id.c index 440d460e5301..ec6657426c36 100644 --- a/usr.sbin/ppp/id.c +++ b/usr.sbin/ppp/id.c @@ -49,7 +49,7 @@ #else #include #endif -#include +#include #include "log.h" #include "main.h" @@ -202,36 +202,25 @@ ID0uu_unlock(const char *basettyname) } void -ID0login(struct utmp *ut) +ID0login(const struct utmpx *ut) { ID0set0(); - if (logout(ut->ut_line)) { - log_Printf(LogID0, "logout(\"%s\")\n", ut->ut_line); - logwtmp(ut->ut_line, "", ""); - log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut->ut_line); - } - login(ut); - log_Printf(LogID0, "login(\"%s\", \"%.*s\")\n", - ut->ut_line, (int)(sizeof ut->ut_name), ut->ut_name); + pututxline(ut); + log_Printf(LogID0, "pututxline(\"%.*s\", \"%.*s\", \"%.*s\", \"%.*s\")\n", + (int)sizeof ut->ut_id, ut->ut_id, + (int)sizeof ut->ut_user, ut->ut_user, + (int)sizeof ut->ut_line, ut->ut_line, + (int)sizeof ut->ut_host, ut->ut_host); ID0setuser(); } void -ID0logout(const char *device, int nologout) +ID0logout(const struct utmpx *ut) { - struct utmp ut; - char ut_line[sizeof ut.ut_line + 1]; - - strncpy(ut_line, device, sizeof ut_line - 1); - ut_line[sizeof ut_line - 1] = '\0'; - ID0set0(); - if (nologout || logout(ut_line)) { - log_Printf(LogID0, "logout(\"%s\")\n", ut_line); - logwtmp(ut_line, "", ""); - log_Printf(LogID0, "logwtmp(\"%s\", \"\", \"\")\n", ut_line); - } else - log_Printf(LogERROR, "ID0logout: No longer logged in on %s\n", ut_line); + pututxline(ut); + log_Printf(LogID0, "pututxline(\"%.*s\")\n", + (int)sizeof ut->ut_id, ut->ut_id); ID0setuser(); } diff --git a/usr.sbin/ppp/id.h b/usr.sbin/ppp/id.h index 6125ab505754..2357dc7ec7b7 100644 --- a/usr.sbin/ppp/id.h +++ b/usr.sbin/ppp/id.h @@ -27,7 +27,7 @@ */ #ifndef NOSUID -struct utmp; +struct utmpx; struct sockaddr_un; extern void ID0init(void); @@ -41,8 +41,8 @@ extern int ID0write(int, const void *, size_t); extern int ID0uu_lock(const char *); extern int ID0uu_lock_txfr(const char *, pid_t); extern int ID0uu_unlock(const char *); -extern void ID0login(struct utmp *); -extern void ID0logout(const char *, int); +extern void ID0login(const struct utmpx *); +extern void ID0logout(const struct utmpx *); extern int ID0bind_un(int, const struct sockaddr_un *); extern int ID0connect_un(int, const struct sockaddr_un *); extern int ID0kill(pid_t, int); @@ -64,20 +64,8 @@ extern int ID0NgMkSockNode(const char *, int *, int *); #define ID0uu_lock uu_lock #define ID0uu_lock_txfr uu_lock_txfr #define ID0uu_unlock uu_unlock -#define ID0login(u) \ - do { \ - if (logout((u)->ut_line)) \ - logwtmp((u)->ut_line, "", ""); \ - login(u); \ - } while (0) -#define ID0logout(dev, no) \ - do { \ - struct utmp ut; \ - strncpy(ut.ut_line, dev, sizeof ut.ut_line - 1); \ - ut.ut_line[sizeof ut.ut_line - 1] = '\0'; \ - if (no || logout(ut.ut_line)) \ - logwtmp(ut.ut_line, "", ""); \ - } while (0) +#define ID0login pututxline +#define ID0logout pututxline #define ID0bind_un(s, n) bind(s, (const struct sockaddr *)(n), sizeof *(n)) #define ID0connect_un(s, n) \ connect(s, (const struct sockaddr *)(n), sizeof *(n)) diff --git a/usr.sbin/ppp/physical.c b/usr.sbin/ppp/physical.c index 03778006bcbf..4083aa93eac6 100644 --- a/usr.sbin/ppp/physical.c +++ b/usr.sbin/ppp/physical.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -42,7 +43,7 @@ #include #include #include -#include +#include #if defined(__OpenBSD__) || defined(__NetBSD__) #include #include @@ -106,8 +107,6 @@ #endif #include "tcpmss.h" -#define PPPOTCPLINE "ppp" - static int physical_DescriptorWrite(struct fdescriptor *, struct bundle *, const fd_set *); @@ -333,6 +332,7 @@ physical_Close(struct physical *p) { int newsid; char fn[PATH_MAX]; + struct utmpx ut; if (p->fd < 0) return; @@ -344,12 +344,11 @@ physical_Close(struct physical *p) physical_StopDeviceTimer(p); if (p->Utmp) { - if (p->handler && (p->handler->type == TCP_DEVICE || - p->handler->type == UDP_DEVICE)) - /* Careful - we logged in on line ``ppp'' with IP as our host */ - ID0logout(PPPOTCPLINE, 1); - else - ID0logout(p->name.base, 0); + memset(&ut, 0, sizeof ut); + ut.ut_type = DEAD_PROCESS; + gettimeofday(&ut.ut_tv, NULL); + snprintf(ut.ut_id, sizeof ut.ut_id, "%xppp", (int)getpid()); + ID0logout(&ut); p->Utmp = 0; } newsid = tcgetpgrp(p->fd) == getpgrp(); @@ -911,16 +910,17 @@ void physical_Login(struct physical *p, const char *name) { if (p->type == PHYS_DIRECT && *p->name.base && !p->Utmp) { - struct utmp ut; + struct utmpx ut; const char *connstr; char *colon; memset(&ut, 0, sizeof ut); - ut.ut_time = time(NULL); - strncpy(ut.ut_name, name, sizeof ut.ut_name); + ut.ut_type = USER_PROCESS; + gettimeofday(&ut.ut_tv, NULL); + snprintf(ut.ut_id, sizeof ut.ut_id, "%xppp", (int)getpid()); + strncpy(ut.ut_user, name, sizeof ut.ut_user); if (p->handler && (p->handler->type == TCP_DEVICE || p->handler->type == UDP_DEVICE)) { - strncpy(ut.ut_line, PPPOTCPLINE, sizeof ut.ut_line); strncpy(ut.ut_host, p->name.base, sizeof ut.ut_host); colon = memchr(ut.ut_host, ':', sizeof ut.ut_host); if (colon) @@ -931,7 +931,7 @@ physical_Login(struct physical *p, const char *name) /* mgetty sets this to the connection speed */ strncpy(ut.ut_host, connstr, sizeof ut.ut_host); ID0login(&ut); - p->Utmp = ut.ut_time; + p->Utmp = 1; } } diff --git a/usr.sbin/ppp/physical.h b/usr.sbin/ppp/physical.h index ab0cdba81a2a..cf3408e783eb 100644 --- a/usr.sbin/ppp/physical.h +++ b/usr.sbin/ppp/physical.h @@ -97,7 +97,7 @@ struct physical { char *base; } name; - time_t Utmp; /* Are we in utmp ? */ + int Utmp; /* Are we in utmp ? */ pid_t session_owner; /* HUP this when closing the link */ struct device *handler; /* device specific handler */ diff --git a/usr.sbin/ppp/ppp.8.m4 b/usr.sbin/ppp/ppp.8.m4 index 666375950297..a711d58e4882 100644 --- a/usr.sbin/ppp/ppp.8.m4 +++ b/usr.sbin/ppp/ppp.8.m4 @@ -44,10 +44,10 @@ changecom(,)dnl This is a user process .Em PPP software package. -Normally, +Sometimes, .Em PPP is implemented as a part of the kernel (e.g., as managed by -.Xr pppd 8 ) +.Nm pppd ) and it is thus somewhat hard to debug and/or modify its behaviour. However, in this implementation .Em PPP @@ -2701,7 +2701,7 @@ program. Note: There is a problem negotiating .Ar deflate capabilities with -.Xr pppd 8 +.Nm pppd - a .Em PPP implementation available under many operating systems. @@ -2734,7 +2734,7 @@ Default: Disabled and Denied. This is a variance of the .Ar deflate option, allowing negotiation with the -.Xr pppd 8 +.Nm pppd program. Refer to the .Ar deflate @@ -2882,7 +2882,7 @@ acts as the authenticatee with both protocols the protocols are used alternately in response to challenges. .Pp Note: If only LANMan is enabled, -.Xr pppd 8 +.Nm pppd (version 2.3.5) misbehaves when acting as authenticatee. It provides both the NT and the LANMan answers, but also suggests that only the NT answer @@ -6091,7 +6091,6 @@ ifdef({LOCALRAD},{},{.Xr libradius 3 , .Xr named 8 , .Xr ping 8 , .Xr pppctl 8 , -.Xr pppd 8 , .Xr pppoed 8 , .Xr route 8 , .Xr sshd 8 , diff --git a/usr.sbin/pppctl/Makefile b/usr.sbin/pppctl/Makefile index 6cdcc3dc6cfb..2f2be4bb5035 100644 --- a/usr.sbin/pppctl/Makefile +++ b/usr.sbin/pppctl/Makefile @@ -3,6 +3,8 @@ PROG= pppctl MAN= pppctl.8 +WARNS?= 2 + DPADD= ${LIBPTHREAD} ${LIBEDIT} ${LIBTERMCAP} LDADD= -lpthread -ledit -ltermcap diff --git a/usr.sbin/praliases/Makefile b/usr.sbin/praliases/Makefile index 81fd4d1a11ac..120028d6997b 100644 --- a/usr.sbin/praliases/Makefile +++ b/usr.sbin/praliases/Makefile @@ -11,6 +11,8 @@ MAN= praliases.8 CFLAGS+= -I${SENDMAIL_DIR}/src -I${SENDMAIL_DIR}/include -I. CFLAGS+= -DNEWDB -DNOT_SENDMAIL +WARNS?= 2 + LIBSMDIR= ${.OBJDIR}/../../lib/libsm LIBSM= ${LIBSMDIR}/libsm.a diff --git a/usr.sbin/praudit/Makefile b/usr.sbin/praudit/Makefile index 4ff08fdfb164..6a61fd131e37 100644 --- a/usr.sbin/praudit/Makefile +++ b/usr.sbin/praudit/Makefile @@ -8,6 +8,8 @@ OPENBSMDIR=${.CURDIR}/../../contrib/openbsm PROG= praudit MAN= praudit.1 +WARNS?= 3 + DPADD= ${LIBBSM} LDADD= -lbsm diff --git a/usr.sbin/procctl/Makefile b/usr.sbin/procctl/Makefile index 5cb35e707371..880b93a13fe0 100644 --- a/usr.sbin/procctl/Makefile +++ b/usr.sbin/procctl/Makefile @@ -3,6 +3,4 @@ PROG= procctl MAN= procctl.8 -WARNS?= 2 - .include diff --git a/usr.sbin/pstat/Makefile b/usr.sbin/pstat/Makefile index 4620ddee19f3..414708cee055 100644 --- a/usr.sbin/pstat/Makefile +++ b/usr.sbin/pstat/Makefile @@ -6,8 +6,6 @@ LINKS= ${BINDIR}/pstat ${BINDIR}/swapinfo MAN= pstat.8 MLINKS= pstat.8 swapinfo.8 -WARNS?= 6 - DPADD= ${LIBKVM} ${LIBUTIL} LDADD= -lkvm -lutil diff --git a/usr.sbin/pw/Makefile b/usr.sbin/pw/Makefile index 8937124f22f4..ae0023c6a323 100644 --- a/usr.sbin/pw/Makefile +++ b/usr.sbin/pw/Makefile @@ -6,6 +6,8 @@ SRCS= pw.c pw_conf.c pw_user.c pw_group.c pw_log.c pw_nis.c pw_vpw.c \ grupd.c pwupd.c fileupd.c edgroup.c psdate.c \ bitmap.c cpdir.c rm_r.c +WARNS?= 1 + DPADD= ${LIBCRYPT} ${LIBUTIL} LDADD= -lcrypt -lutil diff --git a/usr.sbin/pw/pw_user.c b/usr.sbin/pw/pw_user.c index 4c62fe83c632..c8364cad51f4 100644 --- a/usr.sbin/pw/pw_user.c +++ b/usr.sbin/pw/pw_user.c @@ -41,16 +41,11 @@ static const char rcsid[] = #include #include #include -#include #include #include "pw.h" #include "bitmap.h" -#if (MAXLOGNAME-1) > UT_NAMESIZE -#define LOGNAMESIZE UT_NAMESIZE -#else #define LOGNAMESIZE (MAXLOGNAME-1) -#endif static char locked_str[] = "*LOCKED*"; diff --git a/usr.sbin/pwd_mkdb/Makefile b/usr.sbin/pwd_mkdb/Makefile index c3aaeb3398d8..7616629b2b09 100644 --- a/usr.sbin/pwd_mkdb/Makefile +++ b/usr.sbin/pwd_mkdb/Makefile @@ -7,7 +7,6 @@ PROG= pwd_mkdb MAN= pwd_mkdb.8 SRCS= pw_scan.c pwd_mkdb.c -WARNS?= 4 CFLAGS+= -I${.CURDIR}/../../lib/libc/gen # for pw_scan.h .include diff --git a/usr.sbin/quotaon/Makefile b/usr.sbin/quotaon/Makefile index 0a07f065194c..23ba8d1dc4c8 100644 --- a/usr.sbin/quotaon/Makefile +++ b/usr.sbin/quotaon/Makefile @@ -6,8 +6,6 @@ LINKS= ${BINDIR}/quotaon ${BINDIR}/quotaoff MAN= quotaon.8 MLINKS= quotaon.8 quotaoff.8 -WARNS?= 4 - DPADD= ${LIBUTIL} LDADD= -lutil diff --git a/usr.sbin/quotaon/quotaon.c b/usr.sbin/quotaon/quotaon.c index 0f8ef98f7cd8..d510e803c1f5 100644 --- a/usr.sbin/quotaon/quotaon.c +++ b/usr.sbin/quotaon/quotaon.c @@ -153,9 +153,7 @@ usage(void) } int -quotaonoff(fs, offmode, type) - struct fstab *fs; - int offmode, type; +quotaonoff(struct fstab *fs, int offmode, int type) { struct quotafile *qf; diff --git a/usr.sbin/repquota/Makefile b/usr.sbin/repquota/Makefile index 9da22c2fc0ff..ed8013285597 100644 --- a/usr.sbin/repquota/Makefile +++ b/usr.sbin/repquota/Makefile @@ -6,6 +6,4 @@ MAN= repquota.8 DPADD= ${LIBUTIL} LDADD= -lutil -WARNS?= 4 - .include diff --git a/usr.sbin/rip6query/Makefile b/usr.sbin/rip6query/Makefile index e0ea62130bcc..fac902821974 100644 --- a/usr.sbin/rip6query/Makefile +++ b/usr.sbin/rip6query/Makefile @@ -4,7 +4,6 @@ PROG= rip6query MAN= rip6query.8 -WARNS?= 2 CFLAGS+= -I${.CURDIR}/../route6d .include diff --git a/usr.sbin/rip6query/rip6query.c b/usr.sbin/rip6query/rip6query.c index 0bf56fdc9312..4426bbc1c21f 100644 --- a/usr.sbin/rip6query/rip6query.c +++ b/usr.sbin/rip6query/rip6query.c @@ -68,9 +68,7 @@ static const char *sa_n2a(struct sockaddr *); static const char *inet6_n2a(struct in6_addr *); int -main(argc, argv) - int argc; - char **argv; +main(int argc, char *argv[]) { struct netinfo6 *np; struct sockaddr_in6 fsock; @@ -175,15 +173,14 @@ main(argc, argv) } static void -usage() +usage(void) { fprintf(stderr, "usage: rip6query [-I iface] address\n"); } /* getnameinfo() is preferred as we may be able to show ifindex as ifname */ static const char * -sa_n2a(sa) - struct sockaddr *sa; +sa_n2a(struct sockaddr *sa) { static char buf[NI_MAXHOST]; @@ -195,8 +192,7 @@ sa_n2a(sa) } static const char * -inet6_n2a(addr) - struct in6_addr *addr; +inet6_n2a(struct in6_addr *addr) { static char buf[NI_MAXHOST]; diff --git a/usr.sbin/rmt/Makefile b/usr.sbin/rmt/Makefile index 579a02bb6689..8a678b6fa8b1 100644 --- a/usr.sbin/rmt/Makefile +++ b/usr.sbin/rmt/Makefile @@ -4,8 +4,6 @@ PROG= rmt MAN= rmt.8 -WARNS?= 4 - # called from /usr/src/etc/Makefile etc-rmt: rm -f ${DESTDIR}/etc/rmt diff --git a/usr.sbin/rmt/rmt.c b/usr.sbin/rmt/rmt.c index af4f954e07b9..f5e3cc14d013 100644 --- a/usr.sbin/rmt/rmt.c +++ b/usr.sbin/rmt/rmt.c @@ -206,8 +206,7 @@ ioerror: } void -getstring(bp) - char *bp; +getstring(char *bp) { int i; char *cp = bp; @@ -222,9 +221,7 @@ getstring(bp) } char * -checkbuf(rec, size) - char *rec; - int size; +checkbuf(char *rec, int size) { if (size <= maxrecsize) @@ -244,8 +241,7 @@ checkbuf(rec, size) } void -error(num) - int num; +error(int num) { DEBUG2("rmtd: E %d (%s)\n", num, strerror(num)); diff --git a/usr.sbin/rndc-confgen/Makefile b/usr.sbin/rndc-confgen/Makefile index b8a52dd4d57a..08f2d7ed98f7 100644 --- a/usr.sbin/rndc-confgen/Makefile +++ b/usr.sbin/rndc-confgen/Makefile @@ -17,6 +17,8 @@ SRCS+= rndc-confgen.c util.c CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR} +WARNS?= 3 + DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} diff --git a/usr.sbin/rndc/Makefile b/usr.sbin/rndc/Makefile index 2ca76976e5a9..9cd356f795f6 100644 --- a/usr.sbin/rndc/Makefile +++ b/usr.sbin/rndc/Makefile @@ -17,6 +17,8 @@ SRCS+= rndc.c util.c CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR} +WARNS?= 3 + DPADD+= ${BIND_DPADD} ${CRYPTO_DPADD} ${PTHREAD_DPADD} LDADD+= ${BIND_LDADD} ${CRYPTO_LDADD} ${PTHREAD_LDADD} diff --git a/usr.sbin/route6d/Makefile b/usr.sbin/route6d/Makefile index 308aad761337..df23d33aea57 100644 --- a/usr.sbin/route6d/Makefile +++ b/usr.sbin/route6d/Makefile @@ -6,4 +6,6 @@ MAN= route6d.8 CFLAGS+= -DHAVE_POLL_H +WARNS?= 1 + .include diff --git a/usr.sbin/rpc.lockd/Makefile b/usr.sbin/rpc.lockd/Makefile index 961ad17d4bf9..c81da8202798 100644 --- a/usr.sbin/rpc.lockd/Makefile +++ b/usr.sbin/rpc.lockd/Makefile @@ -7,7 +7,7 @@ MLINKS= rpc.lockd.8 lockd.8 SRCS= kern.c nlm_prot_svc.c lockd.c lock_proc.c lockd_lock.c CFLAGS+= -I. -I${DESTDIR}/usr/include/rpcsvc -#WARNS?= 2 +WARNS?= 0 DPADD= ${LIBRPCSVC} ${LIBUTIL} LDADD= -lrpcsvc -lutil diff --git a/usr.sbin/rpc.statd/Makefile b/usr.sbin/rpc.statd/Makefile index 6d8053c29bed..e69a9d6e2096 100644 --- a/usr.sbin/rpc.statd/Makefile +++ b/usr.sbin/rpc.statd/Makefile @@ -5,7 +5,7 @@ MAN= rpc.statd.8 SRCS= file.c sm_inter_svc.c sm_inter.h statd.c procs.c CFLAGS+= -I. -#WARNS?= 2 +WARNS?= 2 DPADD= ${LIBRPCSVC} LDADD= -lrpcsvc diff --git a/usr.sbin/rpc.umntall/Makefile b/usr.sbin/rpc.umntall/Makefile index 0a829c301cb5..fc4a3998c07c 100644 --- a/usr.sbin/rpc.umntall/Makefile +++ b/usr.sbin/rpc.umntall/Makefile @@ -5,6 +5,6 @@ PROG= rpc.umntall MAN= rpc.umntall.8 SRCS= rpc.umntall.c mounttab.c -#WARNS?= 2 +WARNS?= 3 .include diff --git a/usr.sbin/rpc.umntall/mounttab.c b/usr.sbin/rpc.umntall/mounttab.c index 9d7fe2f89edd..56333cae5908 100644 --- a/usr.sbin/rpc.umntall/mounttab.c +++ b/usr.sbin/rpc.umntall/mounttab.c @@ -45,14 +45,15 @@ __FBSDID("$FreeBSD$"); struct mtablist *mtabhead; -static void badline(char *field, char *bad); +static void badline(const char *field, const char *bad); /* * Add an entry to PATH_MOUNTTAB for each mounted NFS filesystem, * so the client can notify the NFS server even after reboot. */ int -add_mtab(char *hostp, char *dirp) { +add_mtab(char *hostp, char *dirp) +{ FILE *mtabfile; if ((mtabfile = fopen(PATH_MOUNTTAB, "a")) == NULL) @@ -69,12 +70,13 @@ add_mtab(char *hostp, char *dirp) { * Read mounttab line for line and return struct mtablist. */ int -read_mtab() { +read_mtab(void) +{ struct mtablist **mtabpp, *mtabp; char *hostp, *dirp, *cp; char str[STRSIZ]; char *timep, *endp; - time_t time; + time_t actiontime; u_long ultmp; FILE *mtabfile; @@ -86,7 +88,7 @@ read_mtab() { return (0); } } - time = 0; + actiontime = 0; mtabpp = &mtabhead; while (fgets(str, STRSIZ, mtabfile) != NULL) { cp = str; @@ -113,13 +115,13 @@ read_mtab() { badline("time", timep); continue; } - time = ultmp; + actiontime = ultmp; if ((mtabp = malloc(sizeof (struct mtablist))) == NULL) { syslog(LOG_ERR, "malloc"); fclose(mtabfile); return (0); } - mtabp->mtab_time = time; + mtabp->mtab_time = actiontime; memmove(mtabp->mtab_host, hostp, MNTNAMLEN); mtabp->mtab_host[MNTNAMLEN - 1] = '\0'; memmove(mtabp->mtab_dirp, dirp, MNTPATHLEN); @@ -137,7 +139,8 @@ read_mtab() { * Unlink PATH_MOUNTAB if no entry is left. */ int -write_mtab(int verbose) { +write_mtab(int verbose) +{ struct mtablist *mtabp, *mp; FILE *mtabfile; int line; @@ -180,7 +183,8 @@ write_mtab(int verbose) { * Mark the entries as clean where RPC calls have been done successfully. */ void -clean_mtab(char *hostp, char *dirp, int verbose) { +clean_mtab(char *hostp, char *dirp, int verbose) +{ struct mtablist *mtabp; char *host; @@ -205,7 +209,8 @@ clean_mtab(char *hostp, char *dirp, int verbose) { * Free struct mtablist mtab. */ void -free_mtab() { +free_mtab(void) +{ struct mtablist *mtabp; while ((mtabp = mtabhead) != NULL) { @@ -218,7 +223,8 @@ free_mtab() { * Print bad lines to syslog. */ static void -badline(char *field, char *bad) { +badline(const char *field, const char *bad) +{ syslog(LOG_ERR, "bad mounttab %s field '%s'", field, (bad == NULL) ? "" : bad); } diff --git a/usr.sbin/rpc.yppasswdd/Makefile b/usr.sbin/rpc.yppasswdd/Makefile index bbd2658bafdd..b6a0a8c8630a 100644 --- a/usr.sbin/rpc.yppasswdd/Makefile +++ b/usr.sbin/rpc.yppasswdd/Makefile @@ -14,7 +14,7 @@ SRCS= util.c yp_access.c yp_dblookup.c yp_dbwrite.c \ GENSRCS=yp.h yp_clnt.c yppasswd.h yppasswd_private.h yppasswd_private_svc.c \ yppasswd_private_xdr.c yppasswd_svc.c -WARNS?= 4 +WARNS?= 5 CFLAGS+= -fno-strict-aliasing CFLAGS+= -I${.CURDIR}/../../usr.sbin/vipw \ -I${.CURDIR}/../../usr.sbin/ypserv \ diff --git a/usr.sbin/rpc.ypupdated/Makefile b/usr.sbin/rpc.ypupdated/Makefile index 4fe19c9c9cab..fecb83760dd1 100644 --- a/usr.sbin/rpc.ypupdated/Makefile +++ b/usr.sbin/rpc.ypupdated/Makefile @@ -11,6 +11,8 @@ SRCS= ypupdate_prot_svc.c ypupdate_prot.h ypupdated_main.c \ #CFLAGS+= -DYP CFLAGS+= -I${.CURDIR}/../ypserv -I. -I${.CURDIR}/../../libexec/ypxfr +WARNS?= 1 + DPADD= ${LIBRPCSVC} LDADD= -lrpcsvc diff --git a/usr.sbin/rpc.ypxfrd/Makefile b/usr.sbin/rpc.ypxfrd/Makefile index 70729b12e67d..ee9e2425d1e9 100644 --- a/usr.sbin/rpc.ypxfrd/Makefile +++ b/usr.sbin/rpc.ypxfrd/Makefile @@ -9,6 +9,8 @@ SRCS= ypxfrd_svc.c ypxfrd.h ypxfrd_server.c yp_error.c \ CFLAGS+= -I. -DXFRBLOCKSIZE=65535 +WARNS?= 2 + DPADD= ${LIBRPCSVC} LDADD= -lrpcsvc diff --git a/usr.sbin/rpcbind/Makefile b/usr.sbin/rpcbind/Makefile index 3251378651a6..dd042f217a98 100644 --- a/usr.sbin/rpcbind/Makefile +++ b/usr.sbin/rpcbind/Makefile @@ -14,6 +14,8 @@ CFLAGS+= -DPORTMAP -DLIBWRAP CFLAGS+= -DINET6 .endif +WARNS?= 1 + DPADD= ${LIBWRAP} ${LIBUTIL} LDADD= -lwrap -lutil diff --git a/usr.sbin/rpcbind/rpcb_svc_com.c b/usr.sbin/rpcbind/rpcb_svc_com.c index ab7c8ffc90e8..79cb93751f54 100644 --- a/usr.sbin/rpcbind/rpcb_svc_com.c +++ b/usr.sbin/rpcbind/rpcb_svc_com.c @@ -1224,6 +1224,7 @@ handle_reply(int fd, SVCXPRT *xprt) goto done; do { + fromlen = sizeof(ss); inlen = recvfrom(fd, buffer, RPC_BUF_MAX, 0, (struct sockaddr *)&ss, &fromlen); } while (inlen < 0 && errno == EINTR); diff --git a/usr.sbin/rpcbind/rpcbind.c b/usr.sbin/rpcbind/rpcbind.c index b601da5b6f65..5a76a68f1f32 100644 --- a/usr.sbin/rpcbind/rpcbind.c +++ b/usr.sbin/rpcbind/rpcbind.c @@ -92,6 +92,7 @@ int oldstyle_local = 0; int verboselog = 0; char **hosts = NULL; +struct sockaddr **bound_sa; int ipv6_only = 0; int nhosts = 0; int on = 1; @@ -119,6 +120,7 @@ static void rbllist_add(rpcprog_t, rpcvers_t, struct netconfig *, struct netbuf *); static void terminate(int); static void parseargs(int, char *[]); +static void update_bound_sa(void); int main(int argc, char *argv[]) @@ -130,6 +132,8 @@ main(int argc, char *argv[]) parseargs(argc, argv); + update_bound_sa(); + /* Check that another rpcbind isn't already running. */ if ((rpcbindlockfd = (open(RPCBINDDLOCK, O_RDONLY|O_CREAT, 0444))) == -1) @@ -323,8 +327,7 @@ init_transport(struct netconfig *nconf) * If no hosts were specified, just bind to INADDR_ANY. * Otherwise make sure 127.0.0.1 is added to the list. */ - nhostsbak = nhosts; - nhostsbak++; + nhostsbak = nhosts + 1; hosts = realloc(hosts, nhostsbak * sizeof(char *)); if (nhostsbak == 1) hosts[0] = "*"; @@ -657,6 +660,75 @@ error: return (1); } +/* + * Create the list of addresses that we're bound to. Normally, this + * list is empty because we're listening on the wildcard address + * (nhost == 0). If -h is specified on the command line, then + * bound_sa will have a list of the addresses that the program binds + * to specifically. This function takes that list and converts them to + * struct sockaddr * and stores them in bound_sa. + */ +static void +update_bound_sa(void) +{ + struct addrinfo hints, *res = NULL; + int i; + + if (nhosts == 0) + return; + bound_sa = malloc(sizeof(*bound_sa) * nhosts); + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + for (i = 0; i < nhosts; i++) { + if (getaddrinfo(hosts[i], NULL, &hints, &res) != 0) + continue; + bound_sa[i] = malloc(res->ai_addrlen); + memcpy(bound_sa[i], res->ai_addr, res->ai_addrlen); + } +} + +/* + * Match the sa against the list of addresses we've bound to. If + * we've not specifically bound to anything, we match everything. + * Otherwise, if the IPv4 or IPv6 address matches one of the addresses + * in bound_sa, we return true. If not, we return false. + */ +int +listen_addr(const struct sockaddr *sa) +{ + int i; + + /* + * If nhosts == 0, then there were no -h options on the + * command line, so all addresses are addresses we're + * listening to. + */ + if (nhosts == 0) + return 1; + for (i = 0; i < nhosts; i++) { + if (bound_sa[i] == NULL || + sa->sa_family != bound_sa[i]->sa_family) + continue; + switch (sa->sa_family) { + case AF_INET: + if (memcmp(&SA2SINADDR(sa), &SA2SINADDR(bound_sa[i]), + sizeof(struct in_addr)) == 0) + return (1); + break; +#ifdef INET6 + case AF_INET6: + if (memcmp(&SA2SIN6ADDR(sa), &SA2SIN6ADDR(bound_sa[i]), + sizeof(struct in6_addr)) == 0) + return (1); + break; +#endif + default: + break; + } + } + return (0); +} + static void rbllist_add(rpcprog_t prog, rpcvers_t vers, struct netconfig *nconf, struct netbuf *addr) diff --git a/usr.sbin/rpcbind/rpcbind.h b/usr.sbin/rpcbind/rpcbind.h index 5537ce4f6a0e..717bb3bb11ea 100644 --- a/usr.sbin/rpcbind/rpcbind.h +++ b/usr.sbin/rpcbind/rpcbind.h @@ -134,6 +134,7 @@ void read_warmstart(void); char *addrmerge(struct netbuf *caller, char *serv_uaddr, char *clnt_uaddr, char *netid); +int listen_addr(const struct sockaddr *sa); void network_init(void); struct sockaddr *local_sa(int); @@ -141,4 +142,12 @@ struct sockaddr *local_sa(int); #define RPCB_ALLVERS 0 #define RPCB_ONEVERS 1 +/* To convert a struct sockaddr to IPv4 or IPv6 address */ +#define SA2SIN(sa) ((struct sockaddr_in *)(sa)) +#define SA2SINADDR(sa) (SA2SIN(sa)->sin_addr) +#ifdef INET6 +#define SA2SIN6(sa) ((struct sockaddr_in6 *)(sa)) +#define SA2SIN6ADDR(sa) (SA2SIN6(sa)->sin6_addr) +#endif + #endif /* rpcbind_h */ diff --git a/usr.sbin/rpcbind/util.c b/usr.sbin/rpcbind/util.c index 66797a70fa05..7a300d2c6423 100644 --- a/usr.sbin/rpcbind/util.c +++ b/usr.sbin/rpcbind/util.c @@ -18,13 +18,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -58,13 +51,6 @@ #include "rpcbind.h" -#define SA2SIN(sa) ((struct sockaddr_in *)(sa)) -#define SA2SINADDR(sa) (SA2SIN(sa)->sin_addr) -#ifdef INET6 -#define SA2SIN6(sa) ((struct sockaddr_in6 *)(sa)) -#define SA2SIN6ADDR(sa) (SA2SIN6(sa)->sin6_addr) -#endif - static struct sockaddr_in *local_in4; #ifdef INET6 static struct sockaddr_in6 *local_in6; @@ -176,9 +162,13 @@ addrmerge(struct netbuf *caller, char *serv_uaddr, char *clnt_uaddr, goto freeit; /* - * Loop through all interfaces. For each interface, see if the - * network portion of its address is equal to that of the client. - * If so, we have found the interface that we want to use. + * Loop through all interfaces. For each interface, see if it + * is either the loopback interface (which we always listen + * on) or is one of the addresses the program bound to (the + * wildcard by default, or a subset if -h is specified) and + * the network portion of its address is equal to that of the + * client. If so, we have found the interface that we want to + * use. */ bestif = NULL; for (ifap = ifp; ifap != NULL; ifap = ifap->ifa_next) { @@ -189,6 +179,9 @@ addrmerge(struct netbuf *caller, char *serv_uaddr, char *clnt_uaddr, !(ifap->ifa_flags & IFF_UP)) continue; + if (!(ifap->ifa_flags & IFF_LOOPBACK) && !listen_addr(ifsa)) + continue; + switch (hint_sa->sa_family) { case AF_INET: /* diff --git a/usr.sbin/rrenumd/Makefile b/usr.sbin/rrenumd/Makefile index c31a7c7ce932..091e52878c3a 100644 --- a/usr.sbin/rrenumd/Makefile +++ b/usr.sbin/rrenumd/Makefile @@ -21,6 +21,8 @@ SRCS= rrenumd.c parser.y lexer.l CFLAGS+= -DIPSEC -I. -I${.CURDIR} YFLAGS= -d +WARNS?= 2 + LDADD= -lipsec -ll -ly DPADD= ${LIBIPSEC} ${LIBL} ${LIBY} diff --git a/usr.sbin/rtadvd/Makefile b/usr.sbin/rtadvd/Makefile index f7e2021cd1fe..90b45f102d8d 100644 --- a/usr.sbin/rtadvd/Makefile +++ b/usr.sbin/rtadvd/Makefile @@ -20,4 +20,6 @@ SRCS= rtadvd.c rrenum.c advcap.c if.c config.c timer.c dump.c CFLAGS+= -DHAVE_ARC4RANDOM -DHAVE_POLL_H -DROUTEINFO +WARNS?= 1 + .include diff --git a/usr.sbin/rtprio/Makefile b/usr.sbin/rtprio/Makefile index ebc7bd1a37cc..b612f2bc974b 100644 --- a/usr.sbin/rtprio/Makefile +++ b/usr.sbin/rtprio/Makefile @@ -5,4 +5,6 @@ PROG= rtprio LINKS= ${BINDIR}/rtprio ${BINDIR}/idprio MLINKS= rtprio.1 idprio.1 +WARNS?= 2 + .include diff --git a/usr.sbin/rtsold/Makefile b/usr.sbin/rtsold/Makefile index 1afa0f6f4545..efc322c673be 100644 --- a/usr.sbin/rtsold/Makefile +++ b/usr.sbin/rtsold/Makefile @@ -19,8 +19,8 @@ MAN= rtsold.8 MLINKS= rtsold.8 rtsol.8 SRCS= rtsold.c rtsol.c if.c probe.c dump.c rtsock.c +WARNS?= 3 CFLAGS+= -DHAVE_ARC4RANDOM -DHAVE_POLL_H - DPADD= ${LIBKVM} LDADD= -lkvm diff --git a/usr.sbin/rtsold/dump.c b/usr.sbin/rtsold/dump.c index 62056aea86a1..2756b87eeb90 100644 --- a/usr.sbin/rtsold/dump.c +++ b/usr.sbin/rtsold/dump.c @@ -52,8 +52,8 @@ static FILE *fp; extern struct ifinfo *iflist; static void dump_interface_status(void); -static char *sec2str(time_t); -char *ifstatstr[] = {"IDLE", "DELAY", "PROBE", "DOWN", "TENTATIVE"}; +static const char *sec2str(time_t); +static const char * const ifstatstr[] = {"IDLE", "DELAY", "PROBE", "DOWN", "TENTATIVE"}; static void dump_interface_status(void) @@ -97,7 +97,7 @@ dump_interface_status(void) } void -rtsold_dump_file(char *dumpfile) +rtsold_dump_file(const char *dumpfile) { if ((fp = fopen(dumpfile, "w")) == NULL) { warnmsg(LOG_WARNING, __func__, "open a dump file(%s): %s", @@ -108,7 +108,7 @@ rtsold_dump_file(char *dumpfile) fclose(fp); } -static char * +static const char * sec2str(time_t total) { static char result[256]; diff --git a/usr.sbin/rtsold/if.c b/usr.sbin/rtsold/if.c index e8786ff0de11..c555d2a8644c 100644 --- a/usr.sbin/rtsold/if.c +++ b/usr.sbin/rtsold/if.c @@ -82,7 +82,6 @@ interface_up(char *name) struct in6_ndireq nd; int llflag; int s; - int error; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); diff --git a/usr.sbin/rtsold/probe.c b/usr.sbin/rtsold/probe.c index 61c47bc6a58d..6d0ea79fd392 100644 --- a/usr.sbin/rtsold/probe.c +++ b/usr.sbin/rtsold/probe.c @@ -118,7 +118,7 @@ defrouter_probe(struct ifinfo *ifinfo) goto closeandend; } - for (i = 0; dr.defrouter[i].if_index && i < PRLSTSIZ; i++) { + for (i = 0; i < DRLSTSIZ && dr.defrouter[i].if_index; i++) { if (ifindex && dr.defrouter[i].if_index == ifindex) { /* sanity check */ if (!IN6_IS_ADDR_LINKLOCAL(&dr.defrouter[i].rtaddr)) { diff --git a/usr.sbin/rtsold/rtsock.c b/usr.sbin/rtsold/rtsock.c index 0de6e8511a50..726c1e69790f 100644 --- a/usr.sbin/rtsold/rtsock.c +++ b/usr.sbin/rtsold/rtsock.c @@ -94,9 +94,9 @@ rtsock_input(int s) char *lim, *next; struct rt_msghdr *rtm; int idx; - size_t len; + ssize_t len; int ret = 0; - const size_t lenlim = + const ssize_t lenlim = offsetof(struct rt_msghdr, rtm_msglen) + sizeof(rtm->rtm_msglen); n = read(s, msg, sizeof(msg)); @@ -135,7 +135,7 @@ rtsock_input(int s) #ifdef RTM_IFANNOUNCE /*NetBSD 1.5 or later*/ static int -rtsock_input_ifannounce(int s, struct rt_msghdr *rtm, char *lim) +rtsock_input_ifannounce(int s __unused, struct rt_msghdr *rtm, char *lim) { struct if_announcemsghdr *ifan; struct ifinfo *ifinfo; diff --git a/usr.sbin/rtsold/rtsol.c b/usr.sbin/rtsold/rtsol.c index 3420f2f0fed6..be2a9b8c1777 100644 --- a/usr.sbin/rtsold/rtsol.c +++ b/usr.sbin/rtsold/rtsol.c @@ -72,8 +72,10 @@ static int rcvcmsglen; int rssock; -static struct sockaddr_in6 sin6_allrouters = -{sizeof(sin6_allrouters), AF_INET6}; +static struct sockaddr_in6 sin6_allrouters = { + .sin6_len = sizeof(sin6_allrouters), + .sin6_family = AF_INET6, +}; static void call_script(char *, char *); static int safefile(const char *); @@ -183,7 +185,7 @@ sendpacket(struct ifinfo *ifinfo) struct in6_pktinfo *pi; struct cmsghdr *cm; int hoplimit = 255; - int i; + ssize_t i; struct sockaddr_in6 dst; dst = sin6_allrouters; @@ -213,7 +215,7 @@ sendpacket(struct ifinfo *ifinfo) "send RS on %s, whose state is %d", ifinfo->ifname, ifinfo->state); i = sendmsg(rssock, &sndmhdr, 0); - if (i < 0 || i != ifinfo->rs_datalen) { + if (i < 0 || (size_t)i != ifinfo->rs_datalen) { /* * ENETDOWN is not so serious, especially when using several * network cards on a mobile node. We ignore it. @@ -231,7 +233,8 @@ void rtsol_input(int s) { u_char ntopbuf[INET6_ADDRSTRLEN], ifnamebuf[IFNAMSIZ]; - int ifindex = 0, i, *hlimp = NULL; + int ifindex = 0, *hlimp = NULL; + ssize_t i; struct in6_pktinfo *pi = NULL; struct ifinfo *ifi = NULL; struct icmp6_hdr *icp; @@ -272,9 +275,9 @@ rtsol_input(int s) return; } - if (i < sizeof(struct nd_router_advert)) { + if ((size_t)i < sizeof(struct nd_router_advert)) { warnmsg(LOG_INFO, __func__, - "packet size(%d) is too short", i); + "packet size(%zd) is too short", i); return; } diff --git a/usr.sbin/rtsold/rtsold.c b/usr.sbin/rtsold/rtsold.c index 93fb1ebe2420..0db050cc0e98 100644 --- a/usr.sbin/rtsold/rtsold.c +++ b/usr.sbin/rtsold/rtsold.c @@ -32,15 +32,20 @@ */ #include +#include #include #include #include #include #include +#include #include #include +#include + +#include #include #include @@ -86,10 +91,10 @@ int main(int, char **); static int mobile_node = 0; #ifndef SMALL static int do_dump; -static char *dumpfilename = "/var/run/rtsold.dump"; /* XXX: should be configurable */ +static const char *dumpfilename = "/var/run/rtsold.dump"; /* XXX: should be configurable */ #endif #if 1 -static char *pidfilename = "/var/run/rtsold.pid"; /* should be configurable */ +static const char *pidfilename = "/var/run/rtsold.pid"; /* should be configurable */ #endif #if 0 @@ -108,7 +113,8 @@ main(int argc, char **argv) { int s, ch, once = 0; struct timeval *timeout; - char *argv0, *opts; + char *argv0; + const char *opts; #ifdef HAVE_POLL_H struct pollfd set[2]; #else @@ -729,7 +735,7 @@ rtsol_timer_update(struct ifinfo *ifinfo) #ifndef SMALL static void -rtsold_set_dump_file(int sig) +rtsold_set_dump_file(int sig __unused) { do_dump = 1; } @@ -785,8 +791,9 @@ autoifprobe(void) static char **argv = NULL; static int n = 0; char **a; - int i, found; + int s = 0, i, found; struct ifaddrs *ifap, *ifa, *target; + struct in6_ndireq nd; /* initialize */ while (n--) @@ -800,6 +807,11 @@ autoifprobe(void) if (getifaddrs(&ifap) != 0) return NULL; + if (!Fflag && (s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) { + err(1, "socket"); + /* NOTREACHED */ + } + target = NULL; /* find an ethernet */ for (ifa = ifap; ifa; ifa = ifa->ifa_next) { @@ -825,6 +837,23 @@ autoifprobe(void) if (found) continue; + /* + * Skip the interfaces which IPv6 and/or accepting RA + * is disabled. + */ + if (!Fflag) { + memset(&nd, 0, sizeof(nd)); + strlcpy(nd.ifname, ifa->ifa_name, sizeof(nd.ifname)); + if (ioctl(s, SIOCGIFINFO_IN6, (caddr_t)&nd) < 0) { + err(1, "ioctl(SIOCGIFINFO_IN6)"); + /* NOTREACHED */ + } + if ((nd.ndi.flags & ND6_IFF_IFDISABLED)) + continue; + if (!(nd.ndi.flags & ND6_IFF_ACCEPT_RTADV)) + continue; + } + /* if we find multiple candidates, just warn. */ if (n != 0 && dflag > 1) warnx("multiple interfaces found"); @@ -837,7 +866,6 @@ autoifprobe(void) if (!argv[n]) err(1, "malloc"); n++; - argv[n] = NULL; } if (n) { @@ -852,6 +880,8 @@ autoifprobe(void) warnx("probing %s", argv[i]); } } + if (!Fflag) + close(s); freeifaddrs(ifap); return argv; } diff --git a/usr.sbin/rtsold/rtsold.h b/usr.sbin/rtsold/rtsold.h index 8a3cfa6612f3..8aef4902a1f1 100644 --- a/usr.sbin/rtsold/rtsold.h +++ b/usr.sbin/rtsold/rtsold.h @@ -97,7 +97,7 @@ extern int probe_init(void); extern void defrouter_probe(struct ifinfo *); /* dump.c */ -extern void rtsold_dump_file(char *); +extern void rtsold_dump_file(const char *); /* rtsock.c */ extern int rtsock_open(void); diff --git a/usr.sbin/rwhod/Makefile b/usr.sbin/rwhod/Makefile index def0e6e14591..f1b5d997597c 100644 --- a/usr.sbin/rwhod/Makefile +++ b/usr.sbin/rwhod/Makefile @@ -4,7 +4,6 @@ PROG= rwhod MAN= rwhod.8 -# XXX breaks on Alpha due to alignment constraints -#WARNS?= 4 +WARNS?= 3 .include diff --git a/usr.sbin/rwhod/rwhod.8 b/usr.sbin/rwhod/rwhod.8 index 642eeebcee08..59fb4adf65a2 100644 --- a/usr.sbin/rwhod/rwhod.8 +++ b/usr.sbin/rwhod/rwhod.8 @@ -188,9 +188,8 @@ system call, with any trailing domain name omitted. The array at the end of the message contains information about the users logged in to the sending machine. This information -includes the contents of the -.Xr utmp 5 -entry for each non-idle terminal line and a value indicating the +includes the contents of the entry from the user accounting database +for each non-idle terminal line and a value indicating the time in seconds since a character was last received on the terminal line. .Pp Messages received by the diff --git a/usr.sbin/rwhod/rwhod.c b/usr.sbin/rwhod/rwhod.c index 96fd9ec42e58..6b638439a5c5 100644 --- a/usr.sbin/rwhod/rwhod.c +++ b/usr.sbin/rwhod/rwhod.c @@ -68,7 +68,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include @@ -146,7 +146,7 @@ struct neighbor { struct neighbor *neighbors; struct whod mywd; struct servent *sp; -int s, utmpf; +int s; #define WHDRSIZE (int)(sizeof(mywd) - sizeof(mywd.wd_we)) @@ -231,11 +231,6 @@ main(int argc, char *argv[]) *cp = '\0'; strncpy(mywd.wd_hostname, myname, sizeof(mywd.wd_hostname) - 1); mywd.wd_hostname[sizeof(mywd.wd_hostname) - 1] = '\0'; - utmpf = open(_PATH_UTMP, O_RDONLY|O_CREAT, 0644); - if (utmpf < 0) { - syslog(LOG_ERR, "%s: %m", _PATH_UTMP); - exit(1); - } getboottime(0); if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { syslog(LOG_ERR, "socket: %m"); @@ -383,73 +378,43 @@ verify(name, maxlen) return (size > 0); } -int utmptime; -int utmpent; -int utmpsize = 0; -struct utmp *utmp; -int alarmcount; - void -onalrm(signo) - int signo __unused; +onalrm(int signo __unused) { - register struct neighbor *np; - register struct whoent *we = mywd.wd_we, *wlast; - register int i; + struct neighbor *np; + struct whoent *we = mywd.wd_we, *wend; struct stat stb; + struct utmpx *ut; + static int alarmcount = 0; double avenrun[3]; time_t now; - int cc; + int i, cc; now = time(NULL); if (alarmcount % 10 == 0) getboottime(0); alarmcount++; - (void) fstat(utmpf, &stb); - if ((stb.st_mtime != utmptime) || (stb.st_size > utmpsize)) { - utmptime = stb.st_mtime; - if (stb.st_size > utmpsize) { - utmpsize = stb.st_size + 10 * sizeof(struct utmp); - utmp = (struct utmp *)reallocf(utmp, utmpsize); - if (utmp == NULL) { - syslog(LOG_WARNING, "malloc failed"); - utmpsize = 0; - goto done; - } - } - (void) lseek(utmpf, (off_t)0, L_SET); - cc = read(utmpf, (char *)utmp, stb.st_size); - if (cc < 0) { - syslog(LOG_ERR, "read(%s): %m", _PATH_UTMP); - goto done; - } - wlast = &mywd.wd_we[1024 / sizeof(struct whoent) - 1]; - utmpent = cc / sizeof(struct utmp); - for (i = 0; i < utmpent; i++) - if (utmp[i].ut_name[0]) { - memcpy(we->we_utmp.out_line, utmp[i].ut_line, - sizeof(utmp[i].ut_line)); - memcpy(we->we_utmp.out_name, utmp[i].ut_name, - sizeof(utmp[i].ut_name)); - we->we_utmp.out_time = htonl(utmp[i].ut_time); - if (we >= wlast) - break; - we++; - } - utmpent = we - mywd.wd_we; + wend = &mywd.wd_we[1024 / sizeof(struct whoent)]; + setutxent(); + while ((ut = getutxent()) != NULL && we < wend) { + if (ut->ut_type != USER_PROCESS) + continue; + strncpy(we->we_utmp.out_line, ut->ut_line, + sizeof(we->we_utmp.out_line)); + strncpy(we->we_utmp.out_name, ut->ut_user, + sizeof(we->we_utmp.out_name)); + we->we_utmp.out_time = + htonl(_time_to_time32(ut->ut_tv.tv_sec)); + we++; } + endutxent(); - /* - * The test on utmpent looks silly---after all, if no one is - * logged on, why worry about efficiency?---but is useful on - * (e.g.) compute servers. - */ - if (utmpent && chdir(_PATH_DEV)) { + if (chdir(_PATH_DEV)) { syslog(LOG_ERR, "chdir(%s): %m", _PATH_DEV); exit(1); } - we = mywd.wd_we; - for (i = 0; i < utmpent; i++) { + wend = we; + for (we = mywd.wd_we; we < wend; we++) { if (stat(we->we_utmp.out_line, &stb) >= 0) we->we_idle = htonl(now - stb.st_atime); we++; @@ -457,7 +422,7 @@ onalrm(signo) (void)getloadavg(avenrun, sizeof(avenrun)/sizeof(avenrun[0])); for (i = 0; i < 3; i++) mywd.wd_loadav[i] = htonl((u_long)(avenrun[i] * 100)); - cc = (char *)we - (char *)&mywd; + cc = (char *)wend - (char *)&mywd; mywd.wd_sendtime = htonl(_time_to_time32(time(NULL))); mywd.wd_vers = WHODVERSION; mywd.wd_type = WHODTYPE_STATUS; @@ -485,11 +450,10 @@ onalrm(signo) } else (void) sendto(s, (char *)&mywd, cc, 0, np->n_addr, np->n_addrlen); } - if (utmpent && chdir(_PATH_RWHODIR)) { + if (chdir(_PATH_RWHODIR)) { syslog(LOG_ERR, "chdir(%s): %m", _PATH_RWHODIR); exit(1); } -done: (void) alarm(AL_INTERVAL); } diff --git a/usr.sbin/sa/Makefile b/usr.sbin/sa/Makefile index 718cbc846efe..0adf1f85e1fb 100644 --- a/usr.sbin/sa/Makefile +++ b/usr.sbin/sa/Makefile @@ -6,6 +6,4 @@ PROG= sa MAN= sa.8 SRCS= main.c db.c pdb.c usrdb.c readrec.c -WARNS?= 6 - .include diff --git a/usr.sbin/sa/main.c b/usr.sbin/sa/main.c index 7be13e549915..64736ac340cf 100644 --- a/usr.sbin/sa/main.c +++ b/usr.sbin/sa/main.c @@ -300,7 +300,7 @@ main(int argc, char **argv) } static void -usage() +usage(void) { (void)fprintf(stderr, "usage: sa [-abcdDfijkKlmnqrstu] [-P file] [-U file] [-v cutoff] [file ...]\n"); diff --git a/usr.sbin/sa/pdb.c b/usr.sbin/sa/pdb.c index 38beb558f705..e5e35f5db834 100644 --- a/usr.sbin/sa/pdb.c +++ b/usr.sbin/sa/pdb.c @@ -94,14 +94,14 @@ v1_to_v2(DBT *key __unused, DBT *data) /* Copy pdb_file to in-memory pacct_db. */ int -pacct_init() +pacct_init(void) { return (db_copy_in(&pacct_db, pdb_file, "process accounting", NULL, v1_to_v2)); } void -pacct_destroy() +pacct_destroy(void) { db_destroy(pacct_db, "process accounting"); } @@ -150,14 +150,14 @@ pacct_add(const struct cmdinfo *ci) /* Copy in-memory pacct_db to pdb_file. */ int -pacct_update() +pacct_update(void) { return (db_copy_out(pacct_db, pdb_file, "process accounting", NULL)); } void -pacct_print() +pacct_print(void) { BTREEINFO bti; DBT key, data, ndata; diff --git a/usr.sbin/sa/usrdb.c b/usr.sbin/sa/usrdb.c index 07a5033c398a..50778ef50470 100644 --- a/usr.sbin/sa/usrdb.c +++ b/usr.sbin/sa/usrdb.c @@ -97,7 +97,7 @@ v1_to_v2(DBT *key, DBT *data) /* Copy usrdb_file to in-memory usracct_db. */ int -usracct_init() +usracct_init(void) { BTREEINFO bti; @@ -109,7 +109,7 @@ usracct_init() } void -usracct_destroy() +usracct_destroy(void) { db_destroy(usracct_db, "user accounting"); } @@ -166,7 +166,7 @@ usracct_add(const struct cmdinfo *ci) /* Copy in-memory usracct_db to usrdb_file. */ int -usracct_update() +usracct_update(void) { BTREEINFO bti; @@ -178,7 +178,7 @@ usracct_update() } void -usracct_print() +usracct_print(void) { DBT key, data; struct userinfo uistore, *ui = &uistore; diff --git a/usr.sbin/sade/termcap.c b/usr.sbin/sade/termcap.c index 3e80a415bbb0..1c2f39be5447 100644 --- a/usr.sbin/sade/termcap.c +++ b/usr.sbin/sade/termcap.c @@ -83,13 +83,13 @@ set_termcap(void) #else if (ColorDisplay) { if (!term) { - if (setenv("TERM", "cons25", 1) < 0) + if (setenv("TERM", "xterm", 1) < 0) return -1; } } else { if (!term) { - if (setenv("TERM", "cons25-m", 1) < 0) + if (setenv("TERM", "vt100", 1) < 0) return -1; } } diff --git a/usr.sbin/sendmail/Makefile b/usr.sbin/sendmail/Makefile index 0b89297d8d9c..a9f7fbbafd69 100644 --- a/usr.sbin/sendmail/Makefile +++ b/usr.sbin/sendmail/Makefile @@ -43,6 +43,8 @@ CFLAGS+= ${DBMDEF} ${NIS} -DTCPWRAPPERS ${MAPS} CFLAGS+= -DNETINET6 .endif +WARNS?= 1 + DPADD= ${LIBUTIL} ${LIBWRAP} LDADD= -lutil -lwrap diff --git a/usr.sbin/service/Makefile b/usr.sbin/service/Makefile new file mode 100644 index 000000000000..a03714dc6f91 --- /dev/null +++ b/usr.sbin/service/Makefile @@ -0,0 +1,7 @@ +# $FreeBSD$ + +SCRIPTS=service.sh +MAN= service.8 + +.include + diff --git a/usr.sbin/service/service.8 b/usr.sbin/service/service.8 new file mode 100644 index 000000000000..a7f31353f4fe --- /dev/null +++ b/usr.sbin/service/service.8 @@ -0,0 +1,131 @@ +.\" Copyright (c) 2009 Douglas Barton +.\" 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$ +.\" +.Dd December 26, 2009 +.Dt service 8 +.Os +.Sh NAME +.Nm service +.Nd "control (start/stop/etc.) or list system services" +.Sh SYNOPSIS +.Nm +.Fl e +.Nm +.Op Fl v +.Fl l | r +.Nm +.Op Fl v +.Ar start|stop|etc. +.Sh DESCRIPTION +The +.Nm +command is an easy interface to the rc.d system. +Its primary purpose is to start and stop services provided +by the rc.d scripts. +When used for this purpose it will set the same restricted +environment that is in use at boot time (see below). +It can also be used to list +the scripts using various criteria. +.Pp +The options are as follows: +.Bl -tag -width F1 +.It Fl e +List services that are enabled. +The list of scripts to check is compiled using +.Xr rcorder 8 +the same way that it is done in +.Xr rc 8 , +then that list of scripts is checked for an +.Qq rcvar +assignment. +If present the script is checked to see if it is enabled. +.It Fl l +List all files in +.Pa /etc/rc.d +and the local startup directories. +As described in +.Xr rc.conf 5 +this is usually +.Pa /usr/local/etc/rc.d . +All files will be listed whether they are an actual +rc.d script or not. +.It Fl r +Generate the +.Xr rcorder 8 +as in +.Fl e +above, but list all of the files, not just what is enabled. +.It Fl v +Be slightly more verbose +.El +.Sh ENVIRONMENT +When used to run rc.d scripts the +.Nm +command sets +.Ev HOME +to +.Pa / +and +.Ev PATH +to +.Pa /sbin:/bin:/usr/sbin:/usr/bin +which is how they are set in +.Pa /etc/rc +at boot time. +.Sh EXIT STATUS +.Ex -std +.Sh EXAMPLES +The following are examples of typical usage of the +.Nm +command: +.Pp +.Dl "service named status" +.Dl "service -rv" +.Pp +The following programmable completion entry can be use in +.Xr bash 1 +for the names of the rc.d scripts: +.Dl "_service () {" +.Dl " local cur" +.Dl " cur=${COMP_WORDS[COMP_CWORD]}" +.Dl " COMPREPLY=( $( compgen -W '$( service -l )' -- $cur ) )" +.Dl " return 0" +.Dl "}" +.Dl "complete -F _service service" +.Sh SEE ALSO +.Xr bash 1 Pq Pa ports/shells/bash , +.Xr rc.conf 5 , +.Xr rc 8 , +.Xr rcorder 8 +.Sh HISTORY +The +.Nm +manual page service first appeared in +.Fx 7.3 . +.Sh AUTHORS +This +manual page was written by +.An Douglas Barton . diff --git a/usr.sbin/service/service.sh b/usr.sbin/service/service.sh new file mode 100755 index 000000000000..1794315fb73c --- /dev/null +++ b/usr.sbin/service/service.sh @@ -0,0 +1,120 @@ +#!/bin/sh + +# $FreeBSD$ + +# Copyright (c) 2009 Douglas Barton +# 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. + +. /etc/rc.subr +load_rc_config 'XXX' + +usage () { + echo '' + echo 'Usage:' + echo "${0##*/} -e" + echo "${0##*/} [-v] -l | -r" + echo "${0##*/} [-v] start|stop|etc." + echo "${0##*/} -h" + echo '' + echo '-e Show services that are enabled' + echo "-l List all scripts in /etc/rc.d and $local_startup" + echo '-r Show the results of boot time rcorder' + echo '-v Verbose' + echo '' +} + +while getopts 'ehlrv' COMMAND_LINE_ARGUMENT ; do + case "${COMMAND_LINE_ARGUMENT}" in + e) ENABLED=eopt ;; + h) usage ; exit 0 ;; + l) LIST=lopt ;; + r) RCORDER=ropt ;; + v) VERBOSE=vopt ;; + *) usage ; exit 1 ;; + esac +done +shift $(( $OPTIND - 1 )) + +if [ -n "$ENABLED" -o -n "$RCORDER" ]; then + # Copied from /etc/rc + skip="-s nostart" + if [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ]; then + skip="$skip -s nojail" + fi + [ -n "$local_startup" ] && find_local_scripts_new + files=`rcorder ${skip} /etc/rc.d/* ${local_rc} 2>/dev/null` +fi + +if [ -n "$ENABLED" ]; then + for file in $files; do + if grep -q ^rcvar $file; then + eval `grep ^name= $file` + eval `grep ^rcvar $file` + checkyesno $rcvar 2>/dev/null && echo $file + fi + done + exit 0 +fi + +if [ -n "$LIST" ]; then + for dir in /etc/rc.d $local_startup; do + [ -n "$VERBOSE" ] && echo "From ${dir}:" + cd $dir && for file in *; do echo $file; done + done + exit 0 +fi + +if [ -n "$RCORDER" ]; then + for file in $files; do + echo $file + if [ -n "$VERBOSE" ]; then + case "$file" in + */${early_late_divider}) + echo '========= Early/Late Divider =========' ;; + esac + fi + done + exit 0 +fi + +if [ $# -gt 1 ]; then + script=$1 + shift +else + usage + exit 1 +fi + +cd / +for dir in /etc/rc.d $local_startup; do + if [ -x "$dir/$script" ]; then + [ -n "$VERBOSE" ] && echo "$script is located in $dir" + exec env -i HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin $dir/$script $* + fi +done + +# If the script was not found +echo "$script does not exist in /etc/rc.d or the local startup" +echo "directories (${local_startup})" +exit 1 diff --git a/usr.sbin/setfmac/Makefile b/usr.sbin/setfmac/Makefile index 34b979bdf138..bcbd85fe275e 100644 --- a/usr.sbin/setfmac/Makefile +++ b/usr.sbin/setfmac/Makefile @@ -4,6 +4,4 @@ PROG= setfmac LINKS= ${BINDIR}/setfmac ${BINDIR}/setfsmac MAN= setfmac.8 setfsmac.8 -WARNS?= 6 - .include diff --git a/usr.sbin/setpmac/Makefile b/usr.sbin/setpmac/Makefile index ae7ee026e9fd..a8bc1acca26b 100644 --- a/usr.sbin/setpmac/Makefile +++ b/usr.sbin/setpmac/Makefile @@ -3,6 +3,4 @@ PROG= setpmac MAN= setpmac.8 -WARNS?= 6 - .include diff --git a/usr.sbin/smbmsg/Makefile b/usr.sbin/smbmsg/Makefile index a581b2cd35d2..2ae640442808 100644 --- a/usr.sbin/smbmsg/Makefile +++ b/usr.sbin/smbmsg/Makefile @@ -3,6 +3,5 @@ PROG= smbmsg MAN= smbmsg.8 -WARNS= 6 .include diff --git a/usr.sbin/smbmsg/smbmsg.8 b/usr.sbin/smbmsg/smbmsg.8 index efc74518c9d3..2b8397923072 100644 --- a/usr.sbin/smbmsg/smbmsg.8 +++ b/usr.sbin/smbmsg/smbmsg.8 @@ -273,7 +273,7 @@ Diagnostic messages issued are supposed to be self-explanatory. .Xr smbus 4 .Rs .%T "The SMBus specification" -.%O http://www.smbus.org/specs/ +.%U http://www.smbus.org/specs/ .Re .Sh HISTORY The diff --git a/usr.sbin/snapinfo/snapinfo.c b/usr.sbin/snapinfo/snapinfo.c index 55b54a546b26..3ee66da9317a 100644 --- a/usr.sbin/snapinfo/snapinfo.c +++ b/usr.sbin/snapinfo/snapinfo.c @@ -140,7 +140,7 @@ find_snapshot(struct statfs *sfs) int compare_function(const char *path, const struct stat *st, int flags, -struct FTW * ftwv) + struct FTW * ftwv __unused) { if (flags == FTW_F && st->st_ino == inode) { diff --git a/usr.sbin/sysinstall/Makefile b/usr.sbin/sysinstall/Makefile index 3f2b75848373..bd08ac1dbe45 100644 --- a/usr.sbin/sysinstall/Makefile +++ b/usr.sbin/sysinstall/Makefile @@ -20,40 +20,11 @@ CFLAGS+= -DPC98 .endif CFLAGS+= -I${.CURDIR}/../../gnu/lib/libdialog -I. +WARNS?= 1 + DPADD= ${LIBDIALOG} ${LIBNCURSES} ${LIBUTIL} ${LIBDISK} ${LIBFTPIO} LDADD= -ldialog -lncurses -lutil -ldisk -lftpio -# -# When distributions have both UP and SMP kernels sysinstall -# will probe for the number of cpus on the target machine and -# automatically select which is appropriate. This can be overridden -# through the menus or both kernels can be installed (with the -# most "appropriate" one setup as /boot/kernel). For now this -# is done for i386 and amd64; for other systems support must be -# added to identify the cpu count if acpi and MPTable probing -# is insufficient. -# -# The unmber of cpus probed is passed through the environment in -# VAR_NCPUS ("ncpus") to scripts. -# -# Note that WITH_SMP is a compile time option that enables the -# builtin menus for the SMP kernel configuration. If this kernel -# is not built (see release/Makefile) then this should not be -# enabled as sysinstall may try to select an SMP kernel config -# where none is available. This option should not be needed--we -# should probe for an SMP kernel in the distribution but doing -# that is painful because of media changes and the structure of -# sysinstall so for now it's a priori. -# -.if ${MACHINE} == "i386" || ${MACHINE_ARCH} == "amd64" -SRCS+= acpi.c biosmptable.c -.if exists(${.CURDIR}/../../sys/${MACHINE}/conf/SMP) -CFLAGS+=-DWITH_SMP -.endif -DPADD+= ${LIBDEVINFO} -LDADD+= -ldevinfo -.endif - CLEANFILES= makedevs.c rtermcap CLEANFILES+= keymap.tmp keymap.h countries.tmp countries.h diff --git a/usr.sbin/sysinstall/acpi.c b/usr.sbin/sysinstall/acpi.c deleted file mode 100644 index 4a375a1c0b8c..000000000000 --- a/usr.sbin/sysinstall/acpi.c +++ /dev/null @@ -1,356 +0,0 @@ -/*- - * Copyright (c) 1998 Doug Rabson - * Copyright (c) 2000 Mitsuru IWASAKI - * 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. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "acpidump.h" -#include "sysinstall.h" - -static void acpi_handle_apic(struct ACPIsdt *sdp); -static struct ACPIsdt *acpi_map_sdt(vm_offset_t pa); -static void acpi_handle_rsdt(struct ACPIsdt *rsdp); -static struct acpi_user_mapping *acpi_user_find_mapping(vm_offset_t, size_t); -static void * acpi_map_physical(vm_offset_t, size_t); - -/* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */ -static int addr_size; - -static int ncpu; - -static void -acpi_handle_apic(struct ACPIsdt *sdp) -{ - struct MADTbody *madtp; - struct MADT_APIC *mp; - struct MADT_local_apic *apic; - struct MADT_local_sapic *sapic; - - madtp = (struct MADTbody *) sdp->body; - mp = (struct MADT_APIC *)madtp->body; - while (((uintptr_t)mp) - ((uintptr_t)sdp) < sdp->len) { - switch (mp->type) { - case ACPI_MADT_APIC_TYPE_LOCAL_APIC: - apic = &mp->body.local_apic; - msgDebug("MADT: Found CPU APIC ID %d %s\n", - apic->cpu_id, - apic->flags & ACPI_MADT_APIC_LOCAL_FLAG_ENABLED ? - "enabled" : "disabled"); - if (apic->flags & ACPI_MADT_APIC_LOCAL_FLAG_ENABLED) - ncpu++; - break; - case ACPI_MADT_APIC_TYPE_LOCAL_SAPIC: - sapic = &mp->body.local_sapic; - msgDebug("MADT: Found CPU SAPIC ID %d %s\n", - sapic->cpu_id, - sapic->flags & ACPI_MADT_APIC_LOCAL_FLAG_ENABLED ? - "enabled" : "disabled"); - /* XXX is enable flag the same? */ - if (sapic->flags & ACPI_MADT_APIC_LOCAL_FLAG_ENABLED) - ncpu++; - break; - default: - break; - } - mp = (struct MADT_APIC *) ((char *)mp + mp->len); - } -} - -static int -acpi_checksum(void *p, size_t length) -{ - u_int8_t *bp; - u_int8_t sum; - - bp = p; - sum = 0; - while (length--) - sum += *bp++; - - return (sum); -} - -static struct ACPIsdt * -acpi_map_sdt(vm_offset_t pa) -{ - struct ACPIsdt *sp; - - sp = acpi_map_physical(pa, sizeof(struct ACPIsdt)); - if (sp != NULL) - sp = acpi_map_physical(pa, sp->len); - return (sp); -} - -static void -acpi_handle_rsdt(struct ACPIsdt *rsdp) -{ - struct ACPIsdt *sdp; - vm_offset_t addr; - int entries, i; - - entries = (rsdp->len - SIZEOF_SDT_HDR) / addr_size; - for (i = 0; i < entries; i++) { - switch (addr_size) { - case 4: - addr = le32dec((char*)rsdp->body + i * addr_size); - break; - case 8: - addr = le64dec((char*)rsdp->body + i * addr_size); - break; - default: - assert((addr = 0)); - } - - sdp = (struct ACPIsdt *)acpi_map_sdt(addr); - if (sdp == NULL) { - msgDebug("%s: unable to map sdt\n", __func__); - continue; - } - if (acpi_checksum(sdp, sdp->len)) { -#if 0 - msgDebug("RSDT entry %d (sig %.4s) has bad checksum\n", - i, sdp->signature); -#endif - continue; - } - if (!memcmp(sdp->signature, "APIC", 4)) - acpi_handle_apic(sdp); - } -} - -static char machdep_acpi_root[] = "machdep.acpi_root"; -static int acpi_mem_fd = -1; - -struct acpi_user_mapping { - LIST_ENTRY(acpi_user_mapping) link; - vm_offset_t pa; - caddr_t va; - size_t size; -}; - -LIST_HEAD(acpi_user_mapping_list, acpi_user_mapping) maplist; - -static int -acpi_user_init(void) -{ - - if (acpi_mem_fd == -1) { - acpi_mem_fd = open(_PATH_MEM, O_RDONLY); - if (acpi_mem_fd == -1) { - msgDebug("%s: error opening %s: %s\n", __func__, - _PATH_MEM, strerror(errno)); - return 0; - } - LIST_INIT(&maplist); - } - return 1; -} - -static struct acpi_user_mapping * -acpi_user_find_mapping(vm_offset_t pa, size_t size) -{ - struct acpi_user_mapping *map; - - /* First search for an existing mapping */ - for (map = LIST_FIRST(&maplist); map; map = LIST_NEXT(map, link)) { - if (map->pa <= pa && map->size >= pa + size - map->pa) - return (map); - } - - /* Then create a new one */ - size = round_page(pa + size) - trunc_page(pa); - pa = trunc_page(pa); - map = malloc(sizeof(struct acpi_user_mapping)); - if (!map) { - msgDebug("%s: out of memory: %s\n", __func__, strerror(errno)); - return (map); - } - map->pa = pa; - map->va = mmap(0, size, PROT_READ, MAP_SHARED, acpi_mem_fd, pa); - map->size = size; - if ((intptr_t) map->va == -1) { - msgDebug("%s: can't mmap address %lu size %lu: %s\n", __func__, - (unsigned long) pa, (unsigned long) size, strerror(errno)); - free(map); - return (NULL); - } - LIST_INSERT_HEAD(&maplist, map, link); - - return (map); -} - -static void * -acpi_map_physical(vm_offset_t pa, size_t size) -{ - struct acpi_user_mapping *map; - - map = acpi_user_find_mapping(pa, size); - return (map == NULL ? NULL : map->va + (pa - map->pa)); -} - -static struct ACPIrsdp * -acpi_get_rsdp(u_long addr) -{ - struct ACPIrsdp rsdp; - size_t len; - - /* Read in the table signature and check it. */ - pread(acpi_mem_fd, &rsdp, 8, addr); - if (memcmp(rsdp.signature, "RSD PTR ", 8)) - return (NULL); - - /* Read the entire table. */ - pread(acpi_mem_fd, &rsdp, sizeof(rsdp), addr); - - /* Run the checksum only over the version 1 header. */ - if (acpi_checksum(&rsdp, 20)) - return (NULL); - - /* If the revision is 0, assume a version 1 length. */ - if (rsdp.revision == 0) - len = 20; - else - len = rsdp.length; - - /* XXX Should handle ACPI 2.0 RSDP extended checksum here. */ - - return (acpi_map_physical(addr, len)); -} - -static const char * -devstate(devinfo_state_t state) -{ - switch (state) { - case DIS_NOTPRESENT: - return "not-present"; - case DIS_ALIVE: - return "alive"; - case DIS_ATTACHED: - return "attached"; - case DIS_BUSY: - return "busy"; - default: - return "unknown-state"; - } -} - -static int -acpi0_check(struct devinfo_dev *dd, void *arg) -{ - printf("%s: %s %s\n", __func__, dd->dd_name, devstate(dd->dd_state)); - /* NB: device must be present AND attached */ - if (strcmp(dd->dd_name, "acpi0") == 0) - return (dd->dd_state == DIS_ATTACHED || - dd->dd_state == DIS_BUSY); - return devinfo_foreach_device_child(dd, acpi0_check, arg); -} - -static int -acpi0_present(void) -{ - struct devinfo_dev *root; - int found; - - found = 0; - devinfo_init(); - root = devinfo_handle_to_device(DEVINFO_ROOT_DEVICE); - if (root != NULL) - found = devinfo_foreach_device_child(root, acpi0_check, NULL); - devinfo_free(); - return found; -} - -int -acpi_detect(void) -{ - struct ACPIrsdp *rp; - struct ACPIsdt *rsdp; - u_long addr; - size_t len; - - if (!acpi0_present()) { - msgDebug("%s: no acpi0 device located\n", __func__); - return -1; - } - - if (!acpi_user_init()) - return -1; - - /* Attempt to use sysctl to find RSD PTR record. */ - len = sizeof(addr); - if (sysctlbyname(machdep_acpi_root, &addr, &len, NULL, 0) != 0) { - msgDebug("%s: cannot find ACPI information\n", __func__); - return -1; - } - rp = acpi_get_rsdp(addr); - if (rp == NULL) { - msgDebug("%s: cannot find ACPI information: " - "sysctl %s does not point to RSDP\n", __func__, - machdep_acpi_root); - return -1; - } - if (rp->revision < 2) { - rsdp = (struct ACPIsdt *)acpi_map_sdt(rp->rsdt_addr); - if (rsdp == NULL) - return -1; - if (memcmp(rsdp->signature, "RSDT", 4) != 0 || - acpi_checksum(rsdp, rsdp->len) != 0) { - msgDebug("%s: RSDT is corrupted\n", __func__); - return -1; - } - addr_size = sizeof(uint32_t); - } else { - rsdp = (struct ACPIsdt *)acpi_map_sdt(rp->xsdt_addr); - if (rsdp == NULL) - return -1; - if (memcmp(rsdp->signature, "XSDT", 4) != 0 || - acpi_checksum(rsdp, rsdp->len) != 0) { - msgDebug("%s: XSDT is corrupted\n", __func__); - return -1; - } - addr_size = sizeof(uint64_t); - } - ncpu = 0; - acpi_handle_rsdt(rsdp); - return (ncpu == 0 ? 1 : ncpu); -} diff --git a/usr.sbin/sysinstall/acpidump.h b/usr.sbin/sysinstall/acpidump.h deleted file mode 100644 index 9c2b5b6e502d..000000000000 --- a/usr.sbin/sysinstall/acpidump.h +++ /dev/null @@ -1,177 +0,0 @@ -/*- - * Copyright (c) 1999 Doug Rabson - * Copyright (c) 2000 Mitsuru IWASAKI - * 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$ - */ - -#ifndef _ACPIDUMP_H_ -#define _ACPIDUMP_H_ - -/* Root System Description Pointer */ -struct ACPIrsdp { - u_char signature[8]; - u_char sum; - u_char oem[6]; - u_char revision; - u_int32_t rsdt_addr; - u_int32_t length; - u_int64_t xsdt_addr; - u_char xsum; - u_char _reserved_[3]; -} __packed; - -/* System Description Table */ -struct ACPIsdt { - u_char signature[4]; - u_int32_t len; - u_char rev; - u_char check; - u_char oemid[6]; - u_char oemtblid[8]; - u_int32_t oemrev; - u_char creator[4]; - u_int32_t crerev; -#define SIZEOF_SDT_HDR 36 /* struct size except body */ - u_int32_t body[1];/* This member should be casted */ -} __packed; - -struct MADT_local_apic { - u_char cpu_id; - u_char apic_id; - u_int32_t flags; -#define ACPI_MADT_APIC_LOCAL_FLAG_ENABLED 1 -} __packed; - -struct MADT_io_apic { - u_char apic_id; - u_char reserved; - u_int32_t apic_addr; - u_int32_t int_base; -} __packed; - -struct MADT_int_override { - u_char bus; - u_char source; - u_int32_t intr; - u_int16_t mps_flags; -#define MPS_INT_FLAG_POLARITY_MASK 0x3 -#define MPS_INT_FLAG_POLARITY_CONFORM 0x0 -#define MPS_INT_FLAG_POLARITY_HIGH 0x1 -#define MPS_INT_FLAG_POLARITY_LOW 0x3 -#define MPS_INT_FLAG_TRIGGER_MASK 0xc -#define MPS_INT_FLAG_TRIGGER_CONFORM 0x0 -#define MPS_INT_FLAG_TRIGGER_EDGE 0x4 -#define MPS_INT_FLAG_TRIGGER_LEVEL 0xc -} __packed; - -struct MADT_nmi { - u_int16_t mps_flags; - u_int32_t intr; -} __packed; - -struct MADT_local_nmi { - u_char cpu_id; - u_int16_t mps_flags; - u_char lintpin; -} __packed; - -struct MADT_local_apic_override { - u_char reserved[2]; - u_int64_t apic_addr; -} __packed; - -struct MADT_io_sapic { - u_char apic_id; - u_char reserved; - u_int32_t int_base; - u_int64_t apic_addr; -} __packed; - -struct MADT_local_sapic { - u_char cpu_id; - u_char apic_id; - u_char apic_eid; - u_char reserved[3]; - u_int32_t flags; -} __packed; - -struct MADT_int_src { - u_int16_t mps_flags; - u_char type; -#define ACPI_MADT_APIC_INT_SOURCE_PMI 1 -#define ACPI_MADT_APIC_INT_SOURCE_INIT 2 -#define ACPI_MADT_APIC_INT_SOURCE_CPEI 3 /* Corrected Platform Error */ - u_char cpu_id; - u_char cpu_eid; - u_char sapic_vector; - u_int32_t intr; - u_char reserved[4]; -} __packed; - -struct MADT_APIC { - u_char type; -#define ACPI_MADT_APIC_TYPE_LOCAL_APIC 0 -#define ACPI_MADT_APIC_TYPE_IO_APIC 1 -#define ACPI_MADT_APIC_TYPE_INT_OVERRIDE 2 -#define ACPI_MADT_APIC_TYPE_NMI 3 -#define ACPI_MADT_APIC_TYPE_LOCAL_NMI 4 -#define ACPI_MADT_APIC_TYPE_LOCAL_OVERRIDE 5 -#define ACPI_MADT_APIC_TYPE_IO_SAPIC 6 -#define ACPI_MADT_APIC_TYPE_LOCAL_SAPIC 7 -#define ACPI_MADT_APIC_TYPE_INT_SRC 8 - u_char len; - union { - struct MADT_local_apic local_apic; - struct MADT_io_apic io_apic; - struct MADT_int_override int_override; - struct MADT_nmi nmi; - struct MADT_local_nmi local_nmi; - struct MADT_local_apic_override local_apic_override; - struct MADT_io_sapic io_sapic; - struct MADT_local_sapic local_sapic; - struct MADT_int_src int_src; - } body; -} __packed; - -struct MADTbody { - u_int32_t lapic_addr; - u_int32_t flags; -#define ACPI_APIC_FLAG_PCAT_COMPAT 1 /* System has dual-8259 setup. */ - u_char body[1]; -} __packed; - -/* - * Addresses to scan on ia32 for the RSD PTR. According to section 5.2.2 - * of the ACPI spec, we only consider two regions for the base address: - * 1. EBDA (1 KB area addressed to by 16 bit pointer at 0x40E) - * 2. High memory (0xE0000 - 0xFFFFF) - */ -#define RSDP_EBDA_PTR 0x40E -#define RSDP_EBDA_SIZE 0x400 -#define RSDP_HI_START 0xE0000 -#define RSDP_HI_SIZE 0x20000 - -#endif /* !_ACPIDUMP_H_ */ diff --git a/usr.sbin/sysinstall/biosmptable.c b/usr.sbin/sysinstall/biosmptable.c deleted file mode 100644 index 5a507bd6bfdd..000000000000 --- a/usr.sbin/sysinstall/biosmptable.c +++ /dev/null @@ -1,275 +0,0 @@ -/*- - * Copyright (c) 2005 Sandvine Incorporated. All righs 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. - * - * Author: Ed Maste - */ - -/* - * This module detects Intel Multiprocessor spec info (mptable) and returns - * the number of cpu's identified. - */ - -#include -__FBSDID("$FreeBSD$"); - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "sysinstall.h" - -#define MPFPS_SIG "_MP_" -#define MPCTH_SIG "PCMP" - -#define PTOV(pa) ((off_t)(pa)) - -static mpfps_t biosmptable_find_mpfps(void); -static mpfps_t biosmptable_search_mpfps(off_t base, int length); -static mpcth_t biosmptable_check_mpcth(off_t addr); - -static int memopen(void); -static void memclose(void); - -int -biosmptable_detect(void) -{ - mpfps_t mpfps; - mpcth_t mpcth; - char *entry_type_p; - proc_entry_ptr proc; - int ncpu, i; - - if (!memopen()) - return -1; /* XXX 0? */ - /* locate and validate the mpfps */ - mpfps = biosmptable_find_mpfps(); - mpcth = NULL; - if (mpfps == NULL) { - ncpu = 0; - } else if (mpfps->config_type != 0) { - /* - * If thie config_type is nonzero then this is a default configuration - * from Chapter 5 in the MP spec. Report 2 cpus and 1 I/O APIC. - */ - ncpu = 2; - } else { - ncpu = 0; - mpcth = biosmptable_check_mpcth(PTOV(mpfps->pap)); - if (mpcth != NULL) { - entry_type_p = (char *)(mpcth + 1); - for (i = 0; i < mpcth->entry_count; i++) { - switch (*entry_type_p) { - case 0: - entry_type_p += sizeof(struct PROCENTRY); - proc = (proc_entry_ptr) entry_type_p; - msgDebug("MPTable: Found CPU APIC ID %d %s\n", - proc->apic_id, - proc->cpu_flags & PROCENTRY_FLAG_EN ? - "enabled" : "disabled"); - if (proc->cpu_flags & PROCENTRY_FLAG_EN) - ncpu++; - break; - case 1: - entry_type_p += sizeof(struct BUSENTRY); - break; - case 2: - entry_type_p += sizeof(struct IOAPICENTRY); - break; - case 3: - case 4: - entry_type_p += sizeof(struct INTENTRY); - break; - default: - msgDebug("%s: unknown mptable entry type (%d)\n", - __func__, *entry_type_p); - goto done; /* XXX error return? */ - } - } - done: - ; - } - } - memclose(); - if (mpcth != NULL) - free(mpcth); - if (mpfps != NULL) - free(mpfps); - - return ncpu; -} - -static int pfd = -1; - -static int -memopen(void) -{ - if (pfd < 0) { - pfd = open(_PATH_MEM, O_RDONLY); - if (pfd < 0) - warn("%s: cannot open", _PATH_MEM); - } - return pfd >= 0; -} - -static void -memclose(void) -{ - if (pfd >= 0) { - close(pfd); - pfd = -1; - } -} - -static int -memread(off_t addr, void* entry, size_t size) -{ - if ((size_t)pread(pfd, entry, size, addr) != size) { - warn("pread (%zu @ 0x%llx)", size, addr); - return 0; - } - return 1; -} - - -/* - * Find the MP Floating Pointer Structure. See the MP spec section 4.1. - */ -static mpfps_t -biosmptable_find_mpfps(void) -{ - mpfps_t mpfps; - uint16_t addr; - - /* EBDA is the 1 KB addressed by the 16 bit pointer at 0x40E. */ - if (!memread(PTOV(0x40E), &addr, sizeof(addr))) - return (NULL); - mpfps = biosmptable_search_mpfps(PTOV(addr << 4), 0x400); - if (mpfps != NULL) - return (mpfps); - - /* Check the BIOS. */ - mpfps = biosmptable_search_mpfps(PTOV(0xf0000), 0x10000); - if (mpfps != NULL) - return (mpfps); - - return (NULL); -} - -static mpfps_t -biosmptable_search_mpfps(off_t base, int length) -{ - mpfps_t mpfps; - u_int8_t *cp, sum; - int ofs, idx; - - mpfps = malloc(sizeof(*mpfps)); - if (mpfps == NULL) { - msgDebug("%s: unable to malloc space for " - "MP Floating Pointer Structure\n", __func__); - return (NULL); - } - /* search on 16-byte boundaries */ - for (ofs = 0; ofs < length; ofs += 16) { - if (!memread(base + ofs, mpfps, sizeof(*mpfps))) - break; - - /* compare signature, validate checksum */ - if (!strncmp(mpfps->signature, MPFPS_SIG, strlen(MPFPS_SIG))) { - cp = (u_int8_t *)mpfps; - sum = 0; - /* mpfps is 16 bytes, or one "paragraph" */ - if (mpfps->length != 1) { - msgDebug("%s: bad mpfps length (%d)\n", - __func__, mpfps->length); - continue; - } - for (idx = 0; idx < mpfps->length * 16; idx++) - sum += *(cp + idx); - if (sum != 0) { - msgDebug("%s: bad mpfps checksum (%d)\n", __func__, sum); - continue; - } - return (mpfps); - } - } - free(mpfps); - return (NULL); -} - -static mpcth_t -biosmptable_check_mpcth(off_t addr) -{ - mpcth_t mpcth; - u_int8_t *cp, sum; - int idx, table_length; - - /* mpcth must be in the first 1MB */ - if ((u_int32_t)addr >= 1024 * 1024) { - msgDebug("%s: bad mpcth address (0x%llx)\n", __func__, addr); - return (NULL); - } - - mpcth = malloc(sizeof(*mpcth)); - if (mpcth == NULL) { - msgDebug("%s: unable to malloc space for " - "MP Configuration Table Header\n", __func__); - return (NULL); - } - if (!memread(addr, mpcth, sizeof(*mpcth))) - goto bad; - /* Compare signature and validate checksum. */ - if (strncmp(mpcth->signature, MPCTH_SIG, strlen(MPCTH_SIG)) != 0) { - msgDebug("%s: bad mpcth signature\n", __func__); - goto bad; - } - table_length = mpcth->base_table_length; - mpcth = realloc(mpcth, table_length); - if (mpcth == NULL) { - msgDebug("%s: unable to realloc space for mpcth (len %u)\n", - __func__, table_length); - return (NULL); - } - if (!memread(addr, mpcth, table_length)) - goto bad; - cp = (u_int8_t *)mpcth; - sum = 0; - for (idx = 0; idx < mpcth->base_table_length; idx++) - sum += *(cp + idx); - if (sum != 0) { - msgDebug("%s: bad mpcth checksum (%d)\n", __func__, sum); - goto bad; - } - - return mpcth; -bad: - free(mpcth); - return (NULL); -} diff --git a/usr.sbin/sysinstall/cdrom.c b/usr.sbin/sysinstall/cdrom.c index a5029ecb9a29..6bc72d863ef9 100644 --- a/usr.sbin/sysinstall/cdrom.c +++ b/usr.sbin/sysinstall/cdrom.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,8 @@ static Boolean previouslyMounted; /* Was the disc already mounted? */ static char mountpoint[MAXPATHLEN] = "/dist"; int CDROMInitQuiet; +static void mediaEjectCDROM(Device *dev); + static properties read_props(char *name) { @@ -218,4 +221,24 @@ mediaShutdownCDROM(Device *dev) msgConfirm("Could not unmount the CDROM/DVD from %s: %s", mountpoint, strerror(errno)); else cdromMounted = FALSE; + + mediaEjectCDROM(dev); +} + +static void +mediaEjectCDROM(Device *dev) +{ + int fd = -1; + + msgDebug("Ejecting CDROM/DVD at %s", dev->devname); + + fd = open(dev->devname, O_RDONLY); + + if (fd < 0) + msgDebug("Could not eject the CDROM/DVD from %s: %s", dev->devname, strerror(errno)); + else { + ioctl(fd, CDIOCALLOW); + ioctl(fd, CDIOCEJECT); + close(fd); + } } diff --git a/usr.sbin/sysinstall/devices.c b/usr.sbin/sysinstall/devices.c index b95fdc595a55..a2b7939f0483 100644 --- a/usr.sbin/sysinstall/devices.c +++ b/usr.sbin/sysinstall/devices.c @@ -105,6 +105,7 @@ static struct _devname { NETWORK("bfe", "Broadcom BCM440x PCI Ethernet card"), NETWORK("bge", "Broadcom BCM570x PCI Gigabit Ethernet card"), NETWORK("bm", "Apple BMAC Built-in Ethernet"), + NETWORK("bwn", "Broadcom BCM43xx IEEE 802.11 wireless adapter"), NETWORK("cas", "Sun Cassini/Cassini+ or NS DP83065 Saturn Ethernet"), NETWORK("cue", "CATC USB Ethernet adapter"), NETWORK("cxgb", "Chelsio T3 10Gb Ethernet card"), diff --git a/usr.sbin/sysinstall/disks.c b/usr.sbin/sysinstall/disks.c index 919b97df033e..a1c09b659efb 100644 --- a/usr.sbin/sysinstall/disks.c +++ b/usr.sbin/sysinstall/disks.c @@ -333,7 +333,7 @@ diskGetSelectCount(Device ***devs) void diskPartition(Device *dev) { - char *cp, *p; + char *p; int rv, key = 0; int i; Boolean chunking; diff --git a/usr.sbin/sysinstall/dist.c b/usr.sbin/sysinstall/dist.c index 3c84a1d2ed64..1a2dd5bce0db 100644 --- a/usr.sbin/sysinstall/dist.c +++ b/usr.sbin/sysinstall/dist.c @@ -99,9 +99,6 @@ static Distribution DistTable[] = { /* The kernel distributions */ static Distribution KernelDistTable[] = { DTE_TARBALL("GENERIC", &KernelDists, KERNEL_GENERIC, "/boot"), -#ifdef WITH_SMP - DTE_TARBALL("SMP", &KernelDists, KERNEL_SMP, "/boot"), -#endif DTE_END, }; @@ -207,12 +204,7 @@ distConfig(dialogMenuItem *self) int selectKernel(void) { -#ifdef WITH_SMP - /* select default kernel based on deduced cpu count */ - return NCpus > 1 ? DIST_KERNEL_SMP : DIST_KERNEL_GENERIC; -#else return DIST_KERNEL_GENERIC; -#endif } int @@ -783,6 +775,10 @@ distSetDoc(dialogMenuItem *self) { int i; + /* Assume no docs for non-interactive installs. */ + if (variable_get(VAR_NONINTERACTIVE)) + return DITEM_SUCCESS | DITEM_RESTORE; + dialog_clear_norefresh(); if (!dmenuOpenSimple(&MenuDocInstall, FALSE)) i = DITEM_FAILURE; diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c index a2979c900b05..ac2280311f75 100644 --- a/usr.sbin/sysinstall/install.c +++ b/usr.sbin/sysinstall/install.c @@ -938,20 +938,12 @@ installFixupKernel(dialogMenuItem *self, int dists) /* All of this is done only as init, just to be safe */ if (RunningAsInit) { /* - * Install something as /boot/kernel. Prefer SMP - * over GENERIC--this should handle the case where - * both SMP and GENERIC are installed (otherwise we - * select the one kernel that was installed). + * Install something as /boot/kernel. * * NB: we assume any existing kernel has been saved * already and the /boot/kernel we remove is empty. */ vsystem("rm -rf /boot/kernel"); -#if WITH_SMP - if (dists & DIST_KERNEL_SMP) - vsystem("mv /boot/SMP /boot/kernel"); - else -#endif vsystem("mv /boot/GENERIC /boot/kernel"); } return DITEM_SUCCESS | DITEM_RESTORE; @@ -1255,11 +1247,6 @@ installVarDefaults(dialogMenuItem *self) variable_set2(SYSTEM_STATE, "init", 0); variable_set2(VAR_NEWFS_ARGS, "-b 16384 -f 2048", 0); variable_set2(VAR_CONSTERM, "NO", 0); -#if (defined(__i386__) && !defined(PC98)) || defined(__amd64__) - NCpus = acpi_detect(); - if (NCpus == -1) - NCpus = biosmptable_detect(); -#endif if (NCpus <= 0) NCpus = 1; snprintf(ncpus, sizeof(ncpus), "%u", NCpus); diff --git a/usr.sbin/sysinstall/label.c b/usr.sbin/sysinstall/label.c index 2ca947a724d3..08cd3dfe5e57 100644 --- a/usr.sbin/sysinstall/label.c +++ b/usr.sbin/sysinstall/label.c @@ -384,11 +384,7 @@ new_part(PartType type, char *mpoint, Boolean newfs) pi->newfs_data.newfs_ufs.acls = FALSE; pi->newfs_data.newfs_ufs.multilabel = FALSE; pi->newfs_data.newfs_ufs.softupdates = strcmp(mpoint, "/"); -#ifdef PC98 - pi->newfs_data.newfs_ufs.ufs1 = TRUE; -#else pi->newfs_data.newfs_ufs.ufs1 = FALSE; -#endif } return pi; diff --git a/usr.sbin/sysinstall/menus.c b/usr.sbin/sysinstall/menus.c index 8ea7f9876e32..decb4fd0b871 100644 --- a/usr.sbin/sysinstall/menus.c +++ b/usr.sbin/sysinstall/menus.c @@ -1031,10 +1031,6 @@ DMenu MenuKernelDistributions = { NULL, clearKernel, NULL, NULL, ' ', ' ', ' ' }, { " GENERIC", "GENERIC kernel configuration", dmenuFlagCheck, dmenuSetFlag, NULL, &KernelDists, '[', 'X', ']', DIST_KERNEL_GENERIC }, -#ifdef WITH_SMP - { " SMP", "GENERIC symmetric multiprocessor kernel configuration", - dmenuFlagCheck, dmenuSetFlag, NULL, &KernelDists, '[', 'X', ']', DIST_KERNEL_SMP }, -#endif { NULL } }, }; diff --git a/usr.sbin/sysinstall/package.c b/usr.sbin/sysinstall/package.c index 212b654b4606..9aa4589c0e58 100644 --- a/usr.sbin/sysinstall/package.c +++ b/usr.sbin/sysinstall/package.c @@ -139,7 +139,7 @@ package_extract(Device *dev, char *name, Boolean depended) /* If necessary, initialize the ldconfig hints */ if (!file_readable("/var/run/ld-elf.so.hints")) - vsystem("ldconfig /usr/lib /usr/lib/compat /usr/local/lib /usr/X11R6/lib"); + vsystem("ldconfig /usr/lib /usr/lib/compat /usr/local/lib"); /* Be initially optimistic */ ret = DITEM_SUCCESS; diff --git a/usr.sbin/sysinstall/sysinstall.8 b/usr.sbin/sysinstall/sysinstall.8 index 46a14fc8d9c5..cdaec6dcc218 100644 --- a/usr.sbin/sysinstall/sysinstall.8 +++ b/usr.sbin/sysinstall/sysinstall.8 @@ -413,8 +413,6 @@ Possible distribution values are: The base binary distribution. .It Li GENERIC The GENERIC kernel. -.It Li SMP -A kernel suitable for multiple processor systems. .It Li doc Miscellaneous documentation .It Li games diff --git a/usr.sbin/sysinstall/tcpip.c b/usr.sbin/sysinstall/tcpip.c index f505a0581c0d..75a40e87512b 100644 --- a/usr.sbin/sysinstall/tcpip.c +++ b/usr.sbin/sysinstall/tcpip.c @@ -40,10 +40,17 @@ #include "sysinstall.h" #include #include +#include #include +#include + #include +#include +#include + #include #include +#include /* The help file for the TCP/IP setup screen */ #define TCP_HELPFILE "tcp" @@ -636,6 +643,51 @@ netHook(dialogMenuItem *self) return devs ? DITEM_LEAVE_MENU : DITEM_FAILURE; } +static char * +tcpDeviceScan(void) +{ + int s; + struct ifmediareq ifmr; + struct ifaddrs *ifap, *ifa; + struct if_data *ifd; + char *network_dev; + + if ((s = socket(AF_LOCAL, SOCK_DGRAM, 0)) < 0) + return (NULL); + + if (getifaddrs(&ifap) < 0) + return (NULL); + + for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { + memset(&ifmr, 0, sizeof(ifmr)); + strlcpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); + + if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) + continue; /* some devices don't support this */ + + if ((ifmr.ifm_status & IFM_AVALID) == 0) + continue; /* not active */ + + if (IFM_TYPE(ifmr.ifm_active) != IFM_ETHER) + continue; /* not an ethernet device */ + + if (ifmr.ifm_status & IFM_ACTIVE) { + network_dev = strdup(ifa->ifa_name); + freeifaddrs(ifap); + + if (!variable_get(VAR_NONINTERACTIVE)) + msgConfirm("Using interface %s", network_dev); + + msgDebug("tcpDeviceScan found %s", network_dev); + return (network_dev); + } + } + + freeifaddrs(ifap); + + return (NULL); +} + /* Get a network device */ Device * tcpDeviceSelect(void) @@ -647,27 +699,38 @@ tcpDeviceSelect(void) rval = NULL; - if (variable_get(VAR_NONINTERACTIVE) && variable_get(VAR_NETWORK_DEVICE)) { + if (variable_get(VAR_NETWORK_DEVICE)) { network_dev = variable_get(VAR_NETWORK_DEVICE); + /* + * netDev can be set to several types of values. + * If netDev is set to ANY, scan all network devices + * looking for a valid link, and go with the first + * device found. netDev can also be specified as a + * comma delimited list, with each network device + * tried in order. netDev can also be set to a single + * network device. + */ + if (!strcmp(network_dev, "ANY")) + network_dev = strdup(tcpDeviceScan()); + while ((dev = strsep(&network_dev, ",")) != NULL) { devs = deviceFind(dev, DEVICE_TYPE_NETWORK); cnt = deviceCount(devs); + if (cnt) { - if (DITEM_STATUS(tcpOpenDialog(devs[0]) == DITEM_SUCCESS)) - return(devs[0]); + if (DITEM_STATUS(tcpOpenDialog(devs[0])) == DITEM_SUCCESS) + return (devs[0]); } } + + if (!variable_get(VAR_NONINTERACTIVE)) + msgConfirm("No network devices available!"); + + return (NULL); } - devs = deviceFind(variable_get(VAR_NETWORK_DEVICE), DEVICE_TYPE_NETWORK); - cnt = deviceCount(devs); - - if (!cnt) { - msgConfirm("No network devices available!"); - return NULL; - } - else if ((!RunningAsInit) && (variable_check("NETWORK_CONFIGURED=NO") != TRUE)) { + if ((!RunningAsInit) && (variable_check("NETWORK_CONFIGURED=NO") != TRUE)) { if (!msgYesNo("Running multi-user, assume that the network is already configured?")) return devs[0]; } diff --git a/usr.sbin/sysinstall/termcap.c b/usr.sbin/sysinstall/termcap.c index 0df0a77cb5ed..4f2b2e90cd9e 100644 --- a/usr.sbin/sysinstall/termcap.c +++ b/usr.sbin/sysinstall/termcap.c @@ -125,17 +125,17 @@ set_termcap(void) #else if (ColorDisplay) { if (!term) { - if (setenv("TERM", "cons25", 1) < 0) + if (setenv("TERM", "xterm", 1) < 0) return -1; - if (setenv("TERMCAP", termcap_cons25, 1) < 0) + if (setenv("TERMCAP", termcap_xterm, 1) < 0) return -1; } } else { if (!term) { - if (setenv("TERM", "cons25-m", 1) < 0) + if (setenv("TERM", "vt100", 1) < 0) return -1; - if (setenv("TERMCAP", termcap_cons25_m, 1) < 0) + if (setenv("TERMCAP", termcap_vt100, 1) < 0) return -1; } } diff --git a/usr.sbin/sysinstall/user.c b/usr.sbin/sysinstall/user.c index ed2e77098b98..72b67161f4e0 100644 --- a/usr.sbin/sysinstall/user.c +++ b/usr.sbin/sysinstall/user.c @@ -35,7 +35,6 @@ */ #include "sysinstall.h" -#include #include #include #include @@ -47,7 +46,7 @@ #define GNAME_FIELD_LEN 32 #define GID_FIELD_LEN 11 #define GMEMB_FIELD_LEN 64 - +#define UNAME_FIELD_LEN MAXLOGNAME #define UID_FIELD_LEN 11 #define UGROUP_FIELD_LEN GNAME_FIELD_LEN #define GECOS_FIELD_LEN 64 @@ -61,7 +60,7 @@ static char gname[GNAME_FIELD_LEN], gid[GID_FIELD_LEN], gmemb[GMEMB_FIELD_LEN], - uname[UT_NAMESIZE + 1], + uname[UNAME_FIELD_LEN], passwd[PASSWD_FIELD_LEN], confpasswd[PASSWD_FIELD_LEN], uid[UID_FIELD_LEN], @@ -109,7 +108,7 @@ static Layout groupLayout[] = { /* The user configuration menu. */ static Layout userLayout[] = { #define LAYOUT_UNAME 0 - { 2, 6, UT_NAMESIZE, UT_NAMESIZE + 1, + { 2, 6, 16, UNAME_FIELD_LEN - 1, "Login ID:", "The login name of the new user (mandatory)", uname, STRINGOBJ, NULL }, #define LAYOUT_UID 1 diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index 3e628a24ed2e..b803969c8547 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -77,6 +77,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -105,7 +106,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include "pathnames.h" #include "ttymsg.h" @@ -170,7 +171,7 @@ struct filed { #define PRI_GT 0x4 char *f_program; /* program this applies to */ union { - char f_uname[MAXUNAMES][UT_NAMESIZE+1]; + char f_uname[MAXUNAMES][MAXLOGNAME]; struct { char f_hname[MAXHOSTNAMELEN]; struct addrinfo *f_addr; @@ -352,6 +353,9 @@ main(int argc, char *argv[]) pid_t ppid = 1, spid; socklen_t len; + if (madvise(NULL, 0, MADV_PROTECT) != 0) + dprintf("madvise() failed: %s\n", strerror(errno)); + bindhostname = NULL; while ((ch = getopt(argc, argv, "468Aa:b:cCdf:kl:m:nop:P:sS:Tuv")) != -1) @@ -1338,29 +1342,20 @@ static void wallmsg(struct filed *f, struct iovec *iov, const int iovlen) { static int reenter; /* avoid calling ourselves */ - FILE *uf; - struct utmp ut; + struct utmpx *ut; int i; const char *p; - char line[sizeof(ut.ut_line) + 1]; if (reenter++) return; - if ((uf = fopen(_PATH_UTMP, "r")) == NULL) { - logerror(_PATH_UTMP); - reenter = 0; - return; - } + setutxent(); /* NOSTRICT */ - while (fread((char *)&ut, sizeof(ut), 1, uf) == 1) { - if (ut.ut_name[0] == '\0') + while ((ut = getutxent()) != NULL) { + if (ut->ut_type != USER_PROCESS) continue; - /* We must use strncpy since ut_* may not be NUL terminated. */ - strncpy(line, ut.ut_line, sizeof(line) - 1); - line[sizeof(line) - 1] = '\0'; if (f->f_type == F_WALL) { - if ((p = ttymsg(iov, iovlen, line, TTYMSGTIME)) != - NULL) { + if ((p = ttymsg(iov, iovlen, ut->ut_line, + TTYMSGTIME)) != NULL) { errno = 0; /* already in msg */ logerror(p); } @@ -1370,10 +1365,9 @@ wallmsg(struct filed *f, struct iovec *iov, const int iovlen) for (i = 0; i < MAXUNAMES; i++) { if (!f->f_un.f_uname[i][0]) break; - if (!strncmp(f->f_un.f_uname[i], ut.ut_name, - UT_NAMESIZE)) { - if ((p = ttymsg(iov, iovlen, line, TTYMSGTIME)) - != NULL) { + if (!strcmp(f->f_un.f_uname[i], ut->ut_user)) { + if ((p = ttymsg(iov, iovlen, ut->ut_line, + TTYMSGTIME)) != NULL) { errno = 0; /* already in msg */ logerror(p); } @@ -1381,7 +1375,7 @@ wallmsg(struct filed *f, struct iovec *iov, const int iovlen) } } } - (void)fclose(uf); + endutxent(); reenter = 0; } @@ -1998,9 +1992,9 @@ cfline(const char *line, struct filed *f, const char *prog, const char *host) for (i = 0; i < MAXUNAMES && *p; i++) { for (q = p; *q && *q != ','; ) q++; - (void)strncpy(f->f_un.f_uname[i], p, UT_NAMESIZE); - if ((q - p) > UT_NAMESIZE) - f->f_un.f_uname[i][UT_NAMESIZE] = '\0'; + (void)strncpy(f->f_un.f_uname[i], p, MAXLOGNAME - 1); + if ((q - p) >= MAXLOGNAME) + f->f_un.f_uname[i][MAXLOGNAME - 1] = '\0'; else f->f_un.f_uname[i][q - p] = '\0'; while (*q == ',' || *q == ' ') diff --git a/usr.sbin/tcpdchk/Makefile b/usr.sbin/tcpdchk/Makefile index 2936984377a5..a49ffc60b748 100644 --- a/usr.sbin/tcpdchk/Makefile +++ b/usr.sbin/tcpdchk/Makefile @@ -15,6 +15,8 @@ CFLAGS+=-DREAL_DAEMON_DIR=\"/usr/libexec\" \ CFLAGS+=-DINET6 .endif +WARNS?= 0 + DPADD= ${LIBWRAP} LDADD= -lwrap diff --git a/usr.sbin/tcpdmatch/Makefile b/usr.sbin/tcpdmatch/Makefile index cbd61aa491e4..caae746805d8 100644 --- a/usr.sbin/tcpdmatch/Makefile +++ b/usr.sbin/tcpdmatch/Makefile @@ -14,6 +14,8 @@ CFLAGS+=-DREAL_DAEMON_DIR=\"/usr/libexec\" \ CFLAGS+=-DINET6 .endif +WARNS?= 0 + DPADD= ${LIBWRAP} LDADD= -lwrap diff --git a/usr.sbin/tcpdrop/Makefile b/usr.sbin/tcpdrop/Makefile index 44766eb9a0a3..2fc606a26392 100644 --- a/usr.sbin/tcpdrop/Makefile +++ b/usr.sbin/tcpdrop/Makefile @@ -3,6 +3,5 @@ PROG= tcpdrop MAN= tcpdrop.8 -WARNS?= 6 .include diff --git a/usr.sbin/tcpdump/Makefile.inc b/usr.sbin/tcpdump/Makefile.inc index 1e4d46f113a5..6c4b6e22ba1c 100644 --- a/usr.sbin/tcpdump/Makefile.inc +++ b/usr.sbin/tcpdump/Makefile.inc @@ -2,3 +2,5 @@ # $FreeBSD$ BINDIR?= /usr/sbin + +WARNS?= 3 diff --git a/usr.sbin/timed/timed/master.c b/usr.sbin/timed/timed/master.c index e36fbaef915a..053701660f69 100644 --- a/usr.sbin/timed/timed/master.c +++ b/usr.sbin/timed/timed/master.c @@ -44,6 +44,7 @@ static const char rcsid[] = #include #include #include +#include #include "pathnames.h" extern int measure_delta; @@ -56,8 +57,6 @@ static int slvcount; /* slaves listening to our clock */ static void mchgdate(struct tsp *); -extern void logwtmp(char *, char *, char *); - /* * The main function of `master' is to periodically compute the differences * (deltas) between its clock and the clocks of the slaves, to compute the @@ -350,6 +349,7 @@ mchgdate(msg) char tname[MAXHOSTNAMELEN]; char olddate[32]; struct timeval otime, ntime, tmptv; + struct utmpx utx; (void)strcpy(tname, msg->tsp_name); @@ -371,9 +371,13 @@ mchgdate(msg) dictate = 3; synch(tvtomsround(ntime)); } else { - logwtmp("|", "date", ""); + utx.ut_type = OLD_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); (void)settimeofday(&tmptv, 0); - logwtmp("{", "date", ""); + utx.ut_type = NEW_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); spreadtime(); } diff --git a/usr.sbin/timed/timed/slave.c b/usr.sbin/timed/timed/slave.c index 217fd8225da0..74a17234549e 100644 --- a/usr.sbin/timed/timed/slave.c +++ b/usr.sbin/timed/timed/slave.c @@ -41,6 +41,7 @@ static const char rcsid[] = #include "globals.h" #include +#include #include "pathnames.h" extern jmp_buf jmpenv; @@ -57,8 +58,6 @@ static void schgdate(struct tsp *, char *); static void setmaster(struct tsp *); static void answerdelay(void); -extern void logwtmp(char *, char *, char *); - int slave() { @@ -80,6 +79,7 @@ slave() char newdate[32]; struct netinfo *ntp; struct hosttbl *htp; + struct utmpx utx; old_slavenet = 0; @@ -280,9 +280,13 @@ loop: */ synch(tvtomsround(ntime)); } else { - logwtmp("|", "date", ""); - (void)settimeofday(&tmptv, 0); - logwtmp("{", "date", ""); + utx.ut_type = OLD_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); + (void)settimeofday(&tmptv, 0); + utx.ut_type = NEW_TIME; + gettimeofday(&utx.ut_tv, NULL); + pututxline(&utx); syslog(LOG_NOTICE, "date changed by %s from %s", msg->tsp_name, olddate); diff --git a/usr.sbin/traceroute/Makefile b/usr.sbin/traceroute/Makefile index 489c862089e0..6d6752a92377 100644 --- a/usr.sbin/traceroute/Makefile +++ b/usr.sbin/traceroute/Makefile @@ -5,7 +5,7 @@ TRACEROUTE_DISTDIR?= ${.CURDIR}/../../contrib/traceroute PROG= traceroute MAN= traceroute.8 -SRCS= as.c version.c traceroute.c ifaddrlist.c findsaddr-socket.c +SRCS= as.c version.c traceroute.c ifaddrlist.c findsaddr-udp.c BINOWN= root BINMODE=4555 CLEANFILES= version.c @@ -29,7 +29,9 @@ DPADD= ${LIBIPSEC} LDADD= -lipsec .endif -CFLAGS+= -I${TRACEROUTE_DISTDIR}/lbl +CFLAGS+= -I${TRACEROUTE_DISTDIR}/lbl -I${TRACEROUTE_DISTDIR} + +WARNS?= 0 version.c: ${TRACEROUTE_DISTDIR}/VERSION @rm -f ${.TARGET} diff --git a/usr.sbin/traceroute/findsaddr-udp.c b/usr.sbin/traceroute/findsaddr-udp.c new file mode 100644 index 000000000000..3da72c700a80 --- /dev/null +++ b/usr.sbin/traceroute/findsaddr-udp.c @@ -0,0 +1,94 @@ +/*- + * Copyright (c) 2010 Bjoern A. Zeeb + * 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 +#include + +#include +#include + +#include + +#include "findsaddr.h" +#include "traceroute.h" + +/* + * Return the source address for the given destination address. + * + * This makes use of proper source address selection in the FreeBSD kernel + * even taking jails into account (sys/netinet/in_pcb.c:in_pcbladdr()). + * We open a UDP socket, and connect to the destination, letting the kernel + * do the bind and then read the source IPv4 address using getsockname(2). + * This has multiple advantages: no need to do PF_ROUTE operations possibly + * needing special privileges, jails properly taken into account and most + * important - getting the result the kernel would give us rather than + * best-guessing ourselves. + */ +const char * +findsaddr(register const struct sockaddr_in *to, + register struct sockaddr_in *from) +{ + const char *errstr; + struct sockaddr_in cto, cfrom; + int s; + socklen_t len; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s == -1) + return ("failed to open DGRAM socket for src addr selection."); + + errstr = NULL; + len = sizeof(struct sockaddr_in); + memcpy(&cto, to, len); + cto.sin_port = htons(65535); /* Dummy port for connect(2). */ + if (connect(s, (struct sockaddr *)&cto, len) == -1) { + errstr = "failed to connect to peer for src addr selection."; + goto err; + } + + if (getsockname(s, (struct sockaddr *)&cfrom, &len) == -1) { + errstr = "failed to get socket name for src addr selection."; + goto err; + } + + if (len != sizeof(struct sockaddr_in) || cfrom.sin_family != AF_INET) { + errstr = "unexpected address family in src addr selection."; + goto err; + } + + /* Update source address for traceroute. */ + setsin(from, cfrom.sin_addr.s_addr); + +err: + (void) close(s); + + /* No error (string) to return. */ + return (errstr); +} + +/* end */ diff --git a/usr.sbin/traceroute6/Makefile b/usr.sbin/traceroute6/Makefile index 60618a2ad408..e0b72a13cd03 100644 --- a/usr.sbin/traceroute6/Makefile +++ b/usr.sbin/traceroute6/Makefile @@ -25,6 +25,8 @@ BINMODE= 4555 CFLAGS+= -DIPSEC -DUSE_RFC2292BIS -DHAVE_POLL CFLAGS+= -I${.CURDIR} -I${TRACEROUTE_DISTDIR} -I. +WARNS?= 1 + DPADD= ${LIBIPSEC} LDADD= -lipsec diff --git a/usr.sbin/tzsetup/Makefile b/usr.sbin/tzsetup/Makefile index 0596967a07e2..a9da310fd86f 100644 --- a/usr.sbin/tzsetup/Makefile +++ b/usr.sbin/tzsetup/Makefile @@ -5,6 +5,8 @@ MAN= tzsetup.8 CFLAGS+= -I${.CURDIR} +WARNS?= 3 + DPADD= ${LIBDIALOG} ${LIBNCURSES} LDADD= -ldialog -lncurses diff --git a/usr.sbin/tzsetup/tzsetup.8 b/usr.sbin/tzsetup/tzsetup.8 index fd355b697f61..4d548fdb968d 100644 --- a/usr.sbin/tzsetup/tzsetup.8 +++ b/usr.sbin/tzsetup/tzsetup.8 @@ -31,8 +31,9 @@ .Nd set local timezone .Sh SYNOPSIS .Nm -.Op Fl ns -.Op Ar default +.Op Fl nrs +.Op Fl C Ar chroot directory +.Op Ar zoneinfo file | zoneinfo name .Sh DESCRIPTION The .Nm @@ -49,17 +50,26 @@ the hardware clock does not keep .Pp The following option is available: .Bl -tag -offset indent -width Fl +.It Fl C Ar chroot directory +Open all files and directories relative to +.Ar chroot directory . .It Fl n Do not create or copy files. +.It Fl r +Reinstall the zoneinfo file installed last time. The name is obtained from +.Pa /var/db/zoneinfo . .It Fl s Skip the initial question about adjusting the clock if not set to .Tn UTC . .El .Pp -It is possible to short-circuit the menu system by specifying a -.Ar default -on the command line; this is intended mainly for pre-configured -installation scripts. +It is possible to short-circuit the menu system by specifying the +location of a +.Ar zoneinfo file +or the name of the +.Ar zoneinfo name +on the command line; this is intended mainly for pre-configured installation +scripts or people who know which zoneinfo they want to install. .Sh TIMEZONE DATABASE The contents of the timezone database are indexed by .Pa /usr/share/zoneinfo/zone.tab . @@ -93,19 +103,36 @@ historically minded. .Sh FILES .Bl -tag -width /usr/share/zoneinfo/zone.tab -compact .It Pa /etc/localtime -current time zone file +current time zone file. .It Pa /etc/wall_cmos_clock see .Xr adjkerntz 8 . .It Pa /usr/share/misc/iso3166 mapping of .Tn ISO -3166 territory codes to names +3166 territory codes to names. .It Pa /usr/share/zoneinfo -directory for zoneinfo files +directory for zoneinfo files. .It Pa /usr/share/zoneinfo/zone.tab -mapping of timezone file to country and location +mapping of timezone file to country and location. +.It Pa /var/db/zoneinfo +saved name of the timezone file installed last. .El +.Sh EXAMPLES +Normal usage, to select the right zoneinfo file via the dialog-based +user interface: +.Dl # tzsetup +Install the file +.Pa /usr/share/zoneinfo/Australia/Sydney : +.Dl # tzsetup /usr/share/zoneinfo/Australia/Sydney +Install the zoneinfo file for Australia/Sydney, assumed to be located +in +.Pa /usr/share/zoneinfo : +.Dl # tzsetup Australia/Sydney +After a reinstall of the zoneinfo files, you can reinstall the +latest installed zoneinfo file: (as specified in +.Pa /var/db/zoneinfo ) +.Dl # tzsetup -r .Sh SEE ALSO .Xr date 1 , .Xr adjtime 2 , diff --git a/usr.sbin/tzsetup/tzsetup.c b/usr.sbin/tzsetup/tzsetup.c index 66a34c4d2f7b..0ab7a2b519e2 100644 --- a/usr.sbin/tzsetup/tzsetup.c +++ b/usr.sbin/tzsetup/tzsetup.c @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -52,9 +53,17 @@ __FBSDID("$FreeBSD$"); #define _PATH_ISO3166 "/usr/share/misc/iso3166" #define _PATH_ZONEINFO "/usr/share/zoneinfo" #define _PATH_LOCALTIME "/etc/localtime" +#define _PATH_DB "/var/db/zoneinfo" #define _PATH_WALL_CMOS_CLOCK "/etc/wall_cmos_clock" +static char path_zonetab[MAXPATHLEN], path_iso3166[MAXPATHLEN], + path_zoneinfo[MAXPATHLEN], path_localtime[MAXPATHLEN], + path_db[MAXPATHLEN], path_wall_cmos_clock[MAXPATHLEN]; + static int reallydoit = 1; +static int reinstall = 0; +static int usedialog = 1; +static char *chrootenv = NULL; static void usage(void); static int continent_country_menu(dialogMenuItem *); @@ -193,15 +202,15 @@ read_iso3166_table(void) char *s, *t, *name; int lineno; - fp = fopen(_PATH_ISO3166, "r"); + fp = fopen(path_iso3166, "r"); if (!fp) - err(1, _PATH_ISO3166); + err(1, path_iso3166); lineno = 0; while ((s = fgetln(fp, &len)) != 0) { lineno++; if (s[len - 1] != '\n') - errx(1, _PATH_ISO3166 ":%d: invalid format", lineno); + errx(1, "%s:%d: invalid format", path_iso3166, lineno); s[len - 1] = '\0'; if (s[0] == '#' || strspn(s, " \t") == len - 1) continue; @@ -209,26 +218,25 @@ read_iso3166_table(void) /* Isolate the two-letter code. */ t = strsep(&s, "\t"); if (t == 0 || strlen(t) != 2) - errx(1, _PATH_ISO3166 ":%d: invalid format", lineno); + errx(1, "%s:%d: invalid format", path_iso3166, lineno); if (t[0] < 'A' || t[0] > 'Z' || t[1] < 'A' || t[1] > 'Z') - errx(1, _PATH_ISO3166 ":%d: invalid code `%s'", + errx(1, "%s:%d: invalid code `%s'", path_iso3166, lineno, t); /* Now skip past the three-letter and numeric codes. */ name = strsep(&s, "\t"); /* 3-let */ if (name == 0 || strlen(name) != 3) - errx(1, _PATH_ISO3166 ":%d: invalid format", lineno); + errx(1, "%s:%d: invalid format", path_iso3166, lineno); name = strsep(&s, "\t"); /* numeric */ if (name == 0 || strlen(name) != 3) - errx(1, _PATH_ISO3166 ":%d: invalid format", lineno); + errx(1, "%s:%d: invalid format", path_iso3166, lineno); name = s; cp = &countries[CODE2INT(t)]; if (cp->name) - errx(1, _PATH_ISO3166 - ":%d: country code `%s' multiply defined: %s", - lineno, t, cp->name); + errx(1, "%s:%d: country code `%s' multiply defined: %s", + path_iso3166, lineno, t, cp->name); cp->name = strdup(name); if (cp->name == NULL) errx(1, "malloc failed"); @@ -248,18 +256,18 @@ add_zone_to_country(int lineno, const char *tlc, const char *descr, struct country *cp; if (tlc[0] < 'A' || tlc[0] > 'Z' || tlc[1] < 'A' || tlc[1] > 'Z') - errx(1, _PATH_ZONETAB ":%d: country code `%s' invalid", + errx(1, "%s:%d: country code `%s' invalid", path_zonetab, lineno, tlc); cp = &countries[CODE2INT(tlc)]; if (cp->name == 0) - errx(1, _PATH_ZONETAB ":%d: country code `%s' unknown", + errx(1, "%s:%d: country code `%s' unknown", path_zonetab, lineno, tlc); if (descr) { if (cp->nzones < 0) - errx(1, _PATH_ZONETAB - ":%d: conflicting zone definition", lineno); + errx(1, "%s:%d: conflicting zone definition", + path_zonetab, lineno); zp = malloc(sizeof(*zp)); if (zp == 0) @@ -279,11 +287,11 @@ add_zone_to_country(int lineno, const char *tlc, const char *descr, cp->nzones++; } else { if (cp->nzones > 0) - errx(1, _PATH_ZONETAB - ":%d: zone must have description", lineno); + errx(1, "%s:%d: zone must have description", + path_zonetab, lineno); if (cp->nzones < 0) - errx(1, _PATH_ZONETAB - ":%d: zone multiply defined", lineno); + errx(1, "%s:%d: zone multiply defined", + path_zonetab, lineno); cp->nzones = -1; cp->filename = strdup(file); if (cp->filename == NULL) @@ -333,34 +341,34 @@ read_zones(void) char *line, *tlc, *coord, *file, *descr, *p; int lineno; - fp = fopen(_PATH_ZONETAB, "r"); + fp = fopen(path_zonetab, "r"); if (!fp) - err(1, _PATH_ZONETAB); + err(1, path_zonetab); lineno = 0; while ((line = fgetln(fp, &len)) != 0) { lineno++; if (line[len - 1] != '\n') - errx(1, _PATH_ZONETAB ":%d: invalid format", lineno); + errx(1, "%s:%d: invalid format", path_zonetab, lineno); line[len - 1] = '\0'; if (line[0] == '#') continue; tlc = strsep(&line, "\t"); if (strlen(tlc) != 2) - errx(1, _PATH_ZONETAB ":%d: invalid country code `%s'", - lineno, tlc); + errx(1, "%s:%d: invalid country code `%s'", + path_zonetab, lineno, tlc); coord = strsep(&line, "\t"); file = strsep(&line, "\t"); p = strchr(file, '/'); if (p == 0) - errx(1, _PATH_ZONETAB ":%d: invalid zone name `%s'", + errx(1, "%s:%d: invalid zone name `%s'", path_zonetab, lineno, file); contbuf[0] = '\0'; strncat(contbuf, file, p - file); cont = find_continent(contbuf); if (!cont) - errx(1, _PATH_ZONETAB ":%d: invalid region `%s'", + errx(1, "%s:%d: invalid region `%s'", path_zonetab, lineno, contbuf); descr = (line != NULL && *line != '\0') ? line : NULL; @@ -495,7 +503,7 @@ set_zone_menu(dialogMenuItem *dmi) } static int -install_zone_file(const char *filename) +install_zoneinfo_file(const char *zoneinfo_file) { char buf[1024]; char title[64], prompt[64]; @@ -503,7 +511,7 @@ install_zone_file(const char *filename) ssize_t len; int fd1, fd2, copymode; - if (lstat(_PATH_LOCALTIME, &sb) < 0) { + if (lstat(path_localtime, &sb) < 0) { /* Nothing there yet... */ copymode = 1; } else if (S_ISLNK(sb.st_mode)) @@ -514,35 +522,44 @@ install_zone_file(const char *filename) #ifdef VERBOSE if (copymode) snprintf(prompt, sizeof(prompt), - "Copying %s to " _PATH_LOCALTIME, filename); + "Copying %s to %s", zoneinfo_file, path_localtime); else snprintf(prompt, sizeof(prompt), - "Creating symbolic link " _PATH_LOCALTIME " to %s", - filename); - dialog_notify(prompt); + "Creating symbolic link %s to %s", + path_localtime, zoneinfo_file); + if (usedialog) + dialog_notify(prompt); + else + fprintf(stderr, "%s\n", prompt); #endif if (reallydoit) { if (copymode) { - fd1 = open(filename, O_RDONLY, 0); + fd1 = open(zoneinfo_file, O_RDONLY, 0); if (fd1 < 0) { snprintf(title, sizeof(title), "Error"); snprintf(prompt, sizeof(prompt), - "Could not open %s: %s", filename, + "Could not open %s: %s", zoneinfo_file, strerror(errno)); - dialog_mesgbox(title, prompt, 8, 72); + if (usedialog) + dialog_mesgbox(title, prompt, 8, 72); + else + fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); } - unlink(_PATH_LOCALTIME); - fd2 = open(_PATH_LOCALTIME, O_CREAT | O_EXCL | O_WRONLY, + unlink(path_localtime); + fd2 = open(path_localtime, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IRGRP | S_IROTH); if (fd2 < 0) { snprintf(title, sizeof(title), "Error"); snprintf(prompt, sizeof(prompt), - "Could not open " _PATH_LOCALTIME ": %s", - strerror(errno)); - dialog_mesgbox(title, prompt, 8, 72); + "Could not open %s: %s", + path_localtime, strerror(errno)); + if (usedialog) + dialog_mesgbox(title, prompt, 8, 72); + else + fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); } @@ -552,32 +569,41 @@ install_zone_file(const char *filename) if (len == -1) { snprintf(title, sizeof(title), "Error"); snprintf(prompt, sizeof(prompt), - "Error copying %s to " _PATH_LOCALTIME - ": %s", filename, strerror(errno)); - dialog_mesgbox(title, prompt, 8, 72); + "Error copying %s to %s %s", zoneinfo_file, + path_localtime, strerror(errno)); + if (usedialog) + dialog_mesgbox(title, prompt, 8, 72); + else + fprintf(stderr, "%s\n", prompt); /* Better to leave none than a corrupt one. */ - unlink(_PATH_LOCALTIME); + unlink(path_localtime); return (DITEM_FAILURE | DITEM_RECREATE); } close(fd1); close(fd2); } else { - if (access(filename, R_OK) != 0) { + if (access(zoneinfo_file, R_OK) != 0) { snprintf(title, sizeof(title), "Error"); snprintf(prompt, sizeof(prompt), - "Cannot access %s: %s", filename, + "Cannot access %s: %s", zoneinfo_file, strerror(errno)); - dialog_mesgbox(title, prompt, 8, 72); + if (usedialog) + dialog_mesgbox(title, prompt, 8, 72); + else + fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); } - unlink(_PATH_LOCALTIME); - if (symlink(filename, _PATH_LOCALTIME) < 0) { + unlink(path_localtime); + if (symlink(zoneinfo_file, path_localtime) < 0) { snprintf(title, sizeof(title), "Error"); snprintf(prompt, sizeof(prompt), - "Cannot create symbolic link " - _PATH_LOCALTIME " to %s: %s", filename, + "Cannot create symbolic link %s to %s: %s", + path_localtime, zoneinfo_file, strerror(errno)); - dialog_mesgbox(title, prompt, 8, 72); + if (usedialog) + dialog_mesgbox(title, prompt, 8, 72); + else + fprintf(stderr, "%s\n", prompt); return (DITEM_FAILURE | DITEM_RECREATE); } } @@ -587,16 +613,40 @@ install_zone_file(const char *filename) snprintf(title, sizeof(title), "Done"); if (copymode) snprintf(prompt, sizeof(prompt), - "Copied timezone file from %s to " _PATH_LOCALTIME, - filename); + "Copied timezone file from %s to %s", zoneinfo_file, + path_localtime); else - snprintf(prompt, sizeof(prompt), "Created symbolic link from " - _PATH_LOCALTIME " to %s", filename); - dialog_mesgbox(title, prompt, 8, 72); + snprintf(prompt, sizeof(prompt), + "Created symbolic link from %s to %s", zoneinfo_file, + path_localtime); + if (usedialog) + dialog_mesgbox(title, prompt, 8, 72); + else + fprintf(stderr, "%s\n", prompt); #endif + return (DITEM_LEAVE_MENU); } +static int +install_zoneinfo(const char *zoneinfo) +{ + int rv; + FILE *f; + char path_zoneinfo_file[MAXPATHLEN]; + + sprintf(path_zoneinfo_file, "%s/%s", path_zoneinfo, zoneinfo); + rv = install_zoneinfo_file(path_zoneinfo_file); + + /* Save knowledge for later */ + if ((f = fopen(path_db, "w")) != NULL) { + fprintf(f, "%s\n", zoneinfo); + fclose(f); + } + + return (rv); +} + static int confirm_zone(const char *filename) { @@ -620,15 +670,12 @@ static int set_zone_multi(dialogMenuItem *dmi) { struct zone *zp = dmi->data; - char *fn; int rv; if (!confirm_zone(zp->filename)) return (DITEM_FAILURE | DITEM_RECREATE); - asprintf(&fn, "%s/%s", _PATH_ZONEINFO, zp->filename); - rv = install_zone_file(fn); - free(fn); + rv = install_zoneinfo(zp->filename); return (rv); } @@ -636,15 +683,12 @@ static int set_zone_whole_country(dialogMenuItem *dmi) { struct country *cp = dmi->data; - char *fn; int rv; if (!confirm_zone(cp->filename)) return (DITEM_FAILURE | DITEM_RECREATE); - asprintf(&fn, "%s/%s", _PATH_ZONEINFO, cp->filename); - rv = install_zone_file(fn); - free(fn); + rv = install_zoneinfo(cp->filename); return (rv); } @@ -652,7 +696,7 @@ static void usage(void) { - fprintf(stderr, "usage: tzsetup [-ns]\n"); + fprintf(stderr, "usage: tzsetup [-nrs] [zoneinfo file]\n"); exit(1); } @@ -666,14 +710,21 @@ int main(int argc, char **argv) { char title[64], prompt[128]; - int c, fd, skiputc; + int c, fd, rv, skiputc; skiputc = 0; - while ((c = getopt(argc, argv, "ns")) != -1) { + while ((c = getopt(argc, argv, "C:nrs")) != -1) { switch(c) { + case 'C': + chrootenv = optarg; + break; case 'n': reallydoit = 0; break; + case 'r': + reinstall = 1; + usedialog = 0; + break; case 's': skiputc = 1; break; @@ -685,6 +736,24 @@ main(int argc, char **argv) if (argc - optind > 1) usage(); + if (chrootenv == NULL) { + strcpy(path_zonetab, _PATH_ZONETAB); + strcpy(path_iso3166, _PATH_ISO3166); + strcpy(path_zoneinfo, _PATH_ZONEINFO); + strcpy(path_localtime, _PATH_LOCALTIME); + strcpy(path_db, _PATH_DB); + strcpy(path_wall_cmos_clock, _PATH_WALL_CMOS_CLOCK); + } else { + sprintf(path_zonetab, "%s/%s", chrootenv, _PATH_ZONETAB); + sprintf(path_iso3166, "%s/%s", chrootenv, _PATH_ISO3166); + sprintf(path_zoneinfo, "%s/%s", chrootenv, _PATH_ZONEINFO); + sprintf(path_localtime, "%s/%s", chrootenv, _PATH_LOCALTIME); + sprintf(path_db, "%s/%s", chrootenv, _PATH_DB); + sprintf(path_wall_cmos_clock, "%s/%s", chrootenv, + _PATH_WALL_CMOS_CLOCK); + } + + /* Override the user-supplied umask. */ (void)umask(S_IWGRP | S_IWOTH); @@ -693,6 +762,54 @@ main(int argc, char **argv) sort_countries(); make_menus(); + if (reinstall == 1) { + FILE *f; + char zonefile[MAXPATHLEN]; + char path_db[MAXPATHLEN]; + + zonefile[0] = '\0'; + path_db[0] = '\0'; + if (chrootenv != NULL) { + sprintf(zonefile, "%s/", chrootenv); + sprintf(path_db, "%s/", chrootenv); + } + strcat(zonefile, _PATH_ZONEINFO); + strcat(zonefile, "/"); + strcat(path_db, _PATH_DB); + + if ((f = fopen(path_db, "r")) != NULL) { + if (fgets(zonefile, sizeof(zonefile), f) != NULL) { + zonefile[sizeof(zonefile) - 1] = 0; + if (strlen(zonefile) > 0) { + zonefile[strlen(zonefile) - 1] = 0; + rv = install_zoneinfo(zonefile); + exit(rv & ~DITEM_LEAVE_MENU); + } + errx(1, "Error reading %s.\n", path_db); + } + fclose(f); + errx(1, + "Unable to determine earlier installed zoneinfo " + "file. Check %s", path_db); + } + errx(1, "Cannot open %s for reading. Does it exist?", path_db); + } + + /* + * If the arguments on the command-line do not specify a file, + * then interpret it as a zoneinfo name + */ + if (optind == argc - 1) { + struct stat sb; + + if (stat(argv[optind], &sb) != 0) { + usedialog = 0; + rv = install_zoneinfo(argv[optind]); + exit(rv & ~DITEM_LEAVE_MENU); + } + /* FALLTHROUGH */ + } + init_dialog(); if (skiputc == 0) { snprintf(title, sizeof(title), @@ -709,9 +826,11 @@ main(int argc, char **argv) fd = open(_PATH_WALL_CMOS_CLOCK, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IRGRP | S_IROTH); - if (fd < 0) + if (fd < 0) { + end_dialog(); err(1, "create %s", _PATH_WALL_CMOS_CLOCK); + } close(fd); } } @@ -722,10 +841,10 @@ main(int argc, char **argv) snprintf(prompt, sizeof(prompt), "\nUse the default `%s' zone?", argv[optind]); if (!dialog_yesno(title, prompt, 7, 72)) { - install_zone_file(argv[optind]); + rv = install_zoneinfo_file(argv[optind]); dialog_clear(); end_dialog(); - return (0); + exit(rv & ~DITEM_LEAVE_MENU); } dialog_clear_norefresh(); } diff --git a/usr.sbin/uathload/Makefile b/usr.sbin/uathload/Makefile index 3083704d3bb7..4f9b99d6b185 100644 --- a/usr.sbin/uathload/Makefile +++ b/usr.sbin/uathload/Makefile @@ -5,8 +5,6 @@ MAN= uathload.8 SRCS= uathload.c ar5523.bin -WARNS?= 4 - CLEANFILES= ar5523.bin ar5523.bin: ${.CURDIR}/../../sys/contrib/dev/uath/ar5523.bin.uu diff --git a/usr.sbin/uhsoctl/Makefile b/usr.sbin/uhsoctl/Makefile new file mode 100644 index 000000000000..97049237fffa --- /dev/null +++ b/usr.sbin/uhsoctl/Makefile @@ -0,0 +1,10 @@ +# $FreeBSD$ + +PROG= uhsoctl +MAN= uhsoctl.1 +WARNS= 1 + +DPADD= ${LIBUTIL} +LDADD= -lutil + +.include diff --git a/usr.sbin/uhsoctl/uhsoctl.1 b/usr.sbin/uhsoctl/uhsoctl.1 new file mode 100644 index 000000000000..932cefa92610 --- /dev/null +++ b/usr.sbin/uhsoctl/uhsoctl.1 @@ -0,0 +1,104 @@ +.\" Copyright (c) 2008-2009 Fredrik Lindberg +.\" 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 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$ +.\" +.Dd Aug 12, 2009 +.Os +.Dt UHSOCTL 1 +.Sh NAME +.Nm uhsoctl +.Nd connection utility for Option based devices +.Sh SYNOPSIS +.Nm +.Op Fl a Ar apn +.Op Fl c Ar cid +.Op Fl p Ar pin +.Op Fl u Ar username +.Op Fl k Ar password +.Op Fl r Ar path +.Op Fl f Ar path +.Op Fl b | n +.Ar interface +.Nm +.Fl d +.Ar interface +.Nm +.Fl h +.Sh DESCRIPTION +.Nm +is a small connection utility for Option N.V. devices that are based on Options +packet interface and uses proprietary AT_* calls to establish connections. +The utility (tries to) configure both default route and name servers +(/etc/resolv.conf). +.Pp +By default +.Nm +detaches from the terminal upon on a successful connection, a few command-line +options exists that allows this behavior to be changed. +.Pp +.Nm +attempts to find a usable controlling serial port based on the provided network +interface. +If this fails you might specify a serial port manually. +.Sh OPTIONS +.Bl -tag -width XXXX +.It Fl a Ar apn +Specify APN to connect to. +.It Fl c Ar cid +Specify CID (Context ID) to use, by default CID 1 is used. +If an APN has been configured once, it's enough to specify the CID used for +further accesses. +.It Fl p Ar pin +Specify SIM PIN. +.It Fl u Ar username +Specify username. +.It Fl k Ar password +Specify username. +.It Fl r Ar path +Path to resolv.conf, default /etc/resolv.conf. +Use /dev/null to disable updating of name servers. +.It Fl f Ar path +Explicitly set the serial port to use as controlling terminal. +Might be needed if the automatic detection fails. +.It Fl b +Fork into background directly, before a connection has been established. +.It Fl n +Never fork into background, run entirely in foreground. +.El +.Sh EXAMPLES +Connect to +.Dq Li apn.example.com +on interface +.Dq Li uhso0 +and use PIN +.Dq 1234 +to enable the SIM card. + +.Dl "uhsoctl -a apn.example.com -p 1234 uhso0" + +Disconnect from a previously established connection + +.Dl "uhsoctl -d uhso0" +.Sh SEE ALSO +.Xr uhso 4 diff --git a/usr.sbin/uhsoctl/uhsoctl.c b/usr.sbin/uhsoctl/uhsoctl.c new file mode 100644 index 000000000000..6ed524544daa --- /dev/null +++ b/usr.sbin/uhsoctl/uhsoctl.c @@ -0,0 +1,1532 @@ +/*- + * Copyright (c) 2008-2009 Fredrik Lindberg + * 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 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Connection utility to ease connectivity using the raw IP packet interface + * available on uhso(4) devices. + */ + +#define TTY_NAME "/dev/%s" +#define SYSCTL_TEST "dev.uhso.%d.%%driver" +#define SYSCTL_PORTS "dev.uhso.%d.ports" +#define SYSCTL_NETIF "dev.uhso.%d.netif" +#define SYSCTL_NAME_TTY "dev.uhso.%d.port.%s.tty" +#define SYSCTL_NAME_DESC "dev.uhso.%d.port.%s.desc" +#define RESOLV_PATH "/etc/resolv.conf" +#define PIDFILE "/var/run/uhsoctl.%s.pid" + +static const char *network_access_type[] = { + "GSM", + "Compact GSM", + "UMTS", + "GSM (EGPRS)", + "HSDPA", + "HSUPA", + "HSDPA/HSUPA" +}; + +static const char *network_reg_status[] = { + "Not registered", + "Registered", + "Searching for network", + "Network registration denied", + "Unknown", + "Registered (roaming)" +}; + +struct ctx { + int fd; + int flags; +#define IPASSIGNED 0x01 +#define FLG_NODAEMON 0x02 /* Don't detach from terminal */ +#define FLG_DAEMON 0x04 /* Running as daemon */ +#define FLG_DELAYED 0x08 /* Fork into background after connect */ +#define FLG_NEWDATA 0x10 +#define FLG_WATCHDOG 0x20 /* Watchdog enabled */ +#define FLG_WDEXP 0x40 /* Watchdog expired */ + const char *ifnam; + const char *pin; /* device PIN */ + + char pidfile[128]; + struct pidfh *pfh; + + time_t watchdog; + + /* PDP context settings */ + int pdp_ctx; + const char *pdp_apn; + const char *pdp_user; + const char *pdp_pwd; + + /* Connection status */ + int con_status; /* Connected? */ + char *con_apn; /* Connected APN */ + char *con_oper; /* Operator name */ + int con_net_stat; /* Network connection status */ + int con_net_type; /* Network connection type */ + + /* Misc. status */ + int dbm; + + /* IP and nameserver settings */ + struct in_addr ip; + char **ns; + const char *resolv_path; + char *resolv; /* Old resolv.conf */ + size_t resolv_sz; +}; + +static int readline_buf(const char *, const char *, char *, size_t); +static int readline(int, char *, size_t); +static void daemonize(struct ctx *); + +static int at_cmd_async(int, const char *, ...); + +typedef union { + void *ptr; + uint32_t int32; +} resp_data; +typedef struct { + resp_data val[2]; +} resp_arg; +typedef void (*resp_cb)(resp_arg *, const char *, const char *); + +typedef void (*async_cb)(void *, const char *); +struct async_handle { + const char *cmd; + async_cb func; +}; + +static void at_async_creg(void *, const char *); +static void at_async_cgreg(void *, const char *); +static void at_async_cops(void *, const char *); +static void at_async_owancall(void *, const char *); +static void at_async_owandata(void *, const char *); +static void at_async_csq(void *, const char *); + +static struct async_handle async_cmd[] = { + { "+CREG", at_async_creg }, + { "+CGREG", at_async_cgreg }, + { "+COPS", at_async_cops }, + { "+CSQ", at_async_csq }, + { "_OWANCALL", at_async_owancall }, + { "_OWANDATA", at_async_owandata }, + { NULL, NULL } +}; + +struct timer_entry; +struct timers { + TAILQ_HEAD(, timer_entry) head; + int res; +}; + +typedef void (*tmr_cb)(int, void *); +struct timer_entry { + TAILQ_ENTRY(timer_entry) next; + int id; + int timeout; + tmr_cb func; + void *arg; +}; + + +static struct timers timers; +static volatile int running = 1; +static int syslog_open = 0; +static char syslog_title[64]; + +/* Periodic timer, runs ready timer tasks every tick */ +static void +tmr_run(struct timers *tmrs) +{ + struct timer_entry *te, *te2; + + te = TAILQ_FIRST(&tmrs->head); + if (te == NULL) + return; + + te->timeout -= tmrs->res; + while (te->timeout <= 0) { + te2 = TAILQ_NEXT(te, next); + TAILQ_REMOVE(&tmrs->head, te, next); + if (te2 != NULL) + te2->timeout -= tmrs->res; + + te->func(te->id, te->arg); + free(te); + te = te2; + if (te == NULL) + break; + } +} + +/* Add a new timer */ +static void +tmr_add(struct timers *tmrs, int id, int timeout, tmr_cb func, void *arg) +{ + struct timer_entry *te, *te2, *te3; + + te = malloc(sizeof(struct timer_entry)); + memset(te, 0, sizeof(struct timer_entry)); + + te->timeout = timeout; + te->func = func; + te->arg = arg; + te->id = id; + + te2 = TAILQ_FIRST(&tmrs->head); + + if (TAILQ_EMPTY(&tmrs->head)) { + TAILQ_INSERT_HEAD(&tmrs->head, te, next); + } else if (te->timeout < te2->timeout) { + te2->timeout -= te->timeout; + TAILQ_INSERT_HEAD(&tmrs->head, te, next); + } else { + while (te->timeout >= te2->timeout) { + te->timeout -= te2->timeout; + te3 = TAILQ_NEXT(te2, next); + if (te3 == NULL || te3->timeout > te->timeout) + break; + te2 = te3; + } + TAILQ_INSERT_AFTER(&tmrs->head, te2, te, next); + } +} + +#define watchdog_enable(ctx) (ctx)->flags |= FLG_WATCHDOG +#define watchdog_disable(ctx) (ctx)->flags &= ~FLG_WATCHDOG + +static void +watchdog_reset(struct ctx *ctx, int timeout) +{ + struct timespec tp; + + clock_gettime(CLOCK_MONOTONIC, &tp), + ctx->watchdog = tp.tv_sec + timeout; + + watchdog_enable(ctx); +} + +static void +tmr_creg(int id, void *arg) +{ + struct ctx *ctx = arg; + + at_cmd_async(ctx->fd, "AT+CREG?\r\n"); + watchdog_reset(ctx, 10); +} + +static void +tmr_cgreg(int id, void *arg) +{ + struct ctx *ctx = arg; + + at_cmd_async(ctx->fd, "AT+CGREG?\r\n"); + watchdog_reset(ctx, 10); +} + +static void +tmr_status(int id, void *arg) +{ + struct ctx *ctx = arg; + + at_cmd_async(ctx->fd, "AT+CSQ\r\n"); + watchdog_reset(ctx, 10); +} + +static void +tmr_watchdog(int id, void *arg) +{ + struct ctx *ctx = arg; + pid_t self; + struct timespec tp; + + tmr_add(&timers, 1, 5, tmr_watchdog, ctx); + + if (!(ctx->flags & FLG_WATCHDOG)) + return; + + clock_gettime(CLOCK_MONOTONIC, &tp); + + if (tp.tv_sec >= ctx->watchdog) { +#ifdef DEBUG + fprintf(stderr, "Watchdog expired\n"); +#endif + ctx->flags |= FLG_WDEXP; + self = getpid(); + kill(self, SIGHUP); + } +} + +static void +sig_handle(int sig) +{ + + switch (sig) { + case SIGHUP: + case SIGINT: + case SIGQUIT: + case SIGTERM: + running = 0; + break; + case SIGALRM: + tmr_run(&timers); + break; + } +} + +static void +logger(int pri, const char *fmt, ...) +{ + char *buf; + va_list ap; + + va_start(ap, fmt); + vasprintf(&buf, fmt, ap); + if (syslog_open) + syslog(pri, buf); + else { + switch (pri) { + case LOG_INFO: + case LOG_NOTICE: + printf("%s\n", buf); + break; + default: + fprintf(stderr, "%s: %s\n", getprogname(), buf); + break; + } + } + + free(buf); + va_end(ap); +} + +/* Add/remove IP address from an interface */ +static int +ifaddr_ad(int d, const char *ifnam, struct sockaddr *sa, struct sockaddr *mask) +{ + struct ifaliasreq req; + int fd, error; + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + return (-1); + + memset(&req, 0, sizeof(struct ifaliasreq)); + strlcpy(req.ifra_name, ifnam, sizeof(req.ifra_name)); + memcpy(&req.ifra_addr, sa, sa->sa_len); + memcpy(&req.ifra_mask, mask, mask->sa_len); + + error = ioctl(fd, d, (char *)&req); + close(fd); + return (error); +} + +#define if_ifup(ifnam) if_setflags(ifnam, IFF_UP) +#define if_ifdown(ifnam) if_setflags(ifnam, -IFF_UP) + +static int +if_setflags(const char *ifnam, int flags) +{ + struct ifreq ifr; + int fd, error; + unsigned int oflags = 0; + + memset(&ifr, 0, sizeof(struct ifreq)); + strlcpy(ifr.ifr_name, ifnam, sizeof(ifr.ifr_name)); + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + return (-1); + + error = ioctl(fd, SIOCGIFFLAGS, &ifr); + if (error == 0) { + oflags = (ifr.ifr_flags & 0xffff) | (ifr.ifr_flagshigh << 16); + } + + if (flags < 0) + oflags &= ~(-flags); + else + oflags |= flags; + + ifr.ifr_flags = oflags & 0xffff; + ifr.ifr_flagshigh = oflags >> 16; + + error = ioctl(fd, SIOCSIFFLAGS, &ifr); + if (error != 0) + warn("ioctl SIOCSIFFLAGS"); + + close(fd); + return (error); +} + +static int +ifaddr_add(const char *ifnam, struct sockaddr *sa, struct sockaddr *mask) +{ + int error; + + error = ifaddr_ad(SIOCAIFADDR, ifnam, sa, mask); + if (error != 0) + warn("ioctl SIOCAIFADDR"); + return (error); +} + +static int +ifaddr_del(const char *ifnam, struct sockaddr *sa, struct sockaddr *mask) +{ + int error; + + error = ifaddr_ad(SIOCDIFADDR, ifnam, sa, mask); + if (error != 0) + warn("ioctl SIOCDIFADDR"); + return (error); +} + +static int +set_nameservers(struct ctx *ctx, const char *respath, int ns, ...) +{ + int i, n, fd; + FILE *fp; + char *p; + va_list ap; + struct stat sb; + char buf[512]; + + if (ctx->ns != NULL) { + for (i = 0; ctx->ns[i] != NULL; i++) { + free(ctx->ns[i]); + } + free(ctx->ns); + } + + fd = open(respath, O_RDWR | O_CREAT | O_NOFOLLOW); + if (fd < 0) + return (-1); + + if (ns == 0) { + /* Attempt to restore old resolv.conf */ + if (ctx->resolv != NULL) { + ftruncate(fd, 0); + lseek(fd, 0, SEEK_SET); + write(fd, ctx->resolv, ctx->resolv_sz); + free(ctx->resolv); + ctx->resolv = NULL; + ctx->resolv_sz = 0; + } + close(fd); + return (0); + } + + + ctx->ns = malloc(sizeof(char *) * (ns + 1)); + if (ctx->ns == NULL) { + close(fd); + return (-1); + } + + va_start(ap, ns); + for (i = 0; i < ns; i++) { + p = va_arg(ap, char *); + ctx->ns[i] = strdup(p); + } + ctx->ns[i] = NULL; + va_end(ap); + + /* Attempt to backup the old resolv.conf */ + if (ctx->resolv == NULL) { + i = fstat(fd, &sb); + if (i == 0 && sb.st_size != 0) { + ctx->resolv_sz = sb.st_size; + ctx->resolv = malloc(sb.st_size); + if (ctx->resolv != NULL) { + n = read(fd, ctx->resolv, sb.st_size); + if (n != sb.st_size) { + free(ctx->resolv); + ctx->resolv = NULL; + } + } + } + } + + + ftruncate(fd, 0); + lseek(fd, 0, SEEK_SET); + fp = fdopen(fd, "w"); + + /* + * Write back everything other than nameserver entries to the + * new resolv.conf + */ + if (ctx->resolv != NULL) { + p = ctx->resolv; + while ((i = readline_buf(p, ctx->resolv + ctx->resolv_sz, buf, + sizeof(buf))) > 0) { + p += i; + if (strncasecmp(buf, "nameserver", 10) == 0) + continue; + fprintf(fp, "%s", buf); + } + } + + for (i = 0; ctx->ns[i] != NULL; i++) { + fprintf(fp, "nameserver %s\n", ctx->ns[i]); + } + fclose(fp); + return (0); +} + +/* Read a \n-terminated line from buffer */ +static int +readline_buf(const char *s, const char *e, char *buf, size_t bufsz) +{ + int pos = 0; + char *p = buf; + + for (; s < e; s++) { + *p = *s; + pos++; + if (pos >= (bufsz - 1)) + break; + if (*p++ == '\n') + break; + } + *p = '\0'; + return (pos); +} + +/* Read a \n-terminated line from file */ +static int +readline(int fd, char *buf, size_t bufsz) +{ + int n = 0, pos = 0; + char *p = buf; + + for (;;) { + n = read(fd, p, 1); + if (n <= 0) + break; + pos++; + if (pos >= (bufsz - 1)) + break; + if (*p++ == '\n') + break; + } + *p = '\0'; + return (n <= 0 ? n : pos); +} + +/* + * Synchronous AT command + */ +static int +at_cmd(struct ctx *ctx, const char *resp, resp_cb cb, resp_arg *ra, const char *cf, ...) +{ + size_t l; + int n, error, retval = 0; + va_list ap; + fd_set set; + char buf[512]; + char cmd[64]; + + va_start(ap, cf); + vsnprintf(cmd, sizeof(cmd), cf, ap); + va_end(ap); + +#ifdef DEBUG + fprintf(stderr, "SYNC_CMD: %s", cmd); +#endif + + l = strlen(cmd); + n = write(ctx->fd, cmd, l); + if (n <= 0) + return (-1); + + if (resp != NULL) { + l = strlen(resp); +#ifdef DEBUG + fprintf(stderr, "SYNC_EXP: %s (%d)\n", resp, l); +#endif + } + + for (;;) { + bzero(buf, sizeof(buf)); + + FD_ZERO(&set); + watchdog_reset(ctx, 5); + do { + FD_SET(ctx->fd, &set); + error = select(ctx->fd + 1, &set, NULL, NULL, NULL); + if (error < 0 && errno == EINTR && ctx->flags & FLG_WDEXP) { + watchdog_disable(ctx); + retval = -2; + break; + } + } while (error <= 0 && errno == EINTR); + + if (error <= 0) { + retval = -2; + break; + } + + n = readline(ctx->fd, buf, sizeof(buf)); + if (n <= 0) { + retval = -2; + break; + } + + if (strcmp(buf, "\r\n") == 0 || strcmp(buf, "\n") == 0) + continue; + +#ifdef DEBUG + fprintf(stderr, "SYNC_RESP: %s", buf); +#endif + + if (strncmp(buf, "OK", 2) == 0) { + break; + } + else if (strncmp(buf, "ERROR", 5) == 0) { + retval = -1; + break; + } + + if (resp != NULL) { + retval = strncmp(resp, buf, l); + if (retval == 0 && cb != NULL) { + cb(ra, cmd, buf); + } + } + } +#ifdef DEBUG + fprintf(stderr, "SYNC_RETVAL=%d\n", retval); +#endif + return (retval); +} + +static int +at_cmd_async(int fd, const char *cf, ...) +{ + size_t l; + va_list ap; + char cmd[64]; + + va_start(ap, cf); + vsnprintf(cmd, sizeof(cmd), cf, ap); + va_end(ap); + +#ifdef DEBUG + fprintf(stderr, "CMD: %s", cmd); +#endif + l = strlen(cmd); + return (write(fd, cmd, l)); +} + +static void +saveresp(resp_arg *ra, const char *cmd, const char *resp) +{ + char **buf; + int i = ra->val[1].int32; + + buf = realloc(ra->val[0].ptr, sizeof(char *) * (i + 1)); + if (buf == NULL) + return; + + buf[i] = strdup(resp); + + ra->val[0].ptr = buf; + ra->val[1].int32 = i + 1; +} + +static void +at_async_creg(void *arg, const char *resp) +{ + struct ctx *ctx = arg; + int n, reg; + + n = sscanf(resp, "+CREG: %*d,%d", ®); + if (n != 1) { + n = sscanf(resp, "+CREG: %d", ®); + if (n != 1) + return; + } + + if (ctx->con_net_stat != 1 && ctx->con_net_stat != 5) { + tmr_add(&timers, 1, 1, tmr_creg, ctx); + } + else { + tmr_add(&timers, 1, 30, tmr_creg, ctx); + } + + if (ctx->con_net_stat == reg) + return; + + ctx->con_net_stat = reg; + at_cmd_async(ctx->fd, "AT+COPS?\r\n"); +} + +static void +at_async_cgreg(void *arg, const char *resp) +{ + struct ctx *ctx = arg; + int n, reg; + + n = sscanf(resp, "+CGREG: %*d,%d", ®); + if (n != 1) { + n = sscanf(resp, "+CGREG: %d", ®); + if (n != 1) + return; + } + + if (ctx->con_net_stat != 1 && ctx->con_net_stat != 5) { + tmr_add(&timers, 1, 1, tmr_cgreg, ctx); + } + else { + tmr_add(&timers, 1, 30, tmr_cgreg, ctx); + } + + if (ctx->con_net_stat == reg) + return; + + ctx->con_net_stat = reg; + at_cmd_async(ctx->fd, "AT+COPS?\r\n"); +} + + +static void +at_async_cops(void *arg, const char *resp) +{ + struct ctx *ctx = arg; + int n, at; + char opr[64]; + + n = sscanf(resp, "+COPS: %*d,%*d,\"%[^\"]\",%d", + opr, &at); + if (n != 2) + return; + + if (ctx->con_oper != NULL) { + if (ctx->con_net_type == at && + strcasecmp(opr, ctx->con_oper) == 0) + return; + free(ctx->con_oper); + } + + ctx->con_oper = strdup(opr); + ctx->con_net_type = at; + + if (ctx->con_net_stat == 1 || ctx->con_net_stat == 5) { + logger(LOG_NOTICE, "%s to \"%s\" (%s)", + network_reg_status[ctx->con_net_stat], + ctx->con_oper, network_access_type[ctx->con_net_type]); + if (ctx->con_status != 1) { + at_cmd_async(ctx->fd, "AT_OWANCALL=%d,1,1\r\n", + ctx->pdp_ctx); + } + } + else { + logger(LOG_NOTICE, "%s (%s)", + network_reg_status[ctx->con_net_stat], + network_access_type[ctx->con_net_type]); + } +} + +/* + * Signal strength for pretty console output + * + * From 3GPP TS 27.007 V8.3.0, Section 8.5 + * 0 = -113 dBm or less + * 1 = -111 dBm + * 2...30 = -109...-53 dBm + * 31 = -51 dBm or greater + * + * So, dbm = (rssi * 2) - 113 +*/ +static void +at_async_csq(void *arg, const char *resp) +{ + struct ctx *ctx = arg; + int n, rssi; + + n = sscanf(resp, "+CSQ: %d,%*d", &rssi); + if (n != 1) + return; + if (rssi == 99) + ctx->dbm = 0; + else { + ctx->dbm = (rssi * 2) - 113; + tmr_add(&timers, 1, 15, tmr_status, ctx); + } + + ctx->flags |= FLG_NEWDATA; +} + +static void +at_async_owancall(void *arg, const char *resp) +{ + struct ctx *ctx = arg; + int n, i; + + n = sscanf(resp, "_OWANCALL: %*d,%d", &i); + if (n != 1) + return; + + if (i == ctx->con_status) + return; + + at_cmd_async(ctx->fd, "AT_OWANDATA=%d\r\n", ctx->pdp_ctx); + + ctx->con_status = i; + if (ctx->con_status == 1) { + logger(LOG_NOTICE, "Connected to \"%s\" (%s), %s", + ctx->con_oper, ctx->con_apn, + network_access_type[ctx->con_net_type]); + } + else { + logger(LOG_NOTICE, "Disconnected from \"%s\" (%s)", + ctx->con_oper, ctx->con_apn); + } +} + +static void +at_async_owandata(void *arg, const char *resp) +{ + struct ctx *ctx = arg; + char ip[40], ns1[40], ns2[40]; + int n, error, rs; + struct ifaddrs *ifap, *ifa; + struct sockaddr_in sin, mask; + struct sockaddr_dl sdl; + struct { + struct rt_msghdr rtm; + char buf[512]; + } r; + char *cp = r.buf; + + n = sscanf(resp, "_OWANDATA: %*d, %[^,], %*[^,], %[^,], %[^,]", + ip, ns1, ns2); + if (n != 3) + return; + + /* XXX: AF_INET assumption */ + + logger(LOG_NOTICE, "IP address: %s, Nameservers: %s, %s", ip, ns1, ns2); + + sin.sin_len = mask.sin_len = sizeof(struct sockaddr_in); + memset(&mask.sin_addr.s_addr, 0xff, sizeof(mask.sin_addr.s_addr)); + sin.sin_family = mask.sin_family = AF_INET; + + if (ctx->flags & IPASSIGNED) { + memcpy(&sin.sin_addr.s_addr, &ctx->ip.s_addr, + sizeof(sin.sin_addr.s_addr)); + ifaddr_del(ctx->ifnam, (struct sockaddr *)&sin, + (struct sockaddr *)&mask); + } + inet_pton(AF_INET, ip, &ctx->ip.s_addr); + memcpy(&sin.sin_addr.s_addr, &ctx->ip.s_addr, + sizeof(sin.sin_addr.s_addr)); + + error = ifaddr_add(ctx->ifnam, (struct sockaddr *)&sin, + (struct sockaddr *)&mask); + if (error != 0) { + logger(LOG_ERR, "failed to set ip-address"); + return; + } + + if_ifup(ctx->ifnam); + + ctx->flags |= IPASSIGNED; + + set_nameservers(ctx, ctx->resolv_path, 0); + error = set_nameservers(ctx, ctx->resolv_path, 2, ns1, ns2); + if (error != 0) { + logger(LOG_ERR, "failed to set nameservers"); + } + + error = getifaddrs(&ifap); + if (error != 0) { + logger(LOG_ERR, "getifaddrs: %s", strerror(errno)); + return; + } + + for (ifa = ifap; ifa; ifa = ifa->ifa_next) { + if (ifa->ifa_addr->sa_family != AF_LINK) + continue; + if (strcmp(ctx->ifnam, ifa->ifa_name) == 0) { + memcpy(&sdl, (struct sockaddr_dl *)ifa->ifa_addr, + sizeof(struct sockaddr_dl)); + break; + } + } + if (ifa == NULL) + return; + + rs = socket(PF_ROUTE, SOCK_RAW, 0); + if (rs < 0) { + logger(LOG_ERR, "socket PF_ROUTE: %s", strerror(errno)); + return; + } + + memset(&r, 0, sizeof(r)); + + r.rtm.rtm_version = RTM_VERSION; + r.rtm.rtm_type = RTM_ADD; + r.rtm.rtm_flags = RTF_UP | RTF_STATIC; + r.rtm.rtm_pid = getpid(); + memset(&sin, 0, sizeof(struct sockaddr_in)); + sin.sin_family = AF_INET; + sin.sin_len = sizeof(struct sockaddr_in); + + memcpy(cp, &sin, sin.sin_len); + cp += SA_SIZE(&sin); + memcpy(cp, &sdl, sdl.sdl_len); + cp += SA_SIZE(&sdl); + memcpy(cp, &sin, sin.sin_len); + r.rtm.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK; + r.rtm.rtm_msglen = sizeof(r); + + n = write(rs, &r, r.rtm.rtm_msglen); + if (n != r.rtm.rtm_msglen) { + r.rtm.rtm_type = RTM_DELETE; + n = write(rs, &r, r.rtm.rtm_msglen); + r.rtm.rtm_type = RTM_ADD; + n = write(rs, &r, r.rtm.rtm_msglen); + } + + if (n != r.rtm.rtm_msglen) { + logger(LOG_ERR, "failed to set default route: %s", + strerror(errno)); + } + close(rs); + + /* Delayed daemonization */ + if ((ctx->flags & FLG_DELAYED) && !(ctx->flags & FLG_NODAEMON)) + daemonize(ctx); +} + +static int +at_async(struct ctx *ctx, void *arg) +{ + int n, i; + size_t l; + char buf[512]; + + watchdog_reset(ctx, 15); + + bzero(buf, sizeof(buf)); + n = readline(ctx->fd, buf, sizeof(buf)); + if (n <= 0) + return (n <= 0 ? -1 : 0); + +#ifdef DEBUG + fprintf(stderr, "AT_ASYNC_RESP: %s", buf); +#endif + for (i = 0; async_cmd[i].cmd != NULL; i++) { + l = strlen(async_cmd[i].cmd); + if (strncmp(buf, async_cmd[i].cmd, l) == 0) { + async_cmd[i].func(arg, buf); + } + } + return (0); +} + +static const char *port_type_list[] = { + "control", "application", "application2", NULL +}; + +/* + * Attempts to find a list of control tty for the interface + * FreeBSD attaches USb devices per interface so we have to go through + * hoops to find which ttys that belong to our network interface. + */ +static char ** +get_tty(struct ctx *ctx) +{ + char buf[64]; + char data[128]; + size_t len; + int error; + unsigned int i; + char **list = NULL; + int list_size = 0; + const char **p; + + for (i = 0; ; i++) { + /* Basic test to check if we're even in the right ballpark */ + snprintf(buf, 64, SYSCTL_TEST, i); + len = 127; + error = sysctlbyname(buf, data, &len, NULL, 0); +#ifdef DEBUG + fprintf(stderr, "sysctl %s returned(%d): %s\n", + buf, error, error == 0 ? data : "FAILED"); +#endif + if (error < 0) + return NULL; + if (strcasecmp(data, "uhso") != 0) + return NULL; + + /* Check for interface */ + snprintf(buf, 64, SYSCTL_NETIF, i); + len = 127; + error = sysctlbyname(buf, data, &len, NULL, 0); +#ifdef DEBUG + fprintf(stderr, "sysctl %s returned(%d): %s\n", + buf, error, error == 0 ? data : "FAILED"); +#endif + if (error < 0) + continue; + + if (strcasecmp(data, ctx->ifnam) != 0) + continue; +#ifdef DEBUG + fprintf(stderr, "Found %s at %s\n", ctx->ifnam, buf); +#endif + break; + } + + /* Add multiplexed ports */ + for (p = port_type_list; *p != NULL; p++) { + snprintf(buf, 64, SYSCTL_NAME_TTY, i, *p); + len = 127; + error = sysctlbyname(buf, data, &len, NULL, 0); +#ifdef DEBUG + fprintf(stderr, "sysctl %s returned(%d): %s\n", + buf, error, error == 0 ? data : "FAILED"); +#endif + if (error == 0) { + list = realloc(list, (list_size + 1) * sizeof(char *)); + list[list_size] = malloc(strlen(data) + strlen(TTY_NAME)); + sprintf(list[list_size], TTY_NAME, data); + list_size++; + } + } + + /* + * We can return directly if we found multiplexed serial ports because + * devices with these ports only have additional diagnostic ports (useless) + * and modem ports (for used with pppd). + */ + if (list_size > 0) { + list = realloc(list, (list_size + 1) * sizeof(char *)); + list[list_size] = NULL; + return list; + } + + /* + * The network port is on a high numbered interface so we walk backwards until + * we hit anything other than application/control. + */ + + for (--i; i >= 0; i--) { + /* Basic test to check if we're even in the right ballpark */ + snprintf(buf, 64, SYSCTL_TEST, i); + len = 127; + error = sysctlbyname(buf, data, &len, NULL, 0); +#ifdef DEBUG + fprintf(stderr, "sysctl %s returned(%d): %s\n", + buf, error, error == 0 ? data : "FAILED"); +#endif + if (error < 0) + break; + if (strcasecmp(data, "uhso") != 0) + break; + + /* Test for useable ports */ + for (p = port_type_list; *p != NULL; p++) { + snprintf(buf, 64, SYSCTL_NAME_TTY, i, p); + len = 127; + error = sysctlbyname(buf, data, &len, NULL, 0); + if (error == 0) { + list = realloc(list, (list_size + 1) * sizeof(char *)); + list[list_size] = malloc(strlen(data) + strlen(TTY_NAME)); + sprintf(list[list_size], TTY_NAME, data); + list_size++; + } + } + + /* HACK! first port is a diagnostic port, we abort here */ + snprintf(buf, 64, SYSCTL_NAME_TTY, i, "diagnostic"); + len = 127; + error = sysctlbyname(buf, data, &len, NULL, 0); +#ifdef DEBUG + fprintf(stderr, "sysctl %s returned(%d): %s\n", + buf, error, error == 0 ? data : "FAILED"); +#endif + if (error == 0) + break; + } + + list = realloc(list, (list_size + 1) * sizeof(char *)); + list[list_size] = NULL; + return list; +} + +static int +do_connect(struct ctx *ctx, const char *tty) +{ + int i, error, needcfg; + resp_arg ra; + struct termios t; + char **buf; + +#ifdef DEBUG + fprintf(stderr, "Attempting to open %s\n", tty); +#endif + + ctx->fd = open(tty, O_RDWR); + if (ctx->fd < 0) { +#ifdef DEBUG + fprintf(stderr, "Failed to open %s\n", tty); +#endif + return (-1); + } + + tcgetattr(ctx->fd, &t); + t.c_oflag = 0; + t.c_iflag = 0; + t.c_cflag = CLOCAL | CREAD; + t.c_lflag = 0; + tcsetattr(ctx->fd, TCSAFLUSH, &t); + + error = at_cmd(ctx, NULL, NULL, NULL, "AT\r\n"); + if (error == -2) { + warnx("failed to read from device"); + return (-1); + } + + /* Check for PIN */ + error = at_cmd(ctx, "+CPIN: READY", NULL, NULL, "AT+CPIN?\r\n"); + if (error != 0) { + if (ctx->pin == NULL) { + errx(1, "device requires PIN"); + } + + error = at_cmd(ctx, NULL, NULL, NULL, "AT+CPIN=\"%s\"\r\n", + ctx->pin); + if (error != 0) { + errx(1, "wrong PIN"); + } + } + + /* + * Check if a PDP context has been configured and configure one + * if needed. + */ + ra.val[0].ptr = NULL; + ra.val[1].int32 = 0; + error = at_cmd(ctx, "+CGDCONT", saveresp, &ra, "AT+CGDCONT?\r\n"); + buf = ra.val[0].ptr; + needcfg = 1; + for (i = 0; i < ra.val[1].int32; i++) { + char apn[256]; + int cid; + error = sscanf(buf[i], "+CGDCONT: %d,\"%*[^\"]\",\"%[^\"]\"", + &cid, apn); + if (error != 2) { + free(buf[i]); + continue; + } + + if (cid == ctx->pdp_ctx) { + ctx->con_apn = strdup(apn); + if (ctx->pdp_apn != NULL) { + if (strcmp(apn, ctx->pdp_apn) == 0) + needcfg = 0; + } + else { + needcfg = 0; + } + } + free(buf[i]); + } + free(buf); + + if (needcfg) { + if (ctx->pdp_apn == NULL) + errx(1, "device is not configured and no APN given"); + + error = at_cmd(ctx, NULL, NULL, NULL, + "AT+CGDCONT=%d,,\"%s\"\r\n", ctx->pdp_ctx, ctx->pdp_apn); + if (error != 0) { + errx(1, "failed to configure device"); + } + ctx->con_apn = strdup(ctx->pdp_apn); + } + + if (ctx->pdp_user != NULL || ctx->pdp_pwd != NULL) { + at_cmd(ctx, NULL, NULL, NULL, + "AT$QCPDPP=%d,1,\"%s\",\"%s\"\r\n", ctx->pdp_ctx, + (ctx->pdp_user != NULL) ? ctx->pdp_user : "", + (ctx->pdp_pwd != NULL) ? ctx->pdp_pwd : ""); + } + + error = at_cmd(ctx, NULL, NULL, NULL, "AT_OWANCALL=%d,0,0\r\n", + ctx->pdp_ctx); + if (error != 0) + return (-1); + + at_cmd_async(ctx->fd, "AT+CGREG?\r\n"); + at_cmd_async(ctx->fd, "AT+CREG?\r\n"); + + tmr_add(&timers, 1, 5, tmr_status, ctx); + return (0); +} + +static void +do_disconnect(struct ctx *ctx) +{ + struct sockaddr_in sin, mask; + + /* Disconnect */ + at_cmd(ctx, NULL, NULL, NULL, "AT_OWANCALL=%d,0,0\r\n", + ctx->pdp_ctx); + close(ctx->fd); + + /* Remove ip-address from interface */ + if (ctx->flags & IPASSIGNED) { + sin.sin_len = mask.sin_len = sizeof(struct sockaddr_in); + memset(&mask.sin_addr.s_addr, 0xff, + sizeof(mask.sin_addr.s_addr)); + sin.sin_family = mask.sin_family = AF_INET; + memcpy(&sin.sin_addr.s_addr, &ctx->ip.s_addr, + sizeof(sin.sin_addr.s_addr)); + ifaddr_del(ctx->ifnam, (struct sockaddr *)&sin, + (struct sockaddr *)&mask); + + if_ifdown(ctx->ifnam); + ctx->flags &= ~IPASSIGNED; + } + + /* Attempt to reset resolv.conf */ + set_nameservers(ctx, ctx->resolv_path, 0); +} + +static void +daemonize(struct ctx *ctx) +{ + struct pidfh *pfh; + pid_t opid; + + snprintf(ctx->pidfile, 127, PIDFILE, ctx->ifnam); + + pfh = pidfile_open(ctx->pidfile, 0600, &opid); + if (pfh == NULL) { + warn("Cannot create pidfile %s", ctx->pidfile); + return; + } + + if (daemon(0, 0) == -1) { + warn("Cannot daemonize"); + pidfile_remove(pfh); + return; + } + + pidfile_write(pfh); + ctx->pfh = pfh; + ctx->flags |= FLG_DAEMON; + + snprintf(syslog_title, 63, "%s:%s", getprogname(), ctx->ifnam); + openlog(syslog_title, LOG_PID, LOG_USER); + syslog_open = 1; +} + +static void +send_disconnect(const char *ifnam) +{ + char pidfile[128]; + FILE *fp; + pid_t pid; + int n; + + snprintf(pidfile, 127, PIDFILE, ifnam); + fp = fopen(pidfile, "r"); + if (fp == NULL) { + warn("Cannot open %s", pidfile); + return; + } + + n = fscanf(fp, "%d", &pid); + fclose(fp); + if (n != 1) { + warnx("unable to read daemon pid"); + return; + } +#ifdef DEBUG + fprintf(stderr, "Sending SIGTERM to %d\n", pid); +#endif + kill(pid, SIGTERM); +} + +static void +usage(const char *exec) +{ + + printf("usage %s [-b] [-n] [-a apn] [-c cid] [-p pin] [-u username] " + "[-k password] [-r resolvpath] [-f tty] interface\n", exec); + printf("usage %s -d interface\n", exec); +} + +enum { + MODE_CONN, + MODE_DISC +}; + +int +main(int argc, char *argv[]) +{ + int ch, error, mode; + const char *ifnam = NULL; + char *tty = NULL; + char **p, **tty_list; + fd_set set; + struct ctx ctx; + struct itimerval it; + + TAILQ_INIT(&timers.head); + timers.res = 1; + + ctx.pdp_ctx = 1; + ctx.pdp_apn = ctx.pdp_user = ctx.pdp_pwd = NULL; + ctx.pin = NULL; + + ctx.con_status = 0; + ctx.con_apn = NULL; + ctx.con_oper = NULL; + ctx.con_net_stat = 0; + ctx.con_net_type = -1; + ctx.flags = 0; + ctx.resolv_path = RESOLV_PATH; + ctx.resolv = NULL; + ctx.ns = NULL; + ctx.dbm = 0; + + mode = MODE_CONN; + ctx.flags |= FLG_DELAYED; + + while ((ch = getopt(argc, argv, "?ha:p:c:u:k:r:f:dbn")) != -1) { + switch (ch) { + case 'a': + ctx.pdp_apn = argv[optind - 1]; + break; + case 'c': + ctx.pdp_ctx = strtol(argv[optind - 1], NULL, 10); + if (ctx.pdp_ctx < 1) { + warnx("Invalid context ID, defaulting to 1"); + ctx.pdp_ctx = 1; + } + break; + case 'p': + ctx.pin = argv[optind - 1]; + break; + case 'u': + ctx.pdp_user = argv[optind - 1]; + break; + case 'k': + ctx.pdp_pwd = argv[optind - 1]; + break; + case 'r': + ctx.resolv_path = argv[optind - 1]; + break; + case 'd': + mode = MODE_DISC; + break; + case 'b': + ctx.flags &= ~FLG_DELAYED; + break; + case 'n': + ctx.flags |= FLG_NODAEMON; + break; + case 'f': + tty = argv[optind - 1]; + break; + case 'h': + case '?': + default: + usage(argv[0]); + exit(EXIT_SUCCESS); + } + } + + argc -= optind; + argv += optind; + + if (argc < 1) + errx(1, "no interface given"); + + ifnam = argv[argc - 1]; + ctx.ifnam = strdup(ifnam); + + switch (mode) { + case MODE_DISC: + printf("Disconnecting %s\n", ifnam); + send_disconnect(ifnam); + exit(EXIT_SUCCESS); + default: + break; + } + + signal(SIGHUP, sig_handle); + signal(SIGINT, sig_handle); + signal(SIGQUIT, sig_handle); + signal(SIGTERM, sig_handle); + signal(SIGALRM, sig_handle); + + it.it_interval.tv_sec = 1; + it.it_interval.tv_usec = 0; + it.it_value.tv_sec = 1; + it.it_value.tv_usec = 0; + error = setitimer(ITIMER_REAL, &it, NULL); + if (error != 0) + errx(1, "setitimer"); + + tmr_add(&timers, 1, 5, &tmr_watchdog, &ctx); + watchdog_reset(&ctx, 15); + + if (tty != NULL) { + error = do_connect(&ctx, tty); + if (error != 0) + errx(1, "Failed to open %s", tty); + } + else { + tty_list = get_tty(&ctx); +#ifdef DEBUG + if (tty_list == NULL) { + fprintf(stderr, "get_tty returned empty list\n"); + } else { + fprintf(stderr, "tty list:\n"); + for (p = tty_list; *p != NULL; p++) { + fprintf(stderr, "\t %s\n", *p); + } + } +#endif + for (p = tty_list; *p != NULL; p++) { + error = do_connect(&ctx, *p); + if (error == 0) { + tty = *p; + break; + } + } + if (*p == NULL) + errx(1, "Failed to obtain a control port, " + "try specifying one manually"); + } + + if (!(ctx.flags & FLG_DELAYED) && !(ctx.flags & FLG_NODAEMON)) + daemonize(&ctx); + + + FD_ZERO(&set); + FD_SET(ctx.fd, &set); + for (;;) { + + watchdog_disable(&ctx); + error = select(ctx.fd + 1, &set, NULL, NULL, NULL); + if (error <= 0) { + if (running && errno == EINTR) + continue; + if (ctx.flags & FLG_WDEXP) { + ctx.flags &= ~FLG_WDEXP; + watchdog_reset(&ctx, 5); + do_disconnect(&ctx); + watchdog_reset(&ctx, 15); + do_connect(&ctx, tty); + running = 1; + continue; + } + + break; + } + + if (FD_ISSET(ctx.fd, &set)) { + watchdog_reset(&ctx, 15); + error = at_async(&ctx, &ctx); + if (error != 0) + break; + } + FD_SET(ctx.fd, &set); + + if (!(ctx.flags & FLG_DAEMON) && (ctx.flags & IPASSIGNED)) { + printf("Status: %s (%s)", + ctx.con_status ? "connected" : "disconnected", + network_access_type[ctx.con_net_type]); + if (ctx.dbm < 0) + printf(", signal: %d dBm", ctx.dbm); + printf("\r"); + fflush(stdout); + } + } + if (!(ctx.flags & FLG_DAEMON) && (ctx.flags & IPASSIGNED)) + printf("\n"); + + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + signal(SIGALRM, SIG_IGN); + + do_disconnect(&ctx); + + if (ctx.flags & FLG_DAEMON) { + pidfile_remove(ctx.pfh); + if (syslog_open) + closelog(); + } + + return (0); +} diff --git a/usr.sbin/usbconfig/Makefile b/usr.sbin/usbconfig/Makefile index 1cd0928b8a91..0aa51fae17f8 100644 --- a/usr.sbin/usbconfig/Makefile +++ b/usr.sbin/usbconfig/Makefile @@ -4,6 +4,7 @@ PROG= usbconfig MAN= usbconfig.8 SRCS= usbconfig.c dump.c +DPADD+= ${LIBUSB} LDADD+= -lusb .include diff --git a/usr.sbin/usbconfig/dump.c b/usr.sbin/usbconfig/dump.c index 6a2fd026062c..4e527eaacbf5 100644 --- a/usr.sbin/usbconfig/dump.c +++ b/usr.sbin/usbconfig/dump.c @@ -100,21 +100,66 @@ dump_field(struct libusb20_device *pdev, const char *plevel, printf("%s%s = 0x%04x ", plevel, field, value); - if ((field[0] != 'i') || (field[1] == 'd')) { - printf("\n"); + if (strlen(plevel) == 8) { + /* Endpoint Descriptor */ + + if (strcmp(field, "bEndpointAddress") == 0) { + if (value & 0x80) + printf(" \n"); + else + printf(" \n"); + return; + } + + if (strcmp(field, "bmAttributes") == 0) { + switch (value & 0x03) { + case 0: + printf(" \n"); + break; + case 1: + switch (value & 0x0C) { + case 0x00: + printf(" \n"); + break; + case 0x04: + printf(" \n"); + break; + case 0x08: + printf(" \n"); + break; + default: + printf(" \n"); + break; + } + break; + case 2: + printf(" \n"); + break; + default: + printf(" \n"); + break; + } + return; + } + } + + if ((field[0] == 'i') && (field[1] != 'd')) { + /* Indirect String Descriptor */ + if (value == 0) { + printf(" \n"); + return; + } + if (libusb20_dev_req_string_simple_sync(pdev, value, + temp_string, sizeof(temp_string))) { + printf(" \n"); + return; + } + printf(" <%s>\n", temp_string); return; } - if (value == 0) { - printf(" \n"); - return; - } - if (libusb20_dev_req_string_simple_sync(pdev, value, - temp_string, sizeof(temp_string))) { - printf(" \n"); - return; - } - printf(" <%s>\n", temp_string); - return; + + /* No additional information */ + printf("\n"); } static void @@ -320,3 +365,40 @@ dump_config(struct libusb20_device *pdev, uint8_t all_cfg) } return; } + +void +dump_string_by_index(struct libusb20_device *pdev, uint8_t str_index) +{ + char *pbuf; + uint8_t n; + uint8_t len; + + pbuf = malloc(256); + if (pbuf == NULL) + err(1, "out of memory"); + + if (str_index == 0) { + /* language table */ + if (libusb20_dev_req_string_sync(pdev, + str_index, 0, pbuf, 256)) { + printf("STRING_0x%02x = \n", str_index); + } else { + printf("STRING_0x%02x = ", str_index); + len = (uint8_t)pbuf[0]; + for (n = 0; n != len; n++) { + printf("0x%02x%s", (uint8_t)pbuf[n], + (n != (len-1)) ? ", " : ""); + } + printf("\n"); + } + } else { + /* ordinary string */ + if (libusb20_dev_req_string_simple_sync(pdev, + str_index, pbuf, 256)) { + printf("STRING_0x%02x = \n", str_index); + } else { + printf("STRING_0x%02x = <%s>\n", str_index, pbuf); + } + } + free(pbuf); +} diff --git a/usr.sbin/usbconfig/dump.h b/usr.sbin/usbconfig/dump.h index 7fafdfd34dbf..581684a4cf28 100644 --- a/usr.sbin/usbconfig/dump.h +++ b/usr.sbin/usbconfig/dump.h @@ -24,11 +24,17 @@ * SUCH DAMAGE. */ +#ifndef _DUMP_H_ +#define _DUMP_H_ + const char *dump_mode(uint8_t value); const char *dump_speed(uint8_t value); const char *dump_power_mode(uint8_t value); +void dump_string_by_index(struct libusb20_device *pdev, uint8_t index); void dump_device_info(struct libusb20_device *pdev, uint8_t show_drv); void dump_be_quirk_names(struct libusb20_backend *pbe); void dump_be_dev_quirks(struct libusb20_backend *pbe); void dump_device_desc(struct libusb20_device *pdev); void dump_config(struct libusb20_device *pdev, uint8_t all_cfg); + +#endif /* _DUMP_H_ */ diff --git a/usr.sbin/usbconfig/usbconfig.8 b/usr.sbin/usbconfig/usbconfig.8 index 07dbed2586ea..971367d2650a 100644 --- a/usr.sbin/usbconfig/usbconfig.8 +++ b/usr.sbin/usbconfig/usbconfig.8 @@ -1,6 +1,6 @@ .\" $FreeBSD$ .\" -.\" Copyright (c) 2008 Hans Petter Selasky. All rights reserved. +.\" Copyright (c) 2008-2010 Hans Petter Selasky. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd Sep 28, 2008 +.Dd January 6, 2010 .Dt USBCONFIG 8 .Os .Sh NAME @@ -34,6 +34,9 @@ .Op Fl u Ar unit .Op Fl a Ar addr .Op cmds... +.Nm +.Op Fl d Ar [ugen]. +.Op cmds... .Sh DESCRIPTION The .Nm @@ -46,8 +49,48 @@ Limit device range to USB devices connected to the given USBUS unit. .It Fl a Ar addr Limit device range to the given USB device index. Should only be used in conjunction with the unit argument. +.It Fl d Ar [ugen]. +Limit device range to USB devices connected to the given unit and address. +The unit and address coordinates may be prefixed by the lowercased word "ugen". .It Fl h Show help and available commands. .El +.Pp +When called without options, +.Nm +prints a list of all available USB devices. +.Sh EXAMPLES +Show information about the device on USB bus 1 at address 2: +.Pp +.Dl usbconfig -u 1 -a 2 dump_info +.Pp +Dump HID descriptor for device on USB bus 1 at address 2: +.Pp +.Dl usbconfig -u 1 -a 2 do_request 0x81 0x06 0x2200 0 0x100 +.Pp +Dump string descriptor at index Z for device on USB bus 1 at address 2: +.Pp +.Dl usbconfig -u 1 -a 2 dump_string Z +.Pp +Dump current configuration descriptor for device on USB bus 1 at address 2: +.Pp +.Dl usbconfig -u 1 -a 2 dump_curr_config_desc +.Pp +Dump device descriptor for device on USB bus 1 at address 2: +.Pp +.Dl usbconfig -u 1 -a 2 dump_device_desc +.Pp +Program the device on USB bus 1 at address 2 to suspend, resume, power off, go into power save, or power on: +.Pp +.Dl usbconfig -u 1 -a 2 suspend +.Dl usbconfig -u 1 -a 2 resume +.Dl usbconfig -u 1 -a 2 power_off +.Dl usbconfig -u 1 -a 2 power_save +.Dl usbconfig -u 1 -a 2 power_on +.Pp +Display a list of available quirk names: +.Pp +.Dl usbconfig dump_quirk_names +.Pp .Sh SEE ALSO .Xr usb 4 diff --git a/usr.sbin/usbconfig/usbconfig.c b/usr.sbin/usbconfig/usbconfig.c index 810e183bf89d..2bd3668223bf 100644 --- a/usr.sbin/usbconfig/usbconfig.c +++ b/usr.sbin/usbconfig/usbconfig.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ /*- - * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. + * Copyright (c) 2008-2009 Hans Petter Selasky. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -81,6 +81,8 @@ struct options { uint8_t got_show_iface_driver:1; uint8_t got_remove_device_quirk:1; uint8_t got_add_device_quirk:1; + uint8_t got_remove_quirk:1; + uint8_t got_add_quirk:1; uint8_t got_dump_string:1; uint8_t got_do_request:1; }; @@ -94,6 +96,7 @@ struct token { enum { T_UNIT, T_ADDR, + T_UGEN, T_IFACE, T_SET_CONFIG, T_SET_ALT, @@ -101,6 +104,8 @@ enum { T_GET_TEMPLATE, T_ADD_DEVICE_QUIRK, T_REMOVE_DEVICE_QUIRK, + T_ADD_QUIRK, + T_REMOVE_QUIRK, T_SHOW_IFACE_DRIVER, T_DUMP_QUIRK_NAMES, T_DUMP_DEVICE_QUIRKS, @@ -124,6 +129,7 @@ static struct options options; static const struct token token[] = { {"-u", T_UNIT, 1}, {"-a", T_ADDR, 1}, + {"-d", T_UGEN, 1}, {"-i", T_IFACE, 1}, {"set_config", T_SET_CONFIG, 1}, {"set_alt", T_SET_ALT, 1}, @@ -131,6 +137,8 @@ static const struct token token[] = { {"get_template", T_GET_TEMPLATE, 0}, {"add_dev_quirk_vplh", T_ADD_DEVICE_QUIRK, 5}, {"remove_dev_quirk_vplh", T_REMOVE_DEVICE_QUIRK, 5}, + {"add_quirk", T_ADD_QUIRK, 1}, + {"remove_quirk", T_REMOVE_QUIRK, 1}, {"dump_quirk_names", T_DUMP_QUIRK_NAMES, 0}, {"dump_device_quirks", T_DUMP_DEVICE_QUIRKS, 0}, {"dump_device_desc", T_DUMP_DEVICE_DESC, 0}, @@ -167,7 +175,7 @@ be_dev_remove_quirk(struct libusb20_backend *pbe, error = libusb20_be_remove_dev_quirk(pbe, &q); if (error) { - printf("Removing quirk '%s' failed, continuing.\n", str); + fprintf(stderr, "Removing quirk '%s' failed, continuing.\n", str); } return; } @@ -190,7 +198,7 @@ be_dev_add_quirk(struct libusb20_backend *pbe, error = libusb20_be_add_dev_quirk(pbe, &q); if (error) { - printf("Adding quirk '%s' failed, continuing.\n", str); + fprintf(stderr, "Adding quirk '%s' failed, continuing.\n", str); } return; } @@ -246,12 +254,21 @@ get_int(const char *s) return val; } +static void +duplicate_option(const char *ptr) +{ + fprintf(stderr, "Syntax error: " + "Duplicate option: '%s'\n", ptr); + exit(1); +} + static void usage(void) { - printf("" + fprintf(stderr, "" "usbconfig - configure the USB subsystem" "\n" "usage: usbconfig -u -a -i [cmds...]" "\n" + "usage: usbconfig -d [ugen]. -i [cmds...]" "\n" "commands:" "\n" " set_config " "\n" " set_alt " "\n" @@ -259,6 +276,8 @@ usage(void) " get_template" "\n" " add_dev_quirk_vplh " "\n" " remove_dev_quirk_vplh " "\n" + " add_quirk " "\n" + " remove_quirk " "\n" " dump_quirk_names" "\n" " dump_device_quirks" "\n" " dump_device_desc" "\n" @@ -330,7 +349,7 @@ flush_command(struct libusb20_backend *pbe, struct options *opt) if (opt->got_set_template) { opt->got_any--; if (libusb20_be_set_template(pbe, opt->template)) { - printf("Setting USB template %u failed, " + fprintf(stderr, "Setting USB template %u failed, " "continuing.\n", opt->template); } } @@ -360,25 +379,33 @@ flush_command(struct libusb20_backend *pbe, struct options *opt) } matches++; + if (opt->got_remove_quirk) { + struct LIBUSB20_DEVICE_DESC_DECODED *ddesc; + + ddesc = libusb20_dev_get_device_desc(pdev); + + be_dev_remove_quirk(pbe, + ddesc->idVendor, ddesc->idProduct, + ddesc->bcdDevice, ddesc->bcdDevice, + opt->quirkname); + } + + if (opt->got_add_quirk) { + struct LIBUSB20_DEVICE_DESC_DECODED *ddesc; + + ddesc = libusb20_dev_get_device_desc(pdev); + + be_dev_add_quirk(pbe, + ddesc->idVendor, ddesc->idProduct, + ddesc->bcdDevice, ddesc->bcdDevice, + opt->quirkname); + } + if (libusb20_dev_open(pdev, 0)) { err(1, "could not open device"); } if (opt->got_dump_string) { - char *pbuf; - - pbuf = malloc(256); - if (pbuf == NULL) { - err(1, "out of memory"); - } - if (libusb20_dev_req_string_simple_sync(pdev, - opt->string_index, pbuf, 256)) { - printf("STRING_0x%02x = \n", - opt->string_index); - } else { - printf("STRING_0x%02x = <%s>\n", - opt->string_index, pbuf); - } - free(pbuf); + dump_string_by_index(pdev, opt->string_index); } if (opt->got_do_request) { uint16_t actlen; @@ -501,6 +528,9 @@ main(int argc, char **argv) { struct libusb20_backend *pbe; struct options *opt = &options; + const char *ptr; + int unit; + int addr; int n; int t; @@ -518,6 +548,28 @@ main(int argc, char **argv) if (t > 255) t = 255; switch (get_token(argv[n], t)) { + case T_ADD_QUIRK: + if (opt->got_add_quirk) { + flush_command(pbe, opt); + } + opt->quirkname = argv[n + 1]; + n++; + + opt->got_add_quirk = 1; + opt->got_any++; + break; + + case T_REMOVE_QUIRK: + if (opt->got_remove_quirk) { + flush_command(pbe, opt); + } + opt->quirkname = argv[n + 1]; + n++; + + opt->got_remove_quirk = 1; + opt->got_any++; + break; + case T_ADD_DEVICE_QUIRK: if (opt->got_add_device_quirk) { flush_command(pbe, opt); @@ -548,11 +600,15 @@ main(int argc, char **argv) break; case T_DUMP_QUIRK_NAMES: + if (opt->got_dump_quirk_names) + duplicate_option(argv[n]); opt->got_dump_quirk_names = 1; opt->got_any++; break; case T_DUMP_DEVICE_QUIRKS: + if (opt->got_dump_device_quirks) + duplicate_option(argv[n]); opt->got_dump_device_quirks = 1; opt->got_any++; break; @@ -561,6 +617,33 @@ main(int argc, char **argv) opt->got_show_iface_driver = 1; break; + case T_UGEN: + if (opt->got_any) { + /* allow multiple commands on the same line */ + flush_command(pbe, opt); + } + ptr = argv[n + 1]; + + if ((ptr[0] == 'u') && + (ptr[1] == 'g') && + (ptr[2] == 'e') && + (ptr[3] == 'n')) + ptr += 4; + + if ((sscanf(ptr, "%d.%d", + &unit, &addr) != 2) || + (unit < 0) || (unit > 65535) || + (addr < 0) || (addr > 65535)) { + errx(1, "cannot " + "parse '%s'", argv[n + 1]); + } + opt->bus = unit; + opt->addr = addr; + opt->got_bus = 1; +; opt->got_addr = 1; + n++; + break; + case T_UNIT: if (opt->got_any) { /* allow multiple commands on the same line */ @@ -581,84 +664,112 @@ main(int argc, char **argv) n++; break; case T_SET_CONFIG: + if (opt->got_set_config) + duplicate_option(argv[n]); opt->config_index = num_id(argv[n + 1], "cfg_index"); opt->got_set_config = 1; opt->got_any++; n++; break; case T_SET_ALT: + if (opt->got_set_alt) + duplicate_option(argv[n]); opt->alt_index = num_id(argv[n + 1], "cfg_index"); opt->got_set_alt = 1; opt->got_any++; n++; break; case T_SET_TEMPLATE: + if (opt->got_set_template) + duplicate_option(argv[n]); opt->template = get_int(argv[n + 1]); opt->got_set_template = 1; opt->got_any++; n++; break; case T_GET_TEMPLATE: + if (opt->got_get_template) + duplicate_option(argv[n]); opt->got_get_template = 1; opt->got_any++; break; case T_DUMP_DEVICE_DESC: + if (opt->got_dump_device_desc) + duplicate_option(argv[n]); opt->got_dump_device_desc = 1; opt->got_any++; break; case T_DUMP_CURR_CONFIG_DESC: + if (opt->got_dump_curr_config) + duplicate_option(argv[n]); opt->got_dump_curr_config = 1; opt->got_any++; break; case T_DUMP_ALL_CONFIG_DESC: + if (opt->got_dump_all_config) + duplicate_option(argv[n]); opt->got_dump_all_config = 1; opt->got_any++; break; case T_DUMP_INFO: + if (opt->got_dump_info) + duplicate_option(argv[n]); opt->got_dump_info = 1; opt->got_any++; break; case T_DUMP_STRING: - if (opt->got_dump_string) { - flush_command(pbe, opt); - } + if (opt->got_dump_string) + duplicate_option(argv[n]); opt->string_index = num_id(argv[n + 1], "str_index"); opt->got_dump_string = 1; opt->got_any++; n++; break; case T_SUSPEND: + if (opt->got_suspend) + duplicate_option(argv[n]); opt->got_suspend = 1; opt->got_any++; break; case T_RESUME: + if (opt->got_resume) + duplicate_option(argv[n]); opt->got_resume = 1; opt->got_any++; break; case T_POWER_OFF: + if (opt->got_power_off) + duplicate_option(argv[n]); opt->got_power_off = 1; opt->got_any++; break; case T_POWER_SAVE: + if (opt->got_power_save) + duplicate_option(argv[n]); opt->got_power_save = 1; opt->got_any++; break; case T_POWER_ON: + if (opt->got_power_on) + duplicate_option(argv[n]); opt->got_power_on = 1; opt->got_any++; break; case T_RESET: + if (opt->got_reset) + duplicate_option(argv[n]); opt->got_reset = 1; opt->got_any++; break; case T_LIST: + if (opt->got_list) + duplicate_option(argv[n]); opt->got_list = 1; opt->got_any++; break; case T_DO_REQUEST: - if (opt->got_do_request) { - flush_command(pbe, opt); - } + if (opt->got_do_request) + duplicate_option(argv[n]); LIBUSB20_INIT(LIBUSB20_CONTROL_SETUP, &opt->setup); opt->setup.bmRequestType = num_id(argv[n + 1], "bmReqTyp"); opt->setup.bRequest = num_id(argv[n + 2], "bReq"); diff --git a/usr.sbin/usbdevs/Makefile b/usr.sbin/usbdevs/Makefile index 985bc7a61ab5..3cfc8ef002d8 100644 --- a/usr.sbin/usbdevs/Makefile +++ b/usr.sbin/usbdevs/Makefile @@ -4,6 +4,4 @@ PROG= usbdevs MAN= usbdevs.8 -WARNS?= 2 - .include diff --git a/usr.sbin/usbdevs/usbdevs.8 b/usr.sbin/usbdevs/usbdevs.8 index 3226dd5bd658..dd56fc868794 100644 --- a/usr.sbin/usbdevs/usbdevs.8 +++ b/usr.sbin/usbdevs/usbdevs.8 @@ -12,13 +12,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.sbin/usbdevs/usbdevs.c b/usr.sbin/usbdevs/usbdevs.c index eea8167c55c3..b51e3c5b3dad 100644 --- a/usr.sbin/usbdevs/usbdevs.c +++ b/usr.sbin/usbdevs/usbdevs.c @@ -16,13 +16,6 @@ * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.sbin/vidcontrol/Makefile b/usr.sbin/vidcontrol/Makefile index 074f941d85b9..8c8f6bb804b2 100644 --- a/usr.sbin/vidcontrol/Makefile +++ b/usr.sbin/vidcontrol/Makefile @@ -3,6 +3,4 @@ PROG= vidcontrol SRCS= vidcontrol.c decode.c -WARNS?= 6 - .include diff --git a/usr.sbin/vidcontrol/vidcontrol.1 b/usr.sbin/vidcontrol/vidcontrol.1 index 2abaa1e19972..cb545eeda92f 100644 --- a/usr.sbin/vidcontrol/vidcontrol.1 +++ b/usr.sbin/vidcontrol/vidcontrol.1 @@ -38,6 +38,7 @@ .Op Fl r Ar foreground Ar background .Op Fl S Cm on | off .Op Fl s Ar number +.Op Fl T Cm xterm | cons25 .Op Fl t Ar N | Cm off .Op Ar mode .Op Ar foreground Op Ar background @@ -243,6 +244,8 @@ is supposed to be physically secure. .It Fl s Ar number Set the current vty to .Ar number . +.It Fl T Cm xterm | cons25 +Switch between xterm and cons25 style terminal emulation. .It Fl t Ar N | Cm off Set the screensaver timeout to .Ar N diff --git a/usr.sbin/vidcontrol/vidcontrol.c b/usr.sbin/vidcontrol/vidcontrol.c index 847ff3e6e23e..06afe53e019e 100644 --- a/usr.sbin/vidcontrol/vidcontrol.c +++ b/usr.sbin/vidcontrol/vidcontrol.c @@ -185,8 +185,8 @@ usage(void) "usage: vidcontrol [-CdHLPpx] [-b color] [-c appearance] [-f [size] file]", " [-g geometry] [-h size] [-i adapter | mode] [-l screen_map]", " [-M char] [-m on | off] [-r foreground background]", -" [-S on | off] [-s number] [-t N | off] [mode]", -" [foreground [background]] [show]"); +" [-S on | off] [-s number] [-T xterm | cons25] [-t N | off]", +" [mode] [foreground [background]] [show]"); exit(1); } @@ -1159,6 +1159,18 @@ clear_history(void) } } +static void +set_terminal_mode(char *arg) +{ + + if (strcmp(arg, "xterm") == 0) + fprintf(stderr, "\033[=T"); + else if (strcmp(arg, "cons25") == 0) + fprintf(stderr, "\033[=1T"); + else + usage(); +} + int main(int argc, char **argv) @@ -1175,7 +1187,8 @@ main(int argc, char **argv) err(1, "must be on a virtual console"); dumpmod = 0; dumpopt = DUMP_FBF; - while((opt = getopt(argc, argv, "b:Cc:df:g:h:Hi:l:LM:m:pPr:S:s:t:x")) != -1) + while ((opt = getopt(argc, argv, + "b:Cc:df:g:h:Hi:l:LM:m:pPr:S:s:T:t:x")) != -1) switch(opt) { case 'b': set_border_color(optarg); @@ -1244,6 +1257,9 @@ main(int argc, char **argv) case 's': set_console(optarg); break; + case 'T': + set_terminal_mode(optarg); + break; case 't': set_screensaver_timeout(optarg); break; diff --git a/usr.sbin/vipw/Makefile b/usr.sbin/vipw/Makefile index 69a9df9c5ba9..d98e4019adea 100644 --- a/usr.sbin/vipw/Makefile +++ b/usr.sbin/vipw/Makefile @@ -4,8 +4,6 @@ PROG= vipw MAN= vipw.8 -WARNS?= 4 - DPADD= ${LIBUTIL} LDADD= -lutil diff --git a/usr.sbin/wake/Makefile b/usr.sbin/wake/Makefile index ee303af05617..f75d4693d1b5 100644 --- a/usr.sbin/wake/Makefile +++ b/usr.sbin/wake/Makefile @@ -2,6 +2,7 @@ PROG= wake MAN= wake.8 -WARNS?= 6 + +WARNS?= 3 .include diff --git a/usr.sbin/wake/wake.8 b/usr.sbin/wake/wake.8 index 03a283b19cc4..ce30abfc43d1 100644 --- a/usr.sbin/wake/wake.8 +++ b/usr.sbin/wake/wake.8 @@ -1,7 +1,7 @@ .\" .\" $FreeBSD$ .\" -.\" Copyright (c) 2009 Marc Balmer +.\" Copyright (c) 2009, 2010 Marc Balmer .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd June 27 2009 +.Dd December 27, 2009 .Dt WAKE 8 .Os .Sh NAME @@ -23,7 +23,8 @@ .Nd send Wake on LAN frames to hosts on a local Ethernet network .Sh SYNOPSIS .Nm -.Ar interface +.Op Ar interface +.Ar lladdr .Op Ar lladdr ... .Sh DESCRIPTION The @@ -36,21 +37,27 @@ and can be used to power on machines from a remote system without having physical access to them. .Pp .Ar interface -is the network interface of the local machine. +is an Ethernet interface of the local machine and is used to send the +Wake on LAN frames over it. +If there is only one Ethernet device available that is up and running, then the +.Ar interface +argument can be omitted. .Ar lladdr -are the link layer addresses of the remote machines -and can be specified as the actual hardware address +is the link layer address of the remote machine. +This can be specified as the actual hardware address (six hexadecimal numbers separated by colons) -or a hostname entry in +or as a hostname entry in .Pa /etc/ethers . -Link layer addresses can be determined and set on -.Fx -machines using +.Nm +accepts multiple +.Ar lladdr +addresses. +Link layer addresses can be determined and set using .Xr ifconfig 8 . .Sh FILES .Bl -tag -width "/etc/ethers" -compact .It /etc/ethers -Ethernet host name database. +Ethernet host name data base. .El .Sh SEE ALSO .Xr ethers 5 , diff --git a/usr.sbin/wake/wake.c b/usr.sbin/wake/wake.c index 1a3a65f2e4ac..d6ba931ebf83 100644 --- a/usr.sbin/wake/wake.c +++ b/usr.sbin/wake/wake.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2007, 2008, 2009 Marc Balmer + * Copyright (C) 2006, 2007, 2008, 2009, 2010 Marc Balmer * Copyright (C) 2000 Eugene M. Kim. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,11 +32,14 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include #include +#include #include #include #include @@ -53,38 +56,29 @@ __FBSDID("$FreeBSD$"); #endif static int bind_if_to_bpf(char const *ifname, int bpf); +static int find_ether(char *dst, size_t len); static int get_ether(char const *text, struct ether_addr *addr); static int send_wakeup(int bpf, struct ether_addr const *addr); static void usage(void); -static int wake(const char *iface, const char *host); +static int wake(int bpf, const char *host); static void usage(void) { - (void)fprintf(stderr, "usage: wake interface lladdr...\n"); + (void)fprintf(stderr, "usage: wake [interface] lladdr [lladdr ...]\n"); exit(1); } static int -wake(const char *iface, const char *host) +wake(int bpf, const char *host) { struct ether_addr macaddr; - int bpf, res; - bpf = open(_PATH_BPF, O_RDWR); - if (bpf == -1) { - warn("no bpf"); + if (get_ether(host, &macaddr) == -1) return (-1); - } - if (bind_if_to_bpf(iface, bpf) == -1 || - get_ether(host, &macaddr) == -1) { - (void)close(bpf); - return (-1); - } - res = send_wakeup(bpf, &macaddr); - (void)close(bpf); - return (res); + + return send_wakeup(bpf, &macaddr); } static int @@ -94,25 +88,49 @@ bind_if_to_bpf(char const *ifname, int bpf) u_int dlt; if (strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)) >= - sizeof(ifr.ifr_name)) { - warnx("interface name too long: %s", ifname); + sizeof(ifr.ifr_name)) return (-1); - } - if (ioctl(bpf, BIOCSETIF, &ifr) == -1) { - warn("ioctl(%s)", "BIOCSETIF"); + + if (ioctl(bpf, BIOCSETIF, &ifr) == -1) return (-1); - } - if (ioctl(bpf, BIOCGDLT, &dlt) == -1) { - warn("ioctl(%s)", "BIOCGDLT"); + + if (ioctl(bpf, BIOCGDLT, &dlt) == -1) return (-1); - } - if (dlt != DLT_EN10MB) { - warnx("incompatible media"); + + if (dlt != DLT_EN10MB) return (-1); - } + return (0); } +static int +find_ether(char *dst, size_t len) +{ + struct ifaddrs *ifap, *ifa; + struct sockaddr_dl *sdl = NULL; + int nifs; + + if (dst == NULL || len == 0) + return 0; + + if (getifaddrs(&ifap) != 0) + return -1; + + /* XXX also check the link state */ + for (nifs = 0, ifa = ifap; ifa; ifa = ifa->ifa_next) + if (ifa->ifa_addr->sa_family == AF_LINK && + ifa->ifa_flags & IFF_UP && ifa->ifa_flags & IFF_RUNNING) { + sdl = (struct sockaddr_dl *)ifa->ifa_addr; + if (sdl->sdl_type == IFT_ETHER) { + strlcpy(dst, ifa->ifa_name, len); + nifs++; + } + } + + freeifaddrs(ifap); + return nifs == 1 ? 0 : -1; +} + static int get_ether(char const *text, struct ether_addr *addr) { @@ -165,14 +183,31 @@ send_wakeup(int bpf, struct ether_addr const *addr) int main(int argc, char *argv[]) { - int n; + int bpf, n; + char ifname[IF_NAMESIZE]; - if (argc < 3) + if (argc < 2) usage(); - for (n = 2; n < argc; n++) - if (wake(argv[1], argv[n])) - warnx("error sending Wake on LAN frame over %s to %s", - argv[1], argv[n]); + if ((bpf = open(_PATH_BPF, O_RDWR)) == -1) + err(1, "Cannot open bpf interface"); + + n = 2; + if (bind_if_to_bpf(argv[1], bpf) == -1) { + if (find_ether(ifname, sizeof(ifname))) + err(1, "Failed to determine ethernet interface"); + if (bind_if_to_bpf(ifname, bpf) == -1) + err(1, "Cannot bind to interface `%s'", ifname); + --n; + } else + strlcpy(ifname, argv[1], sizeof(ifname)); + + if (n >= argc) + usage(); + for (; n < argc; n++) + if (wake(bpf, argv[n])) + warn("Cannot send Wake on LAN frame over `%s' to `%s'", + ifname, argv[n]); + return (0); } diff --git a/usr.sbin/watchdogd/Makefile b/usr.sbin/watchdogd/Makefile index 08880e149168..be69d2bf5a84 100644 --- a/usr.sbin/watchdogd/Makefile +++ b/usr.sbin/watchdogd/Makefile @@ -3,7 +3,6 @@ PROG= watchdogd LINKS= ${BINDIR}/watchdogd ${BINDIR}/watchdog MAN= watchdogd.8 watchdog.8 -WARNS?= 6 LDADD= -lm -lutil DPADD= ${LIBM} ${LIBUTIL} diff --git a/usr.sbin/watchdogd/watchdogd.c b/usr.sbin/watchdogd/watchdogd.c index 6f0e840e1dc2..073affd71c2a 100644 --- a/usr.sbin/watchdogd/watchdogd.c +++ b/usr.sbin/watchdogd/watchdogd.c @@ -95,7 +95,7 @@ main(int argc, char *argv[]) if (is_daemon) { if (watchdog_onoff(1) == -1) - exit(EX_SOFTWARE); + err(EX_OSERR, "patting the dog"); pfh = pidfile_open(pidfile, 0600, &otherpid); if (pfh == NULL) { @@ -149,7 +149,7 @@ sighandler(int signum) * Open the watchdog device. */ static int -watchdog_init() +watchdog_init(void) { fd = open("/dev/" _PATH_WATCHDOG, O_RDWR); @@ -220,7 +220,7 @@ watchdog_onoff(int onoff) * Tell user how to use the program. */ static void -usage() +usage(void) { if (is_daemon) fprintf(stderr, "usage: watchdogd [-d] [-e cmd] [-I file] [-s sleep] [-t timeout]\n"); diff --git a/usr.sbin/wlandebug/Makefile b/usr.sbin/wlandebug/Makefile index 5284257d7f70..e916c23e7512 100644 --- a/usr.sbin/wlandebug/Makefile +++ b/usr.sbin/wlandebug/Makefile @@ -3,4 +3,6 @@ PROG= wlandebug MAN= wlandebug.8 +WARNS?= 2 + .include diff --git a/usr.sbin/wlconfig/Makefile b/usr.sbin/wlconfig/Makefile index 8d3d0cc3e797..8bc62629a0d8 100644 --- a/usr.sbin/wlconfig/Makefile +++ b/usr.sbin/wlconfig/Makefile @@ -4,4 +4,6 @@ PROG= wlconfig MAN= wlconfig.8 MANSUBDIR= /i386 +WARNS?= 2 + .include diff --git a/usr.sbin/yp_mkdb/Makefile b/usr.sbin/yp_mkdb/Makefile index 973da6ee0559..1c41105bde94 100644 --- a/usr.sbin/yp_mkdb/Makefile +++ b/usr.sbin/yp_mkdb/Makefile @@ -9,4 +9,6 @@ SRCS= yp_mkdb.c yp_dblookup.c yp_dbwrite.c CFLAGS+= -Dyp_error=warnx CFLAGS+= -I${.CURDIR}/../../libexec/ypxfr -I${.CURDIR}/../../usr.sbin/ypserv +WARNS?= 1 + .include diff --git a/usr.sbin/ypbind/Makefile b/usr.sbin/ypbind/Makefile index 915d001be4dc..8e9a231940c4 100644 --- a/usr.sbin/ypbind/Makefile +++ b/usr.sbin/ypbind/Makefile @@ -7,4 +7,6 @@ SRCS= ypbind.c yp_ping.c CFLAGS+= -DDAEMON +WARNS?= 2 + .include diff --git a/usr.sbin/yppoll/Makefile b/usr.sbin/yppoll/Makefile index 63763316ef8c..701633ba086e 100644 --- a/usr.sbin/yppoll/Makefile +++ b/usr.sbin/yppoll/Makefile @@ -4,4 +4,6 @@ PROG= yppoll MAN= yppoll.8 +WARNS?= 3 + .include diff --git a/usr.sbin/yppoll/yppoll.8 b/usr.sbin/yppoll/yppoll.8 index ad90d902e146..d466fd3d73fd 100644 --- a/usr.sbin/yppoll/yppoll.8 +++ b/usr.sbin/yppoll/yppoll.8 @@ -12,13 +12,6 @@ .\" 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. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the NetBSD -.\" Foundation, Inc. and its contributors. -.\" 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/usr.sbin/yppush/Makefile b/usr.sbin/yppush/Makefile index 7ce1c612e0e0..887a80b92d0a 100644 --- a/usr.sbin/yppush/Makefile +++ b/usr.sbin/yppush/Makefile @@ -12,6 +12,8 @@ GENSRCS=yp.h yp_clnt.c yppush_svc.c CFLAGS+= -I. -I${.CURDIR}/../../libexec/ypxfr +WARNS?= 2 + RPCGEN= rpcgen -C CLEANFILES= ${GENSRCS} diff --git a/usr.sbin/yppush/yppush_main.c b/usr.sbin/yppush/yppush_main.c index ceb63bcae411..df1dbe4cc6db 100644 --- a/usr.sbin/yppush/yppush_main.c +++ b/usr.sbin/yppush/yppush_main.c @@ -487,7 +487,6 @@ main(int argc, char *argv[]) }; struct hostlist *yppush_hostlist = NULL; struct hostlist *tmp; - struct sigaction sa; while ((ch = getopt(argc, argv, "d:j:p:h:t:v")) != -1) { switch (ch) { diff --git a/usr.sbin/ypserv/Makefile b/usr.sbin/ypserv/Makefile index c1b2df30478b..73a6195db36e 100644 --- a/usr.sbin/ypserv/Makefile +++ b/usr.sbin/ypserv/Makefile @@ -10,6 +10,8 @@ SRCS= yp_svc.c yp_server.c yp_dblookup.c yp_dnslookup.c \ CFLAGS+= -DDB_CACHE -DTCP_WRAPPER -I. +WARNS?= 0 + DPADD= ${LIBWRAP} LDADD= -lwrap diff --git a/usr.sbin/ypserv/yp_main.c b/usr.sbin/ypserv/yp_main.c index 7ae15d9485b7..ec39d1bd3fa4 100644 --- a/usr.sbin/ypserv/yp_main.c +++ b/usr.sbin/ypserv/yp_main.c @@ -40,25 +40,30 @@ __FBSDID("$FreeBSD$"); * rpcgen.new, and later modified. */ +#include +#include +#include +#include #include "yp.h" #include #include #include #include #include +#include #include /* getenv, exit */ #include /* strcmp */ #include #include -#include /* for pmap_unset */ #ifdef __cplusplus #include /* getdtablesize, open */ #endif /* __cplusplus */ -#include #include -#include +#include #include "yp_extern.h" +#include #include +#include #ifndef SIG_PF #define SIG_PF void(*)(int) @@ -68,14 +73,17 @@ __FBSDID("$FreeBSD$"); int _rpcpmstart; /* Started by a port monitor ? */ static int _rpcfdtype; /* Whether Stream or Datagram ? */ +static int _rpcaf; +static int _rpcfd; + /* States a server can be in wrt request */ #define _IDLE 0 #define _SERVED 1 #define _SERVING 2 -extern void ypprog_1(struct svc_req *, register SVCXPRT *); -extern void ypprog_2(struct svc_req *, register SVCXPRT *); +extern void ypprog_1(struct svc_req *, SVCXPRT *); +extern void ypprog_2(struct svc_req *, SVCXPRT *); extern int _rpc_dtablesize(void); extern int _rpcsvcstate; /* Set when a request is serviced */ char *progname = "ypserv"; @@ -84,26 +92,37 @@ char *yp_dir = _PATH_YP; int do_dns = 0; int resfd; -struct socktype { - const char *st_name; - int st_type; +struct socklistent { + int sle_sock; + struct sockaddr_storage sle_ss; + SLIST_ENTRY(socklistent) sle_next; }; -static struct socktype stlist[] = { - { "tcp", SOCK_STREAM }, - { "udp", SOCK_DGRAM }, - { NULL, 0 } +static SLIST_HEAD(, socklistent) sle_head = + SLIST_HEAD_INITIALIZER(sle_head); + +struct bindaddrlistent { + const char *ble_hostname; + SLIST_ENTRY(bindaddrlistent) ble_next; }; +static SLIST_HEAD(, bindaddrlistent) ble_head = + SLIST_HEAD_INITIALIZER(ble_head); + +static char *servname = "0"; static -void _msgout(char* msg) +void _msgout(char* msg, ...) { + va_list ap; + + va_start(ap, msg); if (debug) { if (_rpcpmstart) - syslog(LOG_ERR, "%s", msg); + vsyslog(LOG_ERR, msg, ap); else - warnx("%s", msg); + vwarnx(msg, ap); } else - syslog(LOG_ERR, "%s", msg); + vsyslog(LOG_ERR, msg, ap); + va_end(ap); } pid_t yp_pid; @@ -162,8 +181,8 @@ yp_svc_run(void) static void unregister(void) { - (void) pmap_unset(YPPROG, YPVERS); - (void) pmap_unset(YPPROG, YPOLDVERS); + (void)svc_unreg(YPPROG, YPVERS); + (void)svc_unreg(YPPROG, YPOLDVERS); } static void @@ -231,24 +250,228 @@ closedown(int sig) (void) alarm(_RPCSVC_CLOSEDOWN/2); } +static int +create_service(const int sock, const struct netconfig *nconf, + const struct __rpc_sockinfo *si) +{ + int error; + + SVCXPRT *transp; + struct addrinfo hints, *res, *res0; + struct socklistent *slep; + struct bindaddrlistent *blep; + struct netbuf svcaddr; + + SLIST_INIT(&sle_head); + memset(&hints, 0, sizeof(hints)); + memset(&svcaddr, 0, sizeof(svcaddr)); + + hints.ai_family = si->si_af; + hints.ai_socktype = si->si_socktype; + hints.ai_protocol = si->si_proto; + + /* + * Build socketlist from bindaddrlist. + */ + if (sock == RPC_ANYFD) { + SLIST_FOREACH(blep, &ble_head, ble_next) { + if (blep->ble_hostname == NULL) + hints.ai_flags = AI_PASSIVE; + else + hints.ai_flags = 0; + error = getaddrinfo(blep->ble_hostname, servname, + &hints, &res0); + if (error) { + _msgout("getaddrinfo(): %s", + gai_strerror(error)); + return -1; + } + for (res = res0; res; res = res->ai_next) { + int s; + + s = __rpc_nconf2fd(nconf); + if (s < 0) { + if (errno == EPROTONOSUPPORT) + _msgout("unsupported" + " transport: %s", + nconf->nc_netid); + else + _msgout("cannot create" + " %s socket: %s", + nconf->nc_netid, + strerror(errno)); + freeaddrinfo(res0); + return -1; + } + if (bindresvport_sa(s, res->ai_addr) == -1) { + if ((errno != EPERM) || + (bind(s, res->ai_addr, + res->ai_addrlen) == -1)) { + _msgout("cannot bind " + "%s socket: %s", + nconf->nc_netid, + strerror(errno)); + freeaddrinfo(res0); + close(sock); + return -1; + } + } + if (nconf->nc_semantics != NC_TPI_CLTS) + listen(s, SOMAXCONN); + + slep = malloc(sizeof(*slep)); + if (slep == NULL) { + _msgout("malloc failed: %s", + strerror(errno)); + freeaddrinfo(res0); + close(s); + return -1; + } + memset(slep, 0, sizeof(*slep)); + memcpy(&slep->sle_ss, + (struct sockaddr *)(res->ai_addr), + sizeof(res->ai_addr)); + slep->sle_sock = s; + SLIST_INSERT_HEAD(&sle_head, slep, sle_next); + + /* + * If servname == "0", redefine it by using + * the bound socket. + */ + if (strncmp("0", servname, 1) == 0) { + struct sockaddr *sap; + socklen_t slen; + char *sname; + + sname = malloc(NI_MAXSERV); + if (sname == NULL) { + _msgout("malloc(): %s", + strerror(errno)); + freeaddrinfo(res0); + close(s); + return -1; + } + memset(sname, 0, NI_MAXSERV); + + sap = (struct sockaddr *)&slep->sle_ss; + slen = sizeof(*sap); + error = getsockname(s, sap, &slen); + if (error) { + _msgout("getsockname(): %s", + strerror(errno)); + freeaddrinfo(res0); + close(s); + return -1; + } + error = getnameinfo(sap, slen, + NULL, 0, + sname, NI_MAXSERV, + NI_NUMERICHOST | NI_NUMERICSERV); + if (error) { + _msgout("getnameinfo(): %s", + strerror(errno)); + freeaddrinfo(res0); + close(s); + return -1; + } + servname = sname; + } + } + freeaddrinfo(res0); + } + } else { + slep = malloc(sizeof(*slep)); + if (slep == NULL) { + _msgout("malloc failed: %s", strerror(errno)); + return -1; + } + memset(slep, 0, sizeof(*slep)); + slep->sle_sock = sock; + SLIST_INSERT_HEAD(&sle_head, slep, sle_next); + } + + /* + * Traverse socketlist and create rpc service handles for each socket. + */ + SLIST_FOREACH(slep, &sle_head, sle_next) { + if (nconf->nc_semantics == NC_TPI_CLTS) + transp = svc_dg_create(slep->sle_sock, 0, 0); + else + transp = svc_vc_create(slep->sle_sock, RPC_MAXDATASIZE, + RPC_MAXDATASIZE); + if (transp == NULL) { + _msgout("unable to create service: %s", + nconf->nc_netid); + continue; + } + if (!svc_reg(transp, YPPROG, YPOLDVERS, ypprog_1, NULL)) { + svc_destroy(transp); + close(slep->sle_sock); + _msgout("unable to register (YPPROG, YPOLDVERS, %s):" + " %s", nconf->nc_netid, strerror(errno)); + continue; + } + if (!svc_reg(transp, YPPROG, YPVERS, ypprog_2, NULL)) { + svc_destroy(transp); + close(slep->sle_sock); + _msgout("unable to register (YPPROG, YPVERS, %s): %s", + nconf->nc_netid, strerror(errno)); + continue; + } + } + while(!(SLIST_EMPTY(&sle_head))) + SLIST_REMOVE_HEAD(&sle_head, sle_next); + + /* + * Register RPC service to rpcbind by using AI_PASSIVE address. + */ + hints.ai_flags = AI_PASSIVE; + error = getaddrinfo(NULL, servname, &hints, &res0); + if (error) { + _msgout("getaddrinfo(): %s", gai_strerror(error)); + return -1; + } + svcaddr.buf = res0->ai_addr; + svcaddr.len = res0->ai_addrlen; + + if (si->si_af == AF_INET) { + /* XXX: ignore error intentionally */ + rpcb_set(YPPROG, YPOLDVERS, nconf, &svcaddr); + } + /* XXX: ignore error intentionally */ + rpcb_set(YPPROG, YPVERS, nconf, &svcaddr); + + freeaddrinfo(res0); + return 0; +} + int main(int argc, char *argv[]) { - register SVCXPRT *transp = NULL; - int sock; - int proto = 0; - struct sockaddr_in saddr; - socklen_t asize = sizeof (saddr); int ch; - in_port_t yp_port = 0; - char *errstr; - struct socktype *st; + int error; + int ntrans; + + void *nc_handle; + struct netconfig *nconf; + struct __rpc_sockinfo si; + struct bindaddrlistent *blep; - while ((ch = getopt(argc, argv, "hdnp:P:")) != -1) { + memset(&si, 0, sizeof(si)); + SLIST_INIT(&ble_head); + + while ((ch = getopt(argc, argv, "dh:np:P:")) != -1) { switch (ch) { case 'd': debug = ypdb_debug = 1; break; + case 'h': + blep = malloc(sizeof(*blep)); + if (blep == NULL) + err(1, "malloc() failed: -h %s", optarg); + blep->ble_hostname = optarg; + SLIST_INSERT_HEAD(&ble_head, blep, ble_next); + break; case 'n': do_dns = 1; break; @@ -256,119 +479,82 @@ main(int argc, char *argv[]) yp_dir = optarg; break; case 'P': - yp_port = (in_port_t)strtonum(optarg, 1, 65535, - (const char **)&errstr); - if (yp_port == 0 && errstr != NULL) { - _msgout("invalid port number provided"); - exit(1); - } + servname = optarg; break; - case 'h': default: usage(); } } + /* + * Add "anyaddr" entry if no -h is specified. + */ + if (SLIST_EMPTY(&ble_head)) { + blep = malloc(sizeof(*blep)); + if (blep == NULL) + err(1, "malloc() failed"); + memset(blep, 0, sizeof(*blep)); + SLIST_INSERT_HEAD(&ble_head, blep, ble_next); + } load_securenets(); yp_init_resolver(); #ifdef DB_CACHE yp_init_dbs(); #endif - if (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) { - int ssize = sizeof (int); - - if (saddr.sin_family != AF_INET) - exit(1); - if (getsockopt(0, SOL_SOCKET, SO_TYPE, - (char *)&_rpcfdtype, &ssize) == -1) - exit(1); - sock = 0; + nc_handle = setnetconfig(); + if (nc_handle == NULL) + err(1, "cannot read %s", NETCONFIG); + if (__rpc_fd2sockinfo(0, &si) != 0) { + /* invoked from inetd */ _rpcpmstart = 1; - proto = 0; + _rpcfdtype = si.si_socktype; + _rpcaf = si.si_af; + _rpcfd = 0; openlog("ypserv", LOG_PID, LOG_DAEMON); } else { + /* standalone mode */ if (!debug) { if (daemon(0,0)) { err(1,"cannot fork"); } openlog("ypserv", LOG_PID, LOG_DAEMON); } - sock = RPC_ANYSOCK; - (void) pmap_unset(YPPROG, YPVERS); - (void) pmap_unset(YPPROG, 1); + _rpcpmstart = 0; + _rpcaf = AF_INET; + _rpcfd = RPC_ANYFD; + unregister(); } /* - * Initialize TCP/UDP sockets. + * Create RPC service for each transport. */ - memset((char *)&saddr, 0, sizeof(saddr)); - saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = htonl(INADDR_ANY); - saddr.sin_port = htons(yp_port); - for (st = stlist; st->st_name != NULL; st++) { - /* Do not bind the socket if the user didn't specify a port */ - if (yp_port == 0) - break; - - sock = socket(AF_INET, st->st_type, 0); - if (sock == -1) { - if ((asprintf(&errstr, "cannot create a %s socket", - st->st_name)) == -1) - err(1, "unexpected failure in asprintf()"); - _msgout(errstr); - free((void *)errstr); - exit(1); - } - if (bind(sock, (struct sockaddr *) &saddr, sizeof(saddr)) - == -1) { - if ((asprintf(&errstr, "cannot bind %s socket", - st->st_name)) == -1) - err(1, "unexpected failure in asprintf()"); - _msgout(errstr); - free((void *)errstr); - exit(1); - } - errstr = NULL; - } - - if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_DGRAM)) { - transp = svcudp_create(sock); - if (transp == NULL) { - _msgout("cannot create udp service"); - exit(1); - } - if (!_rpcpmstart) - proto = IPPROTO_UDP; - if (!svc_register(transp, YPPROG, YPOLDVERS, ypprog_1, proto)) { - _msgout("unable to register (YPPROG, YPOLDVERS, udp)"); - exit(1); - } - if (!svc_register(transp, YPPROG, YPVERS, ypprog_2, proto)) { - _msgout("unable to register (YPPROG, YPVERS, udp)"); - exit(1); + ntrans = 0; + while((nconf = getnetconfig(nc_handle))) { + if ((nconf->nc_flag & NC_VISIBLE)) { + if (__rpc_nconf2sockinfo(nconf, &si) == 0) { + _msgout("cannot get information for %s. " + "Ignored.", nconf->nc_netid); + continue; + } + if (_rpcpmstart) { + if (si.si_socktype != _rpcfdtype || + si.si_af != _rpcaf) + continue; + } else if (si.si_af != _rpcaf) + continue; + error = create_service(_rpcfd, nconf, &si); + if (error) { + endnetconfig(nc_handle); + exit(1); + } + ntrans++; } } - - if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_STREAM)) { - transp = svctcp_create(sock, 0, 0); - if (transp == NULL) { - _msgout("cannot create tcp service"); - exit(1); - } - if (!_rpcpmstart) - proto = IPPROTO_TCP; - if (!svc_register(transp, YPPROG, YPOLDVERS, ypprog_1, proto)) { - _msgout("unable to register (YPPROG, YPOLDVERS, tcp)"); - exit(1); - } - if (!svc_register(transp, YPPROG, YPVERS, ypprog_2, proto)) { - _msgout("unable to register (YPPROG, YPVERS, tcp)"); - exit(1); - } - } - - if (transp == (SVCXPRT *)NULL) { - _msgout("could not create a handle"); + endnetconfig(nc_handle); + while(!(SLIST_EMPTY(&ble_head))) + SLIST_REMOVE_HEAD(&ble_head, ble_next); + if (ntrans == 0) { + _msgout("no transport is available. Aborted."); exit(1); } if (_rpcpmstart) { diff --git a/usr.sbin/ypserv/yp_server.c b/usr.sbin/ypserv/yp_server.c index 86c7d00d1c5d..ba20c3cdc627 100644 --- a/usr.sbin/ypserv/yp_server.c +++ b/usr.sbin/ypserv/yp_server.c @@ -563,7 +563,10 @@ ypproc_all_2_svc(ypreq_nokey *argp, struct svc_req *rqstp) * Proper fix for PR #10970: exit here so that we don't risk * having a child spawned from this sub-process. */ - _exit(0); + if (!debug) + _exit(0); + + return &result; } ypresp_master * diff --git a/usr.sbin/ypserv/ypinit.sh b/usr.sbin/ypserv/ypinit.sh index 1be7e0e3e186..374308e20848 100644 --- a/usr.sbin/ypserv/ypinit.sh +++ b/usr.sbin/ypserv/ypinit.sh @@ -298,7 +298,7 @@ do echo "Update the list of hosts running YP servers in domain ${DOMAIN}." echo "Master for this domain is ${MASTER_NAME}." echo "" - echo "First verify old servers, type \\ to remove a server." + echo "First verify old servers, type \\\\ to remove a server." echo "Then add new servers, one per line. When done type a ." echo "" echo " master server : ${HOST}" diff --git a/usr.sbin/ypserv/ypserv.8 b/usr.sbin/ypserv/ypserv.8 index c8746fd55324..9d88731bab0d 100644 --- a/usr.sbin/ypserv/ypserv.8 +++ b/usr.sbin/ypserv/ypserv.8 @@ -30,7 +30,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 25, 2009 +.Dd December 13, 2009 .Dt YPSERV 8 .Os .Sh NAME @@ -408,6 +408,15 @@ in subprocesses, allowing the parent server process to go on handling other requests.) This makes it easier to trace the server with a debugging tool. +.It Fl h Ar addr +Specify a specific address to bind to for requests. This option may be +specified multiple times. If no +.Fl h +option is specified, +.Nm +will bind to default passive address +.Pq e.g. INADDR_ANY for IPv4 +for each transport. .It Fl P Ar port Force ypserv to bind to a specific TCP/UDP port, rather than selecting its own. diff --git a/usr.sbin/ypset/Makefile b/usr.sbin/ypset/Makefile index 10ed5f88fd78..708ff871e80c 100644 --- a/usr.sbin/ypset/Makefile +++ b/usr.sbin/ypset/Makefile @@ -4,4 +4,6 @@ PROG= ypset MAN= ypset.8 +WARNS?= 2 + .include diff --git a/usr.sbin/zic/zdump/Makefile b/usr.sbin/zic/zdump/Makefile index 3443b158e6d5..d654dee736c1 100644 --- a/usr.sbin/zic/zdump/Makefile +++ b/usr.sbin/zic/zdump/Makefile @@ -1,6 +1,6 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/.. +.PATH: ${.CURDIR}/../../../contrib/tzcode/zic PROG= zdump MAN= zdump.8 @@ -8,6 +8,8 @@ SRCS= zdump.c ialloc.c scheck.c CFLAGS+= -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone -DSTD_INSPIRED -DPCTS CFLAGS+= -DHAVE_LONG_DOUBLE -DTZDIR=\"/usr/share/zoneinfo\" -Demkdir=mkdir -CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../lib/libc/stdtime +CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../contrib/tzcode/stdtime + +WARNS?= 2 .include diff --git a/usr.sbin/zic/zic/Makefile b/usr.sbin/zic/zic/Makefile index 3f3bc70aa55c..f473da5b4d08 100644 --- a/usr.sbin/zic/zic/Makefile +++ b/usr.sbin/zic/zic/Makefile @@ -1,6 +1,6 @@ # $FreeBSD$ -.PATH: ${.CURDIR}/.. +.PATH: ${.CURDIR}/../../../contrib/tzcode/zic PROG= zic MAN= zic.8 @@ -9,6 +9,8 @@ SRCS= zic.c ialloc.c scheck.c CFLAGS+= -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone -DSTD_INSPIRED -DPCTS CFLAGS+= -DHAVE_LONG_DOUBLE -DTZDIR=\"/usr/share/zoneinfo\" -Demkdir=mkdir CFLAGS+= -DHAVE_STRERROR -DHAVE_UNISTD_H -CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../lib/libc/stdtime +CFLAGS+= -I${.CURDIR}/.. -I${.CURDIR}/../../../contrib/tzcode/stdtime + +WARNS?= 2 .include